commit f000ee7c19b1e690b275d7010bc0407bf14a1edc Author: Edith Boles Date: Thu Feb 26 19:56:43 2026 -0800 Init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd42ee3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin/ +obj/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f2951a2 --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +.PHONY: all clean build zip + +CC := gcc +CFLAGS := -MD -Wall -g -lm -lX11 -I ./inc/ +TARGETS := pm3-lvgl +EXES := $(patsubst %,bin/%,$(TARGETS)) +SRCS := $(shell find src inc -type f -iname '*.c') +OBJS := $(patsubst src/%.c,obj/%.o,$(patsubst inc/%.c,obj/lib/%.o,$(SRCS))) +NO_BUILD := $(patsubst %,obj/%.o,$(TARGETS)) +PROJ := edith_boles_$(notdir $(PWD)) + +all: build + +build: $(EXES) + +$(EXES): bin/%: obj/%.o $(filter-out $(NO_BUILD), $(OBJS)) + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ $^ + +obj/%.o: src/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ -c $< + +obj/lib/%.o: inc/%.c + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -o $@ -c $< + +clean: + rm -rf bin + rm -rf obj + rm -rf .artifacts + rm -rf $(PROJ).zip + +zip: clean + mkdir -p .artifacts/$(PROJ) + cp -r * .artifacts/$(PROJ) + cd .artifacts && zip -r ../$(PROJ).zip $(PROJ) + +-include $(OBJS:.o=.d) diff --git a/inc/lv_conf.h b/inc/lv_conf.h new file mode 100644 index 0000000..2043cff --- /dev/null +++ b/inc/lv_conf.h @@ -0,0 +1,1526 @@ +/** + * @file lv_conf.h + * Configuration file for v9.5.0 + */ + +/* + * Copy this file as `lv_conf.h` + * 1. simply next to `lvgl` folder + * 2. or to any other place and + * - define `LV_CONF_INCLUDE_SIMPLE`; + * - add the path as an include path. + */ + +/* clang-format off */ +#if 1 /* Set this to "1" to enable content */ + +#ifndef LV_CONF_H +#define LV_CONF_H + +/* If you need to include anything here, do it inside the `__ASSEMBLY__` guard */ +#if 0 && defined(__ASSEMBLY__) +#include "my_include.h" +#endif + +/*==================== + COLOR SETTINGS + *====================*/ + +/** Color depth: 1 (I1), 8 (L8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888) */ +#define LV_COLOR_DEPTH 16 + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +/** Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#define LV_USE_STDLIB_MALLOC LV_STDLIB_CLIB + +/** Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#define LV_USE_STDLIB_STRING LV_STDLIB_CLIB + +/** Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#define LV_USE_STDLIB_SPRINTF LV_STDLIB_CLIB + +#define LV_STDINT_INCLUDE +#define LV_STDDEF_INCLUDE +#define LV_STDBOOL_INCLUDE +#define LV_INTTYPES_INCLUDE +#define LV_LIMITS_INCLUDE +#define LV_STDARG_INCLUDE + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /** Size of memory available for `lv_malloc()` in bytes (>= 2kB) */ + #define LV_MEM_SIZE (64 * 1024U) /**< [bytes] */ + + /** Size of the memory expand for `lv_malloc()` in bytes */ + #define LV_MEM_POOL_EXPAND_SIZE 0 + + /** Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too. */ + #define LV_MEM_ADR 0 /**< 0: unused*/ + /* Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc */ + #if LV_MEM_ADR == 0 + #undef LV_MEM_POOL_INCLUDE + #undef LV_MEM_POOL_ALLOC + #endif +#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ + +/*==================== + HAL SETTINGS + *====================*/ + +/** Default display refresh, input device read and animation step period. */ +#define LV_DEF_REFR_PERIOD 33 /**< [ms] */ + +/** Default Dots Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + * (Not so important, you can adjust it to modify default sizes and spaces.) */ +#define LV_DPI_DEF 130 /**< [px/inch] */ + +/*================= + * OPERATING SYSTEM + *=================*/ +/** Select operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_MQX + * - LV_OS_SDL2 + * - LV_OS_CUSTOM */ +#define LV_USE_OS LV_OS_PTHREAD + +#if LV_USE_OS == LV_OS_CUSTOM + #define LV_OS_CUSTOM_INCLUDE +#endif +#if LV_USE_OS == LV_OS_FREERTOS + /* + * Unblocking an RTOS task with a direct notification is 45% faster and uses less RAM + * than unblocking a task using an intermediary object such as a binary semaphore. + * RTOS task notifications can only be used when there is only one task that can be the recipient of the event. + */ + #define LV_USE_FREERTOS_TASK_NOTIFY 1 +#endif + +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/** Align stride of all layers and images to this bytes */ +#define LV_DRAW_BUF_STRIDE_ALIGN 1 + +/** Align start address of draw_buf addresses to this bytes*/ +#define LV_DRAW_BUF_ALIGN 4 + +/** Using matrix for transformations. + * Requirements: + * - `LV_USE_MATRIX = 1`. + * - Rendering engine needs to support 3x3 matrix transformations. */ +#define LV_DRAW_TRANSFORM_USE_MATRIX 0 + +/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + +/** The target buffer size for simple layer chunks. */ +#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /**< [bytes]*/ + +/* Limit the max allocated memory for simple and transformed layers. + * It should be at least `LV_DRAW_LAYER_SIMPLE_BUF_SIZE` sized but if transformed layers are also used + * it should be enough to store the largest widget too (width x height x 4 area). + * Set it to 0 to have no limit. */ +#define LV_DRAW_LAYER_MAX_MEMORY 0 /**< No limit by default [bytes]*/ + +/** Stack size of drawing thread. + * NOTE: If FreeType or ThorVG is enabled, it is recommended to set it to 32KB or more. + */ +#define LV_DRAW_THREAD_STACK_SIZE (8 * 1024) /**< [bytes]*/ + +/** Thread priority of the drawing task. + * Higher values mean higher priority. + * Can use values from lv_thread_prio_t enum in lv_os.h: LV_THREAD_PRIO_LOWEST, + * LV_THREAD_PRIO_LOW, LV_THREAD_PRIO_MID, LV_THREAD_PRIO_HIGH, LV_THREAD_PRIO_HIGHEST + * Make sure the priority value aligns with the OS-specific priority levels. + * On systems with limited priority levels (e.g., FreeRTOS), a higher value can improve + * rendering performance but might cause other tasks to starve. */ +#define LV_DRAW_THREAD_PRIO LV_THREAD_PRIO_HIGH + +#define LV_USE_DRAW_SW 1 +#if LV_USE_DRAW_SW == 1 + /* + * Selectively disable color format support in order to reduce code size. + * NOTE: some features use certain color formats internally, e.g. + * - gradients use RGB888 + * - bitmaps with transparency may use ARGB8888 + */ + #define LV_DRAW_SW_SUPPORT_RGB565 1 + #define LV_DRAW_SW_SUPPORT_RGB565_SWAPPED 1 + #define LV_DRAW_SW_SUPPORT_RGB565A8 1 + #define LV_DRAW_SW_SUPPORT_RGB888 1 + #define LV_DRAW_SW_SUPPORT_XRGB8888 1 + #define LV_DRAW_SW_SUPPORT_ARGB8888 1 + #define LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED 1 + #define LV_DRAW_SW_SUPPORT_L8 1 + #define LV_DRAW_SW_SUPPORT_AL88 1 + #define LV_DRAW_SW_SUPPORT_A8 1 + #define LV_DRAW_SW_SUPPORT_I1 1 + + /* The threshold of the luminance to consider a pixel as + * active in indexed color format */ + #define LV_DRAW_SW_I1_LUM_THRESHOLD 127 + + /** Set number of draw units. + * - > 1 requires operating system to be enabled in `LV_USE_OS`. + * - > 1 means multiple threads will render the screen in parallel. */ + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + + /** Use Arm-2D to accelerate software (sw) rendering. */ + #define LV_USE_DRAW_ARM2D_SYNC 0 + + /** Enable native helium assembly to be compiled. */ + #define LV_USE_NATIVE_HELIUM_ASM 0 + + /** + * - 0: Use a simple renderer capable of drawing only simple rectangles with gradient, images, text, and straight lines only. + * - 1: Use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too. */ + #define LV_DRAW_SW_COMPLEX 1 + + #if LV_DRAW_SW_COMPLEX == 1 + /** Allow buffering some shadow calculation. + * LV_DRAW_SW_SHADOW_CACHE_SIZE is the maximum shadow size to buffer, where shadow size is + * `shadow_width + radius`. Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost. */ + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + + /** Set number of maximally-cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing. + * `radius * 4` bytes are used per circle (the most often used radiuses are saved). + * - 0: disables caching */ + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif + + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif + + /** Enable drawing complex gradients in software: linear at an angle, radial or conical */ + #define LV_USE_DRAW_SW_COMPLEX_GRADIENTS 0 + +#endif + +/*Use TSi's aka (Think Silicon) NemaGFX */ +#define LV_USE_NEMA_GFX 0 + +#if LV_USE_NEMA_GFX + /** Select which NemaGFX static library headers to use. Possible options: + * - LV_NEMA_LIB_NONE an alias of LV_NEMA_LIB_M33_REVC + * - LV_NEMA_LIB_M33_REVC + * - LV_NEMA_LIB_M33_NEMAPVG + * - LV_NEMA_LIB_M55 + * - LV_NEMA_LIB_M7 + * You must also take care to link the correct corresponding static library + * in libs/nema_gfx/lib/core/ + */ + #define LV_USE_NEMA_LIB LV_NEMA_LIB_NONE + + /** Select which NemaGFX HAL to use. Possible options: + * - LV_NEMA_HAL_CUSTOM + * - LV_NEMA_HAL_STM32 */ + #define LV_USE_NEMA_HAL LV_NEMA_HAL_CUSTOM + #if LV_USE_NEMA_HAL == LV_NEMA_HAL_STM32 + #define LV_NEMA_STM32_HAL_INCLUDE + + /** Set it to a value like __attribute__((section("Nemagfx_Memory_Pool_Buffer"))) + * and define the section in the linker script if you need the GPU memory to + * be, e.g. in a region where accesses will not be cached. + */ + #define LV_NEMA_STM32_HAL_ATTRIBUTE_POOL_MEM + #endif + + /*Enable Vector Graphics Operations. Available only if NemaVG library is present*/ + #define LV_USE_NEMA_VG 0 + #if LV_USE_NEMA_VG + /*Define application's resolution used for VG related buffer allocation */ + #define LV_NEMA_GFX_MAX_RESX 800 + #define LV_NEMA_GFX_MAX_RESY 600 + #endif +#endif + +/** Use NXP's PXP on iMX RTxxx platforms. */ +#define LV_USE_PXP 0 + +#if LV_USE_PXP + /** Use PXP for drawing.*/ + #define LV_USE_DRAW_PXP 1 + + /** Use PXP to rotate display.*/ + #define LV_USE_ROTATE_PXP 0 + + #if LV_USE_DRAW_PXP && LV_USE_OS + /** Use additional draw thread for PXP processing.*/ + #define LV_USE_PXP_DRAW_THREAD 1 + #endif + + /** Enable PXP asserts. */ + #define LV_USE_PXP_ASSERT 0 +#endif + +/** Use NXP's G2D on MPU platforms. */ +#define LV_USE_G2D 0 + +#if LV_USE_G2D + /** Use G2D for drawing. **/ + #define LV_USE_DRAW_G2D 1 + + /** Use G2D to rotate display. **/ + #define LV_USE_ROTATE_G2D 0 + + /** Maximum number of buffers that can be stored for G2D draw unit. + * Includes the frame buffers and assets. */ + #define LV_G2D_HASH_TABLE_SIZE 50 + + #if LV_USE_DRAW_G2D && LV_USE_OS + /** Use additional draw thread for G2D processing.*/ + #define LV_USE_G2D_DRAW_THREAD 1 + #endif + + /** Enable G2D asserts. */ + #define LV_USE_G2D_ASSERT 0 +#endif + +/** Use Renesas Dave2D on RA platforms. */ +#define LV_USE_DRAW_DAVE2D 0 + +/** Draw using cached SDL textures*/ +#define LV_USE_DRAW_SDL 0 + +/** Use VG-Lite GPU. */ +#define LV_USE_DRAW_VG_LITE 0 +#if LV_USE_DRAW_VG_LITE + /** Enable VG-Lite custom external 'gpu_init()' function */ + #define LV_VG_LITE_USE_GPU_INIT 0 + + /** Enable VG-Lite assert. */ + #define LV_VG_LITE_USE_ASSERT 0 + + /** VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ + #define LV_VG_LITE_FLUSH_MAX_COUNT 8 + + /** Enable border to simulate shadow. + * NOTE: which usually improves performance, + * but does not guarantee the same rendering quality as the software. */ + #define LV_VG_LITE_USE_BOX_SHADOW 1 + + /** VG-Lite gradient maximum cache number. + * @note The memory usage of a single gradient image is 4K bytes. */ + #define LV_VG_LITE_GRAD_CACHE_CNT 32 + + /** VG-Lite stroke maximum cache number. */ + #define LV_VG_LITE_STROKE_CACHE_CNT 32 + + /** VG-Lite unaligned bitmap font maximum cache number. */ + #define LV_VG_LITE_BITMAP_FONT_CACHE_CNT 256 + + /** Remove VLC_OP_CLOSE path instruction (Workaround for NXP) **/ + #define LV_VG_LITE_DISABLE_VLC_OP_CLOSE 0 + + /** Disable blit rectangular offset to resolve certain hardware errors. */ + #define LV_VG_LITE_DISABLE_BLIT_RECT_OFFSET 0 + + /** Disable linear gradient extension for some older versions of drivers. */ + #define LV_VG_LITE_DISABLE_LINEAR_GRADIENT_EXT 0 + + /** Maximum path dump print length (in points) */ + #define LV_VG_LITE_PATH_DUMP_MAX_LEN 1000 + + /** Enable usage of the LVGL's built-in vg_lite driver */ + #define LV_USE_VG_LITE_DRIVER 0 + #if LV_USE_VG_LITE_DRIVER + /** Used to pick the correct GPU series folder valid options are gc255, gc355 and gc555*/ + #define LV_VG_LITE_HAL_GPU_SERIES gc255 + + /** Used to pick the correct GPU revision header it depends on the vendor */ + #define LV_VG_LITE_HAL_GPU_REVISION 0x40 + + /** Base memory address of the GPU IP it depends on SoC, + * default value is for NXP based devices */ + #define LV_VG_LITE_HAL_GPU_BASE_ADDRESS 0x40240000 + #endif /*LV_USE_VG_LITE_DRIVER*/ + + /** Use ThorVG (a software vector library) as VG-Lite driver to allow testing VGLite on PC + * Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ + #define LV_USE_VG_LITE_THORVG 0 + #if LV_USE_VG_LITE_THORVG + /** Enable LVGL's blend mode support */ + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 + + /** Enable YUV color format support */ + #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 + + /** Enable Linear gradient extension support */ + #define LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT 0 + + /** Enable alignment on 16 pixels */ + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + + /** Buffer address alignment */ + #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 + + /** Enable multi-thread render */ + #define LV_VG_LITE_THORVG_THREAD_RENDER 0 + #endif /*LV_USE_VG_LITE_THORVG*/ +#endif + +/** Accelerate blends, fills, etc. with STM32 DMA2D */ +#define LV_USE_DRAW_DMA2D 0 +#if LV_USE_DRAW_DMA2D + #define LV_DRAW_DMA2D_HAL_INCLUDE "stm32h7xx_hal.h" + + /* if enabled, the user is required to call `lv_draw_dma2d_transfer_complete_interrupt_handler` + * upon receiving the DMA2D global interrupt + */ + #define LV_USE_DRAW_DMA2D_INTERRUPT 0 +#endif + +/** Draw using cached OpenGLES textures. Requires LV_USE_OPENGLES */ +#define LV_USE_DRAW_OPENGLES 0 +#if LV_USE_DRAW_OPENGLES + #define LV_DRAW_OPENGLES_TEXTURE_CACHE_COUNT 64 +#endif + +/** Draw using espressif PPA accelerator */ +#define LV_USE_PPA 0 +#if LV_USE_PPA + #define LV_USE_PPA_IMG 0 + #define LV_PPA_BURST_LENGTH 128 +#endif + +/* Use EVE FT81X GPU. */ +#define LV_USE_DRAW_EVE 0 +#if LV_USE_DRAW_EVE + /* EVE_GEN value: 2, 3, or 4 */ + #define LV_DRAW_EVE_EVE_GENERATION 4 + + /* The maximum number of bytes to buffer before a single SPI transmission. + * Set it to 0 to disable write buffering. + */ + #define LV_DRAW_EVE_WRITE_BUFFER_SIZE 2048 +#endif + +/** Use NanoVG Renderer + * - Requires LV_USE_NANOVG, LV_USE_MATRIX. + */ +#define LV_USE_DRAW_NANOVG 0 +#if LV_USE_DRAW_NANOVG + /** Select OpenGL backend for NanoVG: + * - LV_NANOVG_BACKEND_GL2: OpenGL 2.0 + * - LV_NANOVG_BACKEND_GL3: OpenGL 3.0+ + * - LV_NANOVG_BACKEND_GLES2: OpenGL ES 2.0 + * - LV_NANOVG_BACKEND_GLES3: OpenGL ES 3.0+ + */ + #define LV_NANOVG_BACKEND LV_NANOVG_BACKEND_GLES2 + + /** Draw image texture cache count. */ + #define LV_NANOVG_IMAGE_CACHE_CNT 128 + + /** Draw letter texture cache count. */ + #define LV_NANOVG_LETTER_CACHE_CNT 512 +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/** Enable log module */ +#define LV_USE_LOG 0 +#if LV_USE_LOG + /** Set value to one of the following levels of logging detail: + * - LV_LOG_LEVEL_TRACE Log detailed information. + * - LV_LOG_LEVEL_INFO Log important events. + * - LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem. + * - LV_LOG_LEVEL_ERROR Log only critical issues, when system may fail. + * - LV_LOG_LEVEL_USER Log only custom log messages added by the user. + * - LV_LOG_LEVEL_NONE Do not log anything. */ + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + + /** - 1: Print log with 'printf'; + * - 0: User needs to register a callback with `lv_log_register_print_cb()`. */ + #define LV_LOG_PRINTF 0 + + /** Set callback to print logs. + * E.g `my_print`. The prototype should be `void my_print(lv_log_level_t level, const char * buf)`. + * Can be overwritten by `lv_log_register_print_cb`. */ + //#define LV_LOG_PRINT_CB + + /** - 1: Enable printing timestamp; + * - 0: Disable printing timestamp. */ + #define LV_LOG_USE_TIMESTAMP 1 + + /** - 1: Print file and line number of the log; + * - 0: Do not print file and line number of the log. */ + #define LV_LOG_USE_FILE_LINE 1 + + /* Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs. */ + #define LV_LOG_TRACE_MEM 1 /**< Enable/disable trace logs in memory operations. */ + #define LV_LOG_TRACE_TIMER 1 /**< Enable/disable trace logs in timer operations. */ + #define LV_LOG_TRACE_INDEV 1 /**< Enable/disable trace logs in input device operations. */ + #define LV_LOG_TRACE_DISP_REFR 1 /**< Enable/disable trace logs in display re-draw operations. */ + #define LV_LOG_TRACE_EVENT 1 /**< Enable/disable trace logs in event dispatch logic. */ + #define LV_LOG_TRACE_OBJ_CREATE 1 /**< Enable/disable trace logs in object creation (core `obj` creation plus every widget). */ + #define LV_LOG_TRACE_LAYOUT 1 /**< Enable/disable trace logs in flex- and grid-layout operations. */ + #define LV_LOG_TRACE_ANIM 1 /**< Enable/disable trace logs in animation logic. */ + #define LV_LOG_TRACE_CACHE 1 /**< Enable/disable trace logs in cache operations. */ +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/* Enable assertion failures if an operation fails or invalid data is found. + * If LV_USE_LOG is enabled, an error message will be printed on failure. */ +#define LV_USE_ASSERT_NULL 1 /**< Check if the parameter is NULL. (Very fast, recommended) */ +#define LV_USE_ASSERT_MALLOC 1 /**< Checks is the memory is successfully allocated or no. (Very fast, recommended) */ +#define LV_USE_ASSERT_STYLE 0 /**< Check if the styles are properly initialized. (Very fast, recommended) */ +#define LV_USE_ASSERT_MEM_INTEGRITY 0 /**< Check the integrity of `lv_mem` after critical operations. (Slow) */ +#define LV_USE_ASSERT_OBJ 0 /**< Check the object's type and existence (e.g. not deleted). (Slow) */ + +/** Add a custom handler when assert happens e.g. to restart MCU. */ +#define LV_ASSERT_HANDLER_INCLUDE +#define LV_ASSERT_HANDLER while(1); /**< Halt by default */ + +/*------------- + * Debug + *-----------*/ + +/** 1: Draw random colored rectangles over the redrawn areas. */ +#define LV_USE_REFR_DEBUG 0 + +/** 1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ +#define LV_USE_LAYER_DEBUG 0 + +/** 1: Adds the following behaviors for debugging: + * - Draw overlays with different colors for each draw_unit's tasks. + * - Draw index number of draw unit on white background. + * - For layers, draws index number of draw unit on black background. */ +#define LV_USE_PARALLEL_DRAW_DEBUG 0 + +/*------------- + * Others + *-----------*/ + +#define LV_ENABLE_GLOBAL_CUSTOM 0 +#if LV_ENABLE_GLOBAL_CUSTOM + /** Header to include for custom 'lv_global' function" */ + #define LV_GLOBAL_CUSTOM_INCLUDE +#endif + +/** Default cache size in bytes. + * Used by image decoders such as `lv_lodepng` to keep the decoded image in memory. + * If size is not set to 0, the decoder will fail to decode when the cache is full. + * If size is 0, the cache function is not enabled and the decoded memory will be + * released immediately after use. */ +#define LV_CACHE_DEF_SIZE 0 + +/** Default number of image header cache entries. The cache is used to store the headers of images + * The main logic is like `LV_CACHE_DEF_SIZE` but for image headers. */ +#define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 + +/** Number of stops allowed per gradient. Increase this to allow more stops. + * This adds (sizeof(lv_color_t) + 1) bytes per additional stop. */ +#define LV_GRADIENT_MAX_STOPS 2 + +/** Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * - 0: round down, + * - 64: round up from x.75, + * - 128: round up from half, + * - 192: round up from x.25, + * - 254: round up */ +#define LV_COLOR_MIX_ROUND_OFS 0 + +/** Add 2 x 32-bit variables to each `lv_obj_t` to speed up getting style properties */ +#define LV_OBJ_STYLE_CACHE 0 + +/** Add `id` field to `lv_obj_t` */ +#define LV_USE_OBJ_ID 0 + +/** Enable support widget names*/ +#define LV_USE_OBJ_NAME 0 + +/** Automatically assign an ID when obj is created */ +#define LV_OBJ_ID_AUTO_ASSIGN LV_USE_OBJ_ID + +/** Use builtin obj ID handler functions: +* - lv_obj_assign_id: Called when a widget is created. Use a separate counter for each widget class as an ID. +* - lv_obj_id_compare: Compare the ID to decide if it matches with a requested value. +* - lv_obj_stringify_id: Return string-ified identifier, e.g. "button3". +* - lv_obj_free_id: Does nothing, as there is no memory allocation for the ID. +* When disabled these functions needs to be implemented by the user.*/ +#define LV_USE_OBJ_ID_BUILTIN 1 + +/** Use obj property set/get API. */ +#define LV_USE_OBJ_PROPERTY 0 + +/** Enable property name support. */ +#define LV_USE_OBJ_PROPERTY_NAME 1 + +/* Enable the multi-touch gesture recognition feature */ +/* Gesture recognition requires the use of floats */ +#define LV_USE_GESTURE_RECOGNITION 0 + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/** For big endian systems set to 1 */ +#define LV_BIG_ENDIAN_SYSTEM 0 + +/** Define a custom attribute for `lv_tick_inc` function */ +#define LV_ATTRIBUTE_TICK_INC + +/** Define a custom attribute for `lv_timer_handler` function */ +#define LV_ATTRIBUTE_TIMER_HANDLER + +/** Define a custom attribute for `lv_display_flush_ready` function */ +#define LV_ATTRIBUTE_FLUSH_READY + +/** Align VG_LITE buffers on this number of bytes. + * @note vglite_src_buf_aligned() uses this value to validate alignment of passed buffer pointers. */ +#define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + +/** Will be added where memory needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#define LV_ATTRIBUTE_MEM_ALIGN + +/** Attribute to mark large constant arrays, for example for font bitmaps */ +#define LV_ATTRIBUTE_LARGE_CONST + +/** Compiler prefix for a large array declaration in RAM */ +#define LV_ATTRIBUTE_LARGE_RAM_ARRAY + +/** Place performance critical functions into a faster memory (e.g RAM) */ +#define LV_ATTRIBUTE_FAST_MEM + +/** Export integer constant to binding. This macro is used with constants in the form of LV_ that + * should also appear on LVGL binding API such as MicroPython. */ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /**< The default value just prevents GCC warning */ + +/** Prefix all global extern data with this */ +#define LV_ATTRIBUTE_EXTERN_DATA + +/** Use `float` as `lv_value_precise_t` */ +#define LV_USE_FLOAT 0 + +/** Enable matrix support + * - Requires `LV_USE_FLOAT = 1` */ +#define LV_USE_MATRIX 0 + +/** Include `lvgl_private.h` in `lvgl.h` to access internal data and functions by default */ +#ifndef LV_USE_PRIVATE_API + #define LV_USE_PRIVATE_API 0 +#endif + +/*================== + * FONT USAGE + *===================*/ + +/* Montserrat fonts with ASCII range and some symbols using bpp = 4 + * https://fonts.google.com/specimen/Montserrat */ +#define LV_FONT_MONTSERRAT_8 0 +#define LV_FONT_MONTSERRAT_10 0 +#define LV_FONT_MONTSERRAT_12 0 +#define LV_FONT_MONTSERRAT_14 1 +#define LV_FONT_MONTSERRAT_16 0 +#define LV_FONT_MONTSERRAT_18 0 +#define LV_FONT_MONTSERRAT_20 0 +#define LV_FONT_MONTSERRAT_22 0 +#define LV_FONT_MONTSERRAT_24 0 +#define LV_FONT_MONTSERRAT_26 0 +#define LV_FONT_MONTSERRAT_28 0 +#define LV_FONT_MONTSERRAT_30 0 +#define LV_FONT_MONTSERRAT_32 0 +#define LV_FONT_MONTSERRAT_34 0 +#define LV_FONT_MONTSERRAT_36 0 +#define LV_FONT_MONTSERRAT_38 0 +#define LV_FONT_MONTSERRAT_40 0 +#define LV_FONT_MONTSERRAT_42 0 +#define LV_FONT_MONTSERRAT_44 0 +#define LV_FONT_MONTSERRAT_46 0 +#define LV_FONT_MONTSERRAT_48 0 + +/* Demonstrate special features */ +#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /**< bpp = 3 */ +#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /**< Hebrew, Arabic, Persian letters and all their forms */ +#define LV_FONT_SOURCE_HAN_SANS_SC_14_CJK 0 /**< 1338 most common CJK radicals */ +#define LV_FONT_SOURCE_HAN_SANS_SC_16_CJK 0 /**< 1338 most common CJK radicals */ + +/** Pixel perfect monospaced fonts */ +#define LV_FONT_UNSCII_8 0 +#define LV_FONT_UNSCII_16 0 + +/** Optionally declare custom fonts here. + * + * You can use any of these fonts as the default font too and they will be available + * globally. Example: + * + * @code + * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2) + * @endcode + */ +#define LV_FONT_CUSTOM_DECLARE + +/** Always set a default font */ +#define LV_FONT_DEFAULT &lv_font_montserrat_14 + +/** Enable handling large font and/or fonts with a lot of characters. + * The limit depends on the font size, font face and bpp. + * A compiler error will be triggered if a font needs it. */ +#define LV_FONT_FMT_TXT_LARGE 0 + +/** Enables/disables support for compressed fonts. */ +#define LV_USE_FONT_COMPRESSED 0 + +/** Enable drawing placeholders when glyph dsc is not found. */ +#define LV_USE_FONT_PLACEHOLDER 1 + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding. + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#define LV_TXT_ENC LV_TXT_ENC_UTF8 + +/** While rendering text strings, break (wrap) text on these chars. */ +#define LV_TXT_BREAK_CHARS " ,.;:-_)]}" + +/** If a word is at least this long, will break wherever "prettiest". + * To disable, set to a value <= 0. */ +#define LV_TXT_LINE_BREAK_LONG_LEN 0 + +/** Minimum number of characters in a long word to put on a line before a break. + * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/** Minimum number of characters in a long word to put on a line after a break. + * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/** Support bidirectional text. Allows mixing Left-to-Right and Right-to-Left text. + * The direction will be processed according to the Unicode Bidirectional Algorithm: + * https://www.w3.org/International/articles/inline-bidi-markup/uba-basics */ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect text base direction*/ + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/** Enable Arabic/Persian processing + * In these languages characters should be replaced with another form based on their position in the text */ +#define LV_USE_ARABIC_PERSIAN_CHARS 0 + +/*The control character to use for signaling text recoloring*/ +#define LV_TXT_COLOR_CMD "#" + +/*================== + * WIDGETS + *================*/ +/* Documentation for widgets can be found here: https://docs.lvgl.io/master/widgets/index.html . */ + +/** 1: Causes these widgets to be given default values at creation time. + * - lv_buttonmatrix_t: Get default maps: {"Btn1", "Btn2", "Btn3", "\n", "Btn4", "Btn5", ""}, else map not set. + * - lv_checkbox_t : String label set to "Check box", else set to empty string. + * - lv_dropdown_t : Options set to "Option 1", "Option 2", "Option 3", else no values are set. + * - lv_roller_t : Options set to "Option 1", "Option 2", "Option 3", "Option 4", "Option 5", else no values are set. + * - lv_label_t : Text set to "Text", else empty string. + * - lv_arclabel_t : Text set to "Arced Text", else empty string. + * */ +#define LV_WIDGETS_HAS_DEFAULT_VALUE 1 + +#define LV_USE_ANIMIMG 1 + +#define LV_USE_ARC 1 + +#define LV_USE_ARCLABEL 1 + +#define LV_USE_BAR 1 + +#define LV_USE_BUTTON 1 + +#define LV_USE_BUTTONMATRIX 1 + +#define LV_USE_CALENDAR 1 +#if LV_USE_CALENDAR + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 + #define LV_USE_CALENDAR_CHINESE 0 +#endif /*LV_USE_CALENDAR*/ + +#define LV_USE_CANVAS 1 + +#define LV_USE_CHART 1 + +#define LV_USE_CHECKBOX 1 + +#define LV_USE_DROPDOWN 1 /**< Requires: lv_label */ + +#define LV_USE_IMAGE 1 /**< Requires: lv_label */ + +#define LV_USE_IMAGEBUTTON 1 + +#define LV_USE_KEYBOARD 1 + +#define LV_USE_LABEL 1 +#if LV_USE_LABEL + #define LV_LABEL_TEXT_SELECTION 1 /**< Enable selecting text of the label */ + #define LV_LABEL_LONG_TXT_HINT 1 /**< Store some extra info in labels to speed up drawing of very long text */ + #define LV_LABEL_WAIT_CHAR_COUNT 3 /**< The count of wait chart */ +#endif + +#define LV_USE_LED 1 + +#define LV_USE_LINE 1 + +#define LV_USE_LIST 1 + +#define LV_USE_LOTTIE 0 /**< Requires: lv_canvas, thorvg */ + +#define LV_USE_MENU 1 + +#define LV_USE_MSGBOX 1 + +#define LV_USE_ROLLER 1 /**< Requires: lv_label */ + +#define LV_USE_SCALE 1 + +#define LV_USE_SLIDER 1 /**< Requires: lv_bar */ + +#define LV_USE_SPAN 1 +#if LV_USE_SPAN + /** A line of text can contain this maximum number of span descriptors. */ + #define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +#define LV_USE_SPINBOX 1 + +#define LV_USE_SPINNER 1 + +#define LV_USE_SWITCH 1 + +#define LV_USE_TABLE 1 + +#define LV_USE_TABVIEW 1 + +#define LV_USE_TEXTAREA 1 /**< Requires: lv_label */ +#if LV_USE_TEXTAREA != 0 + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /**< [ms] */ +#endif + +#define LV_USE_TILEVIEW 1 + +#define LV_USE_WIN 1 + +#define LV_USE_3DTEXTURE 0 + +/*================== + * THEMES + *==================*/ +/* Documentation for themes can be found here: https://docs.lvgl.io/master/common-widget-features/styles/styles.html#themes . */ + +/** A simple, impressive and very complete theme */ +#define LV_USE_THEME_DEFAULT 1 +#if LV_USE_THEME_DEFAULT + /** 0: Light mode; 1: Dark mode */ + #define LV_THEME_DEFAULT_DARK 0 + + /** 1: Enable grow on press */ + #define LV_THEME_DEFAULT_GROW 1 + + /** Default transition time in ms. */ + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 +#endif /*LV_USE_THEME_DEFAULT*/ + +/** A very simple theme that is a good starting point for a custom theme */ +#define LV_USE_THEME_SIMPLE 1 + +/** A theme designed for monochrome displays */ +#define LV_USE_THEME_MONO 1 + +/*================== + * LAYOUTS + *==================*/ +/* Documentation for layouts can be found here: https://docs.lvgl.io/master/common-widget-features/layouts/index.html . */ + +/** A layout similar to Flexbox in CSS. */ +#define LV_USE_FLEX 1 + +/** A layout similar to Grid in CSS. */ +#define LV_USE_GRID 1 + +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ +/* Documentation for libraries can be found here: https://docs.lvgl.io/master/libs/index.html . */ + +/* File system interfaces for common APIs */ + +/** Setting a default driver letter allows skipping the driver prefix in filepaths. + * Documentation about how to use the below driver-identifier letters can be found at + * https://docs.lvgl.io/master/main-modules/fs.html#lv-fs-identifier-letters . */ +#define LV_FS_DEFAULT_DRIVER_LETTER '\0' + +/** API for fopen, fread, etc. */ +#define LV_USE_FS_STDIO 0 +#if LV_USE_FS_STDIO + #define LV_FS_STDIO_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #define LV_FS_STDIO_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #define LV_FS_STDIO_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ +#endif + +/** API for open, read, etc. */ +#define LV_USE_FS_POSIX 0 +#if LV_USE_FS_POSIX + #define LV_FS_POSIX_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #define LV_FS_POSIX_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #define LV_FS_POSIX_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ +#endif + +/** API for CreateFile, ReadFile, etc. */ +#define LV_USE_FS_WIN32 0 +#if LV_USE_FS_WIN32 + #define LV_FS_WIN32_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #define LV_FS_WIN32_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #define LV_FS_WIN32_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ +#endif + +/** API for FATFS (needs to be added separately). Uses f_open, f_read, etc. */ +#define LV_USE_FS_FATFS 0 +#if LV_USE_FS_FATFS + #define LV_FS_FATFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #define LV_FS_FATFS_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #define LV_FS_FATFS_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ +#endif + +/** API for memory-mapped file access. */ +#define LV_USE_FS_MEMFS 0 +#if LV_USE_FS_MEMFS + #define LV_FS_MEMFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ +#endif + +/** API for LittleFs. */ +#define LV_USE_FS_LITTLEFS 0 +#if LV_USE_FS_LITTLEFS + #define LV_FS_LITTLEFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #define LV_FS_LITTLEFS_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ +#endif + +/** API for Arduino LittleFs. */ +#define LV_USE_FS_ARDUINO_ESP_LITTLEFS 0 +#if LV_USE_FS_ARDUINO_ESP_LITTLEFS + #define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #define LV_FS_ARDUINO_ESP_LITTLEFS_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ +#endif + +/** API for Arduino Sd. */ +#define LV_USE_FS_ARDUINO_SD 0 +#if LV_USE_FS_ARDUINO_SD + #define LV_FS_ARDUINO_SD_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #define LV_FS_ARDUINO_SD_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ +#endif + +/** API for UEFI */ +#define LV_USE_FS_UEFI 0 +#if LV_USE_FS_UEFI + #define LV_FS_UEFI_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ +#endif + +#define LV_USE_FS_FROGFS 0 +#if LV_USE_FS_FROGFS + #define LV_FS_FROGFS_LETTER '\0' +#endif + +/** LODEPNG decoder library */ +#define LV_USE_LODEPNG 0 + +/** PNG decoder(libpng) library */ +#define LV_USE_LIBPNG 0 + +/** BMP decoder library */ +#define LV_USE_BMP 0 + +/** JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#define LV_USE_TJPGD 0 + +/** libjpeg-turbo decoder library. + * - Supports complete JPEG specifications and high-performance JPEG decoding. */ +#define LV_USE_LIBJPEG_TURBO 0 + +/** WebP decoder library */ +#define LV_USE_LIBWEBP 0 + +/** GIF decoder library */ +#define LV_USE_GIF 0 +#if LV_USE_GIF + /** GIF decoder accelerate */ + #define LV_GIF_CACHE_DECODE_DATA 0 +#endif + +/** GStreamer library */ +#define LV_USE_GSTREAMER 0 + +/** Decode bin images to RAM */ +#define LV_BIN_DECODER_RAM_LOAD 0 + +/** RLE decompress library */ +#define LV_USE_RLE 0 + +/** QR code library */ +#define LV_USE_QRCODE 0 + +/** Barcode code library */ +#define LV_USE_BARCODE 0 + +/** FreeType library */ +#define LV_USE_FREETYPE 0 +#if LV_USE_FREETYPE + /** Let FreeType use LVGL memory and file porting */ + #define LV_FREETYPE_USE_LVGL_PORT 0 + + /** Cache count of glyphs in FreeType, i.e. number of glyphs that can be cached. + * The higher the value, the more memory will be used. */ + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 +#endif + +/** Built-in TTF decoder */ +#define LV_USE_TINY_TTF 0 +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #define LV_TINY_TTF_FILE_SUPPORT 0 + #define LV_TINY_TTF_CACHE_GLYPH_CNT 128 + #define LV_TINY_TTF_CACHE_KERNING_CNT 256 +#endif + +/** Rlottie library */ +#define LV_USE_RLOTTIE 0 + +/** Requires `LV_USE_3DTEXTURE = 1` */ +#define LV_USE_GLTF 0 + +/** Enable Vector Graphic APIs + * Requires `LV_USE_MATRIX = 1` + * and a rendering engine supporting vector graphics, e.g. + * (LV_USE_DRAW_SW and LV_USE_THORVG) or LV_USE_DRAW_VG_LITE or LV_USE_NEMA_VG. */ +#define LV_USE_VECTOR_GRAPHIC 0 + +/** Enable ThorVG (vector graphics library) from the src/libs folder. + * Requires LV_USE_VECTOR_GRAPHIC */ +#define LV_USE_THORVG_INTERNAL 0 + +/** Enable ThorVG by assuming that its installed and linked to the project + * Requires LV_USE_VECTOR_GRAPHIC */ +#define LV_USE_THORVG_EXTERNAL 0 + +/** Enable NanoVG (vector graphics library) */ +#define LV_USE_NANOVG 0 + +/** Use lvgl built-in LZ4 lib */ +#define LV_USE_LZ4_INTERNAL 0 + +/** Use external LZ4 library */ +#define LV_USE_LZ4_EXTERNAL 0 + +/*SVG library + * - Requires `LV_USE_VECTOR_GRAPHIC = 1` */ +#define LV_USE_SVG 0 +#define LV_USE_SVG_ANIMATION 0 +#define LV_USE_SVG_DEBUG 0 + +/** FFmpeg library for image decoding and playing videos. + * Supports all major image formats so do not enable other image decoder with it. */ +#define LV_USE_FFMPEG 0 +#if LV_USE_FFMPEG + /** Dump input information to stderr */ + #define LV_FFMPEG_DUMP_FORMAT 0 + /** Use lvgl file path in FFmpeg Player widget + * You won't be able to open URLs after enabling this feature. + * Note that FFmpeg image decoder will always use lvgl file system. */ + #define LV_FFMPEG_PLAYER_USE_LV_FS 0 +#endif + +/*================== + * OTHERS + *==================*/ +/* Documentation for several of the below items can be found here: https://docs.lvgl.io/master/auxiliary-modules/index.html . */ + +/** 1: Enable API to take snapshot for object */ +#define LV_USE_SNAPSHOT 0 + +/** 1: Enable system monitor component */ +#define LV_USE_SYSMON 0 +#if LV_USE_SYSMON + /** Get the idle percentage. E.g. uint32_t my_get_idle(void); */ + #define LV_SYSMON_GET_IDLE lv_os_get_idle_percent + /** 1: Enable usage of lv_os_get_proc_idle_percent.*/ + #define LV_SYSMON_PROC_IDLE_AVAILABLE 0 + #if LV_SYSMON_PROC_IDLE_AVAILABLE + /** Get the applications idle percentage. + * - Requires `LV_USE_OS == LV_OS_PTHREAD` */ + #define LV_SYSMON_GET_PROC_IDLE lv_os_get_proc_idle_percent + #endif + + /** 1: Show CPU usage and FPS count. + * - Requires `LV_USE_SYSMON = 1` */ + #define LV_USE_PERF_MONITOR 0 + #if LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + + /** 0: Displays performance data on the screen; 1: Prints performance data using log. */ + #define LV_USE_PERF_MONITOR_LOG_MODE 0 + #endif + + /** 1: Show used memory and memory fragmentation. + * - Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` + * - Requires `LV_USE_SYSMON = 1`*/ + #define LV_USE_MEM_MONITOR 0 + #if LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif +#endif /*LV_USE_SYSMON*/ + +/** 1: Enable runtime performance profiler */ +#define LV_USE_PROFILER 0 +#if LV_USE_PROFILER + /** 1: Enable the built-in profiler */ + #define LV_USE_PROFILER_BUILTIN 1 + #if LV_USE_PROFILER_BUILTIN + /** Default profiler trace buffer size */ + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /**< [bytes] */ + #define LV_PROFILER_BUILTIN_DEFAULT_ENABLE 1 + #define LV_USE_PROFILER_BUILTIN_POSIX 0 /**< Enable POSIX profiler port */ + #endif + + /** Header to include for profiler */ + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" + + /** Profiler start point function */ + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN + + /** Profiler end point function */ + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END + + /** Profiler start point function with custom tag */ + #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG + + /** Profiler end point function with custom tag */ + #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG + + /*Enable layout profiler*/ + #define LV_PROFILER_LAYOUT 1 + + /*Enable disp refr profiler*/ + #define LV_PROFILER_REFR 1 + + /*Enable draw profiler*/ + #define LV_PROFILER_DRAW 1 + + /*Enable indev profiler*/ + #define LV_PROFILER_INDEV 1 + + /*Enable decoder profiler*/ + #define LV_PROFILER_DECODER 1 + + /*Enable font profiler*/ + #define LV_PROFILER_FONT 1 + + /*Enable fs profiler*/ + #define LV_PROFILER_FS 1 + + /*Enable style profiler*/ + #define LV_PROFILER_STYLE 0 + + /*Enable timer profiler*/ + #define LV_PROFILER_TIMER 1 + + /*Enable cache profiler*/ + #define LV_PROFILER_CACHE 1 + + /*Enable event profiler*/ + #define LV_PROFILER_EVENT 1 +#endif + +/** 1: Enable Monkey test */ +#define LV_USE_MONKEY 0 + +/** 1: Enable grid navigation */ +#define LV_USE_GRIDNAV 0 + +/** 1: Enable `lv_obj` fragment logic */ +#define LV_USE_FRAGMENT 0 + +/** 1: Support using images as font in label or span widgets */ +#define LV_USE_IMGFONT 0 + +/** 1: Enable an observer pattern implementation */ +#define LV_USE_OBSERVER 1 + +/** 1: Enable Pinyin input method + * - Requires: lv_keyboard */ +#define LV_USE_IME_PINYIN 0 +#if LV_USE_IME_PINYIN + /** 1: Use default thesaurus. + * @note If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesaurus. */ + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + /** Set maximum number of candidate panels that can be displayed. + * @note This needs to be adjusted according to size of screen. */ + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + + /** Use 9-key input (k9). */ + #define LV_IME_PINYIN_USE_K9_MODE 1 + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif /*LV_IME_PINYIN_USE_K9_MODE*/ +#endif + +/** 1: Enable file explorer. + * - Requires: lv_table */ +#define LV_USE_FILE_EXPLORER 0 +#if LV_USE_FILE_EXPLORER + /** Maximum length of path */ + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + /** Quick access bar, 1:use, 0:do not use. + * - Requires: lv_list */ + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 +#endif + +/** 1: Enable Font manager */ +#define LV_USE_FONT_MANAGER 0 +#if LV_USE_FONT_MANAGER + +/**Font manager name max length*/ +#define LV_FONT_MANAGER_NAME_MAX_LEN 32 + +#endif + +/** Enable emulated input devices, time emulation, and screenshot compares. */ +#define LV_USE_TEST 0 +#if LV_USE_TEST + +/** Enable `lv_test_screenshot_compare`. + * Requires lodepng and a few MB of extra RAM. */ +#define LV_USE_TEST_SCREENSHOT_COMPARE 0 + +#if LV_USE_TEST_SCREENSHOT_COMPARE + /** 1: Automatically create missing reference images*/ + #define LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE 1 +#endif /*LV_USE_TEST_SCREENSHOT_COMPARE*/ + +#endif /*LV_USE_TEST*/ + +/** 1: Enable text translation support */ +#define LV_USE_TRANSLATION 0 + +/*1: Enable color filter style*/ +#define LV_USE_COLOR_FILTER 0 + +/*================== + * DEVICES + *==================*/ + +/** Use SDL to open window on PC and handle mouse and keyboard. */ +#define LV_USE_SDL 0 +#if LV_USE_SDL + #define LV_SDL_INCLUDE_PATH + #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /**< LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance */ + #define LV_SDL_BUF_COUNT 1 /**< 1 or 2 */ + #define LV_SDL_ACCELERATED 1 /**< 1: Use hardware acceleration*/ + #define LV_SDL_FULLSCREEN 0 /**< 1: Make the window full screen by default */ + #define LV_SDL_DIRECT_EXIT 1 /**< 1: Exit the application when all SDL windows are closed */ + #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ +#endif + +/** Use X11 to open window on Linux desktop and handle mouse and keyboard */ +#define LV_USE_X11 1 +#if LV_USE_X11 + #define LV_X11_DIRECT_EXIT 1 /**< Exit application when all X11 windows have been closed */ + #define LV_X11_DOUBLE_BUFFER 1 /**< Use double buffers for rendering */ + /* Select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!). */ + #define LV_X11_RENDER_MODE_PARTIAL 1 /**< Partial render mode (preferred) */ + #define LV_X11_RENDER_MODE_DIRECT 0 /**< Direct render mode */ + #define LV_X11_RENDER_MODE_FULL 0 /**< Full render mode */ +#endif + +/** Use Wayland to open a window and handle input on Linux or BSD desktops */ +#define LV_USE_WAYLAND 0 +#if LV_USE_WAYLAND + #define LV_WAYLAND_DIRECT_EXIT 1 /**< 1: Exit the application when all Wayland windows are closed */ +#endif + +/** Driver for /dev/fb */ +#define LV_USE_LINUX_FBDEV 0 +#if LV_USE_LINUX_FBDEV + #define LV_LINUX_FBDEV_BSD 0 + #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL + #define LV_LINUX_FBDEV_BUFFER_COUNT 0 + #define LV_LINUX_FBDEV_BUFFER_SIZE 60 + #define LV_LINUX_FBDEV_MMAP 1 +#endif + +/** Use Nuttx to open window and handle touchscreen */ +#define LV_USE_NUTTX 0 + +#if LV_USE_NUTTX + #define LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP 0 + + /** Use independent image heap for default draw buffer */ + #define LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP 0 + + #define LV_USE_NUTTX_LIBUV 0 + + /** Use Nuttx custom init API to open window and handle touchscreen */ + #define LV_USE_NUTTX_CUSTOM_INIT 0 + + /** Driver for /dev/lcd */ + #define LV_USE_NUTTX_LCD 0 + #if LV_USE_NUTTX_LCD + #define LV_NUTTX_LCD_BUFFER_COUNT 0 + #define LV_NUTTX_LCD_BUFFER_SIZE 60 + #endif + + /** Driver for /dev/input */ + #define LV_USE_NUTTX_TOUCHSCREEN 0 + + /** Touchscreen cursor size in pixels(<=0: disable cursor) */ + #define LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE 0 + + /** Driver for /dev/mouse */ + #define LV_USE_NUTTX_MOUSE 0 + + /** Mouse movement step (pixels) */ + #define LV_USE_NUTTX_MOUSE_MOVE_STEP 1 + + /*NuttX trace file and its path*/ + #define LV_USE_NUTTX_TRACE_FILE 0 + #if LV_USE_NUTTX_TRACE_FILE + #define LV_NUTTX_TRACE_FILE_PATH "/data/lvgl-trace.log" + #endif + +#endif + +/** Driver for /dev/dri/card */ +#define LV_USE_LINUX_DRM 0 + +#if LV_USE_LINUX_DRM + + /* Use the MESA GBM library to allocate DMA buffers that can be + * shared across sub-systems and libraries using the Linux DMA-BUF API. + * The GBM library aims to provide a platform independent memory management system + * it supports the major GPU vendors - This option requires linking with libgbm */ + #define LV_USE_LINUX_DRM_GBM_BUFFERS 0 +#endif + +/** Interface for TFT_eSPI */ +#define LV_USE_TFT_ESPI 0 + +/** Interface for Lovyan_GFX */ +#define LV_USE_LOVYAN_GFX 0 + +#if LV_USE_LOVYAN_GFX + #define LV_LGFX_USER_INCLUDE "lv_lgfx_user.hpp" + +#endif /*LV_USE_LOVYAN_GFX*/ + +/** Driver for evdev input devices */ +#define LV_USE_EVDEV 0 + +/** Driver for libinput input devices */ +#define LV_USE_LIBINPUT 0 + +#if LV_USE_LIBINPUT + #define LV_LIBINPUT_BSD 0 + + /** Full keyboard support */ + #define LV_LIBINPUT_XKB 0 + #if LV_LIBINPUT_XKB + /** "setxkbmap -query" can help find the right values for your keyboard */ + #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } + #endif +#endif + +/* Drivers for LCD devices connected via SPI/parallel port */ +#define LV_USE_ST7735 0 +#define LV_USE_ST7789 0 +#define LV_USE_ST7796 0 +#define LV_USE_ILI9341 0 +#define LV_USE_FT81X 0 +#define LV_USE_NV3007 0 + +#if (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341 | LV_USE_NV3007) + #define LV_USE_GENERIC_MIPI 1 +#else + #define LV_USE_GENERIC_MIPI 0 +#endif + +/** Driver for Renesas GLCD */ +#define LV_USE_RENESAS_GLCDC 0 + +/** Driver for ST LTDC */ +#define LV_USE_ST_LTDC 0 +#if LV_USE_ST_LTDC + /* Only used for partial. */ + #define LV_ST_LTDC_USE_DMA2D_FLUSH 0 +#endif + +/** Driver for NXP ELCDIF */ +#define LV_USE_NXP_ELCDIF 0 + +/** LVGL Windows backend */ +#define LV_USE_WINDOWS 0 + +/** LVGL UEFI backend */ +#define LV_USE_UEFI 0 +#if LV_USE_UEFI + #define LV_USE_UEFI_INCLUDE "myefi.h" /**< Header that hides the actual framework (EDK2, gnu-efi, ...) */ + #define LV_UEFI_USE_MEMORY_SERVICES 0 /**< Use the memory functions from the boot services table */ +#endif + +/** Use a generic OpenGL driver that can be used to embed in other applications or used with GLFW/EGL + * - Requires LV_USE_MATRIX. + */ +#define LV_USE_OPENGLES 0 +#if LV_USE_OPENGLES + #define LV_USE_OPENGLES_DEBUG 1 /**< Enable or disable debug for opengles */ +#endif + +/** Use GLFW to open window on PC and handle mouse and keyboard. Requires*/ +#define LV_USE_GLFW 0 + + +/** QNX Screen display and input drivers */ +#define LV_USE_QNX 0 +#if LV_USE_QNX + #define LV_QNX_BUF_COUNT 1 /**< 1 or 2 */ +#endif + +/** Enable or disable for external data and destructor function */ +#define LV_USE_EXT_DATA 0 + +/*===================== +* BUILD OPTIONS +*======================*/ + +/** Enable examples to be built with the library. */ +#define LV_BUILD_EXAMPLES 0 + +/** Build the demos */ +#define LV_BUILD_DEMOS 0 + +/*=================== + * DEMO USAGE + ====================*/ + +#if LV_BUILD_DEMOS + /** Show some widgets. This might be required to increase `LV_MEM_SIZE`. */ + #define LV_USE_DEMO_WIDGETS 0 + + /** Demonstrate usage of encoder and keyboard. */ + #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + + /** Benchmark your system */ + #define LV_USE_DEMO_BENCHMARK 0 + + #if LV_USE_DEMO_BENCHMARK + /** Use fonts where bitmaps are aligned 16 byte and has Nx16 byte stride */ + #define LV_DEMO_BENCHMARK_ALIGNED_FONTS 0 + #endif + + /** Render test for each primitive. + * - Requires at least 480x272 display. */ + #define LV_USE_DEMO_RENDER 0 + + /** Stress test for LVGL */ + #define LV_USE_DEMO_STRESS 0 + + /** Music player demo */ + #define LV_USE_DEMO_MUSIC 0 + #if LV_USE_DEMO_MUSIC + #define LV_DEMO_MUSIC_SQUARE 0 + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #define LV_DEMO_MUSIC_ROUND 0 + #define LV_DEMO_MUSIC_LARGE 0 + #define LV_DEMO_MUSIC_AUTO_PLAY 0 + #endif + + /** Vector graphic demo */ + #define LV_USE_DEMO_VECTOR_GRAPHIC 0 + + /** GLTF demo */ + #define LV_USE_DEMO_GLTF 0 + + /*--------------------------- + * Demos from lvgl/lv_demos + ---------------------------*/ + + /** Flex layout demo */ + #define LV_USE_DEMO_FLEX_LAYOUT 0 + + /** Smart-phone like multi-language demo */ + #define LV_USE_DEMO_MULTILANG 0 + + /*E-bike demo with Lottie animations (if LV_USE_LOTTIE is enabled)*/ + #define LV_USE_DEMO_EBIKE 0 + #if LV_USE_DEMO_EBIKE + #define LV_DEMO_EBIKE_PORTRAIT 0 /*0: for 480x270..480x320, 1: for 480x800..720x1280*/ + #endif + + /** High-resolution demo */ + #define LV_USE_DEMO_HIGH_RES 0 + + /* Smart watch demo */ + #define LV_USE_DEMO_SMARTWATCH 0 +#endif /* LV_BUILD_DEMOS */ + +/*--END OF LV_CONF_H--*/ + +#endif /*LV_CONF_H*/ + +#endif /*End of "Content enable"*/ diff --git a/inc/lvgl/lv_version.h b/inc/lvgl/lv_version.h new file mode 100644 index 0000000..0e7985c --- /dev/null +++ b/inc/lvgl/lv_version.h @@ -0,0 +1,14 @@ +/** + * @file lv_version.h + * The current version of LVGL + */ + +#ifndef LV_VERSION_H +#define LV_VERSION_H + +#define LVGL_VERSION_MAJOR 9 +#define LVGL_VERSION_MINOR 5 +#define LVGL_VERSION_PATCH 0 +#define LVGL_VERSION_INFO "" + +#endif /* LV_VERSION_H */ diff --git a/inc/lvgl/lvgl.h b/inc/lvgl/lvgl.h new file mode 100644 index 0000000..a063501 --- /dev/null +++ b/inc/lvgl/lvgl.h @@ -0,0 +1,220 @@ +/** + * @file lvgl.h + * Include all LVGL related headers + */ + +#ifndef LVGL_H +#define LVGL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*************************** + * CURRENT VERSION OF LVGL + ***************************/ +#include "lv_version.h" + +/********************* + * INCLUDES + *********************/ +#include "src/lv_init.h" + +#include "src/stdlib/lv_mem.h" +#include "src/stdlib/lv_string.h" +#include "src/stdlib/lv_sprintf.h" + +#include "src/misc/lv_log.h" +#include "src/misc/lv_timer.h" +#include "src/misc/lv_math.h" +#include "src/misc/lv_array.h" +#include "src/misc/lv_async.h" +#include "src/misc/lv_anim_timeline.h" +#include "src/misc/lv_profiler_builtin.h" +#include "src/misc/lv_rb.h" +#include "src/misc/lv_utils.h" +#include "src/misc/lv_iter.h" +#include "src/misc/lv_circle_buf.h" +#include "src/misc/lv_tree.h" + +#include "src/osal/lv_os.h" + +#include "src/tick/lv_tick.h" + +#include "src/core/lv_obj.h" +#include "src/core/lv_group.h" +#include "src/core/lv_refr.h" +#include "src/core/lv_observer.h" +#include "src/indev/lv_indev.h" +#include "src/indev/lv_indev_gesture.h" +#include "src/indev/lv_gridnav.h" +#include "src/display/lv_display.h" + +#include "src/font/lv_font.h" +#include "src/font/binfont_loader/lv_binfont_loader.h" +#include "src/font/fmt_txt/lv_font_fmt_txt.h" +#include "src/font/imgfont/lv_imgfont.h" +#include "src/font/font_manager/lv_font_manager.h" + +#include "src/widgets/animimage/lv_animimage.h" +#include "src/widgets/arc/lv_arc.h" +#include "src/widgets/arclabel/lv_arclabel.h" +#include "src/widgets/bar/lv_bar.h" +#include "src/widgets/button/lv_button.h" +#include "src/widgets/buttonmatrix/lv_buttonmatrix.h" +#include "src/widgets/calendar/lv_calendar.h" +#include "src/widgets/canvas/lv_canvas.h" +#include "src/widgets/chart/lv_chart.h" +#include "src/widgets/checkbox/lv_checkbox.h" +#include "src/widgets/dropdown/lv_dropdown.h" +#include "src/widgets/gif/lv_gif.h" +#include "src/widgets/image/lv_image.h" +#include "src/widgets/imagebutton/lv_imagebutton.h" +#include "src/widgets/keyboard/lv_keyboard.h" +#include "src/widgets/label/lv_label.h" +#include "src/widgets/led/lv_led.h" +#include "src/widgets/line/lv_line.h" +#include "src/widgets/list/lv_list.h" +#include "src/widgets/lottie/lv_lottie.h" +#include "src/widgets/menu/lv_menu.h" +#include "src/widgets/msgbox/lv_msgbox.h" +#include "src/widgets/roller/lv_roller.h" +#include "src/widgets/scale/lv_scale.h" +#include "src/widgets/slider/lv_slider.h" +#include "src/widgets/span/lv_span.h" +#include "src/widgets/spinbox/lv_spinbox.h" +#include "src/widgets/spinner/lv_spinner.h" +#include "src/widgets/switch/lv_switch.h" +#include "src/widgets/table/lv_table.h" +#include "src/widgets/tabview/lv_tabview.h" +#include "src/widgets/textarea/lv_textarea.h" +#include "src/widgets/tileview/lv_tileview.h" +#include "src/widgets/win/lv_win.h" +#include "src/widgets/3dtexture/lv_3dtexture.h" +#include "src/widgets/ime/lv_ime_pinyin.h" + +#include "src/debugging/sysmon/lv_sysmon.h" +#include "src/debugging/monkey/lv_monkey.h" +#include "src/debugging/test/lv_test.h" + +#include "src/others/fragment/lv_fragment.h" +#include "src/others/file_explorer/lv_file_explorer.h" +#include "src/others/translation/lv_translation.h" + +#include "src/libs/barcode/lv_barcode.h" +#include "src/libs/bin_decoder/lv_bin_decoder.h" +#include "src/libs/bmp/lv_bmp.h" +#include "src/libs/rle/lv_rle.h" +#include "src/libs/fsdrv/lv_fsdrv.h" +#include "src/libs/lodepng/lv_lodepng.h" +#include "src/libs/libpng/lv_libpng.h" +#include "src/libs/libwebp/lv_libwebp.h" +#include "src/libs/gltf/gltf_data/lv_gltf_model.h" +#include "src/libs/gltf/gltf_view/lv_gltf.h" +#include "src/libs/gstreamer/lv_gstreamer.h" +#include "src/libs/qrcode/lv_qrcode.h" +#include "src/libs/tjpgd/lv_tjpgd.h" +#include "src/libs/libjpeg_turbo/lv_libjpeg_turbo.h" +#include "src/libs/freetype/lv_freetype.h" +#include "src/libs/rlottie/lv_rlottie.h" +#include "src/libs/ffmpeg/lv_ffmpeg.h" +#include "src/libs/tiny_ttf/lv_tiny_ttf.h" +#include "src/libs/svg/lv_svg.h" +#include "src/libs/svg/lv_svg_render.h" + +#include "src/layouts/lv_layout.h" + +#include "src/draw/lv_draw_buf.h" +#include "src/draw/lv_draw_vector.h" +#include "src/draw/sw/lv_draw_sw_utils.h" +#include "src/draw/eve/lv_draw_eve_target.h" +#include "src/draw/snapshot/lv_snapshot.h" + +#include "src/themes/lv_theme.h" + +#include "src/drivers/lv_drivers.h" + +/* Define LV_DISABLE_API_MAPPING using a compiler option + * to make sure your application is not using deprecated names */ +#ifndef LV_DISABLE_API_MAPPING +#include "src/lv_api_map_v8.h" +#include "src/lv_api_map_v9_0.h" +#include "src/lv_api_map_v9_1.h" +#include "src/lv_api_map_v9_2.h" +#include "src/lv_api_map_v9_3.h" +#include "src/lv_api_map_v9_4.h" +#endif /*LV_DISABLE_API_MAPPING*/ + +#if LV_USE_PRIVATE_API +#include "src/lvgl_private.h" +#endif + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/** Gives 1 if the x.y.z version is supported in the current version + * Usage: + * + * - Require v6 + * #if LV_VERSION_CHECK(6,0,0) + * new_func_in_v6(); + * #endif + * + * + * - Require at least v5.3 + * #if LV_VERSION_CHECK(5,3,0) + * new_feature_from_v5_3(); + * #endif + * + * + * - Require v5.3.2 bugfixes + * #if LV_VERSION_CHECK(5,3,2) + * bugfix_in_v5_3_2(); + * #endif + * + */ +#define LV_VERSION_CHECK(x,y,z) (x == LVGL_VERSION_MAJOR && (y < LVGL_VERSION_MINOR || (y == LVGL_VERSION_MINOR && z <= LVGL_VERSION_PATCH))) + +/** + * Wrapper functions for VERSION macros + */ + +static inline int lv_version_major(void) +{ + return LVGL_VERSION_MAJOR; +} + +static inline int lv_version_minor(void) +{ + return LVGL_VERSION_MINOR; +} + +static inline int lv_version_patch(void) +{ + return LVGL_VERSION_PATCH; +} + +static inline const char * lv_version_info(void) +{ + return LVGL_VERSION_INFO; +} + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LVGL_H*/ diff --git a/inc/lvgl/lvgl_private.h b/inc/lvgl/lvgl_private.h new file mode 100644 index 0000000..c089581 --- /dev/null +++ b/inc/lvgl/lvgl_private.h @@ -0,0 +1,132 @@ +/** + * @file lvgl_private.h + * + */ + +#ifndef LVGL_PRIVATE_H +#define LVGL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "src/core/lv_global.h" + +#include "src/display/lv_display_private.h" +#include "src/indev/lv_indev_private.h" +#include "src/misc/lv_text_private.h" +#include "src/misc/cache/lv_cache.h" +#include "src/misc/cache/lv_cache_entry_private.h" +#include "src/misc/cache/lv_cache_private.h" +#include "src/layouts/lv_layout_private.h" +#include "src/stdlib/lv_mem_private.h" +#include "src/others/file_explorer/lv_file_explorer_private.h" +#include "src/others/fragment/lv_fragment_private.h" +#include "src/others/translation/lv_translation_private.h" +#include "src/libs/qrcode/lv_qrcode_private.h" +#include "src/libs/barcode/lv_barcode_private.h" +#include "src/draw/lv_draw_triangle_private.h" +#include "src/draw/lv_draw_private.h" +#include "src/draw/lv_draw_rect_private.h" +#include "src/draw/lv_draw_image_private.h" +#include "src/draw/lv_image_decoder_private.h" +#include "src/draw/lv_draw_label_private.h" +#include "src/draw/lv_draw_vector_private.h" +#include "src/draw/lv_draw_buf_private.h" +#include "src/draw/sw/lv_draw_sw_private.h" +#include "src/draw/sw/lv_draw_sw_mask_private.h" +#include "src/draw/sw/blend/lv_draw_sw_blend_private.h" +#include "src/drivers/libinput/lv_xkb_private.h" +#include "src/drivers/libinput/lv_libinput_private.h" +#include "src/drivers/evdev/lv_evdev_private.h" +#include "src/themes/lv_theme_private.h" +#include "src/core/lv_refr_private.h" +#include "src/core/lv_obj_style_private.h" +#include "src/core/lv_obj_private.h" +#include "src/core/lv_obj_scroll_private.h" +#include "src/core/lv_obj_draw_private.h" +#include "src/core/lv_obj_class_private.h" +#include "src/core/lv_group_private.h" +#include "src/core/lv_obj_event_private.h" +#include "src/core/lv_observer_private.h" + +#include "src/debugging/sysmon/lv_sysmon_private.h" +#include "src/debugging/monkey/lv_monkey_private.h" + +#include "src/font/fmt_txt/lv_font_fmt_txt_private.h" + +#include "src/misc/lv_timer_private.h" +#include "src/misc/lv_area_private.h" +#include "src/misc/lv_fs_private.h" +#include "src/misc/lv_profiler_builtin_private.h" +#include "src/misc/lv_event_private.h" +#include "src/misc/lv_bidi_private.h" +#include "src/misc/lv_rb_private.h" +#include "src/misc/lv_style_private.h" +#include "src/misc/lv_color_op_private.h" +#include "src/misc/lv_anim_private.h" +#include "src/misc/lv_anim_timeline_private.h" + +#include "src/widgets/msgbox/lv_msgbox_private.h" +#include "src/widgets/buttonmatrix/lv_buttonmatrix_private.h" +#include "src/widgets/slider/lv_slider_private.h" +#include "src/widgets/switch/lv_switch_private.h" +#include "src/widgets/calendar/lv_calendar_private.h" +#include "src/widgets/imagebutton/lv_imagebutton_private.h" +#include "src/widgets/bar/lv_bar_private.h" +#include "src/widgets/image/lv_image_private.h" +#include "src/widgets/textarea/lv_textarea_private.h" +#include "src/widgets/table/lv_table_private.h" +#include "src/widgets/checkbox/lv_checkbox_private.h" +#include "src/widgets/roller/lv_roller_private.h" +#include "src/widgets/win/lv_win_private.h" +#include "src/widgets/keyboard/lv_keyboard_private.h" +#include "src/widgets/line/lv_line_private.h" +#include "src/widgets/animimage/lv_animimage_private.h" +#include "src/widgets/dropdown/lv_dropdown_private.h" +#include "src/widgets/menu/lv_menu_private.h" +#include "src/widgets/chart/lv_chart_private.h" +#include "src/widgets/button/lv_button_private.h" +#include "src/widgets/scale/lv_scale_private.h" +#include "src/widgets/led/lv_led_private.h" +#include "src/widgets/arc/lv_arc_private.h" +#include "src/widgets/tileview/lv_tileview_private.h" +#include "src/widgets/spinbox/lv_spinbox_private.h" +#include "src/widgets/span/lv_span_private.h" +#include "src/widgets/label/lv_label_private.h" +#include "src/widgets/canvas/lv_canvas_private.h" +#include "src/widgets/tabview/lv_tabview_private.h" +#include "src/widgets/3dtexture/lv_3dtexture_private.h" +#include "src/widgets/ime/lv_ime_pinyin_private.h" + +#include "src/tick/lv_tick_private.h" +#include "src/stdlib/builtin/lv_tlsf_private.h" +#include "src/libs/rlottie/lv_rlottie_private.h" +#include "src/libs/ffmpeg/lv_ffmpeg_private.h" +#include "src/widgets/lottie/lv_lottie_private.h" +#include "src/osal/lv_os_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LVGL_PRIVATE_H*/ diff --git a/inc/lvgl/src/core/lv_global.h b/inc/lvgl/src/core/lv_global.h new file mode 100644 index 0000000..769528a --- /dev/null +++ b/inc/lvgl/src/core/lv_global.h @@ -0,0 +1,312 @@ +/** + * @file lv_global.h + * + */ + +#ifndef LV_GLOBAL_H +#define LV_GLOBAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "../misc/lv_types.h" +#include "../draw/lv_draw.h" +#if LV_USE_DRAW_SW +#include "../draw/sw/lv_draw_sw.h" +#endif +#include "../misc/lv_anim.h" +#include "../misc/lv_area.h" +#include "../misc/lv_color_op.h" +#include "../misc/lv_ll.h" +#include "../misc/lv_log.h" +#include "../misc/lv_style.h" +#include "../misc/lv_timer.h" +#include "../osal/lv_os_private.h" +#include "../debugging/sysmon/lv_sysmon.h" +#include "../stdlib/builtin/lv_tlsf.h" + +#if LV_USE_FONT_COMPRESSED +#include "../font/fmt_txt/lv_font_fmt_txt_private.h" +#endif + +#include "../tick/lv_tick.h" +#include "../layouts/lv_layout.h" + +#include "../misc/lv_types.h" + +#include "../misc/lv_timer_private.h" +#include "../misc/lv_anim_private.h" +#include "../tick/lv_tick_private.h" +#include "../draw/lv_draw_buf_private.h" +#include "../draw/lv_draw_private.h" +#include "../draw/sw/lv_draw_sw_private.h" +#include "../draw/sw/lv_draw_sw_mask_private.h" +#include "../stdlib/builtin/lv_tlsf_private.h" +#include "../debugging/sysmon/lv_sysmon_private.h" +#include "../debugging/test/lv_test_private.h" +#include "../layouts/lv_layout_private.h" + +/********************* + * DEFINES + *********************/ +#define ZERO_MEM_SENTINEL 0xa1b2c3d4 + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_SPAN != 0 +struct _snippet_stack; +#endif + +#if LV_USE_FREETYPE +struct _lv_freetype_context_t; +#endif + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN +struct _lv_profiler_builtin_ctx_t; +#endif + +#if LV_USE_NUTTX +struct _lv_nuttx_ctx_t; +#endif + +typedef struct _lv_global_t { + /** + * User data for the LVGL library. Move from the bottom of the struct + * to avoid breaking the ABI. E.g., if the user data is used by a + * closed-source library, this can help to avoid re-compiling the library + * when the lvgl-related configs are changed. + */ + void * user_data; + + bool inited; + bool deinit_in_progress; /**< Can be used e.g. in the LV_EVENT_DELETE to deinit the drivers too */ + + lv_ll_t disp_ll; + lv_display_t * disp_refresh; + lv_display_t * disp_default; + + lv_ll_t style_trans_ll; + bool style_refresh; + uint32_t style_custom_table_size; + uint32_t style_last_custom_prop_id; + uint8_t * style_custom_prop_flag_lookup_table; + + lv_ll_t group_ll; + lv_group_t * group_default; + + lv_ll_t indev_ll; + lv_indev_t * indev_active; + lv_obj_t * indev_obj_active; + + uint32_t layout_count; + lv_layout_dsc_t * layout_list; + bool layout_update_mutex; + + uint32_t memory_zero; + uint32_t math_rand_seed; + + lv_event_t * event_header; + uint32_t event_last_register_id; + + lv_timer_state_t timer_state; + lv_anim_state_t anim_state; + lv_tick_state_t tick_state; + + lv_draw_buf_handlers_t draw_buf_handlers; + lv_draw_buf_handlers_t font_draw_buf_handlers; + lv_draw_buf_handlers_t image_cache_draw_buf_handlers; /**< Ensure that all assigned draw buffers + * can be managed by image cache. */ + + lv_ll_t img_decoder_ll; +#if LV_USE_OS != LV_OS_NONE + lv_mutex_t img_decoder_info_lock; + lv_mutex_t img_decoder_open_lock; +#endif + + lv_cache_t * img_cache; + lv_cache_t * img_header_cache; + + lv_draw_global_info_t draw_info; + lv_ll_t draw_sw_blend_handler_ll; +#if defined(LV_DRAW_SW_SHADOW_CACHE_SIZE) && LV_DRAW_SW_SHADOW_CACHE_SIZE > 0 + lv_draw_sw_shadow_cache_t sw_shadow_cache; +#endif +#if LV_DRAW_SW_COMPLEX + lv_draw_sw_mask_radius_circle_dsc_arr_t sw_circle_cache; +#endif + +#if LV_USE_LOG + lv_log_print_g_cb_t custom_log_print_cb; +#endif + +#if LV_USE_LOG && LV_LOG_USE_TIMESTAMP + uint32_t log_last_log_time; +#endif + +#if LV_USE_THEME_SIMPLE + void * theme_simple; +#endif + +#if LV_USE_THEME_DEFAULT + void * theme_default; +#endif + +#if LV_USE_THEME_MONO + void * theme_mono; +#endif + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + lv_tlsf_state_t tlsf_state; +#endif + + lv_ll_t fsdrv_ll; +#if LV_USE_FS_STDIO != '\0' + lv_fs_drv_t stdio_fs_drv; +#endif +#if LV_USE_FS_POSIX + lv_fs_drv_t posix_fs_drv; +#endif + +#if LV_USE_FS_FATFS + lv_fs_drv_t fatfs_fs_drv; +#endif + +#if LV_USE_FS_WIN32 != '\0' + lv_fs_drv_t win32_fs_drv; +#endif + +#if LV_USE_FS_UEFI + lv_fs_drv_t uefi_fs_drv; +#endif + +#if LV_USE_FS_LITTLEFS + lv_fs_drv_t littlefs_fs_drv; +#endif + +#if LV_USE_FS_ARDUINO_ESP_LITTLEFS + lv_fs_drv_t arduino_esp_littlefs_fs_drv; +#endif + +#if LV_USE_FS_ARDUINO_SD + lv_fs_drv_t arduino_sd_fs_drv; +#endif + +#if LV_USE_FS_FROGFS + lv_fs_drv_t frogfs_fs_drv; +#endif + +#if LV_USE_FREETYPE + struct _lv_freetype_context_t * ft_context; +#endif + +#if LV_USE_FONT_COMPRESSED + lv_font_fmt_rle_t font_fmt_rle; +#endif + +#if LV_USE_SPAN != 0 + struct _snippet_stack * span_snippet_stack; +#endif + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + struct _lv_profiler_builtin_ctx_t * profiler_context; +#endif + + +#if LV_USE_FILE_EXPLORER + lv_style_t file_explorer_quick_access_style; + size_t file_explorer_count; +#endif + +#if LV_USE_MEM_MONITOR + lv_sysmon_backend_data_t sysmon_mem; +#endif + +#if LV_USE_IME_PINYIN != 0 + size_t ime_cand_len; +#endif + +#if LV_USE_OBJ_ID_BUILTIN + void * objid_array; + uint32_t objid_count; +#endif + +#if LV_USE_TEST + lv_test_state_t test_state; +#endif + +#if LV_USE_TRANSLATION + lv_ll_t translation_packs_ll; + const char * translation_selected_lang; +#endif + +#if LV_USE_NUTTX + struct _lv_nuttx_ctx_t * nuttx_ctx; +#endif + +#if LV_USE_OS != LV_OS_NONE + lv_mutex_t lv_general_mutex; +#endif + +#if defined(__linux__) + lv_linux_proc_stat_t linux_last_proc_stat; +#if LV_SYSMON_PROC_IDLE_AVAILABLE + uint64_t linux_last_self_proc_time_ticks; + lv_linux_proc_stat_t linux_last_system_total_ticks_stat; +#endif +#endif + +#if LV_USE_OS == LV_OS_FREERTOS + uint32_t freertos_idle_time_sum; + uint32_t freertos_non_idle_time_sum; + uint32_t freertos_task_switch_timestamp; + bool freertos_idle_task_running; +#endif + +#if LV_USE_EVDEV + lv_evdev_discovery_t * evdev_discovery; +#endif + +#if LV_USE_DRAW_EVE + lv_draw_eve_unit_t * draw_eve_unit; +#endif +} lv_global_t; + +/********************** + * MACROS + **********************/ + +#if LV_ENABLE_GLOBAL_CUSTOM +#include LV_GLOBAL_CUSTOM_INCLUDE + +#ifndef LV_GLOBAL_CUSTOM +#define LV_GLOBAL_CUSTOM() lv_global_default() +#endif +#define LV_GLOBAL_DEFAULT() LV_GLOBAL_CUSTOM() +#else +LV_ATTRIBUTE_EXTERN_DATA extern lv_global_t lv_global; +#define LV_GLOBAL_DEFAULT() (&lv_global) +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ +#if LV_ENABLE_GLOBAL_CUSTOM +/** + * Get the default global object for current thread + * @return pointer to the default global object + */ +lv_global_t * lv_global_default(void); +#endif +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GLOBAL_H*/ diff --git a/inc/lvgl/src/core/lv_group.c b/inc/lvgl/src/core/lv_group.c new file mode 100644 index 0000000..a585469 --- /dev/null +++ b/inc/lvgl/src/core/lv_group.c @@ -0,0 +1,566 @@ +/** + * @file lv_group.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_group_private.h" +#include "../core/lv_obj_private.h" +#include "../core/lv_global.h" +#include "../indev/lv_indev.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ +#define default_group LV_GLOBAL_DEFAULT()->group_default +#define group_ll_p &(LV_GLOBAL_DEFAULT()->group_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), + void * (*move)(const lv_ll_t *, const void *)); +static void lv_group_refocus(lv_group_t * g); +static lv_indev_t * get_indev(const lv_group_t * g); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_group_init(void) +{ + lv_ll_init(group_ll_p, sizeof(lv_group_t)); +} + +void lv_group_deinit(void) +{ + lv_ll_clear(group_ll_p); +} + +lv_group_t * lv_group_create(void) +{ + lv_group_t * group = lv_ll_ins_head(group_ll_p); + LV_ASSERT_MALLOC(group); + if(group == NULL) return NULL; + lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); + + group->obj_focus = NULL; + group->frozen = 0; + group->focus_cb = NULL; + group->edge_cb = NULL; + group->editing = 0; + group->refocus_policy = LV_GROUP_REFOCUS_POLICY_PREV; + group->wrap = 1; + group->user_data = NULL; +#if LV_USE_EXT_DATA + group->ext_data.free_cb = NULL; + group->ext_data.data = NULL; +#endif + + return group; +} + +void lv_group_delete(lv_group_t * group) +{ + /*Defocus the currently focused object*/ + LV_ASSERT_NULL(group); + if(group->obj_focus != NULL) { + lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); + lv_obj_invalidate(*group->obj_focus); + } + + /*Remove the objects from the group*/ + lv_obj_t ** obj; + LV_LL_READ(&group->obj_ll, obj) { + if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; + } + + /*Remove the group from any indev devices */ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_group(indev) == group) { + lv_indev_set_group(indev, NULL); + } + indev = lv_indev_get_next(indev); + } + + /*If the group is the default group, set the default group as NULL*/ + if(group == lv_group_get_default()) lv_group_set_default(NULL); + + lv_ll_clear(&(group->obj_ll)); + lv_ll_remove(group_ll_p, group); +#if LV_USE_EXT_DATA + if(group->ext_data.free_cb) { + group->ext_data.free_cb(group->ext_data.data); + group->ext_data.data = NULL; + } +#endif + lv_free(group); +} + +void lv_group_set_default(lv_group_t * group) +{ + default_group = group; +} + +lv_group_t * lv_group_get_default(void) +{ + return default_group; +} + +void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) +{ + if(group == NULL) return; + + LV_LOG_TRACE("begin"); + + /*Be sure the object is removed from its current group*/ + lv_group_remove_obj(obj); + + if(obj->spec_attr == NULL) lv_obj_allocate_spec_attr(obj); + obj->spec_attr->group_p = group; + + lv_obj_t ** next = lv_ll_ins_tail(&group->obj_ll); + LV_ASSERT_MALLOC(next); + if(next == NULL) return; + *next = obj; + + /*If the head and the tail is equal then there is only one object in the linked list. + *In this case automatically activate it*/ + if(lv_ll_get_head(&group->obj_ll) == next) { + lv_group_refocus(group); + } + + LV_LOG_TRACE("finished"); +} + +void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2) +{ + lv_group_t * g1 = lv_obj_get_group(obj1); + lv_group_t * g2 = lv_obj_get_group(obj2); + if(g1 != g2) return; + if(g1 == NULL) return; + + /*Do not add the object twice*/ + lv_obj_t ** obj_i; + LV_LL_READ(&g1->obj_ll, obj_i) { + if((*obj_i) == obj1)(*obj_i) = obj2; + else if((*obj_i) == obj2)(*obj_i) = obj1; + } + + lv_obj_t * focused = lv_group_get_focused(g1); + if(focused == obj1) lv_group_focus_obj(obj2); + else if(focused == obj2) lv_group_focus_obj(obj1); + +} + +void lv_group_remove_obj(lv_obj_t * obj) +{ + lv_group_t * g = lv_obj_get_group(obj); + if(g == NULL) return; + + LV_LOG_TRACE("begin"); + + /*Focus on the next object*/ + if(g->obj_focus && *g->obj_focus == obj) { + if(g->frozen) g->frozen = 0; + + /*If this is the only object in the group then focus to nothing.*/ + if(lv_ll_get_head(&g->obj_ll) == g->obj_focus && lv_ll_get_tail(&g->obj_ll) == g->obj_focus) { + lv_obj_send_event(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); + } + /*If there more objects in the group then focus to the next/prev object*/ + else { + lv_group_refocus(g); + } + } + + /*If the focuses object is still the same then it was the only object in the group but it will + *be deleted. Set the `obj_focus` to NULL to get back to the initial state of the group with + *zero objects*/ + if(g->obj_focus && *g->obj_focus == obj) { + g->obj_focus = NULL; + } + + /*Search the object and remove it from its group*/ + lv_obj_t ** i; + LV_LL_READ(&g->obj_ll, i) { + if(*i == obj) { + lv_ll_remove(&g->obj_ll, i); + lv_free(i); + if(obj->spec_attr) obj->spec_attr->group_p = NULL; + break; + } + } + LV_LOG_TRACE("finished"); +} + +void lv_group_remove_all_objs(lv_group_t * group) +{ + LV_ASSERT_NULL(group); + + /*Defocus the currently focused object*/ + if(group->obj_focus != NULL) { + lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); + lv_obj_invalidate(*group->obj_focus); + group->obj_focus = NULL; + } + + /*Remove the objects from the group*/ + lv_obj_t ** obj; + LV_LL_READ(&group->obj_ll, obj) { + if((*obj)->spec_attr)(*obj)->spec_attr->group_p = NULL; + } + + lv_ll_clear(&(group->obj_ll)); +} + +void lv_group_focus_obj(lv_obj_t * obj) +{ + if(obj == NULL) return; + lv_group_t * g = lv_obj_get_group(obj); + if(g == NULL) return; + + if(g->frozen != 0) return; + + /*On defocus edit mode must be leaved*/ + lv_group_set_editing(g, false); + + lv_obj_t ** i; + LV_LL_READ(&g->obj_ll, i) { + if(*i == obj) { + if(g->obj_focus != NULL && obj != *g->obj_focus) { /*Do not defocus if the same object needs to be focused again*/ + lv_result_t res = lv_obj_send_event(*g->obj_focus, LV_EVENT_DEFOCUSED, get_indev(g)); + if(res != LV_RESULT_OK) return; + lv_obj_invalidate(*g->obj_focus); + } + + g->obj_focus = i; + + if(g->obj_focus != NULL) { + if(g->focus_cb) g->focus_cb(g); + lv_result_t res = lv_obj_send_event(*g->obj_focus, LV_EVENT_FOCUSED, get_indev(g)); + if(res != LV_RESULT_OK) return; + lv_obj_invalidate(*g->obj_focus); + } + break; + } + } +} + +void lv_group_focus_next(lv_group_t * group) +{ + LV_ASSERT_NULL(group); + + bool focus_changed = focus_next_core(group, lv_ll_get_head, lv_ll_get_next); + if(group->edge_cb) { + if(!focus_changed) + group->edge_cb(group, true); + } +} + +void lv_group_focus_prev(lv_group_t * group) +{ + LV_ASSERT_NULL(group); + + bool focus_changed = focus_next_core(group, lv_ll_get_tail, lv_ll_get_prev); + if(group->edge_cb) { + if(!focus_changed) + group->edge_cb(group, false); + } +} + +void lv_group_focus_freeze(lv_group_t * group, bool en) +{ + LV_ASSERT_NULL(group); + + if(en == false) group->frozen = 0; + else group->frozen = 1; +} + +lv_result_t lv_group_send_data(lv_group_t * group, uint32_t c) +{ + LV_ASSERT_NULL(group); + + lv_obj_t * act = lv_group_get_focused(group); + if(act == NULL) return LV_RESULT_OK; + + if(lv_obj_has_state(act, LV_STATE_DISABLED)) return LV_RESULT_OK; + + return lv_obj_send_event(act, LV_EVENT_KEY, &c); +} + +void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb) +{ + if(group == NULL) return; + + group->focus_cb = focus_cb; +} + +void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb) +{ + LV_ASSERT_NULL(group); + + group->edge_cb = edge_cb; +} + +void lv_group_set_editing(lv_group_t * group, bool edit) +{ + LV_ASSERT_NULL(group); + uint8_t en_val = edit ? 1 : 0; + + if(en_val == group->editing) return; /*Do not set the same mode again*/ + + group->editing = en_val; + lv_obj_t * focused = lv_group_get_focused(group); + + if(focused) { + lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); + if(res != LV_RESULT_OK) return; + + lv_obj_invalidate(focused); + } +} + +void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy) +{ + LV_ASSERT_NULL(group); + group->refocus_policy = policy & 0x01; +} + +void lv_group_set_wrap(lv_group_t * group, bool en) +{ + LV_ASSERT_NULL(group); + group->wrap = en ? 1 : 0; +} + +lv_obj_t * lv_group_get_focused(const lv_group_t * group) +{ + if(!group) return NULL; + if(group->obj_focus == NULL) return NULL; + + return *group->obj_focus; +} + +lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group) +{ + if(!group) return NULL; + return group->focus_cb; +} + +lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group) +{ + if(!group) return NULL; + return group->edge_cb; +} + +bool lv_group_get_editing(const lv_group_t * group) +{ + if(!group) return false; + return group->editing; +} + +bool lv_group_get_wrap(lv_group_t * group) +{ + if(!group) return false; + return group->wrap; +} + +uint32_t lv_group_get_obj_count(lv_group_t * group) +{ + LV_ASSERT_NULL(group); + return lv_ll_get_len(&group->obj_ll); +} + +lv_obj_t * lv_group_get_obj_by_index(lv_group_t * group, uint32_t index) +{ + uint32_t len = 0; + lv_obj_t ** obj; + + LV_LL_READ(&group->obj_ll, obj) { + if(len == index) { + return *obj; + } + len++; + } + return NULL; +} + +uint32_t lv_group_get_count(void) +{ + return lv_ll_get_len(group_ll_p); +} + +lv_group_t * lv_group_by_index(uint32_t index) +{ + uint32_t len = 0; + lv_group_t * group; + + LV_LL_READ_BACK(group_ll_p, group) { + if(len == index) { + return group; + } + len++; + } + + return NULL; +} + +#if LV_USE_EXT_DATA +void lv_group_set_external_data(lv_group_t * group, void * data, void (* free_cb)(void * data)) +{ + if(!group) { + LV_LOG_WARN("Can't attach external user data and destructor callback to a NULL group"); + return; + } + + group->ext_data.data = data; + group->ext_data.free_cb = free_cb; +} +#endif + +void lv_group_set_user_data(lv_group_t * group, void * user_data) +{ + if(group == NULL) return; + group->user_data = user_data; +} + +void * lv_group_get_user_data(const lv_group_t * group) +{ + if(group == NULL) return NULL; + return group->user_data; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_group_refocus(lv_group_t * g) +{ + /*Refocus must temporarily allow wrapping to work correctly*/ + uint8_t temp_wrap = g->wrap; + g->wrap = 1; + + if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_NEXT) + lv_group_focus_next(g); + else if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_PREV) + lv_group_focus_prev(g); + /*Restore wrap property*/ + g->wrap = temp_wrap; +} + +static bool focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), + void * (*move)(const lv_ll_t *, const void *)) +{ + bool focus_changed = false; + if(group->frozen) return focus_changed; + + lv_obj_t ** obj_next = group->obj_focus; + lv_obj_t ** obj_sentinel = NULL; + bool can_move = true; + bool can_begin = true; + + for(;;) { + if(obj_next == NULL) { + if(group->wrap || obj_sentinel == NULL) { + if(!can_begin) return focus_changed; + obj_next = begin(&group->obj_ll); + can_move = false; + can_begin = false; + } + else { + /*Currently focused object is the last/first in the group, keep it that way*/ + return focus_changed; + } + } + + if(obj_sentinel == NULL) { + obj_sentinel = obj_next; + if(obj_sentinel == NULL) return focus_changed; /*Group is empty*/ + } + + if(can_move) { + obj_next = move(&group->obj_ll, obj_next); + + /*Give up if we walked the entire list and haven't found another visible object*/ + if(obj_next == obj_sentinel) return focus_changed; + } + + can_move = true; + + if(obj_next == NULL) continue; + if(lv_obj_get_state(*obj_next) & LV_STATE_DISABLED) continue; + + /*Hidden objects don't receive focus. + *If any parent is hidden, the object is also hidden)*/ + lv_obj_t * parent = *obj_next; + while(parent) { + if(lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) break; + parent = lv_obj_get_parent(parent); + } + + if(parent && lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) continue; + + /*If we got her a good candidate is found*/ + break; + } + + if(obj_next == group->obj_focus) return focus_changed; /*There's only one visible object and it's already focused*/ + + if(group->obj_focus) { + lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group)); + if(res != LV_RESULT_OK) return focus_changed; + lv_obj_invalidate(*group->obj_focus); + } + + group->obj_focus = obj_next; + + lv_result_t res = lv_obj_send_event(*group->obj_focus, LV_EVENT_FOCUSED, get_indev(group)); + if(res != LV_RESULT_OK) return focus_changed; + + lv_obj_invalidate(*group->obj_focus); + + if(group->focus_cb) group->focus_cb(group); + focus_changed = true; + return focus_changed; +} + +/** + * Find an indev preferably with POINTER type (because it's the most generic) that uses the given group. + * In other words, find an indev, that is related to the given group. + * In the worst case simply return the latest indev + * @param g a group the find in the indevs + * @return the suggested indev + */ +static lv_indev_t * get_indev(const lv_group_t * g) +{ + lv_indev_t * indev_guess = NULL; + lv_indev_t * indev = lv_indev_get_next(NULL); + + while(indev) { + lv_indev_type_t indev_type = lv_indev_get_type(indev); + /*Prefer POINTER*/ + if(indev_type == LV_INDEV_TYPE_POINTER) return indev; + if(lv_indev_get_group(indev) == g) { + indev_guess = indev; + } + indev = lv_indev_get_next(indev); + } + + return indev_guess; +} diff --git a/inc/lvgl/src/core/lv_group.h b/inc/lvgl/src/core/lv_group.h new file mode 100644 index 0000000..0fe1a2f --- /dev/null +++ b/inc/lvgl/src/core/lv_group.h @@ -0,0 +1,278 @@ +/** + * @file lv_group.h + * + */ + +#ifndef LV_GROUP_H +#define LV_GROUP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "../misc/lv_types.h" +#include "../misc/lv_ll.h" + +/********************* + * DEFINES + *********************/ +/** Predefined keys to control which Widget has focus via lv_group_send(group, c) */ +typedef enum { + LV_KEY_UP = 17, /*0x11*/ + LV_KEY_DOWN = 18, /*0x12*/ + LV_KEY_RIGHT = 19, /*0x13*/ + LV_KEY_LEFT = 20, /*0x14*/ + LV_KEY_ESC = 27, /*0x1B*/ + LV_KEY_DEL = 127, /*0x7F*/ + LV_KEY_BACKSPACE = 8, /*0x08*/ + LV_KEY_ENTER = 10, /*0x0A, '\n'*/ + LV_KEY_NEXT = 9, /*0x09, '\t'*/ + LV_KEY_PREV = 11, /*0x0B, '*/ + LV_KEY_HOME = 2, /*0x02, STX*/ + LV_KEY_END = 3, /*0x03, ETX*/ +} lv_key_t; + +/********************** + * TYPEDEFS + **********************/ + +typedef void (*lv_group_focus_cb_t)(lv_group_t *); +typedef void (*lv_group_edge_cb_t)(lv_group_t *, bool); + +typedef enum { + LV_GROUP_REFOCUS_POLICY_NEXT = 0, + LV_GROUP_REFOCUS_POLICY_PREV = 1 +} lv_group_refocus_policy_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create new Widget group. + * @return pointer to the new Widget group + */ +lv_group_t * lv_group_create(void); + +/** + * Delete group object. + * @param group pointer to a group + */ +void lv_group_delete(lv_group_t * group); + +/** + * Set default group. New Widgets will be added to this group if it's enabled in + * their class with `add_to_def_group = true`. + * @param group pointer to a group (can be `NULL`) + */ +void lv_group_set_default(lv_group_t * group); + +/** + * Get default group. + * @return pointer to the default group + */ +lv_group_t * lv_group_get_default(void); + +/** + * Add an Widget to group. + * @param group pointer to a group + * @param obj pointer to a Widget to add + */ +void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj); + +/** + * Swap 2 Widgets in group. Widgets must be in the same group. + * @param obj1 pointer to a Widget + * @param obj2 pointer to another Widget + */ +void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2); + +/** + * Remove a Widget from its group. + * @param obj pointer to Widget to remove + */ +void lv_group_remove_obj(lv_obj_t * obj); + +/** + * Remove all Widgets from a group. + * @param group pointer to a group + */ +void lv_group_remove_all_objs(lv_group_t * group); + +/** + * Focus on a Widget (defocus the current). + * @param obj pointer to Widget to focus on + */ +void lv_group_focus_obj(lv_obj_t * obj); + +/** + * Focus on next Widget in a group (defocus the current). + * @param group pointer to a group + */ +void lv_group_focus_next(lv_group_t * group); + +/** + * Focus on previous Widget in a group (defocus the current). + * @param group pointer to a group + */ +void lv_group_focus_prev(lv_group_t * group); + +/** + * Do not allow changing focus from current Widget. + * @param group pointer to a group + * @param en true: freeze, false: release freezing (normal mode) + */ +void lv_group_focus_freeze(lv_group_t * group, bool en); + +/** + * Send a control character to Widget that has focus in a group. + * @param group pointer to a group + * @param c a character (use LV_KEY_.. to navigate) + * @return result of Widget with focus in group. + */ +lv_result_t lv_group_send_data(lv_group_t * group, uint32_t c); + +/** + * Set a function for a group which will be called when a new Widget has focus. + * @param group pointer to a group + * @param focus_cb the call back function or NULL if unused + */ +void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb); + +/** + * Set a function for a group which will be called when a focus edge is reached + * @param group pointer to a group + * @param edge_cb the call back function or NULL if unused + */ +void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb); + +/** + * Set whether the next or previous Widget in a group gets focus when Widget that has + * focus is deleted. + * @param group pointer to a group + * @param policy new refocus policy enum + */ +void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy); + +/** + * Manually set the current mode (edit or navigate). + * @param group pointer to group + * @param edit true: edit mode; false: navigate mode + */ +void lv_group_set_editing(lv_group_t * group, bool edit); + +/** + * Set whether moving focus to next/previous Widget will allow wrapping from + * first->last or last->first Widget. + * @param group pointer to group + * @param en true: wrapping enabled; false: wrapping disabled + */ +void lv_group_set_wrap(lv_group_t * group, bool en); + +/** + * Get Widget that has focus, or NULL if there isn't one. + * @param group pointer to a group + * @return pointer to Widget with focus + */ +lv_obj_t * lv_group_get_focused(const lv_group_t * group); + +/** + * Get focus callback function of a group. + * @param group pointer to a group + * @return the call back function or NULL if not set + */ +lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group); + +/** + * Get edge callback function of a group. + * @param group pointer to a group + * @return the call back function or NULL if not set + */ +lv_group_edge_cb_t lv_group_get_edge_cb(const lv_group_t * group); + +/** + * Get current mode (edit or navigate). + * @param group pointer to group + * @return true: edit mode; false: navigate mode + */ +bool lv_group_get_editing(const lv_group_t * group); + +/** + * Get whether moving focus to next/previous Widget will allow wrapping from + * first->last or last->first Widget. + * @param group pointer to group + */ +bool lv_group_get_wrap(lv_group_t * group); + +/** + * Get number of Widgets in group. + * @param group pointer to a group + * @return number of Widgets in the group + */ +uint32_t lv_group_get_obj_count(lv_group_t * group); + +/** + * Get nth Widget within group. + * @param group pointer to a group + * @param index index of Widget within the group + * @return pointer to Widget + */ +lv_obj_t * lv_group_get_obj_by_index(lv_group_t * group, uint32_t index); + +/** + * Get the number of groups. + * @return number of groups + */ +uint32_t lv_group_get_count(void); + +/** + * Get a group by its index. + * @param index index of the group + * @return pointer to the group + */ +lv_group_t * lv_group_by_index(uint32_t index); + +#if LV_USE_EXT_DATA +/** + * @brief Attaches external user data and destructor callback to a group + * + * Associates custom user data with an LVGL group and specifies a destructor function + * that will be automatically invoked when the group is deleted to properly clean up + * the associated resources. + * + * @param group Pointer to a group + * @param data User-defined data pointer to associate with a group + * @param free_cb Callback function for cleaning up ext_data when group is deleted. + * Receives ext_data as parameter. NULL means no cleanup required. + */ +void lv_group_set_external_data(lv_group_t * group, void * data, void (* free_cb)(void * data)); +#endif + +/** + * Set user data to the group + * @param group pointer to a group + * @param user_data pointer to user data + */ +void lv_group_set_user_data(lv_group_t * group, void * user_data); + +/** + * Get a pointer to the user data of the group + * @param indev pointer to a group + * @return pointer to the user data or NULL if group is NULL + */ +void * lv_group_get_user_data(const lv_group_t * group); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GROUP_H*/ diff --git a/inc/lvgl/src/core/lv_group_private.h b/inc/lvgl/src/core/lv_group_private.h new file mode 100644 index 0000000..77ed90e --- /dev/null +++ b/inc/lvgl/src/core/lv_group_private.h @@ -0,0 +1,78 @@ +/** + * @file lv_group_private.h + * + */ + +#ifndef LV_GROUP_PRIVATE_H +#define LV_GROUP_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_ext_data.h" +#include "lv_group.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Groups can be used to logically hold objects so that they can be individually focused. + * They are NOT for laying out objects on a screen (try layouts for that). + */ +struct _lv_group_t { +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif + lv_ll_t obj_ll; /**< Linked list to store the objects in the group*/ + lv_obj_t ** obj_focus; /**< The object in focus*/ + + lv_group_focus_cb_t focus_cb; /**< A function to call when a new object is focused (optional)*/ + lv_group_edge_cb_t edge_cb; /**< A function to call when an edge is reached, no more focus + targets are available in this direction (to allow edge feedback + like a sound or a scroll bounce) */ + + void * user_data; + + uint8_t frozen : 1; /**< 1: can't focus to new object*/ + uint8_t editing : 1; /**< 1: Edit mode, 0: Navigate mode*/ + uint8_t refocus_policy : 1; /**< 1: Focus prev if focused on deletion. 0: Focus next if focused on + deletion.*/ + uint8_t wrap : 1; /**< 1: Focus next/prev can wrap at end of list. 0: Focus next/prev stops at end + of list.*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init the group module + * @remarks Internal function, do not call directly. + */ +void lv_group_init(void); + +/** + * Deinit the group module + * @remarks Internal function, do not call directly. + */ +void lv_group_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GROUP_PRIVATE_H*/ diff --git a/inc/lvgl/src/core/lv_obj.c b/inc/lvgl/src/core/lv_obj.c new file mode 100644 index 0000000..3ba67b9 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj.c @@ -0,0 +1,1342 @@ +/** + * @file lv_obj.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_private.h" +#include "../misc/lv_event_private.h" +#include "../misc/lv_area_private.h" +#include "lv_obj_style_private.h" +#include "lv_obj_event_private.h" +#include "lv_obj_class_private.h" +#include "../indev/lv_indev.h" +#include "../indev/lv_indev_private.h" +#include "lv_refr.h" +#include "lv_group.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../themes/lv_theme.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_math.h" +#include "../misc/lv_log.h" +#include "../misc/lv_types.h" +#include "../misc/lv_anim_timeline.h" +#include "../tick/lv_tick.h" +#include "../stdlib/lv_string.h" +#include "lv_obj_draw_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#define LV_OBJ_DEF_WIDTH (LV_DPX(100)) +#define LV_OBJ_DEF_HEIGHT (LV_DPX(50)) +#define STYLE_TRANSITION_MAX 32 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_screen_load_anim_t anim_type; + uint32_t duration; + uint32_t delay; + union { + lv_obj_t * screen; + lv_screen_create_cb_t create_cb; + } target; +} screen_load_anim_dsc_t; + +typedef struct { + lv_anim_timeline_t * at; + uint32_t delay; + bool reverse; +} timeline_play_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_obj_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_obj_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_obj_draw(lv_event_t * e); +static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_scrollbar(lv_obj_t * obj, lv_layer_t * layer); +static lv_result_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc); +static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find); +static void update_obj_state(lv_obj_t * obj, lv_state_t new_state); +static void lv_obj_children_add_state(lv_obj_t * obj, lv_state_t state); +static void lv_obj_children_remove_state(lv_obj_t * obj, lv_state_t state); +static void null_on_delete_cb(lv_event_t * e); +static void screen_load_on_trigger_event_cb(lv_event_t * e); +static void screen_create_on_trigger_event_cb(lv_event_t * e); +static void play_timeline_on_trigger_event_cb(lv_event_t * e); +static void delete_on_screen_unloaded_event_cb(lv_event_t * e); + +#if LV_USE_OBJ_PROPERTY + static lv_result_t lv_obj_set_any(lv_obj_t *, lv_prop_id_t, const lv_property_t *); + static lv_result_t lv_obj_get_any(const lv_obj_t *, lv_prop_id_t, lv_property_t *); + + static lv_point_t lv_obj_get_scroll_end_helper(lv_obj_t * obj); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_obj_properties[] = { + { + .id = LV_PROPERTY_OBJ_PARENT, + .setter = lv_obj_set_parent, + .getter = lv_obj_get_parent, + }, + { + .id = LV_PROPERTY_OBJ_X, + .setter = lv_obj_set_x, + .getter = lv_obj_get_x, + }, + { + .id = LV_PROPERTY_OBJ_Y, + .setter = lv_obj_set_y, + .getter = lv_obj_get_y, + }, + { + .id = LV_PROPERTY_OBJ_W, + .setter = lv_obj_set_width, + .getter = lv_obj_get_width, + }, + { + .id = LV_PROPERTY_OBJ_H, + .setter = lv_obj_set_height, + .getter = lv_obj_get_height, + }, + { + .id = LV_PROPERTY_OBJ_CONTENT_WIDTH, + .setter = lv_obj_set_content_width, + .getter = lv_obj_get_content_width, + }, + { + .id = LV_PROPERTY_OBJ_CONTENT_HEIGHT, + .setter = lv_obj_set_content_height, + .getter = lv_obj_get_content_height, + }, + { + .id = LV_PROPERTY_OBJ_LAYOUT, + .setter = lv_obj_set_layout, + }, + { + .id = LV_PROPERTY_OBJ_ALIGN, + .setter = lv_obj_set_align, + }, + { + .id = LV_PROPERTY_OBJ_SCROLLBAR_MODE, + .setter = lv_obj_set_scrollbar_mode, + .getter = lv_obj_get_scrollbar_mode, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_DIR, + .setter = lv_obj_set_scroll_dir, + .getter = lv_obj_get_scroll_dir, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_SNAP_X, + .setter = lv_obj_set_scroll_snap_x, + .getter = lv_obj_get_scroll_snap_x, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_SNAP_Y, + .setter = lv_obj_set_scroll_snap_y, + .getter = lv_obj_get_scroll_snap_y, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_X, + .getter = lv_obj_get_scroll_x, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_Y, + .getter = lv_obj_get_scroll_y, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_TOP, + .getter = lv_obj_get_scroll_top, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_BOTTOM, + .getter = lv_obj_get_scroll_bottom, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_LEFT, + .getter = lv_obj_get_scroll_left, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_RIGHT, + .getter = lv_obj_get_scroll_right, + }, + { + .id = LV_PROPERTY_OBJ_SCROLL_END, + .getter = lv_obj_get_scroll_end_helper, + }, + { + .id = LV_PROPERTY_OBJ_EXT_DRAW_SIZE, + .getter = lv_obj_get_ext_draw_size, + }, + { + .id = LV_PROPERTY_OBJ_EVENT_COUNT, + .getter = lv_obj_get_event_count, + }, + { + .id = LV_PROPERTY_OBJ_SCREEN, + .getter = lv_obj_get_screen, + }, + { + .id = LV_PROPERTY_OBJ_DISPLAY, + .getter = lv_obj_get_display, + }, + { + .id = LV_PROPERTY_OBJ_CHILD_COUNT, + .getter = lv_obj_get_child_count, + }, + { + .id = LV_PROPERTY_OBJ_INDEX, + .getter = lv_obj_get_index, + }, + { + .id = LV_PROPERTY_ID_ANY, + .setter = lv_obj_set_any, + .getter = lv_obj_get_any, + } +}; +#endif + +const lv_obj_class_t lv_obj_class = { + .constructor_cb = lv_obj_constructor, + .destructor_cb = lv_obj_destructor, + .event_cb = lv_obj_event, + .width_def = LV_DPI_DEF, + .height_def = LV_DPI_DEF, + .editable = LV_OBJ_CLASS_EDITABLE_FALSE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE, + .instance_size = (sizeof(lv_obj_t)), + .base_class = NULL, + .name = "lv_obj", + LV_PROPERTY_CLASS_FIELDS(obj, OBJ) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_obj_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + LV_ASSERT_NULL(obj); + if(obj == NULL) return NULL; + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +/*----------------- + * Attribute set + *----------------*/ + +void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(lv_obj_has_flag(obj, f)) /*Check if all flags are set*/ + return; + + bool was_on_layout = lv_obj_is_layout_positioned(obj); + + /* We must invalidate the area occupied by the object before we hide it as calls to invalidate hidden objects are ignored */ + if(f & LV_OBJ_FLAG_HIDDEN) lv_obj_invalidate(obj); + + obj->flags |= f; + + if(f & LV_OBJ_FLAG_HIDDEN) { + if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) { + lv_group_t * group = lv_obj_get_group(obj); + if(group != NULL) { + lv_group_focus_next(group); + lv_obj_t * next_obj = lv_group_get_focused(group); + if(next_obj != NULL) { + lv_obj_invalidate(next_obj); + } + } + } + } + + if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + lv_obj_mark_layout_as_dirty(obj); + } + + if(f & LV_OBJ_FLAG_SCROLLABLE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } +} + +void lv_obj_remove_flag(lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(!lv_obj_has_flag_any(obj, f)) + return; + + bool was_on_layout = lv_obj_is_layout_positioned(obj); + if(f & LV_OBJ_FLAG_SCROLLABLE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } + + obj->flags &= (~f); + + if(f & LV_OBJ_FLAG_HIDDEN) { + lv_obj_invalidate(obj); + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + lv_obj_mark_layout_as_dirty(obj); + } + + if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 | LV_OBJ_FLAG_LAYOUT_2))) { + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); + } + +} + +void lv_obj_set_flag(lv_obj_t * obj, lv_obj_flag_t f, bool v) +{ + if(v) lv_obj_add_flag(obj, f); + else lv_obj_remove_flag(obj, f); +} + +void lv_obj_add_state(lv_obj_t * obj, lv_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t new_state = obj->state | state; + if(obj->state != new_state) { + update_obj_state(obj, new_state); + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_STATE_TRICKLE)) { + lv_obj_children_add_state(obj, state); + } + } +} + +void lv_obj_remove_state(lv_obj_t * obj, lv_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t new_state = obj->state & (~state); + if(obj->state != new_state) { + update_obj_state(obj, new_state); + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_STATE_TRICKLE)) { + lv_obj_children_remove_state(obj, state); + } + } +} + +void lv_obj_set_state(lv_obj_t * obj, lv_state_t state, bool v) +{ + if(v) lv_obj_add_state(obj, state); + else lv_obj_remove_state(obj, state); +} + +void lv_obj_set_radio_button(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + obj->radio_button = en; +} + +/*======================= + * Getter functions + *======================*/ + +bool lv_obj_has_flag(const lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return (obj->flags & f) == f; +} + +bool lv_obj_has_flag_any(const lv_obj_t * obj, lv_obj_flag_t f) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return !!(obj->flags & f); +} + +lv_state_t lv_obj_get_state(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return obj->state; +} + +bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return !!(obj->state & state); +} + +bool lv_obj_is_radio_button(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return obj->radio_button; +} + +lv_group_t * lv_obj_get_group(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr) return obj->spec_attr->group_p; + else return NULL; +} + +/*------------------- + * OTHER FUNCTIONS + *------------------*/ + +void lv_obj_allocate_spec_attr(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) { + obj->spec_attr = lv_malloc_zeroed(sizeof(lv_obj_spec_attr_t)); + LV_ASSERT_MALLOC(obj->spec_attr); + if(obj->spec_attr == NULL) return; + + obj->spec_attr->scroll_dir = LV_DIR_ALL; + obj->spec_attr->scrollbar_mode = LV_SCROLLBAR_MODE_AUTO; + } +} + +bool lv_obj_check_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + if(obj == NULL) return false; + return obj->class_p == class_p; +} + +bool lv_obj_has_class(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + const lv_obj_class_t * obj_class = obj->class_p; + while(obj_class) { + if(obj_class == class_p) return true; + obj_class = obj_class->base_class; + } + + return false; +} + +const lv_obj_class_t * lv_obj_get_class(const lv_obj_t * obj) +{ + return obj->class_p; +} + +bool lv_obj_is_valid(const lv_obj_t * obj) +{ + lv_display_t * disp = lv_display_get_next(NULL); + while(disp) { + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + if(disp->screens[i] == obj) return true; + bool found = obj_valid_child(disp->screens[i], obj); + if(found) return true; + } + + disp = lv_display_get_next(disp); + } + + return false; +} + +void lv_obj_null_on_delete(lv_obj_t ** obj_ptr) +{ + lv_obj_add_event_cb(*obj_ptr, null_on_delete_cb, LV_EVENT_DELETE, obj_ptr); +} + +#if LV_USE_OBJ_ID +void * lv_obj_get_id(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + return obj->id; +} + +lv_obj_t * lv_obj_find_by_id(const lv_obj_t * obj, const void * id) +{ + LV_LOG_WARN("DEPRECATED: IDs are used only to print the widget trees. To find a widget use obj_name"); + + if(obj == NULL) obj = lv_display_get_screen_active(NULL); + if(obj == NULL) return NULL; + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_id_compare(child->id, id) == 0) return child; + } + + /*Search children*/ + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_t * found = lv_obj_find_by_id(child, id); + if(found != NULL) return found; + } + + return NULL; +} +#endif + +void lv_obj_add_screen_load_event(lv_obj_t * obj, lv_event_code_t trigger, lv_obj_t * screen, + lv_screen_load_anim_t anim_type, uint32_t duration, uint32_t delay) +{ + if(screen == NULL) { + LV_LOG_WARN("`screen` is NULL, can't load a non existing screens"); + return; + } + + screen_load_anim_dsc_t * dsc = lv_malloc(sizeof(screen_load_anim_dsc_t)); + LV_ASSERT_MALLOC(dsc); + lv_memzero(dsc, sizeof(screen_load_anim_dsc_t)); + dsc->anim_type = anim_type; + dsc->duration = duration; + dsc->delay = delay; + dsc->target.screen = screen; + + lv_obj_add_event_cb(obj, screen_load_on_trigger_event_cb, trigger, dsc); + lv_obj_add_event_cb(obj, lv_event_free_user_data_cb, LV_EVENT_DELETE, dsc); +} + +void lv_obj_add_screen_create_event(lv_obj_t * obj, lv_event_code_t trigger, lv_screen_create_cb_t screen_create_cb, + lv_screen_load_anim_t anim_type, uint32_t duration, uint32_t delay) +{ + screen_load_anim_dsc_t * dsc = lv_malloc(sizeof(screen_load_anim_dsc_t)); + LV_ASSERT_MALLOC(dsc); + lv_memzero(dsc, sizeof(screen_load_anim_dsc_t)); + dsc->anim_type = anim_type; + dsc->duration = duration; + dsc->delay = delay; + dsc->target.create_cb = screen_create_cb; + + lv_obj_add_event_cb(obj, screen_create_on_trigger_event_cb, trigger, dsc); + lv_obj_add_event_cb(obj, lv_event_free_user_data_cb, LV_EVENT_DELETE, dsc); +} + +void lv_obj_add_play_timeline_event(lv_obj_t * obj, lv_event_code_t trigger, lv_anim_timeline_t * at, uint32_t delay, + bool reverse) +{ + timeline_play_dsc_t * dsc = lv_malloc(sizeof(timeline_play_dsc_t)); + LV_ASSERT_MALLOC(dsc); + lv_memzero(dsc, sizeof(timeline_play_dsc_t)); + dsc->at = at; + dsc->delay = delay; + dsc->reverse = reverse; + + lv_obj_add_event_cb(obj, play_timeline_on_trigger_event_cb, trigger, dsc); + lv_obj_add_event_cb(obj, lv_event_free_user_data_cb, LV_EVENT_DELETE, dsc); +} + +void lv_obj_set_user_data(lv_obj_t * obj, void * user_data) +{ + obj->user_data = user_data; +} + +void * lv_obj_get_user_data(lv_obj_t * obj) +{ + return obj->user_data; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_obj_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_t * parent = obj->parent; + if(parent) { + int32_t sl = lv_obj_get_scroll_left(parent); + int32_t st = lv_obj_get_scroll_top(parent); + + obj->coords.y1 = parent->coords.y1 + lv_obj_get_style_pad_top(parent, LV_PART_MAIN) - st; + obj->coords.y2 = obj->coords.y1 - 1; + obj->coords.x1 = parent->coords.x1 + lv_obj_get_style_pad_left(parent, LV_PART_MAIN) - sl; + obj->coords.x2 = obj->coords.x1 - 1; + } + + /*Set attributes*/ + obj->flags = LV_OBJ_FLAG_CLICKABLE; + obj->flags |= LV_OBJ_FLAG_SNAPPABLE; + if(parent) obj->flags |= LV_OBJ_FLAG_PRESS_LOCK; + if(parent) obj->flags |= LV_OBJ_FLAG_SCROLL_CHAIN; + obj->flags |= LV_OBJ_FLAG_CLICK_FOCUSABLE; + obj->flags |= LV_OBJ_FLAG_SCROLLABLE; + obj->flags |= LV_OBJ_FLAG_SCROLL_ELASTIC; + obj->flags |= LV_OBJ_FLAG_SCROLL_MOMENTUM; + obj->flags |= LV_OBJ_FLAG_SCROLL_WITH_ARROW; + if(parent) obj->flags |= LV_OBJ_FLAG_GESTURE_BUBBLE; + +#if LV_OBJ_ID_AUTO_ASSIGN + lv_obj_assign_id(class_p, obj); +#endif + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_obj_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_event_mark_deleted(obj); + + /*Remove all style*/ + lv_obj_enable_style_refresh(false); /*No need to refresh the style because the object will be deleted*/ + lv_obj_remove_style_all(obj); + lv_obj_enable_style_refresh(true); + + /*Remove the animations from this object*/ + lv_anim_delete(obj, NULL); + + /*Delete from the group*/ + lv_group_t * group = lv_obj_get_group(obj); + if(group) lv_group_remove_obj(obj); + + if(obj->spec_attr) { + if(obj->spec_attr->children) { + lv_free(obj->spec_attr->children); + obj->spec_attr->children = NULL; + } + + lv_event_remove_all(&obj->spec_attr->event_list); +#if LV_USE_OBJ_NAME + if(obj->spec_attr->name && !obj->spec_attr->name_static) { + lv_free((void *)obj->spec_attr->name); + } +#endif + +#if LV_DRAW_TRANSFORM_USE_MATRIX + if(obj->spec_attr->matrix) { + lv_free(obj->spec_attr->matrix); + obj->spec_attr->matrix = NULL; + } +#endif + + lv_free(obj->spec_attr); + obj->spec_attr = NULL; + } + +#if LV_OBJ_ID_AUTO_ASSIGN + lv_obj_free_id(obj); +#endif +} + +static void lv_obj_draw(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res == LV_COVER_RES_MASKED) return; + if(lv_obj_get_style_clip_corner(obj, LV_PART_MAIN)) { + info->res = LV_COVER_RES_MASKED; + return; + } + + /*Most trivial test. Is the mask fully IN the object? If no it surely doesn't cover it*/ + int32_t r = lv_obj_get_style_radius(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + lv_area_increase(&coords, w, h); + + if(lv_area_is_in(info->area, &coords, r) == false) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(lv_obj_get_style_bg_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(lv_obj_get_style_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(lv_obj_get_style_bg_grad_dir(obj, LV_PART_MAIN) != LV_GRAD_DIR_NONE) { + if(lv_obj_get_style_bg_grad_opa(obj, LV_PART_MAIN) < LV_OPA_MAX || + lv_obj_get_style_bg_main_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + const lv_grad_dsc_t * grad_dsc = lv_obj_get_style_bg_grad(obj, LV_PART_MAIN); + if(grad_dsc) { + uint32_t i; + for(i = 0; i < grad_dsc->stops_count; i++) { + if(grad_dsc->stops[i].opa < LV_OPA_MAX) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + } + info->res = LV_COVER_RES_COVER; + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_layer_t * layer = lv_event_get_layer(e); + + lv_draw_rect_dsc_t draw_dsc; + lv_draw_rect_dsc_init(&draw_dsc); + draw_dsc.base.layer = layer; + + int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + lv_area_increase(&coords, w, h); + + bool backdrop_blur = lv_obj_get_style_blur_backdrop(obj, LV_PART_MAIN); + if(backdrop_blur) { + lv_draw_blur_dsc_t blur_dsc; + lv_draw_blur_dsc_init(&blur_dsc); + lv_obj_init_draw_blur_dsc(obj, LV_PART_MAIN, &blur_dsc); + blur_dsc.corner_radius = draw_dsc.radius; + blur_dsc.base.layer = layer; + lv_draw_blur(layer, &blur_dsc, &coords); + } + + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &draw_dsc); + /*If the border is drawn later disable loading its properties*/ + if(lv_obj_get_style_border_post(obj, LV_PART_MAIN)) { + draw_dsc.border_post = 1; + } + + + lv_draw_rect(layer, &draw_dsc, &coords); + } + else if(code == LV_EVENT_DRAW_MAIN_END) { + /*Draw the non backdrop blur when the main content is rendered the the children are not yet */ + lv_layer_t * layer = lv_event_get_layer(e); + bool backdrop_blur = lv_obj_get_style_blur_backdrop(obj, LV_PART_MAIN); + if(!backdrop_blur) { + int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + lv_area_increase(&coords, w, h); + + lv_draw_blur_dsc_t blur_dsc; + lv_draw_blur_dsc_init(&blur_dsc); + lv_obj_init_draw_blur_dsc(obj, LV_PART_MAIN, &blur_dsc); + blur_dsc.corner_radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); + blur_dsc.base.layer = layer; + lv_draw_blur(layer, &blur_dsc, &coords); + } + } + else if(code == LV_EVENT_DRAW_POST) { + lv_layer_t * layer = lv_event_get_layer(e); + draw_scrollbar(obj, layer); + + /*If the border is drawn later disable loading other properties*/ + if(lv_obj_get_style_border_width(obj, LV_PART_MAIN) && + lv_obj_get_style_border_post(obj, LV_PART_MAIN)) { + lv_draw_rect_dsc_t draw_dsc; + lv_draw_rect_dsc_init(&draw_dsc); + draw_dsc.bg_opa = LV_OPA_TRANSP; + draw_dsc.bg_image_opa = LV_OPA_TRANSP; + draw_dsc.outline_opa = LV_OPA_TRANSP; + draw_dsc.shadow_opa = LV_OPA_TRANSP; + draw_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &draw_dsc); + + int32_t w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + lv_area_increase(&coords, w, h); + + lv_draw_rect(layer, &draw_dsc, &coords); + } + } +} + +static void draw_scrollbar(lv_obj_t * obj, lv_layer_t * layer) +{ + + lv_area_t hor_area; + lv_area_t ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + + if(lv_area_get_size(&hor_area) <= 0 && lv_area_get_size(&ver_area) <= 0) return; + + lv_draw_rect_dsc_t rect_dsc; + lv_result_t sb_res = scrollbar_init_draw_dsc(obj, &rect_dsc); + if(sb_res != LV_RESULT_OK) return; + + bool backdrop_blur = lv_obj_get_style_blur_backdrop(obj, LV_PART_SCROLLBAR); + lv_draw_blur_dsc_t blur_dsc; + lv_draw_blur_dsc_init(&blur_dsc); + blur_dsc.corner_radius = rect_dsc.radius; + blur_dsc.blur_radius = lv_obj_get_style_blur_radius(obj, LV_PART_SCROLLBAR); + + if(lv_area_get_size(&hor_area) > 0) { + if(backdrop_blur) lv_obj_init_draw_blur_dsc(obj, LV_PART_SCROLLBAR, &blur_dsc); + blur_dsc.base.id1 = 0; + lv_draw_blur(layer, &blur_dsc, &hor_area); + + rect_dsc.base.id1 = 0; + lv_draw_rect(layer, &rect_dsc, &hor_area); + + if(!backdrop_blur) lv_draw_blur(layer, &blur_dsc, &hor_area); + } + if(lv_area_get_size(&ver_area) > 0) { + blur_dsc.base.id1 = 1; + if(backdrop_blur) lv_draw_blur(layer, &blur_dsc, &ver_area); + + rect_dsc.base.id1 = 1; + lv_draw_rect(layer, &rect_dsc, &ver_area); + + if(!backdrop_blur) lv_draw_blur(layer, &blur_dsc, &ver_area); + } +} + +/** + * Initialize the draw descriptor for the scrollbar + * @param obj pointer to an object + * @param dsc the draw descriptor to initialize + * @return LV_RESULT_OK: the scrollbar is visible; LV_RESULT_INVALID: the scrollbar is not visible + */ +static lv_result_t scrollbar_init_draw_dsc(lv_obj_t * obj, lv_draw_rect_dsc_t * dsc) +{ + lv_draw_rect_dsc_init(dsc); + dsc->bg_opa = lv_obj_get_style_bg_opa(obj, LV_PART_SCROLLBAR); + if(dsc->bg_opa > LV_OPA_MIN) { + dsc->bg_color = lv_obj_get_style_bg_color(obj, LV_PART_SCROLLBAR); + } + + dsc->border_opa = lv_obj_get_style_border_opa(obj, LV_PART_SCROLLBAR); + if(dsc->border_opa > LV_OPA_MIN) { + dsc->border_width = lv_obj_get_style_border_width(obj, LV_PART_SCROLLBAR); + if(dsc->border_width > 0) { + dsc->border_color = lv_obj_get_style_border_color(obj, LV_PART_SCROLLBAR); + } + else { + dsc->border_opa = LV_OPA_TRANSP; + } + } + + dsc->shadow_opa = lv_obj_get_style_shadow_opa(obj, LV_PART_SCROLLBAR); + if(dsc->shadow_opa > LV_OPA_MIN) { + dsc->shadow_width = lv_obj_get_style_shadow_width(obj, LV_PART_SCROLLBAR); + if(dsc->shadow_width > 0) { + dsc->shadow_spread = lv_obj_get_style_shadow_spread(obj, LV_PART_SCROLLBAR); + dsc->shadow_color = lv_obj_get_style_shadow_color(obj, LV_PART_SCROLLBAR); + } + else { + dsc->shadow_opa = LV_OPA_TRANSP; + } + } + + lv_opa_t opa = lv_obj_get_style_opa_recursive(obj, LV_PART_SCROLLBAR); + if(opa < LV_OPA_MAX) { + lv_opa_t v = LV_OPA_MIX2(dsc->bg_opa, opa); + dsc->bg_opa = v; + dsc->border_opa = v; + dsc->shadow_opa = v; + } + + if(dsc->bg_opa != LV_OPA_TRANSP || dsc->border_opa != LV_OPA_TRANSP || dsc->shadow_opa != LV_OPA_TRANSP) { + dsc->radius = lv_obj_get_style_radius(obj, LV_PART_SCROLLBAR); + return LV_RESULT_OK; + } + else { + return LV_RESULT_INVALID; + } +} + +static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_PRESSED) { + lv_obj_add_state(obj, LV_STATE_PRESSED); + } + else if(code == LV_EVENT_RELEASED) { + lv_obj_remove_state(obj, LV_STATE_PRESSED); + void * param = lv_event_get_param(e); + /*Go the checked state if enabled*/ + if(lv_indev_get_scroll_obj(param) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { + + bool was_checked = lv_obj_has_state(obj, LV_STATE_CHECKED); + if(!(lv_obj_get_state(obj) & LV_STATE_CHECKED)) { + lv_obj_add_state(obj, LV_STATE_CHECKED); + } + /*Radio buttons can't be checked off directly*/ + else if(!lv_obj_is_radio_button(obj)) { + lv_obj_remove_state(obj, LV_STATE_CHECKED); + } + if(was_checked != lv_obj_has_state(obj, LV_STATE_CHECKED)) { + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + } + else if(code == LV_EVENT_VALUE_CHANGED) { + if(lv_obj_is_radio_button(obj) && lv_obj_has_state(obj, LV_STATE_CHECKED)) { + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + uint32_t child_cnt = lv_obj_get_child_count(parent); + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * sibling = lv_obj_get_child(parent, i); + if(obj == sibling) continue; + + if(lv_obj_is_radio_button(sibling) && lv_obj_has_state(sibling, LV_STATE_CHECKED)) { + lv_obj_remove_state(sibling, LV_STATE_CHECKED); + lv_result_t res = lv_obj_send_event(sibling, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + } + } + } + else if(code == LV_EVENT_PRESS_LOST) { + lv_obj_remove_state(obj, LV_STATE_PRESSED); + } + else if(code == LV_EVENT_STYLE_CHANGED) { + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(uint32_t i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_mark_layout_as_dirty(child); + } + } + else if(code == LV_EVENT_KEY) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) { + uint32_t c = lv_event_get_key(e); + bool was_checked = lv_obj_has_state(obj, LV_STATE_CHECKED); + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + lv_obj_add_state(obj, LV_STATE_CHECKED); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + /*Radio buttons can't be checked off directly*/ + if(!lv_obj_is_radio_button(obj)) { + lv_obj_remove_state(obj, LV_STATE_CHECKED); + } + } + + /*With Enter LV_EVENT_RELEASED will send VALUE_CHANGE event*/ + if(c != LV_KEY_ENTER && was_checked != lv_obj_has_state(obj, LV_STATE_CHECKED)) { + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + else if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE | LV_OBJ_FLAG_SCROLL_WITH_ARROW) && !lv_obj_is_editable(obj)) { + /*scroll by keypad or encoder*/ + lv_anim_enable_t anim_enable = LV_ANIM_OFF; + int32_t sl = lv_obj_get_scroll_left(obj); + int32_t sr = lv_obj_get_scroll_right(obj); + uint32_t c = lv_event_get_key(e); + if(c == LV_KEY_DOWN) { + /*use scroll_to_x/y functions to enforce scroll limits*/ + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) + lv_obj_get_height(obj) / 4, anim_enable); + } + else if(c == LV_KEY_UP) { + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) - lv_obj_get_height(obj) / 4, anim_enable); + } + else if(c == LV_KEY_RIGHT) { + /*If the object can't be scrolled horizontally then scroll it vertically*/ + if(!((lv_obj_get_scroll_dir(obj) & LV_DIR_HOR) && (sl > 0 || sr > 0))) + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) + lv_obj_get_height(obj) / 4, anim_enable); + else + lv_obj_scroll_to_x(obj, lv_obj_get_scroll_x(obj) + lv_obj_get_width(obj) / 4, anim_enable); + } + else if(c == LV_KEY_LEFT) { + /*If the object can't be scrolled horizontally then scroll it vertically*/ + if(!((lv_obj_get_scroll_dir(obj) & LV_DIR_HOR) && (sl > 0 || sr > 0))) + lv_obj_scroll_to_y(obj, lv_obj_get_scroll_y(obj) - lv_obj_get_height(obj) / 4, anim_enable); + else + lv_obj_scroll_to_x(obj, lv_obj_get_scroll_x(obj) - lv_obj_get_width(obj) / 4, anim_enable); + } + } + } + else if(code == LV_EVENT_FOCUSED) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS)) { + lv_obj_scroll_to_view_recursive(obj, LV_ANIM_ON); + } + + bool editing = false; + editing = lv_group_get_editing(lv_obj_get_group(obj)); + lv_state_t state = LV_STATE_FOCUSED; + + /* Use the indev for then indev handler. + * But if the obj was focused manually it returns NULL so try to + * use the indev from the event*/ + lv_indev_t * indev = lv_indev_active(); + if(indev == NULL) indev = lv_event_get_indev(e); + + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_KEYPAD || indev_type == LV_INDEV_TYPE_ENCODER) state |= LV_STATE_FOCUS_KEY; + if(editing) { + state |= LV_STATE_EDITED; + lv_obj_add_state(obj, state); + } + else { + lv_obj_add_state(obj, state); + lv_obj_remove_state(obj, LV_STATE_EDITED); + } + } + else if(code == LV_EVENT_SCROLL_BEGIN) { + lv_obj_add_state(obj, LV_STATE_SCROLLED); + } + else if(code == LV_EVENT_SCROLL_END) { + lv_obj_remove_state(obj, LV_STATE_SCROLLED); + if(lv_obj_get_scrollbar_mode(obj) == LV_SCROLLBAR_MODE_ACTIVE) { + lv_area_t hor_area, ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + lv_obj_invalidate_area(obj, &hor_area); + lv_obj_invalidate_area(obj, &ver_area); + } + } + else if(code == LV_EVENT_DEFOCUSED) { + lv_obj_remove_state(obj, LV_STATE_FOCUSED | LV_STATE_EDITED | LV_STATE_FOCUS_KEY); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + int32_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); + uint16_t layout = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout || align) { + lv_obj_mark_layout_as_dirty(obj); + } + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_mark_layout_as_dirty(child); + } + } + else if(code == LV_EVENT_CHILD_CHANGED) { + int32_t w = lv_obj_get_style_width(obj, LV_PART_MAIN); + int32_t h = lv_obj_get_style_height(obj, LV_PART_MAIN); + int32_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); + uint16_t layout = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout || align || w == LV_SIZE_CONTENT || h == LV_SIZE_CONTENT) { + lv_obj_mark_layout_as_dirty(obj); + } + } + else if(code == LV_EVENT_CHILD_DELETED) { + obj->readjust_scroll_after_layout = 1; + lv_obj_mark_layout_as_dirty(obj); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t d = lv_obj_calculate_ext_draw_size(obj, LV_PART_MAIN); + lv_event_set_ext_draw_size(e, d); + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_DRAW_MAIN_END || + code == LV_EVENT_COVER_CHECK) { + lv_obj_draw(e); + } + else if(code == LV_EVENT_INDEV_RESET) { + lv_obj_remove_state(obj, LV_STATE_PRESSED); + lv_obj_remove_state(obj, LV_STATE_SCROLLED); + } + else if(code == LV_EVENT_HOVER_OVER) { + lv_obj_add_state(obj, LV_STATE_HOVERED); + } + else if(code == LV_EVENT_HOVER_LEAVE) { + lv_obj_remove_state(obj, LV_STATE_HOVERED); + } +} + +/** + * Set the state (fully overwrite) of an object. + * If specified in the styles, transition animations will be started from the previous state to the current. + * @param obj pointer to an object + * @param state the new state + */ +static void update_obj_state(lv_obj_t * obj, lv_state_t new_state) +{ + if(obj->state == new_state) return; + + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t prev_state = obj->state; + + lv_style_state_cmp_t cmp_res = lv_obj_style_state_compare(obj, prev_state, new_state); + /*If there is no difference in styles there is nothing else to do*/ + if(cmp_res == LV_STYLE_STATE_CMP_SAME) { + obj->state = new_state; + lv_obj_send_event(obj, LV_EVENT_STATE_CHANGED, &prev_state); + return; + } + + /*Invalidate the object in their current state*/ + lv_obj_invalidate(obj); + + obj->state = new_state; + lv_obj_update_layer_type(obj); + + /*Skip transitions if the widget is not rendered yet. */ + if(!obj->rendered) { + lv_obj_invalidate(obj); + if(cmp_res == LV_STYLE_STATE_CMP_DIFF_DRAW_PAD) { + lv_obj_refresh_ext_draw_size(obj); + } + + lv_obj_send_event(obj, LV_EVENT_STATE_CHANGED, &prev_state); + return; + } + + lv_obj_style_transition_dsc_t * ts = lv_malloc_zeroed(sizeof(lv_obj_style_transition_dsc_t) * STYLE_TRANSITION_MAX); + uint32_t tsi = 0; + uint32_t i; + for(i = 0; i < obj->style_cnt && tsi < STYLE_TRANSITION_MAX; i++) { + lv_obj_style_t * obj_style = &obj->styles[i]; + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + if(state_act & (~new_state)) continue; /*Skip unrelated styles*/ + if(obj_style->is_trans) continue; + + lv_style_value_t v; + if(lv_style_get_prop_inlined(obj_style->style, LV_STYLE_TRANSITION, &v) != LV_STYLE_RES_FOUND) continue; + const lv_style_transition_dsc_t * tr = v.ptr; + + /*Add the props to the set if not added yet or added but with smaller weight*/ + uint32_t j; + for(j = 0; tr->props[j] != 0 && tsi < STYLE_TRANSITION_MAX; j++) { + uint32_t t; + for(t = 0; t < tsi; t++) { + lv_style_selector_t selector = ts[t].selector; + lv_state_t state_ts = lv_obj_style_get_selector_state(selector); + lv_part_t part_ts = lv_obj_style_get_selector_part(selector); + if(ts[t].prop == tr->props[j] && part_ts == part_act && state_ts >= state_act) break; + } + + /*If not found add it*/ + if(t == tsi) { + ts[tsi].time = tr->time; + ts[tsi].delay = tr->delay; + ts[tsi].path_cb = tr->path_xcb; + ts[tsi].prop = tr->props[j]; + ts[tsi].user_data = tr->user_data; + ts[tsi].selector = obj_style->selector; + tsi++; + } + } + } + + for(i = 0; i < tsi; i++) { + lv_part_t part_act = lv_obj_style_get_selector_part(ts[i].selector); + lv_obj_style_create_transition(obj, part_act, prev_state, new_state, &ts[i]); + } + + lv_free(ts); + + if(cmp_res == LV_STYLE_STATE_CMP_DIFF_REDRAW) { + /*Invalidation is not enough, e.g. layer type needs to be updated too*/ + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + } + else if(cmp_res == LV_STYLE_STATE_CMP_DIFF_LAYOUT) { + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + } + else if(cmp_res == LV_STYLE_STATE_CMP_DIFF_DRAW_PAD) { + lv_obj_invalidate(obj); + lv_obj_refresh_ext_draw_size(obj); + } + + lv_obj_send_event(obj, LV_EVENT_STATE_CHANGED, &prev_state); +} + +/** + * Apply the state to the children of the object + * @param obj pointer to an object + * @param state the state to apply + */ +static void lv_obj_children_add_state(lv_obj_t * obj, lv_state_t state) +{ + uint32_t child_count = lv_obj_get_child_count(obj); + + for(uint32_t i = 0; i < child_count; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(child) { + lv_obj_add_state(child, state); + } + } +} + +/** + * Remove the state from the children of the object + * @param obj pointer to an object + * @param state the state to remove + */ +static void lv_obj_children_remove_state(lv_obj_t * obj, lv_state_t state) +{ + uint32_t child_count = lv_obj_get_child_count(obj); + + for(uint32_t i = 0; i < child_count; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(child) { + lv_obj_remove_state(child, state); + } + } +} + +static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find) +{ + /*Check all children of `parent`*/ + uint32_t child_cnt = 0; + if(parent->spec_attr) child_cnt = parent->spec_attr->child_cnt; + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + if(child == obj_to_find) { + return true; + } + + /*Check the children*/ + bool found = obj_valid_child(child, obj_to_find); + if(found) { + return true; + } + } + return false; +} + +static void null_on_delete_cb(lv_event_t * e) +{ + lv_obj_t ** obj_ptr = lv_event_get_user_data(e); + *obj_ptr = NULL; +} + +static void screen_load_on_trigger_event_cb(lv_event_t * e) +{ + screen_load_anim_dsc_t * dsc = lv_event_get_user_data(e); + LV_ASSERT_NULL(dsc); + lv_screen_load_anim(dsc->target.screen, dsc->anim_type, dsc->duration, dsc->delay, false); +} + +static void screen_create_on_trigger_event_cb(lv_event_t * e) +{ + screen_load_anim_dsc_t * dsc = lv_event_get_user_data(e); + LV_ASSERT_NULL(dsc); + + lv_obj_t * screen = dsc->target.create_cb(); + lv_screen_load_anim(screen, dsc->anim_type, dsc->duration, dsc->delay, false); + lv_obj_add_event_cb(screen, delete_on_screen_unloaded_event_cb, LV_EVENT_SCREEN_UNLOADED, NULL); +} + +static void play_timeline_on_trigger_event_cb(lv_event_t * e) +{ + timeline_play_dsc_t * dsc = lv_event_get_user_data(e); + LV_ASSERT_NULL(dsc); + + /*Reset the progress only if the animation was finished*/ + uint16_t progress = lv_anim_timeline_get_progress(dsc->at); + if(dsc->reverse) { + if(progress == 0) { + lv_anim_timeline_set_progress(dsc->at, LV_ANIM_TIMELINE_PROGRESS_MAX); + } + + if(lv_anim_timeline_get_progress(dsc->at) == LV_ANIM_TIMELINE_PROGRESS_MAX) { + lv_anim_timeline_set_delay(dsc->at, dsc->delay); + } + + lv_anim_timeline_set_reverse(dsc->at, true); + } + else { + if(progress == LV_ANIM_TIMELINE_PROGRESS_MAX) { + lv_anim_timeline_set_progress(dsc->at, 0); + } + + if(lv_anim_timeline_get_progress(dsc->at) == 0) { + lv_anim_timeline_set_delay(dsc->at, dsc->delay); + } + + lv_anim_timeline_set_reverse(dsc->at, false); + } + lv_anim_timeline_start(dsc->at); +} + + +static void delete_on_screen_unloaded_event_cb(lv_event_t * e) +{ + lv_obj_delete(lv_event_get_target_obj(e)); +} + +#if LV_USE_OBJ_PROPERTY +static lv_point_t lv_obj_get_scroll_end_helper(lv_obj_t * obj) +{ + lv_point_t point; + lv_obj_get_scroll_end(obj, &point); + return point; +} + +static lv_result_t lv_obj_set_any(lv_obj_t * obj, lv_prop_id_t id, const lv_property_t * prop) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(id >= LV_PROPERTY_OBJ_FLAG_START && id <= LV_PROPERTY_OBJ_FLAG_END) { + lv_obj_flag_t flag = 1L << (id - LV_PROPERTY_OBJ_FLAG_START); + if(prop->num) lv_obj_add_flag(obj, flag); + else lv_obj_remove_flag(obj, flag); + return LV_RESULT_OK; + } + else if(id >= LV_PROPERTY_OBJ_STATE_START && id <= LV_PROPERTY_OBJ_STATE_END) { + lv_state_t state = 1L << (id - LV_PROPERTY_OBJ_STATE_START); + if(id == LV_PROPERTY_OBJ_STATE_ANY) { + state = LV_STATE_ANY; + } + + if(prop->num) lv_obj_add_state(obj, state); + else lv_obj_remove_state(obj, state); + return LV_RESULT_OK; + } + else { + return LV_RESULT_INVALID; + } +} + +static lv_result_t lv_obj_get_any(const lv_obj_t * obj, lv_prop_id_t id, lv_property_t * prop) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(id >= LV_PROPERTY_OBJ_FLAG_START && id <= LV_PROPERTY_OBJ_FLAG_END) { + lv_obj_flag_t flag = 1L << (id - LV_PROPERTY_OBJ_FLAG_START); + prop->id = id; + prop->num = obj->flags & flag; + return LV_RESULT_OK; + } + else if(id >= LV_PROPERTY_OBJ_STATE_START && id <= LV_PROPERTY_OBJ_STATE_END) { + prop->id = id; + if(id == LV_PROPERTY_OBJ_STATE_ANY) { + prop->num = obj->state; + } + else { + lv_obj_flag_t flag = 1L << (id - LV_PROPERTY_OBJ_STATE_START); + prop->num = obj->state & flag; + } + return LV_RESULT_OK; + } + else { + return LV_RESULT_INVALID; + } +} +#endif /*LV_USE_OBJ_PROPERTY*/ diff --git a/inc/lvgl/src/core/lv_obj.h b/inc/lvgl/src/core/lv_obj.h new file mode 100644 index 0000000..d18887e --- /dev/null +++ b/inc/lvgl/src/core/lv_obj.h @@ -0,0 +1,501 @@ +/** + * @file lv_obj.h + * + */ + +#ifndef LV_OBJ_H +#define LV_OBJ_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "../misc/lv_types.h" +#include "../misc/lv_style.h" +#include "../misc/lv_area.h" +#include "../misc/lv_color.h" +#include "../misc/lv_assert.h" + +#include "lv_obj_tree.h" +#include "lv_obj_pos.h" +#include "lv_obj_scroll.h" +#include "lv_obj_style.h" +#include "lv_obj_draw.h" +#include "lv_obj_class.h" +#include "lv_obj_event.h" +#include "lv_obj_property.h" +#include "lv_group.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +/** + * On/Off features controlling the object's behavior. + * OR-ed values are possible + * + * Note: update obj flags corresponding properties below + * whenever add/remove flags or change bit definition of flags. + */ +typedef enum { + LV_OBJ_FLAG_HIDDEN = (1u << 0), /**< Make the object hidden. (Like it wasn't there at all)*/ + LV_OBJ_FLAG_CLICKABLE = (1u << 1), /**< Make the object clickable by the input devices*/ + LV_OBJ_FLAG_CLICK_FOCUSABLE = (1u << 2), /**< Add focused state to the object when clicked*/ + LV_OBJ_FLAG_CHECKABLE = (1u << 3), /**< Toggle checked state when the object is clicked*/ + LV_OBJ_FLAG_SCROLLABLE = (1u << 4), /**< Make the object scrollable*/ + LV_OBJ_FLAG_SCROLL_ELASTIC = (1u << 5), /**< Allow scrolling inside but with slower speed*/ + LV_OBJ_FLAG_SCROLL_MOMENTUM = (1u << 6), /**< Make the object scroll further when "thrown"*/ + LV_OBJ_FLAG_SCROLL_ONE = (1u << 7), /**< Allow scrolling only one snappable children*/ + LV_OBJ_FLAG_SCROLL_CHAIN_HOR = (1u << 8), /**< Allow propagating the horizontal scroll to a parent*/ + LV_OBJ_FLAG_SCROLL_CHAIN_VER = (1u << 9), /**< Allow propagating the vertical scroll to a parent*/ + LV_OBJ_FLAG_SCROLL_CHAIN = (LV_OBJ_FLAG_SCROLL_CHAIN_HOR | LV_OBJ_FLAG_SCROLL_CHAIN_VER), + LV_OBJ_FLAG_SCROLL_ON_FOCUS = (1u << 10), /**< Automatically scroll object to make it visible when focused*/ + LV_OBJ_FLAG_SCROLL_WITH_ARROW = (1u << 11), /**< Allow scrolling the focused object with arrow keys*/ + LV_OBJ_FLAG_SNAPPABLE = (1u << 12), /**< If scroll snap is enabled on the parent it can snap to this object*/ + LV_OBJ_FLAG_PRESS_LOCK = (1u << 13), /**< Keep the object pressed even if the press slid from the object*/ + LV_OBJ_FLAG_EVENT_BUBBLE = (1u << 14), /**< Propagate the events to the parent too*/ + LV_OBJ_FLAG_GESTURE_BUBBLE = (1u << 15), /**< Propagate the gestures to the parent*/ + LV_OBJ_FLAG_ADV_HITTEST = (1u << 16), /**< Allow performing more accurate hit (click) test. E.g. consider rounded corners.*/ + LV_OBJ_FLAG_IGNORE_LAYOUT = (1u << 17), /**< Make the object not positioned by the layouts*/ + LV_OBJ_FLAG_FLOATING = (1u << 18), /**< Do not scroll the object when the parent scrolls and ignore layout*/ + LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS = (1u << 19), /**< Send `LV_EVENT_DRAW_TASK_ADDED` events*/ + LV_OBJ_FLAG_OVERFLOW_VISIBLE = (1u << 20),/**< Do not clip the children to the parent's ext draw size*/ + LV_OBJ_FLAG_EVENT_TRICKLE = (1u << 21), /**< Propagate the events to the children too*/ + LV_OBJ_FLAG_STATE_TRICKLE = (1u << 22), /**< Propagate the states to the children too*/ + + LV_OBJ_FLAG_LAYOUT_1 = (1u << 23), /**< Custom flag, free to use by layouts*/ + LV_OBJ_FLAG_LAYOUT_2 = (1u << 24), /**< Custom flag, free to use by layouts*/ +#if LV_USE_FLEX + LV_OBJ_FLAG_FLEX_IN_NEW_TRACK = LV_OBJ_FLAG_LAYOUT_1, /**< Start a new flex track on this item*/ +#endif + + LV_OBJ_FLAG_WIDGET_1 = (1u << 25), /**< Custom flag, free to use by widget*/ + LV_OBJ_FLAG_WIDGET_2 = (1u << 26), /**< Custom flag, free to use by widget*/ + LV_OBJ_FLAG_USER_1 = (1u << 27), /**< Custom flag, free to use by user*/ + LV_OBJ_FLAG_USER_2 = (1u << 28), /**< Custom flag, free to use by user*/ + LV_OBJ_FLAG_USER_3 = (1u << 29), /**< Custom flag, free to use by user*/ + LV_OBJ_FLAG_USER_4 = (1u << 30), /**< Custom flag, free to use by user*/ +} lv_obj_flag_t; + +#if LV_USE_OBJ_PROPERTY +enum _lv_signed_prop_id_t { + /*OBJ flag properties */ + LV_PROPERTY_ID(OBJ, FLAG_START, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(OBJ, FLAG_HIDDEN, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(OBJ, FLAG_CLICKABLE, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(OBJ, FLAG_CLICK_FOCUSABLE, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(OBJ, FLAG_CHECKABLE, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(OBJ, FLAG_SCROLLABLE, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_ELASTIC, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_MOMENTUM, LV_PROPERTY_TYPE_INT, 6), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_ONE, LV_PROPERTY_TYPE_INT, 7), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_CHAIN_HOR, LV_PROPERTY_TYPE_INT, 8), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_CHAIN_VER, LV_PROPERTY_TYPE_INT, 9), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_ON_FOCUS, LV_PROPERTY_TYPE_INT, 10), + LV_PROPERTY_ID(OBJ, FLAG_SCROLL_WITH_ARROW, LV_PROPERTY_TYPE_INT, 11), + LV_PROPERTY_ID(OBJ, FLAG_SNAPPABLE, LV_PROPERTY_TYPE_INT, 12), + LV_PROPERTY_ID(OBJ, FLAG_PRESS_LOCK, LV_PROPERTY_TYPE_INT, 13), + LV_PROPERTY_ID(OBJ, FLAG_EVENT_BUBBLE, LV_PROPERTY_TYPE_INT, 14), + LV_PROPERTY_ID(OBJ, FLAG_GESTURE_BUBBLE, LV_PROPERTY_TYPE_INT, 15), + LV_PROPERTY_ID(OBJ, FLAG_ADV_HITTEST, LV_PROPERTY_TYPE_INT, 16), + LV_PROPERTY_ID(OBJ, FLAG_IGNORE_LAYOUT, LV_PROPERTY_TYPE_INT, 17), + LV_PROPERTY_ID(OBJ, FLAG_FLOATING, LV_PROPERTY_TYPE_INT, 18), + LV_PROPERTY_ID(OBJ, FLAG_SEND_DRAW_TASK_EVENTS, LV_PROPERTY_TYPE_INT, 19), + LV_PROPERTY_ID(OBJ, FLAG_OVERFLOW_VISIBLE, LV_PROPERTY_TYPE_INT, 20), + LV_PROPERTY_ID(OBJ, FLAG_EVENT_TRICKLE, LV_PROPERTY_TYPE_INT, 21), + LV_PROPERTY_ID(OBJ, FLAG_STATE_TRICKLE, LV_PROPERTY_TYPE_INT, 22), + LV_PROPERTY_ID(OBJ, FLAG_LAYOUT_1, LV_PROPERTY_TYPE_INT, 23), + LV_PROPERTY_ID(OBJ, FLAG_LAYOUT_2, LV_PROPERTY_TYPE_INT, 24), + LV_PROPERTY_ID(OBJ, FLAG_FLEX_IN_NEW_TRACK, LV_PROPERTY_TYPE_INT, 23), /*Mapped to FLAG_LAYOUT_1*/ + LV_PROPERTY_ID(OBJ, FLAG_WIDGET_1, LV_PROPERTY_TYPE_INT, 25), + LV_PROPERTY_ID(OBJ, FLAG_WIDGET_2, LV_PROPERTY_TYPE_INT, 26), + LV_PROPERTY_ID(OBJ, FLAG_USER_1, LV_PROPERTY_TYPE_INT, 27), + LV_PROPERTY_ID(OBJ, FLAG_USER_2, LV_PROPERTY_TYPE_INT, 28), + LV_PROPERTY_ID(OBJ, FLAG_USER_3, LV_PROPERTY_TYPE_INT, 29), + LV_PROPERTY_ID(OBJ, FLAG_USER_4, LV_PROPERTY_TYPE_INT, 30), + LV_PROPERTY_ID(OBJ, FLAG_END, LV_PROPERTY_TYPE_INT, 30), + + LV_PROPERTY_ID(OBJ, STATE_START, LV_PROPERTY_TYPE_INT, 31), + LV_PROPERTY_ID(OBJ, STATE_ALT, LV_PROPERTY_TYPE_INT, 31), + /*1 reserved*/ + LV_PROPERTY_ID(OBJ, STATE_CHECKED, LV_PROPERTY_TYPE_INT, 33), + LV_PROPERTY_ID(OBJ, STATE_FOCUSED, LV_PROPERTY_TYPE_INT, 34), + LV_PROPERTY_ID(OBJ, STATE_FOCUS_KEY, LV_PROPERTY_TYPE_INT, 35), + LV_PROPERTY_ID(OBJ, STATE_EDITED, LV_PROPERTY_TYPE_INT, 36), + LV_PROPERTY_ID(OBJ, STATE_HOVERED, LV_PROPERTY_TYPE_INT, 37), + LV_PROPERTY_ID(OBJ, STATE_PRESSED, LV_PROPERTY_TYPE_INT, 38), + LV_PROPERTY_ID(OBJ, STATE_SCROLLED, LV_PROPERTY_TYPE_INT, 39), + LV_PROPERTY_ID(OBJ, STATE_DISABLED, LV_PROPERTY_TYPE_INT, 40), + /*2 reserved*/ + LV_PROPERTY_ID(OBJ, STATE_USER_1, LV_PROPERTY_TYPE_INT, 43), + LV_PROPERTY_ID(OBJ, STATE_USER_2, LV_PROPERTY_TYPE_INT, 44), + LV_PROPERTY_ID(OBJ, STATE_USER_3, LV_PROPERTY_TYPE_INT, 45), + LV_PROPERTY_ID(OBJ, STATE_USER_4, LV_PROPERTY_TYPE_INT, 46), + LV_PROPERTY_ID(OBJ, STATE_ANY, LV_PROPERTY_TYPE_INT, 47), + LV_PROPERTY_ID(OBJ, STATE_END, LV_PROPERTY_TYPE_INT, 47), + + /*OBJ normal properties*/ + LV_PROPERTY_ID(OBJ, PARENT, LV_PROPERTY_TYPE_OBJ, 48), + LV_PROPERTY_ID(OBJ, X, LV_PROPERTY_TYPE_INT, 49), + LV_PROPERTY_ID(OBJ, Y, LV_PROPERTY_TYPE_INT, 50), + LV_PROPERTY_ID(OBJ, W, LV_PROPERTY_TYPE_INT, 51), + LV_PROPERTY_ID(OBJ, H, LV_PROPERTY_TYPE_INT, 52), + LV_PROPERTY_ID(OBJ, CONTENT_WIDTH, LV_PROPERTY_TYPE_INT, 53), + LV_PROPERTY_ID(OBJ, CONTENT_HEIGHT, LV_PROPERTY_TYPE_INT, 54), + LV_PROPERTY_ID(OBJ, LAYOUT, LV_PROPERTY_TYPE_INT, 55), + LV_PROPERTY_ID(OBJ, ALIGN, LV_PROPERTY_TYPE_INT, 56), + LV_PROPERTY_ID(OBJ, SCROLLBAR_MODE, LV_PROPERTY_TYPE_INT, 57), + LV_PROPERTY_ID(OBJ, SCROLL_DIR, LV_PROPERTY_TYPE_INT, 58), + LV_PROPERTY_ID(OBJ, SCROLL_SNAP_X, LV_PROPERTY_TYPE_INT, 59), + LV_PROPERTY_ID(OBJ, SCROLL_SNAP_Y, LV_PROPERTY_TYPE_INT, 60), + LV_PROPERTY_ID(OBJ, SCROLL_X, LV_PROPERTY_TYPE_INT, 61), + LV_PROPERTY_ID(OBJ, SCROLL_Y, LV_PROPERTY_TYPE_INT, 62), + LV_PROPERTY_ID(OBJ, SCROLL_TOP, LV_PROPERTY_TYPE_INT, 63), + LV_PROPERTY_ID(OBJ, SCROLL_BOTTOM, LV_PROPERTY_TYPE_INT, 64), + LV_PROPERTY_ID(OBJ, SCROLL_LEFT, LV_PROPERTY_TYPE_INT, 65), + LV_PROPERTY_ID(OBJ, SCROLL_RIGHT, LV_PROPERTY_TYPE_INT, 66), + LV_PROPERTY_ID(OBJ, SCROLL_END, LV_PROPERTY_TYPE_POINT, 67), + LV_PROPERTY_ID(OBJ, EXT_DRAW_SIZE, LV_PROPERTY_TYPE_INT, 68), + LV_PROPERTY_ID(OBJ, EVENT_COUNT, LV_PROPERTY_TYPE_INT, 69), + LV_PROPERTY_ID(OBJ, SCREEN, LV_PROPERTY_TYPE_OBJ, 70), + LV_PROPERTY_ID(OBJ, DISPLAY, LV_PROPERTY_TYPE_POINTER, 71), + LV_PROPERTY_ID(OBJ, CHILD_COUNT, LV_PROPERTY_TYPE_INT, 72), + LV_PROPERTY_ID(OBJ, INDEX, LV_PROPERTY_TYPE_INT, 73), + + LV_PROPERTY_OBJ_END, +}; +#endif + +/** + * Make the base object's class publicly available. + */ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_obj_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a base object (a rectangle) + * @param parent pointer to a parent object. If NULL then a screen will be created. + * @return pointer to the new object + */ +lv_obj_t * lv_obj_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set one or more flags + * @param obj pointer to an object + * @param f OR-ed values from `lv_obj_flag_t` to set. + */ +void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Remove one or more flags + * @param obj pointer to an object + * @param f OR-ed values from `lv_obj_flag_t` to clear. + */ +void lv_obj_remove_flag(lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Set add or remove one or more flags. + * @param obj pointer to an object + * @param f OR-ed values from `lv_obj_flag_t` to update. + * @param v true: add the flags; false: remove the flags + */ +void lv_obj_set_flag(lv_obj_t * obj, lv_obj_flag_t f, bool v); + +/** + * Add one or more states to the object. The other state bits will remain unchanged. + * If specified in the styles, transition animation will be started from the previous state to the current. + * @param obj pointer to an object + * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` + */ +void lv_obj_add_state(lv_obj_t * obj, lv_state_t state); + +/** + * Remove one or more states to the object. The other state bits will remain unchanged. + * If specified in the styles, transition animation will be started from the previous state to the current. + * @param obj pointer to an object + * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` + */ +void lv_obj_remove_state(lv_obj_t * obj, lv_state_t state); + +/** + * Add or remove one or more states to the object. The other state bits will remain unchanged. + * @param obj pointer to an object + * @param state the states to add. E.g `LV_STATE_PRESSED | LV_STATE_FOCUSED` + * @param v true: add the states; false: remove the states + */ +void lv_obj_set_state(lv_obj_t * obj, lv_state_t state, bool v); + +/** + * Set the user_data field of the object + * @param obj pointer to an object + * @param user_data pointer to the new user_data. + */ +void lv_obj_set_user_data(lv_obj_t * obj, void * user_data); + + +/** Allow only one RADIO_BUTTON sibling to be checked + * @param obj pointer to a widget + * @param en enable or disable radio button behavior + */ +void lv_obj_set_radio_button(lv_obj_t * obj, bool en); + +/*======================= + * Getter functions + *======================*/ + +/** + * Check if a given flag or all the given flags are set on an object. + * @param obj pointer to an object + * @param f the flag(s) to check (OR-ed values can be used) + * @return true: all flags are set; false: not all flags are set + */ +bool lv_obj_has_flag(const lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Check if a given flag or any of the flags are set on an object. + * @param obj pointer to an object + * @param f the flag(s) to check (OR-ed values can be used) + * @return true: at least one flag is set; false: none of the flags are set + */ +bool lv_obj_has_flag_any(const lv_obj_t * obj, lv_obj_flag_t f); + +/** + * Get the state of an object + * @param obj pointer to an object + * @return the state (OR-ed values from `lv_state_t`) + */ +lv_state_t lv_obj_get_state(const lv_obj_t * obj); + +/** + * Check if the object is in a given state or not. + * @param obj pointer to an object + * @param state a state or combination of states to check + * @return true: `obj` is in `state`; false: `obj` is not in `state` + */ +bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state); + +/** Get whether the object is a radio button + * @param obj pointer to a widget + * @return true if radio button behavior is enabled + */ +bool lv_obj_is_radio_button(const lv_obj_t * obj); + +/** + * Get the group of the object + * @param obj pointer to an object + * @return the pointer to group of the object + */ +lv_group_t * lv_obj_get_group(const lv_obj_t * obj); + +/** + * Get the user_data field of the object + * @param obj pointer to an object + * @return the pointer to the user_data of the object + */ +void * lv_obj_get_user_data(lv_obj_t * obj); + +/*======================= + * Other functions + *======================*/ + +/** + * Allocate special data for an object if not allocated yet. + * @param obj pointer to an object + */ +void lv_obj_allocate_spec_attr(lv_obj_t * obj); + +/** + * Check the type of obj. + * @param obj pointer to an object + * @param class_p a class to check (e.g. `lv_slider_class`) + * @return true: `class_p` is the `obj` class. + */ +bool lv_obj_check_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +/** + * Check if any object has a given class (type). + * It checks the ancestor classes too. + * @param obj pointer to an object + * @param class_p a class to check (e.g. `lv_slider_class`) + * @return true: `obj` has the given class + */ +bool lv_obj_has_class(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +/** + * Get the class (type) of the object + * @param obj pointer to an object + * @return the class (type) of the object + */ +const lv_obj_class_t * lv_obj_get_class(const lv_obj_t * obj); + +/** + * Check if any object is still "alive". + * @param obj pointer to an object + * @return true: valid + */ +bool lv_obj_is_valid(const lv_obj_t * obj); + +/** + * Utility to set an object reference to NULL when it gets deleted. + * The reference should be in a location that will not become invalid + * during the object's lifetime, i.e. static or allocated. + * @param obj_ptr a pointer to a pointer to an object + */ +void lv_obj_null_on_delete(lv_obj_t ** obj_ptr); + +/** + * Add an event handler to a widget that will load a screen on a trigger. + * @param obj pointer to widget which should load the screen + * @param trigger an event code, e.g. `LV_EVENT_CLICKED` + * @param screen the screen to load (must be a valid widget) + * @param anim_type element of `lv_screen_load_anim_t` the screen load animation + * @param duration duration of the animation in milliseconds + * @param delay delay before the screen load in milliseconds + */ +void lv_obj_add_screen_load_event(lv_obj_t * obj, lv_event_code_t trigger, lv_obj_t * screen, + lv_screen_load_anim_t anim_type, uint32_t duration, uint32_t delay); + +/** + * Add an event handler to a widget that will create a screen on a trigger. + * The created screen will be deleted when it's unloaded + * @param obj pointer to widget which should load the screen + * @param trigger an event code, e.g. `LV_EVENT_CLICKED` + * @param screen_create_cb a callback to create the screen, e.g. `lv_obj_t * myscreen_create(void)` + * @param anim_type element of `lv_screen_load_anim_t` the screen load animation + * @param duration duration of the animation in milliseconds + * @param delay delay before the screen load in milliseconds + */ +void lv_obj_add_screen_create_event(lv_obj_t * obj, lv_event_code_t trigger, lv_screen_create_cb_t screen_create_cb, + lv_screen_load_anim_t anim_type, uint32_t duration, uint32_t delay); + + +/** + * Play a timeline animation on a trigger + * @param obj pointer to widget which should trigger playing the animation + * @param trigger an event code, e.g. `LV_EVENT_CLICKED` + * @param at pointer to an animation timeline + * @param delay wait time before starting the animation + * @param reverse true: play in reverse + */ +void lv_obj_add_play_timeline_event(lv_obj_t * obj, lv_event_code_t trigger, lv_anim_timeline_t * at, uint32_t delay, + bool reverse); + +#if LV_USE_OBJ_ID +/** + * Set an id for an object. + * @param obj pointer to an object + * @param id the id of the object + */ +void lv_obj_set_id(lv_obj_t * obj, void * id); + +/** + * Get the id of an object. + * @param obj pointer to an object + * @return the id of the object + */ +void * lv_obj_get_id(const lv_obj_t * obj); + +/** + * DEPRECATED IDs are used only to print the widget trees. + * To find a widget use `lv_obj_find_by_name` + * + * Get the child object by its id. + * It will check children and grandchildren recursively. + * Function `lv_obj_id_compare` is used to matched obj id with given id. + * + * @param obj pointer to an object + * @param id the id of the child object + * @return pointer to the child object or NULL if not found + */ +lv_obj_t * lv_obj_find_by_id(const lv_obj_t * obj, const void * id); + +/** + * Assign id to object if not previously assigned. + * This function gets called automatically when LV_OBJ_ID_AUTO_ASSIGN is enabled. + * + * Set `LV_USE_OBJ_ID_BUILTIN` to use the builtin method to generate object ID. + * Otherwise, these functions including `lv_obj_[set|assign|free|stringify]_id` and + * `lv_obj_id_compare`should be implemented externally. + * + * @param class_p the class this obj belongs to. Note obj->class_p is the class currently being constructed. + * @param obj pointer to an object + */ +void lv_obj_assign_id(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/** + * Free resources allocated by `lv_obj_assign_id` or `lv_obj_set_id`. + * This function is also called automatically when object is deleted. + * @param obj pointer to an object + */ +void lv_obj_free_id(lv_obj_t * obj); + +/** + * Compare two obj id, return 0 if they are equal. + * + * Set `LV_USE_OBJ_ID_BUILTIN` to use the builtin method for compare. + * Otherwise, it must be implemented externally. + * + * @param id1: the first id + * @param id2: the second id + * @return 0 if they are equal, non-zero otherwise. + */ +int lv_obj_id_compare(const void * id1, const void * id2); + +/** + * Format an object's id into a string. + * @param obj pointer to an object + * @param buf buffer to write the string into + * @param len length of the buffer + */ +const char * lv_obj_stringify_id(lv_obj_t * obj, char * buf, uint32_t len); + +#if LV_USE_OBJ_ID_BUILTIN +/** + * Free resources used by builtin ID generator. + */ +void lv_objid_builtin_destroy(void); +#endif + +#endif /*LV_USE_OBJ_ID*/ + +/********************** + * MACROS + **********************/ + +#if LV_USE_ASSERT_OBJ +# define LV_ASSERT_OBJ(obj_p, obj_class) \ + do { \ + LV_ASSERT_MSG(obj_p != NULL, "The object is NULL"); \ + LV_ASSERT_MSG(lv_obj_has_class(obj_p, obj_class) == true, "Incompatible object type."); \ + LV_ASSERT_MSG(lv_obj_is_valid(obj_p) == true, "The object is invalid, deleted or corrupted?"); \ + } while(0) +# else +# define LV_ASSERT_OBJ(obj_p, obj_class) LV_ASSERT_NULL(obj_p) +#endif + +#if LV_USE_LOG && LV_LOG_TRACE_OBJ_CREATE +# define LV_TRACE_OBJ_CREATE(...) LV_LOG_TRACE(__VA_ARGS__) +#else +# define LV_TRACE_OBJ_CREATE(...) +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_H*/ diff --git a/inc/lvgl/src/core/lv_obj_class.c b/inc/lvgl/src/core/lv_obj_class.c new file mode 100644 index 0000000..926edf6 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_class.c @@ -0,0 +1,233 @@ +/** + * @file lv_obj_class.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_class_private.h" +#include "lv_obj_private.h" +#include "../themes/lv_theme.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_obj_construct(const lv_obj_class_t * class_p, lv_obj_t * obj); +static uint32_t get_instance_size(const lv_obj_class_t * class_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * parent) +{ + LV_TRACE_OBJ_CREATE("Creating object with %p class on %p parent", (void *)class_p, (void *)parent); + uint32_t s = get_instance_size(class_p); + lv_obj_t * obj = lv_malloc_zeroed(s); + if(obj == NULL) return NULL; + obj->class_p = class_p; + obj->parent = parent; + + /*Create a screen*/ + if(parent == NULL) { + LV_TRACE_OBJ_CREATE("creating a screen"); + lv_display_t * disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("No display created yet. No place to assign the new screen"); + lv_free(obj); + return NULL; + } + + if(disp->screens == NULL) { + disp->screen_cnt = 0; + } + + lv_obj_t ** screens = lv_realloc(disp->screens, sizeof(lv_obj_t *) * (disp->screen_cnt + 1)); + LV_ASSERT_MALLOC(screens); + if(screens == NULL) { + lv_free(obj); + return NULL; + } + + disp->screen_cnt++; + disp->screens = screens; + disp->screens[disp->screen_cnt - 1] = obj; + + /*Set coordinates to full screen size*/ + obj->coords.x1 = 0; + obj->coords.y1 = 0; + obj->coords.x2 = lv_display_get_horizontal_resolution(NULL) - 1; + obj->coords.y2 = lv_display_get_vertical_resolution(NULL) - 1; + } + /*Create a normal object*/ + else { + LV_TRACE_OBJ_CREATE("creating normal object"); + LV_ASSERT_OBJ(parent, MY_CLASS); + if(parent->spec_attr == NULL) { + lv_obj_allocate_spec_attr(parent); + } + + parent->spec_attr->child_cnt++; + parent->spec_attr->children = lv_realloc(parent->spec_attr->children, + sizeof(lv_obj_t *) * parent->spec_attr->child_cnt); + parent->spec_attr->children[parent->spec_attr->child_cnt - 1] = obj; + } + + return obj; +} + +void lv_obj_class_init_obj(lv_obj_t * obj) +{ + if(obj == NULL) return; + + lv_obj_mark_layout_as_dirty(obj); + lv_obj_enable_style_refresh(false); + + lv_theme_apply(obj); + lv_obj_construct(obj->class_p, obj); + + lv_obj_enable_style_refresh(true); + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + + lv_obj_refresh_self_size(obj); + + lv_group_t * def_group = lv_group_get_default(); + if(def_group && lv_obj_is_group_def(obj)) { + lv_group_add_obj(def_group, obj); + } + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + /*Call the ancestor's event handler to the parent to notify it about the new child. + *Also triggers layout update*/ + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); + lv_obj_send_event(parent, LV_EVENT_CHILD_CREATED, obj); + + /*Invalidate the area if not screen created*/ + lv_obj_invalidate(obj); + } +} + +void lv_obj_destruct(lv_obj_t * obj) +{ +#if LV_USE_EXT_DATA + if(obj->ext_data.free_cb) { + obj->ext_data.free_cb(obj->ext_data.data); + obj->ext_data.data = NULL; + } +#endif + + if(obj->class_p->destructor_cb) obj->class_p->destructor_cb(obj->class_p, obj); + + if(obj->class_p->base_class) { + /*Don't let the descendant methods run during destructing the ancestor type*/ + obj->class_p = obj->class_p->base_class; + + /*Call the base class's destructor too*/ + lv_obj_destruct(obj); + } +} + +bool lv_obj_is_editable(lv_obj_t * obj) +{ + const lv_obj_class_t * class_p = obj->class_p; + + /*Find a base in which editable is set*/ + while(class_p && class_p->editable == LV_OBJ_CLASS_EDITABLE_INHERIT) class_p = class_p->base_class; + + if(class_p == NULL) return false; + + return class_p->editable == LV_OBJ_CLASS_EDITABLE_TRUE; +} + +bool lv_obj_is_group_def(lv_obj_t * obj) +{ + const lv_obj_class_t * class_p = obj->class_p; + + /*Find a base in which group_def is set*/ + while(class_p && class_p->group_def == LV_OBJ_CLASS_GROUP_DEF_INHERIT) class_p = class_p->base_class; + + if(class_p == NULL) return false; + + return class_p->group_def == LV_OBJ_CLASS_GROUP_DEF_TRUE; +} + +#if LV_USE_EXT_DATA +void lv_obj_set_external_data(lv_obj_t * obj, void * data, void (* free_cb)(void * data)) +{ + if(!obj) { + LV_LOG_WARN("Can't attach external user data and destructor callback to a NULL object"); + return; + } + + obj->ext_data.data = data; + obj->ext_data.free_cb = free_cb; +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_obj_construct(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + if(LV_USE_OBJ_NAME) { + LV_ASSERT_NULL(class_p->name); + } + +#if LV_USE_EXT_DATA + obj->ext_data.free_cb = NULL; + obj->ext_data.data = NULL; +#endif + + if(obj->class_p->base_class) { + const lv_obj_class_t * original_class_p = obj->class_p; + + /*Don't let the descendant methods run during constructing the ancestor type*/ + obj->class_p = obj->class_p->base_class; + + /*Construct the base first*/ + lv_obj_construct(class_p, obj); + + /*Restore the original class*/ + obj->class_p = original_class_p; + } + + if(obj->class_p->constructor_cb) obj->class_p->constructor_cb(class_p, obj); +} + +static uint32_t get_instance_size(const lv_obj_class_t * class_p) +{ + /*Find a base in which instance size is set*/ + const lv_obj_class_t * base = class_p; + while(base && base->instance_size == 0) base = base->base_class; + + if(base == NULL) return 0; /*Never happens: set at least in `lv_obj` class*/ + + return base->instance_size; +} diff --git a/inc/lvgl/src/core/lv_obj_class.h b/inc/lvgl/src/core/lv_obj_class.h new file mode 100644 index 0000000..1c3a7b3 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_class.h @@ -0,0 +1,89 @@ +/** + * @file lv_obj_class.h + * + */ + +#ifndef LV_OBJ_CLASS_H +#define LV_OBJ_CLASS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../misc/lv_area.h" +#include "lv_obj_property.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_OBJ_CLASS_EDITABLE_INHERIT, /**< Check the base class. Must have 0 value to let zero initialized class inherit*/ + LV_OBJ_CLASS_EDITABLE_TRUE, + LV_OBJ_CLASS_EDITABLE_FALSE, +} lv_obj_class_editable_t; + +typedef enum { + LV_OBJ_CLASS_GROUP_DEF_INHERIT, /**< Check the base class. Must have 0 value to let zero initialized class inherit*/ + LV_OBJ_CLASS_GROUP_DEF_TRUE, + LV_OBJ_CLASS_GROUP_DEF_FALSE, +} lv_obj_class_group_def_t; + +typedef enum { + LV_OBJ_CLASS_THEME_INHERITABLE_FALSE, /**< Do not inherit theme from base class. */ + LV_OBJ_CLASS_THEME_INHERITABLE_TRUE, +} lv_obj_class_theme_inheritable_t; + +typedef void (*lv_obj_class_event_cb_t)(lv_obj_class_t * class_p, lv_event_t * e); +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an object form a class descriptor + * @param class_p pointer to a class + * @param parent pointer to an object where the new object should be created + * @return pointer to the created object + */ +lv_obj_t * lv_obj_class_create_obj(const lv_obj_class_t * class_p, lv_obj_t * parent); + +void lv_obj_class_init_obj(lv_obj_t * obj); + +bool lv_obj_is_editable(lv_obj_t * obj); + +bool lv_obj_is_group_def(lv_obj_t * obj); + +#if LV_USE_EXT_DATA +/** + * @brief Associates an array of external data pointers with an LVGL object + * + * Associates custom user data with an LVGL object and specifies a destructor function + * that will be automatically invoked when the object is deleted to properly clean up + * the associated resources. + * + * @param obj Target LVGL object + * @param data User-defined data pointer to associate with a object + * @param free_cb Cleanup function called for each non-NULL data pointer during + * object deletion. Receives single data pointer as parameter. + * NULL means no automatic cleanup. + */ +void lv_obj_set_external_data(lv_obj_t * obj, void * data, void (* free_cb)(void * data)); +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_CLASS_H*/ diff --git a/inc/lvgl/src/core/lv_obj_class_private.h b/inc/lvgl/src/core/lv_obj_class_private.h new file mode 100644 index 0000000..de2b173 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_class_private.h @@ -0,0 +1,78 @@ +/** + * @file lv_obj_class_private.h + * + */ + +#ifndef LV_OBJ_CLASS_PRIVATE_H +#define LV_OBJ_CLASS_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_class.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Describe the common methods of every object. + * Similar to a C++ class. + */ +struct _lv_obj_class_t { + const lv_obj_class_t * base_class; + /** class_p is the final class while obj->class_p is the class currently being [de]constructed. */ + void (*constructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); + void (*destructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj); + + /** class_p is the class in which event is being processed. */ + void (*event_cb)(const lv_obj_class_t * class_p, lv_event_t * e); /**< Widget type specific event function*/ + +#if LV_USE_OBJ_PROPERTY + uint32_t prop_index_start; + uint32_t prop_index_end; + const lv_property_ops_t * properties; + uint32_t properties_count; + +#if LV_USE_OBJ_PROPERTY_NAME + /* An array of property ID and name */ + const lv_property_name_t * property_names; + uint32_t names_count; +#endif +#endif + + void * user_data; + const char * name; + int32_t width_def; + int32_t height_def; + uint32_t editable : 2; /**< Value from ::lv_obj_class_editable_t*/ + uint32_t group_def : 2; /**< Value from ::lv_obj_class_group_def_t*/ + uint32_t instance_size : 16; + uint32_t theme_inheritable : 1; /**< Value from ::lv_obj_class_theme_inheritable_t*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_obj_destruct(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_CLASS_PRIVATE_H*/ diff --git a/inc/lvgl/src/core/lv_obj_draw.c b/inc/lvgl/src/core/lv_obj_draw.c new file mode 100644 index 0000000..1414e85 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_draw.c @@ -0,0 +1,512 @@ +/** + * @file lv_obj_draw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_draw_private.h" +#include "lv_obj_private.h" +#include "lv_obj_style.h" +#include "../display/lv_display.h" +#include "../indev/lv_indev.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline lv_opa_t get_layer_opa(const lv_obj_t * obj, lv_part_t part, const lv_draw_dsc_base_t * base_dsc); +static lv_color_t normal_apply_layer_recolor(const lv_obj_t * obj, lv_part_t part, const lv_draw_dsc_base_t * base_dsc, + lv_color_t color); +static lv_color32_t image_apply_layer_recolor(const lv_obj_t * obj, lv_part_t part, + const lv_draw_dsc_base_t * base_dsc, lv_color_t color, lv_opa_t opa); + +static void drop_shadow_init(const lv_obj_t * obj, lv_part_t part, lv_draw_dsc_base_t * base_dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_rect_dsc_t * draw_dsc) +{ + LV_PROFILER_DRAW_BEGIN; + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + lv_opa_t opa = get_layer_opa(obj, part, &draw_dsc->base); + if(part != LV_PART_MAIN) { + if(opa <= LV_OPA_MIN) { + draw_dsc->bg_opa = LV_OPA_TRANSP; + draw_dsc->bg_image_opa = LV_OPA_TRANSP; + draw_dsc->border_opa = LV_OPA_TRANSP; + draw_dsc->outline_opa = LV_OPA_TRANSP; + draw_dsc->shadow_opa = LV_OPA_TRANSP; + LV_PROFILER_DRAW_END; + return; + } + } + + draw_dsc->radius = lv_obj_get_style_radius(obj, part); + + if(draw_dsc->bg_opa != LV_OPA_TRANSP) { + draw_dsc->bg_opa = lv_obj_get_style_bg_opa(obj, part); + if(draw_dsc->bg_opa > LV_OPA_MIN) { + lv_color_t bg_color = lv_obj_get_style_bg_color_filtered(obj, part); + draw_dsc->bg_color = normal_apply_layer_recolor(obj, part, &draw_dsc->base, bg_color); + const lv_grad_dsc_t * grad = lv_obj_get_style_bg_grad(obj, part); + if(grad && grad->dir != LV_GRAD_DIR_NONE) { + lv_memcpy(&draw_dsc->bg_grad, grad, sizeof(*grad)); + } + else { + draw_dsc->bg_grad.dir = lv_obj_get_style_bg_grad_dir(obj, part); + if(draw_dsc->bg_grad.dir != LV_GRAD_DIR_NONE) { + draw_dsc->bg_grad.stops[0].color = draw_dsc->bg_color; + lv_color_t bg_grad_color = lv_obj_get_style_bg_grad_color_filtered(obj, part); + draw_dsc->bg_grad.stops[1].color = normal_apply_layer_recolor(obj, part, &draw_dsc->base, bg_grad_color); + draw_dsc->bg_grad.stops[0].frac = lv_obj_get_style_bg_main_stop(obj, part); + draw_dsc->bg_grad.stops[1].frac = lv_obj_get_style_bg_grad_stop(obj, part); + draw_dsc->bg_grad.stops[0].opa = lv_obj_get_style_bg_main_opa(obj, part); + draw_dsc->bg_grad.stops[1].opa = lv_obj_get_style_bg_grad_opa(obj, part); + } + } + } + } + + if(draw_dsc->border_opa != LV_OPA_TRANSP) { + draw_dsc->border_width = lv_obj_get_style_border_width(obj, part); + if(draw_dsc->border_width) { + draw_dsc->border_opa = lv_obj_get_style_border_opa(obj, part); + if(draw_dsc->border_opa > LV_OPA_MIN) { + draw_dsc->border_side = lv_obj_get_style_border_side(obj, part); + lv_color_t border_color = lv_obj_get_style_border_color_filtered(obj, part); + draw_dsc->border_color = normal_apply_layer_recolor(obj, part, &draw_dsc->base, border_color); + } + } + } + + if(draw_dsc->outline_opa != LV_OPA_TRANSP) { + draw_dsc->outline_width = lv_obj_get_style_outline_width(obj, part); + if(draw_dsc->outline_width) { + draw_dsc->outline_opa = lv_obj_get_style_outline_opa(obj, part); + if(draw_dsc->outline_opa > LV_OPA_MIN) { + draw_dsc->outline_pad = lv_obj_get_style_outline_pad(obj, part); + lv_color_t outline_color = lv_obj_get_style_outline_color_filtered(obj, part); + draw_dsc->outline_color = normal_apply_layer_recolor(obj, part, &draw_dsc->base, outline_color); + } + } + } + + if(draw_dsc->bg_image_opa != LV_OPA_TRANSP) { + draw_dsc->bg_image_src = lv_obj_get_style_bg_image_src(obj, part); + if(draw_dsc->bg_image_src) { + draw_dsc->bg_image_opa = lv_obj_get_style_bg_image_opa(obj, part); + if(draw_dsc->bg_image_opa > LV_OPA_MIN) { + if(lv_image_src_get_type(draw_dsc->bg_image_src) == LV_IMAGE_SRC_SYMBOL) { + draw_dsc->bg_image_symbol_font = lv_obj_get_style_text_font(obj, part); + lv_color_t text_color = lv_obj_get_style_text_color_filtered(obj, part); + draw_dsc->bg_image_recolor = normal_apply_layer_recolor(obj, part, &draw_dsc->base, text_color); + } + else { + lv_color_t bg_image_recolor = lv_obj_get_style_bg_image_recolor_filtered(obj, part); + lv_opa_t bg_image_recolor_opa = lv_obj_get_style_bg_image_recolor_opa(obj, part); + lv_color32_t result = image_apply_layer_recolor(obj, part, &draw_dsc->base, bg_image_recolor, bg_image_recolor_opa); + draw_dsc->bg_image_recolor_opa = result.alpha; + draw_dsc->bg_image_recolor = lv_color_make(result.red, result.green, result.blue); + draw_dsc->bg_image_tiled = lv_obj_get_style_bg_image_tiled(obj, part); + } + + draw_dsc->bg_image_colorkey = lv_obj_get_style_image_colorkey(obj, part); + } + } + } + + if(draw_dsc->shadow_opa) { + draw_dsc->shadow_width = lv_obj_get_style_shadow_width(obj, part); + if(draw_dsc->shadow_width) { + if(draw_dsc->shadow_opa > LV_OPA_MIN) { + draw_dsc->shadow_opa = lv_obj_get_style_shadow_opa(obj, part); + if(draw_dsc->shadow_opa > LV_OPA_MIN) { + draw_dsc->shadow_offset_x = lv_obj_get_style_shadow_offset_x(obj, part); + draw_dsc->shadow_offset_y = lv_obj_get_style_shadow_offset_y(obj, part); + draw_dsc->shadow_spread = lv_obj_get_style_shadow_spread(obj, part); + lv_color_t shadow_color = lv_obj_get_style_shadow_color_filtered(obj, part); + draw_dsc->shadow_color = normal_apply_layer_recolor(obj, part, &draw_dsc->base, shadow_color); + } + } + } + } + + if(opa < LV_OPA_MAX) { + draw_dsc->bg_opa = LV_OPA_MIX2(draw_dsc->bg_opa, opa); + draw_dsc->bg_image_opa = LV_OPA_MIX2(draw_dsc->bg_image_opa, opa); + draw_dsc->border_opa = LV_OPA_MIX2(draw_dsc->border_opa, opa); + draw_dsc->shadow_opa = LV_OPA_MIX2(draw_dsc->shadow_opa, opa); + draw_dsc->outline_opa = LV_OPA_MIX2(draw_dsc->outline_opa, opa); + } + + drop_shadow_init(obj, part, &draw_dsc->base); + + LV_PROFILER_DRAW_END; +} + +void lv_obj_init_draw_label_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_label_dsc_t * draw_dsc) +{ + LV_PROFILER_DRAW_BEGIN; + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + draw_dsc->opa = lv_obj_get_style_text_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) { + LV_PROFILER_DRAW_END; + return; + } + + lv_opa_t opa = get_layer_opa(obj, part, &draw_dsc->base); + if(opa < LV_OPA_MAX) { + draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); + } + if(draw_dsc->opa <= LV_OPA_MIN) { + LV_PROFILER_DRAW_END; + return; + } + + + lv_color_t text_color = lv_obj_get_style_text_color_filtered(obj, part); + draw_dsc->color = normal_apply_layer_recolor(obj, part, &draw_dsc->base, text_color); + draw_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, part); + draw_dsc->line_space = lv_obj_get_style_text_line_space(obj, part); + draw_dsc->decor = lv_obj_get_style_text_decor(obj, part); + + draw_dsc->font = lv_obj_get_style_text_font(obj, part); + +#if LV_USE_BIDI + draw_dsc->bidi_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); +#endif + + draw_dsc->align = lv_obj_get_style_text_align(obj, part); + + drop_shadow_init(obj, part, &draw_dsc->base); + + LV_PROFILER_DRAW_END; +} + +void lv_obj_init_draw_image_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_image_dsc_t * draw_dsc) +{ + LV_PROFILER_DRAW_BEGIN; + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + draw_dsc->opa = lv_obj_get_style_image_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) { + LV_PROFILER_DRAW_END; + return; + } + + lv_opa_t opa = get_layer_opa(obj, part, &draw_dsc->base); + if(opa < LV_OPA_MAX) { + draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); + } + if(draw_dsc->opa <= LV_OPA_MIN) { + LV_PROFILER_DRAW_END; + return; + } + + draw_dsc->rotation = 0; + draw_dsc->scale_x = LV_SCALE_NONE; + draw_dsc->scale_y = LV_SCALE_NONE; + draw_dsc->pivot.x = lv_area_get_width(&obj->coords) / 2; + draw_dsc->pivot.y = lv_area_get_height(&obj->coords) / 2; + + lv_color_t recolor = lv_obj_get_style_image_recolor_filtered(obj, part); + lv_opa_t recolor_opa = lv_obj_get_style_image_recolor_opa(obj, part); + lv_color32_t result = image_apply_layer_recolor(obj, part, &draw_dsc->base, recolor, recolor_opa); + draw_dsc->recolor_opa = result.alpha; + draw_dsc->recolor = lv_color_make(result.red, result.green, result.blue); + + draw_dsc->colorkey = lv_obj_get_style_image_colorkey(obj, part); + + if(part != LV_PART_MAIN) draw_dsc->blend_mode = lv_obj_get_style_blend_mode(obj, part); + + drop_shadow_init(obj, part, &draw_dsc->base); + + LV_PROFILER_DRAW_END; +} + +void lv_obj_init_draw_line_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_line_dsc_t * draw_dsc) +{ + LV_PROFILER_DRAW_BEGIN; + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + draw_dsc->opa = lv_obj_get_style_line_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) { + LV_PROFILER_DRAW_END; + return; + } + + lv_opa_t opa = get_layer_opa(obj, part, &draw_dsc->base); + if(opa < LV_OPA_MAX) { + draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); + } + if(draw_dsc->opa <= LV_OPA_MIN) { + LV_PROFILER_DRAW_END; + return; + } + + draw_dsc->width = lv_obj_get_style_line_width(obj, part); + if(draw_dsc->width == 0) { + LV_PROFILER_DRAW_END; + return; + } + + lv_color_t line_color = lv_obj_get_style_line_color_filtered(obj, part); + draw_dsc->color = normal_apply_layer_recolor(obj, part, &draw_dsc->base, line_color); + + draw_dsc->dash_width = lv_obj_get_style_line_dash_width(obj, part); + if(draw_dsc->dash_width) { + draw_dsc->dash_gap = lv_obj_get_style_line_dash_gap(obj, part); + } + + draw_dsc->round_start = lv_obj_get_style_line_rounded(obj, part); + draw_dsc->round_end = draw_dsc->round_start; + + drop_shadow_init(obj, part, &draw_dsc->base); + + LV_PROFILER_DRAW_END; +} + +void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_arc_dsc_t * draw_dsc) +{ + LV_PROFILER_DRAW_BEGIN; + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + draw_dsc->width = lv_obj_get_style_arc_width(obj, part); + if(draw_dsc->width == 0) { + LV_PROFILER_DRAW_END; + return; + } + + draw_dsc->opa = lv_obj_get_style_arc_opa(obj, part); + if(draw_dsc->opa <= LV_OPA_MIN) { + LV_PROFILER_DRAW_END; + return; + } + + lv_opa_t opa = get_layer_opa(obj, part, &draw_dsc->base); + if(opa < LV_OPA_MAX) { + draw_dsc->opa = LV_OPA_MIX2(draw_dsc->opa, opa); + } + if(draw_dsc->opa <= LV_OPA_MIN) { + LV_PROFILER_DRAW_END; + return; + } + + lv_color_t arc_color = lv_obj_get_style_arc_color_filtered(obj, part); + draw_dsc->color = normal_apply_layer_recolor(obj, part, &draw_dsc->base, arc_color); + draw_dsc->img_src = lv_obj_get_style_arc_image_src(obj, part); + + draw_dsc->rounded = lv_obj_get_style_arc_rounded(obj, part); + + drop_shadow_init(obj, part, &draw_dsc->base); + + LV_PROFILER_DRAW_END; +} + +void lv_obj_init_draw_blur_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_blur_dsc_t * draw_dsc) +{ + LV_PROFILER_DRAW_BEGIN; + draw_dsc->base.obj = obj; + draw_dsc->base.part = part; + + draw_dsc->blur_radius = lv_obj_get_style_blur_radius(obj, part); + draw_dsc->quality = lv_obj_get_style_blur_quality(obj, part); + + /*Radius might be set earlier as it's already known*/ + if(draw_dsc->corner_radius == 0) { + draw_dsc->corner_radius = lv_obj_get_style_radius(obj, part); + } + + LV_PROFILER_DRAW_END; +} + + +int32_t lv_obj_calculate_ext_draw_size(lv_obj_t * obj, lv_part_t part) +{ + LV_PROFILER_DRAW_BEGIN; + int32_t s = 0; + + int32_t sh_width = lv_obj_get_style_shadow_width(obj, part); + if(sh_width) { + lv_opa_t sh_opa = lv_obj_get_style_shadow_opa(obj, part); + if(sh_opa > LV_OPA_MIN) { + sh_width = sh_width / 2 + 1; /*The blur adds only half width*/ + sh_width += lv_obj_get_style_shadow_spread(obj, part); + int32_t sh_ofs_x = lv_obj_get_style_shadow_offset_x(obj, part); + int32_t sh_ofs_y = lv_obj_get_style_shadow_offset_y(obj, part); + sh_width += LV_MAX(LV_ABS(sh_ofs_x), LV_ABS(sh_ofs_y)); + s = LV_MAX(s, sh_width); + } + } + + int32_t outline_width = lv_obj_get_style_outline_width(obj, part); + if(outline_width) { + lv_opa_t outline_opa = lv_obj_get_style_outline_opa(obj, part); + if(outline_opa > LV_OPA_MIN) { + int32_t outline_pad = lv_obj_get_style_outline_pad(obj, part); + s = LV_MAX(s, outline_pad + outline_width); + } + } + + int32_t drop_shadow_size = 0; + if(lv_obj_get_style_drop_shadow_opa(obj, part) > 0) { + drop_shadow_size += LV_MAX(LV_ABS(lv_obj_get_style_drop_shadow_offset_x(obj, part)), + LV_ABS(lv_obj_get_style_drop_shadow_offset_y(obj, part))); + + drop_shadow_size += lv_obj_get_style_drop_shadow_radius(obj, part) + 1; + } + s += drop_shadow_size; + + int32_t w = lv_obj_get_style_transform_width(obj, part); + int32_t h = lv_obj_get_style_transform_height(obj, part); + int32_t wh = LV_MAX(w, h); + if(wh > 0) s += wh; + + LV_PROFILER_DRAW_END; + return s; +} + +void lv_obj_refresh_ext_draw_size(lv_obj_t * obj) +{ + LV_PROFILER_DRAW_BEGIN; + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t s_old = lv_obj_get_ext_draw_size(obj); + int32_t s_new = 0; + lv_obj_send_event(obj, LV_EVENT_REFR_EXT_DRAW_SIZE, &s_new); + + /*Store the result if the special attrs already allocated*/ + if(obj->spec_attr) { + obj->spec_attr->ext_draw_size = s_new; + } + /*Allocate spec. attrs. only if the result is not zero. + *Zero is the default value if the spec. attr. are not defined.*/ + else if(s_new != 0) { + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->ext_draw_size = s_new; + } + + if(s_new != s_old) lv_obj_invalidate(obj); + LV_PROFILER_DRAW_END; +} + +int32_t lv_obj_get_ext_draw_size(const lv_obj_t * obj) +{ + if(obj->spec_attr) return obj->spec_attr->ext_draw_size; + else return 0; +} + +lv_layer_type_t lv_obj_get_layer_type(const lv_obj_t * obj) +{ + + if(obj->spec_attr) return (lv_layer_type_t)obj->spec_attr->layer_type; + else return LV_LAYER_TYPE_NONE; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline lv_opa_t get_layer_opa(const lv_obj_t * obj, lv_part_t part, const lv_draw_dsc_base_t * base_dsc) +{ + if(base_dsc->layer) { + /* Accessing the layer opa directly is faster than using get style opa recursive */ + if(part == LV_PART_MAIN) { + return base_dsc->layer->opa; + } + + return LV_OPA_MIX2(base_dsc->layer->opa, lv_obj_get_style_opa(obj, part)); + } + + /* fallback to old recursive style opa */ + return lv_obj_get_style_opa_recursive(obj, part); +} + + +static lv_color_t normal_apply_layer_recolor(const lv_obj_t * obj, lv_part_t part, const lv_draw_dsc_base_t * base_dsc, + lv_color_t color) +{ + lv_color32_t recolor; + + if(base_dsc->layer) { + recolor = base_dsc->layer->recolor; + if(part != LV_PART_MAIN) { + recolor = lv_obj_style_apply_recolor(obj, part, recolor); + } + } + else { + recolor = lv_obj_get_style_recolor_recursive(obj, part); + } + + return lv_color_mix(lv_color_make(recolor.red, recolor.green, recolor.blue), color, recolor.alpha); +} + + +static lv_color32_t image_apply_layer_recolor(const lv_obj_t * obj, lv_part_t part, + const lv_draw_dsc_base_t * base_dsc, lv_color_t color, lv_opa_t opa) +{ + lv_color32_t recolor; + + if(base_dsc->layer) { + recolor = base_dsc->layer->recolor; + if(part != LV_PART_MAIN) { + recolor = lv_obj_style_apply_recolor(obj, part, recolor); + } + } + else { + recolor = lv_obj_get_style_recolor_recursive(obj, part); + } + + if(opa > LV_OPA_TRANSP && recolor.alpha > LV_OPA_TRANSP) { + return lv_color_over32(recolor, lv_color_to_32(color, opa)); + } + else if(recolor.alpha > LV_OPA_TRANSP) { + return recolor; + } + else { + return lv_color_to_32(color, opa); + } +} + +static void drop_shadow_init(const lv_obj_t * obj, lv_part_t part, lv_draw_dsc_base_t * base_dsc) +{ + base_dsc->drop_shadow_opa = lv_obj_get_style_drop_shadow_opa(obj, part); + if(base_dsc->drop_shadow_opa) { + base_dsc->drop_shadow_blur_radius = lv_obj_get_style_drop_shadow_radius(obj, part); + base_dsc->drop_shadow_ofs_x = lv_obj_get_style_drop_shadow_offset_x(obj, part); + base_dsc->drop_shadow_ofs_y = lv_obj_get_style_drop_shadow_offset_y(obj, part); + base_dsc->drop_shadow_color = lv_obj_get_style_drop_shadow_color(obj, part); + base_dsc->drop_shadow_color = normal_apply_layer_recolor(obj, part, base_dsc, base_dsc->drop_shadow_color); + + base_dsc->drop_shadow_quality = lv_obj_get_style_drop_shadow_quality(obj, part); + } +} diff --git a/inc/lvgl/src/core/lv_obj_draw.h b/inc/lvgl/src/core/lv_obj_draw.h new file mode 100644 index 0000000..1f6c287 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_draw.h @@ -0,0 +1,142 @@ +/** + * @file lv_obj_draw.h + * + */ + +#ifndef LV_OBJ_DRAW_H +#define LV_OBJ_DRAW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../draw/lv_draw_rect.h" +#include "../draw/lv_draw_label.h" +#include "../draw/lv_draw_image.h" +#include "../draw/lv_draw_line.h" +#include "../draw/lv_draw_arc.h" +#include "../draw/lv_draw_triangle.h" +#include "../draw/lv_draw_blur.h" +#include "lv_obj_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Store the type of layer required to render a widget.*/ +typedef enum { + /**No layer is needed. */ + LV_LAYER_TYPE_NONE, + + /**Simple layer means that the layer can be rendered in chunks. + * For example with opa_layered = 140 it's possible to render only 10 lines + * from the layer. When it's ready go to the next 10 lines. + * It avoids large memory allocations for the layer buffer. + * The buffer size for a chunk can be set by `LV_DRAW_LAYER_SIMPLE_BUF_SIZE` in lv_conf.h.*/ + LV_LAYER_TYPE_SIMPLE, + + /**The widget is transformed and cannot be rendered in chunks. + * It's because - due to the transformations - pixel outside of + * a given area will also contribute to the final image. + * In this case there is no limitation on the buffer size. + * LVGL will allocate as large buffer as needed to render the transformed area.*/ + LV_LAYER_TYPE_TRANSFORM, +} lv_layer_type_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a rectangle draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * If an `..._opa` field is set to `LV_OPA_TRANSP` the related properties won't be initialized. + * Should be initialized with `lv_draw_rect_dsc_init(draw_dsc)`. + * @note Only the relevant fields will be set. + * E.g. if `border width == 0` the other border properties won't be evaluated. + */ +void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_rect_dsc_t * draw_dsc); + +/** + * Initialize a label draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * If the `opa` field is set to or the property is equal to `LV_OPA_TRANSP` the rest won't be initialized. + * Should be initialized with `lv_draw_label_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_label_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_label_dsc_t * draw_dsc); + +/** + * Initialize an image draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_image_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_image_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_image_dsc_t * draw_dsc); + +/** + * Initialize a line draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_line_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_line_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_line_dsc_t * draw_dsc); + +/** + * Initialize an arc draw descriptor from an object's styles in its current state + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_arc_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_arc_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_arc_dsc_t * draw_dsc); + + +/** + * Initialize a blur draw descriptor from an object's styles in its current state. + * draw_dsc->radius will only be calculated if it's 0 initially. Radius can be set before calling this function + * to avoid getting it twice. + * @param obj pointer to an object + * @param part part of the object, e.g. `LV_PART_MAIN`, `LV_PART_SCROLLBAR`, `LV_PART_KNOB`, etc + * @param draw_dsc the descriptor to initialize. + * Should be initialized with `lv_draw_blur_dsc_init(draw_dsc)`. + */ +void lv_obj_init_draw_blur_dsc(lv_obj_t * obj, lv_part_t part, lv_draw_blur_dsc_t * draw_dsc); + +/** + * Get the required extra size (around the object's part) to draw shadow, outline, value etc. + * @param obj pointer to an object + * @param part part of the object + * @return the extra size required around the object + */ +int32_t lv_obj_calculate_ext_draw_size(lv_obj_t * obj, lv_part_t part); + +/** + * Send a 'LV_EVENT_REFR_EXT_DRAW_SIZE' Call the ancestor's event handler to the object to refresh the value of the extended draw size. + * The result will be saved in `obj`. + * @param obj pointer to an object + */ +void lv_obj_refresh_ext_draw_size(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_DRAW_H*/ diff --git a/inc/lvgl/src/core/lv_obj_draw_private.h b/inc/lvgl/src/core/lv_obj_draw_private.h new file mode 100644 index 0000000..36c8bff --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_draw_private.h @@ -0,0 +1,48 @@ +/** + * @file lv_obj_draw_private.h + * + */ + +#ifndef LV_OBJ_DRAW_PRIVATE_H +#define LV_OBJ_DRAW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the extended draw area of an object. + * @param obj pointer to an object + * @return the size extended draw area around the real coordinates + */ +int32_t lv_obj_get_ext_draw_size(const lv_obj_t * obj); + +lv_layer_type_t lv_obj_get_layer_type(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_DRAW_PRIVATE_H*/ diff --git a/inc/lvgl/src/core/lv_obj_event.c b/inc/lvgl/src/core/lv_obj_event.c new file mode 100644 index 0000000..bbb44fb --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_event.c @@ -0,0 +1,491 @@ +/** + * @file lv_obj_event.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_event_private.h" +#include "lv_obj_event_private.h" +#include "lv_obj_class_private.h" +#include "lv_obj_private.h" +#include "../indev/lv_indev.h" +#include "../indev/lv_indev_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t event_send_core(lv_event_t * e); +static bool event_is_bubbled(lv_event_t * e); +static bool event_is_trickled(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_EVENT + #define LV_TRACE_EVENT(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_EVENT(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_obj_send_event(lv_obj_t * obj, lv_event_code_t event_code, void * param) +{ + if(obj == NULL) return LV_RESULT_OK; + + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_event_t e; + e.current_target = obj; + e.original_target = obj; + e.code = event_code; + e.user_data = NULL; + e.param = param; + e.deleted = 0; + e.stop_bubbling = 0; + e.stop_processing = 0; + e.stop_trickling = 0; + + lv_event_push(&e); + + /*Send the event*/ + lv_result_t res = event_send_core(&e); + + /*Remove this element from the list*/ + lv_event_pop(&e); + + return res; +} + +lv_result_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e) +{ + const lv_obj_class_t * base; + if(class_p == NULL) base = ((lv_obj_t *)e->current_target)->class_p; + else base = class_p->base_class; + + /*Find a base in which call the ancestor's event handler_cb if set*/ + while(base && base->event_cb == NULL) base = base->base_class; + + if(base == NULL) return LV_RESULT_OK; + if(base->event_cb == NULL) return LV_RESULT_OK; + + /*Call the actual event callback*/ + e->user_data = NULL; + LV_PROFILER_EVENT_BEGIN_TAG(lv_event_code_get_name(e->code)); + base->event_cb(base, e); + LV_PROFILER_EVENT_END_TAG(lv_event_code_get_name(e->code)); + + lv_result_t res = LV_RESULT_OK; + /*Stop if the object is deleted*/ + if(e->deleted) res = LV_RESULT_INVALID; + + return res; +} + +lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_allocate_spec_attr(obj); + + return lv_event_add(&obj->spec_attr->event_list, event_cb, filter, user_data); +} + +uint32_t lv_obj_get_event_count(lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + if(obj->spec_attr == NULL) return 0; + return lv_event_get_count(&obj->spec_attr->event_list); +} + +lv_event_dsc_t * lv_obj_get_event_dsc(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_NULL(obj); + if(obj->spec_attr == NULL) return NULL; + return lv_event_get_dsc(&obj->spec_attr->event_list, index); +} + +bool lv_obj_remove_event(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_NULL(obj); + if(obj->spec_attr == NULL) return false; + return lv_event_remove(&obj->spec_attr->event_list, index); +} + +bool lv_obj_remove_event_dsc(lv_obj_t * obj, lv_event_dsc_t * dsc) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(dsc); + if(obj->spec_attr == NULL) return false; + return lv_event_remove_dsc(&obj->spec_attr->event_list, dsc); +} + +uint32_t lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb) +{ + LV_ASSERT_NULL(obj); + + uint32_t event_cnt = lv_obj_get_event_count(obj); + uint32_t removed_count = 0; + int32_t i; + + if(event_cnt == 0) return 0; + + for(i = event_cnt - 1; i >= 0; i--) { + lv_event_dsc_t * dsc = lv_obj_get_event_dsc(obj, i); + if(dsc && dsc->cb == event_cb) { + lv_obj_remove_event(obj, i); + removed_count++; + } + } + + return removed_count; +} + +uint32_t lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, void * user_data) +{ + LV_ASSERT_NULL(obj); + + uint32_t event_cnt = lv_obj_get_event_count(obj); + uint32_t removed_count = 0; + int32_t i; + + if(event_cnt == 0) return 0; + + for(i = event_cnt - 1; i >= 0; i--) { + lv_event_dsc_t * dsc = lv_obj_get_event_dsc(obj, i); + if(dsc && (event_cb == NULL || dsc->cb == event_cb) && dsc->user_data == user_data) { + lv_obj_remove_event(obj, i); + removed_count ++; + } + } + + return removed_count; +} + +lv_obj_t * lv_event_get_current_target_obj(lv_event_t * e) +{ + return lv_event_get_current_target(e); +} + +lv_obj_t * lv_event_get_target_obj(lv_event_t * e) +{ + return lv_event_get_target(e); +} + +lv_indev_t * lv_event_get_indev(lv_event_t * e) +{ + + if(e->code == LV_EVENT_PRESSED || + e->code == LV_EVENT_PRESSING || + e->code == LV_EVENT_PRESS_LOST || + e->code == LV_EVENT_SHORT_CLICKED || + e->code == LV_EVENT_LONG_PRESSED || + e->code == LV_EVENT_LONG_PRESSED_REPEAT || + e->code == LV_EVENT_CLICKED || + e->code == LV_EVENT_RELEASED || + e->code == LV_EVENT_SCROLL_BEGIN || + e->code == LV_EVENT_SCROLL_END || + e->code == LV_EVENT_SCROLL || + e->code == LV_EVENT_GESTURE || + e->code == LV_EVENT_KEY || + e->code == LV_EVENT_FOCUSED || + e->code == LV_EVENT_DEFOCUSED || + e->code == LV_EVENT_LEAVE || + e->code == LV_EVENT_HOVER_OVER || + e->code == LV_EVENT_HOVER_LEAVE) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +lv_layer_t * lv_event_get_layer(lv_event_t * e) +{ + if(e->code == LV_EVENT_DRAW_MAIN || + e->code == LV_EVENT_DRAW_MAIN_BEGIN || + e->code == LV_EVENT_DRAW_MAIN_END || + e->code == LV_EVENT_DRAW_POST || + e->code == LV_EVENT_DRAW_POST_BEGIN || + e->code == LV_EVENT_DRAW_POST_END) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +const lv_area_t * lv_event_get_old_size(lv_event_t * e) +{ + if(e->code == LV_EVENT_SIZE_CHANGED) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +uint32_t lv_event_get_key(lv_event_t * e) +{ + if(e->code == LV_EVENT_KEY) { + uint32_t * k = lv_event_get_param(e); + if(k) return *k; + else return 0; + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +int32_t lv_event_get_rotary_diff(lv_event_t * e) +{ + if(e->code == LV_EVENT_ROTARY) { + int32_t * r = lv_event_get_param(e); + if(r) return *r; + else return 0; + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e) +{ + if(e->code == LV_EVENT_SCROLL_BEGIN) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +void lv_event_set_ext_draw_size(lv_event_t * e, int32_t size) +{ + if(e->code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t * cur_size = lv_event_get_param(e); + *cur_size = LV_MAX(*cur_size, size); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + } +} + +lv_point_t * lv_event_get_self_size_info(lv_event_t * e) +{ + if(e->code == LV_EVENT_GET_SELF_SIZE) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e) +{ + if(e->code == LV_EVENT_HIT_TEST) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +const lv_area_t * lv_event_get_cover_area(lv_event_t * e) +{ + if(e->code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * p = lv_event_get_param(e); + return p->area; + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res) +{ + if(e->code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * p = lv_event_get_param(e); + if(res > p->res) p->res = res; /*Save only "stronger" results*/ + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + } +} + +lv_draw_task_t * lv_event_get_draw_task(lv_event_t * e) +{ + if(e->code == LV_EVENT_DRAW_TASK_ADDED) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +lv_state_t lv_event_get_prev_state(lv_event_t * e) +{ + if(e->code == LV_EVENT_STATE_CHANGED) { + lv_state_t * state = lv_event_get_param(e); + return state ? *state : 0; + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return 0; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t event_send_core(lv_event_t * e) +{ + LV_TRACE_EVENT("Sending event %d to %p with %p param", e->code, (void *)e->original_target, e->param); + + lv_indev_t * indev_act = lv_indev_active(); + if(indev_act) { + if(e->stop_processing) return LV_RESULT_OK; + if(e->deleted) return LV_RESULT_INVALID; + } + + lv_obj_t * target = e->current_target; + lv_result_t res = LV_RESULT_OK; + lv_event_list_t * list = target->spec_attr ? &target->spec_attr->event_list : NULL; + + res = lv_event_send(list, e, true); + if(res != LV_RESULT_OK || e->stop_processing) return res; + + res = lv_obj_event_base(NULL, e); + if(res != LV_RESULT_OK || e->stop_processing) return res; + + res = lv_event_send(list, e, false); + if(res != LV_RESULT_OK || e->stop_processing) return res; + + lv_obj_t * parent = lv_obj_get_parent(e->current_target); + if(parent && event_is_bubbled(e)) { + e->current_target = parent; + res = event_send_core(e); + } + if(res != LV_RESULT_OK) return res; + + /*Trickle down to children if enabled*/ + if(event_is_trickled(e)) { + uint32_t child_count = lv_obj_get_child_count(target); + + /* we don't want the event to bubble up again when trickling down */ + e->stop_bubbling = 1; + + for(uint32_t i = 0; i < child_count && res == LV_RESULT_OK && !e->stop_processing; i++) { + lv_obj_t * child = lv_obj_get_child(target, i); + if(child) { + e->current_target = child; + res = event_send_core(e); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("Trickle down event %d to child %p failed", e->code, (void *)child); + break; + } + } + } + } + + return res; +} + +static bool event_is_bubbled(lv_event_t * e) +{ + if(e->stop_bubbling) return false; + + /*Event codes that always bubble*/ + switch(e->code) { + case LV_EVENT_CHILD_CREATED: + case LV_EVENT_CHILD_DELETED: + return true; + default: + break; + } + + /*Check other codes only if bubbling is enabled*/ + if(lv_obj_has_flag(e->current_target, LV_OBJ_FLAG_EVENT_BUBBLE) == false) return false; + + switch(e->code) { + case LV_EVENT_HIT_TEST: + case LV_EVENT_COVER_CHECK: + case LV_EVENT_REFR_EXT_DRAW_SIZE: + case LV_EVENT_DRAW_MAIN_BEGIN: + case LV_EVENT_DRAW_MAIN: + case LV_EVENT_DRAW_MAIN_END: + case LV_EVENT_DRAW_POST_BEGIN: + case LV_EVENT_DRAW_POST: + case LV_EVENT_DRAW_POST_END: + case LV_EVENT_DRAW_TASK_ADDED: + case LV_EVENT_REFRESH: + case LV_EVENT_DELETE: + case LV_EVENT_CHILD_CREATED: + case LV_EVENT_CHILD_DELETED: + case LV_EVENT_CHILD_CHANGED: + case LV_EVENT_SIZE_CHANGED: + case LV_EVENT_STYLE_CHANGED: + case LV_EVENT_GET_SELF_SIZE: + return false; + default: + return true; + } +} + +static bool event_is_trickled(lv_event_t * e) +{ + if(e->stop_trickling) return false; + + /*Check other codes only if trickle is enabled*/ + if(lv_obj_has_flag(e->current_target, LV_OBJ_FLAG_EVENT_TRICKLE) == false) return false; + + switch(e->code) { + case LV_EVENT_HIT_TEST: + case LV_EVENT_COVER_CHECK: + case LV_EVENT_REFR_EXT_DRAW_SIZE: + case LV_EVENT_DRAW_MAIN_BEGIN: + case LV_EVENT_DRAW_MAIN: + case LV_EVENT_DRAW_MAIN_END: + case LV_EVENT_DRAW_POST_BEGIN: + case LV_EVENT_DRAW_POST: + case LV_EVENT_DRAW_POST_END: + case LV_EVENT_DRAW_TASK_ADDED: + case LV_EVENT_REFRESH: + case LV_EVENT_DELETE: + case LV_EVENT_CHILD_CREATED: + case LV_EVENT_CHILD_DELETED: + case LV_EVENT_CHILD_CHANGED: + case LV_EVENT_SIZE_CHANGED: + case LV_EVENT_STYLE_CHANGED: + case LV_EVENT_GET_SELF_SIZE: + return false; + default: + return true; + } +} diff --git a/inc/lvgl/src/core/lv_obj_event.h b/inc/lvgl/src/core/lv_obj_event.h new file mode 100644 index 0000000..878acf7 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_event.h @@ -0,0 +1,213 @@ +/** + * @file lv_obj_event.h + * + */ + +#ifndef LV_OBJ_EVENT_H +#define LV_OBJ_EVENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../misc/lv_event.h" +#include "../indev/lv_indev.h" +#include "lv_obj_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Cover check results.*/ +typedef enum { + LV_COVER_RES_COVER = 0, + LV_COVER_RES_NOT_COVER = 1, + LV_COVER_RES_MASKED = 2, +} lv_cover_res_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Send an event to the object + * @param obj pointer to an object + * @param event_code the type of the event from `lv_event_t` + * @param param arbitrary data depending on the widget type and the event. (Usually `NULL`) + * @return LV_RESULT_OK: `obj` was not deleted in the event; LV_RESULT_INVALID: `obj` was deleted in the event_code + */ +lv_result_t lv_obj_send_event(lv_obj_t * obj, lv_event_code_t event_code, void * param); + +/** + * Used by the widgets internally to call the ancestor widget types's event handler + * @param class_p pointer to the class of the widget (NOT the ancestor class) + * @param e pointer to the event descriptor + * @return LV_RESULT_OK: the target object was not deleted in the event; LV_RESULT_INVALID: it was deleted in the event_code + */ +lv_result_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e); + +/** + * Get the current target of the event. It's the object which event handler being called. + * If the event is not bubbled it's the same as "original" target. + * @param e pointer to the event descriptor + * @return the target of the event_code + */ +lv_obj_t * lv_event_get_current_target_obj(lv_event_t * e); + +/** + * Get the object originally targeted by the event. It's the same even if the event is bubbled. + * @param e pointer to the event descriptor + * @return pointer to the original target of the event_code + */ +lv_obj_t * lv_event_get_target_obj(lv_event_t * e); + +/** + * Add an event handler function for an object. + * Used by the user to react on event which happens with the object. + * An object can have multiple event handler. They will be called in the same order as they were added. + * @param obj pointer to an object + * @param filter an event code (e.g. `LV_EVENT_CLICKED`) on which the event should be called. `LV_EVENT_ALL` can be used to receive all the events. + * @param event_cb the new event function + * @param user_data custom data will be available in `event_cb` + * @return handler to the event. It can be used in `lv_obj_remove_event_dsc`. + */ +lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); + +uint32_t lv_obj_get_event_count(lv_obj_t * obj); + +lv_event_dsc_t * lv_obj_get_event_dsc(lv_obj_t * obj, uint32_t index); + +bool lv_obj_remove_event(lv_obj_t * obj, uint32_t index); + +bool lv_obj_remove_event_dsc(lv_obj_t * obj, lv_event_dsc_t * dsc); + +/** + * Remove an event_cb from an object + * @param obj pointer to a obj + * @param event_cb the event_cb of the event to remove + * @return the count of the event removed + */ +uint32_t lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb); + +/** + * Remove an event_cb with user_data + * @param obj pointer to a obj + * @param event_cb the event_cb of the event to remove + * @param user_data user_data + * @return the count of the event removed + */ +uint32_t lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, void * user_data); + +/** + * Get the input device passed as parameter to indev related events. + * @param e pointer to an event + * @return the indev that triggered the event or NULL if called on a not indev related event + */ +lv_indev_t * lv_event_get_indev(lv_event_t * e); + +/** + * Get the draw context which should be the first parameter of the draw functions. + * Namely: `LV_EVENT_DRAW_MAIN/POST`, `LV_EVENT_DRAW_MAIN/POST_BEGIN`, `LV_EVENT_DRAW_MAIN/POST_END` + * @param e pointer to an event + * @return pointer to a draw context or NULL if called on an unrelated event + */ +lv_layer_t * lv_event_get_layer(lv_event_t * e); + +/** + * Get the old area of the object before its size was changed. Can be used in `LV_EVENT_SIZE_CHANGED` + * @param e pointer to an event + * @return the old absolute area of the object or NULL if called on an unrelated event + */ +const lv_area_t * lv_event_get_old_size(lv_event_t * e); + +/** + * Get the key passed as parameter to an event. Can be used in `LV_EVENT_KEY` + * @param e pointer to an event + * @return the triggering key or NULL if called on an unrelated event + */ +uint32_t lv_event_get_key(lv_event_t * e); + +/** + * Get the signed rotary encoder diff. passed as parameter to an event. Can be used in `LV_EVENT_ROTARY` + * @param e pointer to an event + * @return the triggering key or NULL if called on an unrelated event + */ +int32_t lv_event_get_rotary_diff(lv_event_t * e); + +/** + * Get the animation descriptor of a scrolling. Can be used in `LV_EVENT_SCROLL_BEGIN` + * @param e pointer to an event + * @return the animation that will scroll the object. (can be modified as required) + */ +lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e); + +/** + * Set the new extra draw size. Can be used in `LV_EVENT_REFR_EXT_DRAW_SIZE` + * @param e pointer to an event + * @param size The new extra draw size + */ +void lv_event_set_ext_draw_size(lv_event_t * e, int32_t size); + +/** + * Get a pointer to an `lv_point_t` variable in which the self size should be saved (width in `point->x` and height `point->y`). + * Can be used in `LV_EVENT_GET_SELF_SIZE` + * @param e pointer to an event + * @return pointer to `lv_point_t` or NULL if called on an unrelated event + */ +lv_point_t * lv_event_get_self_size_info(lv_event_t * e); + +/** + * Get a pointer to an `lv_hit_test_info_t` variable in which the hit test result should be saved. Can be used in `LV_EVENT_HIT_TEST` + * @param e pointer to an event + * @return pointer to `lv_hit_test_info_t` or NULL if called on an unrelated event + */ +lv_hit_test_info_t * lv_event_get_hit_test_info(lv_event_t * e); + +/** + * Get a pointer to an area which should be examined whether the object fully covers it or not. + * Can be used in `LV_EVENT_HIT_TEST` + * @param e pointer to an event + * @return an area with absolute coordinates to check + */ +const lv_area_t * lv_event_get_cover_area(lv_event_t * e); + +/** + * Set the result of cover checking. Can be used in `LV_EVENT_COVER_CHECK` + * @param e pointer to an event + * @param res an element of ::lv_cover_check_info_t + */ +void lv_event_set_cover_res(lv_event_t * e, lv_cover_res_t res); + +/** + * Get the draw task which was just added. + * Can be used in `LV_EVENT_DRAW_TASK_ADDED event` + * @param e pointer to an event + * @return the added draw task + */ +lv_draw_task_t * lv_event_get_draw_task(lv_event_t * e); + +/** + * Get the previous state before the state change. + * Can be used in `LV_EVENT_STATE_CHANGED` event + * @param e pointer to an event + * @return the previous state + */ +lv_state_t lv_event_get_prev_state(lv_event_t * e); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_EVENT_H*/ diff --git a/inc/lvgl/src/core/lv_obj_event_private.h b/inc/lvgl/src/core/lv_obj_event_private.h new file mode 100644 index 0000000..2199717 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_event_private.h @@ -0,0 +1,62 @@ +/** + * @file lv_obj_event_private.h + * + */ + +#ifndef LV_OBJ_EVENT_PRIVATE_H +#define LV_OBJ_EVENT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_event.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Used as the event parameter of ::LV_EVENT_HIT_TEST to check if an `point` can click the object or not. + * `res` should be set like this: + * - If already set to `false` another event wants that point non clickable. If you want to respect it leave it as `false` or set `true` to overwrite it. + * - If already set `true` and `point` shouldn't be clickable set to `false` + * - If already set to `true` you agree that `point` can click the object leave it as `true` + */ +struct _lv_hit_test_info_t { + const lv_point_t * point; /**< A point relative to screen to check if it can click the object or not*/ + bool res; /**< true: `point` can click the object; false: it cannot*/ +}; + +/** + * Used as the event parameter of ::LV_EVENT_COVER_CHECK to check if an area is covered by the object or not. + * In the event use `const lv_area_t * area = lv_event_get_cover_area(e)` to get the area to check + * and `lv_event_set_cover_res(e, res)` to set the result. + */ +struct _lv_cover_check_info_t { + lv_cover_res_t res; + const lv_area_t * area; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_EVENT_PRIVATE_H*/ diff --git a/inc/lvgl/src/core/lv_obj_id_builtin.c b/inc/lvgl/src/core/lv_obj_id_builtin.c new file mode 100644 index 0000000..8af3815 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_id_builtin.c @@ -0,0 +1,120 @@ +/** + * @file lv_obj_id_builtin.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_class_private.h" +#include "lv_obj_private.h" +#include "lv_global.h" +#include "../osal/lv_os_private.h" +#include "../stdlib/lv_sprintf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +typedef struct _class_info_t { + const lv_obj_class_t * class_p; + uint32_t obj_count; +} class_info_t; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if LV_USE_OBJ_ID && LV_USE_OBJ_ID_BUILTIN + +void lv_obj_assign_id(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_ASSERT(obj && class_p); + + uint32_t i; + uint32_t id = 0; + lv_global_t * global = LV_GLOBAL_DEFAULT(); + class_info_t * info = NULL; + + if(obj == NULL || class_p == NULL) return; + if(global == NULL) return; + + obj->id = NULL; + + for(i = 0; i < global->objid_count; i ++) { + info = ((class_info_t *)global->objid_array) + i; + if(class_p == info->class_p) break; + } + + /*Resize array*/ + if(i == global->objid_count) { + void * array = lv_realloc(global->objid_array, sizeof(class_info_t) * (global->objid_count + 1)); + LV_ASSERT_MALLOC(array); + if(array == NULL) return; + global->objid_array = array; + global->objid_count ++; + info = ((class_info_t *)global->objid_array) + i; + info->obj_count = 0; + info->class_p = class_p; + } + + id = ++info->obj_count; + + obj->id = (void *)(lv_uintptr_t)id; +} + +void lv_obj_set_id(lv_obj_t * obj, void * id) +{ + LV_ASSERT_NULL(obj); + if(obj->id) lv_obj_free_id(obj); + obj->id = id; +} + +void lv_obj_free_id(lv_obj_t * obj) +{ + obj->id = NULL; +} + +const char * lv_obj_stringify_id(lv_obj_t * obj, char * buf, uint32_t len) +{ + if(obj == NULL || obj->class_p == NULL) return NULL; + if(buf == NULL) return NULL; + + const char * name = obj->class_p->name; + if(name == NULL) name = "nameless"; + + lv_snprintf(buf, len, "%s%" LV_PRIu32 "", name, (uint32_t)(lv_uintptr_t)obj->id); + return buf; +} + +void lv_objid_builtin_destroy(void) +{ + lv_global_t * global = LV_GLOBAL_DEFAULT(); + if(global == NULL) return; + + lv_free(global->objid_array); + global->objid_count = 0; +} + +int lv_obj_id_compare(const void * id1, const void * id2) +{ + return id1 == id2 ? 0 : 1; +} + +#endif /*LV_USE_OBJ_ID_BUILTIN*/ diff --git a/inc/lvgl/src/core/lv_obj_pos.c b/inc/lvgl/src/core/lv_obj_pos.c new file mode 100644 index 0000000..177b0fb --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_pos.c @@ -0,0 +1,1634 @@ +/** + * @file lv_obj_pos.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_area_private.h" +#include "../layouts/lv_layout_private.h" +#include "lv_obj_event_private.h" +#include "lv_obj_draw_private.h" +#include "lv_obj_style_private.h" +#include "lv_obj_private.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "lv_refr_private.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#define update_layout_mutex LV_GLOBAL_DEFAULT()->layout_update_mutex + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static int32_t calc_content_width(lv_obj_t * obj); +static int32_t calc_content_height(lv_obj_t * obj); +static void layout_update_core(lv_obj_t * obj); +static void transform_point_array(const lv_obj_t * obj, lv_point_t * p, size_t p_count, bool inv); +static bool is_transformed(const lv_obj_t * obj); +static lv_result_t invalidate_area_core(const lv_obj_t * obj, lv_area_t * area_tmp); +static lv_result_t obj_invalidate_area_internal(const lv_display_t * disp, const lv_obj_t * obj, + const lv_area_t * area); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_set_pos(lv_obj_t * obj, int32_t x, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_set_x(obj, x); + lv_obj_set_y(obj, y); +} + +void lv_obj_set_x(lv_obj_t * obj, int32_t x) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_style_res_t res_x; + lv_style_value_t v_x; + + res_x = lv_obj_get_local_style_prop(obj, LV_STYLE_X, &v_x, 0); + + if((res_x == LV_STYLE_RES_FOUND && v_x.num != x) || res_x == LV_STYLE_RES_NOT_FOUND) { + lv_obj_set_style_x(obj, x, 0); + } +} + +void lv_obj_set_y(lv_obj_t * obj, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_style_res_t res_y; + lv_style_value_t v_y; + + res_y = lv_obj_get_local_style_prop(obj, LV_STYLE_Y, &v_y, 0); + + if((res_y == LV_STYLE_RES_FOUND && v_y.num != y) || res_y == LV_STYLE_RES_NOT_FOUND) { + lv_obj_set_style_y(obj, y, 0); + } +} + +/** + * @brief Calculates the width in pixels of an LVGL object based on its style and parent for a given width `prop`. + * @param obj Pointer to the LVGL object whose width is being calculated. + * @param prop Which style width to calculate for. Valid values are: LV_STYLE_WIDTH, LV_STYLE_MIN_WIDTH, or + * LV_STYLE_MAX_WIDTH. + * @param content_width Pointer to an integer storing the object's content width to prevent unnecessary recalculation. + * If negative or NULL and width is `LV_SIZE_CONTENT`, it will be calculated. + * @return The computed width for the object: + * @note If the style width is a fixed value, that value is returned. + * @note If the style width is `LV_SIZE_CONTENT`, the content width is calculated and returned. + * @note If the style width is a `LV_PCT()`, the percentage is applied to the parent's width. + */ +static int32_t calc_dynamic_width(lv_obj_t * obj, lv_style_prop_t prop, int32_t * const content_width) +{ + LV_ASSERT(prop == LV_STYLE_WIDTH || prop == LV_STYLE_MIN_WIDTH || prop == LV_STYLE_MAX_WIDTH); + + int32_t width = lv_obj_get_style_prop(obj, 0, prop).num; + + if(width == LV_SIZE_CONTENT) { + if(content_width == NULL) { + width = calc_content_width(obj); + } + else { + if(*content_width < 0) { + *content_width = calc_content_width(obj); + } + width = *content_width; + } + } + else if(LV_COORD_IS_PCT(width)) { + lv_obj_t * parent = lv_obj_get_parent(obj); + int32_t parent_w = lv_obj_get_content_width(parent); + width = (LV_COORD_GET_PCT(width) * parent_w) / 100; + width -= lv_obj_get_style_margin_left(obj, LV_PART_MAIN) + lv_obj_get_style_margin_right(obj, LV_PART_MAIN); + } + return width; +} + +int32_t lv_obj_calc_dynamic_width(lv_obj_t * obj, lv_style_prop_t prop) +{ + return calc_dynamic_width(obj, prop, NULL); +} + +/** + * @brief Calculates the height in pixels of an LVGL object based on its style and parent for a given height `prop`. + * @param obj Pointer to the LVGL object whose height is being calculated. + * @param prop Which style height to calculate for. Valid values are: LV_STYLE_HEIGHT, LV_STYLE_MIN_HEIGHT, or + * LV_STYLE_MAX_HEIGHT. + * @param content_height Pointer to an integer storing the object's content height to prevent unnecessary recalculation. + * If negative or NULL and height is `LV_SIZE_CONTENT`, it will be calculated. + * @return The computed height for the object: + * @note If the style height is a fixed value, that value is returned. + * @note If the style height is `LV_SIZE_CONTENT`, the content height is calculated and returned. + * @note If the style height is a `LV_PCT()`, the percentage is applied to the parent's height. + */ +static int32_t calc_dynamic_height(lv_obj_t * obj, lv_style_prop_t prop, int32_t * const content_height) +{ + LV_ASSERT(prop == LV_STYLE_HEIGHT || prop == LV_STYLE_MIN_HEIGHT || prop == LV_STYLE_MAX_HEIGHT); + + int32_t height = lv_obj_get_style_prop(obj, 0, prop).num; + + if(height == LV_SIZE_CONTENT) { + if(content_height == NULL) { + height = calc_content_height(obj); + } + else { + if(*content_height < 0) { + *content_height = calc_content_height(obj); + } + height = *content_height; + } + } + else if(LV_COORD_IS_PCT(height)) { + lv_obj_t * parent = lv_obj_get_parent(obj); + int32_t parent_h = lv_obj_get_content_height(parent); + height = (LV_COORD_GET_PCT(height) * parent_h) / 100; + height -= lv_obj_get_style_margin_top(obj, LV_PART_MAIN) + lv_obj_get_style_margin_bottom(obj, LV_PART_MAIN); + } + return height; +} + +int32_t lv_obj_calc_dynamic_height(lv_obj_t * obj, lv_style_prop_t prop) +{ + return calc_dynamic_height(obj, prop, NULL); +} + +bool lv_obj_refr_size(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*If the width or height is set by a layout do not modify them*/ + if(obj->w_layout && obj->h_layout) return false; + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return false; + + int32_t w; + if(obj->w_layout) { + w = lv_obj_get_width(obj); + } + else { + int32_t content_width = -1; + w = calc_dynamic_width(obj, LV_STYLE_WIDTH, &content_width); + int32_t minw = calc_dynamic_width(obj, LV_STYLE_MIN_WIDTH, &content_width); + int32_t maxw = calc_dynamic_width(obj, LV_STYLE_MAX_WIDTH, &content_width); + w = LV_CLAMP(minw, w, maxw); + + /** + * If the object style (after clamping) results in a width that is defined as a percentage of the parent, + * and if the parent's width is set to LV_SIZE_CONTENT and not managed by a layout, this object should not + * influence the parent's content width calculation. Thus, the `w_ignore_size` flag is set accordingly. + */ + int32_t w_style; + if(w == minw) { + w_style = lv_obj_get_style_min_width(obj, LV_PART_MAIN); + } + else if(w == maxw) { + w_style = lv_obj_get_style_max_width(obj, LV_PART_MAIN); + } + else { + w_style = lv_obj_get_style_width(obj, LV_PART_MAIN); + } + obj->w_ignore_size = + (LV_COORD_IS_PCT(w_style) && parent->w_layout == 0 && lv_obj_get_style_width(parent, 0) == LV_SIZE_CONTENT); + } + + int32_t h; + if(obj->h_layout) { + h = lv_obj_get_height(obj); + } + else { + int32_t content_height = -1; + h = calc_dynamic_height(obj, LV_STYLE_HEIGHT, &content_height); + int32_t minh = calc_dynamic_height(obj, LV_STYLE_MIN_HEIGHT, &content_height); + int32_t maxh = calc_dynamic_height(obj, LV_STYLE_MAX_HEIGHT, &content_height); + h = LV_CLAMP(minh, h, maxh); + + /** + * If the object style (after clamping) results in a height that is defined as a percentage of the parent, + * and if the parent's height is set to LV_SIZE_CONTENT and not managed by a layout, this object should not + * influence the parent's content height calculation. Thus, the `h_ignore_size` flag is set accordingly. + */ + int32_t h_style; + if(h == minh) { + h_style = lv_obj_get_style_min_height(obj, LV_PART_MAIN); + } + else if(h == maxh) { + h_style = lv_obj_get_style_max_height(obj, LV_PART_MAIN); + } + else { + h_style = lv_obj_get_style_height(obj, LV_PART_MAIN); + } + obj->h_ignore_size = (LV_COORD_IS_PCT(h_style) && parent->h_layout == 0 && + lv_obj_get_style_height(parent, 0) == LV_SIZE_CONTENT); + } + + /*Do nothing if the size is not changed*/ + /*It is very important else recursive resizing can occur without size change*/ + if(lv_obj_get_width(obj) == w && lv_obj_get_height(obj) == h) + return false; + + /*Invalidate the original area*/ + lv_obj_invalidate(obj); + + /*Save the original coordinates*/ + lv_area_t ori; + lv_obj_get_coords(obj, &ori); + + /*Check if the object inside the parent or not*/ + lv_area_t parent_fit_area; + lv_obj_get_content_coords(parent, &parent_fit_area); + + /*If the object is already out of the parent and its position is changes + *surely the scrollbars also changes so invalidate them*/ + bool on1 = lv_area_is_in(&ori, &parent_fit_area, 0); + if(!on1) + lv_obj_scrollbar_invalidate(parent); + + /*Set the length and height + *Be sure the content is not scrolled in an invalid position on the new size*/ + obj->coords.y2 = obj->coords.y1 + h - 1; + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + obj->coords.x1 = obj->coords.x2 - w + 1; + } + else { + obj->coords.x2 = obj->coords.x1 + w - 1; + } + + /*Call the ancestor's event handler to the object with its new coordinates*/ + lv_obj_send_event(obj, LV_EVENT_SIZE_CHANGED, &ori); + + /*Call the ancestor's event handler to the parent too*/ + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); + + /*Invalidate the new area*/ + lv_obj_invalidate(obj); + + obj->readjust_scroll_after_layout = 1; + + /*If the object was out of the parent invalidate the new scrollbar area too. + *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ + bool on2 = lv_area_is_in(&obj->coords, &parent_fit_area, 0); + if(on1 || (!on1 && on2)) + lv_obj_scrollbar_invalidate(parent); + + lv_obj_refresh_ext_draw_size(obj); + + return true; +} + +void lv_obj_set_size(lv_obj_t * obj, int32_t w, int32_t h) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_set_width(obj, w); + lv_obj_set_height(obj, h); +} + +void lv_obj_set_width(lv_obj_t * obj, int32_t w) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_style_res_t res_w; + lv_style_value_t v_w; + + res_w = lv_obj_get_local_style_prop(obj, LV_STYLE_WIDTH, &v_w, 0); + + if((res_w == LV_STYLE_RES_FOUND && v_w.num != w) || res_w == LV_STYLE_RES_NOT_FOUND) { + lv_obj_set_style_width(obj, w, 0); + } +} + +void lv_obj_set_height(lv_obj_t * obj, int32_t h) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_style_res_t res_h; + lv_style_value_t v_h; + + res_h = lv_obj_get_local_style_prop(obj, LV_STYLE_HEIGHT, &v_h, 0); + + if((res_h == LV_STYLE_RES_FOUND && v_h.num != h) || res_h == LV_STYLE_RES_NOT_FOUND) { + lv_obj_set_style_height(obj, h, 0); + } +} + +void lv_obj_set_content_width(lv_obj_t * obj, int32_t w) +{ + int32_t left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + int32_t right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + lv_obj_set_width(obj, w + left + right); +} + +void lv_obj_set_content_height(lv_obj_t * obj, int32_t h) +{ + int32_t top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + lv_obj_set_height(obj, h + top + bottom); +} + +void lv_obj_set_layout(lv_obj_t * obj, uint32_t layout) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_set_style_layout(obj, layout, 0); + + lv_obj_mark_layout_as_dirty(obj); +} + +bool lv_obj_is_layout_positioned(const lv_obj_t * obj) +{ + if(lv_obj_has_flag_any(obj, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_FLOATING)) return false; + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return false; + + uint32_t layout = lv_obj_get_style_layout(parent, LV_PART_MAIN); + if(layout) return true; + else return false; +} + +void lv_obj_mark_layout_as_dirty(lv_obj_t * obj) +{ + obj->layout_inv = 1; + + /*Mark the screen as dirty too to mark that there is something to do on this screen*/ + lv_obj_t * scr = lv_obj_get_screen(obj); + scr->scr_layout_inv = 1; + + /*Make the display refreshing*/ + lv_display_t * disp = lv_obj_get_display(scr); + lv_display_send_event(disp, LV_EVENT_REFR_REQUEST, NULL); +} + +void lv_obj_update_layout(const lv_obj_t * obj) +{ + if(update_layout_mutex) { + LV_LOG_TRACE("Already running, returning"); + return; + } + LV_PROFILER_LAYOUT_BEGIN; + update_layout_mutex = true; + + lv_obj_t * scr = lv_obj_get_screen(obj); + /*Repeat until there are no more layout invalidations*/ + while(scr->scr_layout_inv) { + LV_LOG_TRACE("Layout update begin"); + scr->scr_layout_inv = 0; + layout_update_core(scr); + LV_LOG_TRACE("Layout update end"); + } + + lv_display_t * disp = lv_obj_get_display(scr); + lv_display_send_event(disp, LV_EVENT_UPDATE_LAYOUT_COMPLETED, NULL); + update_layout_mutex = false; + LV_PROFILER_LAYOUT_END; +} + +void lv_obj_set_align(lv_obj_t * obj, lv_align_t align) +{ + lv_obj_set_style_align(obj, align, 0); +} + +void lv_obj_align(lv_obj_t * obj, lv_align_t align, int32_t x_ofs, int32_t y_ofs) +{ + lv_obj_set_style_align(obj, align, 0); + lv_obj_set_pos(obj, x_ofs, y_ofs); +} + +void lv_obj_align_to(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, int32_t x_ofs, int32_t y_ofs) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_update_layout(obj); + if(base == NULL) base = lv_obj_get_parent(obj); + + LV_ASSERT_OBJ(base, MY_CLASS); + + int32_t x = 0; + int32_t y = 0; + + lv_obj_t * parent = lv_obj_get_parent(obj); + + LV_ASSERT_OBJ(parent, MY_CLASS); + + int32_t pleft = lv_obj_get_style_space_left(parent, LV_PART_MAIN); + int32_t ptop = lv_obj_get_style_space_top(parent, LV_PART_MAIN); + + int32_t bleft = lv_obj_get_style_space_left(base, LV_PART_MAIN); + int32_t btop = lv_obj_get_style_space_top(base, LV_PART_MAIN); + + if(align == LV_ALIGN_DEFAULT) { + if(lv_obj_get_style_base_dir(base, LV_PART_MAIN) == LV_BASE_DIR_RTL) align = LV_ALIGN_TOP_RIGHT; + else align = LV_ALIGN_TOP_LEFT; + } + + switch(align) { + case LV_ALIGN_CENTER: + x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; + y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; + break; + + case LV_ALIGN_TOP_LEFT: + x = bleft; + y = btop; + break; + + case LV_ALIGN_TOP_MID: + x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; + y = btop; + break; + + case LV_ALIGN_TOP_RIGHT: + x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; + y = btop; + break; + + case LV_ALIGN_BOTTOM_LEFT: + x = bleft; + y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; + break; + case LV_ALIGN_BOTTOM_MID: + x = lv_obj_get_content_width(base) / 2 - lv_obj_get_width(obj) / 2 + bleft; + y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; + break; + + case LV_ALIGN_BOTTOM_RIGHT: + x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; + y = lv_obj_get_content_height(base) - lv_obj_get_height(obj) + btop; + break; + + case LV_ALIGN_LEFT_MID: + x = bleft; + y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; + break; + + case LV_ALIGN_RIGHT_MID: + x = lv_obj_get_content_width(base) - lv_obj_get_width(obj) + bleft; + y = lv_obj_get_content_height(base) / 2 - lv_obj_get_height(obj) / 2 + btop; + break; + + case LV_ALIGN_OUT_TOP_LEFT: + x = 0; + y = -lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_TOP_MID: + x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; + y = -lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_TOP_RIGHT: + x = lv_obj_get_width(base) - lv_obj_get_width(obj); + y = -lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_BOTTOM_LEFT: + x = 0; + y = lv_obj_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_MID: + x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; + y = lv_obj_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_RIGHT: + x = lv_obj_get_width(base) - lv_obj_get_width(obj); + y = lv_obj_get_height(base); + break; + + case LV_ALIGN_OUT_LEFT_TOP: + x = -lv_obj_get_width(obj); + y = 0; + break; + + case LV_ALIGN_OUT_LEFT_MID: + x = -lv_obj_get_width(obj); + y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; + break; + + case LV_ALIGN_OUT_LEFT_BOTTOM: + x = -lv_obj_get_width(obj); + y = lv_obj_get_height(base) - lv_obj_get_height(obj); + break; + + case LV_ALIGN_OUT_RIGHT_TOP: + x = lv_obj_get_width(base); + y = 0; + break; + + case LV_ALIGN_OUT_RIGHT_MID: + x = lv_obj_get_width(base); + y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; + break; + + case LV_ALIGN_OUT_RIGHT_BOTTOM: + x = lv_obj_get_width(base); + y = lv_obj_get_height(base) - lv_obj_get_height(obj); + break; + + case LV_ALIGN_DEFAULT: + break; + } + + if(LV_COORD_IS_PCT(x_ofs)) x_ofs = (lv_obj_get_width(base) * LV_COORD_GET_PCT(x_ofs)) / 100; + if(LV_COORD_IS_PCT(y_ofs)) y_ofs = (lv_obj_get_height(base) * LV_COORD_GET_PCT(y_ofs)) / 100; + if(lv_obj_get_style_base_dir(parent, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + x += x_ofs + base->coords.x1 - parent->coords.x1 + lv_obj_get_scroll_right(parent) - pleft; + } + else { + x += x_ofs + base->coords.x1 - parent->coords.x1 + lv_obj_get_scroll_left(parent) - pleft; + } + y += y_ofs + base->coords.y1 - parent->coords.y1 + lv_obj_get_scroll_top(parent) - ptop; + lv_obj_set_style_align(obj, LV_ALIGN_TOP_LEFT, 0); + lv_obj_set_pos(obj, x, y); + +} + +void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * coords) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_area_copy(coords, &obj->coords); +} + +int32_t lv_obj_get_x(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t rel_x; + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + rel_x = obj->coords.x1 - parent->coords.x1; + rel_x += lv_obj_get_scroll_x(parent); + rel_x -= lv_obj_get_style_space_left(parent, LV_PART_MAIN); + } + else { + rel_x = obj->coords.x1; + } + return rel_x; +} + +int32_t lv_obj_get_x2(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_obj_get_x(obj) + lv_obj_get_width(obj); +} + +int32_t lv_obj_get_y(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t rel_y; + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) { + rel_y = obj->coords.y1 - parent->coords.y1; + rel_y += lv_obj_get_scroll_y(parent); + rel_y -= lv_obj_get_style_space_top(parent, LV_PART_MAIN); + } + else { + rel_y = obj->coords.y1; + } + return rel_y; +} + +int32_t lv_obj_get_y2(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_obj_get_y(obj) + lv_obj_get_height(obj); +} + +int32_t lv_obj_get_x_aligned(const lv_obj_t * obj) +{ + return lv_obj_get_style_x(obj, LV_PART_MAIN); +} + +int32_t lv_obj_get_y_aligned(const lv_obj_t * obj) +{ + return lv_obj_get_style_y(obj, LV_PART_MAIN); +} + +int32_t lv_obj_get_width(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_area_get_width(&obj->coords); +} + +int32_t lv_obj_get_height(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_area_get_height(&obj->coords); +} + +int32_t lv_obj_get_content_width(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + int32_t right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + + return lv_obj_get_width(obj) - left - right; +} + +int32_t lv_obj_get_content_height(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + + return lv_obj_get_height(obj) - top - bottom; +} + +void lv_obj_get_content_coords(const lv_obj_t * obj, lv_area_t * area) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_get_coords(obj, area); + area->x1 += lv_obj_get_style_space_left(obj, LV_PART_MAIN); + area->x2 -= lv_obj_get_style_space_right(obj, LV_PART_MAIN); + area->y1 += lv_obj_get_style_space_top(obj, LV_PART_MAIN); + area->y2 -= lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + +} + +int32_t lv_obj_get_self_width(const lv_obj_t * obj) +{ + lv_point_t p = {0, LV_COORD_MIN}; + lv_obj_send_event((lv_obj_t *)obj, LV_EVENT_GET_SELF_SIZE, &p); + return p.x; +} + +int32_t lv_obj_get_self_height(const lv_obj_t * obj) +{ + lv_point_t p = {LV_COORD_MIN, 0}; + lv_obj_send_event((lv_obj_t *)obj, LV_EVENT_GET_SELF_SIZE, &p); + return p.y; +} + +int32_t lv_obj_get_style_clamped_width(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t content_width = -1; + int32_t w = calc_dynamic_width(obj, LV_STYLE_WIDTH, &content_width); + int32_t minw = calc_dynamic_width(obj, LV_STYLE_MIN_WIDTH, &content_width); + int32_t maxw = calc_dynamic_width(obj, LV_STYLE_MAX_WIDTH, &content_width); + if(w <= minw) { + w = lv_obj_get_style_min_width(obj, LV_PART_MAIN); + } + else if(w >= maxw) { + w = lv_obj_get_style_max_width(obj, LV_PART_MAIN); + } + else { + w = lv_obj_get_style_width(obj, LV_PART_MAIN); + } + return w; +} + +int32_t lv_obj_get_style_clamped_height(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t content_height = -1; + int32_t h = calc_dynamic_height(obj, LV_STYLE_HEIGHT, &content_height); + int32_t minh = calc_dynamic_height(obj, LV_STYLE_MIN_HEIGHT, &content_height); + int32_t maxh = calc_dynamic_height(obj, LV_STYLE_MAX_HEIGHT, &content_height); + if(h <= minh) { + h = lv_obj_get_style_min_height(obj, LV_PART_MAIN); + } + else if(h >= maxh) { + h = lv_obj_get_style_max_height(obj, LV_PART_MAIN); + } + else { + h = lv_obj_get_style_height(obj, LV_PART_MAIN); + } + return h; +} + +bool lv_obj_is_width_min(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t minw = lv_obj_calc_dynamic_width(obj, LV_STYLE_MIN_WIDTH); + int32_t w = lv_obj_get_width(obj); + return w == minw; +} + +bool lv_obj_is_height_min(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t minh = lv_obj_calc_dynamic_height(obj, LV_STYLE_MIN_HEIGHT); + int32_t h = lv_obj_get_height(obj); + return h == minh; +} + +bool lv_obj_is_width_max(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t maxw = lv_obj_calc_dynamic_width(obj, LV_STYLE_MAX_WIDTH); + int32_t w = lv_obj_get_width(obj); + return w == maxw; +} + +bool lv_obj_is_height_max(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t maxh = lv_obj_calc_dynamic_height(obj, LV_STYLE_MAX_HEIGHT); + int32_t h = lv_obj_get_height(obj); + return h == maxh; +} + +bool lv_obj_refresh_self_size(lv_obj_t * obj) +{ + int32_t w_set = lv_obj_get_style_width(obj, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(obj, LV_PART_MAIN); + if(w_set != LV_SIZE_CONTENT && h_set != LV_SIZE_CONTENT) return false; + + lv_obj_mark_layout_as_dirty(obj); + return true; +} + +void lv_obj_refr_pos(lv_obj_t * obj) +{ + if(lv_obj_is_layout_positioned(obj)) return; + + lv_obj_t * parent = lv_obj_get_parent(obj); + int32_t x = lv_obj_get_style_x(obj, LV_PART_MAIN); + int32_t y = lv_obj_get_style_y(obj, LV_PART_MAIN); + + if(parent == NULL) { + lv_obj_move_to(obj, x, y); + return; + } + + /*Handle percentage value*/ + int32_t pw = lv_obj_get_content_width(parent); + int32_t ph = lv_obj_get_content_height(parent); + if(LV_COORD_IS_PCT(x)) { + if(lv_obj_get_style_width(parent, LV_PART_MAIN) == LV_SIZE_CONTENT) x = 0; /*Avoid circular dependency*/ + else x = (pw * LV_COORD_GET_PCT(x)) / 100; + } + + if(LV_COORD_IS_PCT(y)) { + if(lv_obj_get_style_height(parent, LV_PART_MAIN) == LV_SIZE_CONTENT) y = 0; /*Avoid circular dependency*/ + y = (ph * LV_COORD_GET_PCT(y)) / 100; + } + + /*Handle percentage value of translate*/ + int32_t tr_x = lv_obj_get_style_translate_x(obj, LV_PART_MAIN); + int32_t tr_y = lv_obj_get_style_translate_y(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; + if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; + + /*Use the translation*/ + x += tr_x; + y += tr_y; + + lv_align_t align = lv_obj_get_style_align(obj, LV_PART_MAIN); + + if(align == LV_ALIGN_DEFAULT) { + align = LV_ALIGN_TOP_LEFT; + } + + bool rtl = lv_obj_get_style_base_dir(parent, LV_PART_MAIN) == LV_BASE_DIR_RTL; + + if(rtl) { + switch(align) { + case LV_ALIGN_TOP_LEFT: + align = LV_ALIGN_TOP_RIGHT; + break; + case LV_ALIGN_TOP_RIGHT: + align = LV_ALIGN_TOP_LEFT; + break; + case LV_ALIGN_LEFT_MID: + align = LV_ALIGN_RIGHT_MID; + break; + case LV_ALIGN_RIGHT_MID: + align = LV_ALIGN_LEFT_MID; + break; + case LV_ALIGN_BOTTOM_LEFT: + align = LV_ALIGN_BOTTOM_RIGHT; + break; + case LV_ALIGN_BOTTOM_RIGHT: + align = LV_ALIGN_BOTTOM_LEFT; + break; + default: + break; + } + } + + switch(align) { + case LV_ALIGN_TOP_LEFT: + break; + case LV_ALIGN_TOP_MID: + x = rtl ? pw / 2 - w / 2 - x : pw / 2 - w / 2 + x; + break; + case LV_ALIGN_TOP_RIGHT: + x = rtl ? pw - w - x : pw - w + x; + break; + case LV_ALIGN_LEFT_MID: + y += ph / 2 - h / 2; + break; + case LV_ALIGN_BOTTOM_LEFT: + y += ph - h; + break; + case LV_ALIGN_BOTTOM_MID: + x = rtl ? pw / 2 - w / 2 - x : pw / 2 - w / 2 + x; + y += ph - h; + break; + case LV_ALIGN_BOTTOM_RIGHT: + x = rtl ? pw - w - x : pw - w + x; + y += ph - h; + break; + case LV_ALIGN_RIGHT_MID: + x = rtl ? pw - w - x : pw - w + x; + y += ph / 2 - h / 2; + break; + case LV_ALIGN_CENTER: + x = rtl ? pw / 2 - w / 2 - x : pw / 2 - w / 2 + x; + y += ph / 2 - h / 2; + break; + default: + break; + } + + lv_obj_move_to(obj, x, y); +} + +void lv_obj_move_to(lv_obj_t * obj, int32_t x, int32_t y) +{ + /*Convert x and y to absolute coordinates*/ + lv_obj_t * parent = obj->parent; + + if(parent) { + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_FLOATING)) { + x += parent->coords.x1; + y += parent->coords.y1; + } + else { + x += parent->coords.x1 - lv_obj_get_scroll_x(parent); + y += parent->coords.y1 - lv_obj_get_scroll_y(parent); + } + + x += lv_obj_get_style_space_left(parent, LV_PART_MAIN); + y += lv_obj_get_style_space_top(parent, LV_PART_MAIN); + } + + /*Calculate and set the movement*/ + lv_point_t diff; + diff.x = x - obj->coords.x1; + diff.y = y - obj->coords.y1; + + /*Do nothing if the position is not changed*/ + /*It is very important else recursive positioning can + *occur without position change*/ + if(diff.x == 0 && diff.y == 0) return; + + /*Invalidate the original area*/ + lv_obj_invalidate(obj); + + /*Save the original coordinates*/ + lv_area_t ori; + lv_obj_get_coords(obj, &ori); + + /*Check if the object inside the parent or not*/ + lv_area_t parent_fit_area; + bool on1 = false; + if(parent) { + lv_obj_get_content_coords(parent, &parent_fit_area); + + /*If the object is already out of the parent and its position is changes + *surely the scrollbars also changes so invalidate them*/ + on1 = lv_area_is_in(&ori, &parent_fit_area, 0); + if(!on1) lv_obj_scrollbar_invalidate(parent); + } + + obj->coords.x1 += diff.x; + obj->coords.y1 += diff.y; + obj->coords.x2 += diff.x; + obj->coords.y2 += diff.y; + + lv_obj_move_children_by(obj, diff.x, diff.y, false); + + /*Call the ancestor's event handler to the parent too*/ + if(parent) lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); + + /*Invalidate the new area*/ + lv_obj_invalidate(obj); + + /*If the object was out of the parent invalidate the new scrollbar area too. + *If it wasn't out of the parent but out now, also invalidate the scrollbars*/ + if(parent) { + bool on2 = lv_area_is_in(&obj->coords, &parent_fit_area, 0); + if(on1 || (!on1 && on2)) lv_obj_scrollbar_invalidate(parent); + } +} + +void lv_obj_move_children_by(lv_obj_t * obj, int32_t x_diff, int32_t y_diff, bool ignore_floating) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(ignore_floating && lv_obj_has_flag(child, LV_OBJ_FLAG_FLOATING)) continue; + child->coords.x1 += x_diff; + child->coords.y1 += y_diff; + child->coords.x2 += x_diff; + child->coords.y2 += y_diff; + + lv_obj_move_children_by(child, x_diff, y_diff, false); + } +} + +void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, lv_obj_point_transform_flag_t flags) +{ + lv_obj_transform_point_array(obj, p, 1, flags); +} + +void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], size_t count, + lv_obj_point_transform_flag_t flags) +{ + if(obj) { + lv_layer_type_t layer_type = lv_obj_get_layer_type(obj); + bool do_tranf = layer_type == LV_LAYER_TYPE_TRANSFORM; + bool recursive = flags & LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE; + bool inverse = flags & LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE; + if(inverse) { + if(recursive) lv_obj_transform_point_array(lv_obj_get_parent(obj), points, count, flags); + if(do_tranf) transform_point_array(obj, points, count, inverse); + } + else { + if(do_tranf) transform_point_array(obj, points, count, inverse); + if(recursive) lv_obj_transform_point_array(lv_obj_get_parent(obj), points, count, flags); + } + } +} + +void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, lv_obj_point_transform_flag_t flags) +{ + lv_point_t p[4] = { + {area->x1, area->y1}, + {area->x1, area->y2 + 1}, + {area->x2 + 1, area->y1}, + {area->x2 + 1, area->y2 + 1}, + }; + + lv_obj_transform_point_array(obj, p, 4, flags); + + area->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x); + area->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x); + area->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y); + area->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y); +} + +typedef struct { + const lv_obj_t * requester_obj; + const lv_area_t * inv_area; +} blur_walk_data_t; + +static lv_obj_tree_walk_res_t blur_walk_cb(lv_obj_t * obj, void * user_data) +{ + blur_walk_data_t * blur_data = user_data; + if(obj == blur_data->requester_obj) return LV_OBJ_TREE_WALK_SKIP_CHILDREN; + + /*Truncate the area to the object*/ + lv_area_t obj_coords; + int32_t ext_size = lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + lv_area_increase(&obj_coords, ext_size, ext_size); + + if(is_transformed(obj)) { + lv_obj_get_transformed_area(obj, &obj_coords, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); + } + + /*If the widget has blur set, invalidate it*/ + if(lv_area_is_on(blur_data->inv_area, &obj_coords)) { + const uint32_t group_blur = (uint32_t)1 << lv_style_get_prop_group(LV_STYLE_BLUR_RADIUS); + const uint32_t group_dropshadow = (uint32_t)1 << lv_style_get_prop_group(LV_STYLE_DROP_SHADOW_OPA); + const lv_state_t state = lv_obj_style_get_selector_state(lv_obj_get_state(obj)); + const lv_state_t state_inv = ~state; + lv_style_value_t v; + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + lv_obj_style_t * obj_style = &obj->styles[i]; + if(obj_style->is_disabled) continue; + + lv_state_t state_style = lv_obj_style_get_selector_state(obj->styles[i].selector); + if((state_style & state_inv)) continue; + + bool invalidation_needed = false; + if((obj_style->style->has_group & group_blur) && + lv_style_get_prop(obj_style->style, LV_STYLE_BLUR_RADIUS, &v)) { + invalidation_needed = true; + } + if((obj_style->style->has_group & group_dropshadow) && + lv_style_get_prop(obj_style->style, LV_STYLE_DROP_SHADOW_OPA, &v)) { + invalidation_needed = true; + } + + if(invalidation_needed == false) continue; + + /*Truncate the area to the object*/ + ext_size = lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + invalidate_area_core(obj, &obj_coords); + + /*No need to check the children as the widget is already invalidated + *which will redraw the children too*/ + return LV_OBJ_TREE_WALK_SKIP_CHILDREN; + } + + /*Check the next child, maybe it's blurred*/ + return LV_OBJ_TREE_WALK_NEXT; + } + else { + /*Not on the area of interest, skip it*/ + return LV_OBJ_TREE_WALK_SKIP_CHILDREN; + } + +} + +lv_result_t lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_display_t * disp = lv_obj_get_display(obj); + if(!lv_display_is_invalidation_enabled(disp)) return LV_RESULT_INVALID; + + return obj_invalidate_area_internal(disp, obj, area); +} + + +lv_result_t lv_obj_invalidate(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_display_t * disp = lv_obj_get_display(obj); + if(!lv_display_is_invalidation_enabled(disp)) return LV_RESULT_INVALID; + + /*Truncate the area to the object*/ + lv_area_t obj_coords; + int32_t ext_size = lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + lv_result_t res = obj_invalidate_area_internal(disp, obj, &obj_coords); + + return res; +} + +bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area) +{ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return false; + + /*Invalidate the object only if it belongs to the current or previous or one of the layers'*/ + lv_obj_t * obj_scr = lv_obj_get_screen(obj); + lv_display_t * disp = lv_obj_get_display(obj_scr); + if(obj_scr != lv_display_get_screen_active(disp) && + obj_scr != lv_display_get_screen_prev(disp) && + obj_scr != lv_display_get_layer_bottom(disp) && + obj_scr != lv_display_get_layer_top(disp) && + obj_scr != lv_display_get_layer_sys(disp)) { + return false; + } + + /*Truncate the area to the object*/ + lv_area_t obj_coords; + int32_t ext_size = lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + lv_area_increase(&obj_coords, ext_size, ext_size); + + /*The area is not on the object*/ + if(!lv_area_intersect(area, area, &obj_coords)) return false; + + if(is_transformed(obj)) { + lv_obj_get_transformed_area(obj, area, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); + } + + /*Truncate recursively to the parents*/ + lv_obj_t * parent = lv_obj_get_parent(obj); + while(parent != NULL) { + /*If the parent is hidden then the child is hidden and won't be drawn*/ + if(lv_obj_has_flag(parent, LV_OBJ_FLAG_HIDDEN)) return false; + + /*Truncate to the parent and if no common parts break*/ + lv_area_t parent_coords = parent->coords; + if(lv_obj_has_flag(parent, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + int32_t parent_ext_size = lv_obj_get_ext_draw_size(parent); + lv_area_increase(&parent_coords, parent_ext_size, parent_ext_size); + } + + if(is_transformed(parent)) { + lv_obj_get_transformed_area(parent, &parent_coords, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); + } + if(!lv_area_intersect(area, area, &parent_coords)) return false; + + parent = lv_obj_get_parent(parent); + } + + return true; +} + +bool lv_obj_is_visible(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_area_t obj_coords; + int32_t ext_size = lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + return lv_obj_area_is_visible(obj, &obj_coords); +} + +void lv_obj_set_ext_click_area(lv_obj_t * obj, int32_t size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->ext_click_pad = size; +} + +void lv_obj_get_click_area(const lv_obj_t * obj, lv_area_t * area) +{ + lv_area_copy(area, &obj->coords); + if(obj->spec_attr) { + lv_area_increase(area, obj->spec_attr->ext_click_pad, obj->spec_attr->ext_click_pad); + } +} + +bool lv_obj_hit_test(lv_obj_t * obj, const lv_point_t * point) +{ + if(!lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE)) return false; + + lv_area_t a; + lv_obj_get_click_area(obj, &a); + bool res = lv_area_is_point_on(&a, point, 0); + if(res == false) return false; + + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) { + lv_hit_test_info_t hit_info; + hit_info.point = point; + hit_info.res = true; + lv_obj_send_event(obj, LV_EVENT_HIT_TEST, &hit_info); + return hit_info.res; + } + + return res; +} + +int32_t lv_clamp_width(int32_t width, int32_t min_width, int32_t max_width, int32_t ref_width) +{ + if(LV_COORD_IS_PCT(min_width)) min_width = (ref_width * LV_COORD_GET_PCT(min_width)) / 100; + if(LV_COORD_IS_PCT(max_width)) max_width = (ref_width * LV_COORD_GET_PCT(max_width)) / 100; + return LV_CLAMP(min_width, width, max_width); +} + +int32_t lv_clamp_height(int32_t height, int32_t min_height, int32_t max_height, int32_t ref_height) +{ + if(LV_COORD_IS_PCT(min_height)) min_height = (ref_height * LV_COORD_GET_PCT(min_height)) / 100; + if(LV_COORD_IS_PCT(max_height)) max_height = (ref_height * LV_COORD_GET_PCT(max_height)) / 100; + return LV_CLAMP(min_height, height, max_height); +} + +void lv_obj_center(lv_obj_t * obj) +{ + lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); +} + +void lv_obj_set_transform(lv_obj_t * obj, const lv_matrix_t * matrix) +{ +#if LV_DRAW_TRANSFORM_USE_MATRIX + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(!matrix) { + lv_obj_reset_transform(obj); + return; + } + + lv_obj_allocate_spec_attr(obj); + if(!obj->spec_attr->matrix) { + obj->spec_attr->matrix = lv_malloc(sizeof(lv_matrix_t)); + LV_ASSERT_MALLOC(obj->spec_attr->matrix); + } + + /* Invalidate the old area */ + lv_obj_invalidate(obj); + + /* Copy the matrix */ + *obj->spec_attr->matrix = *matrix; + + /* Matrix is set. Update the layer type */ + lv_obj_update_layer_type(obj); + + /* Invalidate the new area */ + lv_obj_invalidate(obj); +#else + LV_UNUSED(obj); + LV_UNUSED(matrix); + LV_LOG_WARN("Transform matrix is not used because LV_DRAW_TRANSFORM_USE_MATRIX is disabled"); +#endif +} + +void lv_obj_reset_transform(lv_obj_t * obj) +{ +#if LV_DRAW_TRANSFORM_USE_MATRIX + LV_ASSERT_OBJ(obj, MY_CLASS); + if(!obj->spec_attr) { + return; + } + + if(!obj->spec_attr->matrix) { + return; + } + + /* Invalidate the old area */ + lv_obj_invalidate(obj); + + /* Free the matrix */ + lv_free(obj->spec_attr->matrix); + obj->spec_attr->matrix = NULL; + + /* Matrix is cleared. Update the layer type */ + lv_obj_update_layer_type(obj); + + /* Invalidate the new area */ + lv_obj_invalidate(obj); +#else + LV_UNUSED(obj); +#endif +} + +const lv_matrix_t * lv_obj_get_transform(const lv_obj_t * obj) +{ +#if LV_DRAW_TRANSFORM_USE_MATRIX + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr) { + return obj->spec_attr->matrix; + } +#else + LV_UNUSED(obj); +#endif + return NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t obj_invalidate_area_internal(const lv_display_t * disp, const lv_obj_t * obj, + const lv_area_t * area) +{ + LV_ASSERT_NULL(disp); + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(area); + + lv_area_t area_tmp; + lv_area_copy(&area_tmp, area); + + lv_result_t res = invalidate_area_core(obj, &area_tmp); + if(res == LV_RESULT_INVALID) return res; + + /*If this area is on a blurred widget, invalidate that widget too*/ + blur_walk_data_t blur_walk_data; + blur_walk_data.requester_obj = obj; + blur_walk_data.inv_area = &area_tmp; + lv_obj_tree_walk(disp->act_scr, blur_walk_cb, &blur_walk_data); + if(disp->prev_scr) lv_obj_tree_walk(disp->prev_scr, blur_walk_cb, &blur_walk_data); + lv_obj_tree_walk(disp->sys_layer, blur_walk_cb, &blur_walk_data); + lv_obj_tree_walk(disp->top_layer, blur_walk_cb, &blur_walk_data); + lv_obj_tree_walk(disp->bottom_layer, blur_walk_cb, &blur_walk_data); + + return res; +} + +static bool is_transformed(const lv_obj_t * obj) +{ + while(obj) { + if(obj->spec_attr && obj->spec_attr->layer_type == LV_LAYER_TYPE_TRANSFORM) return true; + obj = obj->parent; + } + return false; +} + +static int32_t calc_content_width(lv_obj_t * obj) +{ + int32_t scroll_x_tmp = lv_obj_get_scroll_x(obj); + if(obj->spec_attr) obj->spec_attr->scroll.x = 0; + + int32_t space_right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + int32_t space_left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + + int32_t self_w; + self_w = lv_obj_get_self_width(obj) + space_left + space_right; + + int32_t child_res = LV_COORD_MIN; + + if(!lv_layout_get_min_size(obj, &child_res, true)) { + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + /*With RTL find the left most coordinate*/ + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + for(i = 0; i < child_cnt; i++) { + int32_t child_res_tmp = LV_COORD_MIN; + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) + continue; + + if(child->w_ignore_size) + continue; + + if(!lv_obj_is_layout_positioned(child)) { + lv_align_t align = lv_obj_get_style_align(child, LV_PART_MAIN); + switch(align) { + case LV_ALIGN_DEFAULT: + case LV_ALIGN_TOP_RIGHT: + case LV_ALIGN_BOTTOM_RIGHT: + case LV_ALIGN_RIGHT_MID: + /*Normal right aligns. Other are ignored due to possible circular dependencies*/ + child_res_tmp = obj->coords.x2 - child->coords.x1 + 1; + break; + default: + /* Consider other cases only if x=0 and use the width of the object. + * With x!=0 circular dependency could occur. */ + if(lv_obj_get_style_x(child, LV_PART_MAIN) == 0) { + child_res_tmp = lv_area_get_width(&child->coords) + space_right; + child_res_tmp += lv_obj_get_style_margin_left(child, LV_PART_MAIN); + } + break; + } + } + else { + child_res_tmp = obj->coords.x2 - child->coords.x1 + 1; + } + child_res = LV_MAX(child_res, child_res_tmp + lv_obj_get_style_margin_left(child, LV_PART_MAIN)); + } + if(child_res != LV_COORD_MIN) { + child_res += space_left; + } + } + /*Else find the right most coordinate*/ + else { + for(i = 0; i < child_cnt; i++) { + int32_t child_res_tmp = LV_COORD_MIN; + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + if(child->w_ignore_size) + continue; + + if(!lv_obj_is_layout_positioned(child)) { + lv_align_t align = lv_obj_get_style_align(child, LV_PART_MAIN); + switch(align) { + case LV_ALIGN_DEFAULT: + case LV_ALIGN_TOP_LEFT: + case LV_ALIGN_BOTTOM_LEFT: + case LV_ALIGN_LEFT_MID: + /*Normal left aligns.*/ + child_res_tmp = child->coords.x2 - obj->coords.x1 + 1; + break; + default: + /* Consider other cases only if x=0 and use the width of the object. + * With x!=0 circular dependency could occur. */ + if(lv_obj_get_style_x(child, LV_PART_MAIN) == 0) { + child_res_tmp = lv_area_get_width(&child->coords) + space_left; + child_res_tmp += lv_obj_get_style_margin_right(child, LV_PART_MAIN); + } + break; + } + } + else { + child_res_tmp = child->coords.x2 - obj->coords.x1 + 1; + } + + child_res = LV_MAX(child_res, child_res_tmp + lv_obj_get_style_margin_right(child, LV_PART_MAIN)); + } + + if(child_res != LV_COORD_MIN) { + child_res += space_right; + } + } + } + + if(obj->spec_attr) { + obj->spec_attr->scroll.x = -scroll_x_tmp; + } + + if(child_res == LV_COORD_MIN) { + return self_w; + } + + return LV_MAX(child_res, self_w); +} + +static int32_t calc_content_height(lv_obj_t * obj) +{ + int32_t scroll_y_tmp = lv_obj_get_scroll_y(obj); + if(obj->spec_attr) obj->spec_attr->scroll.y = 0; + + int32_t space_top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t space_bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + + int32_t self_h; + self_h = lv_obj_get_self_height(obj) + space_top + space_bottom; + + int32_t child_res = LV_COORD_MIN; + + if(!lv_layout_get_min_size(obj, &child_res, false)) { + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + int32_t child_res_tmp = LV_COORD_MIN; + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) + continue; + + if(child->h_ignore_size) + continue; + + if(!lv_obj_is_layout_positioned(child)) { + lv_align_t align = lv_obj_get_style_align(child, LV_PART_MAIN); + switch(align) { + case LV_ALIGN_DEFAULT: + case LV_ALIGN_TOP_RIGHT: + case LV_ALIGN_TOP_MID: + case LV_ALIGN_TOP_LEFT: + /*Normal top aligns. */ + child_res_tmp = child->coords.y2 - obj->coords.y1 + 1; + break; + default: + /* Consider other cases only if y=0 and use the height of the object. + * With y!=0 circular dependency could occur. */ + if(lv_obj_get_style_y(child, LV_PART_MAIN) == 0) { + child_res_tmp = lv_area_get_height(&child->coords) + space_top; + child_res_tmp += lv_obj_get_style_margin_top(child, LV_PART_MAIN); + } + break; + } + } + else { + child_res_tmp = child->coords.y2 - obj->coords.y1 + 1; + } + + child_res = LV_MAX(child_res, child_res_tmp + lv_obj_get_style_margin_bottom(child, LV_PART_MAIN)); + } + + if(child_res != LV_COORD_MIN) { + child_res += space_bottom; + } + } + + if(obj->spec_attr) { + obj->spec_attr->scroll.y = -scroll_y_tmp; + } + + if(child_res == LV_COORD_MIN) { + return self_h; + } + + return LV_MAX(self_h, child_res); +} + +static void layout_update_core(lv_obj_t * obj) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + layout_update_core(child); + } + + if(obj->layout_inv) { + obj->layout_inv = 0; + lv_obj_refr_size(obj); + lv_obj_refr_pos(obj); + + if(child_cnt > 0) { + lv_layout_apply(obj); + } + } + + if(obj->readjust_scroll_after_layout) { + obj->readjust_scroll_after_layout = 0; + lv_obj_readjust_scroll(obj, LV_ANIM_OFF); + } +} + +static void transform_point_array(const lv_obj_t * obj, lv_point_t * p, size_t p_count, bool inv) +{ +#if LV_DRAW_TRANSFORM_USE_MATRIX + const lv_matrix_t * obj_matrix = lv_obj_get_transform(obj); + if(obj_matrix) { + lv_matrix_t m; + lv_matrix_identity(&m); + lv_matrix_translate(&m, obj->coords.x1, obj->coords.y1); + lv_matrix_multiply(&m, obj_matrix); + lv_matrix_translate(&m, -obj->coords.x1, -obj->coords.y1); + + if(inv) { + lv_matrix_t inv_m; + lv_matrix_inverse(&inv_m, &m); + m = inv_m; + } + + for(size_t i = 0; i < p_count; i++) { + lv_point_precise_t p_precise = lv_point_to_precise(&p[i]); + lv_point_precise_t res = lv_matrix_transform_precise_point(&m, &p_precise); + p[i] = lv_point_from_precise(&res); + } + + return; + } +#endif /* LV_DRAW_TRANSFORM_USE_MATRIX */ + + int32_t angle = lv_obj_get_style_transform_rotation(obj, LV_PART_MAIN); + int32_t scale_x = lv_obj_get_style_transform_scale_x_safe(obj, LV_PART_MAIN); + int32_t scale_y = lv_obj_get_style_transform_scale_y_safe(obj, LV_PART_MAIN); + if(scale_x == 0) scale_x = 1; + if(scale_y == 0) scale_y = 1; + + if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) return; + + lv_point_t pivot = { + .x = lv_obj_get_style_transform_pivot_x(obj, LV_PART_MAIN), + .y = lv_obj_get_style_transform_pivot_y(obj, LV_PART_MAIN) + }; + + if(LV_COORD_IS_PCT(pivot.x)) { + pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; + } + if(LV_COORD_IS_PCT(pivot.y)) { + pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; + } + + pivot.x = obj->coords.x1 + pivot.x; + pivot.y = obj->coords.y1 + pivot.y; + + if(inv) { + angle = -angle; + scale_x = (256 * 256 + scale_x - 1) / scale_x; + scale_y = (256 * 256 + scale_y - 1) / scale_y; + } + + lv_point_array_transform(p, p_count, angle, scale_x, scale_y, &pivot, !inv); +} + +static lv_result_t invalidate_area_core(const lv_obj_t * obj, lv_area_t * area_tmp) +{ + if(!lv_obj_area_is_visible(obj, area_tmp)) return LV_RESULT_INVALID; +#if LV_DRAW_TRANSFORM_USE_MATRIX + /** + * When using the global matrix, the vertex coordinates of clip_area lose precision after transformation, + * which can be solved by expanding the redrawing area. + */ + lv_area_increase(area_tmp, 5, 5); +#else + if(obj->spec_attr && obj->spec_attr->layer_type == LV_LAYER_TYPE_TRANSFORM) { + /*Make the area slightly larger to avoid rounding errors. + *5 is an empirical value*/ + lv_area_increase(area_tmp, 5, 5); + } +#endif + + lv_result_t res = lv_inv_area(lv_obj_get_display(obj), area_tmp); + return res; +} diff --git a/inc/lvgl/src/core/lv_obj_pos.h b/inc/lvgl/src/core/lv_obj_pos.h new file mode 100644 index 0000000..c3913e1 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_pos.h @@ -0,0 +1,567 @@ +/** + * @file lv_obj_pos.h + * + */ + +#ifndef LV_OBJ_POS_H +#define LV_OBJ_POS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + /** No flags */ + LV_OBJ_POINT_TRANSFORM_FLAG_NONE = 0x00, + + /** Consider the transformation properties of the parents too */ + LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE = 0x01, + + /** Execute the inverse of the transformation (-angle and 1/zoom) */ + LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE = 0x02, + + /** Both inverse and recursive*/ + LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE = 0x03, +} lv_obj_point_transform_flag_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Set the position of an object relative to the set alignment. + * @param obj pointer to an object + * @param x new x coordinate + * @param y new y coordinate + * @note With default alignment it's the distance from the top left corner + * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent + * @note The position is interpreted on the content area of the parent + * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` + */ +void lv_obj_set_pos(lv_obj_t * obj, int32_t x, int32_t y); + +/** + * Set the x coordinate of an object + * @param obj pointer to an object + * @param x new x coordinate + * @note With default alignment it's the distance from the top left corner + * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent + * @note The position is interpreted on the content area of the parent + * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` + */ +void lv_obj_set_x(lv_obj_t * obj, int32_t x); + +/** + * Set the y coordinate of an object + * @param obj pointer to an object + * @param y new y coordinate + * @note With default alignment it's the distance from the top left corner + * @note E.g. LV_ALIGN_CENTER alignment it's the offset from the center of the parent + * @note The position is interpreted on the content area of the parent + * @note The values can be set in pixel or in percentage of parent size with `lv_pct(v)` + */ +void lv_obj_set_y(lv_obj_t * obj, int32_t y); + +/** + * Set the size of an object. + * @param obj pointer to an object + * @param w the new width + * @param h the new height + * @note possible values are: + * pixel simple set the size accordingly + * LV_SIZE_CONTENT set the size to involve all children in the given direction + * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). + * x should be in [0..1000]% range + */ +void lv_obj_set_size(lv_obj_t * obj, int32_t w, int32_t h); + +/** + * Recalculate the size of the object + * @param obj pointer to an object + * @return true: the size has been changed + */ +bool lv_obj_refr_size(lv_obj_t * obj); + +/** + * Set the width of an object + * @param obj pointer to an object + * @param w the new width + * @note possible values are: + * pixel simple set the size accordingly + * LV_SIZE_CONTENT set the size to involve all children in the given direction + * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). + * x should be in [0..1000]% range + */ +void lv_obj_set_width(lv_obj_t * obj, int32_t w); + +/** + * Set the height of an object + * @param obj pointer to an object + * @param h the new height + * @note possible values are: + * pixel simple set the size accordingly + * LV_SIZE_CONTENT set the size to involve all children in the given direction + * lv_pct(x) to set size in percentage of the parent's content area size (the size without paddings). + * x should be in [0..1000]% range + */ +void lv_obj_set_height(lv_obj_t * obj, int32_t h); + +/** + * Set the width reduced by the left and right padding and the border width. + * @param obj pointer to an object + * @param w the width without paddings in pixels + */ +void lv_obj_set_content_width(lv_obj_t * obj, int32_t w); + +/** + * Set the height reduced by the top and bottom padding and the border width. + * @param obj pointer to an object + * @param h the height without paddings in pixels + */ +void lv_obj_set_content_height(lv_obj_t * obj, int32_t h); + +/** + * Set a layout for an object + * @param obj pointer to an object + * @param layout pointer to a layout descriptor to set + */ +void lv_obj_set_layout(lv_obj_t * obj, uint32_t layout); + +/** + * Test whether the and object is positioned by a layout or not + * @param obj pointer to an object to test + * @return true: positioned by a layout; false: not positioned by a layout + */ +bool lv_obj_is_layout_positioned(const lv_obj_t * obj); + +/** + * Mark the object for layout update. + * @param obj pointer to an object whose children need to be updated + */ +void lv_obj_mark_layout_as_dirty(lv_obj_t * obj); + +/** + * Update the layout of an object. + * @param obj pointer to an object whose position and size needs to be updated + */ +void lv_obj_update_layout(const lv_obj_t * obj); + +/** + * Change the alignment of an object. + * @param obj pointer to an object to align + * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used. + */ +void lv_obj_set_align(lv_obj_t * obj, lv_align_t align); + +/** + * Change the alignment of an object and set new coordinates. + * Equivalent to: + * lv_obj_set_align(obj, align); + * lv_obj_set_pos(obj, x_ofs, y_ofs); + * @param obj pointer to an object to align + * @param align type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used. + * @param x_ofs x coordinate offset after alignment + * @param y_ofs y coordinate offset after alignment + */ +void lv_obj_align(lv_obj_t * obj, lv_align_t align, int32_t x_ofs, int32_t y_ofs); + +/** + * Align an object to another object. + * @param obj pointer to an object to align + * @param base pointer to another object (if NULL `obj`s parent is used). 'obj' will be aligned to it. + * @param align type of alignment (see 'lv_align_t' enum) + * @param x_ofs x coordinate offset after alignment + * @param y_ofs y coordinate offset after alignment + * @note if the position or size of `base` changes `obj` needs to be aligned manually again + */ +void lv_obj_align_to(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, int32_t x_ofs, + int32_t y_ofs); + +/** + * Align an object to the center on its parent. + * @param obj pointer to an object to align + * @note if the parent size changes `obj` needs to be aligned manually again + */ +void lv_obj_center(lv_obj_t * obj); + +/** + * Set the transform matrix of an object + * @param obj pointer to an object + * @param matrix pointer to a matrix to set + * @note `LV_DRAW_TRANSFORM_USE_MATRIX` needs to be enabled. + */ +void lv_obj_set_transform(lv_obj_t * obj, const lv_matrix_t * matrix); + +/** + * Reset the transform matrix of an object to identity matrix + * @param obj pointer to an object + * @note `LV_DRAW_TRANSFORM_USE_MATRIX` needs to be enabled. + */ +void lv_obj_reset_transform(lv_obj_t * obj); + +/** + * Copy the coordinates of an object to an area + * @param obj pointer to an object + * @param coords pointer to an area to store the coordinates + */ +void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * coords); + +/** + * Get the x coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the left side of its parent plus the parent's left padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the left padding of the parent, and not on the left edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +int32_t lv_obj_get_x(const lv_obj_t * obj); + +/** + * Get the x2 coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the right side of its parent plus the parent's right padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the right padding of the parent, and not on the right edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +int32_t lv_obj_get_x2(const lv_obj_t * obj); + +/** + * Get the y coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the top side of its parent plus the parent's top padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the top padding of the parent, and not on the top edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +int32_t lv_obj_get_y(const lv_obj_t * obj); + +/** + * Get the y2 coordinate of object. + * @param obj pointer to an object + * @return distance of `obj` from the bottom side of its parent plus the parent's bottom padding + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @note Zero return value means the object is on the bottom padding of the parent, and not on the bottom edge. + * @note Scrolling of the parent doesn't change the returned value. + * @note The returned value is always the distance from the parent even if `obj` is positioned by a layout. + */ +int32_t lv_obj_get_y2(const lv_obj_t * obj); + +/** + * Get the actually set x coordinate of object, i.e. the offset from the set alignment + * @param obj pointer to an object + * @return the set x coordinate + */ +int32_t lv_obj_get_x_aligned(const lv_obj_t * obj); + +/** + * Get the actually set y coordinate of object, i.e. the offset from the set alignment + * @param obj pointer to an object + * @return the set y coordinate + */ +int32_t lv_obj_get_y_aligned(const lv_obj_t * obj); + +/** + * Get the width of an object + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the width in pixels + */ +int32_t lv_obj_get_width(const lv_obj_t * obj); + +/** + * Get the height of an object + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the height in pixels + */ +int32_t lv_obj_get_height(const lv_obj_t * obj); + +/** + * Get the width reduced by the left and right padding and the border width. + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the width which still fits into its parent without causing overflow (making the parent scrollable) + */ +int32_t lv_obj_get_content_width(const lv_obj_t * obj); + +/** + * Get the height reduced by the top and bottom padding and the border width. + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @return the height which still fits into the parent without causing overflow (making the parent scrollable) + */ +int32_t lv_obj_get_content_height(const lv_obj_t * obj); + +/** + * Get the area reduced by the paddings and the border width. + * @param obj pointer to an object + * @note The position of the object is recalculated only on the next redraw. To force coordinate recalculation + * call `lv_obj_update_layout(obj)`. + * @param area the area which still fits into the parent without causing overflow (making the parent scrollable) + */ +void lv_obj_get_content_coords(const lv_obj_t * obj, lv_area_t * area); + +/** + * Get the width occupied by the "parts" of the widget. E.g. the width of all columns of a table. + * @param obj pointer to an object + * @return the width of the virtually drawn content + * @note This size independent from the real size of the widget. + * It just tells how large the internal ("virtual") content is. + */ +int32_t lv_obj_get_self_width(const lv_obj_t * obj); + +/** + * Get the height occupied by the "parts" of the widget. E.g. the height of all rows of a table. + * @param obj pointer to an object + * @return the width of the virtually drawn content + * @note This size independent from the real size of the widget. + * It just tells how large the internal ("virtual") content is. + */ +int32_t lv_obj_get_self_height(const lv_obj_t * obj); + +/** + * Get the style width actually used by the object after clamping the width within the min max range. + * @param obj pointer to an object + * @return the min/max/normal width set by `lv_obj_set_style__width()` + * @note This is not the calculated size, so if the size was set as `LV_SIZE_CONTENT` or `LV_PCT()` + * then that value will be returned. + */ +int32_t lv_obj_get_style_clamped_width(lv_obj_t * obj); + +/** + * Get the style height actually used by the object after clamping the height within the min max range. + * @param obj pointer to an object + * @return the min/max/normal height set by `lv_obj_set_style__height()` + * @note This is not the calculated size, so if the size was set as `LV_SIZE_CONTENT` or `LV_PCT()` + * then that value will be returned. + */ +int32_t lv_obj_get_style_clamped_height(lv_obj_t * obj); + +/** + * @brief Determine if the object's resolved width was limited by its minimum width constraint. + * + * This function reports whether, in the most recent layout / size calculation, the object's + * final (used) width had to be raised to satisfy a minimum width requirement. + * + * @param obj Pointer to a valid object. + * @return true The computed width == the effective minimum width (i.e. it was clamped). + * @return false The width is larger than the minimum (not min‑clamped). + */ +bool lv_obj_is_width_min(lv_obj_t * obj); + +/** + * @brief Determine if the object's resolved height was limited by its minimum height constraint. + * + * This function reports whether, in the most recent layout / size calculation, the object's + * final (used) height had to be raised to satisfy a minimum height requirement. + * + * @param obj Pointer to a valid object. + * @return true The computed height == the effective minimum height (i.e. it was clamped). + * @return false The height is larger than the minimum (not min‑clamped). + */ +bool lv_obj_is_height_min(lv_obj_t * obj); + +/** + * @brief Determine if the object's resolved width was limited by its maximum width constraint. + * + * This function reports whether, in the most recent layout / size calculation, the object's + * final (used) width had to be raised to satisfy a maximum width requirement. + * + * @param obj Pointer to a valid object. + * @return true The computed width == the effective maximum width (i.e. it was clamped). + * @return false The width is smaller than the maximum (not min‑clamped). + */ +bool lv_obj_is_width_max(lv_obj_t * obj); + +/** + * @brief Determine if the object's resolved height was limited by its maximum height constraint. + * + * This function reports whether, in the most recent layout / size calculation, the object's + * final (used) height had to be raised to satisfy a maximum height requirement. + * + * @param obj Pointer to a valid object. + * @return true The computed height == the effective maximum height (i.e. it was clamped). + * @return false The height is smaller than the maximum (not min‑clamped). + */ +bool lv_obj_is_height_max(lv_obj_t * obj); + +/** + * Handle if the size of the internal ("virtual") content of an object has changed. + * @param obj pointer to an object + * @return false: nothing happened; true: refresh happened + */ +bool lv_obj_refresh_self_size(lv_obj_t * obj); + +void lv_obj_refr_pos(lv_obj_t * obj); + +void lv_obj_move_to(lv_obj_t * obj, int32_t x, int32_t y); + +void lv_obj_move_children_by(lv_obj_t * obj, int32_t x_diff, int32_t y_diff, bool ignore_floating); + +/** + * Get the transform matrix of an object + * @param obj pointer to an object + * @return pointer to the transform matrix or NULL if not set + */ +const lv_matrix_t * lv_obj_get_transform(const lv_obj_t * obj); + +/** + * Transform a point using the angle and zoom style properties of an object + * @param obj pointer to an object whose style properties should be used + * @param p a point to transform, the result will be written back here too + * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t` + */ +void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, lv_obj_point_transform_flag_t flags); + +/** + * Transform an array of points using the angle and zoom style properties of an object + * @param obj pointer to an object whose style properties should be used + * @param points the array of points to transform, the result will be written back here too + * @param count number of points in the array + * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t` + */ +void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], size_t count, + lv_obj_point_transform_flag_t flags); + +/** + * Transform an area using the angle and zoom style properties of an object + * @param obj pointer to an object whose style properties should be used + * @param area an area to transform, the result will be written back here too + * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t` + */ +void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, lv_obj_point_transform_flag_t flags); + +/** + * Mark an area of an object as invalid. + * The area will be truncated to the object's area and marked for redraw. + * @param obj pointer to an object + * @param area the area to redraw + * @return LV_RESULT_OK: the area is invalidated; LV_RESULT_INVALID: the area wasn't invalidated. + * (maybe it was off-screen or fully clipped) + */ +lv_result_t lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area); + +/** + * Mark the object as invalid to redrawn its area + * @param obj pointer to an object + * @return LV_RESULT_OK: the area is invalidated; LV_RESULT_INVALID: the area wasn't invalidated. + * (maybe it was off-screen or fully clipped) + */ +lv_result_t lv_obj_invalidate(const lv_obj_t * obj); + +/** + * Tell whether an area of an object is visible (even partially) now or not + * @param obj pointer to an object + * @param area the are to check. The visible part of the area will be written back here. + * @return true visible; false not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area); + +/** + * Tell whether an object is visible (even partially) now or not + * @param obj pointer to an object + * @return true: visible; false not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_is_visible(const lv_obj_t * obj); + +/** + * Set the size of an extended clickable area + * @param obj pointer to an object + * @param size extended clickable area in all 4 directions [px] + */ +void lv_obj_set_ext_click_area(lv_obj_t * obj, int32_t size); + +/** + * Get the an area where to object can be clicked. + * It's the object's normal area plus the extended click area. + * @param obj pointer to an object + * @param area store the result area here + */ +void lv_obj_get_click_area(const lv_obj_t * obj, lv_area_t * area); + +/** + * Hit-test an object given a particular point in screen space. + * @param obj object to hit-test + * @param point screen-space point (absolute coordinate) + * @return true: if the object is considered under the point + */ +bool lv_obj_hit_test(lv_obj_t * obj, const lv_point_t * point); + +/** + * Clamp a width between min and max width. If the min/max width is in percentage value use the ref_width + * @param width width to clamp + * @param min_width the minimal width + * @param max_width the maximal width + * @param ref_width the reference width used when min/max width is in percentage + * @return the clamped width + */ +int32_t lv_clamp_width(int32_t width, int32_t min_width, int32_t max_width, int32_t ref_width); + +/** + * Clamp a height between min and max height. If the min/max height is in percentage value use the ref_height + * @param height height to clamp + * @param min_height the minimal height + * @param max_height the maximal height + * @param ref_height the reference height used when min/max height is in percentage + * @return the clamped height + */ +int32_t lv_clamp_height(int32_t height, int32_t min_height, int32_t max_height, int32_t ref_height); + +/** + * @brief Calculates the width in pixels of an LVGL object based on its style and parent for a given width `prop`. + * @param obj Pointer to the LVGL object whose width is being calculated. + * @param prop Which style width to calculate for. Valid values are: LV_STYLE_WIDTH, LV_STYLE_MIN_WIDTH, or + * LV_STYLE_MAX_WIDTH. + * @return The computed width for the object: + * @note If the style width is a fixed value, that value is returned. + * @note If the style width is `LV_SIZE_CONTENT`, the content width is calculated and returned. + * @note If the style width is a `LV_PCT()`, the percentage is applied to the parent's width. + */ +int32_t lv_obj_calc_dynamic_width(lv_obj_t * obj, lv_style_prop_t prop); + +/** + * @brief Calculates the height in pixels of an LVGL object based on its style and parent for a given height `prop`. + * @param obj Pointer to the LVGL object whose height is being calculated. + * @param prop Which style height to calculate for. Valid values are: LV_STYLE_HEIGHT, LV_STYLE_MIN_HEIGHT, or + * LV_STYLE_MAX_HEIGHT. + * @return The computed height for the object: + * @note If the style height is a fixed value, that value is returned. + * @note If the style height is `LV_SIZE_CONTENT`, the content height is calculated and returned. + * @note If the style height is a `LV_PCT()`, the percentage is applied to the parent's height. + */ +int32_t lv_obj_calc_dynamic_height(lv_obj_t * obj, lv_style_prop_t prop); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_POS_H*/ diff --git a/inc/lvgl/src/core/lv_obj_private.h b/inc/lvgl/src/core/lv_obj_private.h new file mode 100644 index 0000000..70ab09f --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_private.h @@ -0,0 +1,103 @@ +/** + * @file lv_obj_private.h + * + */ + +#ifndef LV_OBJ_PRIVATE_H +#define LV_OBJ_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_ext_data.h" +#include "lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Special, rarely used attributes. + * They are allocated automatically if any elements is set. + */ +struct _lv_obj_spec_attr_t { + lv_obj_t ** children; /**< Store the pointer of the children in an array.*/ + lv_group_t * group_p; +#if LV_DRAW_TRANSFORM_USE_MATRIX + lv_matrix_t * matrix; /**< The transform matrix*/ +#endif + lv_event_list_t event_list; +#if LV_USE_OBJ_NAME + const char * name; /**< Pointer to the name */ +#endif + lv_point_t scroll; /**< The current X/Y scroll offset*/ + + int32_t ext_click_pad; /**< Extra click padding in all direction*/ + int32_t ext_draw_size; /**< EXTend the size in every direction for drawing.*/ + + uint16_t child_cnt; /**< Number of children*/ + uint16_t scrollbar_mode : 2; /**< How to display scrollbars, see `lv_scrollbar_mode_t`*/ + uint16_t scroll_snap_x : 2; /**< Where to align the snappable children horizontally, see `lv_scroll_snap_t`*/ + uint16_t scroll_snap_y : 2; /**< Where to align the snappable children vertically*/ + uint16_t scroll_dir : 4; /**< The allowed scroll direction(s), see `lv_dir_t`*/ + uint16_t layer_type : 2; /**< Cache the layer type here. Element of lv_intermediate_layer_type_t */ + uint16_t name_static : 1; /**< 1: `name` was not dynamically allocated */ +}; + +struct _lv_obj_t { +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif + const lv_obj_class_t * class_p; + lv_obj_t * parent; + lv_obj_spec_attr_t * spec_attr; + lv_obj_style_t * styles; +#if LV_OBJ_STYLE_CACHE + uint32_t style_main_prop_is_set; + uint32_t style_other_prop_is_set; +#endif + void * user_data; +#if LV_USE_OBJ_ID + void * id; +#endif + lv_area_t coords; + lv_obj_flag_t flags; + uint16_t state; + uint16_t layout_inv : 1; + uint16_t readjust_scroll_after_layout : 1; + uint16_t scr_layout_inv : 1; + uint16_t skip_trans : 1; + uint16_t style_cnt : 6; + uint16_t h_layout : 1; + uint16_t w_layout : 1; + uint16_t h_ignore_size : 1; /* ignore this obj when calculating content height of parent */ + uint16_t w_ignore_size : 1; /* ignore this obj when calculating content width of parent */ + uint16_t is_deleting : 1; + uint16_t radio_button : 1; /**< Allow only one RADIO_BUTTON sibling to be checked*/ + + /** The widget is rendered at least once already. + * It's used to skip initial animations and transitions. */ + uint16_t rendered : 1; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_PRIVATE_H*/ diff --git a/inc/lvgl/src/core/lv_obj_property.c b/inc/lvgl/src/core/lv_obj_property.c new file mode 100644 index 0000000..d789991 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_property.c @@ -0,0 +1,339 @@ +/** + * @file lv_obj_property.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_private.h" +#include "../core/lv_obj.h" +#include "../stdlib/lv_string.h" +#include "../misc/lv_utils.h" +#include "lv_obj_property.h" +#include "lv_obj_class_private.h" + +#if LV_USE_OBJ_PROPERTY + +/********************* + * DEFINES + *********************/ + +#define HANDLE_PROPERTY_TYPE(type, field) \ + if(!set) { \ + value->field = ((lv_property_get_##type##_t)(prop->getter))(obj); \ + } else { \ + switch(LV_PROPERTY_ID_TYPE2(prop->id)) { \ + case LV_PROPERTY_ID_INVALID: \ + ((lv_property_set_##type##_t)(prop->setter))(obj, value->field); \ + break; \ + case LV_PROPERTY_TYPE_INT: \ + ((lv_property_set_##type##_integer_t)(prop->setter))(obj, value->arg1.field, value->arg2.num); \ + break; \ + case LV_PROPERTY_TYPE_BOOL: \ + ((lv_property_set_##type##_boolean_t)(prop->setter))(obj, value->arg1.field, value->arg2.enable); \ + break; \ + case LV_PROPERTY_TYPE_PRECISE: \ + ((lv_property_set_##type##_precise_t)(prop->setter))(obj, value->arg1.field, value->arg2.precise); \ + break; \ + case LV_PROPERTY_TYPE_COLOR: \ + ((lv_property_set_##type##_color_t)(prop->setter))(obj, value->arg1.field, value->arg2.color); \ + break; \ + case LV_PROPERTY_TYPE_POINTER: \ + case LV_PROPERTY_TYPE_IMGSRC: \ + case LV_PROPERTY_TYPE_TEXT: \ + case LV_PROPERTY_TYPE_OBJ: \ + case LV_PROPERTY_TYPE_DISPLAY: \ + case LV_PROPERTY_TYPE_FONT: \ + ((lv_property_set_##type##_pointer_t)(prop->setter))(obj, value->arg1.field, value->arg2.ptr); \ + break; \ + } \ + } + + +/********************** + * TYPEDEFS + **********************/ + +typedef int32_t integer; +typedef bool boolean; +typedef lv_value_precise_t precise; +typedef lv_color_t color; +typedef const void * pointer; + +#define DEFINE_PROPERTY_SETTER_TYPES(type) \ + typedef void (*lv_property_set_##type##_t)(lv_obj_t *, type); \ + typedef void (*lv_property_set_##type##_integer_t)(lv_obj_t *, type, int32_t); \ + typedef void (*lv_property_set_##type##_boolean_t)(lv_obj_t *, type, bool); \ + typedef void (*lv_property_set_##type##_precise_t)(lv_obj_t *, type, lv_value_precise_t); \ + typedef void (*lv_property_set_##type##_color_t)(lv_obj_t *, type, lv_color_t); \ + typedef void (*lv_property_set_##type##_pointer_t)(lv_obj_t *, type, const void *) + +DEFINE_PROPERTY_SETTER_TYPES(integer); +DEFINE_PROPERTY_SETTER_TYPES(boolean); +DEFINE_PROPERTY_SETTER_TYPES(precise); +DEFINE_PROPERTY_SETTER_TYPES(color); +DEFINE_PROPERTY_SETTER_TYPES(pointer); + +typedef void (*lv_property_set_point_t)(lv_obj_t *, lv_point_t *); +typedef lv_result_t (*lv_property_setter_t)(lv_obj_t *, lv_prop_id_t, const lv_property_t *); + +typedef integer(*lv_property_get_integer_t)(const lv_obj_t *); +typedef bool (*lv_property_get_boolean_t)(const lv_obj_t *); +typedef lv_value_precise_t (*lv_property_get_precise_t)(const lv_obj_t *); +typedef lv_color_t (*lv_property_get_color_t)(const lv_obj_t *); +typedef void * (*lv_property_get_pointer_t)(const lv_obj_t *); +typedef lv_point_t (*lv_property_get_point_t)(lv_obj_t *); + +typedef lv_result_t (*lv_property_getter_t)(const lv_obj_t *, lv_prop_id_t, lv_property_t *); + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t obj_property(lv_obj_t * obj, lv_prop_id_t id, lv_property_t * value, bool set); +static int property_name_compare(const void * ref, const void * element); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_obj_set_property(lv_obj_t * obj, const lv_property_t * value) +{ + LV_ASSERT(obj && value); + + uint32_t index = LV_PROPERTY_ID_INDEX(value->id); + if(value->id == LV_PROPERTY_ID_INVALID || index > LV_PROPERTY_ID_ANY) { + LV_LOG_WARN("Invalid property id set to %p", obj); + return LV_RESULT_INVALID; + } + + if(index < LV_PROPERTY_ID_START) { + lv_obj_set_local_style_prop(obj, index, value->style, value->selector); + return LV_RESULT_OK; + } + + return obj_property(obj, value->id, (lv_property_t *)value, true); +} + +lv_result_t lv_obj_set_properties(lv_obj_t * obj, const lv_property_t * value, uint32_t count) +{ + for(uint32_t i = 0; i < count; i++) { + lv_result_t result = lv_obj_set_property(obj, &value[i]); + if(result != LV_RESULT_OK) { + return result; + } + } + + return LV_RESULT_OK; +} + +lv_property_t lv_obj_get_property(lv_obj_t * obj, lv_prop_id_t id) +{ + lv_result_t result; + lv_property_t value = { 0 }; + + uint32_t index = LV_PROPERTY_ID_INDEX(id); + if(id == LV_PROPERTY_ID_INVALID || index > LV_PROPERTY_ID_ANY) { + LV_LOG_WARN("Invalid property id to get from %p", obj); + value.id = LV_PROPERTY_ID_INVALID; + value.num = 0; + return value; + } + + if(index < LV_PROPERTY_ID_START) { + value.style = lv_obj_get_style_prop(obj, LV_PART_MAIN, index); + value.id = id; + value.selector = LV_PART_MAIN | obj->state; + return value; + } + + result = obj_property(obj, id, &value, false); + if(result != LV_RESULT_OK) + value.id = LV_PROPERTY_ID_INVALID; + + return value; +} + +lv_property_t lv_obj_get_style_property(lv_obj_t * obj, lv_prop_id_t id, lv_part_t part) +{ + lv_property_t value; + uint32_t index = LV_PROPERTY_ID_INDEX(id); + + if(index == LV_PROPERTY_ID_INVALID || index >= LV_PROPERTY_ID_START) { + LV_LOG_WARN("invalid style property id 0x%" LV_PRIx32, id); + value.id = LV_PROPERTY_ID_INVALID; + value.num = 0; + return value; + } + + value.style = lv_obj_get_style_prop(obj, part, index); + value.id = id; + value.selector = part | obj->state; + return value; +} + +lv_prop_id_t lv_style_property_get_id(const char * name) +{ +#if LV_USE_OBJ_PROPERTY_NAME + lv_property_name_t * found; + /*Check style property*/ + found = lv_utils_bsearch(name, lv_style_property_names, sizeof(lv_style_property_names) / sizeof(lv_property_name_t), + sizeof(lv_property_name_t), property_name_compare); + if(found) return found->id; +#else + LV_UNUSED(name); +#endif + return LV_PROPERTY_ID_INVALID; +} + +lv_prop_id_t lv_obj_class_property_get_id(const lv_obj_class_t * clz, const char * name) +{ +#if LV_USE_OBJ_PROPERTY_NAME + const lv_property_name_t * names; + lv_property_name_t * found; + + names = clz->property_names; + if(names == NULL) { + /* try base class*/ + return LV_PROPERTY_ID_INVALID; + } + + found = lv_utils_bsearch(name, names, clz->names_count, sizeof(lv_property_name_t), property_name_compare); + if(found) return found->id; +#else + LV_UNUSED(obj); + LV_UNUSED(name); + LV_UNUSED(property_name_compare); +#endif + return LV_PROPERTY_ID_INVALID; +} + +lv_prop_id_t lv_obj_property_get_id(const lv_obj_t * obj, const char * name) +{ +#if LV_USE_OBJ_PROPERTY_NAME + const lv_obj_class_t * clz; + lv_prop_id_t id; + + for(clz = obj->class_p; clz; clz = clz->base_class) { + id = lv_obj_class_property_get_id(clz, name); + if(id != LV_PROPERTY_ID_INVALID) return id; + } + + /*Check style property*/ + id = lv_style_property_get_id(name); + if(id != LV_PROPERTY_ID_INVALID) return id; +#else + LV_UNUSED(obj); + LV_UNUSED(name); + LV_UNUSED(property_name_compare); +#endif + return LV_PROPERTY_ID_INVALID; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t obj_property(lv_obj_t * obj, lv_prop_id_t id, lv_property_t * value, bool set) +{ + const lv_property_ops_t * properties; + const lv_property_ops_t * prop; + + const lv_obj_class_t * clz; + uint32_t index = LV_PROPERTY_ID_INDEX(id); + + for(clz = obj->class_p ; clz; clz = clz->base_class) { + properties = clz->properties; + if(properties == NULL) { + /* try base class*/ + continue; + } + + if(id != LV_PROPERTY_ID_ANY && (index < clz->prop_index_start || index > clz->prop_index_end)) { + /* try base class*/ + continue; + } + + /*Check if there's setter available for this class*/ + for(uint32_t i = 0; i < clz->properties_count; i++) { + prop = &properties[i]; + + /*pass id and value directly to widget's property method*/ + if(prop->id == LV_PROPERTY_ID_ANY) { + value->id = prop->id; + if(set) return ((lv_property_setter_t)prop->setter)(obj, id, value); + else return ((lv_property_getter_t)prop->getter)(obj, id, value); + } + + /*Not this id, check next*/ + if(prop->id != id) + continue; + + /*id matched but we got null pointer to functions*/ + if(set ? prop->setter == NULL : prop->getter == NULL) { + LV_LOG_WARN("NULL %s provided, id: 0x%" LV_PRIx32, set ? "setter" : "getter", id); + return LV_RESULT_INVALID; + } + + /*Update value id if it's a read*/ + if(!set) value->id = prop->id; + + switch(LV_PROPERTY_ID_TYPE(prop->id)) { + case LV_PROPERTY_TYPE_INT: + HANDLE_PROPERTY_TYPE(integer, num); + break; + case LV_PROPERTY_TYPE_BOOL: + HANDLE_PROPERTY_TYPE(boolean, enable); + break; + case LV_PROPERTY_TYPE_PRECISE: + HANDLE_PROPERTY_TYPE(precise, precise); + break; + case LV_PROPERTY_TYPE_COLOR: + HANDLE_PROPERTY_TYPE(color, color); + break; + case LV_PROPERTY_TYPE_POINTER: + case LV_PROPERTY_TYPE_IMGSRC: + case LV_PROPERTY_TYPE_TEXT: + case LV_PROPERTY_TYPE_OBJ: + case LV_PROPERTY_TYPE_DISPLAY: + case LV_PROPERTY_TYPE_FONT: + HANDLE_PROPERTY_TYPE(pointer, ptr); + break; + case LV_PROPERTY_TYPE_POINT: { + lv_point_t * point = &value->point; + if(set)((lv_property_set_point_t)(prop->setter))(obj, point); + else *point = ((lv_property_get_point_t)(prop->getter))(obj); + break; + } + default: { + LV_LOG_WARN("Unknown property id: 0x%08" LV_PRIx32, prop->id); + return LV_RESULT_INVALID; + } + } + + return LV_RESULT_OK; + } + + /*If no setter found, try base class then*/ + } + + LV_LOG_WARN("Unknown property id: 0x%08" LV_PRIx32, id); + return LV_RESULT_INVALID; +} + +static int property_name_compare(const void * ref, const void * element) +{ + const lv_property_name_t * prop = element; + return lv_strcmp(ref, prop->name); +} + +#endif /*LV_USE_OBJ_PROPERTY*/ diff --git a/inc/lvgl/src/core/lv_obj_property.h b/inc/lvgl/src/core/lv_obj_property.h new file mode 100644 index 0000000..c5ae9ff --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_property.h @@ -0,0 +1,283 @@ +/** + * @file lv_obj_property.h + * + */ + +#ifndef LV_OBJ_PROPERTY_H +#define LV_OBJ_PROPERTY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../misc/lv_style.h" +#include "lv_obj_style.h" + +#if LV_USE_OBJ_PROPERTY + +/********************* + * DEFINES + *********************/ + +/*All possible property value types*/ +#define LV_PROPERTY_TYPE_INVALID 0 /*Use default 0 as invalid to detect program outliers*/ +#define LV_PROPERTY_TYPE_INT 1 /*int32_t type*/ +#define LV_PROPERTY_TYPE_PRECISE 2 /*lv_value_precise_t, int32_t or float depending on LV_USE_FLOAT*/ +#define LV_PROPERTY_TYPE_COLOR 3 /*ARGB8888 type*/ +#define LV_PROPERTY_TYPE_POINT 4 /*lv_point_t */ +#define LV_PROPERTY_TYPE_POINTER 5 /*void * pointer*/ +#define LV_PROPERTY_TYPE_IMGSRC 6 /*Special pointer for image*/ +#define LV_PROPERTY_TYPE_TEXT 7 /*Special pointer of char* */ +#define LV_PROPERTY_TYPE_OBJ 8 /*Special pointer of lv_obj_t* */ +#define LV_PROPERTY_TYPE_DISPLAY 9 /*Special pointer of lv_display_t* */ +#define LV_PROPERTY_TYPE_FONT 10 /*Special pointer of lv_font_t* */ +#define LV_PROPERTY_TYPE_BOOL 11 /*int32_t type*/ + +#define LV_PROPERTY_TYPE_SHIFT 28 +#define LV_PROPERTY_TYPE2_SHIFT 24 + +/* Example: + * LV_PROPERTY_ID(OBJ, FLAG_CLICKABLE, LV_PROPERTY_TYPE_INT, 1), + * produces + * LV_PROPERTY_OBJ_FLAG_CLICKABLE = (LV_PROPERTY_OBJ_START + (1)) | ((LV_PROPERTY_TYPE_INT) << LV_PROPERTY_TYPE_SHIFT) + */ +#define LV_PROPERTY_ID(clz, name, type, index) LV_PROPERTY_## clz ##_##name = (LV_PROPERTY_## clz ##_START + ((int)index)) | ((type) << LV_PROPERTY_TYPE_SHIFT) + +/* Example: + * LV_PROPERTY_ID2(SLIDER, VALUE, LV_PROPERTY_TYPE_INT, LV_PROPERTY_TYPE_BOOL, 0) + * produces + * LV_PROPERTY_SLIDER_VALUE = (LV_PROPERTY_SLIDER_START + (0)) | ((LV_PROPERTY_TYPE_INT) << LV_PROPERTY_TYPE_SHIFT) | ((LV_PROPERTY_TYPE_BOOL) << LV_PROPERTY_TYPE2_SHIFT) + */ +#define LV_PROPERTY_ID2(clz, name, type, type2, index) LV_PROPERTY_ID(clz, name, type, index) | ((type2) << LV_PROPERTY_TYPE2_SHIFT) + +#define LV_PROPERTY_ID_TYPE(id) ((id) >> LV_PROPERTY_TYPE_SHIFT) +#define LV_PROPERTY_ID_TYPE2(id) ((id) >> LV_PROPERTY_TYPE_SHIFT) +#define LV_PROPERTY_ID_INDEX(id) ((id) & 0xfffffff) + +/*Set properties from an array of lv_property_t*/ +#define LV_OBJ_SET_PROPERTY_ARRAY(obj, array) lv_obj_set_properties(obj, array, LV_ARRAYLEN(array)) + +/* Helper to implement class definition of property and property names */ +/* *INDENT-OFF* */ +#if LV_USE_OBJ_PROPERTY_NAME +#define LV_PROPERTY_CLASS_FIELDS(widget, uppercase) \ + .prop_index_start = LV_PROPERTY_##uppercase##_START, \ + .prop_index_end = LV_PROPERTY_##uppercase##_END, \ + .properties = lv_##widget##_properties, \ + .properties_count = LV_ARRAYLEN(lv_##widget##_properties), \ + .property_names = lv_##widget##_property_names, \ + .names_count = LV_ARRAYLEN(lv_##widget##_property_names) +#else +#define LV_PROPERTY_CLASS_FIELDS(widget, uppercase) \ + .prop_index_start = LV_PROPERTY_##uppercase##_START, \ + .prop_index_end = LV_PROPERTY_##uppercase##_END, \ + .properties = lv_##widget##_properties, \ + .properties_count = LV_ARRAYLEN(lv_##widget##_properties) +#endif +/* *INDENT-ON* */ + + +/********************** + * TYPEDEFS + **********************/ + +/** + * Group of predefined widget ID start value. + */ +enum _lv_prop_id_range_boundary_t { + LV_PROPERTY_ID_INVALID = 0, + + /*ID 0x01 to 0xff are style ID, check lv_style_prop_t*/ + LV_PROPERTY_STYLE_START = 0x00, + + LV_PROPERTY_ID_START = 0x0100, /*ID smaller than 0xff is style ID*/ + /*Define the property ID for every widget here. */ + LV_PROPERTY_OBJ_START = 0x0100, /* lv_obj.c */ + LV_PROPERTY_IMAGE_START = 0x0200, /* lv_image.c */ + LV_PROPERTY_LABEL_START = 0x0300, /* lv_label.c */ + LV_PROPERTY_KEYBOARD_START = 0x0400, /* lv_keyboard.c */ + LV_PROPERTY_TEXTAREA_START = 0x0500, /* lv_textarea.c */ + LV_PROPERTY_ROLLER_START = 0x0600, /* lv_roller.c */ + LV_PROPERTY_DROPDOWN_START = 0x0700, /* lv_dropdown.c */ + LV_PROPERTY_SLIDER_START = 0x0800, /* lv_slider.c */ + LV_PROPERTY_ANIMIMAGE_START = 0x0900, /* lv_animimage.c */ + LV_PROPERTY_ARC_START = 0x0a00, /* lv_arc.c */ + LV_PROPERTY_BAR_START = 0x0b00, /* lv_bar.c */ + LV_PROPERTY_SWITCH_START = 0x0c00, /* lv_switch.c */ + LV_PROPERTY_CHECKBOX_START = 0x0d00, /* lv_checkbox.c */ + LV_PROPERTY_LED_START = 0x0e00, /* lv_led.c */ + LV_PROPERTY_LINE_START = 0x0f00, /* lv_line.c */ + LV_PROPERTY_SCALE_START = 0x1000, /* lv_scale.c */ + LV_PROPERTY_SPINBOX_START = 0x1100, /* lv_spinbox.c */ + LV_PROPERTY_SPINNER_START = 0x1200, /* lv_spinner.c */ + LV_PROPERTY_TABLE_START = 0x1300, /* lv_table.c */ + LV_PROPERTY_TABVIEW_START = 0x1400, /* lv_tabview.c */ + LV_PROPERTY_BUTTONMATRIX_START = 0x1500, /* lv_buttonmatrix.c */ + LV_PROPERTY_SPAN_START = 0x1600, /* lv_span.c */ + LV_PROPERTY_MENU_START = 0x1700, /* lv_menu.c */ + LV_PROPERTY_CHART_START = 0x1800, /* lv_chart.c */ + + /*Special ID, use it to extend ID and make sure it's unique and compile time determinant*/ + LV_PROPERTY_ID_BUILTIN_LAST = 0xffff, /*ID of 0x10000 ~ 0xfffffff is reserved for user*/ + + LV_PROPERTY_ID_ANY = 0x7ffffffe, /*Special ID used by lvgl to intercept all setter/getter call.*/ +}; + +struct _lv_property_name_t { + const char * name; + lv_prop_id_t id; +}; + +typedef struct { + lv_prop_id_t id; + union { + int32_t num; /**< Signed integer number (enums or "normal" numbers)*/ + uint32_t num_u; /**< Unsigned integer number (opacity, Booleans) */ + bool enable; /**< Booleans */ + const void * ptr; /**< Constant pointers (font, cone text, etc.) */ + lv_color_t color; /**< Colors */ + lv_value_precise_t precise; /**< float or int for precise value */ + lv_point_t point; /**< Point, contains two int32_t */ + + struct { + /** + * Note that place struct member `style` at first place is intended. + * `style` shares same memory with `num`, `ptr`, `color`. + * So we set the style value directly without using `prop.style.num`. + * + * E.g. + * + * static const lv_property_t obj_pos_x = { + * .id = LV_PROPERTY_STYLE_X, + * .num = 123, + * .selector = LV_STATE_PRESSED, + * } + * + * instead of: + * static const lv_property_t obj_pos_x = { + * .id = LV_PROPERTY_STYLE_X, + * .style.num = 123, // note this line. + * .selector = LV_STATE_PRESSED, + * } + */ + lv_style_value_t style; /**< Make sure it's the first element in struct. */ + uint32_t selector; /**< Style selector, lv_part_t | lv_state_t */ + }; + + /** + * For some properties like slider range, it contains two simple (4-byte) values + * so we can use `arg1.num` and `arg2.num` to set the argument. + */ + struct { + union { + int32_t num; + uint32_t num_u; + bool enable; + const void * ptr; + lv_color_t color; + lv_value_precise_t precise; + } arg1, arg2; + }; + }; +} lv_property_t; + +typedef struct { + lv_prop_id_t id; + + void * setter; /**< Callback used to set property. */ + void * getter; /**< Callback used to get property. */ +} lv_property_ops_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set Widget property. + * @param obj pointer to Widget + * @param value property value to set + * @return return LV_RESULT_OK if call succeeded + */ +lv_result_t lv_obj_set_property(lv_obj_t * obj, const lv_property_t * value); + +/** + * Set multiple Widget properties. Helper `LV_OBJ_SET_PROPERTY_ARRAY` can be used for constant property array. + * @param obj pointer to Widget + * @param value property value array to set + * @param count number of array elements + * @return return LV_RESULT_OK if call succeeded + */ +lv_result_t lv_obj_set_properties(lv_obj_t * obj, const lv_property_t * value, uint32_t count); + +/*===================== + * Getter functions + *====================*/ + +/** + * Read property value from Widget. + * If id is a style property, computes the style of PART_MAIN. + * @param obj pointer to Widget + * @param id ID of property to read + * @return return property value read. The returned property ID is set to `LV_PROPERTY_ID_INVALID` if read failed. + */ +lv_property_t lv_obj_get_property(lv_obj_t * obj, lv_prop_id_t id); + +/** + * Read style property value from Widget + * @param obj pointer to Widget + * @param id ID of style property + * @param part part for which the style property should be computed + * @return return property value read. The returned property ID is set to `LV_PROPERTY_ID_INVALID` if read failed. + */ +lv_property_t lv_obj_get_style_property(lv_obj_t * obj, lv_prop_id_t id, lv_part_t part); + +/** + * Get property ID by recursively searching for name in Widget's class hierarchy, and + * if still not found, then search style properties. + * Requires to enabling `LV_USE_OBJ_PROPERTY_NAME`. + * @param obj pointer to Widget whose class and base-class hierarchy are to be searched. + * @param name property name + * @return property ID found or `LV_PROPERTY_ID_INVALID` if not found. + */ +lv_prop_id_t lv_obj_property_get_id(const lv_obj_t * obj, const char * name); + +/** + * Get property ID by doing a non-recursive search for name directly in Widget class properties. + * Requires enabling `LV_USE_OBJ_PROPERTY_NAME`. + * @param clz pointer to Widget class that has specified property. + * @param name property name + * @return property ID found or `LV_PROPERTY_ID_INVALID` if not found. + */ +lv_prop_id_t lv_obj_class_property_get_id(const lv_obj_class_t * clz, const char * name); + +/** + * Get style property ID by name. Requires enabling `LV_USE_OBJ_PROPERTY_NAME`. + * @param name property name + * @return property ID found or `LV_PROPERTY_ID_INVALID` if not found. + */ +lv_prop_id_t lv_style_property_get_id(const char * name); + +/********************** + * MACROS + **********************/ + +#include "../widgets/property/lv_obj_property_names.h" +#include "../widgets/property/lv_style_properties.h" + +#else +#define LV_PROPERTY_CLASS_FIELDS(widget, uppercase) +#endif /*LV_USE_OBJ_PROPERTY*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_PROPERTY_H*/ diff --git a/inc/lvgl/src/core/lv_obj_scroll.c b/inc/lvgl/src/core/lv_obj_scroll.c new file mode 100644 index 0000000..237c6fb --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_scroll.c @@ -0,0 +1,817 @@ +/** + * @file lv_obj_scroll.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_scroll_private.h" +#include "../misc/lv_anim_private.h" +#include "lv_obj_private.h" +#include "../indev/lv_indev.h" +#include "../indev/lv_indev_scroll.h" +#include "../display/lv_display.h" +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#ifndef SCROLL_ANIM_TIME_MIN + #define SCROLL_ANIM_TIME_MIN 200 /*ms*/ +#endif +#ifndef SCROLL_ANIM_TIME_MAX + #define SCROLL_ANIM_TIME_MAX 400 /*ms*/ +#endif +#define SCROLLBAR_MIN_SIZE (LV_DPX(10)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void scroll_x_anim(void * obj, int32_t v); +static void scroll_y_anim(void * obj, int32_t v); +static void scroll_end_cb(lv_anim_t * a); +static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_point_t * scroll_value, + lv_anim_enable_t anim_en); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/*===================== + * Setter functions + *====================*/ + +void lv_obj_set_scrollbar_mode(lv_obj_t * obj, lv_scrollbar_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_allocate_spec_attr(obj); + + if(obj->spec_attr->scrollbar_mode == mode) return; + obj->spec_attr->scrollbar_mode = mode; + lv_obj_invalidate(obj); +} + +void lv_obj_set_scroll_dir(lv_obj_t * obj, lv_dir_t dir) +{ + lv_obj_allocate_spec_attr(obj); + + if(dir != obj->spec_attr->scroll_dir) { + obj->spec_attr->scroll_dir = dir; + } +} + +void lv_obj_set_scroll_snap_x(lv_obj_t * obj, lv_scroll_snap_t align) +{ + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->scroll_snap_x = align; +} + +void lv_obj_set_scroll_snap_y(lv_obj_t * obj, lv_scroll_snap_t align) +{ + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->scroll_snap_y = align; +} + +/*===================== + * Getter functions + *====================*/ + +lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const lv_obj_t * obj) +{ + if(obj->spec_attr) return (lv_scrollbar_mode_t) obj->spec_attr->scrollbar_mode; + else return LV_SCROLLBAR_MODE_AUTO; +} + +lv_dir_t lv_obj_get_scroll_dir(const lv_obj_t * obj) +{ + if(obj->spec_attr) return (lv_dir_t) obj->spec_attr->scroll_dir; + else return LV_DIR_ALL; +} + +lv_scroll_snap_t lv_obj_get_scroll_snap_x(const lv_obj_t * obj) +{ + if(obj->spec_attr) return (lv_scroll_snap_t) obj->spec_attr->scroll_snap_x; + else return LV_SCROLL_SNAP_NONE; +} + +lv_scroll_snap_t lv_obj_get_scroll_snap_y(const lv_obj_t * obj) +{ + if(obj->spec_attr) return (lv_scroll_snap_t) obj->spec_attr->scroll_snap_y; + else return LV_SCROLL_SNAP_NONE; +} + +int32_t lv_obj_get_scroll_x(const lv_obj_t * obj) +{ + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.x; +} + +int32_t lv_obj_get_scroll_y(const lv_obj_t * obj) +{ + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.y; +} + +int32_t lv_obj_get_scroll_top(const lv_obj_t * obj) +{ + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.y; +} + +int32_t lv_obj_get_scroll_bottom(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + int32_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + const lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + int32_t tmp_y = child->coords.y2 + lv_obj_get_style_margin_bottom(child, LV_PART_MAIN); + child_res = LV_MAX(child_res, tmp_y); + } + + int32_t space_top = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t space_bottom = lv_obj_get_style_space_bottom(obj, LV_PART_MAIN); + + if(child_res != LV_COORD_MIN) { + child_res -= (obj->coords.y2 - space_bottom); + } + + int32_t self_h = lv_obj_get_self_height(obj); + self_h = self_h - (lv_obj_get_height(obj) - space_top - space_bottom); + self_h -= lv_obj_get_scroll_y(obj); + return LV_MAX(child_res, self_h); +} + +int32_t lv_obj_get_scroll_left(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Normally can't scroll the object out on the left. + *So simply use the current scroll position as "left size"*/ + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + if(obj->spec_attr == NULL) return 0; + return -obj->spec_attr->scroll.x; + } + + /*With RTL base direction scrolling the left is normal so find the left most coordinate*/ + int32_t space_right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + int32_t space_left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + + int32_t child_res = 0; + + uint32_t i; + int32_t x1 = LV_COORD_MAX; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + const lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + int32_t tmp_x = child->coords.x1 - lv_obj_get_style_margin_left(child, LV_PART_MAIN); + x1 = LV_MIN(x1, tmp_x); + } + + if(x1 != LV_COORD_MAX) { + child_res = x1; + child_res = (obj->coords.x1 + space_left) - child_res; + } + else { + child_res = LV_COORD_MIN; + } + + int32_t self_w = lv_obj_get_self_width(obj); + self_w = self_w - (lv_obj_get_width(obj) - space_right - space_left); + self_w += lv_obj_get_scroll_x(obj); + + return LV_MAX(child_res, self_w); +} + +int32_t lv_obj_get_scroll_right(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*With RTL base dir can't scroll to the object out on the right. + *So simply use the current scroll position as "right size"*/ + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + if(obj->spec_attr == NULL) return 0; + return obj->spec_attr->scroll.x; + } + + /*With other base direction (LTR) scrolling to the right is normal so find the right most coordinate*/ + int32_t child_res = LV_COORD_MIN; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + const lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + + int32_t tmp_x = child->coords.x2 + lv_obj_get_style_margin_right(child, LV_PART_MAIN); + child_res = LV_MAX(child_res, tmp_x); + } + + int32_t space_right = lv_obj_get_style_space_right(obj, LV_PART_MAIN); + int32_t space_left = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + + if(child_res != LV_COORD_MIN) { + child_res -= (obj->coords.x2 - space_right); + } + + int32_t self_w; + self_w = lv_obj_get_self_width(obj); + self_w = self_w - (lv_obj_get_width(obj) - space_right - space_left); + self_w -= lv_obj_get_scroll_x(obj); + return LV_MAX(child_res, self_w); +} + +void lv_obj_get_scroll_end(lv_obj_t * obj, lv_point_t * end) +{ + lv_anim_t * a; + a = lv_anim_get(obj, scroll_x_anim); + end->x = a ? -a->end_value : lv_obj_get_scroll_x(obj); + + a = lv_anim_get(obj, scroll_y_anim); + end->y = a ? -a->end_value : lv_obj_get_scroll_y(obj); +} + +/*===================== + * Other functions + *====================*/ + +void lv_obj_scroll_by_bounded(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en) +{ + if(dx == 0 && dy == 0) return; + + /*We need to know the final sizes for bound check*/ + lv_obj_update_layout(obj); + + /*Don't let scroll more than naturally possible by the size of the content*/ + int32_t x_current = -lv_obj_get_scroll_x(obj); + int32_t x_bounded = x_current + dx; + + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + if(x_bounded > 0) x_bounded = 0; + if(x_bounded < 0) { + int32_t scroll_max = lv_obj_get_scroll_left(obj) + lv_obj_get_scroll_right(obj); + if(scroll_max < 0) scroll_max = 0; + + if(x_bounded < -scroll_max) x_bounded = -scroll_max; + } + } + else { + if(x_bounded < 0) x_bounded = 0; + if(x_bounded > 0) { + int32_t scroll_max = lv_obj_get_scroll_left(obj) + lv_obj_get_scroll_right(obj); + if(scroll_max < 0) scroll_max = 0; + + if(x_bounded > scroll_max) x_bounded = scroll_max; + } + } + + /*Don't let scroll more than naturally possible by the size of the content*/ + int32_t y_current = -lv_obj_get_scroll_y(obj); + int32_t y_bounded = y_current + dy; + + if(y_bounded > 0) y_bounded = 0; + if(y_bounded < 0) { + int32_t scroll_max = lv_obj_get_scroll_top(obj) + lv_obj_get_scroll_bottom(obj); + if(scroll_max < 0) scroll_max = 0; + if(y_bounded < -scroll_max) y_bounded = -scroll_max; + } + + dx = x_bounded - x_current; + dy = y_bounded - y_current; + if(dx || dy) { + lv_obj_scroll_by(obj, dx, dy, anim_en); + } +} + +void lv_obj_scroll_by(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en) +{ + if(dx == 0 && dy == 0) return; + if(anim_en) { + lv_display_t * d = lv_obj_get_display(obj); + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_deleted_cb(&a, scroll_end_cb); + + if(dx) { + uint32_t t = lv_anim_speed_clamped((lv_display_get_horizontal_resolution(d)) >> 1, SCROLL_ANIM_TIME_MIN, + SCROLL_ANIM_TIME_MAX); + lv_anim_set_duration(&a, t); + int32_t sx = lv_obj_get_scroll_x(obj); + lv_anim_set_values(&a, -sx, -sx + dx); + lv_anim_set_exec_cb(&a, scroll_x_anim); + lv_anim_set_path_cb(&a, lv_anim_path_ease_out); + + lv_result_t res; + res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, &a); + if(res != LV_RESULT_OK) return; + lv_anim_start(&a); + } + + if(dy) { + uint32_t t = lv_anim_speed_clamped((lv_display_get_vertical_resolution(d)) >> 1, SCROLL_ANIM_TIME_MIN, + SCROLL_ANIM_TIME_MAX); + lv_anim_set_duration(&a, t); + int32_t sy = lv_obj_get_scroll_y(obj); + lv_anim_set_values(&a, -sy, -sy + dy); + lv_anim_set_exec_cb(&a, scroll_y_anim); + lv_anim_set_path_cb(&a, lv_anim_path_ease_out); + + lv_result_t res; + res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, &a); + if(res != LV_RESULT_OK) return; + lv_anim_start(&a); + } + } + else { + /*Remove pending animations*/ + lv_anim_delete(obj, scroll_y_anim); + lv_anim_delete(obj, scroll_x_anim); + + lv_result_t res; + res = lv_obj_send_event(obj, LV_EVENT_SCROLL_BEGIN, NULL); + if(res != LV_RESULT_OK) return; + + res = lv_obj_scroll_by_raw(obj, dx, dy); + if(res != LV_RESULT_OK) return; + + res = lv_obj_send_event(obj, LV_EVENT_SCROLL_END, NULL); + if(res != LV_RESULT_OK) return; + } +} + +void lv_obj_scroll_to(lv_obj_t * obj, int32_t x, int32_t y, lv_anim_enable_t anim_en) +{ + lv_obj_scroll_to_x(obj, x, anim_en); + lv_obj_scroll_to_y(obj, y, anim_en); +} + +void lv_obj_scroll_to_x(lv_obj_t * obj, int32_t x, lv_anim_enable_t anim_en) +{ + lv_anim_delete(obj, scroll_x_anim); + + int32_t scroll_x = lv_obj_get_scroll_x(obj); + int32_t diff = -x + scroll_x; + + lv_obj_scroll_by_bounded(obj, diff, 0, anim_en); +} + +void lv_obj_scroll_to_y(lv_obj_t * obj, int32_t y, lv_anim_enable_t anim_en) +{ + lv_anim_delete(obj, scroll_y_anim); + + int32_t scroll_y = lv_obj_get_scroll_y(obj); + int32_t diff = -y + scroll_y; + + lv_obj_scroll_by_bounded(obj, 0, diff, anim_en); +} + +void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + /*Be sure the screens layout is correct*/ + lv_obj_update_layout(obj); + + lv_point_t p = {0, 0}; + scroll_area_into_view(&obj->coords, obj, &p, anim_en); +} + +void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + /*Be sure the screens layout is correct*/ + lv_obj_update_layout(obj); + + lv_point_t p = {0, 0}; + lv_obj_t * child = obj; + lv_obj_t * parent = lv_obj_get_parent(child); + while(parent) { + scroll_area_into_view(&obj->coords, child, &p, anim_en); + child = parent; + parent = lv_obj_get_parent(parent); + } +} + +lv_result_t lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y) +{ + if(x == 0 && y == 0) return LV_RESULT_OK; + + lv_obj_allocate_spec_attr(obj); + + obj->spec_attr->scroll.x += x; + obj->spec_attr->scroll.y += y; + + lv_obj_move_children_by(obj, x, y, true); + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_SCROLL, NULL); + if(res != LV_RESULT_OK) return res; + lv_obj_invalidate(obj); + return LV_RESULT_OK; +} + +bool lv_obj_is_scrolling(const lv_obj_t * obj) +{ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_scroll_obj(indev) == obj) return true; + indev = lv_indev_get_next(indev); + } + + if(lv_anim_get((lv_obj_t *)obj, scroll_x_anim) != NULL || + lv_anim_get((lv_obj_t *)obj, scroll_y_anim) != NULL) { + return true; + } + + return false; +} + +void lv_obj_stop_scroll_anim(const lv_obj_t * obj) +{ + lv_anim_delete((lv_obj_t *)obj, scroll_y_anim); + lv_anim_delete((lv_obj_t *)obj, scroll_x_anim); +} + +void lv_obj_update_snap(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + lv_obj_update_layout(obj); + lv_point_t p; + lv_indev_scroll_get_snap_dist(obj, &p); + if(p.x == LV_COORD_MAX || p.x == LV_COORD_MIN) p.x = 0; + if(p.y == LV_COORD_MAX || p.y == LV_COORD_MIN) p.y = 0; + lv_obj_scroll_by(obj, p.x, p.y, anim_en); +} + +void lv_obj_get_scrollbar_area(lv_obj_t * obj, lv_area_t * hor_area, lv_area_t * ver_area) +{ + lv_area_set(hor_area, 0, 0, -1, -1); + lv_area_set(ver_area, 0, 0, -1, -1); + + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLLABLE) == false) return; + + lv_scrollbar_mode_t sm = lv_obj_get_scrollbar_mode(obj); + if(sm == LV_SCROLLBAR_MODE_OFF) return; + + /*If there is no indev scrolling this object but `mode==active` return*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + if(sm == LV_SCROLLBAR_MODE_ACTIVE) { + while(indev) { + if(lv_indev_get_scroll_obj(indev) == obj) break; + indev = lv_indev_get_next(indev); + } + if(indev == NULL) return; + } + + int32_t st = lv_obj_get_scroll_top(obj); + int32_t sb = lv_obj_get_scroll_bottom(obj); + int32_t sl = lv_obj_get_scroll_left(obj); + int32_t sr = lv_obj_get_scroll_right(obj); + + lv_dir_t dir = lv_obj_get_scroll_dir(obj); + + bool ver_draw = false; + if((dir & LV_DIR_VER) && + ((sm == LV_SCROLLBAR_MODE_ON) || + (sm == LV_SCROLLBAR_MODE_AUTO && (st > 0 || sb > 0)) || + (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_DIR_VER))) { + ver_draw = true; + } + + bool hor_draw = false; + if((dir & LV_DIR_HOR) && + ((sm == LV_SCROLLBAR_MODE_ON) || + (sm == LV_SCROLLBAR_MODE_AUTO && (sl > 0 || sr > 0)) || + (sm == LV_SCROLLBAR_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_DIR_HOR))) { + hor_draw = true; + } + + if(!hor_draw && !ver_draw) return; + + bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_SCROLLBAR) == LV_BASE_DIR_RTL; + + int32_t top_space = lv_obj_get_style_pad_top(obj, LV_PART_SCROLLBAR); + int32_t bottom_space = lv_obj_get_style_pad_bottom(obj, LV_PART_SCROLLBAR); + int32_t left_space = lv_obj_get_style_pad_left(obj, LV_PART_SCROLLBAR); + int32_t right_space = lv_obj_get_style_pad_right(obj, LV_PART_SCROLLBAR); + int32_t thickness = lv_obj_get_style_width(obj, LV_PART_SCROLLBAR); + int32_t length = lv_obj_get_style_length(obj, LV_PART_SCROLLBAR); + + int32_t obj_h = lv_obj_get_height(obj); + int32_t obj_w = lv_obj_get_width(obj); + + /*Space required for the vertical and horizontal scrollbars*/ + int32_t ver_reg_space = ver_draw ? thickness : 0; + int32_t hor_req_space = hor_draw ? thickness : 0; + int32_t rem; + + if(lv_obj_get_style_bg_opa(obj, LV_PART_SCROLLBAR) <= LV_OPA_MIN && + lv_obj_get_style_border_opa(obj, LV_PART_SCROLLBAR) <= LV_OPA_MIN) { + return; + } + + /*Draw vertical scrollbar if the mode is ON or can be scrolled in this direction*/ + int32_t content_h = obj_h + st + sb; + if(ver_draw && content_h) { + ver_area->y1 = obj->coords.y1; + ver_area->y2 = obj->coords.y2; + if(rtl) { + ver_area->x1 = obj->coords.x1 + left_space; + ver_area->x2 = ver_area->x1 + thickness - 1; + } + else { + ver_area->x2 = obj->coords.x2 - right_space; + ver_area->x1 = ver_area->x2 - thickness + 1; + } + + int32_t sb_h = ((obj_h - top_space - bottom_space - hor_req_space) * obj_h) / content_h; + sb_h = LV_MAX(length > 0 ? length : sb_h, SCROLLBAR_MIN_SIZE); /*Style-defined size, calculated size, or minimum size*/ + sb_h = LV_MIN(sb_h, obj_h); /*Limit scrollbar length to parent height*/ + rem = (obj_h - top_space - bottom_space - hor_req_space) - + sb_h; /*Remaining size from the scrollbar track that is not the scrollbar itself*/ + int32_t scroll_h = content_h - obj_h; /*The size of the content which can be really scrolled*/ + if(scroll_h <= 0) { + ver_area->y1 = obj->coords.y1 + top_space; + ver_area->y2 = obj->coords.y2 - bottom_space - hor_req_space - 1; + } + else { + int32_t sb_y = (rem * sb) / scroll_h; + sb_y = rem - sb_y; + + ver_area->y1 = obj->coords.y1 + sb_y + top_space; + ver_area->y2 = ver_area->y1 + sb_h - 1; + if(ver_area->y1 < obj->coords.y1 + top_space) { + ver_area->y1 = obj->coords.y1 + top_space; + if(ver_area->y1 + SCROLLBAR_MIN_SIZE > ver_area->y2) { + ver_area->y2 = ver_area->y1 + SCROLLBAR_MIN_SIZE; + } + } + if(ver_area->y2 > obj->coords.y2 - hor_req_space - bottom_space) { + ver_area->y2 = obj->coords.y2 - hor_req_space - bottom_space; + if(ver_area->y2 - SCROLLBAR_MIN_SIZE < ver_area->y1) { + ver_area->y1 = ver_area->y2 - SCROLLBAR_MIN_SIZE; + } + } + } + } + + /*Draw horizontal scrollbar if the mode is ON or can be scrolled in this direction*/ + int32_t content_w = obj_w + sl + sr; + if(hor_draw && content_w) { + hor_area->y2 = obj->coords.y2 - bottom_space; + hor_area->y1 = hor_area->y2 - thickness + 1; + hor_area->x1 = obj->coords.x1; + hor_area->x2 = obj->coords.x2; + + int32_t sb_w = ((obj_w - left_space - right_space - ver_reg_space) * obj_w) / content_w; + sb_w = LV_MAX(length > 0 ? length : sb_w, SCROLLBAR_MIN_SIZE); /*Style-defined size, calculated size, or minimum size*/ + sb_w = LV_MIN(sb_w, obj_w); /*Limit scrollbar length to parent width*/ + rem = (obj_w - left_space - right_space - ver_reg_space) - + sb_w; /*Remaining size from the scrollbar track that is not the scrollbar itself*/ + int32_t scroll_w = content_w - obj_w; /*The size of the content which can be really scrolled*/ + if(scroll_w <= 0) { + if(rtl) { + hor_area->x1 = obj->coords.x1 + left_space + ver_reg_space - 1; + hor_area->x2 = obj->coords.x2 - right_space; + } + else { + hor_area->x1 = obj->coords.x1 + left_space; + hor_area->x2 = obj->coords.x2 - right_space - ver_reg_space - 1; + } + } + else { + int32_t sb_x = (rem * sr) / scroll_w; + sb_x = rem - sb_x; + + if(rtl) { + hor_area->x1 = obj->coords.x1 + sb_x + left_space + ver_reg_space; + hor_area->x2 = hor_area->x1 + sb_w - 1; + if(hor_area->x1 < obj->coords.x1 + left_space + ver_reg_space) { + hor_area->x1 = obj->coords.x1 + left_space + ver_reg_space; + if(hor_area->x1 + SCROLLBAR_MIN_SIZE > hor_area->x2) { + hor_area->x2 = hor_area->x1 + SCROLLBAR_MIN_SIZE; + } + } + if(hor_area->x2 > obj->coords.x2 - right_space) { + hor_area->x2 = obj->coords.x2 - right_space; + if(hor_area->x2 - SCROLLBAR_MIN_SIZE < hor_area->x1) { + hor_area->x1 = hor_area->x2 - SCROLLBAR_MIN_SIZE; + } + } + } + else { + hor_area->x1 = obj->coords.x1 + sb_x + left_space; + hor_area->x2 = hor_area->x1 + sb_w - 1; + if(hor_area->x1 < obj->coords.x1 + left_space) { + hor_area->x1 = obj->coords.x1 + left_space; + if(hor_area->x1 + SCROLLBAR_MIN_SIZE > hor_area->x2) { + hor_area->x2 = hor_area->x1 + SCROLLBAR_MIN_SIZE; + } + } + if(hor_area->x2 > obj->coords.x2 - ver_reg_space - right_space) { + hor_area->x2 = obj->coords.x2 - ver_reg_space - right_space; + if(hor_area->x2 - SCROLLBAR_MIN_SIZE < hor_area->x1) { + hor_area->x1 = hor_area->x2 - SCROLLBAR_MIN_SIZE; + } + } + } + } + } +} + +void lv_obj_scrollbar_invalidate(lv_obj_t * obj) +{ + lv_area_t hor_area; + lv_area_t ver_area; + lv_obj_get_scrollbar_area(obj, &hor_area, &ver_area); + + if(lv_area_get_size(&hor_area) <= 0 && lv_area_get_size(&ver_area) <= 0) return; + + if(lv_area_get_size(&hor_area) > 0) lv_obj_invalidate_area(obj, &hor_area); + if(lv_area_get_size(&ver_area) > 0) lv_obj_invalidate_area(obj, &ver_area); +} + +void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + /*Be sure the bottom side is not remains scrolled in*/ + /*With snapping the content can't be scrolled in*/ + if(lv_obj_get_scroll_snap_y(obj) == LV_SCROLL_SNAP_NONE) { + int32_t st = lv_obj_get_scroll_top(obj); + int32_t sb = lv_obj_get_scroll_bottom(obj); + if(sb < 0 && st > 0) { + sb = LV_MIN(st, -sb); + lv_obj_scroll_by(obj, 0, sb, anim_en); + } + } + + if(lv_obj_get_scroll_snap_x(obj) == LV_SCROLL_SNAP_NONE) { + int32_t sl = lv_obj_get_scroll_left(obj); + int32_t sr = lv_obj_get_scroll_right(obj); + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + /*Be sure the left side is not remains scrolled in*/ + if(sr < 0 && sl > 0) { + sr = LV_MIN(sl, -sr); + lv_obj_scroll_by(obj, sr, 0, anim_en); + } + } + else { + /*Be sure the right side is not remains scrolled in*/ + if(sl < 0 && sr > 0) { + sr = LV_MIN(sr, -sl); + lv_obj_scroll_by(obj, sl, 0, anim_en); + } + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void scroll_x_anim(void * obj, int32_t v) +{ + lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0); +} + +static void scroll_y_anim(void * obj, int32_t v) +{ + lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj)); +} + +static void scroll_end_cb(lv_anim_t * a) +{ + /*Do not sent END event if there wasn't a BEGIN*/ + if(a->start_cb_called) lv_obj_send_event(a->var, LV_EVENT_SCROLL_END, NULL); +} + +static void scroll_area_into_view(const lv_area_t * area, lv_obj_t * child, lv_point_t * scroll_value, + lv_anim_enable_t anim_en) +{ + lv_obj_t * parent = lv_obj_get_parent(child); + if(!lv_obj_has_flag(parent, LV_OBJ_FLAG_SCROLLABLE)) return; + + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(parent); + int32_t snap_goal = 0; + int32_t act = 0; + const lv_area_t * area_tmp; + + int32_t y_scroll = 0; + lv_scroll_snap_t snap_y = lv_obj_get_scroll_snap_y(parent); + if(snap_y != LV_SCROLL_SNAP_NONE) area_tmp = &child->coords; + else area_tmp = area; + + int32_t stop = lv_obj_get_style_space_top(parent, LV_PART_MAIN); + int32_t sbottom = lv_obj_get_style_space_bottom(parent, LV_PART_MAIN); + int32_t top_diff = parent->coords.y1 + stop - area_tmp->y1 - scroll_value->y; + int32_t bottom_diff = -(parent->coords.y2 - sbottom - area_tmp->y2 - scroll_value->y); + int32_t parent_h = lv_obj_get_height(parent) - stop - sbottom; + if((top_diff >= 0 && bottom_diff >= 0)) y_scroll = 0; + else if(top_diff > 0) { + y_scroll = top_diff; + /*Do not let scrolling in*/ + int32_t st = lv_obj_get_scroll_top(parent); + if(st - y_scroll < 0) y_scroll = 0; + } + else if(bottom_diff > 0) { + y_scroll = -bottom_diff; + /*Do not let scrolling in*/ + int32_t sb = lv_obj_get_scroll_bottom(parent); + if(sb + y_scroll < 0) y_scroll = 0; + } + + switch(snap_y) { + case LV_SCROLL_SNAP_START: + snap_goal = parent->coords.y1 + stop; + act = area_tmp->y1 + y_scroll; + y_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_END: + snap_goal = parent->coords.y2 - sbottom; + act = area_tmp->y2 + y_scroll; + y_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_CENTER: + snap_goal = parent->coords.y1 + stop + parent_h / 2; + act = lv_area_get_height(area_tmp) / 2 + area_tmp->y1 + y_scroll; + y_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_NONE: + break; + } + + int32_t x_scroll = 0; + lv_scroll_snap_t snap_x = lv_obj_get_scroll_snap_x(parent); + if(snap_x != LV_SCROLL_SNAP_NONE) area_tmp = &child->coords; + else area_tmp = area; + + int32_t sleft = lv_obj_get_style_space_left(parent, LV_PART_MAIN); + int32_t sright = lv_obj_get_style_space_right(parent, LV_PART_MAIN); + int32_t left_diff = parent->coords.x1 + sleft - area_tmp->x1 - scroll_value->x; + int32_t right_diff = -(parent->coords.x2 - sright - area_tmp->x2 - scroll_value->x); + if((left_diff >= 0 && right_diff >= 0)) x_scroll = 0; + else if(left_diff > 0) { + x_scroll = left_diff; + /*Do not let scrolling in*/ + int32_t sl = lv_obj_get_scroll_left(parent); + if(sl - x_scroll < 0) x_scroll = 0; + } + else if(right_diff > 0) { + x_scroll = -right_diff; + /*Do not let scrolling in*/ + int32_t sr = lv_obj_get_scroll_right(parent); + if(sr + x_scroll < 0) x_scroll = 0; + } + + int32_t parent_w = lv_obj_get_width(parent) - sleft - sright; + switch(snap_x) { + case LV_SCROLL_SNAP_START: + snap_goal = parent->coords.x1 + sleft; + act = area_tmp->x1 + x_scroll; + x_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_END: + snap_goal = parent->coords.x2 - sright; + act = area_tmp->x2 + x_scroll; + x_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_CENTER: + snap_goal = parent->coords.x1 + sleft + parent_w / 2; + act = lv_area_get_width(area_tmp) / 2 + area_tmp->x1 + x_scroll; + x_scroll += snap_goal - act; + break; + case LV_SCROLL_SNAP_NONE: + break; + } + + /*Remove any pending scroll animations.*/ + lv_anim_delete(parent, scroll_y_anim); + lv_anim_delete(parent, scroll_x_anim); + + if((scroll_dir & LV_DIR_LEFT) == 0 && x_scroll < 0) x_scroll = 0; + if((scroll_dir & LV_DIR_RIGHT) == 0 && x_scroll > 0) x_scroll = 0; + if((scroll_dir & LV_DIR_TOP) == 0 && y_scroll < 0) y_scroll = 0; + if((scroll_dir & LV_DIR_BOTTOM) == 0 && y_scroll > 0) y_scroll = 0; + + scroll_value->x += anim_en ? x_scroll : 0; + scroll_value->y += anim_en ? y_scroll : 0; + lv_obj_scroll_by(parent, x_scroll, y_scroll, anim_en); +} diff --git a/inc/lvgl/src/core/lv_obj_scroll.h b/inc/lvgl/src/core/lv_obj_scroll.h new file mode 100644 index 0000000..ee6221d --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_scroll.h @@ -0,0 +1,301 @@ +/** + * @file lv_obj_scroll.h + * + */ + +#ifndef LV_OBJ_SCROLL_H +#define LV_OBJ_SCROLL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_area.h" +#include "../misc/lv_anim.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Can't include lv_obj.h because it includes this header file*/ + +/** Scrollbar modes: shows when should the scrollbars be visible*/ +typedef enum { + LV_SCROLLBAR_MODE_OFF, /**< Never show scrollbars*/ + LV_SCROLLBAR_MODE_ON, /**< Always show scrollbars*/ + LV_SCROLLBAR_MODE_ACTIVE, /**< Show scroll bars when Widget is being scrolled*/ + LV_SCROLLBAR_MODE_AUTO, /**< Show scroll bars when the content is large enough to be scrolled*/ +} lv_scrollbar_mode_t; + +/** Scroll span align options. Tells where to align the snappable children when scroll stops.*/ +typedef enum { + LV_SCROLL_SNAP_NONE, /**< Do not align, leave where it is*/ + LV_SCROLL_SNAP_START, /**< Align to the left/top*/ + LV_SCROLL_SNAP_END, /**< Align to the right/bottom*/ + LV_SCROLL_SNAP_CENTER /**< Align to the center*/ +} lv_scroll_snap_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set how the scrollbars should behave. + * @param obj pointer to Widget + * @param mode LV_SCROLL_MODE_ON/OFF/AUTO/ACTIVE + */ +void lv_obj_set_scrollbar_mode(lv_obj_t * obj, lv_scrollbar_mode_t mode); + +/** + * Set direction Widget can be scrolled + * @param obj pointer to Widget + * @param dir one or more bit-wise OR-ed values of `lv_dir_t` enumeration + */ +void lv_obj_set_scroll_dir(lv_obj_t * obj, lv_dir_t dir); + +/** + * Set where to snap the children when scrolling ends horizontally + * @param obj pointer to Widget + * @param align value from `lv_scroll_snap_t` enumeration + */ +void lv_obj_set_scroll_snap_x(lv_obj_t * obj, lv_scroll_snap_t align); + +/** + * Set where to snap the children when scrolling ends vertically + * @param obj pointer to Widget + * @param align value from `lv_scroll_snap_t` enumeration + */ +void lv_obj_set_scroll_snap_y(lv_obj_t * obj, lv_scroll_snap_t align); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the current scroll mode (when to hide the scrollbars) + * @param obj pointer to Widget + * @return the current scroll mode from `lv_scrollbar_mode_t` + */ +lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const lv_obj_t * obj); + +/** + * Get directions Widget can be scrolled (set with `lv_obj_set_scroll_dir()`) + * @param obj pointer to Widget + * @return current scroll direction bit(s) + */ +lv_dir_t lv_obj_get_scroll_dir(const lv_obj_t * obj); + +/** + * Get where to snap child Widgets when horizontal scrolling ends. + * @param obj pointer to Widget + * @return current snap value from `lv_scroll_snap_t` + */ +lv_scroll_snap_t lv_obj_get_scroll_snap_x(const lv_obj_t * obj); + +/** + * Get where to snap child Widgets when vertical scrolling ends. + * @param obj pointer to Widget + * @return current snap value from `lv_scroll_snap_t` + */ +lv_scroll_snap_t lv_obj_get_scroll_snap_y(const lv_obj_t * obj); + +/** + * Get current X scroll position. Identical to `lv_obj_get_scroll_left()`. + * @param obj pointer to scrollable container Widget + * @return current scroll position from left edge + * - If Widget is not scrolled return 0. + * - If scrolled return > 0. + * - If scrolled inside (elastic scroll) return < 0. + */ +int32_t lv_obj_get_scroll_x(const lv_obj_t * obj); + +/** + * Get current Y scroll position. Identical to `lv_obj_get_scroll_top()`. + * @param obj pointer to scrollable container Widget + * @return current scroll position from top edge + * - If Widget is not scrolled return 0. + * - If scrolled return > 0. + * - If scrolled inside (elastic scroll) return < 0. + */ +int32_t lv_obj_get_scroll_y(const lv_obj_t * obj); + +/** + * Number of pixels a scrollable container Widget can be scrolled down + * before its top edge appears. When LV_OBJ_FLAG_SCROLL_ELASTIC flag + * is set in Widget, this value can go negative while Widget is being + * dragged below its normal top-edge boundary. + * @param obj pointer to scrollable container Widget + * @return pixels Widget can be scrolled down before its top edge appears + */ +int32_t lv_obj_get_scroll_top(const lv_obj_t * obj); + +/** + * Number of pixels a scrollable container Widget can be scrolled up + * before its bottom edge appears. When LV_OBJ_FLAG_SCROLL_ELASTIC flag + * is set in Widget, this value can go negative while Widget is being + * dragged above its normal bottom-edge boundary. + * @param obj pointer to scrollable container Widget + * @return pixels Widget can be scrolled up before its bottom edge appears + */ +int32_t lv_obj_get_scroll_bottom(const lv_obj_t * obj); + +/** + * Number of pixels a scrollable container Widget can be scrolled right + * before its left edge appears. When LV_OBJ_FLAG_SCROLL_ELASTIC flag + * is set in Widget, this value can go negative while Widget is being + * dragged farther right than its normal left-edge boundary. + * @param obj pointer to scrollable container Widget + * @return pixels Widget can be scrolled right before its left edge appears + */ +int32_t lv_obj_get_scroll_left(const lv_obj_t * obj); + +/** + * Number of pixels a scrollable container Widget can be scrolled left + * before its right edge appears. When LV_OBJ_FLAG_SCROLL_ELASTIC flag + * is set in Widget, this value can go negative while Widget is being + * dragged farther left than its normal right-edge boundary. + * @param obj pointer to scrollable container Widget + * @return pixels Widget can be scrolled left before its right edge appears + */ +int32_t lv_obj_get_scroll_right(const lv_obj_t * obj); + +/** + * Get the X and Y coordinates where the scrolling will end for Widget if a scrolling animation is in progress. + * If no scrolling animation, give the current `x` or `y` scroll position. + * @param obj pointer to scrollable Widget + * @param end pointer to `lv_point_t` object in which to store result + */ +void lv_obj_get_scroll_end(lv_obj_t * obj, lv_point_t * end); + +/*===================== + * Other functions + *====================*/ + +/** + * Scroll by given amount of pixels. + * @param obj pointer to scrollable Widget to scroll + * @param dx pixels to scroll horizontally + * @param dy pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + * @note > 0 value means scroll right/bottom (show the more content on the right/bottom) + * @note e.g. dy = -20 means scroll down 20 px + */ +void lv_obj_scroll_by(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en); + +/** + * Scroll by given amount of pixels. + * `dx` and `dy` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to scrollable Widget to scroll + * @param dx pixels to scroll horizontally + * @param dy pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + * @note e.g. dy = -20 means scroll down 20 px + */ +void lv_obj_scroll_by_bounded(lv_obj_t * obj, int32_t dx, int32_t dy, lv_anim_enable_t anim_en); + +/** + * Scroll to given coordinate on Widget. + * `x` and `y` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to scrollable Widget to scroll + * @param x pixels to scroll horizontally + * @param y pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to(lv_obj_t * obj, int32_t x, int32_t y, lv_anim_enable_t anim_en); + +/** + * Scroll to X coordinate on Widget. + * `x` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to scrollable Widget to scroll + * @param x pixels to scroll horizontally + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_x(lv_obj_t * obj, int32_t x, lv_anim_enable_t anim_en); + +/** + * Scroll to Y coordinate on Widget. + * `y` will be limited internally to allow scrolling only on the content area. + * @param obj pointer to scrollable Widget to scroll + * @param y pixels to scroll vertically + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_y(lv_obj_t * obj, int32_t y, lv_anim_enable_t anim_en); + +/** + * Scroll `obj`'s parent Widget until `obj` becomes visible. + * @param obj pointer to Widget to scroll into view + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_view(lv_obj_t * obj, lv_anim_enable_t anim_en); + +/** + * Scroll `obj`'s parent Widgets recursively until `obj` becomes visible. + * Widget will be scrolled into view even it has nested scrollable parents. + * @param obj pointer to Widget to scroll into view + * @param anim_en LV_ANIM_ON: scroll with animation; LV_ANIM_OFF: scroll immediately + */ +void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en); + +/** + * Tell whether Widget is being scrolled or not at this moment + * @param obj pointer to Widget + * @return true: `obj` is being scrolled + */ +bool lv_obj_is_scrolling(const lv_obj_t * obj); + +/** + * Stop scrolling the current object + * + * @param obj The object being scrolled + */ +void lv_obj_stop_scroll_anim(const lv_obj_t * obj); + +/** + * Check children of `obj` and scroll `obj` to fulfill scroll_snap settings. + * @param obj Widget whose children need to be checked and snapped + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_obj_update_snap(lv_obj_t * obj, lv_anim_enable_t anim_en); + +/** + * Get the area of the scrollbars + * @param obj pointer to Widget + * @param hor pointer to store the area of the horizontal scrollbar + * @param ver pointer to store the area of the vertical scrollbar + */ +void lv_obj_get_scrollbar_area(lv_obj_t * obj, lv_area_t * hor, lv_area_t * ver); + +/** + * Invalidate the area of the scrollbars + * @param obj pointer to Widget + */ +void lv_obj_scrollbar_invalidate(lv_obj_t * obj); + +/** + * Checks if the content is scrolled "in" and adjusts it to a normal position. + * @param obj pointer to Widget + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_SCROLL_H*/ diff --git a/inc/lvgl/src/core/lv_obj_scroll_private.h b/inc/lvgl/src/core/lv_obj_scroll_private.h new file mode 100644 index 0000000..9ae6332 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_scroll_private.h @@ -0,0 +1,50 @@ +/** + * @file lv_obj_scroll_private.h + * + */ + +#ifndef LV_OBJ_SCROLL_PRIVATE_H +#define LV_OBJ_SCROLL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_scroll.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Low level function to scroll by given x and y coordinates. + * `LV_EVENT_SCROLL` is sent. + * @param obj pointer to an object to scroll + * @param x pixels to scroll horizontally + * @param y pixels to scroll vertically + * @return `LV_RESULT_INVALID`: to object was deleted in `LV_EVENT_SCROLL`; + * `LV_RESULT_OK`: if the object is still valid + */ +lv_result_t lv_obj_scroll_by_raw(lv_obj_t * obj, int32_t x, int32_t y); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_SCROLL_PRIVATE_H*/ diff --git a/inc/lvgl/src/core/lv_obj_style.c b/inc/lvgl/src/core/lv_obj_style.c new file mode 100644 index 0000000..bff861b --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_style.c @@ -0,0 +1,1345 @@ +/** + * @file lv_obj_style.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_private.h" +#include "../misc/lv_anim_private.h" +#include "lv_obj_style_private.h" +#include "lv_obj_class_private.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../misc/lv_color.h" +#include "../stdlib/lv_string.h" +#include "../core/lv_global.h" +#include "lv_observer_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#define style_refr LV_GLOBAL_DEFAULT()->style_refresh +#define style_trans_ll_p &(LV_GLOBAL_DEFAULT()->style_trans_ll) +#define _style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table +#define STYLE_PROP_SHIFTED(prop) ((uint32_t)1 << ((prop) >> 3)) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_obj_t * obj; + lv_style_prop_t prop; + lv_style_selector_t selector; + lv_style_value_t start_value; + lv_style_value_t end_value; +} trans_t; + +typedef struct { + const lv_style_t * style; + lv_style_selector_t selector; + int32_t value; +} bind_style_t; + +typedef struct { + lv_style_prop_t prop; + lv_style_selector_t selector; +} bind_style_prop_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector); +static lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t selector); +static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, + lv_style_value_t * v); +static void report_style_change_core(void * style, lv_obj_t * obj); +static void refresh_children_style(lv_obj_t * obj); +static bool trans_delete(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, trans_t * tr_limit); +static void trans_anim_cb(void * _tr, int32_t v); +static void trans_anim_start_cb(lv_anim_t * a); +static void trans_anim_completed_cb(lv_anim_t * a); +static lv_layer_type_t calculate_layer_type(lv_obj_t * obj); +static void full_cache_refresh(lv_obj_t * obj, lv_part_t part); +static void fade_anim_cb(void * obj, int32_t v); +static void fade_in_anim_completed(lv_anim_t * a); +static bool style_has_flag(const lv_style_t * style, uint32_t flag); +static lv_style_res_t get_selector_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, + lv_style_value_t * value_act); +static void remove_style_core(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector, bool theme_only); +#if LV_USE_OBSERVER + static void bind_style_observer_cb(lv_observer_t * observer, lv_subject_t * subject); + static void bind_style_prop_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_style_init(void) +{ + lv_ll_init(style_trans_ll_p, sizeof(trans_t)); +} + +void lv_obj_style_deinit(void) +{ + lv_ll_clear(style_trans_ll_p); + if(_style_custom_prop_flag_lookup_table != NULL) { + lv_free(_style_custom_prop_flag_lookup_table); + _style_custom_prop_flag_lookup_table = NULL; + } +} + +void lv_obj_add_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector) +{ + LV_ASSERT(obj->style_cnt < 63); + + trans_delete(obj, selector, LV_STYLE_PROP_ANY, NULL); + + lv_part_t part = lv_obj_style_get_selector_part(selector); + + if(style && part == LV_PART_MAIN && style_has_flag(style, LV_STYLE_PROP_FLAG_TRANSFORM)) { + lv_obj_invalidate(obj); + } + + /*Try removing the style first to be sure it won't be added twice*/ + lv_obj_remove_style(obj, style, selector); + + uint32_t i; + /*Go after the transition and local styles*/ + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans) continue; + if(obj->styles[i].is_local) continue; + break; + } + + /*Now `i` is at the first normal style. Insert the new style before this*/ + + /*Allocate space for the new style and shift the rest of the style to the end*/ + obj->style_cnt++; + LV_ASSERT(obj->style_cnt != 0); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); + LV_ASSERT_MALLOC(obj->styles); + + uint32_t j; + for(j = obj->style_cnt - 1; j > i ; j--) { + obj->styles[j] = obj->styles[j - 1]; + } + + lv_memzero(&obj->styles[i], sizeof(lv_obj_style_t)); + obj->styles[i].style = style; + obj->styles[i].selector = selector; + +#if LV_OBJ_STYLE_CACHE + uint32_t * prop_is_set = part == LV_PART_MAIN ? &obj->style_main_prop_is_set : &obj->style_other_prop_is_set; + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = style->values_and_props; + for(i = 0; props[i].prop != LV_STYLE_PROP_INV; i++) { + (*prop_is_set) |= STYLE_PROP_SHIFTED(props[i].prop); + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + for(i = 0; i < style->prop_cnt; i++) { + (*prop_is_set) |= STYLE_PROP_SHIFTED(props[i]); + } + } +#endif + + lv_obj_refresh_style(obj, selector, LV_STYLE_PROP_ANY); +} + +bool lv_obj_replace_style(lv_obj_t * obj, const lv_style_t * old_style, const lv_style_t * new_style, + lv_style_selector_t selector) +{ + lv_state_t state = lv_obj_style_get_selector_state(selector); + lv_part_t part = lv_obj_style_get_selector_part(selector); + + /*All objects must exist*/ + if(!obj || !old_style || !new_style || (old_style == new_style)) { + return false; + } + + /*Similar to lv_obj_add_style, delete transition*/ + trans_delete(obj, selector, LV_STYLE_PROP_ANY, NULL); + + bool replaced = false; + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + + /*Skip local styles and transitions*/ + if(obj->styles[i].is_local || obj->styles[i].is_trans) { + continue; + } + + /*Skip non-matching styles*/ + if((state != LV_STATE_ANY && state_act != state) || + (part != LV_PART_ANY && part_act != part) || + (old_style != obj->styles[i].style)) { + continue; + } + + lv_memzero(&obj->styles[i], sizeof(lv_obj_style_t)); + obj->styles[i].style = new_style; + obj->styles[i].selector = selector; + + replaced = true; + /*Don't break and continue replacing other occurrences*/ + } + if(replaced) { + full_cache_refresh(obj, part); + lv_obj_refresh_style(obj, part, LV_STYLE_PROP_ANY); + } + return replaced; +} + +void lv_obj_remove_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector) +{ + remove_style_core(obj, style, selector, false); +} + +void lv_obj_remove_theme(lv_obj_t * obj, lv_style_selector_t selector) +{ + remove_style_core(obj, NULL, selector, true); +} + +void lv_obj_remove_style_all(lv_obj_t * obj) +{ + lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY); +} + +void lv_obj_report_style_change(lv_style_t * style) +{ + if(!style_refr) return; + lv_display_t * d = lv_display_get_next(NULL); + + while(d) { + uint32_t i; + for(i = 0; i < d->screen_cnt; i++) { + report_style_change_core(style, d->screens[i]); + } + d = lv_display_get_next(d); + } +} + +void lv_obj_refresh_style(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(!style_refr) return; + + LV_PROFILER_STYLE_BEGIN; + + lv_obj_invalidate(obj); + + bool is_layout_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_LAYOUT_UPDATE); + bool is_ext_draw = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE); + bool is_inheritable = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_INHERITABLE); + bool is_layer_refr = lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_LAYER_UPDATE); + + if(is_layout_refr) { + if(part == LV_PART_ANY || + part == LV_PART_MAIN || + lv_obj_get_style_height(obj, LV_PART_MAIN) == LV_SIZE_CONTENT || + lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + lv_obj_send_event(obj, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_mark_layout_as_dirty(obj); + } + } + if((part == LV_PART_ANY || part == LV_PART_MAIN) && (prop == LV_STYLE_PROP_ANY || is_layout_refr)) { + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) lv_obj_mark_layout_as_dirty(parent); + } + + /*Cache the layer type*/ + if((part == LV_PART_ANY || part == LV_PART_MAIN) && is_layer_refr) { + lv_obj_update_layer_type(obj); + } + + if(prop == LV_STYLE_PROP_ANY || is_ext_draw) { + lv_obj_refresh_ext_draw_size(obj); + } + lv_obj_invalidate(obj); + + if(prop == LV_STYLE_PROP_ANY || (is_inheritable && (is_ext_draw || is_layout_refr))) { + if(part != LV_PART_SCROLLBAR) { + refresh_children_style(obj); + } + } + + LV_PROFILER_STYLE_END; +} + +void lv_obj_style_set_disabled(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector, bool dis) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].style == style && obj->styles[i].selector == selector) { + if(dis == obj->styles[i].is_disabled) { + return; /*Already in the right state*/ + } + obj->styles[i].is_disabled = dis; + full_cache_refresh(obj, lv_obj_style_get_selector_part(selector)); + lv_obj_refresh_style(obj, selector, LV_STYLE_PROP_ANY); + return; + } + } + LV_LOG_WARN("%p style was not found on %p widget with %6" LV_PRIx32 " selector", (void *)style, (void *)obj, selector); +} + +bool lv_obj_style_get_disabled(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].style == style && obj->styles[i].selector == selector) { + return obj->styles[i].is_disabled; + } + } + + LV_LOG_WARN("%p style was not found on %p widget with %6" LV_PRIx32 " selector", (void *)style, (void *)obj, selector); + return false; +} + + +void lv_obj_enable_style_refresh(bool en) +{ + style_refr = en; +} + +lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop) +{ + LV_ASSERT_NULL(obj) + + lv_style_selector_t selector = part | obj->state; + lv_style_value_t value_act = { .ptr = NULL }; + lv_style_res_t found; + + found = get_selector_style_prop(obj, selector, prop, &value_act); + if(found == LV_STYLE_RES_FOUND) return value_act; + + return lv_style_prop_get_default(prop); +} + +bool lv_obj_has_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop) +{ + LV_ASSERT_NULL(obj) + + lv_style_value_t value_act = { .ptr = NULL }; + lv_style_res_t found; + + found = get_selector_style_prop(obj, selector, prop, &value_act); + if(found == LV_STYLE_RES_FOUND) return true; + + return false; +} + +void lv_obj_set_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value, + lv_style_selector_t selector) +{ + LV_PROFILER_STYLE_BEGIN; + + /*Stop running transitions with this property */ + trans_delete(obj, lv_obj_style_get_selector_part(selector), prop, NULL); + + lv_style_t * style = get_local_style(obj, selector); + if(selector == LV_PART_MAIN && lv_style_prop_has_flag(prop, LV_STYLE_PROP_FLAG_TRANSFORM)) { + lv_obj_invalidate(obj); + } + + lv_style_set_prop(style, prop, value); + +#if LV_OBJ_STYLE_CACHE + uint32_t prop_shifted = STYLE_PROP_SHIFTED(prop); + if(lv_obj_style_get_selector_part(selector) == LV_PART_MAIN) { + obj->style_main_prop_is_set |= prop_shifted; + } + else { + obj->style_other_prop_is_set |= prop_shifted; + } +#endif + + lv_obj_refresh_style(obj, selector, prop); + LV_PROFILER_STYLE_END; +} + +lv_style_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, + lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_local && + obj->styles[i].selector == selector) { + return lv_style_get_prop(obj->styles[i].style, prop, value); + } + } + + return LV_STYLE_RES_NOT_FOUND; +} + +bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t i; + /*Find the style*/ + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_local && + obj->styles[i].selector == selector) { + break; + } + } + + /*The style is not found*/ + if(i == obj->style_cnt) return false; + + lv_result_t res = lv_style_remove_prop((lv_style_t *)obj->styles[i].style, prop); + if(res == LV_RESULT_OK) { + full_cache_refresh(obj, lv_obj_style_get_selector_part(selector)); + lv_obj_refresh_style(obj, selector, prop); + } + + return res; +} + +void lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, lv_state_t new_state, + const lv_obj_style_transition_dsc_t * tr_dsc) +{ + trans_t * tr; + + /*Get the previous and current values*/ + obj->skip_trans = 1; + obj->state = prev_state; + lv_style_value_t v1 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); + obj->state = new_state; + lv_style_value_t v2 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); + obj->skip_trans = 0; + + if(v1.ptr == v2.ptr && v1.num == v2.num && lv_color_eq(v1.color, v2.color)) return; + obj->state = prev_state; + v1 = lv_obj_get_style_prop(obj, part, tr_dsc->prop); + obj->state = new_state; + + lv_obj_style_t * style_trans = get_trans_style(obj, part); + lv_style_set_prop((lv_style_t *)style_trans->style, tr_dsc->prop, v1); /*Be sure `trans_style` has a valid value*/ + lv_obj_refresh_style(obj, tr_dsc->selector, tr_dsc->prop); + + if(tr_dsc->prop == LV_STYLE_RADIUS) { + if(v1.num == LV_RADIUS_CIRCLE || v2.num == LV_RADIUS_CIRCLE) { + int32_t whalf = lv_obj_get_width(obj) / 2; + int32_t hhalf = lv_obj_get_height(obj) / 2; + if(v1.num == LV_RADIUS_CIRCLE) v1.num = LV_MIN(whalf + 1, hhalf + 1); + if(v2.num == LV_RADIUS_CIRCLE) v2.num = LV_MIN(whalf + 1, hhalf + 1); + } + } + + tr = lv_ll_ins_head(style_trans_ll_p); + LV_ASSERT_MALLOC(tr); + if(tr == NULL) return; + tr->start_value = v1; + tr->end_value = v2; + tr->obj = obj; + tr->prop = tr_dsc->prop; + tr->selector = part; + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, tr); + lv_anim_set_exec_cb(&a, trans_anim_cb); + lv_anim_set_start_cb(&a, trans_anim_start_cb); + lv_anim_set_completed_cb(&a, trans_anim_completed_cb); + lv_anim_set_values(&a, 0x00, 0xFF); + lv_anim_set_duration(&a, tr_dsc->time); + lv_anim_set_delay(&a, tr_dsc->delay); + lv_anim_set_path_cb(&a, tr_dsc->path_cb); + lv_anim_set_early_apply(&a, false); + lv_anim_set_user_data(&a, tr_dsc->user_data); + lv_anim_start(&a); +} + +lv_style_value_t lv_obj_style_apply_color_filter(const lv_obj_t * obj, lv_part_t part, lv_style_value_t v) +{ +#if LV_USE_COLOR_FILTER + if(obj == NULL) return v; + const lv_color_filter_dsc_t * f = lv_obj_get_style_color_filter_dsc(obj, part); + if(f && f->filter_cb) { + lv_opa_t f_opa = lv_obj_get_style_color_filter_opa(obj, part); + if(f_opa != 0) v.color = f->filter_cb(f, v.color, f_opa); + } +#else + LV_UNUSED(obj); + LV_UNUSED(part); + LV_UNUSED(v); +#endif + return v; +} + +lv_style_state_cmp_t lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2) +{ + lv_style_state_cmp_t res = LV_STYLE_STATE_CMP_SAME; + + /*Are there any new styles for the new state?*/ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans) continue; + + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + /*The style is valid for a state but not the other*/ + bool valid1 = state_act & (~state1) ? false : true; + bool valid2 = state_act & (~state2) ? false : true; + if(valid1 != valid2) { + const lv_style_t * style = obj->styles[i].style; + lv_style_value_t v; + /*If there is layout difference on the main part, return immediately. There is no more serious difference*/ + bool layout_diff = false; + if(lv_style_get_prop(style, LV_STYLE_PAD_TOP, &v))layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_BOTTOM, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_LEFT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_RIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_COLUMN, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_PAD_ROW, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_LAYOUT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_TRANSLATE_X, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_TRANSLATE_Y, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_HEIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MIN_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MAX_WIDTH, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MIN_HEIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_MAX_HEIGHT, &v)) layout_diff = true; + else if(lv_style_get_prop(style, LV_STYLE_BORDER_WIDTH, &v)) layout_diff = true; + + if(layout_diff) { + return LV_STYLE_STATE_CMP_DIFF_LAYOUT; + } + + /*Check for draw pad changes*/ + if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_HEIGHT, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_ROTATION, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_X, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_OPA, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_PAD, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_OUTLINE_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OPA, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_X, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_OFFSET_Y, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_SHADOW_SPREAD, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(lv_style_get_prop(style, LV_STYLE_LINE_WIDTH, &v)) res = LV_STYLE_STATE_CMP_DIFF_DRAW_PAD; + else if(res == LV_STYLE_STATE_CMP_SAME) res = LV_STYLE_STATE_CMP_DIFF_REDRAW; + } + } + + return res; +} + +void lv_obj_fade_in(lv_obj_t * obj, uint32_t time, uint32_t delay) +{ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_values(&a, 0, LV_OPA_COVER); + lv_anim_set_exec_cb(&a, fade_anim_cb); + lv_anim_set_completed_cb(&a, fade_in_anim_completed); + lv_anim_set_duration(&a, time); + lv_anim_set_delay(&a, delay); + lv_anim_start(&a); +} + +void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay) +{ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_values(&a, lv_obj_get_style_opa(obj, LV_PART_MAIN), LV_OPA_TRANSP); + lv_anim_set_exec_cb(&a, fade_anim_cb); + lv_anim_set_duration(&a, time); + lv_anim_set_delay(&a, delay); + lv_anim_start(&a); +} + +lv_text_align_t lv_obj_calculate_style_text_align(const lv_obj_t * obj, lv_part_t part, const char * txt) +{ + lv_text_align_t align = lv_obj_get_style_text_align(obj, part); + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, part); + lv_bidi_calculate_align(&align, &base_dir, txt); + return align; +} + +lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part) +{ + LV_PROFILER_STYLE_BEGIN; + lv_opa_t opa_obj = lv_obj_get_style_opa(obj, part); + if(opa_obj <= LV_OPA_MIN) { + LV_PROFILER_STYLE_END; + return LV_OPA_TRANSP; + } + + lv_opa_t opa_final = LV_OPA_COVER; + if(opa_obj < LV_OPA_MAX) { + opa_final = LV_OPA_MIX2(opa_final, opa_obj); + } + + if(part != LV_PART_MAIN) { + part = LV_PART_MAIN; + } + else { + obj = lv_obj_get_parent(obj); + } + + while(obj) { + opa_obj = lv_obj_get_style_opa(obj, part); + if(opa_obj <= LV_OPA_MIN) { + LV_PROFILER_STYLE_END; + return LV_OPA_TRANSP; + } + if(opa_obj < LV_OPA_MAX) { + opa_final = LV_OPA_MIX2(opa_final, opa_obj); + } + + obj = lv_obj_get_parent(obj); + } + + if(opa_final <= LV_OPA_MIN) { + LV_PROFILER_STYLE_END; + return LV_OPA_TRANSP; + } + + if(opa_final >= LV_OPA_MAX) { + LV_PROFILER_STYLE_END; + return LV_OPA_COVER; + } + + LV_PROFILER_STYLE_END; + return opa_final; +} + +void lv_obj_update_layer_type(lv_obj_t * obj) +{ + lv_layer_type_t layer_type = calculate_layer_type(obj); + if(obj->spec_attr) obj->spec_attr->layer_type = layer_type; + else if(layer_type != LV_LAYER_TYPE_NONE) { + lv_obj_allocate_spec_attr(obj); + obj->spec_attr->layer_type = layer_type; + } +} + +lv_color32_t lv_obj_style_apply_recolor(const lv_obj_t * obj, lv_part_t part, lv_color32_t color) +{ + lv_opa_t opa = lv_obj_get_style_recolor_opa(obj, part); + if(opa > LV_OPA_TRANSP) { + lv_color_t recolor = lv_obj_get_style_recolor(obj, part); + color = lv_color_over32(color, lv_color_to_32(recolor, opa)); + } + + return color; +} + +lv_color32_t lv_obj_get_style_recolor_recursive(const lv_obj_t * obj, lv_part_t part) +{ + lv_color32_t result; + + lv_color_t color = lv_obj_get_style_recolor(obj, part); + lv_opa_t opa = lv_obj_get_style_recolor_opa(obj, part); + + result = lv_color_to_32(color, opa); + + if(part != LV_PART_MAIN) { + part = LV_PART_MAIN; + } + else { + obj = lv_obj_get_parent(obj); + } + + while(obj) { + result = lv_obj_style_apply_recolor(obj, part, result); + obj = lv_obj_get_parent(obj); + } + + return result; +} + +#if LV_USE_OBSERVER + +lv_observer_t * lv_obj_bind_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector, + lv_subject_t * subject, int32_t ref_value) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type must be `int` (was %d)", subject->type); + return NULL; + } + + lv_obj_add_style(obj, style, selector); + + bind_style_t * p = lv_malloc(sizeof(bind_style_t)); + LV_ASSERT_MALLOC(p); + if(p == NULL) { + LV_LOG_WARN("Out of memory"); + return NULL; + } + + p->style = style; + p->selector = selector; + p->value = ref_value; + + lv_observer_t * observable = lv_subject_add_observer_obj(subject, bind_style_observer_cb, obj, p); + observable->auto_free_user_data = 1; + return observable; +} + +lv_observer_t * lv_obj_bind_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector, + lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(subject->type != LV_SUBJECT_TYPE_INT && subject->type != LV_SUBJECT_TYPE_COLOR && + subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Subject type must be `int`, `color`, or `pointer` (was %"LV_PRIu32")", (uint32_t) subject->type); + return NULL; + } + + bind_style_prop_t * p = lv_malloc(sizeof(bind_style_prop_t)); + LV_ASSERT_MALLOC(p); + if(p == NULL) { + LV_LOG_WARN("Out of memory"); + return NULL; + } + + p->prop = prop; + p->selector = selector; + + lv_observer_t * observable = lv_subject_add_observer_obj(subject, bind_style_prop_observer_cb, obj, p); + observable->auto_free_user_data = 1; + return observable; +} + + +#endif /*LV_USE_OBSERVER*/ + + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get the local style of an object for a given part and for a given state. + * If the local style for the part-state pair doesn't exist allocate and return it. + * @param obj pointer to an object + * @param selector OR-ed value of parts and state for which the style should be get + * @return pointer to the local style + */ +static lv_style_t * get_local_style(lv_obj_t * obj, lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_local && + obj->styles[i].selector == selector) { + return (lv_style_t *)obj->styles[i].style; + } + } + + obj->style_cnt++; + LV_ASSERT(obj->style_cnt != 0); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); + LV_ASSERT_MALLOC(obj->styles); + + for(i = obj->style_cnt - 1; i > 0 ; i--) { + /*Copy only normal styles (not local and transition). + *The new local style will be added as the last local style*/ + if(obj->styles[i - 1].is_local || obj->styles[i - 1].is_trans) break; + obj->styles[i] = obj->styles[i - 1]; + } + + lv_memzero(&obj->styles[i], sizeof(lv_obj_style_t)); + obj->styles[i].style = lv_malloc_zeroed(sizeof(lv_style_t)); + lv_style_init((lv_style_t *)obj->styles[i].style); + + obj->styles[i].is_local = 1; + obj->styles[i].selector = selector; + return (lv_style_t *)obj->styles[i].style; +} + +/** + * Get the transition style of an object for a given part and for a given state. + * If the transition style for the part-state pair doesn't exist allocate and return it. + * @param obj pointer to an object + * @param selector OR-ed value of parts and state for which the style should be get + * @return pointer to the transition style + */ +static lv_obj_style_t * get_trans_style(lv_obj_t * obj, lv_style_selector_t selector) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans && obj->styles[i].selector == selector) break; + } + + /*Already have a transition style for it*/ + if(i != obj->style_cnt) return &obj->styles[i]; + + obj->style_cnt++; + LV_ASSERT(obj->style_cnt != 0); + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); + + for(i = obj->style_cnt - 1; i > 0 ; i--) { + obj->styles[i] = obj->styles[i - 1]; + } + + lv_memzero(&obj->styles[0], sizeof(lv_obj_style_t)); + obj->styles[0].style = lv_malloc(sizeof(lv_style_t)); + lv_style_init((lv_style_t *)obj->styles[0].style); + + obj->styles[0].is_trans = 1; + obj->styles[0].selector = selector; + return &obj->styles[0]; +} + +static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, + lv_style_value_t * v) +{ + + const uint32_t group = (uint32_t)1 << lv_style_get_prop_group(prop); + const lv_part_t part = lv_obj_style_get_selector_part(selector); + const lv_state_t state = lv_obj_style_get_selector_state(selector); + const lv_state_t state_inv = ~state; + const bool skip_trans = (const bool) obj->skip_trans; + int32_t weight = -1; + lv_style_res_t found; + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + lv_obj_style_t * obj_style = &obj->styles[i]; + if(obj_style->is_trans == false) break; + if(skip_trans) continue; + if(obj_style->is_disabled) continue; + + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + + if(part_act != part) continue; + if((obj_style->style->has_group & group) == 0) continue; + found = lv_style_get_prop_inlined(obj_style->style, prop, v); + if(found == LV_STYLE_RES_FOUND) { + return LV_STYLE_RES_FOUND; + } + } + + for(; i < obj->style_cnt; i++) { + if((obj->styles[i].style->has_group & group) == 0) continue; + if(obj->styles[i].is_disabled) continue; + lv_obj_style_t * obj_style = &obj->styles[i]; + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + if(part_act != part) continue; + + /*Be sure the style not specifies other state than the requested. + *E.g. For HOVER+PRESS object state, HOVER style only is OK, but HOVER+FOCUS style is not*/ + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + if((state_act & state_inv)) continue; + + /*Check only better candidates*/ + if((int32_t)state_act <= weight) continue; + + found = lv_style_get_prop_inlined(obj_style->style, prop, v); + if(found == LV_STYLE_RES_FOUND) { + if(state_act == state) { + return LV_STYLE_RES_FOUND; + } + weight = state_act; + } + } + + if(weight >= 0) return LV_STYLE_RES_FOUND; + else return LV_STYLE_RES_NOT_FOUND; +} + +/** + * Refresh the style of all children of an object. (Called recursively) + * @param style refresh objects only with this + * @param obj pointer to an object + */ +static void report_style_change_core(void * style, lv_obj_t * obj) +{ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(style == NULL || obj->styles[i].style == style) { + full_cache_refresh(obj, lv_obj_style_get_selector_part(obj->styles[i].selector)); + lv_obj_refresh_style(obj, LV_PART_ANY, LV_STYLE_PROP_ANY); + break; + } + } + + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + report_style_change_core(style, obj->spec_attr->children[i]); + } +} + +/** + * Recursively refresh the style of the children. Go deeper until a not NULL style is found + * because the NULL styles are inherited from the parent + * @param obj pointer to an object + */ +static void refresh_children_style(lv_obj_t * obj) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_invalidate(child); + lv_obj_send_event(child, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_invalidate(child); + + refresh_children_style(child); /*Check children too*/ + } +} + +/** + * Remove the transition from object's part's property. + * - Remove the transition from `lv_obj_style_trans_ll` and free it + * - Delete pending transitions + * @param obj pointer to an object which transition(s) should be removed + * @param part a part of object or 0xFF to remove from all parts + * @param prop a property or 0xFF to remove all properties + * @param tr_limit delete transitions only "older" than this. `NULL` if not used + */ +static bool trans_delete(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop, trans_t * tr_limit) +{ + trans_t * tr; + trans_t * tr_prev; + bool removed = false; + tr = lv_ll_get_tail(style_trans_ll_p); + while(tr != NULL) { + if(tr == tr_limit) break; + + /*'tr' might be deleted, so get the next object while 'tr' is valid*/ + tr_prev = lv_ll_get_prev(style_trans_ll_p, tr); + + if(tr->obj == obj && (part == tr->selector || part == LV_PART_ANY) && (prop == tr->prop || prop == LV_STYLE_PROP_ANY)) { + /*Remove any transitioned properties from the trans. style + *to allow changing it by normal styles*/ + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans && (part == LV_PART_ANY || obj->styles[i].selector == part)) { + lv_style_remove_prop((lv_style_t *)obj->styles[i].style, tr->prop); + } + } + + /*Free the transition descriptor too*/ + lv_anim_delete(tr, NULL); + lv_ll_remove(style_trans_ll_p, tr); + lv_free(tr); + removed = true; + + } + tr = tr_prev; + } + return removed; +} + +static void trans_anim_cb(void * _tr, int32_t v) +{ + trans_t * tr = _tr; + lv_obj_t * obj = tr->obj; + + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans == 0 || obj->styles[i].selector != tr->selector) continue; + + lv_style_value_t value_final = {0}; + switch(tr->prop) { + + case LV_STYLE_BORDER_SIDE: + case LV_STYLE_BORDER_POST: + case LV_STYLE_BLEND_MODE: + if(v < 255) value_final.num = tr->start_value.num; + else value_final.num = tr->end_value.num; + break; + case LV_STYLE_TRANSITION: + case LV_STYLE_TEXT_FONT: + if(v < 255) value_final.ptr = tr->start_value.ptr; + else value_final.ptr = tr->end_value.ptr; + break; + case LV_STYLE_COLOR_FILTER_DSC: + if(tr->start_value.ptr == NULL) value_final.ptr = tr->end_value.ptr; + else if(tr->end_value.ptr == NULL) value_final.ptr = tr->start_value.ptr; + else if(v < 128) value_final.ptr = tr->start_value.ptr; + else value_final.ptr = tr->end_value.ptr; + break; + case LV_STYLE_RECOLOR: + case LV_STYLE_BG_COLOR: + case LV_STYLE_BG_GRAD_COLOR: + case LV_STYLE_BORDER_COLOR: + case LV_STYLE_TEXT_COLOR: + case LV_STYLE_SHADOW_COLOR: + case LV_STYLE_OUTLINE_COLOR: + case LV_STYLE_IMAGE_RECOLOR: + if(v <= 0) value_final.color = tr->start_value.color; + else if(v >= 255) value_final.color = tr->end_value.color; + else value_final.color = lv_color_mix(tr->end_value.color, tr->start_value.color, v); + break; + + default: + if(v == 0) value_final.num = tr->start_value.num; + else if(v == 255) value_final.num = tr->end_value.num; + else value_final.num = tr->start_value.num + ((int32_t)((int32_t)(tr->end_value.num - tr->start_value.num) * v) >> 8); + break; + } + + lv_style_value_t old_value = {0}; + bool refr = true; + if(lv_style_get_prop(obj->styles[i].style, tr->prop, &old_value)) { + if(value_final.ptr == old_value.ptr && lv_color_eq(value_final.color, old_value.color) && + value_final.num == old_value.num) { + refr = false; + } + } + lv_style_set_prop((lv_style_t *)obj->styles[i].style, tr->prop, value_final); + if(refr) lv_obj_refresh_style(tr->obj, tr->selector, tr->prop); + break; + + } + +} + +static void trans_anim_start_cb(lv_anim_t * a) +{ + trans_t * tr = a->var; + + lv_part_t part = lv_obj_style_get_selector_part(tr->selector); + tr->start_value = lv_obj_get_style_prop(tr->obj, part, tr->prop); + + /*Init prop to an invalid values to be sure `trans_del` won't delete this added `tr`*/ + lv_style_prop_t prop_tmp = tr->prop; + tr->prop = LV_STYLE_PROP_INV; + + /*Delete the related transitions if any*/ + trans_delete(tr->obj, part, prop_tmp, tr); + + tr->prop = prop_tmp; + + lv_obj_style_t * style_trans = get_trans_style(tr->obj, tr->selector); + /*Be sure `trans_style` has a valid value*/ + lv_style_set_prop((lv_style_t *)style_trans->style, tr->prop, tr->start_value); + lv_obj_refresh_style(tr->obj, tr->selector, tr->prop); + +} + +static void trans_anim_completed_cb(lv_anim_t * a) +{ + trans_t * tr = a->var; + lv_obj_t * obj = tr->obj; + lv_style_prop_t prop = tr->prop; + + /*Remove the transitioned property from trans. style + *if there no more transitions for this property + *It allows changing it by normal styles*/ + bool running = false; + trans_t * tr_i; + LV_LL_READ(style_trans_ll_p, tr_i) { + if(tr_i != tr && tr_i->obj == tr->obj && tr_i->selector == tr->selector && tr_i->prop == tr->prop) { + running = true; + break; + } + } + + if(!running) { + uint32_t i; + for(i = 0; i < obj->style_cnt; i++) { + if(obj->styles[i].is_trans && obj->styles[i].selector == tr->selector) { + lv_ll_remove(style_trans_ll_p, tr); + lv_free(tr); + + lv_obj_style_t * obj_style = &obj->styles[i]; + lv_style_remove_prop((lv_style_t *)obj_style->style, prop); + + if(lv_style_is_empty(obj->styles[i].style)) { + lv_obj_remove_style(obj, (lv_style_t *)obj_style->style, obj_style->selector); + + } + break; + } + } + } +} + +static lv_layer_type_t calculate_layer_type(lv_obj_t * obj) +{ +#if LV_DRAW_TRANSFORM_USE_MATRIX + if(lv_obj_get_transform(obj) != NULL) return LV_LAYER_TYPE_TRANSFORM; +#endif + if(lv_obj_get_style_transform_rotation(obj, LV_PART_MAIN) != 0) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_transform_scale_x(obj, LV_PART_MAIN) != 256) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_transform_scale_y(obj, LV_PART_MAIN) != 256) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_transform_skew_x(obj, LV_PART_MAIN) != 0) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_transform_skew_y(obj, LV_PART_MAIN) != 0) return LV_LAYER_TYPE_TRANSFORM; + if(lv_obj_get_style_opa_layered(obj, LV_PART_MAIN) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE; + if(lv_obj_get_style_bitmap_mask_src(obj, LV_PART_MAIN) != NULL) return LV_LAYER_TYPE_SIMPLE; + if(lv_obj_get_style_blend_mode(obj, LV_PART_MAIN) != LV_BLEND_MODE_NORMAL) return LV_LAYER_TYPE_SIMPLE; + return LV_LAYER_TYPE_NONE; +} + +static void full_cache_refresh(lv_obj_t * obj, lv_part_t part) +{ +#if LV_OBJ_STYLE_CACHE + uint32_t i; + if(part == LV_PART_MAIN || part == LV_PART_ANY) { + obj->style_main_prop_is_set = 0; + for(i = 0; i < obj->style_cnt; i++) { + if(lv_obj_style_get_selector_part(obj->styles[i].selector) != LV_PART_MAIN) continue; + if(obj->styles[i].is_disabled) continue; + lv_style_t * style = (lv_style_t *)obj->styles[i].style; + uint32_t j; + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = style->values_and_props; + for(j = 0; props[j].prop != LV_STYLE_PROP_INV; j++) { + obj->style_main_prop_is_set |= STYLE_PROP_SHIFTED(props[j].prop); + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + for(j = 0; j < style->prop_cnt; j++) { + obj->style_main_prop_is_set |= STYLE_PROP_SHIFTED(props[j]); + } + } + } + } + if(part != LV_PART_MAIN || part == LV_PART_ANY) { + obj->style_other_prop_is_set = 0; + for(i = 0; i < obj->style_cnt; i++) { + if(lv_obj_style_get_selector_part(obj->styles[i].selector) == LV_PART_MAIN) continue; + if(obj->styles[i].is_disabled) continue; + + lv_style_t * style = (lv_style_t *)obj->styles[i].style; + uint32_t j; + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = style->values_and_props; + for(j = 0; props[j].prop != LV_STYLE_PROP_INV; j++) { + obj->style_other_prop_is_set |= STYLE_PROP_SHIFTED(props[j].prop); + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + for(j = 0; j < style->prop_cnt; j++) { + obj->style_other_prop_is_set |= STYLE_PROP_SHIFTED(props[j]); + } + } + } + } +#else + LV_UNUSED(obj); + LV_UNUSED(part); +#endif +} + +static void fade_anim_cb(void * obj, int32_t v) +{ + lv_obj_set_style_opa(obj, v, 0); +} + +static void fade_in_anim_completed(lv_anim_t * a) +{ + lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0); +} + +static bool style_has_flag(const lv_style_t * style, uint32_t flag) +{ + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = style->values_and_props; + uint32_t i; + for(i = 0; props[i].prop != LV_STYLE_PROP_INV; i++) { + if(lv_style_prop_has_flag(props[i].prop, flag)) { + return true; + } + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + if(lv_style_prop_has_flag(props[i], flag)) { + return true; + } + } + } + return false; +} + +static lv_style_res_t get_selector_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop, + lv_style_value_t * value_act) +{ + lv_style_res_t found; + lv_part_t part = lv_obj_style_get_selector_part(selector); + + /*The happy path*/ +#if LV_OBJ_STYLE_CACHE + const uint32_t prop_shifted = STYLE_PROP_SHIFTED(prop); + if((part == LV_PART_MAIN ? obj->style_main_prop_is_set : obj->style_other_prop_is_set) & prop_shifted) +#endif + { + found = get_prop_core(obj, selector, prop, value_act); + if(found == LV_STYLE_RES_FOUND) return LV_STYLE_RES_FOUND; + } + + extern const uint8_t lv_style_builtin_prop_flag_lookup_table[]; + bool inheritable = false; + if(prop < LV_STYLE_NUM_BUILT_IN_PROPS) { + inheritable = lv_style_builtin_prop_flag_lookup_table[prop] & LV_STYLE_PROP_FLAG_INHERITABLE; + } + else { + if(_style_custom_prop_flag_lookup_table != NULL) { + inheritable = _style_custom_prop_flag_lookup_table[prop - LV_STYLE_NUM_BUILT_IN_PROPS] & + LV_STYLE_PROP_FLAG_INHERITABLE; + } + } + + if(inheritable) { + /*If not found, check the `MAIN` style first, if already on the MAIN part go to the parent*/ + if(part != LV_PART_MAIN) part = LV_PART_MAIN; + else obj = obj->parent; + + while(obj) { +#if LV_OBJ_STYLE_CACHE + if(obj->style_main_prop_is_set & prop_shifted) +#endif + { + selector = part | obj->state; + found = get_prop_core(obj, selector, prop, value_act); + if(found == LV_STYLE_RES_FOUND) return LV_STYLE_RES_FOUND; + } + /*Check the parent too.*/ + obj = obj->parent; + } + } + else { + /*Get the width and height from the class. + * WIDTH and HEIGHT are not inherited so add them in the `else` to skip checking them for inherited properties */ + if(part == LV_PART_MAIN && (prop == LV_STYLE_WIDTH || prop == LV_STYLE_HEIGHT)) { + const lv_obj_class_t * cls = obj->class_p; + while(cls) { + if(prop == LV_STYLE_WIDTH) { + if(cls->width_def != 0) { + value_act->num = cls->width_def; + return LV_STYLE_RES_FOUND; + } + } + else { + if(cls->height_def != 0) { + value_act->num = cls->height_def; + return LV_STYLE_RES_FOUND; + } + } + cls = cls->base_class; + } + } + } + + return LV_STYLE_RES_NOT_FOUND; +} + +static void remove_style_core(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector, bool theme_only) +{ + lv_state_t state = lv_obj_style_get_selector_state(selector); + lv_part_t part = lv_obj_style_get_selector_part(selector); + lv_style_prop_t prop = LV_STYLE_PROP_ANY; + if(style && style->prop_cnt == 0) prop = LV_STYLE_PROP_INV; + + if(style && part == LV_PART_MAIN && style_has_flag(style, LV_STYLE_PROP_FLAG_TRANSFORM)) { + lv_obj_invalidate(obj); + } + + uint32_t i = 0; + bool deleted = false; + while(i < obj->style_cnt) { + lv_state_t state_act = lv_obj_style_get_selector_state(obj->styles[i].selector); + lv_part_t part_act = lv_obj_style_get_selector_part(obj->styles[i].selector); + if(theme_only && !obj->styles[i].is_theme) { + i++; + continue; + } + if((state != LV_STATE_ANY && state_act != state) || + (part != LV_PART_ANY && part_act != part) || + (style != NULL && style != obj->styles[i].style)) { + i++; + continue; + } + + if(obj->styles[i].is_trans) { + trans_delete(obj, part, LV_STYLE_PROP_ANY, NULL); + } + + if(obj->styles[i].is_local || obj->styles[i].is_trans) { + if(obj->styles[i].style) lv_style_reset((lv_style_t *)obj->styles[i].style); + lv_free((lv_style_t *)obj->styles[i].style); + obj->styles[i].style = NULL; + } + + /*Shift the styles after `i` by one*/ + uint32_t j; + for(j = i; j < (uint32_t)obj->style_cnt - 1 ; j++) { + obj->styles[j] = obj->styles[j + 1]; + } + + obj->style_cnt--; + obj->styles = lv_realloc(obj->styles, obj->style_cnt * sizeof(lv_obj_style_t)); + + deleted = true; + /*The style from the current `i` index is removed, so `i` points to the next style. + *Therefore it doesn't needs to be incremented*/ + } + + if(deleted && prop != LV_STYLE_PROP_INV) { + full_cache_refresh(obj, part); + lv_obj_refresh_style(obj, part, prop); + } +} + + + +#if LV_USE_OBSERVER + +static void bind_style_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + bind_style_t * p = observer->user_data; + + int32_t v = lv_subject_get_int(subject); + bool dis = (v != p->value); + lv_obj_style_set_disabled(observer->target, p->style, p->selector, dis); +} + +static void bind_style_prop_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + bind_style_prop_t * p = observer->user_data; + + lv_style_value_t style_v; + if(subject->type == LV_SUBJECT_TYPE_INT) style_v.num = lv_subject_get_int(subject); + else if(subject->type == LV_SUBJECT_TYPE_COLOR) style_v.color = lv_subject_get_color(subject); + else if(subject->type == LV_SUBJECT_TYPE_POINTER) style_v.ptr = lv_subject_get_pointer(subject); + else { + LV_LOG_WARN("Not supported subject type (%"LV_PRIu32")", (uint32_t) subject->type); + return; + } + + lv_obj_set_local_style_prop(observer->target, p->prop, style_v, p->selector); +} + + +#endif /*LV_USE_OBSERVER*/ diff --git a/inc/lvgl/src/core/lv_obj_style.h b/inc/lvgl/src/core/lv_obj_style.h new file mode 100644 index 0000000..5f1f535 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_style.h @@ -0,0 +1,443 @@ +/** + * @file lv_obj_style.h + * + */ + +#ifndef LV_OBJ_STYLE_H +#define LV_OBJ_STYLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_bidi.h" +#include "../misc/lv_style.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Possible states of a widget. + * OR-ed values are possible + */ +typedef enum { + LV_STATE_DEFAULT = 0, + LV_STATE_ALT = 1 << 0, + /*1 reserved*/ + LV_STATE_CHECKED = 1 << 2, + LV_STATE_FOCUSED = 1 << 3, + LV_STATE_FOCUS_KEY = 1 << 4, + LV_STATE_EDITED = 1 << 5, + LV_STATE_HOVERED = 1 << 6, + LV_STATE_PRESSED = 1 << 7, + LV_STATE_SCROLLED = 1 << 8, + LV_STATE_DISABLED = 1 << 9, + /*2 reserved*/ + LV_STATE_USER_1 = 1 << 12, + LV_STATE_USER_2 = 1 << 13, + LV_STATE_USER_3 = 1 << 14, + LV_STATE_USER_4 = 1 << 15, + + LV_STATE_ANY = 0xFFFF, /**< Special value can be used in some functions to target all states*/ +} lv_state_t; + +/** + * The possible parts of widgets. + * The parts can be considered as the internal building block of the widgets. + * E.g. slider = background + indicator + knob + * Not all parts are used by every widget + */ + +typedef enum { + LV_PART_MAIN = 0x000000, /**< A background like rectangle*/ + LV_PART_SCROLLBAR = 0x010000, /**< The scrollbar(s)*/ + LV_PART_INDICATOR = 0x020000, /**< Indicator, e.g. for slider, bar, switch, or the tick box of the checkbox*/ + LV_PART_KNOB = 0x030000, /**< Like handle to grab to adjust the value*/ + LV_PART_SELECTED = 0x040000, /**< Indicate the currently selected option or section*/ + LV_PART_ITEMS = 0x050000, /**< Used if the widget has multiple similar elements (e.g. table cells)*/ + LV_PART_CURSOR = 0x060000, /**< Mark a specific place e.g. for text area's cursor or on a chart*/ + + LV_PART_CUSTOM_FIRST = 0x080000, /**< Extension point for custom widgets*/ + + LV_PART_ANY = 0x0F0000, /**< Special value can be used in some functions to target all parts*/ +} lv_part_t; + +typedef enum { + LV_STYLE_STATE_CMP_SAME, /**< The style properties in the 2 states are identical */ + LV_STYLE_STATE_CMP_DIFF_REDRAW, /**< The differences can be shown with a simple redraw */ + LV_STYLE_STATE_CMP_DIFF_DRAW_PAD, /**< The differences can be shown with a simple redraw */ + LV_STYLE_STATE_CMP_DIFF_LAYOUT, /**< The differences can be shown with a simple redraw */ +} lv_style_state_cmp_t; + +/** + * A joint type for `lv_part_t` and `lv_state_t`. Example values + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRSSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +typedef uint32_t lv_style_selector_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Add a style to an object. + * @param obj pointer to an object + * @param style pointer to a style to add + * @param selector OR-ed value of parts and state to which the style should be added + * + * Examples: + * @code + * lv_obj_add_style(btn, &style_btn, 0); //Default button style + * + * lv_obj_add_style(btn, &btn_red, LV_STATE_PRESSED); //Overwrite only some colors to red when pressed + * @endcode + */ +void lv_obj_add_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector); + +/** + * Replaces a style of an object, preserving the order of the style stack (local styles and transitions are ignored). + * @param obj pointer to an object + * @param old_style pointer to a style to replace. + * @param new_style pointer to a style to replace the old style with. + * @param selector OR-ed values of states and a part to replace only styles with matching selectors. LV_STATE_ANY and LV_PART_ANY can be used + * + * Examples: + * @code + * lv_obj_replace_style(obj, &yellow_style, &blue_style, LV_PART_ANY | LV_STATE_ANY); //Replace a specific style + * + * lv_obj_replace_style(obj, &yellow_style, &blue_style, LV_PART_MAIN | LV_STATE_PRESSED); //Replace a specific style assigned to the main part when it is pressed + * @endcode + */ +bool lv_obj_replace_style(lv_obj_t * obj, const lv_style_t * old_style, const lv_style_t * new_style, + lv_style_selector_t selector); + +/** + * Remove a style from an object. + * @param obj pointer to an object + * @param style pointer to a style to remove. Can be NULL to check only the selector + * @param selector OR-ed values of states and a part to remove only styles with matching selectors. LV_STATE_ANY and LV_PART_ANY can be used + * + * Examples: + * @code + * lv_obj_remove_style(obj, &style, LV_PART_ANY | LV_STATE_ANY); //Remove a specific style + * + * lv_obj_remove_style(obj, NULL, LV_PART_MAIN | LV_STATE_ANY); //Remove all styles from the main part + * + * lv_obj_remove_style(obj, NULL, LV_PART_ANY | LV_STATE_ANY); //Remove all styles + * @endcode + */ +void lv_obj_remove_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector); + + +/** + * Remove all styles added by a theme from a widget + * @param selector OR-ed values of states and a part to remove only styles with matching selectors. + * LV_STATE_ANY and LV_PART_ANY can be used + * @param obj pointer to a widget + */ +void lv_obj_remove_theme(lv_obj_t * obj, lv_style_selector_t selector); + +/** + * Remove all styles from an object + * @param obj pointer to an object + */ +void lv_obj_remove_style_all(lv_obj_t * obj); + +/** + * Notify all object if a style is modified + * @param style pointer to a style. Only the objects with this style will be notified + * (NULL to notify all objects) + */ +void lv_obj_report_style_change(lv_style_t * style); + +/** + * Notify an object and its children about its style is modified. + * @param obj pointer to an object + * @param part the part whose style was changed. E.g. `LV_PART_ANY`, `LV_PART_MAIN` + * @param prop `LV_STYLE_PROP_ANY` or an `LV_STYLE_...` property. + * It is used to optimize what needs to be refreshed. + * `LV_STYLE_PROP_INV` to perform only a style cache update + */ +void lv_obj_refresh_style(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop); + +/** + * Temporary disable a style for a selector. It will look like is the style wasn't added + * @param obj pointer to an object + * @param style pointer to a style + * @param selector the selector of a style (e.g. LV_STATE_PRESSED | LV_PART_KNOB) + * @param dis true: disable the style, false: enable the style + */ +void lv_obj_style_set_disabled(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector, bool dis); + +/** + * Get if a given style is disabled on an object. + * @param obj pointer to an object + * @param style pointer to a style + * @param selector the selector of a style (e.g. LV_STATE_PRESSED | LV_PART_KNOB) + * @return true: disable the style, false: enable the style + */ +bool lv_obj_style_get_disabled(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector); + +/** + * Enable or disable automatic style refreshing when a new style is added/removed to/from an object + * or any other style change happens. + * @param en true: enable refreshing; false: disable refreshing + */ +void lv_obj_enable_style_refresh(bool en); + +/** + * Get the value of a style property. The current state of the object will be considered. + * Inherited properties will be inherited. + * If a property is not set a default value will be returned. + * @param obj pointer to an object + * @param part a part from which the property should be get + * @param prop the property to get + * @return the value of the property. + * Should be read from the correct field of the `lv_style_value_t` according to the type of the property. + */ +lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop); + +/** + * Check if an object has a specified style property for a given style selector. + * @param obj pointer to an object + * @param selector the style selector to be checked, defining the scope of the style to be examined. + * @param prop the property to be checked. + * @return true if the object has the specified selector and property, false otherwise. + */ +bool lv_obj_has_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop); + +/** + * Set local style property on an object's part and state. + * @param obj pointer to an object + * @param prop the property + * @param value value of the property. The correct element should be set according to the type of the property + * @param selector OR-ed value of parts and state for which the style should be set + */ +void lv_obj_set_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t value, + lv_style_selector_t selector); + +lv_style_res_t lv_obj_get_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_value_t * value, + lv_style_selector_t selector); + +/** + * Remove a local style property from a part of an object with a given state. + * @param obj pointer to an object + * @param prop a style property to remove. + * @param selector OR-ed value of parts and state for which the style should be removed + * @return true the property was found and removed; false: the property was not found + */ +bool lv_obj_remove_local_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector); + +/** + * Used internally for color filtering + */ +lv_style_value_t lv_obj_style_apply_color_filter(const lv_obj_t * obj, lv_part_t part, lv_style_value_t v); + +/** + * Fade in an an object and all its children. + * @param obj the object to fade in + * @param time time of fade + * @param delay delay to start the animation + */ +void lv_obj_fade_in(lv_obj_t * obj, uint32_t time, uint32_t delay); + +/** + * Fade out an an object and all its children. + * @param obj the object to fade out + * @param time time of fade + * @param delay delay to start the animation + */ +void lv_obj_fade_out(lv_obj_t * obj, uint32_t time, uint32_t delay); + +static inline lv_state_t lv_obj_style_get_selector_state(lv_style_selector_t selector) +{ + return (lv_state_t)(selector & 0xFFFF); +} + +static inline lv_part_t lv_obj_style_get_selector_part(lv_style_selector_t selector) +{ + return (lv_part_t)(selector & 0xFF0000); +} + +#include "lv_obj_style_gen.h" + +static inline void lv_obj_set_style_pad_all(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_left(obj, value, selector); + lv_obj_set_style_pad_right(obj, value, selector); + lv_obj_set_style_pad_top(obj, value, selector); + lv_obj_set_style_pad_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_pad_hor(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_left(obj, value, selector); + lv_obj_set_style_pad_right(obj, value, selector); +} + +static inline void lv_obj_set_style_pad_ver(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_top(obj, value, selector); + lv_obj_set_style_pad_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_margin_all(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_margin_left(obj, value, selector); + lv_obj_set_style_margin_right(obj, value, selector); + lv_obj_set_style_margin_top(obj, value, selector); + lv_obj_set_style_margin_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_margin_hor(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_margin_left(obj, value, selector); + lv_obj_set_style_margin_right(obj, value, selector); +} + +static inline void lv_obj_set_style_margin_ver(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_margin_top(obj, value, selector); + lv_obj_set_style_margin_bottom(obj, value, selector); +} + +static inline void lv_obj_set_style_pad_gap(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_obj_set_style_pad_row(obj, value, selector); + lv_obj_set_style_pad_column(obj, value, selector); +} + +static inline void lv_obj_set_style_size(lv_obj_t * obj, int32_t width, int32_t height, + lv_style_selector_t selector) +{ + lv_obj_set_style_width(obj, width, selector); + lv_obj_set_style_height(obj, height, selector); +} + +static inline void lv_obj_set_style_transform_scale(lv_obj_t * obj, int32_t value, + lv_style_selector_t selector) +{ + lv_obj_set_style_transform_scale_x(obj, value, selector); + lv_obj_set_style_transform_scale_y(obj, value, selector); +} + +static inline int32_t lv_obj_get_style_space_left(const lv_obj_t * obj, lv_part_t part) +{ + int32_t padding = lv_obj_get_style_pad_left(obj, part); + int32_t border_width = lv_obj_get_style_border_width(obj, part); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); + return (border_side & LV_BORDER_SIDE_LEFT) ? padding + border_width : padding; +} + +static inline int32_t lv_obj_get_style_space_right(const lv_obj_t * obj, lv_part_t part) +{ + int32_t padding = lv_obj_get_style_pad_right(obj, part); + int32_t border_width = lv_obj_get_style_border_width(obj, part); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); + return (border_side & LV_BORDER_SIDE_RIGHT) ? padding + border_width : padding; +} + +static inline int32_t lv_obj_get_style_space_top(const lv_obj_t * obj, lv_part_t part) +{ + int32_t padding = lv_obj_get_style_pad_top(obj, part); + int32_t border_width = lv_obj_get_style_border_width(obj, part); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); + return (border_side & LV_BORDER_SIDE_TOP) ? padding + border_width : padding; +} + +static inline int32_t lv_obj_get_style_space_bottom(const lv_obj_t * obj, lv_part_t part) +{ + int32_t padding = lv_obj_get_style_pad_bottom(obj, part); + int32_t border_width = lv_obj_get_style_border_width(obj, part); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, part); + return (border_side & LV_BORDER_SIDE_BOTTOM) ? padding + border_width : padding; +} + +lv_text_align_t lv_obj_calculate_style_text_align(const lv_obj_t * obj, lv_part_t part, const char * txt); + +static inline int32_t lv_obj_get_style_transform_scale_x_safe(const lv_obj_t * obj, lv_part_t part) +{ + int32_t scale = lv_obj_get_style_transform_scale_x(obj, part); + return scale > 0 ? scale : 1; +} + +static inline int32_t lv_obj_get_style_transform_scale_y_safe(const lv_obj_t * obj, lv_part_t part) +{ + int32_t scale = lv_obj_get_style_transform_scale_y(obj, part); + return scale > 0 ? scale : 1; +} + +/** + * Get the `opa` style property from all parents and multiply and `>> 8` them. + * @param obj the object whose opacity should be get + * @param part the part whose opacity should be get. Non-MAIN parts will consider the `opa` of the MAIN part too + * @return the final opacity considering the parents' opacity too + */ +lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part); + + +/** + * Apply recolor effect to the input color based on the object's style properties. + * @param obj the target object containing recolor style properties + * @param part the part to retrieve recolor styles. + * @param color the original color to be modified + * @return the blended color after applying recolor and opacity + */ +lv_color32_t lv_obj_style_apply_recolor(const lv_obj_t * obj, lv_part_t part, lv_color32_t color); + +/** + * Get the `recolor` style property from all parents and blend them recursively. + * @param obj the object whose recolor value should be retrieved + * @param part the target part to check. Non-MAIN parts will also consider + * the `recolor` value from the MAIN part during calculation + * @return the final blended recolor value combining all parent's recolor values + */ +lv_color32_t lv_obj_get_style_recolor_recursive(const lv_obj_t * obj, lv_part_t part); + +#if LV_USE_OBSERVER +/** + * Disable a style if a subject's value is not equal to a reference value + * @param obj pointer to Widget + * @param style pointer to a style + * @param selector pointer to a selector + * @param subject pointer to Subject + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_style(lv_obj_t * obj, const lv_style_t * style, lv_style_selector_t selector, + lv_subject_t * subject, int32_t ref_value); + +/** + * Connect a subject's value to a style property of a widget. + * @param obj pointer to a Widget + * @param prop a style property + * @param selector a selector for which the property should be added, e.g. `LV_PART_KNOB | LV_STATE_PRESSED` + * @param subject pointer a Subject to which value the property should be bound + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_style_prop(lv_obj_t * obj, lv_style_prop_t prop, lv_style_selector_t selector, + lv_subject_t * subject); + +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_STYLE_H*/ diff --git a/inc/lvgl/src/core/lv_obj_style_gen.c b/inc/lvgl/src/core/lv_obj_style_gen.c new file mode 100644 index 0000000..4273c93 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_style_gen.c @@ -0,0 +1,1042 @@ +/* + * @file + * + ********************************************************************** + * DO NOT EDIT + * This file is automatically generated by "style_api_gen.py" + ********************************************************************** + */ + + +#include "lv_obj.h" + + +void lv_obj_set_style_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_WIDTH, v, selector); +} + +void lv_obj_set_style_min_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MIN_WIDTH, v, selector); +} + +void lv_obj_set_style_max_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MAX_WIDTH, v, selector); +} + +void lv_obj_set_style_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_HEIGHT, v, selector); +} + +void lv_obj_set_style_min_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MIN_HEIGHT, v, selector); +} + +void lv_obj_set_style_max_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MAX_HEIGHT, v, selector); +} + +void lv_obj_set_style_length(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LENGTH, v, selector); +} + +void lv_obj_set_style_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_X, v, selector); +} + +void lv_obj_set_style_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_Y, v, selector); +} + +void lv_obj_set_style_align(lv_obj_t * obj, lv_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ALIGN, v, selector); +} + +void lv_obj_set_style_transform_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_WIDTH, v, selector); +} + +void lv_obj_set_style_transform_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_HEIGHT, v, selector); +} + +void lv_obj_set_style_translate_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_X, v, selector); +} + +void lv_obj_set_style_translate_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_Y, v, selector); +} + +void lv_obj_set_style_translate_radial(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSLATE_RADIAL, v, selector); +} + +void lv_obj_set_style_transform_scale_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SCALE_X, v, selector); +} + +void lv_obj_set_style_transform_scale_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SCALE_Y, v, selector); +} + +void lv_obj_set_style_transform_rotation(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_ROTATION, v, selector); +} + +void lv_obj_set_style_transform_pivot_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_X, v, selector); +} + +void lv_obj_set_style_transform_pivot_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_PIVOT_Y, v, selector); +} + +void lv_obj_set_style_transform_skew_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SKEW_X, v, selector); +} + +void lv_obj_set_style_transform_skew_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSFORM_SKEW_Y, v, selector); +} + +void lv_obj_set_style_pad_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_TOP, v, selector); +} + +void lv_obj_set_style_pad_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_BOTTOM, v, selector); +} + +void lv_obj_set_style_pad_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_LEFT, v, selector); +} + +void lv_obj_set_style_pad_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_RIGHT, v, selector); +} + +void lv_obj_set_style_pad_row(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_ROW, v, selector); +} + +void lv_obj_set_style_pad_column(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_COLUMN, v, selector); +} + +void lv_obj_set_style_pad_radial(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_PAD_RADIAL, v, selector); +} + +void lv_obj_set_style_margin_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_TOP, v, selector); +} + +void lv_obj_set_style_margin_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_BOTTOM, v, selector); +} + +void lv_obj_set_style_margin_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_LEFT, v, selector); +} + +void lv_obj_set_style_margin_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_MARGIN_RIGHT, v, selector); +} + +void lv_obj_set_style_bg_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_COLOR, v, selector); +} + +void lv_obj_set_style_bg_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_OPA, v, selector); +} + +void lv_obj_set_style_bg_grad_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_COLOR, v, selector); +} + +void lv_obj_set_style_bg_grad_dir(lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_DIR, v, selector); +} + +void lv_obj_set_style_bg_main_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_MAIN_STOP, v, selector); +} + +void lv_obj_set_style_bg_grad_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_STOP, v, selector); +} + +void lv_obj_set_style_bg_main_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_MAIN_OPA, v, selector); +} + +void lv_obj_set_style_bg_grad_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD_OPA, v, selector); +} + +void lv_obj_set_style_bg_grad(lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_GRAD, v, selector); +} + +void lv_obj_set_style_bg_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_SRC, v, selector); +} + +void lv_obj_set_style_bg_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_OPA, v, selector); +} + +void lv_obj_set_style_bg_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_RECOLOR, v, selector); +} + +void lv_obj_set_style_bg_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_RECOLOR_OPA, v, selector); +} + +void lv_obj_set_style_bg_image_tiled(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BG_IMAGE_TILED, v, selector); +} + +void lv_obj_set_style_border_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_COLOR, v, selector); +} + +void lv_obj_set_style_border_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_OPA, v, selector); +} + +void lv_obj_set_style_border_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_WIDTH, v, selector); +} + +void lv_obj_set_style_border_side(lv_obj_t * obj, lv_border_side_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_SIDE, v, selector); +} + +void lv_obj_set_style_border_post(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BORDER_POST, v, selector); +} + +void lv_obj_set_style_outline_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_WIDTH, v, selector); +} + +void lv_obj_set_style_outline_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_COLOR, v, selector); +} + +void lv_obj_set_style_outline_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_OPA, v, selector); +} + +void lv_obj_set_style_outline_pad(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OUTLINE_PAD, v, selector); +} + +void lv_obj_set_style_shadow_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_WIDTH, v, selector); +} + +void lv_obj_set_style_shadow_offset_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OFFSET_X, v, selector); +} + +void lv_obj_set_style_shadow_offset_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OFFSET_Y, v, selector); +} + +void lv_obj_set_style_shadow_spread(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_SPREAD, v, selector); +} + +void lv_obj_set_style_shadow_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_COLOR, v, selector); +} + +void lv_obj_set_style_shadow_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_SHADOW_OPA, v, selector); +} + +void lv_obj_set_style_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_OPA, v, selector); +} + +void lv_obj_set_style_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_RECOLOR, v, selector); +} + +void lv_obj_set_style_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_RECOLOR_OPA, v, selector); +} + +void lv_obj_set_style_image_colorkey(lv_obj_t * obj, const lv_image_colorkey_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_IMAGE_COLORKEY, v, selector); +} + +void lv_obj_set_style_line_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_WIDTH, v, selector); +} + +void lv_obj_set_style_line_dash_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_DASH_WIDTH, v, selector); +} + +void lv_obj_set_style_line_dash_gap(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_DASH_GAP, v, selector); +} + +void lv_obj_set_style_line_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_ROUNDED, v, selector); +} + +void lv_obj_set_style_line_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_COLOR, v, selector); +} + +void lv_obj_set_style_line_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LINE_OPA, v, selector); +} + +void lv_obj_set_style_arc_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_WIDTH, v, selector); +} + +void lv_obj_set_style_arc_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_ROUNDED, v, selector); +} + +void lv_obj_set_style_arc_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_COLOR, v, selector); +} + +void lv_obj_set_style_arc_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_OPA, v, selector); +} + +void lv_obj_set_style_arc_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ARC_IMAGE_SRC, v, selector); +} + +void lv_obj_set_style_text_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_COLOR, v, selector); +} + +void lv_obj_set_style_text_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_OPA, v, selector); +} + +void lv_obj_set_style_text_font(lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_FONT, v, selector); +} + +void lv_obj_set_style_text_letter_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_LETTER_SPACE, v, selector); +} + +void lv_obj_set_style_text_line_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_LINE_SPACE, v, selector); +} + +void lv_obj_set_style_text_decor(lv_obj_t * obj, lv_text_decor_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_DECOR, v, selector); +} + +void lv_obj_set_style_text_align(lv_obj_t * obj, lv_text_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_ALIGN, v, selector); +} + +void lv_obj_set_style_text_outline_stroke_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_OUTLINE_STROKE_COLOR, v, selector); +} + +void lv_obj_set_style_text_outline_stroke_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_OUTLINE_STROKE_WIDTH, v, selector); +} + +void lv_obj_set_style_text_outline_stroke_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TEXT_OUTLINE_STROKE_OPA, v, selector); +} + +void lv_obj_set_style_blur_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BLUR_RADIUS, v, selector); +} + +void lv_obj_set_style_blur_backdrop(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BLUR_BACKDROP, v, selector); +} + +void lv_obj_set_style_blur_quality(lv_obj_t * obj, lv_blur_quality_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BLUR_QUALITY, v, selector); +} + +void lv_obj_set_style_drop_shadow_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_DROP_SHADOW_RADIUS, v, selector); +} + +void lv_obj_set_style_drop_shadow_offset_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_DROP_SHADOW_OFFSET_X, v, selector); +} + +void lv_obj_set_style_drop_shadow_offset_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_DROP_SHADOW_OFFSET_Y, v, selector); +} + +void lv_obj_set_style_drop_shadow_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_DROP_SHADOW_COLOR, v, selector); +} + +void lv_obj_set_style_drop_shadow_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_DROP_SHADOW_OPA, v, selector); +} + +void lv_obj_set_style_drop_shadow_quality(lv_obj_t * obj, lv_blur_quality_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_DROP_SHADOW_QUALITY, v, selector); +} + +void lv_obj_set_style_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_RADIUS, v, selector); +} + +void lv_obj_set_style_radial_offset(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_RADIAL_OFFSET, v, selector); +} + +void lv_obj_set_style_clip_corner(lv_obj_t * obj, bool value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_CLIP_CORNER, v, selector); +} + +void lv_obj_set_style_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OPA, v, selector); +} + +void lv_obj_set_style_opa_layered(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_OPA_LAYERED, v, selector); +} + +void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_COLOR_FILTER_DSC, v, selector); +} + +void lv_obj_set_style_color_filter_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_COLOR_FILTER_OPA, v, selector); +} + +void lv_obj_set_style_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .color = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_RECOLOR, v, selector); +} + +void lv_obj_set_style_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_RECOLOR_OPA, v, selector); +} + +void lv_obj_set_style_anim(lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM, v, selector); +} + +void lv_obj_set_style_anim_duration(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ANIM_DURATION, v, selector); +} + +void lv_obj_set_style_transition(lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_TRANSITION, v, selector); +} + +void lv_obj_set_style_blend_mode(lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BLEND_MODE, v, selector); +} + +void lv_obj_set_style_layout(lv_obj_t * obj, uint16_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_LAYOUT, v, selector); +} + +void lv_obj_set_style_base_dir(lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BASE_DIR, v, selector); +} + +void lv_obj_set_style_bitmap_mask_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_BITMAP_MASK_SRC, v, selector); +} + +void lv_obj_set_style_rotary_sensitivity(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_ROTARY_SENSITIVITY, v, selector); +} +#if LV_USE_FLEX + +void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_FLOW, v, selector); +} + +void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_MAIN_PLACE, v, selector); +} + +void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_CROSS_PLACE, v, selector); +} + +void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_TRACK_PLACE, v, selector); +} + +void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_FLEX_GROW, v, selector); +} +#endif /* LV_USE_FLEX */ + +#if LV_USE_GRID + +void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v, selector); +} + +void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_COLUMN_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_ROW_DSC_ARRAY, v, selector); +} + +void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_ROW_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_COLUMN_POS, v, selector); +} + +void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_X_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_COLUMN_SPAN, v, selector); +} + +void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_ROW_POS, v, selector); +} + +void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_Y_ALIGN, v, selector); +} + +void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_obj_set_local_style_prop(obj, LV_STYLE_GRID_CELL_ROW_SPAN, v, selector); +} +#endif /* LV_USE_GRID */ + diff --git a/inc/lvgl/src/core/lv_obj_style_gen.h b/inc/lvgl/src/core/lv_obj_style_gen.h new file mode 100644 index 0000000..5e594c3 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_style_gen.h @@ -0,0 +1,3572 @@ +/* + * @file + * + ********************************************************************** + * DO NOT EDIT + * This file is automatically generated by "style_api_gen.py" + ********************************************************************** + */ + + +#ifndef LV_OBJ_STYLE_GEN_H +#define LV_OBJ_STYLE_GEN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" +#include "../core/lv_obj_style.h" +#include "../misc/lv_types.h" + +/** + * Gets width of Widget. Pixel, percentage and `LV_SIZE_CONTENT` values can be used. + * Percentage values are relative to the width of the parent's content area. + * Default: Widget dependent, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_WIDTH); + return (int32_t)v.num; +} + +/** + * Gets a minimal width. Pixel and percentage values can be used. Percentage values + * are relative to the width of the parent's content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_min_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MIN_WIDTH); + return (int32_t)v.num; +} + +/** + * Gets a maximal width. Pixel and percentage values can be used. Percentage values + * are relative to the width of the parent's content area. + * Default: LV_COORD_MAX, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_max_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MAX_WIDTH); + return (int32_t)v.num; +} + +/** + * Gets height of Widget. Pixel, percentage and `LV_SIZE_CONTENT` can be used. + * Percentage values are relative to the height of the parent's content area. + * Default: Widget dependent, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_height(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_HEIGHT); + return (int32_t)v.num; +} + +/** + * Gets a minimal height. Pixel and percentage values can be used. Percentage values + * are relative to the height of the parent's content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_min_height(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MIN_HEIGHT); + return (int32_t)v.num; +} + +/** + * Gets a maximal height. Pixel and percentage values can be used. Percentage values + * are relative to the height of the parent's content area. + * Default: LV_COORD_MAX, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_max_height(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MAX_HEIGHT); + return (int32_t)v.num; +} + +/** + * Its meaning depends on the type of Widget. For example in case of lv_scale it means + * the length of the ticks. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_length(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LENGTH); + return (int32_t)v.num; +} + +/** + * Get X coordinate of Widget considering the ``align`` setting. Pixel and percentage + * values can be used. Percentage values are relative to the width of the parent's + * content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_x(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_X); + return (int32_t)v.num; +} + +/** + * Get Y coordinate of Widget considering the ``align`` setting. Pixel and percentage + * values can be used. Percentage values are relative to the height of the parent's + * content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_y(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_Y); + return (int32_t)v.num; +} + +/** + * Get the alignment which tells from which point of the parent the X and Y + * coordinates should be interpreted. Possible values are: `LV_ALIGN_DEFAULT`, + * `LV_ALIGN_TOP_LEFT/MID/RIGHT`, `LV_ALIGN_BOTTOM_LEFT/MID/RIGHT`, + * `LV_ALIGN_LEFT/RIGHT_MID`, `LV_ALIGN_CENTER`. `LV_ALIGN_DEFAULT` means + * `LV_ALIGN_TOP_LEFT` with LTR base direction and `LV_ALIGN_TOP_RIGHT` with RTL base + * direction. + * Default: `LV_ALIGN_DEFAULT`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_align_t lv_obj_get_style_align(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ALIGN); + return (lv_align_t)v.num; +} + +/** + * Make Widget wider on both sides with this value. Pixel and percentage (with + * `lv_pct(x)`) values can be used. Percentage values are relative to Widget's width. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_transform_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_WIDTH); + return (int32_t)v.num; +} + +/** + * Make Widget higher on both sides with this value. Pixel and percentage (with + * `lv_pct(x)`) values can be used. Percentage values are relative to Widget's height. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_transform_height(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_HEIGHT); + return (int32_t)v.num; +} + +/** + * Move Widget with this value in X direction. Applied after layouts, aligns and other + * positioning. Pixel and percentage (with `lv_pct(x)`) values can be used. Percentage + * values are relative to Widget's width. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_translate_x(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSLATE_X); + return (int32_t)v.num; +} + +/** + * Move Widget with this value in Y direction. Applied after layouts, aligns and other + * positioning. Pixel and percentage (with `lv_pct(x)`) values can be used. Percentage + * values are relative to Widget's height. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_translate_y(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSLATE_Y); + return (int32_t)v.num; +} + +/** + * Move object around the centre of the parent object (e.g. around the circumference + * of a scale). + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_translate_radial(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSLATE_RADIAL); + return (int32_t)v.num; +} + +/** + * Zoom Widget horizontally. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 + * half size, 512 double size, and so on. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_transform_scale_x(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SCALE_X); + return (int32_t)v.num; +} + +/** + * Zoom Widget vertically. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 + * half size, 512 double size, and so on. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_transform_scale_y(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SCALE_Y); + return (int32_t)v.num; +} + +/** + * Rotate Widget. The value is interpreted in 0.1 degree units. E.g. 450 means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_transform_rotation(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_ROTATION); + return (int32_t)v.num; +} + +/** + * Get pivot point's X coordinate for transformations. Relative to Widget's top left corner. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_transform_pivot_x(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_X); + return (int32_t)v.num; +} + +/** + * Get pivot point's Y coordinate for transformations. Relative to Widget's top left corner. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_transform_pivot_y(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_PIVOT_Y); + return (int32_t)v.num; +} + +/** + * Skew Widget horizontally. The value is interpreted in 0.1 degree units. E.g. 450 + * means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_transform_skew_x(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SKEW_X); + return (int32_t)v.num; +} + +/** + * Skew Widget vertically. The value is interpreted in 0.1 degree units. E.g. 450 + * means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_transform_skew_y(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSFORM_SKEW_Y); + return (int32_t)v.num; +} + +/** + * Gets the padding on the top. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_pad_top(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_TOP); + return (int32_t)v.num; +} + +/** + * Gets the padding on the bottom. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_pad_bottom(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_BOTTOM); + return (int32_t)v.num; +} + +/** + * Gets the padding on the left. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_pad_left(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_LEFT); + return (int32_t)v.num; +} + +/** + * Gets the padding on the right. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_pad_right(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_RIGHT); + return (int32_t)v.num; +} + +/** + * Gets the padding between the rows. Used by the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_pad_row(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_ROW); + return (int32_t)v.num; +} + +/** + * Gets the padding between the columns. Used by the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_pad_column(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_COLUMN); + return (int32_t)v.num; +} + +/** + * Pad text labels away from the scale ticks/remainder of the ``LV_PART_``. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_pad_radial(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_PAD_RADIAL); + return (int32_t)v.num; +} + +/** + * Gets margin on the top. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_margin_top(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_TOP); + return (int32_t)v.num; +} + +/** + * Gets margin on the bottom. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_margin_bottom(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_BOTTOM); + return (int32_t)v.num; +} + +/** + * Gets margin on the left. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_margin_left(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_LEFT); + return (int32_t)v.num; +} + +/** + * Gets margin on the right. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_margin_right(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_MARGIN_RIGHT); + return (int32_t)v.num; +} + +/** + * Get background color of Widget. + * Default: `0xffffff`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_bg_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR); + return v.color; +} + +/** + * Get background color of Widget. + * Default: `0xffffff`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_bg_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_COLOR)); + return v.color; +} + +/** + * Get opacity of the background. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_bg_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get gradient color of the background. Used only if `grad_dir` is not `LV_GRAD_DIR_NONE`. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_bg_grad_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR); + return v.color; +} + +/** + * Get gradient color of the background. Used only if `grad_dir` is not `LV_GRAD_DIR_NONE`. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_bg_grad_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR)); + return v.color; +} + +/** + * Get direction of the gradient of the background. Possible values are + * `LV_GRAD_DIR_NONE/HOR/VER`. + * Default: `LV_GRAD_DIR_NONE`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_grad_dir_t lv_obj_get_style_bg_grad_dir(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_DIR); + return (lv_grad_dir_t)v.num; +} + +/** + * Get point from which background color should start for gradients. 0 means to + * top/left side, 255 the bottom/right side, 128 the center, and so on. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_bg_main_stop(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_MAIN_STOP); + return (int32_t)v.num; +} + +/** + * Get point from which background's gradient color should start. 0 means to top/left + * side, 255 the bottom/right side, 128 the center, and so on. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_bg_grad_stop(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_STOP); + return (int32_t)v.num; +} + +/** + * Get opacity of the first gradient color. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_bg_main_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_MAIN_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get opacity of the second gradient color. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_bg_grad_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get gradient definition. The pointed instance must exist while Widget is alive. + * NULL to disable. It wraps `BG_GRAD_COLOR`, `BG_GRAD_DIR`, `BG_MAIN_STOP` and + * `BG_GRAD_STOP` into one descriptor and allows creating gradients with more colors + * as well. If it's set other gradient related properties will be ignored. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const lv_grad_dsc_t * lv_obj_get_style_bg_grad(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD); + return (const lv_grad_dsc_t *)v.ptr; +} + +/** + * Get a background image. Can be a pointer to `lv_image_dsc_t`, a path to a file or + * an `LV_SYMBOL_...`. + * Default: `NULL`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const void * lv_obj_get_style_bg_image_src(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_SRC); + return (const void *)v.ptr; +} + +/** + * Get opacity of the background image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means + * fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other + * values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_bg_image_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get a color to mix to the background image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_bg_image_recolor(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR); + return v.color; +} + +/** + * Get a color to mix to the background image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_bg_image_recolor_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR)); + return v.color; +} + +/** + * Get intensity of background image recoloring. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means no mixing, 255, `LV_OPA_100` or `LV_OPA_COVER` means full + * recoloring, other values or LV_OPA_10, LV_OPA_20, etc are interpreted + * proportionally. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_bg_image_recolor_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR_OPA); + return (lv_opa_t)v.num; +} + +/** + * If enabled the background image will be tiled. Possible values are `true` or `false`. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline bool lv_obj_get_style_bg_image_tiled(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_TILED); + return (bool)v.num; +} + +/** + * Get color of the border. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_border_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR); + return v.color; +} + +/** + * Get color of the border. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_border_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR)); + return v.color; +} + +/** + * Get opacity of the border. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_border_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get width of the border. Only pixel values can be used. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_border_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_WIDTH); + return (int32_t)v.num; +} + +/** + * Get only which side(s) the border should be drawn. Possible values are + * `LV_BORDER_SIDE_NONE/TOP/BOTTOM/LEFT/RIGHT/INTERNAL`. OR-ed values can be used as + * well, e.g. `LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_LEFT`. + * Default: `LV_BORDER_SIDE_FULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_border_side_t lv_obj_get_style_border_side(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_SIDE); + return (lv_border_side_t)v.num; +} + +/** + * Gets whether the border should be drawn before or after the children are drawn. + * `true`: after children, `false`: before children. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline bool lv_obj_get_style_border_post(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_POST); + return (bool)v.num; +} + +/** + * Get width of outline in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_outline_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_WIDTH); + return (int32_t)v.num; +} + +/** + * Get color of outline. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_outline_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR); + return v.color; +} + +/** + * Get color of outline. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_outline_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR)); + return v.color; +} + +/** + * Get opacity of outline. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_outline_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get padding of outline, i.e. the gap between Widget and the outline. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_outline_pad(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_PAD); + return (int32_t)v.num; +} + +/** + * Get width of the shadow in pixels. The value should be >= 0. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_shadow_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_WIDTH); + return (int32_t)v.num; +} + +/** + * Get an offset on the shadow in pixels in X direction. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_shadow_offset_x(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OFFSET_X); + return (int32_t)v.num; +} + +/** + * Get an offset on the shadow in pixels in Y direction. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_shadow_offset_y(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OFFSET_Y); + return (int32_t)v.num; +} + +/** + * Make shadow calculation to use a larger or smaller rectangle as base. The value can + * be in pixels to make the area larger/smaller. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_shadow_spread(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_SPREAD); + return (int32_t)v.num; +} + +/** + * Get color of shadow. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_shadow_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR); + return v.color; +} + +/** + * Get color of shadow. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_shadow_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR)); + return v.color; +} + +/** + * Get opacity of shadow. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_shadow_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get opacity of an image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_image_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get color to mix with the image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_image_recolor(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR); + return v.color; +} + +/** + * Get color to mix with the image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_image_recolor_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR)); + return v.color; +} + +/** + * Get intensity of color mixing. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_image_recolor_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get image colorkey definition. The lv_image_colorkey_t contains two color values: + * `high_color` and `low_color`. the color of pixels ranging from `low_color` to + * `high_color` will be transparent. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const lv_image_colorkey_t * lv_obj_get_style_image_colorkey(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_COLORKEY); + return (const lv_image_colorkey_t *)v.ptr; +} + +/** + * Get width of lines in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_line_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_WIDTH); + return (int32_t)v.num; +} + +/** + * Get width of dashes in pixels. Note that dash works only on horizontal and vertical lines. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_line_dash_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_DASH_WIDTH); + return (int32_t)v.num; +} + +/** + * Get gap between dashes in pixels. Note that dash works only on horizontal and + * vertical lines. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_line_dash_gap(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_DASH_GAP); + return (int32_t)v.num; +} + +/** + * Make end points of the lines rounded. `true`: rounded, `false`: perpendicular line ending. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline bool lv_obj_get_style_line_rounded(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_ROUNDED); + return (bool)v.num; +} + +/** + * Get color of lines. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_line_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR); + return v.color; +} + +/** + * Get color of lines. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_line_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_COLOR)); + return v.color; +} + +/** + * Get opacity of lines. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_line_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LINE_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get width (thickness) of arcs in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_arc_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_WIDTH); + return (int32_t)v.num; +} + +/** + * Make end points of arcs rounded. `true`: rounded, `false`: perpendicular line ending. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline bool lv_obj_get_style_arc_rounded(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_ROUNDED); + return (bool)v.num; +} + +/** + * Get color of arc. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_arc_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR); + return v.color; +} + +/** + * Get color of arc. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_arc_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_COLOR)); + return v.color; +} + +/** + * Get opacity of arcs. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_arc_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get an image from which arc will be masked out. It's useful to display complex + * effects on the arcs. Can be a pointer to `lv_image_dsc_t` or a path to a file. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const void * lv_obj_get_style_arc_image_src(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ARC_IMAGE_SRC); + return (const void *)v.ptr; +} + +/** + * Gets color of text. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_text_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR); + return v.color; +} + +/** + * Gets color of text. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_text_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_COLOR)); + return v.color; +} + +/** + * Get opacity of text. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_text_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get font of text (a pointer `lv_font_t *`). + * Default: `LV_FONT_DEFAULT`, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const lv_font_t * lv_obj_get_style_text_font(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_FONT); + return (const lv_font_t *)v.ptr; +} + +/** + * Get letter space in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_text_letter_space(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_LETTER_SPACE); + return (int32_t)v.num; +} + +/** + * Get line space in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_text_line_space(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_LINE_SPACE); + return (int32_t)v.num; +} + +/** + * Get decoration for the text. Possible values are + * `LV_TEXT_DECOR_NONE/UNDERLINE/STRIKETHROUGH`. OR-ed values can be used as well. + * Default: `LV_TEXT_DECOR_NONE`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_text_decor_t lv_obj_get_style_text_decor(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_DECOR); + return (lv_text_decor_t)v.num; +} + +/** + * Get how to align the lines of the text. Note that it doesn't align the Widget + * itself, only the lines inside the Widget. Possible values are + * `LV_TEXT_ALIGN_LEFT/CENTER/RIGHT/AUTO`. `LV_TEXT_ALIGN_AUTO` detect the text base + * direction and uses left or right alignment accordingly. + * Default: `LV_TEXT_ALIGN_AUTO`, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_text_align_t lv_obj_get_style_text_align(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_ALIGN); + return (lv_text_align_t)v.num; +} + +/** + * Gets the color of letter outline stroke. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_text_outline_stroke_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_OUTLINE_STROKE_COLOR); + return v.color; +} + +/** + * Gets the color of letter outline stroke. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_text_outline_stroke_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_OUTLINE_STROKE_COLOR)); + return v.color; +} + +/** + * Get the letter outline stroke width in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_text_outline_stroke_width(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_OUTLINE_STROKE_WIDTH); + return (int32_t)v.num; +} + +/** + * Get the opacity of the letter outline stroke. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means + * fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_text_outline_stroke_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TEXT_OUTLINE_STROKE_OPA); + return (lv_opa_t)v.num; +} + +/** + * Gets the intensity of blurring. Applied on each lv_part separately before the + * children are rendered. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_blur_radius(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BLUR_RADIUS); + return (int32_t)v.num; +} + +/** + * If `true` the background of the widget will be blurred. The part should have < 100% + * opacity to make it visible. If `false` the given part will be blurred when it's + * rendered but before drawing the children. + * Default: `false`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline bool lv_obj_get_style_blur_backdrop(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BLUR_BACKDROP); + return (bool)v.num; +} + +/** + * Setting to `LV_BLUR_QUALITY_SPEED` the blurring algorithm will prefer speed over + * quality. `LV_BLUR_QUALITY_PRECISION` will force using higher quality but slower + * blur. With `LV_BLUR_QUALITY_AUTO` the quality will be selected automatically. + * Default: `LV_BLUR_QUALITY_AUTO`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_blur_quality_t lv_obj_get_style_blur_quality(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BLUR_QUALITY); + return (lv_blur_quality_t)v.num; +} + +/** + * Gets the intensity of blurring. Applied on each lv_part separately before the + * children are rendered. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_drop_shadow_radius(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_DROP_SHADOW_RADIUS); + return (int32_t)v.num; +} + +/** + * Get an offset on the shadow in pixels in X direction. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_drop_shadow_offset_x(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_DROP_SHADOW_OFFSET_X); + return (int32_t)v.num; +} + +/** + * Get an offset on the shadow in pixels in Y direction. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_drop_shadow_offset_y(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_DROP_SHADOW_OFFSET_Y); + return (int32_t)v.num; +} + +/** + * Get the color of the shadow. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_drop_shadow_color(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_DROP_SHADOW_COLOR); + return v.color; +} + +/** + * Get the color of the shadow. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_drop_shadow_color_filtered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_DROP_SHADOW_COLOR)); + return v.color; +} + +/** + * Get the opacity of the shadow. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_drop_shadow_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_DROP_SHADOW_OPA); + return (lv_opa_t)v.num; +} + +/** + * Setting to `LV_BLUR_QUALITY_SPEED` the blurring algorithm will prefer speed over + * quality. `LV_BLUR_QUALITY_PRECISION` will force using higher quality but slower + * blur. With `LV_BLUR_QUALITY_AUTO` the quality will be selected automatically. + * Default: `LV_BLUR_QUALITY_PRECISION`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_blur_quality_t lv_obj_get_style_drop_shadow_quality(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_DROP_SHADOW_QUALITY); + return (lv_blur_quality_t)v.num; +} + +/** + * Get radius on every corner. The value is interpreted in pixels (>= 0) or + * `LV_RADIUS_CIRCLE` for max radius. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_radius(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_RADIUS); + return (int32_t)v.num; +} + +/** + * Move start point of object (e.g. scale tick) radially. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_radial_offset(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_RADIAL_OFFSET); + return (int32_t)v.num; +} + +/** + * Enable clipping of content that overflows rounded corners of parent Widget. Can be + * `true` or `false`. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline bool lv_obj_get_style_clip_corner(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_CLIP_CORNER); + return (bool)v.num; +} + +/** + * Scale down all opacity values of the Widget by this factor. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means + * fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OPA); + return (lv_opa_t)v.num; +} + +/** + * First draw Widget on the layer, then scale down layer opacity factor. Value 0, + * `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or + * `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc + * means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_opa_layered(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_OPA_LAYERED); + return (lv_opa_t)v.num; +} + +/** + * Mix a color with all colors of the Widget. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_DSC); + return (const lv_color_filter_dsc_t *)v.ptr; +} + +/** + * The intensity of mixing of color filter. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_color_filter_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_OPA); + return (lv_opa_t)v.num; +} + +/** + * Get a color to mix to the obj. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_color_t lv_obj_get_style_recolor(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_RECOLOR); + return v.color; +} + +/** + * Gets the intensity of color mixing. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means + * fully transparent. A value of 255, `LV_OPA_100` or `LV_OPA_COVER` means fully + * opaque. Intermediate values like LV_OPA_10, LV_OPA_20, etc result in + * semi-transparency. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_opa_t lv_obj_get_style_recolor_opa(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_RECOLOR_OPA); + return (lv_opa_t)v.num; +} + +/** + * Animation template for Widget's animation. Should be a pointer to `lv_anim_t`. The + * animation parameters are widget specific, e.g. animation time could be the E.g. + * blink time of the cursor on the Text Area or scroll time of a roller. See Widgets' + * documentation to learn more. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const lv_anim_t * lv_obj_get_style_anim(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM); + return (const lv_anim_t *)v.ptr; +} + +/** + * Animation duration in milliseconds. Its meaning is widget specific. E.g. blink time + * of the cursor on the Text Area or scroll time of a roller. See Widgets' + * documentation to learn more. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline uint32_t lv_obj_get_style_anim_duration(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ANIM_DURATION); + return (uint32_t)v.num; +} + +/** + * An initialized ``lv_style_transition_dsc_t`` to describe a transition. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const lv_style_transition_dsc_t * lv_obj_get_style_transition(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_TRANSITION); + return (const lv_style_transition_dsc_t *)v.ptr; +} + +/** + * Describes how to blend the colors to the background. Possible values are + * `LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE/MULTIPLY/DIFFERENCE`. + * Default: `LV_BLEND_MODE_NORMAL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_blend_mode_t lv_obj_get_style_blend_mode(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BLEND_MODE); + return (lv_blend_mode_t)v.num; +} + +/** + * Get layout of Widget. Children will be repositioned and resized according to + * policies set for the layout. For possible values see documentation of the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline uint16_t lv_obj_get_style_layout(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_LAYOUT); + return (uint16_t)v.num; +} + +/** + * Get base direction of Widget. Possible values are `LV_BIDI_DIR_LTR/RTL/AUTO`. + * Default: `LV_BASE_DIR_AUTO`, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_base_dir_t lv_obj_get_style_base_dir(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BASE_DIR); + return (lv_base_dir_t)v.num; +} + +/** + * If set, a layer will be created for the widget and the layer will be masked with + * this A8 bitmap mask. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const void * lv_obj_get_style_bitmap_mask_src(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BITMAP_MASK_SRC); + return (const void *)v.ptr; +} + +/** + * Adjust sensitivity for rotary encoders in 1/256 unit. It means, 128: slow down the + * rotary to half, 512: speeds up to double, 256: no change. + * Default: `256`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline uint32_t lv_obj_get_style_rotary_sensitivity(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ROTARY_SENSITIVITY); + return (uint32_t)v.num; +} + +#if LV_USE_FLEX +/** + * Defines in which direction the flex layout should arrange the children. + * Default: `LV_FLEX_FLOW_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_flex_flow_t lv_obj_get_style_flex_flow(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_FLOW); + return (lv_flex_flow_t)v.num; +} + +/** + * Defines how to align the children in the direction of flex flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_flex_align_t lv_obj_get_style_flex_main_place(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_MAIN_PLACE); + return (lv_flex_align_t)v.num; +} + +/** + * Defines how to align the children perpendicular to the direction of flex flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_flex_align_t lv_obj_get_style_flex_cross_place(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_CROSS_PLACE); + return (lv_flex_align_t)v.num; +} + +/** + * Defines how to align the tracks of the flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_flex_align_t lv_obj_get_style_flex_track_place(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_TRACK_PLACE); + return (lv_flex_align_t)v.num; +} + +/** + * Defines how much space to take proportionally from the free space of the Widget's track. + * Default: `0`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline uint8_t lv_obj_get_style_flex_grow(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_GROW); + return (uint8_t)v.num; +} + +#endif /* LV_USE_FLEX */ + +#if LV_USE_GRID +/** + * An array to describe the columns of the grid. Should be LV_GRID_TEMPLATE_LAST terminated. + * Default: `NULL`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const int32_t * lv_obj_get_style_grid_column_dsc_array(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_COLUMN_DSC_ARRAY); + return (const int32_t *)v.ptr; +} + +/** + * Defines how to distribute the columns. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_grid_align_t lv_obj_get_style_grid_column_align(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_COLUMN_ALIGN); + return (lv_grid_align_t)v.num; +} + +/** + * An array to describe the rows of the grid. Should be LV_GRID_TEMPLATE_LAST terminated. + * Default: `NULL`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline const int32_t * lv_obj_get_style_grid_row_dsc_array(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_ROW_DSC_ARRAY); + return (const int32_t *)v.ptr; +} + +/** + * Defines how to distribute the rows. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_grid_align_t lv_obj_get_style_grid_row_align(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_ROW_ALIGN); + return (lv_grid_align_t)v.num; +} + +/** + * Get column in which Widget should be placed. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_grid_cell_column_pos(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_COLUMN_POS); + return (int32_t)v.num; +} + +/** + * Get how to align Widget horizontally. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_grid_align_t lv_obj_get_style_grid_cell_x_align(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_X_ALIGN); + return (lv_grid_align_t)v.num; +} + +/** + * Get how many columns Widget should span. Needs to be >= 1. + * Default: 1, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_grid_cell_column_span(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_COLUMN_SPAN); + return (int32_t)v.num; +} + +/** + * Get row in which Widget should be placed. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_grid_cell_row_pos(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_ROW_POS); + return (int32_t)v.num; +} + +/** + * Get how to align Widget vertically. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline lv_grid_align_t lv_obj_get_style_grid_cell_y_align(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_Y_ALIGN); + return (lv_grid_align_t)v.num; +} + +/** + * Get how many rows Widget should span. Needs to be >= 1. + * Default: 1, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param part One of the `LV_PART_...` enum values + */ +static inline int32_t lv_obj_get_style_grid_cell_row_span(const lv_obj_t * obj, lv_part_t part) +{ + lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_CELL_ROW_SPAN); + return (int32_t)v.num; +} + +#endif /* LV_USE_GRID */ + +/** + * Sets width of Widget. Pixel, percentage and `LV_SIZE_CONTENT` values can be used. + * Percentage values are relative to the width of the parent's content area. + * Default: Widget dependent, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets a minimal width. Pixel and percentage values can be used. Percentage values + * are relative to the width of the parent's content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_min_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets a maximal width. Pixel and percentage values can be used. Percentage values + * are relative to the width of the parent's content area. + * Default: LV_COORD_MAX, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_max_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets height of Widget. Pixel, percentage and `LV_SIZE_CONTENT` can be used. + * Percentage values are relative to the height of the parent's content area. + * Default: Widget dependent, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets a minimal height. Pixel and percentage values can be used. Percentage values + * are relative to the height of the parent's content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_min_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets a maximal height. Pixel and percentage values can be used. Percentage values + * are relative to the height of the parent's content area. + * Default: LV_COORD_MAX, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_max_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Its meaning depends on the type of Widget. For example in case of lv_scale it means + * the length of the ticks. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_length(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set X coordinate of Widget considering the ``align`` setting. Pixel and percentage + * values can be used. Percentage values are relative to the width of the parent's + * content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set Y coordinate of Widget considering the ``align`` setting. Pixel and percentage + * values can be used. Percentage values are relative to the height of the parent's + * content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set the alignment which tells from which point of the parent the X and Y + * coordinates should be interpreted. Possible values are: `LV_ALIGN_DEFAULT`, + * `LV_ALIGN_TOP_LEFT/MID/RIGHT`, `LV_ALIGN_BOTTOM_LEFT/MID/RIGHT`, + * `LV_ALIGN_LEFT/RIGHT_MID`, `LV_ALIGN_CENTER`. `LV_ALIGN_DEFAULT` means + * `LV_ALIGN_TOP_LEFT` with LTR base direction and `LV_ALIGN_TOP_RIGHT` with RTL base + * direction. + * Default: `LV_ALIGN_DEFAULT`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_align(lv_obj_t * obj, lv_align_t value, lv_style_selector_t selector); + +/** + * Make Widget wider on both sides with this value. Pixel and percentage (with + * `lv_pct(x)`) values can be used. Percentage values are relative to Widget's width. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transform_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Make Widget higher on both sides with this value. Pixel and percentage (with + * `lv_pct(x)`) values can be used. Percentage values are relative to Widget's height. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transform_height(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Move Widget with this value in X direction. Applied after layouts, aligns and other + * positioning. Pixel and percentage (with `lv_pct(x)`) values can be used. Percentage + * values are relative to Widget's width. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_translate_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Move Widget with this value in Y direction. Applied after layouts, aligns and other + * positioning. Pixel and percentage (with `lv_pct(x)`) values can be used. Percentage + * values are relative to Widget's height. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_translate_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Move object around the centre of the parent object (e.g. around the circumference + * of a scale). + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_translate_radial(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Zoom Widget horizontally. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 + * half size, 512 double size, and so on. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transform_scale_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Zoom Widget vertically. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 + * half size, 512 double size, and so on. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transform_scale_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Rotate Widget. The value is interpreted in 0.1 degree units. E.g. 450 means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transform_rotation(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set pivot point's X coordinate for transformations. Relative to Widget's top left corner. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transform_pivot_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set pivot point's Y coordinate for transformations. Relative to Widget's top left corner. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transform_pivot_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Skew Widget horizontally. The value is interpreted in 0.1 degree units. E.g. 450 + * means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transform_skew_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Skew Widget vertically. The value is interpreted in 0.1 degree units. E.g. 450 + * means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transform_skew_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets the padding on the top. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_pad_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets the padding on the bottom. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_pad_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets the padding on the left. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_pad_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets the padding on the right. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_pad_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets the padding between the rows. Used by the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_pad_row(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets the padding between the columns. Used by the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_pad_column(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Pad text labels away from the scale ticks/remainder of the ``LV_PART_``. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_pad_radial(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets margin on the top. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_margin_top(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets margin on the bottom. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_margin_bottom(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets margin on the left. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_margin_left(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Sets margin on the right. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_margin_right(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set background color of Widget. + * Default: `0xffffff`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set opacity of the background. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set gradient color of the background. Used only if `grad_dir` is not `LV_GRAD_DIR_NONE`. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_grad_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set direction of the gradient of the background. Possible values are + * `LV_GRAD_DIR_NONE/HOR/VER`. + * Default: `LV_GRAD_DIR_NONE`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_grad_dir(lv_obj_t * obj, lv_grad_dir_t value, lv_style_selector_t selector); + +/** + * Set point from which background color should start for gradients. 0 means to + * top/left side, 255 the bottom/right side, 128 the center, and so on. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_main_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set point from which background's gradient color should start. 0 means to top/left + * side, 255 the bottom/right side, 128 the center, and so on. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_grad_stop(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set opacity of the first gradient color. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_main_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set opacity of the second gradient color. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_grad_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set gradient definition. The pointed instance must exist while Widget is alive. + * NULL to disable. It wraps `BG_GRAD_COLOR`, `BG_GRAD_DIR`, `BG_MAIN_STOP` and + * `BG_GRAD_STOP` into one descriptor and allows creating gradients with more colors + * as well. If it's set other gradient related properties will be ignored. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to gradient descriptor + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_grad(lv_obj_t * obj, const lv_grad_dsc_t * value, lv_style_selector_t selector); + +/** + * Set a background image. Can be a pointer to `lv_image_dsc_t`, a path to a file or + * an `LV_SYMBOL_...`. + * Default: `NULL`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Pointer to image source + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector); + +/** + * Set opacity of the background image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means + * fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other + * values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set a color to mix to the background image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set intensity of background image recoloring. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means no mixing, 255, `LV_OPA_100` or `LV_OPA_COVER` means full + * recoloring, other values or LV_OPA_10, LV_OPA_20, etc are interpreted + * proportionally. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * If enabled the background image will be tiled. Possible values are `true` or `false`. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bg_image_tiled(lv_obj_t * obj, bool value, lv_style_selector_t selector); + +/** + * Set color of the border. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_border_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set opacity of the border. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_border_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set width of the border. Only pixel values can be used. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_border_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set only which side(s) the border should be drawn. Possible values are + * `LV_BORDER_SIDE_NONE/TOP/BOTTOM/LEFT/RIGHT/INTERNAL`. OR-ed values can be used as + * well, e.g. `LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_LEFT`. + * Default: `LV_BORDER_SIDE_FULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_border_side(lv_obj_t * obj, lv_border_side_t value, lv_style_selector_t selector); + +/** + * Sets whether the border should be drawn before or after the children are drawn. + * `true`: after children, `false`: before children. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_border_post(lv_obj_t * obj, bool value, lv_style_selector_t selector); + +/** + * Set width of outline in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_outline_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set color of outline. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_outline_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set opacity of outline. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_outline_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set padding of outline, i.e. the gap between Widget and the outline. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_outline_pad(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set width of the shadow in pixels. The value should be >= 0. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_shadow_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set an offset on the shadow in pixels in X direction. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_shadow_offset_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set an offset on the shadow in pixels in Y direction. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_shadow_offset_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Make shadow calculation to use a larger or smaller rectangle as base. The value can + * be in pixels to make the area larger/smaller. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_shadow_spread(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set color of shadow. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_shadow_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set opacity of shadow. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_shadow_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set opacity of an image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_image_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set color to mix with the image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_image_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set intensity of color mixing. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_image_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set image colorkey definition. The lv_image_colorkey_t contains two color values: + * `high_color` and `low_color`. the color of pixels ranging from `low_color` to + * `high_color` will be transparent. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to image color key + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_image_colorkey(lv_obj_t * obj, const lv_image_colorkey_t * value, lv_style_selector_t selector); + +/** + * Set width of lines in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_line_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set width of dashes in pixels. Note that dash works only on horizontal and vertical lines. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_line_dash_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set gap between dashes in pixels. Note that dash works only on horizontal and + * vertical lines. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_line_dash_gap(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Make end points of the lines rounded. `true`: rounded, `false`: perpendicular line ending. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_line_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector); + +/** + * Set color of lines. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_line_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set opacity of lines. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_line_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set width (thickness) of arcs in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_arc_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Make end points of arcs rounded. `true`: rounded, `false`: perpendicular line ending. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_arc_rounded(lv_obj_t * obj, bool value, lv_style_selector_t selector); + +/** + * Set color of arc. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_arc_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set opacity of arcs. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_arc_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set an image from which arc will be masked out. It's useful to display complex + * effects on the arcs. Can be a pointer to `lv_image_dsc_t` or a path to a file. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to image source + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_arc_image_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector); + +/** + * Sets color of text. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set opacity of text. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set font of text (a pointer `lv_font_t *`). + * Default: `LV_FONT_DEFAULT`, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to font + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_font(lv_obj_t * obj, const lv_font_t * value, lv_style_selector_t selector); + +/** + * Set letter space in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_letter_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set line space in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_line_space(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set decoration for the text. Possible values are + * `LV_TEXT_DECOR_NONE/UNDERLINE/STRIKETHROUGH`. OR-ed values can be used as well. + * Default: `LV_TEXT_DECOR_NONE`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_decor(lv_obj_t * obj, lv_text_decor_t value, lv_style_selector_t selector); + +/** + * Set how to align the lines of the text. Note that it doesn't align the Widget + * itself, only the lines inside the Widget. Possible values are + * `LV_TEXT_ALIGN_LEFT/CENTER/RIGHT/AUTO`. `LV_TEXT_ALIGN_AUTO` detect the text base + * direction and uses left or right alignment accordingly. + * Default: `LV_TEXT_ALIGN_AUTO`, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_align(lv_obj_t * obj, lv_text_align_t value, lv_style_selector_t selector); + +/** + * Sets the color of letter outline stroke. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_outline_stroke_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set the letter outline stroke width in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_outline_stroke_width(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set the opacity of the letter outline stroke. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means + * fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_text_outline_stroke_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Sets the intensity of blurring. Applied on each lv_part separately before the + * children are rendered. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_blur_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * If `true` the background of the widget will be blurred. The part should have < 100% + * opacity to make it visible. If `false` the given part will be blurred when it's + * rendered but before drawing the children. + * Default: `false`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_blur_backdrop(lv_obj_t * obj, bool value, lv_style_selector_t selector); + +/** + * Setting to `LV_BLUR_QUALITY_SPEED` the blurring algorithm will prefer speed over + * quality. `LV_BLUR_QUALITY_PRECISION` will force using higher quality but slower + * blur. With `LV_BLUR_QUALITY_AUTO` the quality will be selected automatically. + * Default: `LV_BLUR_QUALITY_AUTO`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_blur_quality(lv_obj_t * obj, lv_blur_quality_t value, lv_style_selector_t selector); + +/** + * Sets the intensity of blurring. Applied on each lv_part separately before the + * children are rendered. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_drop_shadow_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set an offset on the shadow in pixels in X direction. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_drop_shadow_offset_x(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set an offset on the shadow in pixels in Y direction. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_drop_shadow_offset_y(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set the color of the shadow. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_drop_shadow_color(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Set the opacity of the shadow. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_drop_shadow_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Setting to `LV_BLUR_QUALITY_SPEED` the blurring algorithm will prefer speed over + * quality. `LV_BLUR_QUALITY_PRECISION` will force using higher quality but slower + * blur. With `LV_BLUR_QUALITY_AUTO` the quality will be selected automatically. + * Default: `LV_BLUR_QUALITY_PRECISION`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_drop_shadow_quality(lv_obj_t * obj, lv_blur_quality_t value, lv_style_selector_t selector); + +/** + * Set radius on every corner. The value is interpreted in pixels (>= 0) or + * `LV_RADIUS_CIRCLE` for max radius. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Move start point of object (e.g. scale tick) radially. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_radial_offset(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Enable clipping of content that overflows rounded corners of parent Widget. Can be + * `true` or `false`. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_clip_corner(lv_obj_t * obj, bool value, lv_style_selector_t selector); + +/** + * Scale down all opacity values of the Widget by this factor. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means + * fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * First draw Widget on the layer, then scale down layer opacity factor. Value 0, + * `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or + * `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc + * means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_opa_layered(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Mix a color with all colors of the Widget. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to color-filter descriptor + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector); + +/** + * The intensity of mixing of color filter. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_color_filter_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Set a color to mix to the obj. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Color to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_recolor(lv_obj_t * obj, lv_color_t value, lv_style_selector_t selector); + +/** + * Sets the intensity of color mixing. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means + * fully transparent. A value of 255, `LV_OPA_100` or `LV_OPA_COVER` means fully + * opaque. Intermediate values like LV_OPA_10, LV_OPA_20, etc result in + * semi-transparency. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_recolor_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector); + +/** + * Animation template for Widget's animation. Should be a pointer to `lv_anim_t`. The + * animation parameters are widget specific, e.g. animation time could be the E.g. + * blink time of the cursor on the Text Area or scroll time of a roller. See Widgets' + * documentation to learn more. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to animation descriptor + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_anim(lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector); + +/** + * Animation duration in milliseconds. Its meaning is widget specific. E.g. blink time + * of the cursor on the Text Area or scroll time of a roller. See Widgets' + * documentation to learn more. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_anim_duration(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); + +/** + * An initialized ``lv_style_transition_dsc_t`` to describe a transition. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to transition descriptor + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_transition(lv_obj_t * obj, const lv_style_transition_dsc_t * value, lv_style_selector_t selector); + +/** + * Describes how to blend the colors to the background. Possible values are + * `LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE/MULTIPLY/DIFFERENCE`. + * Default: `LV_BLEND_MODE_NORMAL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_blend_mode(lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector); + +/** + * Set layout of Widget. Children will be repositioned and resized according to + * policies set for the layout. For possible values see documentation of the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_layout(lv_obj_t * obj, uint16_t value, lv_style_selector_t selector); + +/** + * Set base direction of Widget. Possible values are `LV_BIDI_DIR_LTR/RTL/AUTO`. + * Default: `LV_BASE_DIR_AUTO`, inherited: Yes, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_base_dir(lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector); + +/** + * If set, a layer will be created for the widget and the layer will be masked with + * this A8 bitmap mask. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to A8 bitmap mask + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_bitmap_mask_src(lv_obj_t * obj, const void * value, lv_style_selector_t selector); + +/** + * Adjust sensitivity for rotary encoders in 1/256 unit. It means, 128: slow down the + * rotary to half, 512: speeds up to double, 256: no change. + * Default: `256`, inherited: Yes, layout: No, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_rotary_sensitivity(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector); + +#if LV_USE_FLEX +/** + * Defines in which direction the flex layout should arrange the children. + * Default: `LV_FLEX_FLOW_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector); + +/** + * Defines how to align the children in the direction of flex flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); + +/** + * Defines how to align the children perpendicular to the direction of flex flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); + +/** + * Defines how to align the tracks of the flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector); + +/** + * Defines how much space to take proportionally from the free space of the Widget's track. + * Default: `0`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector); + +#endif /* LV_USE_FLEX */ + +#if LV_USE_GRID +/** + * An array to describe the columns of the grid. Should be LV_GRID_TEMPLATE_LAST terminated. + * Default: `NULL`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to grid-column descriptor array + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector); + +/** + * Defines how to distribute the columns. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); + +/** + * An array to describe the rows of the grid. Should be LV_GRID_TEMPLATE_LAST terminated. + * Default: `NULL`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Pointer to grid-row descriptor array + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector); + +/** + * Defines how to distribute the rows. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); + +/** + * Set column in which Widget should be placed. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set how to align Widget horizontally. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); + +/** + * Set how many columns Widget should span. Needs to be >= 1. + * Default: 1, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set row in which Widget should be placed. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +/** + * Set how to align Widget vertically. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector); + +/** + * Set how many rows Widget should span. Needs to be >= 1. + * Default: 1, inherited: No, layout: Yes, ext. draw: No. + * @param obj Pointer to Widget + * @param value Value to submit + * @param selector A joint type for `lv_part_t` and `lv_state_t`. Example values: + * - `0`: means `LV_PART_MAIN | LV_STATE_DEFAULT` + * - `LV_STATE_PRESSED` + * - `LV_PART_KNOB` + * - `LV_PART_KNOB | LV_STATE_PRESSED | LV_STATE_CHECKED` + */ +void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector); + +#endif /* LV_USE_GRID */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_OBJ_STYLE_GEN_H */ diff --git a/inc/lvgl/src/core/lv_obj_style_private.h b/inc/lvgl/src/core/lv_obj_style_private.h new file mode 100644 index 0000000..59eeb72 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_style_private.h @@ -0,0 +1,97 @@ +/** + * @file lv_obj_style_private.h + * + */ + +#ifndef LV_OBJ_STYLE_PRIVATE_H +#define LV_OBJ_STYLE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_obj_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_obj_style_t { + const lv_style_t * style; + uint32_t selector : 24; + uint32_t is_local : 1; + uint32_t is_trans : 1; + uint32_t is_disabled : 1; + uint32_t is_theme : 1; /**< The style is added by a theme */ +}; + +struct _lv_obj_style_transition_dsc_t { + uint16_t time; + uint16_t delay; + lv_style_selector_t selector; + lv_style_prop_t prop; + lv_anim_path_cb_t path_cb; + void * user_data; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the object related style manager module. + * Called by LVGL in `lv_init()` + */ +void lv_obj_style_init(void); + +/** + * Deinitialize the object related style manager module. + * Called by LVGL in `lv_deinit()` + */ +void lv_obj_style_deinit(void); + +/** + * Used internally to create a style transition + * @param obj + * @param part + * @param prev_state + * @param new_state + * @param tr + */ +void lv_obj_style_create_transition(lv_obj_t * obj, lv_part_t part, lv_state_t prev_state, + lv_state_t new_state, const lv_obj_style_transition_dsc_t * tr); + +/** + * Used internally to compare the appearance of an object in 2 states + * @param obj + * @param state1 + * @param state2 + * @return + */ +lv_style_state_cmp_t lv_obj_style_state_compare(lv_obj_t * obj, lv_state_t state1, lv_state_t state2); + +/** + * Update the layer type of a widget bayed on its current styles. + * The result will be stored in `obj->spec_attr->layer_type` + * @param obj the object whose layer should be updated + */ +void lv_obj_update_layer_type(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_STYLE_PRIVATE_H*/ diff --git a/inc/lvgl/src/core/lv_obj_tree.c b/inc/lvgl/src/core/lv_obj_tree.c new file mode 100644 index 0000000..2dc7a02 --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_tree.c @@ -0,0 +1,854 @@ +/** + * @file lv_obj_tree.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj_private.h" +#include "lv_obj_class_private.h" +#include "../indev/lv_indev.h" +#include "../indev/lv_indev_private.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../misc/lv_anim_private.h" +#include "../misc/lv_async.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_obj_class) +#define disp_ll_p &(LV_GLOBAL_DEFAULT()->disp_ll) + +#define OBJ_DUMP_STRING_LEN 128 +#define LV_OBJ_NAME_MAX_LEN 128 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_obj_delete_async_cb(void * obj); +static void obj_delete_core(lv_obj_t * obj); +static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data); +static void dump_tree_core(lv_obj_t * obj, int32_t depth); +static lv_obj_t * lv_obj_get_first_not_deleting_child(lv_obj_t * obj); +#if LV_USE_OBJ_NAME + static lv_obj_t * find_by_name_direct(const lv_obj_t * parent, const char * name, size_t len); +#endif /*LV_USE_OBJ_NAME*/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_obj_delete(lv_obj_t * obj) +{ + if(obj->is_deleting) + return; + + LV_LOG_TRACE("begin (delete %p)", (void *)obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_invalidate(obj); + + lv_obj_t * par = lv_obj_get_parent(obj); + + lv_display_t * disp = NULL; + bool act_screen_del = false; + if(par == NULL) { + disp = lv_obj_get_display(obj); + if(!disp) return; /*Shouldn't happen*/ + if(disp->act_scr == obj) act_screen_del = true; + } + + obj_delete_core(obj); + + /*Call the ancestor's event handler to the parent to notify it about the child delete*/ + if(par && !par->is_deleting) { + lv_obj_scrollbar_invalidate(par); + lv_obj_send_event(par, LV_EVENT_CHILD_CHANGED, NULL); + lv_obj_send_event(par, LV_EVENT_CHILD_DELETED, NULL); + } + + /*Handle if the active screen was deleted*/ + if(act_screen_del) { + LV_LOG_WARN("the active screen was deleted"); + disp->act_scr = NULL; + } + + LV_ASSERT_MEM_INTEGRITY(); + LV_LOG_TRACE("finished (delete %p)", (void *)obj); +} + +void lv_obj_clean(lv_obj_t * obj) +{ + LV_LOG_TRACE("begin (clean %p)", (void *)obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_invalidate(obj); + + uint32_t cnt = lv_obj_get_child_count(obj); + lv_obj_t * child = lv_obj_get_first_not_deleting_child(obj); + while(child) { + obj_delete_core(child); + child = lv_obj_get_first_not_deleting_child(obj); + } + /*Just to remove scroll animations if any*/ + lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); + if(obj->spec_attr) { + obj->spec_attr->scroll.x = 0; + obj->spec_attr->scroll.y = 0; + } + + if(lv_obj_get_child_count(obj) < cnt) { + lv_obj_send_event(obj, LV_EVENT_CHILD_CHANGED, NULL); + lv_obj_send_event(obj, LV_EVENT_CHILD_DELETED, NULL); + } + + LV_ASSERT_MEM_INTEGRITY(); + + LV_LOG_TRACE("finished (clean %p)", (void *)obj); +} + +void lv_obj_delete_delayed(lv_obj_t * obj, uint32_t delay_ms) +{ + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_exec_cb(&a, NULL); + lv_anim_set_duration(&a, 1); + lv_anim_set_delay(&a, delay_ms); + lv_anim_set_completed_cb(&a, lv_obj_delete_anim_completed_cb); + lv_anim_start(&a); +} + +void lv_obj_delete_anim_completed_cb(lv_anim_t * a) +{ + lv_obj_delete(a->var); +} + +void lv_obj_delete_async(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_async_call(lv_obj_delete_async_cb, obj); +} + +void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_OBJ(parent, MY_CLASS); + + if(obj->parent == NULL) { + LV_LOG_WARN("Can't set the parent of a screen"); + return; + } + + if(parent == NULL) { + LV_LOG_WARN("Can't set parent == NULL to an object"); + return; + } + + if(parent == obj->parent) { + return; + } + + lv_obj_invalidate(obj); + + lv_obj_allocate_spec_attr(parent); + + lv_obj_t * old_parent = obj->parent; + /*Remove the object from the old parent's child list*/ + int32_t i; + for(i = lv_obj_get_index(obj); i <= (int32_t)lv_obj_get_child_count(old_parent) - 2; i++) { + old_parent->spec_attr->children[i] = old_parent->spec_attr->children[i + 1]; + } + old_parent->spec_attr->child_cnt--; + if(old_parent->spec_attr->child_cnt) { + old_parent->spec_attr->children = lv_realloc(old_parent->spec_attr->children, + old_parent->spec_attr->child_cnt * (sizeof(lv_obj_t *))); + } + else { + lv_free(old_parent->spec_attr->children); + old_parent->spec_attr->children = NULL; + } + + /*Add the child to the new parent as the last (newest child)*/ + parent->spec_attr->child_cnt++; + parent->spec_attr->children = lv_realloc(parent->spec_attr->children, + parent->spec_attr->child_cnt * (sizeof(lv_obj_t *))); + parent->spec_attr->children[lv_obj_get_child_count(parent) - 1] = obj; + + obj->parent = parent; + + /*Notify the original parent because one of its children is lost*/ + lv_obj_scrollbar_invalidate(old_parent); + lv_obj_send_event(old_parent, LV_EVENT_CHILD_CHANGED, obj); + lv_obj_send_event(old_parent, LV_EVENT_CHILD_DELETED, NULL); + + /*Notify the new parent about the child*/ + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj); + lv_obj_send_event(parent, LV_EVENT_CHILD_CREATED, NULL); + + lv_obj_mark_layout_as_dirty(obj); + + lv_obj_invalidate(obj); +} + +void lv_obj_move_to_index(lv_obj_t * obj, int32_t index) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /* Check parent validity */ + lv_obj_t * parent = lv_obj_get_parent(obj); + if(!parent) { + LV_LOG_WARN("parent is NULL"); + return; + } + + const uint32_t parent_child_count = lv_obj_get_child_count(parent); + /* old_index only can be 0 or greater, this point cannot be reached if the parent is not null */ + const int32_t old_index = lv_obj_get_index(obj); + LV_ASSERT(0 <= old_index); + + if(index < 0) { + index += parent_child_count; + } + + /* Index was negative and the absolute value is greater than parent child count */ + if((index < 0) + /* Index is same or bigger than parent child count */ + || (index >= (int32_t) parent_child_count) + /* If both previous and new index are the same */ + || (index == old_index)) { + + return; + } + + int32_t i = old_index; + if(index < old_index) { + while(i > index) { + parent->spec_attr->children[i] = parent->spec_attr->children[i - 1]; + i--; + } + } + else { + while(i < index) { + parent->spec_attr->children[i] = parent->spec_attr->children[i + 1]; + i++; + } + } + + parent->spec_attr->children[index] = obj; + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, NULL); + lv_obj_invalidate(parent); +} + +void lv_obj_swap(lv_obj_t * obj1, lv_obj_t * obj2) +{ + LV_ASSERT_OBJ(obj1, MY_CLASS); + LV_ASSERT_OBJ(obj2, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj1); + lv_obj_t * parent2 = lv_obj_get_parent(obj2); + + uint_fast32_t index1 = lv_obj_get_index(obj1); + uint_fast32_t index2 = lv_obj_get_index(obj2); + + lv_obj_send_event(parent2, LV_EVENT_CHILD_DELETED, obj2); + lv_obj_send_event(parent, LV_EVENT_CHILD_DELETED, obj1); + + parent->spec_attr->children[index1] = obj2; + obj2->parent = parent; + + parent2->spec_attr->children[index2] = obj1; + obj1->parent = parent2; + + lv_obj_send_event(parent, LV_EVENT_CHILD_CHANGED, obj2); + lv_obj_send_event(parent, LV_EVENT_CHILD_CREATED, obj2); + lv_obj_send_event(parent2, LV_EVENT_CHILD_CHANGED, obj1); + lv_obj_send_event(parent2, LV_EVENT_CHILD_CREATED, obj1); + + lv_obj_invalidate(parent); + + if(parent != parent2) { + lv_obj_invalidate(parent2); + } + lv_group_swap_obj(obj1, obj2); +} + +lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_obj_t * par = obj; + const lv_obj_t * act_par; + + do { + act_par = par; + par = lv_obj_get_parent(act_par); + } while(par != NULL); + + return (lv_obj_t *)act_par; +} + +lv_display_t * lv_obj_get_display(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_obj_t * scr; + + if(obj->parent == NULL) scr = obj; /*`obj` is a screen*/ + else scr = lv_obj_get_screen(obj); /*get the screen of `obj`*/ + + lv_display_t * d; + lv_ll_t * disp_head = disp_ll_p; + LV_LL_READ(disp_head, d) { + uint32_t i; + for(i = 0; i < d->screen_cnt; i++) { + if(d->screens[i] == scr) return d; + } + } + + LV_LOG_WARN("No screen found"); + return NULL; +} + +lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj) +{ + if(obj == NULL) return NULL; + LV_ASSERT_OBJ(obj, MY_CLASS); + + return obj->parent; +} + +lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, int32_t idx) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) return NULL; + + uint32_t idu; + if(idx < 0) { + idx = obj->spec_attr->child_cnt + idx; + if(idx < 0) return NULL; + idu = (uint32_t) idx; + } + else { + idu = idx; + } + + if(idu >= obj->spec_attr->child_cnt) return NULL; + else return obj->spec_attr->children[idx]; +} + +lv_obj_t * lv_obj_get_child_by_type(const lv_obj_t * obj, int32_t idx, const lv_obj_class_t * class_p) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) return NULL; + + int32_t i; + int32_t cnt = (int32_t)obj->spec_attr->child_cnt; + if(idx >= 0) { + for(i = 0; i < cnt; i++) { + if(obj->spec_attr->children[i]->class_p == class_p) { + if(idx == 0) return obj->spec_attr->children[i]; + else idx--; + } + } + } + else { + idx++; /*-1 means the first child*/ + for(i = cnt - 1; i >= 0; i--) { + if(obj->spec_attr->children[i]->class_p == class_p) { + if(idx == 0) return obj->spec_attr->children[i]; + else idx++; + } + } + } + return NULL; +} + +lv_obj_t * lv_obj_get_sibling(const lv_obj_t * obj, int32_t idx) +{ + lv_obj_t * parent = lv_obj_get_parent(obj); + int32_t sibling_idx = (int32_t)lv_obj_get_index(obj) + idx; + if(sibling_idx < 0) return NULL; + + return lv_obj_get_child(parent, sibling_idx); +} + +lv_obj_t * lv_obj_get_sibling_by_type(const lv_obj_t * obj, int32_t idx, const lv_obj_class_t * class_p) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj); + int32_t sibling_idx = (int32_t)lv_obj_get_index_by_type(obj, class_p) + idx; + if(sibling_idx < 0) return NULL; + + return lv_obj_get_child_by_type(parent, sibling_idx, class_p); +} + +uint32_t lv_obj_get_child_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return 0; + return obj->spec_attr->child_cnt; +} + +uint32_t lv_obj_get_child_count_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(obj->spec_attr == NULL) return 0; + + uint32_t i; + uint32_t cnt = 0; + for(i = 0; i < obj->spec_attr->child_cnt; i++) { + if(obj->spec_attr->children[i]->class_p == class_p) cnt++; + } + return cnt; +} + +#if LV_USE_OBJ_NAME + +void lv_obj_set_name(lv_obj_t * obj, const char * name) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_allocate_spec_attr(obj); + + if(!obj->spec_attr->name_static && obj->spec_attr->name) lv_free((void *)obj->spec_attr->name); + + if(name == NULL) { + obj->spec_attr->name = NULL; + obj->spec_attr->name_static = 1; + } + else { + obj->spec_attr->name = lv_strdup(name); + obj->spec_attr->name_static = 0; + } +} + +void lv_obj_set_name_static(lv_obj_t * obj, const char * name) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_allocate_spec_attr(obj); + + if(!obj->spec_attr->name_static && obj->spec_attr->name) lv_free((void *)obj->spec_attr->name); + + obj->spec_attr->name = name; + obj->spec_attr->name_static = 1; +} + +const char * lv_obj_get_name(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) return NULL; + else return obj->spec_attr->name; +} + +void lv_obj_get_name_resolved(const lv_obj_t * obj, char buf[], size_t buf_size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const char * name = lv_obj_get_name(obj); + /*Use a default name which auto-indexing*/ + char name_buf[LV_OBJ_NAME_MAX_LEN]; + if(name == NULL) { + lv_snprintf(name_buf, sizeof(name_buf), "%s_#", obj->class_p->name); + name = name_buf; + } + + size_t name_len = lv_strlen(name); + lv_obj_t * parent = lv_obj_get_parent(obj); + + /*If the last character is # automatically index the children with the same name start*/ + if(parent && name_len > 0 && name[name_len - 1] == '#') { + uint32_t child_cnt = lv_obj_get_child_count(parent); + uint32_t cnt = 0; + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(parent, i); + /*All siblings older siblings are checked, craft the name of this widget*/ + if(child == obj) { + char num_buf[8]; + size_t num_len; + num_len = lv_snprintf(num_buf, sizeof(num_buf), "%d", cnt); + /*Is there enough space for the name and the index?*/ + if(buf_size > name_len + num_len) { + /*E.g. buf = "some_name_", so trim the # from the end*/ + lv_strncpy(buf, name, name_len - 1); + lv_strcpy(&buf[name_len - 1], num_buf); + } + else { + /*Use the name as it is as a fallback*/ + lv_strlcpy(buf, obj->spec_attr->name, buf_size); + } + break; + } + /*Check the older siblings. IF they start with the same name count them*/ + else { + const char * child_name = lv_obj_get_name(child); + if(child_name == NULL) { + /*If the name we are looking for start with the child's class name + *increment the index. E.g. _#*/ + size_t class_name_len = lv_strlen(child->class_p->name); + if(name_len > 3 && class_name_len == name_len - 2 && + lv_strncmp(child->class_p->name, name, class_name_len) == 0) { + cnt++; + } + } + /*The name is set, check if it's e.g. #*/ + else { + if(lv_strcmp(child->spec_attr->name, name) == 0) { + cnt++; + } + } + } + } + } + else { + /*Just use the set name*/ + lv_strlcpy(buf, obj->spec_attr->name, buf_size); + } +} + +lv_obj_t * lv_obj_get_child_by_name(const lv_obj_t * parent, const char * path) +{ + LV_ASSERT_OBJ(parent, MY_CLASS); + + if(parent == NULL || parent->spec_attr == NULL || path == NULL) return NULL; + + while(*path) { + const char * segment = path; + uint32_t len = 0; + + /* Calculate the length of the current segment */ + while(path[len] && path[len] != '/') + len++; + + /* Look for a child whose resolved name exactly matches the segment */ + lv_obj_t * child = find_by_name_direct(parent, segment, len); + if(!child) return NULL; /*Segment not found*/ + + /* Advance to the next segment */ + path += len; + if(*path == '/') path++; /* Skip the '/' */ + + /* If there is no further segment, we've found the target child */ + if(*path == '\0') return child; + + parent = child; + } + + return NULL; + +} + +lv_obj_t * lv_obj_find_by_name(const lv_obj_t * parent, const char * name) +{ + if(parent == NULL) parent = lv_display_get_screen_active(NULL); + if(parent == NULL) return NULL; + + lv_obj_t * child = find_by_name_direct(parent, name, UINT16_MAX); + if(child) return child; + + /*Search children recursively*/ + uint32_t child_cnt = lv_obj_get_child_count(parent); + uint32_t i; + for(i = 0; i < child_cnt; i++) { + child = parent->spec_attr->children[i]; + lv_obj_t * found = lv_obj_find_by_name(child, name); + if(found != NULL) return found; + } + + return NULL; +} + +#endif /*LV_USE_OBJ_NAME*/ + +int32_t lv_obj_get_index(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return -1; + + int32_t i = 0; + for(i = 0; i < parent->spec_attr->child_cnt; i++) { + if(parent->spec_attr->children[i] == obj) return i; + } + + /*Shouldn't reach this point*/ + LV_ASSERT(0); + return -1; +} + +int32_t lv_obj_get_index_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent == NULL) return 0xFFFFFFFF; + + uint32_t i = 0; + uint32_t idx = 0; + for(i = 0; i < parent->spec_attr->child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + if(child->class_p == class_p) { + if(child == obj) return idx; + idx++; + } + } + + /*Can happen if there was no children with the given type*/ + return -1; +} + +void lv_obj_tree_walk(lv_obj_t * start_obj, lv_obj_tree_walk_cb_t cb, void * user_data) +{ + walk_core(start_obj, cb, user_data); +} + +void lv_obj_dump_tree(lv_obj_t * start_obj) +{ + if(start_obj == NULL) { + lv_display_t * disp = lv_display_get_next(NULL); + while(disp) { + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + dump_tree_core(disp->screens[i], 0); + } + disp = lv_display_get_next(disp); + } + } + else { + dump_tree_core(start_obj, 0); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_obj_delete_async_cb(void * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_delete(obj); +} + +static void obj_indev_reset(lv_indev_t * indev, lv_obj_t * obj) +{ + /* If the input device is already in the release state, + * there is no need to wait for the input device to be released + */ + if(lv_indev_get_state(indev) != LV_INDEV_STATE_RELEASED) { + /*Wait for release to avoid accidentally triggering other obj to be clicked*/ + lv_indev_wait_release(indev); + } + + /*Reset the input device*/ + lv_indev_reset(indev, obj); +} + +static void obj_delete_core(lv_obj_t * obj) +{ + if(obj->is_deleting) + return; + + obj->is_deleting = true; + + /*Let the user free the resources used in `LV_EVENT_DELETE`*/ + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_DELETE, NULL); + if(res == LV_RESULT_INVALID) { + obj->is_deleting = false; + return; + } + + /*Clean registered event_cb*/ + if(obj->spec_attr) lv_event_remove_all(&(obj->spec_attr->event_list)); + + /*Recursively delete the children*/ + lv_obj_t * child = lv_obj_get_child(obj, 0); + while(child) { + obj_delete_core(child); + child = lv_obj_get_child(obj, 0); + } + + lv_group_t * group = lv_obj_get_group(obj); + + /*Reset all input devices if the object to delete is used*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { + if(indev->pointer.act_obj == obj || indev->pointer.scroll_obj == obj) { + obj_indev_reset(indev, obj); + } + if(indev->pointer.last_pressed == obj) { + indev->pointer.last_pressed = NULL; + } + if(indev->pointer.last_hovered == obj) { + indev->pointer.last_hovered = NULL; + } + } + + if(indev->group == group && obj == lv_indev_get_active_obj()) { + obj_indev_reset(indev, obj); + } + indev = lv_indev_get_next(indev); + } + + /*Delete all pending async del-s*/ + lv_result_t async_cancel_res = LV_RESULT_OK; + while(async_cancel_res == LV_RESULT_OK) { + async_cancel_res = lv_async_call_cancel(lv_obj_delete_async_cb, obj); + } + + /*All children deleted. Now clean up the object specific data*/ + lv_obj_destruct(obj); + + /*Remove the screen for the screen list*/ + if(obj->parent == NULL) { + lv_display_t * disp = lv_obj_get_display(obj); + uint32_t i; + /*Find the screen in the list*/ + for(i = 0; i < disp->screen_cnt; i++) { + if(disp->screens[i] == obj) break; + } + + uint32_t id = i; + for(i = id; i < disp->screen_cnt - 1; i++) { + disp->screens[i] = disp->screens[i + 1]; + } + disp->screen_cnt--; + disp->screens = lv_realloc(disp->screens, disp->screen_cnt * sizeof(lv_obj_t *)); + } + /*Remove the object from the child list of its parent*/ + else { + int32_t id = lv_obj_get_index(obj); + uint16_t i; + for(i = id; i < obj->parent->spec_attr->child_cnt - 1; i++) { + obj->parent->spec_attr->children[i] = obj->parent->spec_attr->children[i + 1]; + } + obj->parent->spec_attr->child_cnt--; + obj->parent->spec_attr->children = lv_realloc(obj->parent->spec_attr->children, + obj->parent->spec_attr->child_cnt * sizeof(lv_obj_t *)); + } + + /*Free the object itself*/ + lv_free(obj); +} + +static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data) +{ + lv_obj_tree_walk_res_t res = LV_OBJ_TREE_WALK_NEXT; + + if(obj == NULL) { + lv_display_t * disp = lv_display_get_next(NULL); + while(disp) { + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + walk_core(disp->screens[i], cb, user_data); + } + disp = lv_display_get_next(disp); + } + return LV_OBJ_TREE_WALK_END; /*The value doesn't matter as it wasn't called recursively*/ + } + + res = cb(obj, user_data); + + if(res == LV_OBJ_TREE_WALK_END) return LV_OBJ_TREE_WALK_END; + + if(res != LV_OBJ_TREE_WALK_SKIP_CHILDREN) { + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(obj); i++) { + res = walk_core(lv_obj_get_child(obj, i), cb, user_data); + if(res == LV_OBJ_TREE_WALK_END) return LV_OBJ_TREE_WALK_END; + } + } + return LV_OBJ_TREE_WALK_NEXT; +} + +static void dump_tree_core(lv_obj_t * obj, int32_t depth) +{ +#if LV_USE_LOG + const char * id; + +#if LV_USE_OBJ_ID + char buf[OBJ_DUMP_STRING_LEN]; + id = lv_obj_stringify_id(obj, buf, sizeof(buf)); + if(id == NULL) id = "obj0"; +#else + id = "obj0"; +#endif + + /*id of `obj0` is an invalid id for builtin id*/ + LV_LOG_USER("%*sobj:%p, id:%s;", (int)(2 * depth), "", (void *)obj, id); +#endif /*LV_USE_LOG*/ + + if(obj && obj->spec_attr && obj->spec_attr->child_cnt) { + for(uint32_t i = 0; i < obj->spec_attr->child_cnt; i++) { + dump_tree_core(lv_obj_get_child(obj, i), depth + 1); + } + } +} + +static lv_obj_t * lv_obj_get_first_not_deleting_child(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj->spec_attr == NULL) return NULL; + + int32_t i; + int32_t cnt = (int32_t)obj->spec_attr->child_cnt; + for(i = 0; i < cnt; i++) { + if(!obj->spec_attr->children[i]->is_deleting) { + return obj->spec_attr->children[i]; + } + } + + return NULL; +} + +#if LV_USE_OBJ_NAME + +static lv_obj_t * find_by_name_direct(const lv_obj_t * parent, const char * name, size_t len) +{ + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(parent); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + + char child_name_resolved[LV_OBJ_NAME_MAX_LEN]; + lv_obj_get_name_resolved(child, child_name_resolved, sizeof(child_name_resolved)); + + if(len == UINT16_MAX) { + if(lv_strcmp(child_name_resolved, name) == 0) return child; + } + else { + if(lv_strncmp(child_name_resolved, name, len) == 0 && + child_name_resolved[len] == '\0') { + return child; + } + } + } + + return NULL; +} + +#endif /*LV_USE_OBJ_NAME*/ diff --git a/inc/lvgl/src/core/lv_obj_tree.h b/inc/lvgl/src/core/lv_obj_tree.h new file mode 100644 index 0000000..9850b5a --- /dev/null +++ b/inc/lvgl/src/core/lv_obj_tree.h @@ -0,0 +1,321 @@ +/** + * @file lv_obj_tree.h + * + */ + +#ifndef LV_OBJ_TREE_H +#define LV_OBJ_TREE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../misc/lv_anim.h" +#include "../display/lv_display.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_OBJ_TREE_WALK_NEXT, + LV_OBJ_TREE_WALK_SKIP_CHILDREN, + LV_OBJ_TREE_WALK_END, +} lv_obj_tree_walk_res_t; + +typedef lv_obj_tree_walk_res_t (*lv_obj_tree_walk_cb_t)(lv_obj_t *, void *); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Delete an object and all of its children. + * Also remove the objects from their group and remove all animations (if any). + * Send `LV_EVENT_DELETE` to deleted objects. + * @param obj pointer to an object + */ +void lv_obj_delete(lv_obj_t * obj); + +/** + * Delete all children of an object. + * Also remove the objects from their group and remove all animations (if any). + * Send `LV_EVENT_DELETE` to deleted objects. + * @param obj pointer to an object + */ +void lv_obj_clean(lv_obj_t * obj); + +/** + * Delete an object after some delay + * @param obj pointer to an object + * @param delay_ms time to wait before delete in milliseconds + */ +void lv_obj_delete_delayed(lv_obj_t * obj, uint32_t delay_ms); + +/** + * A function to be easily used in animation ready callback to delete an object when the animation is ready + * @param a pointer to the animation + */ +void lv_obj_delete_anim_completed_cb(lv_anim_t * a); + +/** + * Helper function for asynchronously deleting objects. + * Useful for cases where you can't delete an object directly in an `LV_EVENT_DELETE` handler (i.e. parent). + * @param obj object to delete + * @see lv_async_call + */ +void lv_obj_delete_async(lv_obj_t * obj); + +/** + * Move the parent of an object. The relative coordinates will be kept. + * + * @param obj pointer to an object whose parent needs to be changed + * @param parent pointer to the new parent + */ +void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent); + +/** + * Swap the positions of two objects. + * When used in listboxes, it can be used to sort the listbox items. + * @param obj1 pointer to the first object + * @param obj2 pointer to the second object + */ +void lv_obj_swap(lv_obj_t * obj1, lv_obj_t * obj2); + +/** + * moves the object to the given index in its parent. + * When used in listboxes, it can be used to sort the listbox items. + * @param obj pointer to the object to be moved. + * @param index new index in parent. -1 to count from the back + * @note to move to the background: lv_obj_move_to_index(obj, 0) + * @note to move forward (up): lv_obj_move_to_index(obj, lv_obj_get_index(obj) - 1) + */ +void lv_obj_move_to_index(lv_obj_t * obj, int32_t index); + +/** + * Get the screen of an object + * @param obj pointer to an object + * @return pointer to the object's screen + */ +lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj); + +/** + * Get the display of the object + * @param obj pointer to an object + * @return pointer to the object's display + */ +lv_display_t * lv_obj_get_display(const lv_obj_t * obj); + +/** + * Get the parent of an object + * @param obj pointer to an object + * @return the parent of the object. (NULL if `obj` was a screen) + */ +lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj); + +/** + * Get the child of an object by the child's index. + * @param obj pointer to an object whose child should be get + * @param idx the index of the child. + * 0: the oldest (firstly created) child + * 1: the second oldest + * child count-1: the youngest + * -1: the youngest + * -2: the second youngest + * @return pointer to the child or NULL if the index was invalid + */ +lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, int32_t idx); + +/** + * Get the child of an object by the child's index. Consider the children only with a given type. + * @param obj pointer to an object whose child should be get + * @param idx the index of the child. + * 0: the oldest (firstly created) child + * 1: the second oldest + * child count-1: the youngest + * -1: the youngest + * -2: the second youngest + * @param class_p the type of the children to check + * @return pointer to the child or NULL if the index was invalid + */ +lv_obj_t * lv_obj_get_child_by_type(const lv_obj_t * obj, int32_t idx, + const lv_obj_class_t * class_p); + +/** + * Return a sibling of an object + * @param obj pointer to an object whose sibling should be get + * @param idx 0: `obj` itself + * -1: the first older sibling + * -2: the next older sibling + * 1: the first younger sibling + * 2: the next younger sibling + * etc + * @return pointer to the requested sibling or NULL if there is no such sibling + */ +lv_obj_t * lv_obj_get_sibling(const lv_obj_t * obj, int32_t idx); + +/** + * Return a sibling of an object. Consider the siblings only with a given type. + * @param obj pointer to an object whose sibling should be get + * @param idx 0: `obj` itself + * -1: the first older sibling + * -2: the next older sibling + * 1: the first younger sibling + * 2: the next younger sibling + * etc + * @param class_p the type of the children to check + * @return pointer to the requested sibling or NULL if there is no such sibling + */ +lv_obj_t * lv_obj_get_sibling_by_type(const lv_obj_t * obj, int32_t idx, + const lv_obj_class_t * class_p); + +/** + * Get the number of children + * @param obj pointer to an object + * @return the number of children + */ +uint32_t lv_obj_get_child_count(const lv_obj_t * obj); + +/** + * Get the number of children having a given type. + * @param obj pointer to an object + * @param class_p the type of the children to check + * @return the number of children + */ + +uint32_t lv_obj_get_child_count_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +#if LV_USE_OBJ_NAME + +/** + * Set a name for a widget. The name will be allocated and freed when the + * widget is deleted or a new name is set. + * @param obj pointer to an object + * @param name the name to set. If set to `NULL` the default "_#" + * name will be used. + * @note If the name ends with a `#`, older siblings with the same name + * will be counted, and the `#` will be replaced by the index of the + * given widget. For example, creating multiple widgets with the name + * "mybtn_#" will result in resolved names like "mybtn_0", "mybtn_1", + * "mybtn_2", etc. The name is resolved when `lv_obj_get_name_resolved` + * is called, so the result reflects the currently existing widgets at + * that time. + */ +void lv_obj_set_name(lv_obj_t * obj, const char * name); + +/** + * Set a name for a widget. Only a pointer will be saved. + * @param obj pointer to an object + * @param name the name to set. If set to `NULL` the default "_#" + * name will be used. + * @note If the name ends with a `#`, older siblings with the same name + * will be counted, and the `#` will be replaced by the index of the + * given widget. For example, creating multiple widgets with the name + * "mybtn_#" will result in resolved names like "mybtn_0", "mybtn_1", + * "mybtn_2", etc. The name is resolved when `lv_obj_get_name_resolved` + * is called, so the result reflects the currently existing widgets at + * that time. + */ +void lv_obj_set_name_static(lv_obj_t * obj, const char * name); + +/** + * Get the set name as it was set. + * @param obj pointer to an object + * @return get the set name or NULL if it wasn't set yet + */ +const char * lv_obj_get_name(const lv_obj_t * obj); + +/** + * Get the set name or craft a name automatically. + * @param obj pointer to an object + * @param buf buffer to store the name + * @param buf_size the size of the buffer in bytes + * @note If the name ends with a `#`, older siblings with the same name + * will be counted, and the `#` will be replaced by the index of the + * given widget. For example, creating multiple widgets with the name + * "mybtn_#" will result in resolved names like "mybtn_0", "mybtn_1", + * "mybtn_2", etc. The name is resolved when `lv_obj_get_name_resolved` + * is called, so the result reflects the currently existing widgets at + * that time. + */ +void lv_obj_get_name_resolved(const lv_obj_t * obj, char buf[], size_t buf_size); + +/** + * Find a child with a given name on a parent. This child doesn't have to be the + * direct child of the parent. First direct children of the parent will be checked, + * and the direct children of the first child, etc. (Breadth-first search). + * + * If the name of a widget was not set a name like "lv_button_1" will + * be created for it using `lv_obj_get_name_resolved`. + * + * @param parent the widget where the search should start + * @return the found widget or NULL if not found. + */ +lv_obj_t * lv_obj_find_by_name(const lv_obj_t * parent, const char * name); + +/** + * Get an object by name. The name can be a path too, for example + * "main_container/lv_button_1/label". + * In this case the first part of the name-path should be the direct child of the parent, + * the second part, should the direct child of first one, etc. + * + * If the name of a widget was not set a name like "lv_button_1" will + * be created for it using `lv_obj_get_name_resolved`. + * + * @param parent the widget where the search should start + * @return the found widget or NULL if not found. + */ +lv_obj_t * lv_obj_get_child_by_name(const lv_obj_t * parent, const char * name_path); + +#endif /*LV_USE_OBJ_NAME*/ + +/** + * Get the index of a child. + * @param obj pointer to an object + * @return the child index of the object. + * E.g. 0: the oldest (firstly created child). + * (-1 if child could not be found or no parent exists) + */ +int32_t lv_obj_get_index(const lv_obj_t * obj); + +/** + * Get the index of a child. Consider the children only with a given type. + * @param obj pointer to an object + * @param class_p the type of the children to check + * @return the child index of the object. + * E.g. 0: the oldest (firstly created child with the given class). + * (-1 if child could not be found or no parent exists) + */ +int32_t lv_obj_get_index_by_type(const lv_obj_t * obj, const lv_obj_class_t * class_p); + +/** + * Iterate through all children of any object. + * @param start_obj start integrating from this object + * @param cb call this callback on the objects + * @param user_data pointer to any user related data (will be passed to `cb`) + */ +void lv_obj_tree_walk(lv_obj_t * start_obj, lv_obj_tree_walk_cb_t cb, void * user_data); + +/** + * Iterate through all children of any object and print their ID. + * @param start_obj start integrating from this object + */ +void lv_obj_dump_tree(lv_obj_t * start_obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJ_TREE_H*/ diff --git a/inc/lvgl/src/core/lv_observer.c b/inc/lvgl/src/core/lv_observer.c new file mode 100644 index 0000000..033deb3 --- /dev/null +++ b/inc/lvgl/src/core/lv_observer.c @@ -0,0 +1,1098 @@ +/** + * @file lv_observer.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_observer_private.h" +#if LV_USE_OBSERVER + +#include "../lvgl.h" +#include "../core/lv_obj_private.h" +#include "../misc/lv_event_private.h" + +/********************* + * DEFINES + *********************/ + +#ifndef FLT_MAX + #define FLT_MAX 3.402823466e+38F /* float max value */ +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + FLAG_COND_EQ = 0, + FLAG_COND_GT = 1, + FLAG_COND_GE = 2 +} flag_cond_t; + +typedef struct { + uint32_t flag; + lv_subject_value_t value; + uint32_t inv : 1; + flag_cond_t cond : 3; +} flag_and_cond_t; + +typedef struct { + lv_subject_t * subject; + int32_t value; +} subject_set_int_user_data_t; + +typedef struct { + lv_subject_t * subject; + float value; +} subject_set_float_user_data_t; + +typedef struct { + lv_subject_t * subject; + const char * value; +} subject_set_string_user_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void subject_toggle_cb(lv_event_t * e); +static void subject_set_int_cb(lv_event_t * e); +#if LV_USE_FLOAT + static void subject_set_float_cb(lv_event_t * e); +#endif + +static void subject_set_string_cb(lv_event_t * e); +static void subject_increment_cb(lv_event_t * e); + +static void unsubscribe_on_delete_cb(lv_event_t * e); +static void group_notify_cb(lv_observer_t * observer, lv_subject_t * subject); +static lv_observer_t * bind_to_bitfield(lv_subject_t * subject, lv_obj_t * obj, lv_observer_cb_t cb, uint32_t flag, + int32_t ref_value, bool inv, flag_cond_t cond); + +static void obj_flag_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +static void obj_state_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +static void obj_value_changed_event_cb(lv_event_t * e); + +static void lv_subject_notify_if_changed(lv_subject_t * subject); + +static void subject_set_string_free_user_data_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if LV_USE_EXT_DATA +void lv_subject_set_external_data(lv_subject_t * subject, void * data, void (* free_cb)(void * data)) +{ + if(!subject) { + LV_LOG_WARN("Can't attach external user data and destructor callback to a NULL subject"); + return; + } + + subject->ext_data.data = data; + subject->ext_data.free_cb = free_cb; +} +#endif + +void lv_subject_init_int(lv_subject_t * subject, int32_t value) +{ + lv_memzero(subject, sizeof(lv_subject_t)); + subject->type = LV_SUBJECT_TYPE_INT; + subject->value.num = value; + subject->prev_value.num = value; + subject->min_value.num = INT32_MIN; + subject->max_value.num = INT32_MAX; + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); +} + +void lv_subject_set_int(lv_subject_t * subject, int32_t value) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); + return; + } + + value = LV_CLAMP(subject->min_value.num, value, subject->max_value.num); + + subject->prev_value.num = subject->value.num; + subject->value.num = value; + lv_subject_notify_if_changed(subject); +} + +int32_t lv_subject_get_int(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); + return 0; + } + + return subject->value.num; +} + +int32_t lv_subject_get_previous_int(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); + return 0; + } + + return subject->prev_value.num; +} + +void lv_subject_set_min_value_int(lv_subject_t * subject, int32_t min_value) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); + return; + } + + subject->min_value.num = min_value; +} + +void lv_subject_set_max_value_int(lv_subject_t * subject, int32_t max_value) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_INT"); + return; + } + + subject->max_value.num = max_value; +} + +#if LV_USE_FLOAT + +void lv_subject_init_float(lv_subject_t * subject, float value) +{ + lv_memzero(subject, sizeof(lv_subject_t)); + subject->type = LV_SUBJECT_TYPE_FLOAT; + subject->value.float_v = value; + subject->prev_value.float_v = value; + subject->min_value.float_v = -FLT_MAX; + subject->max_value.float_v = FLT_MAX; + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); +} + +void lv_subject_set_float(lv_subject_t * subject, float value) +{ + if(subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_FLOAT"); + return; + } + + value = LV_CLAMP(subject->min_value.float_v, value, subject->max_value.float_v); + + subject->prev_value.float_v = subject->value.float_v; + subject->value.float_v = value; + lv_subject_notify_if_changed(subject); +} + +float lv_subject_get_float(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_FLOAT"); + return 0; + } + + return subject->value.float_v; +} + +float lv_subject_get_previous_float(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_FLOAT"); + return 0; + } + + return subject->prev_value.float_v; +} + +void lv_subject_set_min_value_float(lv_subject_t * subject, float min_value) +{ + if(subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_FLOAT"); + return; + } + + subject->min_value.float_v = min_value; +} + +void lv_subject_set_max_value_float(lv_subject_t * subject, float max_value) +{ + if(subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_FLOAT"); + return; + } + + subject->max_value.float_v = max_value; +} + + +#endif /*LV_USE_FLOAT*/ + +void lv_subject_init_string(lv_subject_t * subject, char * buf, char * prev_buf, size_t size, const char * value) +{ + lv_memzero(subject, sizeof(lv_subject_t)); + lv_strlcpy(buf, value, size); + if(prev_buf) lv_strlcpy(prev_buf, value, size); + + subject->type = LV_SUBJECT_TYPE_STRING; + subject->size = (uint32_t)size; + subject->value.pointer = buf; + subject->prev_value.pointer = prev_buf; + + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); +} + +void lv_subject_copy_string(lv_subject_t * subject, const char * buf) +{ + if(subject->type != LV_SUBJECT_TYPE_STRING) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_STRING"); + return; + } + + if(subject->size < 1) return; + if(subject->prev_value.pointer) { + lv_strlcpy((char *)subject->prev_value.pointer, subject->value.pointer, subject->size); + } + + lv_strlcpy((char *)subject->value.pointer, buf, subject->size); + + lv_subject_notify_if_changed(subject); +} + +void lv_subject_snprintf(lv_subject_t * subject, const char * format, ...) +{ + if(subject->type != LV_SUBJECT_TYPE_STRING) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_STRING"); + return; + } + + if(subject->size < 1U) return; + + if(subject->prev_value.pointer) { + lv_strlcpy((char *)subject->prev_value.pointer, subject->value.pointer, subject->size); + } + + va_list va; + va_start(va, format); + const int ret = lv_vsnprintf((char *)subject->value.pointer, subject->size, format, va); + LV_UNUSED(ret); + va_end(va); + + lv_subject_notify_if_changed(subject); +} + +const char * lv_subject_get_string(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_STRING) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_STRING"); + return ""; + } + + return subject->value.pointer; +} + +const char * lv_subject_get_previous_string(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_STRING) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_STRING"); + return NULL; + } + + return subject->prev_value.pointer; +} + +void lv_subject_init_pointer(lv_subject_t * subject, void * value) +{ + lv_memzero(subject, sizeof(lv_subject_t)); + subject->type = LV_SUBJECT_TYPE_POINTER; + subject->value.pointer = value; + subject->prev_value.pointer = value; + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); +} + +void lv_subject_set_pointer(lv_subject_t * subject, void * ptr) +{ + if(subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_POINTER"); + return; + } + + subject->prev_value.pointer = subject->value.pointer; + subject->value.pointer = ptr; + lv_subject_notify_if_changed(subject); +} + +const void * lv_subject_get_pointer(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_POINTER"); + return NULL; + } + + return subject->value.pointer; +} + +const void * lv_subject_get_previous_pointer(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_POINTER"); + return NULL; + } + + return subject->prev_value.pointer; +} + +void lv_subject_init_color(lv_subject_t * subject, lv_color_t color) +{ + lv_memzero(subject, sizeof(lv_subject_t)); + subject->type = LV_SUBJECT_TYPE_COLOR; + subject->value.color = color; + subject->prev_value.color = color; + lv_ll_init(&(subject->subs_ll), sizeof(lv_observer_t)); +} + +void lv_subject_set_color(lv_subject_t * subject, lv_color_t color) +{ + if(subject->type != LV_SUBJECT_TYPE_COLOR) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_COLOR"); + return; + } + + subject->prev_value.color = subject->value.color; + subject->value.color = color; + lv_subject_notify_if_changed(subject); +} + +lv_color_t lv_subject_get_color(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_COLOR) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_COLOR"); + return lv_color_black(); + } + + return subject->value.color; +} + +lv_color_t lv_subject_get_previous_color(lv_subject_t * subject) +{ + if(subject->type != LV_SUBJECT_TYPE_COLOR) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_COLOR"); + return lv_color_black(); + } + + return subject->prev_value.color; +} + +void lv_subject_init_group(lv_subject_t * group_subject, lv_subject_t * list[], uint32_t list_len) +{ + group_subject->type = LV_SUBJECT_TYPE_GROUP; + group_subject->size = list_len; + lv_ll_init(&(group_subject->subs_ll), sizeof(lv_observer_t)); + group_subject->value.pointer = list; + + /* Bind all list[] subjects to `group_subject`. */ + uint32_t i; + for(i = 0; i < list_len; i++) { + /* If a subject in `list[]` changes, notify `group_subject`. */ + lv_subject_add_observer(list[i], group_notify_cb, group_subject); + } +} + +void lv_subject_deinit(lv_subject_t * subject) +{ + lv_observer_t * observer = lv_ll_get_head(&subject->subs_ll); + while(observer) { + lv_observer_t * observer_next = lv_ll_get_next(&subject->subs_ll, observer); + + lv_observer_remove(observer); + observer = observer_next; + } + + lv_ll_clear(&subject->subs_ll); +} + +lv_subject_t * lv_subject_get_group_element(lv_subject_t * subject, int32_t index) +{ + if(subject->type != LV_SUBJECT_TYPE_GROUP) { + LV_LOG_WARN("Subject type is not LV_SUBJECT_TYPE_GROUP"); + return NULL; + } + + if(index >= (int32_t)subject->size) return NULL; + if(index < 0) return NULL; + + return ((lv_subject_t **)(subject->value.pointer))[index]; +} + +lv_observer_t * lv_subject_add_observer(lv_subject_t * subject, lv_observer_cb_t cb, void * user_data) +{ + lv_observer_t * observer = lv_subject_add_observer_obj(subject, cb, NULL, user_data); + if(observer == NULL) return NULL; + + observer->for_obj = 0; + return observer; +} + +lv_observer_t * lv_subject_add_observer_obj(lv_subject_t * subject, lv_observer_cb_t cb, lv_obj_t * obj, + void * user_data) +{ + LV_ASSERT_NULL(subject); + if(subject->type == LV_SUBJECT_TYPE_INVALID) { + LV_LOG_WARN("Subject not initialized yet"); + return NULL; + } + lv_observer_t * observer = lv_ll_ins_tail(&(subject->subs_ll)); + LV_ASSERT_MALLOC(observer); + if(observer == NULL) return NULL; + + lv_memzero(observer, sizeof(*observer)); + + observer->subject = subject; + observer->cb = cb; + observer->user_data = user_data; + observer->target = obj; + observer->for_obj = 1; + /* subscribe to delete event of the object */ + if(obj != NULL) { + lv_obj_add_event_cb(obj, unsubscribe_on_delete_cb, LV_EVENT_DELETE, observer); + } + + /* Update Observer immediately. */ + if(observer->cb) observer->cb(observer, subject); + + return observer; +} + +lv_observer_t * lv_subject_add_observer_with_target(lv_subject_t * subject, lv_observer_cb_t cb, void * target, + void * user_data) +{ + LV_ASSERT_NULL(subject); + if(subject->type == LV_SUBJECT_TYPE_INVALID) { + LV_LOG_WARN("Subject not initialized yet"); + return NULL; + } + lv_observer_t * observer = lv_ll_ins_tail(&(subject->subs_ll)); + LV_ASSERT_MALLOC(observer); + if(observer == NULL) return NULL; + + lv_memzero(observer, sizeof(*observer)); + + observer->subject = subject; + observer->cb = cb; + observer->user_data = user_data; + observer->target = target; + + /* Update Observer immediately. */ + if(observer->cb) observer->cb(observer, subject); + + return observer; +} + + +void lv_observer_remove(lv_observer_t * observer) +{ + LV_ASSERT_NULL(observer); + + if(observer->for_obj && observer->target) { + lv_obj_remove_event_cb_with_user_data(observer->target, unsubscribe_on_delete_cb, observer); + lv_obj_remove_event_cb_with_user_data(observer->target, NULL, observer->subject); + } + + observer->subject->notify_restart_query = 1; + +#if LV_USE_EXT_DATA + if(observer->subject->ext_data.free_cb) { + observer->subject->ext_data.free_cb(observer->subject->ext_data.data); + observer->subject->ext_data.data = NULL; + } +#endif + + lv_ll_remove(&(observer->subject->subs_ll), observer); + + if(observer->auto_free_user_data) { + lv_free(observer->user_data); + } + lv_free(observer); +} + +void lv_obj_remove_from_subject(lv_obj_t * obj, lv_subject_t * subject) +{ + LV_ASSERT_NULL(obj); + /* + * Look for the `observer` that connects `obj` and `subject` + * Since the obj is associated with the subject, + * the `obj` will have an LV_EVENT_REMOVE event with the `unsubscribe_on_delete_cb` callback + * associated. + * From the event we can then find the observer in the event's `user_data` field + */ + int32_t i; + int32_t event_cnt = (int32_t)(obj->spec_attr ? lv_event_get_count(&obj->spec_attr->event_list) : 0); + for(i = event_cnt - 1; i >= 0; i--) { + lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(obj, i); + if(event_dsc->cb == unsubscribe_on_delete_cb) { + lv_observer_t * observer = event_dsc->user_data; + if(subject == NULL || subject == observer->subject) { + /* lv_observer_remove handles the deletion of all possible event callbacks */ + lv_observer_remove(observer); + } + } + } + /* Gracefully de-couple `subject` from Widget by deleting any existing + * `LV_EVENT_VALUE_CHANGED` event associated with `subject` in case + * one of the `..._bind_value()` functions was used. */ + lv_obj_remove_event_cb_with_user_data(obj, NULL, subject); + +} + +void * lv_observer_get_target(lv_observer_t * observer) +{ + LV_ASSERT_NULL(observer); + + return observer->target; +} + +void lv_subject_notify(lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + + lv_observer_t * observer; + LV_LL_READ(&(subject->subs_ll), observer) { + observer->notified = 0; + } + + do { + subject->notify_restart_query = 0; + LV_LL_READ(&(subject->subs_ll), observer) { + if(observer->cb && observer->notified == 0) { + observer->cb(observer, subject); + if(subject->notify_restart_query) break; + observer->notified = 1; + } + } + } while(subject->notify_restart_query); +} + +lv_subject_increment_dsc_t * lv_obj_add_subject_increment_event(lv_obj_t * obj, lv_subject_t * subject, + lv_event_code_t trigger, int32_t step) +{ + if(subject->type != LV_SUBJECT_TYPE_INT && subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Subject type must be `int` or `float` (was %d)", subject->type); + return NULL; + } + + lv_subject_increment_dsc_t * user_data = lv_malloc(sizeof(lv_subject_increment_dsc_t)); + if(user_data == NULL) { + LV_ASSERT_MALLOC(user_data); + LV_LOG_WARN("Couldn't allocate user_data in in "); + return NULL; + } + + user_data->step = step; + user_data->subject = subject; + user_data->rollover = false; + user_data->min_value = INT32_MIN; + user_data->max_value = INT32_MAX; + lv_obj_add_event_cb(obj, subject_increment_cb, trigger, user_data); + lv_obj_add_event_cb(obj, lv_event_free_user_data_cb, LV_EVENT_DELETE, user_data); + + return user_data; +} + +void lv_obj_set_subject_increment_event_min_value(lv_obj_t * obj, lv_subject_increment_dsc_t * dsc, int32_t min_value) +{ + LV_UNUSED(obj); + LV_ASSERT_NULL(dsc); + if(dsc == NULL) { + LV_LOG_WARN("Invalid parameters"); + return; + } + + dsc->min_value = min_value; + if(dsc->subject->type == LV_SUBJECT_TYPE_INT) { + if(dsc->subject->value.num < min_value) { + lv_subject_set_int(dsc->subject, min_value); + } + } +#if LV_USE_FLOAT + else if(dsc->subject->type == LV_SUBJECT_TYPE_FLOAT) { + if(dsc->subject->value.float_v < (float)min_value) { + lv_subject_set_float(dsc->subject, (float)min_value); + } + } +#endif +} + +void lv_obj_set_subject_increment_event_max_value(lv_obj_t * obj, lv_subject_increment_dsc_t * dsc, int32_t max_value) +{ + LV_UNUSED(obj); + LV_ASSERT_NULL(dsc); + if(dsc == NULL) { + LV_LOG_WARN("Invalid parameters"); + return; + } + + + dsc->max_value = max_value; + if(dsc->subject->type == LV_SUBJECT_TYPE_INT) { + if(dsc->subject->value.num > max_value) { + lv_subject_set_int(dsc->subject, max_value); + } + } +#if LV_USE_FLOAT + else if(dsc->subject->type == LV_SUBJECT_TYPE_FLOAT) { + if(dsc->subject->value.float_v > (float)max_value) { + lv_subject_set_float(dsc->subject, (float)max_value); + } + } +#endif +} + +void lv_obj_set_subject_increment_event_rollover(lv_obj_t * obj, lv_subject_increment_dsc_t * dsc, bool rollover) +{ + LV_UNUSED(obj); + LV_ASSERT_NULL(dsc); + if(dsc == NULL) { + LV_LOG_WARN("Invalid parameters"); + return; + } + + dsc->rollover = rollover; +} + +void lv_obj_add_subject_toggle_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type must be `int` (was %d)", subject->type); + return; + } + lv_obj_add_event_cb(obj, subject_toggle_cb, trigger, subject); +} + +void lv_obj_add_subject_set_int_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, int32_t value) +{ + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Subject type must be `int` (was %d)", subject->type); + return; + } + + subject_set_int_user_data_t * user_data = lv_malloc(sizeof(subject_set_int_user_data_t)); + if(user_data == NULL) { + LV_ASSERT_MALLOC(user_data); + LV_LOG_WARN("Couldn't allocate user_data"); + return; + } + + user_data->subject = subject; + user_data->value = value; + + lv_obj_add_event_cb(obj, subject_set_int_cb, trigger, user_data); + lv_obj_add_event_cb(obj, lv_event_free_user_data_cb, LV_EVENT_DELETE, user_data); +} + +#if LV_USE_FLOAT +void lv_obj_add_subject_set_float_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, float value) +{ + if(subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Subject type must be `float` (was %d)", subject->type); + return; + } + + subject_set_float_user_data_t * user_data = lv_malloc(sizeof(subject_set_float_user_data_t)); + if(user_data == NULL) { + LV_ASSERT_MALLOC(user_data); + LV_LOG_WARN("Couldn't allocate user_data"); + return; + } + + user_data->subject = subject; + user_data->value = value; + + lv_obj_add_event_cb(obj, subject_set_float_cb, trigger, user_data); + lv_obj_add_event_cb(obj, lv_event_free_user_data_cb, LV_EVENT_DELETE, user_data); +} +#endif /*LV_USE_FLOAT*/ + +void lv_obj_add_subject_set_string_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, + const char * value) +{ + + if(subject->type != LV_SUBJECT_TYPE_STRING) { + LV_LOG_WARN("Subject type must be `string` (was %d)", subject->type); + return; + } + + subject_set_string_user_data_t * user_data = lv_malloc(sizeof(subject_set_int_user_data_t)); + if(user_data == NULL) { + LV_ASSERT_MALLOC(user_data); + LV_LOG_WARN("Couldn't allocate user_data"); + return; + } + + user_data->subject = subject; + user_data->value = lv_strdup(value); + LV_ASSERT_MALLOC(user_data->value); + + lv_obj_add_event_cb(obj, subject_set_string_cb, trigger, user_data); + lv_obj_add_event_cb(obj, subject_set_string_free_user_data_event_cb, LV_EVENT_DELETE, user_data); +} + + +lv_observer_t * lv_obj_bind_flag_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, false, FLAG_COND_EQ); + return observable; +} + +lv_observer_t * lv_obj_bind_flag_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, + int32_t ref_value) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, true, FLAG_COND_EQ); + return observable; +} +lv_observer_t * lv_obj_bind_flag_if_gt(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value) +{ + + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, false, FLAG_COND_GT); + return observable; +} + +lv_observer_t * lv_obj_bind_flag_if_ge(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value) +{ + + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, false, FLAG_COND_GE); + return observable; +} + +lv_observer_t * lv_obj_bind_flag_if_lt(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value) +{ + /* a < b == !(a >= b) */ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, true, FLAG_COND_GE); + return observable; +} + +lv_observer_t * lv_obj_bind_flag_if_le(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value) +{ + /* a <= b == !(a > b) */ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_flag_observer_cb, flag, ref_value, true, FLAG_COND_GT); + return observable; + +} + +lv_observer_t * lv_obj_bind_state_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, false, + FLAG_COND_EQ); + return observable; +} + +lv_observer_t * lv_obj_bind_state_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, true, + FLAG_COND_EQ); + return observable; +} + +lv_observer_t * lv_obj_bind_state_if_gt(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) +{ + + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, false, + FLAG_COND_GT); + return observable; +} + +lv_observer_t * lv_obj_bind_state_if_ge(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, false, + FLAG_COND_GE); + return observable; +} + +lv_observer_t * lv_obj_bind_state_if_lt(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) +{ + /* a < b == !(a >= b) */ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, true, + FLAG_COND_GE); + return observable; + +} + +lv_observer_t * lv_obj_bind_state_if_le(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value) +{ + + /* a <= b == !(a > b) */ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, state, ref_value, true, + FLAG_COND_GT); + return observable; +} + + +lv_observer_t * lv_obj_bind_checked(lv_obj_t * obj, lv_subject_t * subject) +{ + lv_observer_t * observable = bind_to_bitfield(subject, obj, obj_state_observer_cb, LV_STATE_CHECKED, 0, true, + FLAG_COND_EQ); + + lv_obj_add_event_cb(obj, obj_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + + return observable; +} + + +lv_obj_t * lv_observer_get_target_obj(lv_observer_t * observer) +{ + return (lv_obj_t *)lv_observer_get_target(observer); +} + +void * lv_observer_get_user_data(const lv_observer_t * observer) +{ + LV_ASSERT_NULL(observer); + return observer->user_data; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void subject_toggle_cb(lv_event_t * e) +{ + lv_subject_t * subject = lv_event_get_user_data(e); + int32_t v = lv_subject_get_int(subject); + v = !v; + + lv_subject_set_int(subject, v); +} + +static void subject_set_int_cb(lv_event_t * e) +{ + subject_set_int_user_data_t * user_data = lv_event_get_user_data(e); + lv_subject_set_int(user_data->subject, user_data->value); +} + + +#if LV_USE_FLOAT +static void subject_set_float_cb(lv_event_t * e) +{ + subject_set_float_user_data_t * user_data = lv_event_get_user_data(e); + lv_subject_set_float(user_data->subject, user_data->value); +} +#endif + +static void subject_set_string_cb(lv_event_t * e) +{ + subject_set_string_user_data_t * user_data = lv_event_get_user_data(e); + lv_subject_copy_string(user_data->subject, user_data->value); +} + +static void subject_increment_cb(lv_event_t * e) +{ + lv_subject_increment_dsc_t * user_data = lv_event_get_user_data(e); + + if(user_data->subject->type == LV_SUBJECT_TYPE_INT) { + /*Use the smaller range*/ + int32_t max_value = LV_MIN(user_data->max_value, user_data->subject->max_value.num); + int32_t min_value = LV_MAX(user_data->min_value, user_data->subject->min_value.num); + + int32_t value = lv_subject_get_int(user_data->subject); + value += user_data->step; + + if(user_data->rollover) { + if(value > max_value) { + value = min_value; + } + else if(value < min_value) { + value = max_value; + } + } + else { + value = LV_CLAMP(min_value, value, max_value); + } + + lv_subject_set_int(user_data->subject, value); + } +#if LV_USE_FLOAT + else if(user_data->subject->type == LV_SUBJECT_TYPE_FLOAT) { + /*Use the smaller range*/ + float max_value = LV_MIN((float)user_data->max_value, user_data->subject->max_value.float_v); + float min_value = LV_MAX((float)user_data->min_value, user_data->subject->min_value.float_v); + + + float value = lv_subject_get_float(user_data->subject); + value += (float)user_data->step; + + if(user_data->rollover) { + if(value > max_value) { + value = min_value; + } + else if(value < min_value) { + value = max_value; + } + } + else { + value = LV_CLAMP(min_value, value, max_value); + } + + lv_subject_set_float(user_data->subject, value); + } +#endif +} + +static void group_notify_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + LV_UNUSED(subject); + lv_subject_t * subject_group = observer->user_data; + lv_subject_notify(subject_group); +} + +static void unsubscribe_on_delete_cb(lv_event_t * e) +{ + lv_observer_t * observer = lv_event_get_user_data(e); + lv_observer_remove(observer); +} + +static lv_observer_t * bind_to_bitfield(lv_subject_t * subject, lv_obj_t * obj, lv_observer_cb_t cb, uint32_t flag, + int32_t ref_value, bool inv, flag_cond_t cond) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + flag_and_cond_t * p = lv_malloc(sizeof(flag_and_cond_t)); + if(p == NULL) { + LV_LOG_WARN("Out of memory"); + return NULL; + } + + p->flag = flag; + p->value.num = ref_value; + p->inv = inv; + p->cond = cond; + + lv_observer_t * observable = lv_subject_add_observer_obj(subject, cb, obj, p); + observable->auto_free_user_data = 1; + + return observable; +} + +static void obj_flag_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + flag_and_cond_t * p = observer->user_data; + + /* Initializing this keeps some compilers happy */ + bool res = false; + switch(p->cond) { + case FLAG_COND_EQ: + res = subject->value.num == p->value.num; + break; + case FLAG_COND_GT: + res = subject->value.num > p->value.num; + break; + case FLAG_COND_GE: + res = subject->value.num >= p->value.num; + break; + } + if(p->inv) res = !res; + + if(res) { + lv_obj_add_flag(observer->target, p->flag); + } + else { + lv_obj_remove_flag(observer->target, p->flag); + } +} + +static void obj_state_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + flag_and_cond_t * p = observer->user_data; + + /* Initializing this keeps some compilers happy */ + bool res = false; + switch(p->cond) { + case FLAG_COND_EQ: + res = subject->value.num == p->value.num; + break; + case FLAG_COND_GT: + res = subject->value.num > p->value.num; + break; + case FLAG_COND_GE: + res = subject->value.num >= p->value.num; + break; + } + if(p->inv) res = !res; + + if(res) { + lv_obj_add_state(observer->target, p->flag); + } + else { + lv_obj_remove_state(observer->target, p->flag); + } +} + +static void obj_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + lv_subject_set_int(subject, lv_obj_has_state(obj, LV_STATE_CHECKED)); +} + +static void lv_subject_notify_if_changed(lv_subject_t * subject) +{ + + switch(subject->type) { + case LV_SUBJECT_TYPE_INVALID : + case LV_SUBJECT_TYPE_NONE : + return; + case LV_SUBJECT_TYPE_INT : + if(subject->value.num != subject->prev_value.num) { + lv_subject_notify(subject); + } + break; +#if LV_USE_FLOAT + case LV_SUBJECT_TYPE_FLOAT : + if(subject->value.float_v != subject->prev_value.float_v) { + lv_subject_notify(subject); + } + break; +#endif + case LV_SUBJECT_TYPE_GROUP : + case LV_SUBJECT_TYPE_POINTER : + /* Always notify as we don't know how to compare this */ + lv_subject_notify(subject); + break; + case LV_SUBJECT_TYPE_COLOR : + if(!lv_color_eq(subject->value.color, subject->prev_value.color)) { + lv_subject_notify(subject); + } + break; + case LV_SUBJECT_TYPE_STRING: + if(!subject->prev_value.pointer || + lv_strcmp(subject->value.pointer, subject->prev_value.pointer)) { + lv_subject_notify(subject); + } + break; + } +} + +static void subject_set_string_free_user_data_event_cb(lv_event_t * e) +{ + subject_set_string_user_data_t * user_data = lv_event_get_user_data(e); + lv_free((void *)user_data->value); + lv_free(user_data); +} + + +#endif /*LV_USE_OBSERVER*/ diff --git a/inc/lvgl/src/core/lv_observer.h b/inc/lvgl/src/core/lv_observer.h new file mode 100644 index 0000000..943bf01 --- /dev/null +++ b/inc/lvgl/src/core/lv_observer.h @@ -0,0 +1,622 @@ +/** + * @file lv_observer.h + * + */ + +#ifndef LV_OBSERVER_H +#define LV_OBSERVER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../misc/lv_ext_data.h" +#include "lv_obj.h" + +#if LV_USE_OBSERVER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Values for lv_subject_t's `type` field + */ +typedef enum { + LV_SUBJECT_TYPE_INVALID = 0, /**< indicates Subject not initialized yet */ + LV_SUBJECT_TYPE_NONE = 1, /**< a null value like None or NILt */ + LV_SUBJECT_TYPE_INT = 2, /**< an int32_t */ + LV_SUBJECT_TYPE_FLOAT = 3, /**< a float, requires `LV_USE_FLOAT 1` */ + LV_SUBJECT_TYPE_POINTER = 4, /**< a void pointer */ + LV_SUBJECT_TYPE_COLOR = 5, /**< an lv_color_t */ + LV_SUBJECT_TYPE_GROUP = 6, /**< an array of Subjects */ + LV_SUBJECT_TYPE_STRING = 7, /**< a char pointer */ +} lv_subject_type_t; + +/** + * A common type to handle all the various observable types in the same way + */ +typedef union { + int32_t num; /**< Integer number (opacity, enums, booleans or "normal" numbers) */ + const void * pointer; /**< Constant pointer (string buffer, format string, font, cone text, etc.) */ + lv_color_t color; /**< Color */ +#if LV_USE_FLOAT + float float_v; /**< Floating point value*/ +#endif +} lv_subject_value_t; + +/** + * The Subject (an observable value) + */ +struct _lv_subject_t { +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif + lv_ll_t subs_ll; /**< Subscribers */ + lv_subject_value_t value; /**< Current value */ + lv_subject_value_t prev_value; /**< Previous value */ + lv_subject_value_t min_value; /**< Minimum value for min. int or float*/ + lv_subject_value_t max_value; /**< Maximum value for max. int or float*/ + void * user_data; /**< Additional parameter, can be used freely by user */ + uint32_t type : 4; /**< One of the LV_SUBJECT_TYPE_... values */ + uint32_t size : 24; /**< String buffer size or group length */ + uint32_t notify_restart_query : 1; /**< If an Observer was deleted during notification, + * start notifying from the beginning. */ +}; + +/** + * Callback called to notify Observer that Subject's value has changed + * @param observer pointer to Observer + * @param subject pointer to Subject being observed + */ +typedef void (*lv_observer_cb_t)(lv_observer_t * observer, lv_subject_t * subject); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_USE_EXT_DATA +/** + * @brief Attaches external user data to an integer Subject with lifecycle management + * + * Associates arbitrary user-defined data with an LVGL observer and registers a destructor + * callback that will be automatically invoked when the observer is deleted. This enables: + * - Safe resource cleanup through the destructor mechanism + * - Contextual data storage for observer callbacks + * - Proper memory management for observer-related resources + * + * @param subject pointer to Subject + * @param data User-defined data pointer to associate + * @param free_cb Cleanup function called when: + * - Observer is explicitly deleted + * - Observed object is deleted + * - New data replaces current association + * NULL indicates no cleanup required + */ +void lv_subject_set_external_data(lv_subject_t * subject, void * data, void (* free_cb)(void * data)); +#endif + +/** + * Initialize an integer-type Subject. + * @param subject pointer to Subject + * @param value initial value + */ +void lv_subject_init_int(lv_subject_t * subject, int32_t value); + +/** + * Set value of an integer Subject and notify Observers. + * @param subject pointer to Subject + * @param value new value + */ +void lv_subject_set_int(lv_subject_t * subject, int32_t value); + +/** + * Get current value of an integer Subject. + * @param subject pointer to Subject + * @return current value + */ +int32_t lv_subject_get_int(lv_subject_t * subject); + +/** + * Get previous value of an integer Subject. + * @param subject pointer to Subject + * @return current value + */ +int32_t lv_subject_get_previous_int(lv_subject_t * subject); + + +/** + * Set a minimum value for an integer subject + * @param subject pointer to Subject + * @param min_value the minimum value + */ +void lv_subject_set_min_value_int(lv_subject_t * subject, int32_t min_value); + +/** + * Set a maximum value for an integer subject + * @param subject pointer to Subject + * @param max_value the maximum value + */ +void lv_subject_set_max_value_int(lv_subject_t * subject, int32_t max_value); + +#if LV_USE_FLOAT + +/** + * Initialize an float-type Subject. + * @param subject pointer to Subject + * @param value initial value + */ +void lv_subject_init_float(lv_subject_t * subject, float value); + +/** + * Set value of an float Subject and notify Observers. + * @param subject pointer to Subject + * @param value new value + */ +void lv_subject_set_float(lv_subject_t * subject, float value); + +/** + * Get current value of an float Subject. + * @param subject pointer to Subject + * @return current value + */ +float lv_subject_get_float(lv_subject_t * subject); + +/** + * Get previous value of an float Subject. + * @param subject pointer to Subject + * @return current value + */ +float lv_subject_get_previous_float(lv_subject_t * subject); + +/** + * Set a minimum value for a float subject + * @param subject pointer to Subject + * @param min_value the minimum value + */ +void lv_subject_set_min_value_float(lv_subject_t * subject, float min_value); + +/** + * Set a maximum value for a float subject + * @param subject pointer to Subject + * @param max_value the maximum value + */ +void lv_subject_set_max_value_float(lv_subject_t * subject, float max_value); + +#endif /*LV_USE_FLOAT*/ + +/** + * Initialize a string-type Subject. + * @param subject pointer to Subject + * @param buf pointer to buffer to store string + * @param prev_buf pointer to buffer to store previous string; can be NULL if not used + * @param size size of buffer(s) + * @param value initial value of string, e.g. "hello" + * @note A string Subject stores its own copy of the string, not just the pointer. + */ +void lv_subject_init_string(lv_subject_t * subject, char * buf, char * prev_buf, size_t size, const char * value); + +/** + * Copy a string to a Subject and notify Observers if it changed. + * @param subject pointer to Subject + * @param buf new string + */ +void lv_subject_copy_string(lv_subject_t * subject, const char * buf); + +/** + * Format a new string, updating Subject, and notify Observers if it changed. + * @param subject pointer to Subject + * @param format format string + */ +void lv_subject_snprintf(lv_subject_t * subject, const char * format, ...) LV_FORMAT_ATTRIBUTE(2, 3); + +/** + * Get current value of a string Subject. + * @param subject pointer to Subject + * @return pointer to buffer containing current value + */ +const char * lv_subject_get_string(lv_subject_t * subject); + +/** + * Get previous value of a string Subject. + * @param subject pointer to Subject + * @return pointer to buffer containing previous value + * @note NULL will be returned if NULL was passed in `lv_subject_init_string()` + * as `prev_buf`. + */ +const char * lv_subject_get_previous_string(lv_subject_t * subject); + +/** + * Initialize a pointer-type Subject. + * @param subject pointer to Subject + * @param value initial value + */ +void lv_subject_init_pointer(lv_subject_t * subject, void * value); + +/** + * Set value of a pointer Subject and notify Observers (regardless of whether it changed). + * @param subject pointer to Subject + * @param ptr new value + */ +void lv_subject_set_pointer(lv_subject_t * subject, void * ptr); + +/** + * Get current value of a pointer Subject. + * @param subject pointer to Subject + * @return current value + */ +const void * lv_subject_get_pointer(lv_subject_t * subject); + +/** + * Get previous value of a pointer Subject. + * @param subject pointer to Subject + * @return previous value + */ +const void * lv_subject_get_previous_pointer(lv_subject_t * subject); + +/** + * Initialize a color-type Subject. + * @param subject pointer to Subject + * @param color initial value + */ +void lv_subject_init_color(lv_subject_t * subject, lv_color_t color); + +/** + * Set value of a color Subject and notify Observers if it changed. + * @param subject pointer to Subject + * @param color new value + */ +void lv_subject_set_color(lv_subject_t * subject, lv_color_t color); + +/** + * Get current value of a color Subject. + * @param subject pointer to Subject + * @return current value + */ +lv_color_t lv_subject_get_color(lv_subject_t * subject); + +/** + * Get previous value of a color Subject. + * @param subject pointer to Subject + * @return previous value + */ +lv_color_t lv_subject_get_previous_color(lv_subject_t * subject); + +/** + * Initialize a Group-type Subject. + * @param group_subject pointer to Group-type Subject + * @param list list of other Subject addresses; when any of these have values + updated, Observers of `group_subject` will be notified. + * @param list_len number of elements in `list[]` + */ +void lv_subject_init_group(lv_subject_t * group_subject, lv_subject_t * list[], uint32_t list_len); + +/** + * Remove all Observers from a Subject and free allocated memory, and delete + * any associated Widget-Binding events. This leaves `subject` "disconnected" from + * all Observers and all associated Widget events established through Widget Binding. + * @param subject pointer to Subject + * @note This can safely be called regardless of whether any Observers + * added with `lv_subject_add_observer_obj()` or bound to a Widget Property + * with one of the `..._bind_...()` functions. + */ +void lv_subject_deinit(lv_subject_t * subject); + +/** + * Get an element from Subject Group's list. + * @param subject pointer to Group-type Subject + * @param index index of element to get + * @return pointer to indexed Subject from list, or NULL if index is out of bounds + */ +lv_subject_t * lv_subject_get_group_element(lv_subject_t * subject, int32_t index); + +/** + * Add Observer to Subject. When Subject's value changes `observer_cb` will be called. + * @param subject pointer to Subject + * @param observer_cb notification callback + * @param user_data optional user data + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_subject_add_observer(lv_subject_t * subject, lv_observer_cb_t observer_cb, void * user_data); + +/** + * Add Observer to Subject for a Widget. + * When the Widget is deleted, Observer will be unsubscribed from Subject automatically. + * @param subject pointer to Subject + * @param observer_cb notification callback + * @param obj pointer to Widget + * @param user_data optional user data + * @return pointer to newly-created Observer + * @note Do not call `lv_observer_remove()` on Observers created this way. + * Only clean up such Observers by either: + * - deleting the Widget, or + * - calling `lv_subject_deinit()` to gracefully de-couple and + * remove all Observers. + */ +lv_observer_t * lv_subject_add_observer_obj(lv_subject_t * subject, lv_observer_cb_t observer_cb, lv_obj_t * obj, + void * user_data); + +/** + * Add an Observer to a Subject and also save a target pointer. + * @param subject pointer to Subject + * @param observer_cb notification callback + * @param target any pointer (NULL is okay) + * @param user_data optional user data + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_subject_add_observer_with_target(lv_subject_t * subject, lv_observer_cb_t observer_cb, + void * target, void * user_data); + +/** + * Remove Observer from its Subject. + * @param observer pointer to Observer + */ +void lv_observer_remove(lv_observer_t * observer); + +/** + * Remove Observers associated with Widget `obj` from specified `subject` or all Subjects. + * @param obj pointer to Widget whose Observers should be removed + * @param subject Subject to remove Widget from, or NULL to remove from all Subjects + * @note This function can be used e.g. when a Widget's Subject(s) needs to + * be replaced by other Subject(s) + */ +void lv_obj_remove_from_subject(lv_obj_t * obj, lv_subject_t * subject); + +/** + * Get target of an Observer. + * @param observer pointer to Observer + * @return pointer to saved target + */ +void * lv_observer_get_target(lv_observer_t * observer); + +/** + * Get target Widget of Observer. + * This is the same as `lv_observer_get_target()`, except it returns `target` + * as an `lv_obj_t *`. + * @param observer pointer to Observer + * @return pointer to saved Widget target + */ +lv_obj_t * lv_observer_get_target_obj(lv_observer_t * observer); + +/** + * Get Observer's user data. + * @param observer pointer to Observer + * @return void pointer to saved user data +*/ +void * lv_observer_get_user_data(const lv_observer_t * observer); + +/** + * Notify all Observers of Subject. + * @param subject pointer to Subject + */ +void lv_subject_notify(lv_subject_t * subject); + +/** + * Add an event handler to increment (or decrement) the value of a subject on a trigger. + * @param obj pointer to a widget + * @param subject pointer to a subject to change + * @param trigger the trigger on which the subject should be changed + * @param step value to add on trigger + * if the minimum value is reached, the maximum value will be set on rollover. + */ +lv_subject_increment_dsc_t * lv_obj_add_subject_increment_event(lv_obj_t * obj, lv_subject_t * subject, + lv_event_code_t trigger, int32_t step); + +/** + * Set the minimum subject value to set by the event + * @param obj pointer to the Widget to which the event is attached + * @param dsc pointer to the descriptor returned by `lv_obj_add_subject_increment_event()` + * @param min_value the minimum value to set + */ +void lv_obj_set_subject_increment_event_min_value(lv_obj_t * obj, lv_subject_increment_dsc_t * dsc, int32_t min_value); + +/** + * Set the maximum subject value to set by the event + * @param obj pointer to the Widget to which the event is attached + * @param dsc pointer to the descriptor returned by `lv_obj_add_subject_increment_event()` + * @param max_value the maximum value to set + */ +void lv_obj_set_subject_increment_event_max_value(lv_obj_t * obj, lv_subject_increment_dsc_t * dsc, int32_t max_value); + +/** + * Set what to do when the min/max value is crossed. + * @param obj pointer to the Widget to which the event is attached + * @param dsc pointer to the descriptor returned by `lv_obj_add_subject_increment_event()` + * @param rollover false: stop at the min/max value; true: jump to the other end + * @note the subject also can have min/max values and always the smaller range will be considered + */ +void lv_obj_set_subject_increment_event_rollover(lv_obj_t * obj, lv_subject_increment_dsc_t * dsc, bool rollover); + +/** +* Toggle the value of an integer subject on an event. If it was != 0 it will be 0. +* If it was 0, it will be 1. +* @param obj pointer to a widget +* @param subject pointer to a subject to toggle +* @param trigger the trigger on which the subject should be changed +*/ +void lv_obj_add_subject_toggle_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger); + +/** + * Set the value of an integer subject. + * @param obj pointer to a widget + * @param subject pointer to a subject to change + * @param trigger the trigger on which the subject should be changed + * @param value the value to set + */ +void lv_obj_add_subject_set_int_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, int32_t value); + + +#if LV_USE_FLOAT +/** + * Set the value of a float subject. + * @param obj pointer to a widget + * @param subject pointer to a subject to change + * @param trigger the trigger on which the subject should be changed + * @param value the value to set + */ +void lv_obj_add_subject_set_float_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, float value); +#endif + +/** + * Set the value of a string subject. + * @param obj pointer to a widget + * @param subject pointer to a subject to change + * @param trigger the trigger on which the subject should be changed + * @param value the value to set + */ +void lv_obj_add_subject_set_string_event(lv_obj_t * obj, lv_subject_t * subject, lv_event_code_t trigger, + const char * value); + +/** + * Set Widget's flag(s) if an integer Subject's value is equal to a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param flag flag(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_flag_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value); + +/** + * Set Widget's flag(s) if an integer Subject's value is not equal to a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param flag flag(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_flag_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, + int32_t ref_value); + +/** + * Set Widget's flag(s) if an integer Subject's value is greater than a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param flag flag(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_flag_if_gt(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value); + +/** + * Set Widget's flag(s) if an integer Subject's value is greater than or equal to a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param flag flag(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_flag_if_ge(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value); + +/** + * Set Widget's flag(s) if an integer Subject's value is less than a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param flag flag(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_flag_if_lt(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value); + +/** + * Set Widget's flag(s) if an integer Subject's value is less than or equal to a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param flag flag(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_OBJ_FLAG_HIDDEN`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_flag_if_le(lv_obj_t * obj, lv_subject_t * subject, lv_obj_flag_t flag, int32_t ref_value); + + +/** + * Set Widget's state(s) if an integer Subject's value is equal to a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param state state(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_STATE_CHECKED`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_state_if_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value); + +/** + * Set a Widget's state(s) if an integer Subject's value is not equal to a reference value, clear flag otherwise + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param state state(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_STATE_CHECKED`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_state_if_not_eq(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, + int32_t ref_value); + +/** + * Set Widget's state(s) if an integer Subject's value is greater than a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param state state(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_STATE_CHECKED`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_state_if_gt(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value); + +/** + * Set Widget's state(s) if an integer Subject's value is greater than or equal to a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param state state(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_STATE_CHECKED`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_state_if_ge(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value); + +/** + * Set Widget's state(s) if an integer Subject's value is less than a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param state state(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_STATE_CHECKED`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_state_if_lt(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value); + +/** + * Set Widget's state(s) if an integer Subject's value is less than or equal to a reference value, clear flag otherwise. + * @param obj pointer to Widget + * @param subject pointer to Subject + * @param state state(s) (can be bit-wise OR-ed) to set or clear (e.g. `LV_STATE_CHECKED`) + * @param ref_value reference value to compare Subject's value with + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_obj_bind_state_if_le(lv_obj_t * obj, lv_subject_t * subject, lv_state_t state, int32_t ref_value); + +/** + * Set an integer Subject to 1 when a Widget is checked and set it 0 when unchecked, and + * clear Widget's checked state when Subject's value changes to 0 and set it when non-zero. + * @param obj pointer to Widget + * @param subject pointer to a Subject + * @return pointer to newly-created Observer + * @note Ensure Widget's `LV_OBJ_FLAG_CHECKABLE` flag is set. + */ +lv_observer_t * lv_obj_bind_checked(lv_obj_t * obj, lv_subject_t * subject); + + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OBSERVER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBSERVER_H*/ diff --git a/inc/lvgl/src/core/lv_observer_private.h b/inc/lvgl/src/core/lv_observer_private.h new file mode 100644 index 0000000..6f6cd89 --- /dev/null +++ b/inc/lvgl/src/core/lv_observer_private.h @@ -0,0 +1,67 @@ +/** + * @file lv_observer_private.h + * + */ + +#ifndef LV_OBSERVER_PRIVATE_H +#define LV_OBSERVER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_observer.h" + +#if LV_USE_OBSERVER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * The observer object: a descriptor returned when subscribing LVGL widgets to subjects + */ +struct _lv_observer_t { + lv_subject_t * subject; /**< Observed subject */ + lv_observer_cb_t cb; /**< Callback that notifies when value changes */ + void * target; /**< A target for the observer, e.g. a widget or any pointer */ + void * user_data; /**< Additional parameter supplied when subscribing */ + uint32_t auto_free_user_data : 1; /**< Automatically free user data when observer is removed */ + uint32_t notified : 1; /**< Was observer already notified? */ + uint32_t for_obj : 1; /**< Is `target` a pointer to a Widget (`lv_obj_t *`)? */ +}; + +/** + * Descriptor created by `lv_obj_add_subject_increment_event()` + */ +struct _lv_subject_increment_dsc_t { + lv_subject_t * subject; /**< The subject to adjust*/ + int32_t step; /**< The step add to the subject */ + bool rollover; /**< Where to start over from the other end when one end is exceeded*/ + int32_t min_value; /**< Don't set a value smaller than this */ + int32_t max_value; /**< Don't set a value larger than this */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_OBSERVER */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBSERVER_PRIVATE_H*/ diff --git a/inc/lvgl/src/core/lv_refr.c b/inc/lvgl/src/core/lv_refr.c new file mode 100644 index 0000000..e34dd83 --- /dev/null +++ b/inc/lvgl/src/core/lv_refr.c @@ -0,0 +1,1466 @@ +/** + * @file lv_refr.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_refr_private.h" +#include "lv_obj_draw_private.h" +#include "../misc/lv_area_private.h" +#include "../draw/sw/lv_draw_sw_mask_private.h" +#include "../draw/lv_draw_mask.h" +#include "lv_obj_private.h" +#include "lv_obj_event_private.h" +#include "../display/lv_display.h" +#include "../display/lv_display_private.h" +#include "../tick/lv_tick.h" +#include "../misc/lv_timer_private.h" +#include "../misc/lv_math.h" +#include "../misc/lv_profiler.h" +#include "../misc/lv_types.h" +#include "../draw/lv_draw_private.h" +#include "../stdlib/lv_string.h" +#include "lv_global.h" + +/********************* + * DEFINES + *********************/ + +/*Display being refreshed*/ +#define disp_refr LV_GLOBAL_DEFAULT()->disp_refresh + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_refr_join_area(void); +static void refr_invalid_areas(void); +static void refr_sync_areas(void); +static void refr_area(const lv_area_t * area_p, int32_t y_offset); +static void refr_configured_layer(lv_layer_t * layer); +static void refr_obj_and_children(lv_layer_t * layer, lv_obj_t * top_obj); +static uint32_t get_max_row(lv_display_t * disp, int32_t area_w, int32_t area_h); +static void draw_buf_flush(lv_display_t * disp); +static void call_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void wait_for_flushing(lv_display_t * disp); +static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_type_t layer_type, + lv_area_t * layer_area_out, lv_area_t * obj_draw_size_out); +static bool alpha_test_area_on_obj(lv_obj_t * obj, const lv_area_t * area); +#if LV_DRAW_TRANSFORM_USE_MATRIX + static bool refr_check_obj_clip_overflow(lv_layer_t * layer, lv_obj_t * obj); + static void refr_obj_matrix(lv_layer_t * layer, lv_obj_t * obj); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_DISP_REFR + #define LV_TRACE_REFR(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_REFR(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the screen refresh subsystem + */ +void lv_refr_init(void) +{ +} + +void lv_refr_deinit(void) +{ +} + +void lv_refr_now(lv_display_t * disp) +{ + lv_anim_refr_now(); + + if(disp) { + if(disp->refr_timer) lv_display_refr_timer(disp->refr_timer); + } + else { + lv_display_t * d; + d = lv_display_get_next(NULL); + while(d) { + if(d->refr_timer) lv_display_refr_timer(d->refr_timer); + d = lv_display_get_next(d); + } + } +} + +void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj) +{ + LV_PROFILER_REFR_BEGIN; + lv_area_t clip_area_ori = layer->_clip_area; + lv_area_t clip_coords_for_obj; + + /*The widget will be rendered. + *So setters from now should use animations. */ + obj->rendered = 1; + + /*Truncate the clip area to `obj size + ext size` area*/ + lv_area_t obj_coords_ext; + lv_obj_get_coords(obj, &obj_coords_ext); + int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); + lv_area_increase(&obj_coords_ext, ext_draw_size, ext_draw_size); + + if(!lv_area_intersect(&clip_coords_for_obj, &clip_area_ori, &obj_coords_ext)) { + LV_PROFILER_REFR_END; + return; + } + /*If the object is visible on the current clip area*/ + layer->_clip_area = clip_coords_for_obj; + + lv_obj_send_event(obj, LV_EVENT_DRAW_MAIN_BEGIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_MAIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_MAIN_END, layer); +#if LV_USE_REFR_DEBUG + lv_color_t debug_color = lv_color_make(lv_rand(0, 0xFF), lv_rand(0, 0xFF), lv_rand(0, 0xFF)); + lv_draw_rect_dsc_t draw_dsc; + lv_draw_rect_dsc_init(&draw_dsc); + draw_dsc.bg_color = debug_color; + draw_dsc.bg_opa = LV_OPA_20; + draw_dsc.border_width = 1; + draw_dsc.border_opa = LV_OPA_30; + draw_dsc.border_color = debug_color; + lv_draw_rect(layer, &draw_dsc, &obj_coords_ext); +#endif + + const lv_area_t * obj_coords; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + obj_coords = &obj_coords_ext; + } + else { + obj_coords = &obj->coords; + } + lv_area_t clip_coords_for_children; + bool refr_children = true; + if(!lv_area_intersect(&clip_coords_for_children, &layer->_clip_area, obj_coords) || layer->opa <= LV_OPA_MIN) { + refr_children = false; + } + + if(refr_children) { + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + if(child_cnt == 0) { + /*If the object was visible on the clip area call the post draw events too*/ + /*If all the children are redrawn make 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer); + } + else { + layer->_clip_area = clip_coords_for_children; + bool clip_corner = lv_obj_get_style_clip_corner(obj, LV_PART_MAIN); + + int32_t radius = 0; + if(clip_corner) { + radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); + if(radius == 0) clip_corner = false; + } + + if(clip_corner == false) { + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_refr(layer, child); + } + + /*If the object was visible on the clip area call the post draw events too*/ + /*If all the children are redrawn make 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer); + } + else { + lv_layer_t * layer_children; + lv_draw_mask_rect_dsc_t mask_draw_dsc; + lv_draw_mask_rect_dsc_init(&mask_draw_dsc); + mask_draw_dsc.radius = radius; + mask_draw_dsc.area = obj->coords; + + lv_draw_image_dsc_t img_draw_dsc; + lv_draw_image_dsc_init(&img_draw_dsc); + + int32_t short_side = LV_MIN(lv_area_get_width(&obj->coords), lv_area_get_height(&obj->coords)); + int32_t rout = LV_MIN(radius, short_side >> 1); + + lv_area_t bottom = obj->coords; + bottom.y1 = bottom.y2 - rout + 1; + if(lv_area_intersect(&bottom, &bottom, &layer->_clip_area)) { + layer_children = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &bottom); + + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_refr(layer_children, child); + } + + /*If all the children are redrawn send 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer_children); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer_children); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer_children); + + lv_draw_mask_rect(layer_children, &mask_draw_dsc); + + img_draw_dsc.src = layer_children; + lv_draw_layer(layer, &img_draw_dsc, &bottom); + } + + lv_area_t top = obj->coords; + top.y2 = top.y1 + rout - 1; + if(lv_area_intersect(&top, &top, &layer->_clip_area)) { + layer_children = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &top); + + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_refr(layer_children, child); + } + + /*If all the children are redrawn send 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer_children); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer_children); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer_children); + + lv_draw_mask_rect(layer_children, &mask_draw_dsc); + + img_draw_dsc.src = layer_children; + lv_draw_layer(layer, &img_draw_dsc, &top); + + } + + lv_area_t mid = obj->coords; + mid.y1 += rout; + mid.y2 -= rout; + if(lv_area_intersect(&mid, &mid, &layer->_clip_area)) { + layer->_clip_area = mid; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + lv_obj_refr(layer, child); + } + + /*If all the children are redrawn make 'post draw' draw*/ + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_BEGIN, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST, layer); + lv_obj_send_event(obj, LV_EVENT_DRAW_POST_END, layer); + + } + + } + } + } + + layer->_clip_area = clip_area_ori; + + LV_PROFILER_REFR_END; +} + +lv_result_t lv_inv_area(lv_display_t * disp, const lv_area_t * area_p) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return LV_RESULT_INVALID; + if(!lv_display_is_invalidation_enabled(disp)) return LV_RESULT_INVALID; + + /** + * There are two reasons for this issue: + * 1.LVGL API is being used across threads, such as modifying widget properties in another thread + * or within an interrupt handler during the main thread rendering process. + * 2.User-customized widget modify widget properties/styles again within the DRAW event. + * + * Therefore, ensure that LVGL is used in a single-threaded manner, or refer to + * documentation: https://docs.lvgl.io/master/porting/os.html for proper locking mechanisms. + * Additionally, ensure that only drawing-related tasks are performed within the DRAW event, + * and move widget property/style modifications to other events. + */ + LV_ASSERT_MSG(!disp->rendering_in_progress, "Invalidate area is not allowed during rendering."); + + /*Clear the invalidate buffer if the parameter is NULL*/ + if(area_p == NULL) { + disp->inv_p = 0; + return LV_RESULT_OK; + } + + lv_area_t scr_area; + scr_area.x1 = 0; + scr_area.y1 = 0; + scr_area.x2 = lv_display_get_horizontal_resolution(disp) - 1; + scr_area.y2 = lv_display_get_vertical_resolution(disp) - 1; + + lv_area_t com_area; + bool suc; + + suc = lv_area_intersect(&com_area, area_p, &scr_area); + if(suc == false) return LV_RESULT_INVALID; /*Out of the screen*/ + + if(disp->color_format == LV_COLOR_FORMAT_I1) { + /*Make sure that the X coordinates start and end on byte boundary. + *E.g. convert 11;27 to 8;31*/ + com_area.x1 &= ~0x7; /*Round down: Nx8*/ + com_area.x2 |= 0x7; /*Round up: Nx8 - 1*/ + } + + /*If there were at least 1 invalid area in full refresh mode, redraw the whole screen*/ + if(disp->render_mode == LV_DISPLAY_RENDER_MODE_FULL) { + disp->inv_areas[0] = scr_area; + disp->inv_p = 1; + lv_display_send_event(disp, LV_EVENT_REFR_REQUEST, NULL); + return LV_RESULT_OK; + } + + lv_result_t res = lv_display_send_event(disp, LV_EVENT_INVALIDATE_AREA, &com_area); + if(res != LV_RESULT_OK) return LV_RESULT_INVALID; + + /*Save only if this area is not in one of the saved areas*/ + uint16_t i; + for(i = 0; i < disp->inv_p; i++) { + if(lv_area_is_in(&com_area, &disp->inv_areas[i], 0) != false) return LV_RESULT_OK; + } + + /*Save the area*/ + lv_area_t * tmp_area_p = &com_area; + if(disp->inv_p >= LV_INV_BUF_SIZE) { /*If no place for the area add the screen*/ + disp->inv_p = 0; + tmp_area_p = &scr_area; + } + lv_area_copy(&disp->inv_areas[disp->inv_p], tmp_area_p); + disp->inv_p++; + + lv_display_send_event(disp, LV_EVENT_REFR_REQUEST, NULL); + + return LV_RESULT_OK; +} + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +lv_display_t * lv_refr_get_disp_refreshing(void) +{ + return disp_refr; +} + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +void lv_refr_set_disp_refreshing(lv_display_t * disp) +{ + disp_refr = disp; +} + +void lv_display_refr_timer(lv_timer_t * tmr) +{ + LV_PROFILER_REFR_BEGIN; + LV_TRACE_REFR("begin"); + + if(tmr) { + disp_refr = tmr->user_data; + /* Ensure the timer does not run again automatically. + * This is done before refreshing in case refreshing invalidates something else. + * However if the performance monitor is enabled keep the timer running to count the FPS.*/ +#if !LV_USE_PERF_MONITOR + lv_timer_pause(tmr); +#endif + } + else { + disp_refr = lv_display_get_default(); + } + + if(disp_refr == NULL) { + LV_LOG_WARN("No display registered"); + LV_PROFILER_REFR_END; + return; + } + + lv_draw_buf_t * buf_act = disp_refr->buf_act; + if(!(buf_act && buf_act->data && buf_act->data_size)) { + LV_LOG_WARN("No draw buffer"); + LV_PROFILER_REFR_END; + return; + } + + lv_result_t res = lv_display_send_event(disp_refr, LV_EVENT_REFR_START, NULL); + if(res == LV_RESULT_INVALID) { + LV_TRACE_REFR("deleted"); + LV_PROFILER_REFR_END; + return; + } + + /*Refresh the screen's layout if required*/ + LV_PROFILER_LAYOUT_BEGIN_TAG("layout"); + lv_obj_update_layout(disp_refr->act_scr); + if(disp_refr->prev_scr) lv_obj_update_layout(disp_refr->prev_scr); + + lv_obj_update_layout(disp_refr->bottom_layer); + lv_obj_update_layout(disp_refr->top_layer); + lv_obj_update_layout(disp_refr->sys_layer); + LV_PROFILER_LAYOUT_END_TAG("layout"); + + /*Do nothing if there is no active screen*/ + if(disp_refr->act_scr == NULL) { + disp_refr->inv_p = 0; + LV_LOG_WARN("there is no active screen"); + goto refr_finish; + } + + lv_refr_join_area(); + refr_sync_areas(); + refr_invalid_areas(); + + if(disp_refr->inv_p == 0) goto refr_finish; + /*In double buffered direct mode save the updated areas. + *They will be used on the next call to synchronize the buffers.*/ + if(lv_display_is_double_buffered(disp_refr) && disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_DIRECT) { + uint32_t i; + for(i = 0; i < disp_refr->inv_p; i++) { + if(disp_refr->inv_area_joined[i]) + continue; + + lv_area_t * sync_area = lv_ll_ins_tail(&disp_refr->sync_areas); + *sync_area = disp_refr->inv_areas[i]; + } + } + + lv_memzero(disp_refr->inv_areas, sizeof(disp_refr->inv_areas)); + lv_memzero(disp_refr->inv_area_joined, sizeof(disp_refr->inv_area_joined)); + disp_refr->inv_p = 0; + +refr_finish: + +#if LV_DRAW_SW_COMPLEX == 1 + lv_draw_sw_mask_cleanup(); +#endif + + lv_display_send_event(disp_refr, LV_EVENT_REFR_READY, NULL); + + LV_TRACE_REFR("finished"); + LV_PROFILER_REFR_END; +} + +/** + * Search the most top object which fully covers an area + * @param area_p pointer to an area + * @param obj the first object to start the searching (typically a screen) + * @return + */ +lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj) +{ + lv_obj_t * found_p = NULL; + + if(lv_area_is_in(area_p, &obj->coords, 0) == false) return NULL; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL; + if(lv_obj_get_layer_type(obj) != LV_LAYER_TYPE_NONE) return NULL; + if(lv_obj_get_style_opa(obj, LV_PART_MAIN) < LV_OPA_MAX) return NULL; + + /*If this object is fully cover the draw area then check the children too*/ + lv_cover_check_info_t info; + info.res = LV_COVER_RES_COVER; + info.area = area_p; + lv_obj_send_event(obj, LV_EVENT_COVER_CHECK, &info); + if(info.res == LV_COVER_RES_MASKED) return NULL; + + int32_t i; + int32_t child_cnt = lv_obj_get_child_count(obj); + for(i = child_cnt - 1; i >= 0; i--) { + lv_obj_t * child = obj->spec_attr->children[i]; + found_p = lv_refr_get_top_obj(area_p, child); + + /*If a children is ok then break*/ + if(found_p != NULL) { + break; + } + } + + /*If no better children use this object*/ + if(found_p == NULL && info.res == LV_COVER_RES_COVER) { + found_p = obj; + } + + return found_p; +} + + +void lv_obj_refr(lv_layer_t * layer, lv_obj_t * obj) +{ + LV_ASSERT_NULL(layer); + LV_ASSERT_NULL(obj); + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return; + + /*If `opa_layered != LV_OPA_COVER` draw the widget on a new layer and blend that layer with the given opacity.*/ + const lv_opa_t opa_layered = lv_obj_get_style_opa_layered(obj, LV_PART_MAIN); + if(opa_layered <= LV_OPA_MIN) return; + + const lv_opa_t layer_opa_ori = layer->opa; + const lv_color32_t layer_recolor = layer->recolor; + + /*Normal `opa` (not layered) will just scale down `bg_opa`, `text_opa`, etc, in the upcoming drawings.*/ + const lv_opa_t opa_main = lv_obj_get_style_opa(obj, LV_PART_MAIN); + if(opa_main < LV_OPA_MAX) { + layer->opa = LV_OPA_MIX2(layer_opa_ori, opa_main); + } + + layer->recolor = lv_obj_style_apply_recolor(obj, LV_PART_MAIN, layer->recolor); + + lv_layer_type_t layer_type = lv_obj_get_layer_type(obj); + if(layer_type == LV_LAYER_TYPE_NONE) { + lv_obj_redraw(layer, obj); + } +#if LV_DRAW_TRANSFORM_USE_MATRIX + /*If the layer opa is full then use the matrix transform*/ + else if(opa_layered >= LV_OPA_MAX && !refr_check_obj_clip_overflow(layer, obj)) { + refr_obj_matrix(layer, obj); + } +#endif /* LV_DRAW_TRANSFORM_USE_MATRIX */ + else { + lv_area_t layer_area_full; + lv_area_t obj_draw_size; + lv_result_t res = layer_get_area(layer, obj, layer_type, &layer_area_full, &obj_draw_size); + if(res != LV_RESULT_OK) { + layer->opa = layer_opa_ori; + layer->recolor = layer_recolor; + return; + } + + /*Simple layers can be subdivided into smaller layers*/ + uint32_t max_rgb_row_height = lv_area_get_height(&layer_area_full); + uint32_t max_argb_row_height = lv_area_get_height(&layer_area_full); + if(layer_type == LV_LAYER_TYPE_SIMPLE) { + int32_t w = lv_area_get_width(&layer_area_full); + uint8_t px_size = lv_color_format_get_size(disp_refr->color_format); + max_rgb_row_height = LV_DRAW_LAYER_SIMPLE_BUF_SIZE / w / px_size; + max_argb_row_height = LV_DRAW_LAYER_SIMPLE_BUF_SIZE / w / sizeof(lv_color32_t); + } + + lv_area_t layer_area_act; + layer_area_act.x1 = layer_area_full.x1; + layer_area_act.x2 = layer_area_full.x2; + layer_area_act.y1 = layer_area_full.y1; + layer_area_act.y2 = layer_area_full.y1; + + while(layer_area_act.y2 < layer_area_full.y2) { + /* Test with an RGB layer size (which is larger than the ARGB layer size) + * If it really doesn't need alpha use it. Else switch to the ARGB size*/ + layer_area_act.y2 = layer_area_act.y1 + max_rgb_row_height - 1; + if(layer_area_act.y2 > layer_area_full.y2) layer_area_act.y2 = layer_area_full.y2; + + const void * bitmap_mask_src = lv_obj_get_style_bitmap_mask_src(obj, LV_PART_MAIN); + bool area_need_alpha = bitmap_mask_src || alpha_test_area_on_obj(obj, &layer_area_act); + + if(area_need_alpha) { + layer_area_act.y2 = layer_area_act.y1 + max_argb_row_height - 1; + if(layer_area_act.y2 > layer_area_full.y2) layer_area_act.y2 = layer_area_full.y2; + } + + lv_layer_t * new_layer = lv_draw_layer_create(layer, + area_need_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE, &layer_area_act); + lv_obj_redraw(new_layer, obj); + + lv_point_t pivot = { + .x = lv_obj_get_style_transform_pivot_x(obj, LV_PART_MAIN), + .y = lv_obj_get_style_transform_pivot_y(obj, LV_PART_MAIN) + }; + + if(LV_COORD_IS_PCT(pivot.x)) { + pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100; + } + if(LV_COORD_IS_PCT(pivot.y)) { + pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100; + } + + lv_draw_image_dsc_t layer_draw_dsc; + lv_draw_image_dsc_init(&layer_draw_dsc); + layer_draw_dsc.pivot.x = obj->coords.x1 + pivot.x - new_layer->buf_area.x1; + layer_draw_dsc.pivot.y = obj->coords.y1 + pivot.y - new_layer->buf_area.y1; + + layer_draw_dsc.opa = opa_layered; + layer_draw_dsc.rotation = lv_obj_get_style_transform_rotation(obj, LV_PART_MAIN); + while(layer_draw_dsc.rotation > 3600) layer_draw_dsc.rotation -= 3600; + while(layer_draw_dsc.rotation < 0) layer_draw_dsc.rotation += 3600; + layer_draw_dsc.scale_x = lv_obj_get_style_transform_scale_x(obj, LV_PART_MAIN); + layer_draw_dsc.scale_y = lv_obj_get_style_transform_scale_y(obj, LV_PART_MAIN); + layer_draw_dsc.skew_x = lv_obj_get_style_transform_skew_x(obj, LV_PART_MAIN); + layer_draw_dsc.skew_y = lv_obj_get_style_transform_skew_y(obj, LV_PART_MAIN); + layer_draw_dsc.blend_mode = lv_obj_get_style_blend_mode(obj, LV_PART_MAIN); + layer_draw_dsc.antialias = disp_refr->antialiasing; + layer_draw_dsc.bitmap_mask_src = bitmap_mask_src; + layer_draw_dsc.image_area = obj_draw_size; + layer_draw_dsc.src = new_layer; + + lv_draw_layer(layer, &layer_draw_dsc, &layer_area_act); + + layer_area_act.y1 = layer_area_act.y2 + 1; + } + } + + /* Restore the original layer opa and recolor */ + layer->opa = layer_opa_ori; + layer->recolor = layer_recolor; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Join the areas which has got common parts + */ +static void lv_refr_join_area(void) +{ + LV_PROFILER_REFR_BEGIN; + uint32_t join_from; + uint32_t join_in; + lv_area_t joined_area; + for(join_in = 0; join_in < disp_refr->inv_p; join_in++) { + if(disp_refr->inv_area_joined[join_in] != 0) continue; + + /*Check all areas to join them in 'join_in'*/ + for(join_from = 0; join_from < disp_refr->inv_p; join_from++) { + /*Handle only unjoined areas and ignore itself*/ + if(disp_refr->inv_area_joined[join_from] != 0 || join_in == join_from) { + continue; + } + + /*Check if the areas are on each other*/ + if(lv_area_is_on(&disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]) == false) { + continue; + } + + lv_area_join(&joined_area, &disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]); + + /*Join two area only if the joined area size is smaller*/ + if(lv_area_get_size(&joined_area) < (lv_area_get_size(&disp_refr->inv_areas[join_in]) + + lv_area_get_size(&disp_refr->inv_areas[join_from]))) { + lv_area_copy(&disp_refr->inv_areas[join_in], &joined_area); + + /*Mark 'join_form' is joined into 'join_in'*/ + disp_refr->inv_area_joined[join_from] = 1; + } + } + } + LV_PROFILER_REFR_END; +} + +/** + * Refresh the sync areas + */ +static void refr_sync_areas(void) +{ + /*Do not sync if not direct or double buffered*/ + if(disp_refr->render_mode != LV_DISPLAY_RENDER_MODE_DIRECT) return; + + /*Do not sync if not double buffered*/ + if(!lv_display_is_double_buffered(disp_refr)) return; + + /*Do not sync if no sync areas*/ + if(lv_ll_is_empty(&disp_refr->sync_areas)) return; + + LV_PROFILER_REFR_BEGIN; + /*With double buffered direct mode synchronize the rendered areas to the other buffer*/ + /*We need to wait for ready here to not mess up the active screen*/ + wait_for_flushing(disp_refr); + + /*The buffers are already swapped. + *So the active buffer is the off screen buffer where LVGL will render*/ + lv_draw_buf_t * off_screen = disp_refr->buf_act; + /*Triple buffer sync buffer for off-screen2 updates.*/ + lv_draw_buf_t * off_screen2; + lv_draw_buf_t * on_screen; + + if(disp_refr->buf_act == disp_refr->buf_1) { + off_screen2 = disp_refr->buf_2; + on_screen = disp_refr->buf_3 ? disp_refr->buf_3 : disp_refr->buf_2; + } + else if(disp_refr->buf_act == disp_refr->buf_2) { + off_screen2 = disp_refr->buf_3 ? disp_refr->buf_3 : disp_refr->buf_1; + on_screen = disp_refr->buf_1; + } + else { + off_screen2 = disp_refr->buf_1; + on_screen = disp_refr->buf_2; + } + + uint32_t hor_res = lv_display_get_horizontal_resolution(disp_refr); + uint32_t ver_res = lv_display_get_vertical_resolution(disp_refr); + + /*Iterate through invalidated areas to see if sync area should be copied*/ + uint16_t i; + int8_t j; + lv_area_t res[4] = {0}; + int8_t res_c; + lv_area_t * sync_area, * new_area, * next_area; + for(i = 0; i < disp_refr->inv_p; i++) { + /*Skip joined areas*/ + if(disp_refr->inv_area_joined[i]) continue; + + /*Iterate over sync areas*/ + sync_area = lv_ll_get_head(&disp_refr->sync_areas); + while(sync_area != NULL) { + /*Get next sync area*/ + next_area = lv_ll_get_next(&disp_refr->sync_areas, sync_area); + + /*Remove intersect of redraw area from sync area and get remaining areas*/ + res_c = lv_area_diff(res, sync_area, &disp_refr->inv_areas[i]); + + /*New sub areas created after removing intersect*/ + if(res_c != -1) { + /*Replace old sync area with new areas*/ + for(j = 0; j < res_c; j++) { + new_area = lv_ll_ins_prev(&disp_refr->sync_areas, sync_area); + *new_area = res[j]; + } + lv_ll_remove(&disp_refr->sync_areas, sync_area); + lv_free(sync_area); + } + + /*Move on to next sync area*/ + sync_area = next_area; + } + } + + lv_area_t disp_area = {0, 0, (int32_t)hor_res - 1, (int32_t)ver_res - 1}; + /*Copy sync areas (if any remaining)*/ + for(sync_area = lv_ll_get_head(&disp_refr->sync_areas); sync_area != NULL; + sync_area = lv_ll_get_next(&disp_refr->sync_areas, sync_area)) { + /** + * @todo Resize SDL window will trigger crash because of sync_area is larger than disp_area + */ + if(!lv_area_intersect(sync_area, sync_area, &disp_area)) { + continue; + } +#if LV_DRAW_TRANSFORM_USE_MATRIX + if(lv_display_get_matrix_rotation(disp_refr)) { + lv_display_rotate_area(disp_refr, sync_area); + } +#endif + lv_draw_buf_copy(off_screen, sync_area, on_screen, sync_area); + if(off_screen2 != on_screen) + lv_draw_buf_copy(off_screen2, sync_area, on_screen, sync_area); + } + + /*Clear sync areas*/ + lv_ll_clear(&disp_refr->sync_areas); + LV_PROFILER_REFR_END; +} + +/** + * Refresh the joined areas + */ +static void refr_invalid_areas(void) +{ + if(disp_refr->inv_p == 0) return; + LV_PROFILER_REFR_BEGIN; + + /*Notify the display driven rendering has started*/ + lv_display_send_event(disp_refr, LV_EVENT_RENDER_START, NULL); + + /*Find the last area which will be drawn*/ + int32_t i; + int32_t last_i = 0; + for(i = disp_refr->inv_p - 1; i >= 0; i--) { + if(disp_refr->inv_area_joined[i] == 0) { + last_i = i; + break; + } + } + + disp_refr->last_area = 0; + disp_refr->last_part = 0; + disp_refr->rendering_in_progress = true; + + for(i = 0; i < (int32_t)disp_refr->inv_p; i++) { + /*Refresh the unjoined areas*/ + if(disp_refr->inv_area_joined[i]) continue; + + if(i == last_i) disp_refr->last_area = 1; + disp_refr->last_part = 0; + + lv_area_t inv_a = disp_refr->inv_areas[i]; + if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { + /*Calculate the max row num*/ + int32_t w = lv_area_get_width(&inv_a); + int32_t h = lv_area_get_height(&inv_a); + + int32_t max_row = get_max_row(disp_refr, w, h); + + int32_t row; + int32_t row_last = 0; + lv_area_t sub_area; + sub_area.x1 = inv_a.x1; + sub_area.x2 = inv_a.x2; + int32_t y_off = 0; + for(row = inv_a.y1; row + max_row - 1 <= inv_a.y2; row += max_row) { + /*Calc. the next y coordinates of draw_buf*/ + sub_area.y1 = row; + sub_area.y2 = row + max_row - 1; + if(sub_area.y2 > inv_a.y2) sub_area.y2 = inv_a.y2; + row_last = sub_area.y2; + if(inv_a.y2 == row_last) disp_refr->last_part = 1; + refr_area(&sub_area, y_off); + y_off += lv_area_get_height(&sub_area); + draw_buf_flush(disp_refr); + } + + /*If the last y coordinates are not handled yet ...*/ + if(inv_a.y2 != row_last) { + /*Calc. the next y coordinates of draw_buf*/ + sub_area.y1 = row; + sub_area.y2 = inv_a.y2; + disp_refr->last_part = 1; + refr_area(&sub_area, y_off); + y_off += lv_area_get_height(&sub_area); + draw_buf_flush(disp_refr); + } + } + else if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_FULL || + disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_DIRECT) { + disp_refr->last_part = 1; + refr_area(&disp_refr->inv_areas[i], 0); + draw_buf_flush(disp_refr); + } + } + + lv_display_send_event(disp_refr, LV_EVENT_RENDER_READY, NULL); + disp_refr->rendering_in_progress = false; + LV_PROFILER_REFR_END; +} + +/** + * Reshape the draw buffer if required + * @param layer pointer to a layer which will be drawn + */ +static void layer_reshape_draw_buf(lv_layer_t * layer, uint32_t stride) +{ + lv_draw_buf_t * ret = lv_draw_buf_reshape( + layer->draw_buf, + layer->color_format, + lv_area_get_width(&layer->buf_area), + lv_area_get_height(&layer->buf_area), + stride); + LV_UNUSED(ret); + LV_ASSERT_NULL(ret); +} + +/** + * Refresh an area if there is Virtual Display Buffer + * @param area_p pointer to an area to refresh + */ +static void refr_area(const lv_area_t * area_p, int32_t y_offset) +{ + LV_PROFILER_REFR_BEGIN; + lv_layer_t * layer = disp_refr->layer_head; + layer->draw_buf = disp_refr->buf_act; + layer->_clip_area = *area_p; + layer->phy_clip_area = *area_p; + layer->partial_y_offset = y_offset; + layer->all_tasks_added = false; + + if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { + /*In partial mode render this area to the buffer*/ + layer->buf_area = *area_p; + layer_reshape_draw_buf(layer, LV_STRIDE_AUTO); + } + else if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_DIRECT || + disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_FULL) { + /*In direct mode and full mode the buffer area is always the whole screen, not considering rotation*/ + layer->buf_area.x1 = 0; + layer->buf_area.y1 = 0; + if(lv_display_get_matrix_rotation(disp_refr)) { + layer->buf_area.x2 = lv_display_get_original_horizontal_resolution(disp_refr) - 1; + layer->buf_area.y2 = lv_display_get_original_vertical_resolution(disp_refr) - 1; + } + else { + layer->buf_area.x2 = lv_display_get_horizontal_resolution(disp_refr) - 1; + layer->buf_area.y2 = lv_display_get_vertical_resolution(disp_refr) - 1; + } + layer_reshape_draw_buf(layer, disp_refr->stride_is_auto ? LV_STRIDE_AUTO : layer->draw_buf->header.stride); + } + + /*Try to divide the area to smaller tiles*/ + uint32_t tile_cnt = 1; + int32_t tile_h = lv_area_get_height(area_p); + if(LV_COLOR_FORMAT_IS_INDEXED(layer->color_format) == false) { + /* Assume that the buffer size (can be screen sized or smaller in case of partial mode) + * and max tile size are the optimal scenario. From this calculate the ideal tile size + * and set the tile count and tile height accordingly. + */ + uint32_t max_tile_cnt = disp_refr->tile_cnt; + uint32_t total_buf_size = layer->draw_buf->data_size; + uint32_t ideal_tile_size = total_buf_size / max_tile_cnt; + uint32_t area_buf_size = lv_area_get_size(area_p) * lv_color_format_get_size(layer->color_format); + + tile_cnt = (area_buf_size + (ideal_tile_size - 1)) / ideal_tile_size; /*Round up*/ + tile_h = lv_area_get_height(area_p) / tile_cnt; + } + + if(tile_cnt == 1) { + refr_configured_layer(layer); + layer->all_tasks_added = true; + } + else { + /* Don't draw to the layers buffer of the display but create smaller dummy layers which are using the + * display's layer buffer. These will be the tiles. By using tiles it's more likely that there will + * be independent areas for each draw unit. */ + lv_layer_t * tile_layers = lv_malloc(tile_cnt * sizeof(lv_layer_t)); + LV_ASSERT_MALLOC(tile_layers); + if(tile_layers == NULL) { + disp_refr->refreshed_area = *area_p; + LV_PROFILER_REFR_END; + return; + } + uint32_t i; + for(i = 0; i < tile_cnt; i++) { + lv_area_t tile_area; + lv_area_set(&tile_area, area_p->x1, area_p->y1 + i * tile_h, + area_p->x2, area_p->y1 + (i + 1) * tile_h - 1); + + if(i == tile_cnt - 1) { + tile_area.y2 = area_p->y2; + } + + lv_layer_t * tile_layer = &tile_layers[i]; + lv_draw_layer_init(tile_layer, NULL, layer->color_format, &tile_area); + tile_layer->buf_area = layer->buf_area; /*the buffer is still large*/ + tile_layer->draw_buf = layer->draw_buf; + refr_configured_layer(tile_layer); + tile_layer->all_tasks_added = true; + } + + + /*Wait until all tiles are ready and destroy remove them*/ + for(i = 0; i < tile_cnt; i++) { + lv_layer_t * tile_layer = &tile_layers[i]; + while(tile_layer->draw_task_head) { + lv_draw_dispatch_wait_for_request(); + lv_draw_dispatch(); + } + + lv_layer_t * layer_i = disp_refr->layer_head; + while(layer_i) { + if(layer_i->next == tile_layer) { + layer_i->next = tile_layer->next; + break; + } + layer_i = layer_i->next; + } + + lv_draw_unit_send_event(NULL, LV_EVENT_CHILD_DELETED, tile_layer); + if(disp_refr->layer_deinit) disp_refr->layer_deinit(disp_refr, tile_layer); + } + lv_free(tile_layers); + + layer->all_tasks_added = true; + } + + disp_refr->refreshed_area = *area_p; + LV_PROFILER_REFR_END; +} + +static void refr_configured_layer(lv_layer_t * layer) +{ + LV_PROFILER_REFR_BEGIN; + + lv_layer_reset(layer); + +#if LV_DRAW_TRANSFORM_USE_MATRIX + if(lv_display_get_matrix_rotation(disp_refr)) { + const lv_display_rotation_t rotation = lv_display_get_rotation(disp_refr); + if(rotation != LV_DISPLAY_ROTATION_0) { + lv_display_rotate_area(disp_refr, &layer->phy_clip_area); + + /** + * The screen rotation direction defined by LVGL is opposite to the drawing angle. + * Use direct matrix assignment to reduce precision loss and improve efficiency. + */ + switch(rotation) { + case LV_DISPLAY_ROTATION_90: + /** + * lv_matrix_rotate(&layer->matrix, 270); + * lv_matrix_translate(&layer->matrix, -disp_refr->ver_res, 0); + */ + layer->matrix.m[0][0] = 0; + layer->matrix.m[0][1] = 1; + layer->matrix.m[0][2] = 0; + layer->matrix.m[1][0] = -1; + layer->matrix.m[1][1] = 0; + layer->matrix.m[1][2] = disp_refr->ver_res; + break; + + case LV_DISPLAY_ROTATION_180: + /** + * lv_matrix_rotate(&layer->matrix, 180); + * lv_matrix_translate(&layer->matrix, -disp_refr->hor_res, -disp_refr->ver_res); + */ + layer->matrix.m[0][0] = -1; + layer->matrix.m[0][1] = 0; + layer->matrix.m[0][2] = disp_refr->hor_res; + layer->matrix.m[1][0] = 0; + layer->matrix.m[1][1] = -1; + layer->matrix.m[1][2] = disp_refr->ver_res; + break; + + case LV_DISPLAY_ROTATION_270: + /** + * lv_matrix_rotate(&layer->matrix, 90); + * lv_matrix_translate(&layer->matrix, 0, -disp_refr->hor_res); + */ + layer->matrix.m[0][0] = 0; + layer->matrix.m[0][1] = -1; + layer->matrix.m[0][2] = disp_refr->hor_res; + layer->matrix.m[1][0] = 1; + layer->matrix.m[1][1] = 0; + layer->matrix.m[1][2] = 0; + break; + + default: + LV_LOG_WARN("Invalid rotation: %d", rotation); + break; + } + } + } +#endif /* LV_DRAW_TRANSFORM_USE_MATRIX */ + + /* In single buffered mode wait here until the buffer is freed. + * Else we would draw into the buffer while it's still being transferred to the display*/ + if(!lv_display_is_double_buffered(disp_refr)) { + wait_for_flushing(disp_refr); + } + /*If the screen is transparent initialize it when the flushing is ready*/ + if(lv_color_format_has_alpha(disp_refr->color_format)) { + lv_area_t clear_area = layer->_clip_area; + lv_area_move(&clear_area, -layer->buf_area.x1, -layer->buf_area.y1); + lv_draw_buf_clear(layer->draw_buf, &clear_area); + } + + lv_obj_t * top_act_scr = NULL; + lv_obj_t * top_prev_scr = NULL; + + /*Get the most top object which is not covered by others*/ + top_act_scr = lv_refr_get_top_obj(&layer->_clip_area, lv_display_get_screen_active(disp_refr)); + if(disp_refr->prev_scr) { + top_prev_scr = lv_refr_get_top_obj(&layer->_clip_area, disp_refr->prev_scr); + } + + /*Draw a bottom layer background if there is no top object*/ + if(top_act_scr == NULL && top_prev_scr == NULL) { + refr_obj_and_children(layer, lv_display_get_layer_bottom(disp_refr)); + } + + if(disp_refr->draw_prev_over_act) { + if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr; + refr_obj_and_children(layer, top_act_scr); + + /*Refresh the previous screen if any*/ + if(disp_refr->prev_scr) { + if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr; + refr_obj_and_children(layer, top_prev_scr); + } + } + else { + /*Refresh the previous screen if any*/ + if(disp_refr->prev_scr) { + if(top_prev_scr == NULL) top_prev_scr = disp_refr->prev_scr; + refr_obj_and_children(layer, top_prev_scr); + } + + if(top_act_scr == NULL) top_act_scr = disp_refr->act_scr; + refr_obj_and_children(layer, top_act_scr); + } + + /*Also refresh top and sys layer unconditionally*/ + refr_obj_and_children(layer, lv_display_get_layer_top(disp_refr)); + refr_obj_and_children(layer, lv_display_get_layer_sys(disp_refr)); + + LV_PROFILER_REFR_END; +} + +/** + * Make the refreshing from an object. Draw all its children and the youngers too. + * @param top_p pointer to an objects. Start the drawing from it. + * @param mask_p pointer to an area, the objects will be drawn only here + */ +static void refr_obj_and_children(lv_layer_t * layer, lv_obj_t * top_obj) +{ + /*Normally always will be a top_obj (at least the screen) + *but in special cases (e.g. if the screen has alpha) it won't. + *In this case use the screen directly*/ + if(top_obj == NULL) top_obj = lv_display_get_screen_active(disp_refr); + if(top_obj == NULL) return; /*Shouldn't happen*/ + + LV_PROFILER_REFR_BEGIN; + /*Draw the 'younger' sibling objects because they can be on top_obj*/ + lv_obj_t * parent; + lv_obj_t * border_p = top_obj; + + parent = lv_obj_get_parent(top_obj); + + /*Calculate the recolor before the parent*/ + if(parent) { + layer->recolor = lv_obj_get_style_recolor_recursive(parent, LV_PART_MAIN); + } + + /*Refresh the top object and its children*/ + lv_obj_refr(layer, top_obj); + + /*Do until not reach the screen*/ + while(parent != NULL) { + bool go = false; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(parent); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + if(!go) { + if(child == border_p) go = true; + } + else { + /*Refresh the objects*/ + lv_obj_refr(layer, child); + } + } + + /*Call the post draw function of the parents of the to object*/ + lv_obj_send_event(parent, LV_EVENT_DRAW_POST_BEGIN, (void *)layer); + lv_obj_send_event(parent, LV_EVENT_DRAW_POST, (void *)layer); + lv_obj_send_event(parent, LV_EVENT_DRAW_POST_END, (void *)layer); + + /*The new border will be the last parents, + *so the 'younger' brothers of parent will be refreshed*/ + border_p = parent; + /*Go a level deeper*/ + parent = lv_obj_get_parent(parent); + } + LV_PROFILER_REFR_END; +} + +static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_type_t layer_type, + lv_area_t * layer_area_out, lv_area_t * obj_draw_size_out) +{ + int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); + lv_obj_get_coords(obj, obj_draw_size_out); + lv_area_increase(obj_draw_size_out, ext_draw_size, ext_draw_size); + + if(layer_type == LV_LAYER_TYPE_TRANSFORM) { + /*Get the transformed area and clip it to the current clip area. + *This area needs to be updated on the screen.*/ + lv_area_t clip_coords_for_obj; + lv_area_t tranf_coords = *obj_draw_size_out; + lv_obj_get_transformed_area(obj, &tranf_coords, LV_OBJ_POINT_TRANSFORM_FLAG_NONE); + if(!lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &tranf_coords)) { + return LV_RESULT_INVALID; + } + + /*Transform back (inverse) the transformed area. + *It will tell which area of the non-transformed widget needs to be redrawn + *in order to cover transformed area after transformation.*/ + lv_area_t inverse_clip_coords_for_obj = clip_coords_for_obj; + lv_obj_get_transformed_area(obj, &inverse_clip_coords_for_obj, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE); + if(!lv_area_intersect(&inverse_clip_coords_for_obj, &inverse_clip_coords_for_obj, obj_draw_size_out)) { + return LV_RESULT_INVALID; + } + + *layer_area_out = inverse_clip_coords_for_obj; + lv_area_increase(layer_area_out, 5, 5); /*To avoid rounding error*/ + } + else if(layer_type == LV_LAYER_TYPE_SIMPLE) { + lv_area_t clip_coords_for_obj; + if(!lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, obj_draw_size_out)) { + return LV_RESULT_INVALID; + } + *layer_area_out = clip_coords_for_obj; + } + else { + LV_LOG_WARN("Unhandled layer type"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +static bool alpha_test_area_on_obj(lv_obj_t * obj, const lv_area_t * area) +{ + /*Test for alpha by assuming there is no alpha. If it fails, fall back to rendering with alpha*/ + /*If the layer area is not fully on the object, it can't fully cover it*/ + if(!lv_area_is_on(area, &obj->coords)) return true; + + lv_cover_check_info_t info; + info.res = LV_COVER_RES_COVER; + info.area = area; + lv_obj_send_event(obj, LV_EVENT_COVER_CHECK, &info); + if(info.res == LV_COVER_RES_COVER) return false; + else return true; +} + +#if LV_DRAW_TRANSFORM_USE_MATRIX + +static bool obj_get_matrix(lv_obj_t * obj, lv_matrix_t * matrix) +{ + lv_matrix_identity(matrix); + + const lv_matrix_t * obj_matrix = lv_obj_get_transform(obj); + if(obj_matrix) { + lv_matrix_translate(matrix, obj->coords.x1, obj->coords.y1); + lv_matrix_multiply(matrix, obj_matrix); + lv_matrix_translate(matrix, -obj->coords.x1, -obj->coords.y1); + return true; + } + + lv_point_t pivot = { + .x = lv_obj_get_style_transform_pivot_x(obj, LV_PART_MAIN), + .y = lv_obj_get_style_transform_pivot_y(obj, LV_PART_MAIN) + }; + + pivot.x = obj->coords.x1 + lv_pct_to_px(pivot.x, lv_area_get_width(&obj->coords)); + pivot.y = obj->coords.y1 + lv_pct_to_px(pivot.y, lv_area_get_height(&obj->coords)); + + int32_t rotation = lv_obj_get_style_transform_rotation(obj, LV_PART_MAIN); + int32_t scale_x = lv_obj_get_style_transform_scale_x(obj, LV_PART_MAIN); + int32_t scale_y = lv_obj_get_style_transform_scale_y(obj, LV_PART_MAIN); + int32_t skew_x = lv_obj_get_style_transform_skew_x(obj, LV_PART_MAIN); + int32_t skew_y = lv_obj_get_style_transform_skew_y(obj, LV_PART_MAIN); + + if(scale_x <= 0 || scale_y <= 0) { + /* NOT draw if scale is negative or zero */ + return false; + } + + /* generate the obj matrix */ + lv_matrix_translate(matrix, pivot.x, pivot.y); + if(rotation != 0) { + lv_matrix_rotate(matrix, rotation * 0.1f); + } + + if(scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + lv_matrix_scale( + matrix, + (float)scale_x / LV_SCALE_NONE, + (float)scale_y / LV_SCALE_NONE + ); + } + + if(skew_x != 0 || skew_y != 0) { + lv_matrix_skew(matrix, skew_x, skew_y); + } + + lv_matrix_translate(matrix, -pivot.x, -pivot.y); + return true; +} + +static void refr_obj_matrix(lv_layer_t * layer, lv_obj_t * obj) +{ + LV_PROFILER_REFR_BEGIN; + lv_matrix_t obj_matrix; + if(!obj_get_matrix(obj, &obj_matrix)) { + /* NOT draw if obj matrix is not available */ + LV_PROFILER_REFR_END; + return; + } + + lv_matrix_t matrix_inv; + if(!lv_matrix_inverse(&matrix_inv, &obj_matrix)) { + /* NOT draw if matrix is not invertible */ + LV_PROFILER_REFR_END; + return; + } + + /* save original matrix */ + lv_matrix_t ori_matrix = layer->matrix; + + /* apply the obj matrix */ + lv_matrix_multiply(&layer->matrix, &obj_matrix); + + /* calculate clip area without transform */ + lv_area_t clip_area = layer->_clip_area; + lv_area_t clip_area_ori = layer->_clip_area; + clip_area = lv_matrix_transform_area(&matrix_inv, &clip_area); + + /* increase the clip area by 1 pixel to avoid rounding errors */ + if(!lv_matrix_is_identity_or_translation(&obj_matrix)) { + lv_area_increase(&clip_area, 1, 1); + } + + layer->_clip_area = clip_area; + + /* redraw obj */ + lv_obj_redraw(layer, obj); + + /* restore original matrix */ + layer->matrix = ori_matrix; + /* restore clip area */ + layer->_clip_area = clip_area_ori; + LV_PROFILER_REFR_END; +} + +static bool refr_check_obj_clip_overflow(lv_layer_t * layer, lv_obj_t * obj) +{ + if(lv_obj_get_style_transform_rotation(obj, LV_PART_MAIN) == 0) { + return false; + } + + /*Truncate the area to the object*/ + lv_area_t obj_coords; + int32_t ext_size = lv_obj_get_ext_draw_size(obj); + lv_area_copy(&obj_coords, &obj->coords); + lv_area_increase(&obj_coords, ext_size, ext_size); + + lv_obj_get_transformed_area(obj, &obj_coords, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE); + + lv_area_t clip_coords_for_obj; + if(!lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &obj_coords)) { + return false; + } + + bool has_clip = lv_memcmp(&clip_coords_for_obj, &obj_coords, sizeof(lv_area_t)) != 0; + return has_clip; +} + +#endif /* LV_DRAW_TRANSFORM_USE_MATRIX */ + +static uint32_t get_max_row(lv_display_t * disp, int32_t area_w, int32_t area_h) +{ + lv_color_format_t cf = disp->color_format; + uint32_t stride = lv_draw_buf_width_to_stride(area_w, cf); + uint32_t overhead = LV_COLOR_INDEXED_PALETTE_SIZE(cf) * sizeof(lv_color32_t); + + if(stride == 0) { + LV_LOG_WARN("Invalid stride. Value is 0"); + return 0; + } + + int32_t max_row = (uint32_t)(disp->buf_act->data_size - overhead) / stride; + + if(max_row > area_h) max_row = area_h; + + /*Round down the lines of draw_buf if rounding is added*/ + lv_area_t tmp; + tmp.x1 = 0; + tmp.x2 = 0; + tmp.y1 = 0; + + int32_t h_tmp = max_row; + do { + tmp.y2 = h_tmp - 1; + lv_display_send_event(disp_refr, LV_EVENT_INVALIDATE_AREA, &tmp); + + /*If this height fits into `max_row` then fine*/ + if(lv_area_get_height(&tmp) <= max_row) break; + + /*Decrement the height of the area until it fits into `max_row` after rounding*/ + h_tmp--; + } while(h_tmp > 0); + + if(h_tmp <= 0) { + LV_LOG_WARN("Can't set draw_buf height using the round function. (Wrong round_cb or too " + "small draw_buf)"); + return 0; + } + else { + max_row = tmp.y2 + 1; + } + + return max_row; +} + +/** + * Flush the content of the draw buffer + */ +static void draw_buf_flush(lv_display_t * disp) +{ + /*Flush the rendered content to the display*/ + lv_layer_t * layer = disp->layer_head; + + while(layer->draw_task_head) { + lv_draw_dispatch_wait_for_request(); + lv_draw_dispatch(); + } + + /* In double buffered mode wait until the other buffer is freed + * and driver is ready to receive the new buffer. + * If we need to wait here it means that the content of one buffer is being sent to display + * and other buffer already contains the new rendered image. */ + if(lv_display_is_double_buffered(disp)) { + wait_for_flushing(disp_refr); + } + + disp->flushing = 1; + + if(disp->last_area && disp->last_part) disp->flushing_last = 1; + else disp->flushing_last = 0; + + bool flushing_last = disp->flushing_last; + + if(disp->flush_cb) { + call_flush_cb(disp, &disp->refreshed_area, layer->draw_buf->data); + } + /*If there are 2 buffers swap them. With direct mode swap only on the last area*/ + if(lv_display_is_double_buffered(disp) && (disp->render_mode != LV_DISPLAY_RENDER_MODE_DIRECT || flushing_last)) { + if(disp->buf_act == disp->buf_1) { + disp->buf_act = disp->buf_2; + } + else if(disp->buf_act == disp->buf_2) { + disp->buf_act = disp->buf_3 ? disp->buf_3 : disp->buf_1; + } + else { + disp->buf_act = disp->buf_1; + } + } +} + +static void call_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + LV_PROFILER_REFR_BEGIN; + LV_TRACE_REFR("Calling flush_cb on (%d;%d)(%d;%d) area with %p image pointer", + (int)area->x1, (int)area->y1, (int)area->x2, (int)area->y2, (void *)px_map); + + lv_area_t offset_area = { + .x1 = area->x1 + disp->offset_x, + .y1 = area->y1 + disp->offset_y, + .x2 = area->x2 + disp->offset_x, + .y2 = area->y2 + disp->offset_y + }; + + lv_display_send_event(disp, LV_EVENT_FLUSH_START, &offset_area); + + /*For backward compatibility support LV_COLOR_16_SWAP (from v8)*/ +#if defined(LV_COLOR_16_SWAP) && LV_COLOR_16_SWAP + lv_draw_sw_rgb565_swap(px_map, lv_area_get_size(&offset_area)); +#endif + + disp->flush_cb(disp, &offset_area, px_map); + lv_display_send_event(disp, LV_EVENT_FLUSH_FINISH, &offset_area); + + LV_PROFILER_REFR_END; +} + +static void wait_for_flushing(lv_display_t * disp) +{ + LV_PROFILER_REFR_BEGIN; + LV_LOG_TRACE("begin"); + + lv_display_send_event(disp, LV_EVENT_FLUSH_WAIT_START, NULL); + + if(disp->flush_wait_cb) { + if(disp->flushing) { + disp->flush_wait_cb(disp); + disp->flushing = 0; + } + } + else { + while(disp->flushing); + } + disp->flushing_last = 0; + + lv_display_send_event(disp, LV_EVENT_FLUSH_WAIT_FINISH, NULL); + + LV_LOG_TRACE("end"); + LV_PROFILER_REFR_END; +} diff --git a/inc/lvgl/src/core/lv_refr.h b/inc/lvgl/src/core/lv_refr.h new file mode 100644 index 0000000..1756e32 --- /dev/null +++ b/inc/lvgl/src/core/lv_refr.h @@ -0,0 +1,74 @@ +/** + * @file lv_refr.h + * + */ + +#ifndef LV_REFR_H +#define LV_REFR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "../display/lv_display.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Redraw the invalidated areas now. + * Normally the redrawing is periodically executed in `lv_timer_handler` but a long blocking process + * can prevent the call of `lv_timer_handler`. In this case if the GUI is updated in the process + * (e.g. progress bar) this function can be called when the screen should be updated. + * @param disp pointer to display to refresh. NULL to refresh all displays. + */ +void lv_refr_now(lv_display_t * disp); + +/** + * Redrawn on object and all its children using the passed draw context + * @param layer pointer to a layer where to draw. + * @param obj the start object from the redraw should start + */ +void lv_obj_redraw(lv_layer_t * layer, lv_obj_t * obj); + +/** + * Called periodically to handle the refreshing + * @param timer pointer to the timer itself, or `NULL` + */ +void lv_display_refr_timer(lv_timer_t * timer); + +/********************** + * STATIC FUNCTIONS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_REFR_H*/ diff --git a/inc/lvgl/src/core/lv_refr_private.h b/inc/lvgl/src/core/lv_refr_private.h new file mode 100644 index 0000000..79c2ede --- /dev/null +++ b/inc/lvgl/src/core/lv_refr_private.h @@ -0,0 +1,85 @@ +/** + * @file lv_refr_private.h + * + */ + +#ifndef LV_REFR_PRIVATE_H +#define LV_REFR_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_refr.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the screen refresh subsystem + */ +void lv_refr_init(void); + +/** + * Deinitialize the screen refresh subsystem + */ +void lv_refr_deinit(void); + +/** + * Invalidate an area on display to redraw it + * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) + * @param disp pointer to display where the area should be invalidated (NULL can be used if there is + * only one display) + * @return LV_RESULT_OK: the area is invalidated; LV_RESULT_INVALID: the area wasn't invalidated. + */ +lv_result_t lv_inv_area(lv_display_t * disp, const lv_area_t * area_p); + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +lv_display_t * lv_refr_get_disp_refreshing(void); + +/** + * Set the display which is being refreshed + * @param disp the display being refreshed + */ +void lv_refr_set_disp_refreshing(lv_display_t * disp); + +/** + * Search the most top object which fully covers an area + * @param area_p pointer to an area + * @param obj the first object to start the searching (typically a screen) + * @return + */ +lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj); + +/** + * Render an object to a layer + * @param layer target drawing layer + * @param obj object to render + */ +void lv_obj_refr(lv_layer_t * layer, lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_REFR_PRIVATE_H*/ diff --git a/inc/lvgl/src/debugging/monkey/lv_monkey.c b/inc/lvgl/src/debugging/monkey/lv_monkey.c new file mode 100644 index 0000000..824eba1 --- /dev/null +++ b/inc/lvgl/src/debugging/monkey/lv_monkey.c @@ -0,0 +1,178 @@ +/** + * @file lv_monkey.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_monkey_private.h" + +#if LV_USE_MONKEY != 0 + +#include "../../misc/lv_math.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_mem.h" +#include "../../display/lv_display.h" + +/********************* + * DEFINES + *********************/ +#define MONKEY_PERIOD_RANGE_MIN_DEF 100 +#define MONKEY_PERIOD_RANGE_MAX_DEF 1000 + +/********************** + * TYPEDEFS + **********************/ +struct _lv_monkey_t { + lv_monkey_config_t config; + lv_indev_data_t indev_data; + lv_indev_t * indev; + lv_timer_t * timer; + void * user_data; +}; + +static const lv_key_t lv_key_map[] = { + LV_KEY_UP, + LV_KEY_DOWN, + LV_KEY_RIGHT, + LV_KEY_LEFT, + LV_KEY_ESC, + LV_KEY_DEL, + LV_KEY_BACKSPACE, + LV_KEY_ENTER, + LV_KEY_NEXT, + LV_KEY_PREV, + LV_KEY_HOME, + LV_KEY_END, +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_monkey_read_cb(lv_indev_t * indev, lv_indev_data_t * data); +static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig); +static void lv_monkey_timer_cb(lv_timer_t * timer); + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_monkey_config_init(lv_monkey_config_t * config) +{ + lv_memzero(config, sizeof(lv_monkey_config_t)); + config->type = LV_INDEV_TYPE_POINTER; + config->period_range.min = MONKEY_PERIOD_RANGE_MIN_DEF; + config->period_range.max = MONKEY_PERIOD_RANGE_MAX_DEF; +} + +lv_monkey_t * lv_monkey_create(const lv_monkey_config_t * config) +{ + lv_monkey_t * monkey = lv_malloc_zeroed(sizeof(lv_monkey_t)); + LV_ASSERT_MALLOC(monkey); + + monkey->config = *config; + monkey->timer = lv_timer_create(lv_monkey_timer_cb, monkey->config.period_range.min, monkey); + lv_timer_pause(monkey->timer); + + monkey->indev = lv_indev_create(); + lv_indev_set_type(monkey->indev, config->type); + lv_indev_set_read_cb(monkey->indev, lv_monkey_read_cb); + lv_indev_set_user_data(monkey->indev, monkey); + return monkey; +} + +lv_indev_t * lv_monkey_get_indev(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + return monkey->indev; +} + +void lv_monkey_set_enable(lv_monkey_t * monkey, bool en) +{ + LV_ASSERT_NULL(monkey); + en ? lv_timer_resume(monkey->timer) : lv_timer_pause(monkey->timer); +} + +bool lv_monkey_get_enable(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + return !lv_timer_get_paused(monkey->timer); +} + +void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data) +{ + LV_ASSERT_NULL(monkey); + monkey->user_data = user_data; +} + +void * lv_monkey_get_user_data(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + return monkey->user_data; +} + +void lv_monkey_delete(lv_monkey_t * monkey) +{ + LV_ASSERT_NULL(monkey); + + lv_timer_delete(monkey->timer); + lv_indev_delete(monkey->indev); + lv_free(monkey); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_monkey_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_monkey_t * monkey = lv_indev_get_user_data(indev); + + data->btn_id = monkey->indev_data.btn_id; + data->point = monkey->indev_data.point; + data->enc_diff = monkey->indev_data.enc_diff; + data->state = monkey->indev_data.state; +} + +static int32_t lv_monkey_random(int32_t howsmall, int32_t howbig) +{ + if(howsmall >= howbig) { + return howsmall; + } + int32_t diff = howbig - howsmall; + return (int32_t)lv_rand(0, diff) + howsmall; +} + +static void lv_monkey_timer_cb(lv_timer_t * timer) +{ + lv_monkey_t * monkey = lv_timer_get_user_data(timer); + lv_indev_data_t * data = &monkey->indev_data; + + switch(lv_indev_get_type(monkey->indev)) { + case LV_INDEV_TYPE_POINTER: + data->point.x = (int32_t)lv_monkey_random(0, LV_HOR_RES - 1); + data->point.y = (int32_t)lv_monkey_random(0, LV_VER_RES - 1); + break; + case LV_INDEV_TYPE_ENCODER: + data->enc_diff = (int16_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max); + break; + case LV_INDEV_TYPE_BUTTON: + data->btn_id = (uint32_t)lv_monkey_random(monkey->config.input_range.min, monkey->config.input_range.max); + break; + case LV_INDEV_TYPE_KEYPAD: { + int32_t index = lv_monkey_random(0, sizeof(lv_key_map) / sizeof(lv_key_map[0]) - 1); + data->key = lv_key_map[index]; + break; + } + default: + break; + } + + data->state = lv_monkey_random(0, 100) < 50 ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED; + + lv_timer_set_period(monkey->timer, lv_monkey_random(monkey->config.period_range.min, monkey->config.period_range.max)); +} + +#endif /*LV_USE_MONKEY*/ diff --git a/inc/lvgl/src/debugging/monkey/lv_monkey.h b/inc/lvgl/src/debugging/monkey/lv_monkey.h new file mode 100644 index 0000000..12886f9 --- /dev/null +++ b/inc/lvgl/src/debugging/monkey/lv_monkey.h @@ -0,0 +1,119 @@ +/** + * @file lv_monkey.h + * + */ +#ifndef LV_MONKEY_H +#define LV_MONKEY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_MONKEY != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_monkey_t lv_monkey_t; + +typedef struct { + int32_t min; + int32_t max; +} lv_range_t; + +typedef struct { + uint32_t min; + uint32_t max; +} lv_urange_t; + +struct _lv_monkey_config_t { + /** Input device type */ + lv_indev_type_t type; + + /** Monkey execution period */ + lv_urange_t period_range; + + /** The range of input value */ + lv_range_t input_range; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a monkey config with default values + * @param config pointer to 'lv_monkey_config_t' variable to initialize + */ +void lv_monkey_config_init(lv_monkey_config_t * config); + +/** + * Create monkey for test + * @param config pointer to 'lv_monkey_config_t' variable + * @return pointer to the created monkey + */ +lv_monkey_t * lv_monkey_create(const lv_monkey_config_t * config); + +/** + * Get monkey input device + * @param monkey pointer to a monkey + * @return pointer to the input device + */ +lv_indev_t * lv_monkey_get_indev(lv_monkey_t * monkey); + +/** + * Enable monkey + * @param monkey pointer to a monkey + * @param en set to true to enable + */ +void lv_monkey_set_enable(lv_monkey_t * monkey, bool en); + +/** + * Get whether monkey is enabled + * @param monkey pointer to a monkey + * @return return true if monkey enabled + */ +bool lv_monkey_get_enable(lv_monkey_t * monkey); + +/** + * Set the user_data field of the monkey + * @param monkey pointer to a monkey + * @param user_data pointer to the new user_data. + */ +void lv_monkey_set_user_data(lv_monkey_t * monkey, void * user_data); + +/** + * Get the user_data field of the monkey + * @param monkey pointer to a monkey + * @return the pointer to the user_data of the monkey + */ +void * lv_monkey_get_user_data(lv_monkey_t * monkey); + +/** + * Delete monkey + * @param monkey pointer to monkey + */ +void lv_monkey_delete(lv_monkey_t * monkey); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MONKEY*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MONKEY_H*/ diff --git a/inc/lvgl/src/debugging/monkey/lv_monkey_private.h b/inc/lvgl/src/debugging/monkey/lv_monkey_private.h new file mode 100644 index 0000000..a08ea07 --- /dev/null +++ b/inc/lvgl/src/debugging/monkey/lv_monkey_private.h @@ -0,0 +1,43 @@ +/** + * @file lv_monkey_private.h + * + */ + +#ifndef LV_MONKEY_PRIVATE_H +#define LV_MONKEY_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_monkey.h" + +#if LV_USE_MONKEY != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_MONKEY != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MONKEY_PRIVATE_H*/ diff --git a/inc/lvgl/src/debugging/sysmon/lv_sysmon.c b/inc/lvgl/src/debugging/sysmon/lv_sysmon.c new file mode 100644 index 0000000..f0665b2 --- /dev/null +++ b/inc/lvgl/src/debugging/sysmon/lv_sysmon.c @@ -0,0 +1,412 @@ +/** + * @file lv_sysmon.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_sysmon_private.h" +#include "../../misc/lv_timer_private.h" + +#if LV_USE_SYSMON + +#include "../../core/lv_global.h" +#include "../../misc/lv_async.h" +#include "../../stdlib/lv_string.h" +#include "../../widgets/label/lv_label.h" +#include "../../display/lv_display_private.h" + +/********************* + * DEFINES + *********************/ +#ifndef LV_SYSMON_REFR_PERIOD_DEF + #define LV_SYSMON_REFR_PERIOD_DEF 300 /* ms */ +#endif + +#if LV_USE_MEM_MONITOR + #define sysmon_mem LV_GLOBAL_DEFAULT()->sysmon_mem +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_USE_PERF_MONITOR + static void perf_update_timer_cb(lv_timer_t * t); + static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject); + static void perf_monitor_disp_event_cb(lv_event_t * e); + static void perf_dump_info(lv_display_t * disp); + static void perf_control(lv_display_t * disp, bool start); +#endif + +#if LV_USE_MEM_MONITOR + static void mem_update_timer_cb(lv_timer_t * t); + static void mem_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_sysmon_builtin_init(void) +{ + +#if LV_USE_MEM_MONITOR + static lv_mem_monitor_t mem_info; + lv_subject_init_pointer(&sysmon_mem.subject, &mem_info); + sysmon_mem.timer = lv_timer_create(mem_update_timer_cb, LV_SYSMON_REFR_PERIOD_DEF, &mem_info); +#endif +} + +void lv_sysmon_builtin_deinit(void) +{ +#if LV_USE_MEM_MONITOR + lv_timer_delete(sysmon_mem.timer); +#endif +} + +lv_obj_t * lv_sysmon_create(lv_display_t * disp) +{ + LV_LOG_INFO("begin"); + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) { + LV_LOG_WARN("There is no default display"); + return NULL; + } + + lv_obj_t * label = lv_label_create(lv_display_get_layer_sys(disp)); + lv_obj_set_style_bg_opa(label, LV_OPA_50, 0); + lv_obj_set_style_bg_color(label, lv_color_black(), 0); + lv_obj_set_style_text_color(label, lv_color_white(), 0); + lv_obj_set_style_pad_all(label, 3, 0); + lv_label_set_text(label, "?"); + return label; +} + +#if LV_USE_PERF_MONITOR + +void lv_sysmon_show_performance(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) { + LV_LOG_WARN("There is no default display"); + return; + } + + if(disp->perf_label == NULL) { + disp->perf_label = lv_sysmon_create(disp); + if(disp->perf_label == NULL) { + LV_LOG_WARN("Couldn't create sysmon"); + return; + } + + lv_subject_init_pointer(&disp->perf_sysmon_backend.subject, &disp->perf_sysmon_info); + lv_obj_align(disp->perf_label, LV_USE_PERF_MONITOR_POS, 0, 0); + lv_subject_add_observer_obj(&disp->perf_sysmon_backend.subject, perf_observer_cb, disp->perf_label, NULL); + disp->perf_sysmon_backend.timer = lv_timer_create(perf_update_timer_cb, LV_SYSMON_REFR_PERIOD_DEF, disp); + lv_display_add_event_cb(disp, perf_monitor_disp_event_cb, LV_EVENT_ALL, NULL); + } + +#if LV_USE_PERF_MONITOR_LOG_MODE + lv_obj_add_flag(disp->perf_label, LV_OBJ_FLAG_HIDDEN); +#else + lv_obj_remove_flag(disp->perf_label, LV_OBJ_FLAG_HIDDEN); +#endif +} + +void lv_sysmon_hide_performance(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) { + LV_LOG_WARN("There is no default display"); + return; + } + + lv_obj_add_flag(disp->perf_label, LV_OBJ_FLAG_HIDDEN); +} + +void lv_sysmon_performance_dump(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) { + LV_LOG_WARN("There is no default display"); + return; + } + perf_dump_info(disp); +} + +void lv_sysmon_performance_resume(lv_display_t * disp) +{ + perf_control(disp, true); +} + +void lv_sysmon_performance_pause(lv_display_t * disp) +{ + perf_control(disp, false); +} + +#endif + +#if LV_USE_MEM_MONITOR + +void lv_sysmon_show_memory(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) { + LV_LOG_WARN("There is no default display"); + return; + } + + if(disp->mem_label == NULL) { + disp->mem_label = lv_sysmon_create(disp); + if(disp->mem_label == NULL) { + LV_LOG_WARN("Couldn't create sysmon"); + return; + } + + lv_obj_align(disp->mem_label, LV_USE_MEM_MONITOR_POS, 0, 0); + lv_subject_add_observer_obj(&sysmon_mem.subject, mem_observer_cb, disp->mem_label, NULL); + } + + lv_obj_remove_flag(disp->mem_label, LV_OBJ_FLAG_HIDDEN); +} + +void lv_sysmon_hide_memory(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) { + LV_LOG_WARN("There is no default display"); + return; + } + + lv_obj_add_flag(disp->mem_label, LV_OBJ_FLAG_HIDDEN); +} + +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_USE_PERF_MONITOR + +static void perf_monitor_disp_event_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_target(e); + lv_event_code_t code = lv_event_get_code(e); + lv_sysmon_perf_info_t * info = &disp->perf_sysmon_info; + + switch(code) { + case LV_EVENT_REFR_START: + info->measured.refr_interval_sum += lv_tick_elaps(info->measured.refr_start); + info->measured.refr_start = lv_tick_get(); + break; + case LV_EVENT_REFR_READY: + info->measured.refr_elaps_sum += lv_tick_elaps(info->measured.refr_start); + info->measured.refr_cnt++; + break; + case LV_EVENT_RENDER_START: + info->measured.render_in_progress = 1; + info->measured.render_start = lv_tick_get(); + break; + case LV_EVENT_RENDER_READY: + info->measured.render_in_progress = 0; + info->measured.render_elaps_sum += lv_tick_elaps(info->measured.render_start); + info->measured.render_cnt++; + break; + case LV_EVENT_FLUSH_START: + case LV_EVENT_FLUSH_WAIT_START: + if(info->measured.render_in_progress) { + info->measured.flush_in_render_start = lv_tick_get(); + } + else { + info->measured.flush_not_in_render_start = lv_tick_get(); + } + break; + case LV_EVENT_FLUSH_FINISH: + case LV_EVENT_FLUSH_WAIT_FINISH: + if(info->measured.render_in_progress) { + info->measured.flush_in_render_elaps_sum += lv_tick_elaps(info->measured.flush_in_render_start); + } + else { + info->measured.flush_not_in_render_elaps_sum += lv_tick_elaps(info->measured.flush_not_in_render_start); + } + break; + case LV_EVENT_DELETE: + lv_timer_delete(disp->perf_sysmon_backend.timer); + lv_subject_deinit(&disp->perf_sysmon_backend.subject); + break; + default: + break; + } +} + +static void perf_dump_info(lv_display_t * disp) +{ + uint32_t LV_SYSMON_GET_IDLE(void); + + lv_sysmon_perf_info_t * info = &disp->perf_sysmon_info; + info->calculated.run_cnt++; + + uint32_t time_since_last_report = lv_tick_elaps(info->measured.last_report_timestamp); + lv_timer_t * disp_refr_timer = lv_display_get_refr_timer(NULL); + uint32_t disp_refr_period = disp_refr_timer ? disp_refr_timer->period : LV_DEF_REFR_PERIOD; + + info->calculated.fps = time_since_last_report ? (1000 * info->measured.refr_cnt / time_since_last_report) : 0; + info->calculated.fps = LV_MIN(info->calculated.fps, + 1000 / disp_refr_period); /*Limit due to possible off-by-one error*/ + + info->calculated.cpu = 100 - LV_SYSMON_GET_IDLE(); +#if LV_SYSMON_PROC_IDLE_AVAILABLE + uint32_t LV_SYSMON_GET_PROC_IDLE(void); + info->calculated.cpu_proc = 100 - LV_SYSMON_GET_PROC_IDLE(); +#endif /*LV_SYSMON_PROC_IDLE_AVAILABLE*/ + info->calculated.refr_avg_time = info->measured.refr_cnt ? (info->measured.refr_elaps_sum / info->measured.refr_cnt) : + 0; + + info->calculated.flush_avg_time = info->measured.render_cnt ? + ((info->measured.flush_in_render_elaps_sum + info->measured.flush_not_in_render_elaps_sum) + / info->measured.render_cnt) : 0; + /*Flush time was measured in rendering time so subtract it*/ + info->calculated.render_avg_time = info->measured.render_cnt ? ((info->measured.render_elaps_sum - + info->measured.flush_in_render_elaps_sum) / + info->measured.render_cnt) : 0; + + info->calculated.cpu_avg_total = ((info->calculated.cpu_avg_total * (info->calculated.run_cnt - 1)) + + info->calculated.cpu) / info->calculated.run_cnt; + info->calculated.fps_avg_total = ((info->calculated.fps_avg_total * (info->calculated.run_cnt - 1)) + + info->calculated.fps) / info->calculated.run_cnt; + + lv_subject_set_pointer(&disp->perf_sysmon_backend.subject, info); + + lv_sysmon_perf_info_t prev_info = *info; + lv_memzero(info, sizeof(lv_sysmon_perf_info_t)); + info->measured.refr_start = prev_info.measured.refr_start; + info->calculated.cpu_avg_total = prev_info.calculated.cpu_avg_total; +#if LV_SYSMON_PROC_IDLE_AVAILABLE + info->calculated.cpu_proc = prev_info.calculated.cpu_proc; +#endif /*LV_SYSMON_PROC_IDLE_AVAILABLE*/ + info->calculated.fps_avg_total = prev_info.calculated.fps_avg_total; + info->calculated.run_cnt = prev_info.calculated.run_cnt; + + info->measured.last_report_timestamp = lv_tick_get(); +} + +static void perf_update_timer_cb(lv_timer_t * t) +{ + lv_display_t * disp = lv_timer_get_user_data(t); + + perf_dump_info(disp); +} + +static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + const lv_sysmon_perf_info_t * perf = lv_subject_get_pointer(subject); + +#if LV_USE_PERF_MONITOR_LOG_MODE + LV_UNUSED(observer); +#if LV_SYSMON_PROC_IDLE_AVAILABLE + LV_LOG("sysmon: " + "%" LV_PRIu32 " FPS (refr_cnt: %" LV_PRIu32 " | redraw_cnt: %" LV_PRIu32"), " + "refr %" LV_PRIu32 "ms (render %" LV_PRIu32 "ms | flush %" LV_PRIu32 "ms), " + "CPU (total %" LV_PRIu32 "%% proc %" LV_PRIu32 "%%)\n", + perf->calculated.fps, perf->measured.refr_cnt, perf->measured.render_cnt, + perf->calculated.refr_avg_time, perf->calculated.render_avg_time, perf->calculated.flush_avg_time, + perf->calculated.cpu, perf->calculated.cpu_proc); +#else + LV_LOG("sysmon: " + "%" LV_PRIu32 " FPS (refr_cnt: %" LV_PRIu32 " | redraw_cnt: %" LV_PRIu32"), " + "refr %" LV_PRIu32 "ms (render %" LV_PRIu32 "ms | flush %" LV_PRIu32 "ms), " + "CPU %" LV_PRIu32 "%%\n", + perf->calculated.fps, perf->measured.refr_cnt, perf->measured.render_cnt, + perf->calculated.refr_avg_time, perf->calculated.render_avg_time, perf->calculated.flush_avg_time, + perf->calculated.cpu); +#endif +#else + lv_obj_t * label = lv_observer_get_target(observer); +#if LV_SYSMON_PROC_IDLE_AVAILABLE + lv_label_set_text_fmt( + label, + "%" LV_PRIu32" FPS | CPU (%" LV_PRIu32 "%% | %" LV_PRIu32 "%%)\n" + "%" LV_PRIu32" ms (%" LV_PRIu32" | %" LV_PRIu32")", + perf->calculated.fps, perf->calculated.cpu, perf->calculated.cpu_proc, + perf->calculated.render_avg_time + perf->calculated.flush_avg_time, + perf->calculated.render_avg_time, perf->calculated.flush_avg_time + ); +#else + lv_label_set_text_fmt( + label, + "%" LV_PRIu32" FPS, %" LV_PRIu32 "%% CPU\n" + "%" LV_PRIu32" ms (%" LV_PRIu32" | %" LV_PRIu32")", + perf->calculated.fps, perf->calculated.cpu, + perf->calculated.render_avg_time + perf->calculated.flush_avg_time, + perf->calculated.render_avg_time, perf->calculated.flush_avg_time + ); +#endif /*LV_SYSMON_PROC_IDLE_AVAILABLE*/ +#endif /*LV_USE_PERF_MONITOR_LOG_MODE*/ +} + +static void perf_control(lv_display_t * disp, bool start) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) { + LV_LOG_WARN("There is no default display"); + return; + } + + if(disp->perf_sysmon_backend.timer == NULL) return; + + if(start) { + lv_timer_resume(disp->perf_sysmon_backend.timer); + } + else { + lv_timer_pause(disp->perf_sysmon_backend.timer); + } +} + +#endif + +#if LV_USE_MEM_MONITOR + +static void mem_update_timer_cb(lv_timer_t * t) +{ + lv_mem_monitor_t * mem_mon = lv_timer_get_user_data(t); + lv_mem_monitor(mem_mon); + lv_subject_set_pointer(&sysmon_mem.subject, mem_mon); +} + +static void mem_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_obj_t * label = lv_observer_get_target(observer); + const lv_mem_monitor_t * mon = lv_subject_get_pointer(subject); + + size_t used_size = mon->total_size - mon->free_size; + size_t used_kb = used_size / 1024; + size_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102; + size_t max_used_kb = mon->max_used / 1024; + size_t max_used_kb_tenth = (mon->max_used - (max_used_kb * 1024)) / 102; + lv_label_set_text_fmt(label, + "%zu.%zu kB (%d%%)\n" + "%zu.%zu kB max, %d%% frag.", + used_kb, used_kb_tenth, mon->used_pct, + max_used_kb, max_used_kb_tenth, + mon->frag_pct); +} + +#endif + +#endif /*LV_USE_SYSMON*/ diff --git a/inc/lvgl/src/debugging/sysmon/lv_sysmon.h b/inc/lvgl/src/debugging/sysmon/lv_sysmon.h new file mode 100644 index 0000000..7893677 --- /dev/null +++ b/inc/lvgl/src/debugging/sysmon/lv_sysmon.h @@ -0,0 +1,113 @@ +/** + * @file lv_sysmon.h + * + */ + +#ifndef LV_SYSMON_H +#define LV_SYSMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../misc/lv_timer.h" +#include "../../core/lv_observer.h" + +#if LV_USE_SYSMON + +#if LV_USE_LABEL == 0 +#error "lv_sysmon: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " +#endif + +#if LV_USE_OBSERVER == 0 +#error "lv_observer: lv_observer is required. Enable it in lv_conf.h (LV_USE_OBSERVER 1) " +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a new system monitor label + * @param disp create the sys. mon. on this display's system layer + * @return the create label + */ +lv_obj_t * lv_sysmon_create(lv_display_t * disp); + +#if LV_USE_PERF_MONITOR + +/** + * Show system performance monitor: CPU usage and FPS count + * @param disp target display, NULL: use the default displays + */ +void lv_sysmon_show_performance(lv_display_t * disp); + +/** + * Hide system performance monitor + * @param disp target display, NULL: use the default + */ +void lv_sysmon_hide_performance(lv_display_t * disp); + +/** + * Dump the FPS data recorded between the last and current dump call. + * @param disp target display, NULL: use the default + */ +void lv_sysmon_performance_dump(lv_display_t * disp); + +/** + * Resume the system performance monitor. + * @param disp target display, NULL: use the default + */ +void lv_sysmon_performance_resume(lv_display_t * disp); + +/** + * Pause the system performance monitor. + * + * @param disp target display, NULL: use the default + * @note When the sysmon is stopped you can use `lv_sysmon_dump_performance` to + * get performance information. See `lv_sysmon_dump_performance` for more information. + */ +void lv_sysmon_performance_pause(lv_display_t * disp); + + +#endif /*LV_USE_PERF_MONITOR*/ + +#if LV_USE_MEM_MONITOR + +/** + * Show system memory monitor: used memory and the memory fragmentation + * @param disp target display, NULL: use the default displays + */ +void lv_sysmon_show_memory(lv_display_t * disp); + +/** + * Hide system memory monitor + * @param disp target display, NULL: use the default displays + */ +void lv_sysmon_hide_memory(lv_display_t * disp); + +#endif /*LV_USE_MEM_MONITOR*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SYSMON*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SYSMON_H*/ diff --git a/inc/lvgl/src/debugging/sysmon/lv_sysmon_private.h b/inc/lvgl/src/debugging/sysmon/lv_sysmon_private.h new file mode 100644 index 0000000..36e0571 --- /dev/null +++ b/inc/lvgl/src/debugging/sysmon/lv_sysmon_private.h @@ -0,0 +1,94 @@ +/** + * @file lv_sysmon_private.h + * + */ + +#ifndef LV_SYSMON_PRIVATE_H +#define LV_SYSMON_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_sysmon.h" + +#if LV_USE_SYSMON + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_sysmon_backend_data_t { + lv_subject_t subject; + lv_timer_t * timer; +}; + +#if LV_USE_PERF_MONITOR +struct _lv_sysmon_perf_info_t { + struct { + bool inited; + uint32_t refr_start; + uint32_t refr_interval_sum; + uint32_t refr_elaps_sum; + uint32_t refr_cnt; + uint32_t render_start; + uint32_t render_elaps_sum; /*Contains the flush time too*/ + uint32_t render_cnt; + uint32_t flush_in_render_start; + uint32_t flush_in_render_elaps_sum; + uint32_t flush_not_in_render_start; + uint32_t flush_not_in_render_elaps_sum; + uint32_t last_report_timestamp; + uint32_t render_in_progress : 1; + } measured; + + struct { + uint32_t fps; + uint32_t cpu; +#if LV_SYSMON_PROC_IDLE_AVAILABLE + uint32_t cpu_proc; /** The applications idle time percentage */ +#endif + uint32_t refr_avg_time; + uint32_t render_avg_time; /**< Pure rendering time without flush time*/ + uint32_t flush_avg_time; /**< Pure flushing time without rendering time*/ + uint32_t cpu_avg_total; + uint32_t fps_avg_total; + uint32_t run_cnt; + } calculated; + +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize built-in system monitor, such as performance and memory monitor. + */ +void lv_sysmon_builtin_init(void); + +/** + * DeInitialize built-in system monitor, such as performance and memory monitor. + */ +void lv_sysmon_builtin_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SYSMON */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SYSMON_PRIVATE_H*/ diff --git a/inc/lvgl/src/debugging/test/lv_test.h b/inc/lvgl/src/debugging/test/lv_test.h new file mode 100644 index 0000000..ac61c9f --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test.h @@ -0,0 +1,47 @@ +/** + * @file lv_test.h + * + */ + +#ifndef LV_TEST_H +#define LV_TEST_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +/********************* + * DEFINES + *********************/ +#include "lv_test_indev.h" +#include "lv_test_display.h" +#include "lv_test_fs.h" +#include "lv_test_helpers.h" +#include "lv_test_screenshot_compare.h" +#include "lv_test_indev_gesture.h" + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_H*/ diff --git a/inc/lvgl/src/debugging/test/lv_test_display.c b/inc/lvgl/src/debugging/test/lv_test_display.c new file mode 100644 index 0000000..b6c0070 --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_display.c @@ -0,0 +1,108 @@ +/** + * @file lv_test_display.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_test_display.h" +#if LV_USE_TEST + +#include "../../core/lv_global.h" +#include "../../lvgl_private.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void dummy_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); + +static void buf_changed_event_cb(lv_event_t * e); +static void delete_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#define _state LV_GLOBAL_DEFAULT()->test_state + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_test_display_create(int32_t hor_res, int32_t ver_res) +{ + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + lv_display_set_color_format(disp, LV_COLOR_FORMAT_XRGB8888); + + size_t buf_size = 4 * (hor_res + LV_DRAW_BUF_STRIDE_ALIGN - 1) * ver_res + LV_DRAW_BUF_ALIGN; + uint8_t * buf = malloc(buf_size); + LV_ASSERT_MALLOC(buf); + + lv_draw_buf_init(&_state.draw_buf, hor_res, ver_res, LV_COLOR_FORMAT_XRGB8888, LV_STRIDE_AUTO, lv_draw_buf_align(buf, + LV_COLOR_FORMAT_XRGB8888), buf_size); + _state.draw_buf.unaligned_data = buf; + lv_display_set_draw_buffers(disp, &_state.draw_buf, NULL); + lv_display_set_render_mode(disp, LV_DISPLAY_RENDER_MODE_DIRECT); + + lv_display_set_flush_cb(disp, dummy_flush_cb); + + lv_display_add_event_cb(disp, buf_changed_event_cb, LV_EVENT_COLOR_FORMAT_CHANGED, NULL); + lv_display_add_event_cb(disp, buf_changed_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + lv_display_add_event_cb(disp, delete_event_cb, LV_EVENT_DELETE, NULL); + + return disp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void buf_changed_event_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_target(e); + lv_color_format_t cf = lv_display_get_color_format(disp); + int32_t hor_res = lv_display_get_original_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_original_vertical_resolution(disp); + + free(_state.draw_buf.unaligned_data); + + size_t buf_size = 4 * (hor_res + LV_DRAW_BUF_STRIDE_ALIGN - 1) * ver_res + LV_DRAW_BUF_ALIGN; + uint8_t * buf = malloc(buf_size); + LV_ASSERT_MALLOC(buf); + + lv_draw_buf_init(&_state.draw_buf, hor_res, ver_res, cf, LV_STRIDE_AUTO, lv_draw_buf_align(buf, cf), buf_size); + _state.draw_buf.unaligned_data = buf; + lv_display_set_draw_buffers(disp, &_state.draw_buf, NULL); +} + +static void delete_event_cb(lv_event_t * e) +{ + LV_UNUSED(e); + lv_display_t * disp = lv_event_get_target(e); + lv_draw_buf_t * draw_buf = lv_display_get_buf_active(disp); + free(draw_buf->unaligned_data); + +} + +static void dummy_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) +{ + LV_UNUSED(area); + LV_UNUSED(color_p); + lv_display_flush_ready(disp); +} + +#endif /*LV_USE_TEST*/ diff --git a/inc/lvgl/src/debugging/test/lv_test_display.h b/inc/lvgl/src/debugging/test/lv_test_display.h new file mode 100644 index 0000000..ea39da2 --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_display.h @@ -0,0 +1,55 @@ +/** + * @file lv_test_display.h + * + */ + +#ifndef LV_TEST_DISPLAY_H +#define LV_TEST_DISPLAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +#include "../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*** + * Create a dummy display for for the tests + * @param hor_res the maximal horizontal resolution + * @param ver_res the maximal vertical resolution + * @return the created display + * + * @note The resolution can be changed to any smaller values later + * using `lv_display_set_resolution` + * The color format can be freely changed later using `lv_display_set_color_format` + */ +lv_display_t * lv_test_display_create(int32_t hor_res, int32_t ver_res); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_DISPLAY_H*/ diff --git a/inc/lvgl/src/debugging/test/lv_test_fs.c b/inc/lvgl/src/debugging/test/lv_test_fs.c new file mode 100644 index 0000000..36f5b12 --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_fs.c @@ -0,0 +1,193 @@ +/** + * @file lv_test_fs.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_test_fs.h" + +#if LV_USE_TEST + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_fs.h" +#include "../../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ + +#define LV_TEST_FS_LETTER 'T' +#define LV_TEST_FS_CACHE_SIZE (512) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * rddir_p); +static bool fs_ready(lv_fs_drv_t * drv); + +/********************** + * STATIC VARIABLES + **********************/ + +static bool is_ready = true; +static lv_fs_drv_t fs_drv; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +void lv_test_fs_init(void) +{ + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_TEST_FS_LETTER; + fs_drv.cache_size = LV_TEST_FS_CACHE_SIZE; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = fs_write; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_close_cb = fs_dir_close; + fs_drv.dir_open_cb = fs_dir_open; + fs_drv.dir_read_cb = fs_dir_read; + + fs_drv.ready_cb = fs_ready; + + lv_fs_drv_register(&fs_drv); +} + +void lv_test_fs_set_ready(bool ready) +{ + is_ready = ready; +} + +void lv_test_fs_clear_open_cb(bool is_clear) +{ + fs_drv.open_cb = is_clear ? NULL : fs_open; +} + +void lv_test_fs_clear_close_cb(bool is_clear) +{ + fs_drv.close_cb = is_clear ? NULL : fs_close; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + lv_fs_file_t * file_p = lv_malloc(sizeof(lv_fs_file_t)); + LV_ASSERT_MALLOC(file_p); + if(file_p == NULL) { + return NULL; + } + + lv_fs_res_t res = lv_fs_open(file_p, path, mode); + if(res != LV_FS_RES_OK) { + lv_free(file_p); + return NULL; + } + + return file_p; +} + +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + lv_fs_res_t res = lv_fs_close(file_p); + lv_free(file_p); + return res; +} + +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + return lv_fs_read(file_p, buf, btr, br); +} + +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + return lv_fs_write(file_p, buf, btw, bw); +} + +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + return lv_fs_seek(file_p, pos, whence); +} + +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + return lv_fs_tell(file_p, pos_p); +} + +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + lv_fs_dir_t * rddir_p = lv_malloc(sizeof(lv_fs_dir_t)); + if(rddir_p == NULL) { + return NULL; + } + + lv_fs_res_t res = lv_fs_dir_open(rddir_p, path); + if(res != LV_FS_RES_OK) { + lv_free(rddir_p); + return NULL; + } + + return rddir_p; +} + +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + return lv_fs_dir_read(rddir_p, fn, fn_len); +} + +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * rddir_p) +{ + LV_UNUSED(drv); + lv_fs_res_t res = lv_fs_dir_close(rddir_p); + lv_free(rddir_p); + return res; +} + +static bool fs_ready(lv_fs_drv_t * drv) +{ + LV_UNUSED(drv); + return is_ready; +} + +#endif/*LV_USE_TEST*/ diff --git a/inc/lvgl/src/debugging/test/lv_test_fs.h b/inc/lvgl/src/debugging/test/lv_test_fs.h new file mode 100644 index 0000000..792fd79 --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_fs.h @@ -0,0 +1,69 @@ +/** + * @file lv_test_fs.h + * + */ + +#ifndef LV_TEST_FS_H +#define LV_TEST_FS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +#include "../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the test file system driver + */ +void lv_test_fs_init(void); + +/** + * Set whether the test file system is ready + * @param ready true: ready, false: not ready + */ +void lv_test_fs_set_ready(bool ready); + +/** + * Set whether the open callback of the test file system is cleared + * @param is_clear true: clear, false: not clear + */ +void lv_test_fs_clear_open_cb(bool is_clear); + +/** + * Set whether the close callback of the test file system is cleared + * @param is_clear true: clear, false: not clear + */ +void lv_test_fs_clear_close_cb(bool is_clear); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_FS_H*/ + + diff --git a/inc/lvgl/src/debugging/test/lv_test_helpers.c b/inc/lvgl/src/debugging/test/lv_test_helpers.c new file mode 100644 index 0000000..cbaadca --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_helpers.c @@ -0,0 +1,60 @@ +/** + * @file lv_test_helpers.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_test_helpers.h" + +#if LV_USE_TEST +#include "../../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_test_wait(uint32_t ms) +{ + while(ms) { + lv_tick_inc(1); + lv_timer_handler(); + ms--; + } + lv_refr_now(NULL); +} + +void lv_test_fast_forward(uint32_t ms) +{ + lv_tick_inc(ms); + lv_timer_handler(); + lv_refr_now(NULL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_TEST*/ diff --git a/inc/lvgl/src/debugging/test/lv_test_helpers.h b/inc/lvgl/src/debugging/test/lv_test_helpers.h new file mode 100644 index 0000000..0c9048b --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_helpers.h @@ -0,0 +1,80 @@ +/** + * @file lv_test_helpers.h + * + */ + +#ifndef LV_TEST_HELPERS_H +#define LV_TEST_HELPERS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +#include "../../misc/lv_types.h" +#include "../../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Emulate a delay. It's not real delay, but it tricks LVGL to think that the + * required time has been elapsed. + * `lv_timer_handler` is called after each millisecond, meaning all the events + * will be fired inside this function. + * At the end the animations and display will be also updated. + * @param ms the number of milliseconds to pass + */ +void lv_test_wait(uint32_t ms); + +/** + * Emulates some time passing. + * Update the animations and the display only once at the end. + * @param ms the number of milliseconds to pass + */ +void lv_test_fast_forward(uint32_t ms); + +#if LV_USE_STDLIB_MALLOC != LV_STDLIB_BUILTIN +/* Skip checking heap as we don't have the info available */ +#define LV_HEAP_CHECK(x) do {} while(0) +/* Pick a non-zero value */ +#define lv_test_get_free_mem() (65536) +#else +#define LV_HEAP_CHECK(x) x + +static inline size_t lv_test_get_free_mem(void) +{ + lv_mem_monitor_t m1; + lv_mem_monitor(&m1); + return m1.free_size; +} +#endif /* LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN */ + +/********************** + * MACROS + **********************/ + +#define LV_TEST_WIDTH_TO_STRIDE(w, px_size) ((((w) * (px_size) + (LV_DRAW_BUF_STRIDE_ALIGN - 1)) / LV_DRAW_BUF_STRIDE_ALIGN) * LV_DRAW_BUF_STRIDE_ALIGN) + +#endif /*LV_USE_TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_HELPERS_H*/ diff --git a/inc/lvgl/src/debugging/test/lv_test_indev.c b/inc/lvgl/src/debugging/test/lv_test_indev.c new file mode 100644 index 0000000..742e27d --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_indev.c @@ -0,0 +1,212 @@ +/** + * @file lv_test_indev.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_test.h" +#if LV_USE_TEST + +#include "../../core/lv_global.h" +#include "../../lvgl_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_test_mouse_read_cb(lv_indev_t * indev, lv_indev_data_t * data); +static void lv_test_keypad_read_cb(lv_indev_t * indev, lv_indev_data_t * data); +static void lv_test_encoder_read_cb(lv_indev_t * indev, lv_indev_data_t * data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#define _state LV_GLOBAL_DEFAULT()->test_state + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_test_indev_create_all(void) +{ + _state.mouse_indev = lv_indev_create(); + lv_indev_set_type(_state.mouse_indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(_state.mouse_indev, lv_test_mouse_read_cb); + + _state.keypad_indev = lv_indev_create(); + lv_indev_set_type(_state.keypad_indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(_state.keypad_indev, lv_test_keypad_read_cb); + + _state.encoder_indev = lv_indev_create(); + lv_indev_set_type(_state.encoder_indev, LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb(_state.encoder_indev, lv_test_encoder_read_cb); +} + +void lv_test_indev_delete_all(void) +{ + if(_state.mouse_indev) { + lv_indev_delete(_state.mouse_indev); + _state.mouse_indev = NULL; + } + + if(_state.keypad_indev) { + lv_indev_delete(_state.keypad_indev); + _state.keypad_indev = NULL; + } + + if(_state.encoder_indev) { + lv_indev_delete(_state.encoder_indev); + _state.encoder_indev = NULL; + } +} + +lv_indev_t * lv_test_indev_get_indev(lv_indev_type_t type) +{ + switch(type) { + case LV_INDEV_TYPE_POINTER: + return _state.mouse_indev; + case LV_INDEV_TYPE_KEYPAD: + return _state.keypad_indev; + case LV_INDEV_TYPE_ENCODER: + return _state.encoder_indev; + default: + return NULL; + + } +} + +void lv_test_mouse_move_to(int32_t x, int32_t y) +{ + _state.x_act = x; + _state.y_act = y; +} + + +void lv_test_mouse_move_to_obj(lv_obj_t * obj) +{ + int32_t x = obj->coords.x1 + lv_obj_get_width(obj) / 2; + int32_t y = obj->coords.y1 + lv_obj_get_height(obj) / 2; + lv_test_mouse_move_to(x, y); +} + +void lv_test_mouse_move_by(int32_t x, int32_t y) +{ + _state.x_act += x; + _state.y_act += y; +} + +void lv_test_mouse_press(void) +{ + _state.mouse_pressed = true; +} + +void lv_test_mouse_release(void) +{ + _state.mouse_pressed = false; +} + +void lv_test_mouse_click_at(int32_t x, int32_t y) +{ + lv_test_mouse_release(); + lv_test_wait(50); + lv_test_mouse_move_to(x, y); + lv_test_mouse_press(); + lv_test_wait(50); + lv_test_mouse_release(); + lv_test_wait(50); +} + +void lv_test_key_press(uint32_t k) +{ + _state.key_act = k; + _state.key_pressed = true; +} + +void lv_test_key_release(void) +{ + _state.key_pressed = false; +} + +void lv_test_key_hit(uint32_t k) +{ + lv_test_key_release(); + lv_test_wait(50); + lv_test_key_press(k); + lv_test_wait(50); + lv_test_key_release(); + lv_test_wait(50); +} + +void lv_test_encoder_add_diff(int32_t d) +{ + _state.diff_act += d; +} + +void lv_test_encoder_turn(int32_t d) +{ + _state.diff_act += d; + lv_test_wait(50); +} + +void lv_test_encoder_press(void) +{ + _state.enc_pressed = true; +} + +void lv_test_encoder_release(void) +{ + _state.enc_pressed = false; +} + +void lv_test_encoder_click(void) +{ + lv_test_encoder_release(); + lv_test_wait(50); + lv_test_encoder_press(); + lv_test_wait(50); + lv_test_encoder_release(); + lv_test_wait(50); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_test_mouse_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + LV_UNUSED(indev); + lv_point_set(&data->point, _state.x_act, _state.y_act); + data->state = _state.mouse_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; +} + + +static void lv_test_keypad_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + LV_UNUSED(indev); + data->key = _state.key_act; + data->state = _state.key_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; +} + + +static void lv_test_encoder_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + LV_UNUSED(indev); + data->enc_diff = _state.diff_act; + data->state = _state.enc_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + _state.diff_act = 0; +} + +#endif /*LV_USE_TEST*/ diff --git a/inc/lvgl/src/debugging/test/lv_test_indev.h b/inc/lvgl/src/debugging/test/lv_test_indev.h new file mode 100644 index 0000000..63c44ab --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_indev.h @@ -0,0 +1,171 @@ +/** + * @file lv_test_indev.h + * + */ + +#ifndef LV_TEST_INDEV_H +#define LV_TEST_INDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +#include "../../misc/lv_types.h" +#include "../../indev/lv_indev.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a mouse (pointer), keypad, and encoder indevs. + * They can be controlled via function calls during the test + */ +void lv_test_indev_create_all(void); + +/** + * Delete all test input devices + */ +void lv_test_indev_delete_all(void); + +/** + * Get one of the indev created in `lv_test_indev_create_all` + * @param type type of the indev to get + * @return the indev + */ +lv_indev_t * lv_test_indev_get_indev(lv_indev_type_t type); + +/** + * Move the mouse to the given coordinates. + * This function doesn't wait, but just changes the state and returns immediately. + * @param x the target absolute X coordinate + * @param y the target absolute Y coordinate + */ +void lv_test_mouse_move_to(int32_t x, int32_t y); + +/** + * Move the mouse to the center of a widget + * This function doesn't wait, but just changes the state and returns immediately. + * @param obj pointer to an widget + */ +void lv_test_mouse_move_to_obj(lv_obj_t * obj); + +/** + * Move the mouse cursor. Keep the pressed or released state + * This function doesn't wait, but just changes the state and returns immediately. + * @param x the difference in X to move + * @param y the difference in Y to move + */ +void lv_test_mouse_move_by(int32_t x, int32_t y); + +/** + * Make the mouse button pressed. + * This function doesn't wait, but just changes the state and returns immediately. + */ +void lv_test_mouse_press(void); + +/** + * Make the mouse button released. + * This function doesn't wait, but just changes the state and returns immediately. + */ +void lv_test_mouse_release(void); + +/** + * Emulate a click on a given point. + * First set the released state, wait a little, press, wait, and release again. + * The wait time is 50ms. + * Internally `lv_timer_handler` is called, meaning all the events will be fired inside this function. + * @param x the target absolute X coordinate + * @param y the target absolute Y coordinate + */ +void lv_test_mouse_click_at(int32_t x, int32_t y); + +/** + * Emulate a key press. + * This function doesn't wait, but just changes the state and returns immediately. + * @param k the key to press + */ +void lv_test_key_press(uint32_t k); + +/** + * Release the previously press key. + * This function doesn't wait, but just changes the state and returns immediately. + * @param k the key to press + */ +void lv_test_key_release(void); + +/** + * Emulate a key hit. + * First set the released state, wait a little, press, wait, and release again. + * The wait time is 50ms. + * Internally `lv_timer_handler` is called, meaning all the events will be fired inside this function. + * @param k the key to hit + */ +void lv_test_key_hit(uint32_t k); + + +/** + * Emulate encoder rotation, use positive parameter to rotate to the right + * and negative to rotate to the left. + * This function doesn't wait, but just changes the state and returns immediately. + * @param d number of encoder ticks to emulate + */ +void lv_test_encoder_add_diff(int32_t d); + +/** + * Emulate an encoder turn a wait 50ms. Use positive parameter to rotate to the right + * and negative to rotate to the left. + * Internally `lv_timer_handler` is called, meaning all the events will be fired inside this function. + * @param d number of encoder ticks to emulate + */ +void lv_test_encoder_turn(int32_t d); + +/** + * Emulate an encoder press. + * This function doesn't wait, but just changes the state and returns immediately. + */ +void lv_test_encoder_press(void); + +/** + * Emulate an encoder release. + * This function doesn't wait, but just changes the state and returns immediately. + */ +void lv_test_encoder_release(void); + +/** + * Emulate am encoder click. + * First set the released state, wait a little, press, wait, and release again. + * The wait time is 50ms. + * Internally `lv_timer_handler` is called, meaning all the events will be fired inside this function. + */ +void lv_test_encoder_click(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_INDEV_H*/ + + + + diff --git a/inc/lvgl/src/debugging/test/lv_test_indev_gesture.c b/inc/lvgl/src/debugging/test/lv_test_indev_gesture.c new file mode 100644 index 0000000..64455d6 --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_indev_gesture.c @@ -0,0 +1,141 @@ +/** + * @file lv_test_indev_gesture.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_test.h" +#if LV_USE_TEST && LV_USE_GESTURE_RECOGNITION + +#include "../../core/lv_global.h" +#include "../../lvgl_private.h" + +/********************* + * DEFINES + *********************/ + +#define MAX_TOUCH_CNT 2 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_test_gesture_read_cb(lv_indev_t * indev, lv_indev_data_t * data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#define _state LV_GLOBAL_DEFAULT()->test_state + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_test_indev_gesture_create(void) +{ + _state.max_touch_cnt = MAX_TOUCH_CNT; + _state.touch_data = + lv_malloc_zeroed(sizeof(lv_indev_touch_data_t) * _state.max_touch_cnt); + if(_state.touch_data == NULL) { + LV_LOG_ERROR("lv_indev_touch_data_t malloc failed"); + } + + _state.gesture_indev = lv_indev_create(); + lv_indev_set_type(_state.gesture_indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(_state.gesture_indev, lv_test_gesture_read_cb); +} + +void lv_test_indev_gesture_delete(void) +{ + if(_state.gesture_indev) { + lv_indev_delete(_state.gesture_indev); + _state.gesture_indev = NULL; + } + + if(_state.touch_data) { + lv_free(_state.touch_data); + _state.touch_data = NULL; + } + + _state.max_touch_cnt = 0; +} + +lv_indev_t * lv_test_indev_get_gesture_indev(lv_indev_type_t type) +{ + switch(type) { + case LV_INDEV_TYPE_POINTER: + return _state.gesture_indev; + default: + return NULL; + } +} + +void lv_test_gesture_set_pinch_data(lv_point_t point_0, lv_point_t point_1) +{ + _state.touch_data[0].id = 0; + _state.touch_data[0].point = point_0; + _state.touch_data[1].id = 1; + _state.touch_data[1].point = point_1; +} + +void lv_test_gesture_pinch_press(void) +{ + _state.touch_data[0].state = LV_INDEV_STATE_PRESSED; + _state.touch_data[1].state = LV_INDEV_STATE_PRESSED; +} + +void lv_test_gesture_pinch_release(void) +{ + _state.touch_data[0].state = LV_INDEV_STATE_RELEASED; + _state.touch_data[1].state = LV_INDEV_STATE_RELEASED; +} + +void lv_test_gesture_pinch(lv_point_t point_begin_0, lv_point_t point_begin_1, + lv_point_t point_end_0, lv_point_t point_end_1) +{ + lv_test_gesture_pinch_release(); + lv_test_wait(50); + lv_test_gesture_set_pinch_data(point_begin_0, point_begin_1); + lv_test_gesture_pinch_press(); + lv_test_wait(50); + lv_test_gesture_set_pinch_data(point_end_0, point_end_1); + lv_test_wait(80); + lv_test_gesture_set_pinch_data(point_end_0, point_end_1); + lv_test_wait(80); + lv_test_gesture_pinch_release(); + lv_test_wait(50); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_test_gesture_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + LV_UNUSED(indev); + + lv_indev_gesture_recognizers_update(indev, + _state.touch_data, + _state.max_touch_cnt); + lv_indev_gesture_recognizers_set_data(indev, data); + if(_state.touch_data != NULL && _state.max_touch_cnt > 0) { + data->point.x = _state.touch_data[0].point.x; + data->point.y = _state.touch_data[0].point.y; + } + else { + LV_LOG_ERROR("Invalid touch data or max touch count"); + data->point.x = 0; + data->point.y = 0; + } +} + +#endif /*LV_USE_TEST*/ diff --git a/inc/lvgl/src/debugging/test/lv_test_indev_gesture.h b/inc/lvgl/src/debugging/test/lv_test_indev_gesture.h new file mode 100644 index 0000000..23aef9a --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_indev_gesture.h @@ -0,0 +1,93 @@ +/** + * @file lv_test_indev_gesture.h + * + */ + +#ifndef LV_TEST_INDEV_GESTURE_H +#define LV_TEST_INDEV_GESTURE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST && LV_USE_GESTURE_RECOGNITION + +#include "../../misc/lv_types.h" +#include "../../indev/lv_indev.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a touch (pointer) indevs. + * They can be controlled via function calls during the test + */ +void lv_test_indev_gesture_create(void); + +/** + * Delete the touch (pointer) indevs. + */ +void lv_test_indev_gesture_delete(void); + +/** + * Get one of the indev created in `lv_test_indev_gesture_create` + * @param type type of the indev to get + * @return the indev + */ +lv_indev_t * lv_test_indev_get_gesture_indev(lv_indev_type_t type); + +/** + * Set two touch points data for pinch gesture + * @param point_0 First touch point coordinates + * @param point_1 Second touch point coordinates + */ +void lv_test_gesture_set_pinch_data(lv_point_t point_0, lv_point_t point_1); + +/** + * Trigger press state of pinch gesture (both touch points pressed) + */ +void lv_test_gesture_pinch_press(void); + +/** + * Trigger release state of pinch gesture (both touch points released) + */ +void lv_test_gesture_pinch_release(void); + +/** + * Simulate a complete pinch gesture operation + * @param point_begin_0 Starting coordinates of first touch point + * @param point_begin_1 Starting coordinates of second touch point + * @param point_end_0 Ending coordinates of first touch point + * @param point_end_1 Ending coordinates of second touch point + */ +void lv_test_gesture_pinch(lv_point_t point_begin_0, lv_point_t point_begin_1, + lv_point_t point_end_0, lv_point_t point_end_1); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST && LV_USE_GESTURE_RECOGNITION*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_INDEV_GESTURE_H*/ + + + + diff --git a/inc/lvgl/src/debugging/test/lv_test_private.h b/inc/lvgl/src/debugging/test/lv_test_private.h new file mode 100644 index 0000000..b19f5b6 --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_private.h @@ -0,0 +1,67 @@ +/** + * @file lv_test_private.h + * + */ + +#ifndef LV_TEST_PRIVATE_H +#define LV_TEST_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST + +#include "../../misc/lv_types.h" +#include "../../indev/lv_indev_gesture.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_indev_t * mouse_indev; + lv_indev_t * keypad_indev; + lv_indev_t * encoder_indev; + + lv_draw_buf_t draw_buf; + + int32_t x_act; + int32_t y_act; + uint32_t key_act; + int32_t diff_act; + bool mouse_pressed; + bool key_pressed; + bool enc_pressed; + +#if LV_USE_GESTURE_RECOGNITION + lv_indev_t * gesture_indev; + lv_indev_touch_data_t * touch_data; + uint8_t max_touch_cnt; +#endif +} lv_test_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + + +#endif /*LV_TEST_PRIVATE_H*/ diff --git a/inc/lvgl/src/debugging/test/lv_test_screenshot_compare.c b/inc/lvgl/src/debugging/test/lv_test_screenshot_compare.c new file mode 100644 index 0000000..1e0cb03 --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_screenshot_compare.c @@ -0,0 +1,348 @@ +/** + * @file lv_test_screenshot_compare.c + * + * Copyright 2002-2010 Guillaume Cottenceau. + * + * This software may be freely redistributed under the terms + * of the X11 license. + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST && defined(LV_USE_TEST_SCREENSHOT_COMPARE) && LV_USE_TEST_SCREENSHOT_COMPARE + +#if LV_USE_LODEPNG == 0 + #error "lodepng is required for screenshot compare. Enable it in lv_conf.h (LV_USE_LODEPNG 1)" +#endif + +#include "../../lvgl.h" +#include +#include +#include +#include +#include +#include "../../libs/lodepng/lodepng.h" + +#ifdef _WIN32 + #include + #define mkdir(pathname, mode) _mkdir(pathname) + #define strtok_r strtok_s +#else + #include +#endif + +/********************* + * DEFINES + *********************/ + +#ifndef REF_IMGS_PATH + #define REF_IMGS_PATH "" +#endif + +#ifndef REF_IMG_TOLERANCE + #define REF_IMG_TOLERANCE 0 +#endif + +#define ERR_FILE_NOT_FOUND -1 +#define ERR_PNG -2 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_test_screenshot_result_t screenshot_compare(const char * fn_ref, uint8_t tolerance); +static unsigned read_png_file(lv_draw_buf_t ** refr_draw_buf, unsigned * width, unsigned * height, + const char * file_name); +static unsigned write_png_file(void * raw_img, uint32_t width, uint32_t height, char * file_name); +static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out); +static void create_folders_if_needed(const char * path) ; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_test_screenshot_result_t lv_test_screenshot_compare(const char * fn_ref) +{ + + lv_obj_t * scr = lv_screen_active(); + lv_obj_invalidate(scr); + lv_refr_now(NULL); + + lv_test_screenshot_result_t res; + res = screenshot_compare(fn_ref, REF_IMG_TOLERANCE); + return res; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Compare the content of the frame buffer with a reference image + * @param fn_ref reference image path + * @return An element of lv_test_screenshot_result_t + */ +static lv_test_screenshot_result_t screenshot_compare(const char * fn_ref, uint8_t tolerance) +{ + char fn_ref_full[256]; + lv_snprintf(fn_ref_full, sizeof(fn_ref_full), "%s%s", REF_IMGS_PATH, fn_ref); + +#if LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE + create_folders_if_needed(fn_ref_full); +#endif + + lv_draw_buf_t * draw_buf = lv_display_get_buf_active(NULL); + + uint8_t * screen_buf_xrgb8888 = lv_malloc(draw_buf->header.w * draw_buf->header.h * 4); + if(!screen_buf_xrgb8888) { + LV_LOG_ERROR("Not enough memory to compare display with screenshot"); + return LV_TEST_SCREENSHOT_RESULT_FAILED; + } + + buf_to_xrgb8888(draw_buf, screen_buf_xrgb8888); + + lv_draw_buf_t * ref_draw_buf = NULL; + unsigned ref_img_width = 0; + unsigned ref_img_height = 0; + unsigned res = read_png_file(&ref_draw_buf, &ref_img_width, &ref_img_height, fn_ref_full); + if(res) { + lv_test_screenshot_result_t comp_res; +#if LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE + LV_LOG_WARN("%s%s", fn_ref_full, " was not found, creating it now from the rendered screen"); + write_png_file(screen_buf_xrgb8888, draw_buf->header.w, draw_buf->header.h, fn_ref_full); + comp_res = LV_TEST_SCREENSHOT_RESULT_PASSED; +#else + comp_res = LV_TEST_SCREENSHOT_RESULT_NO_REFERENCE_IMAGE; +#endif + lv_free(screen_buf_xrgb8888); + if(ref_draw_buf) lv_draw_buf_destroy(ref_draw_buf); + return comp_res; + } + + if(ref_img_width != draw_buf->header.w || ref_img_height != draw_buf->header.h) { + LV_LOG_WARN("The dimensions of the rendered and the %s reference image don't match", fn_ref); + lv_free(screen_buf_xrgb8888); + if(ref_draw_buf) lv_draw_buf_destroy(ref_draw_buf); + return LV_TEST_SCREENSHOT_RESULT_FAILED; + } + + + unsigned x, y; + bool err = false; + for(y = 0; y < ref_img_height; y++) { + uint8_t * screen_buf_tmp = screen_buf_xrgb8888 + draw_buf->header.w * 4 * y; + uint8_t * ref_row = (uint8_t *)ref_draw_buf->data + y * ref_draw_buf->header.stride; + for(x = 0; x < ref_img_width; x++) { + uint8_t * ptr_ref = &(ref_row[x * 4]); + uint8_t * ptr_act = &screen_buf_tmp[x * 4]; + + if(LV_ABS((int32_t) ptr_act[0] - (int32_t) ptr_ref[0]) > tolerance || + LV_ABS((int32_t) ptr_act[1] - (int32_t) ptr_ref[1]) > tolerance || + LV_ABS((int32_t) ptr_act[2] - (int32_t) ptr_ref[2]) > tolerance) { + uint32_t act_px = (ptr_act[2] << 16) + (ptr_act[1] << 8) + (ptr_act[0] << 0); + uint32_t ref_px = 0; + memcpy(&ref_px, ptr_ref, 3); + LV_LOG("\nScreenshot compare error\n" + " - File: %s\n" + " - At x:%d, y:%d.\n" + " - Expected: %X\n" + " - Actual: %X\n" + " - Tolerance: %d\n", + fn_ref_full, x, y, ref_px, act_px, tolerance); + err = true; + break; + } + } + if(err) break; + } + + if(err) { + char fn_ref_no_ext[128]; + lv_strlcpy(fn_ref_no_ext, fn_ref, sizeof(fn_ref_no_ext)); + fn_ref_no_ext[strlen(fn_ref_no_ext) - 4] = '\0'; + + char fn_err_full[256]; + lv_snprintf(fn_err_full, sizeof(fn_err_full), "%s%s_err.png", REF_IMGS_PATH, fn_ref_no_ext); + + write_png_file(screen_buf_xrgb8888, draw_buf->header.w, draw_buf->header.h, fn_err_full); + } + + fflush(stdout); + lv_free(screen_buf_xrgb8888); + if(ref_draw_buf) lv_draw_buf_destroy(ref_draw_buf); + return err ? LV_TEST_SCREENSHOT_RESULT_FAILED : LV_TEST_SCREENSHOT_RESULT_PASSED; + +} + +static unsigned read_png_file(lv_draw_buf_t ** refr_draw_buf, unsigned * width, unsigned * height, + const char * file_name) +{ + unsigned error = lodepng_decode32_file((void *)refr_draw_buf, width, height, file_name); + if(error) LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + return error; +} + +static unsigned write_png_file(void * raw_img, uint32_t width, uint32_t height, char * file_name) +{ + unsigned error = lodepng_encode32_file(file_name, raw_img, width, height); + if(error) LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + return error; +} + +static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) +{ + uint32_t stride = draw_buf->header.stride; + lv_color_format_t cf_in = draw_buf->header.cf; + const uint8_t * buf_in = draw_buf->data; + + if(cf_in == LV_COLOR_FORMAT_RGB565 || cf_in == LV_COLOR_FORMAT_RGB565_SWAPPED) { + if(cf_in == LV_COLOR_FORMAT_RGB565_SWAPPED) { + lv_draw_sw_rgb565_swap(draw_buf->data, draw_buf->header.w * draw_buf->header.h); + } + uint32_t y; + for(y = 0; y < draw_buf->header.h; y++) { + + uint32_t x; + for(x = 0; x < draw_buf->header.w; x++) { + const lv_color16_t * c16 = (const lv_color16_t *)&buf_in[x * 2]; + + buf_out[x * 4 + 3] = 0xff; + buf_out[x * 4 + 2] = (c16->blue * 2106) >> 8; /*To make it rounded*/ + buf_out[x * 4 + 1] = (c16->green * 1037) >> 8; + buf_out[x * 4 + 0] = (c16->red * 2106) >> 8; + } + + buf_in += stride; + buf_out += draw_buf->header.w * 4; + } + } + else if(cf_in == LV_COLOR_FORMAT_ARGB8888 || cf_in == LV_COLOR_FORMAT_XRGB8888 || + cf_in == LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED) { + uint32_t y; + for(y = 0; y < draw_buf->header.h; y++) { + uint32_t x; + for(x = 0; x < draw_buf->header.w; x++) { + buf_out[x * 4 + 3] = buf_in[x * 4 + 3]; + buf_out[x * 4 + 2] = buf_in[x * 4 + 0]; + buf_out[x * 4 + 1] = buf_in[x * 4 + 1]; + buf_out[x * 4 + 0] = buf_in[x * 4 + 2]; + } + + buf_in += stride; + buf_out += draw_buf->header.w * 4; + } + } + else if(cf_in == LV_COLOR_FORMAT_RGB888) { + uint32_t y; + for(y = 0; y < draw_buf->header.h; y++) { + uint32_t x; + for(x = 0; x < draw_buf->header.w; x++) { + buf_out[x * 4 + 3] = 0xff; + buf_out[x * 4 + 2] = buf_in[x * 3 + 0]; + buf_out[x * 4 + 1] = buf_in[x * 3 + 1]; + buf_out[x * 4 + 0] = buf_in[x * 3 + 2]; + } + + buf_in += stride; + buf_out += draw_buf->header.w * 4; + } + } + else if(cf_in == LV_COLOR_FORMAT_L8) { + uint32_t y; + for(y = 0; y < draw_buf->header.h; y++) { + uint32_t x; + for(x = 0; x < draw_buf->header.w; x++) { + buf_out[x * 4 + 3] = 0xff; + buf_out[x * 4 + 2] = buf_in[x]; + buf_out[x * 4 + 1] = buf_in[x]; + buf_out[x * 4 + 0] = buf_in[x]; + } + + buf_in += stride; + buf_out += draw_buf->header.w * 4; + } + } + else if(cf_in == LV_COLOR_FORMAT_AL88) { + uint32_t y; + for(y = 0; y < draw_buf->header.h; y++) { + uint32_t x; + for(x = 0; x < draw_buf->header.w; x++) { + buf_out[x * 4 + 3] = buf_in[x * 2 + 1]; + buf_out[x * 4 + 2] = buf_in[x * 2 + 0]; + buf_out[x * 4 + 1] = buf_in[x * 2 + 0]; + buf_out[x * 4 + 0] = buf_in[x * 2 + 0]; + } + + buf_in += stride; + buf_out += draw_buf->header.w * 4; + } + } + else if(cf_in == LV_COLOR_FORMAT_I1) { + buf_in += 8; + uint32_t y; + for(y = 0; y < draw_buf->header.h; y++) { + uint32_t x; + for(x = 0; x < draw_buf->header.w; x++) { + const uint8_t byte = buf_in[x / 8] ; + const uint8_t bit_pos = x % 8; + const uint8_t pixel = (byte >> (7 - bit_pos)) & 0x01; + + buf_out[x * 4 + 3] = 0xff; + buf_out[x * 4 + 2] = pixel ? 0xff : 0x00; + buf_out[x * 4 + 1] = pixel ? 0xff : 0x00; + buf_out[x * 4 + 0] = pixel ? 0xff : 0x00; + } + + buf_in += stride; + buf_out += draw_buf->header.w * 4; + } + } +} + +static void create_folders_if_needed(const char * path) +{ + char * ptr; + char * path_copy = lv_strdup(path); + if(path_copy == NULL) { + LV_LOG_ERROR("Error duplicating path"); + exit(EXIT_FAILURE); + } + + char * token = strtok_r(path_copy, "/", &ptr); + char current_path[1024] = {'\0'}; /* Adjust the size as needed */ + + while(token && ptr && *ptr != '\0') { + lv_strcat(current_path, token); + lv_strcat(current_path, "/"); + + int mkdir_retval = mkdir(current_path, 0777); + if(mkdir_retval == 0) { + LV_LOG_INFO("Created folder: %s\n", current_path); + } + else if(errno != EEXIST) { + perror("Error creating folder"); + lv_free(path_copy); + exit(EXIT_FAILURE); + } + + token = strtok_r(NULL, "/", &ptr); + } + + lv_free(path_copy); +} + +#endif diff --git a/inc/lvgl/src/debugging/test/lv_test_screenshot_compare.h b/inc/lvgl/src/debugging/test/lv_test_screenshot_compare.h new file mode 100644 index 0000000..6790027 --- /dev/null +++ b/inc/lvgl/src/debugging/test/lv_test_screenshot_compare.h @@ -0,0 +1,79 @@ +/** + * @file lv_test_screenshot_compare.h + * + */ + +#ifndef LV_TEST_SCREENSHOT_COMPARE_H +#define LV_TEST_SCREENSHOT_COMPARE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_TEST && defined(LV_USE_TEST_SCREENSHOT_COMPARE) && LV_USE_TEST_SCREENSHOT_COMPARE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Return value of `lv_test_screenshot_compare` + */ +typedef enum { + /** + * The screenshot is different than the reference image + */ + LV_TEST_SCREENSHOT_RESULT_FAILED, + + /** + * The screenshot is the same as the reference image. + * It is also returned if `LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE` is enabled + * and the reference image was missing. + */ + LV_TEST_SCREENSHOT_RESULT_PASSED, + + /** + * If `LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE` is not enabled + * and the reference image is missing. + */ + LV_TEST_SCREENSHOT_RESULT_NO_REFERENCE_IMAGE, + +} lv_test_screenshot_result_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Compare the current content of the test screen with a reference PNG image + * - If the reference image is not found it will be created automatically from the rendered screen. + * - If the compare fails an `_err.png` file will be created with the rendered content next to the reference image. + * + * It requires lodepng. + * + * @param fn_ref path to the reference image. Will be appended to REF_IMGS_PATH if set. + * @return An element of `lv_test_screenshot_result_t` + * @note This function assumes that the default display is the test display that was created by + * `lv_test_display_create()` + */ +lv_test_screenshot_result_t lv_test_screenshot_compare(const char * fn_ref); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEST_SCREENSHOT_COMPARE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEST_SCREENSHOT_COMPARE_H*/ diff --git a/inc/lvgl/src/debugging/vg_lite_tvg/vg_lite.h b/inc/lvgl/src/debugging/vg_lite_tvg/vg_lite.h new file mode 100644 index 0000000..f2d4aaf --- /dev/null +++ b/inc/lvgl/src/debugging/vg_lite_tvg/vg_lite.h @@ -0,0 +1,1352 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#ifndef _vg_lite_h_ +#define _vg_lite_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * causes MSVC error C1189. + * Not needed because "The __inline keyword is equivalent to inline." + * See: https://learn.microsoft.com/en-us/cpp/cpp/inline-functions-cpp?view=msvc-170 +*/ +/* +#if defined(_MSC_VER) +#define inline __inline +#endif +*/ + +#include +#include + + +/* VGLite API Constants *******************************************************************************************************************/ + +#define VGLITE_HEADER_VERSION 7 + +#ifndef VGLITE_VERSION_3_0 +#define VGLITE_VERSION_3_0 1 + +#define VGLITE_MAKE_VERSION(major, minor, patch) (((major) << 16) | ((minor) << 8) | (patch)) +#define VGLITE_VERSION_MAJOR(version) (((uint32_t)(version) >> 16) & 0xff) +#define VGLITE_VERSION_MINOR(version) (((uint32_t)(version) >> 8) & 0xff) +#define VGLITE_VERSION_PATCH(version) ((uint32_t)(version) & 0xff) + +#define VGLITE_API_VERSION_3_0 VGLITE_MAKE_VERSION(3, 0, 0) + +#define VGLITE_RELEASE_VERSION VGLITE_MAKE_VERSION(4,0,47) + +#define VGL_FALSE 0 +#define VGL_TRUE 1 + +/* Path command (op code). */ +#define VLC_OP_END 0x00 +#define VLC_OP_CLOSE 0x01 +#define VLC_OP_MOVE 0x02 +#define VLC_OP_MOVE_REL 0x03 +#define VLC_OP_LINE 0x04 +#define VLC_OP_LINE_REL 0x05 +#define VLC_OP_QUAD 0x06 +#define VLC_OP_QUAD_REL 0x07 +#define VLC_OP_CUBIC 0x08 +#define VLC_OP_CUBIC_REL 0x09 +#define VLC_OP_BREAK 0x0A +#define VLC_OP_HLINE 0x0B +#define VLC_OP_HLINE_REL 0x0C +#define VLC_OP_VLINE 0x0D +#define VLC_OP_VLINE_REL 0x0E +#define VLC_OP_SQUAD 0x0F +#define VLC_OP_SQUAD_REL 0x10 +#define VLC_OP_SCUBIC 0x11 +#define VLC_OP_SCUBIC_REL 0x12 +#define VLC_OP_SCCWARC 0x13 +#define VLC_OP_SCCWARC_REL 0x14 +#define VLC_OP_SCWARC 0x15 +#define VLC_OP_SCWARC_REL 0x16 +#define VLC_OP_LCCWARC 0x17 +#define VLC_OP_LCCWARC_REL 0x18 +#define VLC_OP_LCWARC 0x19 +#define VLC_OP_LCWARC_REL 0x1A + +/* Macros for path manipulating: See path definitions. */ +#define VLM_PATH_ENABLE_UPLOAD(path) (path).uploaded.property |= 1 +#define VLM_PATH_DISABLE_UPLOAD(path) (path).uploaded.property &= (~1) +#define VLM_PATH_GET_UPLOAD_BIT(path) ((path).uploaded.property & 1) + +/* Gradient constants. */ +#define VLC_MAX_COLOR_RAMP_STOPS 256 /*! The max number of radial gradient stops. */ +#define VLC_MAX_GRADIENT_STOPS 16 /*! The max number of gradient stops. */ +#define VLC_GRADIENT_BUFFER_WIDTH 1024 /*! The internal gradient buffer width.*/ + + +/* API name defines for backward compatibility to VGLite 2.0 APIs */ +#define vg_lite_buffer_upload vg_lite_upload_buffer +#define vg_lite_path_append vg_lite_append_path +#define vg_lite_path_calc_length vg_lite_get_path_length +#define vg_lite_set_ts_buffer vg_lite_set_tess_buffer +#define vg_lite_set_draw_path_type vg_lite_set_path_type +#define vg_lite_create_mask_layer vg_lite_create_masklayer +#define vg_lite_fill_mask_layer vg_lite_fill_masklayer +#define vg_lite_blend_mask_layer vg_lite_blend_masklayer +#define vg_lite_generate_mask_layer_by_path vg_lite_render_masklayer +#define vg_lite_set_mask_layer vg_lite_set_masklayer +#define vg_lite_destroy_mask_layer vg_lite_destroy_masklayer +#define vg_lite_enable_mask vg_lite_enable_masklayer +#define vg_lite_enable_color_transformation vg_lite_enable_color_transform +#define vg_lite_set_color_transformation vg_lite_set_color_transform +#define vg_lite_set_image_global_alpha vg_lite_source_global_alpha +#define vg_lite_set_dest_global_alpha vg_lite_dest_global_alpha +#define vg_lite_clear_rad_grad vg_lite_clear_radial_grad +#define vg_lite_update_rad_grad vg_lite_update_radial_grad +#define vg_lite_get_rad_grad_matrix vg_lite_get_radial_grad_matrix +#define vg_lite_set_rad_grad vg_lite_set_radial_grad +#define vg_lite_draw_linear_gradient vg_lite_draw_linear_grad +#define vg_lite_draw_radial_gradient vg_lite_draw_radial_grad +#define vg_lite_draw_gradient vg_lite_draw_grad +#define vg_lite_mem_avail vg_lite_get_mem_size +#define vg_lite_set_update_stroke vg_lite_update_stroke + +#define vg_lite_buffer_image_mode_t vg_lite_image_mode_t +#define vg_lite_draw_path_type_t vg_lite_path_type_t +#define vg_lite_linear_gradient_ext_t vg_lite_ext_linear_gradient_t +#define vg_lite_buffer_transparency_mode_t vg_lite_transparency_t + + +/* VGLite API Types ***********************************************************************************************************************/ + +typedef unsigned char vg_lite_uint8_t; +typedef char vg_lite_int8_t; +typedef short vg_lite_int16_t; +typedef unsigned short vg_lite_uint16_t; +typedef int vg_lite_int32_t; +typedef unsigned int vg_lite_uint32_t; +typedef unsigned long long vg_lite_uint64_t; +typedef float vg_lite_float_t; +typedef double vg_lite_double_t; +typedef char vg_lite_char; +typedef char * vg_lite_string; +typedef void * vg_lite_pointer; +typedef void vg_lite_void; +typedef unsigned int vg_lite_color_t; + + +/* VGLite API Enumerations ****************************************************************************************************************/ + +#ifndef VG_LITE_ERROR +#define VG_LITE_ERROR 1 + +/* Error codes that the vg_lite functions can return. */ +typedef enum vg_lite_error { + VG_LITE_SUCCESS = 0, /*! Success. */ + VG_LITE_INVALID_ARGUMENT, /*! An invalid argument was specified. */ + VG_LITE_OUT_OF_MEMORY, /*! Out of memory. */ + VG_LITE_NO_CONTEXT, /*! No context or an uninitialized context specified. */ + VG_LITE_TIMEOUT, /*! A timeout has occurred during a wait. */ + VG_LITE_OUT_OF_RESOURCES, /*! Out of system resources. */ + VG_LITE_GENERIC_IO, /*! Cannot communicate with the kernel driver. */ + VG_LITE_NOT_SUPPORT, /*! Function call not supported. */ + VG_LITE_ALREADY_EXISTS, /*! Object already exists */ + VG_LITE_NOT_ALIGNED, /*! Data alignment error */ + VG_LITE_FLEXA_TIME_OUT, /*! VG timeout requesting for segment buffer */ + VG_LITE_FLEXA_HANDSHAKE_FAIL, /*! VG and SBI synchronizer handshake failed */ +} vg_lite_error_t; +#endif + +/* Chip features bit */ +typedef enum vg_lite_feature { + gcFEATURE_BIT_VG_IM_INDEX_FORMAT, + gcFEATURE_BIT_VG_SCISSOR, + gcFEATURE_BIT_VG_BORDER_CULLING, + gcFEATURE_BIT_VG_RGBA2_FORMAT, + gcFEATURE_BIT_VG_QUALITY_8X, + gcFEATURE_BIT_VG_IM_FASTCLAER, + gcFEATURE_BIT_VG_RADIAL_GRADIENT, + gcFEATURE_BIT_VG_GLOBAL_ALPHA, + gcFEATURE_BIT_VG_RGBA8_ETC2_EAC, + gcFEATURE_BIT_VG_COLOR_KEY, + gcFEATURE_BIT_VG_DOUBLE_IMAGE, + gcFEATURE_BIT_VG_YUV_OUTPUT, + gcFEATURE_BIT_VG_FLEXA, + gcFEATURE_BIT_VG_24BIT, + gcFEATURE_BIT_VG_DITHER, + gcFEATURE_BIT_VG_USE_DST, + gcFEATURE_BIT_VG_PE_CLEAR, + gcFEATURE_BIT_VG_IM_INPUT, + gcFEATURE_BIT_VG_DEC_COMPRESS, + gcFEATURE_BIT_VG_LINEAR_GRADIENT_EXT, + gcFEATURE_BIT_VG_MASK, + gcFEATURE_BIT_VG_MIRROR, + gcFEATURE_BIT_VG_GAMMA, + gcFEATURE_BIT_VG_NEW_BLEND_MODE, + gcFEATURE_BIT_VG_STENCIL, + gcFEATURE_BIT_VG_SRC_PREMULTIPLIED, /*! Valid only if gcFEATURE_BIT_VG_HW_PREMULTIPLY is 0 */ + gcFEATURE_BIT_VG_HW_PREMULTIPLY, /*! HW multiplier can accept either premultiplied or not */ + gcFEATURE_BIT_VG_COLOR_TRANSFORMATION, + gcFEATURE_BIT_VG_LVGL_SUPPORT, + gcFEATURE_BIT_VG_INDEX_ENDIAN, + gcFEATURE_BIT_VG_24BIT_PLANAR, + gcFEATURE_BIT_VG_PIXEL_MATRIX, + gcFEATURE_BIT_VG_NEW_IMAGE_INDEX, + gcFEATURE_BIT_VG_PARALLEL_PATHS, + gcFEATURE_BIT_VG_STRIPE_MODE, + gcFEATURE_BIT_VG_IM_DEC_INPUT, + gcFEATURE_BIT_VG_GAUSSIAN_BLUR, + gcFEATURE_BIT_VG_RECTANGLE_TILED_OUT, + gcFEATURE_BIT_VG_TESSELLATION_TILED_OUT, + gcFEATURE_BIT_VG_IM_REPEAT_REFLECT, + gcFEATURE_BIT_VG_YUY2_INPUT, + gcFEATURE_BIT_VG_YUV_INPUT, + gcFEATURE_BIT_VG_YUV_TILED_INPUT, + gcFEATURE_BIT_VG_AYUV_INPUT, + gcFEATURE_BIT_VG_16PIXELS_ALIGN, + gcFEATURE_BIT_VG_DEC_COMPRESS_2_0, + gcFEATURE_COUNT +} vg_lite_feature_t; + +/* Rendering quality enums. */ +typedef enum vg_lite_quality { + VG_LITE_HIGH, /*! High quality 16x anti-aliasing path. */ + VG_LITE_UPPER, /*! Upper quality 8x anti-aliasing path. */ + VG_LITE_MEDIUM, /*! Medium quality 4x anti-aliasing path. */ + VG_LITE_LOW, /*! Low quality path without any anti-aliasing. */ +} vg_lite_quality_t; + +/* Format of path coordinates. */ +typedef enum vg_lite_format { + VG_LITE_S8, /*! Signed 8-bit coordinates. */ + VG_LITE_S16, /*! Signed 16-bit coordinates. */ + VG_LITE_S32, /*! Signed 32-bit coordinates. */ + VG_LITE_FP32, /*! 32-bit floating point coordinates. */ +} vg_lite_format_t; + +/* Format of pixel buffer. */ +typedef enum vg_lite_buffer_format { + /* OpenVG VGImageFormat enums: + * Note: The bits for each color channel are stored within a machine word + * from MSB to LSB in the order indicated by the pixel format name. + * This is opposite of VG_LITE_* formats (from LSB to MSB). + */ + + /* RGB{A,X} channel ordering */ + VG_sRGBX_8888 = 0, + VG_sRGBA_8888 = 1, + VG_sRGBA_8888_PRE = 2, + VG_sRGB_565 = 3, + VG_sRGBA_5551 = 4, + VG_sRGBA_4444 = 5, + VG_sL_8 = 6, + VG_lRGBX_8888 = 7, + VG_lRGBA_8888 = 8, + VG_lRGBA_8888_PRE = 9, + VG_lL_8 = 10, + VG_A_8 = 11, + VG_BW_1 = 12, + VG_A_1 = 13, + VG_A_4 = 14, + + VG_sRGBX_8888_PRE = 15, + VG_sRGB_565_PRE = 16, + VG_sRGBA_5551_PRE = 17, + VG_sRGBA_4444_PRE = 18, + VG_lRGBX_8888_PRE = 19, + VG_lRGB_565 = 20, + VG_lRGB_565_PRE = 21, + VG_lRGBA_5551 = 22, + VG_lRGBA_5551_PRE = 23, + VG_lRGBA_4444 = 24, + VG_lRGBA_4444_PRE = 25, + + /* {A,X}RGB channel ordering */ + VG_sXRGB_8888 = 0 | (1 << 6), + VG_sARGB_8888 = 1 | (1 << 6), + VG_sARGB_8888_PRE = 2 | (1 << 6), + VG_sARGB_1555 = 4 | (1 << 6), + VG_sARGB_4444 = 5 | (1 << 6), + VG_lXRGB_8888 = 7 | (1 << 6), + VG_lARGB_8888 = 8 | (1 << 6), + VG_lARGB_8888_PRE = 9 | (1 << 6), + + /* BGR{A,X} channel ordering */ + VG_sBGRX_8888 = 0 | (1 << 7), + VG_sBGRA_8888 = 1 | (1 << 7), + VG_sBGRA_8888_PRE = 2 | (1 << 7), + VG_sBGR_565 = 3 | (1 << 7), + VG_sBGRA_5551 = 4 | (1 << 7), + VG_sBGRA_4444 = 5 | (1 << 7), + VG_lBGRX_8888 = 7 | (1 << 7), + VG_lBGRA_8888 = 8 | (1 << 7), + VG_lBGRA_8888_PRE = 9 | (1 << 7), + + /* {A,X}BGR channel ordering */ + VG_sXBGR_8888 = 0 | (1 << 6) | (1 << 7), + VG_sABGR_8888 = 1 | (1 << 6) | (1 << 7), + VG_sABGR_8888_PRE = 2 | (1 << 6) | (1 << 7), + VG_sABGR_1555 = 4 | (1 << 6) | (1 << 7), + VG_sABGR_4444 = 5 | (1 << 6) | (1 << 7), + VG_lXBGR_8888 = 7 | (1 << 6) | (1 << 7), + VG_lABGR_8888 = 8 | (1 << 6) | (1 << 7), + VG_lABGR_8888_PRE = 9 | (1 << 6) | (1 << 7), + + /* Original VGLite API image format enums: + * Note: The bits for each color channel are stored within a machine word + * from LSB to MSB in the order indicated by the pixel format name. + * This is opposite of OPENVG VG_* formats (from MSB to LSB). + */ + VG_LITE_RGBA8888 = 0 | (1 << 10), + VG_LITE_BGRA8888 = 1 | (1 << 10), + VG_LITE_RGBX8888 = 2 | (1 << 10), + VG_LITE_BGRX8888 = 3 | (1 << 10), + VG_LITE_RGB565 = 4 | (1 << 10), + VG_LITE_BGR565 = 5 | (1 << 10), + VG_LITE_RGBA4444 = 6 | (1 << 10), + VG_LITE_BGRA4444 = 7 | (1 << 10), + VG_LITE_BGRA5551 = 8 | (1 << 10), + VG_LITE_A4 = 9 | (1 << 10), + VG_LITE_A8 = 10 | (1 << 10), + VG_LITE_L8 = 11 | (1 << 10), + VG_LITE_YUYV = 12 | (1 << 10), + VG_LITE_YUY2 = 13 | (1 << 10), + VG_LITE_ANV12 = 14 | (1 << 10), + VG_LITE_AYUY2 = 15 | (1 << 10), + VG_LITE_NV12 = 16 | (1 << 10), + VG_LITE_YV12 = 17 | (1 << 10), + VG_LITE_YV24 = 18 | (1 << 10), + VG_LITE_YV16 = 19 | (1 << 10), + VG_LITE_NV16 = 20 | (1 << 10), + VG_LITE_YUY2_TILED = 21 | (1 << 10), + VG_LITE_NV12_TILED = 22 | (1 << 10), + VG_LITE_ANV12_TILED = 23 | (1 << 10), + VG_LITE_AYUY2_TILED = 24 | (1 << 10), + VG_LITE_RGBA2222 = 25 | (1 << 10), + VG_LITE_BGRA2222 = 26 | (1 << 10), + VG_LITE_ABGR2222 = 27 | (1 << 10), + VG_LITE_ARGB2222 = 28 | (1 << 10), + VG_LITE_ABGR4444 = 29 | (1 << 10), + VG_LITE_ARGB4444 = 30 | (1 << 10), + VG_LITE_ABGR8888 = 31 | (1 << 10), + VG_LITE_ARGB8888 = 32 | (1 << 10), + VG_LITE_ABGR1555 = 33 | (1 << 10), + VG_LITE_RGBA5551 = 34 | (1 << 10), + VG_LITE_ARGB1555 = 35 | (1 << 10), + VG_LITE_XBGR8888 = 36 | (1 << 10), + VG_LITE_XRGB8888 = 37 | (1 << 10), + VG_LITE_RGBA8888_ETC2_EAC = 38 | (1 << 10), + VG_LITE_RGB888 = 39 | (1 << 10), + VG_LITE_BGR888 = 40 | (1 << 10), + VG_LITE_ABGR8565 = 41 | (1 << 10), + VG_LITE_BGRA5658 = 42 | (1 << 10), + VG_LITE_ARGB8565 = 43 | (1 << 10), + VG_LITE_RGBA5658 = 44 | (1 << 10), + VG_LITE_ABGR8565_PLANAR = 45 | (1 << 10), + VG_LITE_BGRA5658_PLANAR = 46 | (1 << 10), + VG_LITE_ARGB8565_PLANAR = 47 | (1 << 10), + VG_LITE_RGBA5658_PLANAR = 48 | (1 << 10), + + VG_LITE_INDEX_1 = 0 | (1 << 11), /*! Indexed format. */ + VG_LITE_INDEX_2 = 1 | (1 << 11), + VG_LITE_INDEX_4 = 2 | (1 << 11), + VG_LITE_INDEX_8 = 3 | (1 << 11), + +} vg_lite_buffer_format_t; + +/* Swizzle of packed YUV format UV channels. */ +typedef enum vg_lite_swizzle { + VG_LITE_SWIZZLE_UV, + VG_LITE_SWIZZLE_VU, +} vg_lite_swizzle_t; + +/* The YUV<->RGB conversion rule. */ +typedef enum vg_lite_yuv2rgb { + VG_LITE_YUV601, + VG_LITE_YUV709, +} vg_lite_yuv2rgb_t; + +/* The pixel layout in a buffer. */ +typedef enum vg_lite_buffer_layout { + VG_LITE_LINEAR, + VG_LITE_TILED, +} vg_lite_buffer_layout_t; + +/* The image (buffer) rendering mode. Match OpenVG enum VGImageMode */ +typedef enum vg_lite_image_mode { + /* For enum value backward compatibility */ + VG_LITE_ZERO = 0, + VG_LITE_NORMAL_IMAGE_MODE = 0x1F00, + VG_LITE_MULTIPLY_IMAGE_MODE = 0x1F01, + VG_LITE_STENCIL_MODE = 0x1F02, + VG_LITE_NONE_IMAGE_MODE = 0x1F03, + VG_LITE_RECOLOR_MODE = 0x1F04, +} vg_lite_image_mode_t; + +/* The image (buffer) transparency mode. */ +typedef enum vg_lite_transparency { + VG_LITE_IMAGE_OPAQUE, + VG_LITE_IMAGE_TRANSPARENT +} vg_lite_transparency_t; + +/* Blending modes. VG_BLEND_* match OpenVG enum VGBlendMode. + * S and D represent source and destination color channels. + * Sa and Da represent the source and destination alpha channels. + */ +typedef enum vg_lite_blend { + VG_LITE_BLEND_NONE = 0, /*! S, No blend, Non-premultiplied */ + VG_LITE_BLEND_SRC_OVER = 1, /*! S + (1 - Sa) * D , Non-premultiplied */ + VG_LITE_BLEND_DST_OVER = 2, /*! (1 - Da) * S + D , Non-premultiplied */ + VG_LITE_BLEND_SRC_IN = 3, /*! Da * S , Non-premultiplied */ + VG_LITE_BLEND_DST_IN = 4, /*! Sa * D , Non-premultiplied */ + VG_LITE_BLEND_MULTIPLY = 5, /*! S * (1 - Da) + D * (1 - Sa) + S * D , Non-premultiplied */ + VG_LITE_BLEND_SCREEN = 6, /*! S + D - S * D , Non-premultiplied */ + VG_LITE_BLEND_DARKEN = 7, /*! min(SrcOver, DstOver) , Non-premultiplied */ + VG_LITE_BLEND_LIGHTEN = 8, /*! max(SrcOver, DstOver) , Non-premultiplied */ + VG_LITE_BLEND_ADDITIVE = 9, /*! S + D , Non-premultiplied */ + VG_LITE_BLEND_SUBTRACT = 10, /*! D * (1 - Sa) , Non-premultiplied */ + VG_LITE_BLEND_SUBTRACT_LVGL = 11, /*! D - S , Non-premultiplied */ + VG_LITE_BLEND_NORMAL_LVGL = 12, /*! S * Sa + (1 - Sa) * D , Non-premultiplied */ + VG_LITE_BLEND_ADDITIVE_LVGL = 13, /*! (S + D) * Sa + D * (1 - Sa) , Non-premultiplied */ + VG_LITE_BLEND_MULTIPLY_LVGL = 14, /*! (S * D) * Sa + D * (1 - Sa) , Non-premultiplied */ + VG_LITE_BLEND_PREMULTIPLY_SRC_OVER = 15, /*! S * Sa + (1 - Sa) * D , Non-premultiplied */ + + OPENVG_BLEND_SRC = 0x2000, /*! Copy SRC, no blend, Premultiplied */ + OPENVG_BLEND_SRC_OVER = 0x2001, /*! Porter-Duff SRC_OVER blend, Premultiplied */ + OPENVG_BLEND_DST_OVER = 0x2002, /*! Porter-Duff DST_OVER blend, Premultiplied */ + OPENVG_BLEND_SRC_IN = 0x2003, /*! Porter-Duff SRC_IN blend, Premultiplied */ + OPENVG_BLEND_DST_IN = 0x2004, /*! Porter-Duff DST_IN blend, Premultiplied */ + OPENVG_BLEND_MULTIPLY = 0x2005, /*! Porter-Duff MULTIPLY blend, Premultiplied */ + OPENVG_BLEND_SCREEN = 0x2006, /*! Porter-Duff SCREEN blend, Premultiplied */ + OPENVG_BLEND_DARKEN = 0x2007, /*! Porter-Duff DARKEN blend, Premultiplied */ + OPENVG_BLEND_LIGHTEN = 0x2008, /*! Porter-Duff LIGHTEN blend, Premultiplied */ + OPENVG_BLEND_ADDITIVE = 0x2009, /*! Porter-Duff ADDITIVE blend, Premultiplied */ +} vg_lite_blend_t; + +/* Fill rules. Match OpenVG enum VGFillRule */ +typedef enum vg_lite_fill { + VG_LITE_FILL_EVEN_ODD = 0x1900, /*! A pixel is drawn it it crosses an odd number of path pixels. */ + VG_LITE_FILL_NON_ZERO = 0x1901, /*! A pixel is drawn if it crosses at least one path pixel. */ +} vg_lite_fill_t; + +/* Global alpha modes. */ +typedef enum vg_lite_global_alpha { + VG_LITE_NORMAL = 0, /*! Use original src/dst alpha value. */ + VG_LITE_GLOBAL, /*! Use global src/dst alpha value to replace original src/dst alpha value. */ + VG_LITE_SCALED, /*! Multiply global src/dst alpha value and original src/dst alpha value. */ +} vg_lite_global_alpha_t; + +/* Filter modes. */ +typedef enum vg_lite_filter { + VG_LITE_FILTER_POINT = 0, /*! Fetch the nearest image pixel. */ + VG_LITE_FILTER_LINEAR = 0x1000, /*! Used for linear paint. */ + VG_LITE_FILTER_BI_LINEAR = 0x2000, /*! Use a 2x2 box around the image pixel and perform an interpolation. */ + VG_LITE_FILTER_GAUSSIAN = 0x3000, /*! Perform 3x3 gaussian blur with the convolution for image pixel. */ +} vg_lite_filter_t; + +/* Pattern padding mode. Match OpenVG enum VGTilingMode. */ +typedef enum vg_lite_pattern_mode { + VG_LITE_PATTERN_COLOR = 0x1D00, /*! Pixel outside the bounds of sourceimage should be taken as the color */ + VG_LITE_PATTERN_PAD = 0x1D01, /*! Pixel outside the bounds of sourceimage should be taken as having the same color as the closest edge pixel */ + VG_LITE_PATTERN_REPEAT = 0x1D02, /*! Pixel outside the bounds of sourceimage should be repeated indefinitely in all directions */ + VG_LITE_PATTERN_REFLECT = 0x1D03, /*! Pixel outside the bounds of sourceimage should be reflected indefinitely in all directions */ +} vg_lite_pattern_mode_t; + +/* Paint type. Match OpenVG enum VGPaintType. */ +typedef enum vg_lite_paint_type { + /* For enum value backward compatibility */ + VG_LITE_PAINT_ZERO = 0, + VG_LITE_PAINT_COLOR = 0x1B00, + VG_LITE_PAINT_LINEAR_GRADIENT = 0x1B01, + VG_LITE_PAINT_RADIAL_GRADIENT = 0x1B02, + VG_LITE_PAINT_PATTERN = 0x1B03, +} vg_lite_paint_type_t; + +/* Radial gradient padding mode. Match OpenVG enum VGColorRampSpreadMode */ +typedef enum { + VG_LITE_GRADIENT_SPREAD_FILL = 0, + VG_LITE_GRADIENT_SPREAD_PAD = 0x1C00, + VG_LITE_GRADIENT_SPREAD_REPEAT = 0x1C01, + VG_LITE_GRADIENT_SPREAD_REFLECT = 0x1C02, +} vg_lite_gradient_spreadmode_t; + +/* Decnano Compress mode. */ +typedef enum vg_lite_compress_mode { + VG_LITE_DEC_DISABLE = 0, /*! disable compress */ + VG_LITE_DEC_NON_SAMPLE, /*! compress ratio is 1.6 if use ARGB8888, compress ratio is 2 if use XRGB8888 */ + VG_LITE_DEC_HSAMPLE, /*! compress ratio is 2 if use ARGB8888, compress ratio is 2.6 if use XRGB8888 */ + VG_LITE_DEC_HV_SAMPLE, /*! compress ratio is 2.6 if use ARGB8888, compress ratio is 4 if use XRGB8888 */ +} vg_lite_compress_mode_t; + +/* Draw path type. Match OpenVG enum VGPaintMode */ +typedef enum vg_lite_path_type { + /* For enum value backward compatibility */ + VG_LITE_DRAW_ZERO = 0, + VG_LITE_DRAW_STROKE_PATH = (1 << 0), + VG_LITE_DRAW_FILL_PATH = (1 << 1), + VG_LITE_DRAW_FILL_STROKE_PATH = (1 << 1 | 1 << 0), +} vg_lite_path_type_t; + +/* End cap style. Match OpenVG enum VGCapStyle */ +typedef enum vg_lite_cap_style { + VG_LITE_CAP_BUTT = 0x1700, + VG_LITE_CAP_ROUND = 0x1701, + VG_LITE_CAP_SQUARE = 0x1702, +} vg_lite_cap_style_t; + +/* Line join styles. Match OpenVG enum VGJoinStyle */ +typedef enum vg_lite_join_style { + VG_LITE_JOIN_MITER = 0x1800, + VG_LITE_JOIN_ROUND = 0x1801, + VG_LITE_JOIN_BEVEL = 0x1802, +} vg_lite_join_style_t; + +/* Mask operation mode. Match OpenVG enum VGMaskOperation */ +typedef enum vg_lite_mask_operation { + VG_LITE_CLEAR_MASK = 0x1500, /*! Set all dest mask values to 0 */ + VG_LITE_FILL_MASK = 0x1501, /*! Set all dest mask values to 1 */ + VG_LITE_SET_MASK = 0x1502, /*! Copy from src masklayer to dest masklayer. */ + VG_LITE_UNION_MASK = 0x1503, /*! Replace dest masklayer by its union with src masklayer. */ + VG_LITE_INTERSECT_MASK = 0x1504, /*! Replace dest masklayer by its intersection with src masklayer. */ + VG_LITE_SUBTRACT_MASK = 0x1505, /*! Subtract src mask in dest masklayer */ +} vg_lite_mask_operation_t; + +/* Mirror orientation mode. */ +typedef enum vg_lite_orientation { + VG_LITE_ORIENTATION_TOP_BOTTOM, + VG_LITE_ORIENTATION_BOTTOM_TOP, +} vg_lite_orientation_t; + +/* Gamma conversion mode. */ +typedef enum vg_lite_gamma_conversion { + VG_LITE_GAMMA_NO_CONVERSION, /*! Leave color as is. */ + VG_LITE_GAMMA_LINEAR, /*! Convert from sRGB to linear space. */ + VG_LITE_GAMMA_NON_LINEAR /*! Convert from linear to sRGB space. */ +} vg_lite_gamma_conversion_t; + +/* Index endian */ +typedef enum vg_lite_index_endian { + VG_LITE_INDEX_LITTLE_ENDIAN, /*! Parse the index pixel from low to high, + *! when using index1, the parsing order is bit0~bit7. + *! when using index2, the parsing order is bit0:1,bit2:3,bit4:5.bit6:7. + *! when using index4, the parsing order is bit0:3,bit4:7. + */ + VG_LITE_INDEX_BIG_ENDIAN, /*! Parse the index pixel from low to high, + *! when using index1, the parsing order is bit7~bit0. + *! when using index2, the parsing order is bit7:6,bit5:4,bit3:2.bit1:0. + *! when using index4, the parsing order is bit4:7,bit0:3. + */ +} vg_lite_index_endian_t; + +/* Map flag*/ +typedef enum vg_lite_map_flag { + VG_LITE_MAP_USER_MEMORY = 0, + VG_LITE_MAP_DMABUF = 0x01, +} vg_lite_map_flag_t; + +/*VGLite parameters variable*/ +typedef enum vg_lite_param_type { + VG_LITE_SCISSOR_RECT, /*! count must be 4n for x, y, right, bottom */ + VG_LITE_GPU_IDLE_STATE, /*! 0: busy, 1: idle */ +} vg_lite_param_type_t; + +/* VGLite API Structures ******************************************************************************************************************/ + +/* VGLite driver information */ +typedef struct vg_lite_info { + vg_lite_uint32_t api_version; + vg_lite_uint32_t header_version; + vg_lite_uint32_t release_version; + vg_lite_uint32_t reserved; +} vg_lite_info_t; + +/* A 2D Point definition. */ +typedef struct vg_lite_point { + vg_lite_int32_t x; + vg_lite_int32_t y; +} vg_lite_point_t; + +/* Four 2D Point that form a polygon */ +typedef vg_lite_point_t vg_lite_point4_t[4]; + +/* A rectangle.*/ +typedef struct vg_lite_rectangle { + vg_lite_int32_t x; /*! Left coordinate of rectangle. */ + vg_lite_int32_t y; /*! Top coordinate of rectangle. */ + vg_lite_int32_t width; /*! Width of rectangle. */ + vg_lite_int32_t height; /*! Height of rectangle. */ +} vg_lite_rectangle_t; + +typedef struct vg_lite_matrix { + vg_lite_float_t m[3][3]; /*! The 3x3 matrix is in [row][column] order. */ + vg_lite_float_t scaleX; + vg_lite_float_t scaleY; + vg_lite_float_t angle; +} vg_lite_matrix_t; + +typedef struct vg_lite_yuvinfo { + vg_lite_swizzle_t swizzle; /*! UV swizzle. */ + vg_lite_yuv2rgb_t yuv2rgb; /*! 601 or 709 conversion standard. */ + vg_lite_uint32_t uv_planar; /*! UV(U) planar address. */ + vg_lite_uint32_t v_planar; /*! V planar address. */ + vg_lite_uint32_t alpha_planar; /*! Alpha planar address. */ + vg_lite_uint32_t uv_stride; /*! UV(U) stride. */ + vg_lite_uint32_t v_stride; /*! V stride. */ + vg_lite_uint32_t alpha_stride; /*! Alpha stride. */ + vg_lite_uint32_t uv_height; /*! UV(U) height. */ + vg_lite_uint32_t v_height; /*! V height. */ + vg_lite_pointer uv_memory; /*! The logical pointer to the UV(U) planar memory. */ + vg_lite_pointer v_memory; /*! The logical pointer to the V planar memory. */ + vg_lite_pointer uv_handle; /*! The memory handle of the UV(U) planar. */ + vg_lite_pointer v_handle; /*! The memory handle of the V planar. */ +} vg_lite_yuvinfo_t; + +typedef struct vg_lite_path_point * vg_lite_path_point_ptr; +typedef struct vg_lite_path_point { + /* X coordinate. */ + vg_lite_float_t x; + + /* Y coordinate. */ + vg_lite_float_t y; + + /* Flatten flag for flattened path. */ + vg_lite_uint8_t flatten_flag; + + /* Curve type for stroke path. */ + vg_lite_uint8_t curve_type; + + /* X tangent. */ + vg_lite_float_t tangentX; + + /* Y tangent. */ + vg_lite_float_t tangentY; + + /* Length of the line. */ + vg_lite_float_t length; + + /* Pointer to next point node. */ + vg_lite_path_point_ptr next; + + /* Pointer to previous point node. */ + vg_lite_path_point_ptr prev; + +} vg_lite_path_point_t; + +typedef struct vg_lite_sub_path * vg_lite_sub_path_ptr; +typedef struct vg_lite_sub_path { + /* Pointer to next sub path. */ + vg_lite_sub_path_ptr next; + + /* Number of points. */ + vg_lite_uint32_t point_count; + + /* Point list. */ + vg_lite_path_point_ptr point_list; + + /* Last point. */ + vg_lite_path_point_ptr end_point; + + /* Whether is path is closed. */ + vg_lite_uint8_t closed; + + /* Sub path length. */ + vg_lite_float_t length; + +} vg_lite_sub_path_t; + +/* Save divided path data according to MOVE/MOVE_REL. */ +typedef struct vg_lite_path_list * vg_lite_path_list_ptr; +typedef struct vg_lite_path_list { + vg_lite_path_point_ptr path_points; + vg_lite_path_point_ptr path_end; + vg_lite_uint32_t point_count; + vg_lite_path_list_ptr next; + vg_lite_uint8_t closed; + +} vg_lite_path_list_t; + +typedef struct vg_lite_stroke { + /* Stroke parameters */ + vg_lite_cap_style_t cap_style; + vg_lite_join_style_t join_style; + vg_lite_float_t line_width; + vg_lite_float_t miter_limit; + vg_lite_float_t * dash_pattern; + vg_lite_uint32_t pattern_count; + vg_lite_float_t dash_phase; + vg_lite_float_t dash_length; + vg_lite_uint32_t dash_index; + vg_lite_float_t half_width; + + /* Total length of stroke dash patterns. */ + vg_lite_float_t pattern_length; + + /* For fast checking. */ + vg_lite_float_t miter_square; + + /* Temp storage of stroke subPath. */ + vg_lite_path_point_ptr path_points; + vg_lite_path_point_ptr path_end; + vg_lite_uint32_t point_count; + vg_lite_path_point_ptr left_point; + vg_lite_path_point_ptr right_point; + vg_lite_path_point_ptr stroke_points; + vg_lite_path_point_ptr stroke_end; + vg_lite_uint32_t stroke_count; + + /* Divide stroke path according to move or move_rel for avoiding implicit closure. */ + vg_lite_path_list_ptr path_list_divide; + + /* pointer to current divided path data. */ + vg_lite_path_list_ptr cur_list; + + /* Flag that add end_path in driver. */ + vg_lite_uint8_t add_end; + vg_lite_uint8_t dash_reset; + + /* Sub path list. */ + vg_lite_sub_path_ptr stroke_paths; + + /* Last sub path. */ + vg_lite_sub_path_ptr last_stroke; + + /* Swing area handling. */ + vg_lite_uint32_t swing_handling; + vg_lite_float_t swing_deltax; + vg_lite_float_t swing_deltay; + vg_lite_path_point_ptr swing_start; + vg_lite_path_point_ptr swing_stroke; + vg_lite_float_t swing_length; + vg_lite_float_t swing_centlen; + vg_lite_uint32_t swing_count; + vg_lite_uint8_t need_swing; + vg_lite_uint8_t swing_ccw; + + vg_lite_float_t stroke_length; + vg_lite_uint32_t stroke_size; + + /* The stroke line is fat line. */ + vg_lite_uint8_t fattened; + vg_lite_uint8_t closed; + +} vg_lite_stroke_t; + +/* Fast clear buffer. */ +typedef struct vg_lite_fc_buffer { + vg_lite_int32_t width; /*! Width of the buffer in pixels. */ + vg_lite_int32_t height; /*! height of the buffer in pixels. */ + vg_lite_int32_t stride; /*! The number of bytes to move from one line in the buffer to the next line. */ + vg_lite_pointer + handle; /*! The memory handle of the buffer's memory as allocated by the VGLite kernel. */ + vg_lite_pointer memory; /*! The logical pointer to the buffer's memory for the CPU. */ + vg_lite_uint32_t address; /*! The address to the buffer's memory for the hardware. */ + vg_lite_uint32_t color; /*! The fastclear color value. */ +} vg_lite_fc_buffer_t; + +/* Structure for any image or render target. */ +typedef struct vg_lite_buffer { + vg_lite_int32_t width; /*! Width of the buffer in pixels. */ + vg_lite_int32_t height; /*! Height of the buffer in pixels. */ + vg_lite_int32_t stride; /*! The number of bytes to move from one line in the buffer to the next line. */ + vg_lite_buffer_layout_t tiled; /*! Indicating the buffer memory layout is linear or tiled. */ + vg_lite_buffer_format_t format; /*! The pixel format of the buffer. */ + vg_lite_pointer + handle; /*! The memory handle of the buffer's memory as allocated by the VGLite kernel. */ + vg_lite_pointer memory; /*! The logical pointer to the buffer's memory for the CPU. */ + vg_lite_uint32_t address; /*! The address to the buffer's memory for the hardware. */ + vg_lite_yuvinfo_t yuv; /*! The yuv format details. */ + vg_lite_image_mode_t image_mode; /*! The blit image mode. */ + vg_lite_transparency_t transparency_mode; /*! image transparency mode. */ + vg_lite_fc_buffer_t fc_buffer[3]; /*! 3 fastclear buffers,reserved YUV format. */ + vg_lite_compress_mode_t compress_mode; /*! Refer to the definition by vg_lite_compress_mode_t. */ + vg_lite_index_endian_t index_endian; /*! Refer to the definition by vg_lite_index_endian_t. */ + vg_lite_paint_type_t paintType; /*! Get paintcolor from different paint types. */ + vg_lite_uint8_t fc_enable; /*! enable im fastclear. */ + vg_lite_uint8_t scissor_layer; /*! The buffer is scissor buffer. */ + vg_lite_uint8_t premultiplied; /*! The RGB pixel values are alpha-premultiplied */ +} vg_lite_buffer_t; + +/* Memory allocation info by kernel. */ +typedef struct vg_lite_hw_memory { + vg_lite_pointer handle; /*! gpu memory object handle. */ + vg_lite_pointer memory; /*! logical memory address. */ + vg_lite_uint32_t address; /*! GPU memory address. */ + vg_lite_uint32_t bytes; /*! Size of memory. */ + vg_lite_uint32_t property; /*! Currently bit0 is used for path upload state: + *! 1 : enable auto path data uploading. + *! 0 : disable path data uploading. path data is embedded in command buffer. */ +} vg_lite_hw_memory_t; + +/* Path info for drawing command. */ +typedef struct vg_lite_path { + vg_lite_float_t bounding_box[4]; /*! Bounding box specified as left, top, right, and bottom. */ + vg_lite_quality_t quality; /*! Quality hint for the path. */ + vg_lite_format_t format; /*! Coordinate format. */ + vg_lite_hw_memory_t uploaded; /*! Path data that has been upload into GPU addressable memory. */ + vg_lite_uint32_t path_length; /*! Number of bytes in the path data. */ + vg_lite_pointer path; /*! Pointer to the physical description of the path. */ + vg_lite_int8_t + path_changed; /*! Indicate whether path data is synced with command buffer (uploaded) or not. */ + vg_lite_int8_t pdata_internal; /*! Indicate whether path data memory is allocated by driver. */ + vg_lite_path_type_t path_type; /*! Refer to the definition by vg_lite_path_type_t. */ + vg_lite_stroke_t * stroke; /*! Pointer to a vg_lite_stroke_t structure.*/ + vg_lite_pointer stroke_path; /*! Pointer to the physical description of the stroke path. */ + vg_lite_uint32_t stroke_size; /*! Number of bytes in the stroke path data. */ + vg_lite_color_t stroke_color; /*! The stroke path fill color. */ + vg_lite_int8_t add_end; /*! Flag that add end_path in driver. */ +} vg_lite_path_t; + +/* Color ramp definition. */ +typedef struct vg_lite_color_ramp { + vg_lite_float_t stop; /*! Value for the color stop. */ + vg_lite_float_t red; /*! Red color channel value for the color stop. */ + vg_lite_float_t green; /*! Green color channel value for the color stop. */ + vg_lite_float_t blue; /*! Blue color channel value for the color stop. */ + vg_lite_float_t alpha; /*! Alpha color channel value for the color stop. */ +} vg_lite_color_ramp_t; + +/* Linear gradient parameter */ +typedef struct vg_lite_linear_gradient_parameter { + vg_lite_float_t X0; + vg_lite_float_t Y0; + vg_lite_float_t X1; + vg_lite_float_t Y1; +} vg_lite_linear_gradient_parameter_t; + +typedef struct vg_lite_radial_gradient_parameter { + vg_lite_float_t cx; /*! x coordinate of the center point. */ + vg_lite_float_t cy; /*! y coordinate of the center point. */ + vg_lite_float_t r; /*! radius. */ + vg_lite_float_t fx; /*! x coordinate of the focal point. */ + vg_lite_float_t fy; /*! y coordinate of the focal point. */ +} vg_lite_radial_gradient_parameter_t; + +/* Linear gradient definition. */ +typedef struct vg_lite_linear_gradient { + vg_lite_uint32_t colors[VLC_MAX_GRADIENT_STOPS]; /*! Colors for stops. */ + vg_lite_uint32_t count; /*! Count of colors, up to 16. */ + vg_lite_uint32_t stops[VLC_MAX_GRADIENT_STOPS]; /*! Color stops, value from 0 to 255. */ + vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ + vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ +} vg_lite_linear_gradient_t; + +/* Extended linear gradient definition. */ +typedef struct vg_lite_ext_linear_gradient { + vg_lite_uint32_t count; /*! Count of colors, up to 256. */ + vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ + vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ + vg_lite_linear_gradient_parameter_t linear_grad; /*! Include center point,focal point and radius.*/ + + vg_lite_uint32_t ramp_length; /*! Color ramp for gradient paints provided to driver. */ + vg_lite_color_ramp_t color_ramp[VLC_MAX_COLOR_RAMP_STOPS]; + + vg_lite_uint32_t converted_length; /*! Converted internal color ramp. */ + vg_lite_color_ramp_t converted_ramp[VLC_MAX_COLOR_RAMP_STOPS + 2]; + + vg_lite_uint8_t + pre_multiplied; /*! If color values of color_ramp[] are multiply by alpha value of color_ramp[]. */ + vg_lite_gradient_spreadmode_t + spread_mode; /*! The spread mode that applied to the pixels out of the image after transformed. */ +} vg_lite_ext_linear_gradient_t; + +/* Radial gradient definition. */ +typedef struct vg_lite_radial_gradient { + vg_lite_uint32_t count; /*! Count of colors, up to 256. */ + vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ + vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ + vg_lite_radial_gradient_parameter_t radial_grad; /*! Include center point,focal point and radius.*/ + + vg_lite_uint32_t ramp_length; /*! Color ramp for gradient paints provided to the driver. */ + vg_lite_color_ramp_t color_ramp[VLC_MAX_COLOR_RAMP_STOPS]; + + vg_lite_uint32_t converted_length; /*! Converted internal color ramp. */ + vg_lite_color_ramp_t converted_ramp[VLC_MAX_COLOR_RAMP_STOPS + 2]; + + vg_lite_uint8_t + pre_multiplied; /*! If color values of color_ramp[] are multiply by alpha value of color_ramp[]. */ + vg_lite_gradient_spreadmode_t + spread_mode; /*! The spread mode that applied to the pixels out of the image after transformed. */ +} vg_lite_radial_gradient_t; + +/* Colorkey definition */ +typedef struct vg_lite_color_key { + vg_lite_uint8_t enable; /*! The color key is effective only when "enable" is true, */ + vg_lite_uint8_t low_r; /*! The R channel of low_rgb. */ + vg_lite_uint8_t low_g; /*! The G channel of low_rgb. */ + vg_lite_uint8_t low_b; /*! The B channel of low_rgb. */ + vg_lite_uint8_t alpha; /*! The alpha channel to replace destination pixel alpha channel.*/ + vg_lite_uint8_t high_r; /*! The R channel of high_rgb. */ + vg_lite_uint8_t high_g; /*! The G channel of high_rgb. */ + vg_lite_uint8_t high_b; /*! The B channel of high_rgb. */ +} vg_lite_color_key_t; + +/* Four colorkey definition. + * rgb_hi_0, rgb_lo_0, alpha_0, enable_0; + * rgb_hi_1, rgb_lo_1, alpha_1, enable_1; + * rgb_hi_2, rgb_lo_2, alpha_2, enable_2; + * rgb_hi_3, rgb_lo_3, alpha_3, enable_3; + * Priority order: color_key_0 > color_key_1 > color_key_2 > color_key_3. +*/ +typedef vg_lite_color_key_t vg_lite_color_key4_t[4]; + +/* Pixel matrix values */ +typedef vg_lite_float_t vg_lite_pixel_matrix_t[20]; + +/* HW pixel channel enable flags */ +typedef struct vg_lite_pixel_channel_enable { + vg_lite_uint8_t enable_a; /*! Enable A channel.*/ + vg_lite_uint8_t enable_b; /*! Enable B channel. */ + vg_lite_uint8_t enable_g; /*! Enable G channel. */ + vg_lite_uint8_t enable_r; /*! Enable R channel. */ +} vg_lite_pixel_channel_enable_t; + +/* Pixel color transform */ +typedef struct vg_lite_color_transform { + vg_lite_float_t a_scale; + vg_lite_float_t a_bias; + vg_lite_float_t r_scale; + vg_lite_float_t r_bias; + vg_lite_float_t g_scale; + vg_lite_float_t g_bias; + vg_lite_float_t b_scale; + vg_lite_float_t b_bias; +} vg_lite_color_transform_t; + +/* VGLite API Functions *******************************************************************************************************************/ + +/* Initialize a vglite context. */ +vg_lite_error_t vg_lite_init(vg_lite_int32_t tess_width, vg_lite_int32_t tess_height); + +/* Destroy a vglite context. */ +vg_lite_error_t vg_lite_close(void); + +/* Get the VGLite driver information. */ +vg_lite_error_t vg_lite_get_info(vg_lite_info_t * info); + +/* Get the GPU chip information. */ +vg_lite_uint32_t vg_lite_get_product_info(vg_lite_char * name, vg_lite_uint32_t * chip_id, vg_lite_uint32_t * chip_rev); + +/* Query if a specific feature is supported. */ +vg_lite_uint32_t vg_lite_query_feature(vg_lite_feature_t feature); + +/* Flush command buffer and wait for GPU to complete. */ +vg_lite_error_t vg_lite_finish(void); + +/* Flush the command buffer without waiting for GPU to complete. */ +vg_lite_error_t vg_lite_flush(void); + +/* Get the value of register from register's address. */ +vg_lite_error_t vg_lite_get_register(vg_lite_uint32_t address, vg_lite_uint32_t * result); + +/* Generate a 3x3 homogeneous matrix to transform 4 source coordinates to 4 target coordinates. */ +vg_lite_error_t vg_lite_get_transform_matrix(vg_lite_point4_t src, vg_lite_point4_t dst, vg_lite_matrix_t * mat); + +/* Allocate a buffer from GPU hardware accessible memory. */ +vg_lite_error_t vg_lite_allocate(vg_lite_buffer_t * buffer); + +/* Free a buffer allocated by vg_lite_allocate() */ +vg_lite_error_t vg_lite_free(vg_lite_buffer_t * buffer); + +/* Upload RGB or YUV pixel data to an allocated buffer. */ +vg_lite_error_t vg_lite_upload_buffer(vg_lite_buffer_t * buffer, vg_lite_uint8_t * data[3], vg_lite_uint32_t stride[3]); + +/* Map a buffer into hardware accessible address space. */ +vg_lite_error_t vg_lite_map(vg_lite_buffer_t * buffer, vg_lite_map_flag_t flag, int32_t fd); + +/* Unmap a buffer that is mapped */ +vg_lite_error_t vg_lite_unmap(vg_lite_buffer_t * buffer); + +/* flush cache */ +vg_lite_error_t vg_lite_flush_mapped_buffer(vg_lite_buffer_t * buffer); + +/* Fill a buffer rectangle area with a specified color. */ +vg_lite_error_t vg_lite_clear(vg_lite_buffer_t * target, vg_lite_rectangle_t * rect, vg_lite_color_t color); + +/* Copy a source image to target buffer with transformation, blending, color mixing, and filtering. */ +vg_lite_error_t vg_lite_blit(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter); + +/* Copy a rectangle area of source image to target buffer with transformation, blending, color mixing, and filtering. */ +vg_lite_error_t vg_lite_blit_rect(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_rectangle_t * rect, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter); + +/* Copy two source images to the target buffer with transformation, blending, and filtering. */ +vg_lite_error_t vg_lite_blit2(vg_lite_buffer_t * target, + vg_lite_buffer_t * source0, + vg_lite_buffer_t * source1, + vg_lite_matrix_t * matrix0, + vg_lite_matrix_t * matrix1, + vg_lite_blend_t blend, + vg_lite_filter_t filter); + +/* Copy a rectangle area of source image to target buffer without transformation, blending, color mixing, and filtering. */ +vg_lite_error_t vg_lite_copy_image(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_int32_t sx, + vg_lite_int32_t sy, + vg_lite_int32_t dx, + vg_lite_int32_t dy, + vg_lite_int32_t width, + vg_lite_int32_t height); + +/* Draw a path to a target buffer with transformation, color, and blending */ +vg_lite_error_t vg_lite_draw(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color); + +/* Set stroke path attributes. */ +vg_lite_error_t vg_lite_set_stroke(vg_lite_path_t * path, + vg_lite_cap_style_t cap_style, + vg_lite_join_style_t join_style, + vg_lite_float_t line_width, + vg_lite_float_t miter_limit, + vg_lite_float_t * dash_pattern, + vg_lite_uint32_t pattern_count, + vg_lite_float_t dash_phase, + vg_lite_color_t color); + +/* Update stroke path. */ +vg_lite_error_t vg_lite_update_stroke(vg_lite_path_t * path); + +/* Set path type. */ +vg_lite_error_t vg_lite_set_path_type(vg_lite_path_t * path, vg_lite_path_type_t path_type); + +/* Clears all attributes of a path. */ +vg_lite_error_t vg_lite_clear_path(vg_lite_path_t * path); + +/* Upload a path to GPU memory so GPU can access it directly. */ +vg_lite_error_t vg_lite_upload_path(vg_lite_path_t * path); + +/* Initialize a path object with attributes. */ +vg_lite_error_t vg_lite_init_path(vg_lite_path_t * path, + vg_lite_format_t format, + vg_lite_quality_t quality, + vg_lite_uint32_t length, + vg_lite_pointer data, + vg_lite_float_t min_x, + vg_lite_float_t min_y, + vg_lite_float_t max_x, + vg_lite_float_t max_y); + +/* Initializes a arc path with attributes. */ +vg_lite_error_t vg_lite_init_arc_path(vg_lite_path_t * path, + vg_lite_format_t format, + vg_lite_quality_t quality, + vg_lite_uint32_t length, + vg_lite_pointer data, + vg_lite_float_t min_x, + vg_lite_float_t min_y, + vg_lite_float_t max_x, + vg_lite_float_t max_y); + +/* Return the size (in bytes) of command buffer for a path opcode array. */ +vg_lite_uint32_t vg_lite_get_path_length(vg_lite_uint8_t * opcode, + vg_lite_uint32_t count, + vg_lite_format_t format); + +/* Generate command buffer for the (path) based on input opcodes (opcode) and coordinates (data). */ +vg_lite_error_t vg_lite_append_path(vg_lite_path_t * path, + vg_lite_uint8_t * opcode, + vg_lite_pointer data, + vg_lite_uint32_t seg_count); + +/* Set CLUT (Color Look Up Table) for index image. The (colors) is in ARGB format. */ +vg_lite_error_t vg_lite_set_CLUT(vg_lite_uint32_t count, vg_lite_uint32_t * colors); + +/* Draw a path that is filled by a transformed image pattern. */ +vg_lite_error_t vg_lite_draw_pattern(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_buffer_t * pattern_image, + vg_lite_matrix_t * pattern_matrix, + vg_lite_blend_t blend, + vg_lite_pattern_mode_t pattern_mode, + vg_lite_color_t pattern_color, + vg_lite_color_t color, + vg_lite_filter_t filter); + +/* Initialize a linear gradient object with default attributes. */ +vg_lite_error_t vg_lite_init_grad(vg_lite_linear_gradient_t * grad); + +/* Reset a linear gradient object attributes. */ +vg_lite_error_t vg_lite_clear_grad(vg_lite_linear_gradient_t * grad); + +/* Update a linear gradient object. */ +vg_lite_error_t vg_lite_update_grad(vg_lite_linear_gradient_t * grad); + +/* Return pointer to a linear gradient object's matrix. */ +vg_lite_matrix_t * vg_lite_get_grad_matrix(vg_lite_linear_gradient_t * grad); + +/* Set attributes for a linear gradient object. */ +vg_lite_error_t vg_lite_set_grad(vg_lite_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_uint32_t * colors, + vg_lite_uint32_t * stops); + +/* Draw a path with a linear gradient object pattern. */ +vg_lite_error_t vg_lite_draw_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_linear_gradient_t * grad, + vg_lite_blend_t blend); + +/* Reset an extended linear gradient object attributes and free image buffer. */ +vg_lite_error_t vg_lite_clear_linear_grad(vg_lite_ext_linear_gradient_t * grad); + +/* Update an extended linear gradient object. */ +vg_lite_error_t vg_lite_update_linear_grad(vg_lite_ext_linear_gradient_t * grad); + +/* Return pointer to an extended linear gradient object's matrix. */ +vg_lite_matrix_t * vg_lite_get_linear_grad_matrix(vg_lite_ext_linear_gradient_t * grad); + +/* Set attributes for an extended linear gradient object. */ +vg_lite_error_t vg_lite_set_linear_grad(vg_lite_ext_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_linear_gradient_parameter_t grad_param, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_mult); + +/* Draw a path with an extended linear gradient object. */ +vg_lite_error_t vg_lite_draw_linear_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_ext_linear_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter); + +/* Reset a radial gradient object attributes and free image buffer. */ +vg_lite_error_t vg_lite_clear_radial_grad(vg_lite_radial_gradient_t * grad); + +/* Update a radial gradient object. */ +vg_lite_error_t vg_lite_update_radial_grad(vg_lite_radial_gradient_t * grad); + +/* Return pointer to a radial gradient object's matrix. */ +vg_lite_matrix_t * vg_lite_get_radial_grad_matrix(vg_lite_radial_gradient_t * grad); + +/* Set attributes for a radial gradient object. */ +vg_lite_error_t vg_lite_set_radial_grad(vg_lite_radial_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_radial_gradient_parameter_t grad_param, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_mult); + +/* Draw a path with a radial gradient object pattern. */ +vg_lite_error_t vg_lite_draw_radial_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_radial_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter); + +/* Load an identity matrix. */ +vg_lite_error_t vg_lite_identity(vg_lite_matrix_t * matrix); + +/* Translate a matrix. */ +vg_lite_error_t vg_lite_translate(vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t * matrix); + +/* Scale a matrix. */ +vg_lite_error_t vg_lite_scale(vg_lite_float_t scale_x, vg_lite_float_t scale_y, vg_lite_matrix_t * matrix); + +/* Rotate a matrix. */ +vg_lite_error_t vg_lite_rotate(vg_lite_float_t degrees, vg_lite_matrix_t * matrix); + +/* Set and enable a scissor rectangle for render target. */ +vg_lite_error_t vg_lite_set_scissor(vg_lite_int32_t x, vg_lite_int32_t y, vg_lite_int32_t right, + vg_lite_int32_t bottom); + +/* Set scissor rectangles on mask layer. Scissor rects are enabled/disabled by following APIs. */ +vg_lite_error_t vg_lite_scissor_rects(vg_lite_uint32_t nums, vg_lite_rectangle_t rect[]); + +/* Enable scissor rects defined on mask layer. */ +vg_lite_error_t vg_lite_enable_scissor(void); + +/* Disable scissor rects defined on mask layer. */ +vg_lite_error_t vg_lite_disable_scissor(void); + +/* Query size of available contiguous video memory. */ +vg_lite_error_t vg_lite_get_mem_size(vg_lite_uint32_t * size); + +/* Set global alpha value for source image */ +vg_lite_error_t vg_lite_source_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value); + +/* Set global alpha value for destination image. */ +vg_lite_error_t vg_lite_dest_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value); + +/* Set colorkey. */ +vg_lite_error_t vg_lite_set_color_key(vg_lite_color_key4_t colorkey); + +/* Enable dither function. Dither is OFF by default. */ +vg_lite_error_t vg_lite_enable_dither(void); + +/* Disable dither function. Dither is OFF by default. */ +vg_lite_error_t vg_lite_disable_dither(void); + +/* Set a 64-byte aligned memory buffer (physical) as VGLite tessellation buffer. */ +vg_lite_error_t vg_lite_set_tess_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size); + +/* Can be called before vg_lite_init() to overwrite the default VG_LITE_COMMAND_BUFFER_SIZE */ +vg_lite_error_t vg_lite_set_command_buffer_size(vg_lite_uint32_t size); + +/* Set a user-defined external memory buffer (physical, 64-byte aligned) as VGLite command buffer. */ +vg_lite_error_t vg_lite_set_command_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size); + +/* Setup a pixel transform matrix m[20] which transforms each pixel as following: + * + * |a'| |m0 m1 m2 m3 m4 | |a| + * |r'| |m5 m6 m7 m8 m9 | |r| + * |g'| = |m10 m11 m12 m13 m14|.|g| + * |b'| |m15 m16 m17 m18 m19| |b| + * |1 | |0 0 0 0 1 | |1| + * + * The pixel transform for A, R, G, B channel can be enabled/disabled individually with (channel) parameter. + */ +vg_lite_error_t vg_lite_set_pixel_matrix(vg_lite_pixel_matrix_t matrix, vg_lite_pixel_channel_enable_t * channel); + +/* Setup 3x3 gaussian blur weight values to filter image pixels. + * + * Parameters w0, w1, w2 define a 3x3 gaussian blur weight matrix as below + * + * | w2 w1 w2 | + * | w1 w0 w1 | + * | w2 w1 w2 | + * + * The sum of 9 kernel weights must be 1.0 to avoid convolution overflow ( w0 + 4*w1 + 4*w2 = 1.0 ). + * The 3x3 weight matrix applies to a 3x3 pixel block + * + * | pixel[i-1][j-1] pixel[i][j-1] pixel[i+1][j-1]| + * | pixel[i-1][j] pixel[i][j] pixel[i+1][j] | + * | pixel[i-1][j+1] pixel[i][j+1] pixel[i+1][j+1]| + * + * With the following dot product equation: + * + * color[i][j] = w2*pixel[i-1][j-1] + w1*pixel[i][j-1] + w2*pixel[i+1][j-1] + * + w1*pixel[i-1][j] + w0*pixel[i][j] + w1*pixel[i+1][j] + * + w2*pixel[i-1][j+1] + w1*pixel[i][j+1] + w2*pixel[i+1][j+1]; + */ +vg_lite_error_t vg_lite_gaussian_filter(vg_lite_float_t w0, vg_lite_float_t w1, vg_lite_float_t w2); + +/* Enable masklayer function. Masklayer is OFF by default. */ +vg_lite_error_t vg_lite_enable_masklayer(void); + +/* Disable masklayer function. Masklayer is OFF by default. */ +vg_lite_error_t vg_lite_disable_masklayer(void); + +/* Setup a masklayer. */ +vg_lite_error_t vg_lite_set_masklayer(vg_lite_buffer_t * masklayer); + +/* Free a masklayer and disable mask operation. */ +vg_lite_error_t vg_lite_destroy_masklayer(vg_lite_buffer_t * masklayer); + +/* Create a masklayer with default format A8 and default pixel value 255. */ +vg_lite_error_t vg_lite_create_masklayer(vg_lite_buffer_t * masklayer, + vg_lite_uint32_t width, + vg_lite_uint32_t height); + +/* Set pixel values for a rectangle area in a masklayer */ +vg_lite_error_t vg_lite_fill_masklayer(vg_lite_buffer_t * masklayer, + vg_lite_rectangle_t * rect, + vg_lite_uint8_t value); + +/* Blend a rectangle area of src masklayer with dst masklayer according to (operation). */ +vg_lite_error_t vg_lite_blend_masklayer(vg_lite_buffer_t * dst, + vg_lite_buffer_t * src, + vg_lite_mask_operation_t operation, + vg_lite_rectangle_t * rect); + +/* Render a (path) with (fill_rule), (color), (matrix) to the masklayer. */ +vg_lite_error_t vg_lite_render_masklayer(vg_lite_buffer_t * masklayer, + vg_lite_mask_operation_t operation, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_color_t color, + vg_lite_matrix_t * matrix); + +/* Set mirror orientation. */ +vg_lite_error_t vg_lite_set_mirror(vg_lite_orientation_t orientation); + +/* Set gamma value. */ +vg_lite_error_t vg_lite_set_gamma(vg_lite_gamma_conversion_t gamma_value); + +/* Enable color transformation, which is OFF by default. */ +vg_lite_error_t vg_lite_enable_color_transform(void); + +/* Disable color transformation, which is OFF by default. */ +vg_lite_error_t vg_lite_disable_color_transform(void); + +/* Set pixel color transformation scale and bias values for each pixel channel. */ +vg_lite_error_t vg_lite_set_color_transform(vg_lite_color_transform_t * values); + +/* Set flexa stream id. */ +vg_lite_error_t vg_lite_flexa_set_stream(vg_lite_uint8_t stream_id); + +/* set flexa background buffer.*/ +vg_lite_error_t vg_lite_flexa_bg_buffer(vg_lite_uint8_t stream_id, + vg_lite_buffer_t * buffer, + vg_lite_uint32_t seg_count, + vg_lite_uint32_t seg_size); + +/* Enable flexa. */ +vg_lite_error_t vg_lite_flexa_enable(void); + +/* Disable flexa.*/ +vg_lite_error_t vg_lite_flexa_disable(void); + +/* Set flexa stop flag after the last frame. */ +vg_lite_error_t vg_lite_flexa_stop_frame(void); + +/* Dump command buffer */ +vg_lite_error_t vg_lite_dump_command_buffer(void); + +/* Return VGLite parameters in params[] array */ +vg_lite_error_t vg_lite_get_parameter(vg_lite_param_type_t type, + vg_lite_int32_t count, + vg_lite_float_t * params); + +#endif /* VGLITE_VERSION_3_0 */ + +#ifdef __cplusplus +} +#endif +#endif /* _vg_lite_h_ */ diff --git a/inc/lvgl/src/debugging/vg_lite_tvg/vg_lite_matrix.c b/inc/lvgl/src/debugging/vg_lite_tvg/vg_lite_matrix.c new file mode 100644 index 0000000..42f8ce3 --- /dev/null +++ b/inc/lvgl/src/debugging/vg_lite_tvg/vg_lite_matrix.c @@ -0,0 +1,162 @@ +/** + * @file vg_lite_matrix.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE && LV_USE_VG_LITE_THORVG + +#include +#include +#include "vg_lite.h" + +/********************* + * DEFINES + *********************/ + +#define VG_SW_BLIT_PRECISION_OPT 1 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +vg_lite_error_t vg_lite_identity(vg_lite_matrix_t * matrix) +{ + /* Set identify matrix. */ + matrix->m[0][0] = 1.0f; + matrix->m[0][1] = 0.0f; + matrix->m[0][2] = 0.0f; + matrix->m[1][0] = 0.0f; + matrix->m[1][1] = 1.0f; + matrix->m[1][2] = 0.0f; + matrix->m[2][0] = 0.0f; + matrix->m[2][1] = 0.0f; + matrix->m[2][2] = 1.0f; + +#if VG_SW_BLIT_PRECISION_OPT + matrix->scaleX = 1.0f; + matrix->scaleY = 1.0f; + matrix->angle = 0.0f; +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + return VG_LITE_SUCCESS; +} + +static void multiply(vg_lite_matrix_t * matrix, vg_lite_matrix_t * mult) +{ + vg_lite_matrix_t temp; + int row, column; + + /* Process all rows. */ + for(row = 0; row < 3; row++) { + /* Process all columns. */ + for(column = 0; column < 3; column++) { + /* Compute matrix entry. */ + temp.m[row][column] = (matrix->m[row][0] * mult->m[0][column]) + + (matrix->m[row][1] * mult->m[1][column]) + + (matrix->m[row][2] * mult->m[2][column]); + } + } + + /* Copy temporary matrix into result. */ +#if VG_SW_BLIT_PRECISION_OPT + memcpy(matrix, &temp, sizeof(vg_lite_float_t) * 9); +#else + memcpy(matrix, &temp, sizeof(temp)); +#endif /* VG_SW_BLIT_PRECISION_OPT */ +} + +vg_lite_error_t vg_lite_translate(vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t * matrix) +{ + /* Set translation matrix. */ + vg_lite_matrix_t t = { { {1.0f, 0.0f, x}, + {0.0f, 1.0f, y}, + {0.0f, 0.0f, 1.0f}, + }, + 0.0f, 0.0f, 0.0f + }; + + /* Multiply with current matrix. */ + multiply(matrix, &t); + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_scale(vg_lite_float_t scale_x, vg_lite_float_t scale_y, vg_lite_matrix_t * matrix) +{ + /* Set scale matrix. */ + vg_lite_matrix_t s = { { {scale_x, 0.0f, 0.0f}, + {0.0f, scale_y, 0.0f}, + {0.0f, 0.0f, 1.0f}, + }, + 0.0f, 0.0f, 0.0f + }; + + /* Multiply with current matrix. */ + multiply(matrix, &s); + +#if VG_SW_BLIT_PRECISION_OPT + matrix->scaleX = matrix->scaleX * scale_x; + matrix->scaleY = matrix->scaleY * scale_y; +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_rotate(vg_lite_float_t degrees, vg_lite_matrix_t * matrix) +{ + /* Convert degrees into radians. */ + vg_lite_float_t angle = (degrees / 180.0f) * 3.141592654f; + + /* Compute cosine and sine values. */ + vg_lite_float_t cos_angle = cosf(angle); + vg_lite_float_t sin_angle = sinf(angle); + + /* Set rotation matrix. */ + vg_lite_matrix_t r = { { {cos_angle, -sin_angle, 0.0f}, + {sin_angle, cos_angle, 0.0f}, + {0.0f, 0.0f, 1.0f}, + }, + 0.0f, 0.0f, 0.0f + }; + + /* Multiply with current matrix. */ + multiply(matrix, &r); + +#if VG_SW_BLIT_PRECISION_OPT + matrix->angle = matrix->angle + degrees; + if(matrix->angle >= 360) { + vg_lite_uint32_t count = (vg_lite_uint32_t)matrix->angle / 360; + matrix->angle = matrix->angle - count * 360; + } +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + return VG_LITE_SUCCESS; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_VG_LITE_THORVG*/ diff --git a/inc/lvgl/src/debugging/vg_lite_tvg/vg_lite_tvg.cpp b/inc/lvgl/src/debugging/vg_lite_tvg/vg_lite_tvg.cpp new file mode 100644 index 0000000..e2e4016 --- /dev/null +++ b/inc/lvgl/src/debugging/vg_lite_tvg/vg_lite_tvg.cpp @@ -0,0 +1,3076 @@ +/** + * @file vg_lite_tvg.cpp + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_DRAW_VG_LITE && LV_USE_VG_LITE_THORVG + +#include "vg_lite.h" +#include "../../lvgl.h" +#include "../../libs/thorvg/thorvg.h" +#include +#include +#include +#include +#include +#include + +#if LV_VG_LITE_THORVG_YUV_SUPPORT + #include +#endif + +/********************* + * DEFINES + *********************/ + +#define TVG_CANVAS_ENGINE CanvasEngine::Sw +#define TVG_COLOR(COLOR) B(COLOR), G(COLOR), R(COLOR), A(COLOR) +#define TVG_IS_VG_FMT_SUPPORT(fmt) ((fmt) == VG_LITE_BGRA8888 || (fmt) == VG_LITE_BGRX8888) + +#define TVG_CHECK_RETURN_VG_ERROR(FUNC) \ + do { \ + Result res = FUNC; \ + if (res != Result::Success) { \ + LV_LOG_ERROR("Executed '" #FUNC "' error: %d", (int)res); \ + return vg_lite_error_conv(res); \ + } \ + } while (0) +#define TVG_CHECK_RETURN_RESULT(FUNC) \ + do { \ + Result res = FUNC; \ + if (res != Result::Success) { \ + LV_LOG_ERROR("Executed '" #FUNC "' error: %d", (int)res);\ + return res; \ + } \ + } while (0) + +/* clang-format off */ + +#define IS_INDEX_FMT(fmt) \ + ((fmt) == VG_LITE_INDEX_1 \ + || (fmt) == VG_LITE_INDEX_2 \ + || (fmt) == VG_LITE_INDEX_4 \ + || (fmt) == VG_LITE_INDEX_8) + +#define VLC_GET_ARG(CUR, INDEX) vlc_get_arg((cur + (INDEX) * fmt_len), path->format); +#define VLC_GET_OP_CODE(ptr) (*((uint8_t*)ptr)) +#define VLC_OP_ARG_LEN(OP, LEN) \ + case VLC_OP_##OP: \ + return (LEN) + +#define A(color) ((color) >> 24) +#define R(color) (((color) & 0x00ff0000) >> 16) +#define G(color) (((color) & 0x0000ff00) >> 8) +#define B(color) ((color) & 0xff) +#define ARGB(a, r, g, b) ((a) << 24) | ((r) << 16) | ((g) << 8) | (b) +#define MIN(a, b) (a) > (b) ? (b) : (a) +#define MAX(a, b) (a) > (b) ? (a) : (b) +#define UDIV255(x) (((x) * 0x8081U) >> 0x17) +#define LERP(v1, v2, w) ((v1) * (w) + (v2) * (1.0f - (w))) +#define CLAMP(x, min, max) (((x) < (min)) ? (min) : ((x) > (max)) ? (max) : (x)) +#define COLOR_FROM_RAMP(ColorRamp) (((vg_lite_float_t*)ColorRamp) + 1) + +#define VG_LITE_RETURN_ERROR(func) \ + if ((error = func) != VG_LITE_SUCCESS) \ + return error + +#define VG_LITE_ALIGN(number, align_bytes) \ + (((number) + ((align_bytes)-1)) & ~((align_bytes)-1)) + +#define VG_LITE_IS_ALIGNED(num, align) (((uintptr_t)(num) & ((align)-1)) == 0) + +#define VG_LITE_IS_ALPHA_FORMAT(format) \ + ((format) == VG_LITE_A8 || (format) == VG_LITE_A4) + +/* clang-format on */ + +/********************** + * TYPEDEFS + **********************/ + +using namespace tvg; + +#pragma pack(1) +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; +} vg_color24_t; + +typedef struct { + uint16_t blue : 5; + uint16_t green : 6; + uint16_t red : 5; +} vg_color16_t; + +typedef struct { + vg_color16_t c; + uint8_t alpha; +} vg_color16_alpha_t; + +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; + uint8_t alpha; +} vg_color32_t; + +typedef struct { + uint8_t blue : 4; + uint8_t green : 4; + uint8_t red : 4; + uint8_t alpha : 4; +} vg_color_bgra4444_t; + +typedef struct { + uint8_t blue : 2; + uint8_t green : 2; + uint8_t red : 2; + uint8_t alpha : 2; +} vg_color_bgra2222_t; + +typedef struct { + uint8_t blue : 5; + uint8_t green : 5; + uint8_t red : 5; + uint8_t alpha : 1; +} vg_color_bgra5551_t; + +typedef struct { + vg_lite_float_t x; + vg_lite_float_t y; +} vg_lite_fpoint_t; + +#pragma pack() + +class vg_lite_ctx +{ + public: + std::unique_ptr canvas; + void * target_buffer; + void * tvg_target_buffer; + vg_lite_uint32_t target_px_size; + vg_lite_buffer_format_t target_format; + vg_lite_rectangle_t scissor_rect; + bool scissor_is_set; + + public: + vg_lite_ctx() + : target_buffer { nullptr } + , tvg_target_buffer { nullptr } + , target_px_size { 0 } + , target_format { VG_LITE_BGRA8888 } + , scissor_rect { 0, 0, 0, 0 } + , scissor_is_set { false } + , clut_2colors { 0 } + , clut_4colors { 0 } + , clut_16colors { 0 } + , clut_256colors { 0 } + { + canvas = SwCanvas::gen(); + } + + vg_lite_uint32_t * get_image_buffer(vg_lite_uint32_t w, vg_lite_uint32_t h) + { + src_buffer.resize(w * h); + return src_buffer.data(); + } + + vg_lite_uint32_t * get_temp_target_buffer(vg_lite_uint32_t w, vg_lite_uint32_t h) + { + vg_lite_uint32_t px_size = w * h; + if(px_size > dest_buffer.size()) { + dest_buffer.resize(w * h); + } + return dest_buffer.data(); + } + + vg_lite_uint32_t * get_temp_target_buffer() + { + return dest_buffer.data(); + } + + void set_CLUT(vg_lite_uint32_t count, const vg_lite_uint32_t * colors) + { + switch(count) { + case 2: + memcpy(clut_2colors, colors, sizeof(clut_2colors)); + break; + case 4: + memcpy(clut_4colors, colors, sizeof(clut_4colors)); + break; + case 16: + memcpy(clut_16colors, colors, sizeof(clut_16colors)); + break; + case 256: + memcpy(clut_256colors, colors, sizeof(clut_256colors)); + break; + default: + LV_ASSERT(false); + break; + } + } + + const vg_lite_uint32_t * get_CLUT(vg_lite_buffer_format_t format) + { + switch(format) { + case VG_LITE_INDEX_1: + return clut_2colors; + + case VG_LITE_INDEX_2: + return clut_2colors; + + case VG_LITE_INDEX_4: + return clut_4colors; + + case VG_LITE_INDEX_8: + return clut_256colors; + + default: + break; + } + + LV_ASSERT(false); + return nullptr; + } + + static vg_lite_ctx * get_instance() + { + static vg_lite_ctx instance; + return &instance; + } + + private: + /* */ + std::vector src_buffer; + std::vector dest_buffer; + + vg_lite_uint32_t clut_2colors[2]; + vg_lite_uint32_t clut_4colors[4]; + vg_lite_uint32_t clut_16colors[16]; + vg_lite_uint32_t clut_256colors[256]; +}; + +template +class vg_lite_converter +{ + public: + typedef void (*converter_cb_t)(DEST_TYPE * dest, const SRC_TYPE * src, vg_lite_uint32_t px_size, + vg_lite_uint32_t color); + + public: + vg_lite_converter(converter_cb_t converter) + : _converter_cb(converter) + { + } + + void convert(vg_lite_buffer_t * dest_buf, const vg_lite_buffer_t * src_buf, vg_lite_uint32_t color = 0) + { + LV_ASSERT(_converter_cb); + uint8_t * dest = (uint8_t *)dest_buf->memory; + const uint8_t * src = (const uint8_t *)src_buf->memory; + vg_lite_uint32_t h = src_buf->height; + + while(h--) { + _converter_cb((DEST_TYPE *)dest, (const SRC_TYPE *)src, src_buf->width, color); + dest += dest_buf->stride; + src += src_buf->stride; + } + } + + private: + converter_cb_t _converter_cb; +}; + +typedef vg_lite_float_t FLOATVECTOR4[4]; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static vg_lite_error_t vg_lite_error_conv(Result result); +static Matrix matrix_conv(const vg_lite_matrix_t * matrix); +static FillRule fill_rule_conv(vg_lite_fill_t fill); +static BlendMethod blend_method_conv(vg_lite_blend_t blend); +static StrokeCap stroke_cap_conv(vg_lite_cap_style_t cap); +static StrokeJoin stroke_join_conv(vg_lite_join_style_t join); +static FillSpread fill_spread_conv(vg_lite_gradient_spreadmode_t spread); +static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t * path, vg_lite_matrix_t * matrix); +static Result shape_append_rect(std::unique_ptr & shape, const vg_lite_buffer_t * target, + const vg_lite_rectangle_t * rect); +static Result canvas_set_target(vg_lite_ctx * ctx, vg_lite_buffer_t * target); +static Result picture_load(vg_lite_ctx * ctx, std::unique_ptr & picture, const vg_lite_buffer_t * source, + vg_lite_color_t color = 0); + +static inline bool math_zero(float a) +{ + return (fabs(a) < FLT_EPSILON); +} + +static inline bool math_equal(float a, float b) +{ + return math_zero(a - b); +} + +static void ClampColor(FLOATVECTOR4 Source, FLOATVECTOR4 Target, uint8_t Premultiplied); +static uint8_t PackColorComponent(vg_lite_float_t value); +static void get_format_bytes(vg_lite_buffer_format_t format, + vg_lite_uint32_t * mul, + vg_lite_uint32_t * div, + vg_lite_uint32_t * bytes_align); + +static vg_lite_fpoint_t matrix_transform_point(const vg_lite_matrix_t * matrix, const vg_lite_fpoint_t * point); +static Result vg_lite_grad_matrix_conv(vg_lite_matrix_t * result, const vg_lite_matrix_t * grad_matrix, + const vg_lite_matrix_t * path_matrix); + +/********************** + * STATIC VARIABLES + **********************/ + +/* color converters */ + +static vg_lite_converter conv_bgra8888_to_bgr565( + [](vg_color16_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->red * 0x1F / 0xFF; + dest->green = src->green * 0x3F / 0xFF; + dest->blue = src->blue * 0x1F / 0xFF; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgra8888_to_bgra5658( + [](vg_color16_alpha_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->c.red = src->red * 0x1F / 0xFF; + dest->c.green = src->green * 0x3F / 0xFF; + dest->c.blue = src->blue * 0x1F / 0xFF; + dest->alpha = src->alpha; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgr565_to_bgra8888( + [](vg_color32_t * dest, const vg_color16_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->red * 0xFF / 0x1F; + dest->green = src->green * 0xFF / 0x3F; + dest->blue = src->blue * 0xFF / 0x1F; + dest->alpha = 0xFF; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgra5658_to_bgra8888( + [](vg_color32_t * dest, const vg_color16_alpha_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->c.red * 0xFF / 0x1F; + dest->green = src->c.green * 0xFF / 0x3F; + dest->blue = src->c.blue * 0xFF / 0x1F; + dest->alpha = src->alpha; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgrx8888_to_bgra8888( + [](vg_color32_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + *dest = *src; + dest->alpha = 0xFF; + dest++; + src++; + } +}); + +static vg_lite_converter conv_bgr888_to_bgra8888( + [](vg_color32_t * dest, const vg_color24_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->red; + dest->green = src->green; + dest->blue = src->blue; + dest->alpha = 0xFF; + src++; + dest++; + } +}); + +static vg_lite_converter conv_alpha8_to_bgra8888( + [](vg_color32_t * dest, const uint8_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t color) +{ + while(px_size--) { + uint8_t alpha = *src; + dest->alpha = alpha; + dest->red = UDIV255(B(color) * alpha); + dest->green = UDIV255(G(color) * alpha); + dest->blue = UDIV255(R(color) * alpha); + dest++; + src++; + } +}); + +static vg_lite_converter conv_alpha4_to_bgra8888( + [](vg_color32_t * dest, const uint8_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t color) +{ + /* 1 byte -> 2 px */ + px_size /= 2; + + while(px_size--) { + /* high 4bit */ + uint8_t alpha = (*src & 0xF0); + dest->alpha = alpha; + dest->red = UDIV255(B(color) * alpha); + dest->green = UDIV255(G(color) * alpha); + dest->blue = UDIV255(R(color) * alpha); + dest++; + + /* low 4bit */ + alpha = (*src & 0x0F) << 4; + dest->alpha = alpha; + dest->red = UDIV255(B(color) * alpha); + dest->green = UDIV255(G(color) * alpha); + dest->blue = UDIV255(R(color) * alpha); + + dest++; + src++; + } +}); + +static vg_lite_converter conv_l8_to_bgra8888( + [](vg_color32_t * dest, const uint8_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->alpha = 0xFF; + dest->red = *src; + dest->green = *src; + dest->blue = *src; + dest++; + src++; + } +}); + +static vg_lite_converter conv_bgra5551_to_bgra8888( + [](vg_color32_t * dest, const vg_color_bgra5551_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->red * 0xFF / 0x1F; + dest->green = src->green * 0xFF / 0x1F; + dest->blue = src->blue * 0xFF / 0x1F; + dest->alpha = src->alpha ? 0xFF : 0; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgra4444_to_bgra8888( + [](vg_color32_t * dest, const vg_color_bgra4444_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->red * 0xFF / 0xF; + dest->green = src->green * 0xFF / 0xF; + dest->blue = src->blue * 0xFF / 0xF; + dest->alpha = src->alpha * 0xFF / 0xF; + src++; + dest++; + } +}); + +static vg_lite_converter conv_bgra2222_to_bgra8888( + [](vg_color32_t * dest, const vg_color_bgra2222_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + while(px_size--) { + dest->red = src->red * 0xFF / 0x3; + dest->green = src->green * 0xFF / 0x3; + dest->blue = src->blue * 0xFF / 0x3; + dest->alpha = src->alpha * 0xFF / 0x3; + src++; + dest++; + } +}); + +/* Used to copy images with inconsistent strides but the same color format */ +static vg_lite_converter conv_bgra8888_to_bgra8888( + [](vg_color32_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size, vg_lite_uint32_t /* color */) +{ + memcpy(dest, src, sizeof(vg_color32_t) * px_size); +}); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +extern "C" { + + void gpu_init(void) + { + vg_lite_init(0, 0); + } + + vg_lite_error_t vg_lite_allocate(vg_lite_buffer_t * buffer) + { + if(buffer->format == VG_LITE_RGBA8888_ETC2_EAC && (buffer->width % 16 || buffer->height % 4)) { + return VG_LITE_INVALID_ARGUMENT; + } + + /* Reset planar. */ + buffer->yuv.uv_planar = buffer->yuv.v_planar = buffer->yuv.alpha_planar = 0; + + /* Align height in case format is tiled. */ + if(buffer->format >= VG_LITE_YUY2 && buffer->format <= VG_LITE_NV16) { + buffer->height = VG_LITE_ALIGN(buffer->height, 4); + buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; + } + + if(buffer->format >= VG_LITE_YUY2_TILED && buffer->format <= VG_LITE_AYUY2_TILED) { + buffer->height = VG_LITE_ALIGN(buffer->height, 4); + buffer->tiled = VG_LITE_TILED; + buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; + } + + vg_lite_uint32_t mul, div, align; + get_format_bytes(buffer->format, &mul, &div, &align); + vg_lite_uint32_t stride = VG_LITE_ALIGN((buffer->width * mul / div), align); + + buffer->stride = stride; + + /* Size must be multiple of align, See: https://en.cppreference.com/w/c/memory/aligned_alloc */ + size_t size = VG_LITE_ALIGN(buffer->height * stride, LV_VG_LITE_THORVG_BUF_ADDR_ALIGN); +#ifndef _WIN32 + buffer->memory = aligned_alloc(LV_VG_LITE_THORVG_BUF_ADDR_ALIGN, size); +#else + buffer->memory = _aligned_malloc(size, LV_VG_LITE_THORVG_BUF_ADDR_ALIGN); +#endif + LV_ASSERT(buffer->memory); + buffer->address = (vg_lite_uint32_t)(uintptr_t)buffer->memory; + buffer->handle = buffer->memory; + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_free(vg_lite_buffer_t * buffer) + { + LV_ASSERT(buffer->memory); +#ifndef _WIN32 + free(buffer->memory); +#else + _aligned_free(buffer->memory); +#endif + memset(buffer, 0, sizeof(vg_lite_buffer_t)); + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_upload_buffer(vg_lite_buffer_t * buffer, vg_lite_uint8_t * data[3], vg_lite_uint32_t stride[3]) + { + LV_UNUSED(buffer); + LV_UNUSED(data); + LV_UNUSED(stride); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_map(vg_lite_buffer_t * buffer, vg_lite_map_flag_t flag, int32_t fd) + { + LV_UNUSED(buffer); + LV_UNUSED(flag); + LV_UNUSED(fd); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_unmap(vg_lite_buffer_t * buffer) + { + LV_UNUSED(buffer); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_clear(vg_lite_buffer_t * target, vg_lite_rectangle_t * rectangle, vg_lite_color_t color) + { + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_rect(shape, target, rectangle)); + TVG_CHECK_RETURN_VG_ERROR(shape->blend(BlendMethod::SrcOver)); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(TVG_COLOR(color))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_blit(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter) + { + LV_UNUSED(filter); + auto ctx = vg_lite_ctx::get_instance(); + canvas_set_target(ctx, target); + + auto picture = Picture::gen(); + + TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, source, color)); + TVG_CHECK_RETURN_VG_ERROR(picture->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_VG_ERROR(picture->blend(blend_method_conv(blend))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_blit2(vg_lite_buffer_t * target, + vg_lite_buffer_t * source0, + vg_lite_buffer_t * source1, + vg_lite_matrix_t * matrix0, + vg_lite_matrix_t * matrix1, + vg_lite_blend_t blend, + vg_lite_filter_t filter) + { + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_DOUBLE_IMAGE)) { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t error; + + VG_LITE_RETURN_ERROR(vg_lite_blit(target, source0, matrix0, blend, 0, filter)); + VG_LITE_RETURN_ERROR(vg_lite_blit(target, source1, matrix1, blend, 0, filter)); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_blit_rect(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_rectangle_t * rect, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter) + { + LV_UNUSED(filter); + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + vg_lite_matrix_t new_matrix = *matrix; + if(rect->x || rect->y) { + /* simulate hardware device clipping behavior */ + vg_lite_translate(-rect->x, -rect->y, &new_matrix); + } + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_rect(shape, target, rect)); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(&new_matrix))); + + auto picture = tvg::Picture::gen(); + TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, source, color)); + TVG_CHECK_RETURN_VG_ERROR(picture->transform(matrix_conv(&new_matrix))); + TVG_CHECK_RETURN_VG_ERROR(picture->blend(blend_method_conv(blend))); + TVG_CHECK_RETURN_VG_ERROR(picture->composite(std::move(shape), CompositeMethod::ClipPath)); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_init(int32_t tessellation_width, int32_t tessellation_height) + { + LV_UNUSED(tessellation_width); + LV_UNUSED(tessellation_height); +#if LV_VG_LITE_THORVG_THREAD_RENDER + /* Threads Count */ + auto threads = std::thread::hardware_concurrency(); + if(threads > 0) { + --threads; /* Allow the designated main thread capacity */ + } +#endif + + /* Initialize ThorVG Engine */ + TVG_CHECK_RETURN_VG_ERROR(Initializer::init(TVG_CANVAS_ENGINE, 0)); + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_close(void) + { + TVG_CHECK_RETURN_VG_ERROR(Initializer::term(TVG_CANVAS_ENGINE)); + return VG_LITE_SUCCESS; + } + + static void picture_bgra8888_to_bgr565(vg_color16_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + dest->red = src->red * 0x1F / 0xFF; + dest->green = src->green * 0x3F / 0xFF; + dest->blue = src->blue * 0x1F / 0xFF; + src++; + dest++; + } + } + + static void picture_bgra8888_to_bgra5658(vg_color16_alpha_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + dest->c.red = src->red * 0x1F / 0xFF; + dest->c.green = src->green * 0x3F / 0xFF; + dest->c.blue = src->blue * 0x1F / 0xFF; + dest->alpha = src->alpha; + src++; + dest++; + } + } + + static void picture_bgra8888_to_bgr888(vg_color24_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + dest->red = src->red; + dest->green = src->green; + dest->blue = src->blue; + src++; + dest++; + } + } + + static void picture_bgra8888_to_l8(uint8_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + *dest = (src->red * 19595 + src->green * 38469 + src->blue * 7472) >> 16; + src++; + dest++; + } + } + + static void picture_bgra8888_to_alpha8(uint8_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + *dest = src->alpha; + src++; + dest++; + } + } + + static void picture_bgra8888_to_bgra5551(vg_color_bgra5551_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + dest->red = src->red * 0x1F / 0xFF; + dest->green = src->green * 0x1F / 0xFF; + dest->blue = src->blue * 0x1F / 0xFF; + dest->alpha = src->alpha > (0xFF / 2) ? 1 : 0; + src++; + dest++; + } + } + + static void picture_bgra8888_to_bgra4444(vg_color_bgra4444_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + dest->red = src->red * 0xF / 0xFF; + dest->green = src->green * 0xF / 0xFF; + dest->blue = src->blue * 0xF / 0xFF; + dest->alpha = src->alpha * 0xF / 0xFF; + src++; + dest++; + } + } + + static void picture_bgra8888_to_bgra2222(vg_color_bgra2222_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size) + { + while(px_size--) { + dest->red = src->red * 0x3 / 0xFF; + dest->green = src->green * 0x3 / 0xFF; + dest->blue = src->blue * 0x3 / 0xFF; + dest->alpha = src->alpha * 0x3 / 0xFF; + src++; + dest++; + } + } + + + vg_lite_error_t vg_lite_finish(void) + { + vg_lite_ctx * ctx = vg_lite_ctx::get_instance(); + + if(ctx->canvas->draw() == Result::InsufficientCondition) { + return VG_LITE_SUCCESS; + } + + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->sync()); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->clear(true)); + + /* make sure target buffer is valid */ + LV_ASSERT_NULL(ctx->target_buffer); + + /* If target_buffer is not in a format supported by thorvg, software conversion is required. */ + switch(ctx->target_format) { + case VG_LITE_BGR565: + picture_bgra8888_to_bgr565( + (vg_color16_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_BGRA5658: + picture_bgra8888_to_bgra5658( + (vg_color16_alpha_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_BGR888: + picture_bgra8888_to_bgr888( + (vg_color24_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_L8: + picture_bgra8888_to_l8( + (uint8_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_A8: + picture_bgra8888_to_alpha8( + (uint8_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_BGRA5551: + picture_bgra8888_to_bgra5551((vg_color_bgra5551_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_BGRA4444: + picture_bgra8888_to_bgra4444((vg_color_bgra4444_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_BGRA2222: + picture_bgra8888_to_bgra2222((vg_color_bgra2222_t *)ctx->target_buffer, + (const vg_color32_t *)ctx->get_temp_target_buffer(), + ctx->target_px_size); + break; + case VG_LITE_BGRA8888: + case VG_LITE_BGRX8888: + /* No conversion required. */ + break; + default: + LV_LOG_ERROR("unsupported format: %d", ctx->target_format); + LV_ASSERT(false); + break; + } + + /* finish convert, clean target buffer info */ + ctx->target_buffer = nullptr; + ctx->tvg_target_buffer = nullptr; + ctx->target_px_size = 0; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_flush(void) + { + return vg_lite_finish(); + } + + vg_lite_error_t vg_lite_draw(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color) + { + auto ctx = vg_lite_ctx::get_instance(); + + /** + * Special handling for DST_IN blend mode using ThorVG's CompositeMethod::InvAlphaMask. + * DST_IN (Sa * D): pixels inside the shape are cleared, pixels outside are preserved. + * Implementation details: + * - The mask shape is filled with (255 - A(color)), used with InvAlphaMask. + * - InvAlphaMask formula: dst = dst * (255 - mask_alpha) / 255. + * - When color=0, mask alpha=255 inside the shape, so (255-255=0): inside is cleared; outside (255-0=255): preserved. + * - The target buffer is cleared with lv_memzero before rendering, ensuring inside pixels are zeroed. + * - This simulates the erase effect of VG_LITE_BLEND_DST_IN. + */ + if(blend == VG_LITE_BLEND_DST_IN) { + /* Flush any pending operations first */ + vg_lite_error_t error; + VG_LITE_RETURN_ERROR(vg_lite_finish()); + + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + /* Create mask shape with white color (full alpha) */ + auto mask = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_path(mask, path, matrix)); + TVG_CHECK_RETURN_VG_ERROR(mask->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_VG_ERROR(mask->fill(fill_rule_conv(fill_rule))); + TVG_CHECK_RETURN_VG_ERROR(mask->fill(255 - B(color), 255 - G(color), 255 - R(color), 255 - A(color))); + + /* Create a Picture from current target buffer content */ + auto picture = Picture::gen(); + TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, target)); + + /** + * Since the contents of the target buffer have already been copied into the picture, + * we can now clean up the target buffer in preparation for rendering the masked image. + */ + lv_memzero(target->memory, target->stride * target->height); + + /* Render masked picture back */ + TVG_CHECK_RETURN_VG_ERROR(picture->composite(std::move(mask), CompositeMethod::InvAlphaMask)); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); + + return VG_LITE_SUCCESS; + } + + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, matrix)); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); + TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(TVG_COLOR(color))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_set_stroke(vg_lite_path_t * path, + vg_lite_cap_style_t cap_style, + vg_lite_join_style_t join_style, + vg_lite_float_t line_width, + vg_lite_float_t miter_limit, + vg_lite_float_t * dash_pattern, + vg_lite_uint32_t pattern_count, + vg_lite_float_t dash_phase, + vg_lite_color_t color) + { + if(!path || line_width <= 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(miter_limit < 1.0f) { + miter_limit = 1.0f; + } + + if(!path->stroke) { + path->stroke = (vg_lite_stroke_t *)lv_malloc_zeroed(sizeof(vg_lite_stroke_t)); + + if(!path->stroke) { + return VG_LITE_OUT_OF_RESOURCES; + } + } + + path->stroke->cap_style = cap_style; + path->stroke->join_style = join_style; + path->stroke->line_width = line_width; + path->stroke->miter_limit = miter_limit; + path->stroke->half_width = line_width / 2.0f; + path->stroke->miter_square = path->stroke->miter_limit * path->stroke->miter_limit; + path->stroke->dash_pattern = dash_pattern; + path->stroke->pattern_count = pattern_count; + path->stroke->dash_phase = dash_phase; + path->stroke_color = color; + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_update_stroke(vg_lite_path_t * path) + { + LV_UNUSED(path); + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_set_path_type(vg_lite_path_t * path, vg_lite_path_type_t path_type) + { + if(!path || + (path_type != VG_LITE_DRAW_FILL_PATH && + path_type != VG_LITE_DRAW_STROKE_PATH && + path_type != VG_LITE_DRAW_FILL_STROKE_PATH) + ) + return VG_LITE_INVALID_ARGUMENT; + + path->path_type = path_type; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_get_register(vg_lite_uint32_t address, vg_lite_uint32_t * result) + { + LV_UNUSED(address); + LV_UNUSED(result); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_get_info(vg_lite_info_t * info) + { + info->api_version = VGLITE_API_VERSION_3_0; + info->header_version = VGLITE_HEADER_VERSION; + info->release_version = VGLITE_RELEASE_VERSION; + info->reserved = 0; + return VG_LITE_SUCCESS; + } + + vg_lite_uint32_t vg_lite_get_product_info(char * name, vg_lite_uint32_t * chip_id, vg_lite_uint32_t * chip_rev) + { + strcpy(name, "GCNanoLiteV"); + *chip_id = 0x265; + *chip_rev = 0x2000; + return 1; + } + + vg_lite_uint32_t vg_lite_query_feature(vg_lite_feature_t feature) + { + switch(feature) { + case gcFEATURE_BIT_VG_IM_INDEX_FORMAT: + case gcFEATURE_BIT_VG_BORDER_CULLING: + case gcFEATURE_BIT_VG_RGBA2_FORMAT: + case gcFEATURE_BIT_VG_IM_FASTCLAER: + case gcFEATURE_BIT_VG_GLOBAL_ALPHA: + case gcFEATURE_BIT_VG_24BIT: + case gcFEATURE_BIT_VG_DITHER: + case gcFEATURE_BIT_VG_USE_DST: + case gcFEATURE_BIT_VG_RADIAL_GRADIENT: + case gcFEATURE_BIT_VG_IM_REPEAT_REFLECT: + case gcFEATURE_BIT_VG_SCISSOR: + +#if LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT + case gcFEATURE_BIT_VG_LVGL_SUPPORT: +#endif + +#if LV_VG_LITE_THORVG_YUV_SUPPORT + case gcFEATURE_BIT_VG_YUV_INPUT: +#endif + +#if LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT + case gcFEATURE_BIT_VG_LINEAR_GRADIENT_EXT: +#endif + +#if LV_VG_LITE_THORVG_16PIXELS_ALIGN + case gcFEATURE_BIT_VG_16PIXELS_ALIGN: +#endif + return 1; + default: + break; + } + return 0; + } + + vg_lite_error_t vg_lite_init_path(vg_lite_path_t * path, + vg_lite_format_t data_format, + vg_lite_quality_t quality, + vg_lite_uint32_t path_length, + void * path_data, + vg_lite_float_t min_x, vg_lite_float_t min_y, + vg_lite_float_t max_x, vg_lite_float_t max_y) + { + if(!path) { + return VG_LITE_INVALID_ARGUMENT; + } + + lv_memzero(path, sizeof(vg_lite_path_t)); + + path->format = data_format; + path->quality = quality; + path->bounding_box[0] = min_x; + path->bounding_box[1] = min_y; + path->bounding_box[2] = max_x; + path->bounding_box[3] = max_y; + + path->path_length = path_length; + path->path = path_data; + + path->path_changed = 1; + path->uploaded.address = 0; + path->uploaded.bytes = 0; + path->uploaded.handle = NULL; + path->uploaded.memory = NULL; + path->pdata_internal = 0; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_init_arc_path(vg_lite_path_t * path, + vg_lite_format_t data_format, + vg_lite_quality_t quality, + vg_lite_uint32_t path_length, + void * path_data, + vg_lite_float_t min_x, vg_lite_float_t min_y, + vg_lite_float_t max_x, vg_lite_float_t max_y) + { + LV_UNUSED(path); + LV_UNUSED(data_format); + LV_UNUSED(quality); + LV_UNUSED(path_length); + LV_UNUSED(path_data); + LV_UNUSED(min_x); + LV_UNUSED(min_y); + LV_UNUSED(max_x); + LV_UNUSED(max_y); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_clear_path(vg_lite_path_t * path) + { + LV_ASSERT_NULL(path); + + if(path->stroke) { + lv_free(path->stroke); + path->stroke = NULL; + } + + return VG_LITE_SUCCESS; + } + + vg_lite_uint32_t vg_lite_get_path_length(vg_lite_uint8_t * opcode, + vg_lite_uint32_t count, + vg_lite_format_t format) + { + LV_UNUSED(opcode); + LV_UNUSED(count); + LV_UNUSED(format); + return 0; + } + + vg_lite_error_t vg_lite_append_path(vg_lite_path_t * path, + uint8_t * cmd, + void * data, + vg_lite_uint32_t seg_count) + { + LV_UNUSED(path); + LV_UNUSED(cmd); + LV_UNUSED(data); + LV_UNUSED(seg_count); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_upload_path(vg_lite_path_t * path) + { + LV_UNUSED(path); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_CLUT(vg_lite_uint32_t count, + vg_lite_uint32_t * colors) + { + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_IM_INDEX_FORMAT)) { + return VG_LITE_NOT_SUPPORT; + } + LV_ASSERT(colors); + + auto ctx = vg_lite_ctx::get_instance(); + ctx->set_CLUT(count, colors); + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_draw_pattern(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_buffer_t * pattern_image, + vg_lite_matrix_t * pattern_matrix, + vg_lite_blend_t blend, + vg_lite_pattern_mode_t pattern_mode, + vg_lite_color_t pattern_color, + vg_lite_color_t color, + vg_lite_filter_t filter) + { + LV_UNUSED(pattern_mode); + LV_UNUSED(pattern_color); + LV_UNUSED(filter); + + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, path_matrix)); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule))); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(path_matrix))); + + auto picture = tvg::Picture::gen(); + TVG_CHECK_RETURN_VG_ERROR(picture_load(ctx, picture, pattern_image, color)); + TVG_CHECK_RETURN_VG_ERROR(picture->transform(matrix_conv(pattern_matrix))); + TVG_CHECK_RETURN_VG_ERROR(picture->blend(blend_method_conv(blend))); + TVG_CHECK_RETURN_VG_ERROR(picture->composite(std::move(shape), CompositeMethod::ClipPath)); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(picture))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_init_grad(vg_lite_linear_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + + /* Set the member values according to driver defaults. */ + grad->image.width = VLC_GRADIENT_BUFFER_WIDTH; + grad->image.height = 1; + grad->image.stride = 0; + grad->image.format = VG_LITE_BGRA8888; + + /* Allocate the image for gradient. */ + error = vg_lite_allocate(&grad->image); + + grad->count = 0; + + return error; + } + + vg_lite_error_t vg_lite_set_linear_grad(vg_lite_ext_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_linear_gradient_parameter_t linear_gradient, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_multiplied) + { + static vg_lite_color_ramp_t default_ramp[] = { + { + 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }, + { + 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f + } + }; + + vg_lite_uint32_t i, trg_count; + vg_lite_float_t prev_stop; + vg_lite_color_ramp_t * src_ramp; + vg_lite_color_ramp_t * src_ramp_last; + vg_lite_color_ramp_t * trg_ramp; + + /* Reset the count. */ + trg_count = 0; + + if((linear_gradient.X0 == linear_gradient.X1) && (linear_gradient.Y0 == linear_gradient.Y1)) + return VG_LITE_INVALID_ARGUMENT; + + grad->linear_grad = linear_gradient; + grad->pre_multiplied = pre_multiplied; + grad->spread_mode = spread_mode; + + if(!count || count > VLC_MAX_COLOR_RAMP_STOPS || color_ramp == NULL) + goto Empty_sequence_handler; + + for(i = 0; i < count; i++) + grad->color_ramp[i] = color_ramp[i]; + grad->ramp_length = count; + + /* Determine the last source ramp. */ + src_ramp_last + = grad->color_ramp + + grad->ramp_length; + + /* Set the initial previous stop. */ + prev_stop = -1; + + /* Reset the count. */ + trg_count = 0; + + /* Walk through the source ramp. */ + for( + src_ramp = grad->color_ramp, trg_ramp = grad->converted_ramp; + (src_ramp < src_ramp_last) && (trg_count < VLC_MAX_COLOR_RAMP_STOPS + 2); + src_ramp += 1) { + /* Must be in increasing order. */ + if(src_ramp->stop < prev_stop) { + /* Ignore the entire sequence. */ + trg_count = 0; + break; + } + + /* Update the previous stop value. */ + prev_stop = src_ramp->stop; + + /* Must be within [0..1] range. */ + if((src_ramp->stop < 0.0f) || (src_ramp->stop > 1.0f)) { + /* Ignore. */ + continue; + } + + /* Clamp color. */ + ClampColor(COLOR_FROM_RAMP(src_ramp), COLOR_FROM_RAMP(trg_ramp), 0); + + /* First stop greater than zero? */ + if((trg_count == 0) && (src_ramp->stop > 0.0f)) { + /* Force the first stop to 0.0f. */ + trg_ramp->stop = 0.0f; + + /* Replicate the entry. */ + trg_ramp[1] = *trg_ramp; + trg_ramp[1].stop = src_ramp->stop; + + /* Advance. */ + trg_ramp += 2; + trg_count += 2; + } + else { + /* Set the stop value. */ + trg_ramp->stop = src_ramp->stop; + + /* Advance. */ + trg_ramp += 1; + trg_count += 1; + } + } + + /* Empty sequence? */ + if(trg_count == 0) { + memcpy(grad->converted_ramp, default_ramp, sizeof(default_ramp)); + grad->converted_length = sizeof(default_ramp) / 5; + } + else { + /* The last stop must be at 1.0. */ + if(trg_ramp[-1].stop != 1.0f) { + /* Replicate the last entry. */ + *trg_ramp = trg_ramp[-1]; + + /* Force the last stop to 1.0f. */ + trg_ramp->stop = 1.0f; + + /* Update the final entry count. */ + trg_count += 1; + } + + /* Set new length. */ + grad->converted_length = trg_count; + } + return VG_LITE_SUCCESS; + +Empty_sequence_handler: + memcpy(grad->converted_ramp, default_ramp, sizeof(default_ramp)); + grad->converted_length = sizeof(default_ramp) / 5; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_update_linear_grad(vg_lite_ext_linear_gradient_t * grad) + { + vg_lite_uint32_t ramp_length; + vg_lite_color_ramp_t * color_ramp; + vg_lite_uint32_t common, stop; + vg_lite_uint32_t i, width; + uint8_t * bits; + vg_lite_float_t x0, y0, x1, y1, length; + vg_lite_error_t error = VG_LITE_SUCCESS; + + /* Get shortcuts to the color ramp. */ + ramp_length = grad->converted_length; + color_ramp = grad->converted_ramp; + + x0 = grad->linear_grad.X0; + y0 = grad->linear_grad.Y0; + x1 = grad->linear_grad.X1; + y1 = grad->linear_grad.Y1; + length = (vg_lite_float_t)sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); + + if(length <= 0) + return VG_LITE_INVALID_ARGUMENT; + /* Find the common denominator of the color ramp stops. */ + if(length < 1) { + common = 1; + } + else { + common = (vg_lite_uint32_t)length; + } + + for(i = 0; i < ramp_length; ++i) { + if(color_ramp[i].stop != 0.0f) { + vg_lite_float_t mul = common * color_ramp[i].stop; + vg_lite_float_t frac = mul - (vg_lite_float_t)floor(mul); + if(frac > 0.00013f) { /* Suppose error for zero is 0.00013 */ + common = MAX(common, (vg_lite_uint32_t)(1.0f / frac + 0.5f)); + } + } + } + + /* Compute the width of the required color array. */ + width = common + 1; + + /* Allocate the color ramp surface. */ + memset(&grad->image, 0, sizeof(grad->image)); + grad->image.width = width; + grad->image.height = 1; + grad->image.stride = 0; + grad->image.image_mode = VG_LITE_NONE_IMAGE_MODE; + grad->image.format = VG_LITE_ABGR8888; + + /* Allocate the image for gradient. */ + VG_LITE_RETURN_ERROR(vg_lite_allocate(&grad->image)); + memset(grad->image.memory, 0, grad->image.stride * grad->image.height); + width = common + 1; + /* Set pointer to color array. */ + bits = (uint8_t *)grad->image.memory; + + /* Start filling the color array. */ + stop = 0; + for(i = 0; i < width; ++i) { + vg_lite_float_t gradient; + vg_lite_float_t color[4]; + vg_lite_float_t color1[4]; + vg_lite_float_t color2[4]; + vg_lite_float_t weight; + + if(i == 241) + i = 241; + /* Compute gradient for current color array entry. */ + gradient = (vg_lite_float_t)i / (vg_lite_float_t)(width - 1); + + /* Find the entry in the color ramp that matches or exceeds this + ** gradient. */ + while(gradient > color_ramp[stop].stop) { + ++stop; + } + + if(gradient == color_ramp[stop].stop) { + /* Perfect match weight 1.0. */ + weight = 1.0f; + + /* Use color ramp color. */ + color1[3] = color_ramp[stop].alpha; + color1[2] = color_ramp[stop].blue; + color1[1] = color_ramp[stop].green; + color1[0] = color_ramp[stop].red; + + color2[3] = color2[2] = color2[1] = color2[0] = 0.0f; + } + else { + if(stop == 0) { + return VG_LITE_INVALID_ARGUMENT; + } + /* Compute weight. */ + weight = (color_ramp[stop].stop - gradient) + / (color_ramp[stop].stop - color_ramp[stop - 1].stop); + + /* Grab color ramp color of previous stop. */ + color1[3] = color_ramp[stop - 1].alpha; + color1[2] = color_ramp[stop - 1].blue; + color1[1] = color_ramp[stop - 1].green; + color1[0] = color_ramp[stop - 1].red; + + /* Grab color ramp color of current stop. */ + color2[3] = color_ramp[stop].alpha; + color2[2] = color_ramp[stop].blue; + color2[1] = color_ramp[stop].green; + color2[0] = color_ramp[stop].red; + } + + if(grad->pre_multiplied) { + /* Pre-multiply the first color. */ + color1[2] *= color1[3]; + color1[1] *= color1[3]; + color1[0] *= color1[3]; + + /* Pre-multiply the second color. */ + color2[2] *= color2[3]; + color2[1] *= color2[3]; + color2[0] *= color2[3]; + } + + /* Filter the colors per channel. */ + color[3] = LERP(color1[3], color2[3], weight); + color[2] = LERP(color1[2], color2[2], weight); + color[1] = LERP(color1[1], color2[1], weight); + color[0] = LERP(color1[0], color2[0], weight); + + /* Pack the final color. */ + *bits++ = PackColorComponent(color[3]); + *bits++ = PackColorComponent(color[2]); + *bits++ = PackColorComponent(color[1]); + *bits++ = PackColorComponent(color[0]); + } + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_draw_linear_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_ext_linear_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter) + { + LV_UNUSED(paint_color); + LV_UNUSED(filter); + + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, path_matrix)); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(path_matrix))); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); + TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); + + vg_lite_matrix_t grad_matrix; + TVG_CHECK_RETURN_VG_ERROR(vg_lite_grad_matrix_conv(&grad_matrix, &grad->matrix, path_matrix)); + + auto linearGrad = LinearGradient::gen(); + TVG_CHECK_RETURN_VG_ERROR(linearGrad->linear(grad->linear_grad.X0, grad->linear_grad.Y0, grad->linear_grad.X1, + grad->linear_grad.Y1)); + TVG_CHECK_RETURN_VG_ERROR(linearGrad->transform(matrix_conv(&grad_matrix))); + TVG_CHECK_RETURN_VG_ERROR(linearGrad->spread(fill_spread_conv(grad->spread_mode))); + + tvg::Fill::ColorStop colorStops[VLC_MAX_COLOR_RAMP_STOPS]; + for(vg_lite_uint32_t i = 0; i < grad->ramp_length; i++) { + colorStops[i].offset = grad->color_ramp[i].stop; + colorStops[i].r = grad->color_ramp[i].red * 255.0f; + colorStops[i].g = grad->color_ramp[i].green * 255.0f; + colorStops[i].b = grad->color_ramp[i].blue * 255.0f; + colorStops[i].a = grad->color_ramp[i].alpha * 255.0f; + } + TVG_CHECK_RETURN_VG_ERROR(linearGrad->colorStops(colorStops, grad->ramp_length)); + + TVG_CHECK_RETURN_VG_ERROR(shape->fill(std::move(linearGrad))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_set_radial_grad(vg_lite_radial_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_radial_gradient_parameter_t radial_grad, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_multiplied) + { + static vg_lite_color_ramp_t defaultRamp[] = { + { + 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }, + { + 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f + } + }; + + vg_lite_uint32_t i, trgCount; + vg_lite_float_t prevStop; + vg_lite_color_ramp_t * srcRamp; + vg_lite_color_ramp_t * srcRampLast; + vg_lite_color_ramp_t * trgRamp; + + /* Reset the count. */ + trgCount = 0; + + if(radial_grad.r <= 0) + return VG_LITE_INVALID_ARGUMENT; + + grad->radial_grad = radial_grad; + grad->pre_multiplied = pre_multiplied; + grad->spread_mode = spread_mode; + + if(!count || count > VLC_MAX_COLOR_RAMP_STOPS || color_ramp == NULL) + goto Empty_sequence_handler; + + for(i = 0; i < count; i++) + grad->color_ramp[i] = color_ramp[i]; + grad->ramp_length = count; + + /* Determine the last source ramp. */ + srcRampLast + = grad->color_ramp + + grad->ramp_length; + + /* Set the initial previous stop. */ + prevStop = -1; + + /* Reset the count. */ + trgCount = 0; + + /* Walk through the source ramp. */ + for( + srcRamp = grad->color_ramp, trgRamp = grad->converted_ramp; + (srcRamp < srcRampLast) && (trgCount < VLC_MAX_COLOR_RAMP_STOPS + 2); + srcRamp += 1) { + /* Must be in increasing order. */ + if(srcRamp->stop < prevStop) { + /* Ignore the entire sequence. */ + trgCount = 0; + break; + } + + /* Update the previous stop value. */ + prevStop = srcRamp->stop; + + /* Must be within [0..1] range. */ + if((srcRamp->stop < 0.0f) || (srcRamp->stop > 1.0f)) { + /* Ignore. */ + continue; + } + + /* Clamp color. */ + ClampColor(COLOR_FROM_RAMP(srcRamp), COLOR_FROM_RAMP(trgRamp), 0); + + /* First stop greater than zero? */ + if((trgCount == 0) && (srcRamp->stop > 0.0f)) { + /* Force the first stop to 0.0f. */ + trgRamp->stop = 0.0f; + + /* Replicate the entry. */ + trgRamp[1] = *trgRamp; + trgRamp[1].stop = srcRamp->stop; + + /* Advance. */ + trgRamp += 2; + trgCount += 2; + } + else { + /* Set the stop value. */ + trgRamp->stop = srcRamp->stop; + + /* Advance. */ + trgRamp += 1; + trgCount += 1; + } + } + + /* Empty sequence? */ + if(trgCount == 0) { + memcpy(grad->converted_ramp, defaultRamp, sizeof(defaultRamp)); + grad->converted_length = sizeof(defaultRamp) / 5; + } + else { + /* The last stop must be at 1.0. */ + if(trgRamp[-1].stop != 1.0f) { + /* Replicate the last entry. */ + *trgRamp = trgRamp[-1]; + + /* Force the last stop to 1.0f. */ + trgRamp->stop = 1.0f; + + /* Update the final entry count. */ + trgCount += 1; + } + + /* Set new length. */ + grad->converted_length = trgCount; + } + return VG_LITE_SUCCESS; + +Empty_sequence_handler: + memcpy(grad->converted_ramp, defaultRamp, sizeof(defaultRamp)); + grad->converted_length = sizeof(defaultRamp) / 5; + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_update_radial_grad(vg_lite_radial_gradient_t * grad) + { + vg_lite_uint32_t ramp_length; + vg_lite_color_ramp_t * colorRamp; + vg_lite_uint32_t common, stop; + vg_lite_uint32_t i, width; + uint8_t * bits; + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_uint32_t align, mul, div; + + /* Get shortcuts to the color ramp. */ + ramp_length = grad->converted_length; + colorRamp = grad->converted_ramp; + + if(grad->radial_grad.r <= 0) + return VG_LITE_INVALID_ARGUMENT; + + /* Find the common denominator of the color ramp stops. */ + if(grad->radial_grad.r < 1) { + common = 1; + } + else { + common = (vg_lite_uint32_t)grad->radial_grad.r; + } + + for(i = 0; i < ramp_length; ++i) { + if(colorRamp[i].stop != 0.0f) { + vg_lite_float_t m = common * colorRamp[i].stop; + vg_lite_float_t frac = m - (vg_lite_float_t)floor(m); + if(frac > 0.00013f) { /* Suppose error for zero is 0.00013 */ + common = MAX(common, (vg_lite_uint32_t)(1.0f / frac + 0.5f)); + } + } + } + + /* Compute the width of the required color array. */ + width = common + 1; + width = (width + 15) & (~0xf); + + /* Allocate the color ramp surface. */ + memset(&grad->image, 0, sizeof(grad->image)); + grad->image.width = width; + grad->image.height = 1; + grad->image.stride = 0; + grad->image.image_mode = VG_LITE_NONE_IMAGE_MODE; + grad->image.format = VG_LITE_ABGR8888; + + /* Allocate the image for gradient. */ + VG_LITE_RETURN_ERROR(vg_lite_allocate(&grad->image)); + + get_format_bytes(VG_LITE_ABGR8888, &mul, &div, &align); + width = grad->image.stride * div / mul; + + /* Set pointer to color array. */ + bits = (uint8_t *)grad->image.memory; + + /* Start filling the color array. */ + stop = 0; + for(i = 0; i < width; ++i) { + vg_lite_float_t gradient; + vg_lite_float_t color[4]; + vg_lite_float_t color1[4]; + vg_lite_float_t color2[4]; + vg_lite_float_t weight; + + /* Compute gradient for current color array entry. */ + gradient = (vg_lite_float_t)i / (vg_lite_float_t)(width - 1); + + /* Find the entry in the color ramp that matches or exceeds this + ** gradient. */ + while(gradient > colorRamp[stop].stop) { + ++stop; + } + + if(gradient == colorRamp[stop].stop) { + /* Perfect match weight 1.0. */ + weight = 1.0f; + + /* Use color ramp color. */ + color1[3] = colorRamp[stop].alpha; + color1[2] = colorRamp[stop].blue; + color1[1] = colorRamp[stop].green; + color1[0] = colorRamp[stop].red; + + color2[3] = color2[2] = color2[1] = color2[0] = 0.0f; + } + else { + /* Compute weight. */ + weight = (colorRamp[stop].stop - gradient) + / (colorRamp[stop].stop - colorRamp[stop - 1].stop); + + /* Grab color ramp color of previous stop. */ + color1[3] = colorRamp[stop - 1].alpha; + color1[2] = colorRamp[stop - 1].blue; + color1[1] = colorRamp[stop - 1].green; + color1[0] = colorRamp[stop - 1].red; + + /* Grab color ramp color of current stop. */ + color2[3] = colorRamp[stop].alpha; + color2[2] = colorRamp[stop].blue; + color2[1] = colorRamp[stop].green; + color2[0] = colorRamp[stop].red; + } + + if(grad->pre_multiplied) { + /* Pre-multiply the first color. */ + color1[2] *= color1[3]; + color1[1] *= color1[3]; + color1[0] *= color1[3]; + + /* Pre-multiply the second color. */ + color2[2] *= color2[3]; + color2[1] *= color2[3]; + color2[0] *= color2[3]; + } + + /* Filter the colors per channel. */ + color[3] = LERP(color1[3], color2[3], weight); + color[2] = LERP(color1[2], color2[2], weight); + color[1] = LERP(color1[1], color2[1], weight); + color[0] = LERP(color1[0], color2[0], weight); + + /* Pack the final color. */ + *bits++ = PackColorComponent(color[3]); + *bits++ = PackColorComponent(color[2]); + *bits++ = PackColorComponent(color[1]); + *bits++ = PackColorComponent(color[0]); + } + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_set_grad(vg_lite_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_uint32_t * colors, + vg_lite_uint32_t * stops) + { + vg_lite_uint32_t i; + + grad->count = 0; /* Opaque B&W gradient */ + if(!count || count > VLC_MAX_GRADIENT_STOPS || colors == NULL || stops == NULL) + return VG_LITE_SUCCESS; + + /* Check stops validity */ + for(i = 0; i < count; i++) + if(stops[i] < VLC_GRADIENT_BUFFER_WIDTH) { + if(!grad->count || stops[i] > grad->stops[grad->count - 1]) { + grad->stops[grad->count] = stops[i]; + grad->colors[grad->count] = colors[i]; + grad->count++; + } + else if(stops[i] == grad->stops[grad->count - 1]) { + /* Equal stops : use the color corresponding to the last stop + in the sequence */ + grad->colors[grad->count - 1] = colors[i]; + } + } + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_update_grad(vg_lite_linear_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + int32_t r0, g0, b0, a0; + int32_t r1, g1, b1, a1; + int32_t lr, lg, lb, la; + vg_lite_uint32_t i; + int32_t j; + int32_t ds, dr, dg, db, da; + vg_lite_uint32_t * buffer = (vg_lite_uint32_t *)grad->image.memory; + + if(grad->count == 0) { + /* If no valid stops have been specified (e.g., due to an empty input + * array, out-of-range, or out-of-order stops), a stop at 0 with color + * 0xFF000000 (opaque black) and a stop at 255 with color 0xFFFFFFFF + * (opaque white) are implicitly defined. */ + grad->stops[0] = 0; + grad->colors[0] = 0xFF000000; /* Opaque black */ + grad->stops[1] = 255; + grad->colors[1] = 0xFFFFFFFF; /* Opaque white */ + grad->count = 2; + } + else if(grad->count && grad->stops[0] != 0) { + /* If at least one valid stop has been specified, but none has been + * defined with an offset of 0, an implicit stop is added with an + * offset of 0 and the same color as the first user-defined stop. */ + for(i = 0; i < grad->stops[0]; i++) + buffer[i] = grad->colors[0]; + } + a0 = A(grad->colors[0]); + r0 = R(grad->colors[0]); + g0 = G(grad->colors[0]); + b0 = B(grad->colors[0]); + + /* Calculate the colors for each pixel of the image. */ + for(i = 0; i < grad->count - 1; i++) { + buffer[grad->stops[i]] = grad->colors[i]; + ds = grad->stops[i + 1] - grad->stops[i]; + a1 = A(grad->colors[i + 1]); + r1 = R(grad->colors[i + 1]); + g1 = G(grad->colors[i + 1]); + b1 = B(grad->colors[i + 1]); + + da = a1 - a0; + dr = r1 - r0; + dg = g1 - g0; + db = b1 - b0; + + for(j = 1; j < ds; j++) { + la = a0 + da * j / ds; + lr = r0 + dr * j / ds; + lg = g0 + dg * j / ds; + lb = b0 + db * j / ds; + + buffer[grad->stops[i] + j] = ARGB(la, lr, lg, lb); + } + + a0 = a1; + r0 = r1; + g0 = g1; + b0 = b1; + } + + /* If at least one valid stop has been specified, but none has been defined + * with an offset of 255, an implicit stop is added with an offset of 255 + * and the same color as the last user-defined stop. */ + for(i = grad->stops[grad->count - 1]; i < VLC_GRADIENT_BUFFER_WIDTH; i++) + buffer[i] = grad->colors[grad->count - 1]; + + return error; + } + + vg_lite_error_t vg_lite_clear_linear_grad(vg_lite_ext_linear_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + + grad->count = 0; + /* Release the image resource. */ + if(grad->image.handle != NULL) { + error = vg_lite_free(&grad->image); + } + + return error; + } + + vg_lite_error_t vg_lite_clear_grad(vg_lite_linear_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + + grad->count = 0; + /* Release the image resource. */ + if(grad->image.handle != NULL) { + error = vg_lite_free(&grad->image); + } + + return error; + } + + vg_lite_error_t vg_lite_clear_radial_grad(vg_lite_radial_gradient_t * grad) + { + vg_lite_error_t error = VG_LITE_SUCCESS; + + grad->count = 0; + /* Release the image resource. */ + if(grad->image.handle != NULL) { + error = vg_lite_free(&grad->image); + } + + return error; + } + + vg_lite_matrix_t * vg_lite_get_linear_grad_matrix(vg_lite_ext_linear_gradient_t * grad) + { + return &grad->matrix; + } + + vg_lite_matrix_t * vg_lite_get_grad_matrix(vg_lite_linear_gradient_t * grad) + { + return &grad->matrix; + } + + vg_lite_matrix_t * vg_lite_get_radial_grad_matrix(vg_lite_radial_gradient_t * grad) + { + return &grad->matrix; + } + + vg_lite_error_t vg_lite_draw_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_linear_gradient_t * grad, + vg_lite_blend_t blend) + { + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, matrix)); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); + TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); + + vg_lite_matrix_t grad_matrix; + TVG_CHECK_RETURN_VG_ERROR(vg_lite_grad_matrix_conv(&grad_matrix, &grad->matrix, matrix)); + + vg_lite_fpoint_t p1 = {0.0f, 0.0f}; + vg_lite_fpoint_t p2 = {1.0f, 0}; + + vg_lite_fpoint_t p1_trans = p1; + vg_lite_fpoint_t p2_trans = p2; + + p1_trans = matrix_transform_point(&grad_matrix, &p1); + p2_trans = matrix_transform_point(&grad_matrix, &p2); + float dx = (p2_trans.x - p1_trans.x); + float dy = (p2_trans.y - p1_trans.y); + float scale = sqrtf(dx * dx + dy * dy); + float angle = (float)(atan2f(dy, dx)); + float dlen = 256 * scale; + float x_min = grad_matrix.m[0][2]; + float y_min = grad_matrix.m[1][2]; + float x_max = x_min + dlen * cosf(angle); + float y_max = y_min + dlen * sinf(angle); + LV_LOG_TRACE("linear gradient {%.2f, %.2f} ~ {%.2f, %.2f}", x_min, y_min, x_max, y_max); + auto linearGrad = LinearGradient::gen(); + TVG_CHECK_RETURN_VG_ERROR(linearGrad->linear(x_min, y_min, x_max, y_max)); + TVG_CHECK_RETURN_VG_ERROR(linearGrad->spread(FillSpread::Pad)); + + tvg::Fill::ColorStop colorStops[VLC_MAX_GRADIENT_STOPS]; + for(vg_lite_uint32_t i = 0; i < grad->count; i++) { + colorStops[i].offset = grad->stops[i] / 255.0f; + colorStops[i].r = R(grad->colors[i]); + colorStops[i].g = G(grad->colors[i]); + colorStops[i].b = B(grad->colors[i]); + colorStops[i].a = A(grad->colors[i]); + } + TVG_CHECK_RETURN_VG_ERROR(linearGrad->colorStops(colorStops, grad->count)); + + TVG_CHECK_RETURN_VG_ERROR(shape->fill(std::move(linearGrad))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_draw_radial_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_radial_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter) + { + LV_UNUSED(paint_color); + LV_UNUSED(filter); + + auto ctx = vg_lite_ctx::get_instance(); + TVG_CHECK_RETURN_VG_ERROR(canvas_set_target(ctx, target)); + + auto shape = Shape::gen(); + TVG_CHECK_RETURN_VG_ERROR(shape_append_path(shape, path, path_matrix)); + TVG_CHECK_RETURN_VG_ERROR(shape->transform(matrix_conv(path_matrix))); + TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule));); + TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend))); + + vg_lite_matrix_t grad_matrix; + TVG_CHECK_RETURN_VG_ERROR(vg_lite_grad_matrix_conv(&grad_matrix, &grad->matrix, path_matrix)); + + auto radialGrad = RadialGradient::gen(); + TVG_CHECK_RETURN_VG_ERROR(radialGrad->transform(matrix_conv(&grad_matrix))); + TVG_CHECK_RETURN_VG_ERROR(radialGrad->radial(grad->radial_grad.cx, grad->radial_grad.cy, grad->radial_grad.r)); + TVG_CHECK_RETURN_VG_ERROR(radialGrad->spread(fill_spread_conv(grad->spread_mode))); + + tvg::Fill::ColorStop colorStops[VLC_MAX_COLOR_RAMP_STOPS]; + for(vg_lite_uint32_t i = 0; i < grad->ramp_length; i++) { + colorStops[i].offset = grad->color_ramp[i].stop; + colorStops[i].r = grad->color_ramp[i].red * 255.0f; + colorStops[i].g = grad->color_ramp[i].green * 255.0f; + colorStops[i].b = grad->color_ramp[i].blue * 255.0f; + colorStops[i].a = grad->color_ramp[i].alpha * 255.0f; + } + TVG_CHECK_RETURN_VG_ERROR(radialGrad->colorStops(colorStops, grad->ramp_length)); + + TVG_CHECK_RETURN_VG_ERROR(shape->fill(std::move(radialGrad))); + TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->push(std::move(shape))); + + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_set_command_buffer_size(vg_lite_uint32_t size) + { + LV_UNUSED(size); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_scissor(vg_lite_int32_t x, vg_lite_int32_t y, vg_lite_int32_t right, vg_lite_int32_t bottom) + { + auto ctx = vg_lite_ctx::get_instance(); + vg_lite_int32_t width = right - x; + vg_lite_int32_t height = bottom - y; + + if(width <= 0 || height <= 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(ctx->scissor_rect.x == x && ctx->scissor_rect.y == y && + ctx->scissor_rect.width == width && ctx->scissor_rect.height == height) { + return VG_LITE_SUCCESS; + } + + /*Finish the previous rendering before setting the new scissor*/ + vg_lite_error_t error; + VG_LITE_RETURN_ERROR(vg_lite_finish()); + + ctx->scissor_rect.x = x; + ctx->scissor_rect.y = y; + ctx->scissor_rect.width = width; + ctx->scissor_rect.height = height; + ctx->scissor_is_set = true; + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_enable_scissor(void) + { + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_disable_scissor(void) + { + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_get_mem_size(vg_lite_uint32_t * size) + { + *size = 0; + return VG_LITE_SUCCESS; + } + + vg_lite_error_t vg_lite_source_global_alpha(vg_lite_global_alpha_t alpha_mode, uint8_t alpha_value) + { + LV_UNUSED(alpha_mode); + LV_UNUSED(alpha_value); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_dest_global_alpha(vg_lite_global_alpha_t alpha_mode, uint8_t alpha_value) + { + LV_UNUSED(alpha_mode); + LV_UNUSED(alpha_value); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_color_key(vg_lite_color_key4_t colorkey) + { + LV_UNUSED(colorkey); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_flexa_stream_id(uint8_t stream_id) + { + LV_UNUSED(stream_id); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_flexa_current_background_buffer(uint8_t stream_id, + vg_lite_buffer_t * buffer, + vg_lite_uint32_t background_segment_count, + vg_lite_uint32_t background_segment_size) + { + LV_UNUSED(stream_id); + LV_UNUSED(buffer); + LV_UNUSED(background_segment_count); + LV_UNUSED(background_segment_size); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_enable_flexa(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_disable_flexa(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_flexa_stop_frame(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_enable_dither(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_disable_dither(void) + { + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_tess_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size) + { + LV_UNUSED(physical); + LV_UNUSED(size); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_set_command_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size) + { + LV_UNUSED(physical); + LV_UNUSED(size); + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_get_parameter(vg_lite_param_type_t type, + vg_lite_int32_t count, + vg_lite_float_t * params) + { + switch(type) { + case VG_LITE_GPU_IDLE_STATE: + if(count != 1 || params == NULL) { + return VG_LITE_INVALID_ARGUMENT; + } + + *(vg_lite_uint32_t *)params = 1; + return VG_LITE_SUCCESS; + + default: + break; + } + + return VG_LITE_NOT_SUPPORT; + } + + vg_lite_error_t vg_lite_dump_command_buffer(void) + { + LV_LOG_USER("command:"); + LV_LOG_USER("@[commit]"); + return VG_LITE_SUCCESS; + } +} /* extern "C" */ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static vg_lite_error_t vg_lite_error_conv(Result result) +{ + switch(result) { + case Result::Success: + return VG_LITE_SUCCESS; + + case Result::InvalidArguments: + return VG_LITE_INVALID_ARGUMENT; + + case Result::InsufficientCondition: + return VG_LITE_OUT_OF_RESOURCES; + + case Result::FailedAllocation: + return VG_LITE_OUT_OF_MEMORY; + + case Result::NonSupport: + return VG_LITE_NOT_SUPPORT; + + default: + break; + } + + return VG_LITE_TIMEOUT; +} + +static Matrix matrix_conv(const vg_lite_matrix_t * matrix) +{ + static const Matrix identity = { + 1, 0, 0, + 0, 1, 0, + 0, 0, 1 + }; + if(!matrix) { + return identity; + } + + return *(Matrix *)matrix; +} + +static FillRule fill_rule_conv(vg_lite_fill_t fill) +{ + if(fill == VG_LITE_FILL_EVEN_ODD) { + return FillRule::EvenOdd; + } + + return FillRule::Winding; +} + +static BlendMethod blend_method_conv(vg_lite_blend_t blend) +{ + switch(blend) { + case VG_LITE_BLEND_NONE: + return BlendMethod::SrcOver; + + case VG_LITE_BLEND_NORMAL_LVGL: + return BlendMethod::Normal; + + case VG_LITE_BLEND_SRC_OVER: + return BlendMethod::Normal; + + case VG_LITE_BLEND_SCREEN: + return BlendMethod::Screen; + + case VG_LITE_BLEND_ADDITIVE: + return BlendMethod::Add; + + case VG_LITE_BLEND_MULTIPLY: + return BlendMethod::Multiply; + + default: + break; + } + + return BlendMethod::Normal; +} + +static StrokeCap stroke_cap_conv(vg_lite_cap_style_t cap) +{ + switch(cap) { + case VG_LITE_CAP_SQUARE: + return StrokeCap::Square; + case VG_LITE_CAP_ROUND: + return StrokeCap::Round; + case VG_LITE_CAP_BUTT: + return StrokeCap::Butt; + default: + break; + } + + return StrokeCap::Square; +} + +static StrokeJoin stroke_join_conv(vg_lite_join_style_t join) +{ + switch(join) { + case VG_LITE_JOIN_BEVEL: + return StrokeJoin::Bevel; + case VG_LITE_JOIN_ROUND: + return StrokeJoin::Round; + case VG_LITE_JOIN_MITER: + return StrokeJoin::Miter; + default: + break; + } + + return StrokeJoin::Bevel; +} + +static FillSpread fill_spread_conv(vg_lite_gradient_spreadmode_t spread) +{ + switch(spread) { + case VG_LITE_GRADIENT_SPREAD_PAD: + return FillSpread::Pad; + case VG_LITE_GRADIENT_SPREAD_REPEAT: + return FillSpread::Repeat; + case VG_LITE_GRADIENT_SPREAD_REFLECT: + return FillSpread::Reflect; + default: + return FillSpread::Pad; + } +} + +static float vlc_get_arg(const void * data, vg_lite_format_t format) +{ + switch(format) { + case VG_LITE_S8: + return *((int8_t *)data); + + case VG_LITE_S16: + return *((int16_t *)data); + + case VG_LITE_S32: + return *((int32_t *)data); + + case VG_LITE_FP32: + return *((float *)data); + + default: + LV_LOG_ERROR("UNKNOWN_FORMAT: %d", format); + break; + } + + return 0; +} + +static uint8_t vlc_format_len(vg_lite_format_t format) +{ + switch(format) { + case VG_LITE_S8: + return 1; + case VG_LITE_S16: + return 2; + case VG_LITE_S32: + return 4; + case VG_LITE_FP32: + return 4; + default: + LV_LOG_ERROR("UNKNOWN_FORMAT: %d", format); + LV_ASSERT(false); + break; + } + + return 0; +} + +static uint8_t vlc_op_arg_len(uint8_t vlc_op) +{ + switch(vlc_op) { + VLC_OP_ARG_LEN(END, 0); + VLC_OP_ARG_LEN(CLOSE, 0); + VLC_OP_ARG_LEN(MOVE, 2); + VLC_OP_ARG_LEN(MOVE_REL, 2); + VLC_OP_ARG_LEN(LINE, 2); + VLC_OP_ARG_LEN(LINE_REL, 2); + VLC_OP_ARG_LEN(QUAD, 4); + VLC_OP_ARG_LEN(QUAD_REL, 4); + VLC_OP_ARG_LEN(CUBIC, 6); + VLC_OP_ARG_LEN(CUBIC_REL, 6); + VLC_OP_ARG_LEN(SCCWARC, 5); + VLC_OP_ARG_LEN(SCCWARC_REL, 5); + VLC_OP_ARG_LEN(SCWARC, 5); + VLC_OP_ARG_LEN(SCWARC_REL, 5); + VLC_OP_ARG_LEN(LCCWARC, 5); + VLC_OP_ARG_LEN(LCCWARC_REL, 5); + VLC_OP_ARG_LEN(LCWARC, 5); + VLC_OP_ARG_LEN(LCWARC_REL, 5); + default: + LV_LOG_ERROR("UNKNOWN_VLC_OP: 0x%x", vlc_op); + LV_ASSERT(false); + break; + } + + return 0; +} + +static Result shape_set_stroke(std::unique_ptr & shape, const vg_lite_path_t * path) +{ + switch(path->path_type) { + case VG_LITE_DRAW_ZERO: + case VG_LITE_DRAW_FILL_PATH: + /* if path is not a stroke, return */ + return Result::Success; + + case VG_LITE_DRAW_STROKE_PATH: + case VG_LITE_DRAW_FILL_STROKE_PATH: + break; + + default: + LV_LOG_ERROR("unknown path type: %d", path->path_type); + return Result::InvalidArguments; + } + + LV_ASSERT_NULL(path->stroke); + TVG_CHECK_RETURN_RESULT(shape->stroke(path->stroke->line_width)); + TVG_CHECK_RETURN_RESULT(shape->strokeMiterlimit(path->stroke->miter_limit)); + TVG_CHECK_RETURN_RESULT(shape->stroke(stroke_cap_conv(path->stroke->cap_style))); + TVG_CHECK_RETURN_RESULT(shape->stroke(stroke_join_conv(path->stroke->join_style))); + TVG_CHECK_RETURN_RESULT(shape->stroke(TVG_COLOR(path->stroke_color))); + + if(path->stroke->pattern_count) { + LV_ASSERT_NULL(path->stroke->dash_pattern); + TVG_CHECK_RETURN_RESULT(shape->stroke(path->stroke->dash_pattern, path->stroke->pattern_count)); + } + + return Result::Success; +} + +static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t * path, vg_lite_matrix_t * matrix) +{ + uint8_t fmt_len = vlc_format_len(path->format); + uint8_t * cur = (uint8_t *)path->path; + uint8_t * end = cur + path->path_length; + + while(cur < end) { + /* get op code */ + uint8_t op_code = VLC_GET_OP_CODE(cur); + + /* get arguments length */ + uint8_t arg_len = vlc_op_arg_len(op_code); + + /* skip op code */ + cur += fmt_len; + + switch(op_code) { + case VLC_OP_MOVE: { + float x = VLC_GET_ARG(cur, 0); + float y = VLC_GET_ARG(cur, 1); + TVG_CHECK_RETURN_RESULT(shape->moveTo(x, y)); + } + break; + + case VLC_OP_LINE: { + float x = VLC_GET_ARG(cur, 0); + float y = VLC_GET_ARG(cur, 1); + TVG_CHECK_RETURN_RESULT(shape->lineTo(x, y)); + } + break; + + case VLC_OP_QUAD: { + /* hack pre point */ + float qcx0 = VLC_GET_ARG(cur, -3); + float qcy0 = VLC_GET_ARG(cur, -2); + float qcx1 = VLC_GET_ARG(cur, 0); + float qcy1 = VLC_GET_ARG(cur, 1); + float x = VLC_GET_ARG(cur, 2); + float y = VLC_GET_ARG(cur, 3); + + qcx0 += (qcx1 - qcx0) * 2 / 3; + qcy0 += (qcy1 - qcy0) * 2 / 3; + qcx1 = x + (qcx1 - x) * 2 / 3; + qcy1 = y + (qcy1 - y) * 2 / 3; + + TVG_CHECK_RETURN_RESULT(shape->cubicTo(qcx0, qcy0, qcx1, qcy1, x, y)); + } + break; + + case VLC_OP_CUBIC: { + float cx1 = VLC_GET_ARG(cur, 0); + float cy1 = VLC_GET_ARG(cur, 1); + float cx2 = VLC_GET_ARG(cur, 2); + float cy2 = VLC_GET_ARG(cur, 3); + float x = VLC_GET_ARG(cur, 4); + float y = VLC_GET_ARG(cur, 5); + TVG_CHECK_RETURN_RESULT(shape->cubicTo(cx1, cy1, cx2, cy2, x, y)); + } + break; + + case VLC_OP_CLOSE: + TVG_CHECK_RETURN_RESULT(shape->close()); + break; + + default: + break; + } + + cur += arg_len * fmt_len; + } + + TVG_CHECK_RETURN_RESULT(shape_set_stroke(shape, path)); + + float x_min = path->bounding_box[0]; + float y_min = path->bounding_box[1]; + float x_max = path->bounding_box[2]; + float y_max = path->bounding_box[3]; + + if(math_equal(x_min, -FLT_MAX) && math_equal(y_min, -FLT_MAX) + && math_equal(x_max, FLT_MAX) && math_equal(y_max, FLT_MAX)) { + return Result::Success; + } + + auto cilp = Shape::gen(); + TVG_CHECK_RETURN_RESULT(cilp->appendRect(x_min, y_min, x_max - x_min, y_max - y_min, 0, 0)); + TVG_CHECK_RETURN_RESULT(cilp->transform(matrix_conv(matrix))); + TVG_CHECK_RETURN_RESULT(shape->composite(std::move(cilp), CompositeMethod::ClipPath)); + + return Result::Success; +} + +static Result shape_append_rect(std::unique_ptr & shape, const vg_lite_buffer_t * target, + const vg_lite_rectangle_t * rect) +{ + if(rect) { + TVG_CHECK_RETURN_RESULT(shape->appendRect(rect->x, rect->y, rect->width, rect->height, 0, 0)); + } + else if(target) { + TVG_CHECK_RETURN_RESULT(shape->appendRect(0, 0, target->width, target->height, 0, 0)); + } + else { + return Result::InvalidArguments; + } + + return Result::Success; +} + +static Result canvas_set_target(vg_lite_ctx * ctx, vg_lite_buffer_t * target) +{ + /* if target_buffer needs to be changed, finish current drawing */ + if(ctx->target_buffer && ctx->target_buffer != target->memory) { + vg_lite_finish(); + } + + ctx->target_buffer = target->memory; + ctx->target_format = target->format; + ctx->target_px_size = target->width * target->height; + + void * canvas_target_buffer; + uint32_t stride = 0; + + if(TVG_IS_VG_FMT_SUPPORT(target->format)) { + /* if target format is supported by VG, use target buffer directly */ + canvas_target_buffer = target->memory; + + /* support target stride */ + LV_ASSERT(target->stride >= target->width); + LV_ASSERT(VG_LITE_IS_ALIGNED(target->stride, sizeof(uint32_t))); + stride = target->stride / sizeof(uint32_t); + } + else { + /* if target format is not supported by VG, use internal buffer */ + canvas_target_buffer = ctx->get_temp_target_buffer(target->width, target->height); + stride = target->width; + } + + /* Prevent repeated target setting */ + if(ctx->tvg_target_buffer == canvas_target_buffer) { + return Result::Success; + } + + ctx->tvg_target_buffer = canvas_target_buffer; + + TVG_CHECK_RETURN_RESULT(ctx->canvas->target( + (uint32_t *)ctx->tvg_target_buffer, + stride, + target->width, + target->height, + SwCanvas::ARGB8888)); + + if(ctx->scissor_is_set) { + TVG_CHECK_RETURN_RESULT( + ctx->canvas->viewport( + ctx->scissor_rect.x, ctx->scissor_rect.y, + ctx->scissor_rect.width, ctx->scissor_rect.height)); + } + + return Result::Success; +} + +static bool decode_indexed_line( + vg_lite_buffer_format_t color_format, + const vg_lite_uint32_t * palette, + int32_t x, int32_t y, + int32_t w_px, uint32_t stride, const uint8_t * in, vg_lite_uint32_t * out) +{ + uint8_t px_size; + uint16_t mask; + + in += stride * y; /*First pixel*/ + out += w_px * y; + + int8_t shift = 0; + switch(color_format) { + case VG_LITE_INDEX_1: + px_size = 1; + in += x / 8; /*8pixel per byte*/ + shift = 7 - (x & 0x7); + break; + case VG_LITE_INDEX_2: + px_size = 2; + in += x / 4; /*4pixel per byte*/ + shift = 6 - 2 * (x & 0x3); + break; + case VG_LITE_INDEX_4: + px_size = 4; + in += x / 2; /*2pixel per byte*/ + shift = 4 - 4 * (x & 0x1); + break; + case VG_LITE_INDEX_8: + px_size = 8; + in += x; + shift = 0; + break; + default: + LV_ASSERT(false); + return false; + } + + mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ + + int32_t i; + for(i = 0; i < w_px; i++) { + uint8_t val_act = (*in >> shift) & mask; + out[i] = palette[val_act]; + + shift -= px_size; + if(shift < 0) { + shift = 8 - px_size; + in++; + } + } + return true; +} + +static Result picture_load(vg_lite_ctx * ctx, std::unique_ptr & picture, const vg_lite_buffer_t * source, + vg_lite_color_t color) +{ + vg_lite_uint32_t * image_buffer; + + /* At least 8-byte alignment */ + LV_ASSERT(VG_LITE_IS_ALIGNED(source->memory, 8)); + + /** + * Since ThorVG's picture->load does not support stride, + * reconversion is required when the stride and width do not match. + */ + if(source->format == VG_LITE_BGRA8888 + && source->image_mode == VG_LITE_NORMAL_IMAGE_MODE + && (size_t)source->stride == (size_t)(source->width * sizeof(vg_lite_uint32_t))) { + image_buffer = (vg_lite_uint32_t *)source->memory; + } + else { + vg_lite_uint32_t width = source->width; + vg_lite_uint32_t height = source->height; + image_buffer = ctx->get_image_buffer(width, height); + + vg_lite_buffer_t target; + memset(&target, 0, sizeof(target)); + target.memory = image_buffer; + target.format = VG_LITE_BGRA8888; + target.width = width; + target.height = height; + target.stride = width * sizeof(vg_lite_uint32_t); + + switch(source->format) { + case VG_LITE_INDEX_1: + case VG_LITE_INDEX_2: + case VG_LITE_INDEX_4: + case VG_LITE_INDEX_8: { + const vg_lite_uint32_t * clut_colors = ctx->get_CLUT(source->format); + for(vg_lite_uint32_t y = 0; y < height; y++) { + decode_indexed_line(source->format, clut_colors, 0, y, width, source->stride, (uint8_t *)source->memory, image_buffer); + } + } + break; + + case VG_LITE_A4: { + conv_alpha4_to_bgra8888.convert(&target, source, color); + } + break; + + case VG_LITE_A8: { + conv_alpha8_to_bgra8888.convert(&target, source, color); + } + break; + + case VG_LITE_L8: { + conv_l8_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGRX8888: { + conv_bgrx8888_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGR888: { + conv_bgr888_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGRA5658: { + conv_bgra5658_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGR565: { + conv_bgr565_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGRA5551: { + conv_bgra5551_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGRA4444: { + conv_bgra4444_to_bgra8888.convert(&target, source); + } + break; + + case VG_LITE_BGRA2222: { + conv_bgra2222_to_bgra8888.convert(&target, source); + } + break; + +#if LV_VG_LITE_THORVG_YUV_SUPPORT + case VG_LITE_NV12: { + libyuv::NV12ToARGB((const uint8_t *)source->memory, source->stride, (const uint8_t *)source->yuv.uv_memory, + source->yuv.uv_stride, + (uint8_t *)image_buffer, source->width * sizeof(vg_lite_uint32_t), width, height); + } + break; +#endif + + case VG_LITE_BGRA8888: { + /* For stride conversion */ + conv_bgra8888_to_bgra8888.convert(&target, source); + } + break; + + default: + LV_LOG_ERROR("unsupported format: %d", source->format); + LV_ASSERT(false); + break; + } + + /* multiply color */ + if(source->image_mode == VG_LITE_MULTIPLY_IMAGE_MODE && !VG_LITE_IS_ALPHA_FORMAT(source->format)) { + vg_color32_t * dest = (vg_color32_t *)image_buffer; + vg_lite_uint32_t px_size = width * height; + while(px_size--) { + dest->alpha = UDIV255(dest->alpha * A(color)); + dest->red = UDIV255(dest->red * B(color)); + dest->green = UDIV255(dest->green * G(color)); + dest->blue = UDIV255(dest->blue * R(color)); + dest++; + } + } + } + + TVG_CHECK_RETURN_RESULT(picture->load((uint32_t *)image_buffer, source->width, source->height, true)); + + return Result::Success; +} + +static void ClampColor(FLOATVECTOR4 Source, FLOATVECTOR4 Target, uint8_t Premultiplied) +{ + vg_lite_float_t colorMax; + /* Clamp the alpha channel. */ + Target[3] = CLAMP(Source[3], 0.0f, 1.0f); + + /* Determine the maximum value for the color channels. */ + colorMax = Premultiplied ? Target[3] : 1.0f; + + /* Clamp the color channels. */ + Target[0] = CLAMP(Source[0], 0.0f, colorMax); + Target[1] = CLAMP(Source[1], 0.0f, colorMax); + Target[2] = CLAMP(Source[2], 0.0f, colorMax); +} + +static uint8_t PackColorComponent(vg_lite_float_t value) +{ + /* Compute the rounded normalized value. */ + vg_lite_float_t rounded = value * 255.0f + 0.5f; + + /* Get the integer part. */ + int32_t roundedInt = (int32_t)rounded; + + /* Clamp to 0..1 range. */ + uint8_t clamped = (uint8_t)CLAMP(roundedInt, 0, 255); + + /* Return result. */ + return clamped; +} + +/* Get the bpp information of a color format. */ +static void get_format_bytes(vg_lite_buffer_format_t format, + vg_lite_uint32_t * mul, + vg_lite_uint32_t * div, + vg_lite_uint32_t * bytes_align) +{ + *mul = *div = 1; + *bytes_align = 4; + switch(format) { + case VG_LITE_L8: + case VG_LITE_A8: + case VG_LITE_RGBA8888_ETC2_EAC: + break; + + case VG_LITE_A4: + *div = 2; + break; + + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_YUYV: + case VG_LITE_YUY2: + case VG_LITE_YUY2_TILED: + /* AYUY2 buffer memory = YUY2 + alpha. */ + case VG_LITE_AYUY2: + case VG_LITE_AYUY2_TILED: + /* ABGR8565_PLANAR buffer memory = RGB565 + alpha. */ + case VG_LITE_ABGR8565_PLANAR: + case VG_LITE_ARGB8565_PLANAR: + case VG_LITE_RGBA5658_PLANAR: + case VG_LITE_BGRA5658_PLANAR: + *mul = 2; + break; + + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + *mul = 4; + break; + + case VG_LITE_NV12: + case VG_LITE_NV12_TILED: + *mul = 3; + break; + + case VG_LITE_ANV12: + case VG_LITE_ANV12_TILED: + *mul = 4; + break; + + case VG_LITE_INDEX_1: + *div = 8; + *bytes_align = 8; + break; + + case VG_LITE_INDEX_2: + *div = 4; + *bytes_align = 8; + break; + + case VG_LITE_INDEX_4: + *div = 2; + *bytes_align = 8; + break; + + case VG_LITE_INDEX_8: + *bytes_align = 1; + break; + + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + *mul = 1; + break; + + case VG_LITE_RGB888: + case VG_LITE_BGR888: + case VG_LITE_ABGR8565: + case VG_LITE_BGRA5658: + case VG_LITE_ARGB8565: + case VG_LITE_RGBA5658: + *mul = 3; + break; + + /* OpenVG format*/ + case VG_sRGBX_8888: + case VG_sRGBA_8888: + case VG_sRGBA_8888_PRE: + case VG_lRGBX_8888: + case VG_lRGBA_8888: + case VG_lRGBA_8888_PRE: + case VG_sXRGB_8888: + case VG_sARGB_8888: + case VG_sARGB_8888_PRE: + case VG_lXRGB_8888: + case VG_lARGB_8888: + case VG_lARGB_8888_PRE: + case VG_sBGRX_8888: + case VG_sBGRA_8888: + case VG_sBGRA_8888_PRE: + case VG_lBGRX_8888: + case VG_lBGRA_8888: + case VG_sXBGR_8888: + case VG_sABGR_8888: + case VG_lBGRA_8888_PRE: + case VG_sABGR_8888_PRE: + case VG_lXBGR_8888: + case VG_lABGR_8888: + case VG_lABGR_8888_PRE: + *mul = 4; + break; + + case VG_sRGBA_5551: + case VG_sRGBA_4444: + case VG_sARGB_1555: + case VG_sARGB_4444: + case VG_sBGRA_5551: + case VG_sBGRA_4444: + case VG_sABGR_1555: + case VG_sABGR_4444: + case VG_sRGB_565: + case VG_sBGR_565: + *mul = 2; + break; + + case VG_sL_8: + case VG_lL_8: + case VG_A_8: + break; + + case VG_BW_1: + case VG_A_4: + case VG_A_1: + *div = 2; + break; + + default: + break; + } +} + +static vg_lite_fpoint_t matrix_transform_point(const vg_lite_matrix_t * matrix, const vg_lite_fpoint_t * point) +{ + vg_lite_fpoint_t p; + p.x = (vg_lite_float_t)(point->x * matrix->m[0][0] + point->y * matrix->m[0][1] + matrix->m[0][2]); + p.y = (vg_lite_float_t)(point->x * matrix->m[1][0] + point->y * matrix->m[1][1] + matrix->m[1][2]); + return p; +} + +static bool vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix) +{ + vg_lite_float_t det00, det01, det02; + vg_lite_float_t d; + bool is_affine; + + /* Test for identity matrix. */ + if(matrix == NULL) { + result->m[0][0] = 1.0f; + result->m[0][1] = 0.0f; + result->m[0][2] = 0.0f; + result->m[1][0] = 0.0f; + result->m[1][1] = 1.0f; + result->m[1][2] = 0.0f; + result->m[2][0] = 0.0f; + result->m[2][1] = 0.0f; + result->m[2][2] = 1.0f; + + /* Success. */ + return true; + } + + det00 = (matrix->m[1][1] * matrix->m[2][2]) - (matrix->m[2][1] * matrix->m[1][2]); + det01 = (matrix->m[2][0] * matrix->m[1][2]) - (matrix->m[1][0] * matrix->m[2][2]); + det02 = (matrix->m[1][0] * matrix->m[2][1]) - (matrix->m[2][0] * matrix->m[1][1]); + + /* Compute determinant. */ + d = (matrix->m[0][0] * det00) + (matrix->m[0][1] * det01) + (matrix->m[0][2] * det02); + + /* Return 0 if there is no inverse matrix. */ + if(d == 0.0f) + return false; + + /* Compute reciprocal. */ + d = 1.0f / d; + + /* Determine if the matrix is affine. */ + is_affine = (matrix->m[2][0] == 0.0f) && (matrix->m[2][1] == 0.0f) && (matrix->m[2][2] == 1.0f); + + result->m[0][0] = d * det00; + result->m[0][1] = d * ((matrix->m[2][1] * matrix->m[0][2]) - (matrix->m[0][1] * matrix->m[2][2])); + result->m[0][2] = d * ((matrix->m[0][1] * matrix->m[1][2]) - (matrix->m[1][1] * matrix->m[0][2])); + result->m[1][0] = d * det01; + result->m[1][1] = d * ((matrix->m[0][0] * matrix->m[2][2]) - (matrix->m[2][0] * matrix->m[0][2])); + result->m[1][2] = d * ((matrix->m[1][0] * matrix->m[0][2]) - (matrix->m[0][0] * matrix->m[1][2])); + result->m[2][0] = is_affine ? 0.0f : d * det02; + result->m[2][1] = is_affine ? 0.0f : d * ((matrix->m[2][0] * matrix->m[0][1]) - (matrix->m[0][0] * matrix->m[2][1])); + result->m[2][2] = is_affine ? 1.0f : d * ((matrix->m[0][0] * matrix->m[1][1]) - (matrix->m[1][0] * matrix->m[0][1])); + + /* Success. */ + return true; +} + +static void vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult) +{ + vg_lite_matrix_t temp; + int row, column; + + /* Process all rows. */ + for(row = 0; row < 3; row++) { + /* Process all columns. */ + for(column = 0; column < 3; column++) { + /* Compute matrix entry. */ + temp.m[row][column] = (matrix->m[row][0] * mult->m[0][column]) + + (matrix->m[row][1] * mult->m[1][column]) + + (matrix->m[row][2] * mult->m[2][column]); + } + } + + /* Copy temporary matrix into result. */ + lv_memcpy(matrix->m, &temp.m, sizeof(temp.m)); +} + +static Result vg_lite_grad_matrix_conv(vg_lite_matrix_t * result, const vg_lite_matrix_t * grad_matrix, + const vg_lite_matrix_t * path_matrix) +{ + /** + * Since Thorvg internally multiplies the path (shape) matrix with the gradient matrix to produce + * the rendering result, and VG-Lite's gradient matrix and path matrix are completely independent, + * requiring a previous multiplication to achieve the same rendering result, + * for the VG-Lite emulator, it is necessary to offset the gradient matrix to obtain the user's original gradient matrix + * to simulate hardware behavior: + * matrix_out = path_matrix * gradient_matrix + * => + * gradient_matrix = inv(path_matrix) * matrix_out + */ + if(!vg_lite_matrix_inverse(result, path_matrix)) { + return Result::InvalidArguments; + } + + vg_lite_matrix_multiply(result, grad_matrix); + return Result::Success; +} + +#endif diff --git a/inc/lvgl/src/display/lv_display.c b/inc/lvgl/src/display/lv_display.c new file mode 100644 index 0000000..63555da --- /dev/null +++ b/inc/lvgl/src/display/lv_display.c @@ -0,0 +1,1562 @@ +/** + * @file lv_display.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../display/lv_display_private.h" +#include "../misc/lv_event_private.h" +#include "../misc/lv_anim_private.h" +#include "../draw/lv_draw_private.h" +#include "../core/lv_obj_private.h" +#include "lv_display.h" +#include "../misc/lv_math.h" +#include "../core/lv_refr_private.h" +#include "../stdlib/lv_string.h" +#include "../themes/lv_theme.h" +#include "../core/lv_global.h" +#include "../debugging/sysmon/lv_sysmon.h" + +#if LV_USE_DRAW_SW + #include "../draw/sw/lv_draw_sw.h" +#endif + +/********************* + * DEFINES + *********************/ +#define disp_def LV_GLOBAL_DEFAULT()->disp_default +#define disp_ll_p &(LV_GLOBAL_DEFAULT()->disp_ll) + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_LOAD_SCREEN_RESULT_OK, + LV_LOAD_SCREEN_RESULT_OLD_SCREEN_DELETED, + LV_LOAD_SCREEN_RESULT_NEW_SCREEN_DELETED, + LV_LOAD_SCREEN_RESULT_BOTH_SCREENS_DELETED, + LV_LOAD_SCREEN_RESULT_DISPLAY_DELETED, +} lv_load_screen_result_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool old_screen_deleted(lv_load_screen_result_t res); +static bool new_screen_deleted(lv_load_screen_result_t res); + +static lv_obj_tree_walk_res_t invalidate_layout_cb(lv_obj_t * obj, void * user_data); +static void update_resolution(lv_display_t * disp); +static void screen_event_delete_cb(lv_event_t * e); +static lv_load_screen_result_t load_new_screen(lv_obj_t * scr); +static void scr_load_anim_start(lv_anim_t * a); +static void opa_scale_anim(void * obj, int32_t v); +static void set_x_anim(void * obj, int32_t v); +static void set_y_anim(void * obj, int32_t v); +static void scr_anim_completed(lv_anim_t * a); +static bool is_out_anim(lv_screen_load_anim_t a); +static void disp_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res) +{ + lv_display_t * disp = lv_ll_ins_head(disp_ll_p); + LV_ASSERT_MALLOC(disp); + if(!disp) return NULL; + + lv_memzero(disp, sizeof(lv_display_t)); + + disp->hor_res = hor_res; + disp->ver_res = ver_res; + disp->physical_hor_res = -1; + disp->physical_ver_res = -1; + disp->offset_x = 0; + disp->offset_y = 0; + disp->antialiasing = LV_COLOR_DEPTH > 8 ? 1 : 0; + disp->dpi = LV_DPI_DEF; + disp->color_format = LV_COLOR_FORMAT_NATIVE; +#if LV_USE_EXT_DATA + disp->ext_data.free_cb = NULL; + disp->ext_data.data = NULL; +#endif + +#if defined(LV_DRAW_SW_DRAW_UNIT_CNT) && (LV_DRAW_SW_DRAW_UNIT_CNT != 0) + disp->tile_cnt = LV_DRAW_SW_DRAW_UNIT_CNT; +#else + disp->tile_cnt = 1; +#endif + + disp->layer_head = lv_malloc(sizeof(lv_layer_t)); + LV_ASSERT_MALLOC(disp->layer_head); + if(disp->layer_head == NULL) return NULL; + lv_layer_init(disp->layer_head); + + if(disp->layer_init) disp->layer_init(disp, disp->layer_head); + disp->layer_head->buf_area.x1 = 0; + disp->layer_head->buf_area.y1 = 0; + disp->layer_head->buf_area.x2 = hor_res - 1; + disp->layer_head->buf_area.y2 = ver_res - 1; + disp->layer_head->color_format = disp->color_format; + + disp->inv_en_cnt = 1; + disp->last_activity_time = lv_tick_get(); + + lv_ll_init(&disp->sync_areas, sizeof(lv_area_t)); + + lv_display_t * disp_def_tmp = disp_def; + disp_def = disp; /*Temporarily change the default screen to create the default screens on the + new display*/ + /*Create a refresh timer*/ + disp->refr_timer = lv_timer_create(lv_display_refr_timer, LV_DEF_REFR_PERIOD, disp); + LV_ASSERT_MALLOC(disp->refr_timer); + if(disp->refr_timer == NULL) { + lv_free(disp); + return NULL; + } + +#if LV_USE_THEME_DEFAULT + if(lv_theme_default_is_inited() == false) { + disp->theme = lv_theme_default_init(disp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), + LV_THEME_DEFAULT_DARK, LV_FONT_DEFAULT); + } + else { + disp->theme = lv_theme_default_get(); + } +#elif LV_USE_THEME_SIMPLE + if(lv_theme_simple_is_inited() == false) { + disp->theme = lv_theme_simple_init(disp); + } + else { + disp->theme = lv_theme_simple_get(); + } +#elif LV_USE_THEME_MONO + if(lv_theme_mono_is_inited() == false) { + disp->theme = lv_theme_mono_init(disp, false, LV_FONT_DEFAULT); + } + else { + disp->theme = lv_theme_mono_get(); + } +#endif + + disp->bottom_layer = lv_obj_create(NULL); /*Create bottom layer on the display*/ + disp->act_scr = lv_obj_create(NULL); /*Create a default screen on the display*/ + disp->top_layer = lv_obj_create(NULL); /*Create top layer on the display*/ + disp->sys_layer = lv_obj_create(NULL); /*Create sys layer on the display*/ + lv_obj_remove_style_all(disp->bottom_layer); + lv_obj_remove_style_all(disp->top_layer); + lv_obj_remove_style_all(disp->sys_layer); + lv_obj_remove_flag(disp->top_layer, LV_OBJ_FLAG_CLICKABLE); + lv_obj_remove_flag(disp->sys_layer, LV_OBJ_FLAG_CLICKABLE); + + if(lv_color_format_has_alpha(disp->color_format)) { + lv_obj_remove_local_style_prop(disp->bottom_layer, LV_STYLE_BG_OPA, 0); + } + else { + lv_obj_set_style_bg_opa(disp->bottom_layer, 255, 0); + } + + lv_obj_set_scrollbar_mode(disp->bottom_layer, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_scrollbar_mode(disp->top_layer, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_scrollbar_mode(disp->sys_layer, LV_SCROLLBAR_MODE_OFF); + + lv_obj_invalidate(disp->act_scr); + + disp_def = disp_def_tmp; /*Revert the default display*/ + if(disp_def == NULL) disp_def = disp; /*Initialize the default display*/ + + lv_display_add_event_cb(disp, disp_event_cb, LV_EVENT_REFR_REQUEST, NULL); + + lv_timer_ready(disp->refr_timer); /*Be sure the screen will be refreshed immediately on start up*/ + +#if LV_USE_PERF_MONITOR + lv_sysmon_show_performance(disp); +#endif + +#if LV_USE_MEM_MONITOR + lv_sysmon_show_memory(disp); +#endif + + return disp; +} + +void lv_display_delete(lv_display_t * disp) +{ + bool was_default = false; + bool was_refr = false; + if(disp == lv_display_get_default()) was_default = true; + if(disp == lv_refr_get_disp_refreshing()) was_refr = true; + + lv_display_send_event(disp, LV_EVENT_DELETE, NULL); + lv_event_mark_deleted(disp); + lv_event_remove_all(&(disp->event_list)); + + /*Detach the input devices*/ + lv_indev_t * indev; + indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_display(indev) == disp) { + lv_indev_set_display(indev, NULL); + } + indev = lv_indev_get_next(indev); + } + + /* Delete screen and other obj */ + if(disp->sys_layer) { + lv_obj_delete(disp->sys_layer); + disp->sys_layer = NULL; + } + if(disp->top_layer) { + lv_obj_delete(disp->top_layer); + disp->top_layer = NULL; + } + + if(disp->bottom_layer) { + lv_obj_delete(disp->bottom_layer); + disp->bottom_layer = NULL; + } + + disp->act_scr = NULL; + + while(disp->screen_cnt != 0) { + /*Delete the screens*/ + lv_obj_delete(disp->screens[0]); + } + + lv_ll_clear(&disp->sync_areas); + lv_ll_remove(disp_ll_p, disp); + if(disp->refr_timer) lv_timer_delete(disp->refr_timer); + + if(disp->layer_deinit) disp->layer_deinit(disp, disp->layer_head); + lv_free(disp->layer_head); + +#if LV_USE_EXT_DATA + if(disp->ext_data.free_cb) { + disp->ext_data.free_cb(disp->ext_data.data); + disp->ext_data.data = NULL; + } +#endif + + lv_free(disp); + + if(was_default) lv_display_set_default(lv_ll_get_head(disp_ll_p)); + + if(was_refr) lv_refr_set_disp_refreshing(NULL); +} + +void lv_display_set_default(lv_display_t * disp) +{ + disp_def = disp; +} + +lv_display_t * lv_display_get_default(void) +{ + return disp_def; +} + +lv_display_t * lv_display_get_next(lv_display_t * disp) +{ + if(disp == NULL) + return lv_ll_get_head(disp_ll_p); + else + return lv_ll_get_next(disp_ll_p, disp); +} + +/*--------------------- + * RESOLUTION + *--------------------*/ + +void lv_display_set_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + if(disp->hor_res == hor_res && disp->ver_res == ver_res) return; + + disp->hor_res = hor_res; + disp->ver_res = ver_res; + + update_resolution(disp); +} + +void lv_display_set_physical_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->physical_hor_res = hor_res; + disp->physical_ver_res = ver_res; + + lv_obj_invalidate(disp->sys_layer); + +} + +void lv_display_set_offset(lv_display_t * disp, int32_t x, int32_t y) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->offset_x = x; + disp->offset_y = y; + + lv_obj_invalidate(disp->sys_layer); + +} + +void lv_display_set_dpi(lv_display_t * disp, int32_t dpi) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->dpi = dpi; +} + +int32_t lv_display_get_horizontal_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + case LV_DISPLAY_ROTATION_270: + return disp->ver_res; + default: + return disp->hor_res; + } + } +} + +int32_t lv_display_get_vertical_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + case LV_DISPLAY_ROTATION_270: + return disp->hor_res; + default: + return disp->ver_res; + } + } +} + +int32_t lv_display_get_original_horizontal_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) { + return 0; + } + + return disp->hor_res; +} + +int32_t lv_display_get_original_vertical_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) { + return 0; + } + + return disp->ver_res; +} + +int32_t lv_display_get_physical_horizontal_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + case LV_DISPLAY_ROTATION_270: + return disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res; + default: + return disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res; + } + } +} + +int32_t lv_display_get_physical_vertical_resolution(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + case LV_DISPLAY_ROTATION_270: + return disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res; + default: + return disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res; + } + } +} + +int32_t lv_display_get_offset_x(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + return disp->offset_y; + case LV_DISPLAY_ROTATION_180: + return lv_display_get_physical_horizontal_resolution(disp) - disp->offset_x; + case LV_DISPLAY_ROTATION_270: + return lv_display_get_physical_horizontal_resolution(disp) - disp->offset_y; + default: + return disp->offset_x; + } + } +} + +int32_t lv_display_get_offset_y(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + + if(disp == NULL) { + return 0; + } + else { + switch(disp->rotation) { + case LV_DISPLAY_ROTATION_90: + return disp->offset_x; + case LV_DISPLAY_ROTATION_180: + return lv_display_get_physical_vertical_resolution(disp) - disp->offset_y; + case LV_DISPLAY_ROTATION_270: + return lv_display_get_physical_vertical_resolution(disp) - disp->offset_x; + default: + return disp->offset_y; + } + } +} + +int32_t lv_display_get_dpi(const lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return LV_DPI_DEF; /*Do not return 0 because it might be a divider*/ + return disp->dpi; +} + +/*--------------------- + * BUFFERING + *--------------------*/ + +void lv_display_set_draw_buffers(lv_display_t * disp, lv_draw_buf_t * buf1, lv_draw_buf_t * buf2) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->buf_1 = buf1; + disp->buf_2 = buf2; + disp->buf_act = disp->buf_1; + + disp->stride_is_auto = 0; +} + +void lv_display_set_3rd_draw_buffer(lv_display_t * disp, lv_draw_buf_t * buf3) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + LV_ASSERT_MSG(disp->buf_1 != NULL, "buf1 is null"); + LV_ASSERT_MSG(disp->buf_2 != NULL, "buf2 is null"); + + disp->buf_3 = buf3; +} + +void lv_display_set_buffers(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size, + lv_display_render_mode_t render_mode) +{ + LV_ASSERT_MSG(buf1 != NULL, "Null buffer"); + lv_color_format_t cf = lv_display_get_color_format(disp); + uint32_t w = lv_display_get_original_horizontal_resolution(disp); + uint32_t h = lv_display_get_original_vertical_resolution(disp); + LV_ASSERT_MSG(w != 0 && h != 0, "display resolution is 0"); + + /* buf1 or buf2 is not aligned according to LV_DRAW_BUF_ALIGN */ + LV_ASSERT_FORMAT_MSG(buf1 == lv_draw_buf_align(buf1, cf), "buf1 is not aligned: %p", buf1); + LV_ASSERT_FORMAT_MSG(buf2 == NULL || buf2 == lv_draw_buf_align(buf2, cf), "buf2 is not aligned: %p", buf2); + + uint32_t stride = lv_draw_buf_width_to_stride(w, cf); + if(render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { + LV_ASSERT_FORMAT_MSG(stride != 0, "stride is 0, check your color format %d and width: %" LV_PRIu32, cf, w); + /* for partial mode, we calculate the height based on the buf_size and stride */ + h = buf_size / stride; + LV_ASSERT_MSG(h != 0, "the buffer is too small"); + } + else { + LV_ASSERT_FORMAT_MSG(stride * h <= buf_size, "%s mode requires screen sized buffer(s)", + render_mode == LV_DISPLAY_RENDER_MODE_FULL ? "FULL" : "DIRECT"); + } + + lv_draw_buf_init(&disp->_static_buf1, w, h, cf, stride, buf1, buf_size); + lv_draw_buf_init(&disp->_static_buf2, w, h, cf, stride, buf2, buf_size); + lv_display_set_draw_buffers(disp, &disp->_static_buf1, buf2 ? &disp->_static_buf2 : NULL); + lv_display_set_render_mode(disp, render_mode); + + /* the stride was not set explicitly */ + disp->stride_is_auto = 1; +} + +void lv_display_set_buffers_with_stride(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size, + uint32_t stride, lv_display_render_mode_t render_mode) +{ + if(stride == LV_STRIDE_AUTO) { + lv_display_set_buffers(disp, buf1, buf2, buf_size, render_mode); + return; + } + + LV_ASSERT_MSG(buf1 != NULL, "Null buffer"); + lv_color_format_t cf = lv_display_get_color_format(disp); + uint32_t w = lv_display_get_original_horizontal_resolution(disp); + uint32_t h = lv_display_get_original_vertical_resolution(disp); + LV_ASSERT_MSG(w != 0 && h != 0, "display resolution is 0"); + + if(render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { + /* for partial mode, we calculate the height based on the buf_size and stride */ + h = buf_size / stride; + LV_ASSERT_MSG(h != 0, "the buffer is too small"); + } + else { + LV_ASSERT_FORMAT_MSG(stride * h <= buf_size, "%s mode requires screen sized buffer(s)", + render_mode == LV_DISPLAY_RENDER_MODE_FULL ? "FULL" : "DIRECT"); + } + + lv_draw_buf_init(&disp->_static_buf1, w, h, cf, stride, buf1, buf_size); + lv_draw_buf_init(&disp->_static_buf2, w, h, cf, stride, buf2, buf_size); + lv_display_set_draw_buffers(disp, &disp->_static_buf1, buf2 ? &disp->_static_buf2 : NULL); + lv_display_set_render_mode(disp, render_mode); + + disp->stride_is_auto = 0; +} + +void lv_display_set_render_mode(lv_display_t * disp, lv_display_render_mode_t render_mode) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + disp->render_mode = render_mode; +} + +void lv_display_set_flush_cb(lv_display_t * disp, lv_display_flush_cb_t flush_cb) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->flush_cb = flush_cb; +} + +void lv_display_set_flush_wait_cb(lv_display_t * disp, lv_display_flush_wait_cb_t wait_cb) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->flush_wait_cb = wait_cb; +} + +void lv_display_set_color_format(lv_display_t * disp, lv_color_format_t color_format) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->color_format = color_format; + disp->layer_head->color_format = color_format; + if(disp->buf_1) disp->buf_1->header.cf = color_format; + if(disp->buf_2) disp->buf_2->header.cf = color_format; + if(disp->buf_3) disp->buf_3->header.cf = color_format; + + if(lv_color_format_has_alpha(disp->color_format)) { + lv_obj_remove_local_style_prop(disp->bottom_layer, LV_STYLE_BG_OPA, 0); + } + else { + lv_obj_set_style_bg_opa(disp->bottom_layer, 255, 0); + } + + lv_display_send_event(disp, LV_EVENT_COLOR_FORMAT_CHANGED, NULL); +} + +lv_color_format_t lv_display_get_color_format(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return LV_COLOR_FORMAT_UNKNOWN; + + return disp->color_format; +} + +void lv_display_set_tile_cnt(lv_display_t * disp, uint32_t tile_cnt) +{ + LV_ASSERT_FORMAT_MSG(tile_cnt < 256, "tile_cnt must be smaller than 256 (%" LV_PRId32 " was used)", tile_cnt); + + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->tile_cnt = tile_cnt; +} + +uint32_t lv_display_get_tile_cnt(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return 0; + + return disp->tile_cnt; +} + +void lv_display_set_antialiasing(lv_display_t * disp, bool en) +{ + LV_LOG_WARN("Disabling anti-aliasing is not supported since v9. This function will be removed."); + + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->antialiasing = en; +} + +bool lv_display_get_antialiasing(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return false; + + return disp->antialiasing; +} + +lv_display_render_mode_t lv_display_get_render_mode(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + LV_ASSERT_MSG(disp != NULL, "No display to get render mode"); + + return disp->render_mode; +} + +LV_ATTRIBUTE_FLUSH_READY void lv_display_flush_ready(lv_display_t * disp) +{ + disp->flushing = 0; +} + +LV_ATTRIBUTE_FLUSH_READY bool lv_display_flush_is_last(lv_display_t * disp) +{ + return disp->flushing_last; +} + +bool lv_display_is_double_buffered(lv_display_t * disp) +{ + return disp->buf_2 != NULL; +} + +/*--------------------- + * SCREENS + *--------------------*/ + +lv_obj_t * lv_display_get_screen_active(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered to get its active screen"); + return NULL; + } + + return disp->act_scr; +} + +lv_obj_t * lv_display_get_screen_loading(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered to get the current screen being loaded"); + return NULL; + } + + return disp->scr_to_load; +} + +lv_obj_t * lv_display_get_screen_prev(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered to get its previous screen"); + return NULL; + } + + return disp->prev_scr; +} + +lv_obj_t * lv_display_get_layer_top(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("lv_layer_top: no display registered to get its top layer"); + return NULL; + } + + return disp->top_layer; +} + +lv_obj_t * lv_display_get_layer_sys(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("lv_layer_sys: no display registered to get its sys. layer"); + return NULL; + } + + return disp->sys_layer; +} + +lv_obj_t * lv_display_get_layer_bottom(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("lv_layer_bottom: no display registered to get its bottom layer"); + return NULL; + } + + return disp->bottom_layer; +} + +#if LV_USE_OBJ_NAME + +lv_obj_t * lv_display_get_screen_by_name(const lv_display_t * disp, const char * screen_name) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered to get a screen by name"); + return NULL; + } + + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + const char * n = lv_obj_get_name(disp->screens[i]); + if(n && lv_streq(screen_name, n)) return disp->screens[i]; + } + + return NULL; + +} + +#endif /*LV_USE_OBJ_NAME*/ + +void lv_screen_load(struct _lv_obj_t * scr) +{ + lv_screen_load_anim(scr, LV_SCREEN_LOAD_ANIM_NONE, 0, 0, false); +} + +void lv_screen_load_anim(lv_obj_t * new_scr, lv_screen_load_anim_t anim_type, uint32_t time, uint32_t delay, + bool auto_del) +{ + lv_display_t * d = lv_obj_get_display(new_scr); + lv_obj_t * act_scr = d->act_scr; + + if(act_scr == new_scr || d->scr_to_load == new_scr) { + return; + } + + /*If another screen load animation is in progress + *make target screen loaded immediately. */ + if(d->scr_to_load && act_scr != d->scr_to_load) { + lv_anim_delete(d->scr_to_load, NULL); + lv_obj_set_pos(d->scr_to_load, 0, 0); + lv_obj_remove_local_style_prop(d->scr_to_load, LV_STYLE_OPA, 0); + + d->prev_scr = d->act_scr; + act_scr = d->scr_to_load; /*Active screen changed.*/ + lv_load_screen_result_t res = load_new_screen(d->scr_to_load); + if(res == LV_LOAD_SCREEN_RESULT_DISPLAY_DELETED) { + return; + } + if(old_screen_deleted(res)) { + d->prev_scr = NULL; + } + if(new_screen_deleted(res)) { + return; + } + } + + d->scr_to_load = new_scr; + + if(d->prev_scr && d->del_prev) { + lv_obj_delete(d->prev_scr); + } + d->prev_scr = NULL; + + d->draw_prev_over_act = is_out_anim(anim_type); + d->del_prev = auto_del; + + /*Be sure there is no other animation on the screens*/ + lv_anim_delete(new_scr, NULL); + if(act_scr) lv_anim_delete(act_scr, NULL); + + /*Be sure both screens are in a normal position*/ + lv_obj_set_pos(new_scr, 0, 0); + if(act_scr) lv_obj_set_pos(act_scr, 0, 0); + lv_obj_remove_local_style_prop(new_scr, LV_STYLE_OPA, 0); + if(act_scr) lv_obj_remove_local_style_prop(act_scr, LV_STYLE_OPA, 0); + + /*Shortcut for immediate load*/ + if(time == 0 && delay == 0) { + lv_load_screen_result_t res = load_new_screen(new_scr); + if(res == LV_LOAD_SCREEN_RESULT_DISPLAY_DELETED) { + return; + } + if(new_screen_deleted(res)) { + d->act_scr = NULL; + } + if(!old_screen_deleted(res) && auto_del && act_scr) { + lv_obj_delete(act_scr); + } + return; + } + + lv_anim_t a_new; + lv_anim_init(&a_new); + lv_anim_set_var(&a_new, new_scr); + lv_anim_set_start_cb(&a_new, scr_load_anim_start); + lv_anim_set_completed_cb(&a_new, scr_anim_completed); + lv_anim_set_duration(&a_new, time); + lv_anim_set_delay(&a_new, delay); + + lv_anim_t a_old; + lv_anim_init(&a_old); + lv_anim_set_var(&a_old, act_scr); + lv_anim_set_duration(&a_old, time); + lv_anim_set_delay(&a_old, delay); + + switch(anim_type) { + case LV_SCREEN_LOAD_ANIM_NONE: + /*Create a dummy animation to apply the delay*/ + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, 0, 0); + break; + case LV_SCREEN_LOAD_ANIM_OVER_LEFT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, lv_display_get_horizontal_resolution(d), 0); + break; + case LV_SCREEN_LOAD_ANIM_OVER_RIGHT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, -lv_display_get_horizontal_resolution(d), 0); + break; + case LV_SCREEN_LOAD_ANIM_OVER_TOP: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, lv_display_get_vertical_resolution(d), 0); + break; + case LV_SCREEN_LOAD_ANIM_OVER_BOTTOM: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, -lv_display_get_vertical_resolution(d), 0); + break; + case LV_SCREEN_LOAD_ANIM_MOVE_LEFT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, lv_display_get_horizontal_resolution(d), 0); + + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, -lv_display_get_horizontal_resolution(d)); + break; + case LV_SCREEN_LOAD_ANIM_MOVE_RIGHT: + lv_anim_set_exec_cb(&a_new, set_x_anim); + lv_anim_set_values(&a_new, -lv_display_get_horizontal_resolution(d), 0); + + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, lv_display_get_horizontal_resolution(d)); + break; + case LV_SCREEN_LOAD_ANIM_MOVE_TOP: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, lv_display_get_vertical_resolution(d), 0); + + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, -lv_display_get_vertical_resolution(d)); + break; + case LV_SCREEN_LOAD_ANIM_MOVE_BOTTOM: + lv_anim_set_exec_cb(&a_new, set_y_anim); + lv_anim_set_values(&a_new, -lv_display_get_vertical_resolution(d), 0); + + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, lv_display_get_vertical_resolution(d)); + break; + case LV_SCREEN_LOAD_ANIM_FADE_IN: + lv_anim_set_exec_cb(&a_new, opa_scale_anim); + lv_anim_set_values(&a_new, LV_OPA_TRANSP, LV_OPA_COVER); + break; + case LV_SCREEN_LOAD_ANIM_FADE_OUT: + lv_anim_set_exec_cb(&a_old, opa_scale_anim); + lv_anim_set_values(&a_old, LV_OPA_COVER, LV_OPA_TRANSP); + break; + case LV_SCREEN_LOAD_ANIM_OUT_LEFT: + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, -lv_display_get_horizontal_resolution(d)); + break; + case LV_SCREEN_LOAD_ANIM_OUT_RIGHT: + lv_anim_set_exec_cb(&a_old, set_x_anim); + lv_anim_set_values(&a_old, 0, lv_display_get_horizontal_resolution(d)); + break; + case LV_SCREEN_LOAD_ANIM_OUT_TOP: + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, -lv_display_get_vertical_resolution(d)); + break; + case LV_SCREEN_LOAD_ANIM_OUT_BOTTOM: + lv_anim_set_exec_cb(&a_old, set_y_anim); + lv_anim_set_values(&a_old, 0, lv_display_get_vertical_resolution(d)); + break; + } + + if(act_scr) lv_obj_send_event(act_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL); + + lv_anim_start(&a_new); + if(act_scr) lv_anim_start(&a_old); +} + +/*--------------------- + * OTHERS + *--------------------*/ + +void lv_display_add_event_cb(lv_display_t * disp, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) +{ + LV_ASSERT_NULL(disp); + + lv_event_add(&disp->event_list, event_cb, filter, user_data); +} + +uint32_t lv_display_get_event_count(lv_display_t * disp) +{ + LV_ASSERT_NULL(disp); + return lv_event_get_count(&disp->event_list); +} + +lv_event_dsc_t * lv_display_get_event_dsc(lv_display_t * disp, uint32_t index) +{ + LV_ASSERT_NULL(disp); + return lv_event_get_dsc(&disp->event_list, index); + +} + +bool lv_display_delete_event(lv_display_t * disp, uint32_t index) +{ + LV_ASSERT_NULL(disp); + + return lv_event_remove(&disp->event_list, index); +} + +uint32_t lv_display_remove_event_cb_with_user_data(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data) +{ + LV_ASSERT_NULL(disp); + + uint32_t event_cnt = lv_display_get_event_count(disp); + uint32_t removed_count = 0; + int32_t i; + + for(i = event_cnt - 1; i >= 0; i--) { + lv_event_dsc_t * dsc = lv_display_get_event_dsc(disp, i); + if(dsc && dsc->cb == event_cb && dsc->user_data == user_data) { + lv_display_delete_event(disp, i); + removed_count ++; + } + } + + return removed_count; +} + +lv_result_t lv_display_send_event(lv_display_t * disp, lv_event_code_t code, void * param) +{ + return lv_event_push_and_send(&disp->event_list, code, disp, param); +} + +lv_area_t * lv_event_get_invalidated_area(lv_event_t * e) +{ + if(e->code == LV_EVENT_INVALIDATE_AREA) { + return lv_event_get_param(e); + } + else { + LV_LOG_WARN("Not interpreted with this event code"); + return NULL; + } +} + +void lv_display_set_rotation(lv_display_t * disp, lv_display_rotation_t rotation) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + disp->rotation = rotation; + update_resolution(disp); +} + +lv_display_rotation_t lv_display_get_rotation(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return LV_DISPLAY_ROTATION_0; + return disp->rotation; +} + +void lv_display_set_matrix_rotation(lv_display_t * disp, bool enable) +{ +#if LV_DRAW_TRANSFORM_USE_MATRIX + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return; + + if(!(disp->render_mode == LV_DISPLAY_RENDER_MODE_DIRECT || disp->render_mode == LV_DISPLAY_RENDER_MODE_FULL)) { + LV_LOG_WARN("Unsupported rendering mode: %d", disp->render_mode); + return; + } + + disp->matrix_rotation = enable; +#else + (void)disp; + (void)enable; + LV_LOG_WARN("LV_DRAW_TRANSFORM_USE_MATRIX was not enabled"); +#endif +} + +bool lv_display_get_matrix_rotation(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + if(disp == NULL) return false; + return disp->matrix_rotation; +} + +void lv_display_set_theme(lv_display_t * disp, lv_theme_t * th) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return; + } + + disp->theme = th; + + if(disp->screen_cnt == 4 && + lv_obj_get_child_count(disp->screens[0]) == 0 && + lv_obj_get_child_count(disp->screens[1]) == 0 && + lv_obj_get_child_count(disp->screens[2]) == 0) { + lv_theme_apply(disp->screens[0]); + + if(!th) { + /* When th is NULL, clear all styles */ + for(uint32_t i = 1; i < disp->screen_cnt; i++) { + lv_theme_apply(disp->screens[i]); + } + } + } +} + +lv_theme_t * lv_display_get_theme(lv_display_t * disp) +{ + if(disp == NULL) disp = lv_display_get_default(); + return disp->theme; +} + +uint32_t lv_display_get_inactive_time(const lv_display_t * disp) +{ + if(disp) return lv_tick_elaps(disp->last_activity_time); + + lv_display_t * d; + uint32_t t = UINT32_MAX; + d = lv_display_get_next(NULL); + while(d) { + uint32_t elaps = lv_tick_elaps(d->last_activity_time); + t = LV_MIN(t, elaps); + d = lv_display_get_next(d); + } + + return t; +} + +void lv_display_trigger_activity(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("lv_display_trigger_activity: no display registered"); + return; + } + + disp->last_activity_time = lv_tick_get(); +} + +void lv_display_enable_invalidation(lv_display_t * disp, bool en) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return; + } + + disp->inv_en_cnt += en ? 1 : -1; +} + +bool lv_display_is_invalidation_enabled(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) { + LV_LOG_WARN("no display registered"); + return false; + } + + return (disp->inv_en_cnt > 0); +} + +lv_timer_t * lv_display_get_refr_timer(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return NULL; + + return disp->refr_timer; +} + +void lv_display_delete_refr_timer(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp || !disp->refr_timer) return; + + lv_timer_delete(disp->refr_timer); + disp->refr_timer = NULL; +} + +lv_result_t lv_display_send_vsync_event(lv_display_t * disp, void * param) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return LV_RESULT_INVALID; + + if(disp->vsync_count > 0) + return lv_display_send_event(disp, LV_EVENT_VSYNC, param); + + return LV_RESULT_INVALID; +} + +bool lv_display_register_vsync_event(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return false; + + lv_display_add_event_cb(disp, event_cb, LV_EVENT_VSYNC, user_data); + + /*only send once*/ + if(disp->vsync_count == 0) + lv_display_send_event(disp, LV_EVENT_VSYNC_REQUEST, disp); + + disp->vsync_count++; + return true; +} + +bool lv_display_unregister_vsync_event(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return false; + + uint32_t removed_count = lv_display_remove_event_cb_with_user_data(disp, event_cb, user_data); + if(removed_count == 0) + return false; + + disp->vsync_count -= removed_count; + /*only send once*/ + if(disp->vsync_count == 0) + lv_display_send_event(disp, LV_EVENT_VSYNC_REQUEST, NULL); + + return true; +} + +void lv_display_set_user_data(lv_display_t * disp, void * user_data) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return; + disp->user_data = user_data; +} + +void lv_display_set_driver_data(lv_display_t * disp, void * driver_data) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return; + + disp->driver_data = driver_data; +} + +void * lv_display_get_user_data(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return NULL; + return disp->user_data; +} + +void * lv_display_get_driver_data(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return NULL; + + return disp->driver_data; +} + +lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return NULL; + return disp->buf_act; +} + +void lv_display_rotate_area(lv_display_t * disp, lv_area_t * area) +{ + lv_display_rotation_t rotation = lv_display_get_rotation(disp); + + if(rotation == LV_DISPLAY_ROTATION_0) return; + + int32_t w = lv_area_get_width(area); + int32_t h = lv_area_get_height(area); + + switch(rotation) { + case LV_DISPLAY_ROTATION_90: + area->y2 = disp->ver_res - area->x1 - 1; + area->x1 = area->y1; + area->x2 = area->x1 + h - 1; + area->y1 = area->y2 - w + 1; + break; + case LV_DISPLAY_ROTATION_180: + area->y2 = disp->ver_res - area->y1 - 1; + area->y1 = area->y2 - h + 1; + area->x2 = disp->hor_res - area->x1 - 1; + area->x1 = area->x2 - w + 1; + break; + case LV_DISPLAY_ROTATION_270: + area->x1 = disp->hor_res - area->y2 - 1; + area->y2 = area->x2; + area->x2 = area->x1 + h - 1; + area->y1 = area->y2 - w + 1; + break; + default: + break; + } +} + +void lv_display_rotate_point(lv_display_t * disp, lv_point_t * point) +{ + lv_display_rotation_t rotation = lv_display_get_rotation(disp); + + if(rotation == LV_DISPLAY_ROTATION_0) return; + + const int32_t x = point->x; + const int32_t y = point->y; + + switch(rotation) { + case LV_DISPLAY_ROTATION_90: + point->x = disp->ver_res - y - 1; + point->y = x; + break; + case LV_DISPLAY_ROTATION_180: + point->x = disp->hor_res - x - 1; + point->y = disp->ver_res - y - 1; + break; + case LV_DISPLAY_ROTATION_270: + point->x = y; + point->y = disp->hor_res - x - 1; + break; + default: + break; + } +} + +uint32_t lv_display_get_draw_buf_size(lv_display_t * disp) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return 0; + + if(disp->buf_1) { + return disp->buf_1->data_size; + } + return 0; +} + +uint32_t lv_display_get_invalidated_draw_buf_size(lv_display_t * disp, uint32_t width, uint32_t height) +{ + if(!disp) disp = lv_display_get_default(); + if(!disp) return 0; + + if(disp->render_mode == LV_DISPLAY_RENDER_MODE_FULL) { + width = lv_display_get_horizontal_resolution(disp); + height = lv_display_get_vertical_resolution(disp); + } + + lv_color_format_t cf = lv_display_get_color_format(disp); + uint32_t stride = lv_draw_buf_width_to_stride(width, cf); + uint32_t buf_size = stride * height; + + LV_ASSERT(disp->buf_1 && disp->buf_1->data_size >= buf_size); + if(disp->buf_2) LV_ASSERT(disp->buf_2->data_size >= buf_size); + if(disp->buf_3) LV_ASSERT(disp->buf_3->data_size >= buf_size); + + return buf_size; +} + +lv_obj_t * lv_screen_active(void) +{ + return lv_display_get_screen_active(lv_display_get_default()); +} + +lv_obj_t * lv_layer_top(void) +{ + return lv_display_get_layer_top(lv_display_get_default()); +} + +lv_obj_t * lv_layer_sys(void) +{ + return lv_display_get_layer_sys(lv_display_get_default()); +} + +lv_obj_t * lv_layer_bottom(void) +{ + return lv_display_get_layer_bottom(lv_display_get_default()); +} + +int32_t lv_dpx(int32_t n) +{ + return LV_DPX(n); +} + +int32_t lv_display_dpx(const lv_display_t * disp, int32_t n) +{ + return LV_DPX_CALC(lv_display_get_dpi(disp), n); +} + +#if LV_USE_EXT_DATA +void lv_display_set_external_data(lv_display_t * disp, void * data, void (* free_cb)(void * data)) +{ + if(!disp) { + LV_LOG_WARN("Can't attach external user data and destructor callback to a NULL display"); + return; + } + + disp->ext_data.data = data; + disp->ext_data.free_cb = free_cb; +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool old_screen_deleted(lv_load_screen_result_t res) +{ + return res == LV_LOAD_SCREEN_RESULT_BOTH_SCREENS_DELETED || res == LV_LOAD_SCREEN_RESULT_OLD_SCREEN_DELETED; +} +static bool new_screen_deleted(lv_load_screen_result_t res) +{ + return res == LV_LOAD_SCREEN_RESULT_BOTH_SCREENS_DELETED || res == LV_LOAD_SCREEN_RESULT_NEW_SCREEN_DELETED; +} + +static void update_resolution(lv_display_t * disp) +{ + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + + lv_area_t prev_coords; + lv_obj_get_coords(disp->sys_layer, &prev_coords); + uint32_t i; + for(i = 0; i < disp->screen_cnt; i++) { + lv_area_set_width(&disp->screens[i]->coords, hor_res); + lv_area_set_height(&disp->screens[i]->coords, ver_res); + lv_obj_send_event(disp->screens[i], LV_EVENT_SIZE_CHANGED, &prev_coords); + } + + lv_area_set_width(&disp->top_layer->coords, hor_res); + lv_area_set_height(&disp->top_layer->coords, ver_res); + lv_obj_send_event(disp->top_layer, LV_EVENT_SIZE_CHANGED, &prev_coords); + + lv_area_set_width(&disp->sys_layer->coords, hor_res); + lv_area_set_height(&disp->sys_layer->coords, ver_res); + lv_obj_send_event(disp->sys_layer, LV_EVENT_SIZE_CHANGED, &prev_coords); + + lv_area_set_width(&disp->bottom_layer->coords, hor_res); + lv_area_set_height(&disp->bottom_layer->coords, ver_res); + lv_obj_send_event(disp->bottom_layer, LV_EVENT_SIZE_CHANGED, &prev_coords); + + lv_memzero(disp->inv_areas, sizeof(disp->inv_areas)); + lv_memzero(disp->inv_area_joined, sizeof(disp->inv_area_joined)); + disp->inv_p = 0; + lv_obj_invalidate(disp->sys_layer); + + lv_obj_tree_walk(NULL, invalidate_layout_cb, NULL); + + lv_display_send_event(disp, LV_EVENT_RESOLUTION_CHANGED, NULL); +} + +static lv_obj_tree_walk_res_t invalidate_layout_cb(lv_obj_t * obj, void * user_data) +{ + LV_UNUSED(user_data); + lv_obj_mark_layout_as_dirty(obj); + return LV_OBJ_TREE_WALK_NEXT; +} + +static void screen_event_delete_cb(lv_event_t * e) +{ + lv_obj_t ** screen_var = lv_event_get_user_data(e); + *screen_var = NULL; +} + +/** + * Load a new screen and report the result. + * + * @param scr the screen object to load; must not be NULL + * @return a value of ::lv_load_screen_result_t indicating the outcome: + * - LV_LOAD_SCREEN_RESULT_OK: the new screen was loaded successfully; + * both the old and new screens remain valid. + * - LV_LOAD_SCREEN_RESULT_OLD_SCREEN_DELETED: the old screen was + * deleted while loading the new screen, but the new screen remains valid. + * - LV_LOAD_SCREEN_RESULT_NEW_SCREEN_DELETED: the new screen was + * deleted during loading/unloading events; the old screen remains valid. + * - LV_LOAD_SCREEN_RESULT_BOTH_SCREENS_DELETED: both the old and new + * screens were deleted during the operation. + * - LV_LOAD_SCREEN_RESULT_DISPLAY_DELETED: the display was deleted + * while processing screen load/unload events. + */ +static lv_load_screen_result_t load_new_screen(lv_obj_t * scr) +{ + /*scr must not be NULL, but d->act_scr might be*/ + LV_ASSERT_NULL(scr); + if(scr == NULL) return false; + + lv_display_t * d = lv_obj_get_display(scr); + LV_ASSERT_NULL(d); + + lv_obj_t * old_scr = d->act_scr; + /* Attach an event delete cb to the screen so we know if the screen is deleted during an event*/ + if(old_scr) { + lv_obj_add_event_cb(old_scr, screen_event_delete_cb, LV_EVENT_DELETE, &old_scr); + } + lv_obj_add_event_cb(scr, screen_event_delete_cb, LV_EVENT_DELETE, &scr); + + if(old_scr) { + if(lv_display_send_event(d, LV_EVENT_SCREEN_UNLOAD_START, old_scr) == LV_RESULT_INVALID) { + return LV_LOAD_SCREEN_RESULT_DISPLAY_DELETED; + } + if(old_scr && lv_obj_send_event(old_scr, LV_EVENT_SCREEN_UNLOAD_START, NULL) == LV_RESULT_INVALID) { + old_scr = NULL; + } + } + + if(lv_display_send_event(d, LV_EVENT_SCREEN_LOAD_START, scr) == LV_RESULT_INVALID) { + return LV_LOAD_SCREEN_RESULT_DISPLAY_DELETED; + } + + if(scr && lv_obj_send_event(scr, LV_EVENT_SCREEN_LOAD_START, NULL) == LV_RESULT_INVALID) { + scr = NULL; + } + + d->act_scr = scr; + d->scr_to_load = NULL; + + if(scr && lv_display_send_event(d, LV_EVENT_SCREEN_LOADED, scr) == LV_RESULT_INVALID) { + return LV_LOAD_SCREEN_RESULT_DISPLAY_DELETED; + } + + if(scr && lv_obj_send_event(scr, LV_EVENT_SCREEN_LOADED, NULL) == LV_RESULT_INVALID) { + d->act_scr = NULL; + scr = NULL; + } + + if(old_scr) { + if(lv_display_send_event(d, LV_EVENT_SCREEN_UNLOADED, old_scr) == LV_RESULT_INVALID) { + return LV_LOAD_SCREEN_RESULT_DISPLAY_DELETED; + } + if(old_scr && lv_obj_send_event(old_scr, LV_EVENT_SCREEN_UNLOADED, NULL) == LV_RESULT_INVALID) { + old_scr = NULL; + } + } + + if(scr) { + lv_obj_invalidate(scr); + lv_obj_remove_event_cb(scr, screen_event_delete_cb); + } + + if(!old_scr) { + return scr ? LV_LOAD_SCREEN_RESULT_OLD_SCREEN_DELETED : LV_LOAD_SCREEN_RESULT_BOTH_SCREENS_DELETED; + } + lv_obj_remove_event_cb(old_scr, screen_event_delete_cb); + return scr ? LV_LOAD_SCREEN_RESULT_OK : LV_LOAD_SCREEN_RESULT_NEW_SCREEN_DELETED; +} + +static void scr_load_anim_start(lv_anim_t * a) +{ + lv_display_t * d = lv_obj_get_display(a->var); + + d->prev_scr = d->act_scr; + d->act_scr = a->var; + + lv_obj_send_event(d->act_scr, LV_EVENT_SCREEN_LOAD_START, NULL); +} + +static void opa_scale_anim(void * obj, int32_t v) +{ + lv_obj_set_style_opa(obj, v, 0); +} + +static void set_x_anim(void * obj, int32_t v) +{ + lv_obj_set_x(obj, v); +} + +static void set_y_anim(void * obj, int32_t v) +{ + lv_obj_set_y(obj, v); +} + +static void scr_anim_completed(lv_anim_t * a) +{ + lv_display_t * d = lv_obj_get_display(a->var); + + if(lv_obj_send_event(d->act_scr, LV_EVENT_SCREEN_LOADED, NULL) == LV_RESULT_INVALID) { + d->act_scr = NULL; + } + + if(d->prev_scr && lv_obj_send_event(d->prev_scr, LV_EVENT_SCREEN_UNLOADED, NULL) != LV_RESULT_INVALID) { + if(d->del_prev) { + lv_obj_delete(d->prev_scr); + } + } + d->prev_scr = NULL; + d->draw_prev_over_act = false; + d->scr_to_load = NULL; + lv_obj_remove_local_style_prop(a->var, LV_STYLE_OPA, 0); + if(d->act_scr) { + lv_obj_invalidate(d->act_scr); + } +} + +static bool is_out_anim(lv_screen_load_anim_t anim_type) +{ + return anim_type == LV_SCREEN_LOAD_ANIM_FADE_OUT || + anim_type == LV_SCREEN_LOAD_ANIM_OUT_LEFT || + anim_type == LV_SCREEN_LOAD_ANIM_OUT_RIGHT || + anim_type == LV_SCREEN_LOAD_ANIM_OUT_TOP || + anim_type == LV_SCREEN_LOAD_ANIM_OUT_BOTTOM; +} + +static void disp_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_display_t * disp = lv_event_get_target(e); + switch(code) { + case LV_EVENT_REFR_REQUEST: + if(disp->refr_timer) lv_timer_resume(disp->refr_timer); + break; + + default: + break; + } +} diff --git a/inc/lvgl/src/display/lv_display.h b/inc/lvgl/src/display/lv_display.h new file mode 100644 index 0000000..1b59a8e --- /dev/null +++ b/inc/lvgl/src/display/lv_display.h @@ -0,0 +1,762 @@ +/** + * @file lv_display.h + * + */ + +#ifndef LV_DISPLAY_H +#define LV_DISPLAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../misc/lv_timer.h" +#include "../misc/lv_event.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +#ifndef LV_ATTRIBUTE_FLUSH_READY +#define LV_ATTRIBUTE_FLUSH_READY +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_DISPLAY_ROTATION_0 = 0, + LV_DISPLAY_ROTATION_90, + LV_DISPLAY_ROTATION_180, + LV_DISPLAY_ROTATION_270 +} lv_display_rotation_t; + +typedef enum { + /** + * Use the buffer(s) to render the screen is smaller parts. + * This way the buffers can be smaller then the display to save RAM. At least 1/10 screen size buffer(s) are recommended. + */ + LV_DISPLAY_RENDER_MODE_PARTIAL, + + /** + * The buffer(s) has to be screen sized and LVGL will render into the correct location of the buffer. + * This way the buffer always contain the whole image. Only the changed ares will be updated. + * With 2 buffers the buffers' content are kept in sync automatically and in flush_cb only address change is required. + */ + LV_DISPLAY_RENDER_MODE_DIRECT, + + /** + * Always redraw the whole screen even if only one pixel has been changed. + * With 2 buffers in flush_cb only an address change is required. + */ + LV_DISPLAY_RENDER_MODE_FULL, +} lv_display_render_mode_t; + +typedef enum { + LV_SCREEN_LOAD_ANIM_NONE, + LV_SCREEN_LOAD_ANIM_OVER_LEFT, + LV_SCREEN_LOAD_ANIM_OVER_RIGHT, + LV_SCREEN_LOAD_ANIM_OVER_TOP, + LV_SCREEN_LOAD_ANIM_OVER_BOTTOM, + LV_SCREEN_LOAD_ANIM_MOVE_LEFT, + LV_SCREEN_LOAD_ANIM_MOVE_RIGHT, + LV_SCREEN_LOAD_ANIM_MOVE_TOP, + LV_SCREEN_LOAD_ANIM_MOVE_BOTTOM, + LV_SCREEN_LOAD_ANIM_FADE_IN, + LV_SCREEN_LOAD_ANIM_FADE_ON = LV_SCREEN_LOAD_ANIM_FADE_IN, /*For backward compatibility*/ + LV_SCREEN_LOAD_ANIM_FADE_OUT, + LV_SCREEN_LOAD_ANIM_OUT_LEFT, + LV_SCREEN_LOAD_ANIM_OUT_RIGHT, + LV_SCREEN_LOAD_ANIM_OUT_TOP, + LV_SCREEN_LOAD_ANIM_OUT_BOTTOM, +} lv_screen_load_anim_t; + +typedef void (*lv_display_flush_cb_t)(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +typedef void (*lv_display_flush_wait_cb_t)(lv_display_t * disp); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a new display with the given resolution + * @param hor_res horizontal resolution in pixels + * @param ver_res vertical resolution in pixels + * @return pointer to a display object or `NULL` on error + */ +lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res); + +/** + * Remove a display + * @param disp pointer to display + */ +void lv_display_delete(lv_display_t * disp); + +/** + * Set a default display. The new screens will be created on it by default. + * @param disp pointer to a display + */ +void lv_display_set_default(lv_display_t * disp); + +/** + * Get the default display + * @return pointer to the default display + */ +lv_display_t * lv_display_get_default(void); + +/** + * Get the next display. + * @param disp pointer to the current display. NULL to initialize. + * @return the next display or NULL if no more. Gives the first display when the parameter is NULL. + */ +lv_display_t * lv_display_get_next(lv_display_t * disp); + +/*--------------------- + * RESOLUTION + *--------------------*/ + +/** + * Sets the resolution of a display. `LV_EVENT_RESOLUTION_CHANGED` event will be sent. + * Here the native resolution of the device should be set. If the display will be rotated later with + * `lv_display_set_rotation` LVGL will swap the hor. and ver. resolution automatically. + * @param disp pointer to a display + * @param hor_res the new horizontal resolution + * @param ver_res the new vertical resolution + */ +void lv_display_set_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res); + +/** + * It's not mandatory to use the whole display for LVGL, however in some cases physical resolution is important. + * For example the touchpad still sees whole resolution and the values needs to be converted + * to the active LVGL display area. + * @param disp pointer to a display + * @param hor_res the new physical horizontal resolution, or -1 to assume it's the same as the normal hor. res. + * @param ver_res the new physical vertical resolution, or -1 to assume it's the same as the normal hor. res. + */ +void lv_display_set_physical_resolution(lv_display_t * disp, int32_t hor_res, int32_t ver_res); + +/** + * If physical resolution is not the same as the normal resolution + * the offset of the active display area can be set here. + * @param disp pointer to a display + * @param x X offset + * @param y Y offset + */ +void lv_display_set_offset(lv_display_t * disp, int32_t x, int32_t y); + +/** + * Set the rotation of this display. LVGL will swap the horizontal and vertical resolutions internally. + * @param disp pointer to a display (NULL to use the default display) + * @param rotation `LV_DISPLAY_ROTATION_0/90/180/270` + */ +void lv_display_set_rotation(lv_display_t * disp, lv_display_rotation_t rotation); + +/** + * Use matrix rotation for the display. This function is depended on `LV_DRAW_TRANSFORM_USE_MATRIX` + * @param disp pointer to a display (NULL to use the default display) + * @param enable true: enable matrix rotation, false: disable + */ +void lv_display_set_matrix_rotation(lv_display_t * disp, bool enable); + +/** + * Set the DPI (dot per inch) of the display. + * dpi = sqrt(hor_res^2 + ver_res^2) / diagonal" + * @param disp pointer to a display + * @param dpi the new DPI + */ +void lv_display_set_dpi(lv_display_t * disp, int32_t dpi); + +/** + * Get the horizontal resolution of a display. + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal resolution of the display. + */ +int32_t lv_display_get_horizontal_resolution(const lv_display_t * disp); + +/** + * Get the vertical resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the vertical resolution of the display + */ +int32_t lv_display_get_vertical_resolution(const lv_display_t * disp); + +/** + * Get the original horizontal resolution of a display without considering rotation + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal resolution of the display. + */ +int32_t lv_display_get_original_horizontal_resolution(const lv_display_t * disp); + +/** + * Get the original vertical resolution of a display without considering rotation + * @param disp pointer to a display (NULL to use the default display) + * @return the vertical resolution of the display + */ +int32_t lv_display_get_original_vertical_resolution(const lv_display_t * disp); + +/** + * Get the physical horizontal resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the physical horizontal resolution of the display + */ +int32_t lv_display_get_physical_horizontal_resolution(const lv_display_t * disp); + +/** + * Get the physical vertical resolution of a display + * @param disp pointer to a display (NULL to use the default display) + * @return the physical vertical resolution of the display + */ +int32_t lv_display_get_physical_vertical_resolution(const lv_display_t * disp); + +/** + * Get the horizontal offset from the full / physical display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal offset from the physical display + */ +int32_t lv_display_get_offset_x(const lv_display_t * disp); + +/** + * Get the vertical offset from the full / physical display + * @param disp pointer to a display (NULL to use the default display) + * @return the horizontal offset from the physical display + */ +int32_t lv_display_get_offset_y(const lv_display_t * disp); + +/** + * Get the current rotation of this display. + * @param disp pointer to a display (NULL to use the default display) + * @return the current rotation + */ +lv_display_rotation_t lv_display_get_rotation(lv_display_t * disp); + +/** + * Get if matrix rotation is enabled for a display or not + * @param disp pointer to a display (NULL to use the default display) + * @return true: matrix rotation is enabled; false: disabled + */ +bool lv_display_get_matrix_rotation(lv_display_t * disp); + +/** + * Get the DPI of the display + * @param disp pointer to a display (NULL to use the default display) + * @return dpi of the display + */ +int32_t lv_display_get_dpi(const lv_display_t * disp); + +/*--------------------- + * BUFFERING + *--------------------*/ + +/** + * Set the buffers for a display, similarly to `lv_display_set_draw_buffers`, but accept the raw buffer pointers. + * For DIRECT/FULL rending modes, the buffer size must be at least + * `hor_res * ver_res * lv_color_format_get_size(lv_display_get_color_format(disp))` + * @param disp pointer to a display + * @param buf1 first buffer + * @param buf2 second buffer (can be `NULL`) + * @param buf_size buffer size in byte + * @param render_mode LV_DISPLAY_RENDER_MODE_PARTIAL/DIRECT/FULL + */ +void lv_display_set_buffers(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size, + lv_display_render_mode_t render_mode); + +/** + * Set the frame buffers for a display, similarly to `lv_display_set_buffers`, but allow + * for a custom stride as required by a display controller. + * This allows the frame buffers to have a stride alignment different from the rest of + * the buffers` + * @param disp pointer to a display + * @param buf1 first buffer + * @param buf2 second buffer (can be `NULL`) + * @param buf_size buffer size in byte + * @param stride buffer stride in bytes + * @param render_mode LV_DISPLAY_RENDER_MODE_PARTIAL/DIRECT/FULL + */ +void lv_display_set_buffers_with_stride(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size, + uint32_t stride, lv_display_render_mode_t render_mode); + +/** + * Set the buffers for a display, accept a draw buffer pointer. + * Normally use `lv_display_set_buffers` is enough for most cases. + * Use this function when an existing lv_draw_buf_t is available. + * @param disp pointer to a display + * @param buf1 first buffer + * @param buf2 second buffer (can be `NULL`) + */ +void lv_display_set_draw_buffers(lv_display_t * disp, lv_draw_buf_t * buf1, lv_draw_buf_t * buf2); + +/** + * Set the third draw buffer for a display. + * @param disp pointer to a display + * @param buf3 third buffer + */ +void lv_display_set_3rd_draw_buffer(lv_display_t * disp, lv_draw_buf_t * buf3); + +/** + * Set display render mode + * @param disp pointer to a display + * @param render_mode LV_DISPLAY_RENDER_MODE_PARTIAL/DIRECT/FULL + */ +void lv_display_set_render_mode(lv_display_t * disp, lv_display_render_mode_t render_mode); + +/** + * Set the flush callback which will be called to copy the rendered image to the display. + * @param disp pointer to a display + * @param flush_cb the flush callback (`px_map` contains the rendered image as raw pixel map and it should be copied to `area` on the display) + */ +void lv_display_set_flush_cb(lv_display_t * disp, lv_display_flush_cb_t flush_cb); + +/** + * Set a callback to be used while LVGL is waiting flushing to be finished. + * It can do any complex logic to wait, including semaphores, mutexes, polling flags, etc. + * If not set the `disp->flushing` flag is used which can be cleared with `lv_display_flush_ready()` + * @param disp pointer to a display + * @param wait_cb a callback to call while LVGL is waiting for flush ready. + * If NULL `lv_display_flush_ready()` can be used to signal that flushing is ready. + */ +void lv_display_set_flush_wait_cb(lv_display_t * disp, lv_display_flush_wait_cb_t wait_cb); + +/** + * Set the color format of the display. + * @param disp pointer to a display + * @param color_format Possible values are + * - LV_COLOR_FORMAT_RGB565 + * - LV_COLOR_FORMAT_RGB888 + * - LV_COLOR_FORMAT_XRGB888 + * - LV_COLOR_FORMAT_ARGB888 + *@note To change the endianness of the rendered image in case of RGB565 format + * (i.e. swap the 2 bytes) call `lv_draw_sw_rgb565_swap` in the flush_cb + */ +void lv_display_set_color_format(lv_display_t * disp, lv_color_format_t color_format); + +/** + * Get the color format of the display + * @param disp pointer to a display + * @return the color format + */ +lv_color_format_t lv_display_get_color_format(lv_display_t * disp); + +/** + * Set the number of tiles for parallel rendering. + * @param disp pointer to a display + * @param tile_cnt number of tiles (1 =< tile_cnt < 256) + */ +void lv_display_set_tile_cnt(lv_display_t * disp, uint32_t tile_cnt); + +/** + * Get the number of tiles used for parallel rendering + * @param disp pointer to a display + * @return number of tiles + */ +uint32_t lv_display_get_tile_cnt(lv_display_t * disp); + +/** + * Disabling anti-aliasing is not supported since v9. This function will be removed. + * Enable anti-aliasing for the render engine + * @param disp pointer to a display + * @param en true/false + */ +void lv_display_set_antialiasing(lv_display_t * disp, bool en); + +/** + * Get if anti-aliasing is enabled for a display or not + * @param disp pointer to a display (NULL to use the default display) + * @return true/false + */ +bool lv_display_get_antialiasing(lv_display_t * disp); + +/** + * Call from the display driver when the flushing is finished + * @param disp pointer to display whose `flush_cb` was called + */ +LV_ATTRIBUTE_FLUSH_READY void lv_display_flush_ready(lv_display_t * disp); + +/** + * Tell if it's the last area of the refreshing process. + * Can be called from `flush_cb` to execute some special display refreshing if needed when all areas area flushed. + * @param disp pointer to display + * @return true: it's the last area to flush; + * false: there are other areas too which will be refreshed soon + */ +LV_ATTRIBUTE_FLUSH_READY bool lv_display_flush_is_last(lv_display_t * disp); + +bool lv_display_is_double_buffered(lv_display_t * disp); + +/** + * Get display render mode + * @param disp pointer to a display + * @return display's render mode (LV_DISPLAY_RENDER_MODE_PARTIAL/DIRECT/FULL) + */ +lv_display_render_mode_t lv_display_get_render_mode(lv_display_t * disp); + +/*--------------------- + * SCREENS + *--------------------*/ + +/** + * Return a pointer to the active screen on a display + * @param disp pointer to display which active screen should be get. + * (NULL to use the default screen) + * @return pointer to the active screen object (loaded by 'lv_screen_load()') + */ +lv_obj_t * lv_display_get_screen_active(lv_display_t * disp); + +/** + * Return with a pointer to the previous screen. Only used during screen transitions. + * @param disp pointer to display which previous screen should be get. + * (NULL to use the default screen) + * @return pointer to the previous screen object or NULL if not used now + */ +lv_obj_t * lv_display_get_screen_prev(lv_display_t * disp); + +/** + * Return the screen that is currently being loaded by the display + * @param disp pointer to a display object (NULL to use the default screen) + * @return pointer to the screen being loaded or NULL if no screen is currently being loaded + */ +lv_obj_t * lv_display_get_screen_loading(lv_display_t * disp); + +/** + * Return the top layer. The top layer is the same on all screens and it is above the normal screen layer. + * @param disp pointer to display which top layer should be get. (NULL to use the default screen) + * @return pointer to the top layer object + */ +lv_obj_t * lv_display_get_layer_top(lv_display_t * disp); + +/** + * Return the sys. layer. The system layer is the same on all screen and it is above the normal screen and the top layer. + * @param disp pointer to display which sys. layer should be retrieved. (NULL to use the default screen) + * @return pointer to the sys layer object + */ +lv_obj_t * lv_display_get_layer_sys(lv_display_t * disp); + +/** + * Return the bottom layer. The bottom layer is the same on all screen and it is under the normal screen layer. + * It's visible only if the screen is transparent. + * @param disp pointer to display (NULL to use the default screen) + * @return pointer to the bottom layer object + */ +lv_obj_t * lv_display_get_layer_bottom(lv_display_t * disp); + + +#if LV_USE_OBJ_NAME + +/** + * Get screen by its name on a display. The name should be set by + * `lv_obj_set_name()` or `lv_obj_set_name_static()`. + * @param disp pointer to a display or NULL to use default display + * @param screen_name name of the screen to get + * @return pointer to the screen, or NULL if not found. + */ +lv_obj_t * lv_display_get_screen_by_name(const lv_display_t * disp, const char * screen_name); + +#endif /*LV_USE_OBJ_NAME*/ + +/** + * Load a screen on the default display + * @param scr pointer to a screen + */ +void lv_screen_load(struct _lv_obj_t * scr); + +/** + * Switch screen with animation + * @param scr pointer to the new screen to load + * @param anim_type type of the animation from `lv_screen_load_anim_t`, e.g. `LV_SCREEN_LOAD_ANIM_MOVE_LEFT` + * @param time time of the animation + * @param delay delay before the transition + * @param auto_del true: automatically delete the old screen + */ +void lv_screen_load_anim(lv_obj_t * scr, lv_screen_load_anim_t anim_type, uint32_t time, uint32_t delay, + bool auto_del); + +/** + * Get the active screen of the default display + * @return pointer to the active screen + */ +lv_obj_t * lv_screen_active(void); + +/** + * Get the top layer of the default display + * @return pointer to the top layer + */ +lv_obj_t * lv_layer_top(void); + +/** + * Get the system layer of the default display + * @return pointer to the sys layer + */ +lv_obj_t * lv_layer_sys(void); + +/** + * Get the bottom layer of the default display + * @return pointer to the bottom layer + */ +lv_obj_t * lv_layer_bottom(void); + +/*--------------------- + * OTHERS + *--------------------*/ + +/** + * Add an event handler to the display + * @param disp pointer to a display + * @param event_cb an event callback + * @param filter event code to react or `LV_EVENT_ALL` + * @param user_data optional user_data + */ +void lv_display_add_event_cb(lv_display_t * disp, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); + +/** + * Get the number of event attached to a display + * @param disp pointer to a display + * @return number of events + */ +uint32_t lv_display_get_event_count(lv_display_t * disp); + +/** + * Get an event descriptor for an event + * @param disp pointer to a display + * @param index the index of the event + * @return the event descriptor + */ +lv_event_dsc_t * lv_display_get_event_dsc(lv_display_t * disp, uint32_t index); + +/** + * Remove an event + * @param disp pointer to a display + * @param index the index of the event to remove + * @return true: and event was removed; false: no event was removed + */ +bool lv_display_delete_event(lv_display_t * disp, uint32_t index); + +/** + * Remove an event_cb with user_data + * @param disp pointer to a display + * @param event_cb the event_cb of the event to remove + * @param user_data user_data + * @return the count of the event removed + */ +uint32_t lv_display_remove_event_cb_with_user_data(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data); + +/** + * Send an event to a display + * @param disp pointer to a display + * @param code an event code. LV_EVENT_... + * @param param optional param + * @return LV_RESULT_OK: disp wasn't deleted in the event. + */ +lv_result_t lv_display_send_event(lv_display_t * disp, lv_event_code_t code, void * param); + +/** + * Get the area to be invalidated. Can be used in `LV_EVENT_INVALIDATE_AREA` + * @param e pointer to an event + * @return the area to invalidated (can be modified as required) + */ +lv_area_t * lv_event_get_invalidated_area(lv_event_t * e); + +/** + * Set the theme of a display. If there are no user created widgets yet the screens' theme will be updated + * @param disp pointer to a display + * @param th pointer to a theme + */ +void lv_display_set_theme(lv_display_t * disp, lv_theme_t * th); + +/** + * Get the theme of a display + * @param disp pointer to a display + * @return the display's theme (can be NULL) + */ +lv_theme_t * lv_display_get_theme(lv_display_t * disp); + +/** + * Get elapsed time since last user activity on a display (e.g. click) + * @param disp pointer to a display (NULL to get the overall smallest inactivity) + * @return elapsed ticks (milliseconds) since the last activity + */ +uint32_t lv_display_get_inactive_time(const lv_display_t * disp); + +/** + * Manually trigger an activity on a display + * @param disp pointer to a display (NULL to use the default display) + */ +void lv_display_trigger_activity(lv_display_t * disp); + +/** + * Temporarily enable and disable the invalidation of the display. + * @param disp pointer to a display (NULL to use the default display) + * @param en true: enable invalidation; false: invalidation + */ +void lv_display_enable_invalidation(lv_display_t * disp, bool en); + +/** + * Get display invalidation is enabled. + * @param disp pointer to a display (NULL to use the default display) + * @return return true if invalidation is enabled + */ +bool lv_display_is_invalidation_enabled(lv_display_t * disp); + +/** + * Get a pointer to the screen refresher timer to + * modify its parameters with `lv_timer_...` functions. + * @param disp pointer to a display + * @return pointer to the display refresher timer. (NULL on error) + */ +lv_timer_t * lv_display_get_refr_timer(lv_display_t * disp); + +/** + * Delete screen refresher timer + * @param disp pointer to a display + */ +void lv_display_delete_refr_timer(lv_display_t * disp); + +/** + * Register vsync event of a display. `LV_EVENT_VSYNC` event will be sent periodically. + * Please don't use it in display event listeners, as it may cause memory leaks and illegal access issues. + * + * @param disp pointer to a display + * @param event_cb an event callback + * @param user_data optional user_data + */ +bool lv_display_register_vsync_event(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data); + +/** + * Unregister vsync event of a display. `LV_EVENT_VSYNC` event won't be sent periodically. + * Please don't use it in display event listeners, as it may cause memory leaks and illegal access issues. + * @param disp pointer to a display + * @param event_cb an event callback + * @param user_data optional user_data + */ +bool lv_display_unregister_vsync_event(lv_display_t * disp, lv_event_cb_t event_cb, void * user_data); + +/** + * Send an vsync event to a display + * @param disp pointer to a display + * @param param optional param + * @return LV_RESULT_OK: disp wasn't deleted in the event. + */ +lv_result_t lv_display_send_vsync_event(lv_display_t * disp, void * param); + +void lv_display_set_user_data(lv_display_t * disp, void * user_data); +void lv_display_set_driver_data(lv_display_t * disp, void * driver_data); +void * lv_display_get_user_data(lv_display_t * disp); +void * lv_display_get_driver_data(lv_display_t * disp); +lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp); + +/** + * Rotate an area in-place according to the display's rotation + * @param disp pointer to a display + * @param area pointer to an area to rotate + */ +void lv_display_rotate_area(lv_display_t * disp, lv_area_t * area); + +/** + * Rotate a point in-place according to the display's rotation + * @param disp pointer to a display + * @param point pointer to a point to rotate + */ +void lv_display_rotate_point(lv_display_t * disp, lv_point_t * point); + +/** + * Get the size of the draw buffers + * @param disp pointer to a display + * @return the size of the draw buffer in bytes for valid display, 0 otherwise + */ +uint32_t lv_display_get_draw_buf_size(lv_display_t * disp); + +/** + * Get the size of the invalidated draw buffer. Can be used in the flush callback + * to get the number of bytes used in the current render buffer. + * @param disp pointer to a display + * @param width the width of the invalidated area + * @param height the height of the invalidated area + * @return the size of the invalidated draw buffer in bytes, not accounting for + * any preceding palette information for a valid display, 0 otherwise + */ +uint32_t lv_display_get_invalidated_draw_buf_size(lv_display_t * disp, uint32_t width, uint32_t height); + +/********************** + * MACROS + **********************/ + +/*------------------------------------------------ + * To improve backward compatibility + * Recommended only if you have one display + *------------------------------------------------*/ + +#ifndef LV_HOR_RES +/** + * The horizontal resolution of the currently active display. + */ +#define LV_HOR_RES lv_display_get_horizontal_resolution(lv_display_get_default()) +#endif + +#ifndef LV_VER_RES +/** + * The vertical resolution of the currently active display. + */ +#define LV_VER_RES lv_display_get_vertical_resolution(lv_display_get_default()) +#endif + +/** + * See `lv_dpx()` and `lv_display_dpx()`. + * Same as Android's DIP. (Different name is chosen to avoid mistype between LV_DPI and LV_DIP) + * + * - 40 dip is 40 px on a 160 DPI screen (distance = 1/4 inch). + * - 40 dip is 80 px on a 320 DPI screen (distance still = 1/4 inch). + * + * @sa https://stackoverflow.com/questions/2025282/what-is-the-difference-between-px-dip-dp-and-sp + */ +#define LV_DPX_CALC(dpi, n) ((n) == 0 ? 0 :LV_MAX((( (dpi) * (n) + 80) / 160), 1)) /*+80 for rounding*/ +#define LV_DPX(n) LV_DPX_CALC(lv_display_get_dpi(NULL), n) + +/** + * For default display, computes the number of pixels (a distance or size) as if the + * display had 160 DPI. This allows you to specify 1/160-th fractions of an inch to + * get real distance on the display that will be consistent regardless of its current + * DPI. It ensures `lv_dpx(100)`, for example, will have the same physical size + * regardless to the DPI of the display. + * @param n number of 1/160-th-inch units to compute with + * @return number of pixels to use to make that distance + */ +int32_t lv_dpx(int32_t n); + +/** + * For specified display, computes the number of pixels (a distance or size) as if the + * display had 160 DPI. This allows you to specify 1/160-th fractions of an inch to + * get real distance on the display that will be consistent regardless of its current + * DPI. It ensures `lv_dpx(100)`, for example, will have the same physical size + * regardless to the DPI of the display. + * @param disp pointer to display whose dpi should be considered + * @param n number of 1/160-th-inch units to compute with + * @return number of pixels to use to make that distance + */ +int32_t lv_display_dpx(const lv_display_t * disp, int32_t n); + +#if LV_USE_EXT_DATA +/** + * @brief Attaches external user data and destructor callback to a display + * + * Associates custom user data with an LVGL display and specifies a destructor function + * that will be automatically invoked when the display is deleted to properly clean up + * the associated resources. + * + * @param disp Pointer to a display + * @param data User-defined data pointer to associate with the display + * @param free_cb Callback function for cleaning up data when display is deleted. + * Receives data as parameter. NULL means no cleanup required. + */ +void lv_display_set_external_data(lv_display_t * disp, void * data, void (* free_cb)(void * data)); +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DISPLAY_H*/ diff --git a/inc/lvgl/src/display/lv_display_private.h b/inc/lvgl/src/display/lv_display_private.h new file mode 100644 index 0000000..1e4723d --- /dev/null +++ b/inc/lvgl/src/display/lv_display_private.h @@ -0,0 +1,191 @@ +/** + * @file lv_display_private.h + * + */ + +#ifndef LV_DISPLAY_PRIVATE_H +#define LV_DISPLAY_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_ext_data.h" +#include "../misc/lv_types.h" +#include "../core/lv_obj.h" +#include "../draw/lv_draw.h" +#include "lv_display.h" + +#if LV_USE_SYSMON +#include "../debugging/sysmon/lv_sysmon_private.h" +#endif + +/********************* + * DEFINES + *********************/ +#ifndef LV_INV_BUF_SIZE +#define LV_INV_BUF_SIZE 32 /**< Buffer size for invalid areas */ +#endif + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_display_t { +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif + /*--------------------- + * Resolution + *--------------------*/ + + /** Horizontal resolution.*/ + int32_t hor_res; + + /** Vertical resolution.*/ + int32_t ver_res; + + /** Horizontal resolution of the full / physical display. Set to -1 for fullscreen mode.*/ + int32_t physical_hor_res; + + /** Vertical resolution of the full / physical display. Set to -1 for fullscreen mode.*/ + int32_t physical_ver_res; + + /** Horizontal offset from the full / physical display. Set to 0 for fullscreen mode.*/ + int32_t offset_x; + + /** Vertical offset from the full / physical display. Set to 0 for fullscreen mode.*/ + int32_t offset_y; + + /** DPI (dot per inch) of the display. Default value is `LV_DPI_DEF`.*/ + uint32_t dpi; + + /*--------------------- + * Buffering + *--------------------*/ + lv_draw_buf_t * buf_1; + lv_draw_buf_t * buf_2; + lv_draw_buf_t * buf_3; + + /** Internal, used by the library*/ + lv_draw_buf_t * buf_act; + + /** MANDATORY: Write the internal buffer (draw_buf) to the display. 'lv_display_flush_ready()' has to be + * called when finished*/ + lv_display_flush_cb_t flush_cb; + + /** + * Used to wait while flushing is ready. + * It can do any complex logic to wait, including semaphores, mutexes, polling flags, etc. + * If not set `flushing` flag is used which can be cleared with `lv_display_flush_ready()` */ + lv_display_flush_wait_cb_t flush_wait_cb; + + /** 1: flushing is in progress. (It can't be a bit field because when it's cleared from IRQ + * Read-Modify-Write issue might occur) */ + volatile int flushing; + + /** 1: It was the last chunk to flush. (It can't be a bit field because when it's cleared + * from IRQ Read-Modify-Write issue might occur) */ + volatile int flushing_last; + volatile uint32_t last_area : 1; /**< 1: last area is being rendered */ + volatile uint32_t last_part : 1; /**< 1: last part of the current area is being rendered */ + + lv_display_render_mode_t render_mode; + uint32_t antialiasing : 1; /**< 1: anti-aliasing is enabled on this display.*/ + uint32_t tile_cnt : 8; /**< Divide the display buffer into these number of tiles */ + uint32_t stride_is_auto : 1; /**< 1: The stride of the buffers was not set explicitly. */ + + + /** 1: The current screen rendering is in progress*/ + uint32_t rendering_in_progress : 1; + + lv_color_format_t color_format; + + /** Invalidated (marked to redraw) areas*/ + lv_area_t inv_areas[LV_INV_BUF_SIZE]; + uint8_t inv_area_joined[LV_INV_BUF_SIZE]; + uint32_t inv_p; + int32_t inv_en_cnt; + + /** Double buffer sync areas (redrawn during last refresh) */ + lv_ll_t sync_areas; + + lv_draw_buf_t _static_buf1; /**< Used when user pass in a raw buffer as display draw buffer */ + lv_draw_buf_t _static_buf2; + /*--------------------- + * Layer + *--------------------*/ + lv_layer_t * layer_head; + void (*layer_init)(lv_display_t * disp, lv_layer_t * layer); + void (*layer_deinit)(lv_display_t * disp, lv_layer_t * layer); + + /*--------------------- + * Screens + *--------------------*/ + + /** Screens of the display*/ + lv_obj_t ** screens; /**< Array of screen objects.*/ + lv_obj_t * sys_layer; /**< @see lv_display_get_layer_sys*/ + lv_obj_t * top_layer; /**< @see lv_display_get_layer_top*/ + lv_obj_t * act_scr; /**< Currently active screen on this display*/ + lv_obj_t * bottom_layer;/**< @see lv_display_get_layer_bottom*/ + lv_obj_t * prev_scr; /**< Previous screen. Used during screen animations*/ + lv_obj_t * scr_to_load; /**< The screen prepared to load in lv_screen_load_anim*/ + uint32_t screen_cnt; + uint8_t draw_prev_over_act : 1;/** 1: Draw previous screen over active screen*/ + uint8_t del_prev : 1; /** 1: Automatically delete the previous screen when the screen load animation is ready*/ + + /*--------------------- + * Others + *--------------------*/ + + void * driver_data; /**< Custom user data*/ + + void * user_data; /**< Custom user data*/ + + lv_event_list_t event_list; + + uint32_t rotation : 3; /**< Element of lv_display_rotation_t*/ + + uint32_t matrix_rotation : 1; /**< 1: Use matrix for display rotation*/ + + lv_theme_t * theme; /**< The theme assigned to the screen*/ + + /** A timer which periodically checks the dirty areas and refreshes them*/ + lv_timer_t * refr_timer; + + /*Miscellaneous data*/ + uint32_t last_activity_time; /**< Last time when there was activity on this display*/ + + /** The area being refreshed*/ + lv_area_t refreshed_area; + uint32_t vsync_count; + +#if LV_USE_PERF_MONITOR + lv_obj_t * perf_label; + lv_sysmon_backend_data_t perf_sysmon_backend; + lv_sysmon_perf_info_t perf_sysmon_info; +#endif + +#if LV_USE_MEM_MONITOR + lv_obj_t * mem_label; +#endif + +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DISPLAY_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/convert/helium/lv_draw_buf_convert_helium.c b/inc/lvgl/src/draw/convert/helium/lv_draw_buf_convert_helium.c new file mode 100644 index 0000000..ff5b8cd --- /dev/null +++ b/inc/lvgl/src/draw/convert/helium/lv_draw_buf_convert_helium.c @@ -0,0 +1,100 @@ +/** + * @file lv_draw_buf_convert_helium.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM +#include "lv_draw_buf_convert_helium.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t _lv_draw_buf_convert_premultiply_indexed_helium(lv_draw_buf_t * buf) +{ + lv_draw_buf_t palette_draw_buf; + + LV_ASSERT_NULL(buf); + + if(!LV_COLOR_FORMAT_IS_INDEXED(buf->header.cf)) { + LV_LOG_WARN("Unsupported color format : %d", buf->header.cf); + return LV_RESULT_INVALID; + } + + lv_memcpy(&palette_draw_buf, buf, sizeof(lv_draw_buf_t)); + + palette_draw_buf.header.w = LV_COLOR_INDEXED_PALETTE_SIZE(buf->header.cf); + palette_draw_buf.header.h = 1; + palette_draw_buf.header.cf = LV_COLOR_FORMAT_ARGB8888; + palette_draw_buf.header.stride = 4 * palette_draw_buf.header.w; + + return _lv_draw_buf_convert_premultiply_argb8888_helium(&palette_draw_buf); +} + +lv_result_t _lv_draw_buf_convert_premultiply_argb8888_helium(lv_draw_buf_t * buf) +{ + LV_ASSERT_NULL(buf); + + uint32_t h = buf->header.h; + uint32_t w = buf->header.w; + uint32_t stride = buf->header.stride; + uint8_t * data = (uint8_t *)buf->data; + + if(buf->header.cf != LV_COLOR_FORMAT_ARGB8888) { + LV_LOG_WARN("Unsupported color format : %d", buf->header.cf); + return LV_RESULT_INVALID; + } + + __asm volatile( + " .p2align 2 \n" + " 1: \n" + " mov r0, %[pSource] \n" + " mov r1, %[pTarget] \n" + " wlstp.8 lr, %[w], 3f \n" + " 2: \n" + " vld40.u8 {q0, q1, q2, q3}, [r0] \n" + " vld41.u8 {q0, q1, q2, q3}, [r0] \n" + " vld42.u8 {q0, q1, q2, q3}, [r0] \n" + " vld43.u8 {q0, q1, q2, q3}, [r0]! \n" + " vrmulh.u8 q0, q0, q3 \n" + " vrmulh.u8 q1, q1, q3 \n" + " vrmulh.u8 q2, q2, q3 \n" + " vst40.u8 {q0, q1, q2, q3}, [r1] \n" + " vst41.u8 {q0, q1, q2, q3}, [r1] \n" + " vst42.u8 {q0, q1, q2, q3}, [r1] \n" + " vst43.u8 {q0, q1, q2, q3}, [r1]! \n" + " letp lr, 2b \n" + " 3: \n" + " adds %[pSource], %[src_stride] \n" + " adds %[pTarget], %[dst_stride] \n" + " subs %[h], #1 \n" + " bne 1b \n" + : [pSource] "+r"(data), [pTarget] "+r"(data), [h] "+r"(h) + : [w] "r"(w), [src_stride] "r"(stride), [dst_stride] "r"(stride) + : "q0", "q1", "q2", "q3", "r0", "r1", "lr", "memory"); + + return LV_RESULT_OK; +} + +#endif /* LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM */ diff --git a/inc/lvgl/src/draw/convert/helium/lv_draw_buf_convert_helium.h b/inc/lvgl/src/draw/convert/helium/lv_draw_buf_convert_helium.h new file mode 100644 index 0000000..3fb670d --- /dev/null +++ b/inc/lvgl/src/draw/convert/helium/lv_draw_buf_convert_helium.h @@ -0,0 +1,57 @@ +/** + * @file lv_draw_buf_convert_helium.h + * + */ + +#ifndef LV_DRAW_BUF_CONVERT_HELIUM_H +#define LV_DRAW_BUF_CONVERT_HELIUM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../../misc/lv_color.h" +#include "../../lv_draw_buf.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +#ifndef LV_DRAW_CONVERT_PREMULTIPLY_INDEXED +#define LV_DRAW_CONVERT_PREMULTIPLY_INDEXED(buf) \ + _lv_draw_buf_convert_premultiply_indexed_helium(buf) +#endif + +#ifndef LV_DRAW_CONVERT_PREMULTIPLY_ARGB8888 +#define LV_DRAW_CONVERT_PREMULTIPLY_ARGB8888(buf) \ + _lv_draw_buf_convert_premultiply_argb8888_helium(buf) +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Convert indexed draw_buf to premultiplied format with helium specific optimizations + * @param buf pointer to a draw buf + */ +lv_result_t _lv_draw_buf_convert_premultiply_indexed_helium(lv_draw_buf_t * buf); + +/** + * Convert argb8888 draw_buf to premultiplied format with helium specific optimizations + * @param buf pointer to a draw buf + */ +lv_result_t _lv_draw_buf_convert_premultiply_argb8888_helium(lv_draw_buf_t * buf); + +#endif /*LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM*/ +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_DRAW_BUF_CONVERT_HELIUM_H */ diff --git a/inc/lvgl/src/draw/convert/lv_draw_buf_convert.c b/inc/lvgl/src/draw/convert/lv_draw_buf_convert.c new file mode 100644 index 0000000..7a112ab --- /dev/null +++ b/inc/lvgl/src/draw/convert/lv_draw_buf_convert.c @@ -0,0 +1,132 @@ +/** + * @file lv_draw_buf_convert.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_buf_convert.h" +#include "../../misc/lv_profiler.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_draw_buf_convert_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_draw_buf_convert_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_CONVERT_PREMULTIPLY_INDEXED + #define LV_DRAW_CONVERT_PREMULTIPLY_INDEXED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_CONVERT_PREMULTIPLY_ARGB8888 + #define LV_DRAW_CONVERT_PREMULTIPLY_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_CONVERT_PREMULTIPLY_RGB565A8 + #define LV_DRAW_CONVERT_PREMULTIPLY_RGB565A8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_CONVERT_PREMULTIPLY_ARGB8565 + #define LV_DRAW_CONVERT_PREMULTIPLY_ARGB8565(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_draw_buf_convert_premultiply(lv_draw_buf_t * draw_buf) +{ + LV_PROFILER_DRAW_BEGIN; + LV_ASSERT_NULL(draw_buf); + + /*Premultiply color with alpha, do case by case by judging color format*/ + lv_color_format_t cf = draw_buf->header.cf; + if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + if(LV_RESULT_INVALID == LV_DRAW_CONVERT_PREMULTIPLY_INDEXED(draw_buf)) { + int size = LV_COLOR_INDEXED_PALETTE_SIZE(cf); + lv_color32_t * palette = (lv_color32_t *)draw_buf->data; + for(int i = 0; i < size; i++) { + lv_color_premultiply(&palette[i]); + } + } + } + else if(cf == LV_COLOR_FORMAT_ARGB8888) { + if(LV_RESULT_INVALID == LV_DRAW_CONVERT_PREMULTIPLY_ARGB8888(draw_buf)) { + uint32_t h = draw_buf->header.h; + uint32_t w = draw_buf->header.w; + uint32_t stride = draw_buf->header.stride; + uint8_t * line = (uint8_t *)draw_buf->data; + for(uint32_t y = 0; y < h; y++) { + lv_color32_t * pixel = (lv_color32_t *)line; + for(uint32_t x = 0; x < w; x++) { + lv_color_premultiply(pixel); + pixel++; + } + line += stride; + } + } + } + else if(cf == LV_COLOR_FORMAT_RGB565A8) { + if(LV_RESULT_INVALID == LV_DRAW_CONVERT_PREMULTIPLY_RGB565A8(draw_buf)) { + uint32_t h = draw_buf->header.h; + uint32_t w = draw_buf->header.w; + uint32_t stride = draw_buf->header.stride; + uint32_t alpha_stride = stride / 2; + uint8_t * line = (uint8_t *)draw_buf->data; + lv_opa_t * alpha = (lv_opa_t *)(line + stride * h); + for(uint32_t y = 0; y < h; y++) { + lv_color16_t * pixel = (lv_color16_t *)line; + for(uint32_t x = 0; x < w; x++) { + lv_color16_premultiply(pixel, alpha[x]); + pixel++; + } + line += stride; + alpha += alpha_stride; + } + } + } + else if(cf == LV_COLOR_FORMAT_ARGB8565) { + if(LV_RESULT_INVALID == LV_DRAW_CONVERT_PREMULTIPLY_ARGB8565(draw_buf)) { + uint32_t h = draw_buf->header.h; + uint32_t w = draw_buf->header.w; + uint32_t stride = draw_buf->header.stride; + uint8_t * line = (uint8_t *)draw_buf->data; + for(uint32_t y = 0; y < h; y++) { + uint8_t * pixel = line; + for(uint32_t x = 0; x < w; x++) { + uint8_t alpha = pixel[2]; + lv_color16_premultiply((lv_color16_t *)pixel, alpha); + pixel += 3; + } + line += stride; + } + } + } + else { + LV_LOG_WARN("color format: %d not supported for premultiply", cf); + LV_PROFILER_DRAW_END; + return LV_RESULT_INVALID; + } + + LV_PROFILER_DRAW_END; + return LV_RESULT_OK; +} diff --git a/inc/lvgl/src/draw/convert/lv_draw_buf_convert.h b/inc/lvgl/src/draw/convert/lv_draw_buf_convert.h new file mode 100644 index 0000000..7f3b9c1 --- /dev/null +++ b/inc/lvgl/src/draw/convert/lv_draw_buf_convert.h @@ -0,0 +1,39 @@ +/** + * @file lv_draw_buf_convert.h + * + */ + +#ifndef LV_DRAW_BUF_CONVERT_H +#define LV_DRAW_BUF_CONVERT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../misc/lv_color.h" +#include "../lv_draw_buf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Convert draw_buf to premultiplied format + * @param buf pointer to a draw buf + */ +lv_result_t lv_draw_buf_convert_premultiply(lv_draw_buf_t * buf); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_DRAW_BUF_CONVERT_H */ diff --git a/inc/lvgl/src/draw/convert/neon/lv_draw_buf_convert_neon.c b/inc/lvgl/src/draw/convert/neon/lv_draw_buf_convert_neon.c new file mode 100644 index 0000000..991f55f --- /dev/null +++ b/inc/lvgl/src/draw/convert/neon/lv_draw_buf_convert_neon.c @@ -0,0 +1,132 @@ +/** + * @file lv_draw_buf_convert_neon.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + +#include +#include "lv_draw_buf_convert_neon.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t _lv_draw_buf_convert_premultiply_indexed_neon(lv_draw_buf_t * buf) +{ + lv_draw_buf_t palette_draw_buf; + + LV_ASSERT_NULL(buf); + + if(!LV_COLOR_FORMAT_IS_INDEXED(buf->header.cf)) { + LV_LOG_WARN("Unsupported color format : %d", buf->header.cf); + return LV_RESULT_INVALID; + } + + lv_memcpy(&palette_draw_buf, buf, sizeof(lv_draw_buf_t)); + + palette_draw_buf.header.w = LV_COLOR_INDEXED_PALETTE_SIZE(buf->header.cf); + palette_draw_buf.header.h = 1; + palette_draw_buf.header.cf = LV_COLOR_FORMAT_ARGB8888; + palette_draw_buf.header.stride = 4 * palette_draw_buf.header.w; + + return _lv_draw_buf_convert_premultiply_argb8888_neon(&palette_draw_buf); + +} + +lv_result_t _lv_draw_buf_convert_premultiply_argb8888_neon(lv_draw_buf_t * buf) +{ + LV_ASSERT_NULL(buf); + + uint32_t h = buf->header.h; + uint32_t w = buf->header.w; + uint32_t stride = buf->header.stride; + uint8_t * data = (uint8_t *)buf->data; + + if(buf->header.cf != LV_COLOR_FORMAT_ARGB8888) { + LV_LOG_WARN("Unsupported color format : %d", buf->header.cf); + return LV_RESULT_INVALID; + } + + for(uint32_t y = 0; y < h; y++) { + uint8_t * p = (uint8_t *)data; + uint32_t remaining_pixels = w; + + while(remaining_pixels >= 8) { + uint8x8x4_t rgba = vld4_u8(p); + + uint16x8_t r16 = vmovl_u8(rgba.val[0]); + uint16x8_t g16 = vmovl_u8(rgba.val[1]); + uint16x8_t b16 = vmovl_u8(rgba.val[2]); + uint16x8_t a16 = vmovl_u8(rgba.val[3]); + + rgba.val[0] = vshrn_n_u16(vmulq_u16(r16, a16), 8); + rgba.val[1] = vshrn_n_u16(vmulq_u16(g16, a16), 8); + rgba.val[2] = vshrn_n_u16(vmulq_u16(b16, a16), 8); + + vst4_u8(p, rgba); + + p += 8 * 4; + remaining_pixels -= 8; + } + + if(remaining_pixels >= 4) { + uint8x8x4_t rgba; + rgba = vld4_lane_u8(p, rgba, 0); + rgba = vld4_lane_u8(p + 4, rgba, 1); + rgba = vld4_lane_u8(p + 8, rgba, 2); + rgba = vld4_lane_u8(p + 12, rgba, 3); + + uint16x8_t r16 = vmovl_u8(rgba.val[0]); + uint16x8_t g16 = vmovl_u8(rgba.val[1]); + uint16x8_t b16 = vmovl_u8(rgba.val[2]); + uint16x8_t a16 = vmovl_u8(rgba.val[3]); + + rgba.val[0] = vshrn_n_u16(vmulq_u16(r16, a16), 8); + rgba.val[1] = vshrn_n_u16(vmulq_u16(g16, a16), 8); + rgba.val[2] = vshrn_n_u16(vmulq_u16(b16, a16), 8); + + vst4_lane_u8(p, rgba, 0); + vst4_lane_u8(p + 4, rgba, 1); + vst4_lane_u8(p + 8, rgba, 2); + vst4_lane_u8(p + 12, rgba, 3); + + p += 4 * 4; + remaining_pixels -= 4; + } + + while(remaining_pixels--) { + uint8_t a = p[3]; + p[0] = ((uint16_t)(p[0]) * a) >> 8; + p[1] = ((uint16_t)(p[1]) * a) >> 8; + p[2] = ((uint16_t)(p[2]) * a) >> 8; + p += 4; + } + + data += stride; + } + + return LV_RESULT_OK; +} +#endif /* LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON */ diff --git a/inc/lvgl/src/draw/convert/neon/lv_draw_buf_convert_neon.h b/inc/lvgl/src/draw/convert/neon/lv_draw_buf_convert_neon.h new file mode 100644 index 0000000..d97f61e --- /dev/null +++ b/inc/lvgl/src/draw/convert/neon/lv_draw_buf_convert_neon.h @@ -0,0 +1,58 @@ +/** + * @file lv_draw_buf_convert_neon.h + * + */ + +#ifndef LV_DRAW_BUF_CONVERT_NEON_H +#define LV_DRAW_BUF_CONVERT_NEON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../../misc/lv_color.h" +#include "../../lv_draw_buf.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +#ifndef LV_DRAW_CONVERT_PREMULTIPLY_INDEXED +#define LV_DRAW_CONVERT_PREMULTIPLY_INDEXED(buf) \ + _lv_draw_buf_convert_premultiply_indexed_neon(buf) +#endif + +#ifndef LV_DRAW_CONVERT_PREMULTIPLY_ARGB8888 +#define LV_DRAW_CONVERT_PREMULTIPLY_ARGB8888(buf) \ + _lv_draw_buf_convert_premultiply_argb8888_neon(buf) +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Convert indexed draw_buf to premultiplied format with neon specific optimizations + * @param buf pointer to a draw buf + */ + +lv_result_t _lv_draw_buf_convert_premultiply_indexed_neon(lv_draw_buf_t * buf); + +/** + * Convert argb8888 draw_buf to premultiplied format with neon specific optimizations + * @param buf pointer to a draw buf + */ +lv_result_t _lv_draw_buf_convert_premultiply_argb8888_neon(lv_draw_buf_t * buf); +#endif /*LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_DRAW_BUF_CONVERT_NEON_H */ diff --git a/inc/lvgl/src/draw/dma2d/lv_draw_dma2d.c b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d.c new file mode 100644 index 0000000..032e16c --- /dev/null +++ b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d.c @@ -0,0 +1,396 @@ +/** + * @file lv_draw_dma2d.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_dma2d_private.h" +#if LV_USE_DRAW_DMA2D + +#include "../sw/lv_draw_sw.h" +#include "../../misc/lv_area_private.h" + +#if !LV_DRAW_DMA2D_ASYNC && LV_USE_DRAW_DMA2D_INTERRUPT + #warning LV_USE_DRAW_DMA2D_INTERRUPT is 1 but has no effect because LV_USE_OS is LV_OS_NONE +#endif + +/********************* + * DEFINES + *********************/ + +#define DRAW_UNIT_ID_DMA2D 5 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static int32_t evaluate_cb(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); +static int32_t dispatch_cb(lv_draw_unit_t * draw_unit, lv_layer_t * layer); +static int32_t delete_cb(lv_draw_unit_t * draw_unit); +#if LV_DRAW_DMA2D_ASYNC + static int32_t wait_finish_cb(lv_draw_unit_t * u); +#endif +#if !LV_DRAW_DMA2D_ASYNC + static bool check_transfer_completion(void); +#endif +static void post_transfer_tasks(lv_draw_dma2d_unit_t * u); + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_DRAW_DMA2D_ASYNC + static lv_draw_dma2d_unit_t * g_unit; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_dma2d_init(void) +{ + lv_draw_dma2d_unit_t * draw_dma2d_unit = lv_draw_create_unit(sizeof(lv_draw_dma2d_unit_t)); + draw_dma2d_unit->base_unit.evaluate_cb = evaluate_cb; + draw_dma2d_unit->base_unit.dispatch_cb = dispatch_cb; + draw_dma2d_unit->base_unit.delete_cb = delete_cb; +#if LV_DRAW_DMA2D_ASYNC + draw_dma2d_unit->base_unit.wait_for_finish_cb = wait_finish_cb; +#endif + draw_dma2d_unit->base_unit.name = "DMA2D"; + +#if LV_DRAW_DMA2D_ASYNC + g_unit = draw_dma2d_unit; + lv_thread_sync_init(&draw_dma2d_unit->interrupt_signal); +#endif + + /* enable the DMA2D clock */ +#if defined(STM32F4) || defined(STM32F7) || defined(STM32U5) || defined(STM32L4) + RCC->AHB1ENR |= RCC_AHB1ENR_DMA2DEN; +#elif defined(STM32H7) + RCC->AHB3ENR |= RCC_AHB3ENR_DMA2DEN; +#elif defined(STM32H7RS) || defined(STM32N6) + RCC->AHB5ENR |= RCC_AHB5ENR_DMA2DEN; +#else +#warning "LVGL can't enable the clock for DMA2D" +#endif + + /* disable dead time */ + DMA2D->AMTCR = 0; + + /* enable the interrupt */ + NVIC_EnableIRQ(DMA2D_IRQn); +} + +void lv_draw_dma2d_deinit(void) +{ + /* disable the interrupt */ + NVIC_DisableIRQ(DMA2D_IRQn); + + /* disable the DMA2D clock */ +#if defined(STM32F4) || defined(STM32F7) || defined(STM32U5) || defined(STM32L4) + RCC->AHB1ENR &= ~RCC_AHB1ENR_DMA2DEN; +#elif defined(STM32H7) + RCC->AHB3ENR &= ~RCC_AHB3ENR_DMA2DEN; +#elif defined(STM32H7RS) || defined(STM32N6) + RCC->AHB5ENR &= ~RCC_AHB5ENR_DMA2DEN; +#endif + +#if LV_DRAW_DMA2D_ASYNC + lv_result_t res = lv_thread_sync_delete(&g_unit->interrupt_signal); + LV_ASSERT(res == LV_RESULT_OK); + + g_unit = NULL; +#endif +} + +#if LV_USE_DRAW_DMA2D_INTERRUPT +void lv_draw_dma2d_transfer_complete_interrupt_handler(void) +{ +#if LV_DRAW_DMA2D_ASYNC + lv_thread_sync_signal_isr(&g_unit->interrupt_signal); +#endif +} +#endif + +lv_draw_dma2d_output_cf_t lv_draw_dma2d_cf_to_dma2d_output_cf(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + return LV_DRAW_DMA2D_OUTPUT_CF_ARGB8888; + case LV_COLOR_FORMAT_RGB888: + return LV_DRAW_DMA2D_OUTPUT_CF_RGB888; + case LV_COLOR_FORMAT_RGB565: + return LV_DRAW_DMA2D_OUTPUT_CF_RGB565; + case LV_COLOR_FORMAT_ARGB1555: + return LV_DRAW_DMA2D_OUTPUT_CF_ARGB1555; + default: + LV_ASSERT_MSG(false, "unsupported output color format"); + } + return LV_DRAW_DMA2D_OUTPUT_CF_RGB565; +} + +uint32_t lv_draw_dma2d_color_to_dma2d_color(lv_draw_dma2d_output_cf_t cf, lv_color_t color) +{ + switch(cf) { + case LV_DRAW_DMA2D_OUTPUT_CF_ARGB8888: + case LV_DRAW_DMA2D_OUTPUT_CF_RGB888: + return lv_color_to_u32(color); + case LV_DRAW_DMA2D_OUTPUT_CF_RGB565: + return lv_color_to_u16(color); + default: + LV_ASSERT_MSG(false, "unsupported output color format"); + } + return 0; +} + +void lv_draw_dma2d_configure_and_start_transfer(const lv_draw_dma2d_configuration_t * conf) +{ + /* number of lines register */ + DMA2D->NLR = (conf->w << DMA2D_NLR_PL_Pos) | (conf->h << DMA2D_NLR_NL_Pos); + + /* output */ + + /* output memory address register */ + DMA2D->OMAR = (uint32_t)(uintptr_t) conf->output_address; + /* output offset register */ + DMA2D->OOR = conf->output_offset; + /* output pixel format converter control register */ + DMA2D->OPFCCR = ((uint32_t) conf->output_cf) << DMA2D_OPFCCR_CM_Pos; + + /* Fill color. Only for mode LV_DRAW_DMA2D_MODE_REGISTER_TO_MEMORY */ + DMA2D->OCOLR = conf->reg_to_mem_mode_color; + + /* foreground */ + + /* foreground memory address register */ + DMA2D->FGMAR = (uint32_t)(uintptr_t) conf->fg_address; + /* foreground offset register */ + DMA2D->FGOR = conf->fg_offset; + /* foreground color. only for mem-to-mem with blending and fixed-color foreground */ + DMA2D->FGCOLR = conf->fg_color; + /* foreground pixel format converter control register */ + DMA2D->FGPFCCR = (((uint32_t) conf->fg_cf) << DMA2D_FGPFCCR_CM_Pos) + | (conf->fg_alpha << DMA2D_FGPFCCR_ALPHA_Pos) + | (conf->fg_alpha_mode << DMA2D_FGPFCCR_AM_Pos); + + /* background */ + + DMA2D->BGMAR = (uint32_t)(uintptr_t) conf->bg_address; + DMA2D->BGOR = conf->bg_offset; + DMA2D->BGCOLR = conf->bg_color; + DMA2D->BGPFCCR = (((uint32_t) conf->bg_cf) << DMA2D_BGPFCCR_CM_Pos) + | (conf->bg_alpha << DMA2D_BGPFCCR_ALPHA_Pos) + | (conf->bg_alpha_mode << DMA2D_BGPFCCR_AM_Pos); + + /* ensure the DMA2D register values are observed before the start transfer bit is set */ + __DSB(); + + /* start the transfer (also set mode and enable transfer complete interrupt) */ + DMA2D->CR = DMA2D_CR_START | (((uint32_t) conf->mode) << DMA2D_CR_MODE_Pos) +#if LV_USE_DRAW_DMA2D_INTERRUPT + | DMA2D_CR_TCIE +#endif + ; +} + +#if LV_DRAW_DMA2D_CACHE +void lv_draw_dma2d_invalidate_cache(const lv_draw_dma2d_cache_area_t * mem_area) +{ + if(SCB->CCR & SCB_CCR_DC_Msk) { + SCB_InvalidateDCache_by_Addr((uint32_t *)mem_area->first_byte, + mem_area->stride * mem_area->height); + } +} + +void lv_draw_dma2d_clean_cache(const lv_draw_dma2d_cache_area_t * mem_area) +{ + if(SCB->CCR & SCB_CCR_DC_Msk) { + SCB_CleanDCache_by_Addr((uint32_t *)mem_area->first_byte, + mem_area->stride * mem_area->height); + } +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t evaluate_cb(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + switch(task->type) { + case LV_DRAW_TASK_TYPE_FILL: { + lv_draw_fill_dsc_t * dsc = task->draw_dsc; + if(!(dsc->radius == 0 + && dsc->grad.dir == LV_GRAD_DIR_NONE + && (dsc->base.layer->color_format == LV_COLOR_FORMAT_ARGB8888 + || dsc->base.layer->color_format == LV_COLOR_FORMAT_XRGB8888 + || dsc->base.layer->color_format == LV_COLOR_FORMAT_RGB888 + || dsc->base.layer->color_format == LV_COLOR_FORMAT_RGB565))) { + return 0; + } + } + break; + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t * dsc = task->draw_dsc; + if(!(dsc->header.cf < LV_COLOR_FORMAT_PROPRIETARY_START + && dsc->clip_radius == 0 + && dsc->bitmap_mask_src == NULL + && dsc->sup == NULL + && dsc->tile == 0 + && dsc->blend_mode == LV_BLEND_MODE_NORMAL + && dsc->recolor_opa <= LV_OPA_MIN + && dsc->skew_y == 0 + && dsc->skew_x == 0 + && dsc->scale_x == 256 + && dsc->scale_y == 256 + && dsc->rotation == 0 + && lv_image_src_get_type(dsc->src) == LV_IMAGE_SRC_VARIABLE + && (dsc->header.cf == LV_COLOR_FORMAT_ARGB8888 + || dsc->header.cf == LV_COLOR_FORMAT_XRGB8888 + || dsc->header.cf == LV_COLOR_FORMAT_RGB888 + || dsc->header.cf == LV_COLOR_FORMAT_RGB565 + || dsc->header.cf == LV_COLOR_FORMAT_ARGB1555) + && (dsc->base.layer->color_format == LV_COLOR_FORMAT_ARGB8888 + || dsc->base.layer->color_format == LV_COLOR_FORMAT_XRGB8888 + || dsc->base.layer->color_format == LV_COLOR_FORMAT_RGB888 + || dsc->base.layer->color_format == LV_COLOR_FORMAT_RGB565))) { + return 0; + } + } + break; + default: + return 0; + } + + task->preferred_draw_unit_id = DRAW_UNIT_ID_DMA2D; + task->preference_score = 0; + + return 0; +} + +static int32_t dispatch_cb(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_dma2d_unit_t * draw_dma2d_unit = (lv_draw_dma2d_unit_t *) draw_unit; + + if(draw_dma2d_unit->task_act) { +#if LV_DRAW_DMA2D_ASYNC + /*Return immediately if it's busy with draw task*/ + return LV_DRAW_UNIT_IDLE; +#else + if(!check_transfer_completion()) { + return LV_DRAW_UNIT_IDLE; + } + post_transfer_tasks(draw_dma2d_unit); +#endif + } + + lv_draw_task_t * t = lv_draw_get_available_task(layer, NULL, DRAW_UNIT_ID_DMA2D); + if(t == NULL) { + return LV_DRAW_UNIT_IDLE; + } + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) { + return LV_DRAW_UNIT_IDLE; + } + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + t->draw_unit = draw_unit; + draw_dma2d_unit->task_act = t; + + if(t->type == LV_DRAW_TASK_TYPE_FILL) { + lv_draw_fill_dsc_t * dsc = t->draw_dsc; + const lv_area_t * coords = &t->area; + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, coords, &t->clip_area)) { + return LV_DRAW_UNIT_IDLE; + } + + void * dest = lv_draw_layer_go_to_xy(layer, + clipped_coords.x1 - layer->buf_area.x1, + clipped_coords.y1 - layer->buf_area.y1); + + if(dsc->opa >= LV_OPA_MAX) { + lv_draw_dma2d_opaque_fill(t, + dest, + lv_area_get_width(&clipped_coords), + lv_area_get_height(&clipped_coords), + lv_draw_buf_width_to_stride(lv_area_get_width(&layer->buf_area), dsc->base.layer->color_format)); + } + else { + lv_draw_dma2d_fill(t, + dest, + lv_area_get_width(&clipped_coords), + lv_area_get_height(&clipped_coords), + lv_draw_buf_width_to_stride(lv_area_get_width(&layer->buf_area), dsc->base.layer->color_format)); + } + } + else if(t->type == LV_DRAW_TASK_TYPE_IMAGE) { + lv_draw_image_dsc_t * dsc = t->draw_dsc; + const lv_area_t * coords = &t->area; + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, coords, &t->clip_area)) { + return LV_DRAW_UNIT_IDLE; + } + + if(dsc->opa >= LV_OPA_MAX) { + lv_draw_dma2d_opaque_image(t, dsc, &t->area); + } + else { + lv_draw_dma2d_image(t, dsc, &t->area); + } + } + + lv_draw_dispatch_request(); + + return 1; +} + +static int32_t delete_cb(lv_draw_unit_t * draw_unit) +{ + return 0; +} + +#if LV_DRAW_DMA2D_ASYNC +static int32_t wait_finish_cb(lv_draw_unit_t * draw_unit) +{ + lv_draw_dma2d_unit_t * u = (lv_draw_dma2d_unit_t *) draw_unit; + + /* If a DMA2D task has been dispatched, wait its interrupt */ + lv_thread_sync_wait(&u->interrupt_signal); + + /* Then cleanup the DMA2D draw unit to accept a new task */ + post_transfer_tasks(u); + return 0; +} +#endif /*LV_DRAW_DMA2D_ASYNC*/ + +#if !LV_DRAW_DMA2D_ASYNC +static bool check_transfer_completion(void) +{ + return !(DMA2D->CR & DMA2D_CR_START); +} +#endif + +static void post_transfer_tasks(lv_draw_dma2d_unit_t * u) +{ +#if LV_DRAW_DMA2D_CACHE + lv_draw_dma2d_invalidate_cache(&u->writing_area); +#endif + u->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + u->task_act = NULL; +} + +#endif /*LV_USE_DRAW_DMA2D*/ diff --git a/inc/lvgl/src/draw/dma2d/lv_draw_dma2d.h b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d.h new file mode 100644 index 0000000..af175f1 --- /dev/null +++ b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d.h @@ -0,0 +1,49 @@ +/** + * @file lv_draw_dma2d.h + * + */ + +#ifndef LV_DRAW_DMA2D_H +#define LV_DRAW_DMA2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_DRAW_DMA2D + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_dma2d_init(void); +void lv_draw_dma2d_deinit(void); + +#if LV_USE_DRAW_DMA2D_INTERRUPT +void lv_draw_dma2d_transfer_complete_interrupt_handler(void); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_DMA2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_DMA2D_H*/ diff --git a/inc/lvgl/src/draw/dma2d/lv_draw_dma2d_fill.c b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d_fill.c new file mode 100644 index 0000000..d4ecdb3 --- /dev/null +++ b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d_fill.c @@ -0,0 +1,133 @@ +/** + * @file lv_draw_dma2d_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_dma2d_private.h" +#if LV_USE_DRAW_DMA2D + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_dma2d_opaque_fill(lv_draw_task_t * t, void * first_pixel, int32_t w, int32_t h, int32_t stride) +{ + lv_draw_fill_dsc_t * dsc = t->draw_dsc; + lv_color_format_t cf = dsc->base.layer->color_format; + + lv_draw_dma2d_output_cf_t output_cf = lv_draw_dma2d_cf_to_dma2d_output_cf(cf); + uint32_t cf_size = LV_COLOR_FORMAT_GET_SIZE(cf); + uint32_t reg_to_mem_color = lv_draw_dma2d_color_to_dma2d_color(output_cf, dsc->color); + +#if LV_DRAW_DMA2D_CACHE + lv_draw_dma2d_cache_area_t cache_area = { + .first_byte = first_pixel, + .width_bytes = w * cf_size, + .height = h, + .stride = stride + }; + lv_draw_dma2d_unit_t * u = (lv_draw_dma2d_unit_t *) t->draw_unit; + lv_memcpy(&u->writing_area, &cache_area, sizeof(lv_draw_dma2d_cache_area_t)); +#endif + + lv_draw_dma2d_configuration_t conf = { + .mode = LV_DRAW_DMA2D_MODE_REGISTER_TO_MEMORY, + .w = w, + .h = h, + + .output_address = first_pixel, + .output_offset = (stride / cf_size) - w, + .output_cf = output_cf, + + .reg_to_mem_mode_color = reg_to_mem_color + }; + lv_draw_dma2d_configure_and_start_transfer(&conf); +} + +void lv_draw_dma2d_fill(lv_draw_task_t * t, void * first_pixel, int32_t w, int32_t h, int32_t stride) +{ + lv_draw_fill_dsc_t * dsc = t->draw_dsc; + lv_color_t color = dsc->color; + lv_color_format_t cf = dsc->base.layer->color_format; + lv_opa_t opa = dsc->opa; + + lv_draw_dma2d_output_cf_t output_cf = lv_draw_dma2d_cf_to_dma2d_output_cf(cf); + uint32_t cf_size = LV_COLOR_FORMAT_GET_SIZE(cf); + +#if LV_DRAW_DMA2D_CACHE + lv_draw_dma2d_cache_area_t cache_area = { + .first_byte = first_pixel, + .width_bytes = w * cf_size, + .height = h, + .stride = stride + }; + lv_draw_dma2d_unit_t * u = (lv_draw_dma2d_unit_t *) t->draw_unit; + lv_memcpy(&u->writing_area, &cache_area, sizeof(lv_draw_dma2d_cache_area_t)); + + /* make sure the background area DMA2D is blending is up-to-date in main memory */ + lv_draw_dma2d_clean_cache(&cache_area); +#endif + + uint32_t output_offset = (stride / cf_size) - w; + + lv_draw_dma2d_configuration_t conf = { + .mode = LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_BLENDING, + .w = w, + .h = h, + + .output_address = first_pixel, + .output_offset = output_offset, + .output_cf = output_cf, + + .fg_color = lv_color_to_u32(color), + .fg_address = first_pixel, + .fg_offset = output_offset, + .fg_alpha_mode = LV_DRAW_DMA2D_ALPHA_MODE_REPLACE_ALPHA_CHANNEL, + .fg_alpha = opa, + .fg_cf = LV_DRAW_DMA2D_FGBG_CF_A8, + + .bg_address = first_pixel, + .bg_offset = output_offset, + .bg_alpha_mode = LV_DRAW_DMA2D_ALPHA_MODE_NO_MODIFY_IMAGE_ALPHA_CHANNEL, + .bg_alpha = opa, + .bg_cf = (lv_draw_dma2d_fgbg_cf_t) output_cf + }; + + /* Background alpha channel should be treated as 0xFF if the cf is XRGB */ + if(cf == LV_COLOR_FORMAT_XRGB8888) { + conf.bg_alpha_mode = LV_DRAW_DMA2D_ALPHA_MODE_REPLACE_ALPHA_CHANNEL; + conf.bg_alpha = 0xff; + } + + lv_draw_dma2d_configure_and_start_transfer(&conf); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_DMA2D*/ diff --git a/inc/lvgl/src/draw/dma2d/lv_draw_dma2d_img.c b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d_img.c new file mode 100644 index 0000000..bf7ad34 --- /dev/null +++ b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d_img.c @@ -0,0 +1,262 @@ +/** + * @file lv_draw_dma2d_img.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_dma2d_private.h" +#if LV_USE_DRAW_DMA2D + +#include "../lv_draw_image_private.h" +#include "../lv_image_decoder_private.h" +#include "../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_draw_dma2d_opaque_image_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +static void lv_draw_dma2d_image_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_dma2d_opaque_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + if(!draw_dsc->tile) { + lv_draw_image_normal_helper(t, draw_dsc, coords, lv_draw_dma2d_opaque_image_core, NULL); + } + else { + lv_draw_image_tiled_helper(t, draw_dsc, coords, lv_draw_dma2d_opaque_image_core, NULL); + } +} + +void lv_draw_dma2d_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + if(!draw_dsc->tile) { + lv_draw_image_normal_helper(t, draw_dsc, coords, lv_draw_dma2d_image_core, NULL); + } + else { + lv_draw_image_tiled_helper(t, draw_dsc, coords, lv_draw_dma2d_image_core, NULL); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_draw_dma2d_opaque_image_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + LV_UNUSED(sup); + LV_UNUSED(img_coords); + + lv_layer_t * layer = t->target_layer; + + void * dest_first_pixel = lv_draw_layer_go_to_xy(layer, + clipped_img_area->x1 - layer->buf_area.x1, + clipped_img_area->y1 - layer->buf_area.y1); + int32_t dest_stride = lv_draw_buf_width_to_stride(lv_area_get_width(&layer->buf_area), layer->color_format); + + int32_t w = lv_area_get_width(clipped_img_area); + int32_t h = lv_area_get_height(clipped_img_area); + + lv_color_format_t output_cf = layer->color_format; + uint32_t output_cf_size = lv_color_format_get_size(output_cf); + lv_draw_dma2d_output_cf_t output_cf_dma2d = lv_draw_dma2d_cf_to_dma2d_output_cf(output_cf); + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + const uint8_t * src_buf = decoded->data; + uint32_t image_stride = decoded->header.stride; + lv_color_format_t image_cf = decoded->header.cf; + lv_draw_dma2d_fgbg_cf_t image_cf_dma2d = (lv_draw_dma2d_fgbg_cf_t) lv_draw_dma2d_cf_to_dma2d_output_cf(image_cf); + uint32_t image_cf_size = LV_COLOR_FORMAT_GET_SIZE(image_cf); + if(image_stride == 0) image_stride = image_cf_size * decoded->header.w; + +#if LV_DRAW_DMA2D_CACHE + lv_draw_dma2d_cache_area_t dest_area = { + .first_byte = dest_first_pixel, + .width_bytes = w * output_cf_size, + .height = h, + .stride = dest_stride + }; + lv_draw_dma2d_unit_t * u = (lv_draw_dma2d_unit_t *) t->draw_unit; + lv_memcpy(&u->writing_area, &dest_area, sizeof(lv_draw_dma2d_cache_area_t)); + if(lv_color_format_has_alpha(image_cf)) { + /* make sure the background area DMA2D is blending is up-to-date in main memory */ + lv_draw_dma2d_clean_cache(&dest_area); + } +#endif + + const void * image_first_byte = src_buf + + (image_stride * (clipped_img_area->y1 - draw_dsc->image_area.y1)) + + (image_cf_size * (clipped_img_area->x1 - draw_dsc->image_area.x1)); + +#if LV_DRAW_DMA2D_CACHE + lv_draw_dma2d_cache_area_t src_area = { + .first_byte = image_first_byte, + .width_bytes = w * image_cf_size, + .height = h, + .stride = image_stride + }; + /* make sure the image area is up-to-date in main memory for DMA2D */ + lv_draw_dma2d_clean_cache(&src_area); +#endif + + uint32_t output_offset = (dest_stride / output_cf_size) - w; + lv_draw_dma2d_configuration_t conf = { + .mode = LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_PFC, + .w = w, + .h = h, + + .output_address = dest_first_pixel, + .output_offset = output_offset, + .output_cf = output_cf_dma2d, + + .fg_address = image_first_byte, + .fg_offset = (image_stride / image_cf_size) - w, + .fg_cf = image_cf_dma2d + }; + + /* only process the background if the image might be transparent */ + if(lv_color_format_has_alpha(image_cf)) { + conf.mode = LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_BLENDING; + + conf.bg_address = dest_first_pixel; + conf.bg_offset = output_offset; + conf.bg_cf = output_cf_dma2d; + } + + /* Alpha channel should be treated as 0xFF if the cf is XRGB */ + if(image_cf == LV_COLOR_FORMAT_XRGB8888) { + conf.fg_alpha_mode = LV_DRAW_DMA2D_ALPHA_MODE_REPLACE_ALPHA_CHANNEL; + conf.fg_alpha = 0xff; + } + if(output_cf == LV_COLOR_FORMAT_XRGB8888) { + conf.bg_alpha_mode = LV_DRAW_DMA2D_ALPHA_MODE_REPLACE_ALPHA_CHANNEL; + conf.bg_alpha = 0xff; + } + + lv_draw_dma2d_configure_and_start_transfer(&conf); +} + +static void lv_draw_dma2d_image_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + LV_UNUSED(sup); + LV_UNUSED(img_coords); + + lv_layer_t * layer = t->target_layer; + + void * dest_first_pixel = lv_draw_layer_go_to_xy(layer, + clipped_img_area->x1 - layer->buf_area.x1, + clipped_img_area->y1 - layer->buf_area.y1); + int32_t dest_stride = lv_draw_buf_width_to_stride(lv_area_get_width(&layer->buf_area), layer->color_format); + + int32_t w = lv_area_get_width(clipped_img_area); + int32_t h = lv_area_get_height(clipped_img_area); + + lv_color_format_t output_cf = layer->color_format; + uint32_t output_cf_size = lv_color_format_get_size(output_cf); + lv_draw_dma2d_output_cf_t output_cf_dma2d = lv_draw_dma2d_cf_to_dma2d_output_cf(output_cf); + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + const uint8_t * src_buf = decoded->data; + uint32_t image_stride = decoded->header.stride; + lv_color_format_t image_cf = decoded->header.cf; + lv_opa_t opa = draw_dsc->opa; + lv_draw_dma2d_fgbg_cf_t image_cf_dma2d = (lv_draw_dma2d_fgbg_cf_t) lv_draw_dma2d_cf_to_dma2d_output_cf(image_cf); + uint32_t image_cf_size = LV_COLOR_FORMAT_GET_SIZE(image_cf); + if(image_stride == 0) image_stride = image_cf_size * decoded->header.w; + +#if LV_DRAW_DMA2D_CACHE + lv_draw_dma2d_cache_area_t dest_area = { + .first_byte = dest_first_pixel, + .width_bytes = w * output_cf_size, + .height = h, + .stride = dest_stride + }; + lv_draw_dma2d_unit_t * u = (lv_draw_dma2d_unit_t *) t->draw_unit; + lv_memcpy(&u->writing_area, &dest_area, sizeof(lv_draw_dma2d_cache_area_t)); + /* make sure the background area DMA2D is blending is up-to-date in main memory */ + lv_draw_dma2d_clean_cache(&dest_area); +#endif + + const void * image_first_byte = src_buf + + (image_stride * (clipped_img_area->y1 - draw_dsc->image_area.y1)) + + (image_cf_size * (clipped_img_area->x1 - draw_dsc->image_area.x1)); + +#if LV_DRAW_DMA2D_CACHE + lv_draw_dma2d_cache_area_t src_area = { + .first_byte = image_first_byte, + .width_bytes = w * image_cf_size, + .height = h, + .stride = image_stride + }; + /* make sure the image area is up-to-date in main memory for DMA2D */ + lv_draw_dma2d_clean_cache(&src_area); +#endif + + uint32_t output_offset = (dest_stride / output_cf_size) - w; + lv_draw_dma2d_configuration_t conf = { + .mode = LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_BLENDING, + .w = w, + .h = h, + + .output_address = dest_first_pixel, + .output_offset = output_offset, + .output_cf = output_cf_dma2d, + + .fg_address = image_first_byte, + .fg_offset = (image_stride / image_cf_size) - w, + .fg_cf = image_cf_dma2d, + .fg_alpha_mode = LV_DRAW_DMA2D_ALPHA_MODE_MULTIPLY_IMAGE_ALPHA_CHANNEL, + .fg_alpha = opa, + + .bg_address = dest_first_pixel, + .bg_offset = output_offset, + .bg_cf = output_cf_dma2d, + }; + + /* Alpha channel should be treated as 0xFF if the cf is XRGB */ + if(image_cf == LV_COLOR_FORMAT_XRGB8888) { + conf.fg_alpha_mode = LV_DRAW_DMA2D_ALPHA_MODE_REPLACE_ALPHA_CHANNEL; + } + if(output_cf == LV_COLOR_FORMAT_XRGB8888) { + conf.bg_alpha_mode = LV_DRAW_DMA2D_ALPHA_MODE_REPLACE_ALPHA_CHANNEL; + conf.bg_alpha = 0xff; + } + + lv_draw_dma2d_configure_and_start_transfer(&conf); +} + +#endif /*LV_USE_DRAW_DMA2D*/ diff --git a/inc/lvgl/src/draw/dma2d/lv_draw_dma2d_private.h b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d_private.h new file mode 100644 index 0000000..1ba8d97 --- /dev/null +++ b/inc/lvgl/src/draw/dma2d/lv_draw_dma2d_private.h @@ -0,0 +1,155 @@ +/** + * @file lv_draw_dma2d_private.h + * + */ + +#ifndef LV_DRAW_DMA2D_PRIVATE_H +#define LV_DRAW_DMA2D_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_dma2d.h" +#if LV_USE_DRAW_DMA2D + +#include "../lv_draw_private.h" +#include "../sw/lv_draw_sw.h" +#include LV_DRAW_DMA2D_HAL_INCLUDE + +/********************* + * DEFINES + *********************/ + +#if LV_USE_DRAW_DMA2D_INTERRUPT && LV_USE_OS +#define LV_DRAW_DMA2D_ASYNC 1 +#else +#define LV_DRAW_DMA2D_ASYNC 0 +#endif + +#if defined(__CORTEX_M) && ((__CORTEX_M == 7) || (__CORTEX_M == 55)) +#define LV_DRAW_DMA2D_CACHE 1 +#else +#define LV_DRAW_DMA2D_CACHE 0 +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_DRAW_DMA2D_OUTPUT_CF_ARGB8888 = 0, + LV_DRAW_DMA2D_OUTPUT_CF_RGB888, + LV_DRAW_DMA2D_OUTPUT_CF_RGB565, + LV_DRAW_DMA2D_OUTPUT_CF_ARGB1555, + LV_DRAW_DMA2D_OUTPUT_CF_ARGB4444 +} lv_draw_dma2d_output_cf_t; + +typedef enum { + LV_DRAW_DMA2D_FGBG_CF_ARGB8888 = 0, + LV_DRAW_DMA2D_FGBG_CF_RGB888, + LV_DRAW_DMA2D_FGBG_CF_RGB565, + LV_DRAW_DMA2D_FGBG_CF_ARGB1555, + LV_DRAW_DMA2D_FGBG_CF_ARGB4444, + LV_DRAW_DMA2D_FGBG_CF_L8, + LV_DRAW_DMA2D_FGBG_CF_AL44, + LV_DRAW_DMA2D_FGBG_CF_AL88, + LV_DRAW_DMA2D_FGBG_CF_L4, + LV_DRAW_DMA2D_FGBG_CF_A8, + LV_DRAW_DMA2D_FGBG_CF_A4, + LV_DRAW_DMA2D_FGBG_CF_YCBCR +} lv_draw_dma2d_fgbg_cf_t; + +typedef enum { + LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY = 0, + LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_PFC, + LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_BLENDING, + LV_DRAW_DMA2D_MODE_REGISTER_TO_MEMORY, + LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_BLENDING_AND_FIXED_COLOR_FG, + LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_BLENDING_AND_FIXED_COLOR_BG +} lv_draw_dma2d_mode_t; + +typedef enum { + LV_DRAW_DMA2D_ALPHA_MODE_NO_MODIFY_IMAGE_ALPHA_CHANNEL = 0, + LV_DRAW_DMA2D_ALPHA_MODE_REPLACE_ALPHA_CHANNEL, + LV_DRAW_DMA2D_ALPHA_MODE_MULTIPLY_IMAGE_ALPHA_CHANNEL +} lv_draw_dma2d_alpha_mode_t; + +typedef struct { + lv_draw_dma2d_mode_t mode; + uint32_t w; + uint32_t h; + + void * output_address; + uint32_t output_offset; + lv_draw_dma2d_output_cf_t output_cf; + + uint32_t reg_to_mem_mode_color; + + const void * fg_address; + uint32_t fg_offset; + lv_draw_dma2d_fgbg_cf_t fg_cf; + uint32_t fg_color; + uint32_t fg_alpha_mode; + uint32_t fg_alpha; + + const void * bg_address; + uint32_t bg_offset; + lv_draw_dma2d_fgbg_cf_t bg_cf; + uint32_t bg_color; + uint32_t bg_alpha_mode; + uint32_t bg_alpha; + +} lv_draw_dma2d_configuration_t; + +typedef struct { + const void * first_byte; + uint32_t width_bytes; + uint32_t height; + uint32_t stride; +} lv_draw_dma2d_cache_area_t; + +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * volatile task_act; +#if LV_DRAW_DMA2D_CACHE + lv_draw_dma2d_cache_area_t writing_area; +#endif +#if LV_DRAW_DMA2D_ASYNC + lv_thread_sync_t interrupt_signal; +#endif +} lv_draw_dma2d_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_dma2d_opaque_fill(lv_draw_task_t * t, void * first_pixel, int32_t w, int32_t h, int32_t stride); +void lv_draw_dma2d_fill(lv_draw_task_t * t, void * first_pixel, int32_t w, int32_t h, int32_t stride); +void lv_draw_dma2d_opaque_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); +void lv_draw_dma2d_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); +lv_draw_dma2d_output_cf_t lv_draw_dma2d_cf_to_dma2d_output_cf(lv_color_format_t cf); +uint32_t lv_draw_dma2d_color_to_dma2d_color(lv_draw_dma2d_output_cf_t cf, lv_color_t color); +void lv_draw_dma2d_configure_and_start_transfer(const lv_draw_dma2d_configuration_t * conf); +#if LV_DRAW_DMA2D_CACHE +void lv_draw_dma2d_invalidate_cache(const lv_draw_dma2d_cache_area_t * mem_area); +void lv_draw_dma2d_clean_cache(const lv_draw_dma2d_cache_area_t * mem_area); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_DMA2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_DMA2D_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa.c b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa.c new file mode 100644 index 0000000..73b8c2f --- /dev/null +++ b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa.c @@ -0,0 +1,201 @@ +/** + * @file lv_draw_ppa.c + * + */ + +/********************* +* INCLUDES +*********************/ + +#include "lv_draw_ppa_private.h" +#include "lv_draw_ppa.h" + +#if LV_USE_PPA + +/********************* +* DEFINES +*********************/ + +#define DRAW_UNIT_ID_PPA 80 +#define DRAW_UNIT_PPA_PREF_SCORE 70 + +/********************** +* STATIC PROTOTYPES +**********************/ + +static int32_t ppa_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); +static int32_t ppa_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); +static int32_t ppa_delete(lv_draw_unit_t * draw_unit); +static void ppa_execute_drawing(lv_draw_ppa_unit_t * u); + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_ppa_init(void) +{ + esp_err_t res; + ppa_client_config_t cfg = {0}; + + /* Create draw unit */ + lv_draw_buf_ppa_init_handlers(); + lv_draw_ppa_unit_t * draw_ppa_unit = lv_draw_create_unit(sizeof(lv_draw_ppa_unit_t)); + draw_ppa_unit->base_unit.evaluate_cb = ppa_evaluate; + draw_ppa_unit->base_unit.dispatch_cb = ppa_dispatch; + draw_ppa_unit->base_unit.delete_cb = ppa_delete; + draw_ppa_unit->base_unit.name = "ESP_PPA"; + + /* Register SRM client */ + cfg.oper_type = PPA_OPERATION_SRM; + cfg.max_pending_trans_num = 1; +#if (LV_PPA_BURST_LENGTH == 128) + cfg.data_burst_length = PPA_DATA_BURST_LENGTH_128; +#elif (LV_PPA_BURST_LENGTH == 64) + cfg.data_burst_length = PPA_DATA_BURST_LENGTH_64; +#elif (LV_PPA_BURST_LENGTH == 32) + cfg.data_burst_length = PPA_DATA_BURST_LENGTH_32; +#elif (LV_PPA_BURST_LENGTH == 16) + cfg.data_burst_length = PPA_DATA_BURST_LENGTH_16; +#elif (LV_PPA_BURST_LENGTH == 8) + cfg.data_burst_length = PPA_DATA_BURST_LENGTH_8; +#else +#error "Invalid burst length selection for PPA" +#endif + + res = ppa_register_client(&cfg, &draw_ppa_unit->srm_client); + LV_ASSERT(res == ESP_OK); + + /* Register Fill client */ + cfg.oper_type = PPA_OPERATION_FILL; + res = ppa_register_client(&cfg, &draw_ppa_unit->fill_client); + LV_ASSERT(res == ESP_OK); + + /* Register Blend client */ + cfg.oper_type = PPA_OPERATION_BLEND; + + res = ppa_register_client(&cfg, &draw_ppa_unit->blend_client); + LV_ASSERT(res == ESP_OK); +} + +void lv_draw_ppa_deinit(void) +{ + /* No global deinit required */ +} + +/********************** +* STATIC FUNCTIONS +**********************/ +static int32_t ppa_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) +{ + LV_UNUSED(u); + const lv_draw_dsc_base_t * base = (lv_draw_dsc_base_t *)t->draw_dsc; + + if(!ppa_dest_cf_supported(base->layer->color_format)) return 0; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: { + const lv_draw_fill_dsc_t * dsc = (lv_draw_fill_dsc_t *)t->draw_dsc; + if((dsc->radius != 0 || dsc->grad.dir != LV_GRAD_DIR_NONE)) return 0; + if(dsc->opa <= (lv_opa_t)LV_OPA_MAX) return 0; + + if(t->preference_score > DRAW_UNIT_PPA_PREF_SCORE) { + t->preference_score = DRAW_UNIT_PPA_PREF_SCORE; + t->preferred_draw_unit_id = DRAW_UNIT_ID_PPA; + } + return 1; + } + +#if LV_USE_PPA_IMG + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t * dsc = t->draw_dsc; + if(!(dsc->header.cf < LV_COLOR_FORMAT_PROPRIETARY_START + && dsc->clip_radius == 0 + && dsc->bitmap_mask_src == NULL + && dsc->sup == NULL + && dsc->tile == 0 + && dsc->blend_mode == LV_BLEND_MODE_NORMAL + && dsc->recolor_opa <= LV_OPA_MIN + && dsc->opa <= (lv_opa_t)LV_OPA_MAX + && dsc->skew_y == 0 + && dsc->skew_x == 0 + && dsc->scale_x == 256 + && dsc->scale_y == 256 + && dsc->rotation == 0 + && lv_image_src_get_type(dsc->src) == LV_IMAGE_SRC_VARIABLE + && (dsc->header.cf == LV_COLOR_FORMAT_RGB888 + || dsc->header.cf == LV_COLOR_FORMAT_RGB565) + && (dsc->base.layer->color_format == LV_COLOR_FORMAT_RGB888 + || dsc->base.layer->color_format == LV_COLOR_FORMAT_RGB565))) { + return 0; + } + + if(t->preference_score > DRAW_UNIT_PPA_PREF_SCORE) { + t->preference_score = DRAW_UNIT_PPA_PREF_SCORE; + t->preferred_draw_unit_id = DRAW_UNIT_ID_PPA; + } + return 1; + } +#endif + default: + return 0; + } +} + +static int32_t ppa_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_ppa_unit_t * u = (lv_draw_ppa_unit_t *)draw_unit; + if(u->task_act) { + return LV_DRAW_UNIT_IDLE; + } + + lv_draw_task_t * t = lv_draw_get_available_task(layer, NULL, DRAW_UNIT_ID_PPA); + if(!t || t->preferred_draw_unit_id != DRAW_UNIT_ID_PPA) return LV_DRAW_UNIT_IDLE; + if(lv_draw_layer_alloc_buf(layer) == NULL) return LV_DRAW_UNIT_IDLE; + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + u->task_act = t; + u->task_act->draw_unit = draw_unit; + + ppa_execute_drawing(u); + + u->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + u->task_act = NULL; + lv_draw_dispatch_request(); + + return 1; +} + +static int32_t ppa_delete(lv_draw_unit_t * draw_unit) +{ + lv_draw_ppa_unit_t * u = (lv_draw_ppa_unit_t *)draw_unit; + ppa_unregister_client(u->srm_client); + ppa_unregister_client(u->fill_client); + ppa_unregister_client(u->blend_client); + return 0; +} + +static void ppa_execute_drawing(lv_draw_ppa_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + lv_layer_t * layer = t->target_layer; + lv_draw_buf_t * buf = layer->draw_buf; + lv_area_t area; + + if(!lv_area_intersect(&area, &t->area, &t->clip_area)) return; + lv_draw_buf_invalidate_cache(buf, &area); + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_ppa_fill(t, (lv_draw_fill_dsc_t *)t->draw_dsc, &area); + lv_draw_buf_invalidate_cache(buf, &area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_ppa_img(t, (lv_draw_image_dsc_t *)t->draw_dsc, &area); + lv_draw_buf_invalidate_cache(buf, &area); + break; + default: + break; + } +} + +#endif /*LV_USE_PPA*/ diff --git a/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa.h b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa.h new file mode 100644 index 0000000..542b0fe --- /dev/null +++ b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa.h @@ -0,0 +1,57 @@ +/** + * @file lv_draw_ppa.h + * + */ + +#ifndef LV_DRAW_PPA_H +#define LV_DRAW_PPA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_PPA + +#include "../../lv_draw_private.h" +#include "../../../display/lv_display_private.h" +#include "../../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_ppa_init(void); +void lv_draw_ppa_deinit(void); +void lv_draw_buf_ppa_init_handlers(void); + +void lv_draw_ppa_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_ppa_img(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_PPA */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_DRAW_PPA_H */ diff --git a/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_buf.c b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_buf.c new file mode 100644 index 0000000..049bf6b --- /dev/null +++ b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_buf.c @@ -0,0 +1,46 @@ +/** + * @file lv_draw_ppa_buf.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_ppa_private.h" +#include "lv_draw_ppa.h" + +#if LV_USE_PPA +#include LV_STDINT_INCLUDE +#include "../../lv_draw_buf_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + *********************/ + +/********************** + * STATIC PROTOTYPES + *********************/ +static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +/********************** + * GLOBAL FUNCTIONS + *********************/ +void lv_draw_buf_ppa_init_handlers(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + handlers->invalidate_cache_cb = invalidate_cache; +} + +/********************** + * STATIC FUNCTIONS + *********************/ + +static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + esp_cache_msync(draw_buf->data, draw_buf->data_size, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_TYPE_DATA); +} +#endif /* LV_USE_PPA */ diff --git a/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_fill.c b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_fill.c new file mode 100644 index 0000000..da8a773 --- /dev/null +++ b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_fill.c @@ -0,0 +1,48 @@ +/** + * @file lv_draw_ppa_fill.c + * + */ + +#include "lv_draw_ppa_private.h" +#include "lv_draw_ppa.h" + +#if LV_USE_PPA + +void lv_draw_ppa_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, + const lv_area_t * coords) +{ + ppa_fill_oper_config_t fill_cfg = {0}; + lv_draw_ppa_unit_t * u = (lv_draw_ppa_unit_t *)t->draw_unit; + lv_draw_buf_t * draw_buf = t->target_layer->draw_buf; + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -t->target_layer->buf_area.x1, -t->target_layer->buf_area.y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, &t->clip_area); + lv_area_move(&rel_clip_area, -t->target_layer->buf_area.x1, -t->target_layer->buf_area.y1); + + lv_area_t blend_area; + if(!lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + fill_cfg.fill_argb_color.val = lv_color_to_u32(dsc->color); + fill_cfg.out.block_offset_x = blend_area.x1; + fill_cfg.out.block_offset_y = blend_area.y1; + fill_cfg.out.fill_cm = lv_color_format_to_ppa_fill(draw_buf->header.cf); + fill_cfg.fill_block_w = lv_area_get_width(&blend_area); + fill_cfg.fill_block_h = lv_area_get_height(&blend_area); + fill_cfg.out.buffer = draw_buf->data; + fill_cfg.out.buffer_size = draw_buf->data_size; + fill_cfg.out.pic_w = draw_buf->header.w; + fill_cfg.out.pic_h = draw_buf->header.h;; + fill_cfg.mode = PPA_TRANS_MODE_BLOCKING; + + esp_err_t ret = ppa_do_fill(u->fill_client, &fill_cfg); + if(ret != ESP_OK) { + LV_LOG_ERROR("PPA fill failed: %d", ret); + } +} + +#endif /* LV_USE_PPA */ diff --git a/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_img.c b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_img.c new file mode 100644 index 0000000..2cbdc6e --- /dev/null +++ b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_img.c @@ -0,0 +1,114 @@ +/** + * @file lv_draw_ppa_img.c + * + */ + +#include "lv_draw_ppa_private.h" +#include "lv_draw_ppa.h" + +#if LV_USE_PPA + +#include "../../lv_draw_image_private.h" +#include "../../lv_image_decoder_private.h" + +static void lv_draw_img_ppa_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + + +void lv_draw_ppa_img(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + lv_draw_image_normal_helper(t, dsc, coords, lv_draw_img_ppa_core, NULL); +} + +static void lv_draw_img_ppa_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + lv_layer_t * layer = t->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + lv_draw_ppa_unit_t * u = (lv_draw_ppa_unit_t *)t->draw_unit; + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, clipped_img_area); + lv_area_move(&rel_clip_area, -img_coords->x1, -img_coords->y1); + + lv_area_t rel_img_coords; + lv_area_copy(&rel_img_coords, img_coords); + lv_area_move(&rel_img_coords, -img_coords->x1, -img_coords->y1); + + lv_area_t src_area; + if(!lv_area_intersect(&src_area, &rel_clip_area, &rel_img_coords)) + return; + + lv_area_t dest_area; + lv_area_copy(&dest_area, clipped_img_area); + lv_area_move(&dest_area, -t->target_layer->buf_area.x1, -t->target_layer->buf_area.y1); + + const uint8_t * src_buf = decoded->data; + lv_color_format_t src_cf = draw_dsc->header.cf; + lv_color_format_t dest_cf = draw_buf->header.cf; + uint8_t * dest_buf = draw_buf->data; + + extern const lv_image_dsc_t img_benchmark_lvgl_logo_rgb; + + ppa_blend_oper_config_t cfg = { + .in_bg = { + .buffer = (void *)src_buf, + .pic_w = draw_dsc->header.w, + .pic_h = draw_dsc->header.h, + .block_w = lv_area_get_width(clipped_img_area), + .block_h = lv_area_get_height(clipped_img_area), + .block_offset_x = src_area.x1, + .block_offset_y = src_area.y1, + .blend_cm = lv_color_format_to_ppa_blend(src_cf), + }, + .bg_rgb_swap = false, + .bg_byte_swap = false, + .bg_alpha_update_mode = PPA_ALPHA_FIX_VALUE, + .bg_alpha_fix_val = 0xFF, + .bg_ck_en = false, + .in_fg = { + .buffer = (void *)dest_buf, + .pic_w = draw_dsc->header.w, + .pic_h = draw_dsc->header.h, + .block_w = lv_area_get_width(clipped_img_area), + .block_h = lv_area_get_height(clipped_img_area), + .block_offset_x = src_area.x1, + .block_offset_y = src_area.y1, + .blend_cm = PPA_BLEND_COLOR_MODE_A8, + }, + .fg_fix_rgb_val = { + .r = 0, + .g = 0, + .b = 0, + }, + .fg_rgb_swap = false, + .fg_byte_swap = false, + .fg_alpha_update_mode = PPA_ALPHA_FIX_VALUE, + .fg_alpha_fix_val = 0, + .fg_ck_en = false, + .out = { + .buffer = dest_buf, + .buffer_size = draw_buf->data_size, + .pic_w = draw_buf->header.w, + .pic_h = draw_buf->header.h, + .block_offset_x = dest_area.x1, + .block_offset_y = dest_area.y1, + .blend_cm = lv_color_format_to_ppa_blend(dest_cf), + }, + .mode = PPA_TRANS_MODE_BLOCKING, + .user_data = u, + }; + + esp_err_t ret = ppa_do_blend(u->blend_client, &cfg); + if(ret != ESP_OK) { + LV_LOG_WARN("PPA draw_img blend failed: %d", ret); + } +} + +#endif /* LV_USE_PPA */ diff --git a/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_private.h b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_private.h new file mode 100644 index 0000000..b2336c4 --- /dev/null +++ b/inc/lvgl/src/draw/espressif/ppa/lv_draw_ppa_private.h @@ -0,0 +1,177 @@ +/** + * @file lv_draw_ppa_private.h + * + */ + +#ifndef LV_DRAW_PPA_PRIVATE_H +#define LV_DRAW_PPA_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* +* INCLUDES +*********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_PPA +#if LV_PPA_NONBLOCKING_OPS +#error "PPA draw in nonblocking is experimental and not supported yet, please make it to 0!" +#endif + +#ifndef LV_PPA_NONBLOCKING_OPS +#define LV_PPA_NONBLOCKING_OPS 0 +#endif + +#include LV_STDDEF_INCLUDE +#include LV_STDBOOL_INCLUDE +#include LV_STDINT_INCLUDE + +#include "../../../misc/lv_color.h" +#include "../../../misc/lv_log.h" +#include "../../lv_draw_private.h" +#include "../../../display/lv_display_private.h" +#include "../../../misc/lv_area_private.h" + +/* The ppa driver depends heavily on the esp-idf headers*/ +#include "sdkconfig.h" + +#if (CONFIG_LV_DRAW_BUF_ALIGN != CONFIG_CACHE_L2_CACHE_LINE_SIZE) +#error "CONFIG_LV_DRAW_BUF_ALIGN must be equal to CONFIG_CACHE_L2_CACHE_LINE_SIZE!" +#endif + + +#ifndef CONFIG_SOC_PPA_SUPPORTED +#error "This SoC does not support PPA" +#endif + +#include "driver/ppa.h" +#include "esp_heap_caps.h" +#include "esp_err.h" +#include "hal/color_hal.h" +#include "esp_cache.h" +#include "esp_log.h" +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ +typedef struct lv_draw_ppa_unit { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; + ppa_client_handle_t srm_client; + ppa_client_handle_t fill_client; + ppa_client_handle_t blend_client; + uint8_t * buf; +} lv_draw_ppa_unit_t; + +/********************** +* STATIC PROTOTYPES +**********************/ + +/********************** +* GLOBAL PROTOTYPES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* STATIC FUNCTIONS +**********************/ + +static inline bool ppa_src_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + is_cf_supported = true; + break; + default: + break; + } + + return is_cf_supported; +} + +static inline bool ppa_dest_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_ARGB8888: + is_cf_supported = true; + break; + default: + break; + } + + return is_cf_supported; +} + +static inline ppa_fill_color_mode_t lv_color_format_to_ppa_fill(lv_color_format_t lv_fmt) +{ + switch(lv_fmt) { + case LV_COLOR_FORMAT_RGB565: + return PPA_FILL_COLOR_MODE_RGB565; + case LV_COLOR_FORMAT_RGB888: + return PPA_FILL_COLOR_MODE_RGB888; + case LV_COLOR_FORMAT_ARGB8888: + return PPA_FILL_COLOR_MODE_ARGB8888; + default: + return PPA_FILL_COLOR_MODE_RGB565; + } +} + +static inline ppa_blend_color_mode_t lv_color_format_to_ppa_blend(lv_color_format_t lv_fmt) +{ + switch(lv_fmt) { + case LV_COLOR_FORMAT_RGB565: + return PPA_BLEND_COLOR_MODE_RGB565; + case LV_COLOR_FORMAT_RGB888: + return PPA_BLEND_COLOR_MODE_RGB888; + case LV_COLOR_FORMAT_ARGB8888: + return PPA_BLEND_COLOR_MODE_ARGB8888; + default: + return PPA_BLEND_COLOR_MODE_RGB565; + } +} + +static inline ppa_srm_color_mode_t lv_color_format_to_ppa_srm(lv_color_format_t lv_fmt) +{ + switch(lv_fmt) { + case LV_COLOR_FORMAT_RGB565: + return PPA_SRM_COLOR_MODE_RGB565; + case LV_COLOR_FORMAT_RGB888: + return PPA_SRM_COLOR_MODE_RGB888; + case LV_COLOR_FORMAT_XRGB8888: + return PPA_SRM_COLOR_MODE_ARGB8888; + default: + return PPA_SRM_COLOR_MODE_RGB565; + } +} + +#define PPA_ALIGN_UP(x, align) ((((x) + (align) - 1) / (align)) * (align)) +#define PPA_PTR_ALIGN_UP(p, align) \ + ((void*)(((uintptr_t)(p) + (uintptr_t)((align) - 1)) & ~(uintptr_t)((align) - 1))) + +#define PPA_ALIGN_DOWN(x, align) ((((x) - (align) - 1) / (align)) * (align)) +#define PPA_PTR_ALIGN_DOWN(p, align) \ + ((void*)(((uintptr_t)(p) - (uintptr_t)((align) - 1)) & ~(uintptr_t)((align) - 1))) + +#endif /* LV_USE_PPA */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_DRAW_PPA_PRIVATE_H */ diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve.c b/inc/lvgl/src/draw/eve/lv_draw_eve.c new file mode 100644 index 0000000..6c4e4fc --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve.c @@ -0,0 +1,164 @@ +/** + * @file lv_draw_eve.c + * + */ + +/* Created on: 3 dic 2023 + * Author: juanj + * + * Modified by LVGL + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_eve_private.h" +#if LV_USE_DRAW_EVE + +#include "../../core/lv_refr.h" +#include "../../display/lv_display_private.h" +#include "../../stdlib/lv_string.h" +#include "lv_draw_eve_ram_g.h" +#include "lv_draw_eve.h" +#include "lv_eve.h" + +/********************* + * DEFINES + *********************/ + +#define DRAW_UNIT_ID_EVE 9 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void eve_execute_drawing(lv_draw_eve_unit_t * u); + +static int32_t eve_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static int32_t eve_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +static void disp_delete_cb(lv_event_t * e); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_eve_init(void) +{ + lv_draw_eve_unit_t * draw_eve_unit = lv_draw_create_unit(sizeof(lv_draw_eve_unit_t)); + draw_eve_unit->base_unit.dispatch_cb = eve_dispatch; + draw_eve_unit->base_unit.evaluate_cb = eve_evaluate; + + lv_draw_eve_unit_g = draw_eve_unit; +} + +void lv_draw_eve_set_display_data(lv_display_t * disp, const lv_draw_eve_parameters_t * params, + lv_draw_eve_operation_cb_t op_cb) +{ + if(lv_draw_eve_unit_g == NULL) { + LV_LOG_WARN("lv_draw_eve is not initialized."); + return; + } + + lv_draw_eve_unit_g->disp = disp; + lv_draw_eve_unit_g->params = *params; /* make a copy */ + lv_draw_eve_unit_g->op_cb = op_cb; + + lv_display_add_event_cb(disp, disp_delete_cb, LV_EVENT_DELETE, NULL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t eve_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_eve_unit_t * draw_eve_unit = (lv_draw_eve_unit_t *) draw_unit; + + lv_draw_task_t * t = NULL; + t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_EVE); + if(t == NULL) return LV_DRAW_UNIT_IDLE; + + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_eve_unit->task_act = t; + + eve_execute_drawing(draw_eve_unit); + + draw_eve_unit->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + draw_eve_unit->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + + + return 1; +} + +static int32_t eve_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + LV_UNUSED(draw_unit); + + if(((lv_draw_dsc_base_t *)task->draw_dsc)->user_data == NULL) { + task->preference_score = 0; + task->preferred_draw_unit_id = DRAW_UNIT_ID_EVE; + } + return 0; +} + +static void eve_execute_drawing(lv_draw_eve_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_line_iterate(t, t->draw_dsc, lv_draw_eve_line); + break; + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_eve_border(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_eve_fill(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_eve_image(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_eve_label(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_eve_arc(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_eve_triangle(t, t->draw_dsc); + break; + default: + break; + } +} + +static void disp_delete_cb(lv_event_t * e) +{ + lv_draw_eve_unit_g->disp = NULL; + lv_draw_eve_unit_g = NULL; +} + + +#endif /*LV_USE_DRAW_EVE*/ diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve.h b/inc/lvgl/src/draw/eve/lv_draw_eve.h new file mode 100644 index 0000000..003638a --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve.h @@ -0,0 +1,57 @@ +/** + * @file lv_draw_eve.h + * + */ + +/* Created on: 3 dic 2023 + * Author: juanj + * + * Modified by LVGL + */ + +#ifndef LV_DRAW_EVE_H +#define LV_DRAW_EVE_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_DRAW_EVE + +#include "lv_draw_eve_target.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_eve_init(void); + +void lv_draw_eve_set_display_data(lv_display_t * disp, const lv_draw_eve_parameters_t * params, + lv_draw_eve_operation_cb_t op_cb); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_EVE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + + +#endif /* LV_DRAW_EVE_H */ diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_arc.c b/inc/lvgl/src/draw/eve/lv_draw_eve_arc.c new file mode 100644 index 0000000..2a19128 --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_arc.c @@ -0,0 +1,325 @@ +/** + * @file lv_draw_eve_arc.c + * + */ + +/* Created on: 11 dic 2023 + * Author: juanj + * + * Modified by LVGL + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_eve_private.h" +#if LV_USE_DRAW_EVE + +#include "../lv_draw_arc.h" +#include "lv_eve.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void draw_eve_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); +static bool is_same_quadrant(int16_t start_angle, int16_t end_angle) ; +static void draw_rounded_end(lv_point_t center, int32_t radius, int32_t angle, int32_t width); +static void lv_draw_eve_mask_angle(const lv_draw_arc_dsc_t * dsc, int32_t vertex_x, int32_t vertex_y, + int32_t start_angle, int32_t end_angle); +static lv_eve_primitive_t get_mask_direction(int16_t angle); +static int32_t chord_length(int16_t radius, int16_t angle_degrees); + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_eve_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ + draw_eve_arc(t, dsc, coords); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + + +static int32_t chord_length(int16_t radius, int16_t angle_degrees) +{ + angle_degrees %= 360; + if(angle_degrees < 0) angle_degrees += 360; + int32_t sin_value = lv_trigo_sin(angle_degrees / 2); + int64_t chord_length = 2 * radius * sin_value / 32768.0; + return (int32_t)chord_length ; +} + + +static lv_eve_primitive_t get_mask_direction(int16_t angle) +{ + if(angle >= 315 || angle < 45) { + return LV_EVE_PRIMITIVE_EDGE_STRIP_R; + } + if(angle >= 45 && angle < 135) { + return LV_EVE_PRIMITIVE_EDGE_STRIP_B; + } + if(angle >= 135 && angle < 225) { + return LV_EVE_PRIMITIVE_EDGE_STRIP_L; + } + if(angle >= 225 && angle < 315) { + return LV_EVE_PRIMITIVE_EDGE_STRIP_A; + } + return 0; +} + + +static void draw_rounded_end(lv_point_t center, int32_t radius, int32_t angle, int32_t width) +{ + int32_t rounded_y = center.y + ((lv_trigo_sin(angle) * radius) >> LV_TRIGO_SHIFT); + int32_t rounded_x = center.x + ((lv_trigo_cos(angle) * radius) >> LV_TRIGO_SHIFT); + lv_eve_draw_circle_simple(rounded_x, rounded_y, width); +} + + + +static bool is_same_quadrant(int16_t start_angle, int16_t end_angle) +{ + if(start_angle > end_angle) { + if((start_angle >= 0 && start_angle < 90) && (end_angle >= 0 && end_angle < 90)) { + return true; + } + else if((start_angle >= 90 && start_angle < 180) && (end_angle >= 90 && end_angle < 180)) { + return true; + } + else if((start_angle >= 180 && start_angle < 270) && (end_angle >= 180 && end_angle < 270)) { + return true; + } + else if((start_angle >= 270 && start_angle < 360) && (end_angle >= 270 && end_angle < 360)) { + return true; + } + else { + return false; + } + } + else { + return false; + } +} + + + +static void lv_draw_eve_mask_angle(const lv_draw_arc_dsc_t * dsc, int32_t vertex_x, int32_t vertex_y, + int32_t start_angle, int32_t end_angle) +{ + + /*Constrain the input angles*/ + + + if(start_angle < 0) + start_angle = 0; + else if(start_angle > 359) + start_angle = 359; + + if(end_angle < 0) + end_angle = 0; + else if(end_angle > 359) + end_angle = 359; + + LV_ASSERT_MSG(start_angle >= 0 && start_angle <= 360, "Unexpected start angle"); + + int32_t mid_angle_op; + int32_t angle_range; + int32_t mask_dir_start; + int32_t mask_dir_end; + lv_point_t start; + lv_point_t end; + lv_point_t angle_range_op; + + if(end_angle > start_angle) { + angle_range = LV_ABS(end_angle - start_angle); + } + else { + angle_range = 360 - start_angle + end_angle; + } + + mid_angle_op = (angle_range / 2) + start_angle + 180; + mid_angle_op = mid_angle_op % 360; + + mask_dir_end = LV_ABS(((360 - angle_range) / 4) + end_angle); + mask_dir_start = LV_ABS(((360 - angle_range) / 4) + mid_angle_op); + + mask_dir_start = mask_dir_start % 360; + mask_dir_end = mask_dir_end % 360; + + start.y = (lv_trigo_sin(start_angle) >> 5) + vertex_y; + start.x = (lv_trigo_cos(start_angle) >> 5) + vertex_x; + + end.y = (lv_trigo_sin(end_angle) >> 5) + vertex_y; + end.x = (lv_trigo_cos(end_angle) >> 5) + vertex_x; + + angle_range_op.y = (lv_trigo_sin(mid_angle_op) >> 5) + vertex_y; + angle_range_op.x = (lv_trigo_cos(mid_angle_op) >> 5) + vertex_x; + + if(angle_range <= 180) { + /* Two sides mask and 6 vertex points */ + + /* Masking end angle */ + lv_eve_primitive_t edge = get_mask_direction(mask_dir_end); + lv_eve_primitive(edge); /* Side one */ + lv_eve_vertex_2f(angle_range_op.x, angle_range_op.y); + lv_eve_vertex_2f(vertex_x, vertex_y); + lv_eve_vertex_2f(end.x, end.y); + + /* Masking start angle */ + edge = get_mask_direction(mask_dir_start); + lv_eve_primitive(edge); /* Side two */ + lv_eve_vertex_2f(angle_range_op.x, angle_range_op.y); + lv_eve_vertex_2f(vertex_x, vertex_y); + lv_eve_vertex_2f(start.x, start.y); + + } + + else { + + if(is_same_quadrant(start_angle, + end_angle)) { /* "It is not an optimal implementation for the case where both angles (start and end) are in the same quadrant */ + /* todo */ + lv_point_t end_line_cntr; + lv_point_t start_line_cntr; + + lv_point_t end_line_brd; + lv_point_t start_line_brd; + + int16_t chord = chord_length(dsc->radius, 360 - angle_range); + int16_t w = ((chord / 4) < 1) ? 1 : chord / 4; + int16_t r_width = w; + + end_line_brd.y = vertex_y + ((lv_trigo_sin(end_angle) * dsc->radius) >> LV_TRIGO_SHIFT); + end_line_brd.x = vertex_x + ((lv_trigo_cos(end_angle) * dsc->radius) >> LV_TRIGO_SHIFT); + + start_line_brd.y = vertex_y + ((lv_trigo_sin(start_angle) * dsc->radius) >> LV_TRIGO_SHIFT); + start_line_brd.x = vertex_x + ((lv_trigo_cos(start_angle) * dsc->radius) >> LV_TRIGO_SHIFT); + + lv_eve_draw_rect_simple(start_line_brd.x, start_line_brd.y, end_line_brd.x, end_line_brd.y, 0); + + start_line_brd.y = start_line_brd.y + ((lv_trigo_sin(start_angle - 90) * r_width) >> LV_TRIGO_SHIFT); + start_line_brd.x = start_line_brd.x + ((lv_trigo_cos(start_angle - 90) * r_width) >> LV_TRIGO_SHIFT); + + end_line_brd.y = end_line_brd.y + ((lv_trigo_sin(end_angle + 90) * r_width) >> LV_TRIGO_SHIFT); + end_line_brd.x = end_line_brd.x + ((lv_trigo_cos(end_angle + 90) * r_width) >> LV_TRIGO_SHIFT); + + end_line_cntr.y = vertex_y + ((lv_trigo_sin(end_angle + 90) * r_width) >> LV_TRIGO_SHIFT); + end_line_cntr.x = vertex_x + ((lv_trigo_cos(end_angle + 90) * r_width) >> LV_TRIGO_SHIFT); + + start_line_cntr.y = vertex_y + ((lv_trigo_sin(start_angle + 270) * r_width) >> LV_TRIGO_SHIFT); + start_line_cntr.x = vertex_x + ((lv_trigo_cos(start_angle + 270) * r_width) >> LV_TRIGO_SHIFT); + + lv_eve_primitive(LV_EVE_PRIMITIVE_LINE_STRIP); + lv_eve_line_width(r_width * 16); + lv_eve_vertex_2f(start_line_cntr.x, start_line_cntr.y); + lv_eve_vertex_2f(start_line_brd.x, start_line_brd.y); + lv_eve_vertex_2f(end_line_brd.x, end_line_brd.y); + lv_eve_vertex_2f(end_line_cntr.x, end_line_cntr.y); + + } + else { /* One side mask and 3 vertex points */ + /* Masking end and start angles */ + lv_eve_primitive_t edge = get_mask_direction(mid_angle_op); + lv_eve_primitive(edge); + lv_eve_vertex_2f(end.x, end.y); + lv_eve_vertex_2f(vertex_x, vertex_y); + lv_eve_vertex_2f(start.x, start.y); + } + } + +} + + + +static void draw_eve_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ + + if(dsc->opa <= LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(dsc->start_angle == dsc->end_angle) + return; + + lv_color_t color = dsc->color; + lv_opa_t opa = dsc->opa; + lv_point_t center = dsc->center; + int32_t width = dsc->width; + uint16_t radius_out = dsc->radius; + uint16_t radius_in = dsc->radius - dsc->width; + int32_t start_angle = (int32_t) dsc->start_angle; + int32_t end_angle = (int32_t) dsc->end_angle; + + if(width > radius_out) + width = radius_out; + + while(start_angle >= 360) + start_angle -= 360; + while(end_angle >= 360) + end_angle -= 360; + + lv_eve_scissor(t->clip_area.x1, t->clip_area.y1, t->clip_area.x2, t->clip_area.y2); + + lv_eve_save_context(); + + lv_eve_color(color); + lv_eve_color_opa(opa); + + lv_eve_color_mask(0, 0, 0, 1); + lv_eve_stencil_func(EVE_ALWAYS, 0, 1); + lv_eve_stencil_op(EVE_REPLACE, EVE_REPLACE); + lv_eve_draw_circle_simple(center.x, center.y, radius_out); /* radius_out */ + + lv_eve_blend_func(EVE_ONE, EVE_ZERO); + lv_eve_draw_circle_simple(center.x, center.y, radius_in + 2); /* radius_in */ + + lv_eve_stencil_func(EVE_ALWAYS, 1, 1); + lv_eve_stencil_op(EVE_REPLACE, EVE_REPLACE); + lv_eve_blend_func(EVE_ZERO, EVE_ONE_MINUS_SRC_ALPHA); + lv_eve_color_opa(0XFF); + + /* Start masking arc */ + + lv_draw_eve_mask_angle(dsc, center.x, center.y, start_angle, end_angle); + + /* End masking arc */ + + lv_eve_draw_circle_simple(center.x, center.y, radius_in); /* radius_in */ + + lv_eve_color_mask(1, 1, 1, 1); + lv_eve_blend_func(EVE_DST_ALPHA, EVE_ONE_MINUS_DST_ALPHA); + lv_eve_draw_circle_simple(center.x, center.y, radius_in); /* radius_in */ + + lv_eve_stencil_func(EVE_NOTEQUAL, 1, 0XFF); + lv_eve_stencil_op(EVE_KEEP, EVE_KEEP); + lv_eve_blend_func(EVE_SRC_ALPHA, EVE_ONE_MINUS_SRC_ALPHA); + + lv_eve_color_opa(opa); + lv_eve_draw_circle_simple(center.x, center.y, radius_out); /* radius_out */ + + if(dsc->rounded) { + lv_eve_stencil_func(EVE_EQUAL, 1, 0XFF); + if(opa < 255) { + lv_eve_stencil_op(EVE_ZERO, EVE_ZERO); + } + + int32_t half_width = width / 2; + int32_t adjusted_radius = radius_out - half_width; + draw_rounded_end(center, adjusted_radius, end_angle, half_width); + draw_rounded_end(center, adjusted_radius, start_angle, half_width); + } + + lv_eve_restore_context(); +} + + + +#endif /*LV_USE_DRAW_EVE*/ diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_fill.c b/inc/lvgl/src/draw/eve/lv_draw_eve_fill.c new file mode 100644 index 0000000..d0221a7 --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_fill.c @@ -0,0 +1,121 @@ +/** + * @file lv_draw_eve_fill.c + * + */ + +/* Created on: 27 mar 2023 + * Author: juanj + * + * Modified by LVGL + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_eve_private.h" +#if LV_USE_DRAW_EVE +#include "lv_eve.h" + + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_eve_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + + int32_t rad = dsc->radius; + int32_t bg_w = lv_area_get_width(coords); + int32_t bg_h = lv_area_get_height(coords); + int32_t real_radius = LV_MIN3(bg_w / 2, bg_h / 2, rad); + + lv_eve_scissor(t->clip_area.x1, t->clip_area.y1, t->clip_area.x2, t->clip_area.y2); + lv_eve_save_context(); + + lv_eve_color(dsc->color); + lv_eve_color_opa(dsc->opa); + + if(bg_w == bg_h && rad == LV_RADIUS_CIRCLE) { + lv_eve_draw_circle_simple(coords->x1 + (bg_w / 2), coords->y1 + (bg_h / 2), real_radius); + } + else { + lv_eve_draw_rect_simple(coords->x1, coords->y1, coords->x2, coords->y2, real_radius); + } + + lv_eve_restore_context(); +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + + + +void lv_draw_eve_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords) +{ + + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(dsc->side == LV_BORDER_SIDE_NONE) return; + + int32_t coords_w = lv_area_get_width(coords); + int32_t coords_h = lv_area_get_height(coords); + int32_t rout = dsc->radius; + int32_t short_side = LV_MIN(coords_w, coords_h); + if(rout > short_side >> 1) rout = short_side >> 1; + + /*Get the inner area*/ + lv_area_t area_inner; + lv_area_copy(&area_inner, coords); + area_inner.x1 += ((dsc->side & LV_BORDER_SIDE_LEFT) ? dsc->width : - (dsc->width)); + area_inner.x2 -= ((dsc->side & LV_BORDER_SIDE_RIGHT) ? dsc->width : - (dsc->width)); + area_inner.y1 += ((dsc->side & LV_BORDER_SIDE_TOP) ? dsc->width : - (dsc->width)); + area_inner.y2 -= ((dsc->side & LV_BORDER_SIDE_BOTTOM) ? dsc->width : - (dsc->width)); + + int32_t rin = rout - dsc->width; + if(rin < 0) rin = 0; + + lv_eve_save_context(); + + lv_eve_scissor(t->clip_area.x1, t->clip_area.y1, t->clip_area.x2, t->clip_area.y2); + + lv_eve_color(dsc->color); + lv_eve_color_opa(dsc->opa); + + lv_eve_color_mask(0, 0, 0, 1); + lv_eve_stencil_func(EVE_ALWAYS, 0, 1); + lv_eve_stencil_op(EVE_REPLACE, EVE_REPLACE); + lv_eve_draw_rect_simple(coords->x1, coords->y1, coords->x2, coords->y2, 0); + + lv_eve_blend_func(EVE_ONE, EVE_ZERO); + lv_eve_draw_rect_simple(area_inner.x1 - 2, area_inner.y1 - 1, area_inner.x2 + 1, area_inner.y2 + 2, rin); + + lv_eve_stencil_func(EVE_ALWAYS, 1, 1); + lv_eve_stencil_op(EVE_REPLACE, EVE_REPLACE); + lv_eve_blend_func(EVE_ZERO, EVE_ONE_MINUS_SRC_ALPHA); + lv_eve_color_opa(255); + lv_eve_draw_rect_simple(area_inner.x1, area_inner.y1, area_inner.x2, area_inner.y2, rin); + + lv_eve_color_mask(1, 1, 1, 1); + + if(dsc->side == LV_BORDER_SIDE_FULL) { + lv_eve_blend_func(EVE_DST_ALPHA, EVE_ONE_MINUS_DST_ALPHA); + lv_eve_draw_rect_simple(area_inner.x1, area_inner.y1, area_inner.x2, area_inner.y2, rin); + } + + lv_eve_stencil_func(EVE_NOTEQUAL, 1, 255); + lv_eve_blend_func(EVE_SRC_ALPHA, EVE_ONE_MINUS_SRC_ALPHA); + + lv_eve_color_opa(dsc->opa); + lv_eve_draw_rect_simple(coords->x1, coords->y1, coords->x2, coords->y2, rout); + + lv_eve_restore_context(); +} + +#endif /*LV_USE_DRAW_EVE*/ + diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_image.c b/inc/lvgl/src/draw/eve/lv_draw_eve_image.c new file mode 100644 index 0000000..1c6d999 --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_image.c @@ -0,0 +1,299 @@ +/** + * @file lv_draw_eve_image.c + * + */ + +/* Created on: 17 jun 2023 + * Author: juanj + * + * Modified by LVGL + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_eve_private.h" +#if LV_USE_DRAW_EVE + +#include "../lv_draw_image_private.h" +#include "lv_draw_eve_ram_g.h" +#include "lv_eve.h" + +/********************* + * DEFINES + *********************/ + + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void convert_row_rgb565a8_to_argb4444(const uint8_t * src, const uint8_t * src_alpha, uint8_t * dst, + uint32_t width); +static void convert_row_argb8888_to_argb4444(const uint8_t * src, uint8_t * dst, uint32_t width); + +/********************** + * STATIC VARIABLES + **********************/ + + + +/********************** + * MACROS + **********************/ + +#define F16_PIVOT_SHIFT(x) ((int32_t)((((x) >> 1)) * 65536L)) +#define F16_SCALE_DIV_256(x) ((int32_t)(((x) / 256.0f) * 65536L)) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_eve_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords) +{ + if(!lv_draw_eve_image_src_check(draw_dsc->src)) { + return; + } + + const lv_image_dsc_t * img_dsc = draw_dsc->src; + + int32_t src_w = img_dsc->header.w; + int32_t src_h = img_dsc->header.h; + int32_t src_stride = img_dsc->header.stride; + lv_color_format_t src_cf = img_dsc->header.cf; + + if(src_stride == 0) { + src_stride = src_w * lv_color_format_get_size(src_cf); + } + + uint8_t eve_format; + int32_t eve_stride; + + switch(src_cf) { + case LV_COLOR_FORMAT_L8: + eve_format = EVE_L8; + eve_stride = src_stride; + break; + case LV_COLOR_FORMAT_RGB565: + eve_format = EVE_RGB565; + eve_stride = src_stride; + break; + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_ARGB8888: + eve_format = EVE_ARGB4; + eve_stride = src_w * 2; + break; + default : + LV_ASSERT(0); + } + + uint32_t ramg_addr = lv_draw_eve_image_upload_image(true, img_dsc); + if(ramg_addr == LV_DRAW_EVE_RAMG_OUT_OF_RAMG) { + LV_LOG_WARN("Could not load image because space could not be allocated in RAM_G."); + return; + } + + lv_eve_scissor(t->clip_area.x1, t->clip_area.y1, t->clip_area.x2, t->clip_area.y2); + + lv_eve_save_context(); + + lv_eve_color_opa(draw_dsc->opa); + + if(draw_dsc->recolor_opa > LV_OPA_MIN) { + lv_eve_color(lv_color_mix(draw_dsc->recolor, lv_color_white(), draw_dsc->recolor_opa)); + } + + lv_eve_primitive(LV_EVE_PRIMITIVE_BITMAPS); + lv_eve_bitmap_source(ramg_addr); + /*real height and width is mandatory for rotation and scale (Clip Area)*/ + lv_eve_bitmap_size(EVE_NEAREST, EVE_BORDER, EVE_BORDER, src_w, src_h); + + lv_eve_bitmap_layout(eve_format, eve_stride, src_h); + + if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { + EVE_cmd_dl_burst(CMD_LOADIDENTITY); + + EVE_cmd_translate_burst(F16(coords->x1 - t->clip_area.x1 + draw_dsc->pivot.x), + F16(coords->y1 - t->clip_area.y1 + draw_dsc->pivot.y)); + if(draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { + /*Image Scale*/ + EVE_cmd_scale_burst(F16_SCALE_DIV_256(draw_dsc->scale_x), F16_SCALE_DIV_256(draw_dsc->scale_y)); + } + if(draw_dsc->rotation != 0) { + /*Image Rotate*/ + EVE_cmd_rotate_burst(DEGREES(draw_dsc->rotation)); + } + EVE_cmd_translate_burst(-F16(draw_dsc->pivot.x), -F16(draw_dsc->pivot.y)); + EVE_cmd_dl_burst(CMD_SETMATRIX); + EVE_cmd_dl_burst(CMD_LOADIDENTITY); + lv_eve_vertex_2f(t->clip_area.x1, t->clip_area.y1); + } + else { + lv_eve_vertex_2f(coords->x1, coords->y1); + } + lv_eve_restore_context(); +} + +bool lv_draw_eve_image_src_check(const void * src) +{ + if(lv_image_src_get_type(src) != LV_IMAGE_SRC_VARIABLE) { + LV_LOG_WARN("lv_draw_eve can only render images from variables (not files or symbols) for now."); + return false; + } + + const lv_image_dsc_t * img_dsc = src; + + switch(img_dsc->header.cf) { + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_ARGB8888: + break; + default : + LV_LOG_WARN("lv_draw_eve can only render L8, RGB565, RGB565A8, and ARGB8888 images for now."); + return false; + } + + return true; +} + +uint32_t lv_draw_eve_image_upload_image(bool burst_is_active, const lv_image_dsc_t * img_dsc) +{ + const uint8_t * src_buf = img_dsc->data; + int32_t src_w = img_dsc->header.w; + int32_t src_h = img_dsc->header.h; + int32_t src_stride = img_dsc->header.stride; + lv_color_format_t src_cf = img_dsc->header.cf; + + if(src_stride == 0) { + src_stride = src_w * lv_color_format_get_size(src_cf); + } + + int32_t eve_stride; + uint8_t eve_alignment; + + switch(src_cf) { + case LV_COLOR_FORMAT_L8: + eve_stride = src_stride; + eve_alignment = 1; + break; + case LV_COLOR_FORMAT_RGB565: + eve_stride = src_stride; + eve_alignment = 2; + break; + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_ARGB8888: + eve_stride = src_w * 2; + eve_alignment = 2; + break; + default : + LV_ASSERT(0); + } + + int32_t eve_size = eve_stride * src_h; + + uint32_t ramg_addr; + bool img_is_loaded = lv_draw_eve_ramg_get_addr(&ramg_addr, (uintptr_t) src_buf, eve_size, eve_alignment); + + /* New image to load */ + if(!img_is_loaded && ramg_addr != LV_DRAW_EVE_RAMG_OUT_OF_RAMG) { + + /* Load image to RAM_G */ + + if(burst_is_active) { + EVE_end_cmd_burst(); + } + + switch(src_cf) { + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_RGB565: + EVE_memWrite_flash_buffer(ramg_addr, src_buf, eve_size); + break; + case LV_COLOR_FORMAT_RGB565A8: { + uint8_t * tmp_buf = lv_malloc(eve_stride); + LV_ASSERT_MALLOC(tmp_buf); + const uint8_t * src_alpha_buf = src_buf + src_h * src_stride; + int32_t src_alpha_stride = src_stride / 2; + for(uint32_t y = 0; y < src_h; y++) { + convert_row_rgb565a8_to_argb4444(src_buf + y * src_stride, src_alpha_buf + y * src_alpha_stride, tmp_buf, src_w); + EVE_memWrite_flash_buffer(ramg_addr + y * eve_stride, tmp_buf, eve_stride); + } + lv_free(tmp_buf); + break; + } + case LV_COLOR_FORMAT_ARGB8888: { + uint8_t * tmp_buf = lv_malloc(eve_stride); + LV_ASSERT_MALLOC(tmp_buf); + for(uint32_t y = 0; y < src_h; y++) { + convert_row_argb8888_to_argb4444(src_buf + y * src_stride, tmp_buf, src_w); + EVE_memWrite_flash_buffer(ramg_addr + y * eve_stride, tmp_buf, eve_stride); + } + lv_free(tmp_buf); + break; + } + default: + LV_ASSERT(0); + } + + if(burst_is_active) { + EVE_start_cmd_burst(); + } + } + + return ramg_addr; +} + + + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void convert_row_rgb565a8_to_argb4444(const uint8_t * src, const uint8_t * src_alpha, uint8_t * dst, + uint32_t width) +{ + for(uint32_t x = 0; x < width; x++) { + uint16_t rgb565 = ((const uint16_t *) src)[x]; + + uint8_t r5 = (rgb565 >> 11) & 0x1F; + uint8_t g6 = (rgb565 >> 5) & 0x3F; + uint8_t b5 = rgb565 & 0x1F; + uint8_t alpha = src_alpha[x]; + + uint8_t r4 = r5 >> 1; + uint8_t g4 = g6 >> 2; + uint8_t b4 = b5 >> 1; + uint8_t a4 = alpha >> 4; + + uint16_t argb4444 = (a4 << 12) | (r4 << 8) | (g4 << 4) | b4; + + dst[2 * x] = argb4444 & 0xFF; + dst[2 * x + 1] = (argb4444 >> 8) & 0xFF; + } +} + +static void convert_row_argb8888_to_argb4444(const uint8_t * src, uint8_t * dst, uint32_t width) +{ + for(uint32_t x = 0; x < width; x++) { + uint8_t blue = src[4 * x]; + uint8_t green = src[4 * x + 1]; + uint8_t red = src[4 * x + 2]; + uint8_t alpha = src[4 * x + 3]; + + uint8_t r4 = red >> 4; + uint8_t g4 = green >> 4; + uint8_t b4 = blue >> 4; + uint8_t a4 = alpha >> 4; + + uint16_t argb4444 = (a4 << 12) | (r4 << 8) | (g4 << 4) | b4; + + dst[2 * x] = argb4444 & 0xFF; + dst[2 * x + 1] = (argb4444 >> 8) & 0xFF; + } +} + +#endif /*LV_USE_DRAW_EVE*/ diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_letter.c b/inc/lvgl/src/draw/eve/lv_draw_eve_letter.c new file mode 100644 index 0000000..b7786e1 --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_letter.c @@ -0,0 +1,233 @@ +/** + * @file lv_draw_eve_letter.c + * + */ + +/* Author: juanj + * + * Modified by LVGL + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_eve_private.h" +#if LV_USE_DRAW_EVE + +#include "../lv_draw_private.h" +#include "../lv_draw_label_private.h" +#include "../lv_draw_rect.h" +#include "lv_eve.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_draw_eve_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); +static void font_bitmap_to_ramg(uint32_t addr, const uint8_t * src, uint32_t width, + uint32_t height, uint8_t src_stride_align); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#define GET_NIBBLE_1(w) ((uint8_t) ((w) >> 4)) +#define GET_NIBBLE_2(w) ((uint8_t) ((w) & 0xf)) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_eve_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_eve_scissor(t->clip_area.x1, t->clip_area.y1, t->clip_area.x2, t->clip_area.y2); + lv_eve_save_context(); + lv_eve_primitive(LV_EVE_PRIMITIVE_BITMAPS); + lv_draw_label_iterate_characters(t, dsc, coords, lv_draw_eve_letter_cb); + lv_eve_restore_context(); +} + +bool lv_draw_eve_label_font_check(const lv_font_t * font) +{ + if(font->get_glyph_bitmap != lv_font_get_bitmap_fmt_txt) { + LV_LOG_WARN("lv_draw_eve can only render static fonts for now."); + return false; + } + + const lv_font_fmt_txt_dsc_t * font_dsc = font->dsc; + + /* Only 4 bpp is supported for now. Support for 1 and 8 bpp can be added. (EVE_L1, EVE_L8) */ + if(font_dsc->bpp != 4) { + LV_LOG_WARN("lv_draw_eve can only render static fonts for now."); + return false; + } + + return true; +} + +uint32_t lv_draw_eve_label_upload_glyph(bool burst_is_active, const lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t gid_index) +{ + const lv_font_fmt_txt_glyph_dsc_t * glyph_dsc = &font_dsc->glyph_dsc[gid_index]; + const uint8_t * glyph_bitmap = &font_dsc->glyph_bitmap[glyph_dsc->bitmap_index]; + + uint16_t g_box_w = glyph_dsc->box_w; + uint16_t g_box_h = glyph_dsc->box_h; + + uint16_t g_aligned_stride = (g_box_w + 1) / 2; + + uint32_t glyph_ramg_size = g_aligned_stride * g_box_h; + + uint32_t ramg_addr; + uintptr_t glyph_ramg_key = (uintptr_t) glyph_bitmap; + bool font_is_loaded = lv_draw_eve_ramg_get_addr(&ramg_addr, glyph_ramg_key, glyph_ramg_size, 1); + + /* If the font is not yet loaded in ramG, load it */ + if(!font_is_loaded && ramg_addr != LV_DRAW_EVE_RAMG_OUT_OF_RAMG) { + if(burst_is_active) { + EVE_end_cmd_burst(); + } + + uint8_t glyph_bitmap_stride_align = font_dsc->stride; + font_bitmap_to_ramg(ramg_addr, glyph_bitmap, g_box_w, g_box_h, glyph_bitmap_stride_align); + + if(burst_is_active) { + EVE_start_cmd_burst(); + } + } + + return ramg_addr; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_draw_eve_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + + if(fill_draw_dsc && fill_area) { + /* draw UNDERLINE and STRIKETHROUGH */ + lv_eve_draw_rect_simple(fill_area->x1, fill_area->y1, fill_area->x2, fill_area->y2, 0); + } + + if(glyph_draw_dsc == NULL) + return; /* Important */ + + const lv_font_t * font = glyph_draw_dsc->g->resolved_font; + + if(!lv_draw_eve_label_font_check(font)) { + return; + } + + const lv_font_fmt_txt_dsc_t * font_dsc = font->dsc; + uint32_t gid_index = glyph_draw_dsc->g->gid.index; + const lv_font_fmt_txt_glyph_dsc_t * glyph_dsc = &font_dsc->glyph_dsc[gid_index]; + + uint16_t g_box_w = glyph_dsc->box_w; + uint16_t g_box_h = glyph_dsc->box_h; + + uint16_t g_aligned_stride = (g_box_w + 1) / 2; + + uint8_t bpp_eve = EVE_L4; + + uint32_t ramg_addr = lv_draw_eve_label_upload_glyph(true, font_dsc, gid_index); + if(ramg_addr == LV_DRAW_EVE_RAMG_OUT_OF_RAMG) { + LV_LOG_WARN("Could not load glyph because space could not be allocated in RAM_G."); + return; + } + + lv_eve_color_opa(glyph_draw_dsc->opa); + lv_eve_color(glyph_draw_dsc->color); + + lv_eve_bitmap_source(ramg_addr); + + lv_eve_bitmap_size(EVE_NEAREST, EVE_BORDER, EVE_BORDER, g_box_w, g_box_h); + lv_eve_bitmap_layout(bpp_eve, g_aligned_stride, g_box_h); + + lv_eve_vertex_2f(glyph_draw_dsc->letter_coords->x1, glyph_draw_dsc->letter_coords->y1); +} + +static void font_bitmap_to_ramg(uint32_t addr, const uint8_t * src, uint32_t width, + uint32_t height, uint8_t src_stride_align) +{ + uint32_t stride = (width + 1) / 2; + + if(src_stride_align == 1 || (src_stride_align == 0 && width % 2 == 0)) { + uint32_t size = stride * height; + EVE_memWrite_flash_buffer(addr, src, size); + return; + } + + if(src_stride_align > 0) { + uint32_t src_stride = LV_ALIGN_UP(stride, src_stride_align); + for(uint32_t y = 0; y < height; y++) { + EVE_memWrite_sram_buffer(addr, src, stride); + addr += stride; + src += src_stride; + } + return; + } + + uint8_t * row_buf = lv_malloc(stride); + LV_ASSERT_MALLOC(row_buf); + + uint32_t src_i = 0; + uint8_t nibble_1; + uint8_t nibble_2; + uint8_t key = 0; + + /* Iterate through each row of the bitmap*/ + for(uint32_t y = 0; y < height; y++) { + /* Iterate through each byte of the row*/ + uint32_t row_i; + for(row_i = 0; row_i < (width / 2); ++row_i) { + /*Get the two nibbles from the current byte*/ + if(key == 0) { + nibble_1 = GET_NIBBLE_1(src[src_i]); + nibble_2 = GET_NIBBLE_2(src[src_i]); + } + else { + nibble_1 = GET_NIBBLE_2(src[src_i - 1]); + nibble_2 = GET_NIBBLE_1(src[src_i]); + } + + /*Combine the nibbles and assign the result to the output byte*/ + row_buf[row_i] = (nibble_1 << 4) | nibble_2; + + src_i++; + } + + /*process the last remaining nibble*/ + row_buf[row_i] = + (key == 0) ? + (GET_NIBBLE_1(src[src_i])) << 4 | 0x0 : (GET_NIBBLE_2(src[src_i - 1])) << 4 | 0x0; + key = (key == 0) ? 1 : 0; + src_i += (key == 1) ? 1 : 0; + + EVE_memWrite_sram_buffer(addr, row_buf, stride); + addr += stride; + } + + lv_free(row_buf); +} + + +#endif /*LV_USE_DRAW_EVE*/ + diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_line.c b/inc/lvgl/src/draw/eve/lv_draw_eve_line.c new file mode 100644 index 0000000..c38357e --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_line.c @@ -0,0 +1,63 @@ +/** + * @file lv_draw_eve_line.c + * + */ + +/* Created on: 8 abr 2023 + * Author: juanj + * + * Modified by LVGL + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_eve_private.h" +#if LV_USE_DRAW_EVE +#include "lv_eve.h" + + +void lv_draw_eve_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc) +{ + + if(dsc->width == 0) + return; + if(dsc->opa <= LV_OPA_MIN) + return; + if(dsc->p1.x == dsc->p2.x && dsc->p1.y == dsc->p2.y) + return; + + + + uint32_t line_w = dsc->width * 8; + lv_eve_scissor(t->clip_area.x1, t->clip_area.y1, t->clip_area.x2, t->clip_area.y2); + lv_eve_save_context(); + lv_eve_color_opa(dsc->opa); + lv_eve_color(dsc->color); + + if(dsc->dash_gap || dsc->dash_width) { + LV_LOG_WARN("line dash_gap and dash_width not implemented by EVE yet."); + } + /* Check if it's a vertical or horizontal line without rounding */ + bool is_vertical = (dsc->p1.x == dsc->p2.x); + bool is_horizontal = (dsc->p1.y == dsc->p2.y); + bool no_round = (!dsc->round_end || !dsc->round_start); + + if((is_vertical || is_horizontal) && no_round) { + lv_eve_primitive(LV_EVE_PRIMITIVE_RECTS); + lv_eve_vertex_2f(dsc->p1.x, dsc->p1.y); + lv_eve_vertex_2f(dsc->p2.x, dsc->p2.y); + } + else { + /* Draw inclined line or line with rounding (not possible without rounding)*/ + lv_eve_primitive(LV_EVE_PRIMITIVE_LINE_STRIP); + lv_eve_line_width(line_w); + lv_eve_vertex_2f(dsc->p1.x, dsc->p1.y); + lv_eve_vertex_2f(dsc->p2.x, dsc->p2.y); + } + + lv_eve_restore_context(); +} + +#endif /*LV_USE_DRAW_EVE*/ diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_private.h b/inc/lvgl/src/draw/eve/lv_draw_eve_private.h new file mode 100644 index 0000000..1309c2e --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_private.h @@ -0,0 +1,117 @@ +/** + * @file lv_draw_eve_private.h + * + */ + +/* Author: juanj + * + * Modified by LVGL + */ + +#ifndef LV_DRAW_EVE_PRIVATE_H +#define LV_DRAW_EVE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_eve.h" +#if LV_USE_DRAW_EVE + +#include "lv_draw_eve_target.h" +#include "lv_draw_eve_ram_g.h" +#include "../lv_draw_private.h" +#include "../../misc/lv_types.h" +#include "../../core/lv_global.h" +#include "../lv_draw_triangle.h" +#include "../lv_draw_line.h" +#include "../lv_draw_label.h" +#include "../../font/fmt_txt/lv_font_fmt_txt.h" +#include "../lv_draw_arc.h" + +#if LV_DRAW_EVE_WRITE_BUFFER_SIZE != 0 && LV_DRAW_EVE_WRITE_BUFFER_SIZE < 4 +#warning LV_DRAW_EVE_WRITE_BUFFER_SIZE cannot be less than 4. Using 0 (buffering disabled). +#define LV_DRAW_EVE_WRITE_BUFFER_SIZE_INTERNAL 0 +#else +#define LV_DRAW_EVE_WRITE_BUFFER_SIZE_INTERNAL LV_DRAW_EVE_WRITE_BUFFER_SIZE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uintptr_t key; + uint32_t addr; +} lv_draw_eve_ramg_hash_table_cell_t; + +typedef struct { + uint32_t ramg_addr_end; + uint32_t hash_table_cell_count; + uint32_t hash_table_cells_occupied; + lv_draw_eve_ramg_hash_table_cell_t * hash_table; +} lv_draw_eve_ramg_t; + +struct _lv_draw_eve_unit_t { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; + lv_display_t * disp; + lv_draw_eve_ramg_t ramg; + lv_draw_eve_parameters_t params; + lv_draw_eve_operation_cb_t op_cb; +#if LV_DRAW_EVE_WRITE_BUFFER_SIZE_INTERNAL + uint32_t lv_eve_write_buf_len; + uint8_t lv_eve_write_buf[LV_DRAW_EVE_WRITE_BUFFER_SIZE_INTERNAL]; +#endif +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_eve_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); +bool lv_draw_eve_image_src_check(const void * src); +uint32_t lv_draw_eve_image_upload_image(bool burst_is_active, const lv_image_dsc_t * img_dsc); + +void lv_draw_eve_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_eve_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_eve_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc); + +void lv_draw_eve_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); +bool lv_draw_eve_label_font_check(const lv_font_t * font); +uint32_t lv_draw_eve_label_upload_glyph(bool burst_is_active, const lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t gid_index); + +void lv_draw_eve_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_eve_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#define DEGREES(n) ((65536UL * (n)) / 3600) +#define F16(x) ((int32_t)((x) * 65536L)) + +#define lv_draw_eve_unit_g (LV_GLOBAL_DEFAULT()->draw_eve_unit) + +#endif /*LV_USE_DRAW_EVE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_EVE_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_ram_g.c b/inc/lvgl/src/draw/eve/lv_draw_eve_ram_g.c new file mode 100644 index 0000000..1ad544c --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_ram_g.c @@ -0,0 +1,221 @@ +/** + * @file lv_draw_eve_ram_g.c + * + */ + +/* Created on: 19 nov 2023 + * Author: juanj + * + * Modified by LVGL + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_eve_private.h" +#if LV_USE_DRAW_EVE +#include "lv_draw_eve_ram_g.h" +#include "lv_eve.h" + +/********************* + * DEFINES + *********************/ + +#define RAMG_DEBUG 0 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void ramg_init(lv_draw_eve_ramg_t * ramg); +static uint32_t hash_key(uintptr_t key); +static uint32_t fnv_1a_hash(const void * src, size_t len); +static void grow_hash_table(lv_draw_eve_ramg_t * ramg); + +#if RAMG_DEBUG + static void ramg_debug(lv_draw_eve_ramg_t * ramg, uint32_t key_hash, uint32_t table_index); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_draw_eve_ramg_get_addr(uint32_t * addr_dst, uintptr_t key, + uint32_t addr_size, uint32_t addr_align) +{ + LV_ASSERT(key != 0); + + lv_draw_eve_ramg_t * ramg = &lv_draw_eve_unit_g->ramg; + + if(ramg->hash_table_cell_count == 0) { + ramg_init(ramg); + } + + uint32_t key_hash = hash_key(key); + uint32_t table_index = key_hash % ramg->hash_table_cell_count; + lv_draw_eve_ramg_hash_table_cell_t * cell; + + while(1) { + cell = &ramg->hash_table[table_index]; + + if(cell->key == key) { +#if RAMG_DEBUG + ramg_debug(ramg, key_hash, table_index); +#endif + + *addr_dst = cell->addr; + return true; + } + + if(cell->key == 0) { + break; + } + + table_index++; + if(table_index >= ramg->hash_table_cell_count) table_index = 0; + } + + uint32_t addr_ret = LV_ALIGN_UP(ramg->ramg_addr_end, addr_align); + uint32_t addr_new_end = addr_ret + addr_size; + + if(addr_new_end > 1024 * 1024) { + LV_LOG_WARN("EVE on-chip 1 MB RAM_G for images and fonts has run out."); + *addr_dst = LV_DRAW_EVE_RAMG_OUT_OF_RAMG; + return false; + } + + ramg->ramg_addr_end = addr_new_end; + ramg->hash_table_cells_occupied++; + + cell->key = key; + cell->addr = addr_ret; + *addr_dst = addr_ret; + +#if RAMG_DEBUG + ramg_debug(ramg, key_hash, table_index); +#endif + + if(ramg->hash_table_cells_occupied > ramg->hash_table_cell_count / 4 * 3) { + grow_hash_table(ramg); + } + + return false; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void ramg_init(lv_draw_eve_ramg_t * ramg) +{ + ramg->hash_table_cell_count = 32; + ramg->hash_table = lv_calloc(32, sizeof(lv_draw_eve_ramg_hash_table_cell_t)); + LV_ASSERT_MALLOC(ramg->hash_table); +} + +static uint32_t hash_key(uintptr_t key) +{ + return fnv_1a_hash(&key, sizeof(key)); +} + +static uint32_t fnv_1a_hash(const void * src, size_t len) +{ + const uint8_t * src_u8 = src; + uint32_t hash = 2166136261u; + for(size_t i = 0; i < len; i++) { + hash ^= src_u8[i]; + hash *= 16777619u; + } + return hash; +} + +static void grow_hash_table(lv_draw_eve_ramg_t * ramg) +{ + uint32_t old_cell_count = ramg->hash_table_cell_count; + lv_draw_eve_ramg_hash_table_cell_t * old_hash_table = ramg->hash_table; + + ramg->hash_table_cell_count += ramg->hash_table_cell_count / 2; + ramg->hash_table = lv_calloc(ramg->hash_table_cell_count, + sizeof(lv_draw_eve_ramg_hash_table_cell_t)); + LV_ASSERT_MALLOC(ramg->hash_table); + + for(uint32_t i = 0; i < old_cell_count; i++) { + lv_draw_eve_ramg_hash_table_cell_t * old_cell = &old_hash_table[i]; + + if(old_cell->key == 0) continue; + + uint32_t key_hash = hash_key(old_cell->key); + uint32_t new_table_index = key_hash % ramg->hash_table_cell_count; + lv_draw_eve_ramg_hash_table_cell_t * new_cell_dst = &ramg->hash_table[new_table_index]; + + while(new_cell_dst->key != 0) { + new_table_index++; + if(new_table_index >= ramg->hash_table_cell_count) new_table_index = 0; + new_cell_dst = &ramg->hash_table[new_table_index]; + } + *new_cell_dst = *old_cell; + } + + lv_free(old_hash_table); +} + +#if RAMG_DEBUG +/* +Print tables like this: + 113 kB of RAM_G used + ================================-==-=====---=---===---=====-=-=-=-==--=======----=-==-==---=--===--=-=-========================= + ========^$==========--=-==-=-=--=--=========---=----========-------===--=====----=======--=====--====--=====-=--=-= + +'-' unoccupied cells +'=' occupied cells +'^' where the hash pointed to in the table initially and linear probing started +'$' where linear probing ended because a matching or unoccupied cell + was found. This symbol is not shown if the initial guess was correct. + +This example has 244 cells. Each cell uses 8 bytes of local RAM, so just under 2 kB. +Each cell represents an allocation in EVE RAM_G. The RAM_G allocation sizes are not +represented in this table, except for the overall "113 kB of RAM_G used" message. +*/ +static void ramg_debug(lv_draw_eve_ramg_t * ramg, uint32_t key_hash, uint32_t table_index) +{ + uint32_t table_index_initial_guess = key_hash % ramg->hash_table_cell_count; + + lv_log("%u kB of RAM_G used\n", (unsigned) ramg->ramg_addr_end / 1024); + + for(uint32_t i = 0; i < ramg->hash_table_cell_count; i++) { + if(i != 0 && i % 128 == 0) { + lv_log("\n"); + } + + if(i == table_index_initial_guess) { + lv_log("^"); + } + else if(i == table_index) { + lv_log("$"); + } + else if(ramg->hash_table[i].key) { + lv_log("="); + } + else { + lv_log("-"); + } + } + + lv_log("\n\n"); +} +#endif + +#endif/*LV_USE_EVE_DRAW*/ + diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_ram_g.h b/inc/lvgl/src/draw/eve/lv_draw_eve_ram_g.h new file mode 100644 index 0000000..ec6ae75 --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_ram_g.h @@ -0,0 +1,48 @@ +/** + * @file lv_draw_eve_ram_g.h + * + */ + +/* Created on: 19 nov 2023 + * Author: juanj + * + * Modified by LVGL + */ + +#ifndef LV_DRAW_EVE_RAM_G_H +#define LV_DRAW_EVE_RAM_G_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_eve.h" +#if LV_USE_DRAW_EVE + +/********************* + * DEFINES + *********************/ + +#define LV_DRAW_EVE_RAMG_OUT_OF_RAMG UINT32_MAX + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +bool lv_draw_eve_ramg_get_addr(uint32_t * addr_dst, uintptr_t key, + uint32_t addr_size, uint32_t addr_align); + +#endif/*LV_USE_DRAW_EVE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_DRAW_EVE_RAM_G_H */ diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_target.h b/inc/lvgl/src/draw/eve/lv_draw_eve_target.h new file mode 100644 index 0000000..90e938b --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_target.h @@ -0,0 +1,79 @@ +/** + * @file lv_draw_eve_target.h + * + */ + +#ifndef LV_DRAW_EVE_TARGET_H +#define LV_DRAW_EVE_TARGET_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_DRAW_EVE + +#include "../../misc/lv_types.h" +#include LV_STDBOOL_INCLUDE +#include LV_STDINT_INCLUDE + +typedef struct { + uint16_t hor_res; /**< active display width */ + uint16_t ver_res; /**< active display height */ + uint16_t hcycle; /**< total number of clocks per line, incl front/back porch */ + uint16_t hoffset; /**< start of active line */ + uint16_t hsync0; /**< start of horizontal sync pulse */ + uint16_t hsync1; /**< end of horizontal sync pulse */ + uint16_t vcycle; /**< total number of lines per screen, including pre/post */ + uint16_t voffset; /**< start of active screen */ + uint16_t vsync0; /**< start of vertical sync pulse */ + uint16_t vsync1; /**< end of vertical sync pulse */ + uint8_t swizzle; /**< FT8xx output to LCD - pin order */ + uint8_t pclkpol; /**< LCD data is clocked in on this PCLK edge */ + uint8_t cspread; /**< helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ + uint8_t pclk; /**< 60MHz / pclk = pclk frequency */ + bool has_crystal; /**< has an external clock crystal */ + bool has_gt911; /**< has a touch controller */ + uint8_t backlight_pwm; /**< backlight PWM duty cycle 0 = off, 128 = max */ + uint16_t backlight_freq; /**< backlight PWM frequency. try 4000 if unsure */ +} lv_draw_eve_parameters_t; + +typedef enum { + LV_DRAW_EVE_OPERATION_POWERDOWN_SET, /**< set the "PD_N" pin low */ + LV_DRAW_EVE_OPERATION_POWERDOWN_CLEAR, /**< set the "PD_N" pin high */ + LV_DRAW_EVE_OPERATION_CS_ASSERT, /**< set the "CS_N" pin low */ + LV_DRAW_EVE_OPERATION_CS_DEASSERT, /**< set the "CS_N" pin high */ + LV_DRAW_EVE_OPERATION_SPI_SEND, /**< send `length` bytes of `data` over SPI */ + LV_DRAW_EVE_OPERATION_SPI_RECEIVE /**< receive `length` bytes into `data` from SPI */ +} lv_draw_eve_operation_t; + +typedef void (*lv_draw_eve_operation_cb_t)(lv_display_t * disp, lv_draw_eve_operation_t operation, void * data, + uint32_t length); + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_EVE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_EVE_TARGET_H*/ diff --git a/inc/lvgl/src/draw/eve/lv_draw_eve_triangle.c b/inc/lvgl/src/draw/eve/lv_draw_eve_triangle.c new file mode 100644 index 0000000..b48411f --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_draw_eve_triangle.c @@ -0,0 +1,127 @@ +/** + * @file lv_draw_eve_triangle.c + * + */ + +/* Created on: 10 ene 2024 + * Author: juanj + * + * Modified by LVGL + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_eve_private.h" +#if LV_USE_DRAW_EVE + +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_mem.h" +#include "../../misc/lv_area_private.h" +#include "../../misc/lv_color.h" +#include "../../stdlib/lv_string.h" +#include "lv_eve.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_eve_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc) +{ + + lv_area_t tri_area; + tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + bool is_common; + lv_area_t draw_area; + is_common = lv_area_intersect(&draw_area, &tri_area, &t->clip_area); + if(!is_common) return; + + lv_point_t p[3]; + /*If there is a vertical side use it as p[0] and p[1]*/ + if(dsc->p[0].x == dsc->p[1].x) { + p[0] = lv_point_from_precise(&dsc->p[0]); + p[1] = lv_point_from_precise(&dsc->p[1]); + p[2] = lv_point_from_precise(&dsc->p[2]); + } + else if(dsc->p[0].x == dsc->p[2].x) { + p[0] = lv_point_from_precise(&dsc->p[0]); + p[1] = lv_point_from_precise(&dsc->p[2]); + p[2] = lv_point_from_precise(&dsc->p[1]); + } + else if(dsc->p[1].x == dsc->p[2].x) { + p[0] = lv_point_from_precise(&dsc->p[1]); + p[1] = lv_point_from_precise(&dsc->p[2]); + p[2] = lv_point_from_precise(&dsc->p[0]); + } + else { + p[0] = lv_point_from_precise(&dsc->p[0]); + p[1] = lv_point_from_precise(&dsc->p[1]); + p[2] = lv_point_from_precise(&dsc->p[2]); + + /*Set the smallest y as p[0]*/ + if(p[0].y > p[1].y) lv_point_swap(&p[0], &p[1]); + if(p[0].y > p[2].y) lv_point_swap(&p[0], &p[2]); + + /*Set the greatest y as p[1]*/ + if(p[1].y < p[2].y) lv_point_swap(&p[1], &p[2]); + } + + /*Be sure p[0] is on the top*/ + if(p[0].y > p[1].y) lv_point_swap(&p[0], &p[1]); + + lv_eve_save_context(); + + lv_eve_scissor(t->clip_area.x1, t->clip_area.y1, t->clip_area.x2, t->clip_area.y2); + + lv_eve_color(dsc->color); + lv_eve_color_opa(dsc->opa); + + lv_eve_color_mask(0, 0, 0, 0); + lv_eve_stencil_op(EVE_KEEP, EVE_INVERT); + lv_eve_stencil_func(EVE_ALWAYS, 255, 255); + lv_eve_primitive(LV_EVE_PRIMITIVE_EDGE_STRIP_A); + + lv_eve_vertex_2f(p[0].x, p[0].y); + lv_eve_vertex_2f(p[1].x, p[1].y); + lv_eve_vertex_2f(p[2].x, p[2].y); + + lv_eve_color_mask(1, 1, 1, 1); + lv_eve_stencil_func(EVE_EQUAL, 255, 255) ; + + lv_eve_vertex_2f(0, 0); + lv_eve_vertex_2f(1022, 0); + + lv_eve_restore_context(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_EVE*/ + + diff --git a/inc/lvgl/src/draw/eve/lv_eve.c b/inc/lvgl/src/draw/eve/lv_eve.c new file mode 100644 index 0000000..145c4c7 --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_eve.c @@ -0,0 +1,265 @@ +/** + * @file lv_eve.c + * + */ + +/* Created on: 8 jun 2023 + * Author: juanj + * + * Modified by LVGL + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_eve.h" +#if LV_USE_DRAW_EVE +#include "lv_eve.h" +#include "../../libs/FT800-FT813/EVE_commands.h" + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +static uint16_t scissor_x1 = 0; +static uint16_t scissor_y1 = 0; +static uint16_t scissor_x2 = 0; +static uint16_t scissor_y2 = 0; + +static lv_eve_drawing_context_t ct = { + .primitive = LV_EVE_PRIMITIVE_ZERO_VALUE, + .color = {0xff, 0xff, 0xff}, + .opa = 255, + .line_width = 1, /* for format(0) */ + .point_size = 1, + .color_mask = {1, 1, 1, 1}, + .stencil_func = {EVE_ALWAYS, 0, 255}, + .stencil_op = {EVE_KEEP, EVE_KEEP}, + .blend_func = {EVE_SRC_ALPHA, EVE_ONE_MINUS_SRC_ALPHA}, + .scx = 0, + .scy = 0, +}; + +static lv_eve_drawing_context_t ct_temp; + +static lv_eve_drawing_state_t st; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_eve_save_context(void) +{ + EVE_cmd_dl_burst(DL_SAVE_CONTEXT); + ct_temp = ct; +} + +void lv_eve_restore_context(void) +{ + EVE_cmd_dl_burst(DL_RESTORE_CONTEXT); + ct = ct_temp; +} + + +void lv_eve_primitive(uint8_t context) +{ + if(context != ct.primitive && context != LV_EVE_PRIMITIVE_ZERO_VALUE) { + EVE_cmd_dl_burst(DL_BEGIN | context); + ct.primitive = context; + } +} + +void lv_eve_scissor(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) +{ + if(x1 != scissor_x1 || y1 != scissor_y1) { + int16_t adjusted_x1 = x1 > 0 ? x1 - 1 : 0; + int16_t adjusted_y1 = y1 > 0 ? y1 - 1 : 0; + EVE_cmd_dl_burst(SCISSOR_XY(adjusted_x1, adjusted_y1)); + scissor_x1 = x1; + scissor_y1 = y1; + } + + if(x2 != scissor_x2 || y2 != scissor_y2) { + uint16_t w = x2 - x1 + 3; + uint16_t h = y2 - y1 + 3; + EVE_cmd_dl_burst(SCISSOR_SIZE(w, h)); + scissor_x2 = x2; + scissor_y2 = y2; + } +} + +void lv_eve_color(lv_color_t color) +{ + if((ct.color.red != color.red) || (ct.color.green != color.green) || (ct.color.blue != color.blue)) { + EVE_cmd_dl_burst(COLOR_RGB(color.red, color.green, color.blue)); + ct.color = color; + } +} + +void lv_eve_color_mask(uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + if((ct.color_mask[0] != r) || + (ct.color_mask[1] != g) || + (ct.color_mask[2] != b) || + (ct.color_mask[3] != a)) { + + EVE_cmd_dl_burst(COLOR_MASK(r, g, b, a)); + ct.color_mask[0] = r; + ct.color_mask[1] = g; + ct.color_mask[2] = b; + ct.color_mask[3] = a; + } +} + +void lv_eve_stencil_func(uint8_t func, uint8_t ref, uint8_t mask) +{ + if(func != ct.stencil_func[0] || ref != ct.stencil_func[1] || mask != ct.stencil_func[2]) { + + EVE_cmd_dl_burst(STENCIL_FUNC(func, ref, mask)); + ct.stencil_func[0] = func; + ct.stencil_func[1] = ref; + ct.stencil_func[2] = mask; + } +} + +void lv_eve_stencil_op(uint8_t sfail, uint8_t spass) +{ + if(sfail != ct.stencil_op[0] || spass != ct.stencil_op[1]) { + EVE_cmd_dl_burst(STENCIL_OP(sfail, spass)); + ct.stencil_op[0] = sfail; + ct.stencil_op[1] = spass; + + } +} + +void lv_eve_blend_func(uint8_t src, uint8_t dst) +{ + if(src != ct.blend_func[0] || dst != ct.blend_func[1]) { + EVE_cmd_dl_burst(BLEND_FUNC(src, dst)); + ct.blend_func[0] = src; + ct.blend_func[1] = dst; + } +} + +void lv_eve_color_opa(lv_opa_t opa) +{ + if(opa != ct.opa) { + EVE_cmd_dl_burst(COLOR_A(opa)); + ct.opa = opa; + } +} + +void lv_eve_line_width(int32_t width) +{ + if(width != ct.line_width) { + EVE_cmd_dl_burst(LINE_WIDTH(width)); + ct.line_width = width; + } +} + +void lv_eve_point_size(uint16_t radius) +{ + if(radius != ct.point_size) { + EVE_cmd_dl_burst(POINT_SIZE(radius * 16)); + ct.point_size = radius; + } +} + +void lv_eve_vertex_2f(int16_t x, int16_t y) +{ + EVE_cmd_dl_burst(VERTEX2F(x, y)); +} + +void lv_eve_draw_circle_simple(int16_t coord_x1, int16_t coord_y1, uint16_t radius_t) +{ + lv_eve_primitive(LV_EVE_PRIMITIVE_POINTS); + lv_eve_point_size(radius_t); + lv_eve_vertex_2f(coord_x1, coord_y1); +} + + +void lv_eve_draw_rect_simple(int16_t coord_x1, int16_t coord_y1, int16_t coord_x2, int16_t coord_y2, uint16_t radius) +{ + lv_eve_primitive(LV_EVE_PRIMITIVE_RECTS); + if(radius > 1) { + lv_eve_line_width(radius * 16); + } + + lv_eve_vertex_2f(coord_x1 + radius, coord_y1 + radius); + lv_eve_vertex_2f(coord_x2 - radius, coord_y2 - radius); +} + +void lv_eve_mask_round(int16_t coord_x1, int16_t coord_y1, int16_t coord_x2, int16_t coord_y2, int16_t radius) +{ + lv_eve_color_mask(0, 0, 0, 1); + EVE_cmd_dl_burst(CLEAR(1, 1, 1)); + + + lv_eve_draw_rect_simple(coord_x1, coord_y1, coord_x2, coord_y2, radius); + lv_eve_color_mask(1, 1, 1, 0); + lv_eve_blend_func(EVE_DST_ALPHA, EVE_ONE_MINUS_DST_ALPHA); +} + +void lv_eve_bitmap_source(uint32_t addr) +{ + uint32_t bitmap_source = BITMAP_SOURCE(addr); + if(st.bitmap_source != bitmap_source) { + EVE_cmd_dl_burst(bitmap_source); + st.bitmap_source = bitmap_source; + } +} + +void lv_eve_bitmap_size(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height) +{ + uint32_t bitmap_size = BITMAP_SIZE(filter, wrapx, wrapy, width, height); + if(st.bitmap_size != bitmap_size) { + EVE_cmd_dl_burst(bitmap_size); + st.bitmap_size = bitmap_size; + } + /* set the high bits too, of the width and height */ + uint32_t bitmap_size_h = BITMAP_SIZE_H(width, height); + if(st.bitmap_size_h != bitmap_size_h) { + EVE_cmd_dl_burst(bitmap_size_h); + st.bitmap_size_h = bitmap_size_h; + } +} + +void lv_eve_bitmap_layout(uint8_t format, uint16_t linestride, uint16_t height) +{ + uint32_t bitmap_layout = BITMAP_LAYOUT(format, linestride, height); + if(st.bitmap_layout != bitmap_layout) { + EVE_cmd_dl_burst(bitmap_layout); + st.bitmap_layout = bitmap_layout; + } + /* set the high bits too, of the linestride and height */ + uint32_t bitmap_layout_h = BITMAP_LAYOUT_H(linestride, height); + if(st.bitmap_layout_h != bitmap_layout_h) { + EVE_cmd_dl_burst(bitmap_layout_h); + st.bitmap_layout_h = bitmap_layout_h; + } +} + + + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_EVE*/ diff --git a/inc/lvgl/src/draw/eve/lv_eve.h b/inc/lvgl/src/draw/eve/lv_eve.h new file mode 100644 index 0000000..b48bd11 --- /dev/null +++ b/inc/lvgl/src/draw/eve/lv_eve.h @@ -0,0 +1,151 @@ +/** + * @file lv_eve.h + * + */ + +/* Created on: 8 jun 2023 + * Author: juanj + * + * Modified by LVGL + */ + +#ifndef LV_EVE_H +#define LV_EVE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_eve.h" + +#if LV_USE_DRAW_EVE + +#include "../../misc/lv_types.h" +#include "../../misc/lv_color.h" +#include "../../libs/FT800-FT813/EVE.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_EVE_PRIMITIVE_ZERO_VALUE, + LV_EVE_PRIMITIVE_BITMAPS = 1UL, /* Bitmap drawing primitive */ + LV_EVE_PRIMITIVE_POINTS = 2UL, /* Point drawing primitive */ + LV_EVE_PRIMITIVE_LINES = 3UL, /* Line drawing primitive */ + LV_EVE_PRIMITIVE_LINE_STRIP = 4UL, /* Line strip drawing primitive */ + LV_EVE_PRIMITIVE_EDGE_STRIP_R = 5UL, /* Edge strip right side drawing primitive */ + LV_EVE_PRIMITIVE_EDGE_STRIP_L = 6UL, /* Edge strip left side drawing primitive */ + LV_EVE_PRIMITIVE_EDGE_STRIP_A = 7UL, /* Edge strip above drawing primitive */ + LV_EVE_PRIMITIVE_EDGE_STRIP_B = 8UL, /* Edge strip below side drawing primitive */ + LV_EVE_PRIMITIVE_RECTS = 9UL, /* Rectangle drawing primitive */ +} lv_eve_primitive_t; + + +typedef struct { + lv_eve_primitive_t primitive; + lv_color_t color; + lv_opa_t opa; + int32_t line_width; + uint16_t point_size; + uint8_t color_mask[4]; + uint8_t stencil_func[3]; + uint8_t stencil_op[2]; + uint8_t blend_func[2]; + uint16_t scx; + uint16_t scy; +} lv_eve_drawing_context_t; + +/* drawing context that is not saved and restored + * by SAVE_CONTEXT and RESTORE_CONTEXT + */ +typedef struct { + uint32_t bitmap_source; + uint32_t bitmap_size; + uint32_t bitmap_size_h; + uint32_t bitmap_layout; + uint32_t bitmap_layout_h; +} lv_eve_drawing_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_eve_save_context(void); +void lv_eve_restore_context(void); +void lv_eve_scissor(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); +void lv_eve_primitive(uint8_t context); +void lv_eve_color(lv_color_t color); +void lv_eve_color_opa(lv_opa_t opa); +void lv_eve_line_width(int32_t width); +void lv_eve_point_size(uint16_t radius); +void lv_eve_vertex_2f(int16_t x, int16_t y); +void lv_eve_color_mask(uint8_t r, uint8_t g, uint8_t b, uint8_t a); +void lv_eve_stencil_func(uint8_t func, uint8_t ref, uint8_t mask); +void lv_eve_stencil_op(uint8_t sfail, uint8_t spass); +void lv_eve_blend_func(uint8_t src, uint8_t dst); + +void lv_eve_draw_circle_simple(int16_t coord_x1, int16_t coord_y1, uint16_t radius_t); +void lv_eve_draw_rect_simple(int16_t coord_x1, int16_t coord_y1, int16_t coord_x2, int16_t coord_y2, + uint16_t radius); +void lv_eve_mask_round(int16_t coord_x1, int16_t coord_y1, int16_t coord_x2, int16_t coord_y2, int16_t radius); + +/** + * Set the bitmap source to `addr`. SPI transmission will occur unless it is already set to this value. + * The bitmap source is not part of the saved and restored context. + * @param addr the remote EVE memory address to set as the bitmap source + */ +void lv_eve_bitmap_source(uint32_t addr); + +/** + * Set the bitmap size and sampling parameters. SPI transmission will occur unless the currently set parameters are already these. + * The bitmap size is not part of the saved and restored context. + * @param filter the sampling method. Either EVE_NEAREST or EVE_BILINEAR + * @param wrapx the out of bounds sampling behavior in the X direction. Either EVE_BORDER or EVE_REPEAT + * @param wrapy the out of bounds sampling behavior in the Y direction. Either EVE_BORDER or EVE_REPEAT + * @param width the width of the bitmap in pixels + * @param height the height of the bitmap in pixels + */ +void lv_eve_bitmap_size(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height); + +/** + * Set the bitmap format/layout parameters. SPI transmission will occur unless the currently set parameters are already these. + * The bitmap layout is not part of the saved and restored context. + * @param format an eve color format value like EVE_RGB565 + * @param linestride the stride of the bitmap rows in bytes + * @param height the number of rows in the bitmap + */ +void lv_eve_bitmap_layout(uint8_t format, uint16_t linestride, uint16_t height); + +/********************** + * EXTERN VARIABLES + **********************/ + + +/********************** + * MACROS + **********************/ + +/********************** + * INLINE FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_EVE*/ + + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_EVE_H */ diff --git a/inc/lvgl/src/draw/lv_draw.c b/inc/lvgl/src/draw/lv_draw.c new file mode 100644 index 0000000..dc4ce22 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw.c @@ -0,0 +1,762 @@ +/** + * @file lv_draw.c + * + */ + +/** + * Modified by NXP in 2024 + */ + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_area_private.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_event_private.h" +#include "lv_draw_private.h" +#include "lv_draw_mask.h" +#include "lv_draw_vector_private.h" +#include "lv_draw_3d.h" +#include "sw/lv_draw_sw.h" +#include "../display/lv_display_private.h" +#include "../core/lv_global.h" +#include "../core/lv_refr_private.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define _draw_info LV_GLOBAL_DEFAULT()->draw_info + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check, uint8_t draw_unit_id); +static void cleanup_task(lv_draw_task_t * t, lv_display_t * disp); +static inline size_t get_draw_dsc_size(lv_draw_task_type_t type); +static lv_draw_task_t * get_first_available_task(lv_layer_t * layer); + +#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO +static inline uint32_t get_layer_size_kb(uint32_t size_byte) +{ + return (size_byte + 1023) >> 10; +} +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_init(void) +{ +#if LV_USE_OS + lv_thread_sync_init(&_draw_info.sync); +#endif +} + +void lv_draw_deinit(void) +{ +#if LV_USE_OS + lv_thread_sync_delete(&_draw_info.sync); +#endif + + lv_draw_unit_t * u = _draw_info.unit_head; + while(u) { + lv_draw_unit_t * cur_unit = u; + u = u->next; + + if(cur_unit->delete_cb) cur_unit->delete_cb(cur_unit); + lv_free(cur_unit); + } + _draw_info.unit_head = NULL; +} + +void * lv_draw_create_unit(size_t size) +{ + lv_draw_unit_t * new_unit = lv_malloc_zeroed(size); + LV_ASSERT_MALLOC(new_unit); + new_unit->next = _draw_info.unit_head; + + _draw_info.unit_head = new_unit; + _draw_info.unit_cnt++; + + new_unit->idx = _draw_info.unit_cnt; + + return new_unit; +} + +lv_draw_task_t * lv_draw_add_task(lv_layer_t * layer, const lv_area_t * coords, lv_draw_task_type_t type) +{ + LV_PROFILER_DRAW_BEGIN; + size_t dsc_size = get_draw_dsc_size(type); + LV_ASSERT_FORMAT_MSG(dsc_size > 0, "Draw task size is 0 for type %d", type); + lv_draw_task_t * new_task = lv_malloc_zeroed(LV_ALIGN_UP(sizeof(lv_draw_task_t), 8) + dsc_size); + LV_ASSERT_MALLOC(new_task); + new_task->area = *coords; + new_task->_real_area = *coords; + new_task->target_layer = layer; + new_task->clip_area = layer->_clip_area; +#if LV_DRAW_TRANSFORM_USE_MATRIX + new_task->matrix = layer->matrix; +#endif + new_task->opa = layer->opa; + new_task->type = type; + new_task->draw_dsc = (uint8_t *)new_task + LV_ALIGN_UP(sizeof(lv_draw_task_t), 8); + new_task->state = LV_DRAW_TASK_STATE_WAITING; + + /*Find the tail*/ + if(layer->draw_task_head == NULL) { + layer->draw_task_head = new_task; + } + else { + lv_draw_task_t * tail = layer->draw_task_head; + while(tail->next) tail = tail->next; + + tail->next = new_task; + } + + LV_PROFILER_DRAW_END; + return new_task; +} + +void lv_draw_finalize_task_creation(lv_layer_t * layer, lv_draw_task_t * t) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_dsc_base_t * base_dsc = t->draw_dsc; + base_dsc->layer = layer; + + lv_draw_global_info_t * info = &_draw_info; + + /*Send LV_EVENT_DRAW_TASK_ADDED and dispatch only on the "main" draw_task + *and not on the draw tasks added in the event. + *Sending LV_EVENT_DRAW_TASK_ADDED events might cause recursive event sends and besides + *dispatching might remove the "main" draw task while it's still being used in the event*/ + + if(info->task_running == false) { + if(base_dsc->obj && lv_obj_has_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS)) { + info->task_running = true; + lv_obj_send_event(base_dsc->obj, LV_EVENT_DRAW_TASK_ADDED, t); + info->task_running = false; + } + + /*Let the draw units set their preference score*/ + t->preference_score = 100; + t->preferred_draw_unit_id = 0; + lv_draw_unit_t * u = info->unit_head; + while(u) { + if(u->evaluate_cb) { + LV_PROFILER_DRAW_BEGIN_TAG("evaluate_cb"); + LV_PROFILER_DRAW_BEGIN_TAG(u->name); + u->evaluate_cb(u, t); + LV_PROFILER_DRAW_END_TAG(u->name); + LV_PROFILER_DRAW_END_TAG("evaluate_cb"); + } + u = u->next; + } + if(t->preferred_draw_unit_id == LV_DRAW_UNIT_NONE) { + LV_LOG_WARN("the draw task was not taken by any units"); + t->state = LV_DRAW_TASK_STATE_FINISHED; + } + else { + lv_draw_dispatch(); + } + } + else { + /*Let the draw units set their preference score*/ + t->preference_score = 100; + t->preferred_draw_unit_id = 0; + lv_draw_unit_t * u = info->unit_head; + while(u) { + if(u->evaluate_cb) { + LV_PROFILER_DRAW_BEGIN_TAG("evaluate_cb"); + LV_PROFILER_DRAW_BEGIN_TAG(u->name); + u->evaluate_cb(u, t); + LV_PROFILER_DRAW_END_TAG(u->name); + LV_PROFILER_DRAW_END_TAG("evaluate_cb"); + } + u = u->next; + } + } + LV_PROFILER_DRAW_END; +} + +void lv_draw_wait_for_finish(void) +{ +#if LV_USE_OS + LV_PROFILER_DRAW_BEGIN; + lv_draw_unit_t * u = _draw_info.unit_head; + while(u) { + if(u->wait_for_finish_cb) { + LV_PROFILER_DRAW_BEGIN_TAG("wait_for_finish_cb"); + LV_PROFILER_DRAW_BEGIN_TAG(u->name); + u->wait_for_finish_cb(u); + LV_PROFILER_DRAW_END_TAG(u->name); + LV_PROFILER_DRAW_END_TAG("wait_for_finish_cb"); + } + u = u->next; + } + LV_PROFILER_DRAW_END; +#endif +} + +void lv_draw_dispatch(void) +{ + LV_PROFILER_DRAW_BEGIN; + bool task_dispatched = false; + lv_display_t * disp = lv_refr_get_disp_refreshing(); + if(disp != NULL) { + lv_layer_t * layer = disp->layer_head; + while(layer) { + if(lv_draw_dispatch_layer(disp, layer)) + task_dispatched = true; + layer = layer->next; + } + } + if(!task_dispatched) { + lv_draw_wait_for_finish(); + lv_draw_dispatch_request(); + } + LV_PROFILER_DRAW_END; +} + +bool lv_draw_dispatch_layer(lv_display_t * disp, lv_layer_t * layer) +{ + LV_PROFILER_DRAW_BEGIN; + /*Remove the finished tasks first*/ + lv_draw_task_t * t_prev = NULL; + lv_draw_task_t * t = layer->draw_task_head; + lv_draw_task_t * t_next; + bool remove_task = false; + while(t) { + t_next = t->next; + if(t->state == LV_DRAW_TASK_STATE_FINISHED) { + cleanup_task(t, disp); + remove_task = true; + if(t_prev != NULL) + t_prev->next = t_next; + else + layer->draw_task_head = t_next; + } + else { + t_prev = t; + } + t = t_next; + } + + bool task_dispatched = false; + + /*This layer is ready, enable blending its buffer*/ + if(layer->parent && layer->all_tasks_added && layer->draw_task_head == NULL) { + /*Find a draw task with TYPE_LAYER in the layer where the src is this layer*/ + lv_draw_task_t * t_src = layer->parent->draw_task_head; + while(t_src) { + if(t_src->type == LV_DRAW_TASK_TYPE_LAYER && t_src->state == LV_DRAW_TASK_STATE_BLOCKED) { + lv_draw_image_dsc_t * draw_dsc = t_src->draw_dsc; + if(draw_dsc->src == layer) { + t_src->state = LV_DRAW_TASK_STATE_WAITING; + lv_draw_dispatch_request(); + break; + } + } + t_src = t_src->next; + } + } + /*Assign draw tasks to the draw_units*/ + else if(remove_task || layer->draw_task_head) { + /*Find a draw unit which is not busy and can take at least one task*/ + /*Let all draw units to pick draw tasks*/ + lv_draw_unit_t * u = _draw_info.unit_head; + while(u) { + LV_PROFILER_DRAW_BEGIN_TAG("dispatch_cb"); + LV_PROFILER_DRAW_BEGIN_TAG(u->name); + int32_t taken_cnt = u->dispatch_cb(u, layer); + LV_PROFILER_DRAW_END_TAG(u->name); + LV_PROFILER_DRAW_END_TAG("dispatch_cb"); + if(taken_cnt != LV_DRAW_UNIT_IDLE) task_dispatched = true; + u = u->next; + } + } + + LV_PROFILER_DRAW_END; + return task_dispatched; +} + +void lv_draw_dispatch_wait_for_request(void) +{ + LV_PROFILER_DRAW_BEGIN; +#if LV_USE_OS + lv_thread_sync_wait(&_draw_info.sync); +#else + while(!_draw_info.dispatch_req); + _draw_info.dispatch_req = 0; +#endif + LV_PROFILER_DRAW_END; +} + +void lv_draw_dispatch_request(void) +{ + LV_PROFILER_DRAW_BEGIN; +#if LV_USE_OS + lv_thread_sync_signal(&_draw_info.sync); +#else + _draw_info.dispatch_req = 1; +#endif + LV_PROFILER_DRAW_END; +} + +uint32_t lv_draw_get_unit_count(void) +{ + return _draw_info.unit_cnt; +} + +lv_draw_task_t * lv_draw_get_available_task(lv_layer_t * layer, lv_draw_task_t * t_prev, uint8_t draw_unit_id) +{ + if(_draw_info.unit_cnt == 1) { + return get_first_available_task(layer); + } + else { + return lv_draw_get_next_available_task(layer, t_prev, draw_unit_id); + } +} + +lv_draw_task_t * lv_draw_get_next_available_task(lv_layer_t * layer, lv_draw_task_t * t_prev, uint8_t draw_unit_id) +{ + LV_PROFILER_DRAW_BEGIN; + + /*If the first task is screen sized, there cannot be independent areas*/ + if(layer->draw_task_head) { + int32_t hor_res = lv_display_get_horizontal_resolution(lv_refr_get_disp_refreshing()); + int32_t ver_res = lv_display_get_vertical_resolution(lv_refr_get_disp_refreshing()); + lv_draw_task_t * t = layer->draw_task_head; + if(t->state != LV_DRAW_TASK_STATE_WAITING && + t->area.x1 <= 0 && t->area.x2 >= hor_res - 1 && + t->area.y1 <= 0 && t->area.y2 >= ver_res - 1) { + LV_PROFILER_DRAW_END; + return NULL; + } + } + + lv_draw_task_t * t = t_prev ? t_prev->next : layer->draw_task_head; + while(t) { + /*Find a draw task for this draw unit which is waiting and independent?*/ + if((t->preferred_draw_unit_id == draw_unit_id || t->preferred_draw_unit_id == LV_DRAW_UNIT_NONE) && + t->state == LV_DRAW_TASK_STATE_WAITING && + is_independent(layer, t, draw_unit_id)) { + LV_PROFILER_DRAW_END; + return t; + } + + t = t->next; + } + + LV_PROFILER_DRAW_END; + return NULL; +} + +uint32_t lv_draw_get_dependent_count(lv_draw_task_t * t_check) +{ + if(t_check == NULL) return 0; + if(t_check->next == NULL) return 0; + + LV_PROFILER_DRAW_BEGIN; + uint32_t cnt = 0; + + lv_draw_task_t * t = t_check->next; + while(t) { + if((t->state == LV_DRAW_TASK_STATE_WAITING || t->state == LV_DRAW_TASK_STATE_BLOCKED) && + lv_area_is_on(&t_check->area, &t->area)) { + cnt++; + } + + t = t->next; + } + LV_PROFILER_DRAW_END; + return cnt; +} + +void lv_draw_unit_send_event(const char * name, lv_event_code_t code, void * param) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_event_t event = { 0 }; + event.code = code; + event.param = param; + lv_draw_unit_t * u = _draw_info.unit_head; + while(u) { + if(u->event_cb && (!name || lv_strcmp(name, u->name) == 0)) { + event.current_target = event.original_target = u; + LV_PROFILER_DRAW_BEGIN_TAG("event_cb"); + LV_PROFILER_DRAW_BEGIN_TAG(u->name); + u->event_cb(&event); + LV_PROFILER_DRAW_END_TAG(u->name); + LV_PROFILER_DRAW_END_TAG("event_cb"); + } + u = u->next; + } + + LV_PROFILER_DRAW_END; +} + +void lv_layer_init(lv_layer_t * layer) +{ + LV_ASSERT_NULL(layer); + lv_memzero(layer, sizeof(lv_layer_t)); + lv_layer_reset(layer); +} + +void lv_layer_reset(lv_layer_t * layer) +{ + LV_ASSERT_NULL(layer); +#if LV_DRAW_TRANSFORM_USE_MATRIX + lv_matrix_identity(&layer->matrix); +#endif + layer->opa = LV_OPA_COVER; + layer->recolor = lv_color32_make(0, 0, 0, 0); + layer->all_tasks_added = false; +} + +lv_layer_t * lv_draw_layer_create(lv_layer_t * parent_layer, lv_color_format_t color_format, const lv_area_t * area) +{ + LV_PROFILER_DRAW_BEGIN; + lv_layer_t * new_layer = lv_malloc_zeroed(sizeof(lv_layer_t)); + LV_ASSERT_MALLOC(new_layer); + if(new_layer == NULL) { + LV_PROFILER_DRAW_END; + return NULL; + } + + lv_draw_layer_init(new_layer, parent_layer, color_format, area); + + /*Inherits transparency from parent*/ + if(parent_layer) { + new_layer->opa = parent_layer->opa; + new_layer->recolor = parent_layer->recolor; + } + + LV_PROFILER_DRAW_END; + return new_layer; +} + +void lv_draw_layer_init(lv_layer_t * layer, lv_layer_t * parent_layer, lv_color_format_t color_format, + const lv_area_t * area) +{ + LV_PROFILER_DRAW_BEGIN; + lv_layer_init(layer); + lv_display_t * disp = lv_refr_get_disp_refreshing(); + + layer->parent = parent_layer; + layer->_clip_area = *area; + layer->buf_area = *area; + layer->phy_clip_area = *area; + layer->color_format = color_format; + + if(disp->layer_init) disp->layer_init(disp, layer); + lv_draw_unit_send_event(NULL, LV_EVENT_CHILD_CREATED, layer); + + if(disp->layer_head) { + lv_layer_t * tail = disp->layer_head; + while(tail->next) tail = tail->next; + tail->next = layer; + } + else { + disp->layer_head = layer; + } + + LV_PROFILER_DRAW_END; +} + +void * lv_draw_layer_alloc_buf(lv_layer_t * layer) +{ + LV_PROFILER_DRAW_BEGIN; + /*If the buffer of the layer is already allocated return it*/ + if(layer->draw_buf != NULL) { + LV_PROFILER_DRAW_END; + return layer->draw_buf->data; + } + + /*If the buffer of the layer is not allocated yet, allocate it now*/ + int32_t w = lv_area_get_width(&layer->buf_area); + int32_t h = lv_area_get_height(&layer->buf_area); + uint32_t layer_size_byte = h * lv_draw_buf_width_to_stride(w, layer->color_format); + +#if LV_DRAW_LAYER_MAX_MEMORY > 0 + /* Do not allocate the layer if the sum of allocated layer sizes + * will exceed `LV_DRAW_LAYER_MAX_MEMORY` */ + if((_draw_info.used_memory_for_layers + layer_size_byte) > LV_DRAW_LAYER_MAX_MEMORY) { + LV_LOG_WARN("LV_DRAW_LAYER_MAX_MEMORY was reached when allocating the layer."); + return NULL; + } +#endif + + layer->draw_buf = lv_draw_buf_create(w, h, layer->color_format, 0); + + if(layer->draw_buf == NULL) { + LV_LOG_WARN("Allocating layer buffer failed. Try later"); + LV_PROFILER_DRAW_END; + return NULL; + } + + _draw_info.used_memory_for_layers += layer_size_byte; + LV_LOG_INFO("Layer memory used: %" LV_PRIu32 " kB", get_layer_size_kb(_draw_info.used_memory_for_layers)); + + if(lv_color_format_has_alpha(layer->color_format)) { + lv_draw_buf_clear(layer->draw_buf, NULL); + } + + LV_PROFILER_DRAW_END; + return layer->draw_buf->data; +} + +void * lv_draw_layer_go_to_xy(lv_layer_t * layer, int32_t x, int32_t y) +{ + return lv_draw_buf_goto_xy(layer->draw_buf, x, y); +} + +lv_draw_task_type_t lv_draw_task_get_type(const lv_draw_task_t * t) +{ + return t->type; +} + +void * lv_draw_task_get_draw_dsc(const lv_draw_task_t * t) +{ + return t->draw_dsc; +} + +void lv_draw_task_get_area(const lv_draw_task_t * t, lv_area_t * area) +{ + *area = t->area; +} + +lv_layer_t * lv_draw_layer_create_drop_shadow(lv_layer_t * parent_layer, const lv_draw_dsc_base_t * base, + const lv_area_t * area) +{ + lv_area_t drop_shadow_area = *area; + int32_t blur_radius = base->drop_shadow_blur_radius; + + /* x2 to have some extra space for cleaner blurring */ + lv_area_increase(&drop_shadow_area, blur_radius * 2, blur_radius * 2); + + lv_layer_t * ds_layer = lv_draw_layer_create(parent_layer, LV_COLOR_FORMAT_A8, &drop_shadow_area); + if(ds_layer == NULL) { + LV_LOG_WARN("Failed to create a layer for the drop shadow"); + } + return ds_layer; +} + +void lv_draw_layer_finish_drop_shadow(lv_layer_t * drop_shadow_layer, const lv_draw_dsc_base_t * base) +{ + lv_area_t drop_shadow_area = drop_shadow_layer->buf_area; + lv_draw_blur_dsc_t blur_dsc; + lv_draw_blur_dsc_init(&blur_dsc); + blur_dsc.blur_radius = base->drop_shadow_blur_radius; + blur_dsc.quality = base->drop_shadow_quality; + lv_draw_blur(drop_shadow_layer, &blur_dsc, &drop_shadow_layer->buf_area); + + lv_area_move(&drop_shadow_area, base->drop_shadow_ofs_x, base->drop_shadow_ofs_y); + + lv_draw_image_dsc_t layer_draw_dsc; + lv_draw_image_dsc_init(&layer_draw_dsc); + layer_draw_dsc.src = drop_shadow_layer; + layer_draw_dsc.recolor = base->drop_shadow_color; + layer_draw_dsc.opa = base->drop_shadow_opa; + lv_draw_layer(drop_shadow_layer->parent, &layer_draw_dsc, &drop_shadow_area); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Check if there are older draw task overlapping the area of `t_check` + * @param layer the draw ctx to search in + * @param t_check check this task if it overlaps with the older ones + * @param draw_unit_id draw unit ID for which the independence check is called + * @return true: `t_check` is not overlapping with older tasks so it's independent + */ +static bool is_independent(lv_layer_t * layer, lv_draw_task_t * t_check, uint8_t draw_unit_id) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_task_t * t = layer->draw_task_head; + + /*If t_check is outside of the older tasks then it's independent*/ + while(t && t != t_check) { + /*It's independent of finished draw tasks, and queued draw tasks of the same draw unit, + *so no need to check it*/ + if(t->state == LV_DRAW_TASK_STATE_FINISHED || + (t->state == LV_DRAW_TASK_STATE_QUEUED && t->preferred_draw_unit_id == draw_unit_id)) { + t = t->next; + continue; + } + + lv_area_t a; + if(lv_area_intersect(&a, &t->_real_area, &t_check->_real_area)) { + LV_PROFILER_DRAW_END; + return false; + } + t = t->next; + } + LV_PROFILER_DRAW_END; + + return true; +} + +/** + * Get the size of the draw descriptor of a draw task + * @param type type of the draw task + * @return size of the draw descriptor in bytes + */ +static inline size_t get_draw_dsc_size(lv_draw_task_type_t type) +{ + switch(type) { + case LV_DRAW_TASK_TYPE_NONE: + return 0; + case LV_DRAW_TASK_TYPE_FILL: + return sizeof(lv_draw_fill_dsc_t); + case LV_DRAW_TASK_TYPE_BORDER: + return sizeof(lv_draw_border_dsc_t); + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + return sizeof(lv_draw_box_shadow_dsc_t); + case LV_DRAW_TASK_TYPE_LETTER: + return sizeof(lv_draw_letter_dsc_t); + case LV_DRAW_TASK_TYPE_LABEL: + return sizeof(lv_draw_label_dsc_t); + case LV_DRAW_TASK_TYPE_IMAGE: + return sizeof(lv_draw_image_dsc_t); + case LV_DRAW_TASK_TYPE_LAYER: + return sizeof(lv_draw_image_dsc_t); + case LV_DRAW_TASK_TYPE_LINE: + return sizeof(lv_draw_line_dsc_t); + case LV_DRAW_TASK_TYPE_ARC: + return sizeof(lv_draw_arc_dsc_t); + case LV_DRAW_TASK_TYPE_TRIANGLE: + return sizeof(lv_draw_triangle_dsc_t); + case LV_DRAW_TASK_TYPE_BLUR: + return sizeof(lv_draw_blur_dsc_t); + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + return sizeof(lv_draw_mask_rect_dsc_t); + + /* no struct match for LV_DRAW_TASK_TYPE_MASK_BITMAP, set it to zero now */ + case LV_DRAW_TASK_TYPE_MASK_BITMAP: + return 0; +#if LV_USE_VECTOR_GRAPHIC + case LV_DRAW_TASK_TYPE_VECTOR: + return sizeof(lv_draw_vector_dsc_t); +#endif +#if LV_USE_3DTEXTURE + case LV_DRAW_TASK_TYPE_3D: + return sizeof(lv_draw_3d_dsc_t); +#endif + /* Note that default is not added here because when adding new draw task type, + * if forget to add case, the compiler will automatically report a warning. + */ + } + + return 0; +} + +/** + * Clean-up resources allocated by a finished task + * @param t pointer to a draw task + * @param disp pointer to a display on which the task was drawn + */ +static void cleanup_task(lv_draw_task_t * t, lv_display_t * disp) +{ + LV_PROFILER_DRAW_BEGIN; + if(t->type == LV_DRAW_TASK_TYPE_LINE) { + lv_draw_line_dsc_t * draw_line_dsc = t->draw_dsc; + if(draw_line_dsc->points) { + lv_free(draw_line_dsc->points); + draw_line_dsc->points = NULL; + } + } + /*If it was layer drawing free the layer too*/ + else if(t->type == LV_DRAW_TASK_TYPE_LAYER) { + lv_draw_image_dsc_t * draw_image_dsc = t->draw_dsc; + lv_layer_t * layer_drawn = (lv_layer_t *)draw_image_dsc->src; + + if(layer_drawn->draw_buf) { + int32_t h = lv_area_get_height(&layer_drawn->buf_area); + uint32_t layer_size_byte = h * layer_drawn->draw_buf->header.stride; + + if(_draw_info.used_memory_for_layers >= layer_size_byte) { + _draw_info.used_memory_for_layers -= layer_size_byte; + } + else { + _draw_info.used_memory_for_layers = 0; + LV_LOG_WARN("More layers were freed than allocated"); + } + LV_LOG_INFO("Layer memory used: %" LV_PRIu32 " kB", get_layer_size_kb(_draw_info.used_memory_for_layers)); + lv_draw_buf_destroy(layer_drawn->draw_buf); + layer_drawn->draw_buf = NULL; + } + + /*Remove the layer from the display's*/ + if(disp) { + lv_layer_t * l2 = disp->layer_head; + while(l2) { + if(l2->next == layer_drawn) { + l2->next = layer_drawn->next; + break; + } + l2 = l2->next; + } + + lv_draw_unit_send_event(NULL, LV_EVENT_CHILD_DELETED, layer_drawn); + if(disp->layer_deinit) { + LV_PROFILER_DRAW_BEGIN_TAG("layer_deinit"); + disp->layer_deinit(disp, layer_drawn); + LV_PROFILER_DRAW_END_TAG("layer_deinit"); + } + lv_free(layer_drawn); + } + } + lv_draw_label_dsc_t * draw_label_dsc = lv_draw_task_get_label_dsc(t); + if(draw_label_dsc && draw_label_dsc->text_local) { + lv_free((void *)draw_label_dsc->text); + draw_label_dsc->text = NULL; + } + + lv_free(t); + LV_PROFILER_DRAW_END; +} + +static lv_draw_task_t * get_first_available_task(lv_layer_t * layer) +{ + LV_PROFILER_DRAW_BEGIN; + /* If there is only 1 draw unit the task can be consumed linearly as + * they are added in the correct order. However, it can happen that + * there is a `LV_DRAW_TASK_TYPE_LAYER` which can be blended only when + * all its tasks are ready. As other areas might be on top of that + * layer-to-blend don't skip it. Instead stop there, so that the + * draw tasks of that layer can be consumed and can be finished. + * After that this layer-to-blenf will have `LV_DRAW_TASK_STATE_WAITING` + * so it can be blended normally.*/ + lv_draw_task_t * t = layer->draw_task_head; + while(t) { + /*Not waiting to be rendered, leave this layer while the first task is ready (i.e. not blocked)*/ + if(t->state != LV_DRAW_TASK_STATE_WAITING) { + t = NULL; + break; + } + /*Waiting to be rendered, use it*/ + else { + break; + } + t = t->next; + } + + LV_PROFILER_DRAW_END; + return t; +} diff --git a/inc/lvgl/src/draw/lv_draw.h b/inc/lvgl/src/draw/lv_draw.h new file mode 100644 index 0000000..2f14f0d --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw.h @@ -0,0 +1,394 @@ +/** + * @file lv_draw.h + * + */ + +/** + * Modified by NXP in 2024 + */ + +#ifndef LV_DRAW_H +#define LV_DRAW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "../misc/lv_types.h" +#include "../misc/lv_style.h" +#include "../misc/lv_text.h" +#include "../misc/lv_profiler.h" +#include "../misc/lv_matrix.h" +#include "../misc/lv_event.h" +#include "lv_image_decoder.h" +#include "lv_draw_buf.h" + +/********************* + * DEFINES + *********************/ +#define LV_DRAW_UNIT_NONE 0 +#define LV_DRAW_UNIT_IDLE -1 /**< The draw unit is idle, new dispatching might be requested to try again */ + +#if LV_DRAW_TRANSFORM_USE_MATRIX +#if !LV_USE_MATRIX +#error "LV_DRAW_TRANSFORM_USE_MATRIX requires LV_USE_MATRIX = 1" +#endif +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_DRAW_TASK_TYPE_NONE = 0, + LV_DRAW_TASK_TYPE_FILL, + LV_DRAW_TASK_TYPE_BORDER, + LV_DRAW_TASK_TYPE_BOX_SHADOW, + LV_DRAW_TASK_TYPE_LETTER, + LV_DRAW_TASK_TYPE_LABEL, + LV_DRAW_TASK_TYPE_IMAGE, + LV_DRAW_TASK_TYPE_LAYER, + LV_DRAW_TASK_TYPE_LINE, + LV_DRAW_TASK_TYPE_ARC, + LV_DRAW_TASK_TYPE_TRIANGLE, + LV_DRAW_TASK_TYPE_MASK_RECTANGLE, + LV_DRAW_TASK_TYPE_MASK_BITMAP, + LV_DRAW_TASK_TYPE_BLUR, +#if LV_USE_VECTOR_GRAPHIC + LV_DRAW_TASK_TYPE_VECTOR, +#endif +#if LV_USE_3DTEXTURE + LV_DRAW_TASK_TYPE_3D, +#endif +} lv_draw_task_type_t; + +typedef enum { + /** Waiting for an other task to be finished. + * For example in case of `LV_DRAW_TASK_TYPE_LAYER` (used to blend a layer) + * is blocked until all the draw tasks of the layer is rendered. */ + LV_DRAW_TASK_STATE_BLOCKED, + + /** The draw task is added to the layers list and waits to be rendered. */ + LV_DRAW_TASK_STATE_WAITING, + + /** The draw task is added to the command queue of the draw unit. + * As the queued task are executed in order it's possible to queue multiple draw task + * (for the same draw unit) even if they are depending on each other. + * Therefore `lv_draw_get_available_task` and `lv_draw_get_next_available_task` can return + * draw task for the same draw unit even if a dependent draw task is not finished ready yet.*/ + LV_DRAW_TASK_STATE_QUEUED, + + /** The draw task is being rendered. This draw task needs to be finished before + * `lv_draw_get_available_task` and `lv_draw_get_next_available_task` would + * return any depending draw tasks.*/ + LV_DRAW_TASK_STATE_IN_PROGRESS, + + /** The draw task is rendered. It will be removed from the draw task list of the layer + * and freed automatically. */ + LV_DRAW_TASK_STATE_FINISHED, +} lv_draw_task_state_t; + +struct _lv_layer_t { + /** Target draw buffer of the layer */ + lv_draw_buf_t * draw_buf; + + /** Linked list of draw tasks */ + lv_draw_task_t * draw_task_head; + + /** Parent layer */ + lv_layer_t * parent; + + /** Next layer */ + lv_layer_t * next; + + /** User data */ + void * user_data; + + /** The absolute coordinates of the buffer */ + lv_area_t buf_area; + + /** The physical clipping area relative to the display */ + lv_area_t phy_clip_area; + + /** + * NEVER USE IT DRAW UNITS. USED INTERNALLY DURING DRAW TASK CREATION. + * The current clip area with absolute coordinates, always the same or smaller than `buf_area` + * Can be set before new draw tasks are added to indicate the clip area of the draw tasks. + * Therefore `lv_draw_add_task()` always saves it in the new draw task to know the clip area when the draw task was added. + * During drawing the draw units also sees the saved clip_area and should use it during drawing. + * During drawing the layer's clip area shouldn't be used as it might be already changed for other draw tasks. + */ + lv_area_t _clip_area; + +#if LV_DRAW_TRANSFORM_USE_MATRIX + /** Transform matrix to be applied when rendering the layer */ + lv_matrix_t matrix; +#endif + + /** Partial y offset */ + int32_t partial_y_offset; + + /** Recolor of the layer */ + lv_color32_t recolor; + + /** The color format of the layer. LV_COLOR_FORMAT_... */ + lv_color_format_t color_format; + + /** Flag indicating all tasks are added */ + bool all_tasks_added; + + /** Opacity of the layer */ + lv_opa_t opa; +}; + +typedef struct { + /**The widget for which draw descriptor was created */ + lv_obj_t * obj; + + /**The widget part for which draw descriptor was created */ + uint32_t part; + + /**A widget type specific ID (e.g. table row index). See the docs of the given widget.*/ + uint32_t id1; + + /**A widget type specific ID (e.g. table column index). See the docs of the given widget.*/ + uint32_t id2; + + /**The target layer */ + lv_layer_t * layer; + + /*Drop shadow is part of every draw dsc as anything can have drop shadow*/ + + /**Drop shadow offset in X*/ + int16_t drop_shadow_ofs_x; + + /**Drop shadow offset in Y*/ + int16_t drop_shadow_ofs_y; + + /**Drop shadow color*/ + lv_color_t drop_shadow_color; + + /**Drop shadow opacity*/ + lv_opa_t drop_shadow_opa; + + /**Drop shadow blur radius*/ + int32_t drop_shadow_blur_radius: 20; + + /**Drop shadow blur quality*/ + lv_blur_quality_t drop_shadow_quality : 3; + + /**Size of the specific draw descriptor into which this base descriptor is embedded*/ + size_t dsc_size; + + /**Any custom user data*/ + void * user_data; +} lv_draw_dsc_base_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Used internally to initialize the drawing module + */ +void lv_draw_init(void); + +/** + * Deinitialize the drawing module + */ +void lv_draw_deinit(void); + +/** + * Allocate a new draw unit with the given size and appends it to the list of draw units + * @param size the size to allocate. E.g. `sizeof(my_draw_unit_t)`, + * where the first element of `my_draw_unit_t` is `lv_draw_unit_t`. + */ +void * lv_draw_create_unit(size_t size); + +/** + * Add an empty draw task to the draw task list of a layer. + * @param layer pointer to a layer + * @param coords the coordinates of the draw task + * @return the created draw task which needs to be + * further configured e.g. by added a draw descriptor + */ +lv_draw_task_t * lv_draw_add_task(lv_layer_t * layer, const lv_area_t * coords, lv_draw_task_type_t type); + +/** + * Needs to be called when a draw task is created and configured. + * It will send an event about the new draw task to the widget + * and assign it to a draw unit. + * @param layer pointer to a layer + * @param t pointer to a draw task + */ +void lv_draw_finalize_task_creation(lv_layer_t * layer, lv_draw_task_t * t); + +/** + * Try dispatching draw tasks to draw units + */ +void lv_draw_dispatch(void); + +/** + * Used internally to try dispatching draw tasks of a specific layer + * @param disp pointer to a display on which the dispatching was requested + * @param layer pointer to a layer + * @return at least one draw task is being rendered (maybe it was taken earlier) + */ +bool lv_draw_dispatch_layer(lv_display_t * disp, lv_layer_t * layer); + +/** + * Wait for a new dispatch request. + * It's blocking if `LV_USE_OS == 0` else it yields + */ +void lv_draw_dispatch_wait_for_request(void); + +/** + * Wait for draw finish in case of asynchronous task execution. + * If `LV_USE_OS == 0` it just return. + */ +void lv_draw_wait_for_finish(void); + +/** + * When a draw unit finished a draw task it needs to request dispatching + * to let LVGL assign a new draw task to it + */ +void lv_draw_dispatch_request(void); + +/** + * Get the total number of draw units. + */ +uint32_t lv_draw_get_unit_count(void); + +/** + * If there is only one draw unit check the first draw task if it's available. + * If there are multiple draw units call `lv_draw_get_next_available_task` to find a task. + * @param layer the draw layer to search in + * @param t_prev continue searching from this task + * @param draw_unit_id check the task where `preferred_draw_unit_id` equals this value or `LV_DRAW_UNIT_NONE` + * @return an available draw task or NULL if there is not any + */ +lv_draw_task_t * lv_draw_get_available_task(lv_layer_t * layer, lv_draw_task_t * t_prev, uint8_t draw_unit_id); + +/** + * Find and available draw task + * @param layer the draw layer to search in + * @param t_prev continue searching from this task + * @param draw_unit_id check the task where `preferred_draw_unit_id` equals this value or `LV_DRAW_UNIT_NONE` + * @return an available draw task or NULL if there is not any + */ +lv_draw_task_t * lv_draw_get_next_available_task(lv_layer_t * layer, lv_draw_task_t * t_prev, uint8_t draw_unit_id); + +/** + * Tell how many draw task are waiting to be drawn on the area of `t_check`. + * It can be used to determine if a GPU shall combine many draw tasks into one or not. + * If a lot of tasks are waiting for the current ones it makes sense to draw them one-by-one + * to not block the dependent tasks' rendering + * @param t_check the task whose dependent tasks shall be counted + * @return number of tasks depending on `t_check` + */ +uint32_t lv_draw_get_dependent_count(lv_draw_task_t * t_check); + + +/** + * Send an event to the draw units + * @param name the name of the draw unit to send the event to + * @param code the event code + * @param param the event parameter + */ +void lv_draw_unit_send_event(const char * name, lv_event_code_t code, void * param); + +/** + * Initialize a layer + * @param layer pointer to a layer to initialize + */ +void lv_layer_init(lv_layer_t * layer); + +/** + * Reset the layer to a drawable state + * @param layer pointer to a layer to reset + */ +void lv_layer_reset(lv_layer_t * layer); + +/** + * Create (allocate) a new layer on a parent layer + * @param parent_layer the parent layer to which the layer will be merged when it's rendered + * @param color_format the color format of the layer + * @param area the areas of the layer (absolute coordinates) + * @return the new target_layer or NULL on error + */ +lv_layer_t * lv_draw_layer_create(lv_layer_t * parent_layer, lv_color_format_t color_format, const lv_area_t * area); + +/** + * Initialize a layer which is allocated by the user + * @param layer pointer the layer to initialize (its lifetime needs to be managed by the user) + * @param parent_layer the parent layer to which the layer will be merged when it's rendered + * @param color_format the color format of the layer + * @param area the areas of the layer (absolute coordinates) + * @return the new target_layer or NULL on error + */ +void lv_draw_layer_init(lv_layer_t * layer, lv_layer_t * parent_layer, lv_color_format_t color_format, + const lv_area_t * area); + +/** + * Try to allocate a buffer for the layer. + * @param layer pointer to a layer + * @return pointer to the allocated aligned buffer or NULL on failure + */ +void * lv_draw_layer_alloc_buf(lv_layer_t * layer); + +/** + * Got to a pixel at X and Y coordinate on a layer + * @param layer pointer to a layer + * @param x the target X coordinate + * @param y the target X coordinate + * @return `buf` offset to point to the given X and Y coordinate + */ +void * lv_draw_layer_go_to_xy(lv_layer_t * layer, int32_t x, int32_t y); + +/** + * Get the type of a draw task + * @param t the draw task to get the type of + * @return the draw task type +*/ +lv_draw_task_type_t lv_draw_task_get_type(const lv_draw_task_t * t); + +/** + * Get the draw descriptor of a draw task + * @param t the draw task to get the draw descriptor of + * @return a void pointer to the draw descriptor +*/ +void * lv_draw_task_get_draw_dsc(const lv_draw_task_t * t); + +/** + * Get the draw area of a draw task + * @param t the draw task to get the draw area of + * @param area the destination where the draw area will be stored +*/ +void lv_draw_task_get_area(const lv_draw_task_t * t, lv_area_t * area); + + + +lv_layer_t * lv_draw_layer_create_drop_shadow(lv_layer_t * parent_layer, const lv_draw_dsc_base_t * base, + const lv_area_t * area); + +void lv_draw_layer_finish_drop_shadow(lv_layer_t * drop_shadow_layer, const lv_draw_dsc_base_t * base); + + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_3d.c b/inc/lvgl/src/draw/lv_draw_3d.c new file mode 100644 index 0000000..110e080 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_3d.c @@ -0,0 +1,71 @@ +/** + * @file lv_draw_3d.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_3d.h" +#if LV_USE_3DTEXTURE + +#include "lv_draw_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_3d_dsc_init(lv_draw_3d_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_3d_dsc_t)); + dsc->base.dsc_size = sizeof(lv_draw_3d_dsc_t); + dsc->tex_id = LV_3DTEXTURE_ID_NULL; + dsc->h_flip = false; + dsc->v_flip = false; + dsc->opa = LV_OPA_COVER; +} + +lv_draw_3d_dsc_t * lv_draw_task_get_3d_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_3D ? (lv_draw_3d_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_3d(lv_layer_t * layer, const lv_draw_3d_dsc_t * dsc, const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_draw_task_t * t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_3D); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + lv_draw_finalize_task_creation(layer, t); + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_3DTEXTURE*/ diff --git a/inc/lvgl/src/draw/lv_draw_3d.h b/inc/lvgl/src/draw/lv_draw_3d.h new file mode 100644 index 0000000..61bfb36 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_3d.h @@ -0,0 +1,72 @@ +/** + * @file lv_draw_3d.h + * + */ + +#ifndef LV_DRAW_3D_H +#define LV_DRAW_3D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" +#if LV_USE_3DTEXTURE + +#include "lv_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_dsc_base_t base; + lv_3dtexture_id_t tex_id; + bool h_flip; + bool v_flip; + lv_opa_t opa; +} lv_draw_3d_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a 3D draw descriptor + * @param dsc pointer to a draw descriptor + */ +void lv_draw_3d_dsc_init(lv_draw_3d_dsc_t * dsc); + +/** + * Try to get a 3D draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_3D + */ +lv_draw_3d_dsc_t * lv_draw_task_get_3d_dsc(lv_draw_task_t * task); + +/** + * Create a 3D draw task + * @param layer pointer to a layer + * @param dsc pointer to an initialized `lv_draw_3d_dsc_t` variable + */ +void lv_draw_3d(lv_layer_t * layer, const lv_draw_3d_dsc_t * dsc, const lv_area_t * coords); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_3DTEXTURE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_3D_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_arc.c b/inc/lvgl/src/draw/lv_draw_arc.c new file mode 100644 index 0000000..f8ac15f --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_arc.c @@ -0,0 +1,182 @@ +/** + * @file lv_draw_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_private.h" +#include "../core/lv_obj.h" +#include "lv_draw_arc.h" +#include "../core/lv_obj_event.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_arc_dsc_t)); + dsc->width = 1; + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); + dsc->base.dsc_size = sizeof(lv_draw_arc_dsc_t); +} + +lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_ARC ? (lv_draw_arc_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_arc(lv_layer_t * layer, const lv_draw_arc_dsc_t * dsc) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(dsc->start_angle == dsc->end_angle) return; + + LV_PROFILER_DRAW_BEGIN; + lv_area_t a; + a.x1 = dsc->center.x - dsc->radius; + a.y1 = dsc->center.y - dsc->radius; + a.x2 = dsc->center.x + dsc->radius - 1; + a.y2 = dsc->center.y + dsc->radius - 1; + + if(dsc->base.drop_shadow_opa) { + lv_layer_t * ds_layer = lv_draw_layer_create_drop_shadow(layer, &dsc->base, &a); + LV_ASSERT_NULL(ds_layer); + lv_draw_arc_dsc_t ds_dsc = *dsc; + ds_dsc.base.drop_shadow_opa = 0; /*Disable drop shadow so rendering below will render plain arc*/ + lv_draw_arc(ds_layer, &ds_dsc); + lv_draw_layer_finish_drop_shadow(ds_layer, &dsc->base); + } + + lv_draw_task_t * t = lv_draw_add_task(layer, &a, LV_DRAW_TASK_TYPE_ARC); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + lv_draw_finalize_task_creation(layer, t); + + LV_PROFILER_DRAW_END; +} + +void lv_draw_arc_get_area(int32_t x, int32_t y, uint16_t radius, lv_value_precise_t start_angle, + lv_value_precise_t end_angle, + int32_t w, bool rounded, lv_area_t * area) +{ + int32_t rout = radius; + int32_t start_angle_int = (int32_t) start_angle; + int32_t end_angle_int = (int32_t) end_angle; + + /*Special case: full arc invalidation */ + if(end_angle_int == start_angle_int + 360) { + area->x1 = x - rout; + area->y1 = y - rout; + area->x2 = x + rout; + area->y2 = y + rout; + return; + } + + if(start_angle_int > 360) start_angle_int -= 360; + if(end_angle_int > 360) end_angle_int -= 360; + + int32_t rin = radius - w; + int32_t extra_area = rounded ? w / 2 + 1 : 0; + uint8_t start_quarter = start_angle_int / 90; + uint8_t end_quarter = end_angle_int / 90; + + /*360 deg still counts as quarter 3 (360 / 90 would be 4)*/ + if(start_quarter == 4) start_quarter = 3; + if(end_quarter == 4) end_quarter = 3; + + if(start_quarter == end_quarter && start_angle_int <= end_angle_int) { + if(start_quarter == 0) { + area->y1 = y + ((lv_trigo_sin(start_angle_int) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + + area->y2 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->x1 = x + ((lv_trigo_sin(end_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) - extra_area; + } + else if(start_quarter == 1) { + area->y2 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->x2 = x + ((lv_trigo_sin(start_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) + extra_area; + + area->y1 = y + ((lv_trigo_sin(end_angle_int) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->x1 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + } + else if(start_quarter == 2) { + area->x1 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->y2 = y + ((lv_trigo_sin(start_angle_int) * rin) >> LV_TRIGO_SHIFT) + extra_area; + + area->y1 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((lv_trigo_sin(end_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) + extra_area; + } + else if(start_quarter == 3) { + area->x1 = x + ((lv_trigo_sin(start_angle_int + 90) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; + + area->x2 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + ((lv_trigo_sin(end_angle_int) * rin) >> LV_TRIGO_SHIFT) + extra_area; + } + } + else if(start_quarter == 0 && end_quarter == 1) { + area->x1 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y + ((LV_MIN(lv_trigo_sin(end_angle_int), + lv_trigo_sin(start_angle_int)) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + rout + extra_area; + } + else if(start_quarter == 1 && end_quarter == 2) { + area->x1 = x - rout - extra_area; + area->y1 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + ((LV_MAX(lv_trigo_sin(start_angle_int + 90), + lv_trigo_sin(end_angle_int + 90)) * rin) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; + } + else if(start_quarter == 2 && end_quarter == 3) { + area->x1 = x + ((lv_trigo_sin(start_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y - rout - extra_area; + area->x2 = x + ((lv_trigo_sin(end_angle_int + 90) * rout) >> LV_TRIGO_SHIFT) + extra_area; + area->y2 = y + (LV_MAX(lv_trigo_sin(end_angle_int) * rin, + lv_trigo_sin(start_angle_int) * rin) >> LV_TRIGO_SHIFT) + extra_area; + } + else if(start_quarter == 3 && end_quarter == 0) { + area->x1 = x + ((LV_MIN(lv_trigo_sin(end_angle_int + 90), + lv_trigo_sin(start_angle_int + 90)) * rin) >> LV_TRIGO_SHIFT) - extra_area; + area->y1 = y + ((lv_trigo_sin(start_angle_int) * rout) >> LV_TRIGO_SHIFT) - extra_area; + area->x2 = x + rout + extra_area; + area->y2 = y + ((lv_trigo_sin(end_angle_int) * rout) >> LV_TRIGO_SHIFT) + extra_area; + + } + else { + area->x1 = x - rout; + area->y1 = y - rout; + area->x2 = x + rout; + area->y2 = y + rout; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/draw/lv_draw_arc.h b/inc/lvgl/src/draw/lv_draw_arc.h new file mode 100644 index 0000000..3518031 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_arc.h @@ -0,0 +1,110 @@ +/** + * @file lv_draw_arc.h + * + */ + +#ifndef LV_DRAW_ARC_H +#define LV_DRAW_ARC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "../lv_conf_internal.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_dsc_base_t base; + + /**The color of the arc*/ + lv_color_t color; + + /**The width (thickness) of the arc */ + int32_t width; + + /**The start angle in 1 degree units (if `LV_USE_FLOAT` is enabled a float number can be also used) + * 0° is the 3 o'clock position, 90° is the 6 o'clock, etc. */ + lv_value_precise_t start_angle; + + /**The end angle, similarly to start_angle. */ + lv_value_precise_t end_angle; + + /**The center point of the arc. */ + lv_point_t center; + + /**An image source to be used instead of `color`. `NULL` if unused*/ + const void * img_src; + + /**The outer radius of the arc*/ + uint16_t radius; + + /**Opacity of the arc in 0...255 range. + * LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/ + lv_opa_t opa; + + /**1: Make the arc ends rounded*/ + uint8_t rounded : 1; +} lv_draw_arc_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize an arc draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc); + +/** + * Try to get an arc draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_ARC + */ +lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task); + +/** + * Create an arc draw task. + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor variable + */ +void lv_draw_arc(lv_layer_t * layer, const lv_draw_arc_dsc_t * dsc); + +/** + * Get an area the should be invalidated when the arcs angle changed between start_angle and end_ange + * @param x the x coordinate of the center of the arc + * @param y the y coordinate of the center of the arc + * @param radius the radius of the arc + * @param start_angle the start angle of the arc (0 deg on the bottom, 90 deg on the right) + * @param end_angle the end angle of the arc + * @param w width of the arc + * @param rounded true: the arc is rounded + * @param area store the area to invalidate here + */ +void lv_draw_arc_get_area(int32_t x, int32_t y, uint16_t radius, lv_value_precise_t start_angle, + lv_value_precise_t end_angle, + int32_t w, bool rounded, lv_area_t * area); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_ARC_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_blur.c b/inc/lvgl/src/draw/lv_draw_blur.c new file mode 100644 index 0000000..c09d59d --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_blur.c @@ -0,0 +1,65 @@ +/** + * @file lv_draw_blur.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_private.h" +#include "lv_draw_blur.h" +#include "../misc/lv_types.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_blur_dsc_init(lv_draw_blur_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_blur_dsc_t)); + dsc->base.dsc_size = sizeof(lv_draw_blur_dsc_t); +} + +lv_draw_blur_dsc_t * lv_draw_task_get_blur_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_BLUR ? (lv_draw_blur_dsc_t *)task->draw_dsc : NULL; +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_blur(lv_layer_t * layer, const lv_draw_blur_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->blur_radius <= 0) return; + + LV_PROFILER_DRAW_BEGIN; + + lv_draw_task_t * t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_BLUR); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/draw/lv_draw_blur.h b/inc/lvgl/src/draw/lv_draw_blur.h new file mode 100644 index 0000000..acbb556 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_blur.h @@ -0,0 +1,82 @@ +/** + * @file lv_draw_blur.h + * + */ + +#ifndef LV_DRAW_BLUR_H +#define LV_DRAW_BLUR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_dsc_base_t base; + + /** + * The intensity of blur. + */ + int32_t blur_radius; + + /** + * The corner radius of the blurred area + */ + int32_t corner_radius; + + /** + * Sets whether to prefer speed or precision + */ + lv_blur_quality_t quality; + +} lv_draw_blur_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a blur draw descriptor + * @param dsc pointer to a draw descriptor + */ +void lv_draw_blur_dsc_init(lv_draw_blur_dsc_t * dsc); + +/** + * Try to get a blur draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_BLUR + */ +lv_draw_blur_dsc_t * lv_draw_task_get_blur_dsc(lv_draw_task_t * task); + +/** + * Create a blur draw task + * @param layer pointer to a layer + * @param dsc pointer to an initialized `lv_draw_blur_dsc_t` variable + * @param coords coordinates of the character + */ +void lv_draw_blur(lv_layer_t * layer, const lv_draw_blur_dsc_t * dsc, const lv_area_t * coords); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_BLUR_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_buf.c b/inc/lvgl/src/draw/lv_draw_buf.c new file mode 100644 index 0000000..293f23d --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_buf.c @@ -0,0 +1,683 @@ +/** + * @file lv_draw_buf.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_buf_private.h" +#include "../misc/lv_types.h" +#include "../stdlib/lv_string.h" +#include "../core/lv_global.h" +#include "../misc/lv_math.h" +#include "../misc/lv_area_private.h" +#include "convert/lv_draw_buf_convert.h" + +/********************* + * DEFINES + *********************/ +#define default_handlers LV_GLOBAL_DEFAULT()->draw_buf_handlers +#define font_draw_buf_handlers LV_GLOBAL_DEFAULT()->font_draw_buf_handlers +#define image_cache_draw_buf_handlers LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * buf_malloc(size_t size, lv_color_format_t color_format); +static void buf_free(void * buf); +static void buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area, + const lv_draw_buf_t * src, const lv_area_t * src_area); +static void * buf_align(void * buf, lv_color_format_t color_format); +static void * draw_buf_malloc(const lv_draw_buf_handlers_t * handler, size_t size_bytes, + lv_color_format_t color_format); +static void draw_buf_free(const lv_draw_buf_handlers_t * handler, void * buf); +static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format); +static uint32_t _calculate_draw_buf_size(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride); +static void draw_buf_get_full_area(const lv_draw_buf_t * draw_buf, lv_area_t * full_area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_buf_init_handlers(void) +{ + lv_draw_buf_init_with_default_handlers(&default_handlers); + lv_draw_buf_init_with_default_handlers(&font_draw_buf_handlers); + lv_draw_buf_init_with_default_handlers(&image_cache_draw_buf_handlers); +} + +void lv_draw_buf_init_with_default_handlers(lv_draw_buf_handlers_t * handlers) +{ + lv_draw_buf_handlers_init(handlers, buf_malloc, buf_free, buf_copy, buf_align, NULL, NULL, width_to_stride); +} + +void lv_draw_buf_handlers_init(lv_draw_buf_handlers_t * handlers, + lv_draw_buf_malloc_cb_t buf_malloc_cb, + lv_draw_buf_free_cb_t buf_free_cb, + lv_draw_buf_copy_cb_t buf_copy_cb, + lv_draw_buf_align_cb_t align_pointer_cb, + lv_draw_buf_cache_operation_cb_t invalidate_cache_cb, + lv_draw_buf_cache_operation_cb_t flush_cache_cb, + lv_draw_buf_width_to_stride_cb_t width_to_stride_cb) +{ + lv_memzero(handlers, sizeof(lv_draw_buf_handlers_t)); + handlers->buf_malloc_cb = buf_malloc_cb; + handlers->buf_free_cb = buf_free_cb; + handlers->buf_copy_cb = buf_copy_cb; + handlers->align_pointer_cb = align_pointer_cb; + handlers->invalidate_cache_cb = invalidate_cache_cb; + handlers->flush_cache_cb = flush_cache_cb; + handlers->width_to_stride_cb = width_to_stride_cb; +} + +lv_draw_buf_handlers_t * lv_draw_buf_get_handlers(void) +{ + return &default_handlers; +} + +lv_draw_buf_handlers_t * lv_draw_buf_get_font_handlers(void) +{ + return &font_draw_buf_handlers; +} + +lv_draw_buf_handlers_t * lv_draw_buf_get_image_handlers(void) +{ + return &image_cache_draw_buf_handlers; +} + +uint32_t lv_draw_buf_width_to_stride(uint32_t w, lv_color_format_t color_format) +{ + return lv_draw_buf_width_to_stride_ex(&default_handlers, w, color_format); +} + +uint32_t lv_draw_buf_width_to_stride_ex(const lv_draw_buf_handlers_t * handlers, uint32_t w, + lv_color_format_t color_format) +{ + if(handlers->width_to_stride_cb) return handlers->width_to_stride_cb(w, color_format); + else return 0; +} + +void * lv_draw_buf_align(void * data, lv_color_format_t color_format) +{ + return lv_draw_buf_align_ex(&default_handlers, data, color_format); +} + +void * lv_draw_buf_align_ex(const lv_draw_buf_handlers_t * handlers, void * data, lv_color_format_t color_format) +{ + if(handlers->align_pointer_cb) return handlers->align_pointer_cb(data, color_format); + else return NULL; +} + +void lv_draw_buf_invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + LV_ASSERT_NULL(draw_buf); + LV_ASSERT_NULL(draw_buf->handlers); + + const lv_draw_buf_handlers_t * handlers = draw_buf->handlers; + if(!handlers->invalidate_cache_cb) { + return; + } + + LV_PROFILER_DRAW_BEGIN; + + lv_area_t full; + if(area == NULL) { + draw_buf_get_full_area(draw_buf, &full); + area = &full; + } + + handlers->invalidate_cache_cb(draw_buf, area); + LV_PROFILER_DRAW_END; +} + +void lv_draw_buf_flush_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + LV_ASSERT_NULL(draw_buf); + LV_ASSERT_NULL(draw_buf->handlers); + + const lv_draw_buf_handlers_t * handlers = draw_buf->handlers; + if(!handlers->flush_cache_cb) { + return; + } + + LV_PROFILER_DRAW_BEGIN; + + lv_area_t full; + if(area == NULL) { + draw_buf_get_full_area(draw_buf, &full); + area = &full; + } + + handlers->flush_cache_cb(draw_buf, area); + LV_PROFILER_DRAW_END; +} + +void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a) +{ + LV_ASSERT_NULL(draw_buf); + LV_PROFILER_DRAW_BEGIN; + + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + + if(a == NULL) { + uint8_t * buf = lv_draw_buf_goto_xy(draw_buf, 0, 0); + lv_memzero(buf, header->h * stride); + lv_draw_buf_flush_cache(draw_buf, a); + LV_PROFILER_DRAW_END; + return; + } + + lv_area_t a_draw_buf; + a_draw_buf.x1 = 0; + a_draw_buf.y1 = 0; + a_draw_buf.x2 = draw_buf->header.w - 1; + a_draw_buf.y2 = draw_buf->header.h - 1; + + lv_area_t a_clipped; + if(!lv_area_intersect(&a_clipped, a, &a_draw_buf)) { + LV_PROFILER_DRAW_END; + return; + } + + if(lv_area_get_width(&a_clipped) <= 0) { + LV_PROFILER_DRAW_END; + return; + } + + if(lv_area_get_height(&a_clipped) <= 0) { + LV_PROFILER_DRAW_END; + return; + } + + uint8_t * buf = lv_draw_buf_goto_xy(draw_buf, a_clipped.x1, a_clipped.y1); + uint8_t bpp = lv_color_format_get_bpp(header->cf); + uint32_t line_length = (lv_area_get_width(&a_clipped) * bpp + 7) >> 3; + int32_t y; + for(y = a_clipped.y1; y <= a_clipped.y2; y++) { + lv_memzero(buf, line_length); + buf += stride; + } + lv_draw_buf_flush_cache(draw_buf, a); + LV_PROFILER_DRAW_END; +} + +lv_result_t lv_draw_buf_init(lv_draw_buf_t * draw_buf, uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride, + void * data, uint32_t data_size) +{ + LV_ASSERT_NULL(draw_buf); + if(draw_buf == NULL) return LV_RESULT_INVALID; + + lv_memzero(draw_buf, sizeof(lv_draw_buf_t)); + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); + if(stride * h > data_size) { + LV_LOG_WARN("Data size too small, required: %" LV_PRId32 ", provided: %" LV_PRId32, stride * h, + data_size); + return LV_RESULT_INVALID; + } + + lv_image_header_t * header = &draw_buf->header; + header->w = w; + header->h = h; + header->cf = cf; + header->stride = stride; + header->flags = 0; + header->magic = LV_IMAGE_HEADER_MAGIC; + + draw_buf->data = data; + draw_buf->unaligned_data = data; + draw_buf->handlers = &default_handlers; + draw_buf->data_size = data_size; + if(lv_draw_buf_align(data, cf) != draw_buf->unaligned_data) { + LV_LOG_INFO("Data is not aligned, ignored"); + } + return LV_RESULT_OK; +} + +lv_draw_buf_t * lv_draw_buf_create(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride) +{ + return lv_draw_buf_create_ex(&default_handlers, w, h, cf, stride); +} + +lv_draw_buf_t * lv_draw_buf_create_ex(const lv_draw_buf_handlers_t * handlers, uint32_t w, uint32_t h, + lv_color_format_t cf, uint32_t stride) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_buf_t * draw_buf = lv_malloc_zeroed(sizeof(lv_draw_buf_t)); + LV_ASSERT_MALLOC(draw_buf); + if(draw_buf == NULL) { + LV_PROFILER_DRAW_END; + return NULL; + } + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); + + uint32_t size = _calculate_draw_buf_size(w, h, cf, stride); + + void * buf = draw_buf_malloc(handlers, size, cf); + /*Do not assert here as LVGL or the app might just want to try creating a draw_buf*/ + if(buf == NULL) { + LV_LOG_WARN("No memory: %"LV_PRIu32"x%"LV_PRIu32", cf: %d, stride: %"LV_PRIu32", %"LV_PRIu32"Byte, ", + w, h, cf, stride, size); + lv_free(draw_buf); + LV_PROFILER_DRAW_END; + return NULL; + } + + draw_buf->header.w = w; + draw_buf->header.h = h; + draw_buf->header.cf = cf; + draw_buf->header.flags = LV_IMAGE_FLAGS_MODIFIABLE | LV_IMAGE_FLAGS_ALLOCATED; + draw_buf->header.stride = stride; + draw_buf->header.magic = LV_IMAGE_HEADER_MAGIC; + draw_buf->data = lv_draw_buf_align(buf, cf); + draw_buf->unaligned_data = buf; + draw_buf->data_size = size; + draw_buf->handlers = handlers; + LV_PROFILER_DRAW_END; + return draw_buf; +} + +lv_draw_buf_t * lv_draw_buf_dup(const lv_draw_buf_t * draw_buf) +{ + return lv_draw_buf_dup_ex(&default_handlers, draw_buf); +} + +lv_draw_buf_t * lv_draw_buf_dup_ex(const lv_draw_buf_handlers_t * handlers, const lv_draw_buf_t * draw_buf) +{ + LV_PROFILER_DRAW_BEGIN; + const lv_image_header_t * header = &draw_buf->header; + lv_draw_buf_t * new_buf = lv_draw_buf_create_ex(handlers, header->w, header->h, header->cf, header->stride); + if(new_buf == NULL) { + LV_PROFILER_DRAW_END; + return NULL; + } + + lv_draw_buf_set_flag(new_buf, draw_buf->header.flags | LV_IMAGE_FLAGS_MODIFIABLE | LV_IMAGE_FLAGS_ALLOCATED); + + /*Choose the smaller size to copy*/ + uint32_t size = LV_MIN(draw_buf->data_size, new_buf->data_size); + + /*Copy image data*/ + lv_memcpy(new_buf->data, draw_buf->data, size); + LV_PROFILER_DRAW_END; + return new_buf; +} + +lv_draw_buf_t * lv_draw_buf_reshape(lv_draw_buf_t * draw_buf, lv_color_format_t cf, uint32_t w, uint32_t h, + uint32_t stride) +{ + if(draw_buf == NULL) return NULL; + LV_PROFILER_DRAW_BEGIN; + + /*If color format is unknown, keep using the original color format.*/ + if(cf == LV_COLOR_FORMAT_UNKNOWN) cf = draw_buf->header.cf; + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); + + uint32_t size = _calculate_draw_buf_size(w, h, cf, stride); + + if(size > draw_buf->data_size) { + LV_LOG_TRACE("Draw buf too small for new shape"); + LV_PROFILER_DRAW_END; + return NULL; + } + + draw_buf->header.cf = cf; + draw_buf->header.w = w; + draw_buf->header.h = h; + draw_buf->header.stride = stride; + + LV_PROFILER_DRAW_END; + return draw_buf; +} + +void lv_draw_buf_destroy(lv_draw_buf_t * draw_buf) +{ + LV_ASSERT_NULL(draw_buf); + if(draw_buf == NULL) return; + LV_PROFILER_DRAW_BEGIN; + if(lv_draw_buf_has_flag(draw_buf, LV_IMAGE_FLAGS_ALLOCATED)) { + LV_ASSERT_NULL(draw_buf->handlers); + + const lv_draw_buf_handlers_t * handlers = draw_buf->handlers; + draw_buf_free(handlers, draw_buf->unaligned_data); + lv_free(draw_buf); + } + else { + LV_LOG_ERROR("draw buffer is not allocated, ignored"); + } + LV_PROFILER_DRAW_END; +} + +void lv_draw_buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area, + const lv_draw_buf_t * src, const lv_area_t * src_area) +{ + LV_ASSERT_NULL(dest); + LV_ASSERT_NULL(dest->handlers); + LV_ASSERT_NULL(dest->handlers->buf_copy_cb); + LV_ASSERT_NULL(src); + + dest->handlers->buf_copy_cb(dest, dest_area, src, src_area); +} + +void * lv_draw_buf_goto_xy(const lv_draw_buf_t * buf, uint32_t x, uint32_t y) +{ + LV_ASSERT_NULL(buf); + if(buf == NULL) return NULL; + + if(x >= buf->header.w || y >= buf->header.h) { + LV_LOG_ERROR("coordinates out of range, x: %" LV_PRIu32 ", y: %"LV_PRIu32", w: %"LV_PRIu32", h: %"LV_PRIu32, x, y, + (uint32_t)buf->header.w, (uint32_t)buf->header.h); + return NULL; + } + + uint8_t * data = buf->data; + + /*Skip palette*/ + data += LV_COLOR_INDEXED_PALETTE_SIZE(buf->header.cf) * sizeof(lv_color32_t); + data += buf->header.stride * y; + + if(x == 0) return data; + + return data + x * lv_color_format_get_bpp(buf->header.cf) / 8; +} + +lv_result_t lv_draw_buf_adjust_stride(lv_draw_buf_t * src, uint32_t stride) +{ + LV_ASSERT_NULL(src); + LV_ASSERT_NULL(src->data); + if(src == NULL) return LV_RESULT_INVALID; + if(src->data == NULL) return LV_RESULT_INVALID; + LV_PROFILER_DRAW_BEGIN; + + const lv_image_header_t * header = &src->header; + uint32_t w = header->w; + uint32_t h = header->h; + + if(!lv_draw_buf_has_flag(src, LV_IMAGE_FLAGS_MODIFIABLE)) { + LV_PROFILER_DRAW_END; + return LV_RESULT_INVALID; + } + + /*Use global stride*/ + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, header->cf); + + /*Check if stride already match*/ + if(header->stride == stride) { + LV_PROFILER_DRAW_END; + return LV_RESULT_OK; + } + + /*Calculate the minimal stride allowed from bpp*/ + uint32_t bpp = lv_color_format_get_bpp(header->cf); + uint32_t min_stride = (w * bpp + 7) >> 3; + if(stride < min_stride) { + LV_LOG_WARN("New stride is too small. min: %" LV_PRId32, min_stride); + LV_PROFILER_DRAW_END; + return LV_RESULT_INVALID; + } + + /*Check if buffer has enough space. */ + uint32_t new_size = _calculate_draw_buf_size(w, h, header->cf, stride); + if(new_size > src->data_size) { + LV_PROFILER_DRAW_END; + return LV_RESULT_INVALID; + } + + uint32_t offset = LV_COLOR_INDEXED_PALETTE_SIZE(header->cf) * 4; + + if(stride > header->stride) { + /*Copy from the last line to the first*/ + uint8_t * src_data = src->data + offset + header->stride * (h - 1); + uint8_t * dst_data = src->data + offset + stride * (h - 1); + for(uint32_t y = 0; y < h; y++) { + lv_memmove(dst_data, src_data, min_stride); + src_data -= header->stride; + dst_data -= stride; + } + } + else { + /*Copy from the first line to the last*/ + uint8_t * src_data = src->data + offset; + uint8_t * dst_data = src->data + offset; + for(uint32_t y = 0; y < h; y++) { + lv_memmove(dst_data, src_data, min_stride); + src_data += header->stride; + dst_data += stride; + } + } + + src->header.stride = stride; + + LV_PROFILER_DRAW_END; + return LV_RESULT_OK; +} + +lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf) +{ + LV_ASSERT_NULL(draw_buf); + if(draw_buf == NULL) return LV_RESULT_INVALID; + + if(lv_draw_buf_has_flag(draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED)) return LV_RESULT_INVALID; + + if(!lv_draw_buf_has_flag(draw_buf, LV_IMAGE_FLAGS_MODIFIABLE)) { + LV_LOG_WARN("draw buf is not modifiable: 0x%04x", draw_buf->header.flags); + return LV_RESULT_INVALID; + } + + LV_PROFILER_DRAW_BEGIN; + + lv_result_t res = lv_draw_buf_convert_premultiply(draw_buf); + if(res == LV_RESULT_OK) { + lv_area_t area = {0, 0, draw_buf->header.w - 1, draw_buf->header.h - 1}; + if(LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf)) { + /** + * We only need to flush the palette table, so we set y2 equal to y1 to improve performance + * and reduce cache flush overhead. + */ + area.y2 = 0; + } + + lv_draw_buf_set_flag(draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); + lv_draw_buf_flush_cache(draw_buf, &area); + } + + LV_PROFILER_DRAW_END; + return res; +} + +void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32_t color) +{ + LV_ASSERT_NULL(draw_buf); + if(draw_buf == NULL) return; + + if(!LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf)) { + LV_LOG_WARN("Not indexed color format"); + return; + } + + lv_color32_t * palette = (lv_color32_t *)draw_buf->data; + palette[index] = color; +} + +lv_result_t lv_draw_buf_from_image(lv_draw_buf_t * buf, const lv_image_dsc_t * img) +{ + const lv_result_t res = lv_draw_buf_init(buf, img->header.w, img->header.h, img->header.cf, img->header.stride, + (void *)img->data, img->data_size); + if(res != LV_RESULT_OK) { + return res; + } + + buf->header.flags = img->header.flags; + return res; +} + +void lv_draw_buf_to_image(const lv_draw_buf_t * buf, lv_image_dsc_t * img) +{ + lv_memcpy((void *)img, buf, sizeof(lv_image_dsc_t)); +} + +void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c) +{ + LV_LOG_WARN("Deprecated API, use lv_draw_buf_set_palette instead."); + lv_draw_buf_set_palette((lv_draw_buf_t *)dsc, id, c); +} + +void lv_image_buf_free(lv_image_dsc_t * dsc) +{ + LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy instead."); + if(dsc != NULL) { + if(dsc->data != NULL) + lv_free((void *)dsc->data); + + lv_free((void *)dsc); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void * buf_malloc(size_t size_bytes, lv_color_format_t color_format) +{ + LV_UNUSED(color_format); + + /*Allocate larger memory to be sure it can be aligned as needed*/ + size_bytes += LV_DRAW_BUF_ALIGN - 1; + return lv_malloc(size_bytes); +} + +static void buf_free(void * buf) +{ + lv_free(buf); +} + +static void buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area, + const lv_draw_buf_t * src, const lv_area_t * src_area) +{ + LV_PROFILER_DRAW_BEGIN; + uint8_t * dest_bufc; + uint8_t * src_bufc; + int32_t line_width; + + /*Source and dest color format must be same. Color conversion is not supported yet.*/ + LV_ASSERT_FORMAT_MSG(dest->header.cf == src->header.cf, "Color format mismatch: %d != %d", + dest->header.cf, src->header.cf); + + if(dest_area == NULL) line_width = dest->header.w; + else line_width = lv_area_get_width(dest_area); + + /* For indexed image, copy the palette if we are copying full image area*/ + if(dest_area == NULL || src_area == NULL) { + if(LV_COLOR_FORMAT_IS_INDEXED(dest->header.cf)) { + lv_memcpy(dest->data, src->data, LV_COLOR_INDEXED_PALETTE_SIZE(dest->header.cf) * sizeof(lv_color32_t)); + } + } + + /*Check source and dest area have same width*/ + if((src_area == NULL && line_width != src->header.w) || \ + (src_area != NULL && line_width != lv_area_get_width(src_area))) { + LV_ASSERT_MSG(0, "Source and destination areas have different width"); + LV_PROFILER_DRAW_END; + return; + } + + if(src_area) src_bufc = lv_draw_buf_goto_xy(src, src_area->x1, src_area->y1); + else src_bufc = lv_draw_buf_goto_xy(src, 0, 0); + + if(dest_area) dest_bufc = lv_draw_buf_goto_xy(dest, dest_area->x1, dest_area->y1); + else dest_bufc = lv_draw_buf_goto_xy(dest, 0, 0); + + int32_t start_y, end_y; + if(dest_area) { + start_y = dest_area->y1; + end_y = dest_area->y2; + } + else { + start_y = 0; + end_y = dest->header.h - 1; + } + + uint32_t dest_stride = dest->header.stride; + uint32_t src_stride = src->header.stride; + uint32_t line_bytes = (line_width * lv_color_format_get_bpp(dest->header.cf) + 7) >> 3; + + for(; start_y <= end_y; start_y++) { + lv_memcpy(dest_bufc, src_bufc, line_bytes); + dest_bufc += dest_stride; + src_bufc += src_stride; + } + LV_PROFILER_DRAW_END; +} + +static void * buf_align(void * buf, lv_color_format_t color_format) +{ + LV_UNUSED(color_format); + + uint8_t * buf_u8 = buf; + if(buf_u8) { + buf_u8 = (uint8_t *)LV_ROUND_UP((lv_uintptr_t)buf_u8, LV_DRAW_BUF_ALIGN); + } + return buf_u8; +} + +static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format) +{ + uint32_t width_byte; + width_byte = w * lv_color_format_get_bpp(color_format); + width_byte = (width_byte + 7) >> 3; /*Round up*/ + + return LV_ROUND_UP(width_byte, LV_DRAW_BUF_STRIDE_ALIGN); +} + +static void * draw_buf_malloc(const lv_draw_buf_handlers_t * handlers, size_t size_bytes, + lv_color_format_t color_format) +{ + if(handlers->buf_malloc_cb) return handlers->buf_malloc_cb(size_bytes, color_format); + else return NULL; +} + +static void draw_buf_free(const lv_draw_buf_handlers_t * handlers, void * buf) +{ + if(handlers->buf_free_cb) + handlers->buf_free_cb(buf); +} + +/** + * For given width, height, color format, and stride, calculate the size needed for a new draw buffer. + */ +static uint32_t _calculate_draw_buf_size(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride) +{ + uint32_t size; + + if(stride == 0) stride = lv_draw_buf_width_to_stride(w, cf); + + size = stride * h; + if(cf == LV_COLOR_FORMAT_RGB565A8) { + size += (stride / 2) * h; /*A8 mask*/ + } + else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + /*@todo we have to include palette right before image data*/ + size += LV_COLOR_INDEXED_PALETTE_SIZE(cf) * 4; + } + + return size; +} + +static void draw_buf_get_full_area(const lv_draw_buf_t * draw_buf, lv_area_t * full_area) +{ + const lv_image_header_t * header = &draw_buf->header; + lv_area_set(full_area, 0, 0, header->w - 1, header->h - 1); +} diff --git a/inc/lvgl/src/draw/lv_draw_buf.h b/inc/lvgl/src/draw/lv_draw_buf.h new file mode 100644 index 0000000..addad22 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_buf.h @@ -0,0 +1,389 @@ +/** + * @file lv_draw_buf.h + * + */ + +#ifndef LV_DRAW_BUF_H +#define LV_DRAW_BUF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" +#include "../misc/lv_area.h" +#include "../misc/lv_color.h" +#include "../stdlib/lv_string.h" +#include "lv_image_dsc.h" + +/********************* + * DEFINES + *********************/ + +/** Use this value to let LVGL calculate stride automatically */ +#define LV_STRIDE_AUTO 0 +LV_EXPORT_CONST_INT(LV_STRIDE_AUTO); + +/** + * Stride alignment for draw buffers. + * It may vary between different color formats and hardware. + * Refine it to suit your needs. + */ + +#define LV_DRAW_BUF_STRIDE(w, cf) \ + LV_ROUND_UP(((w) * LV_COLOR_FORMAT_GET_BPP(cf) + 7) / 8, LV_DRAW_BUF_STRIDE_ALIGN) + +/** Allocate a slightly larger buffer, so we can adjust the start address to meet alignment */ +#define LV_DRAW_BUF_SIZE(w, h, cf) \ + (LV_DRAW_BUF_STRIDE(w, cf) * (h) + LV_DRAW_BUF_ALIGN + \ + LV_COLOR_INDEXED_PALETTE_SIZE(cf) * sizeof(lv_color32_t)) + +/** + * Define a static draw buffer with the given width, height, and color format. + * Stride alignment is set to LV_DRAW_BUF_STRIDE_ALIGN. + * + * For platform that needs special buffer alignment, call LV_DRAW_BUF_INIT_STATIC. + */ +#define LV_DRAW_BUF_DEFINE_STATIC(name, _w, _h, _cf) \ + static LV_ATTRIBUTE_MEM_ALIGN uint8_t buf_##name[LV_DRAW_BUF_SIZE(_w, _h, _cf)]; \ + static lv_draw_buf_t name = { \ + .header = { \ + .magic = LV_IMAGE_HEADER_MAGIC, \ + .cf = (_cf), \ + .flags = LV_IMAGE_FLAGS_MODIFIABLE, \ + .w = (_w), \ + .h = (_h), \ + .stride = LV_DRAW_BUF_STRIDE(_w, _cf), \ + .reserved_2 = 0, \ + }, \ + .data_size = sizeof(buf_##name), \ + .data = buf_##name, \ + .unaligned_data = buf_##name, \ + } + +#define LV_DRAW_BUF_INIT_STATIC(name) \ + do { \ + lv_image_header_t * header = &name.header; \ + lv_draw_buf_init(&name, header->w, header->h, (lv_color_format_t)header->cf, header->stride, buf_##name, sizeof(buf_##name)); \ + lv_draw_buf_set_flag(&name, LV_IMAGE_FLAGS_MODIFIABLE); \ + } while(0) + +/********************** + * TYPEDEFS + **********************/ + +typedef void * (*lv_draw_buf_malloc_cb_t)(size_t size, lv_color_format_t color_format); + +typedef void (*lv_draw_buf_free_cb_t)(void * draw_buf); + +typedef void (*lv_draw_buf_copy_cb_t)(lv_draw_buf_t * dest, const lv_area_t * dest_area, + const lv_draw_buf_t * src, const lv_area_t * src_area); + +typedef void * (*lv_draw_buf_align_cb_t)(void * buf, lv_color_format_t color_format); + +typedef void (*lv_draw_buf_cache_operation_cb_t)(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +typedef uint32_t (*lv_draw_buf_width_to_stride_cb_t)(uint32_t w, lv_color_format_t color_format); + +struct _lv_draw_buf_t { + lv_image_header_t header; + uint32_t data_size; /**< Total buf size in bytes */ + uint8_t * data; + void * unaligned_data; /**< Unaligned address of `data`, used internally by lvgl */ + const lv_draw_buf_handlers_t * handlers; /**< draw buffer alloc/free ops. */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the draw buffer with the default handlers. + * + * @param handlers the draw buffer handlers to set + */ +void lv_draw_buf_init_with_default_handlers(lv_draw_buf_handlers_t * handlers); + +/** + * Initialize the draw buffer with given handlers. + * + * @param handlers the draw buffer handlers to set + * @param buf_malloc_cb the callback to allocate memory for the buffer + * @param buf_free_cb the callback to free memory of the buffer + * @param buf_copy_cb the callback to copy a draw buffer to an other + * @param align_pointer_cb the callback to align the buffer + * @param invalidate_cache_cb the callback to invalidate the cache of the buffer + * @param flush_cache_cb the callback to flush buffer + * @param width_to_stride_cb the callback to calculate the stride based on the width and color format + */ +void lv_draw_buf_handlers_init(lv_draw_buf_handlers_t * handlers, + lv_draw_buf_malloc_cb_t buf_malloc_cb, + lv_draw_buf_free_cb_t buf_free_cb, + lv_draw_buf_copy_cb_t buf_copy_cb, + lv_draw_buf_align_cb_t align_pointer_cb, + lv_draw_buf_cache_operation_cb_t invalidate_cache_cb, + lv_draw_buf_cache_operation_cb_t flush_cache_cb, + lv_draw_buf_width_to_stride_cb_t width_to_stride_cb); + +/** + * Get the struct which holds the callbacks for draw buf management. + * Custom callback can be set on the returned value + * @return pointer to the struct of handlers + */ +lv_draw_buf_handlers_t * lv_draw_buf_get_handlers(void); +lv_draw_buf_handlers_t * lv_draw_buf_get_font_handlers(void); +lv_draw_buf_handlers_t * lv_draw_buf_get_image_handlers(void); + + +/** + * Align the address of a buffer. The buffer needs to be large enough for the real data after alignment + * @param buf the data to align + * @param color_format the color format of the buffer + * @return the aligned buffer + */ +void * lv_draw_buf_align(void * buf, lv_color_format_t color_format); + +/** + * Align the address of a buffer with custom draw buffer handlers. + * The buffer needs to be large enough for the real data after alignment + * @param handlers the draw buffer handlers + * @param buf the data to align + * @param color_format the color format of the buffer + * @return the aligned buffer + */ +void * lv_draw_buf_align_ex(const lv_draw_buf_handlers_t * handlers, void * buf, lv_color_format_t color_format); + +/** + * Invalidate the cache of the buffer + * @param draw_buf the draw buffer needs to be invalidated + * @param area the area to invalidate in the buffer, + * use NULL to invalidate the whole draw buffer address range + */ +void lv_draw_buf_invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +/** + * Flush the cache of the buffer + * @param draw_buf the draw buffer needs to be flushed + * @param area the area to flush in the buffer, + * use NULL to flush the whole draw buffer address range + */ +void lv_draw_buf_flush_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +/** + * Calculate the stride in bytes based on a width and color format + * @param w the width in pixels + * @param color_format the color format + * @return the stride in bytes + */ +uint32_t lv_draw_buf_width_to_stride(uint32_t w, lv_color_format_t color_format); + +/** + * Calculate the stride in bytes based on a width and color format + * @param handlers the draw buffer handlers + * @param w the width in pixels + * @param color_format the color format + * @return the stride in bytes + */ +uint32_t lv_draw_buf_width_to_stride_ex(const lv_draw_buf_handlers_t * handlers, uint32_t w, + lv_color_format_t color_format); + +/** + * Clear an area on the buffer + * @param draw_buf pointer to draw buffer + * @param a the area to clear, or NULL to clear the whole buffer + */ +void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a); + + +/** + * Note: Eventually, lv_draw_buf_malloc/free will be kept as private. + * For now, we use `create` to distinguish with malloc. + * + * Create an draw buf by allocating struct for `lv_draw_buf_t` and allocating a buffer for it + * that meets specified requirements. + * + * @param w the buffer width in pixels + * @param h the buffer height in pixels + * @param cf the color format for image + * @param stride the stride in bytes for image. Use 0 for automatic calculation based on + * w, cf, and global stride alignment configuration. + */ +lv_draw_buf_t * lv_draw_buf_create(uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride); + +/** + * Note: Eventually, lv_draw_buf_malloc/free will be kept as private. + * For now, we use `create` to distinguish with malloc. + * + * Create an draw buf by allocating struct for `lv_draw_buf_t` and allocating a buffer for it + * that meets specified requirements. + * + * @param handlers the draw buffer handlers + * @param w the buffer width in pixels + * @param h the buffer height in pixels + * @param cf the color format for image + * @param stride the stride in bytes for image. Use 0 for automatic calculation based on + * w, cf, and global stride alignment configuration. + */ +lv_draw_buf_t * lv_draw_buf_create_ex(const lv_draw_buf_handlers_t * handlers, uint32_t w, uint32_t h, + lv_color_format_t cf, uint32_t stride); + +/** + * Duplicate a draw buf with same image size, stride and color format. Copy the image data too. + * @param draw_buf the draw buf to duplicate + * @return the duplicated draw buf on success, NULL if failed + */ +lv_draw_buf_t * lv_draw_buf_dup(const lv_draw_buf_t * draw_buf); + +/** + * Duplicate a draw buf with same image size, stride and color format. Copy the image data too. + * @param handlers the draw buffer handlers + * @param draw_buf the draw buf to duplicate + * @return the duplicated draw buf on success, NULL if failed + */ +lv_draw_buf_t * lv_draw_buf_dup_ex(const lv_draw_buf_handlers_t * handlers, const lv_draw_buf_t * draw_buf); + +/** + * Initialize a draw buf with the given buffer and parameters. Clear draw buffer flag to zero. + * @param draw_buf the draw buf to initialize + * @param w the buffer width in pixels + * @param h the buffer height in pixels + * @param cf the color format + * @param stride the stride in bytes. Use 0 for automatic calculation + * @param data the buffer used for drawing. Unaligned `data` will be aligned internally + * @param data_size the size of the buffer in bytes + * @return return LV_RESULT_OK on success, LV_RESULT_INVALID otherwise + */ +lv_result_t lv_draw_buf_init(lv_draw_buf_t * draw_buf, uint32_t w, uint32_t h, lv_color_format_t cf, uint32_t stride, + void * data, uint32_t data_size); + +/** + * Keep using the existing memory, reshape the draw buffer to the given width and height. + * Return NULL if data_size is smaller than the required size. + * @param draw_buf pointer to a draw buffer + * @param cf the new color format, use 0 or LV_COLOR_FORMAT_UNKNOWN to keep using the original color format. + * @param w the new width in pixels + * @param h the new height in pixels + * @param stride the stride in bytes for image. Use 0 for automatic calculation. + */ +lv_draw_buf_t * lv_draw_buf_reshape(lv_draw_buf_t * draw_buf, lv_color_format_t cf, uint32_t w, uint32_t h, + uint32_t stride); + +/** + * Destroy a draw buf by freeing the actual buffer if it's marked as LV_IMAGE_FLAGS_ALLOCATED in header. + * Then free the lv_draw_buf_t struct. + * + * @param draw_buf the draw buffer to destroy + */ +void lv_draw_buf_destroy(lv_draw_buf_t * draw_buf); + +/** + * Copy an area from a buffer to another + * @param dest pointer to the destination draw buffer + * @param dest_area the area to copy from the destination buffer, if NULL, use the whole buffer + * @param src pointer to the source draw buffer + * @param src_area the area to copy from the destination buffer, if NULL, use the whole buffer + * @note `dest_area` and `src_area` should have the same width and height + * @note The default copy function required `dest` and `src` to have the same color format. + * Overwriting dest->handlers->buf_copy_cb can resolve this limitation. + */ +void lv_draw_buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area, + const lv_draw_buf_t * src, const lv_area_t * src_area); + +/** + * Return pointer to the buffer at the given coordinates + */ +void * lv_draw_buf_goto_xy(const lv_draw_buf_t * buf, uint32_t x, uint32_t y); + +/** + * Adjust the stride of a draw buf in place. + * @param src pointer to a draw buffer + * @param stride the new stride in bytes for image. Use LV_STRIDE_AUTO for automatic calculation. + * @return LV_RESULT_OK: success or LV_RESULT_INVALID: failed + */ +lv_result_t lv_draw_buf_adjust_stride(lv_draw_buf_t * src, uint32_t stride); + +/** + * Premultiply draw buffer color with alpha channel. + * If it's already premultiplied, return directly. + * Only color formats with alpha channel will be processed. + * + * @return LV_RESULT_OK: premultiply success + */ +lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf); + + +/** + * Check if a draw buffer has a given flag. + * @param draw_buf pointer to a draw buffer + * @param flag the flag to check + * @return true: the flag is set, false: the flag is not set + */ +static inline bool lv_draw_buf_has_flag(const lv_draw_buf_t * draw_buf, lv_image_flags_t flag) +{ + return draw_buf->header.flags & flag; +} + +/** + * Set a flag to a draw buffer. + * @param draw_buf pointer to a draw buffer + * @param flag the flag to set + */ +static inline void lv_draw_buf_set_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) +{ + draw_buf->header.flags |= flag; +} + +/** + * Clear a flag from a draw buffer. + * @param draw_buf pointer to a draw buffer + * @param flag the flag to clear + */ +static inline void lv_draw_buf_clear_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag) +{ + draw_buf->header.flags &= ~flag; +} + +/** + * As of now, draw buf share same definition as `lv_image_dsc_t`. + * And is interchangeable with `lv_image_dsc_t`. + */ + +lv_result_t lv_draw_buf_from_image(lv_draw_buf_t * buf, const lv_image_dsc_t * img); + +void lv_draw_buf_to_image(const lv_draw_buf_t * buf, lv_image_dsc_t * img); + +/** + * Set the palette color of an indexed image. Valid only for `LV_COLOR_FORMAT_I1/2/4/8` + * @param draw_buf pointer to an image descriptor + * @param index the palette color to set: + * - for `LV_COLOR_FORMAT_I1`: 0..1 + * - for `LV_COLOR_FORMAT_I2`: 0..3 + * - for `LV_COLOR_FORMAT_I4`: 0..15 + * - for `LV_COLOR_FORMAT_I8`: 0..255 + * @param color the color to set in lv_color32_t format + */ +void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32_t color); + +/** + * @deprecated Use lv_draw_buf_set_palette instead. + */ +void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c); + +/** + * @deprecated Use lv_draw_buffer_create/destroy instead. + * Free the data pointer and dsc struct of an image. + */ +void lv_image_buf_free(lv_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_BUF_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_buf_private.h b/inc/lvgl/src/draw/lv_draw_buf_private.h new file mode 100644 index 0000000..9245cab --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_buf_private.h @@ -0,0 +1,54 @@ +/** + * @file lv_draw_buf_private.h + * + */ + +#ifndef LV_DRAW_BUF_PRIVATE_H +#define LV_DRAW_BUF_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_buf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_buf_handlers_t { + lv_draw_buf_malloc_cb_t buf_malloc_cb; + lv_draw_buf_free_cb_t buf_free_cb; + lv_draw_buf_copy_cb_t buf_copy_cb; + lv_draw_buf_align_cb_t align_pointer_cb; + lv_draw_buf_cache_operation_cb_t invalidate_cache_cb; + lv_draw_buf_cache_operation_cb_t flush_cache_cb; + lv_draw_buf_width_to_stride_cb_t width_to_stride_cb; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Called internally to initialize the draw_buf_handlers in lv_global + */ +void lv_draw_buf_init_handlers(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_BUF_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_image.c b/inc/lvgl/src/draw/lv_draw_image.c new file mode 100644 index 0000000..e5f33d4 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_image.c @@ -0,0 +1,389 @@ +/** + * @file lv_draw_image.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_image_private.h" +#include "../misc/lv_area_private.h" +#include "lv_image_decoder_private.h" +#include "lv_draw_private.h" +#include "../display/lv_display.h" +#include "../misc/lv_log.h" +#include "../misc/lv_math.h" +#include "../core/lv_refr.h" +#include "../core/lv_obj_private.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void img_decode_and_draw(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + lv_image_decoder_dsc_t * decoder_dsc, lv_area_t * relative_decoded_area, + const lv_area_t * img_area, const lv_area_t * clipped_img_area, + lv_draw_image_core_cb draw_core_cb); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_image_dsc_init(lv_draw_image_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_image_dsc_t)); + dsc->recolor = lv_color_black(); + dsc->opa = LV_OPA_COVER; + dsc->scale_x = LV_SCALE_NONE; + dsc->scale_y = LV_SCALE_NONE; + dsc->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0; + dsc->image_area.x2 = LV_COORD_MIN; /*Indicate invalid area by default by setting a negative size*/ + dsc->base.dsc_size = sizeof(lv_draw_image_dsc_t); +} + +lv_draw_image_dsc_t * lv_draw_task_get_image_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_IMAGE ? (lv_draw_image_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->scale_x <= 0 || dsc->scale_y <= 0) { + /* NOT draw if scale is negative or zero */ + return; + } + + LV_PROFILER_DRAW_BEGIN; + + lv_draw_task_t * t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_LAYER); + lv_draw_image_dsc_t * new_image_dsc = t->draw_dsc; + lv_memcpy(new_image_dsc, dsc, sizeof(*dsc)); + t->state = LV_DRAW_TASK_STATE_BLOCKED; + + lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(coords), lv_area_get_height(coords), + dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); + lv_area_move(&t->_real_area, coords->x1, coords->y1); + + /*If the image_area is not set assume that it's the same as the rendering area */ + if(new_image_dsc->image_area.x2 == LV_COORD_MIN) { + new_image_dsc->image_area = *coords; + } + + lv_layer_t * layer_to_draw = (lv_layer_t *)dsc->src; + layer_to_draw->all_tasks_added = true; + + lv_draw_finalize_task_creation(layer, t); + + LV_PROFILER_DRAW_END; +} + +void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * image_coords) +{ + if(dsc->src == NULL) { + LV_LOG_WARN("Image draw: src is NULL"); + return; + } + if(dsc->opa <= LV_OPA_MIN) return; + + if(dsc->scale_x <= 0 || dsc->scale_y <= 0) { + /* NOT draw if scale is negative or zero */ + return; + } + + LV_PROFILER_DRAW_BEGIN; + + if(dsc->base.drop_shadow_opa) { + lv_layer_t * ds_layer = lv_draw_layer_create_drop_shadow(layer, &dsc->base, image_coords); + LV_ASSERT_NULL(ds_layer); + lv_draw_image_dsc_t ds_dsc = *dsc; + ds_dsc.base.drop_shadow_opa = 0; /*Disable drop shadow so rendering below will render plain image*/ + lv_draw_image(ds_layer, &ds_dsc, image_coords); + lv_draw_layer_finish_drop_shadow(ds_layer, &dsc->base); + } + + lv_draw_image_dsc_t new_image_dsc; + lv_memcpy(&new_image_dsc, dsc, sizeof(*dsc)); + lv_result_t res = lv_image_decoder_get_info(new_image_dsc.src, &new_image_dsc.header); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("Couldn't get info about the image"); + LV_PROFILER_DRAW_END; + return; + } + + /*If the image_area is not set assume that it's the same as the rendering area */ + if(new_image_dsc.image_area.x2 == LV_COORD_MIN) { + new_image_dsc.image_area = *image_coords; + } + + /*Typical case, draw the image as bitmap*/ + if(!(new_image_dsc.header.flags & LV_IMAGE_FLAGS_CUSTOM_DRAW)) { + lv_draw_task_t * t = lv_draw_add_task(layer, image_coords, LV_DRAW_TASK_TYPE_IMAGE); + lv_memcpy(t->draw_dsc, &new_image_dsc, sizeof(lv_draw_image_dsc_t)); + + lv_image_buf_get_transformed_area(&t->_real_area, lv_area_get_width(image_coords), lv_area_get_height(image_coords), + dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); + lv_area_move(&t->_real_area, image_coords->x1, image_coords->y1); + + lv_draw_finalize_task_creation(layer, t); + } + /*Use a custom draw callback*/ + else { + + lv_image_decoder_dsc_t decoder_dsc; + res = lv_image_decoder_open(&decoder_dsc, new_image_dsc.src, NULL); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + LV_PROFILER_DRAW_END; + return; + } + + if(decoder_dsc.decoder && decoder_dsc.decoder->custom_draw_cb) { + lv_area_t draw_area = layer->buf_area; + lv_area_t coords_area = *image_coords; + + lv_area_t obj_area = dsc->base.obj->coords; + if(layer->parent) { /* child layer */ + if(lv_area_intersect(&coords_area, &coords_area, &obj_area)) { + int32_t xpos = image_coords->x1 - draw_area.x1; + int32_t ypos = image_coords->y1 - draw_area.y1; + + lv_area_move(&coords_area, -(image_coords->x1 - xpos), -(image_coords->y1 - ypos)); + layer->_clip_area = coords_area; + decoder_dsc.decoder->custom_draw_cb(layer, &decoder_dsc, &coords_area, &new_image_dsc, &coords_area); + } + } + else { + lv_area_t clip_area = draw_area; + if(lv_area_intersect(&clip_area, &clip_area, &coords_area)) { + + lv_image_buf_get_transformed_area(&coords_area, lv_area_get_width(image_coords), lv_area_get_height(image_coords), + dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); + lv_area_move(&coords_area, image_coords->x1, image_coords->y1); + + lv_image_buf_get_transformed_area(&clip_area, lv_area_get_width(image_coords), lv_area_get_height(image_coords), + dsc->rotation, dsc->scale_x, dsc->scale_y, &dsc->pivot); + lv_area_move(&clip_area, image_coords->x1, image_coords->y1); + + if(lv_area_intersect(&clip_area, &clip_area, &obj_area)) { + decoder_dsc.decoder->custom_draw_cb(layer, &decoder_dsc, &coords_area, &new_image_dsc, &clip_area); + } + } + } + + } + + lv_image_decoder_close(&decoder_dsc); + } + + LV_PROFILER_DRAW_END; +} + +lv_image_src_t lv_image_src_get_type(const void * src) +{ + if(src == NULL) return LV_IMAGE_SRC_UNKNOWN; + const uint8_t * u8_p = src; + + /*The first byte shows the type of the image source*/ + if(u8_p[0] >= 0x20 && u8_p[0] <= 0x7F) { + return LV_IMAGE_SRC_FILE; /*If it's an ASCII character then it's file name*/ + } + else if(u8_p[0] >= 0x80) { + return LV_IMAGE_SRC_SYMBOL; /*Symbols begins after 0x7F*/ + } + else { + return LV_IMAGE_SRC_VARIABLE; /*`lv_image_dsc_t` is draw to the first byte < 0x20*/ + } +} + +void lv_draw_image_normal_helper(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb, + const lv_image_decoder_args_t * decoder_args) +{ + if(draw_core_cb == NULL) { + LV_LOG_WARN("draw_core_cb is NULL"); + return; + } + + lv_area_t draw_area; + lv_area_copy(&draw_area, coords); + if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + + lv_image_buf_get_transformed_area(&draw_area, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); + + draw_area.x1 += coords->x1; + draw_area.y1 += coords->y1; + draw_area.x2 += coords->x1; + draw_area.y2 += coords->y1; + } + + lv_area_t clipped_img_area; + if(!lv_area_intersect(&clipped_img_area, &draw_area, &t->clip_area)) { + return; + } + + lv_image_decoder_dsc_t decoder_dsc; + lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, decoder_args); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + return; + } + + img_decode_and_draw(t, draw_dsc, &decoder_dsc, NULL, coords, &clipped_img_area, draw_core_cb); + + lv_image_decoder_close(&decoder_dsc); +} + +void lv_draw_image_tiled_helper(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb, + const lv_image_decoder_args_t * decoder_args) +{ + if(draw_core_cb == NULL) { + LV_LOG_WARN("draw_core_cb is NULL"); + return; + } + + lv_image_decoder_dsc_t decoder_dsc; + lv_result_t res = lv_image_decoder_open(&decoder_dsc, draw_dsc->src, decoder_args); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + return; + } + + int32_t img_w = draw_dsc->header.w; + int32_t img_h = draw_dsc->header.h; + + lv_area_t tile_area; + if(lv_area_get_width(&draw_dsc->image_area) >= 0) { + tile_area = draw_dsc->image_area; + } + else { + tile_area = *coords; + } + lv_area_set_width(&tile_area, img_w); + lv_area_set_height(&tile_area, img_h); + + int32_t tile_x_start = tile_area.x1; + + lv_area_t relative_decoded_area = { + .x1 = LV_COORD_MIN, + .y1 = LV_COORD_MIN, + .x2 = LV_COORD_MIN, + .y2 = LV_COORD_MIN, + }; + + while(tile_area.y1 <= coords->y2) { + while(tile_area.x1 <= coords->x2) { + + lv_area_t clipped_img_area; + if(lv_area_intersect(&clipped_img_area, &tile_area, coords)) { + img_decode_and_draw(t, draw_dsc, &decoder_dsc, &relative_decoded_area, &tile_area, &clipped_img_area, + draw_core_cb); + } + + tile_area.x1 += img_w; + tile_area.x2 += img_w; + } + + tile_area.y1 += img_h; + tile_area.y2 += img_h; + tile_area.x1 = tile_x_start; + tile_area.x2 = tile_x_start + img_w - 1; + } + + lv_image_decoder_close(&decoder_dsc); +} + +void lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, + uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot) +{ + if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) { + res->x1 = 0; + res->y1 = 0; + res->x2 = w - 1; + res->y2 = h - 1; + return; + } + + lv_point_t p[4] = { + {0, 0}, + {w, 0}, + {0, h}, + {w, h}, + }; + lv_point_transform(&p[0], angle, scale_x, scale_y, pivot, true); + lv_point_transform(&p[1], angle, scale_x, scale_y, pivot, true); + lv_point_transform(&p[2], angle, scale_x, scale_y, pivot, true); + lv_point_transform(&p[3], angle, scale_x, scale_y, pivot, true); + res->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x); + res->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x) - 1; + res->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y); + res->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y) - 1; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void img_decode_and_draw(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + lv_image_decoder_dsc_t * decoder_dsc, lv_area_t * relative_decoded_area, + const lv_area_t * img_area, const lv_area_t * clipped_img_area, + lv_draw_image_core_cb draw_core_cb) +{ + lv_draw_image_sup_t sup; + sup.alpha_color = draw_dsc->recolor; + sup.palette = decoder_dsc->palette; + sup.palette_size = decoder_dsc->palette_size; + + /*The whole image is available, just draw it*/ + if(decoder_dsc->decoded && (relative_decoded_area == NULL || relative_decoded_area->x1 == LV_COORD_MIN)) { + draw_core_cb(t, draw_dsc, decoder_dsc, &sup, img_area, clipped_img_area); + } + /*Draw in smaller pieces*/ + else { + lv_area_t relative_full_area_to_decode = *clipped_img_area; + lv_area_move(&relative_full_area_to_decode, -img_area->x1, -img_area->y1); + lv_area_t tmp; + if(relative_decoded_area == NULL) relative_decoded_area = &tmp; + relative_decoded_area->x1 = LV_COORD_MIN; + relative_decoded_area->y1 = LV_COORD_MIN; + relative_decoded_area->x2 = LV_COORD_MIN; + relative_decoded_area->y2 = LV_COORD_MIN; + lv_result_t res = LV_RESULT_OK; + + while(res == LV_RESULT_OK) { + res = lv_image_decoder_get_area(decoder_dsc, &relative_full_area_to_decode, relative_decoded_area); + + lv_area_t absolute_decoded_area = *relative_decoded_area; + lv_area_move(&absolute_decoded_area, img_area->x1, img_area->y1); + if(res == LV_RESULT_OK) { + /*Limit draw area to the current decoded area and draw the image*/ + lv_area_t clipped_img_area_sub; + if(lv_area_intersect(&clipped_img_area_sub, clipped_img_area, &absolute_decoded_area)) { + draw_core_cb(t, draw_dsc, decoder_dsc, &sup, + &absolute_decoded_area, &clipped_img_area_sub); + } + } + } + } +} diff --git a/inc/lvgl/src/draw/lv_draw_image.h b/inc/lvgl/src/draw/lv_draw_image.h new file mode 100644 index 0000000..1f58f7e --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_image.h @@ -0,0 +1,167 @@ +/** + * @file lv_draw_image.h + * + */ + +#ifndef LV_DRAW_IMAGE_H +#define LV_DRAW_IMAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "lv_image_decoder.h" +#include "lv_draw_buf.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * MACROS + **********************/ + +struct _lv_draw_image_dsc_t { + lv_draw_dsc_base_t base; + + /**The image source: pointer to `lv_image_dsc_t` or a path to a file*/ + const void * src; + + /**The header of the image. Initialized internally in `lv_draw_image` */ + lv_image_header_t header; + + /**Clip the corner of the image with this radius. Use `LV_RADIUS_CIRCLE` for max. radius */ + int32_t clip_radius; + + /**The rotation of the image in 0.1 degree unit. E.g. 234 means 23.4° */ + int32_t rotation; + + /**Horizontal scale (zoom) of the image. + * 256 (LV_SCALE_NONE): means no zoom, 512 double size, 128 half size.*/ + int32_t scale_x; + + /**Same as `scale_y` but vertically*/ + int32_t scale_y; + + /**Parallelogram like transformation of the image horizontally in 0.1 degree unit. E.g. 456 means 45.6°.*/ + int32_t skew_x; + + /**Same as `skew_x` but vertically*/ + int32_t skew_y; + + /**The pivot point of transformation (scale and rotation). + * 0;0 is the top left corner of the image. Can be outside of the image too.*/ + lv_point_t pivot; + + /**Mix this color to the images. In case of `LV_COLOR_FORMAT_A8` it will be the color of the visible pixels*/ + lv_color_t recolor; + + /**The intensity of recoloring. 0 means, no recolor, 255 means full cover (transparent pixels remain transparent)*/ + lv_opa_t recolor_opa; + + /**Opacity in 0...255 range. + * LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/ + lv_opa_t opa; + + /**Describes how to blend the pixels of the image to the background. + * See `lv_blend_mode_t` for more details. + */ + lv_blend_mode_t blend_mode : 4; + + /**1: perform the transformation with anti-aliasing */ + uint16_t antialias : 1; + + /**If the image is smaller than the `image_area` field of `lv_draw_image_dsc_t` + * tile the image (repeat is both horizontally and vertically) to fill the + * `image_area` area*/ + uint16_t tile : 1; + + const lv_image_colorkey_t * colorkey; + + /**Used internally to store some information about the palette or the color of A8 images*/ + lv_draw_image_sup_t * sup; + + /** Used to indicate the entire original, non-clipped area where the image is to be drawn. + * This is important for: + * 1. Layer rendering, where it might happen that only a smaller area of the layer is rendered and e.g. + * `clip_radius` needs to know what the original image was. + * 2. Tiled images, where the target draw area is larger than the image to be tiled. + */ + lv_area_t image_area; + + /**Pointer to an A8 or L8 image descriptor to mask the image with. + * The mask is always center aligned. */ + const lv_image_dsc_t * bitmap_mask_src; +}; + +/** + * PErform the actual rendering of a decoded image + * @param t pointer to a draw task + * @param draw_dsc the draw descriptor of the image + * @param decoder_dsc pointer to the decoded image's descriptor + * @param sup supplementary data + * @param img_coords the absolute coordinates of the image + * @param clipped_img_area the absolute clip coordinates + */ +typedef void (*lv_draw_image_core_cb)(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize an image draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_image_dsc_init(lv_draw_image_dsc_t * dsc); + +/** + * Try to get an image draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_IMAGE + */ +lv_draw_image_dsc_t * lv_draw_task_get_image_dsc(lv_draw_task_t * task); + +/** + * Create an image draw task + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor + * @param coords the coordinates of the image + * @note `coords` can be small than the real image area + * (if only a part of the image is rendered) + * or can be larger (in case of tiled images). . + */ +void lv_draw_image(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords); + +/** + * Create a draw task to blend a layer to another layer + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor. `src` must be set to the layer to blend + * @param coords the coordinates of the layer. + * @note `coords` can be small than the total widget area from which the layer is created + * (if only a part of the widget was rendered to a layer) + */ +void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords); + +/** + * Get the type of an image source + * @param src pointer to an image source: + * - pointer to an 'lv_image_t' variable (image stored internally and compiled into the code) + * - a path to a file (e.g. "S:/folder/image.bin") + * - or a symbol (e.g. LV_SYMBOL_CLOSE) + * @return type of the image source LV_IMAGE_SRC_VARIABLE/FILE/SYMBOL/UNKNOWN + */ +lv_image_src_t lv_image_src_get_type(const void * src); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_IMAGE_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_image_private.h b/inc/lvgl/src/draw/lv_draw_image_private.h new file mode 100644 index 0000000..694c5c1 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_image_private.h @@ -0,0 +1,89 @@ +/** + * @file lv_draw_image_private.h + * + */ + +#ifndef LV_DRAW_IMAGE_PRIVATE_H +#define LV_DRAW_IMAGE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_image.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_image_sup_t { + lv_color_t alpha_color; + const lv_color32_t * palette; + uint32_t palette_size : 9; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Can be used by draw units to handle the decoding and + * prepare everything for the actual image rendering + * @param t pointer to a draw task + * @param draw_dsc the draw descriptor of the image + * @param coords the absolute coordinates of the image + * @param draw_core_cb a callback to perform the actual rendering + * @param decoder_args the args passed to image decoders, or NULL for defaults + */ +void lv_draw_image_normal_helper(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb, + const lv_image_decoder_args_t * decoder_args); + +/** + * Can be used by draw units for TILED images to handle the decoding and + * prepare everything for the actual image rendering + * @param t pointer to a draw task + * @param draw_dsc the draw descriptor of the image + * @param coords the absolute coordinates of the image + * @param draw_core_cb a callback to perform the actual rendering + * @param decoder_args the args passed to image decoders, or NULL for defaults + */ +void lv_draw_image_tiled_helper(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb, + const lv_image_decoder_args_t * decoder_args); + +/** + * Get the area of a rectangle if its rotated and scaled + * @param res store the coordinates here + * @param w width of the rectangle to transform + * @param h height of the rectangle to transform + * @param angle angle of rotation + * @param scale_x zoom in x direction, (256 no zoom) + * @param scale_y zoom in y direction, (256 no zoom) + * @param pivot x,y pivot coordinates of rotation + */ +void lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, + uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_IMAGE_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_label.c b/inc/lvgl/src/draw/lv_draw_label.c new file mode 100644 index 0000000..5276eb7 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_label.c @@ -0,0 +1,677 @@ +/** + * @file lv_draw_label.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_label_private.h" +#include "lv_draw_private.h" +#include "../misc/lv_area_private.h" +#include "lv_draw_vector_private.h" +#include "lv_draw_rect_private.h" +#include "../core/lv_obj.h" +#include "../misc/lv_math.h" +#include "../core/lv_obj_event.h" +#include "../misc/lv_bidi_private.h" +#include "../misc/lv_text_private.h" +#include "../misc/lv_assert.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define LABEL_RECOLOR_PAR_LENGTH 6 +#define LV_LABEL_HINT_UPDATE_TH 1024 /*Update the "hint" if the label's y coordinates have changed more then this*/ + +#define font_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->font_draw_buf_handlers) + +/********************** + * TYPEDEFS + **********************/ +enum { + RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER, + RECOLOR_CMD_STATE_PARAMETER, + RECOLOR_CMD_STATE_TEXT_INPUT, +}; +typedef unsigned char cmd_state_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static uint8_t hex_char_to_num(char hex); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_letter_dsc_init(lv_draw_letter_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_letter_dsc_t)); + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); + dsc->font = LV_FONT_DEFAULT; + dsc->rotation = 0; + dsc->scale_x = LV_SCALE_NONE; + dsc->scale_y = LV_SCALE_NONE; + dsc->base.dsc_size = sizeof(lv_draw_letter_dsc_t); +} + +void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_label_dsc_t)); + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); + dsc->text_length = LV_TEXT_LEN_MAX; + dsc->font = LV_FONT_DEFAULT; + dsc->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + dsc->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; + dsc->sel_color = lv_color_black(); + dsc->sel_bg_color = lv_palette_main(LV_PALETTE_BLUE); + dsc->bidi_dir = LV_BASE_DIR_LTR; + dsc->base.dsc_size = sizeof(lv_draw_label_dsc_t); +} + +lv_draw_label_dsc_t * lv_draw_task_get_label_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_LABEL ? (lv_draw_label_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_glyph_dsc_init(lv_draw_glyph_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_glyph_dsc_t)); +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->text == NULL || dsc->text[0] == '\0') return; + if(dsc->font == NULL) { + LV_LOG_WARN("dsc->font == NULL"); + return; + } + if(coords->x1 > coords->x2) { + /* Attempting to draw a label too small (negative width), cancel to avoid error */ + return; + } + LV_PROFILER_DRAW_BEGIN; + + if(dsc->base.drop_shadow_opa) { + lv_layer_t * ds_layer = lv_draw_layer_create_drop_shadow(layer, &dsc->base, coords); + LV_ASSERT_NULL(ds_layer); + lv_draw_label_dsc_t ds_dsc = *dsc; + ds_dsc.base.drop_shadow_opa = 0; /*Disable drop shadow so rendering below will render plain label*/ + lv_draw_label(ds_layer, &ds_dsc, coords); + lv_draw_layer_finish_drop_shadow(ds_layer, &dsc->base); + } + + + lv_draw_task_t * t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_LABEL); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + /*The text is stored in a local variable so malloc memory for it*/ + if(dsc->text_local) { + lv_draw_label_dsc_t * new_dsc = t->draw_dsc; + new_dsc->text = lv_strndup(dsc->text, dsc->text_length); + LV_ASSERT_MALLOC(new_dsc->text); + } + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_DRAW_END; +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc, + const lv_point_t * point, uint32_t unicode_letter) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->font == NULL) { + LV_LOG_WARN("dsc->font == NULL"); + return; + } + + if(lv_text_is_marker(unicode_letter)) return; + + LV_PROFILER_DRAW_BEGIN; + + lv_font_glyph_dsc_t g; + + lv_font_get_glyph_dsc(dsc->font, &g, unicode_letter, 0); + + lv_area_t a; + a.x1 = point->x; + a.y1 = point->y; + a.x2 = a.x1 + g.adv_w; + a.y2 = a.y1 + lv_font_get_line_height(g.resolved_font ? g.resolved_font : dsc->font); + + /*lv_draw_label needs UTF8 text so convert the Unicode character to an UTF8 string */ + uint32_t letter_buf[2]; + letter_buf[0] = lv_text_unicode_to_encoded(unicode_letter); + letter_buf[1] = '\0'; + + const char * letter_buf_char = (const char *)letter_buf; + +#if LV_BIG_ENDIAN_SYSTEM + while(*letter_buf_char == 0) ++letter_buf_char; +#endif + + dsc->text = letter_buf_char; + dsc->text_local = 1; + + lv_draw_label(layer, dsc, &a); + LV_PROFILER_DRAW_END; +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_letter(lv_layer_t * layer, lv_draw_letter_dsc_t * dsc, const lv_point_t * point) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->font == NULL) { + LV_LOG_WARN("dsc->font == NULL"); + return; + } + + const lv_font_t * font = dsc->font; + + LV_PROFILER_DRAW_BEGIN; + lv_font_glyph_dsc_t g; + + lv_font_get_glyph_dsc(font, &g, dsc->unicode, 0); + + font = g.resolved_font ? g.resolved_font : dsc->font; + + lv_area_t a; + a.x1 = point->x; + a.y1 = point->y; + a.x2 = a.x1 + g.adv_w; + a.y2 = a.y1 + lv_font_get_line_height(font); + + dsc->pivot.x = g.adv_w / 2 ; + dsc->pivot.y = font->line_height - font->base_line; + + lv_draw_task_t * t = lv_draw_add_task(layer, &a, LV_DRAW_TASK_TYPE_LETTER); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_DRAW_END; +} + +void lv_draw_label_iterate_characters(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords, + lv_draw_glyph_cb_t cb) +{ + lv_draw_dsc_base_t * base_dsc = t->draw_dsc; + const lv_font_t * font = dsc->font; + int32_t w; + + lv_area_t clipped_area; + bool clip_ok = lv_area_intersect(&clipped_area, coords, &t->clip_area); + if(!clip_ok) return; + + lv_text_align_t align = dsc->align; + lv_base_dir_t base_dir = dsc->bidi_dir; + + lv_bidi_calculate_align(&align, &base_dir, dsc->text); + + if((dsc->flag & LV_TEXT_FLAG_EXPAND) == 0) { + /*Normally use the label's width as width*/ + w = lv_area_get_width(coords); + } + else { + /*If EXPAND is enabled then not limit the text's width to the object's width*/ + if(base_dsc->obj && !lv_obj_has_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS)) { + w = dsc->text_size.x; + } + else { + lv_text_attributes_t attributes = {0}; + + attributes.letter_space = dsc->letter_space; + attributes.line_space = dsc->line_space; + attributes.max_width = LV_COORD_MAX; + attributes.text_flags = dsc->flag; + + lv_point_t p; + lv_text_get_size_attributes(&p, dsc->text, dsc->font, &attributes); + w = p.x; + } + } + + int32_t line_height_font = lv_font_get_line_height(font); + int32_t line_height = line_height_font + dsc->line_space; + + /*Init variables for the first line*/ + int32_t line_width = 0; + lv_point_t pos; + lv_point_set(&pos, coords->x1, coords->y1); + + int32_t x_ofs = 0; + int32_t y_ofs = 0; + x_ofs = dsc->ofs_x; + y_ofs = dsc->ofs_y; + pos.y += y_ofs; + + uint32_t line_start = 0; + int32_t last_line_start = -1; + + /*Check the hint to use the cached info*/ + if(dsc->hint && y_ofs == 0 && coords->y1 < 0) { + /*If the label changed too much recalculate the hint.*/ + if(LV_ABS(dsc->hint->coord_y - coords->y1) > LV_LABEL_HINT_UPDATE_TH - 2 * line_height) { + dsc->hint->line_start = -1; + } + last_line_start = dsc->hint->line_start; + } + + /*Use the hint if it's valid*/ + if(dsc->hint && last_line_start >= 0) { + line_start = last_line_start; + pos.y += dsc->hint->y; + } + + uint32_t remaining_len = dsc->text_length; + lv_text_attributes_t attributes = {0}; + attributes.letter_space = dsc->letter_space; + attributes.text_flags = dsc->flag; + attributes.max_width = w; + + uint32_t line_end = line_start + lv_text_get_next_line(&dsc->text[line_start], remaining_len, font, NULL, &attributes); + + /*Go the first visible line*/ + while(pos.y + line_height_font < t->clip_area.y1) { + /*Go to next line*/ + remaining_len -= line_end - line_start; + line_start = line_end; + line_end += lv_text_get_next_line(&dsc->text[line_start], remaining_len, font, NULL, &attributes); + pos.y += line_height; + + /*Save at the threshold coordinate*/ + if(dsc->hint && pos.y >= -LV_LABEL_HINT_UPDATE_TH && dsc->hint->line_start < 0) { + dsc->hint->line_start = line_start; + dsc->hint->y = pos.y - coords->y1; + dsc->hint->coord_y = coords->y1; + } + + if(dsc->text[line_start] == '\0') return; + } + + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, &attributes); + pos.x += (lv_area_get_width(coords) - line_width) / 2; + + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, &attributes); + pos.x += lv_area_get_width(coords) - line_width; + } + + uint32_t sel_start = dsc->sel_start; + uint32_t sel_end = dsc->sel_end; + if(sel_start > sel_end) { + uint32_t tmp = sel_start; + sel_start = sel_end; + sel_end = tmp; + } + + lv_area_t bg_coords; + lv_draw_glyph_dsc_t draw_letter_dsc; + lv_font_glyph_dsc_t glyph_dsc; + lv_draw_glyph_dsc_init(&draw_letter_dsc); + draw_letter_dsc.opa = dsc->opa; + draw_letter_dsc.bg_coords = &bg_coords; + draw_letter_dsc.color = dsc->color; + draw_letter_dsc.rotation = dsc->rotation; + draw_letter_dsc.g = &glyph_dsc; + + /* Set letter outline stroke attributes */ + draw_letter_dsc.outline_stroke_width = dsc->outline_stroke_width; + draw_letter_dsc.outline_stroke_opa = dsc->outline_stroke_opa; + draw_letter_dsc.outline_stroke_color = dsc->outline_stroke_color; + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.opa = dsc->opa; + int32_t underline_width = font->underline_thickness ? font->underline_thickness : 1; + int32_t line_start_x; + uint32_t next_char_offset; + uint32_t recolor_command_start_index = 0; + int32_t letter_w; + + cmd_state_t recolor_cmd_state = RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER; + lv_color_t recolor = lv_color_black(); /* Holds the selected color inside the recolor command */ + uint8_t is_first_space_after_cmd = 0; + + /*Write out all lines*/ + while(remaining_len && dsc->text[line_start] != '\0') { + pos.x += x_ofs; + line_start_x = pos.x; + + /*Write all letter of a line*/ + next_char_offset = 0; +#if LV_USE_BIDI + size_t bidi_size = line_end - line_start; + char * bidi_txt = lv_malloc(bidi_size + 1); + LV_ASSERT_MALLOC(bidi_txt); + + /** + * has_bided = 1: already executed lv_bidi_process_paragraph. + * has_bided = 0: has not been executed lv_bidi_process_paragraph.*/ + if(dsc->has_bided) { + lv_memcpy(bidi_txt, &dsc->text[line_start], bidi_size); + } + else { + lv_bidi_process_paragraph(dsc->text + line_start, bidi_txt, bidi_size, base_dir, NULL, 0); + } +#else + const char * bidi_txt = dsc->text + line_start; +#endif + + while(next_char_offset < remaining_len && next_char_offset < line_end - line_start) { + uint32_t logical_char_pos = 0; + + /* Check if the text selection is enabled */ + if(sel_start != LV_DRAW_LABEL_NO_TXT_SEL && sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { +#if LV_USE_BIDI + if(dsc->has_bided) { + logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start + next_char_offset); + } + else { + logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start); + uint32_t c_idx = lv_text_encoded_get_char_id(bidi_txt, next_char_offset); + logical_char_pos += lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, base_dir, c_idx, NULL); + } +#else + logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start + next_char_offset); +#endif + } + + uint32_t letter; + uint32_t letter_next; + lv_text_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &next_char_offset); + + /* If recolor is enabled */ + if((dsc->flag & LV_TEXT_FLAG_RECOLOR) != 0) { + + if(letter == (uint32_t)LV_TXT_COLOR_CMD[0]) { + /* Handle the recolor command marker depending of the current recolor state */ + + if(recolor_cmd_state == RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER) { + recolor_command_start_index = next_char_offset; + recolor_cmd_state = RECOLOR_CMD_STATE_PARAMETER; + continue; + } + /*Other start char in parameter escaped cmd. char*/ + else if(recolor_cmd_state == RECOLOR_CMD_STATE_PARAMETER) { + recolor_cmd_state = RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER; + } + /* If letter is LV_TXT_COLOR_CMD and we were in the CMD_STATE_IN then the recolor close marked has been found */ + else if(recolor_cmd_state == RECOLOR_CMD_STATE_TEXT_INPUT) { + recolor_cmd_state = RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER; + continue; + } + } + + /* Find the first space (aka ' ') after the recolor command parameter, we need to skip rendering it */ + if((recolor_cmd_state == RECOLOR_CMD_STATE_PARAMETER) && (letter == ' ') && (is_first_space_after_cmd == 0)) { + is_first_space_after_cmd = 1; + } + else { + is_first_space_after_cmd = 0; + } + + /* Skip the color parameter and wait the space after it + * Once we have reach the space ' ', then we will extract the color information + * and store it into the recolor variable */ + if(recolor_cmd_state == RECOLOR_CMD_STATE_PARAMETER) { + /* Not an space? Continue with the next character */ + if(letter != ' ') { + continue; + } + + /*Get the recolor parameter*/ + if((next_char_offset - recolor_command_start_index) == LABEL_RECOLOR_PAR_LENGTH + 1) { + /* Temporary buffer to hold the recolor information */ + char buf[LABEL_RECOLOR_PAR_LENGTH + 1]; + lv_memcpy(buf, &bidi_txt[recolor_command_start_index], LABEL_RECOLOR_PAR_LENGTH); + buf[LABEL_RECOLOR_PAR_LENGTH] = '\0'; + + uint8_t r, g, b; + r = (hex_char_to_num(buf[0]) << 4) + hex_char_to_num(buf[1]); + g = (hex_char_to_num(buf[2]) << 4) + hex_char_to_num(buf[3]); + b = (hex_char_to_num(buf[4]) << 4) + hex_char_to_num(buf[5]); + + recolor = lv_color_make(r, g, b); + } + else { + recolor.red = dsc->color.red; + recolor.blue = dsc->color.blue; + recolor.green = dsc->color.green; + } + + /*After the parameter the text is in the command*/ + recolor_cmd_state = RECOLOR_CMD_STATE_TEXT_INPUT; + } + + /* Don't draw the first space after the recolor command */ + if(is_first_space_after_cmd) { + continue; + } + } + + /* If we're in the CMD_STATE_IN state then we need to subtract the recolor command length */ + if(((dsc->flag & LV_TEXT_FLAG_RECOLOR) != 0) && (recolor_cmd_state == RECOLOR_CMD_STATE_TEXT_INPUT)) { + logical_char_pos -= (LABEL_RECOLOR_PAR_LENGTH + 1); + } + + lv_font_get_glyph_dsc(font, &glyph_dsc, letter, letter_next); + letter_w = lv_text_is_marker(letter) ? 0 : glyph_dsc.adv_w; + + /*Always set the bg_coordinates for placeholder drawing*/ + bg_coords.x1 = pos.x - dsc->letter_space / 2; + bg_coords.y1 = pos.y; + bg_coords.x2 = pos.x + letter_w - 1 + (dsc->letter_space + 1) / 2; + bg_coords.y2 = pos.y + line_height - 1; + + if(next_char_offset >= line_end - line_start) { + if(dsc->decor & LV_TEXT_DECOR_UNDERLINE) { + lv_area_t fill_area; + fill_area.x1 = line_start_x; + fill_area.x2 = pos.x + letter_w - 1; + fill_area.y1 = pos.y + font->line_height - font->base_line - font->underline_position; + fill_area.y2 = fill_area.y1 + underline_width - 1; + + fill_dsc.color = dsc->color; + cb(t, NULL, &fill_dsc, &fill_area); + } + if(dsc->decor & LV_TEXT_DECOR_STRIKETHROUGH) { + lv_area_t fill_area; + fill_area.x1 = line_start_x; + fill_area.x2 = pos.x + letter_w - 1; + fill_area.y1 = pos.y + (font->line_height - font->base_line) * 2 / 3 + font->underline_thickness / 2; + fill_area.y2 = fill_area.y1 + underline_width - 1; + + fill_dsc.color = dsc->color; + cb(t, NULL, &fill_dsc, &fill_area); + } + } + + /* Handle text selection */ + if(sel_start != LV_DRAW_LABEL_NO_TXT_SEL && sel_end != LV_DRAW_LABEL_NO_TXT_SEL + && logical_char_pos >= sel_start && logical_char_pos < sel_end) { + draw_letter_dsc.color = dsc->sel_color; + fill_dsc.color = dsc->sel_bg_color; + cb(t, NULL, &fill_dsc, &bg_coords); + } + else if(recolor_cmd_state == RECOLOR_CMD_STATE_TEXT_INPUT) { + draw_letter_dsc.color = recolor; + } + else { + draw_letter_dsc.color = dsc->color; + } + + lv_draw_unit_draw_letter(t, &draw_letter_dsc, &pos, font, letter, cb); + + if(letter_w > 0) { + pos.x += letter_w + dsc->letter_space; + } + } + +#if LV_USE_BIDI + lv_free(bidi_txt); + bidi_txt = NULL; +#endif + + lv_text_attributes_t text_attributes = {0}; + text_attributes.letter_space = dsc->letter_space; + text_attributes.text_flags = dsc->flag; + text_attributes.max_width = w; + + /*Go to next line*/ + remaining_len -= line_end - line_start; + line_start = line_end; + if(remaining_len) { + line_end += lv_text_get_next_line(&dsc->text[line_start], remaining_len, font, NULL, &text_attributes); + } + + pos.x = coords->x1; + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = + lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, &text_attributes); + + pos.x += (lv_area_get_width(coords) - line_width) / 2; + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = + lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, &text_attributes); + pos.x += lv_area_get_width(coords) - line_width; + } + + /*Go the next line position*/ + pos.y += line_height; + + if(pos.y > t->clip_area.y2) break; + } + + if(draw_letter_dsc._draw_buf) lv_draw_buf_destroy(draw_letter_dsc._draw_buf); + + LV_ASSERT_MEM_INTEGRITY(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Convert a hexadecimal characters to a number (0..15) + * @param hex Pointer to a hexadecimal character (0..9, A..F) + * @return the numerical value of `hex` or 0 on error + */ +static uint8_t hex_char_to_num(char hex) +{ + if(hex >= '0' && hex <= '9') return hex - '0'; + if(hex >= 'a') hex -= 'a' - 'A'; /*Convert to upper case*/ + return 'A' <= hex && hex <= 'F' ? hex - 'A' + 10 : 0; +} + +void lv_draw_unit_draw_letter(lv_draw_task_t * t, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, + const lv_font_t * font, uint32_t letter, lv_draw_glyph_cb_t cb) +{ + lv_font_glyph_dsc_t g; + + if(lv_text_is_marker(letter)) /*Markers are valid letters but should not be rendered.*/ + return; + + LV_PROFILER_DRAW_BEGIN; + if(dsc->g == NULL) { + dsc->g = &g; + /*If the glyph dsc is not set then get it from the font*/ + bool g_ret = lv_font_get_glyph_dsc(font, &g, letter, 0); + if(g_ret == false) { + /*Add warning if the dsc is not found*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter); + } + } + else { + /*If the glyph dsc is set then use it*/ + g = *dsc->g; + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) { + goto exit; + } + + lv_area_t letter_coords; + letter_coords.x1 = pos->x + g.ofs_x; + letter_coords.x2 = letter_coords.x1 + g.box_w - 1; + letter_coords.y1 = pos->y + (font->line_height - font->base_line) - g.box_h - g.ofs_y; + letter_coords.y2 = letter_coords.y1 + g.box_h - 1; + lv_area_move(&letter_coords, -dsc->pivot.x, -dsc->pivot.y); + + /*If the letter is completely out of mask don't draw it*/ + if(lv_area_is_out(&letter_coords, &t->clip_area, 0) && + dsc->bg_coords && + lv_area_is_out(dsc->bg_coords, &t->clip_area, 0)) { + goto exit; + } + + if(g.resolved_font) { + lv_draw_buf_t * draw_buf = NULL; + if(LV_FONT_GLYPH_FORMAT_NONE < g.format && g.format < LV_FONT_GLYPH_FORMAT_IMAGE) { + /*Only check draw buf for bitmap glyph*/ + draw_buf = lv_draw_buf_reshape(dsc->_draw_buf, 0, g.box_w, g.box_h, LV_STRIDE_AUTO); + if(draw_buf == NULL) { + if(dsc->_draw_buf) lv_draw_buf_destroy(dsc->_draw_buf); + + uint32_t h = LV_ROUND_UP(g.box_h, 32); /*Assume a larger size to avoid many reallocations*/ + draw_buf = lv_draw_buf_create_ex(font_draw_buf_handlers, g.box_w, h, LV_COLOR_FORMAT_A8, LV_STRIDE_AUTO); + LV_ASSERT_MALLOC(draw_buf); + draw_buf->header.h = g.box_h; + dsc->_draw_buf = draw_buf; + } + } + + dsc->format = g.format; + + if(g.format == LV_FONT_GLYPH_FORMAT_VECTOR) { + + /*Load the outline of the glyph, even if the function says bitmap*/ + dsc->glyph_data = (void *) lv_font_get_glyph_bitmap(dsc->g, draw_buf); + dsc->format = dsc->glyph_data ? g.format : LV_FONT_GLYPH_FORMAT_NONE; + } + } + else { + dsc->format = LV_FONT_GLYPH_FORMAT_NONE; + } + + dsc->letter_coords = &letter_coords; + cb(t, dsc, NULL, NULL); + + lv_font_glyph_release_draw_data(dsc->g); + +exit: + if(dsc->g == &g) { + /* If the glyph was created locally, we don't need to keep it */ + dsc->g = NULL; + } + LV_PROFILER_DRAW_END; +} diff --git a/inc/lvgl/src/draw/lv_draw_label.h b/inc/lvgl/src/draw/lv_draw_label.h new file mode 100644 index 0000000..7d5f478 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_label.h @@ -0,0 +1,252 @@ +/** + * @file lv_draw_label.h + * + */ + +#ifndef LV_DRAW_LABEL_H +#define LV_DRAW_LABEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "lv_draw_rect.h" +#include "../misc/lv_bidi.h" +#include "../misc/lv_text.h" +#include "../misc/lv_color.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ +#define LV_DRAW_LABEL_NO_TXT_SEL (0xFFFF) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_dsc_base_t base; + + /**The text to draw*/ + const char * text; + + /**The size of the text*/ + lv_point_t text_size; + + /**The font to use. Fallback fonts are also handled.*/ + const lv_font_t * font; + + /**Color of the text*/ + lv_color_t color; + + /**Extra space between the lines*/ + int32_t line_space; + + /**Extra space between the characters*/ + int32_t letter_space; + + /**Offset the text with this value horizontally*/ + int32_t ofs_x; + + /**Offset the text with this value vertically*/ + int32_t ofs_y; + + /**Rotation of the letters in 0.1 degree unit*/ + int32_t rotation; + + /**The first characters index for selection (not byte index). `LV_DRAW_LABEL_NO_TXT_SEL` for no selection*/ + uint32_t sel_start; + + /**The last characters's index for selection (not byte index). `LV_DRAW_LABEL_NO_TXT_SEL` for no selection*/ + uint32_t sel_end; + + /**Color of the selected characters*/ + lv_color_t sel_color; + + /**Background color of the selected characters*/ + lv_color_t sel_bg_color; + + /**The number of characters to render. 0: means render until reaching the `\0` termination.*/ + uint32_t text_length; + + /**The alignment of the text `LV_TEXT_ALIGN_LEFT/RIGHT/CENTER`*/ + lv_text_align_t align; + + /**The base direction. Used when type setting Right-to-left (e.g. Arabic) texts*/ + lv_base_dir_t bidi_dir; + + /**Opacity of the text in 0...255 range. + * LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/ + lv_opa_t opa; + + /**Letter outline stroke opacity */ + lv_opa_t outline_stroke_opa; + + /**Text decoration, e.g. underline*/ + lv_text_decor_t decor : 3; + + /**Some flags to control type setting*/ + lv_text_flag_t flag : 5; + + /**1: malloc a buffer and copy `text` there. + * 0: `text` will be valid during rendering.*/ + uint8_t text_local : 1; + + /**Indicate that the text is constant and its pointer can be safely saved e.g. in a cache.*/ + uint8_t text_static : 1; + + /**1: already executed lv_bidi_process_paragraph. + * 0: has not been executed lv_bidi_process_paragraph.*/ + uint8_t has_bided : 1; + + /**Pointer to an externally stored struct where some data can be cached to speed up rendering*/ + lv_draw_label_hint_t * hint; + + /* Properties of the letter outlines */ + lv_color_t outline_stroke_color; + int32_t outline_stroke_width; + +} lv_draw_label_dsc_t; + +typedef struct { + lv_draw_dsc_base_t base; + + uint32_t unicode; + const lv_font_t * font; + lv_color_t color; + + int32_t rotation; + int32_t scale_x; + int32_t scale_y; + int32_t skew_x; + int32_t skew_y; + lv_point_t pivot; + + lv_opa_t opa; + lv_text_decor_t decor : 3; + lv_blend_mode_t blend_mode : 4; + + /* Properties of the letter outlines */ + lv_opa_t outline_stroke_opa; + int32_t outline_stroke_width; + lv_color_t outline_stroke_color; + +} lv_draw_letter_dsc_t; + +/** + * Passed as a parameter to `lv_draw_label_iterate_characters` to + * draw the characters one by one + * @param t pointer to a draw task + * @param dsc pointer to `lv_draw_glyph_dsc_t` to describe the character to draw + * if NULL don't draw character + * @param fill_dsc pointer to a fill descriptor to draw a background for the character or + * underline or strike through + * if NULL do not fill anything + * @param fill_area the area to fill + * if NULL do not fill anything + */ +typedef void(*lv_draw_glyph_cb_t)(lv_draw_task_t * t, lv_draw_glyph_dsc_t * dsc, lv_draw_fill_dsc_t * fill_dsc, + const lv_area_t * fill_area); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_letter_dsc_init(lv_draw_letter_dsc_t * dsc); + +/** + * Initialize a label draw descriptor + * @param dsc pointer to a draw descriptor + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc); + +/** + * Try to get a label draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_LABEL + */ +lv_draw_label_dsc_t * lv_draw_task_get_label_dsc(lv_draw_task_t * task); + +/** + * Initialize a glyph draw descriptor. + * Used internally. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_glyph_dsc_init(lv_draw_glyph_dsc_t * dsc); + +/** + * Create a draw task to render a text + * @param layer pointer to a layer + * @param dsc pointer to draw descriptor + * @param coords coordinates of the character + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); + +/** + * Create a draw task to render a single character + * @param layer pointer to a layer + * @param dsc pointer to draw descriptor + * @param point position of the label + * @param unicode_letter the letter to draw + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc, + const lv_point_t * point, uint32_t unicode_letter); + +/** + * Draw a single letter + * @param layer pointer to a layer + * @param dsc pointer to draw descriptor + * @param point position of the label + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_letter(lv_layer_t * layer, lv_draw_letter_dsc_t * dsc, + const lv_point_t * point); + +/** + * Should be used during rendering the characters to get the position and other + * parameters of the characters + * @param t pointer to a draw task + * @param dsc pointer to draw descriptor + * @param coords coordinates of the label + * @param cb a callback to call to draw each glyphs one by one + */ +void lv_draw_label_iterate_characters(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords, lv_draw_glyph_cb_t cb); + +/** + * @brief Draw a single letter using the provided draw unit, glyph descriptor, position, font, and callback. + * + * This function is responsible for rendering a single character from a text string, + * applying the necessary styling described by the glyph descriptor (`dsc`). It handles + * the retrieval of the glyph's description, checks its visibility within the clipping area, + * and invokes the callback (`cb`) to render the glyph at the specified position (`pos`) + * using the given font (`font`). + * + * @param t Pointer to the drawing task. + * @param dsc Pointer to the descriptor containing styling for the glyph to be drawn. + * @param pos Pointer to the point coordinates where the letter should be drawn. + * @param font Pointer to the font containing the glyph. + * @param letter The Unicode code point of the letter to be drawn. + * @param cb Callback function to execute the actual rendering of the glyph. + */ +void lv_draw_unit_draw_letter(lv_draw_task_t * t, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, + const lv_font_t * font, uint32_t letter, lv_draw_glyph_cb_t cb); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_LABEL_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_label_private.h b/inc/lvgl/src/draw/lv_draw_label_private.h new file mode 100644 index 0000000..0ec1781 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_label_private.h @@ -0,0 +1,74 @@ +/** + * @file lv_draw_label_private.h + * + */ + +#ifndef LV_DRAW_LABEL_PRIVATE_H +#define LV_DRAW_LABEL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_label.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Store some info to speed up drawing of very large texts + * It takes a lot of time to get the first visible character because + * all the previous characters needs to be checked to calculate the positions. + * This structure stores an earlier (e.g. at -1000 px) coordinate and the index of that line. + * Therefore the calculations can start from here.*/ +struct _lv_draw_label_hint_t { + /** Index of the line at `y` coordinate*/ + int32_t line_start; + + /** Give the `y` coordinate of the first letter at `line start` index. Relative to the label's coordinates*/ + int32_t y; + + /** The 'y1' coordinate of the label when the hint was saved. + * Used to invalidate the hint if the label has moved too much.*/ + int32_t coord_y; +}; + +struct _lv_draw_glyph_dsc_t { + /** Depends on `format` field, it could be image source or draw buf of bitmap or vector data. */ + const void * glyph_data; + lv_font_glyph_format_t format; + const lv_area_t * letter_coords; + const lv_area_t * bg_coords; + lv_font_glyph_dsc_t * g; + lv_color_t color; + lv_opa_t opa; + lv_color_t outline_stroke_color; + lv_opa_t outline_stroke_opa; + int32_t outline_stroke_width; + int32_t rotation; + lv_point_t pivot; /**< Rotation pivot point associated with total glyph including line_height */ + lv_draw_buf_t * _draw_buf; /**< a shared draw buf for get_bitmap, do not use it directly, use glyph_data instead */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_LABEL_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_line.c b/inc/lvgl/src/draw/lv_draw_line.c new file mode 100644 index 0000000..ed11728 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_line.c @@ -0,0 +1,167 @@ +/** + * @file lv_draw_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_private.h" +#include "../core/lv_refr.h" +#include "../misc/lv_math.h" +#include "../misc/lv_types.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_line_dsc_t)); + dsc->width = 1; + dsc->opa = LV_OPA_COVER; + dsc->color = lv_color_black(); + dsc->base.dsc_size = sizeof(lv_draw_line_dsc_t); +} + +lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_LINE ? (lv_draw_line_dsc_t *)task->draw_dsc : NULL; +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_line(lv_layer_t * layer, const lv_draw_line_dsc_t * dsc) +{ + if(dsc->width == 0) return; + if(dsc->opa <= LV_OPA_MIN) return; + + LV_PROFILER_DRAW_BEGIN; + + lv_area_t a; + lv_point_precise_t * new_points = NULL; + if(dsc->points == NULL) { + a.x1 = (int32_t)LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width; + a.x2 = (int32_t)LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width; + a.y1 = (int32_t)LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width; + a.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width; + } + else { + if(dsc->point_cnt <= 1) { + LV_LOG_INFO("Skip line drawing as point_cnt was 1"); + LV_PROFILER_DRAW_END; + return; + } + + a.x1 = LV_COORD_MAX; + a.y1 = LV_COORD_MAX; + a.x2 = LV_COORD_MIN; + a.y2 = LV_COORD_MIN; + + const size_t array_size = dsc->point_cnt * sizeof(lv_point_precise_t); + new_points = lv_malloc(array_size); + LV_ASSERT_MALLOC(new_points); + if(!new_points) { + LV_LOG_WARN("Couldn't allocate %" LV_PRId32 "points", dsc->point_cnt); + LV_PROFILER_DRAW_END; + return; + } + + int32_t i; + for(i = 0; i < dsc->point_cnt; i++) { + new_points[i] = dsc->points[i]; + if(dsc->points[i].x == LV_DRAW_LINE_POINT_NONE || + dsc->points[i].y == LV_DRAW_LINE_POINT_NONE) { + continue; + } + + a.x1 = (int32_t)LV_MIN(a.x1, dsc->points[i].x) - dsc->width; + a.x2 = (int32_t)LV_MAX(a.x2, dsc->points[i].x) + dsc->width; + a.y1 = (int32_t)LV_MIN(a.y1, dsc->points[i].y) - dsc->width; + a.y2 = (int32_t)LV_MAX(a.y2, dsc->points[i].y) + dsc->width; + } + + if(a.x1 == LV_COORD_MAX) { + lv_free(new_points); + LV_LOG_INFO("No valid point was found. Not adding the draw task."); + LV_PROFILER_DRAW_END; + return; + } + lv_area_increase(&a, dsc->width, dsc->width); + } + + if(dsc->base.drop_shadow_opa) { + lv_layer_t * ds_layer = lv_draw_layer_create_drop_shadow(layer, &dsc->base, &a); + LV_ASSERT_NULL(ds_layer); + lv_draw_line_dsc_t ds_dsc = *dsc; + ds_dsc.base.drop_shadow_opa = 0; /*Disable drop shadow so rendering below will render plain line*/ + lv_draw_line(ds_layer, &ds_dsc); + lv_draw_layer_finish_drop_shadow(ds_layer, &dsc->base); + } + + lv_draw_task_t * t = lv_draw_add_task(layer, &a, LV_DRAW_TASK_TYPE_LINE); + lv_draw_line_dsc_t * line_draw_dsc = t->draw_dsc; + lv_memcpy(line_draw_dsc, dsc, sizeof(*dsc)); + line_draw_dsc->points = new_points; + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_DRAW_END; +} + + +void lv_draw_line_iterate(lv_draw_task_t * t, lv_draw_line_dsc_t * dsc, + void (*draw_line_cb)(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc)) +{ + uint32_t i; + lv_point_precise_t * points = dsc->points; + if(points == NULL) { + draw_line_cb(t, dsc); + } + else { + /*Create a temporary dsc where the point array is replaced by 2 points*/ + lv_draw_line_dsc_t dsc_tmp = *dsc; + size_t point_cnt = dsc_tmp.point_cnt; + if(point_cnt <= 1) return; + + dsc_tmp.points = NULL; + dsc_tmp.point_cnt = 0; + for(i = 0; i < point_cnt - 1; i++) { + if(points[i].x == LV_DRAW_LINE_POINT_NONE || + points[i].y == LV_DRAW_LINE_POINT_NONE) { + continue; + } + if(points[i + 1].x == LV_DRAW_LINE_POINT_NONE || + points[i + 1].y == LV_DRAW_LINE_POINT_NONE) { + continue; + } + + dsc_tmp.p1 = points[i]; + dsc_tmp.p2 = points[i + 1]; + + draw_line_cb(t, &dsc_tmp); + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/draw/lv_draw_line.h b/inc/lvgl/src/draw/lv_draw_line.h new file mode 100644 index 0000000..fe70bad --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_line.h @@ -0,0 +1,123 @@ +/** + * @file lv_draw_line.h + * + */ + +#ifndef LV_DRAW_LINE_H +#define LV_DRAW_LINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ +#if LV_USE_FLOAT +#include +#define LV_DRAW_LINE_POINT_NONE FLT_MAX +#else +#define LV_DRAW_LINE_POINT_NONE INT32_MAX +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_dsc_base_t base; + + /**The first point of the line. If `LV_USE_FLOAT` is enabled float number can be also used. + *Ignored if `points` are set*/ + lv_point_precise_t p1; + + /**The second point of the line. If `LV_USE_FLOAT` is enabled float number can be also used + * Ignored if `points` are set*/ + lv_point_precise_t p2; + + /**Array of points to draw. If `LV_USE_FLOAT` is enabled, float numbers can also be used.*/ + lv_point_precise_t * points; + + /** + * Number of points in the `points` + */ + int32_t point_cnt; + + /**The color of the line*/ + lv_color_t color; + + /**The width (thickness) of the line*/ + int32_t width; + + /** The length of a dash (0: don't dash)*/ + int32_t dash_width; + + /** The length of the gaps between dashes (0: don't dash)*/ + int32_t dash_gap; + + /**Opacity of the line in 0...255 range. + * LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/ + lv_opa_t opa; + + /**Make the line start rounded*/ + uint8_t round_start : 1; + + /**Make the line end rounded*/ + uint8_t round_end : 1; + + /**1: Do not bother with line ending (if it's not visible for any reason) */ + uint8_t raw_end : 1; +} lv_draw_line_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a line draw descriptor + * @param dsc pointer to a draw descriptor + */ +void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc); + +/** + * Try to get a line draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_LINE + */ +lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task); + +/** + * Create a line draw task + * @param layer pointer to a layer + * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable + */ +void lv_draw_line(lv_layer_t * layer, const lv_draw_line_dsc_t * dsc); + +/** + * A helper function to call a callback which draws a line between two points. + * This way it doesn't matter if ``p1, p2`` or ``points`` were used as it calls the + * ``callback`` as needed. + * @param t draw task + * @param dsc pointer to a draw descriptor + * @param draw_line_cb a callback that draws a line between ``dsc->p1`` and ``dsc->p2`` + */ +void lv_draw_line_iterate(lv_draw_task_t * t, lv_draw_line_dsc_t * dsc, + void (*draw_line_cb)(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc)); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_LINE_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_mask.c b/inc/lvgl/src/draw/lv_draw_mask.c new file mode 100644 index 0000000..881f4ec --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_mask.c @@ -0,0 +1,79 @@ +/** + * @file lv_draw_mask.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_mask.h" +#include "lv_draw_private.h" +#include "../core/lv_refr.h" +#include "../misc/lv_math.h" +#include "../misc/lv_types.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_mask_rect_dsc_t)); +} + +lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_MASK_RECTANGLE ? (lv_draw_mask_rect_dsc_t *)task->draw_dsc : NULL; +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc) +{ + if(!lv_color_format_has_alpha(layer->color_format)) { + LV_LOG_WARN("Only layers with alpha channel can be masked"); + return; + } + LV_PROFILER_DRAW_BEGIN; + + lv_draw_task_t * t = lv_draw_add_task(layer, &layer->buf_area, LV_DRAW_TASK_TYPE_MASK_RECTANGLE); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + lv_draw_dsc_base_t * base_dsc = t->draw_dsc; + base_dsc->layer = layer; + + if(base_dsc->obj && lv_obj_has_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS)) { + /*Disable sending LV_EVENT_DRAW_TASK_ADDED first to avoid triggering recursive + *event calls due draw task adds in the event*/ + lv_obj_remove_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + lv_obj_send_event(dsc->base.obj, LV_EVENT_DRAW_TASK_ADDED, t); + lv_obj_add_flag(base_dsc->obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + } + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/draw/lv_draw_mask.h b/inc/lvgl/src/draw/lv_draw_mask.h new file mode 100644 index 0000000..ae0b349 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_mask.h @@ -0,0 +1,75 @@ +/** + * @file lv_draw_mask.h + * + */ + +#ifndef LV_DRAW_MASK_H +#define LV_DRAW_MASK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_mask_rect_dsc_t { + lv_draw_dsc_base_t base; + + /**The area to mask.*/ + lv_area_t area; + + /**The radius of masking*/ + int32_t radius; + + /**0: clear the content out of the `area`. + * 1: don't touch the area out of `area`*/ + uint32_t keep_outside : 1; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a rectangle mask draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc); + +/** + * Try to get a rectangle mask draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_MASK_RECTANGLE + */ +lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task); + +/** + * Create a draw task to mask a rectangle from the buffer + * @param layer pointer to a layer + * @param dsc pointer to a draw descriptor + */ +void lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_MASK_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_private.h b/inc/lvgl/src/draw/lv_draw_private.h new file mode 100644 index 0000000..682f8b4 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_private.h @@ -0,0 +1,210 @@ +/** + * @file lv_draw_private.h + * + */ + +/** + * Modified by NXP in 2024 + */ + +#ifndef LV_DRAW_PRIVATE_H +#define LV_DRAW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw.h" +#include "../osal/lv_os_private.h" +#include "../misc/cache/lv_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_task_t { + lv_draw_task_t * next; + + lv_draw_task_type_t type; + + /** + * The area where to draw + */ + lv_area_t area; + + /** + * The real draw area. E.g. for shadow, outline, or transformed images it's different from `area` + */ + lv_area_t _real_area; + + /** The original area which is updated*/ + lv_area_t clip_area_original; + + /** + * The clip area of the layer is saved here when the draw task is created. + * As the clip area of the layer can be changed as new draw tasks are added its current value needs to be saved. + * Therefore during drawing the layer's clip area shouldn't be used as it might be already changed for other draw tasks. + */ + lv_area_t clip_area; + lv_layer_t * target_layer; + +#if LV_DRAW_TRANSFORM_USE_MATRIX + /** Transform matrix to be applied when rendering the layer */ + lv_matrix_t matrix; +#endif + + /* Reference to the draw unit for debug or draw context purposes */ + lv_draw_unit_t * draw_unit; + + volatile int state; /** int instead of lv_draw_task_state_t to be sure its atomic */ + + void * draw_dsc; + + /** Opacity of the layer */ + lv_opa_t opa; + + /** + * The ID of the draw_unit which should take this task + */ + uint8_t preferred_draw_unit_id; + + /** + * Set to which extent `preferred_draw_unit_id` is good at this task. + * 80: means 20% better (faster) than software rendering + * 100: the default value + * 110: means 10% worse (slower) than software rendering + */ + uint8_t preference_score; + +}; + +struct _lv_draw_mask_t { + void * user_data; +}; + +struct _lv_draw_unit_t { + lv_draw_unit_t * next; + + /** + * Name and ID of the draw unit, for debugging purposes only. + */ + const char * name; + int32_t idx; + + /** + * Called to try to assign a draw task to itself. + * `lv_draw_get_next_available_task` can be used to get an independent draw task. + * A draw task should be assign only if the draw unit can draw it too + * @param draw_unit pointer to the draw unit + * @param layer pointer to a layer on which the draw task should be drawn + * @return >=0: The number of taken draw task: + * 0 means the task has not yet been completed. + * 1 means a new task has been accepted. + * -1: The draw unit wanted to work on a task but couldn't do that + * due to some errors (e.g. out of memory). + * It signals that LVGL should call the dispatcher later again + * to let draw unit try to start the rendering again. + */ + int32_t (*dispatch_cb)(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + + /** + * + * @param draw_unit + * @param task + * @return + */ + int32_t (*evaluate_cb)(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + + /** + * Called to signal the unit to complete all tasks in order to return their ready status. + * This callback can be implemented in case of asynchronous task processing. + * Below is an example to show the difference between synchronous and asynchronous: + * + * Synchronous: + * LVGL thread DRAW thread HW + * + * task1 --> submit --> Receive task1 + * wait_for_finish() + * <-- task1->state = READY <-- Complete task1 + * task2 --> submit --> Receive task2 + * wait_for_finish() + * task2->state = READY <-- Complete task2 + * task3 --> submit --> Receive task3 + * wait_for_finish() + * <-- task3->state = READY <-- Complete task3 + * task4 --> submit --> Receive task4 + * wait_for_finish() + * <-- task4->state = READY <-- Complete task4 + * NO MORE TASKS + * + * + * Asynchronous: + * LVGL thread DRAW thread HW + * is IDLE + * task1 --> queue task1 + * submit --> Receive task1 + * task2 --> queue task2 is BUSY (with task1) + * task3 --> queue task3 still BUSY (with task1) + * task4 --> queue task4 becomes IDLE + * <-- task1->state = READY <-- Complete task1 + * submit --> Receive task2, task3, task4 + * NO MORE TASKS + * wait_for_finish_cb() wait_for_finish() + * <-- Complete task2, task3, task4 + * <-- task2->state = READY <-- + * <-- task3->state = READY <-- + * <-- task4->state = READY <-- + * + * @param draw_unit + * @return + */ + int32_t (*wait_for_finish_cb)(lv_draw_unit_t * draw_unit); + + /** + * Called to delete draw unit. + * @param draw_unit + * @return + */ + int32_t (*delete_cb)(lv_draw_unit_t * draw_unit); + + /** + * Called when an event is sent to the draw unit. + * @param event pointer to the event descriptor + */ + void (*event_cb)(lv_event_t * event); +}; + +typedef struct { + lv_draw_unit_t * unit_head; + uint32_t unit_cnt; + uint32_t used_memory_for_layers; /* measured as bytes */ +#if LV_USE_OS + lv_thread_sync_t sync; +#else + volatile int dispatch_req; +#endif + lv_mutex_t circle_cache_mutex; + bool task_running; +} lv_draw_global_info_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_rect.c b/inc/lvgl/src/draw/lv_draw_rect.c new file mode 100644 index 0000000..8cd8b0a --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_rect.c @@ -0,0 +1,377 @@ +/** + * @file lv_draw_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_rect_private.h" +#include "lv_draw_private.h" +#include "../core/lv_obj.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_text_private.h" +#include "../core/lv_obj_event.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(lv_draw_rect_dsc_t)); + dsc->bg_color = lv_color_white(); + dsc->bg_grad.stops[0].color = lv_color_white(); + dsc->bg_grad.stops[1].color = lv_color_black(); + dsc->bg_grad.stops[1].frac = 0xFF; + dsc->bg_grad.stops_count = 2; + dsc->border_color = lv_color_black(); + dsc->shadow_color = lv_color_black(); + dsc->bg_image_symbol_font = LV_FONT_DEFAULT; + dsc->bg_opa = LV_OPA_COVER; + dsc->bg_image_opa = LV_OPA_COVER; + dsc->outline_opa = LV_OPA_COVER; + dsc->border_opa = LV_OPA_COVER; + dsc->shadow_opa = LV_OPA_COVER; + dsc->border_side = LV_BORDER_SIDE_FULL; +} + +void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(*dsc)); + dsc->opa = LV_OPA_COVER; + dsc->base.dsc_size = sizeof(lv_draw_fill_dsc_t); +} + +lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_FILL ? (lv_draw_fill_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_fill(lv_layer_t * layer, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + LV_PROFILER_DRAW_BEGIN; + + if(dsc->base.drop_shadow_opa) { + lv_layer_t * ds_layer = lv_draw_layer_create_drop_shadow(layer, &dsc->base, coords); + LV_ASSERT_NULL(ds_layer); + lv_draw_fill_dsc_t ds_dsc = *dsc; + ds_dsc.base.drop_shadow_opa = 0; /*Disable drop shadow so rendering below will render plain fill*/ + lv_draw_fill(ds_layer, &ds_dsc, coords); + lv_draw_layer_finish_drop_shadow(ds_layer, &dsc->base); + } + + lv_draw_task_t * t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_FILL); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_DRAW_END; +} + +void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(*dsc)); + dsc->opa = LV_OPA_COVER; + dsc->side = LV_BORDER_SIDE_FULL; + dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t); +} + +lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_BORDER ? (lv_draw_border_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_border(lv_layer_t * layer, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + LV_PROFILER_DRAW_BEGIN; + + if(dsc->base.drop_shadow_opa) { + lv_layer_t * ds_layer = lv_draw_layer_create_drop_shadow(layer, &dsc->base, coords); + LV_ASSERT_NULL(ds_layer); + lv_draw_border_dsc_t ds_dsc = *dsc; + ds_dsc.base.drop_shadow_opa = 0; /*Disable drop shadow so rendering below will render plain border*/ + lv_draw_border(ds_layer, &ds_dsc, coords); + lv_draw_layer_finish_drop_shadow(ds_layer, &dsc->base); + } + + lv_draw_task_t * t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_BORDER); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_DRAW_END; +} + +void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc) +{ + lv_memzero(dsc, sizeof(*dsc)); + dsc->opa = LV_OPA_COVER; + dsc->base.dsc_size = sizeof(lv_draw_box_shadow_dsc_t); +} + +lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_BOX_SHADOW ? (lv_draw_box_shadow_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_box_shadow(lv_layer_t * layer, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + LV_PROFILER_DRAW_BEGIN; + lv_draw_task_t * t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_BOX_SHADOW); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_DRAW_END; +} + +void lv_draw_rect(lv_layer_t * layer, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords) +{ + + LV_PROFILER_DRAW_BEGIN; + + bool has_shadow; + bool has_fill; + bool has_border; + bool has_outline; + bool has_bg_img; + + if(dsc->shadow_width == 0 || + dsc->shadow_opa <= LV_OPA_MIN || + (dsc->shadow_width == 1 && dsc->shadow_spread <= 0 && + dsc->shadow_offset_x == 0 && dsc->shadow_offset_y == 0)) { + has_shadow = false; + } + else { + has_shadow = true; + } + + if(dsc->bg_opa <= LV_OPA_MIN) has_fill = false; + else has_fill = true; + + if(dsc->bg_image_opa <= LV_OPA_MIN || dsc->bg_image_src == NULL) has_bg_img = false; + else has_bg_img = true; + + if(dsc->border_opa <= LV_OPA_MIN + || dsc->border_width == 0 + || dsc->border_post == true + || dsc->border_side == LV_BORDER_SIDE_NONE) has_border = false; + else has_border = true; + + if(dsc->outline_opa <= LV_OPA_MIN || dsc->outline_width == 0) has_outline = false; + else has_outline = true; + + bool bg_cover = true; + if(dsc->bg_opa < LV_OPA_COVER) bg_cover = false; + else if(dsc->bg_grad.dir != LV_GRAD_DIR_NONE) { + uint32_t s; + for(s = 0; s < dsc->bg_grad.stops_count; s++) { + if(dsc->bg_grad.stops[s].opa != LV_OPA_COVER) { + bg_cover = false; + break; + } + } + } + + if(dsc->base.drop_shadow_opa && (has_fill || has_outline)) { + lv_layer_t * ds_layer = lv_draw_layer_create_drop_shadow(layer, &dsc->base, coords); + LV_ASSERT_NULL(ds_layer); + lv_draw_rect_dsc_t ds_dsc = *dsc; + ds_dsc.base.drop_shadow_opa = 0; /*Disable drop shadow so rendering below will render plain shadow*/ + ds_dsc.shadow_opa = 0; + lv_draw_rect(ds_layer, &ds_dsc, coords); + lv_draw_layer_finish_drop_shadow(ds_layer, &dsc->base); + } + + lv_draw_task_t * t; + + /*Shadow*/ + if(has_shadow) { + /*Check whether the shadow is visible*/ + t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_BOX_SHADOW); + lv_draw_box_shadow_dsc_t * shadow_dsc = t->draw_dsc; + + lv_area_increase(&t->_real_area, dsc->shadow_spread, dsc->shadow_spread); + lv_area_increase(&t->_real_area, dsc->shadow_width, dsc->shadow_width); + lv_area_move(&t->_real_area, dsc->shadow_offset_x, dsc->shadow_offset_y); + shadow_dsc->base = dsc->base; + shadow_dsc->base.dsc_size = sizeof(lv_draw_box_shadow_dsc_t); + shadow_dsc->radius = dsc->radius; + shadow_dsc->color = dsc->shadow_color; + shadow_dsc->width = dsc->shadow_width; + shadow_dsc->spread = dsc->shadow_spread; + shadow_dsc->opa = dsc->shadow_opa; + shadow_dsc->ofs_x = dsc->shadow_offset_x; + shadow_dsc->ofs_y = dsc->shadow_offset_y; + shadow_dsc->bg_cover = bg_cover; + lv_draw_finalize_task_creation(layer, t); + } + + /*Background*/ + if(has_fill) { + lv_area_t bg_coords = *coords; + /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ + if(dsc->border_width > 1 && dsc->border_opa >= LV_OPA_MAX && dsc->radius != 0) { + bg_coords.x1 += (dsc->border_side & LV_BORDER_SIDE_LEFT) ? 1 : 0; + bg_coords.y1 += (dsc->border_side & LV_BORDER_SIDE_TOP) ? 1 : 0; + bg_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; + bg_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; + } + + t = lv_draw_add_task(layer, &bg_coords, LV_DRAW_TASK_TYPE_FILL); + lv_draw_fill_dsc_t * bg_dsc = t->draw_dsc; + + lv_draw_fill_dsc_init(bg_dsc); + bg_dsc->base = dsc->base; + bg_dsc->base.dsc_size = sizeof(lv_draw_fill_dsc_t); + bg_dsc->radius = dsc->radius; + bg_dsc->color = dsc->bg_color; + bg_dsc->grad = dsc->bg_grad; + bg_dsc->opa = dsc->bg_opa; + + lv_draw_finalize_task_creation(layer, t); + } + + /*Background image*/ + if(has_bg_img) { + lv_image_src_t src_type = lv_image_src_get_type(dsc->bg_image_src); + lv_result_t res = LV_RESULT_OK; + lv_image_header_t header; + if(src_type == LV_IMAGE_SRC_VARIABLE || src_type == LV_IMAGE_SRC_FILE) { + res = lv_image_decoder_get_info(dsc->bg_image_src, &header); + } + else { + lv_memzero(&header, sizeof(header)); + + if(src_type == LV_IMAGE_SRC_UNKNOWN) { + res = LV_RESULT_INVALID; + } + } + + if(res == LV_RESULT_OK) { + if(src_type == LV_IMAGE_SRC_VARIABLE || src_type == LV_IMAGE_SRC_FILE) { + + if(dsc->bg_image_tiled) { + t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_IMAGE); + } + else { + lv_area_t a = {0, 0, header.w - 1, header.h - 1}; + lv_area_align(coords, &a, LV_ALIGN_CENTER, 0, 0); + t = lv_draw_add_task(layer, &a, LV_DRAW_TASK_TYPE_IMAGE); + } + + lv_draw_image_dsc_t * bg_image_dsc = t->draw_dsc; + + lv_draw_image_dsc_init(bg_image_dsc); + bg_image_dsc->base = dsc->base; + bg_image_dsc->base.dsc_size = sizeof(lv_draw_image_dsc_t); + bg_image_dsc->src = dsc->bg_image_src; + bg_image_dsc->opa = dsc->bg_image_opa; + bg_image_dsc->recolor = dsc->bg_image_recolor; + bg_image_dsc->recolor_opa = dsc->bg_image_recolor_opa; + bg_image_dsc->tile = dsc->bg_image_tiled; + bg_image_dsc->colorkey = dsc->bg_image_colorkey; + bg_image_dsc->header = header; + bg_image_dsc->clip_radius = dsc->radius; + bg_image_dsc->image_area = *coords; + lv_draw_finalize_task_creation(layer, t); + } + else { + lv_point_t s; + + lv_text_attributes_t attributes = {0}; + attributes.text_flags = LV_TEXT_FLAG_NONE; + attributes.max_width = LV_COORD_MAX; + attributes.line_space = 0; + attributes.letter_space = 0; + + lv_text_get_size_attributes(&s, dsc->bg_image_src, dsc->bg_image_symbol_font, &attributes); + + lv_area_t a = {0, 0, s.x - 1, s.y - 1}; + lv_area_align(coords, &a, LV_ALIGN_CENTER, 0, 0); + t = lv_draw_add_task(layer, &a, LV_DRAW_TASK_TYPE_LABEL); + + lv_draw_label_dsc_t * bg_label_dsc = t->draw_dsc; + + lv_draw_label_dsc_init(bg_label_dsc); + bg_label_dsc->base = dsc->base; + bg_label_dsc->base.dsc_size = sizeof(lv_draw_label_dsc_t); + bg_label_dsc->color = dsc->bg_image_recolor; + bg_label_dsc->font = dsc->bg_image_symbol_font; + bg_label_dsc->text = dsc->bg_image_src; + t->type = LV_DRAW_TASK_TYPE_LABEL; + lv_draw_finalize_task_creation(layer, t); + } + } + } + + /*Border*/ + if(has_border) { + t = lv_draw_add_task(layer, coords, LV_DRAW_TASK_TYPE_BORDER); + lv_draw_border_dsc_t * border_dsc = t->draw_dsc; + + border_dsc->base = dsc->base; + border_dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t); + border_dsc->radius = dsc->radius; + border_dsc->color = dsc->border_color; + border_dsc->opa = dsc->border_opa; + border_dsc->width = dsc->border_width; + border_dsc->side = dsc->border_side; + lv_draw_finalize_task_creation(layer, t); + } + + /*Outline*/ + if(has_outline) { + lv_area_t outline_coords = *coords; + lv_area_increase(&outline_coords, dsc->outline_width + dsc->outline_pad, dsc->outline_width + dsc->outline_pad); + t = lv_draw_add_task(layer, &outline_coords, LV_DRAW_TASK_TYPE_BORDER); + lv_draw_border_dsc_t * outline_dsc = t->draw_dsc; + lv_area_increase(&t->_real_area, dsc->outline_width, dsc->outline_width); + lv_area_increase(&t->_real_area, dsc->outline_pad, dsc->outline_pad); + outline_dsc->base = dsc->base; + outline_dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t); + outline_dsc->radius = dsc->radius == LV_RADIUS_CIRCLE ? LV_RADIUS_CIRCLE : dsc->radius + dsc->outline_width + + dsc->outline_pad; + outline_dsc->color = dsc->outline_color; + outline_dsc->opa = dsc->outline_opa; + outline_dsc->width = dsc->outline_width; + outline_dsc->side = LV_BORDER_SIDE_FULL; + lv_draw_finalize_task_creation(layer, t); + } + + LV_ASSERT_MEM_INTEGRITY(); + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/draw/lv_draw_rect.h b/inc/lvgl/src/draw/lv_draw_rect.h new file mode 100644 index 0000000..9c870d1 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_rect.h @@ -0,0 +1,239 @@ +/** + * @file lv_draw_rect.h + * + */ + +#ifndef LV_DRAW_RECT_H +#define LV_DRAW_RECT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw.h" +#include "../misc/lv_color.h" +#include "../misc/lv_area.h" +#include "../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ +#define LV_RADIUS_CIRCLE 0x7FFF /**< A very big radius to always draw as circle*/ +LV_EXPORT_CONST_INT(LV_RADIUS_CIRCLE); + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_dsc_base_t base; + + int32_t radius; + + /*Background img*/ + const void * bg_image_src; + const void * bg_image_symbol_font; + lv_color_t bg_image_recolor; + lv_opa_t bg_image_opa; + lv_opa_t bg_image_recolor_opa; + uint8_t bg_image_tiled; + /*Background*/ + lv_opa_t bg_opa; + /*Border*/ + lv_opa_t border_opa; + /*Outline */ + lv_opa_t outline_opa; + /*Shadow*/ + lv_opa_t shadow_opa; + + /*Background*/ + lv_color_t bg_color; /**< First element of a gradient is a color, so it maps well here*/ + lv_grad_dsc_t bg_grad; + + const lv_image_colorkey_t * bg_image_colorkey; + + /*Border*/ + lv_color_t border_color; + int32_t border_width; + lv_border_side_t border_side : 5; + uint8_t border_post : 1; /*The border will be drawn later*/ + + /*Outline*/ + lv_color_t outline_color; + int32_t outline_width; + int32_t outline_pad; + + /*Shadow*/ + lv_color_t shadow_color; + int32_t shadow_width; + int32_t shadow_offset_x; + int32_t shadow_offset_y; + int32_t shadow_spread; +} lv_draw_rect_dsc_t; + +typedef struct { + lv_draw_dsc_base_t base; + + /**Radius, LV_RADIUS_CIRCLE for max. radius */ + int32_t radius; + + /**Opacity in 0...255 range. + * LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/ + lv_opa_t opa; + + /**The color of the rectangle. + * If the gradient is set (grad.dir!=LV_GRAD_DIR_NONE) it's ignored. */ + lv_color_t color; + + /**Describe a gradient. If `grad.dir` is not `LV_GRAD_DIR_NONE` `color` will be ignored*/ + lv_grad_dsc_t grad; +} lv_draw_fill_dsc_t; + +typedef struct { + lv_draw_dsc_base_t base; + + /**Radius, LV_RADIUS_CIRCLE for max. radius */ + int32_t radius; + + /**The color of the border. */ + lv_color_t color; + + + /**The width of the border in pixels */ + int32_t width; + + /**Opacity in 0...255 range. + * LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/ + lv_opa_t opa; + + /**LV_BORDER_SIDE_NONE/LEFT/RIGHT/TOP/BOTTOM/FULL. + * LV_BORDER_SIDE_INTERNAL is an information for upper layers + * and shouldn't be used here. */ + lv_border_side_t side : 5; + +} lv_draw_border_dsc_t; + +typedef struct { + lv_draw_dsc_base_t base; + + /**Radius, LV_RADIUS_CIRCLE for max. radius */ + int32_t radius; + + /**Color of shadow */ + lv_color_t color; + + /**Width of the shadow. (radius of the blur)*/ + int32_t width; + + /**Make the rectangle larger with this value in all directions. Can be negative too. */ + int32_t spread; + + /**Offset the rectangle horizontally.*/ + int32_t ofs_x; + + /**Offset the rectangle vertically.*/ + int32_t ofs_y; + + /**Opacity in 0...255 range. + * LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/ + lv_opa_t opa; + + /**Set `bg_cover` to 1 if the background will cover the shadow. + * It's a hint to the renderer about it might skip some masking.*/ + uint8_t bg_cover : 1; +} lv_draw_box_shadow_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a rectangle draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc); + +/** + * Initialize a fill draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc); + +/** + * Try to get a fill draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_FILL + */ +lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task); + +/** + * Fill an area + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor variable + * @param coords the coordinates of the rectangle + */ +void lv_draw_fill(lv_layer_t * layer, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +/** + * Initialize a border draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc); + +/** + * Try to get a border draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_BORDER + */ +lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task); + +/** + * Draw a border + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor variable + * @param coords the coordinates of the rectangle + */ +void lv_draw_border(lv_layer_t * layer, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords); + +/** + * Initialize a box shadow draw descriptor. + * @param dsc pointer to a draw descriptor + */ +void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc); + +/** + * Try to get a box shadow draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_BOX_SHADOW + */ +lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task); + +/** + * Draw a box shadow + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor variable + * @param coords the coordinates of the rectangle + */ +void lv_draw_box_shadow(lv_layer_t * layer, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords); + +/** + * The rectangle is a wrapper for fill, border, bg. image and box shadow. + * Internally fill, border, image and box shadow draw tasks will be created. + * @param layer pointer to a layer + * @param dsc pointer to an initialized draw descriptor variable + * @param coords the coordinates of the rectangle + */ +void lv_draw_rect(lv_layer_t * layer, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_RECT_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_rect_private.h b/inc/lvgl/src/draw/lv_draw_rect_private.h new file mode 100644 index 0000000..ad75b53 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_rect_private.h @@ -0,0 +1,39 @@ +/** + * @file lv_draw_rect_private.h + * + */ + +#ifndef LV_DRAW_RECT_PRIVATE_H +#define LV_DRAW_RECT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_rect.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_RECT_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_triangle.c b/inc/lvgl/src/draw/lv_draw_triangle.c new file mode 100644 index 0000000..add272f --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_triangle.c @@ -0,0 +1,92 @@ +/** + * @file lv_draw_triangle.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_triangle_private.h" +#include "lv_draw_private.h" +#include "../core/lv_obj.h" +#include "../misc/lv_math.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * dsc) +{ + LV_PROFILER_DRAW_BEGIN; + lv_memzero(dsc, sizeof(lv_draw_triangle_dsc_t)); + dsc->color = lv_color_white(); + dsc->grad.stops[0].color = lv_color_white(); + dsc->grad.stops[1].color = lv_color_black(); + dsc->grad.stops[1].frac = 0xFF; + dsc->grad.stops_count = 2; + dsc->opa = LV_OPA_COVER; + dsc->base.dsc_size = sizeof(lv_draw_triangle_dsc_t); + LV_PROFILER_DRAW_END; +} + +lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_TRIANGLE ? (lv_draw_triangle_dsc_t *)task->draw_dsc : NULL; +} + +void lv_draw_triangle(lv_layer_t * layer, const lv_draw_triangle_dsc_t * dsc) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + LV_PROFILER_DRAW_BEGIN; + + lv_area_t a; + a.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + a.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + a.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + a.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + if(dsc->base.drop_shadow_opa) { + lv_layer_t * ds_layer = lv_draw_layer_create_drop_shadow(layer, &dsc->base, &a); + LV_ASSERT_NULL(ds_layer); + lv_draw_triangle_dsc_t ds_dsc = *dsc; + ds_dsc.base.drop_shadow_opa = 0; /*Disable drop shadow so rendering below will render plain triangle*/ + lv_draw_triangle(ds_layer, &ds_dsc); + lv_draw_layer_finish_drop_shadow(ds_layer, &dsc->base); + } + + + lv_draw_task_t * t = lv_draw_add_task(layer, &a, LV_DRAW_TASK_TYPE_TRIANGLE); + + lv_memcpy(t->draw_dsc, dsc, sizeof(*dsc)); + + lv_draw_finalize_task_creation(layer, t); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/draw/lv_draw_triangle.h b/inc/lvgl/src/draw/lv_draw_triangle.h new file mode 100644 index 0000000..db53d47 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_triangle.h @@ -0,0 +1,75 @@ +/** + * @file lv_draw_triangle.h + * + */ + +#ifndef LV_DRAW_TRIANGLE_H +#define LV_DRAW_TRIANGLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_rect.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_draw_dsc_base_t base; + + /**Points of the triangle. If `LV_USE_FLOAT` is enabled floats can be used here*/ + lv_point_precise_t p[3]; + + /**Color of the triangle*/ + lv_color_t color; + + /**Opacity of the arc in 0...255 range. + * LV_OPA_TRANSP, LV_OPA_10, LV_OPA_20, .. LV_OPA_COVER can be used as well*/ + lv_opa_t opa; + + /**Describe a gradient. If `grad.dir` is not `LV_GRAD_DIR_NONE` `color` will be ignored*/ + lv_grad_dsc_t grad; + +} lv_draw_triangle_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a triangle draw descriptor + * @param draw_dsc pointer to a draw descriptor + */ +void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * draw_dsc); + +/** + * Try to get a triangle draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_TRIANGLE + */ +lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task); + +/** + * Create a triangle draw task + * @param layer pointer to a layer + * @param draw_dsc pointer to an initialized `lv_draw_triangle_dsc_t` object + */ +void lv_draw_triangle(lv_layer_t * layer, const lv_draw_triangle_dsc_t * draw_dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_TRIANGLE_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_triangle_private.h b/inc/lvgl/src/draw/lv_draw_triangle_private.h new file mode 100644 index 0000000..7fc8ed5 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_triangle_private.h @@ -0,0 +1,43 @@ +/** + * @file lv_draw_triangle_private.h + * + */ + +#ifndef LV_DRAW_TRIANGLE_PRIVATE_H +#define LV_DRAW_TRIANGLE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_triangle.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_TRIANGLE_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/lv_draw_vector.c b/inc/lvgl/src/draw/lv_draw_vector.c new file mode 100644 index 0000000..daa1606 --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_vector.c @@ -0,0 +1,990 @@ +/** +* @file lv_draw_vector.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_vector_private.h" +#include "../misc/lv_area_private.h" +#include "lv_draw_private.h" + +#if LV_USE_VECTOR_GRAPHIC + +#if !((LV_USE_DRAW_SW && LV_USE_THORVG) || LV_USE_DRAW_VG_LITE || (LV_USE_NEMA_GFX && LV_USE_NEMA_VG) || LV_USE_DRAW_NANOVG) + #error "LV_USE_VECTOR_GRAPHIC requires (LV_USE_DRAW_SW and LV_USE_THORVG) or LV_USE_DRAW_VG_LITE or (LV_USE_NEMA_GFX and LV_USE_NEMA_VG) or LV_USE_DRAW_NANOVG" +#endif + +#include "../misc/lv_ll.h" +#include "../misc/lv_types.h" +#include "../stdlib/lv_string.h" +#include +#include + +#define EPSILON 1e-6f +#define MATH_PI 3.14159265358979323846f +#define MATH_HALF_PI 1.57079632679489661923f + +#define DEG_TO_RAD 0.017453292519943295769236907684886f +#define RAD_TO_DEG 57.295779513082320876798154814105f + +#define MATH_RADIANS(deg) ((deg) * DEG_TO_RAD) +#define MATH_DEGREES(rad) ((rad) * RAD_TO_DEG) + +/********************* + * DEFINES + *********************/ + +#ifndef M_PI + #define M_PI 3.1415926f +#endif + +#define CHECK_AND_RESIZE_PATH_CONTAINER(P, N) \ + do { \ + if ((lv_array_size(&(P)->ops) + (N)) > lv_array_capacity(&(P)->ops)) { \ + lv_array_resize(&(P)->ops, ((P)->ops.capacity << 1)); \ + } \ + if ((lv_array_size(&(P)->points) + (N)) > lv_array_capacity(&(P)->points)) { \ + lv_array_resize(&(P)->points, ((P)->points.capacity << 1)); \ + } \ + } while(0) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _copy_draw_dsc(lv_vector_path_ctx_t * dst, const lv_vector_path_ctx_t * src) +{ + lv_memcpy(&(dst->fill_dsc), &(src->fill_dsc), sizeof(lv_vector_fill_dsc_t)); + + dst->stroke_dsc.style = src->stroke_dsc.style; + dst->stroke_dsc.color = src->stroke_dsc.color; + dst->stroke_dsc.opa = src->stroke_dsc.opa; + dst->stroke_dsc.width = src->stroke_dsc.width; + dst->stroke_dsc.cap = src->stroke_dsc.cap; + dst->stroke_dsc.join = src->stroke_dsc.join; + dst->stroke_dsc.miter_limit = src->stroke_dsc.miter_limit; + lv_array_copy(&(dst->stroke_dsc.dash_pattern), &(src->stroke_dsc.dash_pattern)); + lv_memcpy(&(dst->stroke_dsc.gradient), &(src->stroke_dsc.gradient), sizeof(lv_vector_gradient_t)); + lv_memcpy(&(dst->stroke_dsc.matrix), &(src->stroke_dsc.matrix), sizeof(lv_matrix_t)); + + dst->blend_mode = src->blend_mode; + lv_memcpy(&(dst->matrix), &(src->matrix), sizeof(lv_matrix_t)); + lv_area_copy(&(dst->scissor_area), &(src->scissor_area)); +} + + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point) +{ + float x = point->x; + float y = point->y; + + point->x = x * matrix->m[0][0] + y * matrix->m[0][1] + matrix->m[0][2]; + point->y = x * matrix->m[1][0] + y * matrix->m[1][1] + matrix->m[1][2]; +} + +void lv_matrix_transform_path(const lv_matrix_t * matrix, lv_vector_path_t * path) +{ + lv_fpoint_t * pt = lv_array_front(&path->points); + uint32_t size = lv_array_size(&path->points); + for(uint32_t i = 0; i < size; i++) { + lv_matrix_transform_point(matrix, &pt[i]); + } +} + +/* path functions */ +lv_vector_path_t * lv_vector_path_create(lv_vector_path_quality_t quality) +{ + lv_vector_path_t * path = lv_malloc(sizeof(lv_vector_path_t)); + LV_ASSERT_MALLOC(path); + lv_memzero(path, sizeof(lv_vector_path_t)); + path->quality = quality; + lv_array_init(&path->ops, 8, sizeof(lv_vector_path_op_t)); + lv_array_init(&path->points, 8, sizeof(lv_fpoint_t)); + return path; +} + +void lv_vector_path_copy(lv_vector_path_t * target_path, const lv_vector_path_t * path) +{ + target_path->quality = path->quality; + lv_array_copy(&target_path->ops, &path->ops); + lv_array_copy(&target_path->points, &path->points); +} + +void lv_vector_path_clear(lv_vector_path_t * path) +{ + lv_array_clear(&path->ops); + lv_array_clear(&path->points); +} + +void lv_vector_path_delete(lv_vector_path_t * path) +{ + lv_array_deinit(&path->ops); + lv_array_deinit(&path->points); + lv_free(path); +} + +void lv_vector_path_move_to(lv_vector_path_t * path, const lv_fpoint_t * p) +{ + CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); + + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_MOVE_TO; + lv_array_push_back(&path->ops, &op); + lv_array_push_back(&path->points, p); +} + +void lv_vector_path_line_to(lv_vector_path_t * path, const lv_fpoint_t * p) +{ + if(lv_array_is_empty(&path->ops)) { + /*first op must be move_to*/ + return; + } + + CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); + + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_LINE_TO; + lv_array_push_back(&path->ops, &op); + lv_array_push_back(&path->points, p); +} + +void lv_vector_path_quad_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2) +{ + if(lv_array_is_empty(&path->ops)) { + /*first op must be move_to*/ + return; + } + + CHECK_AND_RESIZE_PATH_CONTAINER(path, 2); + + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_QUAD_TO; + lv_array_push_back(&path->ops, &op); + lv_array_push_back(&path->points, p1); + lv_array_push_back(&path->points, p2); +} + +void lv_vector_path_cubic_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2, + const lv_fpoint_t * p3) +{ + if(lv_array_is_empty(&path->ops)) { + /*first op must be move_to*/ + return; + } + + CHECK_AND_RESIZE_PATH_CONTAINER(path, 3); + + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_CUBIC_TO; + lv_array_push_back(&path->ops, &op); + lv_array_push_back(&path->points, p1); + lv_array_push_back(&path->points, p2); + lv_array_push_back(&path->points, p3); +} + +static lv_fpoint_t _point_on_ellipse(float rx, float ry, float cos_r, float sin_r, + float cx, float cy, float theta, float alpha) +{ + float cos_theta = cosf(theta); + float sin_theta = sinf(theta); + + float x = rx * cos_theta; + float y = ry * sin_theta; + + float x_rot = cos_r * x - sin_r * y; + float y_rot = sin_r * x + cos_r * y; + + if(fabsf(alpha) > EPSILON) { + float dx = -rx * sin_theta; + float dy = ry * cos_theta; + float dx_rot = cos_r * dx - sin_r * dy; + float dy_rot = sin_r * dx + cos_r * dy; + + x_rot += alpha * dx_rot; + y_rot += alpha * dy_rot; + } + + return (lv_fpoint_t) { + x_rot + cx, y_rot + cy + }; +} + +void lv_vector_path_arc_to(lv_vector_path_t * path, float rx, float ry, float rotate_angle, bool large_arc, + bool clockwise, const lv_fpoint_t * p) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(p); + + if(lv_array_is_empty(&path->ops)) { + /*first op must be move_to*/ + return; + } + + if(rx <= 0 || ry <= 0) { + /*no needed to draw*/ + return; + } + + /*https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes*/ + + lv_fpoint_t * cpt = lv_array_back(&path->points); + + float x0 = cpt->x; + float y0 = cpt->y; + + /*1. dealing with degradation*/ + if(fabsf(x0 - p->x) < EPSILON && fabsf(y0 - p->y) < EPSILON) { + /*same point*/ + return; + } + + float rotate = MATH_RADIANS(rotate_angle); + float sin_r = sinf(rotate); + float cos_r = cosf(rotate); + + /*2. transform point*/ + float dx = (x0 - p->x) * 0.5f; + float dy = (y0 - p->y) * 0.5f; + + float x1 = cos_r * dx + sin_r * dy; + float y1 = -sin_r * dx + cos_r * dy; + + /*3. adjust radius*/ + float lambda_val = (x1 * x1) / (rx * rx) + (y1 * y1) / (ry * ry); + if(lambda_val > 1.0f) { + rx *= sqrtf(lambda_val); + ry *= sqrtf(lambda_val); + } + + /*4. calc center point*/ + float rx_sq = rx * rx; + float ry_sq = ry * ry; + float x1_sq = x1 * x1; + float y1_sq = y1 * y1; + + float num = rx_sq * ry_sq - rx_sq * y1_sq - ry_sq * x1_sq; + float denom = rx_sq * y1_sq + ry_sq * x1_sq; + + float radicand = (denom > EPSILON) ? num / denom : 0.0f; + if(radicand < 0.0f) radicand = 0.0f; + + float sign = (large_arc == clockwise) ? -1.0f : 1.0f; + float coef = sign * sqrtf(radicand); + + float cx_prime = (coef * rx * y1) / ry; + float cy_prime = -(coef * ry * x1) / rx; + + float cx = cos_r * cx_prime - sin_r * cy_prime + (x0 + p->x) * 0.5f; + float cy = sin_r * cx_prime + cos_r * cy_prime + (y0 + p->y) * 0.5f; + + float ux = (x1 - cx_prime) / rx; + float uy = (y1 - cy_prime) / ry; + + /*5. calculate the starting angle and ending angle*/ + float n_sq = ux * ux + uy * uy; + float theta1 = 0.0f; + if(n_sq > EPSILON) { + theta1 = atan2f(uy, ux); + } + + float vx = (-x1 - cx_prime) / rx; + float vy = (-y1 - cy_prime) / ry; + + float n = sqrtf(n_sq * (vx * vx + vy * vy)); + float delta = 0.0f; + if(n > EPSILON) { + float cos_delta = (ux * vx + uy * vy) / n; + if(cos_delta > 1.0f) cos_delta = 1.0f; + else if(cos_delta < -1.0f) cos_delta = -1.0f; + + delta = acosf(cos_delta); + if(ux * vy - uy * vx < 0.0f) delta = -delta; + } + + if(!clockwise && delta > 0.0f) { + delta -= 2.0f * MATH_PI; + } + else if(clockwise && delta < 0.0f) { + delta += 2.0f * MATH_PI; + } + + /*6. split arc into segments within 90 degrees*/ + float angle_left = fabsf(delta); + int seg_count = (int)ceilf(angle_left / MATH_HALF_PI); + if(seg_count == 0) seg_count = 1; + + float segment_angle = delta / (float)seg_count; + + float current_angle = theta1; + for(int i = 0; i < seg_count; i++) { + float next_angle = current_angle + segment_angle; + + float alpha_val; + if(fabsf(segment_angle) < 0.1f) { + alpha_val = segment_angle / 6.0f; + } + else { + float tan_half = tanf(segment_angle * 0.5f); + alpha_val = sinf(segment_angle) * (sqrtf(4.0f + 3.0f * tan_half * tan_half) - 1.0f) / 3.0f; + } + + lv_fpoint_t p1 = _point_on_ellipse(rx, ry, cos_r, sin_r, cx, cy, current_angle, alpha_val); + lv_fpoint_t p2 = _point_on_ellipse(rx, ry, cos_r, sin_r, cx, cy, next_angle, -alpha_val); + lv_fpoint_t p3 = _point_on_ellipse(rx, ry, cos_r, sin_r, cx, cy, next_angle, 0.0f); + + lv_vector_path_cubic_to(path, &p1, &p2, &p3); + + current_angle = next_angle; + } +} + +void lv_vector_path_close(lv_vector_path_t * path) +{ + if(lv_array_is_empty(&path->ops)) { + /*first op must be move_to*/ + return; + } + + CHECK_AND_RESIZE_PATH_CONTAINER(path, 1); + + lv_vector_path_op_t op = LV_VECTOR_PATH_OP_CLOSE; + lv_array_push_back(&path->ops, &op); +} + +void lv_vector_path_get_bounding(const lv_vector_path_t * path, lv_area_t * area) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(area); + + uint32_t len = lv_array_size(&path->points); + if(len == 0) { + lv_memzero(area, sizeof(lv_area_t)); + return; + } + + lv_fpoint_t * p = lv_array_front(&path->points); + float x1 = p[0].x; + float x2 = p[0].x; + float y1 = p[0].y; + float y2 = p[0].y; + + for(uint32_t i = 1; i < len; i++) { + if(p[i].x < x1) x1 = p[i].x; + if(p[i].y < y1) y1 = p[i].y; + if(p[i].x > x2) x2 = p[i].x; + if(p[i].y > y2) y2 = p[i].y; + } + + area->x1 = lroundf(x1); + area->y1 = lroundf(y1); + area->x2 = lroundf(x2); + area->y2 = lroundf(y2); +} + +void lv_vector_path_append_rectangle(lv_vector_path_t * path, float x, float y, float w, float h, float rx, float ry) +{ + if(w <= 0.0f || h <= 0.0f) return; + + float hw = w * 0.5f; + float hh = h * 0.5f; + + if(rx > hw) rx = hw; + if(ry > hh) ry = hh; + + if(rx <= 0.0f && ry <= 0.0f) { + lv_fpoint_t pt = {x, y}; + lv_vector_path_move_to(path, &pt); + pt.x += w; + lv_vector_path_line_to(path, &pt); + pt.y += h; + lv_vector_path_line_to(path, &pt); + pt.x -= w; + lv_vector_path_line_to(path, &pt); + lv_vector_path_close(path); + return; + } + + if(rx == hw && ry == hh) { + lv_fpoint_t pt = {x + hw, y + hh}; + lv_vector_path_append_circle(path, &pt, rx, ry); + return; + } + + float hrx = rx * 0.5f; + float hry = ry * 0.5f; + lv_fpoint_t pt, pt2, pt3; + + pt.x = x + rx; + pt.y = y; + lv_vector_path_move_to(path, &pt); + + pt.x = x + w - rx; + pt.y = y; + lv_vector_path_line_to(path, &pt); + + pt.x = x + w - rx + hrx; + pt.y = y; + pt2.x = x + w; + pt2.y = y + ry - hry; + pt3.x = x + w; + pt3.y = y + ry; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = x + w; + pt.y = y + h - ry; + lv_vector_path_line_to(path, &pt); + + pt.x = x + w; + pt.y = y + h - ry + hry; + pt2.x = x + w - rx + hrx; + pt2.y = y + h; + pt3.x = x + w - rx; + pt3.y = y + h; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = x + rx; + pt.y = y + h; + lv_vector_path_line_to(path, &pt); + + pt.x = x + rx - hrx; + pt.y = y + h; + pt2.x = x; + pt2.y = y + h - ry + hry; + pt3.x = x; + pt3.y = y + h - ry; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = x; + pt.y = y + ry; + lv_vector_path_line_to(path, &pt); + + pt.x = x; + pt.y = y + ry - hry; + pt2.x = x + rx - hrx; + pt2.y = y; + pt3.x = x + rx; + pt3.y = y; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + lv_vector_path_close(path); +} + +void lv_vector_path_append_circle(lv_vector_path_t * path, const lv_fpoint_t * c, float rx, float ry) +{ + float krx = rx * 0.552284f; + float kry = ry * 0.552284f; + float cx = c->x; + float cy = c->y; + + lv_fpoint_t pt, pt2, pt3; + pt.x = cx; + pt.y = cy - ry; + lv_vector_path_move_to(path, &pt); + + pt.x = cx + krx; + pt.y = cy - ry; + pt2.x = cx + rx; + pt2.y = cy - kry; + pt3.x = cx + rx; + pt3.y = cy; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = cx + rx; + pt.y = cy + kry; + pt2.x = cx + krx; + pt2.y = cy + ry; + pt3.x = cx; + pt3.y = cy + ry; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = cx - krx; + pt.y = cy + ry; + pt2.x = cx - rx; + pt2.y = cy + kry; + pt3.x = cx - rx; + pt3.y = cy; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + pt.x = cx - rx; + pt.y = cy - kry; + pt2.x = cx - krx; + pt2.y = cy - ry; + pt3.x = cx; + pt3.y = cy - ry; + lv_vector_path_cubic_to(path, &pt, &pt2, &pt3); + + lv_vector_path_close(path); +} + +/** + * Add a arc to the path + * @param path pointer to a path + * @param c pointer to a `lv_fpoint_t` variable for center of the circle + * @param radius the radius for arc + * @param start_angle the start angle for arc + * @param sweep the sweep angle for arc, could be negative + * @param pie true: draw a pie, false: draw a arc + */ +void lv_vector_path_append_arc(lv_vector_path_t * path, const lv_fpoint_t * c, float radius, float start_angle, + float sweep, bool pie) +{ + float cx = c->x; + float cy = c->y; + + /* just circle */ + if(sweep >= 360.0f || sweep <= -360.0f) { + lv_vector_path_append_circle(path, c, radius, radius); + return; + } + + start_angle = MATH_RADIANS(start_angle); + sweep = MATH_RADIANS(sweep); + + int n_curves = (int)ceil(fabsf(sweep / MATH_HALF_PI)); + float sweep_sign = sweep < 0 ? -1.f : 1.f; + float fract = fmodf(sweep, MATH_HALF_PI); + fract = (fabsf(fract) < FLT_EPSILON) ? MATH_HALF_PI * sweep_sign : fract; + + /* Start from here */ + lv_fpoint_t start = { + .x = radius * cosf(start_angle), + .y = radius * sinf(start_angle), + }; + + if(pie) { + lv_vector_path_move_to(path, &(lv_fpoint_t) { + cx, cy + }); + lv_vector_path_line_to(path, &(lv_fpoint_t) { + start.x + cx, start.y + cy + }); + } + else { + lv_vector_path_move_to(path, &(lv_fpoint_t) { + start.x + cx, start.y + cy + }); + } + + for(int i = 0; i < n_curves; ++i) { + float end_angle = start_angle + ((i != n_curves - 1) ? MATH_HALF_PI * sweep_sign : fract); + float end_x = radius * cosf(end_angle); + float end_y = radius * sinf(end_angle); + + /* variables needed to calculate bezier control points */ + + /** get bezier control points using article: + * (http://itc.ktu.lt/index.php/ITC/article/view/11812/6479) + */ + float ax = start.x; + float ay = start.y; + float bx = end_x; + float by = end_y; + float q1 = ax * ax + ay * ay; + float q2 = ax * bx + ay * by + q1; + float k2 = (4.0f / 3.0f) * ((sqrtf(2 * q1 * q2) - q2) / (ax * by - ay * bx)); + + /* Next start point is the current end point */ + start.x = end_x; + start.y = end_y; + + end_x += cx; + end_y += cy; + + lv_fpoint_t ctrl1 = {ax - k2 * ay + cx, ay + k2 * ax + cy}; + lv_fpoint_t ctrl2 = {bx + k2 * by + cx, by - k2 * bx + cy}; + lv_fpoint_t end = {end_x, end_y}; + lv_vector_path_cubic_to(path, &ctrl1, &ctrl2, &end); + start_angle = end_angle; + } + + if(pie) { + lv_vector_path_close(path); + } +} + +void lv_vector_path_append_path(lv_vector_path_t * path, const lv_vector_path_t * subpath) +{ + uint32_t ops_size = lv_array_size(&path->ops); + uint32_t nops_size = lv_array_size(&subpath->ops); + uint32_t point_size = lv_array_size(&path->points); + uint32_t npoint_size = lv_array_size(&subpath->points); + + lv_array_concat(&path->ops, &subpath->ops); + path->ops.size = ops_size + nops_size; + + lv_array_concat(&path->points, &subpath->points); + path->points.size = point_size + npoint_size; +} + +/* draw dsc functions */ + +lv_draw_vector_dsc_t * lv_draw_vector_dsc_create(lv_layer_t * layer) +{ + + lv_draw_vector_dsc_t * dsc = lv_zalloc(sizeof(lv_draw_vector_dsc_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) { + LV_LOG_WARN("Couldn't allocate lv_draw_vector_dsc_t"); + return NULL; + } + + dsc->base.layer = layer; + + dsc->ctx = lv_zalloc(sizeof(lv_vector_path_ctx_t)); + if(dsc->ctx == NULL) { + LV_LOG_WARN("Couldn't allocate vector path context"); + lv_free(dsc); + return NULL; + } + + lv_vector_fill_dsc_t * fill_dsc = &(dsc->ctx->fill_dsc); + fill_dsc->style = LV_VECTOR_DRAW_STYLE_SOLID; + fill_dsc->color = lv_color_to_32(lv_color_black(), 0xFF); + fill_dsc->opa = LV_OPA_COVER; + fill_dsc->fill_rule = LV_VECTOR_FILL_NONZERO; + lv_matrix_identity(&(fill_dsc->matrix)); /*identity matrix*/ + + lv_vector_stroke_dsc_t * stroke_dsc = &(dsc->ctx->stroke_dsc); + stroke_dsc->style = LV_VECTOR_DRAW_STYLE_SOLID; + stroke_dsc->color = lv_color_to_32(lv_color_black(), 0xFF); + stroke_dsc->opa = LV_OPA_0; /*default no stroke*/ + stroke_dsc->width = 1.0f; + stroke_dsc->cap = LV_VECTOR_STROKE_CAP_BUTT; + stroke_dsc->join = LV_VECTOR_STROKE_JOIN_MITER; + stroke_dsc->miter_limit = 4.0f; + lv_matrix_identity(&(stroke_dsc->matrix)); /*identity matrix*/ + + dsc->ctx->blend_mode = LV_VECTOR_BLEND_SRC_OVER; + dsc->ctx->scissor_area = layer->_clip_area; + lv_matrix_identity(&(dsc->ctx->matrix)); /*identity matrix*/ + dsc->task_list = NULL; + return dsc; +} + +void lv_draw_vector_dsc_delete(lv_draw_vector_dsc_t * dsc) +{ + if(dsc->task_list) { + lv_ll_t * task_list = dsc->task_list; + lv_vector_for_each_destroy_tasks(task_list, NULL, NULL); + dsc->task_list = NULL; + } + lv_array_deinit(&(dsc->ctx->stroke_dsc.dash_pattern)); + lv_free(dsc->ctx); + lv_free(dsc); +} + +void lv_draw_vector_dsc_set_blend_mode(lv_draw_vector_dsc_t * dsc, lv_vector_blend_t blend) +{ + dsc->ctx->blend_mode = blend; +} + +void lv_draw_vector_dsc_set_transform(lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_memcpy(&(dsc->ctx->matrix), matrix, sizeof(lv_matrix_t)); +} + +void lv_draw_vector_dsc_set_fill_color(lv_draw_vector_dsc_t * dsc, lv_color_t color) +{ + dsc->ctx->fill_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->ctx->fill_dsc.color = lv_color_to_32(color, 0xFF); +} + +void lv_draw_vector_dsc_set_fill_color32(lv_draw_vector_dsc_t * dsc, lv_color32_t color) +{ + dsc->ctx->fill_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->ctx->fill_dsc.color = color; +} + +void lv_draw_vector_dsc_set_fill_opa(lv_draw_vector_dsc_t * dsc, lv_opa_t opa) +{ + dsc->ctx->fill_dsc.opa = opa; +} + +void lv_draw_vector_dsc_set_fill_rule(lv_draw_vector_dsc_t * dsc, lv_vector_fill_t rule) +{ + dsc->ctx->fill_dsc.fill_rule = rule; +} + +void lv_draw_vector_dsc_set_fill_units(lv_draw_vector_dsc_t * dsc, const lv_vector_fill_units_t units) +{ + dsc->ctx->fill_dsc.fill_units = units; +} + +void lv_draw_vector_dsc_set_fill_image(lv_draw_vector_dsc_t * dsc, const lv_draw_image_dsc_t * img_dsc) +{ + dsc->ctx->fill_dsc.style = LV_VECTOR_DRAW_STYLE_PATTERN; + lv_memcpy(&(dsc->ctx->fill_dsc.img_dsc), img_dsc, sizeof(lv_draw_image_dsc_t)); +} + +void lv_draw_vector_dsc_set_fill_linear_gradient(lv_draw_vector_dsc_t * dsc, float x1, float y1, float x2, float y2) +{ + dsc->ctx->fill_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + dsc->ctx->fill_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; + dsc->ctx->fill_dsc.gradient.x1 = x1; + dsc->ctx->fill_dsc.gradient.y1 = y1; + dsc->ctx->fill_dsc.gradient.x2 = x2; + dsc->ctx->fill_dsc.gradient.y2 = y2; +} + +void lv_draw_vector_dsc_set_fill_radial_gradient(lv_draw_vector_dsc_t * dsc, float cx, float cy, float radius) +{ + dsc->ctx->fill_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + dsc->ctx->fill_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; + dsc->ctx->fill_dsc.gradient.cx = cx; + dsc->ctx->fill_dsc.gradient.cy = cy; + dsc->ctx->fill_dsc.gradient.cr = radius; +} + +void lv_draw_vector_dsc_set_fill_gradient_spread(lv_draw_vector_dsc_t * dsc, lv_vector_gradient_spread_t spread) +{ + dsc->ctx->fill_dsc.gradient.spread = spread; +} + +void lv_draw_vector_dsc_set_fill_gradient_color_stops(lv_draw_vector_dsc_t * dsc, const lv_grad_stop_t * stops, + uint16_t count) +{ + if(count > LV_GRADIENT_MAX_STOPS) { + LV_LOG_WARN("Gradient stops limited: %d, max: %d", count, LV_GRADIENT_MAX_STOPS); + count = LV_GRADIENT_MAX_STOPS; + } + + lv_memcpy(&(dsc->ctx->fill_dsc.gradient.stops), stops, sizeof(lv_grad_stop_t) * count); + dsc->ctx->fill_dsc.gradient.stops_count = count; +} + +void lv_draw_vector_dsc_set_fill_transform(lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_memcpy(&(dsc->ctx->fill_dsc.matrix), matrix, sizeof(lv_matrix_t)); +} + +void lv_draw_vector_dsc_set_stroke_transform(lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_memcpy(&(dsc->ctx->stroke_dsc.matrix), matrix, sizeof(lv_matrix_t)); +} + +void lv_draw_vector_dsc_set_stroke_color32(lv_draw_vector_dsc_t * dsc, lv_color32_t color) +{ + dsc->ctx->stroke_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->ctx->stroke_dsc.color = color; +} + +void lv_draw_vector_dsc_set_stroke_color(lv_draw_vector_dsc_t * dsc, lv_color_t color) +{ + dsc->ctx->stroke_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->ctx->stroke_dsc.color = lv_color_to_32(color, 0xFF); +} + +void lv_draw_vector_dsc_set_stroke_opa(lv_draw_vector_dsc_t * dsc, lv_opa_t opa) +{ + dsc->ctx->stroke_dsc.opa = opa; +} + +void lv_draw_vector_dsc_set_stroke_width(lv_draw_vector_dsc_t * dsc, float width) +{ + dsc->ctx->stroke_dsc.width = width; +} + +void lv_draw_vector_dsc_set_stroke_dash(lv_draw_vector_dsc_t * dsc, float * dash_pattern, uint16_t dash_count) +{ + lv_array_t * dash_array = &(dsc->ctx->stroke_dsc.dash_pattern); + if(dash_pattern) { + lv_array_clear(dash_array); + if(lv_array_capacity(dash_array) == 0) { + lv_array_init(dash_array, dash_count, sizeof(float)); + } + else { + lv_array_resize(dash_array, dash_count); + } + for(uint16_t i = 0; i < dash_count; i++) { + lv_array_push_back(dash_array, &dash_pattern[i]); + } + } + else { /*clear dash*/ + lv_array_clear(dash_array); + } +} + +void lv_draw_vector_dsc_set_stroke_cap(lv_draw_vector_dsc_t * dsc, lv_vector_stroke_cap_t cap) +{ + dsc->ctx->stroke_dsc.cap = cap; +} + +void lv_draw_vector_dsc_set_stroke_join(lv_draw_vector_dsc_t * dsc, lv_vector_stroke_join_t join) +{ + dsc->ctx->stroke_dsc.join = join; +} + +void lv_draw_vector_dsc_set_stroke_miter_limit(lv_draw_vector_dsc_t * dsc, uint16_t miter_limit) +{ + dsc->ctx->stroke_dsc.miter_limit = miter_limit; +} + +void lv_draw_vector_dsc_set_stroke_linear_gradient(lv_draw_vector_dsc_t * dsc, float x1, float y1, float x2, float y2) +{ + dsc->ctx->stroke_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + dsc->ctx->stroke_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; + dsc->ctx->stroke_dsc.gradient.x1 = x1; + dsc->ctx->stroke_dsc.gradient.y1 = y1; + dsc->ctx->stroke_dsc.gradient.x2 = x2; + dsc->ctx->stroke_dsc.gradient.y2 = y2; +} + +void lv_draw_vector_dsc_set_stroke_radial_gradient(lv_draw_vector_dsc_t * dsc, float cx, float cy, float radius) +{ + dsc->ctx->stroke_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + dsc->ctx->stroke_dsc.gradient.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; + dsc->ctx->stroke_dsc.gradient.cx = cx; + dsc->ctx->stroke_dsc.gradient.cy = cy; + dsc->ctx->stroke_dsc.gradient.cr = radius; +} + +void lv_draw_vector_dsc_set_stroke_gradient_spread(lv_draw_vector_dsc_t * dsc, lv_vector_gradient_spread_t spread) +{ + dsc->ctx->stroke_dsc.gradient.spread = spread; +} + +void lv_draw_vector_dsc_set_stroke_gradient_color_stops(lv_draw_vector_dsc_t * dsc, const lv_grad_stop_t * stops, + uint16_t count) +{ + if(count > LV_GRADIENT_MAX_STOPS) { + LV_LOG_WARN("Gradient stops limited: %d, max: %d", count, LV_GRADIENT_MAX_STOPS); + count = LV_GRADIENT_MAX_STOPS; + } + + lv_memcpy(&(dsc->ctx->stroke_dsc.gradient.stops), stops, sizeof(lv_grad_stop_t) * count); + dsc->ctx->stroke_dsc.gradient.stops_count = count; +} + +/* draw functions */ +void lv_draw_vector_dsc_add_path(lv_draw_vector_dsc_t * dsc, const lv_vector_path_t * path) +{ + lv_area_t rect; + if(!lv_area_intersect(&rect, &(dsc->base.layer->_clip_area), &(dsc->ctx->scissor_area))) { + return; + } + + if(dsc->ctx->fill_dsc.opa == 0 + && dsc->ctx->stroke_dsc.opa == 0) { + return; + } + + if(!dsc->task_list) { + dsc->task_list = lv_malloc(sizeof(lv_ll_t)); + LV_ASSERT_MALLOC(dsc->task_list); + lv_ll_init(dsc->task_list, sizeof(lv_draw_vector_subtask_t)); + } + + lv_draw_vector_subtask_t * new_task = (lv_draw_vector_subtask_t *)lv_ll_ins_tail(dsc->task_list); + lv_memset(new_task, 0, sizeof(lv_draw_vector_subtask_t)); + + new_task->path = lv_vector_path_create(0); + + _copy_draw_dsc(&(new_task->ctx), dsc->ctx); + lv_vector_path_copy(new_task->path, path); + new_task->ctx.scissor_area = rect; +} + +void lv_draw_vector_dsc_clear_area(lv_draw_vector_dsc_t * dsc, const lv_area_t * rect) +{ + lv_area_t r; + if(!lv_area_intersect(&r, &(dsc->base.layer->_clip_area), &(dsc->ctx->scissor_area))) { + return; + } + + lv_area_t final_rect; + if(!lv_area_intersect(&final_rect, &r, rect)) { + return; + } + + if(!dsc->task_list) { + dsc->task_list = lv_malloc(sizeof(lv_ll_t)); + LV_ASSERT_MALLOC(dsc->task_list); + lv_ll_init(dsc->task_list, sizeof(lv_draw_vector_subtask_t)); + } + + lv_draw_vector_subtask_t * new_task = (lv_draw_vector_subtask_t *)lv_ll_ins_tail(dsc->task_list); + lv_memset(new_task, 0, sizeof(lv_draw_vector_subtask_t)); + + new_task->ctx.fill_dsc.color = dsc->ctx->fill_dsc.color; + new_task->ctx.fill_dsc.opa = dsc->ctx->fill_dsc.opa; + lv_area_copy(&(new_task->ctx.scissor_area), &final_rect); +} + +void lv_draw_vector(lv_draw_vector_dsc_t * dsc) +{ + if(!dsc->task_list) { + return; + } + + lv_layer_t * layer = dsc->base.layer; + + lv_draw_task_t * t = lv_draw_add_task(layer, &(layer->_clip_area), LV_DRAW_TASK_TYPE_VECTOR); + lv_memcpy(t->draw_dsc, dsc, sizeof(lv_draw_vector_dsc_t)); + lv_draw_finalize_task_creation(layer, t); + dsc->task_list = NULL; +} + +/* draw dsc transform */ +void lv_draw_vector_dsc_identity(lv_draw_vector_dsc_t * dsc) +{ + lv_matrix_identity(&(dsc->ctx->matrix)); /*identity matrix*/ +} + +void lv_draw_vector_dsc_scale(lv_draw_vector_dsc_t * dsc, float scale_x, float scale_y) +{ + lv_matrix_scale(&(dsc->ctx->matrix), scale_x, scale_y); +} + +void lv_draw_vector_dsc_rotate(lv_draw_vector_dsc_t * dsc, float degree) +{ + lv_matrix_rotate(&(dsc->ctx->matrix), degree); +} + +void lv_draw_vector_dsc_translate(lv_draw_vector_dsc_t * dsc, float tx, float ty) +{ + lv_matrix_translate(&(dsc->ctx->matrix), tx, ty); +} + +void lv_draw_vector_dsc_skew(lv_draw_vector_dsc_t * dsc, float skew_x, float skew_y) +{ + lv_matrix_skew(&(dsc->ctx->matrix), skew_x, skew_y); +} + +void lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * data) +{ + if(task_list == NULL) return; + + lv_draw_vector_subtask_t * task = lv_ll_get_head(task_list); + lv_draw_vector_subtask_t * next_task = NULL; + + while(task != NULL) { + next_task = lv_ll_get_next(task_list, task); + lv_ll_remove(task_list, task); + + if(cb) { + cb(data, task->path, &task->ctx); + } + + if(task->path) { + lv_vector_path_delete(task->path); + } + lv_array_deinit(&(task->ctx.stroke_dsc.dash_pattern)); + + lv_free(task); + task = next_task; + } + lv_free(task_list); +} + +lv_draw_vector_dsc_t * lv_draw_task_get_vector_dsc(lv_draw_task_t * task) +{ + return task->type == LV_DRAW_TASK_TYPE_VECTOR ? (lv_draw_vector_dsc_t *)task->draw_dsc : NULL; +} + +#endif /* LV_USE_VECTOR_GRAPHIC */ diff --git a/inc/lvgl/src/draw/lv_draw_vector.h b/inc/lvgl/src/draw/lv_draw_vector.h new file mode 100644 index 0000000..c7e6d3b --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_vector.h @@ -0,0 +1,573 @@ +/** + * @file lv_draw_vector.h + * + */ + +#ifndef LV_DRAW_VECTOR_H +#define LV_DRAW_VECTOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_array.h" +#include "../misc/lv_matrix.h" +#include "lv_draw_image.h" + +#if LV_USE_VECTOR_GRAPHIC + +#if !LV_USE_MATRIX +#error "lv_draw_vector needs LV_USE_MATRIX = 1" +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_VECTOR_FILL_NONZERO = 0, + LV_VECTOR_FILL_EVENODD, +} lv_vector_fill_t; + +typedef enum { + LV_VECTOR_STROKE_CAP_BUTT = 0, + LV_VECTOR_STROKE_CAP_SQUARE, + LV_VECTOR_STROKE_CAP_ROUND, +} lv_vector_stroke_cap_t; + +typedef enum { + LV_VECTOR_STROKE_JOIN_MITER = 0, + LV_VECTOR_STROKE_JOIN_BEVEL, + LV_VECTOR_STROKE_JOIN_ROUND, +} lv_vector_stroke_join_t; + +typedef enum { + LV_VECTOR_PATH_QUALITY_MEDIUM = 0, /* default*/ + LV_VECTOR_PATH_QUALITY_HIGH, + LV_VECTOR_PATH_QUALITY_LOW, +} lv_vector_path_quality_t; + +typedef enum { + LV_VECTOR_BLEND_SRC_OVER = 0, + LV_VECTOR_BLEND_SRC_IN, + LV_VECTOR_BLEND_DST_OVER, + LV_VECTOR_BLEND_DST_IN, + LV_VECTOR_BLEND_SCREEN, + LV_VECTOR_BLEND_MULTIPLY, + LV_VECTOR_BLEND_NONE, + LV_VECTOR_BLEND_ADDITIVE, + LV_VECTOR_BLEND_SUBTRACTIVE, +} lv_vector_blend_t; + +typedef enum { + LV_VECTOR_PATH_OP_MOVE_TO = 0, + LV_VECTOR_PATH_OP_LINE_TO, + LV_VECTOR_PATH_OP_QUAD_TO, + LV_VECTOR_PATH_OP_CUBIC_TO, + LV_VECTOR_PATH_OP_CLOSE, +} lv_vector_path_op_t; + +typedef enum { + LV_VECTOR_DRAW_STYLE_SOLID = 0, + LV_VECTOR_DRAW_STYLE_PATTERN, + LV_VECTOR_DRAW_STYLE_GRADIENT, +} lv_vector_draw_style_t; + +typedef enum { + LV_VECTOR_GRADIENT_SPREAD_PAD = 0, + LV_VECTOR_GRADIENT_SPREAD_REPEAT, + LV_VECTOR_GRADIENT_SPREAD_REFLECT, +} lv_vector_gradient_spread_t; + +typedef enum { + LV_VECTOR_GRADIENT_STYLE_LINEAR = 0, + LV_VECTOR_GRADIENT_STYLE_RADIAL, +} lv_vector_gradient_style_t; + +typedef enum { + LV_VECTOR_FILL_UNITS_OBJECT_BOUNDING_BOX = 0, /** Relative coordinates relative to the object bounding box. */ + LV_VECTOR_FILL_UNITS_USER_SPACE_ON_USE, /** Absolute coordinates relative to the layer's coordinate system */ +} lv_vector_fill_units_t; + +struct _lv_fpoint_t { + float x; + float y; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Transform the coordinates of a point using given matrix + * @param matrix pointer to a matrix + * @param point pointer to a point + */ +void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point); + +/** + * Transform all the coordinates of a path using given matrix + * @param matrix pointer to a matrix + * @param path pointer to a path + */ +void lv_matrix_transform_path(const lv_matrix_t * matrix, lv_vector_path_t * path); + +/** + * Create a vector graphic path object + * @param quality the quality hint of path + * @return pointer to the created path object + */ +lv_vector_path_t * lv_vector_path_create(lv_vector_path_quality_t quality); + +/** + * Copy a path data to another + * @param target_path pointer to a path + * @param path pointer to source path + */ +void lv_vector_path_copy(lv_vector_path_t * target_path, const lv_vector_path_t * path); + +/** + * Clear path data + * @param path pointer to a path + */ +void lv_vector_path_clear(lv_vector_path_t * path); + +/** + * Delete the graphic path object + * @param path pointer to a path + */ +void lv_vector_path_delete(lv_vector_path_t * path); + +/** + * Begin a new sub path and set a point to path + * @param path pointer to a path + * @param p pointer to a `lv_fpoint_t` variable + */ +void lv_vector_path_move_to(lv_vector_path_t * path, const lv_fpoint_t * p); + +/** + * Add a line to the path from last point to the point + * @param path pointer to a path + * @param p pointer to a `lv_fpoint_t` variable + */ +void lv_vector_path_line_to(lv_vector_path_t * path, const lv_fpoint_t * p); + +/** + * Add a quadratic bezier line to the path from last point to the point + * @param path pointer to a path + * @param p1 pointer to a `lv_fpoint_t` variable for control point + * @param p2 pointer to a `lv_fpoint_t` variable for end point + */ +void lv_vector_path_quad_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2); + +/** + * Add a cubic bezier line to the path from last point to the point + * @param path pointer to a path + * @param p1 pointer to a `lv_fpoint_t` variable for first control point + * @param p2 pointer to a `lv_fpoint_t` variable for second control point + * @param p3 pointer to a `lv_fpoint_t` variable for end point + */ +void lv_vector_path_cubic_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2, + const lv_fpoint_t * p3); + +/** + * Add ellipse arc to the path from last point to the point + * @param path pointer to a path + * @param radius_x the x radius for ellipse arc + * @param radius_y the y radius for ellipse arc + * @param rotate_angle the rotate angle for arc + * @param large_arc true for large arc, otherwise small + * @param clockwise true for clockwise, otherwise anticlockwise + * @param p pointer to a `lv_fpoint_t` variable for end point + */ +void lv_vector_path_arc_to(lv_vector_path_t * path, float radius_x, float radius_y, float rotate_angle, + bool large_arc, + bool clockwise, const lv_fpoint_t * p); + +/** + * Close the sub path + * @param path pointer to a path + */ +void lv_vector_path_close(lv_vector_path_t * path); + +/** + * Get the bounding box of a path + * @param path pointer to a path + * @param area pointer to a `lv_area_t` variable for bounding box + */ +void lv_vector_path_get_bounding(const lv_vector_path_t * path, lv_area_t * area); + +/** + * Add a rectangle to the path by x/y/w/h. rx/ry are corner radii + * @param path pointer to a path + * @param x the x coordinate of the top-left corner of the rectangle + * @param y the y coordinate of the top-left corner of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param rx the horizontal radius for rounded rectangle + * @param ry the vertical radius for rounded rectangle + */ +void lv_vector_path_append_rectangle(lv_vector_path_t * path, float x, float y, float w, float h, float rx, float ry); + +/** + * Add a rectangle to the path (legacy api, recommend use lv_vector_path_append_rectangle instead) + * @param path pointer to a path + * @param rect pointer to a `lv_area_t` variable + * @param rx the horizontal radius for rounded rectangle + * @param ry the vertical radius for rounded rectangle + */ +static inline void lv_vector_path_append_rect(lv_vector_path_t * path, const lv_area_t * rect, float rx, float ry) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(rect); + + lv_vector_path_append_rectangle(path, rect->x1, rect->y1, (float)lv_area_get_width(rect), + (float)lv_area_get_height(rect), rx, ry); +} + +/** + * Add a circle to the path + * @param path pointer to a path + * @param c pointer to a `lv_fpoint_t` variable for center of the circle + * @param rx the horizontal radius for circle + * @param ry the vertical radius for circle + */ +void lv_vector_path_append_circle(lv_vector_path_t * path, const lv_fpoint_t * c, float rx, float ry); + +/** + * Add a arc to the path + * @param path pointer to a path + * @param c pointer to a `lv_fpoint_t` variable for center of the circle + * @param radius the radius for arc + * @param start_angle the start angle for arc + * @param sweep the sweep angle for arc, could be negative + * @param pie true: draw a pie, false: draw a arc + */ +void lv_vector_path_append_arc(lv_vector_path_t * path, const lv_fpoint_t * c, float radius, float start_angle, + float sweep, bool pie); + +/** + * Add an sub path to the path + * @param path pointer to a path + * @param subpath pointer to another path which will be added + */ +void lv_vector_path_append_path(lv_vector_path_t * path, const lv_vector_path_t * subpath); + +/** + * Create a vector graphic descriptor + * @param layer pointer to a layer + * @return pointer to the created descriptor + */ +lv_draw_vector_dsc_t * lv_draw_vector_dsc_create(lv_layer_t * layer); + +/** + * Delete the vector graphic descriptor + * @param dsc pointer to a vector graphic descriptor + */ +void lv_draw_vector_dsc_delete(lv_draw_vector_dsc_t * dsc); + +/** + * Set a matrix to current transformation matrix. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this matrix. + * @param dsc pointer to a vector graphic descriptor + * @param matrix pointer to a matrix + */ +void lv_draw_vector_dsc_set_transform(lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix); + +/** + * Set blend mode for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this blend mode. + * @param dsc pointer to a vector graphic descriptor + * @param blend the blend mode to be set in `lv_vector_blend_t` + */ +void lv_draw_vector_dsc_set_blend_mode(lv_draw_vector_dsc_t * dsc, lv_vector_blend_t blend); + +/** + * Set the fill color for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this color. + * @param dsc pointer to a vector graphic descriptor + * @param color the color to be set in lv_color32_t format + */ +void lv_draw_vector_dsc_set_fill_color32(lv_draw_vector_dsc_t * dsc, lv_color32_t color); + +/** + * Set fill color for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this color. + * @param dsc pointer to a vector graphic descriptor + * @param color the color to be set in lv_color_t format + */ +void lv_draw_vector_dsc_set_fill_color(lv_draw_vector_dsc_t * dsc, lv_color_t color); + +/** + * Set fill opacity for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this opacity. + * @param dsc pointer to a vector graphic descriptor + * @param opa the opacity to be set in lv_opa_t format + */ +void lv_draw_vector_dsc_set_fill_opa(lv_draw_vector_dsc_t * dsc, lv_opa_t opa); + +/** + * Set fill rule for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this fill rule. + * @param dsc pointer to a vector graphic descriptor + * @param rule the fill rule to be set in lv_vector_fill_t format + */ +void lv_draw_vector_dsc_set_fill_rule(lv_draw_vector_dsc_t * dsc, lv_vector_fill_t rule); + +/** + * Set the fill units for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this fill units. + * @param dsc pointer to a vector graphic descriptor + * @param units the units to be set in lv_vector_fill_units_t format + * @note The units can be either relative to the object bounding box or absolute in user space. + * This API specifically affects the drawing position of the fill image and does not impact other elements. + */ +void lv_draw_vector_dsc_set_fill_units(lv_draw_vector_dsc_t * dsc, const lv_vector_fill_units_t units); + +/** + * Set fill image for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this fill image. + * @param dsc pointer to a vector graphic descriptor + * @param img_dsc pointer to a `lv_draw_image_dsc_t` variable + */ +void lv_draw_vector_dsc_set_fill_image(lv_draw_vector_dsc_t * dsc, const lv_draw_image_dsc_t * img_dsc); + +/** + * Set fill linear gradient for descriptor + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this gradient. + * @param dsc pointer to a vector graphic descriptor + * @param x1 the x for start point + * @param y1 the y for start point + * @param x2 the x for end point + * @param y2 the y for end point + */ +void lv_draw_vector_dsc_set_fill_linear_gradient(lv_draw_vector_dsc_t * dsc, float x1, float y1, float x2, float y2); + +/** + + * Set fill radial gradient radius for descriptor + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this gradient. + * @param dsc pointer to a vector graphic descriptor + * @param cx the x for center of the circle + * @param cy the y for center of the circle + * @param radius the radius for circle + */ +void lv_draw_vector_dsc_set_fill_radial_gradient(lv_draw_vector_dsc_t * dsc, float cx, float cy, float radius); + +/** + * Set fill radial gradient spread for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param spread the gradient spread to be set in lv_vector_gradient_spread_t format + */ +void lv_draw_vector_dsc_set_fill_gradient_spread(lv_draw_vector_dsc_t * dsc, lv_vector_gradient_spread_t spread); + +/** + * Set fill gradient color stops for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this gradient color stops. + * @param dsc pointer to a vector graphic descriptor + * @param stops an array of `lv_grad_stop_t` variables + * @param count the number of stops in the array, range: 0..LV_GRADIENT_MAX_STOPS + */ +void lv_draw_vector_dsc_set_fill_gradient_color_stops(lv_draw_vector_dsc_t * dsc, const lv_grad_stop_t * stops, + uint16_t count); + +/** + * Set a matrix to current fill transformation matrix + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this matrix. + * @param dsc pointer to a vector graphic descriptor + * @param matrix pointer to a matrix + */ +void lv_draw_vector_dsc_set_fill_transform(lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix); + +/** + * Set stroke color for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this color. + * @param dsc pointer to a vector graphic descriptor + * @param color the color to be set in lv_color32_t format + */ +void lv_draw_vector_dsc_set_stroke_color32(lv_draw_vector_dsc_t * dsc, lv_color32_t color); + +/** + * Set stroke color for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this color. + * @param dsc pointer to a vector graphic descriptor + * @param color the color to be set in lv_color_t format + */ +void lv_draw_vector_dsc_set_stroke_color(lv_draw_vector_dsc_t * dsc, lv_color_t color); + +/** + * Set stroke opacity for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param opa the opacity to be set in lv_opa_t format + */ +void lv_draw_vector_dsc_set_stroke_opa(lv_draw_vector_dsc_t * dsc, lv_opa_t opa); + +/** + * Set stroke line width for descriptor. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this stroke width. + * @param dsc pointer to a vector graphic descriptor + * @param width the stroke line width + */ +void lv_draw_vector_dsc_set_stroke_width(lv_draw_vector_dsc_t * dsc, float width); + +/** + * Set stroke line dash pattern for descriptor + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this dash. + * @param dsc pointer to a vector graphic descriptor + * @param dash_pattern an array of values that specify the segments of dash line + * @param dash_count the length of dash pattern array + */ +void lv_draw_vector_dsc_set_stroke_dash(lv_draw_vector_dsc_t * dsc, float * dash_pattern, uint16_t dash_count); + +/** + * Set stroke line cap style for descriptor + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this line cap. + * @param dsc pointer to a vector graphic descriptor + * @param cap the line cap to be set in lv_vector_stroke_cap_t format + */ +void lv_draw_vector_dsc_set_stroke_cap(lv_draw_vector_dsc_t * dsc, lv_vector_stroke_cap_t cap); + +/** + * Set stroke line join style for descriptor + * @param dsc pointer to a vector graphic descriptor + * @param join the line join to be set in lv_vector_stroke_join_t format + */ +void lv_draw_vector_dsc_set_stroke_join(lv_draw_vector_dsc_t * dsc, lv_vector_stroke_join_t join); + +/** + * Set stroke miter limit for descriptor + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this miter limit. + * @param dsc pointer to a vector graphic descriptor + * @param miter_limit the stroke miter_limit + */ +void lv_draw_vector_dsc_set_stroke_miter_limit(lv_draw_vector_dsc_t * dsc, uint16_t miter_limit); + +/** + * Set stroke linear gradient for descriptor + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this gradient. + * @param dsc pointer to a vector graphic descriptor + * @param x1 the x for start point + * @param y1 the y for start point + * @param x2 the x for end point + * @param y2 the y for end point + */ +void lv_draw_vector_dsc_set_stroke_linear_gradient(lv_draw_vector_dsc_t * dsc, float x1, float y1, float x2, float y2); +/** + * Set stroke radial gradient for descriptor + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this gradient. + * @param dsc pointer to a vector graphic descriptor + * @param cx the x for center of the circle + * @param cy the y for center of the circle + * @param radius the radius for circle + */ +void lv_draw_vector_dsc_set_stroke_radial_gradient(lv_draw_vector_dsc_t * dsc, float cx, float cy, float radius); + +/** + * Set stroke color stops for descriptor + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this gradient spread. + * @param dsc pointer to a vector graphic descriptor + * @param spread the gradient spread to be set in lv_vector_gradient_spread_t format + */ +void lv_draw_vector_dsc_set_stroke_gradient_spread(lv_draw_vector_dsc_t * dsc, lv_vector_gradient_spread_t spread); + +/** + * Set stroke color stops for descriptor + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this color stops. + * @param dsc pointer to a vector graphic descriptor + * @param stops an array of `lv_grad_stop_t` variables + * @param count the number of stops in the array + */ +void lv_draw_vector_dsc_set_stroke_gradient_color_stops(lv_draw_vector_dsc_t * dsc, const lv_grad_stop_t * stops, + uint16_t count); + +/** + * Set a matrix to current stroke transformation matrix. + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this matrix. + * @param dsc pointer to a vector graphic descriptor + * @param matrix pointer to a matrix + */ +void lv_draw_vector_dsc_set_stroke_transform(lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix); + +/** + * Set current transformation matrix to identity matrix + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this matrix. + * @param dsc pointer to a vector graphic descriptor + */ +void lv_draw_vector_dsc_identity(lv_draw_vector_dsc_t * dsc); + +/** + * Change the scale factor of current transformation matrix + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this scale. + * @param dsc pointer to a vector graphic descriptor + * @param scale_x the scale factor for the X direction + * @param scale_y the scale factor for the Y direction + */ +void lv_draw_vector_dsc_scale(lv_draw_vector_dsc_t * dsc, float scale_x, float scale_y); + +/** + * Rotate current transformation matrix with origin + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this rotation. + * @param dsc pointer to a vector graphic descriptor + * @param degree angle to rotate + */ +void lv_draw_vector_dsc_rotate(lv_draw_vector_dsc_t * dsc, float degree); + +/** + * Translate current transformation matrix to new position + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this rotation. + * @param dsc pointer to a vector graphic descriptor + * @param tx the amount of translate in x direction + * @param ty the amount of translate in y direction + */ +void lv_draw_vector_dsc_translate(lv_draw_vector_dsc_t * dsc, float tx, float ty); + +/** + * Change the skew factor of current transformation matrix + * The new path shapes added by `lv_draw_vector_dsc_add_path` will use this skew. + * @param dsc pointer to a vector graphic descriptor + * @param skew_x the skew factor for x direction + * @param skew_y the skew factor for y direction + */ +void lv_draw_vector_dsc_skew(lv_draw_vector_dsc_t * dsc, float skew_x, float skew_y); + +/** + * Add a graphic path to the draw list. + * It will use colors, opacity, matrix and other parameters set + * by `lv_draw_vector_dsc_set_fill_color()` and similar functions. + * @param dsc pointer to a vector graphic descriptor + * @param path pointer to a path + */ +void lv_draw_vector_dsc_add_path(lv_draw_vector_dsc_t * dsc, const lv_vector_path_t * path); + +/** + * Clear a rectangle area use current fill color + * @param dsc pointer to a vector graphic descriptor + * @param rect the area to clear in the buffer + */ +void lv_draw_vector_dsc_clear_area(lv_draw_vector_dsc_t * dsc, const lv_area_t * rect); + +/** + * Draw all the vector graphic paths + * @param dsc pointer to a vector graphic descriptor + */ +void lv_draw_vector(lv_draw_vector_dsc_t * dsc); + +/** + * Try to get a vector draw descriptor from a draw task. + * @param task draw task + * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_VECTOR + */ +lv_draw_vector_dsc_t * lv_draw_task_get_vector_dsc(lv_draw_task_t * task); + +/* Traverser for task list */ +typedef void (*vector_draw_task_cb)(void * ctx, const lv_vector_path_t * path, const lv_vector_path_ctx_t * dsc); + +#endif /* LV_USE_VECTOR_GRAPHIC */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_DRAW_VECTOR_H */ diff --git a/inc/lvgl/src/draw/lv_draw_vector_private.h b/inc/lvgl/src/draw/lv_draw_vector_private.h new file mode 100644 index 0000000..10639ca --- /dev/null +++ b/inc/lvgl/src/draw/lv_draw_vector_private.h @@ -0,0 +1,141 @@ +/** + * @file lv_draw_vector_private.h + * + */ + +#ifndef LV_DRAW_VECTOR_PRIVATE_H +#define LV_DRAW_VECTOR_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vector.h" + +#if LV_USE_VECTOR_GRAPHIC + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Stores the shape of the path as arrays of operations and points. + * For example move to 10;20 then draw a line to 30;40 and draw an + * arc with 30 radius and 70° sweep. + * + * `lv_vector_path_ctx_t` is also required to describe how to fill and stroke the path. + */ +struct _lv_vector_path_t { + lv_vector_path_quality_t quality; + lv_array_t ops; + lv_array_t points; +}; + +struct _lv_vector_gradient_t { + lv_vector_gradient_style_t style; + lv_grad_stop_t stops[LV_GRADIENT_MAX_STOPS]; /**< A gradient stop array */ + uint16_t stops_count; /**< The number of used stops in the array */ + float x1; + float y1; + float x2; + float y2; + float cx; + float cy; + float cr; + lv_vector_gradient_spread_t spread; +}; + +struct _lv_vector_fill_dsc_t { + lv_vector_draw_style_t style; + lv_color32_t color; + lv_opa_t opa; + lv_vector_fill_t fill_rule; + lv_vector_fill_units_t fill_units; + lv_draw_image_dsc_t img_dsc; + lv_vector_gradient_t gradient; + lv_matrix_t matrix; +}; + +struct _lv_vector_stroke_dsc_t { + lv_vector_draw_style_t style; + lv_color32_t color; + lv_opa_t opa; + float width; + lv_array_t dash_pattern; + lv_vector_stroke_cap_t cap; + lv_vector_stroke_join_t join; + uint16_t miter_limit; + lv_vector_gradient_t gradient; + lv_matrix_t matrix; +}; + +/** + * Stores how to fill, stroke, transform etc a given path + */ +struct _lv_vector_path_ctx_t { + lv_vector_fill_dsc_t fill_dsc; + lv_vector_stroke_dsc_t stroke_dsc; + lv_matrix_t matrix; + lv_vector_blend_t blend_mode; + lv_area_t scissor_area; +}; + +struct _lv_draw_vector_dsc_t { + lv_draw_dsc_base_t base; + + /** The current colors, opacities, matrix, etc for the next task to be added + * by */ + lv_vector_path_ctx_t * ctx; + + /** + * Store path shapes and their attributes + * in a list as `lv_draw_vector_subtask_t`. */ + lv_ll_t * task_list; +}; + + +/** + * Contains a path shape and its attributes together. + * It's a task that will be passed to the vector rendering engine. + * It's used in the `task_list` of `lv_draw_vector_dsc_t`. + */ +typedef struct { + lv_vector_path_t * path; + lv_vector_path_ctx_t ctx; +} lv_draw_vector_subtask_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * This is the main function to draw the accumulated vector tasks by passing them + * to a vector renderer callback. + * When the callback returns the processed vector task will be destroyed. + * @param task_list pointer to the linked list in `lv_draw_vector_dsc_t` that stores + * the path shapes and their attributes. + * @param cb the callback used to iterate through the task + * @param user_data a custom pointer that will be passed to the callback + */ +void lv_vector_for_each_destroy_tasks(lv_ll_t * task_list, vector_draw_task_cb cb, void * used_data); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_VECTOR_GRAPHIC */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VECTOR_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/lv_image_decoder.c b/inc/lvgl/src/draw/lv_image_decoder.c new file mode 100644 index 0000000..6e10f39 --- /dev/null +++ b/inc/lvgl/src/draw/lv_image_decoder.c @@ -0,0 +1,496 @@ +/** + * @file lv_image_decoder.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_image_decoder_private.h" +#include "../misc/lv_assert.h" +#include "../draw/lv_draw_image.h" +#include "../misc/lv_ll.h" +#include "../misc/lv_profiler.h" +#include "../stdlib/lv_string.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define img_decoder_ll_p &(LV_GLOBAL_DEFAULT()->img_decoder_ll) +#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) +#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache) +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +#if LV_USE_OS != LV_OS_NONE + #define img_decoder_info_lock_p &(LV_GLOBAL_DEFAULT()->img_decoder_info_lock) + #define img_decoder_open_lock_p &(LV_GLOBAL_DEFAULT()->img_decoder_open_lock) +#else + #define img_decoder_info_lock_p NULL + #define img_decoder_open_lock_p NULL +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t img_width_to_stride(lv_image_header_t * header); + +/** + * Get the header info of an image source, and return the a pointer to the decoder that can open it. + * @param dsc Image descriptor containing the source and type of the image and other info. + * @param header The header of the image + * @return The decoder that can open the image source or NULL if not found (or can't open it). + */ +static lv_image_decoder_t * image_decoder_get_info(lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); + +static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the image decoder module + */ +void lv_image_decoder_init(uint32_t image_cache_size, uint32_t image_header_count) +{ + lv_ll_init(img_decoder_ll_p, sizeof(lv_image_decoder_t)); + + /*Initialize the cache*/ + lv_image_cache_init(image_cache_size); + lv_image_header_cache_init(image_header_count); + + lv_mutex_init(img_decoder_info_lock_p); + lv_mutex_init(img_decoder_open_lock_p); +} + +/** + * Deinitialize the image decoder module + */ +void lv_image_decoder_deinit(void) +{ + lv_cache_destroy(img_cache_p, NULL); + lv_cache_destroy(img_header_cache_p, NULL); + + lv_mutex_delete(img_decoder_info_lock_p); + lv_mutex_delete(img_decoder_open_lock_p); + + lv_ll_clear(img_decoder_ll_p); +} + +lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * header) +{ + LV_PROFILER_DECODER_BEGIN; + lv_image_decoder_dsc_t dsc; + lv_memzero(&dsc, sizeof(lv_image_decoder_dsc_t)); + dsc.src = src; + dsc.src_type = lv_image_src_get_type(src); + + lv_mutex_lock(img_decoder_info_lock_p); + lv_image_decoder_t * decoder = image_decoder_get_info(&dsc, header); + lv_mutex_unlock(img_decoder_info_lock_p); + + LV_PROFILER_DECODER_END; + return decoder ? LV_RESULT_OK : LV_RESULT_INVALID; +} + +lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, const lv_image_decoder_args_t * args) +{ + LV_PROFILER_DECODER_BEGIN; + lv_memzero(dsc, sizeof(lv_image_decoder_dsc_t)); + + if(src == NULL) { + LV_PROFILER_DECODER_END; + return LV_RESULT_INVALID; + } + dsc->src = src; + dsc->src_type = lv_image_src_get_type(src); + + lv_mutex_lock(img_decoder_open_lock_p); + + if(lv_image_cache_is_enabled()) { + dsc->cache = img_cache_p; + /*Try cache first, unless we are told to ignore cache.*/ + if(!(args && args->no_cache)) { + /* + * Check the cache first + * If the image is found in the cache, just return it.*/ + if(try_cache(dsc) == LV_RESULT_OK) { + lv_mutex_unlock(img_decoder_open_lock_p); + LV_PROFILER_DECODER_END; + return LV_RESULT_OK; + } + } + } + + /*Find the decoder that can open the image source, and get the header info in the same time.*/ + dsc->decoder = image_decoder_get_info(dsc, &dsc->header); + if(dsc->decoder == NULL) { + lv_mutex_unlock(img_decoder_open_lock_p); + LV_PROFILER_DECODER_END; + return LV_RESULT_INVALID; + } + + /*Make a copy of args*/ + dsc->args = args ? *args : (lv_image_decoder_args_t) { + .stride_align = LV_DRAW_BUF_STRIDE_ALIGN != 1, + .premultiply = false, + .no_cache = false, + .use_indexed = false, + .flush_cache = false, + }; + + /* + * We assume that if a decoder can get the info, it can open the image. + * If decoder open failed, free the source and return error. + * If decoder open succeed, add the image to cache if enabled. + * */ + LV_PROFILER_DECODER_BEGIN_TAG(dsc->decoder->name); + lv_result_t res = dsc->decoder->open_cb(dsc->decoder, dsc); + LV_PROFILER_DECODER_END_TAG(dsc->decoder->name); + + if(res == LV_RESULT_OK && dsc->decoded != NULL) { + LV_ASSERT_MSG(dsc->decoded->unaligned_data && dsc->decoded->handlers, "Invalid draw buffer"); + + /* Flush the D-Cache if enabled and the image was successfully opened */ + if(dsc->args.flush_cache) { + lv_draw_buf_flush_cache(dsc->decoded, NULL); + LV_LOG_INFO("Flushed D-cache: src %p (%s) (W%d x H%d, data: %p cf: %d)", + src, + dsc->src_type == LV_IMAGE_SRC_FILE ? (const char *)src : "c-array", + dsc->decoded->header.w, + dsc->decoded->header.h, + (void *)dsc->decoded->data, + dsc->decoded->header.cf); + } + } + + lv_mutex_unlock(img_decoder_open_lock_p); + LV_PROFILER_DECODER_END; + return res; +} + +lv_result_t lv_image_decoder_get_area(lv_image_decoder_dsc_t * dsc, const lv_area_t * full_area, + lv_area_t * decoded_area) +{ + LV_PROFILER_DECODER_BEGIN; + lv_result_t res = LV_RESULT_INVALID; + if(dsc->decoder->get_area_cb) { + LV_PROFILER_DECODER_BEGIN_TAG(dsc->decoder->name); + res = dsc->decoder->get_area_cb(dsc->decoder, dsc, full_area, decoded_area); + LV_PROFILER_DECODER_END_TAG(dsc->decoder->name); + } + + LV_PROFILER_DECODER_END; + return res; +} + +void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc) +{ + LV_PROFILER_DECODER_BEGIN; + if(!dsc->decoder) { + LV_PROFILER_DECODER_END; + return; + } + + lv_mutex_lock(img_decoder_open_lock_p); + + if(dsc->decoder->close_cb) { + LV_PROFILER_DECODER_BEGIN_TAG(dsc->decoder->name); + dsc->decoder->close_cb(dsc->decoder, dsc); + LV_PROFILER_DECODER_END_TAG(dsc->decoder->name); + } + + if(lv_image_cache_is_enabled() && dsc->cache && dsc->cache_entry) { + /*Decoded data is in cache, release it from cache's callback*/ + lv_cache_release(dsc->cache, dsc->cache_entry, NULL); + } + + lv_mutex_unlock(img_decoder_open_lock_p); + LV_PROFILER_DECODER_END; +} + +/** + * Create a new image decoder + * @return pointer to the new image decoder + */ +lv_image_decoder_t * lv_image_decoder_create(void) +{ + lv_image_decoder_t * decoder; + decoder = lv_ll_ins_head(img_decoder_ll_p); + LV_ASSERT_MALLOC(decoder); + if(decoder == NULL) return NULL; + + lv_memzero(decoder, sizeof(lv_image_decoder_t)); + + return decoder; +} + +void lv_image_decoder_delete(lv_image_decoder_t * decoder) +{ + lv_ll_remove(img_decoder_ll_p, decoder); + lv_free(decoder); +} + +lv_image_decoder_t * lv_image_decoder_get_next(lv_image_decoder_t * decoder) +{ + if(decoder == NULL) + return lv_ll_get_head(img_decoder_ll_p); + else + return lv_ll_get_next(img_decoder_ll_p, decoder); +} + +void lv_image_decoder_set_info_cb(lv_image_decoder_t * decoder, lv_image_decoder_info_f_t info_cb) +{ + decoder->info_cb = info_cb; +} + +void lv_image_decoder_set_open_cb(lv_image_decoder_t * decoder, lv_image_decoder_open_f_t open_cb) +{ + decoder->open_cb = open_cb; +} + +void lv_image_decoder_set_get_area_cb(lv_image_decoder_t * decoder, lv_image_decoder_get_area_cb_t get_area_cb) +{ + decoder->get_area_cb = get_area_cb; +} + +void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb) +{ + decoder->close_cb = close_cb; +} + +lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder, + lv_image_cache_data_t * search_key, + const lv_draw_buf_t * decoded, void * user_data) +{ + LV_PROFILER_DECODER_BEGIN; + lv_cache_entry_t * cache_entry = lv_cache_add(img_cache_p, search_key, NULL); + if(cache_entry == NULL) { + LV_PROFILER_DECODER_END; + return NULL; + } + + lv_image_cache_data_t * cached_data; + cached_data = lv_cache_entry_get_data(cache_entry); + + /*Set the cache entry to decoder data*/ + cached_data->decoded = decoded; + if(cached_data->src_type == LV_IMAGE_SRC_FILE) { + cached_data->src = lv_strdup(cached_data->src); + } + cached_data->user_data = user_data; /*Need to free data on cache invalidate instead of decoder_close*/ + cached_data->decoder = decoder; + + LV_PROFILER_DECODER_END; + return cache_entry; +} + +lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_draw_buf_t * decoded) +{ + LV_PROFILER_DECODER_BEGIN; + if(decoded == NULL) { + LV_PROFILER_DECODER_END; + return NULL; /*No need to adjust*/ + } + + lv_image_decoder_args_t * args = &dsc->args; + if(args->stride_align && decoded->header.cf != LV_COLOR_FORMAT_RGB565A8) { + uint32_t stride_expect = lv_draw_buf_width_to_stride(decoded->header.w, decoded->header.cf); + if(decoded->header.stride != stride_expect) { + LV_LOG_TRACE("Stride mismatch"); + lv_result_t res = lv_draw_buf_adjust_stride(decoded, stride_expect); + if(res != LV_RESULT_OK) { + lv_draw_buf_t * aligned = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, decoded->header.w, decoded->header.h, + decoded->header.cf, stride_expect); + if(aligned == NULL) { + LV_LOG_ERROR("No memory for Stride adjust."); + LV_PROFILER_DECODER_END; + return NULL; + } + + lv_draw_buf_copy(aligned, NULL, decoded, NULL); + decoded = aligned; + } + } + } + + /*Premultiply alpha channel*/ + if(args->premultiply + && !LV_COLOR_FORMAT_IS_ALPHA_ONLY(decoded->header.cf) + && lv_color_format_has_alpha(decoded->header.cf) + && !lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_PREMULTIPLIED) + && decoded->header.cf != LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED /*Hasn't done yet*/ + ) { + LV_LOG_TRACE("Alpha premultiply."); + if(lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_MODIFIABLE)) { + /*Do it directly*/ + lv_draw_buf_premultiply(decoded); + } + else { + decoded = lv_draw_buf_dup_ex(image_cache_draw_buf_handlers, decoded); + if(decoded == NULL) { + LV_LOG_ERROR("No memory for premultiplying."); + LV_PROFILER_DECODER_END; + return NULL; + } + + lv_draw_buf_premultiply(decoded); + } + } + + LV_PROFILER_DECODER_END; + return decoded; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_image_decoder_t * image_decoder_get_info(lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + LV_PROFILER_DECODER_BEGIN; + lv_memzero(header, sizeof(lv_image_header_t)); + + const void * src = dsc->src; + lv_image_src_t src_type = dsc->src_type; + + if(src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = src; + if(img_dsc->data == NULL) { + LV_PROFILER_DECODER_END; + return NULL; + } + } + + if(src_type == LV_IMAGE_SRC_FILE) LV_LOG_TRACE("Try to find decoder for %s", (const char *)src); + else LV_LOG_TRACE("Try to find decoder for %p", src); + + lv_image_decoder_t * decoder; + bool is_header_cache_enabled = lv_image_header_cache_is_enabled(); + + if(is_header_cache_enabled && src_type == LV_IMAGE_SRC_FILE) { + lv_image_header_cache_data_t search_key; + search_key.src_type = src_type; + search_key.src = src; + + lv_cache_entry_t * entry = lv_cache_acquire(img_header_cache_p, &search_key, NULL); + + if(entry) { + lv_image_header_cache_data_t * cached_data = lv_cache_entry_get_data(entry); + *header = cached_data->header; + decoder = cached_data->decoder; + lv_cache_release(img_header_cache_p, entry, NULL); + + LV_LOG_TRACE("Found decoder %s in header cache", decoder->name); + LV_PROFILER_DECODER_END; + return decoder; + } + } + + if(src_type == LV_IMAGE_SRC_FILE) { + lv_fs_res_t fs_res = lv_fs_open(&dsc->file, src, LV_FS_MODE_RD); + if(fs_res != LV_FS_RES_OK) { + LV_LOG_ERROR("File open failed: %" LV_PRIu32, (uint32_t)fs_res); + LV_PROFILER_DECODER_END; + return NULL; + } + } + + /*Search the decoders*/ + LV_LL_READ(img_decoder_ll_p, decoder) { + /*Info and Open callbacks are required*/ + if(decoder->info_cb && decoder->open_cb) { + lv_fs_seek(&dsc->file, 0, LV_FS_SEEK_SET); + LV_PROFILER_DECODER_BEGIN_TAG(decoder->name); + lv_result_t res = decoder->info_cb(decoder, dsc, header); + LV_PROFILER_DECODER_END_TAG(decoder->name); + + if(res == LV_RESULT_OK) { + if(header->stride == 0) { + LV_LOG_INFO("Image decoder didn't set stride. Calculate it from width."); + header->stride = img_width_to_stride(header); + } + break; + } + else { + LV_LOG_TRACE("Can't open image with decoder %s. Trying next decoder.", decoder->name); + } + } + } + + if(decoder == NULL) LV_LOG_TRACE("No decoder found"); + else LV_LOG_TRACE("Found decoder %s", decoder->name); + + if(src_type == LV_IMAGE_SRC_FILE) { + lv_fs_close(&dsc->file); + } + + if(is_header_cache_enabled && src_type == LV_IMAGE_SRC_FILE && decoder) { + lv_cache_entry_t * entry; + lv_image_header_cache_data_t search_key; + search_key.src_type = src_type; + search_key.src = lv_strdup(src); + search_key.decoder = decoder; + search_key.header = *header; + entry = lv_cache_add(img_header_cache_p, &search_key, NULL); + + if(entry == NULL) { + if(src_type == LV_IMAGE_SRC_FILE) lv_free((void *)search_key.src); + LV_PROFILER_DECODER_END; + return NULL; + } + + lv_cache_release(img_header_cache_p, entry, NULL); + } + + LV_PROFILER_DECODER_END; + return decoder; +} + +static uint32_t img_width_to_stride(lv_image_header_t * header) +{ + if(header->cf == LV_COLOR_FORMAT_RGB565A8) { + return header->w * 2; + } + else { + return ((uint32_t)header->w * lv_color_format_get_bpp(header->cf) + 7) >> 3; + } +} + +static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc) +{ + LV_PROFILER_DECODER_BEGIN; + lv_cache_t * cache = dsc->cache; + + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + + lv_cache_entry_t * entry = lv_cache_acquire(cache, &search_key, NULL); + + if(entry) { + lv_image_cache_data_t * cached_data = lv_cache_entry_get_data(entry); + dsc->decoded = cached_data->decoded; + dsc->decoder = (lv_image_decoder_t *)cached_data->decoder; + dsc->cache_entry = entry; /*Save the cache to release it in decoder_close*/ + LV_PROFILER_DECODER_END; + return LV_RESULT_OK; + } + + LV_PROFILER_DECODER_END; + return LV_RESULT_INVALID; +} diff --git a/inc/lvgl/src/draw/lv_image_decoder.h b/inc/lvgl/src/draw/lv_image_decoder.h new file mode 100644 index 0000000..3b8089a --- /dev/null +++ b/inc/lvgl/src/draw/lv_image_decoder.h @@ -0,0 +1,203 @@ +/** + * @file lv_image_decoder.h + * + */ + +#ifndef LV_IMAGE_DECODER_H +#define LV_IMAGE_DECODER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "lv_draw_buf.h" +#include "../misc/lv_fs.h" +#include "../misc/lv_types.h" +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Source of image.*/ +typedef enum { + LV_IMAGE_SRC_VARIABLE, /** Binary/C variable*/ + LV_IMAGE_SRC_FILE, /** File in filesystem*/ + LV_IMAGE_SRC_SYMBOL, /** Symbol (@ref lv_symbol_def.h)*/ + LV_IMAGE_SRC_UNKNOWN, /** Unknown source*/ +} lv_image_src_t; + +/** + * Get info from an image and store in the `header` + * @param decoder pointer to decoder object + * @param dsc pointer to decoder descriptor + * @param header store the info here + * @return LV_RESULT_OK: info written correctly; LV_RESULT_INVALID: failed + */ +typedef lv_result_t (*lv_image_decoder_info_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + lv_image_header_t * header); + +/** + * Open an image for decoding. Prepare it as it is required to read it later + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it. + */ +typedef lv_result_t (*lv_image_decoder_open_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +/** + * Decode `full_area` pixels incrementally by calling in a loop. Set `decoded_area` values to `LV_COORD_MIN` on first call. + * Required only if the "open" function can't return with the whole decoded pixel array. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + * @param full_area input parameter. the full area to decode after enough subsequent calls + * @param decoded_area input+output parameter. set the values to `LV_COORD_MIN` for the first call and to reset decoding. + * the decoded area is stored here after each call. + * @return LV_RESULT_OK: ok; LV_RESULT_INVALID: failed or there is nothing left to decode + */ +typedef lv_result_t (*lv_image_decoder_get_area_cb_t)(lv_image_decoder_t * decoder, + lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area); + +/** + * Close the pending decoding. Free resources etc. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + */ +typedef void (*lv_image_decoder_close_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +/** + * Custom drawing functions for special image formats. + * @param layer pointer to a layer + * @param dsc pointer to decoder descriptor + * @param coords the coordinates of the image + * @param draw_dsc the draw image descriptor + * @param clip_area the clip area of the image + */ +typedef void (*lv_image_decoder_custom_draw_t)(lv_layer_t * layer, const lv_image_decoder_dsc_t * dsc, + const lv_area_t * coords, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * clip_area); +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get information about an image. + * Try the created image decoder one by one. Once one is able to get info that info will be used. + * @param src the image source. Can be + * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register()`) + * 2) Variable: Pointer to an `lv_image_dsc_t` variable + * 3) Symbol: E.g. `LV_SYMBOL_OK` + * @param header the image info will be stored here + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: wasn't able to get info about the image + */ +lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * header); + +/** + * Open an image. + * Try the created image decoders one by one. Once one is able to open the image that decoder is saved in `dsc` + * @param dsc describes a decoding session. Simply a pointer to an `lv_image_decoder_dsc_t` variable. + * @param src the image source. Can be + * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register())`) + * 2) Variable: Pointer to an `lv_image_dsc_t` variable + * 3) Symbol: E.g. `LV_SYMBOL_OK` + * @param args args about how the image should be opened. + * @return LV_RESULT_OK: opened the image. `dsc->decoded` and `dsc->header` are set. + * LV_RESULT_INVALID: none of the registered image decoders were able to open the image. + */ +lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, const lv_image_decoder_args_t * args); + +/** + * Decode `full_area` pixels incrementally by calling in a loop. Set `decoded_area` to `LV_COORD_MIN` on first call. + * @param dsc image decoder descriptor + * @param full_area input parameter. the full area to decode after enough subsequent calls + * @param decoded_area input+output parameter. set the values to `LV_COORD_MIN` for the first call and to reset decoding. + * the decoded area is stored here after each call. + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: an error occurred or there is nothing left to decode + */ +lv_result_t lv_image_decoder_get_area(lv_image_decoder_dsc_t * dsc, const lv_area_t * full_area, + lv_area_t * decoded_area); + +/** + * Close a decoding session + * @param dsc pointer to `lv_image_decoder_dsc_t` used in `lv_image_decoder_open` + */ +void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc); + +/** + * Create a new image decoder + * @return pointer to the new image decoder + */ +lv_image_decoder_t * lv_image_decoder_create(void); + +/** + * Delete an image decoder + * @param decoder pointer to an image decoder + */ +void lv_image_decoder_delete(lv_image_decoder_t * decoder); + +/** + * Get the next image decoder in the linked list of image decoders + * @param decoder pointer to an image decoder or NULL to get the first one + * @return the next image decoder or NULL if no more image decoder exists + */ +lv_image_decoder_t * lv_image_decoder_get_next(lv_image_decoder_t * decoder); + +/** + * Set a callback to get information about the image + * @param decoder pointer to an image decoder + * @param info_cb a function to collect info about an image (fill an `lv_image_header_t` struct) + */ +void lv_image_decoder_set_info_cb(lv_image_decoder_t * decoder, lv_image_decoder_info_f_t info_cb); + +/** + * Set a callback to open an image + * @param decoder pointer to an image decoder + * @param open_cb a function to open an image + */ +void lv_image_decoder_set_open_cb(lv_image_decoder_t * decoder, lv_image_decoder_open_f_t open_cb); + +/** + * Set a callback to a decoded line of an image + * @param decoder pointer to an image decoder + * @param read_line_cb a function to read a line of an image + */ +void lv_image_decoder_set_get_area_cb(lv_image_decoder_t * decoder, lv_image_decoder_get_area_cb_t read_line_cb); + +/** + * Set a callback to close a decoding session. E.g. close files and free other resources. + * @param decoder pointer to an image decoder + * @param close_cb a function to close a decoding session + */ +void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb); + +lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder, + lv_image_cache_data_t * search_key, + const lv_draw_buf_t * decoded, void * user_data); + +/** + * Check the decoded image, make any modification if decoder `args` requires. + * @note A new draw buf will be allocated if provided `decoded` is not modifiable or stride mismatch etc. + * @param dsc pointer to a decoder descriptor + * @param decoded pointer to a decoded image to post process to meet dsc->args requirement. + * @return post processed draw buffer, when it differs with `decoded`, it's newly allocated. + */ +lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_draw_buf_t * decoded); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_DECODER_H*/ diff --git a/inc/lvgl/src/draw/lv_image_decoder_private.h b/inc/lvgl/src/draw/lv_image_decoder_private.h new file mode 100644 index 0000000..c7369d0 --- /dev/null +++ b/inc/lvgl/src/draw/lv_image_decoder_private.h @@ -0,0 +1,144 @@ +/** + * @file lv_image_decoder_private.h + * + */ + +#ifndef LV_IMAGE_DECODER_PRIVATE_H +#define LV_IMAGE_DECODER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_image_decoder.h" +#include "../misc/cache/lv_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Image decoder args. + * It determines how to decoder an image, e.g. whether to premultiply the alpha or not. + * It should be passed to lv_img_decoder_open() function. If NULL is provided, default + * args are used. + * + * Default args: + * all field are zero or false. + */ +struct _lv_image_decoder_args_t { + bool stride_align; /**< Whether stride should be aligned */ + bool premultiply; /**< Whether image should be premultiplied or not after decoding */ + bool no_cache; /**< When set, decoded image won't be put to cache, and decoder open will also ignore cache. */ + bool use_indexed; /**< Decoded indexed image as is. Convert to ARGB8888 if false. */ + bool flush_cache; /**< Whether to flush the data cache after decoding */ +}; + +struct _lv_image_decoder_t { + lv_image_decoder_info_f_t info_cb; + lv_image_decoder_open_f_t open_cb; + lv_image_decoder_get_area_cb_t get_area_cb; + lv_image_decoder_close_f_t close_cb; + + lv_image_decoder_custom_draw_t custom_draw_cb; + + const char * name; + + void * user_data; +}; + +struct _lv_image_cache_data_t { + lv_cache_slot_size_t slot; + + const void * src; + lv_image_src_t src_type; + + const lv_draw_buf_t * decoded; + const lv_image_decoder_t * decoder; + void * user_data; +}; + +struct _lv_image_header_cache_data_t { + const void * src; + lv_image_src_t src_type; + + lv_image_header_t header; + lv_image_decoder_t * decoder; +}; + +/**Describe an image decoding session. Stores data about the decoding*/ +struct _lv_image_decoder_dsc_t { + /**The decoder which was able to open the image source*/ + lv_image_decoder_t * decoder; + + /**A copy of parameters of how this image is decoded*/ + lv_image_decoder_args_t args; + + /**The image source. A file path like "S:my_img.png" or pointer to an `lv_image_dsc_t` variable*/ + const void * src; + + /**Type of the source: file or variable. Can be set in `open` function if required*/ + lv_image_src_t src_type; + + lv_fs_file_t file; + + /**Info about the opened image: color format, size, etc. MUST be set in `open` function*/ + lv_image_header_t header; + + /** Pointer to a draw buffer where the image's data (pixels) are stored in a decoded, plain format. + * MUST be set in `open` or `get_area_cb`function*/ + const lv_draw_buf_t * decoded; + + const lv_color32_t * palette; + uint32_t palette_size; + + /** How much time did it take to open the image. [ms] + * If not set `lv_image_cache` will measure and set the time to open*/ + uint32_t time_to_open; + + /**A text to display instead of the image when the image can't be opened. + * Can be set in `open` function or set NULL.*/ + const char * error_msg; + + lv_cache_t * cache; + + /**Point to cache entry information*/ + lv_cache_entry_t * cache_entry; + + /**Store any custom data here is required*/ + void * user_data; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the image decoder module + * @param image_cache_size Image cache size in bytes. 0 to disable cache. + * @param image_header_count Number of header cache entries. 0 to disable header cache. + */ +void lv_image_decoder_init(uint32_t image_cache_size, uint32_t image_header_count); + +/** + * Deinitialize the image decoder module + */ +void lv_image_decoder_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_DECODER_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/lv_image_dsc.h b/inc/lvgl/src/draw/lv_image_dsc.h new file mode 100644 index 0000000..6a6f7af --- /dev/null +++ b/inc/lvgl/src/draw/lv_image_dsc.h @@ -0,0 +1,152 @@ +/** + * @file lv_image_dsc.h + * + */ + +#ifndef LV_IMAGE_DSC_H +#define LV_IMAGE_DSC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/** Magic number for lvgl image, 9 means lvgl version 9 + * It must be neither a valid ASCII character nor larger than 0x80. See `lv_image_src_get_type`. + */ +#define LV_IMAGE_HEADER_MAGIC (0x19) +LV_EXPORT_CONST_INT(LV_IMAGE_HEADER_MAGIC); + +/** + * Flags reserved for user, lvgl won't use these bits. + */ +#define LV_IMAGE_FLAGS_USER_MASK (0xFF00) + +/********************** + * TYPEDEFS + **********************/ + +typedef enum _lvimage_flags_t { + /** + * For RGB map of the image data, mark if it's pre-multiplied with alpha. + * For indexed image, this bit indicated palette data is pre-multiplied with alpha. + */ + LV_IMAGE_FLAGS_PREMULTIPLIED = 0x0001, + /** + * The image data is compressed, so decoder needs to decode image firstly. + * If this flag is set, the whole image will be decompressed upon decode, and + * `get_area_cb` won't be necessary. + */ + LV_IMAGE_FLAGS_COMPRESSED = 0x0008, + + /*Below flags are applicable only for draw buffer header.*/ + + /** + * The image is allocated from heap, thus should be freed after use. + */ + LV_IMAGE_FLAGS_ALLOCATED = 0x0010, + + /** + * If the image data is malloced and can be processed in place. + * In image decoder post processing, this flag means we modify it in-place. + */ + LV_IMAGE_FLAGS_MODIFIABLE = 0x0020, + + /** + * The image has custom drawing methods. + */ + LV_IMAGE_FLAGS_CUSTOM_DRAW = 0x0040, + + /** + * Flags reserved for user, lvgl won't use these bits. + */ + LV_IMAGE_FLAGS_USER1 = 0x0100, + LV_IMAGE_FLAGS_USER2 = 0x0200, + LV_IMAGE_FLAGS_USER3 = 0x0400, + LV_IMAGE_FLAGS_USER4 = 0x0800, + LV_IMAGE_FLAGS_USER5 = 0x1000, + LV_IMAGE_FLAGS_USER6 = 0x2000, + LV_IMAGE_FLAGS_USER7 = 0x4000, + LV_IMAGE_FLAGS_USER8 = 0x8000, +} lv_image_flags_t; + +typedef enum { + LV_IMAGE_COMPRESS_NONE = 0, + LV_IMAGE_COMPRESS_RLE, /**< LVGL custom RLE compression */ + LV_IMAGE_COMPRESS_LZ4, +} lv_image_compress_t; + +#if LV_BIG_ENDIAN_SYSTEM +typedef struct { + uint32_t reserved_2: 16; /**< Reserved to be used later*/ + uint32_t stride: 16; /**< Number of bytes in a row*/ + uint32_t h: 16; + uint32_t w: 16; + uint32_t flags: 16; /**< Image flags, see `lv_image_flags_t`*/ + uint32_t cf : 8; /**< Color format: See `lv_color_format_t`*/ + uint32_t magic: 8; /**< Magic number. Must be LV_IMAGE_HEADER_MAGIC*/ +} lv_image_header_t; +#else +typedef struct { + uint32_t magic: 8; /**< Magic number. Must be LV_IMAGE_HEADER_MAGIC*/ + uint32_t cf : 8; /**< Color format: See `lv_color_format_t`*/ + uint32_t flags: 16; /**< Image flags, see `lv_image_flags_t`*/ + + uint32_t w: 16; + uint32_t h: 16; + uint32_t stride: 16; /**< Number of bytes in a row*/ + uint32_t reserved_2: 16; /**< Reserved to be used later*/ +} lv_image_header_t; +#endif + +typedef struct { + void * buf; + uint32_t stride; /**< Number of bytes in a row*/ +} lv_yuv_plane_t; + +typedef union { + lv_yuv_plane_t yuv; /**< packed format*/ + struct { + lv_yuv_plane_t y; + lv_yuv_plane_t u; + lv_yuv_plane_t v; + } planar; /**< planar format with 3 plane*/ + struct { + lv_yuv_plane_t y; + lv_yuv_plane_t uv; + } semi_planar; /**< planar format with 2 plane*/ +} lv_yuv_buf_t; + +/** + * Struct to describe a constant image resource. + * It's similar to lv_draw_buf_t, but the data is constant. + */ +typedef struct { + lv_image_header_t header; /**< A header describing the basics of the image*/ + uint32_t data_size; /**< Size of the image in bytes*/ + const uint8_t * data; /**< Pointer to the data of the image*/ + const void * reserved; /**< A reserved field to make it has same size as lv_draw_buf_t*/ + const void * reserved_2; /**< A reserved field to make it has same size as lv_draw_buf_t*/ +} lv_image_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_DSC_H*/ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg.c new file mode 100644 index 0000000..13470ea --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg.c @@ -0,0 +1,468 @@ +/** + * @file lv_draw_nanovg.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg.h" + +#if LV_USE_DRAW_NANOVG + +#include "../../display/lv_display.h" +#include "../../core/lv_refr_private.h" +#include "lv_draw_nanovg_private.h" +#include "lv_nanovg_utils.h" +#include "lv_nanovg_image_cache.h" +#include "lv_nanovg_fbo_cache.h" + +#if LV_USE_OPENGLES && LV_USE_EGL + #include "../../drivers/opengles/lv_opengles_private.h" +#else + #define NANOVG_GL_STATIC_LINK +#endif + +#if defined(NANOVG_GL2_IMPLEMENTATION) + #ifdef NANOVG_GL_STATIC_LINK + #include + #endif + #define NVG_CTX_CREATE nvgCreateGL2 + #define NVG_CTX_DELETE nvgDeleteGL2 +#elif defined(NANOVG_GL3_IMPLEMENTATION) + #ifdef NANOVG_GL_STATIC_LINK + #include + #endif + #define NVG_CTX_CREATE nvgCreateGL3 + #define NVG_CTX_DELETE nvgDeleteGL3 +#elif defined(NANOVG_GLES2_IMPLEMENTATION) + #ifdef NANOVG_GL_STATIC_LINK + #include + #endif + #define NVG_CTX_CREATE nvgCreateGLES2 + #define NVG_CTX_DELETE nvgDeleteGLES2 +#elif defined(NANOVG_GLES3_IMPLEMENTATION) + #ifdef NANOVG_GL_STATIC_LINK + #include + #endif + #define NVG_CTX_CREATE nvgCreateGLES3 + #define NVG_CTX_DELETE nvgDeleteGLES3 +#else + #error "No NanoVG implementation defined" +#endif + +#include "../../libs/nanovg/nanovg_gl.h" +#include "../../libs/nanovg/nanovg_gl_utils.h" + +/* GL_BGRA may not be defined on all platforms */ +#ifndef GL_BGRA + #ifdef GL_BGRA_EXT + #define GL_BGRA GL_BGRA_EXT + #else + #define GL_BGRA 0x80E1 + #endif +#endif + +/********************* + * DEFINES + *********************/ + +#define NANOVG_DRAW_UNIT_ID 10 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); +static int32_t draw_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); +static int32_t draw_delete(lv_draw_unit_t * draw_unit); +static void draw_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nanovg_init(void) +{ + static bool initialized = false; + if(initialized) return; + initialized = true; + + lv_draw_nanovg_unit_t * unit = lv_draw_create_unit(sizeof(lv_draw_nanovg_unit_t)); + unit->base_unit.dispatch_cb = draw_dispatch; + unit->base_unit.evaluate_cb = draw_evaluate; + unit->base_unit.delete_cb = draw_delete; + unit->base_unit.event_cb = draw_event_cb; + unit->base_unit.name = "NANOVG"; + + unit->vg = NVG_CTX_CREATE(0); + LV_ASSERT_MSG(unit->vg != NULL, "NanoVG init failed"); + + lv_nanovg_utils_init(unit); + lv_nanovg_image_cache_init(unit); + lv_nanovg_fbo_cache_init(unit); + lv_draw_nanovg_label_init(unit); +} + +int lv_nanovg_fb_get_image_handle(struct NVGLUframebuffer * fb) +{ + LV_ASSERT_NULL(fb); + return fb->image; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void draw_execute(lv_draw_nanovg_unit_t * u, lv_draw_task_t * t) +{ + /* remember draw unit for access to unit's context */ + t->draw_unit = (lv_draw_unit_t *)u; + lv_layer_t * layer = t->target_layer; + + lv_matrix_t global_matrix; + lv_matrix_identity(&global_matrix); + if(layer->buf_area.x1 || layer->buf_area.y1) { + lv_matrix_translate(&global_matrix, -layer->buf_area.x1, -layer->buf_area.y1); + } + +#if LV_DRAW_TRANSFORM_USE_MATRIX + lv_matrix_t layer_matrix = t->matrix; + lv_matrix_multiply(&global_matrix, &layer_matrix); +#endif + + /* NanoVG will output premultiplied image, set the flag correspondingly. */ + if(layer->draw_buf) { + lv_draw_buf_set_flag(layer->draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); + } + + nvgReset(u->vg); + lv_nanovg_transform(u->vg, &global_matrix); + + lv_nanovg_set_clip_area(u->vg, &t->clip_area); + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_nanovg_fill(t, t->draw_dsc, &t->area); + break; + + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_nanovg_border(t, t->draw_dsc, &t->area); + break; + + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + lv_draw_nanovg_box_shadow(t, t->draw_dsc, &t->area); + break; + + case LV_DRAW_TASK_TYPE_LETTER: + lv_draw_nanovg_letter(t, t->draw_dsc, &t->area); + break; + + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_nanovg_label(t, t->draw_dsc, &t->area); + break; + + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_nanovg_image(t, t->draw_dsc, &t->area, -1); + break; + + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_nanovg_layer(t, t->draw_dsc, &t->area); + break; + + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_nanovg_line(t, t->draw_dsc); + break; + + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_nanovg_arc(t, t->draw_dsc, &t->area); + break; + + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_nanovg_triangle(t, t->draw_dsc); + break; + + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + lv_draw_nanovg_mask_rect(t, t->draw_dsc); + break; + +#if LV_USE_VECTOR_GRAPHIC + case LV_DRAW_TASK_TYPE_VECTOR: + lv_draw_nanovg_vector(t, t->draw_dsc); + break; +#endif + +#if LV_USE_3DTEXTURE + case LV_DRAW_TASK_TYPE_3D: + lv_draw_nanovg_3d(t, t->draw_dsc, &t->area); + break; +#endif + default: + LV_LOG_ERROR("unknown draw task type: %d", t->type); + break; + } +} + +static void on_layer_changed(lv_layer_t * new_layer) +{ + LV_PROFILER_DRAW_BEGIN; + + if(!new_layer->user_data) { + /* Bind the default framebuffer for normal rendering */ + nvgluBindFramebuffer(NULL); + LV_PROFILER_DRAW_END; + return; + } + + LV_PROFILER_BEGIN_TAG("nvgBindFramebuffer"); + nvgluBindFramebuffer(lv_nanovg_fbo_cache_entry_to_fb(new_layer->user_data)); + LV_PROFILER_END_TAG("nvgBindFramebuffer"); + + /* Clear the off-screen framebuffer */ + LV_PROFILER_DRAW_BEGIN_TAG("glClear"); + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + LV_PROFILER_DRAW_END_TAG("glClear"); + + LV_PROFILER_DRAW_END; +} + +static void on_layer_readback(lv_draw_nanovg_unit_t * u, lv_layer_t * layer) +{ + LV_PROFILER_DRAW_BEGIN; + LV_ASSERT_NULL(u); + LV_ASSERT_NULL(layer); + + lv_cache_entry_t * entry = layer->user_data; + + if(!entry) { + LV_LOG_WARN("No entry available for layer: %p", (void *)layer); + LV_PROFILER_DRAW_END; + return; + } + + if(!layer->draw_buf) { + LV_LOG_WARN("No draw buffer available for layer: %p", (void *)layer); + LV_PROFILER_DRAW_END; + return; + } + + struct NVGLUframebuffer * fb = lv_nanovg_fbo_cache_entry_to_fb(entry); + if(!fb) { + LV_LOG_ERROR("No framebuffer available for layer: %p", (void *)layer); + LV_PROFILER_DRAW_END; + return; + } + + /* Bind the FBO for reading */ + nvgluBindFramebuffer(fb); + + int32_t w = lv_area_get_width(&layer->buf_area); + int32_t h = lv_area_get_height(&layer->buf_area); + lv_draw_buf_t * draw_buf = layer->draw_buf; + + /* Read pixels from FBO */ + GLenum format; + GLenum type; + + /* OpenGL reads bottom-to-top, but LVGL expects top-to-bottom */ + switch(draw_buf->header.cf) { + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + format = GL_BGRA; + type = GL_UNSIGNED_BYTE; + break; + + case LV_COLOR_FORMAT_RGB888: + format = GL_RGB; + type = GL_UNSIGNED_BYTE; + break; + + case LV_COLOR_FORMAT_RGB565: + format = GL_RGB; + type = GL_UNSIGNED_SHORT_5_6_5; + break; + + default: + LV_LOG_WARN("Unsupported color format: %d", draw_buf->header.cf); + LV_PROFILER_DRAW_END; + return; + } + + for(int32_t y = 0; y < h; y++) { + /* Reverse Y coordinate */ + void * row = lv_draw_buf_goto_xy(draw_buf, 0, h - 1 - y); + LV_PROFILER_DRAW_BEGIN_TAG("glReadPixels"); + glReadPixels(0, y, w, 1, format, type, row); + LV_PROFILER_DRAW_END_TAG("glReadPixels"); + + if(draw_buf->header.cf == LV_COLOR_FORMAT_RGB888) { + /* Swizzle RGB -> BGR */ + lv_color_t * px = row; + for(int32_t x = 0; x < w; x++) { + uint8_t r = px->blue; + px->blue = px->red; + px->red = r; + px++; + } + } + } + + /* Bind back to default framebuffer */ + nvgluBindFramebuffer(NULL); + + /* Mark draw_buf as modified */ + lv_draw_buf_flush_cache(draw_buf, NULL); + + LV_PROFILER_DRAW_END; +} + +static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)draw_unit; + + lv_draw_task_t * t = lv_draw_get_available_task(layer, NULL, NANOVG_DRAW_UNIT_ID); + if(!t || t->preferred_draw_unit_id != NANOVG_DRAW_UNIT_ID) { + lv_nanovg_end_frame(u); + return LV_DRAW_UNIT_IDLE; + } + + if(u->current_layer != layer) { + on_layer_changed(layer); + u->current_layer = layer; + } + + if(!u->is_started) { + const int32_t buf_w = lv_area_get_width(&layer->buf_area); + const int32_t buf_h = lv_area_get_height(&layer->buf_area); + + glViewport(0, 0, buf_w, buf_h); + LV_PROFILER_DRAW_BEGIN_TAG("nvgBeginFrame"); + nvgBeginFrame(u->vg, buf_w, buf_h, 1.0f); + LV_PROFILER_DRAW_END_TAG("nvgBeginFrame"); + u->is_started = true; + } + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + + draw_execute(u, t); + + t->state = LV_DRAW_TASK_STATE_FINISHED; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + + return 1; +} + +static int32_t draw_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + LV_UNUSED(draw_unit); + + switch(task->type) { + case LV_DRAW_TASK_TYPE_FILL: + case LV_DRAW_TASK_TYPE_BORDER: + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + case LV_DRAW_TASK_TYPE_LETTER: + case LV_DRAW_TASK_TYPE_LABEL: + case LV_DRAW_TASK_TYPE_IMAGE: + case LV_DRAW_TASK_TYPE_LAYER: + case LV_DRAW_TASK_TYPE_LINE: + case LV_DRAW_TASK_TYPE_ARC: + case LV_DRAW_TASK_TYPE_TRIANGLE: + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: +#if LV_USE_VECTOR_GRAPHIC + case LV_DRAW_TASK_TYPE_VECTOR: +#endif +#if LV_USE_3DTEXTURE + case LV_DRAW_TASK_TYPE_3D: +#endif + break; + + default: + /*The draw unit is not able to draw this task. */ + return 0; + } + + if(task->preference_score > 80) { + /* The draw unit is able to draw this task. */ + task->preference_score = 80; + task->preferred_draw_unit_id = NANOVG_DRAW_UNIT_ID; + } + + return 1; +} + +static int32_t draw_delete(lv_draw_unit_t * draw_unit) +{ + lv_draw_nanovg_unit_t * unit = (lv_draw_nanovg_unit_t *)draw_unit; + lv_draw_nanovg_label_deinit(unit); + lv_nanovg_fbo_cache_deinit(unit); + lv_nanovg_image_cache_deinit(unit); + lv_nanovg_utils_deinit(unit); + NVG_CTX_DELETE(unit->vg); + unit->vg = NULL; + return 0; +} + +static void draw_event_cb(lv_event_t * e) +{ + lv_draw_nanovg_unit_t * u = lv_event_get_current_target(e); + lv_layer_t * layer = lv_event_get_param(e); + + switch(lv_event_get_code(e)) { + case LV_EVENT_CANCEL: + LV_PROFILER_DRAW_BEGIN_TAG("nvgCancelFrame"); + nvgCancelFrame(u->vg); + LV_PROFILER_DRAW_END_TAG("nvgCancelFrame"); + lv_nanovg_clean_up(u); + break; + case LV_EVENT_CHILD_CREATED: { + /* The internal rendering uses RGBA format, which is switched to LVGL BGRA format during readback. */ + lv_cache_entry_t * entry = lv_nanovg_fbo_cache_get(u, lv_area_get_width(&layer->buf_area), + lv_area_get_height(&layer->buf_area), 0, NVG_TEXTURE_RGBA); + layer->user_data = entry; + } + break; + case LV_EVENT_CHILD_DELETED: { + lv_cache_entry_t * entry = layer->user_data; + if(entry) { + lv_nanovg_fbo_cache_release(u, entry); + layer->user_data = NULL; + } + + /** + * Clear current_layer if it's being deleted, so next dispatch + * will properly call on_layer_changed even if layer address is reused + */ + if(u->current_layer == layer) { + u->current_layer = NULL; + } + } + break; + case LV_EVENT_SCREEN_LOAD_START: + on_layer_readback(u, layer); + break; + case LV_EVENT_INVALIDATE_AREA: + lv_nanovg_image_cache_drop(u, lv_event_get_param(e)); + break; + default: + break; + } +} + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg.h b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg.h new file mode 100644 index 0000000..7b1205a --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg.h @@ -0,0 +1,48 @@ +/** + * @file lv_draw_nanovg.h + * + */ + +#ifndef LV_DRAW_NANOVG_H +#define LV_DRAW_NANOVG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../misc/lv_types.h" + +#if LV_USE_DRAW_NANOVG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize NanoVG rendering + */ +void lv_draw_nanovg_init(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_NANOVG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_NANOVG_H*/ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_3d.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_3d.c new file mode 100644 index 0000000..96be734 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_3d.c @@ -0,0 +1,96 @@ +/** + * @file lv_draw_nanovg_3d.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG && LV_USE_3DTEXTURE + +#include "../../draw/lv_draw_3d.h" +#include "../../drivers/opengles/lv_opengles_driver.h" +#include "../../drivers/opengles/lv_opengles_private.h" +#include "lv_nanovg_utils.h" +#include "lv_nanovg_fbo_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nanovg_3d(lv_draw_task_t * t, const lv_draw_3d_dsc_t * dsc, const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + /* End NanoVG frame temporarily to allow direct OpenGL rendering */ + lv_nanovg_end_frame(u); + + lv_layer_t * layer = t->target_layer; + + /* Get target layer info */ + int32_t layer_w = lv_area_get_width(&layer->buf_area); + int32_t layer_h = lv_area_get_height(&layer->buf_area); + + /* Calculate destination area relative to layer */ + lv_area_t dest_area = *coords; + lv_area_move(&dest_area, -layer->buf_area.x1, -layer->buf_area.y1); + + /* Calculate clip area relative to layer */ + lv_area_t clip_area = t->clip_area; + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + /* Reinitialize OpenGL ES driver state after NanoVG modified it */ + lv_opengles_reinit_state(); + + /* Use LVGL's OpenGL ES rendering infrastructure */ + lv_opengles_viewport(0, 0, layer_w, layer_h); + + lv_opengles_render_params_t params; + lv_opengles_render_params_init(¶ms); + params.texture = dsc->tex_id; + params.texture_area = &dest_area; + params.opa = dsc->opa; + params.disp_w = layer_w; + params.disp_h = layer_h; + params.texture_clip_area = &clip_area; + params.h_flip = dsc->h_flip; + params.v_flip = dsc->v_flip; + params.rb_swap = true; +#if LV_DRAW_TRANSFORM_USE_MATRIX + params.matrix = &layer->matrix; +#endif + lv_opengles_render(¶ms); + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /* LV_USE_DRAW_NANOVG && LV_USE_3DTEXTURE */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_arc.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_arc.c new file mode 100644 index 0000000..91ccfcc --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_arc.c @@ -0,0 +1,177 @@ +/** + * @file lv_draw_nanovg_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_nanovg_math.h" +#include "lv_nanovg_utils.h" +#include "lv_nanovg_image_cache.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_nanovg_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, coords, &t->clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + float start_angle = dsc->start_angle; + float end_angle = dsc->end_angle; + float sweep_angle = end_angle - start_angle; + + while(sweep_angle < 0) { + sweep_angle += 360; + } + + while(sweep_angle > 360) { + sweep_angle -= 360; + } + + /*If the angles are the same then there is nothing to draw*/ + if(nvg_math_is_zero(sweep_angle)) { + LV_PROFILER_DRAW_END; + return; + } + + nvgBeginPath(u->vg); + + float radius_out = dsc->radius; + float radius_in = dsc->radius - dsc->width; + float cx = dsc->center.x; + float cy = dsc->center.y; + + enum NVGwinding winding = NVG_CCW; + + if(nvg_math_is_equal(sweep_angle, 360)) { + nvgCircle(u->vg, cx, cy, radius_out); + + /* radius_in <= 0, normal fill circle */ + if(radius_in > 0) { + nvgCircle(u->vg, cx, cy, radius_in); + } + winding = NVG_CW; + } + else { + float start_angle_rad = NVG_MATH_RADIANS(start_angle); + float end_angle_rad = NVG_MATH_RADIANS(end_angle); + + if(radius_in > 0) { + /* radius_out start point */ + float start_x = radius_out * NVG_MATH_COSF(start_angle_rad) + cx; + float start_y = radius_out * NVG_MATH_SINF(start_angle_rad) + cy; + + /* radius_in start point */ + float end_x = radius_in * NVG_MATH_COSF(end_angle_rad) + cx; + float end_y = radius_in * NVG_MATH_SINF(end_angle_rad) + cy; + + nvgMoveTo(u->vg, start_x, start_y); + + /* radius_out arc */ + lv_nanovg_path_append_arc(u->vg, + cx, cy, + radius_out, + start_angle, + sweep_angle, + false); + + /* line to radius_in */ + nvgLineTo(u->vg, end_x, end_y); + + /* radius_in arc */ + lv_nanovg_path_append_arc(u->vg, + cx, cy, + radius_in, + end_angle, + -sweep_angle, + false); + + /* close arc */ + nvgClosePath(u->vg); + } + else { + /* draw a normal arc pie shape */ + lv_nanovg_path_append_arc(u->vg, cx, cy, radius_out, start_angle, sweep_angle, true); + } + + /* draw round */ + if(dsc->rounded && dsc->width > 0) { + float round_radius = radius_out > dsc->width ? dsc->width / 2.0f : radius_out / 2.0f; + float round_center = radius_out - round_radius; + float rcx1 = cx + round_center * NVG_MATH_COSF(end_angle_rad); + float rcy1 = cy + round_center * NVG_MATH_SINF(end_angle_rad); + nvgCircle(u->vg, rcx1, rcy1, round_radius); + + float rcx2 = cx + round_center * NVG_MATH_COSF(start_angle_rad); + float rcy2 = cy + round_center * NVG_MATH_SINF(start_angle_rad); + nvgCircle(u->vg, rcx2, rcy2, round_radius); + } + } + + if(dsc->img_src) { + lv_image_header_t header; + int image_handle = lv_nanovg_image_cache_get_handle(u, dsc->img_src, lv_color32_make(0, 0, 0, 0), 0, &header); + if(image_handle < 0) { + LV_PROFILER_DRAW_END; + return; + } + + /* move image to center */ + float img_half_w = header.w / 2.0f; + float img_half_h = header.h / 2.0f; + + NVGpaint paint = nvgImagePattern(u->vg, + cx - img_half_w, cy - img_half_h, + header.w, header.h, 0, + image_handle, + dsc->opa / (float)LV_OPA_COVER); + nvgFillPaint(u->vg, paint); + nvgFill(u->vg); + } + else { + lv_nanovg_fill(u->vg, winding, NVG_SOURCE_OVER, lv_nanovg_color_convert(dsc->color, dsc->opa)); + } + + LV_PROFILER_DRAW_END; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_border.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_border.c new file mode 100644 index 0000000..75c2279 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_border.c @@ -0,0 +1,383 @@ +/** + * @file lv_draw_nanovg_border.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_nanovg_utils.h" +#include "lv_nanovg_math.h" + +/********************* +* DEFINES +*********************/ + +#define HAS_BORDER_SIDE(dsc_side, side) (((dsc_side) & (side)) == (side)) + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +static enum NVGwinding path_append_inner_rect(NVGcontext * ctx, + const lv_draw_border_dsc_t * dsc, + int32_t x, int32_t y, int32_t w, int32_t h, + float r); + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_nanovg_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, coords, &t->clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + float r_out = dsc->radius; + if(dsc->radius) { + float r_short = LV_MIN(w, h) / 2.0f; + r_out = LV_MIN(r_out, r_short); + } + + nvgBeginPath(u->vg); + + /* outer rect */ + lv_nanovg_path_append_rect(u->vg, + coords->x1, coords->y1, + w, h, + r_out); + + /* inner rect */ + enum NVGwinding winding = path_append_inner_rect(u->vg, dsc, coords->x1, coords->y1, w, h, r_out); + + lv_nanovg_fill( + u->vg, + winding, + NVG_SOURCE_OVER, + lv_nanovg_color_convert(dsc->color, dsc->opa)); + + LV_PROFILER_DRAW_END; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +static enum NVGwinding path_append_inner_rect(NVGcontext * ctx, + const lv_draw_border_dsc_t * dsc, + int32_t x, int32_t y, int32_t w, int32_t h, + float r) +{ + LV_PROFILER_DRAW_BEGIN; + + const float half_w = w / 2.0f; + const float half_h = h / 2.0f; + const int32_t border_w = dsc->width; + const float border_w_max = LV_MIN(half_w, half_h); + + /* normal fill, no inner rect */ + if(border_w >= border_w_max) { + LV_PROFILER_DRAW_END; + return NVG_CCW; + } + + const float r_in = r - border_w; + + /* full border, simple rect */ + if(dsc->side == LV_BORDER_SIDE_FULL) { + lv_nanovg_path_append_rect(ctx, + x + border_w, y + border_w, + w - border_w * 2, h - border_w * 2, + r_in < 0 ? 0 : r_in); + LV_PROFILER_DRAW_END; + return NVG_CW; + } + + /* reset outer rect path */ + nvgBeginPath(ctx); + + /* no-radius case */ + if(dsc->radius <= 0) { + if(dsc->side & LV_BORDER_SIDE_TOP) { + lv_nanovg_path_append_rect(ctx, + x, + y, + w, + border_w, + 0); + } + if(dsc->side & LV_BORDER_SIDE_LEFT) { + lv_nanovg_path_append_rect(ctx, + x, + y, + border_w, + h, + 0); + } + if(dsc->side & LV_BORDER_SIDE_BOTTOM) { + lv_nanovg_path_append_rect(ctx, + x, + y + h - border_w, + w, + border_w, + 0); + } + if(dsc->side & LV_BORDER_SIDE_RIGHT) { + lv_nanovg_path_append_rect(ctx, + x + w - border_w, + y, + border_w, + h, + 0); + } + + LV_PROFILER_DRAW_END; + return NVG_CCW; + } + + /* coordinate reference map: https://github.com/lvgl/lvgl/pull/6796 */ + const float c1_x = x + r; + const float c1_y = y + r; + const float c2_x = x + w - r; + const float c2_y = c1_y; + const float c3_x = c2_x; + const float c3_y = y + h - r; + const float c4_x = c1_x; + const float c4_y = c3_y; + + /* When border_w > r, No need to calculate the intersection of the arc and the line */ + if(r_in <= 0) { + const float p1_x = x; + const float p1_y = y + border_w; + const float p2_x = x; + const float p2_y = y + r; + const float p3_x = x + r; + const float p3_y = y; + const float p4_x = x + border_w; + const float p4_y = y; + + const float p5_x = x + w - border_w; + const float p5_y = y; + const float p6_x = x + w - r; + const float p6_y = y; + const float p7_x = x + w; + const float p7_y = y + r; + const float p8_x = x + w; + const float p8_y = y + border_w; + + const float p9_x = x + w; + const float p9_y = y + h - border_w; + const float p10_x = x + w; + const float p10_y = y + h - r; + const float p11_x = x + w - r; + const float p11_y = y + h; + const float p12_x = x + w - border_w; + const float p12_y = y + h; + + const float p13_x = x + border_w; + const float p13_y = y + h; + const float p14_x = x + r; + const float p14_y = y + h; + const float p15_x = x; + const float p15_y = y + h - r; + const float p16_x = x; + const float p16_y = y + h - border_w; + + if(dsc->side & LV_BORDER_SIDE_BOTTOM) { + nvgMoveTo(ctx, p16_x, p16_y); + nvgLineTo(ctx, p9_x, p9_y); + nvgLineTo(ctx, p10_x, p10_y); + lv_nanovg_path_append_arc_right_angle(ctx, p10_x, p10_y, c3_x, c3_y, p11_x, p11_y); + nvgLineTo(ctx, p14_x, p14_y); + lv_nanovg_path_append_arc_right_angle(ctx, p14_x, p14_y, c4_x, c4_y, p15_x, p15_y); + nvgClosePath(ctx); + } + + if(dsc->side & LV_BORDER_SIDE_TOP) { + nvgMoveTo(ctx, p1_x, p1_y); + nvgLineTo(ctx, p2_x, p2_y); + lv_nanovg_path_append_arc_right_angle(ctx, p2_x, p2_y, c1_x, c1_y, p3_x, p3_y); + nvgLineTo(ctx, p6_x, p6_y); + lv_nanovg_path_append_arc_right_angle(ctx, p6_x, p6_y, c2_x, c2_y, p7_x, p7_y); + nvgLineTo(ctx, p8_x, p8_y); + nvgClosePath(ctx); + } + + if(dsc->side & LV_BORDER_SIDE_LEFT) { + nvgMoveTo(ctx, p4_x, p4_y); + nvgLineTo(ctx, p13_x, p13_y); + nvgLineTo(ctx, p14_x, p14_y); + lv_nanovg_path_append_arc_right_angle(ctx, p14_x, p14_y, c4_x, c4_y, p15_x, p15_y); + nvgLineTo(ctx, p2_x, p2_y); + lv_nanovg_path_append_arc_right_angle(ctx, p2_x, p2_y, c1_x, c1_y, p3_x, p3_y); + nvgClosePath(ctx); + } + + if(dsc->side & LV_BORDER_SIDE_RIGHT) { + nvgMoveTo(ctx, p5_x, p5_y); + nvgLineTo(ctx, p6_x, p6_y); + lv_nanovg_path_append_arc_right_angle(ctx, p6_x, p6_y, c2_x, c2_y, p7_x, p7_y); + nvgLineTo(ctx, p10_x, p10_y); + lv_nanovg_path_append_arc_right_angle(ctx, p10_x, p10_y, c3_x, c3_y, p11_x, p11_y); + nvgLineTo(ctx, p12_x, p12_y); + nvgClosePath(ctx); + } + + LV_PROFILER_DRAW_END; + return NVG_CCW; + } + + /* When border_w < r, Calculate the intersection of an arc and a line */ + + /* r^2 - r_in^2 = offset^2 */ + const float offset = NVG_MATH_SQRTF((2 * r - border_w) * border_w); + const float sweep_alpha = NVG_MATH_DEGREES(NVG_MATH_ACOSF(r_in / r)); + const float sweep_beta = 90 - sweep_alpha; + + const float p1_x = x + border_w; + const float p1_y = y + r; + const float p2_x = x; + const float p2_y = y + r; + const float p3_x = x + border_w; + const float p3_y = y + r - offset; + const float p4_x = x + r - offset; + const float p4_y = y + border_w; + const float p5_x = x + r; + const float p5_y = y; + const float p6_x = x + r; + const float p6_y = y + border_w; + + const float p7_x = x + w - r; + const float p7_y = y + border_w; + const float p8_x = x + w - r; + const float p8_y = y; + const float p10_x = x + w - border_w; + const float p10_y = y + r - offset; + const float p11_x = x + w; + const float p11_y = y + r; + const float p12_x = x + w - border_w; + const float p12_y = y + r; + + const float p13_x = x + w - border_w; + const float p13_y = y + h - r; + const float p14_x = x + w; + const float p14_y = y + h - r; + const float p16_x = x + w - r + offset; + const float p16_y = y + h - border_w; + const float p17_x = x + w - r; + const float p17_y = y + h; + const float p18_x = x + w - r; + const float p18_y = y + h - border_w; + + const float p19_x = x + r; + const float p19_y = y + h - border_w; + const float p20_x = x + r; + const float p20_y = y + h; + const float p21_x = x + r - offset; + const float p21_y = y + h - border_w; + const float p22_x = x + border_w; + const float p22_y = y + h - r + offset; + const float p23_x = x; + const float p23_y = y + h - r; + const float p24_x = x + border_w; + const float p24_y = y + h - r; + + if(dsc->side & LV_BORDER_SIDE_BOTTOM) { + nvgMoveTo(ctx, p21_x, p21_y); + nvgLineTo(ctx, p16_x, p16_y); + lv_nanovg_path_append_arc(ctx, c3_x, c3_y, r, sweep_beta, sweep_alpha, false); + nvgLineTo(ctx, p20_x, p20_y); + lv_nanovg_path_append_arc(ctx, c4_x, c4_y, r, 90, sweep_alpha, false); + nvgClosePath(ctx); + } + + if(dsc->side & LV_BORDER_SIDE_TOP) { + nvgMoveTo(ctx, p4_x, p4_y); + lv_nanovg_path_append_arc(ctx, c1_x, c1_y, r, 270 - sweep_alpha, sweep_alpha, false); + nvgLineTo(ctx, p8_x, p8_y); + lv_nanovg_path_append_arc(ctx, c2_x, c2_y, r, 270, sweep_alpha, false); + nvgClosePath(ctx); + } + + if(dsc->side & LV_BORDER_SIDE_LEFT) { + nvgMoveTo(ctx, p3_x, p3_y); + nvgLineTo(ctx, p22_x, p22_y); + lv_nanovg_path_append_arc(ctx, c4_x, c4_y, r, 90 + sweep_beta, sweep_alpha, false); + nvgLineTo(ctx, p2_x, p2_y); + lv_nanovg_path_append_arc(ctx, c1_x, c1_y, r, 180, sweep_alpha, false); + nvgClosePath(ctx); + } + + if(dsc->side & LV_BORDER_SIDE_RIGHT) { + nvgMoveTo(ctx, p10_x, p10_y); + lv_nanovg_path_append_arc(ctx, c2_x, c2_y, r, 270 + sweep_beta, sweep_alpha, false); + nvgLineTo(ctx, p14_x, p14_y); + lv_nanovg_path_append_arc(ctx, c3_x, c3_y, r, 0, sweep_alpha, false); + nvgClosePath(ctx); + } + + /* Draw the rounded corners adjacent to the border */ + + if(HAS_BORDER_SIDE(dsc->side, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_LEFT)) { + nvgMoveTo(ctx, p2_x, p2_y); + lv_nanovg_path_append_arc_right_angle(ctx, p2_x, p2_y, c1_x, c1_y, p5_x, p5_y); + nvgLineTo(ctx, p6_x, p6_y); + lv_nanovg_path_append_arc_right_angle(ctx, p6_x, p6_y, c1_x, c1_y, p1_x, p1_y); + nvgClosePath(ctx); + } + + if(HAS_BORDER_SIDE(dsc->side, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_RIGHT)) { + nvgMoveTo(ctx, p8_x, p8_y); + lv_nanovg_path_append_arc_right_angle(ctx, p8_x, p8_y, c2_x, c2_y, p11_x, p11_y); + nvgLineTo(ctx, p12_x, p12_y); + lv_nanovg_path_append_arc_right_angle(ctx, p12_x, p12_y, c2_x, c2_y, p7_x, p7_y); + nvgClosePath(ctx); + } + + if(HAS_BORDER_SIDE(dsc->side, LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_LEFT)) { + nvgMoveTo(ctx, p20_x, p20_y); + lv_nanovg_path_append_arc_right_angle(ctx, p20_x, p20_y, c4_x, c4_y, p23_x, p23_y); + nvgLineTo(ctx, p24_x, p24_y); + lv_nanovg_path_append_arc_right_angle(ctx, p24_x, p24_y, c4_x, c4_y, p19_x, p19_y); + nvgClosePath(ctx); + } + + if(HAS_BORDER_SIDE(dsc->side, LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_RIGHT)) { + nvgMoveTo(ctx, p14_x, p14_y); + lv_nanovg_path_append_arc_right_angle(ctx, p14_x, p14_y, c3_x, c3_y, p17_x, p17_y); + nvgLineTo(ctx, p18_x, p18_y); + lv_nanovg_path_append_arc_right_angle(ctx, p18_x, p18_y, c3_x, c3_y, p13_x, p13_y); + nvgClosePath(ctx); + } + + LV_PROFILER_DRAW_END; + return NVG_CCW; +} + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_box_shadow.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_box_shadow.c new file mode 100644 index 0000000..3d10eb5 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_box_shadow.c @@ -0,0 +1,92 @@ +/** + * @file lv_draw_nanovg_box_shadow.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_nanovg_utils.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_nanovg_box_shadow(lv_draw_task_t * t, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + + /*Calculate the rectangle which is blurred to get the shadow in `shadow_area`*/ + lv_area_t core_area; + core_area.x1 = coords->x1 + dsc->ofs_x - dsc->spread; + core_area.x2 = coords->x2 + dsc->ofs_x + dsc->spread; + core_area.y1 = coords->y1 + dsc->ofs_y - dsc->spread; + core_area.y2 = coords->y2 + dsc->ofs_y + dsc->spread; + + /*Calculate the bounding box of the shadow*/ + lv_area_t shadow_area; + shadow_area.x1 = core_area.x1 - dsc->width / 2 - 1; + shadow_area.x2 = core_area.x2 + dsc->width / 2 + 1; + shadow_area.y1 = core_area.y1 - dsc->width / 2 - 1; + shadow_area.y2 = core_area.y2 + dsc->width / 2 + 1; + + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `shadow_area`*/ + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, &shadow_area, &t->clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + const NVGcolor icol = lv_nanovg_color_convert(dsc->color, dsc->opa); + const NVGcolor ocol = lv_nanovg_color_convert(lv_color_black(), 0); + + const int32_t w = lv_area_get_width(&shadow_area); + const int32_t h = lv_area_get_height(&shadow_area); + + NVGpaint paint = nvgBoxGradient( + u->vg, + shadow_area.x1, shadow_area.y1, + w, h, + dsc->radius, dsc->width, icol, ocol); + + nvgBeginPath(u->vg); + lv_nanovg_path_append_rect(u->vg, shadow_area.x1, shadow_area.y1, w, h, dsc->radius); + nvgFillPaint(u->vg, paint); + nvgFill(u->vg); + + LV_PROFILER_DRAW_END; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_fill.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_fill.c new file mode 100644 index 0000000..fe4482d --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_fill.c @@ -0,0 +1,77 @@ +/** + * @file lv_draw_nanovg_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_nanovg_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nanovg_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, coords, &t->clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + nvgBeginPath(u->vg); + + lv_nanovg_path_append_rect(u->vg, + coords->x1, coords->y1, + lv_area_get_width(coords), lv_area_get_height(coords), + dsc->radius); + + if(dsc->grad.dir != LV_GRAD_DIR_NONE) { +#if LV_USE_VECTOR_GRAPHIC + lv_nanovg_draw_grad_helper(u->vg, coords, &dsc->grad, NVG_CCW, NVG_SOURCE_OVER); +#else + LV_LOG_WARN("Gradient fill is not supported without VECTOR_GRAPHIC"); +#endif + } + else { + lv_nanovg_fill(u->vg, NVG_CCW, NVG_SOURCE_OVER, lv_nanovg_color_convert(dsc->color, dsc->opa)); + } + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_NANOVG*/ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_grad.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_grad.c new file mode 100644 index 0000000..38458b9 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_grad.c @@ -0,0 +1,188 @@ +/** + * @file lv_draw_nanovg_grad.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG && LV_USE_VECTOR_GRAPHIC + +#include "../../draw/lv_draw_vector_private.h" + +#include "lv_nanovg_utils.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +bool lv_nanovg_grad_to_paint(NVGcontext * ctx, const lv_vector_gradient_t * grad, NVGpaint * paint) +{ + LV_PROFILER_DRAW_BEGIN; + + LV_ASSERT_NULL(grad); + LV_ASSERT_NULL(paint); + + if(grad->stops_count < 2) { + LV_LOG_WARN("stops_count(%d) should be 2 for gradient", grad->stops_count); + LV_PROFILER_DRAW_END; + return false; + } + + const NVGcolor icol = lv_nanovg_color_convert(grad->stops[0].color, grad->stops[0].opa); + const NVGcolor ocol = lv_nanovg_color_convert(grad->stops[1].color, grad->stops[1].opa); + + switch(grad->style) { + case LV_VECTOR_GRADIENT_STYLE_LINEAR: + *paint = nvgLinearGradient(ctx, grad->x1, grad->y1, grad->x2, grad->y2, icol, ocol); + break; + + case LV_VECTOR_GRADIENT_STYLE_RADIAL: { + const float inr = grad->cr * grad->stops[0].frac / 255; + const float outr = grad->cr * grad->stops[1].frac / 255; + *paint = nvgRadialGradient(ctx, grad->cx, grad->cy, inr, outr, icol, ocol); + } + break; + + default: + LV_LOG_WARN("Unsupported gradient style: %d", grad->style); + LV_PROFILER_DRAW_END; + return false; + } + + LV_PROFILER_DRAW_END; + return true; +} + +void lv_nanovg_draw_grad( + NVGcontext * ctx, + const lv_vector_gradient_t * grad, + enum NVGwinding winding, + enum NVGcompositeOperation composite_operation) +{ + LV_PROFILER_DRAW_BEGIN; + + NVGpaint paint; + if(!lv_nanovg_grad_to_paint(ctx, grad, &paint)) { + LV_PROFILER_DRAW_END; + return; + } + + nvgPathWinding(ctx, winding); + nvgGlobalCompositeOperation(ctx, composite_operation); + nvgFillPaint(ctx, paint); + nvgFill(ctx); + + LV_PROFILER_DRAW_END; +} + +void lv_nanovg_draw_grad_helper( + NVGcontext * ctx, + const lv_area_t * area, + const lv_grad_dsc_t * grad_dsc, + enum NVGwinding winding, + enum NVGcompositeOperation composite_operation) +{ + LV_ASSERT_NULL(ctx); + LV_ASSERT_NULL(area); + LV_ASSERT_NULL(grad_dsc); + + lv_vector_gradient_t grad; + lv_memzero(&grad, sizeof(grad)); + + grad.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; + grad.stops_count = grad_dsc->stops_count; + lv_memcpy(grad.stops, grad_dsc->stops, sizeof(lv_grad_stop_t) * grad_dsc->stops_count); + + /*convert to spread mode*/ + switch(grad_dsc->extend) { + case LV_GRAD_EXTEND_PAD: + grad.spread = LV_VECTOR_GRADIENT_SPREAD_PAD; + break; + case LV_GRAD_EXTEND_REPEAT: + grad.spread = LV_VECTOR_GRADIENT_SPREAD_REPEAT; + break; + case LV_GRAD_EXTEND_REFLECT: + grad.spread = LV_VECTOR_GRADIENT_SPREAD_REFLECT; + break; + default: + LV_LOG_WARN("Unsupported gradient extend mode: %d", grad_dsc->extend); + grad.spread = LV_VECTOR_GRADIENT_SPREAD_PAD; + break; + } + + switch(grad_dsc->dir) { + case LV_GRAD_DIR_VER: + grad.x1 = area->x1; + grad.y1 = area->y1; + grad.x2 = area->x1; + grad.y2 = area->y2 + 1; + break; + + case LV_GRAD_DIR_HOR: + grad.x1 = area->x1; + grad.y1 = area->y1; + grad.x2 = area->x2 + 1; + grad.y2 = area->y1; + break; + + case LV_GRAD_DIR_LINEAR: { + int32_t w = lv_area_get_width(area); + int32_t h = lv_area_get_height(area); + + grad.x1 = lv_pct_to_px(grad_dsc->params.linear.start.x, w) + area->x1; + grad.y1 = lv_pct_to_px(grad_dsc->params.linear.start.y, h) + area->y1; + grad.x2 = lv_pct_to_px(grad_dsc->params.linear.end.x, w) + area->x1; + grad.y2 = lv_pct_to_px(grad_dsc->params.linear.end.y, h) + area->y1; + } + break; + + case LV_GRAD_DIR_RADIAL: { + grad.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; + int32_t w = lv_area_get_width(area); + int32_t h = lv_area_get_height(area); + + grad.cx = lv_pct_to_px(grad_dsc->params.radial.focal.x, w) + area->x1; + grad.cy = lv_pct_to_px(grad_dsc->params.radial.focal.y, h) + area->y1; + int32_t end_extent_x = lv_pct_to_px(grad_dsc->params.radial.end_extent.x, w) + area->x1; + int32_t end_extent_y = lv_pct_to_px(grad_dsc->params.radial.end_extent.y, h) + area->y1; + grad.cr = LV_MAX(end_extent_x - grad.cx, end_extent_y - grad.cy); + } + break; + + default: + LV_LOG_WARN("Unsupported gradient direction: %d", grad_dsc->dir); + return; + } + + lv_nanovg_draw_grad(ctx, &grad, winding, composite_operation); +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_image.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_image.c new file mode 100644 index 0000000..bf8b935 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_image.c @@ -0,0 +1,229 @@ +/** + * @file lv_draw_nanovg_image.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_nanovg_utils.h" +#include "lv_nanovg_math.h" +#include "lv_nanovg_image_cache.h" +#include "../lv_image_decoder_private.h" +#include "../lv_draw_image_private.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +static void image_dsc_to_matrix(lv_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc); +static bool is_power_of_2(uint32_t num); +static void fill_repeat_tile_image( + lv_draw_nanovg_unit_t * u, + const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords, + lv_area_t tile_area, + const uint32_t img_w, + const uint32_t img_h, + const int image_handle); + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_nanovg_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords, + int image_handle) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, &t->_real_area, &t->clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + /* Use coords as the fallback image width and height */ + const uint32_t img_w = dsc->header.w ? dsc->header.w : lv_area_get_width(coords); + const uint32_t img_h = dsc->header.h ? dsc->header.h : lv_area_get_height(coords); + bool use_repeat_tile = false; + + if(image_handle < 0) { + int image_flags = 0; + + if(dsc->tile) { +#ifdef NANOVG_GLES2_IMPLEMENTATION + /* GLES2 does not support sampling non-power-of-2 textures in repeating mode. */ + if(!is_power_of_2(img_w) || !is_power_of_2(img_h)) { + LV_LOG_TRACE("Unsupported image size %" LV_PRIu32 " x %" LV_PRIu32 ". Skipping for repeat mode.", img_w, img_h); + use_repeat_tile = true; + } + else +#endif + { + LV_UNUSED(is_power_of_2); + image_flags |= NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY; + } + } + + image_handle = lv_nanovg_image_cache_get_handle(u, dsc->src, lv_color_to_32(dsc->recolor, dsc->opa), image_flags, NULL); + } + + if(image_handle < 0) { + LV_PROFILER_DRAW_END; + return; + } + + /* original image matrix */ + lv_matrix_t image_matrix; + lv_matrix_identity(&image_matrix); + image_dsc_to_matrix(&image_matrix, coords->x1, coords->y1, dsc); + lv_nanovg_transform(u->vg, &image_matrix); + + int32_t img_ofs_x = 0; + int32_t img_ofs_y = 0; + int32_t rect_w = img_w; + int32_t rect_h = img_h; + + if(dsc->tile) { + lv_area_t tile_area; + if(lv_area_get_width(&dsc->image_area) >= 0) { + tile_area = dsc->image_area; + } + else { + tile_area = *coords; + } + + if(use_repeat_tile) { + /* When alignment requirements are not met, simulate tiles by repeating the texture. */ + fill_repeat_tile_image(u, dsc, coords, tile_area, img_w, img_h, image_handle); + LV_PROFILER_DRAW_END; + return; + } + + img_ofs_x = tile_area.x1 - coords->x1; + img_ofs_y = tile_area.y1 - coords->y1; + rect_w = lv_area_get_width(coords); + rect_h = lv_area_get_height(coords); + } + + nvgBeginPath(u->vg); + lv_nanovg_path_append_rect(u->vg, 0, 0, rect_w, rect_h, dsc->clip_radius); + + NVGpaint paint = nvgImagePattern(u->vg, img_ofs_x, img_ofs_y, img_w, img_h, 0, image_handle, + dsc->opa / (float)LV_OPA_COVER); + nvgFillPaint(u->vg, paint); + nvgFill(u->vg); + + LV_PROFILER_DRAW_END; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +static void image_dsc_to_matrix(lv_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc) +{ + LV_ASSERT_NULL(matrix); + LV_ASSERT_NULL(dsc); + + int32_t rotation = dsc->rotation; + int32_t scale_x = dsc->scale_x; + int32_t scale_y = dsc->scale_y; + + lv_matrix_translate(matrix, x, y); + + if(rotation != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + lv_point_t pivot = dsc->pivot; + lv_matrix_translate(matrix, pivot.x, pivot.y); + + if(rotation != 0) { + lv_matrix_rotate(matrix, rotation * 0.1f); + } + + if(scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + lv_matrix_scale( + matrix, + (float)scale_x / LV_SCALE_NONE, + (float)scale_y / LV_SCALE_NONE); + } + + lv_matrix_translate(matrix, -pivot.x, -pivot.y); + } +} + +static bool is_power_of_2(uint32_t num) +{ + uint32_t n = num > 0 ? num - 1 : 0; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; + return n == num; +} + +static void fill_repeat_tile_image( + lv_draw_nanovg_unit_t * u, + const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords, + lv_area_t tile_area, + const uint32_t img_w, + const uint32_t img_h, + const int image_handle) +{ + if(dsc->clip_radius) { + LV_LOG_WARN("Unsupported clip radius for repeat mode."); + } + + const int32_t tile_x_start = tile_area.x1; + while(tile_area.y1 <= coords->y2) { + while(tile_area.x1 <= coords->x2) { + const int32_t img_ofs_x = tile_area.x1 - coords->x1; + const int32_t img_ofs_y = tile_area.y1 - coords->y1; + + lv_area_t clipped_img_area; + if(lv_area_intersect(&clipped_img_area, &tile_area, coords)) { + nvgBeginPath(u->vg); + lv_nanovg_path_append_rect(u->vg, img_ofs_x, img_ofs_y, img_w, img_h, 0); + NVGpaint paint = nvgImagePattern(u->vg, img_ofs_x, img_ofs_y, img_w, img_h, 0, image_handle, + dsc->opa / (float)LV_OPA_COVER); + nvgFillPaint(u->vg, paint); + nvgFill(u->vg); + } + + tile_area.x1 += img_w; + tile_area.x2 += img_w; + } + + tile_area.y1 += img_h; + tile_area.y2 += img_h; + tile_area.x1 = tile_x_start; + tile_area.x2 = tile_x_start + img_w - 1; + } +} + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_label.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_label.c new file mode 100644 index 0000000..f977ca0 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_label.c @@ -0,0 +1,367 @@ +/** + * @file lv_draw_nanovg_label.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_nanovg_utils.h" +#include "lv_nanovg_image_cache.h" +#include "../lv_draw_label_private.h" +#include "../lv_draw_image_private.h" +#include "../../misc/cache/lv_cache_entry_private.h" +#include "../../misc/lv_pending.h" +#include "../../libs/freetype/lv_freetype.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +typedef struct { + /* context */ + lv_draw_nanovg_unit_t * u; + + /* key */ + lv_font_glyph_dsc_t g_dsc; + + /* value */ + int image_handle; +} letter_item_t; + +/********************** +* STATIC PROTOTYPES +**********************/ + +static void draw_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +static void letter_cache_release_cb(void * entry, void * user_data); +static bool letter_create_cb(letter_item_t * item, void * user_data); +static void letter_free_cb(letter_item_t * item, void * user_data); +static lv_cache_compare_res_t letter_compare_cb(const letter_item_t * lhs, const letter_item_t * rhs); + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_nanovg_label_init(lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_ASSERT(u->letter_cache == NULL); + LV_ASSERT(u->letter_pending == NULL); + + const lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)letter_compare_cb, + .create_cb = (lv_cache_create_cb_t)letter_create_cb, + .free_cb = (lv_cache_free_cb_t)letter_free_cb, + }; + + u->letter_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(letter_item_t), LV_NANOVG_LETTER_CACHE_CNT, ops); + lv_cache_set_name(u->letter_cache, "NVG_LETTER"); + u->letter_pending = lv_pending_create(sizeof(lv_cache_entry_t *), 4); + lv_pending_set_free_cb(u->letter_pending, letter_cache_release_cb, u->letter_cache); +} + +void lv_draw_nanovg_label_deinit(lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_ASSERT(u->letter_cache); + LV_ASSERT(u->letter_pending); + + lv_pending_destroy(u->letter_pending); + u->letter_pending = NULL; + + lv_cache_destroy(u->letter_cache, NULL); + u->letter_cache = NULL; +} + +void lv_draw_nanovg_letter(lv_draw_task_t * t, const lv_draw_letter_dsc_t * dsc, const lv_area_t * coords) +{ + LV_ASSERT_NULL(t); + LV_ASSERT_NULL(dsc); + LV_ASSERT_NULL(coords); + + if(dsc->opa <= LV_OPA_MIN) + return; + + LV_PROFILER_DRAW_BEGIN; + + lv_draw_glyph_dsc_t glyph_dsc; + lv_draw_glyph_dsc_init(&glyph_dsc); + glyph_dsc.opa = dsc->opa; + glyph_dsc.bg_coords = NULL; + glyph_dsc.color = dsc->color; + glyph_dsc.rotation = dsc->rotation; + glyph_dsc.pivot = dsc->pivot; + + lv_draw_unit_draw_letter(t, &glyph_dsc, &(lv_point_t) { + .x = coords->x1, .y = coords->y1 + }, + dsc->font, dsc->unicode, draw_letter_cb); + + if(glyph_dsc._draw_buf) { + lv_draw_buf_destroy(glyph_dsc._draw_buf); + glyph_dsc._draw_buf = NULL; + } + + LV_PROFILER_DRAW_END; +} + +void lv_draw_nanovg_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_label_iterate_characters(t, dsc, coords, draw_letter_cb); + LV_PROFILER_DRAW_END; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +static bool draw_letter_clip_areas(lv_draw_task_t * t, const lv_draw_glyph_dsc_t * dsc, lv_area_t * letter_area, + lv_area_t * cliped_area) +{ + *letter_area = *dsc->letter_coords; + + if(dsc->rotation) { + const lv_point_t pivot = { + .x = dsc->pivot.x, + .y = dsc->g->box_h + dsc->g->ofs_y + }; + + lv_image_buf_get_transformed_area( + letter_area, + lv_area_get_width(dsc->letter_coords), + lv_area_get_height(dsc->letter_coords), + dsc->rotation, + LV_SCALE_NONE, + LV_SCALE_NONE, + &pivot); + lv_area_move(letter_area, dsc->letter_coords->x1, dsc->letter_coords->y1); + } + + if(!lv_area_intersect(cliped_area, &t->clip_area, letter_area)) { + return false; + } + + return true; +} + +static void draw_letter_bitmap(lv_draw_task_t * t, const lv_draw_glyph_dsc_t * dsc, int image_handle) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_area_t image_area; + lv_area_t clip_area; + if(!draw_letter_clip_areas(t, dsc, &image_area, &clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + if(!dsc->rotation) { + float x = dsc->letter_coords->x1; + float y = dsc->letter_coords->y1; + float w = lv_area_get_width(dsc->letter_coords); + float h = lv_area_get_height(dsc->letter_coords); + + NVGpaint paint = nvgImagePattern(u->vg, x, y, w, h, 0, image_handle, 1.0f); + paint.innerColor = paint.outerColor = nvgRGBA(dsc->color.red, dsc->color.green, dsc->color.blue, dsc->opa); + + nvgBeginPath(u->vg); + nvgRect(u->vg, x, y, w, h); + nvgFillPaint(u->vg, paint); + nvgFill(u->vg); + } + else { + /* TODO: draw rotated bitmap */ + } + + LV_PROFILER_DRAW_END; +} + +static inline int letter_get_image_handle(lv_draw_nanovg_unit_t * u, lv_font_glyph_dsc_t * g_dsc) +{ + LV_PROFILER_DRAW_BEGIN; + + letter_item_t search_key = { 0 }; + search_key.u = u; + search_key.g_dsc = *g_dsc; + search_key.g_dsc.entry = NULL; /* Exclude the cache entry from the key */ + + lv_cache_entry_t * cache_node_entry = lv_cache_acquire(u->letter_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + /* check if the cache is full */ + size_t free_size = lv_cache_get_free_size(u->letter_cache, NULL); + if(free_size == 0) { + LV_LOG_INFO("letter cache is full, release all pending cache entries"); + lv_nanovg_end_frame(u); + } + + cache_node_entry = lv_cache_acquire_or_create(u->letter_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + LV_LOG_ERROR("letter cache creating failed"); + LV_PROFILER_DRAW_END; + return -1; + } + } + + /* Add the new entry to the pending list */ + lv_pending_add(u->letter_pending, &cache_node_entry); + + letter_item_t * letter_item = lv_cache_entry_get_data(cache_node_entry); + + LV_PROFILER_DRAW_END; + return letter_item->image_handle; +} + +static void letter_cache_release_cb(void * entry, void * user_data) +{ + lv_cache_entry_t ** entry_p = entry; + lv_cache_t * cache = user_data; + lv_cache_release(cache, * entry_p, NULL); +} + +static bool letter_create_cb(letter_item_t * item, void * user_data) +{ + LV_PROFILER_DRAW_BEGIN; + LV_UNUSED(user_data); + lv_font_glyph_dsc_t * g_dsc = &item->g_dsc; + + const uint32_t w = g_dsc->box_w; + const uint32_t h = g_dsc->box_h; + + lv_draw_buf_t * image_buf = lv_nanovg_reshape_global_image(item->u, LV_COLOR_FORMAT_A8, w, h); + if(!image_buf) { + LV_PROFILER_DRAW_END; + return false; + } + + if(!lv_font_get_glyph_bitmap(g_dsc, image_buf)) { + LV_PROFILER_DRAW_END; + return false; + } + + LV_PROFILER_DRAW_BEGIN_TAG("nvgCreateImage"); + item->image_handle = nvgCreateImage(item->u->vg, w, h, 0, NVG_TEXTURE_ALPHA, lv_draw_buf_goto_xy(image_buf, 0, 0)); + LV_PROFILER_DRAW_END_TAG("nvgCreateImage"); + + LV_LOG_TRACE("image_handle: %d", item->image_handle); + LV_PROFILER_DRAW_END; + return true; +} + +static void letter_free_cb(letter_item_t * item, void * user_data) +{ + LV_UNUSED(user_data); + LV_PROFILER_DRAW_BEGIN; + LV_LOG_TRACE("image_handle: %d", item->image_handle); + nvgDeleteImage(item->u->vg, item->image_handle); + item->image_handle = -1; + LV_PROFILER_DRAW_END; +} + +static lv_cache_compare_res_t letter_compare_cb(const letter_item_t * lhs, const letter_item_t * rhs) +{ + int cmp_res = lv_memcmp(&lhs->g_dsc, &rhs->g_dsc, sizeof(lv_font_glyph_dsc_t)); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + + +static void draw_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + if(glyph_draw_dsc) { + switch(glyph_draw_dsc->format) { + case LV_FONT_GLYPH_FORMAT_A1: + case LV_FONT_GLYPH_FORMAT_A2: + case LV_FONT_GLYPH_FORMAT_A3: + case LV_FONT_GLYPH_FORMAT_A4: + case LV_FONT_GLYPH_FORMAT_A8: { + int image_handle = letter_get_image_handle(u, glyph_draw_dsc->g); + if(image_handle < 0) { + return; + } + + draw_letter_bitmap(t, glyph_draw_dsc, image_handle); + } + break; + +#if LV_USE_FREETYPE + case LV_FONT_GLYPH_FORMAT_VECTOR: { + if(lv_freetype_is_outline_font(glyph_draw_dsc->g->resolved_font)) { + if(!glyph_draw_dsc->glyph_data) { + return; + } + + /* TODO: draw_letter_outline(t, glyph_draw_dsc); */ + } + } + break; +#endif /* LV_USE_FREETYPE */ + + case LV_FONT_GLYPH_FORMAT_IMAGE: { + glyph_draw_dsc->glyph_data = lv_font_get_glyph_bitmap(glyph_draw_dsc->g, glyph_draw_dsc->_draw_buf); + if(!glyph_draw_dsc->glyph_data) { + return; + } + + lv_draw_image_dsc_t image_dsc; + lv_draw_image_dsc_init(&image_dsc); + image_dsc.opa = glyph_draw_dsc->opa; + image_dsc.src = glyph_draw_dsc->glyph_data; + image_dsc.rotation = glyph_draw_dsc->rotation; + lv_draw_nanovg_image(t, &image_dsc, glyph_draw_dsc->letter_coords, -1); + } + break; + +#if LV_USE_FONT_PLACEHOLDER + case LV_FONT_GLYPH_FORMAT_NONE: { + if(glyph_draw_dsc->bg_coords == NULL) break; + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + lv_draw_nanovg_border(t, &border_draw_dsc, glyph_draw_dsc->bg_coords); + } + break; +#endif /* LV_USE_FONT_PLACEHOLDER */ + + default: + break; + } + } + + if(fill_draw_dsc && fill_area) { + lv_draw_nanovg_fill(t, fill_draw_dsc, fill_area); + } +} + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_layer.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_layer.c new file mode 100644 index 0000000..8addcc1 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_layer.c @@ -0,0 +1,74 @@ +/** + * @file lv_draw_nanovg_layer.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_nanovg_utils.h" +#include "lv_nanovg_fbo_cache.h" +#include "../lv_draw_image_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nanovg_layer(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + lv_layer_t * layer = (lv_layer_t *)draw_dsc->src; + + if(!layer->user_data) { + LV_PROFILER_DRAW_END; + return; + } + + int image_handle = lv_nanovg_fb_get_image_handle(lv_nanovg_fbo_cache_entry_to_fb(layer->user_data)); + if(image_handle <= 0) { + LV_LOG_WARN("Invalid image handle: %d", image_handle); + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = NULL; + lv_draw_nanovg_image(t, &new_draw_dsc, coords, image_handle); + + lv_nanovg_end_frame(u); + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_NANOVG*/ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_line.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_line.c new file mode 100644 index 0000000..84086ae --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_line.c @@ -0,0 +1,191 @@ +/** + * @file lv_draw_nanovg_line.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_nanovg_utils.h" +#include "lv_nanovg_math.h" + +/********************* +* DEFINES +*********************/ + +#define SQ(x) ((x) * (x)) + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_nanovg_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + float p1_x = dsc->p1.x; + float p1_y = dsc->p1.y; + float p2_x = dsc->p2.x; + float p2_y = dsc->p2.y; + + if(p1_x == p2_x && p1_y == p2_y) { + LV_PROFILER_DRAW_END; + return; + } + + float half_w = dsc->width * 0.5f; + + lv_area_t rel_clip_area; + rel_clip_area.x1 = (int32_t)(LV_MIN(p1_x, p2_x) - half_w); + rel_clip_area.x2 = (int32_t)(LV_MAX(p1_x, p2_x) + half_w); + rel_clip_area.y1 = (int32_t)(LV_MIN(p1_y, p2_y) - half_w); + rel_clip_area.y2 = (int32_t)(LV_MAX(p1_y, p2_y) + half_w); + + if(!lv_area_intersect(&rel_clip_area, &rel_clip_area, &t->clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + int32_t dash_width = dsc->dash_width; + int32_t dash_gap = dsc->dash_gap; + int32_t dash_l = dash_width + dash_gap; + + float dx = p2_x - p1_x; + float dy = p2_y - p1_y; + float inv_dl = nvg_math_inv_sqrtf(SQ(dx) + SQ(dy)); + float w_dx = dsc->width * dy * inv_dl; + float w_dy = dsc->width * dx * inv_dl; + float w2_dx = w_dx / 2; + float w2_dy = w_dy / 2; + + int32_t ndash = 0; + if(dash_width && dash_l * inv_dl < 1.0f) { + ndash = (int32_t)((1.0f / inv_dl + dash_l - 1) / dash_l); + } + + nvgBeginPath(u->vg); + + /* head point */ + float head_start_x = p1_x + w2_dx; + float head_start_y = p1_y - w2_dy; + float head_end_x = p1_x - w2_dx; + float head_end_y = p1_y + w2_dy; + + /* tail point */ + float tail_start_x = p2_x - w2_dx; + float tail_start_y = p2_y + w2_dy; + float tail_end_x = p2_x + w2_dx; + float tail_end_y = p2_y - w2_dy; + + /* + head_start tail_end + *-----------------* + /| |\ + / | | \ + arc_c *( *p1 p2* )* arc_c + \ | | / + \| |/ + *-----------------* + head_end tail_start + */ + + /* move to start point */ + nvgMoveTo(u->vg, head_start_x, head_start_y); + + /* draw line head */ + if(dsc->round_start) { + float arc_cx = p1_x - w2_dy; + float arc_cy = p1_y - w2_dx; + + /* start 90deg arc */ + lv_nanovg_path_append_arc_right_angle(u->vg, + head_start_x, head_start_y, + p1_x, p1_y, + arc_cx, arc_cy); + + /* end 90deg arc */ + lv_nanovg_path_append_arc_right_angle(u->vg, + arc_cx, arc_cy, + p1_x, p1_y, + head_end_x, head_end_y); + } + else { + nvgLineTo(u->vg, head_end_x, head_end_y); + } + + /* draw line body */ + nvgLineTo(u->vg, tail_start_x, tail_start_y); + + /* draw line tail */ + if(dsc->round_end) { + float arc_cx = p2_x + w2_dy; + float arc_cy = p2_y + w2_dx; + lv_nanovg_path_append_arc_right_angle(u->vg, + tail_start_x, tail_start_y, + p2_x, p2_y, + arc_cx, arc_cy); + lv_nanovg_path_append_arc_right_angle(u->vg, + arc_cx, arc_cy, + p2_x, p2_y, + tail_end_x, tail_end_y); + } + else { + nvgLineTo(u->vg, tail_end_x, tail_end_y); + } + + /* close draw line body */ + nvgLineTo(u->vg, head_start_x, head_start_y); + + for(int32_t i = 0; i < ndash; i++) { + float start_x = p1_x - w2_dx + dx * (i * dash_l + dash_width) * inv_dl; + float start_y = p1_y + w2_dy + dy * (i * dash_l + dash_width) * inv_dl; + + nvgMoveTo(u->vg, start_x, start_y); + nvgLineTo(u->vg, + p1_x + w2_dx + dx * (i * dash_l + dash_width) * inv_dl, + p1_y - w2_dy + dy * (i * dash_l + dash_width) * inv_dl); + nvgLineTo(u->vg, + p1_x + w2_dx + dx * (i + 1) * dash_l * inv_dl, + p1_y - w2_dy + dy * (i + 1) * dash_l * inv_dl); + nvgLineTo(u->vg, + p1_x - w2_dx + dx * (i + 1) * dash_l * inv_dl, + p1_y + w2_dy + dy * (i + 1) * dash_l * inv_dl); + nvgLineTo(u->vg, start_x, start_y); + } + + lv_nanovg_fill( + u->vg, + NVG_CCW, + NVG_SOURCE_OVER, + lv_nanovg_color_convert(dsc->color, dsc->opa)); + + LV_PROFILER_DRAW_END; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_mask_rect.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_mask_rect.c new file mode 100644 index 0000000..97a2049 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_mask_rect.c @@ -0,0 +1,81 @@ +/** + * @file lv_draw_nanovg_mask_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "../../draw/lv_draw_mask.h" +#include "lv_nanovg_utils.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_nanovg_mask_rect(lv_draw_task_t * t, const lv_draw_mask_rect_dsc_t * dsc) +{ + LV_PROFILER_DRAW_BEGIN; + lv_area_t draw_area; + + if(!lv_area_intersect(&draw_area, &dsc->area, &t->clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + nvgBeginPath(u->vg); + + /* Nesting cropping regions using rounded rectangles and normal rectangles */ + lv_nanovg_path_append_rect( + u->vg, + dsc->area.x1, dsc->area.y1, + lv_area_get_width(&dsc->area), lv_area_get_height(&dsc->area), + dsc->radius); + lv_nanovg_path_append_rect( + u->vg, + t->clip_area.x1, t->clip_area.y1, + lv_area_get_width(&t->clip_area), lv_area_get_height(&t->clip_area), + 0); + + /* Use NVG_DESTINATION_IN (Sa * D) blending mode to make the corners transparent */ + lv_nanovg_fill( + u->vg, + NVG_CCW, + NVG_DESTINATION_IN, + nvgRGBA(0, 0, 0, 0)); + + LV_PROFILER_DRAW_END; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_private.h b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_private.h new file mode 100644 index 0000000..29e1733 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_private.h @@ -0,0 +1,260 @@ +/** + * @file lv_draw_nanovg_private.h + * + */ + +#ifndef LV_DRAW_NANOVG_PRIVATE_H +#define LV_DRAW_NANOVG_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_NANOVG +#include "../lv_draw.h" +#include "../lv_draw_private.h" +#include "../../draw/lv_draw_vector.h" +#include "../../draw/lv_draw_arc.h" +#include "../../draw/lv_draw_rect.h" +#include "../../draw/lv_draw_3d.h" +#include "../../draw/lv_draw_image.h" +#include "../../draw/lv_draw_label.h" +#include "../../draw/lv_draw_line.h" +#include "../../draw/lv_draw_triangle.h" +#include "../../misc/lv_area_private.h" + +#if !LV_USE_NANOVG +#error "Require LV_USE_NANOVG = 1" +#endif + +#if !LV_USE_MATRIX +#error "Require LV_USE_MATRIX = 1" +#endif + +#include "../../libs/nanovg/nanovg.h" + +/********************* + * DEFINES + *********************/ + +/* Select NanoVG OpenGL backend based on LV_NANOVG_BACKEND */ +#if LV_NANOVG_BACKEND == LV_NANOVG_BACKEND_GL2 +#define NANOVG_GL2_IMPLEMENTATION +#elif LV_NANOVG_BACKEND == LV_NANOVG_BACKEND_GL3 +#define NANOVG_GL3_IMPLEMENTATION +#elif LV_NANOVG_BACKEND == LV_NANOVG_BACKEND_GLES2 +#define NANOVG_GLES2_IMPLEMENTATION +#elif LV_NANOVG_BACKEND == LV_NANOVG_BACKEND_GLES3 +#define NANOVG_GLES3_IMPLEMENTATION +#else +#error "Invalid LV_NANOVG_BACKEND value" +#endif + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_pending_t; +struct NVGLUframebuffer; + +typedef struct _lv_draw_nanovg_unit_t { + lv_draw_unit_t base_unit; + lv_layer_t * current_layer; + NVGcontext * vg; + bool is_started; + lv_draw_buf_t * image_buf; + + lv_cache_t * image_cache; + struct _lv_pending_t * image_pending; + lv_ll_t image_drop_ll; + const void * image_drop_src; + + lv_cache_t * letter_cache; + struct _lv_pending_t * letter_pending; + + lv_cache_t * fbo_cache; +} lv_draw_nanovg_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_USE_3DTEXTURE +/** + * Draw 3D texture on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a 3D draw descriptor + * @param coords the coordinates of the 3D texture + */ +void lv_draw_nanovg_3d(lv_draw_task_t * t, const lv_draw_3d_dsc_t * dsc, const lv_area_t * coords); +#endif + +/** + * Draw arc on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to an arc descriptor + * @param coords the coordinates of the arc + */ +void lv_draw_nanovg_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw border on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a border descriptor + * @param coords the coordinates of the border + */ +void lv_draw_nanovg_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw box on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a box descriptor + * @param coords the coordinates of the box + */ +void lv_draw_nanovg_box_shadow(lv_draw_task_t * t, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords); + +/** + * Fill a rectangle on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a fill descriptor + * @param coords the coordinates of the rectangle + */ +void lv_draw_nanovg_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw image on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to an image descriptor + * @param coords the coordinates of the image + * @param image_handle the handle of the image to draw + */ +void lv_draw_nanovg_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords, + int image_handle); + +/** + * Initialize draw label on a NanoVG context + * @param u pointer to a NanoVG unit + */ +void lv_draw_nanovg_label_init(lv_draw_nanovg_unit_t * u); + +/** + * Deinitialize draw label on a NanoVG context + * @param u pointer to a NanoVG unit + */ +void lv_draw_nanovg_label_deinit(lv_draw_nanovg_unit_t * u); + +/** + * Draw letter on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a letter descriptor + * @param coords the coordinates of the letter + */ +void lv_draw_nanovg_letter(lv_draw_task_t * t, const lv_draw_letter_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw label on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a label descriptor + * @param coords the coordinates of the label + */ +void lv_draw_nanovg_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw layer on a NanoVG context + * @param t pointer to a drawing task + * @param draw_dsc pointer to an image descriptor + * @param coords the coordinates of the layer + */ +void lv_draw_nanovg_layer(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords); + +/** + * Draw line on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a line descriptor + */ +void lv_draw_nanovg_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc); + +/** + * Draw triangle on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a triangle descriptor + */ +void lv_draw_nanovg_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc); + +/** + * Draw mask rectangles on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a mask descriptor + */ +void lv_draw_nanovg_mask_rect(lv_draw_task_t * t, const lv_draw_mask_rect_dsc_t * dsc); + +/** + * Get image handle from framebuffer + * @param fb the framebuffer to get the image handle from + * @return the image handle + */ +int lv_nanovg_fb_get_image_handle(struct NVGLUframebuffer * fb); + +#if LV_USE_VECTOR_GRAPHIC +/** + * Draw vector graphics on a NanoVG context + * @param t pointer to a drawing task + * @param dsc pointer to a vector descriptor + */ +void lv_draw_nanovg_vector(lv_draw_task_t * t, const lv_draw_vector_dsc_t * dsc); + +/** + * @brief Convert a gradient to a paint + * @param ctx the nanovg context + * @param grad the gradient descriptor + * @param paint the paint to store the result + */ +bool lv_nanovg_grad_to_paint(NVGcontext * ctx, const lv_vector_gradient_t * grad, NVGpaint * paint); + +/** + * @brief Draw a gradient + * @param ctx the nanovg context + * @param grad the gradient descriptor + * @param winding the fill rule + * @param composite_operation the blend mode + */ +void lv_nanovg_draw_grad( + NVGcontext * ctx, + const lv_vector_gradient_t * grad, + enum NVGwinding winding, + enum NVGcompositeOperation composite_operation); + +/** + * @brief Draw a gradient with helper + * @param ctx the nanovg context + * @param area the area to draw the gradient on + * @param grad_dsc the gradient descriptor + * @param winding the fill rule + * @param composite_operation the blend mode + */ +void lv_nanovg_draw_grad_helper( + NVGcontext * ctx, + const lv_area_t * area, + const lv_grad_dsc_t * grad_dsc, + enum NVGwinding winding, + enum NVGcompositeOperation composite_operation); + +#endif /*LV_USE_VECTOR_GRAPHIC*/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_DRAW_NANOVG*/ + +#endif /*LV_DRAW_NANOVG_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_triangle.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_triangle.c new file mode 100644 index 0000000..0a31d59 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_triangle.c @@ -0,0 +1,85 @@ +/** + * @file lv_draw_nanovg_triangle.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_nanovg_utils.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_nanovg_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc) +{ + LV_PROFILER_DRAW_BEGIN; + lv_area_t tri_area; + tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, &tri_area, &t->clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + nvgBeginPath(u->vg); + nvgMoveTo(u->vg, dsc->p[0].x, dsc->p[0].y); + nvgLineTo(u->vg, dsc->p[1].x, dsc->p[1].y); + nvgLineTo(u->vg, dsc->p[2].x, dsc->p[2].y); + nvgClosePath(u->vg); + + if(dsc->grad.dir != LV_GRAD_DIR_NONE) { +#if LV_USE_VECTOR_GRAPHIC + lv_nanovg_draw_grad_helper(u->vg, &tri_area, &dsc->grad, NVG_CCW, NVG_SOURCE_OVER); +#else + LV_LOG_WARN("Gradient fill is not supported without VECTOR_GRAPHIC"); +#endif + } + else { /* normal fill */ + lv_nanovg_fill( + u->vg, + NVG_CCW, + NVG_SOURCE_OVER, + lv_nanovg_color_convert(dsc->color, dsc->opa)); + } + + LV_PROFILER_DRAW_END; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_vector.c b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_vector.c new file mode 100644 index 0000000..e8bf634 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_draw_nanovg_vector.c @@ -0,0 +1,312 @@ +/** + * @file lv_draw_nanovg_vector.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nanovg_private.h" + +#if LV_USE_DRAW_NANOVG && LV_USE_VECTOR_GRAPHIC + +#include "lv_nanovg_utils.h" +#include "lv_nanovg_image_cache.h" +#include "../lv_draw_vector_private.h" +#include "../lv_image_decoder_private.h" +#include +#include + +/********************* +* DEFINES +*********************/ + +#define OPA_MIX(opa1, opa2) LV_UDIV255((opa1) * (opa2)) + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_path_ctx_t * dsc); +static void lv_path_to_nvg(NVGcontext * ctx, const lv_vector_path_t * src, lv_fpoint_t * offset); +static enum NVGcompositeOperation lv_blend_to_nvg(lv_vector_blend_t blend); +static enum NVGwinding lv_fill_to_nvg(lv_vector_fill_t fill_rule); + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_draw_nanovg_vector(lv_draw_task_t * t, const lv_draw_vector_dsc_t * dsc) +{ + LV_PROFILER_DRAW_BEGIN; + if(dsc->task_list == NULL) { + LV_PROFILER_DRAW_END; + return; + } + + lv_layer_t * layer = dsc->base.layer; + if(layer->draw_buf == NULL) { + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_nanovg_unit_t * u = (lv_draw_nanovg_unit_t *)t->draw_unit; + + nvgGlobalAlpha(u->vg, t->opa / (float)LV_OPA_COVER); + + lv_vector_for_each_destroy_tasks(dsc->task_list, task_draw_cb, u); + LV_PROFILER_DRAW_END; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +static NVGcolor lv_color32_to_nvg(lv_color32_t color, lv_opa_t opa) +{ + uint8_t a = LV_UDIV255(color.alpha * opa); + return nvgRGBA(color.red, color.green, color.blue, a); +} + +static void draw_fill(lv_draw_nanovg_unit_t * u, const lv_vector_fill_dsc_t * fill_dsc, const lv_fpoint_t * offset, + enum NVGcompositeOperation comp_op) +{ + LV_PROFILER_DRAW_BEGIN; + + const enum NVGwinding winding = lv_fill_to_nvg(fill_dsc->fill_rule); + + lv_nanovg_transform(u->vg, &fill_dsc->matrix); + + switch(fill_dsc->style) { + case LV_VECTOR_DRAW_STYLE_SOLID: { + lv_nanovg_fill(u->vg, winding, comp_op, lv_color32_to_nvg(fill_dsc->color, fill_dsc->opa)); + } + break; + case LV_VECTOR_DRAW_STYLE_PATTERN: { + const lv_draw_image_dsc_t * img_dsc = &fill_dsc->img_dsc; + lv_image_header_t header; + int image_handle = lv_nanovg_image_cache_get_handle(u, img_dsc->src, lv_color_to_32(img_dsc->recolor, + img_dsc->recolor_opa), 0, &header); + if(image_handle < 0) { + LV_PROFILER_DRAW_END; + return; + } + + float offset_x = 0; + float offset_y = 0; + + if(fill_dsc->fill_units == LV_VECTOR_FILL_UNITS_OBJECT_BOUNDING_BOX) { + offset_x = offset->x; + offset_y = offset->y; + } + + NVGpaint paint = nvgImagePattern(u->vg, offset_x, offset_y, header.w, header.h, 0, image_handle, + img_dsc->opa / (float)LV_OPA_COVER); + + nvgFillPaint(u->vg, paint); + nvgFill(u->vg); + } + break; + case LV_VECTOR_DRAW_STYLE_GRADIENT: { + lv_nanovg_draw_grad(u->vg, &fill_dsc->gradient, winding, comp_op); + } + break; + default: + LV_LOG_WARN("unsupported style: %d", fill_dsc->style); + break; + } + + LV_PROFILER_DRAW_END; +} + +static void draw_stroke(lv_draw_nanovg_unit_t * u, const lv_vector_stroke_dsc_t * stroke_dsc) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_nanovg_transform(u->vg, &stroke_dsc->matrix); + + nvgStrokeColor(u->vg, lv_color32_to_nvg(stroke_dsc->color, stroke_dsc->opa)); + nvgStrokeWidth(u->vg, stroke_dsc->width); + + switch(stroke_dsc->style) { + case LV_VECTOR_DRAW_STYLE_SOLID: + break; + + case LV_VECTOR_DRAW_STYLE_GRADIENT: { + NVGpaint paint; + if(!lv_nanovg_grad_to_paint(u->vg, &stroke_dsc->gradient, &paint)) { + LV_PROFILER_DRAW_END; + return; + } + nvgStrokePaint(u->vg, paint); + } + break; + + default: + LV_LOG_WARN("unsupported style: %d", stroke_dsc->style); + break; + } + + nvgStroke(u->vg); + + LV_PROFILER_DRAW_END; +} + +static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_path_ctx_t * dsc) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_nanovg_unit_t * u = ctx; + + /* clear area */ + if(!path) { + NVGcolor c = lv_color32_to_nvg(dsc->fill_dsc.color, dsc->fill_dsc.opa); + nvgBeginPath(u->vg); + lv_nanovg_path_append_area(u->vg, &dsc->scissor_area); + lv_nanovg_fill(u->vg, NVG_CCW, NVG_COPY, c); + LV_PROFILER_DRAW_END; + return; + } + + if(dsc->fill_dsc.opa == LV_OPA_TRANSP && dsc->stroke_dsc.opa == LV_OPA_TRANSP) { + LV_LOG_TRACE("Full transparent, no need to draw"); + LV_PROFILER_DRAW_END; + return; + } + + nvgSave(u->vg); + lv_nanovg_transform(u->vg, &dsc->matrix); + + lv_fpoint_t offset = {0, 0}; + lv_path_to_nvg(u->vg, path, &offset); + + lv_nanovg_set_clip_area(u->vg, &dsc->scissor_area); + + const enum NVGcompositeOperation comp_op = lv_blend_to_nvg(dsc->blend_mode); + nvgGlobalCompositeOperation(u->vg, comp_op); + + if(dsc->fill_dsc.opa) { + draw_fill(u, &dsc->fill_dsc, &offset, comp_op); + } + + if(dsc->stroke_dsc.opa) { + draw_stroke(u, &dsc->stroke_dsc); + } + + nvgRestore(u->vg); + + LV_PROFILER_DRAW_END; +} + +static void lv_path_to_nvg(NVGcontext * ctx, const lv_vector_path_t * src, lv_fpoint_t * offset) +{ + LV_PROFILER_DRAW_BEGIN; + + float min_x = FLT_MAX; + float min_y = FLT_MAX; + float max_x = -FLT_MAX; + float max_y = -FLT_MAX; + +#define CMP_BOUNDS(point) \ + do { \ + if((point)->x < min_x) min_x = (point)->x; \ + if((point)->y < min_y) min_y = (point)->y; \ + if((point)->x > max_x) max_x = (point)->x; \ + if((point)->y > max_y) max_y = (point)->y; \ + } while(0) + + const lv_vector_path_op_t * ops = lv_array_front(&src->ops); + const lv_fpoint_t * point = lv_array_front(&src->points); + const uint32_t op_size = lv_array_size(&src->ops); + + nvgBeginPath(ctx); + + for(uint32_t i = 0; i < op_size; i++) { + switch(ops[i]) { + case LV_VECTOR_PATH_OP_MOVE_TO: { + nvgMoveTo(ctx, point->x, point->y); + CMP_BOUNDS(point); + point++; + } + break; + case LV_VECTOR_PATH_OP_LINE_TO: { + nvgLineTo(ctx, point->x, point->y); + CMP_BOUNDS(point); + point++; + } + break; + case LV_VECTOR_PATH_OP_QUAD_TO: { + nvgQuadTo(ctx, point[0].x, point[0].y, point[1].x, point[1].y); + CMP_BOUNDS(&point[0]); + CMP_BOUNDS(&point[1]); + point += 2; + } + break; + case LV_VECTOR_PATH_OP_CUBIC_TO: { + nvgBezierTo(ctx, point[0].x, point[0].y, point[1].x, point[1].y, point[2].x, point[2].y); + CMP_BOUNDS(&point[0]); + CMP_BOUNDS(&point[1]); + CMP_BOUNDS(&point[2]); + point += 3; + } + break; + case LV_VECTOR_PATH_OP_CLOSE: { + nvgClosePath(ctx); + } + break; + default: + LV_LOG_WARN("unknown op: %d", ops[i]); + break; + } + } + + offset->x = lroundf(min_x); + offset->y = lroundf(min_y); + LV_PROFILER_DRAW_END; +} + +static enum NVGcompositeOperation lv_blend_to_nvg(lv_vector_blend_t blend) +{ + switch(blend) { + case LV_VECTOR_BLEND_SRC_OVER: + return NVG_SOURCE_OVER; + case LV_VECTOR_BLEND_SRC_IN: + return NVG_SOURCE_IN; + case LV_VECTOR_BLEND_DST_OVER: + return NVG_DESTINATION_OVER; + case LV_VECTOR_BLEND_DST_IN: + return NVG_DESTINATION_IN; + case LV_VECTOR_BLEND_NONE: + return NVG_COPY; + default: + LV_LOG_INFO("Unknown supported blend mode: %d", blend); + return NVG_SOURCE_OVER; + } +} + +static enum NVGwinding lv_fill_to_nvg(lv_vector_fill_t fill_rule) +{ + switch(fill_rule) { + case LV_VECTOR_FILL_NONZERO: + return NVG_CCW; + case LV_VECTOR_FILL_EVENODD: + return NVG_CW; + default: + LV_LOG_WARN("Unknown supported fill rule: %d", fill_rule); + return NVG_CCW; + } +} + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_nanovg_fbo_cache.c b/inc/lvgl/src/draw/nanovg/lv_nanovg_fbo_cache.c new file mode 100644 index 0000000..732e4e0 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_nanovg_fbo_cache.c @@ -0,0 +1,176 @@ +/** + * @file lv_nanovg_fbo_cache.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nanovg_fbo_cache.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_draw_nanovg_private.h" +#include "lv_nanovg_utils.h" +#include "../../libs/nanovg/nanovg_gl_utils.h" + +/********************* + * DEFINES + *********************/ + +#define LV_NANOVG_FBO_CACHE_CNT 4 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* context */ + lv_draw_nanovg_unit_t * u; + + /* key */ + int width; + int height; + int flags; + enum NVGtexture format; + + /* value */ + struct NVGLUframebuffer * fbo; +} fbo_item_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool fbo_create_cb(fbo_item_t * item, void * user_data); +static void fbo_free_cb(fbo_item_t * item, void * user_data); +static lv_cache_compare_res_t fbo_compare_cb(const fbo_item_t * lhs, const fbo_item_t * rhs); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_nanovg_fbo_cache_init(lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_ASSERT(u->fbo_cache == NULL); + + const lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)fbo_compare_cb, + .create_cb = (lv_cache_create_cb_t)fbo_create_cb, + .free_cb = (lv_cache_free_cb_t)fbo_free_cb, + }; + + u->fbo_cache = lv_cache_create(&lv_cache_class_lru_ll_count, sizeof(fbo_item_t), LV_NANOVG_FBO_CACHE_CNT, ops); + lv_cache_set_name(u->fbo_cache, "NVG_FBO"); +} + +void lv_nanovg_fbo_cache_deinit(lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_ASSERT(u->fbo_cache); + + lv_cache_destroy(u->fbo_cache, NULL); + u->fbo_cache = NULL; +} + +struct _lv_cache_entry_t * lv_nanovg_fbo_cache_get(lv_draw_nanovg_unit_t * u, int width, int height, int flags, + int format) +{ + LV_PROFILER_DRAW_BEGIN; + LV_ASSERT_NULL(u); + + fbo_item_t search_key = { 0 }; + search_key.u = u; + search_key.width = width; + search_key.height = height; + search_key.flags = flags; + search_key.format = format; + + lv_cache_entry_t * cache_node_entry = lv_cache_acquire(u->fbo_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + cache_node_entry = lv_cache_acquire_or_create(u->fbo_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + LV_LOG_ERROR("FBO cache creating failed"); + LV_PROFILER_DRAW_END; + return NULL; + } + } + + LV_PROFILER_DRAW_END; + return cache_node_entry; +} + +void lv_nanovg_fbo_cache_release(struct _lv_draw_nanovg_unit_t * u, struct _lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(u); + LV_ASSERT_NULL(entry); + lv_cache_release(u->fbo_cache, entry, NULL); +} + +struct NVGLUframebuffer * lv_nanovg_fbo_cache_entry_to_fb(struct _lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + fbo_item_t * fbo_item = lv_cache_entry_get_data(entry); + return fbo_item->fbo; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool fbo_create_cb(fbo_item_t * item, void * user_data) +{ + LV_PROFILER_DRAW_BEGIN; + LV_UNUSED(user_data); + + item->fbo = nvgluCreateFramebuffer(item->u->vg, item->width, item->height, item->flags, item->format); + if(!item->fbo) { + LV_LOG_ERROR("Failed to create FBO"); + } + + LV_PROFILER_DRAW_END; + return item->fbo != NULL; +} + +static void fbo_free_cb(fbo_item_t * item, void * user_data) +{ + LV_PROFILER_DRAW_BEGIN; + LV_UNUSED(user_data); + + nvgluDeleteFramebuffer(item->fbo); + + LV_PROFILER_DRAW_END; +} + +static lv_cache_compare_res_t fbo_compare_cb(const fbo_item_t * lhs, const fbo_item_t * rhs) +{ + if(lhs->width != rhs->width) { + return lhs->width > rhs->width ? 1 : -1; + } + + if(lhs->height != rhs->height) { + return lhs->height > rhs->height ? 1 : -1; + } + + if(lhs->flags != rhs->flags) { + return lhs->flags > rhs->flags ? 1 : -1; + } + + if(lhs->format != rhs->format) { + return lhs->format > rhs->format ? 1 : -1; + } + + return 0; +} + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_nanovg_fbo_cache.h b/inc/lvgl/src/draw/nanovg/lv_nanovg_fbo_cache.h new file mode 100644 index 0000000..df89a1a --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_nanovg_fbo_cache.h @@ -0,0 +1,85 @@ +/** + * @file lv_nanovg_fbo_cache.h + * + */ + +#ifndef LV_NANOVG_FBO_CACHE_H +#define LV_NANOVG_FBO_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_NANOVG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_nanovg_unit_t; +struct _lv_cache_entry_t; +struct NVGLUframebuffer; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the FBO cache + * @param u pointer to the nanovg unit + */ +void lv_nanovg_fbo_cache_init(struct _lv_draw_nanovg_unit_t * u); + +/** + * @brief Deinitialize the FBO cache + * @param u pointer to the nanovg unit + */ +void lv_nanovg_fbo_cache_deinit(struct _lv_draw_nanovg_unit_t * u); + +/** + * @brief Get the FBO from the cache, create a new one if not found + * @param u pointer to the nanovg unit + * @param width the width of the FBO + * @param height the height of the FBO + * @param flags the FBO flags + * @param format the texture format + * @return the FBO cache entry, or NULL if not found + */ +struct _lv_cache_entry_t * lv_nanovg_fbo_cache_get(struct _lv_draw_nanovg_unit_t * u, int width, int height, int flags, + int format); + +/** + * @brief Release the FBO from the cache + * @param u pointer to the nanovg unit + * @param entry the FBO cache entry to release + */ +void lv_nanovg_fbo_cache_release(struct _lv_draw_nanovg_unit_t * u, struct _lv_cache_entry_t * entry); + +/** + * @brief Convert a cache entry to a framebuffer + * @param entry the FBO cache entry + * @return the framebuffer pointer + */ +struct NVGLUframebuffer * lv_nanovg_fbo_cache_entry_to_fb(struct _lv_cache_entry_t * entry); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_NANOVG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NANOVG_FBO_CACHE_H*/ diff --git a/inc/lvgl/src/draw/nanovg/lv_nanovg_image_cache.c b/inc/lvgl/src/draw/nanovg/lv_nanovg_image_cache.c new file mode 100644 index 0000000..b8e5718 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_nanovg_image_cache.c @@ -0,0 +1,354 @@ +/** + * @file lv_nanovg_image_cache.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nanovg_image_cache.h" + +#if LV_USE_DRAW_NANOVG + +#include "lv_draw_nanovg_private.h" +#include "lv_nanovg_utils.h" +#include "../lv_image_decoder_private.h" +#include "../../misc/lv_pending.h" +#include "../../misc/lv_iter.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +typedef struct { + /* context */ + lv_draw_nanovg_unit_t * u; + + /* key */ + lv_draw_buf_t src_buf; + lv_color32_t color; + int image_flags; + + /* for drop search */ + const void * src; + lv_image_src_t src_type; + + /* value */ + int image_handle; +} image_item_t; + +/********************** +* STATIC PROTOTYPES +**********************/ + +static void image_cache_release_cb(void * entry, void * user_data); +static bool image_create_cb(image_item_t * item, void * user_data); +static void image_free_cb(image_item_t * item, void * user_data); +static lv_cache_compare_res_t image_compare_cb(const image_item_t * lhs, const image_item_t * rhs); +static void image_cache_drop_collect_cb(void * elem); + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_nanovg_image_cache_init(struct _lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_ASSERT(u->image_cache == NULL); + LV_ASSERT(u->image_pending == NULL); + + const lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)image_compare_cb, + .create_cb = (lv_cache_create_cb_t)image_create_cb, + .free_cb = (lv_cache_free_cb_t)image_free_cb, + }; + + u->image_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(image_item_t), LV_NANOVG_IMAGE_CACHE_CNT, ops); + lv_cache_set_name(u->image_cache, "NVG_IMAGE"); + u->image_pending = lv_pending_create(sizeof(lv_cache_entry_t *), 4); + lv_pending_set_free_cb(u->image_pending, image_cache_release_cb, u->image_cache); + + lv_ll_init(&u->image_drop_ll, sizeof(image_item_t)); +} + +void lv_nanovg_image_cache_deinit(struct _lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_ASSERT(u->image_cache); + LV_ASSERT(u->image_pending); + + lv_pending_destroy(u->image_pending); + u->image_pending = NULL; + + lv_cache_destroy(u->image_cache, NULL); + u->image_cache = NULL; +} + +int lv_nanovg_image_cache_get_handle(struct _lv_draw_nanovg_unit_t * u, + const void * src, + lv_color32_t color, + int image_flags, + lv_image_header_t * header) +{ + LV_PROFILER_DRAW_BEGIN; + + LV_ASSERT_NULL(u); + LV_ASSERT_NULL(src); + + lv_image_decoder_args_t args; + lv_memzero(&args, sizeof(lv_image_decoder_args_t)); + + lv_image_decoder_dsc_t decoder_dsc; + lv_result_t res = lv_image_decoder_open(&decoder_dsc, src, &args); + if(res != LV_RESULT_OK) { + lv_image_src_t type = lv_image_src_get_type(src); + LV_UNUSED(type); + LV_LOG_WARN("Failed to open image: type: %d, src: %p (%s)", type, src, + type == LV_IMAGE_SRC_FILE ? (const char *)src : "var"); + LV_PROFILER_DRAW_END; + return -1; + } + + const lv_draw_buf_t * decoded = decoder_dsc.decoded; + if(decoded == NULL || decoded->data == NULL) { + lv_image_decoder_close(&decoder_dsc); + LV_LOG_ERROR("image data is NULL"); + LV_PROFILER_DRAW_END; + return -1; + } + + if(header) { + *header = decoder_dsc.header; + } + + image_item_t search_key = { 0 }; + search_key.u = u; + search_key.src_buf = *decoded; + search_key.color = color; + search_key.image_flags = image_flags; + search_key.src = src; + search_key.src_type = lv_image_src_get_type(src); + + lv_cache_entry_t * cache_node_entry = lv_cache_acquire(u->image_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + /* check if the cache is full */ + size_t free_size = lv_cache_get_free_size(u->image_cache, NULL); + if(free_size == 0) { + LV_LOG_INFO("image cache is full, release all pending cache entries"); + lv_nanovg_end_frame(u); + } + + cache_node_entry = lv_cache_acquire_or_create(u->image_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + LV_LOG_ERROR("image cache creating failed"); + lv_image_decoder_close(&decoder_dsc); + LV_PROFILER_DRAW_END; + return -1; + } + } + + lv_image_decoder_close(&decoder_dsc); + + /* Add the new entry to the pending list */ + lv_pending_add(u->image_pending, &cache_node_entry); + + image_item_t * image_item = lv_cache_entry_get_data(cache_node_entry); + + LV_PROFILER_DRAW_END; + return image_item->image_handle; +} + +void lv_nanovg_image_cache_drop(struct _lv_draw_nanovg_unit_t * u, const void * src) +{ + LV_ASSERT_NULL(u); + LV_UNUSED(src); + if(src == NULL) { + lv_cache_drop_all(u->image_cache, NULL); + return; + } + + u->image_drop_src = src; + + lv_iter_t * iter = lv_cache_iter_create(u->image_cache); + LV_ASSERT_NULL(iter); + + /* Collect all cache entries that match the drop source */ + lv_iter_inspect(iter, image_cache_drop_collect_cb); + + image_item_t * drop_item; + LV_LL_READ(&u->image_drop_ll, drop_item) { + lv_cache_drop(u->image_cache, drop_item, NULL); + } + + lv_ll_clear(&u->image_drop_ll); + lv_iter_destroy(iter); + u->image_drop_src = NULL; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +static void image_cache_release_cb(void * entry, void * user_data) +{ + lv_cache_entry_t ** entry_p = entry; + lv_cache_t * cache = user_data; + lv_cache_release(cache, * entry_p, NULL); +} + +static bool image_create_cb(image_item_t * item, void * user_data) +{ + LV_UNUSED(user_data); + const uint32_t w = item->src_buf.header.w; + const uint32_t h = item->src_buf.header.h; + const lv_color_format_t cf = item->src_buf.header.cf; + const uint32_t stride = item->src_buf.header.stride; + enum NVGtexture nvg_tex_type = NVG_TEXTURE_BGRA; + + /* Determine texture type and pixel size based on color format */ + switch(cf) { + case LV_COLOR_FORMAT_A8: + nvg_tex_type = NVG_TEXTURE_ALPHA; + break; + + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + nvg_tex_type = NVG_TEXTURE_BGRA; + break; + + case LV_COLOR_FORMAT_XRGB8888: + nvg_tex_type = NVG_TEXTURE_BGRX; + break; + + case LV_COLOR_FORMAT_RGB888: + nvg_tex_type = NVG_TEXTURE_BGR; + break; + + case LV_COLOR_FORMAT_RGB565: + nvg_tex_type = NVG_TEXTURE_RGB565; + break; + + default: + LV_LOG_ERROR("Unsupported image format: %d", cf); + return false; + } + + void * data = NULL; + + /* Check if stride is tightly packed */ + uint32_t tight_stride = (w * lv_color_format_get_bpp(cf) + 7) >> 3; + if(stride == tight_stride) { + /* Stride matches, use source buffer directly (zero-copy) */ + data = lv_draw_buf_goto_xy(&item->src_buf, 0, 0); + LV_LOG_TRACE("Image stride matches: %" LV_PRIu32, stride); + } + else { + /* Stride doesn't match, need to copy with tight alignment */ + lv_draw_buf_t * tmp_buf = lv_nanovg_reshape_global_image(item->u, cf, w, h); + if(!tmp_buf) { + LV_LOG_ERROR("Failed to allocate temp buffer for stride conversion"); + return false; + } + + lv_draw_buf_copy(tmp_buf, NULL, &item->src_buf, NULL); + data = lv_draw_buf_goto_xy(tmp_buf, 0, 0); + LV_LOG_TRACE("Image stride converted: %" LV_PRIu32 " -> %" LV_PRIu32, stride, tight_stride); + } + + int flags = item->image_flags; + if(cf == LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED + || lv_draw_buf_has_flag(&item->src_buf, LV_IMAGE_FLAGS_PREMULTIPLIED)) { + flags |= NVG_IMAGE_PREMULTIPLIED; + } + + LV_PROFILER_DRAW_BEGIN_TAG("nvgCreateImage"); + int image_handle = nvgCreateImage(item->u->vg, w, h, flags, nvg_tex_type, data); + LV_PROFILER_DRAW_END_TAG("nvgCreateImage"); + + if(image_handle < 0) { + return false; + } + + if(item->src_type == LV_IMAGE_SRC_FILE) { + item->src = lv_strdup(item->src); + LV_ASSERT_MALLOC(item->src); + } + + item->image_handle = image_handle; + return true; +} + +static void image_free_cb(image_item_t * item, void * user_data) +{ + LV_UNUSED(user_data); + LV_PROFILER_DRAW_BEGIN; + LV_LOG_TRACE("image_handle: %d", item->image_handle); + nvgDeleteImage(item->u->vg, item->image_handle); + item->image_handle = -1; + + if(item->src_type == LV_IMAGE_SRC_FILE) { + lv_free((void *)item->src); + item->src = NULL; + } + + item->src_type = LV_IMAGE_SRC_UNKNOWN; + + LV_PROFILER_DRAW_END; +} + +static lv_cache_compare_res_t image_compare_cb(const image_item_t * lhs, const image_item_t * rhs) +{ + if(lhs->image_flags != rhs->image_flags) { + return lhs->image_flags > rhs->image_flags ? 1 : -1; + } + + uint32_t lhs_color = *(uint32_t *)&lhs->color; + uint32_t rhs_color = *(uint32_t *)&rhs->color; + + if(lhs_color != rhs_color) { + return lhs_color > rhs_color ? 1 : -1; + } + + int cmp_res = lv_memcmp(&lhs->src_buf, &rhs->src_buf, sizeof(lv_draw_buf_t)); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + +static void image_cache_drop_collect_cb(void * elem) +{ + /** + * If the cache is deleted during the traversal process, + * it will cause iter to become invalid. + * Therefore, we will first add it to the drop collection list and postpone the deletion. + */ + LV_ASSERT_NULL(elem); + image_item_t * item = elem; + const void * src = item->u->image_drop_src; + LV_ASSERT_NULL(src); + lv_image_src_t src_type = lv_image_src_get_type(src); + + if((src_type == LV_IMAGE_SRC_FILE && lv_strcmp(item->src, src) == 0) + || (src_type == LV_IMAGE_SRC_VARIABLE && item->src == src)) { + image_item_t * drop_item = lv_ll_ins_tail(&item->u->image_drop_ll); + LV_ASSERT_MALLOC(drop_item); + *drop_item = *item; + } +} + +#endif /*LV_USE_DRAW_NANOVG*/ diff --git a/inc/lvgl/src/draw/nanovg/lv_nanovg_image_cache.h b/inc/lvgl/src/draw/nanovg/lv_nanovg_image_cache.h new file mode 100644 index 0000000..aa7a0fd --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_nanovg_image_cache.h @@ -0,0 +1,81 @@ +/** + * @file lv_nanovg_image_cache.h + * + */ + +#ifndef LV_NANOVG_IMAGE_CACHE_H +#define LV_NANOVG_IMAGE_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_NANOVG + +#include "../lv_draw_image_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_nanovg_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the image cache + * @param u pointer to the nanovg unit + */ +void lv_nanovg_image_cache_init(struct _lv_draw_nanovg_unit_t * u); + +/** + * @brief Deinitialize the image cache + * @param u pointer to the nanovg unit + */ +void lv_nanovg_image_cache_deinit(struct _lv_draw_nanovg_unit_t * u); + +/** + * @brief Get the image handle from the cache, create a new one if not found + * @param u pointer to the nanovg unit + * @param src the source image data + * @param color the color to apply + * @param image_flags the image flags + * @param header the image header to fill (can be NULL) + * @return the image handle, or -1 on failure + */ +int lv_nanovg_image_cache_get_handle(struct _lv_draw_nanovg_unit_t * u, + const void * src, + lv_color32_t color, + int image_flags, + lv_image_header_t * header); + +/** + * @brief Drop the image from the cache + * @param u pointer to the nanovg unit + * @param src the source image data + */ +void lv_nanovg_image_cache_drop(struct _lv_draw_nanovg_unit_t * u, const void * src); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_NANOVG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NANOVG_IMAGE_CACHE_H*/ diff --git a/inc/lvgl/src/draw/nanovg/lv_nanovg_math.h b/inc/lvgl/src/draw/nanovg/lv_nanovg_math.h new file mode 100644 index 0000000..44d6f02 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_nanovg_math.h @@ -0,0 +1,102 @@ +/** + * @file lv_nanovg_math.h + * + */ + +#ifndef LV_NANOVG_MATH_H +#define LV_NANOVG_MATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_NANOVG + +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define NVG_MATH_PI 3.14159265358979323846f +#define NVG_MATH_HALF_PI 1.57079632679489661923f +#define NVG_MATH_TWO_PI 6.28318530717958647692f +#define NVG_DEG_TO_RAD 0.017453292519943295769236907684886f +#define NVG_RAD_TO_DEG 57.295779513082320876798154814105f + +#define NVG_MATH_TANF(x) tanf(x) +#define NVG_MATH_SINF(x) sinf(x) +#define NVG_MATH_COSF(x) cosf(x) +#define NVG_MATH_ASINF(x) asinf(x) +#define NVG_MATH_ACOSF(x) acosf(x) +#define NVG_MATH_FABSF(x) fabsf(x) +#define NVG_MATH_SQRTF(x) sqrtf(x) + +#define NVG_MATH_RADIANS(deg) ((deg) * NVG_DEG_TO_RAD) +#define NVG_MATH_DEGREES(rad) ((rad) * NVG_RAD_TO_DEG) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Check if the floating point number is zero + * @param a the number to check + * @return true if the number is zero, false otherwise + */ +static inline bool nvg_math_is_zero(float a) +{ + return (NVG_MATH_FABSF(a) < FLT_EPSILON); +} + +/** + * Check if two floating point numbers are equal + * @param a the first number + * @param b the second number + * @return true if the numbers are equal, false otherwise + */ +static inline bool nvg_math_is_equal(float a, float b) +{ + return nvg_math_is_zero(a - b); +} + +/** + * Calculate the inverse square root (1/sqrt(x)) + * @param number the input number + * @return the inverse square root + */ +static inline float nvg_math_inv_sqrtf(float number) +{ + /* From https://en.wikipedia.org/wiki/Fast_inverse_square_root#Avoiding_undefined_behavior */ + union { + float f; + int32_t i; + } conv = { .f = number }; + conv.i = 0x5f3759df - (conv.i >> 1); + conv.f *= 1.5F - (number * 0.5F * conv.f * conv.f); + return conv.f; +} + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_NANOVG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NANOVG_MATH_H*/ diff --git a/inc/lvgl/src/draw/nanovg/lv_nanovg_utils.c b/inc/lvgl/src/draw/nanovg/lv_nanovg_utils.c new file mode 100644 index 0000000..c31a96f --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_nanovg_utils.c @@ -0,0 +1,301 @@ +/** + * @file lv_nanovg_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nanovg_utils.h" + +#if LV_USE_DRAW_NANOVG + +#include "../../misc/lv_pending.h" +#include "lv_draw_nanovg_private.h" +#include "lv_nanovg_math.h" +#include +#include + +/********************* +* DEFINES +*********************/ + +/* Magic number from https://spencermortensen.com/articles/bezier-circle/ */ +#define PATH_ARC_MAGIC 0.55191502449351f + +#define SIGN(x) (nvg_math_is_zero(x) ? 0 : ((x) > 0 ? 1 : -1)) + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +void lv_nanovg_utils_init(struct _lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); +} + +void lv_nanovg_utils_deinit(struct _lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); + + if(u->image_buf) { + lv_draw_buf_destroy(u->image_buf); + u->image_buf = NULL; + } +} + +void lv_nanovg_transform(NVGcontext * ctx, const lv_matrix_t * matrix) +{ + LV_ASSERT_NULL(ctx); + LV_ASSERT_NULL(matrix); + LV_PROFILER_DRAW_BEGIN; + + nvgTransform(ctx, + matrix->m[0][0], + matrix->m[1][0], + matrix->m[0][1], + matrix->m[1][1], + matrix->m[0][2], + matrix->m[1][2]); + + LV_PROFILER_DRAW_END; +} + +void lv_nanovg_set_clip_area(NVGcontext * ctx, const lv_area_t * area) +{ + LV_ASSERT_NULL(ctx); + LV_ASSERT_NULL(area); + LV_PROFILER_DRAW_BEGIN; + + nvgScissor(ctx, + area->x1, area->y1, + lv_area_get_width(area), lv_area_get_height(area)); + + LV_PROFILER_DRAW_END; +} + +void lv_nanovg_path_append_rect(NVGcontext * ctx, float x, float y, float w, float h, float r) +{ + LV_ASSERT_NULL(ctx); + + LV_PROFILER_DRAW_BEGIN; + + if(r > 0) { + const float half_w = w / 2.0f; + const float half_h = h / 2.0f; + + /*clamping cornerRadius by minimum size*/ + const float r_max = LV_MIN(half_w, half_h); + + nvgRoundedRect(ctx, x, y, w, h, r > r_max ? r_max : r); + LV_PROFILER_DRAW_END; + return; + } + + nvgRect(ctx, x, y, w, h); + + LV_PROFILER_DRAW_END; +} + +void lv_nanovg_path_append_area(NVGcontext * ctx, const lv_area_t * area) +{ + LV_ASSERT_NULL(ctx); + LV_ASSERT_NULL(area); + LV_PROFILER_DRAW_BEGIN; + + nvgRect(ctx, area->x1, area->y1, lv_area_get_width(area), lv_area_get_height(area)); + + LV_PROFILER_DRAW_END; +} + +void lv_nanovg_path_append_arc_right_angle(NVGcontext * ctx, + float start_x, float start_y, + float center_x, float center_y, + float end_x, float end_y) +{ + LV_PROFILER_DRAW_BEGIN; + float dx1 = center_x - start_x; + float dy1 = center_y - start_y; + float dx2 = end_x - center_x; + float dy2 = end_y - center_y; + + float c = SIGN(dx1 * dy2 - dx2 * dy1) * PATH_ARC_MAGIC; + + nvgBezierTo(ctx, + start_x - c * dy1, start_y + c * dx1, + end_x - c * dy2, end_y + c * dx2, + end_x, end_y); + LV_PROFILER_DRAW_END; +} + +void lv_nanovg_path_append_arc(NVGcontext * ctx, + float cx, float cy, + float radius, + float start_angle, + float sweep, + bool pie) +{ + LV_PROFILER_DRAW_BEGIN; + + if(radius <= 0) { + LV_PROFILER_DRAW_END; + return; + } + + /* just circle */ + if(sweep >= 360.0f || sweep <= -360.0f) { + nvgCircle(ctx, cx, cy, radius); + LV_PROFILER_DRAW_END; + return; + } + + start_angle = NVG_MATH_RADIANS(start_angle); + sweep = NVG_MATH_RADIANS(sweep); + + int n_curves = (int)ceil(NVG_MATH_FABSF(sweep / NVG_MATH_HALF_PI)); + float sweep_sign = sweep < 0 ? -1.f : 1.f; + float fract = fmodf(sweep, NVG_MATH_HALF_PI); + fract = (nvg_math_is_zero(fract)) ? NVG_MATH_HALF_PI * sweep_sign : fract; + + /* Start from here */ + float start_x = radius * NVG_MATH_COSF(start_angle); + float start_y = radius * NVG_MATH_SINF(start_angle); + + if(pie) { + nvgMoveTo(ctx, cx, cy); + nvgLineTo(ctx, start_x + cx, start_y + cy); + } + + for(int i = 0; i < n_curves; ++i) { + float end_angle = start_angle + ((i != n_curves - 1) ? NVG_MATH_HALF_PI * sweep_sign : fract); + float end_x = radius * NVG_MATH_COSF(end_angle); + float end_y = radius * NVG_MATH_SINF(end_angle); + + /* variables needed to calculate bezier control points */ + + /** get bezier control points using article: + * (http://itc.ktu.lt/index.php/ITC/article/view/11812/6479) + */ + float ax = start_x; + float ay = start_y; + float bx = end_x; + float by = end_y; + float q1 = ax * ax + ay * ay; + float q2 = ax * bx + ay * by + q1; + float k2 = (4.0f / 3.0f) * ((NVG_MATH_SQRTF(2 * q1 * q2) - q2) / (ax * by - ay * bx)); + + /* Next start point is the current end point */ + start_x = end_x; + start_y = end_y; + + end_x += cx; + end_y += cy; + + float ctrl1_x = ax - k2 * ay + cx; + float ctrl1_y = ay + k2 * ax + cy; + float ctrl2_x = bx + k2 * by + cx; + float ctrl2_y = by - k2 * bx + cy; + + nvgBezierTo(ctx, ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, end_x, end_y); + start_angle = end_angle; + } + + if(pie) { + nvgClosePath(ctx); + } + + LV_PROFILER_DRAW_END; +} + +void lv_nanovg_fill(NVGcontext * ctx, enum NVGwinding winding, enum NVGcompositeOperation composite_operation, + NVGcolor color) +{ + LV_ASSERT_NULL(ctx); + LV_PROFILER_DRAW_BEGIN; + nvgPathWinding(ctx, winding); + nvgGlobalCompositeOperation(ctx, composite_operation); + nvgFillColor(ctx, color); + nvgFill(ctx); + LV_PROFILER_DRAW_END; +} + +void lv_nanovg_end_frame(struct _lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_PROFILER_DRAW_BEGIN; + + if(!u->is_started) { + LV_PROFILER_DRAW_END; + return; + } + + LV_PROFILER_DRAW_BEGIN_TAG("nvgEndFrame"); + nvgEndFrame(u->vg); + LV_PROFILER_DRAW_END_TAG("nvgEndFrame"); + + lv_nanovg_clean_up(u); + + LV_PROFILER_DRAW_END; +} + +void lv_nanovg_clean_up(struct _lv_draw_nanovg_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_PROFILER_DRAW_BEGIN; + + lv_pending_remove_all(u->image_pending); + lv_pending_remove_all(u->letter_pending); + u->is_started = false; + + LV_PROFILER_DRAW_END; +} + +lv_draw_buf_t * lv_nanovg_reshape_global_image(struct _lv_draw_nanovg_unit_t * u, + lv_color_format_t cf, + uint32_t w, + uint32_t h) +{ + LV_ASSERT_NULL(u); + + uint32_t stride = (w * lv_color_format_get_bpp(cf) + 7) >> 3; + lv_draw_buf_t * tmp_buf = lv_draw_buf_reshape(u->image_buf, cf, w, h, stride); + + if(!tmp_buf) { + if(u->image_buf) { + lv_draw_buf_destroy(u->image_buf); + u->image_buf = NULL; + } + + tmp_buf = lv_draw_buf_create(w, h, cf, stride); + if(!tmp_buf) { + return NULL; + } + } + + u->image_buf = tmp_buf; + + return u->image_buf; +} + +/********************** +* STATIC FUNCTIONS +**********************/ + +#endif /* LV_USE_DRAW_NANOVG */ diff --git a/inc/lvgl/src/draw/nanovg/lv_nanovg_utils.h b/inc/lvgl/src/draw/nanovg/lv_nanovg_utils.h new file mode 100644 index 0000000..d1cb305 --- /dev/null +++ b/inc/lvgl/src/draw/nanovg/lv_nanovg_utils.h @@ -0,0 +1,189 @@ +/** + * @file lv_nanovg_utils.h + * + */ + +#ifndef LV_NANOVG_UTILS_H +#define LV_NANOVG_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_NANOVG + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_matrix.h" +#include "../../misc/lv_color.h" +#include "../../libs/nanovg/nanovg.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_nanovg_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize NanoVG utilities + * @param u pointer to the nanovg unit + */ +void lv_nanovg_utils_init(struct _lv_draw_nanovg_unit_t * u); + +/** + * Deinitialize NanoVG utilities + * @param u pointer to the nanovg unit + */ +void lv_nanovg_utils_deinit(struct _lv_draw_nanovg_unit_t * u); + +/** + * Convert an LVGL matrix to a NanoVG transform (3x2 matrix) + * @param xform the NanoVG transform array (6 floats) + * @param matrix the LVGL matrix + */ +static inline void lv_nanovg_matrix_convert(float * xform, const lv_matrix_t * matrix) +{ + LV_ASSERT_NULL(xform); + LV_ASSERT_NULL(matrix); + xform[0] = matrix->m[0][0]; + xform[1] = matrix->m[1][0]; + xform[2] = matrix->m[0][1]; + xform[3] = matrix->m[1][1]; + xform[4] = matrix->m[0][2]; + xform[5] = matrix->m[1][2]; +} + +/** + * Convert an LVGL color to a NanoVG color + * @param color the LVGL color + * @param opa the opacity + * @return the NanoVG color + */ +static inline NVGcolor lv_nanovg_color_convert(lv_color_t color, lv_opa_t opa) +{ + return nvgRGBA(color.red, color.green, color.blue, opa); +} + +/** + * Apply a transform matrix to the NanoVG context + * @param ctx the NanoVG context + * @param matrix the transform matrix + */ +void lv_nanovg_transform(NVGcontext * ctx, const lv_matrix_t * matrix); + +/** + * Set the clipping area + * @param ctx the NanoVG context + * @param area the clipping area + */ +void lv_nanovg_set_clip_area(NVGcontext * ctx, const lv_area_t * area); + +/** + * Append a rectangle to the path + * @param ctx the NanoVG context + * @param x the x coordinate of the rectangle + * @param y the y coordinate of the rectangle + * @param w the width of the rectangle + * @param h the height of the rectangle + * @param r the radius of the rectangle (0 for no rounding) + */ +void lv_nanovg_path_append_rect(NVGcontext * ctx, float x, float y, float w, float h, float r); + +/** + * Append an area to the path + * @param ctx the NanoVG context + * @param area the area + */ +void lv_nanovg_path_append_area(NVGcontext * ctx, const lv_area_t * area); + +/** + * Append a right angle arc to the path + * @param ctx the NanoVG context + * @param start_x the starting x coordinate + * @param start_y the starting y coordinate + * @param center_x the center x coordinate + * @param center_y the center y coordinate + * @param end_x the ending x coordinate + * @param end_y the ending y coordinate + */ +void lv_nanovg_path_append_arc_right_angle(NVGcontext * ctx, + float start_x, float start_y, + float center_x, float center_y, + float end_x, float end_y); + +/** + * Append an arc to the path + * @param ctx the NanoVG context + * @param cx the center x coordinate + * @param cy the center y coordinate + * @param radius the radius + * @param start_angle the starting angle in radians + * @param sweep the sweep angle in radians + * @param pie whether to draw a pie slice (connected to center) + */ +void lv_nanovg_path_append_arc(NVGcontext * ctx, + float cx, float cy, + float radius, + float start_angle, + float sweep, + bool pie); + +/** + * Fill the current path + * @param ctx the NanoVG context + * @param winding the winding rule + * @param composite_operation the blend mode + * @param color the fill color + */ +void lv_nanovg_fill(NVGcontext * ctx, enum NVGwinding winding, enum NVGcompositeOperation composite_operation, + NVGcolor color); + +/** + * End the current frame + * @param u pointer to the nanovg unit + */ +void lv_nanovg_end_frame(struct _lv_draw_nanovg_unit_t * u); + +/** + * Clean up the NanoVG unit (e.g. at the end of task) + * @param u pointer to the nanovg unit + */ +void lv_nanovg_clean_up(struct _lv_draw_nanovg_unit_t * u); + +/** + * Reshape the global image buffer + * @param u pointer to the nanovg unit + * @param cf the color format + * @param w the new width + * @param h the new height + * @return pointer to the resized draw buffer + */ +lv_draw_buf_t * lv_nanovg_reshape_global_image(struct _lv_draw_nanovg_unit_t * u, + lv_color_format_t cf, + uint32_t w, + uint32_t h); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_NANOVG */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NANOVG_UTILS_H*/ diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx.c new file mode 100644 index 0000000..f00e566 --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx.c @@ -0,0 +1,416 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_refr.h" + +#if LV_USE_NEMA_GFX + +#include "lv_draw_nema_gfx.h" +#include "../../font/lv_font.h" +#include "../../font/fmt_txt/lv_font_fmt_txt.h" + +/********************* + * DEFINES + *********************/ + +#define DRAW_UNIT_ID_NEMA_GFX 7 + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_OS +/** + * Structure of pending nema_gfx draw task + */ +typedef struct _nema_gfx_draw_task_t { + lv_draw_task_t * task; + bool flushed; +} nema_gfx_draw_task_t; +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_USE_OS + static void nema_gfx_render_thread_cb(void * ptr); +#endif + +static void nema_gfx_execute_drawing(lv_draw_nema_gfx_unit_t * u); + +static int32_t nema_gfx_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static int32_t nema_gfx_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +static int32_t nema_gfx_delete(lv_draw_unit_t * draw_unit); + +static int32_t nema_gfx_wait_for_finish(lv_draw_unit_t * draw_unit); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nema_gfx_init(void) +{ + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = lv_draw_create_unit(sizeof(lv_draw_nema_gfx_unit_t)); + /*Initialize NemaGFX*/ + nema_init(); + + draw_nema_gfx_unit->base_unit.dispatch_cb = nema_gfx_dispatch; + draw_nema_gfx_unit->base_unit.evaluate_cb = nema_gfx_evaluate; + draw_nema_gfx_unit->base_unit.delete_cb = nema_gfx_delete; + draw_nema_gfx_unit->base_unit.wait_for_finish_cb = nema_gfx_wait_for_finish; + draw_nema_gfx_unit->base_unit.name = "NEMA_GFX"; + +#if LV_USE_NEMA_VG + /*Initialize NemaVG */ + nema_vg_init(LV_NEMA_GFX_MAX_RESX, LV_NEMA_GFX_MAX_RESY); + /* Allocate VG Buffers*/ + draw_nema_gfx_unit->paint = nema_vg_paint_create(); + draw_nema_gfx_unit->gradient = nema_vg_grad_create(); + draw_nema_gfx_unit->path = nema_vg_path_create(); + /*Initialize Freetype Support*/ + lv_draw_nema_gfx_label_init(&(draw_nema_gfx_unit->base_unit)); +#endif + /*Create GPU Command List*/ + draw_nema_gfx_unit->cl = nema_cl_create(); + /*Bind Command List*/ + nema_cl_bind_circular(&(draw_nema_gfx_unit->cl)); + + +#if LV_USE_OS + lv_thread_init(&draw_nema_gfx_unit->thread, "nemagfx", LV_DRAW_THREAD_PRIO, nema_gfx_render_thread_cb, 2 * 1024, + draw_nema_gfx_unit); +#endif +} + +void lv_draw_nema_gfx_deinit(void) +{ + return; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t nema_gfx_wait_for_finish(lv_draw_unit_t * draw_unit) +{ + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + nema_cl_wait(&(draw_nema_gfx_unit->cl)); + return 1; +} + +static int32_t nema_gfx_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)draw_unit; + + switch(task->type) { + case LV_DRAW_TASK_TYPE_LAYER: { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } +#if LV_USE_NEMA_VG + case LV_DRAW_TASK_TYPE_TRIANGLE: + case LV_DRAW_TASK_TYPE_ARC: + case LV_DRAW_TASK_TYPE_FILL: { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } +#else + case LV_DRAW_TASK_TYPE_FILL: { + lv_draw_fill_dsc_t * draw_fill_dsc = (lv_draw_fill_dsc_t *) task->draw_dsc; + if((draw_fill_dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE)) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } + case LV_DRAW_TASK_TYPE_TRIANGLE: { + lv_draw_triangle_dsc_t * draw_triangle_dsc = (lv_draw_triangle_dsc_t *) task->draw_dsc; + if((draw_triangle_dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE)) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } +#endif + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t * draw_image_dsc = (lv_draw_image_dsc_t *) task->draw_dsc; + /*Guard for previous NemaGFX Version*/ +#ifndef NEMA_BLOP_RECOLOR + if(draw_image_dsc->recolor_opa > LV_OPA_MIN) + break; +#endif + const lv_image_dsc_t * img_dsc = draw_image_dsc->src; + if(!lv_nemagfx_is_cf_supported(img_dsc->header.cf)) + break; + + if(draw_image_dsc->blend_mode != LV_BLEND_MODE_SUBTRACTIVE) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } + case LV_DRAW_TASK_TYPE_LABEL: { + lv_draw_label_dsc_t * draw_label_dsc = (lv_draw_label_dsc_t *) task->draw_dsc; + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)(draw_label_dsc->font->dsc); + if(fdsc->bitmap_format != LV_FONT_FMT_TXT_COMPRESSED) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } + case LV_DRAW_TASK_TYPE_LINE: { + lv_draw_line_dsc_t * draw_line_dsc = (lv_draw_line_dsc_t *) task->draw_dsc; + bool is_dashed = (draw_line_dsc->dash_width && draw_line_dsc->dash_gap); + if(!is_dashed && !(draw_line_dsc->round_end || draw_line_dsc->round_start)) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } + case LV_DRAW_TASK_TYPE_BORDER: { + const lv_draw_border_dsc_t * draw_dsc = (lv_draw_border_dsc_t *) task->draw_dsc; + if((!(draw_dsc->side != (lv_border_side_t)LV_BORDER_SIDE_FULL && draw_dsc->radius > 0)) && + (draw_dsc->radius > draw_dsc->width)) { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } + break; + } +#if LV_USE_VECTOR_GRAPHIC && LV_USE_NEMA_VG + case LV_DRAW_TASK_TYPE_VECTOR: { + if(task->preference_score > 80) { + task->preference_score = 80; + task->preferred_draw_unit_id = DRAW_UNIT_ID_NEMA_GFX; + } + return 1; + } +#endif + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + case LV_DRAW_TASK_TYPE_MASK_BITMAP: + default: + break; + } + nema_cl_wait(&(draw_nema_gfx_unit->cl)); + return 0; +} + +static int32_t nema_gfx_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *) draw_unit; + + /* Return immediately if it's busy with draw task. */ + if(draw_nema_gfx_unit->task_act) + return 0; + + /* Try to get an ready to draw. */ + lv_draw_task_t * t = lv_draw_get_available_task(layer, NULL, DRAW_UNIT_ID_NEMA_GFX); + + /* Return 0 is no selection, some tasks can be supported by other units. */ + if(t == NULL || t->preferred_draw_unit_id != DRAW_UNIT_ID_NEMA_GFX) + return LV_DRAW_UNIT_IDLE; + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) + return LV_DRAW_UNIT_IDLE; + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_nema_gfx_unit->task_act = t; + +#if LV_USE_OS + /* Let the render thread work. */ + if(draw_nema_gfx_unit->inited) + lv_thread_sync_signal(&draw_nema_gfx_unit->sync); +#else + nema_gfx_execute_drawing(draw_nema_gfx_unit); + + draw_nema_gfx_unit->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + draw_nema_gfx_unit->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); +#endif + + return 1; +} + +static void nema_gfx_execute_drawing(lv_draw_nema_gfx_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + /* remember draw unit for access to unit's context */ + t->draw_unit = (lv_draw_unit_t *)u; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_nema_gfx_fill(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_nema_gfx_img(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_nema_gfx_triangle(t, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_nema_gfx_label(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_nema_gfx_layer(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_line_iterate(t, t->draw_dsc, lv_draw_nema_gfx_line); + break; +#if LV_USE_NEMA_VG + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_nema_gfx_arc(t, t->draw_dsc, &t->area); + break; +#endif + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_nema_gfx_border(t, t->draw_dsc, &t->area); + break; +#if LV_USE_VECTOR_GRAPHIC && LV_USE_NEMA_VG + case LV_DRAW_TASK_TYPE_VECTOR: + lv_draw_nema_gfx_vector(t, t->draw_dsc, &t->area); + break; +#endif + default: + break; + } +} + +static int32_t nema_gfx_delete(lv_draw_unit_t * draw_unit) +{ +#if LV_USE_NEMA_VG + /*Free VG Buffers*/ + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *) draw_unit; + nema_vg_paint_destroy(draw_nema_gfx_unit->paint); + nema_vg_path_destroy(draw_nema_gfx_unit->path); + nema_vg_grad_destroy(draw_nema_gfx_unit->gradient); +#endif + +#if LV_USE_OS + lv_draw_nema_gfx_unit_t * _draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *) draw_unit; + LV_LOG_INFO("Cancel NemaGFX draw thread."); + _draw_nema_gfx_unit->exit_status = true; + + if(_draw_nema_gfx_unit->inited) + lv_thread_sync_signal(&_draw_nema_gfx_unit->sync); + + lv_result_t res = lv_thread_delete(&_draw_nema_gfx_unit->thread); + + return res; +#endif + +#if LV_USE_NEMA_VG == 0 && LV_USE_OS == LV_OS_NONE + LV_UNUSED(draw_unit); +#endif + return 0; +} + +#if LV_USE_OS +static void nema_gfx_render_thread_cb(void * ptr) +{ + lv_draw_nema_gfx_unit_t * u = ptr; + + lv_thread_sync_init(&u->sync); + u->inited = true; + + while(1) { + /* Wait for sync if there is no task set. */ + while(u->task_act == NULL) { + if(u->exit_status) + break; + + lv_thread_sync_wait(&u->sync); + } + + if(u->exit_status) { + LV_LOG_INFO("Ready to exit NemaGFX draw thread."); + break; + } + + if(u->task_act) { + nema_gfx_execute_drawing(u); + } + /* Signal the ready state to dispatcher. */ + u->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + /* Cleanup. */ + u->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); + } + + u->inited = false; + lv_thread_sync_delete(&u->sync); + LV_LOG_INFO("Exit NemaGFX draw thread."); +} +#endif + +#endif diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx.h b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx.h new file mode 100644 index 0000000..23334ee --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx.h @@ -0,0 +1,131 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx.h + * + */ + +#ifndef LV_DRAW_NEMA_GFX_H +#define LV_DRAW_NEMA_GFX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_NEMA_GFX + +#include "lv_draw_nema_gfx_utils.h" + +#include "../lv_draw_private.h" +#include "../lv_draw_buf_private.h" +#include "../lv_draw_image_private.h" +#include "../lv_image_decoder_private.h" +#include "../lv_draw_label_private.h" +#include "../lv_draw_mask.h" +#include "../lv_draw_rect_private.h" +#include "../lv_draw_triangle_private.h" +#include "../lv_draw_vector_private.h" +#include "../lv_draw_line.h" +#include "../lv_draw_arc.h" + +#include "../../misc/lv_area_private.h" + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; +#if LV_USE_OS + lv_thread_sync_t sync; + lv_thread_t thread; + volatile bool inited; + volatile bool exit_status; +#endif + uint32_t idx; + nema_cmdlist_t cl; +#if LV_USE_NEMA_VG + NEMA_VG_PAINT_HANDLE paint; + NEMA_VG_GRAD_HANDLE gradient; + NEMA_VG_PATH_HANDLE path; +#endif +} lv_draw_nema_gfx_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_nema_gfx_init(void); + +void lv_draw_nema_gfx_deinit(void); + +void lv_draw_nema_gfx_fill(lv_draw_task_t * t, + const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_nema_gfx_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc); + +void lv_draw_nema_gfx_img(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_nema_gfx_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_nema_gfx_label_init(lv_draw_unit_t * draw_unit); + +void lv_draw_nema_gfx_layer(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_nema_gfx_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc); + +void lv_draw_nema_gfx_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_nema_gfx_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, + const lv_area_t * coords); + +#if LV_USE_VECTOR_GRAPHIC && LV_USE_NEMA_VG +void lv_draw_nema_gfx_vector(lv_draw_task_t * t, const lv_draw_vector_dsc_t * dsc, + const lv_area_t * coords); +#endif + + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_NEMA_GFX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_NEMA_GFX_H*/ diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_arc.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_arc.c new file mode 100644 index 0000000..40115ac --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_arc.c @@ -0,0 +1,105 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX && LV_USE_NEMA_VG + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ + + LV_UNUSED(coords); + + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(dsc->start_angle == dsc->end_angle) + return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + + lv_layer_t * layer = t->target_layer; + lv_point_t center = {dsc->center.x - layer->buf_area.x1, dsc->center.y - layer->buf_area.y1}; + + lv_area_t clip_area; + lv_area_copy(&clip_area, &t->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + lv_value_precise_t start_angle = dsc->start_angle; + lv_value_precise_t end_angle = dsc->end_angle; + + if(start_angle >= end_angle) { + end_angle += 360.0f; + } + + if(end_angle - start_angle > 360.0f) { + start_angle = 0.0f; + end_angle = 360.0f; + } + else { + while(end_angle > 360.0f) { + start_angle -= 360.0f; + end_angle -= 360.0f; + } + } + + nema_vg_paint_clear(draw_nema_gfx_unit->paint); + nema_vg_paint_set_type(draw_nema_gfx_unit->paint, NEMA_VG_PAINT_COLOR); + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + nema_vg_paint_set_paint_color(draw_nema_gfx_unit->paint, bg_color); // green + nema_vg_paint_set_stroke_width(draw_nema_gfx_unit->paint, dsc->width); + nema_vg_set_blend(NEMA_BL_SRC_OVER | NEMA_BLOP_SRC_PREMULT); + + if(dsc->rounded == 1) { + nema_vg_draw_ring(center.x, center.y, (float)dsc->radius - (float)dsc->width * 0.5f, start_angle, end_angle, + draw_nema_gfx_unit->paint); + } + else { + nema_vg_draw_ring_generic(center.x, center.y, (float)dsc->radius - (float)dsc->width * 0.5f, start_angle, + end_angle, draw_nema_gfx_unit->paint, 0U); + } + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} + +#endif + diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_border.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_border.c new file mode 100644 index 0000000..bed835e --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_border.c @@ -0,0 +1,226 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_border.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX +#include + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) + return; + if(dsc->width == 0) + return; + if(dsc->side == LV_BORDER_SIDE_NONE) + return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + + lv_layer_t * layer = t->target_layer; + lv_area_t inward_coords; + int32_t width = dsc->width; + + /* Move border inwards to align with software rendered border */ + inward_coords.x1 = coords->x1 + ceil(width / 2.0f); + inward_coords.x2 = coords->x2 - floor(width / 2.0f); + inward_coords.y1 = coords->y1 + ceil(width / 2.0f); + inward_coords.y2 = coords->y2 - floor(width / 2.0f); + + lv_area_move(&inward_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clip_area; + lv_area_copy(&clip_area, &t->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, &inward_coords, &clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + /* the stride should be computed internally for NEMA_TSC images and images missing a stride value */ + int32_t stride = (dst_cf >= LV_COLOR_FORMAT_NEMA_TSC_START && dst_cf <= LV_COLOR_FORMAT_NEMA_TSC_END) ? + -1 : lv_area_get_width(&(layer->buf_area)) * lv_color_format_get_size(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, stride); + + /* Recalculate float Dimensions */ + float x1 = (float)coords->x1 + ((float)width / 2.0f) - (float)layer->buf_area.x1; + float x2 = (float)coords->x2 - ((float)width / 2.0f) - (float)layer->buf_area.x1; + float y1 = (float)coords->y1 + ((float)width / 2.0f) - (float)layer->buf_area.y1; + float y2 = (float)coords->y2 - ((float)width / 2.0f) - (float)layer->buf_area.y1; + float coords_bg_w = x2 - x1 + 1; + float coords_bg_h = y2 - y1 + 1; + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + float radius = (float)LV_MIN(dsc->radius, short_side >> 1); + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + + if(col32.alpha < 255U) { + nema_set_blend_fill(NEMA_BL_SRC_OVER); + bg_color = nema_premultiply_rgba(bg_color); + } + else { + nema_set_blend_fill(NEMA_BL_SRC); + } + + if(radius > 0.0f) { + nema_draw_rounded_rect_aa(x1, y1, coords_bg_w, coords_bg_h, radius, width, bg_color); + } + else { + lv_area_t rect_coords = *coords; + lv_area_move(&rect_coords, -layer->buf_area.x1, -layer->buf_area.y1); + int32_t border_width = lv_area_get_width(&rect_coords); + int32_t border_height = lv_area_get_height(&rect_coords); + + if(dsc->side & LV_BORDER_SIDE_TOP) { + float x = rect_coords.x1 + width; + float y = rect_coords.y1; + float w = border_width - 2 * width; + float h = width; + nema_enable_aa(1, 0, 1, 0); + nema_fill_rect_f(x, y, w, h, bg_color); + } + + if(dsc->side & LV_BORDER_SIDE_BOTTOM) { + float x = rect_coords.x1 + width; + float y = rect_coords.y1 + border_height - width; + float w = border_width - 2 * width; + float h = width; + nema_enable_aa(1, 0, 1, 0); + nema_fill_rect_f(x, y, w, h, bg_color); + } + + if(dsc->side & LV_BORDER_SIDE_LEFT) { + float x = rect_coords.x1; + float y = rect_coords.y1 + width; + float w = width; + float h = border_height - 2 * width; + nema_enable_aa(0, 1, 0, 1); + nema_fill_rect_f(x, y, w, h, bg_color); + } + + if(dsc->side & LV_BORDER_SIDE_RIGHT) { + float x = rect_coords.x1 + border_width - width; + float y = rect_coords.y1 + width; + float w = width; + float h = border_height - 2 * width; + nema_enable_aa(0, 1, 0, 1); + nema_fill_rect_f(x, y, w, h, bg_color); + } + + /*Draw small corner rectangles + Top Left*/ + if(dsc->side & LV_BORDER_SIDE_TOP || dsc->side & LV_BORDER_SIDE_LEFT) { + float x = rect_coords.x1; + float y = rect_coords.y1; + float w = width; + float h = width; + + if(!(dsc->side & LV_BORDER_SIDE_TOP)) + nema_enable_aa(1, 1, 0, 1); + else if(!(dsc->side & LV_BORDER_SIDE_LEFT)) + nema_enable_aa(1, 0, 1, 1); + else + nema_enable_aa(1, 0, 0, 1); + + nema_fill_rect_f(x, y, w, h, bg_color); + } + + /*Top Right*/ + if(dsc->side & LV_BORDER_SIDE_TOP || dsc->side & LV_BORDER_SIDE_RIGHT) { + float x = rect_coords.x1 + border_width - width; + float y = rect_coords.y1; + float w = width; + float h = width; + + if(!(dsc->side & LV_BORDER_SIDE_TOP)) + nema_enable_aa(1, 1, 0, 1); + else if(!(dsc->side & LV_BORDER_SIDE_RIGHT)) + nema_enable_aa(1, 1, 1, 0); + else + nema_enable_aa(1, 1, 0, 0); + + nema_fill_rect_f(x, y, w, h, bg_color); + } + + /*Bottom Right*/ + if(dsc->side & LV_BORDER_SIDE_BOTTOM || dsc->side & LV_BORDER_SIDE_RIGHT) { + float x = rect_coords.x1 + border_width - width; + float y = rect_coords.y1 + border_height - width; + float w = width; + float h = width; + + if(!(dsc->side & LV_BORDER_SIDE_BOTTOM)) + nema_enable_aa(0, 1, 1, 1); + else if(!(dsc->side & LV_BORDER_SIDE_RIGHT)) + nema_enable_aa(1, 1, 1, 0); + else + nema_enable_aa(0, 1, 1, 0); + + nema_fill_rect_f(x, y, w, h, bg_color); + } + + /*Bottom Left*/ + if(dsc->side & LV_BORDER_SIDE_BOTTOM || dsc->side & LV_BORDER_SIDE_LEFT) { + float x = rect_coords.x1; + float y = rect_coords.y1 + border_height - width; + float w = width; + float h = width; + + if(!(dsc->side & LV_BORDER_SIDE_BOTTOM)) + nema_enable_aa(0, 1, 1, 1); + else if(!(dsc->side & LV_BORDER_SIDE_LEFT)) + nema_enable_aa(1, 0, 1, 1); + else + nema_enable_aa(0, 0, 1, 1); + + nema_fill_rect_f(x, y, w, h, bg_color); + } + + } + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} +#endif diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_fill.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_fill.c new file mode 100644 index 0000000..e079277 --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_fill.c @@ -0,0 +1,182 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + + lv_layer_t * layer = t->target_layer; + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, &t->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + nema_set_clip(rel_clip_area.x1, rel_clip_area.y1, lv_area_get_width(&rel_clip_area), + lv_area_get_height(&rel_clip_area)); + + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + /* the stride should be computed internally for NEMA_TSC images and images missing a stride value */ + int32_t stride = (dst_cf >= LV_COLOR_FORMAT_NEMA_TSC_START && dst_cf <= LV_COLOR_FORMAT_NEMA_TSC_END) ? + -1 : lv_area_get_width(&(layer->buf_area)) * lv_color_format_get_size(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, stride); + + int32_t coords_bg_w = lv_area_get_width(&rel_coords); + int32_t coords_bg_h = lv_area_get_height(&rel_coords); + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + int32_t radius = LV_MIN(dsc->radius, short_side >> 1); + + if((dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE)) { + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + + if(col32.alpha < 255U) { + nema_set_blend_fill(NEMA_BL_SRC_OVER); + bg_color = nema_premultiply_rgba(bg_color); + } + else { + nema_set_blend_fill(NEMA_BL_SRC); + } + + if(radius > 0.f) + nema_fill_rounded_rect_aa(rel_coords.x1, rel_coords.y1, coords_bg_w, coords_bg_h, radius, bg_color); + else + nema_fill_rect(rel_coords.x1, rel_coords.y1, coords_bg_w, coords_bg_h, bg_color); + } +#if LV_USE_NEMA_VG + else { + + nema_vg_paint_clear(draw_nema_gfx_unit->paint); + + nema_vg_set_blend(NEMA_BL_SRC_OVER | NEMA_BLOP_SRC_PREMULT); + + float stops[LV_GRADIENT_MAX_STOPS]; + color_var_t colors[LV_GRADIENT_MAX_STOPS]; + + uint32_t cnt = LV_MIN(dsc->grad.stops_count, LV_GRADIENT_MAX_STOPS); + + for(uint8_t i = 0; i < cnt; i++) { + stops[i] = (float)(dsc->grad.stops[i].frac) / 255.f; + colors[i].a = LV_OPA_MIX2(dsc->grad.stops[i].opa, dsc->opa); + colors[i].r = dsc->grad.stops[i].color.red; + colors[i].g = dsc->grad.stops[i].color.green; + colors[i].b = dsc->grad.stops[i].color.blue; + } + + nema_vg_grad_set(draw_nema_gfx_unit->gradient, cnt, stops, colors); + + nema_tex_mode_t extend_type; + switch(dsc->grad.extend) { + case LV_GRAD_EXTEND_REPEAT: + extend_type = NEMA_TEX_REPEAT; + break; + case LV_GRAD_EXTEND_REFLECT: + extend_type = NEMA_TEX_MIRROR; + break; + case LV_GRAD_EXTEND_PAD: + default: + extend_type = NEMA_TEX_CLAMP; + break; + } + + if(dsc->grad.dir == LV_GRAD_DIR_VER || dsc->grad.dir == LV_GRAD_DIR_HOR + || dsc->grad.dir == LV_GRAD_DIR_LINEAR) { + nema_vg_paint_set_type(draw_nema_gfx_unit->paint, NEMA_VG_PAINT_GRAD_LINEAR); + + float x0, y0, x1, y1; + + if(dsc->grad.dir == LV_GRAD_DIR_HOR) { + x0 = rel_coords.x1; + x1 = rel_coords.x2; + y0 = rel_coords.y1; + y1 = rel_coords.y2; + } + else if(dsc->grad.dir == LV_GRAD_DIR_VER) { + x0 = rel_coords.x1; + x1 = rel_coords.x1; + y0 = rel_coords.y1; + y1 = rel_coords.y2; + } + else { + x0 = rel_coords.x1 + lv_pct_to_px(dsc->grad.params.linear.start.x, lv_area_get_width(coords)); + x1 = rel_coords.x1 + lv_pct_to_px(dsc->grad.params.linear.end.x, lv_area_get_width(coords)); + y0 = rel_coords.y1 + lv_pct_to_px(dsc->grad.params.linear.start.y, lv_area_get_height(coords)); + y1 = rel_coords.y1 + lv_pct_to_px(dsc->grad.params.linear.end.y, lv_area_get_height(coords)); + } + + nema_vg_paint_set_grad_linear(draw_nema_gfx_unit->paint, draw_nema_gfx_unit->gradient, x0, y0, x1, y1, + extend_type | NEMA_FILTER_BL); + } + else if(dsc->grad.dir == LV_GRAD_DIR_RADIAL) { + nema_vg_paint_set_type(draw_nema_gfx_unit->paint, NEMA_VG_PAINT_GRAD_RADIAL); + + nema_vg_paint_set_grad_radial(draw_nema_gfx_unit->paint, draw_nema_gfx_unit->gradient, + rel_coords.x1 + dsc->grad.params.radial.end.x, + rel_coords.y1 + dsc->grad.params.radial.end.y, + LV_ABS(dsc->grad.params.radial.end_extent.x - dsc->grad.params.radial.end.x), + extend_type | NEMA_FILTER_BL); + } + + if(radius > 0.f) + nema_vg_draw_rounded_rect(rel_coords.x1, rel_coords.y1, coords_bg_w, coords_bg_h, radius, radius, NULL, + draw_nema_gfx_unit->paint); + else + nema_vg_draw_rect(rel_coords.x1, rel_coords.y1, coords_bg_w, coords_bg_h, NULL, draw_nema_gfx_unit->paint); + } +#endif + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} +#endif diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_img.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_img.c new file mode 100644 index 0000000..6bba9fc --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_img.c @@ -0,0 +1,235 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_img.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _draw_nema_gfx_img(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +static uint32_t lv_nemagfx_mask_cf_to_nema(lv_color_format_t cf); + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _draw_nema_gfx_img(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + + lv_layer_t * layer = t->target_layer; + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + const lv_image_header_t * header = &decoded->header; + + bool masked = dsc->bitmap_mask_src != NULL; + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, clipped_img_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + bool has_transform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); + bool recolor = (dsc->recolor_opa > LV_OPA_MIN); + + uint32_t tex_w = header->w; + uint32_t tex_h = header->h; + + nema_set_clip(rel_clip_area.x1, rel_clip_area.y1, lv_area_get_width(&rel_clip_area), + lv_area_get_height(&rel_clip_area)); + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + const void * src_buf = decoded->data; + + uint32_t blending_mode = lv_nemagfx_blending_mode(dsc->blend_mode); + + lv_color_format_t src_cf = header->cf; + + /*Image contains Alpha*/ + if(src_cf == LV_COLOR_FORMAT_ARGB8888 || src_cf == LV_COLOR_FORMAT_XRGB8888) { + blending_mode |= NEMA_BLOP_SRC_PREMULT; + } + + uint32_t src_nema_cf = lv_nemagfx_cf_to_nema(src_cf); + /* the stride should be computed internally for NEMA_TSC images and images missing a stride value */ + int32_t src_stride = (src_cf >= LV_COLOR_FORMAT_NEMA_TSC_START && src_cf <= LV_COLOR_FORMAT_NEMA_TSC_END) + || header->stride == 0 ? -1 : (int32_t)header->stride; + + int32_t stride = (dst_cf >= LV_COLOR_FORMAT_NEMA_TSC_START && dst_cf <= LV_COLOR_FORMAT_NEMA_TSC_END) ? + -1 : lv_area_get_width(&(layer->buf_area)) * lv_color_format_get_size(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, stride); + + if(!LV_COLOR_FORMAT_IS_INDEXED(src_cf)) { + nema_bind_src_tex((uintptr_t)(src_buf), tex_w, tex_h, src_nema_cf, src_stride, + dsc->antialias ? NEMA_FILTER_BL : NEMA_FILTER_PS); + } + else { + nema_bind_lut_tex((uintptr_t)((uint8_t *)src_buf + LV_COLOR_INDEXED_PALETTE_SIZE(src_cf) * 4), tex_w, tex_h, + src_nema_cf, src_stride, NEMA_FILTER_PS, (uintptr_t)(src_buf), NEMA_BGRA8888); + blending_mode |= NEMA_BLOP_LUT; + } + + /*Guard for previous NemaGFX Version*/ +#ifdef NEMA_BLOP_RECOLOR + if(recolor) { + lv_color32_t col32 = lv_color_to_32(dsc->recolor, LV_OPA_MIX2(dsc->recolor_opa, dsc->opa)); + uint32_t color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + nema_set_recolor_color(color); + blending_mode |= NEMA_BLOP_RECOLOR; + } +#endif + + if(dsc->opa < 255) { + uint32_t rgba = ((uint32_t)dsc->opa << 24U) | ((uint32_t)dsc->opa << 16U) | ((uint32_t)dsc->opa << 8U) | (( + uint32_t)dsc->opa); + nema_set_const_color(rgba); + blending_mode |= NEMA_BLOP_MODULATE_A; + } + + if(!has_transform && masked && !recolor) { + if(dsc->bitmap_mask_src->header.cf == LV_COLOR_FORMAT_A8 || dsc->bitmap_mask_src->header.cf == LV_COLOR_FORMAT_L8) { + blending_mode |= NEMA_BLOP_STENCIL_TXTY; + const lv_image_dsc_t * mask = dsc->bitmap_mask_src; + const void * mask_buf = mask->data; + + const lv_area_t * image_area; + lv_area_t mask_area; + if(lv_area_get_width(&dsc->image_area) < 0) image_area = img_coords; + else image_area = &dsc->image_area; + + lv_area_set(&mask_area, 0, 0, dsc->bitmap_mask_src->header.w - 1, dsc->bitmap_mask_src->header.h - 1); + lv_area_align(image_area, &mask_area, LV_ALIGN_CENTER, 0, 0); + + mask_buf += dsc->bitmap_mask_src->header.w * (img_coords->y1 - mask_area.y1) + (img_coords->x1 - mask_area.x1); + + nema_bind_tex(NEMA_TEX3, (uintptr_t)NEMA_VIRT2PHYS(mask_buf), mask->header.w, mask->header.h, + lv_nemagfx_mask_cf_to_nema(mask->header.cf), + mask->header.stride, NEMA_FILTER_BL); + } + } + + nema_set_blend_blit(blending_mode); + + if(!has_transform) { + nema_blit_rect((img_coords->x1 - layer->buf_area.x1), + (img_coords->y1 - layer->buf_area.y1), tex_w, tex_h); + } + else { + /*Calculate the transformed points*/ + float x0 = (img_coords->x1 - layer->buf_area.x1); + float y0 = (img_coords->y1 - layer->buf_area.y1); + float x1 = x0 + tex_w ; + float y1 = y0; + float x2 = x0 + tex_w ; + float y2 = y0 + tex_h; + float x3 = x0 ; + float y3 = y0 + tex_h; + + nema_matrix3x3_t m; + nema_mat3x3_load_identity(m); + nema_mat3x3_translate(m, -x0, -y0); + nema_mat3x3_translate(m, -(float)dsc->pivot.x, -(float)dsc->pivot.y); + nema_mat3x3_rotate(m, (dsc->rotation / 10.0f)); /* angle is 1/10 degree */ + float scale_x = 1.f * dsc->scale_x / LV_SCALE_NONE; + float scale_y = 1.f * dsc->scale_y / LV_SCALE_NONE; + nema_mat3x3_scale(m, (float)scale_x, (float)scale_y); + nema_mat3x3_translate(m, (float)dsc->pivot.x, (float)dsc->pivot.y); + nema_mat3x3_translate(m, x0, y0); + + /*Apply Transformation Matrix to Vertices*/ + nema_mat3x3_mul_vec(m, &x0, &y0); + nema_mat3x3_mul_vec(m, &x1, &y1); + nema_mat3x3_mul_vec(m, &x2, &y2); + nema_mat3x3_mul_vec(m, &x3, &y3); + + nema_blit_quad_fit(x0, y0, + x1, y1, + x2, y2, + x3, y3); + } + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} + +/*NemaGFX does mask operations with A8,A4,A2 and A1 formats*/ +static uint32_t lv_nemagfx_mask_cf_to_nema(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A1: + return NEMA_A1; + case LV_COLOR_FORMAT_A2: + return NEMA_A2; + case LV_COLOR_FORMAT_A4: + return NEMA_A4; + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_L8: + default: + break; + } + + return NEMA_A8; +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_img(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords) +{ + const lv_image_decoder_args_t args = { + .use_indexed = true, + }; + + if(!dsc->tile) { + lv_draw_image_normal_helper(t, dsc, coords, _draw_nema_gfx_img, &args); + } + else { + lv_draw_image_tiled_helper(t, dsc, coords, _draw_nema_gfx_img, &args); + } + +} +#endif diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_label.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_label.c new file mode 100644 index 0000000..e270ac7 --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_label.c @@ -0,0 +1,850 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_label.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX +#include "../../misc/lv_utils.h" +#include "../../misc/lv_bidi_private.h" +#include "../../misc/lv_text_private.h" +#include "../../lvgl.h" +#include "../../libs/freetype/lv_freetype_private.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define LABEL_RECOLOR_PAR_LENGTH 6 +#define LV_LABEL_HINT_UPDATE_TH 1024 /*Update the "hint" if the label's y coordinates have changed more then this*/ +#define FT_F26DOT6_SHIFT 6 +#define NEMA_COORD_LIMIT 2046 + +#define font_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->font_draw_buf_handlers) + +/** After converting the font reference size, it is also necessary to scale the 26dot6 data + * in the path to the real physical size + */ +#define FT_F26DOT6_TO_PATH_SCALE(x) (LV_FREETYPE_F26DOT6_TO_FLOAT(x) / (1 << FT_F26DOT6_SHIFT)) + +/*Forward declarations*/ +void nema_set_matrix(nema_matrix3x3_t m); +void nema_raster_rect(int x, int y, int w, int h); + +/********************** + * TYPEDEFS + **********************/ +enum { + RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER, + RECOLOR_CMD_STATE_PARAMETER, + RECOLOR_CMD_STATE_TEXT_INPUT, +}; +typedef unsigned char cmd_state_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _draw_nema_gfx_letter(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +static void _draw_label_iterate_characters(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); + +static inline uint8_t _bpp_nema_gfx_format(lv_draw_glyph_dsc_t * glyph_draw_dsc); + +static void _draw_letter(lv_draw_task_t * t, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, + const lv_font_t * font, uint32_t letter); + +static uint8_t hex_char_to_num(char hex); + +static bool is_raw_bitmap; + +#if LV_USE_FREETYPE && LV_USE_NEMA_VG + + #include "lv_nema_gfx_path.h" + + static void _draw_nema_gfx_outline(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc); + + static void freetype_outline_event_cb(lv_event_t * e); + + static void lv_nema_gfx_outline_push(const lv_freetype_outline_event_param_t * param); + + static void lv_nema_outline_event_alloc(const lv_freetype_outline_event_param_t * param); +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_label_init(lv_draw_unit_t * draw_unit) +{ +#if LV_USE_FREETYPE + /*Set up the freetype outline event*/ + lv_freetype_outline_add_event(freetype_outline_event_cb, LV_EVENT_ALL, draw_unit); +#else + LV_UNUSED(draw_unit); +#endif /* LV_USE_FREETYPE */ +} + +void lv_draw_nema_gfx_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_layer_t * layer = t->target_layer; + + lv_area_t clip_area; + lv_area_copy(&clip_area, &t->clip_area); + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + int32_t stride = (dst_cf >= LV_COLOR_FORMAT_NEMA_TSC_START && dst_cf <= LV_COLOR_FORMAT_NEMA_TSC_END) ? + -1 : lv_area_get_width(&(layer->buf_area)) * lv_color_format_get_size(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, stride); + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + _draw_label_iterate_characters(t, dsc, coords); + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + nema_cl_wait(&(draw_nema_gfx_unit->cl)); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#if LV_USE_FREETYPE && LV_USE_NEMA_VG + +static void _draw_nema_gfx_outline(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc) +{ + + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, glyph_draw_dsc->letter_coords, &t->clip_area)) + return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + + lv_nema_gfx_path_t * nema_gfx_path = (lv_nema_gfx_path_t *)glyph_draw_dsc->glyph_data; + + lv_point_t pos = {glyph_draw_dsc->letter_coords->x1, glyph_draw_dsc->letter_coords->y1}; + + float scale = FT_F26DOT6_TO_PATH_SCALE(lv_freetype_outline_get_scale(glyph_draw_dsc->g->resolved_font)); + + /*Calculate Path Matrix*/ + nema_matrix3x3_t matrix; + nema_mat3x3_load_identity(matrix); + nema_mat3x3_scale(matrix, scale, -scale); + nema_mat3x3_translate(matrix, pos.x - glyph_draw_dsc->g->ofs_x, + pos.y + glyph_draw_dsc->g->box_h + glyph_draw_dsc->g->ofs_y); + + nema_vg_path_clear(nema_gfx_path->path); + nema_vg_paint_clear(nema_gfx_path->paint); + + nema_vg_set_fill_rule(NEMA_VG_FILL_EVEN_ODD); + + nema_vg_path_set_shape(nema_gfx_path->path, nema_gfx_path->seg_size, nema_gfx_path->seg, nema_gfx_path->data_size, + nema_gfx_path->data); + + nema_vg_paint_set_type(nema_gfx_path->paint, NEMA_VG_PAINT_COLOR); + + lv_color32_t dsc_col32 = lv_color_to_32(glyph_draw_dsc->color, glyph_draw_dsc->opa); + uint32_t nema_dsc_color = nema_rgba(dsc_col32.red, dsc_col32.green, dsc_col32.blue, dsc_col32.alpha); + + nema_vg_paint_set_paint_color(nema_gfx_path->paint, nema_dsc_color); + + nema_vg_path_set_matrix(nema_gfx_path->path, matrix); + nema_vg_draw_path(nema_gfx_path->path, nema_gfx_path->paint); + + return; +} + +static void freetype_outline_event_cb(lv_event_t * e) +{ + LV_PROFILER_DRAW_BEGIN; + lv_event_code_t code = lv_event_get_code(e); + lv_freetype_outline_event_param_t * param = lv_event_get_param(e); + + switch(code) { + case LV_EVENT_CREATE: + param->outline = lv_nema_gfx_path_create(); + lv_nema_outline_event_alloc(param); + break; + case LV_EVENT_DELETE: + lv_nema_gfx_path_destroy(param->outline); + break; + case LV_EVENT_INSERT: + lv_nema_gfx_outline_push(param); + break; + default: + LV_LOG_WARN("unknown event code: %d", code); + break; + } + LV_PROFILER_DRAW_END; +} + +static void lv_nema_gfx_outline_push(const lv_freetype_outline_event_param_t * param) +{ + LV_PROFILER_DRAW_BEGIN; + lv_nema_gfx_path_t * outline = param->outline; + LV_ASSERT_NULL(outline); + + lv_freetype_outline_type_t type = param->type; + switch(type) { + case LV_FREETYPE_OUTLINE_END: + lv_nema_gfx_path_end(outline); + break; + case LV_FREETYPE_OUTLINE_MOVE_TO: + lv_nema_gfx_path_move_to(outline, param->to.x, param->to.y); + break; + case LV_FREETYPE_OUTLINE_LINE_TO: + lv_nema_gfx_path_line_to(outline, param->to.x, param->to.y); + break; + case LV_FREETYPE_OUTLINE_CUBIC_TO: + lv_nema_gfx_path_cubic_to(outline, param->control1.x, param->control1.y, + param->control2.x, param->control2.y, + param->to.x, param->to.y); + break; + case LV_FREETYPE_OUTLINE_CONIC_TO: + lv_nema_gfx_path_quad_to(outline, param->control1.x, param->control1.y, + param->to.x, param->to.y); + break; + default: + LV_LOG_ERROR("unknown point type: %d", type); + LV_ASSERT(false); + break; + } + LV_PROFILER_DRAW_END; +} + +static void lv_nema_outline_event_alloc(const lv_freetype_outline_event_param_t * param) +{ + lv_nema_gfx_path_t * outline = param->outline; + outline->data_size = param->sizes.data_size; + outline->seg_size = param->sizes.segments_size; + lv_nema_gfx_path_alloc(outline); +} + +#endif /* LV_USE_FREETYPE && LV_USE_NEMA_VG */ + +/** + * Convert a hexadecimal characters to a number (0..15) + * @param hex Pointer to a hexadecimal character (0..9, A..F) + * @return the numerical value of `hex` or 0 on error + */ +static uint8_t hex_char_to_num(char hex) +{ + if(hex >= '0' && hex <= '9') return hex - '0'; + if(hex >= 'a') hex -= 'a' - 'A'; /*Convert to upper case*/ + return 'A' <= hex && hex <= 'F' ? hex - 'A' + 10 : 0; +} + + +static inline uint8_t _bpp_nema_gfx_format(lv_draw_glyph_dsc_t * glyph_draw_dsc) +{ + uint32_t format = glyph_draw_dsc->g->format; + + switch(format) { + case LV_FONT_GLYPH_FORMAT_A1: + return NEMA_A1; + case LV_FONT_GLYPH_FORMAT_A2: + return NEMA_A2; + case LV_FONT_GLYPH_FORMAT_A4: + return NEMA_A4; + case LV_FONT_GLYPH_FORMAT_A8: + default: + return NEMA_A8; + } +} + +static void _draw_nema_gfx_letter(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + if(glyph_draw_dsc) { + if(glyph_draw_dsc->format == LV_FONT_GLYPH_FORMAT_NONE) { +#if LV_USE_FONT_PLACEHOLDER + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + lv_draw_nema_gfx_border(t, &border_draw_dsc, glyph_draw_dsc->bg_coords); +#endif + } + else if(glyph_draw_dsc->format >= LV_FONT_GLYPH_FORMAT_A1 && + glyph_draw_dsc->format <= LV_FONT_GLYPH_FORMAT_A8) { + /*Do not draw transparent things*/ + if(glyph_draw_dsc->opa <= LV_OPA_MIN) + return; + + lv_layer_t * layer = t->target_layer; + + lv_area_t blend_area; + if(!lv_area_intersect(&blend_area, glyph_draw_dsc->letter_coords, &t->clip_area)) + return; + + const lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; + const void * mask_buf; + uint32_t src_cf; + lv_area_t mask_area = *glyph_draw_dsc->letter_coords; + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, &blend_area); + lv_area_move(&rel_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + int32_t x, y, w, h; + + /*Read the static font*/ + if(is_raw_bitmap) { + mask_buf = glyph_draw_dsc->glyph_data; + src_cf = _bpp_nema_gfx_format(glyph_draw_dsc); + x = glyph_draw_dsc->letter_coords->x1 - layer->buf_area.x1; + y = glyph_draw_dsc->letter_coords->y1 - layer->buf_area.y1; + w = glyph_draw_dsc->g->box_w; + h = glyph_draw_dsc->g->box_h; + } + /*Read the draw buffer*/ + else { + mask_buf = draw_buf->data; + src_cf = lv_nemagfx_cf_to_nema(draw_buf->header.cf); + mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1; + mask_buf += draw_buf->header.stride * (blend_area.y1 - mask_area.y1) + (blend_area.x1 - mask_area.x1); + x = rel_coords.x1; + y = rel_coords.y1; + w = lv_area_get_width(&rel_coords); + h = lv_area_get_height(&rel_coords); + } + + if(is_raw_bitmap && (glyph_draw_dsc->format <= LV_FONT_GLYPH_FORMAT_A4)) { + nema_bind_src_tex((uintptr_t)(mask_buf), w * h, 1, src_cf, glyph_draw_dsc->g->stride, NEMA_FILTER_PS); + nema_matrix3x3_t m = { + {1, w, -x - (y * w) - (0.5 * w)}, + {0, 1, 0}, + {0, 0, 1} + }; + nema_set_matrix(m); + nema_raster_rect(x, y, w, h); + } + else { + nema_bind_src_tex((uintptr_t)(mask_buf), lv_area_get_width(&mask_area), lv_area_get_height(&mask_area), src_cf, + glyph_draw_dsc->g->stride ? glyph_draw_dsc->g->stride : lv_area_get_width(&mask_area), + NEMA_FILTER_BL); + nema_blit_rect(x, y, w, h); + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + nema_cl_wait(&(draw_nema_gfx_unit->cl)); + } + } + else if(glyph_draw_dsc->format == LV_FONT_GLYPH_FORMAT_IMAGE) { +#if LV_USE_IMGFONT + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.angle = 0; + img_dsc.zoom = LV_ZOOM_NONE; + img_dsc.opa = glyph_draw_dsc->opa; + img_dsc.src = glyph_draw_dsc->glyph_data; + lv_draw_nema_gfx_img(t, &img_dsc, glyph_draw_dsc->letter_coords); +#endif + } + +#if LV_USE_FREETYPE && LV_USE_NEMA_VG + else if(glyph_draw_dsc->format == LV_FONT_GLYPH_FORMAT_VECTOR) { + if(lv_freetype_is_outline_font(glyph_draw_dsc->g->resolved_font)) { + _draw_nema_gfx_outline(t, glyph_draw_dsc); + } + } +#endif + + } + + if(fill_draw_dsc && fill_area) { + lv_draw_nema_gfx_fill(t, fill_draw_dsc, fill_area); + } + +} + +static inline void _set_color_blend(uint32_t color, uint8_t alpha) +{ + nema_set_tex_color(color); + + if(alpha < 255U) { + nema_set_blend_blit(NEMA_BL_SIMPLE | NEMA_BLOP_MODULATE_A); + nema_set_const_color(color); + } + else { + nema_set_blend_blit(NEMA_BL_SIMPLE); + } +} + +static void _draw_label_iterate_characters(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords) +{ + const lv_font_t * font = dsc->font; + lv_text_attributes_t attributes = {0}; + attributes.letter_space = dsc->letter_space; + attributes.line_space = dsc->line_space; + attributes.max_width = LV_COORD_MAX; + attributes.text_flags = dsc->flag; + + lv_area_t clipped_area; + bool clip_ok = lv_area_intersect(&clipped_area, coords, &t->clip_area); + if(!clip_ok) return; + + lv_text_align_t align = dsc->align; + lv_base_dir_t base_dir = dsc->bidi_dir; + + lv_bidi_calculate_align(&align, &base_dir, dsc->text); + + if((dsc->flag & LV_TEXT_FLAG_EXPAND) == 0) { + /*Normally use the label's width as width*/ + attributes.max_width = lv_area_get_width(coords); + } + else { + /*If EXPAND is enabled then not limit the text's width to the object's width*/ + lv_point_t p; + lv_text_get_size_attributes(&p, dsc->text, dsc->font, &attributes); + attributes.max_width = p.x; + } + + int32_t line_height_font = lv_font_get_line_height(font); + int32_t line_height = line_height_font + dsc->line_space; + + /*Init variables for the first line*/ + int32_t line_width = 0; + lv_point_t pos; + lv_point_set(&pos, coords->x1, coords->y1); + + int32_t x_ofs = 0; + int32_t y_ofs = 0; + x_ofs = dsc->ofs_x; + y_ofs = dsc->ofs_y; + pos.y += y_ofs; + + uint32_t line_start = 0; + int32_t last_line_start = -1; + + /*Check the hint to use the cached info*/ + if(dsc->hint && y_ofs == 0 && coords->y1 < 0) { + /*If the label changed too much recalculate the hint.*/ + if(LV_ABS(dsc->hint->coord_y - coords->y1) > LV_LABEL_HINT_UPDATE_TH - 2 * line_height) { + dsc->hint->line_start = -1; + } + last_line_start = dsc->hint->line_start; + } + + /*Use the hint if it's valid*/ + if(dsc->hint && last_line_start >= 0) { + line_start = last_line_start; + pos.y += dsc->hint->y; + } + + uint32_t remaining_len = dsc->text_length; + + uint32_t line_end = line_start + lv_text_get_next_line(&dsc->text[line_start], remaining_len, font, NULL, &attributes); + + /*Go the first visible line*/ + while(pos.y + line_height_font < t->clip_area.y1) { + /*Go to next line*/ + line_start = line_end; + line_end += lv_text_get_next_line(&dsc->text[line_start], remaining_len, font, NULL, &attributes); + pos.y += line_height; + + /*Save at the threshold coordinate*/ + if(dsc->hint && pos.y >= -LV_LABEL_HINT_UPDATE_TH && dsc->hint->line_start < 0) { + dsc->hint->line_start = line_start; + dsc->hint->y = pos.y - coords->y1; + dsc->hint->coord_y = coords->y1; + } + + if(dsc->text[line_start] == '\0') return; + } + + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, &attributes); + + pos.x += (lv_area_get_width(coords) - line_width) / 2; + + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, &attributes); + pos.x += lv_area_get_width(coords) - line_width; + } + + uint32_t sel_start = dsc->sel_start; + uint32_t sel_end = dsc->sel_end; + if(sel_start > sel_end) { + uint32_t tmp = sel_start; + sel_start = sel_end; + sel_end = tmp; + } + + lv_area_t bg_coords; + lv_draw_glyph_dsc_t draw_letter_dsc; + lv_draw_glyph_dsc_init(&draw_letter_dsc); + draw_letter_dsc.opa = dsc->opa; + draw_letter_dsc.bg_coords = &bg_coords; + draw_letter_dsc.color = dsc->color; + draw_letter_dsc.rotation = dsc->rotation; + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.opa = dsc->opa; + int32_t underline_width = font->underline_thickness ? font->underline_thickness : 1; + int32_t line_start_x; + uint32_t next_char_offset; + uint32_t recolor_command_start_index = 0; + int32_t letter_w; + + cmd_state_t recolor_cmd_state = RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER; + lv_color_t recolor = lv_color_black(); /* Holds the selected color inside the recolor command */ + uint8_t is_first_space_after_cmd = 0; + + lv_color32_t dsc_col32 = lv_color_to_32(dsc->color, dsc->opa); + uint32_t nema_dsc_color = nema_rgba(dsc_col32.red, dsc_col32.green, dsc_col32.blue, dsc_col32.alpha); + lv_color32_t dsc_sel_col32 = lv_color_to_32(dsc->sel_color, dsc->opa); + uint32_t nema_dsc_sel_color = nema_rgba(dsc_sel_col32.red, dsc_sel_col32.green, dsc_sel_col32.blue, + dsc_sel_col32.alpha); + uint32_t blend_color; + uint8_t blend_alpha = 255; + + _set_color_blend(nema_dsc_color, dsc_col32.alpha); + + uint8_t cur_state = 2; + uint8_t prev_state = 2; + + /*Write out all lines*/ + while(remaining_len && dsc->text[line_start] != '\0') { + pos.x += x_ofs; + line_start_x = pos.x; + + /*Write all letter of a line*/ + next_char_offset = 0; +#if LV_USE_BIDI + char * bidi_txt = lv_malloc(line_end - line_start + 1); + LV_ASSERT_MALLOC(bidi_txt); + lv_bidi_process_paragraph(dsc->text + line_start, bidi_txt, line_end - line_start, base_dir, NULL, 0); +#else + const char * bidi_txt = dsc->text + line_start; +#endif + + while(next_char_offset < remaining_len && next_char_offset < line_end - line_start) { + uint32_t logical_char_pos = 0; + + /* Check if the text selection is enabled */ + if(sel_start != LV_DRAW_LABEL_NO_TXT_SEL && sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { +#if LV_USE_BIDI + logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start); + uint32_t c_idx = lv_text_encoded_get_char_id(bidi_txt, next_char_offset); + logical_char_pos += lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, base_dir, c_idx, NULL); +#else + logical_char_pos = lv_text_encoded_get_char_id(dsc->text, line_start + next_char_offset); +#endif + } + + uint32_t letter; + uint32_t letter_next; + lv_text_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &next_char_offset); + + /* If recolor is enabled */ + if((dsc->flag & LV_TEXT_FLAG_RECOLOR) != 0) { + + if(letter == (uint32_t)LV_TXT_COLOR_CMD[0]) { + /* Handle the recolor command marker depending of the current recolor state */ + + if(recolor_cmd_state == RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER) { + recolor_command_start_index = next_char_offset; + recolor_cmd_state = RECOLOR_CMD_STATE_PARAMETER; + continue; + } + /*Other start char in parameter escaped cmd. char*/ + else if(recolor_cmd_state == RECOLOR_CMD_STATE_PARAMETER) { + recolor_cmd_state = RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER; + } + /* If letter is LV_TXT_COLOR_CMD and we were in the CMD_STATE_IN then the recolor close marked has been found */ + else if(recolor_cmd_state == RECOLOR_CMD_STATE_TEXT_INPUT) { + recolor_cmd_state = RECOLOR_CMD_STATE_WAIT_FOR_PARAMETER; + continue; + } + } + + /* Find the first space (aka ' ') after the recolor command parameter, we need to skip rendering it */ + if((recolor_cmd_state == RECOLOR_CMD_STATE_PARAMETER) && (letter == ' ') && (is_first_space_after_cmd == 0)) { + is_first_space_after_cmd = 1; + } + else { + is_first_space_after_cmd = 0; + } + + /* Skip the color parameter and wait the space after it + * Once we have reach the space ' ', then we will extract the color information + * and store it into the recolor variable */ + if(recolor_cmd_state == RECOLOR_CMD_STATE_PARAMETER) { + /* Not an space? Continue with the next character */ + if(letter != ' ') { + continue; + } + + /*Get the recolor parameter*/ + if((next_char_offset - recolor_command_start_index) == LABEL_RECOLOR_PAR_LENGTH + 1) { + /* Temporary buffer to hold the recolor information */ + char buf[LABEL_RECOLOR_PAR_LENGTH + 1]; + lv_memcpy(buf, &bidi_txt[recolor_command_start_index], LABEL_RECOLOR_PAR_LENGTH); + buf[LABEL_RECOLOR_PAR_LENGTH] = '\0'; + + uint8_t r, g, b; + r = (hex_char_to_num(buf[0]) << 4) + hex_char_to_num(buf[1]); + g = (hex_char_to_num(buf[2]) << 4) + hex_char_to_num(buf[3]); + b = (hex_char_to_num(buf[4]) << 4) + hex_char_to_num(buf[5]); + + recolor = lv_color_make(r, g, b); + } + else { + recolor.red = dsc->color.red; + recolor.blue = dsc->color.blue; + recolor.green = dsc->color.green; + } + + /*After the parameter the text is in the command*/ + recolor_cmd_state = RECOLOR_CMD_STATE_TEXT_INPUT; + } + + /* Don't draw the first space after the recolor command */ + if(is_first_space_after_cmd) { + continue; + } + } + + /* If we're in the CMD_STATE_IN state then we need to subtract the recolor command length */ + if(((dsc->flag & LV_TEXT_FLAG_RECOLOR) != 0) && (recolor_cmd_state == RECOLOR_CMD_STATE_TEXT_INPUT)) { + logical_char_pos -= (LABEL_RECOLOR_PAR_LENGTH + 1); + } + + letter_w = lv_font_get_glyph_width(font, letter, letter_next); + + /*Always set the bg_coordinates for placeholder drawing*/ + bg_coords.x1 = pos.x; + bg_coords.y1 = pos.y; + bg_coords.x2 = pos.x + letter_w - 1; + bg_coords.y2 = pos.y + line_height - 1; + + if(next_char_offset >= line_end - line_start) { + if(dsc->decor & LV_TEXT_DECOR_UNDERLINE) { + lv_area_t fill_area; + fill_area.x1 = line_start_x; + fill_area.x2 = pos.x + letter_w - 1; + fill_area.y1 = pos.y + font->line_height - font->base_line - font->underline_position; + fill_area.y2 = fill_area.y1 + underline_width - 1; + + fill_dsc.color = dsc->color; + lv_draw_nema_gfx_fill(t, &fill_dsc, &fill_area); + } + if(dsc->decor & LV_TEXT_DECOR_STRIKETHROUGH) { + lv_area_t fill_area; + fill_area.x1 = line_start_x; + fill_area.x2 = pos.x + letter_w - 1; + fill_area.y1 = pos.y + (font->line_height - font->base_line) * 2 / 3 + font->underline_thickness / 2; + fill_area.y2 = fill_area.y1 + underline_width - 1; + + fill_dsc.color = dsc->color; + lv_draw_nema_gfx_fill(t, &fill_dsc, &fill_area); + } + } + + /* Handle text selection */ + if(sel_start != LV_DRAW_LABEL_NO_TXT_SEL && sel_end != LV_DRAW_LABEL_NO_TXT_SEL + && logical_char_pos >= sel_start && logical_char_pos < sel_end) { + draw_letter_dsc.color = dsc->sel_color; + fill_dsc.color = dsc->sel_bg_color; + lv_draw_nema_gfx_fill(t, &fill_dsc, &bg_coords); + cur_state = 0 ; + blend_alpha = dsc_sel_col32.alpha; + blend_color = nema_dsc_sel_color; + } + else if(recolor_cmd_state == RECOLOR_CMD_STATE_TEXT_INPUT) { + draw_letter_dsc.color = recolor; + cur_state = 1 ; + blend_alpha = dsc_col32.alpha; + lv_color32_t dsc_recolor_col32 = lv_color_to_32(recolor, dsc->opa); + blend_color = nema_rgba(dsc_recolor_col32.red, dsc_recolor_col32.green, dsc_recolor_col32.blue, + dsc_recolor_col32.alpha); + } + else { + draw_letter_dsc.color = dsc->color; + cur_state = 2; + blend_alpha = dsc_col32.alpha; + blend_color = nema_dsc_color; + } + + if(cur_state != prev_state) { + _set_color_blend(blend_color, blend_alpha); + prev_state = cur_state; + } + + _draw_letter(t, &draw_letter_dsc, &pos, font, letter); + + if(letter_w > 0) { + pos.x += letter_w + dsc->letter_space; + } + } + +#if LV_USE_BIDI + lv_free(bidi_txt); + bidi_txt = NULL; +#endif + /*Go to next line*/ + remaining_len -= line_end - line_start; + line_start = line_end; + if(remaining_len) { + line_end += lv_text_get_next_line(&dsc->text[line_start], remaining_len, font, NULL, &attributes); + } + + pos.x = coords->x1; + /*Align to middle*/ + if(align == LV_TEXT_ALIGN_CENTER) { + line_width = + lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, &attributes); + + pos.x += (lv_area_get_width(coords) - line_width) / 2; + } + /*Align to the right*/ + else if(align == LV_TEXT_ALIGN_RIGHT) { + line_width = + lv_text_get_width(&dsc->text[line_start], line_end - line_start, font, &attributes); + pos.x += lv_area_get_width(coords) - line_width; + } + + /*Go the next line position*/ + pos.y += line_height; + + if(pos.y > t->clip_area.y2) break; + } + + if(draw_letter_dsc._draw_buf) lv_draw_buf_destroy(draw_letter_dsc._draw_buf); + + LV_ASSERT_MEM_INTEGRITY(); +} + +static void _draw_letter(lv_draw_task_t * t, lv_draw_glyph_dsc_t * dsc, const lv_point_t * pos, + const lv_font_t * font, uint32_t letter) +{ + lv_font_glyph_dsc_t g; + + if(lv_text_is_marker(letter)) /*Markers are valid letters but should not be rendered.*/ + return; + + LV_PROFILER_DRAW_BEGIN; + bool g_ret = lv_font_get_glyph_dsc(font, &g, letter, '\0'); + if(g_ret == false) { + /*Add warning if the dsc is not found*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%" LV_PRIX32, letter); + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) { + LV_PROFILER_DRAW_END; + return; + } + + lv_area_t letter_coords; + letter_coords.x1 = pos->x + g.ofs_x; + letter_coords.x2 = letter_coords.x1 + g.box_w - 1; + letter_coords.y1 = pos->y + (font->line_height - font->base_line) - g.box_h - g.ofs_y; + letter_coords.y2 = letter_coords.y1 + g.box_h - 1; + lv_area_move(&letter_coords, -dsc->pivot.x, -dsc->pivot.y); + + /*If the letter is completely out of mask don't draw it*/ + if(lv_area_is_out(&letter_coords, &t->clip_area, 0) && + dsc->bg_coords && + lv_area_is_out(dsc->bg_coords, &t->clip_area, 0)) { + LV_PROFILER_DRAW_END; + return; + } + + if(g.resolved_font) { + lv_draw_buf_t * draw_buf = NULL; + if(LV_FONT_GLYPH_FORMAT_NONE < g.format && g.format < LV_FONT_GLYPH_FORMAT_IMAGE) { + /*Only check draw buf for bitmap glyph*/ + draw_buf = lv_draw_buf_reshape(dsc->_draw_buf, 0, g.box_w, g.box_h, LV_STRIDE_AUTO); + if(draw_buf == NULL) { + if(dsc->_draw_buf) lv_draw_buf_destroy(dsc->_draw_buf); + + uint32_t h = LV_ROUND_UP(g.box_h, 32); /*Assume a larger size to avoid many reallocations*/ + draw_buf = lv_draw_buf_create_ex(font_draw_buf_handlers, g.box_w, h, LV_COLOR_FORMAT_A8, LV_STRIDE_AUTO); + LV_ASSERT_MALLOC(draw_buf); + draw_buf->header.h = g.box_h; + dsc->_draw_buf = draw_buf; + } + } + + /* Performance Optimization for lv_font_fmt_txt_dsc_t fonts, always request raw bitmaps */ + /*Exception for w*h >= NEMA_COORD_LIMIT due to HW limitation on data handling*/ + is_raw_bitmap = false; + if(g.box_h * g.box_w <= NEMA_COORD_LIMIT) { + g.req_raw_bitmap = 1; + if(font->get_glyph_bitmap == lv_font_get_bitmap_fmt_txt) { + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + if(fdsc->bitmap_format == LV_FONT_FMT_TXT_PLAIN) { + is_raw_bitmap = true; + } + } + } + + dsc->glyph_data = g.resolved_font->get_glyph_bitmap(&g, draw_buf); + + dsc->format = dsc->glyph_data ? g.format : LV_FONT_GLYPH_FORMAT_NONE; + } + else { + dsc->format = LV_FONT_GLYPH_FORMAT_NONE; + } + + dsc->letter_coords = &letter_coords; + dsc->g = &g; + _draw_nema_gfx_letter(t, dsc, NULL, NULL); + + if(g.resolved_font && font->release_glyph) { + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + nema_cl_wait(&(draw_nema_gfx_unit->cl)); + font->release_glyph(font, &g); + } + + LV_PROFILER_DRAW_END; +} + +#endif /*LV_USE_NEMA_GFX*/ diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_layer.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_layer.c new file mode 100644 index 0000000..14106ce --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_layer.c @@ -0,0 +1,57 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_layer.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nema_gfx_layer(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords) +{ + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + + /*It can happen that nothing was draw on a layer and therefore its buffer is not allocated. + *In this case just return. */ + if(layer_to_draw->draw_buf == NULL) return; + + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = layer_to_draw->draw_buf; + + lv_draw_nema_gfx_img(t, &new_draw_dsc, coords); +} + +#endif /*LV_USE_NEMA_GFX*/ diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_line.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_line.c new file mode 100644 index 0000000..5f5477c --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_line.c @@ -0,0 +1,96 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc) +{ + if(dsc->width == 0) + return; + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + if(dsc->p1.x == dsc->p2.x && dsc->p1.y == dsc->p2.y) + return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + + lv_layer_t * layer = t->target_layer; + lv_area_t clip_area; + clip_area.x1 = LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; + clip_area.x2 = LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; + clip_area.y1 = LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; + clip_area.y2 = LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; + + if(!lv_area_intersect(&clip_area, &clip_area, &t->clip_area)) + return; /*Fully clipped, nothing to do*/ + + lv_area_move(&clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_point_t point1 = {dsc->p1.x - layer->buf_area.x1, dsc->p1.y - layer->buf_area.y1}; + lv_point_t point2 = {dsc->p2.x - layer->buf_area.x1, dsc->p2.y - layer->buf_area.y1}; + + nema_set_clip(clip_area.x1, clip_area.y1, lv_area_get_width(&clip_area), lv_area_get_height(&clip_area)); + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + /* the stride should be computed internally for NEMA_TSC images and images missing a stride value */ + int32_t stride = (dst_cf >= LV_COLOR_FORMAT_NEMA_TSC_START && dst_cf <= LV_COLOR_FORMAT_NEMA_TSC_END) ? + -1 : lv_area_get_width(&(layer->buf_area)) * lv_color_format_get_size(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, stride); + + if(col32.alpha < 255U) { + nema_set_blend_fill(NEMA_BL_SIMPLE); + } + else { + nema_set_blend_fill(NEMA_BL_SRC); + } + + nema_draw_line_aa(point1.x, point1.y, point2.x, point2.y, dsc->width, bg_color); + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} +#endif diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_stm32_hal.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_stm32_hal.c new file mode 100644 index 0000000..9fc1552 --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_stm32_hal.c @@ -0,0 +1,257 @@ +/** + * @file lv_draw_nema_gfx_stm32_hal.c + * + * Global functions that implement some HAL functionality + * which Nema will call directly. + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_NEMA_GFX + +#if LV_USE_NEMA_HAL == LV_NEMA_HAL_STM32 + +#include "lv_draw_nema_gfx_utils.h" + +#include "../../misc/lv_types.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" +#include "../../osal/lv_os_private.h" + +#include +#include + +#include LV_NEMA_STM32_HAL_INCLUDE + +extern GPU2D_HandleTypeDef hgpu2d; + +/********************* + * DEFINES + *********************/ + +#define RING_SIZE 1024 /* Ring Buffer Size in byte */ + +/* NemaGFX byte pool size in bytes. + * One byte per peixel for masking/stencling plus 10240 for additional allocations. + */ +#if defined(LV_NEMA_GFX_MAX_RESX) && defined(LV_NEMA_GFX_MAX_RESY) + #define NEMAGFX_MEM_POOL_SIZE ((LV_NEMA_GFX_MAX_RESX * LV_NEMA_GFX_MAX_RESY) + 10240) +#else + /* LV_USE_NEMA_VG is 0 so masking/stencling memory is not needed. */ + #define NEMAGFX_MEM_POOL_SIZE 10240 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if (USE_HAL_GPU2D_REGISTER_CALLBACKS == 1) + static void GPU2D_CommandListCpltCallback(GPU2D_HandleTypeDef * hgpu2d, uint32_t CmdListID); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +static uint8_t nemagfx_pool_mem[NEMAGFX_MEM_POOL_SIZE] LV_NEMA_STM32_HAL_ATTRIBUTE_POOL_MEM; /* NemaGFX memory pool */ + +static nema_ringbuffer_t ring_buffer_str; +static volatile int last_cl_id = -1; +static lv_thread_sync_t sync; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if (USE_HAL_GPU2D_REGISTER_CALLBACKS == 1) + static void GPU2D_CommandListCpltCallback(GPU2D_HandleTypeDef * hgpu2d, uint32_t CmdListID) +#else + void HAL_GPU2D_CommandListCpltCallback(GPU2D_HandleTypeDef * hgpu2d, uint32_t CmdListID) +#endif +{ + LV_UNUSED(hgpu2d); + + last_cl_id = CmdListID; + lv_thread_sync_signal_isr(&sync); +} + +int32_t nema_sys_init(void) +{ + int error_code = 0; + + lv_thread_sync_init(&sync); + + /* Setup GPU2D Callback */ +#if (USE_HAL_GPU2D_REGISTER_CALLBACKS == 1) + /* Register Command List Complete Callback */ + HAL_GPU2D_RegisterCommandListCpltCallback(&hgpu2d, GPU2D_CommandListCpltCallback); +#endif + + /* Initialise Mem Space */ + error_code = tsi_malloc_init_pool_aligned(0, (void *)nemagfx_pool_mem, (uintptr_t)nemagfx_pool_mem, + NEMAGFX_MEM_POOL_SIZE, 1, 8); + LV_ASSERT(error_code == 0); + + /* Allocate ring_buffer memory */ + ring_buffer_str.bo = nema_buffer_create(RING_SIZE); + LV_ASSERT(ring_buffer_str.bo.base_virt); + + /* Initialize Ring Buffer */ + error_code = nema_rb_init(&ring_buffer_str, 1); + if(error_code < 0) { + return error_code; + } + + /* Reset last_cl_id counter */ + last_cl_id = 0; + + return error_code; +} + +uint32_t nema_reg_read(uint32_t reg) +{ + return HAL_GPU2D_ReadRegister(&hgpu2d, reg); +} + +void nema_reg_write(uint32_t reg, uint32_t value) +{ + HAL_GPU2D_WriteRegister(&hgpu2d, reg, value); +} + + + + +int nema_wait_irq(void) +{ + lv_thread_sync_wait(&sync); + return 0; +} + + +int nema_wait_irq_cl(int cl_id) +{ + while(last_cl_id < cl_id) { + (void)nema_wait_irq(); + } + + return 0; +} + +int nema_wait_irq_brk(int brk_id) +{ + while(nema_reg_read(GPU2D_BREAKPOINT) == 0U) { + (void)nema_wait_irq(); + } + + return 0; +} + +void nema_host_free(void * ptr) +{ + tsi_free(ptr); +} + +void * nema_host_malloc(unsigned size) +{ + return tsi_malloc(size); +} + +nema_buffer_t nema_buffer_create(int size) +{ + nema_buffer_t bo; + lv_memset(&bo, 0, sizeof(bo)); + bo.base_virt = tsi_malloc(size); + bo.base_phys = (uint32_t)bo.base_virt; + bo.size = size; + LV_ASSERT_MSG(bo.base_virt != 0, "Unable to allocate memory in nema_buffer_create"); + + return bo; +} + +nema_buffer_t nema_buffer_create_pool(int pool, int size) +{ + LV_UNUSED(pool); + + return nema_buffer_create(size); +} + +void * nema_buffer_map(nema_buffer_t * bo) +{ + return bo->base_virt; +} + +void nema_buffer_unmap(nema_buffer_t * bo) +{ + LV_UNUSED(bo); +} + +void nema_buffer_destroy(nema_buffer_t * bo) +{ + if(bo->fd == -1) { + return; /* Buffer weren't allocated! */ + } + + tsi_free(bo->base_virt); + + bo->base_virt = (void *)0; + bo->base_phys = 0; + bo->size = 0; + bo->fd = -1; /* Buffer not allocated */ +} + +uintptr_t nema_buffer_phys(nema_buffer_t * bo) +{ + return bo->base_phys; +} + +void nema_buffer_flush(nema_buffer_t * bo) +{ + LV_UNUSED(bo); +} + +int nema_mutex_lock(int mutex_id) +{ + int retval = 0; + + LV_UNUSED(mutex_id); + + return retval; +} + +int nema_mutex_unlock(int mutex_id) +{ + int retval = 0; + + LV_UNUSED(mutex_id); + + return retval; +} + +void platform_disable_cache(void) +{ + +} + +void platform_invalidate_cache(void) +{ + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /* LV_USE_NEMA_HAL == LV_NEMA_HAL_STM32 */ + +#endif /* LV_USE_NEMA_GFX */ diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_triangle.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_triangle.c new file mode 100644 index 0000000..124b3e6 --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_triangle.c @@ -0,0 +1,173 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_triangle.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_nema_gfx_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_draw_nema_gfx_unit_t * draw_nema_gfx_unit = (lv_draw_nema_gfx_unit_t *)t->draw_unit; + + lv_layer_t * layer = t->target_layer; + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, &t->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t coords; + coords.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + coords.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + coords.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + coords.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + lv_area_move(&coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, &coords, &rel_clip_area)) + return; /* Fully clipped, nothing to do */ + + nema_set_clip(rel_clip_area.x1, rel_clip_area.y1, lv_area_get_width(&rel_clip_area), + lv_area_get_height(&rel_clip_area)); + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + /* the stride should be computed internally for NEMA_TSC images and images missing a stride value */ + int32_t stride = (dst_cf >= LV_COLOR_FORMAT_NEMA_TSC_START && dst_cf <= LV_COLOR_FORMAT_NEMA_TSC_END) ? + -1 : lv_area_get_width(&(layer->buf_area)) * lv_color_format_get_size(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, stride); + + if(dsc->grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) { + + lv_color32_t col32 = lv_color_to_32(dsc->color, dsc->opa); + + if(col32.alpha < 255U) { + nema_set_blend_fill(NEMA_BL_SIMPLE); + } + else { + nema_set_blend_fill(NEMA_BL_SRC); + } + + uint32_t bg_color = nema_rgba(col32.red, col32.green, col32.blue, col32.alpha); + + nema_enable_aa(1, 1, 1, 0); + nema_fill_triangle(dsc->p[0].x - layer->buf_area.x1, dsc->p[0].y - layer->buf_area.y1, + dsc->p[1].x - layer->buf_area.x1, dsc->p[1].y - layer->buf_area.y1, + dsc->p[2].x - layer->buf_area.x1, dsc->p[2].y - layer->buf_area.y1, bg_color); + } +#if LV_USE_NEMA_VG + else { + + nema_vg_path_clear(draw_nema_gfx_unit->path); + nema_vg_paint_clear(draw_nema_gfx_unit->paint); + + nema_vg_paint_set_type(draw_nema_gfx_unit->paint, NEMA_VG_PAINT_GRAD_LINEAR); + nema_vg_set_blend(NEMA_BL_SRC_OVER | NEMA_BLOP_SRC_PREMULT); + nema_vg_set_fill_rule(NEMA_VG_FILL_EVEN_ODD); + + + float stops[LV_GRADIENT_MAX_STOPS]; + color_var_t colors[LV_GRADIENT_MAX_STOPS]; + + uint32_t cnt = LV_MAX(dsc->grad.stops_count, LV_GRADIENT_MAX_STOPS); + + for(uint8_t i = 0; i < cnt; i++) { + stops[i] = (float)(dsc->grad.stops[i].frac) / 255.f; + colors[i].a = dsc->grad.stops[i].opa; + colors[i].r = dsc->grad.stops[i].color.red; + colors[i].g = dsc->grad.stops[i].color.green; + colors[i].b = dsc->grad.stops[i].color.blue; + } + + nema_vg_grad_set(draw_nema_gfx_unit->gradient, cnt, stops, colors); + + //Calculate Bounding Box + float min_x = LV_MIN(dsc->p[0].x, dsc->p[1].x); + min_x = LV_MIN(dsc->p[2].x, min_x); + + float min_y = LV_MIN(dsc->p[0].y, dsc->p[1].y); + min_y = LV_MIN(dsc->p[2].y, min_y); + + float max_x = LV_MAX(dsc->p[0].x, dsc->p[1].x); + max_x = LV_MAX(dsc->p[2].x, max_x); + + float max_y = LV_MAX(dsc->p[0].y, dsc->p[1].y); + max_y = LV_MAX(dsc->p[2].y, max_y); + + float x0, x1, y0, y1; + + if(dsc->grad.dir == LV_GRAD_DIR_HOR) { + x0 = min_x; + x1 = max_x; + y0 = min_y; + y1 = min_y; + } + else { + x0 = min_x; + x1 = min_x; + y0 = min_y; + y1 = max_y; + } + + y0 -= (float) layer->buf_area.y1; + y1 -= (float) layer->buf_area.y1; + x0 -= (float) layer->buf_area.x1; + x1 -= (float) layer->buf_area.x1; + + uint8_t cmds_polygon[] = {NEMA_VG_PRIM_MOVE, NEMA_VG_PRIM_POLYGON}; + float triangle_coords[] = {dsc->p[0].x - layer->buf_area.x1, dsc->p[0].y - layer->buf_area.y1, + 4.0f, + dsc->p[1].x - layer->buf_area.x1, dsc->p[1].y - layer->buf_area.y1, + dsc->p[2].x - layer->buf_area.x1, dsc->p[2].y - layer->buf_area.y1 + }; + nema_enable_aa(0, 0, 0, 0); + nema_vg_paint_set_grad_linear(draw_nema_gfx_unit->paint, draw_nema_gfx_unit->gradient, x0, y0, x1, y1, + NEMA_TEX_CLAMP | NEMA_FILTER_BL); + nema_vg_path_set_shape(draw_nema_gfx_unit->path, 2, cmds_polygon, 7, triangle_coords); + nema_vg_draw_path(draw_nema_gfx_unit->path, draw_nema_gfx_unit->paint); + } +#endif + + nema_cl_submit(&(draw_nema_gfx_unit->cl)); + +} +#endif diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_utils.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_utils.c new file mode 100644 index 0000000..2ecce65 --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_utils.c @@ -0,0 +1,143 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +uint32_t lv_nemagfx_cf_to_nema(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A1: + return NEMA_A1; + case LV_COLOR_FORMAT_A2: + return NEMA_A2; + case LV_COLOR_FORMAT_A4: + return NEMA_A4; + case LV_COLOR_FORMAT_A8: + return NEMA_A8; + case LV_COLOR_FORMAT_I1: + return NEMA_L1; + case LV_COLOR_FORMAT_I2: + return NEMA_L2; + case LV_COLOR_FORMAT_I4: + return NEMA_L4; + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_I8: + return NEMA_L8; + case LV_COLOR_FORMAT_RGB565: + return NEMA_RGB565; + case LV_COLOR_FORMAT_RGB888: + return NEMA_BGR24; + case LV_COLOR_FORMAT_ARGB8888: + return NEMA_BGRA8888; + case LV_COLOR_FORMAT_XRGB8888: + return NEMA_BGRX8888; + case LV_COLOR_FORMAT_NEMA_TSC4: + return NEMA_TSC4; + case LV_COLOR_FORMAT_NEMA_TSC6: + return NEMA_TSC6; + case LV_COLOR_FORMAT_NEMA_TSC6A: + return NEMA_TSC6A; + case LV_COLOR_FORMAT_NEMA_TSC12: + return NEMA_TSC12; + case LV_COLOR_FORMAT_NEMA_TSC12A: + return NEMA_TSC12A; + /*Guard for previous NemaGFX Version*/ +#ifdef NEMA_TSC6AP + case LV_COLOR_FORMAT_NEMA_TSC6AP: + return NEMA_TSC6AP; +#endif + default: + return LV_NEMA_GFX_COLOR_FORMAT; + } +} + +uint32_t lv_nemagfx_blending_mode(lv_blend_mode_t lv_blend_mode) +{ + uint32_t blending_mode; + switch(lv_blend_mode) { + case LV_BLEND_MODE_NORMAL: + blending_mode = NEMA_BL_SIMPLE; + break; + case LV_BLEND_MODE_ADDITIVE: + blending_mode = NEMA_BL_ADD; + break; + case LV_BLEND_MODE_MULTIPLY: + blending_mode = nema_blending_mode(NEMA_BF_DESTCOLOR, NEMA_BF_INVSRCALPHA, NEMA_BLOP_SRC_PREMULT); + break; + default: + blending_mode = NEMA_BL_SIMPLE; + break; + } + return blending_mode; +} + +void lv_nemagfx_grad_set(NEMA_VG_GRAD_HANDLE gradient, lv_grad_dsc_t lv_grad, lv_opa_t opa) +{ + + float stops[LV_GRADIENT_MAX_STOPS]; + color_var_t colors[LV_GRADIENT_MAX_STOPS]; + + uint32_t cnt = LV_MAX(lv_grad.stops_count, LV_GRADIENT_MAX_STOPS); + + for(uint8_t i = 0; i < cnt; i++) { + stops[i] = (float)(lv_grad.stops[i].frac) / 255.f; + colors[i].a = LV_OPA_MIX2(lv_grad.stops[i].opa, opa); + colors[i].r = lv_grad.stops[i].color.red; + colors[i].g = lv_grad.stops[i].color.green; + colors[i].b = lv_grad.stops[i].color.blue; + } + + nema_vg_grad_set(gradient, cnt, stops, colors); +} + +bool lv_nemagfx_is_cf_supported(lv_color_format_t cf) +{ + + switch(cf) { + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB565A8: + return false; + default: + break; + } + return true; +} + +#endif /*LV_USE_NEMA_GFX*/ diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_utils.h b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_utils.h new file mode 100644 index 0000000..bf8e6d2 --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_utils.h @@ -0,0 +1,187 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_draw_nema_gfx_utils.h + * + */ + +#ifndef LV_DRAW_NEMA_GFX_UTILS_H +#define LV_DRAW_NEMA_GFX_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_NEMA_GFX +#include "../sw/lv_draw_sw.h" + +#if LV_USE_NEMA_LIB == LV_NEMA_LIB_NONE +#warning since v9.5, LV_USE_NEMA_LIB should be specified in lv_conf.h. LV_NEMA_LIB_M33_REVC will be used by default. +#endif + +#if LV_USE_NEMA_LIB == LV_NEMA_LIB_NONE || LV_USE_NEMA_LIB == LV_NEMA_LIB_M33_REVC || LV_USE_NEMA_LIB == LV_NEMA_LIB_M33_NEMAPVG +#include "../../../libs/nema_gfx/include/cortex_m33/build_version.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_blender.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_cmdlist.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_core.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_easing.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_error.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_font.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_graphics.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_hal.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_interpolators.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_math.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_matrix3x3.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_matrix4x4.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_provisional.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_raster.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_sys_defs.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_transitions.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_utils.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_version.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_vg_context.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_vg_font.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_vg.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_vg_paint.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_vg_path.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_vg_tsvg.h" +#include "../../../libs/nema_gfx/include/cortex_m33/nema_vg_version.h" +#include "../../../libs/nema_gfx/include/cortex_m33/tsi_malloc.h" +#elif LV_USE_NEMA_LIB == LV_NEMA_LIB_M55 || LV_USE_NEMA_LIB == LV_NEMA_LIB_M7 +#include "../../../libs/nema_gfx/include/cortex_m55_m7/build_version.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_blender.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_cmdlist.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_core.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_easing.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_error.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_font.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_graphics.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_hal.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_interpolators.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_math.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_matrix3x3.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_matrix4x4.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_provisional.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_raster.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_sys_defs.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_transitions.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_version.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_vg_context.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_vg_font.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_vg.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_vg_paint.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_vg_path.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_vg_tsvg.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/nema_vg_version.h" +#include "../../../libs/nema_gfx/include/cortex_m55_m7/tsi_malloc.h" +#endif + +/********************* + * DEFINES + *********************/ + +#ifndef NEMA_VIRT2PHYS +#define NEMA_VIRT2PHYS +#else +uintptr_t NEMA_VIRT2PHYS(void * addr); +#endif + +/*Color depth: 1 (1 byte per pixel), 8 (RGB332), 16 (RGB565), 32 (ARGB8888)*/ +#if LV_COLOR_DEPTH == 8 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_L8 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 1 +#elif LV_COLOR_DEPTH == 16 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_RGB565 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 2 +#elif LV_COLOR_DEPTH == 24 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_BGR24 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 3 +#elif LV_COLOR_DEPTH == 32 +#define LV_NEMA_GFX_COLOR_FORMAT NEMA_BGRA8888 +#define LV_NEMA_GFX_FORMAT_MULTIPLIER 4 +#else +/*Can't use GPU with other formats*/ +#error Selected Color Depth Not Supported +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Check if `lv_color_format_t` is supported. + * @param cf The LVGL color format + * @return True/false + */ +bool lv_nemagfx_is_cf_supported(lv_color_format_t cf); + +/** + * Convert a `lv_color_format_t` to a Nema color format. + * @param cf The LVGL color format + * @return The Nema color format + */ +uint32_t lv_nemagfx_cf_to_nema(lv_color_format_t cf); + +/** + * Get NemaGFX blending mode + * + * @param[in] lv_blend_mode The LVGL blend mode + * + * @return NemaGFX blending mode + * + */ +uint32_t lv_nemagfx_blending_mode(lv_blend_mode_t lv_blend_mode); + + +/** + * Get NemaGFX blending mode + * + * @param[in] gradient NemaGFX Gradient Buffer + * + * @param[in] lv_grad Gradient descriptor + * + * @param[in] opa Descriptor's opacity + * +*/ +void lv_nemagfx_grad_set(NEMA_VG_GRAD_HANDLE gradient, lv_grad_dsc_t lv_grad, lv_opa_t opa); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_NEMA_GFX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_NEMA_GFX_UTILS_H*/ diff --git a/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_vector.c b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_vector.c new file mode 100644 index 0000000..923f514 --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_draw_nema_gfx_vector.c @@ -0,0 +1,161 @@ +/** + * @file lv_draw_nema_gfx_vector.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nema_gfx.h" +#if LV_USE_NEMA_GFX && LV_USE_VECTOR_GRAPHIC && LV_USE_NEMA_VG + +#include "lv_nema_gfx_path.h" +#include "../lv_draw_vector_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_nema_gfx_unit_t * u; + float rel_translate_x; + float rel_translate_y; +} ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_path_ctx_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_nema_gfx_vector(lv_draw_task_t * t, const lv_draw_vector_dsc_t * dsc, + const lv_area_t * coords) +{ + ctx_t c; + c.u = (lv_draw_nema_gfx_unit_t *) t->draw_unit; + + lv_layer_t * layer = t->target_layer; + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, &t->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + c.rel_translate_x = -layer->buf_area.x1; + c.rel_translate_y = -layer->buf_area.y1; + + nema_set_clip(rel_clip_area.x1, rel_clip_area.y1, lv_area_get_width(&rel_clip_area), + lv_area_get_height(&rel_clip_area)); + + lv_color_format_t dst_cf = layer->draw_buf->header.cf; + uint32_t dst_nema_cf = lv_nemagfx_cf_to_nema(dst_cf); + + /* the stride should be computed internally for NEMA_TSC images and images missing a stride value */ + int32_t stride = (dst_cf >= LV_COLOR_FORMAT_NEMA_TSC_START && dst_cf <= LV_COLOR_FORMAT_NEMA_TSC_END) ? + -1 : lv_area_get_width(&(layer->buf_area)) * lv_color_format_get_size(dst_cf); + + nema_bind_dst_tex((uintptr_t)NEMA_VIRT2PHYS(layer->draw_buf->data), lv_area_get_width(&(layer->buf_area)), + lv_area_get_height(&(layer->buf_area)), dst_nema_cf, stride); + + nema_vg_set_blend(NEMA_BL_SRC_OVER | NEMA_BLOP_SRC_PREMULT); + + lv_vector_for_each_destroy_tasks(dsc->task_list, task_draw_cb, &c); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_path_ctx_t * dsc) +{ + ctx_t * c = ctx; + lv_draw_nema_gfx_unit_t * u = c->u; + + if(!path) return; + + nema_vg_path_clear(u->path); + nema_vg_paint_clear(u->paint); + + nema_vg_paint_set_type(u->paint, NEMA_VG_PAINT_COLOR); + + lv_matrix_t matrix = dsc->matrix; + matrix.m[0][2] += c->rel_translate_x; + matrix.m[1][2] += c->rel_translate_y; + nema_vg_path_set_matrix(c->u->path, (void *) &matrix); + + /* the path ops array needs to be translated to nema's opcodes */ + lv_vector_path_op_t * ops = lv_array_front(&path->ops); + uint32_t op_count = lv_array_size(&path->ops); + uint8_t * nema_ops = lv_malloc(op_count * sizeof(*nema_ops)); + LV_ASSERT_MALLOC(nema_ops); + for(uint32_t i = 0; i < op_count; i++) { + nema_ops[i] = ops[i] == LV_VECTOR_PATH_OP_MOVE_TO ? NEMA_VG_PRIM_MOVE : + ops[i] == LV_VECTOR_PATH_OP_LINE_TO ? NEMA_VG_PRIM_LINE : + ops[i] == LV_VECTOR_PATH_OP_QUAD_TO ? NEMA_VG_PRIM_BEZIER_QUAD : + ops[i] == LV_VECTOR_PATH_OP_CUBIC_TO ? NEMA_VG_PRIM_BEZIER_CUBIC : + /*LV_VECTOR_PATH_OP_CLOSE*/ NEMA_VG_PRIM_CLOSE; + } + + /* the path points array is in the right format for nema to use as-is */ + uint32_t point_count = lv_array_size(&path->points); + float * points = lv_array_front(&path->points); + + nema_vg_path_set_shape(u->path, op_count, nema_ops, point_count, points); + + nema_vg_set_quality(path->quality == LV_VECTOR_PATH_QUALITY_LOW ? NEMA_VG_QUALITY_FASTER : + path->quality == LV_VECTOR_PATH_QUALITY_MEDIUM ? NEMA_VG_QUALITY_BETTER : + /*LV_VECTOR_PATH_QUALITY_HIGH*/ NEMA_VG_QUALITY_MAXIMUM); + + if(dsc->fill_dsc.opa) { + nema_vg_set_fill_rule(dsc->fill_dsc.fill_rule == LV_VECTOR_FILL_NONZERO ? NEMA_VG_FILL_NON_ZERO : + /*LV_VECTOR_FILL_EVENODD*/ NEMA_VG_FILL_EVEN_ODD); + + uint32_t nema_dsc_color = nema_rgba(dsc->fill_dsc.color.red, dsc->fill_dsc.color.green, + dsc->fill_dsc.color.blue, dsc->fill_dsc.color.alpha); + nema_vg_paint_set_paint_color(u->paint, nema_dsc_color); + + nema_vg_draw_path(u->path, u->paint); + } + + if(dsc->stroke_dsc.opa) { + nema_vg_set_fill_rule(NEMA_VG_STROKE); + nema_vg_stroke_set_width(dsc->stroke_dsc.width); + uint8_t cap = dsc->stroke_dsc.cap == LV_VECTOR_STROKE_CAP_BUTT ? NEMA_VG_CAP_BUTT : + dsc->stroke_dsc.cap == LV_VECTOR_STROKE_CAP_SQUARE ? NEMA_VG_CAP_SQUARE : + /*LV_VECTOR_STROKE_CAP_ROUND*/ NEMA_VG_CAP_ROUND; + nema_vg_stroke_set_cap_style(cap, cap); + uint8_t join = dsc->stroke_dsc.join == LV_VECTOR_STROKE_JOIN_MITER ? NEMA_VG_JOIN_MITER : + dsc->stroke_dsc.join == LV_VECTOR_STROKE_JOIN_BEVEL ? NEMA_VG_JOIN_BEVEL : + /*LV_VECTOR_STROKE_JOIN_ROUND*/ NEMA_VG_JOIN_ROUND; + nema_vg_stroke_set_join_style(join); + nema_vg_stroke_set_miter_limit(dsc->stroke_dsc.miter_limit); + + uint32_t nema_dsc_color = nema_rgba(dsc->stroke_dsc.color.red, dsc->stroke_dsc.color.green, + dsc->stroke_dsc.color.blue, dsc->stroke_dsc.color.alpha); + nema_vg_paint_set_paint_color(u->paint, nema_dsc_color); + + nema_vg_draw_path(u->path, u->paint); + } + + nema_cl_submit(&c->u->cl); + nema_cl_wait(&u->cl); + + lv_free(nema_ops); +} + +#endif /*LV_USE_NEMA_GFX && LV_USE_VECTOR_GRAPHIC && LV_USE_NEMA_VG*/ diff --git a/inc/lvgl/src/draw/nema_gfx/lv_nema_gfx_path.c b/inc/lvgl/src/draw/nema_gfx/lv_nema_gfx_path.c new file mode 100644 index 0000000..55a774b --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_nema_gfx_path.c @@ -0,0 +1,159 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_nema_gfx_path.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_refr.h" + +#if LV_USE_NEMA_GFX +#if LV_USE_NEMA_VG + +#include "lv_nema_gfx_path.h" + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +static int data_point = 0; +static int seg_point = 0; + +lv_nema_gfx_path_t * lv_nema_gfx_path_create(void) +{ + LV_PROFILER_DRAW_BEGIN; + lv_nema_gfx_path_t * nema_gfx_path = lv_malloc_zeroed(sizeof(lv_nema_gfx_path_t)); + LV_ASSERT_MALLOC(nema_gfx_path); + nema_gfx_path->seg = NULL; + nema_gfx_path->data = NULL; + nema_gfx_path->seg_size = 0; + nema_gfx_path->data_size = 0; + data_point = 0; + seg_point = 0; + LV_PROFILER_DRAW_END; + return nema_gfx_path; +} + +void lv_nema_gfx_path_alloc(lv_nema_gfx_path_t * nema_gfx_path) +{ + LV_PROFILER_DRAW_BEGIN; + nema_gfx_path->path = nema_vg_path_create(); + nema_gfx_path->paint = nema_vg_paint_create(); + nema_gfx_path->data = (float *) lv_malloc(nema_gfx_path->data_size * sizeof(float)); + LV_ASSERT_MALLOC(nema_gfx_path->data); + nema_gfx_path->seg = (uint8_t *) lv_malloc(nema_gfx_path->seg_size * sizeof(uint8_t)); + LV_ASSERT_MALLOC(nema_gfx_path->seg); + LV_PROFILER_DRAW_END; +} + +void lv_nema_gfx_path_destroy(lv_nema_gfx_path_t * nema_gfx_path) +{ + LV_PROFILER_DRAW_BEGIN; + LV_ASSERT_NULL(nema_gfx_path); + + if(nema_gfx_path->path != NULL) { + nema_vg_path_destroy(nema_gfx_path->path); + nema_gfx_path->path = NULL; + } + + if(nema_gfx_path->paint != NULL) { + nema_vg_paint_destroy(nema_gfx_path->paint); + nema_gfx_path->paint = NULL; + } + + if(nema_gfx_path->data != NULL) { + lv_free(nema_gfx_path->data); + nema_gfx_path->data = NULL; + } + if(nema_gfx_path->seg != NULL) { + lv_free(nema_gfx_path->seg); + nema_gfx_path->seg = NULL; + } + lv_free(nema_gfx_path); + LV_PROFILER_DRAW_END; +} + +void lv_nema_gfx_path_move_to(lv_nema_gfx_path_t * path, float x, float y) +{ + LV_ASSERT_NULL(path); + LV_ASSERT(path->data_size > data_point + 1); + LV_ASSERT(path->seg_size > seg_point); + path->seg[seg_point++] = NEMA_VG_PRIM_MOVE; + path->data[data_point++] = x; + path->data[data_point++] = y; +} + +void lv_nema_gfx_path_line_to(lv_nema_gfx_path_t * path, float x, float y) +{ + LV_ASSERT_NULL(path); + LV_ASSERT(path->data_size > data_point + 1); + LV_ASSERT(path->seg_size > seg_point); + path->seg[seg_point++] = NEMA_VG_PRIM_LINE; + path->data[data_point++] = x; + path->data[data_point++] = y; + +} + +void lv_nema_gfx_path_quad_to(lv_nema_gfx_path_t * path, float cx, float cy, float x, float y) +{ + LV_ASSERT_NULL(path); + LV_ASSERT(path->data_size > data_point + 3); + LV_ASSERT(path->seg_size > seg_point); + path->seg[seg_point++] = NEMA_VG_PRIM_BEZIER_QUAD; + path->data[data_point++] = cx; + path->data[data_point++] = cy; + path->data[data_point++] = x; + path->data[data_point++] = y; +} + +void lv_nema_gfx_path_cubic_to(lv_nema_gfx_path_t * path, float cx1, float cy1, float cx2, float cy2, float x, float y) +{ + LV_ASSERT_NULL(path); + LV_ASSERT(path->data_size > data_point + 5); + LV_ASSERT(path->seg_size > seg_point); + path->seg[seg_point++] = NEMA_VG_PRIM_BEZIER_CUBIC; + path->data[data_point++] = cx1; + path->data[data_point++] = cy1; + path->data[data_point++] = cx2; + path->data[data_point++] = cy2; + path->data[data_point++] = x; + path->data[data_point++] = y; +} + +void lv_nema_gfx_path_end(lv_nema_gfx_path_t * path) +{ + /* Do Path end jobs....whatever*/ + seg_point = 0; + data_point = 0; + +} + +#endif /*LV_USE_NEMA_VG*/ +#endif /*LV_USE_NEMA_GFX*/ diff --git a/inc/lvgl/src/draw/nema_gfx/lv_nema_gfx_path.h b/inc/lvgl/src/draw/nema_gfx/lv_nema_gfx_path.h new file mode 100644 index 0000000..0ff8118 --- /dev/null +++ b/inc/lvgl/src/draw/nema_gfx/lv_nema_gfx_path.h @@ -0,0 +1,97 @@ +/** + * MIT License + * + * ----------------------------------------------------------------------------- + * Copyright (c) 2008-24 Think Silicon Single Member PC + * ----------------------------------------------------------------------------- + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next paragraph) + * shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file lv_nema_gfx_path.h + * + */ + +#ifndef LV_NEMA_GFX_PATH_H +#define LV_NEMA_GFX_PATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_nema_gfx.h" + +#if LV_USE_NEMA_GFX +#if LV_USE_NEMA_VG + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + NEMA_VG_PATH_HANDLE path; + NEMA_VG_PAINT_HANDLE paint; + float * data; + uint8_t * seg; + uint32_t data_size; + uint32_t seg_size; +} lv_nema_gfx_path_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_nema_gfx_path_t * lv_nema_gfx_path_create(void); + +void lv_nema_gfx_path_alloc(lv_nema_gfx_path_t * nema_gfx_path); + +void lv_nema_gfx_path_destroy(lv_nema_gfx_path_t * nema_gfx_path); + +void lv_nema_gfx_path_move_to(lv_nema_gfx_path_t * nema_gfx_path, + float x, float y); + +void lv_nema_gfx_path_line_to(lv_nema_gfx_path_t * nema_gfx_path, + float x, float y); + +void lv_nema_gfx_path_quad_to(lv_nema_gfx_path_t * nema_gfx_path, + float cx, float cy, + float x, float y); + +void lv_nema_gfx_path_cubic_to(lv_nema_gfx_path_t * nema_gfx_path, + float cx1, float cy1, + float cx2, float cy2, + float x, float y); + +void lv_nema_gfx_path_end(lv_nema_gfx_path_t * nema_gfx_path); + + + +#endif /*LV_USE_NEMA_VG*/ +#endif /*LV_USE_NEMA_GFX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NEMA_GFX_PATH_H*/ diff --git a/inc/lvgl/src/draw/nxp/g2d/lv_draw_buf_g2d.c b/inc/lvgl/src/draw/nxp/g2d/lv_draw_buf_g2d.c new file mode 100644 index 0000000..e729e9b --- /dev/null +++ b/inc/lvgl/src/draw/nxp/g2d/lv_draw_buf_g2d.c @@ -0,0 +1,94 @@ +/** + * @file lv_draw_buf_g2d.c + * + */ + +/** + * Copyright 2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_g2d.h" + +#if LV_USE_G2D +#if LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D +#include "../../lv_draw_buf_private.h" +#include "g2d.h" +#include "lv_g2d_buf_map.h" +#include "lv_g2d_utils.h" + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * _buf_malloc(size_t size_bytes, lv_color_format_t color_format); + +static void _buf_free(void * buf); + +static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_buf_g2d_init_handlers(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + + handlers->buf_malloc_cb = _buf_malloc; + handlers->buf_free_cb = _buf_free; + handlers->invalidate_cache_cb = _invalidate_cache; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void * _buf_malloc(size_t size_bytes, lv_color_format_t color_format) +{ + LV_UNUSED(color_format); + + size_bytes += LV_DRAW_BUF_ALIGN - 1; + struct g2d_buf * buf = g2d_alloc(size_bytes, 1); + G2D_ASSERT_MSG(buf, "Failed to alloc buffer."); + g2d_insert_buf_map(buf->buf_vaddr, buf); + return buf->buf_vaddr; +} + +static void _buf_free(void * buf) +{ + g2d_free_item(buf); +} + +static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + LV_UNUSED(area); + struct g2d_buf * buf = g2d_search_buf_map(draw_buf->data); + G2D_ASSERT_MSG(buf, "Failed to find buffer in map."); + g2d_cache_op(buf, G2D_CACHE_FLUSH); +} + +#endif /*LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D*/ +#endif /*LV_USE_G2D*/ diff --git a/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d.c b/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d.c new file mode 100644 index 0000000..5aee79d --- /dev/null +++ b/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d.c @@ -0,0 +1,362 @@ +/** + * @file lv_draw_g2d.c + * + */ + +/** + * Copyright 2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#include "lv_draw_g2d.h" + +#if LV_USE_G2D +#include "../../../misc/lv_area_private.h" +#include "g2d.h" +#include "lv_g2d_buf_map.h" +#include "lv_g2d_utils.h" + +/********************* + * DEFINES + *********************/ + +#define DRAW_UNIT_ID_G2D 8 + +/** + * Enum name differs depending on g2d version (breaking API change, not handled in g2d.h) + * Note: enum value is the same in either case + * See https://github.com/nxp-imx/imx-g2d-pxp/commit/d7af84b5c8ad161b6898ffabe23918cb59fe2fe9 + */ +#if defined(LV_USE_PXP) + #if (G2D_VERSION_MAJOR >= 2) && (G2D_VERSION_MINOR < 3) + #define G2D_HARDWARE_PXP_V1 G2D_HARDWARE_PXP + #endif +#else + #define G2D_HARDWARE_PXP_V1 0 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Evaluate a task and set the score and preferred G2D unit. + * Return 1 if task is preferred, 0 otherwise (task is not supported). + */ +static int32_t _g2d_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +/** + * Dispatch a task to the G2D unit. + * Return 1 if task was dispatched, 0 otherwise (task not supported). + */ +static int32_t _g2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +/** + * Delete the G2D draw unit. + */ +static int32_t _g2d_delete(lv_draw_unit_t * draw_unit); + +#if LV_USE_G2D_DRAW_THREAD + static void _g2d_render_thread_cb(void * ptr); +#endif + +static void _g2d_execute_drawing(lv_draw_task_t * t); + +/********************** + * STATIC VARIABLES + **********************/ + +static int32_t is_hw_pxp = 0; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_g2d_init(void) +{ + lv_draw_buf_g2d_init_handlers(); +#if LV_USE_DRAW_G2D + lv_draw_g2d_unit_t * draw_g2d_unit = lv_draw_create_unit(sizeof(lv_draw_g2d_unit_t)); + draw_g2d_unit->base_unit.evaluate_cb = _g2d_evaluate; + draw_g2d_unit->base_unit.dispatch_cb = _g2d_dispatch; + draw_g2d_unit->base_unit.delete_cb = _g2d_delete; + draw_g2d_unit->base_unit.name = "G2D"; + +#if LV_USE_G2D_DRAW_THREAD + lv_draw_sw_thread_dsc_t * thread_dsc = &draw_g2d_unit->thread_dsc; + thread_dsc->idx = 0; + thread_dsc->draw_unit = (void *) draw_g2d_unit; + lv_thread_init(&thread_dsc->thread, "g2ddraw", LV_DRAW_THREAD_PRIO, _g2d_render_thread_cb, LV_DRAW_THREAD_STACK_SIZE, + thread_dsc); +#endif +#endif + g2d_create_buf_map(); + void * handle; + LV_ASSERT_MSG(!g2d_open(&handle), "Cannot open G2D handle\r\n"); + g2d_query_hardware(handle, G2D_HARDWARE_PXP_V1, &is_hw_pxp); + g2d_set_handle(handle); +} + +void lv_draw_g2d_deinit(void) +{ + g2d_free_buf_map(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#if LV_USE_DRAW_G2D +static inline bool _g2d_dest_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + is_cf_supported = true; + break; + case LV_COLOR_FORMAT_RGB565: { + if(!is_hw_pxp) { + is_cf_supported = true; + } + } + break; + default: + break; + } + + return is_cf_supported; +} + +static inline bool _g2d_src_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + is_cf_supported = true; + break; + case LV_COLOR_FORMAT_RGB565: { + if(!is_hw_pxp) { + is_cf_supported = true; + } + } + break; + default: + break; + } + + return is_cf_supported; +} + +static bool _g2d_draw_img_supported(const lv_draw_image_dsc_t * draw_dsc) +{ + bool has_recolor = (draw_dsc->recolor_opa > LV_OPA_MIN); + /* Recolor is not supported. */ + if(has_recolor) + return false; + + /* G2D can only rotate at 90x angles. */ + if(draw_dsc->rotation % 900) + return false; + + return true; +} + +static int32_t _g2d_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) +{ + LV_UNUSED(u); + + const lv_draw_dsc_base_t * draw_dsc_base = (lv_draw_dsc_base_t *) t->draw_dsc; + lv_draw_buf_t * draw_buf = draw_dsc_base->layer->draw_buf; + + if(!_g2d_dest_cf_supported(draw_dsc_base->layer->color_format)) + return 0; + + if(draw_buf && !g2d_search_buf_map(draw_buf->data)) + return 0; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: { + const lv_draw_fill_dsc_t * draw_dsc = (lv_draw_fill_dsc_t *) t->draw_dsc; + + /* Most simple case: just a plain rectangle (no radius, no gradient). */ + if((draw_dsc->radius != 0) || (draw_dsc->grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE)) + return 0; + + if(t->preference_score > 70) { + t->preference_score = 70; + t->preferred_draw_unit_id = DRAW_UNIT_ID_G2D; + } + return 1; + } + case LV_DRAW_TASK_TYPE_IMAGE: { + /* TODO: Fix issue where images rendered to a different layer don't render in the final layer.*/ + return 0; +#if 0 + const lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; + + if(!_g2d_src_cf_supported(draw_dsc->header.cf)) + return 0; + + if(!_g2d_draw_img_supported(draw_dsc)) + return 0; + + if(t->preference_score > 70) { + t->preference_score = 70; + t->preferred_draw_unit_id = DRAW_UNIT_ID_G2D; + } + return 1; +#endif + } + default: + return 0; + } + + return 0; + +} + +static int32_t _g2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_g2d_unit_t * draw_g2d_unit = (lv_draw_g2d_unit_t *) draw_unit; + +#if LV_USE_OS + lv_draw_sw_thread_dsc_t * thread_dsc = &draw_g2d_unit->thread_dsc; + + /* Return immediately if it's busy with draw task. */ + if(thread_dsc->task_act) + return 0; +#else + /* Return immediately if it's busy with draw task. */ + if(draw_g2d_unit->task_act) + return 0; +#endif + + /* Try to get an ready to draw. */ + lv_draw_task_t * t = lv_draw_get_available_task(layer, NULL, DRAW_UNIT_ID_G2D); + + if(t == NULL || t->preferred_draw_unit_id != DRAW_UNIT_ID_G2D) + return LV_DRAW_UNIT_IDLE; + + if(lv_draw_layer_alloc_buf(layer) == NULL) + return LV_DRAW_UNIT_IDLE; + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + t->draw_unit = draw_unit; + +#if LV_USE_G2D_DRAW_THREAD + thread_dsc->task_act = t; + + /* Let the render thread work. */ + if(thread_dsc->inited) + lv_thread_sync_signal(&thread_dsc->sync); +#else + draw_g2d_unit->task_act = t; + + _g2d_execute_drawing(t); + + draw_g2d_unit->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + draw_g2d_unit->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); +#endif + + return 1; +} + +static int32_t _g2d_delete(lv_draw_unit_t * draw_unit) +{ + lv_result_t res = LV_RESULT_OK; + +#if !LV_USE_G2D_DRAW_THREAD + LV_UNUSED(draw_unit); +#else + lv_draw_g2d_unit_t * draw_g2d_unit = (lv_draw_g2d_unit_t *) draw_unit; + lv_draw_sw_thread_dsc_t * thread_dsc = &draw_g2d_unit->thread_dsc; + LV_LOG_INFO("Cancel G2D draw thread."); + thread_dsc->exit_status = true; + + if(thread_dsc->inited) + lv_thread_sync_signal(&thread_dsc->sync); + + res = lv_thread_delete(&thread_dsc->thread); +#endif + g2d_close(g2d_get_handle()); + + return res; +} + +static void _g2d_execute_drawing(lv_draw_task_t * t) +{ + lv_layer_t * layer = t->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + + /* Invalidate only the drawing area */ + lv_draw_buf_invalidate_cache(draw_buf, NULL); + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_g2d_fill(t); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_g2d_img(t); + break; + default: + break; + } +} + +#if LV_USE_G2D_DRAW_THREAD +static void _g2d_render_thread_cb(void * ptr) +{ + lv_draw_sw_thread_dsc_t * thread_dsc = ptr; + + lv_thread_sync_init(&thread_dsc->sync); + thread_dsc->inited = true; + + while(1) { + /* Wait for sync if there is no task set. */ + while(thread_dsc->task_act == NULL) { + if(thread_dsc->exit_status) + break; + + lv_thread_sync_wait(&thread_dsc->sync); + } + + if(thread_dsc->exit_status) { + LV_LOG_INFO("Ready to exit G2D draw thread."); + break; + } + + _g2d_execute_drawing(thread_dsc->task_act); + + /* Signal the ready state to dispatcher. */ + thread_dsc->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + + /* Cleanup. */ + thread_dsc->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); + } + + thread_dsc->inited = false; + lv_thread_sync_delete(&thread_dsc->sync); + LV_LOG_INFO("Exit G2D draw thread."); +} +#endif + +#endif /*LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D*/ +#endif /*LV_USE_G2D*/ diff --git a/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d.h b/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d.h new file mode 100644 index 0000000..0420eca --- /dev/null +++ b/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d.h @@ -0,0 +1,71 @@ +/** + * @file lv_draw_g2d.h + * + */ + +/** + * Copyright 2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_DRAW_G2D_H +#define LV_DRAW_G2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_G2D +#if LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D +#include "../../sw/lv_draw_sw_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct lv_draw_g2d_unit { + lv_draw_unit_t base_unit; +#if LV_USE_OS + lv_draw_sw_thread_dsc_t thread_dsc; +#else + lv_draw_task_t * task_act; +#endif +} lv_draw_g2d_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_g2d_init(void); + +void lv_draw_g2d_deinit(void); + +void lv_draw_buf_g2d_init_handlers(void); + +void lv_draw_g2d_fill(lv_draw_task_t * t); + +void lv_draw_g2d_img(lv_draw_task_t * t); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D*/ +#endif /*LV_USE_G2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_G2D_H*/ diff --git a/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d_fill.c b/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d_fill.c new file mode 100644 index 0000000..73dda3f --- /dev/null +++ b/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d_fill.c @@ -0,0 +1,181 @@ +/** + * @file lv_draw_g2d_fill.c + * + */ + +/** + * Copyright 2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_g2d.h" + +#if LV_USE_G2D +#if LV_USE_DRAW_G2D +#include +#include "g2d.h" +#include "../../../misc/lv_area_private.h" +#include "lv_g2d_buf_map.h" +#include "lv_g2d_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/* Blit simple w/ opa and alpha channel */ +static void _g2d_fill(void * handle, struct g2d_surface * dst_surf); +static void _g2d_fill_with_opa(void * handle, struct g2d_surface * dst_surf, struct g2d_surface * src_surf); + +static void _g2d_set_src_surf(struct g2d_surface * src_surf, struct g2d_buf * buf, const lv_area_t * area, + lv_color_t color, lv_opa_t opa, lv_color_format_t cf); + +static void _g2d_set_dst_surf(struct g2d_surface * dst_surf, struct g2d_buf * buf, const lv_area_t * area, + int32_t stride, lv_color_t color, lv_color_format_t cf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_g2d_fill(lv_draw_task_t * t) +{ + lv_draw_fill_dsc_t * dsc = t->draw_dsc; + + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + lv_layer_t * layer = t->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + lv_area_t * coords = &t->area; + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, &t->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t blend_area; + if(!lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + /* G2D takes stride in pixels. */ + int32_t stride = draw_buf->header.stride / (lv_color_format_get_bpp(draw_buf->header.cf) / 8); + + /* Destination buffer */ + struct g2d_buf * dst_buf = g2d_search_buf_map(draw_buf->data); + + bool has_opa = (dsc->opa < (lv_opa_t)LV_OPA_MAX); + struct g2d_surface dst_surf; + _g2d_set_dst_surf(&dst_surf, dst_buf, &blend_area, stride, dsc->color, draw_buf->header.cf); + + void * handle = g2d_get_handle(); + + if(has_opa) { + struct g2d_buf * tmp_buf = g2d_alloc(lv_area_get_width(&blend_area) * lv_area_get_height( + &blend_area) * lv_color_format_get_size(draw_buf->header.cf), 1); + G2D_ASSERT_MSG(tmp_buf, "Failed to alloc temporary buffer."); + struct g2d_surface src_surf; + _g2d_set_src_surf(&src_surf, tmp_buf, &blend_area, dsc->color, dsc->opa, draw_buf->header.cf); + _g2d_fill_with_opa(handle, &dst_surf, &src_surf); + g2d_free(tmp_buf); + } + else { + _g2d_fill(handle, &dst_surf); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _g2d_set_src_surf(struct g2d_surface * src_surf, struct g2d_buf * buf, const lv_area_t * area, + lv_color_t color, lv_opa_t opa, lv_color_format_t cf) +{ + int32_t width = lv_area_get_width(area); + int32_t height = lv_area_get_height(area); + + src_surf->format = g2d_get_buf_format(cf); + + src_surf->left = 0; + src_surf->top = 0; + src_surf->right = width; + src_surf->bottom = height; + src_surf->stride = width; + src_surf->width = width; + src_surf->height = height; + + src_surf->planes[0] = buf->buf_paddr; + src_surf->rot = G2D_ROTATION_0; + + src_surf->clrcolor = g2d_rgba_to_u32(color); + src_surf->global_alpha = opa; + src_surf->blendfunc = G2D_ONE | G2D_PRE_MULTIPLIED_ALPHA; +} + +static void _g2d_set_dst_surf(struct g2d_surface * dst_surf, struct g2d_buf * buf, const lv_area_t * area, + int32_t stride, lv_color_t color, lv_color_format_t cf) +{ + int32_t width = lv_area_get_width(area); + int32_t height = lv_area_get_height(area); + + dst_surf->format = g2d_get_buf_format(cf); + + dst_surf->left = area->x1; + dst_surf->top = area->y1; + dst_surf->right = area->x1 + width; + dst_surf->bottom = area->y1 + height; + dst_surf->stride = stride; + dst_surf->width = width; + dst_surf->height = height; + + dst_surf->planes[0] = buf->buf_paddr; + dst_surf->rot = G2D_ROTATION_0; + + dst_surf->clrcolor = g2d_rgba_to_u32(color); + dst_surf->global_alpha = 0xff; + dst_surf->blendfunc = G2D_ONE_MINUS_SRC_ALPHA | G2D_PRE_MULTIPLIED_ALPHA; +} + +static void _g2d_fill_with_opa(void * handle, struct g2d_surface * dst_surf, struct g2d_surface * src_surf) +{ + g2d_clear(handle, src_surf); + + g2d_enable(handle, G2D_BLEND); + g2d_enable(handle, G2D_GLOBAL_ALPHA); + g2d_blit(handle, src_surf, dst_surf); + g2d_finish(handle); + g2d_disable(handle, G2D_GLOBAL_ALPHA); + g2d_disable(handle, G2D_BLEND); +} + +static void _g2d_fill(void * handle, struct g2d_surface * dst_surf) +{ + g2d_clear(handle, dst_surf); + + g2d_finish(handle); +} + +#endif /*LV_USE_DRAW_G2D*/ +#endif /*LV_USE_G2D*/ diff --git a/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d_img.c b/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d_img.c new file mode 100644 index 0000000..8a008da --- /dev/null +++ b/inc/lvgl/src/draw/nxp/g2d/lv_draw_g2d_img.c @@ -0,0 +1,312 @@ +/** + * @file lv_draw_g2d_img.c + * + */ + +/** + * Copyright 2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_g2d.h" + +#if LV_USE_G2D +#if LV_USE_DRAW_G2D +#include +#include "g2d.h" +#include "../../../misc/lv_area_private.h" +#include "../../lv_draw_image_private.h" +#include "../../lv_image_decoder_private.h" +#include "lv_g2d_utils.h" +#include "lv_g2d_buf_map.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _g2d_draw_core_cb(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, const lv_area_t * img_coords, + const lv_area_t * clipped_img_area); + +static struct g2d_buf * _g2d_handle_src_buf(const lv_draw_buf_t * data); + +static void _g2d_set_src_surf(struct g2d_surface * src_surf, struct g2d_buf * buf, const lv_area_t * area, + int32_t stride, lv_color_format_t cf, const lv_draw_image_dsc_t * dsc); + +static void _g2d_set_tmp_surf(struct g2d_surface * tmp_surf, struct g2d_buf * buf, const lv_area_t * area, + lv_color_format_t cf); + +static void _g2d_set_dst_surf(struct g2d_surface * dst_surf, struct g2d_buf * buf, const lv_area_t * area, + lv_draw_buf_t * draw_buf); + +/* Blit simple w/ opa and alpha channel */ +static void _g2d_blit(void * handle, struct g2d_surface * dst_surf, struct g2d_surface * src_surf); + +static void _g2d_blit_two_steps(void * handle, struct g2d_surface * dst_surf, struct g2d_surface * src_surf, + struct g2d_surface * tmp_surf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_g2d_img(lv_draw_task_t * t) +{ + lv_draw_image_dsc_t * dsc = t->draw_dsc; + + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + lv_area_t * coords = &t->area; + + bool is_tiled = (dsc->tile != 0); + + if(is_tiled) + lv_draw_image_tiled_helper(t, dsc, coords, _g2d_draw_core_cb, NULL); + else + lv_draw_image_normal_helper(t, dsc, coords, _g2d_draw_core_cb, NULL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _g2d_draw_core_cb(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, const lv_area_t * img_coords, + const lv_area_t * clipped_img_area) +{ + LV_UNUSED(sup); + lv_draw_buf_t * draw_buf = t->target_layer->draw_buf; + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, clipped_img_area); + lv_area_move(&rel_clip_area, -img_coords->x1, -img_coords->y1); + + lv_area_t rel_img_coords; + lv_area_copy(&rel_img_coords, img_coords); + lv_area_move(&rel_img_coords, -img_coords->x1, -img_coords->y1); + + lv_area_t src_area; + if(!lv_area_intersect(&src_area, &rel_clip_area, &rel_img_coords)) + return; + + lv_color_format_t src_cf = draw_dsc->header.cf; + + /* G2D takes stride in pixels. */ + const uint8_t pixel_size = lv_color_format_get_size(src_cf); + + uint32_t src_stride = draw_dsc->header.stride == 0 ? + lv_color_format_get_size(draw_dsc->header.cf) * draw_dsc->header.w : + draw_dsc->header.stride; + LV_ASSERT(pixel_size != 0); + src_stride /= pixel_size; + + /* Source image */ + struct g2d_buf * src_buf = _g2d_handle_src_buf(decoded); + + /* Destination buffer */ + struct g2d_buf * dst_buf = g2d_search_buf_map(draw_buf->data); + + + void * handle = g2d_get_handle(); + + struct g2d_surface src_surf; + struct g2d_surface dst_surf; + + _g2d_set_src_surf(&src_surf, src_buf, &src_area, src_stride, src_cf, draw_dsc); + _g2d_set_dst_surf(&dst_surf, dst_buf, clipped_img_area, draw_buf); + + bool has_rotation = (draw_dsc->rotation != 0); + + if(has_rotation) { + /** If the image has rotation, then blit in two steps: + * 1. Source with rotation to temporary surface. + * 2. Temporary with other transformations (if any) to destination (frame buffer). + */ + struct g2d_buf * tmp_buf = g2d_alloc(lv_area_get_width(&src_area) * lv_area_get_height( + &src_area) * lv_color_format_get_size(src_cf), 1); + G2D_ASSERT_MSG(tmp_buf, "Failed to alloc temporary buffer."); + struct g2d_surface tmp_surf; + _g2d_set_tmp_surf(&tmp_surf, tmp_buf, &src_area, src_cf); + _g2d_blit_two_steps(handle, &dst_surf, &src_surf, &tmp_surf); + g2d_free(tmp_buf); + } + else { + // If rotation is not involved, blit in one step. + _g2d_blit(handle, &dst_surf, &src_surf); + } +} + +static struct g2d_buf * _g2d_handle_src_buf(const lv_draw_buf_t * img_dsc) +{ + struct g2d_buf * src_buf = g2d_search_buf_map((void *)img_dsc->data); + + if(src_buf == NULL) { + src_buf = g2d_alloc(img_dsc->data_size, 1); + G2D_ASSERT_MSG(src_buf, "Failed to alloc source buffer."); + memcpy((uint8_t *)src_buf->buf_vaddr, img_dsc->data, img_dsc->data_size); + g2d_cache_op(src_buf, G2D_CACHE_FLUSH); + g2d_insert_buf_map((void *)img_dsc->data, src_buf); + } + + return src_buf; +} + +static void _g2d_set_src_surf(struct g2d_surface * src_surf, struct g2d_buf * buf, const lv_area_t * area, + int32_t stride, lv_color_format_t cf, const lv_draw_image_dsc_t * dsc) +{ + src_surf->format = g2d_get_buf_format(cf); + + int32_t src_w = lv_area_get_width(area); + int32_t src_h = lv_area_get_height(area); + + bool has_rotation = (dsc->rotation != 0); + enum g2d_rotation g2d_angle = G2D_ROTATION_0; + + if(has_rotation) { + switch(dsc->rotation) { + case 0: + g2d_angle = G2D_ROTATION_0; + break; + case 900: + g2d_angle = G2D_ROTATION_270; + break; + case 1800: + g2d_angle = G2D_ROTATION_180; + break; + case 2700: + g2d_angle = G2D_ROTATION_90; + break; + default: + g2d_angle = G2D_ROTATION_0; + } + } + + src_surf->left = area->x1; + src_surf->top = area->y1; + src_surf->right = area->x1 + src_w; + src_surf->bottom = area->y1 + src_h; + src_surf->stride = stride; + src_surf->width = src_w; + src_surf->height = src_h; + + src_surf->planes[0] = buf->buf_paddr; + src_surf->rot = g2d_angle; + + src_surf->clrcolor = g2d_rgba_to_u32(lv_color_black()); + src_surf->global_alpha = dsc->opa; + src_surf->blendfunc = G2D_ONE | G2D_PRE_MULTIPLIED_ALPHA; +} + +static void _g2d_set_tmp_surf(struct g2d_surface * tmp_surf, struct g2d_buf * buf, const lv_area_t * area, + lv_color_format_t cf) +{ + tmp_surf->format = g2d_get_buf_format(cf); + + int32_t dest_w = lv_area_get_width(area); + int32_t dest_h = lv_area_get_height(area); + + tmp_surf->left = area->x1; + tmp_surf->top = area->y1; + tmp_surf->right = area->x1 + dest_w; + tmp_surf->bottom = area->y1 + dest_h; + tmp_surf->stride = dest_w; + tmp_surf->width = dest_w; + tmp_surf->height = dest_h; + + tmp_surf->planes[0] = buf->buf_paddr; + tmp_surf->rot = G2D_ROTATION_0; + + tmp_surf->clrcolor = g2d_rgba_to_u32(lv_color_black()); + tmp_surf->global_alpha = 0x00; + tmp_surf->blendfunc = G2D_ONE_MINUS_SRC_ALPHA | G2D_PRE_MULTIPLIED_ALPHA; +} + +static void _g2d_set_dst_surf(struct g2d_surface * dst_surf, struct g2d_buf * buf, const lv_area_t * area, + lv_draw_buf_t * draw_buf) +{ + int32_t stride = draw_buf->header.stride / (lv_color_format_get_bpp(draw_buf->header.cf) / 8); + lv_color_format_t cf = draw_buf->header.cf; + uint32_t width = draw_buf->header.w; + uint32_t height = draw_buf->header.h; + + int32_t blend_w = lv_area_get_width(area); + int32_t blend_h = lv_area_get_height(area); + + dst_surf->format = g2d_get_buf_format(cf); + + dst_surf->left = area->x1; + dst_surf->top = area->y1; + dst_surf->right = area->x1 + blend_w; + dst_surf->bottom = area->y1 + blend_h; + dst_surf->stride = stride; + dst_surf->width = width; + dst_surf->height = height; + + dst_surf->planes[0] = buf->buf_paddr; + dst_surf->rot = G2D_ROTATION_0; + + dst_surf->clrcolor = g2d_rgba_to_u32(lv_color_black()); + dst_surf->global_alpha = 0xff; + dst_surf->blendfunc = G2D_ONE_MINUS_SRC_ALPHA | G2D_PRE_MULTIPLIED_ALPHA; +} + +static void _g2d_blit(void * handle, struct g2d_surface * dst_surf, struct g2d_surface * src_surf) +{ + g2d_enable(handle, G2D_BLEND); + g2d_enable(handle, G2D_GLOBAL_ALPHA); + g2d_blit(handle, src_surf, dst_surf); + g2d_finish(handle); + g2d_disable(handle, G2D_GLOBAL_ALPHA); + g2d_disable(handle, G2D_BLEND); +} + +static void _g2d_blit_two_steps(void * handle, struct g2d_surface * dst_surf, struct g2d_surface * src_surf, + struct g2d_surface * tmp_surf) +{ + g2d_clear(handle, tmp_surf); + + g2d_enable(handle, G2D_BLEND); + g2d_enable(handle, G2D_GLOBAL_ALPHA); + g2d_blit(handle, src_surf, tmp_surf); + g2d_finish(handle); + g2d_disable(handle, G2D_GLOBAL_ALPHA); + g2d_disable(handle, G2D_BLEND); + + /**After first blit, change blending and global alpha for temporary surface + * since the surface now acts as source. + */ + tmp_surf->blendfunc = G2D_ONE | G2D_PRE_MULTIPLIED_ALPHA; + tmp_surf->global_alpha = 0xFF; + + g2d_enable(handle, G2D_BLEND); + g2d_enable(handle, G2D_GLOBAL_ALPHA); + g2d_blit(handle, tmp_surf, dst_surf); + g2d_finish(handle); + g2d_disable(handle, G2D_GLOBAL_ALPHA); + g2d_disable(handle, G2D_BLEND); +} +#endif /*LV_USE_DRAW_G2D*/ +#endif /*LV_USE_G2D*/ diff --git a/inc/lvgl/src/draw/nxp/g2d/lv_g2d_buf_map.c b/inc/lvgl/src/draw/nxp/g2d/lv_g2d_buf_map.c new file mode 100644 index 0000000..9a26a71 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/g2d/lv_g2d_buf_map.c @@ -0,0 +1,282 @@ +/** + * @file lv_g2d_buf_map.c + * + */ + +/** + * Copyright 2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#include "lv_g2d_buf_map.h" + +#if LV_USE_G2D +#if LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D +#include +#include "lv_g2d_utils.h" +#include "g2d.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static unsigned long _map_hash_function(void * ptr); + +static lv_map_item_t * _map_create_item(void * key, struct g2d_buf * value); + +static void _map_free_item(lv_map_item_t * item); + +static void _handle_collision(unsigned long index, lv_map_item_t * item); + +static void _map_free_list(unsigned long index, lv_array_t * list); + +/********************** + * STATIC VARIABLES + **********************/ + +static lv_buf_map_t * table; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void g2d_create_buf_map(void) +{ + table = (lv_buf_map_t *) lv_malloc(sizeof(lv_buf_map_t)); + table->size = LV_G2D_HASH_TABLE_SIZE; + table->count = 0; + table->items = (lv_map_item_t **) lv_malloc_zeroed(table->size * sizeof(lv_map_item_t *)); + table->overflow_list = (lv_array_t **) lv_malloc_zeroed(table->size * sizeof(lv_array_t *)); +} + +void g2d_free_buf_map(void) +{ + for(int i = 0; i < table->size; i++) { + if(table->overflow_list[i]) { + lv_array_deinit(table->overflow_list[i]); + lv_free(table->overflow_list[i]); + } + + lv_map_item_t * item = table->items[i]; + if(item != NULL) + _map_free_item(item); + } + + lv_free(table->items); + lv_free(table->overflow_list); + lv_free(table); +} + +void g2d_insert_buf_map(void * key, struct g2d_buf * value) +{ + lv_map_item_t * item = _map_create_item(key, value); + int index = _map_hash_function(key); + + if(table->count == table->size) { + /* Table is full. */ + _map_free_item(item); + G2D_ASSERT_MSG(false, "Hash table is full. Increase LV_G2D_HASH_TABLE_SIZE."); + return; + } + + if(table->items[index] == NULL) { + /* Key not found. Insert item. */ + table->items[index] = item; + table->count++; + return; + } + else { + if(table->items[index]->key == key) { + /* Key already exists, update value. */ + table->items[index]->value = value; + return; + } + else { + /* Handle the collision */ + _handle_collision(index, item); + return; + } + } + +} + +struct g2d_buf * g2d_search_buf_map(void * key) +{ + int index = _map_hash_function(key); + lv_map_item_t * item = table->items[index]; + lv_array_t * list = (lv_array_t *)table->overflow_list[index]; + + if(item == NULL) + return NULL; + + if(item->key == key) + return item->value; + + if(list == NULL) + return NULL; + + for(uint32_t i = 0; i < lv_array_size(list); i++) { + item = (lv_map_item_t *)lv_array_at(list, i); + if(item->key == key) + return item->value; + } + + return NULL; +} + +void g2d_free_item(void * key) +{ + /* Delete an item from the table. */ + int index = _map_hash_function(key); + lv_map_item_t * item = table->items[index]; + lv_array_t * list = (lv_array_t *)table->overflow_list[index]; + + /* If there is no item, then nothing to do. */ + if(item == NULL) { + return; + } + else if(item->key == key) { + /* Remove the item. */ + table->items[index] = NULL; + _map_free_item(item); + table->count--; + + /* If there is no collision chain, just return. */ + if(list == NULL) { + return; + } + + /* If a collision chain exists, promote the first item. */ + lv_map_item_t * promoted_item = (lv_map_item_t *)lv_array_at(list, 0); + table->items[index] = _map_create_item(promoted_item->key, promoted_item->value); + lv_array_remove(list, 0); + if(lv_array_size(list) == 0) { + _map_free_list(index, list); + } + return; + } + /* If the item is not the one we are searching, and there is no list, then return. */ + if(list == NULL) return; + else { + /* The item might be inside the list. */ + for(uint32_t i = 0; i < lv_array_size(list); i++) { + item = (lv_map_item_t *)lv_array_at(list, i); + if(item->key == key) { + g2d_free(item->value); + lv_array_remove(list, i); + table->count--; + if(lv_array_size(list) == 0) { + _map_free_list(index, list); + } + return; + } + } + } +} + +void g2d_print_table(void) +{ + LV_LOG("\nHash Table\n-------------------\n"); + + for(int i = 0; i < table->size; i++) { + if(table->items[i]) { + LV_LOG("Index:%d, Key:%p, Value:%p\n", i, table->items[i] -> key, (void *)table->items[i]->value); + if(table->overflow_list[i]) { + for(uint32_t j = 0 ; j < lv_array_size(table->overflow_list[i]); j++) { + lv_map_item_t * item = (lv_map_item_t *)lv_array_at(table->overflow_list[i], j); + LV_LOG("Index:%d, Key:%p, Value:%p\n", i, item -> key, (void *)item->value); + } + + } + } + } + + LV_LOG("-------------------\n\n"); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static unsigned long _map_hash_function(void * ptr) +{ + unsigned long i = 0; + char str[64]; + G2D_ASSERT_MSG(ptr, "Key is null."); + sprintf(str, "%p", ptr); + + for(int j = 0; str[j]; j++) + i += str[j]; + + return i % LV_G2D_HASH_TABLE_SIZE; +} + +static void _handle_collision(unsigned long index, lv_map_item_t * item) +{ + if(table->overflow_list[index] == NULL) { + /* Create the list. */ + lv_array_t * list = (lv_array_t *) lv_malloc(sizeof(lv_array_t)); + lv_array_init(list, LV_ARRAY_DEFAULT_CAPACITY, sizeof(lv_map_item_t)); + lv_array_push_back(list, item); + table->overflow_list[index] = list; + table->count++; + return; + } + else { + lv_array_t * list = (lv_array_t *)table->overflow_list[index]; + for(uint32_t i = 0; i < lv_array_size(list); i++) { + lv_map_item_t * it = (lv_map_item_t *)lv_array_at(list, i); + if(it->key == item->key) { + /* Key exists, update value. */ + it->value = item->value; + return; + } + } + /* Insert to the list. */ + lv_array_push_back(table->overflow_list[index], item); + table->count++; + return; + } +} + +static lv_map_item_t * _map_create_item(void * key, struct g2d_buf * value) +{ + lv_map_item_t * item = (lv_map_item_t *) lv_malloc(sizeof(lv_map_item_t)); + G2D_ASSERT_MSG(item, "Failed to alloc item."); + item->key = key; + item->value = value; + return item; +} + +static void _map_free_item(lv_map_item_t * item) +{ + /* Also free the g2d_buf. */ + g2d_free(item->value); + item->key = NULL; + item->value = NULL; + lv_free(item); + item = NULL; +} + +static void _map_free_list(unsigned long index, lv_array_t * list) +{ + lv_array_deinit(list); + lv_free(list); + table->overflow_list[index] = NULL; +} + +#endif /*LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D*/ +#endif /*LV_USE_G2D*/ diff --git a/inc/lvgl/src/draw/nxp/g2d/lv_g2d_buf_map.h b/inc/lvgl/src/draw/nxp/g2d/lv_g2d_buf_map.h new file mode 100644 index 0000000..c1d1f86 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/g2d/lv_g2d_buf_map.h @@ -0,0 +1,83 @@ + +/** + * @file lv_g2d_buf_map.h + * + */ + +/** + * Copyright 2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_G2D_BUF_MAP_H +#define LV_G2D_BUF_MAP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_G2D +#if LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D + +#include "../../../misc/lv_array.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/* Map item definition. */ +typedef struct lv_map_item { + /* Virtual address buffer. */ + void * key; + struct g2d_buf * value; +} lv_map_item_t; + +/*Buf map definition. */ +typedef struct lv_buf_map { + lv_map_item_t ** items; + lv_array_t ** overflow_list; + + int size; + int count; +} lv_buf_map_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void g2d_create_buf_map(void); + +void g2d_free_buf_map(void); + +void g2d_insert_buf_map(void * key, struct g2d_buf * value); + +struct g2d_buf * g2d_search_buf_map(void * key); + +void g2d_free_item(void * key); + +void g2d_print_table(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D*/ +#endif /*LV_USE_G2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_G2D_BUF_MAP_H */ diff --git a/inc/lvgl/src/draw/nxp/g2d/lv_g2d_utils.c b/inc/lvgl/src/draw/nxp/g2d/lv_g2d_utils.c new file mode 100644 index 0000000..81ef9a5 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/g2d/lv_g2d_utils.c @@ -0,0 +1,178 @@ +/** + * @file lv_g2d_utils.c + * + */ + +/** + * Copyright 2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_g2d_utils.h" + +#if LV_USE_G2D +#if LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D +#include "lv_g2d_buf_map.h" +#include "lv_draw_g2d.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * g2d_handle; +/********************** +* MACROS +**********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +g2d_format_t g2d_get_buf_format(lv_color_format_t cf) +{ + g2d_format_t color_f = G2D_RGB565; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + color_f = G2D_RGB565; + break; + case LV_COLOR_FORMAT_ARGB8888: + color_f = G2D_BGRA8888; + break; + case LV_COLOR_FORMAT_XRGB8888: + color_f = G2D_BGRX8888; + break; + case LV_COLOR_FORMAT_RGB888: + color_f = G2D_BGR888; + break; + case LV_COLOR_FORMAT_NV12: + color_f = G2D_NV12; + break; + case LV_COLOR_FORMAT_I420: + color_f = G2D_I420; + break; + case LV_COLOR_FORMAT_NV21: + color_f = G2D_NV21; + break; + case LV_COLOR_FORMAT_YUY2: + color_f = G2D_YUYV; + break; + case LV_COLOR_FORMAT_UYVY: + color_f = G2D_UYVY; + break; + default: + G2D_ASSERT_MSG(false, "Unsupported color format."); + break; + } + return color_f; +} + +uint32_t g2d_rgba_to_u32(lv_color_t color) +{ + return (uint32_t)((color.red) + (color.green << 8) + (color.blue << 16) + ((uint32_t)0xff << 24)); +} + +int32_t g2d_get_buf_fd(const lv_draw_buf_t * draw_buf) +{ + struct g2d_buf * buf = g2d_search_buf_map(draw_buf->data); + G2D_ASSERT_MSG(buf, "Failed to find buffer in map."); + return g2d_buf_export_fd(buf); +} + +void g2d_set_handle(void * handle) +{ + g2d_handle = handle; +} +void * g2d_get_handle(void) +{ + return g2d_handle; +} + +#if LV_USE_ROTATE_G2D +void g2d_rotate(lv_draw_buf_t * buf1, lv_draw_buf_t * buf2, int32_t width, int32_t height, uint32_t rotation, + lv_color_format_t cf) +{ + struct g2d_surface src_surf, dst_surf; + struct g2d_buf * src_buf = g2d_search_buf_map(buf1->data); + struct g2d_buf * dst_buf = g2d_search_buf_map(buf2->data); + bool has_rotation = (rotation != 0); + + int32_t src_width = width; + int32_t src_height = height; + if(has_rotation) { + if(rotation == LV_DISPLAY_ROTATION_90 || rotation == LV_DISPLAY_ROTATION_270) { + src_width = height; + src_height = width; + } + } + + src_surf.format = g2d_get_buf_format(cf); + + src_surf.left = 0; + src_surf.top = 0; + src_surf.right = src_width; + src_surf.bottom = src_height; + src_surf.stride = src_width; + src_surf.width = src_width; + src_surf.height = src_height; + + src_surf.planes[0] = src_buf->buf_paddr; + src_surf.rot = G2D_ROTATION_0; + + enum g2d_rotation g2d_angle = G2D_ROTATION_0; + if(has_rotation) { + switch(rotation) { + case LV_DISPLAY_ROTATION_0: + g2d_angle = G2D_ROTATION_0; + break; + case LV_DISPLAY_ROTATION_90: + g2d_angle = G2D_ROTATION_90; + break; + case LV_DISPLAY_ROTATION_180: + g2d_angle = G2D_ROTATION_180; + break; + case LV_DISPLAY_ROTATION_270: + g2d_angle = G2D_ROTATION_270; + break; + default: + g2d_angle = G2D_ROTATION_0; + } + } + + dst_surf.format = g2d_get_buf_format(cf); + + dst_surf.left = 0; + dst_surf.top = 0; + dst_surf.right = width; + dst_surf.bottom = height; + dst_surf.stride = width; + dst_surf.width = width; + dst_surf.height = height; + + dst_surf.planes[0] = dst_buf->buf_paddr; + dst_surf.rot = g2d_angle; + + void * handle = g2d_get_handle(); + g2d_blit(handle, &src_surf, &dst_surf); + g2d_finish(handle); +} +#endif + +/********************** +* STATIC FUNCTIONS +**********************/ + +#endif /*LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D*/ +#endif /*LV_USE_G2D*/ diff --git a/inc/lvgl/src/draw/nxp/g2d/lv_g2d_utils.h b/inc/lvgl/src/draw/nxp/g2d/lv_g2d_utils.h new file mode 100644 index 0000000..d71095c --- /dev/null +++ b/inc/lvgl/src/draw/nxp/g2d/lv_g2d_utils.h @@ -0,0 +1,83 @@ +/** + * @file lv_g2d_utils.h + * + */ + +/** + * Copyright 2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_G2D_UTILS_H +#define LV_G2D_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_G2D +#if LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D +#include "../../sw/lv_draw_sw_private.h" +#include "g2d.h" +#include "g2dExt.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_G2D_ASSERT +#define G2D_ASSERT(expr) LV_ASSERT(expr) +#else +#define G2D_ASSERT(expr) +#endif + +#define G2D_ASSERT_MSG(expr, msg) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR(msg); \ + G2D_ASSERT(false); \ + } \ + } while(0) + +/********************** + * TYPEDEFS + **********************/ + +typedef enum g2d_format g2d_format_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +g2d_format_t g2d_get_buf_format(lv_color_format_t cf); + +uint32_t g2d_rgba_to_u32(lv_color_t color); + +int32_t g2d_get_buf_fd(const lv_draw_buf_t * draw_buf); + +void g2d_set_handle(void * handle); + +void * g2d_get_handle(void); + +#if LV_USE_ROTATE_G2D +void g2d_rotate(lv_draw_buf_t * buf1, lv_draw_buf_t * buf2, int32_t width, int32_t height, uint32_t rotation, + lv_color_format_t cf); +#endif +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D*/ +#endif /*LV_USE_G2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_G2D_UTILS_H*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c b/inc/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c new file mode 100644 index 0000000..1160005 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c @@ -0,0 +1,117 @@ +/** + * @file lv_draw_buf_pxp.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP +#include "../../lv_draw_buf_private.h" +#include "lv_pxp_cfg.h" +#include "lv_pxp_utils.h" + +#include "lvgl_support.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_buf_pxp_init_handlers(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + lv_draw_buf_handlers_t * font_handlers = lv_draw_buf_get_font_handlers(); + lv_draw_buf_handlers_t * image_handlers = lv_draw_buf_get_image_handlers(); + + handlers->invalidate_cache_cb = _invalidate_cache; + font_handlers->invalidate_cache_cb = _invalidate_cache; + image_handlers->invalidate_cache_cb = _invalidate_cache; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + lv_color_format_t cf = header->cf; + + if(area->y1 == 0) { + uint32_t size = stride * lv_area_get_height(area); + + /* Invalidate full buffer. */ + DEMO_CleanInvalidateCacheByAddr((void *)draw_buf->data, size); + return; + } + + const uint8_t * buf_u8 = draw_buf->data; + /*Cache management requires us to know the cache line size for proper alignment */ + uint8_t align_bytes = __SCB_DCACHE_LINE_SIZE; + uint8_t bits_per_pixel = lv_color_format_get_bpp(cf); + + uint16_t align_pixels = align_bytes * 8 / bits_per_pixel; + uint16_t offset_x = 0; + + if(area->x1 >= (int32_t)(area->x1 % align_pixels)) { + uint16_t shift_x = area->x1 - (area->x1 % align_pixels); + + offset_x = area->x1 - shift_x; + buf_u8 += (shift_x * bits_per_pixel) / 8; + } + + if(area->y1) { + uint16_t shift_y = area->y1; + + buf_u8 += shift_y * stride; + } + + /* Area to clear can start from a different offset in buffer. + * Invalidate the area line by line. + */ + uint16_t line_pixels = offset_x + lv_area_get_width(area); + uint16_t line_size = (line_pixels * bits_per_pixel) / 8; + uint16_t area_height = lv_area_get_height(area); + + for(uint16_t y = 0; y < area_height; y++) { + const void * line_addr = buf_u8 + y * stride; + + DEMO_CleanInvalidateCacheByAddr((void *)line_addr, line_size); + } +} + +#endif /*LV_USE_DRAW_PXP*/ +#endif /*LV_USE_PXP*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c new file mode 100644 index 0000000..5ab12ce --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c @@ -0,0 +1,496 @@ +/** + * @file lv_draw_pxp.c + * + */ + +/** + * Copyright 2022-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP +#include "lv_pxp_cfg.h" +#include "lv_pxp_utils.h" + +#if LV_USE_PARALLEL_DRAW_DEBUG + #include "../../../core/lv_global.h" +#endif + +/********************* + * DEFINES + *********************/ + +#define DRAW_UNIT_ID_PXP 3 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/* + * Evaluate a task and set the score and preferred PXP unit. + * Return 1 if task is preferred, 0 otherwise (task is not supported). + */ +static int32_t _pxp_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +/* + * Dispatch a task to the PXP unit. + * Return 1 if task was dispatched, 0 otherwise (task not supported). + */ +static int32_t _pxp_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +/* + * Delete the PXP draw unit. + */ +static int32_t _pxp_delete(lv_draw_unit_t * draw_unit); + +#if LV_USE_PXP_DRAW_THREAD + static void _pxp_render_thread_cb(void * ptr); +#endif + +static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u); + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_PARALLEL_DRAW_DEBUG + #define _draw_info LV_GLOBAL_DEFAULT()->draw_info +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_init(void) +{ + lv_pxp_init(); + +#if LV_USE_DRAW_PXP + lv_draw_buf_pxp_init_handlers(); + + lv_draw_pxp_unit_t * draw_pxp_unit = lv_draw_create_unit(sizeof(lv_draw_pxp_unit_t)); + draw_pxp_unit->base_unit.evaluate_cb = _pxp_evaluate; + draw_pxp_unit->base_unit.dispatch_cb = _pxp_dispatch; + draw_pxp_unit->base_unit.delete_cb = _pxp_delete; + draw_pxp_unit->base_unit.name = "NXP_PXP"; + +#if LV_USE_PXP_DRAW_THREAD + lv_thread_init(&draw_pxp_unit->thread, "pxpdraw", LV_DRAW_THREAD_PRIO, _pxp_render_thread_cb, 2 * 1024, draw_pxp_unit); +#endif +#endif /*LV_USE_DRAW_PXP*/ +} + +void lv_draw_pxp_deinit(void) +{ + lv_pxp_deinit(); +} + +void lv_draw_pxp_rotate(const void * src_buf, void * dest_buf, int32_t src_width, int32_t src_height, + int32_t src_stride, int32_t dest_stride, lv_display_rotation_t rotation, + lv_color_format_t cf) +{ + lv_pxp_reset(); + + /* Convert rotation angle + * To be in sync with CPU, the received angle is counterclockwise + * and the PXP constants are for clockwise rotation + * + * counterclockwise clockwise + * LV_DISPLAY_ROTATION_90 -> kPXP_Rotate270 + * LV_DISPLAY_ROTATION_270 -> kPXP_Rotate90 + */ + pxp_rotate_degree_t pxp_rotation; + switch(rotation) { + case LV_DISPLAY_ROTATION_0: + pxp_rotation = kPXP_Rotate0; + break; + case LV_DISPLAY_ROTATION_270: + pxp_rotation = kPXP_Rotate90; + break; + case LV_DISPLAY_ROTATION_180: + pxp_rotation = kPXP_Rotate180; + break; + case LV_DISPLAY_ROTATION_90: + pxp_rotation = kPXP_Rotate270; + break; + default: + pxp_rotation = kPXP_Rotate0; + break; + } + PXP_SetRotateConfig(PXP_ID, kPXP_RotateOutputBuffer, pxp_rotation, kPXP_FlipDisable); + + /*Simple blit, no effect - Disable PS buffer*/ + PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + + /*AS buffer - source image*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = pxp_get_as_px_format(cf), + .bufferAddr = (uint32_t)src_buf, + .pitchBytes = src_stride + }; + PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, src_width - 1U, src_height - 1U); + PXP_EnableAlphaSurfaceOverlayColorKey(PXP_ID, false); + + /*Output buffer.*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = pxp_get_out_px_format(cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)dest_buf, + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride, + .width = src_width, + .height = src_height + }; + PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); + + lv_pxp_run(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#if LV_USE_DRAW_PXP +static inline bool _pxp_src_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + is_cf_supported = true; + break; + default: + break; + } + + return is_cf_supported; +} + +static inline bool _pxp_dest_cf_supported(lv_color_format_t cf) +{ + bool is_cf_supported = false; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + is_cf_supported = true; + break; + default: + break; + } + + return is_cf_supported; +} + +static bool _pxp_draw_img_supported(const lv_draw_image_dsc_t * draw_dsc) +{ + const lv_image_dsc_t * img_dsc = draw_dsc->src; + + bool has_recolor = (draw_dsc->recolor_opa > LV_OPA_MIN); + bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE); + + /* Recolor and transformation are not supported at the same time. */ + if(has_recolor && has_transform) + return false; + + bool has_opa = (draw_dsc->opa < (lv_opa_t)LV_OPA_MAX); + bool src_has_alpha = (img_dsc->header.cf == LV_COLOR_FORMAT_ARGB8888); + + /* + * Recolor or transformation for images w/ opa or alpha channel can't + * be obtained in a single PXP configuration. Two steps are required. + */ + if((has_recolor || has_transform) && (has_opa || src_has_alpha)) + return false; + + /* PXP can only rotate at 90x angles. */ + if(draw_dsc->rotation % 900) + return false; + + /* + * PXP is set to process 16x16 blocks to optimize the system for memory + * bandwidth and image processing time. + * The output engine essentially truncates any output pixels after the + * desired number of pixels has been written. + * When rotating a source image and the output is not divisible by the block + * size, the incorrect pixels could be truncated and the final output image + * can look shifted. + * + * No combination of rotate with flip, scaling or decimation is possible + * if buffer is unaligned. + */ + if(has_transform && (img_dsc->header.w % 16 || img_dsc->header.h % 16)) + return false; + + return true; +} + +static int32_t _pxp_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) +{ + LV_UNUSED(u); + + const lv_draw_dsc_base_t * draw_dsc_base = (lv_draw_dsc_base_t *) t->draw_dsc; + + if(!_pxp_dest_cf_supported(draw_dsc_base->layer->color_format)) + return 0; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: { + const lv_draw_fill_dsc_t * draw_dsc = (lv_draw_fill_dsc_t *) t->draw_dsc; + + /* Most simple case: just a plain rectangle (no radius, no gradient). */ + if((draw_dsc->radius != 0) || (draw_dsc->grad.dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE)) + return 0; + + if(t->preference_score > 70) { + t->preference_score = 70; + t->preferred_draw_unit_id = DRAW_UNIT_ID_PXP; + } + return 1; + } + + case LV_DRAW_TASK_TYPE_LAYER: { + const lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + + if(!_pxp_src_cf_supported(layer_to_draw->color_format)) + return 0; + + if(!_pxp_draw_img_supported(draw_dsc)) + return 0; + + if(t->preference_score > 70) { + t->preference_score = 70; + t->preferred_draw_unit_id = DRAW_UNIT_ID_PXP; + } + return 1; + } + + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc; + const lv_image_dsc_t * img_dsc = draw_dsc->src; + + if(img_dsc->header.cf >= LV_COLOR_FORMAT_PROPRIETARY_START) + return 0; + + if((!_pxp_src_cf_supported(img_dsc->header.cf)) || + (!pxp_buf_aligned(img_dsc->data, img_dsc->header.stride))) + return 0; + + if(!_pxp_draw_img_supported(draw_dsc)) + return 0; + + if(t->preference_score > 70) { + t->preference_score = 70; + t->preferred_draw_unit_id = DRAW_UNIT_ID_PXP; + } + return 1; + } + default: + return 0; + } + + return 0; +} + +static int32_t _pxp_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_pxp_unit_t * draw_pxp_unit = (lv_draw_pxp_unit_t *) draw_unit; + + /* Return immediately if it's busy with draw task. */ + if(draw_pxp_unit->task_act) + return 0; + + /* Try to get an ready to draw. */ + lv_draw_task_t * t = lv_draw_get_available_task(layer, NULL, DRAW_UNIT_ID_PXP); + + if(t == NULL || t->preferred_draw_unit_id != DRAW_UNIT_ID_PXP) + return LV_DRAW_UNIT_IDLE; + + if(lv_draw_layer_alloc_buf(layer) == NULL) + return LV_DRAW_UNIT_IDLE; + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_pxp_unit->task_act = t; + +#if LV_USE_PXP_DRAW_THREAD + /* Let the render thread work. */ + if(draw_pxp_unit->inited) + lv_thread_sync_signal(&draw_pxp_unit->sync); +#else + _pxp_execute_drawing(draw_pxp_unit); + + draw_pxp_unit->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + draw_pxp_unit->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); +#endif + + return 1; +} + +static int32_t _pxp_delete(lv_draw_unit_t * draw_unit) +{ +#if LV_USE_PXP_DRAW_THREAD + lv_draw_pxp_unit_t * draw_pxp_unit = (lv_draw_pxp_unit_t *) draw_unit; + + LV_LOG_INFO("Cancel PXP draw thread."); + draw_pxp_unit->exit_status = true; + + if(draw_pxp_unit->inited) + lv_thread_sync_signal(&draw_pxp_unit->sync); + + lv_result_t res = lv_thread_delete(&draw_pxp_unit->thread); + + return res; +#else + LV_UNUSED(draw_unit); + + return 0; +#endif +} + +static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + lv_layer_t * layer = t->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + + lv_area_t draw_area; + if(!lv_area_intersect(&draw_area, &t->area, &t->clip_area)) + return; /*Fully clipped, nothing to do*/ + + /* Make area relative to the buffer */ + lv_area_move(&draw_area, -layer->buf_area.x1, -layer->buf_area.y1); + + /* Invalidate only the drawing area */ + lv_draw_buf_invalidate_cache(draw_buf, &draw_area); + +#if LV_USE_PARALLEL_DRAW_DEBUG + t->draw_unit = &u->base_unit; +#endif + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_pxp_fill(t); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_pxp_img(t); + break; + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_pxp_layer(t); + break; + default: + break; + } + +#if LV_USE_PARALLEL_DRAW_DEBUG + /*Layers manage it for themselves*/ + if(t->type != LV_DRAW_TASK_TYPE_LAYER) { + lv_area_t draw_area; + if(!lv_area_intersect(&draw_area, &t->area, &t->clip_area)) + return; + + int32_t idx = u->base_unit.idx; + + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_palette_main(idx % LV_PALETTE_LAST); + rect_dsc.border_color = rect_dsc.bg_color; + rect_dsc.bg_opa = LV_OPA_10; + rect_dsc.border_opa = LV_OPA_80; + rect_dsc.border_width = 1; + lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &draw_area); + + lv_point_t txt_size; + lv_text_get_size_attributes(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.y1 = draw_area.y1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y1 + txt_size.y - 1; + + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.bg_color = lv_color_white(); + lv_draw_sw_fill((lv_draw_unit_t *)u, &rect_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_black(); + label_dsc.text = buf; + lv_draw_sw_label((lv_draw_unit_t *)u, &label_dsc, &txt_area); + } +#endif +} + +#if LV_USE_PXP_DRAW_THREAD +static void _pxp_render_thread_cb(void * ptr) +{ + lv_draw_pxp_unit_t * u = ptr; + + lv_thread_sync_init(&u->sync); + u->inited = true; + + while(1) { + /* Wait for sync if there is no task set. */ + while(u->task_act == NULL) { + if(u->exit_status) + break; + + lv_thread_sync_wait(&u->sync); + } + + if(u->exit_status) { + LV_LOG_INFO("Ready to exit PXP draw thread."); + break; + } + + _pxp_execute_drawing(u); + + /* Signal the ready state to dispatcher. */ + u->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + + /* Cleanup. */ + u->task_act = NULL; + + /* The draw unit is free now. Request a new dispatching as it can get a new task. */ + lv_draw_dispatch_request(); + } + + u->inited = false; + lv_thread_sync_delete(&u->sync); + LV_LOG_INFO("Exit PXP draw thread."); +} +#endif +#endif /*LV_USE_DRAW_PXP*/ +#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ +#endif /*LV_USE_PXP*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h new file mode 100644 index 0000000..a6833b5 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp.h @@ -0,0 +1,82 @@ +/** + * @file lv_draw_pxp.h + * + */ + +/** + * Copyright 2022-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_DRAW_PXP_H +#define LV_DRAW_PXP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP +#include "../../lv_draw_private.h" +#include "../../../display/lv_display_private.h" +#include "../../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_draw_pxp_unit_t { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; +#if LV_USE_OS + lv_thread_sync_t sync; + lv_thread_t thread; + volatile bool inited; + volatile bool exit_status; +#endif +} lv_draw_pxp_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_pxp_init(void); + +void lv_draw_pxp_deinit(void); + +void lv_draw_pxp_rotate(const void * src_buf, void * dest_buf, int32_t src_width, int32_t src_height, + int32_t src_stride, int32_t dest_stride, lv_display_rotation_t rotation, + lv_color_format_t cf); + +#if LV_USE_DRAW_PXP +void lv_draw_buf_pxp_init_handlers(void); + +void lv_draw_pxp_fill(lv_draw_task_t * t); + +void lv_draw_pxp_img(lv_draw_task_t * t); + +void lv_draw_pxp_layer(lv_draw_task_t * t); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_DRAW_PXP*/ +#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ +#endif /*LV_USE_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_PXP_H*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp_fill.c b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp_fill.c new file mode 100644 index 0000000..6aa3159 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp_fill.c @@ -0,0 +1,151 @@ +/** + * @file lv_draw_pxp_fill.c + * + */ + +/** + * Copyright 2020-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP +#include "lv_pxp_cfg.h" +#include "lv_pxp_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _pxp_fill(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const lv_draw_fill_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_fill(lv_draw_task_t * t) +{ + const lv_draw_fill_dsc_t * dsc = t->draw_dsc; + const lv_area_t * coords = &t->area; + + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + lv_layer_t * layer = t->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, &t->clip_area); + lv_area_move(&rel_clip_area, -layer->buf_area.x1, -layer->buf_area.y1); + + lv_area_t blend_area; + if(!lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + _pxp_fill(draw_buf->data, &blend_area, draw_buf->header.stride, draw_buf->header.cf, dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _pxp_fill(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const lv_draw_fill_dsc_t * dsc) +{ + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + + lv_pxp_reset(); + + uint8_t px_size = lv_color_format_get_size(dest_cf); + + /*OUT buffer configure*/ + pxp_output_buffer_config_t outputConfig = { + .pixelFormat = pxp_get_out_px_format(dest_cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + px_size * dest_area->x1), + .buffer1Addr = (uint32_t)NULL, + .pitchBytes = dest_stride, + .width = dest_w, + .height = dest_h + }; + + PXP_SetOutputBufferConfig(PXP_ID, &outputConfig); + + if(dsc->opa >= (lv_opa_t)LV_OPA_MAX) { + /*Simple color fill without opacity - AS disabled*/ + PXP_SetAlphaSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + + } + else { + /*Fill with opacity - AS used as source (same as OUT)*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = pxp_get_as_px_format(dest_cf), + .bufferAddr = outputConfig.buffer0Addr, + .pitchBytes = outputConfig.pitchBytes + }; + + PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + } + + /*Disable PS, use as color generator*/ + PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + PXP_SetProcessSurfaceBackGroundColor(PXP_ID, lv_color_to_u32(dsc->color)); + + /** + * Configure Porter-Duff blending - src settings are unused for fill without opacity (opa = 0xff). + * + * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h: + * srcFactorMode is actually applied on PS alpha value + * dstFactorMode is actually applied on AS alpha value + */ + pxp_porter_duff_config_t pdConfig = { + .enable = 1, + .dstColorMode = kPXP_PorterDuffColorNoAlpha, + .srcColorMode = kPXP_PorterDuffColorNoAlpha, + .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, + .srcGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, + .dstFactorMode = kPXP_PorterDuffFactorStraight, + .srcFactorMode = (dsc->opa >= (lv_opa_t)LV_OPA_MAX) ? kPXP_PorterDuffFactorStraight : kPXP_PorterDuffFactorInversed, + .dstGlobalAlpha = dsc->opa, + .srcGlobalAlpha = dsc->opa, + .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ + .srcAlphaMode = kPXP_PorterDuffAlphaStraight /*don't care*/ + }; + + PXP_SetPorterDuffConfig(PXP_ID, &pdConfig); + + lv_pxp_run(); +} + +#endif /*LV_USE_DRAW_PXP*/ +#endif /*LV_USE_PXP*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp_img.c b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp_img.c new file mode 100644 index 0000000..6cd8051 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp_img.c @@ -0,0 +1,342 @@ +/** + * @file lv_draw_pxp_img.c + * + */ + +/** + * Copyright 2020-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP +#include "lv_pxp_cfg.h" +#include "lv_pxp_utils.h" +#include "../../lv_draw_image_private.h" +#include "../../lv_image_decoder_private.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void _pxp_draw_core_cb(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +/* Blit w/ recolor for images w/o opa and alpha channel */ +static void _pxp_blit_recolor(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc); + +/* Blit w/ transformation for images w/o opa and alpha channel */ +static void _pxp_blit_transform(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc); + +/* Blit simple w/ opa and alpha channel */ +static void _pxp_blit(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, lv_opa_t opa); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_img(lv_draw_task_t * t) +{ + const lv_draw_image_dsc_t * dsc = t->draw_dsc; + const lv_area_t * coords = &t->area; + + if(dsc->opa <= (lv_opa_t)LV_OPA_MIN) + return; + + bool is_tiled = (dsc->tile != 0); + if(is_tiled) + lv_draw_image_tiled_helper(t, dsc, coords, _pxp_draw_core_cb, NULL); + else + lv_draw_image_normal_helper(t, dsc, coords, _pxp_draw_core_cb, NULL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static void _pxp_draw_core_cb(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + lv_layer_t * layer = t->target_layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, clipped_img_area); + lv_area_move(&rel_clip_area, -img_coords->x1, -img_coords->y1); + + lv_area_t rel_img_coords; + lv_area_copy(&rel_img_coords, img_coords); + lv_area_move(&rel_img_coords, -img_coords->x1, -img_coords->y1); + + const uint8_t * src_buf = decoded->data; + + lv_area_t src_area; + if(!lv_area_intersect(&src_area, &rel_clip_area, &rel_img_coords)) + return; + + int32_t src_stride = draw_dsc->header.stride; + lv_color_format_t src_cf = draw_dsc->header.cf; + + uint8_t * dest_buf = draw_buf->data; + int32_t dest_stride = draw_buf->header.stride; + lv_color_format_t dest_cf = draw_buf->header.cf; + bool has_recolor = (draw_dsc->recolor_opa > LV_OPA_MIN); + bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE); + + if(has_recolor && !has_transform) + _pxp_blit_recolor(dest_buf, clipped_img_area, dest_stride, dest_cf, + src_buf, &src_area, src_stride, src_cf, draw_dsc); + else if(has_transform) + _pxp_blit_transform(dest_buf, clipped_img_area, dest_stride, dest_cf, + src_buf, &src_area, src_stride, src_cf, draw_dsc); + else + _pxp_blit(dest_buf, clipped_img_area, dest_stride, dest_cf, + src_buf, &src_area, src_stride, src_cf, draw_dsc->opa); +} + +static void _pxp_blit_recolor(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc) +{ + + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + int32_t src_w = lv_area_get_width(src_area); + int32_t src_h = lv_area_get_height(src_area); + + bool src_has_alpha = (src_cf == LV_COLOR_FORMAT_ARGB8888); + uint8_t src_px_size = lv_color_format_get_size(src_cf); + uint8_t dest_px_size = lv_color_format_get_size(dest_cf); + + lv_pxp_reset(); + + /*AS buffer - source image*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = pxp_get_as_px_format(src_cf), + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_px_size * src_area->x1), + .pitchBytes = src_stride + }; + PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); + + /*Disable PS, use as color generator*/ + PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + PXP_SetProcessSurfaceBackGroundColor(PXP_ID, lv_color_to_u32(dsc->recolor)); + + /*Output buffer*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = pxp_get_out_px_format(dest_cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_px_size * dest_area->x1), + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride, + .width = dest_w, + .height = dest_h + }; + PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); + + /** + * Configure Porter-Duff blending. + * + * Note: srcFactorMode and dstFactorMode are inverted in fsl_pxp.h: + * srcFactorMode is actually applied on PS alpha value + * dstFactorMode is actually applied on AS alpha value + */ + pxp_porter_duff_config_t pdConfig = { + .enable = 1, + .dstColorMode = kPXP_PorterDuffColorWithAlpha, + .srcColorMode = kPXP_PorterDuffColorWithAlpha, + .dstGlobalAlphaMode = kPXP_PorterDuffGlobalAlpha, + .srcGlobalAlphaMode = src_has_alpha ? kPXP_PorterDuffLocalAlpha : kPXP_PorterDuffGlobalAlpha, + .dstFactorMode = kPXP_PorterDuffFactorStraight, + .srcFactorMode = kPXP_PorterDuffFactorInversed, + .dstGlobalAlpha = dsc->recolor_opa, + .srcGlobalAlpha = 0xff, + .dstAlphaMode = kPXP_PorterDuffAlphaStraight, /*don't care*/ + .srcAlphaMode = kPXP_PorterDuffAlphaStraight + }; + PXP_SetPorterDuffConfig(PXP_ID, &pdConfig); + + lv_pxp_run(); +} + +static void _pxp_blit_transform(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, const lv_draw_image_dsc_t * dsc) +{ + int32_t src_w = lv_area_get_width(src_area); + int32_t src_h = lv_area_get_height(src_area); + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + + bool has_rotation = (dsc->rotation != 0); + bool has_scale = (dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE); + uint8_t src_px_size = lv_color_format_get_size(src_cf); + uint8_t dest_px_size = lv_color_format_get_size(dest_cf); + + lv_pxp_reset(); + + if(has_rotation) { + /*Convert rotation angle and calculate offsets caused by pivot*/ + pxp_rotate_degree_t pxp_angle; + switch(dsc->rotation) { + case 0: + pxp_angle = kPXP_Rotate0; + break; + case 900: + pxp_angle = kPXP_Rotate90; + break; + case 1800: + pxp_angle = kPXP_Rotate180; + break; + case 2700: + pxp_angle = kPXP_Rotate270; + break; + default: + pxp_angle = kPXP_Rotate0; + } + /*PS buffer rotation and decimation does not function at the same time*/ + PXP_SetRotateConfig(PXP_ID, kPXP_RotateOutputBuffer, pxp_angle, kPXP_FlipDisable); + } + + /*PS buffer - source image*/ + pxp_ps_buffer_config_t psBufferConfig = { + .pixelFormat = pxp_get_ps_px_format(src_cf), + .swapByte = false, + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_px_size * src_area->x1), + .bufferAddrU = 0, + .bufferAddrV = 0, + .pitchBytes = src_stride + }; + PXP_SetProcessSurfaceBufferConfig(PXP_ID, &psBufferConfig); + PXP_SetProcessSurfacePosition(PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + + if(has_scale) + PXP_SetProcessSurfaceScaler(PXP_ID, src_w, src_h, dest_w, dest_h); + + /*AS disabled */ + PXP_SetAlphaSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + + /*Output buffer*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = pxp_get_out_px_format(dest_cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * (dest_area->y1) + dest_px_size * (dest_area->x1)), + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride, + .width = dest_w, + .height = dest_h + }; + PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); + + lv_pxp_run(); +} + +static void _pxp_blit(uint8_t * dest_buf, const lv_area_t * dest_area, int32_t dest_stride, + lv_color_format_t dest_cf, const uint8_t * src_buf, const lv_area_t * src_area, + int32_t src_stride, lv_color_format_t src_cf, lv_opa_t opa) +{ + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + int32_t src_w = lv_area_get_width(src_area); + int32_t src_h = lv_area_get_height(src_area); + + bool src_has_alpha = (src_cf == LV_COLOR_FORMAT_ARGB8888); + uint8_t src_px_size = lv_color_format_get_size(src_cf); + uint8_t dest_px_size = lv_color_format_get_size(dest_cf); + + lv_pxp_reset(); + + pxp_as_blend_config_t asBlendConfig = { + .alpha = opa, + .invertAlpha = false, + .alphaMode = kPXP_AlphaRop, + .ropMode = kPXP_RopMergeAs + }; + + if(opa >= (lv_opa_t)LV_OPA_MAX && !src_has_alpha) { + /*Simple blit, no effect - Disable PS buffer*/ + PXP_SetProcessSurfacePosition(PXP_ID, 0xFFFFU, 0xFFFFU, 0U, 0U); + } + else { + /*PS must be enabled to fetch background pixels. + PS and OUT buffers are the same, blend will be done in-place*/ + pxp_ps_buffer_config_t psBufferConfig = { + .pixelFormat = pxp_get_ps_px_format(dest_cf), + .swapByte = false, + .bufferAddr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_px_size * dest_area->x1), + .bufferAddrU = 0U, + .bufferAddrV = 0U, + .pitchBytes = dest_stride + }; + + if(opa >= (lv_opa_t)LV_OPA_MAX) + asBlendConfig.alphaMode = src_has_alpha ? kPXP_AlphaEmbedded : kPXP_AlphaOverride; + else + asBlendConfig.alphaMode = src_has_alpha ? kPXP_AlphaMultiply : kPXP_AlphaOverride; + + PXP_SetProcessSurfaceBufferConfig(PXP_ID, &psBufferConfig); + PXP_SetProcessSurfacePosition(PXP_ID, 0U, 0U, dest_w - 1U, dest_h - 1U); + } + + /*AS buffer - source image*/ + pxp_as_buffer_config_t asBufferConfig = { + .pixelFormat = pxp_get_as_px_format(src_cf), + .bufferAddr = (uint32_t)(src_buf + src_stride * src_area->y1 + src_px_size * src_area->x1), + .pitchBytes = src_stride + }; + PXP_SetAlphaSurfaceBufferConfig(PXP_ID, &asBufferConfig); + PXP_SetAlphaSurfacePosition(PXP_ID, 0U, 0U, src_w - 1U, src_h - 1U); + PXP_SetAlphaSurfaceBlendConfig(PXP_ID, &asBlendConfig); + PXP_EnableAlphaSurfaceOverlayColorKey(PXP_ID, false); + + /*Output buffer.*/ + pxp_output_buffer_config_t outputBufferConfig = { + .pixelFormat = pxp_get_out_px_format(dest_cf), + .interlacedMode = kPXP_OutputProgressive, + .buffer0Addr = (uint32_t)(dest_buf + dest_stride * dest_area->y1 + dest_px_size * dest_area->x1), + .buffer1Addr = (uint32_t)0U, + .pitchBytes = dest_stride, + .width = dest_w, + .height = dest_h + }; + PXP_SetOutputBufferConfig(PXP_ID, &outputBufferConfig); + + lv_pxp_run(); +} + +#endif /*LV_USE_DRAW_PXP*/ +#endif /*LV_USE_PXP*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c new file mode 100644 index 0000000..2a153d6 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c @@ -0,0 +1,157 @@ +/** + * @file lv_draw_pxp_layer.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_pxp.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP + +#include "../../../stdlib/lv_string.h" +#if LV_USE_PARALLEL_DRAW_DEBUG + #include "../../../core/lv_global.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_PARALLEL_DRAW_DEBUG + #define _draw_info LV_GLOBAL_DEFAULT()->draw_info +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_pxp_layer(lv_draw_task_t * t) +{ + lv_draw_image_dsc_t * draw_dsc = t->draw_dsc; + + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + const lv_draw_buf_t * draw_buf = layer_to_draw->draw_buf; + + /* It can happen that nothing was draw on a layer and therefore its buffer is not allocated. + * In this case just return. + */ + if(draw_buf == NULL) + return; + + const lv_area_t area_to_draw = { + .x1 = 0, + .y1 = 0, + .x2 = draw_buf->header.w - 1, + .y2 = draw_buf->header.h - 1 + }; + lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw); + + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = draw_buf; + t->draw_dsc = &new_draw_dsc; + lv_draw_pxp_img(t); + t->draw_dsc = draw_dsc; + +#if LV_USE_LAYER_DEBUG || LV_USE_PARALLEL_DRAW_DEBUG + const lv_area_t * coords = &t->area; + lv_area_t area_rot; + lv_area_copy(&area_rot, coords); + if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + + lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); + + area_rot.x1 += coords->x1; + area_rot.y1 += coords->y1; + area_rot.x2 += coords->x1; + area_rot.y2 += coords->y1; + } + lv_area_t draw_area; + if(!lv_area_intersect(&draw_area, &area_rot, &t->clip_area)) return; +#endif + +#if LV_USE_LAYER_DEBUG + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_hex(layer_to_draw->color_format == LV_COLOR_FORMAT_ARGB8888 ? 0xff0000 : 0x00ff00); + fill_dsc.opa = LV_OPA_20; + lv_draw_sw_fill(t, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = fill_dsc.color; + border_dsc.opa = LV_OPA_60; + border_dsc.width = 2; + lv_draw_sw_border(t, &border_dsc, &area_rot); + +#endif + +#if LV_USE_PARALLEL_DRAW_DEBUG + int32_t idx = t->draw_unit->idx; + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_rect_dsc_init(&fill_dsc); + fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); + fill_dsc.opa = LV_OPA_10; + lv_draw_sw_fill(t, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); + border_dsc.opa = LV_OPA_100; + border_dsc.width = 2; + lv_draw_sw_border(t, &border_dsc, &area_rot); + + lv_point_t txt_size; + lv_text_get_size_attributes(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y2; + txt_area.y1 = draw_area.y2 - txt_size.y + 1; + + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_black(); + lv_draw_sw_fill(t, &fill_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_white(); + label_dsc.text = buf; + lv_draw_sw_label(t, &label_dsc, &txt_area); +#endif +} + +#endif /*LV_USE_DRAW_PXP*/ +#endif /*LV_USE_PXP*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.c b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.c new file mode 100644 index 0000000..675c1d0 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.c @@ -0,0 +1,93 @@ +/** + * @file lv_pxp_cfg.c + * + */ + +/** + * Copyright 2020-2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_pxp_cfg.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP +#include "lv_pxp_osa.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +static pxp_cfg_t * _pxp_cfg; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_pxp_init(void) +{ + _pxp_cfg = pxp_get_default_cfg(); + + PXP_Init(PXP_ID); + + PXP_EnableCsc1(PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ + + PXP_EnableInterrupts(PXP_ID, kPXP_CompleteInterruptEnable); + + _pxp_cfg->pxp_interrupt_init(); +} + +void lv_pxp_deinit(void) +{ + _pxp_cfg->pxp_interrupt_deinit(); + PXP_DisableInterrupts(PXP_ID, kPXP_CompleteInterruptEnable); + PXP_Deinit(PXP_ID); +} + +void lv_pxp_reset(void) +{ + PXP_ResetControl(PXP_ID); + + PXP_EnableCsc1(PXP_ID, false); /*Disable CSC1, it is enabled by default.*/ + PXP_SetProcessBlockSize(PXP_ID, kPXP_BlockSize16); /*Block size 16x16 for higher performance*/ +} + +void lv_pxp_run(void) +{ + _pxp_cfg->pxp_run(); + _pxp_cfg->pxp_wait(); +} + +void lv_pxp_wait(void) +{ + _pxp_cfg->pxp_wait(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ +#endif /*LV_USE_PXP*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.h b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.h new file mode 100644 index 0000000..34dccbb --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_cfg.h @@ -0,0 +1,108 @@ +/** + * @file lv_pxp_cfg.h + * + */ + +/** + * Copyright 2020-2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_PXP_CFG_H +#define LV_PXP_CFG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP +#include "fsl_cache.h" +#include "fsl_pxp.h" + +#if ((LV_DRAW_BUF_ALIGN % 32) != 0) +#error "If PXP is enabled the draw buffers should be aligned to 32-byte boundary, please set LV_DRAW_BUF_ALIGN to a multiple of 32 in lv_conf.h" +#endif + +#include "../../../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ + +/** PXP module instance to use*/ +#define PXP_ID PXP + +/** PXP interrupt line ID*/ +#define PXP_IRQ_ID PXP_IRQn + +/********************** + * TYPEDEFS + **********************/ + +/** + * NXP PXP device configuration. + */ +typedef struct { + /** Callback for PXP interrupt initialization*/ + void (*pxp_interrupt_init)(void); + + /** Callback for PXP interrupt de-initialization*/ + void (*pxp_interrupt_deinit)(void); + + /** Callback for PXP start*/ + void (*pxp_run)(void); + + /** Callback for waiting of PXP completion*/ + void (*pxp_wait)(void); +} pxp_cfg_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Reset and initialize PXP device. This function should be called as a part + * of display init sequence. + */ +void lv_pxp_init(void); + +/** + * Disable PXP device. Should be called during display deinit sequence. + */ +void lv_pxp_deinit(void); + +/** + * Reset PXP device. + */ +void lv_pxp_reset(void); + +/** + * Clear cache and start PXP. + */ +void lv_pxp_run(void); + +/** + * Wait for PXP completion. + */ +void lv_pxp_wait(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ +#endif /*LV_USE_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PXP_CFG_H*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_pxp_osa.c b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_osa.c new file mode 100644 index 0000000..861369d --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_osa.c @@ -0,0 +1,188 @@ +/** + * @file lv_pxp_osa.c + * + */ + +/** + * Copyright 2020, 2022-2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_pxp_osa.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP +#include "lv_pxp_utils.h" +#include "../../../misc/lv_log.h" +#include "../../../osal/lv_os_private.h" +#include "fsl_pxp.h" + +#if defined(SDK_OS_FREE_RTOS) + #include "FreeRTOS.h" +#endif + +#if defined(__ZEPHYR__) + #include + #include +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * PXP interrupt initialization. + */ +static void _pxp_interrupt_init(void); + +/** + * PXP interrupt de-initialization. + */ +static void _pxp_interrupt_deinit(void); + +/** + * Start the PXP job. + */ +static void _pxp_run(void); + +/** + * Wait for PXP completion. + */ +static void _pxp_wait(void); + +#if defined(__ZEPHYR__) + /** + * Interrupt handler for Zephyr IRQ + */ + static void _pxp_zephyr_irq_handler(void *); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OS + static lv_thread_sync_t pxp_sync; +#endif +static volatile bool ucPXPIdle; + +static pxp_cfg_t _pxp_default_cfg = { + .pxp_interrupt_init = _pxp_interrupt_init, + .pxp_interrupt_deinit = _pxp_interrupt_deinit, + .pxp_run = _pxp_run, + .pxp_wait = _pxp_wait, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void PXP_IRQHandler(void) +{ + if(kPXP_CompleteFlag & PXP_GetStatusFlags(PXP_ID)) { + PXP_ClearStatusFlags(PXP_ID, kPXP_CompleteFlag); +#if LV_USE_OS + lv_thread_sync_signal_isr(&pxp_sync); +#else + ucPXPIdle = true; +#endif + } +} + +pxp_cfg_t * pxp_get_default_cfg(void) +{ + return &_pxp_default_cfg; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if defined(__ZEPHYR__) +static void _pxp_zephyr_irq_handler(void *) +{ + PXP_IRQHandler(); +} +#endif + +static void _pxp_interrupt_init(void) +{ +#if LV_USE_OS + if(lv_thread_sync_init(&pxp_sync) != LV_RESULT_OK) { + PXP_ASSERT_MSG(false, "Failed to init thread_sync."); + } +#endif + +#if defined(__ZEPHYR__) + IRQ_CONNECT(DT_IRQN(DT_NODELABEL(pxp)), CONFIG_LV_Z_PXP_INTERRUPT_PRIORITY, _pxp_zephyr_irq_handler, NULL, 0); + irq_enable(DT_IRQN(DT_NODELABEL(pxp))); +#elif defined(SDK_OS_FREE_RTOS) + NVIC_SetPriority(PXP_IRQ_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1); +#endif + +#if !defined(__ZEPHYR__) + NVIC_EnableIRQ(PXP_IRQ_ID); +#endif + + ucPXPIdle = true; +} + +static void _pxp_interrupt_deinit(void) +{ +#if defined(__ZEPHYR__) + irq_disable(DT_IRQN(DT_NODELABEL(pxp))); +#else + NVIC_DisableIRQ(PXP_IRQ_ID); +#endif + +#if LV_USE_OS + lv_thread_sync_delete(&pxp_sync); +#endif +} + +/** + * Function to start PXP job. + */ +static void _pxp_run(void) +{ + ucPXPIdle = false; + + PXP_EnableInterrupts(PXP_ID, kPXP_CompleteInterruptEnable); + PXP_Start(PXP_ID); +} + +/** + * Function to wait for PXP completion. + */ +static void _pxp_wait(void) +{ + if(ucPXPIdle == true) + return; +#if LV_USE_OS + if(lv_thread_sync_wait(&pxp_sync) == LV_RESULT_OK) + ucPXPIdle = true; +#else + while(ucPXPIdle == false) { + } +#endif +} + +#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ +#endif /*LV_USE_PXP*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_pxp_osa.h b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_osa.h new file mode 100644 index 0000000..5e3d666 --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_osa.h @@ -0,0 +1,62 @@ +/** + * @file lv_pxp_osa.h + * + */ + +/** + * Copyright 2020, 2022-2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_PXP_OSA_H +#define LV_PXP_OSA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP +#include "lv_pxp_cfg.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * PXP device interrupt handler. Used to check PXP task completion status. + */ +void PXP_IRQHandler(void); + +/** + * Get the PXP default configuration. + */ +pxp_cfg_t * pxp_get_default_cfg(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ +#endif /*LV_USE_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PXP_OSA_H*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_pxp_utils.c b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_utils.c new file mode 100644 index 0000000..26acf6c --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_utils.c @@ -0,0 +1,149 @@ +/** + * @file lv_pxp_utils.c + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_pxp_utils.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +pxp_output_pixel_format_t pxp_get_out_px_format(lv_color_format_t cf) +{ + pxp_output_pixel_format_t out_px_format = kPXP_OutputPixelFormatRGB565; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + out_px_format = kPXP_OutputPixelFormatRGB565; + break; + case LV_COLOR_FORMAT_RGB888: + out_px_format = kPXP_OutputPixelFormatRGB888P; + break; + case LV_COLOR_FORMAT_ARGB8888: + out_px_format = kPXP_OutputPixelFormatARGB8888; + break; + case LV_COLOR_FORMAT_XRGB8888: + out_px_format = kPXP_OutputPixelFormatRGB888; + break; + + default: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + } + + return out_px_format; +} + +pxp_as_pixel_format_t pxp_get_as_px_format(lv_color_format_t cf) +{ + pxp_as_pixel_format_t as_px_format = kPXP_AsPixelFormatRGB565; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + as_px_format = kPXP_AsPixelFormatRGB565; + break; + case LV_COLOR_FORMAT_RGB888: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + case LV_COLOR_FORMAT_ARGB8888: + as_px_format = kPXP_AsPixelFormatARGB8888; + break; + case LV_COLOR_FORMAT_XRGB8888: + as_px_format = kPXP_AsPixelFormatRGB888; + break; + + default: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + } + + return as_px_format; +} + +#if LV_USE_DRAW_PXP +pxp_ps_pixel_format_t pxp_get_ps_px_format(lv_color_format_t cf) +{ + pxp_ps_pixel_format_t ps_px_format = kPXP_PsPixelFormatRGB565; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + ps_px_format = kPXP_PsPixelFormatRGB565; + break; + case LV_COLOR_FORMAT_RGB888: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + case LV_COLOR_FORMAT_ARGB8888: +#if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \ + (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3)) + ps_px_format = kPXP_PsPixelFormatARGB8888; +#else + PXP_ASSERT_MSG(false, "Unsupported color format."); +#endif + break; + case LV_COLOR_FORMAT_XRGB8888: +#if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \ + (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3)) + ps_px_format = kPXP_PsPixelFormatARGB8888; +#else + ps_px_format = kPXP_PsPixelFormatRGB888; +#endif + break; + + default: + PXP_ASSERT_MSG(false, "Unsupported color format."); + break; + } + + return ps_px_format; +} + +bool pxp_buf_aligned(const void * buf, uint32_t stride) +{ + /* Test for pointer alignment */ + if((uintptr_t)buf % 64) + return false; + + /* Test for invalid stride (no stride alignment required) */ + if(stride == 0) + return false; + + return true; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_PXP*/ +#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ +#endif /*LV_USE_PXP*/ diff --git a/inc/lvgl/src/draw/nxp/pxp/lv_pxp_utils.h b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_utils.h new file mode 100644 index 0000000..c9ba7ba --- /dev/null +++ b/inc/lvgl/src/draw/nxp/pxp/lv_pxp_utils.h @@ -0,0 +1,84 @@ +/** + * @file lv_pxp_utils.h + * + */ + +/** + * Copyright 2023-2024 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_PXP_UTILS_H +#define LV_PXP_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP +#include "fsl_pxp.h" +#include "../../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_PXP_ASSERT +#define PXP_ASSERT(expr) LV_ASSERT(expr) +#else +#define PXP_ASSERT(expr) +#endif + +#define PXP_ASSERT_MSG(expr, msg) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR(msg); \ + PXP_ASSERT(false); \ + } \ + } while(0) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +pxp_output_pixel_format_t pxp_get_out_px_format(lv_color_format_t cf); + +pxp_as_pixel_format_t pxp_get_as_px_format(lv_color_format_t cf); + +#if LV_USE_DRAW_PXP +pxp_ps_pixel_format_t pxp_get_ps_px_format(lv_color_format_t cf); + +bool pxp_buf_aligned(const void * buf, uint32_t stride); + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_PXP*/ +#endif /*LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP*/ +#endif /*LV_USE_PXP*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PXP_UTILS_H*/ diff --git a/inc/lvgl/src/draw/opengles/lv_draw_opengles.c b/inc/lvgl/src/draw/opengles/lv_draw_opengles.c new file mode 100644 index 0000000..97a3dec --- /dev/null +++ b/inc/lvgl/src/draw/opengles/lv_draw_opengles.c @@ -0,0 +1,715 @@ +/** + * @file lv_draw_opengles.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_opengles.h" +#if LV_USE_DRAW_OPENGLES + +#if LV_USE_DRAW_NANOVG + #error "LV_USE_DRAW_NANOVG and LV_USE_DRAW_OPENGLES cannot be enabled at the same time. Disable one of them in lv_conf.h or Kconfig." +#endif + +#include "../lv_draw_private.h" +#include "../../misc/cache/lv_cache_entry_private.h" +#include "../../drivers/opengles/lv_opengles_debug.h" +#include "../../drivers/opengles/lv_opengles_texture.h" +#include "../../drivers/opengles/lv_opengles_driver.h" +#include "../../drivers/opengles/lv_opengles_private.h" +#include "../../draw/lv_draw_label.h" +#include "../../draw/lv_draw_rect.h" +#include "../../draw/lv_draw_arc.h" +#include "../../draw/lv_draw_image.h" +#include "../../draw/lv_draw_triangle.h" +#include "../../draw/lv_draw_line.h" +#include "../../draw/lv_draw_3d.h" +#include "../../core/lv_obj.h" +#include "../../core/lv_refr_private.h" +#include "../../display/lv_display_private.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +#define DRAW_UNIT_ID_OPENGLES 6 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; + lv_cache_t * texture_cache; + unsigned int framebuffer; + lv_draw_buf_t render_draw_buf; +} lv_draw_opengles_unit_t; + +typedef struct { + lv_draw_dsc_base_t * draw_dsc; + int32_t w; + int32_t h; + unsigned int texture; +} cache_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool opengles_texture_cache_create_cb(cache_data_t * cached_data, void * user_data); +static void opengles_texture_cache_free_cb(cache_data_t * cached_data, void * user_data); +static lv_cache_compare_res_t opengles_texture_cache_compare_cb(const cache_data_t * lhs, const cache_data_t * rhs); + +static void blend_texture_layer(lv_draw_task_t * t); +static void draw_from_cached_texture(lv_draw_task_t * t); + +static void execute_drawing(lv_draw_opengles_unit_t * u); + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); +static bool draw_to_texture(lv_draw_opengles_unit_t * u, cache_data_t * cache_data); + +static unsigned int layer_get_texture(lv_layer_t * layer); +static unsigned int get_framebuffer(lv_draw_opengles_unit_t * u); +static unsigned int create_texture(int32_t w, int32_t h, const void * data); + +#if LV_USE_3DTEXTURE + static void lv_draw_opengles_3d(lv_draw_task_t * t, const lv_draw_3d_dsc_t * dsc, const lv_area_t * coords); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +static lv_draw_opengles_unit_t * g_unit; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_opengles_init(void) +{ + lv_draw_opengles_unit_t * draw_opengles_unit = lv_draw_create_unit(sizeof(lv_draw_opengles_unit_t)); + draw_opengles_unit->base_unit.dispatch_cb = dispatch; + draw_opengles_unit->base_unit.evaluate_cb = evaluate; + draw_opengles_unit->base_unit.name = "OPENGLES"; + draw_opengles_unit->texture_cache = lv_cache_create(&lv_cache_class_lru_rb_count, + sizeof(cache_data_t), LV_DRAW_OPENGLES_TEXTURE_CACHE_COUNT, (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t)opengles_texture_cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)opengles_texture_cache_create_cb, + .free_cb = (lv_cache_free_cb_t)opengles_texture_cache_free_cb, + }); + lv_cache_set_name(draw_opengles_unit->texture_cache, "OPENGLES_TEXTURE"); + + lv_draw_buf_init(&draw_opengles_unit->render_draw_buf, 0, 0, LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO, NULL, 0); + + g_unit = draw_opengles_unit; +} + +void lv_draw_opengles_deinit(void) +{ + lv_free(g_unit->render_draw_buf.unaligned_data); + lv_cache_destroy(g_unit->texture_cache, g_unit); + if(g_unit->framebuffer != 0) { + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, 0)); + GL_CALL(glDeleteFramebuffers(1, &g_unit->framebuffer)); + } + g_unit = NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool opengles_texture_cache_create_cb(cache_data_t * cached_data, void * user_data) +{ + LV_PROFILER_DRAW_BEGIN; + bool ret = draw_to_texture((lv_draw_opengles_unit_t *)user_data, cached_data); + LV_PROFILER_DRAW_END; + return ret; +} + +static void opengles_texture_cache_free_cb(cache_data_t * cached_data, void * user_data) +{ + LV_UNUSED(user_data); + LV_PROFILER_DRAW_BEGIN; + + lv_free(cached_data->draw_dsc); + GL_CALL(glDeleteTextures(1, &cached_data->texture)); + cached_data->draw_dsc = NULL; + cached_data->texture = 0; + LV_PROFILER_DRAW_END; +} + +static lv_cache_compare_res_t opengles_texture_cache_compare_cb(const cache_data_t * lhs, const cache_data_t * rhs) +{ + if(lhs == rhs) return 0; + + if(lhs->w != rhs->w) { + return lhs->w > rhs->w ? 1 : -1; + } + if(lhs->h != rhs->h) { + return lhs->h > rhs->h ? 1 : -1; + } + + uint32_t lhs_dsc_size = lhs->draw_dsc->dsc_size; + uint32_t rhs_dsc_size = rhs->draw_dsc->dsc_size; + + if(lhs_dsc_size != rhs_dsc_size) { + return lhs_dsc_size > rhs_dsc_size ? 1 : -1; + } + + const uint8_t * left_draw_dsc = (const uint8_t *)lhs->draw_dsc; + const uint8_t * right_draw_dsc = (const uint8_t *)rhs->draw_dsc; + left_draw_dsc += sizeof(lv_draw_dsc_base_t); + right_draw_dsc += sizeof(lv_draw_dsc_base_t); + + int cmp_res = lv_memcmp(left_draw_dsc, right_draw_dsc, lhs->draw_dsc->dsc_size - sizeof(lv_draw_dsc_base_t)); + + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_opengles_unit_t * draw_opengles_unit = (lv_draw_opengles_unit_t *) draw_unit; + + /*Return immediately if it's busy with a draw task*/ + if(draw_opengles_unit->task_act) return 0; + + lv_draw_task_t * t = NULL; + t = lv_draw_get_available_task(layer, NULL, DRAW_UNIT_ID_OPENGLES); + if(t == NULL) return -1; + + unsigned int texture = layer_get_texture(layer); + if(texture == 0) { + lv_display_t * disp = lv_refr_get_disp_refreshing(); + LV_ASSERT(layer != disp->layer_head); + int32_t w = lv_area_get_width(&layer->buf_area); + int32_t h = lv_area_get_height(&layer->buf_area); + + texture = create_texture(w, h, NULL); + layer->user_data = (void *)(uintptr_t)texture; + } + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_opengles_unit->task_act = t; + + execute_drawing(draw_opengles_unit); + + draw_opengles_unit->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + draw_opengles_unit->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + return 1; +} + +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + LV_UNUSED(draw_unit); + + if(task->type == LV_DRAW_TASK_TYPE_IMAGE && + ((lv_draw_image_dsc_t *)task->draw_dsc)->header.cf >= LV_COLOR_FORMAT_PROPRIETARY_START) { + return 0; + } + + /*If not refreshing the display probably it's a canvas rendering + *which his not supported in OpenGL as it's not a texture.*/ + if(lv_refr_get_disp_refreshing() == NULL) return 0; + + if(((lv_draw_dsc_base_t *)task->draw_dsc)->user_data == NULL) { + task->preference_score = 0; + task->preferred_draw_unit_id = DRAW_UNIT_ID_OPENGLES; + } + return 0; +} + +static bool draw_to_texture(lv_draw_opengles_unit_t * u, cache_data_t * cache_data) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_task_t * task = u->task_act; + + lv_layer_t dest_layer; + lv_layer_init(&dest_layer); + + int32_t texture_w = lv_area_get_width(&task->_real_area); + int32_t texture_h = lv_area_get_height(&task->_real_area); + + if(NULL == lv_draw_buf_reshape(&u->render_draw_buf, LV_COLOR_FORMAT_ARGB8888, texture_w, texture_h, LV_STRIDE_AUTO)) { + uint8_t * data = u->render_draw_buf.unaligned_data; + uint32_t data_size = LV_DRAW_BUF_SIZE(texture_w, texture_h, LV_COLOR_FORMAT_ARGB8888); + data = lv_realloc(data, data_size); + LV_ASSERT_MALLOC(data); + lv_result_t init_result = lv_draw_buf_init(&u->render_draw_buf, texture_w, texture_h, LV_COLOR_FORMAT_ARGB8888, + LV_STRIDE_AUTO, data, data_size); + LV_ASSERT(init_result == LV_RESULT_OK); + } + + dest_layer.draw_buf = &u->render_draw_buf; + dest_layer.color_format = LV_COLOR_FORMAT_ARGB8888; + + dest_layer.buf_area = task->_real_area; + dest_layer._clip_area = task->_real_area; + dest_layer.phy_clip_area = task->_real_area; + lv_memzero(u->render_draw_buf.data, lv_area_get_size(&task->_real_area) * 4); + + lv_display_t * disp = lv_refr_get_disp_refreshing(); + + lv_obj_t * obj = ((lv_draw_dsc_base_t *)task->draw_dsc)->obj; + bool original_send_draw_task_event = false; + if(obj) { + original_send_draw_task_event = lv_obj_has_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + } + + lv_draw_dsc_base_t * base_dsc = task->draw_dsc; + cache_data->draw_dsc = lv_malloc(base_dsc->dsc_size); + lv_memcpy((void *)cache_data->draw_dsc, base_dsc, base_dsc->dsc_size); + + switch(task->type) { + case LV_DRAW_TASK_TYPE_FILL: { + lv_draw_fill_dsc_t * fill_dsc = task->draw_dsc; + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.user_data = (void *)(uintptr_t)1; + rect_dsc.bg_color = fill_dsc->color; + rect_dsc.bg_grad = fill_dsc->grad; + rect_dsc.radius = fill_dsc->radius; + rect_dsc.bg_opa = fill_dsc->opa; + + lv_draw_rect(&dest_layer, &rect_dsc, &task->area); + } + break; + case LV_DRAW_TASK_TYPE_BORDER: { + lv_draw_border_dsc_t * border_dsc = task->draw_dsc; + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.user_data = (void *)(uintptr_t)1; + rect_dsc.bg_opa = LV_OPA_TRANSP; + rect_dsc.radius = border_dsc->radius; + rect_dsc.border_color = border_dsc->color; + rect_dsc.border_opa = border_dsc->opa; + rect_dsc.border_side = border_dsc->side; + rect_dsc.border_width = border_dsc->width; + lv_draw_rect(&dest_layer, &rect_dsc, &task->area); + break; + } + case LV_DRAW_TASK_TYPE_BOX_SHADOW: { + lv_draw_box_shadow_dsc_t * box_shadow_dsc = task->draw_dsc; + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.user_data = (void *)(uintptr_t)1; + rect_dsc.bg_opa = LV_OPA_0; + rect_dsc.radius = box_shadow_dsc->radius; + rect_dsc.bg_color = box_shadow_dsc->color; + rect_dsc.shadow_opa = box_shadow_dsc->opa; + rect_dsc.shadow_width = box_shadow_dsc->width; + rect_dsc.shadow_spread = box_shadow_dsc->spread; + rect_dsc.shadow_offset_x = box_shadow_dsc->ofs_x; + rect_dsc.shadow_offset_y = box_shadow_dsc->ofs_y; + lv_draw_rect(&dest_layer, &rect_dsc, &task->area); + break; + } + case LV_DRAW_TASK_TYPE_LABEL: { + lv_draw_label_dsc_t label_dsc; + lv_memcpy(&label_dsc, task->draw_dsc, sizeof(label_dsc)); + label_dsc.base.user_data = (void *)(uintptr_t)1; + lv_draw_label(&dest_layer, &label_dsc, &task->area); + } + break; + case LV_DRAW_TASK_TYPE_ARC: { + lv_draw_arc_dsc_t arc_dsc; + lv_memcpy(&arc_dsc, task->draw_dsc, sizeof(arc_dsc)); + arc_dsc.base.user_data = (void *)(uintptr_t)1; + lv_draw_arc(&dest_layer, &arc_dsc); + } + break; + case LV_DRAW_TASK_TYPE_LINE: { + lv_draw_line_dsc_t line_dsc; + lv_memcpy(&line_dsc, task->draw_dsc, sizeof(line_dsc)); + line_dsc.base.user_data = (void *)(uintptr_t)1; + lv_draw_line(&dest_layer, &line_dsc); + } + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: { + lv_draw_triangle_dsc_t triangle_dsc; + lv_memcpy(&triangle_dsc, task->draw_dsc, sizeof(triangle_dsc)); + triangle_dsc.base.user_data = (void *)(uintptr_t)1; + lv_draw_triangle(&dest_layer, &triangle_dsc); + } + break; + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t image_dsc; + lv_memcpy(&image_dsc, task->draw_dsc, sizeof(image_dsc)); + image_dsc.base.user_data = (void *)(uintptr_t)1; + lv_draw_image(&dest_layer, &image_dsc, &task->area); + break; + } + default: + /*The malloced cache_data->draw_dsc will be freed automatically on failure + *in opengles_texture_cache_free_cb*/ + LV_PROFILER_DRAW_END; + return false; + } + + while(dest_layer.draw_task_head) { + lv_draw_dispatch_layer(disp, &dest_layer); + if(dest_layer.draw_task_head) { + lv_draw_dispatch_wait_for_request(); + } + } + + unsigned int texture = create_texture(texture_w, texture_h, u->render_draw_buf.data); + + cache_data->w = texture_w; + cache_data->h = texture_h; + cache_data->texture = texture; + + if(obj) { + lv_obj_set_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS, original_send_draw_task_event); + } + + LV_PROFILER_DRAW_END; + return true; +} + +static void blend_texture_layer(lv_draw_task_t * t) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_image_dsc_t * draw_dsc = t->draw_dsc; + lv_draw_opengles_unit_t * u = (lv_draw_opengles_unit_t *)t->draw_unit; + lv_area_t area; + area.x1 = -draw_dsc->pivot.x; + area.y1 = -draw_dsc->pivot.y; + area.x1 = (area.x1 * draw_dsc->scale_x) / 256; + area.y1 = (area.y1 * draw_dsc->scale_y) / 256; + area.x1 += t->area.x1 + draw_dsc->pivot.x; + area.y1 += t->area.y1 + draw_dsc->pivot.y; + lv_area_set_width(&area, lv_area_get_width(&t->area) * draw_dsc->scale_x / 256); + lv_area_set_height(&area, lv_area_get_height(&t->area) * draw_dsc->scale_y / 256); + + lv_layer_t * src_layer = (lv_layer_t *)draw_dsc->src; + unsigned int src_texture = layer_get_texture(src_layer); + + + lv_layer_t * dest_layer = t->target_layer; + unsigned int target_texture = layer_get_texture(dest_layer); + int32_t targ_tex_w = lv_area_get_width(&dest_layer->buf_area); + int32_t targ_tex_h = lv_area_get_height(&dest_layer->buf_area); + + if(target_texture) { + unsigned int framebuffer = get_framebuffer(u); + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, target_texture, 0)); + } + + lv_opengles_viewport(0, 0, targ_tex_w, targ_tex_h); + // TODO rotation + bool h_flip = false; + bool v_flip = false; +#if LV_USE_3DTEXTURE + if(t->type == LV_DRAW_TASK_TYPE_3D) { + lv_draw_3d_dsc_t * _3d_dsc = (lv_draw_3d_dsc_t *)t->draw_dsc; + h_flip = _3d_dsc->h_flip; + v_flip = _3d_dsc->v_flip; + } +#endif + lv_opengles_render_texture(src_texture, &area, draw_dsc->opa, targ_tex_w, targ_tex_h, &t->clip_area, h_flip, + !v_flip); + + if(target_texture) { + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, 0)); + } + + GL_CALL(glDeleteTextures(1, &src_texture)); + LV_PROFILER_DRAW_END; +} + +static void draw_from_cached_texture(lv_draw_task_t * t) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_opengles_unit_t * u = (lv_draw_opengles_unit_t *)t->draw_unit; + cache_data_t data_to_find; + data_to_find.draw_dsc = (lv_draw_dsc_base_t *)t->draw_dsc; + bool h_flip = false; + bool v_flip = false; +#if LV_USE_3DTEXTURE + if(t->type == LV_DRAW_TASK_TYPE_3D) { + lv_draw_3d_dsc_t * _3d_dsc = (lv_draw_3d_dsc_t *)t->draw_dsc; + h_flip = _3d_dsc->h_flip; + v_flip = _3d_dsc->v_flip; + } +#endif + data_to_find.w = lv_area_get_width(&t->_real_area); + data_to_find.h = lv_area_get_height(&t->_real_area); + data_to_find.texture = 0; + + /*user_data stores the renderer to differentiate it from SW rendered tasks. + *However the cached texture is independent from the renderer so use NULL user_data*/ + void * user_data_saved = data_to_find.draw_dsc->user_data; + data_to_find.draw_dsc->user_data = NULL; + + /*img_dsc->image_area is an absolute coordinate so it's different + *for the same image on a different position. So make it relative before using for cache. */ + lv_area_t a = t->area; + if(t->type == LV_DRAW_TASK_TYPE_IMAGE) { + lv_draw_image_dsc_t * img_dsc = (lv_draw_image_dsc_t *)data_to_find.draw_dsc; + lv_area_move(&img_dsc->image_area, -t->area.x1, -t->area.y1); + } + else if(t->type == LV_DRAW_TASK_TYPE_TRIANGLE) { + lv_draw_triangle_dsc_t * tri_dsc = (lv_draw_triangle_dsc_t *)data_to_find.draw_dsc; + tri_dsc->p[0].x -= t->area.x1; + tri_dsc->p[0].y -= t->area.y1; + tri_dsc->p[1].x -= t->area.x1; + tri_dsc->p[1].y -= t->area.y1; + tri_dsc->p[2].x -= t->area.x1; + tri_dsc->p[2].y -= t->area.y1; + } + else if(t->type == LV_DRAW_TASK_TYPE_LINE) { + lv_draw_line_dsc_t * line_dsc = (lv_draw_line_dsc_t *)data_to_find.draw_dsc; + line_dsc->p1.x -= t->area.x1; + line_dsc->p1.y -= t->area.y1; + line_dsc->p2.x -= t->area.x1; + line_dsc->p2.y -= t->area.y1; + } + else if(t->type == LV_DRAW_TASK_TYPE_ARC) { + lv_draw_arc_dsc_t * arc_dsc = (lv_draw_arc_dsc_t *)data_to_find.draw_dsc; + arc_dsc->center.x -= t->area.x1; + arc_dsc->center.y -= t->area.y1; + } + + lv_area_move(&t->area, -a.x1, -a.y1); + lv_area_move(&t->_real_area, -a.x1, -a.y1); + + lv_cache_entry_t * entry_cached = lv_cache_acquire_or_create(u->texture_cache, &data_to_find, u); + + lv_area_move(&t->area, a.x1, a.y1); + lv_area_move(&t->_real_area, a.x1, a.y1); + + if(!entry_cached) { + LV_PROFILER_DRAW_END; + return; + } + + data_to_find.draw_dsc->user_data = user_data_saved; + + cache_data_t * data_cached = lv_cache_entry_get_data(entry_cached); + unsigned int texture = data_cached->texture; + + lv_layer_t * dest_layer = t->target_layer; + + unsigned int target_texture = layer_get_texture(dest_layer); + int32_t targ_tex_w = lv_area_get_width(&dest_layer->buf_area); + int32_t targ_tex_h = lv_area_get_height(&dest_layer->buf_area); + + if(target_texture) { + unsigned int framebuffer = get_framebuffer(u); + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, target_texture, 0)); + } + + lv_opengles_viewport(0, 0, targ_tex_w, targ_tex_h); + lv_area_move(&t->clip_area, -dest_layer->buf_area.x1, -dest_layer->buf_area.y1); + lv_area_t render_area = t->_real_area; + lv_area_move(&render_area, -dest_layer->buf_area.x1, -dest_layer->buf_area.y1); + lv_opengles_render_texture(texture, &render_area, 0xff, targ_tex_w, targ_tex_h, &t->clip_area, h_flip, v_flip); + + if(target_texture) { + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, 0)); + } + + lv_cache_release(u->texture_cache, entry_cached, u); + + /*Do not cache modifiable images as they might change in the next frame + *resulting in stale textures in the cache. */ + if(t->type == LV_DRAW_TASK_TYPE_IMAGE) { + lv_draw_image_dsc_t * img_dsc = (lv_draw_image_dsc_t *)t->draw_dsc; + if(img_dsc->header.flags & LV_IMAGE_FLAGS_MODIFIABLE) { + lv_cache_drop(u->texture_cache, &data_to_find, u); + } + } + /*Do not cache non static (const) texts as the text's pointer can be freed/reallocated + *at any time resulting in a wild pointer in the cached draw dsc. */ + if(t->type == LV_DRAW_TASK_TYPE_LABEL) { + lv_draw_label_dsc_t * label_dsc = t->draw_dsc; + if(!label_dsc->text_static) { + lv_cache_drop(u->texture_cache, &data_to_find, u); + } + } + /*Do not cache lines rendered from points at dsc->points will be freed*/ + else if(t->type == LV_DRAW_TASK_TYPE_LINE) { + lv_draw_line_dsc_t * line_dsc = t->draw_dsc; + if(line_dsc->points) { + lv_cache_drop(u->texture_cache, &data_to_find, u); + } + } + LV_PROFILER_DRAW_END; +} + +static void execute_drawing(lv_draw_opengles_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + t->draw_unit = (lv_draw_unit_t *)u; + + /* the shader-based fill is not working reliably with EGL. */ + if(t->type == LV_DRAW_TASK_TYPE_FILL) { + lv_draw_fill_dsc_t * fill_dsc = t->draw_dsc; + if(fill_dsc->radius == 0 && fill_dsc->grad.dir == LV_GRAD_DIR_NONE) { + lv_layer_t * layer = t->target_layer; + lv_area_t fill_area = t->area; + lv_area_intersect(&fill_area, &fill_area, &t->clip_area); + lv_area_move(&fill_area, -layer->buf_area.x1, -layer->buf_area.y1); + + unsigned int target_texture = layer_get_texture(layer); + int32_t targ_tex_w = lv_area_get_width(&layer->buf_area); + int32_t targ_tex_h = lv_area_get_height(&layer->buf_area); + + if(target_texture) { + unsigned int framebuffer = get_framebuffer(u); + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, target_texture, 0)); + } + + if(fill_dsc->opa >= LV_OPA_MAX) { + float tex_w = (float)lv_area_get_width(&fill_area); + float tex_h = (float)lv_area_get_height(&fill_area); + GL_CALL(glEnable(GL_SCISSOR_TEST)); + GL_CALL(glScissor(fill_area.x1, targ_tex_h - fill_area.y1 - tex_h, tex_w, tex_h)); + /* swap red and blue channels here as they will be swapped back during flushing*/ + GL_CALL(glClearColor((float)fill_dsc->color.blue / 255.0f, (float)fill_dsc->color.green / 255.0f, + (float)fill_dsc->color.red / 255.0f, 1.0f)); + GL_CALL(glClearDepthf(1.0f)); + GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + GL_CALL(glDisable(GL_SCISSOR_TEST)); + } + else { + lv_opengles_viewport(0, 0, targ_tex_w, targ_tex_h); + lv_opengles_render_fill(fill_dsc->color, &fill_area, fill_dsc->opa, targ_tex_w, targ_tex_h); + } + + if(target_texture) { + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, 0)); + } + + return; + } + } + + if(t->type == LV_DRAW_TASK_TYPE_LAYER) { + blend_texture_layer(t); + return; + } + +#if LV_USE_3DTEXTURE + if(t->type == LV_DRAW_TASK_TYPE_3D) { + lv_draw_opengles_3d(t, t->draw_dsc, &t->area); + return; + } +#endif + + draw_from_cached_texture(t); +} + +static unsigned int layer_get_texture(lv_layer_t * layer) +{ + return (unsigned int)(uintptr_t)layer->user_data; +} + +static unsigned int get_framebuffer(lv_draw_opengles_unit_t * u) +{ + if(u->framebuffer == 0) { + GL_CALL(glGenFramebuffers(1, &u->framebuffer)); + } + return u->framebuffer; +} + +static unsigned int create_texture(int32_t w, int32_t h, const void * data) +{ + LV_PROFILER_DRAW_BEGIN; + unsigned int texture; + GL_CALL(glGenTextures(1, &texture)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, texture)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + + /* LV_COLOR_DEPTH 32, 16 are supported but the cached textures will always + * have full ARGB pixels since the alpha channel is required for blending. + */ + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)); +#if 0 + GL_CALL(glGenerateMipmap(GL_TEXTURE_2D)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 20)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)); + /* GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)); + * Alternatively, the above form can be used in some cases for slightly faster performance, but + * visual quality when using image scales that are not exactly 1:1 (or 2:1 or some other increment) + * will be not as good. + */ +#endif + + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, 0)); + + LV_PROFILER_DRAW_END; + return texture; +} + +#if LV_USE_3DTEXTURE +static void lv_draw_opengles_3d(lv_draw_task_t * t, const lv_draw_3d_dsc_t * dsc, const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_opengles_unit_t * u = (lv_draw_opengles_unit_t *) t->draw_unit; + + lv_layer_t * dest_layer = t->target_layer; + unsigned int target_texture = layer_get_texture(dest_layer); + int32_t targ_tex_w = lv_area_get_width(&dest_layer->buf_area); + int32_t targ_tex_h = lv_area_get_height(&dest_layer->buf_area); + + if(target_texture) { + unsigned int framebuffer = get_framebuffer(u); + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, target_texture, 0)); + } + + lv_opengles_viewport(0, 0, targ_tex_w, targ_tex_h); + lv_area_t clip_area = t->clip_area; + lv_area_move(&clip_area, -dest_layer->buf_area.x1, -dest_layer->buf_area.y1); + + lv_opengles_render_params_t params; + lv_opengles_render_params_init(¶ms); + params.texture = dsc->tex_id; + params.texture_area = coords; + params.opa = dsc->opa; + params.disp_w = targ_tex_w; + params.disp_h = targ_tex_h; + params.texture_clip_area = &clip_area; + params.h_flip = dsc->h_flip; + params.v_flip = dsc->v_flip; + params.blend_opt = true; + lv_opengles_render(¶ms); + + if(target_texture) { + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, 0)); + } + LV_PROFILER_DRAW_END; +} +#endif /*LV_USE_3DTEXTURE*/ + +#endif /*LV_USE_DRAW_OPENGLES*/ diff --git a/inc/lvgl/src/draw/opengles/lv_draw_opengles.h b/inc/lvgl/src/draw/opengles/lv_draw_opengles.h new file mode 100644 index 0000000..1285c93 --- /dev/null +++ b/inc/lvgl/src/draw/opengles/lv_draw_opengles.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_opengles.h + * + */ + +#ifndef LV_DRAW_OPENGLES_H +#define LV_DRAW_OPENGLES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_DRAW_OPENGLES + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_opengles_init(void); +void lv_draw_opengles_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_OPENGLES*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_OPENGLES_H*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c new file mode 100644 index 0000000..9020c4d --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c @@ -0,0 +1,649 @@ +/** + * @file lv_draw_dave2d.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D +#include "../../lv_draw_buf_private.h" +#include "../../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ +#define DRAW_UNIT_ID_DAVE2D 4 +/* The amount of tasks exercising pressure to the current to get finished + * This one is used as the main signal to start to render a block of tasks. + */ +#ifndef LV_DAVE2D_MAX_DRAW_PRESSURE + #define LV_DAVE2D_MAX_DRAW_PRESSURE 256 +#endif + +#if (LV_DAVE2D_MAX_DRAW_PRESSURE < 256) + #error "DRAW Pressure should be at least 256 otherwise the Dave engine may crash!" +#endif +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void execute_drawing(lv_draw_dave2d_unit_t * u); +#if defined(RENESAS_CORTEX_M85) || defined(_RENESAS_RZA_) + #if (BSP_CFG_DCACHE_ENABLED) || defined(_RENESAS_RZA_) + static void _dave2d_buf_invalidate_cache_cb(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + #endif +#endif + +static int32_t _dave2d_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); +static int32_t _dave2d_wait_finish(lv_draw_unit_t * draw_unit); +static int32_t lv_draw_dave2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static d2_s32 lv_dave2d_init(void); +static void lv_draw_buf_dave2d_init_handlers(void); +static bool lv_draw_dave2d_image_color_format_supported(lv_color_format_t color_format); +void dave2d_execute_dlist_and_flush(void); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +static d2_device * _d2_handle; + +/* Main render buffer, used to carry the block of dave commands for any shape */ +static d2_renderbuffer * _renderbuffer; + +/* Label dedicated render buffer, used to carry only label related dave commands */ +static d2_renderbuffer * _label_renderbuffer; + +static lv_ll_t draw_tasks_on_dlist; +static uint32_t draw_pressure = 0; + +#if LV_USE_OS + lv_mutex_t xd2Semaphore; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_dave2d_init(void) +{ + d2_s32 result = D2_OK; + + lv_draw_buf_dave2d_init_handlers(); + + lv_draw_dave2d_unit_t * draw_dave2d_unit = lv_draw_create_unit(sizeof(lv_draw_dave2d_unit_t)); + draw_dave2d_unit->base_unit.dispatch_cb = lv_draw_dave2d_dispatch; + draw_dave2d_unit->base_unit.evaluate_cb = _dave2d_evaluate; + draw_dave2d_unit->base_unit.wait_for_finish_cb = _dave2d_wait_finish; + draw_dave2d_unit->base_unit.name = "DAVE2D"; + draw_dave2d_unit->idx = DRAW_UNIT_ID_DAVE2D; + + result = lv_dave2d_init(); + LV_ASSERT(D2_OK == result); + +#if LV_USE_OS + lv_result_t res; + res = lv_mutex_init(&xd2Semaphore); + LV_ASSERT(LV_RESULT_OK == res); + draw_dave2d_unit->pd2Mutex = &xd2Semaphore; +#endif + + draw_dave2d_unit->d2_handle = _d2_handle; + draw_dave2d_unit->renderbuffer = _renderbuffer; + draw_dave2d_unit->label_renderbuffer = _label_renderbuffer; + lv_ll_init(&draw_tasks_on_dlist, sizeof(uintptr_t)); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_draw_buf_dave2d_init_handlers(void) +{ + +#if defined(RENESAS_CORTEX_M85) || defined(_RENESAS_RZA_) +#if (BSP_CFG_DCACHE_ENABLED) || defined(_RENESAS_RZA_) + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + handlers->invalidate_cache_cb = _dave2d_buf_invalidate_cache_cb; +#endif +#endif +} + +#if defined(RENESAS_CORTEX_M85) || defined(_RENESAS_RZA_) +#if (BSP_CFG_DCACHE_ENABLED) || defined(_RENESAS_RZA_) +static void _dave2d_buf_invalidate_cache_cb(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + const lv_image_header_t * header = &draw_buf->header; + uint32_t stride = header->stride; + lv_color_format_t cf = header->cf; + + uint8_t * address = draw_buf->data; + int32_t i = 0; + uint32_t bytes_per_pixel = lv_color_format_get_size(cf); + int32_t width = lv_area_get_width(area); + int32_t lines = lv_area_get_height(area); + int32_t bytes_to_flush_per_line = (int32_t)width * (int32_t)bytes_per_pixel; + + /* Stride is in bytes, not pixels */ + address = address + (area->x1 * (int32_t)bytes_per_pixel) + (stride * (uint32_t)area->y1); + + for(i = 0; i < lines; i++) { +#if defined(RENESAS_CORTEX_M85) + SCB_CleanInvalidateDCache_by_Addr(address, bytes_to_flush_per_line); +#else /* _RENESAS_RZA_ */ + R_BSP_CACHE_CleanInvalidateRange((uint64_t) address, (uint64_t) bytes_to_flush_per_line); +#endif + address += stride; + } +} +#endif +#endif + +/** + * @todo + * LVGL needs to use hardware acceleration for buf_copy and do not affect GPU rendering. + */ +#if 0 +static void _dave2d_buf_copy(void * dest_buf, uint32_t dest_w, uint32_t dest_h, const lv_area_t * dest_area, + void * src_buf, uint32_t src_w, uint32_t src_h, const lv_area_t * src_area, lv_color_format_t color_format) +{ + d2_s32 result; + +#if LV_USE_OS + lv_result_t status; + + status = lv_mutex_lock(&xd2Semaphore); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + d2_u32 src_blend_mode = d2_getblendmodesrc(_d2_handle); + d2_u32 dst_blend_mode = d2_getblendmodedst(_d2_handle); + + result = d2_selectrenderbuffer(_d2_handle, _blit_renderbuffer); + LV_ASSERT(D2_OK == result); + + result = d2_setblendmode(_d2_handle, d2_bm_one, d2_bm_zero); + LV_ASSERT(D2_OK == result); + + // Generate render operations + result = d2_framebuffer(_d2_handle, (uint16_t *)dest_buf, DISPLAY_HSIZE_INPUT0, DISPLAY_BUFFER_STRIDE_PIXELS_INPUT0, + DISPLAY_VSIZE_INPUT0, lv_draw_dave2d_cf_fb_get()); + LV_ASSERT(D2_OK == result); + + result = d2_cliprect(_d2_handle, (d2_border)dest_area->x1, (d2_border)dest_area->y1, (d2_border)dest_area->x2, + (d2_border)dest_area->y2); + LV_ASSERT(D2_OK == result); + + result = d2_setblitsrc(_d2_handle, (void *) src_buf, (d2_s32)src_w, (d2_s32)src_w, (d2_s32)src_h, + lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(color_format)); + LV_ASSERT(D2_OK == result); + + result = d2_blitcopy(_d2_handle, (d2_s32)src_w, (d2_s32)src_h, (d2_blitpos)src_area->x1, (d2_blitpos)src_area->y1, + D2_FIX4(dest_w), D2_FIX4(dest_h), + D2_FIX4(dest_area->x1), D2_FIX4(dest_area->y1), 0); + LV_ASSERT(D2_OK == result); + + // Execute render operations + result = d2_executerenderbuffer(_d2_handle, _blit_renderbuffer, 0); + LV_ASSERT(D2_OK == result) ; + + result = d2_flushframe(_d2_handle); + LV_ASSERT(D2_OK == result); + + result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); + LV_ASSERT(D2_OK == result); + + result = d2_setblendmode(_d2_handle, src_blend_mode, dst_blend_mode); + LV_ASSERT(D2_OK != result); + +#if LV_USE_OS + status = lv_mutex_unlock(&xd2Semaphore); + LV_ASSERT(LV_RESULT_OK == status); +#endif + +} +#endif + +static bool lv_draw_dave2d_image_color_format_supported(lv_color_format_t color_format) +{ + bool supported = false; + + switch(color_format) { + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB1555: + case LV_COLOR_FORMAT_ARGB4444: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + supported = true; + break; + default: + break; + } + + return supported; +} + +#define USE_D2 (1) + +static int32_t _dave2d_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t) +{ + LV_UNUSED(u); + int32_t ret = 0; + + lv_draw_dsc_base_t * draw_dsc_base = (lv_draw_dsc_base_t *) t->draw_dsc; + + if(!lv_draw_dave2d_is_dest_cf_supported(draw_dsc_base->layer->color_format)) + return 0; + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: { +#if USE_D2 + lv_draw_fill_dsc_t * dsc = t->draw_dsc; + if(dsc->grad.dir == LV_GRAD_DIR_NONE + || ((dsc->grad.dir != LV_GRAD_DIR_NONE) + && ((dsc->grad.stops[0].color.blue == dsc->grad.stops[dsc->grad.stops_count - 1].color.blue) + && (dsc->grad.stops[0].color.red == dsc->grad.stops[dsc->grad.stops_count - 1].color.red) + && (dsc->grad.stops[0].color.green == dsc->grad.stops[dsc->grad.stops_count - 1].color.green)))) { + + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; + + } + else +#endif + { + } + ret = 0; + break; + } + case LV_DRAW_TASK_TYPE_LAYER: { + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t * dsc = t->draw_dsc; + if(!lv_draw_dave2d_image_color_format_supported(dsc->header.cf)) { + ret = 0; + break; + } +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_BORDER: { +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_BOX_SHADOW: { + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_LABEL: { +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_LINE: { +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_ARC: { +#if USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_TRIANGLE: { +#if USE_D2 + lv_draw_fill_dsc_t * dsc = t->draw_dsc; + if(dsc->grad.dir == LV_GRAD_DIR_NONE + || ((dsc->grad.dir != LV_GRAD_DIR_NONE) + && ((dsc->grad.stops[0].color.blue == dsc->grad.stops[dsc->grad.stops_count - 1].color.blue) + && (dsc->grad.stops[0].color.red == dsc->grad.stops[dsc->grad.stops_count - 1].color.red) + && (dsc->grad.stops[0].color.green == dsc->grad.stops[dsc->grad.stops_count - 1].color.green)))) { + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; + } + else { + } +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: { +#if 0//USE_D2 + t->preferred_draw_unit_id = DRAW_UNIT_ID_DAVE2D; + t->preference_score = 0; +#endif + ret = 0; + break; + } + + case LV_DRAW_TASK_TYPE_MASK_BITMAP: { + ret = 0; + break; + } + + default: + ret = 0; + break; + } + + return ret; +} + + +static int32_t lv_draw_dave2d_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_dave2d_unit_t * draw_dave2d_unit = (lv_draw_dave2d_unit_t *) draw_unit; + uint32_t deps = 0; + + if(draw_dave2d_unit->task_act) { + /* Return immediately if it's busy with draw task */ + return LV_DRAW_UNIT_IDLE; + } + + lv_draw_task_t * t = NULL; + t = lv_draw_get_next_available_task(layer, NULL, DRAW_UNIT_ID_DAVE2D); + if(t == NULL) { + /* No valid task, but there are tasks waiting to be rendered, + * start to draw then immediately. + */ + if(false == lv_ll_is_empty(&draw_tasks_on_dlist)) { + draw_pressure = 0; + dave2d_execute_dlist_and_flush(); + } + return LV_DRAW_UNIT_IDLE; /* This task is not for us. */ + } + + if((t->preferred_draw_unit_id != DRAW_UNIT_ID_DAVE2D)) return LV_DRAW_UNIT_IDLE; + if(!lv_draw_dave2d_is_dest_cf_supported(layer->color_format)) return LV_DRAW_UNIT_IDLE; + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) return LV_DRAW_UNIT_IDLE; + + deps = lv_draw_get_dependent_count(t); + if(deps > 0 || draw_pressure > 0) { + draw_pressure += deps; + if(draw_pressure < LV_DAVE2D_MAX_DRAW_PRESSURE) { + /* No other tasks are pressuring to get the current block + * of tasks including the latest one, just accumulate it + * and tells the drawing pipeline to send a new one if there is any + */ + lv_draw_task_t ** p_new_list_entry; + p_new_list_entry = lv_ll_ins_tail(&draw_tasks_on_dlist); + *p_new_list_entry = t; + + draw_dave2d_unit->task_act = t; + draw_dave2d_unit->task_act->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + execute_drawing(draw_dave2d_unit); + + draw_dave2d_unit->task_act = NULL; + lv_draw_dispatch_request(); + + return 1; + } + /* If the pressure for drawing value was maxed-out, it is time to render + * return IDLE to force the drawing pipeline to wait while the Dave + * draw the block of tasks in a single row + */ + return LV_DRAW_UNIT_IDLE; + } + else { + /* Handles a special case when there is no sufficient draw pressure + * But the actual task did not carry any extra pressure to get drew + * in this case, the drawing pipeline have a few set of tasks that + * don't make sense to accumulate them, just do a run to completion + * here, that is it, render the incoming task immediately. + */ + draw_dave2d_unit->task_act = t; + draw_dave2d_unit->task_act->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + d2_selectrenderbuffer(_d2_handle, _renderbuffer); + execute_drawing(draw_dave2d_unit); + d2_executerenderbuffer(_d2_handle, _renderbuffer, 0); + d2_flushframe(_d2_handle); + + draw_dave2d_unit->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + draw_dave2d_unit->task_act = NULL; + lv_draw_dispatch_request(); + + return 1; + } +} + +static int32_t _dave2d_wait_finish(lv_draw_unit_t * draw_unit) +{ + /* If the drawing pipeline is waiting it means the pressure for drawing + * has been maxed out, defer the block of tasks to be rendered by the + * Dave and wait for its interrupt. (Dave2D driver is RTOS aware, no need for semaphores); + */ + lv_draw_dave2d_unit_t * draw_dave2d_unit = (lv_draw_dave2d_unit_t *) draw_unit; + + if(!draw_pressure) { + /* It reached here because Dave2D Draw Unit was not suitable to take a task + * While there is nothing being rendered, prevent the dead lock + * by flushing the GPU command buffer empty and just return. + */ + return 0; + } + dave2d_execute_dlist_and_flush(); + draw_pressure = 0; + + return 0; +} + +static void execute_drawing(lv_draw_dave2d_unit_t * u) +{ + /*Render the draw task*/ + lv_draw_task_t * t = u->task_act; + + /* remember draw unit for access to unit's context */ + t->draw_unit = (lv_draw_unit_t *)u; + +#if defined(RENESAS_CORTEX_M85) || defined(_RENESAS_RZA_) +#if (BSP_CFG_DCACHE_ENABLED) || defined(_RENESAS_RZA_) + lv_layer_t * layer = t->target_layer; + lv_area_t clipped_area; + int32_t x; + int32_t y; + + lv_area_intersect(&clipped_area, &t->area, &t->clip_area); + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + lv_area_move(&clipped_area, x, y); + + /* Invalidate cache */ + lv_draw_buf_invalidate_cache(layer->draw_buf, &clipped_area); +#endif +#endif + + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_dave2d_fill(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_dave2d_border(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + //lv_draw_dave2d_box_shadow(t, t->draw_dsc, &t->area); + break; +#if 0 + case LV_DRAW_TASK_TYPE_BG_IMG: + //lv_draw_dave2d_bg_image(t, t->draw_dsc, &t->area); + break; +#endif + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_dave2d_label(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_dave2d_image(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_line_iterate(t, t->draw_dsc, lv_draw_dave2d_line); + break; + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_dave2d_arc(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_dave2d_triangle(t, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_LAYER: + //lv_draw_dave2d_layer(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + //lv_draw_dave2d_mask_rect(t, t->draw_dsc, &t->area); + break; + default: + break; + } + +#if defined(RENESAS_CORTEX_M85) || defined(_RENESAS_RZA_) +#if (BSP_CFG_DCACHE_ENABLED) || defined(_RENESAS_RZA_) + lv_draw_buf_invalidate_cache(layer->draw_buf, &clipped_area); +#endif +#endif +} + +static d2_s32 lv_dave2d_init(void) +{ + d2_s32 result = D2_OK; + + if(_d2_handle != NULL) { + return D2_NOMEMORY; + } + + _d2_handle = d2_opendevice(0); + if(_d2_handle == NULL) { + return D2_NOMEMORY; + } + + /* bind the hardware */ + result = d2_inithw(_d2_handle, 0); + if(result != D2_OK) { + LV_LOG_ERROR("Could NOT d2_inithw"); + d2_closedevice(_d2_handle); + return result; + } + + // + // Set various D2 parameters + // + result = d2_setblendmode(_d2_handle, d2_bm_alpha, d2_bm_one_minus_alpha); + result = d2_setalphamode(_d2_handle, d2_am_constant); + result = d2_setalpha(_d2_handle, UINT8_MAX); + result = d2_setantialiasing(_d2_handle, 1); + result = d2_setlinecap(_d2_handle, d2_lc_butt); + result = d2_setlinejoin(_d2_handle, d2_lj_miter); + + /* set blocksize for default displaylist */ + result = d2_setdlistblocksize(_d2_handle, 20); + if(D2_OK != result) { + LV_LOG_ERROR("Could NOT d2_setdlistblocksize"); + d2_closedevice(_d2_handle); + return result; + } + + _renderbuffer = d2_newrenderbuffer(_d2_handle, 250, 25); + if(!_renderbuffer) { + LV_LOG_ERROR("NO renderbuffer"); + d2_closedevice(_d2_handle); + + return D2_NOMEMORY; + } + + _label_renderbuffer = d2_newrenderbuffer(_d2_handle, 250, 25); + if(!_label_renderbuffer) { + LV_LOG_ERROR("NO renderbuffer"); + d2_closedevice(_d2_handle); + + return D2_NOMEMORY; + } + + result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); + if(D2_OK != result) { + LV_LOG_ERROR("Could NOT d2_selectrenderbuffer"); + d2_closedevice(_d2_handle); + } + + return result; +} + +void dave2d_execute_dlist_and_flush(void) +{ + d2_s32 result; + lv_draw_task_t ** p_list_entry; + lv_draw_task_t * p_list_entry1; + +#if LV_USE_OS + lv_result_t status; + + status = lv_mutex_lock(&xd2Semaphore); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + result = d2_executerenderbuffer(_d2_handle, _renderbuffer, 0); + LV_ASSERT(D2_OK == result); + + result = d2_flushframe(_d2_handle); + LV_ASSERT(D2_OK == result); + + result = d2_selectrenderbuffer(_d2_handle, _renderbuffer); + LV_ASSERT(D2_OK == result); + + while(false == lv_ll_is_empty(&draw_tasks_on_dlist)) { + p_list_entry = lv_ll_get_tail(&draw_tasks_on_dlist); + p_list_entry1 = *p_list_entry; + p_list_entry1->state = LV_DRAW_TASK_STATE_FINISHED; + lv_ll_remove(&draw_tasks_on_dlist, p_list_entry); + lv_free(p_list_entry); + } + +#if LV_USE_OS + status = lv_mutex_unlock(&xd2Semaphore); + LV_ASSERT(LV_RESULT_OK == status); +#endif +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.h b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.h new file mode 100644 index 0000000..53b613d --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.h @@ -0,0 +1,136 @@ +/** + * @file lv_draw_dave2d.h + * + */ + +#ifndef LV_DRAW_DAVE2D_H +#define LV_DRAW_DAVE2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" +#if LV_USE_DRAW_DAVE2D +#include "../../lv_draw.h" +#include "../../lv_draw_private.h" +#include "bsp_api.h" +#include "dave_driver.h" + +#if LV_USE_FLOAT + +/* We need to redefine some of D2 fixed point math macros to deal with lv_precise_t being float now */ +#undef D2_FIX4 +#undef D2_INT4 +#undef D2_FLOOR4 +#undef D2_CEIL4 +#undef D2_FRAC4 +#undef D2_FIX16 +#undef D2_INT16 +#undef D2_FLOOR16 +#undef D2_CEIL16 +#undef D2_FRAC16 + +#define D2_FIX4(x) (((int32_t)(x)) << 4) +#define D2_INT4(x) (((int32_t)(x))(x) >> 4) +#define D2_FLOOR4(x) (((int32_t)(x))((d2_u32)(x)) & ~15u) +#define D2_CEIL4(x) ((((d2_u32)(x)) + 15u) & ~15u) +#define D2_FRAC4(x) (((d2_u32)(x)) & 15u) +#define D2_FIX16(x) (((int32_t)(x)) << 16) +#define D2_INT16(x) (((int32_t)(x)) >> 16) +#define D2_FLOOR16(x) (((d2_u32)(x)) & ~65535u) +#define D2_CEIL16(x) ((((d2_u32)(x)) + 65535u) & ~65535u) +#define D2_FRAC16(x) (((d2_u32)(x)) & 65535u) + +/* It also should be included here before the other LVGL Dave2D files */ +#endif + +#include "lv_draw_dave2d_utils.h" +#include "../../lv_draw_rect.h" +#include "../../lv_draw_line.h" +#include "../../lv_draw_arc.h" +#include "../../lv_draw_label.h" +#include "../../lv_draw_image.h" +#include "../../lv_draw_triangle.h" +#include "../../lv_draw_buf.h" + + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; +#if LV_USE_OS + lv_thread_sync_t sync; + lv_thread_t thread; +#endif + uint32_t idx; + d2_device * d2_handle; + d2_renderbuffer * renderbuffer; + d2_renderbuffer * label_renderbuffer; + +#if LV_USE_OS + lv_mutex_t * pd2Mutex; +#endif +} lv_draw_dave2d_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_dave2d_init(void); + +void lv_draw_dave2d_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_dave2d_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_box_shadow(lv_draw_task_t * t, const lv_draw_box_shadow_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_dave2d_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_dave2d_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc); + +void lv_draw_dave2d_layer(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc); + +void lv_draw_dave2d_mask_rect(lv_draw_task_t * t, const lv_draw_mask_rect_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_dave2d_transform(lv_draw_task_t * t, const lv_area_t * dest_area, const void * src_buf, + int32_t src_w, int32_t src_h, int32_t src_stride, + const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t cf, void * dest_buf); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_DAVE2D*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_DAVE2D_H*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c new file mode 100644 index 0000000..5f8774a --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_arc.c @@ -0,0 +1,176 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +#include "../../../misc/lv_area_private.h" + +void lv_draw_dave2d_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ + + uint32_t flags = 0; + int32_t sin_start; + int32_t cos_start; + int32_t sin_end; + int32_t cos_end; + d2_s32 result; + lv_area_t clipped_area; + lv_area_t buffer_area; + lv_point_t arc_centre; + int32_t x; + int32_t y; + lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)t->draw_unit; + + if(!lv_area_intersect(&clipped_area, coords, &t->clip_area)) return; + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + buffer_area = t->target_layer->buf_area; + + arc_centre = dsc->center; + arc_centre.x = arc_centre.x - buffer_area.x1; + arc_centre.y = arc_centre.y - buffer_area.y1; + + lv_area_move(&clipped_area, x, y); + lv_area_move(&buffer_area, x, y); + + // + // If both angles are equal (e.g. 0 and 0 or 180 and 180) nothing has to be done + // + if(dsc->start_angle == dsc->end_angle) { + return; // Nothing to do, no angle - no arc + } + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + // + // Generate render operations + // + d2_framebuffer_from_layer(u->d2_handle, t->target_layer); + + d2_setalpha(u->d2_handle, dsc->opa); + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); + + result = d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, + (d2_border)clipped_area.y2); + LV_ASSERT(D2_OK == result); + + if(360 <= LV_ABS(dsc->start_angle - dsc->end_angle)) { + d2_rendercircle(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(dsc->radius - dsc->width / 2), + (d2_width) D2_FIX4(dsc->width)); + } + else { //An ARC, not a full circle + // + // If the difference between both is larger than 180 degrees we must use the concave flag + // + /** Set d2_wf_concave flag if the pie object to draw is concave shape. */ + if((LV_ABS(dsc->start_angle - dsc->end_angle) > 180) || ((dsc->end_angle < dsc->start_angle) && + (LV_ABS(dsc->start_angle - (dsc->end_angle + 360)) > 180))) { + flags = d2_wf_concave; + } + else { + flags = 0; + } + + sin_start = lv_trigo_sin((int16_t)dsc->start_angle); + cos_start = lv_trigo_cos((int16_t)dsc->start_angle); + + sin_end = lv_trigo_sin((int16_t)dsc->end_angle); + cos_end = lv_trigo_cos((int16_t)dsc->end_angle); + + bool draw_arc; + lv_area_t arc_area; + lv_area_t clip_arc; + lv_point_t start_point; + lv_point_t end_point; + + start_point.x = arc_centre.x + (int16_t)(((dsc->radius) * cos_start) >> LV_TRIGO_SHIFT); + start_point.y = arc_centre.y + (int16_t)(((dsc->radius) * sin_start) >> LV_TRIGO_SHIFT); + + end_point.x = arc_centre.x + (int16_t)(((dsc->radius) * cos_end) >> LV_TRIGO_SHIFT); + end_point.y = arc_centre.y + (int16_t)(((dsc->radius) * sin_end) >> LV_TRIGO_SHIFT); + + arc_area.x1 = LV_MIN3(start_point.x, end_point.x, arc_centre.x); + arc_area.y1 = LV_MIN3(start_point.y, end_point.y, arc_centre.y); + + arc_area.x2 = LV_MAX3(start_point.x, end_point.x, arc_centre.x); + arc_area.y2 = LV_MAX3(start_point.y, end_point.y, arc_centre.y); + + /* 0 degrees */ + if((dsc->end_angle < dsc->start_angle) || ((dsc->start_angle < 360) && (dsc->end_angle > 360))) { + arc_area.x2 = arc_centre.x + dsc->radius; + } + + /* 90 degrees */ + if(((dsc->end_angle > 90) && (dsc->start_angle < 90)) || ((dsc->start_angle < 90) && + (dsc->end_angle < dsc->start_angle))) { + arc_area.y2 = arc_centre.y + dsc->radius; + } + + /* 180 degrees */ + if(((dsc->end_angle > 180) && (dsc->start_angle < 180)) || ((dsc->start_angle < 180) && + (dsc->end_angle < dsc->start_angle))) { + arc_area.x1 = arc_centre.x - dsc->radius; + } + + /* 270 degrees */ + if(((dsc->end_angle > 270) && (dsc->start_angle < 270)) || ((dsc->start_angle < 270) && + (dsc->end_angle < dsc->start_angle))) { + arc_area.y1 = arc_centre.y - dsc->radius; + } + + draw_arc = lv_area_intersect(&clip_arc, &arc_area, &clipped_area); + + if(draw_arc) { + + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(dsc->radius - dsc->width / 2), + (d2_width) D2_FIX4(dsc->width), + -(d2_s32)(sin_start << 1), + (d2_s32)(cos_start << 1), + (d2_s32)(sin_end << 1), + -(d2_s32)(cos_end << 1), + flags); + LV_ASSERT(D2_OK == result); + + if(dsc->rounded) { + lv_point_t start_coord; + lv_point_t end_coord; + + start_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_start) >> LV_TRIGO_SHIFT); + start_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_start) >> LV_TRIGO_SHIFT); + + /** Render a circle. */ + d2_rendercircle(u->d2_handle, + (d2_point) D2_FIX4((uint16_t)(start_coord.x)), + (d2_point) D2_FIX4((uint16_t)(start_coord.y)), + (d2_width) D2_FIX4(dsc->width / 2), 0); + + end_coord.x = arc_centre.x + (int16_t)(((dsc->radius - dsc->width / 2) * cos_end) >> LV_TRIGO_SHIFT); + end_coord.y = arc_centre.y + (int16_t)(((dsc->radius - dsc->width / 2) * sin_end) >> LV_TRIGO_SHIFT); + + /** Render a circle. */ + d2_rendercircle(u->d2_handle, + (d2_point) D2_FIX4((uint16_t)(end_coord.x)), + (d2_point) D2_FIX4((uint16_t)(end_coord.y)), + (d2_width) D2_FIX4(dsc->width / 2), 0); + } + } + } + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_border.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_border.c new file mode 100644 index 0000000..abe6a91 --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_border.c @@ -0,0 +1,401 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +#include "../../../misc/lv_area_private.h" + +static void dave2d_draw_border_complex(lv_draw_task_t * t, const lv_area_t * outer_area, + const lv_area_t * inner_area, + int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa); + +static void dave2d_draw_border_simple(lv_draw_task_t * t, const lv_area_t * outer_area, + const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa); + +void lv_draw_dave2d_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(dsc->side == LV_BORDER_SIDE_NONE) return; + + int32_t coords_w = lv_area_get_width(coords); + int32_t coords_h = lv_area_get_height(coords); + int32_t rout = dsc->radius; + int32_t short_side = LV_MIN(coords_w, coords_h); + if(rout > short_side >> 1) rout = short_side >> 1; + + /*Get the inner area*/ + lv_area_t area_inner; + lv_area_copy(&area_inner, coords); + area_inner.x1 += ((dsc->side & LV_BORDER_SIDE_LEFT) ? dsc->width : - (dsc->width + rout)); + area_inner.x2 -= ((dsc->side & LV_BORDER_SIDE_RIGHT) ? dsc->width : - (dsc->width + rout)); + area_inner.y1 += ((dsc->side & LV_BORDER_SIDE_TOP) ? dsc->width : - (dsc->width + rout)); + area_inner.y2 -= ((dsc->side & LV_BORDER_SIDE_BOTTOM) ? dsc->width : - (dsc->width + rout)); + + int32_t rin = rout - dsc->width; + if(rin < 0) rin = 0; + + if(rout == 0 && rin == 0) { + dave2d_draw_border_simple(t, coords, &area_inner, dsc->color, dsc->opa); + } + else { + dave2d_draw_border_complex(t, coords, &area_inner, rout, rin, dsc->color, dsc->opa); + } + +} + +static void dave2d_draw_border_simple(lv_draw_task_t * t, const lv_area_t * outer_area, + const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa) + +{ + + lv_area_t clip_area; + lv_area_t local_outer_area; + lv_area_t local_inner_area; + int32_t x; + int32_t y; + bool is_common; + + is_common = lv_area_intersect(&clip_area, outer_area, &t->clip_area); + if(!is_common) return; + + lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)t->draw_unit; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + d2_u8 current_alpha = d2_getalpha(u->d2_handle); + local_outer_area = *outer_area; + local_inner_area = *inner_area; + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + lv_area_move(&clip_area, x, y); + lv_area_move(&local_outer_area, x, y); + lv_area_move(&local_inner_area, x, y); + + d2_framebuffer_from_layer(u->d2_handle, t->target_layer); + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(color)); + d2_setalpha(u->d2_handle, opa); + d2_cliprect(u->d2_handle, (d2_border)clip_area.x1, (d2_border)clip_area.y1, (d2_border)clip_area.x2, + (d2_border)clip_area.y2); + + lv_area_t a; + + bool top_side = local_outer_area.y1 <= local_inner_area.y1; + bool bottom_side = local_outer_area.y2 >= local_inner_area.y2; + bool left_side = local_outer_area.x1 <= local_inner_area.x1; + bool right_side = local_outer_area.x2 >= local_inner_area.x2; + + /*Top*/ + a.x1 = local_outer_area.x1; + a.x2 = local_outer_area.x2; + a.y1 = local_outer_area.y1; + a.y2 = local_inner_area.y1 - 1; + if(top_side) { + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), + (d2_point)D2_FIX4(a.y1), + (d2_point)D2_FIX4(lv_area_get_width(&a)), + (d2_point)D2_FIX4(lv_area_get_height(&a))); + } + + /*Bottom*/ + a.y1 = local_inner_area.y2 + 1; + a.y2 = local_outer_area.y2; + if(bottom_side) { + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), + (d2_point)D2_FIX4(a.y1), + (d2_point)D2_FIX4(lv_area_get_width(&a)), + (d2_point)D2_FIX4(lv_area_get_height(&a))); + } + + /*Left*/ + a.x1 = local_outer_area.x1; + a.x2 = local_inner_area.x1 - 1; + a.y1 = (top_side) ? local_inner_area.y1 : local_outer_area.y1; + a.y2 = (bottom_side) ? local_inner_area.y2 : local_outer_area.y2; + if(left_side) { + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), + (d2_point)D2_FIX4(a.y1), + (d2_point)D2_FIX4(lv_area_get_width(&a)), + (d2_point)D2_FIX4(lv_area_get_height(&a))); + } + + /*Right*/ + a.x1 = local_inner_area.x2 + 1; + a.x2 = local_outer_area.x2; + if(right_side) { + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(a.x1), + (d2_point)D2_FIX4(a.y1), + (d2_point)D2_FIX4(lv_area_get_width(&a)), + (d2_point)D2_FIX4(lv_area_get_height(&a))); + } + + d2_setalpha(u->d2_handle, current_alpha); + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif +} + +static void dave2d_draw_border_complex(lv_draw_task_t * t, const lv_area_t * orig_outer_area, + const lv_area_t * orig_inner_area, + int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa) +{ + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `coords`*/ + lv_area_t draw_area; + lv_area_t outer_area; + lv_area_t inner_area; + int32_t x; + int32_t y; + d2_s32 result; + d2_u32 flags = 0; + + outer_area = *orig_outer_area; + inner_area = *orig_inner_area; + lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)t->draw_unit; + + if(!lv_area_intersect(&draw_area, &outer_area, &t->clip_area)) return; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + d2_u8 current_alpha = d2_getalpha(u->d2_handle); + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + lv_area_move(&draw_area, x, y); + lv_area_move(&outer_area, x, y); + lv_area_move(&inner_area, x, y); + + // + // Generate render operations + // + + d2_framebuffer_from_layer(u->d2_handle, t->target_layer); + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(color)); + d2_setalpha(u->d2_handle, opa); + d2_cliprect(u->d2_handle, (d2_border)draw_area.x1, (d2_border)draw_area.y1, (d2_border)draw_area.x2, + (d2_border)draw_area.y2); + + lv_area_t blend_area; + /*Calculate the x and y coordinates where the straight parts area are */ + lv_area_t core_area; + core_area.x1 = LV_MAX(outer_area.x1 + rout, inner_area.x1); + core_area.x2 = LV_MIN(outer_area.x2 - rout, inner_area.x2); + core_area.y1 = LV_MAX(outer_area.y1 + rout, inner_area.y1); + core_area.y2 = LV_MIN(outer_area.y2 - rout, inner_area.y2); + + bool top_side = outer_area.y1 <= inner_area.y1; + bool bottom_side = outer_area.y2 >= inner_area.y2; + + /*No masks*/ + bool left_side = outer_area.x1 <= inner_area.x1; + bool right_side = outer_area.x2 >= inner_area.x2; + + /*Draw the straight lines first */ + if(top_side) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = outer_area.y1; + blend_area.y2 = inner_area.y1 - 1; + d2_renderbox(u->d2_handle, + (d2_point)D2_FIX4(blend_area.x1), + (d2_point)D2_FIX4(blend_area.y1), + (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), + (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); + } + + if(bottom_side) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = inner_area.y2 + 1; + blend_area.y2 = outer_area.y2; + d2_renderbox(u->d2_handle, + (d2_point)D2_FIX4(blend_area.x1), + (d2_point)D2_FIX4(blend_area.y1), + (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), + (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); + } + + if(left_side) { + blend_area.x1 = outer_area.x1; + blend_area.x2 = inner_area.x1 - 1; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + d2_renderbox(u->d2_handle, + (d2_point)D2_FIX4(blend_area.x1), + (d2_point)D2_FIX4(blend_area.y1), + (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), + (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); + } + + if(right_side) { + blend_area.x1 = inner_area.x2 + 1; + blend_area.x2 = outer_area.x2; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + d2_renderbox(u->d2_handle, + (d2_point)D2_FIX4(blend_area.x1), + (d2_point)D2_FIX4(blend_area.y1), + (d2_point)D2_FIX4(lv_area_get_width(&blend_area)), + (d2_point)D2_FIX4(lv_area_get_height(&blend_area))); + } + + /*Draw the corners*/ + int32_t blend_w; + /*Left corners*/ + blend_area.x1 = draw_area.x1; + blend_area.x2 = LV_MIN(draw_area.x2, core_area.x1 - 1); + + blend_w = lv_area_get_width(&blend_area); + + if(blend_w > 0) { + d2_s32 aa; + aa = d2_getantialiasing(u->d2_handle); + d2_setantialiasing(u->d2_handle, 0); //Don't blend with the background according to coverage value + + if(left_side || top_side) { + lv_area_t arc_area; + lv_area_t clip_arc; + + arc_area.x1 = core_area.x1 - rout; + arc_area.y1 = core_area.y1 - rout; + arc_area.x2 = core_area.x1; + arc_area.y2 = core_area.y1; + + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(core_area.x1), + (d2_point) D2_FIX4(core_area.y1), + (d2_width) D2_FIX4(rout), + (d2_width) D2_FIX4((rout - rin)), + (d2_s32) D2_FIX16(0), // 180 Degrees + (d2_s32) D2_FIX16((int16_t) -1), + (d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees + (d2_s32) D2_FIX16(0), + flags); + LV_ASSERT(D2_OK == result); + } + + } + + if(left_side || bottom_side) { + lv_area_t arc_area; + lv_area_t clip_arc; + + arc_area.x1 = core_area.x1 - rout; + arc_area.y1 = core_area.y2; + arc_area.x2 = core_area.x1; + arc_area.y2 = core_area.y2 + rout; + + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(core_area.x1), + (d2_point) D2_FIX4(core_area.y2), + (d2_width) D2_FIX4(rout), + (d2_width) D2_FIX4((rout - rin)), + (d2_s32) D2_FIX16((int16_t) -1), //90 degrees + (d2_s32) D2_FIX16(0), + (d2_s32) D2_FIX16(0), //180 degrees + (d2_s32) D2_FIX16(1), + flags); + LV_ASSERT(D2_OK == result); + } + } + + /*Right corners*/ + blend_area.x1 = LV_MAX(draw_area.x1, blend_area.x2 + 1); /*To not overlap with the left side*/ + blend_area.x1 = LV_MAX(draw_area.x1, core_area.x2 + 1); + + blend_area.x2 = draw_area.x2; + blend_w = lv_area_get_width(&blend_area); + + if(blend_w > 0) { + if(right_side || top_side) { + + lv_area_t arc_area; + lv_area_t clip_arc; + + arc_area.x1 = core_area.x2; + arc_area.y1 = core_area.y1 - rout; + arc_area.x2 = core_area.x2 + rout; + arc_area.y2 = core_area.y1; + + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(core_area.x2), + (d2_point) D2_FIX4(core_area.y1), + (d2_width) D2_FIX4(rout), + (d2_width) D2_FIX4((rout - rin)), + (d2_s32) D2_FIX16((int16_t)1), // 270 Degrees + (d2_s32) D2_FIX16(0), + (d2_s32) D2_FIX16(0),// 0 degrees + (d2_s32) D2_FIX16(-1), + flags); + LV_ASSERT(D2_OK == result); + } + + } + + if(right_side || bottom_side) { + lv_area_t arc_area; + lv_area_t clip_arc; + + arc_area.x1 = core_area.x2; + arc_area.y1 = core_area.y2; + arc_area.x2 = core_area.x2 + rout; + arc_area.y2 = core_area.y2 + rout; + + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(core_area.x2), + (d2_point) D2_FIX4(core_area.y2), + (d2_width) D2_FIX4(rout), + (d2_width) D2_FIX4((rout - rin)), + (d2_s32) D2_FIX16(0),// 0 degrees + (d2_s32) D2_FIX16(1), + (d2_s32) D2_FIX16(1),// 90 degrees + (d2_s32) D2_FIX16(0), + flags); + LV_ASSERT(D2_OK == result); + } + } + } + d2_setantialiasing(u->d2_handle, aa); //restore original setting + } + + d2_setalpha(u->d2_handle, current_alpha); + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c new file mode 100644 index 0000000..4312b6c --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_fill.c @@ -0,0 +1,294 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +#include "../../../misc/lv_area_private.h" + +void lv_draw_dave2d_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + lv_area_t draw_area; + lv_area_t coordinates; + bool is_common; + int32_t x; + int32_t y; + d2_u8 current_alpha_mode = 0; + d2_s32 result; + d2_u32 flags = 0; + + lv_point_t arc_centre; + lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)t->draw_unit; + + is_common = lv_area_intersect(&draw_area, coords, &t->clip_area); + if(!is_common) return; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + lv_area_copy(&coordinates, coords); + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + lv_area_move(&draw_area, x, y); + lv_area_move(&coordinates, x, y); + + d2_u8 current_alpha = d2_getalpha(u->d2_handle); + d2_framebuffer_from_layer(u->d2_handle, t->target_layer); + + if(LV_GRAD_DIR_NONE != dsc->grad.dir) { + float a1; + float a2; + + float y1; + float y2; + + float y3; + float y0; + int16_t y0_i ; + int16_t y3_i ; + + if(LV_GRAD_DIR_VER == dsc->grad.dir) { + a1 = dsc->grad.stops[0].opa; + a2 = dsc->grad.stops[dsc->grad.stops_count - 1].opa; + + y1 = (float)LV_MIN(coordinates.y1, coordinates.y2); + y2 = (float)LV_MAX(coordinates.y1, coordinates.y2); + + if(a1 < a2) { + y0 = 0.0f;//silence the compiler warning + y3 = 0.0f; + + } + else { + y0 = y2 - ((y2 - y1) / (a2 - a1) * (a2)); //point where alpha is 0 + y3 = y1 + ((y2 - y1) / (a2 - a1) * (255 - a1)); //point where alpha is 255 + } + + y0_i = (int16_t)y0; + y3_i = (int16_t)y3; + + d2_setalphagradient(u->d2_handle, 0, (d2_point)D2_FIX4(0), (d2_point)D2_FIX4(y0_i), (d2_point)D2_FIX4(0), + (d2_point)D2_FIX4((y3_i - y0_i))); + } + else if(LV_GRAD_DIR_HOR == dsc->grad.dir) { + + float x1; + float x2; + + float x3; + float x0; + int16_t x0_i ; + int16_t x3_i ; + + a1 = dsc->grad.stops[0].opa; + a2 = dsc->grad.stops[dsc->grad.stops_count - 1].opa; + + x1 = (float)LV_MIN(coordinates.x1, coordinates.x2); + x2 = (float)LV_MAX(coordinates.x1, coordinates.x2); + + if(a1 < a2) { + x0 = 0.0f;//silence the compiler warning + x3 = 0.0f; + + } + else { + x0 = x2 - ((x2 - x1) / (a2 - a1) * (a2)); //point where alpha is 0 + x3 = x1 + ((x2 - x1) / (a2 - a1) * (255 - a1)); //point where alpha is 255 + } + + x0_i = (int16_t)x0; + x3_i = (int16_t)x3; + + d2_setalphagradient(u->d2_handle, 0, (d2_point)D2_FIX4(x0_i), (d2_point)D2_FIX4(0), (d2_point)D2_FIX4(x3_i - x0_i), + (d2_point)D2_FIX4((0))); + } + + current_alpha_mode = d2_getalphamode(u->d2_handle); + d2_setfillmode(u->d2_handle, d2_fm_color); + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->grad.stops[0].color)); + d2_setalphamode(u->d2_handle, d2_am_gradient1); + } + else { + d2_setfillmode(u->d2_handle, d2_fm_color); //default + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); + d2_setalpha(u->d2_handle, dsc->opa); + } + + d2_cliprect(u->d2_handle, (d2_border)draw_area.x1, (d2_border)draw_area.y1, (d2_border)draw_area.x2, + (d2_border)draw_area.y2); + + if(dsc->radius == 0) { + + d2_renderbox(u->d2_handle, (d2_point)D2_FIX4(coordinates.x1), + (d2_point)D2_FIX4(coordinates.y1), + (d2_point)D2_FIX4(lv_area_get_width(&coordinates)), + (d2_point)D2_FIX4(lv_area_get_height(&coordinates))); + } + else { + /*Get the real radius. Can't be larger than the half of the shortest side */ + int32_t coords_bg_w = lv_area_get_width(&coordinates); + int32_t coords_bg_h = lv_area_get_height(&coordinates); + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + int32_t radius = LV_MIN(dsc->radius, short_side >> 1); + + arc_centre.x = coordinates.x1 + radius; + arc_centre.y = coordinates.y1 + radius; + + if(((2 * radius) == coords_bg_w) && ((2 * radius) == coords_bg_h)) { + result = d2_rendercircle(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0)); + LV_ASSERT(D2_OK == result); + } + else { + + lv_area_t arc_area; + lv_area_t clip_arc; + arc_centre.x = coordinates.x1 + radius; + arc_centre.y = coordinates.y1 + radius; + + arc_area.x1 = coordinates.x1; + arc_area.y1 = coordinates.y1; + arc_area.x2 = coordinates.x1 + radius; + arc_area.y2 = coordinates.y1 + radius; + + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + + // d2_renderwedge internally changes the clip rectangle, only draw it if it is in side the current clip rectangle + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0), + (d2_s32) D2_FIX16(0), // 180 Degrees + (d2_s32) D2_FIX16((int16_t) -1), + (d2_s32) D2_FIX16((int16_t) -1),//( 270 Degrees + (d2_s32) D2_FIX16(0), + flags); + LV_ASSERT(D2_OK == result); + } + + arc_centre.x = coordinates.x2 - radius; + arc_centre.y = coordinates.y1 + radius; + + arc_area.x1 = coordinates.x2 - radius; + arc_area.y1 = coordinates.y1; + arc_area.x2 = coordinates.x2; + arc_area.y2 = coordinates.y1 + radius; + + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0), + (d2_s32) D2_FIX16((int16_t)1), // 270 Degrees + (d2_s32) D2_FIX16(0), + (d2_s32) D2_FIX16(0),// 0 degrees + (d2_s32) D2_FIX16(-1), + flags); + LV_ASSERT(D2_OK == result); + } + + arc_centre.x = coordinates.x2 - radius; + arc_centre.y = coordinates.y2 - radius; + + arc_area.x1 = coordinates.x2 - radius; + arc_area.y1 = coordinates.y2 - radius; + arc_area.x2 = coordinates.x2; + arc_area.y2 = coordinates.y2; + + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0), + (d2_s32) D2_FIX16(0),// 0 degrees + (d2_s32) D2_FIX16(1), + (d2_s32) D2_FIX16(1),// 90 degrees + (d2_s32) D2_FIX16(0), + flags); + LV_ASSERT(D2_OK == result); + } + + arc_centre.x = coordinates.x1 + radius; + arc_centre.y = coordinates.y2 - radius; + + arc_area.x1 = coordinates.x1; + arc_area.y1 = coordinates.y2 - radius; + arc_area.x2 = coordinates.x1 + radius; + arc_area.y2 = coordinates.y2; + + if(lv_area_intersect(&clip_arc, &arc_area, &draw_area)) { + d2_cliprect(u->d2_handle, (d2_border)clip_arc.x1, (d2_border)clip_arc.y1, (d2_border)clip_arc.x2, + (d2_border)clip_arc.y2); + + result = d2_renderwedge(u->d2_handle, + (d2_point)D2_FIX4(arc_centre.x), + (d2_point) D2_FIX4(arc_centre.y), + (d2_width) D2_FIX4(radius), + (d2_width) D2_FIX4(0), + (d2_s32) D2_FIX16((int16_t) -1), //90 degrees + (d2_s32) D2_FIX16(0), + (d2_s32) D2_FIX16(0), //180 degrees + (d2_s32) D2_FIX16(1), + flags); + LV_ASSERT(D2_OK == result); + } + + /* reset the clip rectangle */ + d2_cliprect(u->d2_handle, (d2_border)draw_area.x1, (d2_border)draw_area.y1, (d2_border)draw_area.x2, + (d2_border)draw_area.y2); + + result = d2_renderbox(u->d2_handle, + (d2_width)D2_FIX4(coordinates.x1 + radius), + (d2_width)D2_FIX4(coordinates.y1), + (d2_width)D2_FIX4(lv_area_get_width(&coordinates) - (2 * radius)), + (d2_width)D2_FIX4(lv_area_get_height(&coordinates))); + LV_ASSERT(D2_OK == result); + + result = d2_renderbox(u->d2_handle, + (d2_width)D2_FIX4(coordinates.x1), + (d2_width)D2_FIX4(coordinates.y1 + radius), + (d2_width)D2_FIX4(radius), + (d2_width)D2_FIX4(lv_area_get_height(&coordinates) - (2 * radius))); + LV_ASSERT(D2_OK == result); + + result = d2_renderbox(u->d2_handle, + (d2_width)D2_FIX4(coordinates.x2 - radius + 1), + (d2_width)D2_FIX4(coordinates.y1 + radius), + (d2_width)D2_FIX4(radius), + (d2_width)D2_FIX4(lv_area_get_height(&coordinates) - (2 * radius))); + LV_ASSERT(D2_OK == result); + } + } + + if(LV_GRAD_DIR_NONE != dsc->grad.dir) { + d2_setalphamode(u->d2_handle, current_alpha_mode); + d2_setfillmode(u->d2_handle, d2_fm_color); //default + } + else { + d2_setalpha(u->d2_handle, current_alpha); + } + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_image.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_image.c new file mode 100644 index 0000000..fea2475 --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_image.c @@ -0,0 +1,321 @@ +/** + * @file lv_draw_dave2d_image.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +#include "../../lv_image_decoder_private.h" +#include "../../lv_draw_image_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void img_draw_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_dave2d_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + if(!draw_dsc->tile) { + lv_draw_image_normal_helper(t, draw_dsc, coords, img_draw_core, NULL); + } + else { + lv_draw_image_tiled_helper(t, draw_dsc, coords, img_draw_core, NULL); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void img_draw_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + + lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)t->draw_unit; + + (void)sup; //remove warning about unused parameter + + bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE ? true : false; + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + const uint8_t * src_buf = decoded->data; + const lv_image_header_t * header = &decoded->header; + uint32_t img_stride = decoded->header.stride; + lv_color_format_t cf = decoded->header.cf; + lv_area_t buffer_area; + lv_area_t draw_area; + lv_area_t clipped_area; + int32_t x; + int32_t y; + d2_u8 a_texture_op = d2_to_one; + d2_u8 r_texture_op = d2_to_copy; + d2_u8 g_texture_op = d2_to_copy; + d2_u8 b_texture_op = d2_to_copy; + d2_u8 current_fill_mode; + d2_u32 src_blend_mode; + d2_u32 dst_blend_mode; + d2_u32 src_alpha_blend_mode; + d2_u32 dst_alpha_blend_mode; + void * p_intermediate_buf = NULL; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + src_alpha_blend_mode = d2_getalphablendmodesrc(u->d2_handle); + dst_alpha_blend_mode = d2_getalphablendmodedst(u->d2_handle); + + buffer_area = t->target_layer->buf_area; + draw_area = *img_coords; + clipped_area = *clipped_img_area; + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + lv_area_move(&draw_area, x, y); + lv_area_move(&buffer_area, x, y); + lv_area_move(&clipped_area, x, y); + + current_fill_mode = d2_getfillmode(u->d2_handle); + a_texture_op = d2_gettextureoperationa(u->d2_handle); + r_texture_op = d2_gettextureoperationr(u->d2_handle); + g_texture_op = d2_gettextureoperationg(u->d2_handle); + b_texture_op = d2_gettextureoperationb(u->d2_handle); + src_blend_mode = d2_getblendmodesrc(u->d2_handle); + dst_blend_mode = d2_getblendmodedst(u->d2_handle); + +#if defined(RENESAS_CORTEX_M85) || defined(_RENESAS_RZA_) +#if (BSP_CFG_DCACHE_ENABLED) || defined(_RENESAS_RZA_) + d1_cacheblockflush(u->d2_handle, 0, src_buf, + img_stride * header->h); //Stride is in bytes, not pixels/texels +#endif +#endif + + if(LV_COLOR_FORMAT_RGB565A8 == cf) { + + lv_point_t p1[4] = { //Points in clockwise order + {0, 0}, + {header->w - 1, 0}, + {header->w - 1, header->h - 1}, + {0, header->h - 1}, + }; + + d2_s32 dxu1 = D2_FIX16(1); + d2_s32 dxv1 = D2_FIX16(0); + d2_s32 dyu1 = D2_FIX16(0); + d2_s32 dyv1 = D2_FIX16(1); + + uint32_t size = header->h * (header->w * lv_color_format_get_size(LV_COLOR_FORMAT_ARGB8888)); + p_intermediate_buf = lv_malloc(size); + + d2_framebuffer(u->d2_handle, + p_intermediate_buf, + (d2_s32)header->w, + (d2_u32)header->w, + (d2_u32)header->h, + lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(LV_COLOR_FORMAT_ARGB8888)); + + d2_cliprect(u->d2_handle, (d2_border)0, (d2_border)0, (d2_border)header->w - 1, + (d2_border)header->h - 1); + + d2_settexopparam(u->d2_handle, d2_cc_alpha, draw_dsc->opa, 0); + + d2_settextureoperation(u->d2_handle, d2_to_replace, d2_to_copy, d2_to_copy, d2_to_copy); + + d2_settexturemapping(u->d2_handle, D2_FIX4(p1[0].x), D2_FIX4(p1[0].y), D2_FIX16(0), D2_FIX16(0), dxu1, dxv1, dyu1, + dyv1); + d2_settexturemode(u->d2_handle, d2_tm_filter); + d2_setfillmode(u->d2_handle, d2_fm_texture); + + d2_settexture(u->d2_handle, (void *)src_buf, + (d2_s32)(img_stride / lv_color_format_get_size(LV_COLOR_FORMAT_RGB565)), + header->w, header->h, lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(LV_COLOR_FORMAT_RGB565)); + + d2_setblendmode(u->d2_handle, d2_bm_one, d2_bm_zero); + + d2_renderquad(u->d2_handle, + (d2_point)D2_FIX4(p1[0].x), + (d2_point)D2_FIX4(p1[0].y), + (d2_point)D2_FIX4(p1[1].x), + (d2_point)D2_FIX4(p1[1].y), + (d2_point)D2_FIX4(p1[2].x), + (d2_point)D2_FIX4(p1[2].y), + (d2_point)D2_FIX4(p1[3].x), + (d2_point)D2_FIX4(p1[3].y), + 0); + + d2_setblendmode(u->d2_handle, d2_bm_zero, d2_bm_one); //Keep the RGB data in the intermediate buffer + + d2_setalphablendmode(u->d2_handle, d2_bm_one, d2_bm_zero); //Write SRC alpha, i.e. A8 data + + d2_settextureoperation(u->d2_handle, d2_to_copy, d2_to_copy, d2_to_copy, d2_to_copy); + + d2_settexture(u->d2_handle, (void *)(src_buf + header->h * (header->w * lv_color_format_get_size( + LV_COLOR_FORMAT_RGB565))), + (d2_s32)(img_stride / lv_color_format_get_size(LV_COLOR_FORMAT_RGB565)), + header->w, header->h, lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(LV_COLOR_FORMAT_A8)); + + d2_renderquad(u->d2_handle, + (d2_point)D2_FIX4(p1[0].x), + (d2_point)D2_FIX4(p1[0].y), + (d2_point)D2_FIX4(p1[1].x), + (d2_point)D2_FIX4(p1[1].y), + (d2_point)D2_FIX4(p1[2].x), + (d2_point)D2_FIX4(p1[2].y), + (d2_point)D2_FIX4(p1[3].x), + (d2_point)D2_FIX4(p1[3].y), + 0); + + cf = LV_COLOR_FORMAT_ARGB8888; + src_buf = p_intermediate_buf; + img_stride = header->w * lv_color_format_get_size(cf); + + } + + d2_framebuffer_from_layer(u->d2_handle, t->target_layer); + + d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, + (d2_border)clipped_area.y2); + + d2_settexopparam(u->d2_handle, d2_cc_alpha, draw_dsc->opa, 0); + + if(LV_COLOR_FORMAT_RGB565 == cf) { + d2_settextureoperation(u->d2_handle, d2_to_replace, d2_to_copy, d2_to_copy, d2_to_copy); + } + else { //Formats with an alpha channel, + d2_settextureoperation(u->d2_handle, d2_to_multiply, d2_to_copy, d2_to_copy, d2_to_copy); + } + + if(LV_BLEND_MODE_NORMAL == draw_dsc->blend_mode) { /**< Simply mix according to the opacity value*/ + d2_setblendmode(u->d2_handle, d2_bm_alpha, d2_bm_one_minus_alpha); //direct linear blend + } + else if(LV_BLEND_MODE_ADDITIVE == draw_dsc->blend_mode) { /**< Add the respective color channels*/ + /* TODO */ + d2_setblendmode(u->d2_handle, d2_bm_alpha, d2_bm_one); //Additive blending + } + else if(LV_BLEND_MODE_SUBTRACTIVE == draw_dsc->blend_mode) { /**< Subtract the foreground from the background*/ + /* TODO */ + } + else { //LV_BLEND_MODE_MULTIPLY, /**< Multiply the foreground and background*/ + /* TODO */ + } + + lv_point_t p[4] = { //Points in clockwise order + {0, 0}, + {header->w - 1, 0}, + {header->w - 1, header->h - 1}, + {0, header->h - 1}, + }; + + d2_settexture(u->d2_handle, (void *)src_buf, + (d2_s32)(img_stride / lv_color_format_get_size(cf)), + header->w, header->h, lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(cf)); + + d2_settexturemode(u->d2_handle, d2_tm_filter); + d2_setfillmode(u->d2_handle, d2_fm_texture); + + d2_s32 dxu = D2_FIX16(1); + d2_s32 dxv = D2_FIX16(0); + d2_s32 dyu = D2_FIX16(0); + d2_s32 dyv = D2_FIX16(1); + + if(transformed) { + lv_point_transform(&p[0], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); + lv_point_transform(&p[1], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); + lv_point_transform(&p[2], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); + lv_point_transform(&p[3], draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, &draw_dsc->pivot, true); + + int32_t angle_limited = draw_dsc->rotation; + if(angle_limited > 3600) angle_limited -= 3600; + if(angle_limited < 0) angle_limited += 3600; + + int32_t angle_low = angle_limited / 10; + + if(0 != angle_low) { + /* LV_TRIGO_SHIFT is 15, so only need to shift by 1 to get 16:16 fixed point */ + dxv = (d2_s32)((1 << 1) * lv_trigo_sin((int16_t)angle_low)); + dxu = (d2_s32)((1 << 1) * lv_trigo_cos((int16_t)angle_low)); + dyv = (d2_s32)((1 << 1) * lv_trigo_sin((int16_t)angle_low + 90)); + dyu = (d2_s32)((1 << 1) * lv_trigo_cos((int16_t)angle_low + 90)); + } + + if(LV_SCALE_NONE != draw_dsc->scale_x) { + dxu = (dxu * LV_SCALE_NONE) / draw_dsc->scale_x; + dxv = (dxv * LV_SCALE_NONE) / draw_dsc->scale_x; + } + if(LV_SCALE_NONE != draw_dsc->scale_y) { + dyu = (dyu * LV_SCALE_NONE) / draw_dsc->scale_y; + dyv = (dyv * LV_SCALE_NONE) / draw_dsc->scale_y; + } + } + + p[0].x += draw_area.x1; + p[0].y += draw_area.y1; + p[1].x += draw_area.x1; + p[1].y += draw_area.y1; + p[2].x += draw_area.x1; + p[2].y += draw_area.y1; + p[3].x += draw_area.x1; + p[3].y += draw_area.y1; + + d2_settexturemapping(u->d2_handle, D2_FIX4(p[0].x), D2_FIX4(p[0].y), D2_FIX16(0), D2_FIX16(0), dxu, dxv, dyu, dyv); + + d2_renderquad(u->d2_handle, + (d2_point)D2_FIX4(p[0].x), + (d2_point)D2_FIX4(p[0].y), + (d2_point)D2_FIX4(p[1].x), + (d2_point)D2_FIX4(p[1].y), + (d2_point)D2_FIX4(p[2].x), + (d2_point)D2_FIX4(p[2].y), + (d2_point)D2_FIX4(p[3].x), + (d2_point)D2_FIX4(p[3].y), + 0); + + d2_setfillmode(u->d2_handle, current_fill_mode); + d2_settextureoperation(u->d2_handle, a_texture_op, r_texture_op, g_texture_op, b_texture_op); + d2_setblendmode(u->d2_handle, src_blend_mode, dst_blend_mode); + d2_setalphablendmode(u->d2_handle, src_alpha_blend_mode, dst_alpha_blend_mode); + + if(NULL != p_intermediate_buf) { + lv_free(p_intermediate_buf); + } + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + +} + +#endif //LV_USE_DRAW_DAVE2D diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c new file mode 100644 index 0000000..61f7af7 --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c @@ -0,0 +1,161 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +#include "../../lv_draw_label_private.h" +#include "../../../misc/lv_area_private.h" + +static void lv_draw_dave2d_draw_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +void lv_draw_dave2d_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_draw_label_iterate_characters(t, dsc, coords, lv_draw_dave2d_draw_letter_cb); + +} + +static void lv_draw_dave2d_draw_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + if(glyph_draw_dsc) { + d2_u8 current_fillmode; + lv_area_t clip_area; + lv_area_t letter_coords; + + int32_t x; + int32_t y; + + letter_coords = *glyph_draw_dsc->letter_coords; + lv_draw_dave2d_unit_t * unit = (lv_draw_dave2d_unit_t *)t->draw_unit; + + bool is_common; + is_common = lv_area_intersect(&clip_area, glyph_draw_dsc->letter_coords, &t->clip_area); + if(!is_common) return; + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + lv_area_move(&clip_area, x, y); + lv_area_move(&letter_coords, x, y); + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(unit->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + /* Labels use their own render buffer, select it first. */ + d2_selectrenderbuffer(unit->d2_handle, unit->label_renderbuffer); + + // + // Generate render operations + // + + d2_framebuffer_from_layer(unit->d2_handle, t->target_layer); + + current_fillmode = d2_getfillmode(unit->d2_handle); + + d2_cliprect(unit->d2_handle, (d2_border)clip_area.x1, (d2_border)clip_area.y1, (d2_border)clip_area.x2, + (d2_border)clip_area.y2); + + switch(glyph_draw_dsc->format) { + case LV_FONT_GLYPH_FORMAT_NONE: { +#if LV_USE_FONT_PLACEHOLDER + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + //lv_draw_sw_border(u, &border_draw_dsc, glyph_draw_dsc->bg_coords); + lv_draw_dave2d_border(t, &border_draw_dsc, glyph_draw_dsc->bg_coords); +#endif + } + break; + case LV_FONT_GLYPH_FORMAT_A1 ... LV_FONT_GLYPH_FORMAT_A8: { + glyph_draw_dsc->glyph_data = lv_font_get_glyph_bitmap(glyph_draw_dsc->g, glyph_draw_dsc->_draw_buf); + lv_area_t mask_area = letter_coords; + mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1; + // lv_draw_sw_blend_dsc_t blend_dsc; + // lv_memzero(&blend_dsc, sizeof(blend_dsc)); + // blend_dsc.color = glyph_draw_dsc->color; + // blend_dsc.opa = glyph_draw_dsc->opa; + // blend_dsc.mask_buf = glyph_draw_dsc->glyph_data; + // blend_dsc.mask_area = &mask_area; + // blend_dsc.blend_area = glyph_draw_dsc->letter_coords; + // blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + //lv_draw_sw_blend(u, &blend_dsc); + + const lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; + +#if defined(RENESAS_CORTEX_M85) || defined(_RENESAS_RZA_) +#if (BSP_CFG_DCACHE_ENABLED) || defined(_RENESAS_RZA_) + d1_cacheblockflush(unit->d2_handle, 0, draw_buf->data, draw_buf->data_size); +#endif +#endif + d2_settexture(unit->d2_handle, (void *)draw_buf->data, + (d2_s32)lv_draw_buf_width_to_stride((uint32_t)lv_area_get_width(&letter_coords), LV_COLOR_FORMAT_A8), + lv_area_get_width(&letter_coords), lv_area_get_height(&letter_coords), d2_mode_alpha8); + d2_settexopparam(unit->d2_handle, d2_cc_red, glyph_draw_dsc->color.red, 0); + d2_settexopparam(unit->d2_handle, d2_cc_green, glyph_draw_dsc->color.green, 0); + d2_settexopparam(unit->d2_handle, d2_cc_blue, glyph_draw_dsc->color.blue, 0); + d2_settexopparam(unit->d2_handle, d2_cc_alpha, glyph_draw_dsc->opa, 0); + + d2_settextureoperation(unit->d2_handle, d2_to_multiply, d2_to_multiply, d2_to_multiply, d2_to_multiply); + + d2_settexturemapping(unit->d2_handle, D2_FIX4(letter_coords.x1), D2_FIX4(letter_coords.y1), D2_FIX16(0), D2_FIX16(0), + D2_FIX16(1), D2_FIX16(0), D2_FIX16(0), D2_FIX16(1)); + + d2_settexturemode(unit->d2_handle, d2_tm_filter); + + d2_setfillmode(unit->d2_handle, d2_fm_texture); + + d2_renderbox(unit->d2_handle, (d2_point)D2_FIX4(letter_coords.x1), + (d2_point)D2_FIX4(letter_coords.y1), + (d2_point)D2_FIX4(lv_area_get_width(&letter_coords)), + (d2_point)D2_FIX4(lv_area_get_height(&letter_coords))); + + d2_setfillmode(unit->d2_handle, current_fillmode); + } + break; + case LV_FONT_GLYPH_FORMAT_IMAGE: { +#if LV_USE_IMGFONT + glyph_draw_dsc->glyph_data = lv_font_get_glyph_bitmap(glyph_draw_dsc->g, glyph_draw_dsc->_draw_buf); + lv_draw_image_dsc_t img_dsc; + lv_draw_image_dsc_init(&img_dsc); + img_dsc.rotation = 0; + img_dsc.scale_x = LV_SCALE_NONE; + img_dsc.scale_y = LV_SCALE_NONE; + img_dsc.opa = glyph_draw_dsc->opa; + img_dsc.src = glyph_draw_dsc->glyph_data; + //lv_draw_sw_image(t, &img_dsc, glyph_draw_dsc->letter_coords); +#endif + } + break; + default: + break; + } + + /* Drawing labels is a special case, because its draw buffer is shared + * between all the glyphs, then using the global render bufeer to defer + * its drawing later with other shapes, will corrupt the text drawn, + * instead, pushes all the glyph commands and its dedicated draw buffer + * to a specific render buffer, and draw it immediately while the contents + * are valid. + */ + d2_executerenderbuffer(unit->d2_handle, unit->label_renderbuffer, 0); + d2_flushframe(unit->d2_handle); + d2_selectrenderbuffer(unit->d2_handle, unit->renderbuffer); + +#if LV_USE_OS + status = lv_mutex_unlock(unit->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + } + + if(fill_draw_dsc && fill_area) { + lv_draw_dave2d_fill(t, fill_draw_dsc, fill_area); + } +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_line.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_line.c new file mode 100644 index 0000000..60af61e --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_line.c @@ -0,0 +1,81 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +#include "../../../misc/lv_area_private.h" + +void lv_draw_dave2d_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc) +{ + + lv_area_t clip_line; + d2_u32 mode; + lv_area_t buffer_area; + lv_value_precise_t p1_x; + lv_value_precise_t p1_y; + lv_value_precise_t p2_x; + lv_value_precise_t p2_y; + int32_t x; + int32_t y; + lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)t->draw_unit; + + clip_line.x1 = LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; + clip_line.x2 = LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; + clip_line.y1 = LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; + clip_line.y2 = LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; + + bool is_common; + is_common = lv_area_intersect(&clip_line, &clip_line, &t->clip_area); + if(!is_common) return; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + d2_u8 current_alpha = d2_getalpha(u->d2_handle); + + buffer_area = t->target_layer->buf_area; + p1_x = dsc->p1.x - buffer_area.x1; + p1_y = dsc->p1.y - buffer_area.y1; + p2_x = dsc->p2.x - buffer_area.x1; + p2_y = dsc->p2.y - buffer_area.y1; + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + lv_area_move(&clip_line, x, y); + lv_area_move(&buffer_area, x, y); + + bool dashed = dsc->dash_gap && dsc->dash_width; + + // + // Generate render operations + // + d2_framebuffer_from_layer(u->d2_handle, t->target_layer); + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); + + d2_setalpha(u->d2_handle, dsc->opa); + + d2_cliprect(u->d2_handle, clip_line.x1, clip_line.y1, clip_line.x2, clip_line.y2); + + if((dsc->round_end == 1) || (dsc->round_start == 1)) { + mode = d2_lc_round; + } + else { + mode = d2_lc_butt; // lines end directly at endpoints + } + + d2_setlinecap(u->d2_handle, mode); + + d2_renderline(u->d2_handle, D2_FIX4(p1_x), D2_FIX4(p1_y), D2_FIX4(p2_x), + D2_FIX4(p2_y), D2_FIX4(dsc->width), d2_le_exclude_none); + + d2_setalpha(u->d2_handle, current_alpha); +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c new file mode 100644 index 0000000..ccbded6 --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_mask_rectangle.c @@ -0,0 +1,48 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +#include "../../../misc/lv_area_private.h" + +void lv_draw_dave2d_mask_rect(lv_draw_task_t * t, const lv_draw_mask_rect_dsc_t * dsc, + const lv_area_t * coords) +{ + lv_area_t clipped_area; + lv_area_t coordinates; + int32_t x; + int32_t y; + + lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)t->draw_unit; + + if(!lv_area_intersect(&clipped_area, coords, &t->clip_area)) return; + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + coordinates = *coords; + + lv_area_move(&clipped_area, x, y); + lv_area_move(&coordinates, x, y); + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + d2_framebuffer_from_layer(u->d2_handle, t->target_layer); + + d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, + (d2_border)clipped_area.y2); + + d2_renderbox(u->d2_handle, + (d2_point) D2_FIX4(coordinates.x1), + (d2_point) D2_FIX4(coordinates.y1), + (d2_width) D2_FIX4(lv_area_get_width(&coordinates)), + (d2_width) D2_FIX4(lv_area_get_height(&coordinates))); + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif +} +#endif //LV_USE_DRAW_DAVE2D diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c new file mode 100644 index 0000000..d3d2e87 --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_triangle.c @@ -0,0 +1,162 @@ +#include "lv_draw_dave2d.h" +#if LV_USE_DRAW_DAVE2D + +#include "../../../misc/lv_area_private.h" + +void lv_draw_dave2d_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc) +{ + lv_area_t clipped_area; + d2_u32 flags = 0; + d2_u8 current_alpha_mode = 0; + int32_t x; + int32_t y; + lv_draw_dave2d_unit_t * u = (lv_draw_dave2d_unit_t *)t->draw_unit; + + lv_area_t tri_area; + tri_area.x1 = LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y1 = LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + tri_area.x2 = LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y2 = LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + if(!lv_area_intersect(&clipped_area, &tri_area, &t->clip_area)) return; + +#if LV_USE_OS + lv_result_t status; + status = lv_mutex_lock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + + x = 0 - t->target_layer->buf_area.x1; + y = 0 - t->target_layer->buf_area.y1; + + lv_area_move(&clipped_area, x, y); + + lv_point_precise_t p[3]; + p[0] = dsc->p[0]; + p[1] = dsc->p[1]; + p[2] = dsc->p[2]; + + /*Order the points like this: + * [0]: top + * [1]: right bottom + * [2]: left bottom */ + + if(dsc->p[0].y <= dsc->p[1].y && dsc->p[0].y <= dsc->p[2].y) { + p[0] = dsc->p[0]; + if(dsc->p[1].x < dsc->p[2].x) { + p[2] = dsc->p[1]; + p[1] = dsc->p[2]; + } + else { + p[2] = dsc->p[2]; + p[1] = dsc->p[1]; + } + } + else if(dsc->p[1].y <= dsc->p[0].y && dsc->p[1].y <= dsc->p[2].y) { + p[0] = dsc->p[1]; + if(dsc->p[0].x < dsc->p[2].x) { + p[2] = dsc->p[0]; + p[1] = dsc->p[2]; + } + else { + p[2] = dsc->p[2]; + p[1] = dsc->p[0]; + } + } + else { + p[0] = dsc->p[2]; + if(dsc->p[0].x < dsc->p[1].x) { + p[2] = dsc->p[0]; + p[1] = dsc->p[1]; + } + else { + p[2] = dsc->p[1]; + p[1] = dsc->p[0]; + } + } + + p[0].x -= t->target_layer->buf_area.x1; + p[1].x -= t->target_layer->buf_area.x1; + p[2].x -= t->target_layer->buf_area.x1; + + p[0].y -= t->target_layer->buf_area.y1; + p[1].y -= t->target_layer->buf_area.y1; + p[2].y -= t->target_layer->buf_area.y1; + + p[1].y -= 1; + p[2].y -= 1; + + d2_u8 current_alpha = d2_getalpha(u->d2_handle); + current_alpha_mode = d2_getalphamode(u->d2_handle); + + if(LV_GRAD_DIR_NONE != dsc->grad.dir) { + float a1; + float a2; + + float y1; + float y2; + + float y3; + float y0; + int32_t y0_i ; + int32_t y3_i ; + + if(LV_GRAD_DIR_VER == dsc->grad.dir) { + a1 = dsc->grad.stops[0].opa; + a2 = dsc->grad.stops[dsc->grad.stops_count - 1].opa; + + y1 = LV_MIN3(p[0].y, p[1].y, p[2].y); + y2 = LV_MAX3(p[0].y, p[1].y, p[2].y); + + if(a1 < a2) { + y0 = 0.0f;//silence the compiler warning + y3 = 0.0f; + + } + else { + y0 = y2 - ((y2 - y1) / (a2 - a1) * (a2)); //point where alpha is 0 + y3 = y1 + ((y2 - y1) / (a2 - a1) * (255 - a1)); //point where alpha is 255 + } + + y0_i = (int16_t)y0; + y3_i = (int16_t)y3; + + d2_setalphagradient(u->d2_handle, 0, D2_FIX4(0), D2_FIX4(y0_i), D2_FIX4(0), D2_FIX4((y3_i - y0_i))); + } + + + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->grad.stops[0].color)); + d2_setalphamode(u->d2_handle, d2_am_gradient1); + } + else { + d2_setalpha(u->d2_handle, dsc->opa); + d2_setalphamode(u->d2_handle, d2_am_constant); + d2_setcolor(u->d2_handle, 0, lv_draw_dave2d_lv_colour_to_d2_colour(dsc->color)); + + } + + d2_framebuffer_from_layer(u->d2_handle, t->target_layer); + + d2_cliprect(u->d2_handle, (d2_border)clipped_area.x1, (d2_border)clipped_area.y1, (d2_border)clipped_area.x2, + (d2_border)clipped_area.y2); + + d2_rendertri(u->d2_handle, + (d2_point) D2_FIX4(p[0].x), + (d2_point) D2_FIX4(p[0].y), + (d2_point) D2_FIX4(p[1].x), + (d2_point) D2_FIX4(p[1].y), + (d2_point) D2_FIX4(p[2].x), + (d2_point) D2_FIX4(p[2].y), + flags); + + d2_setalphamode(u->d2_handle, current_alpha_mode); + d2_setalpha(u->d2_handle, current_alpha); + +#if LV_USE_OS + status = lv_mutex_unlock(u->pd2Mutex); + LV_ASSERT(LV_RESULT_OK == status); +#endif + +} + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.c b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.c new file mode 100644 index 0000000..e43ad4e --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.c @@ -0,0 +1,150 @@ +/** + * @file lv_draw_dave2d_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_dave2d.h" + +#if LV_USE_DRAW_DAVE2D + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +d2_color lv_draw_dave2d_lv_colour_to_d2_colour(lv_color_t color) +{ + uint8_t alpha, red, green, blue; + + alpha = 0x00; + red = color.red ; + green = color.green ; + blue = color.blue; + /*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/ + switch(LV_COLOR_DEPTH) { + case(8): + LV_ASSERT(0); + break; + case(16): + break; + case(24): + break; + case(32): + break; + + default: + break; + } + + return (alpha) << 24UL + | (red) << 16UL + | (green) << 8UL + | (blue) << 0UL; +} + +d2_u32 lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(lv_color_format_t colour_format) +{ + d2_u32 d2_lvgl_mode = 0; + + switch(colour_format) { + case(LV_COLOR_FORMAT_I1): + d2_lvgl_mode = d2_mode_i1; + break; + case(LV_COLOR_FORMAT_I2): + d2_lvgl_mode = d2_mode_i2; + break; + case(LV_COLOR_FORMAT_I4): + d2_lvgl_mode = d2_mode_i4; + break; + case(LV_COLOR_FORMAT_I8): + d2_lvgl_mode = d2_mode_i8; + break; + case(LV_COLOR_FORMAT_A8): + d2_lvgl_mode = d2_mode_alpha8; + break; + case(LV_COLOR_FORMAT_RGB565): + d2_lvgl_mode = d2_mode_rgb565; + break; + case(LV_COLOR_FORMAT_ARGB1555): + d2_lvgl_mode = d2_mode_argb1555; + break; + case(LV_COLOR_FORMAT_ARGB4444): + d2_lvgl_mode = d2_mode_argb4444; + break; + case(LV_COLOR_FORMAT_ARGB8888): + d2_lvgl_mode = d2_mode_argb8888; + break; + case(LV_COLOR_FORMAT_XRGB8888): + d2_lvgl_mode = d2_mode_argb8888; + break; + + case(LV_COLOR_FORMAT_RGB888): //LV_COLOR_FORMAT_RGB888 is a 3 byte format, d2_mode_rgb888 is a 4 byte format, not supported + default: + LV_ASSERT(0); + break; + + } + return d2_lvgl_mode; +} + +void d2_framebuffer_from_layer(d2_device * handle, lv_layer_t * layer) +{ + lv_draw_buf_t * draw_buf = layer->draw_buf; + lv_area_t buffer_area = layer->buf_area; + lv_area_move(&buffer_area, -layer->buf_area.x1, -layer->buf_area.y1); + + d2_framebuffer(handle, draw_buf->data, + (d2_s32) draw_buf->header.stride / lv_color_format_get_size(layer->color_format), + (d2_u32)lv_area_get_width(&buffer_area), + (d2_u32)lv_area_get_height(&buffer_area), + lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(layer->color_format)); +} + +bool lv_draw_dave2d_is_dest_cf_supported(lv_color_format_t cf) +{ + bool result; + + switch(cf) { + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB4444: + result = true; + break; + + default: + result = false; + break; + } + + return result; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_DAVE2D*/ diff --git a/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.h b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.h new file mode 100644 index 0000000..90a6fe4 --- /dev/null +++ b/inc/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_utils.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_dave2d_utils.h + * + */ + +#ifndef LV_DRAW_DAVE2D_UTILS_H +#define LV_DRAW_DAVE2D_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +d2_color lv_draw_dave2d_lv_colour_to_d2_colour(lv_color_t color); + +d2_u32 lv_draw_dave2d_lv_colour_fmt_to_d2_fmt(lv_color_format_t colour_format); + +void d2_framebuffer_from_layer(d2_device * handle, lv_layer_t * layer); + +bool lv_draw_dave2d_is_dest_cf_supported(lv_color_format_t cf); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_DAVE2D_UTILS_H*/ diff --git a/inc/lvgl/src/draw/sdl/lv_draw_sdl.c b/inc/lvgl/src/draw/sdl/lv_draw_sdl.c new file mode 100644 index 0000000..e3fe6b0 --- /dev/null +++ b/inc/lvgl/src/draw/sdl/lv_draw_sdl.c @@ -0,0 +1,524 @@ +/** + * @file lv_draw_sdl.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_private.h" +#if LV_USE_DRAW_SDL +#include LV_SDL_INCLUDE_PATH +#include "lv_draw_sdl.h" +#include "../../core/lv_refr_private.h" +#include "../../display/lv_display_private.h" +#include "../../stdlib/lv_string.h" +#include "../../drivers/sdl/lv_sdl_window.h" +#include "../../misc/cache/lv_cache_entry_private.h" +#include "../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ +#define DRAW_UNIT_ID_SDL 100 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; + lv_cache_t * texture_cache; + lv_draw_buf_t render_draw_buf; +} lv_draw_sdl_unit_t; + +typedef struct { + lv_draw_dsc_base_t * draw_dsc; + int32_t w; + int32_t h; + SDL_Texture * texture; +} cache_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void execute_drawing(lv_draw_sdl_unit_t * u); + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); +static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ +static SDL_Texture * layer_get_texture(lv_layer_t * layer); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +static bool sdl_texture_cache_create_cb(cache_data_t * cached_data, void * user_data) +{ + return draw_to_texture((lv_draw_sdl_unit_t *)user_data, cached_data); +} + +static void sdl_texture_cache_free_cb(cache_data_t * cached_data, void * user_data) +{ + LV_UNUSED(user_data); + + lv_free(cached_data->draw_dsc); + SDL_DestroyTexture(cached_data->texture); + cached_data->draw_dsc = NULL; + cached_data->texture = NULL; +} + +static lv_cache_compare_res_t sdl_texture_cache_compare_cb(const cache_data_t * lhs, const cache_data_t * rhs) +{ + if(lhs == rhs) return 0; + + if(lhs->w != rhs->w) { + return lhs->w > rhs->w ? 1 : -1; + } + if(lhs->h != rhs->h) { + return lhs->h > rhs->h ? 1 : -1; + } + + uint32_t lhs_dsc_size = lhs->draw_dsc->dsc_size; + uint32_t rhs_dsc_size = rhs->draw_dsc->dsc_size; + + if(lhs_dsc_size != rhs_dsc_size) { + return lhs_dsc_size > rhs_dsc_size ? 1 : -1; + } + + const uint8_t * left_draw_dsc = (const uint8_t *)lhs->draw_dsc; + const uint8_t * right_draw_dsc = (const uint8_t *)rhs->draw_dsc; + left_draw_dsc += sizeof(lv_draw_dsc_base_t); + right_draw_dsc += sizeof(lv_draw_dsc_base_t); + + int cmp_res = lv_memcmp(left_draw_dsc, right_draw_dsc, lhs->draw_dsc->dsc_size - sizeof(lv_draw_dsc_base_t)); + + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + +void lv_draw_sdl_init(void) +{ + lv_draw_sdl_unit_t * draw_sdl_unit = lv_draw_create_unit(sizeof(lv_draw_sdl_unit_t)); + draw_sdl_unit->base_unit.dispatch_cb = dispatch; + draw_sdl_unit->base_unit.evaluate_cb = evaluate; + draw_sdl_unit->base_unit.name = "SDL"; + draw_sdl_unit->texture_cache = lv_cache_create(&lv_cache_class_lru_rb_count, + sizeof(cache_data_t), 128, (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t)sdl_texture_cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)sdl_texture_cache_create_cb, + .free_cb = (lv_cache_free_cb_t)sdl_texture_cache_free_cb, + }); + lv_cache_set_name(draw_sdl_unit->texture_cache, "SDL_TEXTURE"); + + lv_draw_buf_init(&draw_sdl_unit->render_draw_buf, 0, 0, LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO, NULL, 0); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_sdl_unit_t * draw_sdl_unit = (lv_draw_sdl_unit_t *) draw_unit; + + /*Return immediately if it's busy with a draw task*/ + if(draw_sdl_unit->task_act) return 0; + + lv_draw_task_t * t = NULL; + t = lv_draw_get_available_task(layer, NULL, DRAW_UNIT_ID_SDL); + if(t == NULL) return -1; + + lv_display_t * disp = lv_refr_get_disp_refreshing(); + SDL_Texture * texture = layer_get_texture(layer); + if(layer != disp->layer_head && texture == NULL) { + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) return -1; + + SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); + int32_t w = lv_area_get_width(&layer->buf_area); + int32_t h = lv_area_get_height(&layer->buf_area); + layer->user_data = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_TARGET, w, h); + } + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_sdl_unit->task_act = t; + + execute_drawing(draw_sdl_unit); + + draw_sdl_unit->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + draw_sdl_unit->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + return 1; +} + +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + LV_UNUSED(draw_unit); + + if(task->type == LV_DRAW_TASK_TYPE_IMAGE && + ((lv_draw_image_dsc_t *)task->draw_dsc)->header.cf >= LV_COLOR_FORMAT_PROPRIETARY_START) { + return 0; + } + + /*If not refreshing the display probably it's a canvas rendering + *which his not support in SDL as it's not a texture.*/ + if(lv_refr_get_disp_refreshing() == NULL) return 0; + + if(((lv_draw_dsc_base_t *)task->draw_dsc)->user_data == NULL) { + task->preference_score = 0; + task->preferred_draw_unit_id = DRAW_UNIT_ID_SDL; + } + return 0; +} + +static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) +{ + lv_draw_task_t * task = u->task_act; + + lv_layer_t dest_layer; + lv_layer_init(&dest_layer); + + int32_t texture_w = lv_area_get_width(&task->_real_area); + int32_t texture_h = lv_area_get_height(&task->_real_area); + + if(!lv_draw_buf_reshape(&u->render_draw_buf, LV_COLOR_FORMAT_ARGB8888, texture_w, texture_h, LV_STRIDE_AUTO)) { + uint8_t * data = u->render_draw_buf.unaligned_data; + uint32_t data_size = LV_DRAW_BUF_SIZE(texture_w, texture_h, LV_COLOR_FORMAT_ARGB8888); + if(data == NULL) data = malloc(data_size); + else data = realloc(data, data_size); + + LV_ASSERT_MALLOC(data); + lv_result_t init_result = lv_draw_buf_init(&u->render_draw_buf, texture_w, texture_h, LV_COLOR_FORMAT_ARGB8888, + LV_STRIDE_AUTO, data, data_size); + LV_ASSERT(init_result == LV_RESULT_OK); + } + + + dest_layer.draw_buf = &u->render_draw_buf; + dest_layer.color_format = LV_COLOR_FORMAT_ARGB8888; + dest_layer.buf_area = task->_real_area; + dest_layer._clip_area = task->_real_area; + dest_layer.phy_clip_area = task->_real_area; + lv_memzero(u->render_draw_buf.data, lv_area_get_size(&task->_real_area) * 4); + + lv_display_t * disp = lv_refr_get_disp_refreshing(); + + lv_obj_t * obj = ((lv_draw_dsc_base_t *)task->draw_dsc)->obj; + bool original_send_draw_task_event = false; + if(obj) { + original_send_draw_task_event = lv_obj_has_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + } + + switch(task->type) { + case LV_DRAW_TASK_TYPE_FILL: { + lv_draw_fill_dsc_t * fill_dsc = task->draw_dsc; + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + rect_dsc.bg_color = fill_dsc->color; + rect_dsc.bg_grad = fill_dsc->grad; + rect_dsc.radius = fill_dsc->radius; + rect_dsc.bg_opa = fill_dsc->opa; + + lv_draw_rect(&dest_layer, &rect_dsc, &task->area); + } + break; + case LV_DRAW_TASK_TYPE_BORDER: { + lv_draw_border_dsc_t * border_dsc = task->draw_dsc; + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + rect_dsc.bg_opa = LV_OPA_TRANSP; + rect_dsc.radius = border_dsc->radius; + rect_dsc.border_color = border_dsc->color; + rect_dsc.border_opa = border_dsc->opa; + rect_dsc.border_side = border_dsc->side; + rect_dsc.border_width = border_dsc->width; + lv_draw_rect(&dest_layer, &rect_dsc, &task->area); + break; + } + case LV_DRAW_TASK_TYPE_BOX_SHADOW: { + lv_draw_box_shadow_dsc_t * box_shadow_dsc = task->draw_dsc; + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + rect_dsc.bg_opa = LV_OPA_0; + rect_dsc.radius = box_shadow_dsc->radius; + rect_dsc.bg_color = box_shadow_dsc->color; + rect_dsc.shadow_opa = box_shadow_dsc->opa; + rect_dsc.shadow_width = box_shadow_dsc->width; + rect_dsc.shadow_spread = box_shadow_dsc->spread; + rect_dsc.shadow_offset_x = box_shadow_dsc->ofs_x; + rect_dsc.shadow_offset_y = box_shadow_dsc->ofs_y; + lv_draw_rect(&dest_layer, &rect_dsc, &task->area); + break; + } + case LV_DRAW_TASK_TYPE_LABEL: { + lv_draw_label_dsc_t label_dsc; + lv_memcpy(&label_dsc, task->draw_dsc, sizeof(label_dsc)); + label_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_label(&dest_layer, &label_dsc, &task->area); + } + break; + case LV_DRAW_TASK_TYPE_ARC: { + lv_draw_arc_dsc_t arc_dsc; + lv_memcpy(&arc_dsc, task->draw_dsc, sizeof(arc_dsc)); + arc_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_arc(&dest_layer, &arc_dsc); + } + break; + case LV_DRAW_TASK_TYPE_LINE: { + lv_draw_line_dsc_t line_dsc; + lv_memcpy(&line_dsc, task->draw_dsc, sizeof(line_dsc)); + line_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_line(&dest_layer, &line_dsc); + } + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: { + lv_draw_triangle_dsc_t triangle_dsc; + lv_memcpy(&triangle_dsc, task->draw_dsc, sizeof(triangle_dsc)); + triangle_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_triangle(&dest_layer, &triangle_dsc); + } + break; + case LV_DRAW_TASK_TYPE_IMAGE: { + lv_draw_image_dsc_t image_dsc; + lv_memcpy(&image_dsc, task->draw_dsc, sizeof(image_dsc)); + image_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_image(&dest_layer, &image_dsc, &task->area); + break; + } + default: + return false; + } + + while(dest_layer.draw_task_head) { + lv_draw_dispatch_layer(disp, &dest_layer); + if(dest_layer.draw_task_head) { + lv_draw_dispatch_wait_for_request(); + } + } + + SDL_Texture * texture = SDL_CreateTexture(lv_sdl_window_get_renderer(disp), SDL_PIXELFORMAT_ARGB8888, + SDL_TEXTUREACCESS_STATIC, texture_w, texture_h); + SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); + SDL_UpdateTexture(texture, NULL, u->render_draw_buf.data, texture_w * 4); + + lv_draw_dsc_base_t * base_dsc = task->draw_dsc; + + cache_data->draw_dsc = lv_malloc(base_dsc->dsc_size); + lv_memcpy((void *)cache_data->draw_dsc, base_dsc, base_dsc->dsc_size); + cache_data->w = texture_w; + cache_data->h = texture_h; + cache_data->texture = texture; + + if(obj) { + lv_obj_set_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS, original_send_draw_task_event); + } + + return true; +} + +static void blend_texture_layer(lv_draw_task_t * t) +{ + lv_display_t * disp = lv_refr_get_disp_refreshing(); + SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); + + SDL_Rect clip_rect; + clip_rect.x = t->clip_area.x1; + clip_rect.y = t->clip_area.y1; + clip_rect.w = lv_area_get_width(&t->clip_area); + clip_rect.h = lv_area_get_height(&t->clip_area); + + lv_draw_image_dsc_t * draw_dsc = t->draw_dsc; + SDL_Rect rect; + rect.w = (lv_area_get_width(&t->area) * draw_dsc->scale_x) / 256; + rect.h = (lv_area_get_height(&t->area) * draw_dsc->scale_y) / 256; + + rect.x = -draw_dsc->pivot.x; + rect.y = -draw_dsc->pivot.y; + rect.x = (rect.x * draw_dsc->scale_x) / 256; + rect.y = (rect.y * draw_dsc->scale_y) / 256; + rect.x += t->area.x1 + draw_dsc->pivot.x; + rect.y += t->area.y1 + draw_dsc->pivot.y; + + lv_layer_t * src_layer = (lv_layer_t *)draw_dsc->src; + SDL_Texture * src_texture = layer_get_texture(src_layer); + + SDL_SetTextureAlphaMod(src_texture, draw_dsc->opa); + SDL_SetTextureBlendMode(src_texture, SDL_BLENDMODE_BLEND); + SDL_SetRenderTarget(renderer, layer_get_texture(t->target_layer)); + SDL_RenderSetClipRect(renderer, &clip_rect); + + SDL_Point center = {draw_dsc->pivot.x, draw_dsc->pivot.y}; + SDL_RenderCopyEx(renderer, src_texture, NULL, &rect, draw_dsc->rotation / 10, ¢er, SDL_FLIP_NONE); + + SDL_DestroyTexture(src_texture); + SDL_RenderSetClipRect(renderer, NULL); +} + +static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + + cache_data_t data_to_find; + data_to_find.draw_dsc = (lv_draw_dsc_base_t *)t->draw_dsc; + + data_to_find.w = lv_area_get_width(&t->_real_area); + data_to_find.h = lv_area_get_height(&t->_real_area); + data_to_find.texture = NULL; + + /*user_data stores the renderer to differentiate it from SW rendered tasks. + *However the cached texture is independent from the renderer so use NULL user_data*/ + void * user_data_saved = data_to_find.draw_dsc->user_data; + data_to_find.draw_dsc->user_data = NULL; + + /*Absolute coordinates are different for the same draw_dsc on a different position. + *So make everything relative to 0;0 before caching*/ + lv_area_t a = t->area; + if(t->type == LV_DRAW_TASK_TYPE_IMAGE) { + lv_draw_image_dsc_t * img_dsc = (lv_draw_image_dsc_t *)data_to_find.draw_dsc; + lv_area_move(&img_dsc->image_area, -t->area.x1, -t->area.y1); + } + else if(t->type == LV_DRAW_TASK_TYPE_TRIANGLE) { + lv_draw_triangle_dsc_t * tri_dsc = (lv_draw_triangle_dsc_t *)data_to_find.draw_dsc; + tri_dsc->p[0].x -= t->area.x1; + tri_dsc->p[0].y -= t->area.y1; + tri_dsc->p[1].x -= t->area.x1; + tri_dsc->p[1].y -= t->area.y1; + tri_dsc->p[2].x -= t->area.x1; + tri_dsc->p[2].y -= t->area.y1; + } + else if(t->type == LV_DRAW_TASK_TYPE_LINE) { + lv_draw_line_dsc_t * line_dsc = (lv_draw_line_dsc_t *)data_to_find.draw_dsc; + line_dsc->p1.x -= t->area.x1; + line_dsc->p1.y -= t->area.y1; + line_dsc->p2.x -= t->area.x1; + line_dsc->p2.y -= t->area.y1; + } + else if(t->type == LV_DRAW_TASK_TYPE_ARC) { + lv_draw_arc_dsc_t * arc_dsc = (lv_draw_arc_dsc_t *)data_to_find.draw_dsc; + arc_dsc->center.x -= t->area.x1; + arc_dsc->center.y -= t->area.y1; + } + + lv_area_move(&t->area, -a.x1, -a.y1); + lv_area_move(&t->_real_area, -a.x1, -a.y1); + + lv_cache_entry_t * entry_cached = lv_cache_acquire_or_create(u->texture_cache, &data_to_find, u); + + lv_area_move(&t->area, a.x1, a.y1); + lv_area_move(&t->_real_area, a.x1, a.y1); + + if(!entry_cached) { + return; + } + + data_to_find.draw_dsc->user_data = user_data_saved; + + cache_data_t * data_cached = lv_cache_entry_get_data(entry_cached); + SDL_Texture * texture = data_cached->texture; + lv_display_t * disp = lv_refr_get_disp_refreshing(); + SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); + + lv_layer_t * dest_layer = t->target_layer; + SDL_Rect clip_rect; + clip_rect.x = t->clip_area.x1 - dest_layer->buf_area.x1; + clip_rect.y = t->clip_area.y1 - dest_layer->buf_area.y1; + clip_rect.w = lv_area_get_width(&t->clip_area); + clip_rect.h = lv_area_get_height(&t->clip_area); + + SDL_Rect rect; + + SDL_SetRenderTarget(renderer, layer_get_texture(dest_layer)); + + rect.x = t->_real_area.x1 - dest_layer->buf_area.x1; + rect.y = t->_real_area.y1 - dest_layer->buf_area.y1; + rect.w = data_cached->w; + rect.h = data_cached->h; + + SDL_RenderSetClipRect(renderer, &clip_rect); + SDL_RenderCopy(renderer, texture, NULL, &rect); + + SDL_RenderSetClipRect(renderer, NULL); + + lv_cache_release(u->texture_cache, entry_cached, u); + + /*Do not cache non static (const) texts as the text's pointer can be freed/reallocated + *at any time resulting in a wild pointer in the cached draw dsc. */ + if(t->type == LV_DRAW_TASK_TYPE_LABEL) { + lv_draw_label_dsc_t * label_dsc = t->draw_dsc; + if(!label_dsc->text_static) { + lv_cache_drop(u->texture_cache, &data_to_find, NULL); + } + } + /*Do not cache lines rendered from points at dsc->points will be freed*/ + else if(t->type == LV_DRAW_TASK_TYPE_LINE) { + lv_draw_line_dsc_t * line_dsc = t->draw_dsc; + if(line_dsc->points) { + lv_cache_drop(u->texture_cache, &data_to_find, u); + } + } +} + +static void execute_drawing(lv_draw_sdl_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + + if(t->type == LV_DRAW_TASK_TYPE_FILL) { + lv_draw_fill_dsc_t * fill_dsc = t->draw_dsc; + if(fill_dsc->radius == 0 && fill_dsc->grad.dir == LV_GRAD_DIR_NONE) { + SDL_Rect rect; + lv_layer_t * layer = t->target_layer; + lv_area_t fill_area; + lv_area_intersect(&fill_area, &t->area, &t->clip_area); + + rect.x = fill_area.x1 - layer->buf_area.x1; + rect.y = fill_area.y1 - layer->buf_area.y1; + rect.w = lv_area_get_width(&fill_area); + rect.h = lv_area_get_height(&fill_area); + lv_display_t * disp = lv_refr_get_disp_refreshing(); + SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(renderer, fill_dsc->color.red, fill_dsc->color.green, fill_dsc->color.blue, fill_dsc->opa); + SDL_RenderSetClipRect(renderer, NULL); + SDL_RenderFillRect(renderer, &rect); + return; + } + } + + if(t->type == LV_DRAW_TASK_TYPE_LAYER) { + blend_texture_layer(t); + return; + } + + draw_from_cached_texture(u); +} + +static SDL_Texture * layer_get_texture(lv_layer_t * layer) +{ + return layer->user_data; +} + +#endif /*LV_USE_DRAW_SDL*/ diff --git a/inc/lvgl/src/draw/sdl/lv_draw_sdl.h b/inc/lvgl/src/draw/sdl/lv_draw_sdl.h new file mode 100644 index 0000000..90ff8de --- /dev/null +++ b/inc/lvgl/src/draw/sdl/lv_draw_sdl.h @@ -0,0 +1,80 @@ +/** + * @file lv_draw_sdl.h + * + */ + +#ifndef LV_DRAW_SDL_H +#define LV_DRAW_SDL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw.h" + +#if LV_USE_DRAW_SDL + +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../../display/lv_display.h" +#include "../../osal/lv_os_private.h" +#include "../../draw/lv_draw_label.h" +#include "../../draw/lv_draw_rect.h" +#include "../../draw/lv_draw_arc.h" +#include "../../draw/lv_draw_image.h" +#include "../../draw/lv_draw_triangle.h" +#include "../../draw/lv_draw_line.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_sdl_init(void); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sdl_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_sdl_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_sdl_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_sdl_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_sdl_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_sdl_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sdl_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc); + +void lv_draw_sdl_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords); + +void lv_draw_sdl_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle_dsc_t * dsc); + +void lv_draw_sdl_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SDL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SDL_H*/ diff --git a/inc/lvgl/src/draw/snapshot/lv_snapshot.c b/inc/lvgl/src/draw/snapshot/lv_snapshot.c new file mode 100644 index 0000000..9a285c3 --- /dev/null +++ b/inc/lvgl/src/draw/snapshot/lv_snapshot.c @@ -0,0 +1,229 @@ +/** + * @file lv_snapshot.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_draw_private.h" +#include "lv_snapshot.h" +#if LV_USE_SNAPSHOT + +#include +#include "../../display/lv_display.h" +#include "../../core/lv_refr_private.h" +#include "../../display/lv_display_private.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a draw buffer for object to store the snapshot image. + */ +lv_draw_buf_t * lv_snapshot_create_draw_buf(lv_obj_t * obj, lv_color_format_t cf) +{ + lv_obj_update_layout(obj); + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + int32_t ext_size = lv_obj_get_ext_draw_size(obj); + w += ext_size * 2; + h += ext_size * 2; + if(w == 0 || h == 0) return NULL; + + return lv_draw_buf_create(w, h, cf, LV_STRIDE_AUTO); +} + +lv_result_t lv_snapshot_reshape_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf) +{ + lv_obj_update_layout(obj); + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + int32_t ext_size = lv_obj_get_ext_draw_size(obj); + w += ext_size * 2; + h += ext_size * 2; + if(w == 0 || h == 0) return LV_RESULT_INVALID; + + draw_buf = lv_draw_buf_reshape(draw_buf, LV_COLOR_FORMAT_UNKNOWN, w, h, LV_STRIDE_AUTO); + return draw_buf == NULL ? LV_RESULT_INVALID : LV_RESULT_OK; +} + +lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, lv_draw_buf_t * draw_buf) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(draw_buf); + lv_result_t res; + + switch(cf) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_ARGB2222: + case LV_COLOR_FORMAT_ARGB4444: + case LV_COLOR_FORMAT_ARGB1555: + break; + default: + LV_LOG_WARN("Not supported color format"); + return LV_RESULT_INVALID; + } + + res = lv_snapshot_reshape_draw_buf(obj, draw_buf); + if(res != LV_RESULT_OK) return res; + + lv_area_t snapshot_area; + int32_t w = draw_buf->header.w; + int32_t h = draw_buf->header.h; + int32_t ext_size = lv_obj_get_ext_draw_size(obj); + lv_obj_get_coords(obj, &snapshot_area); + lv_area_increase(&snapshot_area, ext_size, ext_size); + + lv_obj_t * top_obj = lv_refr_get_top_obj(&snapshot_area, obj); + if(top_obj == NULL) { + /* Clear draw buffer when no top object*/ + lv_draw_buf_clear(draw_buf, NULL); + top_obj = obj; + } + + lv_layer_t layer; + lv_layer_init(&layer); + + layer.draw_buf = draw_buf; + layer.buf_area.x1 = snapshot_area.x1; + layer.buf_area.y1 = snapshot_area.y1; + layer.buf_area.x2 = snapshot_area.x1 + w - 1; + layer.buf_area.y2 = snapshot_area.y1 + h - 1; + layer.color_format = cf; + layer._clip_area = snapshot_area; + layer.phy_clip_area = snapshot_area; + + lv_draw_unit_send_event(NULL, LV_EVENT_CHILD_CREATED, &layer); + + lv_display_t * disp_old = lv_refr_get_disp_refreshing(); + lv_display_t * disp_new = lv_obj_get_display(obj); + lv_layer_t * layer_old = disp_new->layer_head; + disp_new->layer_head = &layer; + + lv_refr_set_disp_refreshing(disp_new); + + if(top_obj == obj) { + lv_obj_redraw(&layer, top_obj); + } + else { + lv_obj_refr(&layer, top_obj); + + lv_obj_t * parent = lv_obj_get_parent(top_obj); + lv_obj_t * border_p = top_obj; + + /*Do until not reach the screen*/ + while(parent != NULL && border_p != obj) { + bool go = false; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(parent); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = parent->spec_attr->children[i]; + if(!go) { + if(child == border_p) go = true; + } + else { + /*Refresh the objects*/ + lv_obj_refr(&layer, child); + } + } + + /*Call the post draw draw function of the parents of the to object*/ + lv_obj_send_event(parent, LV_EVENT_DRAW_POST_BEGIN, (void *)&layer); + lv_obj_send_event(parent, LV_EVENT_DRAW_POST, (void *)&layer); + lv_obj_send_event(parent, LV_EVENT_DRAW_POST_END, (void *)&layer); + + /*The new border will be the last parents, + *so the 'younger' brothers of parent will be refreshed*/ + border_p = parent; + /*Go a level deeper*/ + parent = lv_obj_get_parent(parent); + } + } + + layer.all_tasks_added = true; + + while(layer.draw_task_head) { + lv_draw_dispatch_wait_for_request(); + lv_draw_dispatch(); + } + + disp_new->layer_head = layer_old; + lv_refr_set_disp_refreshing(disp_old); + + lv_draw_unit_send_event(NULL, LV_EVENT_SCREEN_LOAD_START, &layer); + lv_draw_unit_send_event(NULL, LV_EVENT_CHILD_DELETED, &layer); + + return LV_RESULT_OK; +} + +lv_draw_buf_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf) +{ + LV_ASSERT_NULL(obj); + lv_draw_buf_t * draw_buf = lv_snapshot_create_draw_buf(obj, cf); + if(draw_buf == NULL) return NULL; + + if(lv_snapshot_take_to_draw_buf(obj, cf, draw_buf) != LV_RESULT_OK) { + lv_draw_buf_destroy(draw_buf); + return NULL; + } + + return draw_buf; +} + +void lv_snapshot_free(lv_image_dsc_t * dsc) +{ + LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy directly."); + lv_draw_buf_destroy((lv_draw_buf_t *)dsc); +} + +lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, + void * buf, + uint32_t buf_size) +{ + lv_draw_buf_t draw_buf; + LV_LOG_WARN("Deprecated API, use lv_snapshot_take_to_draw_buf instead."); + lv_draw_buf_init(&draw_buf, 1, 1, cf, buf_size, buf, buf_size); + lv_result_t res = lv_snapshot_take_to_draw_buf(obj, cf, &draw_buf); + if(res == LV_RESULT_OK) { + lv_memcpy((void *)dsc, &draw_buf, sizeof(lv_image_dsc_t)); + } + return res; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_SNAPSHOT*/ diff --git a/inc/lvgl/src/draw/snapshot/lv_snapshot.h b/inc/lvgl/src/draw/snapshot/lv_snapshot.h new file mode 100644 index 0000000..90de106 --- /dev/null +++ b/inc/lvgl/src/draw/snapshot/lv_snapshot.h @@ -0,0 +1,101 @@ +/** + * @file lv_snapshot.h + * + */ + +#ifndef LV_SNAPSHOT_H +#define LV_SNAPSHOT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_SNAPSHOT + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Take snapshot for object with its children, create the draw buffer as needed. + * @param obj the object to generate snapshot. + * @param cf color format for generated image. + * @return a pointer to an draw buffer containing snapshot image, or NULL if failed. + */ +lv_draw_buf_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf); + +/** + * Create a draw buffer to store the snapshot image for object. + * @param obj the object to generate snapshot. + * @param cf color format for generated image. + * @return a pointer to an draw buffer ready for taking snapshot, or NULL if failed. + */ +lv_draw_buf_t * lv_snapshot_create_draw_buf(lv_obj_t * obj, lv_color_format_t cf); + +/** + * Reshape the draw buffer to prepare for taking snapshot for obj. + * This is usually used to check if the existing draw buffer is enough for + * obj snapshot. If return LV_RESULT_INVALID, you should create a new one. + * @param draw_buf the draw buffer to reshape. + * @param obj the object to generate snapshot. + */ +lv_result_t lv_snapshot_reshape_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf); + +/** + * Take snapshot for object with its children, save image info to provided buffer. + * @param obj the object to generate snapshot. + * @param cf color format for new snapshot image. + * It could differ with cf of `draw_buf` as long as the new cf will fit in. + * @param draw_buf the draw buffer to store the image result. It's reshaped automatically. + * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error. + */ +lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, lv_draw_buf_t * draw_buf); + +/** + * @deprecated Use `lv_draw_buf_destroy` instead. + * + * Free the snapshot image returned by @ref lv_snapshot_take + * @param dsc the image descriptor generated by lv_snapshot_take. + */ +void lv_snapshot_free(lv_image_dsc_t * dsc); + +/** + * Take snapshot for object with its children, save image info to provided buffer. + * @param obj the object to generate snapshot. + * @param cf color format for generated image. + * @param dsc image descriptor to store the image result. + * @param buf the buffer to store image data. It must meet align requirement. + * @param buf_size provided buffer size in bytes. + * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error. + * @deprecated Use lv_snapshot_take_to_draw_buf instead. + */ +lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, + void * buf, + uint32_t buf_size); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_SNAPSHOT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/inc/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h b/inc/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h new file mode 100644 index 0000000..3fa4267 --- /dev/null +++ b/inc/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h @@ -0,0 +1,679 @@ +/** + * @file lv_draw_sw_arm2d.h + * + */ + +#ifndef LV_DRAW_SW_ARM2D_H +#define LV_DRAW_SW_ARM2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* *INDENT-OFF* */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" +#include "../../../misc/lv_area_private.h" +#include "../../../draw/lv_draw_private.h" +#include "../../../draw/lv_draw_image_private.h" + +#if LV_USE_DRAW_ARM2D_SYNC + +#define __ARM_2D_IMPL__ +#include "arm_2d.h" +#include "__arm_2d_impl.h" + +#if defined(__IS_COMPILER_ARM_COMPILER_5__) +#pragma diag_suppress 174,177,188,68,513,144,1296 +#elif defined(__IS_COMPILER_IAR__) +#pragma diag_suppress=Pa093 +#elif defined(__IS_COMPILER_GCC__) +#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" +#endif + +/********************* + * DEFINES + *********************/ +#ifndef LV_DRAW_SW_RGB565_SWAP + #define LV_DRAW_SW_RGB565_SWAP(__buf_ptr, __buf_size_px) \ + lv_draw_sw_rgb565_swap_helium((__buf_ptr), (__buf_size_px)) +#endif + +#ifndef LV_DRAW_SW_IMAGE + #define LV_DRAW_SW_IMAGE(__transformed, \ + __cf, \ + __src_buf, \ + __img_coords, \ + __src_stride, \ + __blend_area, \ + __draw_task, \ + __draw_dsc) \ + lv_draw_sw_image_helium( (__transformed), \ + (__cf), \ + (uint8_t *)(__src_buf), \ + (__img_coords), \ + (__src_stride), \ + (__blend_area), \ + (__draw_task), \ + (__draw_dsc)) +#endif + +#ifndef LV_DRAW_SW_RGB565_RECOLOR + #define LV_DRAW_SW_RGB565_RECOLOR(__src_buf, __blend_area, __color, __opa) \ + lv_draw_sw_image_recolor_rgb565( (__src_buf), \ + &(__blend_area), \ + (__color), \ + (__opa)) +#endif + +#ifndef LV_DRAW_SW_RGB888_RECOLOR + #define LV_DRAW_SW_RGB888_RECOLOR( __src_buf, \ + __blend_area, \ + __color, \ + __opa, \ + __cf) \ + lv_draw_sw_image_recolor_rgb888( (__src_buf), \ + &(__blend_area), \ + (__color), \ + (__opa), \ + (__cf)) +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +extern void arm_2d_helper_swap_rgb16(uint16_t * phwBuffer, uint32_t wCount); + +/********************** + * MACROS + **********************/ + +#define __RECOLOUR_BEGIN() \ + do { \ + lv_color_t *rgb_tmp_buf = NULL; \ + if(draw_dsc->recolor_opa > LV_OPA_MIN) { \ + if(LV_COLOR_FORMAT_RGB565 == des_cf) { \ + rgb_tmp_buf \ + = lv_malloc(src_w * src_h * sizeof(uint16_t)); \ + if (NULL == rgb_tmp_buf) { \ + LV_LOG_WARN( \ + "Failed to allocate memory for accelerating recolor, " \ + "use normal route instead."); \ + break; \ + } \ + lv_memcpy( rgb_tmp_buf, \ + src_buf, \ + src_w * src_h * sizeof(uint16_t)); \ + arm_2d_size_t copy_size = { \ + .iWidth = src_w, \ + .iHeight = src_h, \ + }; \ + /* apply re-color */ \ + __arm_2d_impl_rgb565_colour_filling_with_opacity( \ + (uint16_t *)rgb_tmp_buf, \ + src_w, \ + ©_size, \ + lv_color_to_u16(draw_dsc->recolor), \ + draw_dsc->recolor_opa); \ + \ + /* replace src_buf for the following operation */ \ + src_buf = (const uint8_t *)rgb_tmp_buf; \ + } \ + else if(LV_COLOR_FORMAT_XRGB8888 == des_cf) { \ + rgb_tmp_buf \ + = lv_malloc(src_w * src_h * sizeof(uint32_t)); \ + if (NULL == rgb_tmp_buf) { \ + LV_LOG_WARN( \ + "Failed to allocate memory for accelerating recolor, " \ + "use normal route instead."); \ + break; \ + } \ + lv_memcpy( rgb_tmp_buf, \ + src_buf, \ + src_w * src_h * sizeof(uint32_t)); \ + arm_2d_size_t copy_size = { \ + .iWidth = src_w, \ + .iHeight = src_h, \ + }; \ + /* apply re-color */ \ + __arm_2d_impl_cccn888_colour_filling_with_opacity( \ + (uint32_t *)rgb_tmp_buf, \ + src_w, \ + ©_size, \ + lv_color_to_u32(draw_dsc->recolor), \ + draw_dsc->recolor_opa); \ + \ + /* replace src_buf for the following operation */ \ + src_buf = (const uint8_t *)rgb_tmp_buf; \ + } \ + } \ + do { + +#define __RECOLOUR_END() \ + } while(0); \ + if (NULL != rgb_tmp_buf) { \ + lv_free(rgb_tmp_buf); \ + } \ + } while(0); + +static inline lv_result_t lv_draw_sw_rgb565_swap_helium(void * buf, uint32_t buf_size_px) +{ + arm_2d_helper_swap_rgb16((uint16_t *)buf, buf_size_px); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_draw_sw_image_helium( + bool is_transform, + lv_color_format_t src_cf, + const uint8_t *src_buf, + const lv_area_t * coords, + int32_t src_stride, + const lv_area_t * des_area, + lv_draw_task_t * t, + const lv_draw_image_dsc_t * draw_dsc) +{ + lv_result_t result = LV_RESULT_INVALID; + lv_layer_t * layer = t->target_layer; + lv_color_format_t des_cf = layer->color_format; + static bool arm_2d_initialized = false; + + if (!arm_2d_initialized) { + arm_2d_initialized = true; + arm_2d_init(); + } + + do { + if (!is_transform) { + break; + } + #if ARM_2D_VERSION < 10202ul + if(draw_dsc->scale_x != draw_dsc->scale_y) { + break; + } + #endif + /* filter the unsupported colour format combination */ + if((LV_COLOR_FORMAT_RGB565 == des_cf) + && !( (LV_COLOR_FORMAT_RGB565 == src_cf) + || (LV_COLOR_FORMAT_RGB565A8 == src_cf) + #if __ARM_2D_CFG_SUPPORT_CCCA8888_IMPLICIT_CONVERSION__ && ARM_2D_VERSION > 10201ul + || (LV_COLOR_FORMAT_ARGB8888 == src_cf) + || (LV_COLOR_FORMAT_XRGB8888 == src_cf) + #endif + || (LV_COLOR_FORMAT_A8 == src_cf))) { + break; + } + #if ARM_2D_VERSION > 10201ul + if((LV_COLOR_FORMAT_XRGB8888 == des_cf) + && !( (LV_COLOR_FORMAT_ARGB8888 == src_cf) + || (LV_COLOR_FORMAT_XRGB8888 == src_cf) + || (LV_COLOR_FORMAT_A8 == src_cf))) { + break; + } + #else + if((LV_COLOR_FORMAT_XRGB8888 == des_cf) + || (LV_COLOR_FORMAT_RGB888 == des_cf) + || (LV_COLOR_FORMAT_ARGB8888 == des_cf)) { + break; + } + #endif + + /* ------------- prepare parameters for arm-2d APIs - BEGIN --------- */ + + lv_area_t blend_area; + if(!lv_area_intersect(&blend_area, des_area, &t->clip_area)) { + break; + } + + int32_t src_w = lv_area_get_width(coords); + int32_t src_h = lv_area_get_height(coords); + + arm_2d_size_t src_size = { + .iWidth = (int16_t)src_w, + .iHeight = (int16_t)src_h, + }; + +// arm_2d_size_t des_size; + +// do{ +// int32_t des_w = lv_area_get_width(&blend_area); +// int32_t des_h = lv_area_get_height(&blend_area); + +// LV_ASSERT(des_w <= INT16_MAX); +// LV_ASSERT(des_h <= INT16_MAX); + +// des_size.iWidth = (int16_t)des_w; +// des_size.iHeight = (int16_t)des_h; +// } while(0); +// +// arm_2d_size_t copy_size = { +// .iWidth = MIN(des_size.iWidth, src_size.iWidth), +// .iHeight = MIN(des_size.iHeight, src_size.iHeight), +// }; +// +// int32_t des_stride = lv_draw_buf_width_to_stride( +// lv_area_get_width(&layer->buf_area), +// des_cf); +// uint8_t *des_buf_moved = (uint8_t *)lv_draw_layer_go_to_xy( +// layer, +// blend_area.x1 - layer->buf_area.x1, +// blend_area.y1 - layer->buf_area.y1); + uint8_t *des_buf = (uint8_t *)lv_draw_layer_go_to_xy(layer, 0, 0); + uint8_t opa = draw_dsc->opa; + + /* ------------- prepare parameters for arm-2d APIs - END ----------- */ + __RECOLOUR_BEGIN() + + static arm_2d_tile_t target_tile_origin; + static arm_2d_tile_t target_tile; + arm_2d_region_t clip_region; + static arm_2d_region_t target_region; + + target_region = (arm_2d_region_t) { + .tLocation = { + .iX = (int16_t)(coords->x1 - t->clip_area.x1), + .iY = (int16_t)(coords->y1 - t->clip_area.y1), + }, + .tSize = src_size, + }; + + target_tile_origin = (arm_2d_tile_t) { + .tRegion = { + .tSize = { + .iWidth = (int16_t)lv_area_get_width(&layer->buf_area), + .iHeight = (int16_t)lv_area_get_height(&layer->buf_area), + }, + }, + .tInfo = { + .bIsRoot = true, + }, + .phwBuffer = (uint16_t *)des_buf, + }; + + clip_region = (arm_2d_region_t) { + .tLocation = { + .iX = (int16_t)(t->clip_area.x1 - layer->buf_area.x1), + .iY = (int16_t)(t->clip_area.y1 - layer->buf_area.y1), + }, + .tSize = { + .iWidth = (int16_t)lv_area_get_width(&t->clip_area), + .iHeight = (int16_t)lv_area_get_height(&t->clip_area), + }, + }; + + arm_2d_tile_generate_child(&target_tile_origin, + &clip_region, + &target_tile, + false); + + static arm_2d_tile_t source_tile; + + source_tile = (arm_2d_tile_t) { + .tRegion = { + .tSize = { + .iWidth = (int16_t)src_w, + .iHeight = (int16_t)src_h, + }, + }, + .tInfo = { + .bIsRoot = true, + }, + .pchBuffer = (uint8_t *)src_buf, + }; + + #if ARM_2D_VERSION > 10201ul + static const bool bIsNewFrame = true; + arm_2d_point_float_t source_center, target_center; + source_center.fX = draw_dsc->pivot.x; + source_center.fY = draw_dsc->pivot.y; + target_center.fX = target_region.tLocation.iX + draw_dsc->pivot.x; + target_center.fY = target_region.tLocation.iY + draw_dsc->pivot.y; + #else + static arm_2d_location_t source_center, target_center; + source_center.iX = draw_dsc->pivot.x; + source_center.iY = draw_dsc->pivot.y; + target_center = target_region.tLocation; + target_center.iX += draw_dsc->pivot.x; + target_center.iY += draw_dsc->pivot.y; + #endif + if(LV_COLOR_FORMAT_A8 == src_cf) { + + source_tile.tInfo.bHasEnforcedColour = true; + source_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_GRAY8; + + if(LV_COLOR_FORMAT_RGB565 == des_cf) { + + #if ARM_2D_VERSION > 10201ul + arm_2dp_rgb565_fill_colour_with_mask_opacity_and_transform_xy( + NULL, + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + draw_dsc->scale_y / 256.0f, + lv_color_to_u16(draw_dsc->recolor), + opa, + &target_center + ); + #else + arm_2d_rgb565_fill_colour_with_mask_opacity_and_transform( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + lv_color_to_u16(draw_dsc->recolor), + opa, + &target_center + ); + #endif + } + else if(LV_COLOR_FORMAT_XRGB8888 == des_cf) { + #if ARM_2D_VERSION > 10201ul + + arm_2dp_cccn888_fill_colour_with_mask_opacity_and_transform_xy( + NULL, + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + draw_dsc->scale_y / 256.0f, + lv_color_to_int(draw_dsc->recolor), + opa, + &target_center + ); + + #else + arm_2d_cccn888_fill_colour_with_mask_opacity_and_transform( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + lv_color_to_int(draw_dsc->recolor), + opa, + &target_center + ); + #endif + } + else { + break; + } + + } + else if(LV_COLOR_FORMAT_RGB565A8 == src_cf) { + LV_ASSERT(LV_COLOR_FORMAT_RGB565 == des_cf); + + /* mask_buf = src_buf + src_stride * src_w / header->w * src_h; */ + const uint8_t *mask_buf = src_buf + src_stride * src_h; + int32_t mask_stride = src_stride / 2; + + static arm_2d_tile_t mask_tile; + mask_tile = source_tile; + + mask_tile.tInfo.bHasEnforcedColour = true; + mask_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_GRAY8; + mask_tile.pchBuffer = (uint8_t *)mask_buf; + + #if ARM_2D_VERSION > 10201ul + + arm_2dp_rgb565_tile_transform_xy_with_src_mask_and_opacity( + NULL, + &source_tile, + &mask_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + draw_dsc->scale_y / 256.0f, + opa, + &target_center + ); + + #else + if(opa >= LV_OPA_MAX) { + arm_2d_rgb565_tile_transform_with_src_mask( + &source_tile, + &mask_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + &target_center + ); + } + else { + arm_2d_rgb565_tile_transform_with_src_mask_and_opacity( + &source_tile, + &mask_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + opa, + &target_center + ); + } + #endif + } + else if(LV_COLOR_FORMAT_RGB565 == src_cf) { + LV_ASSERT(LV_COLOR_FORMAT_RGB565 == des_cf); + + #if ARM_2D_VERSION > 10201ul + + arm_2dp_rgb565_tile_transform_xy_only_with_opacity( + NULL, + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + draw_dsc->scale_y / 256.0f, + opa, + &target_center + ); + + #else + if(opa >= LV_OPA_MAX) { + #if ARM_2D_VERSION >= 10106 + arm_2d_rgb565_tile_transform_only( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + &target_center); + #else + + arm_2dp_rgb565_tile_transform_only_prepare( + NULL, + &source_tile, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + (float)(draw_dsc->scale_x / 256.0f)); + + arm_2dp_tile_transform(NULL, + &target_tile, + NULL, + &target_center); + #endif + } + else { + arm_2d_rgb565_tile_transform_only_with_opacity( + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + opa, + &target_center + ); + } + #endif + } + #if ARM_2D_VERSION > 10201ul + else if(LV_COLOR_FORMAT_ARGB8888 == src_cf) { + if (LV_COLOR_FORMAT_XRGB8888 == des_cf) { + source_tile.tInfo.bHasEnforcedColour = true; + source_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_CCCA8888; + + arm_2dp_cccn888_tile_transform_xy_only_with_opacity( + NULL, + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + draw_dsc->scale_y / 256.0f, + opa, + &target_center + ); + } + else if(LV_COLOR_FORMAT_RGB565 == des_cf) { + source_tile.tInfo.bHasEnforcedColour = true; + source_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_CCCA8888; + + arm_2dp_rgb565_tile_transform_xy_only_with_opacity( + NULL, + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + draw_dsc->scale_y / 256.0f, + opa, + &target_center + ); + } + } + else if(LV_COLOR_FORMAT_XRGB8888 == src_cf) { + if(LV_COLOR_FORMAT_XRGB8888 == des_cf) { + arm_2dp_cccn888_tile_transform_xy_only_with_opacity( + NULL, + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + draw_dsc->scale_y / 256.0f, + opa, + &target_center + ); + } + else if(LV_COLOR_FORMAT_RGB565 == des_cf) { + + source_tile.tInfo.bHasEnforcedColour = true; + source_tile.tInfo.tColourInfo.chScheme = ARM_2D_COLOUR_CCCA8888; + + arm_2dp_rgb565_tile_transform_xy_only_with_opacity( + NULL, + &source_tile, + &target_tile, + NULL, + source_center, + ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)), + draw_dsc->scale_x / 256.0f, + draw_dsc->scale_y / 256.0f, + opa, + &target_center + ); + + } + #endif + } + else { + break; + } + + result = LV_RESULT_OK; + + __RECOLOUR_END() + } while(0); + + return result; +} + +static inline lv_result_t lv_draw_sw_image_recolor_rgb565( + const uint8_t *src_buf, + const lv_area_t * blend_area, + lv_color_t color, + lv_opa_t opa) +{ + int32_t src_w = lv_area_get_width(blend_area); + int32_t src_h = lv_area_get_height(blend_area); + + arm_2d_size_t copy_size = { + .iWidth = (int16_t)src_w, + .iHeight = (int16_t)src_h, + }; + + __arm_2d_impl_rgb565_colour_filling_with_opacity( + (uint16_t *)src_buf, + src_w, + ©_size, + lv_color_to_u16(color), + opa); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_draw_sw_image_recolor_rgb888( + const uint8_t *src_buf, + const lv_area_t * blend_area, + lv_color_t color, + lv_opa_t opa, + lv_color_format_t src_cf) +{ + if(LV_COLOR_FORMAT_XRGB8888 != src_cf) { + return LV_RESULT_INVALID; + } + + int32_t src_w = lv_area_get_width(blend_area); + int32_t src_h = lv_area_get_height(blend_area); + + arm_2d_size_t copy_size = { + .iWidth = (int16_t)src_w, + .iHeight = (int16_t)src_h, + }; + + __arm_2d_impl_cccn888_colour_filling_with_opacity( + (uint32_t *)src_buf, + src_w, + ©_size, + lv_color_to_u32(color), + opa); + + return LV_RESULT_OK; +} + +#endif /* LV_USE_DRAW_ARM2D_SYNC */ + +/* *INDENT-ON* */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_ARM2D_H */ diff --git a/inc/lvgl/src/draw/sw/arm2d/lv_draw_sw_helium.h b/inc/lvgl/src/draw/sw/arm2d/lv_draw_sw_helium.h new file mode 100644 index 0000000..c35a06e --- /dev/null +++ b/inc/lvgl/src/draw/sw/arm2d/lv_draw_sw_helium.h @@ -0,0 +1,60 @@ +/** + * @file lv_draw_sw_helium.h + * + */ + +#ifndef LV_DRAW_SW_HELIUM_H +#define LV_DRAW_SW_HELIUM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* *INDENT-OFF* */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +/* detect whether helium is available based on arm compilers' standard */ +#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE + +#ifdef LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE +#include LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************* + * POST INCLUDES + *********************/ +/* use arm-2d as the default helium acceleration */ +#include "lv_draw_sw_arm2d.h" + +#endif /* defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_HELIUM_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h b/inc/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h new file mode 100644 index 0000000..0eb29b8 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h @@ -0,0 +1,937 @@ +/** + * @file lv_blend_arm2d.h + * + */ + +#ifndef LV_BLEND_ARM2D_H +#define LV_BLEND_ARM2D_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../../lv_conf_internal.h" + +#if LV_USE_DRAW_ARM2D_SYNC + +#define __ARM_2D_IMPL__ +#include "arm_2d.h" +#include "__arm_2d_impl.h" + +#if defined(__IS_COMPILER_ARM_COMPILER_5__) +#pragma diag_suppress 174,177,188,68,513,144,1296 +#elif defined(__IS_COMPILER_IAR__) +#pragma diag_suppress=Pa093 +#elif defined(__IS_COMPILER_GCC__) +#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" +#endif + + +#if ARM_2D_VERSION < 10106ul +#error Please upgrade to Arm-2D v1.1.6 or above +#endif + +#ifndef LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF +#define LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF 1 +#endif + +/********************* + * DEFINES + *********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ + lv_color_blend_to_rgb565_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ + lv_color_blend_to_rgb565_with_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ + lv_color_blend_to_rgb565_with_mask_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ + lv_color_blend_to_rgb565_mix_mask_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ + lv_rgb565_blend_normal_to_rgb565_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_rgb565_arm2d(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ + lv_argb8888_blend_normal_to_rgb565_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ + lv_color_blend_to_rgb888_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + lv_color_blend_to_rgb888_with_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + lv_color_blend_to_rgb888_with_mask_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + lv_color_blend_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + lv_rgb565_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ + lv_rgb888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ + lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ + lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ + lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + lv_argb8888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size) +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline lv_result_t lv_color_blend_to_rgb565_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); + __arm_2d_impl_rgb16_colour_filling((uint16_t *)dsc->dest_buf, + stride, + &draw_size, + lv_color_to_u16(dsc->color)); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_color_blend_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); + __arm_2d_impl_rgb565_colour_filling_with_opacity((uint16_t *)dsc->dest_buf, + stride, + &draw_size, + lv_color_to_u16(dsc->color), + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_color_blend_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); + __arm_2d_impl_rgb565_colour_filling_mask((uint16_t *)dsc->dest_buf, + stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + lv_color_to_u16(dsc->color)); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_color_blend_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint16_t); + __arm_2d_impl_rgb565_colour_filling_mask_opacity((uint16_t *)dsc->dest_buf, + stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + lv_color_to_u16(dsc->color), + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) +{ + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + __arm_2d_impl_rgb16_copy((uint16_t *)dsc->src_buf, + src_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + __arm_2d_impl_rgb565_tile_copy_opacity((uint16_t *)dsc->src_buf, + src_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + __arm_2d_impl_rgb565_src_msk_copy((uint16_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + __arm_2d_impl_rgb565_tile_copy_with_src_mask_and_opacity((uint16_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + if(src_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + if(src_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + +#if !LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_rgb565_tile_copy_opacity(tmp_buf, + des_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); +#else + __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_opacity((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); +#endif + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + if(src_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + +#if !LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_rgb565_src_msk_copy(tmp_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); +#else + __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_src_mask((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); +#endif + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + if(src_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + uint16_t * tmp_buf = (uint16_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + +#if !LV_ARM2D_XRGB888_ALPHA_ALWAYS_FF + __arm_2d_impl_cccn888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_rgb565_tile_copy_with_src_mask_and_opacity(tmp_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); +#else + __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_src_mask_and_opacity((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); +#endif + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_ccca8888_to_rgb565((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_opacity((uint32_t *)dsc->src_buf, + src_stride, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_src_mask((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc) +{ + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint16_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_ccca8888_tile_copy_to_rgb565_with_src_mask_and_opacity((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint16_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_color_blend_to_rgb888_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) +{ + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); + __arm_2d_impl_rgb32_colour_filling((uint32_t *)dsc->dest_buf, + stride, + &draw_size, + lv_color_to_u32(dsc->color)); + return LV_RESULT_OK; + +} + +static inline lv_result_t lv_color_blend_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); + __arm_2d_impl_cccn888_colour_filling_with_opacity((uint32_t *)dsc->dest_buf, + stride, + &draw_size, + lv_color_to_u32(dsc->color), + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_color_blend_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); + __arm_2d_impl_cccn888_colour_filling_mask((uint32_t *)dsc->dest_buf, + stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + lv_color_to_u32(dsc->color)); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_color_blend_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t stride = (dsc->dest_stride) / sizeof(uint32_t); + __arm_2d_impl_cccn888_colour_filling_mask_opacity((uint32_t *)dsc->dest_buf, + stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + lv_color_to_u32(dsc->color), + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, + src_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; + +} + +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + uint32_t * tmp_buf = (uint32_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + /* get rgb565 */ + __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, + src_stride, + (uint32_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_cccn888_tile_copy_opacity(tmp_buf, + des_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + uint32_t * tmp_buf = (uint32_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, + src_stride, + (uint32_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_cccn888_src_msk_copy(tmp_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint16_t); + + uint32_t * tmp_buf = (uint32_t *)lv_malloc(dsc->dest_stride * dsc->dest_h); + if(NULL == tmp_buf) { + return LV_RESULT_INVALID; + } + + __arm_2d_impl_rgb565_to_cccn888((uint16_t *)dsc->src_buf, + src_stride, + (uint32_t *)tmp_buf, + des_stride, + &draw_size); + + __arm_2d_impl_cccn888_tile_copy_with_src_mask_and_opacity(tmp_buf, + des_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + lv_free(tmp_buf); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, + uint32_t src_px_size) +{ + if((dst_px_size == 3) || (src_px_size == 3)) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_rgb32_copy((uint32_t *)dsc->src_buf, + src_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + if((dst_px_size == 3) || (src_px_size == 3)) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_cccn888_tile_copy_opacity((uint32_t *)dsc->src_buf, + src_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + if((dst_px_size == 3) || (src_px_size == 3)) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_cccn888_src_msk_copy((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + if((dst_px_size == 3) || (src_px_size == 3)) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_cccn888_tile_copy_with_src_mask_and_opacity((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_ccca8888_to_cccn888((uint32_t *)dsc->src_buf, + src_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_ccca8888_tile_copy_to_cccn888_with_opacity((uint32_t *)dsc->src_buf, + src_stride, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_ccca8888_tile_copy_to_cccn888_with_src_mask((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size); + + return LV_RESULT_OK; +} + +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + if(dst_px_size == 3) { + return LV_RESULT_INVALID; + } + + arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h}; + int16_t des_stride = dsc->dest_stride / sizeof(uint32_t); + int16_t src_stride = dsc->src_stride / sizeof(uint32_t); + + __arm_2d_impl_ccca8888_tile_copy_to_cccn888_with_src_mask_and_opacity((uint32_t *)dsc->src_buf, + src_stride, + (uint8_t *)dsc->mask_buf, + dsc->mask_stride, + &draw_size, + (uint32_t *)dsc->dest_buf, + des_stride, + &draw_size, + dsc->opa); + + return LV_RESULT_OK; +} + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_ARM2D_SYNC */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BLEND_ARM2D_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/helium/lv_blend_helium.S b/inc/lvgl/src/draw/sw/blend/helium/lv_blend_helium.S new file mode 100644 index 0000000..971680e --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/helium/lv_blend_helium.S @@ -0,0 +1,713 @@ +/** + * @file lv_blend_helium.S + * + */ + +#ifndef __ASSEMBLY__ +#define __ASSEMBLY__ +#endif + +#if defined(_RTE_) +#include "Pre_Include_Global.h" +#include "RTE_Components.h" +#endif + +#include "../../../../lv_conf_internal.h" + +/*GCC Workaround: missing .note.GNU-stack section implies executable stack*/ +#ifdef __ELF__ +.section .note.GNU-stack,"",%progbits +#endif /* __ELF__ */ + + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM && defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE && LV_USE_NATIVE_HELIUM_ASM + +.data +reciprocal: +.byte 0xFF, 0xE2, 0xCC, 0xB9, 0xAA, 0x9C, 0x91, 0x88 + +.text +.syntax unified +.p2align 2 + +TMP .req r0 +DST_ADDR .req r1 +DST_W .req r2 +DST_H .req r3 +DST_STRIDE .req r4 +SRC_ADDR .req r5 +SRC_STRIDE .req r6 +MASK_ADDR .req r7 +MASK_STRIDE .req r8 +H .req r9 +OPA .req r10 +RCP .req r11 + +S_B .req q0 +S_G .req q1 +S_R .req q2 +S_A .req q3 +D_B .req q4 +D_G .req q5 +D_R .req q6 +D_A .req q7 +N .req q0 +V .req q1 +R .req q2 +L .req q4 +S_565 .req q0 +D_565 .req q1 +S_L .req q2 +D_L .req q4 +D_T .req q5 +BITMASK .req q6 + +.macro ldst st, op, bpp, mem, reg, areg, cvt, alt_index, wb, aligned +.if \bpp == 0 +.if \cvt + ldr TMP, [\mem\()_ADDR] + bfi TMP, TMP, #2, #8 + bfi TMP, TMP, #3, #16 + lsr TMP, TMP, #8 + vdup.16 \reg\()_565, TMP +.else + ldr TMP, [\mem\()_ADDR] + vdup.8 \reg\()_B, TMP + lsr TMP, #8 + vdup.8 \reg\()_G, TMP + lsr TMP, #8 + vdup.8 \reg\()_R, TMP +.endif +.elseif \bpp == 8 +.if \cvt + v\op\()rb.u16 \reg\()_A, [\mem\()_ADDR], #8 +.else + v\op\()rb.8 \reg\()_A, [\mem\()_ADDR], #16 +.endif +.elseif \bpp == 16 +.if \cvt +.if \st + vsri.8 \reg\()_R, \reg\()_G, #5 + vshr.u8 \reg\()_G, \reg\()_G, #2 + vshr.u8 \reg\()_B, \reg\()_B, #3 + vsli.8 \reg\()_B, \reg\()_G, #5 +.endif +.if \alt_index + v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, S_B] + v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, S_G] +.else + v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, \reg\()_A] + add \mem\()_ADDR, #1 + v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, \reg\()_A] +.endif +.if \st == 0 + vshl.u8 \reg\()_G, \reg\()_R, #5 + vsri.u8 \reg\()_G, \reg\()_B, #3 + vshl.u8 \reg\()_B, \reg\()_B, #3 + vsri.u8 \reg\()_R, \reg\()_R, #5 + vsri.u8 \reg\()_G, \reg\()_G, #6 + vsri.u8 \reg\()_B, \reg\()_B, #5 +.endif +.ifc \wb, ! +.if \alt_index + add \mem\()_ADDR, #32 +.else + add \mem\()_ADDR, #31 +.endif +.elseif \alt_index == 0 + sub \mem\()_ADDR, #1 +.endif +.else @ cvt +.ifc \wb, ! + v\op\()rh.16 \reg\()_565, [\mem\()_ADDR], #16 +.else + v\op\()rh.16 \reg\()_565, [\mem\()_ADDR] +.endif +.endif +.elseif \bpp == 24 +.if \alt_index == 1 + v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, S_B] + v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, S_G] + v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, S_R] +.elseif \alt_index == 2 + v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, S_R] + v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, S_A] + v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, D_A] +.else + v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, \reg\()_A] + add \mem\()_ADDR, #1 + v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, \reg\()_A] + add \mem\()_ADDR, #1 + v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, \reg\()_A] +.endif +.ifc \wb, ! +.if \alt_index + add \mem\()_ADDR, #48 +.else + add \mem\()_ADDR, #46 +.endif +.elseif \alt_index == 0 + sub \mem\()_ADDR, #2 +.endif +.elseif \aligned + v\op\()40.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR] + v\op\()41.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR] + v\op\()42.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR] + v\op\()43.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR]\wb +.else + v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, \areg\()_A] + add \mem\()_ADDR, #1 + v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, \areg\()_A] + add \mem\()_ADDR, #1 + v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, \areg\()_A] +.if (\bpp == 32) || (\bpp == 31) && \st + add \mem\()_ADDR, #1 + v\op\()rb.8 \reg\()_A, [\mem\()_ADDR, \areg\()_A] +.endif +.ifc \wb, ! + .if (\bpp == 32) || (\bpp == 31) && \st + add \mem\()_ADDR, #61 + .else + add \mem\()_ADDR, #62 + .endif +.else + .if (\bpp == 32) || (\bpp == 31) && \st + sub \mem\()_ADDR, #3 + .else + sub \mem\()_ADDR, #2 + .endif +.endif +.endif +.endm + +.macro load_index bpp, reg, areg, aligned +.if (\bpp > 0) && ((\bpp < 31) || (\aligned == 0)) + mov TMP, #0 +.if \bpp == 8 + vidup.u8 \reg\()_A, TMP, #1 +.elseif \bpp == 16 + vidup.u8 \reg\()_A, TMP, #2 +.elseif \bpp == 24 + vidup.u8 \reg\()_A, TMP, #1 + mov TMP, #3 + vmul.u8 \reg\()_A, \reg\()_A, TMP +.else + vidup.u8 \areg\()_A, TMP, #4 +.endif +.endif +.endm + +.macro init src_bpp, dst_bpp, mask, opa + ldr DST_ADDR, [r0, #4] + ldr DST_W, [r0, #8] + ldr DST_H, [r0, #12] + ldr DST_STRIDE, [r0, #16] + ldr SRC_ADDR, [r0, #20] +.if \src_bpp > 0 + ldr SRC_STRIDE, [r0, #24] +.endif +.if \mask + ldr MASK_ADDR, [r0, #28] + ldr MASK_STRIDE, [r0, #32] +.endif +.if \opa + ldr OPA, [r0] +.endif +.if (\src_bpp <= 16) && (\dst_bpp == 16) +.if \opa || \mask + mov TMP, #0xF81F + movt TMP, #0x7E0 + vdup.32 BITMASK, TMP +.endif + add TMP, DST_W, #0x7 + bic TMP, TMP, #0x7 +.else + add TMP, DST_W, #0xF + bic TMP, TMP, #0xF +.endif +.if \dst_bpp == 32 + ldr RCP, =(reciprocal - 8) +.endif + +.if \dst_bpp == 16 + sub DST_STRIDE, DST_STRIDE, TMP, lsl #1 +.elseif \dst_bpp == 24 + sub DST_STRIDE, DST_STRIDE, TMP + sub DST_STRIDE, DST_STRIDE, TMP, lsl #1 +.elseif \dst_bpp >= 31 + sub DST_STRIDE, DST_STRIDE, TMP, lsl #2 +.endif +.if \mask + sub MASK_STRIDE, MASK_STRIDE, TMP +.endif +.if \src_bpp == 0 +.if \mask || \opa + .if \dst_bpp > 16 + ldst 0, ld, \src_bpp, SRC, S, D, 0, 0 + vmov.u8 S_A, #0xFF + .else + ldst 0, ld, \src_bpp, SRC, S, D, 1, 0 + vmovlb.u16 S_L, S_565 + vsli.32 S_L, S_L, #16 + vand S_L, S_L, BITMASK + .endif +.else + .if \dst_bpp > 16 + ldst 0, ld, \src_bpp, SRC, D, S, 0, 0 + .else + ldst 0, ld, \src_bpp, SRC, D, S, 1, 0 + .endif +.endif +.else + .if \src_bpp == 16 + sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1 + .elseif \src_bpp == 24 + sub SRC_STRIDE, SRC_STRIDE, TMP + sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1 + .elseif \src_bpp >= 31 + sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #2 + .endif +.endif +.if (\src_bpp < 32) && (\mask == 0) && (\opa == 0) && !((\src_bpp <= 16) && (\dst_bpp == 16)) +@ 16 to 31/32 or reverse: index @ q0, q1 +@ 24 to 31/32 or reverse: index @ q0, q1, q2 +@ 16 to 24 or reverse: 16 index @ q0, q1, 24 index @ q2, q3, q7 +@ 31 to 31/32: index @ q3 (tail only) + mov TMP, #0 +.if (\src_bpp == 16) || (\dst_bpp == 16) + vidup.u8 S_B, TMP, #2 + mov TMP, #1 + vadd.u8 S_G, S_B, TMP +.if (\src_bpp == 24) || (\dst_bpp == 24) + vshl.u8 S_R, S_B, #1 + vadd.u8 S_R, S_R, S_B + vshr.u8 S_R, S_R, #1 + vadd.u8 S_A, S_R, TMP + vadd.u8 D_A, S_A, TMP +.endif +.elseif (\src_bpp == 24) || (\dst_bpp == 24) + vidup.u8 S_B, TMP, #1 + mov TMP, #3 + vmul.u8 S_B, S_B, TMP + mov TMP, #1 + vadd.u8 S_G, S_B, TMP + vadd.u8 S_R, S_G, TMP +.endif +.if \dst_bpp >= 31 + load_index \dst_bpp, D, S, 0 + vmov.u8 D_A, #0xFF +.endif +.endif +.endm + +.macro vqrdmulh_u8 Qd, Qn, Qm @ 1 bit precision loss + vmulh.u8 \Qd, \Qn, \Qm + vqshl.u8 \Qd, \Qd, #1 +.endm + +.macro premult mem, alpha + vrmulh.u8 \mem\()_B, \mem\()_B, \alpha + vrmulh.u8 \mem\()_G, \mem\()_G, \alpha + vrmulh.u8 \mem\()_R, \mem\()_R, \alpha +.endm + +.macro blend_565 p + vmovl\p\().u16 D_L, D_565 + vsli.32 D_L, D_L, #16 + vand D_L, D_L, BITMASK + vsub.u32 D_T, S_L, D_L + vmovl\p\().u16 D_A, S_A + vmul.u32 D_T, D_T, D_A + vshr.u32 D_T, D_T, #5 + vadd.u32 D_L, D_L, D_T + vand D_L, D_L, BITMASK + vshr.u32 D_T, D_L, #16 + vorr D_L, D_L, D_T + vmovn\p\().u32 D_565, D_L +.endm + +.macro late_init src_bpp, dst_bpp, mask, opa, mode +.if (\src_bpp <= 16) && (\dst_bpp == 16) && (\mask == 0) +.if \opa == 2 + mov TMP, #0x7BEF + vdup.16 BITMASK, TMP +.if \src_bpp == 0 + vshr.u16 S_L, S_565, #1 + vand S_L, S_L, BITMASK +.endif +.elseif \opa == 1 + vdup.16 S_A, OPA + mov TMP, #4 + vadd.u16 S_A, S_A, TMP + vshr.u16 S_A, S_A, #3 +.endif +.endif +.endm + +.macro blend src_bpp, dst_bpp, mask, opa, mode +.if (\mask == 0) && (\opa == 2) +.if (\src_bpp <= 16) && (\dst_bpp == 16) +.if \src_bpp > 0 + vshr.u16 S_L, S_565, #1 + vand S_L, S_L, BITMASK +.endif + vshr.u16 D_L, D_565, #1 + vand D_L, D_L, BITMASK + vadd.u16 D_565, S_L, D_L +.else + vhadd.u8 D_B, D_B, S_B + vhadd.u8 D_G, D_G, S_G + vhadd.u8 D_R, D_R, S_R +.endif +.elseif (\src_bpp <= 16) && (\dst_bpp == 16) + lsl lr, #1 +.if \src_bpp > 0 + vmovlb.u16 S_L, S_565 + vsli.32 S_L, S_L, #16 + vand S_L, S_L, BITMASK +.endif + blend_565 b +.if \src_bpp > 0 + vmovlt.u16 S_L, S_565 + vsli.32 S_L, S_L, #16 + vand S_L, S_L, BITMASK +.endif + blend_565 t + lsr lr, #1 +.else +.if \dst_bpp < 32 +.if (\opa == 0) && (\mask == 0) + vmov.u8 D_A, #0xFF + mov TMP, #0 + vabav.u8 TMP, S_A, D_A + cbnz TMP, 91f + vmov D_B, S_B + vmov D_G, S_G + vmov D_R, S_R + b 88f +91: +.endif + vmvn D_A, S_A + premult S, S_A + premult D, D_A +.else + vpush {d0-d5} + vmov.u8 S_B, #0xFF + vmov.u8 S_G, #0 + mov TMP, #0 + vabav.u8 TMP, S_A, S_B + cbz TMP, 91f @ if(fg.alpha == 255 + mov TMP, #0 + vabav.u8 TMP, D_A, S_G + cbnz TMP, 90f @ || bg.alpha == 0) +91: + vpop {d8-d13} @ return fg; + vmov.u8 D_A, #0xFF + b 88f +90: + mov TMP, #0 + vabav.u8 TMP, S_A, S_G + cmp TMP, #2 @ if(fg.alpha <= LV_OPA_MIN) + itt le @ return bg; + vpople {d0-d5} + ble 88f + mov TMP, #0 + vabav.u8 TMP, D_A, S_B @ if (bg.alpha == 255) + cbnz TMP, 89f @ return lv_color_mix32(fg, bg); + vpop {d0-d5} + vmvn D_A, S_A + premult S, S_A + premult D, D_A + vqadd.u8 D_B, D_B, S_B + vqadd.u8 D_G, D_G, S_G + vqadd.u8 D_R, D_R, S_R + vmov.u8 D_A, #0xFF + b 88f +89: + vmvn N, S_A + vmvn D_A, D_A + vrmulh.u8 D_A, N, D_A + vmvn D_A, D_A @ D_A = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha) + vclz.i8 N, D_A @ n = clz(D_A) + vshl.u8 V, D_A, N @ v = D_A << n + vshl.u8 S_A, S_A, N + vshr.u8 N, V, #4 @ N is used as tmp from now on + vldrb.u8 R, [RCP, N] @ r = reciprocal[(v >> 4) - 8] + vrmulh.u8 N, V, R @ r = newton(v,r) + vmvn N, N @ = vqrdmulh.u8(vmvn(vrmulh(v, r)), r) + vqrdmulh_u8 R, N, R @ but vqrdmulh does not support u8, so we implement one + vrmulh.u8 N, V, R @ and do it twice + vmvn N, N + vqrdmulh_u8 R, N, R + vqrdmulh_u8 S_A, S_A, R @ S_A' = S_A * 255 / D_A = vrdmulh(S_A << n, r) + vpop {d0-d5} + premult S, S_A + vmvn S_A, S_A + premult D, S_A +.endif + vqadd.u8 D_B, D_B, S_B + vqadd.u8 D_G, D_G, S_G + vqadd.u8 D_R, D_R, S_R +.endif +.if \dst_bpp == 31 + vmov.u8 D_A, #0xFF +.endif +88: +.endm + +.macro blend_line src_bpp, dst_bpp, mask, opa, mode +.if (\src_bpp < 31) && (\dst_bpp < 31) + blend_block \src_bpp, \dst_bpp, \mask, \opa, \mode, DST_W, 0 +.else + bics TMP, DST_W, #0xF + beq 87f + blend_block \src_bpp, \dst_bpp, \mask, \opa, \mode, TMP, 1 +87: + ands TMP, DST_W, #0xF + beq 86f + blend_block \src_bpp, \dst_bpp, \mask, \opa, \mode, TMP, 0 +86: +.endif +.endm + +.macro blend_block src_bpp, dst_bpp, mask, opa, mode, w, aligned +.if (\src_bpp <= 16) && (\dst_bpp == 16) + wlstp.16 lr, \w, 1f +.else + wlstp.8 lr, \w, 1f +.endif +2: +.if (\src_bpp < 32) && (\mask == 0) && (\opa == 0) +@ no blend + .if \src_bpp == 0 + ldst 1, st, \dst_bpp, DST, D, S, 0, 1, !, \aligned + .elseif (\src_bpp == \dst_bpp) || (\src_bpp == 31) && (\dst_bpp == 32) + .if \dst_bpp < 31 + .if \src_bpp < 31 + ldst 0, ld, \src_bpp, SRC, D, S, 0, 1, !, \aligned + .else + ldst 0, ld, \src_bpp, SRC, D, S, 0, 1, !, \aligned + .endif + ldst 1, st, \dst_bpp, DST, D, S, 0, 1, !, \aligned + .else + ldst 0, ld, \src_bpp, SRC, D, S, 0, 1, !, \aligned + ldst 1, st, \dst_bpp, DST, D, S, 0, 1, !, \aligned + .endif + .else + .if (\dst_bpp < 31) && (\src_bpp < 31) + ldst 0, ld, \src_bpp, SRC, D, S, 1, 2, !, \aligned + ldst 1, st, \dst_bpp, DST, D, S, 1, 2, !, \aligned + .else + ldst 0, ld, \src_bpp, SRC, D, S, 1, 1, !, \aligned + ldst 1, st, \dst_bpp, DST, D, S, 1, 1, !, \aligned + .endif + .endif +.elseif (\src_bpp <= 16) && (\dst_bpp == 16) + .if \src_bpp > 0 + ldst 0, ld, \src_bpp, SRC, S, D, 0, 0, !, \aligned + .endif + ldst 0, ld, \dst_bpp, DST, D, S, 0, 0, , \aligned + .if \mask + ldst 0, ld, 8, MASK, S, D, 1, 0, ! + .if \opa == 2 + vshr.u16 S_A, S_A, #1 + .elseif \opa == 1 + vmul.u16 S_A, S_A, OPA + vshr.u16 S_A, S_A, #8 + .endif + mov TMP, #4 + vadd.u16 S_A, S_A, TMP + vshr.u16 S_A, S_A, #3 + .endif + blend \src_bpp, \dst_bpp, \mask, \opa, \mode + ldst 1, st, \dst_bpp, DST, D, S, 0, 0, !, \aligned +.elseif \src_bpp < 32 +@ no src_a +.if \src_bpp > 0 + load_index \src_bpp, S, D, \aligned + ldst 0, ld, \src_bpp, SRC, S, D, 1, 0, !, \aligned +.elseif (\opa == 1) || \mask + vpush {d0-d5} +.endif + load_index \dst_bpp, D, S, \aligned + ldst 0, ld, \dst_bpp, DST, D, S, 1, 0, , \aligned + .if \mask + ldst 0, ld, 8, MASK, S, D, 0, 0, !, \aligned + .if \opa == 2 + vshr.u8 S_A, S_A, #1 + .elseif \opa == 1 + .if \dst_bpp == 32 + vpush {d14-d15} + .endif + vdup.8 D_A, OPA + vrmulh.u8 S_A, S_A, D_A + .if \dst_bpp == 32 + vpop {d14-d15} + .endif + .endif + .elseif \opa == 1 + vdup.8 S_A, OPA + .endif + blend \src_bpp, \dst_bpp, \mask, \opa, \mode +.if (\src_bpp == 0) && ((\opa == 1) || \mask) + vpop {d0-d5} +.endif + .if (\dst_bpp == 32) || \mask || (\opa == 1) + load_index \dst_bpp, D, S, \aligned + .endif + ldst 1, st, \dst_bpp, DST, D, S, 1, 0, !, \aligned +.else +@ src_a (+\mask) (+\opa) + load_index \dst_bpp, D, S, \aligned + ldst 0, ld, \dst_bpp, DST, D, S, 1, 0, , \aligned + .if (\dst_bpp == 32) && (\mask || \opa || (\aligned == 0)) + vpush {d14-d15} + .endif + load_index \src_bpp, S, D, \aligned + ldst 0, ld, \src_bpp, SRC, S, D, 1, 0, !, \aligned + .if \mask == 0 + .if \opa + vdup.8 D_A, OPA + vrmulh.u8 S_A, S_A, D_A + .endif + .else + ldst 0, ld, 8, MASK, D, S, 0, 0, !, \aligned + vrmulh.u8 S_A, S_A, D_A + .if \opa + vdup.8 D_A, OPA + vrmulh.u8 S_A, S_A, D_A + .endif + .endif + .if (\dst_bpp == 32) && (\mask || \opa || (\aligned == 0)) + vpop {d14-d15} + .endif + blend \src_bpp, \dst_bpp, \mask, \opa, \mode + load_index \dst_bpp, D, S, \aligned + ldst 1, st, \dst_bpp, DST, D, S, 1, 0, !, \aligned +.endif + letp lr, 2b +1: +.endm + +.macro enter complex + push {r4-r11, lr} +.if \complex + vpush {d8-d15} +.endif +.endm + +.macro exit complex +.if \complex + vpop {d8-d15} +.endif + pop {r4-r11, pc} +.endm + +.macro preload mem, bpp +.if \bpp >= 31 + pld [\mem\()_ADDR, DST_W, lsl #2] +.elseif \bpp == 24 + add TMP, DST_W, DST_W, lsl #1 + pld [\mem\()_ADDR, TMP] +.elseif \bpp == 16 + pld [\mem\()_ADDR, DST_W, lsl #1] +.elseif \bpp == 8 + pld [\mem\()_ADDR, DST_W] +.endif +.endm + +.macro next src_bpp, mask + add DST_ADDR, DST_ADDR, DST_STRIDE +.if \src_bpp > 0 + add SRC_ADDR, SRC_ADDR, SRC_STRIDE +.endif +.if \mask + add MASK_ADDR, MASK_ADDR, MASK_STRIDE +.endif +.endm + +.macro blender src_bpp, dst_bpp, mask, opa, mode +.if (\src_bpp <= 16) && (\dst_bpp == 16) && (\opa == 0) && (\mask == 0) + enter 0 +.else + enter 1 +.endif + init \src_bpp, \dst_bpp, \mask, \opa + movs H, DST_H + beq 0f + preload SRC, \src_bpp +.if \mask || \opa || (\src_bpp == 32) + preload DST, \dst_bpp +.endif +.if \opa && (\src_bpp < 32) && (\dst_bpp < 32) +4: +@ 50% OPA can be accelerated (OPA == 0x7F/0x80) + add TMP, OPA, #1 + tst TMP, #0x7E + bne 3f + late_init \src_bpp, \dst_bpp, \mask, 2, \mode + blend_line \src_bpp, \dst_bpp, \mask, 2, \mode + next \src_bpp, \mask + subs H, #1 + bne 4b + b 0f +.endif +3: + late_init \src_bpp, \dst_bpp, \mask, \opa, \mode + blend_line \src_bpp, \dst_bpp, \mask, \opa, \mode + next \src_bpp, \mask + subs H, #1 + bne 3b +0: +.if (\src_bpp <= 16) && (\dst_bpp == 16) && (\opa == 0) && (\mask == 0) + exit 0 +.else + exit 1 +.endif +.ltorg +.endm + +.macro export name, src_bpp, dst_bpp, mask, opa, mode +.thumb_func +.global \name +\name\(): + blender \src_bpp, \dst_bpp, \mask, \opa, \mode +.endm + +.macro export_set src, dst, src_bpp, dst_bpp, mode +.ifc \src, color + export _lv_\src\()_blend_to_\dst\()_helium, \src_bpp, \dst_bpp, 0, 0, \mode + export _lv_\src\()_blend_to_\dst\()_with_opa_helium, \src_bpp, \dst_bpp, 0, 1, \mode + export _lv_\src\()_blend_to_\dst\()_with_mask_helium, \src_bpp, \dst_bpp, 1, 0, \mode + export _lv_\src\()_blend_to_\dst\()_mix_mask_opa_helium, \src_bpp, \dst_bpp, 1, 1, \mode +.else + export _lv_\src\()_blend_\mode\()_to_\dst\()_helium, \src_bpp, \dst_bpp, 0, 0, \mode + export _lv_\src\()_blend_\mode\()_to_\dst\()_with_opa_helium, \src_bpp, \dst_bpp, 0, 1, \mode + export _lv_\src\()_blend_\mode\()_to_\dst\()_with_mask_helium, \src_bpp, \dst_bpp, 1, 0, \mode + export _lv_\src\()_blend_\mode\()_to_\dst\()_mix_mask_opa_helium, \src_bpp, \dst_bpp, 1, 1, \mode +.endif +.endm + +export_set color, rgb565, 0, 16, normal +export_set rgb565, rgb565, 16, 16, normal +export_set rgb888, rgb565, 24, 16, normal +export_set xrgb8888, rgb565, 31, 16, normal +export_set argb8888, rgb565, 32, 16, normal +export_set color, rgb888, 0, 24, normal +export_set rgb565, rgb888, 16, 24, normal +export_set rgb888, rgb888, 24, 24, normal +export_set xrgb8888, rgb888, 31, 24, normal +export_set argb8888, rgb888, 32, 24, normal +export_set color, xrgb8888, 0, 31, normal +export_set rgb565, xrgb8888, 16, 31, normal +export_set rgb888, xrgb8888, 24, 31, normal +export_set xrgb8888, xrgb8888, 31, 31, normal +export_set argb8888, xrgb8888, 32, 31, normal +export_set color, argb8888, 0, 32, normal +export_set rgb565, argb8888, 16, 32, normal +export_set rgb888, argb8888, 24, 32, normal +export_set xrgb8888, argb8888, 31, 32, normal +export_set argb8888, argb8888, 32, 32, normal + +#endif /*LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM && defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE && LV_USE_NATIVE_HELIUM_ASM*/ + diff --git a/inc/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h b/inc/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h new file mode 100644 index 0000000..ed45b2b --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h @@ -0,0 +1,1319 @@ +/** + * @file lv_blend_helium.h + * + */ + +#ifndef LV_BLEND_HELIUM_H +#define LV_BLEND_HELIUM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#if defined(_RTE_) +#include "Pre_Include_Global.h" +#include "lv_conf_cmsis.h" +#endif + +#include "../../../../lv_conf_internal.h" + +/* detect whether helium is available based on arm compilers' standard */ +#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE + +#ifdef LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE +#include LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE +#endif + +#if !defined(__ASSEMBLY__) + +#if __GNUC__ >= 4 +#define LVGL_HIDDEN __attribute__((visibility("hidden"))) +#else +#define LVGL_HIDDEN +#endif + +/* Use arm2d functions if present */ +#include "../arm2d/lv_blend_arm2d.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_NATIVE_HELIUM_ASM + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \ + lv_color_blend_to_rgb565_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \ + lv_color_blend_to_rgb565_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \ + lv_color_blend_to_rgb565_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \ + lv_color_blend_to_rgb565_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \ + lv_rgb565_blend_normal_to_rgb565_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + lv_rgb565_blend_normal_to_rgb565_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + lv_rgb565_blend_normal_to_rgb565_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_rgb565_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_rgb565_with_opa_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_rgb565_with_mask_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \ + lv_argb8888_blend_normal_to_rgb565_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \ + lv_argb8888_blend_normal_to_rgb565_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \ + lv_argb8888_blend_normal_to_rgb565_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \ + lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \ + lv_color_blend_to_rgb888_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + lv_color_blend_to_rgb888_with_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + lv_color_blend_to_rgb888_with_mask_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + lv_color_blend_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + lv_rgb565_blend_normal_to_rgb888_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + lv_rgb565_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + lv_rgb565_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \ + lv_rgb888_blend_normal_to_rgb888_helium(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \ + lv_rgb888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \ + lv_rgb888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \ + lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \ + lv_argb8888_blend_normal_to_rgb888_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \ + lv_argb8888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \ + lv_argb8888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \ + lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc) \ + lv_color_blend_to_argb8888_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc) \ + lv_color_blend_to_argb8888_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc) \ + lv_color_blend_to_argb8888_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc) \ + lv_color_blend_to_argb8888_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc) \ + lv_rgb565_blend_normal_to_argb8888_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ + lv_rgb565_blend_normal_to_argb8888_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ + lv_rgb565_blend_normal_to_argb8888_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ + lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_argb8888_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_argb8888_with_opa_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_argb8888_with_mask_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size) \ + lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc) \ + lv_argb8888_blend_normal_to_argb8888_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \ + lv_argb8888_blend_normal_to_argb8888_with_opa_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \ + lv_argb8888_blend_normal_to_argb8888_with_mask_helium(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \ + lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc) +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint32_t opa; + void * dst_buf; + uint32_t dst_w; + uint32_t dst_h; + uint32_t dst_stride; + const void * src_buf; + uint32_t src_stride; + const lv_opa_t * mask_buf; + uint32_t mask_stride; +} asm_dsc_t; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +extern LVGL_HIDDEN void _lv_color_blend_to_rgb565_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_rgb565_helium(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + + _lv_color_blend_to_rgb565_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_rgb565_with_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + _lv_color_blend_to_rgb565_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_rgb565_with_mask_helium(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_color_blend_to_rgb565_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_color_blend_to_rgb565_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + _lv_rgb565_blend_normal_to_rgb565_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_rgb565_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_rgb565_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + _lv_argb8888_blend_normal_to_rgb565_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_rgb888_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_color_blend_to_xrgb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_rgb888_helium(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + if(dst_px_size == 3) { + _lv_color_blend_to_rgb888_helium(&asm_dsc); + } + else { + _lv_color_blend_to_xrgb8888_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_color_blend_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_rgb888_with_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + if(dst_px_size == 3) { + _lv_color_blend_to_rgb888_with_opa_helium(&asm_dsc); + } + else { + _lv_color_blend_to_xrgb8888_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_color_blend_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_rgb888_with_mask_helium(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + _lv_color_blend_to_rgb888_with_mask_helium(&asm_dsc); + } + else { + _lv_color_blend_to_xrgb8888_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_color_blend_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + _lv_color_blend_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + else { + _lv_color_blend_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + _lv_rgb565_blend_normal_to_rgb888_helium(&asm_dsc); + } + else { + _lv_rgb565_blend_normal_to_xrgb8888_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); + } + else { + _lv_rgb565_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); + } + else { + _lv_rgb565_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + else { + _lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_rgb888_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_rgb888_helium(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_xrgb8888_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_xrgb8888_helium(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size, uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + } + else { + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + _lv_argb8888_blend_normal_to_rgb888_helium(&asm_dsc); + } + else { + _lv_argb8888_blend_normal_to_xrgb8888_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(dst_px_size == 3) { + _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc); + } + else { + _lv_argb8888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc); + } + else { + _lv_argb8888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dst_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(dst_px_size == 3) { + _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc); + } + else { + _lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_argb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_argb8888_helium(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + + _lv_color_blend_to_argb8888_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_argb8888_with_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color + }; + _lv_color_blend_to_argb8888_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_argb8888_with_mask_helium(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_color_blend_to_argb8888_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_color_blend_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_color_blend_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = &dsc->color, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_color_blend_to_argb8888_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + _lv_rgb565_blend_normal_to_argb8888_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_argb8888_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_argb8888_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +extern LVGL_HIDDEN void _lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t src_px_size) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + if(src_px_size == 3) { + _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); + } + else { + _lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); + } + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + _lv_argb8888_blend_normal_to_argb8888_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride + }; + _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_with_mask_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc); + return LV_RESULT_OK; +} + +extern LVGL_HIDDEN void _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc); +static inline lv_result_t lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(lv_draw_sw_blend_image_dsc_t * dsc) +{ + asm_dsc_t asm_dsc = { + .opa = dsc->opa, + .dst_buf = dsc->dest_buf, + .dst_w = dsc->dest_w, + .dst_h = dsc->dest_h, + .dst_stride = dsc->dest_stride, + .src_buf = dsc->src_buf, + .src_stride = dsc->src_stride, + .mask_buf = dsc->mask_buf, + .mask_stride = dsc->mask_stride + }; + _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc); + return LV_RESULT_OK; +} + +#endif /* LV_USE_NATIVE_HELIUM_ASM */ + +#endif /* !defined(__ASSEMBLY__) */ + +#endif /* defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE */ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BLEND_HELIUM_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c new file mode 100644 index 0000000..54a7294 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c @@ -0,0 +1,296 @@ +/** + * @file lv_draw_sw_blend.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../misc/lv_area_private.h" +#include "lv_draw_sw_blend_private.h" +#include "../../lv_draw_private.h" +#include "../lv_draw_sw.h" +#if LV_DRAW_SW_SUPPORT_A8 + #include "lv_draw_sw_blend_to_a8.h" +#endif +#if LV_DRAW_SW_SUPPORT_L8 + #include "lv_draw_sw_blend_to_l8.h" +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + #include "lv_draw_sw_blend_to_al88.h" +#endif +#if LV_DRAW_SW_SUPPORT_RGB565 + #include "lv_draw_sw_blend_to_rgb565.h" +#endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + #include "lv_draw_sw_blend_to_rgb565_swapped.h" +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + #include "lv_draw_sw_blend_to_argb8888.h" +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + #include "lv_draw_sw_blend_to_argb8888_premultiplied.h" +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + #include "lv_draw_sw_blend_to_rgb888.h" +#endif +#if LV_DRAW_SW_SUPPORT_I1 + #include "lv_draw_sw_blend_to_i1.h" +#endif +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color(lv_color_format_t layer_cf, + lv_draw_sw_blend_fill_dsc_t * fill_dsc); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image(lv_color_format_t layer_cf, + lv_draw_sw_blend_image_dsc_t * image_dsc); + + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_blend(lv_draw_task_t * t, const lv_draw_sw_blend_dsc_t * blend_dsc) +{ + /*Do not draw transparent things*/ + if(blend_dsc->opa <= LV_OPA_MIN) return; + if(blend_dsc->mask_buf && blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_TRANSP) return; + + lv_area_t blend_area; + if(!lv_area_intersect(&blend_area, blend_dsc->blend_area, &t->clip_area)) return; + + LV_PROFILER_DRAW_BEGIN; + lv_layer_t * layer = t->target_layer; + uint32_t layer_stride_byte = layer->draw_buf->header.stride; + + lv_draw_sw_blend_handler_t handler = lv_draw_sw_get_blend_handler(layer->color_format); + if(handler) { + handler(t, blend_dsc); + LV_PROFILER_DRAW_END; + return; + } + + if(blend_dsc->src_buf == NULL) { + lv_draw_sw_blend_fill_dsc_t fill_dsc; + fill_dsc.dest_w = lv_area_get_width(&blend_area); + fill_dsc.dest_h = lv_area_get_height(&blend_area); + fill_dsc.dest_stride = layer_stride_byte; + fill_dsc.opa = blend_dsc->opa; + fill_dsc.color = blend_dsc->color; + fill_dsc.mask_stride = 0; + + if(blend_dsc->mask_buf == NULL) fill_dsc.mask_buf = NULL; + else if(blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) fill_dsc.mask_buf = NULL; + else fill_dsc.mask_buf = blend_dsc->mask_buf; + + + fill_dsc.relative_area = blend_area; + lv_area_move(&fill_dsc.relative_area, -layer->buf_area.x1, -layer->buf_area.y1); + fill_dsc.dest_buf = lv_draw_layer_go_to_xy(layer, blend_area.x1 - layer->buf_area.x1, + blend_area.y1 - layer->buf_area.y1); + if(fill_dsc.mask_buf) { + fill_dsc.mask_stride = blend_dsc->mask_stride == 0 ? lv_area_get_width(blend_dsc->mask_area) : blend_dsc->mask_stride; + fill_dsc.mask_buf += fill_dsc.mask_stride * (blend_area.y1 - blend_dsc->mask_area->y1) + + (blend_area.x1 - blend_dsc->mask_area->x1); + } + + lv_draw_sw_blend_color(layer->color_format, &fill_dsc); + } + else { + if(!lv_area_intersect(&blend_area, &blend_area, blend_dsc->src_area)) { + LV_PROFILER_DRAW_END; + return; + } + + if(blend_dsc->mask_area && !lv_area_intersect(&blend_area, &blend_area, blend_dsc->mask_area)) { + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_sw_blend_image_dsc_t image_dsc; + image_dsc.dest_w = lv_area_get_width(&blend_area); + image_dsc.dest_h = lv_area_get_height(&blend_area); + image_dsc.dest_stride = layer_stride_byte; + + image_dsc.opa = blend_dsc->opa; + image_dsc.blend_mode = blend_dsc->blend_mode; + image_dsc.src_stride = blend_dsc->src_stride; + image_dsc.src_color_format = blend_dsc->src_color_format; + + const uint8_t * src_buf = blend_dsc->src_buf; + uint32_t src_px_size = lv_color_format_get_bpp(blend_dsc->src_color_format); + src_buf += image_dsc.src_stride * (blend_area.y1 - blend_dsc->src_area->y1); + src_buf += ((blend_area.x1 - blend_dsc->src_area->x1) * src_px_size) >> 3; + image_dsc.src_buf = src_buf; + image_dsc.mask_stride = 0; + + if(blend_dsc->mask_buf == NULL) image_dsc.mask_buf = NULL; + else if(blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) image_dsc.mask_buf = NULL; + else image_dsc.mask_buf = blend_dsc->mask_buf; + + if(image_dsc.mask_buf) { + LV_ASSERT_NULL(blend_dsc->mask_area); + image_dsc.mask_buf = blend_dsc->mask_buf; + image_dsc.mask_stride = blend_dsc->mask_stride ? blend_dsc->mask_stride : lv_area_get_width(blend_dsc->mask_area); + image_dsc.mask_buf += image_dsc.mask_stride * (blend_area.y1 - blend_dsc->mask_area->y1) + + (blend_area.x1 - blend_dsc->mask_area->x1); + } + + image_dsc.relative_area = blend_area; + lv_area_move(&image_dsc.relative_area, -layer->buf_area.x1, -layer->buf_area.y1); + + image_dsc.src_area = *blend_dsc->src_area; + lv_area_move(&image_dsc.src_area, -layer->buf_area.x1, -layer->buf_area.y1); + + image_dsc.dest_buf = lv_draw_layer_go_to_xy(layer, blend_area.x1 - layer->buf_area.x1, + blend_area.y1 - layer->buf_area.y1); + + lv_draw_sw_blend_image(layer->color_format, &image_dsc); + } + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color(lv_color_format_t layer_cf, + lv_draw_sw_blend_fill_dsc_t * fill_dsc) +{ + switch(layer_cf) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + lv_draw_sw_blend_color_to_rgb565(fill_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + lv_draw_sw_blend_color_to_rgb565_swapped(fill_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + lv_draw_sw_blend_color_to_argb8888(fill_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + lv_draw_sw_blend_color_to_rgb888(fill_dsc, 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + lv_draw_sw_blend_color_to_rgb888(fill_dsc, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + lv_draw_sw_blend_color_to_argb8888_premultiplied(fill_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_A8 + case LV_COLOR_FORMAT_A8: + lv_draw_sw_blend_color_to_a8(fill_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + lv_draw_sw_blend_color_to_l8(fill_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + lv_draw_sw_blend_color_to_al88(fill_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + lv_draw_sw_blend_color_to_i1(fill_dsc); + break; +#endif + default: + break; + } +} + +static inline void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image(lv_color_format_t layer_cf, + lv_draw_sw_blend_image_dsc_t * image_dsc) +{ + switch(layer_cf) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB565A8: + lv_draw_sw_blend_image_to_rgb565(image_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + lv_draw_sw_blend_image_to_rgb565_swapped(image_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + lv_draw_sw_blend_image_to_argb8888(image_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + lv_draw_sw_blend_image_to_rgb888(image_dsc, 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + lv_draw_sw_blend_image_to_rgb888(image_dsc, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + lv_draw_sw_blend_image_to_argb8888_premultiplied(image_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_A8 + case LV_COLOR_FORMAT_A8: + lv_draw_sw_blend_image_to_a8(image_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + lv_draw_sw_blend_image_to_l8(image_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + lv_draw_sw_blend_image_to_al88(image_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + lv_draw_sw_blend_image_to_i1(image_dsc); + break; +#endif + default: + break; + } +} + +#endif diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend.h new file mode 100644 index 0000000..83970fb --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend.h @@ -0,0 +1,64 @@ +/** + * @file lv_draw_sw_blend.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_H +#define LV_DRAW_SW_BLEND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw_mask.h" +#if LV_USE_DRAW_SW + +#include "../../../misc/lv_color.h" +#include "../../../misc/lv_area.h" +#include "../../../misc/lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Custom draw function for SW rendering. + * @param t pointer to a draw task + * @param dsc pointer to an initialized blend descriptor + */ +typedef void (*lv_draw_sw_blend_handler_t)(lv_draw_task_t * t, const lv_draw_sw_blend_dsc_t * dsc); + +typedef struct { + lv_color_format_t dest_cf; + lv_draw_sw_blend_handler_t handler; +} lv_draw_sw_custom_blend_handler_t; + +/** + * Call the blend function of the `layer`. + * @param draw_unit pointer to a draw unit + * @param dsc pointer to an initialized blend descriptor + */ +void lv_draw_sw_blend(lv_draw_task_t * t, const lv_draw_sw_blend_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_private.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_private.h new file mode 100644 index 0000000..731f9ad --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_private.h @@ -0,0 +1,92 @@ +/** + * @file lv_draw_sw_blend_private.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_PRIVATE_H +#define LV_DRAW_SW_BLEND_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_sw_blend.h" + +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_sw_blend_dsc_t { + const lv_area_t * blend_area; /**< The area with absolute coordinates to draw on `layer->buf` + * will be clipped to `layer->clip_area` */ + const void * src_buf; /**< Pointer to an image to blend. If set `fill_color` is ignored */ + uint32_t src_stride; + lv_color_format_t src_color_format; + const lv_area_t * src_area; + lv_opa_t opa; /**< The overall opacity*/ + lv_color_t color; /**< Fill color*/ + const lv_opa_t * mask_buf; /**< NULL if ignored, or an alpha mask to apply on `blend_area`*/ + lv_draw_sw_mask_res_t mask_res; /**< The result of the previous mask operation */ + const lv_area_t * mask_area; /**< The area of `mask_buf` with absolute coordinates*/ + int32_t mask_stride; + lv_blend_mode_t blend_mode; /**< E.g. LV_BLEND_MODE_ADDITIVE*/ +}; + +struct _lv_draw_sw_blend_fill_dsc_t { + void * dest_buf; + int32_t dest_w; + int32_t dest_h; + int32_t dest_stride; + const lv_opa_t * mask_buf; + int32_t mask_stride; + lv_color_t color; + lv_opa_t opa; + lv_area_t relative_area; +}; + +struct _lv_draw_sw_blend_image_dsc_t { + void * dest_buf; + int32_t dest_w; + int32_t dest_h; + int32_t dest_stride; + const lv_opa_t * mask_buf; + int32_t mask_stride; + const void * src_buf; + int32_t src_stride; + lv_color_format_t src_color_format; + lv_opa_t opa; + lv_blend_mode_t blend_mode; + lv_area_t relative_area; /**< The blend area relative to the layer's buffer area. */ + lv_area_t src_area; /**< The original src area. */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_SW */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_a8.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_a8.c new file mode 100644 index 0000000..736fd9e --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_a8.c @@ -0,0 +1,663 @@ +/** + * @file lv_draw_sw_blend_to_a8.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_a8.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_A8 + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ a8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +#if LV_DRAW_SW_SUPPORT_L8 || LV_DRAW_SW_SUPPORT_RGB565 || LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + + static void LV_ATTRIBUTE_FAST_MEM mask_only_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +#endif + +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#define BLEND_A8(dest_a, src_a) if(dest_a < src_a) dest_a = src_a + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_A8 + #define LV_DRAW_SW_COLOR_BLEND_TO_A8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_A8_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_A8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_A8_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_A8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_A8_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_A8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8 + #define LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8_WITH_OPA + #define LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8_WITH_MASK + #define LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8_MIX_MASK_OPA + #define LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_A8_BLEND_TO_A8 + #define LV_DRAW_SW_A8_BLEND_TO_A8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_A8_BLEND_TO_A8_WITH_OPA + #define LV_DRAW_SW_A8_BLEND_TO_A8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_A8_BLEND_TO_A8_WITH_MASK + #define LV_DRAW_SW_A8_BLEND_TO_A8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_A8_BLEND_TO_A8_MIX_MASK_OPA + #define LV_DRAW_SW_A8_BLEND_TO_A8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_TO_A8 + #define LV_DRAW_SW_AL88_BLEND_TO_A8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_TO_A8_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_TO_A8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_TO_A8_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_TO_A8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_TO_A8_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_TO_A8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_TO_A8 + #define LV_DRAW_SW_ARGB8888_BLEND_TO_A8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_TO_A8_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_TO_A8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_TO_A8_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_TO_A8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_TO_A8_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_TO_A8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + + + +#ifndef LV_DRAW_SW_I1_BLEND_TO_A8 + #define LV_DRAW_SW_I1_BLEND_TO_A8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_TO_A8_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_TO_A8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_TO_A8_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_TO_A8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_TO_A8_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_TO_A8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_a8(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_A8(dsc)) { + uint8_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + lv_memset(dest_buf, 0xff, w); + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_A8_WITH_OPA(dsc)) { + uint8_t * dest_buf = dsc->dest_buf; + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + BLEND_A8(dest_buf[x], opa); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_A8_WITH_MASK(dsc)) { + uint8_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + BLEND_A8(dest_buf[x], mask[x]); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + + } + /*Masked with opacity*/ + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_A8_MIX_MASK_OPA(dsc)) { + uint8_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_opa_t opa_res = LV_OPA_MIX2(mask[x], opa); + BLEND_A8(dest_buf[x], opa_res); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_a8(lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + mask_only_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + mask_only_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + mask_only_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + mask_only_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#endif + case LV_COLOR_FORMAT_A8: + a8_image_blend(dsc); + break; +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + mask_only_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + al88_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; +#endif + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM a8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_a8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_a8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_A8_BLEND_TO_A8(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_a8[dest_x], src_buf_a8[src_x]); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_a8 = drawbuf_next_row(src_buf_a8, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_A8_BLEND_TO_A8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_a8[dest_x], LV_OPA_MIX2(opa, src_buf_a8[src_x])); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_a8 = drawbuf_next_row(src_buf_a8, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_A8_BLEND_TO_A8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_a8[dest_x], LV_OPA_MIX2(mask_buf[src_x], src_buf_a8[src_x])); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_a8 = drawbuf_next_row(src_buf_a8, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_A8_BLEND_TO_A8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_a8[dest_x], LV_OPA_MIX3(opa, mask_buf[src_x], src_buf_a8[src_x])); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_a8 = drawbuf_next_row(src_buf_a8, src_stride); + mask_buf += mask_stride; + } + } + } +} + +#if LV_DRAW_SW_SUPPORT_L8 || LV_DRAW_SW_SUPPORT_RGB565 || LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +static void LV_ATTRIBUTE_FAST_MEM mask_only_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t src_x; + int32_t dest_x; + int32_t y; + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8(dsc)) { + for(y = 0; y < h; y++) { + lv_memset(dest_buf_u8, 0xff, w); + dest_buf_u8 += dest_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_u8[dest_x], opa); + } + dest_buf_u8 += dest_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_u8[dest_x], mask_buf[src_x]); + } + dest_buf_u8 += dest_stride; + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_MASK_ONLY_BLEND_TO_A8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); + } + dest_buf_u8 += dest_stride; + mask_buf += mask_stride; + } + } + } +} + +#endif + + +#if LV_DRAW_SW_SUPPORT_I1 + +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_a8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_TO_A8(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + if(get_bit(src_buf_i1, src_x)) dest_buf_a8[dest_x] = 0xff; + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_TO_A8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + if(get_bit(src_buf_i1, src_x)) { + BLEND_A8(dest_buf_a8[dest_x], opa); + } + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_TO_A8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + if(get_bit(src_buf_i1, src_x)) { + BLEND_A8(dest_buf_a8[dest_x], mask_buf[src_x]); + } + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_TO_A8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + if(get_bit(src_buf_i1, src_x)) { + lv_opa_t opa_res = LV_OPA_MIX2(mask_buf[src_x], opa); + BLEND_A8(dest_buf_a8[dest_x], opa_res); + + } + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 + +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_a8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16a_t * src_buf_al88 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_TO_A8(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_a8[dest_x], src_buf_al88[src_x].alpha); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_TO_A8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_a8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_TO_A8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_a8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, mask_buf[src_x])); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_TO_A8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + BLEND_A8(dest_buf_a8[dest_x], LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[src_x], + opa)); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } +} + +#endif + + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_a8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t x; + int32_t y; + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_A8_BLEND_TO_A8(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + BLEND_A8(dest_buf_a8[x], src_buf_c32[x].alpha); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_A8_BLEND_TO_A8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + BLEND_A8(dest_buf_a8[x], LV_OPA_MIX2(src_buf_c32[x].alpha, opa)); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_A8_BLEND_TO_A8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + BLEND_A8(dest_buf_a8[x], LV_OPA_MIX2(src_buf_c32[x].alpha, mask_buf[x])); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_A8_BLEND_TO_A8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + BLEND_A8(dest_buf_a8[x], LV_OPA_MIX3(src_buf_c32[x].alpha, opa, + mask_buf[x])); + } + dest_buf_a8 = drawbuf_next_row(dest_buf_a8, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } +} + +#endif + + +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#endif + +#endif diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_a8.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_a8.h new file mode 100644 index 0000000..8b186bd --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_a8.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_a8.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_A8_H +#define LV_DRAW_SW_BLEND_TO_A8_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_a8(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_a8(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_A8_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c new file mode 100644 index 0000000..749be4c --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c @@ -0,0 +1,1040 @@ +/** + * @file lv_draw_sw_blend_to_al88.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_al88.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_AL88 + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_color16a_t fg_saved; + lv_color16a_t bg_saved; + lv_color16a_t res_saved; + lv_opa_t res_alpha_saved; + lv_opa_t ratio_saved; +} lv_color_mix_alpha_cache_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_DRAW_SW_SUPPORT_L8 + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + +static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +#if LV_DRAW_SW_SUPPORT_RGB565 + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(lv_color16a_t * dest, lv_color16a_t src, + lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +static inline bool lv_color16a_eq(lv_color16a_t c1, lv_color16a_t c2); + +static inline lv_color16a_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_mix16a(lv_color16a_t fg, lv_color16a_t bg); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_16a_16a_mix(lv_color16a_t src, lv_color16a_t * dest, + lv_color_mix_alpha_cache_t * cache); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_AL88 + #define LV_DRAW_SW_COLOR_BLEND_TO_AL88(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_AL88_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88 + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88 + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_al88(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_AL88(dsc)) { + lv_color16a_t color16a; + color16a.lumi = lv_color_luminance(dsc->color); + color16a.alpha = 255; + lv_color16a_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w - 16; x += 16) { + dest_buf[x + 0] = color16a; + dest_buf[x + 1] = color16a; + dest_buf[x + 2] = color16a; + dest_buf[x + 3] = color16a; + + dest_buf[x + 4] = color16a; + dest_buf[x + 5] = color16a; + dest_buf[x + 6] = color16a; + dest_buf[x + 7] = color16a; + + dest_buf[x + 8] = color16a; + dest_buf[x + 9] = color16a; + dest_buf[x + 10] = color16a; + dest_buf[x + 11] = color16a; + + dest_buf[x + 12] = color16a; + dest_buf[x + 13] = color16a; + dest_buf[x + 14] = color16a; + dest_buf[x + 15] = color16a; + } + for(; x < w; x ++) { + dest_buf[x] = color16a; + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_OPA(dsc)) { + lv_color16a_t color16a; + color16a.lumi = lv_color_luminance(dsc->color); + color16a.alpha = opa; + lv_color16a_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color_16a_16a_mix(color16a, &dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_AL88_WITH_MASK(dsc)) { + lv_color16a_t color16a; + color16a.lumi = lv_color_luminance(dsc->color); + lv_color16a_t * dest_buf = (lv_color16a_t *)dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color16a.alpha = mask[x]; + lv_color_16a_16a_mix(color16a, &dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + + } + /*Masked with opacity*/ + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_AL88_MIX_MASK_OPA(dsc)) { + lv_color16a_t color16a; + color16a.lumi = lv_color_luminance(dsc->color); + lv_color16a_t * dest_buf = (lv_color16a_t *)dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color16a.alpha = LV_OPA_MIX2(mask[x], opa); + lv_color_16a_16a_mix(color16a, &dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_al88(lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + l8_image_blend(dsc); + break; +#endif + case LV_COLOR_FORMAT_AL88: + al88_image_blend(dsc); + break; +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; +#endif + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color16a_t * dest_buf_al88 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x, y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_al88[x].lumi = get_bit(src_buf_i1, x) * 255; + dest_buf_al88[x].alpha = 255; + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = get_bit(src_buf_i1, x) * 255; + src_color.alpha = opa; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = get_bit(src_buf_i1, x) * 255; + src_color.alpha = mask_buf[x]; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = get_bit(src_buf_i1, x) * 255; + src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = get_bit(src_buf_i1, x) * 255; + if(mask_buf == NULL) src_color.alpha = opa; + else src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_L8 +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color16a_t * dest_buf_al88 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_l8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x, y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_al88[x].lumi = src_buf_l8[x]; + dest_buf_al88[x].alpha = 255; + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = src_buf_l8[x]; + src_color.alpha = opa; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = src_buf_l8[x]; + src_color.alpha = mask_buf[x]; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = src_buf_l8[x]; + src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = src_buf_l8[x]; + if(mask_buf == NULL) src_color.alpha = opa; + else src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } +} + +#endif + +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color16a_t * dest_buf_al88 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16a_t * src_buf_al88 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x, y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color_16a_16a_mix(src_buf_al88[x], &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color = src_buf_al88[x]; + src_color.alpha = LV_OPA_MIX2(src_color.alpha, opa); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color = src_buf_al88[x]; + src_color.alpha = LV_OPA_MIX2(src_color.alpha, mask_buf[x]); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color = src_buf_al88[x]; + src_color.alpha = LV_OPA_MIX3(src_color.alpha, mask_buf[x], opa); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color = src_buf_al88[x]; + if(mask_buf == NULL) src_color.alpha = LV_OPA_MIX2(src_color.alpha, opa); + else src_color.alpha = LV_OPA_MIX3(src_color.alpha, mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } +} + +#if LV_DRAW_SW_SUPPORT_RGB565 + +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color16a_t * dest_buf_al88 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16_t * src_buf_c16 = (const lv_color16_t *)dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x, y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88(dsc)) { + for(y = 0; y < h; y++) { + + for(x = 0; x < w; x++) { + dest_buf_al88[x].lumi = lv_color16_luminance(src_buf_c16[x]); + dest_buf_al88[x].alpha = 255; + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = lv_color16_luminance(src_buf_c16[x]); + src_color.alpha = opa; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = lv_color16_luminance(src_buf_c16[x]); + src_color.alpha = mask_buf[x]; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = lv_color16_luminance(src_buf_c16[x]); + src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = lv_color16_luminance(src_buf_c16[x]); + if(mask_buf == NULL) src_color.alpha = opa; + else src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color16a_t * dest_buf_al88 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + /*Special case*/ + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_al88[dest_x].lumi = lv_color24_luminance(&src_buf_u8[src_x]); + dest_buf_al88[dest_x].alpha = 255; + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_u8 += src_stride; + } + } + } + if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc, dest_px_size, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + lv_color16a_t src_color; + src_color.lumi = lv_color24_luminance(&src_buf_u8[src_x]); + src_color.alpha = opa; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[dest_x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_u8 += src_stride; + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc, dest_px_size, src_px_size)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { + lv_color16a_t src_color; + src_color.lumi = lv_color24_luminance(&src_buf_u8[src_x]); + src_color.alpha = mask_buf[mask_x]; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[dest_x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc, dest_px_size, src_px_size)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { + lv_color16a_t src_color; + src_color.lumi = lv_color24_luminance(&src_buf_u8[src_x]); + src_color.alpha = LV_OPA_MIX2(mask_buf[mask_x], opa); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[dest_x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + lv_color16a_t src_color; + src_color.lumi = lv_color24_luminance(&src_buf_u8[src_x]); + if(mask_buf == NULL) src_color.alpha = opa; + else src_color.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + + blend_non_normal_pixel(&dest_buf_al88[dest_x], src_color, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_u8 += src_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color16a_t * dest_buf_al88 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = lv_color32_luminance(src_buf_c32[x]); + src_color.alpha = src_buf_c32[x].alpha; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = lv_color32_luminance(src_buf_c32[x]); + src_color.alpha = LV_OPA_MIX2(src_buf_c32[x].alpha, opa); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = lv_color32_luminance(src_buf_c32[x]); + src_color.alpha = LV_OPA_MIX2(src_buf_c32[x].alpha, mask_buf[x]); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = lv_color32_luminance(src_buf_c32[x]); + src_color.alpha = LV_OPA_MIX3(src_buf_c32[x].alpha, mask_buf[x], opa); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = lv_color32_luminance(src_buf_c32[x]); + src_color.alpha = src_buf_c32[x].alpha; + if(mask_buf == NULL) src_color.alpha = LV_OPA_MIX2(src_color.alpha, opa); + else src_color.alpha = LV_OPA_MIX3(src_color.alpha, mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#endif + +/** + * Check if two AL88 colors are equal + * @param c1 the first color + * @param c2 the second color + * @return true: equal + */ +static inline bool lv_color16a_eq(lv_color16a_t c1, lv_color16a_t c2) +{ + return *((uint16_t *)&c1) == *((uint16_t *)&c2); +} + +static inline lv_color16a_t LV_ATTRIBUTE_FAST_MEM lv_color_mix16a(lv_color16a_t fg, lv_color16a_t bg) +{ +#if 0 + if(fg.alpha >= LV_OPA_MAX) { + fg.alpha = bg.alpha; + return fg; + } + if(fg.alpha <= LV_OPA_MIN) { + return bg; + } +#endif + bg.lumi = (uint32_t)((uint32_t)fg.lumi * fg.alpha + (uint32_t)bg.lumi * (255 - fg.alpha)) >> 8; + return bg; +} + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_16a_16a_mix(lv_color16a_t fg, lv_color16a_t * bg, + lv_color_mix_alpha_cache_t * cache) +{ + /*Pick the foreground if it's fully opaque or the Background is fully transparent*/ + if(fg.alpha >= LV_OPA_MAX || bg->alpha <= LV_OPA_MIN) { + *bg = fg; + } + /*Transparent foreground: use the Background*/ + else if(fg.alpha <= LV_OPA_MIN) { + /* no need to copy */ + } + /*Opaque background: use simple mix*/ + else if(bg->alpha == 255) { + *bg = lv_color_mix16a(fg, *bg); + } + /*Both colors have alpha. Expensive calculation needs to be applied*/ + else { + /*Save the parameters and the result. If they will be asked again don't compute again*/ + + /*Update the ratio and the result alpha value if the input alpha values change*/ + if(bg->alpha != cache->bg_saved.alpha || fg.alpha != cache->fg_saved.alpha) { + /*Info: + * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/ + cache->res_alpha_saved = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg->alpha); + LV_ASSERT(cache->res_alpha_saved != 0); + cache->ratio_saved = (uint32_t)((uint32_t)fg.alpha * 255) / cache->res_alpha_saved; + } + + if(!lv_color16a_eq(*bg, cache->bg_saved) || !lv_color16a_eq(fg, cache->fg_saved)) { + cache->fg_saved = fg; + cache->bg_saved = *bg; + fg.alpha = cache->ratio_saved; + cache->res_saved = lv_color_mix16a(fg, *bg); + cache->res_saved.alpha = cache->res_alpha_saved; + } + + *bg = cache->res_saved; + } +} + +void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache) +{ + lv_memzero(&cache->fg_saved, sizeof(lv_color16a_t)); + lv_memzero(&cache->bg_saved, sizeof(lv_color16a_t)); + lv_memzero(&cache->res_saved, sizeof(lv_color16a_t)); + cache->res_alpha_saved = 255; + cache->ratio_saved = 255; +} + +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(lv_color16a_t * dest, lv_color16a_t src, + lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache) +{ + lv_color16a_t res; + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + res.lumi = LV_MIN(dest->lumi + src.lumi, 255); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res.lumi = LV_MAX(dest->lumi - src.lumi, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res.lumi = (dest->lumi * src.lumi) >> 8; + break; + case LV_BLEND_MODE_DIFFERENCE: + res.lumi = LV_ABS(dest->lumi - src.lumi); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + res.alpha = src.alpha; + lv_color_16a_16a_mix(res, dest, cache); +} + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#endif + +#endif diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h new file mode 100644 index 0000000..63197c9 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_al88.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_al88.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_AL88_H +#define LV_DRAW_SW_BLEND_TO_AL88_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_al88(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_al88(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_AL88_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c new file mode 100644 index 0000000..5932f56 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c @@ -0,0 +1,1368 @@ +/** + * @file lv_draw_sw_blend_to_argb8888.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_argb8888.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_color32_t fg_saved; + lv_color32_t bg_saved; + lv_color32_t res_saved; + lv_opa_t res_alpha_saved; + lv_opa_t ratio_saved; +} lv_color_mix_alpha_cache_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_DRAW_SW_SUPPORT_AL88 + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_32_mix(const uint8_t src, lv_color32_t * dest, uint8_t mix); + +static inline lv_color32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg, + lv_color_mix_alpha_cache_t * cache); + +static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src, + lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static inline lv_color16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color16_from_u16(uint16_t raw); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888 + #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_argb8888(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc)) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w - 15; x += 16) { + dest_buf[x + 0] = color32; + dest_buf[x + 1] = color32; + dest_buf[x + 2] = color32; + dest_buf[x + 3] = color32; + + dest_buf[x + 4] = color32; + dest_buf[x + 5] = color32; + dest_buf[x + 6] = color32; + dest_buf[x + 7] = color32; + + dest_buf[x + 8] = color32; + dest_buf[x + 9] = color32; + dest_buf[x + 10] = color32; + dest_buf[x + 11] = color32; + + dest_buf[x + 12] = color32; + dest_buf[x + 13] = color32; + dest_buf[x + 14] = color32; + dest_buf[x + 15] = color32; + } + for(; x < w; x ++) { + dest_buf[x] = color32; + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc)) { + lv_color32_t color_argb = lv_color_to_32(dsc->color, opa); + lv_color32_t * dest_buf = dsc->dest_buf; + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf[x] = lv_color_32_32_mix(color_argb, dest_buf[x], &cache); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc)) { + lv_color32_t color_argb = lv_color_to_32(dsc->color, 0xff); + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = mask[x]; + dest_buf[x] = lv_color_32_32_mix(color_argb, dest_buf[x], &cache); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } + /*Masked with opacity*/ + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + lv_color32_t color_argb = lv_color_to_32(dsc->color, opa); + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = LV_OPA_MIX2(mask[x], opa); + dest_buf[x] = lv_color_32_32_mix(color_argb, dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_swapped_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc); + break; +#endif + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + l8_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + al88_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; +#endif + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_c32[dest_x].alpha = chan_val; + dest_buf_c32[dest_x].red = chan_val; + dest_buf_c32[dest_x].green = chan_val; + dest_buf_c32[dest_x].blue = chan_val; + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_32_mix(chan_val, &dest_buf_c32[dest_x], opa); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_32_mix(chan_val, &dest_buf_c32[dest_x], mask_buf[src_x]); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_32_mix(chan_val, &dest_buf_c32[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + src_argb.red = get_bit(src_buf_i1, src_x) * 255; + src_argb.green = src_argb.red; + src_argb.blue = src_argb.red; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16a_t * src_buf_al88 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + /* + dest_buf_c32[dest_x].alpha = src_buf_al88[src_x].alpha; + dest_buf_c32[dest_x].red = src_buf_al88[src_x].lumi; + dest_buf_c32[dest_x].green = src_buf_al88[src_x].lumi; + dest_buf_c32[dest_x].blue = src_buf_al88[src_x].lumi; + */ + lv_color_8_32_mix(src_buf_al88[src_x].lumi, &dest_buf_c32[dest_x], src_buf_al88[src_x].alpha); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_32_mix(src_buf_al88[src_x].lumi, &dest_buf_c32[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_32_mix(src_buf_al88[src_x].lumi, &dest_buf_c32[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, + mask_buf[src_x])); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_32_mix(src_buf_al88[src_x].lumi, &dest_buf_c32[dest_x], LV_OPA_MIX3(src_buf_al88[src_x].alpha, + mask_buf[src_x], opa)); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + src_argb.red = src_buf_al88[src_x].lumi; + src_argb.green = src_buf_al88[src_x].lumi; + src_argb.blue = src_buf_al88[src_x].lumi; + if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa); + else src_argb.alpha = LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_l8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + dest_buf_c32[dest_x].alpha = 0xff; + dest_buf_c32[dest_x].red = src_buf_l8[src_x]; + dest_buf_c32[dest_x].green = src_buf_l8[src_x]; + dest_buf_c32[dest_x].blue = src_buf_l8[src_x]; + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_32_mix(src_buf_l8[src_x], &dest_buf_c32[dest_x], opa); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_32_mix(src_buf_l8[src_x], &dest_buf_c32[dest_x], mask_buf[src_x]); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_32_mix(src_buf_l8[src_x], &dest_buf_c32[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + src_argb.red = src_buf_l8[src_x]; + src_argb.green = src_buf_l8[src_x]; + src_argb.blue = src_buf_l8[src_x]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16_t * src_buf_c16 = (const lv_color16_t *) dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + + int32_t x; + int32_t y; + + LV_UNUSED(color_argb); + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL) { + lv_result_t accelerated; + if(opa >= LV_OPA_MAX) { + accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc); + } + else { + accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc); + } + if(LV_RESULT_INVALID == accelerated) { + color_argb.alpha = opa; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.red = (src_buf_c16[x].red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (src_buf_c16[x].green * 1037) >> 8; + color_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = mask_buf[x]; + color_argb.red = (src_buf_c16[x].red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (src_buf_c16[x].green * 1037) >> 8; + color_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); + color_argb.red = (src_buf_c16[x].red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (src_buf_c16[x].green * 1037) >> 8; + color_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + src_argb.red = (src_buf_c16[x].red * 2106) >> 8; + src_argb.green = (src_buf_c16[x].green * 1037) >> 8; + src_argb.blue = (src_buf_c16[x].blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_c32[x], src_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + +static void LV_ATTRIBUTE_FAST_MEM rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + LV_UNUSED(color_argb); + + uint16_t raw; + lv_color16_t px; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL) { + lv_result_t accelerated; + if(opa >= LV_OPA_MAX) { + accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc); + } + else { + accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc); + } + if(LV_RESULT_INVALID == accelerated) { + color_argb.alpha = opa; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + color_argb.red = (px.red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (px.green * 1037) >> 8; + color_argb.blue = (px.blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = mask_buf[x]; + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + color_argb.red = (px.red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (px.green * 1037) >> 8; + color_argb.blue = (px.blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + color_argb.red = (px.red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (px.green * 1037) >> 8; + color_argb.blue = (px.blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + src_argb.red = (px.red * 2106) >> 8; + src_argb.green = (px.green * 1037) >> 8; + src_argb.blue = (px.blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_c32[x], src_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t dest_x; + int32_t src_x; + int32_t y; + + LV_UNUSED(color_argb); + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + /*Special case*/ + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size)) { + if(src_px_size == 4) { + uint32_t line_in_bytes = w * 4; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_c32, src_buf, line_in_bytes); + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else if(src_px_size == 3) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 3) { + dest_buf_c32[dest_x].red = src_buf[src_x + 2]; + dest_buf_c32[dest_x].green = src_buf[src_x + 1]; + dest_buf_c32[dest_x].blue = src_buf[src_x + 0]; + dest_buf_c32[dest_x].alpha = 0xff; + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + } + } + if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size)) { + color_argb.alpha = opa; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + color_argb.red = src_buf[src_x + 2]; + color_argb.green = src_buf[src_x + 1]; + color_argb.blue = src_buf[src_x + 0]; + dest_buf_c32[dest_x] = lv_color_32_32_mix(color_argb, dest_buf_c32[dest_x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + color_argb.alpha = mask_buf[dest_x]; + color_argb.red = src_buf[src_x + 2]; + color_argb.green = src_buf[src_x + 1]; + color_argb.blue = src_buf[src_x + 0]; + dest_buf_c32[dest_x] = lv_color_32_32_mix(color_argb, dest_buf_c32[dest_x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + color_argb.alpha = (opa * mask_buf[dest_x]) >> 8; + color_argb.red = src_buf[src_x + 2]; + color_argb.green = src_buf[src_x + 1]; + color_argb.blue = src_buf[src_x + 0]; + dest_buf_c32[dest_x] = lv_color_32_32_mix(color_argb, dest_buf_c32[dest_x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + src_argb.red = src_buf[src_x + 2]; + src_argb.green = src_buf[src_x + 1]; + src_argb.blue = src_buf[src_x + 0]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + + blend_non_normal_pixel(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } +} + +#endif + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_c32[x] = lv_color_32_32_mix(src_buf_c32[x], dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, mask_buf[x]); + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, opa, mask_buf[x]); + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + if(mask_buf == NULL) color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + else color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_c32[x], color_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + /* Process the normal blend mode (for premultiplied alpha) */ + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + + /* Blend with destination */ + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + } + + /* Blend with destination */ + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, mask_buf[x]); + } + + /* Blend with destination */ + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, opa, mask_buf[x]); + } + + /* Blend with destination */ + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + if(mask_buf == NULL) { + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + } + else { + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + } + + /* Blend with destination using non-normal blend mode */ + blend_non_normal_pixel(&dest_buf_c32[x], color_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#endif + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_32_mix(const uint8_t src, lv_color32_t * dest, uint8_t mix) +{ + + if(mix == 0) return; + + dest->alpha = 255; + if(mix >= LV_OPA_MAX) { + dest->red = src; + dest->green = src; + dest->blue = src; + } + else { + lv_opa_t mix_inv = 255 - mix; + dest->red = (uint32_t)((uint32_t)src * mix + dest->red * mix_inv) >> 8; + dest->green = (uint32_t)((uint32_t)src * mix + dest->green * mix_inv) >> 8; + dest->blue = (uint32_t)((uint32_t)src * mix + dest->blue * mix_inv) >> 8; + } +} + +static inline lv_color32_t LV_ATTRIBUTE_FAST_MEM lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg, + lv_color_mix_alpha_cache_t * cache) +{ + /*Pick the foreground if it's fully opaque or the Background is fully transparent*/ + if(fg.alpha >= LV_OPA_MAX || bg.alpha <= LV_OPA_MIN) { + return fg; + } + /*Transparent foreground: use the Background*/ + else if(fg.alpha <= LV_OPA_MIN) { + return bg; + } + /*Opaque background: use simple mix*/ + else if(bg.alpha == 255) { + return lv_color_mix32(fg, bg); + } + /*Both colors have alpha. Expensive calculation need to be applied*/ + else { + /*Save the parameters and the result. If they will be asked again don't compute again*/ + + /*Update the ratio and the result alpha value if the input alpha values change*/ + if(bg.alpha != cache->bg_saved.alpha || fg.alpha != cache->fg_saved.alpha) { + /*Info: + * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/ + cache->res_alpha_saved = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha); + LV_ASSERT(cache->res_alpha_saved != 0); + cache->ratio_saved = (uint32_t)((uint32_t)fg.alpha * 255) / cache->res_alpha_saved; + } + + if(!lv_color32_eq(bg, cache->bg_saved) || !lv_color32_eq(fg, cache->fg_saved)) { + cache->fg_saved = fg; + cache->bg_saved = bg; + fg.alpha = cache->ratio_saved; + cache->res_saved = lv_color_mix32(fg, bg); + cache->res_saved.alpha = cache->res_alpha_saved; + } + + return cache->res_saved; + } +} + +void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache) +{ + lv_memzero(&cache->fg_saved, sizeof(lv_color32_t)); + lv_memzero(&cache->bg_saved, sizeof(lv_color32_t)); + lv_memzero(&cache->res_saved, sizeof(lv_color32_t)); + cache->res_alpha_saved = 255; + cache->ratio_saved = 255; +} + +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src, + lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache) +{ + lv_color32_t res; + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + res.red = LV_MIN(dest->red + src.red, 255); + res.green = LV_MIN(dest->green + src.green, 255); + res.blue = LV_MIN(dest->blue + src.blue, 255); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res.red = LV_MAX(dest->red - src.red, 0); + res.green = LV_MAX(dest->green - src.green, 0); + res.blue = LV_MAX(dest->blue - src.blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res.red = (dest->red * src.red) >> 8; + res.green = (dest->green * src.green) >> 8; + res.blue = (dest->blue * src.blue) >> 8; + break; + case LV_BLEND_MODE_DIFFERENCE: + res.red = LV_ABS(dest->red - src.red); + res.green = LV_ABS(dest->green - src.green); + res.blue = LV_ABS(dest->blue - src.blue); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + res.alpha = src.alpha; + *dest = lv_color_32_32_mix(res, *dest, cache); +} + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static inline lv_color16_t LV_ATTRIBUTE_FAST_MEM lv_color16_from_u16(uint16_t raw) +{ + lv_color16_t c; + c.red = (raw >> 11) & 0x1F; + c.green = (raw >> 5) & 0x3F; + c.blue = raw & 0x1F; + return c; +} +#endif + +#endif /* LV_DRAW_SW_SUPPORT_ARGB8888 */ + +#endif /* LV_USE_DRAW_SW */ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h new file mode 100644 index 0000000..2046c23 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_argb8888.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_ARGB8888_H +#define LV_DRAW_SW_BLEND_TO_ARGB8888_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_argb8888(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_argb8888(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_ARGB8888_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.c new file mode 100644 index 0000000..a74863a --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.c @@ -0,0 +1,839 @@ +/** + * @file lv_draw_sw_blend_to_argb8888_premultiplied.c + * @brief Implementation of ARGB8888 Premultiplied blending for LVGL. + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_argb8888_premultiplied.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_color32_t fg_saved; + lv_color32_t bg_saved; + lv_color32_t res_saved; + lv_opa_t res_alpha_saved; + lv_opa_t ratio_saved; +} lv_color_mix_alpha_cache_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); +#endif + +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel_premultiplied( + lv_color32_t * dest, lv_color32_t src, lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache); + +static inline lv_color32_t lv_color_32_32_mix_premul(lv_color32_t fg, lv_color32_t bg, + lv_color_mix_alpha_cache_t * cache); + +static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ +/** + * @brief Blend a solid color into an ARGB8888 premultiplied buffer. + * + * This function applies a solid color to the destination buffer with optional + * opacity and masking. The input color is first converted to a premultiplied + * alpha format before blending. + * + * @param dsc Blending descriptor containing destination buffer, color, and opacity + */ +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_argb8888_premultiplied(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + /* Convert source color to premultiplied */ + if(opa >= LV_OPA_MAX) opa = 0xff; + lv_color32_t color_argb = lv_color_to_32(dsc->color, opa); + lv_color32_t color_argb_premul; + if(opa == 0xff) { + color_argb_premul = color_argb; + } + else { + color_argb_premul.alpha = opa; + color_argb_premul.red = (color_argb.red * opa) >> 8; + color_argb_premul.green = (color_argb.green * opa) >> 8; + color_argb_premul.blue = (color_argb.blue * opa) >> 8; + } + + /* Simple fill */ + if(mask == NULL && opa >= LV_OPA_MAX) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint32_t * dest_buf = dsc->dest_buf; + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf[x] = color32; + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + /* Opacity only */ + else if(mask == NULL && opa < LV_OPA_MAX) { + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf[x] = lv_color_32_32_mix_premul(color_argb_premul, dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + /* Masked fill */ + else if(mask && opa >= LV_OPA_MAX) { + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color32_t color_premul = color_argb; + if(mask[x] >= LV_OPA_MAX) { + dest_buf[x] = lv_color_32_32_mix_premul(color_premul, dest_buf[x], &cache); + } + else if(mask[x] > LV_OPA_MIN) { + color_premul.alpha = mask[x]; + color_premul.red = (color_premul.red * color_premul.alpha) >> 8; + color_premul.green = (color_premul.green * color_premul.alpha) >> 8; + color_premul.blue = (color_premul.blue * color_premul.alpha) >> 8; + dest_buf[x] = lv_color_32_32_mix_premul(color_premul, dest_buf[x], &cache); + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + /* Masked with opacity */ + else { + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color32_t color_premul = color_argb; + lv_opa_t alpha = LV_OPA_MIX2(mask[x], opa); + if(alpha >= LV_OPA_MAX) { + dest_buf[x] = lv_color_32_32_mix_premul(color_premul, dest_buf[x], &cache); + } + else if(mask[x] > LV_OPA_MIN) { + color_premul.alpha = alpha; + color_premul.red = (color_premul.red * color_premul.alpha) >> 8; + color_premul.green = (color_premul.green * color_premul.alpha) >> 8; + color_premul.blue = (color_premul.blue * color_premul.alpha) >> 8; + dest_buf[x] = lv_color_32_32_mix_premul(color_premul, dest_buf[x], &cache); + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } +} + +/** + * @brief Blend an image into an ARGB8888 premultiplied buffer. + * + * This function blends an image stored in ARGB8888 premultiplied format + * into the destination buffer. It accounts for opacity and optional masking. + * + * @param dsc Blending descriptor containing source and destination buffer information + */ +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888_premultiplied(lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; +#endif + +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; +#endif + + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc); + break; + + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x, y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + if(color_argb.alpha >= LV_OPA_MAX) { + color_argb.alpha = 0xff; + dest_buf_c32[x] = color_argb; + } + else if(color_argb.alpha > LV_OPA_MIN) { + /*Premultiplication can cause loss of precision which can result slightly + *darker color when blending the same color to the background.*/ + if(dest_buf_c32[x].red != color_argb.red || + dest_buf_c32[x].green != color_argb.green || + dest_buf_c32[x].blue != color_argb.blue || + dest_buf_c32[x].alpha != color_argb.alpha) { + + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + } + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Apply global opacity */ + lv_opa_t alpha = LV_OPA_MIX2(color_argb.alpha, opa); + + if(alpha >= LV_OPA_MAX) { + color_argb.alpha = 0xff; + dest_buf_c32[x] = color_argb; + } + else if(alpha > LV_OPA_MIN) { + /*Premultiplication can cause loss of precision which can result slightly + *darker color when blending the same color to the background.*/ + if(dest_buf_c32[x].red != color_argb.red || + dest_buf_c32[x].green != color_argb.green || + dest_buf_c32[x].blue != color_argb.blue || + dest_buf_c32[x].alpha != color_argb.alpha) { + color_argb.alpha = alpha; + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + } + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Apply mask opacity */ + lv_opa_t alpha = LV_OPA_MIX2(color_argb.alpha, mask_buf[x]); + + if(alpha >= LV_OPA_MAX) { + color_argb.alpha = 0xff; + dest_buf_c32[x] = color_argb; + } + else if(alpha > LV_OPA_MIN) { + /*Premultiplication can cause loss of precision which can result slightly + *darker color when blending the same color to the background.*/ + if(dest_buf_c32[x].red != color_argb.red || + dest_buf_c32[x].green != color_argb.green || + dest_buf_c32[x].blue != color_argb.blue || + dest_buf_c32[x].alpha != color_argb.alpha) { + color_argb.alpha = alpha; + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + } + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Apply both mask and global opacity */ + lv_opa_t alpha = LV_OPA_MIX3(color_argb.alpha, opa, mask_buf[x]); + + if(alpha >= LV_OPA_MAX) { + color_argb.alpha = 0xff; + dest_buf_c32[x] = color_argb; + } + else if(alpha > LV_OPA_MIN) { + /*Premultiplication can cause loss of precision which can result slightly + *darker color when blending the same color to the background.*/ + if(dest_buf_c32[x].red != color_argb.red || + dest_buf_c32[x].green != color_argb.green || + dest_buf_c32[x].blue != color_argb.blue || + dest_buf_c32[x].alpha != color_argb.alpha) { + color_argb.alpha = alpha; + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + } + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Apply mask and/or opacity */ + if(mask_buf == NULL) + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + else + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + blend_non_normal_pixel_premultiplied(&dest_buf_c32[x], color_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) +{ + + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t dest_x; + int32_t src_x; + int32_t y; + + LV_UNUSED(color_argb); + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + /*Special case*/ + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(dsc, src_px_size)) { + if(src_px_size == 4) { + uint32_t line_in_bytes = w * 4; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_c32, src_buf, line_in_bytes); + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else if(src_px_size == 3) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 3) { + dest_buf_c32[dest_x].red = src_buf[src_x + 2]; + dest_buf_c32[dest_x].green = src_buf[src_x + 1]; + dest_buf_c32[dest_x].blue = src_buf[src_x + 0]; + dest_buf_c32[dest_x].alpha = 0xff; + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + } + } + if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(dsc, src_px_size)) { + color_argb.alpha = opa; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + color_argb.red = (src_buf[src_x + 2] * color_argb.alpha) >> 8; + color_argb.green = (src_buf[src_x + 1] * color_argb.alpha) >> 8; + color_argb.blue = (src_buf[src_x + 0] * color_argb.alpha) >> 8; + dest_buf_c32[dest_x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[dest_x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + color_argb.alpha = mask_buf[dest_x]; + color_argb.red = (src_buf[src_x + 2] * color_argb.alpha) >> 8; + color_argb.green = (src_buf[src_x + 1] * color_argb.alpha) >> 8; + color_argb.blue = (src_buf[src_x + 0] * color_argb.alpha) >> 8; + dest_buf_c32[dest_x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[dest_x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + color_argb.alpha = (opa * mask_buf[dest_x]) >> 8; + color_argb.red = (src_buf[src_x + 2] * color_argb.alpha) >> 8; + color_argb.green = (src_buf[src_x + 1] * color_argb.alpha) >> 8; + color_argb.blue = (src_buf[src_x + 0] * color_argb.alpha) >> 8; + dest_buf_c32[dest_x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[dest_x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + src_argb.red = src_buf[src_x + 2]; + src_argb.green = src_buf[src_x + 1]; + src_argb.blue = src_buf[src_x + 0]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + + blend_non_normal_pixel_premultiplied(&dest_buf_c32[dest_x], src_argb, dsc->blend_mode, &cache); + } + + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } +} + +#endif + + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x, y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_c32[x] = lv_color_32_32_mix_premul(src_buf_c32[x], dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Unpremultiply the source color by using the reciprocal of the alpha */ + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + + /* Apply global opacity */ + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Unpremultiply the source color by using the reciprocal of the alpha */ + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + /* Adjust alpha using mask */ + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, mask_buf[x]); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Unpremultiply the source color by using the reciprocal of the alpha */ + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + + /* Adjust alpha using both mask and opacity */ + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, opa, mask_buf[x]); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Unpremultiply the source color by using the reciprocal of the alpha */ + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + + /* Adjust alpha if needed */ + if(mask_buf == NULL) + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + else + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + blend_non_normal_pixel_premultiplied(&dest_buf_c32[x], color_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +/** + * @brief Mix two ARGB8888 premultiplied colors. + * + * This function blends the foreground (`fg`) and background (`bg`) colors. + * The foreground color is assumed to be premultiplied. + * + * @param fg Foreground color (premultiplied alpha) + * @param bg Background color + * @param cache Alpha blending cache for optimization + * @return lv_color32_t Blended color result + */ +static inline lv_color32_t lv_color_32_32_mix_premul(lv_color32_t fg, lv_color32_t bg, + lv_color_mix_alpha_cache_t * cache) +{ + /*Pick the foreground if it's fully opaque or the background is fully transparent*/ + if(fg.alpha >= LV_OPA_MAX || bg.alpha <= LV_OPA_MIN) { + return fg; + } + /* Transparent foreground: use the background */ + else if(fg.alpha <= LV_OPA_MIN) { + return bg; + } + /* Opaque background: use simple mix */ + else if(bg.alpha == 255) { + return lv_color_mix32_premultiplied(fg, bg); + } + else { + /* Check cache to avoid redundant calculations */ + if(bg.alpha != cache->bg_saved.alpha || fg.alpha != cache->fg_saved.alpha) { + /* Compute final alpha value */ + cache->res_alpha_saved = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha); + LV_ASSERT(cache->res_alpha_saved != 0); + + /* Compute premultiplied blending ratio */ + cache->ratio_saved = (uint32_t)((uint32_t)fg.alpha * 255) / cache->res_alpha_saved; + } + + /* Check if color blending is already cached */ + if(!lv_color32_eq(bg, cache->bg_saved) || !lv_color32_eq(fg, cache->fg_saved)) { + cache->fg_saved = fg; + cache->bg_saved = bg; + + /* Blend using premultiplied alpha */ + uint32_t inv_fg_alpha = 255 - fg.alpha; + cache->res_saved.red = fg.red + ((bg.red * inv_fg_alpha) >> 8); + cache->res_saved.green = fg.green + ((bg.green * inv_fg_alpha) >> 8); + cache->res_saved.blue = fg.blue + ((bg.blue * inv_fg_alpha) >> 8); + cache->res_saved.alpha = cache->res_alpha_saved; + } + + return cache->res_saved; + } +} + +static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache) +{ + lv_memzero(&cache->fg_saved, sizeof(lv_color32_t)); + lv_memzero(&cache->bg_saved, sizeof(lv_color32_t)); + lv_memzero(&cache->res_saved, sizeof(lv_color32_t)); + cache->res_alpha_saved = 255; + cache->ratio_saved = 255; +} + + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel_premultiplied( + lv_color32_t * dest, lv_color32_t src, lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache) +{ + lv_color32_t res; + uint8_t src_alpha = src.alpha; /* Premultiplied alpha of source */ + uint8_t dest_alpha = dest->alpha; + + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + /* Ensure RGB remains premultiplied */ + res.red = LV_MIN(dest->red + src.red, dest_alpha); + res.green = LV_MIN(dest->green + src.green, dest_alpha); + res.blue = LV_MIN(dest->blue + src.blue, dest_alpha); + break; + + case LV_BLEND_MODE_SUBTRACTIVE: + /* Ensure RGB remains non-negative and premultiplied */ + res.red = LV_MAX(dest->red - src.red, 0); + res.green = LV_MAX(dest->green - src.green, 0); + res.blue = LV_MAX(dest->blue - src.blue, 0); + break; + + case LV_BLEND_MODE_MULTIPLY: + /* Adjusted for premultiplied alpha: scale the result properly */ + res.red = ((dest->red * src.red) / LV_MAX(src_alpha, 1)); + res.green = ((dest->green * src.green) / LV_MAX(src_alpha, 1)); + res.blue = ((dest->blue * src.blue) / LV_MAX(src_alpha, 1)); + break; + + case LV_BLEND_MODE_DIFFERENCE: + res.red = LV_ABS(dest->red - src.red); + res.green = LV_ABS(dest->green - src.green); + res.blue = LV_ABS(dest->blue - src.blue); + break; + + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + + res.alpha = src_alpha; /* Keep the alpha from premultiplied source */ + *dest = lv_color_32_32_mix_premul(res, *dest, cache); +} + +#endif /* LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED */ + +#endif /* LV_USE_DRAW_SW */ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.h new file mode 100644 index 0000000..211f5f1 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_argb8888_premultiplied.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_ARGB8888_PREMULTIPLIED_H +#define LV_DRAW_SW_BLEND_TO_ARGB8888_PREMULTIPLIED_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_argb8888_premultiplied(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_argb8888_premultiplied(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_ARGB8888_PREMULTIPLIED_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c new file mode 100644 index 0000000..7fe446c --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c @@ -0,0 +1,1287 @@ +/** + * @file lv_draw_sw_blend_to_i1.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_i1.h" +#if LV_USE_DRAW_SW + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +#if LV_DRAW_SW_SUPPORT_L8 + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * dest_buf, int32_t dest_x, + lv_color32_t src, + lv_blend_mode_t mode); + + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ set_bit(uint8_t * buf, int32_t bit_idx); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ clear_bit(uint8_t * buf, int32_t bit_idx); + +static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static inline lv_color16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color16_from_u16(uint16_t raw); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#define I1_LUM_THRESHOLD LV_DRAW_SW_I1_LUM_THRESHOLD + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1 + #define LV_DRAW_SW_COLOR_BLEND_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_i1(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + uint8_t src_color = lv_color_luminance(dsc->color) / (I1_LUM_THRESHOLD + 1); + uint8_t * dest_buf = dsc->dest_buf; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + /* Simple fill */ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1(dsc)) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x++) { + if(src_color) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /* Opacity only */ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_OPA(dsc)) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x++) { + uint8_t * dest_bit = &dest_buf[(x + bit_ofs) / 8]; + uint8_t current_bit = (*dest_bit >> (7 - ((x + bit_ofs) % 8))) & 0x01; + uint8_t new_bit = (opa * src_color + (255 - opa) * current_bit) / 255; + if(new_bit) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /* Masked with full opacity */ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_MASK(dsc)) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x++) { + uint8_t mask_val = mask[x]; + if(mask_val == LV_OPA_TRANSP) continue; + if(mask_val == LV_OPA_COVER) { + if(src_color) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + else { + uint8_t * dest_bit = &dest_buf[(x + bit_ofs) / 8]; + uint8_t current_bit = (*dest_bit >> (7 - ((x + bit_ofs) % 8))) & 0x01; + uint8_t new_bit = (mask_val * src_color + (255 - mask_val) * current_bit) / 255; + if(new_bit) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } + /* Masked with opacity */ + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1_MIX_MASK_OPA(dsc)) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x++) { + uint8_t mask_val = mask[x]; + if(mask_val == LV_OPA_TRANSP) continue; + uint8_t * dest_bit = &dest_buf[(x + bit_ofs) / 8]; + uint8_t current_bit = (*dest_bit >> (7 - ((x + bit_ofs) % 8))) & 0x01; + uint8_t blended_opa = (mask_val * opa) / 255; + uint8_t new_bit = (blended_opa * src_color + (255 - blended_opa) * current_bit) / 255; + if(new_bit) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_i1(lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_swapped_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + l8_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + al88_image_blend(dsc); + break; +#endif + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_i1 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + if(get_bit(src_buf_i1, src_x)) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src = get_bit(src_buf_i1, src_x); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs); + uint8_t blended = (src * opa + dest * (255 - opa)); + if(blended > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t mask_val = mask_buf[src_x]; + uint8_t src = get_bit(src_buf_i1, src_x); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs); + uint8_t blended = (src * mask_val + dest * (255 - mask_val)); + if(blended > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t mask_val = mask_buf[src_x]; + if(mask_val == LV_OPA_TRANSP) continue; + uint8_t src = get_bit(src_buf_i1, src_x); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs); + uint8_t blend_opa = LV_OPA_MIX2(mask_val, opa); + uint8_t blended = (src * blend_opa + dest * (255 - blend_opa)); + if(blended > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + src_argb.red = get_bit(src_buf_i1, src_x) * 255; + src_argb.green = src_argb.red; + src_argb.blue = src_argb.red; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(dest_buf_i1, dest_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } +} + +#if LV_DRAW_SW_SUPPORT_L8 +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_i1 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_l8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t src_x, dest_x; + int32_t y; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + if(src_buf_l8[src_x] > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_l8[src_x], &dest_val, opa); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src_luminance = src_buf_l8[src_x]; + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_luminance, &dest_val, mask_buf[src_x]); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src_luminance = src_buf_l8[src_x]; + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_luminance, &dest_val, LV_OPA_MIX2(mask_buf[src_x], opa)); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(src_x = 0; src_x < w; src_x++) { + src_argb.red = src_buf_l8[src_x]; + src_argb.green = src_buf_l8[src_x]; + src_argb.blue = src_buf_l8[src_x]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + blend_non_normal_pixel(dest_buf_i1, src_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_i1 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16a_t * src_buf_al88 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, src_buf_al88[src_x].alpha); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, LV_OPA_MIX2(src_buf_al88[src_x].alpha, mask_buf[src_x])); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[src_x], opa)); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + src_argb.red = src_buf_al88[src_x].lumi; + src_argb.green = src_buf_al88[src_x].lumi; + src_argb.blue = src_buf_al88[src_x].lumi; + if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa); + else src_argb.alpha = LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[src_x], opa); + blend_non_normal_pixel(dest_buf_i1, dest_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_i1 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t x; + int32_t y; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint8_t src = lv_color32_luminance(src_buf_c32[x]); + uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, src_buf_c32[x].alpha); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint8_t src = lv_color32_luminance(src_buf_c32[x]); + uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(opa, src_buf_c32[x].alpha)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint8_t src = lv_color32_luminance(src_buf_c32[x]); + uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[x], src_buf_c32[x].alpha)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint8_t src = lv_color32_luminance(src_buf_c32[x]); + uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX3(opa, mask_buf[x], src_buf_c32[x].alpha)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color32_t color_argb = src_buf_c32[x]; + if(mask_buf == NULL) color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + else color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + blend_non_normal_pixel(dest_buf_i1, x + bit_ofs, color_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_i1 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_rgb888 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + /*Special case*/ + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); + if(src > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, opa); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { + uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, mask_buf[mask_x]); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { + uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[mask_x], opa)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); + mask_buf += mask_stride; + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + src_argb.red = src_buf_rgb888[src_x + 2]; + src_argb.green = src_buf_rgb888[src_x + 1]; + src_argb.blue = src_buf_rgb888[src_x + 0]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + + blend_non_normal_pixel(dest_buf_i1, dest_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); + } + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16_t * src_buf_c16 = (const lv_color16_t *)dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + int32_t src_x; + int32_t dest_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); + if(src > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); + uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, opa); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x++) { + uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); + uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, mask_buf[mask_x]); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x++) { + uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); + uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[mask_x], opa)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x++) { + src_argb.red = (src_buf_c16[src_x].red * 2106) >> 8; + src_argb.green = (src_buf_c16[src_x].green * 1037) >> 8; + src_argb.blue = (src_buf_c16[src_x].blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + + blend_non_normal_pixel(dest_buf_u8, dest_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static void LV_ATTRIBUTE_FAST_MEM rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + int32_t src_x; + int32_t dest_x; + int32_t y; + lv_color16_t px; + + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + uint8_t src = lv_color16_luminance(px); + if(src > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + uint8_t src = lv_color16_luminance(px); + uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, opa); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + uint8_t src = lv_color16_luminance(px); + uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, mask_buf[mask_x]); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + uint8_t src = lv_color16_luminance(px); + uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[mask_x], opa)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + src_argb.red = (px.red * 2106) >> 8; + src_argb.green = (px.green * 1037) >> 8; + src_argb.blue = (px.blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + + blend_non_normal_pixel(dest_buf_u8, dest_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } +} +#endif + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest_buf, int32_t dest_x, lv_color32_t src, + lv_blend_mode_t mode) +{ + uint8_t res; + int32_t src_lumi = lv_color32_luminance(src); + uint8_t dest_lumi = get_bit(dest_buf, dest_x) * 255; + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + res = LV_MIN(dest_lumi + src_lumi, 255); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = LV_MAX(dest_lumi - src_lumi, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = (dest_lumi * src_lumi) >> 8; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = LV_ABS(dest_lumi - src_lumi); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + + lv_color_8_8_mix(res, &dest_lumi, src.alpha); + if(dest_lumi > I1_LUM_THRESHOLD) { + set_bit(dest_buf, dest_x); + } + else { + clear_bit(dest_buf, dest_x); + } +} + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix) +{ + + if(mix == 0) return; + + if(mix >= LV_OPA_MAX) { + *dest = src; + } + else { + lv_opa_t mix_inv = 255 - mix; + *dest = (uint32_t)((uint32_t)src * mix + dest[0] * mix_inv) >> 8; + } +} + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +static inline void LV_ATTRIBUTE_FAST_MEM set_bit(uint8_t * buf, int32_t bit_idx) +{ + buf[bit_idx / 8] |= (1 << (7 - (bit_idx % 8))); +} + +static inline void LV_ATTRIBUTE_FAST_MEM clear_bit(uint8_t * buf, int32_t bit_idx) +{ + buf[bit_idx / 8] &= ~(1 << (7 - (bit_idx % 8))); +} + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static inline lv_color16_t LV_ATTRIBUTE_FAST_MEM lv_color16_from_u16(uint16_t raw) +{ + lv_color16_t c; + c.red = (raw >> 11) & 0x1F; + c.green = (raw >> 5) & 0x3F; + c.blue = raw & 0x1F; + return c; +} +#endif + +#endif diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h new file mode 100644 index 0000000..5d72523 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_i1.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_I1_H +#define LV_DRAW_SW_BLEND_TO_I1_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_i1(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_i1(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_I1_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c new file mode 100644 index 0000000..99b438d --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c @@ -0,0 +1,1023 @@ +/** + * @file lv_draw_sw_blend_to_l8.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_l8.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_L8 + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + +static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +#if LV_DRAW_SW_SUPPORT_AL88 + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend_swapped(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, + lv_blend_mode_t mode); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static inline lv_color16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color16_from_u16(uint16_t raw); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_L8 + #define LV_DRAW_SW_COLOR_BLEND_TO_L8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_L8_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8 + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_MASK + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_MIX_MASK_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8 + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_l8(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_L8(dsc)) { + uint8_t color8 = lv_color_luminance(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w - 16; x += 16) { + dest_buf[x + 0] = color8; + dest_buf[x + 1] = color8; + dest_buf[x + 2] = color8; + dest_buf[x + 3] = color8; + + dest_buf[x + 4] = color8; + dest_buf[x + 5] = color8; + dest_buf[x + 6] = color8; + dest_buf[x + 7] = color8; + + dest_buf[x + 8] = color8; + dest_buf[x + 9] = color8; + dest_buf[x + 10] = color8; + dest_buf[x + 11] = color8; + + dest_buf[x + 12] = color8; + dest_buf[x + 13] = color8; + dest_buf[x + 14] = color8; + dest_buf[x + 15] = color8; + } + for(; x < w; x ++) { + dest_buf[x] = color8; + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_OPA(dsc)) { + uint8_t color8 = lv_color_luminance(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color_8_8_mix(color8, &dest_buf[x], opa); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_L8_WITH_MASK(dsc)) { + uint8_t color8 = lv_color_luminance(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color_8_8_mix(color8, &dest_buf[x], mask[x]); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + + } + /*Masked with opacity*/ + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_L8_MIX_MASK_OPA(dsc)) { + uint8_t color8 = lv_color_luminance(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color_8_8_mix(color8, &dest_buf[x], LV_OPA_MIX2(mask[x], opa)); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_l8(lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_image_blend_swapped(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#endif + case LV_COLOR_FORMAT_L8: + l8_image_blend(dsc); + break; +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + al88_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; +#endif + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_l8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], opa); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], opa); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], mask_buf[src_x]); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + src_argb.red = get_bit(src_buf_i1, src_x) * 255; + src_argb.green = src_argb.red; + src_argb.blue = src_argb.red; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_l8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } +} +#endif + +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_l8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_l8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8(dsc)) { + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_l8, src_buf_l8, w); + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(src_buf_l8[src_x], &dest_buf_l8[dest_x], opa); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(src_buf_l8[src_x], &dest_buf_l8[dest_x], mask_buf[src_x]); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(src_buf_l8[src_x], &dest_buf_l8[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + src_argb.red = src_buf_l8[src_x]; + src_argb.green = src_buf_l8[src_x]; + src_argb.blue = src_buf_l8[src_x]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_l8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } +} + +#if LV_DRAW_SW_SUPPORT_AL88 + +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_l8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16a_t * src_buf_al88 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_buf_l8[dest_x], src_buf_al88[src_x].alpha); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_buf_l8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_buf_l8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, + mask_buf[src_x])); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_buf_l8[dest_x], LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[src_x], + opa)); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + src_argb.red = src_buf_al88[src_x].lumi; + src_argb.green = src_buf_al88[src_x].lumi; + src_argb.blue = src_buf_al88[src_x].lumi; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_l8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16_t * src_buf_c16 = (const lv_color16_t *)dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + + int32_t src_x; + int32_t dest_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + dest_buf_u8[dest_x] = lv_color16_luminance(src_buf_c16[src_x]); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(lv_color16_luminance(src_buf_c16[src_x]), &dest_buf_u8[dest_x], opa); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(lv_color16_luminance(src_buf_c16[src_x]), &dest_buf_u8[dest_x], mask_buf[src_x]); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + lv_color_8_8_mix(lv_color16_luminance(src_buf_c16[src_x]), &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x++) { + src_argb.red = (src_buf_c16[src_x].red * 2106) >> 8; + src_argb.green = (src_buf_c16[src_x].green * 1037) >> 8; + src_argb.blue = (src_buf_c16[src_x].blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend_swapped(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t src_x; + int32_t dest_x; + int32_t y; + + uint16_t raw; + lv_color16_t px; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + dest_buf_u8[dest_x] = lv_color16_luminance(px); + } + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + lv_color_8_8_mix(lv_color16_luminance(px), &dest_buf_u8[dest_x], opa); + } + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + lv_color_8_8_mix(lv_color16_luminance(px), &dest_buf_u8[dest_x], mask_buf[src_x]); + } + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + lv_color_8_8_mix(lv_color16_luminance(px), &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); + } + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + src_argb.red = (px.red * 2106) >> 8; + src_argb.green = (px.green * 1037) >> 8; + src_argb.blue = (px.blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_l8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + /*Special case*/ + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_l8[dest_x] = lv_color24_luminance(&src_buf_u8[src_x]); + } + dest_buf_l8 += dest_stride; + src_buf_u8 += src_stride; + } + } + } + if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_OPA(dsc, dest_px_size, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + lv_color_8_8_mix(lv_color24_luminance(&src_buf_u8[src_x]), &dest_buf_l8[dest_x], opa); + } + dest_buf_l8 += dest_stride; + src_buf_u8 += src_stride; + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_WITH_MASK(dsc, dest_px_size, src_px_size)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { + lv_color_8_8_mix(lv_color24_luminance(&src_buf_u8[src_x]), &dest_buf_l8[dest_x], mask_buf[mask_x]); + } + dest_buf_l8 += dest_stride; + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc, dest_px_size, src_px_size)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { + lv_color_8_8_mix(lv_color24_luminance(&src_buf_u8[src_x]), &dest_buf_l8[dest_x], LV_OPA_MIX2(opa, mask_buf[mask_x])); + } + dest_buf_l8 += dest_stride; + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + src_argb.red = src_buf_u8[src_x + 2]; + src_argb.green = src_buf_u8[src_x + 1]; + src_argb.blue = src_buf_u8[src_x + 0]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + + + blend_non_normal_pixel(&dest_buf_l8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_l8 += dest_stride; + src_buf_u8 += src_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_l8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color_8_8_mix(lv_color32_luminance(src_buf_c32[x]), &dest_buf_l8[x], src_buf_c32[x].alpha); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color_8_8_mix(lv_color32_luminance(src_buf_c32[x]), &dest_buf_l8[x], LV_OPA_MIX2(src_buf_c32[x].alpha, opa)); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color_8_8_mix(lv_color32_luminance(src_buf_c32[x]), &dest_buf_l8[x], LV_OPA_MIX2(src_buf_c32[x].alpha, mask_buf[x])); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color_8_8_mix(lv_color32_luminance(src_buf_c32[x]), &dest_buf_l8[x], LV_OPA_MIX3(src_buf_c32[x].alpha, opa, + mask_buf[x])); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color32_t color_argb = src_buf_c32[x]; + if(mask_buf == NULL) color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + else color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_l8[x], color_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#endif + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix) +{ + + if(mix == 0) return; + + if(mix >= LV_OPA_MAX) { + *dest = src; + } + else { + lv_opa_t mix_inv = 255 - mix; + *dest = (uint32_t)((uint32_t)src * mix + dest[0] * mix_inv) >> 8; + } +} + +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode) +{ + uint8_t res; + int32_t src_lumi = lv_color32_luminance(src); + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + res = LV_MIN(*dest + src_lumi, 255); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = LV_MAX(*dest - src_lumi, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = (*dest * src_lumi) >> 8; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = LV_ABS(*dest - src_lumi); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + lv_color_8_8_mix(res, dest, src.alpha); +} + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static inline lv_color16_t LV_ATTRIBUTE_FAST_MEM lv_color16_from_u16(uint16_t raw) +{ + lv_color16_t c; + c.red = (raw >> 11) & 0x1F; + c.green = (raw >> 5) & 0x3F; + c.blue = raw & 0x1F; + return c; +} +#endif + +#endif + +#endif diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h new file mode 100644 index 0000000..04f4b44 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_l8.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_l8.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_L8_H +#define LV_DRAW_SW_BLEND_TO_L8_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_l8(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_l8(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_L8_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c new file mode 100644 index 0000000..a2bcacd --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c @@ -0,0 +1,1531 @@ +/** + * @file lv_draw_sw_blend_to_rgb565.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_rgb565.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_RGB565 + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_DRAW_SW_SUPPORT_AL88 + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ l8_to_rgb565(const uint8_t c1); + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_16_mix(const uint8_t c1, uint16_t c2, uint8_t mix); + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static inline lv_color16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color16_from_u16(uint16_t raw); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Fill an area with a color. + * Supports normal fill, fill with opacity, fill with mask, and fill with mask and opacity. + * dest_buf and color have native color depth. (RGB565, RGB888, XRGB8888) + * The background (dest_buf) cannot have alpha channel + * @param dest_buf + * @param dest_area + * @param dest_stride + * @param color + * @param opa + * @param mask + * @param mask_stride + */ +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb565(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t color16 = lv_color_to_u16(dsc->color); + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(color16); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + LV_UNUSED(dest_buf_u16); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc)) { + for(y = 0; y < h; y++) { + uint16_t * dest_end_final = dest_buf_u16 + w; + uint32_t * dest_end_mid = (uint32_t *)((uint16_t *) dest_buf_u16 + ((w - 1) & ~(0xF))); + if((lv_uintptr_t)&dest_buf_u16[0] & 0x3) { + dest_buf_u16[0] = color16; + dest_buf_u16++; + } + + uint32_t c32 = (uint32_t)color16 + ((uint32_t)color16 << 16); + uint32_t * dest32 = (uint32_t *)dest_buf_u16; + while(dest32 < dest_end_mid) { + dest32[0] = c32; + dest32[1] = c32; + dest32[2] = c32; + dest32[3] = c32; + dest32[4] = c32; + dest32[5] = c32; + dest32[6] = c32; + dest32[7] = c32; + dest32 += 8; + } + + dest_buf_u16 = (uint16_t *)dest32; + + while(dest_buf_u16 < dest_end_final) { + *dest_buf_u16 = color16; + dest_buf_u16++; + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + dest_buf_u16 -= w; + } + } + + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc)) { + uint32_t last_dest32_color = dest_buf_u16[0] + 1; /*Set to value which is not equal to the first pixel*/ + uint32_t last_res32_color = 0; + + for(y = 0; y < h; y++) { + x = 0; + if((lv_uintptr_t)&dest_buf_u16[0] & 0x3) { + dest_buf_u16[0] = lv_color_16_16_mix(color16, dest_buf_u16[0], opa); + x = 1; + } + + for(; x < w - 2; x += 2) { + if(dest_buf_u16[x] != dest_buf_u16[x + 1]) { + dest_buf_u16[x + 0] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], opa); + dest_buf_u16[x + 1] = lv_color_16_16_mix(color16, dest_buf_u16[x + 1], opa); + } + else { + volatile uint32_t * dest32 = (uint32_t *)&dest_buf_u16[x]; + if(last_dest32_color == *dest32) { + *dest32 = last_res32_color; + } + else { + last_dest32_color = *dest32; + + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], opa); + dest_buf_u16[x + 1] = dest_buf_u16[x]; + + last_res32_color = *dest32; + } + } + } + + for(; x < w ; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + } + } + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + x = 0; + if((lv_uintptr_t)(mask) & 0x1) { + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], mask[x]); + x++; + } + + for(; x <= w - 2; x += 2) { + uint16_t mask16 = *((uint16_t *)&mask[x]); + if(mask16 == 0xFFFF) { + dest_buf_u16[x + 0] = color16; + dest_buf_u16[x + 1] = color16; + } + else if(mask16 != 0) { + dest_buf_u16[x + 0] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], mask[x + 0]); + dest_buf_u16[x + 1] = lv_color_16_16_mix(color16, dest_buf_u16[x + 1], mask[x + 1]); + } + } + + for(; x < w ; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], mask[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask += mask_stride; + } + } + } + /*Masked with opacity*/ + else if(mask && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], LV_OPA_MIX2(mask[x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc); + break; +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_swapped_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + l8_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + al88_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; +#endif + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = l8_to_rgb565(chan_val); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_8_16_mix(chan_val, dest_buf_u16[dest_x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_8_16_mix(chan_val, dest_buf_u16[dest_x], mask_buf[dest_x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_8_16_mix(chan_val, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + uint16_t res = 0; + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + // Additive blending mode + res = (LV_MIN(dest_buf_u16[dest_x] + l8_to_rgb565(chan_val), 0xFFFF)); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + // Subtractive blending mode + res = (LV_MAX(dest_buf_u16[dest_x] - l8_to_rgb565(chan_val), 0)); + break; + case LV_BLEND_MODE_MULTIPLY: + // Multiply blending mode + res = ((((dest_buf_u16[dest_x] >> 11) * (l8_to_rgb565(chan_val) >> 3)) & 0x1F) << 11) | + ((((dest_buf_u16[dest_x] >> 5) & 0x3F) * ((l8_to_rgb565(chan_val) >> 2) & 0x3F) >> 6) << 5) | + (((dest_buf_u16[dest_x] & 0x1F) * (l8_to_rgb565(chan_val) & 0x1F)) >> 5); + break; + case LV_BLEND_MODE_DIFFERENCE: + /*Difference blending mode*/ + res = (LV_ABS(dest_buf_u16[dest_x] - l8_to_rgb565(chan_val))); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = res; + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa); + } + else { + if(opa >= LV_OPA_MAX) + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); + else + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16a_t * src_buf_al88 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_al88[src_x].lumi, dest_buf_u16[dest_x], src_buf_al88[src_x].alpha); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_al88[src_x].lumi, dest_buf_u16[dest_x], + LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_al88[src_x].lumi, dest_buf_u16[dest_x], + LV_OPA_MIX2(src_buf_al88[src_x].alpha, mask_buf[dest_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_al88[src_x].lumi, dest_buf_u16[dest_x], + LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[dest_x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *)dest_buf_u16; + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + uint8_t rb = src_buf_al88[src_x].lumi >> 3; + uint8_t g = src_buf_al88[src_x].lumi >> 2; + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + rb, 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + g, 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + rb, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - rb, 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - g, 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - rb, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * rb) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * g) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * rb) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - rb)) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - g)) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - rb); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_al88[src_x].alpha); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, src_buf_al88[src_x].alpha)); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); + else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], opa, + src_buf_al88[src_x].alpha)); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_l8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = l8_to_rgb565(src_buf_l8[src_x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_l8[src_x], dest_buf_u16[dest_x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_l8[src_x], dest_buf_u16[dest_x], mask_buf[dest_x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_8_16_mix(src_buf_l8[src_x], dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *)dest_buf_u16; + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + uint8_t rb = src_buf_l8[src_x] >> 3; + uint8_t g = src_buf_l8[src_x] >> 2; + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + rb, 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + g, 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + rb, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - rb, 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - g, 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - rb, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * rb) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * g) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * rb) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - rb)) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - g)) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - rb); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = res; + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); + else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc)) { + uint32_t line_in_bytes = w * 2; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_u16, src_buf_u16, line_in_bytes); + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(src_buf_u16[x], dest_buf_u16[x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(src_buf_u16[x], dest_buf_u16[x], mask_buf[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(src_buf_u16[x], dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_color16_t * src_buf_c16 = (lv_color16_t *) src_buf_u16; + for(x = 0; x < w; x++) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not add pure black*/ + res = (LV_MIN(dest_buf_c16[x].red + src_buf_c16[x].red, 31)) << 11; + res += (LV_MIN(dest_buf_c16[x].green + src_buf_c16[x].green, 63)) << 5; + res += LV_MIN(dest_buf_c16[x].blue + src_buf_c16[x].blue, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not subtract pure black*/ + res = (LV_MAX(dest_buf_c16[x].red - src_buf_c16[x].red, 0)) << 11; + res += (LV_MAX(dest_buf_c16[x].green - src_buf_c16[x].green, 0)) << 5; + res += LV_MAX(dest_buf_c16[x].blue - src_buf_c16[x].blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + if(src_buf_u16[x] == 0xffff) continue; /*Do not multiply with pure white (considered as 1)*/ + res = ((dest_buf_c16[x].red * src_buf_c16[x].red) >> 5) << 11; + res += ((dest_buf_c16[x].green * src_buf_c16[x].green) >> 6) << 5; + res += (dest_buf_c16[x].blue * src_buf_c16[x].blue) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[x].red - src_buf_c16[x].red)) << 11; + res += (LV_ABS(dest_buf_c16[x].green - src_buf_c16[x].green)) << 5; + res += LV_ABS(dest_buf_c16[x].blue - src_buf_c16[x].blue); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], opa); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], mask_buf[x]); + else dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static void LV_ATTRIBUTE_FAST_MEM rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565(dsc)) { + uint32_t line_in_bytes = w * 2; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_u16, src_buf_u16, line_in_bytes); + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), dest_buf_u16[x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), dest_buf_u16[x], mask_buf[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + + for(x = 0; x < w; x++) { + uint16_t raw; + lv_color16_t px; + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not add pure black*/ + res = (LV_MIN(dest_buf_c16[x].red + px.red, 31)) << 11; + res += (LV_MIN(dest_buf_c16[x].green + px.green, 63)) << 5; + res += LV_MIN(dest_buf_c16[x].blue + px.blue, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not subtract pure black*/ + res = (LV_MAX(dest_buf_c16[x].red - px.red, 0)) << 11; + res += (LV_MAX(dest_buf_c16[x].green - px.green, 0)) << 5; + res += LV_MAX(dest_buf_c16[x].blue - px.blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + if(src_buf_u16[x] == 0xffff) continue; /*Do not multiply with pure white (considered as 1)*/ + res = ((dest_buf_c16[x].red * px.red) >> 5) << 11; + res += ((dest_buf_c16[x].green * px.green) >> 6) << 5; + res += (dest_buf_c16[x].blue * px.blue) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[x].red - px.red)) << 11; + res += (LV_ABS(dest_buf_c16[x].green - px.green)) << 5; + res += LV_ABS(dest_buf_c16[x].blue - px.blue); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], opa); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], mask_buf[x]); + else dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = ((src_buf_u8[src_x + 2] & 0xF8) << 8) + + ((src_buf_u8[src_x + 1] & 0xFC) << 3) + + ((src_buf_u8[src_x + 0] & 0xF8) >> 3); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], mask_buf[dest_x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); + else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], LV_OPA_MIX2(src_buf_u8[src_x + 3], + opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], + LV_OPA_MIX2(src_buf_u8[src_x + 3], mask_buf[dest_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_24_16_mix(&src_buf_u8[src_x], dest_buf_u16[dest_x], + LV_OPA_MIX3(src_buf_u8[src_x + 3], mask_buf[dest_x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, src_buf_u8[src_x + 3])); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); + else dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], opa, + src_buf_u8[src_x + 3])); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix_premult(const uint8_t * c1, uint16_t c2, uint8_t mix) +{ + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1[2] & 0xF8) << 8) + ((c1[1] & 0xFC) << 3) + ((c1[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + uint8_t r = (c1[2] >> 3) + ((((c2 >> 11) & 0x1F) * mix_inv) >> 8); + uint8_t g = (c1[1] >> 2) + ((((c2 >> 5) & 0x3F) * mix_inv) >> 8); + uint8_t b = (c1[0] >> 3) + ((((c2 >> 0) & 0x1F) * mix_inv) >> 8); + + return (r << 11) + (g << 5) + (b); + } +} + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + /*For the trivial case use the premultiplied image as it is. + *For the other cases unpremultiply as another alpha also needs to be applied.*/ + dest_buf_u16[dest_x] = lv_color_24_16_mix_premult(&src_buf_u8[src_x], dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_24_16_mix(src_buf_u8_unpremult, dest_buf_u16[dest_x], + LV_OPA_MIX2(src_buf_u8[src_x + 3], opa)); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_24_16_mix(src_buf_u8_unpremult, dest_buf_u16[dest_x], + LV_OPA_MIX2(src_buf_u8[src_x + 3], mask_buf[dest_x])); + } + + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_24_16_mix(src_buf_u8_unpremult, dest_buf_u16[dest_x], + LV_OPA_MIX3(src_buf_u8[src_x + 3], mask_buf[dest_x], opa)); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + /* Blending premultiplied ARGB8888 to RGB565 with no mask and full opacity */ + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + /* Blending premultiplied ARGB8888 to RGB565 with no mask and partial opacity */ + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, src_buf_u8[src_x + 3])); + } + else { + if(opa >= LV_OPA_MAX) + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); + else + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], opa, + src_buf_u8[src_x + 3])); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM l8_to_rgb565(const uint8_t c1) +{ + return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); +} + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_8_16_mix(const uint8_t c1, uint16_t c2, uint8_t mix) +{ + + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + return ((((c1 >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + ((((c1 >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + (((c1 >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); + } +} + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix) +{ + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1[2] & 0xF8) << 8) + ((c1[1] & 0xFC) << 3) + ((c1[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + return ((((c1[2] >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + ((((c1[1] >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + (((c1[0] >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); + } +} + +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static inline lv_color16_t LV_ATTRIBUTE_FAST_MEM lv_color16_from_u16(uint16_t raw) +{ + lv_color16_t c; + c.red = (raw >> 11) & 0x1F; + c.green = (raw >> 5) & 0x3F; + c.blue = raw & 0x1F; + return c; +} +#endif + +#endif /*LV_DRAW_SW_SUPPORT_RGB565*/ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h new file mode 100644 index 0000000..d14bfd9 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_rgb565.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_RGB565_H +#define LV_DRAW_SW_BLEND_TO_RGB565_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb565(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_RGB565_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.c new file mode 100644 index 0000000..8884584 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.c @@ -0,0 +1,1560 @@ +/** + * @file lv_draw_sw_blend_to_rgb565_swapped.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_rgb565_swapped.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_DRAW_SW_SUPPORT_AL88 + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ l8_to_rgb565(const uint8_t c1); + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_16_mix(const uint8_t c1, uint16_t c2, uint8_t mix); + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Fill an area with a color. + * Supports normal fill, fill with opacity, fill with mask, and fill with mask and opacity. + * dest_buf and color have native color depth. (RGB565, RGB888, XRGB8888) + * The background (dest_buf) cannot have alpha channel + * @param dest_buf + * @param dest_area + * @param dest_stride + * @param color + * @param opa + * @param mask + * @param mask_stride + */ +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb565_swapped(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t color16 = lv_color_to_u16(dsc->color); /* Normal color */ + uint16_t color16_swapped = lv_color_swap_16(color16); /* Swapped color, use directly if no mixing is needed */ + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(color16); + LV_UNUSED(color16_swapped); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + LV_UNUSED(dest_buf_u16); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + uint16_t * dest_end_final = dest_buf_u16 + w; + uint32_t * dest_end_mid = (uint32_t *)((uint16_t *) dest_buf_u16 + ((w - 1) & ~(0xF))); + + if((lv_uintptr_t)&dest_buf_u16[0] & 0x3) { + dest_buf_u16[0] = color16_swapped; + dest_buf_u16++; + } + + uint32_t c32 = (uint32_t)color16_swapped + ((uint32_t)color16_swapped << 16); + uint32_t * dest32 = (uint32_t *)dest_buf_u16; + while(dest32 < dest_end_mid) { + dest32[0] = c32; + dest32[1] = c32; + dest32[2] = c32; + dest32[3] = c32; + dest32[4] = c32; + dest32[5] = c32; + dest32[6] = c32; + dest32[7] = c32; + dest32 += 8; + } + + dest_buf_u16 = (uint16_t *)dest32; + + while(dest_buf_u16 < dest_end_final) { + *dest_buf_u16 = color16_swapped; + dest_buf_u16++; + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + dest_buf_u16 -= w; + } + } + + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + /*Make sure the last dest_color doesn't match the first one so that it will be calculated*/ + uint16_t last_dest_color = dest_buf_u16[0] - 1; + uint16_t last_res_color = 0; + for(x = 0; x < w; x++) { + if(last_dest_color != dest_buf_u16[x]) { + uint16_t px = lv_color_swap_16(dest_buf_u16[x]); /* Swap destination so it becomes unswapped now */ + last_res_color = lv_color_16_16_mix(color16, px, opa); /* Color mix of unswapped colors */ + last_res_color = lv_color_swap_16(last_res_color); + last_dest_color = dest_buf_u16[x]; + } + + dest_buf_u16[x] = last_res_color; + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + } + } + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + x = 0; + if((lv_uintptr_t)(mask) & 0x1) { + uint16_t px = dest_buf_u16[x]; + px = lv_color_swap_16(px); /* Swap destination */ + px = lv_color_16_16_mix(color16, px, mask[x]); /* Color mix */ + dest_buf_u16[x] = lv_color_swap_16(px); /* Write back swapped */ + x++; + } + + for(; x <= w - 2; x += 2) { + uint16_t mask16 = *((uint16_t *)&mask[x]); + if(mask16 == 0xFFFF) { + dest_buf_u16[x + 0] = color16_swapped; + dest_buf_u16[x + 1] = color16_swapped; + } + else if(mask16 != 0) { + uint16_t px0 = lv_color_swap_16(dest_buf_u16[x + 0]); /* Swap destination */ + uint16_t px1 = lv_color_swap_16(dest_buf_u16[x + 1]); /* Swap destination */ + + px0 = lv_color_16_16_mix(color16, px0, mask[x + 0]); /* Color mix */ + px1 = lv_color_16_16_mix(color16, px1, mask[x + 1]); /* Color mix */ + + dest_buf_u16[x + 0] = lv_color_swap_16(px0); /* Write back swapped */ + dest_buf_u16[x + 1] = lv_color_swap_16(px1); /* Write back swapped */ + + } + } + + for(; x < w ; x++) { + uint16_t px = dest_buf_u16[x]; + px = lv_color_swap_16(px); /* Swap destination */ + px = lv_color_16_16_mix(color16, px, mask[x]); /* Color mix */ + dest_buf_u16[x] = lv_color_swap_16(px); /* Write back swapped */ + + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask += mask_stride; + } + } + } + /*Masked with opacity*/ + else if(mask && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint16_t px = dest_buf_u16[x]; + px = lv_color_swap_16(px); /* Swap destination */ + + uint8_t mix_opa = LV_OPA_MIX2(mask[x], opa); + px = lv_color_16_16_mix(color16, px, mix_opa); /* Color mix */ + + dest_buf_u16[x] = lv_color_swap_16(px); /* Write back swapped */ + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565_swapped(lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_swapped_image_blend(dsc); + break; +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + l8_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + al88_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; +#endif + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_swap_16(l8_to_rgb565(chan_val)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(chan_val, lv_color_swap_16(dest_buf_u16[dest_x]), opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(chan_val, lv_color_swap_16(dest_buf_u16[dest_x]), + mask_buf[dest_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(chan_val, lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(mask_buf[dest_x], opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + uint16_t res = 0; + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(lv_color_swap_16(dest_buf_u16[dest_x]) + l8_to_rgb565(chan_val), 0xFFFF)); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(lv_color_swap_16(dest_buf_u16[dest_x]) - l8_to_rgb565(chan_val), 0)); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((((lv_color_swap_16(dest_buf_u16[dest_x]) >> 11) * (l8_to_rgb565(chan_val) >> 3)) & 0x1F) << 11) | + ((((lv_color_swap_16(dest_buf_u16[dest_x]) >> 5) & 0x3F) * ((l8_to_rgb565(chan_val) >> 2) & 0x3F) >> 6) << 5) | + (((lv_color_swap_16(dest_buf_u16[dest_x]) & 0x1F) * (l8_to_rgb565(chan_val) & 0x1F)) >> 5); + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(lv_color_swap_16(dest_buf_u16[dest_x]) - l8_to_rgb565(chan_val))); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(res); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, lv_color_swap_16(dest_buf_u16[dest_x]), opa)); + } + else { + if(opa >= LV_OPA_MAX) + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, lv_color_swap_16(dest_buf_u16[dest_x]), + mask_buf[dest_x])); + else + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(mask_buf[dest_x], opa))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16a_t * src_buf_al88 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_al88[src_x].lumi, + lv_color_swap_16(dest_buf_u16[dest_x]), src_buf_al88[src_x].alpha)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_al88[src_x].lumi, + lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_al88[src_x].lumi, + lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_al88[src_x].alpha, mask_buf[dest_x]))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_al88[src_x].lumi, + lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[dest_x], opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *)dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + uint8_t rb = src_buf_al88[src_x].lumi >> 3; + uint8_t g = src_buf_al88[src_x].lumi >> 2; + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + rb, 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + g, 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + rb, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - rb, 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - g, 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - rb, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * rb) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * g) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * rb) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - rb)) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - g)) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - rb); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_al88[src_x].alpha)); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, + src_buf_al88[src_x].alpha))); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], + mask_buf[dest_x])); + else dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], + opa, + src_buf_al88[src_x].alpha))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_l8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(l8_to_rgb565(src_buf_l8[src_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_l8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_l8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + mask_buf[dest_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_l8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(mask_buf[dest_x], opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *)dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + uint8_t rb = src_buf_l8[src_x] >> 3; + uint8_t g = src_buf_l8[src_x] >> 2; + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + rb, 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + g, 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + rb, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - rb, 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - g, 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - rb, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * rb) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * g) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * rb) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - rb)) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - g)) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - rb); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = res; + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa)); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], + mask_buf[dest_x])); + else dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], + opa))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + uint32_t line_in_bytes = w * 2; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_u16, src_buf_u16, line_in_bytes); + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(src_buf_u16[x], lv_color_swap_16(dest_buf_u16[x]), opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(src_buf_u16[x], lv_color_swap_16(dest_buf_u16[x]), mask_buf[x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(src_buf_u16[x], lv_color_swap_16(dest_buf_u16[x]), + LV_OPA_MIX2(mask_buf[x], opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_color16_t * src_buf_c16 = (lv_color16_t *) src_buf_u16; + for(x = 0; x < w; x++) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not add pure black*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_MIN(dest_buf_c16[x].red + src_buf_c16[x].red, 31)) << 11; + res += (LV_MIN(dest_buf_c16[x].green + src_buf_c16[x].green, 63)) << 5; + res += LV_MIN(dest_buf_c16[x].blue + src_buf_c16[x].blue, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not subtract pure black*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_MAX(dest_buf_c16[x].red - src_buf_c16[x].red, 0)) << 11; + res += (LV_MAX(dest_buf_c16[x].green - src_buf_c16[x].green, 0)) << 5; + res += LV_MAX(dest_buf_c16[x].blue - src_buf_c16[x].blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + if(src_buf_u16[x] == 0xffff) continue; /*Do not multiply with pure white (considered as 1)*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = ((dest_buf_c16[x].red * src_buf_c16[x].red) >> 5) << 11; + res += ((dest_buf_c16[x].green * src_buf_c16[x].green) >> 6) << 5; + res += (dest_buf_c16[x].blue * src_buf_c16[x].blue) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_ABS(dest_buf_c16[x].red - src_buf_c16[x].red)) << 11; + res += (LV_ABS(dest_buf_c16[x].green - src_buf_c16[x].green)) << 5; + res += LV_ABS(dest_buf_c16[x].blue - src_buf_c16[x].blue); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], opa)); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], mask_buf[x])); + else dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} +#endif + +static void LV_ATTRIBUTE_FAST_MEM rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + uint32_t line_in_bytes = w * 2; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_u16, src_buf_u16, line_in_bytes); + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint16_t px = lv_color_swap_16(dest_buf_u16[x]); + px = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), px, opa); + dest_buf_u16[x] = lv_color_swap_16(px); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint16_t px = lv_color_swap_16(dest_buf_u16[x]); + px = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), px, mask_buf[x]); + dest_buf_u16[x] = lv_color_swap_16(px); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint16_t px = lv_color_swap_16(dest_buf_u16[x]); + px = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), px, LV_OPA_MIX2(mask_buf[x], opa)); + dest_buf_u16[x] = lv_color_swap_16(px); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + for(x = 0; x < w; x++) { + uint16_t raw; + lv_color16_t src_px; + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + lv_memcpy(&src_px, &raw, sizeof(src_px)); + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not add pure black*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_MIN(dest_buf_c16[x].red + src_px.red, 31)) << 11; + res += (LV_MIN(dest_buf_c16[x].green + src_px.green, 63)) << 5; + res += LV_MIN(dest_buf_c16[x].blue + src_px.blue, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not subtract pure black*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_MAX(dest_buf_c16[x].red - src_px.red, 0)) << 11; + res += (LV_MAX(dest_buf_c16[x].green - src_px.green, 0)) << 5; + res += LV_MAX(dest_buf_c16[x].blue - src_px.blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + if(src_buf_u16[x] == 0xffff) continue; /*Do not multiply with pure white (considered as 1)*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = ((dest_buf_c16[x].red * src_px.red) >> 5) << 11; + res += ((dest_buf_c16[x].green * src_px.green) >> 6) << 5; + res += (dest_buf_c16[x].blue * src_px.blue) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_ABS(dest_buf_c16[x].red - src_px.red)) << 11; + res += (LV_ABS(dest_buf_c16[x].green - src_px.green)) << 5; + res += LV_ABS(dest_buf_c16[x].blue - src_px.blue); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], opa)); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], mask_buf[x])); + else dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_swap_16(((src_buf_u8[src_x + 2] & 0xF8) << 8) + + ((src_buf_u8[src_x + 1] & 0xFC) << 3) + + ((src_buf_u8[src_x + 0] & 0xF8) >> 3)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + mask_buf[dest_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(mask_buf[dest_x], opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa)); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], + mask_buf[dest_x])); + else dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], + opa))); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + src_buf_u8[src_x + 3])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_u8[src_x + 3], + opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_u8[src_x + 3], mask_buf[dest_x]))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX3(src_buf_u8[src_x + 3], mask_buf[dest_x], opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_u8[src_x + 3])); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, + src_buf_u8[src_x + 3]))); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], + mask_buf[dest_x])); + else dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], + opa, + src_buf_u8[src_x + 3]))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix_premult(const uint8_t * c1, uint16_t c2, uint8_t mix) +{ + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1[2] & 0xF8) << 8) + ((c1[1] & 0xFC) << 3) + ((c1[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + uint8_t r = (c1[2] >> 3) + ((((c2 >> 11) & 0x1F) * mix_inv) >> 8); + uint8_t g = (c1[1] >> 2) + ((((c2 >> 5) & 0x3F) * mix_inv) >> 8); + uint8_t b = (c1[0] >> 3) + ((((c2 >> 0) & 0x1F) * mix_inv) >> 8); + + return (r << 11) + (g << 5) + (b); + } +} + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + /*For the trivial case use the premultipled image as it is. + *For the other cases unpremultiply as another alpha also needs to be applied.*/ + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix_premult(&src_buf_u8[src_x], + lv_color_swap_16(dest_buf_u16[dest_x]), src_buf_u8[src_x + 3])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(src_buf_u8_unpremult, lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_u8[src_x + 3], opa))); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(src_buf_u8_unpremult, lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_u8[src_x + 3], mask_buf[dest_x]))); + } + + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(src_buf_u8_unpremult, lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX3(src_buf_u8[src_x + 3], mask_buf[dest_x], opa))); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + /* Blending premultiplied ARGB8888 to RGB565 with no mask and full opacity */ + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_u8[src_x + 3])); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + /* Blending premultiplied ARGB8888 to RGB565 with no mask and partial opacity */ + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, + src_buf_u8[src_x + 3]))); + } + else { + if(opa >= LV_OPA_MAX) + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x])); + else + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], opa, + src_buf_u8[src_x + 3]))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM l8_to_rgb565(const uint8_t c1) +{ + return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); +} + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_8_16_mix(const uint8_t c1, uint16_t c2, uint8_t mix) +{ + + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + return ((((c1 >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + ((((c1 >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + (((c1 >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); + } +} + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix) +{ + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1[2] & 0xF8) << 8) + ((c1[1] & 0xFC) << 3) + ((c1[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + return ((((c1[2] >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + ((((c1[1] >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + (((c1[0] >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); + } +} + +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#endif /*LV_DRAW_SW_SUPPORT_RGB565_SWAPPED*/ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.h new file mode 100644 index 0000000..a9da699 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_rgb565_swapped.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_RGB565_SWAPPED_H +#define LV_DRAW_SW_BLEND_TO_RGB565_SWAPPED_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb565_swapped(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb565_swapped(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_RGB565_SWAPPED_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c new file mode 100644 index 0000000..c92ce07 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c @@ -0,0 +1,1166 @@ +/** + * @file lv_draw_sw_blend_to_rgb888.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_rgb888.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_RISCV_V + #include "riscv_v/lv_blend_riscv_v.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_DRAW_SW_SUPPORT_AL88 + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +#endif + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t dest_px_size, + uint32_t src_px_size); + +#if LV_DRAW_SW_SUPPORT_ARGB8888 +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +#endif + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_24_mix(const uint8_t src, uint8_t * dest, uint8_t mix); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, + lv_blend_mode_t mode); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dest_px_size)) { + if(dest_px_size == 3) { + uint8_t * dest_buf_u8 = dsc->dest_buf; + uint8_t * dest_buf_ori = dsc->dest_buf; + w *= dest_px_size; + + for(x = 0; x < w; x += 3) { + dest_buf_u8[x + 0] = dsc->color.blue; + dest_buf_u8[x + 1] = dsc->color.green; + dest_buf_u8[x + 2] = dsc->color.red; + } + + dest_buf_u8 += dest_stride; + + for(y = 1; y < h; y++) { + lv_memcpy(dest_buf_u8, dest_buf_ori, w); + dest_buf_u8 += dest_stride; + } + } + if(dest_px_size == 4) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint32_t * dest_buf_u32 = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x <= w - 16; x += 16) { + dest_buf_u32[x + 0] = color32; + dest_buf_u32[x + 1] = color32; + dest_buf_u32[x + 2] = color32; + dest_buf_u32[x + 3] = color32; + + dest_buf_u32[x + 4] = color32; + dest_buf_u32[x + 5] = color32; + dest_buf_u32[x + 6] = color32; + dest_buf_u32[x + 7] = color32; + + dest_buf_u32[x + 8] = color32; + dest_buf_u32[x + 9] = color32; + dest_buf_u32[x + 10] = color32; + dest_buf_u32[x + 11] = color32; + + dest_buf_u32[x + 12] = color32; + dest_buf_u32[x + 13] = color32; + dest_buf_u32[x + 14] = color32; + dest_buf_u32[x + 15] = color32; + } + for(; x < w; x ++) { + dest_buf_u32[x] = color32; + } + + dest_buf_u32 = drawbuf_next_row(dest_buf_u32, dest_stride); + } + } + } + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + w *= dest_px_size; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x += dest_px_size) { + lv_color_24_24_mix((const uint8_t *)&color32, &dest_buf[x], opa); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + w *= dest_px_size; + + for(y = 0; y < h; y++) { + uint32_t mask_x; + for(x = 0, mask_x = 0; x < w; x += dest_px_size, mask_x++) { + lv_color_24_24_mix((const uint8_t *)&color32, &dest_buf[x], mask[mask_x]); + } + + dest_buf += dest_stride; + mask += mask_stride; + } + } + } + /*Masked with opacity*/ + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint8_t * dest_buf = dsc->dest_buf; + w *= dest_px_size; + + for(y = 0; y < h; y++) { + uint32_t mask_x; + for(x = 0, mask_x = 0; x < w; x += dest_px_size, mask_x++) { + lv_color_24_24_mix((const uint8_t *) &color32, &dest_buf[x], LV_OPA_MIX2(opa, mask[mask_x])); + } + dest_buf += dest_stride; + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + switch(dsc->src_color_format) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc, dest_px_size); + break; +#endif + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, dest_px_size, 3); + break; +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, dest_px_size, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc, dest_px_size); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc, dest_px_size); + break; +#endif +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + l8_image_blend(dsc, dest_px_size); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + al88_image_blend(dsc, dest_px_size); + break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc, dest_px_size); + break; +#endif + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u8[dest_x + 2] = chan_val; + dest_buf_u8[dest_x + 1] = chan_val; + dest_buf_u8[dest_x + 0] = chan_val; + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_24_mix(chan_val, &dest_buf_u8[dest_x], opa); + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_24_mix(chan_val, &dest_buf_u8[dest_x], mask_buf[src_x]); + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_24_mix(chan_val, &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color32_t src_argb; + src_argb.red = get_bit(src_buf_i1, src_x) * 255; + src_argb.green = src_argb.red; + src_argb.blue = src_argb.red; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 +static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16a_t * src_buf_al88 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_8_24_mix(src_buf_al88[src_x].lumi, &dest_buf_u8[dest_x], src_buf_al88[src_x].alpha); + } + dest_buf_u8 += dest_stride; + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_8_24_mix(src_buf_al88[src_x].lumi, &dest_buf_u8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); + } + dest_buf_u8 += dest_stride; + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_8_24_mix(src_buf_al88[src_x].lumi, &dest_buf_u8[dest_x], LV_OPA_MIX2(src_buf_al88[src_x].alpha, + mask_buf[src_x])); + } + dest_buf_u8 += dest_stride; + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_8_24_mix(src_buf_al88[src_x].lumi, &dest_buf_u8[dest_x], LV_OPA_MIX3(src_buf_al88[src_x].alpha, + mask_buf[src_x], opa)); + } + dest_buf_u8 += dest_stride; + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color32_t src_argb; + src_argb.red = src_argb.green = src_argb.blue = src_buf_al88[src_x].lumi; + if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa); + else src_argb.alpha = LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 += dest_stride; + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + +static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_l8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + dest_buf_u8[dest_x + 2] = src_buf_l8[src_x]; + dest_buf_u8[dest_x + 1] = src_buf_l8[src_x]; + dest_buf_u8[dest_x + 0] = src_buf_l8[src_x]; + } + dest_buf_u8 += dest_stride; + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_8_24_mix(src_buf_l8[src_x], &dest_buf_u8[dest_x], opa); + } + dest_buf_u8 += dest_stride; + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_8_24_mix(src_buf_l8[src_x], &dest_buf_u8[dest_x], mask_buf[src_x]); + } + dest_buf_u8 += dest_stride; + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_8_24_mix(src_buf_l8[src_x], &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); + } + dest_buf_u8 += dest_stride; + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + src_argb.red = src_buf_l8[src_x]; + src_argb.green = src_buf_l8[src_x]; + src_argb.blue = src_buf_l8[src_x]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 += dest_stride; + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16_t * src_buf_c16 = (const lv_color16_t *) dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t src_x; + int32_t dest_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + dest_buf_u8[dest_x + 2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ + dest_buf_u8[dest_x + 1] = (src_buf_c16[src_x].green * 1037) >> 8; + dest_buf_u8[dest_x + 0] = (src_buf_c16[src_x].blue * 2106) >> 8; + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + uint8_t res[3]; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + res[2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ + res[1] = (src_buf_c16[src_x].green * 1037) >> 8; + res[0] = (src_buf_c16[src_x].blue * 2106) >> 8; + lv_color_24_24_mix(res, &dest_buf_u8[dest_x], opa); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + uint8_t res[3]; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + res[2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ + res[1] = (src_buf_c16[src_x].green * 1037) >> 8; + res[0] = (src_buf_c16[src_x].blue * 2106) >> 8; + lv_color_24_24_mix(res, &dest_buf_u8[dest_x], mask_buf[src_x]); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + uint8_t res[3]; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + res[2] = (src_buf_c16[src_x].red * 2106) >> 8; /*To make it rounded*/ + res[1] = (src_buf_c16[src_x].green * 1037) >> 8; + res[0] = (src_buf_c16[src_x].blue * 2106) >> 8; + lv_color_24_24_mix(res, &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); + } + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x += dest_px_size) { + src_argb.red = (src_buf_c16[src_x].red * 2106) >> 8; + src_argb.green = (src_buf_c16[src_x].green * 1037) >> 8; + src_argb.blue = (src_buf_c16[src_x].blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 += dest_stride; + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } +} + +#endif + +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t dest_px_size, + uint32_t src_px_size) +{ + int32_t w = dsc->dest_w * dest_px_size; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + /*Special case*/ + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size, src_px_size)) { + if(src_px_size == dest_px_size) { + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf, src_buf, w); + dest_buf += dest_stride; + src_buf += src_stride; + } + } + else { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x += dest_px_size, src_x += src_px_size) { + dest_buf[dest_x + 0] = src_buf[src_x + 0]; + dest_buf[dest_x + 1] = src_buf[src_x + 1]; + dest_buf[dest_x + 2] = src_buf[src_x + 2]; + } + dest_buf += dest_stride; + src_buf += src_stride; + } + } + } + } + if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x += dest_px_size, src_x += src_px_size) { + lv_color_24_24_mix(&src_buf[src_x], &dest_buf[dest_x], opa); + } + dest_buf += dest_stride; + src_buf += src_stride; + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size, src_px_size)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x += dest_px_size, src_x += src_px_size) { + lv_color_24_24_mix(&src_buf[src_x], &dest_buf[dest_x], mask_buf[mask_x]); + } + dest_buf += dest_stride; + src_buf += src_stride; + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size, src_px_size)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x += dest_px_size, src_x += src_px_size) { + lv_color_24_24_mix(&src_buf[src_x], &dest_buf[dest_x], LV_OPA_MIX2(opa, mask_buf[mask_x])); + } + dest_buf += dest_stride; + src_buf += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x += dest_px_size, src_x += src_px_size) { + src_argb.red = src_buf[src_x + 2]; + src_argb.green = src_buf[src_x + 1]; + src_argb.blue = src_buf[src_x + 0]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + + blend_non_normal_pixel(&dest_buf[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf += dest_stride; + src_buf += src_stride; + } + } +} + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], src_buf_c32[src_x].alpha); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], LV_OPA_MIX2(src_buf_c32[src_x].alpha, opa)); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], + LV_OPA_MIX2(src_buf_c32[src_x].alpha, mask_buf[src_x])); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color_24_24_mix((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], + LV_OPA_MIX3(src_buf_c32[src_x].alpha, mask_buf[src_x], opa)); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x ++) { + src_argb = src_buf_c32[src_x]; + if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_argb.alpha, opa); + else src_argb.alpha = LV_OPA_MIX3(src_argb.alpha, mask_buf[dest_x], opa); + + blend_non_normal_pixel(&dest_buf[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_24_24_mix_premult(const uint8_t * src, uint8_t * dest, uint8_t mix) +{ + if(mix == 0) return; + + if(mix >= LV_OPA_MAX) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + } + else { + lv_opa_t mix_inv = 255 - mix; + dest[0] = (uint32_t)src[0] + ((uint32_t)(dest[0] * mix_inv) >> 8); + dest[1] = (uint32_t)src[1] + ((uint32_t)(dest[1] * mix_inv) >> 8); + dest[2] = (uint32_t)src[2] + ((uint32_t)(dest[2] * mix_inv) >> 8); + } +} + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + /*For the trivial case use the premultiplied image as it is. + *For the other cases unpremultiply as another alpha also needs to be applied.*/ + lv_color_24_24_mix_premult((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], src_buf_c32[src_x].alpha); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color32_t src_pixel = src_buf_c32[src_x]; + if(src_pixel.alpha > 0) { + uint16_t reciprocal = (255 * 256) / src_pixel.alpha; + src_pixel.red = (src_pixel.red * reciprocal) >> 8; + src_pixel.green = (src_pixel.green * reciprocal) >> 8; + src_pixel.blue = (src_pixel.blue * reciprocal) >> 8; + lv_color_24_24_mix((const uint8_t *)&src_pixel, &dest_buf[dest_x], LV_OPA_MIX2(src_pixel.alpha, opa)); + } + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color32_t src_pixel = src_buf_c32[src_x]; + if(src_pixel.alpha > 0) { + uint16_t reciprocal = (255 * 256) / src_pixel.alpha; + src_pixel.red = (src_pixel.red * reciprocal) >> 8; + src_pixel.green = (src_pixel.green * reciprocal) >> 8; + src_pixel.blue = (src_pixel.blue * reciprocal) >> 8; + lv_color_24_24_mix((const uint8_t *)&src_pixel, &dest_buf[dest_x], LV_OPA_MIX2(src_pixel.alpha, mask_buf[src_x])); + } + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color32_t src_pixel = src_buf_c32[src_x]; + if(src_pixel.alpha > 0) { + uint16_t reciprocal = (255 * 256) / src_pixel.alpha; + src_pixel.red = (src_pixel.red * reciprocal) >> 8; + src_pixel.green = (src_pixel.green * reciprocal) >> 8; + src_pixel.blue = (src_pixel.blue * reciprocal) >> 8; + lv_color_24_24_mix((const uint8_t *)&src_pixel, &dest_buf[dest_x], LV_OPA_MIX3(src_pixel.alpha, mask_buf[src_x], opa)); + } + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x ++) { + src_argb = src_buf_c32[src_x]; + if(src_argb.alpha > 0) { + uint16_t reciprocal = (255 * 256) / src_argb.alpha; + src_argb.red = (src_argb.red * reciprocal) >> 8; + src_argb.green = (src_argb.green * reciprocal) >> 8; + src_argb.blue = (src_argb.blue * reciprocal) >> 8; + } + if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_argb.alpha, opa); + else src_argb.alpha = LV_OPA_MIX3(src_argb.alpha, mask_buf[dest_x], opa); + + blend_non_normal_pixel(&dest_buf[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#endif + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode) +{ + uint8_t res[3] = {0, 0, 0}; + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + res[0] = LV_MIN(dest[0] + src.blue, 255); + res[1] = LV_MIN(dest[1] + src.green, 255); + res[2] = LV_MIN(dest[2] + src.red, 255); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res[0] = LV_MAX(dest[0] - src.blue, 0); + res[1] = LV_MAX(dest[1] - src.green, 0); + res[2] = LV_MAX(dest[2] - src.red, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res[0] = (dest[0] * src.blue) >> 8; + res[1] = (dest[1] * src.green) >> 8; + res[2] = (dest[2] * src.red) >> 8; + break; + case LV_BLEND_MODE_DIFFERENCE: + res[0] = LV_ABS((int16_t)dest[0] - src.blue); + res[1] = LV_ABS((int16_t)dest[1] - src.green); + res[2] = LV_ABS((int16_t)dest[2] - src.red); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + lv_color_24_24_mix(res, dest, src.alpha); +} + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_24_mix(const uint8_t src, uint8_t * dest, uint8_t mix) +{ + + if(mix == 0) return; + + if(mix >= LV_OPA_MAX) { + dest[0] = src; + dest[1] = src; + dest[2] = src; + } + else { + lv_opa_t mix_inv = 255 - mix; + dest[0] = (uint32_t)((uint32_t)src * mix + dest[0] * mix_inv) >> 8; + dest[1] = (uint32_t)((uint32_t)src * mix + dest[1] * mix_inv) >> 8; + dest[2] = (uint32_t)((uint32_t)src * mix + dest[2] * mix_inv) >> 8; + } +} + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix) +{ + + if(mix == 0) return; + + if(mix >= LV_OPA_MAX) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + } + else { + lv_opa_t mix_inv = 255 - mix; + dest[0] = (uint32_t)((uint32_t)src[0] * mix + dest[0] * mix_inv) >> 8; + dest[1] = (uint32_t)((uint32_t)src[1] * mix + dest[1] * mix_inv) >> 8; + dest[2] = (uint32_t)((uint32_t)src[2] * mix + dest[2] * mix_inv) >> 8; + } +} + +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +#endif /*LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888*/ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h new file mode 100644 index 0000000..441c0d3 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h @@ -0,0 +1,47 @@ +/** + * @file lv_draw_sw_blend_to_rgb888.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_RGB888_H +#define LV_DRAW_SW_BLEND_TO_RGB888_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dest_px_size); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_RGB888_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h b/inc/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h new file mode 100644 index 0000000..66e1e21 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h @@ -0,0 +1,50 @@ +/** + * @file lv_blend_neon.h + * + */ + +#ifndef LV_BLEND_NEON_H +#define LV_BLEND_NEON_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../../lv_conf_internal.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + +#ifdef LV_DRAW_SW_NEON_CUSTOM_INCLUDE +#include LV_DRAW_SW_NEON_CUSTOM_INCLUDE +#endif + +#include "lv_draw_sw_blend_neon_to_rgb565.h" +#include "lv_draw_sw_blend_neon_to_rgb888.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BLEND_NEON_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb565.c b/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb565.c new file mode 100644 index 0000000..2b933e6 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb565.c @@ -0,0 +1,2093 @@ +/** + * @file lv_draw_sw_blend_neon_to_rgb565.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_neon_to_rgb565.h" +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + +#include "../../../../misc/lv_color.h" +#include "../../../../misc/lv_types.h" +#include "../lv_draw_sw_blend_private.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride); + +static inline uint16x8_t l8_to_rgb565_8(const uint8_t * src); +static inline uint16x4_t l8_to_rgb565_4(const uint8_t * src); +static inline uint32_t l8_to_rgb565_2(const uint8_t * src); +static inline uint16_t l8_to_rgb565_1(const uint8_t * src); + +static inline uint16x8_t lv_color_8_16_mix_8(const uint16_t * src, const uint16_t * dst); +static inline uint16x4_t lv_color_8_16_mix_4(const uint16_t * src, const uint16_t * dst); + +static inline uint16x8_t lv_color_8_16_mix_8_with_opa(const uint16_t * src, const uint16_t * dst, uint8_t opa); +static inline uint16x4_t lv_color_8_16_mix_4_with_opa(const uint16_t * src, const uint16_t * dst, uint8_t opa); +static inline uint16x8_t lv_color_8_16_mix_8_with_mask(const uint16_t * src, const uint16_t * dst, + const uint8_t * mask); +static inline uint16x4_t lv_color_8_16_mix_4_with_mask(const uint16_t * src, const uint16_t * dst, + const uint8_t * mask); +static inline uint16x8_t lv_color_8_16_mix_8_with_opa_mask(const uint16_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask); +static inline uint16x4_t lv_color_8_16_mix_4_with_opa_mask(const uint16_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask); + +static inline uint16x8_t lv_color_8_16_mix_8_internal(uint16x8_t dst_pixels, uint16x8_t src_pixels, + uint16x8_t mix_pixels); +static inline uint16x4_t lv_color_8_16_mix_4_internal(uint16x4_t dst_pixels, uint16x4_t src_pixels, + uint16x4_t mix_pixels); + +static inline uint32_t lv_color_8_16_mix_2(const uint8_t * src, const uint16_t * dst); +static inline uint32_t lv_color_8_16_mix_2_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa); +static inline uint32_t lv_color_8_16_mix_2_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask); +static inline uint32_t lv_color_8_16_mix_2_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t, + const uint8_t * mask); + +static inline uint16_t lv_color_8_16_mix_1_internal(uint8_t src, uint16_t dst, uint8_t mix); + +static inline uint16x8_t lv_color_32_16_mix_8(const uint8_t * src, const uint16_t * dst); +static inline uint16x8_t lv_color_32_16_mix_8_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa); +static inline uint16x8_t lv_color_32_16_mix_8_with_mask(const uint8_t * src, const uint16_t * dst, + const uint8_t * mask); +static inline uint16x8_t lv_color_32_16_mix_8_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask); + +static inline uint16x8_t lv_color_32_16_mix_8_internal(uint16x8_t g_pixels, uint16x8_t r_pixels, uint16x8_t b_pixels, + uint16x8_t a_pixels, uint16x8_t dst_pixels); + +static inline uint16x4_t lv_color_32_16_mix_4(const uint8_t * src, const uint16_t * dst); + +static inline uint16x4_t lv_color_32_16_mix_4_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa); +static inline uint16x4_t lv_color_32_16_mix_4_with_mask(const uint8_t * src, const uint16_t * dst, + const uint8_t * mask); +static inline uint16x4_t lv_color_32_16_mix_4_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask); +static inline uint16x4_t lv_color_32_16_mix_4_internal(uint16x4_t g_pixels, uint16x4_t r_pixels, uint16x4_t b_pixels, + uint16x4_t a_pixels, uint16x4_t dst_pixels); + +static inline uint32_t lv_color_32_16_mix_2(const uint8_t * src, const uint16_t * dst); + +static inline uint32_t lv_color_32_16_mix_2_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa); +static inline uint32_t lv_color_32_16_mix_2_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask); +static inline uint32_t lv_color_32_16_mix_2_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask); + +static inline uint32_t lv_color_32_16_mix_1(const uint8_t * src, const uint16_t * dst); +static inline uint16_t lv_color_32_16_mix_1_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa); +static inline uint16_t lv_color_32_16_mix_1_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask); +static inline uint16_t lv_color_32_16_mix_1_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask); + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + static inline uint16x8_t lv_color_24_16_mix_premult_8(const uint8_t * src, const uint16_t * dst); + static inline uint16x4_t lv_color_24_16_mix_premult_4(const uint8_t * src, const uint16_t * dst); + static inline uint32_t lv_color_24_16_mix_premult_2(const uint8_t * src, const uint16_t * dst); + static inline uint16_t lv_color_24_16_mix_premult_1(const uint8_t * src, const uint16_t * dst); +#endif + +static inline uint16x8_t lv_color_24_16_mix_8_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa, + uint8_t src_px_size); +static inline uint16x4_t lv_color_24_16_mix_4_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa, + uint8_t src_px_size); +static inline uint32_t lv_color_24_16_mix_2_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa, + uint8_t src_px_size); + +static inline uint16x8_t lv_color_24_16_mix_8_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask, + uint8_t src_px_size); +static inline uint16x4_t lv_color_24_16_mix_4_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask, + uint8_t src_px_size); +static inline uint32_t lv_color_24_16_mix_2_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask, + uint8_t src_px_size); + +static inline uint16x8_t lv_color_24_16_mix_8_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask, uint8_t src_px_size); +static inline uint16x4_t lv_color_24_16_mix_4_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask, uint8_t src_px_size); +static inline uint32_t lv_color_24_16_mix_2_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask, uint8_t src_px_size); + +static inline uint16_t lv_color_24_16_mix_1_internal(const uint8_t * src, const uint16_t * dst, uint8_t mix); +static inline uint16x8_t rgb888_to_rgb565_8(const uint8_t * src, uint8_t src_px_size); +static inline uint16x4_t rgb888_to_rgb565_4(const uint8_t * src, uint8_t src_px_size); +static inline uint32_t rgb888_to_rgb565_2(const uint8_t * src, uint8_t src_px_size); +static inline uint16_t rgb888_to_rgb565_1(const uint8_t * src); + +static inline uint16x8_t lv_color_16_16_mix_8_with_opa(const uint16_t * c1, const uint16_t * c2, uint8_t opa); +static inline uint16x8_t lv_color_16_16_mix_8_with_mask(const uint16_t * c1, const uint16_t * c2, const uint8_t * mask); +static inline uint16x8_t lv_color_16_16_mix_8_with_opa_mask(const uint16_t * c1, const uint16_t * c2, uint8_t opa, + const uint8_t * mask); +static inline uint16x8_t lv_color_16_16_mix_8_internal(uint16x8_t c1_vec, uint16x8_t c2_vec, uint16x8_t mix); + +static inline uint16x4_t lv_color_16_16_mix_4_with_opa(const uint16_t * c1, const uint16_t * c2, uint8_t opa); +static inline uint16x4_t lv_color_16_16_mix_4_with_mask(const uint16_t * c1, const uint16_t * c2, const uint8_t * mask); +static inline uint16x4_t lv_color_16_16_mix_4_with_opa_mask(const uint16_t * c1, const uint16_t * c2, uint8_t opa, + const uint8_t * mask); +static inline uint16x4_t lv_color_16_16_mix_4_internal(uint16x4_t c1_vec, uint16x4_t c2_vec, uint16x4_t mix); + +static inline uint32_t lv_color_16_16_mix_2_with_opa(const uint16_t * c1, const uint16_t * c2, uint8_t opa); +static inline uint32_t lv_color_16_16_mix_2_with_mask(const uint16_t * c1, const uint16_t * c2, const uint8_t * mask); +static inline uint32_t lv_color_16_16_mix_2_with_opa_mask(const uint16_t * c1, const uint16_t * c2, uint8_t opa, + const uint8_t * mask); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_draw_sw_blend_neon_color_to_rgb565(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint16_t color16 = lv_color_to_u16(dsc->color); + const uint16x8_t color_vec_8 = vdupq_n_u16(color16); + const uint16x4_t color_vec_4 = vdup_n_u16(color16); + const uint32_t color_vec_2 = color16 << 16 | color16; + uint16_t * dest_buf_u16 = dsc->dest_buf; + + for(int32_t y = 0; y < h; y++) { + uint16_t * row_ptr = dest_buf_u16; + int32_t x = 0; + /* Handle unaligned pixels at the beginning */ + const size_t offset = ((size_t)row_ptr) & 0xF; + if(offset != 0) { + int32_t pixel_alignment = (16 - offset) >> 1; + pixel_alignment = (pixel_alignment > w) ? w : pixel_alignment; + for(; x < pixel_alignment; x++) { + row_ptr[x] = color16; + } + } + for(; x < w - 7; x += 8) { + vst1q_u16(&row_ptr[x], color_vec_8); + } + for(; x < w - 3; x += 4) { + vst1_u16(&row_ptr[x], color_vec_4); + } + for(; x < w - 1; x += 2) { + *(uint32_t *)&row_ptr[x] = color_vec_2; + } + for(; x < w; x++) { + row_ptr[x] = color16; + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + } + + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_color_to_rgb565_with_opa(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint16_t color16 = lv_color_to_u16(dsc->color); + const uint32_t color32 = color16 << 16 | color16; + const uint16x8_t color_vec_8 = vdupq_n_u16(color16); + const uint16x4_t color_vec_4 = vdup_n_u16(color16); + const uint8_t opa = dsc->opa; + const uint16x8_t opa_vec_8 = vmovq_n_u16(opa); + const uint16x4_t opa_vec_4 = vmov_n_u16(opa); + uint16_t * dest_buf_u16 = dsc->dest_buf; + + for(int32_t y = 0; y < h; y++) { + uint16_t * row_ptr = dest_buf_u16; + int32_t x = 0; + /* Handle unaligned pixels at the beginning */ + const size_t offset = ((size_t)row_ptr) & 0xF; + if(offset != 0) { + int32_t pixel_alignment = (16 - offset) >> 1; + pixel_alignment = (pixel_alignment > w) ? w : pixel_alignment; + for(; x < pixel_alignment; x++) { + row_ptr[x] = lv_color_16_16_mix(color16, row_ptr[x], opa); + } + } + for(; x < w - 7; x += 8) { + const uint16x8_t src = vld1q_u16(&row_ptr[x]); + vst1q_u16(&row_ptr[x], lv_color_16_16_mix_8_internal(color_vec_8, src, opa_vec_8)); + } + for(; x < w - 3; x += 4) { + const uint16x4_t src = vld1_u16(&row_ptr[x]); + vst1_u16(&row_ptr[x], lv_color_16_16_mix_4_internal(color_vec_4, src, opa_vec_4)); + } + for(; x < w - 1; x += 2) { + *(uint32_t *)&row_ptr[x] = lv_color_16_16_mix_2_with_opa((const uint16_t *)&color32, &row_ptr[x], opa); + } + for(; x < w; x++) { + row_ptr[x] = lv_color_16_16_mix(color16, row_ptr[x], opa); + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + } + + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_color_to_rgb565_with_mask(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint16_t color16 = lv_color_to_u16(dsc->color); + const uint32_t color32 = color16 << 16 | color16; + const uint16x8_t color_vec_8 = vdupq_n_u16(color16); + const uint16x4_t color_vec_4 = vdup_n_u16(color16); + uint16_t * dest_buf_u16 = dsc->dest_buf; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * row_ptr = dest_buf_u16; + const uint8_t * mask_row = mask_buf_u8; + int32_t x = 0; + /* Handle unaligned pixels at the beginning */ + const size_t offset = ((size_t)row_ptr) & 0xF; + if(offset != 0) { + int32_t pixel_alignment = (16 - offset) >> 1; + pixel_alignment = (pixel_alignment > w) ? w : pixel_alignment; + for(; x < pixel_alignment; x++) { + row_ptr[x] = lv_color_16_16_mix(color16, row_ptr[x], mask_row[x]); + } + } + for(; x < w - 7; x += 8) { + const uint16x8_t src = vld1q_u16(&row_ptr[x]); + const uint16x8_t mask = vmovl_u8(vld1_u8(&mask_row[x])); + vst1q_u16(&row_ptr[x], lv_color_16_16_mix_8_internal(color_vec_8, src, mask)); + } + for(; x < w - 3; x += 4) { + const uint16x4_t src = vld1_u16(&row_ptr[x]); + const uint16x4_t mask_vec = vget_low_u16(vmovl_u8(vld1_u8(&mask_row[x]))); + vst1_u16(&row_ptr[x], lv_color_16_16_mix_4_internal(color_vec_4, src, mask_vec)); + } + for(; x < w - 1; x += 2) { + *(uint32_t *)&row_ptr[x] = + lv_color_16_16_mix_2_with_mask((const uint16_t *)&color32, &row_ptr[x], &mask_row[x]); + } + for(; x < w; x++) { + row_ptr[x] = lv_color_16_16_mix(color16, row_ptr[x], mask_row[x]); + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask_buf_u8 += mask_stride; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_color_to_rgb565_with_opa_mask(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint16_t color16 = lv_color_to_u16(dsc->color); + const uint32_t color32 = color16 << 16 | color16; + const uint16x8_t color_vec_8 = vdupq_n_u16(color16); + const uint16x4_t color_vec_4 = vdup_n_u16(color16); + const uint8_t opa = dsc->opa; + const uint16x8_t opa_vec_8 = vmovq_n_u16(opa); + const uint16x4_t opa_vec_4 = vmov_n_u16(opa); + + uint16_t * dest_buf_u16 = dsc->dest_buf; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * row_ptr = dest_buf_u16; + const uint8_t * mask_row = mask_buf_u8; + int32_t x = 0; + /* Handle unaligned pixels at the beginning */ + const size_t offset = ((size_t)row_ptr) & 0xF; + if(offset != 0) { + int32_t pixel_alignment = (16 - offset) >> 1; + pixel_alignment = (pixel_alignment > w) ? w : pixel_alignment; + for(; x < pixel_alignment; x++) { + row_ptr[x] = lv_color_16_16_mix(color16, row_ptr[x], LV_OPA_MIX2(opa, mask_row[x])); + } + } + for(; x < w - 7; x += 8) { + const uint16x8_t src = vld1q_u16(&row_ptr[x]); + const uint16x8_t mix = vshrq_n_u16(vmulq_u16(opa_vec_8, vmovl_u8(vld1_u8(&mask_row[x]))), 8); + vst1q_u16(&row_ptr[x], lv_color_16_16_mix_8_internal(color_vec_8, src, mix)); + } + for(; x < w - 3; x += 4) { + const uint16x4_t src = vld1_u16(&row_ptr[x]); + const uint16x4_t mix = vshr_n_u16(vmul_u16(opa_vec_4, vget_low_u16(vmovl_u8(vld1_u8(&mask_row[x])))), 8); + vst1_u16(&row_ptr[x], lv_color_16_16_mix_4_internal(color_vec_4, src, mix)); + } + for(; x < w - 1; x += 2) { + *(uint32_t *)&row_ptr[x] = + lv_color_16_16_mix_2_with_opa_mask((const uint16_t *)&color32, &row_ptr[x], opa, &mask_row[x]); + } + for(; x < w; x++) { + row_ptr[x] = lv_color_16_16_mix(color16, row_ptr[x], LV_OPA_MIX2(opa, mask_row[x])); + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask_buf_u8 += mask_stride; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_l8_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_l8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = src_buf_l8; + int32_t x = 0; + for(; x < w - 7; x += 8) { + + vst1q_u16(&dest_row[x], l8_to_rgb565_8(&src_row[x])); + } + for(; x < w - 3; x += 4) { + vst1_u16(&dest_row[x], l8_to_rgb565_4(&src_row[x])); + } + for(; x < w - 1; x += 2) { + *(uint32_t *)&dest_row[x] = l8_to_rgb565_2(&src_row[x]); + } + for(; x < w - 0; x += 1) { + dest_row[x] = l8_to_rgb565_1(&src_row[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + } + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += 16) { + vst1q_u16(&dest_row[x], lv_color_8_16_mix_8((const uint16_t *)&src_row[src_x], &dest_row[x])); + } + for(; x < w - 3; x += 4, src_x += 8) { + vst1_u16(&dest_row[x], lv_color_8_16_mix_4((const uint16_t *)&src_row[src_x], &dest_row[x])); + } + for(; x < w - 1; x += 2, src_x += 4) { + *(uint32_t *)&dest_row[x] = lv_color_8_16_mix_2(&src_row[src_x], &dest_row[x]); + } + for(; x < w - 0; x += 1, src_x += 2) { + dest_row[x] = lv_color_8_16_mix_1_internal(src_row[src_x], dest_row[x], src_row[src_x + 1]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb565_with_opa(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += 16) { + vst1q_u16(&dest_row[x], lv_color_8_16_mix_8_with_opa((const uint16_t *)&src_row[src_x], &dest_row[x], opa)); + } + for(; x < w - 3; x += 4, src_x += 8) { + vst1_u16(&dest_row[x], lv_color_8_16_mix_4_with_opa((const uint16_t *)&src_row[src_x], &dest_row[x], opa)); + } + for(; x < w - 1; x += 2, src_x += 4) { + *(uint32_t *)&dest_row[x] = lv_color_8_16_mix_2_with_opa(&src_row[src_x], &dest_row[x], opa); + } + for(; x < w - 0; x += 1, src_x += 2) { + dest_row[x] = + lv_color_8_16_mix_1_internal(src_row[src_x], dest_row[x], LV_OPA_MIX2(src_row[src_x + 1], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb565_with_mask(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + const uint8_t * mask_row = (const uint8_t *)mask_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += 16) { + vst1q_u16(&dest_row[x], + lv_color_8_16_mix_8_with_mask((const uint16_t *)&src_row[src_x], &dest_row[x], &mask_row[x])); + } + for(; x < w - 3; x += 4, src_x += 8) { + vst1_u16(&dest_row[x], + lv_color_8_16_mix_4_with_mask((const uint16_t *)&src_row[src_x], &dest_row[x], &mask_row[x])); + } + for(; x < w - 1; x += 2, src_x += 4) { + *(uint32_t *)&dest_row[x] = lv_color_8_16_mix_2_with_mask(&src_row[src_x], &dest_row[x], &mask_row[x]); + } + for(; x < w - 0; x += 1, src_x += 2) { + dest_row[x] = + lv_color_8_16_mix_1_internal(src_row[src_x], dest_row[x], LV_OPA_MIX2(src_row[src_x + 1], mask_row[x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf_u8 += mask_stride; + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb565_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t opa = dsc->opa; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + const uint8_t * mask_row = (const uint8_t *)mask_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += 16) { + vst1q_u16(&dest_row[x], lv_color_8_16_mix_8_with_opa_mask((const uint16_t *)&src_row[src_x], &dest_row[x], + opa, &mask_row[x])); + } + for(; x < w - 3; x += 4, src_x += 8) { + vst1_u16(&dest_row[x], lv_color_8_16_mix_4_with_opa_mask((const uint16_t *)&src_row[src_x], &dest_row[x], + opa, &mask_row[x])); + } + for(; x < w - 1; x += 2, src_x += 4) { + *(uint32_t *)&dest_row[x] = + lv_color_8_16_mix_2_with_opa_mask(&src_row[src_x], &dest_row[x], opa, &mask_row[x]); + } + for(; x < w - 0; x += 1, src_x += 2) { + dest_row[x] = lv_color_8_16_mix_1_internal(src_row[src_x], dest_row[x], + LV_OPA_MIX3(src_row[src_x + 1], mask_row[x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf_u8 += mask_stride; + } + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc) +{ + + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint16_t * src_row = (const uint16_t *)src_buf_u16; + int32_t x = 0; + + for(; x < w - 7; x += 8) { + vst1q_u16(&dest_row[x], vld1q_u16(&src_row[x])); + } + for(; x < w - 3; x += 4) { + vst1_u16(&dest_row[x], vld1_u16(&src_row[x])); + } + for(; x < w - 1; x += 2) { + *(uint32_t *)&dest_row[x] = *(uint32_t *)&src_row[x]; + } + for(; x < w - 0; x += 1) { + dest_row[x] = src_row[x]; + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb565_with_opa(lv_draw_sw_blend_image_dsc_t * dsc) +{ + + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint16_t * src_row = (const uint16_t *)src_buf_u16; + int32_t x = 0; + + for(; x < w - 7; x += 8) { + vst1q_u16(&dest_row[x], lv_color_16_16_mix_8_with_opa(&src_row[x], &dest_row[x], opa)); + } + for(; x < w - 3; x += 4) { + vst1_u16(&dest_row[x], lv_color_16_16_mix_4_with_opa(&src_row[x], &dest_row[x], opa)); + } + for(; x < w - 1; x += 2) { + *(uint32_t *)&dest_row[x] = lv_color_16_16_mix_2_with_opa(&src_row[x], &dest_row[x], opa); + } + for(; x < w - 0; x += 1) { + dest_row[x] = lv_color_16_16_mix(src_row[x], dest_row[x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb565_with_mask(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * mask_row = mask_buf_u8; + const uint16_t * src_row = (const uint16_t *)src_buf_u16; + int32_t x = 0; + + for(; x < w - 7; x += 8) { + vst1q_u16(&dest_row[x], lv_color_16_16_mix_8_with_mask(&src_row[x], &dest_row[x], &mask_row[x])); + } + for(; x < w - 3; x += 4) { + vst1_u16(&dest_row[x], lv_color_16_16_mix_4_with_mask(&src_row[x], &dest_row[x], &mask_row[x])); + } + for(; x < w - 1; x += 2) { + *(uint32_t *)&dest_row[x] = lv_color_16_16_mix_2_with_mask(&src_row[x], &dest_row[x], &mask_row[x]); + } + for(; x < w - 0; x += 1) { + dest_row[x] = lv_color_16_16_mix(src_row[x], dest_row[x], mask_row[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf_u8 += mask_stride; + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb565_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const uint8_t opa = dsc->opa; + const int32_t mask_stride = dsc->mask_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * mask_row = mask_buf_u8; + const uint16_t * src_row = (const uint16_t *)src_buf_u16; + int32_t x = 0; + + for(; x < w - 7; x += 8) { + vst1q_u16(&dest_row[x], lv_color_16_16_mix_8_with_opa_mask(&src_row[x], &dest_row[x], opa, &mask_row[x])); + } + for(; x < w - 3; x += 4) { + vst1_u16(&dest_row[x], lv_color_16_16_mix_4_with_opa_mask(&src_row[x], &dest_row[x], opa, &mask_row[x])); + } + for(; x < w - 1; x += 2) { + *(uint32_t *)&dest_row[x] = + lv_color_16_16_mix_2_with_opa_mask(&src_row[x], &dest_row[x], opa, &mask_row[x]); + } + for(; x < w - 0; x += 1) { + dest_row[x] = lv_color_16_16_mix(src_row[x], dest_row[x], LV_OPA_MIX2(mask_row[x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf_u8 += mask_stride; + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc, uint8_t src_px_size) +{ + + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + for(; x < w - 7; x += 8, src_x += src_px_size * 8) { + vst1q_u16(&dest_row[x], rgb888_to_rgb565_8(&src_row[src_x], src_px_size)); + } + for(; x < w - 3; x += 4, src_x += src_px_size * 4) { + vst1_u16(&dest_row[x], rgb888_to_rgb565_4(&src_row[src_x], src_px_size)); + } + for(; x < w - 1; x += 2, src_x += src_px_size * 2) { + *(uint32_t *)&dest_row[x] = rgb888_to_rgb565_2(&src_row[src_x], src_px_size); + } + for(; x < w - 0; x += 1, src_x += src_px_size * 1) { + dest_row[x] = rgb888_to_rgb565_1(&src_row[src_x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb565_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, uint8_t src_px_size) +{ + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += src_px_size * 8) { + vst1q_u16(&dest_row[x], lv_color_24_16_mix_8_with_opa(&src_row[src_x], &dest_row[x], opa, src_px_size)); + } + for(; x < w - 3; x += 4, src_x += src_px_size * 4) { + vst1_u16(&dest_row[x], lv_color_24_16_mix_4_with_opa(&src_row[src_x], &dest_row[x], opa, src_px_size)); + } + for(; x < w - 1; x += 2, src_x += src_px_size * 2) { + *(uint32_t *)&dest_row[x] = lv_color_24_16_mix_2_with_opa(&src_row[src_x], &dest_row[x], opa, src_px_size); + } + for(; x < w - 0; x += 1, src_x += src_px_size * 1) { + dest_row[x] = lv_color_24_16_mix_1_internal(&src_row[src_x], &dest_row[x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb565_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, uint8_t src_px_size) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * mask_row = mask_buf_u8; + const uint8_t * src_row = src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += src_px_size * 8) { + vst1q_u16(&dest_row[x], + lv_color_24_16_mix_8_with_mask(&src_row[src_x], &dest_row[x], &mask_row[x], src_px_size)); + } + for(; x < w - 3; x += 4, src_x += src_px_size * 4) { + vst1_u16(&dest_row[x], + lv_color_24_16_mix_4_with_mask(&src_row[src_x], &dest_row[x], &mask_row[x], src_px_size)); + } + for(; x < w - 1; x += 2, src_x += src_px_size * 2) { + *(uint32_t *)&dest_row[x] = + lv_color_24_16_mix_2_with_mask(&src_row[src_x], &dest_row[x], &mask_row[x], src_px_size); + } + for(; x < w - 0; x += 1, src_x += src_px_size * 1) { + dest_row[x] = lv_color_24_16_mix_1_internal(&src_row[src_x], &dest_row[x], mask_row[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf_u8 += mask_stride; + } + + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb565_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint8_t src_px_size) +{ + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t opa = dsc->opa; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * mask_row = mask_buf_u8; + const uint8_t * src_row = src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += src_px_size * 8) { + vst1q_u16(&dest_row[x], lv_color_24_16_mix_8_with_opa_mask(&src_row[src_x], &dest_row[x], opa, &mask_row[x], + src_px_size)); + } + for(; x < w - 3; x += 4, src_x += src_px_size * 4) { + vst1_u16(&dest_row[x], + lv_color_24_16_mix_4_with_opa_mask(&src_row[src_x], &dest_row[x], opa, &mask_row[x], src_px_size)); + } + for(; x < w - 1; x += 2, src_x += src_px_size * 2) { + *(uint32_t *)&dest_row[x] = + lv_color_24_16_mix_2_with_opa_mask(&src_row[src_x], &dest_row[x], opa, &mask_row[x], src_px_size); + } + for(; x < w - 0; x += 1, src_x += src_px_size * 1) { + dest_row[x] = lv_color_24_16_mix_1_internal(&src_row[src_x], &dest_row[x], LV_OPA_MIX2(mask_row[x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf_u8 += mask_stride; + } + + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += 32) { + vst1q_u16(&dest_row[x], lv_color_32_16_mix_8(&src_row[src_x], &dest_row[x])); + } + for(; x < w - 3; x += 4, src_x += 16) { + vst1_u16(&dest_row[x], lv_color_32_16_mix_4(&src_row[src_x], &dest_row[x])); + } + for(; x < w - 1; x += 2, src_x += 8) { + *(uint32_t *)&dest_row[x] = lv_color_32_16_mix_2(&src_row[src_x], &dest_row[x]); + } + for(; x < w - 0; x += 1, src_x += 4) { + dest_row[x] = lv_color_32_16_mix_1(&src_row[src_x], &dest_row[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb565_with_opa(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += 32) { + vst1q_u16(&dest_row[x], lv_color_32_16_mix_8_with_opa(&src_row[src_x], &dest_row[x], opa)); + } + for(; x < w - 3; x += 4, src_x += 16) { + vst1_u16(&dest_row[x], lv_color_32_16_mix_4_with_opa(&src_row[src_x], &dest_row[x], opa)); + } + for(; x < w - 1; x += 2, src_x += 8) { + *(uint32_t *)&dest_row[x] = lv_color_32_16_mix_2_with_opa(&src_row[src_x], &dest_row[x], opa); + } + for(; x < w - 0; x += 1, src_x += 4) { + dest_row[x] = lv_color_32_16_mix_1_with_opa(&src_row[src_x], &dest_row[x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb565_with_mask(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * mask_row = mask_buf_u8; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += 32) { + vst1q_u16(&dest_row[x], lv_color_32_16_mix_8_with_mask(&src_row[src_x], &dest_row[x], &mask_row[x])); + } + for(; x < w - 3; x += 4, src_x += 16) { + vst1_u16(&dest_row[x], lv_color_32_16_mix_4_with_mask(&src_row[src_x], &dest_row[x], &mask_row[x])); + } + for(; x < w - 1; x += 2, src_x += 8) { + *(uint32_t *)&dest_row[x] = lv_color_32_16_mix_2_with_mask(&src_row[src_x], &dest_row[x], &mask_row[x]); + } + for(; x < w - 0; x += 1, src_x += 4) { + dest_row[x] = lv_color_32_16_mix_1_with_mask(&src_row[src_x], &dest_row[x], &mask_row[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf_u8 += mask_stride; + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb565_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * mask_row = mask_buf_u8; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += 32) { + vst1q_u16(&dest_row[x], + lv_color_32_16_mix_8_with_opa_mask(&src_row[src_x], &dest_row[x], opa, &mask_row[x])); + } + for(; x < w - 3; x += 4, src_x += 16) { + vst1_u16(&dest_row[x], + lv_color_32_16_mix_4_with_opa_mask(&src_row[src_x], &dest_row[x], opa, &mask_row[x])); + } + for(; x < w - 1; x += 2, src_x += 8) { + *(uint32_t *)&dest_row[x] = + lv_color_32_16_mix_2_with_opa_mask(&src_row[src_x], &dest_row[x], opa, &mask_row[x]); + } + + for(; x < w - 0; x += 1, src_x += 4) { + dest_row[x] = lv_color_32_16_mix_1_with_opa_mask(&src_row[src_x], &dest_row[x], opa, &mask_row[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf_u8 += mask_stride; + } + return LV_RESULT_OK; +} + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED +lv_result_t lv_draw_sw_blend_neon_argb888_premultiplied_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + + for(int32_t y = 0; y < h; y++) { + uint16_t * dest_row = dest_buf_u16; + const uint8_t * src_row = (const uint8_t *)src_buf_u8; + int32_t x = 0; + int32_t src_x = 0; + + for(; x < w - 7; x += 8, src_x += 32) { + vst1q_u16(&dest_row[x], lv_color_24_16_mix_premult_8(&src_row[src_x], &dest_row[x])); + } + for(; x < w - 3; x += 4, src_x += 16) { + vst1_u16(&dest_row[x], lv_color_24_16_mix_premult_4(&src_row[src_x], &dest_row[x])); + } + for(; x < w - 1; x += 2, src_x += 8) { + *(uint32_t *)&dest_row[x] = lv_color_24_16_mix_premult_2(&src_row[src_x], &dest_row[x]); + } + for(; x < w - 0; x += 1, src_x += 4) { + dest_row[x] = lv_color_24_16_mix_premult_1(&src_row[src_x], &dest_row[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + return LV_RESULT_OK; +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline uint16x8_t l8_to_rgb565_8(const uint8_t * src) +{ + uint16x8_t pixels = vmovl_u8(vld1_u8(src)); + uint16x8_t r = vshlq_n_u16(vandq_u16(pixels, vdupq_n_u16(0xF8)), 8); + uint16x8_t g = vshlq_n_u16(vandq_u16(pixels, vdupq_n_u16(0xFC)), 3); + uint16x8_t b = vshrq_n_u16(vandq_u16(pixels, vdupq_n_u16(0xF8)), 3); + return vorrq_u16(vorrq_u16(r, g), b); +} + +static inline uint16x4_t l8_to_rgb565_4(const uint8_t * src) +{ + const uint8_t tmp[8] = {src[0], src[1], src[2], src[3]}; + const uint16x8_t p = vmovl_u8(vld1_u8(tmp)); + const uint16x4_t pixels = vget_low_u16(p); + + const uint16x4_t r = vshl_n_u16(vand_u16(pixels, vdup_n_u16(0xF8)), 8); + const uint16x4_t g = vshl_n_u16(vand_u16(pixels, vdup_n_u16(0xFC)), 3); + const uint16x4_t b = vshr_n_u16(vand_u16(pixels, vdup_n_u16(0xF8)), 3); + return vorr_u16(vorr_u16(r, g), b); +} + +static inline uint32_t l8_to_rgb565_2(const uint8_t * src) +{ + return ((uint32_t)l8_to_rgb565_1(src + 1) << 16) | l8_to_rgb565_1(src); +} +static inline uint16_t l8_to_rgb565_1(const uint8_t * src) +{ + return ((src[0] & 0xF8) << 8) + ((src[0] & 0xFC) << 3) + ((src[0] & 0xF8) >> 3); +} + +static inline uint16x8_t lv_color_8_16_mix_8(const uint16_t * src, const uint16_t * dst) +{ + const uint16x8_t src_mix_pixels = vld1q_u16(src); + const uint16x8_t dst_pixels = vld1q_u16(dst); + const uint16x8_t src_pixels = vandq_u16(src_mix_pixels, vdupq_n_u16(0xFF)); + const uint16x8_t mix_pixels = vshrq_n_u16(src_mix_pixels, 8); + + return lv_color_8_16_mix_8_internal(src_pixels, dst_pixels, mix_pixels); +} + +static inline uint16x8_t lv_color_8_16_mix_8_with_opa(const uint16_t * src, const uint16_t * dst, uint8_t opa) +{ + const uint16x8_t src_mix_pixels = vld1q_u16(src); + const uint16x8_t dst_pixels = vld1q_u16(dst); + const uint16x8_t src_pixels = vandq_u16(src_mix_pixels, vdupq_n_u16(0xFF)); + const uint16x8_t mix_pixels = vshrq_n_u16(src_mix_pixels, 8); + const uint16x8_t opa_vec = vmovq_n_u16(opa); + const uint16x8_t mix_vec = vshrq_n_u16(vmulq_u16(opa_vec, mix_pixels), 8); + return lv_color_8_16_mix_8_internal(src_pixels, dst_pixels, mix_vec); +} + +static inline uint16x4_t lv_color_8_16_mix_4_with_opa(const uint16_t * src, const uint16_t * dst, uint8_t opa) +{ + const uint16x4_t src_mix_pixels = vld1_u16(src); + const uint16x4_t dst_pixels = vld1_u16(dst); + const uint16x4_t src_pixels = vand_u16(src_mix_pixels, vdup_n_u16(0xFF)); + const uint16x4_t mix_pixels = vshr_n_u16(src_mix_pixels, 8); + const uint16x4_t opa_vec = vmov_n_u16(opa); + const uint16x4_t mix_vec = vshr_n_u16(vmul_u16(opa_vec, mix_pixels), 8); + return lv_color_8_16_mix_4_internal(src_pixels, dst_pixels, mix_vec); +} +static inline uint16x8_t lv_color_8_16_mix_8_with_mask(const uint16_t * src, const uint16_t * dst, const uint8_t * mask) +{ + const uint16x8_t src_mix_pixels = vld1q_u16(src); + const uint16x8_t dst_pixels = vld1q_u16(dst); + const uint16x8_t src_pixels = vandq_u16(src_mix_pixels, vdupq_n_u16(0xFF)); + const uint16x8_t mix_pixels = vshrq_n_u16(src_mix_pixels, 8); + const uint16x8_t mask_vec = vmovl_u8(vld1_u8(mask)); + const uint16x8_t mix_vec = vshrq_n_u16(vmulq_u16(mask_vec, mix_pixels), 8); + return lv_color_8_16_mix_8_internal(src_pixels, dst_pixels, mix_vec); +} + +static inline uint16x4_t lv_color_8_16_mix_4_with_mask(const uint16_t * src, const uint16_t * dst, const uint8_t * mask) +{ + const uint16x4_t src_mix_pixels = vld1_u16(src); + const uint16x4_t dst_pixels = vld1_u16(dst); + const uint16x4_t src_pixels = vand_u16(src_mix_pixels, vdup_n_u16(0xFF)); + const uint16x4_t mix_pixels = vshr_n_u16(src_mix_pixels, 8); + const uint16x4_t mask_vec = vget_low_u16(vmovl_u8(vld1_u8(mask))); + const uint16x4_t mix_vec = vshr_n_u16(vmul_u16(mask_vec, mix_pixels), 8); + return lv_color_8_16_mix_4_internal(src_pixels, dst_pixels, mix_vec); +} +static inline uint16x8_t lv_color_8_16_mix_8_with_opa_mask(const uint16_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask) +{ + const uint16x8_t src_mix_pixels = vld1q_u16(src); + const uint16x8_t dst_pixels = vld1q_u16(dst); + const uint16x8_t src_pixels = vandq_u16(src_mix_pixels, vdupq_n_u16(0xFF)); + const uint16x8_t mix_pixels = vshrq_n_u16(src_mix_pixels, 8); + const uint16x8_t mask_vec = vmovl_u8(vld1_u8(mask)); + const uint16x8_t opa_vec = vmovq_n_u16(opa); + + /* Use uint32 for intermediate multiplication results to avoid 16bit overflows */ + const uint32x4_t mix_pixels_low = vmovl_u16(vget_low_u16(mix_pixels)); + const uint32x4_t mix_pixels_high = vmovl_u16(vget_high_u16(mix_pixels)); + const uint32x4_t opa_vec_low = vmovl_u16(vget_low_u16(opa_vec)); + const uint32x4_t opa_vec_high = vmovl_u16(vget_high_u16(opa_vec)); + const uint32x4_t mask_vec_low = vmovl_u16(vget_low_u16(mask_vec)); + const uint32x4_t mask_vec_high = vmovl_u16(vget_high_u16(mask_vec)); + + const uint32x4_t mul_low = vshrq_n_u32(vmulq_u32(vmulq_u32(mix_pixels_low, opa_vec_low), mask_vec_low), 16); + const uint32x4_t mul_high = vshrq_n_u32(vmulq_u32(vmulq_u32(mix_pixels_high, opa_vec_high), mask_vec_high), 16); + const uint16x8_t mix_vec = vcombine_u16(vmovn_u32(mul_low), vmovn_u32(mul_high)); + return lv_color_8_16_mix_8_internal(src_pixels, dst_pixels, mix_vec); +} + +static inline uint16x4_t lv_color_8_16_mix_4_with_opa_mask(const uint16_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask) +{ + + const uint16x4_t src_mix_pixels = vld1_u16(src); + const uint16x4_t dst_pixels = vld1_u16(dst); + const uint16x4_t src_pixels = vand_u16(src_mix_pixels, vdup_n_u16(0xFF)); + const uint16x4_t mix_pixels = vshr_n_u16(src_mix_pixels, 8); + const uint16x4_t opa_vec = vmov_n_u16(opa); + const uint16x4_t mask_vec = vget_low_u16(vmovl_u8(vld1_u8(mask))); + const uint32x4_t a_pixels_low = vmovl_u16(mix_pixels); + const uint32x4_t opa_vec_low = vmovl_u16(opa_vec); + const uint32x4_t mask_vec_low = vmovl_u16(mask_vec); + + const uint32x4_t mul_result = vshrq_n_u32(vmulq_u32(vmulq_u32(a_pixels_low, opa_vec_low), mask_vec_low), 16); + const uint16x4_t mix_vec = vmovn_u32(mul_result); + return lv_color_8_16_mix_4_internal(src_pixels, dst_pixels, mix_vec); +} + +static inline uint16x8_t lv_color_8_16_mix_8_internal(uint16x8_t src_pixels, uint16x8_t dst_pixels, + uint16x8_t mix_pixels) +{ + const uint16x8_t mix_zero_mask = vceqq_u16(mix_pixels, vdupq_n_u16(0)); + const uint16x8_t mix_full_mask = vceqq_u16(mix_pixels, vdupq_n_u16(255)); + /* Prepare result in case mix == 255 */ + const uint16x8_t src_r565 = vshlq_n_u16(vandq_u16(src_pixels, vdupq_n_u16(0xF8)), 8); + const uint16x8_t src_g565 = vshlq_n_u16(vandq_u16(src_pixels, vdupq_n_u16(0xFC)), 3); + const uint16x8_t src_b565 = vshrq_n_u16(vandq_u16(src_pixels, vdupq_n_u16(0xF8)), 3); + const uint16x8_t src_rgb565 = vaddq_u16(vaddq_u16(src_r565, src_g565), src_b565); + + /* Do the actual blending */ + const uint16x8_t mix_inv_16 = vsubq_u16(vdupq_n_u16(255), mix_pixels); + + /* Red: ((c1 >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800 */ + const uint16x8_t src_r = vmulq_u16(vshrq_n_u16(src_pixels, 3), mix_pixels); + const uint16x8_t dst_r = vandq_u16(vshrq_n_u16(dst_pixels, 11), vdupq_n_u16(0x1F)); + uint16x8_t blended_r = vmlaq_u16(src_r, dst_r, mix_inv_16); + blended_r = vandq_u16(vshlq_n_u16(blended_r, 3), vdupq_n_u16(0xF800)); + + /* Green: ((c1 >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0 */ + const uint16x8_t src_g = vmulq_u16(vshrq_n_u16(src_pixels, 2), mix_pixels); + const uint16x8_t dst_g = vandq_u16(vshrq_n_u16(dst_pixels, 5), vdupq_n_u16(0x3F)); + uint16x8_t blended_g = vmlaq_u16(src_g, dst_g, mix_inv_16); + blended_g = vandq_u16(vshrq_n_u16(blended_g, 3), vdupq_n_u16(0x07E0)); + + /* Blue: ((c1 >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8 */ + const uint16x8_t src_b = vmulq_u16(vshrq_n_u16(src_pixels, 3), mix_pixels); + const uint16x8_t dst_b = vandq_u16(dst_pixels, vdupq_n_u16(0x1F)); + uint16x8_t blended_b = vmlaq_u16(src_b, dst_b, mix_inv_16); + blended_b = vshrq_n_u16(blended_b, 8); + + /* Select what value to take for each pixel depending on original mix value */ + const uint16x8_t blended_result = vorrq_u16(vorrq_u16(blended_r, blended_g), blended_b); + const uint16x8_t result = vbslq_u16(mix_zero_mask, dst_pixels, blended_result); + return vbslq_u16(mix_full_mask, src_rgb565, result); +} +static inline uint16x4_t lv_color_8_16_mix_4_internal(uint16x4_t src_pixels, uint16x4_t dst_pixels, + uint16x4_t mix_pixels) +{ + + const uint16x4_t mix_zero_mask = vceq_u16(mix_pixels, vdup_n_u16(0)); + const uint16x4_t mix_full_mask = vceq_u16(mix_pixels, vdup_n_u16(255)); + /* Prepare result in case mix == 255 */ + const uint16x4_t src_r565 = vshl_n_u16(vand_u16(src_pixels, vdup_n_u16(0xF8)), 8); + const uint16x4_t src_g565 = vshl_n_u16(vand_u16(src_pixels, vdup_n_u16(0xFC)), 3); + const uint16x4_t src_b565 = vshr_n_u16(vand_u16(src_pixels, vdup_n_u16(0xF8)), 3); + const uint16x4_t src_rgb565 = vadd_u16(vadd_u16(src_r565, src_g565), src_b565); + const uint16x4_t mix_inv_16 = vsub_u16(vdup_n_u16(255), mix_pixels); + + /* Red: ((c1 >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800 */ + const uint16x4_t src_r = vmul_u16(vshr_n_u16(src_pixels, 3), mix_pixels); + const uint16x4_t dst_r = vand_u16(vshr_n_u16(dst_pixels, 11), vdup_n_u16(0x1F)); + uint16x4_t blended_r = vmla_u16(src_r, dst_r, mix_inv_16); + blended_r = vand_u16(vshl_n_u16(blended_r, 3), vdup_n_u16(0xF800)); + + /* Green: ((c1 >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0 */ + const uint16x4_t src_g = vmul_u16(vshr_n_u16(src_pixels, 2), mix_pixels); + const uint16x4_t dst_g = vand_u16(vshr_n_u16(dst_pixels, 5), vdup_n_u16(0x3F)); + uint16x4_t blended_g = vmla_u16(src_g, dst_g, mix_inv_16); + blended_g = vand_u16(vshr_n_u16(blended_g, 3), vdup_n_u16(0x07E0)); + + /* Blue: ((c1 >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8 */ + const uint16x4_t src_b = vmul_u16(vshr_n_u16(src_pixels, 3), mix_pixels); + const uint16x4_t dst_b = vand_u16(dst_pixels, vdup_n_u16(0x1F)); + uint16x4_t blended_b = vmla_u16(src_b, dst_b, mix_inv_16); + blended_b = vshr_n_u16(blended_b, 8); + + const uint16x4_t blended_result = vorr_u16(vorr_u16(blended_r, blended_g), blended_b); + const uint16x4_t result = vbsl_u16(mix_zero_mask, dst_pixels, blended_result); + return vbsl_u16(mix_full_mask, src_rgb565, result); +} + +static inline uint16x4_t lv_color_8_16_mix_4(const uint16_t * src, const uint16_t * dst) +{ + const uint16x4_t src_mix_pixels = vld1_u16(src); + const uint16x4_t dst_pixels = vld1_u16(dst); + const uint16x4_t src_pixels = vand_u16(src_mix_pixels, vdup_n_u16(0xFF)); + const uint16x4_t mix_pixels = vshr_n_u16(src_mix_pixels, 8); + return lv_color_8_16_mix_4_internal(src_pixels, dst_pixels, mix_pixels); +} + +static inline uint32_t lv_color_8_16_mix_2(const uint8_t * src, const uint16_t * dst) +{ + return ((uint32_t)lv_color_8_16_mix_1_internal(src[2], dst[1], src[3]) << 16) | + lv_color_8_16_mix_1_internal(src[0], dst[0], src[1]); +} + +static inline uint32_t lv_color_8_16_mix_2_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa) +{ + return ((uint32_t)lv_color_8_16_mix_1_internal(src[2], dst[1], LV_OPA_MIX2(src[3], opa)) << 16) | + lv_color_8_16_mix_1_internal(src[0], dst[0], LV_OPA_MIX2(src[1], opa)); +} + +static inline uint32_t lv_color_8_16_mix_2_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask) +{ + + return ((uint32_t)lv_color_8_16_mix_1_internal(src[2], dst[1], LV_OPA_MIX2(src[3], mask[1])) << 16) | + lv_color_8_16_mix_1_internal(src[0], dst[0], LV_OPA_MIX2(src[1], mask[0])); +} +static inline uint32_t lv_color_8_16_mix_2_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask) +{ + + return ((uint32_t)lv_color_8_16_mix_1_internal(src[2], dst[1], LV_OPA_MIX3(src[3], mask[1], opa)) << 16) | + lv_color_8_16_mix_1_internal(src[0], dst[0], LV_OPA_MIX3(src[3], mask[0], opa)); +} + +static inline uint16_t lv_color_8_16_mix_1_internal(uint8_t src, uint16_t dst, uint8_t mix) +{ + const uint8_t c1 = src; + const uint16_t c2 = dst; + + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); + } + else { + uint8_t mix_inv = 255 - mix; + return ((((c1 >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + ((((c1 >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + (((c1 >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); + } +} + +static inline uint16x8_t lv_color_32_16_mix_8(const uint8_t * src, const uint16_t * dst) +{ + const uint16x8_t dst_pixels = vld1q_u16(dst); + + const uint8x8x4_t rgba = vld4_u8(src); + const uint16x8_t b_pixels = vmovl_u8(rgba.val[0]); + const uint16x8_t g_pixels = vmovl_u8(rgba.val[1]); + const uint16x8_t r_pixels = vmovl_u8(rgba.val[2]); + const uint16x8_t a_pixels = vmovl_u8(rgba.val[3]); + + return lv_color_32_16_mix_8_internal(r_pixels, g_pixels, b_pixels, a_pixels, dst_pixels); +} +static inline uint16x4_t lv_color_32_16_mix_4(const uint8_t * src, const uint16_t * dst) +{ + const uint16x4_t dst_pixels = vld1_u16(dst); + uint8_t b_array[8] = {src[0], src[4], src[8], src[12], 0, 0, 0, 0}; + uint8_t g_array[8] = {src[1], src[5], src[9], src[13], 0, 0, 0, 0}; + uint8_t r_array[8] = {src[2], src[6], src[10], src[14], 0, 0, 0, 0}; + uint8_t a_array[8] = {src[3], src[7], src[11], src[15], 0, 0, 0, 0}; + const uint16x4_t b_pixels = vget_low_u16(vmovl_u8(vld1_u8(b_array))); + const uint16x4_t g_pixels = vget_low_u16(vmovl_u8(vld1_u8(g_array))); + const uint16x4_t r_pixels = vget_low_u16(vmovl_u8(vld1_u8(r_array))); + const uint16x4_t a_pixels = vget_low_u16(vmovl_u8(vld1_u8(a_array))); + return lv_color_32_16_mix_4_internal(r_pixels, g_pixels, b_pixels, a_pixels, dst_pixels); +} + +static inline uint16x8_t lv_color_24_16_mix_8_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask, + uint8_t src_px_size) +{ + uint16x8_t b_pixels; + uint16x8_t g_pixels; + uint16x8_t r_pixels; + LV_ASSERT_MSG(src_px_size == 3 || src_px_size == 4, "Invalid pixel size for rgb888. Expected either 3 or 4 bytes"); + + if(src_px_size == 3) { + const uint8x8x3_t rgba = vld3_u8(src); + b_pixels = vmovl_u8(rgba.val[0]); + g_pixels = vmovl_u8(rgba.val[1]); + r_pixels = vmovl_u8(rgba.val[2]); + } + else if(src_px_size == 4) { + const uint8x8x4_t rgba = vld4_u8(src); + b_pixels = vmovl_u8(rgba.val[0]); + g_pixels = vmovl_u8(rgba.val[1]); + r_pixels = vmovl_u8(rgba.val[2]); + } + const uint16x8_t dst_pixels = vld1q_u16(dst); + const uint16x8_t mask_vec = vmovl_u8(vld1_u8(mask)); + + return lv_color_32_16_mix_8_internal(r_pixels, g_pixels, b_pixels, mask_vec, dst_pixels); +} +static inline uint16x4_t lv_color_24_16_mix_4_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask, + uint8_t src_px_size) +{ + uint16x4_t b_pixels; + uint16x4_t g_pixels; + uint16x4_t r_pixels; + LV_ASSERT_MSG(src_px_size == 3 || src_px_size == 4, "Invalid pixel size for rgb888. Expected either 3 or 4 bytes"); + + if(src_px_size == 3) { + const uint8x8x3_t rgba = vld3_u8(src); + b_pixels = vget_low_u16(vmovl_u8(rgba.val[0])); + g_pixels = vget_low_u16(vmovl_u8(rgba.val[1])); + r_pixels = vget_low_u16(vmovl_u8(rgba.val[2])); + } + else if(src_px_size == 4) { + const uint8x8x4_t rgba = vld4_u8(src); + b_pixels = vget_low_u16(vmovl_u8(rgba.val[0])); + g_pixels = vget_low_u16(vmovl_u8(rgba.val[1])); + r_pixels = vget_low_u16(vmovl_u8(rgba.val[2])); + } + const uint16x4_t dst_pixels = vld1_u16(dst); + const uint16x4_t mask_vec = vget_low_u16(vmovl_u8(vld1_u8(mask))); + + return lv_color_32_16_mix_4_internal(r_pixels, g_pixels, b_pixels, mask_vec, dst_pixels); +} + +static inline uint16x8_t lv_color_24_16_mix_8_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask, uint8_t src_px_size) +{ + uint16x8_t b_pixels; + uint16x8_t g_pixels; + uint16x8_t r_pixels; + LV_ASSERT_MSG(src_px_size == 3 || src_px_size == 4, "Invalid pixel size for rgb888. Expected either 3 or 4 bytes"); + + if(src_px_size == 3) { + const uint8x8x3_t rgba = vld3_u8(src); + b_pixels = vmovl_u8(rgba.val[0]); + g_pixels = vmovl_u8(rgba.val[1]); + r_pixels = vmovl_u8(rgba.val[2]); + } + else if(src_px_size == 4) { + const uint8x8x4_t rgba = vld4_u8(src); + b_pixels = vmovl_u8(rgba.val[0]); + g_pixels = vmovl_u8(rgba.val[1]); + r_pixels = vmovl_u8(rgba.val[2]); + } + const uint16x8_t dst_pixels = vld1q_u16(dst); + const uint16x8_t mask_vec = vmovl_u8(vld1_u8(mask)); + const uint16x8_t opa_vec = vmovq_n_u16(opa); + const uint16x8_t mix_vec = vshrq_n_u16(vmulq_u16(opa_vec, mask_vec), 8); + + return lv_color_32_16_mix_8_internal(r_pixels, g_pixels, b_pixels, mix_vec, dst_pixels); +} +static inline uint16x4_t lv_color_24_16_mix_4_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask, uint8_t src_px_size) +{ + uint16x4_t b_pixels; + uint16x4_t g_pixels; + uint16x4_t r_pixels; + LV_ASSERT_MSG(src_px_size == 3 || src_px_size == 4, "Invalid pixel size for rgb888. Expected either 3 or 4 bytes"); + + if(src_px_size == 3) { + const uint8x8x3_t rgba = vld3_u8(src); + b_pixels = vget_low_u16(vmovl_u8(rgba.val[0])); + g_pixels = vget_low_u16(vmovl_u8(rgba.val[1])); + r_pixels = vget_low_u16(vmovl_u8(rgba.val[2])); + } + else if(src_px_size == 4) { + const uint8x8x4_t rgba = vld4_u8(src); + b_pixels = vget_low_u16(vmovl_u8(rgba.val[0])); + g_pixels = vget_low_u16(vmovl_u8(rgba.val[1])); + r_pixels = vget_low_u16(vmovl_u8(rgba.val[2])); + } + const uint16x4_t dst_pixels = vld1_u16(dst); + const uint16x4_t mask_vec = vget_low_u16(vmovl_u8(vld1_u8(mask))); + const uint16x4_t opa_vec = vmov_n_u16(opa); + const uint16x4_t mix_vec = vshr_n_u16(vmul_u16(opa_vec, mask_vec), 8); + + return lv_color_32_16_mix_4_internal(r_pixels, g_pixels, b_pixels, mix_vec, dst_pixels); +} +static inline uint32_t lv_color_24_16_mix_2_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask, uint8_t src_px_size) +{ + + return (lv_color_24_16_mix_1_internal(src + src_px_size, dst + 1, LV_OPA_MIX2(mask[1], opa)) << 16) | + lv_color_24_16_mix_1_internal(src, dst, LV_OPA_MIX2(mask[0], opa)); +} +static inline uint16x8_t lv_color_24_16_mix_8_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa, + uint8_t src_px_size) +{ + uint16x8_t b_pixels; + uint16x8_t g_pixels; + uint16x8_t r_pixels; + LV_ASSERT_MSG(src_px_size == 3 || src_px_size == 4, "Invalid pixel size for rgb888. Expected either 3 or 4 bytes"); + + if(src_px_size == 3) { + const uint8x8x3_t rgba = vld3_u8(src); + b_pixels = vmovl_u8(rgba.val[0]); + g_pixels = vmovl_u8(rgba.val[1]); + r_pixels = vmovl_u8(rgba.val[2]); + } + else if(src_px_size == 4) { + const uint8x8x4_t rgba = vld4_u8(src); + b_pixels = vmovl_u8(rgba.val[0]); + g_pixels = vmovl_u8(rgba.val[1]); + r_pixels = vmovl_u8(rgba.val[2]); + } + const uint16x8_t dst_pixels = vld1q_u16(dst); + const uint16x8_t opa_vec = vmovq_n_u16(opa); + + return lv_color_32_16_mix_8_internal(r_pixels, g_pixels, b_pixels, opa_vec, dst_pixels); +} +static inline uint16x8_t lv_color_32_16_mix_8_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa) +{ + const uint16x8_t dst_pixels = vld1q_u16(dst); + + const uint8x8x4_t rgba = vld4_u8(src); + const uint16x8_t b_pixels = vmovl_u8(rgba.val[0]); + const uint16x8_t g_pixels = vmovl_u8(rgba.val[1]); + const uint16x8_t r_pixels = vmovl_u8(rgba.val[2]); + const uint16x8_t a_pixels = vmovl_u8(rgba.val[3]); + const uint16x8_t opa_vec = vmovq_n_u16(opa); + const uint16x8_t opa_a_mul = vshrq_n_u16(vmulq_u16(a_pixels, opa_vec), 8); + + return lv_color_32_16_mix_8_internal(r_pixels, g_pixels, b_pixels, opa_a_mul, dst_pixels); +} + +static inline uint16x4_t lv_color_24_16_mix_4_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t mix, + uint8_t src_px_size) +{ + + uint16x4_t b_pixels; + uint16x4_t g_pixels; + uint16x4_t r_pixels; + LV_ASSERT_MSG(src_px_size == 3 || src_px_size == 4, "Invalid pixel size for rgb888. Expected either 3 or 4 bytes"); + + if(src_px_size == 3) { + const uint8x8x3_t rgba = vld3_u8(src); + b_pixels = vget_low_u16(vmovl_u8(rgba.val[0])); + g_pixels = vget_low_u16(vmovl_u8(rgba.val[1])); + r_pixels = vget_low_u16(vmovl_u8(rgba.val[2])); + } + else if(src_px_size == 4) { + const uint8x8x4_t rgba = vld4_u8(src); + b_pixels = vget_low_u16(vmovl_u8(rgba.val[0])); + g_pixels = vget_low_u16(vmovl_u8(rgba.val[1])); + r_pixels = vget_low_u16(vmovl_u8(rgba.val[2])); + } + const uint16x4_t dst_pixels = vld1_u16(dst); + const uint16x4_t mix_vec = vget_low_u16(vmovq_n_u16(mix)); + + return lv_color_32_16_mix_4_internal(r_pixels, g_pixels, b_pixels, mix_vec, dst_pixels); +} +static inline uint16x4_t lv_color_32_16_mix_4_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa) +{ + const uint16x4_t dst_pixels = vld1_u16(dst); + uint8_t b_array[8] = {src[0], src[4], src[8], src[12], 0, 0, 0, 0}; + uint8_t g_array[8] = {src[1], src[5], src[9], src[13], 0, 0, 0, 0}; + uint8_t r_array[8] = {src[2], src[6], src[10], src[14], 0, 0, 0, 0}; + uint8_t a_array[8] = {src[3], src[7], src[11], src[15], 0, 0, 0, 0}; + const uint16x4_t b_pixels = vget_low_u16(vmovl_u8(vld1_u8(b_array))); + const uint16x4_t g_pixels = vget_low_u16(vmovl_u8(vld1_u8(g_array))); + const uint16x4_t r_pixels = vget_low_u16(vmovl_u8(vld1_u8(r_array))); + const uint16x4_t a_pixels = vget_low_u16(vmovl_u8(vld1_u8(a_array))); + const uint16x4_t opa_vec = vmov_n_u16(opa); + const uint16x4_t opa_a_mul = vshr_n_u16(vmul_u16(a_pixels, opa_vec), 8); + + return lv_color_32_16_mix_4_internal(r_pixels, g_pixels, b_pixels, opa_a_mul, dst_pixels); +} + +static inline uint16x8_t lv_color_32_16_mix_8_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask) +{ + const uint16x8_t dst_pixels = vld1q_u16(dst); + + const uint8x8x4_t rgba = vld4_u8(src); + const uint16x8_t b_pixels = vmovl_u8(rgba.val[0]); + const uint16x8_t g_pixels = vmovl_u8(rgba.val[1]); + const uint16x8_t r_pixels = vmovl_u8(rgba.val[2]); + const uint16x8_t a_pixels = vmovl_u8(rgba.val[3]); + const uint16x8_t mask_vec = vmovl_u8(vld1_u8(mask)); + const uint16x8_t mask_a_mul = vshrq_n_u16(vmulq_u16(a_pixels, mask_vec), 8); + + return lv_color_32_16_mix_8_internal(r_pixels, g_pixels, b_pixels, mask_a_mul, dst_pixels); +} +static inline uint16x4_t lv_color_32_16_mix_4_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask) +{ + + const uint16x4_t dst_pixels = vld1_u16(dst); + uint8_t b_array[8] = {src[0], src[4], src[8], src[12], 0, 0, 0, 0}; + uint8_t g_array[8] = {src[1], src[5], src[9], src[13], 0, 0, 0, 0}; + uint8_t r_array[8] = {src[2], src[6], src[10], src[14], 0, 0, 0, 0}; + uint8_t a_array[8] = {src[3], src[7], src[11], src[15], 0, 0, 0, 0}; + uint8_t mask_array[8] = {mask[0], mask[1], mask[2], mask[3], 0, 0, 0, 0}; + const uint16x4_t b_pixels = vget_low_u16(vmovl_u8(vld1_u8(b_array))); + const uint16x4_t g_pixels = vget_low_u16(vmovl_u8(vld1_u8(g_array))); + const uint16x4_t r_pixels = vget_low_u16(vmovl_u8(vld1_u8(r_array))); + const uint16x4_t a_pixels = vget_low_u16(vmovl_u8(vld1_u8(a_array))); + const uint16x4_t mask_vec = vget_low_u16(vmovl_u8(vld1_u8(mask_array))); + const uint16x4_t mask_a_mul = vshr_n_u16(vmul_u16(a_pixels, mask_vec), 8); + return lv_color_32_16_mix_4_internal(r_pixels, g_pixels, b_pixels, mask_a_mul, dst_pixels); +} +static inline uint16x8_t lv_color_32_16_mix_8_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask) +{ + const uint16x8_t dst_pixels = vld1q_u16(dst); + + const uint8x8x4_t rgba = vld4_u8(src); + const uint16x8_t b_pixels = vmovl_u8(rgba.val[0]); + const uint16x8_t g_pixels = vmovl_u8(rgba.val[1]); + const uint16x8_t r_pixels = vmovl_u8(rgba.val[2]); + const uint16x8_t a_pixels = vmovl_u8(rgba.val[3]); + const uint16x8_t mask_vec = vmovl_u8(vld1_u8(mask)); + const uint16x8_t opa_vec = vmovq_n_u16(opa); + + /* Use uint32 for intermediate multiplication results to avoid 16bit overflows */ + const uint32x4_t a_pixels_low = vmovl_u16(vget_low_u16(a_pixels)); + const uint32x4_t a_pixels_high = vmovl_u16(vget_high_u16(a_pixels)); + const uint32x4_t opa_vec_low = vmovl_u16(vget_low_u16(opa_vec)); + const uint32x4_t opa_vec_high = vmovl_u16(vget_high_u16(opa_vec)); + const uint32x4_t mask_vec_low = vmovl_u16(vget_low_u16(mask_vec)); + const uint32x4_t mask_vec_high = vmovl_u16(vget_high_u16(mask_vec)); + + const uint32x4_t mul_low = vshrq_n_u32(vmulq_u32(vmulq_u32(a_pixels_low, opa_vec_low), mask_vec_low), 16); + const uint32x4_t mul_high = vshrq_n_u32(vmulq_u32(vmulq_u32(a_pixels_high, opa_vec_high), mask_vec_high), 16); + const uint16x8_t mask_opa_a_mul = vcombine_u16(vmovn_u32(mul_low), vmovn_u32(mul_high)); + + return lv_color_32_16_mix_8_internal(r_pixels, g_pixels, b_pixels, mask_opa_a_mul, dst_pixels); +} +static inline uint16x4_t lv_color_32_16_mix_4_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask) +{ + + const uint16x4_t dst_pixels = vld1_u16(dst); + uint8_t b_array[8] = {src[0], src[4], src[8], src[12], 0, 0, 0, 0}; + uint8_t g_array[8] = {src[1], src[5], src[9], src[13], 0, 0, 0, 0}; + uint8_t r_array[8] = {src[2], src[6], src[10], src[14], 0, 0, 0, 0}; + uint8_t a_array[8] = {src[3], src[7], src[11], src[15], 0, 0, 0, 0}; + uint8_t mask_array[8] = {mask[0], mask[1], mask[2], mask[3], 0, 0, 0, 0}; + const uint16x4_t b_pixels = vget_low_u16(vmovl_u8(vld1_u8(b_array))); + const uint16x4_t g_pixels = vget_low_u16(vmovl_u8(vld1_u8(g_array))); + const uint16x4_t r_pixels = vget_low_u16(vmovl_u8(vld1_u8(r_array))); + const uint16x4_t a_pixels = vget_low_u16(vmovl_u8(vld1_u8(a_array))); + const uint16x4_t mask_vec = vget_low_u16(vmovl_u8(vld1_u8(mask_array))); + const uint16x4_t opa_vec = vmov_n_u16(opa); + + const uint32x4_t a_pixels_low = vmovl_u16(a_pixels); + const uint32x4_t opa_vec_low = vmovl_u16(opa_vec); + const uint32x4_t mask_vec_low = vmovl_u16(mask_vec); + + const uint32x4_t mul_result = vshrq_n_u32(vmulq_u32(vmulq_u32(a_pixels_low, opa_vec_low), mask_vec_low), 16); + const uint16x4_t mask_opa_a_mul = vmovn_u32(mul_result); + + return lv_color_32_16_mix_4_internal(r_pixels, g_pixels, b_pixels, mask_opa_a_mul, dst_pixels); +} + +static inline uint16x8_t lv_color_32_16_mix_8_internal(uint16x8_t r_pixels, uint16x8_t g_pixels, uint16x8_t b_pixels, + uint16x8_t a_pixels, uint16x8_t dst_pixels) +{ + const uint16x8_t mix_zero_mask = vceqq_u16(a_pixels, vdupq_n_u16(0)); + const uint16x8_t mix_full_mask = vceqq_u16(a_pixels, vdupq_n_u16(255)); + + /* Prepare result in case alpha == 255 */ + const uint16x8_t src_r565 = vandq_u16(vshlq_n_u16(r_pixels, 8), vdupq_n_u16(0xF800)); + const uint16x8_t src_g565 = vandq_u16(vshlq_n_u16(g_pixels, 3), vdupq_n_u16(0x07E0)); + const uint16x8_t src_b565 = vshrq_n_u16(b_pixels, 3); + const uint16x8_t src_rgb565 = vorrq_u16(vorrq_u16(src_r565, src_g565), src_b565); + + /* Do the actual blending */ + const uint16x8_t mix_inv_16 = vsubq_u16(vdupq_n_u16(255), a_pixels); + + /* Red: ((src_r >> 3) * mix + ((dst >> 11) & 0x1F) * mix_inv) << 3) & 0xF800 */ + const uint16x8_t src_r = vshrq_n_u16(r_pixels, 3); + const uint16x8_t dst_r = vandq_u16(vshrq_n_u16(dst_pixels, 11), vdupq_n_u16(0x1F)); + uint16x8_t blended_r = vmlaq_u16(vmulq_u16(src_r, a_pixels), dst_r, mix_inv_16); + blended_r = vandq_u16(vshlq_n_u16(blended_r, 3), vdupq_n_u16(0xF800)); + + /* Green: ((src_g >> 2) * mix + ((dst >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0 */ + const uint16x8_t src_g = vshrq_n_u16(g_pixels, 2); + const uint16x8_t dst_g = vandq_u16(vshrq_n_u16(dst_pixels, 5), vdupq_n_u16(0x3F)); + uint16x8_t blended_g = vmlaq_u16(vmulq_u16(src_g, a_pixels), dst_g, mix_inv_16); + blended_g = vandq_u16(vshrq_n_u16(blended_g, 3), vdupq_n_u16(0x07E0)); + + /* Blue: ((src_b >> 3) * mix + (dst & 0x1F) * mix_inv) >> 8 */ + const uint16x8_t src_b = vshrq_n_u16(b_pixels, 3); + const uint16x8_t dst_b = vandq_u16(dst_pixels, vdupq_n_u16(0x1F)); + uint16x8_t blended_b = vmlaq_u16(vmulq_u16(src_b, a_pixels), dst_b, mix_inv_16); + blended_b = vshrq_n_u16(blended_b, 8); + + const uint16x8_t blended_result = vorrq_u16(vorrq_u16(blended_r, blended_g), blended_b); + const uint16x8_t result = vbslq_u16(mix_zero_mask, dst_pixels, blended_result); + return vbslq_u16(mix_full_mask, src_rgb565, result); +} +static inline uint16x4_t lv_color_32_16_mix_4_internal(uint16x4_t r_pixels, uint16x4_t g_pixels, uint16x4_t b_pixels, + uint16x4_t a_pixels, uint16x4_t dst_pixels) +{ + const uint16x4_t mix_zero_mask = vceq_u16(a_pixels, vdup_n_u16(0)); + const uint16x4_t mix_full_mask = vceq_u16(a_pixels, vdup_n_u16(255)); + + /* Prepare result in case alpha == 255 */ + const uint16x4_t src_r565 = vand_u16(vshl_n_u16(r_pixels, 8), vdup_n_u16(0xF800)); + const uint16x4_t src_g565 = vand_u16(vshl_n_u16(g_pixels, 3), vdup_n_u16(0x07E0)); + const uint16x4_t src_b565 = vshr_n_u16(b_pixels, 3); + const uint16x4_t src_rgb565 = vorr_u16(vorr_u16(src_r565, src_g565), src_b565); + + const uint16x4_t mix_inv_16 = vsub_u16(vdup_n_u16(255), a_pixels); + + /* Red: ((src_r >> 3) * mix + ((dst >> 11) & 0x1F) * mix_inv) << 3) & 0xF800 */ + const uint16x4_t src_r = vshr_n_u16(r_pixels, 3); + const uint16x4_t dst_r = vand_u16(vshr_n_u16(dst_pixels, 11), vdup_n_u16(0x1F)); + uint16x4_t blended_r = vmla_u16(vmul_u16(src_r, a_pixels), dst_r, mix_inv_16); + blended_r = vand_u16(vshl_n_u16(blended_r, 3), vdup_n_u16(0xF800)); + + /* Green: ((src_g >> 2) * mix + ((dst >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0 */ + const uint16x4_t src_g = vshr_n_u16(g_pixels, 2); + const uint16x4_t dst_g = vand_u16(vshr_n_u16(dst_pixels, 5), vdup_n_u16(0x3F)); + uint16x4_t blended_g = vmla_u16(vmul_u16(src_g, a_pixels), dst_g, mix_inv_16); + blended_g = vand_u16(vshr_n_u16(blended_g, 3), vdup_n_u16(0x07E0)); + + /* Blue: ((src_b >> 3) * mix + (dst & 0x1F) * mix_inv) >> 8 */ + const uint16x4_t src_b = vshr_n_u16(b_pixels, 3); + const uint16x4_t dst_b = vand_u16(dst_pixels, vdup_n_u16(0x1F)); + uint16x4_t blended_b = vmla_u16(vmul_u16(src_b, a_pixels), dst_b, mix_inv_16); + blended_b = vshr_n_u16(blended_b, 8); + + const uint16x4_t blended_result = vorr_u16(vorr_u16(blended_r, blended_g), blended_b); + + const uint16x4_t result = vbsl_u16(mix_zero_mask, dst_pixels, blended_result); + return vbsl_u16(mix_full_mask, src_rgb565, result); +} + +static inline uint32_t lv_color_24_16_mix_2_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask, + uint8_t src_px_size) +{ + + return (lv_color_24_16_mix_1_internal(src + src_px_size, dst + 1, mask[1]) << 16) | + lv_color_24_16_mix_1_internal(src, dst, *mask); +} + +static inline uint32_t lv_color_24_16_mix_2_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t mix, + uint8_t src_px_size) +{ + return (lv_color_24_16_mix_1_internal(src + src_px_size, dst + 1, mix) << 16) | + lv_color_24_16_mix_1_internal(src, dst, mix); +} +static inline uint32_t lv_color_32_16_mix_2_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa) +{ + return (lv_color_32_16_mix_1_with_opa(src + 4, dst + 1, opa) << 16) | lv_color_32_16_mix_1_with_opa(src, dst, opa); +} +static inline uint32_t lv_color_32_16_mix_2_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask) +{ + return (lv_color_32_16_mix_1_with_opa_mask(src + 4, dst + 1, opa, &mask[1]) << 16) | + lv_color_32_16_mix_1_with_opa_mask(src, dst, opa, &mask[0]); +} + +static inline uint32_t lv_color_32_16_mix_2_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask) +{ + return (lv_color_32_16_mix_1_with_mask(src + 4, dst + 1, mask + 1) << 16) | + lv_color_32_16_mix_1_with_mask(src, dst, mask); +} +static inline uint32_t lv_color_32_16_mix_2(const uint8_t * src, const uint16_t * dst) +{ + return (lv_color_32_16_mix_1(src + 4, dst + 1) << 16) | lv_color_32_16_mix_1(src, dst); +} + +static inline uint32_t lv_color_32_16_mix_1(const uint8_t * src, const uint16_t * dst) +{ + return lv_color_24_16_mix_1_internal(src, dst, src[3]); +} + +static inline uint16_t lv_color_32_16_mix_1_with_opa_mask(const uint8_t * src, const uint16_t * dst, uint8_t opa, + const uint8_t * mask) +{ + return lv_color_24_16_mix_1_internal(src, dst, LV_OPA_MIX3(src[3], opa, *mask)); +} + +static inline uint16_t lv_color_32_16_mix_1_with_opa(const uint8_t * src, const uint16_t * dst, uint8_t opa) +{ + return lv_color_24_16_mix_1_internal(src, dst, LV_OPA_MIX2(src[3], opa)); +} +static inline uint16_t lv_color_32_16_mix_1_with_mask(const uint8_t * src, const uint16_t * dst, const uint8_t * mask) +{ + + return lv_color_24_16_mix_1_internal(src, dst, LV_OPA_MIX2(src[3], *mask)); +} + +static inline uint16_t lv_color_24_16_mix_1_internal(const uint8_t * src, const uint16_t * dst, uint8_t mix) +{ + if(mix == 0) { + return *dst; + } + else if(mix == 255) { + return ((src[2] & 0xF8) << 8) + ((src[1] & 0xFC) << 3) + ((src[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + return ((((src[2] >> 3) * mix + ((*dst >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + ((((src[1] >> 2) * mix + ((*dst >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + (((src[0] >> 3) * mix + (*dst & 0x1F) * mix_inv) >> 8); + } +} + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED +static inline uint16x8_t lv_color_24_16_mix_premult_8(const uint8_t * src, const uint16_t * dst) +{ + const uint16x8_t dst_pixels = vld1q_u16(dst); + + const uint8x8x4_t rgba = vld4_u8(src); + const uint16x8_t b_pixels = vmovl_u8(rgba.val[0]); + const uint16x8_t g_pixels = vmovl_u8(rgba.val[1]); + const uint16x8_t r_pixels = vmovl_u8(rgba.val[2]); + const uint16x8_t a_pixels = vmovl_u8(rgba.val[3]); + + const uint16x8_t mix_zero_mask = vceqq_u16(a_pixels, vdupq_n_u16(0)); + const uint16x8_t mix_full_mask = vceqq_u16(a_pixels, vdupq_n_u16(255)); + + /* Prepare result in case alpha == 255 */ + const uint16x8_t src_r565 = vandq_u16(vshlq_n_u16(r_pixels, 8), vdupq_n_u16(0xF800)); + const uint16x8_t src_g565 = vandq_u16(vshlq_n_u16(g_pixels, 3), vdupq_n_u16(0x07E0)); + const uint16x8_t src_b565 = vshrq_n_u16(b_pixels, 3); + const uint16x8_t src_rgb565 = vorrq_u16(vorrq_u16(src_r565, src_g565), src_b565); + + /* Do the actual blending */ + const uint16x8_t mix_inv_16 = vsubq_u16(vdupq_n_u16(255), a_pixels); + + const uint16x8_t src_r = vshrq_n_u16(r_pixels, 3); + const uint16x8_t dst_r = vandq_u16(vshrq_n_u16(dst_pixels, 11), vdupq_n_u16(0x1F)); + uint16x8_t blended_r = vaddq_u16(src_r, vshrq_n_u16(vmulq_u16(dst_r, mix_inv_16), 8)); + blended_r = vshlq_n_u16(blended_r, 11); + + /* Green: ((src_g >> 2) * mix + ((dst >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0 */ + const uint16x8_t src_g = vshrq_n_u16(g_pixels, 2); + const uint16x8_t dst_g = vandq_u16(vshrq_n_u16(dst_pixels, 5), vdupq_n_u16(0x3F)); + uint16x8_t blended_g = vaddq_u16(src_g, vshrq_n_u16(vmulq_u16(dst_g, mix_inv_16), 8)); + blended_g = vshlq_n_u16(blended_g, 5); + + /* Blue: ((src_b >> 3) * mix + (dst & 0x1F) * mix_inv) >> 8 */ + const uint16x8_t src_b = vshrq_n_u16(b_pixels, 3); + const uint16x8_t dst_b = vandq_u16(dst_pixels, vdupq_n_u16(0x1F)); + uint16x8_t blended_b = vaddq_u16(src_b, vshrq_n_u16(vmulq_u16(dst_b, mix_inv_16), 8)); + + const uint16x8_t blended_result = vaddq_u16(vaddq_u16(blended_r, blended_g), blended_b); + const uint16x8_t result = vbslq_u16(mix_zero_mask, dst_pixels, blended_result); + return vbslq_u16(mix_full_mask, src_rgb565, result); +} +static inline uint16x4_t lv_color_24_16_mix_premult_4(const uint8_t * src, const uint16_t * dst) +{ + const uint16x4_t dst_pixels = vld1_u16(dst); + uint8_t b_array[8] = {src[0], src[4], src[8], src[12], 0, 0, 0, 0}; + uint8_t g_array[8] = {src[1], src[5], src[9], src[13], 0, 0, 0, 0}; + uint8_t r_array[8] = {src[2], src[6], src[10], src[14], 0, 0, 0, 0}; + uint8_t a_array[8] = {src[3], src[7], src[11], src[15], 0, 0, 0, 0}; + const uint16x4_t b_pixels = vget_low_u16(vmovl_u8(vld1_u8(b_array))); + const uint16x4_t g_pixels = vget_low_u16(vmovl_u8(vld1_u8(g_array))); + const uint16x4_t r_pixels = vget_low_u16(vmovl_u8(vld1_u8(r_array))); + const uint16x4_t a_pixels = vget_low_u16(vmovl_u8(vld1_u8(a_array))); + + const uint16x4_t mix_zero_mask = vceq_u16(a_pixels, vdup_n_u16(0)); + const uint16x4_t mix_full_mask = vceq_u16(a_pixels, vdup_n_u16(255)); + + /* Prepare result in case alpha == 255 */ + const uint16x4_t src_r565 = vand_u16(vshl_n_u16(r_pixels, 8), vdup_n_u16(0xF800)); + const uint16x4_t src_g565 = vand_u16(vshl_n_u16(g_pixels, 3), vdup_n_u16(0x07E0)); + const uint16x4_t src_b565 = vshr_n_u16(b_pixels, 3); + const uint16x4_t src_rgb565 = vorr_u16(vorr_u16(src_r565, src_g565), src_b565); + + const uint16x4_t mix_inv_16 = vsub_u16(vdup_n_u16(255), a_pixels); + + const uint16x4_t src_r = vshr_n_u16(r_pixels, 3); + const uint16x4_t dst_r = vand_u16(vshr_n_u16(dst_pixels, 11), vdup_n_u16(0x1F)); + uint16x4_t blended_r = vadd_u16(src_r, vshr_n_u16(vmul_u16(dst_r, mix_inv_16), 8)); + blended_r = vshl_n_u16(blended_r, 11); + + /* Green: ((src_g >> 2) * mix + ((dst >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0 */ + const uint16x4_t src_g = vshr_n_u16(g_pixels, 2); + const uint16x4_t dst_g = vand_u16(vshr_n_u16(dst_pixels, 5), vdup_n_u16(0x3F)); + uint16x4_t blended_g = vadd_u16(src_g, vshr_n_u16(vmul_u16(dst_g, mix_inv_16), 8)); + blended_g = vshl_n_u16(blended_g, 5); + + /* Blue: ((src_b >> 3) * mix + (dst & 0x1F) * mix_inv) >> 8 */ + const uint16x4_t src_b = vshr_n_u16(b_pixels, 3); + const uint16x4_t dst_b = vand_u16(dst_pixels, vdup_n_u16(0x1F)); + uint16x4_t blended_b = vadd_u16(src_b, vshr_n_u16(vmul_u16(dst_b, mix_inv_16), 8)); + + const uint16x4_t blended_result = vorr_u16(vorr_u16(blended_r, blended_g), blended_b); + + const uint16x4_t result = vbsl_u16(mix_zero_mask, dst_pixels, blended_result); + return vbsl_u16(mix_full_mask, src_rgb565, result); +} + +static inline uint32_t lv_color_24_16_mix_premult_2(const uint8_t * src, const uint16_t * dst) +{ + return ((uint32_t)lv_color_24_16_mix_premult_1(src + 4, dst + 1) << 16) | lv_color_24_16_mix_premult_1(src, dst); +} +static inline uint16_t lv_color_24_16_mix_premult_1(const uint8_t * src, const uint16_t * dst) +{ + const uint8_t mix = src[3]; + if(mix == 0) { + return *dst; + } + else if(mix == 255) { + return ((src[2] & 0xF8) << 8) + ((src[1] & 0xFC) << 3) + ((src[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + return (((src[2] >> 3) + ((((*dst >> 11) & 0x1F) * mix_inv) >> 8)) << 11) + + (((src[1] >> 2) + ((((*dst >> 5) & 0x3F) * mix_inv) >> 8)) << 5) + + (((src[0] >> 3) + ((((*dst >> 0) & 0x1F) * mix_inv) >> 8))); + } +} + +#endif + +static inline uint16x8_t rgb888_to_rgb565_8(const uint8_t * src, uint8_t src_px_size) +{ + uint16x8_t b_pixels; + uint16x8_t g_pixels; + uint16x8_t r_pixels; + LV_ASSERT_MSG(src_px_size == 3 || src_px_size == 4, "Invalid pixel size for rgb888. Expected either 3 or 4 bytes"); + + if(src_px_size == 3) { + const uint8x8x3_t rgba = vld3_u8(src); + b_pixels = vmovl_u8(rgba.val[0]); + g_pixels = vmovl_u8(rgba.val[1]); + r_pixels = vmovl_u8(rgba.val[2]); + } + else if(src_px_size == 4) { + const uint8x8x4_t rgba = vld4_u8(src); + b_pixels = vmovl_u8(rgba.val[0]); + g_pixels = vmovl_u8(rgba.val[1]); + r_pixels = vmovl_u8(rgba.val[2]); + } + + const uint16x8_t r = vshlq_n_u16(vandq_u16(r_pixels, vdupq_n_u16(0xF8)), 8); + const uint16x8_t g = vshlq_n_u16(vandq_u16(g_pixels, vdupq_n_u16(0xFC)), 3); + const uint16x8_t b = vshrq_n_u16(vandq_u16(b_pixels, vdupq_n_u16(0xF8)), 3); + return vorrq_u16(vorrq_u16(r, g), b); +} + +static inline uint16x4_t rgb888_to_rgb565_4(const uint8_t * src, uint8_t src_px_size) +{ + uint16x4_t b_pixels; + uint16x4_t g_pixels; + uint16x4_t r_pixels; + LV_ASSERT_MSG(src_px_size == 3 || src_px_size == 4, "Invalid pixel size for rgb888. Expected either 3 or 4 bytes"); + + if(src_px_size == 3) { + const uint8x8x3_t rgba = vld3_u8(src); + b_pixels = vget_low_u16(vmovl_u8(rgba.val[0])); + g_pixels = vget_low_u16(vmovl_u8(rgba.val[1])); + r_pixels = vget_low_u16(vmovl_u8(rgba.val[2])); + } + else if(src_px_size == 4) { + const uint8x8x4_t rgba = vld4_u8(src); + b_pixels = vget_low_u16(vmovl_u8(rgba.val[0])); + g_pixels = vget_low_u16(vmovl_u8(rgba.val[1])); + r_pixels = vget_low_u16(vmovl_u8(rgba.val[2])); + } + + const uint16x4_t r = vshl_n_u16(vand_u16(r_pixels, vdup_n_u16(0xF8)), 8); + const uint16x4_t g = vshl_n_u16(vand_u16(g_pixels, vdup_n_u16(0xFC)), 3); + const uint16x4_t b = vshr_n_u16(vand_u16(b_pixels, vdup_n_u16(0xF8)), 3); + return vorr_u16(vorr_u16(r, g), b); +} + +static inline uint32_t rgb888_to_rgb565_2(const uint8_t * src, uint8_t src_px_size) +{ + return ((uint32_t)rgb888_to_rgb565_1(src + src_px_size) << 16) | rgb888_to_rgb565_1(src); +} +static inline uint16_t rgb888_to_rgb565_1(const uint8_t * src) +{ + return ((src[2] & 0xF8) << 8) + ((src[1] & 0xFC) << 3) + ((src[0] & 0xF8) >> 3); +} + +static inline uint16x8_t lv_color_16_16_mix_8_with_opa(const uint16_t * c1, const uint16_t * c2, uint8_t opa) +{ + + const uint16x8_t c1_vec = vld1q_u16(c1); + const uint16x8_t c2_vec = vld1q_u16(c2); + const uint16x8_t mix_vec = vmovq_n_u16(opa); + return lv_color_16_16_mix_8_internal(c1_vec, c2_vec, mix_vec); +} +static inline uint16x8_t lv_color_16_16_mix_8_with_mask(const uint16_t * c1, const uint16_t * c2, const uint8_t * mask) +{ + const uint16x8_t c1_vec = vld1q_u16(c1); + const uint16x8_t c2_vec = vld1q_u16(c2); + const uint16x8_t mix_vec = vmovl_u8(vld1_u8(mask)); + return lv_color_16_16_mix_8_internal(c1_vec, c2_vec, mix_vec); +} +static inline uint16x8_t lv_color_16_16_mix_8_with_opa_mask(const uint16_t * c1, const uint16_t * c2, uint8_t opa, + const uint8_t * mask) +{ + + const uint16x8_t c1_vec = vld1q_u16(c1); + const uint16x8_t c2_vec = vld1q_u16(c2); + const uint16x8_t opa_vec = vmovq_n_u16(opa); + const uint16x8_t mask_vec = vmovl_u8(vld1_u8(mask)); + const uint16x8_t mix_vec = vshrq_n_u16(vmulq_u16(opa_vec, mask_vec), 8); + return lv_color_16_16_mix_8_internal(c1_vec, c2_vec, mix_vec); +} + +static inline uint16x8_t lv_color_16_16_mix_8_internal(uint16x8_t c1_vec, uint16x8_t c2_vec, uint16x8_t mix) +{ + const uint16x8_t mix_zero_mask = vceqq_u16(mix, vdupq_n_u16(0)); + const uint16x8_t mix_full_mask = vceqq_u16(mix, vdupq_n_u16(255)); + const uint16x8_t equal_mask = vceqq_u16(c1_vec, c2_vec); + + mix = vshrq_n_u16(vaddq_u16(mix, vdupq_n_u16(4)), 3); + /* Split into low and high parts for 32-bit operations */ + uint32x4_t c1_low = vmovl_u16(vget_low_u16(c1_vec)); + uint32x4_t c1_high = vmovl_u16(vget_high_u16(c1_vec)); + uint32x4_t c2_low = vmovl_u16(vget_low_u16(c2_vec)); + uint32x4_t c2_high = vmovl_u16(vget_high_u16(c2_vec)); + uint32x4_t fg_low = vorrq_u32(c1_low, vshlq_n_u32(c1_low, 16)); + uint32x4_t fg_high = vorrq_u32(c1_high, vshlq_n_u32(c1_high, 16)); + uint32x4_t bg_low = vorrq_u32(c2_low, vshlq_n_u32(c2_low, 16)); + uint32x4_t bg_high = vorrq_u32(c2_high, vshlq_n_u32(c2_high, 16)); + + /* Apply mask 0x7E0F81F to extract RGB components */ + const uint32x4_t mask = vdupq_n_u32(0x7E0F81F); + fg_low = vandq_u32(fg_low, mask); + fg_high = vandq_u32(fg_high, mask); + bg_low = vandq_u32(bg_low, mask); + bg_high = vandq_u32(bg_high, mask); + + const uint32x4_t mix_low = vmovl_u16(vget_low_u16(mix)); + const uint32x4_t mix_high = vmovl_u16(vget_high_u16(mix)); + + /* Perform the blend: ((fg - bg) * mix) >> 5 + bg */ + const uint32x4_t diff_low = vsubq_u32(fg_low, bg_low); + const uint32x4_t diff_high = vsubq_u32(fg_high, bg_high); + const uint32x4_t scaled_low = vmulq_u32(diff_low, mix_low); + const uint32x4_t scaled_high = vmulq_u32(diff_high, mix_high); + const uint32x4_t shifted_low = vshrq_n_u32(scaled_low, 5); + const uint32x4_t shifted_high = vshrq_n_u32(scaled_high, 5); + uint32x4_t result_low = vaddq_u32(shifted_low, bg_low); + uint32x4_t result_high = vaddq_u32(shifted_high, bg_high); + + /* Apply final mask */ + result_low = vandq_u32(result_low, mask); + result_high = vandq_u32(result_high, mask); + + /* Convert back to 16-bit: (result >> 16) | result */ + const uint32x4_t final_low = vorrq_u32(result_low, vshrq_n_u32(result_low, 16)); + const uint32x4_t final_high = vorrq_u32(result_high, vshrq_n_u32(result_high, 16)); + + const uint16x4_t packed_low = vmovn_u32(final_low); + const uint16x4_t packed_high = vmovn_u32(final_high); + uint16x8_t result = vcombine_u16(packed_low, packed_high); + + result = vbslq_u16(mix_zero_mask, c2_vec, result); + result = vbslq_u16(mix_full_mask, c1_vec, result); + result = vbslq_u16(equal_mask, c1_vec, result); + + return result; +} + +static inline uint16x4_t lv_color_16_16_mix_4_with_opa(const uint16_t * c1, const uint16_t * c2, uint8_t opa) +{ + const uint16x4_t c1_vec = vld1_u16(c1); + const uint16x4_t c2_vec = vld1_u16(c2); + const uint16x4_t mix_vec = vmov_n_u16(opa); + return lv_color_16_16_mix_4_internal(c1_vec, c2_vec, mix_vec); +} +static inline uint16x4_t lv_color_16_16_mix_4_with_mask(const uint16_t * c1, const uint16_t * c2, const uint8_t * mask) +{ + const uint16x4_t c1_vec = vld1_u16(c1); + const uint16x4_t c2_vec = vld1_u16(c2); + const uint16x4_t mix_vec = vget_low_u16(vmovl_u8(vld1_u8(mask))); + return lv_color_16_16_mix_4_internal(c1_vec, c2_vec, mix_vec); +} +static inline uint16x4_t lv_color_16_16_mix_4_with_opa_mask(const uint16_t * c1, const uint16_t * c2, uint8_t opa, + const uint8_t * mask) +{ + + const uint16x4_t c1_vec = vld1_u16(c1); + const uint16x4_t c2_vec = vld1_u16(c2); + const uint16x4_t opa_vec = vmov_n_u16(opa); + const uint16x4_t mask_vec = vget_low_u16(vmovl_u8(vld1_u8(mask))); + const uint16x4_t mix_vec = vshr_n_u16(vmul_u16(opa_vec, mask_vec), 8); + return lv_color_16_16_mix_4_internal(c1_vec, c2_vec, mix_vec); +} + +static inline uint16x4_t lv_color_16_16_mix_4_internal(uint16x4_t c1_vec, uint16x4_t c2_vec, uint16x4_t mix) +{ + const uint16x4_t mix_zero_mask = vceq_u16(mix, vdup_n_u16(0)); + const uint16x4_t mix_full_mask = vceq_u16(mix, vdup_n_u16(255)); + const uint16x4_t equal_mask = vceq_u16(c1_vec, c2_vec); + + mix = vshr_n_u16(vadd_u16(mix, vdup_n_u16(4)), 3); + /* Split into low and high parts for 32-bit operations */ + uint32x4_t c1 = vmovl_u16(c1_vec); + uint32x4_t c2 = vmovl_u16(c2_vec); + uint32x4_t fg = vorrq_u32(c1, vshlq_n_u32(c1, 16)); + uint32x4_t bg = vorrq_u32(c2, vshlq_n_u32(c2, 16)); + + /* Apply mask 0x7E0F81F to extract RGB components */ + const uint32x4_t mask = vdupq_n_u32(0x7E0F81F); + fg = vandq_u32(fg, mask); + bg = vandq_u32(bg, mask); + + const uint32x4_t mix32 = vmovl_u16(mix); + + /* Perform the blend: ((fg - bg) * mix) >> 5 + bg */ + const uint32x4_t diff = vsubq_u32(fg, bg); + const uint32x4_t scaled = vmulq_u32(diff, mix32); + const uint32x4_t shifted = vshrq_n_u32(scaled, 5); + uint32x4_t result32 = vaddq_u32(shifted, bg); + result32 = vandq_u32(result32, mask); + + /* Convert back to 16-bit: (result >> 16) | result */ + const uint32x4_t final = vorrq_u32(result32, vshrq_n_u32(result32, 16)); + + uint16x4_t result = vmovn_u32(final); + result = vbsl_u16(mix_zero_mask, c2_vec, result); + result = vbsl_u16(mix_full_mask, c1_vec, result); + result = vbsl_u16(equal_mask, c1_vec, result); + + return result; +} + +static inline uint32_t lv_color_16_16_mix_2_with_opa(const uint16_t * c1, const uint16_t * c2, uint8_t opa) +{ + return lv_color_16_16_mix(c1[1], c2[1], opa) << 16 | lv_color_16_16_mix(*c1, *c2, opa); +} +static inline uint32_t lv_color_16_16_mix_2_with_mask(const uint16_t * c1, const uint16_t * c2, const uint8_t * mask) +{ + return lv_color_16_16_mix(c1[1], c2[1], mask[1]) << 16 | lv_color_16_16_mix(*c1, *c2, *mask); +} +static inline uint32_t lv_color_16_16_mix_2_with_opa_mask(const uint16_t * c1, const uint16_t * c2, uint8_t opa, + const uint8_t * mask) +{ + + return lv_color_16_16_mix(c1[1], c2[1], LV_OPA_MIX2(opa, mask[1])) << 16 | + lv_color_16_16_mix(*c1, *c2, LV_OPA_MIX2(*mask, opa)); +} + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} +#endif /* LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON*/ diff --git a/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb565.h b/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb565.h new file mode 100644 index 0000000..27fcf4b --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb565.h @@ -0,0 +1,190 @@ +/** + * @file lv_draw_sw_blend_neon_to_rgb565.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_NEON_TO_RGB565_H +#define LV_DRAW_SW_BLEND_NEON_TO_RGB565_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../../lv_conf_internal.h" +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + +#include "../../../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) lv_draw_sw_blend_neon_color_to_rgb565(dsc) + +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) lv_draw_sw_blend_neon_color_to_rgb565_with_opa(dsc) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) lv_draw_sw_blend_neon_color_to_rgb565_with_mask(dsc) + +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) lv_draw_sw_blend_neon_color_to_rgb565_with_opa_mask(dsc) +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565(dsc) lv_draw_sw_blend_neon_l8_to_rgb565(dsc) +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565(dsc) lv_draw_sw_blend_neon_al88_to_rgb565(dsc) +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) lv_draw_sw_blend_neon_al88_to_rgb565_with_opa(dsc) +#endif + +#if 0 /* Disabled as it's not tested */ +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) lv_draw_sw_blend_neon_al88_to_rgb565_with_mask(dsc) + +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) lv_draw_sw_blend_neon_al88_to_rgb565_with_opa_mask(dsc) +#endif +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) lv_draw_sw_blend_neon_rgb565_to_rgb565(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) lv_draw_sw_blend_neon_rgb565_to_rgb565_with_opa(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) lv_draw_sw_blend_neon_rgb565_to_rgb565_with_mask(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) lv_draw_sw_blend_neon_rgb565_to_rgb565_with_opa_mask(dsc) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) lv_draw_sw_blend_neon_rgb888_to_rgb565(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) lv_draw_sw_blend_neon_rgb888_to_rgb565_with_opa(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) lv_draw_sw_blend_neon_rgb888_to_rgb565_with_mask(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) lv_draw_sw_blend_neon_rgb888_to_rgb565_with_opa_mask(dsc, src_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) lv_draw_sw_blend_neon_argb888_to_rgb565(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) lv_draw_sw_blend_neon_argb888_to_rgb565_with_opa(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) lv_draw_sw_blend_neon_argb888_to_rgb565_with_mask(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) lv_draw_sw_blend_neon_argb888_to_rgb565_with_opa_mask(dsc) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565 +#define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565(dsc) lv_draw_sw_blend_neon_argb888_premultiplied_to_rgb565(dsc) +#endif + +/* + * Bleding operations with premultiplied argb8888 require division. + * As division is not supported for integer values in neon we don't define these functions + */ +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_OPA +#define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_MASK +#define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_result_t lv_draw_sw_blend_neon_color_to_rgb565(lv_draw_sw_blend_fill_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_color_to_rgb565_with_opa(lv_draw_sw_blend_fill_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_color_to_rgb565_with_mask(lv_draw_sw_blend_fill_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_color_to_rgb565_with_opa_mask(lv_draw_sw_blend_fill_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_l8_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb565_with_opa(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb565_with_mask(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb565_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc); + +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb565_with_opa(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb565_with_mask(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb565_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc, uint8_t src_px_size); +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb565_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, uint8_t src_px_size); +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb565_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, uint8_t src_px_size); +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb565_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint8_t src_px_size); +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_argb888_premultiplied_to_rgb565(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb565_with_opa(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb565_with_mask(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb565_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_NEON_TO_RGB565_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb888.c b/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb888.c new file mode 100644 index 0000000..9c20c52 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb888.c @@ -0,0 +1,1704 @@ +/** + * @file lv_draw_sw_blend_neon_to_rgb888.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_neon_to_rgb888.h" +#include +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + +#include "../../../../misc/lv_color.h" +#include "../../../../misc/lv_types.h" +#include "../lv_draw_sw_blend_private.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride); + +static inline uint32x4_t rgb565_xrgb_mix_4_internal(uint32x4_t src, uint32x4_t dst, uint32x4_t mix); +static inline uint32x2_t rgb565_xrgb_mix_2_internal(uint32x2_t src, uint32x2_t dst, uint32x2_t mix); + +static inline uint8x16x3_t lv_color_to_rgb888_16(const lv_color_t * color); +static inline uint8x8x3_t lv_color_to_rgb888_8(const lv_color_t * color); + +static inline uint8x16x4_t lv_color_to_xrgb888_16(const lv_color_t * color); +static inline uint8x8x4_t lv_color_to_xrgb888_8(const lv_color_t * color); +static inline uint8x16_t lv_color_to_xrgb888_4(const lv_color_t * color); +static inline uint8x8_t lv_color_to_xrgb888_2(const lv_color_t * color); +static inline uint8x8x3_t lv_rgb565_to_rgb888_8(const uint16_t * color); +static inline uint8x8x4_t lv_rgb565_to_xrgb8888_8(const uint16_t * color); + + +static inline uint8x8x3_t rgb565_rgb888_mix_8_internal(uint16x8_t src, uint8x8x3_t dst, uint8x8_t mix); + +static inline void lv_color_24_24_mix_1(const uint8_t * src, uint8_t * dest, uint8_t mix); + +static inline void rgb565_mix_1(const uint16_t * src, uint8_t * dest, uint8_t mix); + +static inline uint32x4_t argb_rgb_mix_4(const uint32_t * src, const uint32_t * dst); +static inline uint32x2_t argb_rgb_mix_2(const uint32_t * src, const uint32_t * dst); + +static inline uint32x4_t argb_rgb_mix_4_with_opa(const uint32_t * src, const uint32_t * dst, uint32x4_t mix); +static inline uint32x2_t argb_rgb_mix_2_with_opa(const uint32_t * src, const uint32_t * dst, uint32x2_t mix); + +static inline uint32x4_t argb_rgb_mix_4_with_opa_mask(const uint32_t * src, const uint32_t * dst, uint32x4_t opa, + uint32x4_t mask); +static inline uint32x2_t argb_rgb_mix_2_with_opa_mask(const uint32_t * src, const uint32_t * dst, uint32x2_t opa, + uint32x2_t mask); + +static inline uint32x4_t lv_color_24_24_mix_4_internal(uint32x4_t src, uint32x4_t dst, uint32x4_t mix); +static inline uint32x2_t lv_color_24_24_mix_2_internal(uint32x2_t src, uint32x2_t dst, uint32x2_t mix); + +static inline uint32x4_t lv_color_24_24_mix_4_premul_internal(uint32x4_t src, uint32x4_t dst, uint32x4_t mix); +static inline uint32x2_t lv_color_24_24_mix_2_premul_internal(uint32x2_t src, uint32x2_t dst, uint32x2_t mix); +static inline void lv_color_24_24_mix_premult(const uint8_t * src, uint8_t * dest, uint8_t mix); + +static inline uint8x16x3_t rgb_mix_8_internal(uint8x16x3_t src, uint8x16x3_t dst, uint8x16_t mix); +static inline uint8x8x3_t rgb_mix_4_internal(uint8x8x3_t src, uint8x8x3_t dst, uint8x8_t mix); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_draw_sw_blend_neon_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + uint8_t * dest_buf_8 = dsc->dest_buf; + + if(dest_px_size == 3) { + const int32_t byte_w = w * 3; + const uint8x16x3_t vec_16 = lv_color_to_rgb888_16(&dsc->color); + const uint8x8x3_t vec_8 = lv_color_to_rgb888_8(&dsc->color); + for(int32_t y = 0; y < h; y++) { + uint8_t * row_byte_ptr = dest_buf_8; + int32_t x = 0; + for(; x < byte_w - 47; x += 48) { + vst3q_u8(&row_byte_ptr[x], vec_16); + } + for(; x < byte_w - 23; x += 24) { + vst3_u8(&row_byte_ptr[x], vec_8); + } + for(; x < byte_w; x += 3) { + row_byte_ptr[x + 0] = dsc->color.blue; + row_byte_ptr[x + 1] = dsc->color.green; + row_byte_ptr[x + 2] = dsc->color.red; + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + } + } + else if(dest_px_size == 4) { + const int32_t byte_w = w * 4; + const uint8x16x4_t vec_16 = lv_color_to_xrgb888_16(&dsc->color); + const uint8x8x4_t vec_8 = lv_color_to_xrgb888_8(&dsc->color); + const uint8x16_t vec_4 = lv_color_to_xrgb888_4(&dsc->color); + const uint8x8_t vec_2 = lv_color_to_xrgb888_2(&dsc->color); + + for(int32_t y = 0; y < h; y++) { + uint8_t * row_byte_ptr = dest_buf_8; + int32_t x = 0; + for(; x < byte_w - 63; x += 64) { + vst4q_u8(&row_byte_ptr[x], vec_16); + } + for(; x < byte_w - 31; x += 32) { + vst4_u8(&row_byte_ptr[x], vec_8); + } + for(; x < byte_w - 15; x += 16) { + vst1q_u8(&row_byte_ptr[x], vec_4); + } + for(; x < byte_w - 7; x += 8) { + vst1_u8(&row_byte_ptr[x], vec_2); + } + for(; x < byte_w; x += 4) { + row_byte_ptr[x + 0] = dsc->color.blue; + row_byte_ptr[x + 1] = dsc->color.green; + row_byte_ptr[x + 2] = dsc->color.red; + row_byte_ptr[x + 3] = 0xFF; + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + } + } + + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_color_to_rgb888_with_opa(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t opa = dsc->opa; + + if(dest_px_size == 3) { + const uint8x16x3_t color_16 = {{vdupq_n_u8(dsc->color.blue), vdupq_n_u8(dsc->color.green), vdupq_n_u8(dsc->color.red)}}; + const uint8x8x3_t color_8 = {{vdup_n_u8(dsc->color.blue), vdup_n_u8(dsc->color.green), vdup_n_u8(dsc->color.red)}}; + const uint8x16_t opa_16 = vdupq_n_u8(dsc->opa); + const uint8x8_t opa_8 = vdup_n_u8(dsc->opa); + + uint8_t * dest_buf_8 = dsc->dest_buf; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_ptr = dest_buf_8; + int32_t x = 0; + for(; x < w - 15; x += 16) { + uint8x16x3_t dst = vld3q_u8(&row_ptr[x * 3]); + vst3q_u8(&row_ptr[x * 3], rgb_mix_8_internal(color_16, dst, opa_16)); + } + for(; x < w - 7; x += 8) { + uint8x8x3_t dst = vld3_u8(&row_ptr[x * 3]); + vst3_u8(&row_ptr[x * 3], rgb_mix_4_internal(color_8, dst, opa_8)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1((const uint8_t *)&dsc->color, &row_ptr[x * 3], opa); + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + } + + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_32 = dsc->dest_buf; + const uint32_t color = dsc->color.red << 16 | dsc->color.green << 8 | dsc->color.blue; + const uint32x4_t vec_4 = vdupq_n_u32(color); + const uint32x4_t opa_4 = vdupq_n_u32((uint32_t)dsc->opa); + const uint32x2_t vec_2 = vdup_n_u32(color); + const uint32x2_t opa_2 = vdup_n_u32((uint32_t)dsc->opa); + + for(int32_t y = 0; y < h; y++) { + uint32_t * row_ptr = dest_buf_32; + int32_t x = 0; + for(; x < w - 3; x += 4) { + uint32x4_t dst = vld1q_u32(&row_ptr[x]); + vst1q_u32(&row_ptr[x], lv_color_24_24_mix_4_internal(vec_4, dst, opa_4)); + } + for(; x < w - 1; x += 2) { + uint32x2_t dst = vld1_u32(&row_ptr[x]); + vst1_u32(&row_ptr[x], lv_color_24_24_mix_2_internal(vec_2, dst, opa_2)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1((const uint8_t *)&dsc->color, (uint8_t *)&row_ptr[x], opa); + } + dest_buf_32 = drawbuf_next_row(dest_buf_32, dest_stride); + } + } + + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_color_to_rgb888_with_mask(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT_NULL(dsc->mask_buf); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t * mask_buf_8 = dsc->mask_buf; + + if(dest_px_size == 3) { + const uint8x16x3_t color_16 = {{vdupq_n_u8(dsc->color.blue), vdupq_n_u8(dsc->color.green), vdupq_n_u8(dsc->color.red)}}; + const uint8x8x3_t color_8 = {{vdup_n_u8(dsc->color.blue), vdup_n_u8(dsc->color.green), vdup_n_u8(dsc->color.red)}}; + + uint8_t * dest_buf_8 = dsc->dest_buf; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_ptr = dest_buf_8; + const uint8_t * mask_row_ptr = mask_buf_8; + int32_t x = 0; + for(; x < w - 15; x += 16) { + const uint8x16_t mask_16 = vld1q_u8(&mask_row_ptr[x]); + uint8x16x3_t dst = vld3q_u8(&row_ptr[x * 3]); + vst3q_u8(&row_ptr[x * 3], rgb_mix_8_internal(color_16, dst, mask_16)); + } + for(; x < w - 7; x += 8) { + const uint8x8_t mask_8 = vld1_u8(&mask_row_ptr[x]); + uint8x8x3_t dst = vld3_u8(&row_ptr[x * 3]); + vst3_u8(&row_ptr[x * 3], rgb_mix_4_internal(color_8, dst, mask_8)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1((const uint8_t *)&dsc->color, &row_ptr[x * 3], mask_row_ptr[x]); + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_32 = dsc->dest_buf; + const uint32_t color = dsc->color.red << 16 | dsc->color.green << 8 | dsc->color.blue; + const uint32x4_t vec_4 = vdupq_n_u32(color); + const uint32x2_t vec_2 = vdup_n_u32(color); + + for(int32_t y = 0; y < h; y++) { + uint32_t * row_ptr = dest_buf_32; + const uint8_t * mask_row_ptr = mask_buf_8; + int32_t x = 0; + for(; x < w - 3; x += 4) { + const uint32x4_t mix_4 = {mask_row_ptr[x], mask_row_ptr[x + 1], mask_row_ptr[x + 2], mask_row_ptr[x + 3]}; + const uint32x4_t dst = vld1q_u32(&row_ptr[x]); + vst1q_u32(&row_ptr[x], lv_color_24_24_mix_4_internal(vec_4, dst, mix_4)); + } + for(; x < w - 1; x += 2) { + const uint32x2_t mix_2 = {mask_row_ptr[x], mask_row_ptr[x + 1]}; + const uint32x2_t dst = vld1_u32(&row_ptr[x]); + vst1_u32(&row_ptr[x], lv_color_24_24_mix_2_internal(vec_2, dst, mix_2)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1((const uint8_t *)&dsc->color, (uint8_t *)&row_ptr[x], mask_row_ptr[x]); + } + dest_buf_32 = drawbuf_next_row(dest_buf_32, dest_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + } + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_color_to_rgb888_with_opa_mask(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT_NULL(dsc->mask_buf); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t opa = dsc->opa; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t * mask_buf_8 = dsc->mask_buf; + + if(dest_px_size == 3) { + const uint8x16x3_t color_16 = {{vdupq_n_u8(dsc->color.blue), vdupq_n_u8(dsc->color.green), vdupq_n_u8(dsc->color.red)}}; + const uint8x8x3_t color_8 = {{vdup_n_u8(dsc->color.blue), vdup_n_u8(dsc->color.green), vdup_n_u8(dsc->color.red)}}; + const uint8x16_t opa_16 = vdupq_n_u8(dsc->opa); + const uint8x8_t opa_8 = vdup_n_u8(dsc->opa); + + uint8_t * dest_buf_8 = dsc->dest_buf; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_ptr = dest_buf_8; + const uint8_t * mask_row_ptr = mask_buf_8; + int32_t x = 0; + for(; x < w - 15; x += 16) { + const uint8x16_t mask_16 = vld1q_u8(&mask_row_ptr[x]); + const uint8x8_t opa_lo = vget_low_u8(opa_16); + const uint8x8_t opa_hi = vget_high_u8(opa_16); + const uint8x8_t mask_lo = vget_low_u8(mask_16); + const uint8x8_t mask_hi = vget_high_u8(mask_16); + const uint16x8_t result_lo_wide = vmull_u8(opa_lo, mask_lo); + const uint16x8_t result_hi_wide = vmull_u8(opa_hi, mask_hi); + const uint8x8_t result_lo = vshrn_n_u16(result_lo_wide, 8); + const uint8x8_t result_hi = vshrn_n_u16(result_hi_wide, 8); + const uint8x16_t mix = vcombine_u8(result_lo, result_hi); + uint8x16x3_t dst = vld3q_u8(&row_ptr[x * 3]); + vst3q_u8(&row_ptr[x * 3], rgb_mix_8_internal(color_16, dst, mix)); + } + for(; x < w - 7; x += 8) { + const uint8x8_t mask_8 = vld1_u8(&mask_row_ptr[x]); + const uint16x8_t mult = vmull_u8(opa_8, mask_8); + const uint8x8_t mix = vshrn_n_u16(mult, 8); + uint8x8x3_t dst = vld3_u8(&row_ptr[x * 3]); + vst3_u8(&row_ptr[x * 3], rgb_mix_4_internal(color_8, dst, mix)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1((const uint8_t *)&dsc->color, &row_ptr[x * 3], LV_OPA_MIX2(opa, mask_row_ptr[x])); + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + } + else if(dest_px_size == 4) { + const int32_t mask_stride = dsc->mask_stride; + uint32_t * dest_buf_32 = dsc->dest_buf; + const uint8_t * mask_buf_8 = dsc->mask_buf; + const uint32_t color = dsc->color.red << 16 | dsc->color.green << 8 | dsc->color.blue; + const uint32x4_t vec_4 = vdupq_n_u32(color); + const uint32x4_t opa_4 = vdupq_n_u32((uint32_t)dsc->opa); + const uint32x2_t vec_2 = vdup_n_u32(color); + const uint32x2_t opa_2 = vdup_n_u32((uint32_t)dsc->opa); + + for(int32_t y = 0; y < h; y++) { + uint32_t * row_ptr = dest_buf_32; + const uint8_t * mask_row_ptr = mask_buf_8; + int32_t x = 0; + for(; x < w - 3; x += 4) { + const uint32x4_t mask_4 = {mask_row_ptr[x], mask_row_ptr[x + 1], mask_row_ptr[x + 2], mask_row_ptr[x + 3]}; + const uint32x4_t mix_4 = vshrq_n_u32(vmulq_u32(opa_4, mask_4), 8); + const uint32x4_t dst = vld1q_u32(&row_ptr[x]); + vst1q_u32(&row_ptr[x], lv_color_24_24_mix_4_internal(vec_4, dst, mix_4)); + } + for(; x < w - 1; x += 2) { + const uint32x2_t mask_2 = {mask_row_ptr[x], mask_row_ptr[x + 1]}; + const uint32x2_t mix_2 = vshr_n_u32(vmul_u32(opa_2, mask_2), 8); + const uint32x2_t dst = vld1_u32(&row_ptr[x]); + vst1_u32(&row_ptr[x], lv_color_24_24_mix_2_internal(vec_2, dst, mix_2)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1((const uint8_t *)&dsc->color, (uint8_t *)&row_ptr[x], LV_OPA_MIX2(opa, mask_row_ptr[x])); + } + dest_buf_32 = drawbuf_next_row(dest_buf_32, dest_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + } + return LV_RESULT_OK; +} + +#ifdef __aarch64__ /* vqtbl1q_u8 is only available on arm64 */ +lv_result_t lv_draw_sw_blend_neon_l8_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t src_stride = dsc->src_stride; + const int32_t dest_stride = dsc->dest_stride; + uint8_t * dest_buf_8 = dsc->dest_buf; + const uint8_t * src_buf_l8 = dsc->src_buf; + + if(dest_px_size == 3) { + static const uint8x16_t selector_mask = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 0}; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_byte_ptr = dest_buf_8; + const uint8_t * src_row = src_buf_l8; + int32_t dest_x = 0; + int32_t src_x = 0; + for(; src_x < w - 8; src_x += 5, dest_x += 15) { + uint8x8_t gray_pixels = vld1_u8(&src_row[src_x]); + uint8x16_t gray_extended = vcombine_u8(gray_pixels, vdup_n_u8(0)); + uint8x16_t rgb_result = vqtbl1q_u8(gray_extended, selector_mask); + vst1q_u8(&row_byte_ptr[dest_x], rgb_result); + } + for(; src_x < w; src_x++, dest_x += 3) { + row_byte_ptr[dest_x + 0] = src_row[src_x]; + row_byte_ptr[dest_x + 1] = src_row[src_x]; + row_byte_ptr[dest_x + 2] = src_row[src_x]; + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + else if(dest_px_size == 4) { + static const uint8x16_t selector_mask = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3}; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_byte_ptr = dest_buf_8; + const uint8_t * src_row = src_buf_l8; + int32_t dest_x = 0; + int32_t src_x = 0; + for(; src_x < w - 8; src_x += 4, dest_x += 16) { + uint8x8_t gray_pixels = vld1_u8(&src_row[src_x]); + uint8x16_t gray_extended = vcombine_u8(gray_pixels, vdup_n_u8(0)); + uint8x16_t rgb_result = vqtbl1q_u8(gray_extended, selector_mask); + vst1q_u8(&row_byte_ptr[dest_x], rgb_result); + } + for(; src_x < w; src_x++, dest_x += 4) { + row_byte_ptr[dest_x + 0] = src_row[src_x]; + row_byte_ptr[dest_x + 1] = src_row[src_x]; + row_byte_ptr[dest_x + 2] = src_row[src_x]; + row_byte_ptr[dest_x + 3] = src_row[src_x]; + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + return LV_RESULT_OK; +} +#endif + +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + + if(dest_px_size == 3) { + for(int32_t y = 0; y < h; y++) { + uint8_t * dest_row = dest_buf_u8; + const uint16_t * src_row = (const uint16_t *)src_buf_u16; + int32_t src_x = 0; + int32_t dest_x = 0; + + for(; src_x < w - 7; src_x += 8, dest_x += 24) { + uint8x8x3_t rgb = lv_rgb565_to_rgb888_8(&src_row[src_x]); + vst3_u8(&dest_row[dest_x], rgb); + } + for(; src_x < w; src_x++, dest_x += 3) { + const uint8_t r = (((src_row[src_x] & 0xF800) >> 11) * 2106) >> 8; + const uint8_t g = (((src_row[src_x] & 0x07E0) >> 5) * 1037) >> 8; + const uint8_t b = (((src_row[src_x] & 0x001F)) * 2106) >> 8; + dest_row[dest_x + 0] = b; + dest_row[dest_x + 1] = g; + dest_row[dest_x + 2] = r; + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + else { + for(int32_t y = 0; y < h; y++) { + uint8_t * dest_row = dest_buf_u8; + const uint16_t * src_row = (const uint16_t *)src_buf_u16; + int32_t src_x = 0; + int32_t dest_x = 0; + + for(; src_x < w - 7; src_x += 8, dest_x += 32) { + uint8x8x4_t xrgb = lv_rgb565_to_xrgb8888_8(&src_row[src_x]); + vst4_u8(&dest_row[dest_x], xrgb); + } + for(; src_x < w; src_x++, dest_x += 4) { + const uint8_t r = (((src_row[src_x] & 0xF800) >> 11) * 2106) >> 8; + const uint8_t g = (((src_row[src_x] & 0x07E0) >> 5) * 1037) >> 8; + const uint8_t b = (((src_row[src_x] & 0x001F)) * 2106) >> 8; + dest_row[dest_x + 0] = b; + dest_row[dest_x + 1] = g; + dest_row[dest_x + 2] = r; + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t opa = dsc->opa; + const uint16_t * src_buf_u16 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + + if(dest_px_size == 3) { + const uint8x8_t opa_8 = vdup_n_u8(dsc->opa); + uint8_t * dest_buf_8 = dsc->dest_buf; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_ptr = dest_buf_8; + const uint16_t * src_row_ptr = src_buf_u16; + int32_t x = 0; + for(; x < w - 7; x += 8) { + uint16x8_t src = vld1q_u16(&src_row_ptr[x]); + uint8x8x3_t dst = vld3_u8(&row_ptr[x * 3]); + vst3_u8(&row_ptr[x * 3], rgb565_rgb888_mix_8_internal(src, dst, opa_8)); + } + for(; x < w; x++) { + rgb565_mix_1(&src_row_ptr[x], &row_ptr[x * 3], opa); + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_32 = dsc->dest_buf; + const uint16_t * src_buf_u16 = dsc->src_buf; + const uint32x4_t opa_4 = vdupq_n_u32((uint32_t)dsc->opa); + const uint32x2_t opa_2 = vdup_n_u32((uint32_t)dsc->opa); + + for(int32_t y = 0; y < h; y++) { + uint32_t * row_ptr = dest_buf_32; + const uint16_t * src_row_ptr = src_buf_u16; + int32_t x = 0; + for(; x < w - 3; x += 4) { + uint32x4_t dst = vld1q_u32(&row_ptr[x]); + const uint16x4_t vec_4 = vld1_u16(&src_row_ptr[x]); + uint32x4_t src = vmovl_u16(vec_4); + vst1q_u32(&row_ptr[x], rgb565_xrgb_mix_4_internal(src, dst, opa_4)); + } + for(; x < w - 1; x += 2) { + uint32x2_t dst = vld1_u32(&row_ptr[x]); + uint32x2_t src = {src_row_ptr[x], src_row_ptr[x + 1]}; + vst1_u32(&row_ptr[x], rgb565_xrgb_mix_2_internal(src, dst, opa_2)); + } + for(; x < w; x++) { + rgb565_mix_1(&src_row_ptr[x], (uint8_t *)&row_ptr[x], opa); + } + dest_buf_32 = drawbuf_next_row(dest_buf_32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT_NULL(dsc->mask_buf); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + if(dest_px_size == 3) { + uint8_t * dest_buf_8 = dsc->dest_buf; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_ptr = dest_buf_8; + const uint16_t * src_row_ptr = src_buf_u16; + const uint8_t * mask_row_ptr = mask_buf_u8; + int32_t x = 0; + for(; x < w - 7; x += 8) { + uint16x8_t src = vld1q_u16(&src_row_ptr[x]); + uint8x8x3_t dst = vld3_u8(&row_ptr[x * 3]); + uint8x8_t mask = vld1_u8(&mask_row_ptr[x]); + vst3_u8(&row_ptr[x * 3], rgb565_rgb888_mix_8_internal(src, dst, mask)); + } + for(; x < w; x++) { + rgb565_mix_1(&src_row_ptr[x], &row_ptr[x * 3], mask_row_ptr[x]); + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf_u8 = drawbuf_next_row(mask_buf_u8, mask_stride); + } + } + else if(dest_px_size == 4) { + /* The algorithm below might look okay but the demo render test fails with it so it's disabled */ + return LV_RESULT_INVALID; +#if 0 /* TODO: Figure out the problem with the algorithm below */ + uint32_t * dest_buf_32 = dsc->dest_buf; + const uint16_t * src_buf_u16 = dsc->src_buf; + + for(int32_t y = 0; y < h; y++) { + uint32_t * row_ptr = dest_buf_32; + const uint16_t * src_row_ptr = src_buf_u16; + const uint8_t * mask_row_ptr = mask_buf_u8; + int32_t x = 0; + for(; x < w - 3; x += 4) { + uint32x4_t dst = vld1q_u32(&row_ptr[x]); + const uint16x4_t vec_4 = vld1_u16(&src_row_ptr[x]); + uint32x4_t src = vmovl_u16(vec_4); + const uint32x4_t mask_4 = {mask_row_ptr[x], mask_row_ptr[x + 1], mask_row_ptr[x + 2], mask_row_ptr[x + 3]}; + + vst1q_u32(&row_ptr[x], rgb565_xrgb_mix_4_internal(src, dst, mask_4)); + } + for(; x < w - 1; x += 2) { + uint32x2_t dst = vld1_u32(&row_ptr[x]); + uint32x2_t src = {src_row_ptr[x], src_row_ptr[x + 1]}; + const uint32x2_t mask_2 = {mask_row_ptr[x], mask_row_ptr[x + 1]}; + vst1_u32(&row_ptr[x], rgb565_xrgb_mix_2_internal(src, dst, mask_2)); + } + for(; x < w; x++) { + rgb565_mix_1(&src_row_ptr[x], (uint8_t *)&row_ptr[x], mask_row_ptr[x]); + } + dest_buf_32 = drawbuf_next_row(dest_buf_32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf_u8 = drawbuf_next_row(mask_buf_u8, mask_stride); + } +#endif + } + + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = dsc->src_buf; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_u8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t opa = dsc->opa; + + if(dest_px_size == 3) { + uint8_t * dest_buf_8 = dsc->dest_buf; + const uint8x8_t opa_8 = vdup_n_u8(dsc->opa); + for(int32_t y = 0; y < h; y++) { + uint8_t * row_ptr = dest_buf_8; + const uint16_t * src_row_ptr = src_buf_u16; + const uint8_t * mask_row_ptr = mask_buf_u8; + int32_t x = 0; + for(; x < w - 7; x += 8) { + uint16x8_t src = vld1q_u16(&src_row_ptr[x]); + uint8x8x3_t dst = vld3_u8(&row_ptr[x * 3]); + uint8x8_t mask = vld1_u8(&mask_row_ptr[x]); + const uint16x8_t mult = vmull_u8(opa_8, mask); + const uint8x8_t mix = vshrn_n_u16(mult, 8); + vst3_u8(&row_ptr[x * 3], rgb565_rgb888_mix_8_internal(src, dst, mix)); + } + for(; x < w; x++) { + rgb565_mix_1(&src_row_ptr[x], &row_ptr[x * 3], LV_OPA_MIX2(mask_row_ptr[x], opa)); + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf_u8 = drawbuf_next_row(mask_buf_u8, mask_stride); + } + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_32 = dsc->dest_buf; + const uint16_t * src_buf_u16 = dsc->src_buf; + const uint32x4_t opa_4 = vdupq_n_u32((uint32_t)dsc->opa); + const uint32x2_t opa_2 = vdup_n_u32((uint32_t)dsc->opa); + + for(int32_t y = 0; y < h; y++) { + uint32_t * row_ptr = dest_buf_32; + const uint16_t * src_row_ptr = src_buf_u16; + const uint8_t * mask_row_ptr = mask_buf_u8; + int32_t x = 0; + for(; x < w - 3; x += 4) { + uint32x4_t dst = vld1q_u32(&row_ptr[x]); + const uint16x4_t vec_4 = vld1_u16(&src_row_ptr[x]); + uint32x4_t src = vmovl_u16(vec_4); + const uint32x4_t mask_4 = {mask_row_ptr[x], mask_row_ptr[x + 1], mask_row_ptr[x + 2], mask_row_ptr[x + 3]}; + const uint32x4_t mix_4 = vshrq_n_u32(vmulq_u32(opa_4, mask_4), 8); + + vst1q_u32(&row_ptr[x], rgb565_xrgb_mix_4_internal(src, dst, mix_4)); + } + for(; x < w - 1; x += 2) { + uint32x2_t dst = vld1_u32(&row_ptr[x]); + uint32x2_t src = {src_row_ptr[x], src_row_ptr[x + 1]}; + const uint32x2_t mask_2 = {mask_row_ptr[x], mask_row_ptr[x + 1]}; + const uint32x2_t mix_2 = vshr_n_u32(vmul_u32(opa_2, mask_2), 8); + vst1_u32(&row_ptr[x], rgb565_xrgb_mix_2_internal(src, dst, mix_2)); + } + for(; x < w; x++) { + rgb565_mix_1(&src_row_ptr[x], (uint8_t *)&row_ptr[x], LV_OPA_MIX2(opa, mask_row_ptr[x])); + } + dest_buf_32 = drawbuf_next_row(dest_buf_32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf_u8 = drawbuf_next_row(mask_buf_u8, mask_stride); + } + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size, + uint32_t src_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(src_px_size == 3 || src_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + + /* Fallback to sw implementation*/ + if(src_px_size != dest_px_size) { + return LV_RESULT_INVALID; + } + + for(int32_t y = 0; y < h; y++) { + uint8_t * dest_row = dest_buf_u8; + const uint8_t * src_row = src_buf_u8; + int32_t byte_w = w * src_px_size; + int32_t x = 0; + for(; x < byte_w - 15; x += 16) { + vst1q_u8(&dest_row[x], vld1q_u8(&src_row[x])); + } + for(; x < byte_w - 7; x += 8) { + vst1_u8(&dest_row[x], vld1_u8(&src_row[x])); + } + for(; x < byte_w; x++) { + dest_row[x] = src_row[x]; + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_u8 = drawbuf_next_row(src_buf_u8, src_stride); + } + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size, + uint32_t src_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(src_px_size == 3 || src_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + + /* Fallback to sw implementation*/ + if(dest_px_size != src_px_size) { + return LV_RESULT_INVALID; + } + + if(dest_px_size == 3) { + const uint8x16_t opa_16 = vdupq_n_u8(dsc->opa); + const uint8x8_t opa_8 = vdup_n_u8(dsc->opa); + uint8_t * dest_buf_8 = dsc->dest_buf; + const uint8_t * src_buf_8 = dsc->src_buf; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_ptr = dest_buf_8; + const uint8_t * src_row_ptr = src_buf_8; + + int32_t x = 0; + for(; x < w - 15; x += 16) { + uint8x16x3_t src = vld3q_u8(&src_row_ptr[x * 3]); + uint8x16x3_t dst = vld3q_u8(&row_ptr[x * 3]); + vst3q_u8(&row_ptr[x * 3], rgb_mix_8_internal(src, dst, opa_16)); + } + for(; x < w - 7; x += 8) { + uint8x8x3_t src = vld3_u8(&src_row_ptr[x * 3]); + uint8x8x3_t dst = vld3_u8(&row_ptr[x * 3]); + vst3_u8(&row_ptr[x * 3], rgb_mix_4_internal(src, dst, opa_8)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1(&src_row_ptr[x * 3], &row_ptr[x * 3], opa); + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + src_buf_8 = drawbuf_next_row(src_buf_8, src_stride); + } + + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_32 = dsc->dest_buf; + const uint32_t * src_buf_32 = dsc->src_buf; + const uint32x4_t opa_4 = vdupq_n_u32((uint32_t)dsc->opa); + const uint32x2_t opa_2 = vdup_n_u32((uint32_t)dsc->opa); + + for(int32_t y = 0; y < h; y++) { + uint32_t * row_ptr = dest_buf_32; + const uint32_t * src_row_ptr = src_buf_32; + int32_t x = 0; + for(; x < w - 3; x += 4) { + uint32x4_t src = vld1q_u32(&src_row_ptr[x]); + uint32x4_t dst = vld1q_u32(&row_ptr[x]); + vst1q_u32(&row_ptr[x], lv_color_24_24_mix_4_internal(src, dst, opa_4)); + } + for(; x < w - 1; x += 2) { + uint32x2_t src = vld1_u32(&src_row_ptr[x]); + uint32x2_t dst = vld1_u32(&row_ptr[x]); + vst1_u32(&row_ptr[x], lv_color_24_24_mix_2_internal(src, dst, opa_2)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1((uint8_t *)&src_row_ptr[x], (uint8_t *)&row_ptr[x], opa); + } + dest_buf_32 = drawbuf_next_row(dest_buf_32, dest_stride); + src_buf_32 = drawbuf_next_row(src_buf_32, src_stride); + } + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size, + uint32_t src_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(src_px_size == 3 || src_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT_NULL(dsc->mask_buf); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t * mask_buf_8 = dsc->mask_buf; + + /* Fallback to sw implementation*/ + if(dest_px_size != src_px_size) { + return LV_RESULT_INVALID; + } + + if(dest_px_size == 3) { + uint8_t * dest_buf_8 = dsc->dest_buf; + const uint8_t * src_buf_8 = dsc->src_buf; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_ptr = dest_buf_8; + const uint8_t * src_row_ptr = src_buf_8; + const uint8_t * mask_row_ptr = mask_buf_8; + + int32_t x = 0; + for(; x < w - 15; x += 16) { + const uint8x16_t mask_16 = vld1q_u8(&mask_row_ptr[x]); + uint8x16x3_t src = vld3q_u8(&src_row_ptr[x * 3]); + uint8x16x3_t dst = vld3q_u8(&row_ptr[x * 3]); + vst3q_u8(&row_ptr[x * 3], rgb_mix_8_internal(src, dst, mask_16)); + } + for(; x < w - 7; x += 8) { + const uint8x8_t mask = vld1_u8(&mask_row_ptr[x]); + uint8x8x3_t src = vld3_u8(&src_row_ptr[x * 3]); + uint8x8x3_t dst = vld3_u8(&row_ptr[x * 3]); + vst3_u8(&row_ptr[x * 3], rgb_mix_4_internal(src, dst, mask)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1(&src_row_ptr[x * 3], &row_ptr[x * 3], mask_row_ptr[x]); + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + src_buf_8 = drawbuf_next_row(src_buf_8, src_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_32 = dsc->dest_buf; + const uint32_t * src_buf_32 = dsc->src_buf; + + for(int32_t y = 0; y < h; y++) { + uint32_t * row_ptr = dest_buf_32; + const uint32_t * src_row_ptr = src_buf_32; + const uint8_t * mask_row_ptr = mask_buf_8; + int32_t x = 0; + for(; x < w - 3; x += 4) { + const uint32x4_t mask_4 = {mask_row_ptr[x], mask_row_ptr[x + 1], mask_row_ptr[x + 2], mask_row_ptr[x + 3]}; + uint32x4_t src = vld1q_u32(&src_row_ptr[x]); + uint32x4_t dst = vld1q_u32(&row_ptr[x]); + vst1q_u32(&row_ptr[x], lv_color_24_24_mix_4_internal(src, dst, mask_4)); + } + for(; x < w - 1; x += 2) { + const uint32x2_t mask_2 = {mask_row_ptr[x], mask_row_ptr[x + 1]}; + uint32x2_t src = vld1_u32(&src_row_ptr[x]); + uint32x2_t dst = vld1_u32(&row_ptr[x]); + vst1_u32(&row_ptr[x], lv_color_24_24_mix_2_internal(src, dst, mask_2)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1((uint8_t *)&src_row_ptr[x], (uint8_t *)&row_ptr[x], mask_row_ptr[x]); + } + dest_buf_32 = drawbuf_next_row(dest_buf_32, dest_stride); + src_buf_32 = drawbuf_next_row(src_buf_32, src_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size, uint32_t src_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(src_px_size == 3 || src_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT_NULL(dsc->mask_buf); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const int32_t mask_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + const uint8_t * mask_buf_8 = dsc->mask_buf; + + /* Fallback to sw implementation*/ + if(dest_px_size != src_px_size) { + return LV_RESULT_INVALID; + } + + if(dest_px_size == 3) { + const uint8x16_t opa_16 = vdupq_n_u8(dsc->opa); + const uint8x8_t opa_8 = vdup_n_u8(dsc->opa); + uint8_t * dest_buf_8 = dsc->dest_buf; + const uint8_t * src_buf_8 = dsc->src_buf; + for(int32_t y = 0; y < h; y++) { + uint8_t * row_ptr = dest_buf_8; + const uint8_t * src_row_ptr = src_buf_8; + const uint8_t * mask_row_ptr = mask_buf_8; + + int32_t x = 0; + for(; x < w - 15; x += 16) { + const uint8x16_t mask_16 = vld1q_u8(&mask_row_ptr[x]); + const uint8x8_t opa_lo = vget_low_u8(opa_16); + const uint8x8_t opa_hi = vget_high_u8(opa_16); + const uint8x8_t mask_lo = vget_low_u8(mask_16); + const uint8x8_t mask_hi = vget_high_u8(mask_16); + const uint16x8_t result_lo_wide = vmull_u8(opa_lo, mask_lo); + const uint16x8_t result_hi_wide = vmull_u8(opa_hi, mask_hi); + const uint8x8_t result_lo = vshrn_n_u16(result_lo_wide, 8); + const uint8x8_t result_hi = vshrn_n_u16(result_hi_wide, 8); + const uint8x16_t mix = vcombine_u8(result_lo, result_hi); + uint8x16x3_t src = vld3q_u8(&src_row_ptr[x * 3]); + uint8x16x3_t dst = vld3q_u8(&row_ptr[x * 3]); + vst3q_u8(&row_ptr[x * 3], rgb_mix_8_internal(src, dst, mix)); + } + for(; x < w - 7; x += 8) { + const uint8x8_t mask = vld1_u8(&mask_row_ptr[x]); + const uint16x8_t mult = vmull_u8(opa_8, mask); + const uint8x8_t mix = vshrn_n_u16(mult, 8); + uint8x8x3_t src = vld3_u8(&src_row_ptr[x * 3]); + uint8x8x3_t dst = vld3_u8(&row_ptr[x * 3]); + vst3_u8(&row_ptr[x * 3], rgb_mix_4_internal(src, dst, mix)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1(&src_row_ptr[x * 3], &row_ptr[x * 3], LV_OPA_MIX2(opa, mask_row_ptr[x])); + } + dest_buf_8 = drawbuf_next_row(dest_buf_8, dest_stride); + src_buf_8 = drawbuf_next_row(src_buf_8, src_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_32 = dsc->dest_buf; + const uint32_t * src_buf_32 = dsc->src_buf; + const uint32x4_t opa_4 = vdupq_n_u32((uint32_t)dsc->opa); + const uint32x2_t opa_2 = vdup_n_u32((uint32_t)dsc->opa); + + for(int32_t y = 0; y < h; y++) { + uint32_t * row_ptr = dest_buf_32; + const uint32_t * src_row_ptr = src_buf_32; + const uint8_t * mask_row_ptr = mask_buf_8; + int32_t x = 0; + for(; x < w - 3; x += 4) { + const uint32x4_t mask_4 = {mask_row_ptr[x], mask_row_ptr[x + 1], mask_row_ptr[x + 2], mask_row_ptr[x + 3]}; + const uint32x4_t mix_4 = vshrq_n_u32(vmulq_u32(opa_4, mask_4), 8); + uint32x4_t src = vld1q_u32(&src_row_ptr[x]); + uint32x4_t dst = vld1q_u32(&row_ptr[x]); + vst1q_u32(&row_ptr[x], lv_color_24_24_mix_4_internal(src, dst, mix_4)); + } + for(; x < w - 1; x += 2) { + const uint32x2_t mask_2 = {mask_row_ptr[x], mask_row_ptr[x + 1]}; + const uint32x2_t mix_2 = vshr_n_u32(vmul_u32(opa_2, mask_2), 8); + uint32x2_t src = vld1_u32(&src_row_ptr[x]); + uint32x2_t dst = vld1_u32(&row_ptr[x]); + vst1_u32(&row_ptr[x], lv_color_24_24_mix_2_internal(src, dst, mix_2)); + } + for(; x < w; x ++) { + lv_color_24_24_mix_1((uint8_t *)&src_row_ptr[x], (uint8_t *)&row_ptr[x], LV_OPA_MIX2(opa, mask_row_ptr[x])); + } + dest_buf_32 = drawbuf_next_row(dest_buf_32, dest_stride); + src_buf_32 = drawbuf_next_row(src_buf_32, src_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + } + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + int32_t dest_stride = dsc->dest_stride; + int32_t src_stride = dsc->src_stride; + + /* Fallback to sw implementation*/ + if(dest_px_size == 3) { + return LV_RESULT_INVALID; + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_u32 = dsc->dest_buf; + const uint32_t * src_buf_u32 = dsc->src_buf; + for(int32_t y = 0; y < h; y++) { + int32_t x = 0; + for(; x < w - 3; x += 4) { + vst1q_u32(&dest_buf_u32[x], argb_rgb_mix_4(&src_buf_u32[x], &dest_buf_u32[x])); + } + for(; x < w - 1; x += 2) { + vst1_u32(&dest_buf_u32[x], argb_rgb_mix_2(&src_buf_u32[x], &dest_buf_u32[x])); + } + for(; x < w; x++) { + lv_color_24_24_mix_1((uint8_t *)&src_buf_u32[x], (uint8_t *)&dest_buf_u32[x], + ((uint8_t *)src_buf_u32)[x * sizeof(uint32_t) + 3]); + } + src_buf_u32 = drawbuf_next_row(src_buf_u32, src_stride); + dest_buf_u32 = drawbuf_next_row(dest_buf_u32, dest_stride); + } + + } + return LV_RESULT_OK; +} + +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + + /* Fallback to sw implementation*/ + if(dest_px_size == 3) { + return LV_RESULT_INVALID; + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_u32 = dsc->dest_buf; + const uint32_t * src_buf_u32 = dsc->src_buf; + const uint32x4_t opa_4 = vdupq_n_u32((uint32_t)dsc->opa); + const uint32x2_t opa_2 = vdup_n_u32((uint32_t)dsc->opa); + for(int32_t y = 0; y < h; y++) { + int32_t x = 0; + for(; x < w - 3; x += 4) { + vst1q_u32(&dest_buf_u32[x], argb_rgb_mix_4_with_opa(&src_buf_u32[x], &dest_buf_u32[x], opa_4)); + } + for(; x < w - 1; x += 2) { + vst1_u32(&dest_buf_u32[x], argb_rgb_mix_2_with_opa(&src_buf_u32[x], &dest_buf_u32[x], opa_2)); + } + for(; x < w; x++) { + uint8_t alpha = ((uint8_t *)src_buf_u32)[x * sizeof(uint32_t) + 3]; + lv_color_24_24_mix_1((uint8_t *)&src_buf_u32[x], (uint8_t *)&dest_buf_u32[x], + LV_OPA_MIX2(alpha, opa)); + } + src_buf_u32 = drawbuf_next_row(src_buf_u32, src_stride); + dest_buf_u32 = drawbuf_next_row(dest_buf_u32, dest_stride); + } + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT_NULL(dsc->mask_buf); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + /* Fallback to sw implementation*/ + if(dest_px_size == 3) { + return LV_RESULT_INVALID; + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_u32 = dsc->dest_buf; + const uint32_t * src_buf_u32 = dsc->src_buf; + const uint8_t * mask_row_ptr = mask_buf_8; + for(int32_t y = 0; y < h; y++) { + int32_t x = 0; + for(; x < w - 3; x += 4) { + const uint32x4_t mask_4 = {mask_row_ptr[x], mask_row_ptr[x + 1], mask_row_ptr[x + 2], mask_row_ptr[x + 3]}; + vst1q_u32(&dest_buf_u32[x], argb_rgb_mix_4_with_opa(&src_buf_u32[x], &dest_buf_u32[x], mask_4)); + } + for(; x < w - 1; x += 2) { + const uint32x2_t mask_2 = {mask_row_ptr[x], mask_row_ptr[x + 1]}; + vst1_u32(&dest_buf_u32[x], argb_rgb_mix_2_with_opa(&src_buf_u32[x], &dest_buf_u32[x], mask_2)); + } + for(; x < w; x++) { + uint8_t alpha = ((uint8_t *)src_buf_u32)[x * sizeof(uint32_t) + 3]; + lv_color_24_24_mix_1((uint8_t *)&src_buf_u32[x], (uint8_t *)&dest_buf_u32[x], + LV_OPA_MIX2(alpha, mask_row_ptr[x])); + } + src_buf_u32 = drawbuf_next_row(src_buf_u32, src_stride); + dest_buf_u32 = drawbuf_next_row(dest_buf_u32, dest_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + } + return LV_RESULT_OK; +} +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT_NULL(dsc->mask_buf); + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const uint8_t * mask_buf_8 = dsc->mask_buf; + const int32_t mask_stride = dsc->mask_stride; + + /* Fallback to sw implementation*/ + if(dest_px_size == 3) { + return LV_RESULT_INVALID; + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_u32 = dsc->dest_buf; + const uint32_t * src_buf_u32 = dsc->src_buf; + const uint8_t * mask_row_ptr = mask_buf_8; + const uint32x4_t opa_4 = vdupq_n_u32((uint32_t)dsc->opa); + const uint32x2_t opa_2 = vdup_n_u32((uint32_t)dsc->opa); + for(int32_t y = 0; y < h; y++) { + int32_t x = 0; + for(; x < w - 3; x += 4) { + const uint32x4_t mask_4 = {mask_row_ptr[x], mask_row_ptr[x + 1], mask_row_ptr[x + 2], mask_row_ptr[x + 3]}; + vst1q_u32(&dest_buf_u32[x], argb_rgb_mix_4_with_opa_mask(&src_buf_u32[x], &dest_buf_u32[x], opa_4, mask_4)); + } + for(; x < w - 1; x += 2) { + const uint32x2_t mask_2 = {mask_row_ptr[x], mask_row_ptr[x + 1]}; + vst1_u32(&dest_buf_u32[x], argb_rgb_mix_2_with_opa_mask(&src_buf_u32[x], &dest_buf_u32[x], opa_2, mask_2)); + } + for(; x < w; x++) { + uint8_t alpha = ((uint8_t *)src_buf_u32)[x * sizeof(uint32_t) + 3]; + lv_color_24_24_mix_1((uint8_t *)&src_buf_u32[x], (uint8_t *)&dest_buf_u32[x], + LV_OPA_MIX2(alpha, mask_row_ptr[x])); + } + src_buf_u32 = drawbuf_next_row(src_buf_u32, src_stride); + dest_buf_u32 = drawbuf_next_row(dest_buf_u32, dest_stride); + mask_buf_8 = drawbuf_next_row(mask_buf_8, mask_stride); + } + } + return LV_RESULT_OK; +} + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED +lv_result_t lv_draw_sw_blend_neon_argb888_premultiplied_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + int32_t dest_stride = dsc->dest_stride; + int32_t src_stride = dsc->src_stride; + + /* Fallback to sw implementation*/ + if(dest_px_size == 3) { + return LV_RESULT_INVALID; + } + else if(dest_px_size == 4) { + uint32_t * dest_buf_u32 = dsc->dest_buf; + const uint32_t * src_buf_u32 = dsc->src_buf; + for(int32_t y = 0; y < h; y++) { + int32_t x = 0; + for(; x < w - 3; x += 4) { + uint32x4_t src_pixels = vld1q_u32(&src_buf_u32[x]); + uint32x4_t dst_pixels = vld1q_u32(&dest_buf_u32[x]); + uint32x4_t alpha = vshrq_n_u32(src_pixels, 24); + vst1q_u32(&dest_buf_u32[x], lv_color_24_24_mix_4_premul_internal(src_pixels, dst_pixels, alpha)); + } + for(; x < w - 1; x += 2) { + uint32x2_t src_pixels = vld1_u32(&src_buf_u32[x]); + uint32x2_t dst_pixels = vld1_u32(&dest_buf_u32[x]); + uint32x2_t alpha = vshr_n_u32(src_pixels, 24); + vst1_u32(&dest_buf_u32[x], lv_color_24_24_mix_2_premul_internal(src_pixels, dst_pixels, alpha)); + } + for(; x < w; x++) { + lv_color_24_24_mix_premult((uint8_t *)&src_buf_u32[x], (uint8_t *)&dest_buf_u32[x], + ((uint8_t *)src_buf_u32)[x * sizeof(uint32_t) + 3]); + } + src_buf_u32 = drawbuf_next_row(src_buf_u32, src_stride); + dest_buf_u32 = drawbuf_next_row(dest_buf_u32, dest_stride); + } + + } + return LV_RESULT_OK; +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +static inline uint8x16x3_t lv_color_to_rgb888_16(const lv_color_t * color) +{ + const uint8x16_t r_vec = vdupq_n_u8(color->red); + const uint8x16_t g_vec = vdupq_n_u8(color->green); + const uint8x16_t b_vec = vdupq_n_u8(color->blue); + uint8x16x3_t rgb_data; + rgb_data.val[0] = b_vec; + rgb_data.val[1] = g_vec; + rgb_data.val[2] = r_vec; + return rgb_data; +} + +static inline uint8x8x3_t lv_color_to_rgb888_8(const lv_color_t * color) +{ + const uint8x8_t r_vec = vdup_n_u8(color->red); + const uint8x8_t g_vec = vdup_n_u8(color->green); + const uint8x8_t b_vec = vdup_n_u8(color->blue); + uint8x8x3_t rgb_data; + rgb_data.val[0] = b_vec; + rgb_data.val[1] = g_vec; + rgb_data.val[2] = r_vec; + return rgb_data; +} + +static inline uint8x16x4_t lv_color_to_xrgb888_16(const lv_color_t * color) +{ + const uint8x16_t r_vec = vdupq_n_u8(color->red); + const uint8x16_t g_vec = vdupq_n_u8(color->green); + const uint8x16_t b_vec = vdupq_n_u8(color->blue); + const uint8x16_t a_vec = vdupq_n_u8(0xFF); + uint8x16x4_t rgb_data; + rgb_data.val[0] = b_vec; + rgb_data.val[1] = g_vec; + rgb_data.val[2] = r_vec; + rgb_data.val[3] = a_vec; + return rgb_data; +} + +static inline uint8x8x4_t lv_color_to_xrgb888_8(const lv_color_t * color) +{ + const uint8x8_t r_vec = vdup_n_u8(color->red); + const uint8x8_t g_vec = vdup_n_u8(color->green); + const uint8x8_t b_vec = vdup_n_u8(color->blue); + const uint8x8_t a_vec = vdup_n_u8(0xFF); + uint8x8x4_t rgb_data; + rgb_data.val[0] = b_vec; + rgb_data.val[1] = g_vec; + rgb_data.val[2] = r_vec; + rgb_data.val[3] = a_vec; + return rgb_data; +} + +static inline uint8x16_t lv_color_to_xrgb888_4(const lv_color_t * color) +{ + uint32_t pixel_value = (0xFF << 24) | (color->red << 16) | (color->green << 8) | color->blue; + return vreinterpretq_u8_u32(vdupq_n_u32(pixel_value)); +} + +static inline uint8x8_t lv_color_to_xrgb888_2(const lv_color_t * color) +{ + uint32_t pixel_value = (0xFF << 24) | (color->red << 16) | (color->green << 8) | color->blue; + return vreinterpret_u8_u32(vdup_n_u32(pixel_value)); +} + +static inline uint8x8x3_t lv_rgb565_to_rgb888_8(const uint16_t * color) +{ + const uint16x8_t pixels = vld1q_u16(color); + + const uint16x8_t blue_mask = vdupq_n_u16(0x001F); + const uint16x8_t green_mask = vdupq_n_u16(0x07E0); + const uint16x8_t red_mask = vdupq_n_u16(0xF800); + + const uint16x8_t rb_multiplier = vdupq_n_u16(2106); + const uint16x8_t g_multiplier = vdupq_n_u16(1037); + + const uint16x8_t r5 = vshrq_n_u16(vandq_u16(pixels, red_mask), 11); + const uint16x8_t g6 = vshrq_n_u16(vandq_u16(pixels, green_mask), 5); + const uint16x8_t b5 = vandq_u16(pixels, blue_mask); + + const uint8x8_t r8 = vmovn_u16(vshrq_n_u16(vmulq_u16(r5, rb_multiplier), 8)); + const uint8x8_t g8 = vmovn_u16(vshrq_n_u16(vmulq_u16(g6, g_multiplier), 8)); + const uint8x8_t b8 = vmovn_u16(vshrq_n_u16(vmulq_u16(b5, rb_multiplier), 8)); + + uint8x8x3_t rgb; + rgb.val[0] = b8; + rgb.val[1] = g8; + rgb.val[2] = r8; + return rgb; +} +static inline uint8x8x4_t lv_rgb565_to_xrgb8888_8(const uint16_t * color) +{ + const uint16x8_t pixels = vld1q_u16(color); + + const uint16x8_t blue_mask = vdupq_n_u16(0x001F); + const uint16x8_t green_mask = vdupq_n_u16(0x07E0); + const uint16x8_t red_mask = vdupq_n_u16(0xF800); + + const uint16x8_t rb_multiplier = vdupq_n_u16(2106); + const uint16x8_t g_multiplier = vdupq_n_u16(1037); + + const uint16x8_t r5 = vshrq_n_u16(vandq_u16(pixels, red_mask), 11); + const uint16x8_t g6 = vshrq_n_u16(vandq_u16(pixels, green_mask), 5); + const uint16x8_t b5 = vandq_u16(pixels, blue_mask); + + const uint8x8_t r8 = vmovn_u16(vshrq_n_u16(vmulq_u16(r5, rb_multiplier), 8)); + const uint8x8_t g8 = vmovn_u16(vshrq_n_u16(vmulq_u16(g6, g_multiplier), 8)); + const uint8x8_t b8 = vmovn_u16(vshrq_n_u16(vmulq_u16(b5, rb_multiplier), 8)); + + uint8x8x4_t rgb; + rgb.val[0] = b8; + rgb.val[1] = g8; + rgb.val[2] = r8; + return rgb; +} + +static inline void rgb565_mix_1(const uint16_t * src, uint8_t * dest, uint8_t mix) +{ + if(mix == 0) { + return; + } + const uint32_t b = ((src[0] & 0x001F) * 2106) >> 8; + const uint32_t g = (((src[0] & 0x07E0) >> 5) * 1037) >> 8; + const uint32_t r = (((src[0] & 0xF800) >> 11) * 2106) >> 8; + if(mix >= LV_OPA_MAX) { + dest[0] = b; + dest[1] = g; + dest[2] = r; + return; + } + const lv_opa_t mix_inv = 255 - mix; + dest[0] = (uint32_t)(b * mix + dest[0] * mix_inv) >> 8; + dest[1] = (uint32_t)(g * mix + dest[1] * mix_inv) >> 8; + dest[2] = (uint32_t)(r * mix + dest[2] * mix_inv) >> 8; + + +} + +static inline void lv_color_24_24_mix_1(const uint8_t * src, uint8_t * dest, uint8_t mix) +{ + if(mix == 0) { + return; + } + + if(mix >= LV_OPA_MAX) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + return; + } + const lv_opa_t mix_inv = 255 - mix; + dest[0] = (uint32_t)((uint32_t)src[0] * mix + dest[0] * mix_inv) >> 8; + dest[1] = (uint32_t)((uint32_t)src[1] * mix + dest[1] * mix_inv) >> 8; + dest[2] = (uint32_t)((uint32_t)src[2] * mix + dest[2] * mix_inv) >> 8; +} + +static inline void lv_color_24_24_mix_premult(const uint8_t * src, uint8_t * dest, uint8_t mix) +{ + if(mix == 0) return; + + if(mix >= LV_OPA_MAX) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + } + else { + lv_opa_t mix_inv = 255 - mix; + dest[0] = (uint32_t)src[0] + ((uint32_t)(dest[0] * mix_inv) >> 8); + dest[1] = (uint32_t)src[1] + ((uint32_t)(dest[1] * mix_inv) >> 8); + dest[2] = (uint32_t)src[2] + ((uint32_t)(dest[2] * mix_inv) >> 8); + } +} + + +static inline uint32x4_t argb_rgb_mix_4(const uint32_t * src, const uint32_t * dst) +{ + uint32x4_t src_pixels = vld1q_u32(src); + uint32x4_t dst_pixels = vld1q_u32(dst); + + uint32x4_t alpha = vshrq_n_u32(src_pixels, 24); + return lv_color_24_24_mix_4_internal(src_pixels, dst_pixels, alpha); +} +static inline uint32x2_t argb_rgb_mix_2(const uint32_t * src, const uint32_t * dst) +{ + uint32x2_t src_pixels = vld1_u32(src); + uint32x2_t dst_pixels = vld1_u32(dst); + uint32x2_t alpha = vshr_n_u32(src_pixels, 24); + return lv_color_24_24_mix_2_internal(src_pixels, dst_pixels, alpha); +} + +static inline uint32x4_t argb_rgb_mix_4_with_opa(const uint32_t * src, const uint32_t * dst, uint32x4_t opa) +{ + uint32x4_t src_pixels = vld1q_u32(src); + uint32x4_t dst_pixels = vld1q_u32(dst); + + uint32x4_t alpha = vshrq_n_u32(src_pixels, 24); + uint32x4_t mix = vshrq_n_u32(vmulq_u32(alpha, opa), 8); + return lv_color_24_24_mix_4_internal(src_pixels, dst_pixels, mix); +} +static inline uint32x2_t argb_rgb_mix_2_with_opa(const uint32_t * src, const uint32_t * dst, uint32x2_t opa) +{ + uint32x2_t src_pixels = vld1_u32(src); + uint32x2_t dst_pixels = vld1_u32(dst); + uint32x2_t alpha = vshr_n_u32(src_pixels, 24); + uint32x2_t mix = vshr_n_u32(vmul_u32(alpha, opa), 8); + return lv_color_24_24_mix_2_internal(src_pixels, dst_pixels, mix); +} +static inline uint32x4_t argb_rgb_mix_4_with_opa_mask(const uint32_t * src, const uint32_t * dst, uint32x4_t opa, + uint32x4_t mask) +{ + uint32x4_t src_pixels = vld1q_u32(src); + uint32x4_t dst_pixels = vld1q_u32(dst); + + uint32x4_t alpha = vshrq_n_u32(src_pixels, 24); + uint32x4_t mix = vshrq_n_u32(vmulq_u32(alpha, vmulq_u32(opa, mask)), 16); + return lv_color_24_24_mix_4_internal(src_pixels, dst_pixels, mix); +} + +static inline uint32x2_t argb_rgb_mix_2_with_opa_mask(const uint32_t * src, const uint32_t * dst, uint32x2_t opa, + uint32x2_t mask) +{ + uint32x2_t src_pixels = vld1_u32(src); + uint32x2_t dst_pixels = vld1_u32(dst); + uint32x2_t alpha = vshr_n_u32(src_pixels, 24); + uint32x2_t mix = vshr_n_u32(vmul_u32(alpha, vmul_u32(opa, mask)), 16); + return lv_color_24_24_mix_2_internal(src_pixels, dst_pixels, mix); +} + +static inline uint8x8x3_t rgb565_rgb888_mix_8_internal(uint16x8_t src, uint8x8x3_t dst, uint8x8_t mix) +{ + uint8x8_t zero_mask = vceq_u8(mix, vdup_n_u8(0)); + uint8x8_t full_mask = vcge_u8(mix, vdup_n_u8(LV_OPA_MAX)); + uint8x8_t inv_mix = vsub_u8(vdup_n_u8(255), mix); + + uint8x8_t src_r = vqmovn_u16(vshrq_n_u16(vmulq_u16(vshrq_n_u16(vandq_u16(src, vdupq_n_u16(0xF800)), 11), + vdupq_n_u16(2106)), 8)); + uint8x8_t src_g = vqmovn_u16(vshrq_n_u16(vmulq_u16(vshrq_n_u16(vandq_u16(src, vdupq_n_u16(0x07E0)), 5), + vdupq_n_u16(1037)), 8)); + uint8x8_t src_b = vqmovn_u16(vshrq_n_u16(vmulq_u16(vandq_u16(src, vdupq_n_u16(0x001F)), vdupq_n_u16(2106)), 8)); + + uint8x8_t dst_b = dst.val[0]; + uint8x8_t dst_g = dst.val[1]; + uint8x8_t dst_r = dst.val[2]; + + uint16x8_t blend_r_wide = vaddq_u16(vmull_u8(src_r, mix), vmull_u8(dst_r, inv_mix)); + uint16x8_t blend_g_wide = vaddq_u16(vmull_u8(src_g, mix), vmull_u8(dst_g, inv_mix)); + uint16x8_t blend_b_wide = vaddq_u16(vmull_u8(src_b, mix), vmull_u8(dst_b, inv_mix)); + + uint8x8_t blend_r = vshrn_n_u16(blend_r_wide, 8); + uint8x8_t blend_g = vshrn_n_u16(blend_g_wide, 8); + uint8x8_t blend_b = vshrn_n_u16(blend_b_wide, 8); + + uint8x8_t result_r = vbsl_u8(zero_mask, dst_r, blend_r); + result_r = vbsl_u8(full_mask, src_r, result_r); + + uint8x8_t result_g = vbsl_u8(zero_mask, dst_g, blend_g); + result_g = vbsl_u8(full_mask, src_g, result_g); + + uint8x8_t result_b = vbsl_u8(zero_mask, dst_b, blend_b); + result_b = vbsl_u8(full_mask, src_b, result_b); + + uint8x8x3_t result = {{ result_b, result_g, result_r }}; + return result; +} + +static inline uint8x16x3_t rgb_mix_8_internal(uint8x16x3_t src, uint8x16x3_t dst, uint8x16_t mix) +{ + uint8x16_t zero_mask = vceqq_u8(mix, vdupq_n_u8(0)); + uint8x16_t full_mask = vcgeq_u8(mix, vdupq_n_u8(LV_OPA_MAX)); + uint8x16_t inv_mix = vsubq_u8(vdupq_n_u8(255), mix); + + uint8x8_t mix_lo = vget_low_u8(mix); + uint8x8_t mix_hi = vget_high_u8(mix); + uint8x8_t inv_mix_lo = vget_low_u8(inv_mix); + uint8x8_t inv_mix_hi = vget_high_u8(inv_mix); + + uint8x8_t src_r_lo = vget_low_u8(src.val[0]); + uint8x8_t src_r_hi = vget_high_u8(src.val[0]); + uint8x8_t dst_r_lo = vget_low_u8(dst.val[0]); + uint8x8_t dst_r_hi = vget_high_u8(dst.val[0]); + + uint16x8_t blend_r_wide_lo = vaddq_u16(vmull_u8(src_r_lo, mix_lo), vmull_u8(dst_r_lo, inv_mix_lo)); + uint16x8_t blend_r_wide_hi = vaddq_u16(vmull_u8(src_r_hi, mix_hi), vmull_u8(dst_r_hi, inv_mix_hi)); + + uint8x8_t blend_r_lo = vshrn_n_u16(blend_r_wide_lo, 8); + uint8x8_t blend_r_hi = vshrn_n_u16(blend_r_wide_hi, 8); + uint8x16_t blend_r = vcombine_u8(blend_r_lo, blend_r_hi); + + uint8x8_t src_g_lo = vget_low_u8(src.val[1]); + uint8x8_t src_g_hi = vget_high_u8(src.val[1]); + uint8x8_t dst_g_lo = vget_low_u8(dst.val[1]); + uint8x8_t dst_g_hi = vget_high_u8(dst.val[1]); + + uint16x8_t blend_g_wide_lo = vaddq_u16(vmull_u8(src_g_lo, mix_lo), vmull_u8(dst_g_lo, inv_mix_lo)); + uint16x8_t blend_g_wide_hi = vaddq_u16(vmull_u8(src_g_hi, mix_hi), vmull_u8(dst_g_hi, inv_mix_hi)); + + uint8x8_t blend_g_lo = vshrn_n_u16(blend_g_wide_lo, 8); + uint8x8_t blend_g_hi = vshrn_n_u16(blend_g_wide_hi, 8); + uint8x16_t blend_g = vcombine_u8(blend_g_lo, blend_g_hi); + + uint8x8_t src_b_lo = vget_low_u8(src.val[2]); + uint8x8_t src_b_hi = vget_high_u8(src.val[2]); + uint8x8_t dst_b_lo = vget_low_u8(dst.val[2]); + uint8x8_t dst_b_hi = vget_high_u8(dst.val[2]); + + uint16x8_t blend_b_wide_lo = vaddq_u16(vmull_u8(src_b_lo, mix_lo), vmull_u8(dst_b_lo, inv_mix_lo)); + uint16x8_t blend_b_wide_hi = vaddq_u16(vmull_u8(src_b_hi, mix_hi), vmull_u8(dst_b_hi, inv_mix_hi)); + + uint8x8_t blend_b_lo = vshrn_n_u16(blend_b_wide_lo, 8); + uint8x8_t blend_b_hi = vshrn_n_u16(blend_b_wide_hi, 8); + uint8x16_t blend_b = vcombine_u8(blend_b_lo, blend_b_hi); + + uint8x16_t result_r = vbslq_u8(zero_mask, dst.val[0], blend_r); + result_r = vbslq_u8(full_mask, src.val[0], result_r); + + uint8x16_t result_g = vbslq_u8(zero_mask, dst.val[1], blend_g); + result_g = vbslq_u8(full_mask, src.val[1], result_g); + + uint8x16_t result_b = vbslq_u8(zero_mask, dst.val[2], blend_b); + result_b = vbslq_u8(full_mask, src.val[2], result_b); + + uint8x16x3_t result = {{result_r, result_g, result_b}}; + return result; +} + +static inline uint8x8x3_t rgb_mix_4_internal(uint8x8x3_t src, uint8x8x3_t dst, uint8x8_t mix) +{ + uint8x8_t zero_mask = vceq_u8(mix, vdup_n_u8(0)); + uint8x8_t full_mask = vcge_u8(mix, vdup_n_u8(LV_OPA_MAX)); + uint8x8_t inv_mix = vsub_u8(vdup_n_u8(255), mix); + + uint16x8_t blend_r_wide = vaddq_u16(vmull_u8(src.val[0], mix), vmull_u8(dst.val[0], inv_mix)); + uint8x8_t blend_r = vshrn_n_u16(blend_r_wide, 8); + + uint16x8_t blend_g_wide = vaddq_u16(vmull_u8(src.val[1], mix), vmull_u8(dst.val[1], inv_mix)); + uint8x8_t blend_g = vshrn_n_u16(blend_g_wide, 8); + + uint16x8_t blend_b_wide = vaddq_u16(vmull_u8(src.val[2], mix), vmull_u8(dst.val[2], inv_mix)); + uint8x8_t blend_b = vshrn_n_u16(blend_b_wide, 8); + + uint8x8_t result_r = vbsl_u8(zero_mask, dst.val[0], blend_r); + result_r = vbsl_u8(full_mask, src.val[0], result_r); + + uint8x8_t result_g = vbsl_u8(zero_mask, dst.val[1], blend_g); + result_g = vbsl_u8(full_mask, src.val[1], result_g); + + uint8x8_t result_b = vbsl_u8(zero_mask, dst.val[2], blend_b); + result_b = vbsl_u8(full_mask, src.val[2], result_b); + + uint8x8x3_t result = {{result_r, result_g, result_b}}; + return result; +} + +static inline uint32x4_t lv_color_24_24_mix_4_internal(uint32x4_t src, uint32x4_t dst, uint32x4_t mix) +{ + uint32x4_t zero_mask = vceqq_u32(mix, vdupq_n_u32(0)); + uint32x4_t full_mask = vcgeq_u32(mix, vdupq_n_u32(LV_OPA_MAX)); + + uint32x4_t src_r = vandq_u32(vshrq_n_u32(src, 16), vdupq_n_u32(0xFF)); + uint32x4_t src_g = vandq_u32(vshrq_n_u32(src, 8), vdupq_n_u32(0xFF)); + uint32x4_t src_b = vandq_u32(src, vdupq_n_u32(0xFF)); + + uint32x4_t dst_r = vandq_u32(vshrq_n_u32(dst, 16), vdupq_n_u32(0xFF)); + uint32x4_t dst_g = vandq_u32(vshrq_n_u32(dst, 8), vdupq_n_u32(0xFF)); + uint32x4_t dst_b = vandq_u32(dst, vdupq_n_u32(0xFF)); + + uint32x4_t inv_mix = vsubq_u32(vdupq_n_u32(255), mix); + uint32x4_t blend_r = vshrq_n_u32(vaddq_u32(vmulq_u32(src_r, mix), vmulq_u32(dst_r, inv_mix)), 8); + uint32x4_t blend_g = vshrq_n_u32(vaddq_u32(vmulq_u32(src_g, mix), vmulq_u32(dst_g, inv_mix)), 8); + uint32x4_t blend_b = vshrq_n_u32(vaddq_u32(vmulq_u32(src_b, mix), vmulq_u32(dst_b, inv_mix)), 8); + + uint32x4_t blended = vorrq_u32(vorrq_u32(vshlq_n_u32(blend_r, 16), vshlq_n_u32(blend_g, 8)), blend_b); + uint32x4_t result = vbslq_u32(zero_mask, dst, blended); + return vbslq_u32(full_mask, src, result); +} + +static inline uint32x2_t lv_color_24_24_mix_2_internal(uint32x2_t src, uint32x2_t dst, uint32x2_t mix) +{ + uint32x2_t zero_mask = vceq_u32(mix, vdup_n_u32(0)); + uint32x2_t full_mask = vcge_u32(mix, vdup_n_u32(LV_OPA_MAX)); + + uint32x2_t src_r = vand_u32(vshr_n_u32(src, 16), vdup_n_u32(0xFF)); + uint32x2_t src_g = vand_u32(vshr_n_u32(src, 8), vdup_n_u32(0xFF)); + uint32x2_t src_b = vand_u32(src, vdup_n_u32(0xFF)); + + uint32x2_t dst_r = vand_u32(vshr_n_u32(dst, 16), vdup_n_u32(0xFF)); + uint32x2_t dst_g = vand_u32(vshr_n_u32(dst, 8), vdup_n_u32(0xFF)); + uint32x2_t dst_b = vand_u32(dst, vdup_n_u32(0xFF)); + + uint32x2_t inv_mix = vsub_u32(vdup_n_u32(255), mix); + uint32x2_t blend_r = vshr_n_u32(vadd_u32(vmul_u32(src_r, mix), vmul_u32(dst_r, inv_mix)), 8); + uint32x2_t blend_g = vshr_n_u32(vadd_u32(vmul_u32(src_g, mix), vmul_u32(dst_g, inv_mix)), 8); + uint32x2_t blend_b = vshr_n_u32(vadd_u32(vmul_u32(src_b, mix), vmul_u32(dst_b, inv_mix)), 8); + + uint32x2_t blended = vorr_u32(vorr_u32(vshl_n_u32(blend_r, 16), vshl_n_u32(blend_g, 8)), blend_b); + uint32x2_t result = vbsl_u32(zero_mask, dst, blended); + return vbsl_u32(full_mask, src, result); +} +static inline uint32x4_t lv_color_24_24_mix_4_premul_internal(uint32x4_t src, uint32x4_t dst, uint32x4_t mix) +{ + uint32x4_t zero_mask = vceqq_u32(mix, vdupq_n_u32(0)); + uint32x4_t full_mask = vcgeq_u32(mix, vdupq_n_u32(LV_OPA_MAX)); + + uint32x4_t src_r = vandq_u32(vshrq_n_u32(src, 16), vdupq_n_u32(0xFF)); + uint32x4_t src_g = vandq_u32(vshrq_n_u32(src, 8), vdupq_n_u32(0xFF)); + uint32x4_t src_b = vandq_u32(src, vdupq_n_u32(0xFF)); + + uint32x4_t dst_r = vandq_u32(vshrq_n_u32(dst, 16), vdupq_n_u32(0xFF)); + uint32x4_t dst_g = vandq_u32(vshrq_n_u32(dst, 8), vdupq_n_u32(0xFF)); + uint32x4_t dst_b = vandq_u32(dst, vdupq_n_u32(0xFF)); + + uint32x4_t inv_mix = vsubq_u32(vdupq_n_u32(255), mix); + + uint32x4_t blend_r = vaddq_u32(src_r, vshrq_n_u32(vmulq_u32(inv_mix, dst_r), 8)); + uint32x4_t blend_g = vaddq_u32(src_g, vshrq_n_u32(vmulq_u32(inv_mix, dst_g), 8)); + uint32x4_t blend_b = vaddq_u32(src_b, vshrq_n_u32(vmulq_u32(inv_mix, dst_b), 8)); + + uint32x4_t blended = vorrq_u32(vorrq_u32(vshlq_n_u32(blend_r, 16), vshlq_n_u32(blend_g, 8)), blend_b); + uint32x4_t result = vbslq_u32(zero_mask, dst, blended); + return vbslq_u32(full_mask, src, result); +} + +static inline uint32x2_t lv_color_24_24_mix_2_premul_internal(uint32x2_t src, uint32x2_t dst, uint32x2_t mix) +{ + uint32x2_t zero_mask = vceq_u32(mix, vdup_n_u32(0)); + uint32x2_t full_mask = vcge_u32(mix, vdup_n_u32(LV_OPA_MAX)); + + uint32x2_t src_r = vand_u32(vshr_n_u32(src, 16), vdup_n_u32(0xFF)); + uint32x2_t src_g = vand_u32(vshr_n_u32(src, 8), vdup_n_u32(0xFF)); + uint32x2_t src_b = vand_u32(src, vdup_n_u32(0xFF)); + + uint32x2_t dst_r = vand_u32(vshr_n_u32(dst, 16), vdup_n_u32(0xFF)); + uint32x2_t dst_g = vand_u32(vshr_n_u32(dst, 8), vdup_n_u32(0xFF)); + uint32x2_t dst_b = vand_u32(dst, vdup_n_u32(0xFF)); + + uint32x2_t inv_mix = vsub_u32(vdup_n_u32(255), mix); + + uint32x2_t blend_r = vadd_u32(src_r, vshr_n_u32(vmul_u32(inv_mix, dst_r), 8)); + uint32x2_t blend_g = vadd_u32(src_g, vshr_n_u32(vmul_u32(inv_mix, dst_g), 8)); + uint32x2_t blend_b = vadd_u32(src_b, vshr_n_u32(vmul_u32(inv_mix, dst_b), 8)); + + uint32x2_t blended = vorr_u32(vorr_u32(vshl_n_u32(blend_r, 16), vshl_n_u32(blend_g, 8)), blend_b); + uint32x2_t result = vbsl_u32(zero_mask, dst, blended); + return vbsl_u32(full_mask, src, result); +} + +static inline uint32x4_t rgb565_xrgb_mix_4_internal(uint32x4_t src, uint32x4_t dst, uint32x4_t mix) +{ + uint32x4_t zero_mask = vceqq_u32(mix, vdupq_n_u32(0)); + uint32x4_t full_mask = vcgeq_u32(mix, vdupq_n_u32(LV_OPA_MAX)); + + uint32x4_t src_r = vshrq_n_u32(vmulq_u32(vshrq_n_u32(vandq_u32(src, vdupq_n_u32(0xF800)), 11), vdupq_n_u32(2106)), 8); + uint32x4_t src_g = vshrq_n_u32(vmulq_u32(vshrq_n_u32(vandq_u32(src, vdupq_n_u32(0x07E0)), 5), vdupq_n_u32(1037)), 8); + uint32x4_t src_b = vshrq_n_u32(vmulq_u32(vandq_u32(src, vdupq_n_u32(0x001F)), vdupq_n_u32(2106)), 8); + + uint32x4_t dst_r = vandq_u32(vshrq_n_u32(dst, 16), vdupq_n_u32(0xFF)); + uint32x4_t dst_g = vandq_u32(vshrq_n_u32(dst, 8), vdupq_n_u32(0xFF)); + uint32x4_t dst_b = vandq_u32(dst, vdupq_n_u32(0xFF)); + + uint32x4_t inv_mix = vsubq_u32(vdupq_n_u32(255), mix); + uint32x4_t blend_r = vshrq_n_u32(vaddq_u32(vmulq_u32(src_r, mix), vmulq_u32(dst_r, inv_mix)), 8); + uint32x4_t blend_g = vshrq_n_u32(vaddq_u32(vmulq_u32(src_g, mix), vmulq_u32(dst_g, inv_mix)), 8); + uint32x4_t blend_b = vshrq_n_u32(vaddq_u32(vmulq_u32(src_b, mix), vmulq_u32(dst_b, inv_mix)), 8); + + uint32x4_t blended = vorrq_u32(vorrq_u32(vshlq_n_u32(blend_r, 16), vshlq_n_u32(blend_g, 8)), blend_b); + uint32x4_t result = vbslq_u32(zero_mask, dst, blended); + return vbslq_u32(full_mask, src, result); +} + +static inline uint32x2_t rgb565_xrgb_mix_2_internal(uint32x2_t src, uint32x2_t dst, uint32x2_t mix) +{ + uint32x2_t zero_mask = vceq_u32(mix, vdup_n_u32(0)); + uint32x2_t full_mask = vcge_u32(mix, vdup_n_u32(LV_OPA_MAX)); + + uint32x2_t src_r = vshr_n_u32(vmul_u32(vshr_n_u32(vand_u32(src, vdup_n_u32(0xF800)), 11), vdup_n_u32(2106)), 8); + uint32x2_t src_g = vshr_n_u32(vmul_u32(vshr_n_u32(vand_u32(src, vdup_n_u32(0x07E0)), 5), vdup_n_u32(1037)), 8); + uint32x2_t src_b = vshr_n_u32(vmul_u32(vand_u32(src, vdup_n_u32(0x001F)), vdup_n_u32(2106)), 8); + + uint32x2_t dst_r = vand_u32(vshr_n_u32(dst, 16), vdup_n_u32(0xFF)); + uint32x2_t dst_g = vand_u32(vshr_n_u32(dst, 8), vdup_n_u32(0xFF)); + uint32x2_t dst_b = vand_u32(dst, vdup_n_u32(0xFF)); + + uint32x2_t inv_mix = vsub_u32(vdup_n_u32(255), mix); + uint32x2_t blend_r = vshr_n_u32(vadd_u32(vmul_u32(src_r, mix), vmul_u32(dst_r, inv_mix)), 8); + uint32x2_t blend_g = vshr_n_u32(vadd_u32(vmul_u32(src_g, mix), vmul_u32(dst_g, inv_mix)), 8); + uint32x2_t blend_b = vshr_n_u32(vadd_u32(vmul_u32(src_b, mix), vmul_u32(dst_b, inv_mix)), 8); + + uint32x2_t blended = vorr_u32(vorr_u32(vshl_n_u32(blend_r, 16), vshl_n_u32(blend_g, 8)), blend_b); + uint32x2_t result = vbsl_u32(zero_mask, dst, blended); + return vbsl_u32(full_mask, src, result); +} +#endif /* LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON*/ diff --git a/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb888.h b/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb888.h new file mode 100644 index 0000000..6002465 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/neon/lv_draw_sw_blend_neon_to_rgb888.h @@ -0,0 +1,158 @@ +/** + * @file lv_draw_sw_blend_neon_to_rgb888.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_NEON_TO_RGB888_H +#define LV_DRAW_SW_BLEND_NEON_TO_RGB888_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../../lv_conf_internal.h" +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + +#include "../../../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dest_px_size) lv_draw_sw_blend_neon_color_to_rgb888(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dest_px_size) lv_draw_sw_blend_neon_color_to_rgb888_with_opa(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dest_px_size) lv_draw_sw_blend_neon_color_to_rgb888_with_mask(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size) lv_draw_sw_blend_neon_color_to_rgb888_with_opa_mask(dsc, dest_px_size) +#endif + +#ifdef __aarch64__ /* This function uses a special intrinsic only available for arm64 */ +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size) lv_draw_sw_blend_neon_l8_to_rgb888(dsc, dest_px_size) +#endif +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size) lv_draw_sw_blend_neon_rgb565_to_rgb888(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size) lv_draw_sw_blend_neon_rgb565_to_rgb888_with_opa(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size) lv_draw_sw_blend_neon_rgb565_to_rgb888_with_mask(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size) lv_draw_sw_blend_neon_rgb565_to_rgb888_with_opa_mask(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size, src_px_size) lv_draw_sw_blend_neon_rgb888_to_rgb888(dsc, dest_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size, src_px_size) lv_draw_sw_blend_neon_rgb888_to_rgb888_with_opa(dsc, dest_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size, src_px_size) lv_draw_sw_blend_neon_rgb888_to_rgb888_with_mask(dsc, dest_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size, src_px_size) lv_draw_sw_blend_neon_rgb888_to_rgb888_with_opa_mask(dsc, dest_px_size, src_px_size) +#endif + +#if 0 /* These seem to produce worse results than sw rendering, also RGB888 is not implemented, only XRGB8888. So they are disabled for now*/ +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size) lv_draw_sw_blend_neon_argb888_to_rgb888(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size) lv_draw_sw_blend_neon_argb888_to_rgb888_with_opa(dsc, dest_px_size) + +#endif +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size) lv_draw_sw_blend_neon_argb888_to_rgb888_with_mask(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size) lv_draw_sw_blend_neon_argb888_to_rgb888_with_opa_mask(dsc, dest_px_size) +#endif +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size) lv_draw_sw_blend_neon_argb888_premultiplied_to_rgb888(dsc, dest_px_size) +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_result_t lv_draw_sw_blend_neon_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_color_to_rgb888_with_opa(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_color_to_rgb888_with_mask(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_color_to_rgb888_with_opa_mask(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dest_px_size); + +#ifdef __aarch64__ +lv_result_t lv_draw_sw_blend_neon_l8_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +#endif /*__aarch64__*/ + +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc); +lv_result_t lv_draw_sw_blend_neon_al88_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc); + +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_rgb565_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); + +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size, + uint32_t src_px_size); +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size, + uint32_t src_px_size); +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size, + uint32_t src_px_size); +lv_result_t lv_draw_sw_blend_neon_rgb888_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size, uint32_t src_px_size); +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_argb888_premultiplied_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_neon_argb888_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_NEON_TO_RGB888_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/riscv_v/lv_blend_riscv_v.h b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_blend_riscv_v.h new file mode 100644 index 0000000..eb1d3ee --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_blend_riscv_v.h @@ -0,0 +1,25 @@ +/** + * @file lv_blend_riscv_v.h + * RISC-V Vector extension blend header + */ + +#ifndef LV_BLEND_RISCV_V_H +#define LV_BLEND_RISCV_V_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../lv_draw_sw_blend.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_RISCV_V + +#include "lv_draw_sw_blend_riscv_v_to_rgb888.h" + +#endif /* LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_RISCV_V */ + +#ifdef __cplusplus +} +#endif + +#endif /* LV_BLEND_RISCV_V_H */ diff --git a/inc/lvgl/src/draw/sw/blend/riscv_v/lv_blend_riscv_v_private.h b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_blend_riscv_v_private.h new file mode 100644 index 0000000..357d4d4 --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_blend_riscv_v_private.h @@ -0,0 +1,396 @@ +/** + * @file lv_blend_riscv_v_private.h + * Common macros and utilities for RISC-V Vector Extension (RVV 1.0) blend operations + * + * This header provides reusable RVV macros for: + * - Segmented load/store operations (RGB888/XRGB8888/RGB565) + * - Alpha blending with scalar or vector alpha + * - Color format conversions (RGB565 <-> RGB888) + * - Effective alpha calculations (alpha, mask, opa combinations) + */ + +#ifndef LV_BLEND_RISCV_V_PRIVATE_H +#define LV_BLEND_RISCV_V_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../../lv_conf_internal.h" +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_RISCV_V + +/* Try to use real RVV, fall back to emulation if not available */ +#ifdef __riscv_v +#include +#else +/* No real RVV available, use emulation */ +#include "lv_blend_riscv_vector_emulation.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * RVV SEGMENTED LOAD/STORE MACROS + * + * Emulate segmented load/store using stride operations. + * Compatible with compilers that don't support RVV 1.0 tuple types. + **********************/ + +/* RGB888: 3 channels (B,G,R) with stride=3 */ +#define LV_RVV_VLSEG3E8_U8M2(base, vl, v_b, v_g, v_r) \ + do { \ + (v_b) = __riscv_vlse8_v_u8m2((base) + 0, 3, (vl)); \ + (v_g) = __riscv_vlse8_v_u8m2((base) + 1, 3, (vl)); \ + (v_r) = __riscv_vlse8_v_u8m2((base) + 2, 3, (vl)); \ + } while(0) + +#define LV_RVV_VSSEG3E8_U8M2(base, v_b, v_g, v_r, vl) \ + do { \ + __riscv_vsse8_v_u8m2((base) + 0, 3, (v_b), (vl)); \ + __riscv_vsse8_v_u8m2((base) + 1, 3, (v_g), (vl)); \ + __riscv_vsse8_v_u8m2((base) + 2, 3, (v_r), (vl)); \ + } while(0) + +/* XRGB8888/ARGB8888: 4 channels (B,G,R,X) with stride=4 */ +#define LV_RVV_VLSEG4E8_U8M2(base, vl, v_b, v_g, v_r, v_x) \ + do { \ + (v_b) = __riscv_vlse8_v_u8m2((base) + 0, 4, (vl)); \ + (v_g) = __riscv_vlse8_v_u8m2((base) + 1, 4, (vl)); \ + (v_r) = __riscv_vlse8_v_u8m2((base) + 2, 4, (vl)); \ + (v_x) = __riscv_vlse8_v_u8m2((base) + 3, 4, (vl)); \ + } while(0) + +#define LV_RVV_VSSEG4E8_U8M2(base, v_b, v_g, v_r, v_x, vl) \ + do { \ + __riscv_vsse8_v_u8m2((base) + 0, 4, (v_b), (vl)); \ + __riscv_vsse8_v_u8m2((base) + 1, 4, (v_g), (vl)); \ + __riscv_vsse8_v_u8m2((base) + 2, 4, (v_r), (vl)); \ + __riscv_vsse8_v_u8m2((base) + 3, 4, (v_x), (vl)); \ + } while(0) + +/********************** + * RGB565 <-> RGB888 CONVERSION MACROS + * + * RGB565 format: RRRRRGGGGGGBBBBB (5-6-5 bits) + * Conversion formulas: + * R8 = (R5 * 2106) >> 8 (2106 ≈ 255/31 * 256) + * G8 = (G6 * 1037) >> 8 (1037 ≈ 255/63 * 256) + * B8 = (B5 * 2106) >> 8 + **********************/ + +/* Extract and convert RGB565 to separate R8, G8, B8 channels (16-bit width) */ +#define LV_RVV_RGB565_TO_RGB888_U16M2(v_rgb565, v_r8, v_g8, v_b8, vl) \ + do { \ + vuint16m2_t _r5 = __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2((v_rgb565), 11, (vl)), 0x1F, (vl)); \ + vuint16m2_t _g6 = __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2((v_rgb565), 5, (vl)), 0x3F, (vl)); \ + vuint16m2_t _b5 = __riscv_vand_vx_u16m2((v_rgb565), 0x1F, (vl)); \ + (v_r8) = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(_r5, 2106, (vl)), 8, (vl)); \ + (v_g8) = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(_g6, 1037, (vl)), 8, (vl)); \ + (v_b8) = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(_b5, 2106, (vl)), 8, (vl)); \ + } while(0) + +/* Convert R8, G8, B8 to RGB565 (16-bit) */ +#define LV_RVV_RGB888_TO_RGB565_U16M2(v_r8, v_g8, v_b8, v_rgb565, vl) \ + do { \ + vuint16m2_t _r5 = __riscv_vsrl_vx_u16m2((v_r8), 3, (vl)); \ + vuint16m2_t _g6 = __riscv_vsrl_vx_u16m2((v_g8), 2, (vl)); \ + vuint16m2_t _b5 = __riscv_vsrl_vx_u16m2((v_b8), 3, (vl)); \ + (v_rgb565) = __riscv_vor_vv_u16m2(__riscv_vsll_vx_u16m2(_r5, 11, (vl)), \ + __riscv_vor_vv_u16m2(__riscv_vsll_vx_u16m2(_g6, 5, (vl)), _b5, (vl)), (vl)); \ + } while(0) + +/********************** + * ALPHA BLENDING MACROS + * + * Standard blend formula: result = (src * alpha + dst * (255 - alpha)) >> 8 + * + * Using vwmaccu (widening multiply-accumulate unsigned): + * tmp = dst * (255 - alpha) // Initialize with dst contribution + * tmp = tmp + src * alpha // vwmaccu adds src contribution + * result = tmp >> 8 + * + * This reduces operations by combining multiply and add. + **********************/ + +/** + * Blend single channel using vwmaccu (8-bit src/dst -> 16-bit intermediate) + * LMUL relationship: m1 -> m2, m2 -> m4 + */ +#define LV_RVV_BLEND_CHANNEL_U8M1_TO_U16M2(v_src, v_dst, alpha, v_result, vl) \ + do { \ + uint8_t _alpha_inv = 255 - (alpha); \ + vuint16m2_t _tmp = __riscv_vwmulu_vx_u16m2((v_dst), _alpha_inv, (vl)); \ + _tmp = __riscv_vwmaccu_vx_u16m2(_tmp, (alpha), (v_src), (vl)); \ + (v_result) = __riscv_vnsrl_wx_u8m1(_tmp, 8, (vl)); \ + } while(0) + +#define LV_RVV_BLEND_CHANNEL_U8M2_TO_U16M4(v_src, v_dst, alpha, v_result, vl) \ + do { \ + uint8_t _alpha_inv = 255 - (alpha); \ + vuint16m4_t _tmp = __riscv_vwmulu_vx_u16m4((v_dst), _alpha_inv, (vl)); \ + _tmp = __riscv_vwmaccu_vx_u16m4(_tmp, (alpha), (v_src), (vl)); \ + (v_result) = __riscv_vnsrl_wx_u8m2(_tmp, 8, (vl)); \ + } while(0) + +/** + * Blend single channel with vector alpha (per-pixel mask) + */ +#define LV_RVV_BLEND_CHANNEL_VMASK_U8M1_TO_U16M2(v_src, v_dst, v_alpha, v_result, vl) \ + do { \ + vuint8m1_t _v_alpha_inv = __riscv_vrsub_vx_u8m1((v_alpha), 255, (vl)); \ + vuint16m2_t _tmp = __riscv_vwmulu_vv_u16m2((v_dst), _v_alpha_inv, (vl)); \ + _tmp = __riscv_vwmaccu_vv_u16m2(_tmp, (v_alpha), (v_src), (vl)); \ + (v_result) = __riscv_vnsrl_wx_u8m1(_tmp, 8, (vl)); \ + } while(0) + +#define LV_RVV_BLEND_CHANNEL_VMASK_U8M2_TO_U16M4(v_src, v_dst, v_alpha, v_result, vl) \ + do { \ + vuint8m2_t _v_alpha_inv = __riscv_vrsub_vx_u8m2((v_alpha), 255, (vl)); \ + vuint16m4_t _tmp = __riscv_vwmulu_vv_u16m4((v_dst), _v_alpha_inv, (vl)); \ + _tmp = __riscv_vwmaccu_vv_u16m4(_tmp, (v_alpha), (v_src), (vl)); \ + (v_result) = __riscv_vnsrl_wx_u8m2(_tmp, 8, (vl)); \ + } while(0) + +/** + * Blend RGB channels with scalar alpha (all 3 channels at once) + * Uses m1->m2 widening + */ +#define LV_RVV_BLEND_RGB_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, \ + alpha, v_out_r, v_out_g, v_out_b, vl) \ +do { \ + LV_RVV_BLEND_CHANNEL_U8M1_TO_U16M2((v_src_r), (v_dst_r), (alpha), (v_out_r), (vl)); \ + LV_RVV_BLEND_CHANNEL_U8M1_TO_U16M2((v_src_g), (v_dst_g), (alpha), (v_out_g), (vl)); \ + LV_RVV_BLEND_CHANNEL_U8M1_TO_U16M2((v_src_b), (v_dst_b), (alpha), (v_out_b), (vl)); \ +} while(0) + +/** + * Blend RGB channels with scalar alpha (all 3 channels at once) + * Uses m2->m4 widening + */ +#define LV_RVV_BLEND_RGB_U8M2(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, \ + alpha, v_out_r, v_out_g, v_out_b, vl) \ +do { \ + LV_RVV_BLEND_CHANNEL_U8M2_TO_U16M4((v_src_r), (v_dst_r), (alpha), (v_out_r), (vl)); \ + LV_RVV_BLEND_CHANNEL_U8M2_TO_U16M4((v_src_g), (v_dst_g), (alpha), (v_out_g), (vl)); \ + LV_RVV_BLEND_CHANNEL_U8M2_TO_U16M4((v_src_b), (v_dst_b), (alpha), (v_out_b), (vl)); \ +} while(0) + +/** + * Blend solid color (pre-multiplied) with destination RGB channels + * fg_color_opa: pre-computed (color * opa) for each channel + * opa_inv: 255 - opa + * Formula: result = (dst * opa_inv + fg_color_opa) >> 8 + * Uses m2->m4 widening + */ +#define LV_RVV_BLEND_SOLID_RGB_U8M2(v_dst_r, v_dst_g, v_dst_b, \ + fg_r_opa, fg_g_opa, fg_b_opa, opa_inv, \ + v_out_r, v_out_g, v_out_b, vl) \ +do { \ + vuint16m4_t _v_r16 = __riscv_vwmulu_vx_u16m4((v_dst_r), (opa_inv), (vl)); \ + vuint16m4_t _v_g16 = __riscv_vwmulu_vx_u16m4((v_dst_g), (opa_inv), (vl)); \ + vuint16m4_t _v_b16 = __riscv_vwmulu_vx_u16m4((v_dst_b), (opa_inv), (vl)); \ + _v_r16 = __riscv_vadd_vx_u16m4(_v_r16, (fg_r_opa), (vl)); \ + _v_g16 = __riscv_vadd_vx_u16m4(_v_g16, (fg_g_opa), (vl)); \ + _v_b16 = __riscv_vadd_vx_u16m4(_v_b16, (fg_b_opa), (vl)); \ + (v_out_r) = __riscv_vnsrl_wx_u8m2(_v_r16, 8, (vl)); \ + (v_out_g) = __riscv_vnsrl_wx_u8m2(_v_g16, 8, (vl)); \ + (v_out_b) = __riscv_vnsrl_wx_u8m2(_v_b16, 8, (vl)); \ +} while(0) + +/** + * Blend solid color (scalar) with destination RGB channels using vector alpha mask + * fg_r/g/b: foreground color scalar values + * v_alpha: per-pixel alpha values (vuint8m2_t) + * Formula: result = (fg * alpha + dst * (255 - alpha)) >> 8 + * Uses m2->m4 widening with vwmaccu for efficiency + */ +#define LV_RVV_BLEND_SOLID_RGB_VMASK_U8M2(v_dst_r, v_dst_g, v_dst_b, \ + fg_r, fg_g, fg_b, v_alpha, \ + v_out_r, v_out_g, v_out_b, vl) \ +do { \ + vuint8m2_t _v_alpha_inv = __riscv_vrsub_vx_u8m2((v_alpha), 255, (vl)); \ + vuint16m4_t _v_r16 = __riscv_vwmulu_vv_u16m4((v_dst_r), _v_alpha_inv, (vl)); \ + vuint16m4_t _v_g16 = __riscv_vwmulu_vv_u16m4((v_dst_g), _v_alpha_inv, (vl)); \ + vuint16m4_t _v_b16 = __riscv_vwmulu_vv_u16m4((v_dst_b), _v_alpha_inv, (vl)); \ + _v_r16 = __riscv_vwmaccu_vx_u16m4(_v_r16, (fg_r), (v_alpha), (vl)); \ + _v_g16 = __riscv_vwmaccu_vx_u16m4(_v_g16, (fg_g), (v_alpha), (vl)); \ + _v_b16 = __riscv_vwmaccu_vx_u16m4(_v_b16, (fg_b), (v_alpha), (vl)); \ + (v_out_r) = __riscv_vnsrl_wx_u8m2(_v_r16, 8, (vl)); \ + (v_out_g) = __riscv_vnsrl_wx_u8m2(_v_g16, 8, (vl)); \ + (v_out_b) = __riscv_vnsrl_wx_u8m2(_v_b16, 8, (vl)); \ +} while(0) + +/** + * Blend RGB channels with vector alpha (per-pixel mask) + */ +#define LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, \ + v_alpha, v_out_r, v_out_g, v_out_b, vl) \ +do { \ + LV_RVV_BLEND_CHANNEL_VMASK_U8M1_TO_U16M2((v_src_r), (v_dst_r), (v_alpha), (v_out_r), (vl)); \ + LV_RVV_BLEND_CHANNEL_VMASK_U8M1_TO_U16M2((v_src_g), (v_dst_g), (v_alpha), (v_out_g), (vl)); \ + LV_RVV_BLEND_CHANNEL_VMASK_U8M1_TO_U16M2((v_src_b), (v_dst_b), (v_alpha), (v_out_b), (vl)); \ +} while(0) + +/** + * Optimize blend results for zero and full mask cases (u8m1) + * When mask is 0, use destination; when mask is >= 255, use source + */ +#define LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, v_src_r, v_src_g, v_src_b, \ + v_dst_r, v_dst_g, v_dst_b, v_mask, vl) \ +do { \ + vbool8_t _zero_mask = __riscv_vmseq_vx_u8m1_b8((v_mask), 0, (vl)); \ + vbool8_t _full_mask = __riscv_vmsgeu_vx_u8m1_b8((v_mask), LV_OPA_MAX, (vl)); \ + (v_b) = __riscv_vmerge_vvm_u8m1((v_b), (v_dst_b), _zero_mask, (vl)); \ + (v_g) = __riscv_vmerge_vvm_u8m1((v_g), (v_dst_g), _zero_mask, (vl)); \ + (v_r) = __riscv_vmerge_vvm_u8m1((v_r), (v_dst_r), _zero_mask, (vl)); \ + (v_b) = __riscv_vmerge_vvm_u8m1((v_b), (v_src_b), _full_mask, (vl)); \ + (v_g) = __riscv_vmerge_vvm_u8m1((v_g), (v_src_g), _full_mask, (vl)); \ + (v_r) = __riscv_vmerge_vvm_u8m1((v_r), (v_src_r), _full_mask, (vl)); \ +} while(0) + +/** + * Optimize blend results for zero and full mask cases (u8m2) with scalar source + * When mask is 0, use destination; when mask is >= 255, use scalar source + */ +#define LV_RVV_BLEND_OPTIMIZE_MASK_SCALAR_U8M2(v_r, v_g, v_b, src_r, src_g, src_b, \ + v_dst_r, v_dst_g, v_dst_b, v_mask, vl) \ +do { \ + vbool4_t _zero_mask = __riscv_vmseq_vx_u8m2_b4((v_mask), 0, (vl)); \ + vbool4_t _full_mask = __riscv_vmsgeu_vx_u8m2_b4((v_mask), LV_OPA_MAX, (vl)); \ + (v_b) = __riscv_vmerge_vvm_u8m2((v_b), (v_dst_b), _zero_mask, (vl)); \ + (v_g) = __riscv_vmerge_vvm_u8m2((v_g), (v_dst_g), _zero_mask, (vl)); \ + (v_r) = __riscv_vmerge_vvm_u8m2((v_r), (v_dst_r), _zero_mask, (vl)); \ + (v_b) = __riscv_vmerge_vxm_u8m2((v_b), (src_b), _full_mask, (vl)); \ + (v_g) = __riscv_vmerge_vxm_u8m2((v_g), (src_g), _full_mask, (vl)); \ + (v_r) = __riscv_vmerge_vxm_u8m2((v_r), (src_r), _full_mask, (vl)); \ +} while(0) + +/********************** + * EFFECTIVE ALPHA CALCULATION MACROS + * + * These macros compute the effective alpha from combinations of: + * - v_alpha: source alpha channel (per-pixel) + * - mask: mask value (per-pixel) + * - opa: global opacity (scalar) + * + * Formula: eff_alpha = (alpha * mask * opa) >> 16 + * Intermediate calculations use 16-bit to prevent overflow. + **********************/ + +/** + * Calculate effective alpha from source alpha and global opa + */ +#define LV_RVV_CALC_EFF_ALPHA_OPA_U8M1(v_src_a, opa, v_eff_a, vl) \ + do { \ + vuint16m2_t _v_alpha16 = __riscv_vzext_vf2_u16m2((v_src_a), (vl)); \ + vuint16m2_t _v_eff16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(_v_alpha16, (opa), (vl)), 8, (vl)); \ + (v_eff_a) = __riscv_vnsrl_wx_u8m1(_v_eff16, 0, (vl)); \ + } while(0) + +/** + * Calculate effective alpha from source alpha and mask + */ +#define LV_RVV_CALC_EFF_ALPHA_MASK_U8M1(v_src_a, v_mask, v_eff_a, vl) \ + do { \ + vuint16m2_t _v_alpha16 = __riscv_vzext_vf2_u16m2((v_src_a), (vl)); \ + vuint16m2_t _v_mask16 = __riscv_vzext_vf2_u16m2((v_mask), (vl)); \ + vuint16m2_t _v_eff16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vv_u16m2(_v_alpha16, _v_mask16, (vl)), 8, (vl)); \ + (v_eff_a) = __riscv_vnsrl_wx_u8m1(_v_eff16, 0, (vl)); \ + } while(0) + +/** + * Calculate effective alpha from source alpha, mask, and global opa + * Formula: eff_alpha = (alpha * mask * opa) >> 16 + * Widen to u32m4 to avoid precision loss from double shift + */ +#define LV_RVV_CALC_EFF_ALPHA_MASK_OPA_U8M1(v_src_a, v_mask, opa, v_eff_a, vl) \ + do { \ + vuint16m2_t _v_alpha16 = __riscv_vzext_vf2_u16m2((v_src_a), (vl)); \ + vuint16m2_t _v_mask16 = __riscv_vzext_vf2_u16m2((v_mask), (vl)); \ + vuint16m2_t _v_prod16 = __riscv_vmul_vv_u16m2(_v_alpha16, _v_mask16, (vl)); \ + vuint32m4_t _v_prod32 = __riscv_vwmulu_vx_u32m4(_v_prod16, (opa), (vl)); \ + vuint16m2_t _v_eff16 = __riscv_vnsrl_wx_u16m2(_v_prod32, 16, (vl)); \ + (v_eff_a) = __riscv_vnsrl_wx_u8m1(_v_eff16, 0, (vl)); \ + } while(0) + +/********************** + * RGB/ARGB CHANNEL LOAD/STORE MACROS (for ARGB8888/RGB888/XRGB8888) + * + * Load/Store RGB channels to/from memory in different formats using m1 LMUL. + **********************/ + +#define LV_RVV_LOAD_ARGB8888_U8M1(ptr, x, v_b, v_g, v_r, v_a, vl) \ + do { \ + (v_b) = __riscv_vlse8_v_u8m1((ptr) + (x) * 4 + 0, 4, (vl)); \ + (v_g) = __riscv_vlse8_v_u8m1((ptr) + (x) * 4 + 1, 4, (vl)); \ + (v_r) = __riscv_vlse8_v_u8m1((ptr) + (x) * 4 + 2, 4, (vl)); \ + (v_a) = __riscv_vlse8_v_u8m1((ptr) + (x) * 4 + 3, 4, (vl)); \ + } while(0) + +#define LV_RVV_LOAD_RGB888_U8M1(ptr, x, v_b, v_g, v_r, vl) \ + do { \ + (v_b) = __riscv_vlse8_v_u8m1((ptr) + (x) * 3 + 0, 3, (vl)); \ + (v_g) = __riscv_vlse8_v_u8m1((ptr) + (x) * 3 + 1, 3, (vl)); \ + (v_r) = __riscv_vlse8_v_u8m1((ptr) + (x) * 3 + 2, 3, (vl)); \ + } while(0) + +#define LV_RVV_LOAD_XRGB8888_U8M1(ptr, x, v_b, v_g, v_r, vl) \ + do { \ + (v_b) = __riscv_vlse8_v_u8m1((ptr) + (x) * 4 + 0, 4, (vl)); \ + (v_g) = __riscv_vlse8_v_u8m1((ptr) + (x) * 4 + 1, 4, (vl)); \ + (v_r) = __riscv_vlse8_v_u8m1((ptr) + (x) * 4 + 2, 4, (vl)); \ + } while(0) + +#define LV_RVV_STORE_RGB888_U8M1(ptr, x, v_b, v_g, v_r, vl) \ + do { \ + __riscv_vsse8_v_u8m1((ptr) + (x) * 3 + 0, 3, (v_b), (vl)); \ + __riscv_vsse8_v_u8m1((ptr) + (x) * 3 + 1, 3, (v_g), (vl)); \ + __riscv_vsse8_v_u8m1((ptr) + (x) * 3 + 2, 3, (v_r), (vl)); \ + } while(0) + +#define LV_RVV_STORE_XRGB8888_U8M1(ptr, x, v_b, v_g, v_r, v_a, vl) \ + do { \ + __riscv_vsse8_v_u8m1((ptr) + (x) * 4 + 0, 4, (v_b), (vl)); \ + __riscv_vsse8_v_u8m1((ptr) + (x) * 4 + 1, 4, (v_g), (vl)); \ + __riscv_vsse8_v_u8m1((ptr) + (x) * 4 + 2, 4, (v_r), (vl)); \ + __riscv_vsse8_v_u8m1((ptr) + (x) * 4 + 3, 4, (v_a), (vl)); \ + } while(0) + +/********************** + * MACROS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BLEND_RISCV_V_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/sw/blend/riscv_v/lv_blend_riscv_vector_emulation.h b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_blend_riscv_vector_emulation.h new file mode 100644 index 0000000..3ed621f --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_blend_riscv_vector_emulation.h @@ -0,0 +1,921 @@ +/** + * @file lv_blend_riscv_vector_emulation.h + * Software emulation of RISC-V Vector Extension (RVV 1.0) intrinsics + * + * This header provides pure C implementations of RVV intrinsics to enable + * testing and verification on non-RVV platforms. The implementations follow + * the RVV specification as documented in: + * https://dzaima.github.io/intrinsics-viewer/ + * + * Usage: + * 1. On systems without RVV support, include this header BEFORE + * 2. Or define RISCV_VECTOR_EMULATION before including actual + * 3. All __riscv_* functions will be emulated in software + * + * Limitations: + * - No performance optimization (this is software emulation) + * - Vector length (vl) is tracked but all operations work on single elements in a loop + * - Predication and masking are simplified but functionally correct + * - LMUL < 1 (fractional multipliers) are not supported + */ + +#ifndef LV_BLEND_RISCV_VECTOR_EMULATION_H +#define LV_BLEND_RISCV_VECTOR_EMULATION_H + +#ifdef __cplusplus +extern "C" { +#endif +#include "../../../../lv_conf_internal.h" +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_RISCV_V + +#include +#include +#include + +/* ============================================================================ + * Vector Type Definitions + * ============================================================================ + * + * For emulation, we use structs that hold data and the current vector length. + * Real RVV is much more sophisticated, but this allows us to verify logic. + * + * Assumption: VLEN = 128 bits (a common RVV configuration) + * - e8m1: 128 bits / 8 bits = 16 elements + * - e8m2: 256 bits / 8 bits = 32 elements + * - e8m4: 512 bits / 8 bits = 64 elements + * - e16m1: 128 bits / 16 bits = 8 elements + * - e16m2: 256 bits / 16 bits = 16 elements + * - e16m4: 512 bits / 16 bits = 32 elements + * - e32m1: 128 bits / 32 bits = 4 elements + * - e32m2: 256 bits / 32 bits = 8 elements + * - e32m4: 512 bits / 32 bits = 16 elements + */ + +/* LMUL = 1 (1 vector register, VLEN=128 bits) */ +typedef struct { + uint8_t data[16]; /* 128 bits / 8 bits per element = 16 elements */ + size_t vl; /* Current vector length */ +} vuint8m1_t; + +typedef struct { + uint16_t data[8]; /* 128 bits / 16 bits per element = 8 elements */ + size_t vl; +} vuint16m1_t; + +typedef struct { + uint32_t data[4]; /* 128 bits / 32 bits per element = 4 elements */ + size_t vl; +} vuint32m1_t; + +typedef struct { + uint64_t data[2]; /* 128 bits / 64 bits per element = 2 elements */ + size_t vl; +} vuint64m1_t; + +/* LMUL = 2 (2 vector registers, total 256 bits) */ +typedef struct { + uint8_t data[32]; /* 256 bits / 8 bits per element = 32 elements */ + size_t vl; +} vuint8m2_t; + +typedef struct { + uint16_t data[16]; /* 256 bits / 16 bits per element = 16 elements */ + size_t vl; +} vuint16m2_t; + +typedef struct { + uint32_t data[8]; /* 256 bits / 32 bits per element = 8 elements */ + size_t vl; +} vuint32m2_t; + +typedef struct { + uint64_t data[4]; /* 256 bits / 64 bits per element = 4 elements */ + size_t vl; +} vuint64m2_t; + +/* LMUL = 4 (4 vector registers, total 512 bits) */ +typedef struct { + uint32_t data[16]; /* 512 bits / 32 bits per element = 16 elements */ + size_t vl; +} vuint32m4_t; + +typedef struct { + uint16_t data[32]; /* 512 bits / 16 bits per element = 32 elements */ + size_t vl; +} vuint16m4_t; + +/* LMUL = 8 (8 vector registers, total 1024 bits) */ +typedef struct { + uint8_t data[128]; /* 1024 bits / 8 bits per element = 128 elements */ + size_t vl; +} vuint8m8_t; + +/* Boolean/mask types (vbool4 means SEW/LMUL=4, for e8m2 -> 8/2=4) */ +typedef struct { + uint8_t data[32]; /* Same size as the vector it masks (e8m2 = 32 elements) */ + size_t vl; +} vbool4_t; + +typedef struct { + uint8_t data[16]; /* Mask for e8m1 (16 elements) */ + size_t vl; +} vbool8_t; + +/* ============================================================================ + * Vector Length Management + * ============================================================================ + * + * Operations: + * - __riscv_vsetvl_* : Set vector length for given element type and LMUL + * - __riscv_vsetvlmax_* : Get maximum vector length + */ + +/** + * Get maximum vector length for given element type and LMUL + * Based on VLEN=128 bits + */ +static inline size_t __riscv_vsetvlmax_e8m1(void) +{ + return 16; /* 128/8 = 16 */ +} +static inline size_t __riscv_vsetvlmax_e8m2(void) +{ + return 32; /* 256/8 = 32 */ +} +static inline size_t __riscv_vsetvlmax_e8m4(void) +{ + return 64; /* 512/8 = 64 */ +} + +static inline size_t __riscv_vsetvlmax_e16m1(void) +{ + return 8; /* 128/16 = 8 */ +} +static inline size_t __riscv_vsetvlmax_e16m2(void) +{ + return 16; /* 256/16 = 16 */ +} +static inline size_t __riscv_vsetvlmax_e16m4(void) +{ + return 32; /* 512/16 = 32 */ +} + +static inline size_t __riscv_vsetvlmax_e32m1(void) +{ + return 4; /* 128/32 = 4 */ +} +static inline size_t __riscv_vsetvlmax_e32m2(void) +{ + return 8; /* 256/32 = 8 */ +} +static inline size_t __riscv_vsetvlmax_e32m4(void) +{ + return 16; /* 512/32 = 16 */ +} + +static inline size_t __riscv_vsetvlmax_e8m8(void) +{ + return 128; /* 1024/8 = 128 */ +} + +static inline size_t __riscv_vsetvlmax_e64m1(void) +{ + return 2; /* 128/64 = 2 */ +} +static inline size_t __riscv_vsetvlmax_e64m2(void) +{ + return 4; /* 256/64 = 4 */ +} +static inline size_t __riscv_vsetvlmax_e64m4(void) +{ + return 8; /* 512/64 = 8 */ +} + +/** + * Set vector length to requested value (or max if requested > max) + */ +static inline size_t __riscv_vsetvl_e8m1(size_t avl) +{ + return avl > 16 ? 16 : avl; +} + +static inline size_t __riscv_vsetvl_e8m2(size_t avl) +{ + return avl > 32 ? 32 : avl; +} + +static inline size_t __riscv_vsetvl_e8m4(size_t avl) +{ + return avl > 64 ? 64 : avl; +} + +static inline size_t __riscv_vsetvl_e16m1(size_t avl) +{ + return avl > 8 ? 8 : avl; +} + +static inline size_t __riscv_vsetvl_e16m2(size_t avl) +{ + return avl > 16 ? 16 : avl; +} + +static inline size_t __riscv_vsetvl_e16m4(size_t avl) +{ + return avl > 32 ? 32 : avl; +} + +static inline size_t __riscv_vsetvl_e32m1(size_t avl) +{ + return avl > 4 ? 4 : avl; +} + +static inline size_t __riscv_vsetvl_e32m2(size_t avl) +{ + return avl > 8 ? 8 : avl; +} + +static inline size_t __riscv_vsetvl_e32m4(size_t avl) +{ + return avl > 16 ? 16 : avl; +} + +static inline size_t __riscv_vsetvl_e8m8(size_t avl) +{ + return avl > 128 ? 128 : avl; +} + +/* ============================================================================ + * Vector Initialize Operations (vmv.v.x - broadcast) + * ============================================================================ + */ + +/** + * vmv.v.x: Broadcast scalar to all vector elements + */ +static inline vuint8m1_t __riscv_vmv_v_x_u8m1(uint8_t src, size_t vl) +{ + vuint8m1_t res; + res.vl = vl > 16 ? 16 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = src; + } + return res; +} + +static inline vuint8m2_t __riscv_vmv_v_x_u8m2(uint8_t src, size_t vl) +{ + vuint8m2_t res; + res.vl = vl > 32 ? 32 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = src; + } + return res; +} + +static inline vuint16m2_t __riscv_vmv_v_x_u16m2(uint16_t src, size_t vl) +{ + vuint16m2_t res; + res.vl = vl > 16 ? 16 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = src; + } + return res; +} + +static inline vuint16m4_t __riscv_vmv_v_x_u16m4(uint16_t src, size_t vl) +{ + vuint16m4_t res; + res.vl = vl > 32 ? 32 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = src; + } + return res; +} + +static inline vuint32m4_t __riscv_vmv_v_x_u32m4(uint32_t src, size_t vl) +{ + vuint32m4_t res; + res.vl = vl > 16 ? 16 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = src; + } + return res; +} + +/* ============================================================================ + * Vector Load Operations (vle, vlse) + * ============================================================================ + */ + +/** + * vle8: Load vector of 8-bit elements with unit stride + */ +static inline vuint8m1_t __riscv_vle8_v_u8m1(const uint8_t * base, size_t vl) +{ + vuint8m1_t res; + res.vl = vl > 16 ? 16 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = base[i]; + } + return res; +} + +static inline vuint8m2_t __riscv_vle8_v_u8m2(const uint8_t * base, size_t vl) +{ + vuint8m2_t res; + res.vl = vl > 32 ? 32 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = base[i]; + } + return res; +} + +static inline vuint8m8_t __riscv_vle8_v_u8m8(const uint8_t * base, size_t vl) +{ + vuint8m8_t res; + res.vl = vl > 128 ? 128 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = base[i]; + } + return res; +} + +/** + * vlse8: Load vector with stride + * Load from address base + i * stride for each element i + */ +static inline vuint8m2_t __riscv_vlse8_v_u8m2(const uint8_t * base, ptrdiff_t stride, size_t vl) +{ + vuint8m2_t res; + res.vl = vl > 32 ? 32 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = *(const uint8_t *)((const char *)base + i * stride); + } + return res; +} + +static inline vuint8m1_t __riscv_vlse8_v_u8m1(const uint8_t * base, ptrdiff_t stride, size_t vl) +{ + vuint8m1_t res; + res.vl = vl > 16 ? 16 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = *(const uint8_t *)((const char *)base + i * stride); + } + return res; +} + +/** + * vle16: Load 16-bit vector + */ +static inline vuint16m2_t __riscv_vle16_v_u16m2(const uint16_t * base, size_t vl) +{ + vuint16m2_t res; + res.vl = vl > 16 ? 16 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = base[i]; + } + return res; +} + +/** + * vlse16: Load 16-bit vector with stride + */ +static inline vuint16m2_t __riscv_vlse16_v_u16m2(const uint16_t * base, ptrdiff_t stride, size_t vl) +{ + vuint16m2_t res; + res.vl = vl > 16 ? 16 : vl; + for(size_t i = 0; i < res.vl; i++) { + res.data[i] = *(const uint16_t *)((const char *)base + i * stride); + } + return res; +} + +/* ============================================================================ + * Vector Store Operations (vse, vsse) + * ============================================================================ + */ + +/** + * vse8: Store vector of 8-bit elements with unit stride + */ +static inline void __riscv_vse8_v_u8m1(uint8_t * base, vuint8m1_t v, size_t vl) +{ + for(size_t i = 0; i < v.vl && i < vl; i++) { + base[i] = v.data[i]; + } +} + +static inline void __riscv_vse8_v_u8m2(uint8_t * base, vuint8m2_t v, size_t vl) +{ + for(size_t i = 0; i < v.vl && i < vl; i++) { + base[i] = v.data[i]; + } +} + +static inline void __riscv_vse8_v_u8m8(uint8_t * base, vuint8m8_t v, size_t vl) +{ + for(size_t i = 0; i < v.vl && i < vl; i++) { + base[i] = v.data[i]; + } +} + +/** + * vsse8: Store vector with stride + * Store to address base + i * stride for each element i + */ +static inline void __riscv_vsse8_v_u8m2(uint8_t * base, ptrdiff_t stride, vuint8m2_t v, size_t vl) +{ + for(size_t i = 0; i < v.vl && i < vl; i++) { + *(uint8_t *)((char *)base + i * stride) = v.data[i]; + } +} + +static inline void __riscv_vsse8_v_u8m1(uint8_t * base, ptrdiff_t stride, vuint8m1_t v, size_t vl) +{ + for(size_t i = 0; i < v.vl && i < vl; i++) { + *(uint8_t *)((char *)base + i * stride) = v.data[i]; + } +} + +/** + * vse16: Store 16-bit vector + */ +static inline void __riscv_vse16_v_u16m2(uint16_t * base, vuint16m2_t v, size_t vl) +{ + for(size_t i = 0; i < v.vl && i < vl; i++) { + base[i] = v.data[i]; + } +} + +static inline void __riscv_vse16_v_u16m4(uint16_t * base, vuint16m4_t v, size_t vl) +{ + for(size_t i = 0; i < v.vl && i < vl; i++) { + base[i] = v.data[i]; + } +} + +/** + * vsse16: Store 16-bit vector with stride + */ +static inline void __riscv_vsse16_v_u16m2(uint16_t * base, ptrdiff_t stride, vuint16m2_t v, size_t vl) +{ + for(size_t i = 0; i < v.vl && i < vl; i++) { + *(uint16_t *)((char *)base + i * stride) = v.data[i]; + } +} + +/** + * vse32: Store 32-bit vector + */ +static inline void __riscv_vse32_v_u32m4(uint32_t * base, vuint32m4_t v, size_t vl) +{ + for(size_t i = 0; i < v.vl && i < vl; i++) { + base[i] = v.data[i]; + } +} + +/* ============================================================================ + * Vector Arithmetic Operations + * ============================================================================ + */ + +/** + * vmul: Vector multiply (scalar * vector) + */ +static inline vuint16m2_t __riscv_vmul_vx_u16m2(vuint16m2_t v, uint16_t x, size_t vl) +{ + vuint16m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = v.data[i] * x; + } + return res; +} + +static inline vuint16m2_t __riscv_vmul_vv_u16m2(vuint16m2_t v1, vuint16m2_t v2, size_t vl) +{ + vuint16m2_t res; + res.vl = v1.vl; + for(size_t i = 0; i < v1.vl && i < vl; i++) { + res.data[i] = v1.data[i] * v2.data[i]; + } + return res; +} + +/** + * vwmulu: Vector widening multiply unsigned (scalar * vector, 8-bit -> 16-bit) + */ +static inline vuint16m4_t __riscv_vwmulu_vx_u16m4(vuint8m2_t v, uint8_t x, size_t vl) +{ + vuint16m4_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (uint16_t)v.data[i] * (uint16_t)x; + } + return res; +} + +static inline vuint16m2_t __riscv_vwmulu_vx_u16m2(vuint8m1_t v, uint8_t x, size_t vl) +{ + vuint16m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (uint16_t)v.data[i] * (uint16_t)x; + } + return res; +} + +static inline vuint16m2_t __riscv_vwmulu_vv_u16m2(vuint8m1_t v1, vuint8m1_t v2, size_t vl) +{ + vuint16m2_t res; + res.vl = v1.vl; + for(size_t i = 0; i < v1.vl && i < vl; i++) { + res.data[i] = (uint16_t)v1.data[i] * (uint16_t)v2.data[i]; + } + return res; +} + +static inline vuint16m4_t __riscv_vwmulu_vv_u16m4(vuint8m2_t v1, vuint8m2_t v2, size_t vl) +{ + vuint16m4_t res; + res.vl = v1.vl; + for(size_t i = 0; i < v1.vl && i < vl; i++) { + res.data[i] = (uint16_t)v1.data[i] * (uint16_t)v2.data[i]; + } + return res; +} + +static inline vuint16m2_t __riscv_vwmaccu_vx_u16m2(vuint16m2_t acc, uint8_t x, vuint8m1_t v, size_t vl) +{ + vuint16m2_t res = acc; + for(size_t i = 0; i < acc.vl && i < vl; i++) { + res.data[i] += (uint16_t)x * (uint16_t)v.data[i]; + } + return res; +} + +static inline vuint16m4_t __riscv_vwmaccu_vx_u16m4(vuint16m4_t acc, uint8_t x, vuint8m2_t v, size_t vl) +{ + vuint16m4_t res = acc; + for(size_t i = 0; i < acc.vl && i < vl; i++) { + res.data[i] += (uint16_t)x * (uint16_t)v.data[i]; + } + return res; +} + +static inline vuint16m2_t __riscv_vwmaccu_vv_u16m2(vuint16m2_t acc, vuint8m1_t v1, vuint8m1_t v2, size_t vl) +{ + vuint16m2_t res = acc; + for(size_t i = 0; i < acc.vl && i < vl; i++) { + res.data[i] += (uint16_t)v1.data[i] * (uint16_t)v2.data[i]; + } + return res; +} + +static inline vuint16m4_t __riscv_vwmaccu_vv_u16m4(vuint16m4_t acc, vuint8m2_t v1, vuint8m2_t v2, size_t vl) +{ + vuint16m4_t res = acc; + for(size_t i = 0; i < acc.vl && i < vl; i++) { + res.data[i] += (uint16_t)v1.data[i] * (uint16_t)v2.data[i]; + } + return res; +} + +/* ============================================================================ + * Vector Shift Operations + * ============================================================================ + */ + +/** + * vsrl: Vector shift right logical (scalar shift amount) + */ +static inline vuint16m2_t __riscv_vsrl_vx_u16m2(vuint16m2_t v, uint32_t x, size_t vl) +{ + vuint16m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = v.data[i] >> x; + } + return res; +} + +static inline vuint16m4_t __riscv_vsrl_vx_u16m4(vuint16m4_t v, uint32_t x, size_t vl) +{ + vuint16m4_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = v.data[i] >> x; + } + return res; +} + +static inline vuint8m1_t __riscv_vnsrl_wx_u8m1(vuint16m2_t v, uint32_t x, size_t vl) +{ + vuint8m1_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (uint8_t)(v.data[i] >> x); + } + return res; +} + +/** + * vnsrl: Vector narrow shift right logical + * Narrow from 16-bit to 8-bit with shift + */ +static inline vuint8m2_t __riscv_vnsrl_wx_u8m2(vuint16m4_t v, uint32_t x, size_t vl) +{ + vuint8m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (uint8_t)(v.data[i] >> x); + } + return res; +} + +/* ============================================================================ + * Vector Bitwise Operations + * ============================================================================ + */ + +/** + * vand: Vector bitwise AND (scalar) + */ +static inline vuint16m2_t __riscv_vand_vx_u16m2(vuint16m2_t v, uint16_t x, size_t vl) +{ + vuint16m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = v.data[i] & x; + } + return res; +} + +/** + * vor: Vector bitwise OR (vector) + */ +static inline vuint16m2_t __riscv_vor_vv_u16m2(vuint16m2_t v1, vuint16m2_t v2, size_t vl) +{ + vuint16m2_t res; + res.vl = v1.vl; + for(size_t i = 0; i < v1.vl && i < vl; i++) { + res.data[i] = v1.data[i] | v2.data[i]; + } + return res; +} + +/* ============================================================================ + * Vector Shift Left Operations + * ============================================================================ + */ + +/** + * vsll: Vector shift left logical (scalar shift amount) + */ +static inline vuint16m2_t __riscv_vsll_vx_u16m2(vuint16m2_t v, uint32_t x, size_t vl) +{ + vuint16m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = v.data[i] << x; + } + return res; +} + +/* ============================================================================ + * Vector Comparison Operations + * ============================================================================ + */ + +static inline vbool8_t __riscv_vmseq_vx_u8m1_b8(vuint8m1_t v, uint8_t x, size_t vl) +{ + vbool8_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (v.data[i] == x) ? 1 : 0; + } + return res; +} + +/** + * vmseq: Vector equal comparison (scalar) + * Returns boolean mask (1 if equal, 0 if not) + */ +static inline vbool4_t __riscv_vmseq_vx_u8m2_b4(vuint8m2_t v, uint8_t x, size_t vl) +{ + vbool4_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (v.data[i] == x) ? 1 : 0; + } + return res; +} + +/** + * vmsgeu: Vector greater or equal comparison (scalar) + * Returns boolean mask + */ +static inline vbool8_t __riscv_vmsgeu_vx_u8m1_b8(vuint8m1_t v, uint8_t x, size_t vl) +{ + vbool8_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (v.data[i] >= x) ? 1 : 0; + } + return res; +} + +static inline vbool4_t __riscv_vmsgeu_vx_u8m2_b4(vuint8m2_t v, uint8_t x, size_t vl) +{ + vbool4_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (v.data[i] >= x) ? 1 : 0; + } + return res; +} + +/* ============================================================================ + * Vector Merge Operations (Conditional) + * ============================================================================ + */ + +/** + * vmerge: Merge vector under predicate mask (vector paths) + * Result = mask ? v2 : v1 + */ +static inline vuint8m1_t __riscv_vmerge_vvm_u8m1(vuint8m1_t v1, vuint8m1_t v2, vbool8_t mask, size_t vl) +{ + vuint8m1_t res; + res.vl = v1.vl; + for(size_t i = 0; i < v1.vl && i < vl; i++) { + res.data[i] = mask.data[i] ? v2.data[i] : v1.data[i]; + } + return res; +} + +static inline vuint8m2_t __riscv_vmerge_vvm_u8m2(vuint8m2_t v1, vuint8m2_t v2, vbool4_t mask, size_t vl) +{ + vuint8m2_t res; + res.vl = v1.vl; + for(size_t i = 0; i < v1.vl && i < vl; i++) { + res.data[i] = mask.data[i] ? v2.data[i] : v1.data[i]; + } + return res; +} + +/** + * vmerge: Merge scalar under predicate mask (scalar path) + * Result = mask ? scalar : vector + */ +static inline vuint8m1_t __riscv_vmerge_vxm_u8m1(vuint8m1_t v, uint8_t x, vbool8_t mask, size_t vl) +{ + vuint8m1_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = mask.data[i] ? x : v.data[i]; + } + return res; +} + +static inline vuint8m2_t __riscv_vmerge_vxm_u8m2(vuint8m2_t v, uint8_t x, vbool4_t mask, size_t vl) +{ + vuint8m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = mask.data[i] ? x : v.data[i]; + } + return res; +} + +/* ========================================================================== + * Vector Reverse Subtract Operations + * ========================================================================= */ + +static inline vuint8m1_t __riscv_vrsub_vx_u8m1(vuint8m1_t v, uint8_t x, size_t vl) +{ + vuint8m1_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = x - v.data[i]; + } + return res; +} + +static inline vuint8m2_t __riscv_vrsub_vx_u8m2(vuint8m2_t v, uint8_t x, size_t vl) +{ + vuint8m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = x - v.data[i]; + } + return res; +} + +static inline vuint16m2_t __riscv_vrsub_vx_u16m2(vuint16m2_t v, uint16_t x, size_t vl) +{ + vuint16m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = x - v.data[i]; + } + return res; +} + +/* ========================================================================== + * Vector Add Operations + * ========================================================================= */ + +static inline vuint8m1_t __riscv_vadd_vv_u8m1(vuint8m1_t v1, vuint8m1_t v2, size_t vl) +{ + vuint8m1_t res; + res.vl = v1.vl; + for(size_t i = 0; i < v1.vl && i < vl; i++) { + res.data[i] = v1.data[i] + v2.data[i]; + } + return res; +} + +static inline vuint16m4_t __riscv_vadd_vx_u16m4(vuint16m4_t v, uint16_t x, size_t vl) +{ + vuint16m4_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = v.data[i] + x; + } + return res; +} + +static inline vuint16m2_t __riscv_vadd_vx_u16m2(vuint16m2_t v, uint16_t x, size_t vl) +{ + vuint16m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = v.data[i] + x; + } + return res; +} + +/* ========================================================================== + * Vector Zero-Extend Operations + * ========================================================================= */ + +static inline vuint16m2_t __riscv_vzext_vf2_u16m2(vuint8m1_t v, size_t vl) +{ + vuint16m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (uint16_t)v.data[i]; + } + return res; +} + +/* ========================================================================== + * Widening multiply/accumulate for 16-bit -> 32-bit (m2 -> m4) + * ========================================================================= */ +static inline vuint32m4_t __riscv_vwmulu_vx_u32m4(vuint16m2_t v, uint32_t x, size_t vl) +{ + vuint32m4_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (uint32_t)v.data[i] * x; + } + return res; +} + +static inline vuint32m4_t __riscv_vwmulu_vv_u32m4(vuint16m2_t v1, vuint16m2_t v2, size_t vl) +{ + vuint32m4_t res; + res.vl = v1.vl; + for(size_t i = 0; i < v1.vl && i < vl; i++) { + res.data[i] = (uint32_t)v1.data[i] * (uint32_t)v2.data[i]; + } + return res; +} + +static inline vuint32m4_t __riscv_vwmaccu_vx_u32m4(vuint32m4_t acc, uint32_t x, vuint16m2_t v, size_t vl) +{ + vuint32m4_t res = acc; + for(size_t i = 0; i < acc.vl && i < vl; i++) { + res.data[i] += (uint32_t)x * (uint32_t)v.data[i]; + } + return res; +} + +static inline vuint16m2_t __riscv_vnsrl_wx_u16m2(vuint32m4_t v, uint32_t x, size_t vl) +{ + vuint16m2_t res; + res.vl = v.vl; + for(size_t i = 0; i < v.vl && i < vl; i++) { + res.data[i] = (uint16_t)(v.data[i] >> x); + } + return res; +} + +#endif /* LV_USE_DRAW_SW_ASM_RISCV_V */ + +#ifdef __cplusplus +} +#endif + +#endif /* LV_BLEND_RISCV_VECTOR_EMULATION_H */ diff --git a/inc/lvgl/src/draw/sw/blend/riscv_v/lv_draw_sw_blend_riscv_v_to_rgb888.c b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_draw_sw_blend_riscv_v_to_rgb888.c new file mode 100644 index 0000000..37e3b4e --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_draw_sw_blend_riscv_v_to_rgb888.c @@ -0,0 +1,1643 @@ +/** + * @file lv_draw_sw_blend_riscv_v_to_rgb888.c + * RGB888/XRGB8888 blend implementation for RISC-V Vector Extension (RVV 1.0) + * + * Supports both dest_px_size=3 (RGB888) and dest_px_size=4 (XRGB8888) + * Reference: lv_draw_sw_blend_neon_to_rgb888.c + * + * NOTE: All RVV blend logic is inlined to avoid passing vuint32m4_t as function + * parameters, which causes complex stack operations that can corrupt the stack. + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_riscv_v_to_rgb888.h" +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_RISCV_V + +#include "../../../../misc/lv_color.h" +#include "../../../../misc/lv_types.h" +#include "../lv_draw_sw_blend_private.h" +#include "lv_blend_riscv_v_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Fill with solid color (no blending needed, opa >= 255) + */ +lv_result_t lv_draw_sw_blend_riscv_v_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + uint8_t * dest_buf = dsc->dest_buf; + size_t vl; + + if(dest_px_size == 3) { + /* RGB888: 3 bytes per pixel (B, G, R) - use RVV segmented store */ + /* Initialize color vectors once with max vl */ + size_t vlmax = __riscv_vsetvlmax_e8m2(); + vuint8m2_t v_b = __riscv_vmv_v_x_u8m2(dsc->color.blue, vlmax); + vuint8m2_t v_g = __riscv_vmv_v_x_u8m2(dsc->color.green, vlmax); + vuint8m2_t v_r = __riscv_vmv_v_x_u8m2(dsc->color.red, vlmax); + + for(int32_t y = 0; y < h; y++) { + /* Process with RVV using segmented store for 3-byte pixels */ + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m2(w - x); + LV_RVV_VSSEG3E8_U8M2(dest_buf + x * 3, v_b, v_g, v_r, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + else { /* dest_px_size == 4 */ + /* XRGB8888: 4 bytes per pixel */ + const uint32_t color32 = 0xFF000000 | ((uint32_t)dsc->color.red << 16) | + ((uint32_t)dsc->color.green << 8) | dsc->color.blue; + + /* Initialize color vector once with max vl */ + size_t vlmax = __riscv_vsetvlmax_e32m4(); + vuint32m4_t v_color = __riscv_vmv_v_x_u32m4(color32, vlmax); + + for(int32_t y = 0; y < h; y++) { + /* Process with RVV - use m4 to reduce register pressure */ + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e32m4(w - x); + __riscv_vse32_v_u32m4((uint32_t *)(dest_buf + x * 4), v_color, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + + return LV_RESULT_OK; +} + +/** + * Fill with color and opacity (opa < 255) + * blend formula: result = (fg * opa + bg * (255 - opa)) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_color_to_rgb888_with_opa(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t opa = dsc->opa; + const uint8_t opa_inv = 255 - opa; + const uint16_t fg_b_opa = (uint16_t)dsc->color.blue * opa; + const uint16_t fg_g_opa = (uint16_t)dsc->color.green * opa; + const uint16_t fg_r_opa = (uint16_t)dsc->color.red * opa; + uint8_t * dest_buf = dsc->dest_buf; + size_t vl; + + /* Early exit if fully transparent */ + if(opa == 0) return LV_RESULT_OK; + + if(dest_px_size == 3) { + for(int32_t y = 0; y < h; y++) { + /* Process with RVV using segmented load/store for 3-byte pixels */ + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m2(w - x); + + /* Load destination B, G, R channels using segmented load */ + vuint8m2_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_VLSEG3E8_U8M2(dest_buf + x * 3, vl, v_dst_b, v_dst_g, v_dst_r); + + /* Blend solid color with destination */ + vuint8m2_t v_b, v_g, v_r; + LV_RVV_BLEND_SOLID_RGB_U8M2(v_dst_r, v_dst_g, v_dst_b, + fg_r_opa, fg_g_opa, fg_b_opa, opa_inv, + v_r, v_g, v_b, vl); + + /* Store result using segmented store */ + LV_RVV_VSSEG3E8_U8M2(dest_buf + x * 3, v_b, v_g, v_r, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + else { /* dest_px_size == 4 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m2(w - x); + + /* Load destination B, G, R, X channels using segmented load */ + vuint8m2_t v_dst_b, v_dst_g, v_dst_r, v_dst_x; + LV_RVV_VLSEG4E8_U8M2(dest_buf + x * 4, vl, v_dst_b, v_dst_g, v_dst_r, v_dst_x); + /* v_dst_x is X/Alpha, ignored for input */ + (void)v_dst_x; + + /* Blend solid color with destination */ + vuint8m2_t v_b, v_g, v_r; + LV_RVV_BLEND_SOLID_RGB_U8M2(v_dst_r, v_dst_g, v_dst_b, + fg_r_opa, fg_g_opa, fg_b_opa, opa_inv, + v_r, v_g, v_b, vl); + + vuint8m2_t v_x = __riscv_vmv_v_x_u8m2(0xFF, vl); /* Alpha = 0xFF */ + + /* Store result using segmented store */ + LV_RVV_VSSEG4E8_U8M2(dest_buf + x * 4, v_b, v_g, v_r, v_x, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + + return LV_RESULT_OK; +} + +/** + * Fill with color and per-pixel mask (opa >= 255) + */ +lv_result_t lv_draw_sw_blend_riscv_v_color_to_rgb888_with_mask(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t * mask_buf = dsc->mask_buf; + const uint8_t fg_b = dsc->color.blue; + const uint8_t fg_g = dsc->color.green; + const uint8_t fg_r = dsc->color.red; + uint8_t * dest_buf = dsc->dest_buf; + size_t vl; + + if(dest_px_size == 3) { + /* RGB888: 3 bytes per pixel - use RVV for blending with mask */ + for(int32_t y = 0; y < h; y++) { + /* Process with RVV using segmented load/store for 3-byte pixels */ + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m2(w - x); + + /* Load mask values */ + vuint8m2_t v_mask8 = __riscv_vle8_v_u8m2(&mask_buf[x], vl); + + /* Load destination B, G, R channels using segmented load */ + vuint8m2_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_VLSEG3E8_U8M2(dest_buf + x * 3, vl, v_dst_b, v_dst_g, v_dst_r); + + /* Blend solid color with mask */ + vuint8m2_t v_b, v_g, v_r; + LV_RVV_BLEND_SOLID_RGB_VMASK_U8M2(v_dst_r, v_dst_g, v_dst_b, + fg_r, fg_g, fg_b, v_mask8, + v_r, v_g, v_b, vl); + + /* Optional: Handle special cases for mask == 0 or mask >= 255. + * Without this, max error is ±1 (e.g., (x*255)>>8 ≈ x*0.996). + * For graphics rendering, ±1 error is typically acceptable. + * Uncomment below if exact values are required. */ + LV_RVV_BLEND_OPTIMIZE_MASK_SCALAR_U8M2(v_r, v_g, v_b, + fg_r, fg_g, fg_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask8, vl); + /* Store result using segmented store */ + LV_RVV_VSSEG3E8_U8M2(dest_buf + x * 3, v_b, v_g, v_r, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask_buf += mask_stride; + } + } + else { /* dest_px_size == 4 */ + /* XRGB8888: 4 bytes per pixel - use segmented load/store like RGB888 */ + for(int32_t y = 0; y < h; y++) { + /* Process with RVV using segmented load/store for 4-byte pixels */ + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m2(w - x); + + /* Load mask values */ + vuint8m2_t v_mask8 = __riscv_vle8_v_u8m2(&mask_buf[x], vl); + + /* Load destination B, G, R, X channels using segmented load */ + vuint8m2_t v_dst_b, v_dst_g, v_dst_r, v_dst_x; + LV_RVV_VLSEG4E8_U8M2(dest_buf + x * 4, vl, v_dst_b, v_dst_g, v_dst_r, v_dst_x); + /* v_dst_x is X/Alpha, ignored for input */ + (void)v_dst_x; + + /* Blend solid color with mask */ + vuint8m2_t v_b, v_g, v_r; + LV_RVV_BLEND_SOLID_RGB_VMASK_U8M2(v_dst_r, v_dst_g, v_dst_b, + fg_r, fg_g, fg_b, v_mask8, + v_r, v_g, v_b, vl); + vuint8m2_t v_x = __riscv_vmv_v_x_u8m2(0xFF, vl); /* Alpha = 0xFF */ + + /* Optional: Handle special cases for mask == 0 or mask >= 255. + * Without this, max error is ±1. Uncomment if exact values required. */ + LV_RVV_BLEND_OPTIMIZE_MASK_SCALAR_U8M2(v_r, v_g, v_b, + fg_r, fg_g, fg_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask8, vl); + + /* Store result using segmented store */ + LV_RVV_VSSEG4E8_U8M2(dest_buf + x * 4, v_b, v_g, v_r, v_x, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask_buf += mask_stride; + } + } + + return LV_RESULT_OK; +} + +/** + * Fill with color, opacity, and per-pixel mask + * Effective mix = (mask * opa) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_color_to_rgb888_with_opa_mask(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const uint8_t opa = dsc->opa; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t * mask_buf = dsc->mask_buf; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t fg_b = dsc->color.blue; + const uint8_t fg_g = dsc->color.green; + const uint8_t fg_r = dsc->color.red; + size_t vl; + + /* Early exit if fully transparent */ + if(opa == 0) return LV_RESULT_OK; + + if(dest_px_size == 3) { + /* RGB888: 3 bytes per pixel - use RVV for blending with opa and mask */ + + for(int32_t y = 0; y < h; y++) { + /* Process with RVV using segmented load/store for 3-byte pixels */ + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m2(w - x); + + /* Load mask values */ + vuint8m2_t v_mask8 = __riscv_vle8_v_u8m2(&mask_buf[x], vl); + + /* Load destination B, G, R channels using segmented load */ + vuint8m2_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_VLSEG3E8_U8M2(dest_buf + x * 3, vl, v_dst_b, v_dst_g, v_dst_r); + + /* Compute mix = (mask * opa) >> 8 using widening multiply then narrow */ + vuint16m4_t v_mix16 = __riscv_vwmulu_vx_u16m4(v_mask8, opa, vl); + vuint8m2_t v_mix8 = __riscv_vnsrl_wx_u8m2(v_mix16, 8, vl); + + /* Blend solid color with mix (mask * opa) */ + vuint8m2_t v_b, v_g, v_r; + LV_RVV_BLEND_SOLID_RGB_VMASK_U8M2(v_dst_r, v_dst_g, v_dst_b, + fg_r, fg_g, fg_b, v_mix8, + v_r, v_g, v_b, vl); + + /* Optional: Handle special cases for mix == 0 or mix >= 255. + * Without this, max error is ±1. Uncomment if exact values required. */ + + LV_RVV_BLEND_OPTIMIZE_MASK_SCALAR_U8M2(v_r, v_g, v_b, + fg_r, fg_g, fg_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix8, vl); + + /* Store result using segmented store */ + LV_RVV_VSSEG3E8_U8M2(dest_buf + x * 3, v_b, v_g, v_r, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask_buf += mask_stride; + } + } + else { /* dest_px_size == 4 */ + /* XRGB8888: 4 bytes per pixel - use segmented load/store like RGB888 */ + + + for(int32_t y = 0; y < h; y++) { + /* Process with RVV using segmented load/store for 4-byte pixels */ + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m2(w - x); + + /* Load mask values */ + vuint8m2_t v_mask8 = __riscv_vle8_v_u8m2(&mask_buf[x], vl); + + /* Compute mix = (mask * opa) >> 8 using widening multiply */ + vuint16m4_t v_mix16 = __riscv_vsrl_vx_u16m4( + __riscv_vwmulu_vx_u16m4(v_mask8, opa, vl), 8, vl); + vuint8m2_t v_mix8 = __riscv_vnsrl_wx_u8m2(v_mix16, 0, vl); + + /* Load destination B, G, R, X channels using segmented load */ + vuint8m2_t v_dst_b, v_dst_g, v_dst_r, v_dst_x; + LV_RVV_VLSEG4E8_U8M2(dest_buf + x * 4, vl, v_dst_b, v_dst_g, v_dst_r, v_dst_x); + (void)v_dst_x; /* v_dst_x is X/Alpha, ignored for input */ + + /* Blend solid color with mix (mask * opa) */ + vuint8m2_t v_b, v_g, v_r; + LV_RVV_BLEND_SOLID_RGB_VMASK_U8M2(v_dst_r, v_dst_g, v_dst_b, + fg_r, fg_g, fg_b, v_mix8, + v_r, v_g, v_b, vl); + + LV_RVV_BLEND_OPTIMIZE_MASK_SCALAR_U8M2(v_r, v_g, v_b, + fg_r, fg_g, fg_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix8, vl); + + vuint8m2_t v_x = __riscv_vmv_v_x_u8m2(0xFF, vl); /* Alpha = 0xFF */ + + /* Store result using segmented store */ + LV_RVV_VSSEG4E8_U8M2(dest_buf + x * 4, v_b, v_g, v_r, v_x, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask_buf += mask_stride; + } + } + + return LV_RESULT_OK; +} + +/********************** + * RGB565 TO RGB888 BLEND FUNCTIONS + **********************/ + +/** + * RGB565 to RGB888/XRGB8888 simple copy (no blending, opa >= 255) + * RGB565 format: RRRRRGGGGGGBBBBB (5-6-5 bits) + */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb565_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + uint8_t * dest_buf = dsc->dest_buf; + const uint16_t * src_buf = dsc->src_buf; + size_t vl; + + if(dest_px_size == 3) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e16m2(w - x); + + /* Load RGB565 pixels */ + vuint16m2_t v_rgb565 = __riscv_vle16_v_u16m2(&src_buf[x], vl); + + /* Extract R5, G6, B5 components */ + vuint16m2_t v_r5 = __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2(v_rgb565, 11, vl), 0x1F, vl); + vuint16m2_t v_g6 = __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2(v_rgb565, 5, vl), 0x3F, vl); + vuint16m2_t v_b5 = __riscv_vand_vx_u16m2(v_rgb565, 0x1F, vl); + + /* Convert to 8-bit: R8 = (R5 * 2106) >> 8, G8 = (G6 * 1037) >> 8, B8 = (B5 * 2106) >> 8 */ + vuint16m2_t v_r8_16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_r5, 2106, vl), 8, vl); + vuint16m2_t v_g8_16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_g6, 1037, vl), 8, vl); + vuint16m2_t v_b8_16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_b5, 2106, vl), 8, vl); + + /* Narrow to 8-bit */ + vuint8m1_t v_r = __riscv_vnsrl_wx_u8m1(v_r8_16, 0, vl); + vuint8m1_t v_g = __riscv_vnsrl_wx_u8m1(v_g8_16, 0, vl); + vuint8m1_t v_b = __riscv_vnsrl_wx_u8m1(v_b8_16, 0, vl); + + /* Store using stride store for RGB888 (3 bytes per pixel) */ + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else { /* dest_px_size == 4 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e16m2(w - x); + + /* Load RGB565 pixels */ + vuint16m2_t v_rgb565 = __riscv_vle16_v_u16m2(&src_buf[x], vl); + + /* Extract R5, G6, B5 components */ + vuint16m2_t v_r5 = __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2(v_rgb565, 11, vl), 0x1F, vl); + vuint16m2_t v_g6 = __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2(v_rgb565, 5, vl), 0x3F, vl); + vuint16m2_t v_b5 = __riscv_vand_vx_u16m2(v_rgb565, 0x1F, vl); + + /* Convert to 8-bit */ + vuint16m2_t v_r8_16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_r5, 2106, vl), 8, vl); + vuint16m2_t v_g8_16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_g6, 1037, vl), 8, vl); + vuint16m2_t v_b8_16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_b5, 2106, vl), 8, vl); + + /* Narrow to 8-bit */ + vuint8m1_t v_r = __riscv_vnsrl_wx_u8m1(v_r8_16, 0, vl); + vuint8m1_t v_g = __riscv_vnsrl_wx_u8m1(v_g8_16, 0, vl); + vuint8m1_t v_b = __riscv_vnsrl_wx_u8m1(v_b8_16, 0, vl); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, vl); + + /* Store using stride store for XRGB8888 (4 bytes per pixel) */ + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + + return LV_RESULT_OK; +} + +/** + * RGB565 to RGB888/XRGB8888 with opacity + * blend formula: result = (src * opa + dst * (255 - opa)) >> 8 + * Optimized using vwmaccu for blend calculation + */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb565_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + const uint16_t * src_buf = dsc->src_buf; + size_t vl; + + if(dest_px_size == 3) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + + /* Load RGB565 source pixels */ + vuint16m2_t v_rgb565 = __riscv_vle16_v_u16m2(&src_buf[x], vl); + + /* Convert RGB565 to RGB888 using macro, then narrow to 8-bit */ + vuint16m2_t v_src_r16, v_src_g16, v_src_b16; + LV_RVV_RGB565_TO_RGB888_U16M2(v_rgb565, v_src_r16, v_src_g16, v_src_b16, vl); + vuint8m1_t v_src_r = __riscv_vnsrl_wx_u8m1(v_src_r16, 0, vl); + vuint8m1_t v_src_g = __riscv_vnsrl_wx_u8m1(v_src_g16, 0, vl); + vuint8m1_t v_src_b = __riscv_vnsrl_wx_u8m1(v_src_b16, 0, vl); + + /* Load destination RGB888 using stride load */ + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + + /* Blend using vwmaccu */ + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + opa, v_r, v_g, v_b, vl); + + /* Store result */ + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else { /* dest_px_size == 4 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + + /* Load RGB565 source pixels */ + vuint16m2_t v_rgb565 = __riscv_vle16_v_u16m2(&src_buf[x], vl); + + /* Convert RGB565 to RGB888 using macro, then narrow to 8-bit */ + vuint16m2_t v_src_r16, v_src_g16, v_src_b16; + LV_RVV_RGB565_TO_RGB888_U16M2(v_rgb565, v_src_r16, v_src_g16, v_src_b16, vl); + vuint8m1_t v_src_r = __riscv_vnsrl_wx_u8m1(v_src_r16, 0, vl); + vuint8m1_t v_src_g = __riscv_vnsrl_wx_u8m1(v_src_g16, 0, vl); + vuint8m1_t v_src_b = __riscv_vnsrl_wx_u8m1(v_src_b16, 0, vl); + + /* Load destination XRGB8888 using stride load */ + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + + /* Blend using vwmaccu */ + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + opa, v_r, v_g, v_b, vl); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, vl); + + /* Store result */ + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + + return LV_RESULT_OK; +} + +/** + * RGB565 to RGB888/XRGB8888 with per-pixel mask + * blend formula: result = (src * mask + dst * (255 - mask)) >> 8 + * Optimized using vwmaccu for blend calculation + */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb565_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const int32_t mask_stride = dsc->mask_stride; + uint8_t * dest_buf = dsc->dest_buf; + const uint16_t * src_buf = dsc->src_buf; + const uint8_t * mask_buf = dsc->mask_buf; + size_t vl; + + if(dest_px_size == 3) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + + /* Load mask */ + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + + /* Load RGB565 source */ + vuint16m2_t v_rgb565 = __riscv_vle16_v_u16m2(&src_buf[x], vl); + + /* Convert RGB565 to RGB888 and narrow to 8-bit */ + vuint16m2_t v_src_r16, v_src_g16, v_src_b16; + LV_RVV_RGB565_TO_RGB888_U16M2(v_rgb565, v_src_r16, v_src_g16, v_src_b16, vl); + vuint8m1_t v_src_r = __riscv_vnsrl_wx_u8m1(v_src_r16, 0, vl); + vuint8m1_t v_src_g = __riscv_vnsrl_wx_u8m1(v_src_g16, 0, vl); + vuint8m1_t v_src_b = __riscv_vnsrl_wx_u8m1(v_src_b16, 0, vl); + + /* Load destination */ + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + + /* Blend with mask using vwmaccu */ + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + else { /* dest_px_size == 4 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + + /* Load mask */ + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + + /* Load RGB565 source */ + vuint16m2_t v_rgb565 = __riscv_vle16_v_u16m2(&src_buf[x], vl); + + /* Convert RGB565 to RGB888 and narrow to 8-bit */ + vuint16m2_t v_src_r16, v_src_g16, v_src_b16; + LV_RVV_RGB565_TO_RGB888_U16M2(v_rgb565, v_src_r16, v_src_g16, v_src_b16, vl); + vuint8m1_t v_src_r = __riscv_vnsrl_wx_u8m1(v_src_r16, 0, vl); + vuint8m1_t v_src_g = __riscv_vnsrl_wx_u8m1(v_src_g16, 0, vl); + vuint8m1_t v_src_b = __riscv_vnsrl_wx_u8m1(v_src_b16, 0, vl); + + /* Load destination */ + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + + /* Blend with mask using vwmaccu */ + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, v_r, v_g, v_b, vl); + + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, vl); + + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, vl); + + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + + return LV_RESULT_OK; +} + +/** + * RGB565 to RGB888/XRGB8888 with opacity and per-pixel mask + * effective mix = (mask * opa) >> 8 + * blend formula: result = (src * mix + dst * (255 - mix)) >> 8 + * + * Note: with_opa_mask needs 16-bit intermediate for mix calculation, + * so we cannot directly use the vwmaccu optimization for this case. + */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb565_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + const uint16_t * src_buf = dsc->src_buf; + const uint8_t * mask_buf = dsc->mask_buf; + size_t vl; + + if(dest_px_size == 3) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + + /* Load mask and compute effective mix = (mask * opa) >> 8 */ + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint16m2_t v_mask16 = __riscv_vzext_vf2_u16m2(v_mask, vl); + vuint16m2_t v_mix16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_mask16, opa, vl), 8, vl); + vuint8m1_t v_mix = __riscv_vnsrl_wx_u8m1(v_mix16, 0, vl); + + /* Load RGB565 source */ + vuint16m2_t v_rgb565 = __riscv_vle16_v_u16m2(&src_buf[x], vl); + + /* Convert RGB565 to RGB888 and narrow to 8-bit */ + vuint16m2_t v_src_r16, v_src_g16, v_src_b16; + LV_RVV_RGB565_TO_RGB888_U16M2(v_rgb565, v_src_r16, v_src_g16, v_src_b16, vl); + vuint8m1_t v_src_r = __riscv_vnsrl_wx_u8m1(v_src_r16, 0, vl); + vuint8m1_t v_src_g = __riscv_vnsrl_wx_u8m1(v_src_g16, 0, vl); + vuint8m1_t v_src_b = __riscv_vnsrl_wx_u8m1(v_src_b16, 0, vl); + + /* Load destination */ + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + + /* Blend with effective mix using vwmaccu */ + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix, v_r, v_g, v_b, vl); + + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix, vl); + + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + else { /* dest_px_size == 4 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + + /* Load mask and compute effective mix */ + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint16m2_t v_mask16 = __riscv_vzext_vf2_u16m2(v_mask, vl); + vuint16m2_t v_mix16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_mask16, opa, vl), 8, vl); + vuint8m1_t v_mix = __riscv_vnsrl_wx_u8m1(v_mix16, 0, vl); + + /* Load RGB565 source */ + vuint16m2_t v_rgb565 = __riscv_vle16_v_u16m2(&src_buf[x], vl); + + /* Convert RGB565 to RGB888 and narrow to 8-bit */ + vuint16m2_t v_src_r16, v_src_g16, v_src_b16; + LV_RVV_RGB565_TO_RGB888_U16M2(v_rgb565, v_src_r16, v_src_g16, v_src_b16, vl); + vuint8m1_t v_src_r = __riscv_vnsrl_wx_u8m1(v_src_r16, 0, vl); + vuint8m1_t v_src_g = __riscv_vnsrl_wx_u8m1(v_src_g16, 0, vl); + vuint8m1_t v_src_b = __riscv_vnsrl_wx_u8m1(v_src_b16, 0, vl); + + /* Load destination */ + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + + /* Blend with effective mix using vwmaccu */ + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix, vl); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, vl); + + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + + return LV_RESULT_OK; +} + +/********************** + * RGB888/XRGB8888 TO RGB888/XRGB8888 BLEND FUNCTIONS + **********************/ + +/** + * RGB888/XRGB8888 to RGB888/XRGB8888 simple copy (no blending, opa >= 255) + * src_px_size: 3 for RGB888, 4 for XRGB8888 + * dest_px_size: 3 for RGB888, 4 for XRGB8888 + */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb888_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size, uint32_t src_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(src_px_size == 3 || src_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t * src_buf = dsc->src_buf; + size_t vl; + + /* Fast path: same pixel size, use RVV memcpy */ + if(src_px_size == dest_px_size) { + const int32_t row_bytes = w * dest_px_size; + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < row_bytes; x += vl) { + vl = __riscv_vsetvl_e8m8(row_bytes - x); + vuint8m8_t v_data = __riscv_vle8_v_u8m8(src_buf + x, vl); + __riscv_vse8_v_u8m8(dest_buf + x, v_data, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + return LV_RESULT_OK; + } + + /* Different pixel sizes: need per-pixel conversion */ + if(dest_px_size == 3) { + /* Source: XRGB8888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_XRGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_src_b, v_src_g, v_src_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else { + /* Destination: XRGB8888 */ + size_t max_vl = __riscv_vsetvlmax_e8m1(); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, max_vl); + + /* Source: RGB888 -> XRGB8888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_RGB888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_src_b, v_src_g, v_src_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + + return LV_RESULT_OK; +} + +/** + * RGB888/XRGB8888 to RGB888/XRGB8888 with opacity + * blend formula: result = (src * opa + dst * (255 - opa)) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb888_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size, uint32_t src_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(src_px_size == 3 || src_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t * src_buf = dsc->src_buf; + size_t vl; + + if(dest_px_size == 3) { + if(src_px_size == 3) { + /* RGB888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_RGB888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, opa, v_r, v_g, v_b, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else { + /* XRGB8888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_XRGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, opa, v_r, v_g, v_b, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + } + else { + size_t max_vl = __riscv_vsetvlmax_e8m1(); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, max_vl); + if(src_px_size == 3) { + /* RGB888 -> XRGB8888 */ + for(int32_t y = 0; y < h; y++) { + uint8_t * dest_row = dest_buf; + const uint8_t * src_row = src_buf; + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_RGB888_U8M1(src_row, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_row, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, opa, v_r, v_g, v_b, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_row, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else { + /* XRGB8888 -> XRGB8888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_XRGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, opa, v_r, v_g, v_b, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + } + + return LV_RESULT_OK; +} + +/** + * RGB888/XRGB8888 to RGB888/XRGB8888 with per-pixel mask + * blend formula: result = (src * mask + dst * (255 - mask)) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb888_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size, uint32_t src_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(src_px_size == 3 || src_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const int32_t mask_stride = dsc->mask_stride; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t * src_buf = dsc->src_buf; + const uint8_t * mask_buf = dsc->mask_buf; + size_t vl; + + if(dest_px_size == 3) { + if(src_px_size == 3) { + /* RGB888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_RGB888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, + v_r, v_g, v_b, + vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, vl); + + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + else { + /* XRGB8888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_XRGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, + v_r, v_g, v_b, + vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + else { + size_t max_vl = __riscv_vsetvlmax_e8m1(); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, max_vl); + if(src_px_size == 3) { + /* RGB888 -> XRGB8888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_RGB888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, + v_r, v_g, v_b, + vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + else { + /* XRGB8888 -> XRGB8888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_XRGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mask, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + + return LV_RESULT_OK; +} + +/** + * RGB888/XRGB8888 to RGB888/XRGB8888 with opacity and per-pixel mask + * effective mix = (mask * opa) >> 8 + * blend formula: result = (src * mix + dst * (255 - mix)) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb888_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size, uint32_t src_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(src_px_size == 3 || src_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t * src_buf = dsc->src_buf; + const uint8_t * mask_buf = dsc->mask_buf; + size_t vl; + + if(dest_px_size == 3) { + if(src_px_size == 3) { + /* RGB888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint16m2_t v_mask16 = __riscv_vzext_vf2_u16m2(v_mask, vl); + vuint16m2_t v_mix16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_mask16, opa, vl), 8, vl); + vuint8m1_t v_mix = __riscv_vnsrl_wx_u8m1(v_mix16, 0, vl); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_RGB888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + else { + /* XRGB8888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint16m2_t v_mask16 = __riscv_vzext_vf2_u16m2(v_mask, vl); + vuint16m2_t v_mix16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_mask16, opa, vl), 8, vl); + vuint8m1_t v_mix = __riscv_vnsrl_wx_u8m1(v_mix16, 0, vl); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_XRGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, v_mix, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + else { + size_t max_vl = __riscv_vsetvlmax_e8m1(); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, max_vl); + if(src_px_size == 3) { + /* RGB888 -> XRGB8888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint16m2_t v_mask16 = __riscv_vzext_vf2_u16m2(v_mask, vl); + vuint16m2_t v_mix16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_mask16, opa, vl), 8, vl); + vuint8m1_t v_mix = __riscv_vnsrl_wx_u8m1(v_mix16, 0, vl); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_RGB888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, v_mix, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + else { + /* XRGB8888 -> XRGB8888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint16m2_t v_mask16 = __riscv_vzext_vf2_u16m2(v_mask, vl); + vuint16m2_t v_mix16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vx_u16m2(v_mask16, opa, vl), 8, vl); + vuint8m1_t v_mix = __riscv_vnsrl_wx_u8m1(v_mix16, 0, vl); + vuint8m1_t v_src_b, v_src_g, v_src_r; + LV_RVV_LOAD_XRGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, v_mix, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_mix, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + } + + return LV_RESULT_OK; +} + +/********************** + * ARGB8888 TO RGB888/XRGB8888 BLEND FUNCTIONS + **********************/ + +/** + * ARGB8888 to RGB888/XRGB8888 blend using source alpha + * blend formula: result = (src * src_alpha + dst * (255 - src_alpha)) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t * src_buf = dsc->src_buf; + size_t vl; + + if(dest_px_size == 3) { + /* ARGB8888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, v_src_a, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_src_a, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else { + /* ARGB8888 -> XRGB8888 */ + size_t max_vl = __riscv_vsetvlmax_e8m1(); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, max_vl); + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, v_src_a, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_src_a, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + + return LV_RESULT_OK; +} + +/** + * ARGB8888 to RGB888/XRGB8888 with global opacity + * effective_alpha = (src_alpha * opa) >> 8 + * blend formula: result = (src * effective_alpha + dst * (255 - effective_alpha)) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf == NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const uint8_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t * src_buf = dsc->src_buf; + size_t vl; + + if(dest_px_size == 3) { + /* ARGB8888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + vuint8m1_t v_eff_a; + LV_RVV_CALC_EFF_ALPHA_OPA_U8M1(v_src_a, opa, v_eff_a, vl); + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, v_eff_a, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_eff_a, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else { + /* ARGB8888 -> XRGB8888 */ + size_t max_vl = __riscv_vsetvlmax_e8m1(); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, max_vl); + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + vuint8m1_t v_eff_a; + LV_RVV_CALC_EFF_ALPHA_OPA_U8M1(v_src_a, opa, v_eff_a, vl); + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, v_eff_a, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_eff_a, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + + return LV_RESULT_OK; +} + +/** + * ARGB8888 to RGB888/XRGB8888 with per-pixel mask + * effective_alpha = (src_alpha * mask) >> 8 + * blend formula: result = (src * effective_alpha + dst * (255 - effective_alpha)) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa >= LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const int32_t mask_stride = dsc->mask_stride; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t * src_buf = dsc->src_buf; + const uint8_t * mask_buf = dsc->mask_buf; + size_t vl; + + if(dest_px_size == 3) { + /* ARGB8888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + vuint8m1_t v_eff_a; + LV_RVV_CALC_EFF_ALPHA_MASK_U8M1(v_src_a, v_mask, v_eff_a, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_eff_a, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_eff_a, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + else { + /* ARGB8888 -> XRGB8888 */ + size_t max_vl = __riscv_vsetvlmax_e8m1(); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, max_vl); + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + vuint8m1_t v_eff_a; + LV_RVV_CALC_EFF_ALPHA_MASK_U8M1(v_src_a, v_mask, v_eff_a, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, v_eff_a, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_eff_a, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + + return LV_RESULT_OK; +} + +/** + * ARGB8888 to RGB888/XRGB8888 with opacity and per-pixel mask + * effective_alpha = (src_alpha * mask * opa) >> 16 + * blend formula: result = (src * effective_alpha + dst * (255 - effective_alpha)) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + LV_ASSERT(dsc->opa < LV_OPA_MAX); + LV_ASSERT(dsc->mask_buf != NULL); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + const int32_t mask_stride = dsc->mask_stride; + const uint8_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t * src_buf = dsc->src_buf; + const uint8_t * mask_buf = dsc->mask_buf; + size_t vl; + + if(dest_px_size == 3) { + /* ARGB8888 -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + vuint8m1_t v_eff_a; + LV_RVV_CALC_EFF_ALPHA_MASK_OPA_U8M1(v_src_a, v_mask, opa, v_eff_a, vl); + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_eff_a, + v_r, v_g, v_b, + vl); + + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_eff_a, vl); + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + else { + /* ARGB8888 -> XRGB8888 */ + size_t max_vl = __riscv_vsetvlmax_e8m1(); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, max_vl); + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_mask = __riscv_vle8_v_u8m1(&mask_buf[x], vl); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + vuint8m1_t v_eff_a; + LV_RVV_CALC_EFF_ALPHA_MASK_OPA_U8M1(v_src_a, v_mask, opa, v_eff_a, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_r, v_g, v_b; + LV_RVV_BLEND_RGB_VMASK_U8M1(v_src_r, v_src_g, v_src_b, v_dst_r, v_dst_g, v_dst_b, v_eff_a, v_r, v_g, v_b, vl); + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_eff_a, vl); + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + mask_buf += mask_stride; + } + } + + return LV_RESULT_OK; +} + +/** + * ARGB8888 premultiplied to RGB888/XRGB8888 + * For premultiplied alpha, source RGB is already multiplied by alpha: + * src_premul = src * src_alpha / 255 + * blend formula: result = src_premul + dst * (255 - src_alpha) / 255 + * = src_premul + (dst * (255 - src_alpha)) >> 8 + */ +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_premultiplied_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + LV_ASSERT(dest_px_size == 3 || dest_px_size == 4); + + const int32_t w = dsc->dest_w; + const int32_t h = dsc->dest_h; + const int32_t dest_stride = dsc->dest_stride; + const int32_t src_stride = dsc->src_stride; + uint8_t * dest_buf = dsc->dest_buf; + const uint8_t * src_buf = dsc->src_buf; + size_t vl; + + if(dest_px_size == 3) { + /* ARGB8888 premultiplied -> RGB888 */ + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_RGB888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_inv_a = __riscv_vrsub_vx_u8m1(v_src_a, 255, vl); + vuint16m2_t v_dst_r16 = __riscv_vzext_vf2_u16m2(v_dst_r, vl); + vuint16m2_t v_dst_g16 = __riscv_vzext_vf2_u16m2(v_dst_g, vl); + vuint16m2_t v_dst_b16 = __riscv_vzext_vf2_u16m2(v_dst_b, vl); + vuint16m2_t v_inv_a16 = __riscv_vzext_vf2_u16m2(v_inv_a, vl); + vuint16m2_t v_r16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vv_u16m2(v_dst_r16, v_inv_a16, vl), 8, vl); + vuint16m2_t v_g16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vv_u16m2(v_dst_g16, v_inv_a16, vl), 8, vl); + vuint16m2_t v_b16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vv_u16m2(v_dst_b16, v_inv_a16, vl), 8, vl); + vuint8m1_t v_r = __riscv_vadd_vv_u8m1(v_src_r, __riscv_vnsrl_wx_u8m1(v_r16, 0, vl), vl); + vuint8m1_t v_g = __riscv_vadd_vv_u8m1(v_src_g, __riscv_vnsrl_wx_u8m1(v_g16, 0, vl), vl); + vuint8m1_t v_b = __riscv_vadd_vv_u8m1(v_src_b, __riscv_vnsrl_wx_u8m1(v_b16, 0, vl), vl); + + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_src_a, vl); + + LV_RVV_STORE_RGB888_U8M1(dest_buf, x, v_b, v_g, v_r, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + else { + /* ARGB8888 premultiplied -> XRGB8888 */ + size_t max_vl = __riscv_vsetvlmax_e8m1(); + vuint8m1_t v_a = __riscv_vmv_v_x_u8m1(0xFF, max_vl); + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x += vl) { + vl = __riscv_vsetvl_e8m1(w - x); + vuint8m1_t v_src_b, v_src_g, v_src_r, v_src_a; + LV_RVV_LOAD_ARGB8888_U8M1(src_buf, x, v_src_b, v_src_g, v_src_r, v_src_a, vl); + vuint8m1_t v_dst_b, v_dst_g, v_dst_r; + LV_RVV_LOAD_XRGB8888_U8M1(dest_buf, x, v_dst_b, v_dst_g, v_dst_r, vl); + vuint8m1_t v_inv_a = __riscv_vrsub_vx_u8m1(v_src_a, 255, vl); + vuint16m2_t v_dst_r16 = __riscv_vzext_vf2_u16m2(v_dst_r, vl); + vuint16m2_t v_dst_g16 = __riscv_vzext_vf2_u16m2(v_dst_g, vl); + vuint16m2_t v_dst_b16 = __riscv_vzext_vf2_u16m2(v_dst_b, vl); + vuint16m2_t v_inv_a16 = __riscv_vzext_vf2_u16m2(v_inv_a, vl); + vuint16m2_t v_r16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vv_u16m2(v_dst_r16, v_inv_a16, vl), 8, vl); + vuint16m2_t v_g16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vv_u16m2(v_dst_g16, v_inv_a16, vl), 8, vl); + vuint16m2_t v_b16 = __riscv_vsrl_vx_u16m2(__riscv_vmul_vv_u16m2(v_dst_b16, v_inv_a16, vl), 8, vl); + vuint8m1_t v_r = __riscv_vadd_vv_u8m1(v_src_r, __riscv_vnsrl_wx_u8m1(v_r16, 0, vl), vl); + vuint8m1_t v_g = __riscv_vadd_vv_u8m1(v_src_g, __riscv_vnsrl_wx_u8m1(v_g16, 0, vl), vl); + vuint8m1_t v_b = __riscv_vadd_vv_u8m1(v_src_b, __riscv_vnsrl_wx_u8m1(v_b16, 0, vl), vl); + + LV_RVV_BLEND_OPTIMIZE_MASK_U8M1(v_r, v_g, v_b, + v_src_r, v_src_g, v_src_b, + v_dst_r, v_dst_g, v_dst_b, + v_src_a, vl); + + LV_RVV_STORE_XRGB8888_U8M1(dest_buf, x, v_b, v_g, v_r, v_a, vl); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + src_buf = drawbuf_next_row(src_buf, src_stride); + } + } + + return LV_RESULT_OK; +} + +#endif /* LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_RISCV_V */ \ No newline at end of file diff --git a/inc/lvgl/src/draw/sw/blend/riscv_v/lv_draw_sw_blend_riscv_v_to_rgb888.h b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_draw_sw_blend_riscv_v_to_rgb888.h new file mode 100644 index 0000000..ae887bf --- /dev/null +++ b/inc/lvgl/src/draw/sw/blend/riscv_v/lv_draw_sw_blend_riscv_v_to_rgb888.h @@ -0,0 +1,170 @@ +/** + * @file lv_draw_sw_blend_riscv_v_to_rgb888.h + */ + +#ifndef LV_DRAW_SW_BLEND_RISCV_V_TO_RGB888_H +#define LV_DRAW_SW_BLEND_RISCV_V_TO_RGB888_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../../lv_conf_internal.h" +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_RISCV_V + +#include "../../../../misc/lv_types.h" +/********************* + * DEFINES + *********************/ + +/* Color fill to RGB888/XRGB8888 */ +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888 +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_color_to_rgb888(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_color_to_rgb888_with_opa(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_color_to_rgb888_with_mask(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_color_to_rgb888_with_opa_mask(dsc, dest_px_size) +#endif + + +/* RGB565 image blend to RGB888/XRGB8888 */ +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_rgb565_to_rgb888(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_rgb565_to_rgb888_with_opa(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_rgb565_to_rgb888_with_mask(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_rgb565_to_rgb888_with_opa_mask(dsc, dest_px_size) +#endif + +/* RGB888/XRGB8888 image blend to RGB888/XRGB8888 */ +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size, src_px_size) \ + lv_draw_sw_blend_riscv_v_rgb888_to_rgb888(dsc, dest_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size, src_px_size) \ + lv_draw_sw_blend_riscv_v_rgb888_to_rgb888_with_opa(dsc, dest_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size, src_px_size) \ + lv_draw_sw_blend_riscv_v_rgb888_to_rgb888_with_mask(dsc, dest_px_size, src_px_size) +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size, src_px_size) \ + lv_draw_sw_blend_riscv_v_rgb888_to_rgb888_with_opa_mask(dsc, dest_px_size, src_px_size) +#endif + +/* ARGB8888 image blend to RGB888/XRGB8888 */ +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_argb8888_to_rgb888(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_argb8888_to_rgb888_with_opa(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_argb8888_to_rgb888_with_mask(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA +#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_argb8888_to_rgb888_with_opa_mask(dsc, dest_px_size) +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888 +#define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size) \ + lv_draw_sw_blend_riscv_v_argb8888_premultiplied_to_rgb888(dsc, dest_px_size) +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/* Color fill functions */ +lv_result_t lv_draw_sw_blend_riscv_v_color_to_rgb888(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_color_to_rgb888_with_opa(lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_color_to_rgb888_with_mask(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_color_to_rgb888_with_opa_mask(lv_draw_sw_blend_fill_dsc_t * dsc, + uint32_t dest_px_size); + +/* RGB565 to RGB888/XRGB8888 blend functions */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb565_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_rgb565_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_rgb565_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_rgb565_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); + +/* RGB888/XRGB8888 to RGB888/XRGB8888 blend functions */ +lv_result_t lv_draw_sw_blend_riscv_v_rgb888_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size, + uint32_t src_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_rgb888_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size, uint32_t src_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_rgb888_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size, uint32_t src_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_rgb888_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size, uint32_t src_px_size); + +/* ARGB8888 to RGB888/XRGB8888 blend functions */ +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_to_rgb888_with_opa(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_to_rgb888_with_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_to_rgb888_with_opa_mask(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +lv_result_t lv_draw_sw_blend_riscv_v_argb8888_premultiplied_to_rgb888(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_RISCV_V */ + +#ifdef __cplusplus +} +#endif + +#endif /* LV_DRAW_SW_BLEND_RISCV_V_TO_RGB888_H */ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw.c b/inc/lvgl/src/draw/sw/lv_draw_sw.c new file mode 100644 index 0000000..efca2bd --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw.c @@ -0,0 +1,491 @@ +/** + * @file lv_draw_sw.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_private.h" +#include "../lv_draw_private.h" +#if LV_USE_DRAW_SW + +#include "../../core/lv_refr.h" +#include "../../display/lv_display_private.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_global.h" +#include "../../misc/lv_area_private.h" + +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + #if LV_USE_THORVG_EXTERNAL + #include + #else + #include "../../libs/thorvg/thorvg_capi.h" + #endif +#endif + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "arm2d/lv_draw_sw_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +#if LV_DRAW_SW_DRAW_UNIT_CNT > 1 && LV_USE_OS == LV_OS_NONE + #error "OS support is required when more than one SW rendering units are enabled" +#endif + +/********************* + * DEFINES + *********************/ +#define DRAW_UNIT_ID_SW 1 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_USE_OS + static void render_thread_cb(void * ptr); +#endif + +static void execute_drawing(lv_draw_task_t * t); + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); +static int32_t lv_draw_sw_delete(lv_draw_unit_t * draw_unit); +#if LV_USE_PARALLEL_DRAW_DEBUG + static void parallel_debug_draw(lv_draw_task_t * t, uint32_t idx); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +#define _draw_info LV_GLOBAL_DEFAULT()->draw_info + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_init(void) +{ + +#if LV_DRAW_SW_COMPLEX == 1 + lv_draw_sw_mask_init(); +#endif + + lv_draw_sw_unit_t * draw_sw_unit = lv_draw_create_unit(sizeof(lv_draw_sw_unit_t)); + draw_sw_unit->base_unit.dispatch_cb = dispatch; + draw_sw_unit->base_unit.evaluate_cb = evaluate; + draw_sw_unit->base_unit.delete_cb = LV_USE_OS ? lv_draw_sw_delete : NULL; +#if LV_USE_DRAW_ARM2D_SYNC + draw_sw_unit->base_unit.name = "SW_ARM2D"; +#else + draw_sw_unit->base_unit.name = "SW"; +#endif + +#if LV_USE_OS + uint32_t i; + for(i = 0; i < LV_DRAW_SW_DRAW_UNIT_CNT; i++) { + lv_draw_sw_thread_dsc_t * thread_dsc = &draw_sw_unit->thread_dscs[i]; + thread_dsc->idx = i; + thread_dsc->draw_unit = (void *) draw_sw_unit; + lv_thread_init(&thread_dsc->thread, "swdraw", LV_DRAW_THREAD_PRIO, render_thread_cb, + LV_DRAW_THREAD_STACK_SIZE, thread_dsc); + } +#endif + +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + if(LV_DRAW_SW_DRAW_UNIT_CNT > 1) { + tvg_engine_init(TVG_ENGINE_SW, LV_DRAW_SW_DRAW_UNIT_CNT); + } + else { + tvg_engine_init(TVG_ENGINE_SW, 0); + } +#endif + + lv_ll_init(&LV_GLOBAL_DEFAULT()->draw_sw_blend_handler_ll, sizeof(lv_draw_sw_custom_blend_handler_t)); +} + +void lv_draw_sw_deinit(void) +{ +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + tvg_engine_term(TVG_ENGINE_SW); +#endif + +#if LV_DRAW_SW_COMPLEX == 1 + lv_draw_sw_mask_deinit(); +#endif +} + +static int32_t lv_draw_sw_delete(lv_draw_unit_t * draw_unit) +{ +#if LV_USE_OS + lv_draw_sw_unit_t * draw_sw_unit = (lv_draw_sw_unit_t *) draw_unit; + + uint32_t i; + for(i = 0; i < LV_DRAW_SW_DRAW_UNIT_CNT; i++) { + lv_draw_sw_thread_dsc_t * thread_dsc = &draw_sw_unit->thread_dscs[i]; + + LV_LOG_INFO("cancel software rendering thread"); + thread_dsc->exit_status = true; + + if(thread_dsc->inited) { + lv_thread_sync_signal(&thread_dsc->sync); + } + lv_thread_delete(&thread_dsc->thread); + } + + return 0; +#else + LV_UNUSED(draw_unit); + return 0; +#endif +} + +bool lv_draw_sw_register_blend_handler(lv_draw_sw_custom_blend_handler_t * handler) +{ + lv_draw_sw_custom_blend_handler_t * existing_handler = NULL; + lv_draw_sw_custom_blend_handler_t * new_handler = NULL; + + // Check if a handler is already registered for the color format + LV_LL_READ(&LV_GLOBAL_DEFAULT()->draw_sw_blend_handler_ll, existing_handler) { + if(existing_handler->dest_cf == handler->dest_cf) { + new_handler = existing_handler; + break; + } + } + + if(new_handler == NULL) { + new_handler = lv_ll_ins_head(&LV_GLOBAL_DEFAULT()->draw_sw_blend_handler_ll); + if(new_handler == NULL) { + LV_ASSERT_MALLOC(new_handler); + return false; + } + } + + lv_memcpy(new_handler, handler, sizeof(lv_draw_sw_custom_blend_handler_t)); + return true; +} + +bool lv_draw_sw_unregister_blend_handler(lv_color_format_t dest_cf) +{ + lv_draw_sw_custom_blend_handler_t * handler; + + LV_LL_READ(&LV_GLOBAL_DEFAULT()->draw_sw_blend_handler_ll, handler) { + if(handler->dest_cf == dest_cf) { + lv_ll_remove(&LV_GLOBAL_DEFAULT()->draw_sw_blend_handler_ll, handler); + lv_free(handler); + return true; + } + } + + return false; +} + +lv_draw_sw_blend_handler_t lv_draw_sw_get_blend_handler(lv_color_format_t dest_cf) +{ + lv_draw_sw_custom_blend_handler_t * handler; + + LV_LL_READ(&LV_GLOBAL_DEFAULT()->draw_sw_blend_handler_ll, handler) { + if(handler->dest_cf == dest_cf) { + return handler->handler; + } + } + + return NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + LV_UNUSED(draw_unit); + + switch(task->type) { + case LV_DRAW_TASK_TYPE_IMAGE: + case LV_DRAW_TASK_TYPE_LAYER: { + lv_draw_image_dsc_t * draw_dsc = task->draw_dsc; + + /* not support skew */ + if(draw_dsc->skew_x != 0 || draw_dsc->skew_y != 0) { + return 0; + } + + bool masked = draw_dsc->bitmap_mask_src != NULL; + + lv_color_format_t cf = draw_dsc->header.cf; + if(masked && (cf == LV_COLOR_FORMAT_A8 || cf == LV_COLOR_FORMAT_RGB565A8)) { + return 0; + } + + if(cf >= LV_COLOR_FORMAT_PROPRIETARY_START) { + return 0; + } + } + break; +#if LV_USE_3DTEXTURE + case LV_DRAW_TASK_TYPE_3D: + return 0; +#endif + default: + break; + } + + if(task->preference_score >= 100) { + task->preference_score = 100; + task->preferred_draw_unit_id = DRAW_UNIT_ID_SW; + } + + return 0; +} + +static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_sw_unit_t * draw_sw_unit = (lv_draw_sw_unit_t *) draw_unit; + +#if LV_USE_OS + uint32_t i; + uint32_t taken_cnt = 0; + /* All idle (couldn't take any tasks): return LV_DRAW_UNIT_IDLE; + * All busy: return 0; as 0 tasks were taken + * Otherwise return taken_cnt; + */ + + /*If at least one is busy, it's not all idle*/ + bool all_idle = true; + for(i = 0; i < LV_DRAW_SW_DRAW_UNIT_CNT; i++) { + if(draw_sw_unit->thread_dscs[i].task_act) { + all_idle = false; + break; + } + } + + lv_draw_task_t * t = NULL; + for(i = 0; i < LV_DRAW_SW_DRAW_UNIT_CNT; i++) { + lv_draw_sw_thread_dsc_t * thread_dsc = &draw_sw_unit->thread_dscs[i]; + + /*Do nothing if busy*/ + if(thread_dsc->task_act) continue; + + /*Find an available task. Start from the previously taken task.*/ + t = lv_draw_get_next_available_task(layer, t, DRAW_UNIT_ID_SW); + + /*If there is not available task don't try other threads as there won't be available + *tasks for then either*/ + if(t == NULL) { + LV_PROFILER_DRAW_END; + if(all_idle) return LV_DRAW_UNIT_IDLE; /*Couldn't start rendering*/ + else return taken_cnt; + } + + /*Allocate a buffer if not done yet.*/ + void * buf = lv_draw_layer_alloc_buf(layer); + /*Do not return is failed. The other thread might already have a buffer can do something. */ + if(buf == NULL) continue; + + /*Take the task*/ + all_idle = false; + taken_cnt++; + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + thread_dsc->task_act = t; + + /*Let the render thread work*/ + if(thread_dsc->inited) lv_thread_sync_signal(&thread_dsc->sync); + } + + LV_PROFILER_DRAW_END; + if(all_idle) return LV_DRAW_UNIT_IDLE; /*Couldn't start rendering*/ + else return taken_cnt; + +#else + /*Return immediately if it's busy with draw task*/ + if(draw_sw_unit->task_act) { + LV_PROFILER_DRAW_END; + return 0; + } + + lv_draw_task_t * t = NULL; + t = lv_draw_get_available_task(layer, NULL, DRAW_UNIT_ID_SW); + if(t == NULL) { + LV_PROFILER_DRAW_END; + return LV_DRAW_UNIT_IDLE; /*Couldn't start rendering*/ + } + + void * buf = lv_draw_layer_alloc_buf(layer); + if(buf == NULL) { + LV_PROFILER_DRAW_END; + return LV_DRAW_UNIT_IDLE; /*Couldn't start rendering*/ + } + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + draw_sw_unit->task_act = t; + + execute_drawing(t); + draw_sw_unit->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + draw_sw_unit->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + + LV_PROFILER_DRAW_END; + return 1; +#endif + +} + +#if LV_USE_OS +static void render_thread_cb(void * ptr) +{ + lv_draw_sw_thread_dsc_t * thread_dsc = ptr; + + lv_thread_sync_init(&thread_dsc->sync); + thread_dsc->inited = true; + + while(1) { + while(thread_dsc->task_act == NULL) { + if(thread_dsc->exit_status) { + break; + } + lv_thread_sync_wait(&thread_dsc->sync); + } + + if(thread_dsc->exit_status) { + LV_LOG_INFO("ready to exit software rendering thread"); + break; + } + + execute_drawing(thread_dsc->task_act); +#if LV_USE_PARALLEL_DRAW_DEBUG + parallel_debug_draw(thread_dsc->task_act, thread_dsc->idx); +#endif + thread_dsc->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + thread_dsc->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + + } + + thread_dsc->inited = false; + lv_thread_sync_delete(&thread_dsc->sync); + LV_LOG_INFO("exit software rendering thread"); +} +#endif + +static void execute_drawing(lv_draw_task_t * t) +{ + LV_PROFILER_DRAW_BEGIN; + /*Render the draw task*/ + switch(t->type) { + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_sw_fill(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_sw_border(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + lv_draw_sw_box_shadow(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LETTER: + lv_draw_sw_letter(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_sw_label(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_sw_image(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_sw_arc(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_line_iterate(t, t->draw_dsc, lv_draw_sw_line); + break; + case LV_DRAW_TASK_TYPE_BLUR: + lv_draw_sw_blur(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_sw_triangle(t, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_sw_layer(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + lv_draw_sw_mask_rect(t, t->draw_dsc); + break; +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + case LV_DRAW_TASK_TYPE_VECTOR: + lv_draw_sw_vector(t, t->draw_dsc); + break; +#endif + default: + break; + } + + + LV_PROFILER_DRAW_END; +} + +#if LV_USE_PARALLEL_DRAW_DEBUG +static void parallel_debug_draw(lv_draw_task_t * t, uint32_t idx) +{ + /*Layers manage it for themselves*/ + if(t->type != LV_DRAW_TASK_TYPE_LAYER) { + lv_area_t draw_area; + lv_text_attributes_t attributes = {0}; + + attributes.text_flags = LV_TEXT_FLAG_NONE; + attributes.line_space = 0; + attributes.letter_space = 0; + attributes.max_width = 100; + + if(!lv_area_intersect(&draw_area, &t->area, &t->clip_area)) return; + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); + fill_dsc.opa = LV_OPA_10; + lv_draw_sw_fill(t, &fill_dsc, &draw_area); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); + border_dsc.opa = LV_OPA_60; + border_dsc.width = 1; + lv_draw_sw_border(t, &border_dsc, &draw_area); + + lv_point_t txt_size; + lv_text_get_size_attributes(&txt_size, "W", LV_FONT_DEFAULT, &attributes); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.y1 = draw_area.y1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y1 + txt_size.y - 1; + + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_white(); + lv_draw_sw_fill(t, &fill_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_black(); + label_dsc.text = buf; + lv_draw_sw_label(t, &label_dsc, &txt_area); + } +} +#endif + + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw.h b/inc/lvgl/src/draw/sw/lv_draw_sw.h new file mode 100644 index 0000000..c874fd2 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw.h @@ -0,0 +1,208 @@ +/** + * @file lv_draw_sw.h + * + */ + +#ifndef LV_DRAW_SW_H +#define LV_DRAW_SW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../../display/lv_display.h" + +#include "../lv_draw_vector.h" +#include "../lv_draw_triangle.h" +#include "../lv_draw_label.h" +#include "../lv_draw_image.h" +#include "../lv_draw_line.h" +#include "../lv_draw_mask.h" +#include "../lv_draw_arc.h" +#include "../lv_draw_blur.h" +#include "lv_draw_sw_utils.h" +#include "blend/lv_draw_sw_blend.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the SW renderer. Called in internally. + * It creates as many SW renderers as defined in LV_DRAW_SW_DRAW_UNIT_CNT + */ +void lv_draw_sw_init(void); + +/** + * Deinitialize the SW renderers + */ +void lv_draw_sw_deinit(void); + +/** + * Fill an area using SW render. Handle gradient and radius. + * @param t pointer to a draw task + * @param dsc the draw descriptor + * @param coords the coordinates of the rectangle + */ +void lv_draw_sw_fill(lv_draw_task_t * t, lv_draw_fill_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw border with SW render. + * @param t pointer to a draw task + * @param dsc the draw descriptor + * @param coords the coordinates of the rectangle + */ +void lv_draw_sw_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw box shadow with SW render. + * @param t pointer to a draw task + * @param dsc the draw descriptor + * @param coords the coordinates of the rectangle for which the box shadow should be drawn + */ +void lv_draw_sw_box_shadow(lv_draw_task_t * t, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw an image with SW render. It handles image decoding, tiling, transformations, and recoloring. + * @param t pointer to a draw task + * @param draw_dsc the draw descriptor + * @param coords the coordinates of the image + */ +void lv_draw_sw_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_sw_letter(lv_draw_task_t * t, const lv_draw_letter_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw a label with SW render. + * @param t pointer to a draw task + * @param dsc the draw descriptor + * @param coords the coordinates of the label + */ +void lv_draw_sw_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw an arc with SW render. + * @param t pointer to a draw task + * @param dsc the draw descriptor + * @param coords the coordinates of the arc + */ +void lv_draw_sw_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords); + +/** + * Draw a line with SW render. + * @param t pointer to a draw task + * @param dsc the draw descriptor + */ +void lv_draw_sw_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc); + +/** + * Blend a layer with SW render + * @param t pointer to a draw task + * @param draw_dsc the draw descriptor + * @param coords the coordinates of the layer + */ +void lv_draw_sw_layer(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords); + +/** + * Draw a triangle with SW render. + * @param t pointer to a draw task + * @param dsc the draw descriptor + */ +void lv_draw_sw_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc); + + +/** + * Blur an area with SW render + * @param t pointer to a draw task + * @param dsc the draw descriptor + * @param coords the area to blur + */ +void lv_draw_sw_blur(lv_draw_task_t * t, const lv_draw_blur_dsc_t * dsc, const lv_area_t * coords); + +/** + * Mask out a rectangle with radius from a current layer + * @param t pointer to a draw task + * @param dsc the draw descriptor + * @param coords the coordinates of the mask + */ +void lv_draw_sw_mask_rect(lv_draw_task_t * t, const lv_draw_mask_rect_dsc_t * dsc); + +/** + * Used internally to get a transformed are of an image + * @param dest_area area to calculate, i.e. get this area from the transformed image + * @param src_buf source buffer + * @param src_w source buffer width in pixels + * @param src_h source buffer height in pixels + * @param src_stride source buffer stride in bytes + * @param draw_dsc draw descriptor + * @param sup supplementary data + * @param cf color format of the source buffer + * @param dest_buf the destination buffer + */ +void lv_draw_sw_transform(const lv_area_t * dest_area, const void * src_buf, + int32_t src_w, int32_t src_h, int32_t src_stride, + const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t cf, void * dest_buf); + +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG +/** + * Draw vector graphics with SW render. + * @param t pointer to a draw task + * @param dsc the draw descriptor + */ +void lv_draw_sw_vector(lv_draw_task_t * t, lv_draw_vector_dsc_t * dsc); +#endif + +/** + * Register a custom blend handler for a color format. + * Handler will be called when blending a color or an + * image to a buffer with the given color format. + * At most one handler can be registered for a color format. + * Subsequent registrations will overwrite the previous handler. + * + * @param handler pointer to a blend handler + * @return true if the handler was registered, false if the handler could not be registered + */ +bool lv_draw_sw_register_blend_handler(lv_draw_sw_custom_blend_handler_t * handler); + +/** + * Unregister a custom blend handler for a color format. + * @param dest_cf color format + * @return true if a handler was unregistered, false if no handler was registered + */ +bool lv_draw_sw_unregister_blend_handler(lv_color_format_t dest_cf); + +/** + * Get the blend handler for a color format. + * @param dest_cf color format + * @return pointer to the blend handler or NULL if no handler is registered + */ +lv_draw_sw_blend_handler_t lv_draw_sw_get_blend_handler(lv_color_format_t dest_cf); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_H*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_arc.c b/inc/lvgl/src/draw/sw/lv_draw_sw_arc.c new file mode 100644 index 0000000..982200c --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_arc.c @@ -0,0 +1,319 @@ +/** + * @file lv_draw_sw_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_image_decoder_private.h" +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW +#if LV_DRAW_SW_COMPLEX + +#include "../../misc/lv_math.h" +#include "../../misc/lv_log.h" +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw_private.h" + +static void add_circle(const lv_opa_t * circle_mask, const lv_area_t * blend_area, const lv_area_t * circle_area, + lv_opa_t * mask_buf, int32_t width); +static void get_rounded_area(int16_t angle, int32_t radius, uint8_t thickness, lv_area_t * res_area); + +/********************* + * DEFINES + *********************/ +#define SPLIT_RADIUS_LIMIT 10 /*With radius greater than this the arc will drawn in quarters. A quarter is drawn only if there is arc in it*/ +#define SPLIT_ANGLE_GAP_LIMIT 60 /*With small gaps in the arc don't bother with splitting because there is nothing to skip.*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ +#if LV_DRAW_SW_COMPLEX + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(dsc->start_angle == dsc->end_angle) return; + + int32_t width = dsc->width; + if(width > dsc->radius) width = dsc->radius; + + lv_area_t area_out = *coords; + lv_area_t clipped_area; + if(!lv_area_intersect(&clipped_area, &area_out, &t->clip_area)) return; + + /*Draw a full ring*/ + if(dsc->img_src == NULL && + (dsc->start_angle + 360 == dsc->end_angle || dsc->start_angle == dsc->end_angle + 360)) { + lv_draw_border_dsc_t cir_dsc; + lv_draw_border_dsc_init(&cir_dsc); + cir_dsc.opa = dsc->opa; + cir_dsc.color = dsc->color; + cir_dsc.width = width; + cir_dsc.radius = LV_RADIUS_CIRCLE; + cir_dsc.side = LV_BORDER_SIDE_FULL; + lv_draw_sw_border(t, &cir_dsc, &area_out); + return; + } + + lv_area_t area_in; + lv_area_copy(&area_in, &area_out); + area_in.x1 += dsc->width; + area_in.y1 += dsc->width; + area_in.x2 -= dsc->width; + area_in.y2 -= dsc->width; + + int32_t start_angle = (int32_t)dsc->start_angle; + int32_t end_angle = (int32_t)dsc->end_angle; + while(start_angle >= 360) start_angle -= 360; + while(end_angle >= 360) end_angle -= 360; + + void * mask_list[4] = {0}; + /*Create an angle mask*/ + lv_draw_sw_mask_angle_param_t mask_angle_param; + lv_draw_sw_mask_angle_init(&mask_angle_param, dsc->center.x, dsc->center.y, start_angle, end_angle); + mask_list[0] = &mask_angle_param; + + /*Create an outer mask*/ + lv_draw_sw_mask_radius_param_t mask_out_param; + lv_draw_sw_mask_radius_init(&mask_out_param, &area_out, LV_RADIUS_CIRCLE, false); + mask_list[1] = &mask_out_param; + + /*Create inner the mask*/ + lv_draw_sw_mask_radius_param_t mask_in_param; + bool mask_in_param_valid = false; + if(lv_area_get_width(&area_in) > 0 && lv_area_get_height(&area_in) > 0) { + lv_draw_sw_mask_radius_init(&mask_in_param, &area_in, LV_RADIUS_CIRCLE, true); + mask_list[2] = &mask_in_param; + mask_in_param_valid = true; + } + + int32_t blend_h = lv_area_get_height(&clipped_area); + int32_t blend_w = lv_area_get_width(&clipped_area); + int32_t h; + lv_opa_t * mask_buf = lv_malloc(blend_w); + + lv_area_t blend_area = clipped_area; + lv_area_t img_area; + lv_draw_sw_blend_dsc_t blend_dsc = {0}; + blend_dsc.mask_buf = mask_buf; + blend_dsc.opa = dsc->opa; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + + const uint8_t * img_mask = NULL; + lv_image_decoder_dsc_t decoder_dsc; + if(dsc->img_src == NULL) { + blend_dsc.color = dsc->color; + } + else { + lv_result_t res = lv_image_decoder_open(&decoder_dsc, dsc->img_src, NULL); + if(res == LV_RESULT_INVALID || decoder_dsc.decoded == NULL) { + LV_LOG_WARN("Can't decode the background image"); + blend_dsc.color = dsc->color; + } + else { + img_area.x1 = 0; + img_area.y1 = 0; + img_area.x2 = decoder_dsc.decoded->header.w - 1; + img_area.y2 = decoder_dsc.decoded->header.h - 1; + int32_t ofs = decoder_dsc.decoded->header.w / 2; + lv_area_move(&img_area, dsc->center.x - ofs, dsc->center.y - ofs); + blend_dsc.src_area = &img_area; + blend_dsc.src_buf = decoder_dsc.decoded->data; + blend_dsc.src_stride = decoder_dsc.decoded->header.stride; + blend_dsc.src_color_format = decoder_dsc.decoded->header.cf; + if(blend_dsc.src_color_format == LV_COLOR_FORMAT_RGB565A8) { + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; + img_mask = (uint8_t *)blend_dsc.src_buf + blend_dsc.src_stride * lv_area_get_height(blend_dsc.src_area); + } + } + } + + lv_opa_t * circle_mask = NULL; + lv_area_t round_area_1; + lv_area_t round_area_2; + if(dsc->rounded) { + circle_mask = lv_malloc(width * width); + LV_ASSERT_MALLOC(circle_mask); + lv_memset(circle_mask, 0xff, width * width); + lv_area_t circle_area = {0, 0, width - 1, width - 1}; + lv_draw_sw_mask_radius_param_t circle_mask_param; + lv_draw_sw_mask_radius_init(&circle_mask_param, &circle_area, width / 2, false); + void * circle_mask_list[2] = {&circle_mask_param, NULL}; + + lv_opa_t * circle_mask_tmp = circle_mask; + for(h = 0; h < width; h++) { + lv_draw_sw_mask_res_t res = lv_draw_sw_mask_apply(circle_mask_list, circle_mask_tmp, 0, h, width); + if(res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(circle_mask_tmp, width); + } + + circle_mask_tmp += width; + } + lv_draw_sw_mask_free_param(&circle_mask_param); + + get_rounded_area(start_angle, dsc->radius, width, &round_area_1); + lv_area_move(&round_area_1, dsc->center.x, dsc->center.y); + get_rounded_area(end_angle, dsc->radius, width, &round_area_2); + lv_area_move(&round_area_2, dsc->center.x, dsc->center.y); + + } + + blend_area.y2 = blend_area.y1; + for(h = 0; h < blend_h; h++) { + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, blend_area.y1, blend_w); + + if(dsc->rounded) { + if(blend_area.y1 >= round_area_1.y1 && blend_area.y1 <= round_area_1.y2) { + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(mask_buf, blend_w); + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + add_circle(circle_mask, &blend_area, &round_area_1, mask_buf, width); + } + if(blend_area.y1 >= round_area_2.y1 && blend_area.y1 <= round_area_2.y2) { + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(mask_buf, blend_w); + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + add_circle(circle_mask, &blend_area, &round_area_2, mask_buf, width); + } + } + + /*If it was an RGB565A8 image use consider its A8 part on the mask*/ + if(img_mask && blend_dsc.mask_res != LV_DRAW_SW_MASK_RES_TRANSP) { + const uint8_t * img_mask_tmp = img_mask; + img_mask_tmp += blend_dsc.src_stride / 2 * (blend_area.y1 - blend_dsc.src_area->y1); + img_mask_tmp += blend_area.x1 - blend_dsc.src_area->x1; + + int32_t i; + for(i = 0; i < blend_w; i++) { + mask_buf[i] = LV_OPA_MIX2(mask_buf[i], img_mask_tmp[i]); + } + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + } + + lv_draw_sw_blend(t, &blend_dsc); + + blend_area.y1 ++; + blend_area.y2 ++; + } + + lv_draw_sw_mask_free_param(&mask_angle_param); + lv_draw_sw_mask_free_param(&mask_out_param); + if(mask_in_param_valid) { + lv_draw_sw_mask_free_param(&mask_in_param); + } + + lv_free(mask_buf); + if(dsc->img_src) lv_image_decoder_close(&decoder_dsc); + if(circle_mask) lv_free(circle_mask); +#else + LV_LOG_WARN("Can't draw arc with LV_DRAW_SW_COMPLEX == 0"); + LV_UNUSED(center); + LV_UNUSED(radius); + LV_UNUSED(start_angle); + LV_UNUSED(end_angle); + LV_UNUSED(layer); + LV_UNUSED(dsc); +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void add_circle(const lv_opa_t * circle_mask, const lv_area_t * blend_area, const lv_area_t * circle_area, + lv_opa_t * mask_buf, int32_t width) +{ + lv_area_t circle_common_area; + if(lv_area_intersect(&circle_common_area, circle_area, blend_area)) { + const lv_opa_t * circle_mask_tmp = circle_mask + width * (circle_common_area.y1 - circle_area->y1); + circle_mask_tmp += circle_common_area.x1 - circle_area->x1; + + lv_opa_t * mask_buf_tmp = mask_buf + circle_common_area.x1 - blend_area->x1; + + uint32_t x; + uint32_t w = lv_area_get_width(&circle_common_area); + for(x = 0; x < w; x++) { + uint32_t res = mask_buf_tmp[x] + circle_mask_tmp[x]; + mask_buf_tmp[x] = res > 255 ? 255 : res; + } + } + +} + +static void get_rounded_area(int16_t angle, int32_t radius, uint8_t thickness, lv_area_t * res_area) +{ + int32_t thick_half = thickness / 2; + uint8_t thick_corr = (thickness & 0x01) ? 0 : 1; + + int32_t cir_x; + int32_t cir_y; + + cir_x = ((radius - thick_half) * lv_trigo_cos(angle)) >> (LV_TRIGO_SHIFT - 8); + cir_y = ((radius - thick_half) * lv_trigo_sin(angle)) >> (LV_TRIGO_SHIFT - 8); + + /*The center of the pixel need to be calculated so apply 1/2 px offset*/ + if(cir_x > 0) { + cir_x = (cir_x - 128) >> 8; + res_area->x1 = cir_x - thick_half + thick_corr; + res_area->x2 = cir_x + thick_half; + } + else { + cir_x = (cir_x + 128) >> 8; + res_area->x1 = cir_x - thick_half; + res_area->x2 = cir_x + thick_half - thick_corr; + } + + if(cir_y > 0) { + cir_y = (cir_y - 128) >> 8; + res_area->y1 = cir_y - thick_half + thick_corr; + res_area->y2 = cir_y + thick_half; + } + else { + cir_y = (cir_y + 128) >> 8; + res_area->y1 = cir_y - thick_half; + res_area->y2 = cir_y + thick_half - thick_corr; + } +} + +#else /*LV_DRAW_SW_COMPLEX*/ + +void lv_draw_sw_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords) +{ + LV_UNUSED(t); + LV_UNUSED(dsc); + LV_UNUSED(coords); + + LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled"); +} + +#endif /*LV_DRAW_SW_COMPLEX*/ +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_blur.c b/inc/lvgl/src/draw/sw/lv_draw_sw_blur.c new file mode 100644 index 0000000..2bb2b0a --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_blur.c @@ -0,0 +1,505 @@ +/** + * @file lv_draw_sw_blur.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "../lv_draw_private.h" +#include "lv_draw_sw.h" + +#if LV_USE_DRAW_SW + +#include "../../misc/lv_math.h" +#include "../../misc/lv_types.h" +#include "../../core/lv_refr_private.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define BLUR_INTENSITY_BITS 12 +#define BLUR_INTENSITY_MAX (1 << 12) +#define BLUR_INTENSITY_HALF ((1 << 12) / 2) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void blur_1_bytes_init(uint32_t * sum, uint8_t * buf, uint32_t sample_len, int32_t stride); +static inline uint8_t blur_1_bytes(uint32_t * sum, uint8_t px, uint32_t intensity); + +static void blur_2_bytes_init(uint32_t * sum, lv_color16_t * buf, uint32_t sample_len, int32_t stride, bool swapped); +static inline uint16_t blur_2_bytes(uint32_t * sum, uint16_t px, uint32_t intensity, bool swapped); + +static void blur_3_bytes_init(uint32_t * sum, volatile uint8_t * buf, uint32_t sample_len, int32_t stride); +static inline void blur_3_bytes(uint32_t * sum, volatile uint8_t * buf, uint32_t intensity); + +static int32_t get_rounded_edge_point(int32_t p_start, int32_t p_end, int32_t p, int32_t r); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_blur(lv_draw_task_t * t, const lv_draw_blur_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->blur_radius == 0) return; + LV_PROFILER_DRAW_BEGIN; + + int32_t layer_x_ofs = t->target_layer->buf_area.x1; + int32_t layer_y_ofs = t->target_layer->buf_area.y1; + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, coords, &t->clip_area)) return; + lv_area_move(&clipped_coords, -layer_x_ofs, -layer_y_ofs); + + uint32_t blur_radius = dsc->blur_radius; + + /*On larger radius skip some pixels as the result is a blob anyways, so not all pixels matter + *This only every 2nd or 3rd px will be blurred, the result will be stored in the layers buffers, + *and finally the missing pixels are set to nearest blurred pixel. We loose precision but it looks ok + *and and it's very fast. + */ + int32_t skip_cnt = 1; + if(dsc->quality == LV_BLUR_QUALITY_AUTO) { + int32_t size = lv_area_get_size(&clipped_coords); + if(blur_radius >= 32 && dsc->corner_radius == 0 && size > 160 * 160) skip_cnt = 3; + else if(blur_radius >= 8) skip_cnt = 2; + } + else if(dsc->quality == LV_BLUR_QUALITY_SPEED) { + if(blur_radius >= 24) skip_cnt = 3; + else skip_cnt = 2; + } + + /*The blurring are must be multiples of skip_cnt so the blurring is all directions + * blur the same pixels if some pixels are skipped*/ + clipped_coords.x1 = ((clipped_coords.x1 + (skip_cnt - 1)) / skip_cnt) * skip_cnt; + clipped_coords.x2 = ((clipped_coords.x2 - (skip_cnt - 1)) / skip_cnt) * skip_cnt; + clipped_coords.y1 = ((clipped_coords.y1 + (skip_cnt - 1)) / skip_cnt) * skip_cnt; + clipped_coords.y2 = ((clipped_coords.y2 - (skip_cnt - 1)) / skip_cnt) * skip_cnt; + if(lv_area_get_width(&clipped_coords) < 0) return; + if(lv_area_get_height(&clipped_coords) < 0) return; + + blur_radius = blur_radius / skip_cnt; + + /*We will use an IIR low pass filer in all 4 direction: top to bottom, bottom to top, left to right, right to left. + *Approximate the the filter coefficient from the radius. + *The filter is like: this_px = mix(prev_px, this_px, intensity) + */ + uint32_t intensity = (BLUR_INTENSITY_MAX * blur_radius) / (blur_radius + 4); + + int32_t sample_len = LV_MAX(blur_radius / 2, 1); + int32_t radius = dsc->corner_radius; + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + int32_t short_side = LV_MIN(w, h); + if(radius > short_side >> 1) radius = short_side >> 1; + + uint32_t px_size = lv_color_format_get_size(t->target_layer->draw_buf->header.cf); + int32_t stride_byte = t->target_layer->draw_buf->header.stride; + int32_t stride_px = stride_byte / px_size; + int32_t next_px_ofs_byte = px_size * skip_cnt; + bool swapped = t->target_layer->draw_buf->header.cf == LV_COLOR_FORMAT_RGB565_SWAPPED; + + uint32_t sum[3]; + int32_t y; + int32_t x; + + /*Blur each column top to bottom and bottom to top.*/ + for(x = clipped_coords.x1; x <= clipped_coords.x2; x += skip_cnt) { + int32_t cir_y = get_rounded_edge_point(coords->x1, coords->x2, layer_x_ofs + x, radius); + int32_t y_start = LV_CLAMP(clipped_coords.y1, coords->y1 - layer_y_ofs + cir_y, clipped_coords.y2); + int32_t y_end = LV_CLAMP(clipped_coords.y1, coords->y2 - layer_y_ofs - cir_y, clipped_coords.y2); + + /*Make sure that the width and height is a multiple of skip_cnt so that back and forth blurring + *surely affects the same pixels */ + y_start = (y_start / skip_cnt) * skip_cnt; + y_end = (y_end / skip_cnt) * skip_cnt; + if(y_start > y_end) continue; + + uint32_t sample_len_limited = LV_MIN((y_end - y_start) / skip_cnt + 1, sample_len); + + if(px_size == 1) { + /*Compiler optimization might mishandle it, so add volatile*/ + uint8_t * buf_column_start = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x, y_start); + blur_1_bytes_init(sum, buf_column_start, sample_len_limited, stride_byte * skip_cnt); + + uint8_t buf_prev = buf_column_start[0] + 1; /*Make sure that it's not equal in the first round*/ + for(y = y_start; y <= y_end; y += skip_cnt) { + if(buf_prev != *buf_column_start) { + *buf_column_start = blur_1_bytes(sum, *buf_column_start, intensity); + buf_prev = *buf_column_start; + } + buf_column_start += stride_byte * skip_cnt; + } + + uint8_t * buf_column_end = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x, y_end); + blur_1_bytes_init(sum, buf_column_end, sample_len_limited, -stride_byte * skip_cnt); + buf_prev = buf_column_end[0] + 1; /*Make sure that it's not equal in the first round*/ + for(y = y_start; y <= y_end; y += skip_cnt) { + if(buf_prev != *buf_column_end) { + *buf_column_end = blur_1_bytes(sum, *buf_column_end, intensity); + buf_prev = *buf_column_end; + } + buf_column_end -= stride_byte * skip_cnt; + } + } + else if(px_size == 2) { + uint16_t * buf16_column_start = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x, y_start); + blur_2_bytes_init(sum, (lv_color16_t *)buf16_column_start, sample_len_limited, stride_px * skip_cnt, swapped); + uint16_t buf16_prev = buf16_column_start[0] + 1; /*Make sure that it's not equal in the first round*/ + + for(y = y_start; y <= y_end; y += skip_cnt) { + if(buf16_prev != *buf16_column_start) { + *buf16_column_start = blur_2_bytes(sum, *buf16_column_start, intensity, swapped); + buf16_prev = *buf16_column_start; + } + buf16_column_start += stride_px * skip_cnt; + } + + uint16_t * buf16_column_end = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x, y_end); + blur_2_bytes_init(sum, (lv_color16_t *)buf16_column_end, sample_len_limited, -stride_px * skip_cnt, swapped); + buf16_prev = buf16_column_end[0] + 1; /*Make sure that it's not equal in the first round*/ + + for(y = y_start; y <= y_end; y += skip_cnt) { + if(buf16_prev != *buf16_column_end) { + *buf16_column_end = blur_2_bytes(sum, *buf16_column_end, intensity, swapped); + buf16_prev = *buf16_column_end; + } + buf16_column_end -= stride_px * skip_cnt; + } + } + else if(px_size >= 3) { + /*Compiler optimization might mishandle it, so add volatile*/ + volatile uint8_t * buf_column_start = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x, y_start); + blur_3_bytes_init(sum, buf_column_start, sample_len_limited, stride_byte * skip_cnt); + + for(y = y_start; y <= y_end; y += skip_cnt) { + blur_3_bytes(sum, buf_column_start, intensity); + buf_column_start += stride_byte * skip_cnt; + } + + volatile uint8_t * buf_column_end = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x, y_end); + blur_3_bytes_init(sum, buf_column_end, sample_len_limited, -stride_byte * skip_cnt); + for(y = y_start; y <= y_end; y += skip_cnt) { + blur_3_bytes(sum, buf_column_end, intensity); + buf_column_end -= stride_byte * skip_cnt; + } + } + } + + /*Blur each line from left to right and right to left. + *Also fill the gap in each line because of skipped pixels*/ + for(y = clipped_coords.y1; y <= clipped_coords.y2; y += skip_cnt) { + int32_t cir_x = get_rounded_edge_point(coords->y1, coords->y2, layer_y_ofs + y, radius); + int32_t x_start = LV_CLAMP(clipped_coords.x1, coords->x1 - layer_x_ofs + cir_x, clipped_coords.x2); + int32_t x_end = LV_CLAMP(clipped_coords.x1, coords->x2 - layer_x_ofs - cir_x, clipped_coords.x2); + + /*Make sure that the width and height is a multiple of skip_cnt so that back and forth blurring + *surely affects the same pixels */ + x_start = (x_start / skip_cnt) * skip_cnt; + x_end = (x_end / skip_cnt) * skip_cnt; + + if(x_start > x_end) continue; + uint32_t line_len_byte = (x_end - x_start + skip_cnt) * px_size; + uint32_t sample_len_limited = LV_MIN((x_end - x_start) / skip_cnt + 1, sample_len); + + + if(px_size == 1) { + /*Compiler optimization might mishandle it, so add volatile*/ + uint8_t * buf_line_start = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_start, y); + + blur_1_bytes_init(sum, buf_line_start, sample_len_limited, px_size * skip_cnt); + + uint8_t buf_prev = buf_line_start[0] + 1; /*Make sure that it's not equal in the first round*/ + for(x = x_start + skip_cnt; x <= x_end; x += skip_cnt) { + if(buf_prev != *buf_line_start) { + *buf_line_start = blur_1_bytes(sum, *buf_line_start, intensity); + buf_prev = *buf_line_start; + } + buf_line_start += next_px_ofs_byte; + } + + uint8_t * buf_line_end = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_end, y); + blur_1_bytes_init(sum, buf_line_end, sample_len_limited, -(int32_t)px_size * skip_cnt); + buf_prev = buf_line_end[0] + 1; /*Make sure that it's not equal in the first round*/ + + for(x = x_start; x <= x_end; x += skip_cnt) { + if(buf_prev != *buf_line_end) { + *buf_line_end = blur_1_bytes(sum, *buf_line_end, intensity); + buf_prev = *buf_line_end; + } + + /*This is the final pixel, fill the gaps in the line by just repeating the pixel (simple upscale)*/ + if(skip_cnt == 2) { + buf_line_end[1] = buf_line_end[0]; + } + else if(skip_cnt == 3) { + buf_line_end[1] = buf_line_end[0]; + buf_line_end[2] = buf_line_end[0]; + } + + /*Fill the empty lines by duplicating a the finished filled lines to the gaps*/ + if(skip_cnt > 1 && x + skip_cnt > x_end) { + uint8_t * buf_copy_from = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_start, y); + lv_memcpy(buf_copy_from + stride_byte, buf_copy_from, line_len_byte); + if(skip_cnt == 3) { + lv_memcpy(buf_copy_from + stride_byte * 2, buf_copy_from, line_len_byte); + } + } + + buf_line_end -= next_px_ofs_byte; + } + + } + else if(px_size == 2) { + uint16_t * buf16_line_start = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_start, y); + blur_2_bytes_init(sum, (lv_color16_t *)buf16_line_start, sample_len_limited, skip_cnt, swapped); + + uint16_t buf16_prev = buf16_line_start[0] + 1; /*Make sure that it's not equal in the first round*/ + for(x = x_start; x <= x_end; x += skip_cnt) { + + if(buf16_prev != *buf16_line_start) { + *buf16_line_start = blur_2_bytes(sum, *buf16_line_start, intensity, swapped); + buf16_prev = *buf16_line_start; + } + buf16_line_start += skip_cnt; + } + + uint16_t * buf16_line_end = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_end, y); + blur_2_bytes_init(sum, (lv_color16_t *)buf16_line_end, sample_len_limited, - skip_cnt, swapped); + buf16_prev = buf16_line_end[0] + 1; /*Make sure that it's not equal in the first round*/ + + for(x = x_start; x <= x_end; x += skip_cnt) { + if(buf16_prev != *buf16_line_end) { + *buf16_line_end = blur_2_bytes(sum, *buf16_line_end, intensity, swapped); + buf16_prev = *buf16_line_end; + } + + /*This is the final pixel, fill the gaps in the line by just repeating the pixel (simple upscale)*/ + if(skip_cnt == 2) { + /*Fill the empty lines by duplicating a the finished filled lines to the gaps*/ + buf16_line_end[1] = buf16_line_end[0]; + } + else if(skip_cnt == 3) { + /*Fill the empty lines by duplicating a the finished filled lines to the gaps*/ + buf16_line_end[1] = buf16_line_end[0]; + buf16_line_end[2] = buf16_line_end[0]; + } + + /*Fill the empty lines by duplicating a the finished filled lines to the gaps*/ + if(skip_cnt > 1 && x + skip_cnt > x_end) { + uint8_t * buf_copy_from = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_start, y); + lv_memcpy(buf_copy_from + stride_byte, buf_copy_from, line_len_byte); + if(skip_cnt == 3) { + lv_memcpy(buf_copy_from + stride_byte * 2, buf_copy_from, line_len_byte); + } + } + + buf16_line_end -= skip_cnt; + } + } + else if(px_size >= 3) { + /*Compiler optimization might mishandle it, so add volatile*/ + volatile uint8_t * buf_line_start = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_start, y); + + blur_3_bytes_init(sum, buf_line_start, sample_len_limited, px_size * skip_cnt); + for(x = x_start + skip_cnt; x <= x_end; x += skip_cnt) { + blur_3_bytes(sum, buf_line_start, intensity); + buf_line_start += next_px_ofs_byte; + } + + volatile uint8_t * buf_line_end = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_end, y); + blur_3_bytes_init(sum, buf_line_end, sample_len_limited, -(int32_t)px_size * skip_cnt); + + for(x = x_start; x <= x_end; x += skip_cnt) { + blur_3_bytes(sum, buf_line_end, intensity); + + /*This is the final pixel, fill the gaps in the line by just repeating the pixel (simple upscale)*/ + if(skip_cnt == 2) { + buf_line_end[px_size + 0] = buf_line_end[0]; + buf_line_end[px_size + 1] = buf_line_end[1]; + buf_line_end[px_size + 2] = buf_line_end[2]; + } + else if(skip_cnt == 3) { + buf_line_end[px_size + 0] = buf_line_end[0]; + buf_line_end[px_size + 1] = buf_line_end[1]; + buf_line_end[px_size + 2] = buf_line_end[2]; + buf_line_end[px_size * 2 + 0] = buf_line_end[0]; + buf_line_end[px_size * 2 + 1] = buf_line_end[1]; + buf_line_end[px_size * 2 + 2] = buf_line_end[2]; + } + + /*Fill the empty lines by duplicating a the finished filled lines to the gaps*/ + if(skip_cnt > 1 && x + skip_cnt > x_end) { + uint8_t * buf_copy_from = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_start, y); + lv_memcpy(buf_copy_from + stride_byte, buf_copy_from, line_len_byte); + if(skip_cnt == 3) { + lv_memcpy(buf_copy_from + stride_byte * 2, buf_copy_from, line_len_byte); + } + } + + buf_line_end -= next_px_ofs_byte; + } + + } + } + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void blur_1_bytes_init(uint32_t * sum, uint8_t * buf, uint32_t sample_len, int32_t stride) +{ + uint32_t s; + + sum[0] = 0; + + for(s = 0; s < sample_len; s++) { + sum[0] += buf[0]; + buf += stride; + } + sum[0] = (sum[0] << BLUR_INTENSITY_BITS) / sample_len; +} + +static void blur_3_bytes_init(uint32_t * sum, volatile uint8_t * buf, uint32_t sample_len, int32_t stride) +{ + uint32_t s; + + sum[0] = 0; + sum[1] = 0; + sum[2] = 0; + + for(s = 0; s < sample_len; s++) { + sum[0] += buf[0]; + sum[1] += buf[1]; + sum[2] += buf[2]; + buf += stride; + } + sum[0] = (sum[0] << BLUR_INTENSITY_BITS) / sample_len; + sum[1] = (sum[1] << BLUR_INTENSITY_BITS) / sample_len; + sum[2] = (sum[2] << BLUR_INTENSITY_BITS) / sample_len; +} + +static void blur_2_bytes_init(uint32_t * sum, lv_color16_t * buf, uint32_t sample_len, int32_t stride, bool swapped) +{ + uint32_t s; + + sum[0] = 0; + sum[1] = 0; + sum[2] = 0; + for(s = 0; s < sample_len; s++) { + uint16_t v = *(uint16_t *)buf; + if(swapped) v = (v >> 8) | (v << 8); + lv_color16_t * c = (lv_color16_t *)&v; + sum[0] += c->red; + sum[1] += c->green; + sum[2] += c->blue; + buf += stride; + } + + sum[0] = (sum[0] << BLUR_INTENSITY_BITS) / sample_len; + sum[1] = (sum[1] << BLUR_INTENSITY_BITS) / sample_len; + sum[2] = (sum[2] << BLUR_INTENSITY_BITS) / sample_len; +} + + +static inline uint8_t blur_1_bytes(uint32_t * sum, uint8_t px, uint32_t intensity) +{ + uint32_t intensity_inv = BLUR_INTENSITY_MAX - intensity; + + *sum = (((*sum) * intensity) >> BLUR_INTENSITY_BITS) + ((px * intensity_inv)); + return (*sum) >> BLUR_INTENSITY_BITS; +} + +static inline uint16_t blur_2_bytes(uint32_t * sum, uint16_t px, uint32_t intensity, bool swapped) +{ + const uint32_t inv = BLUR_INTENSITY_MAX - intensity; + const uint32_t half = BLUR_INTENSITY_MAX >> 1; + const uint32_t shift = BLUR_INTENSITY_BITS; + + if(swapped) px = (px >> 8) | (px << 8); + + /* unpack */ + uint32_t r = px >> 11; + uint32_t g = (px >> 5) & 0x3F; + uint32_t b = px & 0x1F; + + uint32_t s0 = sum[0]; + uint32_t s1 = sum[1]; + uint32_t s2 = sum[2]; + + /* fused multiply-accumulate pattern */ + s0 = (s0 * intensity >> shift) + (r * inv); + s1 = (s1 * intensity >> shift) + (g * inv); + s2 = (s2 * intensity >> shift) + (b * inv); + + sum[0] = s0; + sum[1] = s1; + sum[2] = s2; + + /* final */ + r = (s0 + half) >> shift; + g = (s1 + half) >> shift; + b = (s2 + half) >> shift; + + uint16_t res = (uint16_t)((r << 11) | (g << 5) | b); + if(swapped) res = (res >> 8) | (res << 8); + return res; +} + + + +static inline void blur_3_bytes(uint32_t * sum, volatile uint8_t * buf, uint32_t intensity) +{ + uint32_t intensity_inv = BLUR_INTENSITY_MAX - intensity; + + sum[0] = ((sum[0] * intensity) >> BLUR_INTENSITY_BITS) + ((buf[0] * intensity_inv)); + buf[0] = sum[0] >> BLUR_INTENSITY_BITS; + + sum[1] = ((sum[1] * intensity) >> BLUR_INTENSITY_BITS) + ((buf[1] * intensity_inv)); + buf[1] = sum[1] >> BLUR_INTENSITY_BITS; + + sum[2] = ((sum[2] * intensity) >> BLUR_INTENSITY_BITS) + ((buf[2] * intensity_inv)); + buf[2] = sum[2] >> BLUR_INTENSITY_BITS; +} + +/** + * Get the X or Y point for a rounded edge. + * If the X coordinates are used Y will be returned and vice versa + * Calculates the left or top edge + * @param p_start the edge's X1 or Y1 coordinate + * @param p_end the edge's X2 or Y2 coordinate + * @param p the X or Y coordinate on the edge for which the related X or X should be returned + * @param r the radius of the corner + * @return the X or Y coordinate corresponding to the provided coordinates + */ +static int32_t get_rounded_edge_point(int32_t p_start, int32_t p_end, int32_t p, int32_t r) +{ + if(p < p_start + r) p = r - (p - p_start); + else if(p > p_end - r) p = r - (p_end - p); + else return 0; + + uint32_t res = lv_sqrt32(r * r - p * p); + return r - res; +} + + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_border.c b/inc/lvgl/src/draw/sw/lv_draw_sw_border.c new file mode 100644 index 0000000..f27f0c3 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_border.c @@ -0,0 +1,344 @@ +/** + * @file lv_draw_sw_border.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "../lv_draw_private.h" +#include "../lv_draw_private.h" +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "blend/lv_draw_sw_blend_private.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_text_ap.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ +#define SPLIT_LIMIT 50 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void draw_border_complex(lv_draw_task_t * t, const lv_area_t * outer_area, const lv_area_t * inner_area, + int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa); + +static void draw_border_simple(lv_draw_task_t * t, const lv_area_t * outer_area, const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + if(dsc->width == 0) return; + if(dsc->side == LV_BORDER_SIDE_NONE) return; + + int32_t coords_w = lv_area_get_width(coords); + int32_t coords_h = lv_area_get_height(coords); + int32_t rout = dsc->radius; + int32_t short_side = LV_MIN(coords_w, coords_h); + if(rout > short_side >> 1) rout = short_side >> 1; + + /*Get the inner area*/ + lv_area_t area_inner; + lv_area_copy(&area_inner, coords); + area_inner.x1 += ((dsc->side & LV_BORDER_SIDE_LEFT) ? dsc->width : - (dsc->width + rout)); + area_inner.x2 -= ((dsc->side & LV_BORDER_SIDE_RIGHT) ? dsc->width : - (dsc->width + rout)); + area_inner.y1 += ((dsc->side & LV_BORDER_SIDE_TOP) ? dsc->width : - (dsc->width + rout)); + area_inner.y2 -= ((dsc->side & LV_BORDER_SIDE_BOTTOM) ? dsc->width : - (dsc->width + rout)); + + int32_t rin = rout - dsc->width; + if(rin < 0) rin = 0; + + if(rout == 0 && rin == 0) { + draw_border_simple(t, coords, &area_inner, dsc->color, dsc->opa); + } + else { + draw_border_complex(t, coords, &area_inner, rout, rin, dsc->color, dsc->opa); + } + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +void draw_border_complex(lv_draw_task_t * t, const lv_area_t * outer_area, const lv_area_t * inner_area, + int32_t rout, int32_t rin, lv_color_t color, lv_opa_t opa) +{ +#if LV_DRAW_SW_COMPLEX + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `coords`*/ + lv_area_t draw_area; + if(!lv_area_intersect(&draw_area, outer_area, &t->clip_area)) return; + int32_t draw_area_w = lv_area_get_width(&draw_area); + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + lv_opa_t * mask_buf = lv_malloc(draw_area_w); + blend_dsc.mask_buf = mask_buf; + + void * mask_list[3] = {0}; + + /*Create mask for the inner mask*/ + lv_draw_sw_mask_radius_param_t mask_rin_param; + lv_draw_sw_mask_radius_init(&mask_rin_param, inner_area, rin, true); + mask_list[0] = &mask_rin_param; + + /*Create mask for the outer area*/ + lv_draw_sw_mask_radius_param_t mask_rout_param; + if(rout > 0) { + lv_draw_sw_mask_radius_init(&mask_rout_param, outer_area, rout, false); + mask_list[1] = &mask_rout_param; + } + + int32_t h; + lv_area_t blend_area; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.color = color; + blend_dsc.opa = opa; + + /*Calculate the x and y coordinates where the straight parts area is*/ + lv_area_t core_area; + core_area.x1 = LV_MAX(outer_area->x1 + rout, inner_area->x1); + core_area.x2 = LV_MIN(outer_area->x2 - rout, inner_area->x2); + core_area.y1 = LV_MAX(outer_area->y1 + rout, inner_area->y1); + core_area.y2 = LV_MIN(outer_area->y2 - rout, inner_area->y2); + int32_t core_w = lv_area_get_width(&core_area); + + bool top_side = outer_area->y1 <= inner_area->y1; + bool bottom_side = outer_area->y2 >= inner_area->y2; + + /*No masks*/ + bool left_side = outer_area->x1 <= inner_area->x1; + bool right_side = outer_area->x2 >= inner_area->x2; + + bool split_hor = true; + if(left_side && right_side && top_side && bottom_side && + core_w < SPLIT_LIMIT) { + split_hor = false; + } + + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_FULL_COVER; + /*Draw the straight lines first if they are long enough*/ + if(top_side && split_hor) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = outer_area->y1; + blend_area.y2 = inner_area->y1 - 1; + lv_draw_sw_blend(t, &blend_dsc); + } + + if(bottom_side && split_hor) { + blend_area.x1 = core_area.x1; + blend_area.x2 = core_area.x2; + blend_area.y1 = inner_area->y2 + 1; + blend_area.y2 = outer_area->y2; + lv_draw_sw_blend(t, &blend_dsc); + } + + /*If the border is very thick and the vertical sides overlap horizontally draw a single rectangle*/ + if(inner_area->x1 >= inner_area->x2 && left_side && right_side) { + blend_area.x1 = outer_area->x1; + blend_area.x2 = outer_area->x2; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + lv_draw_sw_blend(t, &blend_dsc); + } + else { + if(left_side) { + blend_area.x1 = outer_area->x1; + blend_area.x2 = inner_area->x1 - 1; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + lv_draw_sw_blend(t, &blend_dsc); + } + + if(right_side) { + blend_area.x1 = inner_area->x2 + 1; + blend_area.x2 = outer_area->x2; + blend_area.y1 = core_area.y1; + blend_area.y2 = core_area.y2; + lv_draw_sw_blend(t, &blend_dsc); + } + } + + /*Draw the corners*/ + int32_t blend_w; + + /*Left and right corner together if they are close to each other*/ + if(!split_hor) { + /*Calculate the top corner and mirror it to the bottom*/ + blend_area.x1 = draw_area.x1; + blend_area.x2 = draw_area.x2; + int32_t max_h = LV_MAX(rout, inner_area->y1 - outer_area->y1); + for(h = 0; h < max_h; h++) { + int32_t top_y = outer_area->y1 + h; + int32_t bottom_y = outer_area->y2 - h; + if(top_y < draw_area.y1 && bottom_y > draw_area.y2) continue; /*This line is clipped now*/ + + lv_memset(mask_buf, 0xff, draw_area_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, top_y, draw_area_w); + + if(top_y >= draw_area.y1) { + blend_area.y1 = top_y; + blend_area.y2 = top_y; + lv_draw_sw_blend(t, &blend_dsc); + } + + if(bottom_y <= draw_area.y2) { + blend_area.y1 = bottom_y; + blend_area.y2 = bottom_y; + lv_draw_sw_blend(t, &blend_dsc); + } + } + } + else { + /*Left corners*/ + blend_area.x1 = draw_area.x1; + blend_area.x2 = LV_MIN(draw_area.x2, core_area.x1 - 1); + blend_w = lv_area_get_width(&blend_area); + if(blend_w > 0) { + if(left_side || top_side) { + for(h = draw_area.y1; h < core_area.y1; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(t, &blend_dsc); + } + } + + if(left_side || bottom_side) { + for(h = core_area.y2 + 1; h <= draw_area.y2; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(t, &blend_dsc); + } + } + } + + /*Right corners*/ + blend_area.x1 = LV_MAX(draw_area.x1, blend_area.x2 + 1); /*To not overlap with the left side*/ + blend_area.x1 = LV_MAX(draw_area.x1, core_area.x2 + 1); + + blend_area.x2 = draw_area.x2; + blend_w = lv_area_get_width(&blend_area); + + if(blend_w > 0) { + if(right_side || top_side) { + for(h = draw_area.y1; h < core_area.y1; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(t, &blend_dsc); + } + } + + if(right_side || bottom_side) { + for(h = core_area.y2 + 1; h <= draw_area.y2; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + lv_memset(mask_buf, 0xff, blend_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, h, blend_w); + lv_draw_sw_blend(t, &blend_dsc); + } + } + } + } + + lv_draw_sw_mask_free_param(&mask_rin_param); + if(rout > 0) lv_draw_sw_mask_free_param(&mask_rout_param); + lv_free(mask_buf); + +#else + LV_UNUSED(t); + LV_UNUSED(outer_area); + LV_UNUSED(inner_area); + LV_UNUSED(rout); + LV_UNUSED(rin); + LV_UNUSED(color); + LV_UNUSED(opa); +#endif /*LV_DRAW_SW_COMPLEX*/ +} +static void draw_border_simple(lv_draw_task_t * t, const lv_area_t * outer_area, const lv_area_t * inner_area, + lv_color_t color, lv_opa_t opa) +{ + lv_area_t a; + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.blend_area = &a; + blend_dsc.color = color; + blend_dsc.opa = opa; + + bool top_side = outer_area->y1 <= inner_area->y1; + bool bottom_side = outer_area->y2 >= inner_area->y2; + bool left_side = outer_area->x1 <= inner_area->x1; + bool right_side = outer_area->x2 >= inner_area->x2; + + /*Top*/ + a.x1 = outer_area->x1; + a.x2 = outer_area->x2; + a.y1 = outer_area->y1; + a.y2 = inner_area->y1 - 1; + if(top_side) { + lv_draw_sw_blend(t, &blend_dsc); + } + + /*Bottom*/ + a.y1 = inner_area->y2 + 1; + a.y2 = outer_area->y2; + if(bottom_side) { + lv_draw_sw_blend(t, &blend_dsc); + } + + /*Left*/ + a.x1 = outer_area->x1; + a.x2 = inner_area->x1 - 1; + a.y1 = (top_side) ? inner_area->y1 : outer_area->y1; + a.y2 = (bottom_side) ? inner_area->y2 : outer_area->y2; + if(left_side) { + lv_draw_sw_blend(t, &blend_dsc); + } + + /*Right*/ + a.x1 = inner_area->x2 + 1; + a.x2 = outer_area->x2; + if(right_side) { + lv_draw_sw_blend(t, &blend_dsc); + } +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c b/inc/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c new file mode 100644 index 0000000..ee693f5 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c @@ -0,0 +1,746 @@ +/** + * @file lv_draw_sw_box_shadow.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "../lv_draw_private.h" +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_COMPLEX + +#include "blend/lv_draw_sw_blend_private.h" +#include "../../core/lv_global.h" +#include "../../misc/lv_math.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ +#define SHADOW_UPSCALE_SHIFT 6 +#define SHADOW_ENHANCE 1 + +#if defined(LV_DRAW_SW_SHADOW_CACHE_SIZE) && LV_DRAW_SW_SHADOW_CACHE_SIZE > 0 + #define shadow_cache LV_GLOBAL_DEFAULT()->sw_shadow_cache +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t s, + int32_t r); +static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_box_shadow(lv_draw_task_t * t, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords) +{ + /*Calculate the rectangle which is blurred to get the shadow in `shadow_area`*/ + lv_area_t core_area; + core_area.x1 = coords->x1 + dsc->ofs_x - dsc->spread; + core_area.x2 = coords->x2 + dsc->ofs_x + dsc->spread; + core_area.y1 = coords->y1 + dsc->ofs_y - dsc->spread; + core_area.y2 = coords->y2 + dsc->ofs_y + dsc->spread; + + /*Calculate the bounding box of the shadow*/ + lv_area_t shadow_area; + shadow_area.x1 = core_area.x1 - dsc->width / 2 - 1; + shadow_area.x2 = core_area.x2 + dsc->width / 2 + 1; + shadow_area.y1 = core_area.y1 - dsc->width / 2 - 1; + shadow_area.y2 = core_area.y2 + dsc->width / 2 + 1; + + lv_opa_t opa = dsc->opa; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `shadow_area`*/ + lv_area_t draw_area; + if(!lv_area_intersect(&draw_area, &shadow_area, &t->clip_area)) return; + + /*Consider 1 px smaller bg to be sure the edge will be covered by the shadow*/ + lv_area_t bg_area; + lv_area_copy(&bg_area, coords); + lv_area_increase(&bg_area, -1, -1); + + /*Get the clamped radius*/ + int32_t r_bg = dsc->radius; + int32_t short_side = LV_MIN(lv_area_get_width(&bg_area), lv_area_get_height(&bg_area)); + if(r_bg > short_side >> 1) r_bg = short_side >> 1; + + /*Get the clamped radius*/ + int32_t r_sh = dsc->radius; + short_side = LV_MIN(lv_area_get_width(&core_area), lv_area_get_height(&core_area)); + if(r_sh > short_side >> 1) r_sh = short_side >> 1; + + /*Get how many pixels are affected by the blur on the corners*/ + int32_t corner_size = dsc->width + r_sh; + + lv_opa_t * sh_buf; + +#if LV_DRAW_SW_SHADOW_CACHE_SIZE + lv_draw_sw_shadow_cache_t * cache = &shadow_cache; + if(cache->cache_size == corner_size && cache->cache_r == r_sh) { + /*Use the cache if available*/ + sh_buf = lv_malloc(corner_size * corner_size); + LV_ASSERT_MALLOC(sh_buf); + lv_memcpy(sh_buf, cache->cache, corner_size * corner_size); + } + else { + /*A larger buffer is required for calculation*/ + sh_buf = lv_malloc(corner_size * corner_size * sizeof(uint16_t)); + LV_ASSERT_MALLOC(sh_buf); + shadow_draw_corner_buf(&core_area, (uint16_t *)sh_buf, dsc->width, r_sh); + + /*Cache the corner if it fits into the cache size*/ + if((uint32_t)corner_size * corner_size < sizeof(cache->cache)) { + lv_memcpy(cache->cache, sh_buf, corner_size * corner_size); + cache->cache_size = corner_size; + cache->cache_r = r_sh; + } + } +#else + sh_buf = lv_malloc(corner_size * corner_size * sizeof(uint16_t)); + LV_ASSERT_MALLOC(sh_buf); + shadow_draw_corner_buf(&core_area, (uint16_t *)sh_buf, dsc->width, r_sh); +#endif /*LV_DRAW_SW_SHADOW_CACHE_SIZE*/ + + /*Skip a lot of masking if the background will cover the shadow that would be masked out*/ + bool simple = dsc->bg_cover; + + /*Create a radius mask to clip remove shadow on the bg area*/ + + lv_draw_sw_mask_radius_param_t mask_rout_param; + void * masks[2] = {0}; + if(!simple) { + lv_draw_sw_mask_radius_init(&mask_rout_param, &bg_area, r_bg, true); + masks[0] = &mask_rout_param; + } + + lv_opa_t * mask_buf = lv_malloc(lv_area_get_width(&shadow_area)); + lv_area_t blend_area; + lv_area_t clip_area_sub; + lv_opa_t * sh_buf_tmp; + int32_t y; + bool simple_sub; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_buf = mask_buf; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + + int32_t w_half = shadow_area.x1 + lv_area_get_width(&shadow_area) / 2; + int32_t h_half = shadow_area.y1 + lv_area_get_height(&shadow_area) / 2; + + /*Draw the corners if they are on the current clip area and not fully covered by the bg*/ + + /*Top right corner*/ + blend_area.x2 = shadow_area.x2; + blend_area.x1 = shadow_area.x2 - corner_size + 1; + blend_area.y1 = shadow_area.y1; + blend_area.y2 = shadow_area.y1 + corner_size - 1; + /*Do not overdraw the other top corners*/ + blend_area.x1 = LV_MAX(blend_area.x1, w_half); + blend_area.y2 = LV_MIN(blend_area.y2, h_half); + + if(lv_area_intersect(&clip_area_sub, &blend_area, &t->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (clip_area_sub.y1 - shadow_area.y1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); + + /*Do not mask if out of the bg*/ + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + if(w > 0) { + blend_dsc.mask_buf = mask_buf; + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + lv_draw_sw_blend(t, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Bottom right corner. + *Almost the same as top right just read the lines of `sh_buf` from then end*/ + blend_area.x2 = shadow_area.x2; + blend_area.x1 = shadow_area.x2 - corner_size + 1; + blend_area.y1 = shadow_area.y2 - corner_size + 1; + blend_area.y2 = shadow_area.y2; + /*Do not overdraw the other corners*/ + blend_area.x1 = LV_MAX(blend_area.x1, w_half); + blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); + + if(lv_area_intersect(&clip_area_sub, &blend_area, &t->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); + /*Do not mask if out of the bg*/ + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(w > 0) { + blend_dsc.mask_buf = mask_buf; + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + lv_draw_sw_blend(t, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Top side*/ + blend_area.x1 = shadow_area.x1 + corner_size; + blend_area.x2 = shadow_area.x2 - corner_size; + blend_area.y1 = shadow_area.y1; + blend_area.y2 = shadow_area.y1 + corner_size - 1; + blend_area.y2 = LV_MIN(blend_area.y2, h_half); + + if(lv_area_intersect(&clip_area_sub, &blend_area, &t->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; + + /*Do not mask if out of the bg*/ + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(w > 0) { + if(!simple_sub) { + blend_dsc.mask_buf = mask_buf; + } + else { + blend_dsc.mask_buf = NULL; + } + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memset(mask_buf, sh_buf_tmp[0], w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(t, &blend_dsc); + } + else { + blend_dsc.opa = opa == LV_OPA_COVER ? sh_buf_tmp[0] : LV_OPA_MIX2(sh_buf_tmp[0], dsc->opa); + lv_draw_sw_blend(t, &blend_dsc); + } + sh_buf_tmp += corner_size; + } + } + } + blend_dsc.opa = dsc->opa; /*Restore*/ + + /*Bottom side*/ + blend_area.x1 = shadow_area.x1 + corner_size; + blend_area.x2 = shadow_area.x2 - corner_size; + blend_area.y1 = shadow_area.y2 - corner_size + 1; + blend_area.y2 = shadow_area.y2; + blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); + + if(lv_area_intersect(&clip_area_sub, &blend_area, &t->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; + if(w > 0) { + /*Do not mask if out of the bg*/ + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(!simple_sub) { + blend_dsc.mask_buf = mask_buf; + } + else { + blend_dsc.mask_buf = NULL; + } + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + + for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { + blend_area.y1 = y; + blend_area.y2 = y; + + /*Do not mask if out of the bg*/ + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + + if(!simple_sub) { + lv_memset(mask_buf, sh_buf_tmp[0], w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(t, &blend_dsc); + } + else { + blend_dsc.opa = opa == LV_OPA_COVER ? sh_buf_tmp[0] : (sh_buf_tmp[0] * dsc->opa) >> 8; + lv_draw_sw_blend(t, &blend_dsc); + + } + sh_buf_tmp += corner_size; + } + } + } + + blend_dsc.opa = dsc->opa; /*Restore*/ + + /*Right side*/ + blend_area.x1 = shadow_area.x2 - corner_size + 1; + blend_area.x2 = shadow_area.x2; + blend_area.y1 = shadow_area.y1 + corner_size; + blend_area.y2 = shadow_area.y2 - corner_size; + /*Do not overdraw the other corners*/ + blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); + blend_area.y2 = LV_MAX(blend_area.y2, h_half); + blend_area.x1 = LV_MAX(blend_area.x1, w_half); + + if(lv_area_intersect(&clip_area_sub, &blend_area, &t->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (corner_size - 1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - (shadow_area.x2 - corner_size + 1); + + /*Do not mask if out of the bg*/ + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; + + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + lv_draw_sw_blend(t, &blend_dsc); + } + } + } + + /*Mirror the shadow corner buffer horizontally*/ + sh_buf_tmp = sh_buf ; + for(y = 0; y < corner_size; y++) { + int32_t x; + lv_opa_t * start = sh_buf_tmp; + lv_opa_t * end = sh_buf_tmp + corner_size - 1; + for(x = 0; x < corner_size / 2; x++) { + lv_opa_t tmp = *start; + *start = *end; + *end = tmp; + + start++; + end--; + } + sh_buf_tmp += corner_size; + } + + /*Left side*/ + blend_area.x1 = shadow_area.x1; + blend_area.x2 = shadow_area.x1 + corner_size - 1; + blend_area.y1 = shadow_area.y1 + corner_size; + blend_area.y2 = shadow_area.y2 - corner_size; + /*Do not overdraw the other corners*/ + blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); + blend_area.y2 = LV_MAX(blend_area.y2, h_half); + blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); + + if(lv_area_intersect(&clip_area_sub, &blend_area, &t->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (corner_size - 1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; + + /*Do not mask if out of the bg*/ + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = simple_sub ? sh_buf_tmp : mask_buf; + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + + lv_draw_sw_blend(t, &blend_dsc); + } + } + } + + /*Top left corner*/ + blend_area.x1 = shadow_area.x1; + blend_area.x2 = shadow_area.x1 + corner_size - 1; + blend_area.y1 = shadow_area.y1; + blend_area.y2 = shadow_area.y1 + corner_size - 1; + /*Do not overdraw the other corners*/ + blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); + blend_area.y2 = LV_MIN(blend_area.y2, h_half); + + if(lv_area_intersect(&clip_area_sub, &blend_area, &t->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (clip_area_sub.y1 - blend_area.y1) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; + + /*Do not mask if out of the bg*/ + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = mask_buf; + + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + + lv_draw_sw_blend(t, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Bottom left corner. + *Almost the same as bottom right just read the lines of `sh_buf` from then end*/ + blend_area.x1 = shadow_area.x1 ; + blend_area.x2 = shadow_area.x1 + corner_size - 1; + blend_area.y1 = shadow_area.y2 - corner_size + 1; + blend_area.y2 = shadow_area.y2; + /*Do not overdraw the other corners*/ + blend_area.y1 = LV_MAX(blend_area.y1, h_half + 1); + blend_area.x2 = LV_MIN(blend_area.x2, w_half - 1); + + if(lv_area_intersect(&clip_area_sub, &blend_area, &t->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + sh_buf_tmp = sh_buf; + sh_buf_tmp += (blend_area.y2 - clip_area_sub.y2) * corner_size; + sh_buf_tmp += clip_area_sub.x1 - blend_area.x1; + + /*Do not mask if out of the bg*/ + if(simple && lv_area_is_out(&clip_area_sub, &bg_area, r_bg)) simple_sub = true; + else simple_sub = simple; + blend_dsc.mask_buf = mask_buf; + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; /*In simple mode it won't be overwritten*/ + for(y = clip_area_sub.y2; y >= clip_area_sub.y1; y--) { + blend_area.y1 = y; + blend_area.y2 = y; + + if(!simple_sub) { + lv_memcpy(mask_buf, sh_buf_tmp, corner_size); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + blend_dsc.mask_buf = sh_buf_tmp; + } + lv_draw_sw_blend(t, &blend_dsc); + sh_buf_tmp += corner_size; + } + } + } + + /*Draw the center rectangle.*/ + blend_area.x1 = shadow_area.x1 + corner_size ; + blend_area.x2 = shadow_area.x2 - corner_size; + blend_area.y1 = shadow_area.y1 + corner_size; + blend_area.y2 = shadow_area.y2 - corner_size; + blend_area.y1 = LV_MIN(blend_area.y1, h_half + 1); + blend_area.y2 = LV_MAX(blend_area.y2, h_half); + blend_dsc.mask_buf = mask_buf; + + if(lv_area_intersect(&clip_area_sub, &blend_area, &t->clip_area) && + !lv_area_is_in(&clip_area_sub, &bg_area, r_bg)) { + int32_t w = lv_area_get_width(&clip_area_sub); + if(w > 0) { + blend_area.x1 = clip_area_sub.x1; + blend_area.x2 = clip_area_sub.x2; + for(y = clip_area_sub.y1; y <= clip_area_sub.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + + lv_memset(mask_buf, 0xff, w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, clip_area_sub.x1, y, w); + lv_draw_sw_blend(t, &blend_dsc); + } + } + } + + if(!simple) { + lv_draw_sw_mask_free_param(&mask_rout_param); + } + lv_free(sh_buf); + lv_free(mask_buf); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Calculate a blurred corner + * @param coords Coordinates of the shadow + * @param sh_buf a buffer to store the result. Its size should be `(sw + r)^2 * 2` + * @param sw shadow width + * @param r radius + */ +static void LV_ATTRIBUTE_FAST_MEM shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t sw, + int32_t r) +{ + int32_t sw_ori = sw; + int32_t size = sw_ori + r; + + lv_area_t sh_area; + lv_area_copy(&sh_area, coords); + sh_area.x2 = sw / 2 + r - 1 - ((sw & 1) ? 0 : 1); + sh_area.y1 = sw / 2 + 1; + + sh_area.x1 = sh_area.x2 - lv_area_get_width(coords); + sh_area.y2 = sh_area.y1 + lv_area_get_height(coords); + + lv_draw_sw_mask_radius_param_t mask_param; + lv_draw_sw_mask_radius_init(&mask_param, &sh_area, r, false); + +#if SHADOW_ENHANCE + /*Set half shadow width because blur will be repeated*/ + if(sw_ori == 1) sw = 1; + else sw = sw_ori >> 1; +#endif /*SHADOW_ENHANCE*/ + + int32_t y; + lv_opa_t * mask_line = lv_malloc(size); + uint16_t * sh_ups_tmp_buf = (uint16_t *)sh_buf; + for(y = 0; y < size; y++) { + lv_memset(mask_line, 0xff, size); + lv_draw_sw_mask_res_t mask_res = mask_param.dsc.cb(mask_line, 0, y, size, &mask_param); + if(mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(sh_ups_tmp_buf, size * sizeof(sh_ups_tmp_buf[0])); + } + else { + int32_t i; + sh_ups_tmp_buf[0] = (mask_line[0] << SHADOW_UPSCALE_SHIFT) / sw; + for(i = 1; i < size; i++) { + if(mask_line[i] == mask_line[i - 1]) sh_ups_tmp_buf[i] = sh_ups_tmp_buf[i - 1]; + else sh_ups_tmp_buf[i] = (mask_line[i] << SHADOW_UPSCALE_SHIFT) / sw; + } + } + + sh_ups_tmp_buf += size; + } + lv_free(mask_line); + + lv_draw_sw_mask_free_param(&mask_param); + + if(sw == 1) { + int32_t i; + lv_opa_t * res_buf = (lv_opa_t *)sh_buf; + for(i = 0; i < size * size; i++) { + res_buf[i] = (sh_buf[i] >> SHADOW_UPSCALE_SHIFT); + } + return; + } + + shadow_blur_corner(size, sw, sh_buf); + +#if SHADOW_ENHANCE == 0 + /*The result is required in lv_opa_t not uint16_t*/ + uint32_t x; + lv_opa_t * res_buf = (lv_opa_t *)sh_buf; + for(x = 0; x < size * size; x++) { + res_buf[x] = sh_buf[x]; + } +#else + sw += sw_ori & 1; + if(sw > 1) { + uint32_t i; + uint32_t max_v_div = (LV_OPA_COVER << SHADOW_UPSCALE_SHIFT) / sw; + for(i = 0; i < (uint32_t)size * size; i++) { + if(sh_buf[i] == 0) continue; + else if(sh_buf[i] == LV_OPA_COVER) sh_buf[i] = max_v_div; + else sh_buf[i] = (sh_buf[i] << SHADOW_UPSCALE_SHIFT) / sw; + } + + shadow_blur_corner(size, sw, sh_buf); + } + int32_t x; + lv_opa_t * res_buf = (lv_opa_t *)sh_buf; + for(x = 0; x < size * size; x++) { + res_buf[x] = (lv_opa_t) sh_buf[x]; + } +#endif + +} + +static void LV_ATTRIBUTE_FAST_MEM shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf) +{ + int32_t s_left = sw >> 1; + int32_t s_right = (sw >> 1); + if((sw & 1) == 0) s_left--; + + /*Horizontal blur*/ + uint16_t * sh_ups_blur_buf = lv_malloc(size * sizeof(uint16_t)); + + int32_t x; + int32_t y; + + uint16_t * sh_ups_tmp_buf = sh_ups_buf; + + for(y = 0; y < size; y++) { + int32_t v = sh_ups_tmp_buf[size - 1] * sw; + for(x = size - 1; x >= 0; x--) { + sh_ups_blur_buf[x] = v; + + /*Forget the right pixel*/ + uint32_t right_val = 0; + if(x + s_right < size) right_val = sh_ups_tmp_buf[x + s_right]; + v -= right_val; + + /*Add the left pixel*/ + uint32_t left_val; + if(x - s_left - 1 < 0) left_val = sh_ups_tmp_buf[0]; + else left_val = sh_ups_tmp_buf[x - s_left - 1]; + v += left_val; + } + lv_memcpy(sh_ups_tmp_buf, sh_ups_blur_buf, size * sizeof(uint16_t)); + sh_ups_tmp_buf += size; + } + + /*Vertical blur*/ + uint32_t i; + uint32_t max_v = LV_OPA_COVER << SHADOW_UPSCALE_SHIFT; + uint32_t max_v_div = max_v / sw; + for(i = 0; i < (uint32_t)size * size; i++) { + if(sh_ups_buf[i] == 0) continue; + else if(sh_ups_buf[i] == max_v) sh_ups_buf[i] = max_v_div; + else sh_ups_buf[i] = sh_ups_buf[i] / sw; + } + + for(x = 0; x < size; x++) { + sh_ups_tmp_buf = &sh_ups_buf[x]; + int32_t v = sh_ups_tmp_buf[0] * sw; + for(y = 0; y < size ; y++, sh_ups_tmp_buf += size) { + sh_ups_blur_buf[y] = v < 0 ? 0 : (v >> SHADOW_UPSCALE_SHIFT); + + /*Forget the top pixel*/ + uint32_t top_val; + if(y - s_right <= 0) top_val = sh_ups_tmp_buf[0]; + else top_val = sh_ups_buf[(y - s_right) * size + x]; + v -= top_val; + + /*Add the bottom pixel*/ + uint32_t bottom_val; + if(y + s_left + 1 < size) bottom_val = sh_ups_buf[(y + s_left + 1) * size + x]; + else bottom_val = sh_ups_buf[(size - 1) * size + x]; + v += bottom_val; + } + + /*Write back the result into `sh_ups_buf`*/ + sh_ups_tmp_buf = &sh_ups_buf[x]; + for(y = 0; y < size; y++, sh_ups_tmp_buf += size) { + (*sh_ups_tmp_buf) = sh_ups_blur_buf[y]; + } + } + + lv_free(sh_ups_blur_buf); +} + +#else /*LV_DRAW_SW_COMPLEX*/ + +void lv_draw_sw_box_shadow(lv_draw_task_t * t, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords) +{ + LV_UNUSED(t); + LV_UNUSED(dsc); + LV_UNUSED(coords); + + LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled"); +} + +#endif /*LV_DRAW_SW_COMPLEX*/ + +#endif /*LV_DRAW_USE_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_fill.c b/inc/lvgl/src/draw/sw/lv_draw_sw_fill.c new file mode 100644 index 0000000..930457f --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_fill.c @@ -0,0 +1,350 @@ +/** + * @file lv_draw_sw_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "../lv_draw_private.h" +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "blend/lv_draw_sw_blend_private.h" +#include "lv_draw_sw_grad.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_text_ap.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_fill(lv_draw_task_t * t, lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + lv_area_t bg_coords; + lv_area_copy(&bg_coords, coords); + + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, &bg_coords, &t->clip_area)) return; + + lv_grad_dir_t grad_dir = dsc->grad.dir; + lv_color_t bg_color = grad_dir == LV_GRAD_DIR_NONE ? dsc->color : dsc->grad.stops[0].color; + + lv_draw_sw_blend_dsc_t blend_dsc = {0}; + blend_dsc.color = bg_color; + + /*Most simple case: just a plain rectangle*/ + if(dsc->radius == 0 && (grad_dir == LV_GRAD_DIR_NONE)) { + blend_dsc.blend_area = &bg_coords; + blend_dsc.opa = dsc->opa; + lv_draw_sw_blend(t, &blend_dsc); + return; + } + + /*Complex case: there is gradient, mask, or radius*/ +#if LV_DRAW_SW_COMPLEX == 0 + LV_LOG_WARN("Can't draw complex rectangle because LV_DRAW_SW_COMPLEX = 0"); +#else + lv_opa_t opa = dsc->opa >= LV_OPA_MAX ? LV_OPA_COVER : dsc->opa; + + /*Get the real radius. Can't be larger than the half of the shortest side */ + int32_t coords_bg_w = lv_area_get_width(&bg_coords); + int32_t coords_bg_h = lv_area_get_height(&bg_coords); + int32_t short_side = LV_MIN(coords_bg_w, coords_bg_h); + int32_t rout = LV_MIN(dsc->radius, short_side >> 1); + + /*Add a radius mask if there is a radius*/ + int32_t clipped_w = lv_area_get_width(&clipped_coords); + lv_opa_t * mask_buf = NULL; + lv_draw_sw_mask_radius_param_t mask_rout_param; + void * mask_list[2] = {NULL, NULL}; + if(rout > 0) { + mask_buf = lv_malloc(clipped_w); + lv_draw_sw_mask_radius_init(&mask_rout_param, &bg_coords, rout, false); + mask_list[0] = &mask_rout_param; + } + + int32_t h; + + lv_area_t blend_area; + blend_area.x1 = clipped_coords.x1; + blend_area.x2 = clipped_coords.x2; + + blend_dsc.mask_buf = mask_buf; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.opa = LV_OPA_COVER; + + /*Get gradient if appropriate*/ + lv_draw_sw_grad_calc_t * grad = lv_draw_sw_grad_get(&dsc->grad, coords_bg_w, coords_bg_h); + lv_opa_t * grad_opa_map = NULL; + bool transp = false; + if(grad && grad_dir >= LV_GRAD_DIR_HOR) { + blend_dsc.src_area = &blend_area; + blend_dsc.src_buf = grad->color_map + clipped_coords.x1 - bg_coords.x1; + uint32_t s; + for(s = 0; s < dsc->grad.stops_count; s++) { + if(dsc->grad.stops[s].opa != LV_OPA_COVER) { + transp = true; + break; + } + } + if(grad_dir == LV_GRAD_DIR_HOR) { + if(transp) grad_opa_map = grad->opa_map + clipped_coords.x1 - bg_coords.x1; + } + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB888; + } + +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + + /*Prepare complex gradient*/ + if(grad_dir >= LV_GRAD_DIR_LINEAR) { + LV_ASSERT_NULL(grad); + switch(grad_dir) { + case LV_GRAD_DIR_LINEAR: + lv_draw_sw_grad_linear_setup(&dsc->grad, coords); + break; + case LV_GRAD_DIR_RADIAL: + lv_draw_sw_grad_radial_setup(&dsc->grad, coords); + break; + case LV_GRAD_DIR_CONICAL: + lv_draw_sw_grad_conical_setup(&dsc->grad, coords); + break; + default: + LV_LOG_WARN("Gradient type is not supported"); + return; + } + blend_dsc.src_area = &blend_area; + /* For complex gradients we reuse the color map buffer for the pixel data */ + blend_dsc.src_buf = grad->color_map; + grad_opa_map = grad->opa_map; + } +#endif + + /* Draw the top of the rectangle line by line and mirror it to the bottom. */ + for(h = 0; h < rout; h++) { + int32_t top_y = bg_coords.y1 + h; + int32_t bottom_y = bg_coords.y2 - h; + if(top_y < clipped_coords.y1 && bottom_y > clipped_coords.y2) continue; /*This line is clipped now*/ + + bool preblend = false; + + /* Initialize the mask to opa instead of 0xFF and blend with LV_OPA_COVER. + * It saves calculating the final opa in lv_draw_sw_blend*/ + lv_memset(mask_buf, opa, clipped_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, top_y, clipped_w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + + bool hor_grad_processed = false; + if(top_y >= clipped_coords.y1) { + blend_area.y1 = top_y; + blend_area.y2 = top_y; + + switch(grad_dir) { + case LV_GRAD_DIR_VER: + LV_ASSERT_NULL(grad); + blend_dsc.color = grad->color_map[top_y - bg_coords.y1]; + blend_dsc.opa = grad->opa_map[top_y - bg_coords.y1]; + break; + case LV_GRAD_DIR_HOR: + hor_grad_processed = true; + preblend = grad_opa_map != NULL; + break; +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + case LV_GRAD_DIR_LINEAR: + lv_draw_sw_grad_linear_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, top_y - bg_coords.y1, coords_bg_w, grad); + preblend = true; + break; + case LV_GRAD_DIR_RADIAL: + lv_draw_sw_grad_radial_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, top_y - bg_coords.y1, coords_bg_w, grad); + preblend = true; + break; + case LV_GRAD_DIR_CONICAL: + lv_draw_sw_grad_conical_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, top_y - bg_coords.y1, coords_bg_w, grad); + preblend = true; + break; +#endif + default: + break; + } + /* pre-blend the mask */ + if(preblend) { + int32_t i; + for(i = 0; i < clipped_w; i++) { + if(grad_opa_map[i] < LV_OPA_MAX) mask_buf[i] = (mask_buf[i] * grad_opa_map[i]) >> 8; + } + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + lv_draw_sw_blend(t, &blend_dsc); + } + + if(bottom_y <= clipped_coords.y2) { + blend_area.y1 = bottom_y; + blend_area.y2 = bottom_y; + + switch(grad_dir) { + case LV_GRAD_DIR_VER: + LV_ASSERT_NULL(grad); + blend_dsc.color = grad->color_map[bottom_y - bg_coords.y1]; + blend_dsc.opa = grad->opa_map[bottom_y - bg_coords.y1]; + break; + case LV_GRAD_DIR_HOR: + preblend = !hor_grad_processed && (grad_opa_map != NULL); + break; +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + case LV_GRAD_DIR_LINEAR: + lv_draw_sw_grad_linear_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, bottom_y - bg_coords.y1, coords_bg_w, + grad); + preblend = true; + break; + case LV_GRAD_DIR_RADIAL: + lv_draw_sw_grad_radial_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, bottom_y - bg_coords.y1, coords_bg_w, + grad); + preblend = true; + break; + case LV_GRAD_DIR_CONICAL: + lv_draw_sw_grad_conical_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, bottom_y - bg_coords.y1, coords_bg_w, + grad); + preblend = true; + break; +#endif + default: + break; + } + /* pre-blend the mask */ + if(preblend) { + int32_t i; + if(grad_dir >= LV_GRAD_DIR_LINEAR) { + /*Need to generate the mask again, because we have mixed in the upper part of the gradient*/ + lv_memset(mask_buf, opa, clipped_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(mask_list, mask_buf, blend_area.x1, top_y, clipped_w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + for(i = 0; i < clipped_w; i++) { + if(grad_opa_map[i] < LV_OPA_MAX) mask_buf[i] = (mask_buf[i] * grad_opa_map[i]) >> 8; + } + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + lv_draw_sw_blend(t, &blend_dsc); + } + } + + /* Draw the center of the rectangle.*/ + + /*If no gradient, the center is a simple rectangle*/ + if(grad_dir == LV_GRAD_DIR_NONE) { + blend_area.y1 = bg_coords.y1 + rout; + blend_area.y2 = bg_coords.y2 - rout; + blend_dsc.opa = opa; + blend_dsc.mask_buf = NULL; + lv_draw_sw_blend(t, &blend_dsc); + } + /*With gradient draw line by line*/ + else { + blend_dsc.opa = opa; + switch(grad_dir) { + case LV_GRAD_DIR_VER: + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_FULL_COVER; + break; + case LV_GRAD_DIR_HOR: + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.mask_buf = grad_opa_map; + break; + case LV_GRAD_DIR_LINEAR: + case LV_GRAD_DIR_RADIAL: + case LV_GRAD_DIR_CONICAL: + blend_dsc.mask_res = transp ? LV_DRAW_SW_MASK_RES_CHANGED : LV_DRAW_SW_MASK_RES_FULL_COVER; + blend_dsc.mask_buf = grad_opa_map; + break; + default: + break; + } + + int32_t h_start = LV_MAX(bg_coords.y1 + rout, clipped_coords.y1); + int32_t h_end = LV_MIN(bg_coords.y2 - rout, clipped_coords.y2); + for(h = h_start; h <= h_end; h++) { + blend_area.y1 = h; + blend_area.y2 = h; + + switch(grad_dir) { + case LV_GRAD_DIR_VER: + LV_ASSERT_NULL(grad); + blend_dsc.color = grad->color_map[h - bg_coords.y1]; + if(opa >= LV_OPA_MAX) blend_dsc.opa = grad->opa_map[h - bg_coords.y1]; + else blend_dsc.opa = LV_OPA_MIX2(grad->opa_map[h - bg_coords.y1], opa); + break; +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + case LV_GRAD_DIR_LINEAR: + lv_draw_sw_grad_linear_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, h - bg_coords.y1, coords_bg_w, grad); + break; + case LV_GRAD_DIR_RADIAL: + lv_draw_sw_grad_radial_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, h - bg_coords.y1, coords_bg_w, grad); + break; + case LV_GRAD_DIR_CONICAL: + lv_draw_sw_grad_conical_get_line(&dsc->grad, clipped_coords.x1 - bg_coords.x1, h - bg_coords.y1, coords_bg_w, grad); + break; +#endif + default: + break; + } + lv_draw_sw_blend(t, &blend_dsc); + } + } + + if(mask_buf) { + lv_free(mask_buf); + lv_draw_sw_mask_free_param(&mask_rout_param); + } + if(grad) { + lv_draw_sw_grad_cleanup(grad); + } +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + if(grad_dir >= LV_GRAD_DIR_LINEAR) { + switch(grad_dir) { + case LV_GRAD_DIR_LINEAR: + lv_draw_sw_grad_linear_cleanup(&dsc->grad); + break; + case LV_GRAD_DIR_RADIAL: + lv_draw_sw_grad_radial_cleanup(&dsc->grad); + break; + case LV_GRAD_DIR_CONICAL: + lv_draw_sw_grad_conical_cleanup(&dsc->grad); + break; + default: + break; + } + } +#endif + +#endif +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_grad.c b/inc/lvgl/src/draw/sw/lv_draw_sw_grad.c new file mode 100644 index 0000000..090f55d --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_grad.c @@ -0,0 +1,614 @@ +/** + * @file lv_draw_sw_grad.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_grad.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_types.h" +#include "../../osal/lv_os_private.h" +#include "../../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#define GRAD_CM(r,g,b) lv_color_make(r,g,b) +#define GRAD_CONV(t, x) t = x + +#undef ALIGN +#if defined(LV_ARCH_64) + #define ALIGN(X) (((X) + 7) & ~7) +#else + #define ALIGN(X) (((X) + 3) & ~3) +#endif + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + +typedef struct { + /* w = (-b(xp, yp) + sqrt(sqr(b(xp, yp)) - 4 * a * c(xp, yp))) / (2 * a) */ + int32_t x0; /* center of the start circle */ + int32_t y0; /* center of the start circle */ + int32_t r0; /* radius of the start circle */ + int32_t inv_dr; /* 1 / (r1 - r0) */ + int32_t a4; /* 4 * a */ + int32_t inv_a4; /* 1 / (4 * a) */ + int32_t dx; + /* b(xp, yp) = xp * bpx + yp * bpy + bc */ + int32_t bpx; + int32_t bpy; + int32_t bc; + lv_area_t clip_area; + lv_draw_sw_grad_calc_t * cgrad; /*256 element cache buffer containing the gradient color map*/ +} lv_grad_radial_state_t; + +typedef struct { + /* w = a * xp + b * yp + c */ + int32_t a; + int32_t b; + int32_t c; + lv_draw_sw_grad_calc_t * cgrad; /*256 element cache buffer containing the gradient color map*/ +} lv_grad_linear_state_t; + +typedef struct { + /* w = a * xp + b * yp + c */ + int32_t x0; + int32_t y0; + int32_t a; + int32_t da; + int32_t inv_da; + lv_draw_sw_grad_calc_t * cgrad; /*256 element cache buffer containing the gradient color map*/ +} lv_grad_conical_state_t; + +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ +typedef lv_result_t (*op_cache_t)(lv_draw_sw_grad_calc_t * c, void * ctx); +static lv_draw_sw_grad_calc_t * allocate_item(const lv_grad_dsc_t * g, int32_t w, int32_t h); + +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + + static inline int32_t extend_w(int32_t w, lv_grad_extend_t extend); + +#endif + +/********************** + * STATIC VARIABLE + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_draw_sw_grad_calc_t * allocate_item(const lv_grad_dsc_t * g, int32_t w, int32_t h) +{ + int32_t size; + switch(g->dir) { + case LV_GRAD_DIR_HOR: + case LV_GRAD_DIR_LINEAR: + case LV_GRAD_DIR_RADIAL: + case LV_GRAD_DIR_CONICAL: + size = w; + break; + case LV_GRAD_DIR_VER: + size = h; + break; + default: + size = 64; + } + + size_t req_size = ALIGN(sizeof(lv_draw_sw_grad_calc_t)) + ALIGN(size * sizeof(lv_color_t)) + ALIGN(size * sizeof( + lv_opa_t)); + lv_draw_sw_grad_calc_t * item = lv_malloc(req_size); + LV_ASSERT_MALLOC(item); + if(item == NULL) return NULL; + + uint8_t * p = (uint8_t *)item; + item->color_map = (lv_color_t *)(p + ALIGN(sizeof(*item))); + item->opa_map = (lv_opa_t *)(p + ALIGN(sizeof(*item)) + ALIGN(size * sizeof(lv_color_t))); + item->size = size; + return item; +} + +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + +static inline int32_t extend_w(int32_t w, lv_grad_extend_t extend) +{ + if(extend == LV_GRAD_EXTEND_PAD) { /**< Repeat the same color*/ + return w < 0 ? 0 : LV_MIN(w, 255); + } + if(extend == LV_GRAD_EXTEND_REPEAT) { /**< Repeat the pattern*/ + return w & 255; + } + /*LV_GRAD_EXTEND_REFLECT*/ + w &= 511; + if(w > 255) + w ^= 511; /* 511 - w */ + return w; +} + +#endif + +/********************** + * FUNCTIONS + **********************/ + +lv_draw_sw_grad_calc_t * lv_draw_sw_grad_get(const lv_grad_dsc_t * g, int32_t w, int32_t h) +{ + /* No gradient, no cache */ + if(g->dir == LV_GRAD_DIR_NONE) return NULL; + + /* Step 1: Search cache for the given key */ + lv_draw_sw_grad_calc_t * item = allocate_item(g, w, h); + if(item == NULL) { + LV_LOG_WARN("Failed to allocate item for the gradient"); + return item; + } + + /* Step 3: Fill it with the gradient, as expected */ + uint32_t i; + for(i = 0; i < item->size; i++) { + lv_draw_sw_grad_color_calculate(g, item->size, i, &item->color_map[i], &item->opa_map[i]); + } + return item; +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_grad_color_calculate(const lv_grad_dsc_t * dsc, int32_t range, + int32_t frac, lv_color_t * color_out, lv_opa_t * opa_out) +{ + lv_color_t tmp; + /*Clip out-of-bounds first*/ + int32_t min = (dsc->stops[0].frac * range) >> 8; + if(frac <= min) { + GRAD_CONV(tmp, dsc->stops[0].color); + *color_out = tmp; + *opa_out = dsc->stops[0].opa; + return; + } + + int32_t max = (dsc->stops[dsc->stops_count - 1].frac * range) >> 8; + if(frac >= max) { + GRAD_CONV(tmp, dsc->stops[dsc->stops_count - 1].color); + *color_out = tmp; + *opa_out = dsc->stops[dsc->stops_count - 1].opa; + return; + } + + /*Find the 2 closest stop now*/ + int32_t d = 0; + int32_t found_i = 0; + for(uint8_t i = 1; i < dsc->stops_count; i++) { + int32_t cur = (dsc->stops[i].frac * range) >> 8; + if(frac <= cur) { + found_i = i; + break; + } + } + + LV_ASSERT(found_i != 0); + + lv_color_t one, two; + one = dsc->stops[found_i - 1].color; + two = dsc->stops[found_i].color; + min = (dsc->stops[found_i - 1].frac * range) >> 8; + max = (dsc->stops[found_i].frac * range) >> 8; + d = max - min; + + /*Then interpolate*/ + frac -= min; + lv_opa_t mix = (frac * 255) / d; + lv_opa_t imix = 255 - mix; + + *color_out = GRAD_CM(LV_UDIV255(two.red * mix + one.red * imix), + LV_UDIV255(two.green * mix + one.green * imix), + LV_UDIV255(two.blue * mix + one.blue * imix)); + + *opa_out = LV_UDIV255(dsc->stops[found_i].opa * mix + dsc->stops[found_i - 1].opa * imix); +} + +void lv_draw_sw_grad_cleanup(lv_draw_sw_grad_calc_t * grad) +{ + lv_free(grad); +} + + +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + +/* + Calculate radial gradient based on the following equation: + + | P - (C1 - C0)w - C0 | = (r1 - r0)w + r0, where + + P: {xp, yp} is the point of interest + C0: {x0, y0} is the center of the start circle + C1: {x1, y1} is the center of the end circle + r0 is the radius of the start circle + r1 is the radius of the end circle + w is the unknown variable + || is the length of the vector + + The above equation can be rewritten as: + + ((r1-r0)^2 - (x1-x0)^2 - (y1-y0)^2) * w^2 + 2*((xp-x0)*(x1-x0) + (yp-y0)*(y1-y0)) * w + (-(xp-x0)^2 - (yp-y0)^) = 0 + + The roots of the quadratical equation can be obtained using the well-known formula (-b +- sqrt(b^2 - 4ac)) / 2a + We only need the more positive root. + + Let's denote + dx = x1 - x0 + dy = y1 - y0 + dr = r1 - r0 + + Thus: + + w = (-b(xp, yp) + sqrt(sqr(b(xp, yp)) - 4 * a * c(xp, yp))) / (2 * a), where + + b(xp, yp) = 2dx * xp + 2dy * yp + 2(r0 * dr - x0 * dx - y0 * dy) + c(xp, yp) = r0^2 - (xp - x0)^2 - (yp - y0)^2 + + Rewrite b(xp, yp) as: + + b(xp, yp) = xp * bpx + yp * bpy + bc, where + + bpx = 2dx + bpy = 2dy + bc = 2(r0 * dr - x0 * dx - y0 * dy) + + We can pre-calculate the constants, because they do not depend on the pixel coordinates. + +*/ + +void lv_draw_sw_grad_radial_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords) +{ + lv_point_t start = dsc->params.radial.focal; + lv_point_t end = dsc->params.radial.end; + lv_point_t start_extent = dsc->params.radial.focal_extent; + lv_point_t end_extent = dsc->params.radial.end_extent; + lv_grad_radial_state_t * state = lv_malloc(sizeof(lv_grad_radial_state_t)); + dsc->state = state; + + /* Convert from percentage coordinates */ + int32_t wdt = lv_area_get_width(coords); + int32_t hgt = lv_area_get_height(coords); + + start.x = lv_pct_to_px(start.x, wdt); + end.x = lv_pct_to_px(end.x, wdt); + start_extent.x = lv_pct_to_px(start_extent.x, wdt); + end_extent.x = lv_pct_to_px(end_extent.x, wdt); + start.y = lv_pct_to_px(start.y, hgt); + end.y = lv_pct_to_px(end.y, hgt); + start_extent.y = lv_pct_to_px(start_extent.y, hgt); + end_extent.y = lv_pct_to_px(end_extent.y, hgt); + + /* Calculate radii */ + int16_t r_start = lv_sqrt32(lv_sqr(start_extent.x - start.x) + lv_sqr(start_extent.y - start.y)); + int16_t r_end = lv_sqrt32(lv_sqr(end_extent.x - end.x) + lv_sqr(end_extent.y - end.y)); + LV_ASSERT(r_end != 0); + + /* Create gradient color map */ + state->cgrad = lv_draw_sw_grad_get(dsc, 256, 0); + + state->x0 = start.x; + state->y0 = start.y; + state->r0 = r_start; + int32_t dr = r_end - r_start; + if(end.x == start.x && end.y == start.y) { + LV_ASSERT(dr != 0); + state->a4 = lv_sqr(dr) << 2; + state->bpx = 0; + state->bpy = 0; + state->bc = (state->r0 * dr) << 1; + state->dx = 0; + state->inv_dr = (1 << (8 + 16)) / dr; + } + else { + int32_t dx = end.x - start.x; + int32_t dy = end.y - start.y; + state->dx = dx; /* needed for incremental calculation */ + state->a4 = (lv_sqr(dr) - lv_sqr(dx) - lv_sqr(dy)) << 2; + /* b(xp, yp) = xp * bpx + yp * bpy + bc */ + state->bpx = dx << 1; + state->bpy = dy << 1; + state->bc = (state->r0 * dr - state->x0 * dx - state->y0 * dy) << 1; + } + state->inv_a4 = state->a4 != 0 ? (1 << (13 + 16)) / state->a4 : 0; + /* check for possible clipping */ + if(dsc->extend == LV_GRAD_EXTEND_PAD && + /* if extend mode is 'pad', then we can clip to the end circle's bounding box, if the start circle is entirely within the end circle */ + (lv_sqr(start.x - end.x) + lv_sqr(start.y - end.y) < lv_sqr(r_end - r_start))) { + if(r_end > r_start) { + lv_area_set(&state->clip_area, end.x - r_end, end.y - r_end, end.x + r_end, end.y + r_end); + } + else { + lv_area_set(&state->clip_area, start.x - r_start, start.y - r_start, start.x + r_start, start.y + r_start); + } + } + else { + state->clip_area.x1 = -0x7fffffff; + } +} + +void lv_draw_sw_grad_radial_cleanup(lv_grad_dsc_t * dsc) +{ + lv_grad_radial_state_t * state = dsc->state; + if(state == NULL) + return; + if(state->cgrad) + lv_draw_sw_grad_cleanup(state->cgrad); + lv_free(state); +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_grad_radial_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, + int32_t width, lv_draw_sw_grad_calc_t * result) +{ + lv_grad_radial_state_t * state = (lv_grad_radial_state_t *)dsc->state; + lv_color_t * buf = result->color_map; + lv_opa_t * opa = result->opa_map; + lv_draw_sw_grad_calc_t * grad = state->cgrad; + + int32_t w; /* the result: this is an offset into the 256 element gradient color table */ + int32_t b, db, c, dc; + + /* check for possible clipping */ + if(state->clip_area.x1 != -0x7fffffff) { + /* fill line with end color for pixels outside the clipped region */ + lv_color_t * _buf = buf; + lv_opa_t * _opa = opa; + lv_color_t _c = grad->color_map[255]; + lv_opa_t _o = grad->opa_map[255]; + int32_t _w = width; + for(; _w > 0; _w--) { + *_buf++ = _c; + *_opa++ = _o; + } + /* is this line fully outside the clip area? */ + if(yp < state->clip_area.y1 || + yp >= state->clip_area.y2 || + xp >= state->clip_area.x2 || + xp + width < state->clip_area.x1) { + return; + } + else { /* not fully outside: clip line to the bounding box */ + int32_t _x1 = LV_MAX(xp, state->clip_area.x1); + int32_t _x2 = LV_MIN(xp + width, state->clip_area.x2); + buf += _x1 - xp; + opa += _x1 - xp; + xp = _x1; + width = _x2 - _x1; + } + } + + b = xp * state->bpx + yp * state->bpy + state->bc; + c = lv_sqr(state->r0) - lv_sqr(xp - state->x0) - lv_sqr(yp - state->y0); + /* We can save some calculations by using the previous values of b and c */ + db = state->dx << 1; + dc = ((xp - state->x0) << 1) + 1; + + if(state->a4 == 0) { /* not a quadratic equation: solve linear equation: w = -c/b */ + for(; width > 0; width--) { + w = extend_w(b == 0 ? 0 : -(c << 8) / b, dsc->extend); + *buf++ = grad->color_map[w]; + *opa++ = grad->opa_map[w]; + b += db; + c -= dc; + dc += 2; + } + } + else { /* solve quadratical equation */ + if(state->bpx || + state->bpy) { /* general case (circles are not concentric): w = (-b + sqrt(b^2 - 4ac))/2a (we only need the more positive root)*/ + int32_t a4 = state->a4 >> 4; + for(; width > 0; width--) { + int32_t det = lv_sqr(b >> 4) - (a4 * (c >> 4)); /* b^2 shifted down by 2*4=8, 4ac shifted down by 8 */ + /* check determinant: if negative, then there is no solution: use starting color */ + w = det < 0 ? 0 : extend_w(((lv_sqrt32(det) - (b >> 4)) * state->inv_a4) >> 16, + dsc->extend); /* square root shifted down by 4 (includes *256 to set output range) */ + *buf++ = grad->color_map[w]; + *opa++ = grad->opa_map[w]; + b += db; + c -= dc; + dc += 2; + } + } + else { /* special case: concentric circles: w = (sqrt((xp-x0)^2 + (yx-y0)^2)-r0)/(r1-r0) */ + c = lv_sqr(xp - state->x0) + lv_sqr(yp - state->y0); + for(; width > 0; width--) { + w = extend_w((((lv_sqrt32(c) - state->r0)) * state->inv_dr) >> 16, dsc->extend); + *buf++ = grad->color_map[w]; + *opa++ = grad->opa_map[w]; + c += dc; + dc += 2; + } + } + } +} + +/* + Calculate linear gradient based on the following equation: + + w = ((P - C0) x (C1 - C0)) / | C1 - C0 |^2, where + + P: {xp, yp} is the point of interest + C0: {x0, y0} is the start point of the gradient vector + C1: {x1, y1} is the end point of the gradient vector + w is the unknown variable + + || is the length of the vector + x is a dot product + + The above equation can be rewritten as: + + w = xp * (dx / (dx^2 + dy^2)) + yp * (dy / (dx^2 + dy^2)) - (x0 * dx + y0 * dy) / (dx^2 + dy^2), where + + dx = x1 - x0 + dy = y1 - y0 + + We can pre-calculate the constants, because they do not depend on the pixel coordinates. + +*/ + +void lv_draw_sw_grad_linear_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords) +{ + lv_point_t start = dsc->params.linear.start; + lv_point_t end = dsc->params.linear.end; + lv_grad_linear_state_t * state = lv_malloc(sizeof(lv_grad_linear_state_t)); + dsc->state = state; + + /* Create gradient color map */ + state->cgrad = lv_draw_sw_grad_get(dsc, 256, 0); + + /* Convert from percentage coordinates */ + int32_t wdt = lv_area_get_width(coords); + int32_t hgt = lv_area_get_height(coords); + + start.x = lv_pct_to_px(start.x, wdt); + end.x = lv_pct_to_px(end.x, wdt); + start.y = lv_pct_to_px(start.y, hgt); + end.y = lv_pct_to_px(end.y, hgt); + + /* Precalculate constants */ + int32_t dx = end.x - start.x; + int32_t dy = end.y - start.y; + + int32_t l2 = lv_sqr(dx) + lv_sqr(dy); + if(l2 == 0) l2 = 1; + state->a = (dx << 16) / l2; + state->b = (dy << 16) / l2; + state->c = ((start.x * dx + start.y * dy) << 16) / l2; +} + +void lv_draw_sw_grad_linear_cleanup(lv_grad_dsc_t * dsc) +{ + lv_grad_linear_state_t * state = dsc->state; + if(state == NULL) + return; + if(state->cgrad) + lv_free(state->cgrad); + lv_free(state); +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_grad_linear_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, + int32_t width, lv_draw_sw_grad_calc_t * result) +{ + lv_grad_linear_state_t * state = (lv_grad_linear_state_t *)dsc->state; + lv_color_t * buf = result->color_map; + lv_opa_t * opa = result->opa_map; + lv_draw_sw_grad_calc_t * grad = state->cgrad; + + int32_t w; /* the result: this is an offset into the 256 element gradient color table */ + int32_t x, d; + + x = xp * state->a + yp * state->b - state->c; + d = state->a; + + for(; width > 0; width--) { + w = extend_w(x >> 8, dsc->extend); + *buf++ = grad->color_map[w]; + *opa++ = grad->opa_map[w]; + x += d; + } +} + +/* + Calculate conical gradient based on the following equation: + + w = (atan((yp - y0)/(xp - x0)) - alpha) / (beta - alpha), where + + P: {xp, yp} is the point of interest + C0: {x0, y0} is the center of the gradient + alpha is the start angle + beta is the end angle + w is the unknown variable +*/ + +void lv_draw_sw_grad_conical_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords) +{ + lv_point_t c0 = dsc->params.conical.center; + int32_t alpha = dsc->params.conical.start_angle % 360; + int32_t beta = dsc->params.conical.end_angle % 360; + lv_grad_conical_state_t * state = lv_malloc(sizeof(lv_grad_conical_state_t)); + dsc->state = state; + + /* Create gradient color map */ + state->cgrad = lv_draw_sw_grad_get(dsc, 256, 0); + + /* Convert from percentage coordinates */ + int32_t wdt = lv_area_get_width(coords); + int32_t hgt = lv_area_get_height(coords); + + c0.x = lv_pct_to_px(c0.x, wdt); + c0.y = lv_pct_to_px(c0.y, hgt); + + /* Precalculate constants */ + if(beta <= alpha) + beta += 360; + state->x0 = c0.x; + state->y0 = c0.y; + state->a = alpha; + state->da = beta - alpha; + state->inv_da = (1 << 16) / (beta - alpha); +} + +void lv_draw_sw_grad_conical_cleanup(lv_grad_dsc_t * dsc) +{ + lv_grad_conical_state_t * state = dsc->state; + if(state == NULL) + return; + if(state->cgrad) + lv_free(state->cgrad); + lv_free(state); +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_grad_conical_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, + int32_t width, lv_draw_sw_grad_calc_t * result) +{ + lv_grad_conical_state_t * state = (lv_grad_conical_state_t *)dsc->state; + lv_color_t * buf = result->color_map; + lv_opa_t * opa = result->opa_map; + lv_draw_sw_grad_calc_t * grad = state->cgrad; + + int32_t w; /* the result: this is an offset into the 256 element gradient color table */ + int32_t dx = xp - state->x0; + int32_t dy = yp - state->y0; + + if(dy == 0) { /* we will eventually go through the center of the conical: need an extra test in the loop to avoid both dx and dy being zero in atan2 */ + for(; width > 0; width--) { + if(dx == 0) { + w = 0; + } + else { + int32_t d = lv_atan2(dy, dx) - state->a; + if(d < 0) + d += 360; + w = extend_w((d * state->inv_da) >> 8, dsc->extend); + } + *buf++ = grad->color_map[w]; + *opa++ = grad->opa_map[w]; + dx++; + } + } + else { + for(; width > 0; width--) { + int32_t d = lv_atan2(dy, dx) - state->a; + if(d < 0) + d += 360; + w = extend_w((d * state->inv_da) >> 8, dsc->extend); + *buf++ = grad->color_map[w]; + *opa++ = grad->opa_map[w]; + dx++; + } + } +} + +#endif /* LV_USE_DRAW_SW_COMPLEX_GRADIENTS */ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_grad.h b/inc/lvgl/src/draw/sw/lv_draw_sw_grad.h new file mode 100644 index 0000000..3033119 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_grad.h @@ -0,0 +1,147 @@ +/** + * @file lv_draw_sw_grad.h + * + */ + +#ifndef LV_DRAW_SW_GRAD_H +#define LV_DRAW_SW_GRAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" +#include "../../misc/lv_style.h" + +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_color_t * color_map; + lv_opa_t * opa_map; + uint32_t size; +} lv_draw_sw_grad_calc_t; + + +/********************** + * PROTOTYPES + **********************/ + +/** Compute the color in the given gradient and fraction + * Gradient are specified in a virtual [0-255] range, so this function scales the virtual range to the given range + * @param dsc The gradient descriptor to use + * @param range The range to use in computation. + * @param frac The current part used in the range. frac is in [0; range] + * @param color_out Calculated gradient color + * @param opa_out Calculated opacity + */ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_grad_color_calculate(const lv_grad_dsc_t * dsc, int32_t range, + int32_t frac, lv_color_t * color_out, lv_opa_t * opa_out); + +/** Get a gradient cache from the given parameters */ +lv_draw_sw_grad_calc_t * lv_draw_sw_grad_get(const lv_grad_dsc_t * gradient, int32_t w, int32_t h); + +/** + * Clean up the gradient item after it was get with `lv_grad_get_from_cache`. + * @param grad pointer to a gradient + */ +void lv_draw_sw_grad_cleanup(lv_draw_sw_grad_calc_t * grad); + +#if LV_USE_DRAW_SW_COMPLEX_GRADIENTS + + +/** + * Calculate constants from the given parameters that are used during rendering + * @param dsc gradient descriptor + * @param coords the area where to draw the gradient + */ +void lv_draw_sw_grad_linear_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords); + +/** + * Free up the allocated memory for the gradient calculation + * @param dsc gradient descriptor + */ +void lv_draw_sw_grad_linear_cleanup(lv_grad_dsc_t * dsc); + +/** + * Calculate a line segment of a linear gradient + * @param dsc gradient descriptor + * @param xp starting point x coordinate in gradient space + * @param yp starting point y coordinate in gradient space + * @param width width of the line segment in pixels + * @param result color buffer for the resulting line segment + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_grad_linear_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, + int32_t width, + lv_draw_sw_grad_calc_t * result); + +/** + * Calculate constants from the given parameters that are used during rendering + * @param dsc gradient descriptor + * @param coords the area where to draw the gradient + */ +void lv_draw_sw_grad_radial_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords); + +/** + * Free up the allocated memory for the gradient calculation + * @param dsc gradient descriptor + */ +void lv_draw_sw_grad_radial_cleanup(lv_grad_dsc_t * dsc); + +/** + * Calculate a line segment of a radial gradient + * @param dsc gradient descriptor + * @param xp starting point x coordinate in gradient space + * @param yp starting point y coordinate in gradient space + * @param width width of the line segment in pixels + * @param result color buffer for the resulting line segment + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_grad_radial_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, + int32_t width, + lv_draw_sw_grad_calc_t * result); + +/** + * Calculate constants from the given parameters that are used during rendering + * @param dsc gradient descriptor + * @param coords the area where to draw the gradient + */ +void lv_draw_sw_grad_conical_setup(lv_grad_dsc_t * dsc, const lv_area_t * coords); + +/** + * Free up the allocated memory for the gradient calculation + * @param dsc gradient descriptor + */ +void lv_draw_sw_grad_conical_cleanup(lv_grad_dsc_t * dsc); + +/** + * Calculate a line segment of a conical gradient + * @param dsc gradient descriptor + * @param xp starting point x coordinate in gradient space + * @param yp starting point y coordinate in gradient space + * @param width width of the line segment in pixels + * @param result color buffer for the resulting line segment + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_grad_conical_get_line(lv_grad_dsc_t * dsc, int32_t xp, int32_t yp, + int32_t width, + lv_draw_sw_grad_calc_t * result); + +#endif /*LV_USE_DRAW_SW_COMPLEX_GRADIENTS*/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_GRAD_H*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_img.c b/inc/lvgl/src/draw/sw/lv_draw_sw_img.c new file mode 100644 index 0000000..b401a08 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_img.c @@ -0,0 +1,1065 @@ +/** + * @file lv_draw_sw_img.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_area_private.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_image_decoder_private.h" +#include "../lv_draw_image_private.h" +#include "../lv_draw_private.h" +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "../../display/lv_display.h" +#include "../../display/lv_display_private.h" +#include "../../misc/lv_log.h" +#include "../../core/lv_refr_private.h" +#include "../../stdlib/lv_mem.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_color.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_global.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "arm2d/lv_draw_sw_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ +#define MAX_BUF_SIZE (uint32_t) (4 * lv_display_get_horizontal_resolution(lv_refr_get_disp_refreshing()) * lv_color_format_get_size(lv_display_get_color_format(lv_refr_get_disp_refreshing()))) + +#ifndef LV_DRAW_SW_IMAGE + #define LV_DRAW_SW_IMAGE(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_RECOLOR + #define LV_DRAW_SW_RGB565_RECOLOR(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_RECOLOR + #define LV_DRAW_SW_RGB565_SWAPPED_RECOLOR(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_RECOLOR + #define LV_DRAW_SW_RGB888_RECOLOR(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_RECOLOR + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_RECOLOR(...) LV_RESULT_INVALID +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + + +static void img_draw_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + + +#if LV_DRAW_SW_COMPLEX +static void radius_only(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); +#endif /*LV_DRAW_SW_COMPLEX*/ + +static void recolor_only(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +static void transform_and_recolor(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area); + +static void recolor(lv_area_t relative_area, uint8_t * src_buf, uint8_t * dest_buf, int32_t src_stride, + lv_color_format_t cf, const lv_draw_image_dsc_t * draw_dsc); + +static void colorkey_and_recolor(lv_area_t relative_area, uint8_t * src_buf, uint8_t * dest_buf, int32_t src_stride, + lv_color_format_t cf, const lv_draw_image_dsc_t * draw_dsc, lv_draw_sw_blend_dsc_t * blend_dsc); + +static bool apply_mask(const lv_draw_image_dsc_t * draw_dsc); + +/********************** + * STATIC VARIABLES + **********************/ +#define _draw_info LV_GLOBAL_DEFAULT()->draw_info + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_layer(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords) +{ + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + + /*It can happen that nothing was draw on a layer and therefore its buffer is not allocated. + *In this case just return. */ + if(layer_to_draw->draw_buf == NULL) return; + + if(draw_dsc->bitmap_mask_src) { + bool visible = apply_mask(draw_dsc); + if(!visible) return; + } + + /*The source should be a draw_buf, not a layer*/ + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = layer_to_draw->draw_buf; + + lv_draw_sw_image(t, &new_draw_dsc, coords); + +#if LV_USE_LAYER_DEBUG || LV_USE_PARALLEL_DRAW_DEBUG + lv_area_t area_rot; + lv_area_copy(&area_rot, coords); + if(draw_dsc->rotation || draw_dsc->scale_x != LV_SCALE_NONE || draw_dsc->scale_y != LV_SCALE_NONE) { + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + + lv_image_buf_get_transformed_area(&area_rot, w, h, draw_dsc->rotation, draw_dsc->scale_x, draw_dsc->scale_y, + &draw_dsc->pivot); + + area_rot.x1 += coords->x1; + area_rot.y1 += coords->y1; + area_rot.x2 += coords->x1; + area_rot.y2 += coords->y1; + } + lv_area_t draw_area; + if(!lv_area_intersect(&draw_area, &area_rot, &t->clip_area)) return; +#endif + +#if LV_USE_LAYER_DEBUG + { + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_hex(layer_to_draw->color_format == LV_COLOR_FORMAT_ARGB8888 ? 0xff0000 : 0x00ff00); + fill_dsc.opa = LV_OPA_20; + lv_draw_sw_fill(t, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = fill_dsc.color; + border_dsc.opa = LV_OPA_60; + border_dsc.width = 2; + lv_draw_sw_border(t, &border_dsc, &area_rot); + } + +#endif + +#if LV_USE_PARALLEL_DRAW_DEBUG + { + int32_t idx = t->draw_unit->idx; + + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); + fill_dsc.opa = LV_OPA_10; + lv_draw_sw_fill(t, &fill_dsc, &area_rot); + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.color = lv_palette_main(idx % LV_PALETTE_LAST); + border_dsc.opa = LV_OPA_60; + border_dsc.width = 1; + lv_draw_sw_border(t, &border_dsc, &area_rot); + + lv_point_t txt_size; + lv_text_get_size_attributes(&txt_size, "W", LV_FONT_DEFAULT, 0, 0, 100, LV_TEXT_FLAG_NONE); + + lv_area_t txt_area; + txt_area.x1 = draw_area.x1; + txt_area.x2 = draw_area.x1 + txt_size.x - 1; + txt_area.y2 = draw_area.y2; + txt_area.y1 = draw_area.y2 - txt_size.y + 1; + + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.color = lv_color_black(); + lv_draw_sw_fill(t, &fill_dsc, &txt_area); + + char buf[8]; + lv_snprintf(buf, sizeof(buf), "%d", idx); + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.color = lv_color_white(); + label_dsc.text = buf; + lv_draw_sw_label(t, &label_dsc, &txt_area); + } +#endif +} + +void lv_draw_sw_image(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + if(!draw_dsc->tile) { + lv_draw_image_normal_helper(t, draw_dsc, coords, img_draw_core, NULL); + } + else { + lv_draw_image_tiled_helper(t, draw_dsc, coords, img_draw_core, NULL); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void img_draw_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE || + draw_dsc->scale_y != LV_SCALE_NONE ? true : false; + + bool radius = draw_dsc->clip_radius > 0; + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + const uint8_t * src_buf = decoded->data; + const lv_image_header_t * header = &decoded->header; + uint32_t img_stride = decoded->header.stride; + lv_color_format_t cf = decoded->header.cf; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.opa = draw_dsc->opa; + blend_dsc.blend_mode = draw_dsc->blend_mode; + blend_dsc.src_stride = img_stride; + + if(!transformed && !radius && cf == LV_COLOR_FORMAT_A8) { + lv_area_t clipped_coords; + if(!lv_area_intersect(&clipped_coords, img_coords, &t->clip_area)) return; + + blend_dsc.mask_buf = (lv_opa_t *)src_buf; + blend_dsc.mask_area = img_coords; + blend_dsc.mask_stride = img_stride; + blend_dsc.src_buf = NULL; + blend_dsc.color = draw_dsc->recolor; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + + blend_dsc.blend_area = img_coords; + lv_draw_sw_blend(t, &blend_dsc); + } + else if(!transformed && !radius && cf == LV_COLOR_FORMAT_RGB565A8 && draw_dsc->recolor_opa <= LV_OPA_MIN && + draw_dsc->colorkey == NULL) { + int32_t src_h = lv_area_get_height(img_coords); + int32_t src_w = lv_area_get_width(img_coords); + blend_dsc.src_area = img_coords; + blend_dsc.src_buf = src_buf; + blend_dsc.mask_buf = (lv_opa_t *)src_buf; + blend_dsc.mask_buf += img_stride * src_w / header->w * src_h; + /** + * Note, for RGB565A8, lacking of stride parameter, we always use + * always half of RGB map stride as alpha map stride. The image should + * be generated in this way too. + */ + blend_dsc.mask_stride = img_stride / 2; + blend_dsc.blend_area = img_coords; + blend_dsc.mask_area = img_coords; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; + lv_draw_sw_blend(t, &blend_dsc); + } + else if(!transformed && !radius && (cf == LV_COLOR_FORMAT_L8 || cf == LV_COLOR_FORMAT_AL88) && + draw_dsc->colorkey == NULL) { + blend_dsc.src_area = img_coords; + blend_dsc.src_buf = src_buf; + blend_dsc.blend_area = img_coords; + blend_dsc.src_color_format = cf; + lv_draw_sw_blend(t, &blend_dsc); + } + /*The simplest case just copy the pixels into the draw_buf. Blending will convert the colors if needed*/ + else if(!transformed && !radius && draw_dsc->recolor_opa <= LV_OPA_MIN && draw_dsc->colorkey == NULL) { + blend_dsc.src_area = img_coords; + blend_dsc.src_buf = src_buf; + blend_dsc.blend_area = img_coords; + blend_dsc.src_color_format = cf; + lv_draw_sw_blend(t, &blend_dsc); + } + else if(!transformed && !radius && draw_dsc->recolor_opa > LV_OPA_MIN && draw_dsc->colorkey == NULL) { + recolor_only(t, draw_dsc, decoder_dsc, img_coords, clipped_img_area); + } +#if LV_DRAW_SW_COMPLEX + /*Handle masked RGB565, RGB888, XRGB888, or ARGB8888 images*/ + else if(!transformed && radius && draw_dsc->recolor_opa <= LV_OPA_MIN && draw_dsc->colorkey == NULL) { + radius_only(t, draw_dsc, decoder_dsc, img_coords, clipped_img_area); + } +#endif /*LV_DRAW_SW_COMPLEX*/ + /* check whether it is possible to accelerate the operation in synchronous mode */ + else if(LV_RESULT_INVALID == LV_DRAW_SW_IMAGE(transformed, /* whether require transform */ + cf, /* image format */ + src_buf, /* image buffer */ + img_coords, /* src_h, src_w, src_x1, src_y1 */ + img_stride, /* image stride */ + clipped_img_area, /* blend area */ + t, /* target buffer, buffer width, buffer height, buffer stride */ + draw_dsc)) { /* opa, recolour_opa and colour */ + /*In the other cases every pixel need to be checked one-by-one*/ + transform_and_recolor(t, draw_dsc, decoder_dsc, sup, img_coords, clipped_img_area); + + } +} +#if LV_DRAW_SW_COMPLEX +static void radius_only(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + uint32_t img_stride = decoded->header.stride; + lv_color_format_t cf = decoded->header.cf; + lv_color_format_t cf_ori = cf; + + if(cf == LV_COLOR_FORMAT_RGB565A8) { + cf = LV_COLOR_FORMAT_RGB565; + } + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.opa = draw_dsc->opa; + blend_dsc.blend_mode = draw_dsc->blend_mode; + blend_dsc.src_stride = img_stride; + blend_dsc.src_area = img_coords; + blend_dsc.src_buf = decoded->data; + blend_dsc.src_color_format = cf; + + lv_area_t blend_area = *clipped_img_area; + blend_dsc.blend_area = &blend_area; + int32_t y_last = blend_area.y2; + blend_area.y2 = blend_area.y1; + + int32_t blend_w = lv_area_get_width(&blend_area); + uint8_t * mask_buf = lv_malloc(blend_w); + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_stride = blend_w; + + if(cf == LV_COLOR_FORMAT_A8) { + blend_dsc.src_buf = NULL; + blend_dsc.color = draw_dsc->recolor; + } + + lv_draw_sw_mask_radius_param_t mask_param; + lv_draw_sw_mask_radius_init(&mask_param, &draw_dsc->image_area, draw_dsc->clip_radius, false); + + void * masks[2] = {0}; + masks[0] = &mask_param; + + int32_t image_h = lv_area_get_height(img_coords); + while(blend_area.y1 <= y_last) { + if(cf_ori == LV_COLOR_FORMAT_RGB565A8) { + const uint8_t * mask_start = decoded->data + img_stride * image_h; + int32_t y_ofs = blend_area.y1 - img_coords->y1; + int32_t x_ofs = blend_area.x1 - img_coords->x1; + lv_memcpy(mask_buf, mask_start + y_ofs * img_stride / 2 + x_ofs, blend_w); + } + else if(cf_ori == LV_COLOR_FORMAT_A8) { + int32_t y_ofs = blend_area.y1 - img_coords->y1; + int32_t x_ofs = blend_area.x1 - img_coords->x1; + lv_memcpy(mask_buf, decoded->data + y_ofs * img_stride + x_ofs, blend_w); + } + else { + lv_memset(mask_buf, 0xff, blend_w); + + } + + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, blend_area.x1, blend_area.y1, blend_w); + + if(cf_ori == LV_COLOR_FORMAT_RGB565A8 || cf_ori == LV_COLOR_FORMAT_A8) { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + + /*Blend*/ + lv_draw_sw_blend(t, &blend_dsc); + + /*Go to the next area*/ + blend_area.y1 ++; + blend_area.y2 ++; + } + lv_free(mask_buf); + +} +#endif /*LV_DRAW_SW_COMPLEX*/ + +static void recolor_only(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) +{ + lv_area_t blend_area = *clipped_img_area; + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + uint32_t img_stride = decoded->header.stride; + lv_color_format_t cf = decoded->header.cf; + uint32_t px_size = lv_color_format_get_size(cf); + int32_t src_h = lv_area_get_height(img_coords); + int32_t blend_w = lv_area_get_width(&blend_area); + int32_t blend_h = lv_area_get_height(&blend_area); + uint8_t * tmp_buf; + int32_t buf_h; + uint32_t buf_stride = blend_w * px_size; + if(buf_stride == 0) { + buf_stride = 1; + } + buf_h = MAX_BUF_SIZE / buf_stride; + if(buf_h > blend_h) buf_h = blend_h; + tmp_buf = lv_malloc(buf_stride * buf_h); + LV_ASSERT_MALLOC(tmp_buf); + if(!tmp_buf) { + LV_LOG_WARN("Failed to perform image recolor operation. Out of memory"); + return; + } + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.opa = draw_dsc->opa; + blend_dsc.blend_mode = draw_dsc->blend_mode; + blend_dsc.src_stride = blend_w * px_size; + blend_dsc.src_area = &blend_area; + blend_dsc.blend_area = &blend_area; + blend_dsc.src_buf = tmp_buf; + blend_dsc.src_color_format = cf; + if(cf == LV_COLOR_FORMAT_RGB565A8) { + blend_dsc.mask_area = img_coords; + blend_dsc.mask_buf = decoded->data + img_stride * src_h; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; + blend_dsc.mask_stride = img_stride / 2; + } + + int32_t y_last = blend_area.y2; + blend_area.y2 = blend_area.y1 + buf_h - 1; + while(blend_area.y1 <= y_last) { + lv_area_t relative_area; + lv_area_copy(&relative_area, &blend_area); + lv_area_move(&relative_area, -img_coords->x1, -img_coords->y1); + + recolor(relative_area, decoded->data, tmp_buf, img_stride, blend_dsc.src_color_format, draw_dsc); + + lv_draw_sw_blend(t, &blend_dsc); + + /*Go to the next area*/ + blend_area.y1 = blend_area.y2 + 1; + blend_area.y2 = blend_area.y1 + buf_h - 1; + if(blend_area.y2 > y_last) { + blend_area.y2 = y_last; + } + + } + + lv_free(tmp_buf); + +} + +static void transform_and_recolor(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, + const lv_area_t * img_coords, const lv_area_t * clipped_img_area) + +{ + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + uint32_t img_stride = decoded->header.stride; + lv_color_format_t cf = decoded->header.cf; + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); + blend_dsc.opa = draw_dsc->opa; + blend_dsc.blend_mode = draw_dsc->blend_mode; + + lv_area_t blend_area = *clipped_img_area; + blend_dsc.blend_area = &blend_area; + + int32_t src_w = lv_area_get_width(img_coords); + int32_t src_h = lv_area_get_height(img_coords); + int32_t blend_w = lv_area_get_width(&blend_area); + int32_t blend_h = lv_area_get_height(&blend_area); + + bool do_recolor = draw_dsc->recolor_opa > LV_OPA_MIN; + if(cf == LV_COLOR_FORMAT_L8 || cf == LV_COLOR_FORMAT_A8) { + blend_dsc.color = draw_dsc->recolor; + do_recolor = false; + } + + bool has_colorkey = draw_dsc->colorkey != NULL; + + lv_color_format_t cf_final = cf; + if(cf_final == LV_COLOR_FORMAT_RGB888 || cf_final == LV_COLOR_FORMAT_XRGB8888) cf_final = LV_COLOR_FORMAT_ARGB8888; + else if(cf_final == LV_COLOR_FORMAT_RGB565 || + cf_final == LV_COLOR_FORMAT_RGB565_SWAPPED) cf_final = LV_COLOR_FORMAT_RGB565A8; + else if(cf_final == LV_COLOR_FORMAT_L8) cf_final = LV_COLOR_FORMAT_AL88; + + uint8_t * transformed_buf; + int32_t buf_h; + if(cf_final == LV_COLOR_FORMAT_RGB565A8) { + uint32_t buf_stride = blend_w * 3; + buf_h = MAX_BUF_SIZE / buf_stride; + if(buf_h > blend_h) buf_h = blend_h; + transformed_buf = lv_malloc(buf_stride * buf_h); + } + else if(cf_final == LV_COLOR_FORMAT_AL88) { + uint32_t buf_stride = blend_w; + buf_h = MAX_BUF_SIZE / (buf_stride * 2); + if(buf_h > blend_h) buf_h = blend_h; + transformed_buf = lv_malloc(buf_stride * buf_h * 2); + } + else { + uint32_t buf_stride = blend_w * lv_color_format_get_size(cf_final); + buf_h = MAX_BUF_SIZE / buf_stride; + if(buf_h > blend_h) buf_h = blend_h; + transformed_buf = lv_malloc(buf_stride * buf_h); + } + LV_ASSERT_MALLOC(transformed_buf); + + blend_dsc.src_buf = transformed_buf; + blend_dsc.src_color_format = cf_final; + int32_t y_last = blend_area.y2; + blend_area.y2 = blend_area.y1 + buf_h - 1; + + blend_dsc.src_area = &blend_area; + const uint8_t * src_buf = decoded->data; + if(cf_final == LV_COLOR_FORMAT_RGB565A8) { + /*RGB565A8 images will blended as RGB565 + mask + *Therefore the stride can be different. */ + blend_dsc.src_stride = blend_w * 2; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.mask_buf = transformed_buf + blend_w * 2 * buf_h; + blend_dsc.mask_stride = blend_w; + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; + } + else if(cf_final == LV_COLOR_FORMAT_AL88) { + /*AL88 images will be blended as L8 + mask*/ + blend_dsc.src_stride = blend_w; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.mask_buf = transformed_buf + blend_w * buf_h; + blend_dsc.mask_stride = blend_w; + blend_dsc.src_color_format = LV_COLOR_FORMAT_L8; + } + else if(cf_final == LV_COLOR_FORMAT_A8) { + blend_dsc.mask_buf = transformed_buf; + blend_dsc.mask_stride = blend_w; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + blend_dsc.src_buf = NULL; + } + else { + blend_dsc.src_stride = blend_w * lv_color_format_get_size(cf_final); + } + + while(blend_area.y1 <= y_last) { + /*Apply transformations if any or separate the channels*/ + lv_area_t relative_area; + lv_area_copy(&relative_area, &blend_area); + lv_area_move(&relative_area, -img_coords->x1, -img_coords->y1); + lv_draw_sw_transform(&relative_area, src_buf, src_w, src_h, img_stride, + draw_dsc, sup, cf, transformed_buf); + + if(do_recolor || has_colorkey) { + lv_area_t relative_area2; + lv_area_copy(&relative_area2, &blend_area); + lv_area_move(&relative_area2, -blend_area.x1, -blend_area.y1); + if(has_colorkey && cf_final != LV_COLOR_FORMAT_RGB565_SWAPPED) { + colorkey_and_recolor(relative_area2, transformed_buf, transformed_buf, blend_dsc.src_stride, cf_final, draw_dsc, + &blend_dsc); + } + else { + recolor(relative_area2, transformed_buf, transformed_buf, blend_dsc.src_stride, cf_final, draw_dsc); + } + } + + /*Blend*/ + lv_draw_sw_blend(t, &blend_dsc); + + /*Go to the next area*/ + blend_area.y1 = blend_area.y2 + 1; + blend_area.y2 = blend_area.y1 + buf_h - 1; + if(blend_area.y2 > y_last) { + blend_area.y2 = y_last; + if(cf_final == LV_COLOR_FORMAT_RGB565A8) { + blend_dsc.mask_buf = transformed_buf + blend_w * 2 * lv_area_get_height(&blend_area); + } + else if(cf_final == LV_COLOR_FORMAT_AL88) { + blend_dsc.mask_buf = transformed_buf + blend_w * lv_area_get_height(&blend_area); + } + } + } + + lv_free(transformed_buf); +} + +static void colorkey_and_recolor(lv_area_t relative_area, uint8_t * src_buf, uint8_t * dest_buf, int32_t src_stride, + lv_color_format_t cf, const lv_draw_image_dsc_t * draw_dsc, lv_draw_sw_blend_dsc_t * blend_dsc) +{ + int32_t w = lv_area_get_width(&relative_area); + int32_t h = lv_area_get_height(&relative_area); + + /* Recolor parameters */ + lv_color_t recolor = draw_dsc->recolor; + lv_opa_t mix = draw_dsc->recolor_opa; + lv_opa_t mix_inv = 255 - mix; + + /* Colorkey parameters */ + lv_color_t colorkey_low = draw_dsc->colorkey->low; + lv_color_t colorkey_high = draw_dsc->colorkey->high; + if(cf == LV_COLOR_FORMAT_RGB565A8 || cf == LV_COLOR_FORMAT_RGB565) { + const uint8_t * src_buf_tmp = src_buf + src_stride * relative_area.y1 + relative_area.x1 * 2; + int32_t img_stride_px = src_stride / 2; + + uint16_t * buf16_src = (uint16_t *)src_buf_tmp; + uint16_t * buf16_dest = (uint16_t *)dest_buf; + uint16_t recolor16 = lv_color_to_u16(recolor); + + uint16_t c_mult[3]; + c_mult[0] = (recolor.blue >> 3) * mix; + c_mult[1] = (recolor.green >> 2) * mix; + c_mult[2] = (recolor.red >> 3) * mix; + uint8_t * mask_buf_tmp = (uint8_t *)blend_dsc->mask_buf; + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + lv_color_t src_color = lv_color16_to_color(*(lv_color16_t *)&buf16_src[x]); + + /* Check colorkey */ + if(lv_color_is_in_range(src_color, colorkey_low, colorkey_high)) { + if(cf == LV_COLOR_FORMAT_RGB565A8 && mask_buf_tmp) { + mask_buf_tmp[x] = 0; + } + else { + *buf16_dest = 0x0000; // Transparent + } + } + /* Apply recolor */ + else if(mix >= LV_OPA_MAX) { + *buf16_dest = recolor16; + } + else if(mix > LV_OPA_MIN) { + uint16_t src16 = buf16_src[x]; + *buf16_dest = (((c_mult[2] + ((src16 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + (((c_mult[1] + ((src16 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + ((c_mult[0] + (src16 & 0x1F) * mix_inv) >> 8); + } + else { + *buf16_dest = buf16_src[x]; // No change + } + buf16_dest++; + } + buf16_src += img_stride_px; + mask_buf_tmp += blend_dsc->mask_stride; + } + } + else if(cf == LV_COLOR_FORMAT_RGB888 || cf == LV_COLOR_FORMAT_XRGB8888 || cf == LV_COLOR_FORMAT_ARGB8888) { + uint32_t px_size = lv_color_format_get_size(cf); + const uint8_t * src_buf_tmp = src_buf + src_stride * relative_area.y1 + relative_area.x1 * px_size; + uint8_t * dest_buf_tmp = dest_buf; + + uint16_t c_mult[3]; + c_mult[0] = recolor.blue * mix; + c_mult[1] = recolor.green * mix; + c_mult[2] = recolor.red * mix; + + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + lv_color_t src_color; + src_color.blue = src_buf_tmp[0]; + src_color.green = src_buf_tmp[1]; + src_color.red = src_buf_tmp[2]; + + /* Check colorkey */ + if(lv_color_is_in_range(src_color, colorkey_low, colorkey_high)) { + dest_buf_tmp[0] = 0; + dest_buf_tmp[1] = 0; + dest_buf_tmp[2] = 0; + if(cf == LV_COLOR_FORMAT_ARGB8888) { + dest_buf_tmp[3] = 0; // Set alpha to 0 + } + } + /* Apply recolor */ + else if(mix >= LV_OPA_MAX) { + dest_buf_tmp[0] = recolor.blue; + dest_buf_tmp[1] = recolor.green; + dest_buf_tmp[2] = recolor.red; + if(cf == LV_COLOR_FORMAT_ARGB8888) { + dest_buf_tmp[3] = src_buf_tmp[3]; // Keep original alpha + } + } + else if(mix > LV_OPA_MIN) { + dest_buf_tmp[0] = (c_mult[0] + (src_buf_tmp[0] * mix_inv)) >> 8; + dest_buf_tmp[1] = (c_mult[1] + (src_buf_tmp[1] * mix_inv)) >> 8; + dest_buf_tmp[2] = (c_mult[2] + (src_buf_tmp[2] * mix_inv)) >> 8; + if(cf == LV_COLOR_FORMAT_ARGB8888) { + dest_buf_tmp[3] = src_buf_tmp[3]; // Keep original alpha + } + } + else { + // Copy as-is + dest_buf_tmp[0] = src_buf_tmp[0]; + dest_buf_tmp[1] = src_buf_tmp[1]; + dest_buf_tmp[2] = src_buf_tmp[2]; + if(cf == LV_COLOR_FORMAT_ARGB8888) { + dest_buf_tmp[3] = src_buf_tmp[3]; + } + } + + src_buf_tmp += px_size; + dest_buf_tmp += px_size; + } + src_buf_tmp += (src_stride - w * px_size); + } + } + else if(cf == LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED) { + uint32_t px_size = 4; + const uint8_t * src_buf_tmp = src_buf + src_stride * relative_area.y1 + relative_area.x1 * px_size; + uint8_t * dest_buf_tmp = dest_buf; + + uint16_t c_mult[3]; + c_mult[0] = recolor.blue * mix; + c_mult[1] = recolor.green * mix; + c_mult[2] = recolor.red * mix; + + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + uint8_t alpha = src_buf_tmp[3]; + + // Only process if pixel is visible + if(alpha > 0) { + /* Unpremultiply for color comparison and recolor */ + uint16_t reciprocal = (255 * 256) / alpha; + uint8_t r = (src_buf_tmp[2] * reciprocal) >> 8; + uint8_t g = (src_buf_tmp[1] * reciprocal) >> 8; + uint8_t b = (src_buf_tmp[0] * reciprocal) >> 8; + + lv_color_t src_color = lv_color_make(r, g, b); + + /* Check colorkey */ + if(lv_color_is_in_range(src_color, colorkey_low, colorkey_high)) { + // Set entire pixel to transparent + dest_buf_tmp[0] = 0; + dest_buf_tmp[1] = 0; + dest_buf_tmp[2] = 0; + dest_buf_tmp[3] = 0; + } + /* Apply recolor */ + else { + if(mix >= LV_OPA_MAX) { + r = recolor.red; + g = recolor.green; + b = recolor.blue; + } + else if(mix > LV_OPA_MIN) { + r = (c_mult[2] + (r * mix_inv)) >> 8; + g = (c_mult[1] + (g * mix_inv)) >> 8; + b = (c_mult[0] + (b * mix_inv)) >> 8; + } + // Else keep original colors + + /* Premultiply again */ + dest_buf_tmp[0] = (b * alpha) >> 8; + dest_buf_tmp[1] = (g * alpha) >> 8; + dest_buf_tmp[2] = (r * alpha) >> 8; + dest_buf_tmp[3] = alpha; // Keep original alpha + } + } + else { + // Already transparent, copy as-is + dest_buf_tmp[0] = src_buf_tmp[0]; + dest_buf_tmp[1] = src_buf_tmp[1]; + dest_buf_tmp[2] = src_buf_tmp[2]; + dest_buf_tmp[3] = 0; // Ensure alpha is 0 + } + + src_buf_tmp += px_size; + dest_buf_tmp += px_size; + } + src_buf_tmp += (src_stride - w * px_size); + } + } +} + +static void recolor(lv_area_t relative_area, uint8_t * src_buf, uint8_t * dest_buf, int32_t src_stride, + lv_color_format_t cf, const lv_draw_image_dsc_t * draw_dsc) +{ + int32_t w = lv_area_get_width(&relative_area); + int32_t h = lv_area_get_height(&relative_area); + + /*Apply recolor*/ + lv_color_t color = draw_dsc->recolor; + lv_opa_t mix = draw_dsc->recolor_opa; + lv_opa_t mix_inv = 255 - mix; + + if(cf == LV_COLOR_FORMAT_RGB565A8 || cf == LV_COLOR_FORMAT_RGB565) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_RECOLOR(dest_buf, relative_area, color, mix)) { + const uint8_t * src_buf_tmp = src_buf + src_stride * relative_area.y1 + relative_area.x1 * 2; + int32_t img_stride_px = src_stride / 2; + + uint16_t * buf16_src = (uint16_t *)src_buf_tmp; + uint16_t * buf16_dest = (uint16_t *)dest_buf; + uint16_t color16 = lv_color_to_u16(color); + if(mix >= LV_OPA_MAX) { + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + *buf16_dest = color16; + buf16_dest++; + } + buf16_src += img_stride_px; + } + } + else { + uint16_t c_mult[3]; + c_mult[0] = (color.blue >> 3) * mix; + c_mult[1] = (color.green >> 2) * mix; + c_mult[2] = (color.red >> 3) * mix; + + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + *buf16_dest = (((c_mult[2] + ((buf16_src[x] >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + (((c_mult[1] + ((buf16_src[x] >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + ((c_mult[0] + (buf16_src[x] & 0x1F) * mix_inv) >> 8); + buf16_dest++; + } + buf16_src += img_stride_px; + } + } + } + } + else if(cf == LV_COLOR_FORMAT_RGB565_SWAPPED) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_RECOLOR(dest_buf, relative_area, color, mix)) { + const uint8_t * src_buf_tmp = src_buf + src_stride * relative_area.y1 + relative_area.x1 * 2; + int32_t img_stride_px = src_stride / 2; + + uint16_t * buf16_src = (uint16_t *)src_buf_tmp; + uint16_t * buf16_dest = (uint16_t *)dest_buf; + uint16_t color16 = lv_color_to_u16(color); + if(mix >= LV_OPA_MAX) { + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + *buf16_dest = color16; + buf16_dest++; + } + buf16_src += img_stride_px; + } + } + else { + uint16_t c_mult[3]; + c_mult[0] = (color.blue >> 3) * mix; + c_mult[1] = (color.green >> 2) * mix; + c_mult[2] = (color.red >> 3) * mix; + + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + *buf16_dest = lv_color_swap_16((((c_mult[2] + ((lv_color_swap_16(buf16_src[x]) >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + + (((c_mult[1] + ((lv_color_swap_16(buf16_src[x]) >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + ((c_mult[0] + (lv_color_swap_16(buf16_src[x]) & 0x1F) * mix_inv) >> 8)); + buf16_dest++; + } + buf16_src += img_stride_px; + } + } + } + } + else if(cf == LV_COLOR_FORMAT_RGB888 || cf == LV_COLOR_FORMAT_XRGB8888 || cf == LV_COLOR_FORMAT_ARGB8888) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_RECOLOR(dest_buf, relative_area, color, mix, cf)) { + uint32_t px_size = lv_color_format_get_size(cf); + src_buf += src_stride * relative_area.y1 + relative_area.x1 * px_size; + if(mix >= LV_OPA_MAX) { + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + dest_buf[0] = color.blue; + dest_buf[1] = color.green; + dest_buf[2] = color.red; + if(cf == LV_COLOR_FORMAT_ARGB8888) dest_buf[3] = src_buf[3]; + src_buf += px_size; + dest_buf += px_size; + } + src_buf += src_stride - w * px_size; + } + } + else { + uint16_t c_mult[3]; + c_mult[0] = color.blue * mix; + c_mult[1] = color.green * mix; + c_mult[2] = color.red * mix; + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + dest_buf[0] = (c_mult[0] + (src_buf[0] * mix_inv)) >> 8; + dest_buf[1] = (c_mult[1] + (src_buf[1] * mix_inv)) >> 8; + dest_buf[2] = (c_mult[2] + (src_buf[2] * mix_inv)) >> 8; + if(cf == LV_COLOR_FORMAT_ARGB8888) dest_buf[3] = src_buf[3]; + src_buf += px_size; + dest_buf += px_size; + } + src_buf += src_stride - w * px_size; + } + } + } + } + else if(cf == LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_RECOLOR(dest_buf, relative_area, color, mix, cf)) { + uint32_t px_size = lv_color_format_get_size(cf); + src_buf += src_stride * relative_area.y1 + relative_area.x1 * px_size; + + uint16_t c_mult[3]; + c_mult[0] = color.blue * mix; + c_mult[1] = color.green * mix; + c_mult[2] = color.red * mix; + + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + uint8_t alpha = src_buf[3]; + + if(alpha > 0) { + /* Step 1: Unpremultiply (convert to non-premultiplied RGB) */ + uint16_t reciprocal = (255 * 256) / alpha; + uint8_t r = (src_buf[2] * reciprocal) >> 8; + uint8_t g = (src_buf[1] * reciprocal) >> 8; + uint8_t b = (src_buf[0] * reciprocal) >> 8; + + /* Step 2: Apply recoloring */ + r = (c_mult[2] + (r * mix_inv)) >> 8; + g = (c_mult[1] + (g * mix_inv)) >> 8; + b = (c_mult[0] + (b * mix_inv)) >> 8; + + /* Step 3: Premultiply again */ + dest_buf[0] = (b * alpha) >> 8; + dest_buf[1] = (g * alpha) >> 8; + dest_buf[2] = (r * alpha) >> 8; + } + else { + /* If alpha is 0, just copy the pixel as is */ + dest_buf[0] = src_buf[0]; + dest_buf[1] = src_buf[1]; + dest_buf[2] = src_buf[2]; + } + + dest_buf[3] = alpha; /* Keep original alpha*/ + + src_buf += px_size; + dest_buf += px_size; + } + src_buf += src_stride - w * px_size; + } + } + } +} + +static bool apply_mask(const lv_draw_image_dsc_t * draw_dsc) +{ + lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src; + lv_draw_buf_t * image_draw_buf = layer_to_draw->draw_buf; + lv_image_decoder_dsc_t mask_decoder_dsc; + lv_area_t mask_area; + uint32_t mask_stride; + + lv_result_t decoder_res = lv_image_decoder_open(&mask_decoder_dsc, draw_dsc->bitmap_mask_src, NULL); + if(decoder_res != LV_RESULT_OK || mask_decoder_dsc.decoded == NULL) { + if(decoder_res == LV_RESULT_OK) lv_image_decoder_close(&mask_decoder_dsc); + LV_LOG_WARN("Could open the mask. The mask is not applied."); + return true; + } + + if(mask_decoder_dsc.decoded->header.cf != LV_COLOR_FORMAT_A8 && + mask_decoder_dsc.decoded->header.cf != LV_COLOR_FORMAT_L8) { + lv_image_decoder_close(&mask_decoder_dsc); + LV_LOG_WARN("The mask image is not A8/L8 format. The mask is not applied."); + return true; + + } + + const lv_draw_buf_t * mask_draw_buf = mask_decoder_dsc.decoded; + mask_stride = mask_draw_buf->header.stride; + + /*Align the mask to the center*/ + lv_area_t image_area; + image_area = draw_dsc->image_area; /*Use the whole image area for the alignment*/ + lv_area_set(&mask_area, 0, 0, mask_draw_buf->header.w - 1, mask_draw_buf->header.h - 1); + lv_area_align(&image_area, &mask_area, LV_ALIGN_CENTER, 0, 0); + + image_area = + layer_to_draw->buf_area; /*The image can be smaller if only a part was rendered. Use this are during rendering*/ + + /*Only the intersection of the mask and image needs to be rendered + *If if there is no intersection there is nothing to render as the image is out of the mask.*/ + lv_area_t masked_area; + if(!lv_area_intersect(&masked_area, &mask_area, &image_area)) { + lv_image_decoder_close(&mask_decoder_dsc); + return false; + } + + /*Clear the sides if any*/ + lv_area_t side_area = {0}; + /*Top*/ + side_area.x2 = layer_to_draw->draw_buf->header.w - 1; + side_area.y2 = masked_area.y1 - 1 - image_area.y1; + lv_draw_buf_clear(layer_to_draw->draw_buf, &side_area); + + /*Bottom*/ + side_area.y1 = masked_area.y2 + 1 - image_area.y1; + side_area.y2 = layer_to_draw->draw_buf->header.h - 1; + lv_draw_buf_clear(layer_to_draw->draw_buf, &side_area); + + /*Left*/ + side_area.y1 = 0; + side_area.x1 = 0; + side_area.x2 = masked_area.x1 - 1 - image_area.x1; + lv_draw_buf_clear(layer_to_draw->draw_buf, &side_area); + + /*Right*/ + side_area.x1 = masked_area.x2 + 1 - image_area.x1; + side_area.x2 = layer_to_draw->draw_buf->header.w - 1; + lv_draw_buf_clear(layer_to_draw->draw_buf, &side_area); + + /*Seek to the first of the image and mask on the masked area*/ + uint8_t * img_start = lv_draw_buf_goto_xy(image_draw_buf, + masked_area.x1 - image_area.x1, + masked_area.y1 - image_area.y1); + uint8_t * mask_start = lv_draw_buf_goto_xy(mask_decoder_dsc.decoded, + masked_area.x1 - mask_area.x1, + masked_area.y1 - mask_area.y1); + + int32_t h = lv_area_get_height(&masked_area); + int32_t w = lv_area_get_width(&masked_area); + + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + img_start[x * 4 + 3] = LV_OPA_MIX2(mask_start[x], img_start[x * 4 + 3]); + } + img_start += layer_to_draw->draw_buf->header.stride; + mask_start += mask_stride; + } + + lv_image_decoder_close(&mask_decoder_dsc); + + return true; +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_letter.c b/inc/lvgl/src/draw/sw/lv_draw_sw_letter.c new file mode 100644 index 0000000..c57632b --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_letter.c @@ -0,0 +1,444 @@ +/** + * @file lv_draw_sw_letter.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_draw_label_private.h" +#include "../../draw/lv_draw_private.h" +#include "lv_draw_sw.h" + +#if LV_USE_FREETYPE && LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + + #include "../../libs/freetype/lv_freetype_private.h" + #include "../lv_draw_vector_private.h" + +#endif + +#if LV_USE_DRAW_SW + +#include "../../display/lv_display.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_style.h" +#include "../../font/lv_font.h" +#include "../../core/lv_refr_private.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +#if LV_USE_FREETYPE && LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + +typedef struct { + lv_vector_path_t * inside_path; /*The regular glyph*/ + lv_vector_path_t * outside_path; /*A bigger glyph that goes in the background for the letter outline*/ + lv_vector_path_t * cur_path; +} lv_draw_sw_letter_outlines_t; + +#endif /* LV_USE_FREETYPE && LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG */ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +#if LV_USE_FREETYPE && LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + + static void freetype_outline_event_cb(lv_event_t * e); + static void draw_letter_outline(lv_draw_task_t * t, lv_draw_glyph_dsc_t * dsc); + +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_letter(lv_draw_task_t * t, const lv_draw_letter_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) + return; + + LV_PROFILER_DRAW_BEGIN; + + lv_draw_glyph_dsc_t glyph_dsc; + lv_draw_glyph_dsc_init(&glyph_dsc); + glyph_dsc.opa = dsc->opa; + glyph_dsc.bg_coords = NULL; + glyph_dsc.color = dsc->color; + glyph_dsc.rotation = dsc->rotation; + glyph_dsc.pivot = dsc->pivot; + + lv_draw_unit_draw_letter(t, &glyph_dsc, &(lv_point_t) { + .x = coords->x1, .y = coords->y1 + }, + dsc->font, dsc->unicode, draw_letter_cb); + + if(glyph_dsc._draw_buf) { + lv_draw_buf_destroy(glyph_dsc._draw_buf); + glyph_dsc._draw_buf = NULL; + } + + LV_PROFILER_DRAW_END; +} + +void lv_draw_sw_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) return; + + LV_PROFILER_DRAW_BEGIN; + +#if LV_USE_FREETYPE && LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + static bool is_init = false; + if(!is_init) { + lv_freetype_outline_add_event(freetype_outline_event_cb, LV_EVENT_ALL, t); + is_init = true; + } +#endif + + lv_draw_label_iterate_characters(t, dsc, coords, draw_letter_cb); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM draw_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + if(glyph_draw_dsc) { + switch(glyph_draw_dsc->format) { + case LV_FONT_GLYPH_FORMAT_NONE: { +#if LV_USE_FONT_PLACEHOLDER + if(glyph_draw_dsc->bg_coords == NULL) break; + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + lv_draw_sw_border(t, &border_draw_dsc, glyph_draw_dsc->bg_coords); +#endif + } + break; + case LV_FONT_GLYPH_FORMAT_A1: + case LV_FONT_GLYPH_FORMAT_A2: + case LV_FONT_GLYPH_FORMAT_A3: + case LV_FONT_GLYPH_FORMAT_A4: + case LV_FONT_GLYPH_FORMAT_A8: + case LV_FONT_GLYPH_FORMAT_IMAGE: { + if(glyph_draw_dsc->rotation % 3600 == 0 && glyph_draw_dsc->format != LV_FONT_GLYPH_FORMAT_IMAGE) { + lv_area_t mask_area = *glyph_draw_dsc->letter_coords; + + if(lv_font_has_static_bitmap(glyph_draw_dsc->g->resolved_font) && + glyph_draw_dsc->g->format == LV_FONT_GLYPH_FORMAT_A8) { + glyph_draw_dsc->g->req_raw_bitmap = 1; + const void * bitmap = lv_font_get_glyph_static_bitmap(glyph_draw_dsc->g); + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.color = glyph_draw_dsc->color; + blend_dsc.opa = glyph_draw_dsc->opa; + blend_dsc.mask_buf = bitmap; + blend_dsc.mask_area = &mask_area; + blend_dsc.mask_stride = glyph_draw_dsc->g->stride; + blend_dsc.blend_area = glyph_draw_dsc->letter_coords; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(t, &blend_dsc); + } + else { + glyph_draw_dsc->glyph_data = lv_font_get_glyph_bitmap(glyph_draw_dsc->g, glyph_draw_dsc->_draw_buf); + if(glyph_draw_dsc->glyph_data == NULL) { + LV_LOG_WARN("Couldn't get the bitmap of a glyph"); + break; + } + + mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1; + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.color = glyph_draw_dsc->color; + blend_dsc.opa = glyph_draw_dsc->opa; + const lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data; + blend_dsc.mask_buf = draw_buf->data; + blend_dsc.mask_area = &mask_area; + blend_dsc.mask_stride = draw_buf->header.stride; + blend_dsc.blend_area = glyph_draw_dsc->letter_coords; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(t, &blend_dsc); + } + } + else { + glyph_draw_dsc->glyph_data = lv_font_get_glyph_bitmap(glyph_draw_dsc->g, glyph_draw_dsc->_draw_buf); + lv_draw_image_dsc_t img_dsc; + lv_draw_image_dsc_init(&img_dsc); + img_dsc.rotation = glyph_draw_dsc->rotation; + img_dsc.scale_x = LV_SCALE_NONE; + img_dsc.scale_y = LV_SCALE_NONE; + img_dsc.opa = glyph_draw_dsc->opa; + img_dsc.src = glyph_draw_dsc->glyph_data; + img_dsc.recolor = glyph_draw_dsc->color; + img_dsc.pivot = (lv_point_t) { + .x = glyph_draw_dsc->pivot.x, + .y = glyph_draw_dsc->g->box_h + glyph_draw_dsc->g->ofs_y + }; + lv_draw_sw_image(t, &img_dsc, glyph_draw_dsc->letter_coords); + } + break; + } + break; +#if LV_USE_FREETYPE && LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + case LV_FONT_GLYPH_FORMAT_VECTOR: { + draw_letter_outline(t, glyph_draw_dsc); + } + break; +#endif + default: + break; + } + } + + if(fill_draw_dsc && fill_area) { + lv_draw_sw_fill(t, fill_draw_dsc, fill_area); + } +} + +#if LV_USE_FREETYPE && LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG + +/* + * Renders the vectors paths representing a glyph with ThorVG + * the result is then blended into the draw buffer + */ +static void draw_letter_outline(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_dsc) +{ + + lv_draw_sw_letter_outlines_t * glyph_paths; + lv_draw_vector_dsc_t * vector_dsc; + lv_draw_buf_t * draw_buf; + lv_matrix_t matrix; + lv_layer_t layer; + + glyph_paths = (lv_draw_sw_letter_outlines_t *) glyph_dsc->glyph_data; + LV_ASSERT_NULL(glyph_paths); + + int32_t cf; + int32_t w; + int32_t h; + uint32_t stride; + float scale; + lv_area_t buf_area; + + cf = LV_COLOR_FORMAT_ARGB8888; + + scale = LV_FREETYPE_F26DOT6_TO_FLOAT(lv_freetype_outline_get_scale(glyph_dsc->g->resolved_font)); + w = (int32_t)((float) glyph_dsc->g->box_w + glyph_dsc->outline_stroke_width * 2 * scale); + h = (int32_t)((float) glyph_dsc->g->box_h + glyph_dsc->outline_stroke_width * 2 * scale); + buf_area.x1 = 0; + buf_area.y1 = 0; + lv_area_set_width(&buf_area, w); + lv_area_set_height(&buf_area, h); + + stride = lv_draw_buf_width_to_stride(w, cf); + draw_buf = lv_draw_buf_create(w, h, cf, stride); + lv_draw_buf_clear(draw_buf, NULL); + + lv_memzero(&layer, sizeof(lv_layer_t)); + layer.draw_buf = draw_buf; + layer.color_format = cf; + layer.buf_area = buf_area; + layer.phy_clip_area = buf_area; + layer._clip_area = buf_area; + + lv_memzero(&matrix, sizeof(lv_matrix_t)); + + lv_matrix_identity(&matrix); + + vector_dsc = lv_draw_vector_dsc_create(&layer); + + int32_t offset_x; + int32_t offset_y; + + offset_x = (int32_t)((float) glyph_dsc->g->ofs_x - glyph_dsc->outline_stroke_width * scale); + offset_y = (int32_t)((float) glyph_dsc->g->ofs_y - glyph_dsc->outline_stroke_width * scale); + + /*Invert Y-Axis - Freetype's origin point is in the bottom left corner*/ + lv_matrix_scale(&matrix, 1, -1); + lv_matrix_translate(&matrix, -offset_x, -h - offset_y); + lv_matrix_scale(&matrix, scale, scale); + lv_draw_vector_dsc_set_transform(vector_dsc, &matrix); + + /*Set attributes color, line width etc*/ + if(cf == LV_COLOR_FORMAT_ARGB8888) { + + if(glyph_dsc->outline_stroke_width > 0) { + lv_draw_vector_dsc_set_fill_color(vector_dsc, glyph_dsc->outline_stroke_color); + lv_draw_vector_dsc_set_fill_opa(vector_dsc, glyph_dsc->outline_stroke_opa); + lv_draw_vector_dsc_add_path(vector_dsc, glyph_paths->outside_path); + } + + lv_draw_vector_dsc_set_fill_color(vector_dsc, glyph_dsc->color); + lv_draw_vector_dsc_set_fill_opa(vector_dsc, glyph_dsc->opa); + lv_draw_vector_dsc_add_path(vector_dsc, glyph_paths->inside_path); + + } + else { + LV_LOG_ERROR("Unsupported color format: %d", cf); + } + + lv_area_t old_area; + lv_area_t letter_coords; + + /*Render vector path(s) - set the clip area so that it matches + *the size of the temporary buffer used to render the glyph path(s)*/ + lv_memcpy(&old_area, &t->clip_area, sizeof(lv_area_t)); + lv_memcpy(&t->clip_area, &buf_area, sizeof(lv_area_t)); + + /*Can't call lv_draw_vector() as it would create a new draw task while + *the main thread also can create draw tasks. So create a dummy draw task + *manually to draw the outline*/ + if(vector_dsc->task_list) { + vector_dsc->base.layer = vector_dsc->base.layer; + lv_draw_task_t dummy_t; + lv_memzero(&dummy_t, sizeof(lv_draw_task_t)); + dummy_t.area = vector_dsc->base.layer->_clip_area; + dummy_t._real_area = vector_dsc->base.layer->_clip_area; + dummy_t.clip_area = vector_dsc->base.layer->_clip_area; + dummy_t.target_layer = vector_dsc->base.layer; + dummy_t.type = LV_DRAW_TASK_TYPE_VECTOR; + dummy_t.draw_dsc = vector_dsc; + lv_draw_sw_vector(&dummy_t, dummy_t.draw_dsc); + } + + /*Restore previous draw area of the entire text label*/ + lv_memcpy(&t->clip_area, &old_area, sizeof(lv_area_t)); + + lv_memcpy(&letter_coords, glyph_dsc->letter_coords, sizeof(lv_area_t)); + lv_area_set_width(&letter_coords, w); + lv_area_set_height(&letter_coords, h); + + lv_draw_image_dsc_t img_dsc; + + lv_draw_image_dsc_init(&img_dsc); + img_dsc.rotation = 0; + img_dsc.scale_x = LV_SCALE_NONE; + img_dsc.scale_y = LV_SCALE_NONE; + img_dsc.opa = LV_OPA_100; + img_dsc.src = draw_buf; + lv_draw_sw_image(t, &img_dsc, &letter_coords); + + lv_draw_vector_dsc_delete(vector_dsc); + lv_draw_buf_destroy(draw_buf); + +} + +/* Build the inside and outside vector paths for a glyph based + * on the received outline events emitted by lv_freetype_outline.c */ +static void freetype_outline_event_cb(lv_event_t * e) +{ + + lv_fpoint_t pnt; + lv_fpoint_t ctrl_pnt1; + lv_fpoint_t ctrl_pnt2; + lv_draw_sw_letter_outlines_t * glyph_paths; + lv_vector_path_t * path; + lv_freetype_outline_event_param_t * outline_event; + + outline_event = lv_event_get_param(e); + pnt.x = LV_FREETYPE_F26DOT6_TO_FLOAT(outline_event->to.x); + pnt.y = LV_FREETYPE_F26DOT6_TO_FLOAT(outline_event->to.y); + glyph_paths = outline_event->outline; + + if(lv_event_get_code(e) == LV_EVENT_CREATE) { + + glyph_paths = lv_malloc_zeroed(sizeof(lv_draw_sw_letter_outlines_t)); + LV_ASSERT_MALLOC(glyph_paths); + + glyph_paths->cur_path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_HIGH); + glyph_paths->inside_path = glyph_paths->cur_path; + outline_event->outline = glyph_paths; + return; + + } + else if(lv_event_get_code(e) == LV_EVENT_DELETE) { + + if(glyph_paths->inside_path != NULL) { + lv_vector_path_clear(glyph_paths->inside_path); + lv_vector_path_delete(glyph_paths->inside_path); + } + + if(glyph_paths->outside_path != NULL) { + lv_vector_path_clear(glyph_paths->outside_path); + lv_vector_path_delete(glyph_paths->outside_path); + } + + lv_free(glyph_paths); + return; + + } + else if(outline_event->type == LV_FREETYPE_OUTLINE_BORDER_START) { + + /* Inside path is done - create the border path */ + lv_vector_path_close(glyph_paths->cur_path); + glyph_paths->cur_path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_HIGH); + glyph_paths->outside_path = glyph_paths->cur_path; + return; + } + + path = glyph_paths->cur_path; + + switch(outline_event->type) { + + case LV_FREETYPE_OUTLINE_MOVE_TO: + lv_vector_path_move_to(path, &pnt); + break; + + case LV_FREETYPE_OUTLINE_LINE_TO: + lv_vector_path_line_to(path, &pnt); + break; + + case LV_FREETYPE_OUTLINE_CUBIC_TO: + ctrl_pnt1.x = LV_FREETYPE_F26DOT6_TO_FLOAT(outline_event->control1.x); + ctrl_pnt1.y = LV_FREETYPE_F26DOT6_TO_FLOAT(outline_event->control1.y); + ctrl_pnt2.x = LV_FREETYPE_F26DOT6_TO_FLOAT(outline_event->control2.x); + ctrl_pnt2.y = LV_FREETYPE_F26DOT6_TO_FLOAT(outline_event->control2.y); + lv_vector_path_cubic_to(path, &ctrl_pnt1, &ctrl_pnt2, &pnt); + break; + + case LV_FREETYPE_OUTLINE_CONIC_TO: + ctrl_pnt1.x = LV_FREETYPE_F26DOT6_TO_FLOAT(outline_event->control1.x); + ctrl_pnt1.y = LV_FREETYPE_F26DOT6_TO_FLOAT(outline_event->control1.y); + lv_vector_path_quad_to(path, &ctrl_pnt1, &pnt); + break; + case LV_FREETYPE_OUTLINE_END: + case LV_FREETYPE_OUTLINE_BORDER_START: + /* It's not necessary to close the path and + * border start is handled above + */ + break; + } +} + +#endif /* LV_USE_FREETYPE && LV_USE_VECTOR_GRAPHIC */ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_line.c b/inc/lvgl/src/draw/sw/lv_draw_sw_line.c new file mode 100644 index 0000000..bc01bab --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_line.c @@ -0,0 +1,410 @@ +/** + * @file lv_draw_sw_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_area_private.h" +#include "lv_draw_sw_mask_private.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_draw_private.h" +#include "lv_draw_sw.h" + +#if LV_USE_DRAW_SW + +#include "../../misc/lv_math.h" +#include "../../misc/lv_types.h" +#include "../../core/lv_refr_private.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_skew(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_hor(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc); +static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_ver(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc) +{ + if(dsc->width == 0) return; + if(dsc->opa <= LV_OPA_MIN) return; + + if(dsc->p1.x == dsc->p2.x && dsc->p1.y == dsc->p2.y) return; + + lv_area_t clip_line; + clip_line.x1 = (int32_t)LV_MIN(dsc->p1.x, dsc->p2.x) - dsc->width / 2; + clip_line.x2 = (int32_t)LV_MAX(dsc->p1.x, dsc->p2.x) + dsc->width / 2; + clip_line.y1 = (int32_t)LV_MIN(dsc->p1.y, dsc->p2.y) - dsc->width / 2; + clip_line.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) + dsc->width / 2; + + bool is_common; + is_common = lv_area_intersect(&clip_line, &clip_line, &t->clip_area); + if(!is_common) return; + + LV_PROFILER_DRAW_BEGIN; + if((int32_t)dsc->p1.y == (int32_t)dsc->p2.y) draw_line_hor(t, dsc); + else if((int32_t)dsc->p1.x == (int32_t)dsc->p2.x) draw_line_ver(t, dsc); + else draw_line_skew(t, dsc); + + if(dsc->round_end || dsc->round_start) { + lv_draw_fill_dsc_t cir_dsc; + lv_draw_fill_dsc_init(&cir_dsc); + cir_dsc.color = dsc->color; + cir_dsc.radius = LV_RADIUS_CIRCLE; + cir_dsc.opa = dsc->opa; + + int32_t r = (dsc->width >> 1); + int32_t r_corr = (dsc->width & 1) ? 0 : 1; + lv_area_t cir_area; + + if(dsc->round_start) { + cir_area.x1 = (int32_t)dsc->p1.x - r; + cir_area.y1 = (int32_t)dsc->p1.y - r; + cir_area.x2 = (int32_t)dsc->p1.x + r - r_corr; + cir_area.y2 = (int32_t)dsc->p1.y + r - r_corr ; + lv_draw_sw_fill(t, &cir_dsc, &cir_area); + } + + if(dsc->round_end) { + cir_area.x1 = (int32_t)dsc->p2.x - r; + cir_area.y1 = (int32_t)dsc->p2.y - r; + cir_area.x2 = (int32_t)dsc->p2.x + r - r_corr; + cir_area.y2 = (int32_t)dsc->p2.y + r - r_corr ; + lv_draw_sw_fill(t, &cir_dsc, &cir_area); + } + } + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static void LV_ATTRIBUTE_FAST_MEM draw_line_hor(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc) +{ + int32_t w = dsc->width - 1; + int32_t w_half0 = w >> 1; + int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t blend_area; + blend_area.x1 = (int32_t)LV_MIN(dsc->p1.x, dsc->p2.x); + blend_area.x2 = (int32_t)LV_MAX(dsc->p1.x, dsc->p2.x) - 1; + blend_area.y1 = (int32_t)dsc->p1.y - w_half1; + blend_area.y2 = (int32_t)dsc->p1.y + w_half0; + + bool is_common; + is_common = lv_area_intersect(&blend_area, &blend_area, &t->clip_area); + if(!is_common) return; + + bool dashed = dsc->dash_gap && dsc->dash_width; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + + /*If there is no mask then simply draw a rectangle*/ + if(!dashed) { + lv_draw_sw_blend(t, &blend_dsc); + } +#if LV_DRAW_SW_COMPLEX + /*If there other mask apply it*/ + else { + + int32_t blend_area_w = lv_area_get_width(&blend_area); + + int32_t y2 = blend_area.y2; + blend_area.y2 = blend_area.y1; + + int32_t dash_start = blend_area.x1 % (dsc->dash_gap + dsc->dash_width); + + lv_opa_t * mask_buf = lv_malloc(blend_area_w); + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + int32_t h; + for(h = blend_area.y1; h <= y2; h++) { + lv_memset(mask_buf, 0xff, blend_area_w); + + int32_t dash_cnt = dash_start; + int32_t i; + for(i = 0; i < blend_area_w;) { + if(dash_cnt < dsc->dash_width) { + int16_t diff = dsc->dash_width - dash_cnt; + i += diff; + dash_cnt += diff; + } + else { + mask_buf[i] = 0x00; + i++; + dash_cnt++; + } + if(dash_cnt >= dsc->dash_gap + dsc->dash_width) { + dash_cnt = 0; + } + + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + + lv_draw_sw_blend(t, &blend_dsc); + + blend_area.y1++; + blend_area.y2++; + } + lv_free(mask_buf); + } +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +static void LV_ATTRIBUTE_FAST_MEM draw_line_ver(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc) +{ + int32_t w = dsc->width - 1; + int32_t w_half0 = w >> 1; + int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t blend_area; + blend_area.x1 = (int32_t)dsc->p1.x - w_half1; + blend_area.x2 = (int32_t)dsc->p1.x + w_half0; + blend_area.y1 = (int32_t)LV_MIN(dsc->p1.y, dsc->p2.y); + blend_area.y2 = (int32_t)LV_MAX(dsc->p1.y, dsc->p2.y) - 1; + + bool is_common; + is_common = lv_area_intersect(&blend_area, &blend_area, &t->clip_area); + if(!is_common) return; + + bool dashed = dsc->dash_gap && dsc->dash_width; + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + + /*If there is no mask then simply draw a rectangle*/ + if(!dashed) { + lv_draw_sw_blend(t, &blend_dsc); + } + +#if LV_DRAW_SW_COMPLEX + /*If there other mask apply it*/ + else { + int32_t draw_area_w = lv_area_get_width(&blend_area); + + int32_t y2 = blend_area.y2; + blend_area.y2 = blend_area.y1; + + lv_opa_t * mask_buf = lv_malloc(draw_area_w); + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + int32_t dash_start = (blend_area.y1) % (dsc->dash_gap + dsc->dash_width); + + int32_t dash_cnt = dash_start; + + int32_t h; + for(h = blend_area.y1; h <= y2; h++) { + lv_memset(mask_buf, 0xff, draw_area_w); + + if(dash_cnt > dsc->dash_width) { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_TRANSP; + } + else { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_FULL_COVER; + } + + if(dash_cnt >= dsc->dash_gap + dsc->dash_width) { + dash_cnt = 0; + } + dash_cnt ++; + + lv_draw_sw_blend(t, &blend_dsc); + + blend_area.y1++; + blend_area.y2++; + } + lv_free(mask_buf); + } +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +static void LV_ATTRIBUTE_FAST_MEM draw_line_skew(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc) +{ +#if LV_DRAW_SW_COMPLEX + /*Keep the great y in p1*/ + lv_point_t p1; + lv_point_t p2; + if(dsc->p1.y < dsc->p2.y) { + p1 = lv_point_from_precise(&dsc->p1); + p2 = lv_point_from_precise(&dsc->p2); + } + else { + p1 = lv_point_from_precise(&dsc->p2); + p2 = lv_point_from_precise(&dsc->p1); + } + + int32_t xdiff = p2.x - p1.x; + int32_t ydiff = p2.y - p1.y; + bool flat = LV_ABS(xdiff) > LV_ABS(ydiff); + + static const uint8_t wcorr[] = { + 128, 128, 128, 129, 129, 130, 130, 131, + 132, 133, 134, 135, 137, 138, 140, 141, + 143, 145, 147, 149, 151, 153, 155, 158, + 160, 162, 165, 167, 170, 173, 175, 178, + 181, + }; + + int32_t w = dsc->width; + int32_t wcorr_i = 0; + if(flat) wcorr_i = (LV_ABS(ydiff) << 5) / LV_ABS(xdiff); + else wcorr_i = (LV_ABS(xdiff) << 5) / LV_ABS(ydiff); + + w = (w * wcorr[wcorr_i] + 63) >> 7; /*+ 63 for rounding*/ + int32_t w_half0 = w >> 1; + int32_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t blend_area; + blend_area.x1 = LV_MIN(p1.x, p2.x) - w; + blend_area.x2 = LV_MAX(p1.x, p2.x) + w; + blend_area.y1 = LV_MIN(p1.y, p2.y) - w; + blend_area.y2 = LV_MAX(p1.y, p2.y) + w; + + /*Get the union of `coords` and `clip`*/ + /*`clip` is already truncated to the `draw_buf` size + *in 'lv_refr_area' function*/ + bool is_common = lv_area_intersect(&blend_area, &blend_area, &t->clip_area); + if(is_common == false) return; + + lv_draw_sw_mask_line_param_t mask_left_param; + lv_draw_sw_mask_line_param_t mask_right_param; + lv_draw_sw_mask_line_param_t mask_top_param; + lv_draw_sw_mask_line_param_t mask_bottom_param; + + void * masks[5] = {&mask_left_param, & mask_right_param, NULL, NULL, NULL}; + + if(flat) { + if(xdiff > 0) { + lv_draw_sw_mask_line_points_init(&mask_left_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, + LV_DRAW_SW_MASK_LINE_SIDE_LEFT); + lv_draw_sw_mask_line_points_init(&mask_right_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, + LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + } + else { + lv_draw_sw_mask_line_points_init(&mask_left_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, + LV_DRAW_SW_MASK_LINE_SIDE_LEFT); + lv_draw_sw_mask_line_points_init(&mask_right_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, + LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + } + } + else { + lv_draw_sw_mask_line_points_init(&mask_left_param, p1.x + w_half1, p1.y, p2.x + w_half1, p2.y, + LV_DRAW_SW_MASK_LINE_SIDE_LEFT); + lv_draw_sw_mask_line_points_init(&mask_right_param, p1.x - w_half0, p1.y, p2.x - w_half0, p2.y, + LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + + } + + /*Use the normal vector for the endings*/ + + if(!dsc->raw_end) { + lv_draw_sw_mask_line_points_init(&mask_top_param, p1.x, p1.y, p1.x - ydiff, p1.y + xdiff, + LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM); + lv_draw_sw_mask_line_points_init(&mask_bottom_param, p2.x, p2.y, p2.x - ydiff, p2.y + xdiff, + LV_DRAW_SW_MASK_LINE_SIDE_TOP); + masks[2] = &mask_top_param; + masks[3] = &mask_bottom_param; + } + + + /*Draw the background line by line*/ + int32_t h; + size_t mask_buf_size = LV_MIN((int32_t)lv_area_get_size(&blend_area), lv_area_get_width(&blend_area)); + lv_opa_t * mask_buf = lv_malloc(mask_buf_size); + + /*The real draw area is around the line. + *It's easy to calculate with steep lines, but the area can be very wide with very flat lines. + *So deal with it only with steep lines.*/ + size_t draw_area_w = LV_MIN((size_t)lv_area_get_width(&blend_area), mask_buf_size); + + int32_t y2 = blend_area.y2; + blend_area.y2 = blend_area.y1; + + uint32_t mask_p = 0; + lv_memset(mask_buf, 0xff, mask_buf_size); + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memzero(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.blend_area = &blend_area; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + blend_dsc.mask_buf = mask_buf; + blend_dsc.mask_area = &blend_area; + + /*Fill the first row with 'color'*/ + for(h = blend_area.y1; h <= y2; h++) { + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, &mask_buf[mask_p], blend_area.x1, h, draw_area_w); + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[mask_p], draw_area_w); + } + + mask_p += draw_area_w; + if((uint32_t) mask_p + draw_area_w < mask_buf_size) { + blend_area.y2 ++; + } + else { + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(t, &blend_dsc); + + blend_area.y1 = blend_area.y2 + 1; + blend_area.y2 = blend_area.y1; + mask_p = 0; + lv_memset(mask_buf, 0xff, mask_buf_size); + } + } + + /*Flush the last part*/ + if(blend_area.y1 != blend_area.y2) { + blend_area.y2--; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + lv_draw_sw_blend(t, &blend_dsc); + } + + lv_free(mask_buf); + + lv_draw_sw_mask_free_param(&mask_left_param); + lv_draw_sw_mask_free_param(&mask_right_param); + if(!dsc->raw_end) { + lv_draw_sw_mask_free_param(&mask_top_param); + lv_draw_sw_mask_free_param(&mask_bottom_param); + } +#else + LV_UNUSED(t); + LV_UNUSED(dsc); + LV_LOG_WARN("Can't draw skewed line with LV_DRAW_SW_COMPLEX == 0"); +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_mask.c b/inc/lvgl/src/draw/sw/lv_draw_sw_mask.c new file mode 100644 index 0000000..f5e8c5a --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_mask.c @@ -0,0 +1,1237 @@ +/** + * @file lv_draw_sw_mask.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_mask_private.h" +#include "../lv_draw_mask.h" +#include "../lv_draw.h" + +#if LV_DRAW_SW_COMPLEX +#include "../../core/lv_global.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_assert.h" +#include "../../osal/lv_os_private.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define CIRCLE_CACHE_LIFE_MAX 1000 +#define CIRCLE_CACHE_AGING(life, r) life = LV_MIN(life + (r < 16 ? 1 : (r >> 4)), 1000) +#define circle_cache_mutex LV_GLOBAL_DEFAULT()->draw_info.circle_cache_mutex +#define _circle_cache LV_GLOBAL_DEFAULT()->sw_circle_cache + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_line_param_t * param); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_radius_param_t * param); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_angle_param_t * param); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_fade_param_t * param); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_map_param_t * param); + +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len, + lv_draw_sw_mask_line_param_t * p); +static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len, + lv_draw_sw_mask_line_param_t * p); + +static void circ_init(lv_point_t * c, int32_t * tmp, int32_t radius); +static bool circ_cont(lv_point_t * c); +static void circ_next(lv_point_t * c, int32_t * tmp); +static void circ_calc_aa4(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius); +static lv_opa_t * get_next_line(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, + int32_t * x_start); +static inline lv_opa_t /* LV_ATTRIBUTE_FAST_MEM */ mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_mask_init(void) +{ + lv_mutex_init(&circle_cache_mutex); +} + +void lv_draw_sw_mask_deinit(void) +{ + lv_mutex_delete(&circle_cache_mutex); +} + +lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len) +{ + bool changed = false; + lv_draw_sw_mask_common_dsc_t * dsc; + + uint32_t i; + for(i = 0; masks[i]; i++) { + dsc = masks[i]; + lv_draw_sw_mask_res_t res = LV_DRAW_SW_MASK_RES_FULL_COVER; + res = dsc->cb(mask_buf, abs_x, abs_y, len, masks[i]); + if(res == LV_DRAW_SW_MASK_RES_TRANSP) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(res == LV_DRAW_SW_MASK_RES_CHANGED) changed = true; + } + + return changed ? LV_DRAW_SW_MASK_RES_CHANGED : LV_DRAW_SW_MASK_RES_FULL_COVER; +} + +void lv_draw_sw_mask_free_param(void * p) +{ + lv_mutex_lock(&circle_cache_mutex); + lv_draw_sw_mask_common_dsc_t * pdsc = p; + if(pdsc->type == LV_DRAW_SW_MASK_TYPE_RADIUS) { + lv_draw_sw_mask_radius_param_t * radius_p = (lv_draw_sw_mask_radius_param_t *) p; + if(radius_p->circle) { + if(radius_p->circle->life < 0) { + lv_free(radius_p->circle->cir_opa); + lv_free(radius_p->circle); + } + else { + radius_p->circle->used_cnt--; + } + } + } + + lv_mutex_unlock(&circle_cache_mutex); +} + +void lv_draw_sw_mask_cleanup(void) +{ + uint8_t i; + for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { + if(_circle_cache[i].buf) { + lv_free(_circle_cache[i].buf); + } + lv_memzero(&(_circle_cache[i]), sizeof(_circle_cache[i])); + } +} + +void lv_draw_sw_mask_line_points_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t p1y, + int32_t p2x, + int32_t p2y, lv_draw_sw_mask_line_side_t side) +{ + lv_memzero(param, sizeof(lv_draw_sw_mask_line_param_t)); + + if(p1y == p2y && side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM) { + p1y--; + p2y--; + } + + if(p1y > p2y) { + int32_t t; + t = p2x; + p2x = p1x; + p1x = t; + + t = p2y; + p2y = p1y; + p1y = t; + } + + lv_point_set(¶m->cfg.p1, p1x, p1y); + lv_point_set(¶m->cfg.p2, p2x, p2y); + param->cfg.side = side; + + lv_point_set(¶m->origo, p1x, p1y); + param->flat = (LV_ABS(p2x - p1x) > LV_ABS(p2y - p1y)) ? 1 : 0; + param->yx_steep = 0; + param->xy_steep = 0; + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_line; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_LINE; + + int32_t dx = p2x - p1x; + int32_t dy = p2y - p1y; + + if(param->flat) { + /*Normalize the steep. Delta x should be relative to delta x = 1024*/ + int32_t m; + + if(dx) { + m = (1L << 20) / dx; /*m is multiplier to normalize y (upscaled by 1024)*/ + param->yx_steep = (m * dy) >> 10; + } + + if(dy) { + m = (1L << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->xy_steep = (m * dx) >> 10; + } + param->steep = param->yx_steep; + } + else { + /*Normalize the steep. Delta y should be relative to delta x = 1024*/ + int32_t m; + + if(dy) { + m = (1L << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->xy_steep = (m * dx) >> 10; + } + + if(dx) { + m = (1L << 20) / dx; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->yx_steep = (m * dy) >> 10; + } + param->steep = param->xy_steep; + } + + if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_LEFT) param->inv = 0; + else if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_RIGHT) param->inv = 1; + else if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_TOP) { + if(param->steep > 0) param->inv = 1; + else param->inv = 0; + } + else if(param->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM) { + if(param->steep > 0) param->inv = 0; + else param->inv = 1; + } + + param->spx = param->steep >> 2; + if(param->steep < 0) param->spx = -param->spx; +} + +void lv_draw_sw_mask_line_angle_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t py, int16_t angle, + lv_draw_sw_mask_line_side_t side) +{ + /*Find an optimal degree. + *lv_mask_line_points_init will swap the points to keep the smaller y in p1 + *Theoretically a line with `angle` or `angle+180` is the same only the points are swapped + *Find the degree which keeps the origo in place*/ + if(angle > 180) angle -= 180; /*> 180 will swap the origo*/ + + int32_t p2x; + int32_t p2y; + + p2x = (lv_trigo_sin(angle + 90) >> 5) + p1x; + p2y = (lv_trigo_sin(angle) >> 5) + py; + + lv_draw_sw_mask_line_points_init(param, p1x, py, p2x, p2y, side); +} + +void lv_draw_sw_mask_angle_init(lv_draw_sw_mask_angle_param_t * param, int32_t vertex_x, int32_t vertex_y, + int32_t start_angle, int32_t end_angle) +{ + lv_draw_sw_mask_line_side_t start_side; + lv_draw_sw_mask_line_side_t end_side; + + /*Constrain the input angles*/ + if(start_angle < 0) + start_angle = 0; + else if(start_angle > 359) + start_angle = 359; + + if(end_angle < 0) + end_angle = 0; + else if(end_angle > 359) + end_angle = 359; + + if(end_angle < start_angle) { + param->delta_deg = 360 - start_angle + end_angle; + } + else { + param->delta_deg = LV_ABS(end_angle - start_angle); + } + + param->cfg.start_angle = start_angle; + param->cfg.end_angle = end_angle; + lv_point_set(¶m->cfg.vertex_p, vertex_x, vertex_y); + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_angle; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_ANGLE; + + LV_ASSERT_MSG(start_angle >= 0 && start_angle <= 360, "Unexpected start angle"); + + if(start_angle >= 0 && start_angle < 180) { + start_side = LV_DRAW_SW_MASK_LINE_SIDE_LEFT; + } + else + start_side = LV_DRAW_SW_MASK_LINE_SIDE_RIGHT; /*silence compiler*/ + + LV_ASSERT_MSG(end_angle >= 0 && start_angle <= 360, "Unexpected end angle"); + + if(end_angle >= 0 && end_angle < 180) { + end_side = LV_DRAW_SW_MASK_LINE_SIDE_RIGHT; + } + else if(end_angle >= 180 && end_angle < 360) { + end_side = LV_DRAW_SW_MASK_LINE_SIDE_LEFT; + } + else + end_side = LV_DRAW_SW_MASK_LINE_SIDE_RIGHT; /*silence compiler*/ + + lv_draw_sw_mask_line_angle_init(¶m->start_line, vertex_x, vertex_y, start_angle, start_side); + lv_draw_sw_mask_line_angle_init(¶m->end_line, vertex_x, vertex_y, end_angle, end_side); +} + +void lv_draw_sw_mask_radius_init(lv_draw_sw_mask_radius_param_t * param, const lv_area_t * rect, int32_t radius, + bool inv) +{ + int32_t w = lv_area_get_width(rect); + int32_t h = lv_area_get_height(rect); + int32_t short_side = LV_MIN(w, h); + if(radius > short_side >> 1) radius = short_side >> 1; + if(radius < 0) radius = 0; + + lv_area_copy(¶m->cfg.rect, rect); + param->cfg.radius = radius; + param->cfg.outer = inv ? 1 : 0; + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_radius; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_RADIUS; + + if(radius == 0) { + param->circle = NULL; + return; + } + + lv_mutex_lock(&circle_cache_mutex); + + uint32_t i; + + /*Try to reuse a circle cache entry*/ + for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { + if(_circle_cache[i].radius == radius) { + _circle_cache[i].used_cnt++; + CIRCLE_CACHE_AGING(_circle_cache[i].life, radius); + param->circle = &(_circle_cache[i]); + lv_mutex_unlock(&circle_cache_mutex); + return; + } + } + + /*If not cached use the free entry with lowest life*/ + lv_draw_sw_mask_radius_circle_dsc_t * entry = NULL; + for(i = 0; i < LV_DRAW_SW_CIRCLE_CACHE_SIZE; i++) { + if(_circle_cache[i].used_cnt == 0) { + if(!entry) entry = &(_circle_cache[i]); + else if(_circle_cache[i].life < entry->life) entry = &(_circle_cache[i]); + } + } + + /*There is no unused entry. Allocate one temporarily*/ + if(!entry) { + entry = lv_malloc_zeroed(sizeof(lv_draw_sw_mask_radius_circle_dsc_t)); + LV_ASSERT_MALLOC(entry); + entry->life = -1; + } + else { + entry->used_cnt++; + entry->life = 0; + CIRCLE_CACHE_AGING(entry->life, radius); + } + + param->circle = entry; + + circ_calc_aa4(param->circle, radius); + lv_mutex_unlock(&circle_cache_mutex); + +} + +void lv_draw_sw_mask_fade_init(lv_draw_sw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top, + int32_t y_top, + lv_opa_t opa_bottom, int32_t y_bottom) +{ + lv_area_copy(¶m->cfg.coords, coords); + param->cfg.opa_top = opa_top; + param->cfg.opa_bottom = opa_bottom; + param->cfg.y_top = y_top; + param->cfg.y_bottom = y_bottom; + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_fade; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_FADE; +} + +void lv_draw_sw_mask_map_init(lv_draw_sw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map) +{ + lv_area_copy(¶m->cfg.coords, coords); + param->cfg.map = map; + param->dsc.cb = (lv_draw_sw_mask_xcb_t)lv_draw_mask_map; + param->dsc.type = LV_DRAW_SW_MASK_TYPE_MAP; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_line_param_t * p) +{ + /*Make to points relative to the vertex*/ + abs_y -= p->origo.y; + abs_x -= p->origo.x; + + /*Handle special cases*/ + if(p->steep == 0) { + /*Horizontal*/ + if(p->flat) { + /*Non sense: Can't be on the right/left of a horizontal line*/ + if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_LEFT || + p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_RIGHT) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_TOP && abs_y < 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM && abs_y > 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + /*Vertical*/ + else { + /*Non sense: Can't be on the top/bottom of a vertical line*/ + if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_TOP || + p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_RIGHT && abs_x > 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_SW_MASK_LINE_SIDE_LEFT) { + if(abs_x + len < 0) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else { + int32_t k = - abs_x; + if(k < 0) return LV_DRAW_SW_MASK_RES_TRANSP; + if(k >= 0 && k < len) lv_memzero(&mask_buf[k], len - k); + return LV_DRAW_SW_MASK_RES_CHANGED; + } + } + else { + if(abs_x + len < 0) return LV_DRAW_SW_MASK_RES_TRANSP; + else { + int32_t k = - abs_x; + if(k < 0) k = 0; + if(k >= len) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(k >= 0 && k < len) lv_memzero(&mask_buf[0], k); + return LV_DRAW_SW_MASK_RES_CHANGED; + } + } + } + } + + lv_draw_sw_mask_res_t res; + if(p->flat) { + res = line_mask_flat(mask_buf, abs_x, abs_y, len, p); + } + else { + res = line_mask_steep(mask_buf, abs_x, abs_y, len, p); + } + + return res; +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len, + lv_draw_sw_mask_line_param_t * p) +{ + + int32_t y_at_x; + y_at_x = (int32_t)((int32_t)p->yx_steep * abs_x) >> 10; + + if(p->yx_steep > 0) { + if(y_at_x > abs_y) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + } + else { + if(y_at_x < abs_y) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + } + + /*At the end of the mask if the limit line is smaller than the mask's y. + *Then the mask is in the "good" area*/ + y_at_x = (int32_t)((int32_t)p->yx_steep * (abs_x + len)) >> 10; + if(p->yx_steep > 0) { + if(y_at_x < abs_y) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + else { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + } + } + else { + if(y_at_x > abs_y) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + else { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + } + } + + int32_t xe; + if(p->yx_steep > 0) xe = ((abs_y * 256) * p->xy_steep) >> 10; + else xe = (((abs_y + 1) * 256) * p->xy_steep) >> 10; + + int32_t xei = xe >> 8; + int32_t xef = xe & 0xFF; + + int32_t px_h; + if(xef == 0) px_h = 255; + else px_h = 255 - (((255 - xef) * p->spx) >> 8); + int32_t k = xei - abs_x; + lv_opa_t m; + + if(xef) { + if(k >= 0 && k < len) { + m = 255 - (((255 - xef) * (255 - px_h)) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + } + + while(px_h > p->spx) { + if(k >= 0 && k < len) { + m = px_h - (p->spx >> 1); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + px_h -= p->spx; + k++; + if(k >= len) break; + } + + if(k < len && k >= 0) { + int32_t x_inters = (px_h * p->xy_steep) >> 10; + m = (x_inters * px_h) >> 9; + if(p->yx_steep < 0) m = 255 - m; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + if(p->inv) { + k = xei - abs_x; + if(k > len) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + if(k >= 0) { + lv_memzero(&mask_buf[0], k); + } + } + else { + k++; + if(k < 0) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + if(k < len) { + lv_memzero(&mask_buf[k], len - k); + } + } + + return LV_DRAW_SW_MASK_RES_CHANGED; +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, + int32_t len, + lv_draw_sw_mask_line_param_t * p) +{ + int32_t k; + int32_t x_at_y; + /*At the beginning of the mask if the limit line is greater than the mask's y. + *Then the mask is in the "wrong" area*/ + x_at_y = (int32_t)((int32_t)p->xy_steep * abs_y) >> 10; + if(p->xy_steep > 0) x_at_y++; + if(x_at_y < abs_x) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + + /*At the end of the mask if the limit line is smaller than the mask's y. + *Then the mask is in the "good" area*/ + x_at_y = (int32_t)((int32_t)p->xy_steep * (abs_y)) >> 10; + if(x_at_y > abs_x + len) { + if(p->inv) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + else { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + } + + /*X start*/ + int32_t xs = ((abs_y * 256) * p->xy_steep) >> 10; + int32_t xsi = xs >> 8; + int32_t xsf = xs & 0xFF; + + /*X end*/ + int32_t xe = (((abs_y + 1) * 256) * p->xy_steep) >> 10; + int32_t xei = xe >> 8; + int32_t xef = xe & 0xFF; + + lv_opa_t m; + + k = xsi - abs_x; + if(xsi != xei && (p->xy_steep < 0 && xsf == 0)) { + xsf = 0xFF; + xsi = xei; + k--; + } + + if(xsi == xei) { + if(k >= 0 && k < len) { + m = (xsf + xef) >> 1; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + + if(p->inv) { + k = xsi - abs_x; + if(k >= len) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + if(k >= 0) lv_memzero(&mask_buf[0], k); + + } + else { + if(k > len) k = len; + if(k == 0) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(k > 0) lv_memzero(&mask_buf[k], len - k); + } + + } + else { + int32_t y_inters; + if(p->xy_steep < 0) { + y_inters = (xsf * (-p->yx_steep)) >> 10; + if(k >= 0 && k < len) { + m = (y_inters * xsf) >> 9; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k--; + + int32_t x_inters = ((255 - y_inters) * (-p->xy_steep)) >> 10; + + if(k >= 0 && k < len) { + m = 255 - (((255 - y_inters) * x_inters) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + k += 2; + + if(p->inv) { + k = xsi - abs_x - 1; + + if(k > len) k = len; + else if(k > 0) lv_memzero(&mask_buf[0], k); + + } + else { + if(k > len) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(k >= 0) lv_memzero(&mask_buf[k], len - k); + } + + } + else { + y_inters = ((255 - xsf) * p->yx_steep) >> 10; + if(k >= 0 && k < len) { + m = 255 - ((y_inters * (255 - xsf)) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + k++; + + int32_t x_inters = ((255 - y_inters) * p->xy_steep) >> 10; + if(k >= 0 && k < len) { + m = ((255 - y_inters) * x_inters) >> 9; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + + if(p->inv) { + k = xsi - abs_x; + if(k > len) return LV_DRAW_SW_MASK_RES_TRANSP; + if(k >= 0) lv_memzero(&mask_buf[0], k); + + } + else { + if(k > len) k = len; + if(k == 0) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(k > 0) lv_memzero(&mask_buf[k], len - k); + } + } + } + + return LV_DRAW_SW_MASK_RES_CHANGED; +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_angle_param_t * p) +{ + int32_t rel_y = abs_y - p->cfg.vertex_p.y; + int32_t rel_x = abs_x - p->cfg.vertex_p.x; + + if(p->cfg.start_angle < 180 && p->cfg.end_angle < 180 && + p->cfg.start_angle != 0 && p->cfg.end_angle != 0 && + p->cfg.start_angle > p->cfg.end_angle) { + + if(abs_y < p->cfg.vertex_p.y) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + + /*Start angle mask can work only from the end of end angle mask*/ + int32_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; + int32_t start_angle_last = ((rel_y + 1) * p->start_line.xy_steep) >> 10; + + /*Do not let the line end cross the vertex else it will affect the opposite part*/ + if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + int32_t dist = (end_angle_first - start_angle_last) >> 1; + + lv_draw_sw_mask_res_t res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + lv_draw_sw_mask_res_t res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + + int32_t tmp = start_angle_last + dist - rel_x; + if(tmp > len) tmp = len; + if(tmp > 0) { + res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, &p->start_line); + if(res1 == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[0], tmp); + } + } + + if(tmp > len) tmp = len; + if(tmp < 0) tmp = 0; + res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x + tmp, abs_y, len - tmp, &p->end_line); + if(res2 == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[tmp], len - tmp); + } + if(res1 == res2) return res1; + else return LV_DRAW_SW_MASK_RES_CHANGED; + } + else if(p->cfg.start_angle > 180 && p->cfg.end_angle > 180 && p->cfg.start_angle > p->cfg.end_angle) { + + if(abs_y > p->cfg.vertex_p.y) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + + /*Start angle mask can work only from the end of end angle mask*/ + int32_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; + int32_t start_angle_last = ((rel_y + 1) * p->start_line.xy_steep) >> 10; + + /*Do not let the line end cross the vertex else it will affect the opposite part*/ + if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + int32_t dist = (end_angle_first - start_angle_last) >> 1; + + lv_draw_sw_mask_res_t res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + lv_draw_sw_mask_res_t res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + + int32_t tmp = start_angle_last + dist - rel_x; + if(tmp > len) tmp = len; + if(tmp > 0) { + res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, (lv_draw_sw_mask_line_param_t *)&p->end_line); + if(res1 == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[0], tmp); + } + } + + if(tmp > len) tmp = len; + if(tmp < 0) tmp = 0; + res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x + tmp, abs_y, len - tmp, (lv_draw_sw_mask_line_param_t *)&p->start_line); + if(res2 == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(&mask_buf[tmp], len - tmp); + } + if(res1 == res2) return res1; + else return LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + + lv_draw_sw_mask_res_t res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + lv_draw_sw_mask_res_t res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + + if(p->cfg.start_angle == 180) { + if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + else res1 = LV_DRAW_SW_MASK_RES_UNKNOWN; + } + else if(p->cfg.start_angle == 0) { + if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_SW_MASK_RES_UNKNOWN; + else res1 = LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else if((p->cfg.start_angle < 180 && abs_y < p->cfg.vertex_p.y) || + (p->cfg.start_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { + res1 = LV_DRAW_SW_MASK_RES_UNKNOWN; + } + else { + res1 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->start_line); + } + + if(p->cfg.end_angle == 180) { + if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_SW_MASK_RES_UNKNOWN; + else res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + } + else if(p->cfg.end_angle == 0) { + if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_SW_MASK_RES_FULL_COVER; + else res2 = LV_DRAW_SW_MASK_RES_UNKNOWN; + } + else if((p->cfg.end_angle < 180 && abs_y < p->cfg.vertex_p.y) || + (p->cfg.end_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { + res2 = LV_DRAW_SW_MASK_RES_UNKNOWN; + } + else { + res2 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->end_line); + } + + if(res1 == LV_DRAW_SW_MASK_RES_TRANSP || res2 == LV_DRAW_SW_MASK_RES_TRANSP) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(res1 == LV_DRAW_SW_MASK_RES_UNKNOWN && res2 == LV_DRAW_SW_MASK_RES_UNKNOWN) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(res1 == LV_DRAW_SW_MASK_RES_FULL_COVER && + res2 == LV_DRAW_SW_MASK_RES_FULL_COVER) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else return LV_DRAW_SW_MASK_RES_CHANGED; + } +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_radius_param_t * p) +{ + bool outer = p->cfg.outer; + int32_t radius = p->cfg.radius; + lv_area_t rect; + lv_area_copy(&rect, &p->cfg.rect); + + if(outer == false) { + if((abs_y < rect.y1 || abs_y > rect.y2)) { + return LV_DRAW_SW_MASK_RES_TRANSP; + } + } + else { + if(abs_y < rect.y1 || abs_y > rect.y2) { + return LV_DRAW_SW_MASK_RES_FULL_COVER; + } + } + + if((abs_x >= rect.x1 + radius && abs_x + len <= rect.x2 - radius) || + (abs_y >= rect.y1 + radius && abs_y <= rect.y2 - radius)) { + if(outer == false) { + /*Remove the edges*/ + int32_t last = rect.x1 - abs_x; + if(last > len) return LV_DRAW_SW_MASK_RES_TRANSP; + if(last >= 0) { + lv_memzero(&mask_buf[0], last); + } + + int32_t first = rect.x2 - abs_x + 1; + if(first <= 0) return LV_DRAW_SW_MASK_RES_TRANSP; + else if(first < len) { + lv_memzero(&mask_buf[first], len - first); + } + if(last == 0 && first == len) return LV_DRAW_SW_MASK_RES_FULL_COVER; + else return LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + int32_t first = rect.x1 - abs_x; + if(first < 0) first = 0; + if(first <= len) { + int32_t last = rect.x2 - abs_x - first + 1; + if(first + last > len) last = len - first; + if(last >= 0) { + lv_memzero(&mask_buf[first], last); + } + } + } + return LV_DRAW_SW_MASK_RES_CHANGED; + } + + int32_t k = rect.x1 - abs_x; /*First relevant coordinate on the of the mask*/ + int32_t w = lv_area_get_width(&rect); + int32_t h = lv_area_get_height(&rect); + abs_x -= rect.x1; + abs_y -= rect.y1; + + int32_t aa_len; + int32_t x_start; + int32_t cir_y; + if(abs_y < radius) { + cir_y = radius - abs_y - 1; + } + else { + cir_y = abs_y - (h - radius); + } + lv_opa_t * aa_opa = get_next_line(p->circle, cir_y, &aa_len, &x_start); + int32_t cir_x_right = k + w - radius + x_start; + int32_t cir_x_left = k + radius - x_start - 1; + int32_t i; + + if(outer == false) { + for(i = 0; i < aa_len; i++) { + lv_opa_t opa = aa_opa[aa_len - i - 1]; + if(cir_x_right + i >= 0 && cir_x_right + i < len) { + mask_buf[cir_x_right + i] = mask_mix(opa, mask_buf[cir_x_right + i]); + } + if(cir_x_left - i >= 0 && cir_x_left - i < len) { + mask_buf[cir_x_left - i] = mask_mix(opa, mask_buf[cir_x_left - i]); + } + } + + /*Clean the right side*/ + cir_x_right = LV_CLAMP(0, cir_x_right + i, len); + lv_memzero(&mask_buf[cir_x_right], len - cir_x_right); + + /*Clean the left side*/ + cir_x_left = LV_CLAMP(0, cir_x_left - aa_len + 1, len); + lv_memzero(&mask_buf[0], cir_x_left); + } + else { + for(i = 0; i < aa_len; i++) { + lv_opa_t opa = 255 - (aa_opa[aa_len - 1 - i]); + if(cir_x_right + i >= 0 && cir_x_right + i < len) { + mask_buf[cir_x_right + i] = mask_mix(opa, mask_buf[cir_x_right + i]); + } + if(cir_x_left - i >= 0 && cir_x_left - i < len) { + mask_buf[cir_x_left - i] = mask_mix(opa, mask_buf[cir_x_left - i]); + } + } + + int32_t clr_start = LV_CLAMP(0, cir_x_left + 1, len); + int32_t clr_len = LV_CLAMP(0, cir_x_right - clr_start, len - clr_start); + lv_memzero(&mask_buf[clr_start], clr_len); + } + + return LV_DRAW_SW_MASK_RES_CHANGED; +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_fade_param_t * p) +{ + if(abs_y < p->cfg.coords.y1) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_y > p->cfg.coords.y2) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_x > p->cfg.coords.x2) return LV_DRAW_SW_MASK_RES_FULL_COVER; + + if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; + + if(abs_x < p->cfg.coords.x1) { + int32_t x_ofs = 0; + x_ofs = p->cfg.coords.x1 - abs_x; + len -= x_ofs; + mask_buf += x_ofs; + } + + int32_t i; + + if(abs_y <= p->cfg.y_top) { + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_top); + } + return LV_DRAW_SW_MASK_RES_CHANGED; + } + else if(abs_y >= p->cfg.y_bottom) { + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_bottom); + } + return LV_DRAW_SW_MASK_RES_CHANGED; + } + else { + /*Calculate the opa proportionally*/ + int16_t opa_diff = p->cfg.opa_bottom - p->cfg.opa_top; + int32_t y_diff = p->cfg.y_bottom - p->cfg.y_top + 1; + lv_opa_t opa_act = LV_OPA_MIX2(abs_y - p->cfg.y_top, opa_diff) / y_diff; + opa_act += p->cfg.opa_top; + + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], opa_act); + } + return LV_DRAW_SW_MASK_RES_CHANGED; + } +} + +static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x, + int32_t abs_y, int32_t len, + lv_draw_sw_mask_map_param_t * p) +{ + /*Handle out of the mask cases*/ + if(abs_y < p->cfg.coords.y1) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_y > p->cfg.coords.y2) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_SW_MASK_RES_FULL_COVER; + if(abs_x > p->cfg.coords.x2) return LV_DRAW_SW_MASK_RES_FULL_COVER; + + /*Got to the current row in the map*/ + const lv_opa_t * map_tmp = p->cfg.map; + map_tmp += (abs_y - p->cfg.coords.y1) * lv_area_get_width(&p->cfg.coords); + + if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; + + if(abs_x < p->cfg.coords.x1) { + int32_t x_ofs = 0; + x_ofs = p->cfg.coords.x1 - abs_x; + len -= x_ofs; + mask_buf += x_ofs; + } + else { + map_tmp += (abs_x - p->cfg.coords.x1); + } + + int32_t i; + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], map_tmp[i]); + } + + return LV_DRAW_SW_MASK_RES_CHANGED; +} + +/** + * Initialize the circle drawing + * @param c pointer to a point. The coordinates will be calculated here + * @param tmp point to a variable. It will store temporary data + * @param radius radius of the circle + */ +static void circ_init(lv_point_t * c, int32_t * tmp, int32_t radius) +{ + c->x = radius; + c->y = 0; + *tmp = 1 - radius; +} + +/** + * Test the circle drawing is ready or not + * @param c same as in circ_init + * @return true if the circle is not ready yet + */ +static bool circ_cont(lv_point_t * c) +{ + return c->y <= c->x; +} + +/** + * Get the next point from the circle + * @param c same as in circ_init. The next point stored here. + * @param tmp same as in circ_init. + */ +static void circ_next(lv_point_t * c, int32_t * tmp) +{ + + if(*tmp <= 0) { + (*tmp) += 2 * c->y + 3; /*Change in decision criterion for y -> y+1*/ + } + else { + (*tmp) += 2 * (c->y - c->x) + 5; /*Change for y -> y+1, x -> x-1*/ + c->x--; + } + c->y++; +} + +static void circ_calc_aa4(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius) +{ + if(radius == 0) return; + c->radius = radius; + + /*Allocate buffers*/ + if(c->buf) lv_free(c->buf); + + c->buf = lv_malloc(radius * 6 + 6); /*Use uint16_t for opa_start_on_y and x_start_on_y*/ + LV_ASSERT_MALLOC(c->buf); + c->cir_opa = c->buf; + c->opa_start_on_y = (uint16_t *)(c->buf + 2 * radius + 2); + c->x_start_on_y = (uint16_t *)(c->buf + 4 * radius + 4); + + /*Special case, handle manually*/ + if(radius == 1) { + c->cir_opa[0] = 180; + c->opa_start_on_y[0] = 0; + c->opa_start_on_y[1] = 1; + c->x_start_on_y[0] = 0; + return; + } + + const size_t cir_xy_size = (radius + 1) * 2 * 2 * sizeof(int32_t); + int32_t * cir_x = lv_malloc_zeroed(cir_xy_size); + LV_ASSERT_MALLOC(cir_x); + int32_t * cir_y = &cir_x[(radius + 1) * 2]; + + uint32_t y_8th_cnt = 0; + lv_point_t cp; + int32_t tmp; + circ_init(&cp, &tmp, radius * 4); /*Upscale by 4*/ + int32_t i; + + uint32_t x_int[4]; + uint32_t x_fract[4]; + int32_t cir_size = 0; + x_int[0] = cp.x >> 2; + x_fract[0] = 0; + + /*Calculate an 1/8 circle*/ + while(circ_cont(&cp)) { + /*Calculate 4 point of the circle */ + for(i = 0; i < 4; i++) { + circ_next(&cp, &tmp); + if(circ_cont(&cp) == false) break; + x_int[i] = cp.x >> 2; + x_fract[i] = cp.x & 0x3; + } + if(i != 4) break; + + /*All lines on the same x when downscaled*/ + if(x_int[0] == x_int[3]) { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0] + x_fract[1] + x_fract[2] + x_fract[3]; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + /*Second line on new x when downscaled*/ + else if(x_int[0] != x_int[1]) { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0]; + c->cir_opa[cir_size] *= 16; + cir_size++; + + cir_x[cir_size] = x_int[0] - 1; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = 1 * 4 + x_fract[1] + x_fract[2] + x_fract[3]; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + /*Third line on new x when downscaled*/ + else if(x_int[0] != x_int[2]) { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0] + x_fract[1]; + c->cir_opa[cir_size] *= 16; + cir_size++; + + cir_x[cir_size] = x_int[0] - 1; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = 2 * 4 + x_fract[2] + x_fract[3]; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + /*Forth line on new x when downscaled*/ + else { + cir_x[cir_size] = x_int[0]; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = x_fract[0] + x_fract[1] + x_fract[2]; + c->cir_opa[cir_size] *= 16; + cir_size++; + + cir_x[cir_size] = x_int[0] - 1; + cir_y[cir_size] = y_8th_cnt; + c->cir_opa[cir_size] = 3 * 4 + x_fract[3]; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + + y_8th_cnt++; + } + + /*The point on the 1/8 circle is special, calculate it manually*/ + int32_t mid = radius * 723; + int32_t mid_int = mid >> 10; + if(cir_x[cir_size - 1] != mid_int || cir_y[cir_size - 1] != mid_int) { + int32_t tmp_val = mid - (mid_int << 10); + if(tmp_val <= 512) { + tmp_val = tmp_val * tmp_val * 2; + tmp_val = tmp_val >> (10 + 6); + } + else { + tmp_val = 1024 - tmp_val; + tmp_val = tmp_val * tmp_val * 2; + tmp_val = tmp_val >> (10 + 6); + tmp_val = 15 - tmp_val; + } + + cir_x[cir_size] = mid_int; + cir_y[cir_size] = mid_int; + c->cir_opa[cir_size] = tmp_val; + c->cir_opa[cir_size] *= 16; + cir_size++; + } + + /*Build the second octet by mirroring the first*/ + for(i = cir_size - 2; i >= 0; i--, cir_size++) { + cir_x[cir_size] = cir_y[i]; + cir_y[cir_size] = cir_x[i]; + c->cir_opa[cir_size] = c->cir_opa[i]; + } + + int32_t y = 0; + i = 0; + c->opa_start_on_y[0] = 0; + while(i < cir_size) { + c->opa_start_on_y[y] = i; + c->x_start_on_y[y] = cir_x[i]; + for(; i < (int32_t)cir_size && cir_y[i] == y; i++) { + c->x_start_on_y[y] = LV_MIN(c->x_start_on_y[y], cir_x[i]); + } + y++; + } + + lv_free(cir_x); +} + +static lv_opa_t * get_next_line(lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len, + int32_t * x_start) +{ + *len = c->opa_start_on_y[y + 1] - c->opa_start_on_y[y]; + *x_start = c->x_start_on_y[y]; + return &c->cir_opa[c->opa_start_on_y[y]]; +} + +static inline lv_opa_t LV_ATTRIBUTE_FAST_MEM mask_mix(lv_opa_t mask_act, lv_opa_t mask_new) +{ + if(mask_new >= LV_OPA_MAX) return mask_act; + if(mask_new <= LV_OPA_MIN) return 0; + + return LV_UDIV255(mask_act * mask_new); +} + +#endif /*LV_DRAW_SW_COMPLEX*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_mask.h b/inc/lvgl/src/draw/sw/lv_draw_sw_mask.h new file mode 100644 index 0000000..a70ce26 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_mask.h @@ -0,0 +1,181 @@ +/** + * @file lv_draw_sw_mask.h + * + */ + +#ifndef LV_DRAW_SW_MASK_H +#define LV_DRAW_SW_MASK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ +#define LV_MASK_ID_INV (-1) +#if LV_DRAW_SW_COMPLEX +# define LV_MASK_MAX_NUM 16 +#else +# define LV_MASK_MAX_NUM 1 +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_DRAW_SW_MASK_RES_TRANSP, + LV_DRAW_SW_MASK_RES_FULL_COVER, + LV_DRAW_SW_MASK_RES_CHANGED, + LV_DRAW_SW_MASK_RES_UNKNOWN +} lv_draw_sw_mask_res_t; + +#if LV_DRAW_SW_COMPLEX + +typedef enum { + LV_DRAW_SW_MASK_TYPE_LINE, + LV_DRAW_SW_MASK_TYPE_ANGLE, + LV_DRAW_SW_MASK_TYPE_RADIUS, + LV_DRAW_SW_MASK_TYPE_FADE, + LV_DRAW_SW_MASK_TYPE_MAP, +} lv_draw_sw_mask_type_t; + +typedef enum { + LV_DRAW_SW_MASK_LINE_SIDE_LEFT = 0, + LV_DRAW_SW_MASK_LINE_SIDE_RIGHT, + LV_DRAW_SW_MASK_LINE_SIDE_TOP, + LV_DRAW_SW_MASK_LINE_SIDE_BOTTOM, +} lv_draw_sw_mask_line_side_t; + +/** + * A common callback type for every mask type. + * Used internally by the library. + */ +typedef lv_draw_sw_mask_res_t (*lv_draw_sw_mask_xcb_t)(lv_opa_t * mask_buf, int32_t abs_x, int32_t abs_y, + int32_t len, + void * p); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_draw_sw_mask_init(void); + +void lv_draw_sw_mask_deinit(void); + +/** + * Apply the added buffers on a line. Used internally by the library's drawing routines. + * @param masks the masks list to apply, must be ended with NULL pointer in array. + * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. + * @param abs_x absolute X coordinate where the line to calculate start + * @param abs_y absolute Y coordinate where the line to calculate start + * @param len length of the line to calculate (in pixel count) + * @return One of these values: + * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero + * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged + * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line + */ +lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf, + int32_t abs_x, + int32_t abs_y, + int32_t len); + +/** + * Free the data from the parameter. + * It's called inside `lv_draw_sw_mask_remove_id` and `lv_draw_sw_mask_remove_custom` + * Needs to be called only in special cases when the mask is not added by `lv_draw_mask_add` + * and not removed by `lv_draw_mask_remove_id` or `lv_draw_mask_remove_custom` + * @param p pointer to a mask parameter + */ +void lv_draw_sw_mask_free_param(void * p); + +/** + *Initialize a line mask from two points. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param p1x X coordinate of the first point of the line + * @param p1y Y coordinate of the first point of the line + * @param p2x X coordinate of the second point of the line + * @param p2y y coordinate of the second point of the line + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_sw_mask_line_points_init(lv_draw_sw_mask_line_param_t * param, int32_t p1x, int32_t p1y, + int32_t p2x, + int32_t p2y, lv_draw_sw_mask_line_side_t side); + +/** + *Initialize a line mask from a point and an angle. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param px X coordinate of a point of the line + * @param py X coordinate of a point of the line + * @param angle right 0 deg, bottom: 90 + * @param side an element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_sw_mask_line_angle_init(lv_draw_sw_mask_line_param_t * param, int32_t px, int32_t py, int16_t angle, + lv_draw_sw_mask_line_side_t side); + +/** + * Initialize an angle mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param vertex_x X coordinate of the angle vertex (absolute coordinates) + * @param vertex_y Y coordinate of the angle vertex (absolute coordinates) + * @param start_angle start angle in degrees. 0 deg on the right, 90 deg, on the bottom + * @param end_angle end angle + */ +void lv_draw_sw_mask_angle_init(lv_draw_sw_mask_angle_param_t * param, int32_t vertex_x, int32_t vertex_y, + int32_t start_angle, int32_t end_angle); + +/** + * Initialize a fade mask. + * @param param pointer to an `lv_draw_mask_radius_param_t` to initialize + * @param rect coordinates of the rectangle to affect (absolute coordinates) + * @param radius radius of the rectangle + * @param inv true: keep the pixels inside the rectangle; keep the pixels outside of the rectangle + */ +void lv_draw_sw_mask_radius_init(lv_draw_sw_mask_radius_param_t * param, const lv_area_t * rect, int32_t radius, + bool inv); + +/** + * Initialize a fade mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the area to affect (absolute coordinates) + * @param opa_top opacity on the top + * @param y_top at which coordinate start to change to opacity to `opa_bottom` + * @param opa_bottom opacity at the bottom + * @param y_bottom at which coordinate reach `opa_bottom`. + */ +void lv_draw_sw_mask_fade_init(lv_draw_sw_mask_fade_param_t * param, const lv_area_t * coords, lv_opa_t opa_top, + int32_t y_top, + lv_opa_t opa_bottom, int32_t y_bottom); + +/** + * Initialize a map mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the map (absolute coordinates) + * @param map array of bytes with the mask values + */ +void lv_draw_sw_mask_map_init(lv_draw_sw_mask_map_param_t * param, const lv_area_t * coords, const lv_opa_t * map); + +#endif /*LV_DRAW_SW_COMPLEX*/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_MASK_H*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_mask_private.h b/inc/lvgl/src/draw/sw/lv_draw_sw_mask_private.h new file mode 100644 index 0000000..2412538 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_mask_private.h @@ -0,0 +1,157 @@ +/** + * @file lv_draw_sw_mask_private.h + * + */ + +#ifndef LV_DRAW_SW_MASK_PRIVATE_H +#define LV_DRAW_SW_MASK_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_sw_mask.h" + +#if LV_DRAW_SW_COMPLEX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint8_t * buf; + lv_opa_t * cir_opa; /**< Opacity of values on the circumference of an 1/4 circle */ + uint16_t * x_start_on_y; /**< The x coordinate of the circle for each y value */ + uint16_t * opa_start_on_y; /**< The index of `cir_opa` for each y value */ + int32_t life; /**< How many times the entry way used */ + uint32_t used_cnt; /**< Like a semaphore to count the referencing masks */ + int32_t radius; /**< The radius of the entry */ +} lv_draw_sw_mask_radius_circle_dsc_t; + +struct _lv_draw_sw_mask_common_dsc_t { + lv_draw_sw_mask_xcb_t cb; + lv_draw_sw_mask_type_t type; +}; + +struct _lv_draw_sw_mask_line_param_t { + /** The first element must be the common descriptor */ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + /*First point*/ + lv_point_t p1; + + /*Second point*/ + lv_point_t p2; + + /*Which side to keep?*/ + lv_draw_sw_mask_line_side_t side : 3; + } cfg; + + /** A point of the line */ + lv_point_t origo; + + /** X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y? */ + int32_t xy_steep; + + /** Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X? */ + int32_t yx_steep; + + /** Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines */ + int32_t steep; + + /** Steepness in 1 px in 0..255 range. Used only by flat lines. */ + int32_t spx; + + /** 1: It's a flat line? (Near to horizontal) */ + uint8_t flat : 1; + + /** Invert the mask. The default is: Keep the left part. + *It is used to select left/right/top/bottom */ + uint8_t inv: 1; +}; + +struct _lv_draw_sw_mask_angle_param_t { + /** The first element must be the common descriptor */ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_point_t vertex_p; + int32_t start_angle; + int32_t end_angle; + } cfg; + + lv_draw_sw_mask_line_param_t start_line; + lv_draw_sw_mask_line_param_t end_line; + uint16_t delta_deg; +}; + +struct _lv_draw_sw_mask_radius_param_t { + /** The first element must be the common descriptor */ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_area_t rect; + int32_t radius; + /** Invert the mask. 0: Keep the pixels inside. */ + uint8_t outer: 1; + } cfg; + + lv_draw_sw_mask_radius_circle_dsc_t * circle; +}; + +struct _lv_draw_sw_mask_fade_param_t { + /** The first element must be the common descriptor */ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + int32_t y_top; + int32_t y_bottom; + lv_opa_t opa_top; + lv_opa_t opa_bottom; + } cfg; + +}; + +struct _lv_draw_sw_mask_map_param_t { + /** The first element must be the common descriptor */ + lv_draw_sw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + const lv_opa_t * map; + } cfg; +}; + +typedef lv_draw_sw_mask_radius_circle_dsc_t lv_draw_sw_mask_radius_circle_dsc_arr_t[LV_DRAW_SW_CIRCLE_CACHE_SIZE]; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Called by LVGL the rendering of a screen is ready to clean up + * the temporal (cache) data of the masks + */ +void lv_draw_sw_mask_cleanup(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_DRAW_SW_COMPLEX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_MASK_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c b/inc/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c new file mode 100644 index 0000000..7abb8a3 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c @@ -0,0 +1,133 @@ +/** + * @file lv_draw_sw_mask_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_area_private.h" +#include "../lv_draw_mask.h" +#include "../lv_draw_private.h" +#if LV_USE_DRAW_SW +#if LV_DRAW_SW_COMPLEX + +#include "../../misc/lv_math.h" +#include "../../misc/lv_log.h" +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" +#include "lv_draw_sw.h" +#include "lv_draw_sw_mask_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_mask_rect(lv_draw_task_t * t, const lv_draw_mask_rect_dsc_t * dsc) +{ + lv_area_t draw_area; + if(!lv_area_intersect(&draw_area, &dsc->area, &t->clip_area)) { + return; + } + + lv_layer_t * target_layer = t->target_layer; + lv_area_t * buf_area = &target_layer->buf_area; + lv_area_t clear_area; + + void * draw_buf = target_layer->draw_buf; + + if(dsc->keep_outside == 0) { + /*Clear the top part*/ + lv_area_set(&clear_area, t->clip_area.x1, t->clip_area.y1, t->clip_area.x2, + dsc->area.y1 - 1); + lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); + lv_draw_buf_clear(draw_buf, &clear_area); + + /*Clear the bottom part*/ + lv_area_set(&clear_area, t->clip_area.x1, dsc->area.y2 + 1, t->clip_area.x2, + t->clip_area.y2); + lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); + lv_draw_buf_clear(draw_buf, &clear_area); + + /*Clear the left part*/ + lv_area_set(&clear_area, t->clip_area.x1, dsc->area.y1, dsc->area.x1 - 1, dsc->area.y2); + lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); + lv_draw_buf_clear(draw_buf, &clear_area); + + /*Clear the right part*/ + lv_area_set(&clear_area, dsc->area.x2 + 1, dsc->area.y1, t->clip_area.x2, dsc->area.y2); + lv_area_move(&clear_area, -buf_area->x1, -buf_area->y1); + lv_draw_buf_clear(draw_buf, &clear_area); + } + + lv_draw_sw_mask_radius_param_t param; + lv_draw_sw_mask_radius_init(¶m, &dsc->area, dsc->radius, false); + + void * masks[2] = {0}; + masks[0] = ¶m; + + uint32_t area_w = lv_area_get_width(&draw_area); + lv_opa_t * mask_buf = lv_malloc(area_w); + + int32_t y; + for(y = draw_area.y1; y <= draw_area.y2; y++) { + lv_memset(mask_buf, 0xff, area_w); + lv_draw_sw_mask_res_t res = lv_draw_sw_mask_apply(masks, mask_buf, draw_area.x1, y, area_w); + if(res == LV_DRAW_SW_MASK_RES_FULL_COVER) continue; + + lv_color32_t * c32_buf = lv_draw_layer_go_to_xy(target_layer, draw_area.x1 - buf_area->x1, + y - buf_area->y1); + + if(res == LV_DRAW_SW_MASK_RES_TRANSP) { + lv_memzero(c32_buf, area_w * sizeof(lv_color32_t)); + } + else { + uint32_t i; + for(i = 0; i < area_w; i++) { + if(mask_buf[i] != LV_OPA_COVER) { + c32_buf[i].alpha = LV_OPA_MIX2(c32_buf[i].alpha, mask_buf[i]); + } + } + } + } + + lv_free(mask_buf); + lv_draw_sw_mask_free_param(¶m); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#else /*LV_DRAW_SW_COMPLEX*/ + +void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc) +{ + LV_UNUSED(draw_unit); + LV_UNUSED(dsc); + + LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled"); +} + +#endif /*LV_DRAW_SW_COMPLEX*/ +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_private.h b/inc/lvgl/src/draw/sw/lv_draw_sw_private.h new file mode 100644 index 0000000..60bf4b6 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_private.h @@ -0,0 +1,75 @@ +/** + * @file lv_draw_sw_private.h + * + */ + +#ifndef LV_DRAW_SW_PRIVATE_H +#define LV_DRAW_SW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_sw.h" +#include "../lv_draw_private.h" + +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_draw_task_t * task_act; + lv_thread_t thread; + lv_thread_sync_t sync; + lv_draw_unit_t * draw_unit; + uint32_t idx; + volatile bool inited; + volatile bool exit_status; +} lv_draw_sw_thread_dsc_t; + +struct _lv_draw_sw_unit_t { + lv_draw_unit_t base_unit; +#if LV_USE_OS + lv_draw_sw_thread_dsc_t thread_dscs[LV_DRAW_SW_DRAW_UNIT_CNT]; +#else + lv_draw_task_t * task_act; +#endif +}; + +#if LV_DRAW_SW_SHADOW_CACHE_SIZE +typedef struct { + uint8_t cache[LV_DRAW_SW_SHADOW_CACHE_SIZE * LV_DRAW_SW_SHADOW_CACHE_SIZE]; + int32_t cache_size; + int32_t cache_r; +} lv_draw_sw_shadow_cache_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DRAW_SW */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_PRIVATE_H*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_transform.c b/inc/lvgl/src/draw/sw/lv_draw_sw_transform.c new file mode 100644 index 0000000..674e54d --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_transform.c @@ -0,0 +1,1109 @@ +/** + * @file lv_draw_sw_transform.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_area.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_color.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + int32_t x_in; + int32_t y_in; + int32_t x_out; + int32_t y_out; + int32_t sinma; + int32_t cosma; + int32_t scale_x; + int32_t scale_y; + int32_t angle; + int32_t pivot_x_256; + int32_t pivot_y_256; + lv_point_t pivot; +} point_transform_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +/** + * Transform a point with 1/256 precision (the output coordinates are upscaled by 256) + * @param t pointer to n initialized `point_transform_dsc_t` structure + * @param xin X coordinate to rotate + * @param yin Y coordinate to rotate + * @param xout upscaled, transformed X + * @param yout upscaled, transformed Y + */ +static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout, + int32_t * yout); + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void transform_rgb888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa, uint32_t px_size); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 +static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa); +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED +static void transform_argb8888_premultiplied(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565A8 +static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static void transform_rgb565a8_swapped(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa); +#endif + +#if LV_DRAW_SW_SUPPORT_A8 +static void transform_a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * abuf, bool aa); +#endif + +#if LV_DRAW_SW_SUPPORT_L8 || LV_DRAW_SW_SUPPORT_AL88 +static void transform_al88(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_transform(const lv_area_t * dest_area, const void * src_buf, + int32_t src_w, int32_t src_h, int32_t src_stride, + const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t src_cf, void * dest_buf) +{ + LV_UNUSED(sup); + + point_transform_dsc_t tr_dsc; + tr_dsc.angle = -draw_dsc->rotation; + tr_dsc.scale_x = draw_dsc->scale_x; + tr_dsc.scale_y = draw_dsc->scale_y; + tr_dsc.pivot = draw_dsc->pivot; + + int32_t angle_low = tr_dsc.angle / 10; + int32_t angle_high = angle_low + 1; + int32_t angle_rem = tr_dsc.angle - (angle_low * 10); + + int32_t s1 = lv_trigo_sin(angle_low); + int32_t s2 = lv_trigo_sin(angle_high); + + int32_t c1 = lv_trigo_sin(angle_low + 90); + int32_t c2 = lv_trigo_sin(angle_high + 90); + + tr_dsc.sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10; + tr_dsc.cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10; + tr_dsc.sinma = tr_dsc.sinma >> (LV_TRIGO_SHIFT - 10); + tr_dsc.cosma = tr_dsc.cosma >> (LV_TRIGO_SHIFT - 10); + tr_dsc.pivot_x_256 = tr_dsc.pivot.x * 256; + tr_dsc.pivot_y_256 = tr_dsc.pivot.y * 256; + + int32_t dest_w = lv_area_get_width(dest_area); + int32_t dest_h = lv_area_get_height(dest_area); + + int32_t dest_stride_a8 = dest_w; + int32_t dest_stride; + if(src_cf == LV_COLOR_FORMAT_RGB888) { + dest_stride = dest_w * lv_color_format_get_size(LV_COLOR_FORMAT_ARGB8888); + } + else if(src_cf == LV_COLOR_FORMAT_RGB565A8) { + dest_stride = dest_w * 2; + } + else if(src_cf == LV_COLOR_FORMAT_L8 || src_cf == LV_COLOR_FORMAT_AL88) { + dest_stride = dest_w; + } + else { + dest_stride = dest_w * lv_color_format_get_size(src_cf); + } + + uint8_t * alpha_buf; + if(src_cf == LV_COLOR_FORMAT_RGB565 || src_cf == LV_COLOR_FORMAT_RGB565_SWAPPED || src_cf == LV_COLOR_FORMAT_RGB565A8) { + alpha_buf = dest_buf; + alpha_buf += dest_stride * dest_h; + } + else if(src_cf == LV_COLOR_FORMAT_L8 || src_cf == LV_COLOR_FORMAT_AL88) { + alpha_buf = dest_buf; + alpha_buf += dest_w * dest_h; + } + else { + alpha_buf = NULL; + } + + bool aa = (bool) draw_dsc->antialias; + bool is_rotated = draw_dsc->rotation; + + int32_t xs_ups = 0, ys_ups = 0, ys_ups_start = 0, ys_step_256_original = 0; + int32_t xs_step_256 = 0, ys_step_256 = 0; + + /*When some of the color formats are disabled, these variables could be unused, avoid warning here*/ + LV_UNUSED(aa); + LV_UNUSED(xs_ups); + LV_UNUSED(ys_ups); + LV_UNUSED(xs_step_256); + LV_UNUSED(ys_step_256); + + /*If scaled only make some simplification to avoid rounding errors. + *For example if there is a 100x100 image zoomed to 300% + *The destination area in X will be x1=0; x2=299 + *When the step is calculated below it will think that stepping + *1/3 pixels on the original image will result in 300% zoom. + *However this way the last pixel will be on the 99.67 coordinate. + *As it's larger than 99.5 LVGL will start to mix the next coordinate + *which is out of the image, so will make the pixel more transparent. + *To avoid it in case of scale only limit the coordinates to the 0..297 range, + *that is to 0..(src_w-1)*zoom */ + if(is_rotated == false) { + int32_t xs1_ups, ys1_ups, xs2_ups, ys2_ups; + + int32_t x_max = (((src_w - 1 - draw_dsc->pivot.x) * draw_dsc->scale_x) >> 8) + draw_dsc->pivot.x; + int32_t y_max = (((src_h - 1 - draw_dsc->pivot.y) * draw_dsc->scale_y) >> 8) + draw_dsc->pivot.y; + + lv_area_t dest_area_limited; + dest_area_limited.x1 = dest_area->x1 > x_max ? x_max : dest_area->x1; + dest_area_limited.x2 = dest_area->x2 > x_max ? x_max : dest_area->x2; + dest_area_limited.y1 = dest_area->y1 > y_max ? y_max : dest_area->y1; + dest_area_limited.y2 = dest_area->y2 > y_max ? y_max : dest_area->y2; + + transform_point_upscaled(&tr_dsc, dest_area_limited.x1, dest_area_limited.y1, &xs1_ups, &ys1_ups); + transform_point_upscaled(&tr_dsc, dest_area_limited.x2, dest_area_limited.y2, &xs2_ups, &ys2_ups); + + int32_t xs_diff = xs2_ups - xs1_ups; + int32_t ys_diff = ys2_ups - ys1_ups; + xs_step_256 = 0; + ys_step_256_original = 0; + if(dest_w > 1) { + xs_step_256 = (256 * xs_diff) / (dest_w - 1); + } + if(dest_h > 1) { + ys_step_256_original = (256 * ys_diff) / (dest_h - 1); + } + + xs_ups = xs1_ups + 0x80; + ys_ups_start = ys1_ups + 0x80; + } + + int32_t y; + for(y = 0; y < dest_h; y++) { + if(is_rotated == false) { + ys_ups = ys_ups_start + ((ys_step_256_original * y) >> 8); + ys_step_256 = 0; + } + else { + int32_t xs1_ups, ys1_ups, xs2_ups, ys2_ups; + transform_point_upscaled(&tr_dsc, dest_area->x1, dest_area->y1 + y, &xs1_ups, &ys1_ups); + transform_point_upscaled(&tr_dsc, dest_area->x2, dest_area->y1 + y, &xs2_ups, &ys2_ups); + + int32_t xs_diff = xs2_ups - xs1_ups; + int32_t ys_diff = ys2_ups - ys1_ups; + xs_step_256 = 0; + ys_step_256 = 0; + if(dest_w > 1) { + xs_step_256 = (256 * xs_diff) / (dest_w - 1); + ys_step_256 = (256 * ys_diff) / (dest_w - 1); + } + + xs_ups = xs1_ups + 0x80; + ys_ups = ys1_ups + 0x80; + } + + switch(src_cf) { +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + transform_rgb888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa, + 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + transform_rgb888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa, + 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_A8 + case LV_COLOR_FORMAT_A8: + transform_a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, aa); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + transform_argb8888(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, + aa); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + transform_argb8888_premultiplied(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, + dest_buf, + aa); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565 && LV_DRAW_SW_SUPPORT_RGB565A8 + case LV_COLOR_FORMAT_RGB565: + transform_rgb565a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, + alpha_buf, false, aa); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + transform_rgb565a8_swapped(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, + dest_buf, alpha_buf, false, aa); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565A8 + case LV_COLOR_FORMAT_RGB565A8: + transform_rgb565a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, + (uint16_t *)dest_buf, + alpha_buf, true, aa); + break; +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + transform_al88(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, + dest_buf, + alpha_buf, false, aa); + break; +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + transform_al88(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, + dest_buf, + alpha_buf, true, aa); + break; +#endif + + default: + LV_LOG_WARN("Color format 0x%02X is not enabled. " + "See lv_color.h to find the name of the color formats and " + "enable the related LV_DRAW_SW_SUPPORT_* in lv_conf.h.", + src_cf); + return; + } + + dest_buf = (uint8_t *)dest_buf + dest_stride; + if(alpha_buf) alpha_buf += dest_stride_a8; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +static void transform_rgb888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa, uint32_t px_size) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + lv_color32_t * dest_c32 = (lv_color32_t *) dest_buf; + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + dest_c32[x].alpha = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = 0x7F - xs_fract; + } + else { + x_next = 1; + xs_fract = xs_fract - 0x80; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = 0x7F - ys_fract; + } + else { + y_next = 1; + ys_fract = ys_fract - 0x80; + } + + const uint8_t * src_u8 = &src[ys_int * src_stride + xs_int * px_size]; + + dest_c32[x].red = src_u8[2]; + dest_c32[x].green = src_u8[1]; + dest_c32[x].blue = src_u8[0]; + dest_c32[x].alpha = 0xff; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + const uint8_t * px_hor_u8 = src_u8 + (int32_t)(x_next * px_size); + lv_color32_t px_hor; + px_hor.red = px_hor_u8[2]; + px_hor.green = px_hor_u8[1]; + px_hor.blue = px_hor_u8[0]; + px_hor.alpha = 0xff; + + const uint8_t * px_ver_u8 = src_u8 + (int32_t)(y_next * src_stride); + lv_color32_t px_ver; + px_ver.red = px_ver_u8[2]; + px_ver.green = px_ver_u8[1]; + px_ver.blue = px_ver_u8[0]; + px_ver.alpha = 0xff; + + if(!lv_color32_eq(dest_c32[x], px_ver)) { + px_ver.alpha = ys_fract; + dest_c32[x] = lv_color_mix32(px_ver, dest_c32[x]); + } + + if(!lv_color32_eq(dest_c32[x], px_hor)) { + px_hor.alpha = xs_fract; + dest_c32[x] = lv_color_mix32(px_hor, dest_c32[x]); + } + } + /*Partially out of the image*/ + else { + lv_opa_t a = 0xff; + + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + dest_c32[x].alpha = (a * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + dest_c32[x].alpha = (a * (0xFF - ys_fract)) >> 8; + } + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + lv_color32_t * dest_c32 = (lv_color32_t *) dest_buf; + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + ((uint32_t *)dest_buf)[x] = 0x00000000; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = 0x7F - xs_fract; + } + else { + x_next = 1; + xs_fract = xs_fract - 0x80; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = 0x7F - ys_fract; + } + else { + y_next = 1; + ys_fract = ys_fract - 0x80; + } + + const lv_color32_t * src_c32 = (const lv_color32_t *)(src + ys_int * src_stride + xs_int * 4); + + dest_c32[x] = src_c32[0]; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + lv_color32_t px_hor = src_c32[x_next]; + lv_color32_t px_ver = *(const lv_color32_t *)((uint8_t *)src_c32 + y_next * src_stride); + + if(px_ver.alpha == 0) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - ys_fract)) >> 8; + } + else if(!lv_color32_eq(dest_c32[x], px_ver)) { + if(dest_c32[x].alpha) dest_c32[x].alpha = ((px_ver.alpha * ys_fract) + (dest_c32[x].alpha * (0xFF - ys_fract))) >> 8; + px_ver.alpha = ys_fract; + dest_c32[x] = lv_color_mix32(px_ver, dest_c32[x]); + } + + if(px_hor.alpha == 0) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - xs_fract)) >> 8; + } + else if(!lv_color32_eq(dest_c32[x], px_hor)) { + if(dest_c32[x].alpha) dest_c32[x].alpha = ((px_hor.alpha * xs_fract) + (dest_c32[x].alpha * (0xFF - xs_fract))) >> 8; + px_hor.alpha = xs_fract; + dest_c32[x] = lv_color_mix32(px_hor, dest_c32[x]); + } + } + /*Partially out of the image*/ + else { + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0x7F - xs_fract)) >> 7; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0x7F - ys_fract)) >> 7; + } + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static lv_color32_t unpremultiply(lv_color32_t c) +{ + if(c.alpha == 0) { + c.red = 0; + c.green = 0; + c.blue = 0; + } + else { + uint16_t reciprocal_alpha = (255 * 256) / c.alpha; + c.red = (c.red * reciprocal_alpha) >> 8; + c.green = (c.green * reciprocal_alpha) >> 8; + c.blue = (c.blue * reciprocal_alpha) >> 8; + } + + return c; +} + +static void transform_argb8888_premultiplied(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + lv_color32_t * dest_c32 = (lv_color32_t *) dest_buf; + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + ((uint32_t *)dest_buf)[x] = 0x00000000; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = 0x7F - xs_fract; + } + else { + x_next = 1; + xs_fract = xs_fract - 0x80; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = 0x7F - ys_fract; + } + else { + y_next = 1; + ys_fract = ys_fract - 0x80; + } + + const lv_color32_t * src_c32 = (const lv_color32_t *)(src + ys_int * src_stride + xs_int * 4); + + dest_c32[x] = src_c32[0]; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + lv_color32_t px_hor = src_c32[x_next]; + lv_color32_t px_ver = *(const lv_color32_t *)((uint8_t *)src_c32 + y_next * src_stride); + + /*Have the non-premultiplied colors first, mix them as needed, + *and premultiply again*/ + dest_c32[x] = unpremultiply(dest_c32[x]); + px_hor = unpremultiply(px_hor); + px_ver = unpremultiply(px_ver); + + if(px_ver.alpha == 0) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - ys_fract)) >> 8; + + } + else if(!lv_color32_eq(dest_c32[x], px_ver)) { + if(dest_c32[x].alpha) dest_c32[x].alpha = ((px_ver.alpha * ys_fract) + (dest_c32[x].alpha * (0xFF - ys_fract))) >> 8; + px_ver.alpha = ys_fract; + dest_c32[x] = lv_color_mix32(px_ver, dest_c32[x]); + } + + if(px_hor.alpha == 0) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - xs_fract)) >> 8; + } + else if(!lv_color32_eq(dest_c32[x], px_hor)) { + if(dest_c32[x].alpha) dest_c32[x].alpha = ((px_hor.alpha * xs_fract) + (dest_c32[x].alpha * (0xFF - xs_fract))) >> 8; + px_hor.alpha = xs_fract; + dest_c32[x] = lv_color_mix32(px_hor, dest_c32[x]); + } + + dest_c32[x].red = (dest_c32[x].red * dest_c32[x].alpha) >> 8; + dest_c32[x].green = (dest_c32[x].green * dest_c32[x].alpha) >> 8; + dest_c32[x].blue = (dest_c32[x].blue * dest_c32[x].alpha) >> 8; + + } + /*Partially out of the image*/ + else { + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + dest_c32[x] = unpremultiply(dest_c32[x]); + lv_opa_t alpha = (dest_c32[x].alpha * (0x7F - xs_fract)) >> 7; + dest_c32[x].alpha = alpha; + dest_c32[x].red = (dest_c32[x].red * dest_c32[x].alpha) >> 8; + dest_c32[x].green = (dest_c32[x].green * dest_c32[x].alpha) >> 8; + dest_c32[x].blue = (dest_c32[x].blue * dest_c32[x].alpha) >> 8; + + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + dest_c32[x] = unpremultiply(dest_c32[x]); + lv_opa_t alpha = (dest_c32[x].alpha * (0x7F - ys_fract)) >> 7; + dest_c32[x].alpha = alpha; + dest_c32[x].red = (dest_c32[x].red * dest_c32[x].alpha) >> 8; + dest_c32[x].green = (dest_c32[x].green * dest_c32[x].alpha) >> 8; + dest_c32[x].blue = (dest_c32[x].blue * dest_c32[x].alpha) >> 8; + } + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565A8 + +static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + + const lv_opa_t * src_alpha = src + src_stride * src_h; + + /*Must be signed type, because we would use negative array index calculated from stride*/ + int32_t alpha_stride = src_stride / 2; /*alpha map stride is always half of RGB map stride*/ + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = (0x7F - xs_fract) * 2; + } + else { + x_next = 1; + xs_fract = (xs_fract - 0x80) * 2; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = (0x7F - ys_fract) * 2; + } + else { + y_next = 1; + ys_fract = (ys_fract - 0x80) * 2; + } + + const uint16_t * src_tmp_u16 = (const uint16_t *)(src + (ys_int * src_stride) + xs_int * 2); + cbuf[x] = src_tmp_u16[0]; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + uint16_t px_hor = src_tmp_u16[x_next]; + uint16_t px_ver = *(const uint16_t *)((uint8_t *)src_tmp_u16 + (y_next * src_stride)); + + if(src_has_a8) { + const lv_opa_t * src_alpha_tmp = src_alpha; + src_alpha_tmp += (ys_int * alpha_stride) + xs_int; + abuf[x] = src_alpha_tmp[0]; + + lv_opa_t a_hor = src_alpha_tmp[x_next]; + lv_opa_t a_ver = src_alpha_tmp[y_next * alpha_stride]; + + if(a_ver != abuf[x]) a_ver = ((a_ver * ys_fract) + (abuf[x] * (0x100 - ys_fract))) >> 8; + if(a_hor != abuf[x]) a_hor = ((a_hor * xs_fract) + (abuf[x] * (0x100 - xs_fract))) >> 8; + abuf[x] = (a_ver + a_hor) >> 1; + + if(abuf[x] == 0x00) continue; + } + else { + abuf[x] = 0xff; + } + + if(cbuf[x] != px_ver || cbuf[x] != px_hor) { + uint16_t v = lv_color_16_16_mix(px_ver, cbuf[x], ys_fract); + uint16_t h = lv_color_16_16_mix(px_hor, cbuf[x], xs_fract); + cbuf[x] = lv_color_16_16_mix(h, v, LV_OPA_50); + } + } + /*Partially out of the image*/ + else { + lv_opa_t a; + if(src_has_a8) { + const lv_opa_t * src_alpha_tmp = src_alpha; + src_alpha_tmp += (ys_int * alpha_stride) + xs_int; + a = src_alpha_tmp[0]; + } + else { + a = 0xff; + } + + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + abuf[x] = (a * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + abuf[x] = (a * (0xFF - ys_fract)) >> 8; + } + else { + abuf[x] = a; + } + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + +static void transform_rgb565a8_swapped(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + + const lv_opa_t * src_alpha = src + src_stride * src_h; + + /*Must be signed type, because we would use negative array index calculated from stride*/ + int32_t alpha_stride = src_stride / 2; /*alpha map stride is always half of RGB map stride*/ + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = (0x7F - xs_fract) * 2; + } + else { + x_next = 1; + xs_fract = (xs_fract - 0x80) * 2; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = (0x7F - ys_fract) * 2; + } + else { + y_next = 1; + ys_fract = (ys_fract - 0x80) * 2; + } + + const uint16_t * src_tmp_u16 = (const uint16_t *)(src + (ys_int * src_stride) + xs_int * 2); + cbuf[x] = lv_color_swap_16(src_tmp_u16[0]); /* swap the src pixels */ + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + /* swap the src pixels */ + uint16_t px_hor = lv_color_swap_16(src_tmp_u16[x_next]); + uint16_t px_ver = lv_color_swap_16(*(const uint16_t *)((uint8_t *)src_tmp_u16 + (y_next * src_stride))); + + if(src_has_a8) { + const lv_opa_t * src_alpha_tmp = src_alpha; + src_alpha_tmp += (ys_int * alpha_stride) + xs_int; + abuf[x] = src_alpha_tmp[0]; + + lv_opa_t a_hor = src_alpha_tmp[x_next]; + lv_opa_t a_ver = src_alpha_tmp[y_next * alpha_stride]; + + if(a_ver != abuf[x]) a_ver = ((a_ver * ys_fract) + (abuf[x] * (0x100 - ys_fract))) >> 8; + if(a_hor != abuf[x]) a_hor = ((a_hor * xs_fract) + (abuf[x] * (0x100 - xs_fract))) >> 8; + abuf[x] = (a_ver + a_hor) >> 1; + + if(abuf[x] == 0x00) continue; + } + else { + abuf[x] = 0xff; + } + + if(cbuf[x] != px_ver || cbuf[x] != px_hor) { + uint16_t v = lv_color_16_16_mix(px_ver, cbuf[x], ys_fract); + uint16_t h = lv_color_16_16_mix(px_hor, cbuf[x], xs_fract); + cbuf[x] = lv_color_16_16_mix(h, v, LV_OPA_50); + } + } + /*Partially out of the image*/ + else { + lv_opa_t a; + if(src_has_a8) { + const lv_opa_t * src_alpha_tmp = src_alpha; + src_alpha_tmp += (ys_int * alpha_stride) + xs_int; + a = src_alpha_tmp[0]; + } + else { + a = 0xff; + } + + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + abuf[x] = (a * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + abuf[x] = (a * (0xFF - ys_fract)) >> 8; + } + else { + abuf[x] = a; + } + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_A8 + +static void transform_a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * abuf, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = (0x7F - xs_fract) * 2; + } + else { + x_next = 1; + xs_fract = (xs_fract - 0x80) * 2; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = (0x7F - ys_fract) * 2; + } + else { + y_next = 1; + ys_fract = (ys_fract - 0x80) * 2; + } + + const uint8_t * src_tmp = src; + src_tmp += ys_int * src_stride + xs_int; + abuf[x] = src_tmp[0]; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + lv_opa_t a_ver = src_tmp[x_next]; + lv_opa_t a_hor = src_tmp[y_next * src_stride]; + + if(a_ver != abuf[x]) a_ver = ((a_ver * ys_fract) + (abuf[x] * (0x100 - ys_fract))) >> 8; + if(a_hor != abuf[x]) a_hor = ((a_hor * xs_fract) + (abuf[x] * (0x100 - xs_fract))) >> 8; + abuf[x] = (a_ver + a_hor) >> 1; + } + else { + /*Partially out of the image*/ + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + abuf[x] = (src_tmp[0] * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + abuf[x] = (src_tmp[0] * (0xFF - ys_fract)) >> 8; + } + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_L8 || LV_DRAW_SW_SUPPORT_AL88 + +static void transform_al88(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + cbuf[x] = 0x00; + abuf[x] = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = (0x7F - xs_fract) * 2; + } + else { + x_next = 1; + xs_fract = (xs_fract - 0x80) * 2; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = (0x7F - ys_fract) * 2; + } + else { + y_next = 1; + ys_fract = (ys_fract - 0x80) * 2; + } + + if(src_has_a8) { + const lv_color16a_t * src_tmp = (const lv_color16a_t *)(src + ys_int * src_stride + xs_int * 2); + cbuf[x] = src_tmp[0].lumi; + abuf[x] = src_tmp[0].alpha; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + lv_color16a_t px_hor = src_tmp[x_next]; + lv_color16a_t px_ver = *(const lv_color16a_t *)((uint8_t *)src_tmp + (y_next * src_stride)); + + /* Interpolate luminance */ + uint8_t l_ver = px_ver.lumi; + uint8_t l_hor = px_hor.lumi; + if(l_ver != cbuf[x]) l_ver = ((l_ver * ys_fract) + (cbuf[x] * (0x100 - ys_fract))) >> 8; + if(l_hor != cbuf[x]) l_hor = ((l_hor * xs_fract) + (cbuf[x] * (0x100 - xs_fract))) >> 8; + cbuf[x] = (l_ver + l_hor) >> 1; + + /* Interpolate alpha */ + uint8_t a_ver = px_ver.alpha; + uint8_t a_hor = px_hor.alpha; + if(a_ver != abuf[x]) a_ver = ((a_ver * ys_fract) + (abuf[x] * (0x100 - ys_fract))) >> 8; + if(a_hor != abuf[x]) a_hor = ((a_hor * xs_fract) + (abuf[x] * (0x100 - xs_fract))) >> 8; + abuf[x] = (a_ver + a_hor) >> 1; + } + else { + /*Partially out of the image*/ + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + abuf[x] = (abuf[x] * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + abuf[x] = (abuf[x] * (0xFF - ys_fract)) >> 8; + } + } + } + else { + /* L8 format: 1 byte per pixel, no separate alpha channel */ + const uint8_t * src_tmp = src + ys_int * src_stride + xs_int; + cbuf[x] = src_tmp[0]; + abuf[x] = 0xff; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + uint8_t l_ver = src_tmp[y_next * src_stride]; + uint8_t l_hor = src_tmp[x_next]; + + if(l_ver != cbuf[x]) l_ver = ((l_ver * ys_fract) + (cbuf[x] * (0x100 - ys_fract))) >> 8; + if(l_hor != cbuf[x]) l_hor = ((l_hor * xs_fract) + (cbuf[x] * (0x100 - xs_fract))) >> 8; + cbuf[x] = (l_ver + l_hor) >> 1; + } + else { + /*Partially out of the image - reduce alpha for edge pixels*/ + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + abuf[x] = (0xff * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + abuf[x] = (0xff * (0xFF - ys_fract)) >> 8; + } + } + } + } +} + +#endif + +static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int32_t yin, int32_t * xout, + int32_t * yout) +{ + if(t->angle == 0 && t->scale_x == LV_SCALE_NONE && t->scale_y == LV_SCALE_NONE) { + *xout = xin * 256; + *yout = yin * 256; + return; + } + + xin -= t->pivot.x; + yin -= t->pivot.y; + + if(t->angle == 0) { + *xout = ((int32_t)(xin * 256 * 256 / t->scale_x)) + (t->pivot_x_256); + *yout = ((int32_t)(yin * 256 * 256 / t->scale_y)) + (t->pivot_y_256); + } + else if(t->scale_x == LV_SCALE_NONE && t->scale_y == LV_SCALE_NONE) { + *xout = ((t->cosma * xin - t->sinma * yin) >> 2) + (t->pivot_x_256); + *yout = ((t->sinma * xin + t->cosma * yin) >> 2) + (t->pivot_y_256); + } + else { + *xout = (((t->cosma * xin - t->sinma * yin) * 256 / t->scale_x) >> 2) + (t->pivot_x_256); + *yout = (((t->sinma * xin + t->cosma * yin) * 256 / t->scale_y) >> 2) + (t->pivot_y_256); + } +} + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_triangle.c b/inc/lvgl/src/draw/sw/lv_draw_sw_triangle.c new file mode 100644 index 0000000..0cfc36d --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_triangle.c @@ -0,0 +1,205 @@ +/** + * @file lv_draw_sw_triangle.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_mask_private.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "../lv_draw_private.h" +#include "lv_draw_sw.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_mem.h" +#include "../../misc/lv_area_private.h" +#include "../../misc/lv_color.h" +#include "../../stdlib/lv_string.h" +#include "../lv_draw_triangle_private.h" +#include "lv_draw_sw_grad.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc) +{ +#if LV_DRAW_SW_COMPLEX + lv_area_t tri_area; + tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + bool is_common; + lv_area_t draw_area; + is_common = lv_area_intersect(&draw_area, &tri_area, &t->clip_area); + if(!is_common) return; + + lv_point_t p[3]; + /*If there is a vertical side use it as p[0] and p[1]*/ + if(dsc->p[0].x == dsc->p[1].x) { + p[0] = lv_point_from_precise(&dsc->p[0]); + p[1] = lv_point_from_precise(&dsc->p[1]); + p[2] = lv_point_from_precise(&dsc->p[2]); + } + else if(dsc->p[0].x == dsc->p[2].x) { + p[0] = lv_point_from_precise(&dsc->p[0]); + p[1] = lv_point_from_precise(&dsc->p[2]); + p[2] = lv_point_from_precise(&dsc->p[1]); + } + else if(dsc->p[1].x == dsc->p[2].x) { + p[0] = lv_point_from_precise(&dsc->p[1]); + p[1] = lv_point_from_precise(&dsc->p[2]); + p[2] = lv_point_from_precise(&dsc->p[0]); + } + else { + p[0] = lv_point_from_precise(&dsc->p[0]); + p[1] = lv_point_from_precise(&dsc->p[1]); + p[2] = lv_point_from_precise(&dsc->p[2]); + + /*Set the smallest y as p[0]*/ + if(p[0].y > p[1].y) lv_point_swap(&p[0], &p[1]); + if(p[0].y > p[2].y) lv_point_swap(&p[0], &p[2]); + + /*Set the greatest y as p[1]*/ + if(p[1].y < p[2].y) lv_point_swap(&p[1], &p[2]); + } + + /*Be sure p[0] is on top followed by lowest point (p[1]) and middle point last (p[2])*/ + if(p[0].y > p[2].y) lv_point_swap(&p[0], &p[2]); + if(p[0].y > p[1].y) lv_point_swap(&p[0], &p[1]); + if(p[1].y < p[2].y) lv_point_swap(&p[1], &p[2]); + + /*If right == true p[2] is on the right side of the p[0] p[1] line*/ + bool right = ((p[1].x - p[0].x) * (p[2].y - p[0].y) - (p[1].y - p[0].y) * (p[2].x - p[0].x)) < 0; + + void * masks[4] = {0}; + lv_draw_sw_mask_line_param_t mask_left; + lv_draw_sw_mask_line_param_t mask_right; + lv_draw_sw_mask_line_param_t mask_bottom; + + lv_draw_sw_mask_line_points_init(&mask_left, p[0].x, p[0].y, + p[1].x, p[1].y, + right ? LV_DRAW_SW_MASK_LINE_SIDE_RIGHT : LV_DRAW_SW_MASK_LINE_SIDE_LEFT); + + lv_draw_sw_mask_line_points_init(&mask_right, p[0].x, p[0].y, + p[2].x, p[2].y, + right ? LV_DRAW_SW_MASK_LINE_SIDE_LEFT : LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + + if(p[1].y == p[2].y) { + lv_draw_sw_mask_line_points_init(&mask_bottom, p[1].x, p[1].y, + p[2].x, p[2].y, LV_DRAW_SW_MASK_LINE_SIDE_TOP); + } + else { + lv_draw_sw_mask_line_points_init(&mask_bottom, p[1].x, p[1].y, + p[2].x, p[2].y, + right ? LV_DRAW_SW_MASK_LINE_SIDE_LEFT : LV_DRAW_SW_MASK_LINE_SIDE_RIGHT); + } + + masks[0] = &mask_left; + masks[1] = &mask_right; + masks[2] = &mask_bottom; + int32_t area_w = lv_area_get_width(&draw_area); + lv_opa_t * mask_buf = lv_malloc(area_w); + + lv_area_t blend_area = draw_area; + blend_area.y2 = blend_area.y1; + lv_draw_sw_blend_dsc_t blend_dsc; + blend_dsc.color = dsc->color; + blend_dsc.opa = dsc->opa; + blend_dsc.mask_buf = mask_buf; + blend_dsc.blend_area = &blend_area; + blend_dsc.mask_area = &blend_area; + blend_dsc.mask_stride = 0; + blend_dsc.blend_mode = LV_BLEND_MODE_NORMAL; + blend_dsc.src_buf = NULL; + + lv_grad_dir_t grad_dir = dsc->grad.dir; + + lv_draw_sw_grad_calc_t * grad = lv_draw_sw_grad_get(&dsc->grad, lv_area_get_width(&tri_area), + lv_area_get_height(&tri_area)); + lv_opa_t * grad_opa_map = NULL; + if(grad && grad_dir == LV_GRAD_DIR_HOR) { + blend_dsc.src_area = &blend_area; + blend_dsc.src_buf = grad->color_map + draw_area.x1 - tri_area.x1; + grad_opa_map = grad->opa_map + draw_area.x1 - tri_area.x1; + blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB888; + } + + int32_t y; + for(y = draw_area.y1; y <= draw_area.y2; y++) { + blend_area.y1 = y; + blend_area.y2 = y; + lv_memset(mask_buf, 0xff, area_w); + blend_dsc.mask_res = lv_draw_sw_mask_apply(masks, mask_buf, draw_area.x1, y, area_w); + if(grad_dir == LV_GRAD_DIR_VER) { + LV_ASSERT_NULL(grad); + blend_dsc.color = grad->color_map[y - tri_area.y1]; + blend_dsc.opa = grad->opa_map[y - tri_area.y1]; + if(dsc->opa < LV_OPA_MAX) blend_dsc.opa = LV_OPA_MIX2(blend_dsc.opa, dsc->opa); + } + else if(grad_dir == LV_GRAD_DIR_HOR) { + if(grad_opa_map) { + int32_t i; + if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_CHANGED) { + blend_dsc.mask_buf = mask_buf; + for(i = 0; i < area_w; i++) { + if(grad_opa_map[i] < LV_OPA_MAX) mask_buf[i] = LV_OPA_MIX2(mask_buf[i], grad_opa_map[i]); + } + } + else if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) { + blend_dsc.mask_buf = grad_opa_map; + blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; + } + else if(blend_dsc.mask_res == LV_DRAW_SW_MASK_RES_TRANSP) { + continue; + } + } + } + lv_draw_sw_blend(t, &blend_dsc); + } + + lv_free(mask_buf); + lv_draw_sw_mask_free_param(&mask_bottom); + lv_draw_sw_mask_free_param(&mask_left); + lv_draw_sw_mask_free_param(&mask_right); + + if(grad) { + lv_draw_sw_grad_cleanup(grad); + } + +#else + LV_UNUSED(t); + LV_UNUSED(dsc); + LV_LOG_WARN("Can't draw triangles with LV_DRAW_SW_COMPLEX == 0"); +#endif /*LV_DRAW_SW_COMPLEX*/ +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_utils.c b/inc/lvgl/src/draw/sw/lv_draw_sw_utils.c new file mode 100644 index 0000000..0f2635a --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_utils.c @@ -0,0 +1,596 @@ +/** + * @file lv_draw_sw_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_utils.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ +#ifndef LV_DRAW_SW_RGB565_SWAP + #define LV_DRAW_SW_RGB565_SWAP(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE90_ARGB8888 + #define LV_DRAW_SW_ROTATE90_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE180_ARGB8888 + #define LV_DRAW_SW_ROTATE180_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE270_ARGB8888 + #define LV_DRAW_SW_ROTATE270_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE90_RGB888 + #define LV_DRAW_SW_ROTATE90_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE180_RGB888 + #define LV_DRAW_SW_ROTATE180_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE270_RGB888 + #define LV_DRAW_SW_ROTATE270_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE90_RGB565 + #define LV_DRAW_SW_ROTATE90_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE180_RGB565 + #define LV_DRAW_SW_ROTATE180_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE270_RGB565 + #define LV_DRAW_SW_ROTATE270_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE90_L8 + #define LV_DRAW_SW_ROTATE90_L8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE180_L8 + #define LV_DRAW_SW_ROTATE180_L8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ROTATE270_L8 + #define LV_DRAW_SW_ROTATE270_L8(...) LV_RESULT_INVALID +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_DRAW_SW_SUPPORT_ARGB8888 || LV_DRAW_SW_SUPPORT_XRGB8888 +static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride); +static void rotate180_argb8888(const uint32_t * src, uint32_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride); +static void rotate270_argb8888(const uint32_t * src, uint32_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride); +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 +static void rotate90_rgb888(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride); +static void rotate180_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride); +static void rotate270_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dst_stride); +#endif +#if LV_DRAW_SW_SUPPORT_RGB565 +static void rotate90_rgb565(const uint16_t * src, uint16_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride); +static void rotate180_rgb565(const uint16_t * src, uint16_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride); +static void rotate270_rgb565(const uint16_t * src, uint16_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride); +#endif + +#if LV_DRAW_SW_SUPPORT_L8 + +static void rotate90_l8(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride); +static void rotate180_l8(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride); +static void rotate270_l8(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_i1_to_argb8888(const void * buf_i1, void * buf_argb8888, uint32_t width, uint32_t height, + uint32_t buf_i1_stride, uint32_t buf_argb8888_stride, uint32_t index0_color, uint32_t index1_color) +{ + /*Extract the bits of I1 px_map and convert them to ARGB8888*/ + const uint8_t * src = buf_i1; + uint32_t * dst = buf_argb8888; + uint32_t i1_row_byte_count = width / 8; + for(uint32_t row = 0; row < height; row++) { + uint32_t * dst_p = dst; + for(uint32_t i = 0; i < i1_row_byte_count; i++) { + /*From MSB to LSB (pixel 0 to pixel 7 in a byte)*/ + for(int32_t bit = 7; bit >= 0; bit--) { + *dst_p++ = ((src[i] >> bit) & 1) ? index1_color : index0_color; + } + } + src += buf_i1_stride; + dst += buf_argb8888_stride / 4; + } +} + +void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px) +{ + if(LV_DRAW_SW_RGB565_SWAP(buf, buf_size_px) == LV_RESULT_OK) return; + + uint16_t * buf16 = buf; + + /*2 pixels will be processed later, so handle 1 pixel alignment*/ + if((lv_uintptr_t)buf16 & 0x2) { + buf16[0] = ((buf16[0] & 0xff00) >> 8) | ((buf16[0] & 0x00ff) << 8); + buf16++; + buf_size_px--; + } + + uint32_t * buf32 = (uint32_t *)buf16; + uint32_t u32_cnt = buf_size_px / 2; + + while(u32_cnt >= 8) { + buf32[0] = ((buf32[0] & 0xff00ff00) >> 8) | ((buf32[0] & 0x00ff00ff) << 8); + buf32[1] = ((buf32[1] & 0xff00ff00) >> 8) | ((buf32[1] & 0x00ff00ff) << 8); + buf32[2] = ((buf32[2] & 0xff00ff00) >> 8) | ((buf32[2] & 0x00ff00ff) << 8); + buf32[3] = ((buf32[3] & 0xff00ff00) >> 8) | ((buf32[3] & 0x00ff00ff) << 8); + buf32[4] = ((buf32[4] & 0xff00ff00) >> 8) | ((buf32[4] & 0x00ff00ff) << 8); + buf32[5] = ((buf32[5] & 0xff00ff00) >> 8) | ((buf32[5] & 0x00ff00ff) << 8); + buf32[6] = ((buf32[6] & 0xff00ff00) >> 8) | ((buf32[6] & 0x00ff00ff) << 8); + buf32[7] = ((buf32[7] & 0xff00ff00) >> 8) | ((buf32[7] & 0x00ff00ff) << 8); + buf32 += 8; + u32_cnt -= 8; + } + + while(u32_cnt) { + *buf32 = ((*buf32 & 0xff00ff00) >> 8) | ((*buf32 & 0x00ff00ff) << 8); + buf32++; + u32_cnt--; + } + + /*Process the last pixel if needed*/ + if(buf_size_px & 0x1) { + uint32_t e = buf_size_px - 1; + buf16[e] = ((buf16[e] & 0xff00) >> 8) | ((buf16[e] & 0x00ff) << 8); + } + +} + +void lv_draw_sw_i1_invert(void * buf, uint32_t buf_size) +{ + if(buf == NULL) return; + + uint8_t * byte_buf = (uint8_t *)buf; + uint32_t i; + + /*Make the buffer aligned*/ + while(((uintptr_t)(byte_buf) & (sizeof(int) - 1)) && buf_size > 0) { + *byte_buf = ~(*byte_buf); + byte_buf++; + buf_size--; + } + + if(buf_size >= sizeof(uint32_t)) { + uint32_t * aligned_addr = (uint32_t *)byte_buf; + uint32_t word_count = buf_size / 4; + + for(i = 0; i < word_count; ++i) { + aligned_addr[i] = ~aligned_addr[i]; + } + + byte_buf = (uint8_t *)(aligned_addr + word_count); + buf_size = buf_size % sizeof(uint32_t); + } + + for(i = 0; i < buf_size; ++i) { + byte_buf[i] = ~byte_buf[i]; + } +} + +void lv_draw_sw_i1_convert_to_vtiled(const void * buf, uint32_t buf_size, uint32_t width, uint32_t height, + void * out_buf, + uint32_t out_buf_size, bool bit_order_lsb) +{ + LV_ASSERT(buf && out_buf); + LV_ASSERT(width % 8 == 0 && height % 8 == 0); + LV_ASSERT(buf_size >= (width / 8) * height); + LV_ASSERT(out_buf_size >= buf_size); + + lv_memset(out_buf, 0, out_buf_size); + + const uint8_t * src_buf = (uint8_t *)buf; + uint8_t * dst_buf = (uint8_t *)out_buf; + + for(uint32_t y = 0; y < height; y++) { + for(uint32_t x = 0; x < width; x++) { + uint32_t src_index = y * width + x; + uint32_t dst_index = x * height + y; + uint8_t bit = (src_buf[src_index / 8] >> (7 - (src_index % 8))) & 0x01; + if(bit_order_lsb) { + dst_buf[dst_index / 8] |= (bit << (dst_index % 8)); + } + else { + dst_buf[dst_index / 8] |= (bit << (7 - (dst_index % 8))); + } + } + } +} + +void lv_draw_sw_rotate(const void * src, void * dest, int32_t src_width, int32_t src_height, int32_t src_stride, + int32_t dest_stride, lv_display_rotation_t rotation, lv_color_format_t color_format) +{ + if(rotation == LV_DISPLAY_ROTATION_90) { + switch(color_format) { +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + rotate90_l8(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rotate90_rgb565(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rotate90_rgb888(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 || LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB8888: + rotate90_argb8888(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif + default: + break; + } + + return; + } + + if(rotation == LV_DISPLAY_ROTATION_180) { + switch(color_format) { +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + rotate180_l8(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rotate180_rgb565(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rotate180_rgb888(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 || LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB8888: + rotate180_argb8888(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif + default: + break; + } + + return; + } + + if(rotation == LV_DISPLAY_ROTATION_270) { + switch(color_format) { +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + rotate270_l8(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rotate270_rgb565(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rotate270_rgb888(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 || LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB8888: + rotate270_argb8888(src, dest, src_width, src_height, src_stride, dest_stride); + break; +#endif + default: + break; + } + + return; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_SW_SUPPORT_ARGB8888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +static void rotate270_argb8888(const uint32_t * src, uint32_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_ARGB8888(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + src_stride /= sizeof(uint32_t); + dst_stride /= sizeof(uint32_t); + + for(int32_t x = 0; x < src_width; ++x) { + int32_t dstIndex = x * dst_stride; + int32_t srcIndex = x; + for(int32_t y = 0; y < src_height; ++y) { + dst[dstIndex + (src_height - y - 1)] = src[srcIndex]; + srcIndex += src_stride; + } + } +} + +static void rotate180_argb8888(const uint32_t * src, uint32_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride) +{ + LV_UNUSED(dest_stride); + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_ARGB8888(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + src_stride /= sizeof(uint32_t); + dest_stride /= sizeof(uint32_t); + + for(int32_t y = 0; y < height; ++y) { + int32_t dstIndex = (height - y - 1) * dest_stride; + int32_t srcIndex = y * src_stride; + for(int32_t x = 0; x < width; ++x) { + dst[dstIndex + width - x - 1] = src[srcIndex + x]; + } + } +} + +static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, int32_t dst_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_ARGB8888(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + src_stride /= sizeof(uint32_t); + dst_stride /= sizeof(uint32_t); + + for(int32_t x = 0; x < src_width; ++x) { + int32_t dstIndex = (src_width - x - 1); + int32_t srcIndex = x; + for(int32_t y = 0; y < src_height; ++y) { + dst[dstIndex * dst_stride + y] = src[srcIndex]; + srcIndex += src_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 + +static void rotate90_rgb888(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB888(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + for(int32_t x = 0; x < src_width; ++x) { + for(int32_t y = 0; y < src_height; ++y) { + int32_t srcIndex = y * src_stride + x * 3; + int32_t dstIndex = (src_width - x - 1) * dst_stride + y * 3; + dst[dstIndex] = src[srcIndex]; /*Red*/ + dst[dstIndex + 1] = src[srcIndex + 1]; /*Green*/ + dst[dstIndex + 2] = src[srcIndex + 2]; /*Blue*/ + } + } +} + +static void rotate180_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_RGB888(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + for(int32_t y = 0; y < height; ++y) { + for(int32_t x = 0; x < width; ++x) { + int32_t srcIndex = y * src_stride + x * 3; + int32_t dstIndex = (height - y - 1) * dest_stride + (width - x - 1) * 3; + dst[dstIndex] = src[srcIndex]; + dst[dstIndex + 1] = src[srcIndex + 1]; + dst[dstIndex + 2] = src[srcIndex + 2]; + } + } +} + +static void rotate270_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dst_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB888(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + for(int32_t x = 0; x < width; ++x) { + for(int32_t y = 0; y < height; ++y) { + int32_t srcIndex = y * src_stride + x * 3; + int32_t dstIndex = x * dst_stride + (height - y - 1) * 3; + dst[dstIndex] = src[srcIndex]; /*Red*/ + dst[dstIndex + 1] = src[srcIndex + 1]; /*Green*/ + dst[dstIndex + 2] = src[srcIndex + 2]; /*Blue*/ + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + +static void rotate270_rgb565(const uint16_t * src, uint16_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB565(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + src_stride /= sizeof(uint16_t); + dst_stride /= sizeof(uint16_t); + + for(int32_t x = 0; x < src_width; ++x) { + int32_t dstIndex = x * dst_stride; + int32_t srcIndex = x; + for(int32_t y = 0; y < src_height; ++y) { + dst[dstIndex + (src_height - y - 1)] = src[srcIndex]; + srcIndex += src_stride; + } + } +} + +static void rotate180_rgb565(const uint16_t * src, uint16_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_RGB565(src, dst, width, height, src_stride)) { + return ; + } + + src_stride /= sizeof(uint16_t); + dest_stride /= sizeof(uint16_t); + + for(int32_t y = 0; y < height; ++y) { + int32_t dstIndex = (height - y - 1) * dest_stride; + int32_t srcIndex = y * src_stride; + for(int32_t x = 0; x < width; ++x) { + dst[dstIndex + width - x - 1] = src[srcIndex + x]; + } + } +} + +static void rotate90_rgb565(const uint16_t * src, uint16_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB565(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + src_stride /= sizeof(uint16_t); + dst_stride /= sizeof(uint16_t); + + for(int32_t x = 0; x < src_width; ++x) { + int32_t dstIndex = (src_width - x - 1); + int32_t srcIndex = x; + for(int32_t y = 0; y < src_height; ++y) { + dst[dstIndex * dst_stride + y] = src[srcIndex]; + srcIndex += src_stride; + } + } +} + +#endif + + +#if LV_DRAW_SW_SUPPORT_L8 + +static void rotate90_l8(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_L8(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + for(int32_t x = 0; x < src_width; ++x) { + int32_t dstIndex = (src_width - x - 1); + int32_t srcIndex = x; + for(int32_t y = 0; y < src_height; ++y) { + dst[dstIndex * dst_stride + y] = src[srcIndex]; + srcIndex += src_stride; + } + } +} + +static void rotate180_l8(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t src_stride, + int32_t dest_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_L8(src, dst, width, height, src_stride)) { + return ; + } + + for(int32_t y = 0; y < height; ++y) { + int32_t dstIndex = (height - y - 1) * dest_stride; + int32_t srcIndex = y * src_stride; + for(int32_t x = 0; x < width; ++x) { + dst[dstIndex + width - x - 1] = src[srcIndex + x]; + } + } +} + +static void rotate270_l8(const uint8_t * src, uint8_t * dst, int32_t src_width, int32_t src_height, + int32_t src_stride, + int32_t dst_stride) +{ + if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_L8(src, dst, src_width, src_height, src_stride, dst_stride)) { + return ; + } + + for(int32_t x = 0; x < src_width; ++x) { + int32_t dstIndex = x * dst_stride; + int32_t srcIndex = x; + for(int32_t y = 0; y < src_height; ++y) { + dst[dstIndex + (src_height - y - 1)] = src[srcIndex]; + srcIndex += src_stride; + } + } +} + +#endif + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_utils.h b/inc/lvgl/src/draw/sw/lv_draw_sw_utils.h new file mode 100644 index 0000000..cf47892 --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_utils.h @@ -0,0 +1,111 @@ +/** + * @file lv_draw_sw_utils.h + * + */ + +#ifndef LV_DRAW_SW_UTILS_H +#define LV_DRAW_SW_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_DRAW_SW + +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" +#include "../../display/lv_display.h" + + +/********************* + * DEFINES + *********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Converts an I1 buffer to ARGB8888 format. + * @param buf_i1 pointer to buffer with I1 formatted render + * @param buf_argb8888 pointer to buffer for ARGB8888 render + * @param width width in pixels of the area. + * must be a multiple of 8. + * @param height height in pixels of the area + * @param buf_i1_stride stride of i1 buffer in bytes + * @param buf_argb8888_stride stride of argb8888 buffer in bytes + * @param index0_color color of the 0 bits of i1 buf + * @param index1_color color of the 1 bits of i1 buf + */ +void lv_draw_sw_i1_to_argb8888(const void * buf_i1, void * buf_argb8888, uint32_t width, uint32_t height, + uint32_t buf_i1_stride, uint32_t buf_argb8888_stride, uint32_t index0_color, uint32_t index1_color); + +/** + * Swap the upper and lower byte of an RGB565 buffer. + * Might be required if a 8bit parallel port or an SPI port send the bytes in the wrong order. + * The bytes will be swapped in place. + * @param buf pointer to buffer + * @param buf_size_px number of pixels in the buffer + */ +void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px); + +/** + * Invert a draw buffer in the I1 color format. + * Conventionally, a bit is set to 1 during blending if the luminance is greater than 127. + * Depending on the display controller used, you might want to have different behavior. + * The inversion will be performed in place. + * @param buf pointer to the buffer to be inverted + * @param buf_size size of the buffer in bytes + */ +void lv_draw_sw_i1_invert(void * buf, uint32_t buf_size); + + +/** + * Convert a draw buffer in I1 color format from htiled (row-wise) + * to vtiled (column-wise) buffer layout. The conversion assumes that the buffer width + * and height is rounded to a multiple of 8. + * @param buf pointer to the buffer to be converted + * @param buf_size size of the buffer in bytes + * @param width width of the buffer + * @param height height of the buffer + * @param out_buf pointer to the output buffer + * @param out_buf_size size of the output buffer in bytes + * @param bit_order_lsb bit order of the resulting vtiled buffer + */ +void lv_draw_sw_i1_convert_to_vtiled(const void * buf, uint32_t buf_size, uint32_t width, uint32_t height, + void * out_buf, + uint32_t out_buf_size, bool bit_order_lsb); + +/** + * Rotate a buffer into another buffer + * @param src the source buffer + * @param dest the destination buffer + * @param src_width source width in pixels + * @param src_height source height in pixels + * @param src_stride source stride in bytes (number of bytes in a row) + * @param dest_stride destination stride in bytes (number of bytes in a row) + * @param rotation LV_DISPLAY_ROTATION_0/90/180/270 + * @param color_format LV_COLOR_FORMAT_RGB565/RGB888/XRGB8888/ARGB8888 + */ +void lv_draw_sw_rotate(const void * src, void * dest, int32_t src_width, int32_t src_height, int32_t src_stride, + int32_t dest_stride, lv_display_rotation_t rotation, lv_color_format_t color_format); + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_UTILS_H*/ diff --git a/inc/lvgl/src/draw/sw/lv_draw_sw_vector.c b/inc/lvgl/src/draw/sw/lv_draw_sw_vector.c new file mode 100644 index 0000000..114d1cd --- /dev/null +++ b/inc/lvgl/src/draw/sw/lv_draw_sw_vector.c @@ -0,0 +1,539 @@ +/** + * @file lv_draw_sw_vector.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_image_decoder_private.h" +#include "../lv_draw_vector_private.h" +#include "../lv_draw_private.h" +#include "lv_draw_sw.h" + +#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG +#if LV_USE_THORVG_EXTERNAL + #include +#else + #include "../../libs/thorvg/thorvg_capi.h" +#endif +#include "../../stdlib/lv_string.h" +#include "blend/lv_draw_sw_blend_private.h" +#include "blend/lv_draw_sw_blend_to_rgb565.h" +#include "blend/lv_draw_sw_blend_to_rgb888.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + float x; + float y; + float w; + float h; +} _tvg_rect; + +typedef struct { + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t a; +} _tvg_color; + +typedef struct { + Tvg_Canvas * canvas; + int32_t partial_y_offset; + int32_t translate_x; + int32_t translate_y; + lv_opa_t opa; +} _tvg_draw_state; +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +static void lv_area_to_tvg(_tvg_rect * rect, const lv_area_t * area) +{ + rect->x = area->x1; + rect->y = area->y1; + rect->w = lv_area_get_width(area); + rect->h = lv_area_get_height(area); +} + +static void lv_color_to_tvg(_tvg_color * color, const lv_color32_t * c, lv_opa_t opa) +{ + color->r = c->red; + color->g = c->green; + color->b = c->blue; + color->a = LV_OPA_MIX2(c->alpha, opa); +} + +static void lv_matrix_to_tvg(Tvg_Matrix * tm, const lv_matrix_t * m) +{ + tm->e11 = m->m[0][0]; + tm->e12 = m->m[0][1]; + tm->e13 = m->m[0][2]; + tm->e21 = m->m[1][0]; + tm->e22 = m->m[1][1]; + tm->e23 = m->m[1][2]; + tm->e31 = m->m[2][0]; + tm->e32 = m->m[2][1]; + tm->e33 = m->m[2][2]; +} + +static void _set_paint_matrix(Tvg_Paint * obj, const Tvg_Matrix * m) +{ + tvg_paint_set_transform(obj, m); +} + +static void _set_paint_shape(Tvg_Paint * obj, const lv_vector_path_t * p) +{ + uint32_t pidx = 0; + lv_vector_path_op_t * op = lv_array_front(&p->ops); + uint32_t size = lv_array_size(&p->ops); + for(uint32_t i = 0; i < size; i++) { + switch(op[i]) { + case LV_VECTOR_PATH_OP_MOVE_TO: { + lv_fpoint_t * pt = lv_array_at(&p->points, pidx); + tvg_shape_move_to(obj, pt->x, pt->y); + pidx += 1; + } + break; + case LV_VECTOR_PATH_OP_LINE_TO: { + lv_fpoint_t * pt = lv_array_at(&p->points, pidx); + tvg_shape_line_to(obj, pt->x, pt->y); + pidx += 1; + } + break; + case LV_VECTOR_PATH_OP_QUAD_TO: { + lv_fpoint_t * pt1 = lv_array_at(&p->points, pidx); + lv_fpoint_t * pt2 = lv_array_at(&p->points, pidx + 1); + + lv_fpoint_t * last_pt = lv_array_at(&p->points, pidx - 1); + + lv_fpoint_t cp[2]; + cp[0].x = (last_pt->x + 2 * pt1->x) * (1.0f / 3.0f); + cp[0].y = (last_pt->y + 2 * pt1->y) * (1.0f / 3.0f); + cp[1].x = (pt2->x + 2 * pt1->x) * (1.0f / 3.0f); + cp[1].y = (pt2->y + 2 * pt1->y) * (1.0f / 3.0f); + + tvg_shape_cubic_to(obj, cp[0].x, cp[0].y, cp[1].x, cp[1].y, pt2->x, pt2->y); + pidx += 2; + } + break; + case LV_VECTOR_PATH_OP_CUBIC_TO: { + lv_fpoint_t * pt1 = lv_array_at(&p->points, pidx); + lv_fpoint_t * pt2 = lv_array_at(&p->points, pidx + 1); + lv_fpoint_t * pt3 = lv_array_at(&p->points, pidx + 2); + + tvg_shape_cubic_to(obj, pt1->x, pt1->y, pt2->x, pt2->y, pt3->x, pt3->y); + pidx += 3; + } + break; + case LV_VECTOR_PATH_OP_CLOSE: { + tvg_shape_close(obj); + } + break; + } + } +} + +static Tvg_Stroke_Cap lv_stroke_cap_to_tvg(lv_vector_stroke_cap_t cap) +{ + switch(cap) { + case LV_VECTOR_STROKE_CAP_SQUARE: + return TVG_STROKE_CAP_SQUARE; + case LV_VECTOR_STROKE_CAP_ROUND: + return TVG_STROKE_CAP_ROUND; + case LV_VECTOR_STROKE_CAP_BUTT: + return TVG_STROKE_CAP_BUTT; + default: + return TVG_STROKE_CAP_SQUARE; + } +} + +static Tvg_Stroke_Join lv_stroke_join_to_tvg(lv_vector_stroke_join_t join) +{ + switch(join) { + case LV_VECTOR_STROKE_JOIN_BEVEL: + return TVG_STROKE_JOIN_BEVEL; + case LV_VECTOR_STROKE_JOIN_ROUND: + return TVG_STROKE_JOIN_ROUND; + case LV_VECTOR_STROKE_JOIN_MITER: + return TVG_STROKE_JOIN_MITER; + default: + return TVG_STROKE_JOIN_BEVEL; + } +} + +static Tvg_Stroke_Fill lv_spread_to_tvg(lv_vector_gradient_spread_t sp) +{ + switch(sp) { + case LV_VECTOR_GRADIENT_SPREAD_PAD: + return TVG_STROKE_FILL_PAD; + case LV_VECTOR_GRADIENT_SPREAD_REPEAT: + return TVG_STROKE_FILL_REPEAT; + case LV_VECTOR_GRADIENT_SPREAD_REFLECT: + return TVG_STROKE_FILL_REFLECT; + default: + return TVG_STROKE_FILL_PAD; + } +} + +static void _setup_gradient(Tvg_Gradient * gradient, const lv_vector_gradient_t * grad, + const lv_matrix_t * matrix) +{ + Tvg_Color_Stop * stops = (Tvg_Color_Stop *)lv_malloc(sizeof(Tvg_Color_Stop) * grad->stops_count); + LV_ASSERT_MALLOC(stops); + for(uint16_t i = 0; i < grad->stops_count; i++) { + const lv_grad_stop_t * s = &(grad->stops[i]); + + stops[i].offset = s->frac / 255.0f; + stops[i].r = s->color.red; + stops[i].g = s->color.green; + stops[i].b = s->color.blue; + stops[i].a = s->opa; + } + + tvg_gradient_set_color_stops(gradient, stops, grad->stops_count); + tvg_gradient_set_spread(gradient, lv_spread_to_tvg(grad->spread)); + Tvg_Matrix mtx; + lv_matrix_to_tvg(&mtx, matrix); + tvg_gradient_set_transform(gradient, &mtx); + lv_free(stops); +} + +static void _set_paint_stroke_gradient(Tvg_Paint * obj, const lv_vector_gradient_t * g, const lv_matrix_t * m) +{ + Tvg_Gradient * grad = NULL; + if(g->style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { + grad = tvg_radial_gradient_new(); + tvg_radial_gradient_set(grad, g->cx, g->cy, g->cr); + _setup_gradient(grad, g, m); + tvg_shape_set_stroke_radial_gradient(obj, grad); + } + else { + grad = tvg_linear_gradient_new(); + tvg_linear_gradient_set(grad, g->x1, g->y1, g->x2, g->y2); + _setup_gradient(grad, g, m); + tvg_shape_set_stroke_linear_gradient(obj, grad); + } +} + +static void _set_paint_stroke(Tvg_Paint * obj, const lv_vector_stroke_dsc_t * dsc) +{ + if(dsc->style == LV_VECTOR_DRAW_STYLE_SOLID) { + _tvg_color c; + lv_color_to_tvg(&c, &dsc->color, dsc->opa); + tvg_shape_set_stroke_color(obj, c.r, c.g, c.b, c.a); + } + else { /*gradient*/ + _set_paint_stroke_gradient(obj, &dsc->gradient, &dsc->matrix); + } + + tvg_shape_set_stroke_width(obj, dsc->width); + tvg_shape_set_stroke_miterlimit(obj, dsc->miter_limit); + tvg_shape_set_stroke_cap(obj, lv_stroke_cap_to_tvg(dsc->cap)); + tvg_shape_set_stroke_join(obj, lv_stroke_join_to_tvg(dsc->join)); + + if(!lv_array_is_empty(&dsc->dash_pattern)) { + float * dash_array = lv_array_front(&dsc->dash_pattern); + tvg_shape_set_stroke_dash(obj, dash_array, dsc->dash_pattern.size); + } +} + +static Tvg_Fill_Rule lv_fill_rule_to_tvg(lv_vector_fill_t rule) +{ + switch(rule) { + case LV_VECTOR_FILL_NONZERO: + return TVG_FILL_RULE_WINDING; + case LV_VECTOR_FILL_EVENODD: + return TVG_FILL_RULE_EVEN_ODD; + default: + return TVG_FILL_RULE_WINDING; + } +} + +static void _set_paint_fill_gradient(Tvg_Paint * obj, const lv_vector_gradient_t * g, const lv_matrix_t * m) +{ + Tvg_Gradient * grad = NULL; + if(g->style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { + grad = tvg_radial_gradient_new(); + tvg_radial_gradient_set(grad, g->cx, g->cy, g->cr); + _setup_gradient(grad, g, m); + tvg_shape_set_radial_gradient(obj, grad); + } + else { + grad = tvg_linear_gradient_new(); + tvg_linear_gradient_set(grad, g->x1, g->y1, g->x2, g->y2); + _setup_gradient(grad, g, m); + tvg_shape_set_linear_gradient(obj, grad); + } +} + +static void _set_paint_fill_pattern(Tvg_Paint * obj, Tvg_Canvas * canvas, const lv_draw_image_dsc_t * p, + const lv_matrix_t * m, const lv_opa_t opa) +{ + lv_image_decoder_dsc_t decoder_dsc; + lv_image_decoder_args_t args = { 0 }; + args.premultiply = 1; + lv_result_t res = lv_image_decoder_open(&decoder_dsc, p->src, &args); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + return; + } + + if(!decoder_dsc.decoded) { + lv_image_decoder_close(&decoder_dsc); + LV_LOG_ERROR("Image not ready"); + return; + } + + const lv_image_header_t * header = &decoder_dsc.decoded->header; + lv_color_format_t cf = header->cf; + + if(cf != LV_COLOR_FORMAT_ARGB8888) { + lv_image_decoder_close(&decoder_dsc); + LV_LOG_ERROR("Not support image format"); + return; + } + + const uint32_t tvg_stride = header->w * sizeof(uint32_t); + if(header->stride != tvg_stride) { + LV_LOG_WARN("img_stride != tvg_stride (%" LV_PRIu32 " != %" LV_PRIu32 "), width = %" LV_PRIu32, + (uint32_t)header->stride, + tvg_stride, (uint32_t)header->w); + lv_result_t result = lv_draw_buf_adjust_stride((lv_draw_buf_t *)decoder_dsc.decoded, tvg_stride); + if(result != LV_RESULT_OK) { + lv_image_decoder_close(&decoder_dsc); + LV_LOG_ERROR("Failed to adjust stride"); + return; + } + } + + Tvg_Paint * img = tvg_picture_new(); + tvg_picture_load_raw(img, (uint32_t *)decoder_dsc.decoded->data, header->w, header->h, true); + Tvg_Paint * clip_path = tvg_paint_duplicate(obj); + tvg_paint_set_composite_method(img, clip_path, TVG_COMPOSITE_METHOD_CLIP_PATH); + tvg_paint_set_opacity(img, LV_UDIV255(p->opa * opa)); + + Tvg_Matrix mtx; + lv_matrix_to_tvg(&mtx, m); + tvg_paint_set_transform(img, &mtx); + tvg_canvas_push(canvas, img); + lv_image_decoder_close(&decoder_dsc); +} + +static void _set_paint_fill(Tvg_Paint * obj, Tvg_Canvas * canvas, const lv_vector_fill_dsc_t * dsc, + const lv_matrix_t * matrix, const lv_opa_t opa) +{ + tvg_shape_set_fill_rule(obj, lv_fill_rule_to_tvg(dsc->fill_rule)); + + if(dsc->style == LV_VECTOR_DRAW_STYLE_SOLID) { + _tvg_color c; + lv_color_to_tvg(&c, &dsc->color, dsc->opa); + tvg_shape_set_fill_color(obj, c.r, c.g, c.b, c.a); + } + else if(dsc->style == LV_VECTOR_DRAW_STYLE_PATTERN) { + lv_matrix_t imx = *matrix; + + if(dsc->fill_units == LV_VECTOR_FILL_UNITS_OBJECT_BOUNDING_BOX) { + /* Convert to object bounding box coordinates */ + float x, y, w, h; + tvg_paint_get_bounds(obj, &x, &y, &w, &h, false); + lv_matrix_translate(&imx, x, y); + } + + lv_matrix_multiply(&imx, &dsc->matrix); + + _set_paint_fill_pattern(obj, canvas, &dsc->img_dsc, &imx, opa); + } + else if(dsc->style == LV_VECTOR_DRAW_STYLE_GRADIENT) { + _set_paint_fill_gradient(obj, &dsc->gradient, &dsc->matrix); + } +} + +static Tvg_Blend_Method lv_blend_to_tvg(lv_vector_blend_t blend) +{ + switch(blend) { + case LV_VECTOR_BLEND_SRC_OVER: + return TVG_BLEND_METHOD_NORMAL; + case LV_VECTOR_BLEND_SCREEN: + return TVG_BLEND_METHOD_SCREEN; + case LV_VECTOR_BLEND_MULTIPLY: + return TVG_BLEND_METHOD_MULTIPLY; + case LV_VECTOR_BLEND_NONE: + return TVG_BLEND_METHOD_SRCOVER; + case LV_VECTOR_BLEND_ADDITIVE: + return TVG_BLEND_METHOD_ADD; + case LV_VECTOR_BLEND_SRC_IN: + case LV_VECTOR_BLEND_DST_OVER: + case LV_VECTOR_BLEND_DST_IN: + case LV_VECTOR_BLEND_SUBTRACTIVE: + /*not support yet.*/ + default: + return TVG_BLEND_METHOD_NORMAL; + } +} + +static void _set_paint_blend_mode(Tvg_Paint * obj, lv_vector_blend_t blend) +{ + tvg_paint_set_blend_method(obj, lv_blend_to_tvg(blend)); +} + +static void _blend_draw_buf(lv_draw_buf_t * draw_buf, const lv_area_t * dst_area, const lv_draw_buf_t * new_buf, + const lv_area_t * src_area) +{ + lv_draw_sw_blend_image_dsc_t fill_dsc; + fill_dsc.dest_w = src_area->x2; + fill_dsc.dest_h = src_area->y2; + fill_dsc.dest_stride = draw_buf->header.stride; + fill_dsc.dest_buf = draw_buf->data; + + fill_dsc.opa = LV_OPA_100; + fill_dsc.blend_mode = LV_BLEND_MODE_NORMAL; + fill_dsc.src_stride = new_buf->header.stride; + fill_dsc.src_color_format = new_buf->header.cf; + fill_dsc.src_buf = new_buf->data; + + fill_dsc.mask_buf = NULL; + fill_dsc.mask_stride = 0; + + fill_dsc.relative_area = *dst_area; + fill_dsc.src_area = *src_area; + + switch(draw_buf->header.cf) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB565A8: + lv_draw_sw_blend_image_to_rgb565(&fill_dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + lv_draw_sw_blend_image_to_rgb888(&fill_dsc, 3); + break; +#endif + default: + break; + } +} + +static void _task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_path_ctx_t * dsc) +{ + _tvg_draw_state * state = (_tvg_draw_state *)ctx; + Tvg_Canvas * canvas = (Tvg_Canvas *)state->canvas; + + Tvg_Paint * obj = tvg_shape_new(); + + _tvg_rect rc; + lv_area_to_tvg(&rc, &dsc->scissor_area); + + if(!path) { /*clear*/ + _tvg_color c; + lv_color_to_tvg(&c, &dsc->fill_dsc.color, dsc->fill_dsc.opa); + + Tvg_Matrix mtx = { + 1.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 1.0f, + }; + _set_paint_matrix(obj, &mtx); + tvg_shape_append_rect(obj, rc.x + state->translate_x, rc.y + state->translate_y, rc.w, rc.h, 0, 0); + tvg_shape_set_fill_color(obj, c.r, c.g, c.b, c.a); + } + else { + tvg_canvas_set_viewport(canvas, (int32_t)rc.x + state->translate_x, (int32_t)rc.y + state->translate_y, + (int32_t)rc.w, (int32_t)rc.h); + + lv_matrix_t matrix; + lv_matrix_identity(&matrix); + lv_matrix_translate(&matrix, state->translate_x, state->translate_y); + lv_matrix_multiply(&matrix, &dsc->matrix); + Tvg_Matrix mtx; + lv_matrix_to_tvg(&mtx, &matrix); + _set_paint_matrix(obj, &mtx); + + _set_paint_shape(obj, path); + + _set_paint_fill(obj, canvas, &dsc->fill_dsc, &matrix, state->opa); + _set_paint_stroke(obj, &dsc->stroke_dsc); + _set_paint_blend_mode(obj, dsc->blend_mode); + } + tvg_paint_set_opacity(obj, state->opa); + tvg_canvas_push(canvas, obj); +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_sw_vector(lv_draw_task_t * t, lv_draw_vector_dsc_t * dsc) +{ + if(dsc->task_list == NULL) + return; + + lv_layer_t * layer = dsc->base.layer; + lv_draw_buf_t * draw_buf = layer->draw_buf; + if(draw_buf == NULL) + return; + + void * buf = draw_buf->data; + int32_t width = lv_area_get_width(&layer->buf_area); + int32_t height = lv_area_get_height(&layer->buf_area); + uint32_t stride = draw_buf->header.stride; + + lv_color_format_t cf = draw_buf->header.cf; + + bool allow_buffer = false; + lv_draw_buf_t * new_buf = NULL; + + if(cf != LV_COLOR_FORMAT_ARGB8888 && \ + cf != LV_COLOR_FORMAT_XRGB8888) { + allow_buffer = true; + new_buf = lv_draw_buf_create(width, height, LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO); + lv_draw_buf_clear(new_buf, NULL); + buf = new_buf->data; + stride = new_buf->header.stride; + } + Tvg_Canvas * canvas = tvg_swcanvas_create(); + tvg_swcanvas_set_target(canvas, buf, stride / 4, width, height, TVG_COLORSPACE_ARGB8888); + + _tvg_rect rc; + lv_area_to_tvg(&rc, &t->clip_area); + tvg_canvas_set_viewport(canvas, (int32_t)rc.x, (int32_t)(rc.y - layer->partial_y_offset), (int32_t)rc.w, (int32_t)rc.h); + + _tvg_draw_state state = {canvas, layer->partial_y_offset, -layer->buf_area.x1, -layer->buf_area.y1, t->opa}; + + lv_ll_t * task_list = dsc->task_list; + lv_vector_for_each_destroy_tasks(task_list, _task_draw_cb, &state); + dsc->task_list = NULL; + + if(tvg_canvas_draw(canvas) == TVG_RESULT_SUCCESS) { + tvg_canvas_sync(canvas); + } + + if(allow_buffer) { + lv_area_t src_area = {0, 0, width, height}; + _blend_draw_buf(draw_buf, &layer->buf_area, new_buf, &src_area); + lv_draw_buf_destroy(new_buf); + } + + tvg_canvas_destroy(canvas); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_buf_vg_lite.c b/inc/lvgl/src/draw/vg_lite/lv_draw_buf_vg_lite.c new file mode 100644 index 0000000..9d31737 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_buf_vg_lite.c @@ -0,0 +1,65 @@ +/** + * @file lv_draw_buf_vg_lite.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../lv_draw_buf_private.h" +#include "lv_vg_lite_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void init_handlers(lv_draw_buf_handlers_t * handlers); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_buf_vg_lite_init_handlers(void) +{ + init_handlers(lv_draw_buf_get_handlers()); + init_handlers(lv_draw_buf_get_font_handlers()); + init_handlers(lv_draw_buf_get_image_handlers()); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t width_to_stride(uint32_t w, lv_color_format_t color_format) +{ + return lv_vg_lite_width_to_stride(w, lv_vg_lite_vg_fmt(color_format)); +} + +static void init_handlers(lv_draw_buf_handlers_t * handlers) +{ + LV_ASSERT_NULL(handlers); + handlers->width_to_stride_cb = width_to_stride; +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c new file mode 100644 index 0000000..1cf5675 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c @@ -0,0 +1,339 @@ +/** + * @file lv_draw_vg_lite.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_decoder.h" +#include "lv_vg_lite_grad.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_stroke.h" + +/********************* + * DEFINES + *********************/ + +#define VG_LITE_DRAW_UNIT_ID 2 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); + +static int32_t draw_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); + +static int32_t draw_delete(lv_draw_unit_t * draw_unit); + +static void draw_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_vg_lite_init(void) +{ +#if LV_VG_LITE_USE_GPU_INIT + extern void gpu_init(void); + static bool inited = false; + if(!inited) { + gpu_init(); + inited = true; + } +#endif + + lv_vg_lite_dump_info(); + + lv_draw_buf_vg_lite_init_handlers(); + + lv_draw_vg_lite_unit_t * unit = lv_draw_create_unit(sizeof(lv_draw_vg_lite_unit_t)); + unit->base_unit.dispatch_cb = draw_dispatch; + unit->base_unit.evaluate_cb = draw_evaluate; + unit->base_unit.delete_cb = draw_delete; + unit->base_unit.event_cb = draw_event_cb; + unit->base_unit.name = "VG_LITE"; + + lv_vg_lite_image_dsc_init(unit); +#if LV_USE_VECTOR_GRAPHIC + unit->grad_ctx = lv_vg_lite_grad_ctx_create(LV_VG_LITE_GRAD_CACHE_CNT, unit); + lv_vg_lite_stroke_init(unit, LV_VG_LITE_STROKE_CACHE_CNT); +#endif + lv_vg_lite_path_init(unit); + lv_vg_lite_decoder_init(); + lv_draw_vg_lite_label_init(unit); +} + +void lv_draw_vg_lite_deinit(void) +{ +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool check_image_is_supported(const lv_draw_image_dsc_t * dsc) +{ + return lv_vg_lite_is_src_cf_supported(dsc->header.cf); +} + +static bool check_arc_is_supported(const lv_draw_arc_dsc_t * dsc) +{ + if(dsc->img_src == NULL) { + return true; + } + + lv_image_header_t header; + lv_result_t res = lv_image_decoder_get_info(dsc->img_src, &header); + if(res != LV_RESULT_OK) { + LV_LOG_TRACE("get image info failed"); + return false; + } + + return lv_vg_lite_is_src_cf_supported(header.cf); +} + +static void draw_execute(lv_draw_vg_lite_unit_t * u) +{ + lv_draw_task_t * t = u->task_act; + lv_layer_t * layer = t->target_layer; + + /* remember draw unit for access to unit's context */ + t->draw_unit = (lv_draw_unit_t *)u; + + lv_vg_lite_buffer_from_draw_buf(&u->target_buffer, layer->draw_buf); + + /* VG-Lite will output premultiplied image, set the flag correspondingly. */ + lv_draw_buf_set_flag(layer->draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); + + vg_lite_identity(&u->global_matrix); + if(layer->buf_area.x1 || layer->buf_area.y1) { + vg_lite_translate(-layer->buf_area.x1, -layer->buf_area.y1, &u->global_matrix); + } + +#if LV_DRAW_TRANSFORM_USE_MATRIX + vg_lite_matrix_t layer_matrix; + lv_vg_lite_matrix(&layer_matrix, &t->matrix); + lv_vg_lite_matrix_multiply(&u->global_matrix, &layer_matrix); +#endif + + if(vg_lite_query_feature(gcFEATURE_BIT_VG_SCISSOR)) { + /* Crop out extra pixels drawn due to scaling accuracy issues */ + lv_area_t scissor_area = layer->phy_clip_area; + lv_area_move(&scissor_area, -layer->buf_area.x1, -layer->buf_area.y1); + lv_vg_lite_set_scissor_area(u, &scissor_area); + } + + switch(t->type) { + case LV_DRAW_TASK_TYPE_LETTER: + lv_draw_vg_lite_letter(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LABEL: + lv_draw_vg_lite_label(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_FILL: + lv_draw_vg_lite_fill(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BORDER: + lv_draw_vg_lite_border(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_BOX_SHADOW: + lv_draw_vg_lite_box_shadow(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_IMAGE: + lv_draw_vg_lite_img(t, t->draw_dsc, &t->area, false); + break; + case LV_DRAW_TASK_TYPE_ARC: + lv_draw_vg_lite_arc(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_LINE: + lv_draw_line_iterate(t, t->draw_dsc, lv_draw_vg_lite_line); + break; + case LV_DRAW_TASK_TYPE_LAYER: + lv_draw_vg_lite_layer(t, t->draw_dsc, &t->area); + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: + lv_draw_vg_lite_triangle(t, t->draw_dsc); + break; + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + lv_draw_vg_lite_mask_rect(t, t->draw_dsc, &t->area); + break; +#if LV_USE_VECTOR_GRAPHIC + case LV_DRAW_TASK_TYPE_VECTOR: + lv_draw_vg_lite_vector(t, t->draw_dsc); + break; +#endif + default: + break; + } + + lv_vg_lite_flush(u); +} + +static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer) +{ + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit; + + /* Return immediately if it's busy with draw task. */ + if(u->task_act) { + return 0; + } + + /* Try to get an ready to draw. */ + lv_draw_task_t * t = lv_draw_get_available_task(layer, NULL, VG_LITE_DRAW_UNIT_ID); + + /* Return 0 is no selection, some tasks can be supported by other units. */ + if(!t || t->preferred_draw_unit_id != VG_LITE_DRAW_UNIT_ID) { + lv_vg_lite_finish(u); + return LV_DRAW_UNIT_IDLE; + } + + /* Return if target buffer format is not supported. */ + if(!lv_vg_lite_is_dest_cf_supported(layer->color_format)) { + return LV_DRAW_UNIT_IDLE; + } + + void * buf = lv_draw_layer_alloc_buf(layer); + if(!buf) { + return LV_DRAW_UNIT_IDLE; + } + + t->state = LV_DRAW_TASK_STATE_IN_PROGRESS; + u->task_act = t; + + draw_execute(u); + + u->task_act->state = LV_DRAW_TASK_STATE_FINISHED; + u->task_act = NULL; + + /*The draw unit is free now. Request a new dispatching as it can get a new task*/ + lv_draw_dispatch_request(); + + return 1; +} + +static int32_t draw_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) +{ + LV_UNUSED(draw_unit); + + /* Return if target buffer format is not supported. */ + const lv_draw_dsc_base_t * base_dsc = task->draw_dsc; + if(!lv_vg_lite_is_dest_cf_supported(base_dsc->layer->color_format)) { + return -1; + } + + switch(task->type) { + case LV_DRAW_TASK_TYPE_LETTER: + case LV_DRAW_TASK_TYPE_LABEL: + case LV_DRAW_TASK_TYPE_FILL: + case LV_DRAW_TASK_TYPE_BORDER: +#if LV_VG_LITE_USE_BOX_SHADOW + case LV_DRAW_TASK_TYPE_BOX_SHADOW: +#endif + case LV_DRAW_TASK_TYPE_LAYER: + case LV_DRAW_TASK_TYPE_LINE: + case LV_DRAW_TASK_TYPE_TRIANGLE: + case LV_DRAW_TASK_TYPE_MASK_RECTANGLE: + +#if LV_USE_VECTOR_GRAPHIC + case LV_DRAW_TASK_TYPE_VECTOR: +#endif + break; + + case LV_DRAW_TASK_TYPE_ARC: { + if(!check_arc_is_supported(task->draw_dsc)) { + return 0; + } + } + break; + + case LV_DRAW_TASK_TYPE_IMAGE: { + if(!check_image_is_supported(task->draw_dsc)) { + return 0; + } + } + break; + + default: + /*The draw unit is not able to draw this task. */ + return 0; + } + + if(task->preference_score > 80) { + /* The draw unit is able to draw this task. */ + task->preference_score = 80; + task->preferred_draw_unit_id = VG_LITE_DRAW_UNIT_ID; + } + + return 1; +} + +static int32_t draw_delete(lv_draw_unit_t * draw_unit) +{ + lv_draw_vg_lite_unit_t * unit = (lv_draw_vg_lite_unit_t *)draw_unit; + + lv_vg_lite_image_dsc_deinit(unit); +#if LV_USE_VECTOR_GRAPHIC + lv_vg_lite_grad_ctx_delete(unit->grad_ctx); + lv_vg_lite_stroke_deinit(unit); +#endif + lv_vg_lite_path_deinit(unit); + lv_vg_lite_decoder_deinit(); + lv_draw_vg_lite_label_deinit(unit); + return 1; +} + +static void draw_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + + switch(code) { + case LV_EVENT_CANCEL: { +#if LV_USE_VECTOR_GRAPHIC + /** + * Because VG-Lite will deinitialize the context (including the GPU independent heap) + * before the GPU goes to sleep, it is necessary to first discard and dereference + * all caches that depend on the independent heap. + */ + lv_draw_vg_lite_unit_t * unit = lv_event_get_current_target(e); + lv_cache_drop_all(lv_vg_lite_grad_ctx_get_cache(unit->grad_ctx), NULL); + lv_cache_drop_all(unit->stroke_cache, NULL); + LV_LOG_INFO("dropt all cache"); +#endif + } + break; + case LV_EVENT_FOCUSED: + lv_vg_lite_set_dump_param_enable(true); + break; + case LV_EVENT_DEFOCUSED: + lv_vg_lite_set_dump_param_enable(false); + break; + case LV_EVENT_HIT_TEST: + lv_vg_lite_dump_info(); + break; + default: + break; + } +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite.h b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite.h new file mode 100644 index 0000000..135f003 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite.h @@ -0,0 +1,95 @@ +/** + * @file lv_draw_vg_lite.h + * + */ + +#ifndef LV_DRAW_VG_LITE_H +#define LV_DRAW_VG_LITE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../../draw/lv_draw_vector.h" +#include "../../draw/lv_draw_arc.h" +#include "../../draw/lv_draw_rect.h" +#include "../../draw/lv_draw_image.h" +#include "../../draw/lv_draw_label.h" +#include "../../draw/lv_draw_line.h" +#include "../../draw/lv_draw_triangle.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_vg_lite_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_draw_buf_vg_lite_init_handlers(void); + +void lv_draw_vg_lite_init(void); + +void lv_draw_vg_lite_deinit(void); + +void lv_draw_vg_lite_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_box_shadow(lv_draw_task_t * t, const lv_draw_box_shadow_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_img(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords, bool no_cache); + +void lv_draw_vg_lite_label_init(struct _lv_draw_vg_lite_unit_t * u); + +void lv_draw_vg_lite_label_deinit(struct _lv_draw_vg_lite_unit_t * u); + +void lv_draw_vg_lite_letter(lv_draw_task_t * t, const lv_draw_letter_dsc_t * dsc, const lv_area_t * coords); + +void lv_draw_vg_lite_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_layer(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords); + +void lv_draw_vg_lite_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc); + +void lv_draw_vg_lite_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc); + +void lv_draw_vg_lite_mask_rect(lv_draw_task_t * t, const lv_draw_mask_rect_dsc_t * dsc, + const lv_area_t * coords); + +#if LV_USE_VECTOR_GRAPHIC +void lv_draw_vg_lite_vector(lv_draw_task_t * t, const lv_draw_vector_dsc_t * dsc); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VG_LITE_H*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c new file mode 100644 index 0000000..5c65e0c --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c @@ -0,0 +1,215 @@ +/** + * @file lv_draw_vg_lite_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_math.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_utils.h" +#include "../../misc/lv_area_private.h" +#include "../lv_image_decoder_private.h" + +/********************* + * DEFINES + *********************/ + +#define PI 3.1415926535897932384626433832795f +#define TWO_PI 6.283185307179586476925286766559f +#define DEG_TO_RAD 0.017453292519943295769236907684886f +#define RAD_TO_DEG 57.295779513082320876798154814105f +#define radians(deg) ((deg) * DEG_TO_RAD) +#define degrees(rad) ((rad) * RAD_TO_DEG) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_vg_lite_arc(lv_draw_task_t * t, const lv_draw_arc_dsc_t * dsc, + const lv_area_t * coords) +{ + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, coords, &t->clip_area)) { + /*Fully clipped, nothing to do*/ + return; + } + + float start_angle = dsc->start_angle; + float end_angle = dsc->end_angle; + float sweep_angle = end_angle - start_angle; + + while(sweep_angle < 0) { + sweep_angle += 360; + } + + while(sweep_angle > 360) { + sweep_angle -= 360; + } + + /*If the angles are the same then there is nothing to draw*/ + if(math_zero(sweep_angle)) { + return; + } + + LV_PROFILER_DRAW_BEGIN; + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_bounding_box_area(path, &clip_area); + + float radius_out = dsc->radius; + float radius_in = dsc->radius - dsc->width; + float cx = dsc->center.x; + float cy = dsc->center.y; + + vg_lite_fill_t fill = VG_LITE_FILL_NON_ZERO; + + if(math_equal(sweep_angle, 360)) { + lv_vg_lite_path_append_circle(path, cx, cy, radius_out, radius_out); + + /* radius_in <= 0, normal fill circle */ + if(radius_in > 0) { + lv_vg_lite_path_append_circle(path, cx, cy, radius_in, radius_in); + } + fill = VG_LITE_FILL_EVEN_ODD; + } + else { + float start_angle_rad = MATH_RADIANS(start_angle); + float end_angle_rad = MATH_RADIANS(end_angle); + + if(radius_in > 0) { + /* radius_out start point */ + float start_x = radius_out * MATH_COSF(start_angle_rad) + cx; + float start_y = radius_out * MATH_SINF(start_angle_rad) + cy; + + /* radius_in start point */ + float end_x = radius_in * MATH_COSF(end_angle_rad) + cx; + float end_y = radius_in * MATH_SINF(end_angle_rad) + cy; + + lv_vg_lite_path_move_to(path, start_x, start_y); + + /* radius_out arc */ + lv_vg_lite_path_append_arc(path, + cx, cy, + radius_out, + start_angle, + sweep_angle, + false); + + /* line to radius_in */ + lv_vg_lite_path_line_to(path, end_x, end_y); + + /* radius_in arc */ + lv_vg_lite_path_append_arc(path, + cx, cy, + radius_in, + end_angle, + -sweep_angle, + false); + + /* close arc */ + lv_vg_lite_path_close(path); + } + else { + /* draw a normal arc pie shape */ + lv_vg_lite_path_append_arc(path, cx, cy, radius_out, start_angle, sweep_angle, true); + } + + /* draw round */ + if(dsc->rounded && dsc->width > 0) { + float round_radius = radius_out > dsc->width ? dsc->width / 2.0f : radius_out / 2.0f; + float round_center = radius_out - round_radius; + float rcx1 = cx + round_center * MATH_COSF(end_angle_rad); + float rcy1 = cy + round_center * MATH_SINF(end_angle_rad); + lv_vg_lite_path_append_circle(path, rcx1, rcy1, round_radius, round_radius); + + float rcx2 = cx + round_center * MATH_COSF(start_angle_rad); + float rcy2 = cy + round_center * MATH_SINF(start_angle_rad); + lv_vg_lite_path_append_circle(path, rcx2, rcy2, round_radius, round_radius); + } + } + + lv_vg_lite_path_end(path); + + vg_lite_matrix_t matrix = u->global_matrix; + + if(dsc->img_src) { + vg_lite_buffer_t src_buf; + lv_image_decoder_dsc_t decoder_dsc; + if(lv_vg_lite_buffer_open_image(&src_buf, &decoder_dsc, dsc->img_src, false, true)) { + + vg_lite_color_t img_color = 0; + if(dsc->opa < LV_OPA_COVER) { + /* normal image opa */ + src_buf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + lv_memset(&img_color, dsc->opa, sizeof(img_color)); + } + + vg_lite_matrix_t path_matrix = u->global_matrix; + + /* move image to center */ + float img_half_w = decoder_dsc.decoded->header.w / 2.0f; + float img_half_h = decoder_dsc.decoded->header.h / 2.0f; + vg_lite_translate(cx - img_half_w, cy - img_half_h, &matrix); + + lv_vg_lite_draw_pattern( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + fill, + &path_matrix, + &src_buf, + &matrix, + VG_LITE_BLEND_SRC_OVER, + VG_LITE_PATTERN_COLOR, + 0, + img_color, + VG_LITE_FILTER_BI_LINEAR); + + lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); + } + } + else { + /* normal color fill */ + lv_vg_lite_draw( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + fill, + &matrix, + VG_LITE_BLEND_SRC_OVER, + lv_vg_lite_color(dsc->color, dsc->opa, true)); + } + + lv_vg_lite_path_drop(u, path); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c new file mode 100644 index 0000000..b880360 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c @@ -0,0 +1,388 @@ +/** + * @file lv_draw_vg_lite_border.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_math.h" +#include "../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +#define HAS_BORDER_SIDE(dsc_side, side) (((dsc_side) & (side)) == (side)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static vg_lite_fill_t path_append_inner_rect(lv_vg_lite_path_t * path, + const lv_draw_border_dsc_t * dsc, + int32_t x, int32_t y, int32_t w, int32_t h, + float r); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_vg_lite_border(lv_draw_task_t * t, const lv_draw_border_dsc_t * dsc, + const lv_area_t * coords) +{ + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, coords, &t->clip_area)) { + /*Fully clipped, nothing to do*/ + return; + } + + LV_PROFILER_DRAW_BEGIN; + + int32_t w = lv_area_get_width(coords); + int32_t h = lv_area_get_height(coords); + float r_out = dsc->radius; + if(dsc->radius) { + float r_short = LV_MIN(w, h) / 2.0f; + r_out = LV_MIN(r_out, r_short); + } + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_quality(path, dsc->radius == 0 ? VG_LITE_LOW : VG_LITE_HIGH); + lv_vg_lite_path_set_bounding_box_area(path, &clip_area); + + /* outer rect */ + lv_vg_lite_path_append_rect(path, + coords->x1, coords->y1, + w, h, + r_out); + + /* inner rect */ + vg_lite_fill_t fill_rule = path_append_inner_rect(path, dsc, coords->x1, coords->y1, w, h, r_out); + + lv_vg_lite_path_end(path); + + vg_lite_matrix_t matrix = u->global_matrix; + + lv_vg_lite_draw( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + fill_rule, + &matrix, + VG_LITE_BLEND_SRC_OVER, + lv_vg_lite_color(dsc->color, dsc->opa, true)); + + lv_vg_lite_path_drop(u, path); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static vg_lite_fill_t path_append_inner_rect(lv_vg_lite_path_t * path, + const lv_draw_border_dsc_t * dsc, + int32_t x, int32_t y, int32_t w, int32_t h, + float r) +{ + LV_PROFILER_DRAW_BEGIN; + + const float half_w = w / 2.0f; + const float half_h = h / 2.0f; + const int32_t border_w = dsc->width; + const float border_w_max = LV_MIN(half_w, half_h); + + /* normal fill, no inner rect */ + if(border_w >= border_w_max) { + LV_PROFILER_DRAW_END; + return VG_LITE_FILL_EVEN_ODD; + } + + const float r_in = r - border_w; + + /* full border, simple rect */ + if(dsc->side == LV_BORDER_SIDE_FULL) { + lv_vg_lite_path_append_rect(path, + x + border_w, y + border_w, + w - border_w * 2, h - border_w * 2, + r_in < 0 ? 0 : r_in); + LV_PROFILER_DRAW_END; + return VG_LITE_FILL_EVEN_ODD; + } + + /* no-radius case, simple inner rect */ + if(dsc->radius <= 0) { + int32_t x_offset = 0; + int32_t y_offset = 0; + int32_t w_inner = w; + int32_t h_inner = h; + + if(dsc->side & LV_BORDER_SIDE_TOP) { + y_offset += border_w; + h_inner -= border_w; + } + if(dsc->side & LV_BORDER_SIDE_LEFT) { + x_offset += border_w; + w_inner -= border_w; + } + if(dsc->side & LV_BORDER_SIDE_BOTTOM) { + h_inner -= border_w; + } + if(dsc->side & LV_BORDER_SIDE_RIGHT) { + w_inner -= border_w; + } + + lv_vg_lite_path_append_rect(path, + x + x_offset, + y + y_offset, + w_inner, + h_inner, + 0); + LV_PROFILER_DRAW_END; + return VG_LITE_FILL_EVEN_ODD; + } + + /* reset outer rect path */ + lv_vg_lite_path_reset(path, VG_LITE_FP32); + + /* coordinate reference map: https://github.com/lvgl/lvgl/pull/6796 */ + const float c1_x = x + r; + const float c1_y = y + r; + const float c2_x = x + w - r; + const float c2_y = c1_y; + const float c3_x = c2_x; + const float c3_y = y + h - r; + const float c4_x = c1_x; + const float c4_y = c3_y; + + /* When border_w > r, No need to calculate the intersection of the arc and the line */ + if(r_in <= 0) { + const float p1_x = x; + const float p1_y = y + border_w; + const float p2_x = x; + const float p2_y = y + r; + const float p3_x = x + r; + const float p3_y = y; + const float p4_x = x + border_w; + const float p4_y = y; + + const float p5_x = x + w - border_w; + const float p5_y = y; + const float p6_x = x + w - r; + const float p6_y = y; + const float p7_x = x + w; + const float p7_y = y + r; + const float p8_x = x + w; + const float p8_y = y + border_w; + + const float p9_x = x + w; + const float p9_y = y + h - border_w; + const float p10_x = x + w; + const float p10_y = y + h - r; + const float p11_x = x + w - r; + const float p11_y = y + h; + const float p12_x = x + w - border_w; + const float p12_y = y + h; + + const float p13_x = x + border_w; + const float p13_y = y + h; + const float p14_x = x + r; + const float p14_y = y + h; + const float p15_x = x; + const float p15_y = y + h - r; + const float p16_x = x; + const float p16_y = y + h - border_w; + + if(dsc->side & LV_BORDER_SIDE_BOTTOM) { + lv_vg_lite_path_move_to(path, p16_x, p16_y); + lv_vg_lite_path_line_to(path, p9_x, p9_y); + lv_vg_lite_path_line_to(path, p10_x, p10_y); + lv_vg_lite_path_append_arc_right_angle(path, p10_x, p10_y, c3_x, c3_y, p11_x, p11_y); + lv_vg_lite_path_line_to(path, p14_x, p14_y); + lv_vg_lite_path_append_arc_right_angle(path, p14_x, p14_y, c4_x, c4_y, p15_x, p15_y); + lv_vg_lite_path_close(path); + } + + if(dsc->side & LV_BORDER_SIDE_TOP) { + lv_vg_lite_path_move_to(path, p1_x, p1_y); + lv_vg_lite_path_line_to(path, p2_x, p2_y); + lv_vg_lite_path_append_arc_right_angle(path, p2_x, p2_y, c1_x, c1_y, p3_x, p3_y); + lv_vg_lite_path_line_to(path, p6_x, p6_y); + lv_vg_lite_path_append_arc_right_angle(path, p6_x, p6_y, c2_x, c2_y, p7_x, p7_y); + lv_vg_lite_path_line_to(path, p8_x, p8_y); + lv_vg_lite_path_close(path); + } + + if(dsc->side & LV_BORDER_SIDE_LEFT) { + lv_vg_lite_path_move_to(path, p4_x, p4_y); + lv_vg_lite_path_line_to(path, p13_x, p13_y); + lv_vg_lite_path_line_to(path, p14_x, p14_y); + lv_vg_lite_path_append_arc_right_angle(path, p14_x, p14_y, c4_x, c4_y, p15_x, p15_y); + lv_vg_lite_path_line_to(path, p2_x, p2_y); + lv_vg_lite_path_append_arc_right_angle(path, p2_x, p2_y, c1_x, c1_y, p3_x, p3_y); + lv_vg_lite_path_close(path); + } + + if(dsc->side & LV_BORDER_SIDE_RIGHT) { + lv_vg_lite_path_move_to(path, p5_x, p5_y); + lv_vg_lite_path_line_to(path, p6_x, p6_y); + lv_vg_lite_path_append_arc_right_angle(path, p6_x, p6_y, c2_x, c2_y, p7_x, p7_y); + lv_vg_lite_path_line_to(path, p10_x, p10_y); + lv_vg_lite_path_append_arc_right_angle(path, p10_x, p10_y, c3_x, c3_y, p11_x, p11_y); + lv_vg_lite_path_line_to(path, p12_x, p12_y); + lv_vg_lite_path_close(path); + } + + LV_PROFILER_DRAW_END; + return VG_LITE_FILL_NON_ZERO; + } + + /* When border_w < r, Calculate the intersection of an arc and a line */ + + /* r^2 - r_in^2 = offset^2 */ + const float offset = MATH_SQRTF((2 * r - border_w) * border_w); + const float sweep_alpha = MATH_DEGREES(MATH_ACOSF(r_in / r)); + const float sweep_beta = 90 - sweep_alpha; + + const float p1_x = x + border_w; + const float p1_y = y + r; + const float p2_x = x; + const float p2_y = y + r; + const float p3_x = x + border_w; + const float p3_y = y + r - offset; + const float p4_x = x + r - offset; + const float p4_y = y + border_w; + const float p5_x = x + r; + const float p5_y = y; + const float p6_x = x + r; + const float p6_y = y + border_w; + + const float p7_x = x + w - r; + const float p7_y = y + border_w; + const float p8_x = x + w - r; + const float p8_y = y; + const float p10_x = x + w - border_w; + const float p10_y = y + r - offset; + const float p11_x = x + w; + const float p11_y = y + r; + const float p12_x = x + w - border_w; + const float p12_y = y + r; + + const float p13_x = x + w - border_w; + const float p13_y = y + h - r; + const float p14_x = x + w; + const float p14_y = y + h - r; + const float p16_x = x + w - r + offset; + const float p16_y = y + h - border_w; + const float p17_x = x + w - r; + const float p17_y = y + h; + const float p18_x = x + w - r; + const float p18_y = y + h - border_w; + + const float p19_x = x + r; + const float p19_y = y + h - border_w; + const float p20_x = x + r; + const float p20_y = y + h; + const float p21_x = x + r - offset; + const float p21_y = y + h - border_w; + const float p22_x = x + border_w; + const float p22_y = y + h - r + offset; + const float p23_x = x; + const float p23_y = y + h - r; + const float p24_x = x + border_w; + const float p24_y = y + h - r; + + if(dsc->side & LV_BORDER_SIDE_BOTTOM) { + lv_vg_lite_path_move_to(path, p21_x, p21_y); + lv_vg_lite_path_line_to(path, p16_x, p16_y); + lv_vg_lite_path_append_arc(path, c3_x, c3_y, r, sweep_beta, sweep_alpha, false); + lv_vg_lite_path_line_to(path, p20_x, p20_y); + lv_vg_lite_path_append_arc(path, c4_x, c4_y, r, 90, sweep_alpha, false); + lv_vg_lite_path_close(path); + } + + if(dsc->side & LV_BORDER_SIDE_TOP) { + lv_vg_lite_path_move_to(path, p4_x, p4_y); + lv_vg_lite_path_append_arc(path, c1_x, c1_y, r, 270 - sweep_alpha, sweep_alpha, false); + lv_vg_lite_path_line_to(path, p8_x, p8_y); + lv_vg_lite_path_append_arc(path, c2_x, c2_y, r, 270, sweep_alpha, false); + lv_vg_lite_path_close(path); + } + + if(dsc->side & LV_BORDER_SIDE_LEFT) { + lv_vg_lite_path_move_to(path, p3_x, p3_y); + lv_vg_lite_path_line_to(path, p22_x, p22_y); + lv_vg_lite_path_append_arc(path, c4_x, c4_y, r, 90 + sweep_beta, sweep_alpha, false); + lv_vg_lite_path_line_to(path, p2_x, p2_y); + lv_vg_lite_path_append_arc(path, c1_x, c1_y, r, 180, sweep_alpha, false); + lv_vg_lite_path_close(path); + } + + if(dsc->side & LV_BORDER_SIDE_RIGHT) { + lv_vg_lite_path_move_to(path, p10_x, p10_y); + lv_vg_lite_path_append_arc(path, c2_x, c2_y, r, 270 + sweep_beta, sweep_alpha, false); + lv_vg_lite_path_line_to(path, p14_x, p14_y); + lv_vg_lite_path_append_arc(path, c3_x, c3_y, r, 0, sweep_alpha, false); + lv_vg_lite_path_close(path); + } + + /* Draw the rounded corners adjacent to the border */ + + if(HAS_BORDER_SIDE(dsc->side, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_LEFT)) { + lv_vg_lite_path_move_to(path, p2_x, p2_y); + lv_vg_lite_path_append_arc_right_angle(path, p2_x, p2_y, c1_x, c1_y, p5_x, p5_y); + lv_vg_lite_path_line_to(path, p6_x, p6_y); + lv_vg_lite_path_append_arc_right_angle(path, p6_x, p6_y, c1_x, c1_y, p1_x, p1_y); + lv_vg_lite_path_close(path); + } + + if(HAS_BORDER_SIDE(dsc->side, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_RIGHT)) { + lv_vg_lite_path_move_to(path, p8_x, p8_y); + lv_vg_lite_path_append_arc_right_angle(path, p8_x, p8_y, c2_x, c2_y, p11_x, p11_y); + lv_vg_lite_path_line_to(path, p12_x, p12_y); + lv_vg_lite_path_append_arc_right_angle(path, p12_x, p12_y, c2_x, c2_y, p7_x, p7_y); + lv_vg_lite_path_close(path); + } + + if(HAS_BORDER_SIDE(dsc->side, LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_LEFT)) { + lv_vg_lite_path_move_to(path, p20_x, p20_y); + lv_vg_lite_path_append_arc_right_angle(path, p20_x, p20_y, c4_x, c4_y, p23_x, p23_y); + lv_vg_lite_path_line_to(path, p24_x, p24_y); + lv_vg_lite_path_append_arc_right_angle(path, p24_x, p24_y, c4_x, c4_y, p19_x, p19_y); + lv_vg_lite_path_close(path); + } + + if(HAS_BORDER_SIDE(dsc->side, LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_RIGHT)) { + lv_vg_lite_path_move_to(path, p14_x, p14_y); + lv_vg_lite_path_append_arc_right_angle(path, p14_x, p14_y, c3_x, c3_y, p17_x, p17_y); + lv_vg_lite_path_line_to(path, p18_x, p18_y); + lv_vg_lite_path_append_arc_right_angle(path, p18_x, p18_y, c3_x, c3_y, p13_x, p13_y); + lv_vg_lite_path_close(path); + } + + LV_PROFILER_DRAW_END; + return VG_LITE_FILL_NON_ZERO; +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c new file mode 100644 index 0000000..1ef0a53 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c @@ -0,0 +1,99 @@ +/** + * @file lv_draw_vg_lite_box_shadow.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_box_shadow(lv_draw_task_t * t, const lv_draw_box_shadow_dsc_t * dsc, + const lv_area_t * coords) +{ + /*Calculate the rectangle which is blurred to get the shadow in `shadow_area`*/ + lv_area_t core_area; + core_area.x1 = coords->x1 + dsc->ofs_x - dsc->spread; + core_area.x2 = coords->x2 + dsc->ofs_x + dsc->spread; + core_area.y1 = coords->y1 + dsc->ofs_y - dsc->spread; + core_area.y2 = coords->y2 + dsc->ofs_y + dsc->spread; + + /*Calculate the bounding box of the shadow*/ + lv_area_t shadow_area; + shadow_area.x1 = core_area.x1 - dsc->width / 2 - 1; + shadow_area.x2 = core_area.x2 + dsc->width / 2 + 1; + shadow_area.y1 = core_area.y1 - dsc->width / 2 - 1; + shadow_area.y2 = core_area.y2 + dsc->width / 2 + 1; + + /*Get clipped draw area which is the real draw area. + *It is always the same or inside `shadow_area`*/ + lv_area_t draw_area; + if(!lv_area_intersect(&draw_area, &shadow_area, &t->clip_area)) return; + + LV_PROFILER_DRAW_BEGIN; + + lv_draw_border_dsc_t border_dsc; + lv_draw_border_dsc_init(&border_dsc); + border_dsc.width = 3; + border_dsc.color = dsc->color; + border_dsc.radius = dsc->radius; + + lv_area_move(&draw_area, dsc->ofs_x, dsc->ofs_y); + draw_area = core_area; + int32_t half_w = dsc->width / 2; + + for(int32_t w = 0; w < half_w; w++) { + border_dsc.opa = lv_map(w, 0, half_w, dsc->opa / 4, LV_OPA_0); + border_dsc.radius++; + lv_area_increase(&draw_area, 1, 1); + lv_draw_vg_lite_border(t, &border_dsc, &draw_area); + } + + /* fill center */ + if(dsc->ofs_x || dsc->ofs_y) { + lv_draw_fill_dsc_t fill_dsc; + lv_draw_fill_dsc_init(&fill_dsc); + fill_dsc.radius = dsc->radius; + fill_dsc.opa = dsc->opa; + fill_dsc.color = dsc->color; + lv_draw_vg_lite_fill(t, &fill_dsc, &core_area); + } + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c new file mode 100644 index 0000000..302ae9d --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c @@ -0,0 +1,113 @@ +/** + * @file lv_draw_vg_lite_fill.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_grad.h" +#include "../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +#if LV_GRADIENT_MAX_STOPS > VLC_MAX_GRADIENT_STOPS + #error "LV_GRADIENT_MAX_STOPS must be equal or less than VLC_MAX_GRADIENT_STOPS" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_vg_lite_fill(lv_draw_task_t * t, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords) +{ + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, coords, &t->clip_area)) { + /*Fully clipped, nothing to do*/ + return; + } + + LV_PROFILER_DRAW_BEGIN; + + vg_lite_matrix_t matrix = u->global_matrix; + + /* Improve GPU rendering efficiency using simpler fill modes */ + if(dsc->radius == 0 && dsc->opa >= LV_OPA_MAX && dsc->grad.dir == LV_GRAD_DIR_NONE && + lv_matrix_is_identity((lv_matrix_t *)&matrix)) { + lv_vg_lite_clear(&u->target_buffer, &clip_area, lv_vg_lite_color(dsc->color, LV_OPA_COVER, false)); + LV_PROFILER_DRAW_END; + return; + } + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_quality(path, dsc->radius == 0 ? VG_LITE_LOW : VG_LITE_HIGH); + lv_vg_lite_path_set_bounding_box_area(path, &clip_area); + lv_vg_lite_path_append_rect(path, + coords->x1, coords->y1, + lv_area_get_width(coords), lv_area_get_height(coords), + dsc->radius); + lv_vg_lite_path_end(path); + + if(dsc->grad.dir != LV_GRAD_DIR_NONE) { +#if LV_USE_VECTOR_GRAPHIC + lv_vg_lite_draw_grad_helper( + u->grad_ctx, + &u->target_buffer, + lv_vg_lite_path_get_path(path), + coords, + &dsc->grad, + &matrix, + VG_LITE_FILL_EVEN_ODD, + VG_LITE_BLEND_SRC_OVER); +#else + LV_LOG_WARN("Gradient fill is not supported without VECTOR_GRAPHIC"); +#endif + } + else { + /* normal fill */ + lv_vg_lite_draw( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + VG_LITE_FILL_EVEN_ODD, + &matrix, + VG_LITE_BLEND_SRC_OVER, + lv_vg_lite_color(dsc->color, dsc->opa, true)); + } + + lv_vg_lite_path_drop(u, path); + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c new file mode 100644 index 0000000..0e064e2 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c @@ -0,0 +1,259 @@ +/** + * @file lv_draw_vg_lite_img.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_decoder.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_utils.h" +#include "../../misc/lv_area_private.h" +#include "../lv_image_decoder_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline bool matrix_has_transform(const vg_lite_matrix_t * matrix); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_vg_lite_img(lv_draw_task_t * t, const lv_draw_image_dsc_t * dsc, + const lv_area_t * coords, bool no_cache) +{ + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, &t->_real_area, &t->clip_area)) { + /*Fully clipped, nothing to do*/ + return; + } + + LV_PROFILER_DRAW_BEGIN; + + vg_lite_buffer_t src_buf; + lv_image_decoder_dsc_t decoder_dsc; + + /* if not support blend normal, premultiply alpha */ + bool premultiply = !lv_vg_lite_support_blend_normal(); + if(!lv_vg_lite_buffer_open_image(&src_buf, &decoder_dsc, dsc->src, no_cache, premultiply)) { + LV_PROFILER_DRAW_END; + return; + } + + vg_lite_color_t color = lv_vg_lite_image_recolor(&src_buf, dsc); + + /* convert the blend mode to vg-lite blend mode, considering the premultiplied alpha */ + bool has_pre_mul = lv_draw_buf_has_flag(decoder_dsc.decoded, LV_IMAGE_FLAGS_PREMULTIPLIED) + || (decoder_dsc.decoded->header.cf == LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED); + vg_lite_blend_t blend = lv_vg_lite_blend_mode(dsc->blend_mode, has_pre_mul); + + /* original image matrix */ + vg_lite_matrix_t image_matrix; + vg_lite_identity(&image_matrix); + lv_vg_lite_image_matrix(&image_matrix, coords->x1, coords->y1, dsc); + + /* image drawing matrix */ + vg_lite_matrix_t matrix = u->global_matrix; + lv_vg_lite_matrix_multiply(&matrix, &image_matrix); + + const bool has_transform = matrix_has_transform(&matrix); + const vg_lite_filter_t filter = has_transform ? VG_LITE_FILTER_BI_LINEAR : VG_LITE_FILTER_POINT; + + /* Use coords as the fallback image width and height */ + const uint32_t img_w = dsc->header.w ? dsc->header.w : lv_area_get_width(coords); + const uint32_t img_h = dsc->header.h ? dsc->header.h : lv_area_get_height(coords); + + if(dsc->colorkey) { + lv_vg_lite_set_color_key(dsc->colorkey); + } + + /* If clipping is not required, blit directly */ + if(lv_area_is_in(&t->_real_area, &t->clip_area, false) && dsc->clip_radius <= 0 && !dsc->tile) { + /* rect is used to crop the pixel-aligned padding area */ + vg_lite_rectangle_t rect = { + .x = 0, + .y = 0, + .width = img_w, + .height = img_h, + }; + + lv_vg_lite_blit_rect( + &u->target_buffer, + &src_buf, + &rect, + &matrix, + blend, + color, + filter); + + lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); + LV_PROFILER_DRAW_END; + return; + } + + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + + if(dsc->tile) { + /* When the image is tiled, use coords as the tile area and create a path around it */ + lv_vg_lite_path_append_rect( + path, + coords->x1, coords->y1, + lv_area_get_width(coords), lv_area_get_height(coords), + dsc->clip_radius); + } + else if(has_transform || dsc->clip_radius) { + /** + * When the image is transformed or rounded, create a path around + * the image and follow the image_matrix for coordinate transformation + */ + lv_vg_lite_path_set_transform(path, &image_matrix); + + /* Each point will be transformed accordingly. */ + lv_vg_lite_path_append_rect( + path, + dsc->image_area.x1 - coords->x1, dsc->image_area.y1 - coords->y1, + lv_area_get_width(&dsc->image_area), lv_area_get_height(&dsc->image_area), + dsc->clip_radius); + } + else { + /* append normal rect to the path */ + lv_vg_lite_path_append_rect( + path, + clip_area.x1, clip_area.y1, + lv_area_get_width(&clip_area), lv_area_get_height(&clip_area), + 0); + } + + lv_vg_lite_path_set_bounding_box_area(path, &clip_area); + lv_vg_lite_path_end(path); + + vg_lite_matrix_t path_matrix = u->global_matrix; + + if(dsc->tile) { + lv_area_t tile_area; + if(lv_area_get_width(&dsc->image_area) >= 0) { + tile_area = dsc->image_area; + } + else { + tile_area = *coords; + } + lv_area_set_width(&tile_area, img_w); + lv_area_set_height(&tile_area, img_h); + + /** + * vg_lite_tvg does not support VG_LITE_PATTERN_REPEAT, + * use looping texture for simulation. + */ +#if LV_USE_VG_LITE_THORVG + const int32_t tile_x_start = tile_area.x1; + while(tile_area.y1 <= coords->y2) { + while(tile_area.x1 <= coords->x2) { +#endif + vg_lite_matrix_t tile_matrix; + vg_lite_identity(&tile_matrix); + vg_lite_translate(tile_area.x1 - coords->x1, tile_area.y1 - coords->y1, &tile_matrix); + + vg_lite_matrix_t pattern_matrix = matrix; + lv_vg_lite_matrix_multiply(&pattern_matrix, &tile_matrix); + + lv_area_t clipped_img_area; + if(!LV_USE_VG_LITE_THORVG || lv_area_intersect(&clipped_img_area, &tile_area, coords)) { + lv_vg_lite_draw_pattern( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + VG_LITE_FILL_EVEN_ODD, + &path_matrix, + &src_buf, + &pattern_matrix, + blend, + VG_LITE_PATTERN_REPEAT, + 0, + color, + filter); + } + +#if LV_USE_VG_LITE_THORVG + tile_area.x1 += img_w; + tile_area.x2 += img_w; + } + + tile_area.y1 += img_h; + tile_area.y2 += img_h; + tile_area.x1 = tile_x_start; + tile_area.x2 = tile_x_start + img_w - 1; + } +#endif + } + else { + lv_vg_lite_draw_pattern( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + VG_LITE_FILL_EVEN_ODD, + &path_matrix, + &src_buf, + &matrix, + blend, + VG_LITE_PATTERN_COLOR, + 0, + color, + filter); + } + + if(dsc->colorkey) { + lv_vg_lite_set_color_key(NULL); + } + + lv_vg_lite_path_drop(u, path); + + lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline bool matrix_has_transform(const vg_lite_matrix_t * matrix) +{ + /** + * When the rotation angle is 0 or 180 degrees, + * it is considered that there is no transformation. + */ + return !((matrix->m[0][0] == 1.0f || matrix->m[0][0] == -1.0f) && + matrix->m[0][1] == 0.0f && + matrix->m[1][0] == 0.0f && + (matrix->m[1][1] == 1.0f || matrix->m[1][1] == -1.0f) && + matrix->m[2][0] == 0.0f && + matrix->m[2][1] == 0.0f && + matrix->m[2][2] == 1.0f); +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c new file mode 100644 index 0000000..702a1a7 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c @@ -0,0 +1,629 @@ +/** + * @file lv_draw_vg_lite_label.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_bitmap_font_cache.h" +#include "../../misc/cache/lv_cache_entry_private.h" +#include "../../misc/lv_area_private.h" +#include "../../libs/freetype/lv_freetype_private.h" +#include "../lv_draw_label_private.h" +#include "../lv_draw_image_private.h" + +/********************* + * DEFINES + *********************/ + +#define PATH_DATA_COORD_FORMAT VG_LITE_S16 + +#if LV_VG_LITE_FLUSH_MAX_COUNT > 0 + #define PATH_FLUSH_COUNT_MAX 0 +#else + /* When using IDLE Flush mode, reduce the number of flushes */ + #define PATH_FLUSH_COUNT_MAX 8 +#endif + +#define FT_F26DOT6_SHIFT 6 + +/** After converting the font reference size, it is also necessary to scale the 26dot6 data + * in the path to the real physical size + */ +#define FT_F26DOT6_TO_PATH_SCALE(x) (LV_FREETYPE_F26DOT6_TO_FLOAT(x) / (1 << FT_F26DOT6_SHIFT)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void draw_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area); + +static void draw_letter_bitmap(lv_draw_task_t * t, const lv_draw_glyph_dsc_t * dsc, vg_lite_buffer_t * src_buf); + +static void bitmap_cache_release_cb(void * entry, void * user_data); + +#if LV_USE_FREETYPE + static void freetype_outline_event_cb(lv_event_t * e); + static void draw_letter_outline(lv_draw_task_t * t, const lv_draw_glyph_dsc_t * dsc); + static void outline_iter_cb(void * user_data, uint8_t op_code, const float * data, uint32_t len); +#endif /* LV_USE_FREETYPE */ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_label_init(struct _lv_draw_vg_lite_unit_t * u) +{ + LV_ASSERT_NULL(u); + +#if LV_USE_FREETYPE + /*Set up the freetype outline event*/ + lv_freetype_outline_add_event(freetype_outline_event_cb, LV_EVENT_ALL, u); +#endif /* LV_USE_FREETYPE */ + + lv_vg_lite_bitmap_font_cache_init(u, LV_VG_LITE_BITMAP_FONT_CACHE_CNT); + u->letter_pending = lv_vg_lite_pending_create(sizeof(lv_font_glyph_dsc_t), 8); + lv_vg_lite_pending_set_free_cb(u->letter_pending, bitmap_cache_release_cb, NULL); +} + +void lv_draw_vg_lite_label_deinit(struct _lv_draw_vg_lite_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_ASSERT_NULL(u->letter_pending); + lv_vg_lite_pending_destroy(u->letter_pending); + u->letter_pending = NULL; + + lv_vg_lite_bitmap_font_cache_deinit(u); +} + +void lv_draw_vg_lite_letter(lv_draw_task_t * t, const lv_draw_letter_dsc_t * dsc, const lv_area_t * coords) +{ + if(dsc->opa <= LV_OPA_MIN) + return; + + LV_PROFILER_DRAW_BEGIN; + + lv_draw_glyph_dsc_t glyph_dsc; + lv_draw_glyph_dsc_init(&glyph_dsc); + glyph_dsc.opa = dsc->opa; + glyph_dsc.bg_coords = NULL; + glyph_dsc.color = dsc->color; + glyph_dsc.rotation = dsc->rotation; + glyph_dsc.pivot = dsc->pivot; + + lv_draw_unit_draw_letter(t, &glyph_dsc, &(lv_point_t) { + .x = coords->x1, .y = coords->y1 + }, + dsc->font, dsc->unicode, draw_letter_cb); + + if(glyph_dsc._draw_buf) { + lv_draw_buf_destroy(glyph_dsc._draw_buf); + glyph_dsc._draw_buf = NULL; + } + + LV_PROFILER_DRAW_END; +} + +void lv_draw_vg_lite_label(lv_draw_task_t * t, const lv_draw_label_dsc_t * dsc, + const lv_area_t * coords) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_label_iterate_characters(t, dsc, coords, draw_letter_cb); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline bool init_buffer_from_glyph_dsc(vg_lite_buffer_t * buffer, lv_font_glyph_dsc_t * g_dsc) +{ + const void * glyph_bitmap = lv_font_get_glyph_static_bitmap(g_dsc); + if(!glyph_bitmap) { + return false; + } + + if(!LV_VG_LITE_IS_ALIGNED(glyph_bitmap, 16)) { + LV_LOG_WARN("Glyph data %p is not aligned to 16 bytes", glyph_bitmap); + return false; + } + + if(!LV_VG_LITE_IS_ALIGNED(g_dsc->stride, 16)) { + LV_LOG_WARN("Glyph stride %" LV_PRIu32 " is not aligned to 16 bytes", g_dsc->stride); + return false; + } + + lv_vg_lite_buffer_init(buffer, glyph_bitmap, g_dsc->box_w, g_dsc->box_h, g_dsc->stride, VG_LITE_A8, false); + return true; +} + +static void draw_letter_cb(lv_draw_task_t * t, lv_draw_glyph_dsc_t * glyph_draw_dsc, + lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area) +{ + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + if(glyph_draw_dsc) { + switch(glyph_draw_dsc->format) { + case LV_FONT_GLYPH_FORMAT_A1: + case LV_FONT_GLYPH_FORMAT_A2: + case LV_FONT_GLYPH_FORMAT_A3: + case LV_FONT_GLYPH_FORMAT_A4: + case LV_FONT_GLYPH_FORMAT_A8: { + const lv_font_t * resolved_font = glyph_draw_dsc->g->resolved_font; + vg_lite_buffer_t src_buf; + if(lv_font_has_static_bitmap(resolved_font)) { + if(!init_buffer_from_glyph_dsc(&src_buf, glyph_draw_dsc->g)) { + return; + } + } + else { + if(resolved_font->release_glyph) { + /* For dynamic fonts, its internal implementation already supports cache management. */ + glyph_draw_dsc->glyph_data = lv_font_get_glyph_bitmap(glyph_draw_dsc->g, glyph_draw_dsc->_draw_buf); + } + else { + /* For non-cached unaligned fonts, we need to manage the cache manually. */ + glyph_draw_dsc->glyph_data = lv_vg_lite_bitmap_font_cache_get(u, glyph_draw_dsc->g); + } + + if(!glyph_draw_dsc->glyph_data) { + return; + } + + lv_vg_lite_buffer_from_draw_buf(&src_buf, glyph_draw_dsc->glyph_data); + } + + draw_letter_bitmap(t, glyph_draw_dsc, &src_buf); + } + break; + +#if LV_USE_FREETYPE + case LV_FONT_GLYPH_FORMAT_VECTOR: { + if(lv_freetype_is_outline_font(glyph_draw_dsc->g->resolved_font)) { + if(!glyph_draw_dsc->glyph_data) { + return; + } + + draw_letter_outline(t, glyph_draw_dsc); + } + } + break; +#endif /* LV_USE_FREETYPE */ + + case LV_FONT_GLYPH_FORMAT_IMAGE: { + glyph_draw_dsc->glyph_data = lv_font_get_glyph_bitmap(glyph_draw_dsc->g, glyph_draw_dsc->_draw_buf); + if(!glyph_draw_dsc->glyph_data) { + return; + } + + lv_draw_image_dsc_t image_dsc; + lv_draw_image_dsc_init(&image_dsc); + image_dsc.opa = glyph_draw_dsc->opa; + image_dsc.src = glyph_draw_dsc->glyph_data; + image_dsc.rotation = glyph_draw_dsc->rotation; + lv_draw_vg_lite_img(t, &image_dsc, glyph_draw_dsc->letter_coords, false); + } + break; + +#if LV_USE_FONT_PLACEHOLDER + case LV_FONT_GLYPH_FORMAT_NONE: { + if(glyph_draw_dsc->bg_coords == NULL) break; + /* Draw a placeholder rectangle*/ + lv_draw_border_dsc_t border_draw_dsc; + lv_draw_border_dsc_init(&border_draw_dsc); + border_draw_dsc.opa = glyph_draw_dsc->opa; + border_draw_dsc.color = glyph_draw_dsc->color; + border_draw_dsc.width = 1; + lv_draw_vg_lite_border(t, &border_draw_dsc, glyph_draw_dsc->bg_coords); + } + break; +#endif /* LV_USE_FONT_PLACEHOLDER */ + + default: + break; + } + } + + if(fill_draw_dsc && fill_area) { + lv_draw_vg_lite_fill(t, fill_draw_dsc, fill_area); + } + + /* Flush in time to avoid accumulation of drawing commands */ + u->letter_count++; + if(u->letter_count > PATH_FLUSH_COUNT_MAX) { + lv_vg_lite_flush(u); + } +} + +static inline void convert_letter_matrix(vg_lite_matrix_t * matrix, const lv_draw_glyph_dsc_t * dsc) +{ + vg_lite_translate(dsc->letter_coords->x1, dsc->letter_coords->y1, matrix); + + if(!dsc->rotation) { + return; + } + + const lv_point_t pivot = { + .x = dsc->pivot.x, + .y = dsc->g->box_h + dsc->g->ofs_y + }; + vg_lite_translate(pivot.x, pivot.y, matrix); + vg_lite_rotate(dsc->rotation / 10.0f, matrix); + vg_lite_translate(-pivot.x, -pivot.y, matrix); +} + +static bool draw_letter_clip_areas(lv_draw_task_t * t, const lv_draw_glyph_dsc_t * dsc, lv_area_t * letter_area, + lv_area_t * cliped_area) +{ + *letter_area = *dsc->letter_coords; + + if(dsc->rotation) { + const lv_point_t pivot = { + .x = dsc->pivot.x, + .y = dsc->g->box_h + dsc->g->ofs_y + }; + + lv_image_buf_get_transformed_area( + letter_area, + lv_area_get_width(dsc->letter_coords), + lv_area_get_height(dsc->letter_coords), + dsc->rotation, + LV_SCALE_NONE, + LV_SCALE_NONE, + &pivot); + lv_area_move(letter_area, dsc->letter_coords->x1, dsc->letter_coords->y1); + } + + if(!lv_area_intersect(cliped_area, &t->clip_area, letter_area)) { + return false; + } + + return true; +} + +static void draw_letter_bitmap(lv_draw_task_t * t, const lv_draw_glyph_dsc_t * dsc, vg_lite_buffer_t * src_buf) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_area_t image_area; + lv_area_t clip_area; + if(!draw_letter_clip_areas(t, dsc, &image_area, &clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + vg_lite_matrix_t matrix = u->global_matrix; + convert_letter_matrix(&matrix, dsc); + + const vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true); + + const int32_t clip_offset_x = clip_area.x1 - image_area.x1; + const int32_t clip_offset_y = clip_area.y1 - image_area.y1; + + /* If rotation is not required, blit directly */ + if(!dsc->rotation +#if LV_VG_LITE_DISABLE_BLIT_RECT_OFFSET + /** + * For some hardware, the rect.x/y parameters of vg_lite_blit_rect do not work correctly, + * so the fallback is to vg_lite_draw_pattern for processing. + */ + && (clip_offset_x == 0 && clip_offset_y == 0) +#endif + ) { + vg_lite_rectangle_t rect = { + .x = clip_offset_x, + .y = clip_offset_y, + .width = lv_area_get_width(&clip_area), + .height = lv_area_get_height(&clip_area) + }; + + /* add offset for clipped area */ + if(rect.x || rect.y) { + vg_lite_translate(rect.x, rect.y, &matrix); + } + + lv_vg_lite_blit_rect( + &u->target_buffer, + src_buf, + &rect, + &matrix, + VG_LITE_BLEND_SRC_OVER, + color, + VG_LITE_FILTER_LINEAR); + } + else { + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_S16); + lv_vg_lite_path_append_rect( + path, + image_area.x1, image_area.y1, + lv_area_get_width(&image_area), lv_area_get_height(&image_area), + 0); + lv_vg_lite_path_end(path); + lv_vg_lite_path_set_bounding_box_area(path, &clip_area); + + vg_lite_matrix_t path_matrix = u->global_matrix; + + lv_vg_lite_draw_pattern( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + VG_LITE_FILL_EVEN_ODD, + &path_matrix, + src_buf, + &matrix, + VG_LITE_BLEND_SRC_OVER, + VG_LITE_PATTERN_COLOR, + 0, + color, + VG_LITE_FILTER_LINEAR); + + lv_vg_lite_path_drop(u, path); + } + + /* Check if the data has cache and add it to the pending list */ + if(dsc->g->entry) { + /* Increment the cache reference count */ + lv_cache_entry_acquire_data(dsc->g->entry); + lv_vg_lite_pending_add(u->letter_pending, dsc->g); + } + + LV_PROFILER_DRAW_END; +} + +static void bitmap_cache_release_cb(void * entry, void * user_data) +{ + LV_UNUSED(user_data); + lv_font_glyph_dsc_t * g_dsc = entry; + lv_font_glyph_release_draw_data(g_dsc); +} + +#if LV_USE_FREETYPE + +static void draw_letter_outline(lv_draw_task_t * t, const lv_draw_glyph_dsc_t * dsc) +{ + LV_PROFILER_DRAW_BEGIN; + + lv_area_t letter_area; + lv_area_t path_clip_area; + if(!draw_letter_clip_areas(t, dsc, &letter_area, &path_clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + /* vg-lite bounding_box will crop the pixels on the edge, so +1px is needed here */ + path_clip_area.x2++; + path_clip_area.y2++; + + lv_vg_lite_path_t * outline = (lv_vg_lite_path_t *)dsc->glyph_data; + const lv_point_t glyph_pos = { + dsc->letter_coords->x1 - dsc->g->ofs_x, + dsc->letter_coords->y1 + dsc->g->box_h + dsc->g->ofs_y + }; + /* scale size */ + const float scale = FT_F26DOT6_TO_PATH_SCALE(lv_freetype_outline_get_scale(dsc->g->resolved_font)); + + const bool has_rotation_with_cliped = dsc->rotation && !lv_area_is_in(&letter_area, &t->clip_area, false); + + /* calc convert matrix */ + vg_lite_matrix_t matrix; + vg_lite_identity(&matrix); + + if(!has_rotation_with_cliped && dsc->rotation) { + vg_lite_translate(glyph_pos.x + dsc->pivot.x, glyph_pos.y, &matrix); + vg_lite_rotate(dsc->rotation / 10.0f, &matrix); + vg_lite_translate(-dsc->pivot.x, 0, &matrix); + } + else { + vg_lite_translate(glyph_pos.x, glyph_pos.y, &matrix); + } + + vg_lite_scale(scale, scale, &matrix); + + /* matrix for drawing, different from matrix for calculating the bounding box */ + vg_lite_matrix_t draw_matrix = u->global_matrix; + lv_vg_lite_matrix_multiply(&draw_matrix, &matrix); + + /* calc inverse matrix */ + vg_lite_matrix_t result; + if(!lv_vg_lite_matrix_inverse(&result, &matrix)) { + LV_LOG_ERROR("no inverse matrix"); + lv_vg_lite_matrix_dump_info(&matrix); + LV_PROFILER_DRAW_END; + return; + } + + const lv_point_precise_t p1 = { path_clip_area.x1, path_clip_area.y1 }; + const lv_point_precise_t p1_res = lv_vg_lite_matrix_transform_point(&result, &p1); + const lv_point_precise_t p2 = { path_clip_area.x2, path_clip_area.y2 }; + const lv_point_precise_t p2_res = lv_vg_lite_matrix_transform_point(&result, &p2); + + if(has_rotation_with_cliped) { + /** + * When intersecting the clipping region, + * rotate the path contents without rotating the bounding box for cropping + */ + vg_lite_matrix_t internal_matrix; + vg_lite_identity(&internal_matrix); + const float pivot_x = (dsc->pivot.x + dsc->g->ofs_x) / scale; + const float pivot_y = dsc->g->box_h + dsc->g->ofs_y; + vg_lite_translate(pivot_x, pivot_y, &internal_matrix); + vg_lite_rotate(dsc->rotation / 10.0f, &internal_matrix); + vg_lite_translate(-pivot_x, -pivot_y, &internal_matrix); + + lv_vg_lite_path_t * outline_transformed = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_transform(outline_transformed, &internal_matrix); + lv_vg_lite_path_for_each_data(lv_vg_lite_path_get_path(outline), outline_iter_cb, outline_transformed); + lv_vg_lite_path_set_bounding_box(outline_transformed, p1_res.x, p2_res.y, p2_res.x, p1_res.y); + + lv_vg_lite_draw( + &u->target_buffer, + lv_vg_lite_path_get_path(outline_transformed), + VG_LITE_FILL_NON_ZERO, + &draw_matrix, + VG_LITE_BLEND_SRC_OVER, + lv_vg_lite_color(dsc->color, dsc->opa, true)); + + lv_vg_lite_path_drop(u, outline_transformed); + + LV_PROFILER_DRAW_END; + return; + } + + if(dsc->rotation) { + /* The bounding rectangle before scaling relative to the original coordinates of the path */ + lv_area_t box_area; + box_area.x1 = dsc->g->ofs_x; + box_area.y1 = -dsc->g->box_h - dsc->g->ofs_y; + lv_area_set_width(&box_area, dsc->g->box_w); + lv_area_set_height(&box_area, dsc->g->box_h); + + /* Workaround for loss of rotation precision */ + lv_area_increase(&box_area, 5, 5); + + /* Scale the path area to fit the original path data */ + lv_vg_lite_path_set_bounding_box(outline, + box_area.x1 / scale, + box_area.y1 / scale, + box_area.x2 / scale, + box_area.y2 / scale); + } + else { + lv_vg_lite_path_set_bounding_box(outline, p1_res.x, p2_res.y, p2_res.x, p1_res.y); + } + + lv_vg_lite_draw( + &u->target_buffer, + lv_vg_lite_path_get_path(outline), + VG_LITE_FILL_NON_ZERO, + &draw_matrix, + VG_LITE_BLEND_SRC_OVER, + lv_vg_lite_color(dsc->color, dsc->opa, true)); + + LV_PROFILER_DRAW_END; +} + +static void vg_lite_outline_push(const lv_freetype_outline_event_param_t * param) +{ + LV_PROFILER_DRAW_BEGIN; + lv_vg_lite_path_t * outline = param->outline; + LV_ASSERT_NULL(outline); + + lv_freetype_outline_type_t type = param->type; + switch(type) { + + /** + * Reverse the Y-axis coordinate direction to achieve + * the conversion from Cartesian coordinate system to LCD coordinate system + */ + case LV_FREETYPE_OUTLINE_END: + lv_vg_lite_path_end(outline); + break; + case LV_FREETYPE_OUTLINE_MOVE_TO: + lv_vg_lite_path_move_to(outline, param->to.x, -param->to.y); + break; + case LV_FREETYPE_OUTLINE_LINE_TO: + lv_vg_lite_path_line_to(outline, param->to.x, -param->to.y); + break; + case LV_FREETYPE_OUTLINE_CUBIC_TO: + lv_vg_lite_path_cubic_to(outline, param->control1.x, -param->control1.y, + param->control2.x, -param->control2.y, + param->to.x, -param->to.y); + break; + case LV_FREETYPE_OUTLINE_CONIC_TO: + lv_vg_lite_path_quad_to(outline, param->control1.x, -param->control1.y, + param->to.x, -param->to.y); + break; + default: + LV_LOG_ERROR("unknown point type: %d", type); + LV_ASSERT(false); + break; + } + LV_PROFILER_DRAW_END; +} + +static void freetype_outline_event_cb(lv_event_t * e) +{ + LV_PROFILER_DRAW_BEGIN; + lv_event_code_t code = lv_event_get_code(e); + lv_freetype_outline_event_param_t * param = lv_event_get_param(e); + switch(code) { + case LV_EVENT_CREATE: + param->outline = lv_vg_lite_path_create(PATH_DATA_COORD_FORMAT); + break; + case LV_EVENT_DELETE: + lv_vg_lite_path_destroy(param->outline); + break; + case LV_EVENT_INSERT: + vg_lite_outline_push(param); + break; + default: + LV_LOG_WARN("unknown event code: %d", code); + break; + } + LV_PROFILER_DRAW_END; +} + +static void outline_iter_cb(void * user_data, uint8_t op_code, const float * data, uint32_t len) +{ + LV_UNUSED(len); + typedef struct { + float x; + float y; + } point_t; + + lv_vg_lite_path_t * path = user_data; + const point_t * pt = (point_t *)data; + + switch(op_code) { + case VLC_OP_MOVE: + lv_vg_lite_path_move_to(path, pt->x, pt->y); + break; + case VLC_OP_LINE: + lv_vg_lite_path_line_to(path, pt->x, pt->y); + break; + case VLC_OP_QUAD: + lv_vg_lite_path_quad_to(path, pt[0].x, pt[0].y, pt[1].x, pt[1].y); + break; + case VLC_OP_CUBIC: + lv_vg_lite_path_cubic_to(path, pt[0].x, pt[0].y, pt[1].x, pt[1].y, pt[2].x, pt[2].y); + break; + case VLC_OP_CLOSE: + lv_vg_lite_path_close(path); + break; + case VLC_OP_END: + lv_vg_lite_path_end(path); + break; + default: + LV_ASSERT_FORMAT_MSG(false, "unknown op_code: %d", op_code); + break; + } +} + +#endif /* LV_USE_FREETYPE */ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c new file mode 100644 index 0000000..c184d42 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c @@ -0,0 +1,73 @@ +/** + * @file lv_draw_vg_lite_layer.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_vg_lite_layer(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, + const lv_area_t * coords) +{ + lv_layer_t * layer = (lv_layer_t *)draw_dsc->src; + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + /*It can happen that nothing was draw on a layer and therefore its buffer is not allocated. + *In this case just return. */ + if(layer->draw_buf == NULL) + return; + + LV_PROFILER_DRAW_BEGIN; + + /* The GPU output should already be premultiplied RGB */ + if(!lv_draw_buf_has_flag(layer->draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED)) { + LV_LOG_WARN("Non-premultiplied layer buffer for GPU to draw."); + } + + lv_draw_image_dsc_t new_draw_dsc = *draw_dsc; + new_draw_dsc.src = layer->draw_buf; + lv_draw_vg_lite_img(t, &new_draw_dsc, coords, true); + + /* Wait for the GPU drawing to complete here, + * otherwise it may cause the drawing to fail. */ + lv_vg_lite_finish(u); + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c new file mode 100644 index 0000000..fb7cec7 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c @@ -0,0 +1,200 @@ +/** + * @file lv_draw_vg_lite_line.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_math.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_utils.h" +#include "../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +#define SQ(x) ((x) * (x)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_vg_lite_line(lv_draw_task_t * t, const lv_draw_line_dsc_t * dsc) +{ + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + float p1_x = dsc->p1.x; + float p1_y = dsc->p1.y; + float p2_x = dsc->p2.x; + float p2_y = dsc->p2.y; + + if(p1_x == p2_x && p1_y == p2_y) + return; + + float half_w = dsc->width * 0.5f; + + lv_area_t rel_clip_area; + rel_clip_area.x1 = (int32_t)(LV_MIN(p1_x, p2_x) - half_w); + rel_clip_area.x2 = (int32_t)(LV_MAX(p1_x, p2_x) + half_w); + rel_clip_area.y1 = (int32_t)(LV_MIN(p1_y, p2_y) - half_w); + rel_clip_area.y2 = (int32_t)(LV_MAX(p1_y, p2_y) + half_w); + + if(!lv_area_intersect(&rel_clip_area, &rel_clip_area, &t->clip_area)) { + return; /*Fully clipped, nothing to do*/ + } + + LV_PROFILER_DRAW_BEGIN; + + int32_t dash_width = dsc->dash_width; + int32_t dash_gap = dsc->dash_gap; + int32_t dash_l = dash_width + dash_gap; + + float dx = p2_x - p1_x; + float dy = p2_y - p1_y; + float inv_dl = math_fast_inv_sqrtf(SQ(dx) + SQ(dy)); + float w_dx = dsc->width * dy * inv_dl; + float w_dy = dsc->width * dx * inv_dl; + float w2_dx = w_dx / 2; + float w2_dy = w_dy / 2; + + int32_t ndash = 0; + if(dash_width && dash_l * inv_dl < 1.0f) { + ndash = (int32_t)((1.0f / inv_dl + dash_l - 1) / dash_l); + } + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_bounding_box_area(path, &rel_clip_area); + + /* head point */ + float head_start_x = p1_x + w2_dx; + float head_start_y = p1_y - w2_dy; + float head_end_x = p1_x - w2_dx; + float head_end_y = p1_y + w2_dy; + + /* tail point */ + float tail_start_x = p2_x - w2_dx; + float tail_start_y = p2_y + w2_dy; + float tail_end_x = p2_x + w2_dx; + float tail_end_y = p2_y - w2_dy; + + /* + head_start tail_end + *-----------------* + /| |\ + / | | \ + arc_c *( *p1 p2* )* arc_c + \ | | / + \| |/ + *-----------------* + head_end tail_start + */ + + /* move to start point */ + lv_vg_lite_path_move_to(path, head_start_x, head_start_y); + + /* draw line head */ + if(dsc->round_start) { + float arc_cx = p1_x - w2_dy; + float arc_cy = p1_y - w2_dx; + + /* start 90deg arc */ + lv_vg_lite_path_append_arc_right_angle(path, + head_start_x, head_start_y, + p1_x, p1_y, + arc_cx, arc_cy); + + /* end 90deg arc */ + lv_vg_lite_path_append_arc_right_angle(path, + arc_cx, arc_cy, + p1_x, p1_y, + head_end_x, head_end_y); + } + else { + lv_vg_lite_path_line_to(path, head_end_x, head_end_y); + } + + /* draw line body */ + lv_vg_lite_path_line_to(path, tail_start_x, tail_start_y); + + /* draw line tail */ + if(dsc->round_end) { + float arc_cx = p2_x + w2_dy; + float arc_cy = p2_y + w2_dx; + lv_vg_lite_path_append_arc_right_angle(path, + tail_start_x, tail_start_y, + p2_x, p2_y, + arc_cx, arc_cy); + lv_vg_lite_path_append_arc_right_angle(path, + arc_cx, arc_cy, + p2_x, p2_y, + tail_end_x, tail_end_y); + } + else { + lv_vg_lite_path_line_to(path, tail_end_x, tail_end_y); + } + + /* close draw line body */ + lv_vg_lite_path_line_to(path, head_start_x, head_start_y); + + for(int32_t i = 0; i < ndash; i++) { + float start_x = p1_x - w2_dx + dx * (i * dash_l + dash_width) * inv_dl; + float start_y = p1_y + w2_dy + dy * (i * dash_l + dash_width) * inv_dl; + + lv_vg_lite_path_move_to(path, start_x, start_y); + lv_vg_lite_path_line_to(path, + p1_x + w2_dx + dx * (i * dash_l + dash_width) * inv_dl, + p1_y - w2_dy + dy * (i * dash_l + dash_width) * inv_dl); + lv_vg_lite_path_line_to(path, + p1_x + w2_dx + dx * (i + 1) * dash_l * inv_dl, + p1_y - w2_dy + dy * (i + 1) * dash_l * inv_dl); + lv_vg_lite_path_line_to(path, + p1_x - w2_dx + dx * (i + 1) * dash_l * inv_dl, + p1_y + w2_dy + dy * (i + 1) * dash_l * inv_dl); + lv_vg_lite_path_line_to(path, start_x, start_y); + } + + lv_vg_lite_path_end(path); + + vg_lite_matrix_t matrix = u->global_matrix; + + lv_vg_lite_draw( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + VG_LITE_FILL_EVEN_ODD, + &matrix, + VG_LITE_BLEND_SRC_OVER, + lv_vg_lite_color(dsc->color, dsc->opa, true)); + + lv_vg_lite_path_drop(u, path); + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c new file mode 100644 index 0000000..cd3d755 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c @@ -0,0 +1,93 @@ +/** + * @file lv_draw_vg_lite_mask_rect.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_utils.h" +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_path.h" +#include "../../misc/lv_area_private.h" +#include "../lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_vg_lite_mask_rect(lv_draw_task_t * t, const lv_draw_mask_rect_dsc_t * dsc, + const lv_area_t * coords) +{ + LV_UNUSED(coords); + lv_area_t draw_area; + + if(!lv_area_intersect(&draw_area, &dsc->area, &t->clip_area)) { + return; + } + + LV_PROFILER_DRAW_BEGIN; + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_bounding_box_area(path, &t->clip_area); + + /* Nesting cropping regions using rounded rectangles and normal rectangles */ + lv_vg_lite_path_append_rect( + path, + dsc->area.x1, dsc->area.y1, + lv_area_get_width(&dsc->area), lv_area_get_height(&dsc->area), + dsc->radius); + lv_vg_lite_path_append_rect( + path, + t->clip_area.x1, t->clip_area.y1, + lv_area_get_width(&t->clip_area), lv_area_get_height(&t->clip_area), + 0); + lv_vg_lite_path_end(path); + + vg_lite_matrix_t matrix = u->global_matrix; + + /* Use VG_LITE_BLEND_DST_IN (Sa * D) blending mode to make the corners transparent */ + lv_vg_lite_draw( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + VG_LITE_FILL_EVEN_ODD, + &matrix, + VG_LITE_BLEND_DST_IN, + 0); + + lv_vg_lite_path_drop(u, path); + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c new file mode 100644 index 0000000..d254477 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c @@ -0,0 +1,104 @@ +/** + * @file lv_draw_vg_lite_triangle.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_grad.h" +#include "../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_draw_vg_lite_triangle(lv_draw_task_t * t, const lv_draw_triangle_dsc_t * dsc) +{ + lv_area_t tri_area; + tri_area.x1 = (int32_t)LV_MIN3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y1 = (int32_t)LV_MIN3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + tri_area.x2 = (int32_t)LV_MAX3(dsc->p[0].x, dsc->p[1].x, dsc->p[2].x); + tri_area.y2 = (int32_t)LV_MAX3(dsc->p[0].y, dsc->p[1].y, dsc->p[2].y); + + bool is_common; + lv_area_t clip_area; + is_common = lv_area_intersect(&clip_area, &tri_area, &t->clip_area); + if(!is_common) return; + + LV_PROFILER_DRAW_BEGIN; + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32); + lv_vg_lite_path_set_bounding_box_area(path, &clip_area); + lv_vg_lite_path_move_to(path, dsc->p[0].x, dsc->p[0].y); + lv_vg_lite_path_line_to(path, dsc->p[1].x, dsc->p[1].y); + lv_vg_lite_path_line_to(path, dsc->p[2].x, dsc->p[2].y); + lv_vg_lite_path_close(path); + lv_vg_lite_path_end(path); + + vg_lite_matrix_t matrix = u->global_matrix; + + if(dsc->grad.dir != LV_GRAD_DIR_NONE) { +#if LV_USE_VECTOR_GRAPHIC + lv_vg_lite_draw_grad_helper( + u->grad_ctx, + &u->target_buffer, + lv_vg_lite_path_get_path(path), + &tri_area, + &dsc->grad, + &matrix, + VG_LITE_FILL_EVEN_ODD, + VG_LITE_BLEND_SRC_OVER); +#else + LV_LOG_WARN("Gradient fill is not supported without VECTOR_GRAPHIC"); +#endif + } + else { /* normal fill */ + lv_vg_lite_draw( + &u->target_buffer, + lv_vg_lite_path_get_path(path), + VG_LITE_FILL_EVEN_ODD, + &matrix, + VG_LITE_BLEND_SRC_OVER, + lv_vg_lite_color(dsc->color, dsc->opa, true)); + } + + lv_vg_lite_path_drop(u, path); + + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h new file mode 100644 index 0000000..bb3ef96 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h @@ -0,0 +1,82 @@ +/** + * @file lv_draw_vg_lite_type.h + * + */ + +#ifndef LV_DRAW_VG_LITE_TYPE_H +#define LV_DRAW_VG_LITE_TYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../lv_draw_private.h" +#include "../../misc/lv_array.h" + +#if LV_USE_VG_LITE_THORVG +#include "../../debugging/vg_lite_tvg/vg_lite.h" +#else +#if LV_USE_VG_LITE_DRIVER +#include "../../libs/vg_lite_driver/inc/vg_lite.h" +#else +#include +#endif +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_vg_lite_pending_t; +struct _lv_vg_lite_grad_ctx_t; + +typedef struct _lv_draw_vg_lite_unit_t { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; + lv_area_t current_scissor_area; + + struct _lv_vg_lite_pending_t * image_dsc_pending; + + struct _lv_vg_lite_grad_ctx_t * grad_ctx; + + lv_cache_t * stroke_cache; + + lv_cache_t * bitmap_font_cache; + struct _lv_vg_lite_pending_t * bitmap_font_pending; + struct _lv_vg_lite_pending_t * letter_pending; + + uint16_t flush_count; + uint16_t letter_count; + vg_lite_buffer_t target_buffer; + vg_lite_matrix_t global_matrix; + struct _lv_vg_lite_path_t * global_path; + bool path_in_use; +} lv_draw_vg_lite_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_VG_LITE_TYPE_H*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c new file mode 100644 index 0000000..3d48dad --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c @@ -0,0 +1,484 @@ +/** + * @file lv_draw_vg_lite_vector.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_vg_lite.h" + +#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_utils.h" +#include "lv_vg_lite_grad.h" +#include "lv_vg_lite_stroke.h" +#include "../lv_image_decoder_private.h" +#include "../lv_draw_vector_private.h" +#include +#include + +/********************* + * DEFINES + *********************/ + +#define OPA_MIX(opa1, opa2) LV_UDIV255((opa1) * (opa2)) + +/********************** + * TYPEDEFS + **********************/ + +typedef void * path_drop_data_t; +typedef void (*path_drop_func_t)(struct _lv_draw_vg_lite_unit_t *, path_drop_data_t); + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void task_draw_cb(void * user_data, const lv_vector_path_t * path, const lv_vector_path_ctx_t * ctx); +static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src, lv_fpoint_t * offset, + float expand_bound); +static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend); +static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_draw_vg_lite_vector(lv_draw_task_t * t, const lv_draw_vector_dsc_t * dsc) +{ + if(dsc->task_list == NULL) + return; + + lv_layer_t * layer = dsc->base.layer; + if(layer->draw_buf == NULL) + return; + + lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)t->draw_unit; + + LV_PROFILER_DRAW_BEGIN; + lv_vector_for_each_destroy_tasks(dsc->task_list, task_draw_cb, u); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static vg_lite_color_t lv_color32_to_vg(lv_color32_t color, lv_opa_t opa) +{ + uint8_t a = LV_OPA_MIX2(color.alpha, opa); + if(a < LV_OPA_COVER) { + color.red = LV_UDIV255(color.red * a); + color.green = LV_UDIV255(color.green * a); + color.blue = LV_UDIV255(color.blue * a); + } + return (uint32_t)a << 24 | (uint32_t)color.blue << 16 | (uint32_t)color.green << 8 | color.red; +} + +static void draw_fill(lv_draw_vg_lite_unit_t * u, + lv_vg_lite_path_t * lv_vg_path, + const lv_vector_path_ctx_t * ctx, + vg_lite_matrix_t * matrix, + const lv_fpoint_t * offset, + const lv_opa_t opa) +{ + LV_PROFILER_DRAW_BEGIN; + + const vg_lite_color_t vg_color = lv_color32_to_vg(ctx->fill_dsc.color, OPA_MIX(ctx->fill_dsc.opa, opa)); + const vg_lite_blend_t blend = lv_blend_to_vg(ctx->blend_mode); + const vg_lite_fill_t fill = lv_fill_to_vg(ctx->fill_dsc.fill_rule); + + /* If it is fill mode, the end op code should be added */ + lv_vg_lite_path_end(lv_vg_path); + + vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(lv_vg_path); + LV_VG_LITE_ASSERT_PATH(vg_path); + + switch(ctx->fill_dsc.style) { + case LV_VECTOR_DRAW_STYLE_SOLID: { + /* normal draw shape */ + lv_vg_lite_draw( + &u->target_buffer, + vg_path, + fill, + matrix, + blend, + vg_color); + } + break; + case LV_VECTOR_DRAW_STYLE_PATTERN: { + /* draw image */ + vg_lite_buffer_t image_buffer; + lv_image_decoder_dsc_t decoder_dsc; + if(lv_vg_lite_buffer_open_image(&image_buffer, &decoder_dsc, ctx->fill_dsc.img_dsc.src, false, true)) { + /* Calculate pattern matrix. Should start from path bond box, and also apply fill matrix. */ + vg_lite_matrix_t pattern_matrix = *matrix; + + if(ctx->fill_dsc.fill_units == LV_VECTOR_FILL_UNITS_OBJECT_BOUNDING_BOX) { + /* Convert to object bounding box coordinates */ + vg_lite_translate(offset->x, offset->y, &pattern_matrix); + } + + vg_lite_matrix_t fill_matrix; + lv_vg_lite_matrix(&fill_matrix, &ctx->fill_dsc.matrix); + lv_vg_lite_matrix_multiply(&pattern_matrix, &fill_matrix); + + const lv_draw_image_dsc_t * img_dsc = &ctx->fill_dsc.img_dsc; + lv_draw_image_dsc_t tmp_dsc; + if(opa < LV_OPA_COVER) { + tmp_dsc = ctx->fill_dsc.img_dsc; + tmp_dsc.opa = OPA_MIX(tmp_dsc.opa, opa); + img_dsc = &tmp_dsc; + } + + vg_lite_color_t recolor = lv_vg_lite_image_recolor(&image_buffer, img_dsc); + + if(ctx->fill_dsc.img_dsc.colorkey) { + lv_vg_lite_set_color_key(ctx->fill_dsc.img_dsc.colorkey); + } + lv_vg_lite_draw_pattern( + &u->target_buffer, + vg_path, + fill, + matrix, + &image_buffer, + &pattern_matrix, + blend, + VG_LITE_PATTERN_COLOR, + 0, + recolor, + VG_LITE_FILTER_BI_LINEAR); + + if(ctx->fill_dsc.img_dsc.colorkey) { + lv_vg_lite_set_color_key(NULL); + } + + lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc); + } + } + break; + case LV_VECTOR_DRAW_STYLE_GRADIENT: { + vg_lite_matrix_t grad_matrix = *matrix; + vg_lite_matrix_t fill_matrix; + lv_vg_lite_matrix(&fill_matrix, &ctx->fill_dsc.matrix); + lv_vg_lite_matrix_multiply(&grad_matrix, &fill_matrix); + + const lv_vector_gradient_t * gradient = &ctx->fill_dsc.gradient; + lv_vector_gradient_t tmp_gradient; + if(opa < LV_OPA_COVER) { + tmp_gradient = ctx->fill_dsc.gradient; + for(uint16_t i = 0; i < tmp_gradient.stops_count; i++) { + tmp_gradient.stops[i].opa = OPA_MIX(tmp_gradient.stops[i].opa, opa); + } + + gradient = &tmp_gradient; + } + + lv_vg_lite_draw_grad( + u->grad_ctx, + &u->target_buffer, + vg_path, + gradient, + &grad_matrix, + matrix, + fill, + blend); + } + break; + default: + LV_LOG_WARN("unsupported style: %d", ctx->fill_dsc.style); + break; + } + + LV_PROFILER_DRAW_END; +} + +static void draw_stroke(lv_draw_vg_lite_unit_t * u, + const lv_vector_path_t * path, + lv_vg_lite_path_t * lv_vg_path, + const lv_vector_path_ctx_t * ctx, + vg_lite_matrix_t * matrix, + const lv_opa_t opa) +{ + LV_PROFILER_DRAW_BEGIN; + + vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(lv_vg_path); + + LV_UNUSED(path); + lv_cache_entry_t * stroke_cache_entey = lv_vg_lite_stroke_get(u, lv_vg_path, &ctx->stroke_dsc); + if(!stroke_cache_entey) { + LV_LOG_ERROR("convert stroke failed"); + LV_PROFILER_DRAW_END; + return; + } + + vg_lite_path_t * vg_stroke_path = lv_vg_lite_path_get_path(lv_vg_lite_stroke_get_path(stroke_cache_entey)); + + /* set stroke params */ + vg_stroke_path->quality = vg_path->quality; + vg_stroke_path->stroke_color = lv_color32_to_vg(ctx->stroke_dsc.color, OPA_MIX(ctx->stroke_dsc.opa, opa)); + const vg_lite_color_t vg_color = 0; + + /* set stroke path bounding box */ + lv_memcpy(vg_stroke_path->bounding_box, vg_path->bounding_box, sizeof(vg_path->bounding_box)); + LV_VG_LITE_ASSERT_PATH(vg_stroke_path); + + const vg_lite_blend_t blend = lv_blend_to_vg(ctx->blend_mode); + + switch(ctx->stroke_dsc.style) { + case LV_VECTOR_DRAW_STYLE_SOLID: { + /* normal draw shape */ + lv_vg_lite_draw( + &u->target_buffer, + vg_stroke_path, + VG_LITE_FILL_NON_ZERO, + matrix, + blend, + vg_color); + } + break; + default: + LV_LOG_WARN("unsupported style: %d", ctx->stroke_dsc.style); + break; + } + + lv_vg_lite_stroke_drop(u, stroke_cache_entey); + LV_PROFILER_DRAW_END; +} + +static void task_draw_cb(void * user_data, const lv_vector_path_t * path, const lv_vector_path_ctx_t * ctx) +{ + LV_PROFILER_DRAW_BEGIN; + lv_draw_vg_lite_unit_t * u = user_data; + LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer); + + vg_lite_matrix_t matrix = u->global_matrix; + + const lv_area_t scissor_area = lv_matrix_is_identity((lv_matrix_t *)&matrix) + ? ctx->scissor_area + : lv_matrix_transform_area((lv_matrix_t *)&matrix, &ctx->scissor_area); + + /* clear area */ + if(!path) { + vg_lite_color_t c = lv_color32_to_vg(ctx->fill_dsc.color, OPA_MIX(ctx->fill_dsc.opa, u->task_act->opa)); + lv_vg_lite_clear(&u->target_buffer, &scissor_area, c); + LV_PROFILER_DRAW_END; + return; + } + + if(ctx->fill_dsc.opa == LV_OPA_TRANSP && ctx->stroke_dsc.opa == LV_OPA_TRANSP) { + LV_LOG_TRACE("Full transparent, no need to draw"); + LV_PROFILER_DRAW_END; + return; + } + + /* transform matrix */ + vg_lite_matrix_t dsc_matrix; + lv_vg_lite_matrix(&dsc_matrix, &ctx->matrix); + lv_vg_lite_matrix_multiply(&matrix, &dsc_matrix); + LV_VG_LITE_ASSERT_MATRIX(&matrix); + + /* convert path */ + lv_vg_lite_path_t * lv_vg_path = lv_vg_lite_path_get(u, VG_LITE_FP32); + + lv_fpoint_t offset = {0, 0}; + lv_path_to_vg(lv_vg_path, path, &offset, ctx->stroke_dsc.opa ? ctx->stroke_dsc.width : 0); + + if(vg_lite_query_feature(gcFEATURE_BIT_VG_SCISSOR)) { + /* set scissor area */ + lv_vg_lite_set_scissor_area(u, &scissor_area); + LV_LOG_TRACE("Set scissor area: X1:%" LV_PRId32 ", Y1:%" LV_PRId32 ", X2:%" LV_PRId32 ", Y2:%" LV_PRId32, + scissor_area.x1, scissor_area.y1, scissor_area.x2, scissor_area.y2); + } + else { + /* calc inverse matrix */ + vg_lite_matrix_t result; + if(!lv_vg_lite_matrix_inverse(&result, &matrix)) { + LV_LOG_ERROR("no inverse matrix"); + lv_vg_lite_matrix_dump_info(&matrix); + lv_vg_lite_path_drop(u, lv_vg_path); + LV_PROFILER_DRAW_END; + return; + } + + /** + * Use lv_matrix to uniformly handle clipping region transformations, + * and obtain the transformed bounding rectangle. + */ + const lv_area_t bounding_box_area = lv_matrix_transform_area((lv_matrix_t *)&result, &scissor_area); + lv_vg_lite_path_set_bounding_box_area(lv_vg_path, &bounding_box_area); + } + + const lv_opa_t layer_opa = u->task_act->opa; + + if(ctx->fill_dsc.opa) { + draw_fill(u, lv_vg_path, ctx, &matrix, &offset, layer_opa); + } + + if(ctx->stroke_dsc.opa) { + draw_stroke(u, path, lv_vg_path, ctx, &matrix, layer_opa); + } + + /* drop path */ + lv_vg_lite_path_drop(u, lv_vg_path); + + /* Flush in time to avoid accumulation of drawing commands */ + lv_vg_lite_flush(u); + + LV_PROFILER_DRAW_END; +} + +static vg_lite_quality_t lv_quality_to_vg(lv_vector_path_quality_t quality) +{ + switch(quality) { + case LV_VECTOR_PATH_QUALITY_LOW: + return VG_LITE_LOW; + case LV_VECTOR_PATH_QUALITY_MEDIUM: + return VG_LITE_MEDIUM; + case LV_VECTOR_PATH_QUALITY_HIGH: + return VG_LITE_HIGH; + default: + return VG_LITE_MEDIUM; + } +} + +static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src, lv_fpoint_t * offset, + float expand_bound) +{ + LV_PROFILER_DRAW_BEGIN; + lv_vg_lite_path_set_quality(dest, lv_quality_to_vg(src->quality)); + + float min_x = FLT_MAX; + float min_y = FLT_MAX; + float max_x = -FLT_MAX; + float max_y = -FLT_MAX; + +#define CMP_BOUNDS(point) \ + do { \ + if((point)->x < min_x) min_x = (point)->x; \ + if((point)->y < min_y) min_y = (point)->y; \ + if((point)->x > max_x) max_x = (point)->x; \ + if((point)->y > max_y) max_y = (point)->y; \ + } while(0) + +#define COPY_POINT_NEXT() \ + do { \ + CMP_BOUNDS(point); \ + *path_data++ = point->x; \ + *path_data++ = point->y; \ + point++; \ + } while(0) + + const lv_vector_path_op_t * ops = lv_array_front(&src->ops); + const lv_fpoint_t * point = lv_array_front(&src->points); + const uint32_t op_size = lv_array_size(&src->ops); + const uint32_t point_size = lv_array_size(&src->points); + const uint32_t path_length = (op_size + point_size * 2) * sizeof(float); + + /* Reserved memory for path data */ + lv_vg_lite_path_reserve_space(dest, path_length); + vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(dest); + vg_path->path_length = path_length; + float * path_data = vg_path->path; + + for(uint32_t i = 0; i < op_size; i++) { + switch(ops[i]) { + case LV_VECTOR_PATH_OP_MOVE_TO: { + LV_VG_LITE_PATH_SET_OP_CODE(path_data++, uint32_t, VLC_OP_MOVE); + COPY_POINT_NEXT(); + } + break; + case LV_VECTOR_PATH_OP_LINE_TO: { + LV_VG_LITE_PATH_SET_OP_CODE(path_data++, uint32_t, VLC_OP_LINE); + COPY_POINT_NEXT(); + } + break; + case LV_VECTOR_PATH_OP_QUAD_TO: { + LV_VG_LITE_PATH_SET_OP_CODE(path_data++, uint32_t, VLC_OP_QUAD); + COPY_POINT_NEXT(); + COPY_POINT_NEXT(); + } + break; + case LV_VECTOR_PATH_OP_CUBIC_TO: { + LV_VG_LITE_PATH_SET_OP_CODE(path_data++, uint32_t, VLC_OP_CUBIC); + COPY_POINT_NEXT(); + COPY_POINT_NEXT(); + COPY_POINT_NEXT(); + } + break; + case LV_VECTOR_PATH_OP_CLOSE: { + LV_VG_LITE_PATH_SET_OP_CODE(path_data++, uint32_t, VLC_OP_CLOSE); + } + break; + default: + LV_LOG_WARN("unknown op: %d", ops[i]); + break; + } + } + + LV_ASSERT_MSG((lv_uintptr_t)path_data - (lv_uintptr_t)vg_path->path == path_length, "path length overflow"); + + lv_vg_lite_path_set_bounding_box(dest, + min_x - expand_bound, + min_y - expand_bound, + max_x + expand_bound + 1, + max_y + expand_bound + 1); + + offset->x = lroundf(min_x); + offset->y = lroundf(min_y); + LV_PROFILER_DRAW_END; +} + +static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend) +{ + switch(blend) { + case LV_VECTOR_BLEND_SRC_OVER: + return VG_LITE_BLEND_SRC_OVER; + case LV_VECTOR_BLEND_SCREEN: + return VG_LITE_BLEND_SCREEN; + case LV_VECTOR_BLEND_MULTIPLY: + return VG_LITE_BLEND_MULTIPLY; + case LV_VECTOR_BLEND_NONE: + return VG_LITE_BLEND_NONE; + case LV_VECTOR_BLEND_ADDITIVE: + return VG_LITE_BLEND_ADDITIVE; + case LV_VECTOR_BLEND_SRC_IN: + return VG_LITE_BLEND_SRC_IN; + case LV_VECTOR_BLEND_DST_OVER: + return VG_LITE_BLEND_DST_OVER; + case LV_VECTOR_BLEND_DST_IN: + return VG_LITE_BLEND_DST_IN; + case LV_VECTOR_BLEND_SUBTRACTIVE: + return VG_LITE_BLEND_SUBTRACT; + default: + return VG_LITE_BLEND_SRC_OVER; + } +} + +static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule) +{ + switch(fill_rule) { + case LV_VECTOR_FILL_NONZERO: + return VG_LITE_FILL_NON_ZERO; + case LV_VECTOR_FILL_EVENODD: + return VG_LITE_FILL_EVEN_ODD; + default: + return VG_LITE_FILL_NON_ZERO; + } +} + +#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ + diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_bitmap_font_cache.c b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_bitmap_font_cache.c new file mode 100644 index 0000000..92ef185 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_bitmap_font_cache.c @@ -0,0 +1,204 @@ +/** + * @file lv_vg_lite_bitmap_font_cache.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_bitmap_font_cache.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_utils.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#define font_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->font_draw_buf_handlers) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* key */ + lv_font_glyph_dsc_t g_dsc; + + /* value */ + lv_draw_buf_t * draw_buf; +} cache_item_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void cache_release_cb(void * entry, void * user_data); +static bool cache_create_cb(cache_item_t * item, void * user_data); +static void cache_free_cb(cache_item_t * item, void * user_data); +static lv_cache_compare_res_t cache_compare_cb(const cache_item_t * lhs, const cache_item_t * rhs); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_vg_lite_bitmap_font_cache_init(struct _lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT(unit->bitmap_font_cache == NULL); + LV_ASSERT(unit->bitmap_font_pending == NULL); + LV_ASSERT(cache_cnt > 0); + + const lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)cache_create_cb, + .free_cb = (lv_cache_free_cb_t)cache_free_cb, + }; + + unit->bitmap_font_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(cache_item_t), cache_cnt, ops); + lv_cache_set_name(unit->bitmap_font_cache, "VG_BITMAP_FONT"); + unit->bitmap_font_pending = lv_vg_lite_pending_create(sizeof(lv_cache_entry_t *), 8); + lv_vg_lite_pending_set_free_cb(unit->bitmap_font_pending, cache_release_cb, unit->bitmap_font_cache); +} + +void lv_vg_lite_bitmap_font_cache_deinit(struct _lv_draw_vg_lite_unit_t * unit) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT_NULL(unit->bitmap_font_cache); + LV_ASSERT_NULL(unit->bitmap_font_pending); + + lv_vg_lite_pending_destroy(unit->bitmap_font_pending); + unit->bitmap_font_pending = NULL; + + lv_cache_destroy(unit->bitmap_font_cache, NULL); + unit->bitmap_font_cache = NULL; +} + +lv_draw_buf_t * lv_vg_lite_bitmap_font_cache_get(struct _lv_draw_vg_lite_unit_t * unit, + const lv_font_glyph_dsc_t * g_dsc) +{ + LV_PROFILER_FONT_BEGIN; + LV_ASSERT_NULL(unit); + LV_ASSERT_NULL(g_dsc); + + uint32_t gid = g_dsc->gid.index; + if(!gid) { + LV_PROFILER_FONT_END; + return NULL; + } + + cache_item_t search_key = { 0 }; + search_key.g_dsc = *g_dsc; + + lv_cache_entry_t * cache_node_entry = lv_cache_acquire(unit->bitmap_font_cache, &search_key, NULL); + + if(cache_node_entry == NULL) { + /* check if the cache is full */ + size_t free_size = lv_cache_get_free_size(unit->bitmap_font_cache, NULL); + if(free_size == 0) { + LV_LOG_INFO("bitmap font cache is full, release all pending cache entries"); + lv_vg_lite_finish(unit); + } + + cache_node_entry = lv_cache_acquire_or_create(unit->bitmap_font_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + LV_LOG_ERROR("bitmap cache creating failed"); + LV_PROFILER_FONT_END; + return NULL; + } + } + + /* Add the new entry to the pending list */ + lv_vg_lite_pending_add(unit->bitmap_font_pending, &cache_node_entry); + + cache_item_t * cache_item = lv_cache_entry_get_data(cache_node_entry); + + LV_PROFILER_FONT_END; + return cache_item->draw_buf; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void cache_release_cb(void * entry, void * user_data) +{ + lv_cache_entry_t ** entry_p = entry; + lv_cache_t * cache = user_data; + lv_cache_release(cache, *entry_p, NULL); +} + +static bool cache_create_cb(cache_item_t * item, void * user_data) +{ + LV_UNUSED(user_data); + LV_PROFILER_FONT_BEGIN; + + LV_LOG_TRACE("gid: %" LV_PRIu32 ", W%" LV_PRIu32 "xH%" LV_PRIu32, + item->g_dsc.gid.index, item->g_dsc.box_w, item->g_dsc.box_h); + + lv_draw_buf_t * draw_buf = lv_draw_buf_create_ex(font_draw_buf_handlers, + item->g_dsc.box_w, + item->g_dsc.box_h, + LV_COLOR_FORMAT_A8, + LV_STRIDE_AUTO); + if(!draw_buf) { + LV_LOG_ERROR("Failed to create draw buffer for bitmap font cache"); + LV_PROFILER_FONT_END; + return false; + } + + if(!lv_font_get_glyph_bitmap(&item->g_dsc, draw_buf)) { + LV_LOG_WARN("Failed to get glyph bitmap for bitmap font cache"); + lv_draw_buf_destroy(draw_buf); + LV_PROFILER_FONT_END; + return false; + } + + item->draw_buf = draw_buf; + + LV_PROFILER_FONT_END; + return true; +} + +static void cache_free_cb(cache_item_t * item, void * user_data) +{ + LV_UNUSED(user_data); + LV_PROFILER_FONT_BEGIN; + + LV_LOG_TRACE("gid: %" LV_PRIu32 ", W%" LV_PRIu32 "xH%" LV_PRIu32, + item->g_dsc.gid.index, item->g_dsc.box_w, item->g_dsc.box_h); + + lv_draw_buf_destroy(item->draw_buf); + item->draw_buf = NULL; + + LV_PROFILER_FONT_END; +} + +static lv_cache_compare_res_t cache_compare_cb(const cache_item_t * lhs, const cache_item_t * rhs) +{ + /* Because const font pointers are unique, matching can be performed using only the pointer. */ + if(lhs->g_dsc.resolved_font != rhs->g_dsc.resolved_font) { + return lhs->g_dsc.resolved_font > rhs->g_dsc.resolved_font ? 1 : -1; + } + + if(lhs->g_dsc.gid.index != rhs->g_dsc.gid.index) { + return lhs->g_dsc.gid.index > rhs->g_dsc.gid.index ? 1 : -1; + } + + return 0; +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_bitmap_font_cache.h b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_bitmap_font_cache.h new file mode 100644 index 0000000..dac0c3c --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_bitmap_font_cache.h @@ -0,0 +1,69 @@ +/** + * @file lv_vg_lite_bitmap_font_cache.h + * + */ + +#ifndef LV_VG_LITE_BITMAP_FONT_CACHE_H +#define LV_VG_LITE_BITMAP_FONT_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../../font/lv_font.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_vg_lite_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the bitmap font cache for VG-Lite draw unit + * @param unit pointer to the VG-Lite draw unit + * @param cache_cnt number of cache entries to allocate + */ +void lv_vg_lite_bitmap_font_cache_init(struct _lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt); + +/** + * @brief Deinitialize the bitmap font cache for VG-Lite draw unit + * @param unit pointer to the VG-Lite draw unit + */ +void lv_vg_lite_bitmap_font_cache_deinit(struct _lv_draw_vg_lite_unit_t * unit); + +/** + * @brief Get the bitmap font cache entry for a given font and letter + * @param unit pointer to the VG-Lite draw unit + * @param g_dsc pointer to the glyph descriptor + * @return pointer to the draw buffer containing the cached bitmap font glyph, or NULL if the glyph ID is 0 or if cache creation fails + */ +lv_draw_buf_t * lv_vg_lite_bitmap_font_cache_get(struct _lv_draw_vg_lite_unit_t * unit, + const lv_font_glyph_dsc_t * g_dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_BITMAP_FONT_CACHE_H*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c new file mode 100644 index 0000000..125a703 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c @@ -0,0 +1,890 @@ +/** + * @file lv_vg_lite_decoder.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_decoder.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_vg_lite_utils.h" +#include "../../core/lv_global.h" +#include "../lv_image_decoder_private.h" +#include "../../libs/bin_decoder/lv_bin_decoder.h" + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "VG_LITE" + +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +/* Since the palette and index image are next to each other, + * the palette size needs to be aligned to ensure that the image is aligned. + */ +#define I8_IMG_OFFSET \ + LV_VG_LITE_ALIGN(LV_COLOR_INDEXED_PALETTE_SIZE(LV_COLOR_FORMAT_I8) * sizeof(lv_color32_t), LV_DRAW_BUF_ALIGN) + +#define SWAP_UINT16(x) ((((x) & 0x00FF) << 8) | (((x) & 0xFF00) >> 8)) + +/********************** + * TYPEDEFS + **********************/ + +/* This structure represents the ARGB8565 format (3 bytes per pixel). */ +typedef struct { + lv_color16_t color; + uint8_t alpha; +} color16_alpha_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_vg_lite_decoder_init(void) +{ + lv_image_decoder_t * decoder = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(decoder, decoder_info); + lv_image_decoder_set_open_cb(decoder, decoder_open); + lv_image_decoder_set_close_cb(decoder, decoder_close); + + decoder->name = DECODER_NAME; +} + +void lv_vg_lite_decoder_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size) +{ + while(px_size--) { + lv_color_premultiply(img_data); + img_data++; + } +} + +static uint32_t get_image_stride(const lv_image_header_t * header) +{ + /* use stride in header */ + if(header->stride) { + return header->stride; + } + + /* compact format stride */ + uint32_t ori_stride = header->w * lv_color_format_get_bpp(header->cf); + ori_stride = (ori_stride + 7) >> 3; /*Round up*/ + return ori_stride; +} + +static void image_decode_to_index8_line(uint8_t * dest, const uint8_t * src, int32_t w_px, + lv_color_format_t color_format) +{ + uint8_t px_size; + uint16_t mask; + + int8_t shift = 0; + switch(color_format) { + case LV_COLOR_FORMAT_I1: + px_size = 1; + shift = 7; + break; + case LV_COLOR_FORMAT_I2: + px_size = 2; + shift = 6; + break; + case LV_COLOR_FORMAT_I4: + px_size = 4; + shift = 4; + break; + case LV_COLOR_FORMAT_I8: + lv_memcpy(dest, src, w_px); + return; + default: + LV_ASSERT_FORMAT_MSG(false, "Unsupported color format: %d", color_format); + return; + } + + mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ + + for(int32_t i = 0; i < w_px; i++) { + uint8_t val_act = (*src >> shift) & mask; + dest[i] = val_act; + + shift -= px_size; + if(shift < 0) { + shift = 8 - px_size; + src++; + } + } +} + +static lv_color_format_t get_converted_cf(lv_color_format_t cf) +{ + switch(cf) { + /** + * VG_LITE_INDEX1, 2, and 4 require endian flipping + bit flipping, + * so for simplicity, convert them to I8. + */ + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_I4: + return LV_COLOR_FORMAT_I8; + + case LV_COLOR_FORMAT_A1: + case LV_COLOR_FORMAT_A2: + return LV_COLOR_FORMAT_A8; + + /** + * If the GPU does not support the 24-bit format, convert it to ARGB8888; + * otherwise, use the normal bin_decoder processing flow. + */ + case LV_COLOR_FORMAT_RGB888: + return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? LV_COLOR_FORMAT_UNKNOWN : LV_COLOR_FORMAT_XRGB8888; + case LV_COLOR_FORMAT_ARGB8565: + return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? LV_COLOR_FORMAT_UNKNOWN : LV_COLOR_FORMAT_ARGB8888; + + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_AL88: + return LV_COLOR_FORMAT_ARGB8888; + + case LV_COLOR_FORMAT_RGB565_SWAPPED: + return LV_COLOR_FORMAT_RGB565; + + default: + break; + } + + return LV_COLOR_FORMAT_UNKNOWN; +} + +static void set_premultiplied_flag_if_needed(lv_draw_buf_t * dest_buf, bool premultiply) +{ + if(premultiply && lv_color_format_has_alpha(dest_buf->header.cf)) { + lv_draw_buf_set_flag(dest_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); + } +} + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + lv_result_t res = lv_bin_decoder_info(decoder, dsc, header); + if(res != LV_RESULT_OK) { + return res; + } + + lv_color_format_t cf = get_converted_cf(header->cf); + if(cf == LV_COLOR_FORMAT_UNKNOWN) { + return LV_RESULT_INVALID; + } + + if(header->flags & LV_IMAGE_FLAGS_COMPRESSED) { + lv_image_src_t src_type = lv_image_src_get_type(dsc->src); + LV_LOG_WARN("NOT Supported compressed flags: %d, format: %d, type: %d, src: %p (%s)", + header->flags, header->cf, src_type, dsc->src, src_type == LV_IMAGE_SRC_FILE ? (const char *)dsc->src : "variable"); + return LV_RESULT_INVALID; + } + + header->cf = cf; + return LV_RESULT_OK; +} + +static lv_result_t decoder_open_variable_index(lv_draw_buf_t * dest_buf, const lv_draw_buf_t * src_buf, + bool premultiply) +{ + LV_PROFILER_DECODER_BEGIN; + /* Since dsc->header.cf is uniformly set to I8, + * the original format is obtained from src for conversion. + */ + + /*In case of uncompressed formats the image stored in the ROM/RAM. + *So simply give its pointer*/ + const uint8_t * src = src_buf->data; + uint8_t * dest = dest_buf->data; + + /* index format only */ + uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(src_buf->header.cf); + LV_ASSERT(palette_size > 0); + uint32_t palette_size_bytes = palette_size * sizeof(lv_color32_t); + + /* copy palette */ + lv_memcpy(dest, src, palette_size_bytes); + + if(premultiply) { + /* pre-multiply palette */ + image_color32_pre_mul((lv_color32_t *)dest, palette_size); + } + + /* move to index image map */ + src += palette_size_bytes; + dest += I8_IMG_OFFSET; + + /* copy index image */ + for(int32_t y = 0; y < src_buf->header.h; y++) { + image_decode_to_index8_line(dest, src, src_buf->header.w, src_buf->header.cf); + src += src_buf->header.stride; + dest += dest_buf->header.stride; + } + + LV_PROFILER_DECODER_END; + return LV_RESULT_OK; +} + +static void convert_rgb565_swapped_line(uint16_t * dest, const uint16_t * src, uint32_t px_cnt) +{ + while(px_cnt--) { + *dest = SWAP_UINT16(*src); + dest++; + src++; + } +} + +static void convert_rgb888_line(lv_color32_t * dest, const lv_color_t * src, uint32_t px_cnt) +{ + while(px_cnt--) { + dest->red = src->red; + dest->green = src->green; + dest->blue = src->blue; + dest->alpha = 0xFF; + src++; + dest++; + } +} + +static void convert_argb8565_line(lv_color32_t * dest, const color16_alpha_t * src, uint32_t px_cnt, bool premultiply) +{ + while(px_cnt--) { + dest->red = src->color.red * 0xFF / 0x1F; + dest->green = src->color.green * 0xFF / 0x3F; + dest->blue = src->color.blue * 0xFF / 0x1F; + dest->alpha = src->alpha; + + if(premultiply) { + lv_color_premultiply(dest); + } + + src++; + dest++; + } +} + +static void convert_al88_line(lv_color32_t * dest, const lv_color16a_t * src, uint32_t px_cnt, bool premultiply) +{ + while(px_cnt--) { + dest->red = src->lumi; + dest->green = src->lumi; + dest->blue = src->lumi; + dest->alpha = src->alpha; + + if(premultiply) { + lv_color_premultiply(dest); + } + + src++; + dest++; + } +} + +static void convert_alpha_to_a8_line(uint8_t * dest, const uint8_t * src, int32_t w_px, + lv_color_format_t color_format) +{ + uint8_t px_size; + uint8_t max_val; + + int8_t shift = 0; + switch(color_format) { + case LV_COLOR_FORMAT_A1: + px_size = 1; + shift = 7; + max_val = 1; + break; + case LV_COLOR_FORMAT_A2: + px_size = 2; + shift = 6; + max_val = 3; + break; + case LV_COLOR_FORMAT_A4: + px_size = 4; + shift = 4; + max_val = 15; + break; + case LV_COLOR_FORMAT_A8: + lv_memcpy(dest, src, w_px); + return; + default: + LV_ASSERT_FORMAT_MSG(false, "Unsupported color format: %d", color_format); + return; + } + + uint16_t mask = (1 << px_size) - 1; + + for(int32_t i = 0; i < w_px; i++) { + uint8_t val_act = (*src >> shift) & mask; + dest[i] = (val_act * 0xFF) / max_val; + + shift -= px_size; + if(shift < 0) { + shift = 8 - px_size; + src++; + } + } +} + +static lv_result_t decoder_open_variable_alpha(lv_draw_buf_t * dest_buf, const lv_draw_buf_t * src_buf) +{ + LV_PROFILER_DECODER_BEGIN; + + const uint8_t * src = src_buf->data; + uint8_t * dest = dest_buf->data; + + for(int32_t y = 0; y < src_buf->header.h; y++) { + convert_alpha_to_a8_line(dest, src, src_buf->header.w, src_buf->header.cf); + src += src_buf->header.stride; + dest += dest_buf->header.stride; + } + + LV_PROFILER_DECODER_END; + return LV_RESULT_OK; +} + +static lv_result_t decoder_open_variable_rgb(lv_draw_buf_t * dest_buf, + const lv_draw_buf_t * src_buf, bool premultiply) +{ + LV_PROFILER_DECODER_BEGIN; + + switch(src_buf->header.cf) { + case LV_COLOR_FORMAT_RGB565_SWAPPED: { + for(uint32_t y = 0; y < src_buf->header.h; y++) { + const uint16_t * src = lv_draw_buf_goto_xy(src_buf, 0, y); + uint16_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + convert_rgb565_swapped_line(dest, src, src_buf->header.w); + } + } + break; + + case LV_COLOR_FORMAT_RGB888: { + for(uint32_t y = 0; y < src_buf->header.h; y++) { + const lv_color_t * src = lv_draw_buf_goto_xy(src_buf, 0, y); + lv_color32_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + convert_rgb888_line(dest, src, src_buf->header.w); + } + } + break; + + case LV_COLOR_FORMAT_ARGB8565: { + for(uint32_t y = 0; y < src_buf->header.h; y++) { + const color16_alpha_t * src = lv_draw_buf_goto_xy(src_buf, 0, y); + lv_color32_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + convert_argb8565_line(dest, src, src_buf->header.w, premultiply); + } + } + break; + + case LV_COLOR_FORMAT_RGB565A8: { + const uint8_t * alpha_row = lv_draw_buf_goto_xy(src_buf, 0, src_buf->header.h - 1); + alpha_row += src_buf->header.stride; + + for(uint32_t y = 0; y < src_buf->header.h; y++) { + const lv_color16_t * src = lv_draw_buf_goto_xy(src_buf, 0, y); + lv_color32_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + const uint8_t * alpha_p = alpha_row; + for(uint32_t x = 0; x < src_buf->header.w; x++) { + dest->red = src->red * 0xFF / 0x1F; + dest->green = src->green * 0xFF / 0x3F; + dest->blue = src->blue * 0xFF / 0x1F; + dest->alpha = *alpha_p; + + if(premultiply) { + lv_color_premultiply(dest); + } + + src++; + dest++; + alpha_p++; + } + + alpha_row += src_buf->header.stride / 2; + } + } + break; + + case LV_COLOR_FORMAT_AL88: { + for(uint32_t y = 0; y < src_buf->header.h; y++) { + const lv_color16a_t * src = lv_draw_buf_goto_xy(src_buf, 0, y); + lv_color32_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + convert_al88_line(dest, src, src_buf->header.w, premultiply); + } + } + break; + + default: + return LV_RESULT_INVALID; + } + + LV_PROFILER_DECODER_END; + return LV_RESULT_OK; +} + +static bool file_read_line(lv_fs_file_t * file, void * buf, uint32_t size) +{ + uint32_t br = 0; + lv_fs_res_t res = lv_fs_read(file, buf, size, &br); + if(res != LV_FS_RES_OK || br != size) { + LV_LOG_ERROR("read size: %" LV_PRIu32 " failed, br: %" LV_PRIu32 " res: %d", + size, br, res); + return false; + } + + return true; +} + +static lv_result_t decoder_open_file_index(lv_draw_buf_t * dest_buf, + lv_fs_file_t * file, + const lv_image_header_t * src_header, + bool premultiply) +{ + LV_PROFILER_DECODER_BEGIN; + uint32_t width = src_header->w; + uint32_t height = src_header->h; + uint8_t * src_temp = NULL; + + uint8_t * dest = dest_buf->data; + + /* index format only */ + uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(src_header->cf); + LV_ASSERT(palette_size > 0); + + /* read palette */ + if(!file_read_line(file, dest, palette_size * sizeof(lv_color32_t))) { + LV_LOG_ERROR("read palette failed"); + LV_PROFILER_DECODER_END; + return LV_RESULT_INVALID; + } + + if(premultiply) { + /* pre-multiply palette */ + image_color32_pre_mul((lv_color32_t *)dest, palette_size); + } + + src_temp = lv_malloc(src_header->stride); + if(!src_temp) { + LV_LOG_ERROR("malloc src_stride: %" LV_PRIu32 " failed", src_header->stride); + LV_PROFILER_DECODER_END; + return LV_RESULT_INVALID; + } + + /* move to index image map */ + dest += I8_IMG_OFFSET; + + for(uint32_t y = 0; y < height; y++) { + if(!file_read_line(file, src_temp, src_header->stride)) { + lv_free(src_temp); + LV_PROFILER_DECODER_END; + return LV_RESULT_INVALID; + } + + /* convert to index8 */ + image_decode_to_index8_line(dest, src_temp, width, src_header->cf); + dest += dest_buf->header.stride; + } + + lv_free(src_temp); + LV_PROFILER_DECODER_END; + return LV_RESULT_OK; +} + +static lv_result_t decoder_open_file_alpha(lv_draw_buf_t * dest_buf, + lv_fs_file_t * file, + const lv_image_header_t * src_header) +{ + LV_PROFILER_DECODER_BEGIN; + uint32_t width = src_header->w; + uint32_t height = src_header->h; + + uint8_t * src_temp = lv_malloc(src_header->stride); + if(!src_temp) { + LV_LOG_ERROR("malloc src_stride: %" LV_PRIu32 " failed", src_header->stride); + LV_PROFILER_DECODER_END; + return LV_RESULT_INVALID; + } + + uint8_t * dest = dest_buf->data; + + for(uint32_t y = 0; y < height; y++) { + if(!file_read_line(file, src_temp, src_header->stride)) { + lv_free(src_temp); + LV_PROFILER_DECODER_END; + return LV_RESULT_INVALID; + } + + convert_alpha_to_a8_line(dest, src_temp, width, src_header->cf); + dest += dest_buf->header.stride; + } + + lv_free(src_temp); + LV_PROFILER_DECODER_END; + return LV_RESULT_OK; +} + +static lv_result_t decoder_open_file_rgb(lv_draw_buf_t * dest_buf, + lv_fs_file_t * file, + const lv_image_header_t * src_header, + bool premultiply) +{ + LV_PROFILER_DECODER_BEGIN; + uint32_t width = src_header->w; + uint32_t height = src_header->h; + + void * src_temp = lv_malloc(src_header->stride); + if(!src_temp) { + LV_LOG_ERROR("malloc src_stride: %" LV_PRIu32 " failed", src_header->stride); + LV_PROFILER_DECODER_END; + return LV_RESULT_INVALID; + } + + lv_result_t res = LV_RESULT_INVALID; + + switch(src_header->cf) { + case LV_COLOR_FORMAT_RGB565_SWAPPED: { + for(uint32_t y = 0; y < height; y++) { + if(!file_read_line(file, src_temp, src_header->stride)) { + goto failed; + } + + uint16_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + convert_rgb565_swapped_line(dest, src_temp, width); + } + + res = LV_RESULT_OK; + } + break; + + case LV_COLOR_FORMAT_RGB888: { + for(uint32_t y = 0; y < height; y++) { + if(!file_read_line(file, src_temp, src_header->stride)) { + goto failed; + } + + lv_color32_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + convert_rgb888_line(dest, src_temp, width); + } + + res = LV_RESULT_OK; + } + break; + + case LV_COLOR_FORMAT_ARGB8565: { + for(uint32_t y = 0; y < height; y++) { + if(!file_read_line(file, src_temp, src_header->stride)) { + goto failed; + } + + lv_color32_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + convert_argb8565_line(dest, src_temp, width, premultiply); + } + + res = LV_RESULT_OK; + } + break; + + case LV_COLOR_FORMAT_RGB565A8: { + /* First pass: read RGB565 and convert to ARGB8888, skip alpha */ + for(uint32_t y = 0; y < height; y++) { + if(!file_read_line(file, src_temp, src_header->stride)) { + goto failed; + } + + const lv_color16_t * src = src_temp; + lv_color32_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + for(uint32_t x = 0; x < width; x++) { + dest->red = src->red * 0xFF / 0x1F; + dest->green = src->green * 0xFF / 0x3F; + dest->blue = src->blue * 0xFF / 0x1F; + src++; + dest++; + } + } + + /* Second pass: read A8 and update alpha, handle premultiply if needed */ + uint32_t alpha_stride = src_header->stride / 2; + for(uint32_t y = 0; y < height; y++) { + if(!file_read_line(file, src_temp, alpha_stride)) { + goto failed; + } + + lv_color32_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + const uint8_t * src = src_temp; + for(uint32_t x = 0; x < width; x++) { + dest->alpha = *src; + + if(premultiply) { + lv_color_premultiply(dest); + } + + src++; + dest++; + } + } + + res = LV_RESULT_OK; + } + break; + + case LV_COLOR_FORMAT_AL88: { + for(uint32_t y = 0; y < height; y++) { + if(!file_read_line(file, src_temp, src_header->stride)) { + goto failed; + } + + lv_color32_t * dest = lv_draw_buf_goto_xy(dest_buf, 0, y); + convert_al88_line(dest, src_temp, width, premultiply); + } + + res = LV_RESULT_OK; + } + break; + + default: + break; + } + +failed: + lv_free(src_temp); + LV_PROFILER_DECODER_END; + return res; +} + +static lv_draw_buf_t * create_dest_buf(uint32_t width, uint32_t height, lv_color_format_t src_cf) +{ + lv_color_format_t dest_cf = get_converted_cf(src_cf); + if(dest_cf == LV_COLOR_FORMAT_UNKNOWN) { + LV_LOG_WARN("NOT Supported src_cf: %d", src_cf); + return NULL; + } + + lv_draw_buf_t * dest_buf = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, + width, height, dest_cf, + LV_STRIDE_AUTO); + if(!dest_buf) { + return NULL; + } + + lv_draw_buf_clear(dest_buf, NULL); + return dest_buf; +} + +/** + * Decode an image using the vg_lite gpu. + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + lv_result_t res = LV_RESULT_INVALID; + + switch(dsc->src_type) { + case LV_IMAGE_SRC_VARIABLE: { + lv_draw_buf_t src_buf; + res = lv_draw_buf_from_image(&src_buf, dsc->src); + if(res != LV_RESULT_OK) { + return res; + } + + const bool src_premultiplied = lv_draw_buf_has_flag(&src_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); + const bool premultiply = src_premultiplied ? false : dsc->args.premultiply; + + /** + * Since lv_draw_buf_from_image automatically calculates the stride, + * we need to obtain the original stride information. + */ + src_buf.header.stride = get_image_stride(&((lv_image_dsc_t *)dsc->src)->header); + + lv_draw_buf_t * dest_buf = create_dest_buf(dsc->header.w, dsc->header.h, src_buf.header.cf); + if(!dest_buf) { + return LV_RESULT_INVALID; + } + + switch(src_buf.header.cf) { + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_I4: + case LV_COLOR_FORMAT_I8: + res = decoder_open_variable_index(dest_buf, &src_buf, premultiply); + break; + + case LV_COLOR_FORMAT_A1: + case LV_COLOR_FORMAT_A2: + res = decoder_open_variable_alpha(dest_buf, &src_buf); + break; + + case LV_COLOR_FORMAT_RGB565_SWAPPED: + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_AL88: + res = decoder_open_variable_rgb(dest_buf, &src_buf, premultiply); + break; + + default: + LV_LOG_WARN("NOT Supported color format: %d, src: %p", src_buf.header.cf, dsc->src); + res = LV_RESULT_INVALID; + break; + } + + if(res == LV_RESULT_OK) { + set_premultiplied_flag_if_needed(dest_buf, src_premultiplied || dsc->args.premultiply); + dsc->decoded = dest_buf; + } + else { + lv_draw_buf_destroy(dest_buf); + dsc->decoded = NULL; + return res; + } + } + + break; + case LV_IMAGE_SRC_FILE: { + lv_fs_file_t file; + lv_fs_res_t fs_res = lv_fs_open(&file, dsc->src, LV_FS_MODE_RD); + if(fs_res != LV_FS_RES_OK) { + LV_LOG_ERROR("open %s failed, res: %d", (const char *)dsc->src, fs_res); + return LV_RESULT_INVALID; + } + + /* get real src header */ + lv_image_header_t src_header; + uint32_t header_br = 0; + fs_res = lv_fs_read(&file, &src_header, sizeof(src_header), &header_br); + if(fs_res != LV_FS_RES_OK || header_br != sizeof(src_header)) { + LV_LOG_ERROR("read %s lv_image_header_t failed, res: %d, br: %" LV_PRIu32, (const char *)dsc->src, fs_res, header_br); + lv_fs_close(&file); + return LV_RESULT_INVALID; + } + + if(src_header.magic != LV_IMAGE_HEADER_MAGIC) { + LV_LOG_WARN("Legacy bin image detected: %s", (const char *)dsc->src); + src_header.cf = src_header.magic; + src_header.magic = LV_IMAGE_HEADER_MAGIC; + src_header.flags &= ~LV_IMAGE_FLAGS_PREMULTIPLIED; + } + + const bool src_premultiplied = src_header.flags & LV_IMAGE_FLAGS_PREMULTIPLIED; + const bool premultiply = src_premultiplied ? false : dsc->args.premultiply; + + src_header.stride = get_image_stride(&src_header); + + lv_draw_buf_t * dest_buf = create_dest_buf(dsc->header.w, dsc->header.h, src_header.cf); + if(!dest_buf) { + lv_fs_close(&file); + return LV_RESULT_INVALID; + } + + switch(src_header.cf) { + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_I4: + case LV_COLOR_FORMAT_I8: + res = decoder_open_file_index(dest_buf, &file, &src_header, premultiply); + break; + + case LV_COLOR_FORMAT_A1: + case LV_COLOR_FORMAT_A2: + res = decoder_open_file_alpha(dest_buf, &file, &src_header); + break; + + case LV_COLOR_FORMAT_RGB565_SWAPPED: + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_AL88: + res = decoder_open_file_rgb(dest_buf, &file, &src_header, premultiply); + break; + + default: + LV_LOG_WARN("NOT Supported color format: %d, src: %s", src_header.cf, (const char *)dsc->src); + res = LV_RESULT_INVALID; + break; + } + + if(res == LV_RESULT_OK) { + set_premultiplied_flag_if_needed(dest_buf, src_premultiplied || dsc->args.premultiply); + dsc->decoded = dest_buf; + } + else { + LV_LOG_WARN("read %s failed", (const char *)dsc->src); + lv_draw_buf_destroy(dest_buf); + dsc->decoded = NULL; + } + + lv_fs_close(&file); + } + break; + default: + break; + } + + if(dsc->args.no_cache) return res; + + /*If the image cache is disabled, just return the decoded image*/ + if(!lv_image_cache_is_enabled()) return res; + + /*Add the decoded image to the cache*/ + if(res == LV_RESULT_OK) { + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = dsc->decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, dsc->decoded, NULL); + + if(entry == NULL) { + lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); + dsc->decoded = NULL; + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; + } + + return res; +} + +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + if(dsc->args.no_cache || !lv_image_cache_is_enabled()) lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.h b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.h new file mode 100644 index 0000000..36ba215 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.h @@ -0,0 +1,47 @@ +/** + * @file lv_vg_lite_decoder.h + * + */ + +#ifndef LV_VG_LITE_DECODER_H +#define LV_VG_LITE_DECODER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_vg_lite_decoder_init(void); + +void lv_vg_lite_decoder_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_DECODER_H*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_grad.c b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_grad.c new file mode 100644 index 0000000..e0aa303 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_grad.c @@ -0,0 +1,881 @@ +/** + * @file lv_vg_lite_grad.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_grad.h" + +#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_math.h" +#include "../lv_draw_vector_private.h" + +/********************* + * DEFINES + *********************/ + +#define SQUARE(x) ((x)*(x)) + +#ifndef M_PI + #define M_PI 3.1415926f +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + GRAD_TYPE_FREE, + GRAD_TYPE_LINEAR, + GRAD_TYPE_LINEAR_EXT, + GRAD_TYPE_RADIAL, + GRAD_TYPE_UNKNOWN, +} grad_type_t; + +struct _lv_vg_lite_grad_ctx_t; + +typedef struct { + struct _lv_vg_lite_grad_ctx_t * ctx; + grad_type_t type; + lv_vector_gradient_t lv; + union { + vg_lite_linear_gradient_t linear; + vg_lite_ext_linear_gradient_t linear_ext; + vg_lite_radial_gradient_t radial; + } vg; +} grad_item_t; + +typedef grad_item_t * grad_item_ref_t; + +typedef struct _lv_vg_lite_grad_ctx_t { + struct _lv_draw_vg_lite_unit_t * unit; + lv_cache_t * cache; + struct _lv_vg_lite_pending_t * pending; + lv_ll_t item_pool; + + /** + * Temporary reuse of data to reduce the use of + * large memory allocations on the heap and stack during runtime + */ + grad_item_t local_grad_item; + vg_lite_color_ramp_t local_color_ramp[VLC_MAX_COLOR_RAMP_STOPS]; +} lv_vg_lite_grad_ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static grad_item_t * grad_get(lv_vg_lite_grad_ctx_t * ctx, const lv_vector_gradient_t * grad); +static void grad_cache_release_cb(void * entry, void * user_data); +static bool grad_create_cb(grad_item_ref_t * item_ref, void * user_data); +static void grad_free_cb(grad_item_ref_t * item_ref, void * user_data); +static lv_cache_compare_res_t grad_compare_cb(const grad_item_ref_t * lhs_ref, const grad_item_ref_t * rhs_ref); + +static grad_type_t lv_grad_style_to_type(lv_vector_gradient_style_t style); +static void grad_point_to_matrix(vg_lite_matrix_t * grad_matrix, float x1, float y1, float x2, float y2); +static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread); + +static void lv_vg_lite_linear_gradient_dump_info(const vg_lite_linear_gradient_t * grad); +static void lv_vg_lite_ext_linear_gradient_dump_info(const vg_lite_ext_linear_gradient_t * grad); +static void lv_vg_lite_radial_gradient_dump_info(const vg_lite_radial_gradient_t * grad); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +struct _lv_vg_lite_grad_ctx_t * lv_vg_lite_grad_ctx_create(uint32_t cache_cnt, struct _lv_draw_vg_lite_unit_t * unit) +{ + LV_ASSERT_MSG(cache_cnt > 0, "cache_cnt should be greater than 0"); + + lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)grad_compare_cb, + .create_cb = (lv_cache_create_cb_t)grad_create_cb, + .free_cb = (lv_cache_free_cb_t)grad_free_cb, + }; + + lv_vg_lite_grad_ctx_t * ctx = lv_malloc_zeroed(sizeof(lv_vg_lite_grad_ctx_t)); + LV_ASSERT_MALLOC(ctx); + ctx->unit = unit; + + lv_ll_init(&ctx->item_pool, sizeof(grad_item_t)); + + ctx->cache = lv_cache_create(&lv_cache_class_lru_ll_count, sizeof(grad_item_ref_t), cache_cnt, ops); + lv_cache_set_name(ctx->cache, "VG_GRAD"); + ctx->pending = lv_vg_lite_pending_create(sizeof(lv_cache_entry_t *), 4); + lv_vg_lite_pending_set_free_cb(ctx->pending, grad_cache_release_cb, ctx->cache); + + return ctx; +} + +void lv_vg_lite_grad_ctx_delete(struct _lv_vg_lite_grad_ctx_t * ctx) +{ + LV_ASSERT_NULL(ctx); + lv_vg_lite_pending_destroy(ctx->pending); + lv_cache_destroy(ctx->cache, NULL); + lv_ll_clear(&ctx->item_pool); + + lv_memzero(ctx, sizeof(lv_vg_lite_grad_ctx_t)); + lv_free(ctx); +} + +struct _lv_vg_lite_pending_t * lv_vg_lite_grad_ctx_get_pending(struct _lv_vg_lite_grad_ctx_t * ctx) +{ + LV_ASSERT_NULL(ctx); + return ctx->pending; +} + +struct _lv_cache_t * lv_vg_lite_grad_ctx_get_cache(struct _lv_vg_lite_grad_ctx_t * ctx) +{ + LV_ASSERT_NULL(ctx); + return ctx->cache; +} + +bool lv_vg_lite_draw_grad( + struct _lv_vg_lite_grad_ctx_t * ctx, + vg_lite_buffer_t * buffer, + vg_lite_path_t * path, + const lv_vector_gradient_t * grad, + const vg_lite_matrix_t * grad_matrix, + const vg_lite_matrix_t * matrix, + vg_lite_fill_t fill, + vg_lite_blend_t blend) +{ + LV_ASSERT_NULL(ctx); + LV_VG_LITE_ASSERT_DEST_BUFFER(buffer); + LV_VG_LITE_ASSERT_PATH(path); + LV_ASSERT_NULL(grad); + LV_VG_LITE_ASSERT_MATRIX(grad_matrix); + LV_VG_LITE_ASSERT_MATRIX(matrix); + + /* check radial gradient is supported */ + if(grad->style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_RADIAL_GRADIENT)) { + LV_LOG_WARN("radial gradient is not supported"); + return false; + } + + /* check if the radius is valid */ + if(grad->cr <= 0) { + LV_LOG_WARN("radius: %f is not valid", grad->cr); + return false; + } + } + + /* check spread mode is supported */ + if(grad->spread == LV_VECTOR_GRADIENT_SPREAD_REPEAT || grad->spread == LV_VECTOR_GRADIENT_SPREAD_REFLECT) { + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_IM_REPEAT_REFLECT)) { + LV_LOG_WARN("repeat/reflect spread(%d) is not supported", grad->spread); + return false; + } + } + + grad_item_t * grad_item = grad_get(ctx, grad); + if(!grad_item) { + LV_LOG_WARN("Failed to get gradient, style: %d", grad->style); + return false; + } + LV_ASSERT(grad_item->lv.style == grad->style); + + switch(grad_item->type) { + case GRAD_TYPE_LINEAR: { + vg_lite_linear_gradient_t * linear_grad = &grad_item->vg.linear; + vg_lite_matrix_t * grad_mat_p = vg_lite_get_grad_matrix(linear_grad); + LV_ASSERT_NULL(grad_mat_p); + *grad_mat_p = *grad_matrix; + grad_point_to_matrix(grad_mat_p, grad->x1, grad->y1, grad->x2, grad->y2); + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_draw_grad"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw_grad( + buffer, + path, + fill, + (vg_lite_matrix_t *)matrix, + linear_grad, + blend), + /* Dump parameters */ + { + lv_vg_lite_buffer_dump_info(buffer); + lv_vg_lite_path_dump_info(path); + LV_LOG_USER("fill_rule: 0x%X", (int)fill); + lv_vg_lite_matrix_dump_info(matrix); + lv_vg_lite_linear_gradient_dump_info(linear_grad); + LV_LOG_USER("blend_mode: 0x%X", (int)blend); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_draw_grad"); + } + break; + case GRAD_TYPE_LINEAR_EXT: { + vg_lite_ext_linear_gradient_t * linear_grad = &grad_item->vg.linear_ext; + vg_lite_matrix_t * grad_mat_p = vg_lite_get_linear_grad_matrix(linear_grad); + LV_ASSERT_NULL(grad_mat_p); + *grad_mat_p = *grad_matrix; + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_draw_linear_grad"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw_linear_grad( + buffer, + path, + fill, + (vg_lite_matrix_t *)matrix, + linear_grad, + 0, + blend, + VG_LITE_FILTER_LINEAR), + /* Dump parameters */ + { + lv_vg_lite_buffer_dump_info(buffer); + lv_vg_lite_path_dump_info(path); + LV_LOG_USER("fill_rule: 0x%X", (int)fill); + lv_vg_lite_matrix_dump_info(matrix); + lv_vg_lite_ext_linear_gradient_dump_info(linear_grad); + LV_LOG_USER("blend_mode: 0x%X", (int)blend); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_draw_linear_grad"); + } + break; + + case GRAD_TYPE_RADIAL: { + vg_lite_radial_gradient_t * radial_gradient = &grad_item->vg.radial; + vg_lite_matrix_t * grad_mat_p = vg_lite_get_radial_grad_matrix(radial_gradient); + LV_ASSERT_NULL(grad_mat_p); + *grad_mat_p = *grad_matrix; + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_draw_radial_grad"); + LV_VG_LITE_CHECK_ERROR( + vg_lite_draw_radial_grad( + buffer, + path, + fill, + (vg_lite_matrix_t *)matrix, + radial_gradient, + 0, + blend, + VG_LITE_FILTER_LINEAR), + /* Dump parameters */ + { + lv_vg_lite_buffer_dump_info(buffer); + lv_vg_lite_path_dump_info(path); + LV_LOG_USER("fill_rule: 0x%X", (int)fill); + lv_vg_lite_matrix_dump_info(matrix); + lv_vg_lite_radial_gradient_dump_info(radial_gradient); + LV_LOG_USER("blend_mode: 0x%X", (int)blend); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_draw_radial_grad"); + } + break; + + default: + LV_LOG_ERROR("Unsupported gradient type: %d", grad_item->type); + return false; + } + + return true; +} + +bool lv_vg_lite_draw_grad_helper( + struct _lv_vg_lite_grad_ctx_t * ctx, + vg_lite_buffer_t * buffer, + vg_lite_path_t * path, + const lv_area_t * area, + const lv_grad_dsc_t * grad_dsc, + const vg_lite_matrix_t * matrix, + vg_lite_fill_t fill, + vg_lite_blend_t blend) +{ + LV_ASSERT_NULL(ctx); + LV_VG_LITE_ASSERT_DEST_BUFFER(buffer); + LV_VG_LITE_ASSERT_PATH(path); + LV_ASSERT_NULL(area); + LV_ASSERT_NULL(grad_dsc); + LV_VG_LITE_ASSERT_MATRIX(matrix); + + lv_vector_gradient_t grad; + lv_memzero(&grad, sizeof(grad)); + + grad.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; + grad.stops_count = grad_dsc->stops_count; + lv_memcpy(grad.stops, grad_dsc->stops, sizeof(lv_grad_stop_t) * grad_dsc->stops_count); + + /*convert to spread mode*/ + switch(grad_dsc->extend) { + case LV_GRAD_EXTEND_PAD: + grad.spread = LV_VECTOR_GRADIENT_SPREAD_PAD; + break; + case LV_GRAD_EXTEND_REPEAT: + grad.spread = LV_VECTOR_GRADIENT_SPREAD_REPEAT; + break; + case LV_GRAD_EXTEND_REFLECT: + grad.spread = LV_VECTOR_GRADIENT_SPREAD_REFLECT; + break; + default: + LV_LOG_WARN("Unsupported gradient extend mode: %d", grad_dsc->extend); + grad.spread = LV_VECTOR_GRADIENT_SPREAD_PAD; + break; + } + + switch(grad_dsc->dir) { + case LV_GRAD_DIR_VER: + grad.x1 = area->x1; + grad.y1 = area->y1; + grad.x2 = area->x1; + grad.y2 = area->y2 + 1; + break; + + case LV_GRAD_DIR_HOR: + grad.x1 = area->x1; + grad.y1 = area->y1; + grad.x2 = area->x2 + 1; + grad.y2 = area->y1; + break; + + case LV_GRAD_DIR_LINEAR: { + int32_t w = lv_area_get_width(area); + int32_t h = lv_area_get_height(area); + + grad.x1 = lv_pct_to_px(grad_dsc->params.linear.start.x, w) + area->x1; + grad.y1 = lv_pct_to_px(grad_dsc->params.linear.start.y, h) + area->y1; + grad.x2 = lv_pct_to_px(grad_dsc->params.linear.end.x, w) + area->x1; + grad.y2 = lv_pct_to_px(grad_dsc->params.linear.end.y, h) + area->y1; + } + break; + + case LV_GRAD_DIR_RADIAL: { + grad.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; + int32_t w = lv_area_get_width(area); + int32_t h = lv_area_get_height(area); + + grad.cx = lv_pct_to_px(grad_dsc->params.radial.focal.x, w) + area->x1; + grad.cy = lv_pct_to_px(grad_dsc->params.radial.focal.y, h) + area->y1; + int32_t end_extent_x = lv_pct_to_px(grad_dsc->params.radial.end_extent.x, w) + area->x1; + int32_t end_extent_y = lv_pct_to_px(grad_dsc->params.radial.end_extent.y, h) + area->y1; + grad.cr = LV_MAX(end_extent_x - grad.cx, end_extent_y - grad.cy); + } + break; + + default: + LV_LOG_WARN("Unsupported gradient direction: %d", grad_dsc->dir); + return false; + } + + return lv_vg_lite_draw_grad(ctx, buffer, path, &grad, matrix, matrix, fill, blend); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static grad_item_t * grad_get(lv_vg_lite_grad_ctx_t * ctx, const lv_vector_gradient_t * grad) +{ + LV_PROFILER_DRAW_BEGIN; + LV_ASSERT_NULL(ctx); + LV_ASSERT_NULL(grad); + + grad_item_ref_t search_key = &ctx->local_grad_item; + lv_memzero(search_key, sizeof(ctx->local_grad_item)); + search_key->type = lv_grad_style_to_type(grad->style); + search_key->lv = *grad; + + lv_cache_entry_t * cache_node_entry = lv_cache_acquire(ctx->cache, &search_key, ctx); + if(cache_node_entry == NULL) { + /* check if the cache is full */ + size_t free_size = lv_cache_get_free_size(ctx->cache, NULL); + if(free_size == 0) { + LV_LOG_INFO("grad cache is full, release all pending cache entries"); + lv_vg_lite_finish(ctx->unit); + } + + cache_node_entry = lv_cache_acquire_or_create(ctx->cache, &search_key, ctx); + if(cache_node_entry == NULL) { + LV_LOG_ERROR("grad cache creating failed"); + LV_PROFILER_DRAW_END; + return NULL; + } + } + + /* Add the new entry to the pending list */ + lv_vg_lite_pending_add(ctx->pending, &cache_node_entry); + + grad_item_ref_t * grad_item_ref = lv_cache_entry_get_data(cache_node_entry); + + LV_PROFILER_DRAW_END; + return *grad_item_ref; +} + +static grad_item_t * grad_item_pool_alloc(lv_vg_lite_grad_ctx_t * ctx, grad_type_t type) +{ + LV_ASSERT_NULL(ctx); + + grad_item_t * item = lv_ll_get_head(&ctx->item_pool); + + /* Try to obtain a free node from the head */ + if(item && item->type == GRAD_TYPE_FREE) { + lv_ll_move_before(&ctx->item_pool, item, NULL); + LV_LOG_TRACE("reuse item: %p, type: %d", (void *)item, type); + } + else { + /* Allocate a new node if the pool is empty or all nodes are in use */ + item = lv_ll_ins_tail(&ctx->item_pool); + LV_ASSERT_MALLOC(item); + if(!item) { + LV_LOG_ERROR("alloc grad item failed"); + return NULL; + } + + LV_LOG_TRACE("alloc new item: %p, type: %d, pool size: %" LV_PRIu32, + (void *)item, type, lv_ll_get_len(&ctx->item_pool)); + } + + lv_memzero(item, sizeof(grad_item_t)); + item->ctx = ctx; + item->type = type; + return item; +} + +static void grad_item_pool_free(grad_item_t * item) +{ + LV_ASSERT_NULL(item); + LV_ASSERT_NULL(item->ctx); + + /* Move the free nodes to the head to ensure quick allocation */ + item->type = GRAD_TYPE_FREE; + grad_item_t * head = lv_ll_get_head(&item->ctx->item_pool); + lv_ll_move_before(&item->ctx->item_pool, item, head); +} + +static void grad_cache_release_cb(void * entry, void * user_data) +{ + lv_cache_entry_t ** entry_p = entry; + lv_cache_t * cache = user_data; + lv_cache_release(cache, * entry_p, NULL); +} + +static void convert_color_ramp(vg_lite_color_ramp_t * color_ramp, const lv_vector_gradient_t * grad) +{ + LV_ASSERT_NULL(color_ramp); + LV_ASSERT_NULL(grad); + + for(uint16_t i = 0; i < grad->stops_count; i++) { + color_ramp[i].stop = grad->stops[i].frac / 255.0f; + lv_color_t c = grad->stops[i].color; + + color_ramp[i].red = c.red / 255.0f; + color_ramp[i].green = c.green / 255.0f; + color_ramp[i].blue = c.blue / 255.0f; + color_ramp[i].alpha = grad->stops[i].opa / 255.0f; + } +} + +static bool linear_grad_create(grad_item_t * item) +{ + LV_PROFILER_DRAW_BEGIN; + + /* Capture error code from LV_VG_LITE_CHECK_ERROR */ + vg_lite_error_t err = VG_LITE_SUCCESS; + LV_VG_LITE_CHECK_ERROR( + err = vg_lite_init_grad(&item->vg.linear), { + lv_vg_lite_linear_gradient_dump_info(&item->vg.linear); + }); + + if(err != VG_LITE_SUCCESS) { + LV_PROFILER_DRAW_END; + return false; + } + + vg_lite_uint32_t colors[VLC_MAX_GRADIENT_STOPS]; + vg_lite_uint32_t stops[VLC_MAX_GRADIENT_STOPS]; + + /* Gradient setup */ + if(item->lv.stops_count > VLC_MAX_GRADIENT_STOPS) { + LV_LOG_WARN("Gradient stops limited: %d, max: %d", item->lv.stops_count, VLC_MAX_GRADIENT_STOPS); + item->lv.stops_count = VLC_MAX_GRADIENT_STOPS; + } + + for(uint16_t i = 0; i < item->lv.stops_count; i++) { + stops[i] = item->lv.stops[i].frac; + const lv_color_t * c = &item->lv.stops[i].color; + lv_opa_t opa = item->lv.stops[i].opa; + + /* lvgl color -> gradient color */ + lv_color_t grad_color = lv_color_make(c->blue, c->green, c->red); + colors[i] = lv_vg_lite_color(grad_color, opa, true); + } + + LV_VG_LITE_CHECK_ERROR( + vg_lite_set_grad(&item->vg.linear, item->lv.stops_count, colors, stops), { + lv_vg_lite_linear_gradient_dump_info(&item->vg.linear); + }); + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_update_grad"); + LV_VG_LITE_CHECK_ERROR( + vg_lite_update_grad(&item->vg.linear), { + lv_vg_lite_linear_gradient_dump_info(&item->vg.linear); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_update_grad"); + + LV_PROFILER_DRAW_END; + return true; +} + +static bool linear_ext_grad_create(grad_item_t * item, vg_lite_color_ramp_t * color_ramp) +{ + LV_PROFILER_DRAW_BEGIN; + + if(item->lv.stops_count > VLC_MAX_COLOR_RAMP_STOPS) { + LV_LOG_WARN("Gradient stops limited: %d, max: %d", item->lv.stops_count, VLC_MAX_GRADIENT_STOPS); + item->lv.stops_count = VLC_MAX_COLOR_RAMP_STOPS; + } + + const vg_lite_linear_gradient_parameter_t grad_param = { + .X0 = item->lv.x1, + .Y0 = item->lv.y1, + .X1 = item->lv.x2, + .Y1 = item->lv.y2, + }; + + convert_color_ramp(color_ramp, &item->lv); + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_set_linear_grad"); + LV_VG_LITE_CHECK_ERROR( + vg_lite_set_linear_grad( + &item->vg.linear_ext, + item->lv.stops_count, + color_ramp, + grad_param, + lv_spread_to_vg(item->lv.spread), + 1), + /* Dump parameters */ + { + lv_vg_lite_ext_linear_gradient_dump_info(&item->vg.linear_ext); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_set_linear_grad"); + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_update_linear_grad"); + vg_lite_error_t err = VG_LITE_SUCCESS; + LV_VG_LITE_CHECK_ERROR(err = vg_lite_update_linear_grad(&item->vg.linear_ext), { + lv_vg_lite_ext_linear_gradient_dump_info(&item->vg.linear_ext); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_update_linear_grad"); + + LV_PROFILER_DRAW_END; + return err == VG_LITE_SUCCESS; +} + +static bool radial_grad_create(grad_item_t * item, vg_lite_color_ramp_t * color_ramp) +{ + LV_PROFILER_DRAW_BEGIN; + + if(item->lv.stops_count > VLC_MAX_COLOR_RAMP_STOPS) { + LV_LOG_WARN("Gradient stops limited: %d, max: %d", item->lv.stops_count, VLC_MAX_GRADIENT_STOPS); + item->lv.stops_count = VLC_MAX_COLOR_RAMP_STOPS; + } + + convert_color_ramp(color_ramp, &item->lv); + + const vg_lite_radial_gradient_parameter_t grad_param = { + .cx = item->lv.cx, + .cy = item->lv.cy, + .r = item->lv.cr, + .fx = item->lv.cx, + .fy = item->lv.cy, + }; + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_set_radial_grad"); + LV_VG_LITE_CHECK_ERROR( + vg_lite_set_radial_grad( + &item->vg.radial, + item->lv.stops_count, + color_ramp, + grad_param, + lv_spread_to_vg(item->lv.spread), + 1), + /* Dump parameters */ + { + lv_vg_lite_radial_gradient_dump_info(&item->vg.radial); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_set_radial_grad"); + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_update_radial_grad"); + vg_lite_error_t err = VG_LITE_SUCCESS; + LV_VG_LITE_CHECK_ERROR(err = vg_lite_update_radial_grad(&item->vg.radial), { + lv_vg_lite_radial_gradient_dump_info(&item->vg.radial); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_update_radial_grad"); + + LV_PROFILER_DRAW_END; + return err == VG_LITE_SUCCESS; +} + +static grad_type_t lv_grad_style_to_type(lv_vector_gradient_style_t style) +{ + if(style == LV_VECTOR_GRADIENT_STYLE_LINEAR) { +#if LV_VG_LITE_DISABLE_LINEAR_GRADIENT_EXT + return GRAD_TYPE_LINEAR; +#else + return vg_lite_query_feature(gcFEATURE_BIT_VG_LINEAR_GRADIENT_EXT) ? GRAD_TYPE_LINEAR_EXT : GRAD_TYPE_LINEAR; +#endif + } + + if(style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { + return GRAD_TYPE_RADIAL; + } + + LV_LOG_WARN("unknown gradient style: %d", style); + return GRAD_TYPE_UNKNOWN; +} + +static void grad_point_to_matrix(vg_lite_matrix_t * grad_matrix, float x1, float y1, float x2, float y2) +{ + vg_lite_translate(x1, y1, grad_matrix); + + float angle = atan2f(y2 - y1, x2 - x1) * 180.0f / (float)M_PI; + vg_lite_rotate(angle, grad_matrix); + float length = sqrtf(SQUARE(x2 - x1) + SQUARE(y2 - y1)); + vg_lite_scale(length / 256.0f, 1, grad_matrix); +} + +static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread) +{ + switch(spread) { + case LV_VECTOR_GRADIENT_SPREAD_PAD: + return VG_LITE_GRADIENT_SPREAD_PAD; + case LV_VECTOR_GRADIENT_SPREAD_REPEAT: + return VG_LITE_GRADIENT_SPREAD_REPEAT; + case LV_VECTOR_GRADIENT_SPREAD_REFLECT: + return VG_LITE_GRADIENT_SPREAD_REFLECT; + default: + LV_LOG_WARN("unknown spread mode: %d", spread); + break; + } + + return VG_LITE_GRADIENT_SPREAD_FILL; +} + +static bool grad_create_cb(grad_item_ref_t * item_ref, void * user_data) +{ + LV_PROFILER_DRAW_BEGIN; + const grad_type_t type = lv_grad_style_to_type((*item_ref)->lv.style); + if(type == GRAD_TYPE_UNKNOWN) { + LV_PROFILER_DRAW_END; + return false; + } + + grad_item_t * item = grad_item_pool_alloc(user_data, type); + if(item == NULL) { + /* Should not happen */ + LV_PROFILER_DRAW_END; + return false; + } + + /* Copy key information */ + item->lv = (*item_ref)->lv; + + bool is_success = false; + + lv_vg_lite_grad_ctx_t * ctx = user_data; + LV_ASSERT_NULL(ctx); + + switch(type) { + case GRAD_TYPE_LINEAR: + is_success = linear_grad_create(item); + break; + + case GRAD_TYPE_LINEAR_EXT: + is_success = linear_ext_grad_create(item, ctx->local_color_ramp); + break; + + case GRAD_TYPE_RADIAL: + is_success = radial_grad_create(item, ctx->local_color_ramp); + break; + + default: + LV_LOG_ERROR("unknown gradient type: %d", type); + break; + } + + if(is_success) { + *item_ref = item; + } + else { + grad_item_pool_free(item); + } + + LV_PROFILER_DRAW_END; + return is_success; +} + +static void grad_free_cb(grad_item_ref_t * item_ref, void * user_data) +{ + LV_UNUSED(user_data); + LV_PROFILER_DRAW_BEGIN; + grad_item_t * item = *item_ref; + switch(item->type) { + case GRAD_TYPE_LINEAR: + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_clear_grad"); + LV_VG_LITE_CHECK_ERROR(vg_lite_clear_grad(&item->vg.linear), {}); + LV_PROFILER_DRAW_END_TAG("vg_lite_clear_grad"); + break; + + case GRAD_TYPE_LINEAR_EXT: + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_clear_linear_grad"); + LV_VG_LITE_CHECK_ERROR(vg_lite_clear_linear_grad(&item->vg.linear_ext), {}); + LV_PROFILER_DRAW_END_TAG("vg_lite_clear_linear_grad"); + break; + + case GRAD_TYPE_RADIAL: + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_clear_radial_grad"); + LV_VG_LITE_CHECK_ERROR(vg_lite_clear_radial_grad(&item->vg.radial), {}); + LV_PROFILER_DRAW_END_TAG("vg_lite_clear_radial_grad"); + break; + + default: + LV_LOG_ERROR("unknown gradient type: %d", item->type); + break; + } + + grad_item_pool_free(item); + LV_PROFILER_DRAW_END; +} + +static lv_cache_compare_res_t grad_compare_cb(const grad_item_ref_t * lhs_ref, const grad_item_ref_t * rhs_ref) +{ + const grad_item_t * lhs = *lhs_ref; + const grad_item_t * rhs = *rhs_ref; + + /* compare type first */ + if(lhs->type != rhs->type) { + return lhs->type > rhs->type ? 1 : -1; + } + + /* compare spread mode */ + if(lhs->lv.spread != rhs->lv.spread) { + return lhs->lv.spread > rhs->lv.spread ? 1 : -1; + } + + /* compare gradient parameters */ + switch(lhs->type) { + case GRAD_TYPE_LINEAR: + /* no extra compare needed */ + break; + + case GRAD_TYPE_LINEAR_EXT: + if(!math_equal(lhs->lv.x1, rhs->lv.x1)) { + return lhs->lv.x1 > rhs->lv.x1 ? 1 : -1; + } + + if(!math_equal(lhs->lv.y1, rhs->lv.y1)) { + return lhs->lv.y1 > rhs->lv.y1 ? 1 : -1; + } + + if(!math_equal(lhs->lv.x2, rhs->lv.x2)) { + return lhs->lv.x2 > rhs->lv.x2 ? 1 : -1; + } + + if(!math_equal(lhs->lv.y2, rhs->lv.y2)) { + return lhs->lv.y2 > rhs->lv.y2 ? 1 : -1; + } + break; + + case GRAD_TYPE_RADIAL: + if(!math_equal(lhs->lv.cx, rhs->lv.cx)) { + return lhs->lv.cx > rhs->lv.cx ? 1 : -1; + } + + if(!math_equal(lhs->lv.cy, rhs->lv.cy)) { + return lhs->lv.cy > rhs->lv.cy ? 1 : -1; + } + + if(!math_equal(lhs->lv.cr, rhs->lv.cr)) { + return lhs->lv.cr > rhs->lv.cr ? 1 : -1; + } + break; + + default: + LV_LOG_ERROR("unknown gradient type: %d", lhs->type); + break; + } + + /* compare stops count and stops */ + if(lhs->lv.stops_count != rhs->lv.stops_count) { + return lhs->lv.stops_count > rhs->lv.stops_count ? 1 : -1; + } + + int cmp_res = lv_memcmp(lhs->lv.stops, rhs->lv.stops, + sizeof(lv_grad_stop_t) * lhs->lv.stops_count); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + + +static void lv_vg_lite_linear_gradient_dump_info(const vg_lite_linear_gradient_t * grad) +{ + LV_LOG_USER("count: %d", (int)grad->count); + + for(vg_lite_uint32_t i = 0; i < grad->count; i++) { + LV_LOG_USER("[%d] color: 0x%08X, stop: 0x%08X", (int)i, grad->colors[i], grad->stops[i]); + } + + lv_vg_lite_matrix_dump_info(&grad->matrix); + lv_vg_lite_buffer_dump_info(&grad->image); +} + +static void lv_vg_lite_color_ramp_dump_info(const vg_lite_color_ramp_t * ramp, const vg_lite_uint32_t length) +{ + for(vg_lite_uint32_t i = 0; i < length; i++) { + LV_LOG_USER("[%d] stop: %f, red: %f, green: %f, blue: %f, alpha: %f", + (int)i, ramp[i].stop, ramp[i].red, ramp[i].green, ramp[i].blue, ramp[i].alpha); + } +} + +static void lv_vg_lite_ext_linear_gradient_dump_info(const vg_lite_ext_linear_gradient_t * grad) +{ + LV_LOG_USER("count: %d", (int)grad->count); + lv_vg_lite_matrix_dump_info(&grad->matrix); + lv_vg_lite_buffer_dump_info(&grad->image); + LV_LOG_USER("linear_grad: X0: %f, Y0: %f, X1: %f, Y1: %f", + grad->linear_grad.X0, grad->linear_grad.Y0, grad->linear_grad.X1, grad->linear_grad.Y1); + + LV_LOG_USER("ramp_length: %d", (int)grad->ramp_length); + lv_vg_lite_color_ramp_dump_info(grad->color_ramp, grad->ramp_length); + + LV_LOG_USER("converted_length: %d", (int)grad->converted_length); + lv_vg_lite_color_ramp_dump_info(grad->converted_ramp, grad->converted_length); + + LV_LOG_USER("pre_multiplied: %d", grad->pre_multiplied); + LV_LOG_USER("spread_mode: %d", (int)grad->spread_mode); +} + +static void lv_vg_lite_radial_gradient_dump_info(const vg_lite_radial_gradient_t * grad) +{ + LV_LOG_USER("count: %d", (int)grad->count); + lv_vg_lite_matrix_dump_info(&grad->matrix); + lv_vg_lite_buffer_dump_info(&grad->image); + LV_LOG_USER("radial_grad: cx: %f, cy: %f, r: %f, fx: %f, fy: %f", + grad->radial_grad.cx, grad->radial_grad.cy, grad->radial_grad.r, grad->radial_grad.fx, grad->radial_grad.fy); + + LV_LOG_USER("ramp_length: %d", (int)grad->ramp_length); + lv_vg_lite_color_ramp_dump_info(grad->color_ramp, grad->ramp_length); + + LV_LOG_USER("converted_length: %d", (int)grad->converted_length); + lv_vg_lite_color_ramp_dump_info(grad->converted_ramp, grad->converted_length); + + LV_LOG_USER("pre_multiplied: %d", grad->pre_multiplied); + LV_LOG_USER("spread_mode: %d", (int)grad->spread_mode); +} + +#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h new file mode 100644 index 0000000..c82b9ee --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h @@ -0,0 +1,114 @@ +/** + * @file lv_vg_lite_grad.h + * + */ + +#ifndef LV_VG_LITE_GRAD_H +#define LV_VG_LITE_GRAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC + +#include "lv_vg_lite_utils.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Create a gradient context + * @param cache_cnt number of cache entries + * @param unit the draw unit + */ +struct _lv_vg_lite_grad_ctx_t * lv_vg_lite_grad_ctx_create(uint32_t cache_cnt, struct _lv_draw_vg_lite_unit_t * unit); + +/** + * @brief Delete a gradient context + * @param ctx the gradient context to delete + */ +void lv_vg_lite_grad_ctx_delete(struct _lv_vg_lite_grad_ctx_t * ctx); + +/** + * @brief Get the pending list of gradient items + * @param ctx the gradient context + */ +struct _lv_vg_lite_pending_t * lv_vg_lite_grad_ctx_get_pending(struct _lv_vg_lite_grad_ctx_t * ctx); + +/** + * @brief Get the cache of gradient items + * @param ctx the gradient context + */ +struct _lv_cache_t * lv_vg_lite_grad_ctx_get_cache(struct _lv_vg_lite_grad_ctx_t * ctx); + +/** + * @brief Draw a gradient + * @param ctx the gradient context + * @param buffer the target buffer + * @param path the path to draw the gradient on + * @param grad the gradient descriptor + * @param grad_matrix the gradient matrix + * @param matrix the matrix to apply to the gradient + * @param fill the fill rule + * @param blend the blend mode + * @return true: success, false: failed + */ +bool lv_vg_lite_draw_grad( + struct _lv_vg_lite_grad_ctx_t * ctx, + vg_lite_buffer_t * buffer, + vg_lite_path_t * path, + const lv_vector_gradient_t * grad, + const vg_lite_matrix_t * grad_matrix, + const vg_lite_matrix_t * matrix, + vg_lite_fill_t fill, + vg_lite_blend_t blend); + +/** + * @brief Draw a gradient helper + * @param ctx the gradient context + * @param buffer the target buffer + * @param path the path to draw the gradient on + * @param area the area to draw the gradient on + * @param grad_dsc the gradient descriptor + * @param matrix the matrix to apply to the gradient + * @param fill the fill rule + * @param blend the blend mode + * @return true: success, false: failed + */ +bool lv_vg_lite_draw_grad_helper( + struct _lv_vg_lite_grad_ctx_t * ctx, + vg_lite_buffer_t * buffer, + vg_lite_path_t * path, + const lv_area_t * area, + const lv_grad_dsc_t * grad_dsc, + const vg_lite_matrix_t * matrix, + vg_lite_fill_t fill, + vg_lite_blend_t blend); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_GRAD_H*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_math.c b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_math.c new file mode 100644 index 0000000..0c9bd8e --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_math.c @@ -0,0 +1,56 @@ +/** + * @file lv_vg_lite_math.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_math.h" + +#if LV_USE_DRAW_VG_LITE + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +float math_fast_inv_sqrtf(float number) +{ + /* From https://en.wikipedia.org/wiki/Fast_inverse_square_root#Avoiding_undefined_behavior */ + union { + float f; + int32_t i; + } conv = { .f = number }; + conv.i = 0x5f3759df - (conv.i >> 1); + conv.f *= 1.5F - (number * 0.5F * conv.f * conv.f); + return conv.f; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_math.h b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_math.h new file mode 100644 index 0000000..e2afc79 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_math.h @@ -0,0 +1,76 @@ +/** + * @file lv_vg_lite_math.h + * + */ + +#ifndef LV_VG_LITE_MATH_H +#define LV_VG_LITE_MATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE + +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define MATH_PI 3.14159265358979323846f +#define MATH_HALF_PI 1.57079632679489661923f +#define MATH_TWO_PI 6.28318530717958647692f +#define DEG_TO_RAD 0.017453292519943295769236907684886f +#define RAD_TO_DEG 57.295779513082320876798154814105f + +#define MATH_TANF(x) tanf(x) +#define MATH_SINF(x) sinf(x) +#define MATH_COSF(x) cosf(x) +#define MATH_ASINF(x) asinf(x) +#define MATH_ACOSF(x) acosf(x) +#define MATH_FABSF(x) fabsf(x) +#define MATH_SQRTF(x) sqrtf(x) + +#define MATH_RADIANS(deg) ((deg) * DEG_TO_RAD) +#define MATH_DEGREES(rad) ((rad) * RAD_TO_DEG) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline bool math_zero(float a) +{ + return (MATH_FABSF(a) < FLT_EPSILON); +} + +static inline bool math_equal(float a, float b) +{ + return math_zero(a - b); +} + +float math_fast_inv_sqrtf(float number); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_MATH_H*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_path.c b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_path.c new file mode 100644 index 0000000..85f8a58 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_path.c @@ -0,0 +1,708 @@ +/** + * @file lv_vg_lite_path.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_path.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_math.h" + +/********************* + * DEFINES + *********************/ + +#define PATH_KAPPA 0.552284f + +/* Magic number from https://spencermortensen.com/articles/bezier-circle/ */ +#define PATH_ARC_MAGIC 0.55191502449351f + +#define PATH_MEM_SIZE_MIN 128 + +#define SIGN(x) (math_zero(x) ? 0 : ((x) > 0 ? 1 : -1)) + +#define VLC_OP_ARG_LEN(OP, LEN) \ + case VLC_OP_##OP: \ + return (LEN) + +#define PATH_CURRENT_PTR(PATH) ((uint8_t*)(PATH)->base.path + (PATH)->base.path_length) +#define PATH_LENGTH_INC(PATH, LENGTH) ((PATH)->base.path_length += (LENGTH)) + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_vg_lite_path_t { + vg_lite_path_t base; + vg_lite_matrix_t matrix; + size_t mem_size; + uint8_t format_len; + bool has_transform; +}; + +typedef struct { + float min_x; + float min_y; + float max_x; + float max_y; +} lv_vg_lite_path_bounds_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_vg_lite_path_init(struct _lv_draw_vg_lite_unit_t * unit) +{ + LV_ASSERT_NULL(unit); + unit->global_path = lv_vg_lite_path_create(VG_LITE_FP32); + unit->path_in_use = false; +} + +void lv_vg_lite_path_deinit(struct _lv_draw_vg_lite_unit_t * unit) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT(!unit->path_in_use); + lv_vg_lite_path_destroy(unit->global_path); + unit->global_path = NULL; +} + +lv_vg_lite_path_t * lv_vg_lite_path_create(vg_lite_format_t data_format) +{ + LV_PROFILER_DRAW_BEGIN; + lv_vg_lite_path_t * path = lv_malloc_zeroed(sizeof(lv_vg_lite_path_t)); + LV_ASSERT_MALLOC(path); + path->format_len = lv_vg_lite_path_format_len(data_format); + LV_ASSERT(vg_lite_init_path( + &path->base, + data_format, + VG_LITE_HIGH, + 0, + NULL, + 0, 0, 0, 0) + == VG_LITE_SUCCESS); + LV_PROFILER_DRAW_END; + return path; +} + +void lv_vg_lite_path_destroy(lv_vg_lite_path_t * path) +{ + LV_PROFILER_DRAW_BEGIN; + LV_ASSERT_NULL(path); + if(path->base.path != NULL) { + lv_free(path->base.path); + path->base.path = NULL; + + /* clear remaining path data */ + LV_VG_LITE_CHECK_ERROR(vg_lite_clear_path(&path->base), {}); + } + lv_free(path); + LV_PROFILER_DRAW_END; +} + +lv_vg_lite_path_t * lv_vg_lite_path_get(struct _lv_draw_vg_lite_unit_t * unit, vg_lite_format_t data_format) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT_NULL(unit->global_path); + LV_ASSERT(!unit->path_in_use); + lv_vg_lite_path_reset(unit->global_path, data_format); + unit->path_in_use = true; + return unit->global_path; +} + +void lv_vg_lite_path_drop(struct _lv_draw_vg_lite_unit_t * unit, lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT_NULL(path); + LV_ASSERT(unit->global_path == path); + LV_ASSERT(unit->path_in_use); + unit->path_in_use = false; +} + +void lv_vg_lite_path_reset(lv_vg_lite_path_t * path, vg_lite_format_t data_format) +{ + LV_ASSERT_NULL(path); + path->base.path_length = 0; + path->base.format = data_format; + path->base.quality = VG_LITE_HIGH; + path->base.path_type = VG_LITE_DRAW_ZERO; + path->format_len = lv_vg_lite_path_format_len(data_format); + path->has_transform = false; +} + +vg_lite_path_t * lv_vg_lite_path_get_path(lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(path); + return &path->base; +} + +void lv_vg_lite_path_set_bounding_box(lv_vg_lite_path_t * path, + float min_x, float min_y, + float max_x, float max_y) +{ + LV_ASSERT_NULL(path); + path->base.bounding_box[0] = min_x; + path->base.bounding_box[1] = min_y; + path->base.bounding_box[2] = max_x; + path->base.bounding_box[3] = max_y; +} + +void lv_vg_lite_path_set_bounding_box_area(lv_vg_lite_path_t * path, const lv_area_t * area) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(area); + lv_vg_lite_path_set_bounding_box(path, area->x1, area->y1, area->x2 + 1, area->y2 + 1); +} + +void lv_vg_lite_path_get_bounding_box(lv_vg_lite_path_t * path, + float * min_x, float * min_y, + float * max_x, float * max_y) +{ + LV_ASSERT_NULL(path); + if(min_x) *min_x = path->base.bounding_box[0]; + if(min_y) *min_y = path->base.bounding_box[1]; + if(max_x) *max_x = path->base.bounding_box[2]; + if(max_y) *max_y = path->base.bounding_box[3]; +} + +static void path_bounds_iter_cb(void * user_data, uint8_t op_code, const float * data, uint32_t len) +{ + LV_UNUSED(op_code); + + if(len == 0) { + return; + } + + typedef struct { + float x; + float y; + } point_t; + + const int pt_len = sizeof(point_t) / sizeof(float); + + LV_ASSERT(len % pt_len == 0); + + const point_t * pt = (point_t *)data; + len /= pt_len; + + lv_vg_lite_path_bounds_t * bounds = user_data; + + for(uint32_t i = 0; i < len; i++) { + if(pt[i].x < bounds->min_x) bounds->min_x = pt[i].x; + if(pt[i].y < bounds->min_y) bounds->min_y = pt[i].y; + if(pt[i].x > bounds->max_x) bounds->max_x = pt[i].x; + if(pt[i].y > bounds->max_y) bounds->max_y = pt[i].y; + } +} + +bool lv_vg_lite_path_update_bounding_box(lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(path); + + if(!path->format_len) { + return false; + } + + LV_PROFILER_DRAW_BEGIN; + + lv_vg_lite_path_bounds_t bounds; + + /* init bounds */ + bounds.min_x = FLT_MAX; + bounds.min_y = FLT_MAX; + bounds.max_x = -FLT_MAX; + bounds.max_y = -FLT_MAX; + + /* calc bounds */ + lv_vg_lite_path_for_each_data(lv_vg_lite_path_get_path(path), path_bounds_iter_cb, &bounds); + + /* set bounds */ + lv_vg_lite_path_set_bounding_box(path, bounds.min_x, bounds.min_y, bounds.max_x, bounds.max_y); + + LV_PROFILER_DRAW_END; + + return true; +} + +void lv_vg_lite_path_set_transform(lv_vg_lite_path_t * path, const vg_lite_matrix_t * matrix) +{ + LV_ASSERT_NULL(path); + if(matrix) { + path->matrix = *matrix; + } + + path->has_transform = matrix ? true : false; +} + +void lv_vg_lite_path_set_quality(lv_vg_lite_path_t * path, vg_lite_quality_t quality) +{ + LV_ASSERT_NULL(path); + path->base.quality = quality; +} + +void lv_vg_lite_path_reserve_space(lv_vg_lite_path_t * path, size_t len) +{ + bool need_reallocated = false; + + /*Calculate new mem size until match the contidion*/ + while(path->base.path_length + len > path->mem_size) { + if(path->mem_size == 0) { + path->mem_size = LV_MAX(len, PATH_MEM_SIZE_MIN); + } + else { + /* Increase memory size by 1.5 times */ + path->mem_size = path->mem_size * 3 / 2; + } + need_reallocated = true; + } + + if(!need_reallocated) { + return; + } + + path->base.path = lv_realloc(path->base.path, path->mem_size); + LV_ASSERT_MALLOC(path->base.path); +} + +static inline void lv_vg_lite_path_append_data(lv_vg_lite_path_t * path, const void * data, size_t len) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(data); + lv_vg_lite_path_reserve_space(path, len); + lv_memcpy(PATH_CURRENT_PTR(path), data, len); + PATH_LENGTH_INC(path, len); +} + +static inline void lv_vg_lite_path_append_op(lv_vg_lite_path_t * path, uint32_t op) +{ + void * ptr = PATH_CURRENT_PTR(path); + switch(path->base.format) { + case VG_LITE_FP32: + case VG_LITE_S32: + LV_VG_LITE_PATH_SET_OP_CODE(ptr, uint32_t, op); + PATH_LENGTH_INC(path, sizeof(uint32_t)); + break; + case VG_LITE_S16: + LV_VG_LITE_PATH_SET_OP_CODE(ptr, uint16_t, op); + PATH_LENGTH_INC(path, sizeof(uint16_t)); + break; + case VG_LITE_S8: + LV_VG_LITE_PATH_SET_OP_CODE(ptr, uint8_t, op); + PATH_LENGTH_INC(path, sizeof(uint8_t)); + break; + default: + LV_ASSERT_FORMAT_MSG(false, "Invalid format: %d", path->base.format); + break; + } +} + +static inline void lv_vg_lite_path_append_point(lv_vg_lite_path_t * path, float x, float y) +{ + if(path->has_transform) { + LV_VG_LITE_ASSERT_MATRIX(&path->matrix); + /* transform point */ + float ori_x = x; + float ori_y = y; + x = ori_x * path->matrix.m[0][0] + ori_y * path->matrix.m[0][1] + path->matrix.m[0][2]; + y = ori_x * path->matrix.m[1][0] + ori_y * path->matrix.m[1][1] + path->matrix.m[1][2]; + } + +#define PATH_APPEND_POINT_DATA(X, Y, TYPE) \ + do { \ + TYPE * data = ptr; \ + *data++ = (TYPE)(X); \ + *data++ = (TYPE)(Y); \ + PATH_LENGTH_INC(path, sizeof(TYPE) * 2); \ + } while(0) + + void * ptr = PATH_CURRENT_PTR(path); + switch(path->base.format) { + case VG_LITE_FP32: + PATH_APPEND_POINT_DATA(x, y, float); + break; + case VG_LITE_S32: + PATH_APPEND_POINT_DATA(x, y, int32_t); + break; + case VG_LITE_S16: + PATH_APPEND_POINT_DATA(x, y, int16_t); + break; + case VG_LITE_S8: + PATH_APPEND_POINT_DATA(x, y, int8_t); + break; + default: + LV_ASSERT_FORMAT_MSG(false, "Invalid format: %d", path->base.format); + break; + } +} + +void lv_vg_lite_path_move_to(lv_vg_lite_path_t * path, + float x, float y) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_reserve_space(path, (1 + 2) * path->format_len); + lv_vg_lite_path_append_op(path, VLC_OP_MOVE); + lv_vg_lite_path_append_point(path, x, y); +} + +void lv_vg_lite_path_line_to(lv_vg_lite_path_t * path, + float x, float y) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_reserve_space(path, (1 + 2) * path->format_len); + lv_vg_lite_path_append_op(path, VLC_OP_LINE); + lv_vg_lite_path_append_point(path, x, y); +} + +void lv_vg_lite_path_quad_to(lv_vg_lite_path_t * path, + float cx, float cy, + float x, float y) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_reserve_space(path, (1 + 4) * path->format_len); + lv_vg_lite_path_append_op(path, VLC_OP_QUAD); + lv_vg_lite_path_append_point(path, cx, cy); + lv_vg_lite_path_append_point(path, x, y); +} + +void lv_vg_lite_path_cubic_to(lv_vg_lite_path_t * path, + float cx1, float cy1, + float cx2, float cy2, + float x, float y) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_reserve_space(path, (1 + 6) * path->format_len); + lv_vg_lite_path_append_op(path, VLC_OP_CUBIC); + lv_vg_lite_path_append_point(path, cx1, cy1); + lv_vg_lite_path_append_point(path, cx2, cy2); + lv_vg_lite_path_append_point(path, x, y); +} + +void lv_vg_lite_path_close(lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(path); +#if LV_VG_LITE_DISABLE_VLC_OP_CLOSE + LV_UNUSED(path); +#else + lv_vg_lite_path_reserve_space(path, 1 * path->format_len); + lv_vg_lite_path_append_op(path, VLC_OP_CLOSE); +#endif +} + +void lv_vg_lite_path_end(lv_vg_lite_path_t * path) +{ + LV_ASSERT_NULL(path); + lv_vg_lite_path_reserve_space(path, 1 * path->format_len); + lv_vg_lite_path_append_op(path, VLC_OP_END); + path->base.add_end = 1; +} + +void lv_vg_lite_path_append_rect( + lv_vg_lite_path_t * path, + float x, float y, + float w, float h, + float r) +{ + LV_PROFILER_DRAW_BEGIN; + const float half_w = w / 2.0f; + const float half_h = h / 2.0f; + + /*clamping cornerRadius by minimum size*/ + const float r_max = LV_MIN(half_w, half_h); + if(r > r_max) + r = r_max; + + /*rectangle*/ + if(r <= 0) { + lv_vg_lite_path_move_to(path, x, y); + lv_vg_lite_path_line_to(path, x + w, y); + lv_vg_lite_path_line_to(path, x + w, y + h); + lv_vg_lite_path_line_to(path, x, y + h); + lv_vg_lite_path_close(path); + LV_PROFILER_DRAW_END; + return; + } + + /*circle*/ + if(math_equal(r, half_w) && math_equal(r, half_h)) { + lv_vg_lite_path_append_circle(path, x + half_w, y + half_h, r, r); + LV_PROFILER_DRAW_END; + return; + } + + /* Get the control point offset for rounded cases */ + const float offset = r * PATH_ARC_MAGIC; + + /* Rounded rectangle case */ + /* Starting point */ + lv_vg_lite_path_move_to(path, x + r, y); + + /* Top side */ + lv_vg_lite_path_line_to(path, x + w - r, y); + + /* Top-right corner */ + lv_vg_lite_path_cubic_to(path, x + w - r + offset, y, x + w, y + r - offset, x + w, y + r); + + /* Right side */ + lv_vg_lite_path_line_to(path, x + w, y + h - r); + + /* Bottom-right corner*/ + lv_vg_lite_path_cubic_to(path, x + w, y + h - r + offset, x + w - r + offset, y + h, x + w - r, y + h); + + /* Bottom side */ + lv_vg_lite_path_line_to(path, x + r, y + h); + + /* Bottom-left corner */ + lv_vg_lite_path_cubic_to(path, x + r - offset, y + h, x, y + h - r + offset, x, y + h - r); + + /* Left side*/ + lv_vg_lite_path_line_to(path, x, y + r); + + /* Top-left corner */ + lv_vg_lite_path_cubic_to(path, x, y + r - offset, x + r - offset, y, x + r, y); + + /* Ending point */ + lv_vg_lite_path_close(path); + LV_PROFILER_DRAW_END; +} + +void lv_vg_lite_path_append_circle( + lv_vg_lite_path_t * path, + float cx, float cy, + float rx, float ry) +{ + LV_PROFILER_DRAW_BEGIN; + /* https://learn.microsoft.com/zh-cn/xamarin/xamarin-forms/user-interface/graphics/skiasharp/curves/beziers */ + float rx_kappa = rx * PATH_KAPPA; + float ry_kappa = ry * PATH_KAPPA; + + lv_vg_lite_path_move_to(path, cx, cy - ry); + lv_vg_lite_path_cubic_to(path, cx + rx_kappa, cy - ry, cx + rx, cy - ry_kappa, cx + rx, cy); + lv_vg_lite_path_cubic_to(path, cx + rx, cy + ry_kappa, cx + rx_kappa, cy + ry, cx, cy + ry); + lv_vg_lite_path_cubic_to(path, cx - rx_kappa, cy + ry, cx - rx, cy + ry_kappa, cx - rx, cy); + lv_vg_lite_path_cubic_to(path, cx - rx, cy - ry_kappa, cx - rx_kappa, cy - ry, cx, cy - ry); + lv_vg_lite_path_close(path); + LV_PROFILER_DRAW_END; +} + +void lv_vg_lite_path_append_arc_right_angle(lv_vg_lite_path_t * path, + float start_x, float start_y, + float center_x, float center_y, + float end_x, float end_y) +{ + LV_PROFILER_DRAW_BEGIN; + float dx1 = center_x - start_x; + float dy1 = center_y - start_y; + float dx2 = end_x - center_x; + float dy2 = end_y - center_y; + + float c = SIGN(dx1 * dy2 - dx2 * dy1) * PATH_ARC_MAGIC; + + lv_vg_lite_path_cubic_to(path, + start_x - c * dy1, start_y + c * dx1, + end_x - c * dy2, end_y + c * dx2, + end_x, end_y); + LV_PROFILER_DRAW_END; +} + +void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path, + float cx, float cy, + float radius, + float start_angle, + float sweep, + bool pie) +{ + LV_PROFILER_DRAW_BEGIN; + /* just circle */ + if(sweep >= 360.0f || sweep <= -360.0f) { + lv_vg_lite_path_append_circle(path, cx, cy, radius, radius); + LV_PROFILER_DRAW_END; + return; + } + + start_angle = MATH_RADIANS(start_angle); + sweep = MATH_RADIANS(sweep); + + int n_curves = (int)ceil(MATH_FABSF(sweep / MATH_HALF_PI)); + float sweep_sign = sweep < 0 ? -1.f : 1.f; + float fract = fmodf(sweep, MATH_HALF_PI); + fract = (math_zero(fract)) ? MATH_HALF_PI * sweep_sign : fract; + + /* Start from here */ + float start_x = radius * MATH_COSF(start_angle); + float start_y = radius * MATH_SINF(start_angle); + + if(pie) { + lv_vg_lite_path_move_to(path, cx, cy); + lv_vg_lite_path_line_to(path, start_x + cx, start_y + cy); + } + + for(int i = 0; i < n_curves; ++i) { + float end_angle = start_angle + ((i != n_curves - 1) ? MATH_HALF_PI * sweep_sign : fract); + float end_x = radius * MATH_COSF(end_angle); + float end_y = radius * MATH_SINF(end_angle); + + /* variables needed to calculate bezier control points */ + + /** get bezier control points using article: + * (http://itc.ktu.lt/index.php/ITC/article/view/11812/6479) + */ + float ax = start_x; + float ay = start_y; + float bx = end_x; + float by = end_y; + float q1 = ax * ax + ay * ay; + float q2 = ax * bx + ay * by + q1; + float k2 = (4.0f / 3.0f) * ((MATH_SQRTF(2 * q1 * q2) - q2) / (ax * by - ay * bx)); + + /* Next start point is the current end point */ + start_x = end_x; + start_y = end_y; + + end_x += cx; + end_y += cy; + + float ctrl1_x = ax - k2 * ay + cx; + float ctrl1_y = ay + k2 * ax + cy; + float ctrl2_x = bx + k2 * by + cx; + float ctrl2_y = by - k2 * bx + cy; + + lv_vg_lite_path_cubic_to(path, ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, end_x, end_y); + start_angle = end_angle; + } + + if(pie) { + lv_vg_lite_path_close(path); + } + + LV_PROFILER_DRAW_END; +} + +uint8_t lv_vg_lite_vlc_op_arg_len(uint8_t vlc_op) +{ + switch(vlc_op) { + VLC_OP_ARG_LEN(END, 0); + VLC_OP_ARG_LEN(CLOSE, 0); + VLC_OP_ARG_LEN(MOVE, 2); + VLC_OP_ARG_LEN(MOVE_REL, 2); + VLC_OP_ARG_LEN(LINE, 2); + VLC_OP_ARG_LEN(LINE_REL, 2); + VLC_OP_ARG_LEN(QUAD, 4); + VLC_OP_ARG_LEN(QUAD_REL, 4); + VLC_OP_ARG_LEN(CUBIC, 6); + VLC_OP_ARG_LEN(CUBIC_REL, 6); + VLC_OP_ARG_LEN(SCCWARC, 5); + VLC_OP_ARG_LEN(SCCWARC_REL, 5); + VLC_OP_ARG_LEN(SCWARC, 5); + VLC_OP_ARG_LEN(SCWARC_REL, 5); + VLC_OP_ARG_LEN(LCCWARC, 5); + VLC_OP_ARG_LEN(LCCWARC_REL, 5); + VLC_OP_ARG_LEN(LCWARC, 5); + VLC_OP_ARG_LEN(LCWARC_REL, 5); + default: + LV_ASSERT_FORMAT_MSG(false, "Invalid op code: %d", vlc_op); + break; + } + + return 0; +} + +uint8_t lv_vg_lite_path_format_len(vg_lite_format_t format) +{ + switch(format) { + case VG_LITE_FP32: + return sizeof(float); + case VG_LITE_S32: + return sizeof(int32_t); + case VG_LITE_S16: + return sizeof(int16_t); + case VG_LITE_S8: + return sizeof(int8_t); + default: + LV_ASSERT_FORMAT_MSG(false, "Invalid format: %d", format); + break; + } + + return 0; +} + +void lv_vg_lite_path_for_each_data(const vg_lite_path_t * path, lv_vg_lite_path_iter_cb_t cb, void * user_data) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(cb); + LV_PROFILER_DRAW_BEGIN; + + uint8_t fmt_len = lv_vg_lite_path_format_len(path->format); + uint8_t * cur = path->path; + uint8_t * end = cur + path->path_length; + float tmp_data[8]; + + while(cur < end) { + /* get op code */ + uint8_t op_code = LV_VG_LITE_PATH_GET_OP_CODE(cur); + + /* get arguments length */ + uint8_t arg_len = lv_vg_lite_vlc_op_arg_len(op_code); + + /* skip op code */ + cur += fmt_len; + + /* print arguments */ + for(uint8_t i = 0; i < arg_len; i++) { + switch(path->format) { + case VG_LITE_S8: + tmp_data[i] = *((int8_t *)cur); + break; + case VG_LITE_S16: + tmp_data[i] = *((int16_t *)cur); + break; + case VG_LITE_S32: + tmp_data[i] = *((int32_t *)cur); + break; + case VG_LITE_FP32: + tmp_data[i] = *((float *)cur); + break; + default: + LV_ASSERT_FORMAT_MSG(false, "Invalid format: %d", path->format); + break; + } + + cur += fmt_len; + } + + cb(user_data, op_code, tmp_data, arg_len); + } + + LV_PROFILER_DRAW_END; +} + +void lv_vg_lite_path_append_path(lv_vg_lite_path_t * dest, const lv_vg_lite_path_t * src) +{ + LV_ASSERT_NULL(dest); + LV_ASSERT_NULL(src); + + LV_ASSERT(dest->base.format == dest->base.format); + lv_vg_lite_path_append_data(dest, src->base.path, src->base.path_length); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_path.h b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_path.h new file mode 100644 index 0000000..101b3d1 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_path.h @@ -0,0 +1,133 @@ +/** + * @file lv_vg_lite_path.h + * + */ + +#ifndef LV_VG_LITE_PATH_H +#define LV_VG_LITE_PATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_utils.h" + +#if LV_USE_DRAW_VG_LITE + +/********************* + * DEFINES + *********************/ + +#define LV_VG_LITE_PATH_SET_OP_CODE(PTR, TYPE, OP_CODE) (*((TYPE*)PTR) = (OP_CODE)) +#define LV_VG_LITE_PATH_GET_OP_CODE(PTR) (*((uint8_t*)PTR)) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_vg_lite_path_t lv_vg_lite_path_t; +struct _lv_draw_vg_lite_unit_t; + +typedef void (*lv_vg_lite_path_iter_cb_t)(void * user_data, uint8_t op_code, const float * data, uint32_t len); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_vg_lite_path_init(struct _lv_draw_vg_lite_unit_t * unit); + +void lv_vg_lite_path_deinit(struct _lv_draw_vg_lite_unit_t * unit); + +lv_vg_lite_path_t * lv_vg_lite_path_create(vg_lite_format_t data_format); + +void lv_vg_lite_path_destroy(lv_vg_lite_path_t * path); + +lv_vg_lite_path_t * lv_vg_lite_path_get(struct _lv_draw_vg_lite_unit_t * unit, vg_lite_format_t data_format); + +void lv_vg_lite_path_drop(struct _lv_draw_vg_lite_unit_t * unit, lv_vg_lite_path_t * path); + +void lv_vg_lite_path_reset(lv_vg_lite_path_t * path, vg_lite_format_t data_format); + +void lv_vg_lite_path_set_bounding_box_area(lv_vg_lite_path_t * path, const lv_area_t * area); + +void lv_vg_lite_path_set_bounding_box(lv_vg_lite_path_t * path, + float min_x, float min_y, + float max_x, float max_y); + +void lv_vg_lite_path_get_bounding_box(lv_vg_lite_path_t * path, + float * min_x, float * min_y, + float * max_x, float * max_y); + +bool lv_vg_lite_path_update_bounding_box(lv_vg_lite_path_t * path); + +void lv_vg_lite_path_set_transform(lv_vg_lite_path_t * path, const vg_lite_matrix_t * matrix); + +void lv_vg_lite_path_set_quality(lv_vg_lite_path_t * path, vg_lite_quality_t quality); + +vg_lite_path_t * lv_vg_lite_path_get_path(lv_vg_lite_path_t * path); + +void lv_vg_lite_path_reserve_space(lv_vg_lite_path_t * path, size_t len); + +void lv_vg_lite_path_move_to(lv_vg_lite_path_t * path, + float x, float y); + +void lv_vg_lite_path_line_to(lv_vg_lite_path_t * path, + float x, float y); + +void lv_vg_lite_path_quad_to(lv_vg_lite_path_t * path, + float cx, float cy, + float x, float y); + +void lv_vg_lite_path_cubic_to(lv_vg_lite_path_t * path, + float cx1, float cy1, + float cx2, float cy2, + float x, float y); + +void lv_vg_lite_path_close(lv_vg_lite_path_t * path); + +void lv_vg_lite_path_end(lv_vg_lite_path_t * path); + +void lv_vg_lite_path_append_rect(lv_vg_lite_path_t * path, + float x, float y, + float w, float h, + float r); + +void lv_vg_lite_path_append_circle(lv_vg_lite_path_t * path, + float cx, float cy, + float rx, float ry); + +void lv_vg_lite_path_append_arc_right_angle(lv_vg_lite_path_t * path, + float start_x, float start_y, + float center_x, float center_y, + float end_x, float end_y); + +void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path, + float cx, float cy, + float radius, + float start_angle, + float sweep, + bool pie); + +void lv_vg_lite_path_append_path(lv_vg_lite_path_t * dest, const lv_vg_lite_path_t * src); + +uint8_t lv_vg_lite_vlc_op_arg_len(uint8_t vlc_op); + +uint8_t lv_vg_lite_path_format_len(vg_lite_format_t format); + +void lv_vg_lite_path_for_each_data(const vg_lite_path_t * path, lv_vg_lite_path_iter_cb_t cb, void * user_data); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_PATH_H*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_pending.c b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_pending.c new file mode 100644 index 0000000..8bf5a3f --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_pending.c @@ -0,0 +1,122 @@ +/** + * @file lv_vg_lite_pending.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_pending.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_array.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_vg_lite_pending_t { + lv_array_t * arr_act; + lv_array_t arr_1; + lv_array_t arr_2; + lv_vg_lite_pending_free_cb_t free_cb; + void * user_data; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline void lv_vg_lite_pending_array_clear(lv_vg_lite_pending_t * pending, lv_array_t * arr); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_vg_lite_pending_t * lv_vg_lite_pending_create(size_t obj_size, uint32_t capacity_default) +{ + lv_vg_lite_pending_t * pending = lv_malloc_zeroed(sizeof(lv_vg_lite_pending_t)); + LV_ASSERT_MALLOC(pending); + lv_array_init(&pending->arr_1, capacity_default, obj_size); + lv_array_init(&pending->arr_2, capacity_default, obj_size); + pending->arr_act = &pending->arr_1; + return pending; +} + +void lv_vg_lite_pending_destroy(lv_vg_lite_pending_t * pending) +{ + LV_ASSERT_NULL(pending); + lv_vg_lite_pending_remove_all(pending); + lv_array_deinit(&pending->arr_1); + lv_array_deinit(&pending->arr_2); + lv_memzero(pending, sizeof(lv_vg_lite_pending_t)); + lv_free(pending); +} + +void lv_vg_lite_pending_set_free_cb(lv_vg_lite_pending_t * pending, lv_vg_lite_pending_free_cb_t free_cb, + void * user_data) +{ + LV_ASSERT_NULL(pending); + LV_ASSERT_NULL(free_cb); + pending->free_cb = free_cb; + pending->user_data = user_data; +} + +void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj) +{ + LV_ASSERT_NULL(pending); + LV_ASSERT_NULL(obj); + lv_array_push_back(pending->arr_act, obj); +} + +void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending) +{ + LV_ASSERT_NULL(pending); + + lv_vg_lite_pending_array_clear(pending, &pending->arr_1); + lv_vg_lite_pending_array_clear(pending, &pending->arr_2); +} + +void lv_vg_lite_pending_swap(lv_vg_lite_pending_t * pending) +{ + pending->arr_act = (pending->arr_act == &pending->arr_1) ? &pending->arr_2 : &pending->arr_1; + lv_vg_lite_pending_array_clear(pending, pending->arr_act); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void lv_vg_lite_pending_array_clear(lv_vg_lite_pending_t * pending, lv_array_t * arr) +{ + LV_ASSERT_NULL(pending->free_cb); + + uint32_t size = lv_array_size(arr); + if(size == 0) { + return; + } + + /* remove all the pending objects */ + for(uint32_t i = 0; i < size; i++) { + pending->free_cb(lv_array_at(arr, i), pending->user_data); + } + + lv_array_clear(arr); +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h new file mode 100644 index 0000000..feb74c1 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h @@ -0,0 +1,89 @@ +/** + * @file lv_vg_lite_pending.h + * + */ + +#ifndef LV_VG_LITE_PENDING_H +#define LV_VG_LITE_PENDING_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../misc/lv_types.h" + +#if LV_USE_DRAW_VG_LITE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_vg_lite_pending_t lv_vg_lite_pending_t; + +typedef void (*lv_vg_lite_pending_free_cb_t)(void * obj, void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a pending list + * @param obj_size the size of the objects in the list + * @param capacity_default the default capacity of the list + * @return a pointer to the pending list + */ +lv_vg_lite_pending_t * lv_vg_lite_pending_create(size_t obj_size, uint32_t capacity_default); + +/** + * Destroy a pending list + * @param pending pointer to the pending list + */ +void lv_vg_lite_pending_destroy(lv_vg_lite_pending_t * pending); + +/** + * Set a free callback for the pending list + * @param pending pointer to the pending list + * @param free_cb the free callback + * @param user_data user data to pass to the free callback + */ +void lv_vg_lite_pending_set_free_cb(lv_vg_lite_pending_t * pending, lv_vg_lite_pending_free_cb_t free_cb, + void * user_data); + +/** + * Add an object to the pending list + * @param pending pointer to the pending list + * @param obj pointer to the object to add + */ +void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj); + +/** + * Remove all objects from the active pending list + * @param pending pointer to the pending list + */ +void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending); + +/** + * Remove all old objects reference and swap new objects reference + * @param pending pointer to the pending list + */ +void lv_vg_lite_pending_swap(lv_vg_lite_pending_t * pending); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_PENDING_H*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_stroke.c b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_stroke.c new file mode 100644 index 0000000..89f2091 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_stroke.c @@ -0,0 +1,396 @@ +/** + * @file lv_vg_lite_stroke.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_stroke.h" + +#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_path.h" +#include "../lv_draw_vector_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + + +/** + * Since the key-value data structure of lv_cache is integrated, the kv data structure + * will be saved at the same time when the cache is successfully created. + * In order to pursue efficiency during the matching process, the primary key (lv) used for matching + * will not dup the dash_pattern secondary pointer, so when the creation is successful, dash_pattern needs + * to be dup to the child key (vg), so type is added here to distinguish where the real data of dash_pattern exists. + */ +typedef enum { + DASH_PATTERN_TYPE_LV, + DASH_PATTERN_TYPE_VG +} dash_pattern_type_t; + +typedef struct { + dash_pattern_type_t dash_pattern_type; + + struct { + /* path data */ + lv_vg_lite_path_t * path; + + /* stroke parameters */ + float width; + lv_vector_stroke_cap_t cap; + lv_vector_stroke_join_t join; + uint16_t miter_limit; + lv_array_t dash_pattern; + } lv; + + struct { + /* stroke path */ + lv_vg_lite_path_t * path; + + /* dash pattern, for comparison only */ + lv_array_t dash_pattern; + } vg; +} stroke_item_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool stroke_create_cb(stroke_item_t * item, void * user_data); +static void stroke_free_cb(stroke_item_t * item, void * user_data); +static lv_cache_compare_res_t stroke_compare_cb(const stroke_item_t * lhs, const stroke_item_t * rhs); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_vg_lite_stroke_init(struct _lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt) +{ + LV_ASSERT_NULL(unit); + + const lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)stroke_compare_cb, + .create_cb = (lv_cache_create_cb_t)stroke_create_cb, + .free_cb = (lv_cache_free_cb_t)stroke_free_cb, + }; + + unit->stroke_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(stroke_item_t), cache_cnt, ops); + lv_cache_set_name(unit->stroke_cache, "VG_STROKE"); +} + +void lv_vg_lite_stroke_deinit(struct _lv_draw_vg_lite_unit_t * unit) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT_NULL(unit->stroke_cache); + lv_cache_destroy(unit->stroke_cache, NULL); + unit->stroke_cache = NULL; +} + +static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap) +{ + switch(cap) { + case LV_VECTOR_STROKE_CAP_SQUARE: + return VG_LITE_CAP_SQUARE; + case LV_VECTOR_STROKE_CAP_ROUND: + return VG_LITE_CAP_ROUND; + case LV_VECTOR_STROKE_CAP_BUTT: + return VG_LITE_CAP_BUTT; + default: + return VG_LITE_CAP_SQUARE; + } +} + +static vg_lite_join_style_t lv_stroke_join_to_vg(lv_vector_stroke_join_t join) +{ + switch(join) { + case LV_VECTOR_STROKE_JOIN_BEVEL: + return VG_LITE_JOIN_BEVEL; + case LV_VECTOR_STROKE_JOIN_ROUND: + return VG_LITE_JOIN_ROUND; + case LV_VECTOR_STROKE_JOIN_MITER: + return VG_LITE_JOIN_MITER; + default: + return VG_LITE_JOIN_BEVEL; + } +} + +lv_cache_entry_t * lv_vg_lite_stroke_get(struct _lv_draw_vg_lite_unit_t * unit, + struct _lv_vg_lite_path_t * path, + const lv_vector_stroke_dsc_t * dsc) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(dsc); + + vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(path); + + if(vg_path->format != VG_LITE_FP32) { + LV_LOG_ERROR("only support VG_LITE_FP32 format"); + return NULL; + } + + /* prepare search key */ + stroke_item_t search_key; + lv_memzero(&search_key, sizeof(search_key)); + search_key.lv.cap = dsc->cap; + search_key.lv.join = dsc->join; + search_key.lv.width = dsc->width; + search_key.lv.miter_limit = dsc->miter_limit; + + /* A one-time read-only array that only copies the pointer but not the content */ + search_key.lv.dash_pattern = dsc->dash_pattern; + search_key.lv.path = path; + + lv_cache_entry_t * cache_node_entry = lv_cache_acquire(unit->stroke_cache, &search_key, NULL); + if(cache_node_entry) { + return cache_node_entry; + } + + cache_node_entry = lv_cache_acquire_or_create(unit->stroke_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + LV_LOG_ERROR("stroke cache creating failed"); + return NULL; + } + + return cache_node_entry; +} + +struct _lv_vg_lite_path_t * lv_vg_lite_stroke_get_path(lv_cache_entry_t * cache_entry) +{ + LV_ASSERT_NULL(cache_entry); + + stroke_item_t * stroke_item = lv_cache_entry_get_data(cache_entry); + LV_ASSERT_NULL(stroke_item); + + if(lv_array_size(&stroke_item->vg.dash_pattern)) { + /* check if dash pattern must be duped */ + LV_ASSERT(stroke_item->dash_pattern_type == DASH_PATTERN_TYPE_VG); + } + + return stroke_item->vg.path; +} + +void lv_vg_lite_stroke_drop(struct _lv_draw_vg_lite_unit_t * unit, + lv_cache_entry_t * cache_entry) +{ + LV_ASSERT_NULL(unit); + LV_ASSERT_NULL(cache_entry); + lv_cache_release(unit->stroke_cache, cache_entry, NULL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool stroke_create_cb(stroke_item_t * item, void * user_data) +{ + LV_UNUSED(user_data); + LV_ASSERT_NULL(item); + + /* Check if stroke width is valid */ + if(item->lv.width <= 0) { + LV_LOG_WARN("stroke width error: %f", item->lv.width); + return false; + } + + /* Reset the dash pattern type */ + item->dash_pattern_type = DASH_PATTERN_TYPE_LV; + + /* dup the path */ + item->vg.path = lv_vg_lite_path_create(VG_LITE_FP32); + lv_vg_lite_path_append_path(item->vg.path, item->lv.path); + + /* dup the dash pattern */ + vg_lite_float_t * vg_dash_pattern = NULL; + const uint32_t size = lv_array_size(&item->lv.dash_pattern); + if(size) { + /* Only support float dash pattern */ + LV_ASSERT(item->lv.dash_pattern.element_size == sizeof(float)); + lv_array_init(&item->vg.dash_pattern, size, sizeof(float)); + lv_array_copy(&item->vg.dash_pattern, &item->lv.dash_pattern); + + /* mark dash pattern has been duped */ + item->dash_pattern_type = DASH_PATTERN_TYPE_VG; + vg_dash_pattern = lv_array_front(&item->vg.dash_pattern); + LV_ASSERT_NULL(vg_dash_pattern); + } + + /* update parameters */ + vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(item->vg.path); + LV_VG_LITE_CHECK_ERROR(vg_lite_set_path_type(vg_path, VG_LITE_DRAW_STROKE_PATH), {}); + + vg_lite_error_t err = VG_LITE_SUCCESS; + LV_VG_LITE_CHECK_ERROR( + err = vg_lite_set_stroke( + vg_path, + lv_stroke_cap_to_vg(item->lv.cap), + lv_stroke_join_to_vg(item->lv.join), + item->lv.width, + item->lv.miter_limit, + vg_dash_pattern, + size, + item->lv.width / 2, + 0), + /* Dump parameters */ + { + lv_vg_lite_path_dump_info(vg_path); + LV_LOG_USER("Cap: 0x%X", (int)lv_stroke_cap_to_vg(item->lv.cap)); + LV_LOG_USER("Join: 0x%X", (int)lv_stroke_join_to_vg(item->lv.join)); + LV_LOG_USER("Width: %f", item->lv.width); + LV_LOG_USER("Miter limit: %d", item->lv.miter_limit); + if(vg_dash_pattern) + { + for(uint32_t i = 0; i < size; i++) { + LV_LOG_USER("Dash pattern[%" LV_PRIu32 "]: %f", i, vg_dash_pattern[i]); + } + } + }); + + if(err != VG_LITE_SUCCESS) { + stroke_free_cb(item, NULL); + return false; + } + + const vg_lite_pointer * ori_path = vg_path->path; + const vg_lite_uint32_t ori_path_length = vg_path->path_length; + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_update_stroke"); + LV_VG_LITE_CHECK_ERROR(err = vg_lite_update_stroke(vg_path), { + lv_vg_lite_path_dump_info(vg_path); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_update_stroke"); + + /* check if path is changed */ + LV_ASSERT_MSG(vg_path->path_length == ori_path_length, "vg_path->path_length should not change"); + LV_ASSERT_MSG(vg_path->path == ori_path, "vg_path->path should not change"); + + if(err != VG_LITE_SUCCESS) { + stroke_free_cb(item, NULL); + return false; + } + + return true; +} + +static void stroke_free_cb(stroke_item_t * item, void * user_data) +{ + LV_UNUSED(user_data); + LV_ASSERT_NULL(item); + + if(item->vg.path) { + lv_vg_lite_path_destroy(item->vg.path); + item->vg.path = NULL; + } + + if(item->dash_pattern_type == DASH_PATTERN_TYPE_VG) { + lv_array_deinit(&item->vg.dash_pattern); + item->dash_pattern_type = DASH_PATTERN_TYPE_LV; + } +} + +static lv_cache_compare_res_t dash_pattern_compare(const stroke_item_t * lhs, const stroke_item_t * rhs) +{ + /* Select the dash pattern to compare */ + const lv_array_t * lhs_dash_pattern = lhs->dash_pattern_type == DASH_PATTERN_TYPE_LV ? + &lhs->lv.dash_pattern : + &lhs->vg.dash_pattern; + const lv_array_t * rhs_dash_pattern = rhs->dash_pattern_type == DASH_PATTERN_TYPE_LV ? + &rhs->lv.dash_pattern : + &rhs->vg.dash_pattern; + + const uint32_t lhs_dash_pattern_size = lv_array_size(lhs_dash_pattern); + const uint32_t rhs_dash_pattern_size = lv_array_size(rhs_dash_pattern); + + if(lhs_dash_pattern_size != rhs_dash_pattern_size) { + return lhs_dash_pattern_size > rhs_dash_pattern_size ? 1 : -1; + } + + if(lhs_dash_pattern_size == 0 && rhs_dash_pattern_size == 0) { + return 0; + } + + /* Both dash pattern has the same size, compare them */ + LV_ASSERT(lhs_dash_pattern->element_size == sizeof(float)); + LV_ASSERT(rhs_dash_pattern->element_size == sizeof(float)); + + /* compare dash pattern data */ + int cmp_res = lv_memcmp( + lv_array_front(lhs_dash_pattern), + lv_array_front(rhs_dash_pattern), + lhs_dash_pattern_size * sizeof(float)); + + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + +static lv_cache_compare_res_t path_compare(const stroke_item_t * lhs, const stroke_item_t * rhs) +{ + /* Give priority to using dup vg.path */ + const vg_lite_path_t * lhs_path = lhs->vg.path ? + lv_vg_lite_path_get_path(lhs->vg.path) : + lv_vg_lite_path_get_path(lhs->lv.path); + const vg_lite_path_t * rhs_path = rhs->vg.path ? + lv_vg_lite_path_get_path(rhs->vg.path) : + lv_vg_lite_path_get_path(rhs->lv.path); + + LV_ASSERT(lhs_path->format == VG_LITE_FP32); + LV_ASSERT(rhs_path->format == VG_LITE_FP32); + + if(lhs_path->path_length != rhs_path->path_length) { + return lhs_path->path_length > rhs_path->path_length ? 1 : -1; + } + + int cmp_res = lv_memcmp(lhs_path->path, rhs_path->path, lhs_path->path_length); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + +static lv_cache_compare_res_t stroke_compare_cb(const stroke_item_t * lhs, const stroke_item_t * rhs) +{ + if(lhs->lv.width != rhs->lv.width) { + return lhs->lv.width > rhs->lv.width ? 1 : -1; + } + + if(lhs->lv.cap != rhs->lv.cap) { + return lhs->lv.cap > rhs->lv.cap ? 1 : -1; + } + + if(lhs->lv.join != rhs->lv.join) { + return lhs->lv.join > rhs->lv.join ? 1 : -1; + } + + if(lhs->lv.miter_limit != rhs->lv.miter_limit) { + return lhs->lv.miter_limit > rhs->lv.miter_limit ? 1 : -1; + } + + lv_cache_compare_res_t dash_pattern_res = dash_pattern_compare(lhs, rhs); + if(dash_pattern_res != 0) { + return dash_pattern_res; + } + + return path_compare(lhs, rhs); +} + +#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_stroke.h b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_stroke.h new file mode 100644 index 0000000..81c7e51 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_stroke.h @@ -0,0 +1,84 @@ +/** + * @file lv_vg_lite_stroke.h + * + */ + +#ifndef LV_VG_LITE_STROKE_H +#define LV_VG_LITE_STROKE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_utils.h" + +#if LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_vg_lite_path_t; + +struct _lv_draw_vg_lite_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the stroke module + * @param unit pointer to the unit + */ +void lv_vg_lite_stroke_init(struct _lv_draw_vg_lite_unit_t * unit, uint32_t cache_cnt); + +/** + * Deinitialize the stroke module + * @param unit pointer to the unit + */ +void lv_vg_lite_stroke_deinit(struct _lv_draw_vg_lite_unit_t * unit); + +/** + * Get the stroke cache entry + * @param unit pointer to the unit + * @param path pointer to the path + * @param dsc pointer to the stroke descriptor + * @return pointer to the stroke cache entry + */ +lv_cache_entry_t * lv_vg_lite_stroke_get(struct _lv_draw_vg_lite_unit_t * unit, + struct _lv_vg_lite_path_t * path, + const lv_vector_stroke_dsc_t * dsc); + +/** + * Get the path of a stroke + * @param cache_entry pointer to the stroke cache entry + * @return pointer to the path + */ +struct _lv_vg_lite_path_t * lv_vg_lite_stroke_get_path(lv_cache_entry_t * cache_entry); + +/** + * Drop the stroke cache entry + * @param unit pointer to the unit + * @param stroke pointer to the stroke + */ +void lv_vg_lite_stroke_drop(struct _lv_draw_vg_lite_unit_t * unit, lv_cache_entry_t * cache_entry); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_STROKE_H*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c new file mode 100644 index 0000000..ab7f556 --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c @@ -0,0 +1,1466 @@ +/** + * @file lv_vg_lite_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_vg_lite_utils.h" + +#if LV_USE_DRAW_VG_LITE + +#include "lv_draw_vg_lite_type.h" +#include "lv_vg_lite_decoder.h" +#include "lv_vg_lite_path.h" +#include "lv_vg_lite_pending.h" +#include "lv_vg_lite_grad.h" +#include "../../misc/lv_area_private.h" +#include "../../display/lv_display.h" +#include "../../draw/lv_draw_image.h" +#include "../lv_image_decoder_private.h" +#include + +/********************* + * DEFINES + *********************/ + +#define ENUM_TO_STRING(e) \ + case (e): \ + return #e + +#define VG_LITE_ENUM_TO_STRING(e) \ + case (VG_LITE_##e): \ + return #e + +#define VLC_OP_ENUM_TO_STRING(e) \ + case (VLC_OP_##e): \ + return #e + +#define FEATURE_ENUM_TO_STRING(e) \ + case (gcFEATURE_BIT_VG_##e): \ + return #e + +#define LV_VG_LITE_IMAGE_FLAGS_TILED LV_IMAGE_FLAGS_USER1 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void image_dsc_free_cb(void * dsc, void * user_data); + +/********************** + * STATIC VARIABLES + **********************/ + +static bool g_is_dump_param_enabled = false; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_vg_lite_dump_info(void) +{ + char name[64]; + vg_lite_uint32_t chip_id; + vg_lite_uint32_t chip_rev; + vg_lite_uint32_t cid; + vg_lite_get_product_info(name, &chip_id, &chip_rev); + vg_lite_get_register(0x30, &cid); + LV_LOG_USER("Product Info: %s" + " | Chip ID: 0x%" LV_PRIx32 + " | Revision: 0x%" LV_PRIx32 + " | CID: 0x%" LV_PRIx32, + name, (uint32_t)chip_id, (uint32_t)chip_rev, (uint32_t)cid); + + vg_lite_info_t info; + vg_lite_get_info(&info); + LV_LOG_USER("VGLite API version: 0x%" LV_PRIx32, (uint32_t)info.api_version); + LV_LOG_USER("VGLite API header version: 0x%" LV_PRIx32, (uint32_t)info.header_version); + LV_LOG_USER("VGLite release version: 0x%" LV_PRIx32, (uint32_t)info.release_version); + + for(int feature = 0; feature < gcFEATURE_COUNT; feature++) { + vg_lite_uint32_t ret = vg_lite_query_feature((vg_lite_feature_t)feature); + LV_UNUSED(ret); + LV_LOG_USER("Feature-%d: %s\t - %s", + feature, lv_vg_lite_feature_string((vg_lite_feature_t)feature), + ret ? "YES" : "NO"); + } + + vg_lite_uint32_t mem_size = 0; + vg_lite_get_mem_size(&mem_size); + LV_LOG_USER("Memory size: %" LV_PRId32 " Bytes", (uint32_t)mem_size); +} + +void lv_vg_lite_error_dump_info(vg_lite_error_t error) +{ + LV_LOG_USER("Error code: %d(%s)", (int)error, lv_vg_lite_error_string(error)); + switch(error) { + case VG_LITE_SUCCESS: + LV_LOG_USER("No error"); + break; + + case VG_LITE_NOT_ALIGNED: + case VG_LITE_INVALID_ARGUMENT: + break; + + case VG_LITE_OUT_OF_MEMORY: + case VG_LITE_OUT_OF_RESOURCES: { + vg_lite_uint32_t mem_size = 0; + vg_lite_error_t ret = vg_lite_get_mem_size(&mem_size); + if(ret != VG_LITE_SUCCESS) { + LV_LOG_ERROR("vg_lite_get_mem_size error: %d(%s)", + (int)ret, lv_vg_lite_error_string(ret)); + return; + } + + LV_LOG_USER("Memory size: %" LV_PRId32 " Bytes", (uint32_t)mem_size); + } + break; + + case VG_LITE_TIMEOUT: + case VG_LITE_FLEXA_TIME_OUT: { + vg_lite_error_t ret = vg_lite_dump_command_buffer(); + if(ret != VG_LITE_SUCCESS) { + LV_LOG_ERROR("vg_lite_dump_command_buffer error: %d(%s)", + (int)ret, lv_vg_lite_error_string(ret)); + return; + } + + LV_LOG_USER("Command buffer finished"); + } + break; + + default: + lv_vg_lite_dump_info(); + break; + } +} + +const char * lv_vg_lite_error_string(vg_lite_error_t error) +{ + switch(error) { + VG_LITE_ENUM_TO_STRING(SUCCESS); + VG_LITE_ENUM_TO_STRING(INVALID_ARGUMENT); + VG_LITE_ENUM_TO_STRING(OUT_OF_MEMORY); + VG_LITE_ENUM_TO_STRING(NO_CONTEXT); + VG_LITE_ENUM_TO_STRING(TIMEOUT); + VG_LITE_ENUM_TO_STRING(OUT_OF_RESOURCES); + VG_LITE_ENUM_TO_STRING(GENERIC_IO); + VG_LITE_ENUM_TO_STRING(NOT_SUPPORT); + VG_LITE_ENUM_TO_STRING(ALREADY_EXISTS); + VG_LITE_ENUM_TO_STRING(NOT_ALIGNED); + VG_LITE_ENUM_TO_STRING(FLEXA_TIME_OUT); + VG_LITE_ENUM_TO_STRING(FLEXA_HANDSHAKE_FAIL); + default: + break; + } + return "UNKNOWN_ERROR"; +} + +const char * lv_vg_lite_feature_string(vg_lite_feature_t feature) +{ + switch(feature) { + FEATURE_ENUM_TO_STRING(IM_INDEX_FORMAT); + FEATURE_ENUM_TO_STRING(SCISSOR); + FEATURE_ENUM_TO_STRING(BORDER_CULLING); + FEATURE_ENUM_TO_STRING(RGBA2_FORMAT); + FEATURE_ENUM_TO_STRING(QUALITY_8X); + FEATURE_ENUM_TO_STRING(IM_FASTCLAER); + FEATURE_ENUM_TO_STRING(RADIAL_GRADIENT); + FEATURE_ENUM_TO_STRING(GLOBAL_ALPHA); + FEATURE_ENUM_TO_STRING(RGBA8_ETC2_EAC); + FEATURE_ENUM_TO_STRING(COLOR_KEY); + FEATURE_ENUM_TO_STRING(DOUBLE_IMAGE); + FEATURE_ENUM_TO_STRING(YUV_OUTPUT); + FEATURE_ENUM_TO_STRING(FLEXA); + FEATURE_ENUM_TO_STRING(24BIT); + FEATURE_ENUM_TO_STRING(DITHER); + FEATURE_ENUM_TO_STRING(USE_DST); + FEATURE_ENUM_TO_STRING(PE_CLEAR); + FEATURE_ENUM_TO_STRING(IM_INPUT); + FEATURE_ENUM_TO_STRING(DEC_COMPRESS); + FEATURE_ENUM_TO_STRING(LINEAR_GRADIENT_EXT); + FEATURE_ENUM_TO_STRING(MASK); + FEATURE_ENUM_TO_STRING(MIRROR); + FEATURE_ENUM_TO_STRING(GAMMA); + FEATURE_ENUM_TO_STRING(NEW_BLEND_MODE); + FEATURE_ENUM_TO_STRING(STENCIL); + FEATURE_ENUM_TO_STRING(SRC_PREMULTIPLIED); /*! Valid only if FEATURE_ENUM_TO_STRING(HW_PREMULTIPLY is 0 */ + FEATURE_ENUM_TO_STRING(HW_PREMULTIPLY); /*! HW multiplier can accept either premultiplied or not */ + FEATURE_ENUM_TO_STRING(COLOR_TRANSFORMATION); + FEATURE_ENUM_TO_STRING(LVGL_SUPPORT); + FEATURE_ENUM_TO_STRING(INDEX_ENDIAN); + FEATURE_ENUM_TO_STRING(24BIT_PLANAR); + FEATURE_ENUM_TO_STRING(PIXEL_MATRIX); + FEATURE_ENUM_TO_STRING(NEW_IMAGE_INDEX); + FEATURE_ENUM_TO_STRING(PARALLEL_PATHS); + FEATURE_ENUM_TO_STRING(STRIPE_MODE); + FEATURE_ENUM_TO_STRING(IM_DEC_INPUT); + FEATURE_ENUM_TO_STRING(GAUSSIAN_BLUR); + FEATURE_ENUM_TO_STRING(RECTANGLE_TILED_OUT); + FEATURE_ENUM_TO_STRING(TESSELLATION_TILED_OUT); + FEATURE_ENUM_TO_STRING(IM_REPEAT_REFLECT); + FEATURE_ENUM_TO_STRING(YUY2_INPUT); + FEATURE_ENUM_TO_STRING(YUV_INPUT); + FEATURE_ENUM_TO_STRING(YUV_TILED_INPUT); + FEATURE_ENUM_TO_STRING(AYUV_INPUT); + FEATURE_ENUM_TO_STRING(16PIXELS_ALIGN); + FEATURE_ENUM_TO_STRING(DEC_COMPRESS_2_0); + default: + break; + } + return "UNKNOWN_FEATURE"; +} + +const char * lv_vg_lite_buffer_format_string(vg_lite_buffer_format_t format) +{ + switch(format) { + VG_LITE_ENUM_TO_STRING(RGBA8888); + VG_LITE_ENUM_TO_STRING(BGRA8888); + VG_LITE_ENUM_TO_STRING(RGBX8888); + VG_LITE_ENUM_TO_STRING(BGRX8888); + VG_LITE_ENUM_TO_STRING(RGB565); + VG_LITE_ENUM_TO_STRING(BGR565); + VG_LITE_ENUM_TO_STRING(RGBA4444); + VG_LITE_ENUM_TO_STRING(BGRA4444); + VG_LITE_ENUM_TO_STRING(BGRA5551); + VG_LITE_ENUM_TO_STRING(A4); + VG_LITE_ENUM_TO_STRING(A8); + VG_LITE_ENUM_TO_STRING(L8); + VG_LITE_ENUM_TO_STRING(YUYV); + VG_LITE_ENUM_TO_STRING(YUY2); + VG_LITE_ENUM_TO_STRING(NV12); + VG_LITE_ENUM_TO_STRING(ANV12); + VG_LITE_ENUM_TO_STRING(AYUY2); + VG_LITE_ENUM_TO_STRING(YV12); + VG_LITE_ENUM_TO_STRING(YV24); + VG_LITE_ENUM_TO_STRING(YV16); + VG_LITE_ENUM_TO_STRING(NV16); + VG_LITE_ENUM_TO_STRING(YUY2_TILED); + VG_LITE_ENUM_TO_STRING(NV12_TILED); + VG_LITE_ENUM_TO_STRING(ANV12_TILED); + VG_LITE_ENUM_TO_STRING(AYUY2_TILED); + VG_LITE_ENUM_TO_STRING(INDEX_1); + VG_LITE_ENUM_TO_STRING(INDEX_2); + VG_LITE_ENUM_TO_STRING(INDEX_4); + VG_LITE_ENUM_TO_STRING(INDEX_8); + VG_LITE_ENUM_TO_STRING(RGBA2222); + VG_LITE_ENUM_TO_STRING(BGRA2222); + VG_LITE_ENUM_TO_STRING(ABGR2222); + VG_LITE_ENUM_TO_STRING(ARGB2222); + VG_LITE_ENUM_TO_STRING(ABGR4444); + VG_LITE_ENUM_TO_STRING(ARGB4444); + VG_LITE_ENUM_TO_STRING(ABGR8888); + VG_LITE_ENUM_TO_STRING(ARGB8888); + VG_LITE_ENUM_TO_STRING(ABGR1555); + VG_LITE_ENUM_TO_STRING(RGBA5551); + VG_LITE_ENUM_TO_STRING(ARGB1555); + VG_LITE_ENUM_TO_STRING(XBGR8888); + VG_LITE_ENUM_TO_STRING(XRGB8888); + VG_LITE_ENUM_TO_STRING(RGBA8888_ETC2_EAC); + VG_LITE_ENUM_TO_STRING(RGB888); + VG_LITE_ENUM_TO_STRING(BGR888); + VG_LITE_ENUM_TO_STRING(ABGR8565); + VG_LITE_ENUM_TO_STRING(BGRA5658); + VG_LITE_ENUM_TO_STRING(ARGB8565); + VG_LITE_ENUM_TO_STRING(RGBA5658); + default: + break; + } + return "UNKNOWN_BUFFER_FORMAT"; +} + +const char * lv_vg_lite_vlc_op_string(uint8_t vlc_op) +{ + switch(vlc_op) { + VLC_OP_ENUM_TO_STRING(END); + VLC_OP_ENUM_TO_STRING(CLOSE); + VLC_OP_ENUM_TO_STRING(MOVE); + VLC_OP_ENUM_TO_STRING(MOVE_REL); + VLC_OP_ENUM_TO_STRING(LINE); + VLC_OP_ENUM_TO_STRING(LINE_REL); + VLC_OP_ENUM_TO_STRING(QUAD); + VLC_OP_ENUM_TO_STRING(QUAD_REL); + VLC_OP_ENUM_TO_STRING(CUBIC); + VLC_OP_ENUM_TO_STRING(CUBIC_REL); + + VLC_OP_ENUM_TO_STRING(SCCWARC); + VLC_OP_ENUM_TO_STRING(SCCWARC_REL); + VLC_OP_ENUM_TO_STRING(SCWARC); + VLC_OP_ENUM_TO_STRING(SCWARC_REL); + VLC_OP_ENUM_TO_STRING(LCCWARC); + VLC_OP_ENUM_TO_STRING(LCCWARC_REL); + VLC_OP_ENUM_TO_STRING(LCWARC); + VLC_OP_ENUM_TO_STRING(LCWARC_REL); + default: + break; + } + return "UNKNOWN_VLC_OP"; +} + +static void path_data_print_cb(void * user_data, uint8_t op_code, const float * data, uint32_t len) +{ + LV_UNUSED(user_data); + const char * op_str = lv_vg_lite_vlc_op_string(op_code); + + LV_UNUSED(op_str); + + switch(len) { + case 0: + LV_LOG("%s,\n", op_str); + break; + case 2: + LV_LOG("%s, %f, %f,\n", op_str, data[0], data[1]); + break; + case 4: + LV_LOG("%s, %f, %f, %f, %f,\n", op_str, data[0], data[1], data[2], data[3]); + break; + case 5: + LV_LOG("%s, %f, %f, %f, %f, %f,\n", op_str, data[0], data[1], data[2], data[3], data[4]); + break; + case 6: + LV_LOG("%s, %f, %f, %f, %f, %f, %f,\n", op_str, data[0], data[1], data[2], data[3], data[4], data[5]); + break; + default: { + LV_LOG("%s, ", op_str); + for(uint32_t i = 0; i < len; i++) { + LV_LOG("%f, ", data[i]); + } + LV_LOG("\n"); + } + break; + } +} + +void lv_vg_lite_path_dump_info(const vg_lite_path_t * path) +{ + LV_ASSERT(path != NULL); + LV_ASSERT(path->path != NULL); + uint8_t fmt_len = lv_vg_lite_path_format_len(path->format); + size_t len = path->path_length / fmt_len; + + LV_ASSERT(len > 0); + + LV_LOG_USER("address: %p", (void *)path->path); + LV_LOG_USER("length: %d", (int)len); + LV_LOG_USER("bounding box: (%0.2f, %0.2f) - (%0.2f, %0.2f)", + path->bounding_box[0], path->bounding_box[1], + path->bounding_box[2], path->bounding_box[3]); + LV_LOG_USER("format: %d", (int)path->format); + LV_LOG_USER("quality: %d", (int)path->quality); + LV_LOG_USER("path_changed: %d", (int)path->path_changed); + LV_LOG_USER("pdata_internal: %d", (int)path->pdata_internal); + LV_LOG_USER("type: %d", (int)path->path_type); + LV_LOG_USER("add_end: %d", (int)path->add_end); + + if(len <= LV_VG_LITE_PATH_DUMP_MAX_LEN) { + lv_vg_lite_path_for_each_data(path, path_data_print_cb, NULL); + } + else { + LV_LOG_WARN("path length over %d, skip print", LV_VG_LITE_PATH_DUMP_MAX_LEN); + } + + if(path->stroke) { + LV_LOG_USER("stroke_path: %p", (void *)path->stroke_path); + LV_LOG_USER("stroke_size: %d", (int)path->stroke_size); + LV_LOG_USER("stroke_color: 0x%X", (int)path->stroke_color); + lv_vg_lite_stroke_dump_info(path->stroke); + } +} + +void lv_vg_lite_stroke_dump_info(const vg_lite_stroke_t * stroke) +{ + LV_ASSERT(stroke != NULL); + LV_LOG_USER("stroke: %p", (void *)stroke); + + /* Stroke parameters */ + LV_LOG_USER("cap_style: 0x%X", (int)stroke->cap_style); + LV_LOG_USER("join_style: 0x%X", (int)stroke->join_style); + LV_LOG_USER("line_width: %f", stroke->line_width); + LV_LOG_USER("miter_limit: %f", stroke->miter_limit); + + LV_LOG_USER("dash_pattern: %p", (void *)stroke->dash_pattern); + LV_LOG_USER("pattern_count: %d", (int)stroke->pattern_count); + if(stroke->dash_pattern) { + for(int i = 0; i < (int)stroke->pattern_count; i++) { + LV_LOG_USER("dash_pattern[%d]: %f", i, stroke->dash_pattern[i]); + } + } + + LV_LOG_USER("dash_phase: %f", stroke->dash_phase); + LV_LOG_USER("dash_length: %f", stroke->dash_length); + LV_LOG_USER("dash_index: %d", (int)stroke->dash_index); + LV_LOG_USER("half_width: %f", stroke->half_width); + + /* Total length of stroke dash patterns. */ + LV_LOG_USER("pattern_length: %f", stroke->pattern_length); + + /* For fast checking. */ + LV_LOG_USER("miter_square: %f", stroke->miter_square); + + /* Temp storage of stroke subPath. */ + LV_LOG_USER("path_points: %p", (void *)stroke->path_points); + LV_LOG_USER("path_end: %p", (void *)stroke->path_end); + LV_LOG_USER("point_count: %d", (int)stroke->point_count); + + LV_LOG_USER("left_point: %p", (void *)stroke->left_point); + LV_LOG_USER("right_point: %p", (void *)stroke->right_point); + LV_LOG_USER("stroke_points: %p", (void *)stroke->stroke_points); + LV_LOG_USER("stroke_end: %p", (void *)stroke->stroke_end); + LV_LOG_USER("stroke_count: %d", (int)stroke->stroke_count); + + /* Divide stroke path according to move or move_rel for avoiding implicit closure. */ + LV_LOG_USER("path_list_divide: %p", (void *)stroke->path_list_divide); + + /* pointer to current divided path data. */ + LV_LOG_USER("cur_list: %p", (void *)stroke->cur_list); + + /* Flag that add end_path in driver. */ + LV_LOG_USER("add_end: %d", (int)stroke->add_end); + LV_LOG_USER("dash_reset: %d", (int)stroke->dash_reset); + + /* Sub path list. */ + LV_LOG_USER("stroke_paths: %p", (void *)stroke->stroke_paths); + + /* Last sub path. */ + LV_LOG_USER("last_stroke: %p", (void *)stroke->last_stroke); + + /* Swing area handling. */ + LV_LOG_USER("swing_handling: %d", (int)stroke->swing_handling); + LV_LOG_USER("swing_deltax: %f", stroke->swing_deltax); + LV_LOG_USER("swing_deltay: %f", stroke->swing_deltay); + LV_LOG_USER("swing_start: %p", (void *)stroke->swing_start); + LV_LOG_USER("swing_stroke: %p", (void *)stroke->swing_stroke); + LV_LOG_USER("swing_length: %f", stroke->swing_length); + LV_LOG_USER("swing_centlen: %f", stroke->swing_centlen); + LV_LOG_USER("swing_count: %d", (int)stroke->swing_count); + LV_LOG_USER("need_swing: %d", (int)stroke->need_swing); + LV_LOG_USER("swing_ccw: %d", (int)stroke->swing_ccw); + + LV_LOG_USER("stroke_length: %f", stroke->stroke_length); + LV_LOG_USER("stroke_size: %d", (int)stroke->stroke_size); + + LV_LOG_USER("fattened: %d", (int)stroke->fattened); + LV_LOG_USER("closed: %d", (int)stroke->closed); +} + +void lv_vg_lite_buffer_dump_info(const vg_lite_buffer_t * buffer) +{ + LV_LOG_USER("memory: %p", (buffer)->memory); + LV_LOG_USER("address: 0x%08x", (int)(buffer)->address); + LV_LOG_USER("size: W%d x H%d", (int)((buffer)->width), (int)((buffer)->height)); + LV_LOG_USER("stride: %d", (int)((buffer)->stride)); + LV_LOG_USER("format: %d (%s)", + (int)((buffer)->format), + lv_vg_lite_buffer_format_string((buffer)->format)); + LV_LOG_USER("tiled: %d", (int)((buffer)->tiled)); +} + +void lv_vg_lite_matrix_dump_info(const vg_lite_matrix_t * matrix) +{ + for(int i = 0; i < 3; i++) { + LV_LOG_USER("| %f, %f, %f |", + (matrix)->m[i][0], (matrix)->m[i][1], (matrix)->m[i][2]); + } +} + +void lv_vg_lite_color_dump_info(const vg_lite_color_t color) +{ + LV_LOG_USER("0x%08X (A%d, B%d, G%d, R%d)", + (int)color, + (int)((color >> 24) & 0xFF), + (int)((color >> 16) & 0xFF), + (int)((color >> 8) & 0xFF), + (int)((color >> 0) & 0xFF)); +} + +bool lv_vg_lite_is_dest_cf_supported(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB1555: + case LV_COLOR_FORMAT_ARGB4444: + case LV_COLOR_FORMAT_ARGB2222: + return true; + + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB888: + return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? true : false; + + default: + break; + } + + return false; +} + +bool lv_vg_lite_is_src_cf_supported(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A4: + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB1555: + case LV_COLOR_FORMAT_ARGB4444: + case LV_COLOR_FORMAT_ARGB2222: + return true; + + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_I4: + return vg_lite_query_feature(gcFEATURE_BIT_VG_INDEX_ENDIAN) ? true : false; + + case LV_COLOR_FORMAT_I8: + return vg_lite_query_feature(gcFEATURE_BIT_VG_IM_INDEX_FORMAT) ? true : false; + + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB888: + return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? true : false; + + case LV_COLOR_FORMAT_NV12: + return vg_lite_query_feature(gcFEATURE_BIT_VG_YUV_INPUT) ? true : false; + + case LV_COLOR_FORMAT_YUY2: + return vg_lite_query_feature(gcFEATURE_BIT_VG_YUY2_INPUT) ? true : false; + + default: + break; + } + + return false; +} + +vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A4: + return VG_LITE_A4; + + case LV_COLOR_FORMAT_A8: + return VG_LITE_A8; + + case LV_COLOR_FORMAT_L8: + return VG_LITE_L8; + + case LV_COLOR_FORMAT_I1: + return VG_LITE_INDEX_1; + + case LV_COLOR_FORMAT_I2: + return VG_LITE_INDEX_2; + + case LV_COLOR_FORMAT_I4: + return VG_LITE_INDEX_4; + + case LV_COLOR_FORMAT_I8: + return VG_LITE_INDEX_8; + + case LV_COLOR_FORMAT_ARGB1555: + return VG_LITE_BGRA5551; + + case LV_COLOR_FORMAT_ARGB4444: + return VG_LITE_BGRA4444; + + case LV_COLOR_FORMAT_ARGB2222: + return VG_LITE_BGRA2222; + + case LV_COLOR_FORMAT_RGB565: + return VG_LITE_BGR565; + + case LV_COLOR_FORMAT_ARGB8565: + return VG_LITE_BGRA5658; + + case LV_COLOR_FORMAT_RGB888: + return VG_LITE_BGR888; + + /** + * The lv_vg_lite_blend_mode function will automatically select the appropriate blend mode, + * which is uniformly mapped to VG_LITE_BGRA8888 here. + */ + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + return VG_LITE_BGRA8888; + + case LV_COLOR_FORMAT_XRGB8888: + return VG_LITE_BGRX8888; + + case LV_COLOR_FORMAT_NV12: + return VG_LITE_NV12; + + case LV_COLOR_FORMAT_YUY2: + return VG_LITE_YUY2; + + default: + LV_LOG_ERROR("unsupported color format: %d", cf); + break; + } + + LV_ASSERT(false); + return 0; +} + +void lv_vg_lite_buffer_format_bytes( + vg_lite_buffer_format_t format, + uint32_t * mul, + uint32_t * div, + uint32_t * bytes_align) +{ + /* Get the bpp information of a color format. */ + *mul = *div = 1; + *bytes_align = 4; + switch(format) { + case VG_LITE_L8: + case VG_LITE_A8: + case VG_LITE_RGBA8888_ETC2_EAC: + break; + case VG_LITE_A4: + *div = 2; + break; + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_YUYV: + case VG_LITE_YUY2: + case VG_LITE_YUY2_TILED: + /* AYUY2 buffer memory = YUY2 + alpha. */ + case VG_LITE_AYUY2: + case VG_LITE_AYUY2_TILED: + *mul = 2; + break; + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + *mul = 4; + break; + case VG_LITE_NV12: + case VG_LITE_NV12_TILED: + *mul = 1; + break; + case VG_LITE_ANV12: + case VG_LITE_ANV12_TILED: + *mul = 4; + break; + case VG_LITE_INDEX_1: + *div = 8; + *bytes_align = 8; + break; + case VG_LITE_INDEX_2: + *div = 4; + *bytes_align = 8; + break; + case VG_LITE_INDEX_4: + *div = 2; + *bytes_align = 8; + break; + case VG_LITE_INDEX_8: + *bytes_align = 1; + break; + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + *mul = 1; + break; + case VG_LITE_RGB888: + case VG_LITE_BGR888: + case VG_LITE_ABGR8565: + case VG_LITE_BGRA5658: + case VG_LITE_ARGB8565: + case VG_LITE_RGBA5658: + *mul = 3; + break; + default: + LV_LOG_ERROR("unsupported color format: 0x%" PRIx32, (uint32_t)format); + LV_ASSERT(false); + break; + } +} + +uint32_t lv_vg_lite_width_to_stride(uint32_t w, vg_lite_buffer_format_t color_format) +{ + if(vg_lite_query_feature(gcFEATURE_BIT_VG_16PIXELS_ALIGN)) { + w = LV_VG_LITE_ALIGN(w, 16); + } + + uint32_t mul, div, align; + lv_vg_lite_buffer_format_bytes(color_format, &mul, &div, &align); + return LV_VG_LITE_ALIGN(((w * mul + div - 1) / div), align); +} + +void lv_vg_lite_buffer_init( + vg_lite_buffer_t * buffer, + const void * ptr, + int32_t width, + int32_t height, + uint32_t stride, + vg_lite_buffer_format_t format, + bool tiled) +{ + LV_ASSERT_NULL(buffer); + LV_ASSERT_NULL(ptr); + + lv_memzero(buffer, sizeof(vg_lite_buffer_t)); + + buffer->format = format; + if(tiled || format == VG_LITE_RGBA8888_ETC2_EAC) { + buffer->tiled = VG_LITE_TILED; + } + else { + buffer->tiled = VG_LITE_LINEAR; + } + + if(buffer->tiled) { + LV_ASSERT_FORMAT_MSG(LV_VG_LITE_IS_ALIGNED(width, 4) && + LV_VG_LITE_IS_ALIGNED(height, 4), + "width : %" LV_PRId32 ", height : %" LV_PRId32, width, height); + } + + /* Alpha image need to be multiplied by color */ + if(format == VG_LITE_A8 || format == VG_LITE_A4) { + buffer->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + } + else { + buffer->image_mode = VG_LITE_NORMAL_IMAGE_MODE; + } + + buffer->transparency_mode = VG_LITE_IMAGE_OPAQUE; + buffer->width = width; + buffer->height = height; + if(stride == LV_STRIDE_AUTO) { + buffer->stride = lv_vg_lite_width_to_stride(width, buffer->format); + } + else { + buffer->stride = stride; + } + + if(format == VG_LITE_NV12) { + lv_yuv_buf_t * frame_p = (lv_yuv_buf_t *)ptr; + buffer->memory = (void *)frame_p->semi_planar.y.buf; + buffer->address = (uintptr_t)frame_p->semi_planar.y.buf; + buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; + buffer->yuv.alpha_stride = buffer->stride; + buffer->yuv.uv_height = buffer->height / 2; + buffer->yuv.uv_memory = (void *)frame_p->semi_planar.uv.buf; + buffer->yuv.uv_planar = (uint32_t)(uintptr_t)frame_p->semi_planar.uv.buf; + buffer->yuv.uv_stride = frame_p->semi_planar.uv.stride; + } + else { + buffer->memory = (void *)ptr; + buffer->address = (uintptr_t)ptr; + } +} + +void lv_vg_lite_buffer_from_draw_buf(vg_lite_buffer_t * buffer, const lv_draw_buf_t * draw_buf) +{ + LV_ASSERT_NULL(buffer); + LV_ASSERT_NULL(draw_buf); + + const uint8_t * ptr = draw_buf->data; + int32_t width = draw_buf->header.w; + int32_t height = draw_buf->header.h; + uint32_t stride = draw_buf->header.stride; + vg_lite_buffer_format_t format = lv_vg_lite_vg_fmt(draw_buf->header.cf); + + if(LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf)) { + uint32_t palette_size_bytes = LV_COLOR_INDEXED_PALETTE_SIZE(draw_buf->header.cf) * sizeof(uint32_t); + + /* Skip palette */ + ptr += LV_VG_LITE_ALIGN(palette_size_bytes, LV_DRAW_BUF_ALIGN); + } + + lv_vg_lite_buffer_init(buffer, ptr, + width, height, stride, format, + lv_draw_buf_has_flag(draw_buf, LV_VG_LITE_IMAGE_FLAGS_TILED)); +} + +void lv_vg_lite_image_matrix(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc) +{ + LV_ASSERT_NULL(matrix); + LV_ASSERT_NULL(dsc); + + int32_t rotation = dsc->rotation; + int32_t scale_x = dsc->scale_x; + int32_t scale_y = dsc->scale_y; + + vg_lite_translate(x, y, matrix); + + if(rotation != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + lv_point_t pivot = dsc->pivot; + vg_lite_translate(pivot.x, pivot.y, matrix); + + if(rotation != 0) { + vg_lite_rotate(rotation * 0.1f, matrix); + } + + if(scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + vg_lite_scale( + (vg_lite_float_t)scale_x / LV_SCALE_NONE, + (vg_lite_float_t)scale_y / LV_SCALE_NONE, + matrix); + } + + vg_lite_translate(-pivot.x, -pivot.y, matrix); + } +} + +vg_lite_color_t lv_vg_lite_image_recolor(vg_lite_buffer_t * buffer, const lv_draw_image_dsc_t * dsc) +{ + LV_ASSERT_NULL(buffer); + LV_ASSERT_NULL(dsc); + + /* alpha image and image recolor */ + if(buffer->format == VG_LITE_A4 || buffer->format == VG_LITE_A8) { + /*Alpha only image ignore recolor opa*/ + buffer->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + return lv_vg_lite_color(dsc->recolor, dsc->opa, true); + } + else if(dsc->recolor_opa > LV_OPA_TRANSP) { + buffer->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + /** The 0xff value in a color channel (R/G/B) maintains that channel's maximum intensity, + * effectively preserving its original color contribution when used in blending operations.*/ + lv_color_t recolor = lv_color_mix(dsc->recolor, lv_color_make(0xff, 0xff, 0xff), dsc->recolor_opa); + return lv_vg_lite_color(recolor, dsc->opa, true); + } + else if(dsc->opa < LV_OPA_COVER) { + /* normal image opa */ + buffer->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE; + vg_lite_color_t color; + lv_memset(&color, dsc->opa, sizeof(color)); + return color; + } + + return 0; +} + +bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_dsc_t * decoder_dsc, const void * src, + bool no_cache, bool premultiply) +{ + LV_ASSERT_NULL(buffer); + LV_ASSERT_NULL(decoder_dsc); + LV_ASSERT_NULL(src); + + lv_image_decoder_args_t args; + lv_memzero(&args, sizeof(lv_image_decoder_args_t)); + args.premultiply = premultiply; + args.stride_align = true; + args.use_indexed = true; + args.no_cache = no_cache; + + /** For images output by the GPU itself (such as draw layer), + * there is no need to flush the cache */ + args.flush_cache = !no_cache; + + lv_result_t res = lv_image_decoder_open(decoder_dsc, src, &args); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to open image"); + return false; + } + + const lv_draw_buf_t * decoded = decoder_dsc->decoded; + if(decoded == NULL || decoded->data == NULL) { + lv_image_decoder_close(decoder_dsc); + LV_LOG_ERROR("image data is NULL"); + return false; + } + + if(!lv_vg_lite_is_src_cf_supported(decoded->header.cf)) { + LV_LOG_ERROR("unsupported color format: %d", decoded->header.cf); + lv_image_decoder_close(decoder_dsc); + return false; + } + + if(LV_COLOR_FORMAT_IS_INDEXED(decoded->header.cf)) { + uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(decoded->header.cf); + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_set_CLUT"); + LV_VG_LITE_CHECK_ERROR( + vg_lite_set_CLUT(palette_size, (vg_lite_uint32_t *)decoded->data), { + for(uint32_t i = 0; i < palette_size; i++) + { + LV_LOG_USER("CLUT[%" LV_PRIu32 "] = 0x%08X", i, ((vg_lite_uint32_t *)decoded->data)[i]); + } + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_set_CLUT"); + } + + lv_vg_lite_buffer_from_draw_buf(buffer, decoded); + return true; +} + +void lv_vg_lite_image_dsc_init(struct _lv_draw_vg_lite_unit_t * unit) +{ + unit->image_dsc_pending = lv_vg_lite_pending_create(sizeof(lv_image_decoder_dsc_t), 4); + lv_vg_lite_pending_set_free_cb(unit->image_dsc_pending, image_dsc_free_cb, NULL); +} + +void lv_vg_lite_image_dsc_deinit(struct _lv_draw_vg_lite_unit_t * unit) +{ + lv_vg_lite_pending_destroy(unit->image_dsc_pending); + unit->image_dsc_pending = NULL; +} + +void lv_vg_lite_rect(vg_lite_rectangle_t * rect, const lv_area_t * area) +{ + rect->x = area->x1; + rect->y = area->y1; + rect->width = lv_area_get_width(area); + rect->height = lv_area_get_height(area); +} + +uint32_t lv_vg_lite_get_palette_size(vg_lite_buffer_format_t format) +{ + uint32_t size = 0; + switch(format) { + case VG_LITE_INDEX_1: + size = 1 << 1; + break; + case VG_LITE_INDEX_2: + size = 1 << 2; + break; + case VG_LITE_INDEX_4: + size = 1 << 4; + break; + case VG_LITE_INDEX_8: + size = 1 << 8; + break; + default: + break; + } + return size; +} + +vg_lite_color_t lv_vg_lite_color(lv_color_t color, lv_opa_t opa, bool pre_mul) +{ + if(pre_mul && opa < LV_OPA_COVER) { + color.red = LV_UDIV255(color.red * opa); + color.green = LV_UDIV255(color.green * opa); + color.blue = LV_UDIV255(color.blue * opa); + } + return (uint32_t)opa << 24 | (uint32_t)color.blue << 16 | (uint32_t)color.green << 8 | color.red; +} + +vg_lite_blend_t lv_vg_lite_blend_mode(lv_blend_mode_t blend_mode, bool has_pre_mul) +{ + if(!has_pre_mul && lv_vg_lite_support_blend_normal()) { + switch(blend_mode) { + case LV_BLEND_MODE_NORMAL: /**< Simply mix according to the opacity value*/ + return VG_LITE_BLEND_NORMAL_LVGL; + + case LV_BLEND_MODE_ADDITIVE: /**< Add the respective color channels*/ + return VG_LITE_BLEND_ADDITIVE_LVGL; + + case LV_BLEND_MODE_SUBTRACTIVE: /**< Subtract the foreground from the background*/ + return VG_LITE_BLEND_SUBTRACT_LVGL; + + case LV_BLEND_MODE_MULTIPLY: /**< Multiply the foreground and background*/ + return VG_LITE_BLEND_MULTIPLY_LVGL; + + default: + return VG_LITE_BLEND_NONE; + } + } + + switch(blend_mode) { + case LV_BLEND_MODE_NORMAL: /**< Simply mix according to the opacity value*/ + return VG_LITE_BLEND_SRC_OVER; + + case LV_BLEND_MODE_ADDITIVE: /**< Add the respective color channels*/ + return VG_LITE_BLEND_ADDITIVE; + + case LV_BLEND_MODE_SUBTRACTIVE: /**< Subtract the foreground from the background*/ + return VG_LITE_BLEND_SUBTRACT; + + case LV_BLEND_MODE_MULTIPLY: /**< Multiply the foreground and background*/ + return VG_LITE_BLEND_MULTIPLY; + + default: + return VG_LITE_BLEND_NONE; + } +} + +bool lv_vg_lite_buffer_check(const vg_lite_buffer_t * buffer, bool is_src) +{ + if(!buffer) { + LV_LOG_ERROR("buffer is NULL"); + return false; + } + + if(buffer->width < 1) { + LV_LOG_ERROR("buffer width(%d) < 1", (int)buffer->width); + return false; + } + + if(buffer->height < 1) { + LV_LOG_ERROR("buffer height(%d) < 1", (int)buffer->height); + return false; + } + + if(!(buffer->tiled == VG_LITE_LINEAR || buffer->tiled == VG_LITE_TILED)) { + LV_LOG_ERROR("buffer tiled(%d) is invalid", (int)buffer->tiled); + return false; + } + + if(buffer->memory == NULL) { + LV_LOG_ERROR("buffer memory is NULL"); + return false; + } + + if(buffer->tiled == VG_LITE_TILED) { + if(!LV_VG_LITE_IS_ALIGNED(buffer->width, 4) || !LV_VG_LITE_IS_ALIGNED(buffer->height, 4)) { + LV_LOG_ERROR("tiled buffer width(%d) or height(%d) is not aligned to 4", (int)buffer->width, (int)buffer->height); + return false; + } + } + + int memory_align = LV_DRAW_BUF_ALIGN; + if(is_src) { + switch(buffer->format) { + case VG_LITE_INDEX_1: + case VG_LITE_INDEX_2: + case VG_LITE_INDEX_4: + case VG_LITE_A4: + memory_align = 8; + break; + + case VG_LITE_INDEX_8: + case VG_LITE_A8: + case VG_LITE_L8: + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + memory_align = 16; + break; + + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + memory_align = 32; + break; + + default: + break; + } + } + + if(!LV_VG_LITE_IS_ALIGNED(buffer->memory, memory_align)) { + LV_LOG_ERROR("buffer address(%p) is not aligned to %d", buffer->memory, memory_align); + return false; + } + + const uint32_t stride = lv_vg_lite_width_to_stride(buffer->width, buffer->format); + if(buffer->stride < 0 || (uint32_t)buffer->stride != stride) { + LV_LOG_ERROR("buffer stride(%d) != expected(%d)", (int)buffer->stride, (int)stride); + return false; + } + + switch(buffer->image_mode) { + case VG_LITE_ZERO: + case VG_LITE_NORMAL_IMAGE_MODE: + case VG_LITE_MULTIPLY_IMAGE_MODE: + case VG_LITE_STENCIL_MODE: + case VG_LITE_NONE_IMAGE_MODE: + case VG_LITE_RECOLOR_MODE: + break; + default: + LV_LOG_ERROR("buffer image_mode(%d) is invalid", (int)buffer->image_mode); + return false; + } + + switch(buffer->transparency_mode) { + case VG_LITE_IMAGE_OPAQUE: + case VG_LITE_IMAGE_TRANSPARENT: + break; + default: + LV_LOG_ERROR("buffer transparency_mode(%d) is invalid", + (int)buffer->transparency_mode); + return false; + } + + return true; +} + +bool lv_vg_lite_path_check(const vg_lite_path_t * path) +{ + if(path == NULL) { + LV_LOG_ERROR("path is NULL"); + return false; + } + + if(path->path == NULL) { + LV_LOG_ERROR("path->path is NULL"); + return false; + } + + uint8_t fmt_len = lv_vg_lite_path_format_len(path->format); + if(!fmt_len) { + LV_LOG_ERROR("path format(%d) is invalid", (int)path->format); + return false; + } + + size_t len = path->path_length / fmt_len; + + if(len < 1) { + LV_LOG_ERROR("path length(%d) error", (int)path->path_length); + return false; + } + + const uint8_t * cur = path->path; + const uint8_t * end = cur + path->path_length; + + while(cur < end) { + /* get op code */ + uint8_t op_code = LV_VG_LITE_PATH_GET_OP_CODE(cur); + + /* get arguments length */ + uint8_t arg_len = lv_vg_lite_vlc_op_arg_len(op_code); + + /* get next op code */ + cur += (fmt_len * (1 + arg_len)) ; + + /* break if end */ + if(op_code == VLC_OP_END) { + break; + } + } + + if(cur != end) { + LV_LOG_ERROR("path length(%d) error", (int)path->path_length); + return false; + } + + switch(path->path_type) { + case VG_LITE_DRAW_ZERO: + case VG_LITE_DRAW_FILL_PATH: + case VG_LITE_DRAW_FILL_STROKE_PATH: { + /* Check end op code */ + uint8_t end_op_code = LV_VG_LITE_PATH_GET_OP_CODE(end - fmt_len); + if(end_op_code != VLC_OP_END) { + LV_LOG_ERROR("%d (%s) -> is NOT VLC_OP_END", end_op_code, lv_vg_lite_vlc_op_string(end_op_code)); + return false; + } + } + break; + + case VG_LITE_DRAW_STROKE_PATH: + /* No need to check stroke path end */ + break; + + default: + LV_LOG_ERROR("path type(%d) is invalid", (int)path->path_type); + return false; + } + + return true; +} + +bool lv_vg_lite_matrix_check(const vg_lite_matrix_t * matrix) +{ + if(matrix == NULL) { + LV_LOG_ERROR("matrix is NULL"); + return false; + } + + vg_lite_matrix_t result; + if(!lv_vg_lite_matrix_inverse(&result, matrix)) { + LV_LOG_ERROR("matrix is not invertible"); + lv_vg_lite_matrix_dump_info(matrix); + return false; + } + + return true; +} + +bool lv_vg_lite_support_blend_normal(void) +{ + return vg_lite_query_feature(gcFEATURE_BIT_VG_LVGL_SUPPORT); +} + +void lv_vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult) +{ + lv_matrix_t temp; + int row, column; + vg_lite_float_t (*m)[3] = matrix->m; + + /* Process all rows. */ + for(row = 0; row < 3; row++) { + /* Process all columns. */ + for(column = 0; column < 3; column++) { + /* Compute matrix entry. */ + temp.m[row][column] = (m[row][0] * mult->m[0][column]) + + (m[row][1] * mult->m[1][column]) + + (m[row][2] * mult->m[2][column]); + } + } + + /* Copy temporary 3x3 matrix into result. */ + *(lv_matrix_t *)matrix = temp; +} + +bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix) +{ + vg_lite_float_t det00, det01, det02; + vg_lite_float_t d; + bool is_affine; + + /* Test for identity matrix. */ + if(matrix == NULL) { + result->m[0][0] = 1.0f; + result->m[0][1] = 0.0f; + result->m[0][2] = 0.0f; + result->m[1][0] = 0.0f; + result->m[1][1] = 1.0f; + result->m[1][2] = 0.0f; + result->m[2][0] = 0.0f; + result->m[2][1] = 0.0f; + result->m[2][2] = 1.0f; + + /* Success. */ + return true; + } + + const vg_lite_float_t (*m)[3] = matrix->m; + + det00 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + det01 = m[2][0] * m[1][2] - m[1][0] * m[2][2]; + det02 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + /* Compute determinant. */ + d = m[0][0] * det00 + m[0][1] * det01 + m[0][2] * det02; + + /* Return 0 if there is no inverse matrix. */ + if(d == 0.0f) + return false; + + /* Compute reciprocal. */ + d = 1.0f / d; + + /* Determine if the matrix is affine. */ + is_affine = (m[2][0] == 0.0f) && (m[2][1] == 0.0f) && (m[2][2] == 1.0f); + + result->m[0][0] = d * det00; + result->m[0][1] = d * ((m[2][1] * m[0][2]) - (m[0][1] * m[2][2])); + result->m[0][2] = d * ((m[0][1] * m[1][2]) - (m[1][1] * m[0][2])); + result->m[1][0] = d * det01; + result->m[1][1] = d * ((m[0][0] * m[2][2]) - (m[2][0] * m[0][2])); + result->m[1][2] = d * ((m[1][0] * m[0][2]) - (m[0][0] * m[1][2])); + result->m[2][0] = is_affine ? 0.0f : d * det02; + result->m[2][1] = is_affine ? 0.0f : d * ((m[2][0] * m[0][1]) - (m[0][0] * m[2][1])); + result->m[2][2] = is_affine ? 1.0f : d * ((m[0][0] * m[1][1]) - (m[1][0] * m[0][1])); + + /* Success. */ + return true; +} + +lv_point_precise_t lv_vg_lite_matrix_transform_point(const vg_lite_matrix_t * matrix, const lv_point_precise_t * point) +{ + lv_point_precise_t p; + const vg_lite_float_t (*m)[3] = matrix->m; + p.x = (lv_value_precise_t)roundf(point->x * m[0][0] + point->y * m[0][1] + m[0][2]); + p.y = (lv_value_precise_t)roundf(point->x * m[1][0] + point->y * m[1][1] + m[1][2]); + return p; +} + +void lv_vg_lite_set_scissor_area(struct _lv_draw_vg_lite_unit_t * u, const lv_area_t * area) +{ + LV_PROFILER_DRAW_BEGIN; + + /* Avoid setting the same scissor frequently */ + if(lv_area_is_equal(area, &u->current_scissor_area)) { + LV_PROFILER_DRAW_END; + return; + } + +#if VGLITE_RELEASE_VERSION <= VGLITE_MAKE_VERSION(4,0,57) + /** + * In the new version of VG-Lite, vg_lite_set_scissor no longer needs to call vg_lite_enable_scissor and + * vg_lite_disable_scissor APIs. + * + * Original description in the manual: + * Description: This is a legacy scissor API function that can be used to set and enable a single scissor rectangle + * for the render target. This scissor API is supported by a different hardware mechanism other than the mask layer, + * and it is not enabled/disabled by vg_lite_enable_scissor and vg_lite_disable_scissor APIs. + */ + LV_VG_LITE_CHECK_ERROR(vg_lite_enable_scissor(), {}); +#endif + LV_VG_LITE_CHECK_ERROR(vg_lite_set_scissor( + area->x1, + area->y1, + area->x2 + 1, + area->y2 + 1), + /* Dump parameters */ + { + LV_LOG_USER("area: %d, %d, %d, %d", + (int)area->x1, (int)area->y1, (int)area->x2, (int)area->y2); + }); + + u->current_scissor_area = *area; + LV_PROFILER_DRAW_END; +} + +void lv_vg_lite_disable_scissor(void) +{ + LV_PROFILER_DRAW_BEGIN; + /* Restore full screen scissor */ + LV_VG_LITE_CHECK_ERROR(vg_lite_set_scissor( + 0, + 0, + LV_HOR_RES, + LV_VER_RES), + /* Dump parameters */ + { + LV_LOG_USER("hor_res: %d, ver_res: %d", (int)LV_HOR_RES, (int)LV_VER_RES); + }); + LV_PROFILER_DRAW_END; +} + +void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_PROFILER_DRAW_BEGIN; + + u->flush_count++; + u->letter_count = 0; + +#if LV_VG_LITE_FLUSH_MAX_COUNT + if(u->flush_count < LV_VG_LITE_FLUSH_MAX_COUNT) { + /* Do not flush too often */ + LV_PROFILER_DRAW_END; + return; + } +#else + vg_lite_uint32_t is_gpu_idle = 0; + LV_VG_LITE_CHECK_ERROR(vg_lite_get_parameter(VG_LITE_GPU_IDLE_STATE, 1, (vg_lite_pointer)&is_gpu_idle), {}); + if(!is_gpu_idle) { + /* Do not flush if GPU is busy */ + LV_PROFILER_DRAW_END; + return; + } +#endif + + LV_VG_LITE_CHECK_ERROR(vg_lite_flush(), {}); + + /* Remove all old caches reference and swap new caches reference */ +#if LV_USE_VECTOR_GRAPHIC + lv_vg_lite_pending_swap(lv_vg_lite_grad_ctx_get_pending(u->grad_ctx)); +#endif + + lv_vg_lite_pending_swap(u->image_dsc_pending); + + lv_vg_lite_pending_swap(u->bitmap_font_pending); + lv_vg_lite_pending_swap(u->letter_pending); + + u->flush_count = 0; + LV_PROFILER_DRAW_END; +} + +void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u) +{ + LV_ASSERT_NULL(u); + LV_PROFILER_DRAW_BEGIN; + + LV_VG_LITE_CHECK_ERROR(vg_lite_finish(), {}); + +#if LV_USE_VECTOR_GRAPHIC + /* Clear all gradient caches reference */ + lv_vg_lite_pending_remove_all(lv_vg_lite_grad_ctx_get_pending(u->grad_ctx)); +#endif + + /* Clear image decoder dsc reference */ + lv_vg_lite_pending_remove_all(u->image_dsc_pending); + + /* Clear bitmap font dsc reference */ + lv_vg_lite_pending_remove_all(u->bitmap_font_pending); + lv_vg_lite_pending_remove_all(u->letter_pending); + + /* Reset scissor area */ + lv_memzero(&u->current_scissor_area, sizeof(u->current_scissor_area)); + + u->flush_count = 0; + u->letter_count = 0; + LV_PROFILER_DRAW_END; +} + +void lv_vg_lite_set_color_key(const lv_image_colorkey_t * colorkey) +{ + if(!vg_lite_query_feature(gcFEATURE_BIT_VG_COLOR_KEY)) { + LV_LOG_TRACE("vg_lite_set_color_key not support"); + return; + } + + vg_lite_color_key4_t vg_colorkey; + lv_memzero(&vg_colorkey, sizeof(vg_colorkey)); + if(colorkey) { + vg_lite_color_key_t key0 = { + .enable = true, + .low_r = colorkey->low.red, + .low_g = colorkey->low.green, + .low_b = colorkey->low.blue, + .alpha = 0, + .high_r = colorkey->high.red, + .high_g = colorkey->high.green, + .high_b = colorkey->high.blue, + }; + vg_colorkey[0] = key0; + } + LV_VG_LITE_CHECK_ERROR(vg_lite_set_color_key(vg_colorkey), {}); +} + +void lv_vg_lite_set_dump_param_enable(bool enable) +{ + g_is_dump_param_enabled = enable; + LV_LOG_USER(enable ? "Enabled" : "Disabled"); +} + +bool lv_vg_lite_is_dump_param_enabled(void) +{ + return g_is_dump_param_enabled; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void image_dsc_free_cb(void * dsc, void * user_data) +{ + LV_UNUSED(user_data); + lv_image_decoder_close(dsc); +} + +#endif /*LV_USE_DRAW_VG_LITE*/ diff --git a/inc/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h new file mode 100644 index 0000000..b24c31a --- /dev/null +++ b/inc/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h @@ -0,0 +1,330 @@ +/** + * @file lv_vg_lite_utils.h + * + */ + +#ifndef LV_VG_LITE_UTILS_H +#define LV_VG_LITE_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_DRAW_VG_LITE + +#include "../../misc/lv_profiler.h" +#include "../../misc/lv_area.h" +#include "../../misc/lv_style.h" +#include "../../misc/lv_matrix.h" + +#if LV_USE_VG_LITE_THORVG +#include "../../debugging/vg_lite_tvg/vg_lite.h" +#else +#if LV_USE_VG_LITE_DRIVER +#include "../../libs/vg_lite_driver/inc/vg_lite.h" +#else +#include +#endif +#endif + +/********************* + * DEFINES + *********************/ + +#if LV_VG_LITE_USE_ASSERT +#define LV_VG_LITE_ASSERT(expr) LV_ASSERT(expr) +#else +#define LV_VG_LITE_ASSERT(expr) +#endif + +#define LV_VG_LITE_CHECK_ERROR(expr, dump_param) \ + do { \ + if(lv_vg_lite_is_dump_param_enabled()) { \ + LV_LOG_USER("Call '" #expr "', Parameter:"); \ + dump_param; \ + } \ + vg_lite_error_t error = expr; \ + if (error != VG_LITE_SUCCESS) { \ + LV_LOG_ERROR("Execute '" #expr "' error: %d", (int)error); \ + lv_vg_lite_error_dump_info(error); \ + dump_param; \ + LV_VG_LITE_ASSERT(false); \ + } \ + } while (0) + +#define LV_VG_LITE_ASSERT_PATH(path) LV_VG_LITE_ASSERT(lv_vg_lite_path_check(path)) +#define LV_VG_LITE_ASSERT_SRC_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, true)) +#define LV_VG_LITE_ASSERT_DEST_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, false)) +#define LV_VG_LITE_ASSERT_MATRIX(matrix) LV_VG_LITE_ASSERT(lv_vg_lite_matrix_check(matrix)) + +#define LV_VG_LITE_ALIGN(number, align_bytes) \ + (((number) + ((align_bytes)-1)) & ~((align_bytes)-1)) + +#define LV_VG_LITE_IS_ALIGNED(num, align) (((uintptr_t)(num) & ((align)-1)) == 0) + +#define LV_VG_LITE_IS_INDEX_FMT(fmt) \ + ((fmt) == VG_LITE_INDEX_1 \ + || (fmt) == VG_LITE_INDEX_2 \ + || (fmt) == VG_LITE_INDEX_4 \ + || (fmt) == VG_LITE_INDEX_8) + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_draw_vg_lite_unit_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/* Print info */ + +void lv_vg_lite_dump_info(void); + +void lv_vg_lite_error_dump_info(vg_lite_error_t error); + +const char * lv_vg_lite_error_string(vg_lite_error_t error); + +const char * lv_vg_lite_feature_string(vg_lite_feature_t feature); + +const char * lv_vg_lite_buffer_format_string(vg_lite_buffer_format_t format); + +const char * lv_vg_lite_vlc_op_string(uint8_t vlc_op); + +void lv_vg_lite_path_dump_info(const vg_lite_path_t * path); + +void lv_vg_lite_stroke_dump_info(const vg_lite_stroke_t * stroke); + +void lv_vg_lite_buffer_dump_info(const vg_lite_buffer_t * buffer); + +void lv_vg_lite_matrix_dump_info(const vg_lite_matrix_t * matrix); + +void lv_vg_lite_color_dump_info(const vg_lite_color_t color); + +bool lv_vg_lite_is_dest_cf_supported(lv_color_format_t cf); + +bool lv_vg_lite_is_src_cf_supported(lv_color_format_t cf); + +/* Converter */ + +vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf); + +void lv_vg_lite_buffer_format_bytes( + vg_lite_buffer_format_t format, + uint32_t * mul, + uint32_t * div, + uint32_t * bytes_align); + +uint32_t lv_vg_lite_width_to_stride(uint32_t w, vg_lite_buffer_format_t color_format); + +void lv_vg_lite_buffer_init( + vg_lite_buffer_t * buffer, + const void * ptr, + int32_t width, + int32_t height, + uint32_t stride, + vg_lite_buffer_format_t format, + bool tiled); + +void lv_vg_lite_buffer_from_draw_buf(vg_lite_buffer_t * buffer, const lv_draw_buf_t * draw_buf); + +void lv_vg_lite_image_matrix(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc); + +vg_lite_color_t lv_vg_lite_image_recolor(vg_lite_buffer_t * buffer, const lv_draw_image_dsc_t * dsc); + +bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_dsc_t * decoder_dsc, const void * src, + bool no_cache, bool premultiply); + +void lv_vg_lite_image_dsc_init(struct _lv_draw_vg_lite_unit_t * unit); + +void lv_vg_lite_image_dsc_deinit(struct _lv_draw_vg_lite_unit_t * unit); + +vg_lite_blend_t lv_vg_lite_blend_mode(lv_blend_mode_t blend_mode, bool has_pre_mul); + +uint32_t lv_vg_lite_get_palette_size(vg_lite_buffer_format_t format); + +vg_lite_color_t lv_vg_lite_color(lv_color_t color, lv_opa_t opa, bool pre_mul); + +void lv_vg_lite_rect(vg_lite_rectangle_t * rect, const lv_area_t * area); + +static inline void lv_vg_lite_matrix(vg_lite_matrix_t * dest, const lv_matrix_t * src) +{ + *(lv_matrix_t *)dest = *src; +} + +/* Param checker */ + +bool lv_vg_lite_buffer_check(const vg_lite_buffer_t * buffer, bool is_src); + +bool lv_vg_lite_path_check(const vg_lite_path_t * path); + +bool lv_vg_lite_matrix_check(const vg_lite_matrix_t * matrix); + +/* Wrapper */ + +bool lv_vg_lite_support_blend_normal(void); + +void lv_vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult); + +bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix); + +lv_point_precise_t lv_vg_lite_matrix_transform_point(const vg_lite_matrix_t * matrix, const lv_point_precise_t * point); + +void lv_vg_lite_set_scissor_area(struct _lv_draw_vg_lite_unit_t * u, const lv_area_t * area); + +void lv_vg_lite_disable_scissor(void); + +void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u); + +void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u); + +void lv_vg_lite_set_dump_param_enable(bool enable); + +bool lv_vg_lite_is_dump_param_enabled(void); + +static inline void lv_vg_lite_draw(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color) +{ + LV_VG_LITE_ASSERT_DEST_BUFFER(target); + LV_VG_LITE_ASSERT_PATH(path); + LV_VG_LITE_ASSERT_MATRIX(matrix); + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_draw"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw( + target, + path, + fill_rule, + matrix, + blend, + color), + /* Dump parameters */ + { + lv_vg_lite_buffer_dump_info(target); + lv_vg_lite_path_dump_info(path); + LV_LOG_USER("fill_rule: 0x%X,", (int)fill_rule); + lv_vg_lite_matrix_dump_info(matrix); + LV_LOG_USER("blend: 0x%X,", (int)blend); + lv_vg_lite_color_dump_info(color); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_draw"); +} + +static inline void lv_vg_lite_draw_pattern(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_buffer_t * pattern_image, + vg_lite_matrix_t * pattern_matrix, + vg_lite_blend_t blend, + vg_lite_pattern_mode_t pattern_mode, + vg_lite_color_t pattern_color, + vg_lite_color_t color, + vg_lite_filter_t filter) +{ + LV_VG_LITE_ASSERT_DEST_BUFFER(target); + LV_VG_LITE_ASSERT_PATH(path); + LV_VG_LITE_ASSERT_MATRIX(path_matrix); + LV_VG_LITE_ASSERT_SRC_BUFFER(pattern_image); + LV_VG_LITE_ASSERT_MATRIX(pattern_matrix); + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_draw_pattern"); + LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern( + target, + path, + fill_rule, + path_matrix, + pattern_image, + pattern_matrix, + blend, + pattern_mode, + pattern_color, + color, + filter), + /* Dump parameters */ + { + lv_vg_lite_buffer_dump_info(target); + lv_vg_lite_path_dump_info(path); + LV_LOG_USER("fill_rule: 0x%X,", (int)fill_rule); + lv_vg_lite_matrix_dump_info(path_matrix); + lv_vg_lite_buffer_dump_info(pattern_image); + lv_vg_lite_matrix_dump_info(pattern_matrix); + LV_LOG_USER("blend: 0x%X,", (int)blend); + LV_LOG_USER("pattern_mode: 0x%X,", (int)pattern_mode); + lv_vg_lite_color_dump_info(pattern_color); + lv_vg_lite_color_dump_info(color); + LV_LOG_USER("filter: 0x%X,", (int)filter); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_draw_pattern"); +} + +static inline void lv_vg_lite_blit_rect(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_rectangle_t * rect, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter) +{ + LV_VG_LITE_ASSERT_DEST_BUFFER(target); + LV_VG_LITE_ASSERT_SRC_BUFFER(source); + LV_VG_LITE_ASSERT_MATRIX(matrix); + + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_blit_rect"); + LV_VG_LITE_CHECK_ERROR(vg_lite_blit_rect( + target, + source, + rect, + matrix, + blend, + color, + filter), + /* Dump parameters */ + { + lv_vg_lite_buffer_dump_info(target); + lv_vg_lite_buffer_dump_info(source); + LV_LOG_USER("rect: X%d Y%d W%d H%d", + (int)rect->x, (int)rect->y, (int)rect->width, (int)rect->height); + lv_vg_lite_matrix_dump_info(matrix); + LV_LOG_USER("blend: 0x%X", (int)blend); + lv_vg_lite_color_dump_info(color); + LV_LOG_USER("filter: 0x%X", (int)filter); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_blit_rect"); +} +void lv_vg_lite_set_color_key(const lv_image_colorkey_t * colorkey); + +static inline void lv_vg_lite_clear(vg_lite_buffer_t * target, const lv_area_t * area, vg_lite_color_t color) +{ + vg_lite_rectangle_t rect; + lv_vg_lite_rect(&rect, area); + LV_PROFILER_DRAW_BEGIN_TAG("vg_lite_clear"); + LV_VG_LITE_CHECK_ERROR(vg_lite_clear(target, &rect, color), { + lv_vg_lite_buffer_dump_info(target); + LV_LOG_USER("rect: X%d Y%d W%d H%d", rect.x, rect.y, rect.width, rect.height); + lv_vg_lite_color_dump_info(color); + }); + LV_PROFILER_DRAW_END_TAG("vg_lite_clear"); +} + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_VG_LITE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_VG_LITE_UTILS_H*/ diff --git a/inc/lvgl/src/drivers/README.md b/inc/lvgl/src/drivers/README.md new file mode 100644 index 0000000..f755a3a --- /dev/null +++ b/inc/lvgl/src/drivers/README.md @@ -0,0 +1 @@ +High level drivers for display controllers, frame buffers, etc \ No newline at end of file diff --git a/inc/lvgl/src/drivers/display/drm/lv_linux_drm.c b/inc/lvgl/src/drivers/display/drm/lv_linux_drm.c new file mode 100644 index 0000000..2a6ca6e --- /dev/null +++ b/inc/lvgl/src/drivers/display/drm/lv_linux_drm.c @@ -0,0 +1,1219 @@ +/** + * @file lv_linux_drm.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_linux_drm.h" +#if LV_USE_LINUX_DRM && !LV_LINUX_DRM_USE_EGL + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "../../../stdlib/lv_sprintf.h" +#include "../../../draw/lv_draw_buf.h" + +#if LV_USE_LINUX_DRM_GBM_BUFFERS + #include + #include + #include +#endif + +/********************* + * DEFINES + *********************/ +#if LV_COLOR_DEPTH == 32 + #define DRM_FOURCC DRM_FORMAT_XRGB8888 +#elif LV_COLOR_DEPTH == 16 + #define DRM_FOURCC DRM_FORMAT_RGB565 +#else + #error LV_COLOR_DEPTH not supported +#endif + +#define BUFFER_CNT 2 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t handle; + uint32_t pitch; + uint32_t offset; + unsigned long int size; + uint8_t * map; + uint32_t fb_handle; +} drm_buffer_t; + +typedef struct { + int fd; + uint32_t conn_id, enc_id, crtc_id, plane_id, crtc_idx; + uint32_t width, height; + uint32_t mmWidth, mmHeight; + uint32_t fourcc; + drmModeModeInfo mode; + uint32_t blob_id; + drmModeCrtc * saved_crtc; + drmModeAtomicReq * req; + drmEventContext drm_event_ctx; + drmModePlane * plane; + drmModeCrtc * crtc; + drmModeConnector * conn; + uint32_t count_plane_props; + uint32_t count_crtc_props; + uint32_t count_conn_props; + drmModePropertyPtr plane_props[128]; + drmModePropertyPtr crtc_props[128]; + drmModePropertyPtr conn_props[128]; + drm_buffer_t drm_bufs[BUFFER_CNT]; + drm_buffer_t * act_buf; +#if LV_USE_LINUX_DRM_GBM_BUFFERS + struct gbm_device * gbm_device; +#endif +} drm_dev_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static uint32_t get_plane_property_id(drm_dev_t * drm_dev, const char * name); +static uint32_t get_crtc_property_id(drm_dev_t * drm_dev, const char * name); +static uint32_t get_conn_property_id(drm_dev_t * drm_dev, const char * name); +static void page_flip_handler(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, + void * user_data); +static int drm_get_plane_props(drm_dev_t * drm_dev); +static int drm_get_crtc_props(drm_dev_t * drm_dev); +static int drm_get_conn_props(drm_dev_t * drm_dev); +static int drm_add_plane_property(drm_dev_t * drm_dev, const char * name, uint64_t value); +static int drm_add_crtc_property(drm_dev_t * drm_dev, const char * name, uint64_t value); +static int drm_add_conn_property(drm_dev_t * drm_dev, const char * name, uint64_t value); +static int find_plane(drm_dev_t * drm_dev, unsigned int fourcc, uint32_t * plane_id, uint32_t crtc_id, + uint32_t crtc_idx); +static int drm_find_connector(drm_dev_t * drm_dev, int64_t connector_id); +static int drm_open(const char * path); +static int drm_setup(drm_dev_t * drm_dev, const char * device_path, int64_t connector_id, unsigned int fourcc); + +static uint32_t tick_get_cb(void); + +#if !LV_USE_LINUX_DRM_GBM_BUFFERS + static int drm_allocate_dumb(drm_dev_t * drm_dev, drm_buffer_t * buf); +#elif LV_USE_LINUX_DRM_GBM_BUFFERS + static int create_gbm_buffer(drm_dev_t * drm_dev, drm_buffer_t * buf); +#endif + +static int drm_setup_buffers(drm_dev_t * drm_dev); +static int drm_dmabuf_set_plane(drm_dev_t * drm_dev, drm_buffer_t * buf); +static void drm_flush_wait(lv_display_t * drm_dev); +static void drm_flush(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void drm_dmabuf_set_active_buf(lv_event_t * event); +static void drm_del_event_cb(lv_event_t * event); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#ifndef DIV_ROUND_UP + #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_linux_drm_create(void) +{ + lv_display_t * disp; + + lv_tick_set_cb(tick_get_cb); + + drm_dev_t * drm_dev = lv_malloc_zeroed(sizeof(drm_dev_t)); + LV_ASSERT_MALLOC(drm_dev); + if(drm_dev == NULL) return NULL; + + drm_dev->fd = -1; + + disp = lv_display_create(800, 480); + if(disp == NULL) { + lv_free(drm_dev); + return NULL; + } + lv_display_set_driver_data(disp, drm_dev); + lv_display_set_flush_wait_cb(disp, drm_flush_wait); + lv_display_set_flush_cb(disp, drm_flush); + lv_display_add_event_cb(disp, drm_del_event_cb, LV_EVENT_DELETE, NULL); + + return disp; +} + +/* Called by LVGL when there is something that needs redrawing + * it sets the active buffer. if GBM buffers are used, it issues a DMA_BUF_SYNC + * ioctl call to lock the buffer for CPU access, the buffer is unlocked just + * before the atomic commit */ +static void drm_dmabuf_set_active_buf(lv_event_t * event) +{ + drm_dev_t * drm_dev; + lv_display_t * disp; + lv_draw_buf_t * act_buf; + int i; + + disp = (lv_display_t *) lv_event_get_current_target(event); + drm_dev = (drm_dev_t *) lv_display_get_driver_data(disp); + act_buf = lv_display_get_buf_active(disp); + + if(drm_dev->act_buf == NULL) { + + for(i = 0; i < BUFFER_CNT; i++) { + if(act_buf->unaligned_data == drm_dev->drm_bufs[i].map) { + drm_dev->act_buf = &drm_dev->drm_bufs[i]; + LV_LOG_TRACE("Set active buffer idx: %d", i); + break; + } + } + +#if LV_USE_LINUX_DRM_GBM_BUFFERS + struct dma_buf_sync sync_req; + sync_req.flags = DMA_BUF_SYNC_START | DMA_BUF_SYNC_RW; + int res; + + if((res = ioctl(drm_dev->act_buf->handle, DMA_BUF_IOCTL_SYNC, &sync_req)) != 0) { + LV_LOG_ERROR("Failed to start DMA-BUF R/W SYNC res: %d", res); + } +#endif + + } + else { + + LV_LOG_TRACE("active buffer already set"); + } + +} + +lv_result_t lv_linux_drm_set_file(lv_display_t * disp, const char * file, int64_t connector_id) +{ + int ret; + + drm_dev_t * drm_dev = lv_display_get_driver_data(disp); + + ret = drm_setup(drm_dev, file, connector_id, DRM_FOURCC); + if(ret) { + return LV_RESULT_INVALID; + } + + int32_t hor_res = drm_dev->width; + int32_t ver_res = drm_dev->height; + + ret = drm_setup_buffers(drm_dev); + if(ret) { + LV_LOG_ERROR("DRM buffer allocation failed"); + close(drm_dev->fd); + drm_dev->fd = -1; + return LV_RESULT_INVALID; + } + + LV_LOG_INFO("DRM subsystem and buffer mapped successfully"); + + int32_t width = drm_dev->mmWidth; + + size_t buf_size = LV_MIN(drm_dev->drm_bufs[1].size, drm_dev->drm_bufs[0].size); + uint32_t stride = drm_dev->drm_bufs[0].pitch; + /* Resolution must be set first because if the screen is smaller than the size passed + * to lv_display_create then the buffers aren't big enough for LV_DISPLAY_RENDER_MODE_DIRECT. + */ + lv_display_set_resolution(disp, hor_res, ver_res); + lv_display_set_buffers_with_stride(disp, drm_dev->drm_bufs[1].map, drm_dev->drm_bufs[0].map, buf_size, + stride, LV_DISPLAY_RENDER_MODE_DIRECT); + + + /* Set the handler that is called before a redraw occurs to set the active buffer/plane + * when GBM buffers are used the DMA_BUF_SYNC_START is issued there */ + lv_display_add_event_cb(disp, drm_dmabuf_set_active_buf, LV_EVENT_REFR_START, drm_dev); + + if(width) { + lv_display_set_dpi(disp, DIV_ROUND_UP(hor_res * 25400, width * 1000)); + } + + LV_LOG_INFO("Resolution is set to %" LV_PRId32 "x%" LV_PRId32 " at %" LV_PRId32 "dpi", + hor_res, ver_res, lv_display_get_dpi(disp)); + return LV_RESULT_OK; +} + +void lv_linux_drm_set_mode_cb(lv_display_t * disp, lv_linux_drm_select_mode_cb_t callback) +{ + LV_UNUSED(disp); + LV_UNUSED(callback); + LV_LOG_WARN("DRM without EGL support doesn't currently support setting a mode selection callback"); +} +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t get_plane_property_id(drm_dev_t * drm_dev, const char * name) +{ + uint32_t i; + + LV_LOG_TRACE("Find plane property: %s", name); + + for(i = 0; i < drm_dev->count_plane_props; ++i) + if(!lv_strcmp(drm_dev->plane_props[i]->name, name)) + return drm_dev->plane_props[i]->prop_id; + + LV_LOG_TRACE("Unknown plane property: %s", name); + + return 0; +} + +static uint32_t get_crtc_property_id(drm_dev_t * drm_dev, const char * name) +{ + uint32_t i; + + LV_LOG_TRACE("Find crtc property: %s", name); + + for(i = 0; i < drm_dev->count_crtc_props; ++i) + if(!lv_strcmp(drm_dev->crtc_props[i]->name, name)) + return drm_dev->crtc_props[i]->prop_id; + + LV_LOG_TRACE("Unknown crtc property: %s", name); + + return 0; +} + +static uint32_t get_conn_property_id(drm_dev_t * drm_dev, const char * name) +{ + uint32_t i; + + LV_LOG_TRACE("Find conn property: %s", name); + + for(i = 0; i < drm_dev->count_conn_props; ++i) + if(!lv_strcmp(drm_dev->conn_props[i]->name, name)) + return drm_dev->conn_props[i]->prop_id; + + LV_LOG_TRACE("Unknown conn property: %s", name); + + return 0; +} + +static void page_flip_handler(int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, + void * user_data) +{ + LV_UNUSED(fd); + LV_UNUSED(sequence); + LV_UNUSED(tv_sec); + LV_UNUSED(tv_usec); + LV_LOG_TRACE("flip"); + drm_dev_t * drm_dev = user_data; + if(drm_dev->req) { + drmModeAtomicFree(drm_dev->req); + drm_dev->req = NULL; + } +} + +static int drm_get_plane_props(drm_dev_t * drm_dev) +{ + uint32_t i; + + drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->plane_id, + DRM_MODE_OBJECT_PLANE); + if(!props) { + LV_LOG_ERROR("drmModeObjectGetProperties failed"); + return -1; + } + LV_LOG_TRACE("Found %u plane props", props->count_props); + drm_dev->count_plane_props = props->count_props; + for(i = 0; i < props->count_props; i++) { + drm_dev->plane_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); + LV_LOG_TRACE("Added plane prop %u:%s", drm_dev->plane_props[i]->prop_id, drm_dev->plane_props[i]->name); + } + drmModeFreeObjectProperties(props); + + return 0; +} + +static int drm_get_crtc_props(drm_dev_t * drm_dev) +{ + uint32_t i; + + drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->crtc_id, + DRM_MODE_OBJECT_CRTC); + if(!props) { + LV_LOG_ERROR("drmModeObjectGetProperties failed"); + return -1; + } + LV_LOG_TRACE("Found %u crtc props", props->count_props); + drm_dev->count_crtc_props = props->count_props; + for(i = 0; i < props->count_props; i++) { + drm_dev->crtc_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); + LV_LOG_TRACE("Added crtc prop %u:%s", drm_dev->crtc_props[i]->prop_id, drm_dev->crtc_props[i]->name); + } + drmModeFreeObjectProperties(props); + + return 0; +} + +static int drm_get_conn_props(drm_dev_t * drm_dev) +{ + uint32_t i; + + drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->conn_id, + DRM_MODE_OBJECT_CONNECTOR); + if(!props) { + LV_LOG_ERROR("drmModeObjectGetProperties failed"); + return -1; + } + LV_LOG_TRACE("Found %u connector props", props->count_props); + drm_dev->count_conn_props = props->count_props; + for(i = 0; i < props->count_props; i++) { + drm_dev->conn_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); + LV_LOG_TRACE("Added connector prop %u:%s", drm_dev->conn_props[i]->prop_id, drm_dev->conn_props[i]->name); + } + drmModeFreeObjectProperties(props); + + return 0; +} + +static int drm_add_plane_property(drm_dev_t * drm_dev, const char * name, uint64_t value) +{ + int ret; + uint32_t prop_id = get_plane_property_id(drm_dev, name); + + if(!prop_id) { + LV_LOG_ERROR("Couldn't find plane prop %s", name); + return -1; + } + + ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->plane_id, get_plane_property_id(drm_dev, name), value); + if(ret < 0) { + LV_LOG_ERROR("drmModeAtomicAddProperty (%s:%" PRIu64 ") failed: %d", name, value, ret); + return ret; + } + + return 0; +} + +static int drm_add_crtc_property(drm_dev_t * drm_dev, const char * name, uint64_t value) +{ + int ret; + uint32_t prop_id = get_crtc_property_id(drm_dev, name); + + if(!prop_id) { + LV_LOG_ERROR("Couldn't find crtc prop %s", name); + return -1; + } + + ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->crtc_id, get_crtc_property_id(drm_dev, name), value); + if(ret < 0) { + LV_LOG_ERROR("drmModeAtomicAddProperty (%s:%" PRIu64 ") failed: %d", name, value, ret); + return ret; + } + + return 0; +} + +static int drm_add_conn_property(drm_dev_t * drm_dev, const char * name, uint64_t value) +{ + int ret; + uint32_t prop_id = get_conn_property_id(drm_dev, name); + + if(!prop_id) { + LV_LOG_ERROR("Couldn't find conn prop %s", name); + return -1; + } + + ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->conn_id, get_conn_property_id(drm_dev, name), value); + if(ret < 0) { + LV_LOG_ERROR("drmModeAtomicAddProperty (%s:%" PRIu64 ") failed: %d", name, value, ret); + return ret; + } + + return 0; +} + +static int drm_dmabuf_set_plane(drm_dev_t * drm_dev, drm_buffer_t * buf) +{ + int ret; + static int first = 1; + uint32_t flags = DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK; + +#if LV_USE_LINUX_DRM_GBM_BUFFERS + + struct dma_buf_sync sync_req; + + sync_req.flags = DMA_BUF_SYNC_END | DMA_BUF_SYNC_RW; + if(ioctl(buf->handle, DMA_BUF_IOCTL_SYNC, &sync_req) != 0) { + LV_LOG_ERROR("Failed to end DMA-BUF R/W SYNC"); + } + +#endif + + drm_dev->req = drmModeAtomicAlloc(); + + /* On first Atomic commit, do a modeset */ + if(first) { + drm_add_conn_property(drm_dev, "CRTC_ID", drm_dev->crtc_id); + + drm_add_crtc_property(drm_dev, "MODE_ID", drm_dev->blob_id); + drm_add_crtc_property(drm_dev, "ACTIVE", 1); + + flags |= DRM_MODE_ATOMIC_ALLOW_MODESET; + + first = 0; + } + + drm_add_plane_property(drm_dev, "FB_ID", buf->fb_handle); + drm_add_plane_property(drm_dev, "CRTC_ID", drm_dev->crtc_id); + drm_add_plane_property(drm_dev, "SRC_X", 0); + drm_add_plane_property(drm_dev, "SRC_Y", 0); + drm_add_plane_property(drm_dev, "SRC_W", drm_dev->width << 16); + drm_add_plane_property(drm_dev, "SRC_H", drm_dev->height << 16); + drm_add_plane_property(drm_dev, "CRTC_X", 0); + drm_add_plane_property(drm_dev, "CRTC_Y", 0); + drm_add_plane_property(drm_dev, "CRTC_W", drm_dev->width); + drm_add_plane_property(drm_dev, "CRTC_H", drm_dev->height); + + ret = drmModeAtomicCommit(drm_dev->fd, drm_dev->req, flags, drm_dev); + if(ret) { + LV_LOG_ERROR("drmModeAtomicCommit failed: %s (%d)", strerror(errno), errno); + drmModeAtomicFree(drm_dev->req); + return ret; + } + + return 0; +} + +static int find_plane(drm_dev_t * drm_dev, unsigned int fourcc, uint32_t * plane_id, uint32_t crtc_id, + uint32_t crtc_idx) +{ + LV_UNUSED(crtc_id); + drmModePlaneResPtr planes; + drmModePlanePtr plane; + unsigned int i; + unsigned int j; + int ret = 0; + + planes = drmModeGetPlaneResources(drm_dev->fd); + if(!planes) { + LV_LOG_ERROR("drmModeGetPlaneResources failed"); + return -1; + } + + LV_LOG_TRACE("drm: found planes %u", planes->count_planes); + + for(i = 0; i < planes->count_planes; ++i) { + plane = drmModeGetPlane(drm_dev->fd, planes->planes[i]); + if(!plane) { + LV_LOG_ERROR("drmModeGetPlane failed: %s", strerror(errno)); + ret = -1; + break; + } + + if(!(plane->possible_crtcs & (1 << crtc_idx))) { + drmModeFreePlane(plane); + continue; + } + + for(j = 0; j < plane->count_formats; ++j) { + if(plane->formats[j] == fourcc) + break; + } + + if(j == plane->count_formats) { + drmModeFreePlane(plane); + continue; + } + + *plane_id = plane->plane_id; + drmModeFreePlane(plane); + + LV_LOG_TRACE("found plane %d", *plane_id); + + /* Success */ + goto out; + } + + if(i == planes->count_planes) + ret = -1; +out: + drmModeFreePlaneResources(planes); + return ret; +} + +static int drm_find_connector(drm_dev_t * drm_dev, int64_t connector_id) +{ + drmModeConnector * conn = NULL; + drmModeEncoder * enc = NULL; + drmModeRes * res; + int i; + int ret = -1; + + if((res = drmModeGetResources(drm_dev->fd)) == NULL) { + LV_LOG_ERROR("drmModeGetResources() failed"); + goto free_res; + } + + if(res->count_crtcs <= 0) { + LV_LOG_ERROR("no Crtcs"); + goto free_res; + } + + /* find all available connectors */ + for(i = 0; i < res->count_connectors; i++) { + conn = drmModeGetConnector(drm_dev->fd, res->connectors[i]); + if(!conn) + continue; + + if(connector_id >= 0 && conn->connector_id != connector_id) { + drmModeFreeConnector(conn); + continue; + } + + if(conn->connection == DRM_MODE_CONNECTED) { + LV_LOG_TRACE("drm: connector %d: connected", conn->connector_id); + } + else if(conn->connection == DRM_MODE_DISCONNECTED) { + LV_LOG_TRACE("drm: connector %d: disconnected", conn->connector_id); + } + else if(conn->connection == DRM_MODE_UNKNOWNCONNECTION) { + LV_LOG_TRACE("drm: connector %d: unknownconnection", conn->connector_id); + } + else { + LV_LOG_TRACE("drm: connector %d: unknown", conn->connector_id); + } + + if(conn->connection == DRM_MODE_CONNECTED && conn->count_modes > 0) + break; + + drmModeFreeConnector(conn); + conn = NULL; + }; + + if(!conn) { + LV_LOG_ERROR("suitable connector not found"); + goto free_res; + } + + drm_dev->conn_id = conn->connector_id; + LV_LOG_TRACE("conn_id: %d", drm_dev->conn_id); + drm_dev->mmWidth = conn->mmWidth; + drm_dev->mmHeight = conn->mmHeight; + + lv_memcpy(&drm_dev->mode, &conn->modes[0], sizeof(drmModeModeInfo)); + + if(drmModeCreatePropertyBlob(drm_dev->fd, &drm_dev->mode, sizeof(drm_dev->mode), + &drm_dev->blob_id)) { + LV_LOG_ERROR("error creating mode blob"); + goto free_res; + } + + drm_dev->width = conn->modes[0].hdisplay; + drm_dev->height = conn->modes[0].vdisplay; + + for(i = 0 ; i < res->count_encoders; i++) { + enc = drmModeGetEncoder(drm_dev->fd, res->encoders[i]); + if(!enc) + continue; + + LV_LOG_TRACE("enc%d enc_id %d conn enc_id %d", i, enc->encoder_id, conn->encoder_id); + + if(enc->encoder_id == conn->encoder_id) + break; + + drmModeFreeEncoder(enc); + enc = NULL; + } + + if(enc) { + drm_dev->enc_id = enc->encoder_id; + LV_LOG_TRACE("enc_id: %d", drm_dev->enc_id); + drm_dev->crtc_id = enc->crtc_id; + LV_LOG_TRACE("crtc_id: %d", drm_dev->crtc_id); + drmModeFreeEncoder(enc); + enc = NULL; + } + else { + /* Encoder hasn't been associated yet, look it up */ + bool found = false; + for(i = 0; i < conn->count_encoders; i++) { + int crtc, crtc_id = -1; + + enc = drmModeGetEncoder(drm_dev->fd, conn->encoders[i]); + if(!enc) + continue; + + for(crtc = 0 ; crtc < res->count_crtcs; crtc++) { + uint32_t crtc_mask = 1 << crtc; + + crtc_id = res->crtcs[crtc]; + + LV_LOG_TRACE("enc_id %d crtc%d id %d mask %x possible %x", enc->encoder_id, crtc, crtc_id, crtc_mask, + enc->possible_crtcs); + + if(enc->possible_crtcs & crtc_mask) + break; + } + + if(crtc_id > 0) { + drm_dev->enc_id = enc->encoder_id; + LV_LOG_TRACE("enc_id: %d", drm_dev->enc_id); + drm_dev->crtc_id = crtc_id; + LV_LOG_TRACE("crtc_id: %d", drm_dev->crtc_id); + drmModeFreeEncoder(enc); + enc = NULL; + found = true; + break; + } + + drmModeFreeEncoder(enc); + enc = NULL; + } + + if(!found) { + LV_LOG_ERROR("suitable encoder not found"); + goto free_res; + } + } + + drm_dev->crtc_idx = UINT32_MAX; + + for(i = 0; i < res->count_crtcs; ++i) { + if(drm_dev->crtc_id == res->crtcs[i]) { + drm_dev->crtc_idx = i; + break; + } + } + + if(drm_dev->crtc_idx == UINT32_MAX) { + LV_LOG_ERROR("drm: CRTC not found"); + goto free_res; + } + + LV_LOG_TRACE("crtc_idx: %d", drm_dev->crtc_idx); + ret = 0; + +free_res: + if(enc) { + drmModeFreeEncoder(enc); + enc = NULL; + } + if(conn) { + drmModeFreeConnector(conn); + conn = NULL; + } + if(res) { + drmModeFreeResources(res); + res = NULL; + } + return ret; +} + +static int drm_open(const char * path) +{ + int fd, flags; + uint64_t has_dumb; + int ret; + + fd = open(path, O_RDWR); + if(fd < 0) { + LV_LOG_ERROR("cannot open \"%s\"", path); + return -1; + } + + /* set FD_CLOEXEC flag */ + if((flags = fcntl(fd, F_GETFD)) < 0 || + fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) { + LV_LOG_ERROR("fcntl FD_CLOEXEC failed"); + goto err; + } + + /* check capability */ + ret = drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &has_dumb); + if(ret < 0 || has_dumb == 0) { + LV_LOG_ERROR("drmGetCap DRM_CAP_DUMB_BUFFER failed or \"%s\" doesn't have dumb " + "buffer", path); + goto err; + } + + return fd; +err: + close(fd); + return -1; +} + +static int drm_setup(drm_dev_t * drm_dev, const char * device_path, int64_t connector_id, unsigned int fourcc) +{ + int ret; + + drm_dev->fd = drm_open(device_path); + if(drm_dev->fd < 0) + return -1; + + ret = drmSetClientCap(drm_dev->fd, DRM_CLIENT_CAP_ATOMIC, 1); + if(ret) { + LV_LOG_ERROR("No atomic modesetting support: %s", strerror(errno)); + goto err; + } + + ret = drm_find_connector(drm_dev, connector_id); + if(ret) { + LV_LOG_ERROR("available drm devices not found"); + goto err; + } + + ret = find_plane(drm_dev, fourcc, &drm_dev->plane_id, drm_dev->crtc_id, drm_dev->crtc_idx); + if(ret) { + LV_LOG_ERROR("Cannot find plane"); + goto err; + } + + drm_dev->plane = drmModeGetPlane(drm_dev->fd, drm_dev->plane_id); + if(!drm_dev->plane) { + LV_LOG_ERROR("Cannot get plane"); + goto err; + } + + drm_dev->crtc = drmModeGetCrtc(drm_dev->fd, drm_dev->crtc_id); + if(!drm_dev->crtc) { + LV_LOG_ERROR("Cannot get crtc"); + goto err; + } + + drm_dev->conn = drmModeGetConnector(drm_dev->fd, drm_dev->conn_id); + if(!drm_dev->conn) { + LV_LOG_ERROR("Cannot get connector"); + goto err; + } + + ret = drm_get_plane_props(drm_dev); + if(ret) { + LV_LOG_ERROR("Cannot get plane props"); + goto err; + } + + ret = drm_get_crtc_props(drm_dev); + if(ret) { + LV_LOG_ERROR("Cannot get crtc props"); + goto err; + } + + ret = drm_get_conn_props(drm_dev); + if(ret) { + LV_LOG_ERROR("Cannot get connector props"); + goto err; + } + + drm_dev->drm_event_ctx.version = DRM_EVENT_CONTEXT_VERSION; + drm_dev->drm_event_ctx.page_flip_handler = page_flip_handler; + drm_dev->fourcc = fourcc; + + LV_LOG_INFO("drm: Found plane_id: %u connector_id: %d crtc_id: %d", + drm_dev->plane_id, drm_dev->conn_id, drm_dev->crtc_id); + + LV_LOG_INFO("drm: %dx%d (%dmm X% dmm) pixel format %c%c%c%c", + drm_dev->width, drm_dev->height, drm_dev->mmWidth, drm_dev->mmHeight, + (fourcc >> 0) & 0xff, (fourcc >> 8) & 0xff, (fourcc >> 16) & 0xff, (fourcc >> 24) & 0xff); + + +#if LV_USE_LINUX_DRM_GBM_BUFFERS + + /* Create GBM device and buffer */ + drm_dev->gbm_device = gbm_create_device(drm_dev->fd); + + if(drm_dev->gbm_device == NULL) { + LV_LOG_ERROR("Failed to create GBM device"); + goto err; + } + + LV_LOG_INFO("GBM device backend: %s", gbm_device_get_backend_name(drm_dev->gbm_device)); +#endif + + return 0; + +err: +#if LV_USE_LINUX_DRM_GBM_BUFFERS + if(drm_dev->gbm_device) { + gbm_device_destroy(drm_dev->gbm_device); + drm_dev->gbm_device = NULL; + } +#endif + + if(drm_dev->plane) { + drmModeFreePlane(drm_dev->plane); + drm_dev->plane = NULL; + } + if(drm_dev->crtc) { + drmModeFreeCrtc(drm_dev->crtc); + drm_dev->crtc = NULL; + } + if(drm_dev->conn) { + drmModeFreeConnector(drm_dev->conn); + drm_dev->conn = NULL; + } + if(drm_dev->fd >= 0) { + close(drm_dev->fd); + drm_dev->fd = -1; + } + return -1; +} + +#if !LV_USE_LINUX_DRM_GBM_BUFFERS +static int drm_allocate_dumb(drm_dev_t * drm_dev, drm_buffer_t * buf) +{ + struct drm_mode_create_dumb creq; + struct drm_mode_map_dumb mreq; + uint32_t handles[4] = {0}, pitches[4] = {0}, offsets[4] = {0}; + int ret; + + /* create dumb buffer */ + lv_memzero(&creq, sizeof(creq)); + creq.width = drm_dev->width; + creq.height = drm_dev->height; + creq.bpp = LV_COLOR_DEPTH; + ret = drmIoctl(drm_dev->fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq); + if(ret < 0) { + LV_LOG_ERROR("DRM_IOCTL_MODE_CREATE_DUMB fail"); + return -1; + } + + buf->handle = creq.handle; + buf->pitch = creq.pitch; + buf->size = creq.size; + + /* prepare buffer for memory mapping */ + lv_memzero(&mreq, sizeof(mreq)); + mreq.handle = creq.handle; + ret = drmIoctl(drm_dev->fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq); + if(ret) { + LV_LOG_ERROR("DRM_IOCTL_MODE_MAP_DUMB fail"); + return -1; + } + + buf->offset = mreq.offset; + LV_LOG_INFO("size %lu pitch %u offset %u", buf->size, buf->pitch, buf->offset); + + /* perform actual memory mapping */ + buf->map = mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, drm_dev->fd, mreq.offset); + if(buf->map == MAP_FAILED) { + LV_LOG_ERROR("mmap fail"); + return -1; + } + + /* clear the framebuffer to 0 (= full transparency in ARGB8888) */ + lv_memzero(buf->map, creq.size); + + /* create framebuffer object for the dumb-buffer */ + handles[0] = creq.handle; + pitches[0] = creq.pitch; + offsets[0] = 0; + ret = drmModeAddFB2(drm_dev->fd, drm_dev->width, drm_dev->height, drm_dev->fourcc, + handles, pitches, offsets, &buf->fb_handle, 0); + if(ret) { + LV_LOG_ERROR("drmModeAddFB fail"); + return -1; + } + + return 0; +} +#endif /*!LV_USE_LINUX_DRM_GBM_BUFFERS*/ + +#if LV_USE_LINUX_DRM_GBM_BUFFERS + +static int create_gbm_buffer(drm_dev_t * drm_dev, drm_buffer_t * buf) +{ + struct gbm_bo * gbm_bo; + int prime_fd; + uint32_t handles[4] = {0}, pitches[4] = {0}, offsets[4] = {0}; + uint32_t n_planes; + int res; + + /* gbm_bo_format does not define anything other than ARGB8888 or XRGB8888 */ + if(LV_COLOR_DEPTH != 32) { + LV_LOG_ERROR("Unsupported color format"); + return -1; + } + + /* Create a linear GBM buffer object - best practice when modifiers are not used */ + if(!(gbm_bo = gbm_bo_create(drm_dev->gbm_device, + drm_dev->width, drm_dev->height, GBM_BO_FORMAT_XRGB8888, + GBM_BO_USE_SCANOUT | GBM_BO_USE_LINEAR))) { + + LV_LOG_ERROR("Unable to create gbm buffer object"); + return -1; + } + + /* Currently only, one plane per dma-buf/prime fd is supported - but some GPUs feature + * several planes (multiple fds or sometimes a single fd for multiple planes). + * current implementation is kept simple for now */ + + n_planes = gbm_bo_get_plane_count(gbm_bo); + + if(n_planes != 1) { + LV_LOG_ERROR("The current implementation only supports a single plane per fd"); + return -1; + } + + uint32_t h = gbm_bo_get_height(gbm_bo); + pitches[0] = buf->pitch = gbm_bo_get_stride_for_plane(gbm_bo, 0); + offsets[0] = buf->offset = gbm_bo_get_offset(gbm_bo, 0); + buf->size = h * buf->pitch; + + LV_LOG_INFO("Created GBM BO of size: %lu pitch: %u offset: %u", + buf->size, buf->pitch, buf->offset); + + prime_fd = gbm_bo_get_fd_for_plane(gbm_bo, 0); + + if(prime_fd < 0) { + LV_LOG_ERROR("Failed to get prime fd for plane 0"); + return -1; + + } + + buf->map = mmap(NULL, buf->size, PROT_READ | PROT_WRITE, MAP_SHARED, prime_fd, 0); + + if(buf->map == MAP_FAILED) { + LV_LOG_ERROR("Failed to mmap dma-buf fd."); + return -1; + } + + /* Used to perform DMA_BUF_SYNC ioctl calls during the rendering cycle */ + buf->handle = prime_fd; + + /* Convert prime fd to a libdrm buffer handle */ + drmPrimeFDToHandle(drm_dev->fd, buf->handle, &handles[0]); + + /* create libdrm framebuffer */ + res = drmModeAddFB2(drm_dev->fd, drm_dev->width, drm_dev->height, drm_dev->fourcc, + handles, pitches, offsets, &buf->fb_handle, 0); + + if(res) { + LV_LOG_ERROR("drmModeAddFB2 failed"); + return -1; + } + + if(drmCloseBufferHandle(drm_dev->fd, handles[0]) != 0) { + LV_LOG_ERROR("drmCloseBufferHandle failed"); + return -1; + } + + return 0; + +} + +#endif /* LV_USE_LINUX_DRM_GBM_BUFFERS */ + +static int drm_setup_buffers(drm_dev_t * drm_dev) +{ + int ret; + +#if LV_USE_LINUX_DRM_GBM_BUFFERS + ret = create_gbm_buffer(drm_dev, &drm_dev->drm_bufs[0]); + if(ret < 0) { + return ret; + } + + ret = create_gbm_buffer(drm_dev, &drm_dev->drm_bufs[1]); + if(ret < 0) { + return ret; + } + +#else + /* Use dumb buffers */ + ret = drm_allocate_dumb(drm_dev, &drm_dev->drm_bufs[0]); + if(ret) + return ret; + + ret = drm_allocate_dumb(drm_dev, &drm_dev->drm_bufs[1]); + if(ret) + return ret; + +#endif + + return 0; +} + +static void drm_flush_wait(lv_display_t * disp) +{ + drm_dev_t * drm_dev = lv_display_get_driver_data(disp); + + struct pollfd pfd; + pfd.fd = drm_dev->fd; + pfd.events = POLLIN; + + while(drm_dev->req) { + int ret; + do { + ret = poll(&pfd, 1, -1); + } while(ret == -1 && errno == EINTR); + + if(ret > 0) + drmHandleEvent(drm_dev->fd, &drm_dev->drm_event_ctx); + else { + LV_LOG_ERROR("poll failed: %s", strerror(errno)); + return; + } + } +} + +static void drm_flush(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + if(!lv_display_flush_is_last(disp)) return; + + LV_UNUSED(area); + LV_UNUSED(px_map); + drm_dev_t * drm_dev = lv_display_get_driver_data(disp); + + LV_ASSERT(drm_dev->act_buf != NULL); + + if(drm_dmabuf_set_plane(drm_dev, drm_dev->act_buf)) { + LV_LOG_ERROR("Flush fail"); + return; + } + + drm_dev->act_buf = NULL; + +} + +static void drm_del_event_cb(lv_event_t * e) +{ + if(LV_EVENT_DELETE != lv_event_get_code(e)) + return; + + lv_display_t * disp = lv_event_get_current_target(e); + drm_dev_t * drm_dev = lv_display_get_driver_data(disp); + if(!drm_dev) return; + + /* Restore original CRTC if saved */ + if(drm_dev->fd >= 0 && drm_dev->saved_crtc) { + drmModeCrtc * s_crtc = drm_dev->saved_crtc; + drmModeSetCrtc(drm_dev->fd, s_crtc->crtc_id, s_crtc->buffer_id, 0, 0, + NULL, 0, &s_crtc->mode); + drmModeFreeCrtc(s_crtc); + drm_dev->saved_crtc = NULL; + } + + /* Prevent further flushes & free any pending atomic request */ + lv_display_set_flush_cb(disp, NULL); + if(drm_dev->req) { + drmModeAtomicFree(drm_dev->req); + drm_dev->req = NULL; + } + +#if LV_USE_LINUX_DRM_GBM_BUFFERS + for(int i = 0; i < BUFFER_CNT; ++i) { + drm_buffer_t * b = &drm_dev->drm_bufs[i]; + + if(b->fb_handle) { + drmModeRmFB(drm_dev->fd, b->fb_handle); + b->fb_handle = 0; + } + + if(MAP_FAILED != b->map) { + munmap(b->map, b->size); + b->map = MAP_FAILED; + } + + if((int)b->handle >= 0) { + close((int)b->handle); + b->handle = 0; + } + } + + if(drm_dev->gbm_device) { + gbm_device_destroy(drm_dev->gbm_device); + drm_dev->gbm_device = NULL; + } + +#else /* dumb buffers */ + for(int i = 0; i < BUFFER_CNT; ++i) { + drm_buffer_t * b = &drm_dev->drm_bufs[i]; + + if(b->fb_handle) { + drmModeRmFB(drm_dev->fd, b->fb_handle); + b->fb_handle = 0; + } + if(MAP_FAILED != b->map) { + munmap(b->map, b->size); + b->map = MAP_FAILED; + } + if(b->handle) { + struct drm_mode_destroy_dumb d = { .handle = b->handle }; + /* Dumb buffers should be destroyed if they are closed, but might as well use the DRM_IOCTL_MODE_DESTROY_DUMB */ + drmIoctl(drm_dev->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &d); + b->handle = 0; + } + } +#endif + + /* Free DRM properties */ + for(uint32_t i = 0; i < drm_dev->count_plane_props; ++i) { + if(drm_dev->plane_props[i]) { + drmModeFreeProperty(drm_dev->plane_props[i]); + drm_dev->plane_props[i] = NULL; + } + } + drm_dev->count_plane_props = 0; + + for(uint32_t i = 0; i < drm_dev->count_crtc_props; ++i) { + if(drm_dev->crtc_props[i]) { + drmModeFreeProperty(drm_dev->crtc_props[i]); + drm_dev->crtc_props[i] = NULL; + } + } + drm_dev->count_crtc_props = 0; + + for(uint32_t i = 0; i < drm_dev->count_conn_props; ++i) { + if(drm_dev->conn_props[i]) { + drmModeFreeProperty(drm_dev->conn_props[i]); + drm_dev->conn_props[i] = NULL; + } + } + drm_dev->count_conn_props = 0; + + if(drm_dev->blob_id) { + drmModeDestroyPropertyBlob(drm_dev->fd, drm_dev->blob_id); + drm_dev->blob_id = 0; + } + + if(drm_dev->conn) { + drmModeFreeConnector(drm_dev->conn); + drm_dev->conn = NULL; + } + + if(drm_dev->crtc) { + drmModeFreeCrtc(drm_dev->crtc); + drm_dev->crtc = NULL; + } + + if(drm_dev->plane) { + drmModeFreePlane(drm_dev->plane); + drm_dev->plane = NULL; + } + + if(drm_dev->fd >= 0) { + close(drm_dev->fd); + drm_dev->fd = -1; + } + + lv_display_set_driver_data(disp, NULL); + lv_free(drm_dev); +} + +static uint32_t tick_get_cb(void) +{ + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + uint64_t time_ms = t.tv_sec * 1000 + (t.tv_nsec / 1000000); + return time_ms; +} + +#endif /*LV_USE_LINUX_DRM && !LV_LINUX_DRM_USE_EGL*/ diff --git a/inc/lvgl/src/drivers/display/drm/lv_linux_drm.h b/inc/lvgl/src/drivers/display/drm/lv_linux_drm.h new file mode 100644 index 0000000..5afede0 --- /dev/null +++ b/inc/lvgl/src/drivers/display/drm/lv_linux_drm.h @@ -0,0 +1,131 @@ +/** + * @file lv_linux_drm.h + * + */ + +#ifndef LV_LINUX_DRM_H +#define LV_LINUX_DRM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../display/lv_display.h" + +#if LV_USE_LINUX_DRM +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef drmModeModeInfo lv_linux_drm_mode_t; + +/** + * Callback function type for selecting a DRM display mode + * @param disp pointer to the display object + * @param modes array of available DRM modes + * @param mode_count number of modes in the array + * @return index of the selected mode from the modes array + */ +typedef size_t (*lv_linux_drm_select_mode_cb_t)(lv_display_t * disp, + const lv_linux_drm_mode_t * modes, + size_t mode_count); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Create a new Linux DRM display + * + * Creates and initializes a new LVGL display using the Linux DRM (Direct Rendering Manager) + * subsystem for hardware-accelerated graphics output. + * + * @return Pointer to the created display object, or NULL on failure + */ +lv_display_t * lv_linux_drm_create(void); + +/** + * @brief Configure the DRM device file and connector for a display + * + * Sets the DRM device file path and connector ID to use for the specified display. + * The DRM device file is typically located at /dev/dri/cardN where N is the card number. + * The connector ID specifies which physical output (HDMI, VGA, etc.) to use. + * + * @param disp Pointer to the display object created with lv_linux_drm_create() + * @param file Path to the DRM device file (e.g., "/dev/dri/card0") + * @param connector_id ID of the DRM connector to use, or -1 to auto-select the first available + * @return LV_RESULT_OK if the initialization succeeeded or LV_RESULT_INVALID if it failed + */ +lv_result_t lv_linux_drm_set_file(lv_display_t * disp, const char * file, int64_t connector_id); + +/** + * @brief Automatically find a suitable DRM device path + * + * Scans the system for available DRM devices and returns the path to a suitable + * device file that can be used with lv_linux_drm_set_file(). + * + * @return Dynamically allocated string containing the device path (must be freed with lv_free()), + * or NULL if no suitable device is found + */ +char * lv_linux_drm_find_device_path(void); + +/** + * Set a callback function for custom DRM mode selection to override the default mode selection behavior + * + * The default mode selection behavior is selecting the native mode + * + * @param disp pointer to the display object + * @param callback function to be called when a display mode needs to be selected, + * or NULL to use the default mode selection behavior + */ +void lv_linux_drm_set_mode_cb(lv_display_t * disp, lv_linux_drm_select_mode_cb_t callback); + +/** + * Get the horizontal resolution of a DRM mode + * @param mode pointer to the DRM mode object + * @return horizontal resolution in pixels, or 0 if mode is invalid + */ +int32_t lv_linux_drm_mode_get_horizontal_resolution(const lv_linux_drm_mode_t * mode); + +/** + * Get the vertical resolution of a DRM mode + * @param mode pointer to the DRM mode object + * @return vertical resolution in pixels, or 0 if mode is invalid + */ +int32_t lv_linux_drm_mode_get_vertical_resolution(const lv_linux_drm_mode_t * mode); + +/** + * Get the refresh rate of a DRM mode + * @param mode pointer to the DRM mode object + * @return refresh rate in Hz, or 0 if mode is invalid + */ +int32_t lv_linux_drm_mode_get_refresh_rate(const lv_linux_drm_mode_t * mode); + +/** + * Check if a DRM mode is the preferred mode for the display + * @param mode pointer to the DRM mode object + * @return true if this is the preferred/native mode, false otherwise + */ +bool lv_linux_drm_mode_is_preferred(const lv_linux_drm_mode_t * mode); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LINUX_DRM */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_LINUX_DRM_H */ diff --git a/inc/lvgl/src/drivers/display/drm/lv_linux_drm_common.c b/inc/lvgl/src/drivers/display/drm/lv_linux_drm_common.c new file mode 100644 index 0000000..0fecb50 --- /dev/null +++ b/inc/lvgl/src/drivers/display/drm/lv_linux_drm_common.c @@ -0,0 +1,128 @@ +/** + * @file lv_linux_drm_common.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_linux_drm.h" + +#if LV_USE_LINUX_DRM + +#include +#include + +#include "lv_linux_drm.h" +#include "../../../stdlib/lv_sprintf.h" + +/********************* + * DEFINES + *********************/ + +#define LV_DRM_CLASS_DIR "/sys/class/drm" +#define LV_DRM_CARD_PATH "/dev/dri/card" + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static char * find_by_class(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +char * lv_linux_drm_find_device_path(void) +{ + return find_by_class(); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static char * find_by_class(void) +{ + DIR * d = opendir(LV_DRM_CLASS_DIR); + if(!d) { + return NULL; + } + + struct dirent * ent; + while((ent = readdir(d)) != NULL) { + if(lv_strcmp(ent->d_name, ".") == 0 || lv_strcmp(ent->d_name, "..") == 0) { + continue; + } + /* connector dirs look like card0-HDMI-A-1, card0-eDP-1, etc. */ + bool is_card = lv_strncmp(ent->d_name, "card", 4) == 0; + bool is_connected = lv_strchr(ent->d_name, '-') != NULL; + + if(!is_card || !is_connected) { + continue; + } + + const size_t buf_size = lv_strlen(LV_DRM_CARD_PATH) + 3; + char * card_path = lv_zalloc(buf_size); + if(ent->d_name[5] != '-') { + /* Double digit card*/ + lv_snprintf(card_path, buf_size, LV_DRM_CARD_PATH "%c%c", ent->d_name[4], ent->d_name[5]); + } + else { + lv_snprintf(card_path, buf_size, LV_DRM_CARD_PATH "%c", ent->d_name[4]); + } + closedir(d); + return card_path; + } + + closedir(d); + return NULL; + +} + +int32_t lv_linux_drm_mode_get_horizontal_resolution(const lv_linux_drm_mode_t * mode) +{ + if(!mode) { + return 0; + } + return mode->hdisplay; +} + +int32_t lv_linux_drm_mode_get_vertical_resolution(const lv_linux_drm_mode_t * mode) +{ + if(!mode) { + return 0; + } + return mode->vdisplay; +} + +int32_t lv_linux_drm_mode_get_refresh_rate(const lv_linux_drm_mode_t * mode) +{ + if(!mode) { + return 0; + } + return mode->vrefresh; +} + +bool lv_linux_drm_mode_is_preferred(const lv_linux_drm_mode_t * mode) +{ + if(!mode) { + return false; + } + return (mode->type & DRM_MODE_TYPE_PREFERRED) != 0; +} + +#endif /*LV_USE_LINUX_DRM*/ diff --git a/inc/lvgl/src/drivers/display/drm/lv_linux_drm_egl.c b/inc/lvgl/src/drivers/display/drm/lv_linux_drm_egl.c new file mode 100644 index 0000000..5462566 --- /dev/null +++ b/inc/lvgl/src/drivers/display/drm/lv_linux_drm_egl.c @@ -0,0 +1,760 @@ +/** + * @file lv_linux_drm_egl.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_linux_drm.h" + +#if LV_USE_LINUX_DRM && LV_LINUX_DRM_USE_EGL + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "lv_linux_drm_egl_private.h" +#include "../../../draw/lv_draw_buf.h" +#include "../../opengles/lv_opengles_debug.h" + +#include "../../opengles/lv_opengles_driver.h" +#include "../../opengles/lv_opengles_texture.h" +#include "../../opengles/lv_opengles_private.h" + +#include "../../../stdlib/lv_string.h" +#include "../../../display/lv_display.h" + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + int fd; + struct gbm_bo * bo; + uint32_t fb_id; +} drm_fb_state_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t tick_cb(void); +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void event_cb(lv_event_t * e); + +static lv_result_t drm_device_init(lv_drm_ctx_t * ctx, const char * path); +static void drm_device_deinit(lv_drm_ctx_t * ctx); + +static lv_egl_interface_t drm_get_egl_interface(lv_drm_ctx_t * ctx); +static drmModeConnector * drm_get_connector(lv_drm_ctx_t * ctx); +static drmModeModeInfo * drm_get_mode(lv_drm_ctx_t * ctx); +static drmModeEncoder * drm_get_encoder(lv_drm_ctx_t * ctx); +static drmModeCrtc * drm_get_crtc(lv_drm_ctx_t * ctx); +static void drm_on_page_flip(int fd, unsigned int frame, unsigned int sec, unsigned int usec, void * data); +static drm_fb_state_t * drm_fb_state_create(lv_drm_ctx_t * ctx, struct gbm_bo * bo); +static void drm_fb_state_destroy_cb(struct gbm_bo * bo, void * data); +static void drm_flip_cb(void * driver_data, bool vsync); + +static void * drm_create_window(void * driver_data, const lv_egl_native_window_properties_t * properties); +static void drm_destroy_window(void * driver_data, void * native_window); +static size_t drm_egl_select_config_cb(void * driver_data, const lv_egl_config_t * configs, size_t config_count); +static inline void set_viewport(lv_display_t * display); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_linux_drm_create(void) +{ + lv_tick_set_cb(tick_cb); + lv_drm_ctx_t * ctx = lv_zalloc(sizeof(*ctx)); + LV_ASSERT_MALLOC(ctx); + if(!ctx) { + LV_LOG_ERROR("Failed to create drm context"); + return NULL; + } + + ctx->display = lv_display_create(1, 1); + + if(!ctx->display) { + LV_LOG_ERROR("Failed to create display"); + lv_free(ctx); + return NULL; + } + + lv_display_set_driver_data(ctx->display, ctx); + lv_display_add_event_cb(ctx->display, event_cb, LV_EVENT_DELETE, NULL); + return ctx->display; +} + +lv_result_t lv_linux_drm_set_file(lv_display_t * display, const char * file, int64_t connector_id) +{ + LV_UNUSED(connector_id); + lv_drm_ctx_t * ctx = lv_display_get_driver_data(display); + + lv_result_t err = drm_device_init(ctx, file); + if(err != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to initialize DRM device"); + return LV_RESULT_INVALID; + } + + lv_display_set_resolution(display, ctx->drm_mode->hdisplay, ctx->drm_mode->vdisplay); + + ctx->egl_interface = drm_get_egl_interface(ctx); + ctx->egl_ctx = lv_opengles_egl_context_create(&ctx->egl_interface); + if(!ctx->egl_ctx) { + LV_LOG_ERROR("Failed to create egl context"); + return LV_RESULT_INVALID; + } + + /* Let the opengles texture driver handle the texture lifetime */ + ctx->texture.is_texture_owner = true; + /*Initialize the draw buffers and texture*/ + lv_result_t res = lv_opengles_texture_reshape(&ctx->texture, display, ctx->drm_mode->hdisplay, ctx->drm_mode->vdisplay); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to create draw buffers"); + lv_opengles_egl_context_destroy(ctx->egl_ctx); + ctx->egl_ctx = NULL; + return LV_RESULT_INVALID; + } + + lv_display_set_flush_cb(display, flush_cb); + lv_display_set_render_mode(display, LV_DISPLAY_RENDER_MODE_DIRECT); + lv_display_set_render_mode(display, LV_USE_DRAW_NANOVG ? LV_DISPLAY_RENDER_MODE_FULL : LV_DISPLAY_RENDER_MODE_DIRECT); + + lv_display_add_event_cb(ctx->display, event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + lv_display_add_event_cb(ctx->display, event_cb, LV_EVENT_DELETE, NULL); + + return LV_RESULT_OK; +} + +void lv_linux_drm_set_mode_cb(lv_display_t * disp, lv_linux_drm_select_mode_cb_t callback) +{ + if(!disp) { + LV_LOG_ERROR("Cannot set a mode select callback on a NULL display"); + return; + } + lv_drm_ctx_t * ctx = lv_display_get_driver_data(disp); + ctx->mode_select_cb = callback; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_display_t * display = (lv_display_t *) lv_event_get_target(e); + lv_drm_ctx_t * ctx = lv_display_get_driver_data(display); + switch(code) { + case LV_EVENT_DELETE: + if(ctx) { + lv_opengles_egl_context_destroy(ctx->egl_ctx); + ctx->egl_ctx = NULL; + lv_opengles_texture_deinit(&ctx->texture); + drm_device_deinit(ctx); + lv_display_set_driver_data(display, NULL); + } + break; + case LV_EVENT_RESOLUTION_CHANGED: { + lv_result_t res = lv_opengles_texture_reshape(&ctx->texture, display, lv_display_get_horizontal_resolution(display), + lv_display_get_vertical_resolution(display)); + + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to resize display"); + } + } + break; + default: + return; + } +} + +static uint32_t tick_cb(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec * 1000 + (ts.tv_nsec / 1000000);; +} + +static inline void set_viewport(lv_display_t * display) +{ + const lv_display_rotation_t rotation = lv_display_get_rotation(display); + int32_t disp_width, disp_height; + if(rotation == LV_DISPLAY_ROTATION_0 || rotation == LV_DISPLAY_ROTATION_180) { + disp_width = lv_display_get_horizontal_resolution(display); + disp_height = lv_display_get_vertical_resolution(display); + } + else { + disp_width = lv_display_get_vertical_resolution(display) ; + disp_height = lv_display_get_horizontal_resolution(display) ; + } + lv_opengles_viewport(0, 0, disp_width, disp_height); +} + +#if LV_USE_DRAW_OPENGLES || LV_USE_DRAW_NANOVG + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + LV_UNUSED(area); + LV_UNUSED(px_map); + if(lv_display_flush_is_last(disp)) { + set_viewport(disp); + lv_drm_ctx_t * ctx = lv_display_get_driver_data(disp); +#if LV_USE_DRAW_OPENGLES + lv_opengles_render_display_texture(disp, false, true); +#endif /*LV_USE_DRAW_OPENGLES*/ + lv_opengles_egl_update(ctx->egl_ctx); + } + lv_display_flush_ready(disp); +} + +#else + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + LV_UNUSED(px_map); + LV_UNUSED(area); + if(lv_display_flush_is_last(disp)) { + lv_drm_ctx_t * ctx = lv_display_get_driver_data(disp); + int32_t disp_width = lv_display_get_horizontal_resolution(disp); + int32_t disp_height = lv_display_get_vertical_resolution(disp); + + set_viewport(disp); + + lv_color_format_t cf = lv_display_get_color_format(disp); + uint32_t stride = lv_draw_buf_width_to_stride(lv_display_get_horizontal_resolution(disp), cf); + GL_CALL(glBindTexture(GL_TEXTURE_2D, ctx->texture.texture_id)); + + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + GL_CALL(glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / lv_color_format_get_size(cf))); + /*Color depth: 16 (RGB565), 32 (ARGB8888)*/ +#if LV_COLOR_DEPTH == 16 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, disp_width, disp_height, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, + ctx->texture.fb1)); +#elif LV_COLOR_DEPTH == 32 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, disp_width, disp_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, + ctx->texture.fb1)); +#else +#error("Unsupported color format") +#endif + + lv_opengles_render_params_t params = { + .h_flip = false, + .v_flip = false, + .rb_swap = LV_COLOR_DEPTH == 32, + }; + lv_opengles_render_display(disp, ¶ms); + lv_opengles_egl_update(ctx->egl_ctx); + } + lv_display_flush_ready(disp); +} +#endif + +void drm_device_deinit(lv_drm_ctx_t * ctx) +{ + if(ctx->drm_crtc) { + drmModeSetCrtc(ctx->fd, + ctx->drm_crtc->crtc_id, + ctx->drm_crtc->buffer_id, + ctx->drm_crtc->x, + ctx->drm_crtc->y, + &ctx->drm_connector->connector_id, + 1, + &ctx->drm_crtc->mode); + drmModeFreeCrtc(ctx->drm_crtc); + ctx->drm_crtc = 0; + } + drm_destroy_window(ctx, ctx->gbm_surface); + + if(ctx->gbm_dev) { + gbm_device_destroy(ctx->gbm_dev); + ctx->gbm_dev = NULL; + } + if(ctx->drm_connector) { + drmModeFreeConnector(ctx->drm_connector); + ctx->drm_connector = NULL; + } + if(ctx->drm_encoder) { + drmModeFreeEncoder(ctx->drm_encoder); + ctx->drm_encoder = NULL; + } + if(ctx->drm_resources) { + drmModeFreeResources(ctx->drm_resources); + ctx->drm_resources = NULL; + } + if(ctx->fd > 0) { + drmClose(ctx->fd); + } + ctx->fd = 0; + ctx->drm_mode = NULL; + lv_free(ctx); +} + +static void drm_fb_state_destroy_cb(struct gbm_bo * bo, void * data) +{ + LV_UNUSED(bo); + drm_fb_state_t * fb = (drm_fb_state_t *) data; + if(fb && fb->fb_id) { + drmModeRmFB(fb->fd, fb->fb_id); + } + lv_free(fb); +} + +static int drm_do_page_flip(lv_drm_ctx_t * ctx, int timeout_ms) +{ + fd_set fds; + FD_ZERO(&fds); + FD_SET(ctx->fd, &fds); + + drmEventContext event_ctx; + lv_memset(&event_ctx, 0, sizeof(event_ctx)); + event_ctx.version = 2; + event_ctx.page_flip_handler = drm_on_page_flip; + + struct timeval timeout; + int status; + if(timeout_ms >= 0) { + timeout.tv_sec = timeout_ms / 1000; + timeout.tv_usec = (timeout_ms % 1000) * 1000; + status = select(ctx->fd + 1, &fds, NULL, NULL, &timeout); + } + else { + status = select(ctx->fd + 1, &fds, NULL, NULL, NULL); + } + + if(status == 1) { + drmHandleEvent(ctx->fd, &event_ctx); + } + return status; +} + +static void drm_on_page_flip(int fd, unsigned int frame, unsigned int sec, unsigned int usec, void * data) +{ + LV_UNUSED(fd); + LV_UNUSED(frame); + LV_UNUSED(sec); + LV_UNUSED(usec); + lv_drm_ctx_t * ctx = (lv_drm_ctx_t *) data; + + if(ctx->gbm_bo_presented) { + gbm_surface_release_buffer(ctx->gbm_surface, ctx->gbm_bo_presented); + } + ctx->gbm_bo_presented = ctx->gbm_bo_flipped; + ctx->gbm_bo_flipped = NULL; +} + +static drm_fb_state_t * drm_fb_state_create(lv_drm_ctx_t * ctx, struct gbm_bo * bo) +{ + LV_ASSERT_NULL(bo); + drm_fb_state_t * fb = (drm_fb_state_t *)gbm_bo_get_user_data(bo); + + if(fb) { + return fb; + } + + uint32_t width = gbm_bo_get_width(bo); + uint32_t height = gbm_bo_get_height(bo); + uint32_t handles[4] = {0}; + uint32_t strides[4] = {0}; + uint32_t offsets[4] = {0}; + uint64_t modifiers[4] = {0}; + uint32_t format = gbm_bo_get_format(bo); + uint64_t modifier = gbm_bo_get_modifier(bo); + uint32_t fb_id = 0; + uint64_t addfb2_mods = 0; + int32_t status; + + drmGetCap(ctx->fd, DRM_CAP_ADDFB2_MODIFIERS, &addfb2_mods); + + for(int i = 0; i < gbm_bo_get_plane_count(bo); i++) { + handles[i] = gbm_bo_get_handle_for_plane(bo, i).u32; + strides[i] = gbm_bo_get_stride_for_plane(bo, i); + offsets[i] = gbm_bo_get_offset(bo, i); + modifiers[i] = modifier; + } + + if(addfb2_mods && modifier != DRM_FORMAT_MOD_INVALID) { + status = drmModeAddFB2WithModifiers(ctx->fd, width, height, format, + handles, strides, offsets, modifiers, + &fb_id, DRM_MODE_FB_MODIFIERS); + } + else { + status = drmModeAddFB2(ctx->fd, width, height, format, + handles, strides, offsets, &fb_id, 0); + } + + if(status < 0) { + LV_LOG_ERROR("Failed to create drm_fb_state: %d", status); + return NULL; + } + + fb = (drm_fb_state_t *)lv_malloc(sizeof(*fb)); + if(!fb) { + LV_LOG_ERROR("Failed to allocate drmfb_state"); + return NULL; + } + + fb->fd = ctx->fd; + fb->bo = bo; + fb->fb_id = fb_id; + + gbm_bo_set_user_data(bo, fb, drm_fb_state_destroy_cb); + return fb; +} + +static void drm_flip_cb(void * driver_data, bool vsync) +{ + lv_drm_ctx_t * ctx = (lv_drm_ctx_t *) driver_data; + + if(ctx->gbm_bo_pending) { + gbm_surface_release_buffer(ctx->gbm_surface, ctx->gbm_bo_pending); + } + ctx->gbm_bo_pending = gbm_surface_lock_front_buffer(ctx->gbm_surface); + + if(!ctx->gbm_bo_pending) { + LV_LOG_ERROR("Failed to lock front buffer"); + return; + } + + drm_fb_state_t * pending_fb = drm_fb_state_create(ctx, ctx->gbm_bo_pending); + + if(!ctx->gbm_bo_pending || !pending_fb) { + LV_LOG_ERROR("Failed to get gbm front buffer"); + return; + } + + if(vsync) { + while(ctx->gbm_bo_flipped && drm_do_page_flip(ctx, -1) >= 0) + continue; + } + else { + drm_do_page_flip(ctx, 0); + } + + if(!ctx->gbm_bo_flipped) { + if(!ctx->crtc_isset) { + int status = drmModeSetCrtc(ctx->fd, ctx->drm_encoder->crtc_id, pending_fb->fb_id, 0, 0, + &(ctx->drm_connector->connector_id), 1, ctx->drm_mode); + if(status < 0) { + LV_LOG_ERROR("Failed to set crtc: %d", status); + return; + } + ctx->crtc_isset = true; + if(ctx->gbm_bo_presented) + gbm_surface_release_buffer(ctx->gbm_surface, ctx->gbm_bo_presented); + ctx->gbm_bo_presented = ctx->gbm_bo_pending; + ctx->gbm_bo_flipped = NULL; + ctx->gbm_bo_pending = NULL; + return; + } + + + uint32_t flip_flags = DRM_MODE_PAGE_FLIP_EVENT; + int status = drmModePageFlip(ctx->fd, ctx->drm_encoder->crtc_id, pending_fb->fb_id, flip_flags, ctx); + if(status < 0) { + LV_LOG_ERROR("Failed to enqueue page flip: %d", status); + return; + } + ctx->gbm_bo_flipped = ctx->gbm_bo_pending; + ctx->gbm_bo_pending = NULL; + } + + /* We need to ensure our surface has a free buffer, otherwise GL will + * have no buffer to render on. */ + while(!gbm_surface_has_free_buffers(ctx->gbm_surface) && + drm_do_page_flip(ctx, -1) >= 0) { + continue; + } +} + +static lv_result_t drm_device_init(lv_drm_ctx_t * ctx, const char * path) +{ + if(!path) { + LV_LOG_ERROR("Device path must not be NULL"); + return LV_RESULT_INVALID; + } + int ret = open(path, O_RDWR); + if(ret < 0) { + LV_LOG_ERROR("Failed to open device path '%s'", path); + goto open_err; + } + ctx->fd = ret; + + ret = drmSetClientCap(ctx->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); + if(ret < 0) { + LV_LOG_ERROR("Failed to set universal planes capability"); + goto set_client_cap_err; + } + + ctx->drm_resources = drmModeGetResources(ctx->fd); + if(!ctx->drm_resources) { + LV_LOG_ERROR("Failed to get card resources"); + goto get_resources_err; + } + + ctx->drm_connector = drm_get_connector(ctx); + if(!ctx->drm_connector) { + LV_LOG_ERROR("Failed to find a suitable connector"); + goto get_connector_err; + } + + ctx->drm_mode = drm_get_mode(ctx); + if(!ctx->drm_mode) { + LV_LOG_ERROR("Failed to find a suitable drm mode"); + goto get_mode_err; + } + + ctx->drm_encoder = drm_get_encoder(ctx); + if(!ctx->drm_encoder) { + LV_LOG_ERROR("Failed to find a suitable encoder"); + goto get_encoder_err; + } + + ctx->gbm_dev = gbm_create_device(ctx->fd); + if(!ctx->gbm_dev) { + LV_LOG_ERROR("Failed to create gbm device"); + goto gbm_create_device_err; + } + + if(drmSetMaster(ctx->fd) < 0) { + LV_LOG_ERROR("Failed to become DRM master"); + goto set_master_err; + } + + ctx->drm_crtc = drm_get_crtc(ctx); + if(!ctx->drm_crtc) { + LV_LOG_ERROR("Failed to get crtc"); + goto get_crtc_err; + } + + return LV_RESULT_OK; + +get_crtc_err: + gbm_device_destroy(ctx->gbm_dev); + ctx->gbm_dev = NULL; +set_master_err: + /* Nothing special to do */ +gbm_create_device_err: + drmModeFreeEncoder(ctx->drm_encoder); + ctx->drm_encoder = NULL; +get_encoder_err: + drmModeFreeConnector(ctx->drm_connector); + ctx->drm_connector = NULL; +get_mode_err: + /* Nothing special to do */ +get_connector_err: + drmModeFreeResources(ctx->drm_resources); + ctx->drm_resources = NULL; +get_resources_err: + /* Nothing special to do */ +set_client_cap_err: + close(ctx->fd); + ctx->fd = 0; +open_err: + return LV_RESULT_INVALID; +} + +static size_t drm_egl_select_config_cb(void * driver_data, const lv_egl_config_t * configs, size_t config_count) +{ + lv_drm_ctx_t * ctx = (lv_drm_ctx_t *)driver_data; + int32_t target_w = lv_display_get_horizontal_resolution(ctx->display); + int32_t target_h = lv_display_get_vertical_resolution(ctx->display); + +#if LV_COLOR_DEPTH == 16 + lv_color_format_t target_cf = LV_COLOR_FORMAT_RGB565; +#elif LV_COLOR_DEPTH == 32 + lv_color_format_t target_cf = LV_COLOR_FORMAT_ARGB8888; +#else +#error("Unsupported color format") +#endif + + + for(size_t i = 0; i < config_count; ++i) { + LV_LOG_TRACE("Got config %zu %#x %dx%d %d %d %d %d buffer size %d depth %d samples %d stencil %d surface type %d", + i, configs[i].id, + configs[i].max_width, configs[i].max_height, configs[i].r_bits, configs[i].g_bits, configs[i].b_bits, configs[i].a_bits, + configs[i].buffer_size, configs[i].depth, configs[i].samples, configs[i].stencil, configs[i].surface_type); + } + + for(size_t i = 0; i < config_count; ++i) { + lv_color_format_t config_cf = lv_opengles_egl_color_format_from_egl_config(&configs[i]); + if(configs[i].max_width >= target_w && + configs[i].max_height >= target_h && + config_cf == target_cf && + configs[i].surface_type & EGL_WINDOW_BIT + ) { + LV_LOG_TRACE("Choosing config %zu", i); + return i; + } + } + return config_count; +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_egl_interface_t drm_get_egl_interface(lv_drm_ctx_t * ctx) +{ + return (lv_egl_interface_t) { + .driver_data = ctx, + .native_display = ctx->gbm_dev, + .egl_platform = EGL_PLATFORM_GBM_KHR, + .select_config = drm_egl_select_config_cb, + .flip_cb = drm_flip_cb, + .create_window_cb = drm_create_window, + .destroy_window_cb = drm_destroy_window, + }; +} + +static drmModeConnector * drm_get_connector(lv_drm_ctx_t * ctx) +{ + drmModeConnector * connector = NULL; + + LV_ASSERT_NULL(ctx->drm_resources); + for(int i = 0; i < ctx->drm_resources->count_connectors; i++) { + connector = drmModeGetConnector(ctx->fd, ctx->drm_resources->connectors[i]); + if(connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) { + return connector; + } + drmModeFreeConnector(connector); + connector = NULL; + } + return connector; +} + +static drmModeModeInfo * drm_get_mode(lv_drm_ctx_t * ctx) +{ + LV_ASSERT_NULL(ctx->drm_connector); + if(ctx->mode_select_cb) { + size_t mode_index = ctx->mode_select_cb(ctx->display, (lv_linux_drm_mode_t *)ctx->drm_connector->modes, + (size_t)ctx->drm_connector->count_modes); + if(mode_index >= (size_t)ctx->drm_connector->count_modes) { + LV_LOG_ERROR("Failed to select drm mode. User select callback return an invalid mode index"); + return NULL; + } + return &ctx->drm_connector->modes[mode_index]; + } + + drmModeModeInfo * best_mode = NULL; + uint32_t best_area = 0; + + for(int i = 0 ; i < ctx->drm_connector->count_modes; ++i) { + drmModeModeInfo * mode = &ctx->drm_connector->modes[i]; + if(mode->type & DRM_MODE_TYPE_PREFERRED) { + return mode; + } + uint32_t area = mode->hdisplay * mode->vdisplay; + if(area > best_area) { + best_area = area; + best_mode = mode; + } + } + LV_LOG_WARN("Failed to find a drm mode with the TYPE_PREFERRED flag. Using the one with the biggest area"); + return best_mode; +} + +static drmModeCrtc * drm_get_crtc(lv_drm_ctx_t * ctx) +{ + drmModeCrtc * crtc = drmModeGetCrtc(ctx->fd, ctx->drm_encoder->crtc_id); + if(crtc) { + return crtc; + } + + /* if there is no current CRTC, attach a suitable one */ + for(int i = 0; i < ctx->drm_resources->count_crtcs; i++) { + if(ctx->drm_encoder->possible_crtcs & (1 << i)) { + ctx->drm_encoder->crtc_id = ctx->drm_resources->crtcs[i]; + crtc = drmModeGetCrtc(ctx->fd, ctx->drm_encoder->crtc_id); + break; + } + } + return crtc; +} + +static drmModeEncoder * drm_get_encoder(lv_drm_ctx_t * ctx) +{ + LV_ASSERT_NULL(ctx->drm_connector); + drmModeEncoder * encoder = NULL; + for(int i = 0; i < ctx->drm_resources->count_encoders; i++) { + encoder = drmModeGetEncoder(ctx->fd, ctx->drm_resources->encoders[i]); + if(!encoder) { + continue; + } + for(int j = 0; j < ctx->drm_connector->count_encoders; j++) { + if(encoder->encoder_id == ctx->drm_connector->encoders[j]) { + return encoder; + } + } + drmModeFreeEncoder(encoder); + encoder = NULL; + } + return encoder; +} + +static void * drm_create_window(void * driver_data, const lv_egl_native_window_properties_t * properties) +{ + lv_drm_ctx_t * ctx = (lv_drm_ctx_t *)driver_data; + LV_ASSERT_NULL(ctx->gbm_dev); + + uint32_t format = properties->visual_id; + + if(format == 0) { + LV_LOG_ERROR("Invalid format requested"); + return NULL; + } + ctx->gbm_surface = gbm_surface_create(ctx->gbm_dev, ctx->drm_mode->hdisplay, ctx->drm_mode->vdisplay, format, + GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING); + if(!ctx->gbm_surface) { + LV_LOG_ERROR("Failed to create GBM surface"); + return NULL; + } + return (void *)ctx->gbm_surface; + +} + +static void drm_destroy_window(void * driver_data, void * native_window) +{ + lv_drm_ctx_t * ctx = (lv_drm_ctx_t *)driver_data; + LV_ASSERT(native_window == ctx->gbm_surface); + + if(!ctx->gbm_surface) { + return; + } + + if(ctx->gbm_bo_pending) { + gbm_surface_release_buffer(ctx->gbm_surface, ctx->gbm_bo_pending); + ctx->gbm_bo_pending = NULL; + } + if(ctx->gbm_bo_flipped) { + gbm_surface_release_buffer(ctx->gbm_surface, ctx->gbm_bo_flipped); + ctx->gbm_bo_flipped = NULL; + } + if(ctx->gbm_bo_presented) { + gbm_surface_release_buffer(ctx->gbm_surface, ctx->gbm_bo_presented); + ctx->gbm_bo_presented = NULL; + } + gbm_surface_destroy(ctx->gbm_surface); + ctx->gbm_surface = NULL; +} + + +#endif /*LV_USE_LINUX_DRM && LV_LINUX_DRM_USE_EGL*/ diff --git a/inc/lvgl/src/drivers/display/drm/lv_linux_drm_egl_private.h b/inc/lvgl/src/drivers/display/drm/lv_linux_drm_egl_private.h new file mode 100644 index 0000000..f94572f --- /dev/null +++ b/inc/lvgl/src/drivers/display/drm/lv_linux_drm_egl_private.h @@ -0,0 +1,76 @@ +/** + * @file lv_linux_drm_egl_private.h + * + */ + +#ifndef LV_LINUX_DRM_EGL_PRIVATE_H +#define LV_LINUX_DRM_EGL_PRIVATE_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_LINUX_DRM && LV_LINUX_DRM_USE_EGL + +#include +#include "../../opengles/lv_opengles_texture_private.h" +#include "../../opengles/lv_opengles_egl.h" +#include "../../opengles/lv_opengles_egl_private.h" +#include "lv_linux_drm.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_opengles_texture_t texture; + lv_display_t * display; + lv_opengles_egl_t * egl_ctx; + lv_egl_interface_t egl_interface; + + drmModeRes * drm_resources; + drmModeConnector * drm_connector; + drmModeEncoder * drm_encoder; + drmModeCrtc * drm_crtc; + drmModeModeInfo * drm_mode; + + struct gbm_device * gbm_dev; + struct gbm_surface * gbm_surface; + struct gbm_bo * gbm_bo_pending; + struct gbm_bo * gbm_bo_flipped; + struct gbm_bo * gbm_bo_presented; + + lv_linux_drm_select_mode_cb_t mode_select_cb; + int fd; + bool crtc_isset; +} lv_drm_ctx_t; + + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LINUX_DRM && LV_LINUX_DRM_USE_EGL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + + +#endif /*LV_LINUX_DRM_EGL_PRIVATE_H*/ diff --git a/inc/lvgl/src/drivers/display/fb/lv_linux_fbdev.c b/inc/lvgl/src/drivers/display/fb/lv_linux_fbdev.c new file mode 100644 index 0000000..c78b881 --- /dev/null +++ b/inc/lvgl/src/drivers/display/fb/lv_linux_fbdev.c @@ -0,0 +1,441 @@ +/** + * @file lv_linux_fbdev.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_linux_fbdev.h" +#if LV_USE_LINUX_FBDEV + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if LV_LINUX_FBDEV_BSD + #include + #include + #include +#else + #include +#endif /* LV_LINUX_FBDEV_BSD */ + +#include "../../../display/lv_display_private.h" +#include "../../../draw/sw/lv_draw_sw.h" +#include "../../../misc/lv_area_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct bsd_fb_var_info { + uint32_t xoffset; + uint32_t yoffset; + uint32_t xres; + uint32_t yres; + int bits_per_pixel; +}; + +struct bsd_fb_fix_info { + long int line_length; + long int smem_len; +}; + +typedef struct { + const char * devname; + lv_color_format_t color_format; +#if LV_LINUX_FBDEV_BSD + struct bsd_fb_var_info vinfo; + struct bsd_fb_fix_info finfo; +#else + struct fb_var_screeninfo vinfo; + struct fb_fix_screeninfo finfo; +#endif /* LV_LINUX_FBDEV_BSD */ +#if LV_LINUX_FBDEV_MMAP + char * fbp; +#endif + uint8_t * rotated_buf; + size_t rotated_buf_size; + long int screensize; + int fbfd; + bool force_refresh; + uint8_t * draw_buf_1; + uint8_t * draw_buf_2; +} lv_linux_fb_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void del_event_cb(lv_event_t * e); +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); +static uint32_t tick_get_cb(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#if LV_LINUX_FBDEV_BSD + #define FBIOBLANK FBIO_BLANK +#endif /* LV_LINUX_FBDEV_BSD */ + +#ifndef DIV_ROUND_UP + #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_linux_fbdev_create(void) +{ + lv_tick_set_cb(tick_get_cb); + + lv_linux_fb_t * dsc = lv_malloc_zeroed(sizeof(lv_linux_fb_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(800, 480); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + dsc->fbfd = -1; + lv_display_set_driver_data(disp, dsc); + lv_display_set_flush_cb(disp, flush_cb); + lv_display_add_event_cb(disp, del_event_cb, LV_EVENT_DELETE, NULL); + + return disp; +} + +lv_result_t lv_linux_fbdev_set_file(lv_display_t * disp, const char * file) +{ + char * devname = lv_strdup(file); + LV_ASSERT_MALLOC(devname); + if(devname == NULL) { + return LV_RESULT_INVALID; + } + + lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); + dsc->devname = devname; + + if(dsc->fbfd > 0) close(dsc->fbfd); + + /* Open the file for reading and writing*/ + dsc->fbfd = open(dsc->devname, O_RDWR); + if(dsc->fbfd == -1) { + perror("Error: cannot open framebuffer device"); + return LV_RESULT_INVALID; + } + LV_LOG_INFO("The framebuffer device was opened successfully"); + + /* Make sure that the display is on.*/ + if(ioctl(dsc->fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) { + perror("ioctl(FBIOBLANK)"); + /* Don't return. Some framebuffer drivers like efifb or simplefb don't implement FBIOBLANK.*/ + } + +#if LV_LINUX_FBDEV_BSD + struct fbtype fb; + unsigned line_length; + + /*Get fb type*/ + if(ioctl(dsc->fbfd, FBIOGTYPE, &fb) != 0) { + perror("ioctl(FBIOGTYPE)"); + return LV_RESULT_INVALID; + } + + /*Get screen width*/ + if(ioctl(dsc->fbfd, FBIO_GETLINEWIDTH, &line_length) != 0) { + perror("ioctl(FBIO_GETLINEWIDTH)"); + return LV_RESULT_INVALID; + } + + dsc->vinfo.xres = (unsigned) fb.fb_width; + dsc->vinfo.yres = (unsigned) fb.fb_height; + dsc->vinfo.bits_per_pixel = fb.fb_depth; + dsc->vinfo.xoffset = 0; + dsc->vinfo.yoffset = 0; + dsc->finfo.line_length = line_length; + dsc->finfo.smem_len = dsc->finfo.line_length * dsc->vinfo.yres; +#else /* LV_LINUX_FBDEV_BSD */ + + /* Get fixed screen information*/ + if(ioctl(dsc->fbfd, FBIOGET_FSCREENINFO, &dsc->finfo) == -1) { + perror("Error reading fixed information"); + return LV_RESULT_INVALID; + } + + /* Get variable screen information*/ + if(ioctl(dsc->fbfd, FBIOGET_VSCREENINFO, &dsc->vinfo) == -1) { + perror("Error reading variable information"); + return LV_RESULT_INVALID; + } +#endif /* LV_LINUX_FBDEV_BSD */ + + LV_LOG_INFO("%dx%d, %dbpp", dsc->vinfo.xres, dsc->vinfo.yres, dsc->vinfo.bits_per_pixel); + + /* Figure out the size of the screen in bytes*/ + dsc->screensize = dsc->finfo.smem_len;/*finfo.line_length * vinfo.yres;*/ + +#if LV_LINUX_FBDEV_MMAP + /* Map the device to memory*/ + dsc->fbp = (char *)mmap(0, dsc->screensize, PROT_READ | PROT_WRITE, MAP_SHARED, dsc->fbfd, 0); + if((intptr_t)dsc->fbp == -1) { + perror("Error: failed to map framebuffer device to memory"); + return LV_RESULT_INVALID; + } +#endif + + /* Don't initialise the memory to retain what's currently displayed / avoid clearing the screen. + * This is important for applications that only draw to a subsection of the full framebuffer.*/ + + LV_LOG_INFO("The framebuffer device was mapped to memory successfully"); + + switch(dsc->vinfo.bits_per_pixel) { + case 16: + lv_display_set_color_format(disp, LV_COLOR_FORMAT_RGB565); + break; + case 24: + lv_display_set_color_format(disp, LV_COLOR_FORMAT_RGB888); + break; + case 32: + lv_display_set_color_format(disp, LV_COLOR_FORMAT_XRGB8888); + break; + default: + LV_LOG_WARN("Not supported color format (%d bits)", dsc->vinfo.bits_per_pixel); + return LV_RESULT_INVALID; + } + + int32_t hor_res = dsc->vinfo.xres; + int32_t ver_res = dsc->vinfo.yres; + int32_t width = dsc->vinfo.width; + uint32_t draw_buf_size = hor_res * (dsc->vinfo.bits_per_pixel >> 3); + if(LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { + draw_buf_size *= LV_LINUX_FBDEV_BUFFER_SIZE; + } + else { + draw_buf_size *= ver_res; + } + + uint8_t * draw_buf = NULL; + uint8_t * draw_buf_2 = NULL; + draw_buf = lv_malloc(draw_buf_size); + + if(LV_LINUX_FBDEV_BUFFER_COUNT == 2) { + draw_buf_2 = lv_malloc(draw_buf_size); + } + + dsc->draw_buf_1 = draw_buf; + dsc->draw_buf_2 = draw_buf_2; + + lv_display_set_resolution(disp, hor_res, ver_res); + lv_display_set_buffers(disp, draw_buf, draw_buf_2, draw_buf_size, LV_LINUX_FBDEV_RENDER_MODE); + + if(width > 0) { + lv_display_set_dpi(disp, DIV_ROUND_UP(hor_res * 254, width * 10)); + } + + LV_LOG_INFO("Resolution is set to %" LV_PRId32 "x%" LV_PRId32 " at %" LV_PRId32 "dpi", + hor_res, ver_res, lv_display_get_dpi(disp)); + + return LV_RESULT_OK; +} + +void lv_linux_fbdev_set_force_refresh(lv_display_t * disp, bool enabled) +{ + lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); + dsc->force_refresh = enabled; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void write_to_fb(lv_linux_fb_t * dsc, uint32_t fb_pos, const void * data, size_t sz) +{ +#if LV_LINUX_FBDEV_MMAP + uint8_t * fbp = (uint8_t *)dsc->fbp; + lv_memcpy(&fbp[fb_pos], data, sz); +#else + if(pwrite(dsc->fbfd, data, sz, fb_pos) < 0) + LV_LOG_ERROR("write failed: %d", errno); +#endif +} + +static void del_event_cb(lv_event_t * e) +{ + if(LV_EVENT_DELETE != lv_event_get_code(e)) + return; + + lv_display_t * disp = lv_event_get_target(e); + lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); + if(!dsc) return; + +#if LV_LINUX_FBDEV_MMAP + if(MAP_FAILED != dsc->fbp) { + munmap(dsc->fbp, dsc->screensize); + dsc->fbp = MAP_FAILED; + } +#endif + if(dsc->fbfd >= 0) { + close(dsc->fbfd); + dsc->fbfd = -1; + } + if(dsc->rotated_buf) lv_free(dsc->rotated_buf); + if(dsc->draw_buf_1) lv_free(dsc->draw_buf_1); + if(dsc->draw_buf_2) lv_free(dsc->draw_buf_2); + if(dsc->devname) lv_free((void *)dsc->devname); + + lv_free(dsc); + lv_display_set_driver_data(disp, NULL); +} + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) +{ + lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); + +#if LV_LINUX_FBDEV_MMAP + if(dsc->fbp == NULL) { + lv_display_flush_ready(disp); + return; + } +#endif + + const bool wait_for_last_flush = LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_FULL; + const bool is_last_flush = lv_display_flush_is_last(disp); + const bool skip_flush = wait_for_last_flush && !is_last_flush; + + if(skip_flush) { + lv_display_flush_ready(disp); + return; + } + + const lv_color_format_t cf = lv_display_get_color_format(disp); + const uint32_t px_size = lv_color_format_get_size(cf); + + lv_area_t rotated_area; + const lv_display_rotation_t rotation = lv_display_get_rotation(disp); + + /* Not all framebuffer kernel drivers support hardware rotation, so we need to handle it in software here */ + if(rotation != LV_DISPLAY_ROTATION_0) { + int32_t src_w; + int32_t src_h; + uint32_t src_stride; + + /* Direct render mode rotation only works if we rotate the whole screen at the same time + * To do that, we use the display's resolution and as the area + * we also grab the current draw buffer so that we can rotate the whole display */ + if(LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_DIRECT) { + if(!is_last_flush) { + /* We need to wait for the last flush when using direct render mode with rotation*/ + lv_display_flush_ready(disp); + return; + } + lv_draw_buf_t * draw_buf = lv_display_get_buf_active(disp); + src_w = lv_display_get_horizontal_resolution(disp); + src_h = lv_display_get_vertical_resolution(disp); + src_stride = lv_draw_buf_width_to_stride(src_w, cf); + color_p = draw_buf->data; + rotated_area.x1 = rotated_area.y1 = 0; + lv_area_set_width(&rotated_area, src_w); + lv_area_set_height(&rotated_area, src_h); + } + else { + /* For partial and full render modes, we need to rotate the current area + * In Full mode we will rotate the whole display just like with direct render mode + * but we don't need to do anything special since the area is already the full area of the display + * For Partial mode we will rotate just the part we're currently displaying*/ + src_w = lv_area_get_width(area); + src_h = lv_area_get_height(area); + src_stride = lv_draw_buf_width_to_stride(lv_area_get_width(area), cf); + rotated_area = *area; + } + + lv_display_rotate_area(disp, &rotated_area); + const uint32_t dest_stride = lv_draw_buf_width_to_stride(lv_area_get_width(&rotated_area), cf); + const size_t buf_size = dest_stride * lv_area_get_height(&rotated_area); + if(!dsc->rotated_buf || dsc->rotated_buf_size != buf_size) { + dsc->rotated_buf = lv_realloc(dsc->rotated_buf, buf_size); + LV_ASSERT_MALLOC(dsc->rotated_buf); + dsc->rotated_buf_size = buf_size; + } + lv_draw_sw_rotate(color_p, dsc->rotated_buf, src_w, src_h, src_stride, dest_stride, rotation, cf); + area = &rotated_area; + color_p = dsc->rotated_buf; + } + + lv_area_t display_area; + lv_area_set(&display_area, 0, 0, dsc->vinfo.xres - 1, dsc->vinfo.yres - 1); + + /* Clip the area to the display bounds */ + lv_area_t clipped_area; + if(!lv_area_intersect(&clipped_area, area, &display_area)) { + /* No intersection at all, nothing to render */ + lv_display_flush_ready(disp); + return; + } + + uint32_t fb_pos = + (clipped_area.x1 + dsc->vinfo.xoffset) * px_size + + (clipped_area.y1 + dsc->vinfo.yoffset) * dsc->finfo.line_length; + const int32_t w = lv_area_get_width(&clipped_area); + + if(LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_DIRECT && rotation == LV_DISPLAY_ROTATION_0) { + uint32_t color_pos = + (clipped_area.x1 - disp->offset_x) * px_size + + (clipped_area.y1 - disp->offset_y) * disp->hor_res * px_size; + for(int32_t y = clipped_area.y1; y <= clipped_area.y2; y++) { + write_to_fb(dsc, fb_pos, &color_p[color_pos], w * px_size); + fb_pos += dsc->finfo.line_length; + color_pos += disp->hor_res * px_size; + } + } + else { + /* Calculate offset into color_p buffer based on original area */ + const int32_t x_offset = clipped_area.x1 - area->x1; + const int32_t y_offset = clipped_area.y1 - area->y1; + const int32_t stride = lv_draw_buf_width_to_stride(lv_area_get_width(area), cf); + + color_p += y_offset * stride + x_offset * px_size; + + for(int32_t y = clipped_area.y1; y <= clipped_area.y2; y++) { + write_to_fb(dsc, fb_pos, color_p, w * px_size); + fb_pos += dsc->finfo.line_length; + color_p += stride; + } + } + + if(dsc->force_refresh) { + dsc->vinfo.activate |= FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; + if(ioctl(dsc->fbfd, FBIOPUT_VSCREENINFO, &(dsc->vinfo)) == -1) { + perror("Error setting var screen info"); + } + } + + lv_display_flush_ready(disp); +} + +static uint32_t tick_get_cb(void) +{ + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + uint64_t time_ms = t.tv_sec * 1000 + (t.tv_nsec / 1000000); + return time_ms; +} + +#endif /*LV_USE_LINUX_FBDEV*/ diff --git a/inc/lvgl/src/drivers/display/fb/lv_linux_fbdev.h b/inc/lvgl/src/drivers/display/fb/lv_linux_fbdev.h new file mode 100644 index 0000000..a9b7be0 --- /dev/null +++ b/inc/lvgl/src/drivers/display/fb/lv_linux_fbdev.h @@ -0,0 +1,52 @@ +/** + * @file lv_linux_fbdev.h + * + */ + +#ifndef LV_LINUX_FBDEV_H +#define LV_LINUX_FBDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../display/lv_display.h" + +#if LV_USE_LINUX_FBDEV + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_display_t * lv_linux_fbdev_create(void); + +lv_result_t lv_linux_fbdev_set_file(lv_display_t * disp, const char * file); + +/** + * Force the display to be refreshed on every change. + * Expected to be used with LV_DISPLAY_RENDER_MODE_DIRECT or LV_DISPLAY_RENDER_MODE_FULL. + */ +void lv_linux_fbdev_set_force_refresh(lv_display_t * disp, bool enabled); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LINUX_FBDEV */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_LINUX_FBDEV_H */ diff --git a/inc/lvgl/src/drivers/display/ft81x/lv_ft81x.c b/inc/lvgl/src/drivers/display/ft81x/lv_ft81x.c new file mode 100644 index 0000000..2013d4a --- /dev/null +++ b/inc/lvgl/src/drivers/display/ft81x/lv_ft81x.c @@ -0,0 +1,399 @@ +/** + * @file lv_ft81x.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_ft81x.h" +#if LV_USE_FT81X + +#include "lv_ft81x_defines.h" + +#include "../../../stdlib/lv_mem.h" +#include "../../../stdlib/lv_sprintf.h" +#include "../../../stdlib/lv_string.h" +#include "../../../misc/lv_types.h" +#include "../../../misc/lv_utils.h" + +/********************* + * DEFINES + *********************/ + +/* Increase as functionality is added if needed. */ +#define LV_FT81X_CMD_BUF_SIZE 63 + +/* The PWM value that corresponds to the backlight being "on". + 0x80 was found to work on at least two boards but should + be changed as needed. */ +#define PWM_DUTY_BACKLIGHT_ON 0x80 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_ft81x_spi_cb_t spi_cb; + void * user_data; + uint16_t cmd_offset; +} lv_ft81x_driver_data_t; + +typedef struct { + uint32_t buf_len; + uint8_t buf[LV_FT81X_CMD_BUF_SIZE]; +} lv_ft81x_cmd_list_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t initialize(lv_display_t * disp, const lv_ft81x_parameters_t * params); +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void delete_cb(lv_event_t * e); +static void lv_ft81x_cmd(lv_display_t * disp, uint8_t command, uint8_t parameter); +static uint8_t lv_ft81x_read_8(lv_display_t * disp, uint32_t address); +static uint16_t lv_ft81x_read_16(lv_display_t * disp, uint32_t address); +/* static uint32_t lv_ft81x_read_32(lv_display_t * disp, uint32_t address); */ +static void lv_ft81x_write_8(lv_display_t * disp, uint32_t address, uint8_t val); +static void lv_ft81x_write_16(lv_display_t * disp, uint32_t address, uint16_t val); +static void lv_ft81x_write_32(lv_display_t * disp, uint32_t address, uint32_t val); +static void lv_ft81x_cmd_list_init(lv_display_t * disp, lv_ft81x_cmd_list_t * cmd_list); +static void lv_ft81x_cmd_list_add_16(lv_display_t * disp, lv_ft81x_cmd_list_t * cmd_list, uint16_t value); +static void lv_ft81x_cmd_list_add_32(lv_display_t * disp, lv_ft81x_cmd_list_t * cmd_list, uint32_t value); +static void lv_ft81x_cmd_list_send(lv_display_t * disp, lv_ft81x_cmd_list_t * cmd_list); +static void lv_ft81x_encode_read_address(void * dst_4_bytes, uint32_t address); +static void lv_ft81x_encode_write_address(void * dst_3_bytes, uint32_t address); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#if LV_BIG_ENDIAN_SYSTEM + #define BE_TO_OR_FROM_NATIVE_32(x) ((uint32_t)(x)) + #define BE_TO_OR_FROM_NATIVE_16(x) ((uint16_t)(x)) + #define LE_TO_OR_FROM_NATIVE_32(x) lv_swap_bytes_32(x) + #define LE_TO_OR_FROM_NATIVE_16(x) lv_swap_bytes_16(x) +#else + #define BE_TO_OR_FROM_NATIVE_32(x) lv_swap_bytes_32(x) + #define BE_TO_OR_FROM_NATIVE_16(x) lv_swap_bytes_16(x) + #define LE_TO_OR_FROM_NATIVE_32(x) ((uint32_t)(x)) + #define LE_TO_OR_FROM_NATIVE_16(x) ((uint16_t)(x)) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_ft81x_create(const lv_ft81x_parameters_t * params, void * partial_buf, uint32_t buf_size, + lv_ft81x_spi_cb_t spi_cb, void * user_data) +{ + LV_ASSERT_NULL(spi_cb); + + lv_display_t * disp = lv_display_create(params->hor_res, params->ver_res); + + lv_ft81x_driver_data_t * drv = lv_malloc_zeroed(sizeof(lv_ft81x_driver_data_t)); + LV_ASSERT_MALLOC(drv); + drv->spi_cb = spi_cb; + drv->user_data = user_data; + drv->cmd_offset = 0; + lv_display_set_driver_data(disp, drv); + lv_display_set_flush_cb(disp, flush_cb); + lv_display_set_color_format(disp, LV_COLOR_FORMAT_RGB565); + lv_display_set_buffers(disp, partial_buf, NULL, buf_size, LV_DISPLAY_RENDER_MODE_PARTIAL); + lv_display_add_event_cb(disp, delete_cb, LV_EVENT_DELETE, NULL); + + lv_result_t init_res = initialize(disp, params); + if(init_res != LV_RESULT_OK) { + lv_display_delete(disp); + return NULL; + } + + return disp; +} + +void * lv_ft81x_get_user_data(lv_display_t * disp) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + return drv->user_data; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t initialize(lv_display_t * disp, const lv_ft81x_parameters_t * params) +{ + lv_ft81x_cmd(disp, params->has_crystal ? EVE_CLKEXT : EVE_CLKINT, 0); + if(params->is_bt81x) lv_ft81x_cmd(disp, EVE_CLKSEL, 0x46); + lv_ft81x_cmd(disp, EVE_ACTIVE, 0); + + /* at least 40 ms is needed for EVE to become ready. */ + lv_delay_ms(40); + + uint32_t start_millis = lv_tick_get(); + while(lv_ft81x_read_8(disp, REG_ID) != 0x7c) { + if(lv_tick_get() - start_millis > 1000) { + LV_LOG_ERROR("failed to read 0x7C from the ID register 1000 ms after activation."); + return LV_RESULT_INVALID; + } + lv_delay_ms(1); + }; + + start_millis = lv_tick_get(); + while(lv_ft81x_read_8(disp, REG_CPURESET) & 0x03) { + if(lv_tick_get() - start_millis > 1000) { + LV_LOG_ERROR("CPURESET register coprocessor and touch engines not in \"working status\" 1000 ms after activation."); + return LV_RESULT_INVALID; + } + lv_delay_ms(1); + }; + + if(params->is_bt81x) lv_ft81x_write_32(disp, REG_FREQUENCY, 72000000); + + lv_ft81x_write_8(disp, REG_PWM_DUTY, PWM_DUTY_BACKLIGHT_ON); + + lv_ft81x_write_16(disp, REG_HSIZE, params->hor_res); /* active display width */ + lv_ft81x_write_16(disp, REG_HCYCLE, params->hcycle); /* total number of clocks per line, incl front/back porch */ + lv_ft81x_write_16(disp, REG_HOFFSET, params->hoffset); /* start of active line */ + lv_ft81x_write_16(disp, REG_HSYNC0, params->hsync0); /* start of horizontal sync pulse */ + lv_ft81x_write_16(disp, REG_HSYNC1, params->hsync1); /* end of horizontal sync pulse */ + lv_ft81x_write_16(disp, REG_VSIZE, params->ver_res); /* active display height */ + lv_ft81x_write_16(disp, REG_VCYCLE, params->vcycle); /* total number of lines per screen, including pre/post */ + lv_ft81x_write_16(disp, REG_VOFFSET, params->voffset); /* start of active screen */ + lv_ft81x_write_16(disp, REG_VSYNC0, params->vsync0); /* start of vertical sync pulse */ + lv_ft81x_write_16(disp, REG_VSYNC1, params->vsync1); /* end of vertical sync pulse */ + lv_ft81x_write_8(disp, REG_SWIZZLE, params->swizzle); /* FT8xx output to LCD - pin order */ + lv_ft81x_write_8(disp, REG_PCLK_POL, params->pclkpol); /* LCD data is clocked in on this PCLK edge */ + lv_ft81x_write_8(disp, REG_CSPREAD, + params->cspread); /* helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ + + /* write a basic display-list to get things started */ + lv_ft81x_write_32(disp, EVE_RAM_DL, DL_CLEAR_RGB); + lv_ft81x_write_32(disp, EVE_RAM_DL + 4, (DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG)); + lv_ft81x_write_32(disp, EVE_RAM_DL + 8, DL_DISPLAY); /* end of display list */ + lv_ft81x_write_32(disp, REG_DLSWAP, EVE_DLSWAP_FRAME); + + /* nothing is being displayed yet... the pixel clock is still 0x00 */ + lv_ft81x_write_8(disp, REG_GPIO, + 0x80); /* enable the DISP signal to the LCD panel, it is set to output in REG_GPIO_DIR by default */ + lv_ft81x_write_8(disp, REG_PCLK, params->pclk); /* now start clocking data to the LCD panel */ + + LV_ASSERT(lv_ft81x_read_16(disp, REG_CMD_READ) != 0xfff); + + LV_ASSERT(0 == lv_ft81x_read_16(disp, REG_CMD_WRITE)); + + + lv_ft81x_cmd_list_t cmd_list; + lv_ft81x_cmd_list_init(disp, &cmd_list); + lv_ft81x_cmd_list_add_32(disp, &cmd_list, CMD_MEMSET); + lv_ft81x_cmd_list_add_32(disp, &cmd_list, 0); /* address */ + lv_ft81x_cmd_list_add_32(disp, &cmd_list, 0x00); /* val */ + lv_ft81x_cmd_list_add_32(disp, &cmd_list, 2 * params->hor_res * params->ver_res); /* count */ + lv_ft81x_cmd_list_send(disp, &cmd_list); + + lv_ft81x_cmd_list_init(disp, &cmd_list); + + lv_ft81x_cmd_list_add_32(disp, &cmd_list, CMD_DLSTART); + + lv_ft81x_cmd_list_add_32(disp, &cmd_list, DL_CLEAR_RGB | 0); /* clear to black */ + lv_ft81x_cmd_list_add_32(disp, &cmd_list, DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); + + lv_ft81x_cmd_list_add_32(disp, &cmd_list, TAG(0)); + + lv_ft81x_cmd_list_add_32(disp, &cmd_list, TAG(20)); + lv_ft81x_cmd_list_add_32(disp, &cmd_list, CMD_SETBITMAP); + lv_ft81x_cmd_list_add_32(disp, &cmd_list, 0); /* address */ + lv_ft81x_cmd_list_add_16(disp, &cmd_list, EVE_RGB565); + lv_ft81x_cmd_list_add_16(disp, &cmd_list, params->hor_res); + lv_ft81x_cmd_list_add_16(disp, &cmd_list, params->ver_res); + lv_ft81x_cmd_list_add_16(disp, &cmd_list, 0); + + lv_ft81x_cmd_list_add_32(disp, &cmd_list, DL_BEGIN | EVE_BITMAPS); + lv_ft81x_cmd_list_add_32(disp, &cmd_list, VERTEX2F(0, 0)); + lv_ft81x_cmd_list_add_32(disp, &cmd_list, DL_END); + + lv_ft81x_cmd_list_add_32(disp, &cmd_list, TAG(0)); + + lv_ft81x_cmd_list_add_32(disp, &cmd_list, DL_DISPLAY); + + lv_ft81x_cmd_list_add_32(disp, &cmd_list, CMD_SWAP); + + lv_ft81x_cmd_list_send(disp, &cmd_list); + + + return LV_RESULT_OK; +} + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + + if(drv->spi_cb == NULL) { + LV_LOG_ERROR("The SPI callback is NULL."); + return; + } + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + uint32_t disp_row_bytes = hor_res * 2; + + uint32_t address = disp_row_bytes * area->y1 + area->x1 * 2; + uint8_t encoded_address[3]; + + if(lv_area_get_width(area) == hor_res) { + lv_ft81x_encode_write_address(encoded_address, address); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_ASSERT, NULL, 0); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, encoded_address, sizeof(encoded_address)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, px_map, lv_area_get_size(area) * 2); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_DEASSERT, NULL, 0); + } + else { + uint32_t area_height = lv_area_get_height(area); + uint32_t area_row_bytes = lv_area_get_width(area) * 2; + for(uint32_t i = 0; i < area_height; i++) { + lv_ft81x_encode_write_address(encoded_address, address); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_ASSERT, NULL, 0); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, encoded_address, sizeof(encoded_address)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, px_map, area_row_bytes); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_DEASSERT, NULL, 0); + address += disp_row_bytes; + px_map += area_row_bytes; + } + } + + lv_display_flush_ready(disp); +} + +static void delete_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_target(e); + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + lv_free(drv); +} + +static void lv_ft81x_cmd(lv_display_t * disp, uint8_t command, uint8_t parameter) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + uint8_t data[3] = {command, parameter, 0x00}; + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_ASSERT, NULL, 0); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, data, sizeof(data)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_DEASSERT, NULL, 0); +} + +static uint8_t lv_ft81x_read_8(lv_display_t * disp, uint32_t address) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + lv_ft81x_encode_read_address(&address, address); + uint8_t val; + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_ASSERT, NULL, 0); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, &address, sizeof(address)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_RECEIVE, &val, sizeof(val)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_DEASSERT, NULL, 0); + return val; +} + +static uint16_t lv_ft81x_read_16(lv_display_t * disp, uint32_t address) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + lv_ft81x_encode_read_address(&address, address); + uint16_t val; + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_ASSERT, NULL, 0); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, &address, sizeof(address)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_RECEIVE, &val, sizeof(val)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_DEASSERT, NULL, 0); + val = LE_TO_OR_FROM_NATIVE_16(val); + return val; +} + +static void lv_ft81x_write_8(lv_display_t * disp, uint32_t address, uint8_t val) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + uint8_t data[4]; + lv_ft81x_encode_write_address(data, address); + data[3] = val; + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_ASSERT, NULL, 0); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, data, sizeof(data)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_DEASSERT, NULL, 0); +} + +static void lv_ft81x_write_16(lv_display_t * disp, uint32_t address, uint16_t val) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + val = LE_TO_OR_FROM_NATIVE_16(val); + uint8_t data[5]; + lv_ft81x_encode_write_address(data, address); + lv_memcpy(data + 3, &val, 2); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_ASSERT, NULL, 0); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, data, sizeof(data)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_DEASSERT, NULL, 0); +} + +static void lv_ft81x_write_32(lv_display_t * disp, uint32_t address, uint32_t val) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + val = LE_TO_OR_FROM_NATIVE_32(val); + uint8_t data[7]; + lv_ft81x_encode_write_address(data, address); + lv_memcpy(data + 3, &val, 4); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_ASSERT, NULL, 0); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, data, sizeof(data)); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_DEASSERT, NULL, 0); +} + +static void lv_ft81x_cmd_list_init(lv_display_t * disp, lv_ft81x_cmd_list_t * cmd_list) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + LV_ASSERT_MSG(LV_FT81X_CMD_BUF_SIZE >= 3, "increase LV_FT81X_CMD_BUF_SIZE as needed"); + lv_ft81x_encode_write_address(cmd_list->buf, EVE_RAM_CMD + drv->cmd_offset); + cmd_list->buf_len = 3; +} + +static void lv_ft81x_cmd_list_add_16(lv_display_t * disp, lv_ft81x_cmd_list_t * cmd_list, uint16_t value) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + uint8_t * buf_dst = &cmd_list->buf[cmd_list->buf_len]; + cmd_list->buf_len += 2; + LV_ASSERT_MSG(cmd_list->buf_len <= LV_FT81X_CMD_BUF_SIZE, "increase LV_FT81X_CMD_BUF_SIZE as needed"); + value = LE_TO_OR_FROM_NATIVE_16(value); + lv_memcpy(buf_dst, &value, 2); + drv->cmd_offset = (drv->cmd_offset + 2) & 0xfff; /* circular */ +} + +static void lv_ft81x_cmd_list_add_32(lv_display_t * disp, lv_ft81x_cmd_list_t * cmd_list, uint32_t value) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + uint8_t * buf_dst = &cmd_list->buf[cmd_list->buf_len]; + cmd_list->buf_len += 4; + LV_ASSERT_MSG(cmd_list->buf_len <= LV_FT81X_CMD_BUF_SIZE, "increase LV_FT81X_CMD_BUF_SIZE as needed"); + value = LE_TO_OR_FROM_NATIVE_32(value); + lv_memcpy(buf_dst, &value, 4); + drv->cmd_offset = (drv->cmd_offset + 4) & 0xfff; /* circular */ +} + +static void lv_ft81x_cmd_list_send(lv_display_t * disp, lv_ft81x_cmd_list_t * cmd_list) +{ + lv_ft81x_driver_data_t * drv = lv_display_get_driver_data(disp); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_ASSERT, NULL, 0); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_SEND, cmd_list->buf, cmd_list->buf_len); + drv->spi_cb(disp, LV_FT81X_SPI_OPERATION_CS_DEASSERT, NULL, 0); + lv_ft81x_write_16(disp, REG_CMD_WRITE, drv->cmd_offset); +} + +static void lv_ft81x_encode_read_address(void * dst_4_bytes, uint32_t address) +{ + address = BE_TO_OR_FROM_NATIVE_32(address << 8); + lv_memcpy(dst_4_bytes, &address, 4); +} + +static void lv_ft81x_encode_write_address(void * dst_3_bytes, uint32_t address) +{ + address = BE_TO_OR_FROM_NATIVE_32((address | 0x800000) << 8); + lv_memcpy(dst_3_bytes, &address, 3); +} + +#endif /*LV_USE_FT81X*/ diff --git a/inc/lvgl/src/drivers/display/ft81x/lv_ft81x.h b/inc/lvgl/src/drivers/display/ft81x/lv_ft81x.h new file mode 100644 index 0000000..05899ee --- /dev/null +++ b/inc/lvgl/src/drivers/display/ft81x/lv_ft81x.h @@ -0,0 +1,94 @@ +/** + * @file lv_ft81x.h + * + */ + +#ifndef LV_FT81X_H +#define LV_FT81X_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_FT81X + +#include "../../../display/lv_display.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint16_t hor_res; /**< active display width */ + uint16_t ver_res; /**< active display height */ + + uint16_t hcycle; /**< total number of clocks per line, incl front/back porch */ + uint16_t hoffset; /**< start of active line */ + uint16_t hsync0; /**< start of horizontal sync pulse */ + uint16_t hsync1; /**< end of horizontal sync pulse */ + uint16_t vcycle; /**< total number of lines per screen, including pre/post */ + uint16_t voffset; /**< start of active screen */ + uint16_t vsync0; /**< start of vertical sync pulse */ + uint16_t vsync1; /**< end of vertical sync pulse */ + uint8_t swizzle; /**< FT8xx output to LCD - pin order */ + uint8_t pclkpol; /**< LCD data is clocked in on this PCLK edge */ + uint8_t cspread; /**< helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ + uint8_t pclk; /**< 60MHz / pclk = pclk frequency */ + + bool has_crystal; /**< has an external clock crystal */ + bool is_bt81x; /**< is a BT series model, not FT */ +} lv_ft81x_parameters_t; + +typedef enum { + LV_FT81X_SPI_OPERATION_CS_ASSERT, + LV_FT81X_SPI_OPERATION_CS_DEASSERT, + LV_FT81X_SPI_OPERATION_SEND, + LV_FT81X_SPI_OPERATION_RECEIVE +} lv_ft81x_spi_operation_t; + +typedef void (*lv_ft81x_spi_cb_t)(lv_display_t * disp, lv_ft81x_spi_operation_t operation, void * data, + uint32_t length); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a framebuffer-based ft81x driver display. + * @param params pointer to a struct of display panel properties. does not need to be static. + * @param partial_buf a single partial buffer + * @param buf_size size of the partial buffer + * @param spi_cb a callback called by the driver to perform SPI operations + * @param user_data use `lv_ft81x_get_user_data` to get this pointer inside the SPI callback + * @return pointer to the display + */ +lv_display_t * lv_ft81x_create(const lv_ft81x_parameters_t * params, void * partial_buf, uint32_t buf_size, + lv_ft81x_spi_cb_t spi_cb, void * user_data); + +/** + * Get the `user_data` parameter that was passed to `lv_ft81x_create`. Useful in the SPI callback. + * @param disp pointer to the ft81x display + * @return the `user_data` pointer + */ +void * lv_ft81x_get_user_data(lv_display_t * disp); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FT81X*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FT81X_H*/ diff --git a/inc/lvgl/src/drivers/display/ft81x/lv_ft81x_defines.h b/inc/lvgl/src/drivers/display/ft81x/lv_ft81x_defines.h new file mode 100644 index 0000000..9a81cd6 --- /dev/null +++ b/inc/lvgl/src/drivers/display/ft81x/lv_ft81x_defines.h @@ -0,0 +1,846 @@ +/** + * @file lv_ft81x_defines.h + * + * Copied from https://github.com/lvgl/lvgl_esp32_drivers/blob/9fed1cc47b5a45fec6bae08b55d2147d3b50260c/lvgl_tft/EVE.h + */ + +#ifndef LV_FT81X_DEFINES_H +#define LV_FT81X_DEFINES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/* ft81x and ft80x each define exclusive + * definitions. Define ft81x for now. + * + * bt81x is a superset of ft81x and ft80x. + * Don't define it since its special + * definitions are not required to use it. + */ +#define FT81X_ENABLE +/* #define BT81X_ENABLE */ + + +#define DL_CLEAR 0x26000000UL /* requires OR'd arguments */ +#define DL_CLEAR_RGB 0x02000000UL /* requires OR'd arguments */ +#define DL_COLOR_RGB 0x04000000UL /* requires OR'd arguments */ +#define DL_POINT_SIZE 0x0D000000UL /* requires OR'd arguments */ +#define DL_END 0x21000000UL +#define DL_BEGIN 0x1F000000UL /* requires OR'd arguments */ +#define DL_DISPLAY 0x00000000UL + +#define CLR_COL 0x4 +#define CLR_STN 0x2 +#define CLR_TAG 0x1 + +/* SPI SIO/DIO/QIO transfer widths */ +#define SPI_WIDTH_SIO 0x0 +#define SPI_WIDTH_DIO 0x1 +#define SPI_WIDTH_QIO 0x2 + + +/* Host commands */ +#define EVE_ACTIVE 0x00 /* place FT8xx in active state */ +#define EVE_STANDBY 0x41 /* place FT8xx in Standby (clk running) */ +#define EVE_SLEEP 0x42 /* place FT8xx in Sleep (clk off) */ +#define EVE_PWRDOWN 0x50 /* place FT8xx in Power Down (core off) */ +#define EVE_CLKEXT 0x44 /* select external clock source */ +#define EVE_CLKINT 0x48 /* select internal clock source */ +#define EVE_CORERST 0x68 /* reset core - all registers default and processors reset */ +#define EVE_CLK48M 0x62 /* select 48MHz PLL output */ +#define EVE_CLK36M 0x61 /* select 36MHz PLL output */ + + +/* defines used for graphics commands */ +#define EVE_NEVER 0UL +#define EVE_LESS 1UL +#define EVE_LEQUAL 2UL +#define EVE_GREATER 3UL +#define EVE_GEQUAL 4UL +#define EVE_EQUAL 5UL +#define EVE_NOTEQUAL 6UL +#define EVE_ALWAYS 7UL + + +/* Bitmap formats */ +#define EVE_ARGB1555 0UL +#define EVE_L1 1UL +#define EVE_L4 2UL +#define EVE_L8 3UL +#define EVE_RGB332 4UL +#define EVE_ARGB2 5UL +#define EVE_ARGB4 6UL +#define EVE_RGB565 7UL +#define EVE_PALETTED 8UL +#define EVE_TEXT8X8 9UL +#define EVE_TEXTVGA 10UL +#define EVE_BARGRAPH 11UL + + +/* Bitmap filter types */ +#define EVE_NEAREST 0UL +#define EVE_BILINEAR 1UL + + +/* Bitmap wrap types */ +#define EVE_BORDER 0UL +#define EVE_REPEAT 1UL + + +/* Stencil defines */ +#define EVE_KEEP 1UL +#define EVE_REPLACE 2UL +#define EVE_INCR 3UL +#define EVE_DECR 4UL +#define EVE_INVERT 5UL + + +/* Graphics display list swap defines */ +#define EVE_DLSWAP_DONE 0UL +#define EVE_DLSWAP_LINE 1UL +#define EVE_DLSWAP_FRAME 2UL + + +/* Interrupt bits */ +#define EVE_INT_SWAP 0x01 +#define EVE_INT_TOUCH 0x02 +#define EVE_INT_TAG 0x04 +#define EVE_INT_SOUND 0x08 +#define EVE_INT_PLAYBACK 0x10 +#define EVE_INT_CMDEMPTY 0x20 +#define EVE_INT_CMDFLAG 0x40 +#define EVE_INT_CONVCOMPLETE 0x80 + + +/* Touch mode */ +#define EVE_TMODE_OFF 0 +#define EVE_TMODE_ONESHOT 1 +#define EVE_TMODE_FRAME 2 +#define EVE_TMODE_CONTINUOUS 3 + + +/* Alpha blending */ +#define EVE_ZERO 0UL +#define EVE_ONE 1UL +#define EVE_SRC_ALPHA 2UL +#define EVE_DST_ALPHA 3UL +#define EVE_ONE_MINUS_SRC_ALPHA 4UL +#define EVE_ONE_MINUS_DST_ALPHA 5UL + + +/* Graphics primitives */ +#define EVE_BITMAPS 1UL +#define EVE_POINTS 2UL +#define EVE_LINES 3UL +#define EVE_LINE_STRIP 4UL +#define EVE_EDGE_STRIP_R 5UL +#define EVE_EDGE_STRIP_L 6UL +#define EVE_EDGE_STRIP_A 7UL +#define EVE_EDGE_STRIP_B 8UL +#define EVE_RECTS 9UL + + +/* Widget command */ +#define EVE_OPT_MONO 1 +#define EVE_OPT_NODL 2 +#define EVE_OPT_FLAT 256 +#define EVE_OPT_CENTERX 512 +#define EVE_OPT_CENTERY 1024 +#define EVE_OPT_CENTER (EVE_OPT_CENTERX | EVE_OPT_CENTERY) +#define EVE_OPT_NOBACK 4096 +#define EVE_OPT_NOTICKS 8192 +#define EVE_OPT_NOHM 16384 +#define EVE_OPT_NOPOINTER 16384 +#define EVE_OPT_NOSECS 32768 +#define EVE_OPT_NOHANDS 49152 +#define EVE_OPT_RIGHTX 2048 +#define EVE_OPT_SIGNED 256 + + +/* Defines related to inbuilt font */ +#define EVE_NUMCHAR_PERFONT (128L) /* number of font characters per bitmap handle */ +#define EVE_FONT_TABLE_SIZE (148L) /* size of the font table - utilized for lookup by the graphics engine */ +#define EVE_FONT_TABLE_POINTER (0xFFFFCUL) /* pointer to the inbuilt font tables starting from bitmap handle 16 */ + + +/* Audio sample type defines */ +#define EVE_LINEAR_SAMPLES 0UL /* 8bit signed samples */ +#define EVE_ULAW_SAMPLES 1UL /* 8bit ulaw samples */ +#define EVE_ADPCM_SAMPLES 2UL /* 4bit ima adpcm samples */ + + +/* Synthesized sound */ +#define EVE_SILENCE 0x00 +#define EVE_SQUAREWAVE 0x01 +#define EVE_SINEWAVE 0x02 +#define EVE_SAWTOOTH 0x03 +#define EVE_TRIANGLE 0x04 +#define EVE_BEEPING 0x05 +#define EVE_ALARM 0x06 +#define EVE_WARBLE 0x07 +#define EVE_CAROUSEL 0x08 +#define EVE_PIPS(n) (0x0F + (n)) +#define EVE_HARP 0x40 +#define EVE_XYLOPHONE 0x41 +#define EVE_TUBA 0x42 +#define EVE_GLOCKENSPIEL 0x43 +#define EVE_ORGAN 0x44 +#define EVE_TRUMPET 0x45 +#define EVE_PIANO 0x46 +#define EVE_CHIMES 0x47 +#define EVE_MUSICBOX 0x48 +#define EVE_BELL 0x49 +#define EVE_CLICK 0x50 +#define EVE_SWITCH 0x51 +#define EVE_COWBELL 0x52 +#define EVE_NOTCH 0x53 +#define EVE_HIHAT 0x54 +#define EVE_KICKDRUM 0x55 +#define EVE_POP 0x56 +#define EVE_CLACK 0x57 +#define EVE_CHACK 0x58 +#define EVE_MUTE 0x60 +#define EVE_UNMUTE 0x61 + + +/* Synthesized sound frequencies, midi note */ +#define EVE_MIDI_A0 21 +#define EVE_MIDI_A_0 22 +#define EVE_MIDI_B0 23 +#define EVE_MIDI_C1 24 +#define EVE_MIDI_C_1 25 +#define EVE_MIDI_D1 26 +#define EVE_MIDI_D_1 27 +#define EVE_MIDI_E1 28 +#define EVE_MIDI_F1 29 +#define EVE_MIDI_F_1 30 +#define EVE_MIDI_G1 31 +#define EVE_MIDI_G_1 32 +#define EVE_MIDI_A1 33 +#define EVE_MIDI_A_1 34 +#define EVE_MIDI_B1 35 +#define EVE_MIDI_C2 36 +#define EVE_MIDI_C_2 37 +#define EVE_MIDI_D2 38 +#define EVE_MIDI_D_2 39 +#define EVE_MIDI_E2 40 +#define EVE_MIDI_F2 41 +#define EVE_MIDI_F_2 42 +#define EVE_MIDI_G2 43 +#define EVE_MIDI_G_2 44 +#define EVE_MIDI_A2 45 +#define EVE_MIDI_A_2 46 +#define EVE_MIDI_B2 47 +#define EVE_MIDI_C3 48 +#define EVE_MIDI_C_3 49 +#define EVE_MIDI_D3 50 +#define EVE_MIDI_D_3 51 +#define EVE_MIDI_E3 52 +#define EVE_MIDI_F3 53 +#define EVE_MIDI_F_3 54 +#define EVE_MIDI_G3 55 +#define EVE_MIDI_G_3 56 +#define EVE_MIDI_A3 57 +#define EVE_MIDI_A_3 58 +#define EVE_MIDI_B3 59 +#define EVE_MIDI_C4 60 +#define EVE_MIDI_C_4 61 +#define EVE_MIDI_D4 62 +#define EVE_MIDI_D_4 63 +#define EVE_MIDI_E4 64 +#define EVE_MIDI_F4 65 +#define EVE_MIDI_F_4 66 +#define EVE_MIDI_G4 67 +#define EVE_MIDI_G_4 68 +#define EVE_MIDI_A4 69 +#define EVE_MIDI_A_4 70 +#define EVE_MIDI_B4 71 +#define EVE_MIDI_C5 72 +#define EVE_MIDI_C_5 73 +#define EVE_MIDI_D5 74 +#define EVE_MIDI_D_5 75 +#define EVE_MIDI_E5 76 +#define EVE_MIDI_F5 77 +#define EVE_MIDI_F_5 78 +#define EVE_MIDI_G5 79 +#define EVE_MIDI_G_5 80 +#define EVE_MIDI_A5 81 +#define EVE_MIDI_A_5 82 +#define EVE_MIDI_B5 83 +#define EVE_MIDI_C6 84 +#define EVE_MIDI_C_6 85 +#define EVE_MIDI_D6 86 +#define EVE_MIDI_D_6 87 +#define EVE_MIDI_E6 88 +#define EVE_MIDI_F6 89 +#define EVE_MIDI_F_6 90 +#define EVE_MIDI_G6 91 +#define EVE_MIDI_G_6 92 +#define EVE_MIDI_A6 93 +#define EVE_MIDI_A_6 94 +#define EVE_MIDI_B6 95 +#define EVE_MIDI_C7 96 +#define EVE_MIDI_C_7 97 +#define EVE_MIDI_D7 98 +#define EVE_MIDI_D_7 99 +#define EVE_MIDI_E7 100 +#define EVE_MIDI_F7 101 +#define EVE_MIDI_F_7 102 +#define EVE_MIDI_G7 103 +#define EVE_MIDI_G_7 104 +#define EVE_MIDI_A7 105 +#define EVE_MIDI_A_7 106 +#define EVE_MIDI_B7 107 +#define EVE_MIDI_C8 108 + + +/* GPIO bits */ +#define EVE_GPIO0 0 +#define EVE_GPIO1 1 /* default gpio pin for audio shutdown, 1 - enable, 0 - disable */ +#define EVE_GPIO7 7 /* default gpio pin for display enable, 1 - enable, 0 - disable */ + + +/* Display rotation */ +#define EVE_DISPLAY_0 0 /* 0 degrees rotation */ +#define EVE_DISPLAY_180 1 /* 180 degrees rotation */ + + +/* commands common to EVE/EVE2/EVE3 */ +#define CMD_APPEND 0xFFFFFF1E +#define CMD_BGCOLOR 0xFFFFFF09 +#define CMD_BUTTON 0xFFFFFF0D +#define CMD_CALIBRATE 0xFFFFFF15 +#define CMD_CLOCK 0xFFFFFF14 +#define CMD_COLDSTART 0xFFFFFF32 +#define CMD_DIAL 0xFFFFFF2D +#define CMD_DLSTART 0xFFFFFF00 +#define CMD_FGCOLOR 0xFFFFFF0A +#define CMD_GAUGE 0xFFFFFF13 +#define CMD_GETMATRIX 0xFFFFFF33 +#define CMD_GETPROPS 0xFFFFFF25 +#define CMD_GETPTR 0xFFFFFF23 +#define CMD_GRADCOLOR 0xFFFFFF34 +#define CMD_GRADIENT 0xFFFFFF0B +#define CMD_INFLATE 0xFFFFFF22 +#define CMD_INTERRUPT 0xFFFFFF02 +#define CMD_KEYS 0xFFFFFF0E +#define CMD_LOADIDENTITY 0xFFFFFF26 +#define CMD_LOADIMAGE 0xFFFFFF24 +#define CMD_LOGO 0xFFFFFF31 +#define CMD_MEMCPY 0xFFFFFF1D +#define CMD_MEMCRC 0xFFFFFF18 +#define CMD_MEMSET 0xFFFFFF1B +#define CMD_MEMWRITE 0xFFFFFF1A +#define CMD_MEMZERO 0xFFFFFF1C +#define CMD_NUMBER 0xFFFFFF2E +#define CMD_PROGRESS 0xFFFFFF0F +#define CMD_REGREAD 0xFFFFFF19 +#define CMD_ROTATE 0xFFFFFF29 +#define CMD_SCALE 0xFFFFFF28 +#define CMD_SCREENSAVER 0xFFFFFF2F +#define CMD_SCROLLBAR 0xFFFFFF11 +#define CMD_SETFONT 0xFFFFFF2B +#define CMD_SETMATRIX 0xFFFFFF2A +#define CMD_SKETCH 0xFFFFFF30 +#define CMD_SLIDER 0xFFFFFF10 +#define CMD_SNAPSHOT 0xFFFFFF1F +#define CMD_SPINNER 0xFFFFFF16 +#define CMD_STOP 0xFFFFFF17 +#define CMD_SWAP 0xFFFFFF01 +#define CMD_TEXT 0xFFFFFF0C +#define CMD_TOGGLE 0xFFFFFF12 +#define CMD_TRACK 0xFFFFFF2C +#define CMD_TRANSLATE 0xFFFFFF27 + + +/* the following are undocumented commands that therefore should not be used */ +#if 0 +#define CMD_CRC 0xFFFFFF03 +#define CMD_HAMMERAUX 0xFFFFFF04 +#define CMD_MARCH 0xFFFFFF05 +#define CMD_IDCT 0xFFFFFF06 +#define CMD_EXECUTE 0xFFFFFF07 +#define CMD_GETPOINT 0xFFFFFF08 +#define CMD_TOUCH_TRANSFORM 0xFFFFFF20 +#endif + + +/* FT8xx graphics engine specific macros useful for static display list generation */ +#define ALPHA_FUNC(func,ref) ((9UL<<24)|(((func)&7UL)<<8)|(((ref)&255UL)<<0)) +#define BEGIN(prim) ((31UL<<24)|(((prim)&15UL)<<0)) +#define BITMAP_HANDLE(handle) ((5UL<<24)|(((handle)&31UL)<<0)) +#define BITMAP_LAYOUT(format,linestride,height) ((7UL<<24)|(((format)&31UL)<<19)|(((linestride)&1023UL)<<9)|(((height)&511UL)<<0)) +#define BITMAP_SIZE(filter,wrapx,wrapy,width,height) ((8UL<<24)|(((filter)&1UL)<<20)|(((wrapx)&1UL)<<19)|(((wrapy)&1UL)<<18)|(((width)&511UL)<<9)|(((height)&511UL)<<0)) +#define BITMAP_TRANSFORM_A(a) ((21UL<<24)|(((a)&131071UL)<<0)) +#define BITMAP_TRANSFORM_B(b) ((22UL<<24)|(((b)&131071UL)<<0)) +#define BITMAP_TRANSFORM_C(c) ((23UL<<24)|(((c)&16777215UL)<<0)) +#define BITMAP_TRANSFORM_D(d) ((24UL<<24)|(((d)&131071UL)<<0)) +#define BITMAP_TRANSFORM_E(e) ((25UL<<24)|(((e)&131071UL)<<0)) +#define BITMAP_TRANSFORM_F(f) ((26UL<<24)|(((f)&16777215UL)<<0)) +#define BLEND_FUNC(src,dst) ((11UL<<24)|(((src)&7UL)<<3)|(((dst)&7UL)<<0)) +#define CALL(dest) ((29UL<<24)|(((dest)&65535UL)<<0)) +#define CELL(cell) ((6UL<<24)|(((cell)&127UL)<<0)) +#define CLEAR(c,s,t) ((38UL<<24)|(((c)&1UL)<<2)|(((s)&1UL)<<1)|(((t)&1UL)<<0)) +#define CLEAR_COLOR_A(alpha) ((15UL<<24)|(((alpha)&255UL)<<0)) +#define CLEAR_COLOR_RGB(red,green,blue) ((2UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0)) +#define CLEAR_STENCIL(s) ((17UL<<24)|(((s)&255UL)<<0)) +#define CLEAR_TAG(s) ((18UL<<24)|(((s)&255UL)<<0)) +#define COLOR_A(alpha) ((16UL<<24)|(((alpha)&255UL)<<0)) +#define COLOR_MASK(r,g,b,a) ((32UL<<24)|(((r)&1UL)<<3)|(((g)&1UL)<<2)|(((b)&1UL)<<1)|(((a)&1UL)<<0)) +#define COLOR_RGB(red,green,blue) ((4UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0)) +/* #define DISPLAY() ((0UL<<24)) */ +#define END() ((33UL<<24)) +#define JUMP(dest) ((30UL<<24)|(((dest)&65535UL)<<0)) +#define LINE_WIDTH(width) ((14UL<<24)|(((width)&4095UL)<<0)) +#define MACRO(m) ((37UL<<24)|(((m)&1UL)<<0)) +#define POINT_SIZE(size) ((13UL<<24)|(((size)&8191UL)<<0)) +#define RESTORE_CONTEXT() ((35UL<<24)) +#define RETURN() ((36UL<<24)) +#define SAVE_CONTEXT() ((34UL<<24)) +#define STENCIL_FUNC(func,ref,mask) ((10UL<<24)|(((func)&7UL)<<16)|(((ref)&255UL)<<8)|(((mask)&255UL)<<0)) +#define STENCIL_MASK(mask) ((19UL<<24)|(((mask)&255UL)<<0)) +#define STENCIL_OP(sfail,spass) ((12UL<<24)|(((sfail)&7UL)<<3)|(((spass)&7UL)<<0)) +#define TAG(s) ((3UL<<24)|(((s)&255UL)<<0)) +#define TAG_MASK(mask) ((20UL<<24)|(((mask)&1UL)<<0)) +#define VERTEX2F(x,y) ((1UL<<30)|(((x)&32767UL)<<15)|(((y)&32767UL)<<0)) +#define VERTEX2II(x,y,handle,cell) ((2UL<<30)|(((x)&511UL)<<21)|(((y)&511UL)<<12)|(((handle)&31UL)<<7)|(((cell)&127UL)<<0)) + + +/* ----------------- BT81x exclusive definitions -----------------*/ +#if defined (BT81X_ENABLE) + +#define EVE_GLFORMAT 31UL /* used with BITMAP_LAYOUT to indicate bitmap-format is specified by BITMAP_EXT_FORMAT */ + +#define DL_BITMAP_EXT_FORMAT 0x2E000000 /* requires OR'd arguments */ + +/* extended Bitmap formats */ +#define EVE_COMPRESSED_RGBA_ASTC_4x4_KHR 37808UL +#define EVE_COMPRESSED_RGBA_ASTC_5x4_KHR 37809UL +#define EVE_COMPRESSED_RGBA_ASTC_5x5_KHR 37810UL +#define EVE_COMPRESSED_RGBA_ASTC_6x5_KHR 37811UL +#define EVE_COMPRESSED_RGBA_ASTC_6x6_KHR 37812UL +#define EVE_COMPRESSED_RGBA_ASTC_8x5_KHR 37813UL +#define EVE_COMPRESSED_RGBA_ASTC_8x6_KHR 37814UL +#define EVE_COMPRESSED_RGBA_ASTC_8x8_KHR 37815UL +#define EVE_COMPRESSED_RGBA_ASTC_10x5_KHR 37816UL +#define EVE_COMPRESSED_RGBA_ASTC_10x6_KHR 37817UL +#define EVE_COMPRESSED_RGBA_ASTC_10x8_KHR 37818UL +#define EVE_COMPRESSED_RGBA_ASTC_10x10_KHR 37819UL +#define EVE_COMPRESSED_RGBA_ASTC_12x10_KHR 37820UL +#define EVE_COMPRESSED_RGBA_ASTC_12x12_KHR 37821UL + + +#define EVE_RAM_ERR_REPORT 0x309800UL /* max 128 bytes null terminated string */ +#define EVE_RAM_FLASH 0x800000UL +#define EVE_RAM_FLASH_POSTBLOB 0x801000UL + +#define EVE_OPT_FLASH 64UL +#define EVE_OPT_FORMAT 4096UL +#define EVE_OPT_FILL 8192UL + + +/* additional commands for BT81x */ +#define CMD_BITMAP_TRANSFORM 0xFFFFFF21 +#define CMD_SYNC 0xFFFFFF42 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_SYNC) */ +#define CMD_FLASHERASE 0xFFFFFF44 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHERASE) */ +#define CMD_FLASHWRITE 0xFFFFFF45 +#define CMD_FLASHREAD 0xFFFFFF46 +#define CMD_FLASHUPDATE 0xFFFFFF47 +#define CMD_FLASHDETACH 0xFFFFFF48 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHDETACH) */ +#define CMD_FLASHATTACH 0xFFFFFF49 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHATTACH) */ +#define CMD_FLASHFAST 0xFFFFFF4A +#define CMD_FLASHSPIDESEL 0xFFFFFF4B /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHSPIDESEL) */ +#define CMD_FLASHSPITX 0xFFFFFF4C +#define CMD_FLASHSPIRX 0xFFFFFF4D +#define CMD_FLASHSOURCE 0xFFFFFF4E +#define CMD_CLEARCACHE 0xFFFFFF4F /* does not need a dedicated function, just use EVE_cmd_dl(CMD_CLEARCACHE) */ +#define CMD_INFLATE2 0xFFFFFF50 +#define CMD_ROTATEAROUND 0xFFFFFF51 +#define CMD_RESETFONTS 0xFFFFFF52 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_RESETFONTS) */ +#define CMD_ANIMSTART 0xFFFFFF53 +#define CMD_ANIMSTOP 0xFFFFFF54 +#define CMD_ANIMXY 0xFFFFFF55 +#define CMD_ANIMDRAW 0xFFFFFF56 +#define CMD_GRADIENTA 0xFFFFFF57 +#define CMD_FILLWIDTH 0xFFFFFF58 +#define CMD_APPENDF 0xFFFFFF59 +#define CMD_ANIMFRAME 0xFFFFFF5A +#define CMD_VIDEOSTARTF 0xFFFFFF5F /* does not need a dedicated function, just use EVE_cmd_dl(CMD_VIDEOSTARTF) */ + +#if 0 +/* some undocumented commands for BT81x */ +#define CMD_NOP 0xFFFFFF5B +#define CMD_SHA1 0xFFFFFF5C +#define CMD_HMAC 0xFFFFFF5D +#define CMD_LAST_ 0xFFFFFF5E + +#endif + + +/* additional registers for BT81x */ +#define REG_ADAPTIVE_FRAMERATE 0x30257cUL +#define REG_PLAYBACK_PAUSE 0x3025ecUL +#define REG_FLASH_STATUS 0x3025f0UL +#define REG_FLASH_SIZE 0x309024UL +#define REG_PLAY_CONTROL 0x30914eUL +#define REG_COPRO_PATCH_DTR 0x309162UL + + +/* BT81x graphics engine specific macros */ +#define BITMAP_EXT_FORMAT(format) ((46UL<<24)|(((format)&65535UL)<<0)) +#define BITMAP_SWIZZLE(r,g,b,a) ((47UL<<24)|(((r)&7UL)<<9)|(((g)&7UL)<<6)|(((b)&7UL)<<3)|(((a)&7UL)<<0)) +#define BITMAP_SOURCE2(flash_or_ram, addr) ((1UL<<24)|((flash_or_ram) << 23)|(((addr)&8388607UL)<<0)) +#define INT_FRR() ((48UL<<24)) + +#undef BITMAP_TRANSFORM_A +#undef BITMAP_TRANSFORM_B +#undef BITMAP_TRANSFORM_D +#undef BITMAP_TRANSFORM_E + +#define BITMAP_TRANSFORM_A_EXT(p,v) ((21UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0)) +#define BITMAP_TRANSFORM_B_EXT(p,v) ((22UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0)) +#define BITMAP_TRANSFORM_D_EXT(p,v) ((24UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0)) +#define BITMAP_TRANSFORM_E_EXT(p,v) ((25UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0)) + +#define BITMAP_TRANSFORM_A(a) BITMAP_TRANSFORM_A_EXT(0,a) +#define BITMAP_TRANSFORM_B(b) BITMAP_TRANSFORM_B_EXT(0,b) +#define BITMAP_TRANSFORM_D(d) BITMAP_TRANSFORM_D_EXT(0,d) +#define BITMAP_TRANSFORM_E(e) BITMAP_TRANSFORM_E_EXT(0,e) + +#endif + +/* ----------------- FT81x / BT81x exclusive definitions -----------------*/ +#if defined (FT81X_ENABLE) + + +/* Host commands */ +#define EVE_CLKSEL 0x61 /* configure system clock */ +#define EVE_RST_PULSE 0x68 /* reset core - all registers default and processors reset */ +#define EVE_PINDRIVE 0x70 /* setup drive strength for various pins */ +#define EVE_PIN_PD_STATE 0x71 /* setup how pins behave during power down */ + + +/* Memory definitions */ +#define EVE_RAM_G 0x000000UL +#define EVE_ROM_CHIPID 0x0C0000UL +#define EVE_ROM_FONT 0x1E0000UL +#define EVE_ROM_FONT_ADDR 0x2FFFFCUL +#define EVE_RAM_DL 0x300000UL +#define EVE_RAM_REG 0x302000UL +#define EVE_RAM_CMD 0x308000UL + + +/* Memory buffer sizes */ +#define EVE_RAM_G_SIZE 1024*1024L +#define EVE_CMDFIFO_SIZE 4*1024L +#define EVE_RAM_DL_SIZE 8*1024L + + +/* various additional defines for FT81x */ +#define EVE_ADC_DIFFERENTIAL 1UL +#define EVE_ADC_SINGLE_ENDED 0UL + +#define EVE_INT_G8 18UL +#define EVE_INT_L8C 12UL +#define EVE_INT_VGA 13UL + +#define EVE_OPT_MEDIAFIFO 16UL +#define EVE_OPT_FULLSCREEN 8UL +#define EVE_OPT_NOTEAR 4UL +#define EVE_OPT_SOUND 32UL + +#define EVE_PALETTED565 14UL +#define EVE_PALETTED4444 15UL +#define EVE_PALETTED8 16UL +#define EVE_L2 17UL + + +/* additional commands for FT81x */ +#define CMD_MEDIAFIFO 0xFFFFFF39 +#define CMD_PLAYVIDEO 0xFFFFFF3A +#define CMD_ROMFONT 0xFFFFFF3F +#define CMD_SETBASE 0xFFFFFF38 +#define CMD_SETBITMAP 0xFFFFFF43 +#define CMD_SETFONT2 0xFFFFFF3B +#define CMD_SETROTATE 0xFFFFFF36 +#define CMD_SETSCRATCH 0xFFFFFF3C +#define CMD_SNAPSHOT2 0xFFFFFF37 +#define CMD_VIDEOFRAME 0xFFFFFF41 +#define CMD_VIDEOSTART 0xFFFFFF40 + + +/* the following are undocumented commands that therefore should not be used */ +#if 0 +#define CMD_CSKETCH 0xFFFFFF35 +#define CMD_INT_RAMSHARED 0xFFFFFF3D +#define CMD_INT_SWLOADIMAGE 0xFFFFFF3E +#endif + + +/* Register definitions */ +#define REG_ANA_COMP 0x302184UL /* only listed in datasheet */ +#define REG_BIST_EN 0x302174UL /* only listed in datasheet */ +#define REG_CLOCK 0x302008UL +#define REG_CMDB_SPACE 0x302574UL +#define REG_CMDB_WRITE 0x302578UL +#define REG_CMD_DL 0x302100UL +#define REG_CMD_READ 0x3020f8UL +#define REG_CMD_WRITE 0x3020fcUL +#define REG_CPURESET 0x302020UL +#define REG_CSPREAD 0x302068UL +#define REG_CTOUCH_EXTENDED 0x302108UL +#define REG_CTOUCH_TOUCH0_XY 0x302124UL /* only listed in datasheet */ +#define REG_CTOUCH_TOUCH4_X 0x30216cUL +#define REG_CTOUCH_TOUCH4_Y 0x302120UL +#define REG_CTOUCH_TOUCH1_XY 0x30211cUL +#define REG_CTOUCH_TOUCH2_XY 0x30218cUL +#define REG_CTOUCH_TOUCH3_XY 0x302190UL +#define REG_TOUCH_CONFIG 0x302168UL +#define REG_DATESTAMP 0x302564UL /* only listed in datasheet */ +#define REG_DITHER 0x302060UL +#define REG_DLSWAP 0x302054UL +#define REG_FRAMES 0x302004UL +#define REG_FREQUENCY 0x30200cUL +#define REG_GPIO 0x302094UL +#define REG_GPIOX 0x30209cUL +#define REG_GPIOX_DIR 0x302098UL +#define REG_GPIO_DIR 0x302090UL +#define REG_HCYCLE 0x30202cUL +#define REG_HOFFSET 0x302030UL +#define REG_HSIZE 0x302034UL +#define REG_HSYNC0 0x302038UL +#define REG_HSYNC1 0x30203cUL +#define REG_ID 0x302000UL +#define REG_INT_EN 0x3020acUL +#define REG_INT_FLAGS 0x3020a8UL +#define REG_INT_MASK 0x3020b0UL +#define REG_MACRO_0 0x3020d8UL +#define REG_MACRO_1 0x3020dcUL +#define REG_MEDIAFIFO_READ 0x309014UL /* only listed in programmers guide */ +#define REG_MEDIAFIFO_WRITE 0x309018UL /* only listed in programmers guide */ +#define REG_OUTBITS 0x30205cUL +#define REG_PCLK 0x302070UL +#define REG_PCLK_POL 0x30206cUL +#define REG_PLAY 0x30208cUL +#define REG_PLAYBACK_FORMAT 0x3020c4UL +#define REG_PLAYBACK_FREQ 0x3020c0UL +#define REG_PLAYBACK_LENGTH 0x3020b8UL +#define REG_PLAYBACK_LOOP 0x3020c8UL +#define REG_PLAYBACK_PLAY 0x3020ccUL +#define REG_PLAYBACK_READPTR 0x3020bcUL +#define REG_PLAYBACK_START 0x3020b4UL +#define REG_PWM_DUTY 0x3020d4UL +#define REG_PWM_HZ 0x3020d0UL +#define REG_RENDERMODE 0x302010UL /* only listed in datasheet */ +#define REG_ROTATE 0x302058UL +#define REG_SNAPFORMAT 0x30201cUL /* only listed in datasheet */ +#define REG_SNAPSHOT 0x302018UL /* only listed in datasheet */ +#define REG_SNAPY 0x302014UL /* only listed in datasheet */ +#define REG_SOUND 0x302088UL +#define REG_SPI_WIDTH 0x302188UL /* listed with false offset in programmers guide V1.1 */ +#define REG_SWIZZLE 0x302064UL +#define REG_TAG 0x30207cUL +#define REG_TAG_X 0x302074UL +#define REG_TAG_Y 0x302078UL +#define REG_TAP_CRC 0x302024UL /* only listed in datasheet */ +#define REG_TAP_MASK 0x302028UL /* only listed in datasheet */ +#define REG_TOUCH_ADC_MODE 0x302108UL +#define REG_TOUCH_CHARGE 0x30210cUL +#define REG_TOUCH_DIRECT_XY 0x30218cUL +#define REG_TOUCH_DIRECT_Z1Z2 0x302190UL +#define REG_TOUCH_MODE 0x302104UL +#define REG_TOUCH_OVERSAMPLE 0x302114UL +#define REG_TOUCH_RAW_XY 0x30211cUL +#define REG_TOUCH_RZ 0x302120UL +#define REG_TOUCH_RZTHRESH 0x302118UL +#define REG_TOUCH_SCREEN_XY 0x302124UL +#define REG_TOUCH_SETTLE 0x302110UL +#define REG_TOUCH_TAG 0x30212cUL +#define REG_TOUCH_TAG1 0x302134UL /* only listed in datasheet */ +#define REG_TOUCH_TAG1_XY 0x302130UL /* only listed in datasheet */ +#define REG_TOUCH_TAG2 0x30213cUL /* only listed in datasheet */ +#define REG_TOUCH_TAG2_XY 0x302138UL /* only listed in datasheet */ +#define REG_TOUCH_TAG3 0x302144UL /* only listed in datasheet */ +#define REG_TOUCH_TAG3_XY 0x302140UL /* only listed in datasheet */ +#define REG_TOUCH_TAG4 0x30214cUL /* only listed in datasheet */ +#define REG_TOUCH_TAG4_XY 0x302148UL /* only listed in datasheet */ +#define REG_TOUCH_TAG_XY 0x302128UL +#define REG_TOUCH_TRANSFORM_A 0x302150UL +#define REG_TOUCH_TRANSFORM_B 0x302154UL +#define REG_TOUCH_TRANSFORM_C 0x302158UL +#define REG_TOUCH_TRANSFORM_D 0x30215cUL +#define REG_TOUCH_TRANSFORM_E 0x302160UL +#define REG_TOUCH_TRANSFORM_F 0x302164UL +#define REG_TRACKER 0x309000UL /* only listed in programmers guide */ +#define REG_TRACKER_1 0x309004UL /* only listed in programmers guide */ +#define REG_TRACKER_2 0x309008UL /* only listed in programmers guide */ +#define REG_TRACKER_3 0x30900cUL /* only listed in programmers guide */ +#define REG_TRACKER_4 0x309010UL /* only listed in programmers guide */ +#define REG_TRIM 0x302180UL +#define REG_VCYCLE 0x302040UL +#define REG_VOFFSET 0x302044UL +#define REG_VOL_PB 0x302080UL +#define REG_VOL_SOUND 0x302084UL +#define REG_VSIZE 0x302048UL +#define REG_VSYNC0 0x30204cUL +#define REG_VSYNC1 0x302050UL + +#if 0 +#define REG_BUSYBITS 0x3020e8UL /* only listed as "reserved" in datasheet */ +#define REG_CRC 0x302178UL /* only listed as "reserved" in datasheet */ +#define REG_SPI_EARLY_TX 0x30217cUL /* only listed as "reserved" in datasheet */ +#define REG_ROMSUB_SEL 0x3020f0UL /* only listed as "reserved" in datasheet */ +#define REG_TOUCH_FAULT 0x302170UL /* only listed as "reserved" in datasheet */ +#endif + + +/* FT81x graphics engine specific macros useful for static display list generation */ + +/* beware, these are different to FTDIs implementation as these take the original values as parameters and not only the upper bits */ +#define BITMAP_LAYOUT_H(linestride,height) ((40UL<<24)|((((linestride&0xC00)>>10)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0)) +#define BITMAP_SIZE_H(width,height) ((41UL<<24)|((((width&0x600)>>9)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0)) + +#define BITMAP_SOURCE(addr) ((1UL<<24)|(((addr)&4194303UL)<<0)) +//#define NOP() ((45UL<<24)) +#define PALETTE_SOURCE(addr) ((42UL<<24)|(((addr)&4194303UL)<<0)) +#define SCISSOR_SIZE(width,height) ((28UL<<24)|(((width)&4095UL)<<12)|(((height)&4095UL)<<0)) +#define SCISSOR_XY(x,y) ((27UL<<24)|(((x)&2047UL)<<11)|(((y)&2047UL)<<0)) +#define VERTEX_FORMAT(frac) ((39UL<<24)|(((frac)&7UL)<<0)) +#define VERTEX_TRANSLATE_X(x) ((43UL<<24)|(((x)&131071UL)<<0)) +#define VERTEX_TRANSLATE_Y(y) ((44UL<<24)|(((y)&131071UL)<<0)) + + + +/* ----------------- FT80x exclusive definitions -----------------*/ +#else + +/* Memory definitions */ +#define EVE_RAM_G 0x000000UL +#define EVE_ROM_CHIPID 0x0C0000UL +#define EVE_ROM_FONT 0x0BB23CUL +#define EVE_ROM_FONT_ADDR 0x0FFFFCUL +#define EVE_RAM_DL 0x100000UL +#define EVE_RAM_PAL 0x102000UL +#define EVE_RAM_CMD 0x108000UL +#define EVE_RAM_SCREENSHOT 0x1C2000UL + + +/* Memory buffer sizes */ +#define EVE_RAM_G_SIZE 256*1024L +#define EVE_CMDFIFO_SIZE 4*1024L +#define EVE_RAM_DL_SIZE 8*1024L +#define EVE_RAM_PAL_SIZE 1*1024L + + +/* Register definitions */ +#define REG_ID 0x102400UL +#define REG_FRAMES 0x102404UL +#define REG_CLOCK 0x102408UL +#define REG_FREQUENCY 0x10240CUL +#define REG_SCREENSHOT_EN 0x102410UL +#define REG_SCREENSHOT_Y 0x102414UL +#define REG_SCREENSHOT_START 0x102418UL +#define REG_CPURESET 0x10241CUL +#define REG_TAP_CRC 0x102420UL +#define REG_TAP_MASK 0x102424UL +#define REG_HCYCLE 0x102428UL +#define REG_HOFFSET 0x10242CUL +#define REG_HSIZE 0x102430UL +#define REG_HSYNC0 0x102434UL +#define REG_HSYNC1 0x102438UL +#define REG_VCYCLE 0x10243CUL +#define REG_VOFFSET 0x102440UL +#define REG_VSIZE 0x102444UL +#define REG_VSYNC0 0x102448UL +#define REG_VSYNC1 0x10244CUL +#define REG_DLSWAP 0x102450UL +#define REG_ROTATE 0x102454UL +#define REG_OUTBITS 0x102458UL +#define REG_DITHER 0x10245CUL +#define REG_SWIZZLE 0x102460UL +#define REG_CSPREAD 0x102464UL +#define REG_PCLK_POL 0x102468UL +#define REG_PCLK 0x10246CUL +#define REG_TAG_X 0x102470UL +#define REG_TAG_Y 0x102474UL +#define REG_TAG 0x102478UL +#define REG_VOL_PB 0x10247CUL +#define REG_VOL_SOUND 0x102480UL +#define REG_SOUND 0x102484UL +#define REG_PLAY 0x102488UL +#define REG_GPIO_DIR 0x10248CUL +#define REG_GPIO 0x102490UL +#define REG_INT_FLAGS 0x102498UL +#define REG_INT_EN 0x10249CUL +#define REG_INT_MASK 0x1024A0UL +#define REG_PLAYBACK_START 0x1024A4UL +#define REG_PLAYBACK_LENGTH 0x1024A8UL +#define REG_PLAYBACK_READPTR 0x1024ACUL +#define REG_PLAYBACK_FREQ 0x1024B0UL +#define REG_PLAYBACK_FORMAT 0x1024B4UL +#define REG_PLAYBACK_LOOP 0x1024B8UL +#define REG_PLAYBACK_PLAY 0x1024BCUL +#define REG_PWM_HZ 0x1024C0UL +#define REG_PWM_DUTY 0x1024C4UL +#define REG_MACRO_0 0x1024C8UL +#define REG_MACRO_1 0x1024CCUL +#define REG_SCREENSHOT_BUSY 0x1024D8UL +#define REG_CMD_READ 0x1024E4UL +#define REG_CMD_WRITE 0x1024E8UL +#define REG_CMD_DL 0x1024ECUL +#define REG_TOUCH_MODE 0x1024F0UL +#define REG_TOUCH_ADC_MODE 0x1024F4UL +#define REG_TOUCH_CHARGE 0x1024F8UL +#define REG_TOUCH_SETTLE 0x1024FCUL +#define REG_TOUCH_OVERSAMPLE 0x102500UL +#define REG_TOUCH_RZTHRESH 0x102504UL +#define REG_TOUCH_RAW_XY 0x102508UL +#define REG_TOUCH_RZ 0x10250CUL +#define REG_TOUCH_SCREEN_XY 0x102510UL +#define REG_TOUCH_TAG_XY 0x102514UL +#define REG_TOUCH_TAG 0x102518UL +#define REG_TOUCH_TRANSFORM_A 0x10251CUL +#define REG_TOUCH_TRANSFORM_B 0x102520UL +#define REG_TOUCH_TRANSFORM_C 0x102524UL +#define REG_TOUCH_TRANSFORM_D 0x102528UL +#define REG_TOUCH_TRANSFORM_E 0x10252CUL +#define REG_TOUCH_TRANSFORM_F 0x102530UL +#define REG_SCREENSHOT_READ 0x102554UL +#define REG_TRIM 0x10256CUL +#define REG_TOUCH_DIRECT_XY 0x102574UL +#define REG_TOUCH_DIRECT_Z1Z2 0x102578UL +#define REG_TRACKER 0x109000UL + +/* FT80x graphics engine specific macros useful for static display list generation */ +#define BITMAP_SOURCE(addr) ((1UL<<24)|(((addr)&1048575UL)<<0)) +#define SCISSOR_SIZE(width,height) ((28UL<<24)|(((width)&1023UL)<<10)|(((height)&1023UL)<<0)) +#define SCISSOR_XY(x,y) ((27UL<<24)|(((x)&511UL)<<9)|(((y)&511UL)<<0)) + +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FT81X_DEFINES_H*/ diff --git a/inc/lvgl/src/drivers/display/ili9341/lv_ili9341.c b/inc/lvgl/src/drivers/display/ili9341/lv_ili9341.c new file mode 100644 index 0000000..a6b2acf --- /dev/null +++ b/inc/lvgl/src/drivers/display/ili9341/lv_ili9341.c @@ -0,0 +1,117 @@ +/** + * @file lv_ili9341.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ili9341.h" + +#if LV_USE_ILI9341 + +/********************* + * DEFINES + *********************/ + +#define CMD_FRMCTR1 0xB1 /* Frame Rate Control (In Normal Mode/Full Colors) */ +#define CMD_FRMCTR2 0xB2 /* Frame Rate Control (In Idle Mode/8 colors) */ +#define CMD_FRMCTR3 0xB3 /* Frame Rate control (In Partial Mode/Full Colors) */ +#define CMD_INVCTR 0xB4 /* Display Inversion Control */ +#define CMD_DFUNCTR 0xB6 /* Display Function Control */ +#define CMD_PWCTR1 0xC0 /* Power Control 1 */ +#define CMD_PWCTR2 0xC1 /* Power Control 2 */ +#define CMD_VMCTR1 0xC5 /* VCOM Control 1 */ +#define CMD_VMCTR2 0xC7 /* VCOM Control 2 */ +#define CMD_PWCTRA 0xCB /* Power Control A */ +#define CMD_PWCTRB 0xCF /* Power Control B */ +#define CMD_GMCTRP1 0xE0 /* Positive Gamma Correction */ +#define CMD_GMCTRN1 0xE1 /* Negative Gamma Correction */ +#define CMD_DTCTRA 0xE8 /* Driver timing control A */ +#define CMD_DTCTRB 0xEA /* Driver timing control B */ +#define CMD_PONSEQ 0xED /* Power On Sequence */ +#define CMD_RDINDEX 0xD9 /* ili9341 */ +#define CMD_IDXRD 0xDD /* ILI9341 only, indexed control register read */ +#define CMD_ENA3G 0xF2 /* Enable 3 Gamma control */ +#define CMD_IFCTR 0xF6 /* Interface Control */ +#define CMD_PRCTR 0xF7 /* Pump ratio control */ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC CONSTANTS + **********************/ + +/* init commands based on LovyanGFX ILI9341 driver */ +static const uint8_t init_cmd_list[] = { + CMD_PWCTRB, 3, 0x00, 0xC1, 0x30, + CMD_PONSEQ, 4, 0x64, 0x03, 0x12, 0x81, + CMD_DTCTRA, 3, 0x85, 0x00, 0x78, + CMD_PWCTRA, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + CMD_PRCTR, 1, 0x20, + CMD_DTCTRB, 2, 0x00, 0x00, + CMD_PWCTR1, 1, 0x23, + CMD_PWCTR2, 1, 0x10, + CMD_VMCTR1, 2, 0x3e, 0x28, + CMD_VMCTR2, 1, 0x86, + CMD_FRMCTR1, 2, 0x00, 0x13, + CMD_DFUNCTR, 2, 0x0A, 0xA2, + CMD_IFCTR, 3, 0x09, 0x30, 0x00, + CMD_ENA3G, 1, 0x00, + LV_LCD_CMD_SET_GAMMA_CURVE, 1, 0x01, + CMD_GMCTRP1, 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, + CMD_GMCTRN1, 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_ili9341_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_ili9341_send_cmd_cb_t send_cmd_cb, lv_ili9341_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); + return disp; +} + +void lv_ili9341_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_set_gap(disp, x, y); +} + +void lv_ili9341_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_set_invert(disp, invert); +} + +void lv_ili9341_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); +} + +void lv_ili9341_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_ILI9341*/ diff --git a/inc/lvgl/src/drivers/display/ili9341/lv_ili9341.h b/inc/lvgl/src/drivers/display/ili9341/lv_ili9341.h new file mode 100644 index 0000000..90fe5da --- /dev/null +++ b/inc/lvgl/src/drivers/display/ili9341/lv_ili9341.h @@ -0,0 +1,94 @@ +/** + * @file lv_ili9341.h + * + * This driver is just a wrapper around the generic MIPI compatible LCD controller driver + * + */ + +#ifndef LV_ILI9341_H +#define LV_ILI9341_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lcd/lv_lcd_generic_mipi.h" + +#if LV_USE_ILI9341 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_lcd_send_cmd_cb_t lv_ili9341_send_cmd_cb_t; +typedef lv_lcd_send_color_cb_t lv_ili9341_send_color_cb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an LCD display with ILI9341 driver + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_ili9341_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_ili9341_send_cmd_cb_t send_cmd_cb, lv_ili9341_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_ili9341_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_ili9341_set_invert(lv_display_t * disp, bool invert); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_ili9341_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_ili9341_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + + +#endif /*LV_USE_ILI9341*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ILI9341_H*/ diff --git a/inc/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.c b/inc/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.c new file mode 100644 index 0000000..05edf3a --- /dev/null +++ b/inc/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.c @@ -0,0 +1,354 @@ +/** + * @file lv_lcd_generic_mipi.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_lcd_generic_mipi.h" + +#if LV_USE_GENERIC_MIPI + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void send_cmd(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size); +static void send_color(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size); +static void init(lv_lcd_generic_mipi_driver_t * drv, lv_lcd_flag_t flags); +static void set_mirror(lv_lcd_generic_mipi_driver_t * drv, bool mirror_x, bool mirror_y); +static void set_swap_xy(lv_lcd_generic_mipi_driver_t * drv, bool swap); +static void set_rotation(lv_lcd_generic_mipi_driver_t * drv, lv_display_rotation_t rot); +static void res_chg_event_cb(lv_event_t * e); +static void delete_cb(lv_event_t * e); +static lv_lcd_generic_mipi_driver_t * get_driver(lv_display_t * disp); +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_lcd_generic_mipi_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_lcd_send_cmd_cb_t send_cmd_cb, lv_lcd_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + return NULL; + } + + lv_lcd_generic_mipi_driver_t * drv = (lv_lcd_generic_mipi_driver_t *)lv_malloc(sizeof(lv_lcd_generic_mipi_driver_t)); + if(drv == NULL) { + lv_display_delete(disp); + return NULL; + } + + /* init driver struct */ + drv->disp = disp; + drv->send_cmd = send_cmd_cb; + drv->send_color = send_color_cb; + lv_display_set_driver_data(disp, (void *)drv); + + /* init controller */ + init(drv, flags); + + /* register resolution change callback (NOTE: this handles screen rotation as well) */ + lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + + /* register object deletion callback for freeing driver struct */ + lv_display_add_event_cb(disp, delete_cb, LV_EVENT_DELETE, NULL); + + /* register flush callback */ + lv_display_set_flush_cb(disp, flush_cb); + + return disp; +} + +void lv_lcd_generic_mipi_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + drv->x_gap = x; + drv->y_gap = y; +} + +void lv_lcd_generic_mipi_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + send_cmd(drv, invert ? LV_LCD_CMD_ENTER_INVERT_MODE : LV_LCD_CMD_EXIT_INVERT_MODE, NULL, 0); +} + +void lv_lcd_generic_mipi_set_address_mode(lv_display_t * disp, bool mirror_x, bool mirror_y, bool swap_xy, bool bgr) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + uint8_t mad = drv->madctl_reg & ~(LV_LCD_MASK_RGB_ORDER); + if(bgr) { + mad |= LV_LCD_BIT_RGB_ORDER__BGR; + } + drv->madctl_reg = mad; + drv->mirror_x = mirror_x; + drv->mirror_y = mirror_y; + drv->swap_xy = swap_xy; + set_rotation(drv, lv_display_get_rotation(disp)); /* update screen */ +} + +void lv_lcd_generic_mipi_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + send_cmd(drv, LV_LCD_CMD_SET_GAMMA_CURVE, (uint8_t[]) { + gamma, + }, 1); +} + +void lv_lcd_generic_mipi_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + while(1) { + uint8_t cmd = *cmd_list++; + uint8_t num = *cmd_list++; + if(cmd == LV_LCD_CMD_DELAY_MS) { + if(num == LV_LCD_CMD_EOF) /* end of list */ + break; + else { /* delay in 10 ms units*/ + lv_delay_ms((uint32_t)(num) * 10); + } + } + else { + drv->send_cmd(drv->disp, &cmd, 1, cmd_list, num); + cmd_list += num; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Helper function to call the user-supplied 'send_cmd' function + * @param drv LCD driver object + * @param cmd command byte + * @param param parameter buffer + * @param param_size number of bytes of the parameters + */ +static void send_cmd(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size) +{ + uint8_t cmdbuf = cmd; /* MIPI uses 8 bit commands */ + drv->send_cmd(drv->disp, &cmdbuf, 1, param, param_size); +} + +/** + * Helper function to call the user-supplied 'send_color' function + * @param drv LCD driver object + * @param cmd command byte + * @param param parameter buffer + * @param param_size number of bytes of the parameters + */ +static void send_color(lv_lcd_generic_mipi_driver_t * drv, uint8_t cmd, uint8_t * param, size_t param_size) +{ + uint8_t cmdbuf = cmd; /* MIPI uses 8 bit commands */ + drv->send_color(drv->disp, &cmdbuf, 1, param, param_size); + /* note: LVGL waits for your callback to call `lv_display_flush_ready` to know when the transfer has finished. */ +} + +/** + * Initialize LCD driver after a hard reset + * @param drv LCD driver object + */ +static void init(lv_lcd_generic_mipi_driver_t * drv, lv_lcd_flag_t flags) +{ + drv->x_gap = 0; + drv->y_gap = 0; + + /* init color mode and RGB order */ + drv->madctl_reg = flags & LV_LCD_FLAG_BGR ? LV_LCD_BIT_RGB_ORDER__BGR : LV_LCD_BIT_RGB_ORDER__RGB; + drv->colmod_reg = flags & LV_LCD_FLAG_RGB666 ? LV_LCD_PIXEL_FORMAT_RGB666 : LV_LCD_PIXEL_FORMAT_RGB565; + + /* init orientation */ + drv->mirror_x = flags & LV_LCD_FLAG_MIRROR_X; + drv->mirror_y = flags & LV_LCD_FLAG_MIRROR_Y; + drv->swap_xy = false; + /* update madctl_reg */ + set_swap_xy(drv, drv->swap_xy); + set_mirror(drv, drv->mirror_x, drv->mirror_y); + + /* enter sleep mode first */ + send_cmd(drv, LV_LCD_CMD_ENTER_SLEEP_MODE, NULL, 0); + lv_delay_ms(10); + + /* perform software reset */ + send_cmd(drv, LV_LCD_CMD_SOFT_RESET, NULL, 0); + lv_delay_ms(200); + + /* LCD goes into sleep mode and display will be turned off after power on reset, exit sleep mode first */ + send_cmd(drv, LV_LCD_CMD_EXIT_SLEEP_MODE, NULL, 0); + lv_delay_ms(300); + + send_cmd(drv, LV_LCD_CMD_ENTER_NORMAL_MODE, NULL, 0); + + send_cmd(drv, LV_LCD_CMD_SET_ADDRESS_MODE, (uint8_t[]) { + drv->madctl_reg, + }, 1); + send_cmd(drv, LV_LCD_CMD_SET_PIXEL_FORMAT, (uint8_t[]) { + drv->colmod_reg, + }, 1); + send_cmd(drv, LV_LCD_CMD_SET_DISPLAY_ON, NULL, 0); +} + +/** + * Set readout directions (used for rotating the display) + * @param drv LCD driver object + * @param mirror_x false: normal, true: mirrored + * @param mirror_y false: normal, true: mirrored + */ +static void set_mirror(lv_lcd_generic_mipi_driver_t * drv, bool mirror_x, bool mirror_y) +{ + uint8_t mad = drv->madctl_reg & ~(LV_LCD_MASK_COLUMN_ADDRESS_ORDER | LV_LCD_MASK_PAGE_ADDRESS_ORDER); + if(mirror_x) { + mad |= LV_LCD_BIT_COLUMN_ADDRESS_ORDER__RTOL; + } + if(mirror_y) { + mad |= LV_LCD_BIT_PAGE_ADDRESS_ORDER__BTOT; + } + drv->madctl_reg = mad; +} + +/** + * Swap horizontal and vertical readout (used for rotating the display) + * @param drv LCD driver object + * @param swap false: normal, true: swapped + */ +static void set_swap_xy(lv_lcd_generic_mipi_driver_t * drv, bool swap) +{ + uint8_t mad = drv->madctl_reg & ~(LV_LCD_MASK_PAGE_COLUMN_ORDER); + if(swap) { + mad |= LV_LCD_BIT_PAGE_COLUMN_ORDER__REVERSE; + } + drv->madctl_reg = mad; +} + +/** + * Flush display buffer to the LCD + * @param disp display object + * @param hor_res horizontal resolution + * @param area area stored in the buffer + * @param px_map buffer containing pixel data + * @note transfers pixel data to the LCD controller using the callbacks 'send_cmd' and 'send_color', which were + * passed to the 'lv_st7789_create()' function + */ +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + + int32_t x_start = area->x1; + int32_t x_end = area->x2 + 1; + int32_t y_start = area->y1; + int32_t y_end = area->y2 + 1; + + LV_ASSERT((x_start < x_end) && (y_start < y_end) && "start position must be smaller than end position"); + + x_start += drv->x_gap; + x_end += drv->x_gap; + y_start += drv->y_gap; + y_end += drv->y_gap; + + /* define an area of frame memory where MCU can access */ + send_cmd(drv, LV_LCD_CMD_SET_COLUMN_ADDRESS, (uint8_t[]) { + (x_start >> 8) & 0xFF, + x_start & 0xFF, + ((x_end - 1) >> 8) & 0xFF, + (x_end - 1) & 0xFF, + }, 4); + send_cmd(drv, LV_LCD_CMD_SET_PAGE_ADDRESS, (uint8_t[]) { + (y_start >> 8) & 0xFF, + y_start & 0xFF, + ((y_end - 1) >> 8) & 0xFF, + (y_end - 1) & 0xFF, + }, 4); + /* transfer frame buffer */ + size_t len = (x_end - x_start) * (y_end - y_start) * lv_color_format_get_size(lv_display_get_color_format(disp)); + send_color(drv, LV_LCD_CMD_WRITE_MEMORY_START, px_map, len); +} + +/** + * Set rotation taking into account the current mirror and swap settings + * @param drv LCD driver object + * @param rot rotation + */ +static void set_rotation(lv_lcd_generic_mipi_driver_t * drv, lv_display_rotation_t rot) +{ + switch(rot) { + case LV_DISPLAY_ROTATION_0: + set_swap_xy(drv, drv->swap_xy); + set_mirror(drv, drv->mirror_x, drv->mirror_y); + break; + case LV_DISPLAY_ROTATION_90: + set_swap_xy(drv, !drv->swap_xy); + set_mirror(drv, drv->mirror_x, !drv->mirror_y); + break; + case LV_DISPLAY_ROTATION_180: + set_swap_xy(drv, drv->swap_xy); + set_mirror(drv, !drv->mirror_x, !drv->mirror_y); + break; + case LV_DISPLAY_ROTATION_270: + set_swap_xy(drv, !drv->swap_xy); + set_mirror(drv, !drv->mirror_x, drv->mirror_y); + break; + } + send_cmd(drv, LV_LCD_CMD_SET_ADDRESS_MODE, (uint8_t[]) { + drv->madctl_reg + }, 1); +} + +/** + * Handle LV_EVENT_RESOLUTION_CHANGED event (handles both resolution and rotation change) + * @param e LV_EVENT_RESOLUTION_CHANGED event + */ +static void res_chg_event_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_current_target(e); + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + + uint16_t hor_res = lv_display_get_horizontal_resolution(disp); + uint16_t ver_res = lv_display_get_vertical_resolution(disp); + lv_display_rotation_t rot = lv_display_get_rotation(disp); + + /* TODO: implement resolution change */ + LV_UNUSED(hor_res); + LV_UNUSED(ver_res); + + /* handle rotation */ + set_rotation(drv, rot); +} + +static void delete_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_current_target(e); + lv_lcd_generic_mipi_driver_t * drv = get_driver(disp); + LV_ASSERT_NULL(drv); + lv_free(drv); + lv_display_set_driver_data(disp, NULL); +} + +static lv_lcd_generic_mipi_driver_t * get_driver(lv_display_t * disp) +{ + return (lv_lcd_generic_mipi_driver_t *)lv_display_get_driver_data(disp); +} + +#endif /*LV_USE_GENERIC_MIPI*/ diff --git a/inc/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.h b/inc/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.h new file mode 100644 index 0000000..4c1422b --- /dev/null +++ b/inc/lvgl/src/drivers/display/lcd/lv_lcd_generic_mipi.h @@ -0,0 +1,243 @@ +/** + * @file lv_lcd_generic_mipi.h + * + * Generic driver for controllers adhering to the MIPI DBI/DCS specification + * + * Works with: + * + * ST7735 + * ST7789 + * ST7796 + * ILI9341 + * ILI9488 (NOTE: in SPI mode ILI9488 only supports RGB666 mode, which is currently not supported) + * + * any probably many more + * + */ + +#ifndef LV_LCD_GENERIC_MIPI_H +#define LV_LCD_GENERIC_MIPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../display/lv_display.h" + +#if LV_USE_GENERIC_MIPI + +/********************* + * DEFINES + *********************/ + +/* MIPI DCS (Display Command Set) v1.02.00 User Command Set */ +#define LV_LCD_CMD_NOP 0x00 /* No Operation */ +#define LV_LCD_CMD_SOFT_RESET 0x01 /* Software Reset */ +#define LV_LCD_CMD_GET_POWER_MODE 0x0A /* Get the current power mode */ +#define LV_LCD_CMD_GET_ADDRESS_MODE 0x0B /* Get the data order for transfers from the Host to the display module and from the frame memory to the display device */ +#define LV_LCD_CMD_GET_PIXEL_FORMAT 0x0C /* Get the current pixel format */ +#define LV_LCD_CMD_GET_DISPLAY_MODE 0x0D /* Get the current display mode from the peripheral */ +#define LV_LCD_CMD_GET_SIGNAL_MODE 0x0E /* Get display module signaling mode */ +#define LV_LCD_CMD_GET_DIAGNOSTIC_RESULT 0x0F /* Get Peripheral Self-Diagnostic Result */ +#define LV_LCD_CMD_ENTER_SLEEP_MODE 0x10 /* Power for the display panel is off */ +#define LV_LCD_CMD_EXIT_SLEEP_MODE 0x11 /* Power for the display panel is on */ +#define LV_LCD_CMD_ENTER_PARTIAL_MODE 0x12 /* Part of the display area is used for image display */ +#define LV_LCD_CMD_ENTER_NORMAL_MODE 0x13 /* The whole display area is used for image display */ +#define LV_LCD_CMD_EXIT_INVERT_MODE 0x20 /* Displayed image colors are not inverted */ +#define LV_LCD_CMD_ENTER_INVERT_MODE 0x21 /* Displayed image colors are inverted */ +#define LV_LCD_CMD_SET_GAMMA_CURVE 0x26 /* Selects the gamma curve used by the display device */ +#define LV_LCD_CMD_SET_DISPLAY_OFF 0x28 /* Blanks the display device */ +#define LV_LCD_CMD_SET_DISPLAY_ON 0x29 /* Show the image on the display device */ +#define LV_LCD_CMD_SET_COLUMN_ADDRESS 0x2A /* Set the column extent */ +#define LV_LCD_CMD_SET_PAGE_ADDRESS 0x2B /* Set the page extent */ +#define LV_LCD_CMD_WRITE_MEMORY_START 0x2C /* Transfer image data from the Host Processor to the peripheral starting at the location provided by set_column_address and set_page_address */ +#define LV_LCD_CMD_READ_MEMORY_START 0x2E /* Transfer image data from the peripheral to the Host Processor interface starting at the location provided by set_column_address and set_page_address */ +#define LV_LCD_CMD_SET_PARTIAL_ROWS 0x30 /* Defines the number of rows in the partial display area on the display device */ +#define LV_LCD_CMD_SET_PARTIAL_COLUMNS 0x31 /* Defines the number of columns in the partial display area on the display device */ +#define LV_LCD_CMD_SET_SCROLL_AREA 0x33 /* Defines the vertical scrolling and fixed area on display device */ +#define LV_LCD_CMD_SET_TEAR_OFF 0x34 /* Synchronization information is not sent from the display module to the host processor */ +#define LV_LCD_CMD_SET_TEAR_ON 0x35 /* Synchronization information is sent from the display module to the host processor at the start of VFP */ +#define LV_LCD_CMD_SET_ADDRESS_MODE 0x36 /* Set the data order for transfers from the Host to the display module and from the frame memory to the display device */ +#define LV_LCD_CMD_SET_SCROLL_START 0x37 /* Defines the vertical scrolling starting point */ +#define LV_LCD_CMD_EXIT_IDLE_MODE 0x38 /* Full color depth is used on the display panel */ +#define LV_LCD_CMD_ENTER_IDLE_MODE 0x39 /* Reduced color depth is used on the display panel */ +#define LV_LCD_CMD_SET_PIXEL_FORMAT 0x3A /* Defines how many bits per pixel are used in the interface */ +#define LV_LCD_CMD_WRITE_MEMORY_CONTINUE 0x3C /* Transfer image information from the Host Processor interface to the peripheral from the last written location */ +#define LV_LCD_CMD_READ_MEMORY_CONTINUE 0x3E /* Read image data from the peripheral continuing after the last read_memory_continue or read_memory_start */ +#define LV_LCD_CMD_SET_TEAR_SCANLINE 0x44 /* Synchronization information is sent from the display module to the host processor when the display device refresh reaches the provided scanline */ +#define LV_LCD_CMD_GET_SCANLINE 0x45 /* Get the current scanline */ +#define LV_LCD_CMD_READ_DDB_CONTINUE 0xA8 /* Continue reading the DDB from the last read location */ +#define LV_LCD_CMD_READ_DDB_START 0xA1 /* Read the DDB from the provided location */ + +/* address mode flag masks */ +#define LV_LCD_MASK_FLIP_VERTICAL (1 << 0) /* This bit flips the image shown on the display device top to bottom. No change is made to the frame memory */ +#define LV_LCD_MASK_FLIP_HORIZONTAL (1 << 1) /* This bit flips the image shown on the display device left to right. No change is made to the frame memory */ +#define LV_LCD_MASK_DATA_LATCH_DATA_ORDER (1 << 2) /* Display Data Latch Order */ +#define LV_LCD_MASK_RGB_ORDER (1 << 3) /* RGB/BGR Order */ +#define LV_LCD_MASK_LINE_ADDRESS_ORDER (1 << 4) /* Line Address Order */ +#define LV_LCD_MASK_PAGE_COLUMN_ORDER (1 << 5) /* Page/Column Order */ +#define LV_LCD_MASK_COLUMN_ADDRESS_ORDER (1 << 6) /* Column Address Order */ +#define LV_LCD_MASK_PAGE_ADDRESS_ORDER (1 << 7) /* Page Address Order */ + +#define LV_LCD_BIT_FLIP_VERTICAL__NOT_FLIPPED 0 +#define LV_LCD_BIT_FLIP_VERTICAL__FLIPPED LV_LCD_MASK_FLIP_VERTICAL /* This bit flips the image shown on the display device top to bottom. No change is made to the frame memory */ +#define LV_LCD_BIT_FLIP_HORIZONTAL__NOT_FLIPPED 0 +#define LV_LCD_BIT_FLIP_HORIZONTAL__FLIPPED LV_LCD_MASK_FLIP_HORIZONTAL /* This bit flips the image shown on the display device left to right. No change is made to the frame memory */ +#define LV_LCD_BIT_DATA_LATCH_DATA_ORDER__LTOR 0 /* Display Data Latch Order: LCD Refresh Left to Right */ +#define LV_LCD_BIT_DATA_LATCH_DATA_ORDER__RTOL LV_LCD_MASK_DATA_LATCH_DATA_ORDER /* Display Data Latch Order: LCD Refresh Right to Left */ +#define LV_LCD_BIT_RGB_ORDER__RGB 0 /* RGB/BGR Order: RGB */ +#define LV_LCD_BIT_RGB_ORDER__BGR LV_LCD_MASK_RGB_ORDER /* RGB/BGR Order: BGR */ +#define LV_LCD_BIT_LINE_ADDRESS_ORDER__TTOB 0 /* Line Address Order: LCD Refresh Top to Bottom */ +#define LV_LCD_BIT_LINE_ADDRESS_ORDER__BTOT LV_LCD_MASK_LINE_ADDRESS_ORDER /* Line Address Order: LCD Refresh Bottom to Top */ +#define LV_LCD_BIT_PAGE_COLUMN_ORDER__NORMAL 0 /* Page/Column Order: Normal Mode */ +#define LV_LCD_BIT_PAGE_COLUMN_ORDER__REVERSE LV_LCD_MASK_PAGE_COLUMN_ORDER /* Page/Column Order: Reverse Mode */ +#define LV_LCD_BIT_COLUMN_ADDRESS_ORDER__LTOR 0 /* Column Address Order: Left to Right */ +#define LV_LCD_BIT_COLUMN_ADDRESS_ORDER__RTOL LV_LCD_MASK_COLUMN_ADDRESS_ORDER /* Column Address Order: Right to Left */ +#define LV_LCD_BIT_PAGE_ADDRESS_ORDER__TTOB 0 /* Page Address Order: Top to Bottom */ +#define LV_LCD_BIT_PAGE_ADDRESS_ORDER__BTOT LV_LCD_MASK_PAGE_ADDRESS_ORDER /* Page Address Order: Bottom to Top */ + +/* predefined gamma curves */ +#define LV_LCD_GAMMA_2_2 0x01 /* 2.2 */ +#define LV_LCD_GAMMA_1_8 0x02 /* 1.8 */ +#define LV_LCD_GAMMA_2_5 0x04 /* 2.5 */ +#define LV_LCD_GAMMA_1_0 0x08 /* 1.0 */ + +/* common pixel formats */ +#define LV_LCD_PIXEL_FORMAT_RGB565 0x55 /* bus: 16 bits, pixel: 16 bits */ +#define LV_LCD_PIXEL_FORMAT_RGB666 0x66 /* bus: 18 bits, pixel: 18 bits */ + +/* flags for lv_lcd_xxx_create() */ +#define LV_LCD_FLAG_NONE 0x00000000UL +#define LV_LCD_FLAG_MIRROR_X 0x00000001UL +#define LV_LCD_FLAG_MIRROR_Y 0x00000002UL +#define LV_LCD_FLAG_BGR 0x00000008UL +#define LV_LCD_FLAG_RGB666 0x00000010UL + +/* command list */ +#define LV_LCD_CMD_DELAY_MS 0xff +#define LV_LCD_CMD_EOF 0xff + +/********************** + * TYPEDEFS + **********************/ + +/** + * Configuration flags for lv_lcd_xxx_create() + * + */ +typedef uint32_t lv_lcd_flag_t; + +/** + * Prototype of a platform-dependent callback to transfer commands and data to the LCD controller. + * @param disp display object + * @param cmd command buffer (can handle 16 bit commands as well) + * @param cmd_size number of bytes of the command + * @param param parameter buffer + * @param param_size number of bytes of the parameters + */ +typedef void (*lv_lcd_send_cmd_cb_t)(lv_display_t * disp, const uint8_t * cmd, size_t cmd_size, const uint8_t * param, + size_t param_size); + +/** + * Prototype of a platform-dependent callback to transfer pixel data to the LCD controller. + * @param disp display object + * @param cmd command buffer (can handle 16 bit commands as well) + * @param cmd_size number of bytes of the command + * @param param parameter buffer + * @param param_size number of bytes of the parameters + */ +typedef void (*lv_lcd_send_color_cb_t)(lv_display_t * disp, const uint8_t * cmd, size_t cmd_size, uint8_t * param, + size_t param_size); + +/** + * Generic MIPI compatible LCD driver + */ +typedef struct { + lv_display_t * disp; /* the associated LVGL display object */ + lv_lcd_send_cmd_cb_t send_cmd; /* platform-specific implementation to send a command to the LCD controller */ + lv_lcd_send_color_cb_t send_color; /* platform-specific implementation to send pixel data to the LCD controller */ + uint16_t x_gap; /* x offset of the (0,0) pixel in VRAM */ + uint16_t y_gap; /* y offset of the (0,0) pixel in VRAM */ + uint8_t madctl_reg; /* current value of MADCTL register */ + uint8_t colmod_reg; /* current value of COLMOD register */ + bool mirror_x; + bool mirror_y; + bool swap_xy; +} lv_lcd_generic_mipi_driver_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a MIPI DCS compatible LCD display + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer). + * `lv_display_flush_ready` must be called after the transfer has finished. + * @return pointer to the created display + */ +lv_display_t * lv_lcd_generic_mipi_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_lcd_send_cmd_cb_t send_cmd_cb, lv_lcd_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_lcd_generic_mipi_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_lcd_generic_mipi_set_invert(lv_display_t * disp, bool invert); + +/** + * Set address mode + * @param disp display object + * @param mirror_x horizontal mirror (false: normal, true: mirrored) + * @param mirror_y vertical mirror (false: normal, true: mirrored) + * @param swap_xy swap axes (false: normal, true: swap) + * @param bgr RGB/BGR order (false: RGB, true: BGR) + */ +void lv_lcd_generic_mipi_set_address_mode(lv_display_t * disp, bool mirror_x, bool mirror_y, bool swap_xy, bool bgr); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_lcd_generic_mipi_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_lcd_generic_mipi_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + + +#endif /*LV_USE_GENERIC_MIPI*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LCD_GENERIC_MIPI_H*/ diff --git a/inc/lvgl/src/drivers/display/lovyan_gfx/lv_lgfx_user.hpp b/inc/lvgl/src/drivers/display/lovyan_gfx/lv_lgfx_user.hpp new file mode 100644 index 0000000..7dfce47 --- /dev/null +++ b/inc/lvgl/src/drivers/display/lovyan_gfx/lv_lgfx_user.hpp @@ -0,0 +1,53 @@ +#pragma once + +#if LV_USE_LOVYAN_GFX + +/** + * If using LovyanGFX create LGFX class that inherits from lgfx::LGFX_Device + * https://github.com/lovyan03/LovyanGFX/blob/master/examples/HowToUse/2_user_setting/2_user_setting.ino */ + +/** + * If using other display drivers that is not LovyanGFX + * Create an LGFX wrapper class that implements the functions used in lv_lovyan_gfx.cpp */ +class LGFX +{ +public: + LGFX(void) {} + + bool init(void) + { + return true; + } + + void initDMA(void) {} + + void waitDMA(void) {} + + void fillScreen(uint16_t color) {} + + void setRotation(uint8_t rotation) {} + + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data) {} + + void pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data) {} + + void startWrite(void) {} + + uint32_t getStartCount(void) + { + return 0; + } + + void endWrite(void) {} + + void setBrightness(uint8_t brightness){} + + void writePixel(int32_t x, int32_t y, const uint16_t color) {} + + bool getTouch(uint16_t *x, uint16_t *y) + { + return false; + } +}; + +#endif diff --git a/inc/lvgl/src/drivers/display/lovyan_gfx/lv_lovyan_gfx.cpp b/inc/lvgl/src/drivers/display/lovyan_gfx/lv_lovyan_gfx.cpp new file mode 100644 index 0000000..49103c1 --- /dev/null +++ b/inc/lvgl/src/drivers/display/lovyan_gfx/lv_lovyan_gfx.cpp @@ -0,0 +1,183 @@ +/** + * @file lv_lovyan_gfx.cpp + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_lovyan_gfx.h" +#if LV_USE_LOVYAN_GFX + +#include LV_LGFX_USER_INCLUDE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + LGFX * tft; +} lv_lovyan_gfx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void resolution_changed_event_cb(lv_event_t * e); +static void read_touch(lv_indev_t * indev_driver, lv_indev_data_t * data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_lovyan_gfx_create(uint32_t hor_res, uint32_t ver_res, void * buf, uint32_t buf_size_bytes, bool touch) +{ + lv_lovyan_gfx_t * dsc = (lv_lovyan_gfx_t *)lv_malloc_zeroed(sizeof(lv_lovyan_gfx_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + + dsc->tft = new LGFX(); + dsc->tft->init(); /* TFT init */ + dsc->tft->initDMA(); + dsc->tft->setRotation(0); + dsc->tft->setBrightness(255); + dsc->tft->startWrite(); + dsc->tft->fillScreen(0x00000); + + lv_display_set_driver_data(disp, (void *)dsc); + lv_display_set_flush_cb(disp, flush_cb); + lv_display_set_color_format(disp, LV_COLOR_FORMAT_RGB565_SWAPPED); + lv_display_add_event_cb(disp, resolution_changed_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + lv_display_set_buffers(disp, (void *)buf, NULL, buf_size_bytes, LV_DISPLAY_RENDER_MODE_PARTIAL); + + if(touch) { + /* Register an input device when touch is enabled */ + lv_indev_t * lv_input = lv_indev_create(); + lv_indev_set_driver_data(lv_input, (void *)dsc); + lv_indev_set_type(lv_input, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(lv_input, read_touch); + } + + return disp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + lv_lovyan_gfx_t * dsc = (lv_lovyan_gfx_t *)lv_display_get_driver_data(disp); + + uint32_t w = (area->x2 - area->x1 + 1); + uint32_t h = (area->y2 - area->y1 + 1); + + + if(dsc->tft->getStartCount() == 0) { + dsc->tft->endWrite(); + } + dsc->tft->pushImageDMA(area->x1, area->y1, w, h, (uint16_t *)px_map); + dsc->tft->waitDMA(); + + lv_display_flush_ready(disp); + +} + +static void resolution_changed_event_cb(lv_event_t * e) +{ + lv_display_t * disp = (lv_display_t *)lv_event_get_target(e); + lv_lovyan_gfx_t * dsc = (lv_lovyan_gfx_t *)lv_display_get_driver_data(disp); + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + lv_display_rotation_t rot = lv_display_get_rotation(disp); + + /* handle rotation */ + switch(rot) { + case LV_DISPLAY_ROTATION_0: + dsc->tft->setRotation(0); /* Portrait orientation */ + break; + case LV_DISPLAY_ROTATION_90: + dsc->tft->setRotation(1); /* Landscape orientation */ + break; + case LV_DISPLAY_ROTATION_180: + dsc->tft->setRotation(2); /* Portrait orientation, flipped */ + break; + case LV_DISPLAY_ROTATION_270: + dsc->tft->setRotation(3); /* Landscape orientation, flipped */ + break; + } +} + +static void read_touch(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_lovyan_gfx_t * dsc = (lv_lovyan_gfx_t *)lv_indev_get_driver_data(indev); + uint16_t x, y; + bool touched = dsc->tft->getTouch(&x, &y); + + if(!touched) { + data->state = LV_INDEV_STATE_RELEASED; + } + else { + data->state = LV_INDEV_STATE_PRESSED; + + /* LovyanGFX returns coordinates relative to the current software rotation. + * LVGL will also rotate the input coordinates based on the display rotation. + * To avoid "double rotation", we must reverse the LovyanGFX rotation + * and pass raw (Physical/Rotation 0) coordinates to LVGL. + */ + uint8_t rotation = dsc->tft->getRotation(); + + /* Note: width() and height() return dimensions for the *current* rotation */ + int32_t w = dsc->tft->width(); + int32_t h = dsc->tft->height(); + + switch(rotation) { + case 1: /* Landscape (90 deg CW) */ + /* Rot 0 (Phys) Top-Left becomes Rot 1 Top-Right. + * Phys X = Rot1 Y + * Phys Y = Rot1 Width - 1 - Rot1 X */ + data->point.x = y; + data->point.y = w - 1 - x; + break; + + case 2: /* Portrait Inverted (180 deg) */ + /* Phys X = Rot2 Width - 1 - Rot2 X + * Phys Y = Rot2 Height - 1 - Rot2 Y */ + data->point.x = w - 1 - x; + data->point.y = h - 1 - y; + break; + + case 3: /* Landscape Inverted (270 deg CW) */ + /* Phys X = Rot3 Height - 1 - Rot3 Y + * Phys Y = Rot3 X */ + data->point.x = h - 1 - y; + data->point.y = x; + break; + + default: /* Portrait (0 deg) */ + /* Pass through raw coordinates */ + data->point.x = x; + data->point.y = y; + break; + } + } +} + +#endif /*LV_USE_LOVYAN_GFX*/ diff --git a/inc/lvgl/src/drivers/display/lovyan_gfx/lv_lovyan_gfx.h b/inc/lvgl/src/drivers/display/lovyan_gfx/lv_lovyan_gfx.h new file mode 100644 index 0000000..1d27c45 --- /dev/null +++ b/inc/lvgl/src/drivers/display/lovyan_gfx/lv_lovyan_gfx.h @@ -0,0 +1,45 @@ +/** + * @file lv_lovyan_gfx.h + * + */ + +#ifndef LV_LOVYAN_GFX_H +#define LV_LOVYAN_GFX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../display/lv_display.h" +#include "../../../indev/lv_indev.h" + +#if LV_USE_LOVYAN_GFX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_display_t * lv_lovyan_gfx_create(uint32_t hor_res, uint32_t ver_res, void * buf, uint32_t buf_size_bytes, + bool touch); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LOVYAN_GFX */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_LOVYAN_GFX_H */ diff --git a/inc/lvgl/src/drivers/display/nv3007/lv_nv3007.c b/inc/lvgl/src/drivers/display/nv3007/lv_nv3007.c new file mode 100644 index 0000000..5e96adc --- /dev/null +++ b/inc/lvgl/src/drivers/display/nv3007/lv_nv3007.c @@ -0,0 +1,226 @@ +/** + * @file lv_nv3007.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_nv3007.h" + +#if LV_USE_NV3007 + +/********************* + * DEFINES + *********************/ + +#define NV3007_SLPIN 0x10 +#define NV3007_SLPOUT 0x11 + +#define NV3007_INVOFF 0x20 +#define NV3007_INVON 0x21 +#define NV3007_DISPOFF 0x28 +#define NV3007_DISPON 0x29 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC CONSTANTS + **********************/ + +/* init commands based on ArduinoGFX NV3007 driver */ +static const uint8_t init_cmd_list[] = { + 0x9a, 1, 0x08, + 0x9b, 1, 0x08, + 0x9c, 1, 0xb0, + 0x9d, 1, 0x16, + 0x9e, 1, 0xc4, + 0x8f, 2, 0x55, 0x04, + 0x84, 1, 0x90, + 0x83, 1, 0x7b, + 0x85, 1, 0x33, + 0x60, 1, 0x00, + 0x70, 1, 0x00, + 0x61, 1, 0x02, + 0x71, 1, 0x02, + 0x62, 1, 0x04, + 0x72, 1, 0x04, + 0x6c, 1, 0x29, + 0x7c, 1, 0x29, + 0x6d, 1, 0x31, + 0x7d, 1, 0x31, + 0x6e, 1, 0x0f, + 0x7e, 1, 0x0f, + 0x66, 1, 0x21, + 0x76, 1, 0x21, + 0x68, 1, 0x3A, + 0x78, 1, 0x3A, + 0x63, 1, 0x07, + 0x73, 1, 0x07, + 0x64, 1, 0x05, + 0x74, 1, 0x05, + 0x65, 1, 0x02, + 0x75, 1, 0x02, + 0x67, 1, 0x23, + 0x77, 1, 0x23, + 0x69, 1, 0x08, + 0x79, 1, 0x08, + 0x6a, 1, 0x13, + 0x7a, 1, 0x13, + 0x6b, 1, 0x13, + 0x7b, 1, 0x13, + 0x6f, 1, 0x00, + 0x7f, 1, 0x00, + 0x50, 1, 0x00, + 0x52, 1, 0xd6, + 0x53, 1, 0x08, + 0x54, 1, 0x08, + 0x55, 1, 0x1e, + 0x56, 1, 0x1c, + + 0xa0, 3, 0x2b, 0x24, 0x00, + + 0xa1, 1, 0x87, + 0xa2, 1, 0x86, + 0xa5, 1, 0x00, + 0xa6, 1, 0x00, + 0xa7, 1, 0x00, + 0xa8, 1, 0x36, + 0xa9, 1, 0x7e, + 0xaa, 1, 0x7e, + 0xB9, 1, 0x85, + 0xBA, 1, 0x84, + 0xBB, 1, 0x83, + 0xBC, 1, 0x82, + 0xBD, 1, 0x81, + 0xBE, 1, 0x80, + 0xBF, 1, 0x01, + 0xC0, 1, 0x02, + 0xc1, 1, 0x00, + 0xc2, 1, 0x00, + 0xc3, 1, 0x00, + 0xc4, 1, 0x33, + 0xc5, 1, 0x7e, + 0xc6, 1, 0x7e, + 0xC8, 2, 0x33, 0x33, + 0xC9, 1, 0x68, + 0xCA, 1, 0x69, + 0xCB, 1, 0x6a, + 0xCC, 1, 0x6b, + 0xCD, 2, 0x33, 0x33, + 0xCE, 1, 0x6c, + 0xCF, 1, 0x6d, + 0xD0, 1, 0x6e, + 0xD1, 1, 0x6f, + 0xAB, 2, 0x03, 0x67, + 0xAC, 2, 0x03, 0x6b, + 0xAD, 2, 0x03, 0x68, + 0xAE, 2, 0x03, 0x6c, + 0xb3, 1, 0x00, + 0xb4, 1, 0x00, + 0xb5, 1, 0x00, + 0xB6, 1, 0x32, + 0xB7, 1, 0x7e, + 0xB8, 1, 0x7e, + 0xe0, 1, 0x00, + 0xe1, 2, 0x03, 0x0f, + 0xe2, 1, 0x04, + 0xe3, 1, 0x01, + 0xe4, 1, 0x0e, + 0xe5, 1, 0x01, + 0xe6, 1, 0x19, + 0xe7, 1, 0x10, + 0xe8, 1, 0x10, + 0xea, 1, 0x12, + 0xeb, 1, 0xd0, + 0xec, 1, 0x04, + 0xed, 1, 0x07, + 0xee, 1, 0x07, + 0xef, 1, 0x09, + 0xf0, 1, 0xd0, + 0xf1, 1, 0x0e, + 0xF9, 1, 0x17, + + 0xf2, 4, 0x2c, 0x1b, 0x0b, 0x20, + + 0xe9, 1, 0x29, + 0xec, 1, 0x04, + 0x35, 1, 0x00, + 0x44, 2, 0x00, 0x10, + 0x46, 1, 0x10, + + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +static const uint8_t init_cmd_list_2[] = { + 0x3a, 1, 0x05, + NV3007_SLPOUT, 0, + LV_LCD_CMD_DELAY_MS, 22, + NV3007_DISPON, 0, + + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_nv3007_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_nv3007_send_cmd_cb_t send_cmd_cb, lv_nv3007_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); + + send_cmd_cb(disp, (const uint8_t[]) { + 0xFF + }, 1, (const uint8_t[]) { + 0xA5 + }, 1); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); + send_cmd_cb(disp, (const uint8_t[]) { + 0xFF + }, 1, (const uint8_t[]) { + 0x00 + }, 1); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list_2); + return disp; +} + +void lv_nv3007_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_set_gap(disp, x, y); +} + +void lv_nv3007_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_set_invert(disp, invert); +} + +void lv_nv3007_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); +} + +void lv_nv3007_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_NV3007*/ diff --git a/inc/lvgl/src/drivers/display/nv3007/lv_nv3007.h b/inc/lvgl/src/drivers/display/nv3007/lv_nv3007.h new file mode 100644 index 0000000..9b5d581 --- /dev/null +++ b/inc/lvgl/src/drivers/display/nv3007/lv_nv3007.h @@ -0,0 +1,94 @@ +/** + * @file lv_nv3007.h + * + * This driver is just a wrapper around the generic MIPI compatible LCD controller driver + * + */ + +#ifndef LV_NV3007_H +#define LV_NV3007_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lcd/lv_lcd_generic_mipi.h" + +#if LV_USE_NV3007 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_lcd_send_cmd_cb_t lv_nv3007_send_cmd_cb_t; +typedef lv_lcd_send_color_cb_t lv_nv3007_send_color_cb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an LCD display with NV3007 driver + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_nv3007_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_nv3007_send_cmd_cb_t send_cmd_cb, lv_nv3007_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_nv3007_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_nv3007_set_invert(lv_display_t * disp, bool invert); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_nv3007_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_nv3007_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + + +#endif /*LV_USE_NV3007*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NV3007_H*/ diff --git a/inc/lvgl/src/drivers/display/nxp_elcdif/lv_nxp_elcdif.c b/inc/lvgl/src/drivers/display/nxp_elcdif/lv_nxp_elcdif.c new file mode 100644 index 0000000..c25b371 --- /dev/null +++ b/inc/lvgl/src/drivers/display/nxp_elcdif/lv_nxp_elcdif.c @@ -0,0 +1,185 @@ +/** + * @file lv_nxp_elcdif.c + * + * Driver for NXP's ELCD + */ + +#include "lv_nxp_elcdif.h" + +#if LV_USE_NXP_ELCDIF == 1 +/********************* + * INCLUDES + *********************/ +#include "../../../display/lv_display_private.h" +#include "fsl_video_common.h" +#include "fsl_elcdif.h" +#include "fsl_cache.h" + +/********************* + * DEFINES + *********************/ +#if (defined(FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET) && (0 != FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET)) + #define ELCDIF_ADDR_IP_2_CPU(addr) (MEMORY_ConvertMemoryMapAddress((uint32_t)(addr), kMEMORY_DMA2Local)) +#else + #define ELCDIF_ADDR_IP_2_CPU(addr) (addr) +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); +static void flush_partial_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); +static lv_color_format_t lv_nxp_elcdif_to_lvgl_color_converter(elcdif_rgb_mode_config_t * config); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_nxp_display_elcdif_create_direct(LCDIF_Type * base, const elcdif_rgb_mode_config_t * config, + void * frame_buffer1, + void * frame_buffer2, size_t buf_size) +{ + LV_ASSERT(base); + LV_ASSERT(config); + + lv_display_t * disp = lv_display_create(config->panelWidth, config->panelHeight); + LV_ASSERT(disp); + + lv_color_format_t color_format = lv_nxp_elcdif_to_lvgl_color_converter((elcdif_rgb_mode_config_t *)config); + lv_display_set_color_format(disp, color_format); + lv_display_set_buffers(disp, frame_buffer1, frame_buffer2, buf_size, LV_DISPLAY_RENDER_MODE_DIRECT); + lv_display_set_user_data(disp, base); + + ELCDIF_EnableInterrupts(base, kELCDIF_CurFrameDoneInterruptEnable); + NVIC_EnableIRQ(eLCDIF_IRQn); + + return disp; +} + +lv_display_t * lv_nxp_display_elcdif_create_partial(LCDIF_Type * base, const elcdif_rgb_mode_config_t * config, + void * frame_buffer1, + void * frame_buffer2, size_t buf_size) +{ + LV_ASSERT(base); + LV_ASSERT(config); + + /* Create a direct mode display and then update the buffers to be set in partial mode */ + lv_display_t * disp = lv_nxp_display_elcdif_create_direct(base, config, frame_buffer1, frame_buffer2, buf_size); + ELCDIF_DisableInterrupts(base, kELCDIF_CurFrameDoneInterruptEnable); + NVIC_DisableIRQ(eLCDIF_IRQn); + + lv_display_set_flush_cb(disp, flush_partial_cb); + lv_display_set_buffers(disp, frame_buffer1, frame_buffer2, buf_size, LV_DISPLAY_RENDER_MODE_PARTIAL); + + ELCDIF_EnableInterrupts(base, kELCDIF_CurFrameDoneInterruptEnable); + NVIC_EnableIRQ(eLCDIF_IRQn); + + return disp; +} + +void lv_nxp_display_elcdif_event_handler(const lv_display_t * disp) +{ + if(disp == NULL) { + /* Just return since no valid display has been set yet */ + return; + } + + LCDIF_Type * base = (LCDIF_Type *)lv_display_get_user_data((lv_display_t *)disp); + uint32_t intStatus = ELCDIF_GetInterruptStatus(base); + + ELCDIF_ClearInterruptStatus(base, intStatus); + + if(intStatus & kELCDIF_CurFrameDone) { + /* flush ready is ISR safe and atomic, so calling inside of the + * framebuffer interrupt is safe and makes the flush chain + * non blocking even in bare metal systems. + */ + lv_disp_flush_ready((lv_display_t *)disp); + } + + SDK_ISR_EXIT_BARRIER; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) +{ + LCDIF_Type * base = (LCDIF_Type *)lv_display_get_user_data(disp); + + DCACHE_CleanInvalidateByRange((uint32_t)color_p, lv_display_get_draw_buf_size(disp)); + + if(!lv_display_flush_is_last(disp)) { + lv_disp_flush_ready(disp); + return; + } + ELCDIF_SetNextBufferAddr(base, (uint32_t)color_p); +} + +static void flush_partial_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) +{ + LCDIF_Type * base = (LCDIF_Type *)lv_display_get_user_data(disp); + + DCACHE_CleanInvalidateByRange((uint32_t)color_p, lv_display_get_draw_buf_size(disp)); + + uint8_t * fb = (uint8_t *)ELCDIF_ADDR_IP_2_CPU(base->CUR_BUF); + int32_t w = lv_area_get_width(area); + int32_t h = lv_area_get_height(area); + int32_t disp_w = lv_display_get_horizontal_resolution(disp); + int32_t disp_h = lv_display_get_vertical_resolution(disp); + int32_t bytes_per_pixel = LV_COLOR_FORMAT_GET_SIZE(lv_display_get_color_format(disp)); + int32_t i; + + fb = fb + area->y1 * disp_h; + fb = fb + area->x1; + + for(i = 0; i < h; i++) { + lv_memcpy(fb, color_p, w * bytes_per_pixel); + fb += disp_h; + color_p += w; + } +} + +static lv_color_format_t lv_nxp_elcdif_to_lvgl_color_converter(elcdif_rgb_mode_config_t * config) +{ + /*Handle color format conversion*/ + lv_color_format_t color_format; + + switch(config->pixelFormat) { + case kELCDIF_PixelFormatRAW8 : + color_format = LV_COLOR_FORMAT_L8; + break; + case kELCDIF_PixelFormatRGB565 : + color_format = LV_COLOR_FORMAT_RGB565; + break; + case kELCDIF_PixelFormatXRGB8888 : + color_format = LV_COLOR_FORMAT_XRGB8888; + break; + case kELCDIF_PixelFormatRGB888 : + color_format = LV_COLOR_FORMAT_RGB888; + break; + /* + There are some color formats in ELCDIF which LVGL does not support. + For these, use unknown format and drop a msg for the user + */ + default : + color_format = LV_COLOR_FORMAT_UNKNOWN; + LV_LOG_WARN("Not supported color format in ELCDIF. Using LV_UNKNOWN!"); + } + return color_format; +} + +#endif /*LV_USE_NXP_ELCDIF*/ diff --git a/inc/lvgl/src/drivers/display/nxp_elcdif/lv_nxp_elcdif.h b/inc/lvgl/src/drivers/display/nxp_elcdif/lv_nxp_elcdif.h new file mode 100644 index 0000000..29625e9 --- /dev/null +++ b/inc/lvgl/src/drivers/display/nxp_elcdif/lv_nxp_elcdif.h @@ -0,0 +1,84 @@ +/** + * @file lv_nxp_elcdif.h + * Driver for NXP's ELCD + */ + +#ifndef LV_NXP_ELCDIF_H +#define LV_NXP_ELCDIF_H + +#include "../../../lvgl.h" +#include "../../../display/lv_display.h" + +#if LV_USE_NXP_ELCDIF == 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "fsl_elcdif.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Attach LVGL to ELCDIF using DIRECT rendering mode. + * ELCDIF should be already initialized. + * @param base The NXP eLCD controller base address + * @param config NXP eLCD config object + * @param frame_buffer1 pointer the first frame buffers + * @param frame_buffer2 pointer the second frame buffers + * @param buf_size size of a buffer in bytes (must be at least as large as the screen) + * @return a display object initialized and registerd on the LVGL runtime + */ +lv_display_t * lv_nxp_display_elcdif_create_direct(LCDIF_Type * base, const elcdif_rgb_mode_config_t * config, + void * frame_buffer1, + void * frame_buffer2, size_t buf_size); + + +/** +* Attach LVGL to ELCDIF using PARTIAL rendering mode. +* ELCDIF should be already initialized. +* @param base The NXP eLCD controller base address +* @param config NXP eLCD config object +* @param frame_buffer1 pointer the first frame buffers +* @param frame_buffer2 pointer the second frame buffers +* @param buf_size size of a buffer in bytes +* @return a display object initialized and registerd on the LVGL runtime +*/ +lv_display_t * lv_nxp_display_elcdif_create_partial(LCDIF_Type * base, const elcdif_rgb_mode_config_t * config, + void * frame_buffer1, + void * frame_buffer2, size_t buf_size); + +/** + * Call this function on the LCD Interrupt Service Routine + * It tells to LVGL what to do when a framebuffer is transmitted + * to the LCD panel + * @param disp The display instance that contains the eLCD related data + * + * @note: the parameter disp is tipycally the return value after + * `lv_nxp_display_elcdif_create_direct` has been sucessfully executed + */ +void lv_nxp_display_elcdif_event_handler(const lv_display_t * disp); +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_NXP_ELCDIF*/ + +#endif /* LV_NXP_ELCDIF_H */ diff --git a/inc/lvgl/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.c b/inc/lvgl/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.c new file mode 100644 index 0000000..7e55799 --- /dev/null +++ b/inc/lvgl/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.c @@ -0,0 +1,361 @@ +/** + * @file lv_renesas_glcdc.c + * + */ + +/********************* + *PLATFORM ABSTRACTION + *********************/ + +#ifdef _RENESAS_RA_ + #define USE_FREE_RTOS (BSP_CFG_RTOS == 2) +#else // RX with SMC code generation + #ifndef _RENESAS_RX_ + #define _RENESAS_RX_ 1 + #endif + #define USE_FREE_RTOS 1 + #define DISPLAY_HSIZE_INPUT0 LCD_CH0_IN_GR2_HSIZE + #define DISPLAY_VSIZE_INPUT0 LCD_CH0_IN_GR2_VSIZE + #define DISPLAY_BUFFER_STRIDE_BYTES_INPUT0 LCD_CH0_IN_GR2_LINEOFFSET +#endif /*_RENESAS_RA_*/ + +/********************* + * INCLUDES + *********************/ +#include "lv_renesas_glcdc.h" + +#if LV_USE_RENESAS_GLCDC + +#ifdef _RENESAS_RA_ + #include "LVGL_thread.h" +#else /* RX */ + #include "hal_data.h" + #include "platform.h" + #include "r_glcdc_rx_if.h" + #include "r_glcdc_rx_pinset.h" +#endif /*_RENESAS_RA_*/ + +#include +#include "../../../display/lv_display_private.h" +#include "../../../draw/sw/lv_draw_sw.h" + +/********************* + * DEFINES + *********************/ +#define BYTES_PER_PIXEL 2 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_display_t * glcdc_create(void * buf1, void * buf2, uint32_t buf_size, lv_display_render_mode_t render_mode); +static void glcdc_init(void); +static void give_vsync_sem_and_yield(void); +static void flush_direct(lv_display_t * display, const lv_area_t * area, uint8_t * px_map); +static void flush_partial(lv_display_t * display, const lv_area_t * area, uint8_t * px_map); +static void flush_wait_direct(lv_display_t * display); +static void flush_wait_partial(lv_display_t * display); + +#ifdef _RENESAS_RX_ + static void enable_dave2d_drw_interrupt(void); +#endif /*_RENESAS_RX_*/ + +/********************** + * STATIC VARIABLES + **********************/ + +#ifdef _RENESAS_RX_ +static uint8_t fb_background[2][LCD_CH0_IN_GR2_HSIZE * LCD_CH0_IN_GR2_VSIZE * BYTES_PER_PIXEL]__attribute__(( + section(".framebuffer"), aligned(64), used)); +static SemaphoreHandle_t _SemaphoreVsync = NULL; +static glcdc_cfg_t g_config; +static glcdc_runtime_cfg_t g_layer_change; + +/* A global variable that Dave 2D driver relies on. (Being auto generated on RA platforms)*/ +display_t g_display0_cfg; +#endif /*_RENESAS_RX_*/ + +static void * rotation_buffer = NULL; +static uint32_t partial_buffer_size = 0; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_renesas_glcdc_direct_create(void) +{ + return glcdc_create(&fb_background[0][0], &fb_background[1][0], sizeof(fb_background[0]), + LV_DISPLAY_RENDER_MODE_DIRECT); +} + +lv_display_t * lv_renesas_glcdc_partial_create(void * buf1, void * buf2, size_t buf_size) +{ + partial_buffer_size = buf_size; + return glcdc_create(buf1, buf2, buf_size, LV_DISPLAY_RENDER_MODE_PARTIAL); +} + +/*This function is declared in and being used by FSP generated code modules*/ +#ifdef _RENESAS_RA_ +void glcdc_callback(display_callback_args_t * p_args) +{ + if(DISPLAY_EVENT_LINE_DETECTION == p_args->event) { + give_vsync_sem_and_yield(); + } + else if(DISPLAY_EVENT_GR1_UNDERFLOW == p_args->event) { + __BKPT(0); /*Layer 1 Underrun*/ + } + else if(DISPLAY_EVENT_GR2_UNDERFLOW == p_args->event) { + __BKPT(0); /*Layer 2 Underrun*/ + } + else { /*DISPLAY_EVENT_FRAME_END*/ + __BKPT(0); + } +} +#else /* RX */ +void glcdc_callback(glcdc_callback_args_t * p_args) +{ + if(GLCDC_EVENT_LINE_DETECTION == p_args->event) { + give_vsync_sem_and_yield(); + } + else if(GLCDC_EVENT_GR1_UNDERFLOW == p_args->event) { + while(1); /*Layer 1 Underrun*/ + } + else if(GLCDC_EVENT_GR2_UNDERFLOW == p_args->event) { + while(1); /*Layer 2 Underrun*/ + } + else {/*DISPLAY_EVENT_FRAME_END*/ + while(1); + } +} +#endif /*_RENESAS_RA_*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_display_t * glcdc_create(void * buf1, void * buf2, uint32_t buf_size, lv_display_render_mode_t render_mode) +{ +#ifdef _RENESAS_RA_ + glcdc_init(); +#else + g_display0_cfg.input->format = LCD_CH0_IN_GR2_FORMAT; + _SemaphoreVsync = xSemaphoreCreateBinary(); + + glcdc_init(); + enable_dave2d_drw_interrupt(); +#endif /*_RENESAS_RA_*/ + + lv_display_t * display = lv_display_create(DISPLAY_HSIZE_INPUT0, DISPLAY_VSIZE_INPUT0); + + if(render_mode == LV_DISPLAY_RENDER_MODE_DIRECT) { + lv_display_set_flush_cb(display, flush_direct); + lv_display_set_flush_wait_cb(display, flush_wait_direct); + } + else if(render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) { + lv_display_set_flush_cb(display, flush_partial); + lv_display_set_flush_wait_cb(display, flush_wait_partial); + } + else { + LV_ASSERT(0); + } + + lv_display_set_buffers_with_stride(display, buf1, buf2, buf_size, DISPLAY_BUFFER_STRIDE_BYTES_INPUT0, render_mode); + + return display; +} + +static void give_vsync_sem_and_yield(void) +{ +#if USE_FREE_RTOS + BaseType_t context_switch; + + /*Set Vsync semaphore*/ + xSemaphoreGiveFromISR(_SemaphoreVsync, &context_switch); + + /*Return to the highest priority available task*/ + portYIELD_FROM_ISR(context_switch); +#else +#endif /*USE_FREE_RTOS*/ +} + +static void glcdc_init(void) +{ + /* Fill the Frame buffer with black colour (0x0000 in RGB565), for a clean start after previous runs */ + lv_memzero(fb_background, sizeof(fb_background)); + +#ifdef _RENESAS_RA_ + /* Initialize GLCDC driver */ + uint8_t * p_fb = &fb_background[1][0]; + fsp_err_t err; + + err = R_GLCDC_Open(&g_display0_ctrl, &g_display0_cfg); + if(FSP_SUCCESS != err) { + __BKPT(0); + } + + err = R_GLCDC_Start(&g_display0_ctrl); + if(FSP_SUCCESS != err) { + __BKPT(0); + } + + do { + err = + R_GLCDC_BufferChange(&g_display0_ctrl, + (uint8_t *) p_fb, + (display_frame_layer_t) 0); + } while(FSP_ERR_INVALID_UPDATE_TIMING == err); +#else /* RX */ + glcdc_err_t err; + glcdc_runtime_cfg_t layer_change; + + R_GLCDC_PinSet(); + + err = R_GLCDC_Open(&g_config); + if(GLCDC_SUCCESS != err) { + while(1); + } + + err = R_GLCDC_Control(GLCDC_CMD_START_DISPLAY, &g_config); + if(GLCDC_SUCCESS != err) { + while(1); + } + + g_layer_change.input = g_config.input[GLCDC_FRAME_LAYER_2]; + g_layer_change.chromakey = g_config.chromakey[GLCDC_FRAME_LAYER_2]; + g_layer_change.blend = g_config.blend[GLCDC_FRAME_LAYER_2]; + + layer_change.input.p_base = (uint32_t *)&fb_background[1][0]; + + do { + err = R_GLCDC_LayerChange(GLCDC_FRAME_LAYER_2, &g_layer_change); + } while(GLCDC_ERR_INVALID_UPDATE_TIMING == err); +#endif /*_RENESAS_RA_*/ +} + +static void flush_direct(lv_display_t * display, const lv_area_t * area, uint8_t * px_map) +{ + FSP_PARAMETER_NOT_USED(area); + /*Display the frame buffer pointed by px_map*/ + + if(!lv_display_flush_is_last(display)) return; + +#if defined(RENESAS_CORTEX_M85) && (BSP_CFG_DCACHE_ENABLED) + /* Invalidate cache - so the HW can access any data written by the CPU */ + SCB_CleanInvalidateDCache_by_Addr(px_map, sizeof(fb_background[0])); +#endif + +#ifdef _RENESAS_RA_ + R_GLCDC_BufferChange(&g_display0_ctrl, + (uint8_t *) px_map, + (display_frame_layer_t) 0); +#else /* RX */ + glcdc_err_t err; + + g_layer_change.input.p_base = (uint32_t *)px_map; + + do { + err = R_GLCDC_LayerChange(GLCDC_FRAME_LAYER_2, &g_layer_change); + } while(GLCDC_ERR_INVALID_UPDATE_TIMING == err); +#endif /*_RENESAS_RA_*/ +} + +static void flush_wait_direct(lv_display_t * display) +{ + if(!lv_display_flush_is_last(display)) return; + +#if USE_FREE_RTOS + /*If Vsync semaphore has already been set, clear it then wait to avoid tearing*/ + if(uxSemaphoreGetCount(_SemaphoreVsync)) { + xSemaphoreTake(_SemaphoreVsync, 10); + } + + xSemaphoreTake(_SemaphoreVsync, portMAX_DELAY); +#endif /*USE_FREE_RTOS*/ + +} + +static void flush_partial(lv_display_t * display, const lv_area_t * area, uint8_t * px_map) +{ + uint16_t * img = (uint16_t *)px_map; + + lv_area_t rotated_area; + lv_color_format_t cf = lv_display_get_color_format(display); + lv_display_rotation_t rotation = lv_display_get_rotation(display); + + if(rotation != LV_DISPLAY_ROTATION_0) { + int32_t w = lv_area_get_width(area); + int32_t h = lv_area_get_height(area); + uint32_t w_stride = lv_draw_buf_width_to_stride(w, cf); + uint32_t h_stride = lv_draw_buf_width_to_stride(h, cf); + + // only allocate if rotation is actually being used + if(!rotation_buffer) { + rotation_buffer = lv_malloc(partial_buffer_size); + LV_ASSERT_MALLOC(rotation_buffer); + } + + if(rotation == LV_DISPLAY_ROTATION_180) + lv_draw_sw_rotate(img, rotation_buffer, w, h, w_stride, w_stride, rotation, cf); + else /* 90 or 270 */ + lv_draw_sw_rotate(img, rotation_buffer, w, h, w_stride, h_stride, rotation, cf); + + img = rotation_buffer; + + rotated_area = *area; + lv_display_rotate_area(display, &rotated_area); + area = &rotated_area; + } + + int32_t w = lv_area_get_width(area); + int32_t h = lv_area_get_height(area); + + uint16_t * fb = (uint16_t *)fb_background[1]; + + fb = fb + area->y1 * DISPLAY_HSIZE_INPUT0; + fb = fb + area->x1; + + int32_t i; + for(i = 0; i < h; i++) { + lv_memcpy(fb, img, w * BYTES_PER_PIXEL); + +#if defined(RENESAS_CORTEX_M85) && (BSP_CFG_DCACHE_ENABLED) + SCB_CleanInvalidateDCache_by_Addr(fb, w * BYTES_PER_PIXEL); +#endif + fb += DISPLAY_HSIZE_INPUT0; + img += w; + } +} + +static void flush_wait_partial(lv_display_t * display) +{ + LV_UNUSED(display); + + return; +} + +#ifdef _RENESAS_RX_ +extern void drw_int_isr(void); + +static void enable_dave2d_drw_interrupt(void) +{ + bsp_int_ctrl_t grpal1; + + /* Specify the priority of the group interrupt. */ + grpal1.ipl = 5; + + /* Use the BSP API to register the interrupt handler for DRW2D. */ + R_BSP_InterruptWrite(BSP_INT_SRC_AL1_DRW2D_DRW_IRQ, (bsp_int_cb_t)drw_int_isr); + + /* Use the BSP API to enable the group interrupt. */ + R_BSP_InterruptControl(BSP_INT_SRC_AL1_DRW2D_DRW_IRQ, BSP_INT_CMD_GROUP_INTERRUPT_ENABLE, (void *)&grpal1); +} +#endif /*_RENESAS_RX_*/ + +#endif /*LV_USE_RENESAS_GLCDC*/ diff --git a/inc/lvgl/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.h b/inc/lvgl/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.h new file mode 100644 index 0000000..bb8abef --- /dev/null +++ b/inc/lvgl/src/drivers/display/renesas_glcdc/lv_renesas_glcdc.h @@ -0,0 +1,57 @@ +/** + * @file lv_renesas_glcdc.h + * + */ + +#ifndef LV_RENESAS_GLCDC_H +#define LV_RENESAS_GLCDC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../display/lv_display.h" + +#if LV_USE_RENESAS_GLCDC + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a display using Renesas' GLCDC peripheral in DIRECT render mode + * @return pointer to the created display + */ +lv_display_t * lv_renesas_glcdc_direct_create(void); + +/** + * Create a display using Renesas' GLCDC peripheral in PARTIAL render mode + * @param buf1 first buffer + * @param buf2 second buffer (can be `NULL`) + * @param buf_size buffer size in byte + * @return pointer to the created display + */ +lv_display_t * lv_renesas_glcdc_partial_create(void * buf1, void * buf2, size_t buf_size); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_RENESAS_GLCDC */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_RENESAS_GLCDC_H */ diff --git a/inc/lvgl/src/drivers/display/st7735/lv_st7735.c b/inc/lvgl/src/drivers/display/st7735/lv_st7735.c new file mode 100644 index 0000000..6b5e62d --- /dev/null +++ b/inc/lvgl/src/drivers/display/st7735/lv_st7735.c @@ -0,0 +1,113 @@ +/** + * @file lv_st7735.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_st7735.h" + +#if LV_USE_ST7735 + +/********************* + * DEFINES + *********************/ + +#define CMD_GAMSET 0x26 + +#define CMD_FRMCTR1 0xB1 +#define CMD_FRMCTR2 0xB2 +#define CMD_FRMCTR3 0xB3 +#define CMD_INVCTR 0xB4 +#define CMD_DISSET5 0xB6 + +#define CMD_PWCTR1 0xC0 +#define CMD_PWCTR2 0xC1 +#define CMD_PWCTR3 0xC2 +#define CMD_PWCTR4 0xC3 +#define CMD_PWCTR5 0xC4 +#define CMD_VMCTR1 0xC5 +#define CMD_VMOFCTR 0xC7 + +#define CMD_NVFCTR1 0xD9 + +#define CMD_GMCTRP1 0xE0 +#define CMD_GMCTRN1 0xE1 + +#define CMD_PWCTR6 0xFC + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC CONSTANTS + **********************/ + +/* init commands for buydisplay.com ER-TFTM018-3 */ +static const uint8_t init_cmd_list[] = { + 0xB1, 3, 0x05, 0x3C, 0x3C, + 0xB2, 3, 0x05, 0x3C, 0x3C, + 0xB3, 6, 0x05, 0x3C, 0x3C, 0x05, 0x3C, 0x3C, + 0xB4, 1, 0x03, + 0xC0, 3, 0x28, 0x08, 0x04, + 0xC1, 1, 0XC0, + 0xC2, 2, 0x0D, 0x00, + 0xC3, 2, 0x8D, 0x2A, + 0xC4, 2, 0x8D, 0xEE, + 0xC5, 1, 0x10, + 0xE0, 16, 0x04, 0x22, 0x07, 0x0A, 0x2E, 0x30, 0x25, 0x2A, 0x28, 0x26, 0x2E, 0x3A, 0x00, 0x01, 0x03, 0x13, + 0xE1, 16, 0x04, 0x16, 0x06, 0x0D, 0x2D, 0x26, 0x23, 0x27, 0x27, 0x25, 0x2D, 0x3B, 0x00, 0x01, 0x04, 0x13, + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_st7735_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7735_send_cmd_cb_t send_cmd_cb, lv_st7735_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); + return disp; +} + +void lv_st7735_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_set_gap(disp, x, y); +} + +void lv_st7735_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_set_invert(disp, invert); +} + +void lv_st7735_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); +} + +void lv_st7735_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_ST7735*/ diff --git a/inc/lvgl/src/drivers/display/st7735/lv_st7735.h b/inc/lvgl/src/drivers/display/st7735/lv_st7735.h new file mode 100644 index 0000000..c19e9fa --- /dev/null +++ b/inc/lvgl/src/drivers/display/st7735/lv_st7735.h @@ -0,0 +1,93 @@ +/** + * @file lv_st7735.h + * + * This driver is just a wrapper around the generic MIPI compatible LCD controller driver + * + */ + +#ifndef LV_ST7735_H +#define LV_ST7735_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lcd/lv_lcd_generic_mipi.h" + +#if LV_USE_ST7735 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_lcd_send_cmd_cb_t lv_st7735_send_cmd_cb_t; +typedef lv_lcd_send_color_cb_t lv_st7735_send_color_cb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an LCD display with ST7735 driver + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_st7735_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7735_send_cmd_cb_t send_cmd_cb, lv_st7735_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_st7735_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_st7735_set_invert(lv_display_t * disp, bool invert); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_st7735_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_st7735_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ST7735*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ST7735_H*/ diff --git a/inc/lvgl/src/drivers/display/st7789/lv_st7789.c b/inc/lvgl/src/drivers/display/st7789/lv_st7789.c new file mode 100644 index 0000000..76d08bf --- /dev/null +++ b/inc/lvgl/src/drivers/display/st7789/lv_st7789.c @@ -0,0 +1,116 @@ +/** + * @file lv_st7789.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_st7789.h" + +#if LV_USE_ST7789 + +/********************* + * DEFINES + *********************/ + +#define CMD_FRMCTR1 0xB1 +#define CMD_FRMCTR2 0xB2 +#define CMD_FRMCTR3 0xB3 +#define CMD_INVCTR 0xB4 +#define CMD_DFUNCTR 0xB6 +#define CMD_ETMOD 0xB7 +#define CMD_PWCTR1 0xC0 +#define CMD_PWCTR2 0xC1 +#define CMD_PWCTR3 0xC2 +#define CMD_PWCTR4 0xC3 +#define CMD_PWCTR5 0xC4 +#define CMD_VMCTR 0xC5 +#define CMD_GMCTRP1 0xE0 +#define CMD_GMCTRN1 0xE1 +#define CMD_DOCA 0xE8 +#define CMD_CSCON 0xF0 + +#define CMD_RAMCTRL 0xB0 +#define CMD_PORCTRL 0xB2 /* Porch control */ +#define CMD_GCTRL 0xB7 /* Gate control */ +#define CMD_VCOMS 0xBB /* VCOMS setting */ +#define CMD_LCMCTRL 0xC0 /* LCM control */ +#define CMD_VDVVRHEN 0xC2 /* VDV and VRH command enable */ +#define CMD_VRHS 0xC3 /* VRH set */ +#define CMD_VDVSET 0xC4 /* VDV setting */ +#define CMD_FRCTR2 0xC6 /* FR Control 2 */ +#define CMD_PWCTRL1 0xD0 /* Power control 1 */ +#define CMD_PVGAMCTRL 0xE0 /* Positive Gamma Correction */ +#define CMD_NVGAMCTRL 0xE1 /* Negative Gamma Correction */ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC CONSTANTS + **********************/ + +/* init commands based on LovyanGFX ST7789 driver */ +static const uint8_t init_cmd_list[] = { + CMD_GCTRL, 1, 0x44, /* GCTRL -- panel dependent */ + CMD_VCOMS, 1, 0x24, /* VCOMS -- panel dependent */ + CMD_VRHS, 1, 0x13, /* VRHS - panel dependent */ + CMD_PWCTRL1, 2, 0xa4, 0xa1, + CMD_RAMCTRL, 2, 0x00, 0xC0, /* controls mapping of RGB565 to RGB666 */ + CMD_PVGAMCTRL, 14, 0xd0, 0x00, 0x02, 0x07, 0x0a, 0x28, 0x32, 0x44, 0x42, 0x06, 0x0e, 0x12, 0x14, 0x17, + CMD_NVGAMCTRL, 14, 0xd0, 0x00, 0x02, 0x07, 0x0a, 0x28, 0x31, 0x54, 0x47, 0x0e, 0x1c, 0x17, 0x1b, 0x1e, + LV_LCD_CMD_SET_GAMMA_CURVE, 1, 0x01, + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_st7789_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7789_send_cmd_cb_t send_cmd_cb, lv_st7789_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); + return disp; +} + +void lv_st7789_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_set_gap(disp, x, y); +} + +void lv_st7789_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_set_invert(disp, invert); +} + +void lv_st7789_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + lv_lcd_generic_mipi_set_gamma_curve(disp, gamma); +} + +void lv_st7789_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_ST7789*/ diff --git a/inc/lvgl/src/drivers/display/st7789/lv_st7789.h b/inc/lvgl/src/drivers/display/st7789/lv_st7789.h new file mode 100644 index 0000000..9770432 --- /dev/null +++ b/inc/lvgl/src/drivers/display/st7789/lv_st7789.h @@ -0,0 +1,94 @@ +/** + * @file lv_st7789.h + * + * This driver is just a wrapper around the generic MIPI compatible LCD controller driver + * + */ + +#ifndef LV_ST7789_H +#define LV_ST7789_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lcd/lv_lcd_generic_mipi.h" + +#if LV_USE_ST7789 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_lcd_send_cmd_cb_t lv_st7789_send_cmd_cb_t; +typedef lv_lcd_send_color_cb_t lv_st7789_send_color_cb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an LCD display with ST7789 driver + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_st7789_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7789_send_cmd_cb_t send_cmd_cb, lv_st7789_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_st7789_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_st7789_set_invert(lv_display_t * disp, bool invert); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_st7789_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_st7789_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + + +#endif /*LV_USE_ST7789*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ST7789_H*/ diff --git a/inc/lvgl/src/drivers/display/st7796/lv_st7796.c b/inc/lvgl/src/drivers/display/st7796/lv_st7796.c new file mode 100644 index 0000000..985b39f --- /dev/null +++ b/inc/lvgl/src/drivers/display/st7796/lv_st7796.c @@ -0,0 +1,121 @@ +/** + * @file lv_st7796.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_st7796.h" + +#if LV_USE_ST7796 + +/********************* + * DEFINES + *********************/ + +#define CMD_FRMCTR1 0xB1 +#define CMD_FRMCTR2 0xB2 +#define CMD_FRMCTR3 0xB3 +#define CMD_INVCTR 0xB4 +#define CMD_DFUNCTR 0xB6 +#define CMD_ETMOD 0xB7 +#define CMD_PWCTR1 0xC0 +#define CMD_PWCTR2 0xC1 +#define CMD_PWCTR3 0xC2 +#define CMD_PWCTR4 0xC3 +#define CMD_PWCTR5 0xC4 +#define CMD_VMCTR 0xC5 +#define CMD_GMCTRP1 0xE0 +#define CMD_GMCTRN1 0xE1 +#define CMD_DOCA 0xE8 +#define CMD_CSCON 0xF0 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC CONSTANTS + **********************/ + +/* init commands based on LovyanGFX */ +static const uint8_t init_cmd_list[] = { + CMD_CSCON, 1, 0xC3, /* Enable extension command 2 partI */ + CMD_CSCON, 1, 0x96, /* Enable extension command 2 partII */ + CMD_INVCTR, 1, 0x01, /* 1-dot inversion */ + CMD_DFUNCTR, 3, 0x80, /* Display Function Control: Bypass */ + 0x22, /* Source Output Scan from S1 to S960, Gate Output scan from G1 to G480, scan cycle = 2 */ + 0x3B, /* LCD Drive Line = 8 * (59 + 1) */ + CMD_DOCA, 8, 0x40, 0x8A, 0x00, 0x00, + 0x29, /* Source equalizing period time = 22.5 us */ + 0x19, /* Timing for "Gate start" = 25 (Tclk) */ + 0xA5, /* Timing for "Gate End" = 37 (Tclk), Gate driver EQ function ON */ + 0x33, + CMD_PWCTR2, 1, 0x06, /* Power control2: VAP(GVDD) = 3.85 + (vcom + vcom offset), VAN(GVCL) = -3.85 + (vcom + vcom offset) */ + CMD_PWCTR3, 1, 0xA7, /* Power control 3: Source driving current level = low, Gamma driving current level = High */ + CMD_VMCTR, 1, 0x18, /* VCOM Control: VCOM = 0.9 */ + LV_LCD_CMD_DELAY_MS, 12, /* delay 120 ms */ + CMD_GMCTRP1, 14, /* Gamma */ + 0xF0, 0x09, 0x0B, 0x06, 0x04, 0x15, 0x2F, + 0x54, 0x42, 0x3C, 0x17, 0x14, 0x18, 0x1B, + CMD_GMCTRN1, 14, + 0xE0, 0x09, 0x0B, 0x06, 0x04, 0x03, 0x2B, + 0x43, 0x42, 0x3B, 0x16, 0x14, 0x17, 0x1B, + LV_LCD_CMD_DELAY_MS, 12, /* delay 120 ms */ + CMD_CSCON, 1, 0x3C, /* Disable extension command 2 partI */ + CMD_CSCON, 1, 0x69, /* Disable extension command 2 partII */ + LV_LCD_CMD_DELAY_MS, LV_LCD_CMD_EOF +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_st7796_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7796_send_cmd_cb_t send_cmd_cb, lv_st7796_send_color_cb_t send_color_cb) +{ + lv_display_t * disp = lv_lcd_generic_mipi_create(hor_res, ver_res, flags, send_cmd_cb, send_color_cb); + lv_lcd_generic_mipi_send_cmd_list(disp, init_cmd_list); + return disp; +} + +void lv_st7796_set_gap(lv_display_t * disp, uint16_t x, uint16_t y) +{ + lv_lcd_generic_mipi_set_gap(disp, x, y); +} + +void lv_st7796_set_invert(lv_display_t * disp, bool invert) +{ + lv_lcd_generic_mipi_set_invert(disp, invert); +} + +void lv_st7796_set_gamma_curve(lv_display_t * disp, uint8_t gamma) +{ + /* NOTE: the generic method is not supported on ST7796, TODO: implement gamma tables */ + LV_UNUSED(disp); + LV_UNUSED(gamma); +} + +void lv_st7796_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list) +{ + lv_lcd_generic_mipi_send_cmd_list(disp, cmd_list); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_ST7796*/ diff --git a/inc/lvgl/src/drivers/display/st7796/lv_st7796.h b/inc/lvgl/src/drivers/display/st7796/lv_st7796.h new file mode 100644 index 0000000..79d7a88 --- /dev/null +++ b/inc/lvgl/src/drivers/display/st7796/lv_st7796.h @@ -0,0 +1,93 @@ +/** + * @file lv_st7796.h + * + * This driver is just a wrapper around the generic MIPI compatible LCD controller driver + * + */ + +#ifndef LV_ST7796_H +#define LV_ST7796_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lcd/lv_lcd_generic_mipi.h" + +#if LV_USE_ST7796 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_lcd_send_cmd_cb_t lv_st7796_send_cmd_cb_t; +typedef lv_lcd_send_color_cb_t lv_st7796_send_color_cb_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an LCD display with ST7796 driver + * @param hor_res horizontal resolution + * @param ver_res vertical resolution + * @param flags default configuration settings (mirror, RGB ordering, etc.) + * @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer) + * @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback) + * @return pointer to the created display + */ +lv_display_t * lv_st7796_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags, + lv_st7796_send_cmd_cb_t send_cmd_cb, lv_st7796_send_color_cb_t send_color_cb); + +/** + * Set gap, i.e., the offset of the (0,0) pixel in the VRAM + * @param disp display object + * @param x x offset + * @param y y offset + */ +void lv_st7796_set_gap(lv_display_t * disp, uint16_t x, uint16_t y); + +/** + * Set color inversion + * @param disp display object + * @param invert false: normal, true: invert + */ +void lv_st7796_set_invert(lv_display_t * disp, bool invert); + +/** + * Set gamma curve + * @param disp display object + * @param gamma gamma curve + */ +void lv_st7796_set_gamma_curve(lv_display_t * disp, uint8_t gamma); + +/** + * Send list of commands. + * @param disp display object + * @param cmd_list controller and panel-specific commands + */ +void lv_st7796_send_cmd_list(lv_display_t * disp, const uint8_t * cmd_list); + +/********************** + * OTHERS + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ST7796*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ST7796_H*/ diff --git a/inc/lvgl/src/drivers/display/st_ltdc/lv_st_ltdc.c b/inc/lvgl/src/drivers/display/st_ltdc/lv_st_ltdc.c new file mode 100644 index 0000000..c162a84 --- /dev/null +++ b/inc/lvgl/src/drivers/display/st_ltdc/lv_st_ltdc.c @@ -0,0 +1,320 @@ +/** + * @file lv_st_ltdc.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_ST_LTDC + +#include "lv_st_ltdc.h" +#include "../../../display/lv_display_private.h" +#include "../../../draw/sw/lv_draw_sw.h" +#include "../../../osal/lv_os_private.h" +#include "main.h" + +#if LV_ST_LTDC_USE_DMA2D_FLUSH + #if LV_USE_DRAW_DMA2D + #error cannot use LV_ST_LTDC_USE_DMA2D_FLUSH with LV_USE_DRAW_DMA2D + #endif /*LV_USE_DRAW_DMA2D*/ + + extern DMA2D_HandleTypeDef hdma2d; +#endif /*LV_ST_LTDC_USE_DMA2D_FLUSH*/ + +extern LTDC_HandleTypeDef hltdc; + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_OS != LV_OS_NONE + typedef lv_thread_sync_t sync_t; +#else + typedef volatile bool sync_t; +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_display_t * create(void * buf1, void * buf2, uint32_t buf_size, uint32_t layer_idx, + lv_display_render_mode_t mode); +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void flush_wait_cb(lv_display_t * disp); +static lv_color_format_t get_lv_cf_from_layer_cf(uint32_t cf); +static void reload_event_callback(LTDC_HandleTypeDef * hltdc); +static void clean_dcache(void); + +#if LV_ST_LTDC_USE_DMA2D_FLUSH + static void transfer_complete_callback(DMA2D_HandleTypeDef * hdma2d); + static uint32_t get_dma2d_output_cf_from_layer_cf(uint32_t cf); + static uint32_t get_dma2d_input_cf_from_lv_cf(uint32_t cf); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +static struct { + bool disp_flushed_in_flush_cb[MAX_LAYER]; + sync_t sync[MAX_LAYER]; + volatile bool layer_interrupt_is_owned[MAX_LAYER]; +#if LV_ST_LTDC_USE_DMA2D_FLUSH + volatile uint32_t dma2d_interrupt_owner; /*layer_idx + 1, or 0 for none*/ +#endif +} g_data; + +/********************** + * MACROS + **********************/ + +#if LV_USE_OS != LV_OS_NONE + #define SYNC_INIT(layer_idx) lv_thread_sync_init(&g_data.sync[layer_idx]) + #define SYNC_WAIT(layer_idx) lv_thread_sync_wait(&g_data.sync[layer_idx]) + #define SYNC_SIGNAL_ISR(layer_idx) lv_thread_sync_signal_isr(&g_data.sync[layer_idx]) +#else + #define SYNC_INIT(layer_idx) do { g_data.sync[layer_idx] = false; } while(0) + #define SYNC_WAIT(layer_idx) do { while(!g_data.sync[layer_idx]); g_data.sync[layer_idx] = false; } while(0) + #define SYNC_SIGNAL_ISR(layer_idx) do { g_data.sync[layer_idx] = true; } while(0) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_st_ltdc_create_direct(void * fb_adr_1, void * fb_adr_2, uint32_t layer_idx) +{ + return create(fb_adr_1, fb_adr_2, 0, layer_idx, LV_DISPLAY_RENDER_MODE_DIRECT); +} + +lv_display_t * lv_st_ltdc_create_partial(void * render_buf_1, void * render_buf_2, uint32_t buf_size, + uint32_t layer_idx) +{ + return create(render_buf_1, render_buf_2, buf_size, layer_idx, LV_DISPLAY_RENDER_MODE_PARTIAL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_display_t * create(void * buf1, void * buf2, uint32_t buf_size, uint32_t layer_idx, + lv_display_render_mode_t mode) +{ + LTDC_LayerCfgTypeDef * layer_cfg = &hltdc.LayerCfg[layer_idx]; + uint32_t layer_width = layer_cfg->ImageWidth; + uint32_t layer_height = layer_cfg->ImageHeight; + uint32_t layer_cf = layer_cfg->PixelFormat; + lv_color_format_t cf = get_lv_cf_from_layer_cf(layer_cf); + + lv_display_t * disp = lv_display_create(layer_width, layer_height); + lv_display_set_color_format(disp, cf); + lv_display_set_flush_cb(disp, flush_cb); + lv_display_set_flush_wait_cb(disp, flush_wait_cb); + lv_display_set_driver_data(disp, (void *)(uintptr_t)layer_idx); + + if(mode == LV_DISPLAY_RENDER_MODE_DIRECT) { + uint32_t cf_size = lv_color_format_get_size(cf); + lv_display_set_buffers(disp, buf1, buf2, layer_width * layer_height * cf_size, LV_DISPLAY_RENDER_MODE_DIRECT); + + if(buf1 != NULL && buf2 != NULL) { + HAL_LTDC_RegisterCallback(&hltdc, HAL_LTDC_RELOAD_EVENT_CB_ID, reload_event_callback); + SYNC_INIT(layer_idx); + } + } + else { + lv_display_set_buffers(disp, buf1, buf2, buf_size, LV_DISPLAY_RENDER_MODE_PARTIAL); + +#if LV_ST_LTDC_USE_DMA2D_FLUSH + hdma2d.XferCpltCallback = transfer_complete_callback; + SYNC_INIT(layer_idx); +#endif + } + + return disp; +} + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + uint32_t layer_idx = (uint32_t)(uintptr_t)lv_display_get_driver_data(disp); + g_data.disp_flushed_in_flush_cb[layer_idx] = false; + + if(disp->render_mode == LV_DISPLAY_RENDER_MODE_DIRECT) { + bool flush_is_last = lv_display_flush_is_last(disp); + if(flush_is_last) { + /* there is no ideal time to clean the cache (if present) + for **single-buffered** direct mode because the active buffer is drawn to + while LTDC is scanning it. Clean it in the last flush, at least, + but not every flush because it's expensive for not much visual improvement. */ + clean_dcache(); + } + if(flush_is_last && lv_display_is_double_buffered(disp)) { + HAL_LTDC_SetAddress_NoReload(&hltdc, (uint32_t)px_map, layer_idx); + g_data.layer_interrupt_is_owned[layer_idx] = true; + HAL_LTDC_Reload(&hltdc, LTDC_RELOAD_VERTICAL_BLANKING); + } + else { + g_data.disp_flushed_in_flush_cb[layer_idx] = true; + } + } + else { + LTDC_LayerCfgTypeDef * layer_cfg = &hltdc.LayerCfg[layer_idx]; + + lv_color_format_t cf = lv_display_get_color_format(disp); + int32_t disp_width = disp->hor_res; + + uint8_t * fb = (uint8_t *) layer_cfg->FBStartAdress; + uint32_t px_size = lv_color_format_get_size(cf); + uint32_t fb_stride = px_size * disp_width; + lv_area_t rotated_area = *area; + lv_display_rotate_area(disp, &rotated_area); + uint8_t * first_pixel = fb + fb_stride * rotated_area.y1 + px_size * rotated_area.x1; + + int32_t area_width = lv_area_get_width(area); + int32_t area_height = lv_area_get_height(area); + + lv_display_rotation_t rotation = lv_display_get_rotation(disp); + if(rotation == LV_DISPLAY_ROTATION_0) { +#if LV_ST_LTDC_USE_DMA2D_FLUSH + clean_dcache(); + + uint32_t dma2d_input_cf = get_dma2d_input_cf_from_lv_cf(cf); + uint32_t dma2d_output_cf = get_dma2d_output_cf_from_layer_cf(layer_cfg->PixelFormat); + + while(DMA2D->CR & DMA2D_CR_START); + DMA2D->FGPFCCR = dma2d_input_cf; + DMA2D->FGMAR = (uint32_t)px_map; + DMA2D->FGOR = 0; + DMA2D->OPFCCR = dma2d_output_cf; + DMA2D->OMAR = (uint32_t)first_pixel; + DMA2D->OOR = disp_width - area_width; + DMA2D->NLR = (area_width << DMA2D_NLR_PL_Pos) | (area_height << DMA2D_NLR_NL_Pos); + g_data.dma2d_interrupt_owner = layer_idx + 1; + DMA2D->CR = DMA2D_CR_START | DMA2D_CR_TCIE | (0x1U << DMA2D_CR_MODE_Pos); /* memory-to-memory with PFC */ +#else + uint32_t area_stride = px_size * area_width; + uint8_t * fb_p = first_pixel; + uint8_t * px_map_p = px_map; + for(int i = 0; i < area_height; i++) { + lv_memcpy(fb_p, px_map_p, area_stride); + fb_p += fb_stride; + px_map_p += area_stride; + } + clean_dcache(); + g_data.disp_flushed_in_flush_cb[layer_idx] = true; +#endif + } + else { +#if LV_USE_DRAW_SW + uint32_t area_stride = px_size * area_width; + lv_draw_sw_rotate(px_map, first_pixel, area_width, area_height, area_stride, fb_stride, rotation, cf); + clean_dcache(); + g_data.disp_flushed_in_flush_cb[layer_idx] = true; +#else + LV_LOG_WARN("LV_USE_DRAW_SW needs to be enabled to rotate the display's content"); + g_data.disp_flushed_in_flush_cb[layer_idx] = true; +#endif + } + } +} + +static void flush_wait_cb(lv_display_t * disp) +{ + uint32_t layer_idx = (uint32_t)(uintptr_t)lv_display_get_driver_data(disp); + if(!g_data.disp_flushed_in_flush_cb[layer_idx]) { + SYNC_WAIT(layer_idx); + } +} + +static lv_color_format_t get_lv_cf_from_layer_cf(uint32_t cf) +{ + switch(cf) { + case LTDC_PIXEL_FORMAT_ARGB8888: + return LV_COLOR_FORMAT_ARGB8888; + case LTDC_PIXEL_FORMAT_RGB888: + return LV_COLOR_FORMAT_RGB888; + case LTDC_PIXEL_FORMAT_RGB565: + return LV_COLOR_FORMAT_RGB565; + case LTDC_PIXEL_FORMAT_L8: + return LV_COLOR_FORMAT_L8; + case LTDC_PIXEL_FORMAT_AL88: + return LV_COLOR_FORMAT_AL88; + default: + LV_ASSERT_MSG(0, "the LTDC color format is not supported"); + } +} + +static void reload_event_callback(LTDC_HandleTypeDef * hltdc) +{ + uint32_t i; + for(i = 0; i < MAX_LAYER; i++) { + if(g_data.layer_interrupt_is_owned[i]) { + g_data.layer_interrupt_is_owned[i] = false; + SYNC_SIGNAL_ISR(i); + } + } +} + +static void clean_dcache(void) +{ +#if defined(__CORTEX_M) && __CORTEX_M == 7 + SCB_CleanDCache(); +#elif defined(__CORTEX_A) && __CORTEX_A == 7 + L1C_CleanDCacheAll(); +#endif +} + +#if LV_ST_LTDC_USE_DMA2D_FLUSH +static void transfer_complete_callback(DMA2D_HandleTypeDef * hdma2d) +{ + DMA2D->IFCR = 0x3FU; + uint32_t owner = g_data.dma2d_interrupt_owner; + if(owner) { + g_data.dma2d_interrupt_owner = 0; + owner -= 1; + SYNC_SIGNAL_ISR(owner); + } +} + +static uint32_t get_dma2d_output_cf_from_layer_cf(uint32_t cf) +{ + switch(cf) { + case LTDC_PIXEL_FORMAT_ARGB8888: + return DMA2D_OUTPUT_ARGB8888; + case LTDC_PIXEL_FORMAT_RGB888: + return DMA2D_OUTPUT_RGB888; + case LTDC_PIXEL_FORMAT_RGB565: + return DMA2D_OUTPUT_RGB565; + default: + LV_ASSERT_MSG(0, "DMA2D cannot output to the LTDC color format"); + } +} + +static uint32_t get_dma2d_input_cf_from_lv_cf(uint32_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_ARGB8888: + return DMA2D_INPUT_ARGB8888; + case LV_COLOR_FORMAT_RGB888: + return DMA2D_INPUT_RGB888; + case LV_COLOR_FORMAT_RGB565: + return DMA2D_INPUT_RGB565; + case LV_COLOR_FORMAT_L8: + return DMA2D_INPUT_L8; + case LV_COLOR_FORMAT_AL88: + return DMA2D_INPUT_AL88; + case LV_COLOR_FORMAT_A8: + return DMA2D_INPUT_A8; + default: + LV_ASSERT_MSG(0, "the LVGL color format is not a DMA2D input color format"); + } +} +#endif /*LV_ST_LTDC_USE_DMA2D_FLUSH*/ + +#endif /*LV_USE_ST_LTDC*/ diff --git a/inc/lvgl/src/drivers/display/st_ltdc/lv_st_ltdc.h b/inc/lvgl/src/drivers/display/st_ltdc/lv_st_ltdc.h new file mode 100644 index 0000000..69a0e7b --- /dev/null +++ b/inc/lvgl/src/drivers/display/st_ltdc/lv_st_ltdc.h @@ -0,0 +1,65 @@ +/** + * @file lv_st_ltdc.h + * + */ + +#ifndef LV_ST_LTDC_H +#define LV_ST_LTDC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_ST_LTDC + +#include "../../../display/lv_display.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a direct render mode display bound to a LTDC layer. + * @param fb_adr_1 The LTDC layer's framebuffer memory address. + * @param fb_adr_2 An additional framebuffer-sized buffer to use for double buffering, or `NULL`. + * @param layer_idx The LTDC layer number to bind the display to. Typically 0 or 1. + * @return The display. + */ +lv_display_t * lv_st_ltdc_create_direct(void * fb_adr_1, void * fb_adr_2, uint32_t layer_idx); + +/** + * Create a partial render mode display bound to a LTDC layer. The layer's framebuffer is flushed to internally. + * Enable `LV_ST_LTDC_USE_DMA2D_FLUSH` for parallel flushing. + * @param render_buf_1 A render buffer. + * @param render_buf_2 An additional render buffer for double-buffering, or `NULL`. + * @param buf_size The size of the buffer(s) in bytes. + * @param layer_idx The LTDC layer number to bind the display to. Typically 0 or 1. + * @return The display. + */ +lv_display_t * lv_st_ltdc_create_partial(void * render_buf_1, void * render_buf_2, uint32_t buf_size, + uint32_t layer_idx); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ST_LTDC*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ST_LTDC_H*/ diff --git a/inc/lvgl/src/drivers/display/tft_espi/lv_tft_espi.cpp b/inc/lvgl/src/drivers/display/tft_espi/lv_tft_espi.cpp new file mode 100644 index 0000000..1cb7b45 --- /dev/null +++ b/inc/lvgl/src/drivers/display/tft_espi/lv_tft_espi.cpp @@ -0,0 +1,110 @@ +/** + * @file lv_tft_espi.cpp + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tft_espi.h" +#if LV_USE_TFT_ESPI + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + TFT_eSPI * tft; +} lv_tft_espi_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void resolution_changed_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_tft_espi_create(uint32_t hor_res, uint32_t ver_res, void * buf, uint32_t buf_size_bytes) +{ + lv_tft_espi_t * dsc = (lv_tft_espi_t *)lv_malloc_zeroed(sizeof(lv_tft_espi_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + + dsc->tft = new TFT_eSPI(hor_res, ver_res); + dsc->tft->begin(); /* TFT init */ + dsc->tft->setRotation(0); + lv_display_set_driver_data(disp, (void *)dsc); + lv_display_set_flush_cb(disp, flush_cb); + lv_display_add_event_cb(disp, resolution_changed_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + lv_display_set_buffers(disp, (void *)buf, NULL, buf_size_bytes, LV_DISPLAY_RENDER_MODE_PARTIAL); + return disp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + lv_tft_espi_t * dsc = (lv_tft_espi_t *)lv_display_get_driver_data(disp); + + uint32_t w = (area->x2 - area->x1 + 1); + uint32_t h = (area->y2 - area->y1 + 1); + + dsc->tft->startWrite(); + dsc->tft->setAddrWindow(area->x1, area->y1, w, h); + dsc->tft->pushColors((uint16_t *)px_map, w * h, true); + dsc->tft->endWrite(); + + lv_display_flush_ready(disp); + +} + +static void resolution_changed_event_cb(lv_event_t * e) +{ + lv_display_t * disp = (lv_display_t *)lv_event_get_target(e); + lv_tft_espi_t * dsc = (lv_tft_espi_t *)lv_display_get_driver_data(disp); + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + lv_display_rotation_t rot = lv_display_get_rotation(disp); + + /* handle rotation */ + switch(rot) { + case LV_DISPLAY_ROTATION_0: + dsc->tft->setRotation(0); /* Portrait orientation */ + break; + case LV_DISPLAY_ROTATION_90: + dsc->tft->setRotation(1); /* Landscape orientation */ + break; + case LV_DISPLAY_ROTATION_180: + dsc->tft->setRotation(2); /* Portrait orientation, flipped */ + break; + case LV_DISPLAY_ROTATION_270: + dsc->tft->setRotation(3); /* Landscape orientation, flipped */ + break; + } +} + +#endif /*LV_USE_TFT_ESPI*/ diff --git a/inc/lvgl/src/drivers/display/tft_espi/lv_tft_espi.h b/inc/lvgl/src/drivers/display/tft_espi/lv_tft_espi.h new file mode 100644 index 0000000..a8f49f8 --- /dev/null +++ b/inc/lvgl/src/drivers/display/tft_espi/lv_tft_espi.h @@ -0,0 +1,43 @@ +/** + * @file lv_tft_espi.h + * + */ + +#ifndef LV_TFT_ESPI_H +#define LV_TFT_ESPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../display/lv_display.h" + +#if LV_USE_TFT_ESPI + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_display_t * lv_tft_espi_create(uint32_t hor_res, uint32_t ver_res, void * buf, uint32_t buf_size_bytes); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TFT_ESPI */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_TFT_ESPI_H */ diff --git a/inc/lvgl/src/drivers/draw/eve/lv_draw_eve_display.c b/inc/lvgl/src/drivers/draw/eve/lv_draw_eve_display.c new file mode 100644 index 0000000..e6c3d3a --- /dev/null +++ b/inc/lvgl/src/drivers/draw/eve/lv_draw_eve_display.c @@ -0,0 +1,278 @@ +/** + * @file lv_draw_eve_display.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_draw_eve_display.h" +#if LV_USE_DRAW_EVE + +#include "../../../draw/eve/lv_eve.h" +#include "../../../draw/eve/lv_draw_eve.h" +#include "../../../display/lv_display_private.h" +#include "../../../misc/lv_text_private.h" + +#include "../../../libs/FT800-FT813/EVE_commands.h" + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void resolution_changed_cb(lv_event_t * e); +static void render_start_cb(lv_event_t * e); +static void render_ready_cb(lv_event_t * e); +static void touch_read_cb(lv_indev_t * indev, lv_indev_data_t * data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_draw_eve_display_create(const lv_draw_eve_parameters_t * params, lv_draw_eve_operation_cb_t op_cb, + void * user_data) +{ + static uint32_t dummy_buf; /* It won't be used as it will send commands instead of draw pixels. */ + + lv_display_t * disp = lv_display_create(params->hor_res, params->ver_res); + lv_display_set_flush_cb(disp, flush_cb); + lv_display_set_buffers(disp, &dummy_buf, NULL, + params->hor_res * params->ver_res * LV_COLOR_FORMAT_GET_SIZE(LV_COLOR_FORMAT_NATIVE), + LV_DISPLAY_RENDER_MODE_FULL); /* recreate the full display list each refresh */ + lv_display_add_event_cb(disp, resolution_changed_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + lv_display_add_event_cb(disp, render_start_cb, LV_EVENT_RENDER_START, NULL); + lv_display_add_event_cb(disp, render_ready_cb, LV_EVENT_RENDER_READY, NULL); + lv_display_set_driver_data(disp, user_data); + + lv_draw_eve_set_display_data(disp, params, op_cb); + + EVE_init(); + EVE_memWrite8(REG_PWM_DUTY, EVE_BACKLIGHT_PWM); /* 0 = off, 0x80 = max */ + + return disp; +} + +void * lv_draw_eve_display_get_user_data(lv_display_t * disp) +{ + return lv_display_get_driver_data(disp); +} + +lv_indev_t * lv_draw_eve_touch_create(lv_display_t * disp) +{ + lv_indev_t * indev = lv_indev_create(); + + lv_indev_set_display(indev, disp); + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, touch_read_cb); + + return indev; +} + +void lv_draw_eve_pre_upload_image(lv_display_t * disp, const void * src) +{ + LV_ASSERT_MSG(disp->flush_cb == flush_cb, "tried to do an LVGL EVE pre-upload without a draw_eve display"); + + if(!lv_draw_eve_image_src_check(src)) { + return; + } + + uint32_t ramg_addr = lv_draw_eve_image_upload_image(false, src); + if(ramg_addr == LV_DRAW_EVE_RAMG_OUT_OF_RAMG) { + LV_LOG_WARN("Could not pre-upload image because space could not be allocated in RAM_G."); + } +} + +void lv_draw_eve_pre_upload_font_range(lv_display_t * disp, const lv_font_t * font, uint32_t unicode_range_start, + uint32_t unicode_range_end) +{ + LV_ASSERT_MSG(disp->flush_cb == flush_cb, "tried to do an LVGL EVE pre-upload without a draw_eve display"); + + if(!lv_draw_eve_label_font_check(font)) { + return; + } + + for(uint32_t i = unicode_range_start; i <= unicode_range_end; i++) { + lv_font_glyph_dsc_t glyph_dsc; + bool found = lv_font_get_glyph_dsc_fmt_txt(font, &glyph_dsc, i, '\0'); + if(!found) { + LV_LOG_INFO("Could not pre-upload glyph with unicode code point '0x%"LV_PRIX32"' " + "because it is not part of the font", i); + continue; + } + uint32_t ramg_addr = lv_draw_eve_label_upload_glyph(false, font->dsc, glyph_dsc.gid.index); + if(ramg_addr == LV_DRAW_EVE_RAMG_OUT_OF_RAMG) { + LV_LOG_WARN("Could not pre-upload glyph because space could not be allocated in RAM_G."); + /* don't return in case there are smaller glyphs that there is space for */ + } + } +} + +void lv_draw_eve_pre_upload_font_text(lv_display_t * disp, const lv_font_t * font, const char * text) +{ + LV_ASSERT_MSG(disp->flush_cb == flush_cb, "tried to do an LVGL EVE pre-upload without a draw_eve display"); + + if(!lv_draw_eve_label_font_check(font)) { + return; + } + + for(uint32_t i = 0; text[i];) { + uint32_t unicode_letter; + uint32_t unicode_letter_next; + lv_text_encoded_letter_next_2(text, &unicode_letter, &unicode_letter_next, &i); + lv_font_glyph_dsc_t glyph_dsc; + bool found = lv_font_get_glyph_dsc_fmt_txt(font, &glyph_dsc, unicode_letter, unicode_letter_next); + if(!found) { + LV_LOG_INFO("Could not pre-upload glyph with unicode code point '0x%"LV_PRIX32"' " + "because it is not part of the font", unicode_letter); + continue; + } + uint32_t ramg_addr = lv_draw_eve_label_upload_glyph(false, font->dsc, glyph_dsc.gid.index); + if(ramg_addr == LV_DRAW_EVE_RAMG_OUT_OF_RAMG) { + LV_LOG_WARN("Could not pre-upload glyph because space could not be allocated in RAM_G."); + /* don't return in case there are smaller glyphs that there is space for */ + } + } +} + +uint8_t lv_draw_eve_memread8(lv_display_t * disp, uint32_t address) +{ + LV_ASSERT_MSG(disp->flush_cb == flush_cb, "tried to use an LVGL EVE command without a draw_eve display"); + return EVE_memRead8(address); +} + +uint16_t lv_draw_eve_memread16(lv_display_t * disp, uint32_t address) +{ + LV_ASSERT_MSG(disp->flush_cb == flush_cb, "tried to use an LVGL EVE command with a non-draw_eve display"); + return EVE_memRead16(address); +} + +uint32_t lv_draw_eve_memread32(lv_display_t * disp, uint32_t address) +{ + LV_ASSERT_MSG(disp->flush_cb == flush_cb, "tried to use an LVGL EVE command with a non-draw_eve display"); + return EVE_memRead32(address); +} + +void lv_draw_eve_memwrite8(lv_display_t * disp, uint32_t address, uint8_t data) +{ + LV_ASSERT_MSG(disp->flush_cb == flush_cb, "tried to use an LVGL EVE command with a non-draw_eve display"); + EVE_memWrite8(address, data); +} + +void lv_draw_eve_memwrite16(lv_display_t * disp, uint32_t address, uint16_t data) +{ + LV_ASSERT_MSG(disp->flush_cb == flush_cb, "tried to use an LVGL EVE command with a non-draw_eve display"); + EVE_memWrite16(address, data); +} + +void lv_draw_eve_memwrite32(lv_display_t * disp, uint32_t address, uint32_t data) +{ + LV_ASSERT_MSG(disp->flush_cb == flush_cb, "tried to use an LVGL EVE command with a non-draw_eve display"); + EVE_memWrite32(address, data); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + if(lv_display_flush_is_last(disp)) { + EVE_cmd_dl_burst(DL_DISPLAY); /* instruct the co-processor to show the list */ + EVE_cmd_dl_burst(CMD_SWAP); /* make this list active */ + EVE_end_cmd_burst(); + + EVE_execute_cmd(); + + EVE_start_cmd_burst(); + } + + lv_display_flush_ready(disp); +} + +static void resolution_changed_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_target(e); + + lv_display_rotation_t rotation = lv_display_get_rotation(disp); + uint32_t cmd_value; + switch(rotation) { + case LV_DISPLAY_ROTATION_0: + cmd_value = 0; + break; + case LV_DISPLAY_ROTATION_90: + cmd_value = 2; + break; + case LV_DISPLAY_ROTATION_180: + cmd_value = 1; + break; + case LV_DISPLAY_ROTATION_270: + cmd_value = 3; + break; + default: + return; + } + + /* no need to rotate the touch coordinates with CMD_SETROTATE, as LVGL + * already rotates the input coordinates. + */ + EVE_memWrite8(REG_ROTATE, cmd_value); +} + +static void render_start_cb(lv_event_t * e) +{ + EVE_start_cmd_burst(); + + EVE_cmd_dl_burst(CMD_DLSTART); /* start the display list */ + EVE_cmd_dl_burst(DL_CLEAR_COLOR_RGB | 0x000000); + EVE_cmd_dl_burst(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); + EVE_cmd_dl_burst(VERTEX_FORMAT(0)); +} + +static void render_ready_cb(lv_event_t * e) +{ + EVE_end_cmd_burst(); +} + +static void touch_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_display_t * disp = lv_indev_get_display(indev); + + if(disp == NULL || disp->flush_cb != flush_cb) return; + + uint32_t xy = EVE_memRead32(REG_TOUCH_SCREEN_XY); + uint16_t x = xy >> 16; + uint16_t y = xy & 0xffff; + + int32_t disp_w = lv_display_get_original_horizontal_resolution(disp); + int32_t disp_h = lv_display_get_original_vertical_resolution(disp); + + if(x < disp_w && y < disp_h) { + data->state = LV_INDEV_STATE_PRESSED; + data->point.x = x; + data->point.y = y; + } + else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +#endif /*LV_USE_DRAW_EVE*/ diff --git a/inc/lvgl/src/drivers/draw/eve/lv_draw_eve_display.h b/inc/lvgl/src/drivers/draw/eve/lv_draw_eve_display.h new file mode 100644 index 0000000..860159b --- /dev/null +++ b/inc/lvgl/src/drivers/draw/eve/lv_draw_eve_display.h @@ -0,0 +1,151 @@ +/** + * @file lv_draw_eve_display.h + * + */ + +#ifndef LV_DRAW_EVE_DISPLAY_H +#define LV_DRAW_EVE_DISPLAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_DRAW_EVE + +#include "../../../draw/eve/lv_draw_eve_target.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a display for the EVE draw unit. + * @param params Pointer to a struct of display parameters. Can be a temporary variable + * @param op_cb A callback that will be called to perform pin and SPI IO operations with the EVE chip + * @param user_data use `lv_draw_eve_display_get_user_data` to get this pointer inside the `op_cb` + * @return the EVE display + */ +lv_display_t * lv_draw_eve_display_create(const lv_draw_eve_parameters_t * params, lv_draw_eve_operation_cb_t op_cb, + void * user_data); + +/** + * Get the `user_data` parameter that was passed to `lv_draw_eve_display_create`. Useful in the operation callback. + * @param disp pointer to the lv_draw_eve display + * @return the `user_data` pointer + */ +void * lv_draw_eve_display_get_user_data(lv_display_t * disp); + +/** + * Create a touchscreen indev for the EVE display. + * @param disp pointer to the lv_draw_eve display + * @return the EVE touchscreen indev + */ +lv_indev_t * lv_draw_eve_touch_create(lv_display_t * disp); + + +/* RAM_G asset pre-upload functions */ + +/** + * Upload an image src to RAM_G now instead of as-needed during rendering. + * @param disp pointer to the lv_draw_eve display + * @param src image src. The value passed to `lv_image_set_src` + */ +void lv_draw_eve_pre_upload_image(lv_display_t * disp, const void * src); + +/** + * Upload font glyphs to RAM_G now instead of as-needed during rendering. + * Upload all the glyphs in the range of unicode code points (inclusive of the start and end values). + * It can be called multiple times with different ranges. + * @param disp pointer to the lv_draw_eve display + * @param font the font to upload glyphs from + * @param unicode_range_start the first unicode code point in the range of glyphs to upload + * @param unicode_range_end the last unicode code point (inclusive) in the range of glyphs to upload + */ +void lv_draw_eve_pre_upload_font_range(lv_display_t * disp, const lv_font_t * font, uint32_t unicode_range_start, + uint32_t unicode_range_end); + +/** + * Upload font glyphs to RAM_G now instead of as-needed during rendering. + * It will upload all the glyphs needed to render the string `text`. + * It can be called multiple times with different strings. + * @param disp pointer to the lv_draw_eve display + * @param font the font to upload glyphs from + * @param text the ASCII or UTF-8 string that will be iterated for glyphs to upload + */ +void lv_draw_eve_pre_upload_font_text(lv_display_t * disp, const lv_font_t * font, const char * text); + + +/* Low-level EVE control functions */ + +/** + * Call `EVE_memRead8` for custom low-level control of the display. + * @param disp the display returned by `lv_draw_eve_display_create` + * @param address the EVE address to read from + * @return the read value + */ +uint8_t lv_draw_eve_memread8(lv_display_t * disp, uint32_t address); + +/** + * Call `EVE_memRead16` for custom low-level control of the display. + * @param disp the display returned by `lv_draw_eve_display_create` + * @param address the EVE address to read from + * @return the read value + */ +uint16_t lv_draw_eve_memread16(lv_display_t * disp, uint32_t address); + +/** + * Call `EVE_memRead32` for custom low-level control of the display. + * @param disp the display returned by `lv_draw_eve_display_create` + * @param address the EVE address to read from + * @return the read value + */ +uint32_t lv_draw_eve_memread32(lv_display_t * disp, uint32_t address); + +/** + * Call `EVE_memWrite8` for custom low-level control of the display. + * @param disp the display returned by `lv_draw_eve_display_create` + * @param address the EVE address to write to + * @param data the value to write + */ +void lv_draw_eve_memwrite8(lv_display_t * disp, uint32_t address, uint8_t data); + +/** + * Call `EVE_memWrite16` for custom low-level control of the display. + * @param disp the display returned by `lv_draw_eve_display_create` + * @param address the EVE address to write to + * @param data the value to write + */ +void lv_draw_eve_memwrite16(lv_display_t * disp, uint32_t address, uint16_t data); + +/** + * Call `EVE_memWrite32` for custom low-level control of the display. + * @param disp the display returned by `lv_draw_eve_display_create` + * @param address the EVE address to write to + * @param data the value to write + */ +void lv_draw_eve_memwrite32(lv_display_t * disp, uint32_t address, uint32_t data); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_EVE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_EVE_DISPLAY_H*/ diff --git a/inc/lvgl/src/drivers/draw/eve/lv_draw_eve_display_defines.h b/inc/lvgl/src/drivers/draw/eve/lv_draw_eve_display_defines.h new file mode 100644 index 0000000..1d2efff --- /dev/null +++ b/inc/lvgl/src/drivers/draw/eve/lv_draw_eve_display_defines.h @@ -0,0 +1,1207 @@ +/** + * @file lv_draw_eve_display_defines.h + * + */ + +#ifndef LV_DRAW_EVE_DISPLAY_DEFINES_H +#define LV_DRAW_EVE_DISPLAY_DEFINES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_DRAW_EVE + +/********************* + * DEFINES + *********************/ + +/* Memory */ +#define LV_EVE_EVE_RAM_G ((uint32_t) 0x00000000UL) +#define LV_EVE_EVE_ROM_CHIPID ((uint32_t) 0x000C0000UL) +#define LV_EVE_EVE_ROM_FONT ((uint32_t) 0x001E0000UL) +#define LV_EVE_EVE_ROM_FONTROOT ((uint32_t) 0x002FFFFCUL) +#define LV_EVE_EVE_RAM_DL ((uint32_t) 0x00300000UL) +#define LV_EVE_EVE_RAM_REG ((uint32_t) 0x00302000UL) +#define LV_EVE_EVE_RAM_CMD ((uint32_t) 0x00308000UL) + +/* Memory buffer sizes */ +#define LV_EVE_EVE_RAM_G_SIZE ((uint32_t) 1024U*1024UL) +#define LV_EVE_EVE_CMDFIFO_SIZE ((uint32_t) 4U*1024UL) +#define LV_EVE_EVE_RAM_DL_SIZE ((uint32_t) 8U*1024UL) + +/* diplay list list commands, most need OR's arguments */ +#define LV_EVE_DL_DISPLAY ((uint32_t) 0x00000000UL) +#define LV_EVE_DL_BITMAP_SOURCE ((uint32_t) 0x01000000UL) +#define LV_EVE_DL_CLEAR_COLOR_RGB ((uint32_t) 0x02000000UL) +#define LV_EVE_DL_TAG ((uint32_t) 0x03000000UL) +#define LV_EVE_DL_COLOR_RGB ((uint32_t) 0x04000000UL) +#define LV_EVE_DL_BITMAP_HANDLE ((uint32_t) 0x05000000UL) +#define LV_EVE_DL_CELL ((uint32_t) 0x06000000UL) +#define LV_EVE_DL_BITMAP_LAYOUT ((uint32_t) 0x07000000UL) +#define LV_EVE_DL_BITMAP_SIZE ((uint32_t) 0x08000000UL) +#define LV_EVE_DL_ALPHA_FUNC ((uint32_t) 0x09000000UL) +#define LV_EVE_DL_STENCIL_FUNC ((uint32_t) 0x0A000000UL) +#define LV_EVE_DL_BLEND_FUNC ((uint32_t) 0x0B000000UL) +#define LV_EVE_DL_STENCIL_OP ((uint32_t) 0x0C000000UL) +#define LV_EVE_DL_POINT_SIZE ((uint32_t) 0x0D000000UL) +#define LV_EVE_DL_LINE_WIDTH ((uint32_t) 0x0E000000UL) +#define LV_EVE_DL_CLEAR_COLOR_A ((uint32_t) 0x0F000000UL) +#define LV_EVE_DL_COLOR_A ((uint32_t) 0x10000000UL) +#define LV_EVE_DL_CLEAR_STENCIL ((uint32_t) 0x11000000UL) +#define LV_EVE_DL_CLEAR_TAG ((uint32_t) 0x12000000UL) +#define LV_EVE_DL_STENCIL_MASK ((uint32_t) 0x13000000UL) +#define LV_EVE_DL_TAG_MASK ((uint32_t) 0x14000000UL) +#define LV_EVE_DL_BITMAP_TRANSFORM_A ((uint32_t) 0x15000000UL) +#define LV_EVE_DL_BITMAP_TRANSFORM_B ((uint32_t) 0x16000000UL) +#define LV_EVE_DL_BITMAP_TRANSFORM_C ((uint32_t) 0x17000000UL) +#define LV_EVE_DL_BITMAP_TRANSFORM_D ((uint32_t) 0x18000000UL) +#define LV_EVE_DL_BITMAP_TRANSFORM_E ((uint32_t) 0x19000000UL) +#define LV_EVE_DL_BITMAP_TRANSFORM_F ((uint32_t) 0x1A000000UL) +#define LV_EVE_DL_SCISSOR_XY ((uint32_t) 0x1B000000UL) +#define LV_EVE_DL_SCISSOR_SIZE ((uint32_t) 0x1C000000UL) +#define LV_EVE_DL_CALL ((uint32_t) 0x1D000000UL) +#define LV_EVE_DL_JUMP ((uint32_t) 0x1E000000UL) +#define LV_EVE_DL_BEGIN ((uint32_t) 0x1F000000UL) +#define LV_EVE_DL_COLOR_MASK ((uint32_t) 0x20000000UL) +#define LV_EVE_DL_END ((uint32_t) 0x21000000UL) +#define LV_EVE_DL_SAVE_CONTEXT ((uint32_t) 0x22000000UL) +#define LV_EVE_DL_RESTORE_CONTEXT ((uint32_t) 0x23000000UL) +#define LV_EVE_DL_RETURN ((uint32_t) 0x24000000UL) +#define LV_EVE_DL_MACRO ((uint32_t) 0x25000000UL) +#define LV_EVE_DL_CLEAR ((uint32_t) 0x26000000UL) +#define LV_EVE_DL_VERTEX_FORMAT ((uint32_t) 0x27000000UL) +#define LV_EVE_DL_BITMAP_LAYOUT_H ((uint32_t) 0x28000000UL) +#define LV_EVE_DL_BITMAP_SIZE_H ((uint32_t) 0x29000000UL) +#define LV_EVE_DL_PALETTE_SOURCE ((uint32_t) 0x2A000000UL) +#define LV_EVE_DL_VERTEX_TRANSLATE_X ((uint32_t) 0x2B000000UL) +#define LV_EVE_DL_VERTEX_TRANSLATE_Y ((uint32_t) 0x2C000000UL) +#define LV_EVE_DL_NOP ((uint32_t) 0x2D000000UL) + +#define LV_EVE_DL_VERTEX2F ((uint32_t) 0x40000000UL) +#define LV_EVE_DL_VERTEX2II ((uint32_t) 0x80000000UL) + +#define LV_EVE_CLR_COL ((uint8_t) 0x4U) +#define LV_EVE_CLR_STN ((uint8_t) 0x2U) +#define LV_EVE_CLR_TAG ((uint8_t) 0x1U) + +/* Host commands */ +#define LV_EVE_EVE_ACTIVE ((uint8_t) 0x00U) /* place EVE in active state */ +#define LV_EVE_EVE_STANDBY ((uint8_t) 0x41U) /* place EVE in Standby (clk running) */ +#define LV_EVE_EVE_SLEEP ((uint8_t) 0x42U) /* place EVE in Sleep (clk off) */ +#define LV_EVE_EVE_CLKEXT ((uint8_t) 0x44U) /* select external clock source */ +#define LV_EVE_EVE_CLKINT ((uint8_t) 0x48U) /* select internal clock source, not a valid option for BT817 / BT818 */ +#define LV_EVE_EVE_PWRDOWN ((uint8_t) 0x50U) /* place EVE in Power Down (core off) */ +#define LV_EVE_EVE_CLKSEL ((uint8_t) 0x61U) /* configure system clock */ +#define LV_EVE_EVE_RST_PULSE ((uint8_t) 0x68U) /* reset core - all registers default and processors reset */ +#define LV_EVE_EVE_CORERST ((uint8_t) 0x68U) /* reset core - all registers default and processors reset */ +#define LV_EVE_EVE_PINDRIVE ((uint8_t) 0x70U) /* setup drive strength for various pins */ +#define LV_EVE_EVE_PIN_PD_STATE ((uint8_t) 0x71U) /* setup how pins behave during power down */ + +/* Graphic command defines */ +#define LV_EVE_EVE_NEVER ((uint8_t) 0UL) +#define LV_EVE_EVE_LESS ((uint8_t) 1UL) +#define LV_EVE_EVE_LEQUAL ((uint8_t) 2UL) +#define LV_EVE_EVE_GREATER ((uint8_t) 3UL) +#define LV_EVE_EVE_GEQUAL ((uint8_t) 4UL) +#define LV_EVE_EVE_EQUAL ((uint8_t) 5UL) +#define LV_EVE_EVE_NOTEQUAL ((uint8_t) 6UL) +#define LV_EVE_EVE_ALWAYS ((uint8_t) 7UL) + +/* Bitmap formats */ +#define LV_EVE_EVE_ARGB1555 ((uint8_t) 0UL) +#define LV_EVE_EVE_L1 ((uint8_t) 1UL) +#define LV_EVE_EVE_L4 ((uint8_t) 2UL) +#define LV_EVE_EVE_L8 ((uint8_t) 3UL) +#define LV_EVE_EVE_RGB332 ((uint8_t) 4UL) +#define LV_EVE_EVE_ARGB2 ((uint8_t) 5UL) +#define LV_EVE_EVE_ARGB4 ((uint8_t) 6UL) +#define LV_EVE_EVE_RGB565 ((uint8_t) 7UL) +#define LV_EVE_EVE_PALETTED ((uint8_t) 8UL) +#define LV_EVE_EVE_TEXT8X8 ((uint8_t) 9UL) +#define LV_EVE_EVE_TEXTVGA ((uint8_t) 10UL) +#define LV_EVE_EVE_BARGRAPH ((uint8_t) 11UL) + +/* Bitmap filter types */ +#define LV_EVE_EVE_NEAREST ((uint8_t) 0UL) +#define LV_EVE_EVE_BILINEAR ((uint8_t) 1UL) + +/* Bitmap wrap types */ +#define LV_EVE_EVE_BORDER ((uint8_t) 0UL) +#define LV_EVE_EVE_REPEAT ((uint8_t) 1UL) + +/* Stencil defines */ +#define LV_EVE_EVE_KEEP ((uint8_t) 1UL) +#define LV_EVE_EVE_REPLACE ((uint8_t) 2UL) +#define LV_EVE_EVE_INCR ((uint8_t) 3UL) +#define LV_EVE_EVE_DECR ((uint8_t) 4UL) +#define LV_EVE_EVE_INVERT ((uint8_t) 5UL) + +/* Graphics display list swap defines */ +#define LV_EVE_EVE_DLSWAP_DONE ((uint8_t) 0UL) +#define LV_EVE_EVE_DLSWAP_LINE ((uint8_t) 1UL) +#define LV_EVE_EVE_DLSWAP_FRAME ((uint8_t) 2UL) + +/* Interrupt bits */ +#define LV_EVE_EVE_INT_SWAP ((uint8_t) 0x01) +#define LV_EVE_EVE_INT_TOUCH ((uint8_t) 0x02) +#define LV_EVE_EVE_INT_TAG ((uint8_t) 0x04) +#define LV_EVE_EVE_INT_SOUND ((uint8_t) 0x08) +#define LV_EVE_EVE_INT_PLAYBACK ((uint8_t) 0x10) +#define LV_EVE_EVE_INT_CMDEMPTY ((uint8_t) 0x20) +#define LV_EVE_EVE_INT_CMDFLAG ((uint8_t) 0x40) +#define LV_EVE_EVE_INT_CONVCOMPLETE ((uint8_t) 0x80) + +/* Touch mode */ +#define LV_EVE_EVE_TMODE_OFF ((uint8_t) 0U) +#define LV_EVE_EVE_TMODE_ONESHOT ((uint8_t) 1U) +#define LV_EVE_EVE_TMODE_FRAME ((uint8_t) 2U) +#define LV_EVE_EVE_TMODE_CONTINUOUS ((uint8_t) 3U) + +/* Alpha blending */ +#define LV_EVE_EVE_ZERO ((uint32_t) 0UL) +#define LV_EVE_EVE_ONE ((uint32_t) 1UL) +#define LV_EVE_EVE_SRC_ALPHA ((uint32_t) 2UL) +#define LV_EVE_EVE_DST_ALPHA ((uint32_t) 3UL) +#define LV_EVE_EVE_ONE_MINUS_SRC_ALPHA ((uint32_t) 4UL) +#define LV_EVE_EVE_ONE_MINUS_DST_ALPHA ((uint32_t) 5UL) + +/* Graphics primitives */ +#define LV_EVE_EVE_BITMAPS ((uint32_t) 1UL) +#define LV_EVE_EVE_POINTS ((uint32_t) 2UL) +#define LV_EVE_EVE_LINES ((uint32_t) 3UL) +#define LV_EVE_EVE_LINE_STRIP ((uint32_t) 4UL) +#define LV_EVE_EVE_EDGE_STRIP_R ((uint32_t) 5UL) +#define LV_EVE_EVE_EDGE_STRIP_L ((uint32_t) 6UL) +#define LV_EVE_EVE_EDGE_STRIP_A ((uint32_t) 7UL) +#define LV_EVE_EVE_EDGE_STRIP_B ((uint32_t) 8UL) +#define LV_EVE_EVE_RECTS ((uint32_t) 9UL) +#define LV_EVE_EVE_INT_G8 ((uint32_t) 18UL) +#define LV_EVE_EVE_INT_L8C ((uint32_t) 12UL) +#define LV_EVE_EVE_INT_VGA ((uint32_t) 13UL) +#define LV_EVE_EVE_PALETTED565 ((uint32_t) 14UL) +#define LV_EVE_EVE_PALETTED4444 ((uint32_t) 15UL) +#define LV_EVE_EVE_PALETTED8 ((uint32_t) 16UL) +#define LV_EVE_EVE_L2 ((uint32_t) 17UL) + +/* Widget command options */ +#define LV_EVE_EVE_OPT_MONO ((uint16_t) 1U) +#define LV_EVE_EVE_OPT_NODL ((uint16_t) 2U) +#define LV_EVE_EVE_OPT_FLAT ((uint16_t) 256U) +#define LV_EVE_EVE_OPT_CENTERX ((uint16_t) 512U) +#define LV_EVE_EVE_OPT_CENTERY ((uint16_t) 1024U) +#define LV_EVE_EVE_OPT_CENTER (LV_EVE_EVE_OPT_CENTERX | LV_EVE_EVE_OPT_CENTERY) +#define LV_EVE_EVE_OPT_NOBACK ((uint16_t) 4096U) +#define LV_EVE_EVE_OPT_NOTICKS ((uint16_t) 8192U) +#define LV_EVE_EVE_OPT_NOHM ((uint16_t) 16384U) +#define LV_EVE_EVE_OPT_NOPOINTER ((uint16_t) 16384U) +#define LV_EVE_EVE_OPT_NOSECS ((uint16_t) 32768U) +#define LV_EVE_EVE_OPT_NOHANDS ((uint16_t) 49152U) +#define LV_EVE_EVE_OPT_RIGHTX ((uint16_t) 2048U) +#define LV_EVE_EVE_OPT_SIGNED ((uint16_t) 256U) + +#define LV_EVE_EVE_OPT_MEDIAFIFO ((uint16_t) 16U) +#define LV_EVE_EVE_OPT_FULLSCREEN ((uint16_t) 8U) +#define LV_EVE_EVE_OPT_NOTEAR ((uint16_t) 4U) +#define LV_EVE_EVE_OPT_SOUND ((uint16_t) 32U) + +/* ADC */ +#define LV_EVE_EVE_ADC_DIFFERENTIAL ((uint32_t) 1UL) +#define LV_EVE_EVE_ADC_SINGLE_ENDED ((uint32_t) 0UL) + +/* Fonts */ +#define LV_EVE_EVE_NUMCHAR_PERFONT ((uint32_t) 128UL) /* number of font characters per bitmap handle */ +#define LV_EVE_EVE_FONT_TABLE_SIZE ((uint32_t) 148UL) /* size of the font table - utilized for loopup by the graphics engine */ +#define LV_EVE_EVE_FONT_TABLE_POINTER ((uint32_t) 0xFFFFCUL) /* pointer to the inbuilt font tables starting from bitmap handle 16 */ + +/* Audio sample type defines */ +#define LV_EVE_EVE_LINEAR_SAMPLES ((uint32_t) 0UL) /* 8bit signed samples */ +#define LV_EVE_EVE_ULAW_SAMPLES ((uint32_t) 1UL) /* 8bit ulaw samples */ +#define LV_EVE_EVE_ADPCM_SAMPLES ((uint32_t) 2UL) /* 4bit ima adpcm samples */ + +/* Synthesized sound */ +#define LV_EVE_EVE_SILENCE ((uint8_t) 0x00U) +#define LV_EVE_EVE_SQUAREWAVE ((uint8_t) 0x01U) +#define LV_EVE_EVE_SINEWAVE ((uint8_t) 0x02U) +#define LV_EVE_EVE_SAWTOOTH ((uint8_t) 0x03U) +#define LV_EVE_EVE_TRIANGLE ((uint8_t) 0x04U) +#define LV_EVE_EVE_BEEPING ((uint8_t) 0x05U) +#define LV_EVE_EVE_ALARM ((uint8_t) 0x06U) +#define LV_EVE_EVE_WARBLE ((uint8_t) 0x07U) +#define LV_EVE_EVE_CAROUSEL ((uint8_t) 0x08U) +#define LV_EVE_EVE_PIPS(n) ((uint8_t) (0x0FU + (n))) +#define LV_EVE_EVE_HARP ((uint8_t) 0x40U) +#define LV_EVE_EVE_XYLOPHONE ((uint8_t) 0x41U) +#define LV_EVE_EVE_TUBA ((uint8_t) 0x42U) +#define LV_EVE_EVE_GLOCKENSPIEL ((uint8_t) 0x43U) +#define LV_EVE_EVE_ORGAN ((uint8_t) 0x44U) +#define LV_EVE_EVE_TRUMPET ((uint8_t) 0x45U) +#define LV_EVE_EVE_PIANO ((uint8_t) 0x46U) +#define LV_EVE_EVE_CHIMES ((uint8_t) 0x47U) +#define LV_EVE_EVE_MUSICBOX ((uint8_t) 0x48U) +#define LV_EVE_EVE_BELL ((uint8_t) 0x49U) +#define LV_EVE_EVE_CLICK ((uint8_t) 0x50U) +#define LV_EVE_EVE_SWITCH ((uint8_t) 0x51U) +#define LV_EVE_EVE_COWBELL ((uint8_t) 0x52U) +#define LV_EVE_EVE_NOTCH ((uint8_t) 0x53U) +#define LV_EVE_EVE_HIHAT ((uint8_t) 0x54U) +#define LV_EVE_EVE_KICKDRUM ((uint8_t) 0x55U) +#define LV_EVE_EVE_POP ((uint8_t) 0x56U) +#define LV_EVE_EVE_CLACK ((uint8_t) 0x57U) +#define LV_EVE_EVE_CHACK ((uint8_t) 0x58U) +#define LV_EVE_EVE_MUTE ((uint8_t) 0x60U) +#define LV_EVE_EVE_UNMUTE ((uint8_t) 0x61U) + +/* Synthesized sound frequencies, midi note */ +#define LV_EVE_EVE_MIDI_A0 ((uint8_t) 21U) +#define LV_EVE_EVE_MIDI_A_0 ((uint8_t) 22U) +#define LV_EVE_EVE_MIDI_B0 ((uint8_t) 23U) +#define LV_EVE_EVE_MIDI_C1 ((uint8_t) 24U) +#define LV_EVE_EVE_MIDI_C_1 ((uint8_t) 25U) +#define LV_EVE_EVE_MIDI_D1 ((uint8_t) 26U) +#define LV_EVE_EVE_MIDI_D_1 ((uint8_t) 27U) +#define LV_EVE_EVE_MIDI_E1 ((uint8_t) 28U) +#define LV_EVE_EVE_MIDI_F1 ((uint8_t) 29U) +#define LV_EVE_EVE_MIDI_F_1 ((uint8_t) 30U) +#define LV_EVE_EVE_MIDI_G1 ((uint8_t) 31U) +#define LV_EVE_EVE_MIDI_G_1 ((uint8_t) 32U) +#define LV_EVE_EVE_MIDI_A1 ((uint8_t) 33U) +#define LV_EVE_EVE_MIDI_A_1 ((uint8_t) 34U) +#define LV_EVE_EVE_MIDI_B1 ((uint8_t) 35U) +#define LV_EVE_EVE_MIDI_C2 ((uint8_t) 36U) +#define LV_EVE_EVE_MIDI_C_2 ((uint8_t) 37U) +#define LV_EVE_EVE_MIDI_D2 ((uint8_t) 38U) +#define LV_EVE_EVE_MIDI_D_2 ((uint8_t) 39U) +#define LV_EVE_EVE_MIDI_E2 ((uint8_t) 40U) +#define LV_EVE_EVE_MIDI_F2 ((uint8_t) 41U) +#define LV_EVE_EVE_MIDI_F_2 ((uint8_t) 42U) +#define LV_EVE_EVE_MIDI_G2 ((uint8_t) 43U) +#define LV_EVE_EVE_MIDI_G_2 ((uint8_t) 44U) +#define LV_EVE_EVE_MIDI_A2 ((uint8_t) 45U) +#define LV_EVE_EVE_MIDI_A_2 ((uint8_t) 46U) +#define LV_EVE_EVE_MIDI_B2 ((uint8_t) 47U) +#define LV_EVE_EVE_MIDI_C3 ((uint8_t) 48U) +#define LV_EVE_EVE_MIDI_C_3 ((uint8_t) 49U) +#define LV_EVE_EVE_MIDI_D3 ((uint8_t) 50U) +#define LV_EVE_EVE_MIDI_D_3 ((uint8_t) 51U) +#define LV_EVE_EVE_MIDI_E3 ((uint8_t) 52U) +#define LV_EVE_EVE_MIDI_F3 ((uint8_t) 53U) +#define LV_EVE_EVE_MIDI_F_3 ((uint8_t) 54U) +#define LV_EVE_EVE_MIDI_G3 ((uint8_t) 55U) +#define LV_EVE_EVE_MIDI_G_3 ((uint8_t) 56U) +#define LV_EVE_EVE_MIDI_A3 ((uint8_t) 57U) +#define LV_EVE_EVE_MIDI_A_3 ((uint8_t) 58U) +#define LV_EVE_EVE_MIDI_B3 ((uint8_t) 59U) +#define LV_EVE_EVE_MIDI_C4 ((uint8_t) 60U) +#define LV_EVE_EVE_MIDI_C_4 ((uint8_t) 61U) +#define LV_EVE_EVE_MIDI_D4 ((uint8_t) 62U) +#define LV_EVE_EVE_MIDI_D_4 ((uint8_t) 63U) +#define LV_EVE_EVE_MIDI_E4 ((uint8_t) 64U) +#define LV_EVE_EVE_MIDI_F4 ((uint8_t) 65U) +#define LV_EVE_EVE_MIDI_F_4 ((uint8_t) 66U) +#define LV_EVE_EVE_MIDI_G4 ((uint8_t) 67U) +#define LV_EVE_EVE_MIDI_G_4 ((uint8_t) 68U) +#define LV_EVE_EVE_MIDI_A4 ((uint8_t) 69U) +#define LV_EVE_EVE_MIDI_A_4 ((uint8_t) 70U) +#define LV_EVE_EVE_MIDI_B4 ((uint8_t) 71U) +#define LV_EVE_EVE_MIDI_C5 ((uint8_t) 72U) +#define LV_EVE_EVE_MIDI_C_5 ((uint8_t) 73U) +#define LV_EVE_EVE_MIDI_D5 ((uint8_t) 74U) +#define LV_EVE_EVE_MIDI_D_5 ((uint8_t) 75U) +#define LV_EVE_EVE_MIDI_E5 ((uint8_t) 76U) +#define LV_EVE_EVE_MIDI_F5 ((uint8_t) 77U) +#define LV_EVE_EVE_MIDI_F_5 ((uint8_t) 78U) +#define LV_EVE_EVE_MIDI_G5 ((uint8_t) 79U) +#define LV_EVE_EVE_MIDI_G_5 ((uint8_t) 80U) +#define LV_EVE_EVE_MIDI_A5 ((uint8_t) 81U) +#define LV_EVE_EVE_MIDI_A_5 ((uint8_t) 82U) +#define LV_EVE_EVE_MIDI_B5 ((uint8_t) 83U) +#define LV_EVE_EVE_MIDI_C6 ((uint8_t) 84U) +#define LV_EVE_EVE_MIDI_C_6 ((uint8_t) 85U) +#define LV_EVE_EVE_MIDI_D6 ((uint8_t) 86U) +#define LV_EVE_EVE_MIDI_D_6 ((uint8_t) 87U) +#define LV_EVE_EVE_MIDI_E6 ((uint8_t) 88U) +#define LV_EVE_EVE_MIDI_F6 ((uint8_t) 89U) +#define LV_EVE_EVE_MIDI_F_6 ((uint8_t) 90U) +#define LV_EVE_EVE_MIDI_G6 ((uint8_t) 91U) +#define LV_EVE_EVE_MIDI_G_6 ((uint8_t) 92U) +#define LV_EVE_EVE_MIDI_A6 ((uint8_t) 93U) +#define LV_EVE_EVE_MIDI_A_6 ((uint8_t) 94U) +#define LV_EVE_EVE_MIDI_B6 ((uint8_t) 95U) +#define LV_EVE_EVE_MIDI_C7 ((uint8_t) 96U) +#define LV_EVE_EVE_MIDI_C_7 ((uint8_t) 97U) +#define LV_EVE_EVE_MIDI_D7 ((uint8_t) 98U) +#define LV_EVE_EVE_MIDI_D_7 ((uint8_t) 99U) +#define LV_EVE_EVE_MIDI_E7 ((uint8_t) 100U) +#define LV_EVE_EVE_MIDI_F7 ((uint8_t) 101U) +#define LV_EVE_EVE_MIDI_F_7 ((uint8_t) 102U) +#define LV_EVE_EVE_MIDI_G7 ((uint8_t) 103U) +#define LV_EVE_EVE_MIDI_G_7 ((uint8_t) 104U) +#define LV_EVE_EVE_MIDI_A7 ((uint8_t) 105U) +#define LV_EVE_EVE_MIDI_A_7 ((uint8_t) 106U) +#define LV_EVE_EVE_MIDI_B7 ((uint8_t) 107U) +#define LV_EVE_EVE_MIDI_C8 ((uint8_t) 108U) + +/* GPIO bits */ +#define LV_EVE_EVE_GPIO0 ((uint8_t) 0U) +#define LV_EVE_EVE_GPIO1 ((uint8_t) 1U) /* default gpio pin for audio shutdown, 1 - enable, 0 - disable */ +#define LV_EVE_EVE_GPIO7 ((uint8_t) 7U) /* default gpio pin for display enable, 1 - enable, 0 - disable */ + +/* Display rotation */ +#define LV_EVE_EVE_DISPLAY_0 ((uint8_t) 0U) /* 0 degrees rotation */ +#define LV_EVE_EVE_DISPLAY_180 ((uint8_t) 1U) /* 180 degrees rotation */ + +/* Commands */ +#define LV_EVE_CMD_APPEND ((uint32_t) 0xFFFFFF1EUL) +#define LV_EVE_CMD_BGCOLOR ((uint32_t) 0xFFFFFF09UL) +#define LV_EVE_CMD_BUTTON ((uint32_t) 0xFFFFFF0DUL) +#define LV_EVE_CMD_CALIBRATE ((uint32_t) 0xFFFFFF15UL) +#define LV_EVE_CMD_CLOCK ((uint32_t) 0xFFFFFF14UL) +#define LV_EVE_CMD_COLDSTART ((uint32_t) 0xFFFFFF32UL) +#define LV_EVE_CMD_DIAL ((uint32_t) 0xFFFFFF2DUL) +#define LV_EVE_CMD_DLSTART ((uint32_t) 0xFFFFFF00UL) +#define LV_EVE_CMD_FGCOLOR ((uint32_t) 0xFFFFFF0AUL) +#define LV_EVE_CMD_GAUGE ((uint32_t) 0xFFFFFF13UL) +#define LV_EVE_CMD_GETMATRIX ((uint32_t) 0xFFFFFF33UL) +#define LV_EVE_CMD_GETPROPS ((uint32_t) 0xFFFFFF25UL) +#define LV_EVE_CMD_GETPTR ((uint32_t) 0xFFFFFF23UL) +#define LV_EVE_CMD_GRADCOLOR ((uint32_t) 0xFFFFFF34UL) +#define LV_EVE_CMD_GRADIENT ((uint32_t) 0xFFFFFF0BUL) +#define LV_EVE_CMD_INFLATE ((uint32_t) 0xFFFFFF22UL) +#define LV_EVE_CMD_INTERRUPT ((uint32_t) 0xFFFFFF02UL) +#define LV_EVE_CMD_KEYS ((uint32_t) 0xFFFFFF0EUL) +#define LV_EVE_CMD_LOADIDENTITY ((uint32_t) 0xFFFFFF26UL) +#define LV_EVE_CMD_LOADIMAGE ((uint32_t) 0xFFFFFF24UL) +#define LV_EVE_CMD_LOGO ((uint32_t) 0xFFFFFF31UL) +#define LV_EVE_CMD_MEDIAFIFO ((uint32_t) 0xFFFFFF39UL) +#define LV_EVE_CMD_MEMCPY ((uint32_t) 0xFFFFFF1DUL) +#define LV_EVE_CMD_MEMCRC ((uint32_t) 0xFFFFFF18UL) +#define LV_EVE_CMD_MEMSET ((uint32_t) 0xFFFFFF1BUL) +#define LV_EVE_CMD_MEMWRITE ((uint32_t) 0xFFFFFF1AUL) +#define LV_EVE_CMD_MEMZERO ((uint32_t) 0xFFFFFF1CUL) +#define LV_EVE_CMD_NUMBER ((uint32_t) 0xFFFFFF2EUL) +#define LV_EVE_CMD_PLAYVIDEO ((uint32_t) 0xFFFFFF3AUL) +#define LV_EVE_CMD_PROGRESS ((uint32_t) 0xFFFFFF0FUL) +#define LV_EVE_CMD_REGREAD ((uint32_t) 0xFFFFFF19UL) +#define LV_EVE_CMD_ROMFONT ((uint32_t) 0xFFFFFF3FUL) +#define LV_EVE_CMD_ROTATE ((uint32_t) 0xFFFFFF29UL) +#define LV_EVE_CMD_SCALE ((uint32_t) 0xFFFFFF28UL) +#define LV_EVE_CMD_SCREENSAVER ((uint32_t) 0xFFFFFF2FUL) +#define LV_EVE_CMD_SCROLLBAR ((uint32_t) 0xFFFFFF11UL) +#define LV_EVE_CMD_SETBASE ((uint32_t) 0xFFFFFF38UL) +#define LV_EVE_CMD_SETBITMAP ((uint32_t) 0xFFFFFF43UL) +#define LV_EVE_CMD_SETFONT ((uint32_t) 0xFFFFFF2BUL) +#define LV_EVE_CMD_SETFONT2 ((uint32_t) 0xFFFFFF3BUL) +#define LV_EVE_CMD_SETMATRIX ((uint32_t) 0xFFFFFF2AUL) +#define LV_EVE_CMD_SETROTATE ((uint32_t) 0xFFFFFF36UL) +#define LV_EVE_CMD_SETSCRATCH ((uint32_t) 0xFFFFFF3CUL) +#define LV_EVE_CMD_SKETCH ((uint32_t) 0xFFFFFF30UL) +#define LV_EVE_CMD_SLIDER ((uint32_t) 0xFFFFFF10UL) +#define LV_EVE_CMD_SNAPSHOT ((uint32_t) 0xFFFFFF1FUL) +#define LV_EVE_CMD_SNAPSHOT2 ((uint32_t) 0xFFFFFF37UL) +#define LV_EVE_CMD_SPINNER ((uint32_t) 0xFFFFFF16UL) +#define LV_EVE_CMD_STOP ((uint32_t) 0xFFFFFF17UL) +#define LV_EVE_CMD_SWAP ((uint32_t) 0xFFFFFF01UL) +#define LV_EVE_CMD_TEXT ((uint32_t) 0xFFFFFF0CUL) +#define LV_EVE_CMD_TOGGLE ((uint32_t) 0xFFFFFF12UL) +#define LV_EVE_CMD_TRACK ((uint32_t) 0xFFFFFF2CUL) +#define LV_EVE_CMD_TRANSLATE ((uint32_t) 0xFFFFFF27UL) +#define LV_EVE_CMD_VIDEOFRAME ((uint32_t) 0xFFFFFF41UL) +#define LV_EVE_CMD_VIDEOSTART ((uint32_t) 0xFFFFFF40UL) + +/* Registers */ +#define LV_EVE_REG_ANA_COMP ((uint32_t) 0x00302184UL) /* only listed in datasheet */ +#define LV_EVE_REG_BIST_EN ((uint32_t) 0x00302174UL) /* only listed in datasheet */ +#define LV_EVE_REG_CLOCK ((uint32_t) 0x00302008UL) +#define LV_EVE_REG_CMDB_SPACE ((uint32_t) 0x00302574UL) +#define LV_EVE_REG_CMDB_WRITE ((uint32_t) 0x00302578UL) +#define LV_EVE_REG_CMD_DL ((uint32_t) 0x00302100UL) +#define LV_EVE_REG_CMD_READ ((uint32_t) 0x003020f8UL) +#define LV_EVE_REG_CMD_WRITE ((uint32_t) 0x003020fcUL) +#define LV_EVE_REG_CPURESET ((uint32_t) 0x00302020UL) +#define LV_EVE_REG_CSPREAD ((uint32_t) 0x00302068UL) +#define LV_EVE_REG_CTOUCH_EXTENDED ((uint32_t) 0x00302108UL) +#define LV_EVE_REG_CTOUCH_TOUCH0_XY ((uint32_t) 0x00302124UL) /* only listed in datasheet */ +#define LV_EVE_REG_CTOUCH_TOUCH4_X ((uint32_t) 0x0030216cUL) +#define LV_EVE_REG_CTOUCH_TOUCH4_Y ((uint32_t) 0x00302120UL) +#define LV_EVE_REG_CTOUCH_TOUCH1_XY ((uint32_t) 0x0030211cUL) +#define LV_EVE_REG_CTOUCH_TOUCH2_XY ((uint32_t) 0x0030218cUL) +#define LV_EVE_REG_CTOUCH_TOUCH3_XY ((uint32_t) 0x00302190UL) +#define LV_EVE_REG_TOUCH_CONFIG ((uint32_t) 0x00302168UL) +#define LV_EVE_REG_DATESTAMP ((uint32_t) 0x00302564UL) /* only listed in datasheet */ +#define LV_EVE_REG_DITHER ((uint32_t) 0x00302060UL) +#define LV_EVE_REG_DLSWAP ((uint32_t) 0x00302054UL) +#define LV_EVE_REG_FRAMES ((uint32_t) 0x00302004UL) +#define LV_EVE_REG_FREQUENCY ((uint32_t) 0x0030200cUL) +#define LV_EVE_REG_GPIO ((uint32_t) 0x00302094UL) +#define LV_EVE_REG_GPIOX ((uint32_t) 0x0030209cUL) +#define LV_EVE_REG_GPIOX_DIR ((uint32_t) 0x00302098UL) +#define LV_EVE_REG_GPIO_DIR ((uint32_t) 0x00302090UL) +#define LV_EVE_REG_HCYCLE ((uint32_t) 0x0030202cUL) +#define LV_EVE_REG_HOFFSET ((uint32_t) 0x00302030UL) +#define LV_EVE_REG_HSIZE ((uint32_t) 0x00302034UL) +#define LV_EVE_REG_HSYNC0 ((uint32_t) 0x00302038UL) +#define LV_EVE_REG_HSYNC1 ((uint32_t) 0x0030203cUL) +#define LV_EVE_REG_ID ((uint32_t) 0x00302000UL) +#define LV_EVE_REG_INT_EN ((uint32_t) 0x003020acUL) +#define LV_EVE_REG_INT_FLAGS ((uint32_t) 0x003020a8UL) +#define LV_EVE_REG_INT_MASK ((uint32_t) 0x003020b0UL) +#define LV_EVE_REG_MACRO_0 ((uint32_t) 0x003020d8UL) +#define LV_EVE_REG_MACRO_1 ((uint32_t) 0x003020dcUL) +#define LV_EVE_REG_MEDIAFIFO_READ ((uint32_t) 0x00309014UL) /* only listed in programmers guide */ +#define LV_EVE_REG_MEDIAFIFO_WRITE ((uint32_t) 0x00309018UL) /* only listed in programmers guide */ +#define LV_EVE_REG_OUTBITS ((uint32_t) 0x0030205cUL) +#define LV_EVE_REG_PCLK ((uint32_t) 0x00302070UL) +#define LV_EVE_REG_PCLK_POL ((uint32_t) 0x0030206cUL) +#define LV_EVE_REG_PLAY ((uint32_t) 0x0030208cUL) +#define LV_EVE_REG_PLAYBACK_FORMAT ((uint32_t) 0x003020c4UL) +#define LV_EVE_REG_PLAYBACK_FREQ ((uint32_t) 0x003020c0UL) +#define LV_EVE_REG_PLAYBACK_LENGTH ((uint32_t) 0x003020b8UL) +#define LV_EVE_REG_PLAYBACK_LOOP ((uint32_t) 0x003020c8UL) +#define LV_EVE_REG_PLAYBACK_PLAY ((uint32_t) 0x003020ccUL) +#define LV_EVE_REG_PLAYBACK_READPTR ((uint32_t) 0x003020bcUL) +#define LV_EVE_REG_PLAYBACK_START ((uint32_t) 0x003020b4UL) +#define LV_EVE_REG_PWM_DUTY ((uint32_t) 0x003020d4UL) +#define LV_EVE_REG_PWM_HZ ((uint32_t) 0x003020d0UL) +#define LV_EVE_REG_RENDERMODE ((uint32_t) 0x00302010UL) /* only listed in datasheet */ +#define LV_EVE_REG_ROTATE ((uint32_t) 0x00302058UL) +#define LV_EVE_REG_SNAPFORMAT ((uint32_t) 0x0030201cUL) /* only listed in datasheet */ +#define LV_EVE_REG_SNAPSHOT ((uint32_t) 0x00302018UL) /* only listed in datasheet */ +#define LV_EVE_REG_SNAPY ((uint32_t) 0x00302014UL) /* only listed in datasheet */ +#define LV_EVE_REG_SOUND ((uint32_t) 0x00302088UL) +#define LV_EVE_REG_SPI_WIDTH ((uint32_t) 0x00302188UL) /* listed with false offset in programmers guide V1.1 */ +#define LV_EVE_REG_SWIZZLE ((uint32_t) 0x00302064UL) +#define LV_EVE_REG_TAG ((uint32_t) 0x0030207cUL) +#define LV_EVE_REG_TAG_X ((uint32_t) 0x00302074UL) +#define LV_EVE_REG_TAG_Y ((uint32_t) 0x00302078UL) +#define LV_EVE_REG_TAP_CRC ((uint32_t) 0x00302024UL) /* only listed in datasheet */ +#define LV_EVE_REG_TAP_MASK ((uint32_t) 0x00302028UL) /* only listed in datasheet */ +#define LV_EVE_REG_TOUCH_ADC_MODE ((uint32_t) 0x00302108UL) +#define LV_EVE_REG_TOUCH_CHARGE ((uint32_t) 0x0030210cUL) +#define LV_EVE_REG_TOUCH_DIRECT_XY ((uint32_t) 0x0030218cUL) +#define LV_EVE_REG_TOUCH_DIRECT_Z1Z2 ((uint32_t) 0x00302190UL) +#define LV_EVE_REG_TOUCH_MODE ((uint32_t) 0x00302104UL) +#define LV_EVE_REG_TOUCH_OVERSAMPLE ((uint32_t) 0x00302114UL) +#define LV_EVE_REG_TOUCH_RAW_XY ((uint32_t) 0x0030211cUL) +#define LV_EVE_REG_TOUCH_RZ ((uint32_t) 0x00302120UL) +#define LV_EVE_REG_TOUCH_RZTHRESH ((uint32_t) 0x00302118UL) +#define LV_EVE_REG_TOUCH_SCREEN_XY ((uint32_t) 0x00302124UL) +#define LV_EVE_REG_TOUCH_SETTLE ((uint32_t) 0x00302110UL) +#define LV_EVE_REG_TOUCH_TAG ((uint32_t) 0x0030212cUL) +#define LV_EVE_REG_TOUCH_TAG1 ((uint32_t) 0x00302134UL) /* only listed in datasheet */ +#define LV_EVE_REG_TOUCH_TAG1_XY ((uint32_t) 0x00302130UL) /* only listed in datasheet */ +#define LV_EVE_REG_TOUCH_TAG2 ((uint32_t) 0x0030213cUL) /* only listed in datasheet */ +#define LV_EVE_REG_TOUCH_TAG2_XY ((uint32_t) 0x00302138UL) /* only listed in datasheet */ +#define LV_EVE_REG_TOUCH_TAG3 ((uint32_t) 0x00302144UL) /* only listed in datasheet */ +#define LV_EVE_REG_TOUCH_TAG3_XY ((uint32_t) 0x00302140UL) /* only listed in datasheet */ +#define LV_EVE_REG_TOUCH_TAG4 ((uint32_t) 0x0030214cUL)/* only listed in datasheet */ +#define LV_EVE_REG_TOUCH_TAG4_XY ((uint32_t) 0x00302148UL) /* only listed in datasheet */ +#define LV_EVE_REG_TOUCH_TAG_XY ((uint32_t) 0x00302128UL) +#define LV_EVE_REG_TOUCH_TRANSFORM_A ((uint32_t) 0x00302150UL) +#define LV_EVE_REG_TOUCH_TRANSFORM_B ((uint32_t) 0x00302154UL) +#define LV_EVE_REG_TOUCH_TRANSFORM_C ((uint32_t) 0x00302158UL) +#define LV_EVE_REG_TOUCH_TRANSFORM_D ((uint32_t) 0x0030215cUL) +#define LV_EVE_REG_TOUCH_TRANSFORM_E ((uint32_t) 0x00302160UL) +#define LV_EVE_REG_TOUCH_TRANSFORM_F ((uint32_t) 0x00302164UL) +#define LV_EVE_REG_TRACKER ((uint32_t) 0x00309000UL) /* only listed in programmers guide */ +#define LV_EVE_REG_TRACKER_1 ((uint32_t) 0x00309004UL) /* only listed in programmers guide */ +#define LV_EVE_REG_TRACKER_2 ((uint32_t) 0x00309008UL) /* only listed in programmers guide */ +#define LV_EVE_REG_TRACKER_3 ((uint32_t) 0x0030900cUL) /* only listed in programmers guide */ +#define LV_EVE_REG_TRACKER_4 ((uint32_t) 0x00309010UL) /* only listed in programmers guide */ +#define LV_EVE_REG_TRIM ((uint32_t) 0x00302180UL) +#define LV_EVE_REG_VCYCLE ((uint32_t) 0x00302040UL) +#define LV_EVE_REG_VOFFSET ((uint32_t) 0x00302044UL) +#define LV_EVE_REG_VOL_PB ((uint32_t) 0x00302080UL) +#define LV_EVE_REG_VOL_SOUND ((uint32_t) 0x00302084UL) +#define LV_EVE_REG_VSIZE ((uint32_t) 0x00302048UL) +#define LV_EVE_REG_VSYNC0 ((uint32_t) 0x0030204cUL) +#define LV_EVE_REG_VSYNC1 ((uint32_t) 0x00302050UL) + + +/* Macros for static display list generation */ + +//#define LV_EVE_ALPHA_FUNC(func,ref) ((LV_EVE_DL_ALPHA_FUNC) | (((func) & 7UL) << 8U) | ((ref) & 0xFFUL)) +/** + * @brief Set the alpha test function. + * + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_ALPHA_FUNC(uint8_t func, uint8_t ref) +{ + uint32_t const funcv = ((uint32_t) func & 7U) << 8U; + return (LV_EVE_DL_ALPHA_FUNC | funcv | ref); +} + +//#define LV_EVE_BITMAP_HANDLE(handle) ((LV_EVE_DL_BITMAP_HANDLE) | ((handle) & 0x1FUL)) +/** + * @brief Set the bitmap handle. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_HANDLE(uint8_t handle) +{ + return (LV_EVE_DL_BITMAP_HANDLE | ((handle) & 0x1FUL)); +} + +//#define LV_EVE_BITMAP_LAYOUT(format,linestride,height) ((LV_EVE_DL_BITMAP_LAYOUT) | (((format) & 0x1FUL) << 19U) | (((linestride) & 0x3FFUL) << 9U) | ((height) & 0x1FFUL)) +/** + * @brief Set the source bitmap memory format and layout for the current handle. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_LAYOUT(uint8_t format, uint16_t linestride, uint16_t height) +{ + uint32_t const formatv = ((uint32_t) format & 0x1FUL) << 19U; + uint32_t const linestridev = ((uint32_t) linestride & 0x3FFUL) << 9U; + uint32_t const heightv = height & 0x1FFUL; + return (LV_EVE_DL_BITMAP_LAYOUT | formatv | linestridev | heightv); +} + +//#define LV_EVE_BITMAP_SIZE(filter,wrapx,wrapy,width,height) ((LV_EVE_DL_BITMAP_SIZE) | (((filter) & 1UL) << 20U) | (((wrapx) & 1UL) << 19U) | (((wrapy) & 1UL) << 18U) | (((width) & 0x1FFUL) << 9U) | ((height) & 0x1FFUL)) +/** + * @brief Set the source bitmap memory format and layout for the current handle. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_SIZE(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height) +{ + uint32_t const filterv = (filter & 0x1UL) << 20U; + uint32_t const wrapxv = (wrapx & 0x1UL) << 19U; + uint32_t const wrapyv = (wrapy & 0x1UL) << 18U; + uint32_t const widthv = (width & 0x1FFUL) << 9U; + uint32_t const heightv = height & 0x1FFUL; + return (LV_EVE_DL_BITMAP_SIZE | filterv | wrapxv | wrapyv | widthv | heightv); +} + +//#define LV_EVE_BITMAP_LAYOUT_H(linestride,height) ((LV_EVE_DL_BITMAP_LAYOUT_H) | (((((linestride) & 0xC00U) >> 10U)&3UL) << 2U) | ((((height) & 0x600U) >> 9U) & 3UL)) +/** + * @brief Set the 2 most significant bits of the source bitmap memory format and layout for the current handle. + * @param linestride 12-bit value specified to BITMAP_LAYOUT + * @param height 11-bit value specified to BITMAP_LAYOUT + * @note this is different to FTDIs implementation as this takes the original values as parameters and not only the upper bits + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_LAYOUT_H(uint16_t linestride, uint16_t height) +{ + uint32_t const linestridev = (uint32_t)((((linestride & 0xC00U) >> 10U) & 3UL) << 2U); + uint32_t const heightv = (uint32_t)(((height & 0x600U) >> 9U) & 3UL); + return (LV_EVE_DL_BITMAP_LAYOUT_H | linestridev | heightv); +} + +//#define LV_EVE_BITMAP_SIZE_H(width,height) ((LV_EVE_DL_BITMAP_SIZE_H) | (((((width) & 0x600U) >> 9U) & 3UL) << 2U) | ((((height) & 0x600U) >> 9U) & 3UL)) +/** + * @brief Set the 2 most significant bits of bitmaps dimension for the current handle. + * @param linestride 11-bit value of bitmap width, the 2 most significant bits are used + * @param height 11-bit value of bitmap width, the 2 most significant bits are used + * @note this is different to FTDIs implementation as this takes the original values as parameters and not only the upper bits + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_SIZE_H(uint16_t width, uint16_t height) +{ + uint32_t const widthv = (uint32_t)((((width & 0x600U) >> 9U) & 3UL) << 2U); + uint32_t const heightv = (uint32_t)(((height & 0x600U) >> 9U) & 3UL); + return ((LV_EVE_DL_BITMAP_SIZE_H) | widthv | heightv); +} + +//#define LV_EVE_BITMAP_SOURCE(addr) ((LV_EVE_DL_BITMAP_SOURCE) | ((addr) & 0x3FFFFFUL)) +/** + * @brief Set the source address of bitmap data in RAM_G or flash memory. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_SOURCE(uint32_t addr) +{ + return (LV_EVE_DL_BITMAP_SOURCE | (addr & 0x3FFFFFUL)); +} + +#if LV_DRAW_EVE_EVE_GENERATION < 3 /* only define these for FT81x */ +//#define LV_EVE_BITMAP_TRANSFORM_A(a) ((LV_EVE_DL_BITMAP_TRANSFORM_A) | ((a) & 0x1FFFFUL)) +/** + * @brief Set the A coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_A(uint32_t val) +{ + return (LV_EVE_DL_BITMAP_TRANSFORM_A | (val & 0x1FFFFUL)); +} + +//#define LV_EVE_BITMAP_TRANSFORM_B(b) ((LV_EVE_DL_BITMAP_TRANSFORM_B) | ((b) & 0x1FFFFUL)) +/** + * @brief Set the B coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_B(uint32_t val) +{ + return (LV_EVE_DL_BITMAP_TRANSFORM_B | (val & 0x1FFFFUL)); +} + +//#define LV_EVE_BITMAP_TRANSFORM_D(d) ((LV_EVE_DL_BITMAP_TRANSFORM_D) | ((d) & 0x1FFFFUL)) +/** + * @brief Set the D coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_D(uint32_t val) +{ + return (LV_EVE_DL_BITMAP_TRANSFORM_D | (val & 0x1FFFFUL)); +} + +//#define LV_EVE_BITMAP_TRANSFORM_E(e) ((LV_EVE_DL_BITMAP_TRANSFORM_E) | ((e) & 0x1FFFFUL)) +/** + * @brief Set he E coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_E(uint32_t val) +{ + return (LV_EVE_DL_BITMAP_TRANSFORM_E | (val & 0x1FFFFUL)); +} + +#endif + +//#define LV_EVE_BITMAP_TRANSFORM_C(c) ((LV_EVE_DL_BITMAP_TRANSFORM_C) | ((c) & 0x1FFFFUL)) +/** + * @brief Set the C coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_C(uint32_t val) +{ + return (LV_EVE_DL_BITMAP_TRANSFORM_C | (val & 0x1FFFFUL)); +} + +//#define LV_EVE_BITMAP_TRANSFORM_F(f) ((LV_EVE_DL_BITMAP_TRANSFORM_F) | ((f) & 0x1FFFFUL)) +/** + * @brief Set the F coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_F(uint32_t val) +{ + return (LV_EVE_DL_BITMAP_TRANSFORM_F | (val & 0x1FFFFUL)); +} + +//#define LV_EVE_BLEND_FUNC(src,dst) ((LV_EVE_DL_BLEND_FUNC) | (((src) & 7UL) << 3U) | ((dst) & 7UL)) +/** + * @brief Execute a sequence of commands at another location in the display list. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BLEND_FUNC(uint8_t src, uint8_t dst) +{ + uint32_t const srcv = (uint32_t)((src & 7UL) << 3U); + uint32_t const dstv = (uint32_t)(dst & 7UL); + return (LV_EVE_DL_BLEND_FUNC | srcv | dstv); +} + +//#define LV_EVE_CALL(dest) ((LV_EVE_DL_CALL) | ((dest) & 0xFFFFUL)) +/** + * @brief Execute a sequence of commands at another location in the display list. + * @note valid range for dest is from zero to 2047 + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_CALL(uint16_t dest) +{ + return (LV_EVE_DL_CALL | (dest & 0x7FFUL)); +} + +//#define LV_EVE_JUMP(dest) ((LV_EVE_DL_JUMP) | ((dest) & 0xFFFFUL)) +/** + * @brief Execute commands at another location in the display list. + * @note valid range for dest is from zero to 2047 + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_JUMP(uint16_t dest) +{ + return (LV_EVE_DL_JUMP | (dest & 0x7FFUL)); +} + +//#define LV_EVE_CELL(cell) ((LV_EVE_DL_CELL) | ((cell) & 0x7FUL)) +/** + * @brief Set the bitmap cell number for the VERTEX2F command. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_CELL(uint8_t cell) +{ + return (LV_EVE_DL_CELL | (cell & 0x7FUL)); +} + +//#define LV_EVE_CLEAR(c,s,t) ((LV_EVE_DL_CLEAR) | (((c) & 1UL) << 2U) | (((s) & 1UL) << 1U) | ((t) & 1UL)) +/** + * @brief Clear buffers to preset values. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_CLEAR(uint8_t color, uint8_t stencil, uint8_t tag) +{ + uint32_t const colorv = (color & 1UL) << 2U; + uint32_t const stencilv = (stencil & 1UL) << 1U; + uint32_t const tagv = (tag & 1UL); + return (LV_EVE_DL_CLEAR | colorv | stencilv | tagv); +} + +//#define LV_EVE_CLEAR_COLOR_A(alpha) ((LV_EVE_DL_CLEAR_COLOR_A) | ((alpha) & 0xFFUL)) +/** + * @brief Set clear value for the alpha channel. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_CLEAR_COLOR_A(uint8_t alpha) +{ + return (LV_EVE_DL_CLEAR_COLOR_A | alpha); +} + +//#define LV_EVE_CLEAR_COLOR_RGB(red,green,blue) ((LV_EVE_DL_CLEAR_COLOR_RGB) | (((red) & 0xFFUL) << 16U) | (((green) & 0xFFUL) << 8U) | ((blue) & 0xFFUL)) +/** + * @brief Set clear values for red, green and blue channels. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_CLEAR_COLOR_RGB(uint8_t red, uint8_t green, uint8_t blue) +{ + uint32_t const redv = ((red & 0xFFUL) << 16U); + uint32_t const greenv = ((green & 0xFFUL) << 8U); + uint32_t const bluev = (blue & 0xFFUL); + return (LV_EVE_DL_CLEAR_COLOR_RGB | redv | greenv | bluev); +} + +//#define LV_EVE_CLEAR_STENCIL(s) ((LV_EVE_DL_CLEAR_STENCIL) | ((s) & 0xFFUL)) +/** + * @brief Set clear value for the stencil buffer. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_CLEAR_STENCIL(uint8_t val) +{ + return (LV_EVE_DL_CLEAR_STENCIL | val); +} + +//#define LV_EVE_CLEAR_TAG(s) ((LV_EVE_DL_CLEAR_TAG) | ((s) & 0xFFUL)) +/** + * @brief Set clear value for the tag buffer. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_CLEAR_TAG(uint8_t val) +{ + return (LV_EVE_DL_CLEAR_TAG | val); +} + +//#define LV_EVE_COLOR_A(alpha) ((LV_EVE_DL_COLOR_A) | ((alpha) & 0xFFUL)) +/** + * @brief Set the current color alpha. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_COLOR_A(uint8_t alpha) +{ + return (LV_EVE_DL_COLOR_A | alpha); +} + +//#define LV_EVE_COLOR_MASK(r,g,b,a) ((LV_EVE_DL_COLOR_MASK) | (((r) & 1UL) << 3U) | (((g) & 1UL) << 2U) | (((b) & 1UL) << 1U) | ((a) & 1UL)) +/** + * @brief Enable or disable writing of color components. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_COLOR_MASK(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) +{ + uint32_t const redv = ((red & 1UL) << 3U); + uint32_t const greenv = ((green & 1UL) << 2U); + uint32_t const bluev = ((blue & 1UL) << 1U); + uint32_t const alphav = (alpha & 1UL); + return (LV_EVE_DL_COLOR_MASK | redv | greenv | bluev | alphav); +} + +//#define LV_EVE_COLOR_RGB(red,green,blue) ((LV_EVE_DL_COLOR_RGB) | (((red) & 0xFFUL) << 16U) | (((green) & 0xFFUL) << 8U) | ((blue) & 0xFFUL)) +/** + * @brief Set the current color red, green and blue. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_COLOR_RGB(uint8_t red, uint8_t green, uint8_t blue) +{ + uint32_t const redv = ((red & 0xFFUL) << 16U); + uint32_t const greenv = ((green & 0xFFUL) << 8U); + uint32_t const bluev = (blue & 0xFFUL); + return (LV_EVE_DL_COLOR_RGB | redv | greenv | bluev); +} + +//#define LV_EVE_LINE_WIDTH(width) ((LV_EVE_DL_LINE_WIDTH) | (((uint32_t) (width)) & 0xFFFUL)) +/** + * @brief Set the width of lines to be drawn with primitive LINES in 1/16 pixel precision. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_LINE_WIDTH(uint16_t width) +{ + return (LV_EVE_DL_LINE_WIDTH | (width & 0xFFFUL)); +} + +//#define LV_EVE_MACRO(m) ((LV_EVE_DL_MACRO) | ((m) & 1UL)) +/** + * @brief Execute a single command from a macro register. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_MACRO(uint8_t macro) +{ + return (LV_EVE_DL_MACRO | (macro & 0x1UL)); +} + +//#define LV_EVE_PALETTE_SOURCE(addr) ((LV_EVE_DL_PALETTE_SOURCE) | ((addr) & 0x3FFFFF3UL)) +/** + * @brief Set the base address of the palette. + * @note 2-byte alignment is required if pixel format is PALETTE4444 or PALETTE565. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_PALETTE_SOURCE(uint32_t addr) +{ + return (LV_EVE_DL_PALETTE_SOURCE | (addr & 0x3FFFFFUL)); +} + +//#define LV_EVE_POINT_SIZE(size) ((LV_EVE_DL_POINT_SIZE) | ((size) & 0x1FFFUL)) +/** + * @brief Set the radius of points to be drawn with primitive POINTS in 1/16 pixel precision. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_POINT_SIZE(uint16_t size) +{ + return (LV_EVE_DL_POINT_SIZE | (size & 0x1FFFUL)); +} + +//#define LV_EVE_SCISSOR_SIZE(width,height) ((LV_EVE_DL_SCISSOR_SIZE) | (((width) & 0xFFFUL) << 12U) | ((height) & 0xFFFUL)) +/** + * @brief Set the size of the scissor clip rectangle. + * @note valid range for width and height is from zero to 2048 + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_SCISSOR_SIZE(uint16_t width, uint16_t height) +{ + uint32_t const widthv = (uint32_t)((width & 0xFFFUL) << 12U); + uint32_t const heightv = (uint32_t)(height & 0xFFFUL); + return (LV_EVE_DL_SCISSOR_SIZE | widthv | heightv); +} + +//#define LV_EVE_SCISSOR_XY(x,y) ((LV_EVE_DL_SCISSOR_XY) | (((x) & 0x7FFUL) << 11U) | ((y) & 0x7FFUL)) +/** + * @brief Set the top left corner of the scissor clip rectangle. + * @note valid range for width and height is from zero to 2047 + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_SCISSOR_XY(uint16_t xc0, uint16_t yc0) +{ + uint32_t const xc0v = (uint32_t)((xc0 & 0x7FFUL) << 11U); + uint32_t const yc0v = (uint32_t)(yc0 & 0x7FFUL); + return (LV_EVE_DL_SCISSOR_XY | xc0v | yc0v); +} + +//#define LV_EVE_STENCIL_FUNC(func,ref,mask) ((LV_EVE_DL_STENCIL_FUNC) | (((func) & 7UL) << 16U) | (((ref) & 0xFFUL) << 8U)|((mask) & 0xFFUL)) +/** + * @brief Set function and reference value for stencil testing. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_STENCIL_FUNC(uint8_t func, uint8_t ref, uint8_t mask) +{ + uint32_t const funcv = (uint32_t)((func & 7UL) << 16U); + uint32_t const refv = (uint32_t)((ref & 0xFFUL) << 8U); + uint32_t const maskv = (uint32_t)(mask & 0xFFUL); + return (LV_EVE_DL_STENCIL_FUNC | funcv | refv | maskv); +} + +//#define LV_EVE_STENCIL_MASK(mask) ((LV_EVE_DL_STENCIL_MASK) | ((mask) & 0xFFUL)) +/** + * @brief Control the writing of individual bits in the stencil planes. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_STENCIL_MASK(uint8_t mask) +{ + return (LV_EVE_DL_STENCIL_MASK | mask); +} + +//#define LV_EVE_STENCIL_OP(sfail,spass) ((LV_EVE_DL_STENCIL_OP) | (((sfail) & 7UL) << 3U) | ((spass) & 7UL)) +/** + * @brief Set stencil test actions. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_STENCIL_OP(uint8_t sfail, uint8_t spass) +{ + uint32_t const sfailv = (uint32_t)((sfail & 0x07UL) << 3U); + uint32_t const spassv = (uint32_t)(spass & 0x07UL); + return (LV_EVE_DL_STENCIL_OP | sfailv | spassv); +} + +//#define LV_EVE_TAG(s) ((LV_EVE_DL_TAG) | ((s) & 0xFFUL)) +/** + * @brief Attach the tag value for the following graphics objects drawn on the screen. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_TAG(uint8_t tagval) +{ + return (LV_EVE_DL_TAG | tagval); +} + +//#define LV_EVE_TAG_MASK(mask) ((LV_EVE_DL_TAG_MASK) | ((mask) & 1UL)) +/** + * @brief Control the writing of the tag buffer. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_TAG_MASK(uint8_t mask) +{ + return (LV_EVE_DL_TAG_MASK | ((mask) & 1UL)); +} + +//#define LV_EVE_VERTEX2F(x,y) ((LV_EVE_DL_VERTEX2F) | ((((uint32_t) (x)) & 0x7FFFUL) << 15U) | (((uint32_t) (y)) & 0x7FFFUL)) +/** + * @brief Set coordinates for graphics primitves. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_VERTEX2F(int16_t xc0, int16_t yc0) +{ + uint32_t const xc0v = ((((uint32_t)((uint16_t) xc0)) & 0x7FFFUL) << 15U); + uint32_t const yc0v = (((uint32_t)((uint16_t) yc0)) & 0x7FFFUL); + return (LV_EVE_DL_VERTEX2F | xc0v | yc0v); +} + +//#define LV_EVE_VERTEX2II(x,y,handle,cell) ((LV_EVE_DL_VERTEX2II) | (((x) & 0x1FFUL) << 21U) | (((y) & 0x1FFUL) << 12U) | (((handle) & 0x1FUL) << 7U) | ((cell) & 0x7FUL)) +/** + * @brief Set coordinates, bitmap-handle and cell-number for graphics primitves. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_VERTEX2II(uint16_t xc0, uint16_t yc0, uint8_t handle, uint8_t cell) +{ + uint32_t const xc0v = ((((uint32_t) xc0) & 0x1FFUL) << 21U); + uint32_t const yc0v = ((((uint32_t) yc0) & 0x1FFUL) << 12U); + uint32_t const handlev = ((((uint32_t) handle) & 0x1FUL) << 7U); + uint32_t const cellv = (((uint32_t) cell) & 0x7FUL); + return (LV_EVE_DL_VERTEX2II | xc0v | yc0v | handlev | cellv); +} + +//#define LV_EVE_VERTEX_FORMAT(frac) ((LV_EVE_DL_VERTEX_FORMAT) | ((frac) & 7UL)) +/** + * @brief Set the precision of VERTEX2F coordinates. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_VERTEX_FORMAT(uint8_t frac) +{ + return (LV_EVE_DL_VERTEX_FORMAT | ((frac) & 7UL)); +} + +//#define LV_EVE_VERTEX_TRANSLATE_X(x) ((LV_EVE_DL_VERTEX_TRANSLATE_X) | ((x) & 0x1FFFFUL)) +/** + * @brief Set the vertex transformations X translation component. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_VERTEX_TRANSLATE_X(int32_t xco) +{ + return (LV_EVE_DL_VERTEX_TRANSLATE_X | (((uint32_t) xco) & 0x1FFFFUL)); +} + +//#define LV_EVE_VERTEX_TRANSLATE_Y(y) ((LV_EVE_DL_VERTEX_TRANSLATE_Y) | ((y) & 0x1FFFFUL)) +/** + * @brief Set the vertex transformations Y translation component. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_VERTEX_TRANSLATE_Y(int32_t yco) +{ + return (LV_EVE_DL_VERTEX_TRANSLATE_Y | (((uint32_t) yco) & 0x1FFFFUL)); +} + +/* #define LV_EVE_BEGIN(prim) ((LV_EVE_DL_BEGIN) | ((prim) & 15UL)) */ /* use define LV_EVE_DL_BEGIN */ +/* #define LV_EVE_DISPLAY() ((LV_EVE_DL_DISPLAY)) */ /* use define LV_EVE_DL_DISPLAY */ +/* #define LV_EVE_END() ((LV_EVE_DL_END)) */ /* use define LV_EVE_DL_END */ +/* #define LV_EVE_RESTORE_CONTEXT() ((LV_EVE_DL_RESTORE_CONTEXT)) */ /* use define LV_EVE_DL_RESTORE_CONTEXT */ +/* #define LV_EVE_RETURN() ((LV_EVE_DL_RETURN)) */ /* use define LV_EVE_DL_RETURN */ +/* #define LV_EVE_SAVE_CONTEXT() ((LV_EVE_DL_SAVE_CONTEXT)) */ /* use define LV_EVE_DL_SAVE_CONTEXT */ +/* #define LV_EVE_NOP() ((LV_EVE_DL_NOP)) */ + +/* ########## EVE Generation 3: BT815 / BT816 definitions ########## */ + +#if LV_DRAW_EVE_EVE_GENERATION > 2 + +#define LV_EVE_EVE_GLFORMAT ((uint32_t) 31UL) /* used with BITMAP_LAYOUT to indicate bitmap-format is specified by BITMAP_EXT_FORMAT */ + +#define LV_EVE_DL_BITMAP_EXT_FORMAT ((uint32_t) 0x2E000000UL) /* requires OR'd arguments */ +#define LV_EVE_DL_BITMAP_SWIZZLE ((uint32_t) 0x2F000000UL) +/* #define LV_EVE_DL_INT_FRR ((uint32_t) 0x30000000UL) */ /* ESE displays "Internal: flash read result" - undocumented display list command */ + +/* Extended Bitmap formats */ +#define LV_EVE_EVE_ASTC_4X4 ((uint32_t) 37808UL) +#define LV_EVE_EVE_ASTC_5X4 ((uint32_t) 37809UL) +#define LV_EVE_EVE_ASTC_5X5 ((uint32_t) 37810UL) +#define LV_EVE_EVE_ASTC_6X5 ((uint32_t) 37811UL) +#define LV_EVE_EVE_ASTC_6X6 ((uint32_t) 37812UL) +#define LV_EVE_EVE_ASTC_8X5 ((uint32_t) 37813UL) +#define LV_EVE_EVE_ASTC_8X6 ((uint32_t) 37814UL) +#define LV_EVE_EVE_ASTC_8X8 ((uint32_t) 37815UL) +#define LV_EVE_EVE_ASTC_10X5 ((uint32_t) 37816UL) +#define LV_EVE_EVE_ASTC_10X6 ((uint32_t) 37817UL) +#define LV_EVE_EVE_ASTC_10X8 ((uint32_t) 37818UL) +#define LV_EVE_EVE_ASTC_10X10 ((uint32_t) 37819UL) +#define LV_EVE_EVE_ASTC_12X10 ((uint32_t) 37820UL) +#define LV_EVE_EVE_ASTC_12X12 ((uint32_t) 37821UL) + +#define LV_EVE_EVE_RAM_ERR_REPORT ((uint32_t) 0x309800UL) /* max 128 bytes null terminated string */ +#define LV_EVE_EVE_RAM_FLASH ((uint32_t) 0x800000UL) +#define LV_EVE_EVE_RAM_FLASH_POSTBLOB ((uint32_t) 0x801000UL) + +#define LV_EVE_EVE_OPT_FLASH ((uint16_t) 64U) +#define LV_EVE_EVE_OPT_OVERLAY ((uint16_t) 128U) +#define LV_EVE_EVE_OPT_FORMAT ((uint16_t) 4096U) +#define LV_EVE_EVE_OPT_FILL ((uint16_t) 8192U) + +/* Commands for BT815 / BT816 */ +#define LV_EVE_CMD_BITMAP_TRANSFORM ((uint32_t) 0xFFFFFF21UL) +#define LV_EVE_CMD_SYNC ((uint32_t) 0xFFFFFF42UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_SYNC) */ +#define LV_EVE_CMD_FLASHERASE ((uint32_t) 0xFFFFFF44UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHERASE) */ +#define LV_EVE_CMD_FLASHWRITE ((uint32_t) 0xFFFFFF45UL) +#define LV_EVE_CMD_FLASHREAD ((uint32_t) 0xFFFFFF46UL) +#define LV_EVE_CMD_FLASHUPDATE ((uint32_t) 0xFFFFFF47UL) +#define LV_EVE_CMD_FLASHDETACH ((uint32_t) 0xFFFFFF48UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHDETACH) */ +#define LV_EVE_CMD_FLASHATTACH ((uint32_t) 0xFFFFFF49UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHATTACH) */ +#define LV_EVE_CMD_FLASHFAST ((uint32_t) 0xFFFFFF4AUL) +#define LV_EVE_CMD_FLASHSPIDESEL ((uint32_t) 0xFFFFFF4BUL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHSPIDESEL) */ +#define LV_EVE_CMD_FLASHSPITX ((uint32_t) 0xFFFFFF4CUL) +#define LV_EVE_CMD_FLASHSPIRX ((uint32_t) 0xFFFFFF4DUL) +#define LV_EVE_CMD_FLASHSOURCE ((uint32_t) 0xFFFFFF4EUL) +#define LV_EVE_CMD_CLEARCACHE ((uint32_t) 0xFFFFFF4FUL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_CLEARCACHE) */ +#define LV_EVE_CMD_INFLATE2 ((uint32_t) 0xFFFFFF50UL) +#define LV_EVE_CMD_ROTATEAROUND ((uint32_t) 0xFFFFFF51UL) +#define LV_EVE_CMD_RESETFONTS ((uint32_t) 0xFFFFFF52UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_RESETFONTS) */ +#define LV_EVE_CMD_ANIMSTART ((uint32_t) 0xFFFFFF53UL) +#define LV_EVE_CMD_ANIMSTOP ((uint32_t) 0xFFFFFF54UL) +#define LV_EVE_CMD_ANIMXY ((uint32_t) 0xFFFFFF55UL) +#define LV_EVE_CMD_ANIMDRAW ((uint32_t) 0xFFFFFF56UL) +#define LV_EVE_CMD_GRADIENTA ((uint32_t) 0xFFFFFF57UL) +#define LV_EVE_CMD_FILLWIDTH ((uint32_t) 0xFFFFFF58UL) +#define LV_EVE_CMD_APPENDF ((uint32_t) 0xFFFFFF59UL) +#define LV_EVE_CMD_ANIMFRAME ((uint32_t) 0xFFFFFF5AUL) +#define LV_EVE_CMD_VIDEOSTARTF ((uint32_t) 0xFFFFFF5FUL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_VIDEOSTARTF) */ + +/* Registers for BT815 / BT816 */ +#define LV_EVE_REG_ADAPTIVE_FRAMERATE ((uint32_t) 0x0030257cUL) +#define LV_EVE_REG_PLAYBACK_PAUSE ((uint32_t) 0x003025ecUL) +#define LV_EVE_REG_FLASH_STATUS ((uint32_t) 0x003025f0UL) +#define LV_EVE_REG_FLASH_SIZE ((uint32_t) 0x00309024UL) +#define LV_EVE_REG_PLAY_CONTROL ((uint32_t) 0x0030914eUL) +#define LV_EVE_REG_COPRO_PATCH_PTR ((uint32_t) 0x00309162UL) + +/* Macros for BT815 / BT816 */ + +//#define LV_EVE_BITMAP_EXT_FORMAT(format) ((LV_EVE_DL_BITMAP_EXT_FORMAT) | ((format) & 0xFFFFUL)) +/** + * @brief Set the extended format of the bitmap. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_EXT_FORMAT(uint16_t format) +{ + return (LV_EVE_DL_BITMAP_EXT_FORMAT | format); +} + +//#define LV_EVE_BITMAP_SWIZZLE(r,g,b,a) ((LV_EVE_DL_BITMAP_SWIZZLE) | (((r) & 7UL) << 9U) | (((g) & 7UL) << 6U) | (((b) & 7UL) << 3U) | ((a) & 7UL)) +/** + * @brief Set the source for the red, green, blue and alpha channels of a bitmap. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_SWIZZLE(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) +{ + uint32_t const redv = ((red & 7UL) << 9U); + uint32_t const greenv = ((green & 7UL) << 6U); + uint32_t const bluev = ((blue & 7UL) << 3U); + uint32_t const alphav = (alpha & 7UL); + return (LV_EVE_DL_BITMAP_SWIZZLE | redv | greenv | bluev | alphav); +} + +//#define LV_EVE_BITMAP_TRANSFORM_A_EXT(p,v) ((LV_EVE_DL_BITMAP_TRANSFORM_A) | (((p) & 1UL) << 17U) | ((v) & 0x1FFFFUL)) +/** + * @brief Set the A coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_A(uint8_t prc, uint32_t val) +{ + uint32_t const prcv = ((prc & 1UL) << 17U); + uint32_t const valv = (val & 0x1FFFFUL); + return (LV_EVE_DL_BITMAP_TRANSFORM_A | prcv | valv); +} + +//#define LV_EVE_BITMAP_TRANSFORM_B_EXT(p,v) ((LV_EVE_DL_BITMAP_TRANSFORM_B) | (((p) & 1UL) << 17U) | ((v) & 0x1FFFFUL)) +/** + * @brief Set the B coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_B(uint8_t prc, uint32_t val) +{ + uint32_t const prcv = ((prc & 1UL) << 17U); + uint32_t const valv = (val & 0x1FFFFUL); + return (LV_EVE_DL_BITMAP_TRANSFORM_B | prcv | valv); +} + +//#define LV_EVE_BITMAP_TRANSFORM_D_EXT(p,v) ((LV_EVE_DL_BITMAP_TRANSFORM_D) | (((p) & 1UL) << 17U) | ((v) & 0x1FFFFUL)) +/** + * @brief Set the D coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_D(uint8_t prc, uint32_t val) +{ + uint32_t const prcv = ((prc & 1UL) << 17U); + uint32_t const valv = (val & 0x1FFFFUL); + return (LV_EVE_DL_BITMAP_TRANSFORM_D | prcv | valv); +} + +//#define LV_EVE_BITMAP_TRANSFORM_E_EXT(p,v) ((LV_EVE_DL_BITMAP_TRANSFORM_E) | (((p) & 1UL) << 17U) | ((v) & 0x1FFFFUL)) +/** + * @brief Set the E coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LV_EVE_BITMAP_TRANSFORM_E(uint8_t prc, uint32_t val) +{ + uint32_t const prcv = ((prc & 1UL) << 17U); + uint32_t const valv = (val & 0x1FFFFUL); + return (LV_EVE_DL_BITMAP_TRANSFORM_E | prcv | valv); +} + +//#define LV_EVE_BITMAP_TRANSFORM_A(a) LV_EVE_BITMAP_TRANSFORM_A_EXT(0UL,(a)) +//#define LV_EVE_BITMAP_TRANSFORM_B(b) LV_EVE_BITMAP_TRANSFORM_B_EXT(0UL,(b)) +//#define LV_EVE_BITMAP_TRANSFORM_D(d) LV_EVE_BITMAP_TRANSFORM_D_EXT(0UL,(d)) +//#define LV_EVE_BITMAP_TRANSFORM_E(e) LV_EVE_BITMAP_TRANSFORM_E_EXT(0UL,(e)) + +#endif /* LV_DRAW_EVE_EVE_GENERATION > 2 */ + +/* ########## EVE Generation 4: BT817 / BT818 definitions ########## */ + +#if LV_DRAW_EVE_EVE_GENERATION > 3 + +/* Commands for BT817 / BT818 */ +#define LV_EVE_CMD_ANIMFRAMERAM ((uint32_t) 0xFFFFFF6DUL) +#define LV_EVE_CMD_ANIMSTARTRAM ((uint32_t) 0xFFFFFF6EUL) +#define LV_EVE_CMD_APILEVEL ((uint32_t) 0xFFFFFF63UL) +#define LV_EVE_CMD_CALIBRATESUB ((uint32_t) 0xFFFFFF60UL) +#define LV_EVE_CMD_CALLLIST ((uint32_t) 0xFFFFFF67UL) +#define LV_EVE_CMD_ENDLIST ((uint32_t) 0xFFFFFF69UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_ENDLIST) */ +#define LV_EVE_CMD_FLASHPROGRAM ((uint32_t) 0xFFFFFF70UL) +#define LV_EVE_CMD_FONTCACHE ((uint32_t) 0xFFFFFF6BUL) +#define LV_EVE_CMD_FONTCACHEQUERY ((uint32_t) 0xFFFFFF6CUL) +#define LV_EVE_CMD_GETIMAGE ((uint32_t) 0xFFFFFF64UL) +#define LV_EVE_CMD_HSF ((uint32_t) 0xFFFFFF62UL) +#define LV_EVE_CMD_LINETIME ((uint32_t) 0xFFFFFF5EUL) +#define LV_EVE_CMD_NEWLIST ((uint32_t) 0xFFFFFF68UL) +#define LV_EVE_CMD_PCLKFREQ ((uint32_t) 0xFFFFFF6AUL) +#define LV_EVE_CMD_RETURN ((uint32_t) 0xFFFFFF66UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_RETURN) */ +#define LV_EVE_CMD_RUNANIM ((uint32_t) 0xFFFFFF6FUL) +#define LV_EVE_CMD_TESTCARD ((uint32_t) 0xFFFFFF61UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_TESTCARD) */ +#define LV_EVE_CMD_WAIT ((uint32_t) 0xFFFFFF65UL) + +/* Registers for BT817 / BT818 */ +#define LV_EVE_REG_UNDERRUN ((uint32_t) 0x0030260cUL) +#define LV_EVE_REG_AH_HCYCLE_MAX ((uint32_t) 0x00302610UL) +#define LV_EVE_REG_PCLK_FREQ ((uint32_t) 0x00302614UL) +#define LV_EVE_REG_PCLK_2X ((uint32_t) 0x00302618UL) +#define LV_EVE_REG_ANIM_ACTIVE ((uint32_t) 0x0030902CUL) + +#endif /* LV_DRAW_EVE_EVE_GENERATION > 3 */ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_EVE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_EVE_DISPLAY_DEFINES_H*/ diff --git a/inc/lvgl/src/drivers/evdev/lv_evdev.c b/inc/lvgl/src/drivers/evdev/lv_evdev.c new file mode 100644 index 0000000..1b8319e --- /dev/null +++ b/inc/lvgl/src/drivers/evdev/lv_evdev.c @@ -0,0 +1,681 @@ +/** + * @file lv_evdev.c + * + */ + +/********************** + * INCLUDES + **********************/ +#include "lv_evdev_private.h" +#if LV_USE_EVDEV + +#include +#include +#include +#include +#include +#include +#include +#include /*To detect BSD*/ +#ifdef BSD + #include +#else + #include + #include +#endif /*BSD*/ +#include "../../core/lv_global.h" +#include "../../misc/lv_types.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_async.h" +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" +#include "../../display/lv_display.h" +#include "../../display/lv_display_private.h" +#include "../../widgets/image/lv_image.h" +#include "../../indev/lv_indev_gesture.h" + +/********************* + * DEFINES + *********************/ + +#define evdev_discovery LV_GLOBAL_DEFAULT()->evdev_discovery +#define EVDEV_DISCOVERY_PATH "/dev/input/" +#define EVDEV_DISCOVERY_PATH_BUF_SIZE 32 +#define REL_XY_MASK ((1 << REL_X) | (1 << REL_Y)) +#define ABS_XY_MASK ((1 << ABS_X) | (1 << ABS_Y)) +#define MAX_TOUCH_POINTS 5 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /*Device*/ + int fd; + dev_t st_dev; + ino_t st_ino; + lv_evdev_type_t type; + /*Config*/ + bool swap_axes; + int min_x; + int min_y; + int max_x; + int max_y; + /*State*/ + int root_x; + int root_y; + int key; + lv_indev_state_t state; + bool deleting; + /* Multi-touch support */ +#if LV_USE_GESTURE_RECOGNITION + lv_indev_touch_data_t touch_data[MAX_TOUCH_POINTS]; /* Array of touch points for gesture recognition */ + uint8_t touch_count; /* Number of valid touch points */ + uint8_t current_slot; /* Current touch point slot */ + bool touch_data_changed; /* Flag to indicate if touch data has changed since last SYN_REPORT */ +#endif +} lv_evdev_t; + +#ifndef BSD +struct _lv_evdev_discovery_t { + lv_evdev_discovery_cb_t cb; + void * cb_user_data; + int inotify_fd; + bool inotify_watch_active; + lv_timer_t * timer; +}; +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int _evdev_process_key(uint16_t code) +{ + switch(code) { + case KEY_UP: + return LV_KEY_UP; + case KEY_DOWN: + return LV_KEY_DOWN; + case KEY_RIGHT: + return LV_KEY_RIGHT; + case KEY_LEFT: + return LV_KEY_LEFT; + case KEY_ESC: + return LV_KEY_ESC; + case KEY_DELETE: + return LV_KEY_DEL; + case KEY_BACKSPACE: + return LV_KEY_BACKSPACE; + case KEY_ENTER: + return LV_KEY_ENTER; + case KEY_NEXT: + case KEY_TAB: + return LV_KEY_NEXT; + case KEY_PREVIOUS: + return LV_KEY_PREV; + case KEY_HOME: + return LV_KEY_HOME; + case KEY_END: + return LV_KEY_END; + default: + return 0; + } +} + +static int _evdev_calibrate(int v, int in_min, int in_max, int out_min, int out_max) +{ + if(in_min != in_max) v = (v - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + return LV_CLAMP(out_min, v, out_max); +} + +static lv_point_t _evdev_process_pointer(lv_indev_t * indev, int x, int y) +{ + lv_display_t * disp = lv_indev_get_display(indev); + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + + int swapped_x = dsc->swap_axes ? y : x; + int swapped_y = dsc->swap_axes ? x : y; + + int offset_x = disp->offset_x; + int offset_y = disp->offset_y; + int width = disp->hor_res; + int height = disp->ver_res; + + lv_point_t p; + p.x = _evdev_calibrate(swapped_x, dsc->min_x, dsc->max_x, offset_x, offset_x + width - 1); + p.y = _evdev_calibrate(swapped_y, dsc->min_y, dsc->max_y, offset_y, offset_y + height - 1); + return p; +} + +static void _evdev_async_delete_cb(void * user_data) +{ + lv_indev_t * indev = user_data; + lv_indev_delete(indev); +} + +static void _evdev_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + + /*Update dsc with buffered events*/ + struct input_event in = { 0 }; + ssize_t br; + while((br = read(dsc->fd, &in, sizeof(in))) > 0) { + if(in.type == EV_REL) { + if(in.code == REL_X) dsc->root_x += in.value; + else if(in.code == REL_Y) dsc->root_y += in.value; + } + else if(in.type == EV_ABS) { +#if LV_USE_GESTURE_RECOGNITION + if(in.code == ABS_MT_SLOT) { + if(in.value >= MAX_TOUCH_POINTS) { + dsc->current_slot = MAX_TOUCH_POINTS - 1; + dsc->touch_count = MAX_TOUCH_POINTS; + LV_LOG_WARN("Touch point slot out of range, setting to max: %d", MAX_TOUCH_POINTS - 1); + } + else { + dsc->current_slot = in.value; + dsc->touch_count = LV_MAX(dsc->touch_count, dsc->current_slot + 1); + LV_LOG_TRACE("Slot changed to %d, touch_count=%d", dsc->current_slot, dsc->touch_count); + } + } + else +#endif + if(in.code == ABS_X || in.code == ABS_MT_POSITION_X) { + dsc->root_x = in.value; +#if LV_USE_GESTURE_RECOGNITION + if(in.code == ABS_MT_POSITION_X && dsc->current_slot < MAX_TOUCH_POINTS) { + dsc->touch_data[dsc->current_slot].point.x = in.value; + dsc->touch_data_changed = true; + LV_LOG_TRACE("MT_X update: slot=%d, x=%d", dsc->current_slot, in.value); + } +#endif + } + else if(in.code == ABS_Y || in.code == ABS_MT_POSITION_Y) { + dsc->root_y = in.value; +#if LV_USE_GESTURE_RECOGNITION + if(in.code == ABS_MT_POSITION_Y && dsc->current_slot < MAX_TOUCH_POINTS) { + dsc->touch_data[dsc->current_slot].point.y = in.value; + dsc->touch_data_changed = true; + LV_LOG_TRACE("MT_Y update: slot=%d, y=%d", dsc->current_slot, in.value); + } +#endif + } + else if(in.code == ABS_MT_TRACKING_ID) { + if(in.value == -1) dsc->state = LV_INDEV_STATE_RELEASED; + else dsc->state = LV_INDEV_STATE_PRESSED; +#if LV_USE_GESTURE_RECOGNITION + if(in.value == -1) { + if(dsc->current_slot < MAX_TOUCH_POINTS) { + dsc->touch_data[dsc->current_slot].state = LV_INDEV_STATE_RELEASED; + dsc->touch_data_changed = true; + LV_LOG_TRACE("Touch slot %d released", dsc->current_slot); + + dsc->touch_count = 0; + for(int i = 0; i < MAX_TOUCH_POINTS; i++) { + if(dsc->touch_data[i].state == LV_INDEV_STATE_PRESSED) { + dsc->touch_count = i + 1; + } + } + } + } + else { + if(dsc->current_slot < MAX_TOUCH_POINTS) { + dsc->touch_data[dsc->current_slot].state = LV_INDEV_STATE_PRESSED; + dsc->touch_data[dsc->current_slot].id = dsc->current_slot; + dsc->touch_count = LV_MAX(dsc->touch_count, dsc->current_slot + 1); + dsc->touch_data_changed = true; + LV_LOG_TRACE("Touch slot %d pressed, touch_count=%d", dsc->current_slot, dsc->touch_count); + } + } +#endif + } + } + else if(in.type == EV_KEY) { + if(in.code == BTN_MOUSE || in.code == BTN_TOUCH) { + if(in.value == 0) dsc->state = LV_INDEV_STATE_RELEASED; + else if(in.value == 1) dsc->state = LV_INDEV_STATE_PRESSED; + } + else { + dsc->key = _evdev_process_key(in.code); + if(dsc->key) { + dsc->state = in.value ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->continue_reading = true; /*Keep following events in buffer for now*/ + break; + } + } + } +#if LV_USE_GESTURE_RECOGNITION + else if(in.type == EV_SYN && in.code == SYN_REPORT) { + /* Handle gesture recognition at sync event */ + if(dsc->touch_count > 0 && dsc->touch_data_changed) { + LV_LOG_TRACE("=== SYN_REPORT: touch_count=%d ===", dsc->touch_count); + for(int i = 0; i < MAX_TOUCH_POINTS; i++) { + if(dsc->touch_data[i].state == LV_INDEV_STATE_PRESSED || dsc->touch_data[i].state == LV_INDEV_STATE_RELEASED) { + LV_LOG_TRACE("Slot %d: state=%s, raw(%d, %d)", + i, + dsc->touch_data[i].state == LV_INDEV_STATE_PRESSED ? "PRESSED" : "RELEASED", + dsc->touch_data[i].point.x, dsc->touch_data[i].point.y); + } + } + + /* Create a temporary array with calibrated coordinates for gesture recognition */ + lv_indev_touch_data_t calibrated_touch_data[MAX_TOUCH_POINTS]; + + int active_touches = 0; + + for(int i = 0; i < MAX_TOUCH_POINTS; i++) { + if(dsc->touch_data[i].state == LV_INDEV_STATE_PRESSED || dsc->touch_data[i].state == LV_INDEV_STATE_RELEASED) { + calibrated_touch_data[active_touches] = dsc->touch_data[i]; + + lv_point_t calib_point = _evdev_process_pointer(indev, dsc->touch_data[i].point.x, dsc->touch_data[i].point.y); + calibrated_touch_data[active_touches].point = calib_point; + + LV_LOG_TRACE("Touch %d (slot %d): state=%s, raw(%d, %d) -> calib(%d, %d)", + active_touches, i, + dsc->touch_data[i].state == LV_INDEV_STATE_PRESSED ? "PRESSED" : "RELEASED", + dsc->touch_data[i].point.x, dsc->touch_data[i].point.y, + calib_point.x, calib_point.y); + active_touches++; + } + } + + LV_LOG_TRACE("Gesture recognition: %d touches detected", active_touches); + lv_indev_gesture_recognizers_update(indev, calibrated_touch_data, active_touches); + lv_indev_gesture_recognizers_set_data(indev, data); + + /* Clear RELEASED touch points after gesture recognition to prevent duplicate processing */ + for(int i = 0; i < MAX_TOUCH_POINTS; i++) { + if(dsc->touch_data[i].state == LV_INDEV_STATE_RELEASED) { + /* Mark touch point as invalid by zeroing out the data */ + dsc->touch_data[i].point.x = 0; + dsc->touch_data[i].point.y = 0; + dsc->touch_data[i].id = -1; /* Mark as invalid */ + /* Note: We keep the RELEASED state for this frame, it will be naturally + * cleared when new touch events come in or when all touches end */ + LV_LOG_TRACE("Cleared released touch point slot %d", i); + } + } + + dsc->touch_data_changed = false; + } + } +#endif + } + + if(!dsc->deleting && br == -1 && errno != EAGAIN) { + if(errno == ENODEV) { + LV_LOG_INFO("evdev device was removed"); + } + else { + LV_LOG_ERROR("read failed: %s", strerror(errno)); + } + lv_async_call(_evdev_async_delete_cb, indev); + dsc->deleting = true; + } + + /*Process and store in data*/ + switch(lv_indev_get_type(indev)) { + case LV_INDEV_TYPE_KEYPAD: + data->state = dsc->state; + data->key = dsc->key; + break; + case LV_INDEV_TYPE_POINTER: +#if LV_USE_GESTURE_RECOGNITION + if(dsc->touch_count > 0) { + data->state = dsc->touch_data[0].state; + data->point = _evdev_process_pointer(indev, dsc->touch_data[0].point.x, dsc->touch_data[0].point.y); + } + else { + data->state = dsc->state; + data->point = _evdev_process_pointer(indev, dsc->root_x, dsc->root_y); + } +#else + data->state = dsc->state; + data->point = _evdev_process_pointer(indev, dsc->root_x, dsc->root_y); +#endif + break; + default: + break; + } +} + +static void _evdev_indev_delete_cb(lv_event_t * e) +{ + lv_indev_t * indev = lv_event_get_target(e); + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + lv_async_call_cancel(_evdev_async_delete_cb, indev); + close(dsc->fd); + lv_free(dsc); +} + +#ifndef BSD +static void _evdev_discovery_indev_try_create(const char * file_name) +{ + if(0 != lv_strncmp(file_name, "event", 5)) { + return; + } + + char dev_path[EVDEV_DISCOVERY_PATH_BUF_SIZE]; + lv_snprintf(dev_path, sizeof(dev_path), EVDEV_DISCOVERY_PATH "%s", file_name); + + lv_indev_t * indev = lv_evdev_create(LV_INDEV_TYPE_NONE, dev_path); + if(indev == NULL) return; + + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + + /* Compare this new evdev's unique identity with the already registered ones. + * If a match is found, it means the user has already added it and a duplicate + * should not be added automatically -- although it is valid for `lv_evdev_create` + * to be explicitly called with the same path by the user -- or an edge case + * has occurred where discoverey has just been started and a new device was + * connected between the creation of the inotify watcher and the initial full + * scan of the directory with `readdir`. + */ + lv_indev_t * ex_indev = NULL; + while(NULL != (ex_indev = lv_indev_get_next(ex_indev))) { + if(ex_indev == indev || lv_indev_get_read_cb(ex_indev) != _evdev_read) continue; + lv_evdev_t * ex_dsc = lv_indev_get_driver_data(ex_indev); + if(!ex_dsc->deleting && dsc->st_dev == ex_dsc->st_dev && dsc->st_ino == ex_dsc->st_ino) { + /* an indev for this exact device instance already exists */ + lv_indev_delete(indev); + return; + } + } + + lv_evdev_discovery_t * ed = evdev_discovery; + if(ed->cb) { + ed->cb(indev, dsc->type, ed->cb_user_data); + } +} + +static bool _evdev_discovery_inotify_try_init_watcher(int inotify_fd) +{ + int inotify_wd = inotify_add_watch(inotify_fd, EVDEV_DISCOVERY_PATH, IN_CREATE); + if(inotify_wd == -1) { + if(errno != ENOENT) { + LV_LOG_ERROR("inotify_add_watch failed: %s", strerror(errno)); + } + return false; + } + + DIR * dir = opendir(EVDEV_DISCOVERY_PATH); + if(dir == NULL) { + if(errno != ENOENT) { + LV_LOG_ERROR("opendir failed: %s", strerror(errno)); + } + inotify_rm_watch(inotify_fd, inotify_wd); + return false; + } + while(1) { + struct dirent * dirent = readdir(dir); + if(dirent == NULL) break; /* only possible error is EBADF, so no errno check needed */ + _evdev_discovery_indev_try_create(dirent->d_name); + if(evdev_discovery == NULL) { + /* was stopped by the callback. cleanup was already done */ + closedir(dir); + return false; + } + } + closedir(dir); + + return true; +} + +static void _evdev_discovery_timer_cb(lv_timer_t * tim) +{ + LV_UNUSED(tim); + lv_evdev_discovery_t * ed = evdev_discovery; + LV_ASSERT_NULL(ed); + + if(!ed->inotify_watch_active) { + ed->inotify_watch_active = _evdev_discovery_inotify_try_init_watcher(ed->inotify_fd); + return; + } + + union { + struct inotify_event in_ev; + uint8_t buf[sizeof(struct inotify_event) + NAME_MAX + 1]; + } in_data; + ssize_t br; + while((br = read(ed->inotify_fd, &in_data, sizeof(in_data))) > 0) { + struct inotify_event * in_ev_p; + for(uint8_t * in_data_buf_p = in_data.buf; + in_data_buf_p < in_data.buf + br; + in_data_buf_p += sizeof(struct inotify_event) + in_ev_p->len) { + in_ev_p = (struct inotify_event *)in_data_buf_p; + if(in_ev_p->mask & IN_IGNORED) { + /* /dev/input/ was deleted because the last device was removed. + * The watch was removed implicitly. It will try to be + * recreated the next time the timer runs. + */ + ed->inotify_watch_active = false; + return; + } + if(!(in_ev_p->mask & IN_ISDIR) && in_ev_p->len) { + _evdev_discovery_indev_try_create(in_ev_p->name); + if(evdev_discovery == NULL) return; /* was stopped by the callback */ + } + } + } + if(br == -1 && errno != EAGAIN) { + LV_LOG_ERROR("inotify read failed: %s", strerror(errno)); + lv_evdev_discovery_stop(); + } +} +#endif /*BSD*/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_evdev_create_fd(lv_indev_type_t indev_type, int fd) +{ + lv_evdev_t * dsc = lv_malloc_zeroed(sizeof(lv_evdev_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) goto err_malloc; + + dsc->fd = fd; + + struct stat sb; + if(0 != fstat(dsc->fd, &sb)) { + LV_LOG_ERROR("fstat failed: %s", strerror(errno)); + goto err_after_malloc; + } + dsc->st_dev = sb.st_dev; + dsc->st_ino = sb.st_ino; + + if(indev_type == LV_INDEV_TYPE_NONE) { + uint32_t rel_bits = 0; + if(ioctl(dsc->fd, EVIOCGBIT(EV_REL, sizeof(rel_bits)), &rel_bits) >= 0) { + /* if this device can emit relative X and Y events, it shall be a pointer indev */ + if((rel_bits & REL_XY_MASK) == REL_XY_MASK) { + indev_type = LV_INDEV_TYPE_POINTER; + dsc->type = LV_EVDEV_TYPE_REL; + } + } + else { + LV_LOG_WARN("ioctl EVIOCGBIT(EV_REL, ...) failed: %s", strerror(errno)); + } + } + + if(indev_type == LV_INDEV_TYPE_NONE) { + uint32_t abs_bits = 0; + if(ioctl(dsc->fd, EVIOCGBIT(EV_ABS, sizeof(abs_bits)), &abs_bits) >= 0) { + /* if this device can emit absolute X and Y events, it shall be a pointer indev */ + if((abs_bits & ABS_XY_MASK) == ABS_XY_MASK) { + indev_type = LV_INDEV_TYPE_POINTER; + dsc->type = LV_EVDEV_TYPE_ABS; + } + } + else { + LV_LOG_WARN("ioctl EVIOCGBIT(EV_ABS, ...) failed: %s", strerror(errno)); + } + } + + if(indev_type == LV_INDEV_TYPE_NONE) { + uint32_t key_bits[KEY_MAX / 32 + 1] = {0}; + if(ioctl(dsc->fd, EVIOCGBIT(EV_KEY, sizeof(key_bits)), key_bits) >= 0) { + /* if this device can emit any key events, it shall be a keypad indev */ + for(int32_t i = 0; i < (int32_t)(sizeof(key_bits) / sizeof(uint32_t)); i++) { + if(key_bits[i]) { + indev_type = LV_INDEV_TYPE_KEYPAD; + dsc->type = LV_EVDEV_TYPE_KEY; + break; + } + } + } + else { + LV_LOG_WARN("ioctl EVIOCGBIT(EV_KEY, ...) failed: %s", strerror(errno)); + } + } + + if(indev_type == LV_INDEV_TYPE_NONE) { + goto err_after_malloc; + } + + if(fcntl(dsc->fd, F_SETFL, O_NONBLOCK) < 0) { + LV_LOG_ERROR("fcntl failed: %s", strerror(errno)); + goto err_after_malloc; + } + + /* Detect the minimum and maximum values of the input device for calibration. */ + + if(indev_type == LV_INDEV_TYPE_POINTER) { + struct input_absinfo absinfo; + if(ioctl(dsc->fd, EVIOCGABS(ABS_X), &absinfo) == 0) { + dsc->min_x = absinfo.minimum; + dsc->max_x = absinfo.maximum; + } + else { + LV_LOG_INFO("ioctl EVIOCGABS(ABS_X) failed: %s", strerror(errno)); + } + if(ioctl(dsc->fd, EVIOCGABS(ABS_Y), &absinfo) == 0) { + dsc->min_y = absinfo.minimum; + dsc->max_y = absinfo.maximum; + } + else { + LV_LOG_INFO("ioctl EVIOCGABS(ABS_Y) failed: %s", strerror(errno)); + } + } + + lv_indev_t * indev = lv_indev_create(); + if(indev == NULL) goto err_after_malloc; + lv_indev_set_type(indev, indev_type); + lv_indev_set_read_cb(indev, _evdev_read); + lv_indev_set_driver_data(indev, dsc); + lv_indev_add_event_cb(indev, _evdev_indev_delete_cb, LV_EVENT_DELETE, NULL); + + return indev; + +err_after_malloc: + lv_free(dsc); +err_malloc: + close(fd); + return NULL; +} + +lv_indev_t * lv_evdev_create(lv_indev_type_t indev_type, const char * dev_path) +{ + int fd = open(dev_path, O_RDONLY | O_NOCTTY | O_CLOEXEC); + if(fd < 0) { + LV_LOG_WARN("open failed: %s", strerror(errno)); + return NULL; + } + + return lv_evdev_create_fd(indev_type, fd); +} + +lv_result_t lv_evdev_discovery_start(lv_evdev_discovery_cb_t cb, void * user_data) +{ +#ifndef BSD + lv_evdev_discovery_t * ed = NULL; + int inotify_fd = -1; + lv_timer_t * timer = NULL; + + ed = lv_malloc_zeroed(sizeof(lv_evdev_discovery_t)); + LV_ASSERT_MALLOC(ed); + if(ed == NULL) return LV_RESULT_INVALID; + evdev_discovery = ed; + + ed->cb = cb; + ed->cb_user_data = user_data; + + inotify_fd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC); + if(inotify_fd == -1) { + LV_LOG_ERROR("inotify_init1 failed: %s", strerror(errno)); + goto err_out; + } + ed->inotify_fd = inotify_fd; + + ed->inotify_watch_active = _evdev_discovery_inotify_try_init_watcher(inotify_fd); + if(evdev_discovery == NULL) return LV_RESULT_OK; /* was stopped by the callback. cleanup was already done */ + + timer = lv_timer_create(_evdev_discovery_timer_cb, LV_DEF_REFR_PERIOD, NULL); + if(timer == NULL) goto err_out; + ed->timer = timer; + + return LV_RESULT_OK; + +err_out: + if(timer != NULL) lv_timer_delete(timer); + if(inotify_fd != -1) close(inotify_fd); + lv_free(ed); + evdev_discovery = NULL; + return LV_RESULT_INVALID; + +#else /*BSD*/ + return LV_RESULT_INVALID; +#endif +} + +lv_result_t lv_evdev_discovery_stop(void) +{ +#ifndef BSD + lv_evdev_discovery_t * ed = evdev_discovery; + if(ed == NULL) return LV_RESULT_INVALID; + + if(ed->timer) lv_timer_delete(ed->timer); + close(ed->inotify_fd); + lv_free(ed); + + evdev_discovery = NULL; + return LV_RESULT_OK; +#else + return LV_RESULT_INVALID; +#endif +} + +void lv_evdev_set_swap_axes(lv_indev_t * indev, bool swap_axes) +{ + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + dsc->swap_axes = swap_axes; +} + +void lv_evdev_set_calibration(lv_indev_t * indev, int min_x, int min_y, int max_x, int max_y) +{ + lv_evdev_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + dsc->min_x = min_x; + dsc->min_y = min_y; + dsc->max_x = max_x; + dsc->max_y = max_y; +} + +void lv_evdev_delete(lv_indev_t * indev) +{ + lv_indev_delete(indev); +} + +void lv_evdev_deinit(void) +{ + lv_evdev_discovery_stop(); +} + +#endif /*LV_USE_EVDEV*/ diff --git a/inc/lvgl/src/drivers/evdev/lv_evdev.h b/inc/lvgl/src/drivers/evdev/lv_evdev.h new file mode 100644 index 0000000..ed00bb1 --- /dev/null +++ b/inc/lvgl/src/drivers/evdev/lv_evdev.h @@ -0,0 +1,106 @@ +/** + * @file lv_evdev.h + * + */ + +#ifndef LV_EVDEV_H +#define LV_EVDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" + +#if LV_USE_EVDEV + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_EVDEV_TYPE_REL, /**< mice */ + LV_EVDEV_TYPE_ABS, /**< touch screens, mousepads */ + LV_EVDEV_TYPE_KEY /**< keyboards, keypads, buttons */ +} lv_evdev_type_t; + +/** + * @param indev the indev created for the newly discovered evdev + * @param type the type of the evdev + * @param user_data a custom parameter + */ +typedef void (*lv_evdev_discovery_cb_t)(lv_indev_t * indev, lv_evdev_type_t type, void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create evdev input device from a given path. + * @param type LV_INDEV_TYPE_POINTER or LV_INDEV_TYPE_KEYPAD + * @param dev_path device path, e.g., /dev/input/event0 + * @return pointer to input device or NULL if opening failed + */ +lv_indev_t * lv_evdev_create(lv_indev_type_t indev_type, const char * dev_path); + +/** + * Create evdev input device, taking ownership of the given file descriptor. + * @param type LV_INDEV_TYPE_POINTER or LV_INDEV_TYPE_KEYPAD + * @param fd file descriptor of the evdev device + * @return pointer to input device or NULL if opening failed + */ +lv_indev_t * lv_evdev_create_fd(lv_indev_type_t indev_type, int fd); + +/** + * Begin automatically creating evdev indevs for all new and existing + * evdev devices found in /dev/input/ + * @param cb function to call when a new evdev indev is discovered, or `NULL` + * @param user_data parameter to pass to the callback + * @return the success or failure status. It will fail if it's + * already running or resources could not be initialized. + */ +lv_result_t lv_evdev_discovery_start(lv_evdev_discovery_cb_t cb, void * user_data); + +/** + * Stop automatically creating evdev indevs. Safe to call from the + * discovery callback. + * @return the success or failure status. It will fail if it's already running. + */ +lv_result_t lv_evdev_discovery_stop(void); + +/** + * Set whether coordinates of pointer device should be swapped. Defaults to + * false. + * @param indev evdev input device + * @param swap_axes whether to swap x and y axes + */ +void lv_evdev_set_swap_axes(lv_indev_t * indev, bool swap_axes); + +/** + * Configure a coordinate transformation for pointer devices. Applied after + * axis swap, if any. Defaults to apply no transformation. + * @param indev evdev input device + * @param min_x pointer coordinate mapped to min x of display + * @param min_y pointer coordinate mapped to min y of display + * @param max_x pointer coordinate mapped to max x of display + * @param max_y pointer coordinate mapped to max y of display + */ +void lv_evdev_set_calibration(lv_indev_t * indev, int min_x, int min_y, int max_x, int max_y); + +/** + * Remove evdev input device. + * @param indev evdev input device to close and free + */ +void lv_evdev_delete(lv_indev_t * indev); + +#endif /*LV_USE_EVDEV*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_EVDEV_H*/ diff --git a/inc/lvgl/src/drivers/evdev/lv_evdev_private.h b/inc/lvgl/src/drivers/evdev/lv_evdev_private.h new file mode 100644 index 0000000..d9b3352 --- /dev/null +++ b/inc/lvgl/src/drivers/evdev/lv_evdev_private.h @@ -0,0 +1,45 @@ +/** + * @file lv_evdev_private.h + * + */ + +#ifndef LV_EVDEV_PRIVATE_H +#define LV_EVDEV_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_evdev.h" + +#if LV_USE_EVDEV + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_evdev_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_EVDEV*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_EVDEV_PRIVATE_H*/ diff --git a/inc/lvgl/src/drivers/libinput/lv_libinput.c b/inc/lvgl/src/drivers/libinput/lv_libinput.c new file mode 100644 index 0000000..50b1bd6 --- /dev/null +++ b/inc/lvgl/src/drivers/libinput/lv_libinput.c @@ -0,0 +1,675 @@ +/** + * @file lv_libinput.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev_private.h" +#include "lv_libinput_private.h" + +#if LV_USE_LIBINPUT + +#include "../../display/lv_display_private.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if LV_LIBINPUT_BSD + #include +#else + #include +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_libinput_device { + lv_libinput_capability capabilities; + char * path; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool _rescan_devices(void); +static bool _add_scanned_device(char * path, lv_libinput_capability capabilities); +static void _reset_scanned_devices(void); + +static void * _poll_thread(void * data); + +lv_libinput_event_t * _get_event(lv_libinput_t * state); +bool _event_pending(lv_libinput_t * state); +lv_libinput_event_t * _create_event(lv_libinput_t * state); + +static void _read(lv_indev_t * indev, lv_indev_data_t * data); +static void _read_pointer(lv_libinput_t * state, struct libinput_event * event); +static void _read_keypad(lv_libinput_t * state, struct libinput_event * event); + +static int _open_restricted(const char * path, int flags, void * user_data); +static void _close_restricted(int fd, void * user_data); + +static void _delete(lv_libinput_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +static struct _lv_libinput_device * devices = NULL; +static size_t num_devices = 0; + +static const int timeout = 100; // ms +static const nfds_t nfds = 1; + +static const struct libinput_interface interface = { + .open_restricted = _open_restricted, + .close_restricted = _close_restricted, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_libinput_capability lv_libinput_query_capability(struct libinput_device * device) +{ + lv_libinput_capability capability = LV_LIBINPUT_CAPABILITY_NONE; + if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD) + && (libinput_device_keyboard_has_key(device, KEY_ENTER) || libinput_device_keyboard_has_key(device, KEY_KPENTER))) { + capability |= LV_LIBINPUT_CAPABILITY_KEYBOARD; + } + if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) { + capability |= LV_LIBINPUT_CAPABILITY_POINTER; + } + if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) { + capability |= LV_LIBINPUT_CAPABILITY_TOUCH; + } + return capability; +} + +char * lv_libinput_find_dev(lv_libinput_capability capabilities, bool force_rescan) +{ + char * path = NULL; + lv_libinput_find_devs(capabilities, &path, 1, force_rescan); + return path; +} + +size_t lv_libinput_find_devs(lv_libinput_capability capabilities, char ** found, size_t count, bool force_rescan) +{ + if((!devices || force_rescan) && !_rescan_devices()) { + return 0; + } + + size_t num_found = 0; + + for(size_t i = 0; i < num_devices && num_found < count; ++i) { + if(devices[i].capabilities & capabilities) { + found[num_found] = devices[i].path; + num_found++; + } + } + + return num_found; +} + +lv_indev_t * lv_libinput_create(lv_indev_type_t indev_type, const char * dev_path) +{ + lv_libinput_t * dsc = lv_malloc_zeroed(sizeof(lv_libinput_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + dsc->libinput_context = libinput_path_create_context(&interface, NULL); + if(!dsc->libinput_context) { + LV_LOG_ERROR("libinput_path_create_context failed: %s", strerror(errno)); + _delete(dsc); + return NULL; + } + + dsc->libinput_device = libinput_path_add_device(dsc->libinput_context, dev_path); + if(!dsc->libinput_device) { + _delete(dsc); + return NULL; + } + + dsc->libinput_device = libinput_device_ref(dsc->libinput_device); + if(!dsc->libinput_device) { + _delete(dsc); + return NULL; + } + + dsc->fd = libinput_get_fd(dsc->libinput_context); + + /* Prepare poll */ + dsc->fds[0].fd = dsc->fd; + dsc->fds[0].events = POLLIN; + dsc->fds[0].revents = 0; + +#if LV_LIBINPUT_XKB + struct xkb_rule_names names = LV_LIBINPUT_XKB_KEY_MAP; + lv_xkb_init(&(dsc->xkb), names); +#endif /* LV_LIBINPUT_XKB */ + + /* Create indev */ + lv_indev_t * indev = lv_indev_create(); + if(!indev) { + _delete(dsc); + return NULL; + } + lv_indev_set_type(indev, indev_type); + lv_indev_set_read_cb(indev, _read); + lv_indev_set_driver_data(indev, dsc); + + /* Set up thread & lock */ + pthread_mutex_init(&dsc->event_lock, NULL); + pthread_create(&dsc->worker_thread, NULL, _poll_thread, dsc); + + return indev; +} + +void lv_libinput_delete(lv_indev_t * indev) +{ + _delete(lv_indev_get_driver_data(indev)); + lv_indev_delete(indev); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * rescan all attached evdev devices and store capable ones into the static devices array for quick later filtering + * @return true if the operation succeeded + */ +static bool _rescan_devices(void) +{ + _reset_scanned_devices(); + + DIR * dir; + struct dirent * ent; + if(!(dir = opendir("/dev/input"))) { + perror("unable to open directory /dev/input"); + return false; + } + + struct libinput * context = libinput_path_create_context(&interface, NULL); + + while((ent = readdir(dir))) { + if(strncmp(ent->d_name, "event", 5) != 0) { + continue; + } + + /* 11 characters for /dev/input/ + length of name + 1 NUL terminator */ + char * path = malloc((11 + strlen(ent->d_name) + 1) * sizeof(char)); + if(!path) { + perror("could not allocate memory for device node path"); + libinput_unref(context); + _reset_scanned_devices(); + return false; + } + strcpy(path, "/dev/input/"); + strcat(path, ent->d_name); + + struct libinput_device * device = libinput_path_add_device(context, path); + if(!device) { + perror("unable to add device to libinput context"); + free(path); + continue; + } + + /* The device pointer is guaranteed to be valid until the next libinput_dispatch. Since we're not dispatching events + * as part of this function, we don't have to increase its reference count to keep it alive. + * https://wayland.freedesktop.org/libinput/doc/latest/api/group__base.html#gaa797496f0150b482a4e01376bd33a47b */ + + lv_libinput_capability capabilities = lv_libinput_query_capability(device); + + libinput_path_remove_device(device); + + if(capabilities == LV_LIBINPUT_CAPABILITY_NONE) { + free(path); + continue; + } + + if(!_add_scanned_device(path, capabilities)) { + free(path); + libinput_unref(context); + _reset_scanned_devices(); + return false; + } + } + + libinput_unref(context); + return true; +} + +/** + * add a new scanned device to the static devices array, growing its size when necessary + * @param path device file path + * @param capabilities device input capabilities + * @return true if the operation succeeded + */ +static bool _add_scanned_device(char * path, lv_libinput_capability capabilities) +{ + /* Double array size every 2^n elements */ + if((num_devices & (num_devices + 1)) == 0) { + struct _lv_libinput_device * tmp = realloc(devices, (2 * num_devices + 1) * sizeof(struct _lv_libinput_device)); + if(!tmp) { + perror("could not reallocate memory for devices array"); + return false; + } + devices = tmp; + } + + devices[num_devices].path = path; + devices[num_devices].capabilities = capabilities; + num_devices++; + + return true; +} + +/** + * reset the array of scanned devices and free any dynamically allocated memory + */ +static void _reset_scanned_devices(void) +{ + if(!devices) { + return; + } + + for(size_t i = 0; i < num_devices; ++i) { + free(devices[i].path); + } + free(devices); + + devices = NULL; + num_devices = 0; +} + +static void * _poll_thread(void * data) +{ + lv_libinput_t * dsc = (lv_libinput_t *)data; + struct libinput_event * event; + int rc = 0; + + LV_LOG_INFO("libinput: poll worker started"); + + while(true) { + rc = poll(dsc->fds, nfds, timeout); + switch(rc) { + case -1: + perror(NULL); + __attribute__((fallthrough)); + case 0: + if(dsc->deinit) { + dsc->deinit = false; /* Signal that we're done */ + return NULL; + } + continue; + default: + break; + } + libinput_dispatch(dsc->libinput_context); + pthread_mutex_lock(&dsc->event_lock); + while((event = libinput_get_event(dsc->libinput_context)) != NULL) { + _read_pointer(dsc, event); + _read_keypad(dsc, event); + libinput_event_destroy(event); + } + pthread_mutex_unlock(&dsc->event_lock); + LV_LOG_INFO("libinput: event read"); + } + + return NULL; +} + +lv_libinput_event_t * _get_event(lv_libinput_t * dsc) +{ + if(dsc->start == dsc->end) { + return NULL; + } + + lv_libinput_event_t * evt = &dsc->points[dsc->start]; + + if(++dsc->start == LV_LIBINPUT_MAX_EVENTS) + dsc->start = 0; + + return evt; +} + +bool _event_pending(lv_libinput_t * dsc) +{ + return dsc->start != dsc->end; +} + +lv_libinput_event_t * _create_event(lv_libinput_t * dsc) +{ + lv_libinput_event_t * evt = &dsc->points[dsc->end]; + + if(++dsc->end == LV_LIBINPUT_MAX_EVENTS) + dsc->end = 0; + + /* We have overflowed the buffer, start overwriting + * old events. + */ + if(dsc->end == dsc->start) { + LV_LOG_INFO("libinput: overflowed event buffer!"); + if(++dsc->start == LV_LIBINPUT_MAX_EVENTS) + dsc->start = 0; + } + + memset(evt, 0, sizeof(lv_libinput_event_t)); + + return evt; +} + +static void _read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_libinput_t * dsc = lv_indev_get_driver_data(indev); + LV_ASSERT_NULL(dsc); + + pthread_mutex_lock(&dsc->event_lock); + + lv_libinput_event_t * evt = _get_event(dsc); + + if(!evt) + evt = &dsc->last_event; /* indev expects us to report the most recent state */ + + data->point = evt->point; + data->state = evt->pressed; + data->key = evt->key_val; + data->continue_reading = _event_pending(dsc); + + dsc->last_event = *evt; /* Remember the last event for the next call */ + + pthread_mutex_unlock(&dsc->event_lock); + + if(evt) + LV_LOG_TRACE("libinput_read: (%04d, %04d): %d continue_reading? %d", data->point.x, data->point.y, data->state, + data->continue_reading); +} + +static void _read_pointer(lv_libinput_t * dsc, struct libinput_event * event) +{ + struct libinput_event_touch * touch_event = NULL; + struct libinput_event_pointer * pointer_event = NULL; + lv_libinput_event_t * evt = NULL; + enum libinput_event_type type = libinput_event_get_type(event); + int slot = 0; + + switch(type) { + case LIBINPUT_EVENT_TOUCH_MOTION: + case LIBINPUT_EVENT_TOUCH_DOWN: + case LIBINPUT_EVENT_TOUCH_UP: + touch_event = libinput_event_get_touch_event(event); + break; + case LIBINPUT_EVENT_POINTER_MOTION: + case LIBINPUT_EVENT_POINTER_BUTTON: + case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: + pointer_event = libinput_event_get_pointer_event(event); + break; + default: + return; /* We don't care about this events */ + } + + /* We need to read unrotated display dimensions directly from the driver because libinput won't account + * for any rotation inside of LVGL */ + lv_display_t * disp = lv_display_get_default(); + + /* ignore more than 2 fingers as it will only confuse LVGL */ + if(touch_event && (slot = libinput_event_touch_get_slot(touch_event)) > 1) + return; + + evt = _create_event(dsc); + + const int32_t hor_res = disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res; + const int32_t ver_res = disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res; + + switch(type) { + case LIBINPUT_EVENT_TOUCH_MOTION: + case LIBINPUT_EVENT_TOUCH_DOWN: { + lv_point_t point; + point.x = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_touch_get_x_transformed(touch_event, hor_res) - disp->offset_x, + INT32_MAX); + point.y = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_touch_get_y_transformed(touch_event, ver_res) - disp->offset_y, + INT32_MAX); + if(point.x < 0 || point.x > disp->hor_res || point.y < 0 || point.y > disp->ver_res) { + break; /* ignore touches that are out of bounds */ + } + evt->point = point; + evt->pressed = LV_INDEV_STATE_PRESSED; + dsc->slots[slot].point = evt->point; + dsc->slots[slot].pressed = evt->pressed; + break; + } + case LIBINPUT_EVENT_TOUCH_UP: + /* + * We don't support "multitouch", but libinput does. To make fast typing with two thumbs + * on a keyboard feel good, it's necessary to handle two fingers individually. The edge + * case here is if you press a key with one finger and then press a second key with another + * finger. No matter which finger you release, it will count as the second finger releasing + * and ignore the first because LVGL only stores a single (the latest) pressed state. + * + * To work around this, we detect the case where one finger is released while the other is + * still pressed and insert dummy events so that both release events trigger at the correct + * position. + */ + if(slot == 0 && dsc->slots[1].pressed == LV_INDEV_STATE_PRESSED) { + /* The first finger is released while the second finger is still pressed. + * We turn P1 > P2 > R1 > R2 into P1 > P2 > (P1) > R1 > (P2) > R2. + */ + + /* Inject the dummy press event for the first finger */ + lv_libinput_event_t * synth_evt = evt; + synth_evt->pressed = LV_INDEV_STATE_PRESSED; + synth_evt->point = dsc->slots[0].point; + + /* Append the real release event for the first finger */ + evt = _create_event(dsc); + evt->pressed = LV_INDEV_STATE_RELEASED; + evt->point = dsc->slots[0].point; + + /* Inject the dummy press event for the second finger */ + synth_evt = _create_event(dsc); + synth_evt->pressed = LV_INDEV_STATE_PRESSED; + synth_evt->point = dsc->slots[1].point; + } + else if(slot == 1 && dsc->slots[0].pressed == LV_INDEV_STATE_PRESSED) { + /* The second finger is released while the first finger is still pressed. + * We turn P1 > P2 > R2 > R1 into P1 > P2 > R2 > (P1) > R1. + */ + + /* Append the real release event for the second finger */ + evt->pressed = LV_INDEV_STATE_RELEASED; + evt->point = dsc->slots[1].point; + + /* Inject the dummy press event for the first finger */ + lv_libinput_event_t * synth_evt = _create_event(dsc); + synth_evt->pressed = LV_INDEV_STATE_PRESSED; + synth_evt->point = dsc->slots[0].point; + } + else { + evt->pressed = LV_INDEV_STATE_RELEASED; + evt->point = dsc->slots[slot].point; + } + + dsc->slots[slot].pressed = evt->pressed; + break; + case LIBINPUT_EVENT_POINTER_MOTION: + dsc->pointer_position.x = (int32_t)LV_CLAMP(0, dsc->pointer_position.x + libinput_event_pointer_get_dx(pointer_event), + disp->hor_res - 1); + dsc->pointer_position.y = (int32_t)LV_CLAMP(0, dsc->pointer_position.y + libinput_event_pointer_get_dy(pointer_event), + disp->ver_res - 1); + evt->point.x = dsc->pointer_position.x; + evt->point.y = dsc->pointer_position.y; + evt->pressed = dsc->pointer_button_down; + break; + case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: { + lv_point_t point; + point.x = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_pointer_get_absolute_x_transformed(pointer_event, + hor_res) - disp->offset_x, INT32_MAX); + point.y = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_pointer_get_absolute_y_transformed(pointer_event, + ver_res) - disp->offset_y, INT32_MAX); + if(point.x < 0 || point.x > disp->hor_res || point.y < 0 || point.y > disp->ver_res) { + break; /* ignore pointer events that are out of bounds */ + } + evt->point = point; + evt->pressed = dsc->pointer_button_down; + break; + } + case LIBINPUT_EVENT_POINTER_BUTTON: { + enum libinput_button_state button_state = libinput_event_pointer_get_button_state(pointer_event); + dsc->pointer_button_down = button_state == LIBINPUT_BUTTON_STATE_RELEASED ? LV_INDEV_STATE_RELEASED : + LV_INDEV_STATE_PRESSED; + evt->point.x = dsc->pointer_position.x; + evt->point.y = dsc->pointer_position.y; + evt->pressed = dsc->pointer_button_down; + } + default: + break; + } +} + +static void _read_keypad(lv_libinput_t * dsc, struct libinput_event * event) +{ + struct libinput_event_keyboard * keyboard_event = NULL; + enum libinput_event_type type = libinput_event_get_type(event); + lv_libinput_event_t * evt = NULL; + switch(type) { + case LIBINPUT_EVENT_KEYBOARD_KEY: + evt = _create_event(dsc); + keyboard_event = libinput_event_get_keyboard_event(event); + enum libinput_key_state key_state = libinput_event_keyboard_get_key_state(keyboard_event); + uint32_t code = libinput_event_keyboard_get_key(keyboard_event); +#if LV_LIBINPUT_XKB + evt->key_val = lv_xkb_process_key(&(dsc->xkb), code, key_state == LIBINPUT_KEY_STATE_PRESSED); +#else + switch(code) { + case KEY_BACKSPACE: + evt->key_val = LV_KEY_BACKSPACE; + break; + case KEY_ENTER: + evt->key_val = LV_KEY_ENTER; + break; + case KEY_PREVIOUS: + evt->key_val = LV_KEY_PREV; + break; + case KEY_NEXT: + evt->key_val = LV_KEY_NEXT; + break; + case KEY_UP: + evt->key_val = LV_KEY_UP; + break; + case KEY_LEFT: + evt->key_val = LV_KEY_LEFT; + break; + case KEY_RIGHT: + evt->key_val = LV_KEY_RIGHT; + break; + case KEY_DOWN: + evt->key_val = LV_KEY_DOWN; + break; + case KEY_TAB: + evt->key_val = LV_KEY_NEXT; + break; + case KEY_HOME: + evt->key_val = LV_KEY_HOME; + break; + case KEY_END: + evt->key_val = LV_KEY_END; + break; + case KEY_ESC: + evt->key_val = LV_KEY_ESC; + break; + default: + evt->key_val = 0; + break; + } +#endif /* LV_LIBINPUT_XKB */ + if(evt->key_val != 0) { + /* Only record button state when actual output is produced to prevent widgets from refreshing */ + evt->pressed = (key_state == LIBINPUT_KEY_STATE_RELEASED) ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED; + + // just release the key immediately after it got pressed. + // but don't handle special keys where holding a key makes sense + if(evt->key_val != LV_KEY_BACKSPACE && + evt->key_val != LV_KEY_UP && + evt->key_val != LV_KEY_LEFT && + evt->key_val != LV_KEY_RIGHT && + evt->key_val != LV_KEY_DOWN && + key_state == LIBINPUT_KEY_STATE_PRESSED) { + lv_libinput_event_t * release_evt = _create_event(dsc); + release_evt->pressed = LV_INDEV_STATE_RELEASED; + release_evt->key_val = evt->key_val; + } + } + break; + default: + break; + } +} + +static int _open_restricted(const char * path, int flags, void * user_data) +{ + LV_UNUSED(user_data); + int fd = open(path, flags); + return fd < 0 ? -errno : fd; +} + +static void _close_restricted(int fd, void * user_data) +{ + LV_UNUSED(user_data); + close(fd); +} + +static void _delete(lv_libinput_t * dsc) +{ + if(dsc->fd) + dsc->deinit = true; + + /* Give worker thread a whole second to quit */ + for(int i = 0; i < 100; i++) { + if(!dsc->deinit) + break; + usleep(10000); + } + + if(dsc->deinit) { + LV_LOG_ERROR("libinput worker thread did not quit in time, cancelling it"); + pthread_cancel(dsc->worker_thread); + } + + if(dsc->libinput_device) { + libinput_path_remove_device(dsc->libinput_device); + libinput_device_unref(dsc->libinput_device); + } + + if(dsc->libinput_context) { + libinput_unref(dsc->libinput_context); + } + +#if LV_LIBINPUT_XKB + lv_xkb_deinit(&(dsc->xkb)); +#endif /* LV_LIBINPUT_XKB */ + + lv_free(dsc); +} + +#endif /* LV_USE_LIBINPUT */ diff --git a/inc/lvgl/src/drivers/libinput/lv_libinput.h b/inc/lvgl/src/drivers/libinput/lv_libinput.h new file mode 100644 index 0000000..ce19a33 --- /dev/null +++ b/inc/lvgl/src/drivers/libinput/lv_libinput.h @@ -0,0 +1,101 @@ +/** + * @file lv_libinput.h + * + */ + +#ifndef LV_LIBINPUT_H +#define LV_LIBINPUT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" + +#if LV_USE_LIBINPUT + +#include +#include + +#if LV_LIBINPUT_XKB +#include "lv_xkb.h" +#endif /* LV_LIBINPUT_XKB */ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_LIBINPUT_CAPABILITY_NONE = 0, + LV_LIBINPUT_CAPABILITY_KEYBOARD = 1U << 0, + LV_LIBINPUT_CAPABILITY_POINTER = 1U << 1, + LV_LIBINPUT_CAPABILITY_TOUCH = 1U << 2 +} lv_libinput_capability; + +struct libinput_device; + +#define LV_LIBINPUT_MAX_EVENTS 32 + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Determine the capabilities of a specific libinput device. + * @param device the libinput device to query + * @return the supported input capabilities + */ +lv_libinput_capability lv_libinput_query_capability(struct libinput_device * device); + +/** + * Find connected input device with specific capabilities + * @param capabilities required device capabilities + * @param force_rescan erase the device cache (if any) and rescan the file system for available devices + * @return device node path (e.g. /dev/input/event0) for the first matching device or NULL if no device was found. + * The pointer is safe to use until the next forceful device search. + */ +char * lv_libinput_find_dev(lv_libinput_capability capabilities, bool force_rescan); + +/** + * Find connected input devices with specific capabilities + * @param capabilities required device capabilities + * @param devices pre-allocated array to store the found device node paths (e.g. /dev/input/event0). The pointers are + * safe to use until the next forceful device search. + * @param count maximum number of devices to find (the devices array should be at least this long) + * @param force_rescan erase the device cache (if any) and rescan the file system for available devices + * @return number of devices that were found + */ +size_t lv_libinput_find_devs(lv_libinput_capability capabilities, char ** found, size_t count, bool force_rescan); + +/** + * Create a new libinput input device + * @param type LV_INDEV_TYPE_POINTER or LV_INDEV_TYPE_KEYPAD + * @param dev_path device path, e.g. /dev/input/event0 + * @return pointer to input device or NULL if opening failed + */ +lv_indev_t * lv_libinput_create(lv_indev_type_t indev_type, const char * dev_path); + +/** + * Delete a libinput input device + * @param indev pointer to input device + */ +void lv_libinput_delete(lv_indev_t * indev); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LIBINPUT */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_LIBINPUT_H */ diff --git a/inc/lvgl/src/drivers/libinput/lv_libinput_private.h b/inc/lvgl/src/drivers/libinput/lv_libinput_private.h new file mode 100644 index 0000000..2856bbe --- /dev/null +++ b/inc/lvgl/src/drivers/libinput/lv_libinput_private.h @@ -0,0 +1,83 @@ +/** + * @file lv_libinput_private.h + * + */ + +#ifndef LV_LIBINPUT_PRIVATE_H +#define LV_LIBINPUT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_libinput.h" + +#if LV_USE_LIBINPUT + +#if LV_LIBINPUT_XKB +#include "lv_xkb_private.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_libinput_event_t { + lv_indev_state_t pressed; + int key_val; + lv_point_t point; +}; + +struct _lv_libinput_t { + int fd; + struct pollfd fds[1]; + + /* The points array is implemented as a circular LIFO queue */ + lv_libinput_event_t points[LV_LIBINPUT_MAX_EVENTS]; /* Event buffer */ + lv_libinput_event_t slots[2]; /* Realtime state of up to 2 fingers to handle multitouch */ + + /* Pointer devices work a bit differently in libinput which requires us to store their last known state */ + lv_point_t pointer_position; + bool pointer_button_down; + + int start; /* Index of start of event queue */ + int end; /* Index of end of queue*/ + lv_libinput_event_t last_event; /* Report when no new events + * to keep indev state consistent + */ + bool deinit; /* Tell worker thread to quit */ + pthread_mutex_t event_lock; + pthread_t worker_thread; + + struct libinput * libinput_context; + struct libinput_device * libinput_device; + +#if LV_LIBINPUT_XKB + lv_xkb_t xkb; +#endif /* LV_LIBINPUT_XKB */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LIBINPUT */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LIBINPUT_PRIVATE_H*/ diff --git a/inc/lvgl/src/drivers/libinput/lv_xkb.c b/inc/lvgl/src/drivers/libinput/lv_xkb.c new file mode 100644 index 0000000..1e8ddb1 --- /dev/null +++ b/inc/lvgl/src/drivers/libinput/lv_xkb.c @@ -0,0 +1,180 @@ +/** + * @file lv_xkb.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_xkb_private.h" + +#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB + +#include "../../core/lv_group.h" +#include "../../misc/lv_log.h" + +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool _set_keymap(lv_xkb_t * dsc, struct xkb_rule_names names); + +/********************** + * STATIC VARIABLES + **********************/ + +static struct xkb_context * context = NULL; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_xkb_init(lv_xkb_t * dsc, struct xkb_rule_names names) +{ + if(!context) { + context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + if(!context) { + LV_LOG_ERROR("xkb_context_new failed: %s", strerror(errno)); + return false; + } + } + + return _set_keymap(dsc, names); +} + +void lv_xkb_deinit(lv_xkb_t * dsc) +{ + if(dsc->state) { + xkb_state_unref(dsc->state); + dsc->state = NULL; + } + + if(dsc->keymap) { + xkb_keymap_unref(dsc->keymap); + dsc->keymap = NULL; + } +} + +uint32_t lv_xkb_process_key(lv_xkb_t * dsc, uint32_t scancode, bool down) +{ + /* Offset the evdev scancode by 8, see https://xkbcommon.org/doc/current/xkbcommon_8h.html#ac29aee92124c08d1953910ab28ee1997 */ + xkb_keycode_t keycode = scancode + 8; + + uint32_t result = 0; + + switch(xkb_state_key_get_one_sym(dsc->state, keycode)) { + case XKB_KEY_BackSpace: + result = LV_KEY_BACKSPACE; + break; + case XKB_KEY_Return: + case XKB_KEY_KP_Enter: + result = LV_KEY_ENTER; + break; + case XKB_KEY_Prior: + case XKB_KEY_KP_Prior: + result = LV_KEY_PREV; + break; + case XKB_KEY_Next: + case XKB_KEY_KP_Next: + result = LV_KEY_NEXT; + break; + case XKB_KEY_Up: + case XKB_KEY_KP_Up: + result = LV_KEY_UP; + break; + case XKB_KEY_Left: + case XKB_KEY_KP_Left: + result = LV_KEY_LEFT; + break; + case XKB_KEY_Right: + case XKB_KEY_KP_Right: + result = LV_KEY_RIGHT; + break; + case XKB_KEY_Down: + case XKB_KEY_KP_Down: + result = LV_KEY_DOWN; + break; + case XKB_KEY_Tab: + case XKB_KEY_KP_Tab: + result = LV_KEY_NEXT; + break; + case XKB_KEY_ISO_Left_Tab: /* Sent on SHIFT + TAB */ + result = LV_KEY_PREV; + break; + case XKB_KEY_Home: + case XKB_KEY_KP_Home: + result = LV_KEY_HOME; + break; + case XKB_KEY_End: + case XKB_KEY_KP_End: + result = LV_KEY_END; + break; + default: + break; + } + + if(result == 0) { + char buffer[4] = { 0, 0, 0, 0 }; + int size = xkb_state_key_get_utf8(dsc->state, keycode, NULL, 0) + 1; + if(size > 1) { + xkb_state_key_get_utf8(dsc->state, keycode, buffer, size); + memcpy(&result, buffer, 4); + } + } + + xkb_state_update_key(dsc->state, keycode, down ? XKB_KEY_DOWN : XKB_KEY_UP); + + return result; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool _set_keymap(lv_xkb_t * dsc, struct xkb_rule_names names) +{ + if(dsc->keymap) { + xkb_keymap_unref(dsc->keymap); + dsc->keymap = NULL; + } + + dsc->keymap = xkb_keymap_new_from_names(context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS); + if(!dsc->keymap) { + LV_LOG_ERROR("xkb_keymap_new_from_names failed: %s", strerror(errno)); + return false; + } + + if(dsc->state) { + xkb_state_unref(dsc->state); + dsc->state = NULL; + } + + dsc->state = xkb_state_new(dsc->keymap); + if(!dsc->state) { + LV_LOG_ERROR("xkb_state_new failed: %s", strerror(errno)); + return false; + } + + return true; +} + +#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */ diff --git a/inc/lvgl/src/drivers/libinput/lv_xkb.h b/inc/lvgl/src/drivers/libinput/lv_xkb.h new file mode 100644 index 0000000..5f45d99 --- /dev/null +++ b/inc/lvgl/src/drivers/libinput/lv_xkb.h @@ -0,0 +1,64 @@ +/** + * @file lv_xkb.h + * + */ + +#ifndef LV_XKB_H +#define LV_XKB_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB + +#include "../../misc/lv_types.h" +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialise an XKB descriptor. + * @return true if the initialisation was successful + */ +bool lv_xkb_init(lv_xkb_t * dsc, struct xkb_rule_names names); + +/** + * De-initialise an XKB descriptor. + * @param dsc Pointer to descriptor + */ +void lv_xkb_deinit(lv_xkb_t * dsc); + +/** + * Process an evdev scancode using a specific XKB descriptor. + * @param state XKB descriptor to use + * @param scancode evdev scancode to process + * @param down true if the key was pressed, false if it was releases + * @return the (first) UTF-8 character produced by the event or 0 if no output was produced + */ +uint32_t lv_xkb_process_key(lv_xkb_t * dsc, uint32_t scancode, bool down); + +/********************** + * MACROS + **********************/ + +#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_XKB_H */ diff --git a/inc/lvgl/src/drivers/libinput/lv_xkb_private.h b/inc/lvgl/src/drivers/libinput/lv_xkb_private.h new file mode 100644 index 0000000..97aad74 --- /dev/null +++ b/inc/lvgl/src/drivers/libinput/lv_xkb_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_xkb_private.h + * + */ + +#ifndef LV_XKB_PRIVATE_H +#define LV_XKB_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_xkb.h" + +#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_xkb_t { + struct xkb_keymap * keymap; + struct xkb_state * state; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_XKB_PRIVATE_H*/ diff --git a/inc/lvgl/src/drivers/lv_drivers.h b/inc/lvgl/src/drivers/lv_drivers.h new file mode 100644 index 0000000..8cc91ce --- /dev/null +++ b/inc/lvgl/src/drivers/lv_drivers.h @@ -0,0 +1,89 @@ +/** + * @file lv_drivers.h + * + */ + +#ifndef LV_DRIVERS_H +#define LV_DRIVERS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "sdl/lv_sdl_window.h" +#include "sdl/lv_sdl_mouse.h" +#include "sdl/lv_sdl_mousewheel.h" +#include "sdl/lv_sdl_keyboard.h" + +#include "x11/lv_x11.h" + +#include "display/drm/lv_linux_drm.h" +#include "display/fb/lv_linux_fbdev.h" + +#include "display/tft_espi/lv_tft_espi.h" +#include "display/lovyan_gfx/lv_lovyan_gfx.h" + +#include "display/lcd/lv_lcd_generic_mipi.h" +#include "display/ili9341/lv_ili9341.h" +#include "display/st7735/lv_st7735.h" +#include "display/st7789/lv_st7789.h" +#include "display/st7796/lv_st7796.h" +#include "display/nv3007/lv_nv3007.h" + +#include "display/renesas_glcdc/lv_renesas_glcdc.h" +#include "display/st_ltdc/lv_st_ltdc.h" +#include "display/ft81x/lv_ft81x.h" + +#include "draw/eve/lv_draw_eve_display.h" +#include "draw/eve/lv_draw_eve_display_defines.h" + +#include "nuttx/lv_nuttx_entry.h" +#include "nuttx/lv_nuttx_fbdev.h" +#include "nuttx/lv_nuttx_touchscreen.h" +#include "nuttx/lv_nuttx_lcd.h" +#include "nuttx/lv_nuttx_libuv.h" + +#include "evdev/lv_evdev.h" +#include "libinput/lv_libinput.h" + +#include "windows/lv_windows_input.h" +#include "windows/lv_windows_display.h" + +#include "opengles/lv_opengles_window.h" +#include "opengles/lv_opengles_texture.h" +#include "opengles/lv_opengles_driver.h" +#include "opengles/lv_opengles_glfw.h" +#include "opengles/lv_opengles_egl.h" + +#include "qnx/lv_qnx.h" + +#include "wayland/lv_wayland.h" + +#include "uefi/lv_uefi_context.h" +#include "uefi/lv_uefi_indev.h" +#include "uefi/lv_uefi_display.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRIVERS_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_cache.c b/inc/lvgl/src/drivers/nuttx/lv_nuttx_cache.c new file mode 100644 index 0000000..9acd1b2 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_cache.c @@ -0,0 +1,120 @@ +/** + * @file lv_nuttx_cache.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_cache.h" +#include "../../../lvgl.h" + +#if LV_USE_NUTTX + +#include "../../draw/lv_draw_buf_private.h" +#include "../../core/lv_global.h" + +#ifdef __NuttX__ + #include +#else + #include "mock/nuttx_cache.h" +#endif + +/********************* + * DEFINES + *********************/ +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) +#define font_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->font_draw_buf_handlers) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); +static void flush_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_nuttx_cache_init(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + handlers->invalidate_cache_cb = invalidate_cache; + handlers->flush_cache_cb = flush_cache; + + handlers = image_cache_draw_buf_handlers; + handlers->invalidate_cache_cb = invalidate_cache; + handlers->flush_cache_cb = flush_cache; + + handlers = font_draw_buf_handlers; + handlers->invalidate_cache_cb = invalidate_cache; + handlers->flush_cache_cb = flush_cache; +} + +void lv_nuttx_cache_deinit(void) +{ + lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers(); + handlers->invalidate_cache_cb = NULL; + handlers->flush_cache_cb = NULL; + + handlers = image_cache_draw_buf_handlers; + handlers->invalidate_cache_cb = NULL; + handlers->flush_cache_cb = NULL; + + handlers = font_draw_buf_handlers; + handlers->invalidate_cache_cb = NULL; + handlers->flush_cache_cb = NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void draw_buf_to_region( + const lv_draw_buf_t * draw_buf, const lv_area_t * area, + lv_uintptr_t * start, lv_uintptr_t * end) +{ + LV_ASSERT_NULL(draw_buf); + LV_ASSERT_NULL(area); + LV_ASSERT_NULL(start); + LV_ASSERT_NULL(end); + + void * buf = draw_buf->data; + uint32_t stride = draw_buf->header.stride; + + int32_t h = lv_area_get_height(area); + *start = (lv_uintptr_t)buf + area->y1 * stride; + *end = *start + h * stride; +} + +static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + lv_uintptr_t start; + lv_uintptr_t end; + draw_buf_to_region(draw_buf, area, &start, &end); + up_invalidate_dcache(start, end); +} + +static void flush_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area) +{ + lv_uintptr_t start; + lv_uintptr_t end; + draw_buf_to_region(draw_buf, area, &start, &end); + up_flush_dcache(start, end); +} + +#endif /* LV_USE_NUTTX */ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_cache.h b/inc/lvgl/src/drivers/nuttx/lv_nuttx_cache.h new file mode 100644 index 0000000..74be6d3 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_cache.h @@ -0,0 +1,41 @@ +/** + * @file lv_nuttx_cache.h + * + */ + +#ifndef LV_NUTTX_CACHE_H +#define LV_NUTTX_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_nuttx_cache_init(void); + +void lv_nuttx_cache_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NUTTX_CACHE_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_entry.c b/inc/lvgl/src/drivers/nuttx/lv_nuttx_entry.c new file mode 100644 index 0000000..f4949ca --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_entry.c @@ -0,0 +1,343 @@ +/** + * @file lv_nuttx_entry.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_nuttx_entry.h" + +#if LV_USE_NUTTX + +#include +#include +#include +#include +#include "lv_nuttx_cache.h" +#include "lv_nuttx_image_cache.h" +#include "../../core/lv_global.h" +#include "lv_nuttx_profiler.h" +#include "lv_nuttx_mouse.h" +#include "../../../lvgl.h" + +#if LV_USE_NUTTX_LIBUV + #include +#endif + +#ifdef __NuttX__ + #include + #include +#else + #include "mock/nuttx_clock.h" +#endif + +/********************* + * DEFINES + *********************/ + +#define nuttx_ctx_p (LV_GLOBAL_DEFAULT()->nuttx_ctx) + +#if (LV_USE_FREETYPE || LV_USE_THORVG) + #define LV_NUTTX_MIN_STACK_SIZE (32 * 1024) +#else + #define LV_NUTTX_MIN_STACK_SIZE (8 * 1024) +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t millis(void); +#if LV_USE_LOG + static void syslog_print(lv_log_level_t level, const char * buf); +#endif +static void check_stack_size(void); + +#if LV_USE_NUTTX_LIBUV + static void lv_nuttx_uv_loop(lv_nuttx_result_t * result); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if LV_ENABLE_GLOBAL_CUSTOM + +static int lv_nuttx_tlskey = -1; + +static void lv_global_free(void * data) +{ + if(data) { + free(data); + } +} + +lv_global_t * lv_global_default(void) +{ + lv_global_t * data = NULL; + + if(lv_nuttx_tlskey < 0) { + lv_nuttx_tlskey = task_tls_alloc(lv_global_free); + } + + if(lv_nuttx_tlskey >= 0) { + data = (lv_global_t *)task_tls_get_value(lv_nuttx_tlskey); + if(data == NULL) { + data = (lv_global_t *)calloc(1, sizeof(lv_global_t)); + task_tls_set_value(lv_nuttx_tlskey, (uintptr_t)data); + } + } + return data; +} +#endif + +void lv_nuttx_dsc_init(lv_nuttx_dsc_t * dsc) +{ + if(dsc == NULL) + return; + + lv_memzero(dsc, sizeof(lv_nuttx_dsc_t)); + dsc->fb_path = "/dev/fb0"; + dsc->input_path = "/dev/input0"; + +#ifdef CONFIG_UINPUT_TOUCH + dsc->utouch_path = "/dev/utouch"; +#endif + +#if LV_USE_NUTTX_MOUSE + dsc->mouse_path = "/dev/mouse0"; +#endif + +#if LV_USE_NUTTX_TRACE_FILE + dsc->trace_path = LV_NUTTX_TRACE_FILE_PATH; +#endif +} + +void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result) +{ + nuttx_ctx_p = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_t)); + LV_ASSERT_MALLOC(nuttx_ctx_p); + +#if LV_USE_LOG + lv_log_register_print_cb(syslog_print); +#endif + lv_tick_set_cb(millis); + + check_stack_size(); + + lv_nuttx_cache_init(); + + lv_nuttx_image_cache_init(LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP); + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + lv_nuttx_profiler_init(); +#if LV_USE_NUTTX_TRACE_FILE + lv_nuttx_profiler_set_file(dsc->trace_path); +#endif +#endif + + if(result) { + lv_memzero(result, sizeof(lv_nuttx_result_t)); + } + +#if !LV_USE_NUTTX_CUSTOM_INIT + + if(dsc && dsc->fb_path) { + lv_display_t * disp = NULL; + +#if LV_USE_NUTTX_LCD + disp = lv_nuttx_lcd_create(dsc->fb_path); +#else + disp = lv_nuttx_fbdev_create(); + if(lv_nuttx_fbdev_set_file(disp, dsc->fb_path) != 0) { + lv_display_delete(disp); + disp = NULL; + } +#endif + if(result) { + result->disp = disp; + } + } + + if(dsc) { +#if LV_USE_NUTTX_TOUCHSCREEN + if(dsc->input_path) { + lv_indev_t * indev = lv_nuttx_touchscreen_create(dsc->input_path); + if(result) { + result->indev = indev; + } + } + + if(dsc->utouch_path) { + lv_indev_t * indev = lv_nuttx_touchscreen_create(dsc->utouch_path); + if(result) { + result->utouch_indev = indev; + } + } +#endif + +#if LV_USE_NUTTX_MOUSE + if(dsc->mouse_path) { + lv_indev_t * indev = lv_nuttx_mouse_create(dsc->mouse_path); + if(result) { + result->mouse_indev = indev; + } + } +#endif + } + +#else + + lv_nuttx_init_custom(dsc, result); +#endif +} + +void lv_nuttx_run(lv_nuttx_result_t * result) +{ +#if LV_USE_NUTTX_LIBUV + lv_nuttx_uv_loop(result); +#else + LV_UNUSED(result); + while(1) { + uint32_t idle; + idle = lv_timer_handler(); + + /* Minimum sleep of 1ms */ + idle = idle ? idle : 1; + /* Handle LV_DEF_REFR_PERIOD */ + idle = idle != LV_NO_TIMER_READY ? idle : LV_DEF_REFR_PERIOD; + usleep(idle * 1000); + } +#endif +} + +#ifdef CONFIG_SCHED_CPULOAD + +uint32_t lv_nuttx_get_idle(void) +{ + struct cpuload_s cpuload; + int ret = clock_cpuload(0, &cpuload); + if(ret < 0) { + LV_LOG_WARN("clock_cpuload failed: %d", ret); + return 0; + } + + uint32_t idle = cpuload.active * 100 / cpuload.total; + LV_LOG_TRACE("active = %" LV_PRIu32 ", total = %" LV_PRIu32, + cpuload.active, cpuload.total); + + return idle; +} + +#endif + +void lv_nuttx_deinit(lv_nuttx_result_t * result) +{ +#if !LV_USE_NUTTX_CUSTOM_INIT + if(result) { + if(result->disp) { + lv_display_delete(result->disp); + result->disp = NULL; + } + + if(result->indev) { + lv_indev_delete(result->indev); + result->indev = NULL; + } + + if(result->utouch_indev) { + lv_indev_delete(result->utouch_indev); + result->utouch_indev = NULL; + } + } +#else + lv_nuttx_deinit_custom(result); +#endif + + if(nuttx_ctx_p) { + lv_nuttx_cache_deinit(); + lv_nuttx_image_cache_deinit(); + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + lv_nuttx_profiler_deinit(); +#endif + lv_free(nuttx_ctx_p); + nuttx_ctx_p = NULL; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t millis(void) +{ + struct timespec ts; + + clock_gettime(CLOCK_MONOTONIC, &ts); + uint32_t tick = ts.tv_sec * 1000 + ts.tv_nsec / 1000000; + + return tick; +} + +#if LV_USE_LOG +static void syslog_print(lv_log_level_t level, const char * buf) +{ + static const int priority[LV_LOG_LEVEL_NUM] = { + LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERR, LOG_CRIT + }; + + syslog(priority[level], "[LVGL] %s", buf); +} +#endif + +#if LV_USE_NUTTX_LIBUV +static void lv_nuttx_uv_loop(lv_nuttx_result_t * result) +{ + uv_loop_t loop; + lv_nuttx_uv_t uv_info; + void * data; + + uv_loop_init(&loop); + + lv_memzero(&uv_info, sizeof(uv_info)); + uv_info.loop = &loop; + uv_info.disp = result->disp; + uv_info.indev = result->indev; +#ifdef CONFIG_UINPUT_TOUCH + uv_info.uindev = result->utouch_indev; +#endif + + data = lv_nuttx_uv_init(&uv_info); + uv_run(&loop, UV_RUN_DEFAULT); + lv_nuttx_uv_deinit(&data); +} +#endif + +static void check_stack_size(void) +{ + pthread_t tid = pthread_self(); + ssize_t stack_size = pthread_get_stacksize_np(tid); + LV_LOG_USER("tid: %d, Stack size : %zd", (int)tid, stack_size); + + if(stack_size < LV_NUTTX_MIN_STACK_SIZE) { + LV_LOG_ERROR("Stack size is too small. Please increase it to %d bytes or more.", + LV_NUTTX_MIN_STACK_SIZE); + } +} + +#endif /*LV_USE_NUTTX*/ + diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_entry.h b/inc/lvgl/src/drivers/nuttx/lv_nuttx_entry.h new file mode 100644 index 0000000..6100b96 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_entry.h @@ -0,0 +1,116 @@ +/** + * @file lv_nuttx_entry.h + * + */ + +/********************* + * INCLUDES + *********************/ + +#ifndef LV_NUTTX_ENTRY_H +#define LV_NUTTX_ENTRY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_NUTTX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + const char * fb_path; + const char * input_path; + const char * utouch_path; + const char * mouse_path; + const char * trace_path; +} lv_nuttx_dsc_t; + +typedef struct { + lv_display_t * disp; + lv_indev_t * indev; + lv_indev_t * utouch_indev; + lv_indev_t * mouse_indev; +} lv_nuttx_result_t; + +typedef struct _lv_nuttx_ctx_t { + void * image_cache; + int trace_fd; +} lv_nuttx_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the lv_nuttx_dsc_t structure with default values for the NuttX port of LVGL. + * @param dsc Pointer to the lv_nuttx_dsc_t structure to be initialized. + */ +void lv_nuttx_dsc_init(lv_nuttx_dsc_t * dsc); + +/** + * Initialize the LVGL display driver for NuttX using the provided configuration information. + * @param dsc Pointer to the lv_nuttx_dsc_t structure containing the configuration information for the display driver. + * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. + */ +void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result); + +/** + * Deinitialize the LVGL display driver for NuttX. + * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. + */ +void lv_nuttx_deinit(lv_nuttx_result_t * result); + +#if LV_USE_NUTTX_CUSTOM_INIT +/** + * Initialize the LVGL display driver for NuttX using the provided custom configuration information. + * @param dsc Pointer to the lv_nuttx_dsc_t structure containing the custom configuration for the display driver. + * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. + */ +void lv_nuttx_init_custom(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result); + +/** + * Deinitialize the LVGL display driver for NuttX using the provided custom configuration information. + * @param result Pointer to the lv_nuttx_result_t structure containing display and input device handler. + */ +void lv_nuttx_deinit_custom(lv_nuttx_result_t * result); +#endif /* LV_USE_NUTTX_CUSTOM_INIT */ + +/** + * Call `lv_timer_handler()` (LVGL's super loop) in an endless loop. + * If LV_USE_NUTTX_LIBUV is enabled an UV timer will be created, + * else `lv_timer_handler()` will be called in a loop with some sleep. + * @param result pointer to a variable initialized by `lv_nuttx_init()` or `lv_nuttx_init_custom()` + */ +void lv_nuttx_run(lv_nuttx_result_t * result); + +/** + * Get the idle percentage of the system. + * @return The idle percentage of the system. + */ +uint32_t lv_nuttx_get_idle(void); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_NUTTX*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_NUTTX_ENTRY_H */ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c b/inc/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c new file mode 100644 index 0000000..4849c52 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c @@ -0,0 +1,502 @@ +/** + * @file lv_nuttx_fbdev.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_nuttx_fbdev.h" +#if LV_USE_NUTTX + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __NuttX__ + #include +#else + #include "mock/nuttx_video_fb.h" +#endif + +#include "../../../lvgl.h" +#include "../../lvgl_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* fd should be defined at the beginning */ + int fd; + struct fb_videoinfo_s vinfo; + struct fb_planeinfo_s pinfo; + + void * mem; + void * mem2; + void * mem3; + void * mem_off_screen; + uint32_t mem2_yoffset; + uint32_t mem3_yoffset; + + lv_draw_buf_t buf1; + lv_draw_buf_t buf2; + lv_draw_buf_t buf3; +} lv_nuttx_fb_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); +static lv_color_format_t fb_fmt_to_color_format(int fmt); +static int fbdev_get_pinfo(int fd, struct fb_planeinfo_s * pinfo); +static int fbdev_init_mem2(lv_nuttx_fb_t * dsc); +static int fbdev_init_mem3(lv_nuttx_fb_t * dsc); +static void display_refr_timer_cb(lv_timer_t * tmr); +static void display_release_cb(lv_event_t * e); +#if defined(CONFIG_FB_UPDATE) + static void fbdev_join_inv_areas(lv_display_t * disp, lv_area_t * final_inv_area); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_nuttx_fbdev_create(void) +{ + lv_nuttx_fb_t * dsc = lv_malloc_zeroed(sizeof(lv_nuttx_fb_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(800, 480); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + dsc->fd = -1; + lv_display_set_driver_data(disp, dsc); + lv_display_add_event_cb(disp, display_release_cb, LV_EVENT_DELETE, disp); + lv_display_set_flush_cb(disp, flush_cb); + return disp; +} + +int lv_nuttx_fbdev_set_file(lv_display_t * disp, const char * file) +{ + int ret; + LV_ASSERT(disp && file); + lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); + + if(dsc->fd >= 0) close(dsc->fd); + + /* Open the file for reading and writing*/ + + dsc->fd = open(file, O_RDWR); + if(dsc->fd < 0) { + LV_LOG_ERROR("Error: cannot open framebuffer device"); + return -errno; + } + LV_LOG_USER("The framebuffer device was opened successfully"); + + if(ioctl(dsc->fd, FBIOGET_VIDEOINFO, (unsigned long)((uintptr_t)&dsc->vinfo)) < 0) { + LV_LOG_ERROR("ioctl(FBIOGET_VIDEOINFO) failed: %d", errno); + ret = -errno; + goto errout; + } + + LV_LOG_USER("VideoInfo:"); + LV_LOG_USER(" fmt: %u", dsc->vinfo.fmt); + LV_LOG_USER(" xres: %u", dsc->vinfo.xres); + LV_LOG_USER(" yres: %u", dsc->vinfo.yres); + LV_LOG_USER(" nplanes: %u", dsc->vinfo.nplanes); + + if((ret = fbdev_get_pinfo(dsc->fd, &dsc->pinfo)) < 0) { + goto errout; + } + + lv_color_format_t color_format = fb_fmt_to_color_format(dsc->vinfo.fmt); + if(color_format == LV_COLOR_FORMAT_UNKNOWN) { + goto errout; + } + + dsc->mem = mmap(NULL, dsc->pinfo.fblen, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_FILE, dsc->fd, 0); + if(dsc->mem == MAP_FAILED) { + LV_LOG_ERROR("ioctl(FBIOGET_PLANEINFO) failed: %d", errno); + ret = -errno; + goto errout; + } + + uint32_t w = dsc->vinfo.xres; + uint32_t h = dsc->vinfo.yres; + uint32_t stride = dsc->pinfo.stride; + uint32_t data_size = h * stride; + lv_draw_buf_init(&dsc->buf1, w, h, color_format, stride, dsc->mem, data_size); + + /* Check buffer mode */ + bool double_buffer = dsc->pinfo.yres_virtual >= (dsc->vinfo.yres * 2); + if(double_buffer) { + if((ret = fbdev_init_mem2(dsc)) < 0) { + goto errout; + } + + lv_draw_buf_init(&dsc->buf2, w, h, color_format, stride, dsc->mem2, data_size); + lv_display_set_draw_buffers(disp, &dsc->buf1, &dsc->buf2); + + bool triple_buffer = dsc->pinfo.yres_virtual >= (dsc->vinfo.yres * 3); + if(triple_buffer) { + if((ret = fbdev_init_mem3(dsc)) < 0) { + goto errout; + } + + lv_draw_buf_init(&dsc->buf3, w, h, color_format, stride, dsc->mem3, data_size); + lv_display_set_3rd_draw_buffer(disp, &dsc->buf3); + } + } + else { + dsc->mem_off_screen = malloc(data_size); + LV_ASSERT_MALLOC(dsc->mem_off_screen); + if(!dsc->mem_off_screen) { + ret = -ENOMEM; + LV_LOG_ERROR("Failed to allocate memory for off-screen buffer"); + goto errout; + } + + LV_LOG_USER("Use off-screen mode, memory: %p, size: %" LV_PRIu32, dsc->mem_off_screen, data_size); + lv_draw_buf_init(&dsc->buf2, w, h, color_format, stride, dsc->mem_off_screen, data_size); + lv_display_set_draw_buffers(disp, &dsc->buf2, NULL); + } + + lv_display_set_color_format(disp, color_format); + lv_display_set_render_mode(disp, LV_DISPLAY_RENDER_MODE_DIRECT); + lv_display_set_resolution(disp, dsc->vinfo.xres, dsc->vinfo.yres); + lv_timer_set_cb(disp->refr_timer, display_refr_timer_cb); + +#if LV_DRAW_TRANSFORM_USE_MATRIX + lv_display_set_matrix_rotation(disp, true); +#endif + + LV_LOG_USER("Resolution is set to %dx%d at %" LV_PRId32 "dpi", + dsc->vinfo.xres, dsc->vinfo.yres, lv_display_get_dpi(disp)); + return 0; + +errout: + close(dsc->fd); + dsc->fd = -1; + return ret; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if defined(CONFIG_FB_UPDATE) +static void fbdev_join_inv_areas(lv_display_t * disp, lv_area_t * final_inv_area) +{ + uint16_t inv_index; + + bool area_joined = false; + + for(inv_index = 0; inv_index < disp->inv_p; inv_index++) { + if(disp->inv_area_joined[inv_index] == 0) { + const lv_area_t * area_p = &disp->inv_areas[inv_index]; + + /* Join to final_area */ + + if(!area_joined) { + /* copy first area */ + lv_area_copy(final_inv_area, area_p); + area_joined = true; + } + else { + lv_area_join(final_inv_area, + final_inv_area, + area_p); + } + } + } +} +#endif + +static void display_refr_timer_cb(lv_timer_t * tmr) +{ + lv_display_t * disp = lv_timer_get_user_data(tmr); + lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); + struct pollfd pfds[1]; + + lv_memzero(pfds, sizeof(pfds)); + pfds[0].fd = dsc->fd; + pfds[0].events = POLLOUT; + + /* Query free fb to draw */ + + if(poll(pfds, 1, 0) < 0) { + return; + } + + if(pfds[0].revents & POLLOUT) { + lv_display_refr_timer(tmr); + } +} + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p) +{ + LV_UNUSED(color_p); + lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); + + if(dsc->mem_off_screen) { + /* When rendering in off-screen mode, copy the drawing buffer to fb */ + /* buf2(off-screen buffer) -> buf1(fbmem)*/ + lv_draw_buf_copy(&dsc->buf1, area, &dsc->buf2, area); + } + + /* Skip the non-last flush */ + + if(!lv_display_flush_is_last(disp)) { + lv_display_flush_ready(disp); + return; + } + +#if defined(CONFIG_FB_UPDATE) + /*May be some direct update command is required*/ + int yoffset = 0; + if(disp->buf_act == disp->buf_2) { + yoffset = dsc->mem2_yoffset; + } + else if(disp->buf_act == disp->buf_3) { + yoffset = dsc->mem3_yoffset; + } + /* Join the areas to update */ + lv_area_t final_inv_area; + lv_memzero(&final_inv_area, sizeof(final_inv_area)); + fbdev_join_inv_areas(disp, &final_inv_area); + + struct fb_area_s fb_area; + fb_area.x = final_inv_area.x1; + fb_area.y = final_inv_area.y1 + yoffset; + fb_area.w = lv_area_get_width(&final_inv_area); + fb_area.h = lv_area_get_height(&final_inv_area); + if(ioctl(dsc->fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&fb_area)) < 0) { + LV_LOG_ERROR("ioctl(FBIO_UPDATE) failed: %d", errno); + } +#endif + + /* double framebuffer */ + + if(dsc->mem2 != NULL) { + if(disp->buf_act == disp->buf_1) { + dsc->pinfo.yoffset = 0; + } + else if(disp->buf_act == disp->buf_2) { + dsc->pinfo.yoffset = dsc->mem2_yoffset; + } + else if(disp->buf_act == disp->buf_3) { + dsc->pinfo.yoffset = dsc->mem3_yoffset; + } + + if(ioctl(dsc->fd, FBIOPAN_DISPLAY, (unsigned long)((uintptr_t) & (dsc->pinfo))) < 0) { + LV_LOG_ERROR("ioctl(FBIOPAN_DISPLAY) failed: %d", errno); + } + } + lv_display_flush_ready(disp); +} + +static lv_color_format_t fb_fmt_to_color_format(int fmt) +{ + switch(fmt) { + case FB_FMT_RGB16_565: + return LV_COLOR_FORMAT_RGB565; + case FB_FMT_RGB24: + return LV_COLOR_FORMAT_RGB888; + case FB_FMT_RGB32: + return LV_COLOR_FORMAT_XRGB8888; + case FB_FMT_RGBA32: + return LV_COLOR_FORMAT_ARGB8888; + default: + break; + } + + LV_LOG_ERROR("Unsupported color format: %d", fmt); + + return LV_COLOR_FORMAT_UNKNOWN; +} + +static int fbdev_get_pinfo(int fd, struct fb_planeinfo_s * pinfo) +{ + if(ioctl(fd, FBIOGET_PLANEINFO, (unsigned long)((uintptr_t)pinfo)) < 0) { + LV_LOG_ERROR("ERROR: ioctl(FBIOGET_PLANEINFO) failed: %d", errno); + return -errno; + } + + LV_LOG_USER("PlaneInfo (plane %d):", pinfo->display); + LV_LOG_USER(" mem: %p", pinfo->fbmem); + LV_LOG_USER(" fblen: %zu", pinfo->fblen); + LV_LOG_USER(" stride: %u", pinfo->stride); + LV_LOG_USER(" display: %u", pinfo->display); + LV_LOG_USER(" bpp: %u", pinfo->bpp); + + return 0; +} + +static int fbdev_init_mem2(lv_nuttx_fb_t * dsc) +{ + struct fb_planeinfo_s pinfo; + void * phy_mem1; + void * phy_mem2; + + int ret; + + /* Get display[0] planeinfo */ + lv_memzero(&pinfo, sizeof(pinfo)); + pinfo.display = dsc->pinfo.display; + if((ret = fbdev_get_pinfo(dsc->fd, &pinfo)) < 0) return ret; + phy_mem1 = pinfo.fbmem; + + /* Get display[1] planeinfo */ + lv_memzero(&pinfo, sizeof(pinfo)); + pinfo.display = dsc->pinfo.display + 1; + if((ret = fbdev_get_pinfo(dsc->fd, &pinfo)) < 0) return ret; + phy_mem2 = pinfo.fbmem; + + lv_uintptr_t offset = (lv_uintptr_t)phy_mem2 - (lv_uintptr_t)phy_mem1; + bool is_consecutive = offset == 0; + + /* Check bpp */ + + if(pinfo.bpp != dsc->pinfo.bpp) { + LV_LOG_WARN("mem2 is incorrect"); + return -EINVAL; + } + + /* Check the buffer address offset, + * It needs to be divisible by pinfo.stride + */ + + if((offset % dsc->pinfo.stride) != 0) { + LV_LOG_WARN("It is detected that buf_offset(%" PRIuPTR ") " + "and stride(%d) are not divisible, please ensure " + "that the driver handles the address offset by itself.", + offset, dsc->pinfo.stride); + } + + /* Calculate the address and yoffset of mem2 */ + + if(is_consecutive) { + dsc->mem2_yoffset = dsc->vinfo.yres; + offset = dsc->vinfo.yres * pinfo.stride; + } + else { + dsc->mem2_yoffset = offset / dsc->pinfo.stride; + } + + uint32_t fblen = is_consecutive ? pinfo.fblen / 2 : pinfo.fblen; + void * mem2 = mmap(NULL, fblen, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FILE, dsc->fd, offset); + if(mem2 == MAP_FAILED) { + LV_LOG_ERROR("ERROR: mmap failed: %d, offset: %" PRIuPTR, errno, offset); + return -errno; + } + dsc->mem2 = mem2; + + LV_LOG_USER("Use of %sconsecutive mem2 = %p, yoffset = %" LV_PRIu32, is_consecutive ? "" : "non-", dsc->mem2, + dsc->mem2_yoffset); + + return 0; +} + +static int fbdev_init_mem3(lv_nuttx_fb_t * dsc) +{ + uintptr_t buf_offset; + struct fb_planeinfo_s pinfo; + int ret; + + lv_memzero(&pinfo, sizeof(pinfo)); + + /* Get display[2] planeinfo */ + + pinfo.display = dsc->pinfo.display + 2; + + if((ret = fbdev_get_pinfo(dsc->fd, &pinfo)) < 0) { + return ret; + } + + /* Check bpp */ + + if(pinfo.bpp != dsc->pinfo.bpp) { + LV_LOG_WARN("mem3 is incorrect"); + return -EINVAL; + } + + /* Check the buffer address offset, + * It needs to be divisible by pinfo.stride + */ + + buf_offset = (uintptr_t)pinfo.fbmem - (uintptr_t)dsc->mem; + + if((buf_offset % dsc->pinfo.stride) != 0) { + LV_LOG_WARN("It is detected that buf_offset(%" PRIuPTR ") " + "and stride(%d) are not divisible, please ensure " + "that the driver handles the address offset by itself.", + buf_offset, dsc->pinfo.stride); + } + + /* Calculate the address and yoffset of mem3 */ + + if(buf_offset == 0) { + dsc->mem3_yoffset = dsc->vinfo.yres * 2; + dsc->mem3 = (uint8_t *)pinfo.fbmem + dsc->mem3_yoffset * pinfo.stride; + LV_LOG_USER("Use consecutive mem3 = %p, yoffset = %" LV_PRIu32, + dsc->mem3, dsc->mem3_yoffset); + } + else { + dsc->mem3_yoffset = buf_offset / dsc->pinfo.stride; + dsc->mem3 = pinfo.fbmem; + LV_LOG_USER("Use non-consecutive mem3 = %p, yoffset = %" LV_PRIu32, + dsc->mem3, dsc->mem3_yoffset); + } + + return 0; +} + +static void display_release_cb(lv_event_t * e) +{ + lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); + lv_nuttx_fb_t * dsc = lv_display_get_driver_data(disp); + if(dsc) { + lv_display_set_driver_data(disp, NULL); + lv_display_set_flush_cb(disp, NULL); + + if(dsc->fd >= 0) { + close(dsc->fd); + dsc->fd = -1; + } + + if(dsc->mem_off_screen) { + /* Free the off-screen buffer */ + free(dsc->mem_off_screen); + dsc->mem_off_screen = NULL; + } + + lv_free(dsc); + } + LV_LOG_USER("Done"); +} + +#endif /*LV_USE_NUTTX*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.h b/inc/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.h new file mode 100644 index 0000000..4310aa9 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.h @@ -0,0 +1,55 @@ +/** + * @file lv_nuttx_fbdev.h + * + */ + +#ifndef LV_NUTTX_FBDEV_H +#define LV_NUTTX_FBDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" + +#if LV_USE_NUTTX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a new display with NuttX backend. + */ +lv_display_t * lv_nuttx_fbdev_create(void); + +/** + * Initialize display with specified framebuffer device + * @param disp pointer to display with NuttX backend + * @param file the name of framebuffer device + */ +int lv_nuttx_fbdev_set_file(lv_display_t * disp, const char * file); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_NUTTX */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_NUTTX_FBDEV_H */ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.c b/inc/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.c new file mode 100644 index 0000000..1426d9b --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.c @@ -0,0 +1,241 @@ +/** + * @file lv_nuttx_image_cache.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_image_cache.h" +#include "../../core/lv_global.h" +#include "../../../lvgl.h" + +#if LV_USE_NUTTX + +#include "../../draw/lv_draw_buf_private.h" +#include + +#ifdef __NuttX__ + #include +#else + #include "mock/nuttx_mm.h" +#endif + +/********************* + * DEFINES + *********************/ + +#define HEAP_NAME "GImageCache" + +#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) +#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache) +#define ctx (*(lv_nuttx_ctx_image_cache_t **)&LV_GLOBAL_DEFAULT()->nuttx_ctx->image_cache) +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint8_t * mem; + uint32_t mem_size; + + char name[sizeof(HEAP_NAME) + 10]; /**< +10 characters to store task pid. */ + + struct mm_heap_s * heap; + uint32_t heap_size; + + bool initialized; + bool independent_image_heap; + + lv_draw_buf_malloc_cb_t malloc_cb; + lv_draw_buf_free_cb_t free_cb; + +#if LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + lv_draw_buf_malloc_cb_t malloc_cb_default; + lv_draw_buf_free_cb_t free_cb_default; +#endif +} lv_nuttx_ctx_image_cache_t; +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format); +static void free_cb(void * draw_buf); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_nuttx_image_cache_init(bool use_independent_image_heap) +{ + lv_draw_buf_handlers_t * handlers = image_cache_draw_buf_handlers; + + ctx = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_image_cache_t)); + LV_ASSERT_MALLOC(ctx); + + ctx->malloc_cb = handlers->buf_malloc_cb; + ctx->free_cb = handlers->buf_free_cb; + + handlers->buf_malloc_cb = malloc_cb; + handlers->buf_free_cb = free_cb; + +#if LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + handlers = lv_draw_buf_get_handlers(); + ctx->malloc_cb_default = handlers->buf_malloc_cb; + ctx->free_cb_default = handlers->buf_free_cb; + + handlers->buf_malloc_cb = malloc_cb; + handlers->buf_free_cb = free_cb; +#endif + + ctx->initialized = false; + ctx->independent_image_heap = use_independent_image_heap; +} + +void lv_nuttx_image_cache_deinit(void) +{ + lv_draw_buf_handlers_t * handlers = image_cache_draw_buf_handlers; + + if(ctx->independent_image_heap == false) goto FREE_CONTEXT; + if(ctx->initialized == false) goto FREE_CONTEXT; + + mm_uninitialize(ctx->heap); + free(ctx->mem); + +FREE_CONTEXT: + handlers->buf_malloc_cb = ctx->malloc_cb; + handlers->buf_free_cb = ctx->free_cb; + +#if LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + handlers = lv_draw_buf_get_handlers(); + handlers->buf_malloc_cb = ctx->malloc_cb_default; + handlers->buf_free_cb = ctx->free_cb_default; +#endif + + lv_free(ctx); + + ctx = NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool defer_init(void) +{ + if(ctx->mem != NULL && ctx->heap != NULL) { + return true; + } + + if(lv_image_cache_is_enabled() == false) { + LV_LOG_INFO("Image cache is not initialized yet. Skipping deferred initialization. Because max_size is 0."); + return false; + } + + ctx->mem_size = img_cache_p->max_size; + ctx->mem = malloc(ctx->mem_size); + LV_ASSERT_MALLOC(ctx->mem); + + if(ctx->mem == NULL) { + LV_LOG_ERROR("Failed to allocate memory for image cache"); + ctx->initialized = false; + return false; + } + + lv_snprintf(ctx->name, sizeof(ctx->name), HEAP_NAME "[%-4" LV_PRIu32 "]", (uint32_t)gettid()); + + ctx->heap = mm_initialize( + ctx->name, + ctx->mem, + ctx->mem_size + ); + + struct mallinfo info = mm_mallinfo(ctx->heap); + ctx->heap_size = info.arena; + + LV_LOG_USER("heap info:"); + LV_LOG_USER(" heap: %p", (void *)ctx->heap); + LV_LOG_USER(" mem: %p", ctx->mem); + LV_LOG_USER(" mem_size: %" LV_PRIu32, ctx->mem_size); + LV_LOG_USER(" arena: %d", info.arena); + LV_LOG_USER(" ordblks: %d", info.ordblks); + LV_LOG_USER(" aordblks: %d", info.aordblks); + LV_LOG_USER(" mxordblk: %d", info.mxordblk); + LV_LOG_USER(" uordblks: %d", info.uordblks); + LV_LOG_USER(" fordblks: %d", info.fordblks); + + ctx->initialized = true; + return true; +} + +static void heap_memdump(struct mm_heap_s * heap) +{ + struct mm_memdump_s dump = { + PID_MM_ALLOC, +#if CONFIG_MM_BACKTRACE >= 0 + 0, + ULONG_MAX +#endif + }; + + mm_memdump(heap, &dump); +} + +static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format) +{ + LV_UNUSED(color_format); + if(ctx->independent_image_heap == true && ctx->initialized == false) { + if(defer_init() == false) return NULL; + } + + /*Allocate larger memory to be sure it can be aligned as needed*/ + size_bytes += LV_DRAW_BUF_ALIGN - 1; + uint32_t cache_max_size = lv_cache_get_max_size(img_cache_p, NULL); + + if(lv_cache_is_enabled(img_cache_p) && size_bytes > cache_max_size) { + LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", + (uint32_t)size_bytes, + cache_max_size); + return NULL; + } + + while(1) { + void * mem = NULL; + if(ctx->independent_image_heap) { + mem = mm_malloc(ctx->heap, size_bytes); + } + else if((!lv_cache_is_enabled(img_cache_p)) || (lv_cache_get_size(img_cache_p, NULL) + size_bytes < cache_max_size)) { + mem = ctx->malloc_cb(size_bytes, color_format); + } + if(mem) return mem; + LV_LOG_INFO("appears to be out of memory. attempting to evict one cache entry. with allocated size %" LV_PRIu32, + (uint32_t)size_bytes); + bool evict_res = lv_cache_evict_one(img_cache_p, NULL); + if(evict_res == false) { + LV_LOG_ERROR("failed to evict one cache entry"); + heap_memdump(ctx->heap); + return NULL; + } + } +} + +static void free_cb(void * draw_buf) +{ + if(ctx->independent_image_heap == true) { + mm_free(ctx->heap, draw_buf); + } + else { + ctx->free_cb(draw_buf); + } +} + +#endif /* LV_USE_NUTTX */ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h b/inc/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h new file mode 100644 index 0000000..0e056b4 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h @@ -0,0 +1,44 @@ +/** + * @file lv_nuttx_image_cache.h + * + */ + +#ifndef LV_NUTTX_IMAGE_CACHE_H +#define LV_NUTTX_IMAGE_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#include LV_STDBOOL_INCLUDE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_nuttx_image_cache_init(bool use_independent_image_heap); + +void lv_nuttx_image_cache_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NUTTX_IMAGE_CACHE_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_lcd.c b/inc/lvgl/src/drivers/nuttx/lv_nuttx_lcd.c new file mode 100644 index 0000000..3b0fd12 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_lcd.c @@ -0,0 +1,245 @@ +/** + * @file lv_nuttx_lcd.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_lcd.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_LCD + +#include +#include +#include +#include +#include +#include + +#include "../../../lvgl.h" +#include "../../lvgl_private.h" + +#ifdef __NuttX__ + #include + #include +#else + #include "mock/nuttx_lcd_dev.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* fd should be defined at the beginning */ + int fd; + lv_display_t * disp; + struct lcddev_area_s area; + struct lcddev_area_align_s align_info; +} lv_nuttx_lcd_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static int32_t align_round_up(int32_t v, uint16_t align); +static void rounder_cb(lv_event_t * e); +static void flush_cb(lv_display_t * disp, const lv_area_t * area_p, + uint8_t * color_p); +static lv_display_t * lcd_init(int fd, int hor_res, int ver_res); +static void display_release_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_nuttx_lcd_create(const char * dev_path) +{ + struct fb_videoinfo_s vinfo; + struct lcd_planeinfo_s pinfo; + lv_display_t * disp; + int fd; + int ret; + + LV_ASSERT_NULL(dev_path); + + LV_LOG_USER("lcd %s opening", dev_path); + fd = open(dev_path, 0); + if(fd < 0) { + perror("Error: cannot open lcd device"); + return NULL; + } + + LV_LOG_USER("lcd %s open success", dev_path); + + ret = ioctl(fd, LCDDEVIO_GETVIDEOINFO, + (unsigned long)((uintptr_t)&vinfo)); + if(ret < 0) { + perror("Error: ioctl(LCDDEVIO_GETVIDEOINFO) failed"); + close(fd); + return NULL; + } + + ret = ioctl(fd, LCDDEVIO_GETPLANEINFO, + (unsigned long)((uintptr_t)&pinfo)); + if(ret < 0) { + perror("ERROR: ioctl(LCDDEVIO_GETPLANEINFO) failed"); + close(fd); + return NULL; + } + + disp = lcd_init(fd, vinfo.xres, vinfo.yres); + if(disp == NULL) { + close(fd); + } + + return disp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int32_t align_round_up(int32_t v, uint16_t align) +{ + return (v + align - 1) & ~(align - 1); +} + +static void rounder_cb(lv_event_t * e) +{ + lv_nuttx_lcd_t * lcd = lv_event_get_user_data(e); + lv_area_t * area = lv_event_get_param(e); + struct lcddev_area_align_s * align_info = &lcd->align_info; + int32_t w; + int32_t h; + + area->x1 &= ~(align_info->col_start_align - 1); + area->y1 &= ~(align_info->row_start_align - 1); + + w = align_round_up(lv_area_get_width(area), align_info->width_align); + h = align_round_up(lv_area_get_height(area), align_info->height_align); + + area->x2 = area->x1 + w - 1; + area->y2 = area->y1 + h - 1; +} + +static void flush_cb(lv_display_t * disp, const lv_area_t * area_p, + uint8_t * color_p) +{ + lv_nuttx_lcd_t * lcd = disp->driver_data; + lv_color_format_t cf = lv_display_get_color_format(disp); + + lcd->area.row_start = area_p->y1; + lcd->area.row_end = area_p->y2; + lcd->area.col_start = area_p->x1; + lcd->area.col_end = area_p->x2; + lcd->area.stride = lv_draw_buf_width_to_stride(lcd->area.col_end - lcd->area.col_start + 1, cf); + lcd->area.data = (uint8_t *)color_p + (LV_COLOR_FORMAT_IS_INDEXED(cf) ? + LV_COLOR_INDEXED_PALETTE_SIZE(cf) * 4 : 0); + ioctl(lcd->fd, LCDDEVIO_PUTAREA, (unsigned long) & (lcd->area)); + lv_display_flush_ready(disp); +} + +static lv_display_t * lcd_init(int fd, int hor_res, int ver_res) +{ + lv_draw_buf_t * draw_buf = NULL; + lv_draw_buf_t * draw_buf_2 = NULL; + lv_nuttx_lcd_t * lcd = lv_malloc_zeroed(sizeof(lv_nuttx_lcd_t)); + LV_ASSERT_MALLOC(lcd); + if(lcd == NULL) { + LV_LOG_ERROR("lv_nuttx_lcd_t malloc failed"); + return NULL; + } + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + lv_free(lcd); + return NULL; + } + + lv_color_format_t cf = lv_display_get_color_format(disp); /* Use default cf */ +#if LV_NUTTX_LCD_BUFFER_COUNT > 0 + lv_display_render_mode_t render_mode = LV_DISPLAY_RENDER_MODE_FULL; +#else + lv_display_render_mode_t render_mode = LV_DISPLAY_RENDER_MODE_PARTIAL; +#endif + + draw_buf = lv_draw_buf_create(hor_res, ver_res, cf, LV_STRIDE_AUTO); + if(draw_buf == NULL) { + LV_LOG_ERROR("display draw_buf create failed"); + lv_free(lcd); + return NULL; + } + +#if LV_NUTTX_LCD_BUFFER_COUNT == 2 + draw_buf_2 = lv_draw_buf_create(hor_res, ver_res, cf, LV_STRIDE_AUTO); + if(draw_buf_2 == NULL) { + LV_LOG_ERROR("display draw_buf_2 malloc failed"); + lv_free(lcd); + lv_draw_buf_destroy(draw_buf); + return NULL; + } +#endif + + lcd->fd = fd; + if(ioctl(fd, LCDDEVIO_GETAREAALIGN, &lcd->align_info) < 0) { + perror("Error: ioctl(LCDDEVIO_GETAREAALIGN) failed"); + } + + lcd->disp = disp; + lv_display_set_draw_buffers(lcd->disp, draw_buf, draw_buf_2); + lv_display_set_render_mode(lcd->disp, render_mode); + lv_display_set_flush_cb(lcd->disp, flush_cb); + lv_display_add_event_cb(lcd->disp, rounder_cb, LV_EVENT_INVALIDATE_AREA, lcd); + lv_display_add_event_cb(lcd->disp, display_release_cb, LV_EVENT_DELETE, lcd->disp); + lv_display_set_driver_data(lcd->disp, lcd); + + return lcd->disp; +} + +static void display_release_cb(lv_event_t * e) +{ + lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); + lv_nuttx_lcd_t * dsc = lv_display_get_driver_data(disp); + if(dsc) { + lv_display_set_driver_data(disp, NULL); + lv_display_set_flush_cb(disp, NULL); + + /* clear display buffer */ + if(disp->buf_1) { + lv_draw_buf_destroy(disp->buf_1); + disp->buf_1 = NULL; + } + if(disp->buf_2) { + lv_draw_buf_destroy(disp->buf_2); + disp->buf_2 = NULL; + } + + /* close device fb */ + if(dsc->fd >= 0) { + close(dsc->fd); + dsc->fd = -1; + } + lv_free(dsc); + LV_LOG_USER("Done"); + } +} +#endif /*LV_USE_NUTTX_LCD*/ + +#endif /* LV_USE_NUTTX*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_lcd.h b/inc/lvgl/src/drivers/nuttx/lv_nuttx_lcd.h new file mode 100644 index 0000000..16e24ff --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_lcd.h @@ -0,0 +1,49 @@ +/** + * @file lv_nuttx_lcd.h + * + */ + +#ifndef LV_NUTTX_LCD_H +#define LV_NUTTX_LCD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_LCD + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_display_t * lv_nuttx_lcd_create(const char * dev_path); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_NUTTX_LCD */ + +#endif /* LV_USE_NUTTX*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_NUTTX_LCD_H */ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_libuv.c b/inc/lvgl/src/drivers/nuttx/lv_nuttx_libuv.c new file mode 100644 index 0000000..7d25fa2 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_libuv.c @@ -0,0 +1,359 @@ +/** + * @file lv_nuttx_libuv.c + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_nuttx_libuv.h" + +#include "../../lvgl.h" +#include "../../lvgl_private.h" + +#if LV_USE_NUTTX +#include + +#if LV_USE_NUTTX_LIBUV +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + int fd; + bool polling; + uv_poll_t fb_poll; + uv_poll_t vsync_poll; + int32_t vsync_req_count; +} lv_nuttx_uv_fb_ctx_t; + +typedef struct { + int fd; + uv_poll_t input_poll; + lv_indev_t * indev; +} lv_nuttx_uv_input_ctx_t; + +typedef struct { + uv_timer_t uv_timer; + lv_nuttx_uv_fb_ctx_t fb_ctx; + lv_nuttx_uv_input_ctx_t input_ctx; + int32_t ref_count; +} lv_nuttx_uv_ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_nuttx_uv_timer_cb(uv_timer_t * handle); +static int lv_nuttx_uv_timer_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx); +static void lv_nuttx_uv_timer_deinit(lv_nuttx_uv_ctx_t * uv_ctx); + +static void lv_nuttx_uv_vsync_poll_cb(uv_poll_t * handle, int status, int events); +static void lv_nuttx_uv_disp_poll_cb(uv_poll_t * handle, int status, int events); +static void lv_nuttx_uv_disp_refr_req_cb(lv_event_t * e); +static int lv_nuttx_uv_fb_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx); +static void lv_nuttx_uv_fb_deinit(lv_nuttx_uv_ctx_t * uv_ctx); + +static void lv_nuttx_uv_input_poll_cb(uv_poll_t * handle, int status, int events); +static int lv_nuttx_uv_input_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx); +static void lv_nuttx_uv_input_deinit(lv_nuttx_uv_ctx_t * uv_ctx); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * lv_nuttx_uv_init(lv_nuttx_uv_t * uv_info) +{ + lv_nuttx_uv_ctx_t * uv_ctx; + int ret; + + uv_ctx = lv_malloc_zeroed(sizeof(lv_nuttx_uv_ctx_t)); + LV_ASSERT_MALLOC(uv_ctx); + if(uv_ctx == NULL) return NULL; + + if((ret = lv_nuttx_uv_timer_init(uv_info, uv_ctx)) < 0) { + LV_LOG_ERROR("lv_nuttx_uv_timer_init fail : %d", ret); + goto err_out; + } + + if((ret = lv_nuttx_uv_fb_init(uv_info, uv_ctx)) < 0) { + LV_LOG_ERROR("lv_nuttx_uv_fb_init fail : %d", ret); + goto err_out; + } + + if((ret = lv_nuttx_uv_input_init(uv_info, uv_ctx)) < 0) { + LV_LOG_ERROR("lv_nuttx_uv_input_init fail : %d", ret); + goto err_out; + } + + return uv_ctx; + +err_out: + lv_free(uv_ctx); + return NULL; +} + +void lv_nuttx_uv_deinit(void ** data) +{ + lv_nuttx_uv_ctx_t * uv_ctx = *data; + + if(uv_ctx == NULL) return; + lv_nuttx_uv_input_deinit(uv_ctx); + lv_nuttx_uv_fb_deinit(uv_ctx); + lv_nuttx_uv_timer_deinit(uv_ctx); + *data = NULL; + LV_LOG_USER("Done"); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_nuttx_uv_timer_cb(uv_timer_t * handle) +{ + uint32_t sleep_ms; + + sleep_ms = lv_timer_handler(); + + if(sleep_ms == LV_NO_TIMER_READY) { + uv_timer_stop(handle); + return; + } + + /* Prevent busy loops. */ + + if(sleep_ms == 0) { + sleep_ms = 1; + } + + LV_LOG_TRACE("sleep_ms = %" LV_PRIu32, sleep_ms); + uv_timer_start(handle, lv_nuttx_uv_timer_cb, sleep_ms, 0); +} + +static void lv_nuttx_uv_timer_resume(void * data) +{ + uv_timer_t * timer = (uv_timer_t *)data; + if(timer) + uv_timer_start(timer, lv_nuttx_uv_timer_cb, 0, 0); +} + +static int lv_nuttx_uv_timer_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx) +{ + uv_loop_t * loop = uv_info->loop; + + LV_ASSERT_NULL(uv_ctx); + LV_ASSERT_NULL(loop); + + uv_ctx->uv_timer.data = uv_ctx; + uv_timer_init(loop, &uv_ctx->uv_timer); + uv_ctx->ref_count++; + uv_timer_start(&uv_ctx->uv_timer, lv_nuttx_uv_timer_cb, 1, 1); + + lv_timer_handler_set_resume_cb(lv_nuttx_uv_timer_resume, &uv_ctx->uv_timer); + return 0; +} + +static void lv_nuttx_uv_deinit_cb(uv_handle_t * handle) +{ + lv_nuttx_uv_ctx_t * uv_ctx = handle->data; + if(--uv_ctx->ref_count <= 0) { + LV_LOG_USER("Done"); + lv_free(uv_ctx); + } +} + +static void lv_nuttx_uv_timer_deinit(lv_nuttx_uv_ctx_t * uv_ctx) +{ + lv_timer_handler_set_resume_cb(NULL, NULL); + uv_close((uv_handle_t *)&uv_ctx->uv_timer, lv_nuttx_uv_deinit_cb); + LV_LOG_USER("Done"); +} + +static void lv_nuttx_uv_vsync_poll_cb(uv_poll_t * handle, int status, int events) +{ + LV_UNUSED(handle); + LV_UNUSED(status); + LV_UNUSED(events); + + lv_display_t * d; + d = lv_display_get_next(NULL); + while(d) { + lv_display_send_vsync_event(d, NULL); + d = lv_display_get_next(d); + } +} + +static void lv_nuttx_uv_disp_poll_cb(uv_poll_t * handle, int status, int events) +{ + lv_nuttx_uv_fb_ctx_t * fb_ctx = &((lv_nuttx_uv_ctx_t *)(handle->data))->fb_ctx; + + LV_UNUSED(status); + LV_UNUSED(events); + uv_poll_stop(handle); + lv_display_refr_timer(NULL); + fb_ctx->polling = false; +} + +static void lv_nuttx_uv_disp_refr_req_cb(lv_event_t * e) +{ + lv_nuttx_uv_fb_ctx_t * fb_ctx = lv_event_get_user_data(e); + + if(fb_ctx->polling) { + return; + } + fb_ctx->polling = true; + uv_poll_start(&fb_ctx->fb_poll, UV_WRITABLE, lv_nuttx_uv_disp_poll_cb); +} + +static void lv_nuttx_uv_disp_vsync_request_cb(lv_event_t * e) +{ + lv_nuttx_uv_fb_ctx_t * fb_ctx = lv_event_get_user_data(e); + void * param = lv_event_get_param(e); + + if(param) { + if(fb_ctx->vsync_req_count == 0) { + LV_LOG_INFO("enabled"); + uv_poll_start(&fb_ctx->vsync_poll, UV_PRIORITIZED, lv_nuttx_uv_vsync_poll_cb); + } + fb_ctx->vsync_req_count++; + } + else { + fb_ctx->vsync_req_count--; + if(fb_ctx->vsync_req_count == 0) { + LV_LOG_INFO("disabled"); + uv_poll_stop(&fb_ctx->vsync_poll); + } + } +} + +static int lv_nuttx_uv_fb_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx) +{ + uv_loop_t * loop = uv_info->loop; + lv_display_t * disp = uv_info->disp; + + LV_ASSERT_NULL(uv_ctx); + LV_ASSERT_NULL(disp); + LV_ASSERT_NULL(loop); + + lv_nuttx_uv_fb_ctx_t * fb_ctx = &uv_ctx->fb_ctx; + fb_ctx->fd = *(int *)lv_display_get_driver_data(disp); + + if(fb_ctx->fd <= 0) { + LV_LOG_USER("skip uv fb init."); + return 0; + } + + if(!lv_display_get_refr_timer(disp)) { + LV_LOG_ERROR("disp refr_timer is NULL"); + return -EINVAL; + } + + /* Remove default refr timer. */ + lv_display_delete_refr_timer(disp); + + fb_ctx->fb_poll.data = uv_ctx; + uv_poll_init(loop, &fb_ctx->fb_poll, fb_ctx->fd); + uv_ctx->ref_count++; + uv_poll_start(&fb_ctx->fb_poll, UV_WRITABLE, lv_nuttx_uv_disp_poll_cb); + + fb_ctx->vsync_poll.data = uv_ctx; + uv_poll_init(loop, &fb_ctx->vsync_poll, fb_ctx->fd); + uv_ctx->ref_count++; + lv_display_add_event_cb(disp, lv_nuttx_uv_disp_vsync_request_cb, LV_EVENT_VSYNC_REQUEST, fb_ctx); + + LV_LOG_USER("lvgl fb loop start OK"); + + /* Register for the invalidate area event */ + lv_display_add_event_cb(disp, lv_nuttx_uv_disp_refr_req_cb, LV_EVENT_REFR_REQUEST, fb_ctx); + + return 0; +} + +static void lv_nuttx_uv_fb_deinit(lv_nuttx_uv_ctx_t * uv_ctx) +{ + /* should remove event */ + lv_nuttx_uv_fb_ctx_t * fb_ctx = &uv_ctx->fb_ctx; + if(fb_ctx->fd > 0) { + uv_close((uv_handle_t *)&fb_ctx->fb_poll, lv_nuttx_uv_deinit_cb); + uv_close((uv_handle_t *)&fb_ctx->vsync_poll, lv_nuttx_uv_deinit_cb); + } + LV_LOG_USER("Done"); +} + +static void lv_nuttx_uv_input_poll_cb(uv_poll_t * handle, int status, int events) +{ + lv_indev_t * indev = ((lv_nuttx_uv_ctx_t *)(handle->data))->input_ctx.indev; + + if(status < 0) { + LV_LOG_WARN("input poll error: %s ", uv_strerror(status)); + return; + } + + if(events & UV_READABLE) { + lv_indev_read(indev); + } +} + +static int lv_nuttx_uv_input_init(lv_nuttx_uv_t * uv_info, lv_nuttx_uv_ctx_t * uv_ctx) +{ + uv_loop_t * loop = uv_info->loop; + lv_indev_t * indev = uv_info->indev; + + if(indev == NULL) { + LV_LOG_USER("skip uv input init."); + return 0; + } + + LV_ASSERT_NULL(uv_ctx); + LV_ASSERT_NULL(loop); + + if(lv_indev_get_mode(indev) == LV_INDEV_MODE_EVENT) { + LV_LOG_ERROR("input device has been running in event-driven mode"); + return -EINVAL; + } + + lv_nuttx_uv_input_ctx_t * input_ctx = &uv_ctx->input_ctx; + input_ctx->fd = *(int *)lv_indev_get_driver_data(indev); + if(input_ctx->fd <= 0) { + LV_LOG_ERROR("can't get valid input fd"); + return 0; + } + + input_ctx->indev = indev; + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + + input_ctx->input_poll.data = uv_ctx; + uv_poll_init(loop, &input_ctx->input_poll, input_ctx->fd); + uv_ctx->ref_count++; + uv_poll_start(&input_ctx->input_poll, UV_READABLE, lv_nuttx_uv_input_poll_cb); + + LV_LOG_USER("lvgl input loop start OK"); + + return 0; +} + +static void lv_nuttx_uv_input_deinit(lv_nuttx_uv_ctx_t * uv_ctx) +{ + lv_nuttx_uv_input_ctx_t * input_ctx = &uv_ctx->input_ctx; + if(input_ctx->fd > 0) { + uv_close((uv_handle_t *)&input_ctx->input_poll, lv_nuttx_uv_deinit_cb); + } + LV_LOG_USER("Done"); +} + +#endif /*LV_USE_NUTTX_LIBUV*/ + +#endif /*LV_USE_NUTTX*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_libuv.h b/inc/lvgl/src/drivers/nuttx/lv_nuttx_libuv.h new file mode 100644 index 0000000..0799e67 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_libuv.h @@ -0,0 +1,66 @@ +/** + * @file lv_nuttx_libuv.h + * + */ + +#ifndef LV_NUTTX_LIBUV_H +#define LV_NUTTX_LIBUV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_LIBUV + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + void * loop; + lv_display_t * disp; + lv_indev_t * indev; +} lv_nuttx_uv_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the uv_loop using the provided configuration information. + * @param uv_info Pointer to the lv_nuttx_uv_t structure to be initialized. + */ +void * lv_nuttx_uv_init(lv_nuttx_uv_t * uv_info); + +/** + * Deinitialize the uv_loop configuration for NuttX porting layer. + * @param data Pointer to user data. + */ +void lv_nuttx_uv_deinit(void ** data); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_NUTTX_LIBUV*/ + +#endif /*LV_USE_NUTTX*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_NUTTX_LIBUV_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_mouse.c b/inc/lvgl/src/drivers/nuttx/lv_nuttx_mouse.c new file mode 100644 index 0000000..c1516a4 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_mouse.c @@ -0,0 +1,206 @@ +/** + * @file lv_nuttx_mouse.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_mouse.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_MOUSE + +#include +#include +#include +#include +#include +#include +#include +#include "../../lvgl_private.h" + +#ifdef __NuttX__ + #include + #include +#else + #include "mock/nuttx_input_mouse.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + int fd; + lv_indev_state_t last_state; +} lv_nuttx_mouse_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void mouse_read(lv_indev_t * drv, lv_indev_data_t * data); +static void mouse_delete_cb(lv_event_t * e); +static lv_indev_t * mouse_init(int fd); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_nuttx_mouse_create(const char * dev_path) +{ + lv_indev_t * indev; + int fd; + + LV_ASSERT_NULL(dev_path); + LV_LOG_USER("mouse %s opening", dev_path); + fd = open(dev_path, O_RDONLY | O_NONBLOCK); + if(fd < 0) { + LV_LOG_ERROR("Error: cannot open mouse device"); + return NULL; + } + + LV_LOG_USER("mouse %s open success", dev_path); + + indev = mouse_init(fd); + + if(indev == NULL) { + close(fd); + } + + return indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void mouse_read(lv_indev_t * drv, lv_indev_data_t * data) +{ + lv_nuttx_mouse_t * mouse = drv->driver_data; + struct mouse_report_s sample; + + /* Read one sample */ + + int nbytes = read(mouse->fd, &sample, sizeof(struct mouse_report_s)); + + /* Handle unexpected return values */ + + if(nbytes == sizeof(struct mouse_report_s)) { + lv_display_t * disp = lv_indev_get_display(drv); + int32_t hor_max = lv_display_get_horizontal_resolution(disp) - 1; + int32_t ver_max = lv_display_get_vertical_resolution(disp) - 1; + + data->point.x = + LV_CLAMP(0, + data->point.x + (sample.x * LV_USE_NUTTX_MOUSE_MOVE_STEP), + hor_max); + data->point.y = + LV_CLAMP(0, + data->point.y + (sample.y * LV_USE_NUTTX_MOUSE_MOVE_STEP), + ver_max); + + uint8_t mouse_buttons = sample.buttons; + + if(mouse_buttons & MOUSE_BUTTON_1 || mouse_buttons & MOUSE_BUTTON_2 || + mouse_buttons & MOUSE_BUTTON_3) { + mouse->last_state = LV_INDEV_STATE_PRESSED; + } + else { + mouse->last_state = LV_INDEV_STATE_RELEASED; + } + } + else { + if(nbytes == -1) { + if(errno != EAGAIN) { + LV_LOG_WARN("Read error: %s", strerror(errno)); + } + } + else if(nbytes != 0) { + LV_LOG_WARN("Unexpected read size: %d", nbytes); + } + } + + data->state = mouse->last_state; +} + +static void mouse_delete_cb(lv_event_t * e) +{ + lv_indev_t * indev = lv_event_get_user_data(e); + lv_nuttx_mouse_t * mouse = lv_indev_get_driver_data(indev); + if(mouse) { + lv_indev_set_driver_data(indev, NULL); + lv_indev_set_read_cb(indev, NULL); + + if(mouse->fd >= 0) { + close(mouse->fd); + mouse->fd = -1; + } + lv_free(mouse); + LV_LOG_USER("done"); + } +} + +static void mouse_set_cursor(lv_indev_t * indev) +{ + lv_obj_t * cursor_obj = lv_obj_create(lv_layer_sys()); + lv_obj_remove_style_all(cursor_obj); + + int32_t size = 20; + lv_obj_set_size(cursor_obj, size, size); + lv_obj_set_style_translate_x(cursor_obj, -size / 2, 0); + lv_obj_set_style_translate_y(cursor_obj, -size / 2, 0); + lv_obj_set_style_radius(cursor_obj, LV_RADIUS_CIRCLE, 0); + lv_obj_set_style_bg_opa(cursor_obj, LV_OPA_50, 0); + lv_obj_set_style_bg_color(cursor_obj, lv_color_black(), 0); + lv_obj_set_style_border_width(cursor_obj, 2, 0); + lv_obj_set_style_border_color(cursor_obj, + lv_palette_main(LV_PALETTE_GREY), 0); + lv_indev_set_cursor(indev, cursor_obj); +} + +static lv_indev_t * mouse_init(int fd) +{ + lv_nuttx_mouse_t * mouse; + lv_indev_t * indev = NULL; + + mouse = lv_malloc_zeroed(sizeof(lv_nuttx_mouse_t)); + LV_ASSERT_MALLOC(mouse); + + mouse->fd = fd; + mouse->last_state = LV_INDEV_STATE_RELEASED; + indev = lv_indev_create(); + + if(indev == NULL) { + LV_LOG_ERROR("indev create failed"); + lv_free(mouse); + return NULL; + } + + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, mouse_read); + lv_indev_set_driver_data(indev, mouse); + lv_indev_add_event_cb(indev, mouse_delete_cb, LV_EVENT_DELETE, indev); + + /* Set cursor icon */ + mouse_set_cursor(indev); + return indev; +} + +#endif /*LV_USE_NUTTX_MOUSE*/ + +#endif /* LV_USE_NUTTX*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_mouse.h b/inc/lvgl/src/drivers/nuttx/lv_nuttx_mouse.h new file mode 100644 index 0000000..dfde8e8 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_mouse.h @@ -0,0 +1,57 @@ +/** + * @file lv_nuttx_mouse.h + * + */ + +/********************* + * INCLUDES + *********************/ + +#ifndef LV_NUTTX_MOUSE_H +#define LV_NUTTX_MOUSE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_MOUSE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize indev with specified input device. + * @param dev_path path of input device + */ +lv_indev_t * lv_nuttx_mouse_create(const char * dev_path); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_NUTTX_MOUSE */ + +#endif /* LV_USE_NUTTX*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_NUTTX_MOUSE_H */ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c b/inc/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c new file mode 100644 index 0000000..016de78 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c @@ -0,0 +1,146 @@ +/** + * @file lv_nuttx_profiler.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_profiler.h" + +#if LV_USE_NUTTX && LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +#include "../../misc/lv_profiler_builtin_private.h" +#include "../../misc/lv_log.h" +#include "../../core/lv_global.h" +#include "../../stdlib/lv_sprintf.h" +#include "../../stdlib/lv_string.h" +#include "lv_nuttx_entry.h" +#include +#include +#include +#include + +#ifdef __NuttX__ + #include +#else + #include "mock/nuttx_arch.h" +#endif + +/********************* + * DEFINES + *********************/ + +#define trace_fd (LV_GLOBAL_DEFAULT()->nuttx_ctx->trace_fd) + +#define TICK_TO_NSEC(tick) ((tick) * 1000 / cpu_freq) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t cpu_freq = 0; /* MHz */ + +/********************** + * STATIC VARIABLES + **********************/ + +static uint64_t tick_get_cb(void); +static void flush_cb(const char * buf); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_nuttx_profiler_init(void) +{ + cpu_freq = (uint32_t)up_perf_getfreq() / 1000000; + if(cpu_freq == 0) { + LV_LOG_ERROR("Failed to get CPU frequency"); + return; + } + LV_LOG_USER("CPU frequency: %" LV_PRIu32 " MHz", cpu_freq); + +#if LV_USE_NUTTX_TRACE_FILE + trace_fd = -1; +#endif + + lv_profiler_builtin_config_t config; + lv_profiler_builtin_config_init(&config); + config.tick_per_sec = 1000000000; /* 1 sec = 1000000000 nsec */ + config.tick_get_cb = tick_get_cb; + config.flush_cb = flush_cb; + lv_profiler_builtin_init(&config); +} + +void lv_nuttx_profiler_set_file(const char * file) +{ +#if LV_USE_NUTTX_TRACE_FILE + if(trace_fd >= 0) { + close(trace_fd); + } + + trace_fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if(trace_fd < 0) { + LV_LOG_ERROR("Failed to open trace file %s, error: %d", file, errno); + } +#endif +} + +void lv_nuttx_profiler_deinit(void) +{ + lv_profiler_builtin_uninit(); +#if LV_USE_NUTTX_TRACE_FILE + if(trace_fd >= 0) { + close(trace_fd); + } + trace_fd = -1; +#endif +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint64_t tick_get_cb(void) +{ + static uint32_t prev_tick = 0; + static uint64_t cur_tick_ns = 0; + uint32_t act_time = up_perf_gettime(); + uint64_t elaps; + + /*If there is no overflow in sys_time simple subtract*/ + if(act_time >= prev_tick) { + elaps = act_time - prev_tick; + } + else { + elaps = UINT32_MAX - prev_tick + 1; + elaps += act_time; + } + + cur_tick_ns += TICK_TO_NSEC(elaps); + prev_tick = act_time; + return cur_tick_ns; +} + +static void flush_cb(const char * buf) +{ +#if LV_USE_NUTTX_TRACE_FILE + if(trace_fd >= 0) { + write(trace_fd, buf, lv_strlen(buf)); + return; + } +#endif + printf("%s", buf); +} + +#endif diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_profiler.h b/inc/lvgl/src/drivers/nuttx/lv_nuttx_profiler.h new file mode 100644 index 0000000..248279b --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_profiler.h @@ -0,0 +1,47 @@ +/** + * @file lv_nuttx_profiler.h + * + */ + +#ifndef LV_NUTTX_PROFILER_H +#define LV_NUTTX_PROFILER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_NUTTX && LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_nuttx_profiler_init(void); +void lv_nuttx_profiler_set_file(const char * file); +void lv_nuttx_profiler_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_NUTTX && LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NUTTX_PROFILER_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.c b/inc/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.c new file mode 100644 index 0000000..210e87a --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.c @@ -0,0 +1,234 @@ +/** + * @file lv_nuttx_touchscreen.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_nuttx_touchscreen.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_TOUCHSCREEN + +#include +#include +#include +#include +#include +#include +#include "../../lvgl_private.h" + +#ifdef __NuttX__ + #include + #include +#else + #include "mock/nuttx_input_touchscreen.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* fd should be defined at the beginning */ + int fd; + struct touch_sample_s last_sample; + bool has_last_sample; + lv_indev_state_t last_state; + lv_indev_t * indev_drv; +} lv_nuttx_touchscreen_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void indev_set_cursor(lv_indev_t * indev, int32_t size); +static void touchscreen_read(lv_indev_t * drv, lv_indev_data_t * data); +static void touchscreen_delete_cb(lv_event_t * e); +static lv_indev_t * touchscreen_init(int fd); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_nuttx_touchscreen_create(const char * dev_path) +{ + lv_indev_t * indev; + int fd; + + LV_ASSERT_NULL(dev_path); + LV_LOG_USER("touchscreen %s opening", dev_path); + fd = open(dev_path, O_RDONLY | O_NONBLOCK); + if(fd < 0) { + perror("Error: cannot open touchscreen device"); + return NULL; + } + + LV_LOG_USER("touchscreen %s open success", dev_path); + + indev = touchscreen_init(fd); + + if(indev == NULL) { + close(fd); + } + + indev_set_cursor(indev, LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE); + + return indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void indev_set_cursor(lv_indev_t * indev, int32_t size) +{ + lv_obj_t * cursor_obj = lv_indev_get_cursor(indev); + if(size <= 0) { + if(cursor_obj) { + lv_obj_delete(cursor_obj); + lv_indev_set_cursor(indev, NULL); + } + } + else { + if(cursor_obj == NULL) { + cursor_obj = lv_obj_create(lv_layer_sys()); + lv_obj_remove_style_all(cursor_obj); + lv_obj_set_style_radius(cursor_obj, LV_RADIUS_CIRCLE, 0); + lv_obj_set_style_bg_opa(cursor_obj, LV_OPA_50, 0); + lv_obj_set_style_bg_color(cursor_obj, lv_color_black(), 0); + lv_obj_set_style_border_width(cursor_obj, 2, 0); + lv_obj_set_style_border_color(cursor_obj, lv_palette_main(LV_PALETTE_GREY), 0); + } + lv_obj_set_size(cursor_obj, size, size); + lv_obj_set_style_translate_x(cursor_obj, -size / 2, 0); + lv_obj_set_style_translate_y(cursor_obj, -size / 2, 0); + lv_indev_set_cursor(indev, cursor_obj); + } +} + +static void conv_touch_sample(lv_indev_t * drv, + lv_indev_data_t * data, + struct touch_sample_s * sample) +{ + lv_nuttx_touchscreen_t * touchscreen = drv->driver_data; + uint8_t touch_flags = sample->point[0].flags; + + if(touch_flags & (TOUCH_DOWN | TOUCH_MOVE)) { + lv_display_t * disp = lv_indev_get_display(drv); + int32_t hor_max = lv_display_get_horizontal_resolution(disp) - 1; + int32_t ver_max = lv_display_get_vertical_resolution(disp) - 1; + + data->point.x = LV_CLAMP(0, sample->point[0].x, hor_max); + data->point.y = LV_CLAMP(0, sample->point[0].y, ver_max); + touchscreen->last_state = LV_INDEV_STATE_PRESSED; + } + else if(touch_flags & TOUCH_UP) { + touchscreen->last_state = LV_INDEV_STATE_RELEASED; + } +} + +static bool touchscreen_read_sample(int fd, struct touch_sample_s * sample) +{ + int nbytes = read(fd, sample, sizeof(struct touch_sample_s)); + return nbytes == sizeof(struct touch_sample_s); +} + +static void touchscreen_read(lv_indev_t * drv, lv_indev_data_t * data) +{ + lv_nuttx_touchscreen_t * touchscreen = drv->driver_data; + struct touch_sample_s sample; + + /* + * Note: Since it is necessary to avoid multi-processing click events + * caused by redundant continue_reading, a two-unit sample sliding window + * algorithm is used here. continue_reading is only activated when there + * are two points in the window. + */ + + /* If has last sample, use it first */ + if(touchscreen->has_last_sample) { + conv_touch_sample(drv, data, &touchscreen->last_sample); + } + else { + /* Read first sample */ + if(!touchscreen_read_sample(touchscreen->fd, &sample)) { + /* No sample available, return last state */ + data->state = touchscreen->last_state; + return; + } + + conv_touch_sample(drv, data, &sample); + } + + /* Try to read next sample */ + if(touchscreen_read_sample(touchscreen->fd, &sample)) { + /* Save last sample and let lvgl continue reading */ + touchscreen->last_sample = sample; + touchscreen->has_last_sample = true; + data->continue_reading = true; + } + else { + /* No more sample available, clear last sample flag */ + touchscreen->has_last_sample = false; + } + + data->state = touchscreen->last_state; +} + +static void touchscreen_delete_cb(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); + lv_nuttx_touchscreen_t * touchscreen = lv_indev_get_driver_data(indev); + if(touchscreen) { + lv_indev_set_driver_data(indev, NULL); + lv_indev_set_read_cb(indev, NULL); + indev_set_cursor(indev, -1); + if(touchscreen->fd >= 0) { + close(touchscreen->fd); + touchscreen->fd = -1; + } + lv_free(touchscreen); + LV_LOG_USER("done"); + } +} + +static lv_indev_t * touchscreen_init(int fd) +{ + lv_nuttx_touchscreen_t * touchscreen; + lv_indev_t * indev = NULL; + + touchscreen = lv_malloc_zeroed(sizeof(lv_nuttx_touchscreen_t)); + if(touchscreen == NULL) { + LV_LOG_ERROR("touchscreen_s malloc failed"); + return NULL; + } + + touchscreen->fd = fd; + touchscreen->last_state = LV_INDEV_STATE_RELEASED; + touchscreen->indev_drv = indev = lv_indev_create(); + + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, touchscreen_read); + lv_indev_set_driver_data(indev, touchscreen); + lv_indev_add_event_cb(indev, touchscreen_delete_cb, LV_EVENT_DELETE, indev); + return indev; +} + +#endif /*LV_USE_NUTTX_TOUCHSCREEN*/ + +#endif /* LV_USE_NUTTX*/ diff --git a/inc/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.h b/inc/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.h new file mode 100644 index 0000000..e0dd1f1 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/lv_nuttx_touchscreen.h @@ -0,0 +1,57 @@ +/** + * @file lv_nuttx_touchscreen.h + * + */ + +/********************* + * INCLUDES + *********************/ + +#ifndef LV_NUTTX_TOUCHSCREEN_H +#define LV_NUTTX_TOUCHSCREEN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" + +#if LV_USE_NUTTX + +#if LV_USE_NUTTX_TOUCHSCREEN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize indev with specified input device. + * @param dev_path path of input device + */ +lv_indev_t * lv_nuttx_touchscreen_create(const char * dev_path); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_NUTTX_TOUCHSCREEN */ + +#endif /* LV_USE_NUTTX*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_NUTTX_TOUCHSCREEN_H */ diff --git a/inc/lvgl/src/drivers/nuttx/mock/nuttx_arch.h b/inc/lvgl/src/drivers/nuttx/mock/nuttx_arch.h new file mode 100644 index 0000000..bf8d5e9 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/mock/nuttx_arch.h @@ -0,0 +1,49 @@ +/** + * @file nuttx_arch.h + * + */ + +#ifndef NUTTX_ARCH_H +#define NUTTX_ARCH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline unsigned long up_perf_getfreq(void) +{ + return 1000000; /*1 MHz for mock*/ +} + +static inline uint32_t up_perf_gettime(void) +{ + return 0; +} + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*NUTTX_ARCH_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/mock/nuttx_cache.h b/inc/lvgl/src/drivers/nuttx/mock/nuttx_cache.h new file mode 100644 index 0000000..1ecaa9b --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/mock/nuttx_cache.h @@ -0,0 +1,51 @@ +/** + * @file nuttx_cache.h + * + */ + +#ifndef NUTTX_CACHE_H +#define NUTTX_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include + +/********************* + * DEFINES + *********************/ + +/********************* + * TYPEDEFS + *********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline void up_invalidate_dcache(uintptr_t start, uintptr_t end) +{ + (void)start; + (void)end; +} + +static inline void up_flush_dcache(uintptr_t start, uintptr_t end) +{ + (void)start; + (void)end; +} + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*NUTTX_CACHE_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/mock/nuttx_clock.h b/inc/lvgl/src/drivers/nuttx/mock/nuttx_clock.h new file mode 100644 index 0000000..d2486c9 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/mock/nuttx_clock.h @@ -0,0 +1,55 @@ +/** + * @file nuttx_clock.h + * + */ + +#ifndef NUTTX_CLOCK_H +#define NUTTX_CLOCK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include + +/********************* + * DEFINES + *********************/ + +#define CONFIG_SCHED_CPULOAD 1 + +#define pthread_get_stacksize_np(tid) 0 + +/********************** + * TYPEDEFS + **********************/ + +struct cpuload_s { + volatile uint32_t total; /* Total number of clock ticks */ + volatile uint32_t active; /* Number of ticks while this thread was active */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline int clock_cpuload(int pid, struct cpuload_s * cpuload) +{ + (void)pid; + (void)cpuload; + return -1; +} + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*NUTTX_CLOCK_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/mock/nuttx_input_mouse.h b/inc/lvgl/src/drivers/nuttx/mock/nuttx_input_mouse.h new file mode 100644 index 0000000..f9cee77 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/mock/nuttx_input_mouse.h @@ -0,0 +1,55 @@ +/** + * @file nuttx_input_mouse.h + * + */ + +#ifndef NUTTX_INPUT_MOUSE_H +#define NUTTX_INPUT_MOUSE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include + +/********************* + * DEFINES + *********************/ + +/* These definitions provide the meaning of all of the bits that may be + * reported in the struct mouse_report_s buttons. + */ + +#define MOUSE_BUTTON_1 (1 << 0) /* True: Left mouse button pressed */ +#define MOUSE_BUTTON_2 (1 << 1) /* True: Right mouse button pressed */ +#define MOUSE_BUTTON_3 (1 << 2) /* True: Middle mouse button pressed */ + +/********************** + * TYPEDEFS + **********************/ + +struct mouse_report_s { + uint8_t buttons; /* See MOUSE_* definitions above */ + uint8_t dummy; /* Padded with 1 byte here */ + int16_t x; /* X coordinate of the mouse position */ + int16_t y; /* Y coordinate of the mouse position */ + int16_t wheel; /* Mouse wheel position */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*NUTTX_INPUT_MOUSE_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/mock/nuttx_input_touchscreen.h b/inc/lvgl/src/drivers/nuttx/mock/nuttx_input_touchscreen.h new file mode 100644 index 0000000..2d1858f --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/mock/nuttx_input_touchscreen.h @@ -0,0 +1,125 @@ +/** + * @file nuttx_input_touchscreen.h + * + */ + +#ifndef NUTTX_INPUT_TOUCHSCREEN_H +#define NUTTX_INPUT_TOUCHSCREEN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include + +/********************* + * DEFINES + *********************/ + +#define _TSIOC(x) (x) + +/* Common TSC IOCTL commands */ + +#define TSIOC_SETXRCAL _TSIOC(0x0001) /* arg: Pointer to + * int Xplate R calibration value + */ +#define TSIOC_GETXRCAL _TSIOC(0x0002) /* arg: Pointer to + * int Xplate R calibration value + */ +#define TSIOC_SETFREQUENCY _TSIOC(0x0003) /* arg: Pointer to + * uint32_t frequency value + */ +#define TSIOC_GETFREQUENCY _TSIOC(0x0004) /* arg: Pointer to + * uint32_t frequency value + */ +#define TSIOC_GETFWVERSION _TSIOC(0x0005) /* arg: Pointer to + * uint32_t firmware version + * value + * */ +#define TSIOC_ENABLEGESTURE _TSIOC(0x0006) /* arg: Pointer to + * int for enable gesture feature + */ +#define TSIOC_DOACALIB _TSIOC(0x0007) /* arg: none. + * Initiate TS auto calibration + */ +#define TSIOC_CALDATA _TSIOC(0x0008) /* arg: Pointer to + * struct g_tscaldata_s + */ +#define TSIOC_USESCALED _TSIOC(0x0009) /* arg: bool, yes/no */ +#define TSIOC_GETOFFSETX _TSIOC(0x000a) /* arg: Pointer to + * int X offset value + */ +#define TSIOC_GETOFFSETY _TSIOC(0x000b) /* arg: Pointer to + * int Y offset value + */ +#define TSIOC_GETTHRESHX _TSIOC(0x000c) /* arg: Pointer to + * int X threshold value + */ +#define TSIOC_GETTHRESHY _TSIOC(0x000d) /* arg: Pointer to + * int Y threshold value + */ + +#define TSIOC_GRAB _TSIOC(0x000e) /* arg: Pointer to + * int for enable grab + */ + +#define TSIOC_GETMAXPOINTS _TSIOC(0x000f) /* arg: Pointer to + * uint8_t max touch point + */ +#define TSIOC_GETRESOLUTION _TSIOC(0x0010) /* arg: Pointer to + * struct touch_resolution_s + */ + +/* These definitions provide the meaning of all of the bits that may be + * reported in the struct touch_point_s flags. + */ + +#define TOUCH_DOWN (1 << 0) /* A new touch contact is established */ +#define TOUCH_MOVE (1 << 1) /* Movement occurred with previously reported contact */ +#define TOUCH_UP (1 << 2) /* The touch contact was lost */ +#define TOUCH_ID_VALID (1 << 3) /* Touch ID is certain */ +#define TOUCH_POS_VALID (1 << 4) /* Hardware provided a valid X/Y position */ +#define TOUCH_PRESSURE_VALID (1 << 5) /* Hardware provided a valid pressure */ +#define TOUCH_SIZE_VALID (1 << 6) /* Hardware provided a valid H/W contact size */ +#define TOUCH_GESTURE_VALID (1 << 7) /* Hardware provided a valid gesture */ + +/********************** + * TYPEDEFS + **********************/ + +struct touch_point_s { + uint8_t id; /* Unique identifies contact; Same in all reports for the contact */ + uint8_t flags; /* See TOUCH_* definitions above */ + int16_t x; /* X coordinate of the touch point (uncalibrated) */ + int16_t y; /* Y coordinate of the touch point (uncalibrated) */ + int16_t h; /* Height of touch point (uncalibrated) */ + int16_t w; /* Width of touch point (uncalibrated) */ + uint16_t gesture; /* Gesture of touchscreen contact */ + uint16_t pressure; /* Touch pressure */ + uint16_t dummy; /* Padded with 2 bytes here */ + uint64_t timestamp; /* Touch event time stamp, in microseconds */ +}; + +struct touch_sample_s { + int32_t npoints; /* The number of touch points in point[] */ + int32_t dummy; /* Padded with 4 bytes here */ + struct touch_point_s point[1]; /* Actual dimension is npoints */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*NUTTX_INPUT_TOUCHSCREEN_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/mock/nuttx_lcd_dev.h b/inc/lvgl/src/drivers/nuttx/mock/nuttx_lcd_dev.h new file mode 100644 index 0000000..38fb7a5 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/mock/nuttx_lcd_dev.h @@ -0,0 +1,104 @@ +/** + * @file nuttx_lcd_dev.h + * + */ + +#ifndef NUTTX_LCD_DEV_H +#define NUTTX_LCD_DEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "nuttx_video_fb.h" + +/********************* + * DEFINES + *********************/ + +#define _LCDIOC(x) (x) + +#define LCDDEVIO_PUTRUN _LCDIOC(0) /* Arg: const struct lcddev_run_s* */ +#define LCDDEVIO_PUTAREA _LCDIOC(1) /* Arg: const struct lcddev_area_s* */ +#define LCDDEVIO_GETRUN _LCDIOC(2) /* Arg: struct lcddev_run_s* */ +#define LCDDEVIO_GETAREA _LCDIOC(3) /* Arg: struct lcddev_area_s* */ +#define LCDDEVIO_GETPOWER _LCDIOC(4) /* Arg: int* */ +#define LCDDEVIO_SETPOWER _LCDIOC(5) /* Arg: int */ +#define LCDDEVIO_GETCONTRAST _LCDIOC(6) /* Arg: int* */ +#define LCDDEVIO_SETCONTRAST _LCDIOC(7) /* Arg: unsigned int */ +#define LCDDEVIO_GETPLANEINFO _LCDIOC(8) /* Arg: struct lcd_planeinfo_s* */ +#define LCDDEVIO_GETVIDEOINFO _LCDIOC(9) /* Arg: struct fb_videoinfo_s* */ +#define LCDDEVIO_SETPLANENO _LCDIOC(10) /* Arg: int */ + +#define LCDDEVIO_GETAREAALIGN _LCDIOC(17) /* Arg: struct lcddev_area_align_s* */ + +/********************** + * TYPEDEFS + **********************/ + +struct lcddev_area_s { + fb_coord_t row_start, row_end; + fb_coord_t col_start, col_end; + fb_coord_t stride; /* row stride in bytes */ + uint8_t * data; +}; + +/* Some special LCD drivers require input data to be aligned. + * Such as starting row and column, width, height, data address, etc. + */ + +struct lcddev_area_align_s { + uint16_t row_start_align; /* Start row index alignment */ + uint16_t height_align; /* Height alignment */ + uint16_t col_start_align; /* Start column index alignment */ + uint16_t width_align; /* Width alignment */ + uint16_t buf_align; /* Buffer addr alignment */ +}; + +/* This structure describes one color plane. Some YUV formats may support + * up to 4 planes (although they probably wouldn't be used on LCD hardware). + * The framebuffer driver provides the video memory address in its + * corresponding fb_planeinfo_s structure. The LCD driver, instead, provides + * methods to transfer data to/from the LCD color plane. + */ + +struct lcd_planeinfo_s { + /* This is working memory allocated by the LCD driver for each LCD device + * and for each color plane. This memory will hold one raster line of + * data. The size of the allocated run buffer must therefore be at least + * (bpp * xres / 8). Actual alignment of the buffer must conform to the + * bitwidth of the underlying pixel type. + * + * If there are multiple planes, they may share the same working buffer + * because different planes will not be operate on concurrently. However, + * if there are multiple LCD devices, they must each have unique run + * buffers. + */ + + uint8_t * buffer; + + /* This is the number of bits in one pixel. This may be one of {1, 2, 4, + * 8, 16, 24, or 32} unless support for one or more of those resolutions + * has been disabled. + */ + + uint8_t bpp; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*NUTTX_LCD_DEV_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/mock/nuttx_mm.h b/inc/lvgl/src/drivers/nuttx/mock/nuttx_mm.h new file mode 100644 index 0000000..0d43513 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/mock/nuttx_mm.h @@ -0,0 +1,142 @@ +/** + * @file nuttx_mm.h + * + */ + +#ifndef NUTTX_MM_H +#define NUTTX_MM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include +#include + +/********************* + * DEFINES + *********************/ + +/* Special PID to query the info about alloc, free and mempool */ + +#define PID_MM_ORPHAN (-6) +#define PID_MM_BIGGEST (-5) +#define PID_MM_FREE (-4) +#define PID_MM_ALLOC (-3) +#define PID_MM_LEAK (-2) +#define PID_MM_MEMPOOL (-1) + +#ifndef ULONG_MAX +#define ULONG_MAX 4294967295UL +#endif + +#define CONFIG_MM_BACKTRACE 1 + +/********************** + * TYPEDEFS + **********************/ + +struct mm_heap_s { + /* This is the size of the heap provided to mm */ + + size_t mm_heapsize; + + /* This is the heap maximum used memory size */ + + size_t mm_maxused; + + /* This is the current used size of the heap */ + + size_t mm_curused; + + /* Kasan is disable or enable for this heap */ + + bool mm_nokasan; +}; + +struct malltask { + /* Negative pid means differently. See include/malloc.h */ + + int pid; /* Process id */ + unsigned long seqmin; /* The minimum sequence */ + unsigned long seqmax; /* The maximum sequence */ +}; + +#define mm_memdump_s malltask + +struct mallinfo { + int arena; /* non-mmapped space allocated from system */ + int ordblks; /* number of free chunks */ + int smblks; /* number of fastbin blocks */ + int hblks; /* number of mmapped regions */ + int hblkhd; /* space in mmapped regions */ + int usmblks; /* always 0, preserved for backwards compatibility */ + int fsmblks; /* space available in freed fastbin blocks */ + int uordblks; /* total allocated space */ + int fordblks; /* total free space */ + int keepcost; /* top-most, releasable (via malloc_trim) space */ + int aordblks; /* This is the number of allocated (in use) chunks for task */ + int mxordblk; /* size of the largest free chunk */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline struct mm_heap_s * mm_initialize(const char * name, void * mem, size_t size) +{ + (void)name; + (void)mem; + (void)size; + return NULL; +} + +static inline void mm_uninitialize(struct mm_heap_s * heap) +{ + (void)heap; +} + +static inline void * mm_malloc(struct mm_heap_s * heap, size_t size) +{ + (void)heap; + (void)size; + return NULL; +} + +static inline void mm_free(struct mm_heap_s * heap, void * ptr) +{ + (void)heap; + (void)ptr; +} + +static inline void mm_memdump(struct mm_heap_s * heap, const struct mm_memdump_s * dump) +{ + (void)heap; + (void)dump; +} + +static inline struct mallinfo mm_mallinfo(struct mm_heap_s * heap) +{ + (void)heap; + struct mallinfo info = {0}; + return info; +} + +static inline int gettid(void) +{ + return -1; +} + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*NUTTX_MM_H*/ diff --git a/inc/lvgl/src/drivers/nuttx/mock/nuttx_video_fb.h b/inc/lvgl/src/drivers/nuttx/mock/nuttx_video_fb.h new file mode 100644 index 0000000..1317991 --- /dev/null +++ b/inc/lvgl/src/drivers/nuttx/mock/nuttx_video_fb.h @@ -0,0 +1,343 @@ +/** + * @file nuttx_video_fb.h + * + */ + +#ifndef LV_NUTTX_VIDEO_FB_H +#define LV_NUTTX_VIDEO_FB_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include +#include + +/********************* + * DEFINES + *********************/ + +#define _FBIOC(x) (x) + +/* Color format definitions. This pretty much defines the color pixel + * processing organization of the video controller. + */ + +/* Monochrome Formats *******************************************************/ + +#define FB_FMT_Y1 0 /* BPP=1, monochrome */ +#define FB_FMT_Y2 1 /* BPP=2, 2-bit uncompressed greyscale */ +#define FB_FMT_Y4 2 /* BPP=4, 4-bit uncompressed greyscale */ +#define FB_FMT_Y8 3 /* BPP=8, 8-bit uncompressed greyscale */ +#define FB_FMT_Y16 4 /* BPP=16, 16-bit uncompressed greyscale */ +#define FB_FMT_GREY FB_FMT_Y8 /* BPP=8 */ +#define FB_FMT_Y800 FB_FMT_Y8 /* BPP=8 */ + +#define FB_ISMONO(f) (((f) >= FB_FMT_Y1) && (f) <= FB_FMT_Y16) + +/* RGB video formats ********************************************************/ + +/* Standard RGB */ + +#define FB_FMT_RGB4 5 /* BPP=4 */ +#define FB_FMT_RGB8 6 /* BPP=8 RGB palette index */ +#define FB_FMT_RGB8_222 7 /* BPP=8 R=2, G=2, B=2 */ +#define FB_FMT_RGB8_332 8 /* BPP=8 R=3, G=3, B=2 */ +#define FB_FMT_RGB12_444 9 /* BPP=12 R=4, G=4, B=4 */ +#define FB_FMT_RGB16_555 10 /* BPP=16 R=5, G=5, B=5 (1 unused bit) */ +#define FB_FMT_RGB16_565 11 /* BPP=16 R=5, G=6, B=5 */ +#define FB_FMT_RGB24 12 /* BPP=24 */ +#define FB_FMT_RGB32 13 /* BPP=32 */ + +/* Run length encoded RGB */ + +#define FB_FMT_RGBRLE4 14 /* BPP=4 */ +#define FB_FMT_RGBRLE8 15 /* BPP=8 */ + +/* Raw RGB */ + +#define FB_FMT_RGBRAW 16 /* BPP=? */ + +/* Raw RGB with arbitrary sample packing within a pixel. Packing and + * precision of R, G and B components is determined by bit masks for each. + */ + +#define FB_FMT_RGBBTFLD16 17 /* BPP=16 */ +#define FB_FMT_RGBBTFLD24 18 /* BPP=24 */ +#define FB_FMT_RGBBTFLD32 19 /* BPP=32 */ +#define FB_FMT_RGBA16 20 /* BPP=16 Raw RGB with alpha */ +#define FB_FMT_RGBA32 21 /* BPP=32 Raw RGB with alpha */ + +/* Raw RGB with a transparency field. Layout is as for standard RGB at 16 and + * 32 bits per pixel but the msb in each pixel indicates whether the pixel is + * transparent or not. + */ + +#define FB_FMT_RGBT16 22 /* BPP=16 */ +#define FB_FMT_RGBT32 23 /* BPP=32 */ + +#define FB_ISRGB(f) (((f) >= FB_FMT_RGB4) && (f) <= FB_FMT_RGBT32) + +/* Packed YUV Formats *******************************************************/ + +#define FB_FMT_AYUV 24 /* BPP=32 Combined YUV and alpha */ +#define FB_FMT_CLJR 25 /* BPP=8 4 pixels packed into a uint32_t. + * YUV 4:1:1 with l< 8 bits + * per YUV sample */ +#define FB_FMT_CYUV 26 /* BPP=16 UYVY except that height is + * reversed */ +#define FB_FMT_IRAW 27 /* BPP=? Intel uncompressed YUV */ +#define FB_FMT_IUYV 28 /* BPP=16 Interlaced UYVY (line order + * 0,2,4,.., 1,3,5...) */ +#define FB_FMT_IY41 29 /* BPP=12 Interlaced Y41P (line order + * 0,2,4,.., 1,3,5...) */ +#define FB_FMT_IYU2 30 /* BPP=24 */ +#define FB_FMT_HDYC 31 /* BPP=16 UYVY except uses the BT709 + * color space */ +#define FB_FMT_UYVP 32 /* BPP=24? YCbCr 4:2:2, 10-bits per + * component in U0Y0V0Y1 order */ +#define FB_FMT_UYVY 33 /* BPP=16 YUV 4:2:2 */ +#define FB_FMT_UYNV FB_FMT_UYVY /* BPP=16 */ +#define FB_FMT_Y422 FB_FMT_UYVY /* BPP=16 */ +#define FB_FMT_V210 34 /* BPP=32 10-bit 4:2:2 YCrCb */ +#define FB_FMT_V422 35 /* BPP=16 Upside down version of UYVY */ +#define FB_FMT_V655 36 /* BPP=16? 16-bit YUV 4:2:2 */ +#define FB_FMT_VYUY 37 /* BPP=? ATI Packed YUV Data */ +#define FB_FMT_YUYV 38 /* BPP=16 YUV 4:2:2 */ +#define FB_FMT_YUY2 FB_FMT_YUYV /* BPP=16 YUV 4:2:2 */ +#define FB_FMT_YUNV FB_FMT_YUYV /* BPP=16 YUV 4:2:2 */ +#define FB_FMT_YVYU 39 /* BPP=16 YUV 4:2:2 */ +#define FB_FMT_Y41P 40 /* BPP=12 YUV 4:1:1 */ +#define FB_FMT_Y411 41 /* BPP=12 YUV 4:1:1 */ +#define FB_FMT_Y211 42 /* BPP=8 */ +#define FB_FMT_Y41T 43 /* BPP=12 Y41P LSB for transparency */ +#define FB_FMT_Y42T 44 /* BPP=16 UYVY LSB for transparency */ +#define FB_FMT_YUVP 45 /* BPP=24? YCbCr 4:2:2 Y0U0Y1V0 order */ + +#define FB_ISYUVPACKED(f) (((f) >= FB_FMT_AYUV) && (f) <= FB_FMT_YUVP) + +/* Packed Planar YUV Formats ************************************************/ + +#define FB_FMT_YVU9 46 /* BPP=9 8-bit Y followed by 8-bit + * 4x4 VU */ +#define FB_FMT_YUV9 47 /* BPP=9? */ +#define FB_FMT_IF09 48 /* BPP=9.5 YVU9 + 4x4 plane of delta + * relative to tframe. */ +#define FB_FMT_YV16 49 /* BPP=16 8-bit Y followed by 8-bit + * 2x1 VU */ +#define FB_FMT_YV12 50 /* BPP=12 8-bit Y followed by 8-bit + * 2x2 VU */ +#define FB_FMT_I420 51 /* BPP=12 8-bit Y followed by 8-bit + * 2x2 UV */ +#define FB_FMT_IYUV FB_FMT_I420 /* BPP=12 */ +#define FB_FMT_NV12 52 /* BPP=12 8-bit Y followed by an + * interleaved 2x2 UV */ +#define FB_FMT_NV21 53 /* BPP=12 NV12 with UV reversed */ +#define FB_FMT_IMC1 54 /* BPP=12 YV12 except UV planes same + * stride as Y */ +#define FB_FMT_IMC2 55 /* BPP=12 IMC1 except UV lines + * interleaved at half stride + * boundaries */ +#define FB_FMT_IMC3 56 /* BPP=12 As IMC1 except that UV + * swapped */ +#define FB_FMT_IMC4 57 /* BPP=12 As IMC2 except that UV + * swapped */ +#define FB_FMT_CLPL 58 /* BPP=12 YV12 but including a level + * of indirection. */ +#define FB_FMT_Y41B 59 /* BPP=12? 4:1:1 planar. */ +#define FB_FMT_Y42B 60 /* BPP=16? YUV 4:2:2 planar. */ +#define FB_FMT_CXY1 61 /* BPP=12 */ +#define FB_FMT_CXY2 62 /* BPP=16 */ + +#define FB_ISYUVPLANAR(f) (((f) >= FB_FMT_YVU9) && (f) <= FB_FMT_CXY2) +#define FB_ISYUV(f) (FB_ISYUVPACKED(f) || FB_ISYUVPLANAR(f)) + +/* Hardware cursor control **************************************************/ + +#ifdef CONFIG_FB_HWCURSOR +# define FB_CUR_ENABLE 0x01 /* Enable the cursor */ +# define FB_CUR_SETIMAGE 0x02 /* Set the cursor image */ +# define FB_CUR_SETPOSITION 0x04 /* Set the position of the cursor */ +# define FB_CUR_SETSIZE 0x08 /* Set the size of the cursor */ +# define FB_CUR_XOR 0x10 /* Use XOR vs COPY ROP on image */ +#endif + +/* Hardware overlay acceleration ********************************************/ + +#define FB_NO_OVERLAY -1 + +#ifdef CONFIG_FB_OVERLAY +# define FB_ACCL_TRANSP 0x01 /* Hardware tranparency support */ +# define FB_ACCL_CHROMA 0x02 /* Hardware chromakey support */ +# define FB_ACCL_COLOR 0x04 /* Hardware color support */ +# define FB_ACCL_AREA 0x08 /* Hardware support area selection */ + +#ifdef CONFIG_FB_OVERLAY_BLIT +# define FB_ACCL_BLIT 0x10 /* Hardware blit support */ +# define FB_ACCL_BLEND 0x20 /* Hardware blend support */ +#endif + +/* Overlay transparency mode ************************************************/ + +# define FB_CONST_ALPHA 0x00 /* Transparency by alpha value */ +# define FB_PIXEL_ALPHA 0x01 /* Transparency by pixel alpha value */ + +#endif /* CONFIG_FB_OVERLAY */ + +/* FB character driver IOCTL commands ***************************************/ + +/* ioctls */ + +#define FBIOGET_VIDEOINFO _FBIOC(0x0001) /* Get color plane info */ +/* Argument: writable struct + * fb_videoinfo_s */ +#define FBIOGET_PLANEINFO _FBIOC(0x0002) /* Get video plane info */ +/* Argument: writable struct + * fb_planeinfo_s */ + +#ifdef CONFIG_FB_CMAP +# define FBIOGET_CMAP _FBIOC(0x0003) /* Get RGB color mapping */ +/* Argument: writable struct + * fb_cmap_s */ +# define FBIOPUT_CMAP _FBIOC(0x0004) /* Put RGB color mapping */ +/* Argument: read-only struct + * fb_cmap_s */ +#endif + +#ifdef CONFIG_FB_HWCURSOR +# define FBIOGET_CURSOR _FBIOC(0x0005) /* Get cursor attributes */ +/* Argument: writable struct + * fb_cursorattrib_s */ +# define FBIOPUT_CURSOR _FBIOC(0x0006) /* Set cursor attributes */ +/* Argument: read-only struct + * fb_setcursor_s */ +#endif + +#ifdef CONFIG_FB_UPDATE +# define FBIO_UPDATE _FBIOC(0x0007) /* Update a rectangular region in + * the framebuffer + * Argument: read-only struct + * fb_area_s */ +#endif + +#ifdef CONFIG_FB_SYNC +# define FBIO_WAITFORVSYNC _FBIOC(0x0008) /* Wait for vertical sync */ +#endif + +#ifdef CONFIG_FB_OVERLAY +# define FBIOGET_OVERLAYINFO _FBIOC(0x0009) /* Get video overlay info */ +/* Argument: writable struct + * fb_overlayinfo_s */ +# define FBIO_SELECT_OVERLAY _FBIOC(0x000a) /* Select overlay */ +/* Argument: read-only + * unsigned long */ +# define FBIOSET_TRANSP _FBIOC(0x000b) /* Set opacity or transparency + * Argument: read-only struct + * fb_overlayinfo_s */ +# define FBIOSET_CHROMAKEY _FBIOC(0x000c) /* Set chroma key + * Argument: read-only struct + * fb_overlayinfo_s */ +# define FBIOSET_COLOR _FBIOC(0x000d) /* Set color + * Argument: read-only struct + * fb_overlayinfo_s */ +# define FBIOSET_BLANK _FBIOC(0x000e) /* Blank or unblank + * Argument: read-only struct + * fb_overlayinfo_s */ +# define FBIOSET_AREA _FBIOC(0x000f) /* Set active overlay area + * Argument: read-only struct + * fb_overlayinfo_s */ +# define FBIOSET_DESTAREA _FBIOC(0x0010) /* Set destination area on + * primary FB. + * Argument: read-only struct + * fb_overlayinfo_s */ + +#ifdef CONFIG_FB_OVERLAY_BLIT +# define FBIOSET_BLIT _FBIOC(0x0011) /* Blit area between overlays + * Argument: read-only struct + * fb_overlayblit_s */ +# define FBIOSET_BLEND _FBIOC(0x0012) /* Blend area between overlays + * Argument: read-only struct + * fb_overlayblend_s */ +#endif + +#define FBIOPAN_OVERLAY _FBIOC(0x0013) /* Pan display for overlay + * Argument: read-only struct + * fb_overlayinfo_s */ + +#endif /* CONFIG_FB_OVERLAY */ + +/* Specific Controls ********************************************************/ + +#define FBIOSET_POWER _FBIOC(0x0014) /* Set panel power + * Argument: int */ +#define FBIOGET_POWER _FBIOC(0x0015) /* Get panel current power + * Argument: int* */ +#define FBIOSET_FRAMERATE _FBIOC(0x0016) /* Set frame rate + * Argument: int */ +#define FBIOGET_FRAMERATE _FBIOC(0x0017) /* Get frame rate + * Argument: int* */ + +#define FBIOPAN_DISPLAY _FBIOC(0x0018) /* Pan display + * Argument: read-only struct + * fb_planeinfo_s* */ + +#define FBIOPAN_CLEAR _FBIOC(0x0019) /* Pan clear */ +/* Argument: read-only + * unsigned long */ + +#define FBIOSET_VSYNCOFFSET _FBIOC(0x001a) /* Set VSync offset in usec + * Argument: int */ + +/* Linux Support ************************************************************/ + +#define FBIOGET_VSCREENINFO _FBIOC(0x001b) /* Get video variable info */ +/* Argument: writable struct + * fb_var_screeninfo */ +#define FBIOGET_FSCREENINFO _FBIOC(0x001c) /* Get video fix info */ +/* Argument: writable struct + * fb_fix_screeninfo */ + +/********************** + * TYPEDEFS + **********************/ + +typedef uint16_t fb_coord_t; + +struct fb_videoinfo_s { + uint8_t fmt; /* see FB_FMT_* */ + fb_coord_t xres; /* Horizontal resolution in pixel columns */ + fb_coord_t yres; /* Vertical resolution in pixel rows */ + uint8_t nplanes; /* Number of color planes supported */ + uint8_t noverlays; /* Number of overlays supported */ + uint8_t moduleinfo[128]; /* Module information filled by vendor */ +}; + +struct fb_planeinfo_s { + void * fbmem; /* Start of frame buffer memory */ + size_t fblen; /* Length of frame buffer memory in bytes */ + fb_coord_t stride; /* Length of a line in bytes */ + uint8_t display; /* Display number */ + uint8_t bpp; /* Bits per pixel */ + uint32_t xres_virtual; /* Virtual Horizontal resolution in pixel columns */ + uint32_t yres_virtual; /* Virtual Vertical resolution in pixel rows */ + uint32_t xoffset; /* Offset from virtual to visible resolution */ + uint32_t yoffset; /* Offset from virtual to visible resolution */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_NUTTX_VIDEO_FB_H*/ diff --git a/inc/lvgl/src/drivers/opengles/assets/lv_opengles_shader.c b/inc/lvgl/src/drivers/opengles/assets/lv_opengles_shader.c new file mode 100644 index 0000000..8f0e0dd --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/assets/lv_opengles_shader.c @@ -0,0 +1,305 @@ +#include "lv_opengles_shader.h" + +#if LV_USE_OPENGLES + +#include "../opengl_shader/lv_opengl_shader_internal.h" +#include "../../../misc/lv_types.h" + +static const lv_opengl_shader_t src_includes_v100[] = {{ + "hsv_adjust.glsl", R"( + + uniform float u_Hue; + uniform float u_Saturation; + uniform float u_Value; + + // Convert RGB to HSV + vec3 rgb2hsv(vec3 c) { + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + // Convert HSV to RGB + vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + + vec3 adjustHSV(vec3 color){ + vec3 hsv = rgb2hsv(color); + hsv.x = fract(hsv.x + u_Hue); + hsv.y = clamp(hsv.y * u_Saturation, 0.0, 1.0); + hsv.z = clamp(hsv.z * u_Value, 0.0, 1.0); + return hsv2rgb(hsv); + } + )" + }, { + "brightness_adjust.glsl", R"( + uniform float u_Brightness; // add/subtract in [ -1.0 .. +1.0 ], 0.0 = no change + + vec3 adjustBrightness(vec3 color){ + return clamp(color + vec3(u_Brightness), 0.0, 1.0); + } + + )" + }, { + "contrast_adjust.glsl", R"( + uniform float u_Contrast; // 0.0 = mid-gray, 1.0 = no change, >1.0 increases contrast + + vec3 adjustContrast(vec3 color){ + // shift to [-0.5..0.5], scale, shift back + return clamp(((color - 0.5) * u_Contrast) + 0.5, 0.0, 1.0); + } + )" + }, +}; + +static const char * src_vertex_shader_v100 = R"( + precision mediump float; + + attribute vec4 position; + attribute vec2 texCoord; + + varying vec2 v_TexCoord; + + uniform mat3 u_VertexTransform; + + void main() + { + gl_Position = vec4((u_VertexTransform * vec3(position.xy, 1.0)).xy, position.zw); + v_TexCoord = texCoord; + } +)"; + +static const char *src_fragment_shader_v100 = R"( + precision lowp float; + + varying vec2 v_TexCoord; + + uniform sampler2D u_Texture; + uniform float u_ColorDepth; + uniform float u_Opa; + uniform bool u_IsFill; + uniform vec3 u_FillColor; + uniform bool u_SwapRB; + + #ifdef HSV_ADJUST +#include + #endif + + void main() + { + vec4 texColor; + if (u_IsFill) { + texColor = vec4(u_FillColor, 1.0); + } else { + texColor = texture2D(u_Texture, v_TexCoord); + } + if (abs(u_ColorDepth - 8.0) < 0.1) { + float gray = texColor.r; + gl_FragColor = vec4(vec3(gray * u_Opa), u_Opa); + } else { + float combinedAlpha = texColor.a * u_Opa; + gl_FragColor = vec4(texColor.rgb * combinedAlpha, combinedAlpha); + } + if (u_SwapRB) { + gl_FragColor.bgr = gl_FragColor.rgb; + } + #ifdef HSV_ADJUST + gl_FragColor.rgb = adjustHSV(gl_FragColor.rgb); + #endif + } +)"; + +static const lv_opengl_shader_t src_includes_v300es[] = {{ + "hsv_adjust.glsl", R"( + uniform float u_Hue; + uniform float u_Saturation; + uniform float u_Value; + + // Convert RGB to HSV + vec3 rgb2hsv(vec3 c) { + vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + // Convert HSV to RGB + vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + + vec3 adjustHSV(vec3 color){ + vec3 hsv = rgb2hsv(color); + hsv.x = fract(hsv.x + u_Hue); + hsv.y = clamp(hsv.y * u_Saturation, 0.0, 1.0); + hsv.z = clamp(hsv.z * u_Value, 0.0, 1.0); + return hsv2rgb(hsv); + } + )" + }, { + "brightness_adjust.glsl", R"( + uniform float u_Brightness; // add/subtract in [ -1.0 .. +1.0 ], 0.0 = no change + + vec3 adjustBrightness(vec3 color){ + return clamp(color + vec3(u_Brightness), 0.0, 1.0); + } + + )" + }, { + "contrast_adjust.glsl", R"( + uniform float u_Contrast; // 0.0 = mid-gray, 1.0 = no change, >1.0 increases contrast + + vec3 adjustContrast(vec3 color){ + // shift to [-0.5..0.5], scale, shift back + return clamp(((color - 0.5) * u_Contrast) + 0.5, 0.0, 1.0); + } + )" + }, +}; + +static const char * src_vertex_shader_v300es = R"( + precision mediump float; + + in vec4 position; + in vec2 texCoord; + + out vec2 v_TexCoord; + flat out lowp vec4 fill_color_alpha; + flat out lowp int is_gray; + + uniform lowp float u_Opa; + uniform bool u_IsFill; + uniform vec3 u_FillColor; + uniform mat3 u_VertexTransform; + uniform float u_ColorDepth; + + void main() + { + gl_Position = vec4((u_VertexTransform * vec3(position.xy, 1)).xy, position.zw); + v_TexCoord = texCoord; + is_gray = (abs(u_ColorDepth - 8.0) < 0.1) ? 1 : 0; + + if (u_IsFill) { + if (is_gray == 1) { + fill_color_alpha = vec4(u_FillColor.rrr, 1.0) * u_Opa; + } else { + fill_color_alpha = vec4((u_FillColor.rgb * u_Opa), u_Opa); + } + } else { + fill_color_alpha = vec4(0.0, 0.0, 0.0, -1.0); + } + } +)"; + +static const char *src_fragment_shader_v300es = R"( + precision lowp float; + + out vec4 color; + + in vec2 v_TexCoord; + flat in lowp vec4 fill_color_alpha; + flat in lowp int is_gray; + + uniform sampler2D u_Texture; + uniform lowp float u_Opa; + uniform bool u_SwapRB; + + #ifdef HSV_ADJUST +#include + #endif + + void main() + { + if (fill_color_alpha.a != -1.0) { + color = fill_color_alpha; + } else { + color = texture(u_Texture, v_TexCoord); + /* If the vertices have been transformed, and mipmaps have not been generated, + * some rotation angles (notably 90 and 270) require using textureLod() to mitigate + * derivative calculation errors from interpolator increments flipping direction. + * color = textureLod(u_Texture, v_TexCoord, u_LodLevel); + */ + if (is_gray != 0) { + color.r *= u_Opa; + color.gba = vec3(color.rr, u_Opa); + } else { + color.a *= u_Opa; + color.rgb *= color.a; + } + } + if (u_SwapRB) { + color.bgr = color.rgb; + } + #ifdef HSV_ADJUST + color.rgb = adjustHSV(color.rgb); + #endif + } +)"; + +static const size_t src_includes_v100_count = sizeof src_includes_v100 / sizeof src_includes_v100[0]; +static const size_t src_includes_v300es_count = sizeof src_includes_v300es / sizeof src_includes_v300es[0]; + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +char * lv_opengles_shader_get_vertex(lv_opengl_glsl_version_t version) { + switch (version){ + case LV_OPENGL_GLSL_VERSION_330: + case LV_OPENGL_GLSL_VERSION_300ES: + return lv_opengl_shader_manager_process_includes(src_vertex_shader_v300es, src_includes_v300es, src_includes_v300es_count); + case LV_OPENGL_GLSL_VERSION_100: + return lv_opengl_shader_manager_process_includes(src_vertex_shader_v100, src_includes_v100, src_includes_v100_count); + case LV_OPENGL_GLSL_VERSION_LAST: + LV_LOG_ERROR("Invalid glsl version %d", version); + return NULL; + } + LV_UNREACHABLE(); +} + +char * lv_opengles_shader_get_fragment(lv_opengl_glsl_version_t version) { + switch (version){ + case LV_OPENGL_GLSL_VERSION_330: + case LV_OPENGL_GLSL_VERSION_300ES: + return lv_opengl_shader_manager_process_includes(src_fragment_shader_v300es, src_includes_v300es, src_includes_v300es_count); + case LV_OPENGL_GLSL_VERSION_100: + return lv_opengl_shader_manager_process_includes(src_fragment_shader_v100, src_includes_v100, src_includes_v100_count); + case LV_OPENGL_GLSL_VERSION_LAST: + LV_LOG_ERROR("Invalid glsl version %d", version); + return NULL; + } + LV_UNREACHABLE(); +} + +void lv_opengles_shader_get_source(lv_opengl_shader_portions_t *portions, lv_opengl_glsl_version_t version) +{ + switch (version){ + case LV_OPENGL_GLSL_VERSION_330: + case LV_OPENGL_GLSL_VERSION_300ES: + portions->all = src_includes_v300es; + portions->count = src_includes_v300es_count; + return; + case LV_OPENGL_GLSL_VERSION_100: + portions->all = src_includes_v100; + portions->count = src_includes_v100_count; + return; + case LV_OPENGL_GLSL_VERSION_LAST: + LV_LOG_ERROR("Invalid glsl version %d", version); + portions->count = 0; + return; + } + + LV_UNREACHABLE(); +} + +#endif /*LV_USE_OPENGLES*/ diff --git a/inc/lvgl/src/drivers/opengles/assets/lv_opengles_shader.h b/inc/lvgl/src/drivers/opengles/assets/lv_opengles_shader.h new file mode 100644 index 0000000..38307f9 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/assets/lv_opengles_shader.h @@ -0,0 +1,39 @@ +/** + * @file lv_opengles_shader.h + * + */ + +#ifndef LV_OPENGLES_SHADER_H +#define LV_OPENGLES_SHADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../opengl_shader/lv_opengl_shader_internal.h" + +#if LV_USE_OPENGLES + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +char * lv_opengles_shader_get_vertex(lv_opengl_glsl_version_t version); +char * lv_opengles_shader_get_fragment(lv_opengl_glsl_version_t version); +void lv_opengles_shader_get_source(lv_opengl_shader_portions_t * portions, lv_opengl_glsl_version_t version); + + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OPENGLES*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OPENGLES_SHADER_H*/ diff --git a/inc/lvgl/src/drivers/opengles/glad/README.md b/inc/lvgl/src/drivers/opengles/glad/README.md new file mode 100644 index 0000000..23d3d56 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/glad/README.md @@ -0,0 +1,5 @@ +# glad + +GLAD source files are generated using GLAD's online generator. + +[Permalink](https://gen.glad.sh/#generator=c&api=egl%3D1.5%2Cgl%3D3.3%2Cgles2%3D2.0&profile=gl%3Dcompatibility%2Cgles1%3Dcommon&extensions=EGL_EXT_image_dma_buf_import%2CEGL_EXT_image_dma_buf_import_modifiers%2CEGL_EXT_platform_base%2CEGL_EXT_platform_wayland%2CEGL_KHR_fence_sync%2CEGL_KHR_image_base%2CEGL_KHR_platform_gbm%2CGL_APPLE_texture_max_level%2CGL_ARM_rgba8%2CGL_EXT_color_buffer_float%2CGL_EXT_color_buffer_half_float%2CGL_EXT_texture_format_BGRA8888%2CGL_EXT_texture_storage%2CGL_EXT_unpack_subimage%2CGL_OES_depth24%2CGL_OES_mapbuffer%2CGL_OES_rgb8_rgba8%2CGL_OES_texture_float%2CGL_OES_texture_half_float%2CGL_OES_texture_storage_multisample_2d_array%2CGL_OES_vertex_array_object&options=ALIAS%2CALIAS) diff --git a/inc/lvgl/src/drivers/opengles/glad/include/EGL/eglplatform.h b/inc/lvgl/src/drivers/opengles/glad/include/EGL/eglplatform.h new file mode 100644 index 0000000..ed0896b --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/glad/include/EGL/eglplatform.h @@ -0,0 +1,179 @@ +#ifndef __eglplatform_h_ +#define __eglplatform_h_ + +#include "../../../../../lv_conf_internal.h" +#if LV_USE_OPENGLES + +/* +** Copyright 2007-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* Platform-specific types and definitions for egl.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by filing an issue or pull request on the public Khronos EGL Registry, at + * https://www.github.com/KhronosGroup/EGL-Registry/ + */ + +#include + +/* Macros used in EGL function prototype declarations. + * + * EGL functions should be prototyped as: + * + * EGLAPI return-type EGLAPIENTRY eglFunction(arguments); + * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments); + * + * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h + */ + +#ifndef EGLAPI +#define EGLAPI KHRONOS_APICALL +#endif + +#ifndef EGLAPIENTRY +#define EGLAPIENTRY KHRONOS_APIENTRY +#endif +#define EGLAPIENTRYP EGLAPIENTRY* + +/* The types NativeDisplayType, NativeWindowType, and NativePixmapType + * are aliases of window-system-dependent types, such as X Display * or + * Windows Device Context. They must be defined in platform-specific + * code below. The EGL-prefixed versions of Native*Type are the same + * types, renamed in EGL 1.3 so all types in the API start with "EGL". + * + * Khronos STRONGLY RECOMMENDS that you use the default definitions + * provided below, since these changes affect both binary and source + * portability of applications using EGL running on different EGL + * implementations. + */ + +#if defined(EGL_NO_PLATFORM_SPECIFIC_TYPES) + +typedef void *EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include + +typedef HDC EGLNativeDisplayType; +typedef HBITMAP EGLNativePixmapType; +typedef HWND EGLNativeWindowType; + +#elif defined(__QNX__) + +typedef khronos_uintptr_t EGLNativeDisplayType; +typedef struct _screen_pixmap* EGLNativePixmapType; /* screen_pixmap_t */ +typedef struct _screen_window* EGLNativeWindowType; /* screen_window_t */ + +#elif defined(__EMSCRIPTEN__) + +typedef int EGLNativeDisplayType; +typedef int EGLNativePixmapType; +typedef int EGLNativeWindowType; + +#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */ + +typedef int EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(WL_EGL_PLATFORM) + +typedef struct wl_display *EGLNativeDisplayType; +typedef struct wl_egl_pixmap *EGLNativePixmapType; +typedef struct wl_egl_window *EGLNativeWindowType; + +#elif defined(__GBM__) + +typedef struct gbm_device *EGLNativeDisplayType; +typedef struct gbm_bo *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(__ANDROID__) || defined(ANDROID) + +struct ANativeWindow; +struct egl_native_pixmap_t; + +typedef void* EGLNativeDisplayType; +typedef struct egl_native_pixmap_t* EGLNativePixmapType; +typedef struct ANativeWindow* EGLNativeWindowType; + +#elif defined(USE_OZONE) + +typedef intptr_t EGLNativeDisplayType; +typedef intptr_t EGLNativePixmapType; +typedef intptr_t EGLNativeWindowType; + +#elif defined(USE_X11) + +/* X11 (tentative) */ +#include +#include + +typedef Display *EGLNativeDisplayType; +typedef Pixmap EGLNativePixmapType; +typedef Window EGLNativeWindowType; + +#elif defined(__unix__) + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#elif defined(__APPLE__) + +typedef int EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(__HAIKU__) + +#include + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#elif defined(__Fuchsia__) + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#else +#error "Platform not recognized" +#endif + +/* EGL 1.2 types, renamed for consistency in EGL 1.3 */ +typedef EGLNativeDisplayType NativeDisplayType; +typedef EGLNativePixmapType NativePixmapType; +typedef EGLNativeWindowType NativeWindowType; + + +/* Define EGLint. This must be a signed integral type large enough to contain + * all legal attribute names and values passed into and out of EGL, whether + * their type is boolean, bitmask, enumerant (symbolic constant), integer, + * handle, or other. While in general a 32-bit integer will suffice, if + * handles are 64 bit types, then EGLint should be defined as a signed 64-bit + * integer type. + */ +typedef khronos_int32_t EGLint; + + +/* C++ / C typecast macros for special EGL handle values */ +#if defined(__cplusplus) +#define EGL_CAST(type, value) (static_cast(value)) +#else +#define EGL_CAST(type, value) ((type) (value)) +#endif + +#endif /*LV_USE_OPENGLES*/ +#endif /* __eglplatform_h */ diff --git a/inc/lvgl/src/drivers/opengles/glad/include/KHR/khrplatform.h b/inc/lvgl/src/drivers/opengles/glad/include/KHR/khrplatform.h new file mode 100644 index 0000000..d811122 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/glad/include/KHR/khrplatform.h @@ -0,0 +1,314 @@ +#ifndef __khrplatform_h_ +#define __khrplatform_h_ + +#include "../../../../../lv_conf_internal.h" +#if LV_USE_OPENGLES +/* +** Copyright (c) 2008-2018 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Khronos platform-specific types and definitions. + * + * The master copy of khrplatform.h is maintained in the Khronos EGL + * Registry repository at https://github.com/KhronosGroup/EGL-Registry + * The last semantic modification to khrplatform.h was at commit ID: + * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 + * + * Adopters may modify this file to suit their platform. Adopters are + * encouraged to submit platform specific modifications to the Khronos + * group so that they can be included in future versions of this file. + * Please submit changes by filing pull requests or issues on + * the EGL Registry repository linked above. + * + * + * See the Implementer's Guidelines for information about where this file + * should be located on your system and for more details of its use: + * http://www.khronos.org/registry/implementers_guide.pdf + * + * This file should be included as + * #include + * by Khronos client API header files that use its types and defines. + * + * The types in khrplatform.h should only be used to define API-specific types. + * + * Types defined in khrplatform.h: + * khronos_int8_t signed 8 bit + * khronos_uint8_t unsigned 8 bit + * khronos_int16_t signed 16 bit + * khronos_uint16_t unsigned 16 bit + * khronos_int32_t signed 32 bit + * khronos_uint32_t unsigned 32 bit + * khronos_int64_t signed 64 bit + * khronos_uint64_t unsigned 64 bit + * khronos_intptr_t signed same number of bits as a pointer + * khronos_uintptr_t unsigned same number of bits as a pointer + * khronos_ssize_t signed size + * khronos_usize_t unsigned size + * khronos_float_t signed 32 bit floating point + * khronos_time_ns_t unsigned 64 bit time in nanoseconds + * khronos_utime_nanoseconds_t unsigned time interval or absolute time in + * nanoseconds + * khronos_stime_nanoseconds_t signed time interval in nanoseconds + * khronos_boolean_enum_t enumerated boolean type. This should + * only be used as a base type when a client API's boolean type is + * an enum. Client APIs which use an integer or other type for + * booleans cannot use this as the base type for their boolean. + * + * Tokens defined in khrplatform.h: + * + * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. + * + * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. + * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. + * + * Calling convention macros defined in this file: + * KHRONOS_APICALL + * KHRONOS_APIENTRY + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( + * int arg1, + * int arg2) KHRONOS_APIATTRIBUTES; + */ + +#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) +# define KHRONOS_STATIC 1 +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APICALL + *------------------------------------------------------------------------- + * This precedes the return type of the function in the function prototype. + */ +#if defined(KHRONOS_STATIC) + /* If the preprocessor constant KHRONOS_STATIC is defined, make the + * header compatible with static linking. */ +# define KHRONOS_APICALL +#elif defined(_WIN32) +# define KHRONOS_APICALL __declspec(dllimport) +#elif defined (__SYMBIAN32__) +# define KHRONOS_APICALL IMPORT_C +#elif defined(__ANDROID__) +# define KHRONOS_APICALL __attribute__((visibility("default"))) +#else +# define KHRONOS_APICALL +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIENTRY + *------------------------------------------------------------------------- + * This follows the return type of the function and precedes the function + * name in the function prototype. + */ +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) + /* Win32 but not WinCE */ +# define KHRONOS_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIATTRIBUTES + *------------------------------------------------------------------------- + * This follows the closing parenthesis of the function prototype arguments. + */ +#if defined (__ARMCC_2__) +#define KHRONOS_APIATTRIBUTES __softfp +#else +#define KHRONOS_APIATTRIBUTES +#endif + +/*------------------------------------------------------------------------- + * basic type definitions + *-----------------------------------------------------------------------*/ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) + + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 +/* + * To support platform where unsigned long cannot be used interchangeably with + * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. + * Ideally, we could just use (u)intptr_t everywhere, but this could result in + * ABI breakage if khronos_uintptr_t is changed from unsigned long to + * unsigned long long or similar (this results in different C++ name mangling). + * To avoid changes for existing platforms, we restrict usage of intptr_t to + * platforms where the size of a pointer is larger than the size of long. + */ +#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) +#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ +#define KHRONOS_USE_INTPTR_T +#endif +#endif + +#elif defined(__VMS ) || defined(__sgi) + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) + +/* + * Win32 + */ +typedef __int32 khronos_int32_t; +typedef unsigned __int32 khronos_uint32_t; +typedef __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__sun__) || defined(__digital__) + +/* + * Sun or Digital + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#if defined(__arch64__) || defined(_LP64) +typedef long int khronos_int64_t; +typedef unsigned long int khronos_uint64_t; +#else +typedef long long int khronos_int64_t; +typedef unsigned long long int khronos_uint64_t; +#endif /* __arch64__ */ +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif 0 + +/* + * Hypothetical platform with no float or int64 support + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#define KHRONOS_SUPPORT_INT64 0 +#define KHRONOS_SUPPORT_FLOAT 0 + +#else + +/* + * Generic fallback + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#endif + + +/* + * Types that are (so far) the same on all platforms + */ +typedef signed char khronos_int8_t; +typedef unsigned char khronos_uint8_t; +typedef signed short int khronos_int16_t; +typedef unsigned short int khronos_uint16_t; + +/* + * Types that differ between LLP64 and LP64 architectures - in LLP64, + * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears + * to be the only LLP64 architecture in current use. + */ +#ifdef KHRONOS_USE_INTPTR_T +typedef intptr_t khronos_intptr_t; +typedef uintptr_t khronos_uintptr_t; +#elif defined(_WIN64) +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +#endif + +#if defined(_WIN64) +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +typedef signed long int khronos_ssize_t; +typedef unsigned long int khronos_usize_t; +#endif + +#if KHRONOS_SUPPORT_FLOAT +/* + * Float type + */ +typedef float khronos_float_t; +#endif + +#if KHRONOS_SUPPORT_INT64 +/* Time types + * + * These types can be used to represent a time interval in nanoseconds or + * an absolute Unadjusted System Time. Unadjusted System Time is the number + * of nanoseconds since some arbitrary system event (e.g. since the last + * time the system booted). The Unadjusted System Time is an unsigned + * 64 bit value that wraps back to 0 every 584 years. Time intervals + * may be either signed or unsigned. + */ +typedef khronos_uint64_t khronos_utime_nanoseconds_t; +typedef khronos_int64_t khronos_stime_nanoseconds_t; +#endif + +/* + * Dummy value used to pad enum types to 32 bits. + */ +#ifndef KHRONOS_MAX_ENUM +#define KHRONOS_MAX_ENUM 0x7FFFFFFF +#endif + +/* + * Enumerated boolean type + * + * Values other than zero should be considered to be true. Therefore + * comparisons should not be made against KHRONOS_TRUE. + */ +typedef enum { + KHRONOS_FALSE = 0, + KHRONOS_TRUE = 1, + KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM +} khronos_boolean_enum_t; + +#endif /*LV_USE_OPENGLES*/ +#endif /* __khrplatform_h_ */ diff --git a/inc/lvgl/src/drivers/opengles/glad/include/glad/egl.h b/inc/lvgl/src/drivers/opengles/glad/include/glad/egl.h new file mode 100644 index 0000000..2cc345f --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/glad/include/glad/egl.h @@ -0,0 +1,663 @@ +/** + * Loader generated by glad 2.0.8 on Fri Nov 28 10:05:15 2025 + * + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + * + * Generator: C/C++ + * Specification: egl + * Extensions: 10 + * + * APIs: + * - egl=1.5 + * + * Options: + * - ALIAS = True + * - DEBUG = False + * - HEADER_ONLY = False + * - LOADER = False + * - MX = False + * - ON_DEMAND = False + * + * Commandline: + * --api='egl=1.5' --extensions='EGL_EXT_image_dma_buf_import,EGL_EXT_image_dma_buf_import_modifiers,EGL_EXT_platform_base,EGL_EXT_platform_wayland,EGL_KHR_cl_event2,EGL_KHR_fence_sync,EGL_KHR_image,EGL_KHR_image_base,EGL_KHR_platform_gbm,EGL_KHR_reusable_sync' c --alias + * + * Online: + * http://glad.sh/#api=egl%3D1.5&extensions=EGL_EXT_image_dma_buf_import%2CEGL_EXT_image_dma_buf_import_modifiers%2CEGL_EXT_platform_base%2CEGL_EXT_platform_wayland%2CEGL_KHR_cl_event2%2CEGL_KHR_fence_sync%2CEGL_KHR_image%2CEGL_KHR_image_base%2CEGL_KHR_platform_gbm%2CEGL_KHR_reusable_sync&generator=c&options=ALIAS + * + */ + +#ifndef GLAD_EGL_H_ +#define GLAD_EGL_H_ + + +#include "../../../../../lv_conf_internal.h" +#if LV_USE_EGL + +#define GLAD_EGL +#define GLAD_OPTION_EGL_ALIAS + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_UWP + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif + + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif + + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif +#endif + +#ifdef __GNUC__ + #define GLAD_GNUC_EXTENSION __extension__ +#else + #define GLAD_GNUC_EXTENSION +#endif + +#define GLAD_UNUSED(x) (void)(x) + +#ifndef GLAD_API_CALL + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif +#endif + +#ifdef APIENTRY + #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 + #define GLAD_API_PTR __stdcall +#else + #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.8" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define EGL_ALPHA_FORMAT 0x3088 +#define EGL_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_ALPHA_FORMAT_PRE 0x308C +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BACK_BUFFER 0x3084 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_BLUE_SIZE 0x3022 +#define EGL_BUFFER_DESTROYED 0x3095 +#define EGL_BUFFER_PRESERVED 0x3094 +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_CLIENT_APIS 0x308D +#define EGL_CL_EVENT_HANDLE 0x309C +#define EGL_CL_EVENT_HANDLE_KHR 0x309C +#define EGL_COLORSPACE 0x3087 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_COLORSPACE_sRGB 0x3089 +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_CONDITION_SATISFIED 0x30F6 +#define EGL_CONDITION_SATISFIED_KHR 0x30F6 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_CONFORMANT 0x3042 +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 +#define EGL_CONTEXT_LOST 0x300E +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 +#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 +#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 +#define EGL_CORE_NATIVE_ENGINE 0x305B +#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_DISPLAY_SCALING 10000 +#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272 +#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444 +#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443 +#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273 +#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274 +#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275 +#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446 +#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445 +#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276 +#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277 +#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278 +#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448 +#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447 +#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279 +#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A +#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440 +#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A +#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449 +#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441 +#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442 +#define EGL_DONT_CARE EGL_CAST(EGLint,-1) +#define EGL_DRAW 0x3059 +#define EGL_EXTENSIONS 0x3055 +#define EGL_FALSE 0 +#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFF +#define EGL_GL_COLORSPACE 0x309D +#define EGL_GL_COLORSPACE_LINEAR 0x308A +#define EGL_GL_COLORSPACE_SRGB 0x3089 +#define EGL_GL_RENDERBUFFER 0x30B9 +#define EGL_GL_TEXTURE_2D 0x30B1 +#define EGL_GL_TEXTURE_3D 0x30B2 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 +#define EGL_GL_TEXTURE_LEVEL 0x30BC +#define EGL_GL_TEXTURE_ZOFFSET 0x30BD +#define EGL_GREEN_SIZE 0x3023 +#define EGL_HEIGHT 0x3056 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_IMAGE_PRESERVED 0x30D2 +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 +#define EGL_ITU_REC2020_EXT 0x3281 +#define EGL_ITU_REC601_EXT 0x327F +#define EGL_ITU_REC709_EXT 0x3280 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_LEVEL 0x3029 +#define EGL_LINUX_DMA_BUF_EXT 0x3270 +#define EGL_LINUX_DRM_FOURCC_EXT 0x3271 +#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF +#define EGL_LUMINANCE_BUFFER 0x308F +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_NONE 0x3038 +#define EGL_NON_CONFORMANT_CONFIG 0x3051 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) +#define EGL_NO_IMAGE EGL_CAST(EGLImage,0) +#define EGL_NO_IMAGE_KHR EGL_CAST(EGLImageKHR,0) +#define EGL_NO_RESET_NOTIFICATION 0x31BE +#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) +#define EGL_NO_SYNC EGL_CAST(EGLSync,0) +#define EGL_NO_SYNC_KHR EGL_CAST(EGLSync,0) +#define EGL_NO_TEXTURE 0x305C +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENVG_BIT 0x0002 +#define EGL_OPENVG_IMAGE 0x3096 +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_PIXMAP_BIT 0x0002 +#define EGL_PLATFORM_GBM_KHR 0x31D7 +#define EGL_PLATFORM_WAYLAND_EXT 0x31D8 +#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 +#define EGL_READ 0x305A +#define EGL_RED_SIZE 0x3024 +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_RGB_BUFFER 0x308E +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C +#define EGL_SIGNALED 0x30F2 +#define EGL_SIGNALED_KHR 0x30F2 +#define EGL_SINGLE_BUFFER 0x3085 +#define EGL_SLOW_CONFIG 0x3050 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_SUCCESS 0x3000 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 +#define EGL_SYNC_CL_EVENT 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF +#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF +#define EGL_SYNC_CL_EVENT_KHR 0x30FE +#define EGL_SYNC_CONDITION 0x30F8 +#define EGL_SYNC_CONDITION_KHR 0x30F8 +#define EGL_SYNC_FENCE 0x30F9 +#define EGL_SYNC_FENCE_KHR 0x30F9 +#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 +#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 +#define EGL_SYNC_REUSABLE_KHR 0x30FA +#define EGL_SYNC_STATUS 0x30F1 +#define EGL_SYNC_STATUS_KHR 0x30F1 +#define EGL_SYNC_TYPE 0x30F7 +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_TEXTURE_2D 0x305F +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_TARGET 0x3081 +#define EGL_TIMEOUT_EXPIRED 0x30F5 +#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_TRANSPARENT_RGB 0x3052 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRUE 1 +#define EGL_UNKNOWN EGL_CAST(EGLint,-1) +#define EGL_UNSIGNALED 0x30F3 +#define EGL_UNSIGNALED_KHR 0x30F3 +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_VERTICAL_RESOLUTION 0x3091 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_COLORSPACE_LINEAR 0x308A +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 +#define EGL_VG_COLORSPACE_sRGB 0x3089 +#define EGL_WIDTH 0x3057 +#define EGL_WINDOW_BIT 0x0004 +#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D +#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285 +#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284 +#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E +#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B +#define EGL_YUV_FULL_RANGE_EXT 0x3282 +#define EGL_YUV_NARROW_RANGE_EXT 0x3283 + + +#include +#include + + + + + + + + + + + +struct AHardwareBuffer; +struct wl_buffer; +struct wl_display; +struct wl_resource; + +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; +typedef intptr_t EGLAttribKHR; +typedef intptr_t EGLAttrib; +typedef void *EGLClientBuffer; +typedef void *EGLConfig; +typedef void *EGLContext; +typedef void *EGLDeviceEXT; +typedef void *EGLDisplay; +typedef void *EGLImage; +typedef void *EGLImageKHR; +typedef void *EGLLabelKHR; +typedef void *EGLObjectKHR; +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +typedef void *EGLStreamKHR; +typedef void *EGLSurface; +typedef void *EGLSync; +typedef void *EGLSyncKHR; +typedef void *EGLSyncNV; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); +typedef khronos_utime_nanoseconds_t EGLTimeKHR; +typedef khronos_utime_nanoseconds_t EGLTime; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +typedef khronos_utime_nanoseconds_t EGLuint64NV; +typedef khronos_uint64_t EGLuint64KHR; +typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; +typedef int EGLNativeFileDescriptorKHR; +typedef khronos_ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +struct EGLClientPixmapHI { + void *pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; +typedef void (GLAD_API_PTR *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); +#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC +#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC +#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC +#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC + + +#define EGL_VERSION_1_0 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_0; +#define EGL_VERSION_1_1 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_1; +#define EGL_VERSION_1_2 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_2; +#define EGL_VERSION_1_3 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_3; +#define EGL_VERSION_1_4 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_4; +#define EGL_VERSION_1_5 1 +GLAD_API_CALL int GLAD_EGL_VERSION_1_5; +#define EGL_EXT_image_dma_buf_import 1 +GLAD_API_CALL int GLAD_EGL_EXT_image_dma_buf_import; +#define EGL_EXT_image_dma_buf_import_modifiers 1 +GLAD_API_CALL int GLAD_EGL_EXT_image_dma_buf_import_modifiers; +#define EGL_EXT_platform_base 1 +GLAD_API_CALL int GLAD_EGL_EXT_platform_base; +#define EGL_EXT_platform_wayland 1 +GLAD_API_CALL int GLAD_EGL_EXT_platform_wayland; +#define EGL_KHR_cl_event2 1 +GLAD_API_CALL int GLAD_EGL_KHR_cl_event2; +#define EGL_KHR_fence_sync 1 +GLAD_API_CALL int GLAD_EGL_KHR_fence_sync; +#define EGL_KHR_image 1 +GLAD_API_CALL int GLAD_EGL_KHR_image; +#define EGL_KHR_image_base 1 +GLAD_API_CALL int GLAD_EGL_KHR_image_base; +#define EGL_KHR_platform_gbm 1 +GLAD_API_CALL int GLAD_EGL_KHR_platform_gbm; +#define EGL_KHR_reusable_sync 1 +GLAD_API_CALL int GLAD_EGL_KHR_reusable_sync; + + +typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDAPIPROC)(EGLenum api); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLBINDTEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLCHOOSECONFIGPROC)(EGLDisplay dpy, const EGLint * attrib_list, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLint (GLAD_API_PTR *PFNEGLCLIENTWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +typedef EGLint (GLAD_API_PTR *PFNEGLCLIENTWAITSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLCOPYBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +typedef EGLContext (GLAD_API_PTR *PFNEGLCREATECONTEXTPROC)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint * attrib_list); +typedef EGLImage (GLAD_API_PTR *PFNEGLCREATEIMAGEPROC)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib * attrib_list); +typedef EGLImageKHR (GLAD_API_PTR *PFNEGLCREATEIMAGEKHRPROC)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC)(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPBUFFERSURFACEPROC)(EGLDisplay dpy, EGLConfig config, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLAttrib * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)(EGLDisplay dpy, EGLConfig config, void * native_pixmap, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, void * native_window, const EGLAttrib * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)(EGLDisplay dpy, EGLConfig config, void * native_window, const EGLint * attrib_list); +typedef EGLSync (GLAD_API_PTR *PFNEGLCREATESYNCPROC)(EGLDisplay dpy, EGLenum type, const EGLAttrib * attrib_list); +typedef EGLSyncKHR (GLAD_API_PTR *PFNEGLCREATESYNC64KHRPROC)(EGLDisplay dpy, EGLenum type, const EGLAttribKHR * attrib_list); +typedef EGLSyncKHR (GLAD_API_PTR *PFNEGLCREATESYNCKHRPROC)(EGLDisplay dpy, EGLenum type, const EGLint * attrib_list); +typedef EGLSurface (GLAD_API_PTR *PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint * attrib_list); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEPROC)(EGLDisplay dpy, EGLImage image); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYIMAGEKHRPROC)(EGLDisplay dpy, EGLImageKHR image); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSYNCPROC)(EGLDisplay dpy, EGLSync sync); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLDESTROYSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGATTRIBPROC)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETCONFIGSPROC)(EGLDisplay dpy, EGLConfig * configs, EGLint config_size, EGLint * num_config); +typedef EGLContext (GLAD_API_PTR *PFNEGLGETCURRENTCONTEXTPROC)(void); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETCURRENTDISPLAYPROC)(void); +typedef EGLSurface (GLAD_API_PTR *PFNEGLGETCURRENTSURFACEPROC)(EGLint readdraw); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType display_id); +typedef EGLint (GLAD_API_PTR *PFNEGLGETERRORPROC)(void); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYPROC)(EGLenum platform, void * native_display, const EGLAttrib * attrib_list); +typedef EGLDisplay (GLAD_API_PTR *PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum platform, void * native_display, const EGLint * attrib_list); +typedef __eglMustCastToProperFunctionPointerType (GLAD_API_PTR *PFNEGLGETPROCADDRESSPROC)(const char * procname); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETSYNCATTRIBPROC)(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLGETSYNCATTRIBKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLINITIALIZEPROC)(EGLDisplay dpy, EGLint * major, EGLint * minor); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLMAKECURRENTPROC)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +typedef EGLenum (GLAD_API_PTR *PFNEGLQUERYAPIPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYCONTEXTPROC)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDMABUFFORMATSEXTPROC)(EGLDisplay dpy, EGLint max_formats, EGLint * formats, EGLint * num_formats); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYDMABUFMODIFIERSEXTPROC)(EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR * modifiers, EGLBoolean * external_only, EGLint * num_modifiers); +typedef const char * (GLAD_API_PTR *PFNEGLQUERYSTRINGPROC)(EGLDisplay dpy, EGLint name); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLQUERYSURFACEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint * value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETEXIMAGEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLRELEASETHREADPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSIGNALSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSURFACEATTRIBPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPBUFFERSPROC)(EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLSWAPINTERVALPROC)(EGLDisplay dpy, EGLint interval); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLTERMINATEPROC)(EGLDisplay dpy); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITCLIENTPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITGLPROC)(void); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITNATIVEPROC)(EGLint engine); +typedef EGLBoolean (GLAD_API_PTR *PFNEGLWAITSYNCPROC)(EGLDisplay dpy, EGLSync sync, EGLint flags); + +GLAD_API_CALL PFNEGLBINDAPIPROC glad_eglBindAPI; +#define eglBindAPI glad_eglBindAPI +GLAD_API_CALL PFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage; +#define eglBindTexImage glad_eglBindTexImage +GLAD_API_CALL PFNEGLCHOOSECONFIGPROC glad_eglChooseConfig; +#define eglChooseConfig glad_eglChooseConfig +GLAD_API_CALL PFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync; +#define eglClientWaitSync glad_eglClientWaitSync +GLAD_API_CALL PFNEGLCLIENTWAITSYNCKHRPROC glad_eglClientWaitSyncKHR; +#define eglClientWaitSyncKHR glad_eglClientWaitSyncKHR +GLAD_API_CALL PFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers; +#define eglCopyBuffers glad_eglCopyBuffers +GLAD_API_CALL PFNEGLCREATECONTEXTPROC glad_eglCreateContext; +#define eglCreateContext glad_eglCreateContext +GLAD_API_CALL PFNEGLCREATEIMAGEPROC glad_eglCreateImage; +#define eglCreateImage glad_eglCreateImage +GLAD_API_CALL PFNEGLCREATEIMAGEKHRPROC glad_eglCreateImageKHR; +#define eglCreateImageKHR glad_eglCreateImageKHR +GLAD_API_CALL PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer; +#define eglCreatePbufferFromClientBuffer glad_eglCreatePbufferFromClientBuffer +GLAD_API_CALL PFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface; +#define eglCreatePbufferSurface glad_eglCreatePbufferSurface +GLAD_API_CALL PFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface; +#define eglCreatePixmapSurface glad_eglCreatePixmapSurface +GLAD_API_CALL PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface; +#define eglCreatePlatformPixmapSurface glad_eglCreatePlatformPixmapSurface +GLAD_API_CALL PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC glad_eglCreatePlatformPixmapSurfaceEXT; +#define eglCreatePlatformPixmapSurfaceEXT glad_eglCreatePlatformPixmapSurfaceEXT +GLAD_API_CALL PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface; +#define eglCreatePlatformWindowSurface glad_eglCreatePlatformWindowSurface +GLAD_API_CALL PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC glad_eglCreatePlatformWindowSurfaceEXT; +#define eglCreatePlatformWindowSurfaceEXT glad_eglCreatePlatformWindowSurfaceEXT +GLAD_API_CALL PFNEGLCREATESYNCPROC glad_eglCreateSync; +#define eglCreateSync glad_eglCreateSync +GLAD_API_CALL PFNEGLCREATESYNC64KHRPROC glad_eglCreateSync64KHR; +#define eglCreateSync64KHR glad_eglCreateSync64KHR +GLAD_API_CALL PFNEGLCREATESYNCKHRPROC glad_eglCreateSyncKHR; +#define eglCreateSyncKHR glad_eglCreateSyncKHR +GLAD_API_CALL PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface; +#define eglCreateWindowSurface glad_eglCreateWindowSurface +GLAD_API_CALL PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext; +#define eglDestroyContext glad_eglDestroyContext +GLAD_API_CALL PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage; +#define eglDestroyImage glad_eglDestroyImage +GLAD_API_CALL PFNEGLDESTROYIMAGEKHRPROC glad_eglDestroyImageKHR; +#define eglDestroyImageKHR glad_eglDestroyImageKHR +GLAD_API_CALL PFNEGLDESTROYSURFACEPROC glad_eglDestroySurface; +#define eglDestroySurface glad_eglDestroySurface +GLAD_API_CALL PFNEGLDESTROYSYNCPROC glad_eglDestroySync; +#define eglDestroySync glad_eglDestroySync +GLAD_API_CALL PFNEGLDESTROYSYNCKHRPROC glad_eglDestroySyncKHR; +#define eglDestroySyncKHR glad_eglDestroySyncKHR +GLAD_API_CALL PFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib; +#define eglGetConfigAttrib glad_eglGetConfigAttrib +GLAD_API_CALL PFNEGLGETCONFIGSPROC glad_eglGetConfigs; +#define eglGetConfigs glad_eglGetConfigs +GLAD_API_CALL PFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext; +#define eglGetCurrentContext glad_eglGetCurrentContext +GLAD_API_CALL PFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay; +#define eglGetCurrentDisplay glad_eglGetCurrentDisplay +GLAD_API_CALL PFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface; +#define eglGetCurrentSurface glad_eglGetCurrentSurface +GLAD_API_CALL PFNEGLGETDISPLAYPROC glad_eglGetDisplay; +#define eglGetDisplay glad_eglGetDisplay +GLAD_API_CALL PFNEGLGETERRORPROC glad_eglGetError; +#define eglGetError glad_eglGetError +GLAD_API_CALL PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay; +#define eglGetPlatformDisplay glad_eglGetPlatformDisplay +GLAD_API_CALL PFNEGLGETPLATFORMDISPLAYEXTPROC glad_eglGetPlatformDisplayEXT; +#define eglGetPlatformDisplayEXT glad_eglGetPlatformDisplayEXT +GLAD_API_CALL PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress; +#define eglGetProcAddress glad_eglGetProcAddress +GLAD_API_CALL PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib; +#define eglGetSyncAttrib glad_eglGetSyncAttrib +GLAD_API_CALL PFNEGLGETSYNCATTRIBKHRPROC glad_eglGetSyncAttribKHR; +#define eglGetSyncAttribKHR glad_eglGetSyncAttribKHR +GLAD_API_CALL PFNEGLINITIALIZEPROC glad_eglInitialize; +#define eglInitialize glad_eglInitialize +GLAD_API_CALL PFNEGLMAKECURRENTPROC glad_eglMakeCurrent; +#define eglMakeCurrent glad_eglMakeCurrent +GLAD_API_CALL PFNEGLQUERYAPIPROC glad_eglQueryAPI; +#define eglQueryAPI glad_eglQueryAPI +GLAD_API_CALL PFNEGLQUERYCONTEXTPROC glad_eglQueryContext; +#define eglQueryContext glad_eglQueryContext +GLAD_API_CALL PFNEGLQUERYDMABUFFORMATSEXTPROC glad_eglQueryDmaBufFormatsEXT; +#define eglQueryDmaBufFormatsEXT glad_eglQueryDmaBufFormatsEXT +GLAD_API_CALL PFNEGLQUERYDMABUFMODIFIERSEXTPROC glad_eglQueryDmaBufModifiersEXT; +#define eglQueryDmaBufModifiersEXT glad_eglQueryDmaBufModifiersEXT +GLAD_API_CALL PFNEGLQUERYSTRINGPROC glad_eglQueryString; +#define eglQueryString glad_eglQueryString +GLAD_API_CALL PFNEGLQUERYSURFACEPROC glad_eglQuerySurface; +#define eglQuerySurface glad_eglQuerySurface +GLAD_API_CALL PFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage; +#define eglReleaseTexImage glad_eglReleaseTexImage +GLAD_API_CALL PFNEGLRELEASETHREADPROC glad_eglReleaseThread; +#define eglReleaseThread glad_eglReleaseThread +GLAD_API_CALL PFNEGLSIGNALSYNCKHRPROC glad_eglSignalSyncKHR; +#define eglSignalSyncKHR glad_eglSignalSyncKHR +GLAD_API_CALL PFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib; +#define eglSurfaceAttrib glad_eglSurfaceAttrib +GLAD_API_CALL PFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers; +#define eglSwapBuffers glad_eglSwapBuffers +GLAD_API_CALL PFNEGLSWAPINTERVALPROC glad_eglSwapInterval; +#define eglSwapInterval glad_eglSwapInterval +GLAD_API_CALL PFNEGLTERMINATEPROC glad_eglTerminate; +#define eglTerminate glad_eglTerminate +GLAD_API_CALL PFNEGLWAITCLIENTPROC glad_eglWaitClient; +#define eglWaitClient glad_eglWaitClient +GLAD_API_CALL PFNEGLWAITGLPROC glad_eglWaitGL; +#define eglWaitGL glad_eglWaitGL +GLAD_API_CALL PFNEGLWAITNATIVEPROC glad_eglWaitNative; +#define eglWaitNative glad_eglWaitNative +GLAD_API_CALL PFNEGLWAITSYNCPROC glad_eglWaitSync; +#define eglWaitSync glad_eglWaitSync + + + + + +GLAD_API_CALL int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadEGL(EGLDisplay display, GLADloadfunc load); + + +#ifdef __cplusplus +} +#endif + +#endif /*LV_USE_EGL*/ +#endif diff --git a/inc/lvgl/src/drivers/opengles/glad/include/glad/gl.h b/inc/lvgl/src/drivers/opengles/glad/include/glad/gl.h new file mode 100644 index 0000000..102d62e --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/glad/include/glad/gl.h @@ -0,0 +1,6933 @@ +/** + * Loader generated by glad 2.0.8 on Fri Nov 28 10:05:17 2025 + * + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + * + * Generator: C/C++ + * Specification: gl + * Extensions: 75 + * + * APIs: + * - gl:compatibility=3.3 + * + * Options: + * - ALIAS = True + * - DEBUG = False + * - HEADER_ONLY = False + * - LOADER = False + * - MX = False + * - ON_DEMAND = False + * + * Commandline: + * --api='gl:compatibility=3.3' --extensions='GL_APPLE_flush_buffer_range,GL_APPLE_vertex_array_object,GL_ARB_blend_func_extended,GL_ARB_color_buffer_float,GL_ARB_copy_buffer,GL_ARB_draw_buffers,GL_ARB_draw_elements_base_vertex,GL_ARB_draw_instanced,GL_ARB_framebuffer_object,GL_ARB_geometry_shader4,GL_ARB_imaging,GL_ARB_instanced_arrays,GL_ARB_map_buffer_range,GL_ARB_multisample,GL_ARB_multitexture,GL_ARB_occlusion_query,GL_ARB_point_parameters,GL_ARB_provoking_vertex,GL_ARB_sampler_objects,GL_ARB_shader_objects,GL_ARB_sync,GL_ARB_texture_buffer_object,GL_ARB_texture_compression,GL_ARB_texture_multisample,GL_ARB_timer_query,GL_ARB_transpose_matrix,GL_ARB_uniform_buffer_object,GL_ARB_vertex_array_object,GL_ARB_vertex_buffer_object,GL_ARB_vertex_program,GL_ARB_vertex_shader,GL_ARB_vertex_type_2_10_10_10_rev,GL_ARB_window_pos,GL_ATI_draw_buffers,GL_ATI_separate_stencil,GL_EXT_blend_color,GL_EXT_blend_equation_separate,GL_EXT_blend_func_separate,GL_EXT_blend_minmax,GL_EXT_copy_texture,GL_EXT_direct_state_access,GL_EXT_draw_buffers2,GL_EXT_draw_instanced,GL_EXT_draw_range_elements,GL_EXT_fog_coord,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_gpu_shader4,GL_EXT_multi_draw_arrays,GL_EXT_point_parameters,GL_EXT_provoking_vertex,GL_EXT_secondary_color,GL_EXT_subtexture,GL_EXT_texture3D,GL_EXT_texture_array,GL_EXT_texture_buffer_object,GL_EXT_texture_integer,GL_EXT_texture_object,GL_EXT_texture_storage,GL_EXT_timer_query,GL_EXT_transform_feedback,GL_EXT_vertex_array,GL_INGR_blend_func_separate,GL_KHR_debug,GL_MESA_window_pos,GL_NVX_conditional_render,GL_NV_conditional_render,GL_NV_explicit_multisample,GL_NV_geometry_program4,GL_NV_point_sprite,GL_NV_transform_feedback,GL_NV_vertex_program,GL_NV_vertex_program4,GL_SGIS_point_parameters' c --alias + * + * Online: + * http://glad.sh/#api=gl%3Acompatibility%3D3.3&extensions=GL_APPLE_flush_buffer_range%2CGL_APPLE_vertex_array_object%2CGL_ARB_blend_func_extended%2CGL_ARB_color_buffer_float%2CGL_ARB_copy_buffer%2CGL_ARB_draw_buffers%2CGL_ARB_draw_elements_base_vertex%2CGL_ARB_draw_instanced%2CGL_ARB_framebuffer_object%2CGL_ARB_geometry_shader4%2CGL_ARB_imaging%2CGL_ARB_instanced_arrays%2CGL_ARB_map_buffer_range%2CGL_ARB_multisample%2CGL_ARB_multitexture%2CGL_ARB_occlusion_query%2CGL_ARB_point_parameters%2CGL_ARB_provoking_vertex%2CGL_ARB_sampler_objects%2CGL_ARB_shader_objects%2CGL_ARB_sync%2CGL_ARB_texture_buffer_object%2CGL_ARB_texture_compression%2CGL_ARB_texture_multisample%2CGL_ARB_timer_query%2CGL_ARB_transpose_matrix%2CGL_ARB_uniform_buffer_object%2CGL_ARB_vertex_array_object%2CGL_ARB_vertex_buffer_object%2CGL_ARB_vertex_program%2CGL_ARB_vertex_shader%2CGL_ARB_vertex_type_2_10_10_10_rev%2CGL_ARB_window_pos%2CGL_ATI_draw_buffers%2CGL_ATI_separate_stencil%2CGL_EXT_blend_color%2CGL_EXT_blend_equation_separate%2CGL_EXT_blend_func_separate%2CGL_EXT_blend_minmax%2CGL_EXT_copy_texture%2CGL_EXT_direct_state_access%2CGL_EXT_draw_buffers2%2CGL_EXT_draw_instanced%2CGL_EXT_draw_range_elements%2CGL_EXT_fog_coord%2CGL_EXT_framebuffer_blit%2CGL_EXT_framebuffer_multisample%2CGL_EXT_framebuffer_object%2CGL_EXT_gpu_shader4%2CGL_EXT_multi_draw_arrays%2CGL_EXT_point_parameters%2CGL_EXT_provoking_vertex%2CGL_EXT_secondary_color%2CGL_EXT_subtexture%2CGL_EXT_texture3D%2CGL_EXT_texture_array%2CGL_EXT_texture_buffer_object%2CGL_EXT_texture_integer%2CGL_EXT_texture_object%2CGL_EXT_texture_storage%2CGL_EXT_timer_query%2CGL_EXT_transform_feedback%2CGL_EXT_vertex_array%2CGL_INGR_blend_func_separate%2CGL_KHR_debug%2CGL_MESA_window_pos%2CGL_NVX_conditional_render%2CGL_NV_conditional_render%2CGL_NV_explicit_multisample%2CGL_NV_geometry_program4%2CGL_NV_point_sprite%2CGL_NV_transform_feedback%2CGL_NV_vertex_program%2CGL_NV_vertex_program4%2CGL_SGIS_point_parameters&generator=c&options=ALIAS + * + */ + +#ifndef GLAD_GL_H_ +#define GLAD_GL_H_ + +#include "../../../../../lv_conf_internal.h" + +#if LV_USE_OPENGLES && !LV_USE_EGL + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-id-macro" +#endif +#ifdef __gl_h_ + #error OpenGL (gl.h) header already included (API: gl), remove previous include! +#endif +#define __gl_h_ 1 +#ifdef __gl3_h_ + #error OpenGL (gl3.h) header already included (API: gl), remove previous include! +#endif +#define __gl3_h_ 1 +#ifdef __glext_h_ + #error OpenGL (glext.h) header already included (API: gl), remove previous include! +#endif +#define __glext_h_ 1 +#ifdef __gl3ext_h_ + #error OpenGL (gl3ext.h) header already included (API: gl), remove previous include! +#endif +#define __gl3ext_h_ 1 +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#define GLAD_GL +#define GLAD_OPTION_GL_ALIAS + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_UWP + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif + + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif + + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif +#endif + +#ifdef __GNUC__ + #define GLAD_GNUC_EXTENSION __extension__ +#else + #define GLAD_GNUC_EXTENSION +#endif + +#define GLAD_UNUSED(x) (void)(x) + +#ifndef GLAD_API_CALL + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif +#endif + +#ifdef APIENTRY + #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 + #define GLAD_API_PTR __stdcall +#else + #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.8" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define GL_2D 0x0600 +#define GL_2_BYTES 0x1407 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_3_BYTES 0x1408 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_4_BYTES 0x1409 +#define GL_ACCUM 0x0100 +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_ADD 0x0104 +#define GL_ADD_SIGNED 0x8574 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_ALPHA 0x1906 +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_ALPHA16F_EXT 0x881C +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_ALPHA_BITS 0x0D55 +#define GL_ALPHA_INTEGER 0x8D97 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_ALWAYS 0x0207 +#define GL_AMBIENT 0x1200 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_AND 0x1501 +#define GL_AND_INVERTED 0x1504 +#define GL_AND_REVERSE 0x1502 +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_AUX_BUFFERS 0x0C00 +#define GL_BACK 0x0405 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_RIGHT 0x0403 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_BGRA8_EXT 0x93A1 +#define GL_BGRA_INTEGER 0x8D9B +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BITMAP 0x1A00 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_BLEND 0x0BE2 +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_COLOR_EXT 0x8005 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +#define GL_BLEND_EQUATION_EXT 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLUE 0x1905 +#define GL_BLUE_BIAS 0x0D1B +#define GL_BLUE_BITS 0x0D54 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BOOL 0x8B56 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_BUFFER 0x82E0 +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_BYTE 0x1400 +#define GL_C3F_V3F 0x2A24 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_CCW 0x0901 +#define GL_CLAMP 0x2900 +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLEAR 0x1500 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_COEFF 0x0A00 +#define GL_COLOR 0x1800 +#define GL_COLOR_ARRAY 0x8076 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_COLOR_ATTACHMENT16 0x8CF0 +#define GL_COLOR_ATTACHMENT17 0x8CF1 +#define GL_COLOR_ATTACHMENT18 0x8CF2 +#define GL_COLOR_ATTACHMENT19 0x8CF3 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT20 0x8CF4 +#define GL_COLOR_ATTACHMENT21 0x8CF5 +#define GL_COLOR_ATTACHMENT22 0x8CF6 +#define GL_COLOR_ATTACHMENT23 0x8CF7 +#define GL_COLOR_ATTACHMENT24 0x8CF8 +#define GL_COLOR_ATTACHMENT25 0x8CF9 +#define GL_COLOR_ATTACHMENT26 0x8CFA +#define GL_COLOR_ATTACHMENT27 0x8CFB +#define GL_COLOR_ATTACHMENT28 0x8CFC +#define GL_COLOR_ATTACHMENT29 0x8CFD +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_INDEX 0x1900 +#define GL_COLOR_INDEXES 0x1603 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_COLOR_SUM 0x8458 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_COLOR_TABLE 0x80D0 +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_COMBINE 0x8570 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_RG 0x8226 +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +#define GL_CONDITION_SATISFIED 0x911C +#define GL_CONSTANT 0x8576 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_FLAGS 0x821E +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_COORD_REPLACE 0x8862 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_CURRENT_BIT 0x00000001 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_CURRENT_QUERY 0x8865 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_CW 0x0900 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DECAL 0x2101 +#define GL_DECR 0x1E03 +#define GL_DECR_WRAP 0x8508 +#define GL_DELETE_STATUS 0x8B80 +#define GL_DEPTH 0x1801 +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_DEPTH_BIAS 0x0D1F +#define GL_DEPTH_BITS 0x0D56 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_DEPTH_CLAMP 0x864F +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DIFFUSE 0x1201 +#define GL_DISPLAY_LIST 0x82E7 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +#define GL_DITHER 0x0BD0 +#define GL_DOMAIN 0x0A02 +#define GL_DONT_CARE 0x1100 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_DOUBLE 0x140A +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#define GL_DRAW_BUFFER15_ATI 0x8834 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_DST_ALPHA 0x0304 +#define GL_DST_COLOR 0x0306 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_DYNAMIC_COPY_ARB 0x88EA +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_EDGE_FLAG 0x0B43 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_EMISSION 0x1600 +#define GL_ENABLE_BIT 0x00002000 +#define GL_EQUAL 0x0202 +#define GL_EQUIV 0x1509 +#define GL_EVAL_BIT 0x00010000 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 +#define GL_EXTENSIONS 0x1F03 +#define GL_EYE_LINEAR 0x2400 +#define GL_EYE_PLANE 0x2502 +#define GL_FALSE 0 +#define GL_FASTEST 0x1101 +#define GL_FEEDBACK 0x1C01 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_FILL 0x1B02 +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_FIXED_ONLY 0x891D +#define GL_FIXED_ONLY_ARB 0x891D +#define GL_FLAT 0x1D00 +#define GL_FLOAT 0x1406 +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4 0x8B5C +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_FOG 0x0B60 +#define GL_FOG_BIT 0x00000080 +#define GL_FOG_COLOR 0x0B66 +#define GL_FOG_COORD 0x8451 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_END 0x0B64 +#define GL_FOG_HINT 0x0C54 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_START 0x0B63 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_FRAMEBUFFER 0x8D40 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_FRONT 0x0404 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_FRONT_FACE 0x0B46 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_FUNC_SUBTRACT 0x800A +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEQUAL 0x0206 +#define GL_GREATER 0x0204 +#define GL_GREEN 0x1904 +#define GL_GREEN_BIAS 0x0D19 +#define GL_GREEN_BITS 0x0D53 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_GREEN_SCALE 0x0D18 +#define GL_HALF_FLOAT 0x140B +#define GL_HINT_BIT 0x00008000 +#define GL_HISTOGRAM 0x8024 +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_SINK 0x802D +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_IDENTITY_NV 0x862A +#define GL_INCR 0x1E02 +#define GL_INCR_WRAP 0x8507 +#define GL_INDEX 0x8222 +#define GL_INDEX_ARRAY 0x8077 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_BITS 0x0D51 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_INDEX_MODE 0x0C30 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_INT 0x1404 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_INTERPOLATE 0x8575 +#define GL_INT_2_10_10_10_REV 0x8D9F +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_INVALID_INDEX 0xFFFFFFFF +#define GL_INVALID_OPERATION 0x0502 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVERSE_NV 0x862B +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_INVERT 0x150A +#define GL_KEEP 0x1E00 +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_LAYER_NV 0x8DAA +#define GL_LEFT 0x0406 +#define GL_LEQUAL 0x0203 +#define GL_LESS 0x0201 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LINE 0x1B01 +#define GL_LINEAR 0x2601 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINES 0x0001 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_BIT 0x00000004 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LINE_STRIP 0x0003 +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_LINE_TOKEN 0x0702 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINK_STATUS 0x8B82 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_BIT 0x00020000 +#define GL_LIST_INDEX 0x0B33 +#define GL_LIST_MODE 0x0B30 +#define GL_LOAD 0x0101 +#define GL_LOGIC_OP 0x0BF1 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_MAJOR_VERSION 0x821B +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_STENCIL 0x0D11 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX7_NV 0x8637 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_MAX 0x8008 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_EXT 0x8008 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_MAX_SAMPLES_EXT 0x8D57 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MIN 0x8007 +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_MINOR_VERSION 0x821C +#define GL_MIN_EXT 0x8007 +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MODELVIEW 0x1700 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_MODULATE 0x2100 +#define GL_MULT 0x0103 +#define GL_MULTISAMPLE 0x809D +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#define GL_N3F_V3F 0x2A25 +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_NAND 0x150E +#define GL_NEAREST 0x2600 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEVER 0x0200 +#define GL_NEXT_BUFFER_NV -2 +#define GL_NICEST 0x1102 +#define GL_NONE 0 +#define GL_NOOP 0x1505 +#define GL_NOR 0x1508 +#define GL_NORMALIZE 0x0BA1 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_MAP 0x8511 +#define GL_NOTEQUAL 0x0205 +#define GL_NO_ERROR 0 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_NUM_EXTENSIONS 0x821D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_PLANE 0x2501 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_OBJECT_TYPE 0x9112 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_ONE 1 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_OPERAND2_RGB 0x8592 +#define GL_OR 0x1507 +#define GL_ORDER 0x0A01 +#define GL_OR_INVERTED 0x150D +#define GL_OR_REVERSE 0x150B +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_POINT 0x1B00 +#define GL_POINTS 0x0000 +#define GL_POINT_BIT 0x00000002 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_POINT_SPRITE 0x8861 +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +#define GL_POINT_TOKEN 0x0701 +#define GL_POLYGON 0x0009 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_POSITION 0x1203 +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_PREVIOUS 0x8578 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_PROGRAM 0x82E2 +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROJECTION 0x1701 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_Q 0x2003 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_QUADS 0x0007 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_QUAD_STRIP 0x0008 +#define GL_QUERY 0x82E3 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_R 0x2002 +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_R16 0x822A +#define GL_R16F 0x822D +#define GL_R16F_EXT 0x822D +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R16_SNORM 0x8F98 +#define GL_R32F 0x822E +#define GL_R32F_EXT 0x822E +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_R3_G3_B2 0x2A10 +#define GL_R8 0x8229 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R8_EXT 0x8229 +#define GL_R8_SNORM 0x8F94 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_READ_BUFFER 0x0C02 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_READ_ONLY 0x88B8 +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_READ_WRITE 0x88BA +#define GL_READ_WRITE_ARB 0x88BA +#define GL_RED 0x1903 +#define GL_REDUCE 0x8016 +#define GL_RED_BIAS 0x0D15 +#define GL_RED_BITS 0x0D52 +#define GL_RED_INTEGER 0x8D94 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_RED_SCALE 0x0D14 +#define GL_REFLECTION_MAP 0x8512 +#define GL_RENDER 0x1C00 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERER 0x1F01 +#define GL_RENDER_MODE 0x0C40 +#define GL_REPEAT 0x2901 +#define GL_REPLACE 0x1E01 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_RESCALE_NORMAL 0x803A +#define GL_RETURN 0x0102 +#define GL_RG 0x8227 +#define GL_RG16 0x822C +#define GL_RG16F 0x822F +#define GL_RG16F_EXT 0x822F +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG16_SNORM 0x8F99 +#define GL_RG32F 0x8230 +#define GL_RG32F_EXT 0x8230 +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_RG8 0x822B +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG8_EXT 0x822B +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB 0x1907 +#define GL_RGB10 0x8052 +#define GL_RGB10_A2 0x8059 +#define GL_RGB10_A2UI 0x906F +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGB16F 0x881B +#define GL_RGB16F_EXT 0x881B +#define GL_RGB16I 0x8D89 +#define GL_RGB16I_EXT 0x8D89 +#define GL_RGB16UI 0x8D77 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGB32F 0x8815 +#define GL_RGB32F_EXT 0x8815 +#define GL_RGB32I 0x8D83 +#define GL_RGB32I_EXT 0x8D83 +#define GL_RGB32UI 0x8D71 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB5_A1 0x8057 +#define GL_RGB8 0x8051 +#define GL_RGB8I 0x8D8F +#define GL_RGB8I_EXT 0x8D8F +#define GL_RGB8UI 0x8D7D +#define GL_RGB8UI_EXT 0x8D7D +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGB9_E5 0x8C3D +#define GL_RGBA 0x1908 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_RGBA16F 0x881A +#define GL_RGBA16F_EXT 0x881A +#define GL_RGBA16I 0x8D88 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGBA16UI 0x8D76 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGBA16_SNORM 0x8F9B +#define GL_RGBA2 0x8055 +#define GL_RGBA32F 0x8814 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGBA32I 0x8D82 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGBA32UI 0x8D70 +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGBA4 0x8056 +#define GL_RGBA8 0x8058 +#define GL_RGBA8I 0x8D8E +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGBA8UI 0x8D7C +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGBA8_SNORM 0x8F97 +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +#define GL_RGBA_MODE 0x0C31 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGB_SCALE 0x8573 +#define GL_RG_INTEGER 0x8228 +#define GL_RIGHT 0x0407 +#define GL_S 0x2000 +#define GL_SAMPLER 0x82E6 +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SELECT 0x1C02 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_SEPARABLE_2D 0x8012 +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_SET 0x150F +#define GL_SHADER 0x82E1 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_TYPE 0x8B4F +#define GL_SHADE_MODEL 0x0B54 +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_SHININESS 0x1601 +#define GL_SHORT 0x1402 +#define GL_SIGNALED 0x9119 +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SKIP_COMPONENTS1_NV -6 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SMOOTH 0x1D01 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_SOURCE2_RGB 0x8582 +#define GL_SPECULAR 0x1202 +#define GL_SPHERE_MAP 0x2402 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_ALPHA 0x8589 +#define GL_SRC1_COLOR 0x88F9 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_ALPHA 0x858A +#define GL_SRC2_RGB 0x8582 +#define GL_SRC_ALPHA 0x0302 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_SRC_COLOR 0x0300 +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_STATIC_COPY 0x88E6 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STENCIL 0x1802 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_STENCIL_BITS 0x0D57 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STEREO 0x0C33 +#define GL_STREAM_COPY 0x88E2 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_SUBTRACT 0x84E7 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_SYNC_STATUS 0x9114 +#define GL_T 0x2001 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_T4F_V4F 0x2A28 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_TEXTURE 0x1702 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_TEXTURE31_ARB 0x84DF +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_TEXTURE_3D 0x806F +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_TEXTURE_ENV 0x2300 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF +#define GL_TIMESTAMP 0x8E28 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIME_ELAPSED_EXT 0x88BF +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_NV 0x862C +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_FAN 0x0006 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_TRUE 1 +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNSIGNALED 0x9118 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_INT 0x1405 +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_VENDOR 0x1F00 +#define GL_VERSION 0x1F02 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_VIEWPORT 0x0BA2 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_WAIT_FAILED 0x911D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_WRITE_ONLY 0x88B9 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_XOR 0x1506 +#define GL_ZERO 0 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 + + +#include +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef int GLint; +typedef unsigned int GLuint; +typedef khronos_int32_t GLclampx; +typedef int GLsizei; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void *GLeglClientBufferEXT; +typedef void *GLeglImageOES; +typedef char GLchar; +typedef char GLcharARB; +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef khronos_uint16_t GLhalf; +typedef khronos_uint16_t GLhalfARB; +typedef khronos_int32_t GLfixed; +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptr; +#else +typedef khronos_intptr_t GLintptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptrARB; +#else +typedef khronos_intptr_t GLintptrARB; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptr; +#else +typedef khronos_ssize_t GLsizeiptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptrARB; +#else +typedef khronos_ssize_t GLsizeiptrARB; +#endif +typedef khronos_int64_t GLint64; +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64; +typedef khronos_uint64_t GLuint64EXT; +typedef struct __GLsync *GLsync; +struct _cl_context; +struct _cl_event; +typedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef unsigned short GLhalfNV; +typedef GLintptr GLvdpauSurfaceNV; +typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void); + + +#define GL_VERSION_1_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_0; +#define GL_VERSION_1_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_1; +#define GL_VERSION_1_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_2; +#define GL_VERSION_1_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_3; +#define GL_VERSION_1_4 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_4; +#define GL_VERSION_1_5 1 +GLAD_API_CALL int GLAD_GL_VERSION_1_5; +#define GL_VERSION_2_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_2_0; +#define GL_VERSION_2_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_2_1; +#define GL_VERSION_3_0 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_0; +#define GL_VERSION_3_1 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_1; +#define GL_VERSION_3_2 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_2; +#define GL_VERSION_3_3 1 +GLAD_API_CALL int GLAD_GL_VERSION_3_3; +#define GL_APPLE_flush_buffer_range 1 +GLAD_API_CALL int GLAD_GL_APPLE_flush_buffer_range; +#define GL_APPLE_vertex_array_object 1 +GLAD_API_CALL int GLAD_GL_APPLE_vertex_array_object; +#define GL_ARB_blend_func_extended 1 +GLAD_API_CALL int GLAD_GL_ARB_blend_func_extended; +#define GL_ARB_color_buffer_float 1 +GLAD_API_CALL int GLAD_GL_ARB_color_buffer_float; +#define GL_ARB_copy_buffer 1 +GLAD_API_CALL int GLAD_GL_ARB_copy_buffer; +#define GL_ARB_draw_buffers 1 +GLAD_API_CALL int GLAD_GL_ARB_draw_buffers; +#define GL_ARB_draw_elements_base_vertex 1 +GLAD_API_CALL int GLAD_GL_ARB_draw_elements_base_vertex; +#define GL_ARB_draw_instanced 1 +GLAD_API_CALL int GLAD_GL_ARB_draw_instanced; +#define GL_ARB_framebuffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_framebuffer_object; +#define GL_ARB_geometry_shader4 1 +GLAD_API_CALL int GLAD_GL_ARB_geometry_shader4; +#define GL_ARB_imaging 1 +GLAD_API_CALL int GLAD_GL_ARB_imaging; +#define GL_ARB_instanced_arrays 1 +GLAD_API_CALL int GLAD_GL_ARB_instanced_arrays; +#define GL_ARB_map_buffer_range 1 +GLAD_API_CALL int GLAD_GL_ARB_map_buffer_range; +#define GL_ARB_multisample 1 +GLAD_API_CALL int GLAD_GL_ARB_multisample; +#define GL_ARB_multitexture 1 +GLAD_API_CALL int GLAD_GL_ARB_multitexture; +#define GL_ARB_occlusion_query 1 +GLAD_API_CALL int GLAD_GL_ARB_occlusion_query; +#define GL_ARB_point_parameters 1 +GLAD_API_CALL int GLAD_GL_ARB_point_parameters; +#define GL_ARB_provoking_vertex 1 +GLAD_API_CALL int GLAD_GL_ARB_provoking_vertex; +#define GL_ARB_sampler_objects 1 +GLAD_API_CALL int GLAD_GL_ARB_sampler_objects; +#define GL_ARB_shader_objects 1 +GLAD_API_CALL int GLAD_GL_ARB_shader_objects; +#define GL_ARB_sync 1 +GLAD_API_CALL int GLAD_GL_ARB_sync; +#define GL_ARB_texture_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_buffer_object; +#define GL_ARB_texture_compression 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_compression; +#define GL_ARB_texture_multisample 1 +GLAD_API_CALL int GLAD_GL_ARB_texture_multisample; +#define GL_ARB_timer_query 1 +GLAD_API_CALL int GLAD_GL_ARB_timer_query; +#define GL_ARB_transpose_matrix 1 +GLAD_API_CALL int GLAD_GL_ARB_transpose_matrix; +#define GL_ARB_uniform_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_uniform_buffer_object; +#define GL_ARB_vertex_array_object 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_array_object; +#define GL_ARB_vertex_buffer_object 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_buffer_object; +#define GL_ARB_vertex_program 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_program; +#define GL_ARB_vertex_shader 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_shader; +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +GLAD_API_CALL int GLAD_GL_ARB_vertex_type_2_10_10_10_rev; +#define GL_ARB_window_pos 1 +GLAD_API_CALL int GLAD_GL_ARB_window_pos; +#define GL_ATI_draw_buffers 1 +GLAD_API_CALL int GLAD_GL_ATI_draw_buffers; +#define GL_ATI_separate_stencil 1 +GLAD_API_CALL int GLAD_GL_ATI_separate_stencil; +#define GL_EXT_blend_color 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_color; +#define GL_EXT_blend_equation_separate 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_equation_separate; +#define GL_EXT_blend_func_separate 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_func_separate; +#define GL_EXT_blend_minmax 1 +GLAD_API_CALL int GLAD_GL_EXT_blend_minmax; +#define GL_EXT_copy_texture 1 +GLAD_API_CALL int GLAD_GL_EXT_copy_texture; +#define GL_EXT_direct_state_access 1 +GLAD_API_CALL int GLAD_GL_EXT_direct_state_access; +#define GL_EXT_draw_buffers2 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_buffers2; +#define GL_EXT_draw_instanced 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_instanced; +#define GL_EXT_draw_range_elements 1 +GLAD_API_CALL int GLAD_GL_EXT_draw_range_elements; +#define GL_EXT_fog_coord 1 +GLAD_API_CALL int GLAD_GL_EXT_fog_coord; +#define GL_EXT_framebuffer_blit 1 +GLAD_API_CALL int GLAD_GL_EXT_framebuffer_blit; +#define GL_EXT_framebuffer_multisample 1 +GLAD_API_CALL int GLAD_GL_EXT_framebuffer_multisample; +#define GL_EXT_framebuffer_object 1 +GLAD_API_CALL int GLAD_GL_EXT_framebuffer_object; +#define GL_EXT_gpu_shader4 1 +GLAD_API_CALL int GLAD_GL_EXT_gpu_shader4; +#define GL_EXT_multi_draw_arrays 1 +GLAD_API_CALL int GLAD_GL_EXT_multi_draw_arrays; +#define GL_EXT_point_parameters 1 +GLAD_API_CALL int GLAD_GL_EXT_point_parameters; +#define GL_EXT_provoking_vertex 1 +GLAD_API_CALL int GLAD_GL_EXT_provoking_vertex; +#define GL_EXT_secondary_color 1 +GLAD_API_CALL int GLAD_GL_EXT_secondary_color; +#define GL_EXT_subtexture 1 +GLAD_API_CALL int GLAD_GL_EXT_subtexture; +#define GL_EXT_texture3D 1 +GLAD_API_CALL int GLAD_GL_EXT_texture3D; +#define GL_EXT_texture_array 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_array; +#define GL_EXT_texture_buffer_object 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_buffer_object; +#define GL_EXT_texture_integer 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_integer; +#define GL_EXT_texture_object 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_object; +#define GL_EXT_texture_storage 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_storage; +#define GL_EXT_timer_query 1 +GLAD_API_CALL int GLAD_GL_EXT_timer_query; +#define GL_EXT_transform_feedback 1 +GLAD_API_CALL int GLAD_GL_EXT_transform_feedback; +#define GL_EXT_vertex_array 1 +GLAD_API_CALL int GLAD_GL_EXT_vertex_array; +#define GL_INGR_blend_func_separate 1 +GLAD_API_CALL int GLAD_GL_INGR_blend_func_separate; +#define GL_KHR_debug 1 +GLAD_API_CALL int GLAD_GL_KHR_debug; +#define GL_MESA_window_pos 1 +GLAD_API_CALL int GLAD_GL_MESA_window_pos; +#define GL_NVX_conditional_render 1 +GLAD_API_CALL int GLAD_GL_NVX_conditional_render; +#define GL_NV_conditional_render 1 +GLAD_API_CALL int GLAD_GL_NV_conditional_render; +#define GL_NV_explicit_multisample 1 +GLAD_API_CALL int GLAD_GL_NV_explicit_multisample; +#define GL_NV_geometry_program4 1 +GLAD_API_CALL int GLAD_GL_NV_geometry_program4; +#define GL_NV_point_sprite 1 +GLAD_API_CALL int GLAD_GL_NV_point_sprite; +#define GL_NV_transform_feedback 1 +GLAD_API_CALL int GLAD_GL_NV_transform_feedback; +#define GL_NV_vertex_program 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_program; +#define GL_NV_vertex_program4 1 +GLAD_API_CALL int GLAD_GL_NV_vertex_program4; +#define GL_SGIS_point_parameters 1 +GLAD_API_CALL int GLAD_GL_SGIS_point_parameters; + + +typedef void (GLAD_API_PTR *PFNGLACCUMPROC)(GLenum op, GLfloat value); +typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREARBPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLACTIVEVARYINGNVPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLALPHAFUNCPROC)(GLenum func, GLfloat ref); +typedef GLboolean (GLAD_API_PTR *PFNGLAREPROGRAMSRESIDENTNVPROC)(GLsizei n, const GLuint * programs, GLboolean * residences); +typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences); +typedef GLboolean (GLAD_API_PTR *PFNGLARETEXTURESRESIDENTEXTPROC)(GLsizei n, const GLuint * textures, GLboolean * residences); +typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTPROC)(GLint i); +typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTEXTPROC)(GLint i); +typedef void (GLAD_API_PTR *PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLBEGINPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERNVPROC)(GLuint id, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERNVXPROC)(GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYARBPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); +typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)(GLenum primitiveMode); +typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKNVPROC)(GLenum primitiveMode); +typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj, GLuint index, const GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERARBPROC)(GLenum target, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEEXTPROC)(GLenum target, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASENVPROC)(GLenum target, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFEROFFSETEXTPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFEROFFSETNVPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEEXTPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGENVPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONEXTPROC)(GLuint program, GLuint color, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer); +typedef void (GLAD_API_PTR *PFNGLBINDMULTITEXTUREEXTPROC)(GLenum texunit, GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMARBPROC)(GLenum target, GLuint program); +typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMNVPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREEXTPROC)(GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYAPPLEPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); +typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLBLENDCOLOREXTPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEINGRPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLBUFFERDATAARBPROC)(GLenum target, GLsizeiptrARB size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLBUFFERPARAMETERIAPPLEPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); +typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void * data); +typedef void (GLAD_API_PTR *PFNGLCALLLISTPROC)(GLuint list); +typedef void (GLAD_API_PTR *PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void * lists); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)(GLuint framebuffer, GLenum target); +typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); +typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORARBPROC)(GLenum target, GLenum clamp); +typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORIIEXTPROC)(GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORIUIEXTPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth); +typedef void (GLAD_API_PTR *PFNGLCLEARINDEXPROC)(GLfloat c); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERDATAEXTPROC)(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)(GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); +typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLCLIENTATTRIBDEFAULTEXTPROC)(GLbitfield mask); +typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAD_API_PTR *PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble * equation); +typedef void (GLAD_API_PTR *PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3BVPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3IPROC)(GLint red, GLint green, GLint blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3UBVPROC)(const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3UIVPROC)(const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue); +typedef void (GLAD_API_PTR *PFNGLCOLOR3USVPROC)(const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4BPROC)(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4BVPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4DPROC)(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4FPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4IPROC)(GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4SPROC)(GLshort red, GLshort green, GLshort blue, GLshort alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UBPROC)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UBVPROC)(const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UIPROC)(GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4UIVPROC)(const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha); +typedef void (GLAD_API_PTR *PFNGLCOLOR4USVPROC)(const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKINDEXEDEXTPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAD_API_PTR *PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLCOLORP3UIPROC)(GLenum type, GLuint color); +typedef void (GLAD_API_PTR *PFNGLCOLORP3UIVPROC)(GLenum type, const GLuint * color); +typedef void (GLAD_API_PTR *PFNGLCOLORP4UIPROC)(GLenum type, GLuint color); +typedef void (GLAD_API_PTR *PFNGLCOLORP4UIVPROC)(GLenum type, const GLuint * color); +typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLCOLORPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * table); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * bits); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * image); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * image); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIPROC)(GLenum target, GLenum pname, GLint params); +typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLCOPYCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTUREIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTUREIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); +typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATEPROGRAMOBJECTARBPROC)(void); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); +typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType); +typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); +typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSARBPROC)(GLsizei n, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLDELETELISTSPROC)(GLuint list, GLsizei range); +typedef void (GLAD_API_PTR *PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSNVPROC)(GLsizei n, const GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESARBPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync sync); +typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESEXTPROC)(GLsizei n, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSAPPLEPROC)(GLsizei n, const GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func); +typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEPROC)(GLenum array); +typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)(GLenum array, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEIEXTPROC)(GLenum array, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEINDEXEDEXTPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)(GLuint vaobj, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYEXTPROC)(GLuint vaobj, GLenum array); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSEXTPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDARBPROC)(GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDEXTPROC)(GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSARBPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSATIPROC)(GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDARBPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDEXTPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSEXTPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPROC)(GLboolean flag); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTEREXTPROC)(GLsizei stride, GLsizei count, const GLboolean * pointer); +typedef void (GLAD_API_PTR *PFNGLEDGEFLAGVPROC)(const GLboolean * flag); +typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEPROC)(GLenum array); +typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)(GLenum array, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEIEXTPROC)(GLenum array, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEINDEXEDEXTPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)(GLuint vaobj, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYEXTPROC)(GLuint vaobj, GLenum array); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENDPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERNVXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDLISTPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLENDQUERYARBPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKEXTPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKNVPROC)(void); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DPROC)(GLdouble u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DVPROC)(const GLdouble * u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FPROC)(GLfloat u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FVPROC)(const GLfloat * u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DPROC)(GLdouble u, GLdouble v); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2DVPROC)(const GLdouble * u); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FPROC)(GLfloat u, GLfloat v); +typedef void (GLAD_API_PTR *PFNGLEVALCOORD2FVPROC)(const GLfloat * u); +typedef void (GLAD_API_PTR *PFNGLEVALMESH1PROC)(GLenum mode, GLint i1, GLint i2); +typedef void (GLAD_API_PTR *PFNGLEVALMESH2PROC)(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +typedef void (GLAD_API_PTR *PFNGLEVALPOINT1PROC)(GLint i); +typedef void (GLAD_API_PTR *PFNGLEVALPOINT2PROC)(GLint i, GLint j); +typedef void (GLAD_API_PTR *PFNGLEXECUTEPROGRAMNVPROC)(GLenum target, GLuint id, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat * buffer); +typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)(GLenum target, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDPOINTEREXTPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDPROC)(GLdouble coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDEXTPROC)(GLdouble coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDVPROC)(const GLdouble * coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDVEXTPROC)(const GLdouble * coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFPROC)(GLfloat coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFEXTPROC)(GLfloat coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFVPROC)(const GLfloat * coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFVEXTPROC)(const GLfloat * coord); +typedef void (GLAD_API_PTR *PFNGLFOGFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLFOGFVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLFOGIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLFOGIVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)(GLuint framebuffer, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)(GLuint framebuffer, GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERREADBUFFEREXTPROC)(GLuint framebuffer, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLGENBUFFERSARBPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint * framebuffers); +typedef GLuint (GLAD_API_PTR *PFNGLGENLISTSPROC)(GLsizei range); +typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSARBPROC)(GLsizei n, GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSNVPROC)(GLsizei n, GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENQUERIESARBPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLGENTEXTURESEXTPROC)(GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSAPPLEPROC)(GLsizei n, GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPEXTPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLGENERATEMULTITEXMIPMAPEXTPROC)(GLenum texunit, GLenum target); +typedef void (GLAD_API_PTR *PFNGLGENERATETEXTUREMIPMAPEXTPROC)(GLuint texture, GLenum target); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEVARYINGNVPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj); +typedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); +typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANINDEXEDVEXTPROC)(GLenum target, GLuint index, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble * equation); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, void * table); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)(GLenum texunit, GLenum target, GLint lod, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)(GLenum target, GLint level, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)(GLuint texture, GLenum target, GLint lod, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, void * image); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEINDEXEDVEXTPROC)(GLenum target, GLuint index, GLdouble * data); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEI_VEXTPROC)(GLenum pname, GLuint index, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data); +typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETFLOATINDEXEDVEXTPROC)(GLenum target, GLuint index, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VEXTPROC)(GLenum pname, GLuint index, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONEXTPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)(GLuint framebuffer, GLenum pname, GLint * params); +typedef GLhandleARB (GLAD_API_PTR *PFNGLGETHANDLEARBPROC)(GLenum pname); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETINFOLOGARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERINDEXEDVEXTPROC)(GLenum target, GLuint index, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLGETMAPFVPROC)(GLenum target, GLenum query, GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLGETMAPIVPROC)(GLenum target, GLenum query, GLint * v); +typedef void (GLAD_API_PTR *PFNGLGETMATERIALFVPROC)(GLenum face, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values); +typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXENVFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXENVIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXGENDVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXGENFVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXGENIVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXIMAGEEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXPARAMETERIIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXPARAMETERFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTITEXPARAMETERIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat * val); +typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVNVPROC)(GLenum pname, GLuint index, GLfloat * val); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)(GLuint buffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)(GLuint buffer, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)(GLuint framebuffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)(GLuint program, GLenum target, GLuint index, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)(GLuint program, GLenum target, GLuint index, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)(GLuint program, GLenum target, GLuint index, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)(GLuint program, GLenum target, GLuint index, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)(GLuint program, GLenum target, GLenum pname, void * string); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDPROGRAMIVEXTPROC)(GLuint program, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)(GLuint renderbuffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPFVPROC)(GLenum map, GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint * values); +typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort * values); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERINDEXEDVEXTPROC)(GLenum target, GLuint index, void ** data); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERI_VEXTPROC)(GLenum pname, GLuint index, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERVEXTPROC)(GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte * mask); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERDVNVPROC)(GLenum target, GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERFVNVPROC)(GLenum target, GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, void * string); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGNVPROC)(GLuint id, GLenum pname, GLubyte * program); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVNVPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VEXTPROC)(GLuint id, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVARBPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VEXTPROC)(GLuint id, GLenum pname, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVARBPROC)(GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYIVARBPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, void * row, void * column, void * span); +typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); +typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source); +typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); +typedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values); +typedef void (GLAD_API_PTR *PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXGENFVPROC)(GLenum coord, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVEXTPROC)(GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREIMAGEEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)(GLuint texture, GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERFVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTRACKMATRIXIVNVPROC)(GLenum target, GLuint address, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)(GLuint program, GLuint index, GLint * location); +typedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar * uniformBlockName); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const* uniformNames, GLuint * uniformIndices); +typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVEXTPROC)(GLuint program, GLint location, GLuint * params); +typedef GLint (GLAD_API_PTR *PFNGLGETVARYINGLOCATIONNVPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINTEGERVEXTPROC)(GLuint vaobj, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)(GLuint vaobj, GLuint index, GLenum pname, void ** param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYPOINTERVEXTPROC)(GLuint vaobj, GLenum pname, void ** param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVEXTPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVEXTPROC)(GLuint index, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, void ** pointer); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVNVPROC)(GLuint index, GLenum pname, void ** pointer); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVNVPROC)(GLuint index, GLenum pname, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVNVPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVNVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLHISTOGRAMPROC)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAD_API_PTR *PFNGLINDEXMASKPROC)(GLuint mask); +typedef void (GLAD_API_PTR *PFNGLINDEXPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLINDEXPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLINDEXDPROC)(GLdouble c); +typedef void (GLAD_API_PTR *PFNGLINDEXDVPROC)(const GLdouble * c); +typedef void (GLAD_API_PTR *PFNGLINDEXFPROC)(GLfloat c); +typedef void (GLAD_API_PTR *PFNGLINDEXFVPROC)(const GLfloat * c); +typedef void (GLAD_API_PTR *PFNGLINDEXIPROC)(GLint c); +typedef void (GLAD_API_PTR *PFNGLINDEXIVPROC)(const GLint * c); +typedef void (GLAD_API_PTR *PFNGLINDEXSPROC)(GLshort c); +typedef void (GLAD_API_PTR *PFNGLINDEXSVPROC)(const GLshort * c); +typedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte c); +typedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const GLubyte * c); +typedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void); +typedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void * pointer); +typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERARBPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDINDEXEDEXTPROC)(GLenum target, GLuint index); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum target, GLuint index); +typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISLISTPROC)(GLuint list); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMARBPROC)(GLuint program); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMNVPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYARBPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint sampler); +typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader); +typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync sync); +typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture); +typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREEXTPROC)(GLuint texture); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYAPPLEPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLLIGHTFPROC)(GLenum light, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLLIGHTFVPROC)(GLenum light, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLLIGHTIPROC)(GLenum light, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLLIGHTIVPROC)(GLenum light, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLLINESTIPPLEPROC)(GLint factor, GLushort pattern); +typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width); +typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj); +typedef void (GLAD_API_PTR *PFNGLLISTBASEPROC)(GLuint base); +typedef void (GLAD_API_PTR *PFNGLLOADIDENTITYPROC)(void); +typedef void (GLAD_API_PTR *PFNGLLOADMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLLOADMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLLOADNAMEPROC)(GLuint name); +typedef void (GLAD_API_PTR *PFNGLLOADPROGRAMNVPROC)(GLenum target, GLuint id, GLsizei len, const GLubyte * program); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXDARBPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXFARBPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode); +typedef void (GLAD_API_PTR *PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); +typedef void (GLAD_API_PTR *PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); +typedef void (GLAD_API_PTR *PFNGLMAP2DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble * points); +typedef void (GLAD_API_PTR *PFNGLMAP2FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERARBPROC)(GLenum target, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAD_API_PTR *PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2); +typedef void (GLAD_API_PTR *PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2); +typedef void (GLAD_API_PTR *PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +typedef void (GLAD_API_PTR *PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFEREXTPROC)(GLuint buffer, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERRANGEEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAD_API_PTR *PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMATRIXFRUSTUMEXTPROC)(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADIDENTITYEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADTRANSPOSEDEXTPROC)(GLenum mode, const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADTRANSPOSEFEXTPROC)(GLenum mode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADDEXTPROC)(GLenum mode, const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXLOADFEXTPROC)(GLenum mode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMODEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULTTRANSPOSEDEXTPROC)(GLenum mode, const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULTTRANSPOSEFEXTPROC)(GLenum mode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULTDEXTPROC)(GLenum mode, const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXMULTFEXTPROC)(GLenum mode, const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMATRIXORTHOEXTPROC)(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLMATRIXPOPEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLMATRIXPUSHEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLMATRIXROTATEDEXTPROC)(GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLMATRIXROTATEFEXTPROC)(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLMATRIXSCALEDEXTPROC)(GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLMATRIXSCALEFEXTPROC)(GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLMATRIXTRANSLATEDEXTPROC)(GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLMATRIXTRANSLATEFEXTPROC)(GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLMINMAXPROC)(GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAD_API_PTR *PFNGLMULTMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMULTMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXDARBPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXFARBPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSEXTPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSEXTPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei primcount); +typedef void (GLAD_API_PTR *PFNGLMULTITEXBUFFEREXTPROC)(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DARBPROC)(GLenum target, GLdouble s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVARBPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FPROC)(GLenum target, GLfloat s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IPROC)(GLenum target, GLint s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IARBPROC)(GLenum target, GLint s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1IVARBPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SPROC)(GLenum target, GLshort s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SARBPROC)(GLenum target, GLshort s); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1SVARBPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DPROC)(GLenum target, GLdouble s, GLdouble t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DARBPROC)(GLenum target, GLdouble s, GLdouble t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2DVARBPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FPROC)(GLenum target, GLfloat s, GLfloat t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IPROC)(GLenum target, GLint s, GLint t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IARBPROC)(GLenum target, GLint s, GLint t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2IVARBPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SPROC)(GLenum target, GLshort s, GLshort t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SARBPROC)(GLenum target, GLshort s, GLshort t); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3DVARBPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IPROC)(GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IARBPROC)(GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3IVARBPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SPROC)(GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD3SVARBPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DARBPROC)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4DVARBPROC)(GLenum target, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IARBPROC)(GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4IVARBPROC)(GLenum target, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDPOINTEREXTPROC)(GLenum texunit, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLMULTITEXENVFEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXENVFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXENVIEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXENVIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENDEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENDVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENFEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENFVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENIEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXGENIVEXTPROC)(GLenum texunit, GLenum coord, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERIIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERIUIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERFEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERFVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERIEXTPROC)(GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLMULTITEXPARAMETERIVEXTPROC)(GLenum texunit, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLMULTITEXRENDERBUFFEREXTPROC)(GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLMULTITEXSUBIMAGE1DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXSUBIMAGE2DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLMULTITEXSUBIMAGE3DEXTPROC)(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERDATAEXTPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEEXTPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSUBDATAEXTPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void * data); +typedef void (GLAD_API_PTR *PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)(GLuint framebuffer, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)(GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)(GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)(GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)(GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)(GLuint program, GLenum target, GLuint index, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)(GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)(GLuint program, GLenum target, GLuint index, GLsizei count, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)(GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLNAMEDPROGRAMSTRINGEXTPROC)(GLuint program, GLenum target, GLenum format, GLsizei len, const void * string); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)(GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNEWLISTPROC)(GLuint list, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3BVPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3DPROC)(GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3FPROC)(GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz); +typedef void (GLAD_API_PTR *PFNGLNORMAL3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLNORMALP3UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLNORMALP3UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLNORMALPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLPASSTHROUGHPROC)(GLfloat token); +typedef void (GLAD_API_PTR *PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint * values); +typedef void (GLAD_API_PTR *PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort * values); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFARBPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFEXTPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFSGISPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVARBPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVEXTPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVSGISPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERINVPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVNVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size); +typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); +typedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const GLubyte * mask); +typedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint * textures, const GLfloat * priorities); +typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESEXTPROC)(GLsizei n, const GLuint * textures, const GLclampf * priorities); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DNVPROC)(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4DVNVPROC)(GLenum target, GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FNVPROC)(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETER4FVNVPROC)(GLenum target, GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4DVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERS4FVNVPROC)(GLenum target, GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const void * string); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DEXTPROC)(GLuint program, GLint location, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FEXTPROC)(GLuint program, GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IEXTPROC)(GLuint program, GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIEXTPROC)(GLuint program, GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DEXTPROC)(GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FEXTPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IEXTPROC)(GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIEXTPROC)(GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DEXTPROC)(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FEXTPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IEXTPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIEXTPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DEXTPROC)(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FEXTPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IEXTPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIEXTPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVEXTPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMVERTEXLIMITNVPROC)(GLenum target, GLint limit); +typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message); +typedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint name); +typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS2SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IPROC)(GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src); +typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +typedef void (GLAD_API_PTR *PFNGLRECTDVPROC)(const GLdouble * v1, const GLdouble * v2); +typedef void (GLAD_API_PTR *PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +typedef void (GLAD_API_PTR *PFNGLRECTFVPROC)(const GLfloat * v1, const GLfloat * v2); +typedef void (GLAD_API_PTR *PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint y2); +typedef void (GLAD_API_PTR *PFNGLRECTIVPROC)(const GLint * v1, const GLint * v2); +typedef void (GLAD_API_PTR *PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); +typedef void (GLAD_API_PTR *PFNGLRECTSVPROC)(const GLshort * v1, const GLshort * v2); +typedef GLint (GLAD_API_PTR *PFNGLRENDERMODEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLREQUESTRESIDENTPROGRAMSNVPROC)(GLsizei n, const GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLRESETHISTOGRAMPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLRESETMINMAXPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEARBPROC)(GLfloat value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKINDEXEDNVPROC)(GLuint index, GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BEXTPROC)(GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BVPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BVEXTPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DEXTPROC)(GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DVEXTPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FEXTPROC)(GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FVEXTPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IPROC)(GLint red, GLint green, GLint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IEXTPROC)(GLint red, GLint green, GLint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IVEXTPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SEXTPROC)(GLshort red, GLshort green, GLshort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SVEXTPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBEXTPROC)(GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBVPROC)(const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBVEXTPROC)(const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIEXTPROC)(GLuint red, GLuint green, GLuint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIVPROC)(const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIVEXTPROC)(const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USEXTPROC)(GLushort red, GLushort green, GLushort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USVPROC)(const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USVEXTPROC)(const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIPROC)(GLenum type, GLuint color); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint * color); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint * buffer); +typedef void (GLAD_API_PTR *PFNGLSEPARABLEFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * row, const void * column); +typedef void (GLAD_API_PTR *PFNGLSHADEMODELPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEATIPROC)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEATIPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERARBPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFEREXTPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DPROC)(GLdouble s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FPROC)(GLfloat s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IPROC)(GLint s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SPROC)(GLshort s); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD1SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DPROC)(GLdouble s, GLdouble t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FPROC)(GLfloat s, GLfloat t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IPROC)(GLint s, GLint t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SPROC)(GLshort s, GLshort t); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD2SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DPROC)(GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FPROC)(GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IPROC)(GLint s, GLint t, GLint r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SPROC)(GLshort s, GLshort t, GLshort r); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DPROC)(GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FPROC)(GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLint q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXENVFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXENVIPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXENVIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXGENDPROC)(GLenum coord, GLenum pname, GLdouble param); +typedef void (GLAD_API_PTR *PFNGLTEXGENDVPROC)(GLenum coord, GLenum pname, const GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLTEXGENFPROC)(GLenum coord, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXGENFVPROC)(GLenum coord, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVEXTPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVEXTPROC)(GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXRENDERBUFFERNVPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFEREXTPROC)(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERRANGEEXTPROC)(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPAGECOMMITMENTEXTPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIUIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIEXTPROC)(GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIVEXTPROC)(GLuint texture, GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTURERENDERBUFFEREXTPROC)(GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE1DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE1DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE2DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE3DEXTPROC)(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTRACKMATRIXNVPROC)(GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)(GLsizei count, const GLint * attribs, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC)(GLsizei count, const GLint * attribs, GLsizei nbuffers, const GLint * bufstreams, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)(GLuint program, GLsizei count, const GLint * locations, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIEXTPROC)(GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVEXTPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIEXTPROC)(GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVEXTPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVEXTPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVEXTPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERARBPROC)(GLenum target); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPNAMEDBUFFEREXTPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj); +typedef void (GLAD_API_PTR *PFNGLVERTEX2DPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX2FPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX2IPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX2SPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEX2SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX3DPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX3FPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX3IPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX3SPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEX3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX4DPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX4FPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEX4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)(GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)(GLuint vaobj, GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)(GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DNVPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVNVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FNVPROC)(GLuint index, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVNVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SNVPROC)(GLuint index, GLshort x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1SVNVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DNVPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2DVNVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FNVPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVNVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SNVPROC)(GLuint index, GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2SVNVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3DVNVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVNVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3SVNVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DNVPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4DVNVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FNVPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVNVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SNVPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVNVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBNVPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVNVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORARBPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IEXTPROC)(GLuint index, GLint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVEXTPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIEXTPROC)(GLuint index, GLuint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVEXTPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IEXTPROC)(GLuint index, GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVEXTPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIEXTPROC)(GLuint index, GLuint x, GLuint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVEXTPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IEXTPROC)(GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVEXTPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVEXTPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVEXTPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IEXTPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVEXTPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVEXTPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVEXTPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVEXTPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVEXTPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTEREXTPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERNVPROC)(GLuint index, GLint fsize, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS1SVNVPROC)(GLuint index, GLsizei count, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS2SVNVPROC)(GLuint index, GLsizei count, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS3SVNVPROC)(GLuint index, GLsizei count, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4DVNVPROC)(GLuint index, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4SVNVPROC)(GLuint index, GLsizei count, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4UBVNVPROC)(GLuint index, GLsizei count, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIPROC)(GLenum type, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIVPROC)(GLenum type, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIPROC)(GLenum type, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIVPROC)(GLenum type, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIPROC)(GLenum type, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIVPROC)(GLenum type, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DARBPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DMESAPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVARBPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVMESAPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FARBPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FMESAPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVARBPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVMESAPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IARBPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IMESAPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVARBPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVMESAPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SARBPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SMESAPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVARBPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVMESAPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DARBPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DMESAPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVARBPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVMESAPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FARBPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FMESAPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVARBPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVMESAPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IARBPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IMESAPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVARBPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVMESAPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SARBPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SMESAPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVARBPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVMESAPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4DMESAPROC)(GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4DVMESAPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4FMESAPROC)(GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4FVMESAPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4IMESAPROC)(GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4IVMESAPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4SMESAPROC)(GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS4SVMESAPROC)(const GLshort * v); + +GLAD_API_CALL PFNGLACCUMPROC glad_glAccum; +#define glAccum glad_glAccum +GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture; +#define glActiveTexture glad_glActiveTexture +GLAD_API_CALL PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB; +#define glActiveTextureARB glad_glActiveTextureARB +GLAD_API_CALL PFNGLACTIVEVARYINGNVPROC glad_glActiveVaryingNV; +#define glActiveVaryingNV glad_glActiveVaryingNV +GLAD_API_CALL PFNGLALPHAFUNCPROC glad_glAlphaFunc; +#define glAlphaFunc glad_glAlphaFunc +GLAD_API_CALL PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV; +#define glAreProgramsResidentNV glad_glAreProgramsResidentNV +GLAD_API_CALL PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident; +#define glAreTexturesResident glad_glAreTexturesResident +GLAD_API_CALL PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT; +#define glAreTexturesResidentEXT glad_glAreTexturesResidentEXT +GLAD_API_CALL PFNGLARRAYELEMENTPROC glad_glArrayElement; +#define glArrayElement glad_glArrayElement +GLAD_API_CALL PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT; +#define glArrayElementEXT glad_glArrayElementEXT +GLAD_API_CALL PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB; +#define glAttachObjectARB glad_glAttachObjectARB +GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader; +#define glAttachShader glad_glAttachShader +GLAD_API_CALL PFNGLBEGINPROC glad_glBegin; +#define glBegin glad_glBegin +GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; +#define glBeginConditionalRender glad_glBeginConditionalRender +GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERNVPROC glad_glBeginConditionalRenderNV; +#define glBeginConditionalRenderNV glad_glBeginConditionalRenderNV +GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERNVXPROC glad_glBeginConditionalRenderNVX; +#define glBeginConditionalRenderNVX glad_glBeginConditionalRenderNVX +GLAD_API_CALL PFNGLBEGINQUERYPROC glad_glBeginQuery; +#define glBeginQuery glad_glBeginQuery +GLAD_API_CALL PFNGLBEGINQUERYARBPROC glad_glBeginQueryARB; +#define glBeginQueryARB glad_glBeginQueryARB +GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; +#define glBeginTransformFeedback glad_glBeginTransformFeedback +GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKEXTPROC glad_glBeginTransformFeedbackEXT; +#define glBeginTransformFeedbackEXT glad_glBeginTransformFeedbackEXT +GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKNVPROC glad_glBeginTransformFeedbackNV; +#define glBeginTransformFeedbackNV glad_glBeginTransformFeedbackNV +GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; +#define glBindAttribLocation glad_glBindAttribLocation +GLAD_API_CALL PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB; +#define glBindAttribLocationARB glad_glBindAttribLocationARB +GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer; +#define glBindBuffer glad_glBindBuffer +GLAD_API_CALL PFNGLBINDBUFFERARBPROC glad_glBindBufferARB; +#define glBindBufferARB glad_glBindBufferARB +GLAD_API_CALL PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; +#define glBindBufferBase glad_glBindBufferBase +GLAD_API_CALL PFNGLBINDBUFFERBASEEXTPROC glad_glBindBufferBaseEXT; +#define glBindBufferBaseEXT glad_glBindBufferBaseEXT +GLAD_API_CALL PFNGLBINDBUFFERBASENVPROC glad_glBindBufferBaseNV; +#define glBindBufferBaseNV glad_glBindBufferBaseNV +GLAD_API_CALL PFNGLBINDBUFFEROFFSETEXTPROC glad_glBindBufferOffsetEXT; +#define glBindBufferOffsetEXT glad_glBindBufferOffsetEXT +GLAD_API_CALL PFNGLBINDBUFFEROFFSETNVPROC glad_glBindBufferOffsetNV; +#define glBindBufferOffsetNV glad_glBindBufferOffsetNV +GLAD_API_CALL PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; +#define glBindBufferRange glad_glBindBufferRange +GLAD_API_CALL PFNGLBINDBUFFERRANGEEXTPROC glad_glBindBufferRangeEXT; +#define glBindBufferRangeEXT glad_glBindBufferRangeEXT +GLAD_API_CALL PFNGLBINDBUFFERRANGENVPROC glad_glBindBufferRangeNV; +#define glBindBufferRangeNV glad_glBindBufferRangeNV +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; +#define glBindFragDataLocation glad_glBindFragDataLocation +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONEXTPROC glad_glBindFragDataLocationEXT; +#define glBindFragDataLocationEXT glad_glBindFragDataLocationEXT +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; +#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed +GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; +#define glBindFramebuffer glad_glBindFramebuffer +GLAD_API_CALL PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT; +#define glBindFramebufferEXT glad_glBindFramebufferEXT +GLAD_API_CALL PFNGLBINDMULTITEXTUREEXTPROC glad_glBindMultiTextureEXT; +#define glBindMultiTextureEXT glad_glBindMultiTextureEXT +GLAD_API_CALL PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB; +#define glBindProgramARB glad_glBindProgramARB +GLAD_API_CALL PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV; +#define glBindProgramNV glad_glBindProgramNV +GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; +#define glBindRenderbuffer glad_glBindRenderbuffer +GLAD_API_CALL PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT; +#define glBindRenderbufferEXT glad_glBindRenderbufferEXT +GLAD_API_CALL PFNGLBINDSAMPLERPROC glad_glBindSampler; +#define glBindSampler glad_glBindSampler +GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture; +#define glBindTexture glad_glBindTexture +GLAD_API_CALL PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT; +#define glBindTextureEXT glad_glBindTextureEXT +GLAD_API_CALL PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; +#define glBindVertexArray glad_glBindVertexArray +GLAD_API_CALL PFNGLBINDVERTEXARRAYAPPLEPROC glad_glBindVertexArrayAPPLE; +#define glBindVertexArrayAPPLE glad_glBindVertexArrayAPPLE +GLAD_API_CALL PFNGLBITMAPPROC glad_glBitmap; +#define glBitmap glad_glBitmap +GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor; +#define glBlendColor glad_glBlendColor +GLAD_API_CALL PFNGLBLENDCOLOREXTPROC glad_glBlendColorEXT; +#define glBlendColorEXT glad_glBlendColorEXT +GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation; +#define glBlendEquation glad_glBlendEquation +GLAD_API_CALL PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT; +#define glBlendEquationEXT glad_glBlendEquationEXT +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; +#define glBlendEquationSeparate glad_glBlendEquationSeparate +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT; +#define glBlendEquationSeparateEXT glad_glBlendEquationSeparateEXT +GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc; +#define glBlendFunc glad_glBlendFunc +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; +#define glBlendFuncSeparate glad_glBlendFuncSeparate +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT; +#define glBlendFuncSeparateEXT glad_glBlendFuncSeparateEXT +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR; +#define glBlendFuncSeparateINGR glad_glBlendFuncSeparateINGR +GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; +#define glBlitFramebuffer glad_glBlitFramebuffer +GLAD_API_CALL PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT; +#define glBlitFramebufferEXT glad_glBlitFramebufferEXT +GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData; +#define glBufferData glad_glBufferData +GLAD_API_CALL PFNGLBUFFERDATAARBPROC glad_glBufferDataARB; +#define glBufferDataARB glad_glBufferDataARB +GLAD_API_CALL PFNGLBUFFERPARAMETERIAPPLEPROC glad_glBufferParameteriAPPLE; +#define glBufferParameteriAPPLE glad_glBufferParameteriAPPLE +GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; +#define glBufferSubData glad_glBufferSubData +GLAD_API_CALL PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB; +#define glBufferSubDataARB glad_glBufferSubDataARB +GLAD_API_CALL PFNGLCALLLISTPROC glad_glCallList; +#define glCallList glad_glCallList +GLAD_API_CALL PFNGLCALLLISTSPROC glad_glCallLists; +#define glCallLists glad_glCallLists +GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; +#define glCheckFramebufferStatus glad_glCheckFramebufferStatus +GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT; +#define glCheckFramebufferStatusEXT glad_glCheckFramebufferStatusEXT +GLAD_API_CALL PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC glad_glCheckNamedFramebufferStatusEXT; +#define glCheckNamedFramebufferStatusEXT glad_glCheckNamedFramebufferStatusEXT +GLAD_API_CALL PFNGLCLAMPCOLORPROC glad_glClampColor; +#define glClampColor glad_glClampColor +GLAD_API_CALL PFNGLCLAMPCOLORARBPROC glad_glClampColorARB; +#define glClampColorARB glad_glClampColorARB +GLAD_API_CALL PFNGLCLEARPROC glad_glClear; +#define glClear glad_glClear +GLAD_API_CALL PFNGLCLEARACCUMPROC glad_glClearAccum; +#define glClearAccum glad_glClearAccum +GLAD_API_CALL PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; +#define glClearBufferfi glad_glClearBufferfi +GLAD_API_CALL PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; +#define glClearBufferfv glad_glClearBufferfv +GLAD_API_CALL PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; +#define glClearBufferiv glad_glClearBufferiv +GLAD_API_CALL PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; +#define glClearBufferuiv glad_glClearBufferuiv +GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor; +#define glClearColor glad_glClearColor +GLAD_API_CALL PFNGLCLEARCOLORIIEXTPROC glad_glClearColorIiEXT; +#define glClearColorIiEXT glad_glClearColorIiEXT +GLAD_API_CALL PFNGLCLEARCOLORIUIEXTPROC glad_glClearColorIuiEXT; +#define glClearColorIuiEXT glad_glClearColorIuiEXT +GLAD_API_CALL PFNGLCLEARDEPTHPROC glad_glClearDepth; +#define glClearDepth glad_glClearDepth +GLAD_API_CALL PFNGLCLEARINDEXPROC glad_glClearIndex; +#define glClearIndex glad_glClearIndex +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERDATAEXTPROC glad_glClearNamedBufferDataEXT; +#define glClearNamedBufferDataEXT glad_glClearNamedBufferDataEXT +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC glad_glClearNamedBufferSubDataEXT; +#define glClearNamedBufferSubDataEXT glad_glClearNamedBufferSubDataEXT +GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil; +#define glClearStencil glad_glClearStencil +GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture; +#define glClientActiveTexture glad_glClientActiveTexture +GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB; +#define glClientActiveTextureARB glad_glClientActiveTextureARB +GLAD_API_CALL PFNGLCLIENTATTRIBDEFAULTEXTPROC glad_glClientAttribDefaultEXT; +#define glClientAttribDefaultEXT glad_glClientAttribDefaultEXT +GLAD_API_CALL PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; +#define glClientWaitSync glad_glClientWaitSync +GLAD_API_CALL PFNGLCLIPPLANEPROC glad_glClipPlane; +#define glClipPlane glad_glClipPlane +GLAD_API_CALL PFNGLCOLOR3BPROC glad_glColor3b; +#define glColor3b glad_glColor3b +GLAD_API_CALL PFNGLCOLOR3BVPROC glad_glColor3bv; +#define glColor3bv glad_glColor3bv +GLAD_API_CALL PFNGLCOLOR3DPROC glad_glColor3d; +#define glColor3d glad_glColor3d +GLAD_API_CALL PFNGLCOLOR3DVPROC glad_glColor3dv; +#define glColor3dv glad_glColor3dv +GLAD_API_CALL PFNGLCOLOR3FPROC glad_glColor3f; +#define glColor3f glad_glColor3f +GLAD_API_CALL PFNGLCOLOR3FVPROC glad_glColor3fv; +#define glColor3fv glad_glColor3fv +GLAD_API_CALL PFNGLCOLOR3IPROC glad_glColor3i; +#define glColor3i glad_glColor3i +GLAD_API_CALL PFNGLCOLOR3IVPROC glad_glColor3iv; +#define glColor3iv glad_glColor3iv +GLAD_API_CALL PFNGLCOLOR3SPROC glad_glColor3s; +#define glColor3s glad_glColor3s +GLAD_API_CALL PFNGLCOLOR3SVPROC glad_glColor3sv; +#define glColor3sv glad_glColor3sv +GLAD_API_CALL PFNGLCOLOR3UBPROC glad_glColor3ub; +#define glColor3ub glad_glColor3ub +GLAD_API_CALL PFNGLCOLOR3UBVPROC glad_glColor3ubv; +#define glColor3ubv glad_glColor3ubv +GLAD_API_CALL PFNGLCOLOR3UIPROC glad_glColor3ui; +#define glColor3ui glad_glColor3ui +GLAD_API_CALL PFNGLCOLOR3UIVPROC glad_glColor3uiv; +#define glColor3uiv glad_glColor3uiv +GLAD_API_CALL PFNGLCOLOR3USPROC glad_glColor3us; +#define glColor3us glad_glColor3us +GLAD_API_CALL PFNGLCOLOR3USVPROC glad_glColor3usv; +#define glColor3usv glad_glColor3usv +GLAD_API_CALL PFNGLCOLOR4BPROC glad_glColor4b; +#define glColor4b glad_glColor4b +GLAD_API_CALL PFNGLCOLOR4BVPROC glad_glColor4bv; +#define glColor4bv glad_glColor4bv +GLAD_API_CALL PFNGLCOLOR4DPROC glad_glColor4d; +#define glColor4d glad_glColor4d +GLAD_API_CALL PFNGLCOLOR4DVPROC glad_glColor4dv; +#define glColor4dv glad_glColor4dv +GLAD_API_CALL PFNGLCOLOR4FPROC glad_glColor4f; +#define glColor4f glad_glColor4f +GLAD_API_CALL PFNGLCOLOR4FVPROC glad_glColor4fv; +#define glColor4fv glad_glColor4fv +GLAD_API_CALL PFNGLCOLOR4IPROC glad_glColor4i; +#define glColor4i glad_glColor4i +GLAD_API_CALL PFNGLCOLOR4IVPROC glad_glColor4iv; +#define glColor4iv glad_glColor4iv +GLAD_API_CALL PFNGLCOLOR4SPROC glad_glColor4s; +#define glColor4s glad_glColor4s +GLAD_API_CALL PFNGLCOLOR4SVPROC glad_glColor4sv; +#define glColor4sv glad_glColor4sv +GLAD_API_CALL PFNGLCOLOR4UBPROC glad_glColor4ub; +#define glColor4ub glad_glColor4ub +GLAD_API_CALL PFNGLCOLOR4UBVPROC glad_glColor4ubv; +#define glColor4ubv glad_glColor4ubv +GLAD_API_CALL PFNGLCOLOR4UIPROC glad_glColor4ui; +#define glColor4ui glad_glColor4ui +GLAD_API_CALL PFNGLCOLOR4UIVPROC glad_glColor4uiv; +#define glColor4uiv glad_glColor4uiv +GLAD_API_CALL PFNGLCOLOR4USPROC glad_glColor4us; +#define glColor4us glad_glColor4us +GLAD_API_CALL PFNGLCOLOR4USVPROC glad_glColor4usv; +#define glColor4usv glad_glColor4usv +GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask; +#define glColorMask glad_glColorMask +GLAD_API_CALL PFNGLCOLORMASKINDEXEDEXTPROC glad_glColorMaskIndexedEXT; +#define glColorMaskIndexedEXT glad_glColorMaskIndexedEXT +GLAD_API_CALL PFNGLCOLORMASKIPROC glad_glColorMaski; +#define glColorMaski glad_glColorMaski +GLAD_API_CALL PFNGLCOLORMATERIALPROC glad_glColorMaterial; +#define glColorMaterial glad_glColorMaterial +GLAD_API_CALL PFNGLCOLORP3UIPROC glad_glColorP3ui; +#define glColorP3ui glad_glColorP3ui +GLAD_API_CALL PFNGLCOLORP3UIVPROC glad_glColorP3uiv; +#define glColorP3uiv glad_glColorP3uiv +GLAD_API_CALL PFNGLCOLORP4UIPROC glad_glColorP4ui; +#define glColorP4ui glad_glColorP4ui +GLAD_API_CALL PFNGLCOLORP4UIVPROC glad_glColorP4uiv; +#define glColorP4uiv glad_glColorP4uiv +GLAD_API_CALL PFNGLCOLORPOINTERPROC glad_glColorPointer; +#define glColorPointer glad_glColorPointer +GLAD_API_CALL PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT; +#define glColorPointerEXT glad_glColorPointerEXT +GLAD_API_CALL PFNGLCOLORSUBTABLEPROC glad_glColorSubTable; +#define glColorSubTable glad_glColorSubTable +GLAD_API_CALL PFNGLCOLORTABLEPROC glad_glColorTable; +#define glColorTable glad_glColorTable +GLAD_API_CALL PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv; +#define glColorTableParameterfv glad_glColorTableParameterfv +GLAD_API_CALL PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv; +#define glColorTableParameteriv glad_glColorTableParameteriv +GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader; +#define glCompileShader glad_glCompileShader +GLAD_API_CALL PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB; +#define glCompileShaderARB glad_glCompileShaderARB +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC glad_glCompressedMultiTexImage1DEXT; +#define glCompressedMultiTexImage1DEXT glad_glCompressedMultiTexImage1DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC glad_glCompressedMultiTexImage2DEXT; +#define glCompressedMultiTexImage2DEXT glad_glCompressedMultiTexImage2DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC glad_glCompressedMultiTexImage3DEXT; +#define glCompressedMultiTexImage3DEXT glad_glCompressedMultiTexImage3DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC glad_glCompressedMultiTexSubImage1DEXT; +#define glCompressedMultiTexSubImage1DEXT glad_glCompressedMultiTexSubImage1DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC glad_glCompressedMultiTexSubImage2DEXT; +#define glCompressedMultiTexSubImage2DEXT glad_glCompressedMultiTexSubImage2DEXT +GLAD_API_CALL PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC glad_glCompressedMultiTexSubImage3DEXT; +#define glCompressedMultiTexSubImage3DEXT glad_glCompressedMultiTexSubImage3DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; +#define glCompressedTexImage1D glad_glCompressedTexImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DARBPROC glad_glCompressedTexImage1DARB; +#define glCompressedTexImage1DARB glad_glCompressedTexImage1DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; +#define glCompressedTexImage2D glad_glCompressedTexImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DARBPROC glad_glCompressedTexImage2DARB; +#define glCompressedTexImage2DARB glad_glCompressedTexImage2DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; +#define glCompressedTexImage3D glad_glCompressedTexImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DARBPROC glad_glCompressedTexImage3DARB; +#define glCompressedTexImage3DARB glad_glCompressedTexImage3DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; +#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC glad_glCompressedTexSubImage1DARB; +#define glCompressedTexSubImage1DARB glad_glCompressedTexSubImage1DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; +#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC glad_glCompressedTexSubImage2DARB; +#define glCompressedTexSubImage2DARB glad_glCompressedTexSubImage2DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; +#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC glad_glCompressedTexSubImage3DARB; +#define glCompressedTexSubImage3DARB glad_glCompressedTexSubImage3DARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC glad_glCompressedTextureImage1DEXT; +#define glCompressedTextureImage1DEXT glad_glCompressedTextureImage1DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC glad_glCompressedTextureImage2DEXT; +#define glCompressedTextureImage2DEXT glad_glCompressedTextureImage2DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC glad_glCompressedTextureImage3DEXT; +#define glCompressedTextureImage3DEXT glad_glCompressedTextureImage3DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC glad_glCompressedTextureSubImage1DEXT; +#define glCompressedTextureSubImage1DEXT glad_glCompressedTextureSubImage1DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC glad_glCompressedTextureSubImage2DEXT; +#define glCompressedTextureSubImage2DEXT glad_glCompressedTextureSubImage2DEXT +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC glad_glCompressedTextureSubImage3DEXT; +#define glCompressedTextureSubImage3DEXT glad_glCompressedTextureSubImage3DEXT +GLAD_API_CALL PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D; +#define glConvolutionFilter1D glad_glConvolutionFilter1D +GLAD_API_CALL PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D; +#define glConvolutionFilter2D glad_glConvolutionFilter2D +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf; +#define glConvolutionParameterf glad_glConvolutionParameterf +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv; +#define glConvolutionParameterfv glad_glConvolutionParameterfv +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri; +#define glConvolutionParameteri glad_glConvolutionParameteri +GLAD_API_CALL PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv; +#define glConvolutionParameteriv glad_glConvolutionParameteriv +GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; +#define glCopyBufferSubData glad_glCopyBufferSubData +GLAD_API_CALL PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable; +#define glCopyColorSubTable glad_glCopyColorSubTable +GLAD_API_CALL PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable; +#define glCopyColorTable glad_glCopyColorTable +GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D; +#define glCopyConvolutionFilter1D glad_glCopyConvolutionFilter1D +GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D; +#define glCopyConvolutionFilter2D glad_glCopyConvolutionFilter2D +GLAD_API_CALL PFNGLCOPYMULTITEXIMAGE1DEXTPROC glad_glCopyMultiTexImage1DEXT; +#define glCopyMultiTexImage1DEXT glad_glCopyMultiTexImage1DEXT +GLAD_API_CALL PFNGLCOPYMULTITEXIMAGE2DEXTPROC glad_glCopyMultiTexImage2DEXT; +#define glCopyMultiTexImage2DEXT glad_glCopyMultiTexImage2DEXT +GLAD_API_CALL PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC glad_glCopyMultiTexSubImage1DEXT; +#define glCopyMultiTexSubImage1DEXT glad_glCopyMultiTexSubImage1DEXT +GLAD_API_CALL PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC glad_glCopyMultiTexSubImage2DEXT; +#define glCopyMultiTexSubImage2DEXT glad_glCopyMultiTexSubImage2DEXT +GLAD_API_CALL PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC glad_glCopyMultiTexSubImage3DEXT; +#define glCopyMultiTexSubImage3DEXT glad_glCopyMultiTexSubImage3DEXT +GLAD_API_CALL PFNGLCOPYPIXELSPROC glad_glCopyPixels; +#define glCopyPixels glad_glCopyPixels +GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; +#define glCopyTexImage1D glad_glCopyTexImage1D +GLAD_API_CALL PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT; +#define glCopyTexImage1DEXT glad_glCopyTexImage1DEXT +GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; +#define glCopyTexImage2D glad_glCopyTexImage2D +GLAD_API_CALL PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT; +#define glCopyTexImage2DEXT glad_glCopyTexImage2DEXT +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; +#define glCopyTexSubImage1D glad_glCopyTexSubImage1D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT; +#define glCopyTexSubImage1DEXT glad_glCopyTexSubImage1DEXT +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; +#define glCopyTexSubImage2D glad_glCopyTexSubImage2D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT; +#define glCopyTexSubImage2DEXT glad_glCopyTexSubImage2DEXT +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; +#define glCopyTexSubImage3D glad_glCopyTexSubImage3D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT; +#define glCopyTexSubImage3DEXT glad_glCopyTexSubImage3DEXT +GLAD_API_CALL PFNGLCOPYTEXTUREIMAGE1DEXTPROC glad_glCopyTextureImage1DEXT; +#define glCopyTextureImage1DEXT glad_glCopyTextureImage1DEXT +GLAD_API_CALL PFNGLCOPYTEXTUREIMAGE2DEXTPROC glad_glCopyTextureImage2DEXT; +#define glCopyTextureImage2DEXT glad_glCopyTextureImage2DEXT +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC glad_glCopyTextureSubImage1DEXT; +#define glCopyTextureSubImage1DEXT glad_glCopyTextureSubImage1DEXT +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC glad_glCopyTextureSubImage2DEXT; +#define glCopyTextureSubImage2DEXT glad_glCopyTextureSubImage2DEXT +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC glad_glCopyTextureSubImage3DEXT; +#define glCopyTextureSubImage3DEXT glad_glCopyTextureSubImage3DEXT +GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram; +#define glCreateProgram glad_glCreateProgram +GLAD_API_CALL PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB; +#define glCreateProgramObjectARB glad_glCreateProgramObjectARB +GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader; +#define glCreateShader glad_glCreateShader +GLAD_API_CALL PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB; +#define glCreateShaderObjectARB glad_glCreateShaderObjectARB +GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace; +#define glCullFace glad_glCullFace +GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback; +#define glDebugMessageCallback glad_glDebugMessageCallback +GLAD_API_CALL PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl; +#define glDebugMessageControl glad_glDebugMessageControl +GLAD_API_CALL PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert; +#define glDebugMessageInsert glad_glDebugMessageInsert +GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; +#define glDeleteBuffers glad_glDeleteBuffers +GLAD_API_CALL PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB; +#define glDeleteBuffersARB glad_glDeleteBuffersARB +GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; +#define glDeleteFramebuffers glad_glDeleteFramebuffers +GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT; +#define glDeleteFramebuffersEXT glad_glDeleteFramebuffersEXT +GLAD_API_CALL PFNGLDELETELISTSPROC glad_glDeleteLists; +#define glDeleteLists glad_glDeleteLists +GLAD_API_CALL PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB; +#define glDeleteObjectARB glad_glDeleteObjectARB +GLAD_API_CALL PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; +#define glDeleteProgram glad_glDeleteProgram +GLAD_API_CALL PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB; +#define glDeleteProgramsARB glad_glDeleteProgramsARB +GLAD_API_CALL PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV; +#define glDeleteProgramsNV glad_glDeleteProgramsNV +GLAD_API_CALL PFNGLDELETEQUERIESPROC glad_glDeleteQueries; +#define glDeleteQueries glad_glDeleteQueries +GLAD_API_CALL PFNGLDELETEQUERIESARBPROC glad_glDeleteQueriesARB; +#define glDeleteQueriesARB glad_glDeleteQueriesARB +GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; +#define glDeleteRenderbuffers glad_glDeleteRenderbuffers +GLAD_API_CALL PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT; +#define glDeleteRenderbuffersEXT glad_glDeleteRenderbuffersEXT +GLAD_API_CALL PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; +#define glDeleteSamplers glad_glDeleteSamplers +GLAD_API_CALL PFNGLDELETESHADERPROC glad_glDeleteShader; +#define glDeleteShader glad_glDeleteShader +GLAD_API_CALL PFNGLDELETESYNCPROC glad_glDeleteSync; +#define glDeleteSync glad_glDeleteSync +GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures; +#define glDeleteTextures glad_glDeleteTextures +GLAD_API_CALL PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT; +#define glDeleteTexturesEXT glad_glDeleteTexturesEXT +GLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; +#define glDeleteVertexArrays glad_glDeleteVertexArrays +GLAD_API_CALL PFNGLDELETEVERTEXARRAYSAPPLEPROC glad_glDeleteVertexArraysAPPLE; +#define glDeleteVertexArraysAPPLE glad_glDeleteVertexArraysAPPLE +GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc; +#define glDepthFunc glad_glDepthFunc +GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask; +#define glDepthMask glad_glDepthMask +GLAD_API_CALL PFNGLDEPTHRANGEPROC glad_glDepthRange; +#define glDepthRange glad_glDepthRange +GLAD_API_CALL PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB; +#define glDetachObjectARB glad_glDetachObjectARB +GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader; +#define glDetachShader glad_glDetachShader +GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable; +#define glDisable glad_glDisable +GLAD_API_CALL PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState; +#define glDisableClientState glad_glDisableClientState +GLAD_API_CALL PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC glad_glDisableClientStateIndexedEXT; +#define glDisableClientStateIndexedEXT glad_glDisableClientStateIndexedEXT +GLAD_API_CALL PFNGLDISABLECLIENTSTATEIEXTPROC glad_glDisableClientStateiEXT; +#define glDisableClientStateiEXT glad_glDisableClientStateiEXT +GLAD_API_CALL PFNGLDISABLEINDEXEDEXTPROC glad_glDisableIndexedEXT; +#define glDisableIndexedEXT glad_glDisableIndexedEXT +GLAD_API_CALL PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC glad_glDisableVertexArrayAttribEXT; +#define glDisableVertexArrayAttribEXT glad_glDisableVertexArrayAttribEXT +GLAD_API_CALL PFNGLDISABLEVERTEXARRAYEXTPROC glad_glDisableVertexArrayEXT; +#define glDisableVertexArrayEXT glad_glDisableVertexArrayEXT +GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; +#define glDisableVertexAttribArray glad_glDisableVertexAttribArray +GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB; +#define glDisableVertexAttribArrayARB glad_glDisableVertexAttribArrayARB +GLAD_API_CALL PFNGLDISABLEIPROC glad_glDisablei; +#define glDisablei glad_glDisablei +GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays; +#define glDrawArrays glad_glDrawArrays +GLAD_API_CALL PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT; +#define glDrawArraysEXT glad_glDrawArraysEXT +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; +#define glDrawArraysInstanced glad_glDrawArraysInstanced +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDARBPROC glad_glDrawArraysInstancedARB; +#define glDrawArraysInstancedARB glad_glDrawArraysInstancedARB +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDEXTPROC glad_glDrawArraysInstancedEXT; +#define glDrawArraysInstancedEXT glad_glDrawArraysInstancedEXT +GLAD_API_CALL PFNGLDRAWBUFFERPROC glad_glDrawBuffer; +#define glDrawBuffer glad_glDrawBuffer +GLAD_API_CALL PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; +#define glDrawBuffers glad_glDrawBuffers +GLAD_API_CALL PFNGLDRAWBUFFERSARBPROC glad_glDrawBuffersARB; +#define glDrawBuffersARB glad_glDrawBuffersARB +GLAD_API_CALL PFNGLDRAWBUFFERSATIPROC glad_glDrawBuffersATI; +#define glDrawBuffersATI glad_glDrawBuffersATI +GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements; +#define glDrawElements glad_glDrawElements +GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; +#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; +#define glDrawElementsInstanced glad_glDrawElementsInstanced +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDARBPROC glad_glDrawElementsInstancedARB; +#define glDrawElementsInstancedARB glad_glDrawElementsInstancedARB +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; +#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDEXTPROC glad_glDrawElementsInstancedEXT; +#define glDrawElementsInstancedEXT glad_glDrawElementsInstancedEXT +GLAD_API_CALL PFNGLDRAWPIXELSPROC glad_glDrawPixels; +#define glDrawPixels glad_glDrawPixels +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; +#define glDrawRangeElements glad_glDrawRangeElements +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; +#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSEXTPROC glad_glDrawRangeElementsEXT; +#define glDrawRangeElementsEXT glad_glDrawRangeElementsEXT +GLAD_API_CALL PFNGLEDGEFLAGPROC glad_glEdgeFlag; +#define glEdgeFlag glad_glEdgeFlag +GLAD_API_CALL PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer; +#define glEdgeFlagPointer glad_glEdgeFlagPointer +GLAD_API_CALL PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT; +#define glEdgeFlagPointerEXT glad_glEdgeFlagPointerEXT +GLAD_API_CALL PFNGLEDGEFLAGVPROC glad_glEdgeFlagv; +#define glEdgeFlagv glad_glEdgeFlagv +GLAD_API_CALL PFNGLENABLEPROC glad_glEnable; +#define glEnable glad_glEnable +GLAD_API_CALL PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState; +#define glEnableClientState glad_glEnableClientState +GLAD_API_CALL PFNGLENABLECLIENTSTATEINDEXEDEXTPROC glad_glEnableClientStateIndexedEXT; +#define glEnableClientStateIndexedEXT glad_glEnableClientStateIndexedEXT +GLAD_API_CALL PFNGLENABLECLIENTSTATEIEXTPROC glad_glEnableClientStateiEXT; +#define glEnableClientStateiEXT glad_glEnableClientStateiEXT +GLAD_API_CALL PFNGLENABLEINDEXEDEXTPROC glad_glEnableIndexedEXT; +#define glEnableIndexedEXT glad_glEnableIndexedEXT +GLAD_API_CALL PFNGLENABLEVERTEXARRAYATTRIBEXTPROC glad_glEnableVertexArrayAttribEXT; +#define glEnableVertexArrayAttribEXT glad_glEnableVertexArrayAttribEXT +GLAD_API_CALL PFNGLENABLEVERTEXARRAYEXTPROC glad_glEnableVertexArrayEXT; +#define glEnableVertexArrayEXT glad_glEnableVertexArrayEXT +GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; +#define glEnableVertexAttribArray glad_glEnableVertexAttribArray +GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB; +#define glEnableVertexAttribArrayARB glad_glEnableVertexAttribArrayARB +GLAD_API_CALL PFNGLENABLEIPROC glad_glEnablei; +#define glEnablei glad_glEnablei +GLAD_API_CALL PFNGLENDPROC glad_glEnd; +#define glEnd glad_glEnd +GLAD_API_CALL PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; +#define glEndConditionalRender glad_glEndConditionalRender +GLAD_API_CALL PFNGLENDCONDITIONALRENDERNVPROC glad_glEndConditionalRenderNV; +#define glEndConditionalRenderNV glad_glEndConditionalRenderNV +GLAD_API_CALL PFNGLENDCONDITIONALRENDERNVXPROC glad_glEndConditionalRenderNVX; +#define glEndConditionalRenderNVX glad_glEndConditionalRenderNVX +GLAD_API_CALL PFNGLENDLISTPROC glad_glEndList; +#define glEndList glad_glEndList +GLAD_API_CALL PFNGLENDQUERYPROC glad_glEndQuery; +#define glEndQuery glad_glEndQuery +GLAD_API_CALL PFNGLENDQUERYARBPROC glad_glEndQueryARB; +#define glEndQueryARB glad_glEndQueryARB +GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; +#define glEndTransformFeedback glad_glEndTransformFeedback +GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKEXTPROC glad_glEndTransformFeedbackEXT; +#define glEndTransformFeedbackEXT glad_glEndTransformFeedbackEXT +GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKNVPROC glad_glEndTransformFeedbackNV; +#define glEndTransformFeedbackNV glad_glEndTransformFeedbackNV +GLAD_API_CALL PFNGLEVALCOORD1DPROC glad_glEvalCoord1d; +#define glEvalCoord1d glad_glEvalCoord1d +GLAD_API_CALL PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv; +#define glEvalCoord1dv glad_glEvalCoord1dv +GLAD_API_CALL PFNGLEVALCOORD1FPROC glad_glEvalCoord1f; +#define glEvalCoord1f glad_glEvalCoord1f +GLAD_API_CALL PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv; +#define glEvalCoord1fv glad_glEvalCoord1fv +GLAD_API_CALL PFNGLEVALCOORD2DPROC glad_glEvalCoord2d; +#define glEvalCoord2d glad_glEvalCoord2d +GLAD_API_CALL PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv; +#define glEvalCoord2dv glad_glEvalCoord2dv +GLAD_API_CALL PFNGLEVALCOORD2FPROC glad_glEvalCoord2f; +#define glEvalCoord2f glad_glEvalCoord2f +GLAD_API_CALL PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv; +#define glEvalCoord2fv glad_glEvalCoord2fv +GLAD_API_CALL PFNGLEVALMESH1PROC glad_glEvalMesh1; +#define glEvalMesh1 glad_glEvalMesh1 +GLAD_API_CALL PFNGLEVALMESH2PROC glad_glEvalMesh2; +#define glEvalMesh2 glad_glEvalMesh2 +GLAD_API_CALL PFNGLEVALPOINT1PROC glad_glEvalPoint1; +#define glEvalPoint1 glad_glEvalPoint1 +GLAD_API_CALL PFNGLEVALPOINT2PROC glad_glEvalPoint2; +#define glEvalPoint2 glad_glEvalPoint2 +GLAD_API_CALL PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV; +#define glExecuteProgramNV glad_glExecuteProgramNV +GLAD_API_CALL PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer; +#define glFeedbackBuffer glad_glFeedbackBuffer +GLAD_API_CALL PFNGLFENCESYNCPROC glad_glFenceSync; +#define glFenceSync glad_glFenceSync +GLAD_API_CALL PFNGLFINISHPROC glad_glFinish; +#define glFinish glad_glFinish +GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush; +#define glFlush glad_glFlush +GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; +#define glFlushMappedBufferRange glad_glFlushMappedBufferRange +GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glad_glFlushMappedBufferRangeAPPLE; +#define glFlushMappedBufferRangeAPPLE glad_glFlushMappedBufferRangeAPPLE +GLAD_API_CALL PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC glad_glFlushMappedNamedBufferRangeEXT; +#define glFlushMappedNamedBufferRangeEXT glad_glFlushMappedNamedBufferRangeEXT +GLAD_API_CALL PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer; +#define glFogCoordPointer glad_glFogCoordPointer +GLAD_API_CALL PFNGLFOGCOORDPOINTEREXTPROC glad_glFogCoordPointerEXT; +#define glFogCoordPointerEXT glad_glFogCoordPointerEXT +GLAD_API_CALL PFNGLFOGCOORDDPROC glad_glFogCoordd; +#define glFogCoordd glad_glFogCoordd +GLAD_API_CALL PFNGLFOGCOORDDEXTPROC glad_glFogCoorddEXT; +#define glFogCoorddEXT glad_glFogCoorddEXT +GLAD_API_CALL PFNGLFOGCOORDDVPROC glad_glFogCoorddv; +#define glFogCoorddv glad_glFogCoorddv +GLAD_API_CALL PFNGLFOGCOORDDVEXTPROC glad_glFogCoorddvEXT; +#define glFogCoorddvEXT glad_glFogCoorddvEXT +GLAD_API_CALL PFNGLFOGCOORDFPROC glad_glFogCoordf; +#define glFogCoordf glad_glFogCoordf +GLAD_API_CALL PFNGLFOGCOORDFEXTPROC glad_glFogCoordfEXT; +#define glFogCoordfEXT glad_glFogCoordfEXT +GLAD_API_CALL PFNGLFOGCOORDFVPROC glad_glFogCoordfv; +#define glFogCoordfv glad_glFogCoordfv +GLAD_API_CALL PFNGLFOGCOORDFVEXTPROC glad_glFogCoordfvEXT; +#define glFogCoordfvEXT glad_glFogCoordfvEXT +GLAD_API_CALL PFNGLFOGFPROC glad_glFogf; +#define glFogf glad_glFogf +GLAD_API_CALL PFNGLFOGFVPROC glad_glFogfv; +#define glFogfv glad_glFogfv +GLAD_API_CALL PFNGLFOGIPROC glad_glFogi; +#define glFogi glad_glFogi +GLAD_API_CALL PFNGLFOGIVPROC glad_glFogiv; +#define glFogiv glad_glFogiv +GLAD_API_CALL PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC glad_glFramebufferDrawBufferEXT; +#define glFramebufferDrawBufferEXT glad_glFramebufferDrawBufferEXT +GLAD_API_CALL PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC glad_glFramebufferDrawBuffersEXT; +#define glFramebufferDrawBuffersEXT glad_glFramebufferDrawBuffersEXT +GLAD_API_CALL PFNGLFRAMEBUFFERREADBUFFEREXTPROC glad_glFramebufferReadBufferEXT; +#define glFramebufferReadBufferEXT glad_glFramebufferReadBufferEXT +GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; +#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer +GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT; +#define glFramebufferRenderbufferEXT glad_glFramebufferRenderbufferEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; +#define glFramebufferTexture glad_glFramebufferTexture +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; +#define glFramebufferTexture1D glad_glFramebufferTexture1D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT; +#define glFramebufferTexture1DEXT glad_glFramebufferTexture1DEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; +#define glFramebufferTexture2D glad_glFramebufferTexture2D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT; +#define glFramebufferTexture2DEXT glad_glFramebufferTexture2DEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; +#define glFramebufferTexture3D glad_glFramebufferTexture3D +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT; +#define glFramebufferTexture3DEXT glad_glFramebufferTexture3DEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB; +#define glFramebufferTextureARB glad_glFramebufferTextureARB +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT; +#define glFramebufferTextureEXT glad_glFramebufferTextureEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB; +#define glFramebufferTextureFaceARB glad_glFramebufferTextureFaceARB +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT; +#define glFramebufferTextureFaceEXT glad_glFramebufferTextureFaceEXT +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; +#define glFramebufferTextureLayer glad_glFramebufferTextureLayer +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB; +#define glFramebufferTextureLayerARB glad_glFramebufferTextureLayerARB +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT; +#define glFramebufferTextureLayerEXT glad_glFramebufferTextureLayerEXT +GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace; +#define glFrontFace glad_glFrontFace +GLAD_API_CALL PFNGLFRUSTUMPROC glad_glFrustum; +#define glFrustum glad_glFrustum +GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers; +#define glGenBuffers glad_glGenBuffers +GLAD_API_CALL PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB; +#define glGenBuffersARB glad_glGenBuffersARB +GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; +#define glGenFramebuffers glad_glGenFramebuffers +GLAD_API_CALL PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT; +#define glGenFramebuffersEXT glad_glGenFramebuffersEXT +GLAD_API_CALL PFNGLGENLISTSPROC glad_glGenLists; +#define glGenLists glad_glGenLists +GLAD_API_CALL PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB; +#define glGenProgramsARB glad_glGenProgramsARB +GLAD_API_CALL PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV; +#define glGenProgramsNV glad_glGenProgramsNV +GLAD_API_CALL PFNGLGENQUERIESPROC glad_glGenQueries; +#define glGenQueries glad_glGenQueries +GLAD_API_CALL PFNGLGENQUERIESARBPROC glad_glGenQueriesARB; +#define glGenQueriesARB glad_glGenQueriesARB +GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; +#define glGenRenderbuffers glad_glGenRenderbuffers +GLAD_API_CALL PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT; +#define glGenRenderbuffersEXT glad_glGenRenderbuffersEXT +GLAD_API_CALL PFNGLGENSAMPLERSPROC glad_glGenSamplers; +#define glGenSamplers glad_glGenSamplers +GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures; +#define glGenTextures glad_glGenTextures +GLAD_API_CALL PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT; +#define glGenTexturesEXT glad_glGenTexturesEXT +GLAD_API_CALL PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; +#define glGenVertexArrays glad_glGenVertexArrays +GLAD_API_CALL PFNGLGENVERTEXARRAYSAPPLEPROC glad_glGenVertexArraysAPPLE; +#define glGenVertexArraysAPPLE glad_glGenVertexArraysAPPLE +GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; +#define glGenerateMipmap glad_glGenerateMipmap +GLAD_API_CALL PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT; +#define glGenerateMipmapEXT glad_glGenerateMipmapEXT +GLAD_API_CALL PFNGLGENERATEMULTITEXMIPMAPEXTPROC glad_glGenerateMultiTexMipmapEXT; +#define glGenerateMultiTexMipmapEXT glad_glGenerateMultiTexMipmapEXT +GLAD_API_CALL PFNGLGENERATETEXTUREMIPMAPEXTPROC glad_glGenerateTextureMipmapEXT; +#define glGenerateTextureMipmapEXT glad_glGenerateTextureMipmapEXT +GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; +#define glGetActiveAttrib glad_glGetActiveAttrib +GLAD_API_CALL PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB; +#define glGetActiveAttribARB glad_glGetActiveAttribARB +GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; +#define glGetActiveUniform glad_glGetActiveUniform +GLAD_API_CALL PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB; +#define glGetActiveUniformARB glad_glGetActiveUniformARB +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; +#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; +#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv +GLAD_API_CALL PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; +#define glGetActiveUniformName glad_glGetActiveUniformName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; +#define glGetActiveUniformsiv glad_glGetActiveUniformsiv +GLAD_API_CALL PFNGLGETACTIVEVARYINGNVPROC glad_glGetActiveVaryingNV; +#define glGetActiveVaryingNV glad_glGetActiveVaryingNV +GLAD_API_CALL PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB; +#define glGetAttachedObjectsARB glad_glGetAttachedObjectsARB +GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; +#define glGetAttachedShaders glad_glGetAttachedShaders +GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; +#define glGetAttribLocation glad_glGetAttribLocation +GLAD_API_CALL PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB; +#define glGetAttribLocationARB glad_glGetAttribLocationARB +GLAD_API_CALL PFNGLGETBOOLEANINDEXEDVEXTPROC glad_glGetBooleanIndexedvEXT; +#define glGetBooleanIndexedvEXT glad_glGetBooleanIndexedvEXT +GLAD_API_CALL PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; +#define glGetBooleani_v glad_glGetBooleani_v +GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv; +#define glGetBooleanv glad_glGetBooleanv +GLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; +#define glGetBufferParameteri64v glad_glGetBufferParameteri64v +GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; +#define glGetBufferParameteriv glad_glGetBufferParameteriv +GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB; +#define glGetBufferParameterivARB glad_glGetBufferParameterivARB +GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; +#define glGetBufferPointerv glad_glGetBufferPointerv +GLAD_API_CALL PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB; +#define glGetBufferPointervARB glad_glGetBufferPointervARB +GLAD_API_CALL PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; +#define glGetBufferSubData glad_glGetBufferSubData +GLAD_API_CALL PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB; +#define glGetBufferSubDataARB glad_glGetBufferSubDataARB +GLAD_API_CALL PFNGLGETCLIPPLANEPROC glad_glGetClipPlane; +#define glGetClipPlane glad_glGetClipPlane +GLAD_API_CALL PFNGLGETCOLORTABLEPROC glad_glGetColorTable; +#define glGetColorTable glad_glGetColorTable +GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv; +#define glGetColorTableParameterfv glad_glGetColorTableParameterfv +GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv; +#define glGetColorTableParameteriv glad_glGetColorTableParameteriv +GLAD_API_CALL PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC glad_glGetCompressedMultiTexImageEXT; +#define glGetCompressedMultiTexImageEXT glad_glGetCompressedMultiTexImageEXT +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; +#define glGetCompressedTexImage glad_glGetCompressedTexImage +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glad_glGetCompressedTexImageARB; +#define glGetCompressedTexImageARB glad_glGetCompressedTexImageARB +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC glad_glGetCompressedTextureImageEXT; +#define glGetCompressedTextureImageEXT glad_glGetCompressedTextureImageEXT +GLAD_API_CALL PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter; +#define glGetConvolutionFilter glad_glGetConvolutionFilter +GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv; +#define glGetConvolutionParameterfv glad_glGetConvolutionParameterfv +GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv; +#define glGetConvolutionParameteriv glad_glGetConvolutionParameteriv +GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog; +#define glGetDebugMessageLog glad_glGetDebugMessageLog +GLAD_API_CALL PFNGLGETDOUBLEINDEXEDVEXTPROC glad_glGetDoubleIndexedvEXT; +#define glGetDoubleIndexedvEXT glad_glGetDoubleIndexedvEXT +GLAD_API_CALL PFNGLGETDOUBLEI_VEXTPROC glad_glGetDoublei_vEXT; +#define glGetDoublei_vEXT glad_glGetDoublei_vEXT +GLAD_API_CALL PFNGLGETDOUBLEVPROC glad_glGetDoublev; +#define glGetDoublev glad_glGetDoublev +GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError; +#define glGetError glad_glGetError +GLAD_API_CALL PFNGLGETFLOATINDEXEDVEXTPROC glad_glGetFloatIndexedvEXT; +#define glGetFloatIndexedvEXT glad_glGetFloatIndexedvEXT +GLAD_API_CALL PFNGLGETFLOATI_VEXTPROC glad_glGetFloati_vEXT; +#define glGetFloati_vEXT glad_glGetFloati_vEXT +GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv; +#define glGetFloatv glad_glGetFloatv +GLAD_API_CALL PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; +#define glGetFragDataIndex glad_glGetFragDataIndex +GLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; +#define glGetFragDataLocation glad_glGetFragDataLocation +GLAD_API_CALL PFNGLGETFRAGDATALOCATIONEXTPROC glad_glGetFragDataLocationEXT; +#define glGetFragDataLocationEXT glad_glGetFragDataLocationEXT +GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; +#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv +GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT; +#define glGetFramebufferAttachmentParameterivEXT glad_glGetFramebufferAttachmentParameterivEXT +GLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC glad_glGetFramebufferParameterivEXT; +#define glGetFramebufferParameterivEXT glad_glGetFramebufferParameterivEXT +GLAD_API_CALL PFNGLGETHANDLEARBPROC glad_glGetHandleARB; +#define glGetHandleARB glad_glGetHandleARB +GLAD_API_CALL PFNGLGETHISTOGRAMPROC glad_glGetHistogram; +#define glGetHistogram glad_glGetHistogram +GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv; +#define glGetHistogramParameterfv glad_glGetHistogramParameterfv +GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv; +#define glGetHistogramParameteriv glad_glGetHistogramParameteriv +GLAD_API_CALL PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB; +#define glGetInfoLogARB glad_glGetInfoLogARB +GLAD_API_CALL PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; +#define glGetInteger64i_v glad_glGetInteger64i_v +GLAD_API_CALL PFNGLGETINTEGER64VPROC glad_glGetInteger64v; +#define glGetInteger64v glad_glGetInteger64v +GLAD_API_CALL PFNGLGETINTEGERINDEXEDVEXTPROC glad_glGetIntegerIndexedvEXT; +#define glGetIntegerIndexedvEXT glad_glGetIntegerIndexedvEXT +GLAD_API_CALL PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; +#define glGetIntegeri_v glad_glGetIntegeri_v +GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv; +#define glGetIntegerv glad_glGetIntegerv +GLAD_API_CALL PFNGLGETLIGHTFVPROC glad_glGetLightfv; +#define glGetLightfv glad_glGetLightfv +GLAD_API_CALL PFNGLGETLIGHTIVPROC glad_glGetLightiv; +#define glGetLightiv glad_glGetLightiv +GLAD_API_CALL PFNGLGETMAPDVPROC glad_glGetMapdv; +#define glGetMapdv glad_glGetMapdv +GLAD_API_CALL PFNGLGETMAPFVPROC glad_glGetMapfv; +#define glGetMapfv glad_glGetMapfv +GLAD_API_CALL PFNGLGETMAPIVPROC glad_glGetMapiv; +#define glGetMapiv glad_glGetMapiv +GLAD_API_CALL PFNGLGETMATERIALFVPROC glad_glGetMaterialfv; +#define glGetMaterialfv glad_glGetMaterialfv +GLAD_API_CALL PFNGLGETMATERIALIVPROC glad_glGetMaterialiv; +#define glGetMaterialiv glad_glGetMaterialiv +GLAD_API_CALL PFNGLGETMINMAXPROC glad_glGetMinmax; +#define glGetMinmax glad_glGetMinmax +GLAD_API_CALL PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv; +#define glGetMinmaxParameterfv glad_glGetMinmaxParameterfv +GLAD_API_CALL PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv; +#define glGetMinmaxParameteriv glad_glGetMinmaxParameteriv +GLAD_API_CALL PFNGLGETMULTITEXENVFVEXTPROC glad_glGetMultiTexEnvfvEXT; +#define glGetMultiTexEnvfvEXT glad_glGetMultiTexEnvfvEXT +GLAD_API_CALL PFNGLGETMULTITEXENVIVEXTPROC glad_glGetMultiTexEnvivEXT; +#define glGetMultiTexEnvivEXT glad_glGetMultiTexEnvivEXT +GLAD_API_CALL PFNGLGETMULTITEXGENDVEXTPROC glad_glGetMultiTexGendvEXT; +#define glGetMultiTexGendvEXT glad_glGetMultiTexGendvEXT +GLAD_API_CALL PFNGLGETMULTITEXGENFVEXTPROC glad_glGetMultiTexGenfvEXT; +#define glGetMultiTexGenfvEXT glad_glGetMultiTexGenfvEXT +GLAD_API_CALL PFNGLGETMULTITEXGENIVEXTPROC glad_glGetMultiTexGenivEXT; +#define glGetMultiTexGenivEXT glad_glGetMultiTexGenivEXT +GLAD_API_CALL PFNGLGETMULTITEXIMAGEEXTPROC glad_glGetMultiTexImageEXT; +#define glGetMultiTexImageEXT glad_glGetMultiTexImageEXT +GLAD_API_CALL PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC glad_glGetMultiTexLevelParameterfvEXT; +#define glGetMultiTexLevelParameterfvEXT glad_glGetMultiTexLevelParameterfvEXT +GLAD_API_CALL PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC glad_glGetMultiTexLevelParameterivEXT; +#define glGetMultiTexLevelParameterivEXT glad_glGetMultiTexLevelParameterivEXT +GLAD_API_CALL PFNGLGETMULTITEXPARAMETERIIVEXTPROC glad_glGetMultiTexParameterIivEXT; +#define glGetMultiTexParameterIivEXT glad_glGetMultiTexParameterIivEXT +GLAD_API_CALL PFNGLGETMULTITEXPARAMETERIUIVEXTPROC glad_glGetMultiTexParameterIuivEXT; +#define glGetMultiTexParameterIuivEXT glad_glGetMultiTexParameterIuivEXT +GLAD_API_CALL PFNGLGETMULTITEXPARAMETERFVEXTPROC glad_glGetMultiTexParameterfvEXT; +#define glGetMultiTexParameterfvEXT glad_glGetMultiTexParameterfvEXT +GLAD_API_CALL PFNGLGETMULTITEXPARAMETERIVEXTPROC glad_glGetMultiTexParameterivEXT; +#define glGetMultiTexParameterivEXT glad_glGetMultiTexParameterivEXT +GLAD_API_CALL PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; +#define glGetMultisamplefv glad_glGetMultisamplefv +GLAD_API_CALL PFNGLGETMULTISAMPLEFVNVPROC glad_glGetMultisamplefvNV; +#define glGetMultisamplefvNV glad_glGetMultisamplefvNV +GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC glad_glGetNamedBufferParameterivEXT; +#define glGetNamedBufferParameterivEXT glad_glGetNamedBufferParameterivEXT +GLAD_API_CALL PFNGLGETNAMEDBUFFERPOINTERVEXTPROC glad_glGetNamedBufferPointervEXT; +#define glGetNamedBufferPointervEXT glad_glGetNamedBufferPointervEXT +GLAD_API_CALL PFNGLGETNAMEDBUFFERSUBDATAEXTPROC glad_glGetNamedBufferSubDataEXT; +#define glGetNamedBufferSubDataEXT glad_glGetNamedBufferSubDataEXT +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetNamedFramebufferAttachmentParameterivEXT; +#define glGetNamedFramebufferAttachmentParameterivEXT glad_glGetNamedFramebufferAttachmentParameterivEXT +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC glad_glGetNamedFramebufferParameterivEXT; +#define glGetNamedFramebufferParameterivEXT glad_glGetNamedFramebufferParameterivEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC glad_glGetNamedProgramLocalParameterIivEXT; +#define glGetNamedProgramLocalParameterIivEXT glad_glGetNamedProgramLocalParameterIivEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC glad_glGetNamedProgramLocalParameterIuivEXT; +#define glGetNamedProgramLocalParameterIuivEXT glad_glGetNamedProgramLocalParameterIuivEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC glad_glGetNamedProgramLocalParameterdvEXT; +#define glGetNamedProgramLocalParameterdvEXT glad_glGetNamedProgramLocalParameterdvEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC glad_glGetNamedProgramLocalParameterfvEXT; +#define glGetNamedProgramLocalParameterfvEXT glad_glGetNamedProgramLocalParameterfvEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMSTRINGEXTPROC glad_glGetNamedProgramStringEXT; +#define glGetNamedProgramStringEXT glad_glGetNamedProgramStringEXT +GLAD_API_CALL PFNGLGETNAMEDPROGRAMIVEXTPROC glad_glGetNamedProgramivEXT; +#define glGetNamedProgramivEXT glad_glGetNamedProgramivEXT +GLAD_API_CALL PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC glad_glGetNamedRenderbufferParameterivEXT; +#define glGetNamedRenderbufferParameterivEXT glad_glGetNamedRenderbufferParameterivEXT +GLAD_API_CALL PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel; +#define glGetObjectLabel glad_glGetObjectLabel +GLAD_API_CALL PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB; +#define glGetObjectParameterfvARB glad_glGetObjectParameterfvARB +GLAD_API_CALL PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB; +#define glGetObjectParameterivARB glad_glGetObjectParameterivARB +GLAD_API_CALL PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel; +#define glGetObjectPtrLabel glad_glGetObjectPtrLabel +GLAD_API_CALL PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv; +#define glGetPixelMapfv glad_glGetPixelMapfv +GLAD_API_CALL PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv; +#define glGetPixelMapuiv glad_glGetPixelMapuiv +GLAD_API_CALL PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv; +#define glGetPixelMapusv glad_glGetPixelMapusv +GLAD_API_CALL PFNGLGETPOINTERINDEXEDVEXTPROC glad_glGetPointerIndexedvEXT; +#define glGetPointerIndexedvEXT glad_glGetPointerIndexedvEXT +GLAD_API_CALL PFNGLGETPOINTERI_VEXTPROC glad_glGetPointeri_vEXT; +#define glGetPointeri_vEXT glad_glGetPointeri_vEXT +GLAD_API_CALL PFNGLGETPOINTERVPROC glad_glGetPointerv; +#define glGetPointerv glad_glGetPointerv +GLAD_API_CALL PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT; +#define glGetPointervEXT glad_glGetPointervEXT +GLAD_API_CALL PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple; +#define glGetPolygonStipple glad_glGetPolygonStipple +GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB; +#define glGetProgramEnvParameterdvARB glad_glGetProgramEnvParameterdvARB +GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB; +#define glGetProgramEnvParameterfvARB glad_glGetProgramEnvParameterfvARB +GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; +#define glGetProgramInfoLog glad_glGetProgramInfoLog +GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB; +#define glGetProgramLocalParameterdvARB glad_glGetProgramLocalParameterdvARB +GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB; +#define glGetProgramLocalParameterfvARB glad_glGetProgramLocalParameterfvARB +GLAD_API_CALL PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV; +#define glGetProgramParameterdvNV glad_glGetProgramParameterdvNV +GLAD_API_CALL PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV; +#define glGetProgramParameterfvNV glad_glGetProgramParameterfvNV +GLAD_API_CALL PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB; +#define glGetProgramStringARB glad_glGetProgramStringARB +GLAD_API_CALL PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV; +#define glGetProgramStringNV glad_glGetProgramStringNV +GLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; +#define glGetProgramiv glad_glGetProgramiv +GLAD_API_CALL PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB; +#define glGetProgramivARB glad_glGetProgramivARB +GLAD_API_CALL PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV; +#define glGetProgramivNV glad_glGetProgramivNV +GLAD_API_CALL PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; +#define glGetQueryObjecti64v glad_glGetQueryObjecti64v +GLAD_API_CALL PFNGLGETQUERYOBJECTI64VEXTPROC glad_glGetQueryObjecti64vEXT; +#define glGetQueryObjecti64vEXT glad_glGetQueryObjecti64vEXT +GLAD_API_CALL PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; +#define glGetQueryObjectiv glad_glGetQueryObjectiv +GLAD_API_CALL PFNGLGETQUERYOBJECTIVARBPROC glad_glGetQueryObjectivARB; +#define glGetQueryObjectivARB glad_glGetQueryObjectivARB +GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; +#define glGetQueryObjectui64v glad_glGetQueryObjectui64v +GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VEXTPROC glad_glGetQueryObjectui64vEXT; +#define glGetQueryObjectui64vEXT glad_glGetQueryObjectui64vEXT +GLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; +#define glGetQueryObjectuiv glad_glGetQueryObjectuiv +GLAD_API_CALL PFNGLGETQUERYOBJECTUIVARBPROC glad_glGetQueryObjectuivARB; +#define glGetQueryObjectuivARB glad_glGetQueryObjectuivARB +GLAD_API_CALL PFNGLGETQUERYIVPROC glad_glGetQueryiv; +#define glGetQueryiv glad_glGetQueryiv +GLAD_API_CALL PFNGLGETQUERYIVARBPROC glad_glGetQueryivARB; +#define glGetQueryivARB glad_glGetQueryivARB +GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; +#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv +GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT; +#define glGetRenderbufferParameterivEXT glad_glGetRenderbufferParameterivEXT +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; +#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; +#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; +#define glGetSamplerParameterfv glad_glGetSamplerParameterfv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; +#define glGetSamplerParameteriv glad_glGetSamplerParameteriv +GLAD_API_CALL PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter; +#define glGetSeparableFilter glad_glGetSeparableFilter +GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; +#define glGetShaderInfoLog glad_glGetShaderInfoLog +GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; +#define glGetShaderSource glad_glGetShaderSource +GLAD_API_CALL PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB; +#define glGetShaderSourceARB glad_glGetShaderSourceARB +GLAD_API_CALL PFNGLGETSHADERIVPROC glad_glGetShaderiv; +#define glGetShaderiv glad_glGetShaderiv +GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString; +#define glGetString glad_glGetString +GLAD_API_CALL PFNGLGETSTRINGIPROC glad_glGetStringi; +#define glGetStringi glad_glGetStringi +GLAD_API_CALL PFNGLGETSYNCIVPROC glad_glGetSynciv; +#define glGetSynciv glad_glGetSynciv +GLAD_API_CALL PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv; +#define glGetTexEnvfv glad_glGetTexEnvfv +GLAD_API_CALL PFNGLGETTEXENVIVPROC glad_glGetTexEnviv; +#define glGetTexEnviv glad_glGetTexEnviv +GLAD_API_CALL PFNGLGETTEXGENDVPROC glad_glGetTexGendv; +#define glGetTexGendv glad_glGetTexGendv +GLAD_API_CALL PFNGLGETTEXGENFVPROC glad_glGetTexGenfv; +#define glGetTexGenfv glad_glGetTexGenfv +GLAD_API_CALL PFNGLGETTEXGENIVPROC glad_glGetTexGeniv; +#define glGetTexGeniv glad_glGetTexGeniv +GLAD_API_CALL PFNGLGETTEXIMAGEPROC glad_glGetTexImage; +#define glGetTexImage glad_glGetTexImage +GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; +#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv +GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; +#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv +GLAD_API_CALL PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; +#define glGetTexParameterIiv glad_glGetTexParameterIiv +GLAD_API_CALL PFNGLGETTEXPARAMETERIIVEXTPROC glad_glGetTexParameterIivEXT; +#define glGetTexParameterIivEXT glad_glGetTexParameterIivEXT +GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; +#define glGetTexParameterIuiv glad_glGetTexParameterIuiv +GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVEXTPROC glad_glGetTexParameterIuivEXT; +#define glGetTexParameterIuivEXT glad_glGetTexParameterIuivEXT +GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; +#define glGetTexParameterfv glad_glGetTexParameterfv +GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; +#define glGetTexParameteriv glad_glGetTexParameteriv +GLAD_API_CALL PFNGLGETTEXTUREIMAGEEXTPROC glad_glGetTextureImageEXT; +#define glGetTextureImageEXT glad_glGetTextureImageEXT +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC glad_glGetTextureLevelParameterfvEXT; +#define glGetTextureLevelParameterfvEXT glad_glGetTextureLevelParameterfvEXT +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC glad_glGetTextureLevelParameterivEXT; +#define glGetTextureLevelParameterivEXT glad_glGetTextureLevelParameterivEXT +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIIVEXTPROC glad_glGetTextureParameterIivEXT; +#define glGetTextureParameterIivEXT glad_glGetTextureParameterIivEXT +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIUIVEXTPROC glad_glGetTextureParameterIuivEXT; +#define glGetTextureParameterIuivEXT glad_glGetTextureParameterIuivEXT +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERFVEXTPROC glad_glGetTextureParameterfvEXT; +#define glGetTextureParameterfvEXT glad_glGetTextureParameterfvEXT +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIVEXTPROC glad_glGetTextureParameterivEXT; +#define glGetTextureParameterivEXT glad_glGetTextureParameterivEXT +GLAD_API_CALL PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV; +#define glGetTrackMatrixivNV glad_glGetTrackMatrixivNV +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; +#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC glad_glGetTransformFeedbackVaryingEXT; +#define glGetTransformFeedbackVaryingEXT glad_glGetTransformFeedbackVaryingEXT +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC glad_glGetTransformFeedbackVaryingNV; +#define glGetTransformFeedbackVaryingNV glad_glGetTransformFeedbackVaryingNV +GLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; +#define glGetUniformBlockIndex glad_glGetUniformBlockIndex +GLAD_API_CALL PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; +#define glGetUniformIndices glad_glGetUniformIndices +GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; +#define glGetUniformLocation glad_glGetUniformLocation +GLAD_API_CALL PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB; +#define glGetUniformLocationARB glad_glGetUniformLocationARB +GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; +#define glGetUniformfv glad_glGetUniformfv +GLAD_API_CALL PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB; +#define glGetUniformfvARB glad_glGetUniformfvARB +GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; +#define glGetUniformiv glad_glGetUniformiv +GLAD_API_CALL PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB; +#define glGetUniformivARB glad_glGetUniformivARB +GLAD_API_CALL PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; +#define glGetUniformuiv glad_glGetUniformuiv +GLAD_API_CALL PFNGLGETUNIFORMUIVEXTPROC glad_glGetUniformuivEXT; +#define glGetUniformuivEXT glad_glGetUniformuivEXT +GLAD_API_CALL PFNGLGETVARYINGLOCATIONNVPROC glad_glGetVaryingLocationNV; +#define glGetVaryingLocationNV glad_glGetVaryingLocationNV +GLAD_API_CALL PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC glad_glGetVertexArrayIntegeri_vEXT; +#define glGetVertexArrayIntegeri_vEXT glad_glGetVertexArrayIntegeri_vEXT +GLAD_API_CALL PFNGLGETVERTEXARRAYINTEGERVEXTPROC glad_glGetVertexArrayIntegervEXT; +#define glGetVertexArrayIntegervEXT glad_glGetVertexArrayIntegervEXT +GLAD_API_CALL PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC glad_glGetVertexArrayPointeri_vEXT; +#define glGetVertexArrayPointeri_vEXT glad_glGetVertexArrayPointeri_vEXT +GLAD_API_CALL PFNGLGETVERTEXARRAYPOINTERVEXTPROC glad_glGetVertexArrayPointervEXT; +#define glGetVertexArrayPointervEXT glad_glGetVertexArrayPointervEXT +GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; +#define glGetVertexAttribIiv glad_glGetVertexAttribIiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVEXTPROC glad_glGetVertexAttribIivEXT; +#define glGetVertexAttribIivEXT glad_glGetVertexAttribIivEXT +GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; +#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVEXTPROC glad_glGetVertexAttribIuivEXT; +#define glGetVertexAttribIuivEXT glad_glGetVertexAttribIuivEXT +GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; +#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv +GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB; +#define glGetVertexAttribPointervARB glad_glGetVertexAttribPointervARB +GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV; +#define glGetVertexAttribPointervNV glad_glGetVertexAttribPointervNV +GLAD_API_CALL PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; +#define glGetVertexAttribdv glad_glGetVertexAttribdv +GLAD_API_CALL PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB; +#define glGetVertexAttribdvARB glad_glGetVertexAttribdvARB +GLAD_API_CALL PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV; +#define glGetVertexAttribdvNV glad_glGetVertexAttribdvNV +GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; +#define glGetVertexAttribfv glad_glGetVertexAttribfv +GLAD_API_CALL PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB; +#define glGetVertexAttribfvARB glad_glGetVertexAttribfvARB +GLAD_API_CALL PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV; +#define glGetVertexAttribfvNV glad_glGetVertexAttribfvNV +GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; +#define glGetVertexAttribiv glad_glGetVertexAttribiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB; +#define glGetVertexAttribivARB glad_glGetVertexAttribivARB +GLAD_API_CALL PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV; +#define glGetVertexAttribivNV glad_glGetVertexAttribivNV +GLAD_API_CALL PFNGLHINTPROC glad_glHint; +#define glHint glad_glHint +GLAD_API_CALL PFNGLHISTOGRAMPROC glad_glHistogram; +#define glHistogram glad_glHistogram +GLAD_API_CALL PFNGLINDEXMASKPROC glad_glIndexMask; +#define glIndexMask glad_glIndexMask +GLAD_API_CALL PFNGLINDEXPOINTERPROC glad_glIndexPointer; +#define glIndexPointer glad_glIndexPointer +GLAD_API_CALL PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT; +#define glIndexPointerEXT glad_glIndexPointerEXT +GLAD_API_CALL PFNGLINDEXDPROC glad_glIndexd; +#define glIndexd glad_glIndexd +GLAD_API_CALL PFNGLINDEXDVPROC glad_glIndexdv; +#define glIndexdv glad_glIndexdv +GLAD_API_CALL PFNGLINDEXFPROC glad_glIndexf; +#define glIndexf glad_glIndexf +GLAD_API_CALL PFNGLINDEXFVPROC glad_glIndexfv; +#define glIndexfv glad_glIndexfv +GLAD_API_CALL PFNGLINDEXIPROC glad_glIndexi; +#define glIndexi glad_glIndexi +GLAD_API_CALL PFNGLINDEXIVPROC glad_glIndexiv; +#define glIndexiv glad_glIndexiv +GLAD_API_CALL PFNGLINDEXSPROC glad_glIndexs; +#define glIndexs glad_glIndexs +GLAD_API_CALL PFNGLINDEXSVPROC glad_glIndexsv; +#define glIndexsv glad_glIndexsv +GLAD_API_CALL PFNGLINDEXUBPROC glad_glIndexub; +#define glIndexub glad_glIndexub +GLAD_API_CALL PFNGLINDEXUBVPROC glad_glIndexubv; +#define glIndexubv glad_glIndexubv +GLAD_API_CALL PFNGLINITNAMESPROC glad_glInitNames; +#define glInitNames glad_glInitNames +GLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays; +#define glInterleavedArrays glad_glInterleavedArrays +GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer; +#define glIsBuffer glad_glIsBuffer +GLAD_API_CALL PFNGLISBUFFERARBPROC glad_glIsBufferARB; +#define glIsBufferARB glad_glIsBufferARB +GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled; +#define glIsEnabled glad_glIsEnabled +GLAD_API_CALL PFNGLISENABLEDINDEXEDEXTPROC glad_glIsEnabledIndexedEXT; +#define glIsEnabledIndexedEXT glad_glIsEnabledIndexedEXT +GLAD_API_CALL PFNGLISENABLEDIPROC glad_glIsEnabledi; +#define glIsEnabledi glad_glIsEnabledi +GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; +#define glIsFramebuffer glad_glIsFramebuffer +GLAD_API_CALL PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT; +#define glIsFramebufferEXT glad_glIsFramebufferEXT +GLAD_API_CALL PFNGLISLISTPROC glad_glIsList; +#define glIsList glad_glIsList +GLAD_API_CALL PFNGLISPROGRAMPROC glad_glIsProgram; +#define glIsProgram glad_glIsProgram +GLAD_API_CALL PFNGLISPROGRAMARBPROC glad_glIsProgramARB; +#define glIsProgramARB glad_glIsProgramARB +GLAD_API_CALL PFNGLISPROGRAMNVPROC glad_glIsProgramNV; +#define glIsProgramNV glad_glIsProgramNV +GLAD_API_CALL PFNGLISQUERYPROC glad_glIsQuery; +#define glIsQuery glad_glIsQuery +GLAD_API_CALL PFNGLISQUERYARBPROC glad_glIsQueryARB; +#define glIsQueryARB glad_glIsQueryARB +GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; +#define glIsRenderbuffer glad_glIsRenderbuffer +GLAD_API_CALL PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT; +#define glIsRenderbufferEXT glad_glIsRenderbufferEXT +GLAD_API_CALL PFNGLISSAMPLERPROC glad_glIsSampler; +#define glIsSampler glad_glIsSampler +GLAD_API_CALL PFNGLISSHADERPROC glad_glIsShader; +#define glIsShader glad_glIsShader +GLAD_API_CALL PFNGLISSYNCPROC glad_glIsSync; +#define glIsSync glad_glIsSync +GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture; +#define glIsTexture glad_glIsTexture +GLAD_API_CALL PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT; +#define glIsTextureEXT glad_glIsTextureEXT +GLAD_API_CALL PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; +#define glIsVertexArray glad_glIsVertexArray +GLAD_API_CALL PFNGLISVERTEXARRAYAPPLEPROC glad_glIsVertexArrayAPPLE; +#define glIsVertexArrayAPPLE glad_glIsVertexArrayAPPLE +GLAD_API_CALL PFNGLLIGHTMODELFPROC glad_glLightModelf; +#define glLightModelf glad_glLightModelf +GLAD_API_CALL PFNGLLIGHTMODELFVPROC glad_glLightModelfv; +#define glLightModelfv glad_glLightModelfv +GLAD_API_CALL PFNGLLIGHTMODELIPROC glad_glLightModeli; +#define glLightModeli glad_glLightModeli +GLAD_API_CALL PFNGLLIGHTMODELIVPROC glad_glLightModeliv; +#define glLightModeliv glad_glLightModeliv +GLAD_API_CALL PFNGLLIGHTFPROC glad_glLightf; +#define glLightf glad_glLightf +GLAD_API_CALL PFNGLLIGHTFVPROC glad_glLightfv; +#define glLightfv glad_glLightfv +GLAD_API_CALL PFNGLLIGHTIPROC glad_glLighti; +#define glLighti glad_glLighti +GLAD_API_CALL PFNGLLIGHTIVPROC glad_glLightiv; +#define glLightiv glad_glLightiv +GLAD_API_CALL PFNGLLINESTIPPLEPROC glad_glLineStipple; +#define glLineStipple glad_glLineStipple +GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth; +#define glLineWidth glad_glLineWidth +GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram; +#define glLinkProgram glad_glLinkProgram +GLAD_API_CALL PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB; +#define glLinkProgramARB glad_glLinkProgramARB +GLAD_API_CALL PFNGLLISTBASEPROC glad_glListBase; +#define glListBase glad_glListBase +GLAD_API_CALL PFNGLLOADIDENTITYPROC glad_glLoadIdentity; +#define glLoadIdentity glad_glLoadIdentity +GLAD_API_CALL PFNGLLOADMATRIXDPROC glad_glLoadMatrixd; +#define glLoadMatrixd glad_glLoadMatrixd +GLAD_API_CALL PFNGLLOADMATRIXFPROC glad_glLoadMatrixf; +#define glLoadMatrixf glad_glLoadMatrixf +GLAD_API_CALL PFNGLLOADNAMEPROC glad_glLoadName; +#define glLoadName glad_glLoadName +GLAD_API_CALL PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV; +#define glLoadProgramNV glad_glLoadProgramNV +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd; +#define glLoadTransposeMatrixd glad_glLoadTransposeMatrixd +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXDARBPROC glad_glLoadTransposeMatrixdARB; +#define glLoadTransposeMatrixdARB glad_glLoadTransposeMatrixdARB +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf; +#define glLoadTransposeMatrixf glad_glLoadTransposeMatrixf +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXFARBPROC glad_glLoadTransposeMatrixfARB; +#define glLoadTransposeMatrixfARB glad_glLoadTransposeMatrixfARB +GLAD_API_CALL PFNGLLOGICOPPROC glad_glLogicOp; +#define glLogicOp glad_glLogicOp +GLAD_API_CALL PFNGLMAP1DPROC glad_glMap1d; +#define glMap1d glad_glMap1d +GLAD_API_CALL PFNGLMAP1FPROC glad_glMap1f; +#define glMap1f glad_glMap1f +GLAD_API_CALL PFNGLMAP2DPROC glad_glMap2d; +#define glMap2d glad_glMap2d +GLAD_API_CALL PFNGLMAP2FPROC glad_glMap2f; +#define glMap2f glad_glMap2f +GLAD_API_CALL PFNGLMAPBUFFERPROC glad_glMapBuffer; +#define glMapBuffer glad_glMapBuffer +GLAD_API_CALL PFNGLMAPBUFFERARBPROC glad_glMapBufferARB; +#define glMapBufferARB glad_glMapBufferARB +GLAD_API_CALL PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; +#define glMapBufferRange glad_glMapBufferRange +GLAD_API_CALL PFNGLMAPGRID1DPROC glad_glMapGrid1d; +#define glMapGrid1d glad_glMapGrid1d +GLAD_API_CALL PFNGLMAPGRID1FPROC glad_glMapGrid1f; +#define glMapGrid1f glad_glMapGrid1f +GLAD_API_CALL PFNGLMAPGRID2DPROC glad_glMapGrid2d; +#define glMapGrid2d glad_glMapGrid2d +GLAD_API_CALL PFNGLMAPGRID2FPROC glad_glMapGrid2f; +#define glMapGrid2f glad_glMapGrid2f +GLAD_API_CALL PFNGLMAPNAMEDBUFFEREXTPROC glad_glMapNamedBufferEXT; +#define glMapNamedBufferEXT glad_glMapNamedBufferEXT +GLAD_API_CALL PFNGLMAPNAMEDBUFFERRANGEEXTPROC glad_glMapNamedBufferRangeEXT; +#define glMapNamedBufferRangeEXT glad_glMapNamedBufferRangeEXT +GLAD_API_CALL PFNGLMATERIALFPROC glad_glMaterialf; +#define glMaterialf glad_glMaterialf +GLAD_API_CALL PFNGLMATERIALFVPROC glad_glMaterialfv; +#define glMaterialfv glad_glMaterialfv +GLAD_API_CALL PFNGLMATERIALIPROC glad_glMateriali; +#define glMateriali glad_glMateriali +GLAD_API_CALL PFNGLMATERIALIVPROC glad_glMaterialiv; +#define glMaterialiv glad_glMaterialiv +GLAD_API_CALL PFNGLMATRIXFRUSTUMEXTPROC glad_glMatrixFrustumEXT; +#define glMatrixFrustumEXT glad_glMatrixFrustumEXT +GLAD_API_CALL PFNGLMATRIXLOADIDENTITYEXTPROC glad_glMatrixLoadIdentityEXT; +#define glMatrixLoadIdentityEXT glad_glMatrixLoadIdentityEXT +GLAD_API_CALL PFNGLMATRIXLOADTRANSPOSEDEXTPROC glad_glMatrixLoadTransposedEXT; +#define glMatrixLoadTransposedEXT glad_glMatrixLoadTransposedEXT +GLAD_API_CALL PFNGLMATRIXLOADTRANSPOSEFEXTPROC glad_glMatrixLoadTransposefEXT; +#define glMatrixLoadTransposefEXT glad_glMatrixLoadTransposefEXT +GLAD_API_CALL PFNGLMATRIXLOADDEXTPROC glad_glMatrixLoaddEXT; +#define glMatrixLoaddEXT glad_glMatrixLoaddEXT +GLAD_API_CALL PFNGLMATRIXLOADFEXTPROC glad_glMatrixLoadfEXT; +#define glMatrixLoadfEXT glad_glMatrixLoadfEXT +GLAD_API_CALL PFNGLMATRIXMODEPROC glad_glMatrixMode; +#define glMatrixMode glad_glMatrixMode +GLAD_API_CALL PFNGLMATRIXMULTTRANSPOSEDEXTPROC glad_glMatrixMultTransposedEXT; +#define glMatrixMultTransposedEXT glad_glMatrixMultTransposedEXT +GLAD_API_CALL PFNGLMATRIXMULTTRANSPOSEFEXTPROC glad_glMatrixMultTransposefEXT; +#define glMatrixMultTransposefEXT glad_glMatrixMultTransposefEXT +GLAD_API_CALL PFNGLMATRIXMULTDEXTPROC glad_glMatrixMultdEXT; +#define glMatrixMultdEXT glad_glMatrixMultdEXT +GLAD_API_CALL PFNGLMATRIXMULTFEXTPROC glad_glMatrixMultfEXT; +#define glMatrixMultfEXT glad_glMatrixMultfEXT +GLAD_API_CALL PFNGLMATRIXORTHOEXTPROC glad_glMatrixOrthoEXT; +#define glMatrixOrthoEXT glad_glMatrixOrthoEXT +GLAD_API_CALL PFNGLMATRIXPOPEXTPROC glad_glMatrixPopEXT; +#define glMatrixPopEXT glad_glMatrixPopEXT +GLAD_API_CALL PFNGLMATRIXPUSHEXTPROC glad_glMatrixPushEXT; +#define glMatrixPushEXT glad_glMatrixPushEXT +GLAD_API_CALL PFNGLMATRIXROTATEDEXTPROC glad_glMatrixRotatedEXT; +#define glMatrixRotatedEXT glad_glMatrixRotatedEXT +GLAD_API_CALL PFNGLMATRIXROTATEFEXTPROC glad_glMatrixRotatefEXT; +#define glMatrixRotatefEXT glad_glMatrixRotatefEXT +GLAD_API_CALL PFNGLMATRIXSCALEDEXTPROC glad_glMatrixScaledEXT; +#define glMatrixScaledEXT glad_glMatrixScaledEXT +GLAD_API_CALL PFNGLMATRIXSCALEFEXTPROC glad_glMatrixScalefEXT; +#define glMatrixScalefEXT glad_glMatrixScalefEXT +GLAD_API_CALL PFNGLMATRIXTRANSLATEDEXTPROC glad_glMatrixTranslatedEXT; +#define glMatrixTranslatedEXT glad_glMatrixTranslatedEXT +GLAD_API_CALL PFNGLMATRIXTRANSLATEFEXTPROC glad_glMatrixTranslatefEXT; +#define glMatrixTranslatefEXT glad_glMatrixTranslatefEXT +GLAD_API_CALL PFNGLMINMAXPROC glad_glMinmax; +#define glMinmax glad_glMinmax +GLAD_API_CALL PFNGLMULTMATRIXDPROC glad_glMultMatrixd; +#define glMultMatrixd glad_glMultMatrixd +GLAD_API_CALL PFNGLMULTMATRIXFPROC glad_glMultMatrixf; +#define glMultMatrixf glad_glMultMatrixf +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd; +#define glMultTransposeMatrixd glad_glMultTransposeMatrixd +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXDARBPROC glad_glMultTransposeMatrixdARB; +#define glMultTransposeMatrixdARB glad_glMultTransposeMatrixdARB +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf; +#define glMultTransposeMatrixf glad_glMultTransposeMatrixf +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXFARBPROC glad_glMultTransposeMatrixfARB; +#define glMultTransposeMatrixfARB glad_glMultTransposeMatrixfARB +GLAD_API_CALL PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; +#define glMultiDrawArrays glad_glMultiDrawArrays +GLAD_API_CALL PFNGLMULTIDRAWARRAYSEXTPROC glad_glMultiDrawArraysEXT; +#define glMultiDrawArraysEXT glad_glMultiDrawArraysEXT +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; +#define glMultiDrawElements glad_glMultiDrawElements +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; +#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSEXTPROC glad_glMultiDrawElementsEXT; +#define glMultiDrawElementsEXT glad_glMultiDrawElementsEXT +GLAD_API_CALL PFNGLMULTITEXBUFFEREXTPROC glad_glMultiTexBufferEXT; +#define glMultiTexBufferEXT glad_glMultiTexBufferEXT +GLAD_API_CALL PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d; +#define glMultiTexCoord1d glad_glMultiTexCoord1d +GLAD_API_CALL PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB; +#define glMultiTexCoord1dARB glad_glMultiTexCoord1dARB +GLAD_API_CALL PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv; +#define glMultiTexCoord1dv glad_glMultiTexCoord1dv +GLAD_API_CALL PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB; +#define glMultiTexCoord1dvARB glad_glMultiTexCoord1dvARB +GLAD_API_CALL PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f; +#define glMultiTexCoord1f glad_glMultiTexCoord1f +GLAD_API_CALL PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB; +#define glMultiTexCoord1fARB glad_glMultiTexCoord1fARB +GLAD_API_CALL PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv; +#define glMultiTexCoord1fv glad_glMultiTexCoord1fv +GLAD_API_CALL PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB; +#define glMultiTexCoord1fvARB glad_glMultiTexCoord1fvARB +GLAD_API_CALL PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i; +#define glMultiTexCoord1i glad_glMultiTexCoord1i +GLAD_API_CALL PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB; +#define glMultiTexCoord1iARB glad_glMultiTexCoord1iARB +GLAD_API_CALL PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv; +#define glMultiTexCoord1iv glad_glMultiTexCoord1iv +GLAD_API_CALL PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB; +#define glMultiTexCoord1ivARB glad_glMultiTexCoord1ivARB +GLAD_API_CALL PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s; +#define glMultiTexCoord1s glad_glMultiTexCoord1s +GLAD_API_CALL PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB; +#define glMultiTexCoord1sARB glad_glMultiTexCoord1sARB +GLAD_API_CALL PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv; +#define glMultiTexCoord1sv glad_glMultiTexCoord1sv +GLAD_API_CALL PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB; +#define glMultiTexCoord1svARB glad_glMultiTexCoord1svARB +GLAD_API_CALL PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d; +#define glMultiTexCoord2d glad_glMultiTexCoord2d +GLAD_API_CALL PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB; +#define glMultiTexCoord2dARB glad_glMultiTexCoord2dARB +GLAD_API_CALL PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv; +#define glMultiTexCoord2dv glad_glMultiTexCoord2dv +GLAD_API_CALL PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB; +#define glMultiTexCoord2dvARB glad_glMultiTexCoord2dvARB +GLAD_API_CALL PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f; +#define glMultiTexCoord2f glad_glMultiTexCoord2f +GLAD_API_CALL PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB; +#define glMultiTexCoord2fARB glad_glMultiTexCoord2fARB +GLAD_API_CALL PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv; +#define glMultiTexCoord2fv glad_glMultiTexCoord2fv +GLAD_API_CALL PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB; +#define glMultiTexCoord2fvARB glad_glMultiTexCoord2fvARB +GLAD_API_CALL PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i; +#define glMultiTexCoord2i glad_glMultiTexCoord2i +GLAD_API_CALL PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB; +#define glMultiTexCoord2iARB glad_glMultiTexCoord2iARB +GLAD_API_CALL PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv; +#define glMultiTexCoord2iv glad_glMultiTexCoord2iv +GLAD_API_CALL PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB; +#define glMultiTexCoord2ivARB glad_glMultiTexCoord2ivARB +GLAD_API_CALL PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s; +#define glMultiTexCoord2s glad_glMultiTexCoord2s +GLAD_API_CALL PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB; +#define glMultiTexCoord2sARB glad_glMultiTexCoord2sARB +GLAD_API_CALL PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv; +#define glMultiTexCoord2sv glad_glMultiTexCoord2sv +GLAD_API_CALL PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB; +#define glMultiTexCoord2svARB glad_glMultiTexCoord2svARB +GLAD_API_CALL PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d; +#define glMultiTexCoord3d glad_glMultiTexCoord3d +GLAD_API_CALL PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB; +#define glMultiTexCoord3dARB glad_glMultiTexCoord3dARB +GLAD_API_CALL PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv; +#define glMultiTexCoord3dv glad_glMultiTexCoord3dv +GLAD_API_CALL PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB; +#define glMultiTexCoord3dvARB glad_glMultiTexCoord3dvARB +GLAD_API_CALL PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f; +#define glMultiTexCoord3f glad_glMultiTexCoord3f +GLAD_API_CALL PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB; +#define glMultiTexCoord3fARB glad_glMultiTexCoord3fARB +GLAD_API_CALL PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv; +#define glMultiTexCoord3fv glad_glMultiTexCoord3fv +GLAD_API_CALL PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB; +#define glMultiTexCoord3fvARB glad_glMultiTexCoord3fvARB +GLAD_API_CALL PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i; +#define glMultiTexCoord3i glad_glMultiTexCoord3i +GLAD_API_CALL PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB; +#define glMultiTexCoord3iARB glad_glMultiTexCoord3iARB +GLAD_API_CALL PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv; +#define glMultiTexCoord3iv glad_glMultiTexCoord3iv +GLAD_API_CALL PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB; +#define glMultiTexCoord3ivARB glad_glMultiTexCoord3ivARB +GLAD_API_CALL PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s; +#define glMultiTexCoord3s glad_glMultiTexCoord3s +GLAD_API_CALL PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB; +#define glMultiTexCoord3sARB glad_glMultiTexCoord3sARB +GLAD_API_CALL PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv; +#define glMultiTexCoord3sv glad_glMultiTexCoord3sv +GLAD_API_CALL PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB; +#define glMultiTexCoord3svARB glad_glMultiTexCoord3svARB +GLAD_API_CALL PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d; +#define glMultiTexCoord4d glad_glMultiTexCoord4d +GLAD_API_CALL PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB; +#define glMultiTexCoord4dARB glad_glMultiTexCoord4dARB +GLAD_API_CALL PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv; +#define glMultiTexCoord4dv glad_glMultiTexCoord4dv +GLAD_API_CALL PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB; +#define glMultiTexCoord4dvARB glad_glMultiTexCoord4dvARB +GLAD_API_CALL PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f; +#define glMultiTexCoord4f glad_glMultiTexCoord4f +GLAD_API_CALL PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB; +#define glMultiTexCoord4fARB glad_glMultiTexCoord4fARB +GLAD_API_CALL PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv; +#define glMultiTexCoord4fv glad_glMultiTexCoord4fv +GLAD_API_CALL PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB; +#define glMultiTexCoord4fvARB glad_glMultiTexCoord4fvARB +GLAD_API_CALL PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i; +#define glMultiTexCoord4i glad_glMultiTexCoord4i +GLAD_API_CALL PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB; +#define glMultiTexCoord4iARB glad_glMultiTexCoord4iARB +GLAD_API_CALL PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv; +#define glMultiTexCoord4iv glad_glMultiTexCoord4iv +GLAD_API_CALL PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB; +#define glMultiTexCoord4ivARB glad_glMultiTexCoord4ivARB +GLAD_API_CALL PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s; +#define glMultiTexCoord4s glad_glMultiTexCoord4s +GLAD_API_CALL PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB; +#define glMultiTexCoord4sARB glad_glMultiTexCoord4sARB +GLAD_API_CALL PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv; +#define glMultiTexCoord4sv glad_glMultiTexCoord4sv +GLAD_API_CALL PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB; +#define glMultiTexCoord4svARB glad_glMultiTexCoord4svARB +GLAD_API_CALL PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui; +#define glMultiTexCoordP1ui glad_glMultiTexCoordP1ui +GLAD_API_CALL PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv; +#define glMultiTexCoordP1uiv glad_glMultiTexCoordP1uiv +GLAD_API_CALL PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui; +#define glMultiTexCoordP2ui glad_glMultiTexCoordP2ui +GLAD_API_CALL PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv; +#define glMultiTexCoordP2uiv glad_glMultiTexCoordP2uiv +GLAD_API_CALL PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui; +#define glMultiTexCoordP3ui glad_glMultiTexCoordP3ui +GLAD_API_CALL PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv; +#define glMultiTexCoordP3uiv glad_glMultiTexCoordP3uiv +GLAD_API_CALL PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui; +#define glMultiTexCoordP4ui glad_glMultiTexCoordP4ui +GLAD_API_CALL PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv; +#define glMultiTexCoordP4uiv glad_glMultiTexCoordP4uiv +GLAD_API_CALL PFNGLMULTITEXCOORDPOINTEREXTPROC glad_glMultiTexCoordPointerEXT; +#define glMultiTexCoordPointerEXT glad_glMultiTexCoordPointerEXT +GLAD_API_CALL PFNGLMULTITEXENVFEXTPROC glad_glMultiTexEnvfEXT; +#define glMultiTexEnvfEXT glad_glMultiTexEnvfEXT +GLAD_API_CALL PFNGLMULTITEXENVFVEXTPROC glad_glMultiTexEnvfvEXT; +#define glMultiTexEnvfvEXT glad_glMultiTexEnvfvEXT +GLAD_API_CALL PFNGLMULTITEXENVIEXTPROC glad_glMultiTexEnviEXT; +#define glMultiTexEnviEXT glad_glMultiTexEnviEXT +GLAD_API_CALL PFNGLMULTITEXENVIVEXTPROC glad_glMultiTexEnvivEXT; +#define glMultiTexEnvivEXT glad_glMultiTexEnvivEXT +GLAD_API_CALL PFNGLMULTITEXGENDEXTPROC glad_glMultiTexGendEXT; +#define glMultiTexGendEXT glad_glMultiTexGendEXT +GLAD_API_CALL PFNGLMULTITEXGENDVEXTPROC glad_glMultiTexGendvEXT; +#define glMultiTexGendvEXT glad_glMultiTexGendvEXT +GLAD_API_CALL PFNGLMULTITEXGENFEXTPROC glad_glMultiTexGenfEXT; +#define glMultiTexGenfEXT glad_glMultiTexGenfEXT +GLAD_API_CALL PFNGLMULTITEXGENFVEXTPROC glad_glMultiTexGenfvEXT; +#define glMultiTexGenfvEXT glad_glMultiTexGenfvEXT +GLAD_API_CALL PFNGLMULTITEXGENIEXTPROC glad_glMultiTexGeniEXT; +#define glMultiTexGeniEXT glad_glMultiTexGeniEXT +GLAD_API_CALL PFNGLMULTITEXGENIVEXTPROC glad_glMultiTexGenivEXT; +#define glMultiTexGenivEXT glad_glMultiTexGenivEXT +GLAD_API_CALL PFNGLMULTITEXIMAGE1DEXTPROC glad_glMultiTexImage1DEXT; +#define glMultiTexImage1DEXT glad_glMultiTexImage1DEXT +GLAD_API_CALL PFNGLMULTITEXIMAGE2DEXTPROC glad_glMultiTexImage2DEXT; +#define glMultiTexImage2DEXT glad_glMultiTexImage2DEXT +GLAD_API_CALL PFNGLMULTITEXIMAGE3DEXTPROC glad_glMultiTexImage3DEXT; +#define glMultiTexImage3DEXT glad_glMultiTexImage3DEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERIIVEXTPROC glad_glMultiTexParameterIivEXT; +#define glMultiTexParameterIivEXT glad_glMultiTexParameterIivEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERIUIVEXTPROC glad_glMultiTexParameterIuivEXT; +#define glMultiTexParameterIuivEXT glad_glMultiTexParameterIuivEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERFEXTPROC glad_glMultiTexParameterfEXT; +#define glMultiTexParameterfEXT glad_glMultiTexParameterfEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERFVEXTPROC glad_glMultiTexParameterfvEXT; +#define glMultiTexParameterfvEXT glad_glMultiTexParameterfvEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERIEXTPROC glad_glMultiTexParameteriEXT; +#define glMultiTexParameteriEXT glad_glMultiTexParameteriEXT +GLAD_API_CALL PFNGLMULTITEXPARAMETERIVEXTPROC glad_glMultiTexParameterivEXT; +#define glMultiTexParameterivEXT glad_glMultiTexParameterivEXT +GLAD_API_CALL PFNGLMULTITEXRENDERBUFFEREXTPROC glad_glMultiTexRenderbufferEXT; +#define glMultiTexRenderbufferEXT glad_glMultiTexRenderbufferEXT +GLAD_API_CALL PFNGLMULTITEXSUBIMAGE1DEXTPROC glad_glMultiTexSubImage1DEXT; +#define glMultiTexSubImage1DEXT glad_glMultiTexSubImage1DEXT +GLAD_API_CALL PFNGLMULTITEXSUBIMAGE2DEXTPROC glad_glMultiTexSubImage2DEXT; +#define glMultiTexSubImage2DEXT glad_glMultiTexSubImage2DEXT +GLAD_API_CALL PFNGLMULTITEXSUBIMAGE3DEXTPROC glad_glMultiTexSubImage3DEXT; +#define glMultiTexSubImage3DEXT glad_glMultiTexSubImage3DEXT +GLAD_API_CALL PFNGLNAMEDBUFFERDATAEXTPROC glad_glNamedBufferDataEXT; +#define glNamedBufferDataEXT glad_glNamedBufferDataEXT +GLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEEXTPROC glad_glNamedBufferStorageEXT; +#define glNamedBufferStorageEXT glad_glNamedBufferStorageEXT +GLAD_API_CALL PFNGLNAMEDBUFFERSUBDATAEXTPROC glad_glNamedBufferSubDataEXT; +#define glNamedBufferSubDataEXT glad_glNamedBufferSubDataEXT +GLAD_API_CALL PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC glad_glNamedCopyBufferSubDataEXT; +#define glNamedCopyBufferSubDataEXT glad_glNamedCopyBufferSubDataEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC glad_glNamedFramebufferParameteriEXT; +#define glNamedFramebufferParameteriEXT glad_glNamedFramebufferParameteriEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC glad_glNamedFramebufferRenderbufferEXT; +#define glNamedFramebufferRenderbufferEXT glad_glNamedFramebufferRenderbufferEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC glad_glNamedFramebufferTexture1DEXT; +#define glNamedFramebufferTexture1DEXT glad_glNamedFramebufferTexture1DEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC glad_glNamedFramebufferTexture2DEXT; +#define glNamedFramebufferTexture2DEXT glad_glNamedFramebufferTexture2DEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC glad_glNamedFramebufferTexture3DEXT; +#define glNamedFramebufferTexture3DEXT glad_glNamedFramebufferTexture3DEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC glad_glNamedFramebufferTextureEXT; +#define glNamedFramebufferTextureEXT glad_glNamedFramebufferTextureEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC glad_glNamedFramebufferTextureFaceEXT; +#define glNamedFramebufferTextureFaceEXT glad_glNamedFramebufferTextureFaceEXT +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC glad_glNamedFramebufferTextureLayerEXT; +#define glNamedFramebufferTextureLayerEXT glad_glNamedFramebufferTextureLayerEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC glad_glNamedProgramLocalParameter4dEXT; +#define glNamedProgramLocalParameter4dEXT glad_glNamedProgramLocalParameter4dEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC glad_glNamedProgramLocalParameter4dvEXT; +#define glNamedProgramLocalParameter4dvEXT glad_glNamedProgramLocalParameter4dvEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC glad_glNamedProgramLocalParameter4fEXT; +#define glNamedProgramLocalParameter4fEXT glad_glNamedProgramLocalParameter4fEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC glad_glNamedProgramLocalParameter4fvEXT; +#define glNamedProgramLocalParameter4fvEXT glad_glNamedProgramLocalParameter4fvEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC glad_glNamedProgramLocalParameterI4iEXT; +#define glNamedProgramLocalParameterI4iEXT glad_glNamedProgramLocalParameterI4iEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC glad_glNamedProgramLocalParameterI4ivEXT; +#define glNamedProgramLocalParameterI4ivEXT glad_glNamedProgramLocalParameterI4ivEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC glad_glNamedProgramLocalParameterI4uiEXT; +#define glNamedProgramLocalParameterI4uiEXT glad_glNamedProgramLocalParameterI4uiEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC glad_glNamedProgramLocalParameterI4uivEXT; +#define glNamedProgramLocalParameterI4uivEXT glad_glNamedProgramLocalParameterI4uivEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC glad_glNamedProgramLocalParameters4fvEXT; +#define glNamedProgramLocalParameters4fvEXT glad_glNamedProgramLocalParameters4fvEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC glad_glNamedProgramLocalParametersI4ivEXT; +#define glNamedProgramLocalParametersI4ivEXT glad_glNamedProgramLocalParametersI4ivEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC glad_glNamedProgramLocalParametersI4uivEXT; +#define glNamedProgramLocalParametersI4uivEXT glad_glNamedProgramLocalParametersI4uivEXT +GLAD_API_CALL PFNGLNAMEDPROGRAMSTRINGEXTPROC glad_glNamedProgramStringEXT; +#define glNamedProgramStringEXT glad_glNamedProgramStringEXT +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC glad_glNamedRenderbufferStorageEXT; +#define glNamedRenderbufferStorageEXT glad_glNamedRenderbufferStorageEXT +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC glad_glNamedRenderbufferStorageMultisampleCoverageEXT; +#define glNamedRenderbufferStorageMultisampleCoverageEXT glad_glNamedRenderbufferStorageMultisampleCoverageEXT +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glNamedRenderbufferStorageMultisampleEXT; +#define glNamedRenderbufferStorageMultisampleEXT glad_glNamedRenderbufferStorageMultisampleEXT +GLAD_API_CALL PFNGLNEWLISTPROC glad_glNewList; +#define glNewList glad_glNewList +GLAD_API_CALL PFNGLNORMAL3BPROC glad_glNormal3b; +#define glNormal3b glad_glNormal3b +GLAD_API_CALL PFNGLNORMAL3BVPROC glad_glNormal3bv; +#define glNormal3bv glad_glNormal3bv +GLAD_API_CALL PFNGLNORMAL3DPROC glad_glNormal3d; +#define glNormal3d glad_glNormal3d +GLAD_API_CALL PFNGLNORMAL3DVPROC glad_glNormal3dv; +#define glNormal3dv glad_glNormal3dv +GLAD_API_CALL PFNGLNORMAL3FPROC glad_glNormal3f; +#define glNormal3f glad_glNormal3f +GLAD_API_CALL PFNGLNORMAL3FVPROC glad_glNormal3fv; +#define glNormal3fv glad_glNormal3fv +GLAD_API_CALL PFNGLNORMAL3IPROC glad_glNormal3i; +#define glNormal3i glad_glNormal3i +GLAD_API_CALL PFNGLNORMAL3IVPROC glad_glNormal3iv; +#define glNormal3iv glad_glNormal3iv +GLAD_API_CALL PFNGLNORMAL3SPROC glad_glNormal3s; +#define glNormal3s glad_glNormal3s +GLAD_API_CALL PFNGLNORMAL3SVPROC glad_glNormal3sv; +#define glNormal3sv glad_glNormal3sv +GLAD_API_CALL PFNGLNORMALP3UIPROC glad_glNormalP3ui; +#define glNormalP3ui glad_glNormalP3ui +GLAD_API_CALL PFNGLNORMALP3UIVPROC glad_glNormalP3uiv; +#define glNormalP3uiv glad_glNormalP3uiv +GLAD_API_CALL PFNGLNORMALPOINTERPROC glad_glNormalPointer; +#define glNormalPointer glad_glNormalPointer +GLAD_API_CALL PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT; +#define glNormalPointerEXT glad_glNormalPointerEXT +GLAD_API_CALL PFNGLOBJECTLABELPROC glad_glObjectLabel; +#define glObjectLabel glad_glObjectLabel +GLAD_API_CALL PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel; +#define glObjectPtrLabel glad_glObjectPtrLabel +GLAD_API_CALL PFNGLORTHOPROC glad_glOrtho; +#define glOrtho glad_glOrtho +GLAD_API_CALL PFNGLPASSTHROUGHPROC glad_glPassThrough; +#define glPassThrough glad_glPassThrough +GLAD_API_CALL PFNGLPIXELMAPFVPROC glad_glPixelMapfv; +#define glPixelMapfv glad_glPixelMapfv +GLAD_API_CALL PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv; +#define glPixelMapuiv glad_glPixelMapuiv +GLAD_API_CALL PFNGLPIXELMAPUSVPROC glad_glPixelMapusv; +#define glPixelMapusv glad_glPixelMapusv +GLAD_API_CALL PFNGLPIXELSTOREFPROC glad_glPixelStoref; +#define glPixelStoref glad_glPixelStoref +GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei; +#define glPixelStorei glad_glPixelStorei +GLAD_API_CALL PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf; +#define glPixelTransferf glad_glPixelTransferf +GLAD_API_CALL PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi; +#define glPixelTransferi glad_glPixelTransferi +GLAD_API_CALL PFNGLPIXELZOOMPROC glad_glPixelZoom; +#define glPixelZoom glad_glPixelZoom +GLAD_API_CALL PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; +#define glPointParameterf glad_glPointParameterf +GLAD_API_CALL PFNGLPOINTPARAMETERFARBPROC glad_glPointParameterfARB; +#define glPointParameterfARB glad_glPointParameterfARB +GLAD_API_CALL PFNGLPOINTPARAMETERFEXTPROC glad_glPointParameterfEXT; +#define glPointParameterfEXT glad_glPointParameterfEXT +GLAD_API_CALL PFNGLPOINTPARAMETERFSGISPROC glad_glPointParameterfSGIS; +#define glPointParameterfSGIS glad_glPointParameterfSGIS +GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; +#define glPointParameterfv glad_glPointParameterfv +GLAD_API_CALL PFNGLPOINTPARAMETERFVARBPROC glad_glPointParameterfvARB; +#define glPointParameterfvARB glad_glPointParameterfvARB +GLAD_API_CALL PFNGLPOINTPARAMETERFVEXTPROC glad_glPointParameterfvEXT; +#define glPointParameterfvEXT glad_glPointParameterfvEXT +GLAD_API_CALL PFNGLPOINTPARAMETERFVSGISPROC glad_glPointParameterfvSGIS; +#define glPointParameterfvSGIS glad_glPointParameterfvSGIS +GLAD_API_CALL PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; +#define glPointParameteri glad_glPointParameteri +GLAD_API_CALL PFNGLPOINTPARAMETERINVPROC glad_glPointParameteriNV; +#define glPointParameteriNV glad_glPointParameteriNV +GLAD_API_CALL PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; +#define glPointParameteriv glad_glPointParameteriv +GLAD_API_CALL PFNGLPOINTPARAMETERIVNVPROC glad_glPointParameterivNV; +#define glPointParameterivNV glad_glPointParameterivNV +GLAD_API_CALL PFNGLPOINTSIZEPROC glad_glPointSize; +#define glPointSize glad_glPointSize +GLAD_API_CALL PFNGLPOLYGONMODEPROC glad_glPolygonMode; +#define glPolygonMode glad_glPolygonMode +GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; +#define glPolygonOffset glad_glPolygonOffset +GLAD_API_CALL PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple; +#define glPolygonStipple glad_glPolygonStipple +GLAD_API_CALL PFNGLPOPATTRIBPROC glad_glPopAttrib; +#define glPopAttrib glad_glPopAttrib +GLAD_API_CALL PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib; +#define glPopClientAttrib glad_glPopClientAttrib +GLAD_API_CALL PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup; +#define glPopDebugGroup glad_glPopDebugGroup +GLAD_API_CALL PFNGLPOPMATRIXPROC glad_glPopMatrix; +#define glPopMatrix glad_glPopMatrix +GLAD_API_CALL PFNGLPOPNAMEPROC glad_glPopName; +#define glPopName glad_glPopName +GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; +#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex +GLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures; +#define glPrioritizeTextures glad_glPrioritizeTextures +GLAD_API_CALL PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT; +#define glPrioritizeTexturesEXT glad_glPrioritizeTexturesEXT +GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB; +#define glProgramEnvParameter4dARB glad_glProgramEnvParameter4dARB +GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB; +#define glProgramEnvParameter4dvARB glad_glProgramEnvParameter4dvARB +GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB; +#define glProgramEnvParameter4fARB glad_glProgramEnvParameter4fARB +GLAD_API_CALL PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB; +#define glProgramEnvParameter4fvARB glad_glProgramEnvParameter4fvARB +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB; +#define glProgramLocalParameter4dARB glad_glProgramLocalParameter4dARB +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB; +#define glProgramLocalParameter4dvARB glad_glProgramLocalParameter4dvARB +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB; +#define glProgramLocalParameter4fARB glad_glProgramLocalParameter4fARB +GLAD_API_CALL PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB; +#define glProgramLocalParameter4fvARB glad_glProgramLocalParameter4fvARB +GLAD_API_CALL PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV; +#define glProgramParameter4dNV glad_glProgramParameter4dNV +GLAD_API_CALL PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV; +#define glProgramParameter4dvNV glad_glProgramParameter4dvNV +GLAD_API_CALL PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV; +#define glProgramParameter4fNV glad_glProgramParameter4fNV +GLAD_API_CALL PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV; +#define glProgramParameter4fvNV glad_glProgramParameter4fvNV +GLAD_API_CALL PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB; +#define glProgramParameteriARB glad_glProgramParameteriARB +GLAD_API_CALL PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV; +#define glProgramParameters4dvNV glad_glProgramParameters4dvNV +GLAD_API_CALL PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV; +#define glProgramParameters4fvNV glad_glProgramParameters4fvNV +GLAD_API_CALL PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB; +#define glProgramStringARB glad_glProgramStringARB +GLAD_API_CALL PFNGLPROGRAMUNIFORM1DEXTPROC glad_glProgramUniform1dEXT; +#define glProgramUniform1dEXT glad_glProgramUniform1dEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1DVEXTPROC glad_glProgramUniform1dvEXT; +#define glProgramUniform1dvEXT glad_glProgramUniform1dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1FEXTPROC glad_glProgramUniform1fEXT; +#define glProgramUniform1fEXT glad_glProgramUniform1fEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1FVEXTPROC glad_glProgramUniform1fvEXT; +#define glProgramUniform1fvEXT glad_glProgramUniform1fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1IEXTPROC glad_glProgramUniform1iEXT; +#define glProgramUniform1iEXT glad_glProgramUniform1iEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1IVEXTPROC glad_glProgramUniform1ivEXT; +#define glProgramUniform1ivEXT glad_glProgramUniform1ivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIEXTPROC glad_glProgramUniform1uiEXT; +#define glProgramUniform1uiEXT glad_glProgramUniform1uiEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM1UIVEXTPROC glad_glProgramUniform1uivEXT; +#define glProgramUniform1uivEXT glad_glProgramUniform1uivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2DEXTPROC glad_glProgramUniform2dEXT; +#define glProgramUniform2dEXT glad_glProgramUniform2dEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2DVEXTPROC glad_glProgramUniform2dvEXT; +#define glProgramUniform2dvEXT glad_glProgramUniform2dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2FEXTPROC glad_glProgramUniform2fEXT; +#define glProgramUniform2fEXT glad_glProgramUniform2fEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2FVEXTPROC glad_glProgramUniform2fvEXT; +#define glProgramUniform2fvEXT glad_glProgramUniform2fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2IEXTPROC glad_glProgramUniform2iEXT; +#define glProgramUniform2iEXT glad_glProgramUniform2iEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2IVEXTPROC glad_glProgramUniform2ivEXT; +#define glProgramUniform2ivEXT glad_glProgramUniform2ivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIEXTPROC glad_glProgramUniform2uiEXT; +#define glProgramUniform2uiEXT glad_glProgramUniform2uiEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM2UIVEXTPROC glad_glProgramUniform2uivEXT; +#define glProgramUniform2uivEXT glad_glProgramUniform2uivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3DEXTPROC glad_glProgramUniform3dEXT; +#define glProgramUniform3dEXT glad_glProgramUniform3dEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3DVEXTPROC glad_glProgramUniform3dvEXT; +#define glProgramUniform3dvEXT glad_glProgramUniform3dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3FEXTPROC glad_glProgramUniform3fEXT; +#define glProgramUniform3fEXT glad_glProgramUniform3fEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3FVEXTPROC glad_glProgramUniform3fvEXT; +#define glProgramUniform3fvEXT glad_glProgramUniform3fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3IEXTPROC glad_glProgramUniform3iEXT; +#define glProgramUniform3iEXT glad_glProgramUniform3iEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3IVEXTPROC glad_glProgramUniform3ivEXT; +#define glProgramUniform3ivEXT glad_glProgramUniform3ivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIEXTPROC glad_glProgramUniform3uiEXT; +#define glProgramUniform3uiEXT glad_glProgramUniform3uiEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM3UIVEXTPROC glad_glProgramUniform3uivEXT; +#define glProgramUniform3uivEXT glad_glProgramUniform3uivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4DEXTPROC glad_glProgramUniform4dEXT; +#define glProgramUniform4dEXT glad_glProgramUniform4dEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4DVEXTPROC glad_glProgramUniform4dvEXT; +#define glProgramUniform4dvEXT glad_glProgramUniform4dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4FEXTPROC glad_glProgramUniform4fEXT; +#define glProgramUniform4fEXT glad_glProgramUniform4fEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4FVEXTPROC glad_glProgramUniform4fvEXT; +#define glProgramUniform4fvEXT glad_glProgramUniform4fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4IEXTPROC glad_glProgramUniform4iEXT; +#define glProgramUniform4iEXT glad_glProgramUniform4iEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4IVEXTPROC glad_glProgramUniform4ivEXT; +#define glProgramUniform4ivEXT glad_glProgramUniform4ivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIEXTPROC glad_glProgramUniform4uiEXT; +#define glProgramUniform4uiEXT glad_glProgramUniform4uiEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORM4UIVEXTPROC glad_glProgramUniform4uivEXT; +#define glProgramUniform4uivEXT glad_glProgramUniform4uivEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC glad_glProgramUniformMatrix2dvEXT; +#define glProgramUniformMatrix2dvEXT glad_glProgramUniformMatrix2dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC glad_glProgramUniformMatrix2fvEXT; +#define glProgramUniformMatrix2fvEXT glad_glProgramUniformMatrix2fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC glad_glProgramUniformMatrix2x3dvEXT; +#define glProgramUniformMatrix2x3dvEXT glad_glProgramUniformMatrix2x3dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC glad_glProgramUniformMatrix2x3fvEXT; +#define glProgramUniformMatrix2x3fvEXT glad_glProgramUniformMatrix2x3fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC glad_glProgramUniformMatrix2x4dvEXT; +#define glProgramUniformMatrix2x4dvEXT glad_glProgramUniformMatrix2x4dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC glad_glProgramUniformMatrix2x4fvEXT; +#define glProgramUniformMatrix2x4fvEXT glad_glProgramUniformMatrix2x4fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC glad_glProgramUniformMatrix3dvEXT; +#define glProgramUniformMatrix3dvEXT glad_glProgramUniformMatrix3dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC glad_glProgramUniformMatrix3fvEXT; +#define glProgramUniformMatrix3fvEXT glad_glProgramUniformMatrix3fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC glad_glProgramUniformMatrix3x2dvEXT; +#define glProgramUniformMatrix3x2dvEXT glad_glProgramUniformMatrix3x2dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC glad_glProgramUniformMatrix3x2fvEXT; +#define glProgramUniformMatrix3x2fvEXT glad_glProgramUniformMatrix3x2fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC glad_glProgramUniformMatrix3x4dvEXT; +#define glProgramUniformMatrix3x4dvEXT glad_glProgramUniformMatrix3x4dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC glad_glProgramUniformMatrix3x4fvEXT; +#define glProgramUniformMatrix3x4fvEXT glad_glProgramUniformMatrix3x4fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC glad_glProgramUniformMatrix4dvEXT; +#define glProgramUniformMatrix4dvEXT glad_glProgramUniformMatrix4dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC glad_glProgramUniformMatrix4fvEXT; +#define glProgramUniformMatrix4fvEXT glad_glProgramUniformMatrix4fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC glad_glProgramUniformMatrix4x2dvEXT; +#define glProgramUniformMatrix4x2dvEXT glad_glProgramUniformMatrix4x2dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC glad_glProgramUniformMatrix4x2fvEXT; +#define glProgramUniformMatrix4x2fvEXT glad_glProgramUniformMatrix4x2fvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC glad_glProgramUniformMatrix4x3dvEXT; +#define glProgramUniformMatrix4x3dvEXT glad_glProgramUniformMatrix4x3dvEXT +GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC glad_glProgramUniformMatrix4x3fvEXT; +#define glProgramUniformMatrix4x3fvEXT glad_glProgramUniformMatrix4x3fvEXT +GLAD_API_CALL PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV; +#define glProgramVertexLimitNV glad_glProgramVertexLimitNV +GLAD_API_CALL PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; +#define glProvokingVertex glad_glProvokingVertex +GLAD_API_CALL PFNGLPROVOKINGVERTEXEXTPROC glad_glProvokingVertexEXT; +#define glProvokingVertexEXT glad_glProvokingVertexEXT +GLAD_API_CALL PFNGLPUSHATTRIBPROC glad_glPushAttrib; +#define glPushAttrib glad_glPushAttrib +GLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib; +#define glPushClientAttrib glad_glPushClientAttrib +GLAD_API_CALL PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC glad_glPushClientAttribDefaultEXT; +#define glPushClientAttribDefaultEXT glad_glPushClientAttribDefaultEXT +GLAD_API_CALL PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup; +#define glPushDebugGroup glad_glPushDebugGroup +GLAD_API_CALL PFNGLPUSHMATRIXPROC glad_glPushMatrix; +#define glPushMatrix glad_glPushMatrix +GLAD_API_CALL PFNGLPUSHNAMEPROC glad_glPushName; +#define glPushName glad_glPushName +GLAD_API_CALL PFNGLQUERYCOUNTERPROC glad_glQueryCounter; +#define glQueryCounter glad_glQueryCounter +GLAD_API_CALL PFNGLRASTERPOS2DPROC glad_glRasterPos2d; +#define glRasterPos2d glad_glRasterPos2d +GLAD_API_CALL PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv; +#define glRasterPos2dv glad_glRasterPos2dv +GLAD_API_CALL PFNGLRASTERPOS2FPROC glad_glRasterPos2f; +#define glRasterPos2f glad_glRasterPos2f +GLAD_API_CALL PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv; +#define glRasterPos2fv glad_glRasterPos2fv +GLAD_API_CALL PFNGLRASTERPOS2IPROC glad_glRasterPos2i; +#define glRasterPos2i glad_glRasterPos2i +GLAD_API_CALL PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv; +#define glRasterPos2iv glad_glRasterPos2iv +GLAD_API_CALL PFNGLRASTERPOS2SPROC glad_glRasterPos2s; +#define glRasterPos2s glad_glRasterPos2s +GLAD_API_CALL PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv; +#define glRasterPos2sv glad_glRasterPos2sv +GLAD_API_CALL PFNGLRASTERPOS3DPROC glad_glRasterPos3d; +#define glRasterPos3d glad_glRasterPos3d +GLAD_API_CALL PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv; +#define glRasterPos3dv glad_glRasterPos3dv +GLAD_API_CALL PFNGLRASTERPOS3FPROC glad_glRasterPos3f; +#define glRasterPos3f glad_glRasterPos3f +GLAD_API_CALL PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv; +#define glRasterPos3fv glad_glRasterPos3fv +GLAD_API_CALL PFNGLRASTERPOS3IPROC glad_glRasterPos3i; +#define glRasterPos3i glad_glRasterPos3i +GLAD_API_CALL PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv; +#define glRasterPos3iv glad_glRasterPos3iv +GLAD_API_CALL PFNGLRASTERPOS3SPROC glad_glRasterPos3s; +#define glRasterPos3s glad_glRasterPos3s +GLAD_API_CALL PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv; +#define glRasterPos3sv glad_glRasterPos3sv +GLAD_API_CALL PFNGLRASTERPOS4DPROC glad_glRasterPos4d; +#define glRasterPos4d glad_glRasterPos4d +GLAD_API_CALL PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv; +#define glRasterPos4dv glad_glRasterPos4dv +GLAD_API_CALL PFNGLRASTERPOS4FPROC glad_glRasterPos4f; +#define glRasterPos4f glad_glRasterPos4f +GLAD_API_CALL PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv; +#define glRasterPos4fv glad_glRasterPos4fv +GLAD_API_CALL PFNGLRASTERPOS4IPROC glad_glRasterPos4i; +#define glRasterPos4i glad_glRasterPos4i +GLAD_API_CALL PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv; +#define glRasterPos4iv glad_glRasterPos4iv +GLAD_API_CALL PFNGLRASTERPOS4SPROC glad_glRasterPos4s; +#define glRasterPos4s glad_glRasterPos4s +GLAD_API_CALL PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv; +#define glRasterPos4sv glad_glRasterPos4sv +GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer; +#define glReadBuffer glad_glReadBuffer +GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels; +#define glReadPixels glad_glReadPixels +GLAD_API_CALL PFNGLRECTDPROC glad_glRectd; +#define glRectd glad_glRectd +GLAD_API_CALL PFNGLRECTDVPROC glad_glRectdv; +#define glRectdv glad_glRectdv +GLAD_API_CALL PFNGLRECTFPROC glad_glRectf; +#define glRectf glad_glRectf +GLAD_API_CALL PFNGLRECTFVPROC glad_glRectfv; +#define glRectfv glad_glRectfv +GLAD_API_CALL PFNGLRECTIPROC glad_glRecti; +#define glRecti glad_glRecti +GLAD_API_CALL PFNGLRECTIVPROC glad_glRectiv; +#define glRectiv glad_glRectiv +GLAD_API_CALL PFNGLRECTSPROC glad_glRects; +#define glRects glad_glRects +GLAD_API_CALL PFNGLRECTSVPROC glad_glRectsv; +#define glRectsv glad_glRectsv +GLAD_API_CALL PFNGLRENDERMODEPROC glad_glRenderMode; +#define glRenderMode glad_glRenderMode +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; +#define glRenderbufferStorage glad_glRenderbufferStorage +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT; +#define glRenderbufferStorageEXT glad_glRenderbufferStorageEXT +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; +#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT; +#define glRenderbufferStorageMultisampleEXT glad_glRenderbufferStorageMultisampleEXT +GLAD_API_CALL PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV; +#define glRequestResidentProgramsNV glad_glRequestResidentProgramsNV +GLAD_API_CALL PFNGLRESETHISTOGRAMPROC glad_glResetHistogram; +#define glResetHistogram glad_glResetHistogram +GLAD_API_CALL PFNGLRESETMINMAXPROC glad_glResetMinmax; +#define glResetMinmax glad_glResetMinmax +GLAD_API_CALL PFNGLROTATEDPROC glad_glRotated; +#define glRotated glad_glRotated +GLAD_API_CALL PFNGLROTATEFPROC glad_glRotatef; +#define glRotatef glad_glRotatef +GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; +#define glSampleCoverage glad_glSampleCoverage +GLAD_API_CALL PFNGLSAMPLECOVERAGEARBPROC glad_glSampleCoverageARB; +#define glSampleCoverageARB glad_glSampleCoverageARB +GLAD_API_CALL PFNGLSAMPLEMASKINDEXEDNVPROC glad_glSampleMaskIndexedNV; +#define glSampleMaskIndexedNV glad_glSampleMaskIndexedNV +GLAD_API_CALL PFNGLSAMPLEMASKIPROC glad_glSampleMaski; +#define glSampleMaski glad_glSampleMaski +GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; +#define glSamplerParameterIiv glad_glSamplerParameterIiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; +#define glSamplerParameterIuiv glad_glSamplerParameterIuiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; +#define glSamplerParameterf glad_glSamplerParameterf +GLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; +#define glSamplerParameterfv glad_glSamplerParameterfv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; +#define glSamplerParameteri glad_glSamplerParameteri +GLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; +#define glSamplerParameteriv glad_glSamplerParameteriv +GLAD_API_CALL PFNGLSCALEDPROC glad_glScaled; +#define glScaled glad_glScaled +GLAD_API_CALL PFNGLSCALEFPROC glad_glScalef; +#define glScalef glad_glScalef +GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor; +#define glScissor glad_glScissor +GLAD_API_CALL PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b; +#define glSecondaryColor3b glad_glSecondaryColor3b +GLAD_API_CALL PFNGLSECONDARYCOLOR3BEXTPROC glad_glSecondaryColor3bEXT; +#define glSecondaryColor3bEXT glad_glSecondaryColor3bEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv; +#define glSecondaryColor3bv glad_glSecondaryColor3bv +GLAD_API_CALL PFNGLSECONDARYCOLOR3BVEXTPROC glad_glSecondaryColor3bvEXT; +#define glSecondaryColor3bvEXT glad_glSecondaryColor3bvEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d; +#define glSecondaryColor3d glad_glSecondaryColor3d +GLAD_API_CALL PFNGLSECONDARYCOLOR3DEXTPROC glad_glSecondaryColor3dEXT; +#define glSecondaryColor3dEXT glad_glSecondaryColor3dEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv; +#define glSecondaryColor3dv glad_glSecondaryColor3dv +GLAD_API_CALL PFNGLSECONDARYCOLOR3DVEXTPROC glad_glSecondaryColor3dvEXT; +#define glSecondaryColor3dvEXT glad_glSecondaryColor3dvEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f; +#define glSecondaryColor3f glad_glSecondaryColor3f +GLAD_API_CALL PFNGLSECONDARYCOLOR3FEXTPROC glad_glSecondaryColor3fEXT; +#define glSecondaryColor3fEXT glad_glSecondaryColor3fEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv; +#define glSecondaryColor3fv glad_glSecondaryColor3fv +GLAD_API_CALL PFNGLSECONDARYCOLOR3FVEXTPROC glad_glSecondaryColor3fvEXT; +#define glSecondaryColor3fvEXT glad_glSecondaryColor3fvEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i; +#define glSecondaryColor3i glad_glSecondaryColor3i +GLAD_API_CALL PFNGLSECONDARYCOLOR3IEXTPROC glad_glSecondaryColor3iEXT; +#define glSecondaryColor3iEXT glad_glSecondaryColor3iEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv; +#define glSecondaryColor3iv glad_glSecondaryColor3iv +GLAD_API_CALL PFNGLSECONDARYCOLOR3IVEXTPROC glad_glSecondaryColor3ivEXT; +#define glSecondaryColor3ivEXT glad_glSecondaryColor3ivEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s; +#define glSecondaryColor3s glad_glSecondaryColor3s +GLAD_API_CALL PFNGLSECONDARYCOLOR3SEXTPROC glad_glSecondaryColor3sEXT; +#define glSecondaryColor3sEXT glad_glSecondaryColor3sEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv; +#define glSecondaryColor3sv glad_glSecondaryColor3sv +GLAD_API_CALL PFNGLSECONDARYCOLOR3SVEXTPROC glad_glSecondaryColor3svEXT; +#define glSecondaryColor3svEXT glad_glSecondaryColor3svEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub; +#define glSecondaryColor3ub glad_glSecondaryColor3ub +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBEXTPROC glad_glSecondaryColor3ubEXT; +#define glSecondaryColor3ubEXT glad_glSecondaryColor3ubEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv; +#define glSecondaryColor3ubv glad_glSecondaryColor3ubv +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBVEXTPROC glad_glSecondaryColor3ubvEXT; +#define glSecondaryColor3ubvEXT glad_glSecondaryColor3ubvEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui; +#define glSecondaryColor3ui glad_glSecondaryColor3ui +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIEXTPROC glad_glSecondaryColor3uiEXT; +#define glSecondaryColor3uiEXT glad_glSecondaryColor3uiEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv; +#define glSecondaryColor3uiv glad_glSecondaryColor3uiv +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIVEXTPROC glad_glSecondaryColor3uivEXT; +#define glSecondaryColor3uivEXT glad_glSecondaryColor3uivEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us; +#define glSecondaryColor3us glad_glSecondaryColor3us +GLAD_API_CALL PFNGLSECONDARYCOLOR3USEXTPROC glad_glSecondaryColor3usEXT; +#define glSecondaryColor3usEXT glad_glSecondaryColor3usEXT +GLAD_API_CALL PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv; +#define glSecondaryColor3usv glad_glSecondaryColor3usv +GLAD_API_CALL PFNGLSECONDARYCOLOR3USVEXTPROC glad_glSecondaryColor3usvEXT; +#define glSecondaryColor3usvEXT glad_glSecondaryColor3usvEXT +GLAD_API_CALL PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui; +#define glSecondaryColorP3ui glad_glSecondaryColorP3ui +GLAD_API_CALL PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv; +#define glSecondaryColorP3uiv glad_glSecondaryColorP3uiv +GLAD_API_CALL PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer; +#define glSecondaryColorPointer glad_glSecondaryColorPointer +GLAD_API_CALL PFNGLSECONDARYCOLORPOINTEREXTPROC glad_glSecondaryColorPointerEXT; +#define glSecondaryColorPointerEXT glad_glSecondaryColorPointerEXT +GLAD_API_CALL PFNGLSELECTBUFFERPROC glad_glSelectBuffer; +#define glSelectBuffer glad_glSelectBuffer +GLAD_API_CALL PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D; +#define glSeparableFilter2D glad_glSeparableFilter2D +GLAD_API_CALL PFNGLSHADEMODELPROC glad_glShadeModel; +#define glShadeModel glad_glShadeModel +GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource; +#define glShaderSource glad_glShaderSource +GLAD_API_CALL PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB; +#define glShaderSourceARB glad_glShaderSourceARB +GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc; +#define glStencilFunc glad_glStencilFunc +GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; +#define glStencilFuncSeparate glad_glStencilFuncSeparate +GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEATIPROC glad_glStencilFuncSeparateATI; +#define glStencilFuncSeparateATI glad_glStencilFuncSeparateATI +GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask; +#define glStencilMask glad_glStencilMask +GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; +#define glStencilMaskSeparate glad_glStencilMaskSeparate +GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp; +#define glStencilOp glad_glStencilOp +GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; +#define glStencilOpSeparate glad_glStencilOpSeparate +GLAD_API_CALL PFNGLSTENCILOPSEPARATEATIPROC glad_glStencilOpSeparateATI; +#define glStencilOpSeparateATI glad_glStencilOpSeparateATI +GLAD_API_CALL PFNGLTEXBUFFERPROC glad_glTexBuffer; +#define glTexBuffer glad_glTexBuffer +GLAD_API_CALL PFNGLTEXBUFFERARBPROC glad_glTexBufferARB; +#define glTexBufferARB glad_glTexBufferARB +GLAD_API_CALL PFNGLTEXBUFFEREXTPROC glad_glTexBufferEXT; +#define glTexBufferEXT glad_glTexBufferEXT +GLAD_API_CALL PFNGLTEXCOORD1DPROC glad_glTexCoord1d; +#define glTexCoord1d glad_glTexCoord1d +GLAD_API_CALL PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv; +#define glTexCoord1dv glad_glTexCoord1dv +GLAD_API_CALL PFNGLTEXCOORD1FPROC glad_glTexCoord1f; +#define glTexCoord1f glad_glTexCoord1f +GLAD_API_CALL PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv; +#define glTexCoord1fv glad_glTexCoord1fv +GLAD_API_CALL PFNGLTEXCOORD1IPROC glad_glTexCoord1i; +#define glTexCoord1i glad_glTexCoord1i +GLAD_API_CALL PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv; +#define glTexCoord1iv glad_glTexCoord1iv +GLAD_API_CALL PFNGLTEXCOORD1SPROC glad_glTexCoord1s; +#define glTexCoord1s glad_glTexCoord1s +GLAD_API_CALL PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv; +#define glTexCoord1sv glad_glTexCoord1sv +GLAD_API_CALL PFNGLTEXCOORD2DPROC glad_glTexCoord2d; +#define glTexCoord2d glad_glTexCoord2d +GLAD_API_CALL PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv; +#define glTexCoord2dv glad_glTexCoord2dv +GLAD_API_CALL PFNGLTEXCOORD2FPROC glad_glTexCoord2f; +#define glTexCoord2f glad_glTexCoord2f +GLAD_API_CALL PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv; +#define glTexCoord2fv glad_glTexCoord2fv +GLAD_API_CALL PFNGLTEXCOORD2IPROC glad_glTexCoord2i; +#define glTexCoord2i glad_glTexCoord2i +GLAD_API_CALL PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv; +#define glTexCoord2iv glad_glTexCoord2iv +GLAD_API_CALL PFNGLTEXCOORD2SPROC glad_glTexCoord2s; +#define glTexCoord2s glad_glTexCoord2s +GLAD_API_CALL PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv; +#define glTexCoord2sv glad_glTexCoord2sv +GLAD_API_CALL PFNGLTEXCOORD3DPROC glad_glTexCoord3d; +#define glTexCoord3d glad_glTexCoord3d +GLAD_API_CALL PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv; +#define glTexCoord3dv glad_glTexCoord3dv +GLAD_API_CALL PFNGLTEXCOORD3FPROC glad_glTexCoord3f; +#define glTexCoord3f glad_glTexCoord3f +GLAD_API_CALL PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv; +#define glTexCoord3fv glad_glTexCoord3fv +GLAD_API_CALL PFNGLTEXCOORD3IPROC glad_glTexCoord3i; +#define glTexCoord3i glad_glTexCoord3i +GLAD_API_CALL PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv; +#define glTexCoord3iv glad_glTexCoord3iv +GLAD_API_CALL PFNGLTEXCOORD3SPROC glad_glTexCoord3s; +#define glTexCoord3s glad_glTexCoord3s +GLAD_API_CALL PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv; +#define glTexCoord3sv glad_glTexCoord3sv +GLAD_API_CALL PFNGLTEXCOORD4DPROC glad_glTexCoord4d; +#define glTexCoord4d glad_glTexCoord4d +GLAD_API_CALL PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv; +#define glTexCoord4dv glad_glTexCoord4dv +GLAD_API_CALL PFNGLTEXCOORD4FPROC glad_glTexCoord4f; +#define glTexCoord4f glad_glTexCoord4f +GLAD_API_CALL PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv; +#define glTexCoord4fv glad_glTexCoord4fv +GLAD_API_CALL PFNGLTEXCOORD4IPROC glad_glTexCoord4i; +#define glTexCoord4i glad_glTexCoord4i +GLAD_API_CALL PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv; +#define glTexCoord4iv glad_glTexCoord4iv +GLAD_API_CALL PFNGLTEXCOORD4SPROC glad_glTexCoord4s; +#define glTexCoord4s glad_glTexCoord4s +GLAD_API_CALL PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv; +#define glTexCoord4sv glad_glTexCoord4sv +GLAD_API_CALL PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui; +#define glTexCoordP1ui glad_glTexCoordP1ui +GLAD_API_CALL PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv; +#define glTexCoordP1uiv glad_glTexCoordP1uiv +GLAD_API_CALL PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui; +#define glTexCoordP2ui glad_glTexCoordP2ui +GLAD_API_CALL PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv; +#define glTexCoordP2uiv glad_glTexCoordP2uiv +GLAD_API_CALL PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui; +#define glTexCoordP3ui glad_glTexCoordP3ui +GLAD_API_CALL PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv; +#define glTexCoordP3uiv glad_glTexCoordP3uiv +GLAD_API_CALL PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui; +#define glTexCoordP4ui glad_glTexCoordP4ui +GLAD_API_CALL PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv; +#define glTexCoordP4uiv glad_glTexCoordP4uiv +GLAD_API_CALL PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer; +#define glTexCoordPointer glad_glTexCoordPointer +GLAD_API_CALL PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT; +#define glTexCoordPointerEXT glad_glTexCoordPointerEXT +GLAD_API_CALL PFNGLTEXENVFPROC glad_glTexEnvf; +#define glTexEnvf glad_glTexEnvf +GLAD_API_CALL PFNGLTEXENVFVPROC glad_glTexEnvfv; +#define glTexEnvfv glad_glTexEnvfv +GLAD_API_CALL PFNGLTEXENVIPROC glad_glTexEnvi; +#define glTexEnvi glad_glTexEnvi +GLAD_API_CALL PFNGLTEXENVIVPROC glad_glTexEnviv; +#define glTexEnviv glad_glTexEnviv +GLAD_API_CALL PFNGLTEXGENDPROC glad_glTexGend; +#define glTexGend glad_glTexGend +GLAD_API_CALL PFNGLTEXGENDVPROC glad_glTexGendv; +#define glTexGendv glad_glTexGendv +GLAD_API_CALL PFNGLTEXGENFPROC glad_glTexGenf; +#define glTexGenf glad_glTexGenf +GLAD_API_CALL PFNGLTEXGENFVPROC glad_glTexGenfv; +#define glTexGenfv glad_glTexGenfv +GLAD_API_CALL PFNGLTEXGENIPROC glad_glTexGeni; +#define glTexGeni glad_glTexGeni +GLAD_API_CALL PFNGLTEXGENIVPROC glad_glTexGeniv; +#define glTexGeniv glad_glTexGeniv +GLAD_API_CALL PFNGLTEXIMAGE1DPROC glad_glTexImage1D; +#define glTexImage1D glad_glTexImage1D +GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D; +#define glTexImage2D glad_glTexImage2D +GLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; +#define glTexImage2DMultisample glad_glTexImage2DMultisample +GLAD_API_CALL PFNGLTEXIMAGE3DPROC glad_glTexImage3D; +#define glTexImage3D glad_glTexImage3D +GLAD_API_CALL PFNGLTEXIMAGE3DEXTPROC glad_glTexImage3DEXT; +#define glTexImage3DEXT glad_glTexImage3DEXT +GLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; +#define glTexImage3DMultisample glad_glTexImage3DMultisample +GLAD_API_CALL PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; +#define glTexParameterIiv glad_glTexParameterIiv +GLAD_API_CALL PFNGLTEXPARAMETERIIVEXTPROC glad_glTexParameterIivEXT; +#define glTexParameterIivEXT glad_glTexParameterIivEXT +GLAD_API_CALL PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; +#define glTexParameterIuiv glad_glTexParameterIuiv +GLAD_API_CALL PFNGLTEXPARAMETERIUIVEXTPROC glad_glTexParameterIuivEXT; +#define glTexParameterIuivEXT glad_glTexParameterIuivEXT +GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf; +#define glTexParameterf glad_glTexParameterf +GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; +#define glTexParameterfv glad_glTexParameterfv +GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri; +#define glTexParameteri glad_glTexParameteri +GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; +#define glTexParameteriv glad_glTexParameteriv +GLAD_API_CALL PFNGLTEXRENDERBUFFERNVPROC glad_glTexRenderbufferNV; +#define glTexRenderbufferNV glad_glTexRenderbufferNV +GLAD_API_CALL PFNGLTEXSTORAGE1DEXTPROC glad_glTexStorage1DEXT; +#define glTexStorage1DEXT glad_glTexStorage1DEXT +GLAD_API_CALL PFNGLTEXSTORAGE2DEXTPROC glad_glTexStorage2DEXT; +#define glTexStorage2DEXT glad_glTexStorage2DEXT +GLAD_API_CALL PFNGLTEXSTORAGE3DEXTPROC glad_glTexStorage3DEXT; +#define glTexStorage3DEXT glad_glTexStorage3DEXT +GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; +#define glTexSubImage1D glad_glTexSubImage1D +GLAD_API_CALL PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT; +#define glTexSubImage1DEXT glad_glTexSubImage1DEXT +GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; +#define glTexSubImage2D glad_glTexSubImage2D +GLAD_API_CALL PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT; +#define glTexSubImage2DEXT glad_glTexSubImage2DEXT +GLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; +#define glTexSubImage3D glad_glTexSubImage3D +GLAD_API_CALL PFNGLTEXSUBIMAGE3DEXTPROC glad_glTexSubImage3DEXT; +#define glTexSubImage3DEXT glad_glTexSubImage3DEXT +GLAD_API_CALL PFNGLTEXTUREBUFFEREXTPROC glad_glTextureBufferEXT; +#define glTextureBufferEXT glad_glTextureBufferEXT +GLAD_API_CALL PFNGLTEXTUREBUFFERRANGEEXTPROC glad_glTextureBufferRangeEXT; +#define glTextureBufferRangeEXT glad_glTextureBufferRangeEXT +GLAD_API_CALL PFNGLTEXTUREIMAGE1DEXTPROC glad_glTextureImage1DEXT; +#define glTextureImage1DEXT glad_glTextureImage1DEXT +GLAD_API_CALL PFNGLTEXTUREIMAGE2DEXTPROC glad_glTextureImage2DEXT; +#define glTextureImage2DEXT glad_glTextureImage2DEXT +GLAD_API_CALL PFNGLTEXTUREIMAGE3DEXTPROC glad_glTextureImage3DEXT; +#define glTextureImage3DEXT glad_glTextureImage3DEXT +GLAD_API_CALL PFNGLTEXTUREPAGECOMMITMENTEXTPROC glad_glTexturePageCommitmentEXT; +#define glTexturePageCommitmentEXT glad_glTexturePageCommitmentEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERIIVEXTPROC glad_glTextureParameterIivEXT; +#define glTextureParameterIivEXT glad_glTextureParameterIivEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERIUIVEXTPROC glad_glTextureParameterIuivEXT; +#define glTextureParameterIuivEXT glad_glTextureParameterIuivEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERFEXTPROC glad_glTextureParameterfEXT; +#define glTextureParameterfEXT glad_glTextureParameterfEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERFVEXTPROC glad_glTextureParameterfvEXT; +#define glTextureParameterfvEXT glad_glTextureParameterfvEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERIEXTPROC glad_glTextureParameteriEXT; +#define glTextureParameteriEXT glad_glTextureParameteriEXT +GLAD_API_CALL PFNGLTEXTUREPARAMETERIVEXTPROC glad_glTextureParameterivEXT; +#define glTextureParameterivEXT glad_glTextureParameterivEXT +GLAD_API_CALL PFNGLTEXTURERENDERBUFFEREXTPROC glad_glTextureRenderbufferEXT; +#define glTextureRenderbufferEXT glad_glTextureRenderbufferEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE1DEXTPROC glad_glTextureStorage1DEXT; +#define glTextureStorage1DEXT glad_glTextureStorage1DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE2DEXTPROC glad_glTextureStorage2DEXT; +#define glTextureStorage2DEXT glad_glTextureStorage2DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC glad_glTextureStorage2DMultisampleEXT; +#define glTextureStorage2DMultisampleEXT glad_glTextureStorage2DMultisampleEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE3DEXTPROC glad_glTextureStorage3DEXT; +#define glTextureStorage3DEXT glad_glTextureStorage3DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC glad_glTextureStorage3DMultisampleEXT; +#define glTextureStorage3DMultisampleEXT glad_glTextureStorage3DMultisampleEXT +GLAD_API_CALL PFNGLTEXTURESUBIMAGE1DEXTPROC glad_glTextureSubImage1DEXT; +#define glTextureSubImage1DEXT glad_glTextureSubImage1DEXT +GLAD_API_CALL PFNGLTEXTURESUBIMAGE2DEXTPROC glad_glTextureSubImage2DEXT; +#define glTextureSubImage2DEXT glad_glTextureSubImage2DEXT +GLAD_API_CALL PFNGLTEXTURESUBIMAGE3DEXTPROC glad_glTextureSubImage3DEXT; +#define glTextureSubImage3DEXT glad_glTextureSubImage3DEXT +GLAD_API_CALL PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV; +#define glTrackMatrixNV glad_glTrackMatrixNV +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC glad_glTransformFeedbackAttribsNV; +#define glTransformFeedbackAttribsNV glad_glTransformFeedbackAttribsNV +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC glad_glTransformFeedbackStreamAttribsNV; +#define glTransformFeedbackStreamAttribsNV glad_glTransformFeedbackStreamAttribsNV +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; +#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC glad_glTransformFeedbackVaryingsEXT; +#define glTransformFeedbackVaryingsEXT glad_glTransformFeedbackVaryingsEXT +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC glad_glTransformFeedbackVaryingsNV; +#define glTransformFeedbackVaryingsNV glad_glTransformFeedbackVaryingsNV +GLAD_API_CALL PFNGLTRANSLATEDPROC glad_glTranslated; +#define glTranslated glad_glTranslated +GLAD_API_CALL PFNGLTRANSLATEFPROC glad_glTranslatef; +#define glTranslatef glad_glTranslatef +GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f; +#define glUniform1f glad_glUniform1f +GLAD_API_CALL PFNGLUNIFORM1FARBPROC glad_glUniform1fARB; +#define glUniform1fARB glad_glUniform1fARB +GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv; +#define glUniform1fv glad_glUniform1fv +GLAD_API_CALL PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB; +#define glUniform1fvARB glad_glUniform1fvARB +GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i; +#define glUniform1i glad_glUniform1i +GLAD_API_CALL PFNGLUNIFORM1IARBPROC glad_glUniform1iARB; +#define glUniform1iARB glad_glUniform1iARB +GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv; +#define glUniform1iv glad_glUniform1iv +GLAD_API_CALL PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB; +#define glUniform1ivARB glad_glUniform1ivARB +GLAD_API_CALL PFNGLUNIFORM1UIPROC glad_glUniform1ui; +#define glUniform1ui glad_glUniform1ui +GLAD_API_CALL PFNGLUNIFORM1UIEXTPROC glad_glUniform1uiEXT; +#define glUniform1uiEXT glad_glUniform1uiEXT +GLAD_API_CALL PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; +#define glUniform1uiv glad_glUniform1uiv +GLAD_API_CALL PFNGLUNIFORM1UIVEXTPROC glad_glUniform1uivEXT; +#define glUniform1uivEXT glad_glUniform1uivEXT +GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f; +#define glUniform2f glad_glUniform2f +GLAD_API_CALL PFNGLUNIFORM2FARBPROC glad_glUniform2fARB; +#define glUniform2fARB glad_glUniform2fARB +GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv; +#define glUniform2fv glad_glUniform2fv +GLAD_API_CALL PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB; +#define glUniform2fvARB glad_glUniform2fvARB +GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i; +#define glUniform2i glad_glUniform2i +GLAD_API_CALL PFNGLUNIFORM2IARBPROC glad_glUniform2iARB; +#define glUniform2iARB glad_glUniform2iARB +GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv; +#define glUniform2iv glad_glUniform2iv +GLAD_API_CALL PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB; +#define glUniform2ivARB glad_glUniform2ivARB +GLAD_API_CALL PFNGLUNIFORM2UIPROC glad_glUniform2ui; +#define glUniform2ui glad_glUniform2ui +GLAD_API_CALL PFNGLUNIFORM2UIEXTPROC glad_glUniform2uiEXT; +#define glUniform2uiEXT glad_glUniform2uiEXT +GLAD_API_CALL PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; +#define glUniform2uiv glad_glUniform2uiv +GLAD_API_CALL PFNGLUNIFORM2UIVEXTPROC glad_glUniform2uivEXT; +#define glUniform2uivEXT glad_glUniform2uivEXT +GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f; +#define glUniform3f glad_glUniform3f +GLAD_API_CALL PFNGLUNIFORM3FARBPROC glad_glUniform3fARB; +#define glUniform3fARB glad_glUniform3fARB +GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv; +#define glUniform3fv glad_glUniform3fv +GLAD_API_CALL PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB; +#define glUniform3fvARB glad_glUniform3fvARB +GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i; +#define glUniform3i glad_glUniform3i +GLAD_API_CALL PFNGLUNIFORM3IARBPROC glad_glUniform3iARB; +#define glUniform3iARB glad_glUniform3iARB +GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv; +#define glUniform3iv glad_glUniform3iv +GLAD_API_CALL PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB; +#define glUniform3ivARB glad_glUniform3ivARB +GLAD_API_CALL PFNGLUNIFORM3UIPROC glad_glUniform3ui; +#define glUniform3ui glad_glUniform3ui +GLAD_API_CALL PFNGLUNIFORM3UIEXTPROC glad_glUniform3uiEXT; +#define glUniform3uiEXT glad_glUniform3uiEXT +GLAD_API_CALL PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; +#define glUniform3uiv glad_glUniform3uiv +GLAD_API_CALL PFNGLUNIFORM3UIVEXTPROC glad_glUniform3uivEXT; +#define glUniform3uivEXT glad_glUniform3uivEXT +GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f; +#define glUniform4f glad_glUniform4f +GLAD_API_CALL PFNGLUNIFORM4FARBPROC glad_glUniform4fARB; +#define glUniform4fARB glad_glUniform4fARB +GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv; +#define glUniform4fv glad_glUniform4fv +GLAD_API_CALL PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB; +#define glUniform4fvARB glad_glUniform4fvARB +GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i; +#define glUniform4i glad_glUniform4i +GLAD_API_CALL PFNGLUNIFORM4IARBPROC glad_glUniform4iARB; +#define glUniform4iARB glad_glUniform4iARB +GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv; +#define glUniform4iv glad_glUniform4iv +GLAD_API_CALL PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB; +#define glUniform4ivARB glad_glUniform4ivARB +GLAD_API_CALL PFNGLUNIFORM4UIPROC glad_glUniform4ui; +#define glUniform4ui glad_glUniform4ui +GLAD_API_CALL PFNGLUNIFORM4UIEXTPROC glad_glUniform4uiEXT; +#define glUniform4uiEXT glad_glUniform4uiEXT +GLAD_API_CALL PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; +#define glUniform4uiv glad_glUniform4uiv +GLAD_API_CALL PFNGLUNIFORM4UIVEXTPROC glad_glUniform4uivEXT; +#define glUniform4uivEXT glad_glUniform4uivEXT +GLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; +#define glUniformBlockBinding glad_glUniformBlockBinding +GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; +#define glUniformMatrix2fv glad_glUniformMatrix2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB; +#define glUniformMatrix2fvARB glad_glUniformMatrix2fvARB +GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; +#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; +#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; +#define glUniformMatrix3fv glad_glUniformMatrix3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB; +#define glUniformMatrix3fvARB glad_glUniformMatrix3fvARB +GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; +#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; +#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; +#define glUniformMatrix4fv glad_glUniformMatrix4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB; +#define glUniformMatrix4fvARB glad_glUniformMatrix4fvARB +GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; +#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; +#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv +GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; +#define glUnmapBuffer glad_glUnmapBuffer +GLAD_API_CALL PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB; +#define glUnmapBufferARB glad_glUnmapBufferARB +GLAD_API_CALL PFNGLUNMAPNAMEDBUFFEREXTPROC glad_glUnmapNamedBufferEXT; +#define glUnmapNamedBufferEXT glad_glUnmapNamedBufferEXT +GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram; +#define glUseProgram glad_glUseProgram +GLAD_API_CALL PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB; +#define glUseProgramObjectARB glad_glUseProgramObjectARB +GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; +#define glValidateProgram glad_glValidateProgram +GLAD_API_CALL PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB; +#define glValidateProgramARB glad_glValidateProgramARB +GLAD_API_CALL PFNGLVERTEX2DPROC glad_glVertex2d; +#define glVertex2d glad_glVertex2d +GLAD_API_CALL PFNGLVERTEX2DVPROC glad_glVertex2dv; +#define glVertex2dv glad_glVertex2dv +GLAD_API_CALL PFNGLVERTEX2FPROC glad_glVertex2f; +#define glVertex2f glad_glVertex2f +GLAD_API_CALL PFNGLVERTEX2FVPROC glad_glVertex2fv; +#define glVertex2fv glad_glVertex2fv +GLAD_API_CALL PFNGLVERTEX2IPROC glad_glVertex2i; +#define glVertex2i glad_glVertex2i +GLAD_API_CALL PFNGLVERTEX2IVPROC glad_glVertex2iv; +#define glVertex2iv glad_glVertex2iv +GLAD_API_CALL PFNGLVERTEX2SPROC glad_glVertex2s; +#define glVertex2s glad_glVertex2s +GLAD_API_CALL PFNGLVERTEX2SVPROC glad_glVertex2sv; +#define glVertex2sv glad_glVertex2sv +GLAD_API_CALL PFNGLVERTEX3DPROC glad_glVertex3d; +#define glVertex3d glad_glVertex3d +GLAD_API_CALL PFNGLVERTEX3DVPROC glad_glVertex3dv; +#define glVertex3dv glad_glVertex3dv +GLAD_API_CALL PFNGLVERTEX3FPROC glad_glVertex3f; +#define glVertex3f glad_glVertex3f +GLAD_API_CALL PFNGLVERTEX3FVPROC glad_glVertex3fv; +#define glVertex3fv glad_glVertex3fv +GLAD_API_CALL PFNGLVERTEX3IPROC glad_glVertex3i; +#define glVertex3i glad_glVertex3i +GLAD_API_CALL PFNGLVERTEX3IVPROC glad_glVertex3iv; +#define glVertex3iv glad_glVertex3iv +GLAD_API_CALL PFNGLVERTEX3SPROC glad_glVertex3s; +#define glVertex3s glad_glVertex3s +GLAD_API_CALL PFNGLVERTEX3SVPROC glad_glVertex3sv; +#define glVertex3sv glad_glVertex3sv +GLAD_API_CALL PFNGLVERTEX4DPROC glad_glVertex4d; +#define glVertex4d glad_glVertex4d +GLAD_API_CALL PFNGLVERTEX4DVPROC glad_glVertex4dv; +#define glVertex4dv glad_glVertex4dv +GLAD_API_CALL PFNGLVERTEX4FPROC glad_glVertex4f; +#define glVertex4f glad_glVertex4f +GLAD_API_CALL PFNGLVERTEX4FVPROC glad_glVertex4fv; +#define glVertex4fv glad_glVertex4fv +GLAD_API_CALL PFNGLVERTEX4IPROC glad_glVertex4i; +#define glVertex4i glad_glVertex4i +GLAD_API_CALL PFNGLVERTEX4IVPROC glad_glVertex4iv; +#define glVertex4iv glad_glVertex4iv +GLAD_API_CALL PFNGLVERTEX4SPROC glad_glVertex4s; +#define glVertex4s glad_glVertex4s +GLAD_API_CALL PFNGLVERTEX4SVPROC glad_glVertex4sv; +#define glVertex4sv glad_glVertex4sv +GLAD_API_CALL PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC glad_glVertexArrayBindVertexBufferEXT; +#define glVertexArrayBindVertexBufferEXT glad_glVertexArrayBindVertexBufferEXT +GLAD_API_CALL PFNGLVERTEXARRAYCOLOROFFSETEXTPROC glad_glVertexArrayColorOffsetEXT; +#define glVertexArrayColorOffsetEXT glad_glVertexArrayColorOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC glad_glVertexArrayEdgeFlagOffsetEXT; +#define glVertexArrayEdgeFlagOffsetEXT glad_glVertexArrayEdgeFlagOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC glad_glVertexArrayFogCoordOffsetEXT; +#define glVertexArrayFogCoordOffsetEXT glad_glVertexArrayFogCoordOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYINDEXOFFSETEXTPROC glad_glVertexArrayIndexOffsetEXT; +#define glVertexArrayIndexOffsetEXT glad_glVertexArrayIndexOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC glad_glVertexArrayMultiTexCoordOffsetEXT; +#define glVertexArrayMultiTexCoordOffsetEXT glad_glVertexArrayMultiTexCoordOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYNORMALOFFSETEXTPROC glad_glVertexArrayNormalOffsetEXT; +#define glVertexArrayNormalOffsetEXT glad_glVertexArrayNormalOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC glad_glVertexArraySecondaryColorOffsetEXT; +#define glVertexArraySecondaryColorOffsetEXT glad_glVertexArraySecondaryColorOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC glad_glVertexArrayTexCoordOffsetEXT; +#define glVertexArrayTexCoordOffsetEXT glad_glVertexArrayTexCoordOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC glad_glVertexArrayVertexAttribBindingEXT; +#define glVertexArrayVertexAttribBindingEXT glad_glVertexArrayVertexAttribBindingEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC glad_glVertexArrayVertexAttribDivisorEXT; +#define glVertexArrayVertexAttribDivisorEXT glad_glVertexArrayVertexAttribDivisorEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC glad_glVertexArrayVertexAttribFormatEXT; +#define glVertexArrayVertexAttribFormatEXT glad_glVertexArrayVertexAttribFormatEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC glad_glVertexArrayVertexAttribIFormatEXT; +#define glVertexArrayVertexAttribIFormatEXT glad_glVertexArrayVertexAttribIFormatEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC glad_glVertexArrayVertexAttribIOffsetEXT; +#define glVertexArrayVertexAttribIOffsetEXT glad_glVertexArrayVertexAttribIOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC glad_glVertexArrayVertexAttribLFormatEXT; +#define glVertexArrayVertexAttribLFormatEXT glad_glVertexArrayVertexAttribLFormatEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC glad_glVertexArrayVertexAttribLOffsetEXT; +#define glVertexArrayVertexAttribLOffsetEXT glad_glVertexArrayVertexAttribLOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC glad_glVertexArrayVertexAttribOffsetEXT; +#define glVertexArrayVertexAttribOffsetEXT glad_glVertexArrayVertexAttribOffsetEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC glad_glVertexArrayVertexBindingDivisorEXT; +#define glVertexArrayVertexBindingDivisorEXT glad_glVertexArrayVertexBindingDivisorEXT +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC glad_glVertexArrayVertexOffsetEXT; +#define glVertexArrayVertexOffsetEXT glad_glVertexArrayVertexOffsetEXT +GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; +#define glVertexAttrib1d glad_glVertexAttrib1d +GLAD_API_CALL PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB; +#define glVertexAttrib1dARB glad_glVertexAttrib1dARB +GLAD_API_CALL PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV; +#define glVertexAttrib1dNV glad_glVertexAttrib1dNV +GLAD_API_CALL PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; +#define glVertexAttrib1dv glad_glVertexAttrib1dv +GLAD_API_CALL PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB; +#define glVertexAttrib1dvARB glad_glVertexAttrib1dvARB +GLAD_API_CALL PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV; +#define glVertexAttrib1dvNV glad_glVertexAttrib1dvNV +GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; +#define glVertexAttrib1f glad_glVertexAttrib1f +GLAD_API_CALL PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB; +#define glVertexAttrib1fARB glad_glVertexAttrib1fARB +GLAD_API_CALL PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV; +#define glVertexAttrib1fNV glad_glVertexAttrib1fNV +GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; +#define glVertexAttrib1fv glad_glVertexAttrib1fv +GLAD_API_CALL PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB; +#define glVertexAttrib1fvARB glad_glVertexAttrib1fvARB +GLAD_API_CALL PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV; +#define glVertexAttrib1fvNV glad_glVertexAttrib1fvNV +GLAD_API_CALL PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; +#define glVertexAttrib1s glad_glVertexAttrib1s +GLAD_API_CALL PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB; +#define glVertexAttrib1sARB glad_glVertexAttrib1sARB +GLAD_API_CALL PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV; +#define glVertexAttrib1sNV glad_glVertexAttrib1sNV +GLAD_API_CALL PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; +#define glVertexAttrib1sv glad_glVertexAttrib1sv +GLAD_API_CALL PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB; +#define glVertexAttrib1svARB glad_glVertexAttrib1svARB +GLAD_API_CALL PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV; +#define glVertexAttrib1svNV glad_glVertexAttrib1svNV +GLAD_API_CALL PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; +#define glVertexAttrib2d glad_glVertexAttrib2d +GLAD_API_CALL PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB; +#define glVertexAttrib2dARB glad_glVertexAttrib2dARB +GLAD_API_CALL PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV; +#define glVertexAttrib2dNV glad_glVertexAttrib2dNV +GLAD_API_CALL PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; +#define glVertexAttrib2dv glad_glVertexAttrib2dv +GLAD_API_CALL PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB; +#define glVertexAttrib2dvARB glad_glVertexAttrib2dvARB +GLAD_API_CALL PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV; +#define glVertexAttrib2dvNV glad_glVertexAttrib2dvNV +GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; +#define glVertexAttrib2f glad_glVertexAttrib2f +GLAD_API_CALL PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB; +#define glVertexAttrib2fARB glad_glVertexAttrib2fARB +GLAD_API_CALL PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV; +#define glVertexAttrib2fNV glad_glVertexAttrib2fNV +GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; +#define glVertexAttrib2fv glad_glVertexAttrib2fv +GLAD_API_CALL PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB; +#define glVertexAttrib2fvARB glad_glVertexAttrib2fvARB +GLAD_API_CALL PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV; +#define glVertexAttrib2fvNV glad_glVertexAttrib2fvNV +GLAD_API_CALL PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; +#define glVertexAttrib2s glad_glVertexAttrib2s +GLAD_API_CALL PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB; +#define glVertexAttrib2sARB glad_glVertexAttrib2sARB +GLAD_API_CALL PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV; +#define glVertexAttrib2sNV glad_glVertexAttrib2sNV +GLAD_API_CALL PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; +#define glVertexAttrib2sv glad_glVertexAttrib2sv +GLAD_API_CALL PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB; +#define glVertexAttrib2svARB glad_glVertexAttrib2svARB +GLAD_API_CALL PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV; +#define glVertexAttrib2svNV glad_glVertexAttrib2svNV +GLAD_API_CALL PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; +#define glVertexAttrib3d glad_glVertexAttrib3d +GLAD_API_CALL PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB; +#define glVertexAttrib3dARB glad_glVertexAttrib3dARB +GLAD_API_CALL PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV; +#define glVertexAttrib3dNV glad_glVertexAttrib3dNV +GLAD_API_CALL PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; +#define glVertexAttrib3dv glad_glVertexAttrib3dv +GLAD_API_CALL PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB; +#define glVertexAttrib3dvARB glad_glVertexAttrib3dvARB +GLAD_API_CALL PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV; +#define glVertexAttrib3dvNV glad_glVertexAttrib3dvNV +GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; +#define glVertexAttrib3f glad_glVertexAttrib3f +GLAD_API_CALL PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB; +#define glVertexAttrib3fARB glad_glVertexAttrib3fARB +GLAD_API_CALL PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV; +#define glVertexAttrib3fNV glad_glVertexAttrib3fNV +GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; +#define glVertexAttrib3fv glad_glVertexAttrib3fv +GLAD_API_CALL PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB; +#define glVertexAttrib3fvARB glad_glVertexAttrib3fvARB +GLAD_API_CALL PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV; +#define glVertexAttrib3fvNV glad_glVertexAttrib3fvNV +GLAD_API_CALL PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; +#define glVertexAttrib3s glad_glVertexAttrib3s +GLAD_API_CALL PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB; +#define glVertexAttrib3sARB glad_glVertexAttrib3sARB +GLAD_API_CALL PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV; +#define glVertexAttrib3sNV glad_glVertexAttrib3sNV +GLAD_API_CALL PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; +#define glVertexAttrib3sv glad_glVertexAttrib3sv +GLAD_API_CALL PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB; +#define glVertexAttrib3svARB glad_glVertexAttrib3svARB +GLAD_API_CALL PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV; +#define glVertexAttrib3svNV glad_glVertexAttrib3svNV +GLAD_API_CALL PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; +#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv +GLAD_API_CALL PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB; +#define glVertexAttrib4NbvARB glad_glVertexAttrib4NbvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; +#define glVertexAttrib4Niv glad_glVertexAttrib4Niv +GLAD_API_CALL PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB; +#define glVertexAttrib4NivARB glad_glVertexAttrib4NivARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; +#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv +GLAD_API_CALL PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB; +#define glVertexAttrib4NsvARB glad_glVertexAttrib4NsvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; +#define glVertexAttrib4Nub glad_glVertexAttrib4Nub +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB; +#define glVertexAttrib4NubARB glad_glVertexAttrib4NubARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; +#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB; +#define glVertexAttrib4NubvARB glad_glVertexAttrib4NubvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; +#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB; +#define glVertexAttrib4NuivARB glad_glVertexAttrib4NuivARB +GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; +#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv +GLAD_API_CALL PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB; +#define glVertexAttrib4NusvARB glad_glVertexAttrib4NusvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; +#define glVertexAttrib4bv glad_glVertexAttrib4bv +GLAD_API_CALL PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB; +#define glVertexAttrib4bvARB glad_glVertexAttrib4bvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; +#define glVertexAttrib4d glad_glVertexAttrib4d +GLAD_API_CALL PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB; +#define glVertexAttrib4dARB glad_glVertexAttrib4dARB +GLAD_API_CALL PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV; +#define glVertexAttrib4dNV glad_glVertexAttrib4dNV +GLAD_API_CALL PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; +#define glVertexAttrib4dv glad_glVertexAttrib4dv +GLAD_API_CALL PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB; +#define glVertexAttrib4dvARB glad_glVertexAttrib4dvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV; +#define glVertexAttrib4dvNV glad_glVertexAttrib4dvNV +GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; +#define glVertexAttrib4f glad_glVertexAttrib4f +GLAD_API_CALL PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB; +#define glVertexAttrib4fARB glad_glVertexAttrib4fARB +GLAD_API_CALL PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV; +#define glVertexAttrib4fNV glad_glVertexAttrib4fNV +GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; +#define glVertexAttrib4fv glad_glVertexAttrib4fv +GLAD_API_CALL PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB; +#define glVertexAttrib4fvARB glad_glVertexAttrib4fvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV; +#define glVertexAttrib4fvNV glad_glVertexAttrib4fvNV +GLAD_API_CALL PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; +#define glVertexAttrib4iv glad_glVertexAttrib4iv +GLAD_API_CALL PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB; +#define glVertexAttrib4ivARB glad_glVertexAttrib4ivARB +GLAD_API_CALL PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; +#define glVertexAttrib4s glad_glVertexAttrib4s +GLAD_API_CALL PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB; +#define glVertexAttrib4sARB glad_glVertexAttrib4sARB +GLAD_API_CALL PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV; +#define glVertexAttrib4sNV glad_glVertexAttrib4sNV +GLAD_API_CALL PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; +#define glVertexAttrib4sv glad_glVertexAttrib4sv +GLAD_API_CALL PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB; +#define glVertexAttrib4svARB glad_glVertexAttrib4svARB +GLAD_API_CALL PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV; +#define glVertexAttrib4svNV glad_glVertexAttrib4svNV +GLAD_API_CALL PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV; +#define glVertexAttrib4ubNV glad_glVertexAttrib4ubNV +GLAD_API_CALL PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; +#define glVertexAttrib4ubv glad_glVertexAttrib4ubv +GLAD_API_CALL PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB; +#define glVertexAttrib4ubvARB glad_glVertexAttrib4ubvARB +GLAD_API_CALL PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV; +#define glVertexAttrib4ubvNV glad_glVertexAttrib4ubvNV +GLAD_API_CALL PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; +#define glVertexAttrib4uiv glad_glVertexAttrib4uiv +GLAD_API_CALL PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB; +#define glVertexAttrib4uivARB glad_glVertexAttrib4uivARB +GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; +#define glVertexAttrib4usv glad_glVertexAttrib4usv +GLAD_API_CALL PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB; +#define glVertexAttrib4usvARB glad_glVertexAttrib4usvARB +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; +#define glVertexAttribDivisor glad_glVertexAttribDivisor +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORARBPROC glad_glVertexAttribDivisorARB; +#define glVertexAttribDivisorARB glad_glVertexAttribDivisorARB +GLAD_API_CALL PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; +#define glVertexAttribI1i glad_glVertexAttribI1i +GLAD_API_CALL PFNGLVERTEXATTRIBI1IEXTPROC glad_glVertexAttribI1iEXT; +#define glVertexAttribI1iEXT glad_glVertexAttribI1iEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; +#define glVertexAttribI1iv glad_glVertexAttribI1iv +GLAD_API_CALL PFNGLVERTEXATTRIBI1IVEXTPROC glad_glVertexAttribI1ivEXT; +#define glVertexAttribI1ivEXT glad_glVertexAttribI1ivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; +#define glVertexAttribI1ui glad_glVertexAttribI1ui +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIEXTPROC glad_glVertexAttribI1uiEXT; +#define glVertexAttribI1uiEXT glad_glVertexAttribI1uiEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; +#define glVertexAttribI1uiv glad_glVertexAttribI1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVEXTPROC glad_glVertexAttribI1uivEXT; +#define glVertexAttribI1uivEXT glad_glVertexAttribI1uivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; +#define glVertexAttribI2i glad_glVertexAttribI2i +GLAD_API_CALL PFNGLVERTEXATTRIBI2IEXTPROC glad_glVertexAttribI2iEXT; +#define glVertexAttribI2iEXT glad_glVertexAttribI2iEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; +#define glVertexAttribI2iv glad_glVertexAttribI2iv +GLAD_API_CALL PFNGLVERTEXATTRIBI2IVEXTPROC glad_glVertexAttribI2ivEXT; +#define glVertexAttribI2ivEXT glad_glVertexAttribI2ivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; +#define glVertexAttribI2ui glad_glVertexAttribI2ui +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIEXTPROC glad_glVertexAttribI2uiEXT; +#define glVertexAttribI2uiEXT glad_glVertexAttribI2uiEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; +#define glVertexAttribI2uiv glad_glVertexAttribI2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVEXTPROC glad_glVertexAttribI2uivEXT; +#define glVertexAttribI2uivEXT glad_glVertexAttribI2uivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; +#define glVertexAttribI3i glad_glVertexAttribI3i +GLAD_API_CALL PFNGLVERTEXATTRIBI3IEXTPROC glad_glVertexAttribI3iEXT; +#define glVertexAttribI3iEXT glad_glVertexAttribI3iEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; +#define glVertexAttribI3iv glad_glVertexAttribI3iv +GLAD_API_CALL PFNGLVERTEXATTRIBI3IVEXTPROC glad_glVertexAttribI3ivEXT; +#define glVertexAttribI3ivEXT glad_glVertexAttribI3ivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; +#define glVertexAttribI3ui glad_glVertexAttribI3ui +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIEXTPROC glad_glVertexAttribI3uiEXT; +#define glVertexAttribI3uiEXT glad_glVertexAttribI3uiEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; +#define glVertexAttribI3uiv glad_glVertexAttribI3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVEXTPROC glad_glVertexAttribI3uivEXT; +#define glVertexAttribI3uivEXT glad_glVertexAttribI3uivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; +#define glVertexAttribI4bv glad_glVertexAttribI4bv +GLAD_API_CALL PFNGLVERTEXATTRIBI4BVEXTPROC glad_glVertexAttribI4bvEXT; +#define glVertexAttribI4bvEXT glad_glVertexAttribI4bvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; +#define glVertexAttribI4i glad_glVertexAttribI4i +GLAD_API_CALL PFNGLVERTEXATTRIBI4IEXTPROC glad_glVertexAttribI4iEXT; +#define glVertexAttribI4iEXT glad_glVertexAttribI4iEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; +#define glVertexAttribI4iv glad_glVertexAttribI4iv +GLAD_API_CALL PFNGLVERTEXATTRIBI4IVEXTPROC glad_glVertexAttribI4ivEXT; +#define glVertexAttribI4ivEXT glad_glVertexAttribI4ivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; +#define glVertexAttribI4sv glad_glVertexAttribI4sv +GLAD_API_CALL PFNGLVERTEXATTRIBI4SVEXTPROC glad_glVertexAttribI4svEXT; +#define glVertexAttribI4svEXT glad_glVertexAttribI4svEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; +#define glVertexAttribI4ubv glad_glVertexAttribI4ubv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVEXTPROC glad_glVertexAttribI4ubvEXT; +#define glVertexAttribI4ubvEXT glad_glVertexAttribI4ubvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; +#define glVertexAttribI4ui glad_glVertexAttribI4ui +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIEXTPROC glad_glVertexAttribI4uiEXT; +#define glVertexAttribI4uiEXT glad_glVertexAttribI4uiEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; +#define glVertexAttribI4uiv glad_glVertexAttribI4uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVEXTPROC glad_glVertexAttribI4uivEXT; +#define glVertexAttribI4uivEXT glad_glVertexAttribI4uivEXT +GLAD_API_CALL PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; +#define glVertexAttribI4usv glad_glVertexAttribI4usv +GLAD_API_CALL PFNGLVERTEXATTRIBI4USVEXTPROC glad_glVertexAttribI4usvEXT; +#define glVertexAttribI4usvEXT glad_glVertexAttribI4usvEXT +GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; +#define glVertexAttribIPointer glad_glVertexAttribIPointer +GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTEREXTPROC glad_glVertexAttribIPointerEXT; +#define glVertexAttribIPointerEXT glad_glVertexAttribIPointerEXT +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; +#define glVertexAttribP1ui glad_glVertexAttribP1ui +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; +#define glVertexAttribP1uiv glad_glVertexAttribP1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; +#define glVertexAttribP2ui glad_glVertexAttribP2ui +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; +#define glVertexAttribP2uiv glad_glVertexAttribP2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; +#define glVertexAttribP3ui glad_glVertexAttribP3ui +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; +#define glVertexAttribP3uiv glad_glVertexAttribP3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; +#define glVertexAttribP4ui glad_glVertexAttribP4ui +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; +#define glVertexAttribP4uiv glad_glVertexAttribP4uiv +GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; +#define glVertexAttribPointer glad_glVertexAttribPointer +GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB; +#define glVertexAttribPointerARB glad_glVertexAttribPointerARB +GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV; +#define glVertexAttribPointerNV glad_glVertexAttribPointerNV +GLAD_API_CALL PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV; +#define glVertexAttribs1dvNV glad_glVertexAttribs1dvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV; +#define glVertexAttribs1fvNV glad_glVertexAttribs1fvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV; +#define glVertexAttribs1svNV glad_glVertexAttribs1svNV +GLAD_API_CALL PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV; +#define glVertexAttribs2dvNV glad_glVertexAttribs2dvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV; +#define glVertexAttribs2fvNV glad_glVertexAttribs2fvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV; +#define glVertexAttribs2svNV glad_glVertexAttribs2svNV +GLAD_API_CALL PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV; +#define glVertexAttribs3dvNV glad_glVertexAttribs3dvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV; +#define glVertexAttribs3fvNV glad_glVertexAttribs3fvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV; +#define glVertexAttribs3svNV glad_glVertexAttribs3svNV +GLAD_API_CALL PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV; +#define glVertexAttribs4dvNV glad_glVertexAttribs4dvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV; +#define glVertexAttribs4fvNV glad_glVertexAttribs4fvNV +GLAD_API_CALL PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV; +#define glVertexAttribs4svNV glad_glVertexAttribs4svNV +GLAD_API_CALL PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV; +#define glVertexAttribs4ubvNV glad_glVertexAttribs4ubvNV +GLAD_API_CALL PFNGLVERTEXP2UIPROC glad_glVertexP2ui; +#define glVertexP2ui glad_glVertexP2ui +GLAD_API_CALL PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv; +#define glVertexP2uiv glad_glVertexP2uiv +GLAD_API_CALL PFNGLVERTEXP3UIPROC glad_glVertexP3ui; +#define glVertexP3ui glad_glVertexP3ui +GLAD_API_CALL PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv; +#define glVertexP3uiv glad_glVertexP3uiv +GLAD_API_CALL PFNGLVERTEXP4UIPROC glad_glVertexP4ui; +#define glVertexP4ui glad_glVertexP4ui +GLAD_API_CALL PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv; +#define glVertexP4uiv glad_glVertexP4uiv +GLAD_API_CALL PFNGLVERTEXPOINTERPROC glad_glVertexPointer; +#define glVertexPointer glad_glVertexPointer +GLAD_API_CALL PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT; +#define glVertexPointerEXT glad_glVertexPointerEXT +GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport; +#define glViewport glad_glViewport +GLAD_API_CALL PFNGLWAITSYNCPROC glad_glWaitSync; +#define glWaitSync glad_glWaitSync +GLAD_API_CALL PFNGLWINDOWPOS2DPROC glad_glWindowPos2d; +#define glWindowPos2d glad_glWindowPos2d +GLAD_API_CALL PFNGLWINDOWPOS2DARBPROC glad_glWindowPos2dARB; +#define glWindowPos2dARB glad_glWindowPos2dARB +GLAD_API_CALL PFNGLWINDOWPOS2DMESAPROC glad_glWindowPos2dMESA; +#define glWindowPos2dMESA glad_glWindowPos2dMESA +GLAD_API_CALL PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv; +#define glWindowPos2dv glad_glWindowPos2dv +GLAD_API_CALL PFNGLWINDOWPOS2DVARBPROC glad_glWindowPos2dvARB; +#define glWindowPos2dvARB glad_glWindowPos2dvARB +GLAD_API_CALL PFNGLWINDOWPOS2DVMESAPROC glad_glWindowPos2dvMESA; +#define glWindowPos2dvMESA glad_glWindowPos2dvMESA +GLAD_API_CALL PFNGLWINDOWPOS2FPROC glad_glWindowPos2f; +#define glWindowPos2f glad_glWindowPos2f +GLAD_API_CALL PFNGLWINDOWPOS2FARBPROC glad_glWindowPos2fARB; +#define glWindowPos2fARB glad_glWindowPos2fARB +GLAD_API_CALL PFNGLWINDOWPOS2FMESAPROC glad_glWindowPos2fMESA; +#define glWindowPos2fMESA glad_glWindowPos2fMESA +GLAD_API_CALL PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv; +#define glWindowPos2fv glad_glWindowPos2fv +GLAD_API_CALL PFNGLWINDOWPOS2FVARBPROC glad_glWindowPos2fvARB; +#define glWindowPos2fvARB glad_glWindowPos2fvARB +GLAD_API_CALL PFNGLWINDOWPOS2FVMESAPROC glad_glWindowPos2fvMESA; +#define glWindowPos2fvMESA glad_glWindowPos2fvMESA +GLAD_API_CALL PFNGLWINDOWPOS2IPROC glad_glWindowPos2i; +#define glWindowPos2i glad_glWindowPos2i +GLAD_API_CALL PFNGLWINDOWPOS2IARBPROC glad_glWindowPos2iARB; +#define glWindowPos2iARB glad_glWindowPos2iARB +GLAD_API_CALL PFNGLWINDOWPOS2IMESAPROC glad_glWindowPos2iMESA; +#define glWindowPos2iMESA glad_glWindowPos2iMESA +GLAD_API_CALL PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv; +#define glWindowPos2iv glad_glWindowPos2iv +GLAD_API_CALL PFNGLWINDOWPOS2IVARBPROC glad_glWindowPos2ivARB; +#define glWindowPos2ivARB glad_glWindowPos2ivARB +GLAD_API_CALL PFNGLWINDOWPOS2IVMESAPROC glad_glWindowPos2ivMESA; +#define glWindowPos2ivMESA glad_glWindowPos2ivMESA +GLAD_API_CALL PFNGLWINDOWPOS2SPROC glad_glWindowPos2s; +#define glWindowPos2s glad_glWindowPos2s +GLAD_API_CALL PFNGLWINDOWPOS2SARBPROC glad_glWindowPos2sARB; +#define glWindowPos2sARB glad_glWindowPos2sARB +GLAD_API_CALL PFNGLWINDOWPOS2SMESAPROC glad_glWindowPos2sMESA; +#define glWindowPos2sMESA glad_glWindowPos2sMESA +GLAD_API_CALL PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv; +#define glWindowPos2sv glad_glWindowPos2sv +GLAD_API_CALL PFNGLWINDOWPOS2SVARBPROC glad_glWindowPos2svARB; +#define glWindowPos2svARB glad_glWindowPos2svARB +GLAD_API_CALL PFNGLWINDOWPOS2SVMESAPROC glad_glWindowPos2svMESA; +#define glWindowPos2svMESA glad_glWindowPos2svMESA +GLAD_API_CALL PFNGLWINDOWPOS3DPROC glad_glWindowPos3d; +#define glWindowPos3d glad_glWindowPos3d +GLAD_API_CALL PFNGLWINDOWPOS3DARBPROC glad_glWindowPos3dARB; +#define glWindowPos3dARB glad_glWindowPos3dARB +GLAD_API_CALL PFNGLWINDOWPOS3DMESAPROC glad_glWindowPos3dMESA; +#define glWindowPos3dMESA glad_glWindowPos3dMESA +GLAD_API_CALL PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv; +#define glWindowPos3dv glad_glWindowPos3dv +GLAD_API_CALL PFNGLWINDOWPOS3DVARBPROC glad_glWindowPos3dvARB; +#define glWindowPos3dvARB glad_glWindowPos3dvARB +GLAD_API_CALL PFNGLWINDOWPOS3DVMESAPROC glad_glWindowPos3dvMESA; +#define glWindowPos3dvMESA glad_glWindowPos3dvMESA +GLAD_API_CALL PFNGLWINDOWPOS3FPROC glad_glWindowPos3f; +#define glWindowPos3f glad_glWindowPos3f +GLAD_API_CALL PFNGLWINDOWPOS3FARBPROC glad_glWindowPos3fARB; +#define glWindowPos3fARB glad_glWindowPos3fARB +GLAD_API_CALL PFNGLWINDOWPOS3FMESAPROC glad_glWindowPos3fMESA; +#define glWindowPos3fMESA glad_glWindowPos3fMESA +GLAD_API_CALL PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv; +#define glWindowPos3fv glad_glWindowPos3fv +GLAD_API_CALL PFNGLWINDOWPOS3FVARBPROC glad_glWindowPos3fvARB; +#define glWindowPos3fvARB glad_glWindowPos3fvARB +GLAD_API_CALL PFNGLWINDOWPOS3FVMESAPROC glad_glWindowPos3fvMESA; +#define glWindowPos3fvMESA glad_glWindowPos3fvMESA +GLAD_API_CALL PFNGLWINDOWPOS3IPROC glad_glWindowPos3i; +#define glWindowPos3i glad_glWindowPos3i +GLAD_API_CALL PFNGLWINDOWPOS3IARBPROC glad_glWindowPos3iARB; +#define glWindowPos3iARB glad_glWindowPos3iARB +GLAD_API_CALL PFNGLWINDOWPOS3IMESAPROC glad_glWindowPos3iMESA; +#define glWindowPos3iMESA glad_glWindowPos3iMESA +GLAD_API_CALL PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv; +#define glWindowPos3iv glad_glWindowPos3iv +GLAD_API_CALL PFNGLWINDOWPOS3IVARBPROC glad_glWindowPos3ivARB; +#define glWindowPos3ivARB glad_glWindowPos3ivARB +GLAD_API_CALL PFNGLWINDOWPOS3IVMESAPROC glad_glWindowPos3ivMESA; +#define glWindowPos3ivMESA glad_glWindowPos3ivMESA +GLAD_API_CALL PFNGLWINDOWPOS3SPROC glad_glWindowPos3s; +#define glWindowPos3s glad_glWindowPos3s +GLAD_API_CALL PFNGLWINDOWPOS3SARBPROC glad_glWindowPos3sARB; +#define glWindowPos3sARB glad_glWindowPos3sARB +GLAD_API_CALL PFNGLWINDOWPOS3SMESAPROC glad_glWindowPos3sMESA; +#define glWindowPos3sMESA glad_glWindowPos3sMESA +GLAD_API_CALL PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv; +#define glWindowPos3sv glad_glWindowPos3sv +GLAD_API_CALL PFNGLWINDOWPOS3SVARBPROC glad_glWindowPos3svARB; +#define glWindowPos3svARB glad_glWindowPos3svARB +GLAD_API_CALL PFNGLWINDOWPOS3SVMESAPROC glad_glWindowPos3svMESA; +#define glWindowPos3svMESA glad_glWindowPos3svMESA +GLAD_API_CALL PFNGLWINDOWPOS4DMESAPROC glad_glWindowPos4dMESA; +#define glWindowPos4dMESA glad_glWindowPos4dMESA +GLAD_API_CALL PFNGLWINDOWPOS4DVMESAPROC glad_glWindowPos4dvMESA; +#define glWindowPos4dvMESA glad_glWindowPos4dvMESA +GLAD_API_CALL PFNGLWINDOWPOS4FMESAPROC glad_glWindowPos4fMESA; +#define glWindowPos4fMESA glad_glWindowPos4fMESA +GLAD_API_CALL PFNGLWINDOWPOS4FVMESAPROC glad_glWindowPos4fvMESA; +#define glWindowPos4fvMESA glad_glWindowPos4fvMESA +GLAD_API_CALL PFNGLWINDOWPOS4IMESAPROC glad_glWindowPos4iMESA; +#define glWindowPos4iMESA glad_glWindowPos4iMESA +GLAD_API_CALL PFNGLWINDOWPOS4IVMESAPROC glad_glWindowPos4ivMESA; +#define glWindowPos4ivMESA glad_glWindowPos4ivMESA +GLAD_API_CALL PFNGLWINDOWPOS4SMESAPROC glad_glWindowPos4sMESA; +#define glWindowPos4sMESA glad_glWindowPos4sMESA +GLAD_API_CALL PFNGLWINDOWPOS4SVMESAPROC glad_glWindowPos4svMESA; +#define glWindowPos4svMESA glad_glWindowPos4svMESA + + + + + +GLAD_API_CALL int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadGL( GLADloadfunc load); + + + +#ifdef __cplusplus +} +#endif + +#endif /*LV_USE_OPENGLES && !LV_USE_EGL*/ +#endif diff --git a/inc/lvgl/src/drivers/opengles/glad/include/glad/gles2.h b/inc/lvgl/src/drivers/opengles/glad/include/glad/gles2.h new file mode 100644 index 0000000..f5016f5 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/glad/include/glad/gles2.h @@ -0,0 +1,1110 @@ +/** + * Loader generated by glad 2.0.8 on Fri Nov 28 10:05:18 2025 + * + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + * + * Generator: C/C++ + * Specification: gl + * Extensions: 14 + * + * APIs: + * - gles2=2.0 + * + * Options: + * - ALIAS = True + * - DEBUG = False + * - HEADER_ONLY = False + * - LOADER = False + * - MX = False + * - ON_DEMAND = False + * + * Commandline: + * --api='gles2=2.0' --extensions='GL_APPLE_texture_max_level,GL_ARM_rgba8,GL_EXT_color_buffer_float,GL_EXT_color_buffer_half_float,GL_EXT_texture_format_BGRA8888,GL_EXT_texture_storage,GL_EXT_unpack_subimage,GL_OES_depth24,GL_OES_mapbuffer,GL_OES_rgb8_rgba8,GL_OES_texture_float,GL_OES_texture_half_float,GL_OES_texture_storage_multisample_2d_array,GL_OES_vertex_array_object' c --alias + * + * Online: + * http://glad.sh/#api=gles2%3D2.0&extensions=GL_APPLE_texture_max_level%2CGL_ARM_rgba8%2CGL_EXT_color_buffer_float%2CGL_EXT_color_buffer_half_float%2CGL_EXT_texture_format_BGRA8888%2CGL_EXT_texture_storage%2CGL_EXT_unpack_subimage%2CGL_OES_depth24%2CGL_OES_mapbuffer%2CGL_OES_rgb8_rgba8%2CGL_OES_texture_float%2CGL_OES_texture_half_float%2CGL_OES_texture_storage_multisample_2d_array%2CGL_OES_vertex_array_object&generator=c&options=ALIAS + * + */ + +#ifndef GLAD_GLES2_H_ +#define GLAD_GLES2_H_ + +#include "../../../../../lv_conf_internal.h" +#if LV_USE_EGL + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-id-macro" +#endif +#ifdef __gl2_h_ + #error OpenGL ES 2 header already included (API: gles2), remove previous include! +#endif +#define __gl2_h_ 1 +#ifdef __gles2_gl2_h_ + #error OpenGL ES 2 header already included (API: gles2), remove previous include! +#endif +#define __gles2_gl2_h_ 1 +#ifdef __gl3_h_ + #error OpenGL ES 3 header already included (API: gles2), remove previous include! +#endif +#define __gl3_h_ 1 +#ifdef __gles2_gl3_h_ + #error OpenGL ES 3 header already included (API: gles2), remove previous include! +#endif +#define __gles2_gl3_h_ 1 +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#define GLAD_GLES2 +#define GLAD_OPTION_GLES2_ALIAS + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_UWP + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif + + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif + + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif +#endif + +#ifdef __GNUC__ + #define GLAD_GNUC_EXTENSION __extension__ +#else + #define GLAD_GNUC_EXTENSION +#endif + +#define GLAD_UNUSED(x) (void)(x) + +#ifndef GLAD_API_CALL + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif +#endif + +#ifdef APIENTRY + #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 + #define GLAD_API_PTR __stdcall +#else + #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.8" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALPHA 0x1906 +#define GL_ALPHA16F_EXT 0x881C +#define GL_ALPHA32F_EXT 0x8816 +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA_BITS 0x0D55 +#define GL_ALWAYS 0x0207 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_BACK 0x0405 +#define GL_BGRA8_EXT 0x93A1 +#define GL_BGRA_EXT 0x80E1 +#define GL_BLEND 0x0BE2 +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLUE_BITS 0x0D54 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_BYTE 0x1400 +#define GL_CCW 0x0901 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_CW 0x0900 +#define GL_DECR 0x1E03 +#define GL_DECR_WRAP 0x8508 +#define GL_DELETE_STATUS 0x8B80 +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_DEPTH_BITS 0x0D56 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DITHER 0x0BD0 +#define GL_DONT_CARE 0x1100 +#define GL_DST_ALPHA 0x0304 +#define GL_DST_COLOR 0x0306 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_EQUAL 0x0202 +#define GL_EXTENSIONS 0x1F03 +#define GL_FALSE 0 +#define GL_FASTEST 0x1101 +#define GL_FIXED 0x140C +#define GL_FLOAT 0x1406 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRONT 0x0404 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_FRONT_FACE 0x0B46 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_FUNC_SUBTRACT 0x800A +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_GEQUAL 0x0206 +#define GL_GREATER 0x0204 +#define GL_GREEN_BITS 0x0D53 +#define GL_HALF_FLOAT_OES 0x8D61 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_HIGH_INT 0x8DF5 +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_INCR 0x1E02 +#define GL_INCR_WRAP 0x8507 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_INT 0x1404 +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_INVALID_OPERATION 0x0502 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVERT 0x150A +#define GL_KEEP 0x1E00 +#define GL_LEQUAL 0x0203 +#define GL_LESS 0x0201 +#define GL_LINEAR 0x2601 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINK_STATUS 0x8B82 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_LOW_INT 0x8DF3 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_NEAREST 0x2600 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEVER 0x0200 +#define GL_NICEST 0x1102 +#define GL_NONE 0 +#define GL_NOTEQUAL 0x0205 +#define GL_NO_ERROR 0 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_ONE 1 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_POINTS 0x0000 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_R16F_EXT 0x822D +#define GL_R32F_EXT 0x822E +#define GL_R8_EXT 0x8229 +#define GL_RED_BITS 0x0D52 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERER 0x1F01 +#define GL_REPEAT 0x2901 +#define GL_REPLACE 0x1E01 +#define GL_RG16F_EXT 0x822F +#define GL_RG32F_EXT 0x8230 +#define GL_RG8_EXT 0x822B +#define GL_RGB 0x1907 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB16F_EXT 0x881B +#define GL_RGB32F_EXT 0x8815 +#define GL_RGB565 0x8D62 +#define GL_RGB5_A1 0x8057 +#define GL_RGB8_OES 0x8051 +#define GL_RGBA 0x1908 +#define GL_RGBA16F_EXT 0x881A +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGBA4 0x8056 +#define GL_RGBA8_OES 0x8058 +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_TYPE 0x8B4F +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_SHORT 0x1402 +#define GL_SRC_ALPHA 0x0302 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_SRC_COLOR 0x0300 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_STENCIL_BITS 0x0D57 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_STREAM_DRAW 0x88E0 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_TEXTURE 0x1702 +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRUE 1 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 +#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 +#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_UNSIGNED_INT 0x1405 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_VENDOR 0x1F00 +#define GL_VERSION 0x1F02 +#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_VIEWPORT 0x0BA2 +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_ZERO 0 + + +#include +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef int GLint; +typedef unsigned int GLuint; +typedef khronos_int32_t GLclampx; +typedef int GLsizei; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void *GLeglClientBufferEXT; +typedef void *GLeglImageOES; +typedef char GLchar; +typedef char GLcharARB; +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef khronos_uint16_t GLhalf; +typedef khronos_uint16_t GLhalfARB; +typedef khronos_int32_t GLfixed; +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptr; +#else +typedef khronos_intptr_t GLintptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_intptr_t GLintptrARB; +#else +typedef khronos_intptr_t GLintptrARB; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptr; +#else +typedef khronos_ssize_t GLsizeiptr; +#endif +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) +typedef khronos_ssize_t GLsizeiptrARB; +#else +typedef khronos_ssize_t GLsizeiptrARB; +#endif +typedef khronos_int64_t GLint64; +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64; +typedef khronos_uint64_t GLuint64EXT; +typedef struct __GLsync *GLsync; +struct _cl_context; +struct _cl_event; +typedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef unsigned short GLhalfNV; +typedef GLintptr GLvdpauSurfaceNV; +typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void); + + +#define GL_ES_VERSION_2_0 1 +GLAD_API_CALL int GLAD_GL_ES_VERSION_2_0; +#define GL_APPLE_texture_max_level 1 +GLAD_API_CALL int GLAD_GL_APPLE_texture_max_level; +#define GL_ARM_rgba8 1 +GLAD_API_CALL int GLAD_GL_ARM_rgba8; +#define GL_EXT_color_buffer_float 1 +GLAD_API_CALL int GLAD_GL_EXT_color_buffer_float; +#define GL_EXT_color_buffer_half_float 1 +GLAD_API_CALL int GLAD_GL_EXT_color_buffer_half_float; +#define GL_EXT_texture_format_BGRA8888 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_format_BGRA8888; +#define GL_EXT_texture_storage 1 +GLAD_API_CALL int GLAD_GL_EXT_texture_storage; +#define GL_EXT_unpack_subimage 1 +GLAD_API_CALL int GLAD_GL_EXT_unpack_subimage; +#define GL_OES_depth24 1 +GLAD_API_CALL int GLAD_GL_OES_depth24; +#define GL_OES_mapbuffer 1 +GLAD_API_CALL int GLAD_GL_OES_mapbuffer; +#define GL_OES_rgb8_rgba8 1 +GLAD_API_CALL int GLAD_GL_OES_rgb8_rgba8; +#define GL_OES_texture_float 1 +GLAD_API_CALL int GLAD_GL_OES_texture_float; +#define GL_OES_texture_half_float 1 +GLAD_API_CALL int GLAD_GL_OES_texture_half_float; +#define GL_OES_texture_storage_multisample_2d_array 1 +GLAD_API_CALL int GLAD_GL_OES_texture_storage_multisample_2d_array; +#define GL_OES_vertex_array_object 1 +GLAD_API_CALL int GLAD_GL_OES_vertex_array_object; + + +typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture); +typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYOESPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d); +typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); +typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSOESPROC)(GLsizei n, const GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func); +typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); +typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSOESPROC)(GLsizei n, GLuint * arrays); +typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); +typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVOESPROC)(GLenum target, GLenum pname, void ** params); +typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision); +typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); +typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); +typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); +typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); +typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader); +typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYOESPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width); +typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFEROESPROC)(GLenum target, GLenum access); +typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); +typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLRELEASESHADERCOMPILERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint * shaders, GLenum binaryFormat, const void * binary, GLsizei length); +typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DEXTPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE1DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DEXTPROC)(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFEROESPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); + +GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture; +#define glActiveTexture glad_glActiveTexture +GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader; +#define glAttachShader glad_glAttachShader +GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; +#define glBindAttribLocation glad_glBindAttribLocation +GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer; +#define glBindBuffer glad_glBindBuffer +GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; +#define glBindFramebuffer glad_glBindFramebuffer +GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; +#define glBindRenderbuffer glad_glBindRenderbuffer +GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture; +#define glBindTexture glad_glBindTexture +GLAD_API_CALL PFNGLBINDVERTEXARRAYOESPROC glad_glBindVertexArrayOES; +#define glBindVertexArrayOES glad_glBindVertexArrayOES +GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor; +#define glBlendColor glad_glBlendColor +GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation; +#define glBlendEquation glad_glBlendEquation +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; +#define glBlendEquationSeparate glad_glBlendEquationSeparate +GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc; +#define glBlendFunc glad_glBlendFunc +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; +#define glBlendFuncSeparate glad_glBlendFuncSeparate +GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData; +#define glBufferData glad_glBufferData +GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; +#define glBufferSubData glad_glBufferSubData +GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; +#define glCheckFramebufferStatus glad_glCheckFramebufferStatus +GLAD_API_CALL PFNGLCLEARPROC glad_glClear; +#define glClear glad_glClear +GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor; +#define glClearColor glad_glClearColor +GLAD_API_CALL PFNGLCLEARDEPTHFPROC glad_glClearDepthf; +#define glClearDepthf glad_glClearDepthf +GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil; +#define glClearStencil glad_glClearStencil +GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask; +#define glColorMask glad_glColorMask +GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader; +#define glCompileShader glad_glCompileShader +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; +#define glCompressedTexImage2D glad_glCompressedTexImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; +#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D +GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; +#define glCopyTexImage2D glad_glCopyTexImage2D +GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; +#define glCopyTexSubImage2D glad_glCopyTexSubImage2D +GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram; +#define glCreateProgram glad_glCreateProgram +GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader; +#define glCreateShader glad_glCreateShader +GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace; +#define glCullFace glad_glCullFace +GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; +#define glDeleteBuffers glad_glDeleteBuffers +GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; +#define glDeleteFramebuffers glad_glDeleteFramebuffers +GLAD_API_CALL PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; +#define glDeleteProgram glad_glDeleteProgram +GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; +#define glDeleteRenderbuffers glad_glDeleteRenderbuffers +GLAD_API_CALL PFNGLDELETESHADERPROC glad_glDeleteShader; +#define glDeleteShader glad_glDeleteShader +GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures; +#define glDeleteTextures glad_glDeleteTextures +GLAD_API_CALL PFNGLDELETEVERTEXARRAYSOESPROC glad_glDeleteVertexArraysOES; +#define glDeleteVertexArraysOES glad_glDeleteVertexArraysOES +GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc; +#define glDepthFunc glad_glDepthFunc +GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask; +#define glDepthMask glad_glDepthMask +GLAD_API_CALL PFNGLDEPTHRANGEFPROC glad_glDepthRangef; +#define glDepthRangef glad_glDepthRangef +GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader; +#define glDetachShader glad_glDetachShader +GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable; +#define glDisable glad_glDisable +GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; +#define glDisableVertexAttribArray glad_glDisableVertexAttribArray +GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays; +#define glDrawArrays glad_glDrawArrays +GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements; +#define glDrawElements glad_glDrawElements +GLAD_API_CALL PFNGLENABLEPROC glad_glEnable; +#define glEnable glad_glEnable +GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; +#define glEnableVertexAttribArray glad_glEnableVertexAttribArray +GLAD_API_CALL PFNGLFINISHPROC glad_glFinish; +#define glFinish glad_glFinish +GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush; +#define glFlush glad_glFlush +GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; +#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer +GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; +#define glFramebufferTexture2D glad_glFramebufferTexture2D +GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace; +#define glFrontFace glad_glFrontFace +GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers; +#define glGenBuffers glad_glGenBuffers +GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; +#define glGenFramebuffers glad_glGenFramebuffers +GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; +#define glGenRenderbuffers glad_glGenRenderbuffers +GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures; +#define glGenTextures glad_glGenTextures +GLAD_API_CALL PFNGLGENVERTEXARRAYSOESPROC glad_glGenVertexArraysOES; +#define glGenVertexArraysOES glad_glGenVertexArraysOES +GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; +#define glGenerateMipmap glad_glGenerateMipmap +GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; +#define glGetActiveAttrib glad_glGetActiveAttrib +GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; +#define glGetActiveUniform glad_glGetActiveUniform +GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; +#define glGetAttachedShaders glad_glGetAttachedShaders +GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; +#define glGetAttribLocation glad_glGetAttribLocation +GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv; +#define glGetBooleanv glad_glGetBooleanv +GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; +#define glGetBufferParameteriv glad_glGetBufferParameteriv +GLAD_API_CALL PFNGLGETBUFFERPOINTERVOESPROC glad_glGetBufferPointervOES; +#define glGetBufferPointervOES glad_glGetBufferPointervOES +GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError; +#define glGetError glad_glGetError +GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv; +#define glGetFloatv glad_glGetFloatv +GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; +#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv +GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv; +#define glGetIntegerv glad_glGetIntegerv +GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; +#define glGetProgramInfoLog glad_glGetProgramInfoLog +GLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; +#define glGetProgramiv glad_glGetProgramiv +GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; +#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv +GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; +#define glGetShaderInfoLog glad_glGetShaderInfoLog +GLAD_API_CALL PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat; +#define glGetShaderPrecisionFormat glad_glGetShaderPrecisionFormat +GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; +#define glGetShaderSource glad_glGetShaderSource +GLAD_API_CALL PFNGLGETSHADERIVPROC glad_glGetShaderiv; +#define glGetShaderiv glad_glGetShaderiv +GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString; +#define glGetString glad_glGetString +GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; +#define glGetTexParameterfv glad_glGetTexParameterfv +GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; +#define glGetTexParameteriv glad_glGetTexParameteriv +GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; +#define glGetUniformLocation glad_glGetUniformLocation +GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; +#define glGetUniformfv glad_glGetUniformfv +GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; +#define glGetUniformiv glad_glGetUniformiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; +#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv +GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; +#define glGetVertexAttribfv glad_glGetVertexAttribfv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; +#define glGetVertexAttribiv glad_glGetVertexAttribiv +GLAD_API_CALL PFNGLHINTPROC glad_glHint; +#define glHint glad_glHint +GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer; +#define glIsBuffer glad_glIsBuffer +GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled; +#define glIsEnabled glad_glIsEnabled +GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; +#define glIsFramebuffer glad_glIsFramebuffer +GLAD_API_CALL PFNGLISPROGRAMPROC glad_glIsProgram; +#define glIsProgram glad_glIsProgram +GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; +#define glIsRenderbuffer glad_glIsRenderbuffer +GLAD_API_CALL PFNGLISSHADERPROC glad_glIsShader; +#define glIsShader glad_glIsShader +GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture; +#define glIsTexture glad_glIsTexture +GLAD_API_CALL PFNGLISVERTEXARRAYOESPROC glad_glIsVertexArrayOES; +#define glIsVertexArrayOES glad_glIsVertexArrayOES +GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth; +#define glLineWidth glad_glLineWidth +GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram; +#define glLinkProgram glad_glLinkProgram +GLAD_API_CALL PFNGLMAPBUFFEROESPROC glad_glMapBufferOES; +#define glMapBufferOES glad_glMapBufferOES +GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei; +#define glPixelStorei glad_glPixelStorei +GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; +#define glPolygonOffset glad_glPolygonOffset +GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels; +#define glReadPixels glad_glReadPixels +GLAD_API_CALL PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler; +#define glReleaseShaderCompiler glad_glReleaseShaderCompiler +GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; +#define glRenderbufferStorage glad_glRenderbufferStorage +GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; +#define glSampleCoverage glad_glSampleCoverage +GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor; +#define glScissor glad_glScissor +GLAD_API_CALL PFNGLSHADERBINARYPROC glad_glShaderBinary; +#define glShaderBinary glad_glShaderBinary +GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource; +#define glShaderSource glad_glShaderSource +GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc; +#define glStencilFunc glad_glStencilFunc +GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; +#define glStencilFuncSeparate glad_glStencilFuncSeparate +GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask; +#define glStencilMask glad_glStencilMask +GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; +#define glStencilMaskSeparate glad_glStencilMaskSeparate +GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp; +#define glStencilOp glad_glStencilOp +GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; +#define glStencilOpSeparate glad_glStencilOpSeparate +GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D; +#define glTexImage2D glad_glTexImage2D +GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf; +#define glTexParameterf glad_glTexParameterf +GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; +#define glTexParameterfv glad_glTexParameterfv +GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri; +#define glTexParameteri glad_glTexParameteri +GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; +#define glTexParameteriv glad_glTexParameteriv +GLAD_API_CALL PFNGLTEXSTORAGE1DEXTPROC glad_glTexStorage1DEXT; +#define glTexStorage1DEXT glad_glTexStorage1DEXT +GLAD_API_CALL PFNGLTEXSTORAGE2DEXTPROC glad_glTexStorage2DEXT; +#define glTexStorage2DEXT glad_glTexStorage2DEXT +GLAD_API_CALL PFNGLTEXSTORAGE3DEXTPROC glad_glTexStorage3DEXT; +#define glTexStorage3DEXT glad_glTexStorage3DEXT +GLAD_API_CALL PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC glad_glTexStorage3DMultisampleOES; +#define glTexStorage3DMultisampleOES glad_glTexStorage3DMultisampleOES +GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; +#define glTexSubImage2D glad_glTexSubImage2D +GLAD_API_CALL PFNGLTEXTURESTORAGE1DEXTPROC glad_glTextureStorage1DEXT; +#define glTextureStorage1DEXT glad_glTextureStorage1DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE2DEXTPROC glad_glTextureStorage2DEXT; +#define glTextureStorage2DEXT glad_glTextureStorage2DEXT +GLAD_API_CALL PFNGLTEXTURESTORAGE3DEXTPROC glad_glTextureStorage3DEXT; +#define glTextureStorage3DEXT glad_glTextureStorage3DEXT +GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f; +#define glUniform1f glad_glUniform1f +GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv; +#define glUniform1fv glad_glUniform1fv +GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i; +#define glUniform1i glad_glUniform1i +GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv; +#define glUniform1iv glad_glUniform1iv +GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f; +#define glUniform2f glad_glUniform2f +GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv; +#define glUniform2fv glad_glUniform2fv +GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i; +#define glUniform2i glad_glUniform2i +GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv; +#define glUniform2iv glad_glUniform2iv +GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f; +#define glUniform3f glad_glUniform3f +GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv; +#define glUniform3fv glad_glUniform3fv +GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i; +#define glUniform3i glad_glUniform3i +GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv; +#define glUniform3iv glad_glUniform3iv +GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f; +#define glUniform4f glad_glUniform4f +GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv; +#define glUniform4fv glad_glUniform4fv +GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i; +#define glUniform4i glad_glUniform4i +GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv; +#define glUniform4iv glad_glUniform4iv +GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; +#define glUniformMatrix2fv glad_glUniformMatrix2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; +#define glUniformMatrix3fv glad_glUniformMatrix3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; +#define glUniformMatrix4fv glad_glUniformMatrix4fv +GLAD_API_CALL PFNGLUNMAPBUFFEROESPROC glad_glUnmapBufferOES; +#define glUnmapBufferOES glad_glUnmapBufferOES +GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram; +#define glUseProgram glad_glUseProgram +GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; +#define glValidateProgram glad_glValidateProgram +GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; +#define glVertexAttrib1f glad_glVertexAttrib1f +GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; +#define glVertexAttrib1fv glad_glVertexAttrib1fv +GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; +#define glVertexAttrib2f glad_glVertexAttrib2f +GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; +#define glVertexAttrib2fv glad_glVertexAttrib2fv +GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; +#define glVertexAttrib3f glad_glVertexAttrib3f +GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; +#define glVertexAttrib3fv glad_glVertexAttrib3fv +GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; +#define glVertexAttrib4f glad_glVertexAttrib4f +GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; +#define glVertexAttrib4fv glad_glVertexAttrib4fv +GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; +#define glVertexAttribPointer glad_glVertexAttribPointer +GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport; +#define glViewport glad_glViewport + + + + + +GLAD_API_CALL int gladLoadGLES2UserPtr( GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadGLES2( GLADloadfunc load); + + + +#ifdef __cplusplus +} +#endif + +#endif /*LV_USE_EGL*/ +#endif diff --git a/inc/lvgl/src/drivers/opengles/glad/src/egl.c b/inc/lvgl/src/drivers/opengles/glad/src/egl.c new file mode 100644 index 0000000..64e4bc1 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/glad/src/egl.c @@ -0,0 +1,349 @@ +/** + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + */ + +#include "../../lv_opengles_private.h" +#if LV_USE_EGL +#include +#include +#include +#include "../include/glad/egl.h" + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int GLAD_EGL_VERSION_1_0 = 0; +int GLAD_EGL_VERSION_1_1 = 0; +int GLAD_EGL_VERSION_1_2 = 0; +int GLAD_EGL_VERSION_1_3 = 0; +int GLAD_EGL_VERSION_1_4 = 0; +int GLAD_EGL_VERSION_1_5 = 0; +int GLAD_EGL_EXT_image_dma_buf_import = 0; +int GLAD_EGL_EXT_image_dma_buf_import_modifiers = 0; +int GLAD_EGL_EXT_platform_base = 0; +int GLAD_EGL_EXT_platform_wayland = 0; +int GLAD_EGL_KHR_cl_event2 = 0; +int GLAD_EGL_KHR_fence_sync = 0; +int GLAD_EGL_KHR_image = 0; +int GLAD_EGL_KHR_image_base = 0; +int GLAD_EGL_KHR_platform_gbm = 0; +int GLAD_EGL_KHR_reusable_sync = 0; + + + +PFNEGLBINDAPIPROC glad_eglBindAPI = NULL; +PFNEGLBINDTEXIMAGEPROC glad_eglBindTexImage = NULL; +PFNEGLCHOOSECONFIGPROC glad_eglChooseConfig = NULL; +PFNEGLCLIENTWAITSYNCPROC glad_eglClientWaitSync = NULL; +PFNEGLCLIENTWAITSYNCKHRPROC glad_eglClientWaitSyncKHR = NULL; +PFNEGLCOPYBUFFERSPROC glad_eglCopyBuffers = NULL; +PFNEGLCREATECONTEXTPROC glad_eglCreateContext = NULL; +PFNEGLCREATEIMAGEPROC glad_eglCreateImage = NULL; +PFNEGLCREATEIMAGEKHRPROC glad_eglCreateImageKHR = NULL; +PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC glad_eglCreatePbufferFromClientBuffer = NULL; +PFNEGLCREATEPBUFFERSURFACEPROC glad_eglCreatePbufferSurface = NULL; +PFNEGLCREATEPIXMAPSURFACEPROC glad_eglCreatePixmapSurface = NULL; +PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC glad_eglCreatePlatformPixmapSurface = NULL; +PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC glad_eglCreatePlatformPixmapSurfaceEXT = NULL; +PFNEGLCREATEPLATFORMWINDOWSURFACEPROC glad_eglCreatePlatformWindowSurface = NULL; +PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC glad_eglCreatePlatformWindowSurfaceEXT = NULL; +PFNEGLCREATESYNCPROC glad_eglCreateSync = NULL; +PFNEGLCREATESYNC64KHRPROC glad_eglCreateSync64KHR = NULL; +PFNEGLCREATESYNCKHRPROC glad_eglCreateSyncKHR = NULL; +PFNEGLCREATEWINDOWSURFACEPROC glad_eglCreateWindowSurface = NULL; +PFNEGLDESTROYCONTEXTPROC glad_eglDestroyContext = NULL; +PFNEGLDESTROYIMAGEPROC glad_eglDestroyImage = NULL; +PFNEGLDESTROYIMAGEKHRPROC glad_eglDestroyImageKHR = NULL; +PFNEGLDESTROYSURFACEPROC glad_eglDestroySurface = NULL; +PFNEGLDESTROYSYNCPROC glad_eglDestroySync = NULL; +PFNEGLDESTROYSYNCKHRPROC glad_eglDestroySyncKHR = NULL; +PFNEGLGETCONFIGATTRIBPROC glad_eglGetConfigAttrib = NULL; +PFNEGLGETCONFIGSPROC glad_eglGetConfigs = NULL; +PFNEGLGETCURRENTCONTEXTPROC glad_eglGetCurrentContext = NULL; +PFNEGLGETCURRENTDISPLAYPROC glad_eglGetCurrentDisplay = NULL; +PFNEGLGETCURRENTSURFACEPROC glad_eglGetCurrentSurface = NULL; +PFNEGLGETDISPLAYPROC glad_eglGetDisplay = NULL; +PFNEGLGETERRORPROC glad_eglGetError = NULL; +PFNEGLGETPLATFORMDISPLAYPROC glad_eglGetPlatformDisplay = NULL; +PFNEGLGETPLATFORMDISPLAYEXTPROC glad_eglGetPlatformDisplayEXT = NULL; +PFNEGLGETPROCADDRESSPROC glad_eglGetProcAddress = NULL; +PFNEGLGETSYNCATTRIBPROC glad_eglGetSyncAttrib = NULL; +PFNEGLGETSYNCATTRIBKHRPROC glad_eglGetSyncAttribKHR = NULL; +PFNEGLINITIALIZEPROC glad_eglInitialize = NULL; +PFNEGLMAKECURRENTPROC glad_eglMakeCurrent = NULL; +PFNEGLQUERYAPIPROC glad_eglQueryAPI = NULL; +PFNEGLQUERYCONTEXTPROC glad_eglQueryContext = NULL; +PFNEGLQUERYDMABUFFORMATSEXTPROC glad_eglQueryDmaBufFormatsEXT = NULL; +PFNEGLQUERYDMABUFMODIFIERSEXTPROC glad_eglQueryDmaBufModifiersEXT = NULL; +PFNEGLQUERYSTRINGPROC glad_eglQueryString = NULL; +PFNEGLQUERYSURFACEPROC glad_eglQuerySurface = NULL; +PFNEGLRELEASETEXIMAGEPROC glad_eglReleaseTexImage = NULL; +PFNEGLRELEASETHREADPROC glad_eglReleaseThread = NULL; +PFNEGLSIGNALSYNCKHRPROC glad_eglSignalSyncKHR = NULL; +PFNEGLSURFACEATTRIBPROC glad_eglSurfaceAttrib = NULL; +PFNEGLSWAPBUFFERSPROC glad_eglSwapBuffers = NULL; +PFNEGLSWAPINTERVALPROC glad_eglSwapInterval = NULL; +PFNEGLTERMINATEPROC glad_eglTerminate = NULL; +PFNEGLWAITCLIENTPROC glad_eglWaitClient = NULL; +PFNEGLWAITGLPROC glad_eglWaitGL = NULL; +PFNEGLWAITNATIVEPROC glad_eglWaitNative = NULL; +PFNEGLWAITSYNCPROC glad_eglWaitSync = NULL; + + +static void glad_egl_load_EGL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_0) return; + glad_eglChooseConfig = (PFNEGLCHOOSECONFIGPROC) load(userptr, "eglChooseConfig"); + glad_eglCopyBuffers = (PFNEGLCOPYBUFFERSPROC) load(userptr, "eglCopyBuffers"); + glad_eglCreateContext = (PFNEGLCREATECONTEXTPROC) load(userptr, "eglCreateContext"); + glad_eglCreatePbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC) load(userptr, "eglCreatePbufferSurface"); + glad_eglCreatePixmapSurface = (PFNEGLCREATEPIXMAPSURFACEPROC) load(userptr, "eglCreatePixmapSurface"); + glad_eglCreateWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC) load(userptr, "eglCreateWindowSurface"); + glad_eglDestroyContext = (PFNEGLDESTROYCONTEXTPROC) load(userptr, "eglDestroyContext"); + glad_eglDestroySurface = (PFNEGLDESTROYSURFACEPROC) load(userptr, "eglDestroySurface"); + glad_eglGetConfigAttrib = (PFNEGLGETCONFIGATTRIBPROC) load(userptr, "eglGetConfigAttrib"); + glad_eglGetConfigs = (PFNEGLGETCONFIGSPROC) load(userptr, "eglGetConfigs"); + glad_eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(userptr, "eglGetCurrentDisplay"); + glad_eglGetCurrentSurface = (PFNEGLGETCURRENTSURFACEPROC) load(userptr, "eglGetCurrentSurface"); + glad_eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(userptr, "eglGetDisplay"); + glad_eglGetError = (PFNEGLGETERRORPROC) load(userptr, "eglGetError"); + glad_eglGetProcAddress = (PFNEGLGETPROCADDRESSPROC) load(userptr, "eglGetProcAddress"); + glad_eglInitialize = (PFNEGLINITIALIZEPROC) load(userptr, "eglInitialize"); + glad_eglMakeCurrent = (PFNEGLMAKECURRENTPROC) load(userptr, "eglMakeCurrent"); + glad_eglQueryContext = (PFNEGLQUERYCONTEXTPROC) load(userptr, "eglQueryContext"); + glad_eglQueryString = (PFNEGLQUERYSTRINGPROC) load(userptr, "eglQueryString"); + glad_eglQuerySurface = (PFNEGLQUERYSURFACEPROC) load(userptr, "eglQuerySurface"); + glad_eglSwapBuffers = (PFNEGLSWAPBUFFERSPROC) load(userptr, "eglSwapBuffers"); + glad_eglTerminate = (PFNEGLTERMINATEPROC) load(userptr, "eglTerminate"); + glad_eglWaitGL = (PFNEGLWAITGLPROC) load(userptr, "eglWaitGL"); + glad_eglWaitNative = (PFNEGLWAITNATIVEPROC) load(userptr, "eglWaitNative"); +} +static void glad_egl_load_EGL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_1) return; + glad_eglBindTexImage = (PFNEGLBINDTEXIMAGEPROC) load(userptr, "eglBindTexImage"); + glad_eglReleaseTexImage = (PFNEGLRELEASETEXIMAGEPROC) load(userptr, "eglReleaseTexImage"); + glad_eglSurfaceAttrib = (PFNEGLSURFACEATTRIBPROC) load(userptr, "eglSurfaceAttrib"); + glad_eglSwapInterval = (PFNEGLSWAPINTERVALPROC) load(userptr, "eglSwapInterval"); +} +static void glad_egl_load_EGL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_2) return; + glad_eglBindAPI = (PFNEGLBINDAPIPROC) load(userptr, "eglBindAPI"); + glad_eglCreatePbufferFromClientBuffer = (PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) load(userptr, "eglCreatePbufferFromClientBuffer"); + glad_eglQueryAPI = (PFNEGLQUERYAPIPROC) load(userptr, "eglQueryAPI"); + glad_eglReleaseThread = (PFNEGLRELEASETHREADPROC) load(userptr, "eglReleaseThread"); + glad_eglWaitClient = (PFNEGLWAITCLIENTPROC) load(userptr, "eglWaitClient"); +} +static void glad_egl_load_EGL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_4) return; + glad_eglGetCurrentContext = (PFNEGLGETCURRENTCONTEXTPROC) load(userptr, "eglGetCurrentContext"); +} +static void glad_egl_load_EGL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_VERSION_1_5) return; + glad_eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC) load(userptr, "eglClientWaitSync"); + glad_eglCreateImage = (PFNEGLCREATEIMAGEPROC) load(userptr, "eglCreateImage"); + glad_eglCreatePlatformPixmapSurface = (PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) load(userptr, "eglCreatePlatformPixmapSurface"); + glad_eglCreatePlatformWindowSurface = (PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) load(userptr, "eglCreatePlatformWindowSurface"); + glad_eglCreateSync = (PFNEGLCREATESYNCPROC) load(userptr, "eglCreateSync"); + glad_eglDestroyImage = (PFNEGLDESTROYIMAGEPROC) load(userptr, "eglDestroyImage"); + glad_eglDestroySync = (PFNEGLDESTROYSYNCPROC) load(userptr, "eglDestroySync"); + glad_eglGetPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYPROC) load(userptr, "eglGetPlatformDisplay"); + glad_eglGetSyncAttrib = (PFNEGLGETSYNCATTRIBPROC) load(userptr, "eglGetSyncAttrib"); + glad_eglWaitSync = (PFNEGLWAITSYNCPROC) load(userptr, "eglWaitSync"); +} +static void glad_egl_load_EGL_EXT_image_dma_buf_import_modifiers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_EXT_image_dma_buf_import_modifiers) return; + glad_eglQueryDmaBufFormatsEXT = (PFNEGLQUERYDMABUFFORMATSEXTPROC) load(userptr, "eglQueryDmaBufFormatsEXT"); + glad_eglQueryDmaBufModifiersEXT = (PFNEGLQUERYDMABUFMODIFIERSEXTPROC) load(userptr, "eglQueryDmaBufModifiersEXT"); +} +static void glad_egl_load_EGL_EXT_platform_base( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_EXT_platform_base) return; + glad_eglCreatePlatformPixmapSurfaceEXT = (PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) load(userptr, "eglCreatePlatformPixmapSurfaceEXT"); + glad_eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) load(userptr, "eglCreatePlatformWindowSurfaceEXT"); + glad_eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC) load(userptr, "eglGetPlatformDisplayEXT"); +} +static void glad_egl_load_EGL_KHR_cl_event2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_KHR_cl_event2) return; + glad_eglCreateSync64KHR = (PFNEGLCREATESYNC64KHRPROC) load(userptr, "eglCreateSync64KHR"); +} +static void glad_egl_load_EGL_KHR_fence_sync( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_KHR_fence_sync) return; + glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC) load(userptr, "eglClientWaitSyncKHR"); + glad_eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC) load(userptr, "eglCreateSyncKHR"); + glad_eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC) load(userptr, "eglDestroySyncKHR"); + glad_eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC) load(userptr, "eglGetSyncAttribKHR"); +} +static void glad_egl_load_EGL_KHR_image( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_KHR_image) return; + glad_eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) load(userptr, "eglCreateImageKHR"); + glad_eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) load(userptr, "eglDestroyImageKHR"); +} +static void glad_egl_load_EGL_KHR_image_base( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_KHR_image_base) return; + glad_eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) load(userptr, "eglCreateImageKHR"); + glad_eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) load(userptr, "eglDestroyImageKHR"); +} +static void glad_egl_load_EGL_KHR_reusable_sync( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_EGL_KHR_reusable_sync) return; + glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC) load(userptr, "eglClientWaitSyncKHR"); + glad_eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC) load(userptr, "eglCreateSyncKHR"); + glad_eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC) load(userptr, "eglDestroySyncKHR"); + glad_eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC) load(userptr, "eglGetSyncAttribKHR"); + glad_eglSignalSyncKHR = (PFNEGLSIGNALSYNCKHRPROC) load(userptr, "eglSignalSyncKHR"); +} + + +static void glad_egl_resolve_aliases(void) { + if (glad_eglClientWaitSync == NULL && glad_eglClientWaitSyncKHR != NULL) glad_eglClientWaitSync = (PFNEGLCLIENTWAITSYNCPROC)glad_eglClientWaitSyncKHR; + if (glad_eglClientWaitSyncKHR == NULL && glad_eglClientWaitSync != NULL) glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)glad_eglClientWaitSync; + if (glad_eglCreateSync == NULL && glad_eglCreateSync64KHR != NULL) glad_eglCreateSync = (PFNEGLCREATESYNCPROC)glad_eglCreateSync64KHR; + if (glad_eglCreateSync64KHR == NULL && glad_eglCreateSync != NULL) glad_eglCreateSync64KHR = (PFNEGLCREATESYNC64KHRPROC)glad_eglCreateSync; + if (glad_eglDestroyImage == NULL && glad_eglDestroyImageKHR != NULL) glad_eglDestroyImage = (PFNEGLDESTROYIMAGEPROC)glad_eglDestroyImageKHR; + if (glad_eglDestroyImageKHR == NULL && glad_eglDestroyImage != NULL) glad_eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)glad_eglDestroyImage; + if (glad_eglDestroySync == NULL && glad_eglDestroySyncKHR != NULL) glad_eglDestroySync = (PFNEGLDESTROYSYNCPROC)glad_eglDestroySyncKHR; + if (glad_eglDestroySyncKHR == NULL && glad_eglDestroySync != NULL) glad_eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)glad_eglDestroySync; +} + +static int glad_egl_get_extensions(EGLDisplay display, const char **extensions) { + *extensions = eglQueryString(display, EGL_EXTENSIONS); + + return extensions != NULL; +} + +static int glad_egl_has_extension(const char *extensions, const char *ext) { + const char *loc; + const char *terminator; + if(extensions == NULL) { + return 0; + } + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return 0; + } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } +} + +static GLADapiproc glad_egl_get_proc_from_userptr(void *userptr, const char *name) { + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_egl_find_extensions_egl(EGLDisplay display) { + const char *extensions; + if (!glad_egl_get_extensions(display, &extensions)) return 0; + + GLAD_EGL_EXT_image_dma_buf_import = glad_egl_has_extension(extensions, "EGL_EXT_image_dma_buf_import"); + GLAD_EGL_EXT_image_dma_buf_import_modifiers = glad_egl_has_extension(extensions, "EGL_EXT_image_dma_buf_import_modifiers"); + GLAD_EGL_EXT_platform_base = glad_egl_has_extension(extensions, "EGL_EXT_platform_base"); + GLAD_EGL_EXT_platform_wayland = glad_egl_has_extension(extensions, "EGL_EXT_platform_wayland"); + GLAD_EGL_KHR_cl_event2 = glad_egl_has_extension(extensions, "EGL_KHR_cl_event2"); + GLAD_EGL_KHR_fence_sync = glad_egl_has_extension(extensions, "EGL_KHR_fence_sync"); + GLAD_EGL_KHR_image = glad_egl_has_extension(extensions, "EGL_KHR_image"); + GLAD_EGL_KHR_image_base = glad_egl_has_extension(extensions, "EGL_KHR_image_base"); + GLAD_EGL_KHR_platform_gbm = glad_egl_has_extension(extensions, "EGL_KHR_platform_gbm"); + GLAD_EGL_KHR_reusable_sync = glad_egl_has_extension(extensions, "EGL_KHR_reusable_sync"); + + return 1; +} + +static int glad_egl_find_core_egl(EGLDisplay display) { + int major, minor; + const char *version; + + if (display == NULL) { + display = EGL_NO_DISPLAY; /* this is usually NULL, better safe than sorry */ + } + if (display == EGL_NO_DISPLAY) { + display = eglGetCurrentDisplay(); + } +#ifdef EGL_VERSION_1_4 + if (display == EGL_NO_DISPLAY) { + display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + } +#endif +#ifndef EGL_VERSION_1_5 + if (display == EGL_NO_DISPLAY) { + return 0; + } +#endif + + version = eglQueryString(display, EGL_VERSION); + (void) eglGetError(); + + if (version == NULL) { + major = 1; + minor = 0; + } else { + GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); + } + + GLAD_EGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + GLAD_EGL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + GLAD_EGL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + GLAD_EGL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + GLAD_EGL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + GLAD_EGL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; + + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadEGLUserPtr(EGLDisplay display, GLADuserptrloadfunc load, void* userptr) { + int version; + eglGetDisplay = (PFNEGLGETDISPLAYPROC) load(userptr, "eglGetDisplay"); + eglGetCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) load(userptr, "eglGetCurrentDisplay"); + eglQueryString = (PFNEGLQUERYSTRINGPROC) load(userptr, "eglQueryString"); + eglGetError = (PFNEGLGETERRORPROC) load(userptr, "eglGetError"); + if (eglGetDisplay == NULL || eglGetCurrentDisplay == NULL || eglQueryString == NULL || eglGetError == NULL) return 0; + + version = glad_egl_find_core_egl(display); + if (!version) return 0; + glad_egl_load_EGL_VERSION_1_0(load, userptr); + glad_egl_load_EGL_VERSION_1_1(load, userptr); + glad_egl_load_EGL_VERSION_1_2(load, userptr); + glad_egl_load_EGL_VERSION_1_4(load, userptr); + glad_egl_load_EGL_VERSION_1_5(load, userptr); + + if (!glad_egl_find_extensions_egl(display)) return 0; + glad_egl_load_EGL_EXT_image_dma_buf_import_modifiers(load, userptr); + glad_egl_load_EGL_EXT_platform_base(load, userptr); + glad_egl_load_EGL_KHR_cl_event2(load, userptr); + glad_egl_load_EGL_KHR_fence_sync(load, userptr); + glad_egl_load_EGL_KHR_image(load, userptr); + glad_egl_load_EGL_KHR_image_base(load, userptr); + glad_egl_load_EGL_KHR_reusable_sync(load, userptr); + + glad_egl_resolve_aliases(); + + return version; +} + +int gladLoadEGL(EGLDisplay display, GLADloadfunc load) { + return gladLoadEGLUserPtr(display, glad_egl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + + +#ifdef __cplusplus +} +#endif + +#endif /*LV_USE_EGL*/ diff --git a/inc/lvgl/src/drivers/opengles/glad/src/gl.c b/inc/lvgl/src/drivers/opengles/glad/src/gl.c new file mode 100644 index 0000000..062ca27 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/glad/src/gl.c @@ -0,0 +1,4708 @@ +/** + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + */ + +#include "../../lv_opengles_private.h" + +#if LV_USE_OPENGLES && !LV_USE_EGL + +#include +#include +#include +#include "../include/glad/gl.h" + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int GLAD_GL_VERSION_1_0 = 0; +int GLAD_GL_VERSION_1_1 = 0; +int GLAD_GL_VERSION_1_2 = 0; +int GLAD_GL_VERSION_1_3 = 0; +int GLAD_GL_VERSION_1_4 = 0; +int GLAD_GL_VERSION_1_5 = 0; +int GLAD_GL_VERSION_2_0 = 0; +int GLAD_GL_VERSION_2_1 = 0; +int GLAD_GL_VERSION_3_0 = 0; +int GLAD_GL_VERSION_3_1 = 0; +int GLAD_GL_VERSION_3_2 = 0; +int GLAD_GL_VERSION_3_3 = 0; +int GLAD_GL_APPLE_flush_buffer_range = 0; +int GLAD_GL_APPLE_vertex_array_object = 0; +int GLAD_GL_ARB_blend_func_extended = 0; +int GLAD_GL_ARB_color_buffer_float = 0; +int GLAD_GL_ARB_copy_buffer = 0; +int GLAD_GL_ARB_draw_buffers = 0; +int GLAD_GL_ARB_draw_elements_base_vertex = 0; +int GLAD_GL_ARB_draw_instanced = 0; +int GLAD_GL_ARB_framebuffer_object = 0; +int GLAD_GL_ARB_geometry_shader4 = 0; +int GLAD_GL_ARB_imaging = 0; +int GLAD_GL_ARB_instanced_arrays = 0; +int GLAD_GL_ARB_map_buffer_range = 0; +int GLAD_GL_ARB_multisample = 0; +int GLAD_GL_ARB_multitexture = 0; +int GLAD_GL_ARB_occlusion_query = 0; +int GLAD_GL_ARB_point_parameters = 0; +int GLAD_GL_ARB_provoking_vertex = 0; +int GLAD_GL_ARB_sampler_objects = 0; +int GLAD_GL_ARB_shader_objects = 0; +int GLAD_GL_ARB_sync = 0; +int GLAD_GL_ARB_texture_buffer_object = 0; +int GLAD_GL_ARB_texture_compression = 0; +int GLAD_GL_ARB_texture_multisample = 0; +int GLAD_GL_ARB_timer_query = 0; +int GLAD_GL_ARB_transpose_matrix = 0; +int GLAD_GL_ARB_uniform_buffer_object = 0; +int GLAD_GL_ARB_vertex_array_object = 0; +int GLAD_GL_ARB_vertex_buffer_object = 0; +int GLAD_GL_ARB_vertex_program = 0; +int GLAD_GL_ARB_vertex_shader = 0; +int GLAD_GL_ARB_vertex_type_2_10_10_10_rev = 0; +int GLAD_GL_ARB_window_pos = 0; +int GLAD_GL_ATI_draw_buffers = 0; +int GLAD_GL_ATI_separate_stencil = 0; +int GLAD_GL_EXT_blend_color = 0; +int GLAD_GL_EXT_blend_equation_separate = 0; +int GLAD_GL_EXT_blend_func_separate = 0; +int GLAD_GL_EXT_blend_minmax = 0; +int GLAD_GL_EXT_copy_texture = 0; +int GLAD_GL_EXT_direct_state_access = 0; +int GLAD_GL_EXT_draw_buffers2 = 0; +int GLAD_GL_EXT_draw_instanced = 0; +int GLAD_GL_EXT_draw_range_elements = 0; +int GLAD_GL_EXT_fog_coord = 0; +int GLAD_GL_EXT_framebuffer_blit = 0; +int GLAD_GL_EXT_framebuffer_multisample = 0; +int GLAD_GL_EXT_framebuffer_object = 0; +int GLAD_GL_EXT_gpu_shader4 = 0; +int GLAD_GL_EXT_multi_draw_arrays = 0; +int GLAD_GL_EXT_point_parameters = 0; +int GLAD_GL_EXT_provoking_vertex = 0; +int GLAD_GL_EXT_secondary_color = 0; +int GLAD_GL_EXT_subtexture = 0; +int GLAD_GL_EXT_texture3D = 0; +int GLAD_GL_EXT_texture_array = 0; +int GLAD_GL_EXT_texture_buffer_object = 0; +int GLAD_GL_EXT_texture_integer = 0; +int GLAD_GL_EXT_texture_object = 0; +int GLAD_GL_EXT_texture_storage = 0; +int GLAD_GL_EXT_timer_query = 0; +int GLAD_GL_EXT_transform_feedback = 0; +int GLAD_GL_EXT_vertex_array = 0; +int GLAD_GL_INGR_blend_func_separate = 0; +int GLAD_GL_KHR_debug = 0; +int GLAD_GL_MESA_window_pos = 0; +int GLAD_GL_NVX_conditional_render = 0; +int GLAD_GL_NV_conditional_render = 0; +int GLAD_GL_NV_explicit_multisample = 0; +int GLAD_GL_NV_geometry_program4 = 0; +int GLAD_GL_NV_point_sprite = 0; +int GLAD_GL_NV_transform_feedback = 0; +int GLAD_GL_NV_vertex_program = 0; +int GLAD_GL_NV_vertex_program4 = 0; +int GLAD_GL_SGIS_point_parameters = 0; + + + +PFNGLACCUMPROC glad_glAccum = NULL; +PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; +PFNGLACTIVETEXTUREARBPROC glad_glActiveTextureARB = NULL; +PFNGLACTIVEVARYINGNVPROC glad_glActiveVaryingNV = NULL; +PFNGLALPHAFUNCPROC glad_glAlphaFunc = NULL; +PFNGLAREPROGRAMSRESIDENTNVPROC glad_glAreProgramsResidentNV = NULL; +PFNGLARETEXTURESRESIDENTPROC glad_glAreTexturesResident = NULL; +PFNGLARETEXTURESRESIDENTEXTPROC glad_glAreTexturesResidentEXT = NULL; +PFNGLARRAYELEMENTPROC glad_glArrayElement = NULL; +PFNGLARRAYELEMENTEXTPROC glad_glArrayElementEXT = NULL; +PFNGLATTACHOBJECTARBPROC glad_glAttachObjectARB = NULL; +PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; +PFNGLBEGINPROC glad_glBegin = NULL; +PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL; +PFNGLBEGINCONDITIONALRENDERNVPROC glad_glBeginConditionalRenderNV = NULL; +PFNGLBEGINCONDITIONALRENDERNVXPROC glad_glBeginConditionalRenderNVX = NULL; +PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; +PFNGLBEGINQUERYARBPROC glad_glBeginQueryARB = NULL; +PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; +PFNGLBEGINTRANSFORMFEEDBACKEXTPROC glad_glBeginTransformFeedbackEXT = NULL; +PFNGLBEGINTRANSFORMFEEDBACKNVPROC glad_glBeginTransformFeedbackNV = NULL; +PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; +PFNGLBINDATTRIBLOCATIONARBPROC glad_glBindAttribLocationARB = NULL; +PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; +PFNGLBINDBUFFERARBPROC glad_glBindBufferARB = NULL; +PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL; +PFNGLBINDBUFFERBASEEXTPROC glad_glBindBufferBaseEXT = NULL; +PFNGLBINDBUFFERBASENVPROC glad_glBindBufferBaseNV = NULL; +PFNGLBINDBUFFEROFFSETEXTPROC glad_glBindBufferOffsetEXT = NULL; +PFNGLBINDBUFFEROFFSETNVPROC glad_glBindBufferOffsetNV = NULL; +PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; +PFNGLBINDBUFFERRANGEEXTPROC glad_glBindBufferRangeEXT = NULL; +PFNGLBINDBUFFERRANGENVPROC glad_glBindBufferRangeNV = NULL; +PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL; +PFNGLBINDFRAGDATALOCATIONEXTPROC glad_glBindFragDataLocationEXT = NULL; +PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL; +PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; +PFNGLBINDFRAMEBUFFEREXTPROC glad_glBindFramebufferEXT = NULL; +PFNGLBINDMULTITEXTUREEXTPROC glad_glBindMultiTextureEXT = NULL; +PFNGLBINDPROGRAMARBPROC glad_glBindProgramARB = NULL; +PFNGLBINDPROGRAMNVPROC glad_glBindProgramNV = NULL; +PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; +PFNGLBINDRENDERBUFFEREXTPROC glad_glBindRenderbufferEXT = NULL; +PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; +PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; +PFNGLBINDTEXTUREEXTPROC glad_glBindTextureEXT = NULL; +PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; +PFNGLBINDVERTEXARRAYAPPLEPROC glad_glBindVertexArrayAPPLE = NULL; +PFNGLBITMAPPROC glad_glBitmap = NULL; +PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; +PFNGLBLENDCOLOREXTPROC glad_glBlendColorEXT = NULL; +PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; +PFNGLBLENDEQUATIONEXTPROC glad_glBlendEquationEXT = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; +PFNGLBLENDEQUATIONSEPARATEEXTPROC glad_glBlendEquationSeparateEXT = NULL; +PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; +PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; +PFNGLBLENDFUNCSEPARATEEXTPROC glad_glBlendFuncSeparateEXT = NULL; +PFNGLBLENDFUNCSEPARATEINGRPROC glad_glBlendFuncSeparateINGR = NULL; +PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; +PFNGLBLITFRAMEBUFFEREXTPROC glad_glBlitFramebufferEXT = NULL; +PFNGLBUFFERDATAPROC glad_glBufferData = NULL; +PFNGLBUFFERDATAARBPROC glad_glBufferDataARB = NULL; +PFNGLBUFFERPARAMETERIAPPLEPROC glad_glBufferParameteriAPPLE = NULL; +PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; +PFNGLBUFFERSUBDATAARBPROC glad_glBufferSubDataARB = NULL; +PFNGLCALLLISTPROC glad_glCallList = NULL; +PFNGLCALLLISTSPROC glad_glCallLists = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glad_glCheckFramebufferStatusEXT = NULL; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC glad_glCheckNamedFramebufferStatusEXT = NULL; +PFNGLCLAMPCOLORPROC glad_glClampColor = NULL; +PFNGLCLAMPCOLORARBPROC glad_glClampColorARB = NULL; +PFNGLCLEARPROC glad_glClear = NULL; +PFNGLCLEARACCUMPROC glad_glClearAccum = NULL; +PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; +PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; +PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; +PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; +PFNGLCLEARCOLORPROC glad_glClearColor = NULL; +PFNGLCLEARCOLORIIEXTPROC glad_glClearColorIiEXT = NULL; +PFNGLCLEARCOLORIUIEXTPROC glad_glClearColorIuiEXT = NULL; +PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL; +PFNGLCLEARINDEXPROC glad_glClearIndex = NULL; +PFNGLCLEARNAMEDBUFFERDATAEXTPROC glad_glClearNamedBufferDataEXT = NULL; +PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC glad_glClearNamedBufferSubDataEXT = NULL; +PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; +PFNGLCLIENTACTIVETEXTUREPROC glad_glClientActiveTexture = NULL; +PFNGLCLIENTACTIVETEXTUREARBPROC glad_glClientActiveTextureARB = NULL; +PFNGLCLIENTATTRIBDEFAULTEXTPROC glad_glClientAttribDefaultEXT = NULL; +PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; +PFNGLCLIPPLANEPROC glad_glClipPlane = NULL; +PFNGLCOLOR3BPROC glad_glColor3b = NULL; +PFNGLCOLOR3BVPROC glad_glColor3bv = NULL; +PFNGLCOLOR3DPROC glad_glColor3d = NULL; +PFNGLCOLOR3DVPROC glad_glColor3dv = NULL; +PFNGLCOLOR3FPROC glad_glColor3f = NULL; +PFNGLCOLOR3FVPROC glad_glColor3fv = NULL; +PFNGLCOLOR3IPROC glad_glColor3i = NULL; +PFNGLCOLOR3IVPROC glad_glColor3iv = NULL; +PFNGLCOLOR3SPROC glad_glColor3s = NULL; +PFNGLCOLOR3SVPROC glad_glColor3sv = NULL; +PFNGLCOLOR3UBPROC glad_glColor3ub = NULL; +PFNGLCOLOR3UBVPROC glad_glColor3ubv = NULL; +PFNGLCOLOR3UIPROC glad_glColor3ui = NULL; +PFNGLCOLOR3UIVPROC glad_glColor3uiv = NULL; +PFNGLCOLOR3USPROC glad_glColor3us = NULL; +PFNGLCOLOR3USVPROC glad_glColor3usv = NULL; +PFNGLCOLOR4BPROC glad_glColor4b = NULL; +PFNGLCOLOR4BVPROC glad_glColor4bv = NULL; +PFNGLCOLOR4DPROC glad_glColor4d = NULL; +PFNGLCOLOR4DVPROC glad_glColor4dv = NULL; +PFNGLCOLOR4FPROC glad_glColor4f = NULL; +PFNGLCOLOR4FVPROC glad_glColor4fv = NULL; +PFNGLCOLOR4IPROC glad_glColor4i = NULL; +PFNGLCOLOR4IVPROC glad_glColor4iv = NULL; +PFNGLCOLOR4SPROC glad_glColor4s = NULL; +PFNGLCOLOR4SVPROC glad_glColor4sv = NULL; +PFNGLCOLOR4UBPROC glad_glColor4ub = NULL; +PFNGLCOLOR4UBVPROC glad_glColor4ubv = NULL; +PFNGLCOLOR4UIPROC glad_glColor4ui = NULL; +PFNGLCOLOR4UIVPROC glad_glColor4uiv = NULL; +PFNGLCOLOR4USPROC glad_glColor4us = NULL; +PFNGLCOLOR4USVPROC glad_glColor4usv = NULL; +PFNGLCOLORMASKPROC glad_glColorMask = NULL; +PFNGLCOLORMASKINDEXEDEXTPROC glad_glColorMaskIndexedEXT = NULL; +PFNGLCOLORMASKIPROC glad_glColorMaski = NULL; +PFNGLCOLORMATERIALPROC glad_glColorMaterial = NULL; +PFNGLCOLORP3UIPROC glad_glColorP3ui = NULL; +PFNGLCOLORP3UIVPROC glad_glColorP3uiv = NULL; +PFNGLCOLORP4UIPROC glad_glColorP4ui = NULL; +PFNGLCOLORP4UIVPROC glad_glColorP4uiv = NULL; +PFNGLCOLORPOINTERPROC glad_glColorPointer = NULL; +PFNGLCOLORPOINTEREXTPROC glad_glColorPointerEXT = NULL; +PFNGLCOLORSUBTABLEPROC glad_glColorSubTable = NULL; +PFNGLCOLORTABLEPROC glad_glColorTable = NULL; +PFNGLCOLORTABLEPARAMETERFVPROC glad_glColorTableParameterfv = NULL; +PFNGLCOLORTABLEPARAMETERIVPROC glad_glColorTableParameteriv = NULL; +PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; +PFNGLCOMPILESHADERARBPROC glad_glCompileShaderARB = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC glad_glCompressedMultiTexImage1DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC glad_glCompressedMultiTexImage2DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC glad_glCompressedMultiTexImage3DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC glad_glCompressedMultiTexSubImage1DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC glad_glCompressedMultiTexSubImage2DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC glad_glCompressedMultiTexSubImage3DEXT = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DARBPROC glad_glCompressedTexImage1DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DARBPROC glad_glCompressedTexImage2DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DARBPROC glad_glCompressedTexImage3DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC glad_glCompressedTexSubImage1DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC glad_glCompressedTexSubImage2DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC glad_glCompressedTexSubImage3DARB = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC glad_glCompressedTextureImage1DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC glad_glCompressedTextureImage2DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC glad_glCompressedTextureImage3DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC glad_glCompressedTextureSubImage1DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC glad_glCompressedTextureSubImage2DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC glad_glCompressedTextureSubImage3DEXT = NULL; +PFNGLCONVOLUTIONFILTER1DPROC glad_glConvolutionFilter1D = NULL; +PFNGLCONVOLUTIONFILTER2DPROC glad_glConvolutionFilter2D = NULL; +PFNGLCONVOLUTIONPARAMETERFPROC glad_glConvolutionParameterf = NULL; +PFNGLCONVOLUTIONPARAMETERFVPROC glad_glConvolutionParameterfv = NULL; +PFNGLCONVOLUTIONPARAMETERIPROC glad_glConvolutionParameteri = NULL; +PFNGLCONVOLUTIONPARAMETERIVPROC glad_glConvolutionParameteriv = NULL; +PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; +PFNGLCOPYCOLORSUBTABLEPROC glad_glCopyColorSubTable = NULL; +PFNGLCOPYCOLORTABLEPROC glad_glCopyColorTable = NULL; +PFNGLCOPYCONVOLUTIONFILTER1DPROC glad_glCopyConvolutionFilter1D = NULL; +PFNGLCOPYCONVOLUTIONFILTER2DPROC glad_glCopyConvolutionFilter2D = NULL; +PFNGLCOPYMULTITEXIMAGE1DEXTPROC glad_glCopyMultiTexImage1DEXT = NULL; +PFNGLCOPYMULTITEXIMAGE2DEXTPROC glad_glCopyMultiTexImage2DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC glad_glCopyMultiTexSubImage1DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC glad_glCopyMultiTexSubImage2DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC glad_glCopyMultiTexSubImage3DEXT = NULL; +PFNGLCOPYPIXELSPROC glad_glCopyPixels = NULL; +PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL; +PFNGLCOPYTEXIMAGE1DEXTPROC glad_glCopyTexImage1DEXT = NULL; +PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; +PFNGLCOPYTEXIMAGE2DEXTPROC glad_glCopyTexImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL; +PFNGLCOPYTEXSUBIMAGE1DEXTPROC glad_glCopyTexSubImage1DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE2DEXTPROC glad_glCopyTexSubImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; +PFNGLCOPYTEXSUBIMAGE3DEXTPROC glad_glCopyTexSubImage3DEXT = NULL; +PFNGLCOPYTEXTUREIMAGE1DEXTPROC glad_glCopyTextureImage1DEXT = NULL; +PFNGLCOPYTEXTUREIMAGE2DEXTPROC glad_glCopyTextureImage2DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC glad_glCopyTextureSubImage1DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC glad_glCopyTextureSubImage2DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC glad_glCopyTextureSubImage3DEXT = NULL; +PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; +PFNGLCREATEPROGRAMOBJECTARBPROC glad_glCreateProgramObjectARB = NULL; +PFNGLCREATESHADERPROC glad_glCreateShader = NULL; +PFNGLCREATESHADEROBJECTARBPROC glad_glCreateShaderObjectARB = NULL; +PFNGLCULLFACEPROC glad_glCullFace = NULL; +PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback = NULL; +PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl = NULL; +PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert = NULL; +PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; +PFNGLDELETEBUFFERSARBPROC glad_glDeleteBuffersARB = NULL; +PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; +PFNGLDELETEFRAMEBUFFERSEXTPROC glad_glDeleteFramebuffersEXT = NULL; +PFNGLDELETELISTSPROC glad_glDeleteLists = NULL; +PFNGLDELETEOBJECTARBPROC glad_glDeleteObjectARB = NULL; +PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; +PFNGLDELETEPROGRAMSARBPROC glad_glDeleteProgramsARB = NULL; +PFNGLDELETEPROGRAMSNVPROC glad_glDeleteProgramsNV = NULL; +PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; +PFNGLDELETEQUERIESARBPROC glad_glDeleteQueriesARB = NULL; +PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; +PFNGLDELETERENDERBUFFERSEXTPROC glad_glDeleteRenderbuffersEXT = NULL; +PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; +PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; +PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; +PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; +PFNGLDELETETEXTURESEXTPROC glad_glDeleteTexturesEXT = NULL; +PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; +PFNGLDELETEVERTEXARRAYSAPPLEPROC glad_glDeleteVertexArraysAPPLE = NULL; +PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; +PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; +PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL; +PFNGLDETACHOBJECTARBPROC glad_glDetachObjectARB = NULL; +PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; +PFNGLDISABLEPROC glad_glDisable = NULL; +PFNGLDISABLECLIENTSTATEPROC glad_glDisableClientState = NULL; +PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC glad_glDisableClientStateIndexedEXT = NULL; +PFNGLDISABLECLIENTSTATEIEXTPROC glad_glDisableClientStateiEXT = NULL; +PFNGLDISABLEINDEXEDEXTPROC glad_glDisableIndexedEXT = NULL; +PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC glad_glDisableVertexArrayAttribEXT = NULL; +PFNGLDISABLEVERTEXARRAYEXTPROC glad_glDisableVertexArrayEXT = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glad_glDisableVertexAttribArrayARB = NULL; +PFNGLDISABLEIPROC glad_glDisablei = NULL; +PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; +PFNGLDRAWARRAYSEXTPROC glad_glDrawArraysEXT = NULL; +PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; +PFNGLDRAWARRAYSINSTANCEDARBPROC glad_glDrawArraysInstancedARB = NULL; +PFNGLDRAWARRAYSINSTANCEDEXTPROC glad_glDrawArraysInstancedEXT = NULL; +PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL; +PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; +PFNGLDRAWBUFFERSARBPROC glad_glDrawBuffersARB = NULL; +PFNGLDRAWBUFFERSATIPROC glad_glDrawBuffersATI = NULL; +PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; +PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; +PFNGLDRAWELEMENTSINSTANCEDARBPROC glad_glDrawElementsInstancedARB = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDEXTPROC glad_glDrawElementsInstancedEXT = NULL; +PFNGLDRAWPIXELSPROC glad_glDrawPixels = NULL; +PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL; +PFNGLDRAWRANGEELEMENTSEXTPROC glad_glDrawRangeElementsEXT = NULL; +PFNGLEDGEFLAGPROC glad_glEdgeFlag = NULL; +PFNGLEDGEFLAGPOINTERPROC glad_glEdgeFlagPointer = NULL; +PFNGLEDGEFLAGPOINTEREXTPROC glad_glEdgeFlagPointerEXT = NULL; +PFNGLEDGEFLAGVPROC glad_glEdgeFlagv = NULL; +PFNGLENABLEPROC glad_glEnable = NULL; +PFNGLENABLECLIENTSTATEPROC glad_glEnableClientState = NULL; +PFNGLENABLECLIENTSTATEINDEXEDEXTPROC glad_glEnableClientStateIndexedEXT = NULL; +PFNGLENABLECLIENTSTATEIEXTPROC glad_glEnableClientStateiEXT = NULL; +PFNGLENABLEINDEXEDEXTPROC glad_glEnableIndexedEXT = NULL; +PFNGLENABLEVERTEXARRAYATTRIBEXTPROC glad_glEnableVertexArrayAttribEXT = NULL; +PFNGLENABLEVERTEXARRAYEXTPROC glad_glEnableVertexArrayEXT = NULL; +PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; +PFNGLENABLEVERTEXATTRIBARRAYARBPROC glad_glEnableVertexAttribArrayARB = NULL; +PFNGLENABLEIPROC glad_glEnablei = NULL; +PFNGLENDPROC glad_glEnd = NULL; +PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL; +PFNGLENDCONDITIONALRENDERNVPROC glad_glEndConditionalRenderNV = NULL; +PFNGLENDCONDITIONALRENDERNVXPROC glad_glEndConditionalRenderNVX = NULL; +PFNGLENDLISTPROC glad_glEndList = NULL; +PFNGLENDQUERYPROC glad_glEndQuery = NULL; +PFNGLENDQUERYARBPROC glad_glEndQueryARB = NULL; +PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; +PFNGLENDTRANSFORMFEEDBACKEXTPROC glad_glEndTransformFeedbackEXT = NULL; +PFNGLENDTRANSFORMFEEDBACKNVPROC glad_glEndTransformFeedbackNV = NULL; +PFNGLEVALCOORD1DPROC glad_glEvalCoord1d = NULL; +PFNGLEVALCOORD1DVPROC glad_glEvalCoord1dv = NULL; +PFNGLEVALCOORD1FPROC glad_glEvalCoord1f = NULL; +PFNGLEVALCOORD1FVPROC glad_glEvalCoord1fv = NULL; +PFNGLEVALCOORD2DPROC glad_glEvalCoord2d = NULL; +PFNGLEVALCOORD2DVPROC glad_glEvalCoord2dv = NULL; +PFNGLEVALCOORD2FPROC glad_glEvalCoord2f = NULL; +PFNGLEVALCOORD2FVPROC glad_glEvalCoord2fv = NULL; +PFNGLEVALMESH1PROC glad_glEvalMesh1 = NULL; +PFNGLEVALMESH2PROC glad_glEvalMesh2 = NULL; +PFNGLEVALPOINT1PROC glad_glEvalPoint1 = NULL; +PFNGLEVALPOINT2PROC glad_glEvalPoint2 = NULL; +PFNGLEXECUTEPROGRAMNVPROC glad_glExecuteProgramNV = NULL; +PFNGLFEEDBACKBUFFERPROC glad_glFeedbackBuffer = NULL; +PFNGLFENCESYNCPROC glad_glFenceSync = NULL; +PFNGLFINISHPROC glad_glFinish = NULL; +PFNGLFLUSHPROC glad_glFlush = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glad_glFlushMappedBufferRangeAPPLE = NULL; +PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC glad_glFlushMappedNamedBufferRangeEXT = NULL; +PFNGLFOGCOORDPOINTERPROC glad_glFogCoordPointer = NULL; +PFNGLFOGCOORDPOINTEREXTPROC glad_glFogCoordPointerEXT = NULL; +PFNGLFOGCOORDDPROC glad_glFogCoordd = NULL; +PFNGLFOGCOORDDEXTPROC glad_glFogCoorddEXT = NULL; +PFNGLFOGCOORDDVPROC glad_glFogCoorddv = NULL; +PFNGLFOGCOORDDVEXTPROC glad_glFogCoorddvEXT = NULL; +PFNGLFOGCOORDFPROC glad_glFogCoordf = NULL; +PFNGLFOGCOORDFEXTPROC glad_glFogCoordfEXT = NULL; +PFNGLFOGCOORDFVPROC glad_glFogCoordfv = NULL; +PFNGLFOGCOORDFVEXTPROC glad_glFogCoordfvEXT = NULL; +PFNGLFOGFPROC glad_glFogf = NULL; +PFNGLFOGFVPROC glad_glFogfv = NULL; +PFNGLFOGIPROC glad_glFogi = NULL; +PFNGLFOGIVPROC glad_glFogiv = NULL; +PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC glad_glFramebufferDrawBufferEXT = NULL; +PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC glad_glFramebufferDrawBuffersEXT = NULL; +PFNGLFRAMEBUFFERREADBUFFEREXTPROC glad_glFramebufferReadBufferEXT = NULL; +PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; +PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glad_glFramebufferRenderbufferEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL; +PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL; +PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glad_glFramebufferTexture1DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; +PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glad_glFramebufferTexture2DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL; +PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glad_glFramebufferTexture3DEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREARBPROC glad_glFramebufferTextureARB = NULL; +PFNGLFRAMEBUFFERTEXTUREEXTPROC glad_glFramebufferTextureEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREFACEARBPROC glad_glFramebufferTextureFaceARB = NULL; +PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC glad_glFramebufferTextureFaceEXT = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERARBPROC glad_glFramebufferTextureLayerARB = NULL; +PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC glad_glFramebufferTextureLayerEXT = NULL; +PFNGLFRONTFACEPROC glad_glFrontFace = NULL; +PFNGLFRUSTUMPROC glad_glFrustum = NULL; +PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; +PFNGLGENBUFFERSARBPROC glad_glGenBuffersARB = NULL; +PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; +PFNGLGENFRAMEBUFFERSEXTPROC glad_glGenFramebuffersEXT = NULL; +PFNGLGENLISTSPROC glad_glGenLists = NULL; +PFNGLGENPROGRAMSARBPROC glad_glGenProgramsARB = NULL; +PFNGLGENPROGRAMSNVPROC glad_glGenProgramsNV = NULL; +PFNGLGENQUERIESPROC glad_glGenQueries = NULL; +PFNGLGENQUERIESARBPROC glad_glGenQueriesARB = NULL; +PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; +PFNGLGENRENDERBUFFERSEXTPROC glad_glGenRenderbuffersEXT = NULL; +PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; +PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; +PFNGLGENTEXTURESEXTPROC glad_glGenTexturesEXT = NULL; +PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; +PFNGLGENVERTEXARRAYSAPPLEPROC glad_glGenVertexArraysAPPLE = NULL; +PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; +PFNGLGENERATEMIPMAPEXTPROC glad_glGenerateMipmapEXT = NULL; +PFNGLGENERATEMULTITEXMIPMAPEXTPROC glad_glGenerateMultiTexMipmapEXT = NULL; +PFNGLGENERATETEXTUREMIPMAPEXTPROC glad_glGenerateTextureMipmapEXT = NULL; +PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; +PFNGLGETACTIVEATTRIBARBPROC glad_glGetActiveAttribARB = NULL; +PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; +PFNGLGETACTIVEUNIFORMARBPROC glad_glGetActiveUniformARB = NULL; +PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; +PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; +PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName = NULL; +PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL; +PFNGLGETACTIVEVARYINGNVPROC glad_glGetActiveVaryingNV = NULL; +PFNGLGETATTACHEDOBJECTSARBPROC glad_glGetAttachedObjectsARB = NULL; +PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; +PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; +PFNGLGETATTRIBLOCATIONARBPROC glad_glGetAttribLocationARB = NULL; +PFNGLGETBOOLEANINDEXEDVEXTPROC glad_glGetBooleanIndexedvEXT = NULL; +PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v = NULL; +PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; +PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL; +PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; +PFNGLGETBUFFERPARAMETERIVARBPROC glad_glGetBufferParameterivARB = NULL; +PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; +PFNGLGETBUFFERPOINTERVARBPROC glad_glGetBufferPointervARB = NULL; +PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL; +PFNGLGETBUFFERSUBDATAARBPROC glad_glGetBufferSubDataARB = NULL; +PFNGLGETCLIPPLANEPROC glad_glGetClipPlane = NULL; +PFNGLGETCOLORTABLEPROC glad_glGetColorTable = NULL; +PFNGLGETCOLORTABLEPARAMETERFVPROC glad_glGetColorTableParameterfv = NULL; +PFNGLGETCOLORTABLEPARAMETERIVPROC glad_glGetColorTableParameteriv = NULL; +PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC glad_glGetCompressedMultiTexImageEXT = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glad_glGetCompressedTexImageARB = NULL; +PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC glad_glGetCompressedTextureImageEXT = NULL; +PFNGLGETCONVOLUTIONFILTERPROC glad_glGetConvolutionFilter = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVPROC glad_glGetConvolutionParameterfv = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVPROC glad_glGetConvolutionParameteriv = NULL; +PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog = NULL; +PFNGLGETDOUBLEINDEXEDVEXTPROC glad_glGetDoubleIndexedvEXT = NULL; +PFNGLGETDOUBLEI_VEXTPROC glad_glGetDoublei_vEXT = NULL; +PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL; +PFNGLGETERRORPROC glad_glGetError = NULL; +PFNGLGETFLOATINDEXEDVEXTPROC glad_glGetFloatIndexedvEXT = NULL; +PFNGLGETFLOATI_VEXTPROC glad_glGetFloati_vEXT = NULL; +PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; +PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL; +PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; +PFNGLGETFRAGDATALOCATIONEXTPROC glad_glGetFragDataLocationEXT = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC glad_glGetFramebufferParameterivEXT = NULL; +PFNGLGETHANDLEARBPROC glad_glGetHandleARB = NULL; +PFNGLGETHISTOGRAMPROC glad_glGetHistogram = NULL; +PFNGLGETHISTOGRAMPARAMETERFVPROC glad_glGetHistogramParameterfv = NULL; +PFNGLGETHISTOGRAMPARAMETERIVPROC glad_glGetHistogramParameteriv = NULL; +PFNGLGETINFOLOGARBPROC glad_glGetInfoLogARB = NULL; +PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; +PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; +PFNGLGETINTEGERINDEXEDVEXTPROC glad_glGetIntegerIndexedvEXT = NULL; +PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; +PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; +PFNGLGETLIGHTFVPROC glad_glGetLightfv = NULL; +PFNGLGETLIGHTIVPROC glad_glGetLightiv = NULL; +PFNGLGETMAPDVPROC glad_glGetMapdv = NULL; +PFNGLGETMAPFVPROC glad_glGetMapfv = NULL; +PFNGLGETMAPIVPROC glad_glGetMapiv = NULL; +PFNGLGETMATERIALFVPROC glad_glGetMaterialfv = NULL; +PFNGLGETMATERIALIVPROC glad_glGetMaterialiv = NULL; +PFNGLGETMINMAXPROC glad_glGetMinmax = NULL; +PFNGLGETMINMAXPARAMETERFVPROC glad_glGetMinmaxParameterfv = NULL; +PFNGLGETMINMAXPARAMETERIVPROC glad_glGetMinmaxParameteriv = NULL; +PFNGLGETMULTITEXENVFVEXTPROC glad_glGetMultiTexEnvfvEXT = NULL; +PFNGLGETMULTITEXENVIVEXTPROC glad_glGetMultiTexEnvivEXT = NULL; +PFNGLGETMULTITEXGENDVEXTPROC glad_glGetMultiTexGendvEXT = NULL; +PFNGLGETMULTITEXGENFVEXTPROC glad_glGetMultiTexGenfvEXT = NULL; +PFNGLGETMULTITEXGENIVEXTPROC glad_glGetMultiTexGenivEXT = NULL; +PFNGLGETMULTITEXIMAGEEXTPROC glad_glGetMultiTexImageEXT = NULL; +PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC glad_glGetMultiTexLevelParameterfvEXT = NULL; +PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC glad_glGetMultiTexLevelParameterivEXT = NULL; +PFNGLGETMULTITEXPARAMETERIIVEXTPROC glad_glGetMultiTexParameterIivEXT = NULL; +PFNGLGETMULTITEXPARAMETERIUIVEXTPROC glad_glGetMultiTexParameterIuivEXT = NULL; +PFNGLGETMULTITEXPARAMETERFVEXTPROC glad_glGetMultiTexParameterfvEXT = NULL; +PFNGLGETMULTITEXPARAMETERIVEXTPROC glad_glGetMultiTexParameterivEXT = NULL; +PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL; +PFNGLGETMULTISAMPLEFVNVPROC glad_glGetMultisamplefvNV = NULL; +PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC glad_glGetNamedBufferParameterivEXT = NULL; +PFNGLGETNAMEDBUFFERPOINTERVEXTPROC glad_glGetNamedBufferPointervEXT = NULL; +PFNGLGETNAMEDBUFFERSUBDATAEXTPROC glad_glGetNamedBufferSubDataEXT = NULL; +PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glad_glGetNamedFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC glad_glGetNamedFramebufferParameterivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC glad_glGetNamedProgramLocalParameterIivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC glad_glGetNamedProgramLocalParameterIuivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC glad_glGetNamedProgramLocalParameterdvEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC glad_glGetNamedProgramLocalParameterfvEXT = NULL; +PFNGLGETNAMEDPROGRAMSTRINGEXTPROC glad_glGetNamedProgramStringEXT = NULL; +PFNGLGETNAMEDPROGRAMIVEXTPROC glad_glGetNamedProgramivEXT = NULL; +PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC glad_glGetNamedRenderbufferParameterivEXT = NULL; +PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel = NULL; +PFNGLGETOBJECTPARAMETERFVARBPROC glad_glGetObjectParameterfvARB = NULL; +PFNGLGETOBJECTPARAMETERIVARBPROC glad_glGetObjectParameterivARB = NULL; +PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel = NULL; +PFNGLGETPIXELMAPFVPROC glad_glGetPixelMapfv = NULL; +PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv = NULL; +PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv = NULL; +PFNGLGETPOINTERINDEXEDVEXTPROC glad_glGetPointerIndexedvEXT = NULL; +PFNGLGETPOINTERI_VEXTPROC glad_glGetPointeri_vEXT = NULL; +PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL; +PFNGLGETPOINTERVEXTPROC glad_glGetPointervEXT = NULL; +PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple = NULL; +PFNGLGETPROGRAMENVPARAMETERDVARBPROC glad_glGetProgramEnvParameterdvARB = NULL; +PFNGLGETPROGRAMENVPARAMETERFVARBPROC glad_glGetProgramEnvParameterfvARB = NULL; +PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; +PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glad_glGetProgramLocalParameterdvARB = NULL; +PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC glad_glGetProgramLocalParameterfvARB = NULL; +PFNGLGETPROGRAMPARAMETERDVNVPROC glad_glGetProgramParameterdvNV = NULL; +PFNGLGETPROGRAMPARAMETERFVNVPROC glad_glGetProgramParameterfvNV = NULL; +PFNGLGETPROGRAMSTRINGARBPROC glad_glGetProgramStringARB = NULL; +PFNGLGETPROGRAMSTRINGNVPROC glad_glGetProgramStringNV = NULL; +PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; +PFNGLGETPROGRAMIVARBPROC glad_glGetProgramivARB = NULL; +PFNGLGETPROGRAMIVNVPROC glad_glGetProgramivNV = NULL; +PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL; +PFNGLGETQUERYOBJECTI64VEXTPROC glad_glGetQueryObjecti64vEXT = NULL; +PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL; +PFNGLGETQUERYOBJECTIVARBPROC glad_glGetQueryObjectivARB = NULL; +PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL; +PFNGLGETQUERYOBJECTUI64VEXTPROC glad_glGetQueryObjectui64vEXT = NULL; +PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL; +PFNGLGETQUERYOBJECTUIVARBPROC glad_glGetQueryObjectuivARB = NULL; +PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL; +PFNGLGETQUERYIVARBPROC glad_glGetQueryivARB = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glad_glGetRenderbufferParameterivEXT = NULL; +PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv = NULL; +PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL; +PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; +PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; +PFNGLGETSEPARABLEFILTERPROC glad_glGetSeparableFilter = NULL; +PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; +PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; +PFNGLGETSHADERSOURCEARBPROC glad_glGetShaderSourceARB = NULL; +PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; +PFNGLGETSTRINGPROC glad_glGetString = NULL; +PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; +PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; +PFNGLGETTEXENVFVPROC glad_glGetTexEnvfv = NULL; +PFNGLGETTEXENVIVPROC glad_glGetTexEnviv = NULL; +PFNGLGETTEXGENDVPROC glad_glGetTexGendv = NULL; +PFNGLGETTEXGENFVPROC glad_glGetTexGenfv = NULL; +PFNGLGETTEXGENIVPROC glad_glGetTexGeniv = NULL; +PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL; +PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL; +PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL; +PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv = NULL; +PFNGLGETTEXPARAMETERIIVEXTPROC glad_glGetTexParameterIivEXT = NULL; +PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv = NULL; +PFNGLGETTEXPARAMETERIUIVEXTPROC glad_glGetTexParameterIuivEXT = NULL; +PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; +PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; +PFNGLGETTEXTUREIMAGEEXTPROC glad_glGetTextureImageEXT = NULL; +PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC glad_glGetTextureLevelParameterfvEXT = NULL; +PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC glad_glGetTextureLevelParameterivEXT = NULL; +PFNGLGETTEXTUREPARAMETERIIVEXTPROC glad_glGetTextureParameterIivEXT = NULL; +PFNGLGETTEXTUREPARAMETERIUIVEXTPROC glad_glGetTextureParameterIuivEXT = NULL; +PFNGLGETTEXTUREPARAMETERFVEXTPROC glad_glGetTextureParameterfvEXT = NULL; +PFNGLGETTEXTUREPARAMETERIVEXTPROC glad_glGetTextureParameterivEXT = NULL; +PFNGLGETTRACKMATRIXIVNVPROC glad_glGetTrackMatrixivNV = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC glad_glGetTransformFeedbackVaryingEXT = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC glad_glGetTransformFeedbackVaryingNV = NULL; +PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; +PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; +PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; +PFNGLGETUNIFORMLOCATIONARBPROC glad_glGetUniformLocationARB = NULL; +PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; +PFNGLGETUNIFORMFVARBPROC glad_glGetUniformfvARB = NULL; +PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; +PFNGLGETUNIFORMIVARBPROC glad_glGetUniformivARB = NULL; +PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; +PFNGLGETUNIFORMUIVEXTPROC glad_glGetUniformuivEXT = NULL; +PFNGLGETVARYINGLOCATIONNVPROC glad_glGetVaryingLocationNV = NULL; +PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC glad_glGetVertexArrayIntegeri_vEXT = NULL; +PFNGLGETVERTEXARRAYINTEGERVEXTPROC glad_glGetVertexArrayIntegervEXT = NULL; +PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC glad_glGetVertexArrayPointeri_vEXT = NULL; +PFNGLGETVERTEXARRAYPOINTERVEXTPROC glad_glGetVertexArrayPointervEXT = NULL; +PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; +PFNGLGETVERTEXATTRIBIIVEXTPROC glad_glGetVertexAttribIivEXT = NULL; +PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; +PFNGLGETVERTEXATTRIBIUIVEXTPROC glad_glGetVertexAttribIuivEXT = NULL; +PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; +PFNGLGETVERTEXATTRIBPOINTERVARBPROC glad_glGetVertexAttribPointervARB = NULL; +PFNGLGETVERTEXATTRIBPOINTERVNVPROC glad_glGetVertexAttribPointervNV = NULL; +PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL; +PFNGLGETVERTEXATTRIBDVARBPROC glad_glGetVertexAttribdvARB = NULL; +PFNGLGETVERTEXATTRIBDVNVPROC glad_glGetVertexAttribdvNV = NULL; +PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; +PFNGLGETVERTEXATTRIBFVARBPROC glad_glGetVertexAttribfvARB = NULL; +PFNGLGETVERTEXATTRIBFVNVPROC glad_glGetVertexAttribfvNV = NULL; +PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; +PFNGLGETVERTEXATTRIBIVARBPROC glad_glGetVertexAttribivARB = NULL; +PFNGLGETVERTEXATTRIBIVNVPROC glad_glGetVertexAttribivNV = NULL; +PFNGLHINTPROC glad_glHint = NULL; +PFNGLHISTOGRAMPROC glad_glHistogram = NULL; +PFNGLINDEXMASKPROC glad_glIndexMask = NULL; +PFNGLINDEXPOINTERPROC glad_glIndexPointer = NULL; +PFNGLINDEXPOINTEREXTPROC glad_glIndexPointerEXT = NULL; +PFNGLINDEXDPROC glad_glIndexd = NULL; +PFNGLINDEXDVPROC glad_glIndexdv = NULL; +PFNGLINDEXFPROC glad_glIndexf = NULL; +PFNGLINDEXFVPROC glad_glIndexfv = NULL; +PFNGLINDEXIPROC glad_glIndexi = NULL; +PFNGLINDEXIVPROC glad_glIndexiv = NULL; +PFNGLINDEXSPROC glad_glIndexs = NULL; +PFNGLINDEXSVPROC glad_glIndexsv = NULL; +PFNGLINDEXUBPROC glad_glIndexub = NULL; +PFNGLINDEXUBVPROC glad_glIndexubv = NULL; +PFNGLINITNAMESPROC glad_glInitNames = NULL; +PFNGLINTERLEAVEDARRAYSPROC glad_glInterleavedArrays = NULL; +PFNGLISBUFFERPROC glad_glIsBuffer = NULL; +PFNGLISBUFFERARBPROC glad_glIsBufferARB = NULL; +PFNGLISENABLEDPROC glad_glIsEnabled = NULL; +PFNGLISENABLEDINDEXEDEXTPROC glad_glIsEnabledIndexedEXT = NULL; +PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL; +PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; +PFNGLISFRAMEBUFFEREXTPROC glad_glIsFramebufferEXT = NULL; +PFNGLISLISTPROC glad_glIsList = NULL; +PFNGLISPROGRAMPROC glad_glIsProgram = NULL; +PFNGLISPROGRAMARBPROC glad_glIsProgramARB = NULL; +PFNGLISPROGRAMNVPROC glad_glIsProgramNV = NULL; +PFNGLISQUERYPROC glad_glIsQuery = NULL; +PFNGLISQUERYARBPROC glad_glIsQueryARB = NULL; +PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; +PFNGLISRENDERBUFFEREXTPROC glad_glIsRenderbufferEXT = NULL; +PFNGLISSAMPLERPROC glad_glIsSampler = NULL; +PFNGLISSHADERPROC glad_glIsShader = NULL; +PFNGLISSYNCPROC glad_glIsSync = NULL; +PFNGLISTEXTUREPROC glad_glIsTexture = NULL; +PFNGLISTEXTUREEXTPROC glad_glIsTextureEXT = NULL; +PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; +PFNGLISVERTEXARRAYAPPLEPROC glad_glIsVertexArrayAPPLE = NULL; +PFNGLLIGHTMODELFPROC glad_glLightModelf = NULL; +PFNGLLIGHTMODELFVPROC glad_glLightModelfv = NULL; +PFNGLLIGHTMODELIPROC glad_glLightModeli = NULL; +PFNGLLIGHTMODELIVPROC glad_glLightModeliv = NULL; +PFNGLLIGHTFPROC glad_glLightf = NULL; +PFNGLLIGHTFVPROC glad_glLightfv = NULL; +PFNGLLIGHTIPROC glad_glLighti = NULL; +PFNGLLIGHTIVPROC glad_glLightiv = NULL; +PFNGLLINESTIPPLEPROC glad_glLineStipple = NULL; +PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; +PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; +PFNGLLINKPROGRAMARBPROC glad_glLinkProgramARB = NULL; +PFNGLLISTBASEPROC glad_glListBase = NULL; +PFNGLLOADIDENTITYPROC glad_glLoadIdentity = NULL; +PFNGLLOADMATRIXDPROC glad_glLoadMatrixd = NULL; +PFNGLLOADMATRIXFPROC glad_glLoadMatrixf = NULL; +PFNGLLOADNAMEPROC glad_glLoadName = NULL; +PFNGLLOADPROGRAMNVPROC glad_glLoadProgramNV = NULL; +PFNGLLOADTRANSPOSEMATRIXDPROC glad_glLoadTransposeMatrixd = NULL; +PFNGLLOADTRANSPOSEMATRIXDARBPROC glad_glLoadTransposeMatrixdARB = NULL; +PFNGLLOADTRANSPOSEMATRIXFPROC glad_glLoadTransposeMatrixf = NULL; +PFNGLLOADTRANSPOSEMATRIXFARBPROC glad_glLoadTransposeMatrixfARB = NULL; +PFNGLLOGICOPPROC glad_glLogicOp = NULL; +PFNGLMAP1DPROC glad_glMap1d = NULL; +PFNGLMAP1FPROC glad_glMap1f = NULL; +PFNGLMAP2DPROC glad_glMap2d = NULL; +PFNGLMAP2FPROC glad_glMap2f = NULL; +PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL; +PFNGLMAPBUFFERARBPROC glad_glMapBufferARB = NULL; +PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; +PFNGLMAPGRID1DPROC glad_glMapGrid1d = NULL; +PFNGLMAPGRID1FPROC glad_glMapGrid1f = NULL; +PFNGLMAPGRID2DPROC glad_glMapGrid2d = NULL; +PFNGLMAPGRID2FPROC glad_glMapGrid2f = NULL; +PFNGLMAPNAMEDBUFFEREXTPROC glad_glMapNamedBufferEXT = NULL; +PFNGLMAPNAMEDBUFFERRANGEEXTPROC glad_glMapNamedBufferRangeEXT = NULL; +PFNGLMATERIALFPROC glad_glMaterialf = NULL; +PFNGLMATERIALFVPROC glad_glMaterialfv = NULL; +PFNGLMATERIALIPROC glad_glMateriali = NULL; +PFNGLMATERIALIVPROC glad_glMaterialiv = NULL; +PFNGLMATRIXFRUSTUMEXTPROC glad_glMatrixFrustumEXT = NULL; +PFNGLMATRIXLOADIDENTITYEXTPROC glad_glMatrixLoadIdentityEXT = NULL; +PFNGLMATRIXLOADTRANSPOSEDEXTPROC glad_glMatrixLoadTransposedEXT = NULL; +PFNGLMATRIXLOADTRANSPOSEFEXTPROC glad_glMatrixLoadTransposefEXT = NULL; +PFNGLMATRIXLOADDEXTPROC glad_glMatrixLoaddEXT = NULL; +PFNGLMATRIXLOADFEXTPROC glad_glMatrixLoadfEXT = NULL; +PFNGLMATRIXMODEPROC glad_glMatrixMode = NULL; +PFNGLMATRIXMULTTRANSPOSEDEXTPROC glad_glMatrixMultTransposedEXT = NULL; +PFNGLMATRIXMULTTRANSPOSEFEXTPROC glad_glMatrixMultTransposefEXT = NULL; +PFNGLMATRIXMULTDEXTPROC glad_glMatrixMultdEXT = NULL; +PFNGLMATRIXMULTFEXTPROC glad_glMatrixMultfEXT = NULL; +PFNGLMATRIXORTHOEXTPROC glad_glMatrixOrthoEXT = NULL; +PFNGLMATRIXPOPEXTPROC glad_glMatrixPopEXT = NULL; +PFNGLMATRIXPUSHEXTPROC glad_glMatrixPushEXT = NULL; +PFNGLMATRIXROTATEDEXTPROC glad_glMatrixRotatedEXT = NULL; +PFNGLMATRIXROTATEFEXTPROC glad_glMatrixRotatefEXT = NULL; +PFNGLMATRIXSCALEDEXTPROC glad_glMatrixScaledEXT = NULL; +PFNGLMATRIXSCALEFEXTPROC glad_glMatrixScalefEXT = NULL; +PFNGLMATRIXTRANSLATEDEXTPROC glad_glMatrixTranslatedEXT = NULL; +PFNGLMATRIXTRANSLATEFEXTPROC glad_glMatrixTranslatefEXT = NULL; +PFNGLMINMAXPROC glad_glMinmax = NULL; +PFNGLMULTMATRIXDPROC glad_glMultMatrixd = NULL; +PFNGLMULTMATRIXFPROC glad_glMultMatrixf = NULL; +PFNGLMULTTRANSPOSEMATRIXDPROC glad_glMultTransposeMatrixd = NULL; +PFNGLMULTTRANSPOSEMATRIXDARBPROC glad_glMultTransposeMatrixdARB = NULL; +PFNGLMULTTRANSPOSEMATRIXFPROC glad_glMultTransposeMatrixf = NULL; +PFNGLMULTTRANSPOSEMATRIXFARBPROC glad_glMultTransposeMatrixfARB = NULL; +PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL; +PFNGLMULTIDRAWARRAYSEXTPROC glad_glMultiDrawArraysEXT = NULL; +PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL; +PFNGLMULTIDRAWELEMENTSEXTPROC glad_glMultiDrawElementsEXT = NULL; +PFNGLMULTITEXBUFFEREXTPROC glad_glMultiTexBufferEXT = NULL; +PFNGLMULTITEXCOORD1DPROC glad_glMultiTexCoord1d = NULL; +PFNGLMULTITEXCOORD1DARBPROC glad_glMultiTexCoord1dARB = NULL; +PFNGLMULTITEXCOORD1DVPROC glad_glMultiTexCoord1dv = NULL; +PFNGLMULTITEXCOORD1DVARBPROC glad_glMultiTexCoord1dvARB = NULL; +PFNGLMULTITEXCOORD1FPROC glad_glMultiTexCoord1f = NULL; +PFNGLMULTITEXCOORD1FARBPROC glad_glMultiTexCoord1fARB = NULL; +PFNGLMULTITEXCOORD1FVPROC glad_glMultiTexCoord1fv = NULL; +PFNGLMULTITEXCOORD1FVARBPROC glad_glMultiTexCoord1fvARB = NULL; +PFNGLMULTITEXCOORD1IPROC glad_glMultiTexCoord1i = NULL; +PFNGLMULTITEXCOORD1IARBPROC glad_glMultiTexCoord1iARB = NULL; +PFNGLMULTITEXCOORD1IVPROC glad_glMultiTexCoord1iv = NULL; +PFNGLMULTITEXCOORD1IVARBPROC glad_glMultiTexCoord1ivARB = NULL; +PFNGLMULTITEXCOORD1SPROC glad_glMultiTexCoord1s = NULL; +PFNGLMULTITEXCOORD1SARBPROC glad_glMultiTexCoord1sARB = NULL; +PFNGLMULTITEXCOORD1SVPROC glad_glMultiTexCoord1sv = NULL; +PFNGLMULTITEXCOORD1SVARBPROC glad_glMultiTexCoord1svARB = NULL; +PFNGLMULTITEXCOORD2DPROC glad_glMultiTexCoord2d = NULL; +PFNGLMULTITEXCOORD2DARBPROC glad_glMultiTexCoord2dARB = NULL; +PFNGLMULTITEXCOORD2DVPROC glad_glMultiTexCoord2dv = NULL; +PFNGLMULTITEXCOORD2DVARBPROC glad_glMultiTexCoord2dvARB = NULL; +PFNGLMULTITEXCOORD2FPROC glad_glMultiTexCoord2f = NULL; +PFNGLMULTITEXCOORD2FARBPROC glad_glMultiTexCoord2fARB = NULL; +PFNGLMULTITEXCOORD2FVPROC glad_glMultiTexCoord2fv = NULL; +PFNGLMULTITEXCOORD2FVARBPROC glad_glMultiTexCoord2fvARB = NULL; +PFNGLMULTITEXCOORD2IPROC glad_glMultiTexCoord2i = NULL; +PFNGLMULTITEXCOORD2IARBPROC glad_glMultiTexCoord2iARB = NULL; +PFNGLMULTITEXCOORD2IVPROC glad_glMultiTexCoord2iv = NULL; +PFNGLMULTITEXCOORD2IVARBPROC glad_glMultiTexCoord2ivARB = NULL; +PFNGLMULTITEXCOORD2SPROC glad_glMultiTexCoord2s = NULL; +PFNGLMULTITEXCOORD2SARBPROC glad_glMultiTexCoord2sARB = NULL; +PFNGLMULTITEXCOORD2SVPROC glad_glMultiTexCoord2sv = NULL; +PFNGLMULTITEXCOORD2SVARBPROC glad_glMultiTexCoord2svARB = NULL; +PFNGLMULTITEXCOORD3DPROC glad_glMultiTexCoord3d = NULL; +PFNGLMULTITEXCOORD3DARBPROC glad_glMultiTexCoord3dARB = NULL; +PFNGLMULTITEXCOORD3DVPROC glad_glMultiTexCoord3dv = NULL; +PFNGLMULTITEXCOORD3DVARBPROC glad_glMultiTexCoord3dvARB = NULL; +PFNGLMULTITEXCOORD3FPROC glad_glMultiTexCoord3f = NULL; +PFNGLMULTITEXCOORD3FARBPROC glad_glMultiTexCoord3fARB = NULL; +PFNGLMULTITEXCOORD3FVPROC glad_glMultiTexCoord3fv = NULL; +PFNGLMULTITEXCOORD3FVARBPROC glad_glMultiTexCoord3fvARB = NULL; +PFNGLMULTITEXCOORD3IPROC glad_glMultiTexCoord3i = NULL; +PFNGLMULTITEXCOORD3IARBPROC glad_glMultiTexCoord3iARB = NULL; +PFNGLMULTITEXCOORD3IVPROC glad_glMultiTexCoord3iv = NULL; +PFNGLMULTITEXCOORD3IVARBPROC glad_glMultiTexCoord3ivARB = NULL; +PFNGLMULTITEXCOORD3SPROC glad_glMultiTexCoord3s = NULL; +PFNGLMULTITEXCOORD3SARBPROC glad_glMultiTexCoord3sARB = NULL; +PFNGLMULTITEXCOORD3SVPROC glad_glMultiTexCoord3sv = NULL; +PFNGLMULTITEXCOORD3SVARBPROC glad_glMultiTexCoord3svARB = NULL; +PFNGLMULTITEXCOORD4DPROC glad_glMultiTexCoord4d = NULL; +PFNGLMULTITEXCOORD4DARBPROC glad_glMultiTexCoord4dARB = NULL; +PFNGLMULTITEXCOORD4DVPROC glad_glMultiTexCoord4dv = NULL; +PFNGLMULTITEXCOORD4DVARBPROC glad_glMultiTexCoord4dvARB = NULL; +PFNGLMULTITEXCOORD4FPROC glad_glMultiTexCoord4f = NULL; +PFNGLMULTITEXCOORD4FARBPROC glad_glMultiTexCoord4fARB = NULL; +PFNGLMULTITEXCOORD4FVPROC glad_glMultiTexCoord4fv = NULL; +PFNGLMULTITEXCOORD4FVARBPROC glad_glMultiTexCoord4fvARB = NULL; +PFNGLMULTITEXCOORD4IPROC glad_glMultiTexCoord4i = NULL; +PFNGLMULTITEXCOORD4IARBPROC glad_glMultiTexCoord4iARB = NULL; +PFNGLMULTITEXCOORD4IVPROC glad_glMultiTexCoord4iv = NULL; +PFNGLMULTITEXCOORD4IVARBPROC glad_glMultiTexCoord4ivARB = NULL; +PFNGLMULTITEXCOORD4SPROC glad_glMultiTexCoord4s = NULL; +PFNGLMULTITEXCOORD4SARBPROC glad_glMultiTexCoord4sARB = NULL; +PFNGLMULTITEXCOORD4SVPROC glad_glMultiTexCoord4sv = NULL; +PFNGLMULTITEXCOORD4SVARBPROC glad_glMultiTexCoord4svARB = NULL; +PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui = NULL; +PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv = NULL; +PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui = NULL; +PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv = NULL; +PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui = NULL; +PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv = NULL; +PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui = NULL; +PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv = NULL; +PFNGLMULTITEXCOORDPOINTEREXTPROC glad_glMultiTexCoordPointerEXT = NULL; +PFNGLMULTITEXENVFEXTPROC glad_glMultiTexEnvfEXT = NULL; +PFNGLMULTITEXENVFVEXTPROC glad_glMultiTexEnvfvEXT = NULL; +PFNGLMULTITEXENVIEXTPROC glad_glMultiTexEnviEXT = NULL; +PFNGLMULTITEXENVIVEXTPROC glad_glMultiTexEnvivEXT = NULL; +PFNGLMULTITEXGENDEXTPROC glad_glMultiTexGendEXT = NULL; +PFNGLMULTITEXGENDVEXTPROC glad_glMultiTexGendvEXT = NULL; +PFNGLMULTITEXGENFEXTPROC glad_glMultiTexGenfEXT = NULL; +PFNGLMULTITEXGENFVEXTPROC glad_glMultiTexGenfvEXT = NULL; +PFNGLMULTITEXGENIEXTPROC glad_glMultiTexGeniEXT = NULL; +PFNGLMULTITEXGENIVEXTPROC glad_glMultiTexGenivEXT = NULL; +PFNGLMULTITEXIMAGE1DEXTPROC glad_glMultiTexImage1DEXT = NULL; +PFNGLMULTITEXIMAGE2DEXTPROC glad_glMultiTexImage2DEXT = NULL; +PFNGLMULTITEXIMAGE3DEXTPROC glad_glMultiTexImage3DEXT = NULL; +PFNGLMULTITEXPARAMETERIIVEXTPROC glad_glMultiTexParameterIivEXT = NULL; +PFNGLMULTITEXPARAMETERIUIVEXTPROC glad_glMultiTexParameterIuivEXT = NULL; +PFNGLMULTITEXPARAMETERFEXTPROC glad_glMultiTexParameterfEXT = NULL; +PFNGLMULTITEXPARAMETERFVEXTPROC glad_glMultiTexParameterfvEXT = NULL; +PFNGLMULTITEXPARAMETERIEXTPROC glad_glMultiTexParameteriEXT = NULL; +PFNGLMULTITEXPARAMETERIVEXTPROC glad_glMultiTexParameterivEXT = NULL; +PFNGLMULTITEXRENDERBUFFEREXTPROC glad_glMultiTexRenderbufferEXT = NULL; +PFNGLMULTITEXSUBIMAGE1DEXTPROC glad_glMultiTexSubImage1DEXT = NULL; +PFNGLMULTITEXSUBIMAGE2DEXTPROC glad_glMultiTexSubImage2DEXT = NULL; +PFNGLMULTITEXSUBIMAGE3DEXTPROC glad_glMultiTexSubImage3DEXT = NULL; +PFNGLNAMEDBUFFERDATAEXTPROC glad_glNamedBufferDataEXT = NULL; +PFNGLNAMEDBUFFERSTORAGEEXTPROC glad_glNamedBufferStorageEXT = NULL; +PFNGLNAMEDBUFFERSUBDATAEXTPROC glad_glNamedBufferSubDataEXT = NULL; +PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC glad_glNamedCopyBufferSubDataEXT = NULL; +PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC glad_glNamedFramebufferParameteriEXT = NULL; +PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC glad_glNamedFramebufferRenderbufferEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC glad_glNamedFramebufferTexture1DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC glad_glNamedFramebufferTexture2DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC glad_glNamedFramebufferTexture3DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC glad_glNamedFramebufferTextureEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC glad_glNamedFramebufferTextureFaceEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC glad_glNamedFramebufferTextureLayerEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC glad_glNamedProgramLocalParameter4dEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC glad_glNamedProgramLocalParameter4dvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC glad_glNamedProgramLocalParameter4fEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC glad_glNamedProgramLocalParameter4fvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC glad_glNamedProgramLocalParameterI4iEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC glad_glNamedProgramLocalParameterI4ivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC glad_glNamedProgramLocalParameterI4uiEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC glad_glNamedProgramLocalParameterI4uivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC glad_glNamedProgramLocalParameters4fvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC glad_glNamedProgramLocalParametersI4ivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC glad_glNamedProgramLocalParametersI4uivEXT = NULL; +PFNGLNAMEDPROGRAMSTRINGEXTPROC glad_glNamedProgramStringEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC glad_glNamedRenderbufferStorageEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC glad_glNamedRenderbufferStorageMultisampleCoverageEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glNamedRenderbufferStorageMultisampleEXT = NULL; +PFNGLNEWLISTPROC glad_glNewList = NULL; +PFNGLNORMAL3BPROC glad_glNormal3b = NULL; +PFNGLNORMAL3BVPROC glad_glNormal3bv = NULL; +PFNGLNORMAL3DPROC glad_glNormal3d = NULL; +PFNGLNORMAL3DVPROC glad_glNormal3dv = NULL; +PFNGLNORMAL3FPROC glad_glNormal3f = NULL; +PFNGLNORMAL3FVPROC glad_glNormal3fv = NULL; +PFNGLNORMAL3IPROC glad_glNormal3i = NULL; +PFNGLNORMAL3IVPROC glad_glNormal3iv = NULL; +PFNGLNORMAL3SPROC glad_glNormal3s = NULL; +PFNGLNORMAL3SVPROC glad_glNormal3sv = NULL; +PFNGLNORMALP3UIPROC glad_glNormalP3ui = NULL; +PFNGLNORMALP3UIVPROC glad_glNormalP3uiv = NULL; +PFNGLNORMALPOINTERPROC glad_glNormalPointer = NULL; +PFNGLNORMALPOINTEREXTPROC glad_glNormalPointerEXT = NULL; +PFNGLOBJECTLABELPROC glad_glObjectLabel = NULL; +PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel = NULL; +PFNGLORTHOPROC glad_glOrtho = NULL; +PFNGLPASSTHROUGHPROC glad_glPassThrough = NULL; +PFNGLPIXELMAPFVPROC glad_glPixelMapfv = NULL; +PFNGLPIXELMAPUIVPROC glad_glPixelMapuiv = NULL; +PFNGLPIXELMAPUSVPROC glad_glPixelMapusv = NULL; +PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL; +PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; +PFNGLPIXELTRANSFERFPROC glad_glPixelTransferf = NULL; +PFNGLPIXELTRANSFERIPROC glad_glPixelTransferi = NULL; +PFNGLPIXELZOOMPROC glad_glPixelZoom = NULL; +PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL; +PFNGLPOINTPARAMETERFARBPROC glad_glPointParameterfARB = NULL; +PFNGLPOINTPARAMETERFEXTPROC glad_glPointParameterfEXT = NULL; +PFNGLPOINTPARAMETERFSGISPROC glad_glPointParameterfSGIS = NULL; +PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL; +PFNGLPOINTPARAMETERFVARBPROC glad_glPointParameterfvARB = NULL; +PFNGLPOINTPARAMETERFVEXTPROC glad_glPointParameterfvEXT = NULL; +PFNGLPOINTPARAMETERFVSGISPROC glad_glPointParameterfvSGIS = NULL; +PFNGLPOINTPARAMETERIPROC glad_glPointParameteri = NULL; +PFNGLPOINTPARAMETERINVPROC glad_glPointParameteriNV = NULL; +PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL; +PFNGLPOINTPARAMETERIVNVPROC glad_glPointParameterivNV = NULL; +PFNGLPOINTSIZEPROC glad_glPointSize = NULL; +PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL; +PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; +PFNGLPOLYGONSTIPPLEPROC glad_glPolygonStipple = NULL; +PFNGLPOPATTRIBPROC glad_glPopAttrib = NULL; +PFNGLPOPCLIENTATTRIBPROC glad_glPopClientAttrib = NULL; +PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup = NULL; +PFNGLPOPMATRIXPROC glad_glPopMatrix = NULL; +PFNGLPOPNAMEPROC glad_glPopName = NULL; +PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL; +PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures = NULL; +PFNGLPRIORITIZETEXTURESEXTPROC glad_glPrioritizeTexturesEXT = NULL; +PFNGLPROGRAMENVPARAMETER4DARBPROC glad_glProgramEnvParameter4dARB = NULL; +PFNGLPROGRAMENVPARAMETER4DVARBPROC glad_glProgramEnvParameter4dvARB = NULL; +PFNGLPROGRAMENVPARAMETER4FARBPROC glad_glProgramEnvParameter4fARB = NULL; +PFNGLPROGRAMENVPARAMETER4FVARBPROC glad_glProgramEnvParameter4fvARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4DARBPROC glad_glProgramLocalParameter4dARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4DVARBPROC glad_glProgramLocalParameter4dvARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FARBPROC glad_glProgramLocalParameter4fARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glad_glProgramLocalParameter4fvARB = NULL; +PFNGLPROGRAMPARAMETER4DNVPROC glad_glProgramParameter4dNV = NULL; +PFNGLPROGRAMPARAMETER4DVNVPROC glad_glProgramParameter4dvNV = NULL; +PFNGLPROGRAMPARAMETER4FNVPROC glad_glProgramParameter4fNV = NULL; +PFNGLPROGRAMPARAMETER4FVNVPROC glad_glProgramParameter4fvNV = NULL; +PFNGLPROGRAMPARAMETERIARBPROC glad_glProgramParameteriARB = NULL; +PFNGLPROGRAMPARAMETERS4DVNVPROC glad_glProgramParameters4dvNV = NULL; +PFNGLPROGRAMPARAMETERS4FVNVPROC glad_glProgramParameters4fvNV = NULL; +PFNGLPROGRAMSTRINGARBPROC glad_glProgramStringARB = NULL; +PFNGLPROGRAMUNIFORM1DEXTPROC glad_glProgramUniform1dEXT = NULL; +PFNGLPROGRAMUNIFORM1DVEXTPROC glad_glProgramUniform1dvEXT = NULL; +PFNGLPROGRAMUNIFORM1FEXTPROC glad_glProgramUniform1fEXT = NULL; +PFNGLPROGRAMUNIFORM1FVEXTPROC glad_glProgramUniform1fvEXT = NULL; +PFNGLPROGRAMUNIFORM1IEXTPROC glad_glProgramUniform1iEXT = NULL; +PFNGLPROGRAMUNIFORM1IVEXTPROC glad_glProgramUniform1ivEXT = NULL; +PFNGLPROGRAMUNIFORM1UIEXTPROC glad_glProgramUniform1uiEXT = NULL; +PFNGLPROGRAMUNIFORM1UIVEXTPROC glad_glProgramUniform1uivEXT = NULL; +PFNGLPROGRAMUNIFORM2DEXTPROC glad_glProgramUniform2dEXT = NULL; +PFNGLPROGRAMUNIFORM2DVEXTPROC glad_glProgramUniform2dvEXT = NULL; +PFNGLPROGRAMUNIFORM2FEXTPROC glad_glProgramUniform2fEXT = NULL; +PFNGLPROGRAMUNIFORM2FVEXTPROC glad_glProgramUniform2fvEXT = NULL; +PFNGLPROGRAMUNIFORM2IEXTPROC glad_glProgramUniform2iEXT = NULL; +PFNGLPROGRAMUNIFORM2IVEXTPROC glad_glProgramUniform2ivEXT = NULL; +PFNGLPROGRAMUNIFORM2UIEXTPROC glad_glProgramUniform2uiEXT = NULL; +PFNGLPROGRAMUNIFORM2UIVEXTPROC glad_glProgramUniform2uivEXT = NULL; +PFNGLPROGRAMUNIFORM3DEXTPROC glad_glProgramUniform3dEXT = NULL; +PFNGLPROGRAMUNIFORM3DVEXTPROC glad_glProgramUniform3dvEXT = NULL; +PFNGLPROGRAMUNIFORM3FEXTPROC glad_glProgramUniform3fEXT = NULL; +PFNGLPROGRAMUNIFORM3FVEXTPROC glad_glProgramUniform3fvEXT = NULL; +PFNGLPROGRAMUNIFORM3IEXTPROC glad_glProgramUniform3iEXT = NULL; +PFNGLPROGRAMUNIFORM3IVEXTPROC glad_glProgramUniform3ivEXT = NULL; +PFNGLPROGRAMUNIFORM3UIEXTPROC glad_glProgramUniform3uiEXT = NULL; +PFNGLPROGRAMUNIFORM3UIVEXTPROC glad_glProgramUniform3uivEXT = NULL; +PFNGLPROGRAMUNIFORM4DEXTPROC glad_glProgramUniform4dEXT = NULL; +PFNGLPROGRAMUNIFORM4DVEXTPROC glad_glProgramUniform4dvEXT = NULL; +PFNGLPROGRAMUNIFORM4FEXTPROC glad_glProgramUniform4fEXT = NULL; +PFNGLPROGRAMUNIFORM4FVEXTPROC glad_glProgramUniform4fvEXT = NULL; +PFNGLPROGRAMUNIFORM4IEXTPROC glad_glProgramUniform4iEXT = NULL; +PFNGLPROGRAMUNIFORM4IVEXTPROC glad_glProgramUniform4ivEXT = NULL; +PFNGLPROGRAMUNIFORM4UIEXTPROC glad_glProgramUniform4uiEXT = NULL; +PFNGLPROGRAMUNIFORM4UIVEXTPROC glad_glProgramUniform4uivEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC glad_glProgramUniformMatrix2dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC glad_glProgramUniformMatrix2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC glad_glProgramUniformMatrix2x3dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC glad_glProgramUniformMatrix2x3fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC glad_glProgramUniformMatrix2x4dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC glad_glProgramUniformMatrix2x4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC glad_glProgramUniformMatrix3dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC glad_glProgramUniformMatrix3fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC glad_glProgramUniformMatrix3x2dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC glad_glProgramUniformMatrix3x2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC glad_glProgramUniformMatrix3x4dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC glad_glProgramUniformMatrix3x4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC glad_glProgramUniformMatrix4dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC glad_glProgramUniformMatrix4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC glad_glProgramUniformMatrix4x2dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC glad_glProgramUniformMatrix4x2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC glad_glProgramUniformMatrix4x3dvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC glad_glProgramUniformMatrix4x3fvEXT = NULL; +PFNGLPROGRAMVERTEXLIMITNVPROC glad_glProgramVertexLimitNV = NULL; +PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL; +PFNGLPROVOKINGVERTEXEXTPROC glad_glProvokingVertexEXT = NULL; +PFNGLPUSHATTRIBPROC glad_glPushAttrib = NULL; +PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib = NULL; +PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC glad_glPushClientAttribDefaultEXT = NULL; +PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup = NULL; +PFNGLPUSHMATRIXPROC glad_glPushMatrix = NULL; +PFNGLPUSHNAMEPROC glad_glPushName = NULL; +PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL; +PFNGLRASTERPOS2DPROC glad_glRasterPos2d = NULL; +PFNGLRASTERPOS2DVPROC glad_glRasterPos2dv = NULL; +PFNGLRASTERPOS2FPROC glad_glRasterPos2f = NULL; +PFNGLRASTERPOS2FVPROC glad_glRasterPos2fv = NULL; +PFNGLRASTERPOS2IPROC glad_glRasterPos2i = NULL; +PFNGLRASTERPOS2IVPROC glad_glRasterPos2iv = NULL; +PFNGLRASTERPOS2SPROC glad_glRasterPos2s = NULL; +PFNGLRASTERPOS2SVPROC glad_glRasterPos2sv = NULL; +PFNGLRASTERPOS3DPROC glad_glRasterPos3d = NULL; +PFNGLRASTERPOS3DVPROC glad_glRasterPos3dv = NULL; +PFNGLRASTERPOS3FPROC glad_glRasterPos3f = NULL; +PFNGLRASTERPOS3FVPROC glad_glRasterPos3fv = NULL; +PFNGLRASTERPOS3IPROC glad_glRasterPos3i = NULL; +PFNGLRASTERPOS3IVPROC glad_glRasterPos3iv = NULL; +PFNGLRASTERPOS3SPROC glad_glRasterPos3s = NULL; +PFNGLRASTERPOS3SVPROC glad_glRasterPos3sv = NULL; +PFNGLRASTERPOS4DPROC glad_glRasterPos4d = NULL; +PFNGLRASTERPOS4DVPROC glad_glRasterPos4dv = NULL; +PFNGLRASTERPOS4FPROC glad_glRasterPos4f = NULL; +PFNGLRASTERPOS4FVPROC glad_glRasterPos4fv = NULL; +PFNGLRASTERPOS4IPROC glad_glRasterPos4i = NULL; +PFNGLRASTERPOS4IVPROC glad_glRasterPos4iv = NULL; +PFNGLRASTERPOS4SPROC glad_glRasterPos4s = NULL; +PFNGLRASTERPOS4SVPROC glad_glRasterPos4sv = NULL; +PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; +PFNGLREADPIXELSPROC glad_glReadPixels = NULL; +PFNGLRECTDPROC glad_glRectd = NULL; +PFNGLRECTDVPROC glad_glRectdv = NULL; +PFNGLRECTFPROC glad_glRectf = NULL; +PFNGLRECTFVPROC glad_glRectfv = NULL; +PFNGLRECTIPROC glad_glRecti = NULL; +PFNGLRECTIVPROC glad_glRectiv = NULL; +PFNGLRECTSPROC glad_glRects = NULL; +PFNGLRECTSVPROC glad_glRectsv = NULL; +PFNGLRENDERMODEPROC glad_glRenderMode = NULL; +PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; +PFNGLRENDERBUFFERSTORAGEEXTPROC glad_glRenderbufferStorageEXT = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glad_glRenderbufferStorageMultisampleEXT = NULL; +PFNGLREQUESTRESIDENTPROGRAMSNVPROC glad_glRequestResidentProgramsNV = NULL; +PFNGLRESETHISTOGRAMPROC glad_glResetHistogram = NULL; +PFNGLRESETMINMAXPROC glad_glResetMinmax = NULL; +PFNGLROTATEDPROC glad_glRotated = NULL; +PFNGLROTATEFPROC glad_glRotatef = NULL; +PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; +PFNGLSAMPLECOVERAGEARBPROC glad_glSampleCoverageARB = NULL; +PFNGLSAMPLEMASKINDEXEDNVPROC glad_glSampleMaskIndexedNV = NULL; +PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL; +PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL; +PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv = NULL; +PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL; +PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; +PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; +PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; +PFNGLSCALEDPROC glad_glScaled = NULL; +PFNGLSCALEFPROC glad_glScalef = NULL; +PFNGLSCISSORPROC glad_glScissor = NULL; +PFNGLSECONDARYCOLOR3BPROC glad_glSecondaryColor3b = NULL; +PFNGLSECONDARYCOLOR3BEXTPROC glad_glSecondaryColor3bEXT = NULL; +PFNGLSECONDARYCOLOR3BVPROC glad_glSecondaryColor3bv = NULL; +PFNGLSECONDARYCOLOR3BVEXTPROC glad_glSecondaryColor3bvEXT = NULL; +PFNGLSECONDARYCOLOR3DPROC glad_glSecondaryColor3d = NULL; +PFNGLSECONDARYCOLOR3DEXTPROC glad_glSecondaryColor3dEXT = NULL; +PFNGLSECONDARYCOLOR3DVPROC glad_glSecondaryColor3dv = NULL; +PFNGLSECONDARYCOLOR3DVEXTPROC glad_glSecondaryColor3dvEXT = NULL; +PFNGLSECONDARYCOLOR3FPROC glad_glSecondaryColor3f = NULL; +PFNGLSECONDARYCOLOR3FEXTPROC glad_glSecondaryColor3fEXT = NULL; +PFNGLSECONDARYCOLOR3FVPROC glad_glSecondaryColor3fv = NULL; +PFNGLSECONDARYCOLOR3FVEXTPROC glad_glSecondaryColor3fvEXT = NULL; +PFNGLSECONDARYCOLOR3IPROC glad_glSecondaryColor3i = NULL; +PFNGLSECONDARYCOLOR3IEXTPROC glad_glSecondaryColor3iEXT = NULL; +PFNGLSECONDARYCOLOR3IVPROC glad_glSecondaryColor3iv = NULL; +PFNGLSECONDARYCOLOR3IVEXTPROC glad_glSecondaryColor3ivEXT = NULL; +PFNGLSECONDARYCOLOR3SPROC glad_glSecondaryColor3s = NULL; +PFNGLSECONDARYCOLOR3SEXTPROC glad_glSecondaryColor3sEXT = NULL; +PFNGLSECONDARYCOLOR3SVPROC glad_glSecondaryColor3sv = NULL; +PFNGLSECONDARYCOLOR3SVEXTPROC glad_glSecondaryColor3svEXT = NULL; +PFNGLSECONDARYCOLOR3UBPROC glad_glSecondaryColor3ub = NULL; +PFNGLSECONDARYCOLOR3UBEXTPROC glad_glSecondaryColor3ubEXT = NULL; +PFNGLSECONDARYCOLOR3UBVPROC glad_glSecondaryColor3ubv = NULL; +PFNGLSECONDARYCOLOR3UBVEXTPROC glad_glSecondaryColor3ubvEXT = NULL; +PFNGLSECONDARYCOLOR3UIPROC glad_glSecondaryColor3ui = NULL; +PFNGLSECONDARYCOLOR3UIEXTPROC glad_glSecondaryColor3uiEXT = NULL; +PFNGLSECONDARYCOLOR3UIVPROC glad_glSecondaryColor3uiv = NULL; +PFNGLSECONDARYCOLOR3UIVEXTPROC glad_glSecondaryColor3uivEXT = NULL; +PFNGLSECONDARYCOLOR3USPROC glad_glSecondaryColor3us = NULL; +PFNGLSECONDARYCOLOR3USEXTPROC glad_glSecondaryColor3usEXT = NULL; +PFNGLSECONDARYCOLOR3USVPROC glad_glSecondaryColor3usv = NULL; +PFNGLSECONDARYCOLOR3USVEXTPROC glad_glSecondaryColor3usvEXT = NULL; +PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui = NULL; +PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv = NULL; +PFNGLSECONDARYCOLORPOINTERPROC glad_glSecondaryColorPointer = NULL; +PFNGLSECONDARYCOLORPOINTEREXTPROC glad_glSecondaryColorPointerEXT = NULL; +PFNGLSELECTBUFFERPROC glad_glSelectBuffer = NULL; +PFNGLSEPARABLEFILTER2DPROC glad_glSeparableFilter2D = NULL; +PFNGLSHADEMODELPROC glad_glShadeModel = NULL; +PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; +PFNGLSHADERSOURCEARBPROC glad_glShaderSourceARB = NULL; +PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; +PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; +PFNGLSTENCILFUNCSEPARATEATIPROC glad_glStencilFuncSeparateATI = NULL; +PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; +PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; +PFNGLSTENCILOPPROC glad_glStencilOp = NULL; +PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; +PFNGLSTENCILOPSEPARATEATIPROC glad_glStencilOpSeparateATI = NULL; +PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL; +PFNGLTEXBUFFERARBPROC glad_glTexBufferARB = NULL; +PFNGLTEXBUFFEREXTPROC glad_glTexBufferEXT = NULL; +PFNGLTEXCOORD1DPROC glad_glTexCoord1d = NULL; +PFNGLTEXCOORD1DVPROC glad_glTexCoord1dv = NULL; +PFNGLTEXCOORD1FPROC glad_glTexCoord1f = NULL; +PFNGLTEXCOORD1FVPROC glad_glTexCoord1fv = NULL; +PFNGLTEXCOORD1IPROC glad_glTexCoord1i = NULL; +PFNGLTEXCOORD1IVPROC glad_glTexCoord1iv = NULL; +PFNGLTEXCOORD1SPROC glad_glTexCoord1s = NULL; +PFNGLTEXCOORD1SVPROC glad_glTexCoord1sv = NULL; +PFNGLTEXCOORD2DPROC glad_glTexCoord2d = NULL; +PFNGLTEXCOORD2DVPROC glad_glTexCoord2dv = NULL; +PFNGLTEXCOORD2FPROC glad_glTexCoord2f = NULL; +PFNGLTEXCOORD2FVPROC glad_glTexCoord2fv = NULL; +PFNGLTEXCOORD2IPROC glad_glTexCoord2i = NULL; +PFNGLTEXCOORD2IVPROC glad_glTexCoord2iv = NULL; +PFNGLTEXCOORD2SPROC glad_glTexCoord2s = NULL; +PFNGLTEXCOORD2SVPROC glad_glTexCoord2sv = NULL; +PFNGLTEXCOORD3DPROC glad_glTexCoord3d = NULL; +PFNGLTEXCOORD3DVPROC glad_glTexCoord3dv = NULL; +PFNGLTEXCOORD3FPROC glad_glTexCoord3f = NULL; +PFNGLTEXCOORD3FVPROC glad_glTexCoord3fv = NULL; +PFNGLTEXCOORD3IPROC glad_glTexCoord3i = NULL; +PFNGLTEXCOORD3IVPROC glad_glTexCoord3iv = NULL; +PFNGLTEXCOORD3SPROC glad_glTexCoord3s = NULL; +PFNGLTEXCOORD3SVPROC glad_glTexCoord3sv = NULL; +PFNGLTEXCOORD4DPROC glad_glTexCoord4d = NULL; +PFNGLTEXCOORD4DVPROC glad_glTexCoord4dv = NULL; +PFNGLTEXCOORD4FPROC glad_glTexCoord4f = NULL; +PFNGLTEXCOORD4FVPROC glad_glTexCoord4fv = NULL; +PFNGLTEXCOORD4IPROC glad_glTexCoord4i = NULL; +PFNGLTEXCOORD4IVPROC glad_glTexCoord4iv = NULL; +PFNGLTEXCOORD4SPROC glad_glTexCoord4s = NULL; +PFNGLTEXCOORD4SVPROC glad_glTexCoord4sv = NULL; +PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui = NULL; +PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv = NULL; +PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui = NULL; +PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv = NULL; +PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui = NULL; +PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv = NULL; +PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui = NULL; +PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv = NULL; +PFNGLTEXCOORDPOINTERPROC glad_glTexCoordPointer = NULL; +PFNGLTEXCOORDPOINTEREXTPROC glad_glTexCoordPointerEXT = NULL; +PFNGLTEXENVFPROC glad_glTexEnvf = NULL; +PFNGLTEXENVFVPROC glad_glTexEnvfv = NULL; +PFNGLTEXENVIPROC glad_glTexEnvi = NULL; +PFNGLTEXENVIVPROC glad_glTexEnviv = NULL; +PFNGLTEXGENDPROC glad_glTexGend = NULL; +PFNGLTEXGENDVPROC glad_glTexGendv = NULL; +PFNGLTEXGENFPROC glad_glTexGenf = NULL; +PFNGLTEXGENFVPROC glad_glTexGenfv = NULL; +PFNGLTEXGENIPROC glad_glTexGeni = NULL; +PFNGLTEXGENIVPROC glad_glTexGeniv = NULL; +PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL; +PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; +PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample = NULL; +PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL; +PFNGLTEXIMAGE3DEXTPROC glad_glTexImage3DEXT = NULL; +PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample = NULL; +PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv = NULL; +PFNGLTEXPARAMETERIIVEXTPROC glad_glTexParameterIivEXT = NULL; +PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv = NULL; +PFNGLTEXPARAMETERIUIVEXTPROC glad_glTexParameterIuivEXT = NULL; +PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; +PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; +PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; +PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; +PFNGLTEXRENDERBUFFERNVPROC glad_glTexRenderbufferNV = NULL; +PFNGLTEXSTORAGE1DEXTPROC glad_glTexStorage1DEXT = NULL; +PFNGLTEXSTORAGE2DEXTPROC glad_glTexStorage2DEXT = NULL; +PFNGLTEXSTORAGE3DEXTPROC glad_glTexStorage3DEXT = NULL; +PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL; +PFNGLTEXSUBIMAGE1DEXTPROC glad_glTexSubImage1DEXT = NULL; +PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; +PFNGLTEXSUBIMAGE2DEXTPROC glad_glTexSubImage2DEXT = NULL; +PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; +PFNGLTEXSUBIMAGE3DEXTPROC glad_glTexSubImage3DEXT = NULL; +PFNGLTEXTUREBUFFEREXTPROC glad_glTextureBufferEXT = NULL; +PFNGLTEXTUREBUFFERRANGEEXTPROC glad_glTextureBufferRangeEXT = NULL; +PFNGLTEXTUREIMAGE1DEXTPROC glad_glTextureImage1DEXT = NULL; +PFNGLTEXTUREIMAGE2DEXTPROC glad_glTextureImage2DEXT = NULL; +PFNGLTEXTUREIMAGE3DEXTPROC glad_glTextureImage3DEXT = NULL; +PFNGLTEXTUREPAGECOMMITMENTEXTPROC glad_glTexturePageCommitmentEXT = NULL; +PFNGLTEXTUREPARAMETERIIVEXTPROC glad_glTextureParameterIivEXT = NULL; +PFNGLTEXTUREPARAMETERIUIVEXTPROC glad_glTextureParameterIuivEXT = NULL; +PFNGLTEXTUREPARAMETERFEXTPROC glad_glTextureParameterfEXT = NULL; +PFNGLTEXTUREPARAMETERFVEXTPROC glad_glTextureParameterfvEXT = NULL; +PFNGLTEXTUREPARAMETERIEXTPROC glad_glTextureParameteriEXT = NULL; +PFNGLTEXTUREPARAMETERIVEXTPROC glad_glTextureParameterivEXT = NULL; +PFNGLTEXTURERENDERBUFFEREXTPROC glad_glTextureRenderbufferEXT = NULL; +PFNGLTEXTURESTORAGE1DEXTPROC glad_glTextureStorage1DEXT = NULL; +PFNGLTEXTURESTORAGE2DEXTPROC glad_glTextureStorage2DEXT = NULL; +PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC glad_glTextureStorage2DMultisampleEXT = NULL; +PFNGLTEXTURESTORAGE3DEXTPROC glad_glTextureStorage3DEXT = NULL; +PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC glad_glTextureStorage3DMultisampleEXT = NULL; +PFNGLTEXTURESUBIMAGE1DEXTPROC glad_glTextureSubImage1DEXT = NULL; +PFNGLTEXTURESUBIMAGE2DEXTPROC glad_glTextureSubImage2DEXT = NULL; +PFNGLTEXTURESUBIMAGE3DEXTPROC glad_glTextureSubImage3DEXT = NULL; +PFNGLTRACKMATRIXNVPROC glad_glTrackMatrixNV = NULL; +PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC glad_glTransformFeedbackAttribsNV = NULL; +PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC glad_glTransformFeedbackStreamAttribsNV = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC glad_glTransformFeedbackVaryingsEXT = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC glad_glTransformFeedbackVaryingsNV = NULL; +PFNGLTRANSLATEDPROC glad_glTranslated = NULL; +PFNGLTRANSLATEFPROC glad_glTranslatef = NULL; +PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; +PFNGLUNIFORM1FARBPROC glad_glUniform1fARB = NULL; +PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; +PFNGLUNIFORM1FVARBPROC glad_glUniform1fvARB = NULL; +PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; +PFNGLUNIFORM1IARBPROC glad_glUniform1iARB = NULL; +PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; +PFNGLUNIFORM1IVARBPROC glad_glUniform1ivARB = NULL; +PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; +PFNGLUNIFORM1UIEXTPROC glad_glUniform1uiEXT = NULL; +PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; +PFNGLUNIFORM1UIVEXTPROC glad_glUniform1uivEXT = NULL; +PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; +PFNGLUNIFORM2FARBPROC glad_glUniform2fARB = NULL; +PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; +PFNGLUNIFORM2FVARBPROC glad_glUniform2fvARB = NULL; +PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; +PFNGLUNIFORM2IARBPROC glad_glUniform2iARB = NULL; +PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; +PFNGLUNIFORM2IVARBPROC glad_glUniform2ivARB = NULL; +PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; +PFNGLUNIFORM2UIEXTPROC glad_glUniform2uiEXT = NULL; +PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; +PFNGLUNIFORM2UIVEXTPROC glad_glUniform2uivEXT = NULL; +PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; +PFNGLUNIFORM3FARBPROC glad_glUniform3fARB = NULL; +PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; +PFNGLUNIFORM3FVARBPROC glad_glUniform3fvARB = NULL; +PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; +PFNGLUNIFORM3IARBPROC glad_glUniform3iARB = NULL; +PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; +PFNGLUNIFORM3IVARBPROC glad_glUniform3ivARB = NULL; +PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; +PFNGLUNIFORM3UIEXTPROC glad_glUniform3uiEXT = NULL; +PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; +PFNGLUNIFORM3UIVEXTPROC glad_glUniform3uivEXT = NULL; +PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; +PFNGLUNIFORM4FARBPROC glad_glUniform4fARB = NULL; +PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; +PFNGLUNIFORM4FVARBPROC glad_glUniform4fvARB = NULL; +PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; +PFNGLUNIFORM4IARBPROC glad_glUniform4iARB = NULL; +PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; +PFNGLUNIFORM4IVARBPROC glad_glUniform4ivARB = NULL; +PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; +PFNGLUNIFORM4UIEXTPROC glad_glUniform4uiEXT = NULL; +PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; +PFNGLUNIFORM4UIVEXTPROC glad_glUniform4uivEXT = NULL; +PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; +PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX2FVARBPROC glad_glUniformMatrix2fvARB = NULL; +PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX3FVARBPROC glad_glUniformMatrix3fvARB = NULL; +PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; +PFNGLUNIFORMMATRIX4FVARBPROC glad_glUniformMatrix4fvARB = NULL; +PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; +PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; +PFNGLUNMAPBUFFERARBPROC glad_glUnmapBufferARB = NULL; +PFNGLUNMAPNAMEDBUFFEREXTPROC glad_glUnmapNamedBufferEXT = NULL; +PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; +PFNGLUSEPROGRAMOBJECTARBPROC glad_glUseProgramObjectARB = NULL; +PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; +PFNGLVALIDATEPROGRAMARBPROC glad_glValidateProgramARB = NULL; +PFNGLVERTEX2DPROC glad_glVertex2d = NULL; +PFNGLVERTEX2DVPROC glad_glVertex2dv = NULL; +PFNGLVERTEX2FPROC glad_glVertex2f = NULL; +PFNGLVERTEX2FVPROC glad_glVertex2fv = NULL; +PFNGLVERTEX2IPROC glad_glVertex2i = NULL; +PFNGLVERTEX2IVPROC glad_glVertex2iv = NULL; +PFNGLVERTEX2SPROC glad_glVertex2s = NULL; +PFNGLVERTEX2SVPROC glad_glVertex2sv = NULL; +PFNGLVERTEX3DPROC glad_glVertex3d = NULL; +PFNGLVERTEX3DVPROC glad_glVertex3dv = NULL; +PFNGLVERTEX3FPROC glad_glVertex3f = NULL; +PFNGLVERTEX3FVPROC glad_glVertex3fv = NULL; +PFNGLVERTEX3IPROC glad_glVertex3i = NULL; +PFNGLVERTEX3IVPROC glad_glVertex3iv = NULL; +PFNGLVERTEX3SPROC glad_glVertex3s = NULL; +PFNGLVERTEX3SVPROC glad_glVertex3sv = NULL; +PFNGLVERTEX4DPROC glad_glVertex4d = NULL; +PFNGLVERTEX4DVPROC glad_glVertex4dv = NULL; +PFNGLVERTEX4FPROC glad_glVertex4f = NULL; +PFNGLVERTEX4FVPROC glad_glVertex4fv = NULL; +PFNGLVERTEX4IPROC glad_glVertex4i = NULL; +PFNGLVERTEX4IVPROC glad_glVertex4iv = NULL; +PFNGLVERTEX4SPROC glad_glVertex4s = NULL; +PFNGLVERTEX4SVPROC glad_glVertex4sv = NULL; +PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC glad_glVertexArrayBindVertexBufferEXT = NULL; +PFNGLVERTEXARRAYCOLOROFFSETEXTPROC glad_glVertexArrayColorOffsetEXT = NULL; +PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC glad_glVertexArrayEdgeFlagOffsetEXT = NULL; +PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC glad_glVertexArrayFogCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYINDEXOFFSETEXTPROC glad_glVertexArrayIndexOffsetEXT = NULL; +PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC glad_glVertexArrayMultiTexCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYNORMALOFFSETEXTPROC glad_glVertexArrayNormalOffsetEXT = NULL; +PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC glad_glVertexArraySecondaryColorOffsetEXT = NULL; +PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC glad_glVertexArrayTexCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC glad_glVertexArrayVertexAttribBindingEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC glad_glVertexArrayVertexAttribDivisorEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC glad_glVertexArrayVertexAttribFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC glad_glVertexArrayVertexAttribIFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC glad_glVertexArrayVertexAttribIOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC glad_glVertexArrayVertexAttribLFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC glad_glVertexArrayVertexAttribLOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC glad_glVertexArrayVertexAttribOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC glad_glVertexArrayVertexBindingDivisorEXT = NULL; +PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC glad_glVertexArrayVertexOffsetEXT = NULL; +PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL; +PFNGLVERTEXATTRIB1DARBPROC glad_glVertexAttrib1dARB = NULL; +PFNGLVERTEXATTRIB1DNVPROC glad_glVertexAttrib1dNV = NULL; +PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL; +PFNGLVERTEXATTRIB1DVARBPROC glad_glVertexAttrib1dvARB = NULL; +PFNGLVERTEXATTRIB1DVNVPROC glad_glVertexAttrib1dvNV = NULL; +PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; +PFNGLVERTEXATTRIB1FARBPROC glad_glVertexAttrib1fARB = NULL; +PFNGLVERTEXATTRIB1FNVPROC glad_glVertexAttrib1fNV = NULL; +PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; +PFNGLVERTEXATTRIB1FVARBPROC glad_glVertexAttrib1fvARB = NULL; +PFNGLVERTEXATTRIB1FVNVPROC glad_glVertexAttrib1fvNV = NULL; +PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL; +PFNGLVERTEXATTRIB1SARBPROC glad_glVertexAttrib1sARB = NULL; +PFNGLVERTEXATTRIB1SNVPROC glad_glVertexAttrib1sNV = NULL; +PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL; +PFNGLVERTEXATTRIB1SVARBPROC glad_glVertexAttrib1svARB = NULL; +PFNGLVERTEXATTRIB1SVNVPROC glad_glVertexAttrib1svNV = NULL; +PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL; +PFNGLVERTEXATTRIB2DARBPROC glad_glVertexAttrib2dARB = NULL; +PFNGLVERTEXATTRIB2DNVPROC glad_glVertexAttrib2dNV = NULL; +PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL; +PFNGLVERTEXATTRIB2DVARBPROC glad_glVertexAttrib2dvARB = NULL; +PFNGLVERTEXATTRIB2DVNVPROC glad_glVertexAttrib2dvNV = NULL; +PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; +PFNGLVERTEXATTRIB2FARBPROC glad_glVertexAttrib2fARB = NULL; +PFNGLVERTEXATTRIB2FNVPROC glad_glVertexAttrib2fNV = NULL; +PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; +PFNGLVERTEXATTRIB2FVARBPROC glad_glVertexAttrib2fvARB = NULL; +PFNGLVERTEXATTRIB2FVNVPROC glad_glVertexAttrib2fvNV = NULL; +PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL; +PFNGLVERTEXATTRIB2SARBPROC glad_glVertexAttrib2sARB = NULL; +PFNGLVERTEXATTRIB2SNVPROC glad_glVertexAttrib2sNV = NULL; +PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL; +PFNGLVERTEXATTRIB2SVARBPROC glad_glVertexAttrib2svARB = NULL; +PFNGLVERTEXATTRIB2SVNVPROC glad_glVertexAttrib2svNV = NULL; +PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL; +PFNGLVERTEXATTRIB3DARBPROC glad_glVertexAttrib3dARB = NULL; +PFNGLVERTEXATTRIB3DNVPROC glad_glVertexAttrib3dNV = NULL; +PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL; +PFNGLVERTEXATTRIB3DVARBPROC glad_glVertexAttrib3dvARB = NULL; +PFNGLVERTEXATTRIB3DVNVPROC glad_glVertexAttrib3dvNV = NULL; +PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; +PFNGLVERTEXATTRIB3FARBPROC glad_glVertexAttrib3fARB = NULL; +PFNGLVERTEXATTRIB3FNVPROC glad_glVertexAttrib3fNV = NULL; +PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; +PFNGLVERTEXATTRIB3FVARBPROC glad_glVertexAttrib3fvARB = NULL; +PFNGLVERTEXATTRIB3FVNVPROC glad_glVertexAttrib3fvNV = NULL; +PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL; +PFNGLVERTEXATTRIB3SARBPROC glad_glVertexAttrib3sARB = NULL; +PFNGLVERTEXATTRIB3SNVPROC glad_glVertexAttrib3sNV = NULL; +PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL; +PFNGLVERTEXATTRIB3SVARBPROC glad_glVertexAttrib3svARB = NULL; +PFNGLVERTEXATTRIB3SVNVPROC glad_glVertexAttrib3svNV = NULL; +PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL; +PFNGLVERTEXATTRIB4NBVARBPROC glad_glVertexAttrib4NbvARB = NULL; +PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL; +PFNGLVERTEXATTRIB4NIVARBPROC glad_glVertexAttrib4NivARB = NULL; +PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL; +PFNGLVERTEXATTRIB4NSVARBPROC glad_glVertexAttrib4NsvARB = NULL; +PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL; +PFNGLVERTEXATTRIB4NUBARBPROC glad_glVertexAttrib4NubARB = NULL; +PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL; +PFNGLVERTEXATTRIB4NUBVARBPROC glad_glVertexAttrib4NubvARB = NULL; +PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL; +PFNGLVERTEXATTRIB4NUIVARBPROC glad_glVertexAttrib4NuivARB = NULL; +PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL; +PFNGLVERTEXATTRIB4NUSVARBPROC glad_glVertexAttrib4NusvARB = NULL; +PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL; +PFNGLVERTEXATTRIB4BVARBPROC glad_glVertexAttrib4bvARB = NULL; +PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL; +PFNGLVERTEXATTRIB4DARBPROC glad_glVertexAttrib4dARB = NULL; +PFNGLVERTEXATTRIB4DNVPROC glad_glVertexAttrib4dNV = NULL; +PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL; +PFNGLVERTEXATTRIB4DVARBPROC glad_glVertexAttrib4dvARB = NULL; +PFNGLVERTEXATTRIB4DVNVPROC glad_glVertexAttrib4dvNV = NULL; +PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; +PFNGLVERTEXATTRIB4FARBPROC glad_glVertexAttrib4fARB = NULL; +PFNGLVERTEXATTRIB4FNVPROC glad_glVertexAttrib4fNV = NULL; +PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; +PFNGLVERTEXATTRIB4FVARBPROC glad_glVertexAttrib4fvARB = NULL; +PFNGLVERTEXATTRIB4FVNVPROC glad_glVertexAttrib4fvNV = NULL; +PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL; +PFNGLVERTEXATTRIB4IVARBPROC glad_glVertexAttrib4ivARB = NULL; +PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL; +PFNGLVERTEXATTRIB4SARBPROC glad_glVertexAttrib4sARB = NULL; +PFNGLVERTEXATTRIB4SNVPROC glad_glVertexAttrib4sNV = NULL; +PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL; +PFNGLVERTEXATTRIB4SVARBPROC glad_glVertexAttrib4svARB = NULL; +PFNGLVERTEXATTRIB4SVNVPROC glad_glVertexAttrib4svNV = NULL; +PFNGLVERTEXATTRIB4UBNVPROC glad_glVertexAttrib4ubNV = NULL; +PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL; +PFNGLVERTEXATTRIB4UBVARBPROC glad_glVertexAttrib4ubvARB = NULL; +PFNGLVERTEXATTRIB4UBVNVPROC glad_glVertexAttrib4ubvNV = NULL; +PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL; +PFNGLVERTEXATTRIB4UIVARBPROC glad_glVertexAttrib4uivARB = NULL; +PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL; +PFNGLVERTEXATTRIB4USVARBPROC glad_glVertexAttrib4usvARB = NULL; +PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; +PFNGLVERTEXATTRIBDIVISORARBPROC glad_glVertexAttribDivisorARB = NULL; +PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL; +PFNGLVERTEXATTRIBI1IEXTPROC glad_glVertexAttribI1iEXT = NULL; +PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL; +PFNGLVERTEXATTRIBI1IVEXTPROC glad_glVertexAttribI1ivEXT = NULL; +PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL; +PFNGLVERTEXATTRIBI1UIEXTPROC glad_glVertexAttribI1uiEXT = NULL; +PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv = NULL; +PFNGLVERTEXATTRIBI1UIVEXTPROC glad_glVertexAttribI1uivEXT = NULL; +PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i = NULL; +PFNGLVERTEXATTRIBI2IEXTPROC glad_glVertexAttribI2iEXT = NULL; +PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv = NULL; +PFNGLVERTEXATTRIBI2IVEXTPROC glad_glVertexAttribI2ivEXT = NULL; +PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui = NULL; +PFNGLVERTEXATTRIBI2UIEXTPROC glad_glVertexAttribI2uiEXT = NULL; +PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv = NULL; +PFNGLVERTEXATTRIBI2UIVEXTPROC glad_glVertexAttribI2uivEXT = NULL; +PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i = NULL; +PFNGLVERTEXATTRIBI3IEXTPROC glad_glVertexAttribI3iEXT = NULL; +PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv = NULL; +PFNGLVERTEXATTRIBI3IVEXTPROC glad_glVertexAttribI3ivEXT = NULL; +PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui = NULL; +PFNGLVERTEXATTRIBI3UIEXTPROC glad_glVertexAttribI3uiEXT = NULL; +PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv = NULL; +PFNGLVERTEXATTRIBI3UIVEXTPROC glad_glVertexAttribI3uivEXT = NULL; +PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv = NULL; +PFNGLVERTEXATTRIBI4BVEXTPROC glad_glVertexAttribI4bvEXT = NULL; +PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL; +PFNGLVERTEXATTRIBI4IEXTPROC glad_glVertexAttribI4iEXT = NULL; +PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL; +PFNGLVERTEXATTRIBI4IVEXTPROC glad_glVertexAttribI4ivEXT = NULL; +PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv = NULL; +PFNGLVERTEXATTRIBI4SVEXTPROC glad_glVertexAttribI4svEXT = NULL; +PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL; +PFNGLVERTEXATTRIBI4UBVEXTPROC glad_glVertexAttribI4ubvEXT = NULL; +PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; +PFNGLVERTEXATTRIBI4UIEXTPROC glad_glVertexAttribI4uiEXT = NULL; +PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; +PFNGLVERTEXATTRIBI4UIVEXTPROC glad_glVertexAttribI4uivEXT = NULL; +PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL; +PFNGLVERTEXATTRIBI4USVEXTPROC glad_glVertexAttribI4usvEXT = NULL; +PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; +PFNGLVERTEXATTRIBIPOINTEREXTPROC glad_glVertexAttribIPointerEXT = NULL; +PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL; +PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL; +PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL; +PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv = NULL; +PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui = NULL; +PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL; +PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL; +PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL; +PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; +PFNGLVERTEXATTRIBPOINTERARBPROC glad_glVertexAttribPointerARB = NULL; +PFNGLVERTEXATTRIBPOINTERNVPROC glad_glVertexAttribPointerNV = NULL; +PFNGLVERTEXATTRIBS1DVNVPROC glad_glVertexAttribs1dvNV = NULL; +PFNGLVERTEXATTRIBS1FVNVPROC glad_glVertexAttribs1fvNV = NULL; +PFNGLVERTEXATTRIBS1SVNVPROC glad_glVertexAttribs1svNV = NULL; +PFNGLVERTEXATTRIBS2DVNVPROC glad_glVertexAttribs2dvNV = NULL; +PFNGLVERTEXATTRIBS2FVNVPROC glad_glVertexAttribs2fvNV = NULL; +PFNGLVERTEXATTRIBS2SVNVPROC glad_glVertexAttribs2svNV = NULL; +PFNGLVERTEXATTRIBS3DVNVPROC glad_glVertexAttribs3dvNV = NULL; +PFNGLVERTEXATTRIBS3FVNVPROC glad_glVertexAttribs3fvNV = NULL; +PFNGLVERTEXATTRIBS3SVNVPROC glad_glVertexAttribs3svNV = NULL; +PFNGLVERTEXATTRIBS4DVNVPROC glad_glVertexAttribs4dvNV = NULL; +PFNGLVERTEXATTRIBS4FVNVPROC glad_glVertexAttribs4fvNV = NULL; +PFNGLVERTEXATTRIBS4SVNVPROC glad_glVertexAttribs4svNV = NULL; +PFNGLVERTEXATTRIBS4UBVNVPROC glad_glVertexAttribs4ubvNV = NULL; +PFNGLVERTEXP2UIPROC glad_glVertexP2ui = NULL; +PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv = NULL; +PFNGLVERTEXP3UIPROC glad_glVertexP3ui = NULL; +PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv = NULL; +PFNGLVERTEXP4UIPROC glad_glVertexP4ui = NULL; +PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv = NULL; +PFNGLVERTEXPOINTERPROC glad_glVertexPointer = NULL; +PFNGLVERTEXPOINTEREXTPROC glad_glVertexPointerEXT = NULL; +PFNGLVIEWPORTPROC glad_glViewport = NULL; +PFNGLWAITSYNCPROC glad_glWaitSync = NULL; +PFNGLWINDOWPOS2DPROC glad_glWindowPos2d = NULL; +PFNGLWINDOWPOS2DARBPROC glad_glWindowPos2dARB = NULL; +PFNGLWINDOWPOS2DMESAPROC glad_glWindowPos2dMESA = NULL; +PFNGLWINDOWPOS2DVPROC glad_glWindowPos2dv = NULL; +PFNGLWINDOWPOS2DVARBPROC glad_glWindowPos2dvARB = NULL; +PFNGLWINDOWPOS2DVMESAPROC glad_glWindowPos2dvMESA = NULL; +PFNGLWINDOWPOS2FPROC glad_glWindowPos2f = NULL; +PFNGLWINDOWPOS2FARBPROC glad_glWindowPos2fARB = NULL; +PFNGLWINDOWPOS2FMESAPROC glad_glWindowPos2fMESA = NULL; +PFNGLWINDOWPOS2FVPROC glad_glWindowPos2fv = NULL; +PFNGLWINDOWPOS2FVARBPROC glad_glWindowPos2fvARB = NULL; +PFNGLWINDOWPOS2FVMESAPROC glad_glWindowPos2fvMESA = NULL; +PFNGLWINDOWPOS2IPROC glad_glWindowPos2i = NULL; +PFNGLWINDOWPOS2IARBPROC glad_glWindowPos2iARB = NULL; +PFNGLWINDOWPOS2IMESAPROC glad_glWindowPos2iMESA = NULL; +PFNGLWINDOWPOS2IVPROC glad_glWindowPos2iv = NULL; +PFNGLWINDOWPOS2IVARBPROC glad_glWindowPos2ivARB = NULL; +PFNGLWINDOWPOS2IVMESAPROC glad_glWindowPos2ivMESA = NULL; +PFNGLWINDOWPOS2SPROC glad_glWindowPos2s = NULL; +PFNGLWINDOWPOS2SARBPROC glad_glWindowPos2sARB = NULL; +PFNGLWINDOWPOS2SMESAPROC glad_glWindowPos2sMESA = NULL; +PFNGLWINDOWPOS2SVPROC glad_glWindowPos2sv = NULL; +PFNGLWINDOWPOS2SVARBPROC glad_glWindowPos2svARB = NULL; +PFNGLWINDOWPOS2SVMESAPROC glad_glWindowPos2svMESA = NULL; +PFNGLWINDOWPOS3DPROC glad_glWindowPos3d = NULL; +PFNGLWINDOWPOS3DARBPROC glad_glWindowPos3dARB = NULL; +PFNGLWINDOWPOS3DMESAPROC glad_glWindowPos3dMESA = NULL; +PFNGLWINDOWPOS3DVPROC glad_glWindowPos3dv = NULL; +PFNGLWINDOWPOS3DVARBPROC glad_glWindowPos3dvARB = NULL; +PFNGLWINDOWPOS3DVMESAPROC glad_glWindowPos3dvMESA = NULL; +PFNGLWINDOWPOS3FPROC glad_glWindowPos3f = NULL; +PFNGLWINDOWPOS3FARBPROC glad_glWindowPos3fARB = NULL; +PFNGLWINDOWPOS3FMESAPROC glad_glWindowPos3fMESA = NULL; +PFNGLWINDOWPOS3FVPROC glad_glWindowPos3fv = NULL; +PFNGLWINDOWPOS3FVARBPROC glad_glWindowPos3fvARB = NULL; +PFNGLWINDOWPOS3FVMESAPROC glad_glWindowPos3fvMESA = NULL; +PFNGLWINDOWPOS3IPROC glad_glWindowPos3i = NULL; +PFNGLWINDOWPOS3IARBPROC glad_glWindowPos3iARB = NULL; +PFNGLWINDOWPOS3IMESAPROC glad_glWindowPos3iMESA = NULL; +PFNGLWINDOWPOS3IVPROC glad_glWindowPos3iv = NULL; +PFNGLWINDOWPOS3IVARBPROC glad_glWindowPos3ivARB = NULL; +PFNGLWINDOWPOS3IVMESAPROC glad_glWindowPos3ivMESA = NULL; +PFNGLWINDOWPOS3SPROC glad_glWindowPos3s = NULL; +PFNGLWINDOWPOS3SARBPROC glad_glWindowPos3sARB = NULL; +PFNGLWINDOWPOS3SMESAPROC glad_glWindowPos3sMESA = NULL; +PFNGLWINDOWPOS3SVPROC glad_glWindowPos3sv = NULL; +PFNGLWINDOWPOS3SVARBPROC glad_glWindowPos3svARB = NULL; +PFNGLWINDOWPOS3SVMESAPROC glad_glWindowPos3svMESA = NULL; +PFNGLWINDOWPOS4DMESAPROC glad_glWindowPos4dMESA = NULL; +PFNGLWINDOWPOS4DVMESAPROC glad_glWindowPos4dvMESA = NULL; +PFNGLWINDOWPOS4FMESAPROC glad_glWindowPos4fMESA = NULL; +PFNGLWINDOWPOS4FVMESAPROC glad_glWindowPos4fvMESA = NULL; +PFNGLWINDOWPOS4IMESAPROC glad_glWindowPos4iMESA = NULL; +PFNGLWINDOWPOS4IVMESAPROC glad_glWindowPos4ivMESA = NULL; +PFNGLWINDOWPOS4SMESAPROC glad_glWindowPos4sMESA = NULL; +PFNGLWINDOWPOS4SVMESAPROC glad_glWindowPos4svMESA = NULL; + + +static void glad_gl_load_GL_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_0) return; + glad_glAccum = (PFNGLACCUMPROC) load(userptr, "glAccum"); + glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc"); + glad_glBegin = (PFNGLBEGINPROC) load(userptr, "glBegin"); + glad_glBitmap = (PFNGLBITMAPPROC) load(userptr, "glBitmap"); + glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); + glad_glCallList = (PFNGLCALLLISTPROC) load(userptr, "glCallList"); + glad_glCallLists = (PFNGLCALLLISTSPROC) load(userptr, "glCallLists"); + glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); + glad_glClearAccum = (PFNGLCLEARACCUMPROC) load(userptr, "glClearAccum"); + glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); + glad_glClearDepth = (PFNGLCLEARDEPTHPROC) load(userptr, "glClearDepth"); + glad_glClearIndex = (PFNGLCLEARINDEXPROC) load(userptr, "glClearIndex"); + glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); + glad_glClipPlane = (PFNGLCLIPPLANEPROC) load(userptr, "glClipPlane"); + glad_glColor3b = (PFNGLCOLOR3BPROC) load(userptr, "glColor3b"); + glad_glColor3bv = (PFNGLCOLOR3BVPROC) load(userptr, "glColor3bv"); + glad_glColor3d = (PFNGLCOLOR3DPROC) load(userptr, "glColor3d"); + glad_glColor3dv = (PFNGLCOLOR3DVPROC) load(userptr, "glColor3dv"); + glad_glColor3f = (PFNGLCOLOR3FPROC) load(userptr, "glColor3f"); + glad_glColor3fv = (PFNGLCOLOR3FVPROC) load(userptr, "glColor3fv"); + glad_glColor3i = (PFNGLCOLOR3IPROC) load(userptr, "glColor3i"); + glad_glColor3iv = (PFNGLCOLOR3IVPROC) load(userptr, "glColor3iv"); + glad_glColor3s = (PFNGLCOLOR3SPROC) load(userptr, "glColor3s"); + glad_glColor3sv = (PFNGLCOLOR3SVPROC) load(userptr, "glColor3sv"); + glad_glColor3ub = (PFNGLCOLOR3UBPROC) load(userptr, "glColor3ub"); + glad_glColor3ubv = (PFNGLCOLOR3UBVPROC) load(userptr, "glColor3ubv"); + glad_glColor3ui = (PFNGLCOLOR3UIPROC) load(userptr, "glColor3ui"); + glad_glColor3uiv = (PFNGLCOLOR3UIVPROC) load(userptr, "glColor3uiv"); + glad_glColor3us = (PFNGLCOLOR3USPROC) load(userptr, "glColor3us"); + glad_glColor3usv = (PFNGLCOLOR3USVPROC) load(userptr, "glColor3usv"); + glad_glColor4b = (PFNGLCOLOR4BPROC) load(userptr, "glColor4b"); + glad_glColor4bv = (PFNGLCOLOR4BVPROC) load(userptr, "glColor4bv"); + glad_glColor4d = (PFNGLCOLOR4DPROC) load(userptr, "glColor4d"); + glad_glColor4dv = (PFNGLCOLOR4DVPROC) load(userptr, "glColor4dv"); + glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f"); + glad_glColor4fv = (PFNGLCOLOR4FVPROC) load(userptr, "glColor4fv"); + glad_glColor4i = (PFNGLCOLOR4IPROC) load(userptr, "glColor4i"); + glad_glColor4iv = (PFNGLCOLOR4IVPROC) load(userptr, "glColor4iv"); + glad_glColor4s = (PFNGLCOLOR4SPROC) load(userptr, "glColor4s"); + glad_glColor4sv = (PFNGLCOLOR4SVPROC) load(userptr, "glColor4sv"); + glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub"); + glad_glColor4ubv = (PFNGLCOLOR4UBVPROC) load(userptr, "glColor4ubv"); + glad_glColor4ui = (PFNGLCOLOR4UIPROC) load(userptr, "glColor4ui"); + glad_glColor4uiv = (PFNGLCOLOR4UIVPROC) load(userptr, "glColor4uiv"); + glad_glColor4us = (PFNGLCOLOR4USPROC) load(userptr, "glColor4us"); + glad_glColor4usv = (PFNGLCOLOR4USVPROC) load(userptr, "glColor4usv"); + glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); + glad_glColorMaterial = (PFNGLCOLORMATERIALPROC) load(userptr, "glColorMaterial"); + glad_glCopyPixels = (PFNGLCOPYPIXELSPROC) load(userptr, "glCopyPixels"); + glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); + glad_glDeleteLists = (PFNGLDELETELISTSPROC) load(userptr, "glDeleteLists"); + glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); + glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); + glad_glDepthRange = (PFNGLDEPTHRANGEPROC) load(userptr, "glDepthRange"); + glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); + glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC) load(userptr, "glDrawBuffer"); + glad_glDrawPixels = (PFNGLDRAWPIXELSPROC) load(userptr, "glDrawPixels"); + glad_glEdgeFlag = (PFNGLEDGEFLAGPROC) load(userptr, "glEdgeFlag"); + glad_glEdgeFlagv = (PFNGLEDGEFLAGVPROC) load(userptr, "glEdgeFlagv"); + glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); + glad_glEnd = (PFNGLENDPROC) load(userptr, "glEnd"); + glad_glEndList = (PFNGLENDLISTPROC) load(userptr, "glEndList"); + glad_glEvalCoord1d = (PFNGLEVALCOORD1DPROC) load(userptr, "glEvalCoord1d"); + glad_glEvalCoord1dv = (PFNGLEVALCOORD1DVPROC) load(userptr, "glEvalCoord1dv"); + glad_glEvalCoord1f = (PFNGLEVALCOORD1FPROC) load(userptr, "glEvalCoord1f"); + glad_glEvalCoord1fv = (PFNGLEVALCOORD1FVPROC) load(userptr, "glEvalCoord1fv"); + glad_glEvalCoord2d = (PFNGLEVALCOORD2DPROC) load(userptr, "glEvalCoord2d"); + glad_glEvalCoord2dv = (PFNGLEVALCOORD2DVPROC) load(userptr, "glEvalCoord2dv"); + glad_glEvalCoord2f = (PFNGLEVALCOORD2FPROC) load(userptr, "glEvalCoord2f"); + glad_glEvalCoord2fv = (PFNGLEVALCOORD2FVPROC) load(userptr, "glEvalCoord2fv"); + glad_glEvalMesh1 = (PFNGLEVALMESH1PROC) load(userptr, "glEvalMesh1"); + glad_glEvalMesh2 = (PFNGLEVALMESH2PROC) load(userptr, "glEvalMesh2"); + glad_glEvalPoint1 = (PFNGLEVALPOINT1PROC) load(userptr, "glEvalPoint1"); + glad_glEvalPoint2 = (PFNGLEVALPOINT2PROC) load(userptr, "glEvalPoint2"); + glad_glFeedbackBuffer = (PFNGLFEEDBACKBUFFERPROC) load(userptr, "glFeedbackBuffer"); + glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); + glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); + glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf"); + glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv"); + glad_glFogi = (PFNGLFOGIPROC) load(userptr, "glFogi"); + glad_glFogiv = (PFNGLFOGIVPROC) load(userptr, "glFogiv"); + glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); + glad_glFrustum = (PFNGLFRUSTUMPROC) load(userptr, "glFrustum"); + glad_glGenLists = (PFNGLGENLISTSPROC) load(userptr, "glGenLists"); + glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); + glad_glGetClipPlane = (PFNGLGETCLIPPLANEPROC) load(userptr, "glGetClipPlane"); + glad_glGetDoublev = (PFNGLGETDOUBLEVPROC) load(userptr, "glGetDoublev"); + glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); + glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); + glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); + glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv"); + glad_glGetLightiv = (PFNGLGETLIGHTIVPROC) load(userptr, "glGetLightiv"); + glad_glGetMapdv = (PFNGLGETMAPDVPROC) load(userptr, "glGetMapdv"); + glad_glGetMapfv = (PFNGLGETMAPFVPROC) load(userptr, "glGetMapfv"); + glad_glGetMapiv = (PFNGLGETMAPIVPROC) load(userptr, "glGetMapiv"); + glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv"); + glad_glGetMaterialiv = (PFNGLGETMATERIALIVPROC) load(userptr, "glGetMaterialiv"); + glad_glGetPixelMapfv = (PFNGLGETPIXELMAPFVPROC) load(userptr, "glGetPixelMapfv"); + glad_glGetPixelMapuiv = (PFNGLGETPIXELMAPUIVPROC) load(userptr, "glGetPixelMapuiv"); + glad_glGetPixelMapusv = (PFNGLGETPIXELMAPUSVPROC) load(userptr, "glGetPixelMapusv"); + glad_glGetPolygonStipple = (PFNGLGETPOLYGONSTIPPLEPROC) load(userptr, "glGetPolygonStipple"); + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv"); + glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv"); + glad_glGetTexGendv = (PFNGLGETTEXGENDVPROC) load(userptr, "glGetTexGendv"); + glad_glGetTexGenfv = (PFNGLGETTEXGENFVPROC) load(userptr, "glGetTexGenfv"); + glad_glGetTexGeniv = (PFNGLGETTEXGENIVPROC) load(userptr, "glGetTexGeniv"); + glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC) load(userptr, "glGetTexImage"); + glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC) load(userptr, "glGetTexLevelParameterfv"); + glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC) load(userptr, "glGetTexLevelParameteriv"); + glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); + glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); + glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); + glad_glIndexMask = (PFNGLINDEXMASKPROC) load(userptr, "glIndexMask"); + glad_glIndexd = (PFNGLINDEXDPROC) load(userptr, "glIndexd"); + glad_glIndexdv = (PFNGLINDEXDVPROC) load(userptr, "glIndexdv"); + glad_glIndexf = (PFNGLINDEXFPROC) load(userptr, "glIndexf"); + glad_glIndexfv = (PFNGLINDEXFVPROC) load(userptr, "glIndexfv"); + glad_glIndexi = (PFNGLINDEXIPROC) load(userptr, "glIndexi"); + glad_glIndexiv = (PFNGLINDEXIVPROC) load(userptr, "glIndexiv"); + glad_glIndexs = (PFNGLINDEXSPROC) load(userptr, "glIndexs"); + glad_glIndexsv = (PFNGLINDEXSVPROC) load(userptr, "glIndexsv"); + glad_glInitNames = (PFNGLINITNAMESPROC) load(userptr, "glInitNames"); + glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); + glad_glIsList = (PFNGLISLISTPROC) load(userptr, "glIsList"); + glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf"); + glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv"); + glad_glLightModeli = (PFNGLLIGHTMODELIPROC) load(userptr, "glLightModeli"); + glad_glLightModeliv = (PFNGLLIGHTMODELIVPROC) load(userptr, "glLightModeliv"); + glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf"); + glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv"); + glad_glLighti = (PFNGLLIGHTIPROC) load(userptr, "glLighti"); + glad_glLightiv = (PFNGLLIGHTIVPROC) load(userptr, "glLightiv"); + glad_glLineStipple = (PFNGLLINESTIPPLEPROC) load(userptr, "glLineStipple"); + glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); + glad_glListBase = (PFNGLLISTBASEPROC) load(userptr, "glListBase"); + glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity"); + glad_glLoadMatrixd = (PFNGLLOADMATRIXDPROC) load(userptr, "glLoadMatrixd"); + glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf"); + glad_glLoadName = (PFNGLLOADNAMEPROC) load(userptr, "glLoadName"); + glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp"); + glad_glMap1d = (PFNGLMAP1DPROC) load(userptr, "glMap1d"); + glad_glMap1f = (PFNGLMAP1FPROC) load(userptr, "glMap1f"); + glad_glMap2d = (PFNGLMAP2DPROC) load(userptr, "glMap2d"); + glad_glMap2f = (PFNGLMAP2FPROC) load(userptr, "glMap2f"); + glad_glMapGrid1d = (PFNGLMAPGRID1DPROC) load(userptr, "glMapGrid1d"); + glad_glMapGrid1f = (PFNGLMAPGRID1FPROC) load(userptr, "glMapGrid1f"); + glad_glMapGrid2d = (PFNGLMAPGRID2DPROC) load(userptr, "glMapGrid2d"); + glad_glMapGrid2f = (PFNGLMAPGRID2FPROC) load(userptr, "glMapGrid2f"); + glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf"); + glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv"); + glad_glMateriali = (PFNGLMATERIALIPROC) load(userptr, "glMateriali"); + glad_glMaterialiv = (PFNGLMATERIALIVPROC) load(userptr, "glMaterialiv"); + glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode"); + glad_glMultMatrixd = (PFNGLMULTMATRIXDPROC) load(userptr, "glMultMatrixd"); + glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf"); + glad_glNewList = (PFNGLNEWLISTPROC) load(userptr, "glNewList"); + glad_glNormal3b = (PFNGLNORMAL3BPROC) load(userptr, "glNormal3b"); + glad_glNormal3bv = (PFNGLNORMAL3BVPROC) load(userptr, "glNormal3bv"); + glad_glNormal3d = (PFNGLNORMAL3DPROC) load(userptr, "glNormal3d"); + glad_glNormal3dv = (PFNGLNORMAL3DVPROC) load(userptr, "glNormal3dv"); + glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f"); + glad_glNormal3fv = (PFNGLNORMAL3FVPROC) load(userptr, "glNormal3fv"); + glad_glNormal3i = (PFNGLNORMAL3IPROC) load(userptr, "glNormal3i"); + glad_glNormal3iv = (PFNGLNORMAL3IVPROC) load(userptr, "glNormal3iv"); + glad_glNormal3s = (PFNGLNORMAL3SPROC) load(userptr, "glNormal3s"); + glad_glNormal3sv = (PFNGLNORMAL3SVPROC) load(userptr, "glNormal3sv"); + glad_glOrtho = (PFNGLORTHOPROC) load(userptr, "glOrtho"); + glad_glPassThrough = (PFNGLPASSTHROUGHPROC) load(userptr, "glPassThrough"); + glad_glPixelMapfv = (PFNGLPIXELMAPFVPROC) load(userptr, "glPixelMapfv"); + glad_glPixelMapuiv = (PFNGLPIXELMAPUIVPROC) load(userptr, "glPixelMapuiv"); + glad_glPixelMapusv = (PFNGLPIXELMAPUSVPROC) load(userptr, "glPixelMapusv"); + glad_glPixelStoref = (PFNGLPIXELSTOREFPROC) load(userptr, "glPixelStoref"); + glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei"); + glad_glPixelTransferf = (PFNGLPIXELTRANSFERFPROC) load(userptr, "glPixelTransferf"); + glad_glPixelTransferi = (PFNGLPIXELTRANSFERIPROC) load(userptr, "glPixelTransferi"); + glad_glPixelZoom = (PFNGLPIXELZOOMPROC) load(userptr, "glPixelZoom"); + glad_glPointSize = (PFNGLPOINTSIZEPROC) load(userptr, "glPointSize"); + glad_glPolygonMode = (PFNGLPOLYGONMODEPROC) load(userptr, "glPolygonMode"); + glad_glPolygonStipple = (PFNGLPOLYGONSTIPPLEPROC) load(userptr, "glPolygonStipple"); + glad_glPopAttrib = (PFNGLPOPATTRIBPROC) load(userptr, "glPopAttrib"); + glad_glPopMatrix = (PFNGLPOPMATRIXPROC) load(userptr, "glPopMatrix"); + glad_glPopName = (PFNGLPOPNAMEPROC) load(userptr, "glPopName"); + glad_glPushAttrib = (PFNGLPUSHATTRIBPROC) load(userptr, "glPushAttrib"); + glad_glPushMatrix = (PFNGLPUSHMATRIXPROC) load(userptr, "glPushMatrix"); + glad_glPushName = (PFNGLPUSHNAMEPROC) load(userptr, "glPushName"); + glad_glRasterPos2d = (PFNGLRASTERPOS2DPROC) load(userptr, "glRasterPos2d"); + glad_glRasterPos2dv = (PFNGLRASTERPOS2DVPROC) load(userptr, "glRasterPos2dv"); + glad_glRasterPos2f = (PFNGLRASTERPOS2FPROC) load(userptr, "glRasterPos2f"); + glad_glRasterPos2fv = (PFNGLRASTERPOS2FVPROC) load(userptr, "glRasterPos2fv"); + glad_glRasterPos2i = (PFNGLRASTERPOS2IPROC) load(userptr, "glRasterPos2i"); + glad_glRasterPos2iv = (PFNGLRASTERPOS2IVPROC) load(userptr, "glRasterPos2iv"); + glad_glRasterPos2s = (PFNGLRASTERPOS2SPROC) load(userptr, "glRasterPos2s"); + glad_glRasterPos2sv = (PFNGLRASTERPOS2SVPROC) load(userptr, "glRasterPos2sv"); + glad_glRasterPos3d = (PFNGLRASTERPOS3DPROC) load(userptr, "glRasterPos3d"); + glad_glRasterPos3dv = (PFNGLRASTERPOS3DVPROC) load(userptr, "glRasterPos3dv"); + glad_glRasterPos3f = (PFNGLRASTERPOS3FPROC) load(userptr, "glRasterPos3f"); + glad_glRasterPos3fv = (PFNGLRASTERPOS3FVPROC) load(userptr, "glRasterPos3fv"); + glad_glRasterPos3i = (PFNGLRASTERPOS3IPROC) load(userptr, "glRasterPos3i"); + glad_glRasterPos3iv = (PFNGLRASTERPOS3IVPROC) load(userptr, "glRasterPos3iv"); + glad_glRasterPos3s = (PFNGLRASTERPOS3SPROC) load(userptr, "glRasterPos3s"); + glad_glRasterPos3sv = (PFNGLRASTERPOS3SVPROC) load(userptr, "glRasterPos3sv"); + glad_glRasterPos4d = (PFNGLRASTERPOS4DPROC) load(userptr, "glRasterPos4d"); + glad_glRasterPos4dv = (PFNGLRASTERPOS4DVPROC) load(userptr, "glRasterPos4dv"); + glad_glRasterPos4f = (PFNGLRASTERPOS4FPROC) load(userptr, "glRasterPos4f"); + glad_glRasterPos4fv = (PFNGLRASTERPOS4FVPROC) load(userptr, "glRasterPos4fv"); + glad_glRasterPos4i = (PFNGLRASTERPOS4IPROC) load(userptr, "glRasterPos4i"); + glad_glRasterPos4iv = (PFNGLRASTERPOS4IVPROC) load(userptr, "glRasterPos4iv"); + glad_glRasterPos4s = (PFNGLRASTERPOS4SPROC) load(userptr, "glRasterPos4s"); + glad_glRasterPos4sv = (PFNGLRASTERPOS4SVPROC) load(userptr, "glRasterPos4sv"); + glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer"); + glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels"); + glad_glRectd = (PFNGLRECTDPROC) load(userptr, "glRectd"); + glad_glRectdv = (PFNGLRECTDVPROC) load(userptr, "glRectdv"); + glad_glRectf = (PFNGLRECTFPROC) load(userptr, "glRectf"); + glad_glRectfv = (PFNGLRECTFVPROC) load(userptr, "glRectfv"); + glad_glRecti = (PFNGLRECTIPROC) load(userptr, "glRecti"); + glad_glRectiv = (PFNGLRECTIVPROC) load(userptr, "glRectiv"); + glad_glRects = (PFNGLRECTSPROC) load(userptr, "glRects"); + glad_glRectsv = (PFNGLRECTSVPROC) load(userptr, "glRectsv"); + glad_glRenderMode = (PFNGLRENDERMODEPROC) load(userptr, "glRenderMode"); + glad_glRotated = (PFNGLROTATEDPROC) load(userptr, "glRotated"); + glad_glRotatef = (PFNGLROTATEFPROC) load(userptr, "glRotatef"); + glad_glScaled = (PFNGLSCALEDPROC) load(userptr, "glScaled"); + glad_glScalef = (PFNGLSCALEFPROC) load(userptr, "glScalef"); + glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor"); + glad_glSelectBuffer = (PFNGLSELECTBUFFERPROC) load(userptr, "glSelectBuffer"); + glad_glShadeModel = (PFNGLSHADEMODELPROC) load(userptr, "glShadeModel"); + glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc"); + glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask"); + glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp"); + glad_glTexCoord1d = (PFNGLTEXCOORD1DPROC) load(userptr, "glTexCoord1d"); + glad_glTexCoord1dv = (PFNGLTEXCOORD1DVPROC) load(userptr, "glTexCoord1dv"); + glad_glTexCoord1f = (PFNGLTEXCOORD1FPROC) load(userptr, "glTexCoord1f"); + glad_glTexCoord1fv = (PFNGLTEXCOORD1FVPROC) load(userptr, "glTexCoord1fv"); + glad_glTexCoord1i = (PFNGLTEXCOORD1IPROC) load(userptr, "glTexCoord1i"); + glad_glTexCoord1iv = (PFNGLTEXCOORD1IVPROC) load(userptr, "glTexCoord1iv"); + glad_glTexCoord1s = (PFNGLTEXCOORD1SPROC) load(userptr, "glTexCoord1s"); + glad_glTexCoord1sv = (PFNGLTEXCOORD1SVPROC) load(userptr, "glTexCoord1sv"); + glad_glTexCoord2d = (PFNGLTEXCOORD2DPROC) load(userptr, "glTexCoord2d"); + glad_glTexCoord2dv = (PFNGLTEXCOORD2DVPROC) load(userptr, "glTexCoord2dv"); + glad_glTexCoord2f = (PFNGLTEXCOORD2FPROC) load(userptr, "glTexCoord2f"); + glad_glTexCoord2fv = (PFNGLTEXCOORD2FVPROC) load(userptr, "glTexCoord2fv"); + glad_glTexCoord2i = (PFNGLTEXCOORD2IPROC) load(userptr, "glTexCoord2i"); + glad_glTexCoord2iv = (PFNGLTEXCOORD2IVPROC) load(userptr, "glTexCoord2iv"); + glad_glTexCoord2s = (PFNGLTEXCOORD2SPROC) load(userptr, "glTexCoord2s"); + glad_glTexCoord2sv = (PFNGLTEXCOORD2SVPROC) load(userptr, "glTexCoord2sv"); + glad_glTexCoord3d = (PFNGLTEXCOORD3DPROC) load(userptr, "glTexCoord3d"); + glad_glTexCoord3dv = (PFNGLTEXCOORD3DVPROC) load(userptr, "glTexCoord3dv"); + glad_glTexCoord3f = (PFNGLTEXCOORD3FPROC) load(userptr, "glTexCoord3f"); + glad_glTexCoord3fv = (PFNGLTEXCOORD3FVPROC) load(userptr, "glTexCoord3fv"); + glad_glTexCoord3i = (PFNGLTEXCOORD3IPROC) load(userptr, "glTexCoord3i"); + glad_glTexCoord3iv = (PFNGLTEXCOORD3IVPROC) load(userptr, "glTexCoord3iv"); + glad_glTexCoord3s = (PFNGLTEXCOORD3SPROC) load(userptr, "glTexCoord3s"); + glad_glTexCoord3sv = (PFNGLTEXCOORD3SVPROC) load(userptr, "glTexCoord3sv"); + glad_glTexCoord4d = (PFNGLTEXCOORD4DPROC) load(userptr, "glTexCoord4d"); + glad_glTexCoord4dv = (PFNGLTEXCOORD4DVPROC) load(userptr, "glTexCoord4dv"); + glad_glTexCoord4f = (PFNGLTEXCOORD4FPROC) load(userptr, "glTexCoord4f"); + glad_glTexCoord4fv = (PFNGLTEXCOORD4FVPROC) load(userptr, "glTexCoord4fv"); + glad_glTexCoord4i = (PFNGLTEXCOORD4IPROC) load(userptr, "glTexCoord4i"); + glad_glTexCoord4iv = (PFNGLTEXCOORD4IVPROC) load(userptr, "glTexCoord4iv"); + glad_glTexCoord4s = (PFNGLTEXCOORD4SPROC) load(userptr, "glTexCoord4s"); + glad_glTexCoord4sv = (PFNGLTEXCOORD4SVPROC) load(userptr, "glTexCoord4sv"); + glad_glTexEnvf = (PFNGLTEXENVFPROC) load(userptr, "glTexEnvf"); + glad_glTexEnvfv = (PFNGLTEXENVFVPROC) load(userptr, "glTexEnvfv"); + glad_glTexEnvi = (PFNGLTEXENVIPROC) load(userptr, "glTexEnvi"); + glad_glTexEnviv = (PFNGLTEXENVIVPROC) load(userptr, "glTexEnviv"); + glad_glTexGend = (PFNGLTEXGENDPROC) load(userptr, "glTexGend"); + glad_glTexGendv = (PFNGLTEXGENDVPROC) load(userptr, "glTexGendv"); + glad_glTexGenf = (PFNGLTEXGENFPROC) load(userptr, "glTexGenf"); + glad_glTexGenfv = (PFNGLTEXGENFVPROC) load(userptr, "glTexGenfv"); + glad_glTexGeni = (PFNGLTEXGENIPROC) load(userptr, "glTexGeni"); + glad_glTexGeniv = (PFNGLTEXGENIVPROC) load(userptr, "glTexGeniv"); + glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC) load(userptr, "glTexImage1D"); + glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D"); + glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf"); + glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv"); + glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri"); + glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv"); + glad_glTranslated = (PFNGLTRANSLATEDPROC) load(userptr, "glTranslated"); + glad_glTranslatef = (PFNGLTRANSLATEFPROC) load(userptr, "glTranslatef"); + glad_glVertex2d = (PFNGLVERTEX2DPROC) load(userptr, "glVertex2d"); + glad_glVertex2dv = (PFNGLVERTEX2DVPROC) load(userptr, "glVertex2dv"); + glad_glVertex2f = (PFNGLVERTEX2FPROC) load(userptr, "glVertex2f"); + glad_glVertex2fv = (PFNGLVERTEX2FVPROC) load(userptr, "glVertex2fv"); + glad_glVertex2i = (PFNGLVERTEX2IPROC) load(userptr, "glVertex2i"); + glad_glVertex2iv = (PFNGLVERTEX2IVPROC) load(userptr, "glVertex2iv"); + glad_glVertex2s = (PFNGLVERTEX2SPROC) load(userptr, "glVertex2s"); + glad_glVertex2sv = (PFNGLVERTEX2SVPROC) load(userptr, "glVertex2sv"); + glad_glVertex3d = (PFNGLVERTEX3DPROC) load(userptr, "glVertex3d"); + glad_glVertex3dv = (PFNGLVERTEX3DVPROC) load(userptr, "glVertex3dv"); + glad_glVertex3f = (PFNGLVERTEX3FPROC) load(userptr, "glVertex3f"); + glad_glVertex3fv = (PFNGLVERTEX3FVPROC) load(userptr, "glVertex3fv"); + glad_glVertex3i = (PFNGLVERTEX3IPROC) load(userptr, "glVertex3i"); + glad_glVertex3iv = (PFNGLVERTEX3IVPROC) load(userptr, "glVertex3iv"); + glad_glVertex3s = (PFNGLVERTEX3SPROC) load(userptr, "glVertex3s"); + glad_glVertex3sv = (PFNGLVERTEX3SVPROC) load(userptr, "glVertex3sv"); + glad_glVertex4d = (PFNGLVERTEX4DPROC) load(userptr, "glVertex4d"); + glad_glVertex4dv = (PFNGLVERTEX4DVPROC) load(userptr, "glVertex4dv"); + glad_glVertex4f = (PFNGLVERTEX4FPROC) load(userptr, "glVertex4f"); + glad_glVertex4fv = (PFNGLVERTEX4FVPROC) load(userptr, "glVertex4fv"); + glad_glVertex4i = (PFNGLVERTEX4IPROC) load(userptr, "glVertex4i"); + glad_glVertex4iv = (PFNGLVERTEX4IVPROC) load(userptr, "glVertex4iv"); + glad_glVertex4s = (PFNGLVERTEX4SPROC) load(userptr, "glVertex4s"); + glad_glVertex4sv = (PFNGLVERTEX4SVPROC) load(userptr, "glVertex4sv"); + glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport"); +} +static void glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_1) return; + glad_glAreTexturesResident = (PFNGLARETEXTURESRESIDENTPROC) load(userptr, "glAreTexturesResident"); + glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement"); + glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); + glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer"); + glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D"); + glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); + glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D"); + glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); + glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); + glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState"); + glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); + glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); + glad_glEdgeFlagPointer = (PFNGLEDGEFLAGPOINTERPROC) load(userptr, "glEdgeFlagPointer"); + glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState"); + glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + glad_glIndexPointer = (PFNGLINDEXPOINTERPROC) load(userptr, "glIndexPointer"); + glad_glIndexub = (PFNGLINDEXUBPROC) load(userptr, "glIndexub"); + glad_glIndexubv = (PFNGLINDEXUBVPROC) load(userptr, "glIndexubv"); + glad_glInterleavedArrays = (PFNGLINTERLEAVEDARRAYSPROC) load(userptr, "glInterleavedArrays"); + glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); + glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer"); + glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset"); + glad_glPopClientAttrib = (PFNGLPOPCLIENTATTRIBPROC) load(userptr, "glPopClientAttrib"); + glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures"); + glad_glPushClientAttrib = (PFNGLPUSHCLIENTATTRIBPROC) load(userptr, "glPushClientAttrib"); + glad_glTexCoordPointer = (PFNGLTEXCOORDPOINTERPROC) load(userptr, "glTexCoordPointer"); + glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D"); + glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); + glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer"); +} +static void glad_gl_load_GL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_2) return; + glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); + glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(userptr, "glDrawRangeElements"); + glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(userptr, "glTexImage3D"); + glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(userptr, "glTexSubImage3D"); +} +static void glad_gl_load_GL_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_3) return; + glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); + glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture"); + glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) load(userptr, "glCompressedTexImage1D"); + glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); + glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(userptr, "glCompressedTexImage3D"); + glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) load(userptr, "glCompressedTexSubImage1D"); + glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); + glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(userptr, "glCompressedTexSubImage3D"); + glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetCompressedTexImage"); + glad_glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC) load(userptr, "glLoadTransposeMatrixd"); + glad_glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC) load(userptr, "glLoadTransposeMatrixf"); + glad_glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC) load(userptr, "glMultTransposeMatrixd"); + glad_glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC) load(userptr, "glMultTransposeMatrixf"); + glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(userptr, "glMultiTexCoord1d"); + glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(userptr, "glMultiTexCoord1dv"); + glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(userptr, "glMultiTexCoord1f"); + glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(userptr, "glMultiTexCoord1fv"); + glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(userptr, "glMultiTexCoord1i"); + glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(userptr, "glMultiTexCoord1iv"); + glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(userptr, "glMultiTexCoord1s"); + glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(userptr, "glMultiTexCoord1sv"); + glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(userptr, "glMultiTexCoord2d"); + glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(userptr, "glMultiTexCoord2dv"); + glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(userptr, "glMultiTexCoord2f"); + glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(userptr, "glMultiTexCoord2fv"); + glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(userptr, "glMultiTexCoord2i"); + glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(userptr, "glMultiTexCoord2iv"); + glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(userptr, "glMultiTexCoord2s"); + glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(userptr, "glMultiTexCoord2sv"); + glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(userptr, "glMultiTexCoord3d"); + glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(userptr, "glMultiTexCoord3dv"); + glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(userptr, "glMultiTexCoord3f"); + glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(userptr, "glMultiTexCoord3fv"); + glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(userptr, "glMultiTexCoord3i"); + glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(userptr, "glMultiTexCoord3iv"); + glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(userptr, "glMultiTexCoord3s"); + glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(userptr, "glMultiTexCoord3sv"); + glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(userptr, "glMultiTexCoord4d"); + glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(userptr, "glMultiTexCoord4dv"); + glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f"); + glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(userptr, "glMultiTexCoord4fv"); + glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(userptr, "glMultiTexCoord4i"); + glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(userptr, "glMultiTexCoord4iv"); + glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(userptr, "glMultiTexCoord4s"); + glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(userptr, "glMultiTexCoord4sv"); + glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage"); +} +static void glad_gl_load_GL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_4) return; + glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); + glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); + glad_glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC) load(userptr, "glFogCoordPointer"); + glad_glFogCoordd = (PFNGLFOGCOORDDPROC) load(userptr, "glFogCoordd"); + glad_glFogCoorddv = (PFNGLFOGCOORDDVPROC) load(userptr, "glFogCoorddv"); + glad_glFogCoordf = (PFNGLFOGCOORDFPROC) load(userptr, "glFogCoordf"); + glad_glFogCoordfv = (PFNGLFOGCOORDFVPROC) load(userptr, "glFogCoordfv"); + glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) load(userptr, "glMultiDrawArrays"); + glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) load(userptr, "glMultiDrawElements"); + glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf"); + glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv"); + glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC) load(userptr, "glPointParameteri"); + glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) load(userptr, "glPointParameteriv"); + glad_glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC) load(userptr, "glSecondaryColor3b"); + glad_glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC) load(userptr, "glSecondaryColor3bv"); + glad_glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC) load(userptr, "glSecondaryColor3d"); + glad_glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC) load(userptr, "glSecondaryColor3dv"); + glad_glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC) load(userptr, "glSecondaryColor3f"); + glad_glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC) load(userptr, "glSecondaryColor3fv"); + glad_glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC) load(userptr, "glSecondaryColor3i"); + glad_glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC) load(userptr, "glSecondaryColor3iv"); + glad_glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC) load(userptr, "glSecondaryColor3s"); + glad_glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC) load(userptr, "glSecondaryColor3sv"); + glad_glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC) load(userptr, "glSecondaryColor3ub"); + glad_glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC) load(userptr, "glSecondaryColor3ubv"); + glad_glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC) load(userptr, "glSecondaryColor3ui"); + glad_glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC) load(userptr, "glSecondaryColor3uiv"); + glad_glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC) load(userptr, "glSecondaryColor3us"); + glad_glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC) load(userptr, "glSecondaryColor3usv"); + glad_glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC) load(userptr, "glSecondaryColorPointer"); + glad_glWindowPos2d = (PFNGLWINDOWPOS2DPROC) load(userptr, "glWindowPos2d"); + glad_glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC) load(userptr, "glWindowPos2dv"); + glad_glWindowPos2f = (PFNGLWINDOWPOS2FPROC) load(userptr, "glWindowPos2f"); + glad_glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC) load(userptr, "glWindowPos2fv"); + glad_glWindowPos2i = (PFNGLWINDOWPOS2IPROC) load(userptr, "glWindowPos2i"); + glad_glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC) load(userptr, "glWindowPos2iv"); + glad_glWindowPos2s = (PFNGLWINDOWPOS2SPROC) load(userptr, "glWindowPos2s"); + glad_glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC) load(userptr, "glWindowPos2sv"); + glad_glWindowPos3d = (PFNGLWINDOWPOS3DPROC) load(userptr, "glWindowPos3d"); + glad_glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC) load(userptr, "glWindowPos3dv"); + glad_glWindowPos3f = (PFNGLWINDOWPOS3FPROC) load(userptr, "glWindowPos3f"); + glad_glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC) load(userptr, "glWindowPos3fv"); + glad_glWindowPos3i = (PFNGLWINDOWPOS3IPROC) load(userptr, "glWindowPos3i"); + glad_glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC) load(userptr, "glWindowPos3iv"); + glad_glWindowPos3s = (PFNGLWINDOWPOS3SPROC) load(userptr, "glWindowPos3s"); + glad_glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC) load(userptr, "glWindowPos3sv"); +} +static void glad_gl_load_GL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_1_5) return; + glad_glBeginQuery = (PFNGLBEGINQUERYPROC) load(userptr, "glBeginQuery"); + glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); + glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); + glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); + glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); + glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(userptr, "glDeleteQueries"); + glad_glEndQuery = (PFNGLENDQUERYPROC) load(userptr, "glEndQuery"); + glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); + glad_glGenQueries = (PFNGLGENQUERIESPROC) load(userptr, "glGenQueries"); + glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); + glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); + glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData"); + glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) load(userptr, "glGetQueryObjectiv"); + glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(userptr, "glGetQueryObjectuiv"); + glad_glGetQueryiv = (PFNGLGETQUERYIVPROC) load(userptr, "glGetQueryiv"); + glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); + glad_glIsQuery = (PFNGLISQUERYPROC) load(userptr, "glIsQuery"); + glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer"); + glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); +} +static void glad_gl_load_GL_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_2_0) return; + glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); + glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); + glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); + glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); + glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); + glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); + glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram"); + glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader"); + glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); + glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); + glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(userptr, "glDrawBuffers"); + glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); + glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); + glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); + glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders"); + glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); + glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog"); + glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv"); + glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog"); + glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); + glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv"); + glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); + glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); + glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); + glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); + glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram"); + glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader"); + glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); + glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); + glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate"); + glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate"); + glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate"); + glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); + glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); + glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); + glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); + glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); + glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); + glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); + glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); + glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); + glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); + glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); + glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); + glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); + glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); + glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); + glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); + glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); + glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); + glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); + glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); + glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); + glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); + glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); + glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); + glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); + glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); + glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); + glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); + glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); + glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); + glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); + glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); + glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); + glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); + glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); + glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); + glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); + glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); + glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); + glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); + glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); + glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); + glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); + glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); + glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); + glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); + glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); + glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); + glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); + glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); +} +static void glad_gl_load_GL_VERSION_2_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_2_1) return; + glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(userptr, "glUniformMatrix2x3fv"); + glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(userptr, "glUniformMatrix2x4fv"); + glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(userptr, "glUniformMatrix3x2fv"); + glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(userptr, "glUniformMatrix3x4fv"); + glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(userptr, "glUniformMatrix4x2fv"); + glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(userptr, "glUniformMatrix4x3fv"); +} +static void glad_gl_load_GL_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_0) return; + glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) load(userptr, "glBeginConditionalRender"); + glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(userptr, "glBeginTransformFeedback"); + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) load(userptr, "glBindFragDataLocation"); + glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); + glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); + glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); + glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); + glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + glad_glClampColor = (PFNGLCLAMPCOLORPROC) load(userptr, "glClampColor"); + glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(userptr, "glClearBufferfi"); + glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(userptr, "glClearBufferfv"); + glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(userptr, "glClearBufferiv"); + glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(userptr, "glClearBufferuiv"); + glad_glColorMaski = (PFNGLCOLORMASKIPROC) load(userptr, "glColorMaski"); + glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); + glad_glDisablei = (PFNGLDISABLEIPROC) load(userptr, "glDisablei"); + glad_glEnablei = (PFNGLENABLEIPROC) load(userptr, "glEnablei"); + glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) load(userptr, "glEndConditionalRender"); + glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(userptr, "glEndTransformFeedback"); + glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); + glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); + glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); + glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); + glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load(userptr, "glGetBooleani_v"); + glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(userptr, "glGetFragDataLocation"); + glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + glad_glGetStringi = (PFNGLGETSTRINGIPROC) load(userptr, "glGetStringi"); + glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load(userptr, "glGetTexParameterIiv"); + glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load(userptr, "glGetTexParameterIuiv"); + glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(userptr, "glGetTransformFeedbackVarying"); + glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(userptr, "glGetUniformuiv"); + glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(userptr, "glGetVertexAttribIiv"); + glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(userptr, "glGetVertexAttribIuiv"); + glad_glIsEnabledi = (PFNGLISENABLEDIPROC) load(userptr, "glIsEnabledi"); + glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); + glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); + glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); + glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load(userptr, "glTexParameterIiv"); + glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load(userptr, "glTexParameterIuiv"); + glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(userptr, "glTransformFeedbackVaryings"); + glad_glUniform1ui = (PFNGLUNIFORM1UIPROC) load(userptr, "glUniform1ui"); + glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(userptr, "glUniform1uiv"); + glad_glUniform2ui = (PFNGLUNIFORM2UIPROC) load(userptr, "glUniform2ui"); + glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(userptr, "glUniform2uiv"); + glad_glUniform3ui = (PFNGLUNIFORM3UIPROC) load(userptr, "glUniform3ui"); + glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(userptr, "glUniform3uiv"); + glad_glUniform4ui = (PFNGLUNIFORM4UIPROC) load(userptr, "glUniform4ui"); + glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(userptr, "glUniform4uiv"); + glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) load(userptr, "glVertexAttribI1i"); + glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) load(userptr, "glVertexAttribI1iv"); + glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) load(userptr, "glVertexAttribI1ui"); + glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) load(userptr, "glVertexAttribI1uiv"); + glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) load(userptr, "glVertexAttribI2i"); + glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) load(userptr, "glVertexAttribI2iv"); + glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) load(userptr, "glVertexAttribI2ui"); + glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) load(userptr, "glVertexAttribI2uiv"); + glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) load(userptr, "glVertexAttribI3i"); + glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) load(userptr, "glVertexAttribI3iv"); + glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) load(userptr, "glVertexAttribI3ui"); + glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) load(userptr, "glVertexAttribI3uiv"); + glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) load(userptr, "glVertexAttribI4bv"); + glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(userptr, "glVertexAttribI4i"); + glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(userptr, "glVertexAttribI4iv"); + glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) load(userptr, "glVertexAttribI4sv"); + glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) load(userptr, "glVertexAttribI4ubv"); + glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(userptr, "glVertexAttribI4ui"); + glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(userptr, "glVertexAttribI4uiv"); + glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) load(userptr, "glVertexAttribI4usv"); + glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(userptr, "glVertexAttribIPointer"); +} +static void glad_gl_load_GL_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_1) return; + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); + glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(userptr, "glDrawArraysInstanced"); + glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(userptr, "glDrawElementsInstanced"); + glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); + glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); + glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName"); + glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); + glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); + glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) load(userptr, "glPrimitiveRestartIndex"); + glad_glTexBuffer = (PFNGLTEXBUFFERPROC) load(userptr, "glTexBuffer"); + glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); +} +static void glad_gl_load_GL_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_2) return; + glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); + glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); + glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); + glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); + glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); + glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); + glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); + glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(userptr, "glGetBufferParameteri64v"); + glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(userptr, "glGetInteger64i_v"); + glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); + glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); + glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); + glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); + glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex"); + glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex"); + glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); + glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample"); + glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample"); + glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); +} +static void glad_gl_load_GL_VERSION_3_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_VERSION_3_3) return; + glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed"); + glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + glad_glColorP3ui = (PFNGLCOLORP3UIPROC) load(userptr, "glColorP3ui"); + glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC) load(userptr, "glColorP3uiv"); + glad_glColorP4ui = (PFNGLCOLORP4UIPROC) load(userptr, "glColorP4ui"); + glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC) load(userptr, "glColorP4uiv"); + glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex"); + glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v"); + glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v"); + glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); + glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); + glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load(userptr, "glMultiTexCoordP1ui"); + glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load(userptr, "glMultiTexCoordP1uiv"); + glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load(userptr, "glMultiTexCoordP2ui"); + glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load(userptr, "glMultiTexCoordP2uiv"); + glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load(userptr, "glMultiTexCoordP3ui"); + glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load(userptr, "glMultiTexCoordP3uiv"); + glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load(userptr, "glMultiTexCoordP4ui"); + glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load(userptr, "glMultiTexCoordP4uiv"); + glad_glNormalP3ui = (PFNGLNORMALP3UIPROC) load(userptr, "glNormalP3ui"); + glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load(userptr, "glNormalP3uiv"); + glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter"); + glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); + glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); + glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); + glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load(userptr, "glSecondaryColorP3ui"); + glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load(userptr, "glSecondaryColorP3uiv"); + glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load(userptr, "glTexCoordP1ui"); + glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load(userptr, "glTexCoordP1uiv"); + glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load(userptr, "glTexCoordP2ui"); + glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load(userptr, "glTexCoordP2uiv"); + glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load(userptr, "glTexCoordP3ui"); + glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load(userptr, "glTexCoordP3uiv"); + glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load(userptr, "glTexCoordP4ui"); + glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load(userptr, "glTexCoordP4uiv"); + glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(userptr, "glVertexAttribDivisor"); + glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui"); + glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv"); + glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui"); + glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv"); + glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui"); + glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv"); + glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); + glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); + glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC) load(userptr, "glVertexP2ui"); + glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load(userptr, "glVertexP2uiv"); + glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC) load(userptr, "glVertexP3ui"); + glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load(userptr, "glVertexP3uiv"); + glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC) load(userptr, "glVertexP4ui"); + glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load(userptr, "glVertexP4uiv"); +} +static void glad_gl_load_GL_APPLE_flush_buffer_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_flush_buffer_range) return; + glad_glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC) load(userptr, "glBufferParameteriAPPLE"); + glad_glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) load(userptr, "glFlushMappedBufferRangeAPPLE"); +} +static void glad_gl_load_GL_APPLE_vertex_array_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_APPLE_vertex_array_object) return; + glad_glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC) load(userptr, "glBindVertexArrayAPPLE"); + glad_glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC) load(userptr, "glDeleteVertexArraysAPPLE"); + glad_glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC) load(userptr, "glGenVertexArraysAPPLE"); + glad_glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC) load(userptr, "glIsVertexArrayAPPLE"); +} +static void glad_gl_load_GL_ARB_blend_func_extended( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_blend_func_extended) return; + glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed"); + glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex"); +} +static void glad_gl_load_GL_ARB_color_buffer_float( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_color_buffer_float) return; + glad_glClampColorARB = (PFNGLCLAMPCOLORARBPROC) load(userptr, "glClampColorARB"); +} +static void glad_gl_load_GL_ARB_copy_buffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_copy_buffer) return; + glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); +} +static void glad_gl_load_GL_ARB_draw_buffers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_draw_buffers) return; + glad_glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC) load(userptr, "glDrawBuffersARB"); +} +static void glad_gl_load_GL_ARB_draw_elements_base_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_draw_elements_base_vertex) return; + glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); + glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); + glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); + glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex"); +} +static void glad_gl_load_GL_ARB_draw_instanced( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_draw_instanced) return; + glad_glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC) load(userptr, "glDrawArraysInstancedARB"); + glad_glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC) load(userptr, "glDrawElementsInstancedARB"); +} +static void glad_gl_load_GL_ARB_framebuffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_framebuffer_object) return; + glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); + glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); + glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); + glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); + glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); + glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); +} +static void glad_gl_load_GL_ARB_geometry_shader4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_geometry_shader4) return; + glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC) load(userptr, "glFramebufferTextureARB"); + glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB"); + glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) load(userptr, "glFramebufferTextureLayerARB"); + glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC) load(userptr, "glProgramParameteriARB"); +} +static void glad_gl_load_GL_ARB_imaging( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_imaging) return; + glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); + glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + glad_glColorSubTable = (PFNGLCOLORSUBTABLEPROC) load(userptr, "glColorSubTable"); + glad_glColorTable = (PFNGLCOLORTABLEPROC) load(userptr, "glColorTable"); + glad_glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC) load(userptr, "glColorTableParameterfv"); + glad_glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC) load(userptr, "glColorTableParameteriv"); + glad_glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC) load(userptr, "glConvolutionFilter1D"); + glad_glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC) load(userptr, "glConvolutionFilter2D"); + glad_glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC) load(userptr, "glConvolutionParameterf"); + glad_glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC) load(userptr, "glConvolutionParameterfv"); + glad_glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC) load(userptr, "glConvolutionParameteri"); + glad_glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC) load(userptr, "glConvolutionParameteriv"); + glad_glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC) load(userptr, "glCopyColorSubTable"); + glad_glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC) load(userptr, "glCopyColorTable"); + glad_glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC) load(userptr, "glCopyConvolutionFilter1D"); + glad_glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC) load(userptr, "glCopyConvolutionFilter2D"); + glad_glGetColorTable = (PFNGLGETCOLORTABLEPROC) load(userptr, "glGetColorTable"); + glad_glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC) load(userptr, "glGetColorTableParameterfv"); + glad_glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC) load(userptr, "glGetColorTableParameteriv"); + glad_glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC) load(userptr, "glGetConvolutionFilter"); + glad_glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC) load(userptr, "glGetConvolutionParameterfv"); + glad_glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC) load(userptr, "glGetConvolutionParameteriv"); + glad_glGetHistogram = (PFNGLGETHISTOGRAMPROC) load(userptr, "glGetHistogram"); + glad_glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC) load(userptr, "glGetHistogramParameterfv"); + glad_glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC) load(userptr, "glGetHistogramParameteriv"); + glad_glGetMinmax = (PFNGLGETMINMAXPROC) load(userptr, "glGetMinmax"); + glad_glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC) load(userptr, "glGetMinmaxParameterfv"); + glad_glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC) load(userptr, "glGetMinmaxParameteriv"); + glad_glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC) load(userptr, "glGetSeparableFilter"); + glad_glHistogram = (PFNGLHISTOGRAMPROC) load(userptr, "glHistogram"); + glad_glMinmax = (PFNGLMINMAXPROC) load(userptr, "glMinmax"); + glad_glResetHistogram = (PFNGLRESETHISTOGRAMPROC) load(userptr, "glResetHistogram"); + glad_glResetMinmax = (PFNGLRESETMINMAXPROC) load(userptr, "glResetMinmax"); + glad_glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC) load(userptr, "glSeparableFilter2D"); +} +static void glad_gl_load_GL_ARB_instanced_arrays( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_instanced_arrays) return; + glad_glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC) load(userptr, "glVertexAttribDivisorARB"); +} +static void glad_gl_load_GL_ARB_map_buffer_range( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_map_buffer_range) return; + glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); + glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); +} +static void glad_gl_load_GL_ARB_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_multisample) return; + glad_glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC) load(userptr, "glSampleCoverageARB"); +} +static void glad_gl_load_GL_ARB_multitexture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_multitexture) return; + glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) load(userptr, "glActiveTextureARB"); + glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) load(userptr, "glClientActiveTextureARB"); + glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC) load(userptr, "glMultiTexCoord1dARB"); + glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC) load(userptr, "glMultiTexCoord1dvARB"); + glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) load(userptr, "glMultiTexCoord1fARB"); + glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) load(userptr, "glMultiTexCoord1fvARB"); + glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC) load(userptr, "glMultiTexCoord1iARB"); + glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC) load(userptr, "glMultiTexCoord1ivARB"); + glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC) load(userptr, "glMultiTexCoord1sARB"); + glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC) load(userptr, "glMultiTexCoord1svARB"); + glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC) load(userptr, "glMultiTexCoord2dARB"); + glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC) load(userptr, "glMultiTexCoord2dvARB"); + glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) load(userptr, "glMultiTexCoord2fARB"); + glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) load(userptr, "glMultiTexCoord2fvARB"); + glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC) load(userptr, "glMultiTexCoord2iARB"); + glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC) load(userptr, "glMultiTexCoord2ivARB"); + glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC) load(userptr, "glMultiTexCoord2sARB"); + glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC) load(userptr, "glMultiTexCoord2svARB"); + glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC) load(userptr, "glMultiTexCoord3dARB"); + glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC) load(userptr, "glMultiTexCoord3dvARB"); + glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) load(userptr, "glMultiTexCoord3fARB"); + glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) load(userptr, "glMultiTexCoord3fvARB"); + glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC) load(userptr, "glMultiTexCoord3iARB"); + glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC) load(userptr, "glMultiTexCoord3ivARB"); + glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC) load(userptr, "glMultiTexCoord3sARB"); + glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC) load(userptr, "glMultiTexCoord3svARB"); + glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC) load(userptr, "glMultiTexCoord4dARB"); + glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC) load(userptr, "glMultiTexCoord4dvARB"); + glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) load(userptr, "glMultiTexCoord4fARB"); + glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) load(userptr, "glMultiTexCoord4fvARB"); + glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC) load(userptr, "glMultiTexCoord4iARB"); + glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC) load(userptr, "glMultiTexCoord4ivARB"); + glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC) load(userptr, "glMultiTexCoord4sARB"); + glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC) load(userptr, "glMultiTexCoord4svARB"); +} +static void glad_gl_load_GL_ARB_occlusion_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_occlusion_query) return; + glad_glBeginQueryARB = (PFNGLBEGINQUERYARBPROC) load(userptr, "glBeginQueryARB"); + glad_glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC) load(userptr, "glDeleteQueriesARB"); + glad_glEndQueryARB = (PFNGLENDQUERYARBPROC) load(userptr, "glEndQueryARB"); + glad_glGenQueriesARB = (PFNGLGENQUERIESARBPROC) load(userptr, "glGenQueriesARB"); + glad_glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC) load(userptr, "glGetQueryObjectivARB"); + glad_glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC) load(userptr, "glGetQueryObjectuivARB"); + glad_glGetQueryivARB = (PFNGLGETQUERYIVARBPROC) load(userptr, "glGetQueryivARB"); + glad_glIsQueryARB = (PFNGLISQUERYARBPROC) load(userptr, "glIsQueryARB"); +} +static void glad_gl_load_GL_ARB_point_parameters( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_point_parameters) return; + glad_glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC) load(userptr, "glPointParameterfARB"); + glad_glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC) load(userptr, "glPointParameterfvARB"); +} +static void glad_gl_load_GL_ARB_provoking_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_provoking_vertex) return; + glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex"); +} +static void glad_gl_load_GL_ARB_sampler_objects( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_sampler_objects) return; + glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); + glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); + glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); + glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); + glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); +} +static void glad_gl_load_GL_ARB_shader_objects( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_shader_objects) return; + glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) load(userptr, "glAttachObjectARB"); + glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) load(userptr, "glCompileShaderARB"); + glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) load(userptr, "glCreateProgramObjectARB"); + glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) load(userptr, "glCreateShaderObjectARB"); + glad_glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) load(userptr, "glDeleteObjectARB"); + glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) load(userptr, "glDetachObjectARB"); + glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) load(userptr, "glGetActiveUniformARB"); + glad_glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) load(userptr, "glGetAttachedObjectsARB"); + glad_glGetHandleARB = (PFNGLGETHANDLEARBPROC) load(userptr, "glGetHandleARB"); + glad_glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) load(userptr, "glGetInfoLogARB"); + glad_glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) load(userptr, "glGetObjectParameterfvARB"); + glad_glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) load(userptr, "glGetObjectParameterivARB"); + glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) load(userptr, "glGetShaderSourceARB"); + glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) load(userptr, "glGetUniformLocationARB"); + glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) load(userptr, "glGetUniformfvARB"); + glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) load(userptr, "glGetUniformivARB"); + glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) load(userptr, "glLinkProgramARB"); + glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) load(userptr, "glShaderSourceARB"); + glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC) load(userptr, "glUniform1fARB"); + glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) load(userptr, "glUniform1fvARB"); + glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC) load(userptr, "glUniform1iARB"); + glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) load(userptr, "glUniform1ivARB"); + glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC) load(userptr, "glUniform2fARB"); + glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) load(userptr, "glUniform2fvARB"); + glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC) load(userptr, "glUniform2iARB"); + glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) load(userptr, "glUniform2ivARB"); + glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC) load(userptr, "glUniform3fARB"); + glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) load(userptr, "glUniform3fvARB"); + glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC) load(userptr, "glUniform3iARB"); + glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) load(userptr, "glUniform3ivARB"); + glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC) load(userptr, "glUniform4fARB"); + glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) load(userptr, "glUniform4fvARB"); + glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC) load(userptr, "glUniform4iARB"); + glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) load(userptr, "glUniform4ivARB"); + glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) load(userptr, "glUniformMatrix2fvARB"); + glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) load(userptr, "glUniformMatrix3fvARB"); + glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) load(userptr, "glUniformMatrix4fvARB"); + glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) load(userptr, "glUseProgramObjectARB"); + glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) load(userptr, "glValidateProgramARB"); +} +static void glad_gl_load_GL_ARB_sync( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_sync) return; + glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); + glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); + glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); + glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); + glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); + glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); + glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); +} +static void glad_gl_load_GL_ARB_texture_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_buffer_object) return; + glad_glTexBufferARB = (PFNGLTEXBUFFERARBPROC) load(userptr, "glTexBufferARB"); +} +static void glad_gl_load_GL_ARB_texture_compression( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_compression) return; + glad_glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) load(userptr, "glCompressedTexImage1DARB"); + glad_glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) load(userptr, "glCompressedTexImage2DARB"); + glad_glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) load(userptr, "glCompressedTexImage3DARB"); + glad_glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) load(userptr, "glCompressedTexSubImage1DARB"); + glad_glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) load(userptr, "glCompressedTexSubImage2DARB"); + glad_glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) load(userptr, "glCompressedTexSubImage3DARB"); + glad_glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) load(userptr, "glGetCompressedTexImageARB"); +} +static void glad_gl_load_GL_ARB_texture_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_texture_multisample) return; + glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); + glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); + glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample"); + glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample"); +} +static void glad_gl_load_GL_ARB_timer_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_timer_query) return; + glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v"); + glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v"); + glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter"); +} +static void glad_gl_load_GL_ARB_transpose_matrix( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_transpose_matrix) return; + glad_glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC) load(userptr, "glLoadTransposeMatrixdARB"); + glad_glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC) load(userptr, "glLoadTransposeMatrixfARB"); + glad_glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC) load(userptr, "glMultTransposeMatrixdARB"); + glad_glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC) load(userptr, "glMultTransposeMatrixfARB"); +} +static void glad_gl_load_GL_ARB_uniform_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_uniform_buffer_object) return; + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); + glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); + glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName"); + glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); + glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); + glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); +} +static void glad_gl_load_GL_ARB_vertex_array_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_array_object) return; + glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); + glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); + glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); + glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); +} +static void glad_gl_load_GL_ARB_vertex_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_buffer_object) return; + glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) load(userptr, "glBindBufferARB"); + glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) load(userptr, "glBufferDataARB"); + glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) load(userptr, "glBufferSubDataARB"); + glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) load(userptr, "glDeleteBuffersARB"); + glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) load(userptr, "glGenBuffersARB"); + glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) load(userptr, "glGetBufferParameterivARB"); + glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) load(userptr, "glGetBufferPointervARB"); + glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) load(userptr, "glGetBufferSubDataARB"); + glad_glIsBufferARB = (PFNGLISBUFFERARBPROC) load(userptr, "glIsBufferARB"); + glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) load(userptr, "glMapBufferARB"); + glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) load(userptr, "glUnmapBufferARB"); +} +static void glad_gl_load_GL_ARB_vertex_program( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_program) return; + glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB"); + glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB"); + glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB"); + glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB"); + glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB"); + glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB"); + glad_glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) load(userptr, "glGetProgramEnvParameterfvARB"); + glad_glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) load(userptr, "glGetProgramLocalParameterdvARB"); + glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB"); + glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB"); + glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB"); + glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB"); + glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB"); + glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB"); + glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB"); + glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB"); + glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB"); + glad_glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) load(userptr, "glProgramEnvParameter4dvARB"); + glad_glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) load(userptr, "glProgramEnvParameter4fARB"); + glad_glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) load(userptr, "glProgramEnvParameter4fvARB"); + glad_glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) load(userptr, "glProgramLocalParameter4dARB"); + glad_glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) load(userptr, "glProgramLocalParameter4dvARB"); + glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB"); + glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB"); + glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB"); + glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB"); + glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB"); + glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB"); + glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB"); + glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB"); + glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB"); + glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB"); + glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB"); + glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB"); + glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB"); + glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB"); + glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB"); + glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB"); + glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB"); + glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB"); + glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB"); + glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB"); + glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB"); + glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB"); + glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB"); + glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB"); + glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB"); + glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB"); + glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB"); + glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB"); + glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB"); + glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB"); + glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB"); + glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB"); + glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB"); + glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB"); + glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB"); + glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB"); + glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB"); + glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB"); + glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB"); + glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB"); +} +static void glad_gl_load_GL_ARB_vertex_shader( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_shader) return; + glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) load(userptr, "glBindAttribLocationARB"); + glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB"); + glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB"); + glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) load(userptr, "glGetActiveAttribARB"); + glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) load(userptr, "glGetAttribLocationARB"); + glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB"); + glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB"); + glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB"); + glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB"); + glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB"); + glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB"); + glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB"); + glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB"); + glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB"); + glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB"); + glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB"); + glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB"); + glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB"); + glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB"); + glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB"); + glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB"); + glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB"); + glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB"); + glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB"); + glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB"); + glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB"); + glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB"); + glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB"); + glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB"); + glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB"); + glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB"); + glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB"); + glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB"); + glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB"); + glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB"); + glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB"); + glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB"); + glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB"); + glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB"); + glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB"); + glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB"); + glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB"); + glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB"); + glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB"); + glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB"); + glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB"); +} +static void glad_gl_load_GL_ARB_vertex_type_2_10_10_10_rev( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_vertex_type_2_10_10_10_rev) return; + glad_glColorP3ui = (PFNGLCOLORP3UIPROC) load(userptr, "glColorP3ui"); + glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC) load(userptr, "glColorP3uiv"); + glad_glColorP4ui = (PFNGLCOLORP4UIPROC) load(userptr, "glColorP4ui"); + glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC) load(userptr, "glColorP4uiv"); + glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load(userptr, "glMultiTexCoordP1ui"); + glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load(userptr, "glMultiTexCoordP1uiv"); + glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load(userptr, "glMultiTexCoordP2ui"); + glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load(userptr, "glMultiTexCoordP2uiv"); + glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load(userptr, "glMultiTexCoordP3ui"); + glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load(userptr, "glMultiTexCoordP3uiv"); + glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load(userptr, "glMultiTexCoordP4ui"); + glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load(userptr, "glMultiTexCoordP4uiv"); + glad_glNormalP3ui = (PFNGLNORMALP3UIPROC) load(userptr, "glNormalP3ui"); + glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load(userptr, "glNormalP3uiv"); + glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load(userptr, "glSecondaryColorP3ui"); + glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load(userptr, "glSecondaryColorP3uiv"); + glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load(userptr, "glTexCoordP1ui"); + glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load(userptr, "glTexCoordP1uiv"); + glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load(userptr, "glTexCoordP2ui"); + glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load(userptr, "glTexCoordP2uiv"); + glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load(userptr, "glTexCoordP3ui"); + glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load(userptr, "glTexCoordP3uiv"); + glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load(userptr, "glTexCoordP4ui"); + glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load(userptr, "glTexCoordP4uiv"); + glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui"); + glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv"); + glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui"); + glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv"); + glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui"); + glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv"); + glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); + glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); + glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC) load(userptr, "glVertexP2ui"); + glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load(userptr, "glVertexP2uiv"); + glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC) load(userptr, "glVertexP3ui"); + glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load(userptr, "glVertexP3uiv"); + glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC) load(userptr, "glVertexP4ui"); + glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load(userptr, "glVertexP4uiv"); +} +static void glad_gl_load_GL_ARB_window_pos( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ARB_window_pos) return; + glad_glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC) load(userptr, "glWindowPos2dARB"); + glad_glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC) load(userptr, "glWindowPos2dvARB"); + glad_glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC) load(userptr, "glWindowPos2fARB"); + glad_glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC) load(userptr, "glWindowPos2fvARB"); + glad_glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC) load(userptr, "glWindowPos2iARB"); + glad_glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC) load(userptr, "glWindowPos2ivARB"); + glad_glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC) load(userptr, "glWindowPos2sARB"); + glad_glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC) load(userptr, "glWindowPos2svARB"); + glad_glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC) load(userptr, "glWindowPos3dARB"); + glad_glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC) load(userptr, "glWindowPos3dvARB"); + glad_glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC) load(userptr, "glWindowPos3fARB"); + glad_glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC) load(userptr, "glWindowPos3fvARB"); + glad_glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC) load(userptr, "glWindowPos3iARB"); + glad_glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC) load(userptr, "glWindowPos3ivARB"); + glad_glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC) load(userptr, "glWindowPos3sARB"); + glad_glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC) load(userptr, "glWindowPos3svARB"); +} +static void glad_gl_load_GL_ATI_draw_buffers( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_draw_buffers) return; + glad_glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC) load(userptr, "glDrawBuffersATI"); +} +static void glad_gl_load_GL_ATI_separate_stencil( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ATI_separate_stencil) return; + glad_glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC) load(userptr, "glStencilFuncSeparateATI"); + glad_glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC) load(userptr, "glStencilOpSeparateATI"); +} +static void glad_gl_load_GL_EXT_blend_color( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_blend_color) return; + glad_glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC) load(userptr, "glBlendColorEXT"); +} +static void glad_gl_load_GL_EXT_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_blend_equation_separate) return; + glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC) load(userptr, "glBlendEquationSeparateEXT"); +} +static void glad_gl_load_GL_EXT_blend_func_separate( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_blend_func_separate) return; + glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) load(userptr, "glBlendFuncSeparateEXT"); +} +static void glad_gl_load_GL_EXT_blend_minmax( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_blend_minmax) return; + glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC) load(userptr, "glBlendEquationEXT"); +} +static void glad_gl_load_GL_EXT_copy_texture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_copy_texture) return; + glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC) load(userptr, "glCopyTexImage1DEXT"); + glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC) load(userptr, "glCopyTexImage2DEXT"); + glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyTexSubImage1DEXT"); + glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyTexSubImage2DEXT"); + glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC) load(userptr, "glCopyTexSubImage3DEXT"); +} +static void glad_gl_load_GL_EXT_direct_state_access( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_direct_state_access) return; + glad_glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC) load(userptr, "glBindMultiTextureEXT"); + glad_glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckNamedFramebufferStatusEXT"); + glad_glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC) load(userptr, "glClearNamedBufferDataEXT"); + glad_glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) load(userptr, "glClearNamedBufferSubDataEXT"); + glad_glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC) load(userptr, "glClientAttribDefaultEXT"); + glad_glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) load(userptr, "glCompressedMultiTexImage1DEXT"); + glad_glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) load(userptr, "glCompressedMultiTexImage2DEXT"); + glad_glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) load(userptr, "glCompressedMultiTexImage3DEXT"); + glad_glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) load(userptr, "glCompressedMultiTexSubImage1DEXT"); + glad_glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) load(userptr, "glCompressedMultiTexSubImage2DEXT"); + glad_glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) load(userptr, "glCompressedMultiTexSubImage3DEXT"); + glad_glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) load(userptr, "glCompressedTextureImage1DEXT"); + glad_glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) load(userptr, "glCompressedTextureImage2DEXT"); + glad_glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) load(userptr, "glCompressedTextureImage3DEXT"); + glad_glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) load(userptr, "glCompressedTextureSubImage1DEXT"); + glad_glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) load(userptr, "glCompressedTextureSubImage2DEXT"); + glad_glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) load(userptr, "glCompressedTextureSubImage3DEXT"); + glad_glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC) load(userptr, "glCopyMultiTexImage1DEXT"); + glad_glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC) load(userptr, "glCopyMultiTexImage2DEXT"); + glad_glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyMultiTexSubImage1DEXT"); + glad_glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyMultiTexSubImage2DEXT"); + glad_glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) load(userptr, "glCopyMultiTexSubImage3DEXT"); + glad_glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC) load(userptr, "glCopyTextureImage1DEXT"); + glad_glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC) load(userptr, "glCopyTextureImage2DEXT"); + glad_glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) load(userptr, "glCopyTextureSubImage1DEXT"); + glad_glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) load(userptr, "glCopyTextureSubImage2DEXT"); + glad_glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) load(userptr, "glCopyTextureSubImage3DEXT"); + glad_glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) load(userptr, "glDisableClientStateIndexedEXT"); + glad_glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC) load(userptr, "glDisableClientStateiEXT"); + glad_glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC) load(userptr, "glDisableIndexedEXT"); + glad_glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) load(userptr, "glDisableVertexArrayAttribEXT"); + glad_glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC) load(userptr, "glDisableVertexArrayEXT"); + glad_glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) load(userptr, "glEnableClientStateIndexedEXT"); + glad_glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC) load(userptr, "glEnableClientStateiEXT"); + glad_glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC) load(userptr, "glEnableIndexedEXT"); + glad_glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) load(userptr, "glEnableVertexArrayAttribEXT"); + glad_glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC) load(userptr, "glEnableVertexArrayEXT"); + glad_glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) load(userptr, "glFlushMappedNamedBufferRangeEXT"); + glad_glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) load(userptr, "glFramebufferDrawBufferEXT"); + glad_glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) load(userptr, "glFramebufferDrawBuffersEXT"); + glad_glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC) load(userptr, "glFramebufferReadBufferEXT"); + glad_glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC) load(userptr, "glGenerateMultiTexMipmapEXT"); + glad_glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC) load(userptr, "glGenerateTextureMipmapEXT"); + glad_glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC) load(userptr, "glGetBooleanIndexedvEXT"); + glad_glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) load(userptr, "glGetCompressedMultiTexImageEXT"); + glad_glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) load(userptr, "glGetCompressedTextureImageEXT"); + glad_glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC) load(userptr, "glGetDoubleIndexedvEXT"); + glad_glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC) load(userptr, "glGetDoublei_vEXT"); + glad_glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC) load(userptr, "glGetFloatIndexedvEXT"); + glad_glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC) load(userptr, "glGetFloati_vEXT"); + glad_glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferParameterivEXT"); + glad_glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC) load(userptr, "glGetIntegerIndexedvEXT"); + glad_glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC) load(userptr, "glGetMultiTexEnvfvEXT"); + glad_glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC) load(userptr, "glGetMultiTexEnvivEXT"); + glad_glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC) load(userptr, "glGetMultiTexGendvEXT"); + glad_glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC) load(userptr, "glGetMultiTexGenfvEXT"); + glad_glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC) load(userptr, "glGetMultiTexGenivEXT"); + glad_glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC) load(userptr, "glGetMultiTexImageEXT"); + glad_glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) load(userptr, "glGetMultiTexLevelParameterfvEXT"); + glad_glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) load(userptr, "glGetMultiTexLevelParameterivEXT"); + glad_glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC) load(userptr, "glGetMultiTexParameterIivEXT"); + glad_glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) load(userptr, "glGetMultiTexParameterIuivEXT"); + glad_glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC) load(userptr, "glGetMultiTexParameterfvEXT"); + glad_glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC) load(userptr, "glGetMultiTexParameterivEXT"); + glad_glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetNamedBufferParameterivEXT"); + glad_glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) load(userptr, "glGetNamedBufferPointervEXT"); + glad_glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) load(userptr, "glGetNamedBufferSubDataEXT"); + glad_glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetNamedFramebufferAttachmentParameterivEXT"); + glad_glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetNamedFramebufferParameterivEXT"); + glad_glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) load(userptr, "glGetNamedProgramLocalParameterIivEXT"); + glad_glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) load(userptr, "glGetNamedProgramLocalParameterIuivEXT"); + glad_glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) load(userptr, "glGetNamedProgramLocalParameterdvEXT"); + glad_glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) load(userptr, "glGetNamedProgramLocalParameterfvEXT"); + glad_glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) load(userptr, "glGetNamedProgramStringEXT"); + glad_glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC) load(userptr, "glGetNamedProgramivEXT"); + glad_glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetNamedRenderbufferParameterivEXT"); + glad_glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC) load(userptr, "glGetPointerIndexedvEXT"); + glad_glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC) load(userptr, "glGetPointeri_vEXT"); + glad_glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC) load(userptr, "glGetTextureImageEXT"); + glad_glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) load(userptr, "glGetTextureLevelParameterfvEXT"); + glad_glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) load(userptr, "glGetTextureLevelParameterivEXT"); + glad_glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC) load(userptr, "glGetTextureParameterIivEXT"); + glad_glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) load(userptr, "glGetTextureParameterIuivEXT"); + glad_glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC) load(userptr, "glGetTextureParameterfvEXT"); + glad_glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC) load(userptr, "glGetTextureParameterivEXT"); + glad_glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) load(userptr, "glGetVertexArrayIntegeri_vEXT"); + glad_glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC) load(userptr, "glGetVertexArrayIntegervEXT"); + glad_glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) load(userptr, "glGetVertexArrayPointeri_vEXT"); + glad_glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC) load(userptr, "glGetVertexArrayPointervEXT"); + glad_glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC) load(userptr, "glIsEnabledIndexedEXT"); + glad_glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC) load(userptr, "glMapNamedBufferEXT"); + glad_glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC) load(userptr, "glMapNamedBufferRangeEXT"); + glad_glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC) load(userptr, "glMatrixFrustumEXT"); + glad_glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC) load(userptr, "glMatrixLoadIdentityEXT"); + glad_glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC) load(userptr, "glMatrixLoadTransposedEXT"); + glad_glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC) load(userptr, "glMatrixLoadTransposefEXT"); + glad_glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC) load(userptr, "glMatrixLoaddEXT"); + glad_glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC) load(userptr, "glMatrixLoadfEXT"); + glad_glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC) load(userptr, "glMatrixMultTransposedEXT"); + glad_glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC) load(userptr, "glMatrixMultTransposefEXT"); + glad_glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC) load(userptr, "glMatrixMultdEXT"); + glad_glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC) load(userptr, "glMatrixMultfEXT"); + glad_glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC) load(userptr, "glMatrixOrthoEXT"); + glad_glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC) load(userptr, "glMatrixPopEXT"); + glad_glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC) load(userptr, "glMatrixPushEXT"); + glad_glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC) load(userptr, "glMatrixRotatedEXT"); + glad_glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC) load(userptr, "glMatrixRotatefEXT"); + glad_glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC) load(userptr, "glMatrixScaledEXT"); + glad_glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC) load(userptr, "glMatrixScalefEXT"); + glad_glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC) load(userptr, "glMatrixTranslatedEXT"); + glad_glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC) load(userptr, "glMatrixTranslatefEXT"); + glad_glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC) load(userptr, "glMultiTexBufferEXT"); + glad_glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC) load(userptr, "glMultiTexCoordPointerEXT"); + glad_glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC) load(userptr, "glMultiTexEnvfEXT"); + glad_glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC) load(userptr, "glMultiTexEnvfvEXT"); + glad_glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC) load(userptr, "glMultiTexEnviEXT"); + glad_glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC) load(userptr, "glMultiTexEnvivEXT"); + glad_glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC) load(userptr, "glMultiTexGendEXT"); + glad_glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC) load(userptr, "glMultiTexGendvEXT"); + glad_glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC) load(userptr, "glMultiTexGenfEXT"); + glad_glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC) load(userptr, "glMultiTexGenfvEXT"); + glad_glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC) load(userptr, "glMultiTexGeniEXT"); + glad_glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC) load(userptr, "glMultiTexGenivEXT"); + glad_glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC) load(userptr, "glMultiTexImage1DEXT"); + glad_glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC) load(userptr, "glMultiTexImage2DEXT"); + glad_glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC) load(userptr, "glMultiTexImage3DEXT"); + glad_glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC) load(userptr, "glMultiTexParameterIivEXT"); + glad_glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC) load(userptr, "glMultiTexParameterIuivEXT"); + glad_glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC) load(userptr, "glMultiTexParameterfEXT"); + glad_glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC) load(userptr, "glMultiTexParameterfvEXT"); + glad_glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC) load(userptr, "glMultiTexParameteriEXT"); + glad_glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC) load(userptr, "glMultiTexParameterivEXT"); + glad_glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC) load(userptr, "glMultiTexRenderbufferEXT"); + glad_glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC) load(userptr, "glMultiTexSubImage1DEXT"); + glad_glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC) load(userptr, "glMultiTexSubImage2DEXT"); + glad_glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC) load(userptr, "glMultiTexSubImage3DEXT"); + glad_glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC) load(userptr, "glNamedBufferDataEXT"); + glad_glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC) load(userptr, "glNamedBufferStorageEXT"); + glad_glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC) load(userptr, "glNamedBufferSubDataEXT"); + glad_glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) load(userptr, "glNamedCopyBufferSubDataEXT"); + glad_glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) load(userptr, "glNamedFramebufferParameteriEXT"); + glad_glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glNamedFramebufferRenderbufferEXT"); + glad_glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glNamedFramebufferTexture1DEXT"); + glad_glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glNamedFramebufferTexture2DEXT"); + glad_glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glNamedFramebufferTexture3DEXT"); + glad_glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glNamedFramebufferTextureEXT"); + glad_glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glNamedFramebufferTextureFaceEXT"); + glad_glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glNamedFramebufferTextureLayerEXT"); + glad_glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) load(userptr, "glNamedProgramLocalParameter4dEXT"); + glad_glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) load(userptr, "glNamedProgramLocalParameter4dvEXT"); + glad_glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) load(userptr, "glNamedProgramLocalParameter4fEXT"); + glad_glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) load(userptr, "glNamedProgramLocalParameter4fvEXT"); + glad_glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) load(userptr, "glNamedProgramLocalParameterI4iEXT"); + glad_glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) load(userptr, "glNamedProgramLocalParameterI4ivEXT"); + glad_glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) load(userptr, "glNamedProgramLocalParameterI4uiEXT"); + glad_glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) load(userptr, "glNamedProgramLocalParameterI4uivEXT"); + glad_glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) load(userptr, "glNamedProgramLocalParameters4fvEXT"); + glad_glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) load(userptr, "glNamedProgramLocalParametersI4ivEXT"); + glad_glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) load(userptr, "glNamedProgramLocalParametersI4uivEXT"); + glad_glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC) load(userptr, "glNamedProgramStringEXT"); + glad_glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) load(userptr, "glNamedRenderbufferStorageEXT"); + glad_glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) load(userptr, "glNamedRenderbufferStorageMultisampleCoverageEXT"); + glad_glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glNamedRenderbufferStorageMultisampleEXT"); + glad_glProgramUniform1dEXT = (PFNGLPROGRAMUNIFORM1DEXTPROC) load(userptr, "glProgramUniform1dEXT"); + glad_glProgramUniform1dvEXT = (PFNGLPROGRAMUNIFORM1DVEXTPROC) load(userptr, "glProgramUniform1dvEXT"); + glad_glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC) load(userptr, "glProgramUniform1fEXT"); + glad_glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC) load(userptr, "glProgramUniform1fvEXT"); + glad_glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC) load(userptr, "glProgramUniform1iEXT"); + glad_glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC) load(userptr, "glProgramUniform1ivEXT"); + glad_glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC) load(userptr, "glProgramUniform1uiEXT"); + glad_glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC) load(userptr, "glProgramUniform1uivEXT"); + glad_glProgramUniform2dEXT = (PFNGLPROGRAMUNIFORM2DEXTPROC) load(userptr, "glProgramUniform2dEXT"); + glad_glProgramUniform2dvEXT = (PFNGLPROGRAMUNIFORM2DVEXTPROC) load(userptr, "glProgramUniform2dvEXT"); + glad_glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC) load(userptr, "glProgramUniform2fEXT"); + glad_glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC) load(userptr, "glProgramUniform2fvEXT"); + glad_glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC) load(userptr, "glProgramUniform2iEXT"); + glad_glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC) load(userptr, "glProgramUniform2ivEXT"); + glad_glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC) load(userptr, "glProgramUniform2uiEXT"); + glad_glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC) load(userptr, "glProgramUniform2uivEXT"); + glad_glProgramUniform3dEXT = (PFNGLPROGRAMUNIFORM3DEXTPROC) load(userptr, "glProgramUniform3dEXT"); + glad_glProgramUniform3dvEXT = (PFNGLPROGRAMUNIFORM3DVEXTPROC) load(userptr, "glProgramUniform3dvEXT"); + glad_glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC) load(userptr, "glProgramUniform3fEXT"); + glad_glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC) load(userptr, "glProgramUniform3fvEXT"); + glad_glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC) load(userptr, "glProgramUniform3iEXT"); + glad_glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC) load(userptr, "glProgramUniform3ivEXT"); + glad_glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC) load(userptr, "glProgramUniform3uiEXT"); + glad_glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC) load(userptr, "glProgramUniform3uivEXT"); + glad_glProgramUniform4dEXT = (PFNGLPROGRAMUNIFORM4DEXTPROC) load(userptr, "glProgramUniform4dEXT"); + glad_glProgramUniform4dvEXT = (PFNGLPROGRAMUNIFORM4DVEXTPROC) load(userptr, "glProgramUniform4dvEXT"); + glad_glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC) load(userptr, "glProgramUniform4fEXT"); + glad_glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC) load(userptr, "glProgramUniform4fvEXT"); + glad_glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC) load(userptr, "glProgramUniform4iEXT"); + glad_glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC) load(userptr, "glProgramUniform4ivEXT"); + glad_glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC) load(userptr, "glProgramUniform4uiEXT"); + glad_glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC) load(userptr, "glProgramUniform4uivEXT"); + glad_glProgramUniformMatrix2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) load(userptr, "glProgramUniformMatrix2dvEXT"); + glad_glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) load(userptr, "glProgramUniformMatrix2fvEXT"); + glad_glProgramUniformMatrix2x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) load(userptr, "glProgramUniformMatrix2x3dvEXT"); + glad_glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) load(userptr, "glProgramUniformMatrix2x3fvEXT"); + glad_glProgramUniformMatrix2x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) load(userptr, "glProgramUniformMatrix2x4dvEXT"); + glad_glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) load(userptr, "glProgramUniformMatrix2x4fvEXT"); + glad_glProgramUniformMatrix3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) load(userptr, "glProgramUniformMatrix3dvEXT"); + glad_glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) load(userptr, "glProgramUniformMatrix3fvEXT"); + glad_glProgramUniformMatrix3x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) load(userptr, "glProgramUniformMatrix3x2dvEXT"); + glad_glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) load(userptr, "glProgramUniformMatrix3x2fvEXT"); + glad_glProgramUniformMatrix3x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) load(userptr, "glProgramUniformMatrix3x4dvEXT"); + glad_glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) load(userptr, "glProgramUniformMatrix3x4fvEXT"); + glad_glProgramUniformMatrix4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) load(userptr, "glProgramUniformMatrix4dvEXT"); + glad_glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) load(userptr, "glProgramUniformMatrix4fvEXT"); + glad_glProgramUniformMatrix4x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) load(userptr, "glProgramUniformMatrix4x2dvEXT"); + glad_glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) load(userptr, "glProgramUniformMatrix4x2fvEXT"); + glad_glProgramUniformMatrix4x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) load(userptr, "glProgramUniformMatrix4x3dvEXT"); + glad_glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) load(userptr, "glProgramUniformMatrix4x3fvEXT"); + glad_glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) load(userptr, "glPushClientAttribDefaultEXT"); + glad_glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC) load(userptr, "glTextureBufferEXT"); + glad_glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC) load(userptr, "glTextureBufferRangeEXT"); + glad_glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC) load(userptr, "glTextureImage1DEXT"); + glad_glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC) load(userptr, "glTextureImage2DEXT"); + glad_glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC) load(userptr, "glTextureImage3DEXT"); + glad_glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC) load(userptr, "glTexturePageCommitmentEXT"); + glad_glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC) load(userptr, "glTextureParameterIivEXT"); + glad_glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC) load(userptr, "glTextureParameterIuivEXT"); + glad_glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC) load(userptr, "glTextureParameterfEXT"); + glad_glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC) load(userptr, "glTextureParameterfvEXT"); + glad_glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC) load(userptr, "glTextureParameteriEXT"); + glad_glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC) load(userptr, "glTextureParameterivEXT"); + glad_glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC) load(userptr, "glTextureRenderbufferEXT"); + glad_glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC) load(userptr, "glTextureStorage1DEXT"); + glad_glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC) load(userptr, "glTextureStorage2DEXT"); + glad_glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) load(userptr, "glTextureStorage2DMultisampleEXT"); + glad_glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC) load(userptr, "glTextureStorage3DEXT"); + glad_glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) load(userptr, "glTextureStorage3DMultisampleEXT"); + glad_glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC) load(userptr, "glTextureSubImage1DEXT"); + glad_glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC) load(userptr, "glTextureSubImage2DEXT"); + glad_glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC) load(userptr, "glTextureSubImage3DEXT"); + glad_glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC) load(userptr, "glUnmapNamedBufferEXT"); + glad_glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) load(userptr, "glVertexArrayBindVertexBufferEXT"); + glad_glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) load(userptr, "glVertexArrayColorOffsetEXT"); + glad_glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) load(userptr, "glVertexArrayEdgeFlagOffsetEXT"); + glad_glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) load(userptr, "glVertexArrayFogCoordOffsetEXT"); + glad_glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) load(userptr, "glVertexArrayIndexOffsetEXT"); + glad_glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) load(userptr, "glVertexArrayMultiTexCoordOffsetEXT"); + glad_glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) load(userptr, "glVertexArrayNormalOffsetEXT"); + glad_glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) load(userptr, "glVertexArraySecondaryColorOffsetEXT"); + glad_glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) load(userptr, "glVertexArrayTexCoordOffsetEXT"); + glad_glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) load(userptr, "glVertexArrayVertexAttribBindingEXT"); + glad_glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) load(userptr, "glVertexArrayVertexAttribDivisorEXT"); + glad_glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) load(userptr, "glVertexArrayVertexAttribFormatEXT"); + glad_glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) load(userptr, "glVertexArrayVertexAttribIFormatEXT"); + glad_glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) load(userptr, "glVertexArrayVertexAttribIOffsetEXT"); + glad_glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) load(userptr, "glVertexArrayVertexAttribLFormatEXT"); + glad_glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) load(userptr, "glVertexArrayVertexAttribLOffsetEXT"); + glad_glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) load(userptr, "glVertexArrayVertexAttribOffsetEXT"); + glad_glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) load(userptr, "glVertexArrayVertexBindingDivisorEXT"); + glad_glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) load(userptr, "glVertexArrayVertexOffsetEXT"); +} +static void glad_gl_load_GL_EXT_draw_buffers2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_buffers2) return; + glad_glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC) load(userptr, "glColorMaskIndexedEXT"); + glad_glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC) load(userptr, "glDisableIndexedEXT"); + glad_glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC) load(userptr, "glEnableIndexedEXT"); + glad_glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC) load(userptr, "glGetBooleanIndexedvEXT"); + glad_glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC) load(userptr, "glGetIntegerIndexedvEXT"); + glad_glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC) load(userptr, "glIsEnabledIndexedEXT"); +} +static void glad_gl_load_GL_EXT_draw_instanced( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_instanced) return; + glad_glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC) load(userptr, "glDrawArraysInstancedEXT"); + glad_glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC) load(userptr, "glDrawElementsInstancedEXT"); +} +static void glad_gl_load_GL_EXT_draw_range_elements( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_draw_range_elements) return; + glad_glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC) load(userptr, "glDrawRangeElementsEXT"); +} +static void glad_gl_load_GL_EXT_fog_coord( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_fog_coord) return; + glad_glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC) load(userptr, "glFogCoordPointerEXT"); + glad_glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC) load(userptr, "glFogCoorddEXT"); + glad_glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC) load(userptr, "glFogCoorddvEXT"); + glad_glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) load(userptr, "glFogCoordfEXT"); + glad_glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC) load(userptr, "glFogCoordfvEXT"); +} +static void glad_gl_load_GL_EXT_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_framebuffer_blit) return; + glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) load(userptr, "glBlitFramebufferEXT"); +} +static void glad_gl_load_GL_EXT_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_framebuffer_multisample) return; + glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glRenderbufferStorageMultisampleEXT"); +} +static void glad_gl_load_GL_EXT_framebuffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_framebuffer_object) return; + glad_glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) load(userptr, "glBindFramebufferEXT"); + glad_glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) load(userptr, "glBindRenderbufferEXT"); + glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckFramebufferStatusEXT"); + glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) load(userptr, "glDeleteFramebuffersEXT"); + glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) load(userptr, "glDeleteRenderbuffersEXT"); + glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glFramebufferRenderbufferEXT"); + glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glFramebufferTexture1DEXT"); + glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glFramebufferTexture2DEXT"); + glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glFramebufferTexture3DEXT"); + glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) load(userptr, "glGenFramebuffersEXT"); + glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) load(userptr, "glGenRenderbuffersEXT"); + glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) load(userptr, "glGenerateMipmapEXT"); + glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferAttachmentParameterivEXT"); + glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetRenderbufferParameterivEXT"); + glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) load(userptr, "glIsFramebufferEXT"); + glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) load(userptr, "glIsRenderbufferEXT"); + glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) load(userptr, "glRenderbufferStorageEXT"); +} +static void glad_gl_load_GL_EXT_gpu_shader4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_gpu_shader4) return; + glad_glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC) load(userptr, "glBindFragDataLocationEXT"); + glad_glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC) load(userptr, "glGetFragDataLocationEXT"); + glad_glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC) load(userptr, "glGetUniformuivEXT"); + glad_glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC) load(userptr, "glGetVertexAttribIivEXT"); + glad_glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC) load(userptr, "glGetVertexAttribIuivEXT"); + glad_glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC) load(userptr, "glUniform1uiEXT"); + glad_glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC) load(userptr, "glUniform1uivEXT"); + glad_glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC) load(userptr, "glUniform2uiEXT"); + glad_glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC) load(userptr, "glUniform2uivEXT"); + glad_glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC) load(userptr, "glUniform3uiEXT"); + glad_glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC) load(userptr, "glUniform3uivEXT"); + glad_glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC) load(userptr, "glUniform4uiEXT"); + glad_glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC) load(userptr, "glUniform4uivEXT"); + glad_glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC) load(userptr, "glVertexAttribI1iEXT"); + glad_glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC) load(userptr, "glVertexAttribI1ivEXT"); + glad_glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC) load(userptr, "glVertexAttribI1uiEXT"); + glad_glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC) load(userptr, "glVertexAttribI1uivEXT"); + glad_glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC) load(userptr, "glVertexAttribI2iEXT"); + glad_glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC) load(userptr, "glVertexAttribI2ivEXT"); + glad_glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC) load(userptr, "glVertexAttribI2uiEXT"); + glad_glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC) load(userptr, "glVertexAttribI2uivEXT"); + glad_glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC) load(userptr, "glVertexAttribI3iEXT"); + glad_glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC) load(userptr, "glVertexAttribI3ivEXT"); + glad_glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC) load(userptr, "glVertexAttribI3uiEXT"); + glad_glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC) load(userptr, "glVertexAttribI3uivEXT"); + glad_glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC) load(userptr, "glVertexAttribI4bvEXT"); + glad_glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC) load(userptr, "glVertexAttribI4iEXT"); + glad_glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC) load(userptr, "glVertexAttribI4ivEXT"); + glad_glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC) load(userptr, "glVertexAttribI4svEXT"); + glad_glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC) load(userptr, "glVertexAttribI4ubvEXT"); + glad_glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC) load(userptr, "glVertexAttribI4uiEXT"); + glad_glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC) load(userptr, "glVertexAttribI4uivEXT"); + glad_glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC) load(userptr, "glVertexAttribI4usvEXT"); + glad_glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC) load(userptr, "glVertexAttribIPointerEXT"); +} +static void glad_gl_load_GL_EXT_multi_draw_arrays( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_multi_draw_arrays) return; + glad_glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC) load(userptr, "glMultiDrawArraysEXT"); + glad_glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC) load(userptr, "glMultiDrawElementsEXT"); +} +static void glad_gl_load_GL_EXT_point_parameters( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_point_parameters) return; + glad_glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC) load(userptr, "glPointParameterfEXT"); + glad_glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC) load(userptr, "glPointParameterfvEXT"); +} +static void glad_gl_load_GL_EXT_provoking_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_provoking_vertex) return; + glad_glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC) load(userptr, "glProvokingVertexEXT"); +} +static void glad_gl_load_GL_EXT_secondary_color( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_secondary_color) return; + glad_glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC) load(userptr, "glSecondaryColor3bEXT"); + glad_glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC) load(userptr, "glSecondaryColor3bvEXT"); + glad_glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC) load(userptr, "glSecondaryColor3dEXT"); + glad_glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC) load(userptr, "glSecondaryColor3dvEXT"); + glad_glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC) load(userptr, "glSecondaryColor3fEXT"); + glad_glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC) load(userptr, "glSecondaryColor3fvEXT"); + glad_glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC) load(userptr, "glSecondaryColor3iEXT"); + glad_glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC) load(userptr, "glSecondaryColor3ivEXT"); + glad_glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC) load(userptr, "glSecondaryColor3sEXT"); + glad_glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC) load(userptr, "glSecondaryColor3svEXT"); + glad_glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC) load(userptr, "glSecondaryColor3ubEXT"); + glad_glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC) load(userptr, "glSecondaryColor3ubvEXT"); + glad_glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC) load(userptr, "glSecondaryColor3uiEXT"); + glad_glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC) load(userptr, "glSecondaryColor3uivEXT"); + glad_glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC) load(userptr, "glSecondaryColor3usEXT"); + glad_glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC) load(userptr, "glSecondaryColor3usvEXT"); + glad_glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC) load(userptr, "glSecondaryColorPointerEXT"); +} +static void glad_gl_load_GL_EXT_subtexture( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_subtexture) return; + glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC) load(userptr, "glTexSubImage1DEXT"); + glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC) load(userptr, "glTexSubImage2DEXT"); +} +static void glad_gl_load_GL_EXT_texture3D( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture3D) return; + glad_glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC) load(userptr, "glTexImage3DEXT"); + glad_glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC) load(userptr, "glTexSubImage3DEXT"); +} +static void glad_gl_load_GL_EXT_texture_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_array) return; + glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT"); +} +static void glad_gl_load_GL_EXT_texture_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_buffer_object) return; + glad_glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC) load(userptr, "glTexBufferEXT"); +} +static void glad_gl_load_GL_EXT_texture_integer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_integer) return; + glad_glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC) load(userptr, "glClearColorIiEXT"); + glad_glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC) load(userptr, "glClearColorIuiEXT"); + glad_glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC) load(userptr, "glGetTexParameterIivEXT"); + glad_glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC) load(userptr, "glGetTexParameterIuivEXT"); + glad_glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC) load(userptr, "glTexParameterIivEXT"); + glad_glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC) load(userptr, "glTexParameterIuivEXT"); +} +static void glad_gl_load_GL_EXT_texture_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_object) return; + glad_glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC) load(userptr, "glAreTexturesResidentEXT"); + glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC) load(userptr, "glBindTextureEXT"); + glad_glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC) load(userptr, "glDeleteTexturesEXT"); + glad_glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC) load(userptr, "glGenTexturesEXT"); + glad_glIsTextureEXT = (PFNGLISTEXTUREEXTPROC) load(userptr, "glIsTextureEXT"); + glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC) load(userptr, "glPrioritizeTexturesEXT"); +} +static void glad_gl_load_GL_EXT_texture_storage( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_storage) return; + glad_glTexStorage1DEXT = (PFNGLTEXSTORAGE1DEXTPROC) load(userptr, "glTexStorage1DEXT"); + glad_glTexStorage2DEXT = (PFNGLTEXSTORAGE2DEXTPROC) load(userptr, "glTexStorage2DEXT"); + glad_glTexStorage3DEXT = (PFNGLTEXSTORAGE3DEXTPROC) load(userptr, "glTexStorage3DEXT"); + glad_glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC) load(userptr, "glTextureStorage1DEXT"); + glad_glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC) load(userptr, "glTextureStorage2DEXT"); + glad_glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC) load(userptr, "glTextureStorage3DEXT"); +} +static void glad_gl_load_GL_EXT_timer_query( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_timer_query) return; + glad_glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC) load(userptr, "glGetQueryObjecti64vEXT"); + glad_glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC) load(userptr, "glGetQueryObjectui64vEXT"); +} +static void glad_gl_load_GL_EXT_transform_feedback( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_transform_feedback) return; + glad_glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) load(userptr, "glBeginTransformFeedbackEXT"); + glad_glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC) load(userptr, "glBindBufferBaseEXT"); + glad_glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC) load(userptr, "glBindBufferOffsetEXT"); + glad_glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC) load(userptr, "glBindBufferRangeEXT"); + glad_glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC) load(userptr, "glEndTransformFeedbackEXT"); + glad_glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) load(userptr, "glGetTransformFeedbackVaryingEXT"); + glad_glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) load(userptr, "glTransformFeedbackVaryingsEXT"); +} +static void glad_gl_load_GL_EXT_vertex_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_vertex_array) return; + glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC) load(userptr, "glArrayElementEXT"); + glad_glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC) load(userptr, "glColorPointerEXT"); + glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC) load(userptr, "glDrawArraysEXT"); + glad_glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC) load(userptr, "glEdgeFlagPointerEXT"); + glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC) load(userptr, "glGetPointervEXT"); + glad_glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC) load(userptr, "glIndexPointerEXT"); + glad_glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC) load(userptr, "glNormalPointerEXT"); + glad_glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC) load(userptr, "glTexCoordPointerEXT"); + glad_glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC) load(userptr, "glVertexPointerEXT"); +} +static void glad_gl_load_GL_INGR_blend_func_separate( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_INGR_blend_func_separate) return; + glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC) load(userptr, "glBlendFuncSeparateINGR"); +} +static void glad_gl_load_GL_KHR_debug( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_KHR_debug) return; + glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback"); + glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl"); + glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert"); + glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog"); + glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel"); + glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel"); + glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel"); + glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup"); + glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup"); +} +static void glad_gl_load_GL_MESA_window_pos( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_MESA_window_pos) return; + glad_glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC) load(userptr, "glWindowPos2dMESA"); + glad_glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC) load(userptr, "glWindowPos2dvMESA"); + glad_glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC) load(userptr, "glWindowPos2fMESA"); + glad_glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC) load(userptr, "glWindowPos2fvMESA"); + glad_glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC) load(userptr, "glWindowPos2iMESA"); + glad_glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC) load(userptr, "glWindowPos2ivMESA"); + glad_glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC) load(userptr, "glWindowPos2sMESA"); + glad_glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC) load(userptr, "glWindowPos2svMESA"); + glad_glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC) load(userptr, "glWindowPos3dMESA"); + glad_glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC) load(userptr, "glWindowPos3dvMESA"); + glad_glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC) load(userptr, "glWindowPos3fMESA"); + glad_glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC) load(userptr, "glWindowPos3fvMESA"); + glad_glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC) load(userptr, "glWindowPos3iMESA"); + glad_glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC) load(userptr, "glWindowPos3ivMESA"); + glad_glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC) load(userptr, "glWindowPos3sMESA"); + glad_glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC) load(userptr, "glWindowPos3svMESA"); + glad_glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC) load(userptr, "glWindowPos4dMESA"); + glad_glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC) load(userptr, "glWindowPos4dvMESA"); + glad_glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC) load(userptr, "glWindowPos4fMESA"); + glad_glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC) load(userptr, "glWindowPos4fvMESA"); + glad_glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC) load(userptr, "glWindowPos4iMESA"); + glad_glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC) load(userptr, "glWindowPos4ivMESA"); + glad_glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC) load(userptr, "glWindowPos4sMESA"); + glad_glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC) load(userptr, "glWindowPos4svMESA"); +} +static void glad_gl_load_GL_NVX_conditional_render( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NVX_conditional_render) return; + glad_glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC) load(userptr, "glBeginConditionalRenderNVX"); + glad_glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC) load(userptr, "glEndConditionalRenderNVX"); +} +static void glad_gl_load_GL_NV_conditional_render( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_conditional_render) return; + glad_glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC) load(userptr, "glBeginConditionalRenderNV"); + glad_glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC) load(userptr, "glEndConditionalRenderNV"); +} +static void glad_gl_load_GL_NV_explicit_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_explicit_multisample) return; + glad_glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC) load(userptr, "glGetMultisamplefvNV"); + glad_glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC) load(userptr, "glSampleMaskIndexedNV"); + glad_glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC) load(userptr, "glTexRenderbufferNV"); +} +static void glad_gl_load_GL_NV_geometry_program4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_geometry_program4) return; + glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glFramebufferTextureEXT"); + glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glFramebufferTextureFaceEXT"); + glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT"); + glad_glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC) load(userptr, "glProgramVertexLimitNV"); +} +static void glad_gl_load_GL_NV_point_sprite( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_point_sprite) return; + glad_glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC) load(userptr, "glPointParameteriNV"); + glad_glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC) load(userptr, "glPointParameterivNV"); +} +static void glad_gl_load_GL_NV_transform_feedback( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_transform_feedback) return; + glad_glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC) load(userptr, "glActiveVaryingNV"); + glad_glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC) load(userptr, "glBeginTransformFeedbackNV"); + glad_glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC) load(userptr, "glBindBufferBaseNV"); + glad_glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC) load(userptr, "glBindBufferOffsetNV"); + glad_glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC) load(userptr, "glBindBufferRangeNV"); + glad_glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC) load(userptr, "glEndTransformFeedbackNV"); + glad_glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC) load(userptr, "glGetActiveVaryingNV"); + glad_glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) load(userptr, "glGetTransformFeedbackVaryingNV"); + glad_glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC) load(userptr, "glGetVaryingLocationNV"); + glad_glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) load(userptr, "glTransformFeedbackAttribsNV"); + glad_glTransformFeedbackStreamAttribsNV = (PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) load(userptr, "glTransformFeedbackStreamAttribsNV"); + glad_glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) load(userptr, "glTransformFeedbackVaryingsNV"); +} +static void glad_gl_load_GL_NV_vertex_program( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_vertex_program) return; + glad_glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC) load(userptr, "glAreProgramsResidentNV"); + glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC) load(userptr, "glBindProgramNV"); + glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) load(userptr, "glDeleteProgramsNV"); + glad_glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC) load(userptr, "glExecuteProgramNV"); + glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) load(userptr, "glGenProgramsNV"); + glad_glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC) load(userptr, "glGetProgramParameterdvNV"); + glad_glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC) load(userptr, "glGetProgramParameterfvNV"); + glad_glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC) load(userptr, "glGetProgramStringNV"); + glad_glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC) load(userptr, "glGetProgramivNV"); + glad_glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC) load(userptr, "glGetTrackMatrixivNV"); + glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC) load(userptr, "glGetVertexAttribPointervNV"); + glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) load(userptr, "glGetVertexAttribdvNV"); + glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) load(userptr, "glGetVertexAttribfvNV"); + glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) load(userptr, "glGetVertexAttribivNV"); + glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC) load(userptr, "glIsProgramNV"); + glad_glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) load(userptr, "glLoadProgramNV"); + glad_glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC) load(userptr, "glProgramParameter4dNV"); + glad_glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC) load(userptr, "glProgramParameter4dvNV"); + glad_glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC) load(userptr, "glProgramParameter4fNV"); + glad_glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC) load(userptr, "glProgramParameter4fvNV"); + glad_glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC) load(userptr, "glProgramParameters4dvNV"); + glad_glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC) load(userptr, "glProgramParameters4fvNV"); + glad_glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC) load(userptr, "glRequestResidentProgramsNV"); + glad_glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC) load(userptr, "glTrackMatrixNV"); + glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC) load(userptr, "glVertexAttrib1dNV"); + glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC) load(userptr, "glVertexAttrib1dvNV"); + glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC) load(userptr, "glVertexAttrib1fNV"); + glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC) load(userptr, "glVertexAttrib1fvNV"); + glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC) load(userptr, "glVertexAttrib1sNV"); + glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC) load(userptr, "glVertexAttrib1svNV"); + glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC) load(userptr, "glVertexAttrib2dNV"); + glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC) load(userptr, "glVertexAttrib2dvNV"); + glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC) load(userptr, "glVertexAttrib2fNV"); + glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC) load(userptr, "glVertexAttrib2fvNV"); + glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) load(userptr, "glVertexAttrib2sNV"); + glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC) load(userptr, "glVertexAttrib2svNV"); + glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC) load(userptr, "glVertexAttrib3dNV"); + glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC) load(userptr, "glVertexAttrib3dvNV"); + glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) load(userptr, "glVertexAttrib3fNV"); + glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC) load(userptr, "glVertexAttrib3fvNV"); + glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC) load(userptr, "glVertexAttrib3sNV"); + glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC) load(userptr, "glVertexAttrib3svNV"); + glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC) load(userptr, "glVertexAttrib4dNV"); + glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) load(userptr, "glVertexAttrib4dvNV"); + glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC) load(userptr, "glVertexAttrib4fNV"); + glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC) load(userptr, "glVertexAttrib4fvNV"); + glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC) load(userptr, "glVertexAttrib4sNV"); + glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC) load(userptr, "glVertexAttrib4svNV"); + glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) load(userptr, "glVertexAttrib4ubNV"); + glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC) load(userptr, "glVertexAttrib4ubvNV"); + glad_glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC) load(userptr, "glVertexAttribPointerNV"); + glad_glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC) load(userptr, "glVertexAttribs1dvNV"); + glad_glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC) load(userptr, "glVertexAttribs1fvNV"); + glad_glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC) load(userptr, "glVertexAttribs1svNV"); + glad_glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC) load(userptr, "glVertexAttribs2dvNV"); + glad_glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC) load(userptr, "glVertexAttribs2fvNV"); + glad_glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC) load(userptr, "glVertexAttribs2svNV"); + glad_glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC) load(userptr, "glVertexAttribs3dvNV"); + glad_glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC) load(userptr, "glVertexAttribs3fvNV"); + glad_glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC) load(userptr, "glVertexAttribs3svNV"); + glad_glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC) load(userptr, "glVertexAttribs4dvNV"); + glad_glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC) load(userptr, "glVertexAttribs4fvNV"); + glad_glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC) load(userptr, "glVertexAttribs4svNV"); + glad_glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC) load(userptr, "glVertexAttribs4ubvNV"); +} +static void glad_gl_load_GL_NV_vertex_program4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_NV_vertex_program4) return; + glad_glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC) load(userptr, "glGetVertexAttribIivEXT"); + glad_glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC) load(userptr, "glGetVertexAttribIuivEXT"); + glad_glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC) load(userptr, "glVertexAttribI1iEXT"); + glad_glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC) load(userptr, "glVertexAttribI1ivEXT"); + glad_glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC) load(userptr, "glVertexAttribI1uiEXT"); + glad_glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC) load(userptr, "glVertexAttribI1uivEXT"); + glad_glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC) load(userptr, "glVertexAttribI2iEXT"); + glad_glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC) load(userptr, "glVertexAttribI2ivEXT"); + glad_glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC) load(userptr, "glVertexAttribI2uiEXT"); + glad_glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC) load(userptr, "glVertexAttribI2uivEXT"); + glad_glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC) load(userptr, "glVertexAttribI3iEXT"); + glad_glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC) load(userptr, "glVertexAttribI3ivEXT"); + glad_glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC) load(userptr, "glVertexAttribI3uiEXT"); + glad_glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC) load(userptr, "glVertexAttribI3uivEXT"); + glad_glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC) load(userptr, "glVertexAttribI4bvEXT"); + glad_glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC) load(userptr, "glVertexAttribI4iEXT"); + glad_glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC) load(userptr, "glVertexAttribI4ivEXT"); + glad_glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC) load(userptr, "glVertexAttribI4svEXT"); + glad_glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC) load(userptr, "glVertexAttribI4ubvEXT"); + glad_glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC) load(userptr, "glVertexAttribI4uiEXT"); + glad_glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC) load(userptr, "glVertexAttribI4uivEXT"); + glad_glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC) load(userptr, "glVertexAttribI4usvEXT"); + glad_glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC) load(userptr, "glVertexAttribIPointerEXT"); +} +static void glad_gl_load_GL_SGIS_point_parameters( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_SGIS_point_parameters) return; + glad_glPointParameterfSGIS = (PFNGLPOINTPARAMETERFSGISPROC) load(userptr, "glPointParameterfSGIS"); + glad_glPointParameterfvSGIS = (PFNGLPOINTPARAMETERFVSGISPROC) load(userptr, "glPointParameterfvSGIS"); +} + + +static void glad_gl_resolve_aliases(void) { + if (glad_glActiveTexture == NULL && glad_glActiveTextureARB != NULL) glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)glad_glActiveTextureARB; + if (glad_glActiveTextureARB == NULL && glad_glActiveTexture != NULL) glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glad_glActiveTexture; + if (glad_glArrayElement == NULL && glad_glArrayElementEXT != NULL) glad_glArrayElement = (PFNGLARRAYELEMENTPROC)glad_glArrayElementEXT; + if (glad_glArrayElementEXT == NULL && glad_glArrayElement != NULL) glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glad_glArrayElement; + if (glad_glAttachObjectARB == NULL && glad_glAttachShader != NULL) glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glad_glAttachShader; + if (glad_glAttachShader == NULL && glad_glAttachObjectARB != NULL) glad_glAttachShader = (PFNGLATTACHSHADERPROC)glad_glAttachObjectARB; + if (glad_glBeginConditionalRender == NULL && glad_glBeginConditionalRenderNV != NULL) glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glad_glBeginConditionalRenderNV; + if (glad_glBeginConditionalRenderNV == NULL && glad_glBeginConditionalRender != NULL) glad_glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glad_glBeginConditionalRender; + if (glad_glBeginQuery == NULL && glad_glBeginQueryARB != NULL) glad_glBeginQuery = (PFNGLBEGINQUERYPROC)glad_glBeginQueryARB; + if (glad_glBeginQueryARB == NULL && glad_glBeginQuery != NULL) glad_glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glad_glBeginQuery; + if (glad_glBeginTransformFeedback == NULL && glad_glBeginTransformFeedbackEXT != NULL) glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glad_glBeginTransformFeedbackEXT; + if (glad_glBeginTransformFeedback == NULL && glad_glBeginTransformFeedbackNV != NULL) glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glad_glBeginTransformFeedbackNV; + if (glad_glBeginTransformFeedbackEXT == NULL && glad_glBeginTransformFeedback != NULL) glad_glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glad_glBeginTransformFeedback; + if (glad_glBeginTransformFeedbackEXT == NULL && glad_glBeginTransformFeedbackNV != NULL) glad_glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glad_glBeginTransformFeedbackNV; + if (glad_glBeginTransformFeedbackNV == NULL && glad_glBeginTransformFeedback != NULL) glad_glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glad_glBeginTransformFeedback; + if (glad_glBeginTransformFeedbackNV == NULL && glad_glBeginTransformFeedbackEXT != NULL) glad_glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glad_glBeginTransformFeedbackEXT; + if (glad_glBindAttribLocation == NULL && glad_glBindAttribLocationARB != NULL) glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glad_glBindAttribLocationARB; + if (glad_glBindAttribLocationARB == NULL && glad_glBindAttribLocation != NULL) glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glad_glBindAttribLocation; + if (glad_glBindBuffer == NULL && glad_glBindBufferARB != NULL) glad_glBindBuffer = (PFNGLBINDBUFFERPROC)glad_glBindBufferARB; + if (glad_glBindBufferARB == NULL && glad_glBindBuffer != NULL) glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glad_glBindBuffer; + if (glad_glBindBufferBase == NULL && glad_glBindBufferBaseEXT != NULL) glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glad_glBindBufferBaseEXT; + if (glad_glBindBufferBase == NULL && glad_glBindBufferBaseNV != NULL) glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glad_glBindBufferBaseNV; + if (glad_glBindBufferBaseEXT == NULL && glad_glBindBufferBase != NULL) glad_glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glad_glBindBufferBase; + if (glad_glBindBufferBaseEXT == NULL && glad_glBindBufferBaseNV != NULL) glad_glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glad_glBindBufferBaseNV; + if (glad_glBindBufferBaseNV == NULL && glad_glBindBufferBase != NULL) glad_glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glad_glBindBufferBase; + if (glad_glBindBufferBaseNV == NULL && glad_glBindBufferBaseEXT != NULL) glad_glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glad_glBindBufferBaseEXT; + if (glad_glBindBufferOffsetEXT == NULL && glad_glBindBufferOffsetNV != NULL) glad_glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glad_glBindBufferOffsetNV; + if (glad_glBindBufferOffsetNV == NULL && glad_glBindBufferOffsetEXT != NULL) glad_glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glad_glBindBufferOffsetEXT; + if (glad_glBindBufferRange == NULL && glad_glBindBufferRangeEXT != NULL) glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glad_glBindBufferRangeEXT; + if (glad_glBindBufferRange == NULL && glad_glBindBufferRangeNV != NULL) glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glad_glBindBufferRangeNV; + if (glad_glBindBufferRangeEXT == NULL && glad_glBindBufferRange != NULL) glad_glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glad_glBindBufferRange; + if (glad_glBindBufferRangeEXT == NULL && glad_glBindBufferRangeNV != NULL) glad_glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glad_glBindBufferRangeNV; + if (glad_glBindBufferRangeNV == NULL && glad_glBindBufferRange != NULL) glad_glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glad_glBindBufferRange; + if (glad_glBindBufferRangeNV == NULL && glad_glBindBufferRangeEXT != NULL) glad_glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glad_glBindBufferRangeEXT; + if (glad_glBindFragDataLocation == NULL && glad_glBindFragDataLocationEXT != NULL) glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glad_glBindFragDataLocationEXT; + if (glad_glBindFragDataLocationEXT == NULL && glad_glBindFragDataLocation != NULL) glad_glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glad_glBindFragDataLocation; + if (glad_glBindProgramARB == NULL && glad_glBindProgramNV != NULL) glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glad_glBindProgramNV; + if (glad_glBindProgramNV == NULL && glad_glBindProgramARB != NULL) glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glad_glBindProgramARB; + if (glad_glBindTexture == NULL && glad_glBindTextureEXT != NULL) glad_glBindTexture = (PFNGLBINDTEXTUREPROC)glad_glBindTextureEXT; + if (glad_glBindTextureEXT == NULL && glad_glBindTexture != NULL) glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glad_glBindTexture; + if (glad_glBlendColor == NULL && glad_glBlendColorEXT != NULL) glad_glBlendColor = (PFNGLBLENDCOLORPROC)glad_glBlendColorEXT; + if (glad_glBlendColorEXT == NULL && glad_glBlendColor != NULL) glad_glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glad_glBlendColor; + if (glad_glBlendEquation == NULL && glad_glBlendEquationEXT != NULL) glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)glad_glBlendEquationEXT; + if (glad_glBlendEquationEXT == NULL && glad_glBlendEquation != NULL) glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glad_glBlendEquation; + if (glad_glBlendEquationSeparate == NULL && glad_glBlendEquationSeparateEXT != NULL) glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glad_glBlendEquationSeparateEXT; + if (glad_glBlendEquationSeparateEXT == NULL && glad_glBlendEquationSeparate != NULL) glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glad_glBlendEquationSeparate; + if (glad_glBlendFuncSeparate == NULL && glad_glBlendFuncSeparateEXT != NULL) glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glad_glBlendFuncSeparateEXT; + if (glad_glBlendFuncSeparate == NULL && glad_glBlendFuncSeparateINGR != NULL) glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glad_glBlendFuncSeparateINGR; + if (glad_glBlendFuncSeparateEXT == NULL && glad_glBlendFuncSeparate != NULL) glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glad_glBlendFuncSeparate; + if (glad_glBlendFuncSeparateEXT == NULL && glad_glBlendFuncSeparateINGR != NULL) glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glad_glBlendFuncSeparateINGR; + if (glad_glBlendFuncSeparateINGR == NULL && glad_glBlendFuncSeparate != NULL) glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)glad_glBlendFuncSeparate; + if (glad_glBlendFuncSeparateINGR == NULL && glad_glBlendFuncSeparateEXT != NULL) glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)glad_glBlendFuncSeparateEXT; + if (glad_glBlitFramebuffer == NULL && glad_glBlitFramebufferEXT != NULL) glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glad_glBlitFramebufferEXT; + if (glad_glBlitFramebufferEXT == NULL && glad_glBlitFramebuffer != NULL) glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glad_glBlitFramebuffer; + if (glad_glBufferData == NULL && glad_glBufferDataARB != NULL) glad_glBufferData = (PFNGLBUFFERDATAPROC)glad_glBufferDataARB; + if (glad_glBufferDataARB == NULL && glad_glBufferData != NULL) glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glad_glBufferData; + if (glad_glBufferSubData == NULL && glad_glBufferSubDataARB != NULL) glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glad_glBufferSubDataARB; + if (glad_glBufferSubDataARB == NULL && glad_glBufferSubData != NULL) glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glad_glBufferSubData; + if (glad_glCheckFramebufferStatus == NULL && glad_glCheckFramebufferStatusEXT != NULL) glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glad_glCheckFramebufferStatusEXT; + if (glad_glCheckFramebufferStatusEXT == NULL && glad_glCheckFramebufferStatus != NULL) glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glad_glCheckFramebufferStatus; + if (glad_glClampColor == NULL && glad_glClampColorARB != NULL) glad_glClampColor = (PFNGLCLAMPCOLORPROC)glad_glClampColorARB; + if (glad_glClampColorARB == NULL && glad_glClampColor != NULL) glad_glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glad_glClampColor; + if (glad_glClientActiveTexture == NULL && glad_glClientActiveTextureARB != NULL) glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glad_glClientActiveTextureARB; + if (glad_glClientActiveTextureARB == NULL && glad_glClientActiveTexture != NULL) glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glad_glClientActiveTexture; + if (glad_glColorMaski == NULL && glad_glColorMaskIndexedEXT != NULL) glad_glColorMaski = (PFNGLCOLORMASKIPROC)glad_glColorMaskIndexedEXT; + if (glad_glColorMaskIndexedEXT == NULL && glad_glColorMaski != NULL) glad_glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glad_glColorMaski; + if (glad_glCompileShader == NULL && glad_glCompileShaderARB != NULL) glad_glCompileShader = (PFNGLCOMPILESHADERPROC)glad_glCompileShaderARB; + if (glad_glCompileShaderARB == NULL && glad_glCompileShader != NULL) glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glad_glCompileShader; + if (glad_glCompressedTexImage1D == NULL && glad_glCompressedTexImage1DARB != NULL) glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glad_glCompressedTexImage1DARB; + if (glad_glCompressedTexImage1DARB == NULL && glad_glCompressedTexImage1D != NULL) glad_glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glad_glCompressedTexImage1D; + if (glad_glCompressedTexImage2D == NULL && glad_glCompressedTexImage2DARB != NULL) glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glad_glCompressedTexImage2DARB; + if (glad_glCompressedTexImage2DARB == NULL && glad_glCompressedTexImage2D != NULL) glad_glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glad_glCompressedTexImage2D; + if (glad_glCompressedTexImage3D == NULL && glad_glCompressedTexImage3DARB != NULL) glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glad_glCompressedTexImage3DARB; + if (glad_glCompressedTexImage3DARB == NULL && glad_glCompressedTexImage3D != NULL) glad_glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glad_glCompressedTexImage3D; + if (glad_glCompressedTexSubImage1D == NULL && glad_glCompressedTexSubImage1DARB != NULL) glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glad_glCompressedTexSubImage1DARB; + if (glad_glCompressedTexSubImage1DARB == NULL && glad_glCompressedTexSubImage1D != NULL) glad_glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glad_glCompressedTexSubImage1D; + if (glad_glCompressedTexSubImage2D == NULL && glad_glCompressedTexSubImage2DARB != NULL) glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glad_glCompressedTexSubImage2DARB; + if (glad_glCompressedTexSubImage2DARB == NULL && glad_glCompressedTexSubImage2D != NULL) glad_glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glad_glCompressedTexSubImage2D; + if (glad_glCompressedTexSubImage3D == NULL && glad_glCompressedTexSubImage3DARB != NULL) glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glad_glCompressedTexSubImage3DARB; + if (glad_glCompressedTexSubImage3DARB == NULL && glad_glCompressedTexSubImage3D != NULL) glad_glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glad_glCompressedTexSubImage3D; + if (glad_glCopyTexImage1D == NULL && glad_glCopyTexImage1DEXT != NULL) glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)glad_glCopyTexImage1DEXT; + if (glad_glCopyTexImage1DEXT == NULL && glad_glCopyTexImage1D != NULL) glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glad_glCopyTexImage1D; + if (glad_glCopyTexImage2D == NULL && glad_glCopyTexImage2DEXT != NULL) glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)glad_glCopyTexImage2DEXT; + if (glad_glCopyTexImage2DEXT == NULL && glad_glCopyTexImage2D != NULL) glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glad_glCopyTexImage2D; + if (glad_glCopyTexSubImage1D == NULL && glad_glCopyTexSubImage1DEXT != NULL) glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)glad_glCopyTexSubImage1DEXT; + if (glad_glCopyTexSubImage1DEXT == NULL && glad_glCopyTexSubImage1D != NULL) glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glad_glCopyTexSubImage1D; + if (glad_glCopyTexSubImage2D == NULL && glad_glCopyTexSubImage2DEXT != NULL) glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)glad_glCopyTexSubImage2DEXT; + if (glad_glCopyTexSubImage2DEXT == NULL && glad_glCopyTexSubImage2D != NULL) glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glad_glCopyTexSubImage2D; + if (glad_glCopyTexSubImage3D == NULL && glad_glCopyTexSubImage3DEXT != NULL) glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glad_glCopyTexSubImage3DEXT; + if (glad_glCopyTexSubImage3DEXT == NULL && glad_glCopyTexSubImage3D != NULL) glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glad_glCopyTexSubImage3D; + if (glad_glCreateProgram == NULL && glad_glCreateProgramObjectARB != NULL) glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)glad_glCreateProgramObjectARB; + if (glad_glCreateProgramObjectARB == NULL && glad_glCreateProgram != NULL) glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glad_glCreateProgram; + if (glad_glCreateShader == NULL && glad_glCreateShaderObjectARB != NULL) glad_glCreateShader = (PFNGLCREATESHADERPROC)glad_glCreateShaderObjectARB; + if (glad_glCreateShaderObjectARB == NULL && glad_glCreateShader != NULL) glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glad_glCreateShader; + if (glad_glDeleteBuffers == NULL && glad_glDeleteBuffersARB != NULL) glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glad_glDeleteBuffersARB; + if (glad_glDeleteBuffersARB == NULL && glad_glDeleteBuffers != NULL) glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glad_glDeleteBuffers; + if (glad_glDeleteFramebuffers == NULL && glad_glDeleteFramebuffersEXT != NULL) glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glad_glDeleteFramebuffersEXT; + if (glad_glDeleteFramebuffersEXT == NULL && glad_glDeleteFramebuffers != NULL) glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glad_glDeleteFramebuffers; + if (glad_glDeleteProgramsARB == NULL && glad_glDeleteProgramsNV != NULL) glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glad_glDeleteProgramsNV; + if (glad_glDeleteProgramsNV == NULL && glad_glDeleteProgramsARB != NULL) glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glad_glDeleteProgramsARB; + if (glad_glDeleteQueries == NULL && glad_glDeleteQueriesARB != NULL) glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC)glad_glDeleteQueriesARB; + if (glad_glDeleteQueriesARB == NULL && glad_glDeleteQueries != NULL) glad_glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glad_glDeleteQueries; + if (glad_glDeleteRenderbuffers == NULL && glad_glDeleteRenderbuffersEXT != NULL) glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glad_glDeleteRenderbuffersEXT; + if (glad_glDeleteRenderbuffersEXT == NULL && glad_glDeleteRenderbuffers != NULL) glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glad_glDeleteRenderbuffers; + if (glad_glDeleteVertexArrays == NULL && glad_glDeleteVertexArraysAPPLE != NULL) glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glad_glDeleteVertexArraysAPPLE; + if (glad_glDeleteVertexArraysAPPLE == NULL && glad_glDeleteVertexArrays != NULL) glad_glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glad_glDeleteVertexArrays; + if (glad_glDetachObjectARB == NULL && glad_glDetachShader != NULL) glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glad_glDetachShader; + if (glad_glDetachShader == NULL && glad_glDetachObjectARB != NULL) glad_glDetachShader = (PFNGLDETACHSHADERPROC)glad_glDetachObjectARB; + if (glad_glDisablei == NULL && glad_glDisableIndexedEXT != NULL) glad_glDisablei = (PFNGLDISABLEIPROC)glad_glDisableIndexedEXT; + if (glad_glDisableIndexedEXT == NULL && glad_glDisablei != NULL) glad_glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glad_glDisablei; + if (glad_glDisableVertexAttribArray == NULL && glad_glDisableVertexAttribArrayARB != NULL) glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glad_glDisableVertexAttribArrayARB; + if (glad_glDisableVertexAttribArrayARB == NULL && glad_glDisableVertexAttribArray != NULL) glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glad_glDisableVertexAttribArray; + if (glad_glDrawArrays == NULL && glad_glDrawArraysEXT != NULL) glad_glDrawArrays = (PFNGLDRAWARRAYSPROC)glad_glDrawArraysEXT; + if (glad_glDrawArraysEXT == NULL && glad_glDrawArrays != NULL) glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glad_glDrawArrays; + if (glad_glDrawArraysInstanced == NULL && glad_glDrawArraysInstancedARB != NULL) glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glad_glDrawArraysInstancedARB; + if (glad_glDrawArraysInstanced == NULL && glad_glDrawArraysInstancedEXT != NULL) glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glad_glDrawArraysInstancedEXT; + if (glad_glDrawArraysInstancedARB == NULL && glad_glDrawArraysInstanced != NULL) glad_glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glad_glDrawArraysInstanced; + if (glad_glDrawArraysInstancedARB == NULL && glad_glDrawArraysInstancedEXT != NULL) glad_glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glad_glDrawArraysInstancedEXT; + if (glad_glDrawArraysInstancedEXT == NULL && glad_glDrawArraysInstanced != NULL) glad_glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glad_glDrawArraysInstanced; + if (glad_glDrawArraysInstancedEXT == NULL && glad_glDrawArraysInstancedARB != NULL) glad_glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glad_glDrawArraysInstancedARB; + if (glad_glDrawBuffers == NULL && glad_glDrawBuffersARB != NULL) glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glad_glDrawBuffersARB; + if (glad_glDrawBuffers == NULL && glad_glDrawBuffersATI != NULL) glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glad_glDrawBuffersATI; + if (glad_glDrawBuffersARB == NULL && glad_glDrawBuffers != NULL) glad_glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glad_glDrawBuffers; + if (glad_glDrawBuffersARB == NULL && glad_glDrawBuffersATI != NULL) glad_glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glad_glDrawBuffersATI; + if (glad_glDrawBuffersATI == NULL && glad_glDrawBuffers != NULL) glad_glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glad_glDrawBuffers; + if (glad_glDrawBuffersATI == NULL && glad_glDrawBuffersARB != NULL) glad_glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glad_glDrawBuffersARB; + if (glad_glDrawElementsInstanced == NULL && glad_glDrawElementsInstancedARB != NULL) glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glad_glDrawElementsInstancedARB; + if (glad_glDrawElementsInstanced == NULL && glad_glDrawElementsInstancedEXT != NULL) glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glad_glDrawElementsInstancedEXT; + if (glad_glDrawElementsInstancedARB == NULL && glad_glDrawElementsInstanced != NULL) glad_glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glad_glDrawElementsInstanced; + if (glad_glDrawElementsInstancedARB == NULL && glad_glDrawElementsInstancedEXT != NULL) glad_glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glad_glDrawElementsInstancedEXT; + if (glad_glDrawElementsInstancedEXT == NULL && glad_glDrawElementsInstanced != NULL) glad_glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glad_glDrawElementsInstanced; + if (glad_glDrawElementsInstancedEXT == NULL && glad_glDrawElementsInstancedARB != NULL) glad_glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glad_glDrawElementsInstancedARB; + if (glad_glDrawRangeElements == NULL && glad_glDrawRangeElementsEXT != NULL) glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glad_glDrawRangeElementsEXT; + if (glad_glDrawRangeElementsEXT == NULL && glad_glDrawRangeElements != NULL) glad_glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glad_glDrawRangeElements; + if (glad_glEnablei == NULL && glad_glEnableIndexedEXT != NULL) glad_glEnablei = (PFNGLENABLEIPROC)glad_glEnableIndexedEXT; + if (glad_glEnableIndexedEXT == NULL && glad_glEnablei != NULL) glad_glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glad_glEnablei; + if (glad_glEnableVertexAttribArray == NULL && glad_glEnableVertexAttribArrayARB != NULL) glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glad_glEnableVertexAttribArrayARB; + if (glad_glEnableVertexAttribArrayARB == NULL && glad_glEnableVertexAttribArray != NULL) glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glad_glEnableVertexAttribArray; + if (glad_glEndConditionalRender == NULL && glad_glEndConditionalRenderNV != NULL) glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glad_glEndConditionalRenderNV; + if (glad_glEndConditionalRender == NULL && glad_glEndConditionalRenderNVX != NULL) glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glad_glEndConditionalRenderNVX; + if (glad_glEndConditionalRenderNV == NULL && glad_glEndConditionalRender != NULL) glad_glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glad_glEndConditionalRender; + if (glad_glEndConditionalRenderNV == NULL && glad_glEndConditionalRenderNVX != NULL) glad_glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glad_glEndConditionalRenderNVX; + if (glad_glEndConditionalRenderNVX == NULL && glad_glEndConditionalRender != NULL) glad_glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glad_glEndConditionalRender; + if (glad_glEndConditionalRenderNVX == NULL && glad_glEndConditionalRenderNV != NULL) glad_glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glad_glEndConditionalRenderNV; + if (glad_glEndQuery == NULL && glad_glEndQueryARB != NULL) glad_glEndQuery = (PFNGLENDQUERYPROC)glad_glEndQueryARB; + if (glad_glEndQueryARB == NULL && glad_glEndQuery != NULL) glad_glEndQueryARB = (PFNGLENDQUERYARBPROC)glad_glEndQuery; + if (glad_glEndTransformFeedback == NULL && glad_glEndTransformFeedbackEXT != NULL) glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glad_glEndTransformFeedbackEXT; + if (glad_glEndTransformFeedback == NULL && glad_glEndTransformFeedbackNV != NULL) glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glad_glEndTransformFeedbackNV; + if (glad_glEndTransformFeedbackEXT == NULL && glad_glEndTransformFeedback != NULL) glad_glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glad_glEndTransformFeedback; + if (glad_glEndTransformFeedbackEXT == NULL && glad_glEndTransformFeedbackNV != NULL) glad_glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glad_glEndTransformFeedbackNV; + if (glad_glEndTransformFeedbackNV == NULL && glad_glEndTransformFeedback != NULL) glad_glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glad_glEndTransformFeedback; + if (glad_glEndTransformFeedbackNV == NULL && glad_glEndTransformFeedbackEXT != NULL) glad_glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glad_glEndTransformFeedbackEXT; + if (glad_glFlushMappedBufferRange == NULL && glad_glFlushMappedBufferRangeAPPLE != NULL) glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glad_glFlushMappedBufferRangeAPPLE; + if (glad_glFlushMappedBufferRangeAPPLE == NULL && glad_glFlushMappedBufferRange != NULL) glad_glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glad_glFlushMappedBufferRange; + if (glad_glFogCoordd == NULL && glad_glFogCoorddEXT != NULL) glad_glFogCoordd = (PFNGLFOGCOORDDPROC)glad_glFogCoorddEXT; + if (glad_glFogCoorddEXT == NULL && glad_glFogCoordd != NULL) glad_glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glad_glFogCoordd; + if (glad_glFogCoorddv == NULL && glad_glFogCoorddvEXT != NULL) glad_glFogCoorddv = (PFNGLFOGCOORDDVPROC)glad_glFogCoorddvEXT; + if (glad_glFogCoorddvEXT == NULL && glad_glFogCoorddv != NULL) glad_glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glad_glFogCoorddv; + if (glad_glFogCoordf == NULL && glad_glFogCoordfEXT != NULL) glad_glFogCoordf = (PFNGLFOGCOORDFPROC)glad_glFogCoordfEXT; + if (glad_glFogCoordfEXT == NULL && glad_glFogCoordf != NULL) glad_glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glad_glFogCoordf; + if (glad_glFogCoordfv == NULL && glad_glFogCoordfvEXT != NULL) glad_glFogCoordfv = (PFNGLFOGCOORDFVPROC)glad_glFogCoordfvEXT; + if (glad_glFogCoordfvEXT == NULL && glad_glFogCoordfv != NULL) glad_glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glad_glFogCoordfv; + if (glad_glFogCoordPointer == NULL && glad_glFogCoordPointerEXT != NULL) glad_glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glad_glFogCoordPointerEXT; + if (glad_glFogCoordPointerEXT == NULL && glad_glFogCoordPointer != NULL) glad_glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glad_glFogCoordPointer; + if (glad_glFramebufferRenderbuffer == NULL && glad_glFramebufferRenderbufferEXT != NULL) glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glad_glFramebufferRenderbufferEXT; + if (glad_glFramebufferRenderbufferEXT == NULL && glad_glFramebufferRenderbuffer != NULL) glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glad_glFramebufferRenderbuffer; + if (glad_glFramebufferTexture == NULL && glad_glFramebufferTextureARB != NULL) glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glad_glFramebufferTextureARB; + if (glad_glFramebufferTexture == NULL && glad_glFramebufferTextureEXT != NULL) glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glad_glFramebufferTextureEXT; + if (glad_glFramebufferTexture1D == NULL && glad_glFramebufferTexture1DEXT != NULL) glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glad_glFramebufferTexture1DEXT; + if (glad_glFramebufferTexture1DEXT == NULL && glad_glFramebufferTexture1D != NULL) glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glad_glFramebufferTexture1D; + if (glad_glFramebufferTexture2D == NULL && glad_glFramebufferTexture2DEXT != NULL) glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glad_glFramebufferTexture2DEXT; + if (glad_glFramebufferTexture2DEXT == NULL && glad_glFramebufferTexture2D != NULL) glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glad_glFramebufferTexture2D; + if (glad_glFramebufferTexture3D == NULL && glad_glFramebufferTexture3DEXT != NULL) glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glad_glFramebufferTexture3DEXT; + if (glad_glFramebufferTexture3DEXT == NULL && glad_glFramebufferTexture3D != NULL) glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glad_glFramebufferTexture3D; + if (glad_glFramebufferTextureARB == NULL && glad_glFramebufferTexture != NULL) glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glad_glFramebufferTexture; + if (glad_glFramebufferTextureARB == NULL && glad_glFramebufferTextureEXT != NULL) glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glad_glFramebufferTextureEXT; + if (glad_glFramebufferTextureEXT == NULL && glad_glFramebufferTexture != NULL) glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glad_glFramebufferTexture; + if (glad_glFramebufferTextureEXT == NULL && glad_glFramebufferTextureARB != NULL) glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glad_glFramebufferTextureARB; + if (glad_glFramebufferTextureFaceARB == NULL && glad_glFramebufferTextureFaceEXT != NULL) glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glad_glFramebufferTextureFaceEXT; + if (glad_glFramebufferTextureFaceEXT == NULL && glad_glFramebufferTextureFaceARB != NULL) glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glad_glFramebufferTextureFaceARB; + if (glad_glFramebufferTextureLayer == NULL && glad_glFramebufferTextureLayerARB != NULL) glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glad_glFramebufferTextureLayerARB; + if (glad_glFramebufferTextureLayer == NULL && glad_glFramebufferTextureLayerEXT != NULL) glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glad_glFramebufferTextureLayerEXT; + if (glad_glFramebufferTextureLayerARB == NULL && glad_glFramebufferTextureLayer != NULL) glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glad_glFramebufferTextureLayer; + if (glad_glFramebufferTextureLayerARB == NULL && glad_glFramebufferTextureLayerEXT != NULL) glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glad_glFramebufferTextureLayerEXT; + if (glad_glFramebufferTextureLayerEXT == NULL && glad_glFramebufferTextureLayer != NULL) glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glad_glFramebufferTextureLayer; + if (glad_glFramebufferTextureLayerEXT == NULL && glad_glFramebufferTextureLayerARB != NULL) glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glad_glFramebufferTextureLayerARB; + if (glad_glGenBuffers == NULL && glad_glGenBuffersARB != NULL) glad_glGenBuffers = (PFNGLGENBUFFERSPROC)glad_glGenBuffersARB; + if (glad_glGenBuffersARB == NULL && glad_glGenBuffers != NULL) glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glad_glGenBuffers; + if (glad_glGenerateMipmap == NULL && glad_glGenerateMipmapEXT != NULL) glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glad_glGenerateMipmapEXT; + if (glad_glGenerateMipmapEXT == NULL && glad_glGenerateMipmap != NULL) glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glad_glGenerateMipmap; + if (glad_glGenFramebuffers == NULL && glad_glGenFramebuffersEXT != NULL) glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glad_glGenFramebuffersEXT; + if (glad_glGenFramebuffersEXT == NULL && glad_glGenFramebuffers != NULL) glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glad_glGenFramebuffers; + if (glad_glGenProgramsARB == NULL && glad_glGenProgramsNV != NULL) glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glad_glGenProgramsNV; + if (glad_glGenProgramsNV == NULL && glad_glGenProgramsARB != NULL) glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glad_glGenProgramsARB; + if (glad_glGenQueries == NULL && glad_glGenQueriesARB != NULL) glad_glGenQueries = (PFNGLGENQUERIESPROC)glad_glGenQueriesARB; + if (glad_glGenQueriesARB == NULL && glad_glGenQueries != NULL) glad_glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glad_glGenQueries; + if (glad_glGenRenderbuffers == NULL && glad_glGenRenderbuffersEXT != NULL) glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glad_glGenRenderbuffersEXT; + if (glad_glGenRenderbuffersEXT == NULL && glad_glGenRenderbuffers != NULL) glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glad_glGenRenderbuffers; + if (glad_glGenVertexArrays == NULL && glad_glGenVertexArraysAPPLE != NULL) glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glad_glGenVertexArraysAPPLE; + if (glad_glGenVertexArraysAPPLE == NULL && glad_glGenVertexArrays != NULL) glad_glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glad_glGenVertexArrays; + if (glad_glGetActiveAttrib == NULL && glad_glGetActiveAttribARB != NULL) glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glad_glGetActiveAttribARB; + if (glad_glGetActiveAttribARB == NULL && glad_glGetActiveAttrib != NULL) glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glad_glGetActiveAttrib; + if (glad_glGetActiveUniform == NULL && glad_glGetActiveUniformARB != NULL) glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glad_glGetActiveUniformARB; + if (glad_glGetActiveUniformARB == NULL && glad_glGetActiveUniform != NULL) glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glad_glGetActiveUniform; + if (glad_glGetAttribLocation == NULL && glad_glGetAttribLocationARB != NULL) glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glad_glGetAttribLocationARB; + if (glad_glGetAttribLocationARB == NULL && glad_glGetAttribLocation != NULL) glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glad_glGetAttribLocation; + if (glad_glGetBooleani_v == NULL && glad_glGetBooleanIndexedvEXT != NULL) glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glad_glGetBooleanIndexedvEXT; + if (glad_glGetBooleanIndexedvEXT == NULL && glad_glGetBooleani_v != NULL) glad_glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glad_glGetBooleani_v; + if (glad_glGetBufferParameteriv == NULL && glad_glGetBufferParameterivARB != NULL) glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glad_glGetBufferParameterivARB; + if (glad_glGetBufferParameterivARB == NULL && glad_glGetBufferParameteriv != NULL) glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glad_glGetBufferParameteriv; + if (glad_glGetBufferPointerv == NULL && glad_glGetBufferPointervARB != NULL) glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glad_glGetBufferPointervARB; + if (glad_glGetBufferPointervARB == NULL && glad_glGetBufferPointerv != NULL) glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glad_glGetBufferPointerv; + if (glad_glGetBufferSubData == NULL && glad_glGetBufferSubDataARB != NULL) glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glad_glGetBufferSubDataARB; + if (glad_glGetBufferSubDataARB == NULL && glad_glGetBufferSubData != NULL) glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glad_glGetBufferSubData; + if (glad_glGetCompressedTexImage == NULL && glad_glGetCompressedTexImageARB != NULL) glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glad_glGetCompressedTexImageARB; + if (glad_glGetCompressedTexImageARB == NULL && glad_glGetCompressedTexImage != NULL) glad_glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glad_glGetCompressedTexImage; + if (glad_glGetFragDataLocation == NULL && glad_glGetFragDataLocationEXT != NULL) glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glad_glGetFragDataLocationEXT; + if (glad_glGetFragDataLocationEXT == NULL && glad_glGetFragDataLocation != NULL) glad_glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glad_glGetFragDataLocation; + if (glad_glGetFramebufferAttachmentParameteriv == NULL && glad_glGetFramebufferAttachmentParameterivEXT != NULL) glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glad_glGetFramebufferAttachmentParameterivEXT; + if (glad_glGetFramebufferAttachmentParameterivEXT == NULL && glad_glGetFramebufferAttachmentParameteriv != NULL) glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glad_glGetFramebufferAttachmentParameteriv; + if (glad_glGetIntegeri_v == NULL && glad_glGetIntegerIndexedvEXT != NULL) glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glad_glGetIntegerIndexedvEXT; + if (glad_glGetIntegerIndexedvEXT == NULL && glad_glGetIntegeri_v != NULL) glad_glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glad_glGetIntegeri_v; + if (glad_glGetMultisamplefv == NULL && glad_glGetMultisamplefvNV != NULL) glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glad_glGetMultisamplefvNV; + if (glad_glGetMultisamplefvNV == NULL && glad_glGetMultisamplefv != NULL) glad_glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glad_glGetMultisamplefv; + if (glad_glGetPointerv == NULL && glad_glGetPointervEXT != NULL) glad_glGetPointerv = (PFNGLGETPOINTERVPROC)glad_glGetPointervEXT; + if (glad_glGetPointervEXT == NULL && glad_glGetPointerv != NULL) glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC)glad_glGetPointerv; + if (glad_glGetQueryiv == NULL && glad_glGetQueryivARB != NULL) glad_glGetQueryiv = (PFNGLGETQUERYIVPROC)glad_glGetQueryivARB; + if (glad_glGetQueryivARB == NULL && glad_glGetQueryiv != NULL) glad_glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glad_glGetQueryiv; + if (glad_glGetQueryObjecti64v == NULL && glad_glGetQueryObjecti64vEXT != NULL) glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glad_glGetQueryObjecti64vEXT; + if (glad_glGetQueryObjecti64vEXT == NULL && glad_glGetQueryObjecti64v != NULL) glad_glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glad_glGetQueryObjecti64v; + if (glad_glGetQueryObjectiv == NULL && glad_glGetQueryObjectivARB != NULL) glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glad_glGetQueryObjectivARB; + if (glad_glGetQueryObjectivARB == NULL && glad_glGetQueryObjectiv != NULL) glad_glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glad_glGetQueryObjectiv; + if (glad_glGetQueryObjectui64v == NULL && glad_glGetQueryObjectui64vEXT != NULL) glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glad_glGetQueryObjectui64vEXT; + if (glad_glGetQueryObjectui64vEXT == NULL && glad_glGetQueryObjectui64v != NULL) glad_glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glad_glGetQueryObjectui64v; + if (glad_glGetQueryObjectuiv == NULL && glad_glGetQueryObjectuivARB != NULL) glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glad_glGetQueryObjectuivARB; + if (glad_glGetQueryObjectuivARB == NULL && glad_glGetQueryObjectuiv != NULL) glad_glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glad_glGetQueryObjectuiv; + if (glad_glGetRenderbufferParameteriv == NULL && glad_glGetRenderbufferParameterivEXT != NULL) glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glad_glGetRenderbufferParameterivEXT; + if (glad_glGetRenderbufferParameterivEXT == NULL && glad_glGetRenderbufferParameteriv != NULL) glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glad_glGetRenderbufferParameteriv; + if (glad_glGetShaderSource == NULL && glad_glGetShaderSourceARB != NULL) glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glad_glGetShaderSourceARB; + if (glad_glGetShaderSourceARB == NULL && glad_glGetShaderSource != NULL) glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glad_glGetShaderSource; + if (glad_glGetTexParameterIiv == NULL && glad_glGetTexParameterIivEXT != NULL) glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glad_glGetTexParameterIivEXT; + if (glad_glGetTexParameterIivEXT == NULL && glad_glGetTexParameterIiv != NULL) glad_glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glad_glGetTexParameterIiv; + if (glad_glGetTexParameterIuiv == NULL && glad_glGetTexParameterIuivEXT != NULL) glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glad_glGetTexParameterIuivEXT; + if (glad_glGetTexParameterIuivEXT == NULL && glad_glGetTexParameterIuiv != NULL) glad_glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glad_glGetTexParameterIuiv; + if (glad_glGetTransformFeedbackVarying == NULL && glad_glGetTransformFeedbackVaryingEXT != NULL) glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glad_glGetTransformFeedbackVaryingEXT; + if (glad_glGetTransformFeedbackVaryingEXT == NULL && glad_glGetTransformFeedbackVarying != NULL) glad_glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glad_glGetTransformFeedbackVarying; + if (glad_glGetUniformfv == NULL && glad_glGetUniformfvARB != NULL) glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glad_glGetUniformfvARB; + if (glad_glGetUniformfvARB == NULL && glad_glGetUniformfv != NULL) glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glad_glGetUniformfv; + if (glad_glGetUniformiv == NULL && glad_glGetUniformivARB != NULL) glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glad_glGetUniformivARB; + if (glad_glGetUniformivARB == NULL && glad_glGetUniformiv != NULL) glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glad_glGetUniformiv; + if (glad_glGetUniformLocation == NULL && glad_glGetUniformLocationARB != NULL) glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glad_glGetUniformLocationARB; + if (glad_glGetUniformLocationARB == NULL && glad_glGetUniformLocation != NULL) glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glad_glGetUniformLocation; + if (glad_glGetUniformuiv == NULL && glad_glGetUniformuivEXT != NULL) glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glad_glGetUniformuivEXT; + if (glad_glGetUniformuivEXT == NULL && glad_glGetUniformuiv != NULL) glad_glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glad_glGetUniformuiv; + if (glad_glGetVertexAttribdv == NULL && glad_glGetVertexAttribdvARB != NULL) glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glad_glGetVertexAttribdvARB; + if (glad_glGetVertexAttribdv == NULL && glad_glGetVertexAttribdvNV != NULL) glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glad_glGetVertexAttribdvNV; + if (glad_glGetVertexAttribdvARB == NULL && glad_glGetVertexAttribdv != NULL) glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glad_glGetVertexAttribdv; + if (glad_glGetVertexAttribdvARB == NULL && glad_glGetVertexAttribdvNV != NULL) glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glad_glGetVertexAttribdvNV; + if (glad_glGetVertexAttribdvNV == NULL && glad_glGetVertexAttribdv != NULL) glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glad_glGetVertexAttribdv; + if (glad_glGetVertexAttribdvNV == NULL && glad_glGetVertexAttribdvARB != NULL) glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glad_glGetVertexAttribdvARB; + if (glad_glGetVertexAttribfv == NULL && glad_glGetVertexAttribfvARB != NULL) glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glad_glGetVertexAttribfvARB; + if (glad_glGetVertexAttribfv == NULL && glad_glGetVertexAttribfvNV != NULL) glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glad_glGetVertexAttribfvNV; + if (glad_glGetVertexAttribfvARB == NULL && glad_glGetVertexAttribfv != NULL) glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glad_glGetVertexAttribfv; + if (glad_glGetVertexAttribfvARB == NULL && glad_glGetVertexAttribfvNV != NULL) glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glad_glGetVertexAttribfvNV; + if (glad_glGetVertexAttribfvNV == NULL && glad_glGetVertexAttribfv != NULL) glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glad_glGetVertexAttribfv; + if (glad_glGetVertexAttribfvNV == NULL && glad_glGetVertexAttribfvARB != NULL) glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glad_glGetVertexAttribfvARB; + if (glad_glGetVertexAttribIiv == NULL && glad_glGetVertexAttribIivEXT != NULL) glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glad_glGetVertexAttribIivEXT; + if (glad_glGetVertexAttribIivEXT == NULL && glad_glGetVertexAttribIiv != NULL) glad_glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glad_glGetVertexAttribIiv; + if (glad_glGetVertexAttribIuiv == NULL && glad_glGetVertexAttribIuivEXT != NULL) glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glad_glGetVertexAttribIuivEXT; + if (glad_glGetVertexAttribIuivEXT == NULL && glad_glGetVertexAttribIuiv != NULL) glad_glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glad_glGetVertexAttribIuiv; + if (glad_glGetVertexAttribiv == NULL && glad_glGetVertexAttribivARB != NULL) glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glad_glGetVertexAttribivARB; + if (glad_glGetVertexAttribiv == NULL && glad_glGetVertexAttribivNV != NULL) glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glad_glGetVertexAttribivNV; + if (glad_glGetVertexAttribivARB == NULL && glad_glGetVertexAttribiv != NULL) glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glad_glGetVertexAttribiv; + if (glad_glGetVertexAttribivARB == NULL && glad_glGetVertexAttribivNV != NULL) glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glad_glGetVertexAttribivNV; + if (glad_glGetVertexAttribivNV == NULL && glad_glGetVertexAttribiv != NULL) glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glad_glGetVertexAttribiv; + if (glad_glGetVertexAttribivNV == NULL && glad_glGetVertexAttribivARB != NULL) glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glad_glGetVertexAttribivARB; + if (glad_glGetVertexAttribPointerv == NULL && glad_glGetVertexAttribPointervARB != NULL) glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glad_glGetVertexAttribPointervARB; + if (glad_glGetVertexAttribPointerv == NULL && glad_glGetVertexAttribPointervNV != NULL) glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glad_glGetVertexAttribPointervNV; + if (glad_glGetVertexAttribPointervARB == NULL && glad_glGetVertexAttribPointerv != NULL) glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glad_glGetVertexAttribPointerv; + if (glad_glGetVertexAttribPointervARB == NULL && glad_glGetVertexAttribPointervNV != NULL) glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glad_glGetVertexAttribPointervNV; + if (glad_glGetVertexAttribPointervNV == NULL && glad_glGetVertexAttribPointerv != NULL) glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glad_glGetVertexAttribPointerv; + if (glad_glGetVertexAttribPointervNV == NULL && glad_glGetVertexAttribPointervARB != NULL) glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glad_glGetVertexAttribPointervARB; + if (glad_glIsBuffer == NULL && glad_glIsBufferARB != NULL) glad_glIsBuffer = (PFNGLISBUFFERPROC)glad_glIsBufferARB; + if (glad_glIsBufferARB == NULL && glad_glIsBuffer != NULL) glad_glIsBufferARB = (PFNGLISBUFFERARBPROC)glad_glIsBuffer; + if (glad_glIsEnabledi == NULL && glad_glIsEnabledIndexedEXT != NULL) glad_glIsEnabledi = (PFNGLISENABLEDIPROC)glad_glIsEnabledIndexedEXT; + if (glad_glIsEnabledIndexedEXT == NULL && glad_glIsEnabledi != NULL) glad_glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glad_glIsEnabledi; + if (glad_glIsFramebuffer == NULL && glad_glIsFramebufferEXT != NULL) glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glad_glIsFramebufferEXT; + if (glad_glIsFramebufferEXT == NULL && glad_glIsFramebuffer != NULL) glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glad_glIsFramebuffer; + if (glad_glIsProgramARB == NULL && glad_glIsProgramNV != NULL) glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC)glad_glIsProgramNV; + if (glad_glIsProgramNV == NULL && glad_glIsProgramARB != NULL) glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC)glad_glIsProgramARB; + if (glad_glIsQuery == NULL && glad_glIsQueryARB != NULL) glad_glIsQuery = (PFNGLISQUERYPROC)glad_glIsQueryARB; + if (glad_glIsQueryARB == NULL && glad_glIsQuery != NULL) glad_glIsQueryARB = (PFNGLISQUERYARBPROC)glad_glIsQuery; + if (glad_glIsRenderbuffer == NULL && glad_glIsRenderbufferEXT != NULL) glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glad_glIsRenderbufferEXT; + if (glad_glIsRenderbufferEXT == NULL && glad_glIsRenderbuffer != NULL) glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glad_glIsRenderbuffer; + if (glad_glIsVertexArray == NULL && glad_glIsVertexArrayAPPLE != NULL) glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glad_glIsVertexArrayAPPLE; + if (glad_glIsVertexArrayAPPLE == NULL && glad_glIsVertexArray != NULL) glad_glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glad_glIsVertexArray; + if (glad_glLinkProgram == NULL && glad_glLinkProgramARB != NULL) glad_glLinkProgram = (PFNGLLINKPROGRAMPROC)glad_glLinkProgramARB; + if (glad_glLinkProgramARB == NULL && glad_glLinkProgram != NULL) glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glad_glLinkProgram; + if (glad_glLoadTransposeMatrixd == NULL && glad_glLoadTransposeMatrixdARB != NULL) glad_glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glad_glLoadTransposeMatrixdARB; + if (glad_glLoadTransposeMatrixdARB == NULL && glad_glLoadTransposeMatrixd != NULL) glad_glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glad_glLoadTransposeMatrixd; + if (glad_glLoadTransposeMatrixf == NULL && glad_glLoadTransposeMatrixfARB != NULL) glad_glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glad_glLoadTransposeMatrixfARB; + if (glad_glLoadTransposeMatrixfARB == NULL && glad_glLoadTransposeMatrixf != NULL) glad_glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glad_glLoadTransposeMatrixf; + if (glad_glMapBuffer == NULL && glad_glMapBufferARB != NULL) glad_glMapBuffer = (PFNGLMAPBUFFERPROC)glad_glMapBufferARB; + if (glad_glMapBufferARB == NULL && glad_glMapBuffer != NULL) glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glad_glMapBuffer; + if (glad_glMultiDrawArrays == NULL && glad_glMultiDrawArraysEXT != NULL) glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glad_glMultiDrawArraysEXT; + if (glad_glMultiDrawArraysEXT == NULL && glad_glMultiDrawArrays != NULL) glad_glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glad_glMultiDrawArrays; + if (glad_glMultiDrawElements == NULL && glad_glMultiDrawElementsEXT != NULL) glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glad_glMultiDrawElementsEXT; + if (glad_glMultiDrawElementsEXT == NULL && glad_glMultiDrawElements != NULL) glad_glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glad_glMultiDrawElements; + if (glad_glMultiTexCoord1d == NULL && glad_glMultiTexCoord1dARB != NULL) glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glad_glMultiTexCoord1dARB; + if (glad_glMultiTexCoord1dARB == NULL && glad_glMultiTexCoord1d != NULL) glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glad_glMultiTexCoord1d; + if (glad_glMultiTexCoord1dv == NULL && glad_glMultiTexCoord1dvARB != NULL) glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glad_glMultiTexCoord1dvARB; + if (glad_glMultiTexCoord1dvARB == NULL && glad_glMultiTexCoord1dv != NULL) glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glad_glMultiTexCoord1dv; + if (glad_glMultiTexCoord1f == NULL && glad_glMultiTexCoord1fARB != NULL) glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glad_glMultiTexCoord1fARB; + if (glad_glMultiTexCoord1fARB == NULL && glad_glMultiTexCoord1f != NULL) glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glad_glMultiTexCoord1f; + if (glad_glMultiTexCoord1fv == NULL && glad_glMultiTexCoord1fvARB != NULL) glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glad_glMultiTexCoord1fvARB; + if (glad_glMultiTexCoord1fvARB == NULL && glad_glMultiTexCoord1fv != NULL) glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glad_glMultiTexCoord1fv; + if (glad_glMultiTexCoord1i == NULL && glad_glMultiTexCoord1iARB != NULL) glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glad_glMultiTexCoord1iARB; + if (glad_glMultiTexCoord1iARB == NULL && glad_glMultiTexCoord1i != NULL) glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glad_glMultiTexCoord1i; + if (glad_glMultiTexCoord1iv == NULL && glad_glMultiTexCoord1ivARB != NULL) glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glad_glMultiTexCoord1ivARB; + if (glad_glMultiTexCoord1ivARB == NULL && glad_glMultiTexCoord1iv != NULL) glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glad_glMultiTexCoord1iv; + if (glad_glMultiTexCoord1s == NULL && glad_glMultiTexCoord1sARB != NULL) glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glad_glMultiTexCoord1sARB; + if (glad_glMultiTexCoord1sARB == NULL && glad_glMultiTexCoord1s != NULL) glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glad_glMultiTexCoord1s; + if (glad_glMultiTexCoord1sv == NULL && glad_glMultiTexCoord1svARB != NULL) glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glad_glMultiTexCoord1svARB; + if (glad_glMultiTexCoord1svARB == NULL && glad_glMultiTexCoord1sv != NULL) glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glad_glMultiTexCoord1sv; + if (glad_glMultiTexCoord2d == NULL && glad_glMultiTexCoord2dARB != NULL) glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glad_glMultiTexCoord2dARB; + if (glad_glMultiTexCoord2dARB == NULL && glad_glMultiTexCoord2d != NULL) glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glad_glMultiTexCoord2d; + if (glad_glMultiTexCoord2dv == NULL && glad_glMultiTexCoord2dvARB != NULL) glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glad_glMultiTexCoord2dvARB; + if (glad_glMultiTexCoord2dvARB == NULL && glad_glMultiTexCoord2dv != NULL) glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glad_glMultiTexCoord2dv; + if (glad_glMultiTexCoord2f == NULL && glad_glMultiTexCoord2fARB != NULL) glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glad_glMultiTexCoord2fARB; + if (glad_glMultiTexCoord2fARB == NULL && glad_glMultiTexCoord2f != NULL) glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glad_glMultiTexCoord2f; + if (glad_glMultiTexCoord2fv == NULL && glad_glMultiTexCoord2fvARB != NULL) glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glad_glMultiTexCoord2fvARB; + if (glad_glMultiTexCoord2fvARB == NULL && glad_glMultiTexCoord2fv != NULL) glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glad_glMultiTexCoord2fv; + if (glad_glMultiTexCoord2i == NULL && glad_glMultiTexCoord2iARB != NULL) glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glad_glMultiTexCoord2iARB; + if (glad_glMultiTexCoord2iARB == NULL && glad_glMultiTexCoord2i != NULL) glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glad_glMultiTexCoord2i; + if (glad_glMultiTexCoord2iv == NULL && glad_glMultiTexCoord2ivARB != NULL) glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glad_glMultiTexCoord2ivARB; + if (glad_glMultiTexCoord2ivARB == NULL && glad_glMultiTexCoord2iv != NULL) glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glad_glMultiTexCoord2iv; + if (glad_glMultiTexCoord2s == NULL && glad_glMultiTexCoord2sARB != NULL) glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glad_glMultiTexCoord2sARB; + if (glad_glMultiTexCoord2sARB == NULL && glad_glMultiTexCoord2s != NULL) glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glad_glMultiTexCoord2s; + if (glad_glMultiTexCoord2sv == NULL && glad_glMultiTexCoord2svARB != NULL) glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glad_glMultiTexCoord2svARB; + if (glad_glMultiTexCoord2svARB == NULL && glad_glMultiTexCoord2sv != NULL) glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glad_glMultiTexCoord2sv; + if (glad_glMultiTexCoord3d == NULL && glad_glMultiTexCoord3dARB != NULL) glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glad_glMultiTexCoord3dARB; + if (glad_glMultiTexCoord3dARB == NULL && glad_glMultiTexCoord3d != NULL) glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glad_glMultiTexCoord3d; + if (glad_glMultiTexCoord3dv == NULL && glad_glMultiTexCoord3dvARB != NULL) glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glad_glMultiTexCoord3dvARB; + if (glad_glMultiTexCoord3dvARB == NULL && glad_glMultiTexCoord3dv != NULL) glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glad_glMultiTexCoord3dv; + if (glad_glMultiTexCoord3f == NULL && glad_glMultiTexCoord3fARB != NULL) glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glad_glMultiTexCoord3fARB; + if (glad_glMultiTexCoord3fARB == NULL && glad_glMultiTexCoord3f != NULL) glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glad_glMultiTexCoord3f; + if (glad_glMultiTexCoord3fv == NULL && glad_glMultiTexCoord3fvARB != NULL) glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glad_glMultiTexCoord3fvARB; + if (glad_glMultiTexCoord3fvARB == NULL && glad_glMultiTexCoord3fv != NULL) glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glad_glMultiTexCoord3fv; + if (glad_glMultiTexCoord3i == NULL && glad_glMultiTexCoord3iARB != NULL) glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glad_glMultiTexCoord3iARB; + if (glad_glMultiTexCoord3iARB == NULL && glad_glMultiTexCoord3i != NULL) glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glad_glMultiTexCoord3i; + if (glad_glMultiTexCoord3iv == NULL && glad_glMultiTexCoord3ivARB != NULL) glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glad_glMultiTexCoord3ivARB; + if (glad_glMultiTexCoord3ivARB == NULL && glad_glMultiTexCoord3iv != NULL) glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glad_glMultiTexCoord3iv; + if (glad_glMultiTexCoord3s == NULL && glad_glMultiTexCoord3sARB != NULL) glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glad_glMultiTexCoord3sARB; + if (glad_glMultiTexCoord3sARB == NULL && glad_glMultiTexCoord3s != NULL) glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glad_glMultiTexCoord3s; + if (glad_glMultiTexCoord3sv == NULL && glad_glMultiTexCoord3svARB != NULL) glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glad_glMultiTexCoord3svARB; + if (glad_glMultiTexCoord3svARB == NULL && glad_glMultiTexCoord3sv != NULL) glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glad_glMultiTexCoord3sv; + if (glad_glMultiTexCoord4d == NULL && glad_glMultiTexCoord4dARB != NULL) glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glad_glMultiTexCoord4dARB; + if (glad_glMultiTexCoord4dARB == NULL && glad_glMultiTexCoord4d != NULL) glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glad_glMultiTexCoord4d; + if (glad_glMultiTexCoord4dv == NULL && glad_glMultiTexCoord4dvARB != NULL) glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glad_glMultiTexCoord4dvARB; + if (glad_glMultiTexCoord4dvARB == NULL && glad_glMultiTexCoord4dv != NULL) glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glad_glMultiTexCoord4dv; + if (glad_glMultiTexCoord4f == NULL && glad_glMultiTexCoord4fARB != NULL) glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glad_glMultiTexCoord4fARB; + if (glad_glMultiTexCoord4fARB == NULL && glad_glMultiTexCoord4f != NULL) glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glad_glMultiTexCoord4f; + if (glad_glMultiTexCoord4fv == NULL && glad_glMultiTexCoord4fvARB != NULL) glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glad_glMultiTexCoord4fvARB; + if (glad_glMultiTexCoord4fvARB == NULL && glad_glMultiTexCoord4fv != NULL) glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glad_glMultiTexCoord4fv; + if (glad_glMultiTexCoord4i == NULL && glad_glMultiTexCoord4iARB != NULL) glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glad_glMultiTexCoord4iARB; + if (glad_glMultiTexCoord4iARB == NULL && glad_glMultiTexCoord4i != NULL) glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glad_glMultiTexCoord4i; + if (glad_glMultiTexCoord4iv == NULL && glad_glMultiTexCoord4ivARB != NULL) glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glad_glMultiTexCoord4ivARB; + if (glad_glMultiTexCoord4ivARB == NULL && glad_glMultiTexCoord4iv != NULL) glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glad_glMultiTexCoord4iv; + if (glad_glMultiTexCoord4s == NULL && glad_glMultiTexCoord4sARB != NULL) glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glad_glMultiTexCoord4sARB; + if (glad_glMultiTexCoord4sARB == NULL && glad_glMultiTexCoord4s != NULL) glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glad_glMultiTexCoord4s; + if (glad_glMultiTexCoord4sv == NULL && glad_glMultiTexCoord4svARB != NULL) glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glad_glMultiTexCoord4svARB; + if (glad_glMultiTexCoord4svARB == NULL && glad_glMultiTexCoord4sv != NULL) glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glad_glMultiTexCoord4sv; + if (glad_glMultTransposeMatrixd == NULL && glad_glMultTransposeMatrixdARB != NULL) glad_glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glad_glMultTransposeMatrixdARB; + if (glad_glMultTransposeMatrixdARB == NULL && glad_glMultTransposeMatrixd != NULL) glad_glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glad_glMultTransposeMatrixd; + if (glad_glMultTransposeMatrixf == NULL && glad_glMultTransposeMatrixfARB != NULL) glad_glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glad_glMultTransposeMatrixfARB; + if (glad_glMultTransposeMatrixfARB == NULL && glad_glMultTransposeMatrixf != NULL) glad_glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glad_glMultTransposeMatrixf; + if (glad_glPointParameterf == NULL && glad_glPointParameterfARB != NULL) glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glad_glPointParameterfARB; + if (glad_glPointParameterf == NULL && glad_glPointParameterfEXT != NULL) glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glad_glPointParameterfEXT; + if (glad_glPointParameterf == NULL && glad_glPointParameterfSGIS != NULL) glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glad_glPointParameterfSGIS; + if (glad_glPointParameterfARB == NULL && glad_glPointParameterf != NULL) glad_glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glad_glPointParameterf; + if (glad_glPointParameterfARB == NULL && glad_glPointParameterfEXT != NULL) glad_glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glad_glPointParameterfEXT; + if (glad_glPointParameterfARB == NULL && glad_glPointParameterfSGIS != NULL) glad_glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glad_glPointParameterfSGIS; + if (glad_glPointParameterfEXT == NULL && glad_glPointParameterf != NULL) glad_glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glad_glPointParameterf; + if (glad_glPointParameterfEXT == NULL && glad_glPointParameterfARB != NULL) glad_glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glad_glPointParameterfARB; + if (glad_glPointParameterfEXT == NULL && glad_glPointParameterfSGIS != NULL) glad_glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glad_glPointParameterfSGIS; + if (glad_glPointParameterfSGIS == NULL && glad_glPointParameterf != NULL) glad_glPointParameterfSGIS = (PFNGLPOINTPARAMETERFSGISPROC)glad_glPointParameterf; + if (glad_glPointParameterfSGIS == NULL && glad_glPointParameterfARB != NULL) glad_glPointParameterfSGIS = (PFNGLPOINTPARAMETERFSGISPROC)glad_glPointParameterfARB; + if (glad_glPointParameterfSGIS == NULL && glad_glPointParameterfEXT != NULL) glad_glPointParameterfSGIS = (PFNGLPOINTPARAMETERFSGISPROC)glad_glPointParameterfEXT; + if (glad_glPointParameterfv == NULL && glad_glPointParameterfvARB != NULL) glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glad_glPointParameterfvARB; + if (glad_glPointParameterfv == NULL && glad_glPointParameterfvEXT != NULL) glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glad_glPointParameterfvEXT; + if (glad_glPointParameterfv == NULL && glad_glPointParameterfvSGIS != NULL) glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glad_glPointParameterfvSGIS; + if (glad_glPointParameterfvARB == NULL && glad_glPointParameterfv != NULL) glad_glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glad_glPointParameterfv; + if (glad_glPointParameterfvARB == NULL && glad_glPointParameterfvEXT != NULL) glad_glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glad_glPointParameterfvEXT; + if (glad_glPointParameterfvARB == NULL && glad_glPointParameterfvSGIS != NULL) glad_glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glad_glPointParameterfvSGIS; + if (glad_glPointParameterfvEXT == NULL && glad_glPointParameterfv != NULL) glad_glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glad_glPointParameterfv; + if (glad_glPointParameterfvEXT == NULL && glad_glPointParameterfvARB != NULL) glad_glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glad_glPointParameterfvARB; + if (glad_glPointParameterfvEXT == NULL && glad_glPointParameterfvSGIS != NULL) glad_glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glad_glPointParameterfvSGIS; + if (glad_glPointParameterfvSGIS == NULL && glad_glPointParameterfv != NULL) glad_glPointParameterfvSGIS = (PFNGLPOINTPARAMETERFVSGISPROC)glad_glPointParameterfv; + if (glad_glPointParameterfvSGIS == NULL && glad_glPointParameterfvARB != NULL) glad_glPointParameterfvSGIS = (PFNGLPOINTPARAMETERFVSGISPROC)glad_glPointParameterfvARB; + if (glad_glPointParameterfvSGIS == NULL && glad_glPointParameterfvEXT != NULL) glad_glPointParameterfvSGIS = (PFNGLPOINTPARAMETERFVSGISPROC)glad_glPointParameterfvEXT; + if (glad_glPointParameteri == NULL && glad_glPointParameteriNV != NULL) glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glad_glPointParameteriNV; + if (glad_glPointParameteriNV == NULL && glad_glPointParameteri != NULL) glad_glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glad_glPointParameteri; + if (glad_glPointParameteriv == NULL && glad_glPointParameterivNV != NULL) glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glad_glPointParameterivNV; + if (glad_glPointParameterivNV == NULL && glad_glPointParameteriv != NULL) glad_glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glad_glPointParameteriv; + if (glad_glPrioritizeTextures == NULL && glad_glPrioritizeTexturesEXT != NULL) glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC)glad_glPrioritizeTexturesEXT; + if (glad_glPrioritizeTexturesEXT == NULL && glad_glPrioritizeTextures != NULL) glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glad_glPrioritizeTextures; + if (glad_glProvokingVertex == NULL && glad_glProvokingVertexEXT != NULL) glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glad_glProvokingVertexEXT; + if (glad_glProvokingVertexEXT == NULL && glad_glProvokingVertex != NULL) glad_glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glad_glProvokingVertex; + if (glad_glRenderbufferStorage == NULL && glad_glRenderbufferStorageEXT != NULL) glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glad_glRenderbufferStorageEXT; + if (glad_glRenderbufferStorageEXT == NULL && glad_glRenderbufferStorage != NULL) glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glad_glRenderbufferStorage; + if (glad_glRenderbufferStorageMultisample == NULL && glad_glRenderbufferStorageMultisampleEXT != NULL) glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glad_glRenderbufferStorageMultisampleEXT; + if (glad_glRenderbufferStorageMultisampleEXT == NULL && glad_glRenderbufferStorageMultisample != NULL) glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glad_glRenderbufferStorageMultisample; + if (glad_glSampleCoverage == NULL && glad_glSampleCoverageARB != NULL) glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glad_glSampleCoverageARB; + if (glad_glSampleCoverageARB == NULL && glad_glSampleCoverage != NULL) glad_glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glad_glSampleCoverage; + if (glad_glSecondaryColor3b == NULL && glad_glSecondaryColor3bEXT != NULL) glad_glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glad_glSecondaryColor3bEXT; + if (glad_glSecondaryColor3bEXT == NULL && glad_glSecondaryColor3b != NULL) glad_glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glad_glSecondaryColor3b; + if (glad_glSecondaryColor3bv == NULL && glad_glSecondaryColor3bvEXT != NULL) glad_glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glad_glSecondaryColor3bvEXT; + if (glad_glSecondaryColor3bvEXT == NULL && glad_glSecondaryColor3bv != NULL) glad_glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glad_glSecondaryColor3bv; + if (glad_glSecondaryColor3d == NULL && glad_glSecondaryColor3dEXT != NULL) glad_glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glad_glSecondaryColor3dEXT; + if (glad_glSecondaryColor3dEXT == NULL && glad_glSecondaryColor3d != NULL) glad_glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glad_glSecondaryColor3d; + if (glad_glSecondaryColor3dv == NULL && glad_glSecondaryColor3dvEXT != NULL) glad_glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glad_glSecondaryColor3dvEXT; + if (glad_glSecondaryColor3dvEXT == NULL && glad_glSecondaryColor3dv != NULL) glad_glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glad_glSecondaryColor3dv; + if (glad_glSecondaryColor3f == NULL && glad_glSecondaryColor3fEXT != NULL) glad_glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glad_glSecondaryColor3fEXT; + if (glad_glSecondaryColor3fEXT == NULL && glad_glSecondaryColor3f != NULL) glad_glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glad_glSecondaryColor3f; + if (glad_glSecondaryColor3fv == NULL && glad_glSecondaryColor3fvEXT != NULL) glad_glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glad_glSecondaryColor3fvEXT; + if (glad_glSecondaryColor3fvEXT == NULL && glad_glSecondaryColor3fv != NULL) glad_glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glad_glSecondaryColor3fv; + if (glad_glSecondaryColor3i == NULL && glad_glSecondaryColor3iEXT != NULL) glad_glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glad_glSecondaryColor3iEXT; + if (glad_glSecondaryColor3iEXT == NULL && glad_glSecondaryColor3i != NULL) glad_glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glad_glSecondaryColor3i; + if (glad_glSecondaryColor3iv == NULL && glad_glSecondaryColor3ivEXT != NULL) glad_glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glad_glSecondaryColor3ivEXT; + if (glad_glSecondaryColor3ivEXT == NULL && glad_glSecondaryColor3iv != NULL) glad_glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glad_glSecondaryColor3iv; + if (glad_glSecondaryColor3s == NULL && glad_glSecondaryColor3sEXT != NULL) glad_glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glad_glSecondaryColor3sEXT; + if (glad_glSecondaryColor3sEXT == NULL && glad_glSecondaryColor3s != NULL) glad_glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glad_glSecondaryColor3s; + if (glad_glSecondaryColor3sv == NULL && glad_glSecondaryColor3svEXT != NULL) glad_glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glad_glSecondaryColor3svEXT; + if (glad_glSecondaryColor3svEXT == NULL && glad_glSecondaryColor3sv != NULL) glad_glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glad_glSecondaryColor3sv; + if (glad_glSecondaryColor3ub == NULL && glad_glSecondaryColor3ubEXT != NULL) glad_glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glad_glSecondaryColor3ubEXT; + if (glad_glSecondaryColor3ubEXT == NULL && glad_glSecondaryColor3ub != NULL) glad_glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glad_glSecondaryColor3ub; + if (glad_glSecondaryColor3ubv == NULL && glad_glSecondaryColor3ubvEXT != NULL) glad_glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glad_glSecondaryColor3ubvEXT; + if (glad_glSecondaryColor3ubvEXT == NULL && glad_glSecondaryColor3ubv != NULL) glad_glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glad_glSecondaryColor3ubv; + if (glad_glSecondaryColor3ui == NULL && glad_glSecondaryColor3uiEXT != NULL) glad_glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glad_glSecondaryColor3uiEXT; + if (glad_glSecondaryColor3uiEXT == NULL && glad_glSecondaryColor3ui != NULL) glad_glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glad_glSecondaryColor3ui; + if (glad_glSecondaryColor3uiv == NULL && glad_glSecondaryColor3uivEXT != NULL) glad_glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glad_glSecondaryColor3uivEXT; + if (glad_glSecondaryColor3uivEXT == NULL && glad_glSecondaryColor3uiv != NULL) glad_glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glad_glSecondaryColor3uiv; + if (glad_glSecondaryColor3us == NULL && glad_glSecondaryColor3usEXT != NULL) glad_glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glad_glSecondaryColor3usEXT; + if (glad_glSecondaryColor3usEXT == NULL && glad_glSecondaryColor3us != NULL) glad_glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glad_glSecondaryColor3us; + if (glad_glSecondaryColor3usv == NULL && glad_glSecondaryColor3usvEXT != NULL) glad_glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glad_glSecondaryColor3usvEXT; + if (glad_glSecondaryColor3usvEXT == NULL && glad_glSecondaryColor3usv != NULL) glad_glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glad_glSecondaryColor3usv; + if (glad_glSecondaryColorPointer == NULL && glad_glSecondaryColorPointerEXT != NULL) glad_glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glad_glSecondaryColorPointerEXT; + if (glad_glSecondaryColorPointerEXT == NULL && glad_glSecondaryColorPointer != NULL) glad_glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glad_glSecondaryColorPointer; + if (glad_glShaderSource == NULL && glad_glShaderSourceARB != NULL) glad_glShaderSource = (PFNGLSHADERSOURCEPROC)glad_glShaderSourceARB; + if (glad_glShaderSourceARB == NULL && glad_glShaderSource != NULL) glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glad_glShaderSource; + if (glad_glStencilOpSeparate == NULL && glad_glStencilOpSeparateATI != NULL) glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glad_glStencilOpSeparateATI; + if (glad_glStencilOpSeparateATI == NULL && glad_glStencilOpSeparate != NULL) glad_glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glad_glStencilOpSeparate; + if (glad_glTexBuffer == NULL && glad_glTexBufferARB != NULL) glad_glTexBuffer = (PFNGLTEXBUFFERPROC)glad_glTexBufferARB; + if (glad_glTexBuffer == NULL && glad_glTexBufferEXT != NULL) glad_glTexBuffer = (PFNGLTEXBUFFERPROC)glad_glTexBufferEXT; + if (glad_glTexBufferARB == NULL && glad_glTexBuffer != NULL) glad_glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glad_glTexBuffer; + if (glad_glTexBufferARB == NULL && glad_glTexBufferEXT != NULL) glad_glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glad_glTexBufferEXT; + if (glad_glTexBufferEXT == NULL && glad_glTexBuffer != NULL) glad_glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glad_glTexBuffer; + if (glad_glTexBufferEXT == NULL && glad_glTexBufferARB != NULL) glad_glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glad_glTexBufferARB; + if (glad_glTexImage3D == NULL && glad_glTexImage3DEXT != NULL) glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC)glad_glTexImage3DEXT; + if (glad_glTexImage3DEXT == NULL && glad_glTexImage3D != NULL) glad_glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glad_glTexImage3D; + if (glad_glTexParameterIiv == NULL && glad_glTexParameterIivEXT != NULL) glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glad_glTexParameterIivEXT; + if (glad_glTexParameterIivEXT == NULL && glad_glTexParameterIiv != NULL) glad_glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glad_glTexParameterIiv; + if (glad_glTexParameterIuiv == NULL && glad_glTexParameterIuivEXT != NULL) glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glad_glTexParameterIuivEXT; + if (glad_glTexParameterIuivEXT == NULL && glad_glTexParameterIuiv != NULL) glad_glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glad_glTexParameterIuiv; + if (glad_glTexSubImage1D == NULL && glad_glTexSubImage1DEXT != NULL) glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)glad_glTexSubImage1DEXT; + if (glad_glTexSubImage1DEXT == NULL && glad_glTexSubImage1D != NULL) glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glad_glTexSubImage1D; + if (glad_glTexSubImage2D == NULL && glad_glTexSubImage2DEXT != NULL) glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)glad_glTexSubImage2DEXT; + if (glad_glTexSubImage2DEXT == NULL && glad_glTexSubImage2D != NULL) glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glad_glTexSubImage2D; + if (glad_glTexSubImage3D == NULL && glad_glTexSubImage3DEXT != NULL) glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glad_glTexSubImage3DEXT; + if (glad_glTexSubImage3DEXT == NULL && glad_glTexSubImage3D != NULL) glad_glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glad_glTexSubImage3D; + if (glad_glTransformFeedbackVaryings == NULL && glad_glTransformFeedbackVaryingsEXT != NULL) glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glad_glTransformFeedbackVaryingsEXT; + if (glad_glTransformFeedbackVaryingsEXT == NULL && glad_glTransformFeedbackVaryings != NULL) glad_glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glad_glTransformFeedbackVaryings; + if (glad_glUniform1f == NULL && glad_glUniform1fARB != NULL) glad_glUniform1f = (PFNGLUNIFORM1FPROC)glad_glUniform1fARB; + if (glad_glUniform1fARB == NULL && glad_glUniform1f != NULL) glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glad_glUniform1f; + if (glad_glUniform1fv == NULL && glad_glUniform1fvARB != NULL) glad_glUniform1fv = (PFNGLUNIFORM1FVPROC)glad_glUniform1fvARB; + if (glad_glUniform1fvARB == NULL && glad_glUniform1fv != NULL) glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glad_glUniform1fv; + if (glad_glUniform1i == NULL && glad_glUniform1iARB != NULL) glad_glUniform1i = (PFNGLUNIFORM1IPROC)glad_glUniform1iARB; + if (glad_glUniform1iARB == NULL && glad_glUniform1i != NULL) glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glad_glUniform1i; + if (glad_glUniform1iv == NULL && glad_glUniform1ivARB != NULL) glad_glUniform1iv = (PFNGLUNIFORM1IVPROC)glad_glUniform1ivARB; + if (glad_glUniform1ivARB == NULL && glad_glUniform1iv != NULL) glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glad_glUniform1iv; + if (glad_glUniform1ui == NULL && glad_glUniform1uiEXT != NULL) glad_glUniform1ui = (PFNGLUNIFORM1UIPROC)glad_glUniform1uiEXT; + if (glad_glUniform1uiEXT == NULL && glad_glUniform1ui != NULL) glad_glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glad_glUniform1ui; + if (glad_glUniform1uiv == NULL && glad_glUniform1uivEXT != NULL) glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glad_glUniform1uivEXT; + if (glad_glUniform1uivEXT == NULL && glad_glUniform1uiv != NULL) glad_glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glad_glUniform1uiv; + if (glad_glUniform2f == NULL && glad_glUniform2fARB != NULL) glad_glUniform2f = (PFNGLUNIFORM2FPROC)glad_glUniform2fARB; + if (glad_glUniform2fARB == NULL && glad_glUniform2f != NULL) glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glad_glUniform2f; + if (glad_glUniform2fv == NULL && glad_glUniform2fvARB != NULL) glad_glUniform2fv = (PFNGLUNIFORM2FVPROC)glad_glUniform2fvARB; + if (glad_glUniform2fvARB == NULL && glad_glUniform2fv != NULL) glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glad_glUniform2fv; + if (glad_glUniform2i == NULL && glad_glUniform2iARB != NULL) glad_glUniform2i = (PFNGLUNIFORM2IPROC)glad_glUniform2iARB; + if (glad_glUniform2iARB == NULL && glad_glUniform2i != NULL) glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glad_glUniform2i; + if (glad_glUniform2iv == NULL && glad_glUniform2ivARB != NULL) glad_glUniform2iv = (PFNGLUNIFORM2IVPROC)glad_glUniform2ivARB; + if (glad_glUniform2ivARB == NULL && glad_glUniform2iv != NULL) glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glad_glUniform2iv; + if (glad_glUniform2ui == NULL && glad_glUniform2uiEXT != NULL) glad_glUniform2ui = (PFNGLUNIFORM2UIPROC)glad_glUniform2uiEXT; + if (glad_glUniform2uiEXT == NULL && glad_glUniform2ui != NULL) glad_glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glad_glUniform2ui; + if (glad_glUniform2uiv == NULL && glad_glUniform2uivEXT != NULL) glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glad_glUniform2uivEXT; + if (glad_glUniform2uivEXT == NULL && glad_glUniform2uiv != NULL) glad_glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glad_glUniform2uiv; + if (glad_glUniform3f == NULL && glad_glUniform3fARB != NULL) glad_glUniform3f = (PFNGLUNIFORM3FPROC)glad_glUniform3fARB; + if (glad_glUniform3fARB == NULL && glad_glUniform3f != NULL) glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glad_glUniform3f; + if (glad_glUniform3fv == NULL && glad_glUniform3fvARB != NULL) glad_glUniform3fv = (PFNGLUNIFORM3FVPROC)glad_glUniform3fvARB; + if (glad_glUniform3fvARB == NULL && glad_glUniform3fv != NULL) glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glad_glUniform3fv; + if (glad_glUniform3i == NULL && glad_glUniform3iARB != NULL) glad_glUniform3i = (PFNGLUNIFORM3IPROC)glad_glUniform3iARB; + if (glad_glUniform3iARB == NULL && glad_glUniform3i != NULL) glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glad_glUniform3i; + if (glad_glUniform3iv == NULL && glad_glUniform3ivARB != NULL) glad_glUniform3iv = (PFNGLUNIFORM3IVPROC)glad_glUniform3ivARB; + if (glad_glUniform3ivARB == NULL && glad_glUniform3iv != NULL) glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glad_glUniform3iv; + if (glad_glUniform3ui == NULL && glad_glUniform3uiEXT != NULL) glad_glUniform3ui = (PFNGLUNIFORM3UIPROC)glad_glUniform3uiEXT; + if (glad_glUniform3uiEXT == NULL && glad_glUniform3ui != NULL) glad_glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glad_glUniform3ui; + if (glad_glUniform3uiv == NULL && glad_glUniform3uivEXT != NULL) glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glad_glUniform3uivEXT; + if (glad_glUniform3uivEXT == NULL && glad_glUniform3uiv != NULL) glad_glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glad_glUniform3uiv; + if (glad_glUniform4f == NULL && glad_glUniform4fARB != NULL) glad_glUniform4f = (PFNGLUNIFORM4FPROC)glad_glUniform4fARB; + if (glad_glUniform4fARB == NULL && glad_glUniform4f != NULL) glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glad_glUniform4f; + if (glad_glUniform4fv == NULL && glad_glUniform4fvARB != NULL) glad_glUniform4fv = (PFNGLUNIFORM4FVPROC)glad_glUniform4fvARB; + if (glad_glUniform4fvARB == NULL && glad_glUniform4fv != NULL) glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glad_glUniform4fv; + if (glad_glUniform4i == NULL && glad_glUniform4iARB != NULL) glad_glUniform4i = (PFNGLUNIFORM4IPROC)glad_glUniform4iARB; + if (glad_glUniform4iARB == NULL && glad_glUniform4i != NULL) glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glad_glUniform4i; + if (glad_glUniform4iv == NULL && glad_glUniform4ivARB != NULL) glad_glUniform4iv = (PFNGLUNIFORM4IVPROC)glad_glUniform4ivARB; + if (glad_glUniform4ivARB == NULL && glad_glUniform4iv != NULL) glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glad_glUniform4iv; + if (glad_glUniform4ui == NULL && glad_glUniform4uiEXT != NULL) glad_glUniform4ui = (PFNGLUNIFORM4UIPROC)glad_glUniform4uiEXT; + if (glad_glUniform4uiEXT == NULL && glad_glUniform4ui != NULL) glad_glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glad_glUniform4ui; + if (glad_glUniform4uiv == NULL && glad_glUniform4uivEXT != NULL) glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glad_glUniform4uivEXT; + if (glad_glUniform4uivEXT == NULL && glad_glUniform4uiv != NULL) glad_glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glad_glUniform4uiv; + if (glad_glUniformMatrix2fv == NULL && glad_glUniformMatrix2fvARB != NULL) glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glad_glUniformMatrix2fvARB; + if (glad_glUniformMatrix2fvARB == NULL && glad_glUniformMatrix2fv != NULL) glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glad_glUniformMatrix2fv; + if (glad_glUniformMatrix3fv == NULL && glad_glUniformMatrix3fvARB != NULL) glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glad_glUniformMatrix3fvARB; + if (glad_glUniformMatrix3fvARB == NULL && glad_glUniformMatrix3fv != NULL) glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glad_glUniformMatrix3fv; + if (glad_glUniformMatrix4fv == NULL && glad_glUniformMatrix4fvARB != NULL) glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glad_glUniformMatrix4fvARB; + if (glad_glUniformMatrix4fvARB == NULL && glad_glUniformMatrix4fv != NULL) glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glad_glUniformMatrix4fv; + if (glad_glUnmapBuffer == NULL && glad_glUnmapBufferARB != NULL) glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glad_glUnmapBufferARB; + if (glad_glUnmapBufferARB == NULL && glad_glUnmapBuffer != NULL) glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glad_glUnmapBuffer; + if (glad_glUseProgram == NULL && glad_glUseProgramObjectARB != NULL) glad_glUseProgram = (PFNGLUSEPROGRAMPROC)glad_glUseProgramObjectARB; + if (glad_glUseProgramObjectARB == NULL && glad_glUseProgram != NULL) glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glad_glUseProgram; + if (glad_glValidateProgram == NULL && glad_glValidateProgramARB != NULL) glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glad_glValidateProgramARB; + if (glad_glValidateProgramARB == NULL && glad_glValidateProgram != NULL) glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glad_glValidateProgram; + if (glad_glVertexAttrib1d == NULL && glad_glVertexAttrib1dARB != NULL) glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glad_glVertexAttrib1dARB; + if (glad_glVertexAttrib1d == NULL && glad_glVertexAttrib1dNV != NULL) glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glad_glVertexAttrib1dNV; + if (glad_glVertexAttrib1dARB == NULL && glad_glVertexAttrib1d != NULL) glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glad_glVertexAttrib1d; + if (glad_glVertexAttrib1dARB == NULL && glad_glVertexAttrib1dNV != NULL) glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glad_glVertexAttrib1dNV; + if (glad_glVertexAttrib1dNV == NULL && glad_glVertexAttrib1d != NULL) glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glad_glVertexAttrib1d; + if (glad_glVertexAttrib1dNV == NULL && glad_glVertexAttrib1dARB != NULL) glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glad_glVertexAttrib1dARB; + if (glad_glVertexAttrib1dv == NULL && glad_glVertexAttrib1dvARB != NULL) glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glad_glVertexAttrib1dvARB; + if (glad_glVertexAttrib1dv == NULL && glad_glVertexAttrib1dvNV != NULL) glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glad_glVertexAttrib1dvNV; + if (glad_glVertexAttrib1dvARB == NULL && glad_glVertexAttrib1dv != NULL) glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glad_glVertexAttrib1dv; + if (glad_glVertexAttrib1dvARB == NULL && glad_glVertexAttrib1dvNV != NULL) glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glad_glVertexAttrib1dvNV; + if (glad_glVertexAttrib1dvNV == NULL && glad_glVertexAttrib1dv != NULL) glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glad_glVertexAttrib1dv; + if (glad_glVertexAttrib1dvNV == NULL && glad_glVertexAttrib1dvARB != NULL) glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glad_glVertexAttrib1dvARB; + if (glad_glVertexAttrib1f == NULL && glad_glVertexAttrib1fARB != NULL) glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glad_glVertexAttrib1fARB; + if (glad_glVertexAttrib1f == NULL && glad_glVertexAttrib1fNV != NULL) glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glad_glVertexAttrib1fNV; + if (glad_glVertexAttrib1fARB == NULL && glad_glVertexAttrib1f != NULL) glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glad_glVertexAttrib1f; + if (glad_glVertexAttrib1fARB == NULL && glad_glVertexAttrib1fNV != NULL) glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glad_glVertexAttrib1fNV; + if (glad_glVertexAttrib1fNV == NULL && glad_glVertexAttrib1f != NULL) glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glad_glVertexAttrib1f; + if (glad_glVertexAttrib1fNV == NULL && glad_glVertexAttrib1fARB != NULL) glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glad_glVertexAttrib1fARB; + if (glad_glVertexAttrib1fv == NULL && glad_glVertexAttrib1fvARB != NULL) glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glad_glVertexAttrib1fvARB; + if (glad_glVertexAttrib1fv == NULL && glad_glVertexAttrib1fvNV != NULL) glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glad_glVertexAttrib1fvNV; + if (glad_glVertexAttrib1fvARB == NULL && glad_glVertexAttrib1fv != NULL) glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glad_glVertexAttrib1fv; + if (glad_glVertexAttrib1fvARB == NULL && glad_glVertexAttrib1fvNV != NULL) glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glad_glVertexAttrib1fvNV; + if (glad_glVertexAttrib1fvNV == NULL && glad_glVertexAttrib1fv != NULL) glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glad_glVertexAttrib1fv; + if (glad_glVertexAttrib1fvNV == NULL && glad_glVertexAttrib1fvARB != NULL) glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glad_glVertexAttrib1fvARB; + if (glad_glVertexAttrib1s == NULL && glad_glVertexAttrib1sARB != NULL) glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glad_glVertexAttrib1sARB; + if (glad_glVertexAttrib1s == NULL && glad_glVertexAttrib1sNV != NULL) glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glad_glVertexAttrib1sNV; + if (glad_glVertexAttrib1sARB == NULL && glad_glVertexAttrib1s != NULL) glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glad_glVertexAttrib1s; + if (glad_glVertexAttrib1sARB == NULL && glad_glVertexAttrib1sNV != NULL) glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glad_glVertexAttrib1sNV; + if (glad_glVertexAttrib1sNV == NULL && glad_glVertexAttrib1s != NULL) glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glad_glVertexAttrib1s; + if (glad_glVertexAttrib1sNV == NULL && glad_glVertexAttrib1sARB != NULL) glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glad_glVertexAttrib1sARB; + if (glad_glVertexAttrib1sv == NULL && glad_glVertexAttrib1svARB != NULL) glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glad_glVertexAttrib1svARB; + if (glad_glVertexAttrib1sv == NULL && glad_glVertexAttrib1svNV != NULL) glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glad_glVertexAttrib1svNV; + if (glad_glVertexAttrib1svARB == NULL && glad_glVertexAttrib1sv != NULL) glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glad_glVertexAttrib1sv; + if (glad_glVertexAttrib1svARB == NULL && glad_glVertexAttrib1svNV != NULL) glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glad_glVertexAttrib1svNV; + if (glad_glVertexAttrib1svNV == NULL && glad_glVertexAttrib1sv != NULL) glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glad_glVertexAttrib1sv; + if (glad_glVertexAttrib1svNV == NULL && glad_glVertexAttrib1svARB != NULL) glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glad_glVertexAttrib1svARB; + if (glad_glVertexAttrib2d == NULL && glad_glVertexAttrib2dARB != NULL) glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glad_glVertexAttrib2dARB; + if (glad_glVertexAttrib2d == NULL && glad_glVertexAttrib2dNV != NULL) glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glad_glVertexAttrib2dNV; + if (glad_glVertexAttrib2dARB == NULL && glad_glVertexAttrib2d != NULL) glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glad_glVertexAttrib2d; + if (glad_glVertexAttrib2dARB == NULL && glad_glVertexAttrib2dNV != NULL) glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glad_glVertexAttrib2dNV; + if (glad_glVertexAttrib2dNV == NULL && glad_glVertexAttrib2d != NULL) glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glad_glVertexAttrib2d; + if (glad_glVertexAttrib2dNV == NULL && glad_glVertexAttrib2dARB != NULL) glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glad_glVertexAttrib2dARB; + if (glad_glVertexAttrib2dv == NULL && glad_glVertexAttrib2dvARB != NULL) glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glad_glVertexAttrib2dvARB; + if (glad_glVertexAttrib2dv == NULL && glad_glVertexAttrib2dvNV != NULL) glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glad_glVertexAttrib2dvNV; + if (glad_glVertexAttrib2dvARB == NULL && glad_glVertexAttrib2dv != NULL) glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glad_glVertexAttrib2dv; + if (glad_glVertexAttrib2dvARB == NULL && glad_glVertexAttrib2dvNV != NULL) glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glad_glVertexAttrib2dvNV; + if (glad_glVertexAttrib2dvNV == NULL && glad_glVertexAttrib2dv != NULL) glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glad_glVertexAttrib2dv; + if (glad_glVertexAttrib2dvNV == NULL && glad_glVertexAttrib2dvARB != NULL) glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glad_glVertexAttrib2dvARB; + if (glad_glVertexAttrib2f == NULL && glad_glVertexAttrib2fARB != NULL) glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glad_glVertexAttrib2fARB; + if (glad_glVertexAttrib2f == NULL && glad_glVertexAttrib2fNV != NULL) glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glad_glVertexAttrib2fNV; + if (glad_glVertexAttrib2fARB == NULL && glad_glVertexAttrib2f != NULL) glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glad_glVertexAttrib2f; + if (glad_glVertexAttrib2fARB == NULL && glad_glVertexAttrib2fNV != NULL) glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glad_glVertexAttrib2fNV; + if (glad_glVertexAttrib2fNV == NULL && glad_glVertexAttrib2f != NULL) glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glad_glVertexAttrib2f; + if (glad_glVertexAttrib2fNV == NULL && glad_glVertexAttrib2fARB != NULL) glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glad_glVertexAttrib2fARB; + if (glad_glVertexAttrib2fv == NULL && glad_glVertexAttrib2fvARB != NULL) glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glad_glVertexAttrib2fvARB; + if (glad_glVertexAttrib2fv == NULL && glad_glVertexAttrib2fvNV != NULL) glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glad_glVertexAttrib2fvNV; + if (glad_glVertexAttrib2fvARB == NULL && glad_glVertexAttrib2fv != NULL) glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glad_glVertexAttrib2fv; + if (glad_glVertexAttrib2fvARB == NULL && glad_glVertexAttrib2fvNV != NULL) glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glad_glVertexAttrib2fvNV; + if (glad_glVertexAttrib2fvNV == NULL && glad_glVertexAttrib2fv != NULL) glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glad_glVertexAttrib2fv; + if (glad_glVertexAttrib2fvNV == NULL && glad_glVertexAttrib2fvARB != NULL) glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glad_glVertexAttrib2fvARB; + if (glad_glVertexAttrib2s == NULL && glad_glVertexAttrib2sARB != NULL) glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glad_glVertexAttrib2sARB; + if (glad_glVertexAttrib2s == NULL && glad_glVertexAttrib2sNV != NULL) glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glad_glVertexAttrib2sNV; + if (glad_glVertexAttrib2sARB == NULL && glad_glVertexAttrib2s != NULL) glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glad_glVertexAttrib2s; + if (glad_glVertexAttrib2sARB == NULL && glad_glVertexAttrib2sNV != NULL) glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glad_glVertexAttrib2sNV; + if (glad_glVertexAttrib2sNV == NULL && glad_glVertexAttrib2s != NULL) glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glad_glVertexAttrib2s; + if (glad_glVertexAttrib2sNV == NULL && glad_glVertexAttrib2sARB != NULL) glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glad_glVertexAttrib2sARB; + if (glad_glVertexAttrib2sv == NULL && glad_glVertexAttrib2svARB != NULL) glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glad_glVertexAttrib2svARB; + if (glad_glVertexAttrib2sv == NULL && glad_glVertexAttrib2svNV != NULL) glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glad_glVertexAttrib2svNV; + if (glad_glVertexAttrib2svARB == NULL && glad_glVertexAttrib2sv != NULL) glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glad_glVertexAttrib2sv; + if (glad_glVertexAttrib2svARB == NULL && glad_glVertexAttrib2svNV != NULL) glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glad_glVertexAttrib2svNV; + if (glad_glVertexAttrib2svNV == NULL && glad_glVertexAttrib2sv != NULL) glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glad_glVertexAttrib2sv; + if (glad_glVertexAttrib2svNV == NULL && glad_glVertexAttrib2svARB != NULL) glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glad_glVertexAttrib2svARB; + if (glad_glVertexAttrib3d == NULL && glad_glVertexAttrib3dARB != NULL) glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glad_glVertexAttrib3dARB; + if (glad_glVertexAttrib3d == NULL && glad_glVertexAttrib3dNV != NULL) glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glad_glVertexAttrib3dNV; + if (glad_glVertexAttrib3dARB == NULL && glad_glVertexAttrib3d != NULL) glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glad_glVertexAttrib3d; + if (glad_glVertexAttrib3dARB == NULL && glad_glVertexAttrib3dNV != NULL) glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glad_glVertexAttrib3dNV; + if (glad_glVertexAttrib3dNV == NULL && glad_glVertexAttrib3d != NULL) glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glad_glVertexAttrib3d; + if (glad_glVertexAttrib3dNV == NULL && glad_glVertexAttrib3dARB != NULL) glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glad_glVertexAttrib3dARB; + if (glad_glVertexAttrib3dv == NULL && glad_glVertexAttrib3dvARB != NULL) glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glad_glVertexAttrib3dvARB; + if (glad_glVertexAttrib3dv == NULL && glad_glVertexAttrib3dvNV != NULL) glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glad_glVertexAttrib3dvNV; + if (glad_glVertexAttrib3dvARB == NULL && glad_glVertexAttrib3dv != NULL) glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glad_glVertexAttrib3dv; + if (glad_glVertexAttrib3dvARB == NULL && glad_glVertexAttrib3dvNV != NULL) glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glad_glVertexAttrib3dvNV; + if (glad_glVertexAttrib3dvNV == NULL && glad_glVertexAttrib3dv != NULL) glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glad_glVertexAttrib3dv; + if (glad_glVertexAttrib3dvNV == NULL && glad_glVertexAttrib3dvARB != NULL) glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glad_glVertexAttrib3dvARB; + if (glad_glVertexAttrib3f == NULL && glad_glVertexAttrib3fARB != NULL) glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glad_glVertexAttrib3fARB; + if (glad_glVertexAttrib3f == NULL && glad_glVertexAttrib3fNV != NULL) glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glad_glVertexAttrib3fNV; + if (glad_glVertexAttrib3fARB == NULL && glad_glVertexAttrib3f != NULL) glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glad_glVertexAttrib3f; + if (glad_glVertexAttrib3fARB == NULL && glad_glVertexAttrib3fNV != NULL) glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glad_glVertexAttrib3fNV; + if (glad_glVertexAttrib3fNV == NULL && glad_glVertexAttrib3f != NULL) glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glad_glVertexAttrib3f; + if (glad_glVertexAttrib3fNV == NULL && glad_glVertexAttrib3fARB != NULL) glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glad_glVertexAttrib3fARB; + if (glad_glVertexAttrib3fv == NULL && glad_glVertexAttrib3fvARB != NULL) glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glad_glVertexAttrib3fvARB; + if (glad_glVertexAttrib3fv == NULL && glad_glVertexAttrib3fvNV != NULL) glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glad_glVertexAttrib3fvNV; + if (glad_glVertexAttrib3fvARB == NULL && glad_glVertexAttrib3fv != NULL) glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glad_glVertexAttrib3fv; + if (glad_glVertexAttrib3fvARB == NULL && glad_glVertexAttrib3fvNV != NULL) glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glad_glVertexAttrib3fvNV; + if (glad_glVertexAttrib3fvNV == NULL && glad_glVertexAttrib3fv != NULL) glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glad_glVertexAttrib3fv; + if (glad_glVertexAttrib3fvNV == NULL && glad_glVertexAttrib3fvARB != NULL) glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glad_glVertexAttrib3fvARB; + if (glad_glVertexAttrib3s == NULL && glad_glVertexAttrib3sARB != NULL) glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glad_glVertexAttrib3sARB; + if (glad_glVertexAttrib3s == NULL && glad_glVertexAttrib3sNV != NULL) glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glad_glVertexAttrib3sNV; + if (glad_glVertexAttrib3sARB == NULL && glad_glVertexAttrib3s != NULL) glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glad_glVertexAttrib3s; + if (glad_glVertexAttrib3sARB == NULL && glad_glVertexAttrib3sNV != NULL) glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glad_glVertexAttrib3sNV; + if (glad_glVertexAttrib3sNV == NULL && glad_glVertexAttrib3s != NULL) glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glad_glVertexAttrib3s; + if (glad_glVertexAttrib3sNV == NULL && glad_glVertexAttrib3sARB != NULL) glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glad_glVertexAttrib3sARB; + if (glad_glVertexAttrib3sv == NULL && glad_glVertexAttrib3svARB != NULL) glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glad_glVertexAttrib3svARB; + if (glad_glVertexAttrib3sv == NULL && glad_glVertexAttrib3svNV != NULL) glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glad_glVertexAttrib3svNV; + if (glad_glVertexAttrib3svARB == NULL && glad_glVertexAttrib3sv != NULL) glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glad_glVertexAttrib3sv; + if (glad_glVertexAttrib3svARB == NULL && glad_glVertexAttrib3svNV != NULL) glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glad_glVertexAttrib3svNV; + if (glad_glVertexAttrib3svNV == NULL && glad_glVertexAttrib3sv != NULL) glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glad_glVertexAttrib3sv; + if (glad_glVertexAttrib3svNV == NULL && glad_glVertexAttrib3svARB != NULL) glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glad_glVertexAttrib3svARB; + if (glad_glVertexAttrib4bv == NULL && glad_glVertexAttrib4bvARB != NULL) glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glad_glVertexAttrib4bvARB; + if (glad_glVertexAttrib4bvARB == NULL && glad_glVertexAttrib4bv != NULL) glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glad_glVertexAttrib4bv; + if (glad_glVertexAttrib4d == NULL && glad_glVertexAttrib4dARB != NULL) glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glad_glVertexAttrib4dARB; + if (glad_glVertexAttrib4d == NULL && glad_glVertexAttrib4dNV != NULL) glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glad_glVertexAttrib4dNV; + if (glad_glVertexAttrib4dARB == NULL && glad_glVertexAttrib4d != NULL) glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glad_glVertexAttrib4d; + if (glad_glVertexAttrib4dARB == NULL && glad_glVertexAttrib4dNV != NULL) glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glad_glVertexAttrib4dNV; + if (glad_glVertexAttrib4dNV == NULL && glad_glVertexAttrib4d != NULL) glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glad_glVertexAttrib4d; + if (glad_glVertexAttrib4dNV == NULL && glad_glVertexAttrib4dARB != NULL) glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glad_glVertexAttrib4dARB; + if (glad_glVertexAttrib4dv == NULL && glad_glVertexAttrib4dvARB != NULL) glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glad_glVertexAttrib4dvARB; + if (glad_glVertexAttrib4dv == NULL && glad_glVertexAttrib4dvNV != NULL) glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glad_glVertexAttrib4dvNV; + if (glad_glVertexAttrib4dvARB == NULL && glad_glVertexAttrib4dv != NULL) glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glad_glVertexAttrib4dv; + if (glad_glVertexAttrib4dvARB == NULL && glad_glVertexAttrib4dvNV != NULL) glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glad_glVertexAttrib4dvNV; + if (glad_glVertexAttrib4dvNV == NULL && glad_glVertexAttrib4dv != NULL) glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glad_glVertexAttrib4dv; + if (glad_glVertexAttrib4dvNV == NULL && glad_glVertexAttrib4dvARB != NULL) glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glad_glVertexAttrib4dvARB; + if (glad_glVertexAttrib4f == NULL && glad_glVertexAttrib4fARB != NULL) glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glad_glVertexAttrib4fARB; + if (glad_glVertexAttrib4f == NULL && glad_glVertexAttrib4fNV != NULL) glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glad_glVertexAttrib4fNV; + if (glad_glVertexAttrib4fARB == NULL && glad_glVertexAttrib4f != NULL) glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glad_glVertexAttrib4f; + if (glad_glVertexAttrib4fARB == NULL && glad_glVertexAttrib4fNV != NULL) glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glad_glVertexAttrib4fNV; + if (glad_glVertexAttrib4fNV == NULL && glad_glVertexAttrib4f != NULL) glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glad_glVertexAttrib4f; + if (glad_glVertexAttrib4fNV == NULL && glad_glVertexAttrib4fARB != NULL) glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glad_glVertexAttrib4fARB; + if (glad_glVertexAttrib4fv == NULL && glad_glVertexAttrib4fvARB != NULL) glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glad_glVertexAttrib4fvARB; + if (glad_glVertexAttrib4fv == NULL && glad_glVertexAttrib4fvNV != NULL) glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glad_glVertexAttrib4fvNV; + if (glad_glVertexAttrib4fvARB == NULL && glad_glVertexAttrib4fv != NULL) glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glad_glVertexAttrib4fv; + if (glad_glVertexAttrib4fvARB == NULL && glad_glVertexAttrib4fvNV != NULL) glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glad_glVertexAttrib4fvNV; + if (glad_glVertexAttrib4fvNV == NULL && glad_glVertexAttrib4fv != NULL) glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glad_glVertexAttrib4fv; + if (glad_glVertexAttrib4fvNV == NULL && glad_glVertexAttrib4fvARB != NULL) glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glad_glVertexAttrib4fvARB; + if (glad_glVertexAttrib4iv == NULL && glad_glVertexAttrib4ivARB != NULL) glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glad_glVertexAttrib4ivARB; + if (glad_glVertexAttrib4ivARB == NULL && glad_glVertexAttrib4iv != NULL) glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glad_glVertexAttrib4iv; + if (glad_glVertexAttrib4Nbv == NULL && glad_glVertexAttrib4NbvARB != NULL) glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glad_glVertexAttrib4NbvARB; + if (glad_glVertexAttrib4NbvARB == NULL && glad_glVertexAttrib4Nbv != NULL) glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glad_glVertexAttrib4Nbv; + if (glad_glVertexAttrib4Niv == NULL && glad_glVertexAttrib4NivARB != NULL) glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glad_glVertexAttrib4NivARB; + if (glad_glVertexAttrib4NivARB == NULL && glad_glVertexAttrib4Niv != NULL) glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glad_glVertexAttrib4Niv; + if (glad_glVertexAttrib4Nsv == NULL && glad_glVertexAttrib4NsvARB != NULL) glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glad_glVertexAttrib4NsvARB; + if (glad_glVertexAttrib4NsvARB == NULL && glad_glVertexAttrib4Nsv != NULL) glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glad_glVertexAttrib4Nsv; + if (glad_glVertexAttrib4Nub == NULL && glad_glVertexAttrib4NubARB != NULL) glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glad_glVertexAttrib4NubARB; + if (glad_glVertexAttrib4Nub == NULL && glad_glVertexAttrib4ubNV != NULL) glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glad_glVertexAttrib4ubNV; + if (glad_glVertexAttrib4NubARB == NULL && glad_glVertexAttrib4Nub != NULL) glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glad_glVertexAttrib4Nub; + if (glad_glVertexAttrib4NubARB == NULL && glad_glVertexAttrib4ubNV != NULL) glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glad_glVertexAttrib4ubNV; + if (glad_glVertexAttrib4Nubv == NULL && glad_glVertexAttrib4NubvARB != NULL) glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glad_glVertexAttrib4NubvARB; + if (glad_glVertexAttrib4Nubv == NULL && glad_glVertexAttrib4ubvNV != NULL) glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glad_glVertexAttrib4ubvNV; + if (glad_glVertexAttrib4NubvARB == NULL && glad_glVertexAttrib4Nubv != NULL) glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glad_glVertexAttrib4Nubv; + if (glad_glVertexAttrib4NubvARB == NULL && glad_glVertexAttrib4ubvNV != NULL) glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glad_glVertexAttrib4ubvNV; + if (glad_glVertexAttrib4Nuiv == NULL && glad_glVertexAttrib4NuivARB != NULL) glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glad_glVertexAttrib4NuivARB; + if (glad_glVertexAttrib4NuivARB == NULL && glad_glVertexAttrib4Nuiv != NULL) glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glad_glVertexAttrib4Nuiv; + if (glad_glVertexAttrib4Nusv == NULL && glad_glVertexAttrib4NusvARB != NULL) glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glad_glVertexAttrib4NusvARB; + if (glad_glVertexAttrib4NusvARB == NULL && glad_glVertexAttrib4Nusv != NULL) glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glad_glVertexAttrib4Nusv; + if (glad_glVertexAttrib4s == NULL && glad_glVertexAttrib4sARB != NULL) glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glad_glVertexAttrib4sARB; + if (glad_glVertexAttrib4s == NULL && glad_glVertexAttrib4sNV != NULL) glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glad_glVertexAttrib4sNV; + if (glad_glVertexAttrib4sARB == NULL && glad_glVertexAttrib4s != NULL) glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glad_glVertexAttrib4s; + if (glad_glVertexAttrib4sARB == NULL && glad_glVertexAttrib4sNV != NULL) glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glad_glVertexAttrib4sNV; + if (glad_glVertexAttrib4sNV == NULL && glad_glVertexAttrib4s != NULL) glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glad_glVertexAttrib4s; + if (glad_glVertexAttrib4sNV == NULL && glad_glVertexAttrib4sARB != NULL) glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glad_glVertexAttrib4sARB; + if (glad_glVertexAttrib4sv == NULL && glad_glVertexAttrib4svARB != NULL) glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glad_glVertexAttrib4svARB; + if (glad_glVertexAttrib4sv == NULL && glad_glVertexAttrib4svNV != NULL) glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glad_glVertexAttrib4svNV; + if (glad_glVertexAttrib4svARB == NULL && glad_glVertexAttrib4sv != NULL) glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glad_glVertexAttrib4sv; + if (glad_glVertexAttrib4svARB == NULL && glad_glVertexAttrib4svNV != NULL) glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glad_glVertexAttrib4svNV; + if (glad_glVertexAttrib4svNV == NULL && glad_glVertexAttrib4sv != NULL) glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glad_glVertexAttrib4sv; + if (glad_glVertexAttrib4svNV == NULL && glad_glVertexAttrib4svARB != NULL) glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glad_glVertexAttrib4svARB; + if (glad_glVertexAttrib4ubNV == NULL && glad_glVertexAttrib4Nub != NULL) glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glad_glVertexAttrib4Nub; + if (glad_glVertexAttrib4ubNV == NULL && glad_glVertexAttrib4NubARB != NULL) glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glad_glVertexAttrib4NubARB; + if (glad_glVertexAttrib4ubv == NULL && glad_glVertexAttrib4ubvARB != NULL) glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glad_glVertexAttrib4ubvARB; + if (glad_glVertexAttrib4ubvARB == NULL && glad_glVertexAttrib4ubv != NULL) glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glad_glVertexAttrib4ubv; + if (glad_glVertexAttrib4ubvNV == NULL && glad_glVertexAttrib4Nubv != NULL) glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glad_glVertexAttrib4Nubv; + if (glad_glVertexAttrib4ubvNV == NULL && glad_glVertexAttrib4NubvARB != NULL) glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glad_glVertexAttrib4NubvARB; + if (glad_glVertexAttrib4uiv == NULL && glad_glVertexAttrib4uivARB != NULL) glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glad_glVertexAttrib4uivARB; + if (glad_glVertexAttrib4uivARB == NULL && glad_glVertexAttrib4uiv != NULL) glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glad_glVertexAttrib4uiv; + if (glad_glVertexAttrib4usv == NULL && glad_glVertexAttrib4usvARB != NULL) glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glad_glVertexAttrib4usvARB; + if (glad_glVertexAttrib4usvARB == NULL && glad_glVertexAttrib4usv != NULL) glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glad_glVertexAttrib4usv; + if (glad_glVertexAttribDivisor == NULL && glad_glVertexAttribDivisorARB != NULL) glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glad_glVertexAttribDivisorARB; + if (glad_glVertexAttribDivisorARB == NULL && glad_glVertexAttribDivisor != NULL) glad_glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glad_glVertexAttribDivisor; + if (glad_glVertexAttribI1i == NULL && glad_glVertexAttribI1iEXT != NULL) glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glad_glVertexAttribI1iEXT; + if (glad_glVertexAttribI1iEXT == NULL && glad_glVertexAttribI1i != NULL) glad_glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glad_glVertexAttribI1i; + if (glad_glVertexAttribI1iv == NULL && glad_glVertexAttribI1ivEXT != NULL) glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glad_glVertexAttribI1ivEXT; + if (glad_glVertexAttribI1ivEXT == NULL && glad_glVertexAttribI1iv != NULL) glad_glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glad_glVertexAttribI1iv; + if (glad_glVertexAttribI1ui == NULL && glad_glVertexAttribI1uiEXT != NULL) glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glad_glVertexAttribI1uiEXT; + if (glad_glVertexAttribI1uiEXT == NULL && glad_glVertexAttribI1ui != NULL) glad_glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glad_glVertexAttribI1ui; + if (glad_glVertexAttribI1uiv == NULL && glad_glVertexAttribI1uivEXT != NULL) glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glad_glVertexAttribI1uivEXT; + if (glad_glVertexAttribI1uivEXT == NULL && glad_glVertexAttribI1uiv != NULL) glad_glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glad_glVertexAttribI1uiv; + if (glad_glVertexAttribI2i == NULL && glad_glVertexAttribI2iEXT != NULL) glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glad_glVertexAttribI2iEXT; + if (glad_glVertexAttribI2iEXT == NULL && glad_glVertexAttribI2i != NULL) glad_glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glad_glVertexAttribI2i; + if (glad_glVertexAttribI2iv == NULL && glad_glVertexAttribI2ivEXT != NULL) glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glad_glVertexAttribI2ivEXT; + if (glad_glVertexAttribI2ivEXT == NULL && glad_glVertexAttribI2iv != NULL) glad_glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glad_glVertexAttribI2iv; + if (glad_glVertexAttribI2ui == NULL && glad_glVertexAttribI2uiEXT != NULL) glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glad_glVertexAttribI2uiEXT; + if (glad_glVertexAttribI2uiEXT == NULL && glad_glVertexAttribI2ui != NULL) glad_glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glad_glVertexAttribI2ui; + if (glad_glVertexAttribI2uiv == NULL && glad_glVertexAttribI2uivEXT != NULL) glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glad_glVertexAttribI2uivEXT; + if (glad_glVertexAttribI2uivEXT == NULL && glad_glVertexAttribI2uiv != NULL) glad_glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glad_glVertexAttribI2uiv; + if (glad_glVertexAttribI3i == NULL && glad_glVertexAttribI3iEXT != NULL) glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glad_glVertexAttribI3iEXT; + if (glad_glVertexAttribI3iEXT == NULL && glad_glVertexAttribI3i != NULL) glad_glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glad_glVertexAttribI3i; + if (glad_glVertexAttribI3iv == NULL && glad_glVertexAttribI3ivEXT != NULL) glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glad_glVertexAttribI3ivEXT; + if (glad_glVertexAttribI3ivEXT == NULL && glad_glVertexAttribI3iv != NULL) glad_glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glad_glVertexAttribI3iv; + if (glad_glVertexAttribI3ui == NULL && glad_glVertexAttribI3uiEXT != NULL) glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glad_glVertexAttribI3uiEXT; + if (glad_glVertexAttribI3uiEXT == NULL && glad_glVertexAttribI3ui != NULL) glad_glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glad_glVertexAttribI3ui; + if (glad_glVertexAttribI3uiv == NULL && glad_glVertexAttribI3uivEXT != NULL) glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glad_glVertexAttribI3uivEXT; + if (glad_glVertexAttribI3uivEXT == NULL && glad_glVertexAttribI3uiv != NULL) glad_glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glad_glVertexAttribI3uiv; + if (glad_glVertexAttribI4bv == NULL && glad_glVertexAttribI4bvEXT != NULL) glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glad_glVertexAttribI4bvEXT; + if (glad_glVertexAttribI4bvEXT == NULL && glad_glVertexAttribI4bv != NULL) glad_glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glad_glVertexAttribI4bv; + if (glad_glVertexAttribI4i == NULL && glad_glVertexAttribI4iEXT != NULL) glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glad_glVertexAttribI4iEXT; + if (glad_glVertexAttribI4iEXT == NULL && glad_glVertexAttribI4i != NULL) glad_glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glad_glVertexAttribI4i; + if (glad_glVertexAttribI4iv == NULL && glad_glVertexAttribI4ivEXT != NULL) glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glad_glVertexAttribI4ivEXT; + if (glad_glVertexAttribI4ivEXT == NULL && glad_glVertexAttribI4iv != NULL) glad_glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glad_glVertexAttribI4iv; + if (glad_glVertexAttribI4sv == NULL && glad_glVertexAttribI4svEXT != NULL) glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glad_glVertexAttribI4svEXT; + if (glad_glVertexAttribI4svEXT == NULL && glad_glVertexAttribI4sv != NULL) glad_glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glad_glVertexAttribI4sv; + if (glad_glVertexAttribI4ubv == NULL && glad_glVertexAttribI4ubvEXT != NULL) glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glad_glVertexAttribI4ubvEXT; + if (glad_glVertexAttribI4ubvEXT == NULL && glad_glVertexAttribI4ubv != NULL) glad_glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glad_glVertexAttribI4ubv; + if (glad_glVertexAttribI4ui == NULL && glad_glVertexAttribI4uiEXT != NULL) glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glad_glVertexAttribI4uiEXT; + if (glad_glVertexAttribI4uiEXT == NULL && glad_glVertexAttribI4ui != NULL) glad_glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glad_glVertexAttribI4ui; + if (glad_glVertexAttribI4uiv == NULL && glad_glVertexAttribI4uivEXT != NULL) glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glad_glVertexAttribI4uivEXT; + if (glad_glVertexAttribI4uivEXT == NULL && glad_glVertexAttribI4uiv != NULL) glad_glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glad_glVertexAttribI4uiv; + if (glad_glVertexAttribI4usv == NULL && glad_glVertexAttribI4usvEXT != NULL) glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glad_glVertexAttribI4usvEXT; + if (glad_glVertexAttribI4usvEXT == NULL && glad_glVertexAttribI4usv != NULL) glad_glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glad_glVertexAttribI4usv; + if (glad_glVertexAttribIPointer == NULL && glad_glVertexAttribIPointerEXT != NULL) glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glad_glVertexAttribIPointerEXT; + if (glad_glVertexAttribIPointerEXT == NULL && glad_glVertexAttribIPointer != NULL) glad_glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glad_glVertexAttribIPointer; + if (glad_glVertexAttribPointer == NULL && glad_glVertexAttribPointerARB != NULL) glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glad_glVertexAttribPointerARB; + if (glad_glVertexAttribPointerARB == NULL && glad_glVertexAttribPointer != NULL) glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glad_glVertexAttribPointer; + if (glad_glWindowPos2d == NULL && glad_glWindowPos2dARB != NULL) glad_glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glad_glWindowPos2dARB; + if (glad_glWindowPos2d == NULL && glad_glWindowPos2dMESA != NULL) glad_glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glad_glWindowPos2dMESA; + if (glad_glWindowPos2dARB == NULL && glad_glWindowPos2d != NULL) glad_glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glad_glWindowPos2d; + if (glad_glWindowPos2dARB == NULL && glad_glWindowPos2dMESA != NULL) glad_glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glad_glWindowPos2dMESA; + if (glad_glWindowPos2dMESA == NULL && glad_glWindowPos2d != NULL) glad_glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glad_glWindowPos2d; + if (glad_glWindowPos2dMESA == NULL && glad_glWindowPos2dARB != NULL) glad_glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glad_glWindowPos2dARB; + if (glad_glWindowPos2dv == NULL && glad_glWindowPos2dvARB != NULL) glad_glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glad_glWindowPos2dvARB; + if (glad_glWindowPos2dv == NULL && glad_glWindowPos2dvMESA != NULL) glad_glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glad_glWindowPos2dvMESA; + if (glad_glWindowPos2dvARB == NULL && glad_glWindowPos2dv != NULL) glad_glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glad_glWindowPos2dv; + if (glad_glWindowPos2dvARB == NULL && glad_glWindowPos2dvMESA != NULL) glad_glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glad_glWindowPos2dvMESA; + if (glad_glWindowPos2dvMESA == NULL && glad_glWindowPos2dv != NULL) glad_glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glad_glWindowPos2dv; + if (glad_glWindowPos2dvMESA == NULL && glad_glWindowPos2dvARB != NULL) glad_glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glad_glWindowPos2dvARB; + if (glad_glWindowPos2f == NULL && glad_glWindowPos2fARB != NULL) glad_glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glad_glWindowPos2fARB; + if (glad_glWindowPos2f == NULL && glad_glWindowPos2fMESA != NULL) glad_glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glad_glWindowPos2fMESA; + if (glad_glWindowPos2fARB == NULL && glad_glWindowPos2f != NULL) glad_glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glad_glWindowPos2f; + if (glad_glWindowPos2fARB == NULL && glad_glWindowPos2fMESA != NULL) glad_glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glad_glWindowPos2fMESA; + if (glad_glWindowPos2fMESA == NULL && glad_glWindowPos2f != NULL) glad_glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glad_glWindowPos2f; + if (glad_glWindowPos2fMESA == NULL && glad_glWindowPos2fARB != NULL) glad_glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glad_glWindowPos2fARB; + if (glad_glWindowPos2fv == NULL && glad_glWindowPos2fvARB != NULL) glad_glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glad_glWindowPos2fvARB; + if (glad_glWindowPos2fv == NULL && glad_glWindowPos2fvMESA != NULL) glad_glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glad_glWindowPos2fvMESA; + if (glad_glWindowPos2fvARB == NULL && glad_glWindowPos2fv != NULL) glad_glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glad_glWindowPos2fv; + if (glad_glWindowPos2fvARB == NULL && glad_glWindowPos2fvMESA != NULL) glad_glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glad_glWindowPos2fvMESA; + if (glad_glWindowPos2fvMESA == NULL && glad_glWindowPos2fv != NULL) glad_glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glad_glWindowPos2fv; + if (glad_glWindowPos2fvMESA == NULL && glad_glWindowPos2fvARB != NULL) glad_glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glad_glWindowPos2fvARB; + if (glad_glWindowPos2i == NULL && glad_glWindowPos2iARB != NULL) glad_glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glad_glWindowPos2iARB; + if (glad_glWindowPos2i == NULL && glad_glWindowPos2iMESA != NULL) glad_glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glad_glWindowPos2iMESA; + if (glad_glWindowPos2iARB == NULL && glad_glWindowPos2i != NULL) glad_glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glad_glWindowPos2i; + if (glad_glWindowPos2iARB == NULL && glad_glWindowPos2iMESA != NULL) glad_glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glad_glWindowPos2iMESA; + if (glad_glWindowPos2iMESA == NULL && glad_glWindowPos2i != NULL) glad_glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glad_glWindowPos2i; + if (glad_glWindowPos2iMESA == NULL && glad_glWindowPos2iARB != NULL) glad_glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glad_glWindowPos2iARB; + if (glad_glWindowPos2iv == NULL && glad_glWindowPos2ivARB != NULL) glad_glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glad_glWindowPos2ivARB; + if (glad_glWindowPos2iv == NULL && glad_glWindowPos2ivMESA != NULL) glad_glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glad_glWindowPos2ivMESA; + if (glad_glWindowPos2ivARB == NULL && glad_glWindowPos2iv != NULL) glad_glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glad_glWindowPos2iv; + if (glad_glWindowPos2ivARB == NULL && glad_glWindowPos2ivMESA != NULL) glad_glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glad_glWindowPos2ivMESA; + if (glad_glWindowPos2ivMESA == NULL && glad_glWindowPos2iv != NULL) glad_glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glad_glWindowPos2iv; + if (glad_glWindowPos2ivMESA == NULL && glad_glWindowPos2ivARB != NULL) glad_glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glad_glWindowPos2ivARB; + if (glad_glWindowPos2s == NULL && glad_glWindowPos2sARB != NULL) glad_glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glad_glWindowPos2sARB; + if (glad_glWindowPos2s == NULL && glad_glWindowPos2sMESA != NULL) glad_glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glad_glWindowPos2sMESA; + if (glad_glWindowPos2sARB == NULL && glad_glWindowPos2s != NULL) glad_glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glad_glWindowPos2s; + if (glad_glWindowPos2sARB == NULL && glad_glWindowPos2sMESA != NULL) glad_glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glad_glWindowPos2sMESA; + if (glad_glWindowPos2sMESA == NULL && glad_glWindowPos2s != NULL) glad_glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glad_glWindowPos2s; + if (glad_glWindowPos2sMESA == NULL && glad_glWindowPos2sARB != NULL) glad_glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glad_glWindowPos2sARB; + if (glad_glWindowPos2sv == NULL && glad_glWindowPos2svARB != NULL) glad_glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glad_glWindowPos2svARB; + if (glad_glWindowPos2sv == NULL && glad_glWindowPos2svMESA != NULL) glad_glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glad_glWindowPos2svMESA; + if (glad_glWindowPos2svARB == NULL && glad_glWindowPos2sv != NULL) glad_glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glad_glWindowPos2sv; + if (glad_glWindowPos2svARB == NULL && glad_glWindowPos2svMESA != NULL) glad_glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glad_glWindowPos2svMESA; + if (glad_glWindowPos2svMESA == NULL && glad_glWindowPos2sv != NULL) glad_glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glad_glWindowPos2sv; + if (glad_glWindowPos2svMESA == NULL && glad_glWindowPos2svARB != NULL) glad_glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glad_glWindowPos2svARB; + if (glad_glWindowPos3d == NULL && glad_glWindowPos3dARB != NULL) glad_glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glad_glWindowPos3dARB; + if (glad_glWindowPos3d == NULL && glad_glWindowPos3dMESA != NULL) glad_glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glad_glWindowPos3dMESA; + if (glad_glWindowPos3dARB == NULL && glad_glWindowPos3d != NULL) glad_glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glad_glWindowPos3d; + if (glad_glWindowPos3dARB == NULL && glad_glWindowPos3dMESA != NULL) glad_glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glad_glWindowPos3dMESA; + if (glad_glWindowPos3dMESA == NULL && glad_glWindowPos3d != NULL) glad_glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glad_glWindowPos3d; + if (glad_glWindowPos3dMESA == NULL && glad_glWindowPos3dARB != NULL) glad_glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glad_glWindowPos3dARB; + if (glad_glWindowPos3dv == NULL && glad_glWindowPos3dvARB != NULL) glad_glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glad_glWindowPos3dvARB; + if (glad_glWindowPos3dv == NULL && glad_glWindowPos3dvMESA != NULL) glad_glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glad_glWindowPos3dvMESA; + if (glad_glWindowPos3dvARB == NULL && glad_glWindowPos3dv != NULL) glad_glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glad_glWindowPos3dv; + if (glad_glWindowPos3dvARB == NULL && glad_glWindowPos3dvMESA != NULL) glad_glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glad_glWindowPos3dvMESA; + if (glad_glWindowPos3dvMESA == NULL && glad_glWindowPos3dv != NULL) glad_glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glad_glWindowPos3dv; + if (glad_glWindowPos3dvMESA == NULL && glad_glWindowPos3dvARB != NULL) glad_glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glad_glWindowPos3dvARB; + if (glad_glWindowPos3f == NULL && glad_glWindowPos3fARB != NULL) glad_glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glad_glWindowPos3fARB; + if (glad_glWindowPos3f == NULL && glad_glWindowPos3fMESA != NULL) glad_glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glad_glWindowPos3fMESA; + if (glad_glWindowPos3fARB == NULL && glad_glWindowPos3f != NULL) glad_glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glad_glWindowPos3f; + if (glad_glWindowPos3fARB == NULL && glad_glWindowPos3fMESA != NULL) glad_glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glad_glWindowPos3fMESA; + if (glad_glWindowPos3fMESA == NULL && glad_glWindowPos3f != NULL) glad_glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glad_glWindowPos3f; + if (glad_glWindowPos3fMESA == NULL && glad_glWindowPos3fARB != NULL) glad_glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glad_glWindowPos3fARB; + if (glad_glWindowPos3fv == NULL && glad_glWindowPos3fvARB != NULL) glad_glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glad_glWindowPos3fvARB; + if (glad_glWindowPos3fv == NULL && glad_glWindowPos3fvMESA != NULL) glad_glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glad_glWindowPos3fvMESA; + if (glad_glWindowPos3fvARB == NULL && glad_glWindowPos3fv != NULL) glad_glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glad_glWindowPos3fv; + if (glad_glWindowPos3fvARB == NULL && glad_glWindowPos3fvMESA != NULL) glad_glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glad_glWindowPos3fvMESA; + if (glad_glWindowPos3fvMESA == NULL && glad_glWindowPos3fv != NULL) glad_glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glad_glWindowPos3fv; + if (glad_glWindowPos3fvMESA == NULL && glad_glWindowPos3fvARB != NULL) glad_glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glad_glWindowPos3fvARB; + if (glad_glWindowPos3i == NULL && glad_glWindowPos3iARB != NULL) glad_glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glad_glWindowPos3iARB; + if (glad_glWindowPos3i == NULL && glad_glWindowPos3iMESA != NULL) glad_glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glad_glWindowPos3iMESA; + if (glad_glWindowPos3iARB == NULL && glad_glWindowPos3i != NULL) glad_glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glad_glWindowPos3i; + if (glad_glWindowPos3iARB == NULL && glad_glWindowPos3iMESA != NULL) glad_glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glad_glWindowPos3iMESA; + if (glad_glWindowPos3iMESA == NULL && glad_glWindowPos3i != NULL) glad_glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glad_glWindowPos3i; + if (glad_glWindowPos3iMESA == NULL && glad_glWindowPos3iARB != NULL) glad_glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glad_glWindowPos3iARB; + if (glad_glWindowPos3iv == NULL && glad_glWindowPos3ivARB != NULL) glad_glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glad_glWindowPos3ivARB; + if (glad_glWindowPos3iv == NULL && glad_glWindowPos3ivMESA != NULL) glad_glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glad_glWindowPos3ivMESA; + if (glad_glWindowPos3ivARB == NULL && glad_glWindowPos3iv != NULL) glad_glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glad_glWindowPos3iv; + if (glad_glWindowPos3ivARB == NULL && glad_glWindowPos3ivMESA != NULL) glad_glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glad_glWindowPos3ivMESA; + if (glad_glWindowPos3ivMESA == NULL && glad_glWindowPos3iv != NULL) glad_glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glad_glWindowPos3iv; + if (glad_glWindowPos3ivMESA == NULL && glad_glWindowPos3ivARB != NULL) glad_glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glad_glWindowPos3ivARB; + if (glad_glWindowPos3s == NULL && glad_glWindowPos3sARB != NULL) glad_glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glad_glWindowPos3sARB; + if (glad_glWindowPos3s == NULL && glad_glWindowPos3sMESA != NULL) glad_glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glad_glWindowPos3sMESA; + if (glad_glWindowPos3sARB == NULL && glad_glWindowPos3s != NULL) glad_glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glad_glWindowPos3s; + if (glad_glWindowPos3sARB == NULL && glad_glWindowPos3sMESA != NULL) glad_glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glad_glWindowPos3sMESA; + if (glad_glWindowPos3sMESA == NULL && glad_glWindowPos3s != NULL) glad_glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glad_glWindowPos3s; + if (glad_glWindowPos3sMESA == NULL && glad_glWindowPos3sARB != NULL) glad_glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glad_glWindowPos3sARB; + if (glad_glWindowPos3sv == NULL && glad_glWindowPos3svARB != NULL) glad_glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glad_glWindowPos3svARB; + if (glad_glWindowPos3sv == NULL && glad_glWindowPos3svMESA != NULL) glad_glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glad_glWindowPos3svMESA; + if (glad_glWindowPos3svARB == NULL && glad_glWindowPos3sv != NULL) glad_glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glad_glWindowPos3sv; + if (glad_glWindowPos3svARB == NULL && glad_glWindowPos3svMESA != NULL) glad_glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glad_glWindowPos3svMESA; + if (glad_glWindowPos3svMESA == NULL && glad_glWindowPos3sv != NULL) glad_glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glad_glWindowPos3sv; + if (glad_glWindowPos3svMESA == NULL && glad_glWindowPos3svARB != NULL) glad_glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glad_glWindowPos3svARB; +} + +static void glad_gl_free_extensions(char **exts_i) { + if (exts_i != NULL) { + unsigned int index; + for(index = 0; exts_i[index]; index++) { + free((void *) (exts_i[index])); + } + free((void *)exts_i); + exts_i = NULL; + } +} +static int glad_gl_get_extensions( const char **out_exts, char ***out_exts_i) { +#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) + if (glad_glGetStringi != NULL && glad_glGetIntegerv != NULL) { + unsigned int index = 0; + unsigned int num_exts_i = 0; + char **exts_i = NULL; + glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i); + exts_i = (char **) malloc((num_exts_i + 1) * (sizeof *exts_i)); + if (exts_i == NULL) { + return 0; + } + for(index = 0; index < num_exts_i; index++) { + const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index); + size_t len = strlen(gl_str_tmp) + 1; + + char *local_str = (char*) malloc(len * sizeof(char)); + if(local_str == NULL) { + exts_i[index] = NULL; + glad_gl_free_extensions(exts_i); + return 0; + } + + memcpy(local_str, gl_str_tmp, len * sizeof(char)); + exts_i[index] = local_str; + } + exts_i[index] = NULL; + + *out_exts_i = exts_i; + + return 1; + } +#else + GLAD_UNUSED(out_exts_i); +#endif + if (glad_glGetString == NULL) { + return 0; + } + *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS); + return 1; +} +static int glad_gl_has_extension(const char *exts, char **exts_i, const char *ext) { + if(exts_i) { + unsigned int index; + for(index = 0; exts_i[index]; index++) { + const char *e = exts_i[index]; + if(strcmp(e, ext) == 0) { + return 1; + } + } + } else { + const char *extensions; + const char *loc; + const char *terminator; + extensions = exts; + if(extensions == NULL || ext == NULL) { + return 0; + } + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return 0; + } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } + } + return 0; +} + +static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) { + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_gl_find_extensions_gl(void) { + const char *exts = NULL; + char **exts_i = NULL; + if (!glad_gl_get_extensions(&exts, &exts_i)) return 0; + + GLAD_GL_APPLE_flush_buffer_range = glad_gl_has_extension(exts, exts_i, "GL_APPLE_flush_buffer_range"); + GLAD_GL_APPLE_vertex_array_object = glad_gl_has_extension(exts, exts_i, "GL_APPLE_vertex_array_object"); + GLAD_GL_ARB_blend_func_extended = glad_gl_has_extension(exts, exts_i, "GL_ARB_blend_func_extended"); + GLAD_GL_ARB_color_buffer_float = glad_gl_has_extension(exts, exts_i, "GL_ARB_color_buffer_float"); + GLAD_GL_ARB_copy_buffer = glad_gl_has_extension(exts, exts_i, "GL_ARB_copy_buffer"); + GLAD_GL_ARB_draw_buffers = glad_gl_has_extension(exts, exts_i, "GL_ARB_draw_buffers"); + GLAD_GL_ARB_draw_elements_base_vertex = glad_gl_has_extension(exts, exts_i, "GL_ARB_draw_elements_base_vertex"); + GLAD_GL_ARB_draw_instanced = glad_gl_has_extension(exts, exts_i, "GL_ARB_draw_instanced"); + GLAD_GL_ARB_framebuffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_framebuffer_object"); + GLAD_GL_ARB_geometry_shader4 = glad_gl_has_extension(exts, exts_i, "GL_ARB_geometry_shader4"); + GLAD_GL_ARB_imaging = glad_gl_has_extension(exts, exts_i, "GL_ARB_imaging"); + GLAD_GL_ARB_instanced_arrays = glad_gl_has_extension(exts, exts_i, "GL_ARB_instanced_arrays"); + GLAD_GL_ARB_map_buffer_range = glad_gl_has_extension(exts, exts_i, "GL_ARB_map_buffer_range"); + GLAD_GL_ARB_multisample = glad_gl_has_extension(exts, exts_i, "GL_ARB_multisample"); + GLAD_GL_ARB_multitexture = glad_gl_has_extension(exts, exts_i, "GL_ARB_multitexture"); + GLAD_GL_ARB_occlusion_query = glad_gl_has_extension(exts, exts_i, "GL_ARB_occlusion_query"); + GLAD_GL_ARB_point_parameters = glad_gl_has_extension(exts, exts_i, "GL_ARB_point_parameters"); + GLAD_GL_ARB_provoking_vertex = glad_gl_has_extension(exts, exts_i, "GL_ARB_provoking_vertex"); + GLAD_GL_ARB_sampler_objects = glad_gl_has_extension(exts, exts_i, "GL_ARB_sampler_objects"); + GLAD_GL_ARB_shader_objects = glad_gl_has_extension(exts, exts_i, "GL_ARB_shader_objects"); + GLAD_GL_ARB_sync = glad_gl_has_extension(exts, exts_i, "GL_ARB_sync"); + GLAD_GL_ARB_texture_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_buffer_object"); + GLAD_GL_ARB_texture_compression = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_compression"); + GLAD_GL_ARB_texture_multisample = glad_gl_has_extension(exts, exts_i, "GL_ARB_texture_multisample"); + GLAD_GL_ARB_timer_query = glad_gl_has_extension(exts, exts_i, "GL_ARB_timer_query"); + GLAD_GL_ARB_transpose_matrix = glad_gl_has_extension(exts, exts_i, "GL_ARB_transpose_matrix"); + GLAD_GL_ARB_uniform_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_uniform_buffer_object"); + GLAD_GL_ARB_vertex_array_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_array_object"); + GLAD_GL_ARB_vertex_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_buffer_object"); + GLAD_GL_ARB_vertex_program = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_program"); + GLAD_GL_ARB_vertex_shader = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_shader"); + GLAD_GL_ARB_vertex_type_2_10_10_10_rev = glad_gl_has_extension(exts, exts_i, "GL_ARB_vertex_type_2_10_10_10_rev"); + GLAD_GL_ARB_window_pos = glad_gl_has_extension(exts, exts_i, "GL_ARB_window_pos"); + GLAD_GL_ATI_draw_buffers = glad_gl_has_extension(exts, exts_i, "GL_ATI_draw_buffers"); + GLAD_GL_ATI_separate_stencil = glad_gl_has_extension(exts, exts_i, "GL_ATI_separate_stencil"); + GLAD_GL_EXT_blend_color = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_color"); + GLAD_GL_EXT_blend_equation_separate = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_equation_separate"); + GLAD_GL_EXT_blend_func_separate = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_func_separate"); + GLAD_GL_EXT_blend_minmax = glad_gl_has_extension(exts, exts_i, "GL_EXT_blend_minmax"); + GLAD_GL_EXT_copy_texture = glad_gl_has_extension(exts, exts_i, "GL_EXT_copy_texture"); + GLAD_GL_EXT_direct_state_access = glad_gl_has_extension(exts, exts_i, "GL_EXT_direct_state_access"); + GLAD_GL_EXT_draw_buffers2 = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_buffers2"); + GLAD_GL_EXT_draw_instanced = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_instanced"); + GLAD_GL_EXT_draw_range_elements = glad_gl_has_extension(exts, exts_i, "GL_EXT_draw_range_elements"); + GLAD_GL_EXT_fog_coord = glad_gl_has_extension(exts, exts_i, "GL_EXT_fog_coord"); + GLAD_GL_EXT_framebuffer_blit = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_blit"); + GLAD_GL_EXT_framebuffer_multisample = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_multisample"); + GLAD_GL_EXT_framebuffer_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_framebuffer_object"); + GLAD_GL_EXT_gpu_shader4 = glad_gl_has_extension(exts, exts_i, "GL_EXT_gpu_shader4"); + GLAD_GL_EXT_multi_draw_arrays = glad_gl_has_extension(exts, exts_i, "GL_EXT_multi_draw_arrays"); + GLAD_GL_EXT_point_parameters = glad_gl_has_extension(exts, exts_i, "GL_EXT_point_parameters"); + GLAD_GL_EXT_provoking_vertex = glad_gl_has_extension(exts, exts_i, "GL_EXT_provoking_vertex"); + GLAD_GL_EXT_secondary_color = glad_gl_has_extension(exts, exts_i, "GL_EXT_secondary_color"); + GLAD_GL_EXT_subtexture = glad_gl_has_extension(exts, exts_i, "GL_EXT_subtexture"); + GLAD_GL_EXT_texture3D = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture3D"); + GLAD_GL_EXT_texture_array = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_array"); + GLAD_GL_EXT_texture_buffer_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_buffer_object"); + GLAD_GL_EXT_texture_integer = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_integer"); + GLAD_GL_EXT_texture_object = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_object"); + GLAD_GL_EXT_texture_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_storage"); + GLAD_GL_EXT_timer_query = glad_gl_has_extension(exts, exts_i, "GL_EXT_timer_query"); + GLAD_GL_EXT_transform_feedback = glad_gl_has_extension(exts, exts_i, "GL_EXT_transform_feedback"); + GLAD_GL_EXT_vertex_array = glad_gl_has_extension(exts, exts_i, "GL_EXT_vertex_array"); + GLAD_GL_INGR_blend_func_separate = glad_gl_has_extension(exts, exts_i, "GL_INGR_blend_func_separate"); + GLAD_GL_KHR_debug = glad_gl_has_extension(exts, exts_i, "GL_KHR_debug"); + GLAD_GL_MESA_window_pos = glad_gl_has_extension(exts, exts_i, "GL_MESA_window_pos"); + GLAD_GL_NVX_conditional_render = glad_gl_has_extension(exts, exts_i, "GL_NVX_conditional_render"); + GLAD_GL_NV_conditional_render = glad_gl_has_extension(exts, exts_i, "GL_NV_conditional_render"); + GLAD_GL_NV_explicit_multisample = glad_gl_has_extension(exts, exts_i, "GL_NV_explicit_multisample"); + GLAD_GL_NV_geometry_program4 = glad_gl_has_extension(exts, exts_i, "GL_NV_geometry_program4"); + GLAD_GL_NV_point_sprite = glad_gl_has_extension(exts, exts_i, "GL_NV_point_sprite"); + GLAD_GL_NV_transform_feedback = glad_gl_has_extension(exts, exts_i, "GL_NV_transform_feedback"); + GLAD_GL_NV_vertex_program = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_program"); + GLAD_GL_NV_vertex_program4 = glad_gl_has_extension(exts, exts_i, "GL_NV_vertex_program4"); + GLAD_GL_SGIS_point_parameters = glad_gl_has_extension(exts, exts_i, "GL_SGIS_point_parameters"); + + glad_gl_free_extensions(exts_i); + + return 1; +} + +static int glad_gl_find_core_gl(void) { + int i; + const char* version; + const char* prefixes[] = { + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + "OpenGL SC ", + NULL + }; + int major = 0; + int minor = 0; + version = (const char*) glad_glGetString(GL_VERSION); + if (!version) return 0; + for (i = 0; prefixes[i]; i++) { + const size_t length = strlen(prefixes[i]); + if (strncmp(version, prefixes[i], length) == 0) { + version += length; + break; + } + } + + GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); + + GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; + GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; + GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; + GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; + GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; + GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; + GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; + + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) { + int version; + + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + if(glad_glGetString == NULL) return 0; + version = glad_gl_find_core_gl(); + + glad_gl_load_GL_VERSION_1_0(load, userptr); + glad_gl_load_GL_VERSION_1_1(load, userptr); + glad_gl_load_GL_VERSION_1_2(load, userptr); + glad_gl_load_GL_VERSION_1_3(load, userptr); + glad_gl_load_GL_VERSION_1_4(load, userptr); + glad_gl_load_GL_VERSION_1_5(load, userptr); + glad_gl_load_GL_VERSION_2_0(load, userptr); + glad_gl_load_GL_VERSION_2_1(load, userptr); + glad_gl_load_GL_VERSION_3_0(load, userptr); + glad_gl_load_GL_VERSION_3_1(load, userptr); + glad_gl_load_GL_VERSION_3_2(load, userptr); + glad_gl_load_GL_VERSION_3_3(load, userptr); + + if (!glad_gl_find_extensions_gl()) return 0; + glad_gl_load_GL_APPLE_flush_buffer_range(load, userptr); + glad_gl_load_GL_APPLE_vertex_array_object(load, userptr); + glad_gl_load_GL_ARB_blend_func_extended(load, userptr); + glad_gl_load_GL_ARB_color_buffer_float(load, userptr); + glad_gl_load_GL_ARB_copy_buffer(load, userptr); + glad_gl_load_GL_ARB_draw_buffers(load, userptr); + glad_gl_load_GL_ARB_draw_elements_base_vertex(load, userptr); + glad_gl_load_GL_ARB_draw_instanced(load, userptr); + glad_gl_load_GL_ARB_framebuffer_object(load, userptr); + glad_gl_load_GL_ARB_geometry_shader4(load, userptr); + glad_gl_load_GL_ARB_imaging(load, userptr); + glad_gl_load_GL_ARB_instanced_arrays(load, userptr); + glad_gl_load_GL_ARB_map_buffer_range(load, userptr); + glad_gl_load_GL_ARB_multisample(load, userptr); + glad_gl_load_GL_ARB_multitexture(load, userptr); + glad_gl_load_GL_ARB_occlusion_query(load, userptr); + glad_gl_load_GL_ARB_point_parameters(load, userptr); + glad_gl_load_GL_ARB_provoking_vertex(load, userptr); + glad_gl_load_GL_ARB_sampler_objects(load, userptr); + glad_gl_load_GL_ARB_shader_objects(load, userptr); + glad_gl_load_GL_ARB_sync(load, userptr); + glad_gl_load_GL_ARB_texture_buffer_object(load, userptr); + glad_gl_load_GL_ARB_texture_compression(load, userptr); + glad_gl_load_GL_ARB_texture_multisample(load, userptr); + glad_gl_load_GL_ARB_timer_query(load, userptr); + glad_gl_load_GL_ARB_transpose_matrix(load, userptr); + glad_gl_load_GL_ARB_uniform_buffer_object(load, userptr); + glad_gl_load_GL_ARB_vertex_array_object(load, userptr); + glad_gl_load_GL_ARB_vertex_buffer_object(load, userptr); + glad_gl_load_GL_ARB_vertex_program(load, userptr); + glad_gl_load_GL_ARB_vertex_shader(load, userptr); + glad_gl_load_GL_ARB_vertex_type_2_10_10_10_rev(load, userptr); + glad_gl_load_GL_ARB_window_pos(load, userptr); + glad_gl_load_GL_ATI_draw_buffers(load, userptr); + glad_gl_load_GL_ATI_separate_stencil(load, userptr); + glad_gl_load_GL_EXT_blend_color(load, userptr); + glad_gl_load_GL_EXT_blend_equation_separate(load, userptr); + glad_gl_load_GL_EXT_blend_func_separate(load, userptr); + glad_gl_load_GL_EXT_blend_minmax(load, userptr); + glad_gl_load_GL_EXT_copy_texture(load, userptr); + glad_gl_load_GL_EXT_direct_state_access(load, userptr); + glad_gl_load_GL_EXT_draw_buffers2(load, userptr); + glad_gl_load_GL_EXT_draw_instanced(load, userptr); + glad_gl_load_GL_EXT_draw_range_elements(load, userptr); + glad_gl_load_GL_EXT_fog_coord(load, userptr); + glad_gl_load_GL_EXT_framebuffer_blit(load, userptr); + glad_gl_load_GL_EXT_framebuffer_multisample(load, userptr); + glad_gl_load_GL_EXT_framebuffer_object(load, userptr); + glad_gl_load_GL_EXT_gpu_shader4(load, userptr); + glad_gl_load_GL_EXT_multi_draw_arrays(load, userptr); + glad_gl_load_GL_EXT_point_parameters(load, userptr); + glad_gl_load_GL_EXT_provoking_vertex(load, userptr); + glad_gl_load_GL_EXT_secondary_color(load, userptr); + glad_gl_load_GL_EXT_subtexture(load, userptr); + glad_gl_load_GL_EXT_texture3D(load, userptr); + glad_gl_load_GL_EXT_texture_array(load, userptr); + glad_gl_load_GL_EXT_texture_buffer_object(load, userptr); + glad_gl_load_GL_EXT_texture_integer(load, userptr); + glad_gl_load_GL_EXT_texture_object(load, userptr); + glad_gl_load_GL_EXT_texture_storage(load, userptr); + glad_gl_load_GL_EXT_timer_query(load, userptr); + glad_gl_load_GL_EXT_transform_feedback(load, userptr); + glad_gl_load_GL_EXT_vertex_array(load, userptr); + glad_gl_load_GL_INGR_blend_func_separate(load, userptr); + glad_gl_load_GL_KHR_debug(load, userptr); + glad_gl_load_GL_MESA_window_pos(load, userptr); + glad_gl_load_GL_NVX_conditional_render(load, userptr); + glad_gl_load_GL_NV_conditional_render(load, userptr); + glad_gl_load_GL_NV_explicit_multisample(load, userptr); + glad_gl_load_GL_NV_geometry_program4(load, userptr); + glad_gl_load_GL_NV_point_sprite(load, userptr); + glad_gl_load_GL_NV_transform_feedback(load, userptr); + glad_gl_load_GL_NV_vertex_program(load, userptr); + glad_gl_load_GL_NV_vertex_program4(load, userptr); + glad_gl_load_GL_SGIS_point_parameters(load, userptr); + + + glad_gl_resolve_aliases(); + + return version; +} + + +int gladLoadGL( GLADloadfunc load) { + return gladLoadGLUserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + + + + +#ifdef __cplusplus +} +#endif + +#endif /*LV_USE_OPENGLES*/ diff --git a/inc/lvgl/src/drivers/opengles/glad/src/gles2.c b/inc/lvgl/src/drivers/opengles/glad/src/gles2.c new file mode 100644 index 0000000..f98de04 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/glad/src/gles2.c @@ -0,0 +1,559 @@ +/** + * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 + */ + +#include "../../lv_opengles_private.h" + +#if LV_USE_EGL + +#include +#include +#include +#include "../include/glad/gles2.h" + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + +#ifdef __cplusplus +extern "C" { +#endif + + + +int GLAD_GL_ES_VERSION_2_0 = 0; +int GLAD_GL_APPLE_texture_max_level = 0; +int GLAD_GL_ARM_rgba8 = 0; +int GLAD_GL_EXT_color_buffer_float = 0; +int GLAD_GL_EXT_color_buffer_half_float = 0; +int GLAD_GL_EXT_texture_format_BGRA8888 = 0; +int GLAD_GL_EXT_texture_storage = 0; +int GLAD_GL_EXT_unpack_subimage = 0; +int GLAD_GL_OES_depth24 = 0; +int GLAD_GL_OES_mapbuffer = 0; +int GLAD_GL_OES_rgb8_rgba8 = 0; +int GLAD_GL_OES_texture_float = 0; +int GLAD_GL_OES_texture_half_float = 0; +int GLAD_GL_OES_texture_storage_multisample_2d_array = 0; +int GLAD_GL_OES_vertex_array_object = 0; + + + +PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; +PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; +PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; +PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; +PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; +PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; +PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; +PFNGLBINDVERTEXARRAYOESPROC glad_glBindVertexArrayOES = NULL; +PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; +PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; +PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; +PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; +PFNGLBUFFERDATAPROC glad_glBufferData = NULL; +PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; +PFNGLCLEARPROC glad_glClear = NULL; +PFNGLCLEARCOLORPROC glad_glClearColor = NULL; +PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL; +PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; +PFNGLCOLORMASKPROC glad_glColorMask = NULL; +PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; +PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; +PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; +PFNGLCREATESHADERPROC glad_glCreateShader = NULL; +PFNGLCULLFACEPROC glad_glCullFace = NULL; +PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; +PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; +PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; +PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; +PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; +PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; +PFNGLDELETEVERTEXARRAYSOESPROC glad_glDeleteVertexArraysOES = NULL; +PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; +PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; +PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL; +PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; +PFNGLDISABLEPROC glad_glDisable = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; +PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; +PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; +PFNGLENABLEPROC glad_glEnable = NULL; +PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; +PFNGLFINISHPROC glad_glFinish = NULL; +PFNGLFLUSHPROC glad_glFlush = NULL; +PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; +PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; +PFNGLFRONTFACEPROC glad_glFrontFace = NULL; +PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; +PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; +PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; +PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; +PFNGLGENVERTEXARRAYSOESPROC glad_glGenVertexArraysOES = NULL; +PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; +PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; +PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; +PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; +PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; +PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; +PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; +PFNGLGETBUFFERPOINTERVOESPROC glad_glGetBufferPointervOES = NULL; +PFNGLGETERRORPROC glad_glGetError = NULL; +PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; +PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; +PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; +PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; +PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat = NULL; +PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; +PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; +PFNGLGETSTRINGPROC glad_glGetString = NULL; +PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; +PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; +PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; +PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; +PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; +PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; +PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; +PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; +PFNGLHINTPROC glad_glHint = NULL; +PFNGLISBUFFERPROC glad_glIsBuffer = NULL; +PFNGLISENABLEDPROC glad_glIsEnabled = NULL; +PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; +PFNGLISPROGRAMPROC glad_glIsProgram = NULL; +PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; +PFNGLISSHADERPROC glad_glIsShader = NULL; +PFNGLISTEXTUREPROC glad_glIsTexture = NULL; +PFNGLISVERTEXARRAYOESPROC glad_glIsVertexArrayOES = NULL; +PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; +PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; +PFNGLMAPBUFFEROESPROC glad_glMapBufferOES = NULL; +PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; +PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; +PFNGLREADPIXELSPROC glad_glReadPixels = NULL; +PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler = NULL; +PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; +PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; +PFNGLSCISSORPROC glad_glScissor = NULL; +PFNGLSHADERBINARYPROC glad_glShaderBinary = NULL; +PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; +PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; +PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; +PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; +PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; +PFNGLSTENCILOPPROC glad_glStencilOp = NULL; +PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; +PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; +PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; +PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; +PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; +PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; +PFNGLTEXSTORAGE1DEXTPROC glad_glTexStorage1DEXT = NULL; +PFNGLTEXSTORAGE2DEXTPROC glad_glTexStorage2DEXT = NULL; +PFNGLTEXSTORAGE3DEXTPROC glad_glTexStorage3DEXT = NULL; +PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC glad_glTexStorage3DMultisampleOES = NULL; +PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; +PFNGLTEXTURESTORAGE1DEXTPROC glad_glTextureStorage1DEXT = NULL; +PFNGLTEXTURESTORAGE2DEXTPROC glad_glTextureStorage2DEXT = NULL; +PFNGLTEXTURESTORAGE3DEXTPROC glad_glTextureStorage3DEXT = NULL; +PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; +PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; +PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; +PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; +PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; +PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; +PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; +PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; +PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; +PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; +PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; +PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; +PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; +PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; +PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; +PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; +PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; +PFNGLUNMAPBUFFEROESPROC glad_glUnmapBufferOES = NULL; +PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; +PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; +PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; +PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; +PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; +PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; +PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; +PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; +PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; +PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; +PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; +PFNGLVIEWPORTPROC glad_glViewport = NULL; + + +static void glad_gl_load_GL_ES_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_ES_VERSION_2_0) return; + glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); + glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); + glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); + glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); + glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); + glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); + glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); + glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); + glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); + glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); + glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); + glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); + glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); + glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); + glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); + glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); + glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); + glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); + glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); + glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); + glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); + glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); + glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); + glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); + glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); + glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); + glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram"); + glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader"); + glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); + glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); + glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); + glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); + glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); + glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); + glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); + glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); + glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); + glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); + glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); + glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); + glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); + glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); + glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); + glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); + glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); + glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders"); + glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); + glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); + glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); + glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); + glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); + glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); + glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog"); + glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv"); + glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog"); + glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat"); + glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); + glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv"); + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); + glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); + glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); + glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); + glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); + glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); + glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); + glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); + glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram"); + glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader"); + glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); + glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); + glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); + glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei"); + glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset"); + glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels"); + glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler"); + glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage"); + glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor"); + glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary"); + glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); + glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc"); + glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate"); + glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask"); + glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate"); + glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp"); + glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate"); + glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D"); + glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf"); + glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv"); + glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri"); + glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv"); + glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); + glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); + glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); + glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); + glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); + glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); + glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); + glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); + glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); + glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); + glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); + glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); + glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); + glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); + glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); + glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); + glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); + glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); + glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); + glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); + glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); + glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); + glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); + glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport"); +} +static void glad_gl_load_GL_EXT_texture_storage( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_EXT_texture_storage) return; + glad_glTexStorage1DEXT = (PFNGLTEXSTORAGE1DEXTPROC) load(userptr, "glTexStorage1DEXT"); + glad_glTexStorage2DEXT = (PFNGLTEXSTORAGE2DEXTPROC) load(userptr, "glTexStorage2DEXT"); + glad_glTexStorage3DEXT = (PFNGLTEXSTORAGE3DEXTPROC) load(userptr, "glTexStorage3DEXT"); + glad_glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC) load(userptr, "glTextureStorage1DEXT"); + glad_glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC) load(userptr, "glTextureStorage2DEXT"); + glad_glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC) load(userptr, "glTextureStorage3DEXT"); +} +static void glad_gl_load_GL_OES_mapbuffer( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_mapbuffer) return; + glad_glGetBufferPointervOES = (PFNGLGETBUFFERPOINTERVOESPROC) load(userptr, "glGetBufferPointervOES"); + glad_glMapBufferOES = (PFNGLMAPBUFFEROESPROC) load(userptr, "glMapBufferOES"); + glad_glUnmapBufferOES = (PFNGLUNMAPBUFFEROESPROC) load(userptr, "glUnmapBufferOES"); +} +static void glad_gl_load_GL_OES_texture_storage_multisample_2d_array( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_texture_storage_multisample_2d_array) return; + glad_glTexStorage3DMultisampleOES = (PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC) load(userptr, "glTexStorage3DMultisampleOES"); +} +static void glad_gl_load_GL_OES_vertex_array_object( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GL_OES_vertex_array_object) return; + glad_glBindVertexArrayOES = (PFNGLBINDVERTEXARRAYOESPROC) load(userptr, "glBindVertexArrayOES"); + glad_glDeleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOESPROC) load(userptr, "glDeleteVertexArraysOES"); + glad_glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOESPROC) load(userptr, "glGenVertexArraysOES"); + glad_glIsVertexArrayOES = (PFNGLISVERTEXARRAYOESPROC) load(userptr, "glIsVertexArrayOES"); +} + + +static void glad_gl_resolve_aliases(void) { +} + +static void glad_gl_free_extensions(char **exts_i) { + if (exts_i != NULL) { + unsigned int index; + for(index = 0; exts_i[index]; index++) { + free((void *) (exts_i[index])); + } + free((void *)exts_i); + exts_i = NULL; + } +} +static int glad_gl_get_extensions( const char **out_exts, char ***out_exts_i) { +#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) + if (glad_glGetStringi != NULL && glad_glGetIntegerv != NULL) { + unsigned int index = 0; + unsigned int num_exts_i = 0; + char **exts_i = NULL; + glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i); + exts_i = (char **) malloc((num_exts_i + 1) * (sizeof *exts_i)); + if (exts_i == NULL) { + return 0; + } + for(index = 0; index < num_exts_i; index++) { + const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index); + size_t len = strlen(gl_str_tmp) + 1; + + char *local_str = (char*) malloc(len * sizeof(char)); + if(local_str == NULL) { + exts_i[index] = NULL; + glad_gl_free_extensions(exts_i); + return 0; + } + + memcpy(local_str, gl_str_tmp, len * sizeof(char)); + exts_i[index] = local_str; + } + exts_i[index] = NULL; + + *out_exts_i = exts_i; + + return 1; + } +#else + GLAD_UNUSED(out_exts_i); +#endif + if (glad_glGetString == NULL) { + return 0; + } + *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS); + return 1; +} +static int glad_gl_has_extension(const char *exts, char **exts_i, const char *ext) { + if(exts_i) { + unsigned int index; + for(index = 0; exts_i[index]; index++) { + const char *e = exts_i[index]; + if(strcmp(e, ext) == 0) { + return 1; + } + } + } else { + const char *extensions; + const char *loc; + const char *terminator; + extensions = exts; + if(extensions == NULL || ext == NULL) { + return 0; + } + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return 0; + } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } + } + return 0; +} + +static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) { + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_gl_find_extensions_gles2(void) { + const char *exts = NULL; + char **exts_i = NULL; + if (!glad_gl_get_extensions(&exts, &exts_i)) return 0; + + GLAD_GL_APPLE_texture_max_level = glad_gl_has_extension(exts, exts_i, "GL_APPLE_texture_max_level"); + GLAD_GL_ARM_rgba8 = glad_gl_has_extension(exts, exts_i, "GL_ARM_rgba8"); + GLAD_GL_EXT_color_buffer_float = glad_gl_has_extension(exts, exts_i, "GL_EXT_color_buffer_float"); + GLAD_GL_EXT_color_buffer_half_float = glad_gl_has_extension(exts, exts_i, "GL_EXT_color_buffer_half_float"); + GLAD_GL_EXT_texture_format_BGRA8888 = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_format_BGRA8888"); + GLAD_GL_EXT_texture_storage = glad_gl_has_extension(exts, exts_i, "GL_EXT_texture_storage"); + GLAD_GL_EXT_unpack_subimage = glad_gl_has_extension(exts, exts_i, "GL_EXT_unpack_subimage"); + GLAD_GL_OES_depth24 = glad_gl_has_extension(exts, exts_i, "GL_OES_depth24"); + GLAD_GL_OES_mapbuffer = glad_gl_has_extension(exts, exts_i, "GL_OES_mapbuffer"); + GLAD_GL_OES_rgb8_rgba8 = glad_gl_has_extension(exts, exts_i, "GL_OES_rgb8_rgba8"); + GLAD_GL_OES_texture_float = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_float"); + GLAD_GL_OES_texture_half_float = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_half_float"); + GLAD_GL_OES_texture_storage_multisample_2d_array = glad_gl_has_extension(exts, exts_i, "GL_OES_texture_storage_multisample_2d_array"); + GLAD_GL_OES_vertex_array_object = glad_gl_has_extension(exts, exts_i, "GL_OES_vertex_array_object"); + + glad_gl_free_extensions(exts_i); + + return 1; +} + +static int glad_gl_find_core_gles2(void) { + int i; + const char* version; + const char* prefixes[] = { + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + "OpenGL SC ", + NULL + }; + int major = 0; + int minor = 0; + version = (const char*) glad_glGetString(GL_VERSION); + if (!version) return 0; + for (i = 0; prefixes[i]; i++) { + const size_t length = strlen(prefixes[i]); + if (strncmp(version, prefixes[i], length) == 0) { + version += length; + break; + } + } + + GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); + + GLAD_GL_ES_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; + + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadGLES2UserPtr( GLADuserptrloadfunc load, void *userptr) { + int version; + + glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + if(glad_glGetString == NULL) return 0; + version = glad_gl_find_core_gles2(); + + glad_gl_load_GL_ES_VERSION_2_0(load, userptr); + + if (!glad_gl_find_extensions_gles2()) return 0; + glad_gl_load_GL_EXT_texture_storage(load, userptr); + glad_gl_load_GL_OES_mapbuffer(load, userptr); + glad_gl_load_GL_OES_texture_storage_multisample_2d_array(load, userptr); + glad_gl_load_GL_OES_vertex_array_object(load, userptr); + + + glad_gl_resolve_aliases(); + + return version; +} + + +int gladLoadGLES2( GLADloadfunc load) { + return gladLoadGLES2UserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + + + + +#ifdef __cplusplus +} +#endif + +#endif /*LV_USE_EGL*/ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_debug.c b/inc/lvgl/src/drivers/opengles/lv_opengles_debug.c new file mode 100644 index 0000000..d0a6844 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_debug.c @@ -0,0 +1,60 @@ +/** + * @file lv_opengles_debug.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_opengles_debug.h" +#if LV_USE_OPENGLES + +#include "lv_opengles_private.h" + +#include "../../misc/lv_log.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if LV_USE_OPENGLES_DEBUG +void GLClearError(void) +{ + while(glGetError() != GL_NO_ERROR); +} + +void GLLogCall(const char * function, const char * file, int line) +{ + GLenum error; + while((error = glGetError()) != GL_NO_ERROR) { + LV_LOG_ERROR("[OpenGL Error] (%d) %s %s:%d", error, function, file, line); + } +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /* LV_USE_OPENGLES */ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_debug.h b/inc/lvgl/src/drivers/opengles/lv_opengles_debug.h new file mode 100644 index 0000000..3e26302 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_debug.h @@ -0,0 +1,60 @@ +/** + * @file lv_opengles_debug.h + * + */ + +#ifndef LV_OPENGLES_DEBUG_H +#define LV_OPENGLES_DEBUG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_OPENGLES + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_USE_OPENGLES_DEBUG + +void GLClearError(void); + +void GLLogCall(const char * function, const char * file, int line); + +#endif + +/********************** + * MACROS + **********************/ + +#if LV_USE_OPENGLES_DEBUG +#define GL_CALL(x) do {\ + GLClearError();\ + x;\ + GLLogCall(#x, __FILE__, __LINE__);\ + } while(0) +#else +#define GL_CALL(x) x +#endif + +#endif /* LV_USE_OPENGLES */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_OPENGLES_DEBUG_H */ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_driver.c b/inc/lvgl/src/drivers/opengles/lv_opengles_driver.c new file mode 100644 index 0000000..308edce --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_driver.c @@ -0,0 +1,765 @@ +/** + * @file lv_opengles_driver.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_opengles_driver.h" +#if LV_USE_OPENGLES + +#include "../../misc/lv_types.h" +#include "../../misc/lv_profiler.h" +#include "../../misc/lv_matrix.h" +#include "lv_opengles_debug.h" +#include "lv_opengles_private.h" + +#include "../../display/lv_display_private.h" +#include "../../draw/nanovg/lv_draw_nanovg.h" +#include "../../misc/lv_area_private.h" +#include "opengl_shader/lv_opengl_shader_internal.h" +#include "assets/lv_opengles_shader.h" + +/********************* + * DEFINES + *********************/ + +#define LV_OPENGLES_VERTEX_BUFFER_LEN 16 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_opengles_enable_blending(bool blend_opt); +static void lv_opengles_disable_blending(void); +static void lv_opengles_vertex_buffer_init(const void * data, unsigned int size); +static void lv_opengles_vertex_buffer_deinit(void); +static void lv_opengles_vertex_buffer_bind(void); +static void lv_opengles_vertex_buffer_unbind(void); +static void lv_opengles_vertex_array_init(void); +static void lv_opengles_vertex_array_deinit(void); +static void lv_opengles_vertex_array_bind(void); +static void lv_opengles_vertex_array_unbind(void); +static void lv_opengles_vertex_array_add_buffer(void); +static void lv_opengles_index_buffer_init(const unsigned int * data, unsigned int count); +static void lv_opengles_index_buffer_deinit(void); +static unsigned int lv_opengles_index_buffer_get_count(void); +static void lv_opengles_index_buffer_bind(void); +static void lv_opengles_index_buffer_unbind(void); +static unsigned int lv_opengles_shader_manager_init(void); +static lv_result_t lv_opengles_shader_init(void); +static void lv_opengles_shader_deinit(void); +static void lv_opengles_shader_bind(void); +static void lv_opengles_shader_unbind(void); +static int lv_opengles_shader_get_uniform_location(const char * name); +static void lv_opengles_shader_set_uniform1i(const char * name, int value); +static void lv_opengles_shader_set_uniformmatrix3fv(const char * name, int count, const float * values); +static void lv_opengles_shader_set_uniform1f(const char * name, float value); +static void lv_opengles_shader_set_uniform3f(const char * name, float value_0, float value_1, float value_2); +static void lv_opengles_render_draw(void); +static float lv_opengles_map_float(float x, float min_in, float max_in, float min_out, float max_out); +static void populate_vertex_buffer(float vertex_buffer[LV_OPENGLES_VERTEX_BUFFER_LEN], + lv_display_rotation_t rotation, bool * h_flip, bool * v_flip, + float clip_x1, float clip_y1, float clip_x2, float clip_y2); + +/*********************** + * GLOBAL PROTOTYPES + ***********************/ + +/********************** + * STATIC VARIABLES + **********************/ +static bool is_init; + +static lv_opengl_shader_manager_t shader_manager; + +static unsigned int vertex_buffer_id = 0; + +static unsigned int vertex_array_id = 0; + +static unsigned int index_buffer_id = 0; +static unsigned int index_buffer_count = 0; + +static unsigned int shader_id; + +static const char * shader_names[] = { "u_Texture", "u_ColorDepth", "u_VertexTransform", "u_Opa", "u_IsFill", "u_FillColor", "u_SwapRB", "u_Hue", "u_Saturation", "u_Value" }; +static int shader_location[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_opengles_init(void) +{ + if(is_init) return; + + lv_opengles_enable_blending(false); + + unsigned int indices[] = { + 0, 1, 2, + 2, 3, 0 + }; + + lv_opengles_vertex_buffer_init(NULL, sizeof(float) * LV_OPENGLES_VERTEX_BUFFER_LEN); + + lv_opengles_vertex_array_init(); + lv_opengles_vertex_array_add_buffer(); + + lv_opengles_index_buffer_init(indices, 6); + + lv_result_t res = lv_opengles_shader_init(); + LV_ASSERT_MSG(res == LV_RESULT_OK, "Failed to initialize shaders"); + + lv_opengles_shader_bind(); + + /* unbind everything */ + lv_opengles_vertex_array_unbind(); + lv_opengles_vertex_buffer_unbind(); + lv_opengles_index_buffer_unbind(); + lv_opengles_shader_unbind(); + +#if LV_USE_DRAW_NANOVG + lv_draw_nanovg_init(); +#endif /*LV_USE_DRAW_NANOVG*/ + + is_init = true; +} + +void lv_opengles_deinit(void) +{ + if(!is_init) return; + + lv_opengles_shader_deinit(); + lv_opengles_index_buffer_deinit(); + lv_opengles_vertex_buffer_deinit(); + lv_opengles_vertex_array_deinit(); + + is_init = false; +} + +void lv_opengles_render_params_init(lv_opengles_render_params_t * params) +{ + LV_ASSERT_NULL(params); + lv_memzero(params, sizeof(lv_opengles_render_params_t)); +} + +void lv_opengles_render_texture(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa, int32_t disp_w, + int32_t disp_h, const lv_area_t * texture_clip_area, bool h_flip, bool v_flip) +{ + LV_PROFILER_DRAW_BEGIN; + lv_opengles_render_params_t params; + lv_opengles_render_params_init(¶ms); + params.texture = texture; + params.texture_area = texture_area; + params.opa = opa; + params.disp_w = disp_w; + params.disp_h = disp_h; + params.texture_clip_area = texture_clip_area; + params.h_flip = h_flip; + params.v_flip = v_flip; + lv_opengles_render(¶ms); + LV_PROFILER_DRAW_END; +} + +void lv_opengles_render_texture_rbswap(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa, + int32_t disp_w, + int32_t disp_h, const lv_area_t * texture_clip_area, bool h_flip, bool v_flip) +{ + LV_PROFILER_DRAW_BEGIN; + lv_opengles_render_params_t params; + lv_opengles_render_params_init(¶ms); + params.texture = texture; + params.texture_area = texture_area; + params.opa = opa; + params.disp_w = disp_w; + params.disp_h = disp_h; + params.texture_clip_area = texture_clip_area; + params.h_flip = h_flip; + params.v_flip = v_flip; + params.rb_swap = true; + lv_opengles_render(¶ms); + LV_PROFILER_DRAW_END; +} + +void lv_opengles_render_fill(lv_color_t color, const lv_area_t * area, lv_opa_t opa, int32_t disp_w, int32_t disp_h) +{ + LV_PROFILER_DRAW_BEGIN; + lv_opengles_render_params_t params; + lv_opengles_render_params_init(¶ms); + params.texture_area = area; + params.opa = opa; + params.disp_w = disp_w; + params.disp_h = disp_h; + params.texture_clip_area = area; + params.fill_color = color; + params.rb_swap = true; + lv_opengles_render(¶ms); + LV_PROFILER_DRAW_END; +} + +void lv_opengles_render_display(lv_display_t * display, const lv_opengles_render_params_t * params) +{ + LV_PROFILER_DRAW_BEGIN; + unsigned int texture = (lv_uintptr_t)display->layer_head->user_data; + GL_CALL(glActiveTexture(GL_TEXTURE0)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, texture)); + + lv_display_rotation_t rotation = lv_display_get_rotation(display); + bool h_flip = params->h_flip; + bool v_flip = params->v_flip; + + float vert_buffer[LV_OPENGLES_VERTEX_BUFFER_LEN]; + populate_vertex_buffer(vert_buffer, rotation, &h_flip, &v_flip, 0.f, 0.f, 1.f, 1.f); + lv_opengles_vertex_buffer_init(vert_buffer, sizeof(vert_buffer)); + + float hor_scale = 1.0f; + float ver_scale = 1.0f; + float hor_translate = 0.0f; + float ver_translate = 0.0f; + hor_scale = h_flip ? -hor_scale : hor_scale; + ver_scale = v_flip ? ver_scale : -ver_scale; + + const float transposed_matrix[9] = { + hor_scale, 0.0f, 0.0f, + 0.0f, ver_scale, 0.0f, + hor_translate, ver_translate, 1.0f + }; + + lv_opengles_shader_bind(); + lv_opengles_shader_set_uniform1f("u_ColorDepth", LV_COLOR_DEPTH); + lv_opengles_shader_set_uniform1i("u_Texture", 0); + lv_opengles_shader_set_uniformmatrix3fv("u_VertexTransform", 1, transposed_matrix); + lv_opengles_shader_set_uniform1f("u_Opa", 1); + lv_opengles_shader_set_uniform1i("u_IsFill", 0); + lv_opengles_shader_set_uniform3f("u_FillColor", 1.0f, 1.0f, 1.0f); + lv_opengles_shader_set_uniform1i("u_SwapRB", params->rb_swap); + + lv_opengles_render_draw(); + LV_PROFILER_DRAW_END; +} + +void lv_opengles_render_display_texture(lv_display_t * display, bool h_flip, bool v_flip) +{ + /*TODO: Deprecate this function and make lv_opengles_render_display public instead*/ + + lv_opengles_render_params_t params = { + .v_flip = v_flip, + .h_flip = h_flip, + .rb_swap = true + }; + lv_opengles_render_display(display, ¶ms); +} + +void lv_opengles_render_clear(void) +{ + LV_PROFILER_DRAW_BEGIN; + GL_CALL(glClear(GL_COLOR_BUFFER_BIT)); + LV_PROFILER_DRAW_END; +} + +void lv_opengles_viewport(int32_t x, int32_t y, int32_t w, int32_t h) +{ + LV_PROFILER_DRAW_BEGIN; + GL_CALL(glViewport(x, y, w, h)); + LV_PROFILER_DRAW_END; +} + +void lv_opengles_reinit_state(void) +{ + LV_PROFILER_DRAW_BEGIN; + + /* Rebind VAO, VBO, IBO to restore state after NanoVG or other external GL operations */ + lv_opengles_vertex_array_bind(); + lv_opengles_vertex_buffer_bind(); + lv_opengles_index_buffer_bind(); + + /* Re-setup vertex attributes since NanoVG may have modified them */ + for(unsigned int i = 0; i < 2; i++) { + GL_CALL(glEnableVertexAttribArray(i)); + GL_CALL(glVertexAttribPointer(i, 2, GL_FLOAT, GL_FALSE, 16, (const void *)(intptr_t)(i * 2 * 4))); + } + + LV_PROFILER_DRAW_END; +} + +void lv_opengles_render(const lv_opengles_render_params_t * params) +{ + LV_ASSERT_NULL(params); + LV_PROFILER_DRAW_BEGIN; + lv_area_t intersection; + if(!lv_area_intersect(&intersection, params->texture_area, params->texture_clip_area)) { + LV_PROFILER_DRAW_END; + return; + } + + GL_CALL(glActiveTexture(GL_TEXTURE0)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, params->texture)); + + bool is_turned = false; + if(params->matrix) { + is_turned = params->matrix->m[0][0] == 0.f; + } + float tex_w, tex_h, full_w, full_h, inter_w, inter_h; + full_w = (float)params->disp_w; + full_h = (float)params->disp_h; + if(is_turned) { + tex_w = (float)lv_area_get_height(&intersection); + tex_h = (float)lv_area_get_width(&intersection); + inter_w = (float)intersection.y1; + inter_h = (float)intersection.x1; + } + else { + tex_w = (float)lv_area_get_width(&intersection); + tex_h = (float)lv_area_get_height(&intersection); + inter_w = (float)intersection.x1; + inter_h = (float)intersection.y1; + } + + float hor_scale = tex_w / full_w; + float ver_scale = tex_h / full_h; + float hor_translate = inter_w / full_w * 2.0f - (1.0f - hor_scale); + float ver_translate = -(inter_h / full_h * 2.0f - (1.0f - ver_scale)); + hor_scale = params->h_flip ? -hor_scale : hor_scale; + ver_scale = params->v_flip ? ver_scale : -ver_scale; + + if(params->texture != 0) { + float clip_x1 = params->h_flip ? lv_opengles_map_float(params->texture_clip_area->x2, params->texture_area->x2, + params->texture_area->x1, 0.f, 1.f) + : lv_opengles_map_float(params->texture_clip_area->x1, params->texture_area->x1, params->texture_area->x2, 0.f, 1.f); + float clip_x2 = params->h_flip ? lv_opengles_map_float(params->texture_clip_area->x1, params->texture_area->x2, + params->texture_area->x1, 0.f, 1.f) + : lv_opengles_map_float(params->texture_clip_area->x2, params->texture_area->x1, params->texture_area->x2, 0.f, 1.f); + float clip_y1 = params->v_flip ? lv_opengles_map_float(params->texture_clip_area->y2, params->texture_area->y2, + params->texture_area->y1, 0.f, 1.f) + : lv_opengles_map_float(params->texture_clip_area->y1, params->texture_area->y1, params->texture_area->y2, 0.f, 1.f); + float clip_y2 = params->v_flip ? lv_opengles_map_float(params->texture_clip_area->y1, params->texture_area->y2, + params->texture_area->y1, 0.f, 1.f) + : lv_opengles_map_float(params->texture_clip_area->y2, params->texture_area->y1, params->texture_area->y2, 0.f, 1.f); + + const float positions[LV_OPENGLES_VERTEX_BUFFER_LEN] = { + -1.f, 1.0f, clip_x1, clip_y2, + 1.0f, 1.0f, clip_x2, clip_y2, + 1.0f, -1.0f, clip_x2, clip_y1, + -1.f, -1.0f, clip_x1, clip_y1 + }; + lv_opengles_vertex_buffer_init(positions, sizeof(positions)); + } + + lv_matrix_t matrix; + lv_matrix_identity(&matrix); + + if(params->matrix) { + if(is_turned) { + /* Display turned 90 or 270 */ + if(params->matrix->m[0][1] < 0.f) hor_translate = -hor_translate; + if(params->matrix->m[1][0] < 0.f) ver_translate = -ver_translate; + hor_scale = -hor_scale; + ver_scale = -ver_scale; + lv_matrix_translate(&matrix, hor_translate, ver_translate); + lv_matrix_scale(&matrix, hor_scale, ver_scale); + + lv_matrix_t adj_matrix; + lv_memcpy(&adj_matrix, params->matrix, sizeof(lv_matrix_t)); + adj_matrix.m[0][2] = 0.f; + adj_matrix.m[1][2] = 0.f; + lv_matrix_multiply(&matrix, &adj_matrix); + + } + else { + /* Display turned 0 or 180 */ + if(params->matrix->m[0][0] < -0.0001f) { + ver_scale = -ver_scale; + ver_translate = -ver_translate; + } + + if(params->matrix->m[1][1] < -0.0001f) { + hor_scale = -hor_scale; + hor_translate = -hor_translate; + } + + lv_matrix_translate(&matrix, hor_translate, ver_translate); + lv_matrix_scale(&matrix, hor_scale, ver_scale); + } + } + else { + lv_matrix_translate(&matrix, hor_translate, ver_translate); + lv_matrix_scale(&matrix, hor_scale, ver_scale); + } + + lv_matrix_t gl_matrix; + lv_matrix_transpose(&matrix, &gl_matrix); + + lv_opengles_shader_bind(); + lv_opengles_enable_blending(params->blend_opt); + lv_opengles_shader_set_uniform1f("u_ColorDepth", LV_COLOR_DEPTH); + lv_opengles_shader_set_uniform1i("u_Texture", 0); + lv_opengles_shader_set_uniformmatrix3fv("u_VertexTransform", 1, (float *)&gl_matrix); + lv_opengles_shader_set_uniform1f("u_Opa", (float)params->opa / (float)LV_OPA_100); + lv_opengles_shader_set_uniform1i("u_IsFill", params->texture == 0); + lv_opengles_shader_set_uniform3f("u_FillColor", (float)params->fill_color.red / 255.0f, + (float)params->fill_color.green / 255.0f, + (float)params->fill_color.blue / 255.0f); + lv_opengles_shader_set_uniform1i("u_SwapRB", params->rb_swap ? 1 : 0); + + lv_opengles_render_draw(); + lv_opengles_disable_blending(); + LV_PROFILER_DRAW_END; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_opengles_enable_blending(bool blend_opt) +{ + GL_CALL(glEnable(GL_BLEND)); + GL_CALL(glBlendFunc(blend_opt ? GL_SRC_ALPHA : GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); +} + +static void lv_opengles_disable_blending(void) +{ + GL_CALL(glDisable(GL_BLEND)); +} + +static void lv_opengles_vertex_buffer_init(const void * data, unsigned int size) +{ + if(vertex_buffer_id == 0) GL_CALL(glGenBuffers(1, &vertex_buffer_id)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id)); + GL_CALL(glBufferData(GL_ARRAY_BUFFER, size, data, GL_DYNAMIC_DRAW)); +} + +static void lv_opengles_vertex_buffer_deinit(void) +{ + if(vertex_buffer_id == 0) return; + GL_CALL(glDeleteBuffers(1, &vertex_buffer_id)); + vertex_buffer_id = 0; +} + +static void lv_opengles_vertex_buffer_bind(void) +{ + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_id)); +} + +static void lv_opengles_vertex_buffer_unbind(void) +{ + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0)); +} + +static void lv_opengles_vertex_array_init(void) +{ + if(vertex_array_id == 0) GL_CALL(glGenVertexArrays(1, &vertex_array_id)); +} + +static void lv_opengles_vertex_array_deinit(void) +{ + if(vertex_array_id == 0) return; + GL_CALL(glDeleteVertexArrays(1, &vertex_array_id)); + vertex_array_id = 0; +} + +static void lv_opengles_vertex_array_bind(void) +{ + GL_CALL(glBindVertexArray(vertex_array_id)); +} + +static void lv_opengles_vertex_array_unbind(void) +{ + GL_CALL(glBindVertexArray(0)); +} + +static void lv_opengles_vertex_array_add_buffer(void) +{ + lv_opengles_vertex_buffer_bind(); + intptr_t offset = 0; + + for(unsigned int i = 0; i < 2; i++) { + lv_opengles_vertex_array_bind(); + GL_CALL(glEnableVertexAttribArray(i)); + GL_CALL(glVertexAttribPointer(i, 2, GL_FLOAT, GL_FALSE, 16, (const void *)offset)); + offset += 2 * 4; + } +} + +static void lv_opengles_index_buffer_init(const unsigned int * data, unsigned int count) +{ + index_buffer_count = count; + if(index_buffer_id == 0) GL_CALL(glGenBuffers(1, &index_buffer_id)); + + GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_id)); + + GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(GLuint), data, GL_STATIC_DRAW)); +} + +static void lv_opengles_index_buffer_deinit(void) +{ + if(index_buffer_id == 0) return; + GL_CALL(glDeleteBuffers(1, &index_buffer_id)); + index_buffer_id = 0; +} + +static unsigned int lv_opengles_index_buffer_get_count(void) +{ + return index_buffer_count; +} + +static void lv_opengles_index_buffer_bind(void) +{ + GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_id)); +} + +static void lv_opengles_index_buffer_unbind(void) +{ + GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +} + +static unsigned int lv_opengles_shader_manager_init(void) +{ + for(lv_opengl_glsl_version_t version = LV_OPENGL_GLSL_VERSION_300ES; version < LV_OPENGL_GLSL_VERSION_LAST; ++version) { + LV_LOG_INFO("Trying GLSL version %s", lv_opengles_glsl_version_to_string(version)); + { + /* Initialize the shader manager*/ + lv_opengl_shader_portions_t portions; + lv_opengles_shader_get_source(&portions, version); + char * vertex_shader = lv_opengles_shader_get_vertex(version); + char * frag_shader = lv_opengles_shader_get_fragment(version); + lv_opengl_shader_manager_init(&shader_manager, portions.all, portions.count, vertex_shader, frag_shader); + lv_free(vertex_shader); + lv_free(frag_shader); + } + + lv_opengl_shader_params_t frag_shader = {.name = "__MAIN__.frag"}; + lv_opengl_shader_params_t vert_shader = {.name = "__MAIN__.vert"}; + lv_opengl_shader_program_t * program = lv_opengl_shader_manager_compile_program(&shader_manager, &frag_shader, + &vert_shader, version); + if(program) { + LV_LOG_INFO("Compiled shaders with version %s", lv_opengles_glsl_version_to_string(version)); + return lv_opengl_shader_program_get_id(program); + } + lv_opengl_shader_manager_deinit(&shader_manager); + } + LV_LOG_ERROR("Failed to initialize shaders"); + return 0; +} + +static lv_result_t lv_opengles_shader_init(void) +{ + if(shader_id != 0) { + return LV_RESULT_OK; + } + shader_id = lv_opengles_shader_manager_init(); + return shader_id != 0 ? LV_RESULT_OK : LV_RESULT_INVALID; +} + +static void lv_opengles_shader_deinit(void) +{ + if(shader_id == 0) return; + /* The program is part of the manager and as such will be destroyed inside */ + lv_opengl_shader_manager_deinit(&shader_manager); + shader_id = 0; +} + +static void lv_opengles_shader_bind(void) +{ + GL_CALL(glUseProgram(shader_id)); +} + +static void lv_opengles_shader_unbind(void) +{ + GL_CALL(glUseProgram(0)); +} + +static int lv_opengles_shader_get_uniform_location(const char * name) +{ + int id = -1; + for(size_t i = 0; i < sizeof(shader_location) / sizeof(int); i++) { + if(lv_strcmp(shader_names[i], name) == 0) { + id = i; + } + } + + LV_ASSERT_FORMAT_MSG(id > -1, "Uniform location doesn't exist for '%s'. Check `shader_location` array", name); + + if(shader_location[id] != 0) { + return shader_location[id]; + } + + int location; + GL_CALL(location = glGetUniformLocation(shader_id, name)); + if(location == -1) + LV_LOG_WARN("Warning: uniform '%s' doesn't exist!", name); + + shader_location[id] = location; + return location; +} + +static void lv_opengles_shader_set_uniform1i(const char * name, int value) +{ + LV_PROFILER_DRAW_BEGIN; + GL_CALL(glUniform1i(lv_opengles_shader_get_uniform_location(name), value)); + LV_PROFILER_DRAW_END; +} + +static void lv_opengles_shader_set_uniformmatrix3fv(const char * name, int count, const float * values) +{ + LV_PROFILER_DRAW_BEGIN; + /* + * GLES2.0 doesn't support transposing the matrix via glUniformMatrix3fv so this is the transposed matrix + * https://registry.khronos.org/OpenGL/specs/es/2.0/es_full_spec_2.0.pdf page 47 + */ + GL_CALL(glUniformMatrix3fv(lv_opengles_shader_get_uniform_location(name), count, GL_FALSE, values)); + LV_PROFILER_DRAW_END; +} + +static void lv_opengles_shader_set_uniform1f(const char * name, float value) +{ + LV_PROFILER_DRAW_BEGIN; + GL_CALL(glUniform1f(lv_opengles_shader_get_uniform_location(name), value)); + LV_PROFILER_DRAW_END; +} + +static void lv_opengles_shader_set_uniform3f(const char * name, float value_0, float value_1, float value_2) +{ + LV_PROFILER_DRAW_BEGIN; + GL_CALL(glUniform3f(lv_opengles_shader_get_uniform_location(name), value_0, value_1, value_2)); + LV_PROFILER_DRAW_END; +} + +static void lv_opengles_render_draw(void) +{ + LV_PROFILER_DRAW_BEGIN; + lv_opengles_shader_bind(); + lv_opengles_vertex_array_bind(); + lv_opengles_index_buffer_bind(); + unsigned int count = lv_opengles_index_buffer_get_count(); + GL_CALL(glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, NULL)); + LV_PROFILER_DRAW_END; +} + +/** + * Copied from `lv_map` in lv_math.h to operate on floats + */ +static float lv_opengles_map_float(float x, float min_in, float max_in, float min_out, float max_out) +{ + if(max_in >= min_in && x >= max_in) return max_out; + if(max_in >= min_in && x <= min_in) return min_out; + + if(max_in <= min_in && x <= max_in) return max_out; + if(max_in <= min_in && x >= min_in) return min_out; + + /** + * The equation should be: + * ((x - min_in) * delta_out) / delta in) + min_out + * To avoid rounding error reorder the operations: + * (x - min_in) * (delta_out / delta_min) + min_out + */ + + float delta_in = max_in - min_in; + float delta_out = max_out - min_out; + + return ((x - min_in) * delta_out) / delta_in + min_out; +} + +static void populate_vertex_buffer(float vertex_buffer[LV_OPENGLES_VERTEX_BUFFER_LEN], + lv_display_rotation_t rotation, bool * h_flip, bool * v_flip, float clip_x1, float clip_y1, float clip_x2, + float clip_y2) +{ +#if !LV_USE_DRAW_OPENGLES + LV_UNUSED(h_flip); + LV_UNUSED(v_flip); +#endif + switch(rotation) { + case LV_DISPLAY_ROTATION_0: + vertex_buffer[0] = -1.f; + vertex_buffer[1] = 1.0f; + vertex_buffer[2] = clip_x1; + vertex_buffer[3] = clip_y2; + vertex_buffer[4] = 1.0f; + vertex_buffer[5] = 1.0f; + vertex_buffer[6] = clip_x2; + vertex_buffer[7] = clip_y2; + vertex_buffer[8] = 1.0f; + vertex_buffer[9] = -1.0f; + vertex_buffer[10] = clip_x2; + vertex_buffer[11] = clip_y1; + vertex_buffer[12] = -1.f; + vertex_buffer[13] = -1.0f; + vertex_buffer[14] = clip_x1; + vertex_buffer[15] = clip_y1; + break; + + case LV_DISPLAY_ROTATION_270: +#if LV_USE_DRAW_OPENGLES + *h_flip = !*h_flip; + *v_flip = !*v_flip; +#endif + vertex_buffer[0] = 1.0f; + vertex_buffer[1] = 1.0f; + vertex_buffer[2] = clip_x1; + vertex_buffer[3] = clip_y2; + vertex_buffer[4] = 1.0f; + vertex_buffer[5] = -1.0f; + vertex_buffer[6] = clip_x2; + vertex_buffer[7] = clip_y2; + vertex_buffer[8] = -1.f; + vertex_buffer[9] = -1.0f; + vertex_buffer[10] = clip_x2; + vertex_buffer[11] = clip_y1; + vertex_buffer[12] = -1.f; + vertex_buffer[13] = 1.0f; + vertex_buffer[14] = clip_x1; + vertex_buffer[15] = clip_y1; + break; + + case LV_DISPLAY_ROTATION_180: + vertex_buffer[0] = 1.0f; + vertex_buffer[1] = -1.0f; + vertex_buffer[2] = clip_x1; + vertex_buffer[3] = clip_y2; + vertex_buffer[4] = -1.f; + vertex_buffer[5] = -1.0f; + vertex_buffer[6] = clip_x2; + vertex_buffer[7] = clip_y2; + vertex_buffer[8] = -1.f; + vertex_buffer[9] = 1.0f; + vertex_buffer[10] = clip_x2; + vertex_buffer[11] = clip_y1; + vertex_buffer[12] = 1.0f; + vertex_buffer[13] = 1.0f; + vertex_buffer[14] = clip_x1; + vertex_buffer[15] = clip_y1; + break; + case LV_DISPLAY_ROTATION_90: +#if LV_USE_DRAW_OPENGLES + *h_flip = !*h_flip; + *v_flip = !*v_flip; +#endif + vertex_buffer[0] = -1.f; + vertex_buffer[1] = -1.0f; + vertex_buffer[2] = clip_x1; + vertex_buffer[3] = clip_y2; + vertex_buffer[4] = -1.f; + vertex_buffer[5] = 1.0f; + vertex_buffer[6] = clip_x2; + vertex_buffer[7] = clip_y2; + vertex_buffer[8] = 1.0f; + vertex_buffer[9] = 1.0f; + vertex_buffer[10] = clip_x2; + vertex_buffer[11] = clip_y1; + vertex_buffer[12] = 1.0f; + vertex_buffer[13] = -1.0f; + vertex_buffer[14] = clip_x1; + vertex_buffer[15] = clip_y1; + break; + } +} +#endif /* LV_USE_OPENGLES */ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_driver.h b/inc/lvgl/src/drivers/opengles/lv_opengles_driver.h new file mode 100644 index 0000000..f352ec9 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_driver.h @@ -0,0 +1,108 @@ +/** + * @file lv_opengles_driver.h + * + */ + +#ifndef LV_OPENGLES_DRIVER_H +#define LV_OPENGLES_DRIVER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_OPENGLES + +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize OpenGL + * @note it is not necessary to call this if you use `lv_opengles_glfw_window_create` + */ +void lv_opengles_init(void); + +/** + * Deinitialize OpenGL + * @note it is not necessary to call this if you use `lv_opengles_glfw_window_create` + */ +void lv_opengles_deinit(void); + +/** + * Render a texture using alternate blending mode for smoother translucent materials and correct anti-aliasing of glTF elements when using transparent background + * @param texture OpenGL texture ID + * @param texture_area the area in the window to render the texture in + * @param opa opacity to blend the texture with existing contents + * @param disp_w width of the window/framebuffer being rendered to + * @param disp_h height of the window/framebuffer being rendered to + * @param h_flip horizontal flip + * @param v_flip vertical flip + */ +void lv_opengles_render_texture(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa, int32_t disp_w, + int32_t disp_h, const lv_area_t * texture_clip_area, bool h_flip, bool v_flip); + +/** + * Render a display texture - Supports rotation - Switches red and blue channels + * @param display LVGL Texture display. Created with the `lv_opengles_texture` module + * @param h_flip horizontal flip + * @param v_flip vertical flip + */ +void lv_opengles_render_display_texture(lv_display_t * display, bool h_flip, bool v_flip); + +/** + * Render a fill + * @param color the color of the fill + * @param area the area in the window to render the fill + * @param opa opacity to blend the fill with existing contents + * @param disp_w width of the window/framebuffer being rendered to + * @param disp_h height of the window/framebuffer being rendered to + */ +void lv_opengles_render_fill(lv_color_t color, const lv_area_t * area, lv_opa_t opa, int32_t disp_w, int32_t disp_h); + +/** + * Clear the window/display + */ +void lv_opengles_render_clear(void); + +/** + * Set the OpenGL viewport + * @param x x position of the viewport + * @param y y position of the viewport + * @param w width of the viewport + * @param h height of the viewport + */ +void lv_opengles_viewport(int32_t x, int32_t y, int32_t w, int32_t h); + +/** + * Reinitialize OpenGL state after external GL operations (e.g., NanoVG) + * This rebinds VAO, VBO, IBO and resets vertex attributes + */ +void lv_opengles_reinit_state(void); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_OPENGLES */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_OPENGLES_DRIVER_H */ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_egl.c b/inc/lvgl/src/drivers/opengles/lv_opengles_egl.c new file mode 100644 index 0000000..31c3355 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_egl.c @@ -0,0 +1,561 @@ +/** + * @file lv_opengles_egl.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_opengles_egl.h" +#include + +#if LV_USE_EGL + +#include + +#include +#include "lv_opengles_debug.h" + +#include "glad/include/glad/egl.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_types.h" +#include "../../misc/lv_types.h" +#include "../../stdlib/lv_mem.h" +#include "lv_opengles_private.h" +#include "lv_opengles_egl_private.h" +#include "lv_opengles_driver.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +static lv_result_t load_egl(lv_opengles_egl_t * ctx); +static EGLDisplay create_egl_display(lv_opengles_egl_t * ctx); +static EGLSurface create_egl_surface(lv_opengles_egl_t * ctx); +static EGLContext create_egl_context(lv_opengles_egl_t * ctx); +static EGLConfig create_egl_config(lv_opengles_egl_t * ctx); +static lv_result_t lv_egl_config_from_egl_config(lv_opengles_egl_t * ctx, lv_egl_config_t * lv_egl_config, + EGLConfig egl_config); +static void * create_native_window(lv_opengles_egl_t * ctx); +static lv_result_t get_native_config(lv_opengles_egl_t * ctx, EGLint * native_id, uint64_t ** mods, size_t * count); +static GLADapiproc glad_egl_load_cb(void * userdata, const char * name); + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ + +lv_opengles_egl_t * lv_opengles_egl_context_create(const lv_egl_interface_t * interface) +{ + lv_opengles_egl_t * ctx = lv_zalloc(sizeof(*ctx)); + LV_ASSERT_MALLOC(ctx); + if(!ctx) { + LV_LOG_ERROR("Failed to create egl context"); + return NULL; + } + ctx->interface = *interface; + ctx->vsync = false; + + lv_result_t res = load_egl(ctx); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to load egl "); + lv_free(ctx); + return NULL; + } + lv_opengles_init(); + return ctx; +} + +void lv_opengles_egl_context_destroy(lv_opengles_egl_t * ctx) +{ + if(!ctx) { + return; + } + if(ctx->egl_display) { + eglMakeCurrent(ctx->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if(ctx->egl_context) { + eglDestroyContext(ctx->egl_display, ctx->egl_context); + } + ctx->egl_context = EGL_NO_CONTEXT; + } + if(ctx->egl_surface && ctx->egl_display) { + eglDestroySurface(ctx->egl_display, ctx->egl_surface); + ctx->egl_surface = EGL_NO_SURFACE; + } + + if(ctx->egl_lib_handle) { + dlclose(ctx->egl_lib_handle); + } + if(ctx->opengl_lib_handle) { + dlclose(ctx->opengl_lib_handle); + } + + if(ctx->native_window && ctx->interface.destroy_window_cb) { + ctx->interface.destroy_window_cb(ctx->interface.driver_data, (void *)ctx->native_window); + ctx->native_window = 0; + } + if(ctx->egl_display) { + eglTerminate(ctx->egl_display); + ctx->egl_display = EGL_NO_DISPLAY; + } + ctx->egl_config = NULL; + lv_free(ctx); +} + +void lv_opengles_egl_clear(lv_opengles_egl_t * ctx) +{ + LV_UNUSED(ctx); + GL_CALL(glClearColor(0.f, 0.f, 0.f, 1.0f)); + GL_CALL(glDepthRangef(-1.0, 1.0)); + GL_CALL(glDepthFunc(GL_ALWAYS)); + GL_CALL(glClearDepthf(1.0f)); + GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); +} + +void lv_opengles_egl_update(lv_opengles_egl_t * ctx) +{ + eglSwapBuffers(ctx->egl_display, ctx->egl_surface); + ctx->interface.flip_cb(ctx->interface.driver_data, ctx->vsync); +} + + +/********************** +* STATIC FUNCTIONS +**********************/ + +static void * load_lib(const char ** libs, size_t count) +{ + const int mode = RTLD_NOW | RTLD_NODELETE; + for(size_t i = 0; i < count; ++i) { + + void * handle = dlopen(libs[i], mode); + if(handle) { + return handle; + } + } + return NULL; +} +static void * load_egl_lib(void) +{ + const char * egl_libs[] = {"libEGL.so", "libEGL.so.1"}; + return load_lib(egl_libs, sizeof(egl_libs) / sizeof(egl_libs[0])); +} +static void * load_gl_lib(void) +{ + const char * gl_libs[] = {"libGLESv2.so", "libGLESv2.so.2"}; + return load_lib(gl_libs, sizeof(gl_libs) / sizeof(gl_libs[0])); +} + +static lv_result_t load_egl(lv_opengles_egl_t * ctx) +{ + ctx->egl_lib_handle = load_egl_lib(); + if(!ctx->egl_lib_handle) { + LV_LOG_ERROR("Failed to load egl shared lib: %s", dlerror()); + goto err; + } + + ctx->egl_display = create_egl_display(ctx); + if(!ctx->egl_display) { + LV_LOG_ERROR("Failed to create egl display"); + goto egl_display_err; + } + + if(!gladLoadEGLUserPtr(ctx->egl_display, glad_egl_load_cb, ctx->egl_lib_handle)) { + LV_LOG_ERROR("Failed to load EGL entry points"); + goto load_egl_functions_err; + } + + if(eglBindAPI && !eglBindAPI(EGL_OPENGL_ES_API)) { + LV_LOG_ERROR("Failed to bind api"); + goto err; + } + + ctx->opengl_lib_handle = load_gl_lib(); + if(!ctx->opengl_lib_handle) { + LV_LOG_ERROR("Failed to load OpenGL library. %s", dlerror()); + goto opengl_lib_err; + } + + ctx->egl_config = create_egl_config(ctx); + if(!ctx->egl_config) { + LV_LOG_ERROR("Failed to create EGL config. Error code: %#x", eglGetError()); + goto egl_config_err; + } + + ctx->native_window = (EGLNativeWindowType)create_native_window(ctx); + if(!ctx->native_window) { + LV_LOG_ERROR("Failed to create native window"); + goto create_window_err; + + } + ctx->egl_surface = create_egl_surface(ctx); + if(!ctx->egl_surface) { + LV_LOG_ERROR("Failed to create EGL surface. Error code: %#x", eglGetError()); + goto egl_surface_err; + } + + ctx->egl_context = create_egl_context(ctx); + if(!ctx->egl_context) { + LV_LOG_ERROR("Failed to create EGL context. Error code: %#x", eglGetError()); + goto egl_context_err; + } + + if(!eglMakeCurrent(ctx->egl_display, ctx->egl_surface, ctx->egl_surface, ctx->egl_context)) { + LV_LOG_ERROR("Failed to set current egl context. Error code: %#x", eglGetError()); + goto egl_make_current_context_err; + } + + if(!eglSwapInterval(ctx->egl_display, 0)) { + LV_LOG_WARN("Can't set egl swap interval"); + } + + if(!gladLoadGLES2UserPtr(glad_egl_load_cb, ctx->opengl_lib_handle)) { + LV_LOG_ERROR("Failed to load load OpenGL entry points"); + goto load_opengl_functions_err; + } + + return LV_RESULT_OK; + +load_opengl_functions_err: + eglMakeCurrent(ctx->egl_display, NULL, NULL, NULL); + eglDestroyContext(ctx->egl_display, ctx->egl_context); +egl_make_current_context_err: + ctx->egl_context = NULL; +egl_context_err: + ctx->egl_surface = NULL; +egl_surface_err: + ctx->interface.destroy_window_cb(ctx->interface.driver_data, (void *)ctx->native_window); + ctx->native_window = 0; +create_window_err: + ctx->egl_config = NULL; +egl_config_err: + dlclose(ctx->opengl_lib_handle); + ctx->opengl_lib_handle = NULL; +opengl_lib_err: + ctx->egl_display = NULL; +load_egl_functions_err: +egl_display_err: + dlclose(ctx->egl_lib_handle); + ctx->egl_lib_handle = NULL; +err: + return LV_RESULT_INVALID; +} + +static EGLDisplay create_egl_display(lv_opengles_egl_t * ctx) +{ + union { + PFNEGLQUERYSTRINGPROC fn; + void * ptr; + } egl_query_string; + + union { + PFNEGLGETPROCADDRESSPROC fn; + void * ptr; + } egl_get_proc_address; + + union { + PFNEGLGETERRORPROC fn; + void * ptr; + } egl_get_error; + + union { + PFNEGLGETDISPLAYPROC fn; + void * ptr; + } egl_get_display; + + union { + PFNEGLINITIALIZEPROC fn; + void * ptr; + } egl_initialize; + + EGLDisplay display = NULL; + + egl_get_proc_address.ptr = dlsym(ctx->egl_lib_handle, "eglGetProcAddress"); + if(!egl_get_proc_address.ptr) { + LV_LOG_ERROR("Failed to load eglGetProcAddress"); + return NULL; + } + + egl_query_string.ptr = dlsym(ctx->egl_lib_handle, "eglQueryString"); + if(!egl_query_string.ptr) { + LV_LOG_ERROR("Failed to load eglQueryString"); + return NULL; + } + + egl_get_display.ptr = dlsym(ctx->egl_lib_handle, "eglGetDisplay"); + if(!egl_get_display.ptr) { + LV_LOG_ERROR("Failed to load eglGetDisplay"); + return NULL; + } + + egl_get_error.ptr = dlsym(ctx->egl_lib_handle, "eglGetError"); + if(!egl_get_error.ptr) { + LV_LOG_ERROR("Failed to load eglGetError"); + return NULL; + } + + egl_initialize.ptr = dlsym(ctx->egl_lib_handle, "eglInitialize"); + if(!egl_initialize.ptr) { + LV_LOG_ERROR("Failed to load eglInitialize"); + return NULL; + } + + char const * supported_extensions = egl_query_string.fn(EGL_NO_DISPLAY, EGL_EXTENSIONS); + + bool has_platform_display_ext_support = ctx->interface.egl_platform != 0 && supported_extensions && + strstr(supported_extensions, "EGL_EXT_platform_base"); + if(has_platform_display_ext_support) { + PFNEGLGETPLATFORMDISPLAYEXTPROC egl_get_platform_display = (PFNEGLGETPLATFORMDISPLAYEXTPROC) + egl_get_proc_address.fn("eglGetPlatformDisplayEXT"); + if(egl_get_platform_display) { + display = egl_get_platform_display(ctx->interface.egl_platform, (void *)ctx->interface.native_display, NULL); + } + if(!display) { + LV_LOG_WARN("Failed to get egl display from eglGetPlatformDisplay. Error code: %#x", egl_get_error.fn()); + } + } + + if(!display) { + LV_LOG_INFO("Falling back to eglGetDisplay()"); + display = egl_get_display.fn(ctx->interface.native_display); + } + + if(!display) { + LV_LOG_ERROR("Failed to get egl display from eglGetDisplay. Error code: %#x", egl_get_error.fn()); + return NULL; + } + + EGLint egl_major; + EGLint egl_minor; + if(!egl_initialize.fn(display, &egl_major, &egl_minor)) { + LV_LOG_ERROR("Failed to initialize egl. Error code: %#x", egl_get_error.fn()); + return NULL; + } + LV_LOG_INFO("Egl version %d.%d", egl_major, egl_minor); + + return display; +} + +static GLADapiproc glad_egl_load_cb(void * userdata, const char * name) +{ + union { + GLADapiproc fn; + void * ptr; + } result; + + if(eglGetProcAddress) { + GLADapiproc sym = (GLADapiproc)eglGetProcAddress(name); + if(sym) { + return sym; + } + } + result.ptr = dlsym(userdata, name); + return result.fn; +} + +static EGLConfig create_egl_config(lv_opengles_egl_t * ctx) +{ + const EGLint config_attribs[] = { + EGL_RENDERABLE_TYPE, + EGL_OPENGL_ES2_BIT, + EGL_NONE + }; + + EGLint num_configs = 0; + if(!eglChooseConfig(ctx->egl_display, config_attribs, 0, 0, &num_configs)) { + LV_LOG_ERROR("Failed to get number of configs: %d", eglGetError()); + return NULL; + } + + if(num_configs == 0) { + LV_LOG_ERROR("No valid configs"); + return NULL; + } + + EGLConfig * egl_configs = lv_malloc(num_configs * sizeof(*egl_configs)); + LV_ASSERT_MALLOC(egl_configs); + if(!egl_configs) { + LV_LOG_ERROR("Failed to allocate memory for possible configs"); + return NULL; + } + + if(!eglChooseConfig(ctx->egl_display, config_attribs, egl_configs, num_configs, &num_configs)) { + LV_LOG_ERROR("Failed to get configs: %d", eglGetError()); + return NULL; + } + + lv_egl_config_t * configs = lv_malloc(num_configs * sizeof(*configs)); + LV_ASSERT_MALLOC(configs); + if(!configs) { + LV_LOG_ERROR("Failed to allocate memory for configs"); + lv_free(egl_configs); + return NULL; + } + + size_t valid_config_count = 0; + for(size_t i = 0; i < (size_t)num_configs; ++i) { + lv_result_t err = lv_egl_config_from_egl_config(ctx, configs + i, egl_configs[i]); + if(err == LV_RESULT_OK) { + valid_config_count ++; + } + } + + if(valid_config_count == 0) { + LV_LOG_ERROR("Failed to parse available EGL configs"); + lv_free(egl_configs); + lv_free(configs); + return NULL; + } + + size_t config_id = ctx->interface.select_config(ctx->interface.driver_data, configs, valid_config_count); + + if(config_id >= (size_t)num_configs) { + LV_LOG_ERROR("Failed to find suitable EGL config"); + lv_free(egl_configs); + lv_free(configs); + return NULL; + } + EGLConfig config = egl_configs[config_id]; + lv_free(configs); + lv_free(egl_configs); + return config; +} + +static EGLSurface create_egl_surface(lv_opengles_egl_t * ctx) +{ + LV_ASSERT_NULL(ctx->egl_display); + LV_ASSERT_NULL(ctx->egl_config); + LV_ASSERT(ctx->native_window != 0); + return eglCreateWindowSurface(ctx->egl_display, ctx->egl_config, ctx->native_window, NULL); +} + +static EGLContext create_egl_context(lv_opengles_egl_t * ctx) +{ + static const EGLint context_attribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + return eglCreateContext(ctx->egl_display, ctx->egl_config, + EGL_NO_CONTEXT, context_attribs); +} + +lv_color_format_t lv_opengles_egl_color_format_from_egl_config(const lv_egl_config_t * config) +{ + if(config->r_bits == 5 && config->g_bits == 6 && config->b_bits == 5) { + if(config->a_bits == 8) { + return LV_COLOR_FORMAT_RGB565A8; + } + else { + return LV_COLOR_FORMAT_RGB565; + } + } + if(config->r_bits == 8 && config->g_bits == 8 && config->b_bits == 8) { + if(config->a_bits == 8) { + return LV_COLOR_FORMAT_ARGB8888; + } + else { + return LV_COLOR_FORMAT_RGB888; + } + } + LV_LOG_INFO("Unhandled color format (RGBA) (%d %d %d %d)", config->r_bits, config->g_bits, config->b_bits, + config->a_bits); + return LV_COLOR_FORMAT_UNKNOWN; +} + +static lv_result_t lv_egl_config_from_egl_config(lv_opengles_egl_t * ctx, lv_egl_config_t * lv_egl_config, + EGLConfig egl_config) +{ + int res = 1; + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_CONFIG_ID, &lv_egl_config->id); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_RED_SIZE, &lv_egl_config->r_bits); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_GREEN_SIZE, &lv_egl_config->g_bits); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_BLUE_SIZE, &lv_egl_config->b_bits); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_ALPHA_SIZE, &lv_egl_config->a_bits); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_MAX_PBUFFER_WIDTH, &lv_egl_config->max_width); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_MAX_PBUFFER_HEIGHT, &lv_egl_config->max_height); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_BUFFER_SIZE, &lv_egl_config->buffer_size); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_DEPTH_SIZE, &lv_egl_config->depth); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_STENCIL_SIZE, &lv_egl_config->stencil); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_SAMPLES, &lv_egl_config->samples); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_SURFACE_TYPE, &lv_egl_config->surface_type); + res &= eglGetConfigAttrib(ctx->egl_display, egl_config, EGL_RENDERABLE_TYPE, &lv_egl_config->renderable_type); + + if(!res) { + LV_LOG_WARN("Failed to fetch egl config properties"); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +static void * create_native_window(lv_opengles_egl_t * ctx) +{ + EGLint native_config_id; + uint64_t * mods = NULL; + size_t mod_count = 0; + lv_result_t res = get_native_config(ctx, &native_config_id, &mods, &mod_count); + + if(res == LV_RESULT_INVALID) { + LV_LOG_ERROR("Failed to get native config"); + return NULL; + } + + lv_egl_native_window_properties_t properties = { .visual_id = native_config_id }; + + void * native_window = ctx->interface.create_window_cb(ctx->interface.driver_data, &properties); + if(!native_window) { + LV_LOG_ERROR("Faield to create window"); + lv_free(mods); + return NULL; + } + lv_free(mods); + return native_window; +} + +static lv_result_t get_native_config(lv_opengles_egl_t * ctx, EGLint * native_id, uint64_t ** mods, size_t * count) +{ + EGLint num_mods; + + if(!eglGetConfigAttrib(ctx->egl_display, ctx->egl_config, EGL_NATIVE_VISUAL_ID, native_id)) { + LV_LOG_ERROR("Failed to get native visual id for egl config"); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; + + if(!eglQueryDmaBufModifiersEXT || !eglQueryDmaBufModifiersEXT(ctx->egl_display, *native_id, 0, NULL, NULL, &num_mods)) { + LV_LOG_WARN("Failed to get native modifiers"); + return LV_RESULT_OK; + } + + if(num_mods <= 0) { + LV_LOG_INFO("No native modifiers"); + return LV_RESULT_OK; + } + + *mods = lv_malloc(num_mods * sizeof(*mods)); + LV_ASSERT_MALLOC(mods); + eglQueryDmaBufModifiersEXT(ctx->egl_display, *native_id, num_mods, *mods, NULL, &num_mods); + if(*mods[0] == 0) { + lv_free(mods); + return LV_RESULT_OK; + } + *count = (size_t) num_mods; + return LV_RESULT_OK; +} + +#endif /*LV_USE_EGL*/ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_egl.h b/inc/lvgl/src/drivers/opengles/lv_opengles_egl.h new file mode 100644 index 0000000..b32ade9 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_egl.h @@ -0,0 +1,56 @@ +/** + * @file lv_opengles_egl.h + * + */ + +#ifndef LV_OPENGLES_EGL_H +#define LV_OPENGLES_EGL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_EGL + +#include "../../misc/lv_types.h" +#include "../../misc/lv_color.h" + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_opengles_egl lv_opengles_egl_t; +typedef struct _lv_egl_interface lv_egl_interface_t; +typedef struct _lv_egl_config lv_egl_config_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_opengles_egl_t * lv_opengles_egl_context_create(const lv_egl_interface_t * interface); +lv_color_format_t lv_opengles_egl_color_format_from_egl_config(const lv_egl_config_t * config); + +void lv_opengles_egl_update(lv_opengles_egl_t * ctx); +void lv_opengles_egl_clear(lv_opengles_egl_t * ctx); +void lv_opengles_egl_context_destroy(lv_opengles_egl_t * ctx); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_EGL*/ +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OPENGLES_EGL_H*/ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_egl_private.h b/inc/lvgl/src/drivers/opengles/lv_opengles_egl_private.h new file mode 100644 index 0000000..342486f --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_egl_private.h @@ -0,0 +1,103 @@ +/** + * @file lv_opengles_egl_private.h + * + */ + +#ifndef LV_OPENGLES_EGL_PRIVATE_H +#define LV_OPENGLES_EGL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_EGL + +#include "../../misc/lv_types.h" +#include "../../misc/lv_color.h" +#include "lv_opengles_private.h" +#include "lv_opengles_egl.h" + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_egl_config { + EGLint id; + EGLint max_width; + EGLint max_height; + EGLint buffer_size; + EGLint depth; + EGLint stencil; + EGLint samples; + EGLint surface_type; + EGLint renderable_type; + EGLint r_bits; + EGLint g_bits; + EGLint b_bits; + EGLint a_bits; +}; + +typedef struct { + EGLint visual_id; +} lv_egl_native_window_properties_t; + +typedef void * (*lv_egl_init_display_t)(void * driver_data, int32_t width, int32_t height); +typedef void * (*lv_egl_get_display_t)(void * driver_data); +typedef void * (*lv_create_window_t)(void * driver_data, const lv_egl_native_window_properties_t * props); +typedef void (*lv_destroy_window_t)(void * driver_data, void * native_window); + +typedef void (*lv_egl_set_visible_t)(void * driver_data, bool v); +typedef void (*lv_egl_flip_t)(void * driver_data, bool vsync); +typedef void (*lv_egl_native_state_deinit_t)(void ** driver_data); +typedef size_t (*lv_egl_select_config_t)(void * driver_data, const lv_egl_config_t * configs, + size_t config_count); + +struct _lv_egl_interface { + lv_egl_select_config_t select_config; + void * driver_data; + void * native_display; + uint16_t egl_platform; + lv_create_window_t create_window_cb; + lv_destroy_window_t destroy_window_cb; + lv_egl_flip_t flip_cb; +}; + + +struct _lv_opengles_egl { + EGLNativeWindowType native_window; + EGLDisplay egl_display; + EGLConfig egl_config; + EGLContext egl_context; + EGLSurface egl_surface; + void * egl_lib_handle; + void * opengl_lib_handle; + lv_egl_interface_t interface; + int32_t width; + int32_t height; + bool vsync; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_EGL*/ +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OPENGLES_EGL_PRIVATE_H*/ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_glfw.c b/inc/lvgl/src/drivers/opengles/lv_opengles_glfw.c new file mode 100644 index 0000000..0740169 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_glfw.c @@ -0,0 +1,703 @@ +/** + * @file lv_opengles_glfw.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_opengles_glfw.h" +#if LV_USE_GLFW + +#include "lv_opengles_window.h" +#include "lv_opengles_driver.h" +#include "lv_opengles_texture.h" +#include "lv_opengles_private.h" +#include "lv_opengles_debug.h" + +#include "../../core/lv_refr.h" +#include "../../stdlib/lv_string.h" +#include "../../indev/lv_indev.h" +#include "../../lv_init.h" +#include "../../misc/lv_area_private.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_opengles_window_t { + GLFWwindow * window; + int32_t hor_res; + int32_t ver_res; + bool h_flip; + bool v_flip; + lv_ll_t textures; + lv_point_t mouse_last_point; + lv_indev_state_t mouse_last_state; + uint8_t use_indev : 1; + uint8_t closing : 1; +#if LV_USE_DRAW_OPENGLES + uint8_t direct_render_invalidated: 1; +#endif +}; + +struct _lv_opengles_window_texture_t { + lv_opengles_window_t * window; + unsigned int texture_id; /* 0 if it's a window display */ + lv_display_t * disp; /* non-NULL if it's a display texture or a window display */ + uint8_t * fb; /* non-NULL if it's a window display and !DRAW_OPENGLES */ + lv_area_t area; + lv_opa_t opa; + lv_indev_t * indev; + lv_point_t indev_last_point; + lv_indev_state_t indev_last_state; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void window_update_handler(lv_timer_t * t); +static uint32_t lv_glfw_tick_count_callback(void); +static lv_opengles_window_t * lv_glfw_get_lv_window_from_window(GLFWwindow * window); +static void glfw_error_cb(int error, const char * description); +static int lv_glfw_init(void); +static lv_result_t lv_glad_init(void); +static void lv_glfw_timer_init(void); +static void lv_glfw_window_config(GLFWwindow * window, bool use_mouse_indev); +static void lv_glfw_window_quit(void); +static void window_close_callback(GLFWwindow * window); +static void key_callback(GLFWwindow * window, int key, int scancode, int action, int mods); +static void mouse_button_callback(GLFWwindow * window, int button, int action, int mods); +static void mouse_move_callback(GLFWwindow * window, double xpos, double ypos); +static void proc_mouse(lv_opengles_window_t * window); +static void indev_read_cb(lv_indev_t * indev, lv_indev_data_t * data); +static void framebuffer_size_callback(GLFWwindow * window, int width, int height); +static void window_display_delete_cb(lv_event_t * e); +static void window_display_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +#if !LV_USE_DRAW_OPENGLES + static void ensure_init_window_display_texture(void); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +static bool glfw_inited; +static bool glad_inited; +static lv_timer_t * update_handler_timer; +static lv_ll_t glfw_window_ll; +#if !LV_USE_DRAW_OPENGLES + static unsigned int window_display_texture; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_opengles_window_t * lv_opengles_glfw_window_create_ex(int32_t hor_res, int32_t ver_res, bool use_mouse_indev, + bool h_flip, bool v_flip, const char * title) +{ + LV_ASSERT_NULL(title); + if(lv_glfw_init() != 0) { + LV_LOG_ERROR("Failed to init glfw"); + return NULL; + } + + lv_opengles_window_t * window = lv_ll_ins_tail(&glfw_window_ll); + LV_ASSERT_MALLOC(window); + if(window == NULL) return NULL; + if(window == NULL) { + LV_LOG_ERROR("Failed to create glfw window"); + return NULL; + } + lv_memzero(window, sizeof(*window)); + + /* Create window with graphics context */ + lv_opengles_window_t * existing_window = lv_ll_get_head(&glfw_window_ll); + window->window = glfwCreateWindow(hor_res, ver_res, title, NULL, + existing_window ? existing_window->window : NULL); + if(window->window == NULL) { + LV_LOG_ERROR("glfwCreateWindow fail"); + lv_ll_remove(&glfw_window_ll, window); + lv_free(window); + return NULL; + } + + glfwSetWindowTitle(window->window, title); + + window->h_flip = h_flip; + window->v_flip = v_flip; + window->hor_res = hor_res; + window->ver_res = ver_res; + + lv_ll_init(&window->textures, sizeof(lv_opengles_window_texture_t)); + window->use_indev = use_mouse_indev; +#if LV_USE_DRAW_OPENGLES + window->direct_render_invalidated = 1; +#endif + + glfwSetWindowUserPointer(window->window, window); + lv_glfw_timer_init(); + lv_glfw_window_config(window->window, use_mouse_indev); + + lv_result_t res = lv_glad_init(); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to init glad"); + glfwDestroyWindow(window->window); + lv_ll_remove(&glfw_window_ll, window); + lv_free(window); + return NULL; + } + + glfwMakeContextCurrent(window->window); + lv_opengles_init(); + + return window; +} + +lv_opengles_window_t * lv_opengles_glfw_window_create(int32_t hor_res, int32_t ver_res, bool use_mouse_indev) +{ + return lv_opengles_glfw_window_create_ex(hor_res, ver_res, use_mouse_indev, false, false, "LVGL Simulator"); +} + +void lv_opengles_glfw_window_set_title(lv_opengles_window_t * window, const char * new_title) +{ + glfwSetWindowTitle(window->window, new_title); +} + +void lv_opengles_window_delete(lv_opengles_window_t * window) +{ + glfwDestroyWindow(window->window); + + lv_opengles_window_texture_t * texture; + while((texture = lv_ll_get_head(&window->textures))) { + if(texture->texture_id) { + lv_opengles_window_texture_remove(texture); + } + else { + lv_display_delete(texture->disp); + } + } + + lv_ll_remove(&glfw_window_ll, window); + lv_free(window); + + if(lv_ll_is_empty(&glfw_window_ll)) { + lv_glfw_window_quit(); +#if !LV_USE_DRAW_OPENGLES + if(window_display_texture) { + GL_CALL(glDeleteTextures(1, &window_display_texture)); + window_display_texture = 0; + } +#endif + } +} + +void * lv_opengles_glfw_window_get_glfw_window(lv_opengles_window_t * window) +{ + return (void *)(window->window); +} + +void lv_opengles_glfw_window_set_flip(lv_opengles_window_t * window, bool h_flip, bool v_flip) +{ + window->h_flip = h_flip; + window->v_flip = v_flip; +} + +lv_opengles_window_texture_t * lv_opengles_window_add_texture(lv_opengles_window_t * window, unsigned int texture_id, + int32_t w, int32_t h) +{ + lv_opengles_window_texture_t * texture = lv_ll_ins_tail(&window->textures); + LV_ASSERT_MALLOC(texture); + if(texture == NULL) return NULL; + lv_memzero(texture, sizeof(*texture)); + texture->window = window; + texture->texture_id = texture_id; + texture->disp = lv_opengles_texture_get_from_texture_id(texture_id); + lv_area_set(&texture->area, 0, 0, w - 1, h - 1); + texture->opa = LV_OPA_COVER; + + if(window->use_indev && texture->disp) { + lv_indev_t * indev = lv_indev_create(); + if(indev == NULL) { + lv_ll_remove(&window->textures, texture); + lv_free(texture); + return NULL; + } + texture->indev = indev; + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, indev_read_cb); + lv_indev_set_driver_data(indev, texture); + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + lv_indev_set_display(indev, texture->disp); + } + +#if LV_USE_DRAW_OPENGLES + window->direct_render_invalidated = 1; +#endif + + return texture; +} + +void lv_opengles_window_texture_remove(lv_opengles_window_texture_t * texture) +{ + if(texture->texture_id == 0) { + LV_LOG_WARN("window displays should be deleted with `lv_display_delete`"); + return; + } + if(texture->indev != NULL) { + lv_indev_delete(texture->indev); + } + +#if LV_USE_DRAW_OPENGLES + texture->window->direct_render_invalidated = 1; +#endif + + lv_ll_remove(&texture->window->textures, texture); + lv_free(texture); +} + +lv_display_t * lv_opengles_window_display_create(lv_opengles_window_t * window, int32_t w, int32_t h) +{ + lv_display_t * disp = lv_display_create(w, h); + if(disp == NULL) { + return NULL; + } + + lv_opengles_window_texture_t * dsc = lv_ll_ins_tail(&window->textures); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) { + lv_display_delete(disp); + return NULL; + } + lv_memzero(dsc, sizeof(*dsc)); + dsc->window = window; + dsc->disp = disp; + lv_area_set(&dsc->area, 0, 0, w - 1, h - 1); + dsc->opa = LV_OPA_COVER; + +#if LV_USE_DRAW_OPENGLES + static size_t LV_ATTRIBUTE_MEM_ALIGN dummy_buf; + lv_display_set_buffers(disp, &dummy_buf, NULL, h * lv_draw_buf_width_to_stride(w, LV_COLOR_FORMAT_ARGB8888), + LV_DISPLAY_RENDER_MODE_FULL); +#else + uint32_t stride = lv_draw_buf_width_to_stride(w, lv_display_get_color_format(disp)); + uint32_t buf_size = stride * h; + dsc->fb = malloc(buf_size); + LV_ASSERT_MALLOC(dsc->fb); + if(dsc->fb == NULL) { + lv_display_delete(disp); + lv_ll_remove(&window->textures, dsc); + lv_free(dsc); + return NULL; + } + lv_display_set_buffers(disp, dsc->fb, NULL, buf_size, LV_DISPLAY_RENDER_MODE_DIRECT); +#endif + + if(window->use_indev) { + lv_indev_t * indev = lv_indev_create(); + if(indev == NULL) { + lv_display_delete(disp); + lv_ll_remove(&window->textures, dsc); + lv_free(dsc); + return NULL; + } + dsc->indev = indev; + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, indev_read_cb); + lv_indev_set_driver_data(indev, dsc); + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + lv_indev_set_display(indev, disp); + } + + lv_display_set_driver_data(disp, dsc); + lv_display_delete_refr_timer(disp); + lv_display_set_flush_cb(disp, window_display_flush_cb); + lv_display_add_event_cb(disp, window_display_delete_cb, LV_EVENT_DELETE, disp); + +#if LV_USE_DRAW_OPENGLES + window->direct_render_invalidated = 1; +#endif + + return disp; +} + +lv_opengles_window_texture_t * lv_opengles_window_display_get_window_texture(lv_display_t * window_display) +{ + return lv_display_get_driver_data(window_display); +} + +void lv_opengles_window_texture_set_x(lv_opengles_window_texture_t * texture, int32_t x) +{ + lv_area_set_pos(&texture->area, x, texture->area.y1); + +#if LV_USE_DRAW_OPENGLES + texture->window->direct_render_invalidated = 1; +#endif +} + +void lv_opengles_window_texture_set_y(lv_opengles_window_texture_t * texture, int32_t y) +{ + lv_area_set_pos(&texture->area, texture->area.x1, y); + +#if LV_USE_DRAW_OPENGLES + texture->window->direct_render_invalidated = 1; +#endif +} + +void lv_opengles_window_texture_set_opa(lv_opengles_window_texture_t * texture, lv_opa_t opa) +{ + texture->opa = opa; + +#if LV_USE_DRAW_OPENGLES + texture->window->direct_render_invalidated = 1; +#endif +} + +lv_indev_t * lv_opengles_window_texture_get_mouse_indev(lv_opengles_window_texture_t * texture) +{ + return texture->indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int lv_glfw_init(void) +{ + if(glfw_inited) { + return 0; + } + + glfwSetErrorCallback(glfw_error_cb); + + int ret = glfwInit(); + if(ret == 0) { + LV_LOG_ERROR("glfwInit fail."); + return 1; + } + + lv_ll_init(&glfw_window_ll, sizeof(lv_opengles_window_t)); + + glfw_inited = true; + return 0; +} + +static lv_result_t lv_glad_init(void) +{ + if(glad_inited) { + return LV_RESULT_OK; + } + + + if(!gladLoadGL((GLADloadfunc)glfwGetProcAddress)) { + LV_LOG_ERROR("Failed to load OpenGL functions"); + return LV_RESULT_INVALID; + } + + LV_LOG_INFO("GL version: %s", glGetString(GL_VERSION)); + LV_LOG_INFO("GLSL version: %s", glGetString(GL_SHADING_LANGUAGE_VERSION)); + + glad_inited = true; + + return LV_RESULT_OK; +} + +static void lv_glfw_timer_init(void) +{ + if(update_handler_timer == NULL) { + update_handler_timer = lv_timer_create(window_update_handler, LV_DEF_REFR_PERIOD, NULL); + lv_tick_set_cb(lv_glfw_tick_count_callback); + } +} + +static void lv_glfw_window_config(GLFWwindow * window, bool use_mouse_indev) +{ + glfwMakeContextCurrent(window); + + glfwSwapInterval(1); + + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + + if(use_mouse_indev) { + glfwSetMouseButtonCallback(window, mouse_button_callback); + glfwSetCursorPosCallback(window, mouse_move_callback); + } + + glfwSetKeyCallback(window, key_callback); + + glfwSetWindowCloseCallback(window, window_close_callback); +} + +static void lv_glfw_window_quit(void) +{ + lv_timer_delete(update_handler_timer); + update_handler_timer = NULL; + + lv_deinit(); + + glfwTerminate(); + glfw_inited = false; + + exit(0); +} + +static void window_update_handler(lv_timer_t * t) +{ + LV_UNUSED(t); + + lv_opengles_window_t * window; + + glfwPollEvents(); + + /* delete windows that are ready to close */ + window = lv_ll_get_head(&glfw_window_ll); + while(window) { + lv_opengles_window_t * window_to_delete = window->closing ? window : NULL; + window = lv_ll_get_next(&glfw_window_ll, window); + if(window_to_delete) { + glfwSetWindowShouldClose(window_to_delete->window, GLFW_TRUE); + lv_opengles_window_delete(window_to_delete); + } + } + + /* render each window */ + LV_LL_READ(&glfw_window_ll, window) { + glfwMakeContextCurrent(window->window); + lv_opengles_viewport(0, 0, window->hor_res, window->ver_res); + +#if LV_USE_DRAW_OPENGLES + lv_opengles_window_texture_t * textures_head; + bool window_display_direct_render = + !window->direct_render_invalidated + && (textures_head = lv_ll_get_head(&window->textures)) + && textures_head->texture_id == 0 /* it's a window display */ + && lv_ll_get_next(&window->textures, textures_head) == NULL /* it's the only one */ + && textures_head->opa == LV_OPA_COVER + && textures_head->area.x1 == 0 + && textures_head->area.y1 == 0 + && textures_head->area.x2 == window->hor_res - 1 + && textures_head->area.y2 == window->ver_res - 1 + ; + window->direct_render_invalidated = 0; + if(!window_display_direct_render) { + lv_opengles_render_clear(); + } +#else + lv_opengles_render_clear(); +#endif + + /* render each texture in the window */ + lv_opengles_window_texture_t * texture; + LV_LL_READ(&window->textures, texture) { + if(texture->texture_id == 0) { /* it's a window display */ +#if LV_USE_DRAW_OPENGLES + lv_display_set_render_mode(texture->disp, + window_display_direct_render ? LV_DISPLAY_RENDER_MODE_DIRECT : LV_DISPLAY_RENDER_MODE_FULL); +#endif + + lv_display_t * default_save = lv_display_get_default(); + lv_display_set_default(texture->disp); + lv_display_refr_timer(NULL); + lv_display_set_default(default_save); + +#if !LV_USE_DRAW_OPENGLES + ensure_init_window_display_texture(); + + GL_CALL(glBindTexture(GL_TEXTURE_2D, window_display_texture)); + + /* set the dimensions and format to complete the texture */ + /* Color depth: 8 (L8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888) */ +#if LV_COLOR_DEPTH == 8 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, lv_area_get_width(&texture->area), lv_area_get_height(&texture->area), 0, + GL_RED, GL_UNSIGNED_BYTE, texture->fb)); +#elif LV_COLOR_DEPTH == 16 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, lv_area_get_width(&texture->area), lv_area_get_height(&texture->area), + 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, + texture->fb)); +#elif LV_COLOR_DEPTH == 24 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, lv_area_get_width(&texture->area), lv_area_get_height(&texture->area), 0, + GL_RGB, GL_UNSIGNED_BYTE, texture->fb)); +#elif LV_COLOR_DEPTH == 32 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lv_area_get_width(&texture->area), lv_area_get_height(&texture->area), + 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->fb)); +#else +#error("Unsupported color format") +#endif + + GL_CALL(glGenerateMipmap(GL_TEXTURE_2D)); + + GL_CALL(glBindTexture(GL_TEXTURE_2D, 0)); + + lv_opengles_render_texture_rbswap(window_display_texture, &texture->area, texture->opa, window->hor_res, + window->ver_res, + &texture->area, window->h_flip, window->v_flip); +#endif + } + else { + /* if the added texture is an LVGL opengles texture display, refresh it before rendering it */ + if(texture->disp != NULL) { +#if LV_USE_DRAW_OPENGLES + lv_display_t * default_save = lv_display_get_default(); + lv_display_set_default(texture->disp); + lv_display_refr_timer(NULL); + lv_display_set_default(default_save); +#else + lv_refr_now(texture->disp); +#endif + } + +#if LV_USE_DRAW_OPENGLES + lv_opengles_render_texture_rbswap(texture->texture_id, &texture->area, texture->opa, window->hor_res, window->ver_res, + &texture->area, window->h_flip, texture->disp == NULL ? window->v_flip : !window->v_flip); +#else + lv_opengles_render_texture_rbswap(texture->texture_id, &texture->area, texture->opa, window->hor_res, window->ver_res, + &texture->area, window->h_flip, window->v_flip); +#endif + } + } + + /* Swap front and back buffers */ + glfwSwapBuffers(window->window); + } +} + +static void glfw_error_cb(int error, const char * description) +{ + LV_LOG_ERROR("GLFW Error %d: %s", error, description); +} + +static lv_opengles_window_t * lv_glfw_get_lv_window_from_window(GLFWwindow * window) +{ + return glfwGetWindowUserPointer(window); +} + +static void window_close_callback(GLFWwindow * window) +{ + lv_opengles_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); + lv_window->closing = 1; +} + +static void key_callback(GLFWwindow * window, int key, int scancode, int action, int mods) +{ + LV_UNUSED(scancode); + LV_UNUSED(mods); + if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { + lv_opengles_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); + lv_window->closing = 1; + } +} + +static void mouse_button_callback(GLFWwindow * window, int button, int action, int mods) +{ + LV_UNUSED(mods); + if(button == GLFW_MOUSE_BUTTON_LEFT) { + lv_opengles_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); + lv_window->mouse_last_state = action == GLFW_PRESS ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + proc_mouse(lv_window); + } +} + +static void mouse_move_callback(GLFWwindow * window, double xpos, double ypos) +{ + lv_opengles_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); + lv_window->mouse_last_point.x = (int32_t)xpos; + lv_window->mouse_last_point.y = (int32_t)ypos; + proc_mouse(lv_window); +} + +static void proc_mouse(lv_opengles_window_t * window) +{ + /* mouse activity will affect the topmost LVGL display texture */ + lv_opengles_window_texture_t * texture; + LV_LL_READ_BACK(&window->textures, texture) { + if(lv_area_is_point_on(&texture->area, &window->mouse_last_point, 0)) { + /* adjust the mouse pointer coordinates so that they are relative to the texture */ + if(window->h_flip) { + texture->indev_last_point.x = texture->area.x2 - window->mouse_last_point.x; + } + else { + texture->indev_last_point.x = window->mouse_last_point.x - texture->area.x1; + } + if(window->v_flip) { + texture->indev_last_point.y = (texture->area.y2 - window->mouse_last_point.y); + } + else { + texture->indev_last_point.y = (window->mouse_last_point.y - texture->area.y1); + } + texture->indev_last_state = window->mouse_last_state; + lv_indev_read(texture->indev); + break; + } + } +} + +static void indev_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_opengles_window_texture_t * texture = lv_indev_get_driver_data(indev); + data->point = texture->indev_last_point; + data->state = texture->indev_last_state; +} + +static void framebuffer_size_callback(GLFWwindow * window, int width, int height) +{ + lv_opengles_window_t * lv_window = lv_glfw_get_lv_window_from_window(window); + lv_window->hor_res = width; + lv_window->ver_res = height; +} + +static uint32_t lv_glfw_tick_count_callback(void) +{ + double tick = glfwGetTime() * 1000.0; + return (uint32_t)tick; +} + +static void window_display_delete_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_target(e); + lv_opengles_window_texture_t * dsc = lv_display_get_driver_data(disp); + free(dsc->fb); + lv_opengles_window_texture_remove(dsc); +} + +static void window_display_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + LV_UNUSED(area); + LV_UNUSED(px_map); + lv_display_flush_ready(disp); +} + +#if !LV_USE_DRAW_OPENGLES +static void ensure_init_window_display_texture(void) +{ + if(window_display_texture) { + return; + } + + GL_CALL(glGenTextures(1, &window_display_texture)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, window_display_texture)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 20)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + + GL_CALL(glBindTexture(GL_TEXTURE_2D, 0)); +} +#endif + +#endif /*LV_USE_GLFW*/ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_glfw.h b/inc/lvgl/src/drivers/opengles/lv_opengles_glfw.h new file mode 100644 index 0000000..39d2d51 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_glfw.h @@ -0,0 +1,88 @@ +/** + * @file lv_opengles_glfw.h + * + */ + +#ifndef LV_OPENGLES_GLFW_H +#define LV_OPENGLES_GLFW_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../lv_conf_internal.h" +#if LV_USE_GLFW + +#include "../../misc/lv_types.h" + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a GLFW OpenGL window with no textures and initialize OpenGL + * @param hor_res width in pixels of the window + * @param ver_res height in pixels of the window + * @param use_mouse_indev send pointer indev input to LVGL display textures + * @return the new GLFW OpenGL window handle + */ +lv_opengles_window_t * lv_opengles_glfw_window_create(int32_t hor_res, int32_t ver_res, bool use_mouse_indev); + +/** + * Create a GLFW window with no textures and initialize OpenGL + * @param hor_res width in pixels of the window + * @param ver_res height in pixels of the window + * @param use_mouse_indev send pointer indev input to LVGL display textures + * @param h_flip Should the window contents be horizontally mirrored? + * @param v_flip Should the window contents be vertically mirrored? + * @param title The window title + * @return the new GLFW window handle + */ +lv_opengles_window_t * lv_opengles_glfw_window_create_ex(int32_t hor_res, int32_t ver_res, bool use_mouse_indev, + bool h_flip, bool v_flip, const char * title); + +/** + * Set the window's title text + * @param window GLFW window to configure + * @param new_title The new title text + */ +void lv_opengles_glfw_window_set_title(lv_opengles_window_t * window, const char * new_title); + +/** + * Set the horizontal / vertical flipping of a GLFW window + * @param window GLFW window to configure + * @param h_flip Should the window contents be horizontally mirrored? + * @param v_flip Should the window contents be vertically mirrored? + */ +void lv_opengles_glfw_window_set_flip(lv_opengles_window_t * window, bool h_flip, bool v_flip); + +/** + * Get the GLFW window handle for a GLFW lv_opengles_window_t + * @param window GLFW window to return the handle of + * @return the GLFW window handle + */ +void * lv_opengles_glfw_window_get_glfw_window(lv_opengles_window_t * window); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GLFW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OPENGLES_GLFW_H*/ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_private.h b/inc/lvgl/src/drivers/opengles/lv_opengles_private.h new file mode 100644 index 0000000..49b403c --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_private.h @@ -0,0 +1,183 @@ +/** + * @file lv_opengles_private.h + * + */ + +#ifndef LV_OPENGLES_PRIVATE_H +#define LV_OPENGLES_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_OPENGLES + +#include "../../misc/lv_area.h" +#include "../../misc/lv_color.h" + +#if !LV_USE_MATRIX +#error "LV_USE_OPENGLES requires LV_USE_MATRIX" +#endif + +#if LV_USE_EGL +#include "glad/include/glad/gles2.h" +#include "glad/include/glad/egl.h" +#else +#include "glad/include/glad/gl.h" +#endif /*LV_USE_EGL*/ + +#if LV_USE_GLFW +#include +#endif + +/********************* + * DEFINES + *********************/ + +/* In desktop GL () these symbols are defined but for EGL + * they are defined as extensions with the _EXT suffix */ +#ifndef GL_BGRA +#define GL_BGRA GL_BGRA_EXT +#endif /*GL_BGRA*/ + +#ifndef GL_TEXTURE_MAX_LEVEL +#define GL_TEXTURE_MAX_LEVEL GL_TEXTURE_MAX_LEVEL_APPLE +#endif /*GL_TEXTURE_MAX_LEVEL*/ + +#ifndef GL_UNPACK_ROW_LENGTH +#define GL_UNPACK_ROW_LENGTH GL_UNPACK_ROW_LENGTH_EXT +#endif /*GL_UNPACK_ROW_LENGTH*/ + +#ifndef glGenVertexArrays +#define glGenVertexArrays glGenVertexArraysOES +#endif + +#ifndef glBindVertexArray +#define glBindVertexArray glBindVertexArrayOES +#endif + +#ifndef glDeleteVertexArrays +#define glDeleteVertexArrays glDeleteVertexArraysOES +#endif + +#ifndef glTexStorage2D +#define glTexStorage2D glTexStorage2DEXT +#endif + +#ifndef GL_RGBA32F +#define GL_RGBA32F 0x8814 +#endif +#ifndef GL_NUM_EXTENSIONS +#define GL_NUM_EXTENSIONS 0x821D +#endif + +#ifndef GL_RGB8 +#define GL_RGB8 0x8051 +#endif + +#ifndef GL_RGBA8 +#define GL_RGBA8 0x8058 +#endif + +/* In Desktop GL GL_RGB565 is not supported. Use RGB instead */ +#if !LV_USE_EGL +#define GL_RGB565 GL_RGB +#endif + +#if !defined(glClearDepthf) && defined(glClearDepth) +#define glClearDepthf glClearDepth +#endif + +#ifndef LV_GL_PREFERRED_DEPTH +#ifdef GL_DEPTH_COMPONENT24 +#define LV_GL_PREFERRED_DEPTH GL_DEPTH_COMPONENT24 +#else +/* + * This will not run correctly yet, it compiles fine but fails to render on RPi3B. Work in progress. + * +#ifdef GL_DEPTH_COMPONENT24_OES +#define LV_GL_PREFERRED_DEPTH GL_DEPTH_COMPONENT24_OES +#else +#define LV_GL_PREFERRED_DEPTH GL_DEPTH_COMPONENT16 +#endif +*/ +#define LV_GL_PREFERRED_DEPTH GL_DEPTH_COMPONENT16 +#endif +#endif +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + unsigned int texture; + const lv_area_t * texture_area; + lv_opa_t opa; + int32_t disp_w; + int32_t disp_h; + const lv_area_t * texture_clip_area; + bool h_flip; + bool v_flip; + bool rb_swap; + lv_color_t fill_color; + bool blend_opt; + const lv_matrix_t * matrix; +} lv_opengles_render_params_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the render parameters with default values + * @param params pointer to an initialized `lv_opengles_render_params_t` struct + */ +void lv_opengles_render_params_init(lv_opengles_render_params_t * params); + +/** + * Render the content of the window/framebuffer using OpenGL + * @param params pointer to an initialized `lv_opengles_render_params_t` struct + */ +void lv_opengles_render(const lv_opengles_render_params_t * params); + +/** + * Render a texture using alternate blending mode, with red and blue channels flipped in the shader. + * @param texture OpenGL texture ID + * @param texture_area the area in the window to render the texture in + * @param opa opacity to blend the texture with existing contents + * @param disp_w width of the window/framebuffer being rendered to + * @param disp_h height of the window/framebuffer being rendered to + * @param h_flip horizontal flip + * @param v_flip vertical flip + */ +void lv_opengles_render_texture_rbswap(unsigned int texture, const lv_area_t * texture_area, lv_opa_t opa, + int32_t disp_w, int32_t disp_h, const lv_area_t * texture_clip_area, + bool h_flip, bool v_flip); + +/** + * Set the OpenGL viewport, with vertical co-ordinate conversion + * @param x x position of the viewport + * @param y y position of the viewport + * @param w width of the viewport + * @param h height of the viewport + */ +void lv_opengles_regular_viewport(int32_t x, int32_t y, int32_t w, int32_t h); + +void lv_opengles_render_display(lv_display_t * display, const lv_opengles_render_params_t * params); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OPENGLES*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OPENGLES_PRIVATE_H*/ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_texture.c b/inc/lvgl/src/drivers/opengles/lv_opengles_texture.c new file mode 100644 index 0000000..95fc2a2 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_texture.c @@ -0,0 +1,298 @@ +/** + * @file lv_opengles_texture.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_opengles_texture.h" +#if LV_USE_OPENGLES + +#include "lv_opengles_debug.h" +#include "lv_opengles_driver.h" + +#include "../../misc/lv_types.h" +#include "../../stdlib/lv_mem.h" +#include "lv_opengles_private.h" +#include "lv_opengles_texture_private.h" +#include "../../display/lv_display_private.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_display_t * lv_opengles_texture_create_common(int32_t w, int32_t h); +static lv_result_t lv_opengles_texture_create_draw_buffers(lv_opengles_texture_t * texture, lv_display_t * display); +static void lv_opengles_texture_attach_to_display(lv_opengles_texture_t * texture, lv_display_t * disp); +static unsigned int create_texture(int32_t w, int32_t h); +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void release_disp_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_opengles_texture_create(int32_t w, int32_t h) +{ + lv_display_t * display = lv_opengles_texture_create_common(w, h); + if(!display) { + LV_LOG_ERROR("Failed to create display"); + return NULL; + } + lv_opengles_texture_t * texture = lv_display_get_driver_data(display); + unsigned int texture_id = create_texture(w, h); + texture->texture_id = texture_id; + texture->is_texture_owner = true; + /* Attach the texture to the display after the texture id has been set*/ + lv_opengles_texture_attach_to_display(texture, display); + return display; +} + +lv_display_t * lv_opengles_texture_create_from_texture_id(int32_t w, int32_t h, unsigned int texture_id) +{ + lv_display_t * display = lv_opengles_texture_create_common(w, h); + if(!display) { + LV_LOG_ERROR("Failed to create display"); + return NULL; + } + lv_opengles_texture_t * texture = lv_display_get_driver_data(display); + texture->texture_id = texture_id; + texture->is_texture_owner = false; + /* Attach the texture to the display after the texture id has been set*/ + lv_opengles_texture_attach_to_display(texture, display); + return display; +} + +lv_result_t lv_opengles_texture_reshape(lv_opengles_texture_t * texture, lv_display_t * display, int32_t width, + int32_t height) +{ + LV_ASSERT_NULL(display); + LV_ASSERT_NULL(texture); + unsigned int new_texture = create_texture(width, height); + if(new_texture == GL_NONE) { + LV_LOG_ERROR("Failed to reshape texture. Couldn't acquire new texture from GPU"); + return LV_RESULT_INVALID; + } + +#if LV_USE_DRAW_OPENGLES + static size_t LV_ATTRIBUTE_MEM_ALIGN dummy_buf; + lv_display_set_buffers(display, &dummy_buf, NULL, width * height * 4, LV_DISPLAY_RENDER_MODE_DIRECT); +#else + uint32_t stride = lv_draw_buf_width_to_stride(width, lv_display_get_color_format(display)); + uint32_t buf_size = stride * height; + uint8_t * buffer = lv_realloc(texture->fb1, buf_size); + LV_ASSERT_MALLOC(buffer); + if(!buffer) { + GL_CALL(glDeleteTextures(1, &new_texture)); + LV_LOG_ERROR("Failed to reshape texture. Couldn't resize buffer"); + return LV_RESULT_INVALID; + } + texture->fb1 = buffer; + + lv_display_set_buffers(display, texture->fb1, NULL, buf_size, lv_display_get_render_mode(display)); +#endif /*LV_USE_DRAW_OPENGLES*/ + + if(texture->is_texture_owner && texture->texture_id != 0) { + GL_CALL(glDeleteTextures(1, &texture->texture_id)); + } + texture->texture_id = new_texture; + lv_opengles_texture_attach_to_display(texture, display); + return LV_RESULT_OK; +} + +static void lv_opengles_texture_attach_to_display(lv_opengles_texture_t * texture, lv_display_t * display) +{ + LV_ASSERT_NULL(display); + LV_UNUSED(texture); +#if !LV_USE_DRAW_NANOVG + display->layer_head->user_data = (void *)(lv_uintptr_t)texture->texture_id; +#endif /*!LV_USE_DRAW_NANOVG*/ +} + +static lv_result_t lv_opengles_texture_create_draw_buffers(lv_opengles_texture_t * texture, lv_display_t * display) +{ + int32_t w = lv_display_get_horizontal_resolution(display); + int32_t h = lv_display_get_vertical_resolution(display); + +#if LV_USE_DRAW_OPENGLES + LV_UNUSED(texture); + static size_t LV_ATTRIBUTE_MEM_ALIGN dummy_buf; + lv_display_set_buffers(display, &dummy_buf, NULL, w * h * 4, LV_DISPLAY_RENDER_MODE_DIRECT); +#else + uint32_t stride = lv_draw_buf_width_to_stride(w, lv_display_get_color_format(display)); + uint32_t buf_size = stride * h; + texture->fb1 = lv_malloc(buf_size); + LV_ASSERT_MALLOC(texture->fb1); + if(!texture->fb1) { + return LV_RESULT_INVALID; + } + lv_display_set_buffers(display, texture->fb1, NULL, buf_size, LV_DISPLAY_RENDER_MODE_DIRECT); +#endif + return LV_RESULT_OK; +} + +void lv_opengles_texture_deinit(lv_opengles_texture_t * texture) +{ +#if !LV_USE_DRAW_OPENGLES + lv_free(texture->fb1); +#endif /*!LV_USE_DRAW_OPENGLES*/ + + if(texture->is_texture_owner && texture->texture_id != 0) { + GL_CALL(glDeleteTextures(1, &texture->texture_id)); + } +} + +unsigned int lv_opengles_texture_get_texture_id(lv_display_t * disp) +{ + if(!disp) { + LV_LOG_ERROR("Invalid display"); + return 0; + } + return (unsigned int)(lv_uintptr_t)disp->layer_head->user_data; +} +lv_display_t * lv_opengles_texture_get_from_texture_id(unsigned int texture_id) +{ + lv_display_t * disp = NULL; + while(NULL != (disp = lv_display_get_next(disp))) { + unsigned int disp_texture_id = lv_opengles_texture_get_texture_id(disp); + if(disp_texture_id == texture_id) { + return disp; + } + } + return NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_display_t * lv_opengles_texture_create_common(int32_t w, int32_t h) +{ + lv_display_t * disp = lv_display_create(w, h); + if(!disp) { + LV_LOG_ERROR("Failed to create display"); + return NULL; + } + lv_opengles_texture_t * texture = lv_malloc_zeroed(sizeof(lv_opengles_texture_t)); + LV_ASSERT_MALLOC(texture); + if(!texture) { + LV_LOG_ERROR("Failed to create texture"); + lv_display_delete(disp); + return NULL; + } + lv_result_t res = lv_opengles_texture_create_draw_buffers(texture, disp); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to create draw buffers"); + lv_free(texture); + lv_display_delete(disp); + return NULL; + } + lv_display_set_resolution(disp, w, h); + lv_display_set_flush_cb(disp, flush_cb); + lv_display_set_driver_data(disp, texture); + lv_display_add_event_cb(disp, release_disp_cb, LV_EVENT_DELETE, disp); + + lv_opengles_init(); + return disp; +} + +static unsigned int create_texture(int32_t w, int32_t h) +{ + unsigned int texture; + GL_CALL(glGenTextures(1, &texture)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, texture)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + + /* set the dimensions and format to complete the texture */ + /* Color depth: 16 (RGB565), 32 (XRGB8888) */ +#if LV_COLOR_DEPTH == 16 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, + NULL)); +#elif LV_COLOR_DEPTH == 32 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)); +#else +#error("Unsupported color format") +#endif + +#if 0 + GL_CALL(glGenerateMipmap(GL_TEXTURE_2D)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 20)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)); +#else + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); +#endif + + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, GL_NONE)); + return texture; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + LV_UNUSED(area); + LV_UNUSED(px_map); + +#if !LV_USE_DRAW_OPENGLES + if(lv_display_flush_is_last(disp)) { + + lv_opengles_texture_t * texture = lv_display_get_driver_data(disp); + lv_color_format_t cf = lv_display_get_color_format(disp); + uint32_t stride = lv_draw_buf_width_to_stride(lv_display_get_horizontal_resolution(disp), cf); + + GL_CALL(glBindTexture(GL_TEXTURE_2D, texture->texture_id)); + + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + GL_CALL(glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / lv_color_format_get_size(cf))); + /*Color depth: 16 (RGB565), 32 (XRGB8888)*/ +#if LV_COLOR_DEPTH == 16 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, disp->hor_res, disp->ver_res, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, + texture->fb1)); +#elif LV_COLOR_DEPTH == 32 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, disp->hor_res, disp->ver_res, 0, GL_BGRA, GL_UNSIGNED_BYTE, + texture->fb1)); +#else +#error("Unsupported color format") +#endif + } +#endif /* !LV_USE_DRAW_OPENGLES */ + + lv_display_flush_ready(disp); +} + +static void release_disp_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_user_data(e); + lv_opengles_texture_t * texture = lv_display_get_driver_data(disp); + lv_opengles_texture_deinit(texture); + lv_free(texture); +} + +#endif /*LV_USE_OPENGLES*/ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_texture.h b/inc/lvgl/src/drivers/opengles/lv_opengles_texture.h new file mode 100644 index 0000000..2a6933a --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_texture.h @@ -0,0 +1,79 @@ +/** + * @file lv_opengles_texture.h + * + */ + +#ifndef LV_OPENGLES_TEXTURE_H +#define LV_OPENGLES_TEXTURE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_OPENGLES + +#include "../../display/lv_display.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a display that flushes to an OpenGL texture + * If you already have a texture and want to bind it to the display, + * see `lv_opengles_texture_create_from_texture_id` + * @param w width in pixels of the texture + * @param h height in pixels of the texture + * @return the new display or NULL on failure + */ +lv_display_t * lv_opengles_texture_create(int32_t w, int32_t h); + +/** + * Create a display that flushes to the provided OpenGL texture + * If you don't have a texture to bind it to the display, + * see `lv_opengles_texture_create` + * @param w width in pixels of the texture + * @param h height in pixels of the texture + * @param texture_id the texture LVGL will render to + * @return the new display or NULL on failure + */ +lv_display_t * lv_opengles_texture_create_from_texture_id(int32_t w, int32_t h, unsigned int texture_id); + +/** + * Get the OpenGL texture ID of the display + * @param disp display + * @return texture ID + */ +unsigned int lv_opengles_texture_get_texture_id(lv_display_t * disp); + +/** + * Get the display of an OpenGL texture if it is associated with one + * @param texture_id OpenGL texture ID + * @return display or `NULL` if there no display with that texture ID + */ +lv_display_t * lv_opengles_texture_get_from_texture_id(unsigned int texture_id); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_OPENGLES */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OPENGLES_TEXTURE_H*/ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_texture_private.h b/inc/lvgl/src/drivers/opengles/lv_opengles_texture_private.h new file mode 100644 index 0000000..8a957a6 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_texture_private.h @@ -0,0 +1,57 @@ +/** + * @file lv_opengles_texture_private.h + * + */ + + +#ifndef LV_OPENGLES_TEXTURE_PRIVATE_H +#define LV_OPENGLES_TEXTURE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_OPENGLES + +#include "lv_opengles_texture.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + unsigned int texture_id; +#if !LV_USE_DRAW_OPENGLES + uint8_t * fb1; +#endif /*!LV_USE_DRAW_OPENGLES*/ + bool is_texture_owner; +} lv_opengles_texture_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_result_t lv_opengles_texture_reshape(lv_opengles_texture_t * texture, lv_display_t * display, + int32_t width, int32_t height); +void lv_opengles_texture_deinit(lv_opengles_texture_t * texture); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OPENGLES*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_OPENGLES_TEXTURE_PRIVATE_H */ diff --git a/inc/lvgl/src/drivers/opengles/lv_opengles_window.h b/inc/lvgl/src/drivers/opengles/lv_opengles_window.h new file mode 100644 index 0000000..9f22af2 --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/lv_opengles_window.h @@ -0,0 +1,102 @@ +/** + * @file lv_opengles_window.h + * + */ + +#ifndef LV_OPENGLES_WINDOW_H +#define LV_OPENGLES_WINDOW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_OPENGLES + +#include "../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Delete an OpenGL window. If it is the last one, the process will exit + * @param window OpenGL window to delete + */ +void lv_opengles_window_delete(lv_opengles_window_t * window); + +/** + * Add a texture to the OpenGL window. It can be an LVGL display texture, or any OpenGL texture + * @param window OpenGL window + * @param texture_id OpenGL texture ID + * @param w width in pixels of the texture + * @param h height in pixels of the texture + * @return the new texture handle + */ +lv_opengles_window_texture_t * lv_opengles_window_add_texture(lv_opengles_window_t * window, unsigned int texture_id, + int32_t w, int32_t h); + +lv_display_t * lv_opengles_window_display_create(lv_opengles_window_t * window, int32_t w, int32_t h); + +lv_opengles_window_texture_t * lv_opengles_window_display_get_window_texture(lv_display_t * window_display); + +/** + * Remove a texture from its OpenGL window and delete it + * @param texture handle of an OpenGL window texture + */ +void lv_opengles_window_texture_remove(lv_opengles_window_texture_t * texture); + +/** + * Set the x position of a texture within its OpenGL window + * @param texture handle of an OpenGL window texture + * @param x new x position of the texture + */ +void lv_opengles_window_texture_set_x(lv_opengles_window_texture_t * texture, int32_t x); + +/** + * Set the y position of a texture within its OpenGL window + * @param texture handle of an OpenGL window texture + * @param y new y position of the texture + */ +void lv_opengles_window_texture_set_y(lv_opengles_window_texture_t * texture, int32_t y); + +/** + * Set the opacity of a texture in an OpenGL window + * @param texture handle of an OpenGL window texture + * @param opa new opacity of the texture + */ +void lv_opengles_window_texture_set_opa(lv_opengles_window_texture_t * texture, lv_opa_t opa); + +/** + * Get the mouse indev associated with a texture in an OpenGL window, if it exists + * @param texture handle of an OpenGL window texture + * @return the indev or `NULL` + * @note there will only be an indev if the texture is based on an + * LVGL display texture and the window was created with + * `use_mouse_indev` as `true` + */ +lv_indev_t * lv_opengles_window_texture_get_mouse_indev(lv_opengles_window_texture_t * texture); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_OPENGLES */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_OPENGLES_WINDOW_H */ diff --git a/inc/lvgl/src/drivers/opengles/opengl_shader/lv_opengl_shader_internal.h b/inc/lvgl/src/drivers/opengles/opengl_shader/lv_opengl_shader_internal.h new file mode 100644 index 0000000..6190d5f --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/opengl_shader/lv_opengl_shader_internal.h @@ -0,0 +1,142 @@ +/** + @file lv_opengl_shader_internal.h + * + */ + +#ifndef LV_OPENGL_SHADER_INTERNAL_H +#define LV_OPENGL_SHADER_INTERNAL_H + +#include "../../../lv_conf_internal.h" + +#if LV_USE_OPENGLES +#include "../lv_opengles_private.h" +#include "../lv_opengles_debug.h" +#include "../../../misc/lv_types.h" +#include "../../../misc/lv_rb_private.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + const char * name; + const char * source; +} lv_opengl_shader_t; + +typedef struct { + const lv_opengl_shader_t * all; + uint32_t count; +} lv_opengl_shader_portions_t; + +typedef struct { + const char * name; + const char * value; + bool value_allocated; +} lv_opengl_shader_define_t; + +typedef struct { + lv_opengl_shader_t data; + bool src_allocated; +} lv_opengl_shader_source_t; + +typedef struct { + uint32_t hash; + GLuint id; +} lv_opengl_compiled_shader_t; + +typedef struct lv_opengl_shader_cache_struct { + lv_rb_t sources_map; + lv_rb_t textures_map; + lv_rb_t compiled_shaders_map; + lv_rb_t programs_map; + GLuint bg_index_buf; + GLuint bg_vertex_buf; + GLuint bg_program; + GLuint bg_vao; +} lv_opengl_shader_manager_t; + +struct _lv_shader_program; + +typedef void (*lv_opengl_shader_program_update_uniformi_t)(struct _lv_shader_program *, const char *, int); + +typedef void (*lv_opengl_shader_program_update_uniformf_t)(struct _lv_shader_program *, const char *, float); + +typedef struct _lv_shader_program { + lv_opengl_shader_program_update_uniformi_t update_uniform_1i; + lv_opengl_shader_program_update_uniformf_t update_uniform_1f; + uint32_t id; +} lv_opengl_shader_program_t; + +typedef struct { + const char * name; + const lv_opengl_shader_define_t * permutations; + size_t permutations_len; +} lv_opengl_shader_params_t; + +typedef enum { + LV_OPENGL_GLSL_VERSION_300ES, + LV_OPENGL_GLSL_VERSION_330, + LV_OPENGL_GLSL_VERSION_100, + LV_OPENGL_GLSL_VERSION_LAST, +} lv_opengl_glsl_version_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +char * lv_opengl_shader_manager_process_includes(const char * c_src, const lv_opengl_shader_t * src_includes, + size_t num_items); + +lv_opengl_shader_program_t * lv_opengl_shader_program_create(uint32_t id); +void lv_opengl_shader_program_destroy(lv_opengl_shader_program_t * program); +GLuint lv_opengl_shader_program_get_id(lv_opengl_shader_program_t * program); + +void lv_opengl_shader_manager_init(lv_opengl_shader_manager_t * manager, const lv_opengl_shader_t * sources, + size_t len, const char * vert_src, + const char * frag_src); +void lv_opengl_shader_manager_deinit(lv_opengl_shader_manager_t * manager); +uint32_t lv_opengl_shader_hash(const char * value); +GLuint lv_opengl_shader_manager_get_texture(lv_opengl_shader_manager_t * manager, uint32_t hash); +void lv_opengl_shader_manager_store_texture(lv_opengl_shader_manager_t * manager, uint32_t hash, GLuint id); +lv_result_t lv_opengl_shader_manager_select_shader(lv_opengl_shader_manager_t * shader, const char * shader_identifier, + const lv_opengl_shader_define_t * permutations, size_t permutations_len, + lv_opengl_glsl_version_t glsl_version, uint32_t * out_hash); +lv_opengl_shader_program_t * lv_opengl_shader_manager_get_program(lv_opengl_shader_manager_t * manager, + uint32_t fragment_shader_hash, + uint32_t vertex_shader_hash); + +const char * lv_opengles_glsl_version_to_string(lv_opengl_glsl_version_t version); + +lv_opengl_shader_program_t * lv_opengl_shader_manager_compile_program(lv_opengl_shader_manager_t * manager, + const lv_opengl_shader_params_t * frag_shader, + const lv_opengl_shader_params_t * vert_shader, + lv_opengl_glsl_version_t version); + +lv_opengl_shader_program_t * lv_opengl_shader_manager_compile_program_best_version( + lv_opengl_shader_manager_t * manager, + const lv_opengl_shader_params_t * frag_shader, + const lv_opengl_shader_params_t * vert_shader, + const lv_opengl_glsl_version_t * versions, size_t version_count); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_OPENGLES*/ +#endif /*LV_OPENGL_SHADER_INTERNAL_H*/ diff --git a/inc/lvgl/src/drivers/opengles/opengl_shader/lv_opengl_shader_manager.c b/inc/lvgl/src/drivers/opengles/opengl_shader/lv_opengl_shader_manager.c new file mode 100644 index 0000000..f369d2e --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/opengl_shader/lv_opengl_shader_manager.c @@ -0,0 +1,704 @@ +/** + * @file lv_opengl_shader_manager.c + * + */ + + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_OPENGLES +#include "lv_opengl_shader_internal.h" +#include "../../../misc/lv_assert.h" +#include "../../../misc/lv_log.h" +#include "../../../misc/lv_rb.h" +#include "../../../misc/lv_types.h" +#include "../../../stdlib/lv_mem.h" +#include "../../../stdlib/lv_sprintf.h" +#include "../lv_opengles_private.h" +#include "../lv_opengles_debug.h" +#include "../../../stdlib/lv_string.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_opengl_compiled_shader_t lv_opengl_shader_texture_t; + +typedef struct { + lv_opengl_shader_program_t * program; + uint32_t vertex_shader_hash; + uint32_t fragment_shader_hash; +} lv_opengl_program_map_key_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static char * replace_word(const char * s, const char * f, const char * r); + +static lv_rb_compare_res_t +shader_source_compare_cb(const lv_opengl_shader_source_t * lhs, + const lv_opengl_shader_source_t * rhs); + +static lv_rb_compare_res_t +compiled_shader_compare_cb(const lv_opengl_compiled_shader_t * lhs, + const lv_opengl_compiled_shader_t * rhs); + +static lv_rb_compare_res_t +shader_program_compare_cb(const lv_opengl_program_map_key_t * lhs, + const lv_opengl_program_map_key_t * rhs); + +static lv_rb_t create_shader_map(const lv_opengl_shader_t * shaders, size_t len); +static bool string_ends_with(const char * value, const char * suffix); + +static char * construct_shader(const char * source, + const lv_opengl_shader_define_t * permutations, + size_t permutations_len, lv_opengl_glsl_version_t glsl_version); + +static GLuint compile_shader(const char * shader_source, bool is_vertex_shader); +static GLuint link_program(GLuint vertex_shader_id, GLuint fragment_shader_id); +static bool is_shader_compiled(GLint shader_id); +static bool is_program_linked(GLint program_id); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_opengl_shader_manager_init(lv_opengl_shader_manager_t * manager, const lv_opengl_shader_t * sources, + size_t len, const char * vert_src, + const char * frag_src) +{ + + manager->sources_map = create_shader_map(sources, len); + if(vert_src != NULL) { + lv_opengl_shader_source_t entry = { { "__MAIN__.vert", lv_strdup(vert_src) }, 1 }; + lv_rb_node_t * node = lv_rb_insert(&manager->sources_map, &entry); + LV_ASSERT_MSG(node, + "Failed to insert shader source to source map"); + lv_memcpy(node->data, &entry, sizeof(entry)); + } + if(frag_src != NULL) { + lv_opengl_shader_source_t entry = { { "__MAIN__.frag", lv_strdup(frag_src) }, 1 }; + lv_rb_node_t * node = lv_rb_insert(&manager->sources_map, &entry); + LV_ASSERT_MSG(node, "Failed to insert shader to shader map"); + lv_memcpy(node->data, &entry, sizeof(entry)); + } + + lv_rb_init(&manager->compiled_shaders_map, + (lv_rb_compare_t)compiled_shader_compare_cb, + sizeof(lv_opengl_compiled_shader_t)); + + /* Textures and compiled shaders share the same compare function */ + lv_rb_init(&manager->textures_map, + (lv_rb_compare_t)compiled_shader_compare_cb, + sizeof(lv_opengl_shader_texture_t)); + + lv_rb_init(&manager->programs_map, + (lv_rb_compare_t)shader_program_compare_cb, + sizeof(lv_opengl_program_map_key_t)); + + manager->bg_index_buf = 0; + manager->bg_vertex_buf = 0; + manager->bg_program = 0; +} + +uint32_t lv_opengl_shader_hash(const char * value) +{ + uint32_t hash = 0; + const size_t len = lv_strlen(value); + if(len == 0) { + return hash; + } + for(size_t i = 0; i < len; i++) { + hash = ((hash << 5) - hash) + value[i]; + } + return hash; +} + +void lv_opengl_shader_manager_store_texture(lv_opengl_shader_manager_t * manager, + uint32_t texture_hash, + GLuint texture_id) +{ + lv_opengl_shader_texture_t key = { .id = texture_id, .hash = texture_hash }; + lv_rb_node_t * node = lv_rb_insert(&manager->textures_map, &key); + if(!node) { + LV_LOG_WARN("Failed to cache texture hash: %d id: %d", + texture_hash, texture_id); + return; + } + + lv_memcpy(node->data, &key, sizeof(key)); +} + +GLuint lv_opengl_shader_manager_get_texture(lv_opengl_shader_manager_t * manager, + uint32_t texture_hash) +{ + lv_opengl_shader_texture_t key = { .hash = texture_hash }; + lv_rb_node_t * node = lv_rb_find(&manager->textures_map, &key); + if(!node) { + LV_LOG_INFO("Couldn't find texture with hash %d in cache", + texture_hash); + return GL_NONE; + } + return ((lv_opengl_shader_texture_t *)node->data)->id; +} + +lv_result_t lv_opengl_shader_manager_select_shader(lv_opengl_shader_manager_t * shader, const char * shader_identifier, + const lv_opengl_shader_define_t * permutations, size_t permutations_len, + lv_opengl_glsl_version_t glsl_version, uint32_t * out_hash) +{ + /* First check that the shader identifier exists */ + lv_opengl_shader_t key = { shader_identifier, NULL }; + lv_rb_node_t * source_node = lv_rb_find(&shader->sources_map, &key); + LV_LOG_TRACE("Select shader '%s'", shader_identifier); + + if(!source_node) { + LV_LOG_WARN("Couldn't find shader %s", shader_identifier); + return LV_RESULT_INVALID; + } + + /* Then hash the name with the permutations and see if we already compiled it */ + char define[512]; + uint32_t hash = lv_opengl_shader_hash(shader_identifier); + for(size_t i = 0; i < permutations_len; ++i) { + LV_ASSERT_NULL(permutations[i].name); + if(permutations[i].value) { + lv_snprintf(define, sizeof(define), "%s%s", permutations[i].name, permutations[i].value); + } + else { + lv_snprintf(define, sizeof(define), "%s", permutations[i].name); + } + hash ^= lv_opengl_shader_hash(define); + } + /* hash the version so that the same shader with different versions produces a different hash*/ + hash ^= lv_opengl_shader_hash(lv_opengles_glsl_version_to_string(glsl_version)); + + lv_opengl_compiled_shader_t shader_map_key = { hash, 0 }; + lv_rb_node_t * shader_map_node = + lv_rb_find(&shader->compiled_shaders_map, &shader_map_key); + + /* Fast path. Shader already compiled */ + if(shader_map_node != NULL) { + LV_LOG_INFO("Shader '%s' with hash %u found. Id: %d", shader_identifier, hash, + ((lv_opengl_compiled_shader_t *)shader_map_node->data)->id); + *out_hash = hash; + return LV_RESULT_OK; + } + + /* New shader requested, construct and compile it */ + bool is_vertex = string_ends_with(shader_identifier, ".vert"); + const char * original_shader_source = ((lv_opengl_shader_source_t *)source_node->data)->data.source; + + char * shader_source = construct_shader(original_shader_source, + permutations, permutations_len, glsl_version); + + shader_map_key.id = compile_shader(shader_source, is_vertex); + lv_free(shader_source); + + if(!is_shader_compiled(shader_map_key.id)) { + GLchar info_log[512]; + GL_CALL(glGetShaderInfoLog(shader_map_key.id, sizeof(info_log), NULL, info_log)); + LV_LOG_WARN("Failed to compile shader for glsl version '%s': %s", lv_opengles_glsl_version_to_string(glsl_version), + info_log); + GL_CALL(glDeleteShader(shader_map_key.id)); + return LV_RESULT_INVALID; + } + + LV_LOG_TRACE("Compiled %s shader %s to %d Hash %u", is_vertex ? "V" : "F", shader_identifier, shader_map_key.id, hash); + lv_rb_node_t * node = lv_rb_insert(&shader->compiled_shaders_map, &shader_map_key); + LV_ASSERT_MSG(node, "Failed to insert shader to shader map"); + lv_memcpy(node->data, &shader_map_key, sizeof(shader_map_key)); + + *out_hash = hash; + + return LV_RESULT_OK; +} + +lv_opengl_shader_program_t * +lv_opengl_shader_manager_get_program(lv_opengl_shader_manager_t * manager, + uint32_t fragment_shader_hash, + uint32_t vertex_shader_hash) +{ + lv_opengl_program_map_key_t key = { + .vertex_shader_hash = vertex_shader_hash, + .fragment_shader_hash = fragment_shader_hash + }; + + lv_rb_node_t * node = lv_rb_find(&manager->programs_map, &key); + if(node) { + return ((lv_opengl_program_map_key_t *)node->data)->program; + } + + lv_opengl_compiled_shader_t shader_key = { .hash = vertex_shader_hash }; + lv_rb_node_t * vertex_node = + lv_rb_find(&manager->compiled_shaders_map, &shader_key); + shader_key.hash = fragment_shader_hash; + lv_rb_node_t * fragment_node = + lv_rb_find(&manager->compiled_shaders_map, &shader_key); + + LV_ASSERT_FORMAT_MSG( + vertex_node, + "Unable to find to find vertex shader with hash %d", + vertex_shader_hash); + LV_ASSERT_FORMAT_MSG( + fragment_node, + "Unable to find to find fragment shader with hash %d", + fragment_shader_hash); + + const GLuint vertex_shader_id = + ((lv_opengl_compiled_shader_t *)vertex_node->data)->id; + const GLuint fragment_shader_id = + ((lv_opengl_compiled_shader_t *)fragment_node->data)->id; + + GLuint program_id = link_program(vertex_shader_id, fragment_shader_id); + bool is_linked = is_program_linked(program_id); + if(!is_linked) { + GLchar info_log[512]; + GL_CALL(glGetProgramInfoLog(program_id, sizeof(info_log), NULL, + info_log)); + LV_LOG_WARN("Failed to link program: %s", info_log); + GL_CALL(glDeleteProgram(program_id)); + return NULL; + } + LV_LOG_TRACE("Linking program with shaders V: %d F:%d P: %d", vertex_shader_id, fragment_shader_id, program_id); + + lv_opengl_shader_program_t * program = + lv_opengl_shader_program_create(program_id); + + LV_ASSERT_MSG(program, "Failed to create program"); + + lv_opengl_program_map_key_t prog_key = { + .program = program, + .fragment_shader_hash = fragment_shader_hash, + .vertex_shader_hash = vertex_shader_hash + }; + node = lv_rb_insert(&manager->programs_map, &prog_key); + LV_ASSERT_MSG(node, "Failed to store program in cache"); + lv_memcpy(node->data, &prog_key, sizeof(prog_key)); + return program; +} + +lv_opengl_shader_program_t * lv_opengl_shader_manager_compile_program(lv_opengl_shader_manager_t * manager, + const lv_opengl_shader_params_t * frag_shader, + const lv_opengl_shader_params_t * vert_shader, + lv_opengl_glsl_version_t version) +{ + uint32_t frag_shader_hash; + uint32_t vert_shader_hash; + + lv_result_t res = lv_opengl_shader_manager_select_shader(manager, frag_shader->name, frag_shader->permutations, + frag_shader->permutations_len, + version, &frag_shader_hash); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("Failed to compile shader for glsl version %s", lv_opengles_glsl_version_to_string(version)); + return NULL; + } + + res = lv_opengl_shader_manager_select_shader(manager, vert_shader->name, vert_shader->permutations, + vert_shader->permutations_len, + version, &vert_shader_hash); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("Failed to compile shader for glsl version %s", lv_opengles_glsl_version_to_string(version)); + return NULL; + } + lv_opengl_shader_program_t * program = + lv_opengl_shader_manager_get_program(manager, frag_shader_hash, vert_shader_hash); + + if(!program) { + LV_LOG_WARN("Failed to link program for glsl version %s", lv_opengles_glsl_version_to_string(version)); + } + + return program; +} + +lv_opengl_shader_program_t * lv_opengl_shader_manager_compile_program_best_version( + lv_opengl_shader_manager_t * manager, + const lv_opengl_shader_params_t * frag_shader, + const lv_opengl_shader_params_t * vert_shader, + const lv_opengl_glsl_version_t * versions, size_t version_count) +{ + for(size_t i = 0; i < version_count; ++i) { + lv_opengl_shader_program_t * program = lv_opengl_shader_manager_compile_program(manager, frag_shader, vert_shader, + versions[i]); + if(program) { + return program; + } + } + return NULL; +} + +void lv_opengl_shader_manager_deinit(lv_opengl_shader_manager_t * manager) +{ + LV_LOG_INFO("Destroying shader cache"); + + lv_rb_destroy(&manager->textures_map); + + lv_rb_node_t * node; + + while((node = manager->sources_map.root)) { + lv_opengl_shader_source_t * shader = node->data; + if(shader->src_allocated) { + lv_free((void *)shader->data.source); + } + lv_rb_drop_node(&manager->sources_map, node); + } + lv_rb_destroy(&manager->sources_map); + + while((node = manager->compiled_shaders_map.root)) { + lv_opengl_compiled_shader_t * shader = node->data; + GL_CALL(glDeleteShader(shader->id)); + lv_rb_drop_node(&manager->compiled_shaders_map, node); + } + + lv_rb_destroy(&manager->compiled_shaders_map); + while((node = manager->programs_map.root)) { + lv_opengl_program_map_key_t * program_key = node->data; + lv_opengl_shader_program_destroy(program_key->program); + lv_rb_drop_node(&manager->programs_map, node); + } + lv_rb_destroy(&manager->programs_map); + +} + +const char * lv_opengles_glsl_version_to_string(lv_opengl_glsl_version_t version) +{ + + switch(version) { + case LV_OPENGL_GLSL_VERSION_100: + return "#version 100\n"; + case LV_OPENGL_GLSL_VERSION_300ES: + return "#version 300 es\n"; + case LV_OPENGL_GLSL_VERSION_330: + return "#version 330\n"; + case LV_OPENGL_GLSL_VERSION_LAST: + LV_LOG_ERROR("LV_OPENGL_GLSL_VERSION_LAST is not a valid version"); + return NULL; + } + LV_UNREACHABLE(); +} + +char * lv_opengl_shader_manager_process_includes(const char * c_src, const lv_opengl_shader_t * src_includes, + size_t num_items) +{ + if(!c_src || !src_includes) { + return NULL; + } + + char * rep = lv_strdup(c_src); + if(!rep) { + return NULL; + } + char search_str[255]; + + for(size_t i = 0; i < num_items; i++) { + lv_snprintf(search_str, sizeof(search_str), "\n#include <%s>", src_includes[i].name); + + char * new_rep = replace_word(rep, search_str, src_includes[i].source); + lv_free(rep); + if(!new_rep) { + return NULL; + } + rep = new_rep; + } + + return rep; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static char * replace_word(const char * source, const char * f, const char * r) +{ + if(!source || !f || !r || strlen(f) == 0 || strcmp(f, r) == 0 || !strstr(source, f)) { + return lv_strdup(source); + } + + size_t s_len = strlen(source); + size_t f_len = strlen(f); + size_t r_len = strlen(r); + + size_t count = 0; + const char * temp = source; + while((temp = strstr(temp, f)) != NULL) { + count++; + temp += f_len; + } + + size_t new_size = s_len + count * (r_len - f_len) + 1; + char * result = lv_malloc(new_size); + LV_ASSERT_MALLOC(result); + + char * dest = result; + const char * src = source; + const char * pos; + + while((pos = strstr(src, f)) != NULL) { + size_t prefix_len = pos - src; + memcpy(dest, src, prefix_len); + dest += prefix_len; + + memcpy(dest, r, r_len); + dest += r_len; + + src = pos + f_len; + } + + strcpy(dest, src); + + return result; +} + +static lv_rb_compare_res_t +shader_program_compare_cb(const lv_opengl_program_map_key_t * lhs, + const lv_opengl_program_map_key_t * rhs) +{ + const lv_rb_compare_res_t cmp = lhs->vertex_shader_hash - rhs->vertex_shader_hash; + if(cmp == 0) { + return lhs->fragment_shader_hash - rhs->fragment_shader_hash; + } + return cmp; +} + +static lv_rb_compare_res_t +shader_source_compare_cb(const lv_opengl_shader_source_t * lhs, + const lv_opengl_shader_source_t * rhs) +{ + return lv_strcmp(lhs->data.name, rhs->data.name); +} + +static lv_rb_compare_res_t +compiled_shader_compare_cb(const lv_opengl_compiled_shader_t * lhs, + const lv_opengl_compiled_shader_t * rhs) +{ + return lhs->hash - rhs->hash; +} +static bool is_shader_compiled(GLint shader_id) +{ + int shader_compiled; + GL_CALL(glGetShaderiv(shader_id, GL_COMPILE_STATUS, &shader_compiled)); + return shader_compiled; +} + +static bool is_program_linked(GLint program_id) +{ + int link_status; + GL_CALL(glGetProgramiv(program_id, GL_LINK_STATUS, &link_status)); + return link_status; +} +static GLuint compile_shader(const char * shader_source, bool is_vertex_shader) +{ + GLuint shader_id; + if(is_vertex_shader) { + GL_CALL(shader_id = glCreateShader(GL_VERTEX_SHADER)); + } + else { + GL_CALL(shader_id = glCreateShader(GL_FRAGMENT_SHADER)); + } + + GL_CALL(glShaderSource(shader_id, 1, (const char **)&shader_source, + NULL)); + GL_CALL(glCompileShader(shader_id)); + + return shader_id; +} + +static GLuint link_program(GLuint vertex_shader_id, GLuint fragment_shader_id) +{ + GLuint program_id; + GL_CALL(program_id = glCreateProgram()); + GL_CALL(glAttachShader(program_id, fragment_shader_id)); + GL_CALL(glAttachShader(program_id, vertex_shader_id)); + GL_CALL(glLinkProgram(program_id)); + + return program_id; +} + +static char * append_to_shader(char * dst, const char * src, size_t * curr_index) +{ + lv_strcpy(dst + *curr_index, src); + *curr_index += lv_strlen(src); + return dst; +} + +static char * construct_shader(const char * source, + const lv_opengl_shader_define_t * permutations, + size_t permutations_len, lv_opengl_glsl_version_t glsl_version) +{ + const char * defines = lv_opengles_glsl_version_to_string(glsl_version); + const char * prefix = "#define "; + + const size_t prefix_len = lv_strlen(prefix); + size_t shader_source_size = lv_strlen(defines) + lv_strlen(source); + + /* First calculate the necessary size */ + for(size_t i = 0; i < permutations_len; ++i) { + shader_source_size += prefix_len; + if(!permutations[i].name) { + LV_LOG_WARN("Name is NULL for permutation # %zu", i); + continue; + } + shader_source_size += + lv_strlen(permutations[i].name) + 1; /* ' ' */ + if(permutations[i].value) { + shader_source_size += + lv_strlen(permutations[i].value) + 1; /* '\n' */ + } + } + + /* Allocate enough for memory with calculated size*/ + char * result = (char *)lv_malloc(shader_source_size + 1); + if(!result) { + LV_LOG_ERROR( + "Failed to allocate enough space for shader changes"); + return 0; + } + + /* Construct shader */ + size_t curr_index = 0; + append_to_shader(result, defines, &curr_index); + for(size_t i = 0; i < permutations_len; ++i) { + if(!permutations[i].name) { + continue; + } + append_to_shader(result, prefix, &curr_index); + append_to_shader(result, permutations[i].name, &curr_index); + if(permutations[i].value) { + result[curr_index++] = ' '; + append_to_shader(result, permutations[i].value, + &curr_index); + } + result[curr_index++] = '\n'; + } + append_to_shader(result, source, &curr_index); + LV_ASSERT(curr_index == shader_source_size); + result[shader_source_size] = '\0'; + return result; +} + +static char * replace_include(const char * source, const char * pattern, + const char * replacement) +{ + const char * pos = strstr(source, pattern); + LV_ASSERT(pos); + + const size_t source_len = lv_strlen(source); + const size_t pattern_len = lv_strlen(pattern); + const size_t replacement_len = lv_strlen(replacement); + + const size_t new_len = source_len - pattern_len + replacement_len; + + char * result = (char *)lv_malloc(new_len + 1); + if(!result) { + return NULL; + } + + const size_t before_len = pos - source; + lv_memcpy(result, source, before_len); + lv_memcpy(result + before_len, replacement, replacement_len); + lv_strcpy(result + before_len + replacement_len, pos + pattern_len); + + /* Replace other patterns with whitespaces */ + while((pos = strstr(result, pattern))) { + lv_memset((void *)pos, ' ', pattern_len); + } + result[new_len] = '\0'; + + return result; +} +static lv_rb_t create_shader_map(const lv_opengl_shader_t * shaders, size_t len) +{ + lv_rb_t map; + lv_rb_init(&map, (lv_rb_compare_t)shader_source_compare_cb, + sizeof(lv_opengl_shader_source_t)); + + char pattern[256]; + for(size_t i = 0; i < len; i++) { + if(strlen(shaders[i].source) == 0) { + LV_LOG_WARN("Shader %s at index %zu is empty\n", + shaders[i].name, i); + continue; + } + lv_opengl_shader_source_t value = { + .data = { + .name = shaders[i].name, + .source = shaders[i].source + }, + .src_allocated = false + }; + + for(size_t j = 0; j < len; j++) { + const char * source = value.data.source; + const char * include_name = shaders[j].name; + const char * include_source = shaders[j].source; + const size_t include_name_len = strlen(include_name); + const size_t include_source_len = + strlen(include_source); + if(include_name_len == 0 || include_source_len == 0) { + continue; + } + lv_snprintf(pattern, sizeof(pattern), "#include <%s>", + include_name); + const char * include_pattern = strstr(source, pattern); + if(include_pattern == NULL) { + continue; + } + LV_LOG_TRACE("Replacing %s", pattern); + char * new_source = replace_include(source, pattern, + include_source); + LV_ASSERT_MSG( + new_source, + "Failed to allocate memory to replace shader include with source code"); + + if(value.src_allocated) { + lv_free((void *)value.data.source); + } + value.data.source = new_source; + value.src_allocated = true; + } + if(strstr(value.data.source, "#include")) { + LV_LOG_ERROR( + "Couldn't replace every include in shader %s. Last result:\n%s", + value.data.name, value.data.source); + LV_ASSERT_MSG( + 0, + "Refusing to continue execution with incorrect shaders"); + } + + lv_rb_node_t * node = lv_rb_insert(&map, &value); + LV_ASSERT_MSG(node, + "Failed to allocate memory for shader map entry"); + lv_memcpy(node->data, &value, sizeof(value)); + } + return map; +} + +static bool string_ends_with(const char * value, const char * suffix) +{ + const size_t value_len = strlen(value); + const size_t suffix_len = strlen(suffix); + + if(value_len < suffix_len) { + return false; + } + + return lv_streq(value + value_len - suffix_len, suffix); +} + +#endif /*LV_USE_OPENGLES*/ diff --git a/inc/lvgl/src/drivers/opengles/opengl_shader/lv_opengl_shader_program.c b/inc/lvgl/src/drivers/opengles/opengl_shader/lv_opengl_shader_program.c new file mode 100644 index 0000000..ce70a5b --- /dev/null +++ b/inc/lvgl/src/drivers/opengles/opengl_shader/lv_opengl_shader_program.c @@ -0,0 +1,146 @@ +/** + * @file lv_opengl_shader_program.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_opengl_shader_internal.h" + +#if LV_USE_OPENGLES + +#include "../lv_opengles_private.h" +#include "../lv_opengles_debug.h" +#include "../../../misc/lv_assert.h" +#include "../../../stdlib/lv_mem.h" +/********************* + * DEFINES + *********************/ + +#define INVALID_LOCATION 0xFFFFFFFFu + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void update_uniform_1i(lv_opengl_shader_program_t * program, const char * prop, + int value); + +static void update_uniform_1f(lv_opengl_shader_program_t * program, const char * prop, + float value); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_opengl_shader_program_t * lv_opengl_shader_program_create(unsigned int _program) +{ + lv_opengl_shader_program_t * program = lv_malloc(sizeof(*program)); + LV_ASSERT_MALLOC(program); + if(!program) { + return NULL; + } + program->update_uniform_1i = &update_uniform_1i; + program->update_uniform_1f = &update_uniform_1f; + program->id = _program; + + return program; +} + +void lv_opengl_shader_program_destroy(lv_opengl_shader_program_t * program) +{ +#ifndef __EMSCRIPTEN__ + GLint shader_num = 0; + GL_CALL(glGetProgramiv(program->id, GL_ATTACHED_SHADERS, &shader_num)); + + if(shader_num > 0) { + GLuint * shader_names = lv_malloc(shader_num * sizeof(GLuint)); + + if(shader_names) { + GLsizei shader_count; + GL_CALL(glGetAttachedShaders(program->id, shader_num, &shader_count, + shader_names)); + + // Detach and delete each shader + for(GLsizei i = 0; i < shader_count && i < shader_num; ++i) { + if(shader_names[i] != 0) + GL_CALL(glDetachShader(program->id, shader_names[i])); + } + lv_free(shader_names); + } + } +#endif + + /* We should be able to call the function below without issue at this point + * but because of subtle issues regarding lazy updates of shader resources + * this induces significant pause on some platforms. Since the shaders + * have already been detached, we can safely skip this function and leave + * the empty programs in OpenGL's cache until the app shuts down, it's a + * very small amount of memory. + * + * To-do: Consider setting a flag at this point and if that flag is true + * when the app finally shuts down, then perform the glDeleteProgram calls + * if necessary. That is not really necessary, OpenGL will do that anyways + * when it shuts down. */ + + /* GL_CALL(glDeleteProgram(program->id)); */ + lv_free(program); +} + +GLuint lv_opengl_shader_program_get_id(lv_opengl_shader_program_t * program) +{ + LV_ASSERT_NULL(program); + return program->id; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + + +static void update_uniform_1i(lv_opengl_shader_program_t * program, const char * prop, + int value) +{ + GLuint location = glGetUniformLocation(program->id, prop); + LV_ASSERT_FORMAT_MSG(location != INVALID_LOCATION, + "Uniform '%s' not found in program %d", + prop, program->id); + if(location == INVALID_LOCATION) { + LV_LOG_ERROR("Uniform '%s' not found in program %d", prop, + program->id); + return; + } + GL_CALL(glUniform1i(location, value)); +} + +static void update_uniform_1f(lv_opengl_shader_program_t * program, const char * prop, + float value) +{ + GLuint location = glGetUniformLocation(program->id, prop); + + LV_ASSERT_FORMAT_MSG(location != INVALID_LOCATION, + "Uniform '%s' not found in program %d", + prop, program->id); + if(location == INVALID_LOCATION) { + LV_LOG_ERROR("Uniform '%s' not found in program %d", prop, + program->id); + return; + } + GL_CALL(glUniform1f(location, value)); +} + +#endif /*LV_USE_OPENGLES*/ diff --git a/inc/lvgl/src/drivers/qnx/lv_qnx.c b/inc/lvgl/src/drivers/qnx/lv_qnx.c new file mode 100644 index 0000000..f31e727 --- /dev/null +++ b/inc/lvgl/src/drivers/qnx/lv_qnx.c @@ -0,0 +1,542 @@ +/** + * @file lv_qnx.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_qnx.h" +#if LV_USE_QNX +#include +#include "../../core/lv_refr.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_global.h" +#include "../../display/lv_display_private.h" +#include "../../lv_init.h" +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + screen_window_t window; + screen_buffer_t buffers[LV_QNX_BUF_COUNT]; + int bufidx; + bool managed; + lv_indev_t * pointer; + lv_indev_t * keyboard; +} lv_qnx_window_t; + +typedef struct { + int pos[2]; + int buttons; +} lv_qnx_pointer_t; + +typedef struct { + int key; + int flags; +} lv_qnx_keyboard_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static uint32_t get_ticks(void); +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); +static bool window_create(lv_display_t * disp); +static bool init_display_from_window(lv_display_t * disp); +static void get_pointer(lv_indev_t * indev, lv_indev_data_t * data); +static void get_key(lv_indev_t * indev, lv_indev_data_t * data); +static bool handle_pointer_event(lv_display_t * disp, screen_event_t event); +static bool handle_keyboard_event(lv_display_t * disp, screen_event_t event); +static void release_disp_cb(lv_event_t * e); +static void refresh_cb(lv_timer_t * timer); + +/*********************** + * GLOBAL PROTOTYPES + ***********************/ + +static screen_context_t context; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_qnx_window_create(int32_t hor_res, int32_t ver_res) +{ + static bool inited = false; + + if(!inited) { + if(screen_create_context(&context, + SCREEN_APPLICATION_CONTEXT) != 0) { + LV_LOG_ERROR("screen_create_context: %s", strerror(errno)); + return NULL; + } + + lv_tick_set_cb(get_ticks); + inited = true; + } + + lv_qnx_window_t * dsc = lv_malloc_zeroed(sizeof(lv_qnx_window_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + lv_display_add_event_cb(disp, release_disp_cb, LV_EVENT_DELETE, disp); + lv_display_set_driver_data(disp, dsc); + if(!window_create(disp)) { + lv_free(dsc); + return NULL; + } + + lv_display_set_flush_cb(disp, flush_cb); + + if(!init_display_from_window(disp)) { + screen_destroy_window(dsc->window); + lv_free(dsc); + return NULL; + } + + /*Replace the default refresh timer handler, so that we can run it on + *demand instead of constantly.*/ + lv_timer_t * refr_timer = lv_display_get_refr_timer(disp); + lv_timer_set_cb(refr_timer, refresh_cb); + + return disp; +} + +void lv_qnx_window_set_title(lv_display_t * disp, const char * title) +{ + lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); + if(!dsc->managed) { + /*Can't set title if there is no window manager*/ + return; + } + + screen_event_t event; + screen_create_event(&event); + + char title_buf[64]; + lv_snprintf(title_buf, sizeof(title_buf), "Title=%s", title); + + int type = SCREEN_EVENT_MANAGER; + screen_set_event_property_iv(event, SCREEN_PROPERTY_TYPE, &type); + screen_set_event_property_cv(event, SCREEN_PROPERTY_USER_DATA, + sizeof(title_buf), title_buf); + screen_set_event_property_pv(event, SCREEN_PROPERTY_WINDOW, + (void **)&dsc->window); + screen_set_event_property_pv(event, SCREEN_PROPERTY_CONTEXT, + (void **)&context); + + screen_inject_event(NULL, event); +} + +bool lv_qnx_add_pointer_device(lv_display_t * disp) +{ + lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); + if(dsc->pointer != NULL) { + /*Only one pointer device per display*/ + return false; + } + + lv_qnx_pointer_t * ptr_dsc = lv_malloc_zeroed(sizeof(lv_qnx_pointer_t)); + LV_ASSERT_MALLOC(ptr_dsc); + if(ptr_dsc == NULL) { + return false; + } + + dsc->pointer = lv_indev_create(); + if(dsc->pointer == NULL) { + lv_free(ptr_dsc); + return false; + } + + lv_indev_set_type(dsc->pointer, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(dsc->pointer, get_pointer); + lv_indev_set_driver_data(dsc->pointer, ptr_dsc); + lv_indev_set_mode(dsc->pointer, LV_INDEV_MODE_EVENT); + return true; +} + +bool lv_qnx_add_keyboard_device(lv_display_t * disp) +{ + lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); + if(dsc->keyboard != NULL) { + /*Only one keyboard device per display*/ + return false; + } + + lv_qnx_keyboard_t * kbd_dsc = lv_malloc_zeroed(sizeof(lv_qnx_keyboard_t)); + LV_ASSERT_MALLOC(kbd_dsc); + if(dsc == NULL) { + return false; + } + + dsc->keyboard = lv_indev_create(); + if(dsc->keyboard == NULL) { + lv_free(kbd_dsc); + return false; + } + + lv_indev_set_type(dsc->keyboard, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(dsc->keyboard, get_key); + lv_indev_set_driver_data(dsc->keyboard, kbd_dsc); + lv_indev_set_mode(dsc->keyboard, LV_INDEV_MODE_EVENT); + return true; +} + +int lv_qnx_event_loop(lv_display_t * disp) +{ + lv_refr_now(disp); + + /*Run the event loop*/ + screen_event_t event; + if(screen_create_event(&event) != 0) { + LV_LOG_ERROR("screen_create_event: %s", strerror(errno)); + return EXIT_FAILURE; + } + + uint64_t timeout_ns = 0; + for(;;) { + /*Wait for an event, timing out after 16ms if animations are running*/ + if(screen_get_event(context, event, timeout_ns) != 0) { + LV_LOG_ERROR("screen_get_event: %s", strerror(errno)); + return EXIT_FAILURE; + } + + /*Get the event's type*/ + int type; + if(screen_get_event_property_iv(event, SCREEN_PROPERTY_TYPE, &type) + != 0) { + LV_LOG_ERROR("screen_get_event_property_iv(TYPE): %s", strerror(errno)); + return EXIT_FAILURE; + } + + if(type == SCREEN_EVENT_POINTER) { + if(!handle_pointer_event(disp, event)) { + return EXIT_FAILURE; + } + } + else if(type == SCREEN_EVENT_KEYBOARD) { + if(!handle_keyboard_event(disp, event)) { + return EXIT_FAILURE; + } + } + else if(type == SCREEN_EVENT_MANAGER) { + /*Only sub-type supported is closing the window*/ + break; + } + + /*Calculate the next timeout*/ + uint32_t timeout_ms = lv_timer_handler(); + if(timeout_ms == LV_NO_TIMER_READY) { + timeout_ns = -1ULL; + } + else { + timeout_ns = (uint64_t)timeout_ms * 1000000UL; + } + } + + return EXIT_SUCCESS; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t get_ticks(void) +{ + uint64_t const ns = clock_gettime_mon_ns(); + return (uint32_t)(ns / 1000000UL); +} + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); + if(screen_post_window(dsc->window, dsc->buffers[dsc->bufidx], 0, NULL, 0) + != 0) { + LV_LOG_ERROR("screen_post_window: %s", strerror(errno)); + } + +#if (LV_QNX_BUF_COUNT > 1) + dsc->bufidx = 1 - dsc->bufidx; +#endif + + lv_display_flush_ready(disp); +} + +static bool window_create(lv_display_t * disp) +{ + /*Create a window*/ + lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); + if(screen_create_window(&dsc->window, context) != 0) { + LV_LOG_ERROR("screen_create_window: %s", strerror(errno)); + return false; + } + + /*Set window properties*/ + int rect[] = { 0, 0, disp->hor_res, disp->ver_res }; + if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_POSITION, + &rect[0]) != 0) { + LV_LOG_ERROR("screen_window_set_property_iv(POSITION): %s", strerror(errno)); + return false; + } + + if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_SIZE, + &rect[2]) != 0) { + LV_LOG_ERROR("screen_window_set_property_iv(SIZE): %s", strerror(errno)); + return false; + } + + if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_SOURCE_SIZE, + &rect[2]) != 0) { + LV_LOG_ERROR("screen_window_set_property_iv(SOURCE_SIZE): %s", strerror(errno)); + return NULL; + } + + int usage = SCREEN_USAGE_WRITE; + if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_USAGE, + &usage) != 0) { + LV_LOG_ERROR("screen_window_set_property_iv(USAGE): %s", strerror(errno)); + return NULL; + } + + int format = SCREEN_FORMAT_RGBA8888; + if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_FORMAT, + &format) != 0) { + LV_LOG_ERROR("screen_window_set_property_iv(USAGE): %s", strerror(errno)); + return NULL; + } + + /*Initialize window buffers*/ + if(screen_create_window_buffers(dsc->window, LV_QNX_BUF_COUNT) != 0) { + LV_LOG_ERROR("screen_create_window_buffers: %s", strerror(errno)); + return false; + } + + if(screen_get_window_property_pv(dsc->window, SCREEN_PROPERTY_BUFFERS, + (void **)&dsc->buffers) != 0) { + LV_LOG_ERROR("screen_get_window_property_pv(BUFFERS): %s", strerror(errno)); + return false; + } + + /*Connect to the window manager. Can legitimately fail if one is not running*/ + if(screen_manage_window(dsc->window, "Frame=Y") == 0) { + dsc->managed = true; + } + else { + dsc->managed = false; + } + + int visible = 1; + if(screen_set_window_property_iv(dsc->window, SCREEN_PROPERTY_VISIBLE, + &visible) != 0) { + LV_LOG_ERROR("screen_set_window_property_iv(VISIBLE): %s", strerror(errno)); + return false; + } + + return true; +} + +static bool init_display_from_window(lv_display_t * disp) +{ + lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); + + int bufsize; + if(screen_get_buffer_property_iv(dsc->buffers[0], SCREEN_PROPERTY_SIZE, + &bufsize) == -1) { + LV_LOG_ERROR("screen_get_buffer_property_iv(SIZE): %s", strerror(errno)); + return false; + } + + void * ptr1 = NULL; + if(screen_get_buffer_property_pv(dsc->buffers[0], SCREEN_PROPERTY_POINTER, + &ptr1) == -1) { + LV_LOG_ERROR("screen_get_buffer_property_pv(POINTER): %s", strerror(errno)); + return false; + } + + void * ptr2 = NULL; +#if (LV_QNX_BUF_COUNT > 1) + if(screen_get_buffer_property_pv(dsc->buffers[1], SCREEN_PROPERTY_POINTER, + &ptr2) == -1) { + LV_LOG_ERROR("screen_get_buffer_property_pv(POINTER): %s", strerror(errno)); + return false; + } +#endif + + lv_display_set_buffers(disp, ptr1, ptr2, bufsize, LV_DISPLAY_RENDER_MODE_FULL); + return true; +} + +static void release_disp_cb(lv_event_t * e) +{ + lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); + lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); + + if(dsc->window != NULL) { + screen_destroy_window(dsc->window); + } + + if(dsc->pointer != NULL) { + lv_free(dsc->pointer); + } + + if(dsc->keyboard != NULL) { + lv_free(dsc->keyboard); + } + + lv_free(dsc); + lv_display_set_driver_data(disp, NULL); +} + +static void get_pointer(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_qnx_pointer_t * dsc = lv_indev_get_driver_data(indev); + + data->point.x = dsc->pos[0]; + data->point.y = dsc->pos[1]; + if((dsc->buttons & SCREEN_LEFT_MOUSE_BUTTON) != 0) { + data->state = LV_INDEV_STATE_PRESSED; + } + else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +static bool handle_pointer_event(lv_display_t * disp, screen_event_t event) +{ + lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); + if(dsc->pointer == NULL) return true; + + lv_qnx_pointer_t * ptr_dsc = lv_indev_get_driver_data(dsc->pointer); + + if(screen_get_event_property_iv(event, SCREEN_PROPERTY_SOURCE_POSITION, + ptr_dsc->pos) + != 0) { + LV_LOG_ERROR("screen_get_event_property_iv(SOURCE_POSITION): %s", strerror(errno)); + return false; + } + + if(screen_get_event_property_iv(event, SCREEN_PROPERTY_BUTTONS, + &ptr_dsc->buttons) + != 0) { + LV_LOG_ERROR("screen_get_event_property_iv(BUTTONS): %s", strerror(errno)); + return false; + } + + lv_indev_read(dsc->pointer); + return true; +} + +static void get_key(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_qnx_keyboard_t * dsc = lv_indev_get_driver_data(indev); + + if((dsc->flags & KEY_DOWN) != 0) { + data->state = LV_INDEV_STATE_PRESSED; + data->key = dsc->key; + } + else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +static bool handle_keyboard_event(lv_display_t * disp, screen_event_t event) +{ + lv_qnx_window_t * dsc = lv_display_get_driver_data(disp); + if(dsc->keyboard == NULL) return true; + + lv_qnx_keyboard_t * kbd_dsc = lv_indev_get_driver_data(dsc->keyboard); + + /*Get event data*/ + if(screen_get_event_property_iv(event, SCREEN_PROPERTY_FLAGS, + &kbd_dsc->flags) + != 0) { + LV_LOG_ERROR("screen_get_event_property_iv(FLAGS): %s", strerror(errno)); + return false; + } + + if(screen_get_event_property_iv(event, SCREEN_PROPERTY_SYM, + &kbd_dsc->key) + != 0) { + LV_LOG_ERROR("screen_get_event_property_iv(SYM): %s", strerror(errno)); + return false; + } + + /*Translate special keys*/ + switch(kbd_dsc->key) { + case KEYCODE_UP: + kbd_dsc->key = LV_KEY_UP; + break; + + case KEYCODE_DOWN: + kbd_dsc->key = LV_KEY_DOWN; + break; + + case KEYCODE_LEFT: + kbd_dsc->key = LV_KEY_LEFT; + break; + + case KEYCODE_RIGHT: + kbd_dsc->key = LV_KEY_RIGHT; + break; + + case KEYCODE_RETURN: + kbd_dsc->key = LV_KEY_ENTER; + break; + + case KEYCODE_BACKSPACE: + kbd_dsc->key = LV_KEY_BACKSPACE; + break; + + case KEYCODE_HOME: + kbd_dsc->key = LV_KEY_HOME; + break; + + case KEYCODE_END: + kbd_dsc->key = LV_KEY_END; + break; + + case KEYCODE_DELETE: + kbd_dsc->key = LV_KEY_DEL; + break; + + default: + /*Ignore other non-ASCII keys, including modifiers*/ + if(kbd_dsc->key > 0xff) return true; + } + + lv_indev_read(dsc->keyboard); + return true; +} + +static void refresh_cb(lv_timer_t * timer) +{ + /*Refresh the window on timeout, but disable the timer. Any callback can + *re-enable it.*/ + lv_display_t * disp = timer->user_data; + lv_refr_now(disp); + lv_timer_pause(timer); +} + +#endif /*LV_USE_QNX*/ diff --git a/inc/lvgl/src/drivers/qnx/lv_qnx.h b/inc/lvgl/src/drivers/qnx/lv_qnx.h new file mode 100644 index 0000000..bb8f940 --- /dev/null +++ b/inc/lvgl/src/drivers/qnx/lv_qnx.h @@ -0,0 +1,86 @@ +/** + * @file lv_qnx.h + * @brief LVGL driver for the QNX Screen compositing window manager + */ + +#ifndef LV_QNX_H +#define LV_QNX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_QNX + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a window to use as a display for LVGL. + * @param hor_res The horizontal resolution (size) of the window + * @param ver_res The vertical resolution (size) of the window + * @return A pointer to a new display object if successful, NULL otherwise + */ +lv_display_t * lv_qnx_window_create(int32_t hor_res, int32_t ver_res); + +/** + * Set the title of the window identified by the given display. + * @param disp The display object for the window + * @param title The new title to set + */ +void lv_qnx_window_set_title(lv_display_t * disp, const char * title); + +/** + * Create a pointer input device for the display. + * Only one pointer object is currently supported. + * @param disp The display object associated with the device + * @return true if successful, false otherwise + */ +bool lv_qnx_add_pointer_device(lv_display_t * disp); + +/** + * Create a keyboard input device for the display. + * Only one keyboard object is currently supported. + * @param disp The display object associated with the device + * @return true if successful, false otherwise + */ +bool lv_qnx_add_keyboard_device(lv_display_t * disp); + +/** + * Runs the event loop for the display. + * The function only returns in response to a close event. + * @param disp The display for the event loop + * @return Exit code + */ +int lv_qnx_event_loop(lv_display_t * disp); + +/********************** + * MACROS + **********************/ + +#endif /* LV_DRV_QNX */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_QNX_H */ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_egl.c b/inc/lvgl/src/drivers/sdl/lv_sdl_egl.c new file mode 100644 index 0000000..4b4bc94 --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_egl.c @@ -0,0 +1,265 @@ +/** + * @file lv_sdl_egl.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_SDL_USE_EGL + +#include +#include "lv_sdl_private.h" +#include "../opengles/lv_opengles_egl_private.h" +#include "../opengles/lv_opengles_driver.h" +#include "../../draw/lv_draw_buf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_opengles_egl_t * egl_ctx; + lv_opengles_texture_t opengles_texture; +} lv_sdl_egl_display_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * create_window_cb(void * driver_data, const lv_egl_native_window_properties_t * props); +static void destroy_window_cb(void * driver_data, void * native_window); +static void flip_cb(void * driver_data, bool vsync); +static size_t select_config_cb(void * driver_data, const lv_egl_config_t * configs, size_t config_count); +static lv_egl_interface_t lv_sdl_get_egl_interface(lv_display_t * display); +static void flush_cb(lv_display_t * display, const lv_area_t * area, uint8_t * px_map); + +static lv_result_t init_display(lv_display_t * display); +static lv_result_t resize_display(lv_display_t * display); +static void deinit_display(lv_display_t * display); +static SDL_Renderer * get_renderer(lv_display_t * display); +static lv_result_t redraw(lv_display_t * display); + +const lv_sdl_backend_ops_t lv_sdl_backend_ops = { + .init_display = init_display, + .resize_display = resize_display, + .deinit_display = deinit_display, + .redraw = redraw, + .get_renderer = get_renderer, +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t init_display(lv_display_t * display) +{ + lv_egl_interface_t ifc = lv_sdl_get_egl_interface(display); + lv_sdl_egl_display_data_t * ddata = lv_malloc_zeroed(sizeof(*ddata)); + if(!ddata) { + LV_LOG_WARN("Failed to allocate memory for display data"); + return LV_RESULT_INVALID; + } + ddata->egl_ctx = lv_opengles_egl_context_create(&ifc); + if(!ddata->egl_ctx) { + LV_LOG_ERROR("Failed to initialize EGL context"); + lv_free(ddata); + return LV_RESULT_INVALID; + } + + lv_sdl_backend_set_display_data(display, ddata); + + if(LV_USE_DRAW_NANOVG) { + static lv_draw_buf_t draw_buf; + static uint8_t dummy_buf; + lv_draw_buf_init(&draw_buf, 4096, 4096, LV_COLOR_FORMAT_ARGB8888, 4096 * 4, &dummy_buf, 4096 * 4096 * 4); + + lv_display_set_draw_buffers(display, &draw_buf, NULL); + lv_display_set_render_mode(display, LV_DISPLAY_RENDER_MODE_FULL); + } + else { + lv_result_t res = resize_display(display); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to create draw buffers"); + lv_opengles_egl_context_destroy(ddata->egl_ctx); + lv_free(ddata); + lv_sdl_backend_set_display_data(display, NULL); + return LV_RESULT_INVALID; + } + lv_display_set_render_mode(display, LV_DISPLAY_RENDER_MODE_DIRECT); + } + lv_display_set_flush_cb(display, flush_cb); + + return LV_RESULT_OK; + +} +static lv_result_t resize_display(lv_display_t * display) +{ + if(!LV_USE_DRAW_OPENGLES) { + return LV_RESULT_OK; + } + + lv_sdl_egl_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + LV_ASSERT_NULL(ddata); + + int32_t hor_res = lv_sdl_window_get_horizontal_resolution(display); + int32_t ver_res = lv_sdl_window_get_vertical_resolution(display); + ddata->opengles_texture.is_texture_owner = true; + return lv_opengles_texture_reshape(&ddata->opengles_texture, display, hor_res, ver_res); + +} +static void deinit_display(lv_display_t * display) +{ + lv_sdl_egl_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + if(ddata->egl_ctx) { + lv_opengles_egl_context_destroy(ddata->egl_ctx); + ddata->egl_ctx = NULL; + } + + if(LV_USE_DRAW_OPENGLES) { + lv_opengles_texture_deinit(&ddata->opengles_texture); + } + + lv_free(ddata); + lv_sdl_backend_set_display_data(display, NULL); +} + + +static lv_egl_interface_t lv_sdl_get_egl_interface(lv_display_t * display) +{ + return (lv_egl_interface_t) { + .driver_data = display, + .create_window_cb = create_window_cb, + .destroy_window_cb = destroy_window_cb, + .egl_platform = 0, + .native_display = EGL_DEFAULT_DISPLAY, + .flip_cb = flip_cb, + .select_config = select_config_cb, + }; + +} +static void * create_window_cb(void * driver_data, const lv_egl_native_window_properties_t * props) +{ + LV_UNUSED(props); + lv_display_t * display = (lv_display_t *)driver_data; + SDL_SysWMinfo wmInfo; + SDL_VERSION(&wmInfo.version); + SDL_GetWindowWMInfo(lv_sdl_window_get_window(display), &wmInfo); + + EGLNativeWindowType native_window; +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + native_window = wmInfo.info.win.window; +#elif defined(SDL_VIDEO_DRIVER_X11) + native_window = wmInfo.info.x11.window; +#elif defined(SDL_VIDEO_DRIVER_WAYLAND) + native_window = wmInfo.info.wl.surface; +#else + LV_LOG_ERROR("Unsupported platform for EGL"); + return NULL; +#endif + return (void *)native_window; +} + +static void flush_cb(lv_display_t * display, const lv_area_t * area, uint8_t * px_map) +{ + + LV_UNUSED(area); + LV_UNUSED(px_map); + lv_sdl_egl_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + LV_ASSERT_NULL(ddata); + + if(lv_display_flush_is_last(display)) { +#if LV_USE_DRAW_OPENGLES + lv_opengles_viewport(0, 0, + lv_display_get_original_horizontal_resolution(display), + lv_display_get_original_vertical_resolution(display)); + lv_opengles_render_display_texture(display, false, true); +#endif /*LV_USE_DRAW_OPENGLES*/ + lv_opengles_egl_update(ddata->egl_ctx); + } + lv_display_flush_ready(display); + return; +} + +static size_t select_config_cb(void * driver_data, const lv_egl_config_t * configs, size_t config_count) +{ + lv_display_t * display = (lv_display_t *)driver_data; + int32_t target_w = lv_display_get_horizontal_resolution(display); + int32_t target_h = lv_display_get_vertical_resolution(display); + +#if LV_COLOR_DEPTH == 16 + lv_color_format_t target_cf = LV_COLOR_FORMAT_RGB565; +#elif LV_COLOR_DEPTH == 32 + lv_color_format_t target_cf = LV_COLOR_FORMAT_ARGB8888; +#else +#error "Unsupported color format" +#endif + + + for(size_t i = 0; i < config_count; ++i) { + LV_LOG_TRACE("Got config %zu %#x %dx%d %d %d %d %d buffer size %d depth %d samples %d stencil %d surface type %d renderable type %d", + i, configs[i].id, + configs[i].max_width, configs[i].max_height, configs[i].r_bits, configs[i].g_bits, configs[i].b_bits, configs[i].a_bits, + configs[i].buffer_size, configs[i].depth, configs[i].samples, configs[i].stencil, + configs[i].surface_type & EGL_WINDOW_BIT, configs[i].renderable_type & EGL_OPENGL_ES2_BIT); + } + + for(size_t i = 0; i < config_count; ++i) { + lv_color_format_t config_cf = lv_opengles_egl_color_format_from_egl_config(&configs[i]); + const bool resolution_matches = configs[i].max_width >= target_w && + configs[i].max_height >= target_h; + const bool is_nanovg_compatible = (configs[i].renderable_type & EGL_OPENGL_ES2_BIT) != 0 && + configs[i].stencil == 8 && configs[i].samples == 4; + const bool is_window = (configs[i].surface_type & EGL_WINDOW_BIT) != 0; + const bool is_compatible_with_draw_unit = is_nanovg_compatible || !LV_USE_DRAW_NANOVG; + + if(is_window && resolution_matches && config_cf == target_cf && is_compatible_with_draw_unit) { + LV_LOG_INFO("Choosing config %zu", i); + return i; + } + } + return config_count; +} +static void destroy_window_cb(void * driver_data, void * native_window) +{ + LV_UNUSED(driver_data); + LV_UNUSED(native_window); +} + +static void flip_cb(void * driver_data, bool vsync) +{ + + LV_UNUSED(driver_data); + LV_UNUSED(vsync); +} + + +static SDL_Renderer * get_renderer(lv_display_t * display) +{ + LV_UNUSED(display); + return NULL; +} +static lv_result_t redraw(lv_display_t * display) +{ + LV_UNUSED(display); + return LV_RESULT_OK; +} + +#endif /*LV_SDL_USE_EGL*/ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_keyboard.c b/inc/lvgl/src/drivers/sdl/lv_sdl_keyboard.c new file mode 100644 index 0000000..c9b1ee9 --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_keyboard.c @@ -0,0 +1,225 @@ +/** + * @file lv_sdl_keyboard.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_keyboard.h" +#if LV_USE_SDL + +#include "../../core/lv_group.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/lv_text_private.h" +#include "lv_sdl_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + char buf[KEYBOARD_BUFFER_SIZE]; + bool dummy_read; +} lv_sdl_keyboard_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void sdl_keyboard_read(lv_indev_t * indev, lv_indev_data_t * data); +static uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key); +static void release_indev_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_sdl_keyboard_create(void) +{ + lv_sdl_keyboard_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_keyboard_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_indev_t * indev = lv_indev_create(); + LV_ASSERT_MALLOC(indev); + if(indev == NULL) { + lv_free(dsc); + return NULL; + } + + lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(indev, sdl_keyboard_read); + lv_indev_set_driver_data(indev, dsc); + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); + + return indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void sdl_keyboard_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_sdl_keyboard_t * dev = lv_indev_get_driver_data(indev); + + const size_t len = lv_strlen(dev->buf); + + /*Send a release manually*/ + if(dev->dummy_read) { + dev->dummy_read = false; + data->state = LV_INDEV_STATE_RELEASED; + } + /*Send the pressed character*/ + else if(len > 0) { + dev->dummy_read = true; + data->state = LV_INDEV_STATE_PRESSED; + data->key = 0; + /*Copy the first UTF8 character from the buffer*/ + uint32_t utf8_len = lv_text_encoded_size(dev->buf); + if(utf8_len == 0) utf8_len = 1; /*Make sure that at least 1 character is read*/ + lv_memcpy(&data->key, dev->buf, utf8_len); + + /*Drop the first character*/ + lv_memmove(dev->buf, dev->buf + utf8_len, len - utf8_len + 1); + } +} + +static void release_indev_cb(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); + lv_sdl_keyboard_t * dev = lv_indev_get_driver_data(indev); + if(dev) { + lv_indev_set_driver_data(indev, NULL); + lv_indev_set_read_cb(indev, NULL); + lv_free(dev); + LV_LOG_INFO("done"); + } +} + +void lv_sdl_keyboard_handler(SDL_Event * event) +{ + uint32_t win_id = UINT32_MAX; + switch(event->type) { + case SDL_KEYDOWN: + win_id = event->key.windowID; + break; + case SDL_TEXTINPUT: + win_id = event->text.windowID; + break; + default: + return; + } + + lv_display_t * disp = lv_sdl_get_disp_from_win_id(win_id); + + + /*Find a suitable indev*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_read_cb(indev) == sdl_keyboard_read) { + /*If disp is NULL for any reason use the first indev with the correct type*/ + if(disp == NULL || lv_indev_get_display(indev) == disp) break; + } + indev = lv_indev_get_next(indev); + } + if(indev == NULL) return; + lv_sdl_keyboard_t * dsc = lv_indev_get_driver_data(indev); + + /* We only care about SDL_KEYDOWN and SDL_TEXTINPUT events */ + switch(event->type) { + case SDL_KEYDOWN: { /*Button press*/ + const uint32_t ctrl_key = keycode_to_ctrl_key(event->key.keysym.sym); + if(ctrl_key == '\0') + return; + const size_t len = lv_strlen(dsc->buf); + if(len < KEYBOARD_BUFFER_SIZE - 1) { + dsc->buf[len] = ctrl_key; + dsc->buf[len + 1] = '\0'; + } + break; + } + case SDL_TEXTINPUT: { /*Text input*/ + const size_t len = lv_strlen(dsc->buf) + lv_strlen(event->text.text); + if(len < KEYBOARD_BUFFER_SIZE - 1) + lv_strcat(dsc->buf, event->text.text); + } + break; + default: + break; + + } + + size_t len = lv_strlen(dsc->buf); + while(len) { + lv_indev_read(indev); + + /*Call again to handle dummy read in `sdl_keyboard_read`*/ + lv_indev_read(indev); + len--; + } +} + +/** + * Convert a SDL key code to it's LV_KEY_* counterpart or return '\0' if it's not a control character. + * @param sdl_key the key code + * @return LV_KEY_* control character or '\0' + */ +static uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key) +{ + /*Remap some key to LV_KEY_... to manage groups*/ + switch(sdl_key) { + case SDLK_RIGHT: + case SDLK_KP_PLUS: + return LV_KEY_RIGHT; + + case SDLK_LEFT: + case SDLK_KP_MINUS: + return LV_KEY_LEFT; + + case SDLK_UP: + return LV_KEY_UP; + + case SDLK_DOWN: + return LV_KEY_DOWN; + + case SDLK_ESCAPE: + return LV_KEY_ESC; + + case SDLK_BACKSPACE: + return LV_KEY_BACKSPACE; + + case SDLK_DELETE: + return LV_KEY_DEL; + + case SDLK_KP_ENTER: + case '\r': + return LV_KEY_ENTER; + + case SDLK_TAB: + case SDLK_PAGEDOWN: + return LV_KEY_NEXT; + + case SDLK_PAGEUP: + return LV_KEY_PREV; + + case SDLK_HOME: + return LV_KEY_HOME; + + case SDLK_END: + return LV_KEY_END; + + default: + return '\0'; + } +} + +#endif /*LV_USE_SDL*/ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_keyboard.h b/inc/lvgl/src/drivers/sdl/lv_sdl_keyboard.h new file mode 100644 index 0000000..a18b09d --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_keyboard.h @@ -0,0 +1,46 @@ +/** + * @file lv_sdl_keyboard.h + * + */ + +#ifndef LV_SDL_KEYBOARD_H +#define LV_SDL_KEYBOARD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_window.h" +#if LV_USE_SDL + +/********************* + * DEFINES + *********************/ +#ifndef KEYBOARD_BUFFER_SIZE +#define KEYBOARD_BUFFER_SIZE 32 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_sdl_keyboard_create(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SDL*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_SDL_KEYBOARD_H */ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_mouse.c b/inc/lvgl/src/drivers/sdl/lv_sdl_mouse.c new file mode 100644 index 0000000..a401c12 --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_mouse.c @@ -0,0 +1,205 @@ +/** + * @file lv_sdl_mouse.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_mouse.h" +#if LV_USE_SDL + +#include "../../core/lv_group.h" +#include "../../stdlib/lv_string.h" +#include "lv_sdl_private.h" + +/********************* + * DEFINES + *********************/ + +#ifndef KEYBOARD_BUFFER_SIZE + #define KEYBOARD_BUFFER_SIZE 32 +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ +static void sdl_mouse_read(lv_indev_t * indev, lv_indev_data_t * data); +static void release_indev_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +typedef struct { + int16_t last_x; + int16_t last_y; + bool left_button_down; +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN + int32_t diff; +#endif +} lv_sdl_mouse_t; + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_sdl_mouse_create(void) +{ + lv_sdl_mouse_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_mouse_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_indev_t * indev = lv_indev_create(); + LV_ASSERT_MALLOC(indev); + if(indev == NULL) { + lv_free(dsc); + return NULL; + } + + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, sdl_mouse_read); + lv_indev_set_driver_data(indev, dsc); + + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); + + return indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void sdl_mouse_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_sdl_mouse_t * dsc = lv_indev_get_driver_data(indev); + + /*Store the collected data*/ + data->point.x = dsc->last_x; + data->point.y = dsc->last_y; + data->state = dsc->left_button_down ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN + data->enc_diff = dsc->diff; + dsc->diff = 0; +#endif +} + +static void release_indev_cb(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); + lv_sdl_mouse_t * dsc = lv_indev_get_driver_data(indev); + if(dsc) { + lv_indev_set_driver_data(indev, NULL); + lv_indev_set_read_cb(indev, NULL); + lv_free(dsc); + LV_LOG_INFO("done"); + } +} + +void lv_sdl_mouse_handler(SDL_Event * event) +{ + uint32_t win_id = UINT32_MAX; + switch(event->type) { + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: + win_id = event->button.windowID; + break; + case SDL_MOUSEMOTION: + win_id = event->motion.windowID; + break; +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN + case SDL_MOUSEWHEEL: + win_id = event->wheel.windowID; + break; +#endif + case SDL_FINGERUP: + case SDL_FINGERDOWN: + case SDL_FINGERMOTION: +#if SDL_VERSION_ATLEAST(2,0,12) + win_id = event->tfinger.windowID; +#endif + break; + case SDL_WINDOWEVENT: + win_id = event->window.windowID; + break; + default: + return; + } + + lv_display_t * disp = lv_sdl_get_disp_from_win_id(win_id); + if(disp == NULL) return; + + /*Find a suitable indev*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_read_cb(indev) == sdl_mouse_read) { + /*If disp is NULL for any reason use the first indev with the correct type*/ + if(disp == NULL || lv_indev_get_display(indev) == disp) break; + } + indev = lv_indev_get_next(indev); + } + + if(indev == NULL) return; + lv_sdl_mouse_t * indev_dev = lv_indev_get_driver_data(indev); + if(indev_dev == NULL) return; + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + float zoom = lv_sdl_window_get_zoom(disp); + + switch(event->type) { + case SDL_WINDOWEVENT: + if(event->window.event == SDL_WINDOWEVENT_LEAVE) { + indev_dev->left_button_down = false; + } + break; + case SDL_MOUSEBUTTONUP: + if(event->button.button == SDL_BUTTON_LEFT) + indev_dev->left_button_down = false; + break; + case SDL_WINDOWEVENT_LEAVE: + indev_dev->left_button_down = false; + break; + case SDL_MOUSEBUTTONDOWN: + if(event->button.button == SDL_BUTTON_LEFT) { + indev_dev->left_button_down = true; + indev_dev->last_x = (int16_t)((float)(event->motion.x) / zoom); + indev_dev->last_y = (int16_t)((float)(event->motion.y) / zoom); + } + break; + case SDL_MOUSEMOTION: + indev_dev->last_x = (int16_t)((float)(event->motion.x) / zoom); + indev_dev->last_y = (int16_t)((float)(event->motion.y) / zoom); + break; + + case SDL_FINGERUP: + indev_dev->left_button_down = false; + indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom); + indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom); + break; + case SDL_FINGERDOWN: + indev_dev->left_button_down = true; + indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom); + indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom); + break; + case SDL_FINGERMOTION: + indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom); + indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom); + break; + case SDL_MOUSEWHEEL: +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN +#ifdef __EMSCRIPTEN__ + /*Emscripten scales it wrong*/ + if(event->wheel.y < 0) dsc->diff++; + if(event->wheel.y > 0) dsc->diff--; +#else + indev_dev->diff = -event->wheel.y; +#endif /*__EMSCRIPTEN__*/ +#endif /*LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN*/ + break; + } + lv_indev_read(indev); +} + +#endif /*LV_USE_SDL*/ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_mouse.h b/inc/lvgl/src/drivers/sdl/lv_sdl_mouse.h new file mode 100644 index 0000000..ef60685 --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_mouse.h @@ -0,0 +1,43 @@ +/** + * @file lv_sdl_mouse.h + * + */ + +#ifndef LV_SDL_MOUSE_H +#define LV_SDL_MOUSE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_window.h" +#if LV_USE_SDL + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_sdl_mouse_create(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SDL*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_SDL_MOUSE_H */ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c b/inc/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c new file mode 100644 index 0000000..f0b5f7d --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c @@ -0,0 +1,142 @@ +/** + * @file lv_sdl_mousewheel.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_mousewheel.h" +#if LV_USE_SDL && LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER + +#include "../../core/lv_group.h" +#include "../../stdlib/lv_string.h" +#include "lv_sdl_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void sdl_mousewheel_read(lv_indev_t * indev, lv_indev_data_t * data); +static void release_indev_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +typedef struct { + int16_t diff; + lv_indev_state_t state; +} lv_sdl_mousewheel_t; + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_sdl_mousewheel_create(void) +{ + lv_sdl_mousewheel_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_mousewheel_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_indev_t * indev = lv_indev_create(); + if(indev == NULL) { + lv_free(dsc); + return NULL; + } + + lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb(indev, sdl_mousewheel_read); + lv_indev_set_driver_data(indev, dsc); + + lv_indev_set_mode(indev, LV_INDEV_MODE_EVENT); + lv_indev_add_event_cb(indev, release_indev_cb, LV_EVENT_DELETE, indev); + + return indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void sdl_mousewheel_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev); + + data->state = dsc->state; + data->enc_diff = dsc->diff; + dsc->diff = 0; +} + +static void release_indev_cb(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *) lv_event_get_user_data(e); + lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev); + if(dsc) { + lv_indev_set_driver_data(indev, NULL); + lv_indev_set_read_cb(indev, NULL); + lv_free(dsc); + LV_LOG_INFO("done"); + } +} + +void lv_sdl_mousewheel_handler(SDL_Event * event) +{ + uint32_t win_id = UINT32_MAX; + switch(event->type) { + case SDL_MOUSEWHEEL: + win_id = event->wheel.windowID; + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + win_id = event->button.windowID; + break; + default: + return; + } + + lv_display_t * disp = lv_sdl_get_disp_from_win_id(win_id); + + /*Find a suitable indev*/ + lv_indev_t * indev = lv_indev_get_next(NULL); + while(indev) { + if(lv_indev_get_read_cb(indev) == sdl_mousewheel_read) { + /*If disp is NULL for any reason use the first indev with the correct type*/ + if(disp == NULL || lv_indev_get_display(indev) == disp) break; + } + indev = lv_indev_get_next(indev); + } + + if(indev == NULL) return; + lv_sdl_mousewheel_t * dsc = lv_indev_get_driver_data(indev); + + switch(event->type) { + case SDL_MOUSEWHEEL: +#ifdef __EMSCRIPTEN__ + /*Emscripten scales it wrong*/ + if(event->wheel.y < 0) dsc->diff++; + if(event->wheel.y > 0) dsc->diff--; +#else + dsc->diff = -event->wheel.y; +#endif + break; + case SDL_MOUSEBUTTONDOWN: + if(event->button.button == SDL_BUTTON_MIDDLE) { + dsc->state = LV_INDEV_STATE_PRESSED; + } + break; + case SDL_MOUSEBUTTONUP: + if(event->button.button == SDL_BUTTON_MIDDLE) { + dsc->state = LV_INDEV_STATE_RELEASED; + } + break; + default: + break; + } + lv_indev_read(indev); +} + +#endif /*LV_USE_SDL*/ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h b/inc/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h new file mode 100644 index 0000000..dab3dea --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h @@ -0,0 +1,43 @@ +/** + * @file lv_sdl_mousewheel.h + * + */ + +#ifndef LV_SDL_MOUSEWHEEL_H +#define LV_SDL_MOUSEWHEEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_window.h" +#if LV_USE_SDL && LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_sdl_mousewheel_create(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SDL*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_SDL_MOUSEWHEEL_H */ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_private.h b/inc/lvgl/src/drivers/sdl/lv_sdl_private.h new file mode 100644 index 0000000..be5b31f --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_private.h @@ -0,0 +1,97 @@ +/** + * @file lv_sdl_private.h + * + */ + +#ifndef LV_SDL_PRIVATE_H +#define LV_SDL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_types.h" +#include "lv_sdl_window.h" + +#if LV_USE_SDL + +#include "../opengles/lv_opengles_egl_private.h" +#include "../opengles/lv_opengles_texture_private.h" + +#include LV_SDL_INCLUDE_PATH + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + void * backend_data; + SDL_Window * window; + float zoom; + uint8_t ignore_size_chg; +} lv_sdl_window_t; + +void lv_sdl_backend_set_display_data(lv_display_t * display, void * backend_display_data); +void * lv_sdl_backend_get_display_data(lv_display_t * display); + +int32_t lv_sdl_window_get_horizontal_resolution(lv_display_t * display); +int32_t lv_sdl_window_get_vertical_resolution(lv_display_t * display); + +typedef lv_result_t (*lv_sdl_backend_init_display_t)(lv_display_t * disp); +typedef lv_result_t (*lv_sdl_backend_resize_display_t)(lv_display_t * disp); +typedef lv_result_t (*lv_sdl_backend_redraw_t)(lv_display_t * disp); +typedef SDL_Renderer * (*lv_sdl_backend_get_renderer_t)(lv_display_t * disp); +typedef void (*lv_sdl_backend_deinit_display_t)(lv_display_t * disp); + +typedef struct { + lv_sdl_backend_init_display_t init_display; + lv_sdl_backend_resize_display_t resize_display; + lv_sdl_backend_deinit_display_t deinit_display; + lv_sdl_backend_redraw_t redraw; + lv_sdl_backend_get_renderer_t get_renderer; +} lv_sdl_backend_ops_t; + +extern const lv_sdl_backend_ops_t lv_sdl_backend_ops; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_sdl_keyboard_handler(SDL_Event * event); +void lv_sdl_mouse_handler(SDL_Event * event); +void lv_sdl_mousewheel_handler(SDL_Event * event); +lv_display_t * lv_sdl_get_disp_from_win_id(uint32_t win_id); + + +#if LV_SDL_USE_EGL +lv_result_t lv_sdl_egl_init(lv_display_t * disp); +lv_result_t lv_sdl_egl_resize(lv_display_t * disp); +void lv_sdl_egl_deinit(lv_display_t * disp); +#elif LV_USE_DRAW_SDL +lv_result_t lv_sdl_texture_init(lv_display_t * disp); +lv_result_t lv_sdl_texture_resize(lv_display_t * disp); +void lv_sdl_texture_deinit(lv_display_t * disp); +#else +lv_result_t lv_sdl_sw_init(lv_display_t * disp); +lv_result_t lv_sdl_sw_resize(lv_display_t * disp); +void lv_sdl_sw_deinit(lv_display_t * disp); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SDL*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_SDL_PRIVATE_H */ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_sw.c b/inc/lvgl/src/drivers/sdl/lv_sdl_sw.c new file mode 100644 index 0000000..7427739 --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_sw.c @@ -0,0 +1,342 @@ +/** + * @file lv_sdl_sw.c + * + */ + +/********************* + * INCLUDES + *********************/ + +/* for aligned_alloc */ +#ifndef __USE_ISOC11 + #define _ISOC11_SOURCE +#endif + +#include "lv_sdl_private.h" + +#if LV_USE_SDL && !LV_SDL_USE_EGL && !LV_USE_DRAW_SDL + +#ifndef _WIN32 + #include +#else + #include +#endif /* _WIN32 */ + +#include "../../display/lv_display_private.h" +#include "../../misc/lv_types.h" +#include "../../draw/sw/lv_draw_sw_utils.h" + + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + SDL_Texture * texture; + SDL_Renderer * renderer; + uint8_t * fb1; + uint8_t * fb2; + uint8_t * fb_act; + uint8_t * buf1; + uint8_t * buf2; + uint8_t * rotated_buf; + size_t rotated_buf_size; +} lv_sdl_sw_display_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * sdl_draw_buf_realloc_aligned(void * ptr, size_t new_size); +static void sdl_draw_buf_free(void * ptr); +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static lv_result_t window_update(lv_display_t * disp); + +static inline int sdl_render_mode(void) +{ + return LV_SDL_RENDER_MODE; +} + +static lv_result_t init_display(lv_display_t * display); +static lv_result_t resize_display(lv_display_t * display); +static void deinit_display(lv_display_t * display); +static SDL_Renderer * get_renderer(lv_display_t * display); + +const lv_sdl_backend_ops_t lv_sdl_backend_ops = { + .init_display = init_display, + .resize_display = resize_display, + .deinit_display = deinit_display, + .redraw = window_update, + .get_renderer = get_renderer, +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t init_display(lv_display_t * display) +{ + lv_sdl_sw_display_data_t * ddata = lv_malloc_zeroed(sizeof(*ddata)); + if(!ddata) { + LV_LOG_WARN("No memory for display data"); + return LV_RESULT_INVALID; + } + ddata->renderer = SDL_CreateRenderer(lv_sdl_window_get_window(display), -1, + LV_SDL_ACCELERATED ? SDL_RENDERER_ACCELERATED : SDL_RENDERER_SOFTWARE); + if(!ddata->renderer) { + LV_LOG_ERROR("Failed to create SDL renderer '%s'", SDL_GetError()); + lv_free(ddata); + return LV_RESULT_INVALID; + } + lv_sdl_backend_set_display_data(display, ddata); + + int32_t hor_res = lv_sdl_window_get_horizontal_resolution(display); + int32_t ver_res = lv_sdl_window_get_vertical_resolution(display); + + resize_display(display); + + uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(display)); + lv_memset(ddata->fb1, 0xff, hor_res * ver_res * px_size); + if(ddata->fb2) lv_memset(ddata->fb2, 0xff, hor_res * ver_res * px_size); + + lv_display_set_flush_cb(display, flush_cb); + + if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { + uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(lv_display_get_color_format(display)) * 4; + uint32_t buffer_size_bytes = 32 * 1024 + palette_size; + ddata->buf1 = sdl_draw_buf_realloc_aligned(NULL, buffer_size_bytes); + if(LV_SDL_BUF_COUNT == 2) { + ddata->buf2 = sdl_draw_buf_realloc_aligned(NULL, buffer_size_bytes); + } + lv_display_set_buffers(display, ddata->buf1, ddata->buf2, buffer_size_bytes, LV_SDL_RENDER_MODE); + } + else { + /*LV_DISPLAY_RENDER_MODE_DIRECT or FULL */ + uint32_t stride = lv_draw_buf_width_to_stride(display->hor_res, + lv_display_get_color_format(display)); + lv_display_set_buffers(display, ddata->fb1, ddata->fb2, stride * display->ver_res, + LV_SDL_RENDER_MODE); + } + return LV_RESULT_OK; +} +static lv_result_t resize_display(lv_display_t * display) +{ + lv_color_format_t cf = lv_display_get_color_format(display); + /*In some cases SDL stride might be different than LVGL render stride, like in I1 format. + SDL still uses ARGB8888 as the color format, but LVGL renders in I1, thus causing a mismatch + This ensures correct stride for SDL buffers in this case.*/ + if(cf == LV_COLOR_FORMAT_I1) { + cf = LV_COLOR_FORMAT_ARGB8888; + } + uint32_t stride = lv_draw_buf_width_to_stride(display->hor_res, cf); + lv_sdl_sw_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + + ddata->fb1 = sdl_draw_buf_realloc_aligned(ddata->fb1, stride * display->ver_res); + LV_ASSERT_MALLOC(ddata->fb1); + lv_memzero(ddata->fb1, stride * display->ver_res); + + if(sdl_render_mode() == LV_DISPLAY_RENDER_MODE_PARTIAL) { + ddata->fb_act = ddata->fb1; + } + else { + if(LV_SDL_BUF_COUNT == 2) { + ddata->fb2 = sdl_draw_buf_realloc_aligned(ddata->fb2, stride * display->ver_res); + lv_memset(ddata->fb2, 0x00, stride * display->ver_res); + } + lv_display_set_buffers(display, ddata->fb1, ddata->fb2, stride * display->ver_res, LV_SDL_RENDER_MODE); + } + if(ddata->texture) SDL_DestroyTexture(ddata->texture); + +#if LV_COLOR_DEPTH == 32 || LV_COLOR_DEPTH == 1 + SDL_PixelFormatEnum px_format = + SDL_PIXELFORMAT_RGB888; /*same as SDL_PIXELFORMAT_RGB888, but it's not supported in older versions*/ +#elif LV_COLOR_DEPTH == 24 + SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_BGR24; +#elif LV_COLOR_DEPTH == 16 + SDL_PixelFormatEnum px_format = SDL_PIXELFORMAT_RGB565; +#else +#error("Unsupported color format") +#endif + + ddata->texture = SDL_CreateTexture(ddata->renderer, px_format, + SDL_TEXTUREACCESS_STATIC, display->hor_res, display->ver_res); + SDL_SetTextureBlendMode(ddata->texture, SDL_BLENDMODE_BLEND); + return LV_RESULT_OK; +} + +static void deinit_display(lv_display_t * display) +{ + + lv_sdl_sw_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + LV_ASSERT_NULL(ddata); + if(ddata->texture) { + SDL_DestroyTexture(ddata->texture); + ddata->texture = NULL; + } + if(ddata->renderer) { + SDL_DestroyRenderer(ddata->renderer); + ddata->renderer = NULL; + } + + if(ddata->fb1) { + sdl_draw_buf_free(ddata->fb1); + ddata->fb1 = NULL; + } + if(ddata->fb2) { + sdl_draw_buf_free(ddata->fb2); + ddata->fb2 = NULL; + } + + if(ddata->buf1) { + sdl_draw_buf_free(ddata->buf1); + ddata->buf1 = NULL; + } + if(ddata->buf2) { + sdl_draw_buf_free(ddata->buf2); + ddata->buf2 = NULL; + } + + lv_free(ddata); + lv_sdl_backend_set_display_data(display, NULL); +} + +static SDL_Renderer * get_renderer(lv_display_t * display) +{ + lv_sdl_sw_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + LV_ASSERT_NULL(ddata); + return ddata->renderer; +} + + +static void * sdl_draw_buf_realloc_aligned(void * ptr, size_t new_size) +{ + if(ptr) { + sdl_draw_buf_free(ptr); + } + + /* No need copy for drawing buffer */ +#ifndef _WIN32 + /* Size must be multiple of align, See: https://en.cppreference.com/w/c/memory/aligned_alloc */ +#define BUF_ALIGN (LV_DRAW_BUF_ALIGN < sizeof(void *) ? sizeof(void *) : LV_DRAW_BUF_ALIGN) + return aligned_alloc(BUF_ALIGN, LV_ALIGN_UP(new_size, BUF_ALIGN)); +#else + return _aligned_malloc(LV_ALIGN_UP(new_size, LV_DRAW_BUF_ALIGN), LV_DRAW_BUF_ALIGN); +#endif /* _WIN32 */ +} + +static void sdl_draw_buf_free(void * ptr) +{ +#ifndef _WIN32 + free(ptr); +#else + _aligned_free(ptr); +#endif /* _WIN32 */ +} + +static void flush_cb(lv_display_t * display, const lv_area_t * area, uint8_t * px_map) +{ + lv_color_format_t cf = lv_display_get_color_format(display); + lv_sdl_sw_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + uint32_t * argb_px_map = NULL; + + if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { + if(cf == LV_COLOR_FORMAT_RGB565_SWAPPED) { + uint32_t width = lv_area_get_width(area); + uint32_t height = lv_area_get_height(area); + lv_draw_sw_rgb565_swap(px_map, width * height); + } + /*Update values in a special OLED I1 --> ARGB8888 case + We render everything in I1, but display it in ARGB8888*/ + if(cf == LV_COLOR_FORMAT_I1) { + /*I1 uses 1 bit wide pixels, ARGB8888 uses 4 byte wide pixels*/ + cf = LV_COLOR_FORMAT_ARGB8888; + uint32_t width = lv_area_get_width(area); + uint32_t height = lv_area_get_height(area); + uint32_t argb_px_map_size = width * height * 4; + argb_px_map = malloc(argb_px_map_size); + if(argb_px_map == NULL) { + LV_LOG_ERROR("malloc failed"); + lv_display_flush_ready(display); + return; + } + /* skip the palette */ + px_map += LV_COLOR_INDEXED_PALETTE_SIZE(LV_COLOR_FORMAT_I1) * 4; + const uint32_t i1_stride = lv_draw_buf_width_to_stride(width, LV_COLOR_FORMAT_I1); + const uint32_t argb8888_stride = lv_draw_buf_width_to_stride(width, LV_COLOR_FORMAT_ARGB8888); + lv_draw_sw_i1_to_argb8888(px_map, argb_px_map, width, height, i1_stride, argb8888_stride, 0xFF000000u, 0xFFFFFFFFu); + px_map = (uint8_t *)argb_px_map; + } + + lv_area_t rotated_area = *area; + lv_display_rotate_area(display, &rotated_area); + + int32_t px_map_w = lv_area_get_width(area); + int32_t px_map_h = lv_area_get_height(area); + uint32_t px_map_stride = lv_draw_buf_width_to_stride(lv_area_get_width(area), cf); + uint32_t px_size = lv_color_format_get_size(cf); + + int32_t fb_stride = lv_draw_buf_width_to_stride(display->hor_res, cf); + uint8_t * fb_start = ddata->fb_act; + fb_start += rotated_area.y1 * fb_stride + rotated_area.x1 * px_size; + lv_display_rotation_t rotation = lv_display_get_rotation(display); + + if(rotation == LV_DISPLAY_ROTATION_0) { + uint32_t px_map_line_bytes = lv_area_get_width(area) * px_size; + + int32_t y; + for(y = area->y1; y <= area->y2; y++) { + lv_memcpy(fb_start, px_map, px_map_line_bytes); + px_map += px_map_stride; + fb_start += fb_stride; + } + } + else { + lv_draw_sw_rotate(px_map, fb_start, px_map_w, px_map_h, px_map_stride, fb_stride, rotation, cf); + } + } + + if(lv_display_flush_is_last(display)) { + if(sdl_render_mode() != LV_DISPLAY_RENDER_MODE_PARTIAL) { + ddata->fb_act = px_map; + } + window_update(display); + } + free(argb_px_map); + lv_display_flush_ready(display); +} + +static lv_result_t window_update(lv_display_t * display) +{ + lv_color_format_t cf = lv_display_get_color_format(display); + lv_sdl_sw_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + if(cf == LV_COLOR_FORMAT_I1) { + cf = LV_COLOR_FORMAT_ARGB8888; + } + uint32_t stride = lv_draw_buf_width_to_stride(display->hor_res, cf); + SDL_UpdateTexture(ddata->texture, NULL, ddata->fb_act, stride); + + SDL_RenderClear(ddata->renderer); + + /*Update the renderer with the texture containing the rendered image*/ + SDL_RenderCopy(ddata->renderer, ddata->texture, NULL, NULL); + SDL_RenderPresent(ddata->renderer); + return LV_RESULT_OK; +} + +#endif /*LV_USE_SDL && !LV_SDL_USE_EGL && !LV_USE_DRAW_SDL*/ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_texture.c b/inc/lvgl/src/drivers/sdl/lv_sdl_texture.c new file mode 100644 index 0000000..beabb4b --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_texture.c @@ -0,0 +1,136 @@ +/** + * @file lv_sdl_texture.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_sdl_private.h" + +#if LV_USE_SDL && !LV_SDL_USE_EGL && LV_USE_DRAW_SDL + +#include "../../draw/lv_draw_buf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + SDL_Renderer * renderer; +} lv_sdl_texture_display_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); + +static lv_result_t init_display(lv_display_t * display); +static lv_result_t resize(lv_display_t * display); +static void deinit_display(lv_display_t * display); +static SDL_Renderer * get_renderer(lv_display_t * display); +static lv_result_t redraw(lv_display_t * display); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_sdl_backend_ops_t lv_sdl_backend_ops = { + .init_display = init_display, + .resize_display = resize, + .deinit_display = deinit_display, + .get_renderer = get_renderer, + .redraw = redraw, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t init_display(lv_display_t * display) +{ + lv_sdl_texture_display_data_t * ddata = lv_malloc_zeroed(sizeof(*ddata)); + if(!ddata) { + LV_LOG_WARN("No memory for display data"); + return LV_RESULT_INVALID; + } + ddata->renderer = SDL_CreateRenderer(lv_sdl_window_get_window(display), -1, + LV_SDL_ACCELERATED ? SDL_RENDERER_ACCELERATED : SDL_RENDERER_SOFTWARE); + if(!ddata->renderer) { + LV_LOG_ERROR("Failed to create SDL renderer '%s'", SDL_GetError()); + lv_free(ddata); + return LV_RESULT_INVALID; + } + lv_sdl_backend_set_display_data(display, ddata); + + /*It will render directly to default Texture, so the buffer is not used, so just set something*/ + static lv_draw_buf_t draw_buf; + static uint8_t dummy_buf; /*It won't be used as it will render to the SDL textures directly*/ + lv_draw_buf_init(&draw_buf, 4096, 4096, LV_COLOR_FORMAT_ARGB8888, 4096 * 4, &dummy_buf, 4096 * 4096 * 4); + + lv_display_set_draw_buffers(display, &draw_buf, NULL); + lv_display_set_render_mode(display, LV_DISPLAY_RENDER_MODE_FULL); + lv_display_set_flush_cb(display, flush_cb); + return LV_RESULT_OK; +} + +static lv_result_t resize(lv_display_t * display) +{ + LV_UNUSED(display); + return LV_RESULT_OK; +} + +static void deinit_display(lv_display_t * display) +{ + lv_sdl_texture_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + LV_ASSERT_NULL(ddata); + + if(ddata->renderer) { + SDL_DestroyRenderer(ddata->renderer); + } + + lv_free(ddata); + lv_sdl_backend_set_display_data(display, NULL); +} + +static void flush_cb(lv_display_t * display, const lv_area_t * area, uint8_t * px_map) +{ + LV_UNUSED(area); + LV_UNUSED(px_map); + lv_sdl_texture_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + if(lv_display_flush_is_last(display)) { + SDL_RenderPresent(ddata->renderer); + } + lv_display_flush_ready(display); +} + +static SDL_Renderer * get_renderer(lv_display_t * display) +{ + lv_sdl_texture_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + LV_ASSERT_NULL(ddata); + return ddata->renderer; +} +static lv_result_t redraw(lv_display_t * display) +{ + + lv_sdl_texture_display_data_t * ddata = lv_sdl_backend_get_display_data(display); + LV_ASSERT_NULL(ddata); + SDL_RenderPresent(ddata->renderer); + return LV_RESULT_OK; +} + +#endif /*LV_USE_SDL && !LV_SDL_USE_EGL && LV_USE_DRAW_SDL*/ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_window.c b/inc/lvgl/src/drivers/sdl/lv_sdl_window.c new file mode 100644 index 0000000..15a87ab --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_window.c @@ -0,0 +1,348 @@ +/** + * @file lv_sdl_window.c + * + */ + +/** + * Modified by NXP in 2025 + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_sdl_window.h" +#if LV_USE_SDL +#include +#include "../../core/lv_refr.h" +#include "../../core/lv_global.h" +#include "../../display/lv_display_private.h" +#include "../../lv_init.h" + +#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ +#include "lv_sdl_private.h" + +#if LV_COLOR_DEPTH == 1 && LV_SDL_RENDER_MODE != LV_DISPLAY_RENDER_MODE_PARTIAL + #error SDL LV_COLOR_DEPTH 1 requires LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL +#endif + +/********************* + * DEFINES + *********************/ +#define lv_deinit_in_progress LV_GLOBAL_DEFAULT()->deinit_in_progress + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static inline int sdl_render_mode(void); +static lv_result_t window_create(lv_display_t * disp); +static void sdl_event_handler(lv_timer_t * t); +static void release_disp_cb(lv_event_t * e); +static void res_chg_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +static bool inited = false; +static lv_timer_t * event_handler_timer; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res) +{ + if(!inited) { +#if LV_SDL_USE_EGL && defined(SDL_VIDEO_DRIVER_X11) + SDL_SetHintWithPriority("SDL_VIDEODRIVER", "x11", SDL_HINT_OVERRIDE); + SDL_SetHint(SDL_HINT_VIDEO_X11_FORCE_EGL, "1"); +#endif + SDL_Init(SDL_INIT_VIDEO); + SDL_StartTextInput(); + event_handler_timer = lv_timer_create(sdl_event_handler, 5, NULL); + lv_tick_set_cb(SDL_GetTicks); + lv_delay_set_cb(SDL_Delay); + + inited = true; + } + + lv_sdl_window_t * dsc = lv_malloc_zeroed(sizeof(lv_sdl_window_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(disp == NULL) { + lv_free(dsc); + return NULL; + } + lv_display_set_driver_data(disp, dsc); + lv_result_t res = window_create(disp); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to initialize window"); + lv_free(dsc); + lv_display_delete(disp); + return NULL; + } + + lv_display_add_event_cb(disp, release_disp_cb, LV_EVENT_DELETE, disp); + lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + + /*Process the initial events*/ + sdl_event_handler(NULL); + + return disp; +} + +void lv_sdl_window_set_resizeable(lv_display_t * disp, bool value) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + SDL_SetWindowResizable(dsc->window, value); +} + +void lv_sdl_window_set_size(lv_display_t * disp, int32_t hor_res, int32_t ver_res) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + SDL_SetWindowSize(dsc->window, hor_res, ver_res); +} + +void lv_sdl_window_set_zoom(lv_display_t * disp, float zoom) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + dsc->zoom = zoom; + lv_display_send_event(disp, LV_EVENT_RESOLUTION_CHANGED, NULL); + lv_refr_now(disp); +} + +float lv_sdl_window_get_zoom(lv_display_t * disp) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + return dsc->zoom; +} + +lv_display_t * lv_sdl_get_disp_from_win_id(uint32_t win_id) +{ + lv_display_t * disp = lv_display_get_next(NULL); + if(win_id == UINT32_MAX) return disp; + + while(disp) { + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + if(dsc != NULL && SDL_GetWindowID(dsc->window) == win_id) { + return disp; + } + disp = lv_display_get_next(disp); + } + return NULL; +} + +void lv_sdl_window_set_title(lv_display_t * disp, const char * title) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + SDL_SetWindowTitle(dsc->window, title); +} + +void lv_sdl_window_set_icon(lv_display_t * disp, void * icon, int32_t width, int32_t height) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + SDL_Surface * iconSurface = SDL_CreateRGBSurfaceWithFormatFrom(icon, width, height, 32, width * 4, + SDL_PIXELFORMAT_ARGB8888); + SDL_SetWindowIcon(dsc->window, iconSurface); + SDL_FreeSurface(iconSurface); +} + +void * lv_sdl_window_get_renderer(lv_display_t * display) +{ + if(!display) { + return NULL; + } + return lv_sdl_backend_ops.get_renderer(display); +} + +struct SDL_Window * lv_sdl_window_get_window(lv_display_t * disp) +{ + if(!disp) { + LV_LOG_ERROR("invalid display pointer"); + return NULL; + } + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + if(!dsc) { + LV_LOG_ERROR("invalid driver data"); + return NULL; + } + return dsc->window; +} + +void lv_sdl_quit(void) +{ + if(inited) { + SDL_Quit(); + lv_timer_delete(event_handler_timer); + event_handler_timer = NULL; + inited = false; + } +} + +void lv_sdl_backend_set_display_data(lv_display_t * display, void * backend_display_data) +{ + LV_ASSERT_NULL(display); + lv_sdl_window_t * dsc = lv_display_get_driver_data(display); + dsc->backend_data = backend_display_data; +} +void * lv_sdl_backend_get_display_data(lv_display_t * display) +{ + LV_ASSERT_NULL(display); + lv_sdl_window_t * dsc = lv_display_get_driver_data(display); + return dsc->backend_data; +} + +int32_t lv_sdl_window_get_horizontal_resolution(lv_display_t * display) +{ + /* Private function, fine to assert here*/ + LV_ASSERT_NULL(display); + lv_sdl_window_t * dsc = lv_display_get_driver_data(display); + LV_ASSERT_NULL(dsc); + return (int32_t)((float)(display->hor_res) * dsc->zoom); +} +int32_t lv_sdl_window_get_vertical_resolution(lv_display_t * display) +{ + /* Private function, fine to assert here*/ + LV_ASSERT_NULL(display); + lv_sdl_window_t * dsc = lv_display_get_driver_data(display); + LV_ASSERT_NULL(dsc); + return (int32_t)((float)(display->ver_res) * dsc->zoom); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline int sdl_render_mode(void) +{ + return LV_SDL_RENDER_MODE; +} + +/** + * SDL main thread. All SDL related task have to be handled here! + * It initializes SDL, handles drawing and the mouse. + */ +static void sdl_event_handler(lv_timer_t * t) +{ + LV_UNUSED(t); + + /*Refresh handling*/ + SDL_Event event; + while(SDL_PollEvent(&event)) { + lv_sdl_mouse_handler(&event); +#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER + lv_sdl_mousewheel_handler(&event); +#endif + lv_sdl_keyboard_handler(&event); + + if(event.type == SDL_WINDOWEVENT) { + lv_display_t * disp = lv_sdl_get_disp_from_win_id(event.window.windowID); + if(disp == NULL) continue; + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + switch(event.window.event) { +#if SDL_VERSION_ATLEAST(2, 0, 5) + case SDL_WINDOWEVENT_TAKE_FOCUS: +#endif + case SDL_WINDOWEVENT_EXPOSED: + lv_sdl_backend_ops.redraw(disp); + break; + case SDL_WINDOWEVENT_RESIZED: + dsc->ignore_size_chg = 1; + int32_t hres = (int32_t)((float)(event.window.data1) / dsc->zoom); + int32_t vres = (int32_t)((float)(event.window.data2) / dsc->zoom); + lv_display_set_resolution(disp, hres, vres); + dsc->ignore_size_chg = 0; + lv_refr_now(disp); + break; + case SDL_WINDOWEVENT_CLOSE: + lv_display_delete(disp); + break; + default: + break; + } + } + if(event.type == SDL_QUIT) { + SDL_Quit(); + lv_deinit(); + inited = false; +#if LV_SDL_DIRECT_EXIT + exit(0); +#endif + } + } +} + +static lv_result_t window_create(lv_display_t * disp) +{ + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + dsc->zoom = 1.0; + + int flag = 0; +#if LV_SDL_USE_EGL + flag |= SDL_WINDOW_OPENGL; +#endif + +#if LV_SDL_FULLSCREEN + flag |= SDL_WINDOW_FULLSCREEN; +#endif + + int32_t hor_res = (int32_t)((float)(disp->hor_res) * dsc->zoom); + int32_t ver_res = (int32_t)((float)(disp->ver_res) * dsc->zoom); + dsc->window = SDL_CreateWindow("LVGL Simulator", + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + hor_res, ver_res, flag); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/ + if(!dsc->window) { + LV_LOG_ERROR("Failed to create SDL window"); + return LV_RESULT_INVALID; + } + if(lv_sdl_backend_ops.init_display(disp) != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to initialize SDL backend"); + SDL_DestroyWindow(dsc->window); + return LV_RESULT_INVALID; + } + + /*Some platforms (e.g. Emscripten) seem to require setting the size again */ + SDL_SetWindowSize(dsc->window, hor_res, ver_res); + return LV_RESULT_OK; +} + +static void res_chg_event_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_current_target(e); + if(lv_sdl_backend_ops.resize_display(disp) != LV_RESULT_OK) { + LV_LOG_WARN("Failed to resize display"); + return; + } + + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + if(!dsc->ignore_size_chg) { + SDL_SetWindowSize(dsc->window, + lv_sdl_window_get_horizontal_resolution(disp), + lv_sdl_window_get_vertical_resolution(disp)); + } +} + +static void release_disp_cb(lv_event_t * e) +{ + if(lv_deinit_in_progress) { + lv_sdl_quit(); + } + lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e); + lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); + + lv_sdl_backend_ops.deinit_display(disp); + SDL_DestroyWindow(dsc->window); + lv_free(dsc); + lv_display_set_driver_data(disp, NULL); +} + +#endif /*LV_USE_SDL*/ diff --git a/inc/lvgl/src/drivers/sdl/lv_sdl_window.h b/inc/lvgl/src/drivers/sdl/lv_sdl_window.h new file mode 100644 index 0000000..e30b458 --- /dev/null +++ b/inc/lvgl/src/drivers/sdl/lv_sdl_window.h @@ -0,0 +1,75 @@ +/** + * @file lv_sdl_window.h + * + */ + +/** + * Modified by NXP in 2025 + */ + +#ifndef LV_SDL_WINDOW_H +#define LV_SDL_WINDOW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_SDL + +/********************* + * DEFINES + *********************/ + +/* Possible values of LV_SDL_MOUSEWHEEL_MODE */ +#define LV_SDL_MOUSEWHEEL_MODE_ENCODER 0 /* The mousewheel emulates an encoder input device*/ +#define LV_SDL_MOUSEWHEEL_MODE_CROWN 1 /* The mousewheel emulates a smart watch crown*/ + +/********************** + * TYPEDEFS + **********************/ + +struct SDL_Window; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res); + +void lv_sdl_window_set_resizeable(lv_display_t * disp, bool value); + +void lv_sdl_window_set_size(lv_display_t * disp, int32_t hor_res, int32_t ver_res); + +void lv_sdl_window_set_zoom(lv_display_t * disp, float zoom); + +float lv_sdl_window_get_zoom(lv_display_t * disp); + +void lv_sdl_window_set_title(lv_display_t * disp, const char * title); + +void lv_sdl_window_set_icon(lv_display_t * disp, void * icon, int32_t width, int32_t height); + +void * lv_sdl_window_get_renderer(lv_display_t * disp); + +void lv_sdl_quit(void); + +struct SDL_Window * lv_sdl_window_get_window(lv_display_t * disp); + +/********************** + * MACROS + **********************/ + + +#endif /* LV_DRV_SDL */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_SDL_WINDOW_H */ diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi.h b/inc/lvgl/src/drivers/uefi/lv_uefi.h new file mode 100644 index 0000000..6302555 --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi.h @@ -0,0 +1,106 @@ +/** + * @file lv_uefi.h + * + */ + +#ifndef LV_UEFI_H +#define LV_UEFI_H + +#if LV_USE_UEFI + + #include LV_USE_UEFI_INCLUDE + + #if defined(__clang__) || defined(__GNUC__) + #if defined(__x86_64__) + #define __LV_UEFI_ARCH_X64__ + #define __LV_UEFI_64BIT__ + #elif defined(__i386__) + #define __LV_UEFI_ARCH_X86__ + #define __LV_UEFI_32BIT__ + #elif defined(__aarch64__) + #define __LV_UEFI_ARCH_AARCH64__ + #define __LV_UEFI_64BIT__ + #else + #error Architecture is not supported + #endif + #define LV_UEFI_STATIC_ASSERT _Static_assert + #elif defined(_MSC_VER) + #if defined(_M_AMD64) && !defined(_M_ARM64) + #define __LV_UEFI_ARCH_X64__ + #define __LV_UEFI_64BIT__ + #elif defined(_M_IX86) + #define __LV_UEFI_ARCH_X86__ + #define __LV_UEFI_32BIT__ + #elif defined(_M_ARM64) + #define __LV_UEFI_ARCH_AARCH64__ + #define __LV_UEFI_64BIT__ + #else + #error Architecture is not supported + #endif + #define LV_UEFI_STATIC_ASSERT static_assert + #else + #error Your compiler is not supported + #endif + + #ifdef LV_USE_UEFI_INCLUDE + #include LV_USE_UEFI_INCLUDE + #else + #error No UEFI headers available + #endif + + // Verify that all required protocols are known + #if !defined(EFI_LOADED_IMAGE_PROTOCOL_GUID) + #error Missing support for EFI_LOADED_IMAGE_PROTOCOL + #endif + #if !defined(EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID) + #error Missing support for EFI_SIMPLE_FILE_SYSTEM_PROTOCOL + #endif + #if !defined(EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID) + #error Missing support for EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL + #endif + #if !defined(EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID) + #error Missing support for EFI_SIMPLE_TEXT_INPUT_PROTOCOL + #endif + #if !defined(EFI_SIMPLE_POINTER_PROTOCOL_GUID) + #error Missing support for EFI_SIMPLE_POINTER_PROTOCOL + #endif + #if !defined(EFI_ABSOLUTE_POINTER_PROTOCOL_GUID) + #error Missing support for EFI_ABSOLUTE_POINTER_PROTOCOL + #endif + #if !defined(EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID) + #error Missing support for EFI_GRAPHICS_OUTPUT_PROTOCOL + #endif + #if !defined(EFI_EDID_ACTIVE_PROTOCOL_GUID) + #error Missing support for EFI_EDID_ACTIVE_PROTOCOL + #endif + #if !defined(EFI_FILE_INFO_ID) + #error Missing support for EFI_FILE_INFO + #endif + #if !defined(EFI_TIMESTAMP_PROTOCOL_GUID) + #error Missing support for EFI_TIMESTAMP_PROTOCOL_GUID + #endif + + // Verify that all types have the correct size + LV_UEFI_STATIC_ASSERT(sizeof(BOOLEAN) == 1, "Size check for 'BOOLEAN' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(INT8) == 1, "Size check for 'INT8' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(UINT8) == 1, "Size check for 'UINT8' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(INT16) == 2, "Size check for 'INT16' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(UINT16) == 2, "Size check for 'UINT16' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(INT32) == 4, "Size check for 'INT32' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(UINT32) == 4, "Size check for 'UINT32' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(INT64) == 8, "Size check for 'INT64' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(UINT64) == 8, "Size check for 'UINT64' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(CHAR8) == 1, "Size check for 'CHAR8' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(CHAR16) == 2, "Size check for 'CHAR16' failed."); + + #ifdef __LV_UEFI_32BIT__ + LV_UEFI_STATIC_ASSERT(sizeof(INTN) == 4, "Size check for 'INTN' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(UINTN) == 4, "Size check for 'UINTN' failed."); + #else + LV_UEFI_STATIC_ASSERT(sizeof(INTN) == 8, "Size check for 'INTN' failed."); + LV_UEFI_STATIC_ASSERT(sizeof(UINTN) == 8, "Size check for 'UINTN' failed."); + #endif + +#endif + +#endif \ No newline at end of file diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_context.c b/inc/lvgl/src/drivers/uefi/lv_uefi_context.c new file mode 100644 index 0000000..96575fe --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_context.c @@ -0,0 +1,91 @@ +/** + * @file lv_uefi_context.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" + +#if LV_USE_UEFI + +#include "lv_uefi_context.h" +#include "lv_uefi_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * @brief Initialize the UEFI cache variables. + * @param image_handle The handle of the current image + * @param system_table Pointer to the system table + * @remark This has to be called before lv_init(). +*/ +void lv_uefi_init(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * system_table) +{ + LV_ASSERT_NULL(image_handle); + LV_ASSERT_NULL(system_table); + + gLvEfiImageHandle = image_handle; + gLvEfiST = system_table; + gLvEfiBS = gLvEfiST->BootServices; + gLvEfiRT = gLvEfiST->RuntimeServices; +} + +/** + * @brief Initialize the LVGL UEFI backend. + * @remark This is a private API which is used for LVGL UEFI backend + * implementation. LVGL users shouldn't use that because the + * LVGL has already used it in lv_init. + */ +void lv_uefi_platform_init(void) +{ + LV_ASSERT_NULL(gLvEfiImageHandle); + LV_ASSERT_NULL(gLvEfiST); + LV_ASSERT_NULL(gLvEfiBS); + LV_ASSERT_NULL(gLvEfiRT); +} + +/** + * @brief Cleanup the LVGL UEFI backend. + * @remark This is a private API which is used for LVGL UEFI backend + * implementation. LVGL users shouldn't use that because the + * LVGL has already used it in lv_deinit. +*/ +void lv_uefi_platform_deinit(void) +{ + ; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_context.h b/inc/lvgl/src/drivers/uefi/lv_uefi_context.h new file mode 100644 index 0000000..1ad0885 --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_context.h @@ -0,0 +1,72 @@ +/** + * @file lv_uefi_context.h + * + */ + +#ifndef __LV_UEFI_CONTEXT_H__ +#define __LV_UEFI_CONTEXT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_UEFI + +#include "lv_uefi.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the UEFI cache variables. + * @param image_handle The handle of the current image + * @param system_table Pointer to the system table + * @remark This has to be called before lv_init(). +*/ +void lv_uefi_init( + EFI_HANDLE image_handle, + EFI_SYSTEM_TABLE * system_table); + +/** + * @brief Initialize the LVGL UEFI backend. + * @remark This is a private API which is used for LVGL UEFI backend + * implementation. LVGL users shouldn't use that because the + * LVGL has already used it in lv_init. +*/ +void lv_uefi_platform_init(void); + +/** + * @brief Cleanup the LVGL UEFI backend. + * @remark This is a private API which is used for LVGL UEFI backend + * implementation. LVGL users shouldn't use that because the + * LVGL has already used it in lv_deinit. +*/ +void lv_uefi_platform_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif //__LV_UEFI_CONTEXT_H__ + diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_display.c b/inc/lvgl/src/drivers/uefi/lv_uefi_display.c new file mode 100644 index 0000000..fa1a420 --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_display.c @@ -0,0 +1,284 @@ +/** + * @file lv_uefi_display.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" + +#if LV_USE_UEFI + +#include "lv_uefi_display.h" +#include "lv_uefi_private.h" + +#if LV_COLOR_DEPTH != 32 + #error [lv_uefi] Unsupported LV_COLOR_DEPTH. +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct _lv_uefi_display_context_t { + EFI_HANDLE handle; + EFI_GRAPHICS_OUTPUT_PROTOCOL * gop_protocol; + void * buffer; + size_t buffer_size; +} lv_uefi_display_context_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _display_event_cb(lv_event_t * e); +static void _display_flush_cb(lv_display_t * display, const lv_area_t * area, uint8_t * px_map); + +static void _display_ctx_free(lv_uefi_display_context_t * display_ctx); +static bool _display_interface_is_valid(const EFI_GRAPHICS_OUTPUT_PROTOCOL * interface); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +static EFI_GUID _uefi_guid_graphics_output = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; +static EFI_GUID _uefi_guid_edid_active = EFI_EDID_ACTIVE_PROTOCOL_GUID; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * @brief Create a LVGL display object. + * @param handle The handle on which an instance of the EFI_GRAPHICS_OUTPUT_PROTOCOL protocol is installed. + * @return The created LVGL display object. + */ +lv_display_t * lv_uefi_display_create(void * handle) +{ + lv_display_t * display = NULL; + lv_uefi_display_context_t * display_ctx; + + if(!lv_uefi_protocol_test(handle, &_uefi_guid_graphics_output)) return NULL; + + display_ctx = lv_calloc(1, sizeof(lv_uefi_display_context_t)); + LV_ASSERT_MALLOC(display_ctx); + + display_ctx->handle = handle; + display_ctx->gop_protocol = (EFI_GRAPHICS_OUTPUT_PROTOCOL *)lv_uefi_protocol_open(handle, &_uefi_guid_graphics_output); + if(!_display_interface_is_valid(display_ctx->gop_protocol)) { + LV_LOG_WARN("[lv_uefi] The GOP interface is not valid."); + goto error; + } + + // 4 bytes per pixel + display_ctx->buffer_size = 4 * display_ctx->gop_protocol->Mode->Info->HorizontalResolution * + display_ctx->gop_protocol->Mode->Info->VerticalResolution; + display_ctx->buffer = lv_malloc(display_ctx->buffer_size); + LV_ASSERT_MALLOC(display_ctx->buffer); + + display = lv_display_create(display_ctx->gop_protocol->Mode->Info->HorizontalResolution, + display_ctx->gop_protocol->Mode->Info->VerticalResolution); + lv_display_add_event_cb(display, _display_event_cb, LV_EVENT_DELETE, display); + lv_display_set_flush_cb(display, _display_flush_cb); + lv_display_set_buffers(display, display_ctx->buffer, NULL, (uint32_t)display_ctx->buffer_size, + LV_DISPLAY_RENDER_MODE_DIRECT); + lv_display_set_user_data(display, display_ctx); + + goto finish; + +error: + if(display != NULL) { + lv_display_set_user_data(display, NULL); + lv_display_delete(display); + display = NULL; + } + + if(display_ctx != NULL) _display_ctx_free(display_ctx); + +finish: + return display; +} + +/** + * @brief Try to find the active display handle. + * @return The handle or NULL if not found. + * @remark The active display need interfaces for EFI_GRAPHICS_OUTPUT_PROTOCOL and EFI_EDID_ACTIVE_PROTOCOL +*/ +void * lv_uefi_display_get_active(void) +{ + EFI_STATUS status; + EFI_HANDLE active_handle = NULL; + EFI_HANDLE * handles = NULL; + UINTN no_handles; + UINTN index; + + status = gLvEfiBS->LocateHandleBuffer( + ByProtocol, + &_uefi_guid_graphics_output, + NULL, + &no_handles, + &handles); + if(status != EFI_SUCCESS) goto error; + + for(index = 0; index < no_handles; index++) { + if(!lv_uefi_protocol_test(handles[index], &_uefi_guid_edid_active)) continue; + if(!lv_uefi_protocol_test(handles[index], &_uefi_guid_graphics_output)) continue; + active_handle = handles[index]; + break; + } + + goto finish; + +error: + +finish: + if(handles != NULL) gLvEfiBS->FreePool(handles); + + return active_handle; +} + +/** + * @brief Try to find any display handle. + * @return The handle or NULL if not found. +*/ +void * lv_uefi_display_get_any(void) +{ + EFI_STATUS status; + EFI_HANDLE active_handle = NULL; + EFI_HANDLE * handles = NULL; + UINTN no_handles; + UINTN index; + + status = gLvEfiBS->LocateHandleBuffer( + ByProtocol, + &_uefi_guid_graphics_output, + NULL, + &no_handles, + &handles); + if(status != EFI_SUCCESS) goto error; + + for(index = 0; index < no_handles; index++) { + if(!lv_uefi_protocol_test(handles[index], &_uefi_guid_graphics_output)) continue; + active_handle = handles[index]; + break; + } + + goto finish; + +error: + +finish: + if(handles != NULL) gLvEfiBS->FreePool(handles); + + return active_handle; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _display_event_cb(lv_event_t * e) +{ + lv_display_t * display; + lv_uefi_display_context_t * display_ctx; + + if(lv_event_get_code(e) != LV_EVENT_DELETE) return; + + display = (lv_display_t *)lv_event_get_user_data(e); + if(display == NULL) return; + + display_ctx = (lv_uefi_display_context_t *)lv_display_get_user_data(display); + lv_display_set_user_data(display, NULL); + + if(display_ctx != NULL) _display_ctx_free(display_ctx); +} + +static void _display_flush_cb(lv_display_t * display, const lv_area_t * area, uint8_t * px_map) +{ + EFI_STATUS status; + int32_t w; + int32_t h; + + lv_uefi_display_context_t * display_ctx = (lv_uefi_display_context_t *)lv_display_get_user_data(display); + LV_ASSERT_NULL(display_ctx); + + w = (int32_t)area->x2 - (int32_t)area->x1 + 1; + h = (int32_t)area->y2 - (int32_t)area->y1 + 1; + + if(w < 0 || h < 0) { + LV_LOG_ERROR("[lv_uefi] Invalid lv_display_flush_cb call (invalid rect)."); + goto error; + } + + if((uint32_t)(area->x1 + w) > display_ctx->gop_protocol->Mode->Info->HorizontalResolution) { + LV_LOG_ERROR("[lv_uefi] Invalid lv_display_flush_cb call (invalid width)."); + goto error; + } + + if((uint32_t)(area->y1 + h) > display_ctx->gop_protocol->Mode->Info->HorizontalResolution) { + LV_LOG_ERROR("[lv_uefi] Invalid lv_display_flush_cb call (invalid height)."); + goto error; + } + + status = display_ctx->gop_protocol->Blt( + display_ctx->gop_protocol, + (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)px_map, + EfiBltBufferToVideo, + area->x1, + area->y1, + area->x1, + area->y1, + w, + h, + display_ctx->gop_protocol->Mode->Info->HorizontalResolution * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + if(status != EFI_SUCCESS) { + LV_LOG_ERROR("[lv_uefi] Blt failed with error code: %llx.", status); + goto error; + } + + goto finish; + +error: + +finish: + lv_display_flush_ready(display); +} + +static void _display_ctx_free(lv_uefi_display_context_t * display_ctx) +{ + if(display_ctx == NULL) { + return; + } + + if(display_ctx->gop_protocol != NULL) lv_uefi_protocol_close(display_ctx->handle, &_uefi_guid_graphics_output); + if(display_ctx->buffer != NULL) lv_free(display_ctx->buffer); + + lv_free(display_ctx); +} + +static bool _display_interface_is_valid(const EFI_GRAPHICS_OUTPUT_PROTOCOL * interface) +{ + if(interface == NULL) return FALSE; + if(interface->Mode == NULL) return FALSE; + if(interface->Mode->Info == NULL) return FALSE; + if(interface->Mode->Info->HorizontalResolution == 0) return FALSE; + if(interface->Mode->Info->HorizontalResolution >= 32767) return FALSE; + if(interface->Mode->Info->VerticalResolution == 0) return FALSE; + if(interface->Mode->Info->VerticalResolution >= 32767) return FALSE; + + return TRUE; +} +#endif diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_display.h b/inc/lvgl/src/drivers/uefi/lv_uefi_display.h new file mode 100644 index 0000000..ec09b26 --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_display.h @@ -0,0 +1,66 @@ +/** + * @file lv_uefi_display.h + * + */ + +#ifndef __LV_UEFI_DISPLAY_H__ +#define __LV_UEFI_DISPLAY_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" + +#if LV_USE_UEFI + +#include "lv_uefi.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Create a LVGL display object. + * @param handle The handle on which an instance of the EFI_GRAPHICS_OUTPUT_PROTOCOL protocol is installed. + * @return The created LVGL display object. +*/ +lv_display_t * lv_uefi_display_create(void * handle); + +/** + * @brief Try to find the active display handle. + * @return The handle or NULL if not found. + * @remark The active display need interfaces for EFI_GRAPHICS_OUTPUT_PROTOCOL and EFI_EDID_ACTIVE_PROTOCOL +*/ +void * lv_uefi_display_get_active(void); + +/** + * @brief Try to find any display handle. + * @return The handle or NULL if not found. +*/ +void * lv_uefi_display_get_any(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif //__LV_UEFI_DISPLAY_H__ + diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_edk2.h b/inc/lvgl/src/drivers/uefi/lv_uefi_edk2.h new file mode 100644 index 0000000..870b997 --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_edk2.h @@ -0,0 +1,28 @@ +/** + * @file lv_uefi_edk2.h + * + */ + +#ifndef LV_UEFI_EDK2_H +#define LV_UEFI_EDK2_H + +#if LV_USE_UEFI + + #define LV_UEFI_EDK2_HEADERS 1 + + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + +#endif + +#endif \ No newline at end of file diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_gnu_efi.h b/inc/lvgl/src/drivers/uefi/lv_uefi_gnu_efi.h new file mode 100644 index 0000000..23e9e49 --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_gnu_efi.h @@ -0,0 +1,17 @@ +/** + * @file lv_uefi_gnu_efi.h + * + */ + +#ifndef LV_UEFI_GNU_EFI_H +#define LV_UEFI_GNU_EFI_H + +#if LV_USE_UEFI + + #define LV_UEFI_GNU_EFI_HEADERS 1 + + #include + +#endif + +#endif \ No newline at end of file diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_indev.h b/inc/lvgl/src/drivers/uefi/lv_uefi_indev.h new file mode 100644 index 0000000..654899f --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_indev.h @@ -0,0 +1,109 @@ +/** + * @file lv_uefi_indev.h + * + */ + +#ifndef __LV_UEFI_INDEV_H__ +#define __LV_UEFI_INDEV_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" + +#if LV_USE_UEFI + +#include "lv_uefi.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Create an indev object. + * @param display_res The resolution of the display in pixels, needed to scale the input. + * If NULL the resolution of the current default display will be used. + * @return The created LVGL indev object. +*/ +lv_indev_t * lv_uefi_simple_pointer_indev_create(lv_point_t * display_res); + +/** + * @brief Add an EFI_SIMPLE_POINTER_PROTOCOL interface to the indev. + * @param indev Indev that was created with lv_uefi_simple_pointer_indev_create. + * @param handle The handle on which an instance of the EFI_SIMPLE_POINTER_PROTOCOL protocol is installed. + * @return True if the interface was added. +*/ +bool lv_uefi_simple_pointer_indev_add_handle(lv_indev_t * indev, EFI_HANDLE handle); + +/** + * @brief Add all available EFI_SIMPLE_POINTER_PROTOCOL interfaces to the indev. + * @param indev Indev that was created with lv_uefi_simple_pointer_indev_create. +*/ +void lv_uefi_simple_pointer_indev_add_all(lv_indev_t * indev); + +/** + * @brief Create a LVGL indev object. + * @param display_res The resolution of the display in pixels, needed to scale the input. + * @return The created LVGL indev object. +*/ +lv_indev_t * lv_uefi_absolute_pointer_indev_create(lv_point_t * display_res); + +/** + * @brief Add an EFI_ABSOLUTE_POINTER_PROTOCOL interface to the indev. + * @param indev Indev that was created with lv_uefi_absolute_pointer_indev_create. + * @param handle The handle on which an instance of the EFI_ABSOLUTE_POINTER_PROTOCOL protocol is installed. + * @return True if the interface was added. +*/ +bool lv_uefi_absolute_pointer_indev_add_handle(lv_indev_t * indev, EFI_HANDLE handle); + +/** + * @brief Add all available EFI_ABSOLUTE_POINTER_PROTOCOL interfaces to the indev. + * @param indev Indev that was created with lv_uefi_absolute_pointer_indev_create. +*/ +void lv_uefi_absolute_pointer_indev_add_all(lv_indev_t * indev); + +/** + * @brief Create an indev object. + * @return The created LVGL indev object. +*/ +lv_indev_t * lv_uefi_simple_text_input_indev_create(void); + +/** + * @brief Add an EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL interface to the indev. + * @param indev Indev that was created with lv_uefi_simple_text_input_indev_create. + * @param handle The handle on which an instance of the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL protocol is installed. + * @return True if the interface was added. +*/ +bool lv_uefi_simple_text_input_indev_add_handle(lv_indev_t * indev, EFI_HANDLE handle); + +/** + * @brief Add all available EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL interfaces to the indev. + * @param indev Indev that was created with lv_uefi_simple_text_input_indev_create. +*/ +void lv_uefi_simple_text_input_indev_add_all(lv_indev_t * indev); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif //__LV_UEFI_INDEV_H__ + diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_indev_keyboard.c b/inc/lvgl/src/drivers/uefi/lv_uefi_indev_keyboard.c new file mode 100644 index 0000000..4c8ad0b --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_indev_keyboard.c @@ -0,0 +1,346 @@ +/** + * @file lv_uefi_indev_keyboard.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" +#include "../../stdlib/lv_mem.h" +#include "../../misc/lv_types.h" +#include "../../misc/lv_text_private.h" + +#if LV_USE_UEFI + +#include "lv_uefi_indev.h" +#include "lv_uefi_private.h" + +/********************* + * DEFINES + *********************/ + +#define SIMPLE_TEXT_INPUT_INDEV_SIGNATURE 0x53495449 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_uefi_simple_text_input_key_cache_t { + uint32_t key; /**< Key code*/ + bool pressed; /**< If true this is a pressed entry if false this is a release entry*/ +} lv_uefi_simple_text_input_key_cache_t; + +typedef struct _lv_uefi_simple_text_input_handle_context_t { + EFI_HANDLE handle; + EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL * interface; +} lv_uefi_simple_text_input_handle_context_t; + +typedef struct _lv_uefi_simple_text_input_context_t { + uint32_t signature; /**< Has to be checked to avoid access to a different indev*/ + lv_ll_t handles; + lv_ll_t key_cache; +} lv_uefi_simple_text_input_context_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _simple_text_input_event_cb(lv_event_t * e); +static void _simple_text_input_read_cb(lv_indev_t * indev, lv_indev_data_t * data); + +static void _simple_text_input_handle_context_free(void * ptr); +static void _simple_text_input_context_free(lv_uefi_simple_text_input_context_t * indev_ctx); + +static bool _simple_text_input_interface_is_valid(const EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL * interface); + +static void _simple_text_input_read(lv_uefi_simple_text_input_context_t * indev_ctx, + lv_uefi_simple_text_input_handle_context_t * handle_ctx); + +static uint32_t _utf8_from_unicode(UINT32 unicode); +static uint32_t _key_from_uefi_key(const EFI_KEY_DATA * key); + +/********************** + * STATIC VARIABLES + **********************/ + +static EFI_GUID _uefi_guid_simple_text_input = EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * @brief Create an indev object. + * @return The created LVGL indev object. +*/ +lv_indev_t * lv_uefi_simple_text_input_indev_create(void) +{ + lv_indev_t * indev = NULL; + lv_uefi_simple_text_input_context_t * indev_ctx = NULL; + + indev_ctx = lv_calloc(1, sizeof(lv_uefi_simple_text_input_context_t)); + LV_ASSERT_MALLOC(indev_ctx); + + indev_ctx->signature = SIMPLE_TEXT_INPUT_INDEV_SIGNATURE; + + lv_ll_init(&indev_ctx->handles, sizeof(lv_uefi_simple_text_input_handle_context_t)); + lv_ll_init(&indev_ctx->key_cache, sizeof(lv_uefi_simple_text_input_key_cache_t)); + + indev = lv_indev_create(); + lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_user_data(indev, indev_ctx); + lv_indev_add_event_cb(indev, _simple_text_input_event_cb, LV_EVENT_DELETE, indev); + lv_indev_set_read_cb(indev, _simple_text_input_read_cb); + + return indev; +} + +/** + * @brief Add an EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL interface to the indev. + * @param indev Indev that was created with lv_uefi_simple_text_input_indev_create. + * @param handle The handle on which an instance of the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL protocol is installed. + * @return True if the interface was added. +*/ +bool lv_uefi_simple_text_input_indev_add_handle(lv_indev_t * indev, EFI_HANDLE handle) +{ + EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL * interface = NULL; + lv_uefi_simple_text_input_handle_context_t * handle_ctx = NULL; + + lv_uefi_simple_text_input_context_t * indev_ctx = (lv_uefi_simple_text_input_context_t *)lv_indev_get_user_data(indev); + LV_ASSERT_NULL(indev_ctx); + + if(indev_ctx->signature != SIMPLE_TEXT_INPUT_INDEV_SIGNATURE) return false; + + interface = (EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *)lv_uefi_protocol_open(handle, &_uefi_guid_simple_text_input); + if(!_simple_text_input_interface_is_valid(interface)) { + lv_uefi_protocol_close(handle, &_uefi_guid_simple_text_input); + LV_LOG_WARN("[lv_uefi] The SIMPLE_TEXT_INPUT interface is not valid."); + return false; + } + + handle_ctx = (lv_uefi_simple_text_input_handle_context_t *) lv_ll_ins_head(&indev_ctx->handles); + LV_ASSERT_MALLOC(handle_ctx); + + handle_ctx->handle = handle; + handle_ctx->interface = interface; + + return true; +} + +/** + * @brief Add all available EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL interfaces to the indev. + * @param indev Indev that was created with lv_uefi_simple_text_input_indev_create. +*/ +void lv_uefi_simple_text_input_indev_add_all(lv_indev_t * indev) +{ + EFI_STATUS status; + EFI_HANDLE * handles = NULL; + UINTN no_handles; + UINTN index; + + lv_uefi_simple_text_input_context_t * indev_ctx = (lv_uefi_simple_text_input_context_t *)lv_indev_get_user_data(indev); + LV_ASSERT_NULL(indev_ctx); + + if(indev_ctx->signature != SIMPLE_TEXT_INPUT_INDEV_SIGNATURE) return; + + status = gLvEfiBS->LocateHandleBuffer(ByProtocol, &_uefi_guid_simple_text_input, NULL, &no_handles, &handles); + if(status != EFI_SUCCESS) { + LV_LOG_ERROR("[lv_uefi] LocateHandleBuffer(SIMPLE_TEXT_INPUT_EX) failed with error code %llx.", status); + return; + } + + for(index = 0; index < no_handles; index++) { + lv_uefi_simple_text_input_indev_add_handle(indev, handles[index]); + } + + if(handles != NULL) gLvEfiBS->FreePool(handles); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _simple_text_input_event_cb(lv_event_t * e) +{ + lv_indev_t * indev; + lv_uefi_simple_text_input_context_t * indev_ctx; + + if(lv_event_get_code(e) != LV_EVENT_DELETE) return; + + indev = (lv_indev_t *)lv_event_get_user_data(e); + if(indev == NULL) return; + + indev_ctx = (lv_uefi_simple_text_input_context_t *)lv_indev_get_user_data(indev); + lv_indev_set_user_data(indev, NULL); + + if(indev_ctx != NULL) _simple_text_input_context_free(indev_ctx); +} + +static void _simple_text_input_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_uefi_simple_text_input_handle_context_t * handle_ctx = NULL; + lv_uefi_simple_text_input_key_cache_t * key_cache = NULL; + void * node = NULL; + + lv_uefi_simple_text_input_context_t * indev_ctx = (lv_uefi_simple_text_input_context_t *)lv_indev_get_user_data(indev); + LV_ASSERT_NULL(indev_ctx); + + /* Empty the buffer before reading new values */ + if(lv_ll_is_empty(&indev_ctx->key_cache)) { + // Read from all registered devices + for(node = lv_ll_get_head(&indev_ctx->handles); node != NULL; node = lv_ll_get_next(&indev_ctx->handles, node)) { + handle_ctx = (lv_uefi_simple_text_input_handle_context_t *) node; + _simple_text_input_read(indev_ctx, handle_ctx); + } + } + + /* Return the first value */ + node = lv_ll_get_head(&indev_ctx->key_cache); + if(node != NULL) { + key_cache = (lv_uefi_simple_text_input_key_cache_t *)node; + data->state = key_cache->pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->key = key_cache->key; + lv_ll_remove(&indev_ctx->key_cache, node); + lv_free(key_cache); + } + + /* Continue reading if there are more values in the buffer */ + data->continue_reading = !lv_ll_is_empty(&indev_ctx->key_cache); +} + +static void _simple_text_input_context_free(lv_uefi_simple_text_input_context_t * indev_ctx) +{ + if(indev_ctx == NULL) return; + lv_ll_clear_custom(&indev_ctx->handles, _simple_text_input_handle_context_free); + lv_ll_clear(&indev_ctx->key_cache); + lv_free(indev_ctx); +} + +static bool _simple_text_input_interface_is_valid(const EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL * interface) +{ + if(interface == NULL) return FALSE; + return TRUE; +} + +static void _simple_text_input_handle_context_free(void * ptr) +{ + lv_uefi_simple_text_input_handle_context_t * handle_ctx = (lv_uefi_simple_text_input_handle_context_t *)ptr; + + if(handle_ctx == NULL) return; + if(handle_ctx->interface) lv_uefi_protocol_close(handle_ctx->handle, &_uefi_guid_simple_text_input); + lv_free(handle_ctx); +} + +static void _simple_text_input_read(lv_uefi_simple_text_input_context_t * indev_ctx, + lv_uefi_simple_text_input_handle_context_t * handle_ctx) +{ + EFI_STATUS status; + EFI_KEY_DATA state; + uint32_t key; + lv_uefi_simple_text_input_key_cache_t * cache = NULL; + + LV_ASSERT_NULL(indev_ctx); + LV_ASSERT_NULL(handle_ctx); + + status = handle_ctx->interface->ReadKeyStrokeEx( + handle_ctx->interface, + &state); + if(status == EFI_NOT_READY) return; + if(status != EFI_SUCCESS) { + LV_LOG_ERROR("[lv_uefi] ReadKeyStrokeEx failed."); + return; + } + + key = _key_from_uefi_key(&state); + + /* insert the press */ + cache = (lv_uefi_simple_text_input_key_cache_t *) lv_ll_ins_tail(&indev_ctx->key_cache); + LV_ASSERT_MALLOC(cache); + cache->key = key; + cache->pressed = true; + + /* insert the release */ + cache = (lv_uefi_simple_text_input_key_cache_t *) lv_ll_ins_tail(&indev_ctx->key_cache); + LV_ASSERT_MALLOC(cache); + cache->key = key; + cache->pressed = false; +} + +static uint32_t _utf8_from_unicode(UINT32 unicode) +{ + uint8_t bytes[4] = {0, 0, 0, 0}; + + /* unicode < 128 -> 1 byte */ + if(unicode < 128) { + bytes[0] |= unicode; + } + /* unicode < 2048 -> 2 byte */ + else if(unicode < 2048) { + bytes[0] = 0xC0; + bytes[0] |= unicode >> 6; + bytes[1] = 0x80; + bytes[1] |= (unicode & 0x003F); + } + /* unicode < 65536 -> 3 byte */ + else if(unicode < 65536) { + bytes[0] = 0xE0; + bytes[0] |= unicode >> 12; + bytes[1] = 0x80; + bytes[1] |= ((unicode >> 6) & 0x003F); + bytes[2] = 0x80; + bytes[2] |= (unicode & 0x003F); + } + + return *((uint32_t *)bytes); +} + +static uint32_t _key_from_uefi_key(const EFI_KEY_DATA * key) +{ + LV_ASSERT_NULL(key); + + switch(key->Key.ScanCode) { + case 0x01: + return LV_KEY_UP; + case 0x02: + return LV_KEY_DOWN; + case 0x04: + return LV_KEY_LEFT; + case 0x03: + return LV_KEY_RIGHT; + case 0x08: + return LV_KEY_DEL; + case 0x05: + return LV_KEY_HOME; + case 0x06: + return LV_KEY_END; + case 0x17: + return LV_KEY_ESC; + /* ignore all other scan codes */ + default: + break; + } + + switch(key->Key.UnicodeChar) { + case 0x09: + return (key->KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) && + (key->KeyState.KeyShiftState & (EFI_RIGHT_SHIFT_PRESSED | EFI_LEFT_SHIFT_PRESSED)) ? + LV_KEY_PREV : + LV_KEY_NEXT; + case 0x08: + return LV_KEY_BACKSPACE; + case 0x0D: + return LV_KEY_ENTER; + case 0x18: + return LV_KEY_ESC; + default: + return _utf8_from_unicode(key->Key.UnicodeChar); + } +} + +#endif diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_indev_pointer.c b/inc/lvgl/src/drivers/uefi/lv_uefi_indev_pointer.c new file mode 100644 index 0000000..4714a61 --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_indev_pointer.c @@ -0,0 +1,285 @@ +/** + * @file lv_uefi_indev_pointer.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" +#include "../../stdlib/lv_mem.h" +#include "../../misc/lv_types.h" +#include "../../misc/lv_text_private.h" + +#if LV_USE_UEFI + +#include "lv_uefi_indev.h" +#include "lv_uefi_private.h" + +/********************* + * DEFINES + *********************/ + +#define SIMPLE_POINTER_INDEV_SIGNATURE 0x53505449 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_uefi_simple_pointer_handle_context_t { + EFI_HANDLE handle; + EFI_SIMPLE_POINTER_PROTOCOL * interface; + lv_point_t pixel_per_step_8; /**< How many pixels does the mouse cursor move in one step*/ +} lv_uefi_simple_pointer_handle_context_t; + +typedef struct _lv_uefi_simple_pointer_context_t { + uint32_t signature; /**< Has to be checked to avoid access to a different indev*/ + lv_point_t display_res; + lv_point_t position; + lv_ll_t handles; +} lv_uefi_simple_pointer_context_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _simple_pointer_indev_event_cb(lv_event_t * e); +static void _simple_pointer_read_cb(lv_indev_t * indev, lv_indev_data_t * data); +static void _simple_pointer_handle_context_free(void * ptr); +static void _simple_pointer_context_free(lv_uefi_simple_pointer_context_t * indev_ctx); +static bool _simple_pointer_interface_is_valid(const EFI_SIMPLE_POINTER_PROTOCOL * interface); +static void _simple_pointer_read(lv_uefi_simple_pointer_context_t * indev_ctx, + lv_uefi_simple_pointer_handle_context_t * handle_ctx, bool * was_pressed); + +/********************** + * STATIC VARIABLES + **********************/ + +static EFI_GUID _uefi_guid_simple_pointer = EFI_SIMPLE_POINTER_PROTOCOL_GUID; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * @brief Create an indev object. + * @param display_res The resolution of the display in pixels, needed to scale the input. + * If NULL the resolution of the current default display will be used. + * @return The created LVGL indev object. +*/ +lv_indev_t * lv_uefi_simple_pointer_indev_create(lv_point_t * display_res) +{ + lv_indev_t * indev = NULL; + lv_uefi_simple_pointer_context_t * indev_ctx = NULL; + + indev_ctx = lv_calloc(1, sizeof(lv_uefi_simple_pointer_context_t)); + LV_ASSERT_MALLOC(indev_ctx); + + indev_ctx->signature = SIMPLE_POINTER_INDEV_SIGNATURE; + + if(display_res != NULL) { + indev_ctx->display_res.x = display_res->x; + indev_ctx->display_res.y = display_res->y; + } + else { + indev_ctx->display_res.x = lv_display_get_horizontal_resolution(lv_display_get_default()); + indev_ctx->display_res.y = lv_display_get_vertical_resolution(lv_display_get_default()); + } + + lv_ll_init(&indev_ctx->handles, sizeof(lv_uefi_simple_pointer_handle_context_t)); + + indev = lv_indev_create(); + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_user_data(indev, indev_ctx); + lv_indev_add_event_cb(indev, _simple_pointer_indev_event_cb, LV_EVENT_DELETE, indev); + lv_indev_set_read_cb(indev, _simple_pointer_read_cb); + + return indev; +} + +/** + * @brief Add an EFI_SIMPLE_POINTER_PROTOCOL interface to the indev. + * @param indev Indev that was created with lv_uefi_simple_pointer_indev_create. + * @param handle The handle on which an instance of the EFI_SIMPLE_POINTER_PROTOCOL protocol is installed. + * @return True if the interface was added. +*/ +bool lv_uefi_simple_pointer_indev_add_handle(lv_indev_t * indev, EFI_HANDLE handle) +{ + EFI_SIMPLE_POINTER_PROTOCOL * interface = NULL; + lv_uefi_simple_pointer_handle_context_t * handle_ctx = NULL; + + lv_uefi_simple_pointer_context_t * indev_ctx = (lv_uefi_simple_pointer_context_t *)lv_indev_get_user_data(indev); + LV_ASSERT_NULL(indev_ctx); + + if(indev_ctx->signature != SIMPLE_POINTER_INDEV_SIGNATURE) return false; + + interface = (EFI_SIMPLE_POINTER_PROTOCOL *)lv_uefi_protocol_open(handle, &_uefi_guid_simple_pointer); + if(!_simple_pointer_interface_is_valid(interface)) { + lv_uefi_protocol_close(handle, &_uefi_guid_simple_pointer); + LV_LOG_WARN("[lv_uefi] The SIMPLE_POINTER interface is not valid."); + return false; + } + + handle_ctx = (lv_uefi_simple_pointer_handle_context_t *) lv_ll_ins_head(&indev_ctx->handles); + LV_ASSERT_MALLOC(handle_ctx); + + handle_ctx->handle = handle; + handle_ctx->interface = interface; + handle_ctx->pixel_per_step_8.x = (((indev_ctx->display_res.x) << 8) / 50) / + interface->Mode->ResolutionX; + handle_ctx->pixel_per_step_8.y = (((indev_ctx->display_res.y) << 8) / 50) / + interface->Mode->ResolutionY; + + return true; +} + +/** + * @brief Add all available EFI_SIMPLE_POINTER_PROTOCOL interfaces to the indev. + * @param indev Indev that was created with lv_uefi_simple_pointer_indev_create. +*/ +void lv_uefi_simple_pointer_indev_add_all(lv_indev_t * indev) +{ + EFI_STATUS status; + EFI_HANDLE * handles = NULL; + UINTN no_handles; + UINTN index; + + lv_uefi_simple_pointer_context_t * indev_ctx = (lv_uefi_simple_pointer_context_t *)lv_indev_get_user_data(indev); + LV_ASSERT_NULL(indev_ctx); + + if(indev_ctx->signature != SIMPLE_POINTER_INDEV_SIGNATURE) return; + + status = gLvEfiBS->LocateHandleBuffer(ByProtocol, &_uefi_guid_simple_pointer, NULL, &no_handles, &handles); + if(status != EFI_SUCCESS) { + LV_LOG_ERROR("[lv_uefi] LocateHandleBuffer(SIMPLE_POINTER) failed with error code %llx.", status); + return; + } + + for(index = 0; index < no_handles; index++) { + lv_uefi_simple_pointer_indev_add_handle(indev, handles[index]); + } + + if(handles != NULL) gLvEfiBS->FreePool(handles); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _simple_pointer_indev_event_cb(lv_event_t * e) +{ + lv_indev_t * indev; + lv_uefi_simple_pointer_context_t * indev_ctx; + + if(lv_event_get_code(e) != LV_EVENT_DELETE) return; + + indev = (lv_indev_t *)lv_event_get_user_data(e); + if(indev == NULL) return; + + indev_ctx = (lv_uefi_simple_pointer_context_t *)lv_indev_get_user_data(indev); + lv_indev_set_user_data(indev, NULL); + + if(indev_ctx != NULL) _simple_pointer_context_free(indev_ctx); +} + +static void _simple_pointer_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + void * node = NULL; + + lv_uefi_simple_pointer_context_t * indev_ctx = (lv_uefi_simple_pointer_context_t *)lv_indev_get_user_data(indev); + LV_ASSERT_NULL(indev_ctx); + + /* Read from all registered devices */ + for(node = lv_ll_get_head(&indev_ctx->handles); node != NULL; node = lv_ll_get_next(&indev_ctx->handles, node)) { + lv_uefi_simple_pointer_handle_context_t * handle_ctx = (lv_uefi_simple_pointer_handle_context_t *) node; + bool was_pressed = false; + + _simple_pointer_read(indev_ctx, handle_ctx, &was_pressed); + + data->state |= was_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + } + + /* Sanitize the events position */ + if(indev_ctx->position.x < 0) { + indev_ctx->position.x = 0; + } + else if(indev_ctx->position.x > indev_ctx->display_res.x - 1) { + indev_ctx->position.x = indev_ctx->display_res.x - 1; + } + + if(indev_ctx->position.y < 0) { + indev_ctx->position.y = 0; + } + else if(indev_ctx->position.y > indev_ctx->display_res.y - 1) { + indev_ctx->position.y = indev_ctx->display_res.y - 1; + } + + data->point.x = indev_ctx->position.x; + data->point.y = indev_ctx->position.y; + + data->continue_reading = FALSE; +} + +static void _simple_pointer_context_free(lv_uefi_simple_pointer_context_t * indev_ctx) +{ + if(indev_ctx == NULL) return; + lv_ll_clear_custom(&indev_ctx->handles, _simple_pointer_handle_context_free); + lv_free(indev_ctx); +} + +static bool _simple_pointer_interface_is_valid(const EFI_SIMPLE_POINTER_PROTOCOL * interface) +{ + if(interface == NULL) return FALSE; + if(interface->Mode == NULL) return FALSE; + if(interface->Mode->ResolutionX == 0) return FALSE; + if(interface->Mode->ResolutionX >= 256) return FALSE; + if(interface->Mode->ResolutionY == 0) return FALSE; + if(interface->Mode->ResolutionY >= 256) return FALSE; + return TRUE; +} + +static void _simple_pointer_handle_context_free(void * ptr) +{ + lv_uefi_simple_pointer_handle_context_t * handle_ctx = (lv_uefi_simple_pointer_handle_context_t *)ptr; + + if(handle_ctx == NULL) return; + if(handle_ctx->interface) lv_uefi_protocol_close(handle_ctx->handle, &_uefi_guid_simple_pointer); + lv_free(handle_ctx); +} + +static void _simple_pointer_read(lv_uefi_simple_pointer_context_t * indev_ctx, + lv_uefi_simple_pointer_handle_context_t * handle_ctx, bool * was_pressed) +{ + EFI_STATUS status; + EFI_SIMPLE_POINTER_STATE state; + lv_point_t pointer_mov; + + LV_ASSERT_NULL(indev_ctx); + LV_ASSERT_NULL(handle_ctx); + LV_ASSERT_NULL(was_pressed); + + status = handle_ctx->interface->GetState( + handle_ctx->interface, + &state); + if(status == EFI_NOT_READY) return; + if(status != EFI_SUCCESS) { + LV_LOG_ERROR("[lv_uefi] GetState failed."); + return; + } + + pointer_mov.x = (state.RelativeMovementX * handle_ctx->pixel_per_step_8.x) >> 8; + pointer_mov.y = (state.RelativeMovementY * handle_ctx->pixel_per_step_8.y) >> 8; + + indev_ctx->position.x += pointer_mov.x; + indev_ctx->position.y += pointer_mov.y; + + /* Set the state to pressed if one of the interfaces reports a press */ + *was_pressed = state.LeftButton; +} + +#endif diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_indev_touch.c b/inc/lvgl/src/drivers/uefi/lv_uefi_indev_touch.c new file mode 100644 index 0000000..3ac227e --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_indev_touch.c @@ -0,0 +1,290 @@ +/** + * @file lv_uefi_indev_touch.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" +#include "../../stdlib/lv_mem.h" +#include "../../misc/lv_types.h" +#include "../../misc/lv_text_private.h" + +#if LV_USE_UEFI + +#include "lv_uefi_indev.h" +#include "lv_uefi_private.h" + +/********************* + * DEFINES + *********************/ + +#define ABSOLUTE_POINTER_INDEV_SIGNATURE 0x41505449 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_uefi_absolute_pointer_handle_context_t { + EFI_HANDLE handle; + EFI_ABSOLUTE_POINTER_PROTOCOL * interface; + lv_point_t range; /**< The touchscreen resolution*/ + lv_point_t factor_8; /**< The scaling factor between the touchscreen and the display resolution*/ +} lv_uefi_absolute_pointer_handle_context_t; + +typedef struct _lv_uefi_absolute_pointer_context_t { + uint32_t signature; /**< Has to be checked to avoid access to a different indev*/ + lv_point_t display_res; + lv_point_t position; + lv_ll_t handles; +} lv_uefi_absolute_pointer_context_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void _absolute_pointer_indev_event_cb(lv_event_t * e); +static void _absolute_pointer_read_cb(lv_indev_t * indev, lv_indev_data_t * data); +static void _absolute_pointer_handle_context_free(void * ptr); +static void _absolute_pointer_context_free(lv_uefi_absolute_pointer_context_t * indev_ctx); +static bool _absolute_pointer_interface_is_valid(const EFI_ABSOLUTE_POINTER_PROTOCOL * interface); +static void _absolute_pointer_read(lv_uefi_absolute_pointer_context_t * indev_ctx, + lv_uefi_absolute_pointer_handle_context_t * handle_ctx, bool * was_pressed); + +/********************** + * STATIC VARIABLES + **********************/ + +static EFI_GUID _uefi_guid_absolute_pointer = EFI_ABSOLUTE_POINTER_PROTOCOL_GUID; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * @brief Create a LVGL indev object. + * @param display_res The resolution of the display in pixels, needed to scale the input. + * @return The created LVGL indev object. +*/ +lv_indev_t * lv_uefi_absolute_pointer_indev_create(lv_point_t * display_res) +{ + lv_indev_t * indev = NULL; + lv_uefi_absolute_pointer_context_t * indev_ctx = NULL; + + indev_ctx = lv_calloc(1, sizeof(lv_uefi_absolute_pointer_context_t)); + LV_ASSERT_MALLOC(indev_ctx); + + indev_ctx->signature = ABSOLUTE_POINTER_INDEV_SIGNATURE; + + if(display_res != NULL) { + indev_ctx->display_res.x = display_res->x; + indev_ctx->display_res.y = display_res->y; + } + else { + indev_ctx->display_res.x = lv_display_get_horizontal_resolution(lv_display_get_default()); + indev_ctx->display_res.y = lv_display_get_vertical_resolution(lv_display_get_default()); + } + + lv_ll_init(&indev_ctx->handles, sizeof(lv_uefi_absolute_pointer_handle_context_t)); + + indev = lv_indev_create(); + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_user_data(indev, indev_ctx); + lv_indev_add_event_cb(indev, _absolute_pointer_indev_event_cb, LV_EVENT_DELETE, indev); + lv_indev_set_read_cb(indev, _absolute_pointer_read_cb); + + return indev; +} + +/** + * @brief Add an EFI_ABSOLUTE_POINTER_PROTOCOL interface to the indev. + * @param indev Indev that was created with lv_uefi_absolute_pointer_indev_create. + * @param handle The handle on which an instance of the EFI_ABSOLUTE_POINTER_PROTOCOL protocol is installed. + * @return True if the interface was added. +*/ +bool lv_uefi_absolute_pointer_indev_add_handle(lv_indev_t * indev, EFI_HANDLE handle) +{ + EFI_ABSOLUTE_POINTER_PROTOCOL * interface = NULL; + lv_uefi_absolute_pointer_handle_context_t * handle_ctx = NULL; + + lv_uefi_absolute_pointer_context_t * indev_ctx = (lv_uefi_absolute_pointer_context_t *)lv_indev_get_user_data(indev); + LV_ASSERT_NULL(indev_ctx); + + if(indev_ctx->signature != ABSOLUTE_POINTER_INDEV_SIGNATURE) return false; + + interface = (EFI_ABSOLUTE_POINTER_PROTOCOL *)lv_uefi_protocol_open(handle, &_uefi_guid_absolute_pointer); + if(!_absolute_pointer_interface_is_valid(interface)) { + lv_uefi_protocol_close(handle, &_uefi_guid_absolute_pointer); + LV_LOG_WARN("[lv_uefi] The ABSOLUTE_POINTER interface is not valid."); + return false; + } + + handle_ctx = (lv_uefi_absolute_pointer_handle_context_t *) lv_ll_ins_head(&indev_ctx->handles); + LV_ASSERT_MALLOC(handle_ctx); + + handle_ctx->handle = handle; + handle_ctx->interface = interface; + handle_ctx->range.x = handle_ctx->interface->Mode->AbsoluteMaxX - + handle_ctx->interface->Mode->AbsoluteMinX; + handle_ctx->range.y = handle_ctx->interface->Mode->AbsoluteMaxY - + handle_ctx->interface->Mode->AbsoluteMinY; + + handle_ctx->factor_8.x = (indev_ctx->display_res.x << 8) / handle_ctx->range.x; + handle_ctx->factor_8.y = (indev_ctx->display_res.y << 8) / handle_ctx->range.y; + + return true; +} + +/** + * @brief Add all available EFI_ABSOLUTE_POINTER_PROTOCOL interfaces to the indev. + * @param indev Indev that was created with lv_uefi_absolute_pointer_indev_create. +*/ +void lv_uefi_absolute_pointer_indev_add_all(lv_indev_t * indev) +{ + EFI_STATUS status; + EFI_HANDLE * handles = NULL; + UINTN no_handles; + UINTN index; + + lv_uefi_absolute_pointer_context_t * indev_ctx = (lv_uefi_absolute_pointer_context_t *)lv_indev_get_user_data(indev); + LV_ASSERT_NULL(indev_ctx); + + if(indev_ctx->signature != ABSOLUTE_POINTER_INDEV_SIGNATURE) return; + + status = gLvEfiBS->LocateHandleBuffer(ByProtocol, &_uefi_guid_absolute_pointer, NULL, &no_handles, &handles); + if(status != EFI_SUCCESS) { + LV_LOG_ERROR("[lv_uefi] LocateHandleBuffer(ABSOLUTE_POINTER) failed with error code %llx.", status); + return; + } + + for(index = 0; index < no_handles; index++) { + lv_uefi_absolute_pointer_indev_add_handle(indev, handles[index]); + } + + if(handles != NULL) gLvEfiBS->FreePool(handles); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void _absolute_pointer_indev_event_cb(lv_event_t * e) +{ + lv_indev_t * indev; + lv_uefi_absolute_pointer_context_t * indev_ctx; + + if(lv_event_get_code(e) != LV_EVENT_DELETE) return; + + indev = (lv_indev_t *)lv_event_get_user_data(e); + if(indev == NULL) return; + + indev_ctx = (lv_uefi_absolute_pointer_context_t *)lv_indev_get_user_data(indev); + lv_indev_set_user_data(indev, NULL); + + if(indev_ctx != NULL) _absolute_pointer_context_free(indev_ctx); +} + +static void _absolute_pointer_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + void * node = NULL; + + lv_uefi_absolute_pointer_context_t * indev_ctx = (lv_uefi_absolute_pointer_context_t *)lv_indev_get_user_data(indev); + LV_ASSERT_NULL(indev_ctx); + + /* Read from all registered devices */ + for(node = lv_ll_get_head(&indev_ctx->handles); node != NULL; node = lv_ll_get_next(&indev_ctx->handles, node)) { + lv_uefi_absolute_pointer_handle_context_t * handle_ctx = (lv_uefi_absolute_pointer_handle_context_t *) node; + bool was_pressed = false; + + _absolute_pointer_read(indev_ctx, handle_ctx, &was_pressed); + + data->state |= was_pressed ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + } + + /* Sanitize the events position */ + if(indev_ctx->position.x < 0) { + indev_ctx->position.x = 0; + } + else if(indev_ctx->position.x > indev_ctx->display_res.x - 1) { + indev_ctx->position.x = indev_ctx->display_res.x - 1; + } + + if(indev_ctx->position.y < 0) { + indev_ctx->position.y = 0; + } + else if(indev_ctx->position.y > indev_ctx->display_res.y - 1) { + indev_ctx->position.y = indev_ctx->display_res.y - 1; + } + + data->point.x = indev_ctx->position.x; + data->point.y = indev_ctx->position.y; + + data->continue_reading = FALSE; +} + +static void _absolute_pointer_context_free(lv_uefi_absolute_pointer_context_t * indev_ctx) +{ + if(indev_ctx == NULL) return; + lv_ll_clear_custom(&indev_ctx->handles, _absolute_pointer_handle_context_free); + lv_free(indev_ctx); +} + +static bool _absolute_pointer_interface_is_valid(const EFI_ABSOLUTE_POINTER_PROTOCOL * interface) +{ + if(interface == NULL) return FALSE; + if(interface->Mode == NULL) return FALSE; + if(interface->Mode->AbsoluteMaxX <= interface->Mode->AbsoluteMinX) return FALSE; + if(interface->Mode->AbsoluteMaxY <= interface->Mode->AbsoluteMinY) return FALSE; + return TRUE; +} + +static void _absolute_pointer_handle_context_free(void * ptr) +{ + lv_uefi_absolute_pointer_handle_context_t * handle_ctx = (lv_uefi_absolute_pointer_handle_context_t *) ptr; + + if(handle_ctx == NULL) return; + if(handle_ctx->interface) lv_uefi_protocol_close(handle_ctx->handle, &_uefi_guid_absolute_pointer); + lv_free(handle_ctx); +} + +static void _absolute_pointer_read(lv_uefi_absolute_pointer_context_t * indev_ctx, + lv_uefi_absolute_pointer_handle_context_t * handle_ctx, bool * was_pressed) +{ + EFI_STATUS status; + EFI_ABSOLUTE_POINTER_STATE state; + lv_point_t pointer_pos; + + LV_ASSERT_NULL(indev_ctx); + LV_ASSERT_NULL(handle_ctx); + LV_ASSERT_NULL(was_pressed); + + status = handle_ctx->interface->GetState( + handle_ctx->interface, + &state); + if(status == EFI_NOT_READY) return; + if(status != EFI_SUCCESS) { + LV_LOG_ERROR("[lv_uefi] GetState failed."); + return; + } + + /* verify the state */ + if(state.CurrentX < handle_ctx->interface->Mode->AbsoluteMinX) return; + if(state.CurrentY < handle_ctx->interface->Mode->AbsoluteMinY) return; + + pointer_pos.x = state.CurrentX - handle_ctx->interface->Mode->AbsoluteMinX; + pointer_pos.y = state.CurrentY - handle_ctx->interface->Mode->AbsoluteMinY; + + indev_ctx->position.x = (pointer_pos.x * handle_ctx->factor_8.x) >> 8; + indev_ctx->position.y = (pointer_pos.y * handle_ctx->factor_8.y) >> 8; + + /* Set the state to pressed if one of the interfaces reports a press */ + *was_pressed = (state.ActiveButtons & EFI_ABSP_TouchActive) != 0; +} + +#endif diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_private.c b/inc/lvgl/src/drivers/uefi/lv_uefi_private.c new file mode 100644 index 0000000..efabc4e --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_private.c @@ -0,0 +1,225 @@ +/** + * @file lv_uefi_private.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" + +#if LV_USE_UEFI + +#include "lv_uefi_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ +EFI_HANDLE gLvEfiImageHandle = NULL; +EFI_SYSTEM_TABLE * gLvEfiST = NULL; +EFI_BOOT_SERVICES * gLvEfiBS = NULL; +EFI_RUNTIME_SERVICES * gLvEfiRT = NULL; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * @brief Test if a protocol is installed at a handle. + * @param handle The handle on which the protocol might be installed. + * @param protocol The guid of the protocol. + * @return TRUE if the protocol is installed, FALSE if not. +*/ +bool lv_uefi_protocol_test(EFI_HANDLE handle, EFI_GUID * protocol) +{ + EFI_STATUS status; + void * interface = NULL; + + if(handle == NULL) return false; + if(protocol == NULL) return false; + + status = gLvEfiBS->OpenProtocol( + handle, + protocol, + &interface, + gLvEfiImageHandle, + NULL, + EFI_OPEN_PROTOCOL_TEST_PROTOCOL); + if(status != EFI_SUCCESS && status != EFI_UNSUPPORTED) { + LV_LOG_WARN("couldn't test protocol"); + return FALSE; + } + else if(status == EFI_UNSUPPORTED) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief Open a protocol. + * @param handle The handle on which the protocol is installed. + * @param protocol The guid of the protocol. + * @return A pointer to the interface, NULL if the protocol couldn't be opened. +*/ +void * lv_uefi_protocol_open(EFI_HANDLE handle, EFI_GUID * protocol) +{ + EFI_STATUS status; + void * interface = NULL; + + if(handle == NULL) return NULL; + if(protocol == NULL) return NULL; + + status = gLvEfiBS->OpenProtocol( + handle, + protocol, + &interface, + gLvEfiImageHandle, + NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL); + if(status != EFI_SUCCESS) { + LV_LOG_ERROR("[lv_uefi] Couldn't open protocol %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X, error code: %llx.", + protocol->Data1, + protocol->Data2, + protocol->Data3, + protocol->Data4[0], + protocol->Data4[1], + protocol->Data4[2], + protocol->Data4[3], + protocol->Data4[4], + protocol->Data4[5], + protocol->Data4[6], + protocol->Data4[7], + status); + interface = NULL; + } + + return interface; +} + +/** + * @brief Close a protocol. + * @param handle The handle on which the protocol is installed. + * @param protocol The guid of the protocol. +*/ +void lv_uefi_protocol_close(EFI_HANDLE handle, EFI_GUID * protocol) +{ + EFI_STATUS status; + + if(handle == NULL) return; + if(protocol == NULL) return; + + status = gLvEfiBS->CloseProtocol( + handle, + protocol, + gLvEfiImageHandle, + NULL); + if(status != EFI_SUCCESS) { + LV_LOG_WARN("[lv_uefi] Couldn't close protocol %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X, error code: %llx.", + protocol->Data1, + protocol->Data2, + protocol->Data3, + protocol->Data4[0], + protocol->Data4[1], + protocol->Data4[2], + protocol->Data4[3], + protocol->Data4[4], + protocol->Data4[5], + protocol->Data4[6], + protocol->Data4[7], + status); + } +} + +/** + * @brief Convert an UCS-2 string to an ASCII string. + * The string must contain only characters >= 0x20 and <= 0X7E. + * @param ucs2 The UCS-2 string. + * @param ascii The buffer to store the ASCII string. + * @param ascii_len The size of the buffer in ASCII characters. + * @return The number of characters written to the buffer or 0 if + * there was an error. +*/ +size_t lv_uefi_ucs2_to_ascii(const CHAR16 * ucs2, char * ascii, size_t ascii_len) +{ + size_t invalid_character_count; + size_t string_index; + + if(ucs2 == NULL || ascii == NULL || ascii_len == 0) { + return 0; + } + + invalid_character_count = 0; + + for(string_index = 0; ucs2[string_index] != 0x0000 && string_index < ascii_len - 1; string_index++) { + if(ucs2[string_index] < 0x20 || ucs2[string_index] > 0x7E) { + invalid_character_count++; + } + ascii[string_index] = (char) ucs2[string_index]; + } + + /* terminate the string even if there was an error */ + ascii[string_index] = 0x00; + + return invalid_character_count == 0 ? string_index : 0; +} + +/** + * @brief Convert an ASCII string to an UCS-2 string. + * The string must contain only characters >= 0x20 and <= 0X7E. + * @param ascii The ASCII string. + * @param ucs2 The buffer to store the UCS-2 string. + * @param ucs2_len The size of the buffer in UCS-2 characters. + * @return The number of bytes written to the buffer or 0 if + * there was an error. +*/ +size_t lv_uefi_ascii_to_ucs2(const char * ascii, CHAR16 * ucs2, size_t ucs2_len) +{ + size_t invalid_character_count; + size_t string_index; + + if(ascii == NULL || ucs2 == NULL || ucs2_len == 0) { + return 0; + } + + invalid_character_count = 0; + + for(string_index = 0; ascii[string_index] != 0x0000 && string_index < ucs2_len - 1; string_index++) { + if(ascii[string_index] < 0x20 || ascii[string_index] > 0x7E) { + invalid_character_count++; + } + ucs2[string_index] = (CHAR16) ascii[string_index]; + } + + /* terminate the string even if there was an error */ + ucs2[string_index] = 0x0000; + + return invalid_character_count == 0 ? string_index : 0; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_private.h b/inc/lvgl/src/drivers/uefi/lv_uefi_private.h new file mode 100644 index 0000000..7f917ce --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_private.h @@ -0,0 +1,107 @@ +/** + * @file lv_uefi_private.h + * + */ + +#ifndef __LV_UEFI_PRIVATE_H__ +#define __LV_UEFI_PRIVATE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" + +#if LV_USE_UEFI + +#include "lv_uefi.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Internal cache for the image handle (source: application entry point) + */ +extern EFI_HANDLE gLvEfiImageHandle; +/** + * Internal cache for the system table (source: application entry point) + */ +extern EFI_SYSTEM_TABLE * gLvEfiST; +/** + * Internal cache for the boot services table (source: gLvEfiST) + */ +extern EFI_BOOT_SERVICES * gLvEfiBS; +/** + * Internal cache for the boot runtime service table (source: gLvEfiST) + */ +extern EFI_RUNTIME_SERVICES * gLvEfiRT; + +/** + * @brief Test if a protocol is installed at a handle. + * @param handle The handle on which the protocol might be installed. + * @param protocol The guid of the protocol. + * @return TRUE if the protocol is installed, FALSE if not. +*/ +bool lv_uefi_protocol_test(EFI_HANDLE handle, EFI_GUID * protocol); + +/** + * @brief Open a protocol. + * @param handle The handle on which the protocol is installed. + * @param protocol The guid of the protocol. + * @return A pointer to the interface, NULL if the protocol couldn't be opened. +*/ +void * lv_uefi_protocol_open(EFI_HANDLE handle, EFI_GUID * protocol); + +/** + * @brief Close a protocol. + * @param handle The handle on which the protocol is installed. + * @param protocol The guid of the protocol. +*/ +void lv_uefi_protocol_close(EFI_HANDLE handle, EFI_GUID * protocol); + +/** + * @brief Convert an UCS-2 string to an ASCII string. + * The string must contain only characters >= 0x20 and <= 0X7E. + * @param ucs2 The UCS-2 string. + * @param ascii The buffer to store the ASCII string. + * @param ascii_len The size of the buffer in ASCII characters. + * @return The number of characters written to the buffer or 0 if + * there was an error. +*/ +size_t lv_uefi_ucs2_to_ascii(const CHAR16 * ucs2, char * ascii, size_t ascii_len); + +/** + * @brief Convert an ASCII string to an UCS-2 string. + * The string must contain only characters >= 0x20 and <= 0X7E. + * @param ascii The ASCII string. + * @param ucs2 The buffer to store the UCS-2 string. + * @param ucs2_len The size of the buffer in UCS-2 characters. + * @return The number of bytes written to the buffer or 0 if + * there was an error. +*/ +size_t lv_uefi_ascii_to_ucs2(const char * ascii, CHAR16 * ucs2, size_t ucs2_len); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif //__LV_UEFI_PRIVATE_H__ \ No newline at end of file diff --git a/inc/lvgl/src/drivers/uefi/lv_uefi_std_wrapper.h b/inc/lvgl/src/drivers/uefi/lv_uefi_std_wrapper.h new file mode 100644 index 0000000..c5fb5cc --- /dev/null +++ b/inc/lvgl/src/drivers/uefi/lv_uefi_std_wrapper.h @@ -0,0 +1,155 @@ +/** + * @file lv_uefi_std_wrapper.h + * + */ + +#ifndef LV_UEFI_STD_WRAPPER_H +#define LV_UEFI_STD_WRAPPER_H + +#if LV_USE_UEFI + + #include LV_USE_UEFI_INCLUDE + + /************************************* + * TYPES + *************************************/ + typedef UINT8 uint8_t; + typedef UINT16 uint16_t; + typedef UINT32 uint32_t; + typedef UINT64 uint64_t; + typedef INT8 int8_t; + typedef INT16 int16_t; + typedef INT32 int32_t; + typedef INT64 int64_t; + + typedef uint32_t uint_fast32_t; + typedef UINTN uintptr_t; + typedef UINTN size_t; + typedef INTN intptr_t; + typedef INTN intmax_t; + typedef INTN ptrdiff_t; + + typedef UINT8 bool; + + /************************************* + * DEFINES + *************************************/ + #define false 0 + #define true 1 + + #define PRId8 "d" + #define PRId16 "d" + #define PRId32 "d" + #define PRId64 "d" + + #define PRIu8 "u" + #define PRIu16 "u" + #define PRIu32 "u" + #define PRIu64 "u" + + #define PRIx8 "x" + #define PRIx16 "x" + #define PRIx32 "x" + #define PRIx64 "x" + + #define PRIX8 "X" + #define PRIX16 "X" + #define PRIX32 "X" + #define PRIX64 "X" + + /************************************* + * LIMITS + *************************************/ + #ifndef INT8_MAX + #define INT8_MAX (0x7F) + #endif + + #ifndef UINT8_MAX + #define UINT8_MAX (0xFF) + #endif + + #ifndef INT16_MAX + #define INT16_MAX (0x7FFF) + #endif + + #ifndef UINT16_MAX + #define UINT16_MAX (0xFFFF) + #endif + + #ifndef INT32_MAX + #define INT32_MAX (0x7FFFFFFF) + #endif + + #ifndef UINT32_MAX + #define UINT32_MAX (0xFFFFFFFF) + #endif + + #ifndef INT64_MAX + #define INT64_MAX (0x7FFFFFFFFFFFFFFFULL) + #endif + + #ifndef UINT64_MAX + #define UINT64_MAX (0xFFFFFFFFFFFFFFFFULL) + #endif + + #ifndef INT_MAX + #define INT_MAX (0x7FFFFFFFFFFFFFFFULL) + #endif + + #ifndef UINT_MAX + #define UINT_MAX (0xFFFFFFFFFFFFFFFFULL) + #endif + + /// + /// Minimum values for the signed UEFI Data Types + /// + #ifndef INT8_MIN + #define INT8_MIN (( -127) - 1) + #endif + + #ifndef INT16_MIN + #define INT16_MIN (( -32767) - 1) + #endif + + #ifndef INT32_MIN + #define INT32_MIN (( -2147483647) - 1) + #endif + + #ifndef INT64_MIN + #define INT64_MIN (( -9223372036854775807LL) - 1) + #endif + + #ifndef SIZE_MAX + #define SIZE_MAX (0xFFFFFFFF) + #endif + + #ifndef LONG_MAX + #define LONG_MAX (0x7FFFFFFF) + #endif + + #ifndef ULONG_MAX + #define ULONG_MAX (0xFFFFFFFF) + #endif + + #ifndef USHRT_MAX + #define USHRT_MAX (0xFFFF) + #endif + + #ifndef CHAR_BIT + #define CHAR_BIT 8 + #endif + + /************************************* + * VA_ARG + *************************************/ + #if LV_UEFI_EDK2_HEADERS + #define va_list VA_LIST + #define va_start(Marker, Parameter) VA_START(Marker, Parameter) + #define va_arg(Marker, TYPE) VA_ARG(Marker, TYPE) + #define va_end(Marker) VA_END(Marker) + #define va_copy(Dest, Start) VA_COPY(Dest, Start) + #endif + +#endif + +#endif \ No newline at end of file diff --git a/inc/lvgl/src/drivers/wayland/lv_wayland.c b/inc/lvgl/src/drivers/wayland/lv_wayland.c new file mode 100644 index 0000000..338233b --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wayland.c @@ -0,0 +1,338 @@ +/** + * @file lv_wayland.c + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_wayland_private.h" + +#if LV_USE_WAYLAND + +#if (LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1) + #error[wayland] Unsupported LV_COLOR_DEPTH +#endif + +#ifdef LV_WAYLAND_WINDOW_DECORATIONS + #if LV_WAYLAND_WINDOW_DECORATIONS == 1 + #warning LV_WAYLAND_WINDOW_DECORATIONS has been removed for v9.5. \ + It's now the user's responsibility to generate their own window decorations. See `lv_win` + #endif +#endif + +#include "lv_wayland_private.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + + +/********************** + * TYPEDEFS + **********************/ + + +/********************** + * STATIC PROTOTYPES + **********************/ + +/* Timer callback to process Wayland compositor events without blocking the UI. + * We use an independent timer so that we always read and flush compositor events even if LVGL + * doesn't need to redraw anything. + */ +static void read_compositor_events_timer_cb(lv_timer_t * timer); + +static void handle_global(void * data, struct wl_registry * registry, uint32_t name, const char * interface, + uint32_t version); +static void handle_global_remove(void * data, struct wl_registry * registry, uint32_t name); + +static uint32_t tick_get_cb(void); + +static void output_scale(void * data, struct wl_output * output, int32_t factor); +static void output_mode(void * data, struct wl_output * output, uint32_t flags, int32_t width, int32_t height, + int32_t refresh); +static void output_done(void * data, struct wl_output * output); +static void output_geometry(void * data, struct wl_output * output, int32_t x, int32_t y, int32_t physical_width, + int32_t physical_height, int32_t subpixel, const char * make, const char * model, int32_t transform); + +/********************** + * STATIC VARIABLES + **********************/ + +static bool is_wayland_initialized = false; +lv_wl_ctx_t lv_wl_ctx; + +static const struct wl_registry_listener registry_listener = { + .global = handle_global, + .global_remove = handle_global_remove +}; + +static const struct wl_output_listener output_listener = { + .geometry = output_geometry, + .mode = output_mode, + .done = output_done, + .scale = output_scale +}; + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Get Wayland display file descriptor + * @return Wayland display file descriptor + */ +int lv_wayland_get_fd(void) +{ + if(!is_wayland_initialized) { + LV_LOG_ERROR("Wayland is not initialized"); + return -1; + } + return wl_display_get_fd(lv_wl_ctx.wl_display); +} + +/********************** + * PRIVATE FUNCTIONS + **********************/ + +lv_result_t lv_wayland_init(void) +{ + + if(is_wayland_initialized) { + return LV_RESULT_OK; + } + lv_memset(&lv_wl_ctx, 0, sizeof(lv_wl_ctx)); + + /* Connect to Wayland display */ + lv_wl_ctx.wl_display = wl_display_connect(NULL); + if(!lv_wl_ctx.wl_display) { + LV_LOG_ERROR("failed to connect to Wayland server"); + return LV_RESULT_INVALID; + } + + lv_wl_ctx.backend_data = wl_backend_ops.init(); + + /* Add registry listener and wait for registry reception */ + lv_wl_ctx.wl_registry = wl_display_get_registry(lv_wl_ctx.wl_display); + wl_registry_add_listener(lv_wl_ctx.wl_registry, ®istry_listener, &lv_wl_ctx); + wl_display_dispatch(lv_wl_ctx.wl_display); + wl_display_roundtrip(lv_wl_ctx.wl_display); + + LV_ASSERT_MSG(lv_wl_ctx.wl_compositor, "Wayland compositor not available"); + if(!lv_wl_ctx.wl_compositor) { + LV_LOG_ERROR("Wayland compositor is not available"); + wl_display_disconnect(lv_wl_ctx.wl_display); + lv_wl_ctx.wl_display = NULL; + return LV_RESULT_INVALID; + + } + + lv_ll_init(&lv_wl_ctx.window_ll, sizeof(lv_wl_window_t)); + + lv_tick_set_cb(tick_get_cb); + lv_wl_ctx.read_compositor_events_timer = lv_timer_create(read_compositor_events_timer_cb, LV_DEF_REFR_PERIOD, NULL); + + is_wayland_initialized = true; + return LV_RESULT_OK; +} + +void lv_wayland_deinit(void) +{ + if(!is_wayland_initialized) { + return; + } + + lv_wl_window_t * window = NULL; + + LV_LL_READ(&lv_wl_ctx.window_ll, window) { + lv_wayland_window_delete(window); + } + + lv_wayland_xdg_deinit(); + + if(is_wayland_initialized) { + wl_backend_ops.deinit(lv_wl_ctx.backend_data); + } + + if(lv_wl_ctx.seat.wl_seat) { + lv_wayland_seat_deinit(&lv_wl_ctx.seat); + lv_wl_ctx.seat.wl_seat = NULL; + } + + if(lv_wl_ctx.wl_registry) { + wl_registry_destroy(lv_wl_ctx.wl_registry); + lv_wl_ctx.wl_registry = NULL; + } + + if(lv_wl_ctx.wl_compositor) { + wl_compositor_destroy(lv_wl_ctx.wl_compositor); + lv_wl_ctx.wl_compositor = NULL; + } + if(lv_wl_ctx.wl_display) { + wl_display_disconnect(lv_wl_ctx.wl_display); + lv_wl_ctx.wl_display = NULL; + } + + if(lv_wl_ctx.read_compositor_events_timer) { + lv_timer_delete(lv_wl_ctx.read_compositor_events_timer); + lv_wl_ctx.read_compositor_events_timer = NULL; + } + + lv_ll_clear(&lv_wl_ctx.window_ll); + is_wayland_initialized = false; +} + +void lv_wayland_flush(void) +{ + int ret; + while((ret = wl_display_flush(lv_wl_ctx.wl_display)) == -1 && errno == EAGAIN) { + struct pollfd pfd = { + .fd = wl_display_get_fd(lv_wl_ctx.wl_display), + .events = POLLOUT, + }; + + if(poll(&pfd, 1, -1) == -1) { + LV_LOG_ERROR("poll failed: %s", strerror(errno)); + break; + } + /* Socket is writable now, loop back and try flush again */ + } +} +/********************** + * STATIC FUNCTIONS + **********************/ + +static void read_compositor_events_timer_cb(lv_timer_t * timer) +{ + LV_UNUSED(timer); + + lv_wayland_flush(); + + while(wl_display_prepare_read(lv_wl_ctx.wl_display) != 0) { + wl_display_dispatch_pending(lv_wl_ctx.wl_display); + } + + struct pollfd fds = { + .fd = wl_display_get_fd(lv_wl_ctx.wl_display), + .events = POLLIN, + }; + const bool is_event_ready = poll(&fds, 1, 0) > 0; + if(!is_event_ready) { + wl_display_cancel_read(lv_wl_ctx.wl_display); + return; + } + wl_display_read_events(lv_wl_ctx.wl_display); + wl_display_dispatch_pending(lv_wl_ctx.wl_display); +} + +static void output_geometry(void * data, struct wl_output * output, int32_t x, int32_t y, int32_t physical_width, + int32_t physical_height, + int32_t subpixel, const char * make, const char * model, int32_t transform) +{ + LV_UNUSED(output); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(physical_width); + LV_UNUSED(physical_height); + LV_UNUSED(subpixel); + LV_UNUSED(make); + LV_UNUSED(transform); + + lv_wl_output_info_t * info = data; + snprintf(info->name, sizeof(info->name), "%s", model); +} + +static void output_mode(void * data, struct wl_output * wl_output, uint32_t flags, int32_t width, int32_t height, + int32_t refresh) +{ + LV_UNUSED(wl_output); + + lv_wl_output_info_t * info = data; + + if(flags & WL_OUTPUT_MODE_CURRENT) { + info->height = height; + info->width = width; + info->refresh = refresh; + info->flags = flags; + } +} + +static void output_done(void * data, struct wl_output * output) +{ + /* Called when all geometry/mode info for this output has been sent */ + LV_UNUSED(data); + LV_UNUSED(output); +} + +static void output_scale(void * data, struct wl_output * output, int32_t factor) +{ + LV_UNUSED(output); + lv_wl_output_info_t * info = data; + info->scale = factor; +} + +static uint32_t tick_get_cb(void) +{ + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + uint64_t time_ms = t.tv_sec * 1000 + (t.tv_nsec / 1000000); + return time_ms; +} +static void handle_global(void * data, struct wl_registry * registry, uint32_t name, const char * interface, + uint32_t version) +{ + lv_wl_ctx_t * ctx = data; + + LV_UNUSED(data); + + if(strcmp(interface, wl_compositor_interface.name) == 0) { + ctx->wl_compositor = wl_registry_bind(registry, name, &wl_compositor_interface, 1); + } + else if(strcmp(interface, wl_shm_interface.name) == 0) { + /* Regardless of the backend, we always need SHM for the pointer cursor*/ + ctx->wl_shm = wl_registry_bind(registry, name, &wl_shm_interface, 1); + } + else if(strcmp(interface, wl_seat_interface.name) == 0) { + lv_wayland_seat_init(&ctx->seat, registry, name, version); + } + else if(strcmp(interface, xdg_wm_base_interface.name) == 0) { + ctx->xdg_wm = wl_registry_bind(ctx->wl_registry, name, &xdg_wm_base_interface, LV_MIN(version, 2)); + xdg_wm_base_add_listener(ctx->xdg_wm, lv_wayland_xdg_get_wm_base_listener(), ctx); + } + else if(strcmp(interface, wl_output_interface.name) == 0) { + if(ctx->wl_output_count < LV_WAYLAND_MAX_OUTPUTS) { + memset(&ctx->physical_outputs[ctx->wl_output_count], 0, sizeof(lv_wl_output_info_t)); + struct wl_output * out = wl_registry_bind(registry, name, &wl_output_interface, 1); + ctx->physical_outputs[ctx->wl_output_count].wl_output = out; + wl_output_add_listener(out, &output_listener, &ctx->physical_outputs[ctx->wl_output_count].wl_output); + ctx->wl_output_count++; + } + } + + wl_backend_ops.global_handler(lv_wl_ctx.backend_data, registry, name, interface, version); +} + +static void handle_global_remove(void * data, struct wl_registry * registry, uint32_t name) +{ + LV_UNUSED(data); + LV_UNUSED(registry); + LV_UNUSED(name); +} + +#endif /* LV_USE_WAYLAND */ diff --git a/inc/lvgl/src/drivers/wayland/lv_wayland.h b/inc/lvgl/src/drivers/wayland/lv_wayland.h new file mode 100644 index 0000000..178e0ab --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wayland.h @@ -0,0 +1,61 @@ +/** + * @file lv_wayland.h + */ + +#ifndef LV_WAYLAND_H +#define LV_WAYLAND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_WAYLAND + +#include "lv_wl_keyboard.h" +#include "lv_wl_pointer.h" +#include "lv_wl_touch.h" +#include "lv_wl_window.h" +#include "lv_wl_pointer_axis.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Wrapper around lv_timer_handler + * @note Must be called in the application run loop instead of the + * regular lv_timer_handler provided by LVGL + * @return time till it needs to be run next (in ms) + */ +uint32_t lv_wayland_timer_handler(void); + +/** + * Retrieves the file descriptor of the wayland socket + */ +int lv_wayland_get_fd(void); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_WAYLAND */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_WAYLAND_H */ diff --git a/inc/lvgl/src/drivers/wayland/lv_wayland_private.h b/inc/lvgl/src/drivers/wayland/lv_wayland_private.h new file mode 100644 index 0000000..a84950c --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wayland_private.h @@ -0,0 +1,219 @@ +/** + * @file lv_wayland_private.h + * + */ + +#ifndef LV_WAYLAND_PRIVATE_H +#define LV_WAYLAND_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_WAYLAND + + +#include +#include +#include +#include "../../misc/lv_types.h" +#include "lv_wl_backend_private.h" + +/********************* + * DEFINES + *********************/ + +#define LV_WAYLAND_DEFAULT_CURSOR_NAME "left_ptr" +#define LV_WAYLAND_MAX_OUTPUTS 8 + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_wl_window_t; + +typedef struct { + struct wl_pointer * wl_pointer; + struct wl_surface * cursor_surface; + lv_point_t point; + lv_indev_state_t left_btn_state; + lv_indev_state_t right_btn_state; + lv_indev_state_t wheel_btn_state; + int16_t wheel_diff; +} lv_wl_seat_pointer_t; + +typedef struct { + struct wl_touch * wl_touch; + +#if LV_USE_GESTURE_RECOGNITION + lv_indev_touch_data_t touches[10]; + uint8_t event_cnt; + uint8_t primary_id; +#else + lv_point_t point; + lv_indev_state_t state; +#endif /*LV_USE_GESTURE_RECOGNITION*/ +} lv_wl_seat_touch_t; + +typedef struct { + struct wl_keyboard * wl_keyboard; + struct xkb_keymap * xkb_keymap; + struct xkb_state * xkb_state; + + lv_key_t key; + lv_indev_state_t state; + bool is_pressed; +} lv_wl_seat_keyboard_t; + + +typedef struct { + struct wl_seat * wl_seat; + + lv_wl_seat_pointer_t * pointer; + lv_wl_seat_touch_t * touch; + lv_wl_seat_keyboard_t * keyboard; +} lv_wl_seat_t; + + + +typedef struct { + struct wl_output * wl_output; + char name[64]; + int width; + int height; + int refresh; + int scale; + int flags; +} lv_wl_output_info_t; + +typedef struct { + struct wl_display * wl_display; + struct wl_registry * wl_registry; + struct wl_compositor * wl_compositor; + struct wl_shm * wl_shm; + lv_wl_seat_t seat; + + void * backend_data; + lv_wl_output_info_t physical_outputs[LV_WAYLAND_MAX_OUTPUTS]; + uint8_t wl_output_count; + + struct xdg_wm_base * xdg_wm; + + lv_ll_t window_ll; + lv_timer_t * read_compositor_events_timer; +} lv_wl_ctx_t; + +typedef struct { + struct xdg_surface * xdg_surface; + uint32_t serial; + int32_t width; + int32_t height; + bool requested; + bool pending; +} lv_wl_resize_event_t; + +typedef struct { + struct xdg_surface * xdg_surface; + struct xdg_toplevel * xdg_toplevel; + bool configured; +} lv_wl_window_xdg_t; + + +typedef struct _lv_wl_window_t { + void * backend_display_data; + lv_display_t * lv_disp; + lv_indev_t * lv_indev_pointer; + lv_indev_t * lv_indev_pointeraxis; + lv_indev_t * lv_indev_touch; + lv_indev_t * lv_indev_keyboard; + lv_wayland_display_close_cb_t close_cb; + lv_wl_window_xdg_t xdg; + + /* The current physical assigned output */ + struct wl_output * physical_output; + + /* The current body surface */ + struct wl_surface * body; + + lv_wl_resize_event_t resize_event; + + bool maximized; + bool fullscreen; + +} lv_wl_window_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +extern lv_wl_ctx_t lv_wl_ctx; + +/********************** + * Driver + **********************/ + +lv_result_t lv_wayland_init(void); +void lv_wayland_deinit(void); + +void lv_wayland_flush(void); + +/********************** + * Window + **********************/ + +int32_t lv_wayland_window_get_width(lv_wl_window_t * window); +int32_t lv_wayland_window_get_height(lv_wl_window_t * window); + +void lv_wayland_window_delete(lv_wl_window_t * window); + +const struct xdg_wm_base_listener * lv_wayland_xdg_get_wm_base_listener(void); + +void lv_wayland_xdg_set_maximized(lv_wl_window_xdg_t * xdg, bool maximized); +void lv_wayland_xdg_set_minimized(lv_wl_window_xdg_t * xdg); +void lv_wayland_xdg_set_fullscreen(lv_wl_window_xdg_t * xdg, bool fullscreen, + struct wl_output * output); +lv_result_t lv_wl_xdg_create_window(struct xdg_wm_base * xdg_wm, lv_wl_window_t * window, + const char * title); +bool lv_wayland_xdg_is_resize_pending(lv_wl_window_t * window); +void lv_wayland_xdg_configure_surface(lv_wl_window_t * window); +void lv_wayland_xdg_resize(lv_wl_window_t * window); +void lv_wayland_xdg_delete_window(lv_wl_window_xdg_t * xdg); +void lv_wayland_xdg_deinit(void); + +/********************** + * Input + **********************/ + +void lv_wayland_seat_init(lv_wl_seat_t * seat, struct wl_registry * registry, uint32_t name, uint32_t version); +void lv_wayland_seat_deinit(lv_wl_seat_t * seat); + +lv_wl_seat_pointer_t * lv_wayland_seat_pointer_create(struct wl_seat * seat, struct wl_surface * surface); +void lv_wayland_seat_pointer_delete(lv_wl_seat_pointer_t * seat_pointer); + +lv_wl_seat_touch_t * lv_wayland_seat_touch_create(struct wl_seat * seat); +void lv_wayland_seat_touch_delete(lv_wl_seat_touch_t * seat_touch); + +lv_wl_seat_keyboard_t * lv_wayland_seat_keyboard_create(struct wl_seat * seat); +void lv_wayland_seat_keyboard_delete(lv_wl_seat_keyboard_t * seat_keyboard); + +/* Updates indev's driver data with the given 'read_cb' to 'new_driver_data' */ +void lv_wayland_update_indevs(lv_indev_read_cb_t read_cb, void * new_driver_data); + +#endif /* LV_USE_WAYLAND */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WAYLAND_PRIVATE_H*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_backend_private.h b/inc/lvgl/src/drivers/wayland/lv_wl_backend_private.h new file mode 100644 index 0000000..f64ccdc --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_backend_private.h @@ -0,0 +1,217 @@ +/** + * @file lv_wl_backend_private.h + * + */ + +#ifndef LV_WL_BACKEND_PRIVATE_H +#define LV_WL_BACKEND_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_wayland.h" + +#if LV_USE_WAYLAND + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * @typedef lv_wayland_backend_init_t + * @brief Initialize the backend context + * + * This function is called once when the Wayland driver is initialized to create + * the global backend context. The returned pointer will be passed as backend_ctx + * to all other backend operations. + * + * @return Pointer to backend-specific context data, or NULL on failure + * + * @note This is called before any displays are created + * @see lv_wayland_backend_deinit_t + */ +typedef void * (*lv_wayland_backend_init_t)(void); + +/** + * @typedef lv_wayland_backend_deinit_t + * @brief Deinitialize the backend context + * + * This function is called when the Wayland driver is deinitialized. It must + * clean up all resources allocated in the init function and free the backend + * context. + * + * @param[in] backend_ctx Pointer to the backend context returned by init + * + * @note This is called after all displays have been destroyed + * @see lv_wayland_backend_init_t + */ +typedef void (*lv_wayland_backend_deinit_t)(void * backend_ctx); + +/** + * @typedef lv_wayland_backend_init_display_t + * @brief Initialize a new display + * + * This function is called when creating a new LVGL display on Wayland. It should + * allocate and initialize per-display resources needed for rendering. + * + * @param[in] backend_ctx Pointer to the backend context + * @param[in] display Pointer to the LVGL display object + * @param[in] width Initial width of the display in pixels + * @param[in] height Initial height of the display in pixels + * @return Pointer to display-specific data, or NULL on failure + * + * @note The returned pointer can be retrieved later using + * lv_wayland_get_backend_display_data() + * @note It is expected that each display gets its own data structure in order for a backend + * to support multiple displays + */ +typedef void * (*lv_wayland_backend_init_display_t)(void * backend_ctx, lv_display_t * display, int32_t width, + int32_t height); + +/** + * @typedef lv_wayland_backend_resize_display_t + * @brief Resize or reconfigure a display + * + * This function is called when a display needs to be resized or when its rotation + * is modified. The backend should update its rendering resources accordingly. + * + * @param[in] backend_ctx Pointer to the backend context + * @param[in] display Pointer to the LVGL display object being resized + * @return Pointer to updated display-specific data, or NULL on failure + * + * @note This may be called multiple times during a display's lifetime + * @note The returned pointer will replace the previous display data. It can be + * retrieved using lv_wayland_get_backend_display_data() + * @warning The display data is overwritten with the return value of this function + */ +typedef void * (*lv_wayland_backend_resize_display_t)(void * backend_ctx, lv_display_t * display); + +/** + * @typedef lv_wayland_backend_destroy_display_t + * @brief Destroy a display + * + * This function is called when an LVGL display is being destroyed. It must clean up + * all per-display resources and free the display data that was allocated in + * init_display. + * + * @param[in] backend_ctx Pointer to the backend context + * @param[in] display Pointer to the LVGL display object being destroyed + * + * @note The display data associated with this display must be freed + */ +typedef void (*lv_wayland_backend_destroy_display_t)(void * backend_ctx, lv_display_t * display); + +/** + * @typedef lv_wayland_backend_global_handler_t + * @brief Handle Wayland global objects + * + * This function is called for every global object advertised by the Wayland + * compositor. The backend can use this to bind to Wayland protocols it requires + * (e.g., wl_shm, EGL extensions, DMA-BUF protocols, etc.). + * + * @param[in] backend_ctx Pointer to the backend context + * @param[in] registry Wayland registry object + * @param[in] name Numeric name of the global object + * @param[in] interface String name of the interface (e.g., "wl_shm") + * @param[in] version Version number of the interface + * + * @note This is called during Wayland connection setup + * @note The backend should use wl_registry_bind() to bind to needed protocols + */ +typedef void (*lv_wayland_backend_global_handler_t)(void * backend_ctx, struct wl_registry * registry, uint32_t name, + const char * interface, uint32_t version); + +/** + * @struct lv_wayland_backend_ops_t + * @brief Wayland backend operations structure + * + * This structure defines the complete set of operations that a Wayland backend + * must implement. All function pointers must be non-NULL. + * + * @par Lifecycle Order: + * 1. init() - Initialize backend context + * 2. global_handler() - Called for each Wayland global (may be called multiple times) + * 3. init_display() - Create display (may be called multiple times for multiple displays) + * 4. resize_display() - Resize display (called as needed) + * 5. deinit_display() - Destroy display (called once per display) + * 6. deinit() - Clean up backend context + */ +typedef struct { + lv_wayland_backend_init_t init; /**< Initialize backend context */ + lv_wayland_backend_global_handler_t global_handler; /**< Handle Wayland global objects */ + lv_wayland_backend_init_display_t init_display; /**< Initialize a new display */ + lv_wayland_backend_resize_display_t resize_display; /**< Resize or reconfigure display */ + lv_wayland_backend_destroy_display_t deinit_display; /**< Destroy a display */ + lv_wayland_backend_deinit_t deinit; /**< Deinitialize backend context */ +} lv_wayland_backend_ops_t; + +extern const lv_wayland_backend_ops_t wl_backend_ops; + +/** @brief Get the backend-specific display data + * + * Retrieves the per-display data pointer that was returned by the backend's + * init_display/resize_display functions. This allows the backend to access its own + * display-specific state and resources. + * + * @param[in] display Pointer to the LVGL display object + * @return Pointer to backend-specific display data + * + * @note This returns the value that was returned by lv_wayland_backend_init_display_t + * or lv_wayland_backend_resize_display_t + * @see lv_wayland_backend_init_display_t + */ +void * lv_wayland_get_backend_display_data(lv_display_t * display); + +/** @brief Set the backend-specific display data + * + * The backend display data is set automatically to the return type of the + * init_display/resize_display, this function should only be used in special + * cases where it needs to be overridden temporarily + * + * @param[in] display Pointer to the LVGL display object + * @param[in] data Pointer to backend-specific display data + */ +void lv_wayland_set_backend_display_data(lv_display_t * display, void * data); + +/** + * @brief Get the Wayland surface for rendering + * + * Retrieves the wl_surface object associated with the display window. This is the + * surface that the backend must use for all rendering operations (attaching buffers, + * committing frames, etc.). + * + * @param[in] display Pointer to the LVGL display object + * @return Pointer to the Wayland surface for rendering, or NULL if not available + * + * @note This surface is managed by the Wayland driver and must not be destroyed + * by the backend + * @note All rendering output should be attached to this surface + */ +struct wl_surface * lv_wayland_get_window_surface(lv_display_t * display); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_WAYLAND*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WL_BACKEND_PRIVATE_H*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_egl_backend.c b/inc/lvgl/src/drivers/wayland/lv_wl_egl_backend.c new file mode 100644 index 0000000..cabc84d --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_egl_backend.c @@ -0,0 +1,423 @@ +/** @file lv_wl_egl_backend.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_wayland_private.h" + +#if LV_WAYLAND_USE_EGL + +#include "../../display/lv_display_private.h" +#include "../opengles/lv_opengles_driver.h" +#include "../opengles/lv_opengles_texture_private.h" +#include "../opengles/lv_opengles_egl_private.h" +#include "../opengles/lv_opengles_debug.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + + +typedef struct { + lv_opengles_texture_t texture; + struct wl_egl_window * egl_window; + lv_opengles_egl_t * egl_ctx; +} lv_wl_egl_display_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * wl_egl_init(void); +static void wl_egl_deinit(void * backend_ctx); +static void * wl_egl_init_display(void * backend_ctx, lv_display_t * display, int32_t width, int32_t height); +static void * wl_egl_resize_display(void * backend_ctx, lv_display_t * display); +static void wl_egl_deinit_display(void * backend_ctx, lv_display_t * display); +static void wl_egl_global_handler(void * backend_ctx, struct wl_registry * registry, uint32_t name, + const char * interface, uint32_t version); + +static void egl_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); +static void flush_wait_cb(lv_display_t * disp); +static void frame_done(void * data, struct wl_callback * callback, uint32_t time); + +static lv_wl_egl_display_data_t * egl_create_display_data(lv_display_t * display, + int32_t width, int32_t height); +static void egl_destroy_display_data(lv_wl_egl_display_data_t * ddata); + +static lv_egl_interface_t wl_egl_get_interface(lv_display_t * display); +static void * wl_egl_create_window(void * driver_data, const lv_egl_native_window_properties_t * properties); +static void wl_egl_destroy_window(void * driver_data, void * native_window); +static size_t wl_egl_select_config_cb(void * driver_data, const lv_egl_config_t * configs, size_t config_count); +static void wl_egl_flip_cb(void * driver_data, bool vsync); + +/********************** + * STATIC VARIABLES + **********************/ + + +static const struct wl_callback_listener frame_listener = { + .done = frame_done, +}; + +const lv_wayland_backend_ops_t wl_backend_ops = { + .init = wl_egl_init, + .deinit = wl_egl_deinit, + .global_handler = wl_egl_global_handler, + .init_display = wl_egl_init_display, + .deinit_display = wl_egl_deinit_display, + .resize_display = wl_egl_resize_display, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void frame_done(void * data, struct wl_callback * callback, uint32_t time) +{ + LV_UNUSED(time); + lv_display_t * display = data; + wl_callback_destroy(callback); + lv_display_flush_ready(display); +} + +static void * wl_egl_init(void) +{ + return NULL; +} + +static void wl_egl_deinit(void * backend_ctx) +{ + LV_UNUSED(backend_ctx); +} + +static lv_wl_egl_display_data_t * egl_create_display_data(lv_display_t * display, + int32_t width, int32_t height) +{ + lv_wl_egl_display_data_t * ddata = lv_zalloc(sizeof(*ddata)); + if(!ddata) { + LV_LOG_ERROR("Failed to allocate data for display"); + return NULL; + } + + /* Set the backend display data immediately as we will need it + * in the EGL window creation callback */ + lv_wayland_set_backend_display_data(display, ddata); + + + /* Create EGL context */ + lv_egl_interface_t egl_interface = wl_egl_get_interface(display); + ddata->egl_ctx = lv_opengles_egl_context_create(&egl_interface); + if(!ddata->egl_ctx) { + LV_LOG_ERROR("Failed to create EGL context"); + goto egl_ctx_err; + } + + /* Let the opengles texture driver handle the texture lifetime */ + ddata->texture.is_texture_owner = true; + + /*Initialize the draw buffers and texture*/ + lv_result_t res = lv_opengles_texture_reshape(&ddata->texture, display, width, height); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to create draw buffers"); + goto texture_err; + } + return ddata; + +texture_err: + lv_opengles_egl_context_destroy(ddata->egl_ctx); +egl_ctx_err: + lv_wayland_set_backend_display_data(display, NULL); + lv_free(ddata); + return NULL; +} + +static void egl_destroy_display_data(lv_wl_egl_display_data_t * ddata) +{ + if(!ddata) { + return; + } + + lv_opengles_texture_deinit(&ddata->texture); + + if(ddata->egl_ctx) { + lv_opengles_egl_context_destroy(ddata->egl_ctx); + ddata->egl_ctx = NULL; + } + + LV_LOG_INFO("Deleted EGL display data"); + lv_free(ddata); +} + +static void flush_wait_cb(lv_display_t * disp) +{ + while(disp->flushing) { + wl_display_dispatch(lv_wl_ctx.wl_display); + } +} + +#if LV_USE_DRAW_OPENGLES || LV_USE_DRAW_NANOVG + +static void egl_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + LV_UNUSED(area); + LV_UNUSED(px_map); + + int32_t disp_width = lv_display_get_horizontal_resolution(disp); + int32_t disp_height = lv_display_get_vertical_resolution(disp); + if(!lv_display_flush_is_last(disp)) { + lv_display_flush_ready(disp); + return; + } + + lv_wl_egl_display_data_t * ddata = lv_wayland_get_backend_display_data(disp); + struct wl_surface * surface = lv_wayland_get_window_surface(disp); + + if(!surface) { + lv_display_flush_ready(disp); + return; + } + +#if LV_USE_DRAW_OPENGLES + lv_opengles_viewport(0, 0, lv_display_get_original_horizontal_resolution(disp), + lv_display_get_original_vertical_resolution(disp)); + lv_opengles_render_display_texture(disp, false, true); +#endif /*LV_USE_DRAW_OPENGLES*/ + + /* Swap buffers through EGL */ + lv_opengles_egl_update(ddata->egl_ctx); + + /* Request frame callback for vsync */ + struct wl_callback * callback = wl_surface_frame(surface); + wl_callback_add_listener(callback, &frame_listener, disp); + wl_surface_damage(surface, 0, 0, disp_width, disp_height); + wl_surface_commit(surface); +} + +#else + +static void egl_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + LV_UNUSED(px_map); + LV_UNUSED(area); + + if(!lv_display_flush_is_last(disp)) { + lv_display_flush_ready(disp); + return; + } + + lv_wl_egl_display_data_t * ddata = lv_wayland_get_backend_display_data(disp); + struct wl_surface * surface = lv_wayland_get_window_surface(disp); + + if(!surface) { + lv_display_flush_ready(disp); + return; + } + + int32_t disp_width = lv_display_get_horizontal_resolution(disp); + int32_t disp_height = lv_display_get_vertical_resolution(disp); + + lv_opengles_viewport(0, 0, lv_display_get_original_horizontal_resolution(disp), + lv_display_get_original_vertical_resolution(disp)); + + lv_color_format_t cf = lv_display_get_color_format(disp); + uint32_t stride = lv_draw_buf_width_to_stride(disp_width, cf); + + GL_CALL(glBindTexture(GL_TEXTURE_2D, ddata->texture.texture_id)); + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + GL_CALL(glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / lv_color_format_get_size(cf))); + +#if LV_COLOR_DEPTH == 16 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB565, disp_width, disp_height, 0, GL_RGB, + GL_UNSIGNED_SHORT_5_6_5, ddata->texture.fb1)); +#elif LV_COLOR_DEPTH == 32 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, disp_width, disp_height, 0, GL_RGBA, + GL_UNSIGNED_BYTE, ddata->texture.fb1)); +#else +#error("Unsupported color format") +#endif + lv_opengles_render_params_t params = { + .h_flip = false, + .v_flip = false, + .rb_swap = LV_COLOR_DEPTH == 32, + }; + lv_opengles_render_display(disp, ¶ms); + lv_opengles_egl_update(ddata->egl_ctx); + + struct wl_callback * callback = wl_surface_frame(surface); + wl_callback_add_listener(callback, &frame_listener, disp); + + wl_surface_damage(surface, 0, 0, disp_width, disp_height); + wl_surface_commit(surface); +} + +#endif + +static void * wl_egl_init_display(void * backend_ctx, lv_display_t * display, int32_t width, int32_t height) +{ + LV_UNUSED(backend_ctx); + lv_wl_egl_display_data_t * ddata = egl_create_display_data(display, width, height); + if(!ddata) { + LV_LOG_ERROR("Failed to create display data"); + return NULL; + } + + lv_display_set_flush_cb(display, egl_flush_cb); + lv_display_set_flush_wait_cb(display, flush_wait_cb); + lv_display_set_render_mode(display, LV_USE_DRAW_NANOVG ? LV_DISPLAY_RENDER_MODE_FULL : LV_DISPLAY_RENDER_MODE_DIRECT); + + return ddata; +} + +static void * wl_egl_resize_display(void * backend_ctx, lv_display_t * display) +{ + LV_UNUSED(backend_ctx); + lv_wl_egl_display_data_t * ddata = lv_wayland_get_backend_display_data(display); + + int32_t width = lv_display_get_horizontal_resolution(display); + int32_t height = lv_display_get_vertical_resolution(display); + lv_result_t res = lv_opengles_texture_reshape(&ddata->texture, display, width, height); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to resize display"); + return ddata; + } + + wl_egl_window_resize(ddata->egl_window, width, height, 0, 0); + return ddata; +} + +static void wl_egl_deinit_display(void * backend_ctx, lv_display_t * display) +{ + LV_UNUSED(backend_ctx); + lv_wl_egl_display_data_t * ddata = lv_wayland_get_backend_display_data(display); + egl_destroy_display_data(ddata); +} + +static void wl_egl_global_handler(void * backend_ctx, struct wl_registry * registry, uint32_t name, + const char * interface, uint32_t version) +{ + LV_UNUSED(backend_ctx); + LV_UNUSED(registry); + LV_UNUSED(name); + LV_UNUSED(interface); + LV_UNUSED(version); + + /* No specific Wayland globals needed for basic EGL support */ +} + +static lv_egl_interface_t wl_egl_get_interface(lv_display_t * display) +{ + return (lv_egl_interface_t) { + .driver_data = display, + .native_display = lv_wl_ctx.wl_display, + .egl_platform = EGL_PLATFORM_WAYLAND_KHR, + .select_config = wl_egl_select_config_cb, + .flip_cb = wl_egl_flip_cb, + .create_window_cb = wl_egl_create_window, + .destroy_window_cb = wl_egl_destroy_window, + }; +} + +static size_t wl_egl_select_config_cb(void * driver_data, const lv_egl_config_t * configs, size_t config_count) +{ + lv_display_t * display = (lv_display_t *)driver_data; + int32_t target_w = lv_display_get_horizontal_resolution(display); + int32_t target_h = lv_display_get_vertical_resolution(display); + +#if LV_COLOR_DEPTH == 16 + lv_color_format_t target_cf = LV_COLOR_FORMAT_RGB565; +#elif LV_COLOR_DEPTH == 32 + lv_color_format_t target_cf = LV_COLOR_FORMAT_ARGB8888; +#else +#error("Unsupported color format") +#endif + + for(size_t i = 0; i < config_count; ++i) { + LV_LOG_TRACE("Got config %zu %#x %dx%d %d %d %d %d buffer size %d depth %d samples %d stencil %d surface type %d", + i, configs[i].id, + configs[i].max_width, configs[i].max_height, + configs[i].r_bits, configs[i].g_bits, configs[i].b_bits, configs[i].a_bits, + configs[i].buffer_size, configs[i].depth, configs[i].samples, + configs[i].stencil, configs[i].surface_type); + } + + for(size_t i = 0; i < config_count; ++i) { + lv_color_format_t config_cf = lv_opengles_egl_color_format_from_egl_config(&configs[i]); + const bool resolution_matches = configs[i].max_width >= target_w && + configs[i].max_height >= target_h; + const bool is_nanovg_compatible = (configs[i].renderable_type & EGL_OPENGL_ES2_BIT) != 0 && + configs[i].stencil == 8 && configs[i].samples == 4; + const bool is_window = (configs[i].surface_type & EGL_WINDOW_BIT) != 0; + const bool is_compatible_with_draw_unit = is_nanovg_compatible || !LV_USE_DRAW_NANOVG; + + if(is_window && resolution_matches && config_cf == target_cf && is_compatible_with_draw_unit) { + LV_LOG_TRACE("Choosing config %zu", i); + return i; + } + } + + return config_count; +} + +static void * wl_egl_create_window(void * driver_data, const lv_egl_native_window_properties_t * properties) +{ + LV_UNUSED(properties); + lv_display_t * display = (lv_display_t *)driver_data; + + struct wl_surface * wl_surface = lv_wayland_get_window_surface(display); + lv_wl_egl_display_data_t * ddata = lv_wayland_get_backend_display_data(display); + + if(!wl_surface) { + LV_LOG_ERROR("Failed to get Wayland surface"); + return NULL; + } + + ddata->egl_window = wl_egl_window_create(wl_surface, + lv_display_get_horizontal_resolution(display), + lv_display_get_vertical_resolution(display)); + if(!ddata->egl_window) { + LV_LOG_ERROR("Failed to create wl_egl_window"); + return NULL; + } + + return ddata->egl_window; +} + +static void wl_egl_destroy_window(void * driver_data, void * native_window) +{ + lv_display_t * display = (lv_display_t *)driver_data; + lv_wl_egl_display_data_t * ddata = lv_wayland_get_backend_display_data(display); + + LV_ASSERT(ddata->egl_window == native_window); + if(ddata->egl_window) { + wl_egl_window_destroy(ddata->egl_window); + ddata->egl_window = NULL; + } +} + +static void wl_egl_flip_cb(void * driver_data, bool vsync) +{ + LV_UNUSED(driver_data); + LV_UNUSED(vsync); + + /* For Wayland, buffer swapping is handled by the compositor + * through wl_surface_commit() which is called in the flush callback */ +} + +#endif /*LV_WAYLAND_USE_EGL*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_g2d_backend.c b/inc/lvgl/src/drivers/wayland/lv_wl_g2d_backend.c new file mode 100644 index 0000000..6ffc544 --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_g2d_backend.c @@ -0,0 +1,648 @@ + +/** + * @file lv_wl_g2d_backend.c + * + */ + + +/********************* + * INCLUDES + *********************/ + +#include "lv_wayland_private.h" + +#if LV_WAYLAND_USE_G2D + +#include "../../display/lv_display_private.h" +#include +#include +#include +#include +#include "../../misc/lv_types.h" +#include +#include "../../draw/nxp/g2d/lv_g2d_utils.h" +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define LV_WL_G2D_BUF_COUNT 2 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + struct wl_buffer * wl_buffer; + lv_draw_buf_t * lv_draw_buf; + int dmabuf_fd; + uint32_t stride; + uint32_t offset; + bool busy; +} lv_wl_buffer_t; + +typedef struct { + lv_wl_buffer_t buffers[LV_WL_G2D_BUF_COUNT]; +#if LV_USE_ROTATE_G2D + lv_wl_buffer_t rotate_buffer; +#endif + uint32_t drm_cf; + uint8_t last_used; + bool flushing; +} lv_wl_g2d_display_data_t; + +typedef struct { + struct zwp_linux_dmabuf_v1 * handler; + /* XRBG888 and ARGB8888 are always supported*/ + bool supports_rgb565; +} lv_wl_g2d_ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * wl_g2d_init(void); +static void wl_g2d_deinit(void * backend_ctx); +static void wl_g2d_global_handler(void * backend_ctx, struct wl_registry * registry, uint32_t name, + const char * interface, uint32_t version); + + +static void * wl_g2d_init_display(void * backend_ctx, lv_display_t * display, int32_t width, int32_t height); +static void * wl_g2d_resize_display(void * backend_ctx, lv_display_t * display); +static void wl_g2d_deinit_display(void * backend_ctx, lv_display_t * display); + +static lv_wl_g2d_display_data_t * wl_g2d_create_display_data(lv_wl_g2d_ctx_t * ctx, lv_display_t * display, + int32_t width, int32_t height); + +static void wl_g2d_delete_display_data(lv_wl_g2d_display_data_t * ddata); + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p); + + +static void dmabuf_done(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback); +static void dmabuf_format_table(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + int32_t fd, uint32_t size); +static void dmabuf_main_device(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + struct wl_array * device); +static void dmabuf_tranche_done(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback); +static void dmabuf_tranche_target_device(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + struct wl_array * device); +static void dmabuf_tranche_formats(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + struct wl_array * indices); +static void dmabuf_tranche_flags(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + uint32_t flags); +static void dmabuf_modifiers(void * data, struct zwp_linux_dmabuf_v1 * zwp_linux_dmabuf, uint32_t format, + uint32_t modifier_hi, uint32_t modifier_lo); +static void dmabuf_format(void * data, struct zwp_linux_dmabuf_v1 * zwp_linux_dmabuf, uint32_t format); + +static void buffer_release(void * data, struct wl_buffer * buffer); + +static void create_succeeded(void * data, struct zwp_linux_buffer_params_v1 * params, struct wl_buffer * new_buffer); +static void create_failed(void * data, struct zwp_linux_buffer_params_v1 * params); + +static uint32_t lv_cf_to_drm_cf(lv_color_format_t cf); + +static void frame_done(void * data, struct wl_callback * callback, uint32_t time); + +static void init_buffer(lv_wl_g2d_ctx_t * ctx, lv_wl_buffer_t * buffer, uint32_t width, uint32_t height, + lv_color_format_t cf); + +static void delete_buffer(lv_wl_buffer_t * buffer); +static void flush_wait_cb(lv_display_t * disp); + +static lv_wl_buffer_t * get_next_buffer(lv_wl_g2d_display_data_t * ddata); + +/********************** + * STATIC VARIABLES + **********************/ + +static lv_wl_g2d_ctx_t ctx; + +const lv_wayland_backend_ops_t wl_backend_ops = { + .init = wl_g2d_init, + .deinit = wl_g2d_deinit, + .global_handler = wl_g2d_global_handler, + .init_display = wl_g2d_init_display, + .deinit_display = wl_g2d_deinit_display, + .resize_display = wl_g2d_resize_display, +}; + +static const struct zwp_linux_dmabuf_feedback_v1_listener dmabuf_listener_v5 = { + .done = dmabuf_done, + .format_table = dmabuf_format_table, + .main_device = dmabuf_main_device, + .tranche_done = dmabuf_tranche_done, + .tranche_target_device = dmabuf_tranche_target_device, + .tranche_formats = dmabuf_tranche_formats, + .tranche_flags = dmabuf_tranche_flags, +}; + +static const struct wl_buffer_listener buffer_listener = { + .release = buffer_release +}; + +static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener_v3 = { + .format = dmabuf_format, + .modifier = dmabuf_modifiers +}; + +static const struct zwp_linux_dmabuf_v1_listener dmabuf_listener = { + .format = dmabuf_format +}; + +static const struct zwp_linux_buffer_params_v1_listener params_listener = { + .created = create_succeeded, + .failed = create_failed +}; + +static const struct wl_callback_listener frame_listener = { + .done = frame_done, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + + +static void * wl_g2d_init(void) +{ + lv_memset(&ctx, 0, sizeof(ctx)); + return &ctx; +} + +static void wl_g2d_deinit(void * backend_ctx) +{ + lv_wl_g2d_ctx_t * ctx = (lv_wl_g2d_ctx_t *)backend_ctx; + if(!ctx) { + return; + } + if(ctx->handler) { + zwp_linux_dmabuf_v1_destroy(ctx->handler); + } +} + + +static void wl_g2d_global_handler(void * backend_ctx, struct wl_registry * registry, uint32_t name, + const char * interface, uint32_t version) +{ + + LV_UNUSED(version); + lv_wl_g2d_ctx_t * ctx = (lv_wl_g2d_ctx_t *)backend_ctx; + + if(lv_streq(interface, zwp_linux_dmabuf_v1_interface.name)) { + ctx->handler = wl_registry_bind(registry, name, &zwp_linux_dmabuf_v1_interface, version); + + if(version >= 4) { + struct zwp_linux_dmabuf_feedback_v1 * feedback = zwp_linux_dmabuf_v1_get_default_feedback(ctx->handler); + zwp_linux_dmabuf_feedback_v1_add_listener(feedback, &dmabuf_listener_v5, ctx); + } + else if(version < 3) { + zwp_linux_dmabuf_v1_add_listener(ctx->handler, &dmabuf_listener, ctx); + } + else if(version == 3) { + zwp_linux_dmabuf_v1_add_listener(ctx->handler, &dmabuf_listener_v3, ctx); + } + wl_display_roundtrip(lv_wl_ctx.wl_display); + } +} +static void init_buffer(lv_wl_g2d_ctx_t * ctx, lv_wl_buffer_t * buffer, uint32_t width, uint32_t height, + lv_color_format_t cf) +{ + uint32_t drm_cf = lv_cf_to_drm_cf(cf); + uint32_t stride = lv_draw_buf_width_to_stride(width, cf); + buffer->lv_draw_buf = lv_draw_buf_create(width, height, cf, stride); + buffer->dmabuf_fd = g2d_get_buf_fd(buffer->lv_draw_buf); + buffer->stride = stride; + buffer->offset = 0; + buffer->busy = false; + + /* Will be set on the dmabuf callback if the creation is successful*/ + buffer->wl_buffer = NULL; + + struct zwp_linux_buffer_params_v1 * params = zwp_linux_dmabuf_v1_create_params(ctx->handler); + + zwp_linux_buffer_params_v1_add(params, + buffer->dmabuf_fd, + 0, + buffer->offset, + buffer->stride, + 0, + 0); + + zwp_linux_buffer_params_v1_add_listener(params, ¶ms_listener, buffer); + zwp_linux_buffer_params_v1_create(params, width, height, drm_cf, 0); +} + +static void delete_buffer(lv_wl_buffer_t * buffer) +{ + if(buffer->wl_buffer) { + wl_buffer_destroy(buffer->wl_buffer); + buffer->wl_buffer = NULL; + } + if(buffer->lv_draw_buf) { + lv_draw_buf_destroy(buffer->lv_draw_buf); + buffer->lv_draw_buf = NULL; + } +} + +static lv_wl_g2d_display_data_t * wl_g2d_create_display_data(lv_wl_g2d_ctx_t * ctx, lv_display_t * display, + int32_t width, int32_t height) +{ + lv_wl_g2d_display_data_t * ddata = lv_zalloc(sizeof(*ddata)); + LV_ASSERT_MALLOC(ddata); + if(!ddata) { + return NULL; + } + + lv_display_rotation_t rotation = lv_display_get_rotation(display); + lv_color_format_t cf = lv_display_get_color_format(display); + if(cf == LV_COLOR_FORMAT_RGB565 && !ctx->supports_rgb565) { + LV_LOG_WARN("RGB565 is not supported by the wayland compositor. Falling back to XRGB8888"); + cf = LV_COLOR_FORMAT_XRGB8888; + lv_display_set_color_format(display, cf); + } + + ddata->drm_cf = lv_cf_to_drm_cf(cf); + for(size_t i = 0; i < LV_WL_G2D_BUF_COUNT; i++) { + init_buffer(ctx, &ddata->buffers[i], width, height, cf); + } + +#if LV_USE_ROTATE_G2D + if(rotation == LV_DISPLAY_ROTATION_90 || rotation == LV_DISPLAY_ROTATION_270) { + init_buffer(ctx, &ddata->rotate_buffer, height, width, cf); + } + else { + init_buffer(ctx, &ddata->rotate_buffer, width, height, cf); + } +#endif + + wl_display_flush(lv_wl_ctx.wl_display); + wl_display_roundtrip(lv_wl_ctx.wl_display); + for(size_t i = 0; i < LV_WL_G2D_BUF_COUNT; ++i) { + if(!ddata->buffers[i].wl_buffer) { + wl_g2d_delete_display_data(ddata); + LV_LOG_ERROR("DMABUF creation failed"); + return NULL; + } + } + +#if LV_USE_ROTATE_G2D + if(!ddata->rotate_buffer.wl_buffer) { + wl_g2d_delete_display_data(ddata); + LV_LOG_ERROR("DMABUF creation failed"); + return NULL; + } + lv_display_set_draw_buffers(display, ddata->rotate_buffer.lv_draw_buf, NULL); +#else + lv_display_set_draw_buffers(display, ddata->buffers[0].lv_draw_buf, ddata->buffers[1].lv_draw_buf); +#endif + + return ddata; +} + +static void wl_g2d_delete_display_data(lv_wl_g2d_display_data_t * ddata) +{ + for(int i = 0; i < LV_WL_G2D_BUF_COUNT; i++) { + delete_buffer(ddata->buffers + i); + } + +#if LV_USE_ROTATE_G2D + delete_buffer(&ddata->rotate_buffer); +#endif + + lv_free(ddata); +} + +static void * wl_g2d_init_display(void * backend_ctx, lv_display_t * display, int32_t width, int32_t height) +{ + + lv_wl_g2d_ctx_t * ctx = (lv_wl_g2d_ctx_t *)backend_ctx; + lv_wl_g2d_display_data_t * ddata = wl_g2d_create_display_data(ctx, display, width, height); + if(!ddata) { + LV_LOG_ERROR("Failed to create display data"); + return NULL; + } + + lv_display_set_flush_cb(display, flush_cb); + lv_display_set_flush_wait_cb(display, flush_wait_cb); + lv_display_set_render_mode(display, LV_DISPLAY_RENDER_MODE_DIRECT); + return ddata; +} + +static uint32_t lv_cf_to_drm_cf(lv_color_format_t cf) +{ + if(cf == LV_COLOR_FORMAT_UNKNOWN) { + return DRM_FORMAT_ARGB8888; /* Default to ARGB8888 */ + } + + switch(cf) { + case LV_COLOR_FORMAT_XRGB8888: + return DRM_FORMAT_XRGB8888; + break; + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + return DRM_FORMAT_ARGB8888; + break; + case LV_COLOR_FORMAT_RGB565: + return DRM_FORMAT_RGB565; + break; + default: + return DRM_FORMAT_ARGB8888; + } +} + +static void frame_done(void * data, struct wl_callback * callback, uint32_t time) +{ + LV_LOG_TRACE("Frame done"); + LV_UNUSED(time); + lv_display_t * display = data; + wl_callback_destroy(callback); + lv_display_flush_ready(display); +} + + +static void buffer_release(void * data, struct wl_buffer * buffer) +{ + LV_LOG_TRACE("Buffer released"); + LV_UNUSED(buffer); + lv_wl_buffer_t * buf = data; + buf->busy = false; +} + + +static void create_succeeded(void * data, struct zwp_linux_buffer_params_v1 * params, struct wl_buffer * new_buffer) +{ + LV_LOG_TRACE("Buffer created successfuly"); + lv_wl_buffer_t * buffer = data; + buffer->wl_buffer = new_buffer; + + /* When not using explicit synchronization listen to wl_buffer.release + * for release notifications, otherwise we are going to use + * zwp_linux_buffer_release_v1. */ + wl_buffer_add_listener(buffer->wl_buffer, &buffer_listener, buffer); + + zwp_linux_buffer_params_v1_destroy(params); +} + +static void create_failed(void * data, struct zwp_linux_buffer_params_v1 * params) +{ + lv_wl_buffer_t * buffer = data; + buffer->wl_buffer = NULL; + zwp_linux_buffer_params_v1_destroy(params); + LV_LOG_ERROR("Failed to create dmabuf buffer\n"); +} + +static void * wl_g2d_resize_display(void * backend_ctx, lv_display_t * disp) +{ + lv_wl_g2d_ctx_t * ctx = (lv_wl_g2d_ctx_t *)backend_ctx; + int32_t width = lv_display_get_original_horizontal_resolution(disp); + int32_t height = lv_display_get_original_vertical_resolution(disp); + + lv_wl_g2d_display_data_t * ddata = wl_g2d_create_display_data(ctx, disp, width, height); + if(!ddata) { + LV_LOG_ERROR("Failed to create DMABUF buffers for %dx%d", width, height); + return NULL; + } + + lv_wl_g2d_display_data_t * old_ddata = lv_wayland_get_backend_display_data(disp); + wl_g2d_delete_display_data(old_ddata); + return ddata; +} + +static void wl_g2d_deinit_display(void * backend_ctx, lv_display_t * display) +{ + LV_UNUSED(backend_ctx); + lv_wl_g2d_display_data_t * ddata = lv_wayland_get_backend_display_data(display); + if(!ddata) { + return; + } + wl_g2d_delete_display_data(ddata); +} + +static void dmabuf_format_table(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + int32_t fd, uint32_t size) +{ + lv_wl_g2d_ctx_t * ctx = data; + + LV_UNUSED(zwp_linux_dmabuf_feedback); + + if(fd < 0 || size == 0) { + LV_LOG_ERROR("Invalid format table fd=%d size=%u", fd, size); + return; + } + + /* Map the format table file descriptor */ + void * table = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); + if(table == MAP_FAILED) { + LV_LOG_ERROR("Failed to mmap format table: %s", strerror(errno)); + close(fd); + return; + } + + LV_LOG_TRACE("Received format table with fd %d and size %u", fd, size); + + /* Parse the format table - each entry is 16 bytes: 4 bytes format + 4 bytes padding + 8 bytes modifier */ + size_t num_formats = size / 16; + uint32_t * formats = (uint32_t *)table; + + for(size_t i = 0; i < num_formats; i++) { + /* Each entry is 4 uint32_t words */ + uint32_t format = formats[i * 4]; + if(format == DRM_FORMAT_RGB565) { + ctx->supports_rgb565 = true; + } + } + + /* Clean up */ + munmap(table, size); + close(fd); +} + +static void dmabuf_done(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback) +{ + lv_wl_g2d_ctx_t * ctx = data; + + LV_UNUSED(zwp_linux_dmabuf_feedback); + LV_UNUSED(ctx); + + LV_LOG_TRACE("DMABUF feedback done"); + + /* This event marks the end of a feedback round. The client has received + * all the format and modifier pairs from all tranches. This allows + * the client to proceed with buffer allocation. */ +} + +static void dmabuf_main_device(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + struct wl_array * device) +{ + LV_UNUSED(data); + LV_UNUSED(zwp_linux_dmabuf_feedback); + LV_UNUSED(device); + + LV_LOG_TRACE("DMABUF main device received (size: %zu)", device->size); + + /* This event advertises the main device that the server-side allocator + * will use for scanout. It should be used by clients as a hint for + * buffer allocation. */ +} + +static void dmabuf_tranche_done(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback) +{ + LV_UNUSED(data); + LV_UNUSED(zwp_linux_dmabuf_feedback); + + LV_LOG_TRACE("DMABUF tranche done"); + + /* This event marks the end of a tranche. This allows the client to + * process the formats and modifiers it has received for this tranche. */ +} + +static void dmabuf_tranche_target_device(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + struct wl_array * device) +{ + LV_UNUSED(data); + LV_UNUSED(zwp_linux_dmabuf_feedback); + LV_UNUSED(device); + + LV_LOG_TRACE("DMABUF tranche target device (size: %zu)", device->size); + + /* This event advertises the target device that the following tranche + * will apply to. */ +} + +static void dmabuf_tranche_formats(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + struct wl_array * indices) +{ + LV_UNUSED(data); + LV_UNUSED(zwp_linux_dmabuf_feedback); + + LV_LOG_TRACE("DMABUF tranche formats (count: %zu)", indices->size / sizeof(uint16_t)); + + /* This event advertises the format + modifier pairs that the compositor + * supports for the current tranche. The indices are offsets into the + * format table sent earlier. */ + + if(indices->size > 0) { + /* If we don't have a format yet, we could parse the indices here + * to find a suitable format from the format table, but for now + * we rely on the format_table callback to set a format directly */ + LV_LOG_TRACE("Format indices received"); + } +} + +static void dmabuf_tranche_flags(void * data, struct zwp_linux_dmabuf_feedback_v1 * zwp_linux_dmabuf_feedback, + uint32_t flags) +{ + LV_UNUSED(data); + LV_UNUSED(zwp_linux_dmabuf_feedback); + LV_UNUSED(flags); + + LV_LOG_TRACE("DMABUF tranche flags: 0x%x", flags); + + /* This event advertises the flags for the current tranche. + * Flags can indicate special properties like scanout support. */ +} + +static void dmabuf_modifiers(void * data, struct zwp_linux_dmabuf_v1 * zwp_linux_dmabuf, uint32_t format, + uint32_t modifier_hi, uint32_t modifier_lo) +{ + LV_UNUSED(modifier_hi); + LV_UNUSED(modifier_lo); + dmabuf_format(data, zwp_linux_dmabuf, format); +} + +static void dmabuf_format(void * data, struct zwp_linux_dmabuf_v1 * zwp_linux_dmabuf, uint32_t format) +{ + lv_wl_g2d_ctx_t * ctx = data; + + LV_UNUSED(zwp_linux_dmabuf); + if(format == DRM_FORMAT_RGB565) { + ctx->supports_rgb565 = true; + } +} + +static lv_wl_buffer_t * get_next_buffer(lv_wl_g2d_display_data_t * ddata) +{ + lv_wl_buffer_t * ret = &ddata->buffers[ddata->last_used]; + if(ret->busy) { + /* In theory this should never happen, log a warning in case it does */ + LV_LOG_WARN("Failed to acquire a non-busy buffer"); + } + ddata->last_used = (ddata->last_used + 1) % (LV_WL_G2D_BUF_COUNT); + return ret; +} + +static void flush_wait_cb(lv_display_t * disp) +{ + while(disp->flushing) { + wl_display_dispatch(lv_wl_ctx.wl_display); + } +} + +static void flush_cb(lv_display_t * disp, const lv_area_t * area, unsigned char * color_p) +{ + + LV_UNUSED(color_p); + lv_wl_g2d_display_data_t * ddata = lv_wayland_get_backend_display_data(disp); + int32_t src_width = lv_area_get_width(area); + int32_t src_height = lv_area_get_height(area); + uint32_t rotation = lv_display_get_rotation(disp); +#if LV_USE_ROTATE_G2D + lv_draw_buf_invalidate_cache(ddata->rotate_buffer.lv_draw_buf, NULL); +#endif + + struct wl_surface * surface = lv_wayland_get_window_surface(disp); + /* Mark surface damage */ + wl_surface_damage(surface, area->x1, area->y1, src_width, src_height); + + if(!lv_display_flush_is_last(disp)) { + lv_display_flush_ready(disp); + return; + } + + lv_wl_buffer_t * buf = get_next_buffer(ddata); + + if(!buf) { + LV_LOG_ERROR("Failed to acquire a wayland window body buffer"); + return; + } + + lv_draw_buf_invalidate_cache(buf->lv_draw_buf, NULL); + /*Rerender the whole surface if we're using rotation*/ + if(rotation != LV_DISPLAY_ROTATION_0) { + wl_surface_damage(surface, 0, 0, + lv_display_get_original_horizontal_resolution(disp), + lv_display_get_original_vertical_resolution(disp)); + } + +#if LV_USE_ROTATE_G2D + g2d_rotate(ddata->rotate_buffer.lv_draw_buf, buf->lv_draw_buf, + lv_display_get_original_horizontal_resolution(disp), + lv_display_get_original_vertical_resolution(disp), + lv_display_get_rotation(disp), + lv_display_get_color_format(disp)); +#endif + /* Finally, attach buffer and commit to surface */ + struct wl_callback * cb = wl_surface_frame(surface); + wl_callback_add_listener(cb, &frame_listener, disp); + + wl_surface_attach(surface, buf->wl_buffer, 0, 0); + wl_surface_commit(surface); + + buf->busy = true; + return; +} + +#endif /*LV_USE_WAYLAND_G2D*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_keyboard.c b/inc/lvgl/src/drivers/wayland/lv_wl_keyboard.c new file mode 100644 index 0000000..29e172e --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_keyboard.c @@ -0,0 +1,316 @@ +/** + * @file lv_wl_keyboard.c + * + */ + +#include "lv_wl_keyboard.h" + +#if LV_USE_WAYLAND + +#include "lv_wayland_private.h" +#include +#include +#include +#include +#include "../../misc/lv_log.h" + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void keyboard_read(lv_indev_t * drv, lv_indev_data_t * data); + +static void keyboard_handle_keymap(void * data, struct wl_keyboard * keyboard, uint32_t format, int fd, uint32_t size); +static void keyboard_handle_enter(void * data, struct wl_keyboard * keyboard, uint32_t serial, + struct wl_surface * surface, struct wl_array * keys); +static void keyboard_handle_leave(void * data, struct wl_keyboard * keyboard, uint32_t serial, + struct wl_surface * surface); + +static void keyboard_handle_modifiers(void * data, struct wl_keyboard * keyboard, uint32_t serial, + uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, + uint32_t group); + +static void keyboard_handle_key(void * data, struct wl_keyboard * keyboard, uint32_t serial, uint32_t time, + uint32_t key, uint32_t state); + +static lv_key_t keycode_xkb_to_lv(xkb_keysym_t xkb_key); + +/********************** + * STATIC VARIABLES + **********************/ + +static struct xkb_context * xkb_context; + +static const struct wl_keyboard_listener keyboard_listener = { + .keymap = keyboard_handle_keymap, + .enter = keyboard_handle_enter, + .leave = keyboard_handle_leave, + .key = keyboard_handle_key, + .modifiers = keyboard_handle_modifiers, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_wayland_keyboard_create(void) +{ + + lv_indev_t * indev = lv_indev_create(); + if(!indev) { + return NULL; + } + lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(indev, keyboard_read); + lv_indev_set_driver_data(indev, lv_wl_ctx.seat.keyboard); + + return indev; +} + +lv_indev_t * lv_wayland_get_keyboard(lv_display_t * display) +{ + lv_wl_window_t * window = lv_display_get_driver_data(display); + if(!window) { + return NULL; + } + return window->lv_indev_keyboard; +} + +/********************** + * PRIVATE FUNCTIONS + **********************/ + +lv_wl_seat_keyboard_t * lv_wayland_seat_keyboard_create(struct wl_seat * wl_seat) +{ + + struct wl_keyboard * keyboard = wl_seat_get_keyboard(wl_seat); + if(!keyboard) { + LV_LOG_WARN("Failed to get seat keyboard"); + return NULL; + } + if(!xkb_context && !(xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS))) { + LV_LOG_WARN("Failed to create xkb context"); + return NULL; + } + + lv_wl_seat_keyboard_t * wl_seat_keyboard = lv_zalloc(sizeof(*wl_seat_keyboard)); + LV_ASSERT_MALLOC(wl_seat_keyboard); + if(!wl_seat_keyboard) { + LV_LOG_WARN("Failed to allocate memory for wayland keyboard"); + return NULL; + } + wl_keyboard_add_listener(keyboard, &keyboard_listener, NULL); + wl_keyboard_set_user_data(keyboard, wl_seat_keyboard); + + wl_seat_keyboard->wl_keyboard = keyboard; + lv_wayland_update_indevs(keyboard_read, wl_seat_keyboard); + + return wl_seat_keyboard; +} +void lv_wayland_seat_keyboard_delete(lv_wl_seat_keyboard_t * seat_keyboard) +{ + lv_wayland_update_indevs(keyboard_read, NULL); + lv_free(seat_keyboard); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void keyboard_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_wl_seat_keyboard_t * kbdata = lv_indev_get_driver_data(indev); + if(!kbdata) { + return; + } + data->key = kbdata->key; + data->state = kbdata->state; +} + +static void keyboard_handle_keymap(void * data, struct wl_keyboard * keyboard, uint32_t format, int fd, uint32_t size) +{ + LV_UNUSED(data); + lv_wl_seat_keyboard_t * kbdata = wl_keyboard_get_user_data(keyboard); + + if(format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) { + LV_LOG_WARN("Can't handle formats other than WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1"); + close(fd); + return; + } + + char * map_str = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); + if(map_str == MAP_FAILED) { + LV_LOG_WARN("Failed to mmap keyboard keymap file"); + close(fd); + return; + } + + /* Set up XKB keymap */ + struct xkb_keymap * keymap = xkb_keymap_new_from_string(xkb_context, map_str, XKB_KEYMAP_FORMAT_TEXT_V1, 0); + munmap(map_str, size); + close(fd); + + if(!keymap) { + LV_LOG_WARN("Failed to compile keymap"); + return; + } + + /* Set up XKB state */ + struct xkb_state * state = xkb_state_new(keymap); + if(!state) { + LV_LOG_WARN("Failed to create XKB state"); + xkb_keymap_unref(keymap); + return; + } + + xkb_keymap_unref(kbdata->xkb_keymap); + xkb_state_unref(kbdata->xkb_state); + + kbdata->xkb_keymap = keymap; + kbdata->xkb_state = state; +} + +static void keyboard_handle_enter(void * data, struct wl_keyboard * keyboard, uint32_t serial, + struct wl_surface * surface, struct wl_array * keys) +{ + + LV_UNUSED(data); + LV_UNUSED(keyboard); + LV_UNUSED(serial); + LV_UNUSED(keys); + LV_UNUSED(surface); +} + +static void keyboard_handle_leave(void * data, struct wl_keyboard * keyboard, uint32_t serial, + struct wl_surface * surface) +{ + LV_UNUSED(serial); + LV_UNUSED(keyboard); + LV_UNUSED(data); + LV_UNUSED(surface); +} + +static void keyboard_handle_key(void * data, struct wl_keyboard * keyboard, uint32_t serial, uint32_t time, + uint32_t key, uint32_t state) +{ + LV_UNUSED(data); + LV_UNUSED(serial); + LV_UNUSED(time); + + lv_wl_seat_keyboard_t * kbdata = wl_keyboard_get_user_data(keyboard); + const uint32_t code = (key + 8); + + if(!kbdata->xkb_state) { + return; + } + + const xkb_keysym_t * syms = XKB_KEY_NoSymbol; + if(xkb_state_key_get_syms(kbdata->xkb_state, code, &syms) != 1) { + return; + } + + const lv_key_t lv_key = keycode_xkb_to_lv(syms[0]); + const lv_indev_state_t lv_state = + (state == WL_KEYBOARD_KEY_STATE_PRESSED) ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + + if(lv_key != 0) { + kbdata->key = lv_key; + kbdata->state = lv_state; + } +} + +static void keyboard_handle_modifiers(void * data, struct wl_keyboard * keyboard, uint32_t serial, + uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, + uint32_t group) +{ + LV_UNUSED(serial); + LV_UNUSED(data); + lv_wl_seat_keyboard_t * kbdata = wl_keyboard_get_user_data(keyboard); + + /* If we're not using a keymap, then we don't handle PC-style modifiers */ + if(!kbdata->xkb_keymap) { + return; + } + + xkb_state_update_mask(kbdata->xkb_state, mods_depressed, mods_latched, mods_locked, 0, 0, group); +} +static lv_key_t keycode_xkb_to_lv(xkb_keysym_t xkb_key) +{ + + if(xkb_key >= XKB_KEY_space && xkb_key <= XKB_KEY_asciitilde) { + return xkb_key; + } + if(xkb_key >= XKB_KEY_KP_0 && xkb_key <= XKB_KEY_KP_9) { + return (xkb_key & 0x003f); + } + switch(xkb_key) { + case XKB_KEY_BackSpace: + return LV_KEY_BACKSPACE; + break; + case XKB_KEY_Return: + case XKB_KEY_KP_Enter: + return LV_KEY_ENTER; + break; + case XKB_KEY_Escape: + return LV_KEY_ESC; + break; + case XKB_KEY_Delete: + case XKB_KEY_KP_Delete: + return LV_KEY_DEL; + break; + case XKB_KEY_Home: + case XKB_KEY_KP_Home: + return LV_KEY_HOME; + break; + case XKB_KEY_Left: + case XKB_KEY_KP_Left: + return LV_KEY_LEFT; + break; + case XKB_KEY_Up: + case XKB_KEY_KP_Up: + return LV_KEY_UP; + break; + case XKB_KEY_Right: + case XKB_KEY_KP_Right: + return LV_KEY_RIGHT; + break; + case XKB_KEY_Down: + case XKB_KEY_KP_Down: + return LV_KEY_DOWN; + break; + case XKB_KEY_Prior: + case XKB_KEY_KP_Prior: + return LV_KEY_PREV; + break; + case XKB_KEY_Next: + case XKB_KEY_KP_Next: + case XKB_KEY_Tab: + case XKB_KEY_KP_Tab: + return LV_KEY_NEXT; + break; + case XKB_KEY_End: + case XKB_KEY_KP_End: + return LV_KEY_END; + break; + default: + return 0; + } +} + +#endif /* LV_WAYLAND */ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_keyboard.h b/inc/lvgl/src/drivers/wayland/lv_wl_keyboard.h new file mode 100644 index 0000000..86296d4 --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_keyboard.h @@ -0,0 +1,52 @@ +/** + * @file lv_wl_keyboard.h + * + */ + +#ifndef LV_WL_KEYBOARD_H +#define LV_WL_KEYBOARD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_gesture.h" +#if LV_USE_WAYLAND + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_wayland_keyboard_create(void); + +/** + * Get keyboard input device for given LVGL display + * @param display LVGL display + * @return input device connected to keyboard, or NULL on error + */ +lv_indev_t * lv_wayland_get_keyboard(lv_display_t * display); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_WAYLAND */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WL_KEYBOARD_H*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_pointer.c b/inc/lvgl/src/drivers/wayland/lv_wl_pointer.c new file mode 100644 index 0000000..ddfdb34 --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_pointer.c @@ -0,0 +1,262 @@ +/** + * @file lv_wl_pointer.c + * + */ + +#include "lv_wl_pointer.h" + +#if LV_USE_WAYLAND + +#include +#include +#include +#include +#include +#include +#include "lv_wayland_private.h" + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + + +static void pointer_read(lv_indev_t * indev, lv_indev_data_t * data); +static void pointeraxis_read(lv_indev_t * indev, lv_indev_data_t * data); + +static void pointer_handle_enter(void * data, struct wl_pointer * pointer, uint32_t serial, struct wl_surface * surface, + wl_fixed_t sx, wl_fixed_t sy); + +static void pointer_handle_leave(void * data, struct wl_pointer * pointer, uint32_t serial, + struct wl_surface * surface); + +static void pointer_handle_motion(void * data, struct wl_pointer * pointer, uint32_t time, wl_fixed_t sx, + wl_fixed_t sy); + +static void pointer_handle_button(void * data, struct wl_pointer * wl_pointer, uint32_t serial, uint32_t time, + uint32_t button, uint32_t state); + +static void pointer_handle_axis(void * data, struct wl_pointer * wl_pointer, uint32_t time, uint32_t axis, + wl_fixed_t value); + +/********************** + * STATIC VARIABLES + **********************/ + +static struct wl_cursor_theme * cursor_theme = NULL; + +static const struct wl_pointer_listener pointer_listener = { + .enter = pointer_handle_enter, + .leave = pointer_handle_leave, + .motion = pointer_handle_motion, + .button = pointer_handle_button, + .axis = pointer_handle_axis, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_wayland_pointer_create(void) +{ + lv_indev_t * indev = lv_indev_create(); + if(!indev) { + return NULL; + } + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, pointer_read); + lv_indev_set_driver_data(indev, lv_wl_ctx.seat.pointer); + return indev; +} + +lv_indev_t * lv_wayland_get_pointer(lv_display_t * disp) +{ + lv_wl_window_t * window = lv_display_get_driver_data(disp); + if(!window) { + return NULL; + } + return window->lv_indev_pointer; +} + +lv_indev_t * lv_wayland_pointer_axis_create(void) +{ + lv_indev_t * indev = lv_indev_create(); + if(!indev) { + return NULL; + } + lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb(indev, pointeraxis_read); + lv_indev_set_driver_data(indev, lv_wl_ctx.seat.pointer); + return indev; +} + +lv_indev_t * lv_wayland_get_pointeraxis(lv_display_t * display) +{ + lv_wl_window_t * window = lv_display_get_driver_data(display); + if(!window) { + return NULL; + } + return window->lv_indev_pointeraxis; +} + +lv_wl_seat_pointer_t * lv_wayland_seat_pointer_create(struct wl_seat * seat, struct wl_surface * surface) +{ + LV_ASSERT_NULL(seat); + LV_ASSERT_NULL(surface); + if(!cursor_theme && !(cursor_theme = wl_cursor_theme_load(NULL, 32, lv_wl_ctx.wl_shm))) { + LV_LOG_WARN("Failed to load cursor theme for pointer"); + return NULL; + } + + struct wl_pointer * pointer = wl_seat_get_pointer(seat); + if(!pointer) { + LV_LOG_WARN("Failed to get seat pointer"); + return NULL; + } + + lv_wl_seat_pointer_t * wl_seat_pointer = lv_zalloc(sizeof(*wl_seat_pointer)); + LV_ASSERT_MALLOC(wl_seat_pointer); + if(!wl_seat_pointer) { + LV_LOG_WARN("Failed to allocate memory for wayland pointer"); + return NULL; + } + wl_pointer_add_listener(pointer, &pointer_listener, NULL); + wl_pointer_set_user_data(pointer, wl_seat_pointer); + + wl_seat_pointer->cursor_surface = surface; + wl_seat_pointer->wl_pointer = pointer; + lv_wayland_update_indevs(pointer_read, wl_seat_pointer); + lv_wayland_update_indevs(pointeraxis_read, wl_seat_pointer); + + return wl_seat_pointer; +} + +void lv_wayland_seat_pointer_delete(lv_wl_seat_pointer_t * seat_pointer) +{ + lv_wayland_update_indevs(pointer_read, NULL); + lv_wayland_update_indevs(pointeraxis_read, NULL); + wl_pointer_destroy(seat_pointer->wl_pointer); + lv_free(seat_pointer); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void pointeraxis_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_wl_seat_pointer_t * seat_pointer = lv_indev_get_driver_data(indev); + if(!seat_pointer) { + return; + } + + data->state = seat_pointer->wheel_btn_state; + data->enc_diff = seat_pointer->wheel_diff; + seat_pointer->wheel_diff = 0; +} +static void pointer_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_wl_seat_pointer_t * seat_pointer = lv_indev_get_driver_data(indev); + + if(!seat_pointer) { + return; + } + data->point = seat_pointer->point; + data->state = seat_pointer->left_btn_state; +} + +static void pointer_handle_enter(void * data, struct wl_pointer * pointer, uint32_t serial, struct wl_surface * surface, + wl_fixed_t sx, wl_fixed_t sy) +{ + LV_UNUSED(data); + LV_UNUSED(surface); + lv_wl_seat_pointer_t * seat_pointer = wl_pointer_get_user_data(pointer); + int pos_x = wl_fixed_to_int(sx); + int pos_y = wl_fixed_to_int(sy); + + seat_pointer->point.x = pos_x; + seat_pointer->point.y = pos_y; + + struct wl_cursor * wl_cursor = wl_cursor_theme_get_cursor(cursor_theme, LV_WAYLAND_DEFAULT_CURSOR_NAME); + struct wl_cursor_image * cursor_image = wl_cursor->images[0]; + + wl_pointer_set_cursor(pointer, serial, seat_pointer->cursor_surface, cursor_image->hotspot_x, cursor_image->hotspot_y); + + wl_surface_attach(seat_pointer->cursor_surface, wl_cursor_image_get_buffer(cursor_image), 0, 0); + wl_surface_damage(seat_pointer->cursor_surface, 0, 0, cursor_image->width, cursor_image->height); + wl_surface_commit(seat_pointer->cursor_surface); +} + + +static void pointer_handle_leave(void * data, struct wl_pointer * pointer, uint32_t serial, struct wl_surface * surface) +{ + LV_UNUSED(data); + LV_UNUSED(serial); + LV_UNUSED(surface); + LV_UNUSED(pointer); +} + +static void pointer_handle_motion(void * data, struct wl_pointer * pointer, uint32_t time, wl_fixed_t sx, wl_fixed_t sy) +{ + LV_UNUSED(data); + LV_UNUSED(time); + + lv_wl_seat_pointer_t * seat_pointer = wl_pointer_get_user_data(pointer); + LV_ASSERT_NULL(seat_pointer); + + seat_pointer->point.x = wl_fixed_to_int(sx); + seat_pointer->point.y = wl_fixed_to_int(sy); +} + +static void pointer_handle_button(void * data, struct wl_pointer * pointer, uint32_t serial, uint32_t time, + uint32_t button, uint32_t state) +{ + LV_UNUSED(data); + LV_UNUSED(serial); + LV_UNUSED(time); + lv_wl_seat_pointer_t * seat_pointer = wl_pointer_get_user_data(pointer); + LV_ASSERT_NULL(seat_pointer); + const lv_indev_state_t lv_state = (state == WL_POINTER_BUTTON_STATE_PRESSED) ? + LV_INDEV_STATE_PRESSED : + LV_INDEV_STATE_RELEASED; + + if(button == BTN_LEFT) { + seat_pointer->left_btn_state = lv_state; + } + else if(button == BTN_RIGHT) { + seat_pointer->right_btn_state = lv_state; + } + else if(button == BTN_MIDDLE) { + seat_pointer->wheel_btn_state = lv_state; + } +} + +static void pointer_handle_axis(void * data, struct wl_pointer * pointer, uint32_t time, uint32_t axis, + wl_fixed_t value) +{ + LV_UNUSED(data); + LV_UNUSED(time); + lv_wl_seat_pointer_t * seat_pointer = wl_pointer_get_user_data(pointer); + const int diff = wl_fixed_to_int(value); + if(axis != 0) { + return; + } + seat_pointer->wheel_diff += diff; +} + +#endif /* LV_USE_WAYLAND */ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_pointer.h b/inc/lvgl/src/drivers/wayland/lv_wl_pointer.h new file mode 100644 index 0000000..265394c --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_pointer.h @@ -0,0 +1,54 @@ + +/** + * @file lv_wl_pointer.h + * + */ + +#ifndef LV_WL_POINTER_H +#define LV_WL_POINTER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_gesture.h" +#if LV_USE_WAYLAND + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_wayland_pointer_create(void); + +/** + * Obtains the input device of the mouse pointer + * @note It is used to create an input group on application start + * @param disp Reference to the LVGL display associated to the window + * @return The input device + */ +lv_indev_t * lv_wayland_get_pointer(lv_display_t * disp); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_WAYLAND */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WL_POINTER_H*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_pointer_axis.h b/inc/lvgl/src/drivers/wayland/lv_wl_pointer_axis.h new file mode 100644 index 0000000..d3564a5 --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_pointer_axis.h @@ -0,0 +1,54 @@ +/** + * @file lv_wl_pointer_axis.h + * + */ + +#ifndef LV_WL_POINTER_AXIS_H +#define LV_WL_POINTER_AXIS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_gesture.h" + +#if LV_USE_WAYLAND + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_wayland_pointer_axis_create(void); + +/** + * Obtains the input device of the encoder + * @note It is used to create an input group on application start + * @param display Reference to the LVGL display associated to the window + * @return The input device + */ +lv_indev_t * lv_wayland_get_pointeraxis(lv_display_t * display); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_WAYLAND */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WL_POINTER_AXIS_H*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_seat.c b/inc/lvgl/src/drivers/wayland/lv_wl_seat.c new file mode 100644 index 0000000..f547a8e --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_seat.c @@ -0,0 +1,144 @@ +/** + * @file lv_wl_seat.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_wayland.h" + +#if LV_USE_WAYLAND + +#include "lv_wayland_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void seat_handle_capabilities(void * data, struct wl_seat * wl_seat, enum wl_seat_capability caps); + +static lv_wl_seat_pointer_t * create_pointer(struct wl_seat * wl_seat); +static void delete_pointer(lv_wl_seat_pointer_t * seat_pointer); + +/********************** + * STATIC VARIABLES + **********************/ + +static const struct wl_seat_listener seat_listener = { + .capabilities = seat_handle_capabilities, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * PRIVATE FUNCTIONS + **********************/ + +void lv_wayland_seat_init(lv_wl_seat_t * seat, struct wl_registry * registry, uint32_t name, uint32_t version) +{ + LV_ASSERT_NULL(seat); + LV_UNUSED(version); + seat->wl_seat = wl_registry_bind(registry, name, &wl_seat_interface, 1); + wl_seat_add_listener(seat->wl_seat, &seat_listener, seat); +} + +void lv_wayland_seat_deinit(lv_wl_seat_t * seat) +{ + if(seat->pointer) { + delete_pointer(seat->pointer); + seat->pointer = NULL; + } + if(seat->keyboard) { + lv_wayland_seat_keyboard_delete(seat->keyboard); + seat->keyboard = NULL; + } + if(seat->touch) { + lv_wayland_seat_touch_delete(seat->touch); + seat->touch = NULL; + } + wl_seat_destroy(seat->wl_seat); +} + +void lv_wayland_update_indevs(lv_indev_read_cb_t read_cb, void * new_driver_data) +{ + lv_indev_t * indev = NULL; + while((indev = lv_indev_get_next(indev))) { + if(lv_indev_get_read_cb(indev) != read_cb) { + continue; + } + lv_indev_set_driver_data(indev, new_driver_data); + } +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_wl_seat_pointer_t * create_pointer(struct wl_seat * wl_seat) +{ + struct wl_surface * surface = wl_compositor_create_surface(lv_wl_ctx.wl_compositor); + if(!surface) { + LV_LOG_WARN("Failed to get surface for pointer"); + return NULL; + } + lv_wl_seat_pointer_t * seat_pointer = lv_wayland_seat_pointer_create(wl_seat, surface); + if(!seat_pointer) { + LV_LOG_WARN("Failed to create seat pointer"); + wl_surface_destroy(surface); + return NULL; + } + return seat_pointer; +} + +static void delete_pointer(lv_wl_seat_pointer_t * seat_pointer) +{ + wl_surface_destroy(seat_pointer->cursor_surface); + lv_wayland_seat_pointer_delete(seat_pointer); +} + +static void seat_handle_capabilities(void * data, struct wl_seat * wl_seat, enum wl_seat_capability caps) +{ + lv_wl_seat_t * seat = (lv_wl_seat_t *) data; + + if((caps & WL_SEAT_CAPABILITY_POINTER) && !seat->pointer) { + seat->pointer = create_pointer(wl_seat); + } + else if(!(caps & WL_SEAT_CAPABILITY_POINTER) && seat->pointer) { + delete_pointer(seat->pointer); + seat->pointer = NULL; + } + + if((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !seat->keyboard) { + seat->keyboard = lv_wayland_seat_keyboard_create(wl_seat); + } + else if(!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && seat->keyboard) { + lv_wayland_seat_keyboard_delete(seat->keyboard); + seat->keyboard = NULL; + } + + if((caps & WL_SEAT_CAPABILITY_TOUCH) && !seat->touch) { + seat->touch = lv_wayland_seat_touch_create(wl_seat); + } + else if(!(caps & WL_SEAT_CAPABILITY_TOUCH) && seat->touch) { + lv_wayland_seat_touch_delete(seat->touch); + seat->touch = NULL; + } +} + +#endif /* LV_USE_WAYLAND */ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_shm_backend.c b/inc/lvgl/src/drivers/wayland/lv_wl_shm_backend.c new file mode 100644 index 0000000..52b3d27 --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_shm_backend.c @@ -0,0 +1,457 @@ +/** + * @file lv_wl_shm_backend.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_wayland_private.h" + +#if LV_WAYLAND_USE_SHM + +#include "../../draw/sw/lv_draw_sw_utils.h" +#include "../../display/lv_display_private.h" +#include +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define LV_WL_SHM_BUF_COUNT 2 + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + struct wl_shm * shm; +} lv_wl_shm_ctx_t; + +typedef struct { + struct wl_buffer * wl_buffer; + bool busy; +} lv_wl_buffer_t; + +typedef struct { + void * mmap_ptr; + size_t mmap_size; + uint8_t * rotated_buf; + struct wl_shm_pool * pool; + lv_wl_buffer_t buffers[LV_WL_SHM_BUF_COUNT]; + size_t curr_wl_buffer_idx; + uint32_t shm_cf; + int fd; + bool delete_on_release; +} lv_wl_shm_display_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * shm_init(void); +static void shm_deinit(void *); +static void * shm_init_display(void * backend_ctx, lv_display_t * display, int32_t width, int32_t height); +static void * shm_resize_display(void * backend_ctx, lv_display_t * display); +static void shm_deinit_display(void * backend_ctx, lv_display_t * display); +static void shm_global_handler(void * backend_ctx, struct wl_registry * registry, uint32_t name, + const char * interface, uint32_t version); + +static int create_shm_file(size_t size); +static void shm_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map); + +static lv_wl_shm_display_data_t * shm_create_display_data(lv_wl_shm_ctx_t * ctx, lv_display_t * display, int32_t width, + int32_t height); +static void shm_delete_display_data(lv_wl_shm_display_data_t * ddata); + +static void frame_done(void * data, struct wl_callback * callback, uint32_t time); +static void buffer_release(void * data, struct wl_buffer * wl_buffer); + +/********************** + * STATIC VARIABLES + **********************/ + +static lv_wl_shm_ctx_t shm_ctx; + +static const struct wl_callback_listener frame_listener = { + .done = frame_done, +}; + +static const struct wl_buffer_listener buffer_listener = { + .release = buffer_release +}; + +const lv_wayland_backend_ops_t wl_backend_ops = { + .init = shm_init, + .deinit = shm_deinit, + .global_handler = shm_global_handler, + .init_display = shm_init_display, + .deinit_display = shm_deinit_display, + .resize_display = shm_resize_display, +}; + + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void buffer_release(void * data, struct wl_buffer * wl_buffer) +{ + lv_wl_shm_display_data_t * ddata = data; + for(size_t i = 0; i < LV_WL_SHM_BUF_COUNT; ++i) { + if(wl_buffer == ddata->buffers[i].wl_buffer) { + ddata->buffers[i].busy = false; + } + } + + if(ddata->delete_on_release) { + shm_delete_display_data(ddata); + } +} + +static void frame_done(void * data, struct wl_callback * callback, uint32_t time) +{ + LV_UNUSED(time); + lv_display_t * display = data; + wl_callback_destroy(callback); + lv_display_flush_ready(display); +} + +static uint32_t lv_cf_to_shm_cf(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + case LV_COLOR_FORMAT_ARGB8888: + return WL_SHM_FORMAT_ARGB8888; + case LV_COLOR_FORMAT_XRGB8888: + return WL_SHM_FORMAT_XRGB8888; + case LV_COLOR_FORMAT_RGB565: + return WL_SHM_FORMAT_RGB565; + default: + return 0; + } +} + +static void * shm_init(void) +{ + lv_memzero(&shm_ctx, sizeof(shm_ctx)); + return &shm_ctx; +} + +static void shm_deinit(void * backend_ctx) +{ + lv_wl_shm_ctx_t * ctx = backend_ctx; + if(ctx->shm) { + wl_shm_destroy(ctx->shm); + } +} + +static lv_wl_shm_display_data_t * shm_create_display_data(lv_wl_shm_ctx_t * ctx, + lv_display_t * display, + int32_t width, + int32_t height) +{ + lv_wl_shm_display_data_t * ddata = lv_zalloc(sizeof(*ddata)); + if(!ddata) { + LV_LOG_ERROR("Failed to allocate data for display"); + return NULL; + } + + const lv_display_rotation_t rotation = lv_display_get_rotation(display); + lv_color_format_t cf = lv_display_get_color_format(display); + ddata->shm_cf = lv_cf_to_shm_cf(cf); + + if(!ddata->shm_cf) { + LV_LOG_WARN("Unsupported color format %d. Falling back to XRGB8888", cf); + cf = LV_COLOR_FORMAT_XRGB8888; + lv_display_set_color_format(display, cf); + ddata->shm_cf = WL_SHM_FORMAT_XRGB8888; + } + + const bool needs_rotation = rotation != LV_DISPLAY_ROTATION_0; + const int32_t phy_width = lv_display_get_original_horizontal_resolution(display); + const int32_t phy_height = lv_display_get_original_vertical_resolution(display); + const uint32_t phy_stride = lv_draw_buf_width_to_stride(phy_width, cf); + const size_t phy_buf_size = phy_stride * phy_height; + + ddata->mmap_size = phy_buf_size * LV_WL_SHM_BUF_COUNT; + + ddata->fd = create_shm_file(ddata->mmap_size); + if(ddata->fd < 0) { + LV_LOG_ERROR("Failed to create shm file"); + goto shm_file_err; + } + + ddata->mmap_ptr = mmap(NULL, ddata->mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, ddata->fd, 0); + if(ddata->mmap_ptr == MAP_FAILED) { + LV_LOG_ERROR("Failed to map shm file: %s", strerror(errno)); + goto mmap_err; + } + + ddata->pool = wl_shm_create_pool(ctx->shm, ddata->fd, ddata->mmap_size); + if(!ddata->pool) { + LV_LOG_ERROR("Failed to create wl_shm_pool"); + goto shm_pool_err; + } + + for(size_t i = 0; i < LV_WL_SHM_BUF_COUNT; ++i) { + size_t offset = i * phy_buf_size; + ddata->buffers[i].wl_buffer = + wl_shm_pool_create_buffer(ddata->pool, offset, phy_width, phy_height, phy_stride, ddata->shm_cf); + + if(!ddata->buffers[i].wl_buffer) { + LV_LOG_ERROR("Failed to create wl_buffer %zu", i); + goto pool_buffer_err; + } + wl_buffer_add_listener(ddata->buffers[i].wl_buffer, &buffer_listener, ddata); + ddata->buffers[i].busy = false; + } + + if(needs_rotation) { + const uint32_t stride = lv_draw_buf_width_to_stride(width, cf); + const size_t buf_size = stride * height; + + ddata->rotated_buf = lv_malloc(buf_size); + LV_ASSERT_MALLOC(ddata->rotated_buf); + if(!ddata->rotated_buf) { + LV_LOG_ERROR("Failed to allocate LVGL render buffer"); + goto rotated_buf_err; + } + + lv_display_set_buffers(display, ddata->rotated_buf, NULL, + buf_size, LV_DISPLAY_RENDER_MODE_DIRECT); + } + else { + lv_display_set_buffers(display, ddata->mmap_ptr, + (uint8_t *)ddata->mmap_ptr + phy_buf_size, + phy_buf_size, LV_DISPLAY_RENDER_MODE_DIRECT); + } + + return ddata; + + lv_free(ddata->rotated_buf); +rotated_buf_err: +pool_buffer_err: + wl_shm_pool_destroy(ddata->pool); +shm_pool_err: + munmap(ddata->mmap_ptr, ddata->mmap_size); +mmap_err: + close(ddata->fd); +shm_file_err: + lv_free(ddata); + return NULL; +} + +static void shm_delete_display_data(lv_wl_shm_display_data_t * ddata) +{ + for(size_t i = 0; i < LV_WL_SHM_BUF_COUNT; ++i) { + lv_wl_buffer_t * buffer = &ddata->buffers[i]; + if(!buffer->wl_buffer) { + continue; + } + if(buffer->busy) { + /* Defer the deletion of this display data until the buffers are released */ + LV_LOG_INFO("Buffer is still busy, deferring deletion to when its released"); + ddata->delete_on_release = true; + return; + } + wl_buffer_destroy(ddata->buffers[i].wl_buffer); + ddata->buffers[i].wl_buffer = NULL; + } + + if(ddata->pool) { + wl_shm_pool_destroy(ddata->pool); + ddata->pool = NULL; + } + + + if(ddata->mmap_ptr != MAP_FAILED) { + munmap(ddata->mmap_ptr, ddata->mmap_size); + ddata->mmap_ptr = MAP_FAILED; + } + + if(ddata->fd >= 0) { + close(ddata->fd); + ddata->fd = -1; + } + if(ddata->rotated_buf) { + lv_free(ddata->rotated_buf); + ddata->rotated_buf = NULL; + } + + LV_LOG_INFO("Deleted buffers and display data"); + lv_free(ddata); +} + +static void flush_wait_cb(lv_display_t * disp) +{ + while(disp->flushing) { + wl_display_dispatch(lv_wl_ctx.wl_display); + } +} + +static void * shm_init_display(void * backend_ctx, lv_display_t * display, int32_t width, int32_t height) +{ + lv_wl_shm_ctx_t * ctx = (lv_wl_shm_ctx_t *)backend_ctx; + if(!ctx->shm) { + LV_LOG_ERROR("wl_shm not available"); + return NULL; + } + + lv_wl_shm_display_data_t * ddata = shm_create_display_data(ctx, display, width, height); + if(!ddata) { + LV_LOG_ERROR("Failed to allocate data for display"); + return NULL; + } + + lv_display_set_flush_cb(display, shm_flush_cb); + lv_display_set_flush_wait_cb(display, flush_wait_cb); + + return ddata; +} + +static void * shm_resize_display(void * backend_ctx, lv_display_t * display) +{ + lv_wl_shm_ctx_t * ctx = (lv_wl_shm_ctx_t *)backend_ctx; + + const int32_t new_width = lv_display_get_horizontal_resolution(display); + const int32_t new_height = lv_display_get_vertical_resolution(display); + + lv_wl_shm_display_data_t * ddata = shm_create_display_data(ctx, display, new_width, new_height); + + if(!ddata) { + LV_LOG_ERROR("Failed to allocate data for new display resolution"); + return NULL; + } + + lv_wl_shm_display_data_t * curr_ddata = lv_wayland_get_backend_display_data(display); + shm_delete_display_data(curr_ddata); + return ddata; +} + + +static void shm_deinit_display(void * backend_ctx, lv_display_t * display) +{ + LV_UNUSED(backend_ctx); + lv_wl_shm_display_data_t * ddata = lv_wayland_get_backend_display_data(display); + if(!ddata) { + return; + } + shm_delete_display_data(ddata); +} + +static int create_shm_file(size_t size) +{ + int fd = -1; + char name[255]; + snprintf(name, sizeof(name), "/lvgl-wayland-%d-%ld", getpid(), (long)lv_tick_get()); + + fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600); + if(fd < 0) { + LV_LOG_ERROR("shm_open failed: %s", strerror(errno)); + return -1; + } + + shm_unlink(name); + + if(ftruncate(fd, size) < 0) { + LV_LOG_ERROR("ftruncate failed: %s", strerror(errno)); + close(fd); + return -1; + } + return fd; +} + +static void shm_global_handler(void * backend_ctx, struct wl_registry * registry, uint32_t name, + const char * interface, uint32_t version) +{ + LV_UNUSED(version); + lv_wl_shm_ctx_t * ctx = (lv_wl_shm_ctx_t *)backend_ctx; + + if(lv_streq(interface, wl_shm_interface.name)) { + ctx->shm = wl_registry_bind(registry, name, &wl_shm_interface, 1); + } +} +static void shm_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + lv_wl_shm_display_data_t * ddata = lv_wayland_get_backend_display_data(disp); + struct wl_surface * surface = lv_wayland_get_window_surface(disp); + if(!surface) { + lv_display_flush_ready(disp); + return; + } + + const lv_display_rotation_t rotation = lv_display_get_rotation(disp); + const lv_color_format_t cf = lv_display_get_color_format(disp); + + /* When using ARGB8888, the compositor expects premultiplied ARGB8888 so premultiply it here*/ + if(ddata->shm_cf == WL_SHM_FORMAT_ARGB8888 && cf != LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED) { + const int32_t w = lv_area_get_width(area); + const int32_t h = lv_area_get_height(area); + size_t index = 0; + for(int32_t y = 0; y < h; ++y) { + for(int32_t x = 0; x < w; ++x) { + lv_color_premultiply((lv_color32_t *) px_map + (index++)); + } + } + } + + /* If we have rotation, copy from rotated_buf to Wayland buffer */ + if(rotation != LV_DISPLAY_ROTATION_0) { + const int32_t hor_res = lv_display_get_horizontal_resolution(disp); + const int32_t ver_res = lv_display_get_vertical_resolution(disp); + const uint32_t src_stride = lv_draw_buf_width_to_stride(hor_res, cf); + + const int32_t phy_width = lv_display_get_original_horizontal_resolution(disp); + const int32_t phy_height = lv_display_get_original_vertical_resolution(disp); + const uint32_t dest_stride = lv_draw_buf_width_to_stride(phy_width, cf); + + size_t buf_size = dest_stride * phy_height; + uint8_t * wl_buf = (uint8_t *)ddata->mmap_ptr + (ddata->curr_wl_buffer_idx * buf_size); + + lv_draw_sw_rotate(ddata->rotated_buf, wl_buf, hor_res, ver_res, + src_stride, dest_stride, rotation, cf); + + wl_surface_damage(surface, 0, 0, phy_width, phy_height); + } + else { + const int32_t w = lv_area_get_width(area); + const int32_t h = lv_area_get_height(area); + wl_surface_damage(surface, area->x1, area->y1, w, h); + } + + if(!lv_display_flush_is_last(disp)) { + lv_display_flush_ready(disp); + return; + } + + lv_wl_buffer_t * buffer = &ddata->buffers[ddata->curr_wl_buffer_idx]; + if(buffer->busy) { + LV_LOG_WARN("Failed to acquire a non-busy buffer"); + } + + struct wl_callback * callback = wl_surface_frame(surface); + wl_callback_add_listener(callback, &frame_listener, disp); + + wl_surface_attach(surface, buffer->wl_buffer, 0, 0); + wl_surface_commit(surface); + + buffer->busy = true; + ddata->curr_wl_buffer_idx = (ddata->curr_wl_buffer_idx + 1) % LV_WL_SHM_BUF_COUNT; +} + +#endif /*LV_WAYLAND_USE_SHM*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_touch.c b/inc/lvgl/src/drivers/wayland/lv_wl_touch.c new file mode 100644 index 0000000..490bcf2 --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_touch.c @@ -0,0 +1,263 @@ +/** + * @file lv_wl_touch.c + * + */ + +#include "lv_wl_touch.h" + +#if LV_USE_WAYLAND + +#include "lv_wayland_private.h" + +#include +#include + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void touch_read(lv_indev_t * drv, lv_indev_data_t * data); + +static void touch_handle_down(void * data, struct wl_touch * wl_touch, uint32_t serial, uint32_t time, + struct wl_surface * surface, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w); + +static void touch_handle_up(void * data, struct wl_touch * wl_touch, uint32_t serial, uint32_t time, int32_t id); + +static void touch_handle_motion(void * data, struct wl_touch * wl_touch, uint32_t time, int32_t id, wl_fixed_t x_w, + wl_fixed_t y_w); + +static void touch_handle_frame(void * data, struct wl_touch * wl_touch); + +static void touch_handle_cancel(void * data, struct wl_touch * wl_touch); + +/********************** + * STATIC VARIABLES + **********************/ + +static const struct wl_touch_listener touch_listener = { + .down = touch_handle_down, + .up = touch_handle_up, + .motion = touch_handle_motion, + .frame = touch_handle_frame, + .cancel = touch_handle_cancel, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_wayland_touch_create(void) +{ + + lv_indev_t * indev = lv_indev_create(); + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, touch_read); + lv_indev_set_driver_data(indev, lv_wl_ctx.seat.touch); + + return indev; +} + +lv_indev_t * lv_wayland_get_touchscreen(lv_display_t * display) +{ + lv_wl_window_t * window = lv_display_get_driver_data(display); + if(!window) { + return NULL; + } + return window->lv_indev_touch; +} + +/********************** + * PRIVATE FUNCTIONS + **********************/ + +lv_wl_seat_touch_t * lv_wayland_seat_touch_create(struct wl_seat * seat) +{ + + struct wl_touch * touch = wl_seat_get_touch(seat); + if(!touch) { + LV_LOG_WARN("Failed to get seat touch"); + return NULL; + } + lv_wl_seat_touch_t * wl_seat_touch = lv_zalloc(sizeof(*wl_seat_touch)); + LV_ASSERT_MALLOC(wl_seat_touch); + if(!wl_seat_touch) { + LV_LOG_WARN("Failed to allocate memory for wayland touch"); + wl_touch_destroy(touch); + return NULL; + } + wl_touch_add_listener(touch, &touch_listener, NULL); + wl_touch_set_user_data(touch, wl_seat_touch); + + wl_seat_touch->wl_touch = touch; + lv_wayland_update_indevs(touch_read, wl_seat_touch); + + return wl_seat_touch; +} +void lv_wayland_seat_touch_delete(lv_wl_seat_touch_t * seat_touch) +{ + lv_wayland_update_indevs(touch_read, NULL); + wl_touch_destroy(seat_touch->wl_touch); + lv_free(seat_touch); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void touch_read(lv_indev_t * indev, lv_indev_data_t * data) +{ + + lv_wl_seat_touch_t * tdata = lv_indev_get_driver_data(indev); + + if(!tdata) { + return; + } +#if LV_USE_GESTURE_RECOGNITION + /* Collect touches if there are any - send them to the gesture recognizer */ + lv_indev_gesture_recognizers_update(indev, tdata->touches, tdata->event_cnt); + + LV_LOG_TRACE("collected touch events: %d", tdata->event_cnt); + + if(tdata->event_cnt > 0) { + data->point = tdata->touches[0].point; + } + else { + data->point.x = data->point.y = 0; + } + + tdata->event_cnt = 0; + + /* Set the gesture information, before returning to LVGL */ + lv_indev_gesture_recognizers_set_data(indev, data); + +#else + data->point = tdata->point; + data->state = tdata->state; +#endif +} + +static void touch_handle_down(void * data, struct wl_touch * wl_touch, uint32_t serial, uint32_t time, + struct wl_surface * surface, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w) +{ + LV_UNUSED(data); + LV_UNUSED(id); + LV_UNUSED(time); + LV_UNUSED(serial); + + lv_wl_seat_touch_t * tdata = wl_touch_get_user_data(wl_touch); + + if(!surface) { + return; + } + +#if LV_USE_GESTURE_RECOGNITION + uint8_t i = tdata->event_cnt; + + tdata->touches[i].point.x = wl_fixed_to_int(x_w); + tdata->touches[i].point.y = wl_fixed_to_int(y_w); + tdata->touches[i].id = id; + tdata->touches[i].timestamp = time; + tdata->touches[i].state = LV_INDEV_STATE_PRESSED; + tdata->event_cnt++; +#else + tdata->point.x = wl_fixed_to_int(x_w); + tdata->point.y = wl_fixed_to_int(y_w); + tdata->state = LV_INDEV_STATE_PRESSED; +#endif +} + +static void touch_handle_up(void * data, struct wl_touch * wl_touch, uint32_t serial, uint32_t time, int32_t id) +{ + LV_UNUSED(serial); + LV_UNUSED(time); + LV_UNUSED(id); + LV_UNUSED(data); + lv_wl_seat_touch_t * tdata = wl_touch_get_user_data(wl_touch); + + /* Create a released event */ +#if LV_USE_GESTURE_RECOGNITION + uint8_t i = tdata->event_cnt; + + tdata->touches[i].point.x = 0; + tdata->touches[i].point.y = 0; + tdata->touches[i].id = id; + tdata->touches[i].timestamp = time; + tdata->touches[i].state = LV_INDEV_STATE_RELEASED; + + tdata->event_cnt++; +#else + tdata->state = LV_INDEV_STATE_RELEASED; +#endif +} + +static void touch_handle_motion(void * data, struct wl_touch * wl_touch, uint32_t time, int32_t id, wl_fixed_t x_w, + wl_fixed_t y_w) +{ + + LV_UNUSED(id); + LV_UNUSED(time); + LV_UNUSED(data); + lv_wl_seat_touch_t * tdata = wl_touch_get_user_data(wl_touch); + +#if LV_USE_GESTURE_RECOGNITION + /* Update the contact point of the corresponding id with the latest coordinate */ + lv_indev_touch_data_t * touch = &tdata->touches[0]; + lv_indev_touch_data_t * cur = NULL; + + for(uint8_t i = 0; i < tdata->event_cnt; i++) { + if(touch->id == id) { + cur = touch; + } + touch++; + } + + if(cur == NULL) { + uint8_t i = tdata->event_cnt; + tdata->touches[i].point.x = wl_fixed_to_int(x_w); + tdata->touches[i].point.y = wl_fixed_to_int(y_w); + tdata->touches[i].id = id; + tdata->touches[i].timestamp = time; + tdata->touches[i].state = LV_INDEV_STATE_PRESSED; + tdata->event_cnt++; + } + else { + cur->point.x = wl_fixed_to_int(x_w); + cur->point.y = wl_fixed_to_int(y_w); + cur->id = id; + cur->timestamp = time; + } +#else + tdata->point.x = wl_fixed_to_int(x_w); + tdata->point.y = wl_fixed_to_int(y_w); +#endif +} + +static void touch_handle_frame(void * data, struct wl_touch * wl_touch) +{ + LV_UNUSED(wl_touch); + LV_UNUSED(data); +} + +static void touch_handle_cancel(void * data, struct wl_touch * wl_touch) +{ + LV_UNUSED(wl_touch); + LV_UNUSED(data); +} + +#endif /* LV_USE_WAYLAND */ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_touch.h b/inc/lvgl/src/drivers/wayland/lv_wl_touch.h new file mode 100644 index 0000000..2c4a742 --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_touch.h @@ -0,0 +1,54 @@ + + +/** + * @file lv_wl_touch.h + * + */ + +#ifndef LV_WL_TOUCH_H +#define LV_WL_TOUCH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_gesture.h" +#if LV_USE_WAYLAND + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_indev_t * lv_wayland_touch_create(void); + +/** + * Get touchscreen input device for given LVGL display + * @param display LVGL display + * @return input device connected to touchscreen, or NULL on error + */ +lv_indev_t * lv_wayland_get_touchscreen(lv_display_t * display); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_WAYLAND */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WL_TOUCH_H*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_window.c b/inc/lvgl/src/drivers/wayland/lv_wl_window.c new file mode 100644 index 0000000..fcd204b --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_window.c @@ -0,0 +1,344 @@ +/** + * @file lv_wl_window.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_wl_window.h" + +#if LV_USE_WAYLAND + +#include "../../lv_init.h" +#include +#include +#include +#include "lv_wayland_private.h" +#include "lv_wayland_private.h" +#include "lv_wl_pointer.h" +#include "lv_wl_pointer_axis.h" +#include "lv_wl_touch.h" +#include "lv_wl_keyboard.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void refr_start_event(lv_event_t * e); +static void refr_end_event(lv_event_t * e); +static void res_changed_event(lv_event_t * e); +static void delete_event(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_wayland_window_create(uint32_t hor_res, uint32_t ver_res, char * title, + lv_wayland_display_close_cb_t close_cb) +{ + lv_wayland_init(); + if(close_cb) { + LV_LOG_WARN("'lv_wayland_display_close_cb_t' is deprecated and will be removed in the next release. Instead bind an LV_EVENT_DELETE to the display\ + Bind an LV_EVENT_DELETE to the display returned by `lv_wayland_window_create` instead."); + } + + lv_wl_window_t * window = lv_ll_ins_tail(&lv_wl_ctx.window_ll); + LV_ASSERT_MALLOC(window); + if(!window) { + LV_LOG_ERROR("Failed to allocate memory fo window"); + goto alloc_window_err; + } + + lv_memset(window, 0, sizeof(*window)); + + window->close_cb = close_cb; + + window->lv_disp = lv_display_create(hor_res, ver_res); + if(!window->lv_disp) { + LV_LOG_ERROR("failed to create lvgl display"); + goto create_display_error; + } + + window->body = wl_compositor_create_surface(lv_wl_ctx.wl_compositor); + if(!window->body) { + LV_LOG_ERROR("Failed to create window body"); + goto create_surface_err; + } + + if(lv_wl_xdg_create_window(lv_wl_ctx.xdg_wm, window, title) != LV_RESULT_OK) { + LV_LOG_ERROR("Failed to create window"); + goto create_window_err; + } + + lv_display_set_driver_data(window->lv_disp, window); + + /* Initialize display driver */ + window->backend_display_data = wl_backend_ops.init_display(lv_wl_ctx.backend_data, window->lv_disp, hor_res, ver_res); + + lv_wayland_xdg_configure_surface(window); + + lv_display_add_event_cb(window->lv_disp, res_changed_event, LV_EVENT_RESOLUTION_CHANGED, NULL); + lv_display_add_event_cb(window->lv_disp, refr_start_event, LV_EVENT_REFR_START, NULL); + lv_display_add_event_cb(window->lv_disp, refr_end_event, LV_EVENT_REFR_READY, NULL); + lv_display_add_event_cb(window->lv_disp, delete_event, LV_EVENT_DELETE, NULL); + + /* Register input */ + window->lv_indev_pointer = lv_wayland_pointer_create(); + lv_indev_set_display(window->lv_indev_pointer, window->lv_disp); + + if(!window->lv_indev_pointer) { + LV_LOG_ERROR("failed to register pointer indev"); + } + + window->lv_indev_pointeraxis = lv_wayland_pointer_axis_create(); + lv_indev_set_display(window->lv_indev_pointeraxis, window->lv_disp); + + if(!window->lv_indev_pointeraxis) { + LV_LOG_ERROR("failed to register pointeraxis indev"); + } + + window->lv_indev_touch = lv_wayland_touch_create(); + lv_indev_set_display(window->lv_indev_touch, window->lv_disp); + + if(!window->lv_indev_touch) { + LV_LOG_ERROR("failed to register touch indev"); + } + + window->lv_indev_keyboard = lv_wayland_keyboard_create(); + lv_indev_set_display(window->lv_indev_keyboard, window->lv_disp); + + if(!window->lv_indev_keyboard) { + LV_LOG_ERROR("failed to register keyboard indev"); + } + return window->lv_disp; + +create_window_err: + wl_surface_destroy(window->body); +create_surface_err: + lv_display_delete(window->lv_disp); +create_display_error: + lv_ll_remove(&lv_wl_ctx.window_ll, window); + lv_free(window); +alloc_window_err: + return NULL; +} + +void * lv_wayland_get_backend_display_data(lv_display_t * display) +{ + LV_ASSERT_NULL(display); + lv_wl_window_t * window = lv_display_get_driver_data(display); + LV_ASSERT_NULL(window); + return window->backend_display_data; +} + +void lv_wayland_set_backend_display_data(lv_display_t * display, void * data) +{ + LV_ASSERT_NULL(display); + lv_wl_window_t * window = lv_display_get_driver_data(display); + LV_ASSERT_NULL(window); + window->backend_display_data = data; +} + +struct wl_surface * lv_wayland_get_window_surface(lv_display_t * display) +{ + LV_ASSERT_NULL(display); + lv_wl_window_t * window = lv_display_get_driver_data(display); + LV_ASSERT_NULL(window); + return window->body; +} + +void lv_wayland_window_close(lv_display_t * display) +{ + LV_ASSERT_NULL(display); + lv_wl_window_t * window = lv_display_get_driver_data(display); + if(!window) { + return; + } + window->close_cb = NULL; + lv_wayland_window_delete(window); + lv_wayland_deinit(); +} + +bool lv_wayland_window_is_open(lv_display_t * disp) +{ + LV_UNUSED(disp); + return true; +} + +void lv_wayland_window_set_maximized(lv_display_t * disp, bool maximized) +{ + lv_wl_window_t * window = lv_display_get_driver_data(disp); + if(!window) { + return; + } + if(window->maximized != maximized) { + lv_wayland_xdg_set_maximized(&window->xdg, maximized); + } + + window->maximized = maximized; +} +void lv_wayland_window_set_minimized(lv_display_t * disp) +{ + lv_wl_window_t * window = lv_display_get_driver_data(disp); + if(!window) { + return; + } + lv_wayland_xdg_set_minimized(&window->xdg); +} + +void lv_wayland_assign_physical_display(lv_display_t * disp, uint8_t display_number) +{ + if(!disp) { + LV_LOG_ERROR("Invalid display"); + return; + } + + lv_wl_window_t * window = lv_display_get_driver_data(disp); + + if(!window) { + LV_LOG_ERROR("Invalid window"); + return; + } + + if(display_number >= lv_wl_ctx.wl_output_count) { + LV_LOG_WARN("Invalid display number '%d'. Expected '0'..'%d'", display_number, lv_wl_ctx.wl_output_count - 1); + return; + } + window->physical_output = lv_wl_ctx.physical_outputs[display_number].wl_output; +} + +void lv_wayland_unassign_physical_display(lv_display_t * disp) +{ + + if(!disp) { + LV_LOG_ERROR("Invalid display"); + return; + } + + lv_wl_window_t * window = lv_display_get_user_data(disp); + if(!window) { + LV_LOG_ERROR("Invalid window"); + return; + } + window->physical_output = NULL; +} + +void lv_wayland_window_set_fullscreen(lv_display_t * disp, bool fullscreen) +{ + lv_wl_window_t * window = lv_display_get_driver_data(disp); + if(!window) { + return; + } + + if(window->fullscreen == fullscreen) { + return; + } + lv_wayland_xdg_set_fullscreen(&window->xdg, fullscreen, window->physical_output); + window->fullscreen = fullscreen; +} + +/********************** + * PRIVATE FUNCTIONS + **********************/ + +int32_t lv_wayland_window_get_width(lv_wl_window_t * window) +{ + return lv_display_get_horizontal_resolution(window->lv_disp); +} +int32_t lv_wayland_window_get_height(lv_wl_window_t * window) +{ + return lv_display_get_vertical_resolution(window->lv_disp); +} + +void lv_wayland_window_delete(lv_wl_window_t * window) +{ + if(!window) { + return; + } + + if(window->close_cb) { + window->close_cb(window->lv_disp); + } + lv_wayland_xdg_delete_window(&window->xdg); + + /* Commit a NULL buffer to the body surface so that we release buffers*/ + wl_surface_attach(window->body, NULL, 0, 0); + wl_surface_commit(window->body); + wl_display_roundtrip(lv_wl_ctx.wl_display); + + wl_surface_destroy(window->body); + window->body = NULL; + + /* Make sure buffer is correctly released*/ + wl_display_roundtrip(lv_wl_ctx.wl_display); + + wl_backend_ops.deinit_display(window->backend_display_data, window->lv_disp); + window->backend_display_data = NULL; + + /* Set the driver data to NULL before calling display delete + * so that the delete event doesn't do anything*/ + lv_display_set_driver_data(window->lv_disp, NULL); + lv_display_delete(window->lv_disp); + + + lv_ll_remove(&lv_wl_ctx.window_ll, window); + + if(LV_WAYLAND_DIRECT_EXIT && lv_ll_is_empty(&lv_wl_ctx.window_ll)) { + /* lv_deinit will deinit the wayland driver*/ + lv_deinit(); + exit(0); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void delete_event(lv_event_t * e) +{ + lv_display_t * display = lv_event_get_target(e); + lv_wl_window_t * window = lv_display_get_driver_data(display); + lv_wayland_window_delete(window); +} + +static void refr_start_event(lv_event_t * e) +{ + lv_display_t * display = lv_event_get_target(e); + lv_wl_window_t * window = lv_display_get_driver_data(display); + + if(lv_wayland_xdg_is_resize_pending(window)) { + lv_wayland_xdg_resize(window); + } +} + +static void refr_end_event(lv_event_t * e) +{ + LV_UNUSED(e); + lv_wayland_flush(); +} + +static void res_changed_event(lv_event_t * e) +{ + lv_display_t * display = (lv_display_t *) lv_event_get_target(e); + lv_wl_window_t * window = lv_display_get_driver_data(display); + window->backend_display_data = wl_backend_ops.resize_display(lv_wl_ctx.backend_data, display); +} + +#endif /* LV_USE_WAYLAND */ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_window.h b/inc/lvgl/src/drivers/wayland/lv_wl_window.h new file mode 100644 index 0000000..d41ead1 --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_window.h @@ -0,0 +1,104 @@ + +/** + * @file lv_wl_window.h + * + */ + +#ifndef LV_WL_WINDOW_H +#define LV_WL_WINDOW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" + +#if LV_USE_WAYLAND + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef bool (*lv_wayland_display_close_cb_t)(lv_display_t * disp); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Creates a window + * @param hor_res The width of the window in pixels + * @param ver_res The height of the window in pixels + * @param title The title of the window + * @param close_cb The callback that will be execute when the user closes the window + * @return The LVGL display associated to the window + */ +lv_display_t * lv_wayland_window_create(uint32_t hor_res, uint32_t ver_res, char * title, + lv_wayland_display_close_cb_t close_cb); + +/** + * Closes the window programmatically + * @param disp Reference to the LVGL display associated to the window + */ +void lv_wayland_window_close(lv_display_t * disp); + +/** + * Check if the window is open + * @param disp Reference to the LVGL display associated to the window + * @return true: The window is open + */ +bool lv_wayland_window_is_open(lv_display_t * disp); + +/** + * Assigns the window to a specific physical display + * @param disp Reference to the LVGL display associated to the window + * @param display Physical display number + */ +void lv_wayland_assign_physical_display(lv_display_t * disp, uint8_t display); + +/** + * Unassigns the current physical display attached to the window + * @param disp Reference to the LVGL display associated to the window + */ +void lv_wayland_unassign_physical_display(lv_display_t * disp); + +/** + * Sets the fullscreen state of the window + * @param disp Reference to the LVGL display associated to the window + * @param fullscreen If true the window enters fullscreen + */ + +void lv_wayland_window_set_fullscreen(lv_display_t * disp, bool fullscreen); + +/** + * Sets the maximized state of the window + * @param disp Reference to the LVGL display associated to the window + * @param fullscreen If true the window is maximized + */ +void lv_wayland_window_set_maximized(lv_display_t * disp, bool maximize); + +/** + * Minimizes the window + * @param disp Reference to the LVGL display associated to the window + */ +void lv_wayland_window_set_minimized(lv_display_t * disp); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_WAYLAND */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WL_WINDOW_H*/ diff --git a/inc/lvgl/src/drivers/wayland/lv_wl_xdg_shell.c b/inc/lvgl/src/drivers/wayland/lv_wl_xdg_shell.c new file mode 100644 index 0000000..c395a7a --- /dev/null +++ b/inc/lvgl/src/drivers/wayland/lv_wl_xdg_shell.c @@ -0,0 +1,249 @@ +/** + * @file lv_wl_xdg_shell.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_wayland_private.h" + +#if LV_USE_WAYLAND + +#include +#include "wayland_xdg_shell.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void xdg_surface_handle_configure(void * data, struct xdg_surface * xdg_surface, uint32_t serial); +static void xdg_toplevel_handle_configure(void * data, struct xdg_toplevel * xdg_toplevel, int32_t width, + int32_t height, struct wl_array * states); +static void xdg_toplevel_handle_close(void * data, struct xdg_toplevel * xdg_toplevel); +static void xdg_wm_base_ping(void * data, struct xdg_wm_base * xdg_wm_base, uint32_t serial); + +/********************** + * STATIC VARIABLES + **********************/ + +static const struct xdg_surface_listener xdg_surface_listener = { + .configure = xdg_surface_handle_configure, +}; + +static const struct xdg_toplevel_listener xdg_toplevel_listener = { + .configure = xdg_toplevel_handle_configure, + .close = xdg_toplevel_handle_close, +}; + +static const struct xdg_wm_base_listener xdg_wm_base_listener = {.ping = xdg_wm_base_ping}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * PRIVATE FUNCTIONS + **********************/ + +/********************** + * Shell + **********************/ + +void lv_wayland_xdg_deinit(void) +{ + if(lv_wl_ctx.xdg_wm) { + xdg_wm_base_destroy(lv_wl_ctx.xdg_wm); + } +} + +/********************** + * Listeners + **********************/ + +const struct xdg_wm_base_listener * lv_wayland_xdg_get_wm_base_listener(void) +{ + return &xdg_wm_base_listener; +} + +/********************** + * Shell Window + **********************/ + +void lv_wayland_xdg_set_fullscreen(lv_wl_window_xdg_t * xdg, bool fullscreen, + struct wl_output * output) +{ + LV_ASSERT_NULL(xdg); + LV_ASSERT_NULL(xdg->xdg_toplevel); + if(fullscreen) { + xdg_toplevel_set_fullscreen(xdg->xdg_toplevel, output); + } + else { + xdg_toplevel_unset_fullscreen(xdg->xdg_toplevel); + } +} + +void lv_wayland_xdg_set_maximized(lv_wl_window_xdg_t * xdg, bool maximized) +{ + LV_ASSERT_NULL(xdg); + LV_ASSERT_NULL(xdg->xdg_toplevel); + if(maximized) { + xdg_toplevel_set_maximized(xdg->xdg_toplevel); + } + else { + xdg_toplevel_unset_maximized(xdg->xdg_toplevel); + } +} + +void lv_wayland_xdg_set_minimized(lv_wl_window_xdg_t * xdg) +{ + LV_ASSERT_NULL(xdg); + LV_ASSERT_NULL(xdg->xdg_toplevel); + xdg_toplevel_set_minimized(xdg->xdg_toplevel); +} + +lv_result_t lv_wl_xdg_create_window(struct xdg_wm_base * xdg_wm, lv_wl_window_t * window, const char * title) +{ + LV_ASSERT_NULL(xdg_wm); + + window->xdg.xdg_surface = xdg_wm_base_get_xdg_surface(xdg_wm, window->body); + if(!window->xdg.xdg_surface) { + LV_LOG_ERROR("Failed to create XDG surface"); + return LV_RESULT_INVALID; + } + + window->xdg.xdg_toplevel = xdg_surface_get_toplevel(window->xdg.xdg_surface); + if(!window->xdg.xdg_toplevel) { + xdg_surface_destroy(window->xdg.xdg_surface); + window->xdg.xdg_surface = NULL; + LV_LOG_ERROR("Failed to acquire XDG toplevel surface"); + return LV_RESULT_INVALID; + } + xdg_surface_add_listener(window->xdg.xdg_surface, &xdg_surface_listener, window); + xdg_toplevel_add_listener(window->xdg.xdg_toplevel, &xdg_toplevel_listener, window); + xdg_toplevel_set_title(window->xdg.xdg_toplevel, title); + xdg_toplevel_set_app_id(window->xdg.xdg_toplevel, title); + return LV_RESULT_OK; +} + +void lv_wayland_xdg_configure_surface(lv_wl_window_t * window) +{ + /* XDG surfaces need to be configured before a buffer can be attached. + * An (XDG) surface commit (without an attached buffer) triggers this + * configure event */ + wl_surface_commit(window->body); + wl_display_roundtrip(lv_wl_ctx.wl_display); + LV_ASSERT_MSG(window->resize_event.pending, "Failed to receive the xdg_surface configuration event"); +} +bool lv_wayland_xdg_is_resize_pending(lv_wl_window_t * window) +{ + return window->resize_event.pending; +} + +void lv_wayland_xdg_resize(lv_wl_window_t * window) +{ + if(!window->resize_event.pending) { + return; + } + + + lv_display_set_resolution(window->lv_disp, + window->resize_event.width, + window->resize_event.height); + xdg_surface_ack_configure(window->resize_event.xdg_surface, window->resize_event.serial); + window->resize_event.pending = false; + window->xdg.configured = true; +} + +void lv_wayland_xdg_delete_window(lv_wl_window_xdg_t * xdg) +{ + if(xdg->xdg_toplevel) { + xdg_toplevel_destroy(xdg->xdg_toplevel); + } + if(xdg->xdg_surface) { + xdg_surface_destroy(xdg->xdg_surface); + } + xdg->xdg_surface = NULL; + xdg->xdg_toplevel = NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + + +static void xdg_surface_handle_configure(void * data, struct xdg_surface * xdg_surface, uint32_t serial) +{ + lv_wl_window_t * window = (lv_wl_window_t *)data; + + if(!window->resize_event.requested) { + LV_LOG_TRACE("resize event not requested. ignoring it"); + window->xdg.configured = true; + xdg_surface_ack_configure(xdg_surface, serial); + return; + } + + LV_LOG_TRACE("resize event requested and now pending"); + window->resize_event.pending = true; + window->resize_event.requested = false; + window->resize_event.xdg_surface = xdg_surface; + window->resize_event.serial = serial; +} + +static void xdg_toplevel_handle_configure(void * data, struct xdg_toplevel * xdg_toplevel, int32_t width, + int32_t height, struct wl_array * states) +{ + lv_wl_window_t * window = (lv_wl_window_t *)data; + + LV_UNUSED(xdg_toplevel); + LV_UNUSED(states); + LV_LOG_TRACE("XDG toplevel configure: w=%d h=%d (current: %dx%d)", + width, height, lv_wayland_window_get_width(window), lv_wayland_window_get_height(window)); + + if((width < 0) || (height < 0)) { + LV_LOG_TRACE("will not resize to w:%d h:%d", width, height); + return; + } + + window->xdg.configured = false; + /* Width and height are already ok, don't resize*/ + if(width == lv_wayland_window_get_width(window) && + height == lv_wayland_window_get_height(window)) { + LV_LOG_TRACE("Window's size is already correct. Ignore resize request"); + return; + } + window->resize_event.requested = true; + window->resize_event.width = width ? width : lv_display_get_horizontal_resolution(window->lv_disp); + window->resize_event.height = height ? height : lv_display_get_vertical_resolution(window->lv_disp); +} + +static void xdg_toplevel_handle_close(void * data, struct xdg_toplevel * xdg_toplevel) +{ + LV_UNUSED(xdg_toplevel); + lv_wl_window_t * window = (lv_wl_window_t *)data; + lv_wayland_window_delete(window); +} + +static void xdg_wm_base_ping(void * data, struct xdg_wm_base * xdg_wm_base, uint32_t serial) +{ + LV_UNUSED(data); + + xdg_wm_base_pong(xdg_wm_base, serial); + + return; +} + +#endif /* LV_USE_WAYLAND */ diff --git a/inc/lvgl/src/drivers/windows/lv_windows_context.c b/inc/lvgl/src/drivers/windows/lv_windows_context.c new file mode 100644 index 0000000..dd2d6a5 --- /dev/null +++ b/inc/lvgl/src/drivers/windows/lv_windows_context.c @@ -0,0 +1,721 @@ +/** + * @file lv_windows_context.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_windows_context.h" +#if LV_USE_WINDOWS + +#ifdef __GNUC__ + #pragma GCC diagnostic ignored "-Wcast-function-type" +#endif + +#include "lv_windows_display.h" +#include "lv_windows_input_private.h" +#include "../../osal/lv_os_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t lv_windows_tick_count_callback(void); + +static void lv_windows_delay_callback(uint32_t ms); + +static void lv_windows_check_display_existence_timer_callback( + lv_timer_t * timer); + +static bool lv_windows_window_message_callback_nolock( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult); + +static LRESULT CALLBACK lv_windows_window_message_callback( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_windows_platform_init(void) +{ + lv_tick_set_cb(lv_windows_tick_count_callback); + + lv_delay_set_cb(lv_windows_delay_callback); + + lv_timer_create( + lv_windows_check_display_existence_timer_callback, + 200, + NULL); + + // Try to ensure the default group exists. + { + lv_group_t * default_group = lv_group_get_default(); + if(!default_group) { + default_group = lv_group_create(); + if(default_group) { + lv_group_set_default(default_group); + } + } + } + + WNDCLASSEXW window_class; + lv_memzero(&window_class, sizeof(WNDCLASSEXW)); + window_class.cbSize = sizeof(WNDCLASSEXW); + window_class.style = 0; + window_class.lpfnWndProc = lv_windows_window_message_callback; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = NULL; + window_class.hIcon = NULL; + window_class.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW); + window_class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + window_class.lpszMenuName = NULL; + window_class.lpszClassName = L"LVGL.Window"; + window_class.hIconSm = NULL; + LV_ASSERT(RegisterClassExW(&window_class)); +} + +lv_windows_window_context_t * lv_windows_get_window_context( + HWND window_handle) +{ + return (lv_windows_window_context_t *)( + GetPropW(window_handle, L"LVGL.Window.Context")); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t lv_windows_tick_count_callback(void) +{ + LARGE_INTEGER Frequency; + if(QueryPerformanceFrequency(&Frequency)) { + LARGE_INTEGER PerformanceCount; + if(QueryPerformanceCounter(&PerformanceCount)) { + return (uint32_t)(PerformanceCount.QuadPart * 1000 / Frequency.QuadPart); + } + } + + return (uint32_t)GetTickCount64(); +} + +static void lv_windows_delay_callback(uint32_t ms) +{ + HANDLE timer_handle = CreateWaitableTimerExW( + NULL, + NULL, + CREATE_WAITABLE_TIMER_MANUAL_RESET | + CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, + TIMER_ALL_ACCESS); + if(timer_handle) { + LARGE_INTEGER due_time; + due_time.QuadPart = -((int64_t)ms) * 1000 * 10; + SetWaitableTimer(timer_handle, &due_time, 0, NULL, NULL, FALSE); + WaitForSingleObject(timer_handle, INFINITE); + + CloseHandle(timer_handle); + } +} + +static void lv_windows_check_display_existence_timer_callback( + lv_timer_t * timer) +{ + LV_UNUSED(timer); + if(!lv_display_get_next(NULL)) { + // Don't use lv_deinit() due to it will cause exception when parallel + // rendering is enabled. + exit(0); + } +} + +static HDC lv_windows_create_frame_buffer( + HWND window_handle, + LONG width, + LONG height, + UINT32 ** pixel_buffer, + SIZE_T * pixel_buffer_size) +{ + HDC frame_buffer_dc_handle = NULL; + + LV_ASSERT_NULL(pixel_buffer); + LV_ASSERT_NULL(pixel_buffer_size); + + HDC window_dc_handle = GetDC(window_handle); + if(window_dc_handle) { + frame_buffer_dc_handle = CreateCompatibleDC(window_dc_handle); + ReleaseDC(window_handle, window_dc_handle); + } + + if(frame_buffer_dc_handle) { +#if (LV_COLOR_DEPTH == 32) || (LV_COLOR_DEPTH == 24) + BITMAPINFO bitmap_info = { 0 }; +#elif (LV_COLOR_DEPTH == 16) + typedef struct _BITMAPINFO_16BPP { + BITMAPINFOHEADER bmiHeader; + DWORD bmiColorMask[3]; + } BITMAPINFO_16BPP; + + BITMAPINFO_16BPP bitmap_info = { 0 }; +#else +#error [lv_windows] Unsupported LV_COLOR_DEPTH. +#endif + + bitmap_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bitmap_info.bmiHeader.biWidth = width; + bitmap_info.bmiHeader.biHeight = -height; + bitmap_info.bmiHeader.biPlanes = 1; + bitmap_info.bmiHeader.biBitCount = lv_color_format_get_bpp( + LV_COLOR_FORMAT_NATIVE); +#if (LV_COLOR_DEPTH == 32) || (LV_COLOR_DEPTH == 24) + bitmap_info.bmiHeader.biCompression = BI_RGB; +#elif (LV_COLOR_DEPTH == 16) + bitmap_info.bmiHeader.biCompression = BI_BITFIELDS; + bitmap_info.bmiColorMask[0] = 0xF800; + bitmap_info.bmiColorMask[1] = 0x07E0; + bitmap_info.bmiColorMask[2] = 0x001F; +#else +#error [lv_windows] Unsupported LV_COLOR_DEPTH. +#endif + + HBITMAP hBitmap = CreateDIBSection( + frame_buffer_dc_handle, + (PBITMAPINFO)(&bitmap_info), + DIB_RGB_COLORS, + (void **)pixel_buffer, + NULL, + 0); + if(hBitmap) { + *pixel_buffer_size = width * height; + *pixel_buffer_size *= lv_color_format_get_size( + LV_COLOR_FORMAT_NATIVE); + + DeleteObject(SelectObject(frame_buffer_dc_handle, hBitmap)); + DeleteObject(hBitmap); + } + else { + DeleteDC(frame_buffer_dc_handle); + frame_buffer_dc_handle = NULL; + } + } + + return frame_buffer_dc_handle; +} + +static void lv_windows_display_timer_callback(lv_timer_t * timer) +{ + lv_windows_window_context_t * context = lv_timer_get_user_data(timer); + LV_ASSERT_NULL(context); + + if(!context->display_resolution_changed) { + return; + } + + lv_display_set_resolution( + context->display_device_object, + context->requested_display_resolution.x, + context->requested_display_resolution.y); + + int32_t hor_res = lv_display_get_horizontal_resolution( + context->display_device_object); + int32_t ver_res = lv_display_get_vertical_resolution( + context->display_device_object); + + HWND window_handle = lv_windows_get_display_window_handle( + context->display_device_object); + if(window_handle) { + if(context->display_framebuffer_context_handle) { + context->display_framebuffer_base = NULL; + context->display_framebuffer_size = 0; + DeleteDC(context->display_framebuffer_context_handle); + context->display_framebuffer_context_handle = NULL; + } + + context->display_framebuffer_context_handle = + lv_windows_create_frame_buffer( + window_handle, + hor_res, + ver_res, + &context->display_framebuffer_base, + &context->display_framebuffer_size); + if(context->display_framebuffer_context_handle) { + lv_display_set_buffers( + context->display_device_object, + context->display_framebuffer_base, + NULL, + (uint32_t)context->display_framebuffer_size, + LV_DISPLAY_RENDER_MODE_DIRECT); + } + } + + context->display_resolution_changed = false; + context->requested_display_resolution.x = 0; + context->requested_display_resolution.y = 0; +} + +static void lv_windows_display_driver_flush_callback( + lv_display_t * display, + const lv_area_t * area, + uint8_t * px_map) +{ + LV_UNUSED(area); + + HWND window_handle = lv_windows_get_display_window_handle(display); + if(!window_handle) { + lv_display_flush_ready(display); + return; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + lv_display_flush_ready(display); + return; + } + + if(lv_display_flush_is_last(display)) { +#if (LV_COLOR_DEPTH == 32) || \ + (LV_COLOR_DEPTH == 24) || \ + (LV_COLOR_DEPTH == 16) + UNREFERENCED_PARAMETER(px_map); +#else +#error [lv_windows] Unsupported LV_COLOR_DEPTH. +#endif + + HDC hdc = GetDC(window_handle); + if(hdc) { + SetStretchBltMode(hdc, HALFTONE); + + RECT client_rect; + GetClientRect(window_handle, &client_rect); + + int32_t width = lv_windows_zoom_to_logical( + client_rect.right - client_rect.left, + context->zoom_level); + int32_t height = lv_windows_zoom_to_logical( + client_rect.bottom - client_rect.top, + context->zoom_level); + if(context->simulator_mode) { + width = lv_windows_dpi_to_logical(width, context->window_dpi); + height = lv_windows_dpi_to_logical(height, context->window_dpi); + } + + StretchBlt( + hdc, + client_rect.left, + client_rect.top, + client_rect.right - client_rect.left, + client_rect.bottom - client_rect.top, + context->display_framebuffer_context_handle, + 0, + 0, + width, + height, + SRCCOPY); + + ReleaseDC(window_handle, hdc); + } + } + + lv_display_flush_ready(display); +} + +static UINT lv_windows_get_dpi_for_window(HWND window_handle) +{ + UINT result = (UINT)(-1); + + HMODULE module_handle = LoadLibraryW(L"SHCore.dll"); + if(module_handle) { + typedef enum MONITOR_DPI_TYPE_PRIVATE { + MDT_EFFECTIVE_DPI = 0, + MDT_ANGULAR_DPI = 1, + MDT_RAW_DPI = 2, + MDT_DEFAULT = MDT_EFFECTIVE_DPI + } MONITOR_DPI_TYPE_PRIVATE; + + typedef HRESULT(WINAPI * function_type)( + HMONITOR, MONITOR_DPI_TYPE_PRIVATE, UINT *, UINT *); + + function_type function = (function_type)( + GetProcAddress(module_handle, "GetDpiForMonitor")); + if(function) { + HMONITOR MonitorHandle = MonitorFromWindow( + window_handle, + MONITOR_DEFAULTTONEAREST); + + UINT dpiX = 0; + UINT dpiY = 0; + if(SUCCEEDED(function( + MonitorHandle, + MDT_EFFECTIVE_DPI, + &dpiX, + &dpiY))) { + result = dpiX; + } + } + + FreeLibrary(module_handle); + } + + if(result == (UINT)(-1)) { + HDC hWindowDC = GetDC(window_handle); + if(hWindowDC) { + result = GetDeviceCaps(hWindowDC, LOGPIXELSX); + ReleaseDC(window_handle, hWindowDC); + } + } + + if(result == (UINT)(-1)) { + result = USER_DEFAULT_SCREEN_DPI; + } + + return result; +} + +static BOOL lv_windows_register_touch_window( + HWND window_handle, + ULONG flags) +{ + HMODULE module_handle = GetModuleHandleW(L"user32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HWND, ULONG); + + function_type function = (function_type)( + GetProcAddress(module_handle, "RegisterTouchWindow")); + if(!function) { + return FALSE; + } + + return function(window_handle, flags); +} + +static BOOL lv_windows_enable_child_window_dpi_message( + HWND WindowHandle) +{ + // The private Per-Monitor DPI Awareness support extension is Windows 10 + // only. We don't need the private Per-Monitor DPI Awareness support + // extension if the Per-Monitor (V2) DPI Awareness exists. + OSVERSIONINFOEXW os_version_info_ex = { 0 }; + os_version_info_ex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); + os_version_info_ex.dwMajorVersion = 10; + os_version_info_ex.dwMinorVersion = 0; + os_version_info_ex.dwBuildNumber = 14986; + if(!VerifyVersionInfoW( + &os_version_info_ex, + VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER, + VerSetConditionMask( + VerSetConditionMask( + VerSetConditionMask( + 0, + VER_MAJORVERSION, + VER_GREATER_EQUAL), + VER_MINORVERSION, + VER_GREATER_EQUAL), + VER_BUILDNUMBER, + VER_LESS))) { + return FALSE; + } + + HMODULE module_handle = GetModuleHandleW(L"user32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HWND, BOOL); + + function_type function = (function_type)( + GetProcAddress(module_handle, "EnableChildWindowDpiMessage")); + if(!function) { + return FALSE; + } + + return function(WindowHandle, TRUE); +} + +static bool lv_windows_window_message_callback_nolock( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult) +{ + switch(uMsg) { + case WM_CREATE: { + // Note: Return -1 directly because WM_DESTROY message will be sent + // when destroy the window automatically. We free the resource when + // processing the WM_DESTROY message of this window. + + lv_windows_create_display_data_t * data = + (lv_windows_create_display_data_t *)( + ((LPCREATESTRUCTW)(lParam))->lpCreateParams); + if(!data) { + return -1; + } + + lv_windows_window_context_t * context = + (lv_windows_window_context_t *)(HeapAlloc( + GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(lv_windows_window_context_t))); + if(!context) { + return -1; + } + + if(!SetPropW(hWnd, L"LVGL.Window.Context", (HANDLE)(context))) { + return -1; + } + + context->window_dpi = lv_windows_get_dpi_for_window(hWnd); + context->zoom_level = data->zoom_level; + context->allow_dpi_override = data->allow_dpi_override; + context->simulator_mode = data->simulator_mode; + + context->display_timer_object = lv_timer_create( + lv_windows_display_timer_callback, + LV_DEF_REFR_PERIOD, + context); + + context->display_resolution_changed = false; + context->requested_display_resolution.x = 0; + context->requested_display_resolution.y = 0; + + context->display_device_object = lv_display_create(0, 0); + if(!context->display_device_object) { + return -1; + } + RECT request_content_size; + GetWindowRect(hWnd, &request_content_size); + lv_display_set_resolution( + context->display_device_object, + request_content_size.right - request_content_size.left, + request_content_size.bottom - request_content_size.top); + lv_display_set_flush_cb( + context->display_device_object, + lv_windows_display_driver_flush_callback); + lv_display_set_driver_data( + context->display_device_object, + hWnd); + if(!context->allow_dpi_override) { + lv_display_set_dpi( + context->display_device_object, + context->window_dpi); + } + + if(context->simulator_mode) { + context->display_resolution_changed = true; + context->requested_display_resolution.x = + lv_display_get_horizontal_resolution( + context->display_device_object); + context->requested_display_resolution.y = + lv_display_get_vertical_resolution( + context->display_device_object); + } + + lv_windows_register_touch_window(hWnd, 0); + + lv_windows_enable_child_window_dpi_message(hWnd); + + break; + } + case WM_SIZE: { + if(wParam != SIZE_MINIMIZED) { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + if(!context->simulator_mode) { + context->display_resolution_changed = true; + context->requested_display_resolution.x = LOWORD(lParam); + context->requested_display_resolution.y = HIWORD(lParam); + } + else { + int32_t window_width = lv_windows_dpi_to_physical( + lv_windows_zoom_to_physical( + lv_display_get_horizontal_resolution( + context->display_device_object), + context->zoom_level), + context->window_dpi); + int32_t window_height = lv_windows_dpi_to_physical( + lv_windows_zoom_to_physical( + lv_display_get_vertical_resolution( + context->display_device_object), + context->zoom_level), + context->window_dpi); + + RECT window_rect; + GetWindowRect(hWnd, &window_rect); + + RECT client_rect; + GetClientRect(hWnd, &client_rect); + + int32_t original_window_width = + window_rect.right - window_rect.left; + int32_t original_window_height = + window_rect.bottom - window_rect.top; + + int32_t original_client_width = + client_rect.right - client_rect.left; + int32_t original_client_height = + client_rect.bottom - client_rect.top; + + int32_t reserved_width = + original_window_width - original_client_width; + int32_t reserved_height = + original_window_height - original_client_height; + + SetWindowPos( + hWnd, + NULL, + 0, + 0, + reserved_width + window_width, + reserved_height + window_height, + SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); + } + } + } + break; + } + case WM_DPICHANGED: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + context->window_dpi = HIWORD(wParam); + + if(!context->allow_dpi_override) { + lv_display_set_dpi( + context->display_device_object, + context->window_dpi); + } + + LPRECT suggested_rect = (LPRECT)lParam; + + SetWindowPos( + hWnd, + NULL, + suggested_rect->left, + suggested_rect->top, + suggested_rect->right, + suggested_rect->bottom, + SWP_NOZORDER | SWP_NOACTIVATE); + } + + break; + } + case WM_ERASEBKGND: { + return TRUE; + } + case WM_DESTROY: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + RemovePropW(hWnd, L"LVGL.Window.Context")); + if(context) { + lv_display_t * display_device_object = + context->display_device_object; + context->display_device_object = NULL; + lv_display_delete(display_device_object); + DeleteDC(context->display_framebuffer_context_handle); + + lv_timer_delete(context->display_timer_object); + + HeapFree(GetProcessHeap(), 0, context); + } + + PostQuitMessage(0); + + break; + } + default: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + if(context->pointer.indev && + lv_windows_pointer_device_window_message_handler( + hWnd, + uMsg, + wParam, + lParam, + plResult)) { + // Handled + return true; + } + else if(context->keypad.indev && + lv_windows_keypad_device_window_message_handler( + hWnd, + uMsg, + wParam, + lParam, + plResult)) { + // Handled + return true; + } + else if(context->encoder.indev && + lv_windows_encoder_device_window_message_handler( + hWnd, + uMsg, + wParam, + lParam, + plResult)) { + // Handled + return true; + } + } + + // Not Handled + return false; + } + } + + // Handled + *plResult = 0; + return true; +} + +static LRESULT CALLBACK lv_windows_window_message_callback( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + lv_lock(); + + LRESULT lResult = 0; + bool Handled = lv_windows_window_message_callback_nolock( + hWnd, + uMsg, + wParam, + lParam, + &lResult); + + lv_unlock(); + + return Handled ? lResult : DefWindowProcW(hWnd, uMsg, wParam, lParam); +} + +#endif // LV_USE_WINDOWS diff --git a/inc/lvgl/src/drivers/windows/lv_windows_context.h b/inc/lvgl/src/drivers/windows/lv_windows_context.h new file mode 100644 index 0000000..d080ca5 --- /dev/null +++ b/inc/lvgl/src/drivers/windows/lv_windows_context.h @@ -0,0 +1,134 @@ +/** + * @file lv_windows_context.h + * + */ + +#ifndef LV_WINDOWS_CONTEXT_H +#define LV_WINDOWS_CONTEXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_WINDOWS + +#if LV_USE_OS != LV_OS_WINDOWS +#error [lv_windows] LV_OS_WINDOWS is required. Enable it in lv_conf.h (LV_USE_OS LV_OS_WINDOWS) +#endif + +#include + +#ifndef CREATE_WAITABLE_TIMER_MANUAL_RESET +#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001 +#endif + +#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION +#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_windows_pointer_context_t { + lv_indev_state_t state; + lv_point_t point; + lv_indev_t * indev; +} lv_windows_pointer_context_t; + +typedef struct _lv_windows_keypad_queue_item_t { + uint32_t key; + lv_indev_state_t state; +} lv_windows_keypad_queue_item_t; + +typedef struct _lv_windows_keypad_context_t { + lv_ll_t queue; + uint16_t utf16_high_surrogate; + uint16_t utf16_low_surrogate; + lv_indev_t * indev; +} lv_windows_keypad_context_t; + +typedef struct _lv_windows_encoder_context_t { + lv_indev_state_t state; + int16_t enc_diff; + lv_indev_t * indev; +} lv_windows_encoder_context_t; + +typedef struct _lv_windows_window_context_t { + lv_display_t * display_device_object; + lv_timer_t * display_timer_object; + + int32_t window_dpi; + int32_t zoom_level; + bool allow_dpi_override; + bool simulator_mode; + bool display_resolution_changed; + lv_point_t requested_display_resolution; + + HDC display_framebuffer_context_handle; + uint32_t * display_framebuffer_base; + size_t display_framebuffer_size; + + lv_windows_pointer_context_t pointer; + lv_windows_keypad_context_t keypad; + lv_windows_encoder_context_t encoder; + +} lv_windows_window_context_t; + +typedef struct _lv_windows_create_display_data_t { + const wchar_t * title; + int32_t hor_res; + int32_t ver_res; + int32_t zoom_level; + bool allow_dpi_override; + bool simulator_mode; + HANDLE mutex; + lv_display_t * display; +} lv_windows_create_display_data_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the LVGL Windows backend. + * @remark This is a private API which is used for LVGL Windows backend + * implementation. LVGL users shouldn't use that because the + * LVGL has already used it in lv_init. +*/ +void lv_windows_platform_init(void); + +/** + * @brief Get the window context from specific LVGL display window. + * @param window_handle The window handle of specific LVGL display window. + * @return The window context from specific LVGL display window. + * @remark This is a private API which is used for LVGL Windows backend + * implementation. LVGL users shouldn't use that because the + * maintainer doesn't promise the application binary interface + * compatibility for this API. +*/ +lv_windows_window_context_t * lv_windows_get_window_context( + HWND window_handle); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_WINDOWS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WINDOWS_CONTEXT_H*/ diff --git a/inc/lvgl/src/drivers/windows/lv_windows_display.c b/inc/lvgl/src/drivers/windows/lv_windows_display.c new file mode 100644 index 0000000..496aada --- /dev/null +++ b/inc/lvgl/src/drivers/windows/lv_windows_display.c @@ -0,0 +1,180 @@ +/** + * @file lv_windows_display.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_windows_display.h" +#if LV_USE_WINDOWS + +#include "lv_windows_context.h" + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static unsigned int __stdcall lv_windows_display_thread_entrypoint( + void * parameter); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_windows_create_display( + const wchar_t * title, + int32_t hor_res, + int32_t ver_res, + int32_t zoom_level, + bool allow_dpi_override, + bool simulator_mode) +{ + lv_windows_create_display_data_t data; + + lv_memzero(&data, sizeof(lv_windows_create_display_data_t)); + data.title = title; + data.hor_res = hor_res; + data.ver_res = ver_res; + data.zoom_level = zoom_level; + data.allow_dpi_override = allow_dpi_override; + data.simulator_mode = simulator_mode; + data.mutex = CreateEventExW(NULL, NULL, 0, EVENT_ALL_ACCESS); + data.display = NULL; + if(!data.mutex) { + return NULL; + } + + HANDLE thread = (HANDLE)_beginthreadex( + NULL, + 0, + lv_windows_display_thread_entrypoint, + &data, + 0, + NULL); + LV_ASSERT(thread); + + WaitForSingleObjectEx(data.mutex, INFINITE, FALSE); + + if(thread) { + CloseHandle(thread); + } + + if(data.mutex) { + CloseHandle(data.mutex); + } + + return data.display; +} + +HWND lv_windows_get_display_window_handle(lv_display_t * display) +{ + return (HWND)lv_display_get_driver_data(display); +} + +int32_t lv_windows_zoom_to_logical(int32_t physical, int32_t zoom_level) +{ + return MulDiv(physical, LV_WINDOWS_ZOOM_BASE_LEVEL, zoom_level); +} + +int32_t lv_windows_zoom_to_physical(int32_t logical, int32_t zoom_level) +{ + return MulDiv(logical, zoom_level, LV_WINDOWS_ZOOM_BASE_LEVEL); +} + +int32_t lv_windows_dpi_to_logical(int32_t physical, int32_t dpi) +{ + return MulDiv(physical, USER_DEFAULT_SCREEN_DPI, dpi); +} + +int32_t lv_windows_dpi_to_physical(int32_t logical, int32_t dpi) +{ + return MulDiv(logical, dpi, USER_DEFAULT_SCREEN_DPI); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static unsigned int __stdcall lv_windows_display_thread_entrypoint( + void * parameter) +{ + lv_windows_create_display_data_t * data = parameter; + LV_ASSERT_NULL(data); + + DWORD window_style = WS_OVERLAPPEDWINDOW; + DWORD ext_window_style = WS_EX_CLIENTEDGE; + RECT rect = { 0, 0, data->hor_res, data->ver_res }; + + if(data->simulator_mode) { + window_style &= ~(WS_SIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME); + } + else { + /* Have Windows compute window size so, regardless of window style, + * the CLIENT AREA has dimensions [data->hor_res, data->ver_res]. + * This is the area needed for LVGL to render to. */ + AdjustWindowRectEx(&rect, window_style, false, ext_window_style); + } + + HWND window_handle = CreateWindowExW( + ext_window_style, + L"LVGL.Window", + data->title, + window_style, + CW_USEDEFAULT, + 0, + rect.right - rect.left, + rect.bottom - rect.top, + NULL, + NULL, + NULL, + data); + + if(!window_handle) { + return 0; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return 0; + } + + data->display = context->display_device_object; + + ShowWindow(window_handle, SW_SHOW); + UpdateWindow(window_handle); + + LV_ASSERT(SetEvent(data->mutex)); + + data = NULL; + + MSG message; + while(GetMessageW(&message, NULL, 0, 0)) { + TranslateMessage(&message); + DispatchMessageW(&message); + } + + return 0; +} + +#endif // LV_USE_WINDOWS diff --git a/inc/lvgl/src/drivers/windows/lv_windows_display.h b/inc/lvgl/src/drivers/windows/lv_windows_display.h new file mode 100644 index 0000000..2ac4653 --- /dev/null +++ b/inc/lvgl/src/drivers/windows/lv_windows_display.h @@ -0,0 +1,127 @@ +/** + * @file lv_windows_display.h + * + */ + +#ifndef LV_WINDOWS_DISPLAY_H +#define LV_WINDOWS_DISPLAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_WINDOWS + +#include + +/********************* + * DEFINES + *********************/ + +#define LV_WINDOWS_ZOOM_BASE_LEVEL 100 + +#ifndef USER_DEFAULT_SCREEN_DPI +#define USER_DEFAULT_SCREEN_DPI 96 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Create a LVGL display object. + * @param title The window title of LVGL display. + * @param hor_res The horizontal resolution value of LVGL display. + * @param ver_res The vertical resolution value of LVGL display. + * @param zoom_level The zoom level value. Base value is 100 a.k.a 100%. + * @param allow_dpi_override Allow DPI override if true, or follow the + * Windows DPI scaling setting dynamically. + * @param simulator_mode Create simulator mode display if true (not resizable), + * or create application mode display (resizable). + * @return The created LVGL display object. +*/ +lv_display_t * lv_windows_create_display( + const wchar_t * title, + int32_t hor_res, + int32_t ver_res, + int32_t zoom_level, + bool allow_dpi_override, + bool simulator_mode); + +/** + * @brief Get the window handle from specific LVGL display object. + * @param display The specific LVGL display object. + * @return The window handle from specific LVGL display object. +*/ +HWND lv_windows_get_display_window_handle(lv_display_t * display); + +/** + * @brief Get logical pixel value from physical pixel value taken account + * with zoom level. + * @param physical The physical pixel value taken account with zoom level. + * @param zoom_level The zoom level value. Base value is 100 a.k.a 100%. + * @return The logical pixel value. + * @remark It uses the same calculation style as Windows OS implementation. + * It will be useful for integrate LVGL Windows backend to other + * Windows applications. +*/ +int32_t lv_windows_zoom_to_logical(int32_t physical, int32_t zoom_level); + +/** + * @brief Get physical pixel value taken account with zoom level from + * logical pixel value. + * @param logical The logical pixel value. + * @param zoom_level The zoom level value. Base value is 100 a.k.a 100%. + * @return The physical pixel value taken account with zoom level. + * @remark It uses the same calculation style as Windows OS implementation. + * It will be useful for integrate LVGL Windows backend to other + * Windows applications. +*/ +int32_t lv_windows_zoom_to_physical(int32_t logical, int32_t zoom_level); + +/** + * @brief Get logical pixel value from physical pixel value taken account + * with DPI scaling. + * @param physical The physical pixel value taken account with DPI scaling. + * @param dpi The DPI scaling value. Base value is USER_DEFAULT_SCREEN_DPI. + * @return The logical pixel value. + * @remark It uses the same calculation style as Windows OS implementation. + * It will be useful for integrate LVGL Windows backend to other + * Windows applications. +*/ +int32_t lv_windows_dpi_to_logical(int32_t physical, int32_t dpi); + +/** + * @brief Get physical pixel value taken account with DPI scaling from + * logical pixel value. + * @param logical The logical pixel value. + * @param dpi The DPI scaling value. Base value is USER_DEFAULT_SCREEN_DPI. + * @return The physical pixel value taken account with DPI scaling. + * @remark It uses the same calculation style as Windows OS implementation. + * It will be useful for integrate LVGL Windows backend to other + * Windows applications. +*/ +int32_t lv_windows_dpi_to_physical(int32_t logical, int32_t dpi); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_WINDOWS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WINDOWS_DISPLAY_H*/ diff --git a/inc/lvgl/src/drivers/windows/lv_windows_input.c b/inc/lvgl/src/drivers/windows/lv_windows_input.c new file mode 100644 index 0000000..3b7ae1c --- /dev/null +++ b/inc/lvgl/src/drivers/windows/lv_windows_input.c @@ -0,0 +1,825 @@ +/** + * @file lv_windows_input.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_windows_input.h" +#if LV_USE_WINDOWS + +#ifdef __GNUC__ + #pragma GCC diagnostic ignored "-Wcast-function-type" +#endif + +#include "lv_windows_context.h" +#include "lv_windows_display.h" +#include "lv_windows_input_private.h" +#include "../../misc/lv_text_private.h" +#include "../../core/lv_obj_private.h" + +#include + +#include "../../widgets/textarea/lv_textarea_private.h" +#include "../../widgets/keyboard/lv_keyboard.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_windows_pointer_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data); + +static void lv_windows_release_pointer_device_event_callback(lv_event_t * e); + +static void lv_windows_keypad_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data); + +static void lv_windows_release_keypad_device_event_callback(lv_event_t * e); + +static void lv_windows_encoder_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data); + +static void lv_windows_release_encoder_device_event_callback(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +HWND lv_windows_get_indev_window_handle(lv_indev_t * indev) +{ + return lv_windows_get_display_window_handle(lv_indev_get_display(indev)); +} + +lv_indev_t * lv_windows_acquire_pointer_indev(lv_display_t * display) +{ + HWND window_handle = lv_windows_get_display_window_handle(display); + if(!window_handle) { + return NULL; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return NULL; + } + + if(!context->pointer.indev) { + context->pointer.state = LV_INDEV_STATE_RELEASED; + context->pointer.point.x = 0; + context->pointer.point.y = 0; + + context->pointer.indev = lv_indev_create(); + if(context->pointer.indev) { + lv_indev_set_type( + context->pointer.indev, + LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb( + context->pointer.indev, + lv_windows_pointer_driver_read_callback); + lv_indev_set_display( + context->pointer.indev, + context->display_device_object); + lv_indev_add_event_cb( + context->pointer.indev, + lv_windows_release_pointer_device_event_callback, + LV_EVENT_DELETE, + context->pointer.indev); + lv_indev_set_group( + context->pointer.indev, + lv_group_get_default()); + } + } + + return context->pointer.indev; +} + +lv_indev_t * lv_windows_acquire_keypad_indev(lv_display_t * display) +{ + HWND window_handle = lv_windows_get_display_window_handle(display); + if(!window_handle) { + return NULL; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return NULL; + } + + if(!context->keypad.indev) { + lv_ll_init( + &context->keypad.queue, + sizeof(lv_windows_keypad_queue_item_t)); + context->keypad.utf16_high_surrogate = 0; + context->keypad.utf16_low_surrogate = 0; + + context->keypad.indev = lv_indev_create(); + if(context->keypad.indev) { + lv_indev_set_type( + context->keypad.indev, + LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb( + context->keypad.indev, + lv_windows_keypad_driver_read_callback); + lv_indev_set_display( + context->keypad.indev, + context->display_device_object); + lv_indev_add_event_cb( + context->keypad.indev, + lv_windows_release_keypad_device_event_callback, + LV_EVENT_DELETE, + context->keypad.indev); + lv_indev_set_group( + context->keypad.indev, + lv_group_get_default()); + } + } + + return context->keypad.indev; +} + +lv_indev_t * lv_windows_acquire_encoder_indev(lv_display_t * display) +{ + HWND window_handle = lv_windows_get_display_window_handle(display); + if(!window_handle) { + return NULL; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return NULL; + } + + if(!context->encoder.indev) { + context->encoder.state = LV_INDEV_STATE_RELEASED; + context->encoder.enc_diff = 0; + + context->encoder.indev = lv_indev_create(); + if(context->encoder.indev) { + lv_indev_set_type( + context->encoder.indev, + LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb( + context->encoder.indev, + lv_windows_encoder_driver_read_callback); + lv_indev_set_display( + context->encoder.indev, + context->display_device_object); + lv_indev_add_event_cb( + context->encoder.indev, + lv_windows_release_encoder_device_event_callback, + LV_EVENT_DELETE, + context->encoder.indev); + lv_indev_set_group( + context->encoder.indev, + lv_group_get_default()); + } + } + + return context->encoder.indev; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_windows_pointer_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data) +{ + lv_windows_window_context_t * context = lv_windows_get_window_context( + lv_windows_get_indev_window_handle(indev)); + if(!context) { + return; + } + + data->state = context->pointer.state; + data->point = context->pointer.point; +} + +static void lv_windows_release_pointer_device_event_callback(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *)lv_event_get_user_data(e); + if(!indev) { + return; + } + + HWND window_handle = lv_windows_get_indev_window_handle(indev); + if(!window_handle) { + return; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return; + } + + context->pointer.state = LV_INDEV_STATE_RELEASED; + context->pointer.point.x = 0; + context->pointer.point.y = 0; + + context->pointer.indev = NULL; +} + +static BOOL lv_windows_get_touch_input_info( + HTOUCHINPUT touch_input_handle, + UINT input_count, + PTOUCHINPUT inputs, + int item_size) +{ + HMODULE module_handle = GetModuleHandleW(L"user32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HTOUCHINPUT, UINT, PTOUCHINPUT, int); + + function_type function = (function_type)( + GetProcAddress(module_handle, "GetTouchInputInfo")); + if(!function) { + return FALSE; + } + + return function(touch_input_handle, input_count, inputs, item_size); +} + +static BOOL lv_windows_close_touch_input_handle( + HTOUCHINPUT touch_input_handle) +{ + HMODULE module_handle = GetModuleHandleW(L"user32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HTOUCHINPUT); + + function_type function = (function_type)( + GetProcAddress(module_handle, "CloseTouchInputHandle")); + if(!function) { + return FALSE; + } + + return function(touch_input_handle); +} + +bool lv_windows_pointer_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult) +{ + switch(uMsg) { + case WM_MOUSEMOVE: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + int32_t hor_res = lv_display_get_horizontal_resolution( + context->display_device_object); + int32_t ver_res = lv_display_get_vertical_resolution( + context->display_device_object); + + context->pointer.point.x = lv_windows_zoom_to_logical( + GET_X_LPARAM(lParam), + context->zoom_level); + context->pointer.point.y = lv_windows_zoom_to_logical( + GET_Y_LPARAM(lParam), + context->zoom_level); + if(context->simulator_mode) { + context->pointer.point.x = lv_windows_dpi_to_logical( + context->pointer.point.x, + context->window_dpi); + context->pointer.point.y = lv_windows_dpi_to_logical( + context->pointer.point.y, + context->window_dpi); + } + if(context->pointer.point.x < 0) { + context->pointer.point.x = 0; + } + if(context->pointer.point.x > hor_res - 1) { + context->pointer.point.x = hor_res - 1; + } + if(context->pointer.point.y < 0) { + context->pointer.point.y = 0; + } + if(context->pointer.point.y > ver_res - 1) { + context->pointer.point.y = ver_res - 1; + } + } + + break; + } + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + context->pointer.state = ( + uMsg == WM_LBUTTONDOWN + ? LV_INDEV_STATE_PRESSED + : LV_INDEV_STATE_RELEASED); + } + + break; + } + case WM_TOUCH: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + UINT input_count = LOWORD(wParam); + HTOUCHINPUT touch_input_handle = (HTOUCHINPUT)(lParam); + + PTOUCHINPUT inputs = malloc(input_count * sizeof(TOUCHINPUT)); + if(inputs) { + if(lv_windows_get_touch_input_info( + touch_input_handle, + input_count, + inputs, + sizeof(TOUCHINPUT))) { + for(UINT i = 0; i < input_count; ++i) { + POINT Point; + Point.x = TOUCH_COORD_TO_PIXEL(inputs[i].x); + Point.y = TOUCH_COORD_TO_PIXEL(inputs[i].y); + if(!ScreenToClient(hWnd, &Point)) { + continue; + } + + context->pointer.point.x = lv_windows_zoom_to_logical( + Point.x, + context->zoom_level); + context->pointer.point.y = lv_windows_zoom_to_logical( + Point.y, + context->zoom_level); + if(context->simulator_mode) { + context->pointer.point.x = lv_windows_dpi_to_logical( + context->pointer.point.x, + context->window_dpi); + context->pointer.point.y = lv_windows_dpi_to_logical( + context->pointer.point.y, + context->window_dpi); + } + + DWORD MousePressedMask = + TOUCHEVENTF_MOVE | TOUCHEVENTF_DOWN; + + context->pointer.state = ( + inputs[i].dwFlags & MousePressedMask + ? LV_INDEV_STATE_PRESSED + : LV_INDEV_STATE_RELEASED); + } + } + + free(inputs); + } + + lv_windows_close_touch_input_handle(touch_input_handle); + } + + break; + } + default: + // Not Handled + return false; + } + + // Handled + *plResult = 0; + return true; +} + +static void lv_windows_keypad_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data) +{ + lv_windows_window_context_t * context = lv_windows_get_window_context( + lv_windows_get_indev_window_handle(indev)); + if(!context) { + return; + } + + lv_windows_keypad_queue_item_t * current = (lv_windows_keypad_queue_item_t *)( + lv_ll_get_head(&context->keypad.queue)); + if(current) { + data->key = current->key; + data->state = current->state; + + lv_ll_remove(&context->keypad.queue, current); + lv_free(current); + + data->continue_reading = true; + } +} + +static void lv_windows_release_keypad_device_event_callback(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *)lv_event_get_user_data(e); + if(!indev) { + return; + } + + HWND window_handle = lv_windows_get_indev_window_handle(indev); + if(!window_handle) { + return; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return; + } + + lv_ll_clear(&context->keypad.queue); + context->keypad.utf16_high_surrogate = 0; + context->keypad.utf16_low_surrogate = 0; + + context->keypad.indev = NULL; +} + +static void lv_windows_push_key_to_keyboard_queue( + lv_windows_window_context_t * context, + uint32_t key, + lv_indev_state_t state) +{ + lv_windows_keypad_queue_item_t * current = (lv_windows_keypad_queue_item_t *)( + lv_ll_ins_tail(&context->keypad.queue)); + if(current) { + current->key = key; + current->state = state; + } +} + +static HIMC lv_windows_imm_get_context( + HWND window_handle) +{ + HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef HIMC(WINAPI * function_type)(HWND); + + function_type function = (function_type)( + GetProcAddress(module_handle, "ImmGetContext")); + if(!function) { + return FALSE; + } + + return function(window_handle); +} + +static BOOL lv_windows_imm_release_context( + HWND window_handle, + HIMC imm_context_handle) +{ + HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HWND, HIMC); + + function_type function = (function_type)( + GetProcAddress(module_handle, "ImmReleaseContext")); + if(!function) { + return FALSE; + } + + return function(window_handle, imm_context_handle); +} + +static HIMC lv_windows_imm_associate_context( + HWND window_handle, + HIMC imm_context_handle) +{ + HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef HIMC(WINAPI * function_type)(HWND, HIMC); + + function_type function = (function_type)( + GetProcAddress(module_handle, "ImmAssociateContext")); + if(!function) { + return FALSE; + } + + return function(window_handle, imm_context_handle); +} + +static BOOL lv_windows_imm_set_composition_window( + HIMC imm_context_handle, + LPCOMPOSITIONFORM composition_form) +{ + HMODULE module_handle = GetModuleHandleW(L"imm32.dll"); + if(!module_handle) { + return FALSE; + } + + typedef BOOL(WINAPI * function_type)(HIMC, LPCOMPOSITIONFORM); + + function_type function = (function_type)( + GetProcAddress(module_handle, "ImmSetCompositionWindow")); + if(!function) { + return FALSE; + } + + return function(imm_context_handle, composition_form); +} + +bool lv_windows_keypad_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult) +{ + LV_UNUSED(lParam); + + switch(uMsg) { + case WM_KEYDOWN: + case WM_KEYUP: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + bool skip_translation = false; + uint32_t translated_key = 0; + + switch(wParam) { + case VK_UP: + translated_key = LV_KEY_UP; + break; + case VK_DOWN: + translated_key = LV_KEY_DOWN; + break; + case VK_LEFT: + translated_key = LV_KEY_LEFT; + break; + case VK_RIGHT: + translated_key = LV_KEY_RIGHT; + break; + case VK_ESCAPE: + translated_key = LV_KEY_ESC; + break; + case VK_DELETE: + translated_key = LV_KEY_DEL; + break; + case VK_BACK: + translated_key = LV_KEY_BACKSPACE; + break; + case VK_RETURN: + translated_key = LV_KEY_ENTER; + break; + case VK_TAB: + case VK_NEXT: + translated_key = LV_KEY_NEXT; + break; + case VK_PRIOR: + translated_key = LV_KEY_PREV; + break; + case VK_HOME: + translated_key = LV_KEY_HOME; + break; + case VK_END: + translated_key = LV_KEY_END; + break; + default: + skip_translation = true; + break; + } + + if(!skip_translation) { + lv_windows_push_key_to_keyboard_queue( + context, + translated_key, + ((uMsg == WM_KEYUP) + ? LV_INDEV_STATE_RELEASED + : LV_INDEV_STATE_PRESSED)); + } + } + + break; + } + case WM_CHAR: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + uint16_t raw_code_point = (uint16_t)(wParam); + + if(raw_code_point >= 0x20 && raw_code_point != 0x7F) { + if(IS_HIGH_SURROGATE(raw_code_point)) { + context->keypad.utf16_high_surrogate = raw_code_point; + } + else if(IS_LOW_SURROGATE(raw_code_point)) { + context->keypad.utf16_low_surrogate = raw_code_point; + } + + uint32_t code_point = raw_code_point; + + if(context->keypad.utf16_high_surrogate && + context->keypad.utf16_low_surrogate) { + uint16_t high_surrogate = + context->keypad.utf16_high_surrogate; + uint16_t low_surrogate = + context->keypad.utf16_low_surrogate; + + code_point = (low_surrogate & 0x03FF); + code_point += (((high_surrogate & 0x03FF) + 0x40) << 10); + + context->keypad.utf16_high_surrogate = 0; + context->keypad.utf16_low_surrogate = 0; + } + + uint32_t lvgl_code_point = + lv_text_unicode_to_encoded(code_point); + + lv_windows_push_key_to_keyboard_queue( + context, + lvgl_code_point, + LV_INDEV_STATE_PRESSED); + lv_windows_push_key_to_keyboard_queue( + context, + lvgl_code_point, + LV_INDEV_STATE_RELEASED); + } + } + + break; + } + case WM_IME_SETCONTEXT: { + if(wParam == TRUE) { + HIMC imm_context_handle = lv_windows_imm_get_context(hWnd); + if(imm_context_handle) { + lv_windows_imm_associate_context( + hWnd, + imm_context_handle); + lv_windows_imm_release_context( + hWnd, + imm_context_handle); + } + } + + *plResult = DefWindowProcW(hWnd, uMsg, wParam, wParam); + break; + } + case WM_IME_STARTCOMPOSITION: { + HIMC imm_context_handle = lv_windows_imm_get_context(hWnd); + if(imm_context_handle) { + lv_obj_t * textarea_object = NULL; + lv_obj_t * focused_object = lv_group_get_focused( + lv_group_get_default()); + if(focused_object) { + const lv_obj_class_t * object_class = lv_obj_get_class( + focused_object); + + if(object_class == &lv_textarea_class) { + textarea_object = focused_object; + } + else if(object_class == &lv_keyboard_class) { + textarea_object = lv_keyboard_get_textarea(focused_object); + } + } + + COMPOSITIONFORM composition_form; + composition_form.dwStyle = CFS_POINT; + composition_form.ptCurrentPos.x = 0; + composition_form.ptCurrentPos.y = 0; + + if(textarea_object) { + lv_textarea_t * textarea = (lv_textarea_t *)(textarea_object); + lv_obj_t * label_object = lv_textarea_get_label(textarea_object); + + composition_form.ptCurrentPos.x = + label_object->coords.x1 + textarea->cursor.area.x1; + composition_form.ptCurrentPos.y = + label_object->coords.y1 + textarea->cursor.area.y1; + } + + lv_windows_imm_set_composition_window( + imm_context_handle, + &composition_form); + lv_windows_imm_release_context( + hWnd, + imm_context_handle); + } + + *plResult = DefWindowProcW(hWnd, uMsg, wParam, wParam); + break; + } + default: + // Not Handled + return false; + } + + // Handled + *plResult = 0; + return true; +} + +static void lv_windows_encoder_driver_read_callback( + lv_indev_t * indev, + lv_indev_data_t * data) +{ + lv_windows_window_context_t * context = lv_windows_get_window_context( + lv_windows_get_indev_window_handle(indev)); + if(!context) { + return; + } + + data->state = context->encoder.state; + data->enc_diff = context->encoder.enc_diff; + context->encoder.enc_diff = 0; +} + +static void lv_windows_release_encoder_device_event_callback(lv_event_t * e) +{ + lv_indev_t * indev = (lv_indev_t *)lv_event_get_user_data(e); + if(!indev) { + return; + } + + HWND window_handle = lv_windows_get_indev_window_handle(indev); + if(!window_handle) { + return; + } + + lv_windows_window_context_t * context = lv_windows_get_window_context( + window_handle); + if(!context) { + return; + } + + context->encoder.state = LV_INDEV_STATE_RELEASED; + context->encoder.enc_diff = 0; + + context->encoder.indev = NULL; +} + +bool lv_windows_encoder_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult) +{ + LV_UNUSED(lParam); + + switch(uMsg) { + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + context->encoder.state = ( + uMsg == WM_MBUTTONDOWN + ? LV_INDEV_STATE_PRESSED + : LV_INDEV_STATE_RELEASED); + } + + break; + } + case WM_MOUSEWHEEL: { + lv_windows_window_context_t * context = (lv_windows_window_context_t *)( + lv_windows_get_window_context(hWnd)); + if(context) { + context->encoder.enc_diff = + -(GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA); + } + + break; + } + default: + // Not Handled + return false; + } + + // Handled + *plResult = 0; + return true; +} + +#endif // LV_USE_WINDOWS diff --git a/inc/lvgl/src/drivers/windows/lv_windows_input.h b/inc/lvgl/src/drivers/windows/lv_windows_input.h new file mode 100644 index 0000000..892014e --- /dev/null +++ b/inc/lvgl/src/drivers/windows/lv_windows_input.h @@ -0,0 +1,83 @@ +/** + * @file lv_windows_input.h + * + */ + +#ifndef LV_WINDOWS_INPUT_H +#define LV_WINDOWS_INPUT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" + +#if LV_USE_WINDOWS + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Get the window handle from specific LVGL input device object. + * @param indev The specific LVGL input device object. + * @return The window handle from specific LVGL input device object. +*/ +HWND lv_windows_get_indev_window_handle(lv_indev_t * indev); + +/** + * @brief Open a LVGL pointer input device object for the specific LVGL + * display object, or create it if the LVGL pointer input device + * object is not created or removed before. + * @param display The specific LVGL display object. + * @return The LVGL pointer input device object for the specific LVGL + * display object. +*/ +lv_indev_t * lv_windows_acquire_pointer_indev(lv_display_t * display); + +/** + * @brief Open a LVGL keypad input device object for the specific LVGL + * display object, or create it if the LVGL keypad input device + * object is not created or removed before. + * @param display The specific LVGL display object. + * @return The LVGL keypad input device object for the specific LVGL + * display object. +*/ +lv_indev_t * lv_windows_acquire_keypad_indev(lv_display_t * display); + +/** + * @brief Open a LVGL encoder input device object for the specific LVGL + * display object, or create it if the LVGL encoder input device + * object is not created or removed before. + * @param display The specific LVGL display object. + * @return The LVGL encoder input device object for the specific LVGL + * display object. +*/ +lv_indev_t * lv_windows_acquire_encoder_indev(lv_display_t * display); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_WINDOWS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WINDOWS_INPUT_H*/ diff --git a/inc/lvgl/src/drivers/windows/lv_windows_input_private.h b/inc/lvgl/src/drivers/windows/lv_windows_input_private.h new file mode 100644 index 0000000..7d1096e --- /dev/null +++ b/inc/lvgl/src/drivers/windows/lv_windows_input_private.h @@ -0,0 +1,65 @@ +/** + * @file lv_windows_input_private.h + * + */ + +#ifndef LV_WINDOWS_INPUT_PRIVATE_H +#define LV_WINDOWS_INPUT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#if LV_USE_WINDOWS + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +bool lv_windows_pointer_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult); + +bool lv_windows_keypad_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult); + +bool lv_windows_encoder_device_window_message_handler( + HWND hWnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT * plResult); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_WINDOWS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WINDOWS_INPUT_PRIVATE_H*/ diff --git a/inc/lvgl/src/drivers/x11/lv_x11.h b/inc/lvgl/src/drivers/x11/lv_x11.h new file mode 100644 index 0000000..bb98b51 --- /dev/null +++ b/inc/lvgl/src/drivers/x11/lv_x11.h @@ -0,0 +1,82 @@ +/** + * @file lv_x11.h + * + */ + +#ifndef LV_X11_H +#define LV_X11_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../display/lv_display.h" +#include "../../indev/lv_indev.h" +#include "../../draw/lv_image_dsc.h" + +#if LV_USE_X11 + +/********************* + * DEFINES + *********************/ + +/** Header of private display driver user data - for internal use only */ +typedef struct { + struct _XDisplay * display; /**< X11 display object */ + struct _x11_inp_data * inp_data; /**< input user data object */ +} _x11_user_hdr_t; + +/** optional window close callback function type + * @see lv_x11_window_set_close_cb +*/ +typedef void(*lv_x11_close_cb)(void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * create and add keyboard, mouse and scrollwheel objects and connect them to x11 display. + * + * This is a convenience method handling the typical input initialisation of an X11 window: + * - create keyboard (lv_x11_keyboard_create) + * - create mouse (with scrollwheel, lv_x11_mouse_create lv_x11_mousewheel_create) + * + * @param[in] disp the created X11 display object from @ref lv_x11_window_create + * @param[in] mouse_img optional image description for the mouse cursor (NULL for no/invisible mouse cursor) + */ +void lv_x11_inputs_create(lv_display_t * disp, lv_image_dsc_t const * mouse_img); + +/** + * create the X11 display + * + * The minimal initialisation for initializing the X11 display driver with keyboard/mouse support: + * @code + * lv_display_t* disp = lv_x11_window_create("My Window Title", window_width, window_width); + * lv_x11_inputs_create(disp, NULL); + * @endcode + * or with mouse cursor icon: + * @code + * lv_image_dsc_t mouse_symbol = {.....}; + * lv_display_t* disp = lv_x11_window_create("My Window Title", window_width, window_width); + * lv_x11_inputs_create(disp, &mouse_symbol); + * @endcode + * + * @param[in] title title of the created X11 window + * @param[in] hor_res horizontal resolution (=width) of the X11 window + * @param[in] ver_res vertical resolution (=height) of the X11 window + * @return pointer to the display object + */ +lv_display_t * lv_x11_window_create(char const * title, int32_t hor_res, int32_t ver_res); + +#endif /* LV_USE_X11 */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_X11_H */ diff --git a/inc/lvgl/src/drivers/x11/lv_x11_display.c b/inc/lvgl/src/drivers/x11/lv_x11_display.c new file mode 100644 index 0000000..09da062 --- /dev/null +++ b/inc/lvgl/src/drivers/x11/lv_x11_display.c @@ -0,0 +1,395 @@ +/** + * @file lv_x11_display.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_x11.h" + +#if LV_USE_X11 + +#include +#include +#include +#include +#include +#include +#include "../../core/lv_obj_pos.h" + +/********************* + * DEFINES + *********************/ +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) + +#if LV_X11_RENDER_MODE_PARTIAL + #define LV_X11_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL +#elif defined LV_X11_RENDER_MODE_DIRECT + #define LV_X11_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT +#elif defined LV_X11_RENDER_MODE_FULL + #define LV_X11_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + /* header (containing X Display + input user data pointer - keep aligned with x11_input module!) */ + _x11_user_hdr_t hdr; + /* X11 related information */ + Window window; /**< X11 window object */ + GC gc; /**< X11 graphics context object */ + Visual * visual; /**< X11 visual */ + int dplanes; /**< X11 display depth */ + XImage * ximage; /**< X11 XImage cache object for updating window content */ + Atom wmDeleteMessage; /**< X11 atom to window object */ + void * xdata; /**< allocated data for XImage */ + /* LVGL related information */ + lv_timer_t * timer; /**< timer object for @ref x11_event_handler */ + uint8_t * buffer[2]; /**< (double) lv display buffers, depending on @ref LV_X11_RENDER_MODE */ + lv_area_t flush_area; /**< integrated area for a display update */ + /* systemtick by thread related information */ + pthread_t thr_tick; /**< pthread for SysTick simulation */ + bool terminated; /**< flag to germinate SysTick simulation thread */ +} x11_disp_data_t; + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_X11_DIRECT_EXIT + static unsigned int count_windows = 0; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_COLOR_DEPTH == 32 +typedef lv_color32_t color_t; +static inline lv_color32_t get_px(color_t p) +{ + return (lv_color32_t)p; +} +#elif LV_COLOR_DEPTH == 24 +typedef lv_color_t color_t; +static inline lv_color32_t get_px(color_t p) +{ + lv_color32_t out = { .red = p.red, .green = p.green, .blue = p.blue }; + return out; +} +#elif LV_COLOR_DEPTH == 16 +typedef lv_color16_t color_t; +static inline lv_color32_t get_px(color_t p) +{ + lv_color32_t out = { .red = p.red << 3, .green = p.green << 2, .blue = p.blue << 3 }; + return out; +} +#elif LV_COLOR_DEPTH == 8 +typedef uint8_t color_t; +static inline lv_color32_t get_px(color_t p) +{ + lv_color32_t out = { .red = p, .green = p, .blue = p }; + return out; +} +#warning ("LV_COLOR_DEPTH=8 delivers black data only - open issue in lvgl?") +#else +#error ("Unsupported LV_COLOR_DEPTH") +#endif + +/** + * Flush the content of the internal buffer the specific area on the display. + * @param[in] disp the created X11 display object from @lv_x11_window_create + * @param[in] area area to be updated + * @param[in] px_map contains the rendered image as raw pixel map and it should be copied to `area` on the display. + * @note @ref lv_display_flush_ready has to be called when it's finished. + */ +static void x11_flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map) +{ + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + static const lv_area_t inv_area = { .x1 = 0xFFFF, + .x2 = 0, + .y1 = 0xFFFF, + .y2 = 0 + }; + + /* build display update area until lv_display_flush_is_last */ + xd->flush_area.x1 = MIN(xd->flush_area.x1, area->x1); + xd->flush_area.x2 = MAX(xd->flush_area.x2, area->x2); + xd->flush_area.y1 = MIN(xd->flush_area.y1, area->y1); + xd->flush_area.y2 = MAX(xd->flush_area.y2, area->y2); + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + + uint32_t dst_offs; + lv_color32_t * dst_data; + color_t * src_data = (color_t *)px_map + (LV_X11_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL ? 0 : hor_res * + area->y1 + area->x1); + for(int16_t y = area->y1; y <= area->y2; y++) { + dst_offs = area->x1 + y * hor_res; + dst_data = &((lv_color32_t *)(xd->xdata))[dst_offs]; + for(int16_t x = area->x1; x <= area->x2; x++, src_data++, dst_data++) { + *dst_data = get_px(*src_data); + } + src_data += (LV_X11_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL ? 0 : hor_res - (area->x2 - area->x1 + 1)); + } + + if(lv_display_flush_is_last(disp)) { + LV_LOG_TRACE("(%d/%d), %dx%d)", xd->flush_area.x1, xd->flush_area.y1, xd->flush_area.x2 + 1 - xd->flush_area.x1, + xd->flush_area.y2 + 1 - xd->flush_area.y1); + + /* refresh collected display update area only */ + int16_t upd_w = xd->flush_area.x2 - xd->flush_area.x1 + 1; + int16_t upd_h = xd->flush_area.y2 - xd->flush_area.y1 + 1; + XPutImage(xd->hdr.display, xd->window, xd->gc, xd->ximage, xd->flush_area.x1, xd->flush_area.y1, xd->flush_area.x1, + xd->flush_area.y1, upd_w, upd_h); + + /* invalidate collected area */ + xd->flush_area = inv_area; + } + /* Inform the graphics library that you are ready with the flushing */ + lv_display_flush_ready(disp); +} + +/** + * event called by lvgl display if resolution has been changed (@ref lv_display_set_resolution has been called) + * @param[in] e event data, containing lv_display_t object + */ +static void x11_resolution_evt_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_user_data(e); + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + + if(LV_X11_RENDER_MODE != LV_DISPLAY_RENDER_MODE_PARTIAL) { + /* update lvgl full-screen display draw buffers for new display size */ + int sz_buffers = (hor_res * ver_res * (LV_COLOR_DEPTH + 7) / 8); + xd->buffer[0] = realloc(xd->buffer[0], sz_buffers); + xd->buffer[1] = (LV_X11_DOUBLE_BUFFER ? realloc(xd->buffer[1], sz_buffers) : NULL); + lv_display_set_buffers(disp, xd->buffer[0], xd->buffer[1], sz_buffers, LV_X11_RENDER_MODE); + } + + /* re-create cache image with new size */ + XDestroyImage(xd->ximage); + size_t sz_buffers = hor_res * ver_res * sizeof(lv_color32_t); + xd->xdata = malloc(sz_buffers); /* use clib method here, x11 memory not part of device footprint */ + xd->ximage = XCreateImage(xd->hdr.display, xd->visual, xd->dplanes, ZPixmap, 0, xd->xdata, + hor_res, ver_res, lv_color_format_get_bpp(LV_COLOR_FORMAT_ARGB8888), 0); +} + +/** + * event called by lvgl display if display has been closed (@ref lv_display_delete has been called) + * @param[in] e event data, containing lv_display_t object + */ +static void x11_disp_delete_evt_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_user_data(e); + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + + lv_timer_delete(xd->timer); + + free(xd->buffer[0]); + if(LV_X11_DOUBLE_BUFFER) { + free(xd->buffer[1]); + } + + XDestroyImage(xd->ximage); + XFreeGC(xd->hdr.display, xd->gc); + XUnmapWindow(xd->hdr.display, xd->window); + XDestroyWindow(xd->hdr.display, xd->window); + XFlush(xd->hdr.display); + XCloseDisplay(xd->hdr.display); + + lv_free(xd); +#if LV_X11_DIRECT_EXIT + if(0 == --count_windows) { + exit(0); + } +#endif +} + +static void x11_hide_cursor(lv_display_t * disp) +{ + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + XColor black = { .red = 0, .green = 0, .blue = 0 }; + char empty_data[] = { 0 }; + + Pixmap empty_bitmap = XCreateBitmapFromData(xd->hdr.display, xd->window, empty_data, 1, 1); + Cursor inv_cursor = XCreatePixmapCursor(xd->hdr.display, empty_bitmap, empty_bitmap, &black, &black, 0, 0); + XDefineCursor(xd->hdr.display, xd->window, inv_cursor); + XFreeCursor(xd->hdr.display, inv_cursor); + XFreePixmap(xd->hdr.display, empty_bitmap); +} + +/** + * X11 input event handler, predicated to fetch and handle only display related events + * (Window changes) + */ +static int is_disp_event(Display * disp, XEvent * event, XPointer arg) +{ + LV_UNUSED(disp); + LV_UNUSED(arg); + return (event->type == Expose + || (event->type >= DestroyNotify && event->type <= CirculateNotify) /* events from StructureNotifyMask */ + || event->type == ClientMessage); +} +static void x11_event_handler(lv_timer_t * t) +{ + lv_display_t * disp = lv_timer_get_user_data(t); + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + /* handle all outstanding X events */ + XEvent event; + while(XCheckIfEvent(xd->hdr.display, &event, is_disp_event, NULL)) { + LV_LOG_TRACE("Display Event %d", event.type); + switch(event.type) { + case Expose: + if(event.xexpose.count == 0) { + XPutImage(xd->hdr.display, xd->window, xd->gc, xd->ximage, 0, 0, 0, 0, event.xexpose.width, event.xexpose.height); + } + break; + case ConfigureNotify: + if(event.xconfigure.width != lv_display_get_horizontal_resolution(disp) + || event.xconfigure.height != lv_display_get_vertical_resolution(disp)) { + lv_display_set_resolution(disp, event.xconfigure.width, event.xconfigure.height); + } + break; + case ClientMessage: + if(event.xclient.data.l[0] == (long)xd->wmDeleteMessage) { + xd->terminated = true; + void * ret = NULL; + pthread_join(xd->thr_tick, &ret); + lv_display_delete(disp); + return; + } + break; + case MapNotify: + case ReparentNotify: + /*suppress unhandled warning*/ + break; + default: + LV_LOG_WARN("unhandled x11 event: %d", event.type); + } + } +} + +static void * x11_tick_thread(void * data) +{ + x11_disp_data_t * xd = data; + LV_ASSERT_NULL(xd); + + while(!xd->terminated) { + usleep(5000); + lv_tick_inc(5); + } + return NULL; +} + +static void x11_window_create(lv_display_t * disp, char const * title) +{ + x11_disp_data_t * xd = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(xd); + + /* setup display/screen */ + xd->hdr.display = XOpenDisplay(NULL); + int screen = XDefaultScreen(xd->hdr.display); + xd->visual = XDefaultVisual(xd->hdr.display, screen); + + /* create window */ + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); +#if 0 + /* drawing contexts for an window */ + unsigned long col_fg = BlackPixel(xd->hdr.display, screen); + unsigned long col_bg = WhitePixel(xd->hdr.display, screen); + + xd->window = XCreateSimpleWindow(xd->hdr.display, DefaultRootWindow(xd->hdr.display), + 0, 0, hor_res, ver_res, 0, col_fg, col_bg); +#else + xd->window = XCreateWindow(xd->hdr.display, XDefaultRootWindow(xd->hdr.display), + 0, 0, hor_res, ver_res, 0, + XDefaultDepth(xd->hdr.display, screen), InputOutput, + xd->visual, 0, NULL); +#endif + /* window manager properties (yes, use of StdProp is obsolete) */ + XSetStandardProperties(xd->hdr.display, xd->window, title, NULL, None, NULL, 0, NULL); + xd->gc = XCreateGC(xd->hdr.display, xd->window, 0, 0); + + /* allow receiving mouse, keyboard and window change/close events */ + XSelectInput(xd->hdr.display, xd->window, + PointerMotionMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask | ExposureMask | + StructureNotifyMask); + xd->wmDeleteMessage = XInternAtom(xd->hdr.display, "WM_DELETE_WINDOW", False); + XSetWMProtocols(xd->hdr.display, xd->window, &xd->wmDeleteMessage, 1); + + x11_hide_cursor(disp); + + /* create cache XImage */ + size_t sz_buffers = hor_res * ver_res * sizeof(lv_color32_t); + xd->dplanes = XDisplayPlanes(xd->hdr.display, screen); + xd->xdata = malloc(sz_buffers); /* use clib method here, x11 memory not part of device footprint */ + xd->ximage = XCreateImage(xd->hdr.display, xd->visual, xd->dplanes, ZPixmap, 0, xd->xdata, + hor_res, ver_res, lv_color_format_get_bpp(LV_COLOR_FORMAT_ARGB8888), 0); + + /* finally bring window on top of the other windows */ + XMapRaised(xd->hdr.display, xd->window); + +#if LV_X11_DIRECT_EXIT + count_windows++; +#endif +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_display_t * lv_x11_window_create(char const * title, int32_t hor_res, int32_t ver_res) +{ + x11_disp_data_t * xd = lv_malloc_zeroed(sizeof(x11_disp_data_t)); + LV_ASSERT_MALLOC(xd); + if(NULL == xd) return NULL; + + lv_display_t * disp = lv_display_create(hor_res, ver_res); + if(NULL == disp) { + lv_free(xd); + return NULL; + } + lv_display_set_driver_data(disp, xd); + lv_display_set_flush_cb(disp, x11_flush_cb); + lv_display_add_event_cb(disp, x11_resolution_evt_cb, LV_EVENT_RESOLUTION_CHANGED, disp); + lv_display_add_event_cb(disp, x11_disp_delete_evt_cb, LV_EVENT_DELETE, disp); + + x11_window_create(disp, title); + + int sz_buffers = (hor_res * ver_res * (LV_COLOR_DEPTH + 7) / 8); + if(LV_X11_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { + sz_buffers /= 10; + } + xd->buffer[0] = malloc(sz_buffers); + xd->buffer[1] = (LV_X11_DOUBLE_BUFFER ? malloc(sz_buffers) : NULL); + lv_display_set_buffers(disp, xd->buffer[0], xd->buffer[1], sz_buffers, LV_X11_RENDER_MODE); + + xd->timer = lv_timer_create(x11_event_handler, 5, disp); + + /* initialize Tick simulation */ + xd->terminated = false; + pthread_create(&xd->thr_tick, NULL, x11_tick_thread, xd); + + return disp; +} + +#endif /*LV_USE_X11*/ diff --git a/inc/lvgl/src/drivers/x11/lv_x11_input.c b/inc/lvgl/src/drivers/x11/lv_x11_input.c new file mode 100644 index 0000000..ecbd8d4 --- /dev/null +++ b/inc/lvgl/src/drivers/x11/lv_x11_input.c @@ -0,0 +1,324 @@ +/** + * @file lv_x11_input.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_x11.h" + +#if LV_USE_X11 + +#include +#include +#include +#include +#include "../../widgets/image/lv_image.h" + +/********************* + * DEFINES + *********************/ +#define MIN(A, B) ((A) < (B) ? (A) : (B)) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _x11_inp_data { + /* LVGL related information */ + lv_group_t * inp_group; /**< input group for X input elements */ + lv_indev_t * keyboard; /**< keyboard input device object */ + lv_indev_t * mousepointer; /**< mouse input device object */ + lv_indev_t * mousewheel; /**< encoder input device object */ + lv_timer_t * timer; /**< timer object for @ref x11_event_handler */ + /* user input related information */ + char kb_buffer[32]; /**< keyboard buffer for X keyboard inputs */ + lv_point_t mouse_pos; /**< current reported mouse position */ + bool left_mouse_btn; /**< current state of left mouse button */ + bool right_mouse_btn; /**< current state of right mouse button */ + bool wheel_mouse_btn; /**< current state of wheel (=middle) mouse button */ + int16_t wheel_cnt; /**< mouse wheel increments */ +} x11_inp_data_t; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * X11 input event handler, predicated to fetch and handle only input related events + * (MotionNotify, ButtonPress/Release, KeyPress/Release) + */ +static int is_inp_event(Display * disp, XEvent * event, XPointer arg) +{ + LV_UNUSED(disp); + LV_UNUSED(arg); + return !(event->type == Expose + || (event->type >= DestroyNotify && event->type <= CirculateNotify) /* events from StructureNotifyMask */ + || event->type == ClientMessage); +} +static void x11_inp_event_handler(lv_timer_t * t) +{ + lv_display_t * disp = lv_timer_get_user_data(t); + _x11_user_hdr_t * disp_hdr = lv_display_get_driver_data(disp); + x11_inp_data_t * xd = disp_hdr->inp_data; + + /* handle all outstanding X events */ + XEvent event; + while(XCheckIfEvent(disp_hdr->display, &event, is_inp_event, NULL)) { + LV_LOG_TRACE("Input Event %d", event.type); + switch(event.type) { + case MotionNotify: + xd->mouse_pos.x = event.xmotion.x; + xd->mouse_pos.y = event.xmotion.y; + break; + case ButtonPress: + switch(event.xbutton.button) { + case Button1: + xd->left_mouse_btn = true; + break; + case Button2: + xd->wheel_mouse_btn = true; + break; + case Button3: + xd->right_mouse_btn = true; + break; + case Button4: /* Scrolled up */ + xd->wheel_cnt--; + break; + case Button5: /* Scrolled down */ + xd->wheel_cnt++; + break; + default: + LV_LOG_WARN("unhandled button press : %d", event.xbutton.button); + } + break; + case ButtonRelease: + switch(event.xbutton.button) { + case Button1: + xd->left_mouse_btn = false; + break; + case Button2: + xd->wheel_mouse_btn = false; + break; + case Button3: + xd->right_mouse_btn = false; + break; + } + break; + case KeyPress: { + size_t len = strlen(xd->kb_buffer); + if(len < (sizeof(xd->kb_buffer) - 2 /* space for 1 char + '\0' */)) { + KeySym key; + int n = XLookupString(&event.xkey, &xd->kb_buffer[len], sizeof(xd->kb_buffer) - (len + 1), &key, NULL); + n += !!key; + switch(key) { + case XK_Home: + case XK_KP_Home: + xd->kb_buffer[len] = LV_KEY_HOME; + break; + case XK_Left: + case XK_KP_Left: + xd->kb_buffer[len] = LV_KEY_LEFT; + break; + case XK_Up: + case XK_KP_Up: + xd->kb_buffer[len] = LV_KEY_UP; + break; + case XK_Right: + case XK_KP_Right: + xd->kb_buffer[len] = LV_KEY_RIGHT; + break; + case XK_Down: + case XK_KP_Down: + xd->kb_buffer[len] = LV_KEY_DOWN; + break; + case XK_Prior: + case XK_KP_Prior: + xd->kb_buffer[len] = LV_KEY_PREV; + break; + case XK_Next: + case XK_KP_Next: + xd->kb_buffer[len] = LV_KEY_NEXT; + break; + case XK_End: + case XK_KP_End: + xd->kb_buffer[len] = LV_KEY_END; + break; + case XK_BackSpace: + xd->kb_buffer[len] = LV_KEY_BACKSPACE; + break; + case XK_Escape: + xd->kb_buffer[len] = LV_KEY_ESC; + break; + case XK_Delete: + case XK_KP_Delete: + xd->kb_buffer[len] = LV_KEY_DEL; + break; + case XK_KP_Enter: + xd->kb_buffer[len] = LV_KEY_ENTER; + break; + } + xd->kb_buffer[len + n] = '\0'; + } + } + break; + case KeyRelease: + break; + default: + LV_LOG_WARN("unhandled x11 event: %d", event.type); + } + } +} + +/** + * event called by lvgl display if display has been closed (@ref lv_display_delete has been called) + * @param[in] e event data, containing lv_display_t object + */ +static void x11_inp_delete_evt_cb(lv_event_t * e) +{ + x11_inp_data_t * xd = (x11_inp_data_t *)lv_event_get_user_data(e); + + lv_timer_delete(xd->timer); + lv_free(xd); +} + +/** + * create the local data/timers for the X11 input functionality. + * extracts the user data information from lv_display_t object and initializes the input user object on 1st use. + * @param[in] disp the created X11 display object from @lv_x11_window_create + * @return pointer to the local user data object @x11_inp_data_t + */ +static x11_inp_data_t * x11_input_get_user_data(lv_display_t * disp) +{ + _x11_user_hdr_t * disp_hdr = lv_display_get_driver_data(disp); + LV_ASSERT_NULL(disp_hdr); + x11_inp_data_t ** inp_data = &disp_hdr->inp_data; + + /* create input data set if initial call */ + if(NULL == *inp_data) { + *inp_data = lv_malloc_zeroed(sizeof(x11_inp_data_t)); + LV_ASSERT_MALLOC(*inp_data); + if(NULL != *inp_data) { + /* initialize timer callback for X11 kb/mouse input event reading */ + (*inp_data)->timer = lv_timer_create(x11_inp_event_handler, 1, disp); + lv_display_add_event_cb(disp, x11_inp_delete_evt_cb, LV_EVENT_DELETE, *inp_data); + } + } + return *inp_data; +} + +static void x11_keyboard_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_display_t * disp = lv_indev_get_driver_data(indev); + x11_inp_data_t * xd = x11_input_get_user_data(disp); + + size_t len = strlen(xd->kb_buffer); + if(len > 0) { + data->state = LV_INDEV_STATE_PRESSED; + data->key = xd->kb_buffer[0]; + memmove(xd->kb_buffer, xd->kb_buffer + 1, len); + data->continue_reading = (len > 0); + } + else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +static void x11_mouse_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_display_t * disp = lv_indev_get_driver_data(indev); + x11_inp_data_t * xd = x11_input_get_user_data(disp); + + int32_t hor_res = lv_display_get_horizontal_resolution(disp); + int32_t ver_res = lv_display_get_vertical_resolution(disp); + + xd->mouse_pos.x = MIN(xd->mouse_pos.x, hor_res - 1); + xd->mouse_pos.y = MIN(xd->mouse_pos.y, ver_res - 1); + + data->point = xd->mouse_pos; + data->state = xd->left_mouse_btn ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; +} + +static void x11_mousewheel_read_cb(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_display_t * disp = lv_indev_get_driver_data(indev); + x11_inp_data_t * xd = x11_input_get_user_data(disp); + + data->state = xd->wheel_mouse_btn ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED; + data->enc_diff = xd->wheel_cnt; + xd->wheel_cnt = 0; +} + +static lv_indev_t * lv_x11_keyboard_create(lv_display_t * disp) +{ + lv_indev_t * indev = lv_indev_create(); + LV_ASSERT_NULL(indev); + if(NULL != indev) { + lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(indev, x11_keyboard_read_cb); + lv_indev_set_driver_data(indev, disp); + } + return indev; +} + +static lv_indev_t * lv_x11_mouse_create(lv_display_t * disp, lv_image_dsc_t const * symb) +{ + lv_indev_t * indev = lv_indev_create(); + if(NULL != indev) { + lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER); + lv_indev_set_read_cb(indev, x11_mouse_read_cb); + lv_indev_set_driver_data(indev, disp); + + /* optional mouse cursor symbol */ + if(NULL != symb) { + lv_obj_t * mouse_cursor = lv_image_create(lv_screen_active()); + lv_image_set_src(mouse_cursor, symb); + lv_indev_set_cursor(indev, mouse_cursor); + } + } + return indev; +} + +static lv_indev_t * lv_x11_mousewheel_create(lv_display_t * disp) +{ + lv_indev_t * indev = lv_indev_create(); + if(NULL != indev) { + lv_indev_set_type(indev, LV_INDEV_TYPE_ENCODER); + lv_indev_set_read_cb(indev, x11_mousewheel_read_cb); + lv_indev_set_driver_data(indev, disp); + } + return indev; +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_x11_inputs_create(lv_display_t * disp, lv_image_dsc_t const * mouse_img) +{ + x11_inp_data_t * xd = x11_input_get_user_data(disp); + LV_ASSERT_NULL(xd); + + xd->inp_group = lv_group_create(); + lv_group_set_default(xd->inp_group); + + xd->mousepointer = lv_x11_mouse_create(disp, mouse_img); + lv_indev_set_group(xd->mousepointer, xd->inp_group); + + xd->mousewheel = lv_x11_mousewheel_create(disp); + lv_indev_set_group(xd->mousewheel, xd->inp_group); + + xd->keyboard = lv_x11_keyboard_create(disp); + lv_indev_set_group(xd->keyboard, xd->inp_group); +} + +#endif /*LV_USE_X11*/ diff --git a/inc/lvgl/src/font/binfont_loader/lv_binfont_loader.c b/inc/lvgl/src/font/binfont_loader/lv_binfont_loader.c new file mode 100644 index 0000000..c175d85 --- /dev/null +++ b/inc/lvgl/src/font/binfont_loader/lv_binfont_loader.c @@ -0,0 +1,733 @@ +/** + * @file lv_binfont_loader.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" +#include "../fmt_txt/lv_font_fmt_txt_private.h" +#include "../../misc/lv_fs_private.h" +#include "../../misc/lv_types.h" +#include "../../stdlib/lv_string.h" +#include "lv_binfont_loader.h" + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_fs_file_t * fp; + int8_t bit_pos; + uint8_t byte_value; +} bit_iterator_t; + +typedef struct font_header_bin { + uint32_t version; + uint16_t tables_count; + uint16_t font_size; + uint16_t ascent; + int16_t descent; + uint16_t typo_ascent; + int16_t typo_descent; + uint16_t typo_line_gap; + int16_t min_y; + int16_t max_y; + uint16_t default_advance_width; + uint16_t kerning_scale; + uint8_t index_to_loc_format; + uint8_t glyph_id_format; + uint8_t advance_width_format; + uint8_t bits_per_pixel; + uint8_t xy_bits; + uint8_t wh_bits; + uint8_t advance_width_bits; + uint8_t compression_id; + uint8_t subpixels_mode; + uint8_t padding; + int16_t underline_position; + uint16_t underline_thickness; +} font_header_bin_t; + +typedef struct cmap_table_bin { + uint32_t data_offset; + uint32_t range_start; + uint16_t range_length; + uint16_t glyph_id_start; + uint16_t data_entries_count; + uint8_t format_type; + uint8_t padding; +} cmap_table_bin_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp); +static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font); +int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start); + +static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); +static unsigned int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); + +static lv_font_t * binfont_font_create_cb(const lv_font_info_t * info, const void * src); +static void binfont_font_delete_cb(lv_font_t * font); +static void * binfont_font_dup_src_cb(const void * src); +static void binfont_font_free_src_cb(void * src); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +const lv_font_class_t lv_binfont_font_class = { + .create_cb = binfont_font_create_cb, + .delete_cb = binfont_font_delete_cb, + .dup_src_cb = binfont_font_dup_src_cb, + .free_src_cb = binfont_font_free_src_cb, +}; + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_font_t * lv_binfont_create(const char * path) +{ + LV_ASSERT_NULL(path); + + lv_fs_file_t file; + lv_fs_res_t fs_res = lv_fs_open(&file, path, LV_FS_MODE_RD); + if(fs_res != LV_FS_RES_OK) return NULL; + + lv_font_t * font = lv_malloc_zeroed(sizeof(lv_font_t)); + LV_ASSERT_MALLOC(font); + + if(!lvgl_load_font(&file, font)) { + LV_LOG_WARN("Error loading font file: %s", path); + /* + * When `lvgl_load_font` fails it can leak some pointers. + * All non-null pointers can be assumed as allocated and + * `lv_binfont_destroy` should free them correctly. + */ + lv_binfont_destroy(font); + font = NULL; + } + + lv_fs_close(&file); + + return font; +} + +#if LV_USE_FS_MEMFS +lv_font_t * lv_binfont_create_from_buffer(void * buffer, uint32_t size) +{ + lv_fs_path_ex_t mempath; + + lv_fs_make_path_from_buffer(&mempath, LV_FS_MEMFS_LETTER, buffer, size, "bin"); + return lv_binfont_create((const char *)&mempath); +} +#endif + +void lv_binfont_destroy(lv_font_t * font) +{ + if(font == NULL) return; + + const lv_font_fmt_txt_dsc_t * dsc = font->dsc; + if(dsc == NULL) return; + + if(dsc->kern_classes == 0) { + const lv_font_fmt_txt_kern_pair_t * kern_dsc = dsc->kern_dsc; + if(NULL != kern_dsc) { + lv_free((void *)kern_dsc->glyph_ids); + lv_free((void *)kern_dsc->values); + lv_free((void *)kern_dsc); + } + } + else { + const lv_font_fmt_txt_kern_classes_t * kern_dsc = dsc->kern_dsc; + if(NULL != kern_dsc) { + lv_free((void *)kern_dsc->class_pair_values); + lv_free((void *)kern_dsc->left_class_mapping); + lv_free((void *)kern_dsc->right_class_mapping); + lv_free((void *)kern_dsc); + } + } + + const lv_font_fmt_txt_cmap_t * cmaps = dsc->cmaps; + if(NULL != cmaps) { + for(int i = 0; i < dsc->cmap_num; ++i) { + lv_free((void *)cmaps[i].glyph_id_ofs_list); + lv_free((void *)cmaps[i].unicode_list); + } + lv_free((void *)cmaps); + } + + lv_free((void *)dsc->glyph_bitmap); + lv_free((void *)dsc->glyph_dsc); + lv_free((void *)dsc); + lv_free(font); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp) +{ + bit_iterator_t it; + it.fp = fp; + it.bit_pos = -1; + it.byte_value = 0; + return it; +} + +static unsigned int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) +{ + unsigned int value = 0; + while(n_bits--) { + it->byte_value = it->byte_value << 1; + it->bit_pos--; + + if(it->bit_pos < 0) { + it->bit_pos = 7; + *res = lv_fs_read(it->fp, &(it->byte_value), 1, NULL); + if(*res != LV_FS_RES_OK) { + return 0; + } + } + int8_t bit = (it->byte_value & 0x80) ? 1 : 0; + + value |= (bit << n_bits); + } + *res = LV_FS_RES_OK; + return value; +} + +static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) +{ + unsigned int value = read_bits(it, n_bits, res); + if(value & (1 << (n_bits - 1))) { + value |= ~0u << n_bits; + } + return value; +} + +static int read_label(lv_fs_file_t * fp, int start, const char * label) +{ + lv_fs_seek(fp, start, LV_FS_SEEK_SET); + + uint32_t length; + char buf[4]; + + if(lv_fs_read(fp, &length, 4, NULL) != LV_FS_RES_OK + || lv_fs_read(fp, buf, 4, NULL) != LV_FS_RES_OK + || lv_memcmp(label, buf, 4) != 0) { + LV_LOG_WARN("Error reading '%s' label.", label); + return -1; + } + + return length; +} + +static bool load_cmaps_tables(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t cmaps_start, cmap_table_bin_t * cmap_table) +{ + if(lv_fs_read(fp, cmap_table, font_dsc->cmap_num * sizeof(cmap_table_bin_t), NULL) != LV_FS_RES_OK) { + return false; + } + + for(unsigned int i = 0; i < font_dsc->cmap_num; ++i) { + lv_fs_res_t res = lv_fs_seek(fp, cmaps_start + cmap_table[i].data_offset, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return false; + } + + lv_font_fmt_txt_cmap_t * cmap = (lv_font_fmt_txt_cmap_t *) & (font_dsc->cmaps[i]); + + cmap->range_start = cmap_table[i].range_start; + cmap->range_length = cmap_table[i].range_length; + cmap->glyph_id_start = cmap_table[i].glyph_id_start; + cmap->type = cmap_table[i].format_type; + + switch(cmap_table[i].format_type) { + case LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL: { + uint32_t ids_size = (uint32_t)(sizeof(uint8_t) * cmap_table[i].data_entries_count); + uint8_t * glyph_id_ofs_list = lv_malloc(ids_size); + + cmap->glyph_id_ofs_list = glyph_id_ofs_list; + + if(lv_fs_read(fp, glyph_id_ofs_list, ids_size, NULL) != LV_FS_RES_OK) { + return false; + } + + cmap->list_length = cmap->range_length; + break; + } + case LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY: + break; + case LV_FONT_FMT_TXT_CMAP_SPARSE_FULL: + case LV_FONT_FMT_TXT_CMAP_SPARSE_TINY: { + uint32_t list_size = sizeof(uint16_t) * cmap_table[i].data_entries_count; + uint16_t * unicode_list = (uint16_t *)lv_malloc(list_size); + + cmap->unicode_list = unicode_list; + cmap->list_length = cmap_table[i].data_entries_count; + + if(lv_fs_read(fp, unicode_list, list_size, NULL) != LV_FS_RES_OK) { + return false; + } + + if(cmap_table[i].format_type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { + uint16_t * buf = lv_malloc(sizeof(uint16_t) * cmap->list_length); + + cmap->glyph_id_ofs_list = buf; + + if(lv_fs_read(fp, buf, sizeof(uint16_t) * cmap->list_length, NULL) != LV_FS_RES_OK) { + return false; + } + } + break; + } + default: + LV_LOG_WARN("Unknown cmaps format type %d.", cmap_table[i].format_type); + return false; + } + } + return true; +} + +static int32_t load_cmaps(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint32_t cmaps_start) +{ + int32_t cmaps_length = read_label(fp, cmaps_start, "cmap"); + if(cmaps_length < 0) { + return -1; + } + + uint32_t cmaps_subtables_count; + if(lv_fs_read(fp, &cmaps_subtables_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + lv_font_fmt_txt_cmap_t * cmaps = + lv_malloc(cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); + + lv_memset(cmaps, 0, cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); + + font_dsc->cmaps = cmaps; + font_dsc->cmap_num = cmaps_subtables_count; + + cmap_table_bin_t * cmaps_tables = lv_malloc(sizeof(cmap_table_bin_t) * font_dsc->cmap_num); + + bool success = load_cmaps_tables(fp, font_dsc, cmaps_start, cmaps_tables); + + lv_free(cmaps_tables); + + return success ? cmaps_length : -1; +} + +static int32_t load_glyph(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t start, uint32_t * glyph_offset, uint32_t loca_count, font_header_bin_t * header) +{ + int32_t glyph_length = read_label(fp, start, "glyf"); + if(glyph_length < 0) { + return -1; + } + + lv_font_fmt_txt_glyph_dsc_t * glyph_dsc = (lv_font_fmt_txt_glyph_dsc_t *) + lv_malloc(loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); + + lv_memset(glyph_dsc, 0, loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); + + font_dsc->glyph_dsc = glyph_dsc; + + int cur_bmp_size = 0; + + for(unsigned int i = 0; i < loca_count; ++i) { + lv_font_fmt_txt_glyph_dsc_t * gdsc = &glyph_dsc[i]; + + lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i], LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return -1; + } + + bit_iterator_t bit_it = init_bit_iterator(fp); + + if(header->advance_width_bits == 0) { + gdsc->adv_w = header->default_advance_width; + } + else { + gdsc->adv_w = read_bits(&bit_it, header->advance_width_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + } + + if(header->advance_width_format == 0) { + gdsc->adv_w *= 16; + } + + gdsc->ofs_x = read_bits_signed(&bit_it, header->xy_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->ofs_y = read_bits_signed(&bit_it, header->xy_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->box_w = read_bits(&bit_it, header->wh_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->box_h = read_bits(&bit_it, header->wh_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; + int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)glyph_length; + int bmp_size = next_offset - glyph_offset[i] - nbits / 8; + + if(i == 0) { + gdsc->adv_w = 0; + gdsc->box_w = 0; + gdsc->box_h = 0; + gdsc->ofs_x = 0; + gdsc->ofs_y = 0; + } + + gdsc->bitmap_index = cur_bmp_size; + if(gdsc->box_w * gdsc->box_h != 0) { + cur_bmp_size += bmp_size; + } + } + + uint8_t * glyph_bmp = (uint8_t *)lv_malloc(sizeof(uint8_t) * cur_bmp_size); + LV_ASSERT_MALLOC(glyph_bmp); + + font_dsc->glyph_bitmap = glyph_bmp; + + cur_bmp_size = 0; + + for(unsigned int i = 1; i < loca_count; ++i) { + lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i], LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return -1; + } + bit_iterator_t bit_it = init_bit_iterator(fp); + + int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; + + read_bits(&bit_it, nbits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + if(glyph_dsc[i].box_w * glyph_dsc[i].box_h == 0) { + continue; + } + + int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)glyph_length; + int bmp_size = next_offset - glyph_offset[i] - nbits / 8; + + if(nbits % 8 == 0) { /*Fast path*/ + if(lv_fs_read(fp, &glyph_bmp[cur_bmp_size], bmp_size, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else { + for(int k = 0; k < bmp_size - 1; ++k) { + glyph_bmp[cur_bmp_size + k] = read_bits(&bit_it, 8, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + } + glyph_bmp[cur_bmp_size + bmp_size - 1] = read_bits(&bit_it, 8 - nbits % 8, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + /*The last fragment should be on the MSB but read_bits() will place it to the LSB*/ + glyph_bmp[cur_bmp_size + bmp_size - 1] = glyph_bmp[cur_bmp_size + bmp_size - 1] << (nbits % 8); + + } + + cur_bmp_size += bmp_size; + } + return glyph_length; +} + +static void release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * glyph_dsc) +{ + LV_UNUSED(font); + LV_UNUSED(glyph_dsc); + /*No custom memory management needed*/ +} + +/* + * Loads a `lv_font_t` from a binary file, given a `lv_fs_file_t`. + * + * Memory allocations on `lvgl_load_font` should be immediately zeroed and + * the pointer should be set on the `lv_font_t` data before any possible return. + * + * When something fails, it returns `false` and the memory on the `lv_font_t` + * still needs to be freed using `lv_binfont_destroy`. + * + * `lv_binfont_destroy` will assume that all non-null pointers are allocated and + * should be freed. + */ +static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font) +{ + lv_font_fmt_txt_dsc_t * font_dsc = (lv_font_fmt_txt_dsc_t *) + lv_malloc(sizeof(lv_font_fmt_txt_dsc_t)); + + lv_memset(font_dsc, 0, sizeof(lv_font_fmt_txt_dsc_t)); + + font->dsc = font_dsc; + + /*header*/ + int32_t header_length = read_label(fp, 0, "head"); + if(header_length < 0) { + return false; + } + + font_header_bin_t font_header; + if(lv_fs_read(fp, &font_header, sizeof(font_header_bin_t), NULL) != LV_FS_RES_OK) { + return false; + } + + font->base_line = -font_header.descent; + font->line_height = font_header.ascent - font_header.descent; + font->get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt; + font->get_glyph_bitmap = lv_font_get_bitmap_fmt_txt; + font->release_glyph = release_glyph_cb; + font->subpx = font_header.subpixels_mode; + font->underline_position = (int8_t) font_header.underline_position; + font->underline_thickness = (int8_t) font_header.underline_thickness; + + font_dsc->bpp = font_header.bits_per_pixel; + font_dsc->kern_scale = font_header.kerning_scale; + font_dsc->bitmap_format = font_header.compression_id; + + /*cmaps*/ + uint32_t cmaps_start = header_length; + int32_t cmaps_length = load_cmaps(fp, font_dsc, cmaps_start); + if(cmaps_length < 0) { + return false; + } + + /*loca*/ + uint32_t loca_start = cmaps_start + cmaps_length; + int32_t loca_length = read_label(fp, loca_start, "loca"); + if(loca_length < 0) { + return false; + } + + uint32_t loca_count; + if(lv_fs_read(fp, &loca_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return false; + } + + bool failed = false; + uint32_t * glyph_offset = lv_malloc(sizeof(uint32_t) * (loca_count + 1)); + + if(font_header.index_to_loc_format == 0) { + for(unsigned int i = 0; i < loca_count; ++i) { + uint16_t offset; + if(lv_fs_read(fp, &offset, sizeof(uint16_t), NULL) != LV_FS_RES_OK) { + failed = true; + break; + } + glyph_offset[i] = offset; + } + } + else if(font_header.index_to_loc_format == 1) { + if(lv_fs_read(fp, glyph_offset, loca_count * sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + failed = true; + } + } + else { + LV_LOG_WARN("Unknown index_to_loc_format: %d.", font_header.index_to_loc_format); + failed = true; + } + + if(failed) { + lv_free(glyph_offset); + return false; + } + + /*glyph*/ + uint32_t glyph_start = loca_start + loca_length; + int32_t glyph_length = load_glyph( + fp, font_dsc, glyph_start, glyph_offset, loca_count, &font_header); + + lv_free(glyph_offset); + + if(glyph_length < 0) { + return false; + } + + /*kerning*/ + if(font_header.tables_count < 4) { + font_dsc->kern_dsc = NULL; + font_dsc->kern_classes = 0; + font_dsc->kern_scale = 0; + return true; + } + + uint32_t kern_start = glyph_start + glyph_length; + + int32_t kern_length = load_kern(fp, font_dsc, font_header.glyph_id_format, kern_start); + + return kern_length >= 0; +} + +int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start) +{ + int32_t kern_length = read_label(fp, start, "kern"); + if(kern_length < 0) { + return -1; + } + + uint8_t kern_format_type; + int32_t padding; + if(lv_fs_read(fp, &kern_format_type, sizeof(uint8_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &padding, 3 * sizeof(uint8_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + if(0 == kern_format_type) { /*sorted pairs*/ + lv_font_fmt_txt_kern_pair_t * kern_pair = lv_malloc(sizeof(lv_font_fmt_txt_kern_pair_t)); + + lv_memset(kern_pair, 0, sizeof(lv_font_fmt_txt_kern_pair_t)); + + font_dsc->kern_dsc = kern_pair; + font_dsc->kern_classes = 0; + + uint32_t glyph_entries; + if(lv_fs_read(fp, &glyph_entries, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + int ids_size; + if(format == 0) { + ids_size = sizeof(int8_t) * 2 * glyph_entries; + } + else { + ids_size = sizeof(int16_t) * 2 * glyph_entries; + } + + uint8_t * glyph_ids = lv_malloc(ids_size); + int8_t * values = lv_malloc(glyph_entries); + + kern_pair->glyph_ids_size = format; + kern_pair->pair_cnt = glyph_entries; + kern_pair->glyph_ids = glyph_ids; + kern_pair->values = values; + + if(lv_fs_read(fp, glyph_ids, ids_size, NULL) != LV_FS_RES_OK) { + return -1; + } + + if(lv_fs_read(fp, values, glyph_entries, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else if(3 == kern_format_type) { /*array M*N of classes*/ + + lv_font_fmt_txt_kern_classes_t * kern_classes = lv_malloc(sizeof(lv_font_fmt_txt_kern_classes_t)); + + lv_memset(kern_classes, 0, sizeof(lv_font_fmt_txt_kern_classes_t)); + + font_dsc->kern_dsc = kern_classes; + font_dsc->kern_classes = 1; + + uint16_t kern_class_mapping_length; + uint8_t kern_table_rows; + uint8_t kern_table_cols; + + if(lv_fs_read(fp, &kern_class_mapping_length, sizeof(uint16_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &kern_table_rows, sizeof(uint8_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &kern_table_cols, sizeof(uint8_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + int kern_values_length = sizeof(int8_t) * kern_table_rows * kern_table_cols; + + uint8_t * kern_left = lv_malloc(kern_class_mapping_length); + uint8_t * kern_right = lv_malloc(kern_class_mapping_length); + int8_t * kern_values = lv_malloc(kern_values_length); + + kern_classes->left_class_mapping = kern_left; + kern_classes->right_class_mapping = kern_right; + kern_classes->left_class_cnt = kern_table_rows; + kern_classes->right_class_cnt = kern_table_cols; + kern_classes->class_pair_values = kern_values; + + if(lv_fs_read(fp, kern_left, kern_class_mapping_length, NULL) != LV_FS_RES_OK || + lv_fs_read(fp, kern_right, kern_class_mapping_length, NULL) != LV_FS_RES_OK || + lv_fs_read(fp, kern_values, kern_values_length, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else { + LV_LOG_WARN("Unknown kern_format_type: %d", kern_format_type); + return -1; + } + + return kern_length; +} + +static lv_font_t * binfont_font_create_cb(const lv_font_info_t * info, const void * src) +{ + const lv_binfont_font_src_t * font_src = src; + + if(info->size == font_src->font_size) { + if(font_src->path) { + return lv_binfont_create(font_src->path); + } +#if LV_USE_FS_MEMFS + return lv_binfont_create_from_buffer((void *)font_src->buffer, font_src->buffer_size); +#else + LV_LOG_WARN("LV_USE_FS_MEMFS not enabled"); + return NULL; +#endif + } + + return NULL; +} + +static void binfont_font_delete_cb(lv_font_t * font) +{ + lv_binfont_destroy(font); +} + +static void * binfont_font_dup_src_cb(const void * src) +{ + const lv_binfont_font_src_t * font_src = src; + + lv_binfont_font_src_t * new_src = lv_malloc_zeroed(sizeof(lv_binfont_font_src_t)); + LV_ASSERT_MALLOC(new_src); + *new_src = *font_src; + + if(font_src->path) { + new_src->path = lv_strdup(font_src->path); + } + + return new_src; +} + +static void binfont_font_free_src_cb(void * src) +{ + lv_binfont_font_src_t * font_src = src; + if(font_src->path) { + lv_free((char *)font_src->path); + font_src->path = NULL; + } + + lv_free(font_src); +} diff --git a/inc/lvgl/src/font/binfont_loader/lv_binfont_loader.h b/inc/lvgl/src/font/binfont_loader/lv_binfont_loader.h new file mode 100644 index 0000000..ef67b92 --- /dev/null +++ b/inc/lvgl/src/font/binfont_loader/lv_binfont_loader.h @@ -0,0 +1,72 @@ +/** + * @file lv_binfont_loader.h + * + */ + +#ifndef LV_BINFONT_LOADER_H +#define LV_BINFONT_LOADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + + +typedef struct { + uint32_t font_size; /**< Size of the font in pixels*/ + const char * path; /**< Path to font file*/ + const void * buffer; /**< Address of the font file in the memory*/ + uint32_t buffer_size; /**< Size of the font file buffer*/ +} lv_binfont_font_src_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_font_class_t lv_binfont_font_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Loads a `lv_font_t` object from a binary font file + * @param path path to font file + * @return pointer to font where to load + */ +lv_font_t * lv_binfont_create(const char * path); + +#if LV_USE_FS_MEMFS +/** + * Loads a `lv_font_t` object from a memory buffer containing the binary font file. + * Requires LV_USE_FS_MEMFS + * @param buffer address of the font file in the memory + * @param size size of the font file buffer + * @return pointer to font where to load + */ +lv_font_t * lv_binfont_create_from_buffer(void * buffer, uint32_t size); +#endif + +/** + * Frees the memory allocated by the `lv_binfont_create()` function + * @param font lv_font_t object created by the lv_binfont_create function + */ +void lv_binfont_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_BINFONT_LOADER_H */ diff --git a/inc/lvgl/src/font/fmt_txt/lv_font_fmt_txt.c b/inc/lvgl/src/font/fmt_txt/lv_font_fmt_txt.c new file mode 100644 index 0000000..b05c1c2 --- /dev/null +++ b/inc/lvgl/src/font/fmt_txt/lv_font_fmt_txt.c @@ -0,0 +1,683 @@ +/** + * @file lv_font_fmt_txt.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_font.h" +#include "lv_font_fmt_txt_private.h" +#include "../../core/lv_global.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_types.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_utils.h" +#include "../../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ +#if LV_USE_FONT_COMPRESSED + #define font_rle LV_GLOBAL_DEFAULT()->font_fmt_rle +#endif /*LV_USE_FONT_COMPRESSED*/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t gid_left; + uint32_t gid_right; +} kern_pair_ref_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter); +static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right); +static int unicode_list_compare(const void * ref, const void * element); +static int kern_pair_8_compare(const void * ref, const void * element); +static int kern_pair_16_compare(const void * ref, const void * element); + +#if LV_USE_FONT_COMPRESSED + static void decompress(const uint8_t * in, uint8_t * out, int32_t w, int32_t h, uint8_t bpp, bool prefilter); + static inline void decompress_line(uint8_t * out, int32_t w); + static inline uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len); + static inline void rle_init(const uint8_t * in, uint8_t bpp); + static inline uint8_t rle_next(void); +#endif /*LV_USE_FONT_COMPRESSED*/ + +static lv_font_t * builtin_font_create_cb(const lv_font_info_t * info, const void * src); +static void builtin_font_delete_cb(lv_font_t * font); +static void * builtin_font_dup_src_cb(const void * src); +static void builtin_font_free_src_cb(void * src); + +/********************** + * STATIC VARIABLES + **********************/ + +static const uint8_t opa4_table[16] = {0, 17, 34, 51, + 68, 85, 102, 119, + 136, 153, 170, 187, + 204, 221, 238, 255 + }; + +#if LV_USE_FONT_COMPRESSED +static const uint8_t opa3_table[8] = {0, 36, 73, 109, 146, 182, 218, 255}; +#endif + +static const uint8_t opa2_table[4] = {0, 85, 170, 255}; + +const lv_font_class_t lv_builtin_font_class = { + .create_cb = builtin_font_create_cb, + .delete_cb = builtin_font_delete_cb, + .dup_src_cb = builtin_font_dup_src_cb, + .free_src_cb = builtin_font_free_src_cb, +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +const void * lv_font_get_bitmap_fmt_txt(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) +{ + const lv_font_t * font = g_dsc->resolved_font; + + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + uint32_t gid = g_dsc->gid.index; + if(!gid) return NULL; + + const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; + + if(g_dsc->req_raw_bitmap) return &fdsc->glyph_bitmap[gdsc->bitmap_index]; + + uint8_t * bitmap_out = draw_buf->data; + int32_t gsize = (int32_t) gdsc->box_w * gdsc->box_h; + if(gsize == 0) return NULL; + + uint32_t stride_in = g_dsc->stride; + + + if(fdsc->bitmap_format == LV_FONT_FMT_TXT_PLAIN) { + const uint8_t * bitmap_in = &fdsc->glyph_bitmap[gdsc->bitmap_index]; + uint8_t * bitmap_out_tmp = bitmap_out; + int32_t i = 0; + int32_t x, y; + uint32_t stride_out = lv_draw_buf_width_to_stride(gdsc->box_w, LV_COLOR_FORMAT_A8); + if(fdsc->bpp == 1) { + for(y = 0; y < gdsc->box_h; y ++) { + uint16_t line_rem = stride_in != 0 ? stride_in : gdsc->box_w; + for(x = 0; x < gdsc->box_w; x++, i++) { + i = i & 0x7; + if(i == 0) bitmap_out_tmp[x] = (*bitmap_in) & 0x80 ? 0xff : 0x00; + else if(i == 1) bitmap_out_tmp[x] = (*bitmap_in) & 0x40 ? 0xff : 0x00; + else if(i == 2) bitmap_out_tmp[x] = (*bitmap_in) & 0x20 ? 0xff : 0x00; + else if(i == 3) bitmap_out_tmp[x] = (*bitmap_in) & 0x10 ? 0xff : 0x00; + else if(i == 4) bitmap_out_tmp[x] = (*bitmap_in) & 0x08 ? 0xff : 0x00; + else if(i == 5) bitmap_out_tmp[x] = (*bitmap_in) & 0x04 ? 0xff : 0x00; + else if(i == 6) bitmap_out_tmp[x] = (*bitmap_in) & 0x02 ? 0xff : 0x00; + else if(i == 7) { + bitmap_out_tmp[x] = (*bitmap_in) & 0x01 ? 0xff : 0x00; + line_rem--; + bitmap_in++; + } + } + /*Handle stride*/ + if(stride_in) { + i = 0; /*If there is a stride start from the next byte in the next line*/ + bitmap_in += line_rem; + } + bitmap_out_tmp += stride_out; + } + } + else if(fdsc->bpp == 2) { + for(y = 0; y < gdsc->box_h; y ++) { + uint32_t line_rem = stride_in != 0 ? stride_in : gdsc->box_w; + for(x = 0; x < gdsc->box_w; x++, i++) { + i = i & 0x3; + if(i == 0) bitmap_out_tmp[x] = opa2_table[(*bitmap_in) >> 6]; + else if(i == 1) bitmap_out_tmp[x] = opa2_table[((*bitmap_in) >> 4) & 0x3]; + else if(i == 2) bitmap_out_tmp[x] = opa2_table[((*bitmap_in) >> 2) & 0x3]; + else if(i == 3) { + bitmap_out_tmp[x] = opa2_table[((*bitmap_in) >> 0) & 0x3]; + line_rem--; + bitmap_in++; + } + } + + /*Handle stride*/ + if(stride_in) { + i = 0; /*If there is a stride start from the next byte in the next line*/ + bitmap_in += line_rem; + } + bitmap_out_tmp += stride_out; + } + + } + else if(fdsc->bpp == 4) { + for(y = 0; y < gdsc->box_h; y ++) { + uint16_t line_rem = stride_in != 0 ? stride_in : gdsc->box_w; + for(x = 0; x < gdsc->box_w; x++, i++) { + i = i & 0x1; + if(i == 0) { + bitmap_out_tmp[x] = opa4_table[(*bitmap_in) >> 4]; + } + else if(i == 1) { + bitmap_out_tmp[x] = opa4_table[(*bitmap_in) & 0xF]; + line_rem--; + bitmap_in++; + } + } + + /*Handle stride*/ + if(stride_in) { + i = 0; /*If there is a stride start from the next byte in the next line*/ + bitmap_in += line_rem; + } + bitmap_out_tmp += stride_out; + } + } + else if(fdsc->bpp == 8) { + for(y = 0; y < gdsc->box_h; y ++) { + uint16_t line_rem = stride_in != 0 ? stride_in : gdsc->box_w; + for(x = 0; x < gdsc->box_w; x++, i++) { + bitmap_out_tmp[x] = *bitmap_in; + line_rem--; + bitmap_in++; + } + bitmap_out_tmp += stride_out; + bitmap_in += line_rem; + } + } + + lv_draw_buf_flush_cache(draw_buf, NULL); + return draw_buf; + } + /*Handle compressed bitmap*/ + else { +#if LV_USE_FONT_COMPRESSED + bool prefilter = fdsc->bitmap_format == LV_FONT_FMT_TXT_COMPRESSED; + decompress(&fdsc->glyph_bitmap[gdsc->bitmap_index], bitmap_out, gdsc->box_w, gdsc->box_h, + (uint8_t)fdsc->bpp, prefilter); + lv_draw_buf_flush_cache(draw_buf, NULL); + return draw_buf; +#else /*!LV_USE_FONT_COMPRESSED*/ + LV_LOG_WARN("Compressed fonts is used but LV_USE_FONT_COMPRESSED is not enabled in lv_conf.h"); + return NULL; +#endif + } + + /*If not returned earlier then the letter is not found in this font*/ + return NULL; +} + +bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + /*It fixes a strange compiler optimization issue: https://github.com/lvgl/lvgl/issues/4370*/ + bool is_tab = unicode_letter == '\t'; + if(is_tab) { + unicode_letter = ' '; + } + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + uint32_t gid = get_glyph_dsc_id(font, unicode_letter); + if(!gid) return false; + + int8_t kvalue = 0; + if(fdsc->kern_dsc) { + uint32_t gid_next = get_glyph_dsc_id(font, unicode_letter_next); + if(gid_next) { + kvalue = get_kern_value(font, gid, gid_next); + } + } + + /*Put together a glyph dsc*/ + const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; + + int32_t kv = ((int32_t)((int32_t)kvalue * fdsc->kern_scale) >> 4); + + uint32_t adv_w = gdsc->adv_w; + if(is_tab) adv_w *= 2; + + adv_w += kv; + adv_w = (adv_w + (1 << 3)) >> 4; + + dsc_out->adv_w = adv_w; + dsc_out->box_h = gdsc->box_h; + dsc_out->box_w = gdsc->box_w; + dsc_out->ofs_x = gdsc->ofs_x; + dsc_out->ofs_y = gdsc->ofs_y; + + if(fdsc->stride == 0) dsc_out->stride = 0; + else { + /*E.g. w = 5, bpp = 2, means 2 bytes/line*/ + uint32_t bit_count = dsc_out->box_w * fdsc->bpp; + uint32_t width_in_bytes = (bit_count + 7) >> 3; /*No division round up*/ + + /*E.g. font_dsc stride == 4 means align to 4 byte boundary. + *In glyph_dsc store the actual line length in bytes*/ + dsc_out->stride = LV_ROUND_UP(width_in_bytes, fdsc->stride); + } + + dsc_out->format = (uint8_t)fdsc->bpp; + dsc_out->is_placeholder = false; + dsc_out->gid.index = gid; + + if(is_tab) dsc_out->box_w = dsc_out->box_w * 2; + + return true; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter) +{ + if(letter == '\0') return 0; + + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + + uint16_t i; + for(i = 0; i < fdsc->cmap_num; i++) { + + /*Relative code point*/ + uint32_t rcp = letter - fdsc->cmaps[i].range_start; + if(rcp >= fdsc->cmaps[i].range_length) continue; + uint32_t glyph_id = 0; + if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY) { + glyph_id = fdsc->cmaps[i].glyph_id_start + rcp; + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL) { + const uint8_t * gid_ofs_8 = fdsc->cmaps[i].glyph_id_ofs_list; + /* The first character is always valid and should have offset = 0 + * However if a character is missing it also has offset=0. + * So if there is a 0 not on the first position then it's a missing character */ + if(gid_ofs_8[rcp] == 0 && letter != fdsc->cmaps[i].range_start) continue; + glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_8[rcp]; + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_TINY) { + uint16_t key = rcp; + uint16_t * p = lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, + sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); + + if(p) { + lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + (uint32_t) ofs; + } + } + else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { + uint16_t key = rcp; + uint16_t * p = lv_utils_bsearch(&key, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, + sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); + + if(p) { + lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list; + const uint16_t * gid_ofs_16 = fdsc->cmaps[i].glyph_id_ofs_list; + glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_16[ofs]; + } + } + + return glyph_id; + } + + return 0; + +} + +static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right) +{ + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *)font->dsc; + + int8_t value = 0; + + if(fdsc->kern_classes == 0) { + /*Kern pairs*/ + const lv_font_fmt_txt_kern_pair_t * kdsc = fdsc->kern_dsc; + if(kdsc->glyph_ids_size == 0) { + /*Use binary search to find the kern value. + *The pairs are ordered left_id first, then right_id secondly.*/ + const uint16_t * g_ids = kdsc->glyph_ids; + kern_pair_ref_t g_id_both = {gid_left, gid_right}; + uint16_t * kid_p = lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 2, kern_pair_8_compare); + + /*If the `g_id_both` were found get its index from the pointer*/ + if(kid_p) { + lv_uintptr_t ofs = kid_p - g_ids; + value = kdsc->values[ofs]; + } + } + else if(kdsc->glyph_ids_size == 1) { + /*Use binary search to find the kern value. + *The pairs are ordered left_id first, then right_id secondly.*/ + const uint32_t * g_ids = kdsc->glyph_ids; + kern_pair_ref_t g_id_both = {gid_left, gid_right}; + uint32_t * kid_p = lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 4, kern_pair_16_compare); + + /*If the `g_id_both` were found get its index from the pointer*/ + if(kid_p) { + lv_uintptr_t ofs = kid_p - g_ids; + value = kdsc->values[ofs]; + } + + } + else { + /*Invalid value*/ + } + } + else { + /*Kern classes*/ + const lv_font_fmt_txt_kern_classes_t * kdsc = fdsc->kern_dsc; + uint8_t left_class = kdsc->left_class_mapping[gid_left]; + uint8_t right_class = kdsc->right_class_mapping[gid_right]; + + /*If class = 0, kerning not exist for that glyph + *else got the value form `class_pair_values` 2D array*/ + if(left_class > 0 && right_class > 0) { + value = kdsc->class_pair_values[(left_class - 1) * kdsc->right_class_cnt + (right_class - 1)]; + } + + } + return value; +} + +static int kern_pair_8_compare(const void * ref, const void * element) +{ + const kern_pair_ref_t * ref8_p = ref; + const uint8_t * element8_p = element; + + /*If the MSB is different it will matter. If not return the diff. of the LSB*/ + if(ref8_p->gid_left != element8_p[0]) return ref8_p->gid_left - element8_p[0]; + else return ref8_p->gid_right - element8_p[1]; +} + +static int kern_pair_16_compare(const void * ref, const void * element) +{ + const kern_pair_ref_t * ref16_p = ref; + const uint16_t * element16_p = element; + + /*If the MSB is different it will matter. If not return the diff. of the LSB*/ + if(ref16_p->gid_left != element16_p[0]) return ref16_p->gid_left - element16_p[0]; + else return ref16_p->gid_right - element16_p[1]; +} + +#if LV_USE_FONT_COMPRESSED + +/** + * The compress a glyph's bitmap + * @param in the compressed bitmap + * @param out buffer to store the result + * @param px_num number of pixels in the glyph (width * height) + * @param bpp bit per pixel (bpp = 3 will be converted to bpp = 4) + * @param prefilter true: the lines are XORed + */ +static void decompress(const uint8_t * in, uint8_t * out, int32_t w, int32_t h, uint8_t bpp, bool prefilter) +{ + const lv_opa_t * opa_table; + switch(bpp) { + case 2: + opa_table = opa2_table; + break; + case 3: + opa_table = opa3_table; + break; + case 4: + opa_table = opa4_table; + break; + default: + LV_LOG_WARN("%d bpp is not handled", bpp); + return; + } + + rle_init(in, bpp); + + uint8_t * line_buf1 = lv_malloc(w); + + uint8_t * line_buf2 = NULL; + + if(prefilter) { + line_buf2 = lv_malloc(w); + } + + decompress_line(line_buf1, w); + + int32_t y; + int32_t x; + uint32_t stride = lv_draw_buf_width_to_stride(w, LV_COLOR_FORMAT_A8); + + for(x = 0; x < w; x++) { + out[x] = opa_table[line_buf1[x]]; + } + out += stride; + + for(y = 1; y < h; y++) { + if(prefilter) { + decompress_line(line_buf2, w); + + for(x = 0; x < w; x++) { + line_buf1[x] = line_buf2[x] ^ line_buf1[x]; + out[x] = opa_table[line_buf1[x]]; + } + } + else { + decompress_line(line_buf1, w); + + for(x = 0; x < w; x++) { + out[x] = opa_table[line_buf1[x]]; + } + } + out += stride; + } + + lv_free(line_buf1); + lv_free(line_buf2); +} + +/** + * Decompress one line. Store one pixel per byte + * @param out output buffer + * @param w width of the line in pixel count + */ +static inline void decompress_line(uint8_t * out, int32_t w) +{ + int32_t i; + for(i = 0; i < w; i++) { + out[i] = rle_next(); + } +} + +/** + * Read bits from an input buffer. The read can cross byte boundary. + * @param in the input buffer to read from. + * @param bit_pos index of the first bit to read. + * @param len number of bits to read (must be <= 8). + * @return the read bits + */ +static inline uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len) +{ + uint8_t bit_mask; + switch(len) { + case 1: + bit_mask = 0x1; + break; + case 2: + bit_mask = 0x3; + break; + case 3: + bit_mask = 0x7; + break; + case 4: + bit_mask = 0xF; + break; + case 8: + bit_mask = 0xFF; + break; + default: + bit_mask = (uint16_t)((uint16_t) 1 << len) - 1; + } + + uint32_t byte_pos = bit_pos >> 3; + bit_pos = bit_pos & 0x7; + + if(bit_pos + len >= 8) { + uint16_t in16 = (in[byte_pos] << 8) + in[byte_pos + 1]; + return (in16 >> (16 - bit_pos - len)) & bit_mask; + } + else { + return (in[byte_pos] >> (8 - bit_pos - len)) & bit_mask; + } +} + +static inline void rle_init(const uint8_t * in, uint8_t bpp) +{ + lv_font_fmt_rle_t * rle = &font_rle; + rle->in = in; + rle->bpp = bpp; + rle->state = RLE_STATE_SINGLE; + rle->rdp = 0; + rle->prev_v = 0; + rle->count = 0; +} + +static inline uint8_t rle_next(void) +{ + uint8_t v = 0; + uint8_t ret = 0; + lv_font_fmt_rle_t * rle = &font_rle; + + if(rle->state == RLE_STATE_SINGLE) { + ret = get_bits(rle->in, rle->rdp, rle->bpp); + if(rle->rdp != 0 && rle->prev_v == ret) { + rle->count = 0; + rle->state = RLE_STATE_REPEATED; + } + + rle->prev_v = ret; + rle->rdp += rle->bpp; + } + else if(rle->state == RLE_STATE_REPEATED) { + v = get_bits(rle->in, rle->rdp, 1); + rle->count++; + rle->rdp += 1; + if(v == 1) { + ret = rle->prev_v; + if(rle->count == 11) { + rle->count = get_bits(rle->in, rle->rdp, 6); + rle->rdp += 6; + if(rle->count != 0) { + rle->state = RLE_STATE_COUNTER; + } + else { + ret = get_bits(rle->in, rle->rdp, rle->bpp); + rle->prev_v = ret; + rle->rdp += rle->bpp; + rle->state = RLE_STATE_SINGLE; + } + } + } + else { + ret = get_bits(rle->in, rle->rdp, rle->bpp); + rle->prev_v = ret; + rle->rdp += rle->bpp; + rle->state = RLE_STATE_SINGLE; + } + + } + else if(rle->state == RLE_STATE_COUNTER) { + ret = rle->prev_v; + rle->count--; + if(rle->count == 0) { + ret = get_bits(rle->in, rle->rdp, rle->bpp); + rle->prev_v = ret; + rle->rdp += rle->bpp; + rle->state = RLE_STATE_SINGLE; + } + } + + return ret; +} +#endif /*LV_USE_FONT_COMPRESSED*/ + +/** Code Comparator. + * + * Compares the value of both input arguments. + * + * @param[in] pRef Pointer to the reference. + * @param[in] pElement Pointer to the element to compare. + * + * @return Result of comparison. + * @retval < 0 Reference is less than element. + * @retval = 0 Reference is equal to element. + * @retval > 0 Reference is greater than element. + * + */ +static int unicode_list_compare(const void * ref, const void * element) +{ + return (*(uint16_t *)ref) - (*(uint16_t *)element); +} + +static lv_font_t * builtin_font_create_cb(const lv_font_info_t * info, const void * src) +{ + const lv_builtin_font_src_t * font_src = src; + + /** + * If a crash occurs here, please check whether the last font in + * the lv_builtin_font_src array is set to NULL as required to mark the end of the array. + */ + while(font_src->font_p) { + if(info->size == font_src->size) { + return (lv_font_t *)font_src->font_p; + } + font_src++; + } + + LV_LOG_WARN("No built-in font found with size: %" LV_PRIu32, info->size); + return NULL; +} + +static void builtin_font_delete_cb(lv_font_t * font) +{ + /*Nothing to delete*/ + LV_UNUSED(font); +} + +static void * builtin_font_dup_src_cb(const void * src) +{ + const lv_builtin_font_src_t * font_src = src; + uint32_t len = 0; + + /*Measure the size of the source data*/ + + /** + * If a crash occurs here, please check whether the last font in + * the lv_builtin_font_src array is set to NULL as required to mark the end of the array. + */ + while(font_src->font_p) { + len++; + font_src++; + } + + if(len == 0) { + LV_LOG_WARN("No source data found"); + return NULL; + } + + lv_builtin_font_src_t * new_src = lv_malloc_zeroed(sizeof(lv_builtin_font_src_t) * (len + 1)); + LV_ASSERT_MALLOC(new_src); + lv_memcpy(new_src, src, sizeof(lv_builtin_font_src_t) * len); + + return new_src; +} + +static void builtin_font_free_src_cb(void * src) +{ + lv_free(src); +} diff --git a/inc/lvgl/src/font/fmt_txt/lv_font_fmt_txt.h b/inc/lvgl/src/font/fmt_txt/lv_font_fmt_txt.h new file mode 100644 index 0000000..9620617 --- /dev/null +++ b/inc/lvgl/src/font/fmt_txt/lv_font_fmt_txt.h @@ -0,0 +1,239 @@ +/** + * @file lv_font_fmt_txt.h + * + */ + +#ifndef LV_FONT_FMT_TXT_H +#define LV_FONT_FMT_TXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_font.h" +#include "../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** This describes a glyph.*/ +typedef struct { +#if LV_FONT_FMT_TXT_LARGE == 0 + uint32_t bitmap_index : 20; /**< Start index of the bitmap. A font can be max 1 MB.*/ + uint32_t adv_w : 12; /**< Draw the next glyph after this width. 8.4 format (real_value * 16 is stored).*/ + uint8_t box_w; /**< Width of the glyph's bounding box*/ + uint8_t box_h; /**< Height of the glyph's bounding box*/ + int8_t ofs_x; /**< x offset of the bounding box*/ + int8_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ +#else + uint32_t bitmap_index; /**< Start index of the bitmap. A font can be max 4 GB.*/ + uint32_t adv_w; /**< Draw the next glyph after this width. 28.4 format (real_value * 16 is stored).*/ + uint16_t box_w; /**< Width of the glyph's bounding box*/ + uint16_t box_h; /**< Height of the glyph's bounding box*/ + int16_t ofs_x; /**< x offset of the bounding box*/ + int16_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ +#endif +} lv_font_fmt_txt_glyph_dsc_t; + +/** Format of font character map.*/ +typedef enum { + LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL, + LV_FONT_FMT_TXT_CMAP_SPARSE_FULL, + LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, + LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, +} lv_font_fmt_txt_cmap_type_t; + +/** + * Map codepoints to a `glyph_dsc`s + * Several formats are supported to optimize memory usage + * See https://github.com/lvgl/lv_font_conv/blob/master/doc/font_spec.md + */ +typedef struct { + /** First Unicode character for this range*/ + uint32_t range_start; + + /** Number of Unicode characters related to this range. + * Last Unicode character = range_start + range_length - 1*/ + uint16_t range_length; + + /** First glyph ID (array index of `glyph_dsc`) for this range*/ + uint16_t glyph_id_start; + + /* + According the specification there are 4 formats: + https://github.com/lvgl/lv_font_conv/blob/master/doc/font_spec.md + + For simplicity introduce "relative code point": + rcp = codepoint - range_start + + and a search function: + search a "value" in an "array" and returns the index of "value". + + Format 0 tiny + unicode_list == NULL && glyph_id_ofs_list == NULL + glyph_id = glyph_id_start + rcp + + Format 0 full + unicode_list == NULL && glyph_id_ofs_list != NULL + glyph_id = glyph_id_start + glyph_id_ofs_list[rcp] + + Sparse tiny + unicode_list != NULL && glyph_id_ofs_list == NULL + glyph_id = glyph_id_start + search(unicode_list, rcp) + + Sparse full + unicode_list != NULL && glyph_id_ofs_list != NULL + glyph_id = glyph_id_start + glyph_id_ofs_list[search(unicode_list, rcp)] + */ + + const uint16_t * unicode_list; + + /** if(type == LV_FONT_FMT_TXT_CMAP_FORMAT0_...) it's `uint8_t *` + * if(type == LV_FONT_FMT_TXT_CMAP_SPARSE_...) it's `uint16_t *` + */ + const void * glyph_id_ofs_list; + + /** Length of `unicode_list` and/or `glyph_id_ofs_list`*/ + uint16_t list_length; + + /** Type of this character map*/ + lv_font_fmt_txt_cmap_type_t type; +} lv_font_fmt_txt_cmap_t; + +/** A simple mapping of kern values from pairs*/ +typedef struct { + /*To get a kern value of two code points: + 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t + 2. for(i = 0; i < pair_cnt * 2; i += 2) + if(glyph_ids[i] == glyph_id_left && + glyph_ids[i+1] == glyph_id_right) + return values[i / 2]; + */ + const void * glyph_ids; + const int8_t * values; + uint32_t pair_cnt : 30; + uint32_t glyph_ids_size : 2; /**< 0: `glyph_ids` is stored as `uint8_t`; 1: as `uint16_t` */ +} lv_font_fmt_txt_kern_pair_t; + +/** More complex but more optimal class based kern value storage*/ +typedef struct { + /*To get a kern value of two code points: + 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t + 2. Get the class of the left and right glyphs as `left_class` and `right_class` + left_class = left_class_mapping[glyph_id_left]; + right_class = right_class_mapping[glyph_id_right]; + 3. value = class_pair_values[(left_class-1)*right_class_cnt + (right_class-1)] + */ + + const int8_t * class_pair_values; /**< left_class_cnt * right_class_cnt value */ + const uint8_t * left_class_mapping; /**< Map the glyph_ids to classes: index -> glyph_id -> class_id */ + const uint8_t * right_class_mapping; /**< Map the glyph_ids to classes: index -> glyph_id -> class_id */ + uint8_t left_class_cnt; + uint8_t right_class_cnt; +} lv_font_fmt_txt_kern_classes_t; + +/** Bitmap formats*/ +typedef enum { + LV_FONT_FMT_TXT_PLAIN = 0, + LV_FONT_FMT_TXT_COMPRESSED = 1, + LV_FONT_FMT_TXT_COMPRESSED_NO_PREFILTER = 2, +} lv_font_fmt_txt_bitmap_format_t; + +/** Describe store for additional data for fonts */ +typedef struct { + /** The bitmaps of all glyphs */ + const uint8_t * glyph_bitmap; + + /** Describe the glyphs */ + const lv_font_fmt_txt_glyph_dsc_t * glyph_dsc; + + /** Map the glyphs to Unicode characters. + *Array of `lv_font_cmap_fmt_txt_t` variables */ + const lv_font_fmt_txt_cmap_t * cmaps; + + /** + * Store kerning values. + * Can be `lv_font_fmt_txt_kern_pair_t * or `lv_font_kern_classes_fmt_txt_t *` + * depending on `kern_classes` + */ + const void * kern_dsc; + + /** Scale kern values in 12.4 format */ + uint16_t kern_scale; + + /** Number of cmap tables */ + uint16_t cmap_num : 9; + + /** Bit per pixel: 1, 2, 3, 4, 8 */ + uint16_t bpp : 4; + + /** Type of `kern_dsc` */ + uint16_t kern_classes : 1; + + /** + * storage format of the bitmap + * from `lv_font_fmt_txt_bitmap_format_t` + */ + uint16_t bitmap_format : 2; + + /** + * Bytes to which each line is padded. + * 0: means no align and padding + * 1: e.g. with bpp=4 lines are aligned to 1 byte, so there can be a 4 bits of padding + * 4, 8, 16, 32, 64: each line is padded to the given byte boundaries + */ + uint8_t stride; +} lv_font_fmt_txt_dsc_t; + +typedef struct { + const lv_font_t * font_p; /**< Pointer to built-in font*/ + uint32_t size; /** < Size of the built-in font*/ +} lv_builtin_font_src_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_font_class_t lv_builtin_font_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Used as `get_glyph_bitmap` callback in lvgl's native font format if the font is uncompressed. + * @param g_dsc the glyph descriptor including which font to use, which supply the glyph_index and format. + * @param draw_buf a draw buffer that can be used to store the bitmap of the glyph, it's OK not to use it. + * @return pointer to an A8 bitmap (not necessarily bitmap_out) or NULL if `unicode_letter` not found + */ +const void * lv_font_get_bitmap_fmt_txt(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); + +/** + * Used as `get_glyph_dsc` callback in lvgl's native font format if the font is uncompressed. + * @param font pointer to font + * @param dsc_out store the result descriptor here + * @param unicode_letter a UNICODE letter code + * @param unicode_letter_next the unicode letter succeeding the letter under test + * @return true: descriptor is successfully loaded into `dsc_out`. + * false: the letter was not found, no data is loaded to `dsc_out` + */ +bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next); + +/********************** + * MACROS + **********************/ + +/********************** + * ADD BUILT IN FONTS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FONT_FMT_TXT_H*/ diff --git a/inc/lvgl/src/font/fmt_txt/lv_font_fmt_txt_private.h b/inc/lvgl/src/font/fmt_txt/lv_font_fmt_txt_private.h new file mode 100644 index 0000000..66df402 --- /dev/null +++ b/inc/lvgl/src/font/fmt_txt/lv_font_fmt_txt_private.h @@ -0,0 +1,56 @@ +/** + * @file lv_font_fmt_txt_private.h + * + */ + +#ifndef LV_FONT_FMT_TXT_PRIVATE_H +#define LV_FONT_FMT_TXT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_font_fmt_txt.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_FONT_COMPRESSED +typedef enum { + RLE_STATE_SINGLE = 0, + RLE_STATE_REPEATED, + RLE_STATE_COUNTER, +} lv_font_fmt_rle_state_t; + +typedef struct { + uint32_t rdp; + const uint8_t * in; + uint8_t bpp; + uint8_t prev_v; + uint8_t count; + lv_font_fmt_rle_state_t state; +} lv_font_fmt_rle_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FONT_FMT_TXT_PRIVATE_H*/ diff --git a/inc/lvgl/src/font/font_manager/lv_font_manager.c b/inc/lvgl/src/font/font_manager/lv_font_manager.c new file mode 100755 index 0000000..c608a40 --- /dev/null +++ b/inc/lvgl/src/font/font_manager/lv_font_manager.c @@ -0,0 +1,651 @@ +/** + * @file lv_font_manager.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_font_manager.h" + +#if LV_USE_FONT_MANAGER + +#include "lv_font_manager_recycle.h" +#include "../../misc/lv_ll.h" +#include "../../stdlib/lv_sprintf.h" + +/********************* + * DEFINES + *********************/ + +#define IS_FONT_FAMILY_NAME(name) (lv_strchr((name), ',') != NULL) +#define IS_FONT_HAS_FALLBACK(font) ((font)->fallback != NULL) + +/********************** + * TYPEDEFS + **********************/ + +/* font manager object */ +struct _lv_font_manager_t { + lv_ll_t refer_ll; /* font reference list */ + lv_ll_t rec_ll; /* lvgl font record list */ + lv_ll_t src_ll; /* font src record list */ + lv_font_manager_recycle_t * recycle_manager; +}; + +/* font reference node */ +typedef struct _lv_font_refer_node_t { + lv_font_t * font_p; + lv_font_info_t ft_info; + char name[LV_FONT_MANAGER_NAME_MAX_LEN]; /* name buffer */ + int ref_cnt; /* reference count */ +} lv_font_refer_node_t; + +/* lvgl font record node */ +typedef struct _lv_font_rec_node_t { + lv_font_t font; /* lvgl font info */ + const lv_font_refer_node_t * refer_node_p; /* referenced font resource */ +} lv_font_rec_node_t; + +typedef struct _lv_font_src_t { + char * name; + void * src; + bool is_static; + const lv_font_class_t * class_p; +} lv_font_src_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_font_src_t * lv_font_manager_get_src(lv_font_manager_t * manager, const char * name); + +static bool lv_font_manager_check_src_resource(lv_font_manager_t * manager, const char * name); +static bool lv_font_manager_check_resource(lv_font_manager_t * manager); +static lv_font_rec_node_t * lv_font_manager_search_rec_node(lv_font_manager_t * manager, lv_font_t * font); + +static const lv_font_refer_node_t * lv_font_manager_get_font(lv_font_manager_t * manager, + const lv_font_info_t * ft_info); +static bool lv_font_manager_drop_font(lv_font_manager_t * manager, const lv_font_refer_node_t * node); + +static lv_font_t * lv_font_manager_create_font_single(lv_font_manager_t * manager, const lv_font_info_t * ft_info); +static bool lv_font_manager_delete_font_single(lv_font_manager_t * manager, lv_font_t * font); + +static lv_font_t * lv_font_manager_create_font_family(lv_font_manager_t * manager, const lv_font_info_t * ft_info); +static void lv_font_manager_delete_font_family(lv_font_manager_t * manager, lv_font_t * font); + +static bool lv_font_manager_add_src_core(lv_font_manager_t * manager, const char * name, const char * path, + const lv_font_class_t * class_p, bool is_static); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_font_manager_t * lv_font_manager_create(uint32_t recycle_cache_size) +{ + LV_ASSERT_MSG(recycle_cache_size > 0, "recycle_cache_size should be greater than 0"); + lv_font_manager_t * manager = lv_malloc_zeroed(sizeof(lv_font_manager_t)); + LV_ASSERT_MALLOC(manager); + if(!manager) { + LV_LOG_ERROR("malloc failed for lv_font_manager_t"); + return NULL; + } + + lv_ll_init(&manager->refer_ll, sizeof(lv_font_refer_node_t)); + lv_ll_init(&manager->rec_ll, sizeof(lv_font_rec_node_t)); + lv_ll_init(&manager->src_ll, sizeof(lv_font_src_t)); + + manager->recycle_manager = lv_font_manager_recycle_create(recycle_cache_size); + + LV_LOG_INFO("success"); + return manager; +} + +bool lv_font_manager_delete(lv_font_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + + /* Resource leak check */ + if(lv_font_manager_check_resource(manager)) { + LV_LOG_ERROR("unfreed resource detected, delete failed!"); + return false; + } + + /* clean recycle_manager */ + lv_font_manager_recycle_delete(manager->recycle_manager); + + /* clean path map */ + lv_font_src_t * font_src; + LV_LL_READ(&manager->src_ll, font_src) { + LV_LOG_INFO("remove src: %s", font_src->name); + if(!font_src->is_static) { + lv_free(font_src->name); + font_src->class_p->free_src_cb(font_src->src); + } + + font_src->name = NULL; + font_src->src = NULL; + } + lv_ll_clear(&manager->src_ll); + + lv_free(manager); + + LV_LOG_INFO("success"); + return true; +} + +bool lv_font_manager_add_src(lv_font_manager_t * manager, + const char * name, + const void * src, + const lv_font_class_t * class_p) +{ + return lv_font_manager_add_src_core(manager, name, src, class_p, false); +} + +bool lv_font_manager_add_src_static(lv_font_manager_t * manager, + const char * name, + const void * src, + const lv_font_class_t * class_p) +{ + return lv_font_manager_add_src_core(manager, name, src, class_p, true); +} + +bool lv_font_manager_remove_src(lv_font_manager_t * manager, const char * name) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(name); + + lv_font_src_t * font_src = lv_font_manager_get_src(manager, name); + if(!font_src) { + LV_LOG_WARN("src: %s not found", name); + return false; + } + + if(lv_font_manager_check_src_resource(manager, name)) { + LV_LOG_ERROR("unfreed resource for font name %s detected, remove src failed!", name); + return false; + } + + lv_font_recycle_remove_fonts(manager->recycle_manager, name); + + lv_ll_remove(&manager->src_ll, font_src); + + if(!font_src->is_static) { + lv_free(font_src->name); + font_src->class_p->free_src_cb(font_src->src); + } + + font_src->name = NULL; + font_src->src = NULL; + + lv_free(font_src); + + LV_LOG_WARN("src: %s remove success", name); + return true; +} + +lv_font_t * lv_font_manager_create_font(lv_font_manager_t * manager, + const char * font_family, + uint32_t render_mode, + uint32_t size, + uint32_t style, + lv_font_kerning_t kerning) +{ + + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(font_family); + + lv_font_info_t ft_info; + lv_memzero(&ft_info, sizeof(ft_info)); + ft_info.name = font_family; + ft_info.render_mode = render_mode; + ft_info.size = size; + ft_info.style = style; + ft_info.kerning = kerning; + + lv_font_t * ret_font; + + if(IS_FONT_FAMILY_NAME(ft_info.name)) { + ret_font = lv_font_manager_create_font_family(manager, &ft_info); + } + else { + ret_font = lv_font_manager_create_font_single(manager, &ft_info); + } + + /* Append fallback font to make LV_SYMBOL displayable */ + lv_font_t * cur_font = ret_font; + while(cur_font) { + if(cur_font->fallback == NULL) { + cur_font->fallback = LV_FONT_DEFAULT; + break; + } + cur_font = (lv_font_t *)cur_font->fallback; + } + + return ret_font; +} + +void lv_font_manager_delete_font(lv_font_manager_t * manager, lv_font_t * font) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(font); + + if(IS_FONT_HAS_FALLBACK(font)) { + lv_font_manager_delete_font_family(manager, font); + return; + } + + lv_font_manager_delete_font_single(manager, font); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_font_t * lv_font_manager_create_font_single(lv_font_manager_t * manager, const lv_font_info_t * ft_info) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(ft_info); + + const lv_font_refer_node_t * refer_node = lv_font_manager_get_font(manager, ft_info); + if(!refer_node) { + return NULL; + } + + /* add font record node */ + lv_font_rec_node_t * rec_node = lv_ll_ins_head(&manager->rec_ll); + LV_ASSERT_MALLOC(rec_node); + lv_memzero(rec_node, sizeof(lv_font_rec_node_t)); + + /* copy font data */ + rec_node->font = *refer_node->font_p; + + /* record reference font */ + rec_node->refer_node_p = refer_node; + + LV_LOG_INFO("success"); + return &rec_node->font; +} + +static bool lv_font_manager_delete_font_single(lv_font_manager_t * manager, lv_font_t * font) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(font); + + if(font == LV_FONT_DEFAULT) { + LV_LOG_INFO("LV_FONT_DEFAULT can not be deleted"); + return false; + } + + /* check font is created by font manager */ + lv_font_rec_node_t * rec_node = lv_font_manager_search_rec_node(manager, font); + if(!rec_node) { + LV_LOG_WARN("NO record found for font: %p(%d)," + " it was not created by font manager", + (void *)font, (int)font->line_height); + return false; + } + + bool retval = lv_font_manager_drop_font(manager, rec_node->refer_node_p); + LV_ASSERT(retval); + + /* free rec_node */ + lv_ll_remove(&manager->rec_ll, rec_node); + lv_free(rec_node); + + LV_LOG_INFO("success"); + return retval; +} + +static const char * strncpy_until(char * dest, const char * src, size_t n, char c) +{ + LV_ASSERT_NULL(dest); + LV_ASSERT_NULL(src); + + size_t i = 0; + while(i < n && *src != '\0' && *src != c) { + *dest++ = *src++; + i++; + } + + if(i < n) { + *dest = '\0'; + } + + return src; +} + +static lv_font_t * lv_font_manager_create_font_family(lv_font_manager_t * manager, const lv_font_info_t * ft_info) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(ft_info); + + lv_font_t * first_font = NULL; + lv_font_t * pre_font = NULL; + + const char * family_str = ft_info->name; + LV_LOG_INFO("font-family: %s", family_str); + + char tmp_name[LV_FONT_MANAGER_NAME_MAX_LEN] = { 0 }; + lv_font_info_t tmp_ft_info = *ft_info; + tmp_ft_info.name = tmp_name; + + while(1) { + family_str = strncpy_until(tmp_name, family_str, sizeof(tmp_name) - 1, ','); + + lv_font_t * cur_font = lv_font_manager_create_font_single(manager, &tmp_ft_info); + + if(cur_font) { + /* save first font pointer */ + if(!first_font) { + first_font = cur_font; + } + + /* append font fallback */ + if(pre_font) { + pre_font->fallback = cur_font; + } + + pre_font = cur_font; + } + + /* stop */ + if(*family_str == '\0') { + break; + } + + if(*family_str != ',') { + LV_LOG_ERROR("font name buffer is too small, please increase LV_FONT_MANAGER_NAME_MAX_LEN"); + break; + } + + /* skip ',' */ + family_str++; + } + + return first_font; +} + +static void lv_font_manager_delete_font_family(lv_font_manager_t * manager, lv_font_t * font) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(font); + + lv_font_t * f = font; + while(f) { + lv_font_t * fallback = (lv_font_t *)f->fallback; + lv_font_manager_delete_font_single(manager, f); + f = fallback; + } +} + +static bool lv_font_manager_add_src_core(lv_font_manager_t * manager, + const char * name, + const char * src, + const lv_font_class_t * class_p, + bool is_static) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(name); + LV_ASSERT_NULL(src); + LV_ASSERT_NULL(class_p); + + if(lv_font_manager_get_src(manager, name)) { + LV_LOG_WARN("name: %s already exists", name); + return false; + } + + lv_font_src_t * font_src = lv_ll_ins_tail(&manager->src_ll); + LV_ASSERT_MALLOC(font_src); + lv_memzero(font_src, sizeof(lv_font_src_t)); + font_src->is_static = is_static; + font_src->class_p = class_p; + + if(is_static) { + font_src->name = (char *)name; + font_src->src = (void *)src; + } + else { + font_src->name = lv_strdup(name); + LV_ASSERT_MALLOC(font_src->name); + + font_src->src = font_src->class_p->dup_src_cb(src); + LV_ASSERT_NULL(font_src->src); + } + + LV_LOG_INFO("name: %s, src: %p add success", name, (void *)src); + return true; +} + +static lv_font_src_t * lv_font_manager_get_src(lv_font_manager_t * manager, const char * name) +{ + lv_font_src_t * font_src; + LV_LL_READ(&manager->src_ll, font_src) { + if(lv_strcmp(name, font_src->name) == 0) { + return font_src; + } + } + + return NULL; +} + +static bool lv_font_manager_check_resource(lv_font_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + + /* Check the recorded font */ + lv_ll_t * rec_ll = &manager->rec_ll; + uint32_t rec_ll_len = lv_ll_get_len(rec_ll); + if(rec_ll_len) { + LV_LOG_WARN("lvgl font resource[%" LV_PRIu32 "]:", rec_ll_len); + + lv_font_rec_node_t * node; + LV_LL_READ(rec_ll, node) { + LV_LOG_WARN("font: %p(%d) -> ref: %s(%d)", + (void *)node, + (int)node->font.line_height, + node->refer_node_p->ft_info.name, + node->refer_node_p->ft_info.size); + } + } + + /* Check the recorded font resources created by font creator */ + lv_ll_t * refer_ll = &manager->refer_ll; + uint32_t refer_ll_len = lv_ll_get_len(refer_ll); + if(refer_ll_len) { + LV_LOG_WARN("font resource[%" LV_PRIu32 "]:", refer_ll_len); + + lv_font_refer_node_t * node; + LV_LL_READ(refer_ll, node) { + LV_LOG_WARN("font: %s(%d), ref_cnt = %d", + node->ft_info.name, + node->ft_info.size, + node->ref_cnt); + } + } + + /* Check resource leak */ + bool has_resource = (rec_ll_len || refer_ll_len); + + return has_resource; +} + +static bool lv_font_manager_check_src_resource(lv_font_manager_t * manager, const char * name) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(name); + + bool has_resource = false; + lv_ll_t * refer_ll = &manager->refer_ll; + uint32_t refer_ll_len = lv_ll_get_len(refer_ll); + if(refer_ll_len) { + lv_font_refer_node_t * node; + LV_LL_READ(refer_ll, node) { + if(lv_strcmp(name, node->name) == 0) { + has_resource = true; + LV_LOG_WARN("font: %s(%d), ref_cnt = %d", + node->ft_info.name, + node->ft_info.size, + node->ref_cnt); + } + } + } + + return has_resource; +} + +static lv_font_rec_node_t * lv_font_manager_search_rec_node(lv_font_manager_t * manager, lv_font_t * font) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(font); + + lv_font_rec_node_t * rec_node; + LV_LL_READ(&manager->rec_ll, rec_node) { + if(font == &rec_node->font) { + LV_LOG_INFO("font: %p(%d) matched", (void *)font, (int)font->line_height); + return rec_node; + } + } + + return NULL; +} + +static lv_font_refer_node_t * lv_font_manager_search_refer_node(lv_font_manager_t * manager, + const lv_font_info_t * ft_info) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(ft_info); + + lv_font_refer_node_t * refer_node; + LV_LL_READ(&manager->refer_ll, refer_node) { + if(lv_font_info_is_equal(ft_info, &refer_node->ft_info)) { + LV_LOG_INFO("font: %s(%d) matched", ft_info->name, ft_info->size); + return refer_node; + } + } + + return NULL; +} + +static lv_font_t * lv_font_manager_create_font_wrapper(lv_font_manager_t * manager, const lv_font_info_t * ft_info) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(ft_info); + + lv_font_t * font; + + /* create font */ + font = lv_font_manager_recycle_get_reuse(manager->recycle_manager, ft_info); + + /* get reuse font from recycle */ + if(font) { + return font; + } + + /* cache miss */ + + const lv_font_src_t * font_src = lv_font_manager_get_src(manager, ft_info->name); + if(!font_src) { + LV_LOG_ERROR("name: %s not found src", ft_info->name); + return NULL; + } + + font = font_src->class_p->create_cb(ft_info, font_src->src); + if(!font) { + LV_LOG_ERROR("font create failed, name: %s, render_mode: %d, size: %d, style: %d", + ft_info->name, ft_info->render_mode, ft_info->size, ft_info->style); + return NULL; + } + + return font; +} + +static void lv_font_manager_delete_font_wrapper(lv_font_manager_t * manager, lv_font_refer_node_t * refer_node) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(refer_node); + lv_font_manager_recycle_set_reuse(manager->recycle_manager, refer_node->font_p, &refer_node->ft_info); +} + +static const lv_font_refer_node_t * lv_font_manager_get_font(lv_font_manager_t * manager, + const lv_font_info_t * ft_info) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(ft_info); + + /* check refer_node is existed */ + lv_font_refer_node_t * refer_node = lv_font_manager_search_refer_node(manager, ft_info); + if(refer_node) { + refer_node->ref_cnt++; + LV_LOG_INFO("refer_node existed, ref_cnt++ = %d", refer_node->ref_cnt); + return refer_node; + } + + /* not found refer_node, start to create font */ + + lv_font_t * font = lv_font_manager_create_font_wrapper(manager, ft_info); + + if(!font) { + return NULL; + } + + /* add refer_node to refer_ll */ + refer_node = lv_ll_ins_head(&manager->refer_ll); + LV_ASSERT_MALLOC(refer_node); + lv_memzero(refer_node, sizeof(lv_font_refer_node_t)); + + lv_strncpy(refer_node->name, ft_info->name, sizeof(refer_node->name) - 1); + + const lv_font_src_t * font_src = lv_font_manager_get_src(manager, ft_info->name); + LV_ASSERT_NULL(font_src); + + /* copy font data */ + refer_node->font_p = font; + refer_node->ft_info = *ft_info; + refer_node->ft_info.name = refer_node->name; + refer_node->ft_info.class_p = font_src->class_p; + refer_node->ref_cnt = 1; + + LV_LOG_INFO("success"); + return refer_node; +} + +static bool lv_font_manager_drop_font(lv_font_manager_t * manager, const lv_font_refer_node_t * node) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(node); + + /* Check refer_node is existed */ + lv_font_refer_node_t * refer_node = lv_font_manager_search_refer_node(manager, &node->ft_info); + if(!refer_node) { + LV_LOG_WARN("NO record found for font: %s(%d)," + " it was not created by font manager", + node->ft_info.name, node->ft_info.size); + return false; + } + + refer_node->ref_cnt--; + + /* If ref_cnt is > 0, no need to delete font */ + if(refer_node->ref_cnt > 0) { + LV_LOG_INFO("refer_node existed, ref_cnt-- = %d", refer_node->ref_cnt); + return true; + } + + /* if ref_cnt is about to be 0, free font resource */ + lv_font_manager_delete_font_wrapper(manager, refer_node); + + /* free refer_node */ + lv_ll_remove(&manager->refer_ll, refer_node); + lv_free(refer_node); + + LV_LOG_INFO("success"); + return true; +} + +#endif /* LV_USE_FONT_MANAGER */ diff --git a/inc/lvgl/src/font/font_manager/lv_font_manager.h b/inc/lvgl/src/font/font_manager/lv_font_manager.h new file mode 100755 index 0000000..e4e1b76 --- /dev/null +++ b/inc/lvgl/src/font/font_manager/lv_font_manager.h @@ -0,0 +1,115 @@ +/** + * @file lv_font_manager.h + * + */ +#ifndef LV_FONT_MANAGER_H +#define LV_FONT_MANAGER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../font/lv_font.h" + +#if LV_USE_FONT_MANAGER + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create main font manager. + * @param recycle_cache_size number of fonts that were recently deleted from the cache. + * @return pointer to main font manager. + */ +lv_font_manager_t * lv_font_manager_create(uint32_t recycle_cache_size); + +/** + * Delete main font manager. + * @param manager pointer to main font manager. + * @return return true if the deletion was successful. + */ +bool lv_font_manager_delete(lv_font_manager_t * manager); + +/** + * Add font resource. + * @param manager pointer to main font manager. + * @param name font name. + * @param src font source. Need to strictly correspond to the font class. + * @param class_p font class. eg. lv_freetype_font_class, lv_builtin_font_class. + * @return return true if the add was successful. + */ +bool lv_font_manager_add_src(lv_font_manager_t * manager, + const char * name, + const void * src, + const lv_font_class_t * class_p); + +/** + * Add font resource with static memory. + * @param manager pointer to main font manager. + * @param name font name. It cannot be a local variable. + * @param src font source. Need to strictly correspond to the font class. And it cannot be a local variable. + * @param class_p font class. E.g. lv_freetype_font_class, lv_builtin_font_class. + * @return return true if the add was successful. + */ +bool lv_font_manager_add_src_static(lv_font_manager_t * manager, + const char * name, + const void * src, + const lv_font_class_t * class_p); + +/** + * Remove font resource. + * @param manager pointer to main font manager. + * @param name font name. + * @return return true if the remove was successful. + */ +bool lv_font_manager_remove_src(lv_font_manager_t * manager, const char * name); + +/** + * Create font. + * @param manager pointer to main font manager. + * @param font_family font family name. Matches the font resource name, using commas to separate different names. E.g. "my_font_1,my_font_2". + * @param render_mode font render mode. see `lv_freetype_font_render_mode_t`. + * @param size font size in pixel. + * @param style font style. see `lv_freetype_font_style_t`. + * @param kerning kerning mode. see `lv_font_kerning_t`. + * @return point to the created font. + */ +lv_font_t * lv_font_manager_create_font(lv_font_manager_t * manager, + const char * font_family, + uint32_t render_mode, + uint32_t size, + uint32_t style, + lv_font_kerning_t kerning); + +/** + * Delete font. + * @param manager pointer to main font manager. + * @param font point to the font. + * @return return true if the deletion was successful. + */ +void lv_font_manager_delete_font(lv_font_manager_t * manager, lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_FONT_MANAGER */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_FONT_MANAGER_H */ diff --git a/inc/lvgl/src/font/font_manager/lv_font_manager_recycle.c b/inc/lvgl/src/font/font_manager/lv_font_manager_recycle.c new file mode 100755 index 0000000..9e56430 --- /dev/null +++ b/inc/lvgl/src/font/font_manager/lv_font_manager_recycle.c @@ -0,0 +1,188 @@ +/** + * @file lv_font_manager_recycle.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_font_manager_recycle.h" + +#if LV_USE_FONT_MANAGER + +#include "../../font/lv_font.h" +#include "../../misc/lv_ll.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_font_manager_recycle_t { + lv_ll_t recycle_ll; + uint32_t max_size; +}; + +typedef struct { + lv_font_info_t ft_info; + char name[LV_FONT_MANAGER_NAME_MAX_LEN]; + lv_font_t * font; +} lv_font_recycle_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_font_recycle_close(lv_font_manager_recycle_t * manager, lv_font_recycle_t * recycle); +static void lv_font_manager_recycle_remove_tail(lv_font_manager_recycle_t * manager); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_font_manager_recycle_t * lv_font_manager_recycle_create(uint32_t max_size) +{ + lv_font_manager_recycle_t * manager = lv_malloc_zeroed(sizeof(lv_font_manager_recycle_t)); + LV_ASSERT_MALLOC(manager); + if(!manager) { + LV_LOG_ERROR("malloc failed for lv_font_manager_recycle_t"); + return NULL; + } + + lv_ll_init(&manager->recycle_ll, sizeof(lv_font_recycle_t)); + manager->max_size = max_size; + + LV_LOG_INFO("success"); + return manager; +} + +void lv_font_manager_recycle_delete(lv_font_manager_recycle_t * manager) +{ + LV_ASSERT_NULL(manager); + + lv_ll_t * recycle_ll = &manager->recycle_ll; + + lv_font_recycle_t * recycle = lv_ll_get_head(recycle_ll); + + /* clear all recycle */ + while(recycle != NULL) { + lv_font_recycle_t * recycle_next = lv_ll_get_next(recycle_ll, recycle); + lv_font_recycle_close(manager, recycle); + recycle = recycle_next; + } + + lv_free(manager); + + LV_LOG_INFO("success"); +} + +lv_font_t * lv_font_manager_recycle_get_reuse(lv_font_manager_recycle_t * manager, const lv_font_info_t * ft_info) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(ft_info); + + lv_ll_t * recycle_ll = &manager->recycle_ll; + + LV_LOG_INFO("font: %s(%d) searching...", ft_info->name, ft_info->size); + + lv_font_recycle_t * recycle; + LV_LL_READ(recycle_ll, recycle) { + /* match font */ + if(lv_font_info_is_equal(ft_info, &recycle->ft_info)) { + lv_font_t * font = recycle->font; + LV_LOG_INFO("found font: %p", (void *)font); + + /* remove reused font */ + lv_ll_remove(recycle_ll, recycle); + lv_free(recycle); + return font; + } + } + + LV_LOG_INFO("NOT found"); + + return false; +} + +void lv_font_manager_recycle_set_reuse(lv_font_manager_recycle_t * manager, lv_font_t * font, + const lv_font_info_t * ft_info) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(ft_info); + + lv_ll_t * recycle_ll = &manager->recycle_ll; + + /* check recycled size */ + if(lv_ll_get_len(recycle_ll) >= manager->max_size) { + LV_LOG_INFO("recycle full, remove tail font..."); + lv_font_manager_recycle_remove_tail(manager); + } + + /* record reuse font */ + lv_font_recycle_t * recycle = lv_ll_ins_head(recycle_ll); + LV_ASSERT_MALLOC(recycle); + lv_memzero(recycle, sizeof(lv_font_recycle_t)); + + lv_strncpy(recycle->name, ft_info->name, sizeof(recycle->name)); + recycle->name[sizeof(recycle->name) - 1] = '\0'; + + recycle->font = font; + recycle->ft_info = *ft_info; + recycle->ft_info.name = recycle->name; + + LV_LOG_INFO("insert font: %s(%d) to reuse list", ft_info->name, ft_info->size); +} + +void lv_font_recycle_remove_fonts(lv_font_manager_recycle_t * manager, const char * name) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(name); + + lv_font_recycle_t * next; + lv_font_recycle_t * recycle = lv_ll_get_head(&manager->recycle_ll); + while(recycle != NULL) { + next = lv_ll_get_next(&manager->recycle_ll, recycle); + if(lv_strcmp(recycle->name, name) == 0) { + lv_font_recycle_close(manager, recycle); + } + recycle = next; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_font_recycle_close(lv_font_manager_recycle_t * manager, lv_font_recycle_t * recycle) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(recycle); + + LV_LOG_INFO("font: %s(%d) close", recycle->ft_info.name, recycle->ft_info.size); + recycle->ft_info.class_p->delete_cb(recycle->font); + recycle->font = NULL; + + lv_ll_remove(&manager->recycle_ll, recycle); + lv_free(recycle); +} + +static void lv_font_manager_recycle_remove_tail(lv_font_manager_recycle_t * manager) +{ + lv_font_recycle_t * tail = lv_ll_get_tail(&manager->recycle_ll); + LV_ASSERT_NULL(tail); + lv_font_recycle_close(manager, tail); +} + +#endif /* LV_USE_FONT_MANAGER */ diff --git a/inc/lvgl/src/font/font_manager/lv_font_manager_recycle.h b/inc/lvgl/src/font/font_manager/lv_font_manager_recycle.h new file mode 100755 index 0000000..596e829 --- /dev/null +++ b/inc/lvgl/src/font/font_manager/lv_font_manager_recycle.h @@ -0,0 +1,85 @@ +/** + * @file lv_font_manager_recycle.h + * + */ + +#ifndef LV_FONT_MANAGER_RECYCLE_H +#define LV_FONT_MANAGER_RECYCLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../misc/lv_types.h" + +#if LV_USE_FONT_MANAGER + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_font_manager_recycle_t lv_font_manager_recycle_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create font recycle manager. + * @param max_size recycle size. + * @return pointer to font recycle manager. + */ +lv_font_manager_recycle_t * lv_font_manager_recycle_create(uint32_t max_size); + +/** + * Delete font recycle manager. + * @param manager pointer to font recycle manager. + */ +void lv_font_manager_recycle_delete(lv_font_manager_recycle_t * manager); + +/** + * Get a reusable font. + * @param manager pointer to font recycle manager. + * @param ft_info font info. + * @return returns true on success. + */ +lv_font_t * lv_font_manager_recycle_get_reuse(lv_font_manager_recycle_t * manager, const lv_font_info_t * ft_info); + +/** + * Set fonts to be reused. + * @param manager pointer to font recycle manager. + * @param ft_info font info. + */ +void lv_font_manager_recycle_set_reuse(lv_font_manager_recycle_t * manager, lv_font_t * font, + const lv_font_info_t * ft_info); + +/** + * Remove fonts with name from recycle manager. + * @param manager pointer to font recycle manager. + * @param name font name. + */ +void lv_font_recycle_remove_fonts(lv_font_manager_recycle_t * manager, const char * name); + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_FONT_MANAGER */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_FONT_MANAGER_RECYCLE_H */ diff --git a/inc/lvgl/src/font/imgfont/lv_imgfont.c b/inc/lvgl/src/font/imgfont/lv_imgfont.c new file mode 100644 index 0000000..edc6990 --- /dev/null +++ b/inc/lvgl/src/font/imgfont/lv_imgfont.c @@ -0,0 +1,121 @@ +/** + * @file lv_imgfont.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" + +#if LV_USE_IMGFONT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_font_t font; + lv_imgfont_get_path_cb_t path_cb; + void * user_data; +} imgfont_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static const void * imgfont_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); +static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, + uint32_t unicode, uint32_t unicode_next); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +lv_font_t * lv_imgfont_create(uint16_t height, lv_imgfont_get_path_cb_t path_cb, void * user_data) +{ + imgfont_dsc_t * dsc = lv_malloc_zeroed(sizeof(imgfont_dsc_t)); + LV_ASSERT_MALLOC(dsc); + if(dsc == NULL) return NULL; + + dsc->path_cb = path_cb; + dsc->user_data = user_data; + + lv_font_t * font = &dsc->font; + font->dsc = dsc; + font->get_glyph_dsc = imgfont_get_glyph_dsc; + font->get_glyph_bitmap = imgfont_get_glyph_bitmap; + font->subpx = LV_FONT_SUBPX_NONE; + font->line_height = height; + font->base_line = 0; + font->underline_position = 0; + font->underline_thickness = 0; + + return font; +} + +void lv_imgfont_destroy(lv_font_t * font) +{ + LV_ASSERT_NULL(font); + + imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; + lv_free(dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static const void * imgfont_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) +{ + LV_UNUSED(draw_buf); + + const void * img_src = g_dsc->gid.src; + return img_src; +} + +static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, + uint32_t unicode, uint32_t unicode_next) +{ + LV_ASSERT_NULL(font); + + imgfont_dsc_t * dsc = (imgfont_dsc_t *)font->dsc; + LV_ASSERT_NULL(dsc); + if(dsc->path_cb == NULL) return false; + + int32_t offset_y = 0; + + const void * img_src = dsc->path_cb(font, unicode, unicode_next, &offset_y, dsc->user_data); + if(img_src == NULL) return false; + + lv_image_header_t header; + if(lv_image_decoder_get_info(img_src, &header) != LV_RESULT_OK) { + return false; + } + + dsc_out->is_placeholder = 0; + dsc_out->adv_w = header.w; + dsc_out->box_w = header.w; + dsc_out->box_h = header.h; + dsc_out->ofs_x = 0; + dsc_out->ofs_y = offset_y; + dsc_out->format = LV_FONT_GLYPH_FORMAT_IMAGE; /* is image identifier */ + dsc_out->gid.src = img_src; + + return true; +} + +#endif /*LV_USE_IMGFONT*/ diff --git a/inc/lvgl/src/font/imgfont/lv_imgfont.h b/inc/lvgl/src/font/imgfont/lv_imgfont.h new file mode 100644 index 0000000..68c317a --- /dev/null +++ b/inc/lvgl/src/font/imgfont/lv_imgfont.h @@ -0,0 +1,63 @@ +/** + * @file lv_imgfont.h + * + */ + +#ifndef LV_IMGFONT_H +#define LV_IMGFONT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../font/lv_font.h" + +#if LV_USE_IMGFONT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/* gets the image path name of this character */ +typedef const void * (*lv_imgfont_get_path_cb_t)(const lv_font_t * font, + uint32_t unicode, uint32_t unicode_next, + int32_t * offset_y, void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Creates a image font with info parameter specified. + * @param height font size + * @param path_cb a function to get the image path name of character. + * @param user_data pointer to user data + * @return pointer to the new imgfont or NULL if create error. + */ +lv_font_t * lv_imgfont_create(uint16_t height, lv_imgfont_get_path_cb_t path_cb, void * user_data); + +/** + * Destroy a image font that has been created. + * @param font pointer to image font handle. + */ +void lv_imgfont_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_IMGFONT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_IMGFONT_H */ diff --git a/inc/lvgl/src/font/lv_font.c b/inc/lvgl/src/font/lv_font.c new file mode 100644 index 0000000..651998e --- /dev/null +++ b/inc/lvgl/src/font/lv_font.c @@ -0,0 +1,204 @@ +/** + * @file lv_font.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_font.h" +#include "../misc/lv_text_private.h" +#include "../misc/lv_utils.h" +#include "../misc/lv_log.h" +#include "../misc/lv_assert.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +const void * lv_font_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) +{ + const lv_font_t * font_p = g_dsc->resolved_font; + LV_ASSERT_NULL(font_p); + + const uint8_t save_req = g_dsc->req_raw_bitmap; + g_dsc->req_raw_bitmap = 0; + const void * bitmap = font_p->get_glyph_bitmap(g_dsc, draw_buf); + g_dsc->req_raw_bitmap = save_req; + + return bitmap; +} + +const void * lv_font_get_glyph_static_bitmap(lv_font_glyph_dsc_t * g_dsc) +{ + const lv_font_t * font_p = g_dsc->resolved_font; + LV_ASSERT_NULL(font_p); + + if(font_p->static_bitmap == 0) { + LV_LOG_WARN("Requesting static bitmap of a non-static bitmap of %p font", (void *)font_p); + return NULL; + } + + const uint8_t save_req = g_dsc->req_raw_bitmap; + g_dsc->req_raw_bitmap = 1; + const void * bitmap = font_p->get_glyph_bitmap(g_dsc, NULL); + g_dsc->req_raw_bitmap = save_req; + + return bitmap; +} + +void lv_font_glyph_release_draw_data(lv_font_glyph_dsc_t * g_dsc) +{ + LV_ASSERT_NULL(g_dsc); + if(!g_dsc->entry) { + return; + } + + const lv_font_t * font = g_dsc->resolved_font; + + if(font != NULL && font->release_glyph) { + font->release_glyph(font, g_dsc); + } +} + +bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, + uint32_t letter_next) +{ + + LV_ASSERT_NULL(dsc_out); + LV_ASSERT_NULL(font_p); + +#if LV_USE_FONT_PLACEHOLDER + const lv_font_t * placeholder_font = NULL; +#endif + const lv_font_t * f = font_p; + const bool has_kerning = f->kerning != LV_FONT_KERNING_NONE; + + lv_memzero(dsc_out, sizeof(lv_font_glyph_dsc_t)); + + while(f) { + bool found = f->get_glyph_dsc(f, dsc_out, letter, + has_kerning ? letter_next : 0); + if(found) { + if(!dsc_out->is_placeholder) { + dsc_out->resolved_font = f; + return true; + } +#if LV_USE_FONT_PLACEHOLDER + else if(placeholder_font == NULL) { + placeholder_font = f; + } +#endif + } + f = f->fallback; + } + +#if LV_USE_FONT_PLACEHOLDER + if(placeholder_font != NULL) { + placeholder_font->get_glyph_dsc(placeholder_font, dsc_out, letter, + has_kerning ? letter_next : 0); + dsc_out->resolved_font = placeholder_font; + return true; + } +#endif + +#if LV_USE_FONT_PLACEHOLDER + dsc_out->box_w = font_p->line_height / 2; + dsc_out->adv_w = dsc_out->box_w + 2; +#else + dsc_out->box_w = 0; + dsc_out->adv_w = 0; +#endif + + dsc_out->stride = 0; + dsc_out->resolved_font = NULL; + dsc_out->box_h = font_p->line_height; + dsc_out->ofs_x = 0; + dsc_out->ofs_y = 0; + dsc_out->format = LV_FONT_GLYPH_FORMAT_A1; + dsc_out->is_placeholder = true; + + return false; +} + +uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next) +{ + lv_font_glyph_dsc_t g; + + /*Return zero if letter is marker*/ + if(lv_text_is_marker(letter)) return 0; + + lv_font_get_glyph_dsc(font, &g, letter, letter_next); + + return g.adv_w; +} + +void lv_font_set_kerning(lv_font_t * font, lv_font_kerning_t kerning) +{ + LV_ASSERT_NULL(font); + font->kerning = kerning; +} + +int32_t lv_font_get_line_height(const lv_font_t * font) +{ + return font->line_height; +} + + +const lv_font_t * lv_font_get_default(void) +{ + return LV_FONT_DEFAULT; +} + +bool lv_font_info_is_equal(const lv_font_info_t * ft_info_1, const lv_font_info_t * ft_info_2) +{ + LV_ASSERT_NULL(ft_info_1); + LV_ASSERT_NULL(ft_info_2); + + bool is_equal = (ft_info_1->size == ft_info_2->size + && ft_info_1->style == ft_info_2->style + && ft_info_1->render_mode == ft_info_2->render_mode + && ft_info_1->kerning == ft_info_2->kerning + && lv_strcmp(ft_info_1->name, ft_info_2->name) == 0); + + return is_equal; +} + +bool lv_font_has_static_bitmap(const lv_font_t * font) +{ + return font->static_bitmap; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/font/lv_font.h b/inc/lvgl/src/font/lv_font.h new file mode 100644 index 0000000..1a3a59a --- /dev/null +++ b/inc/lvgl/src/font/lv_font.h @@ -0,0 +1,349 @@ +/** + * @file lv_font.h + * + */ + +#ifndef LV_FONT_H +#define LV_FONT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_types.h" + +#include "lv_symbol_def.h" +#include "../draw/lv_draw_buf.h" +#include "../misc/lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*------------------ + * General types + *-----------------*/ + +/** The font format.*/ +typedef enum { + LV_FONT_GLYPH_FORMAT_NONE = 0, /**< Maybe not visible*/ + + /**< Legacy simple formats*/ + LV_FONT_GLYPH_FORMAT_A1 = 0x01, /**< 1 bit per pixel*/ + LV_FONT_GLYPH_FORMAT_A2 = 0x02, /**< 2 bit per pixel*/ + LV_FONT_GLYPH_FORMAT_A3 = 0x03, /**< 3 bit per pixel*/ + LV_FONT_GLYPH_FORMAT_A4 = 0x04, /**< 4 bit per pixel*/ + LV_FONT_GLYPH_FORMAT_A8 = 0x08, /**< 8 bit per pixel*/ + + LV_FONT_GLYPH_FORMAT_IMAGE = 0x19, /**< Image format*/ + + /**< Advanced formats*/ + LV_FONT_GLYPH_FORMAT_VECTOR = 0x1A, /**< Vectorial format*/ + LV_FONT_GLYPH_FORMAT_SVG = 0x1B, /**< SVG format*/ + LV_FONT_GLYPH_FORMAT_CUSTOM = 0xFF, /**< Custom format*/ +} lv_font_glyph_format_t; + +/** Describes the properties of a glyph.*/ +typedef struct { + const lv_font_t * + resolved_font; /**< Pointer to a font where the glyph was actually found after handling fallbacks*/ + uint16_t adv_w; /**< The glyph needs this space. Draw the next glyph after this width.*/ + uint16_t box_w; /**< Width of the glyph's bounding box*/ + uint16_t box_h; /**< Height of the glyph's bounding box*/ + int16_t ofs_x; /**< x offset of the bounding box*/ + int16_t ofs_y; /**< y offset of the bounding box*/ + uint16_t stride;/**< Bytes in each line. If 0 than there is no padding at the end of the line. */ + lv_font_glyph_format_t format; /**< Font format of the glyph see lv_font_glyph_format_t */ + uint8_t is_placeholder: 1; /**< Glyph is missing. But placeholder will still be displayed*/ + + /** 0: Get bitmap should return an A8 or ARGB8888 image. + * 1: return the bitmap as it is (Maybe A1/2/4 or any proprietary formats). */ + uint8_t req_raw_bitmap: 1; + + int32_t outline_stroke_width; /**< used with freetype vector fonts - width of the letter border */ + + union { + uint32_t index; /**< Glyph descriptor index*/ + const void * src; /**< Pointer to the source data used by image fonts*/ + } gid; /**< The index of the glyph in the font file. Used by the font cache*/ + lv_cache_entry_t * entry; /**< The cache entry of the glyph draw data. Used by the font cache*/ +} lv_font_glyph_dsc_t; + +/** The bitmaps might be upscaled by 3 to achieve subpixel rendering.*/ +typedef enum { + LV_FONT_SUBPX_NONE, + LV_FONT_SUBPX_HOR, + LV_FONT_SUBPX_VER, + LV_FONT_SUBPX_BOTH, +} lv_font_subpx_t; + +/** Adjust letter spacing for specific character pairs.*/ +typedef enum { + LV_FONT_KERNING_NORMAL, + LV_FONT_KERNING_NONE, +} lv_font_kerning_t; + +/** Describe the properties of a font*/ +struct _lv_font_t { + /** Get a glyph's descriptor from a font*/ + bool (*get_glyph_dsc)(const lv_font_t *, lv_font_glyph_dsc_t *, uint32_t letter, uint32_t letter_next); + + /** Get a glyph's bitmap from a font*/ + const void * (*get_glyph_bitmap)(lv_font_glyph_dsc_t *, lv_draw_buf_t *); + + /** Release a glyph*/ + void (*release_glyph)(const lv_font_t *, lv_font_glyph_dsc_t *); + + /*Pointer to the font in a font pack (must have the same line height)*/ + int32_t line_height; /**< The real line height where any text fits*/ + int32_t base_line; /**< Base line measured from the bottom of the line_height*/ + uint8_t subpx : 2; /**< An element of `lv_font_subpx_t`*/ + uint8_t kerning : 1; /**< An element of `lv_font_kerning_t`*/ + uint8_t static_bitmap : 1; /**< The font will be used as static bitmap */ + + int8_t underline_position; /**< Distance between the top of the underline and base line (< 0 means below the base line)*/ + int8_t underline_thickness; /**< Thickness of the underline*/ + + const void * dsc; /**< Store implementation specific or run_time data or caching here*/ + const lv_font_t * fallback; /**< Fallback font for missing glyph. Resolved recursively */ + void * user_data; /**< Custom user data for font.*/ +}; + +struct _lv_font_class_t { + lv_font_t * (*create_cb)(const lv_font_info_t * info, const void * src); /**< Font creation callback function*/ + void (*delete_cb)(lv_font_t * font); /**< Font deletion callback function*/ + void * (*dup_src_cb)(const void * src); /**< Font source duplication callback function*/ + void (*free_src_cb)(void * src); /**< Font source free callback function*/ +}; + +struct _lv_font_info_t { + const char * name; /**< Font name, used to distinguish different font resources*/ + const lv_font_class_t * class_p; /**< Font backend implementation*/ + uint32_t size; /**< Font size in pixel*/ + uint32_t render_mode; /**< Font rendering mode, see `lv_freetype_font_render_mode_t`*/ + uint32_t style; /**< Font style, see `lv_freetype_font_style_t`*/ + lv_font_kerning_t kerning; /**< Font kerning, see `lv_font_kerning_t`*/ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Return with the bitmap of a font. + * It always converts the normal fonts to A8 format in a draw_buf with + * LV_DRAW_BUF_ALIGN and LV_DRAW_BUF_STRIDE_ALIGN + * @note You must call lv_font_get_glyph_dsc() to get `g_dsc` (lv_font_glyph_dsc_t) + * before you can call this function. + * @param g_dsc the glyph descriptor including which font to use, which supply the glyph_index + * and the format. + * @param draw_buf a draw buffer that can be used to store the bitmap of the glyph. + * @return pointer to the glyph's data. + * It can be a draw buffer for bitmap fonts or an image source for imgfonts. + */ +const void * lv_font_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); + + +/** + * Return the bitmap as it is. It works only if the font stores the bitmap in + * a non-volitile memory. + * @param g_dsc the glyph descriptor including which font to use, which supply the glyph_index + * and the format. + * @return the bitmap as it is + */ +const void * lv_font_get_glyph_static_bitmap(lv_font_glyph_dsc_t * g_dsc); + +/** + * Get the descriptor of a glyph + * @param font pointer to font + * @param dsc_out store the result descriptor here + * @param letter a UNICODE letter code + * @param letter_next the next letter after `letter`. Used for kerning + * @return true: descriptor is successfully loaded into `dsc_out`. + * false: the letter was not found, no data is loaded to `dsc_out` + */ +bool lv_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, + uint32_t letter_next); +/** + * Release the bitmap of a font. + * @note You must call lv_font_get_glyph_dsc() to get `g_dsc` (lv_font_glyph_dsc_t) before you can call this function. + * @param g_dsc the glyph descriptor including which font to use, which supply the glyph_index and the format. + */ +void lv_font_glyph_release_draw_data(lv_font_glyph_dsc_t * g_dsc); + +/** + * Get the width of a glyph with kerning + * @param font pointer to a font + * @param letter a UNICODE letter + * @param letter_next the next letter after `letter`. Used for kerning + * @return the width of the glyph + */ +uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next); + +/** + * Get the line height of a font. All characters fit into this height + * @param font pointer to a font + * @return the height of a font + */ +int32_t lv_font_get_line_height(const lv_font_t * font); + +/** + * Configure the use of kerning information stored in a font + * @param font pointer to a font + * @param kerning `LV_FONT_KERNING_NORMAL` (default) or `LV_FONT_KERNING_NONE` + */ +void lv_font_set_kerning(lv_font_t * font, lv_font_kerning_t kerning); + +/** + * Get the default font, defined by LV_FONT_DEFAULT + * @return return pointer to the default font + */ +const lv_font_t * lv_font_get_default(void); + +/** + * Compare font information. + * @param ft_info_1 font information 1. + * @param ft_info_2 font information 2. + * @return return true if the fonts are equal. + */ +bool lv_font_info_is_equal(const lv_font_info_t * ft_info_1, const lv_font_info_t * ft_info_2); + +/** + * Checks if a font has a static rendering bitmap. + * @param font pointer to a font + * @return return true if the font has a bitmap generated for static rendering. + */ +bool lv_font_has_static_bitmap(const lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#define LV_FONT_DECLARE(font_name) LV_ATTRIBUTE_EXTERN_DATA extern const lv_font_t font_name; + +#if LV_FONT_MONTSERRAT_8 +LV_FONT_DECLARE(lv_font_montserrat_8) +#endif + +#if LV_FONT_MONTSERRAT_10 +LV_FONT_DECLARE(lv_font_montserrat_10) +#endif + +#if LV_FONT_MONTSERRAT_12 +LV_FONT_DECLARE(lv_font_montserrat_12) +#endif + +#if LV_FONT_MONTSERRAT_14 +LV_FONT_DECLARE(lv_font_montserrat_14) +#endif + +#if LV_FONT_MONTSERRAT_16 +LV_FONT_DECLARE(lv_font_montserrat_16) +#endif + +#if LV_FONT_MONTSERRAT_18 +LV_FONT_DECLARE(lv_font_montserrat_18) +#endif + +#if LV_FONT_MONTSERRAT_20 +LV_FONT_DECLARE(lv_font_montserrat_20) +#endif + +#if LV_FONT_MONTSERRAT_22 +LV_FONT_DECLARE(lv_font_montserrat_22) +#endif + +#if LV_FONT_MONTSERRAT_24 +LV_FONT_DECLARE(lv_font_montserrat_24) +#endif + +#if LV_FONT_MONTSERRAT_26 +LV_FONT_DECLARE(lv_font_montserrat_26) +#endif + +#if LV_FONT_MONTSERRAT_28 +LV_FONT_DECLARE(lv_font_montserrat_28) +#endif + +#if LV_FONT_MONTSERRAT_30 +LV_FONT_DECLARE(lv_font_montserrat_30) +#endif + +#if LV_FONT_MONTSERRAT_32 +LV_FONT_DECLARE(lv_font_montserrat_32) +#endif + +#if LV_FONT_MONTSERRAT_34 +LV_FONT_DECLARE(lv_font_montserrat_34) +#endif + +#if LV_FONT_MONTSERRAT_36 +LV_FONT_DECLARE(lv_font_montserrat_36) +#endif + +#if LV_FONT_MONTSERRAT_38 +LV_FONT_DECLARE(lv_font_montserrat_38) +#endif + +#if LV_FONT_MONTSERRAT_40 +LV_FONT_DECLARE(lv_font_montserrat_40) +#endif + +#if LV_FONT_MONTSERRAT_42 +LV_FONT_DECLARE(lv_font_montserrat_42) +#endif + +#if LV_FONT_MONTSERRAT_44 +LV_FONT_DECLARE(lv_font_montserrat_44) +#endif + +#if LV_FONT_MONTSERRAT_46 +LV_FONT_DECLARE(lv_font_montserrat_46) +#endif + +#if LV_FONT_MONTSERRAT_48 +LV_FONT_DECLARE(lv_font_montserrat_48) +#endif + +#if LV_FONT_MONTSERRAT_28_COMPRESSED +LV_FONT_DECLARE(lv_font_montserrat_28_compressed) +#endif + +#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW +LV_FONT_DECLARE(lv_font_dejavu_16_persian_hebrew) +#endif + +#if LV_FONT_SOURCE_HAN_SANS_SC_14_CJK +LV_FONT_DECLARE(lv_font_source_han_sans_sc_14_cjk) +#endif + +#if LV_FONT_SOURCE_HAN_SANS_SC_16_CJK +LV_FONT_DECLARE(lv_font_source_han_sans_sc_16_cjk) +#endif + +#if LV_FONT_UNSCII_8 +LV_FONT_DECLARE(lv_font_unscii_8) +#endif + +#if LV_FONT_UNSCII_16 +LV_FONT_DECLARE(lv_font_unscii_16) +#endif + +/*Declare the custom (user defined) fonts*/ +#ifdef LV_FONT_CUSTOM_DECLARE +LV_FONT_CUSTOM_DECLARE +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FONT_H*/ diff --git a/inc/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c b/inc/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c new file mode 100644 index 0000000..02a9573 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_dejavu_16_persian_hebrew.c @@ -0,0 +1,6605 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font DejaVuSans.ttf -r 0x20-0x7f,0x5d0-0x5ea,0x600-0x6FF,0xFB50-0xFDFF,0xFE70-0xFEFF --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_dejavu_16_persian_hebrew.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 1 +#endif + +#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x8f, 0x8e, 0x6d, + 0x0, 0x0, 0x9f, 0x9f, + + /* U+0022 "\"" */ + 0x7e, 0x8, 0xd7, 0xe0, 0x8d, 0x7e, 0x8, 0xd7, + 0xe0, 0x8d, 0x24, 0x2, 0x40, + + /* U+0023 "#" */ + 0x0, 0x0, 0x5e, 0x0, 0xc7, 0x0, 0x0, 0x0, + 0x8b, 0x0, 0xf3, 0x0, 0x0, 0x0, 0xb8, 0x3, + 0xf0, 0x0, 0x0, 0x0, 0xf4, 0x6, 0xd0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, 0x38, + 0xd3, 0x3e, 0x73, 0x30, 0x0, 0xa, 0x90, 0x1f, + 0x20, 0x0, 0x0, 0xe, 0x50, 0x5e, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x40, 0x23, 0x8d, + 0x33, 0xe7, 0x33, 0x0, 0x0, 0xa9, 0x2, 0xf1, + 0x0, 0x0, 0x0, 0xf4, 0x6, 0xd0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x6, 0x60, 0x0, 0x0, 0x6, 0x60, 0x0, + 0x5, 0xce, 0xfd, 0xa1, 0x5f, 0x77, 0x84, 0x91, + 0x9d, 0x6, 0x60, 0x0, 0x8f, 0x36, 0x60, 0x0, + 0x1c, 0xfe, 0xc6, 0x10, 0x0, 0x3a, 0xde, 0xe3, + 0x0, 0x6, 0x60, 0xdb, 0x0, 0x6, 0x60, 0xac, + 0x98, 0x47, 0x87, 0xf7, 0x4a, 0xef, 0xfd, 0x70, + 0x0, 0x6, 0x60, 0x0, 0x0, 0x6, 0x60, 0x0, + 0x0, 0x3, 0x30, 0x0, + + /* U+0025 "%" */ + 0x2, 0xbf, 0xc3, 0x0, 0x0, 0xa9, 0x0, 0x0, + 0xca, 0x7, 0xe0, 0x0, 0x4e, 0x0, 0x0, 0xf, + 0x30, 0xf, 0x30, 0xd, 0x50, 0x0, 0x0, 0xf2, + 0x0, 0xf3, 0x8, 0xb0, 0x0, 0x0, 0xc, 0x90, + 0x7e, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x2b, 0xfc, + 0x30, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0x1, 0xbe, 0xc3, 0x0, 0x0, 0x0, 0xe, + 0x50, 0xba, 0x6, 0xe0, 0x0, 0x0, 0x8, 0xb0, + 0xf, 0x30, 0xf, 0x40, 0x0, 0x2, 0xf2, 0x0, + 0xf3, 0x0, 0xf4, 0x0, 0x0, 0xc7, 0x0, 0xb, + 0xa0, 0x7e, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x1b, + 0xfd, 0x40, + + /* U+0026 "&" */ + 0x0, 0x5d, 0xfe, 0xa0, 0x0, 0x0, 0x4f, 0xa4, + 0x6c, 0x10, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x10, 0x0, 0x0, 0x0, 0x2, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xae, 0xfa, 0x0, 0x0, + 0x41, 0x7f, 0x35, 0xfa, 0x0, 0x2f, 0x4d, 0xa0, + 0x5, 0xf9, 0x6, 0xf0, 0xf9, 0x0, 0x6, 0xf9, + 0xd9, 0xc, 0xd0, 0x0, 0x6, 0xff, 0x10, 0x3f, + 0xb3, 0x13, 0xaf, 0xf8, 0x0, 0x3b, 0xef, 0xd9, + 0x27, 0xf7, + + /* U+0027 "'" */ + 0x7e, 0x7e, 0x7e, 0x7e, 0x24, + + /* U+0028 "(" */ + 0x0, 0x8b, 0x2, 0xf3, 0x9, 0xc0, 0xe, 0x70, + 0x3f, 0x30, 0x7f, 0x0, 0x9f, 0x0, 0x9e, 0x0, + 0x8f, 0x0, 0x5f, 0x10, 0x2f, 0x50, 0xc, 0xa0, + 0x5, 0xf0, 0x0, 0xd7, 0x0, 0x36, + + /* U+0029 ")" */ + 0x7c, 0x0, 0xe, 0x50, 0x9, 0xc0, 0x3, 0xf3, + 0x0, 0xf7, 0x0, 0xcb, 0x0, 0xbc, 0x0, 0xad, + 0x0, 0xbc, 0x0, 0xe9, 0x1, 0xf5, 0x6, 0xf0, + 0xb, 0x90, 0x3f, 0x10, 0x45, 0x0, + + /* U+002A "*" */ + 0x0, 0x7, 0x70, 0x0, 0x24, 0x7, 0x70, 0x42, + 0x2b, 0xb8, 0x9a, 0xb2, 0x0, 0x4f, 0xf4, 0x0, + 0x5, 0xcb, 0xcc, 0x50, 0x4a, 0x17, 0x71, 0x94, + 0x0, 0x7, 0x70, 0x0, 0x0, 0x2, 0x20, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x1, 0x11, + 0x1f, 0x61, 0x11, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x14, 0x44, 0x4f, 0x84, 0x44, 0x30, 0x0, + 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x50, 0x0, 0x0, + + /* U+002C "," */ + 0x1d, 0x72, 0xf7, 0x6f, 0x1a, 0x80, + + /* U+002D "-" */ + 0x1, 0x11, 0x13, 0xff, 0xff, 0x3, 0x33, 0x30, + + /* U+002E "." */ + 0x4f, 0x54, 0xf5, + + /* U+002F "/" */ + 0x0, 0x1, 0xf3, 0x0, 0x6, 0xe0, 0x0, 0xb, + 0x90, 0x0, 0xf, 0x40, 0x0, 0x5f, 0x0, 0x0, + 0xaa, 0x0, 0x0, 0xf5, 0x0, 0x4, 0xf1, 0x0, + 0x9, 0xb0, 0x0, 0xe, 0x60, 0x0, 0x3f, 0x10, + 0x0, 0x8c, 0x0, 0x0, 0xd7, 0x0, 0x0, + + /* U+0030 "0" */ + 0x1, 0xae, 0xfb, 0x20, 0x0, 0xde, 0x65, 0xde, + 0x10, 0x5f, 0x40, 0x1, 0xf8, 0xa, 0xe0, 0x0, + 0xb, 0xd0, 0xdb, 0x0, 0x0, 0x8f, 0xe, 0xa0, + 0x0, 0x7, 0xf1, 0xea, 0x0, 0x0, 0x7f, 0x1d, + 0xb0, 0x0, 0x8, 0xf0, 0xae, 0x0, 0x0, 0xbd, + 0x6, 0xf3, 0x0, 0x1f, 0x80, 0xd, 0xe6, 0x5d, + 0xe1, 0x0, 0x1a, 0xef, 0xb2, 0x0, + + /* U+0031 "1" */ + 0x19, 0xcf, 0xf2, 0x0, 0x3e, 0xbb, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x0, 0x7, 0xf2, 0x0, 0x0, 0x7, 0xf2, 0x0, + 0x5, 0x59, 0xf6, 0x53, 0xf, 0xff, 0xff, 0xfb, + + /* U+0032 "2" */ + 0x49, 0xdf, 0xd9, 0x10, 0xcc, 0x75, 0x8f, 0xd0, + 0x20, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x1, 0xf7, + 0x0, 0x0, 0x5, 0xf5, 0x0, 0x0, 0x1e, 0xc0, + 0x0, 0x0, 0xce, 0x20, 0x0, 0xb, 0xf3, 0x0, + 0x0, 0xbf, 0x30, 0x0, 0xa, 0xf3, 0x0, 0x0, + 0x9f, 0x95, 0x55, 0x53, 0xdf, 0xff, 0xff, 0xf9, + + /* U+0033 "3" */ + 0x3b, 0xef, 0xeb, 0x30, 0x5a, 0x75, 0x7d, 0xf3, + 0x0, 0x0, 0x1, 0xf8, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x2a, 0xf2, 0x0, 0xcf, 0xfe, 0x30, + 0x0, 0x23, 0x5c, 0xe3, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, 0x0, 0xbe, 0x0, 0x0, 0x1, 0xeb, + 0xb9, 0x65, 0x8e, 0xf3, 0x6c, 0xef, 0xda, 0x20, + + /* U+0034 "4" */ + 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, 0x0, 0x4e, + 0xfa, 0x0, 0x0, 0x0, 0xe6, 0xfa, 0x0, 0x0, + 0x9, 0xc0, 0xfa, 0x0, 0x0, 0x3f, 0x20, 0xfa, + 0x0, 0x0, 0xc8, 0x0, 0xfa, 0x0, 0x7, 0xe0, + 0x0, 0xfa, 0x0, 0x1f, 0x61, 0x11, 0xfa, 0x10, + 0x3f, 0xff, 0xff, 0xff, 0xf4, 0x4, 0x44, 0x44, + 0xfb, 0x41, 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xfa, 0x0, + + /* U+0035 "5" */ + 0x4f, 0xff, 0xff, 0xe0, 0x4f, 0x75, 0x55, 0x40, + 0x4f, 0x20, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, + 0x4f, 0xff, 0xfa, 0x20, 0x39, 0x54, 0x7f, 0xe1, + 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x4, 0xf8, + 0xb9, 0x66, 0x9f, 0xe1, 0x7c, 0xef, 0xe9, 0x10, + + /* U+0036 "6" */ + 0x0, 0x4c, 0xff, 0xc3, 0x0, 0x6f, 0xb7, 0x69, + 0x50, 0x2f, 0x90, 0x0, 0x0, 0x8, 0xf1, 0x0, + 0x0, 0x0, 0xbc, 0x6e, 0xfe, 0x70, 0xd, 0xfe, + 0x64, 0x9f, 0x70, 0xdf, 0x50, 0x0, 0xbe, 0xc, + 0xf0, 0x0, 0x7, 0xf2, 0x9f, 0x0, 0x0, 0x7f, + 0x24, 0xf5, 0x0, 0xc, 0xe0, 0xb, 0xf7, 0x5a, + 0xf6, 0x0, 0x9, 0xef, 0xd5, 0x0, + + /* U+0037 "7" */ + 0xbf, 0xff, 0xff, 0xfc, 0x35, 0x55, 0x57, 0xf8, + 0x0, 0x0, 0x8, 0xf2, 0x0, 0x0, 0xe, 0xc0, + 0x0, 0x0, 0x4f, 0x60, 0x0, 0x0, 0xaf, 0x0, + 0x0, 0x0, 0xfa, 0x0, 0x0, 0x6, 0xf4, 0x0, + 0x0, 0xc, 0xe0, 0x0, 0x0, 0x2f, 0x80, 0x0, + 0x0, 0x8f, 0x20, 0x0, 0x0, 0xdc, 0x0, 0x0, + + /* U+0038 "8" */ + 0x3, 0xbe, 0xfc, 0x50, 0x3, 0xfc, 0x55, 0xbf, + 0x50, 0x8f, 0x10, 0x0, 0xeb, 0x9, 0xf0, 0x0, + 0xd, 0xb0, 0x2f, 0x91, 0x17, 0xf4, 0x0, 0x3e, + 0xff, 0xf5, 0x0, 0x2e, 0xb4, 0x49, 0xf5, 0xb, + 0xe0, 0x0, 0xb, 0xe0, 0xeb, 0x0, 0x0, 0x8f, + 0x1c, 0xe0, 0x0, 0xb, 0xf0, 0x5f, 0xc5, 0x5a, + 0xf8, 0x0, 0x4c, 0xef, 0xc6, 0x0, + + /* U+0039 "9" */ + 0x3, 0xcf, 0xea, 0x10, 0x3, 0xfc, 0x56, 0xed, + 0x0, 0xbe, 0x0, 0x2, 0xf7, 0xe, 0xa0, 0x0, + 0xe, 0xc0, 0xfa, 0x0, 0x0, 0xdf, 0xc, 0xd0, + 0x0, 0x1f, 0xf0, 0x6f, 0x91, 0x2b, 0xff, 0x0, + 0x7f, 0xff, 0xbb, 0xe0, 0x0, 0x2, 0x10, 0xdb, + 0x0, 0x0, 0x0, 0x6f, 0x40, 0x39, 0x66, 0xaf, + 0x90, 0x2, 0xbe, 0xfd, 0x60, 0x0, + + /* U+003A ":" */ + 0x2f, 0x81, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x82, 0xf8, + + /* U+003B ";" */ + 0x2f, 0x81, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x72, 0xf7, 0x6f, 0x1a, 0x80, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x28, 0xeb, 0x0, 0x0, 0x16, 0xcf, 0xe8, + 0x20, 0x5, 0xbf, 0xe9, 0x30, 0x0, 0x3f, 0xfa, + 0x50, 0x0, 0x0, 0x3, 0xef, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x1, + 0x7d, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, + + /* U+003D "=" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x14, 0x44, 0x44, 0x44, 0x44, + 0x20, 0x11, 0x11, 0x11, 0x11, 0x10, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x44, 0x44, 0x44, 0x44, + 0x42, + + /* U+003E ">" */ + 0x11, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfa, 0x40, + 0x0, 0x0, 0x0, 0x6, 0xbf, 0xe9, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xcf, 0xd7, 0x20, 0x0, 0x0, + 0x0, 0x28, 0xef, 0x90, 0x0, 0x0, 0x3, 0x9e, + 0xf8, 0x0, 0x2, 0x8d, 0xfc, 0x61, 0x0, 0x7c, + 0xfe, 0x82, 0x0, 0x0, 0x4f, 0x94, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x4b, 0xef, 0xb3, 0xd, 0xa5, 0x6e, 0xe1, 0x20, + 0x0, 0x4f, 0x40, 0x0, 0x6, 0xf3, 0x0, 0x3, + 0xfa, 0x0, 0x2, 0xeb, 0x0, 0x0, 0xbd, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0xc8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0xf, + 0xa0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x7b, 0xee, 0xd8, 0x20, 0x0, 0x0, + 0x3e, 0xd6, 0x43, 0x5a, 0xf6, 0x0, 0x3, 0xf6, + 0x0, 0x0, 0x0, 0x3e, 0x60, 0xe, 0x60, 0x0, + 0x0, 0x0, 0x3, 0xf2, 0x6c, 0x0, 0x1a, 0xed, + 0x6c, 0x50, 0xa8, 0xb6, 0x0, 0xbc, 0x44, 0xcf, + 0x50, 0x6c, 0xe3, 0x2, 0xf2, 0x0, 0x2f, 0x50, + 0x4d, 0xe3, 0x4, 0xf0, 0x0, 0xf, 0x50, 0x5c, + 0xc5, 0x2, 0xf1, 0x0, 0x1f, 0x50, 0xb8, 0x8a, + 0x0, 0xda, 0x11, 0xaf, 0x68, 0xe1, 0x1f, 0x30, + 0x2d, 0xff, 0x9c, 0xfa, 0x10, 0x6, 0xe3, 0x0, + 0x11, 0x1, 0x0, 0x0, 0x0, 0x7f, 0x83, 0x0, + 0x16, 0xd4, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, 0xf, + 0xfe, 0x0, 0x0, 0x0, 0x5, 0xfb, 0xf4, 0x0, + 0x0, 0x0, 0xbe, 0x1f, 0xa0, 0x0, 0x0, 0x1f, + 0x90, 0xaf, 0x10, 0x0, 0x7, 0xf3, 0x4, 0xf6, + 0x0, 0x0, 0xdd, 0x0, 0xe, 0xc0, 0x0, 0x3f, + 0x81, 0x11, 0x9f, 0x20, 0x9, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xec, 0x44, 0x44, 0x4c, 0xe0, 0x5f, + 0x50, 0x0, 0x0, 0x6f, 0x4b, 0xf0, 0x0, 0x0, + 0x0, 0xfa, + + /* U+0042 "B" */ + 0x6f, 0xff, 0xfe, 0xa2, 0x6, 0xf6, 0x44, 0x7e, + 0xe0, 0x6f, 0x20, 0x0, 0x5f, 0x46, 0xf2, 0x0, + 0x4, 0xf4, 0x6f, 0x30, 0x3, 0xce, 0x6, 0xff, + 0xff, 0xfd, 0x20, 0x6f, 0x53, 0x35, 0xce, 0x26, + 0xf2, 0x0, 0x1, 0xfa, 0x6f, 0x20, 0x0, 0xd, + 0xc6, 0xf2, 0x0, 0x1, 0xfb, 0x6f, 0x64, 0x46, + 0xdf, 0x46, 0xff, 0xff, 0xeb, 0x40, + + /* U+0043 "C" */ + 0x0, 0x3, 0xae, 0xfe, 0xb5, 0x0, 0x6, 0xfd, + 0x75, 0x6a, 0xf4, 0x3, 0xfa, 0x0, 0x0, 0x2, + 0x30, 0xaf, 0x10, 0x0, 0x0, 0x0, 0xf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x90, 0x0, 0x0, 0x0, 0x0, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x23, 0x0, + 0x6f, 0xd7, 0x56, 0xaf, 0x40, 0x0, 0x3a, 0xef, + 0xeb, 0x40, + + /* U+0044 "D" */ + 0x6f, 0xff, 0xfd, 0xa5, 0x0, 0x6, 0xf6, 0x45, + 0x7b, 0xfb, 0x0, 0x6f, 0x20, 0x0, 0x6, 0xf9, + 0x6, 0xf2, 0x0, 0x0, 0xb, 0xf0, 0x6f, 0x20, + 0x0, 0x0, 0x6f, 0x36, 0xf2, 0x0, 0x0, 0x4, + 0xf5, 0x6f, 0x20, 0x0, 0x0, 0x5f, 0x56, 0xf2, + 0x0, 0x0, 0x6, 0xf3, 0x6f, 0x20, 0x0, 0x0, + 0xbf, 0x6, 0xf2, 0x0, 0x0, 0x6f, 0x80, 0x6f, + 0x64, 0x57, 0xbf, 0xb0, 0x6, 0xff, 0xff, 0xea, + 0x50, 0x0, + + /* U+0045 "E" */ + 0x6f, 0xff, 0xff, 0xff, 0x6, 0xf6, 0x55, 0x55, + 0x50, 0x6f, 0x20, 0x0, 0x0, 0x6, 0xf2, 0x0, + 0x0, 0x0, 0x6f, 0x31, 0x11, 0x10, 0x6, 0xff, + 0xff, 0xff, 0xb0, 0x6f, 0x54, 0x44, 0x42, 0x6, + 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x65, 0x55, + 0x55, 0x6, 0xff, 0xff, 0xff, 0xf1, + + /* U+0046 "F" */ + 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0x65, 0x55, 0x51, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x31, 0x11, 0x0, 0x6f, 0xff, 0xff, 0xc0, + 0x6f, 0x54, 0x44, 0x30, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x3, 0xae, 0xff, 0xc8, 0x10, 0x0, 0x6f, + 0xd7, 0x55, 0x9e, 0xc0, 0x3, 0xfa, 0x0, 0x0, + 0x1, 0x70, 0xb, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x90, 0x0, 0xf, + 0xff, 0xf1, 0xf, 0xb0, 0x0, 0x3, 0x39, 0xf1, + 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf1, 0x3, 0xfa, + 0x0, 0x0, 0x7, 0xf1, 0x0, 0x6f, 0xd7, 0x55, + 0x8d, 0xf1, 0x0, 0x3, 0xae, 0xff, 0xc7, 0x10, + + /* U+0048 "H" */ + 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x20, 0x0, + 0x1, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, + 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x31, 0x11, 0x12, + 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xf7, 0x6f, 0x54, + 0x44, 0x45, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, + 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, 0x20, 0x0, + 0x1, 0xf7, 0x6f, 0x20, 0x0, 0x1, 0xf7, 0x6f, + 0x20, 0x0, 0x1, 0xf7, + + /* U+0049 "I" */ + 0x6f, 0x26, 0xf2, 0x6f, 0x26, 0xf2, 0x6f, 0x26, + 0xf2, 0x6f, 0x26, 0xf2, 0x6f, 0x26, 0xf2, 0x6f, + 0x26, 0xf2, + + /* U+004A "J" */ + 0x0, 0x6f, 0x20, 0x6, 0xf2, 0x0, 0x6f, 0x20, + 0x6, 0xf2, 0x0, 0x6f, 0x20, 0x6, 0xf2, 0x0, + 0x6f, 0x20, 0x6, 0xf2, 0x0, 0x6f, 0x20, 0x6, + 0xf2, 0x0, 0x6f, 0x20, 0x7, 0xf2, 0x0, 0xaf, + 0x4, 0x8f, 0xa0, 0xde, 0x90, 0x0, + + /* U+004B "K" */ + 0x6f, 0x20, 0x0, 0x3e, 0xd1, 0x6f, 0x20, 0x3, + 0xec, 0x10, 0x6f, 0x20, 0x3f, 0xc0, 0x0, 0x6f, + 0x24, 0xfb, 0x0, 0x0, 0x6f, 0x7f, 0xb0, 0x0, + 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xbf, + 0x80, 0x0, 0x0, 0x6f, 0x29, 0xf7, 0x0, 0x0, + 0x6f, 0x20, 0xaf, 0x70, 0x0, 0x6f, 0x20, 0xa, + 0xf6, 0x0, 0x6f, 0x20, 0x0, 0xaf, 0x60, 0x6f, + 0x20, 0x0, 0xb, 0xf5, + + /* U+004C "L" */ + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x20, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6f, 0x65, 0x55, 0x54, 0x6f, 0xff, 0xff, 0xfd, + + /* U+004D "M" */ + 0x6f, 0xf1, 0x0, 0x0, 0x4f, 0xf4, 0x6f, 0xf7, + 0x0, 0x0, 0xaf, 0xf4, 0x6f, 0xad, 0x0, 0x0, + 0xf9, 0xf4, 0x6f, 0x4f, 0x30, 0x6, 0xe5, 0xf4, + 0x6f, 0x1c, 0x90, 0xc, 0x94, 0xf4, 0x6f, 0x16, + 0xe0, 0x2f, 0x34, 0xf4, 0x6f, 0x11, 0xf4, 0x7d, + 0x4, 0xf4, 0x6f, 0x10, 0xba, 0xd8, 0x4, 0xf4, + 0x6f, 0x10, 0x5f, 0xf2, 0x4, 0xf4, 0x6f, 0x10, + 0xa, 0x90, 0x4, 0xf4, 0x6f, 0x10, 0x0, 0x0, + 0x4, 0xf4, 0x6f, 0x10, 0x0, 0x0, 0x4, 0xf4, + + /* U+004E "N" */ + 0x6f, 0xe0, 0x0, 0x2, 0xf6, 0x6f, 0xf7, 0x0, + 0x2, 0xf6, 0x6f, 0xbe, 0x0, 0x2, 0xf6, 0x6f, + 0x3f, 0x80, 0x2, 0xf6, 0x6f, 0x19, 0xf1, 0x2, + 0xf6, 0x6f, 0x11, 0xf8, 0x2, 0xf6, 0x6f, 0x10, + 0x8f, 0x12, 0xf6, 0x6f, 0x10, 0x1f, 0x92, 0xf6, + 0x6f, 0x10, 0x8, 0xf3, 0xf6, 0x6f, 0x10, 0x1, + 0xfb, 0xf6, 0x6f, 0x10, 0x0, 0x7f, 0xf6, 0x6f, + 0x10, 0x0, 0xe, 0xf6, + + /* U+004F "O" */ + 0x0, 0x4, 0xbe, 0xfd, 0x91, 0x0, 0x0, 0x7f, + 0xc6, 0x58, 0xee, 0x20, 0x3, 0xfa, 0x0, 0x0, + 0x2f, 0xd0, 0xa, 0xf1, 0x0, 0x0, 0x7, 0xf4, + 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, 0xf, 0x90, + 0x0, 0x0, 0x0, 0xfa, 0xf, 0x90, 0x0, 0x0, + 0x0, 0xfa, 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, + 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf4, 0x3, 0xfa, + 0x0, 0x0, 0x2e, 0xd0, 0x0, 0x7f, 0xc6, 0x58, + 0xee, 0x20, 0x0, 0x4, 0xbe, 0xfd, 0x91, 0x0, + + /* U+0050 "P" */ + 0x6f, 0xff, 0xfc, 0x60, 0x6, 0xf6, 0x45, 0xbf, + 0x80, 0x6f, 0x20, 0x0, 0xdf, 0x6, 0xf2, 0x0, + 0x9, 0xf1, 0x6f, 0x20, 0x0, 0xbf, 0x6, 0xf3, + 0x1, 0x7f, 0xa0, 0x6f, 0xff, 0xff, 0xa1, 0x6, + 0xf5, 0x32, 0x0, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x6, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x20, 0x0, + 0x0, 0x6, 0xf2, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x4, 0xbe, 0xfd, 0x81, 0x0, 0x0, 0x7f, + 0xc6, 0x58, 0xee, 0x20, 0x3, 0xfa, 0x0, 0x0, + 0x2f, 0xc0, 0xa, 0xf1, 0x0, 0x0, 0x8, 0xf4, + 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, 0xf, 0x90, + 0x0, 0x0, 0x0, 0xfa, 0xf, 0x90, 0x0, 0x0, + 0x0, 0xfa, 0xf, 0xb0, 0x0, 0x0, 0x2, 0xf8, + 0xb, 0xf1, 0x0, 0x0, 0x7, 0xf4, 0x3, 0xfa, + 0x0, 0x0, 0x2e, 0xd0, 0x0, 0x7f, 0xc6, 0x47, + 0xef, 0x30, 0x0, 0x4, 0xbe, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x30, + + /* U+0052 "R" */ + 0x6f, 0xff, 0xfd, 0x80, 0x0, 0x6f, 0x64, 0x5a, + 0xf8, 0x0, 0x6f, 0x20, 0x0, 0xcf, 0x0, 0x6f, + 0x20, 0x0, 0x9f, 0x10, 0x6f, 0x20, 0x0, 0xbe, + 0x0, 0x6f, 0x30, 0x16, 0xf6, 0x0, 0x6f, 0xff, + 0xff, 0x90, 0x0, 0x6f, 0x53, 0x5c, 0xf5, 0x0, + 0x6f, 0x20, 0x0, 0xde, 0x0, 0x6f, 0x20, 0x0, + 0x5f, 0x70, 0x6f, 0x20, 0x0, 0xc, 0xe0, 0x6f, + 0x20, 0x0, 0x4, 0xf6, + + /* U+0053 "S" */ + 0x4, 0xbe, 0xfd, 0xa4, 0x6, 0xfc, 0x65, 0x7b, + 0x80, 0xdd, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, + 0x0, 0x0, 0xaf, 0x71, 0x0, 0x0, 0x1, 0xcf, + 0xfe, 0xa4, 0x0, 0x0, 0x27, 0xbf, 0xf7, 0x0, + 0x0, 0x0, 0x1c, 0xf1, 0x0, 0x0, 0x0, 0x6f, + 0x32, 0x0, 0x0, 0x9, 0xf2, 0xec, 0x75, 0x5a, + 0xfb, 0x5, 0xad, 0xff, 0xd7, 0x0, + + /* U+0054 "T" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x55, 0x55, + 0xec, 0x55, 0x54, 0x0, 0x0, 0xe, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, + + /* U+0055 "U" */ + 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, + 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, + 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, + 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, 0x9f, 0x0, + 0x0, 0x4, 0xf5, 0x9f, 0x0, 0x0, 0x4, 0xf5, + 0x8f, 0x10, 0x0, 0x6, 0xf3, 0x4f, 0x70, 0x0, + 0xb, 0xe0, 0xb, 0xf9, 0x56, 0xbf, 0x60, 0x0, + 0x8d, 0xff, 0xc5, 0x0, + + /* U+0056 "V" */ + 0xbe, 0x0, 0x0, 0x0, 0xf, 0xa5, 0xf5, 0x0, + 0x0, 0x6, 0xf4, 0xe, 0xb0, 0x0, 0x0, 0xbe, + 0x0, 0x9f, 0x10, 0x0, 0x1f, 0x80, 0x3, 0xf6, + 0x0, 0x7, 0xf2, 0x0, 0xd, 0xc0, 0x0, 0xdc, + 0x0, 0x0, 0x7f, 0x20, 0x3f, 0x60, 0x0, 0x1, + 0xf8, 0x9, 0xf1, 0x0, 0x0, 0xb, 0xe0, 0xea, + 0x0, 0x0, 0x0, 0x5f, 0x8f, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xf8, + 0x0, 0x0, + + /* U+0057 "W" */ + 0x5f, 0x30, 0x0, 0x1f, 0xe0, 0x0, 0x6, 0xf2, + 0x1f, 0x70, 0x0, 0x5f, 0xf2, 0x0, 0xa, 0xe0, + 0xd, 0xb0, 0x0, 0x9b, 0xd6, 0x0, 0xe, 0xb0, + 0x9, 0xf0, 0x0, 0xd7, 0xaa, 0x0, 0x2f, 0x70, + 0x6, 0xf3, 0x1, 0xf3, 0x6e, 0x0, 0x6f, 0x30, + 0x2, 0xf7, 0x4, 0xf0, 0x2f, 0x20, 0xaf, 0x0, + 0x0, 0xeb, 0x8, 0xb0, 0xe, 0x50, 0xdb, 0x0, + 0x0, 0xae, 0xc, 0x80, 0xa, 0x91, 0xf7, 0x0, + 0x0, 0x6f, 0x3f, 0x40, 0x7, 0xd5, 0xf3, 0x0, + 0x0, 0x2f, 0xbf, 0x0, 0x3, 0xfb, 0xf0, 0x0, + 0x0, 0xe, 0xfc, 0x0, 0x0, 0xff, 0xb0, 0x0, + 0x0, 0xa, 0xf8, 0x0, 0x0, 0xbf, 0x70, 0x0, + + /* U+0058 "X" */ + 0xa, 0xe1, 0x0, 0x0, 0xcd, 0x0, 0x1e, 0xa0, + 0x0, 0x7f, 0x30, 0x0, 0x5f, 0x50, 0x2f, 0x90, + 0x0, 0x0, 0xbe, 0x1c, 0xe0, 0x0, 0x0, 0x1, + 0xfd, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x0, + 0x9f, 0x4f, 0x90, 0x0, 0x0, 0x4f, 0x70, 0x7f, + 0x30, 0x0, 0xd, 0xc0, 0x0, 0xdd, 0x0, 0x8, + 0xf2, 0x0, 0x3, 0xf8, 0x3, 0xf8, 0x0, 0x0, + 0x8, 0xf2, + + /* U+0059 "Y" */ + 0xb, 0xe1, 0x0, 0x0, 0x3f, 0x70, 0x1f, 0xa0, + 0x0, 0xd, 0xc0, 0x0, 0x6f, 0x40, 0x8, 0xf3, + 0x0, 0x0, 0xbe, 0x12, 0xf8, 0x0, 0x0, 0x2, + 0xfa, 0xcd, 0x0, 0x0, 0x0, 0x6, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xeb, 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xeb, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xeb, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x55, 0x55, + 0x55, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xe2, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x6, 0xf7, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0xbf, 0x30, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x1e, + 0xe5, 0x55, 0x55, 0x55, 0x14, 0xff, 0xff, 0xff, + 0xff, 0xf4, + + /* U+005B "[" */ + 0xaf, 0xfb, 0xad, 0x21, 0xad, 0x0, 0xad, 0x0, + 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, + 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, 0xad, 0x0, + 0xad, 0x0, 0xaf, 0xfa, 0x12, 0x21, + + /* U+005C "\\" */ + 0xd7, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x3f, 0x10, + 0x0, 0xe, 0x60, 0x0, 0x9, 0xb0, 0x0, 0x4, + 0xf1, 0x0, 0x0, 0xf5, 0x0, 0x0, 0xaa, 0x0, + 0x0, 0x5f, 0x0, 0x0, 0xf, 0x40, 0x0, 0xb, + 0x90, 0x0, 0x6, 0xe0, 0x0, 0x1, 0xf3, + + /* U+005D "]" */ + 0x7f, 0xfe, 0x2, 0xae, 0x0, 0x9e, 0x0, 0x9e, + 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, + 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, 0x0, 0x9e, + 0x0, 0x9e, 0x6f, 0xfe, 0x2, 0x21, + + /* U+005E "^" */ + 0x0, 0x0, 0x28, 0x50, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x60, 0x0, 0x0, 0x1d, 0xd1, 0x8f, 0x50, + 0x0, 0x1d, 0xc1, 0x0, 0x7f, 0x50, 0xc, 0xc0, + 0x0, 0x0, 0x6f, 0x40, + + /* U+005F "_" */ + 0x2f, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, 0x22, + 0x22, 0x20, + + /* U+0060 "`" */ + 0x4f, 0x40, 0x0, 0x6e, 0x10, 0x0, 0x8b, 0x0, + + /* U+0061 "a" */ + 0x2, 0xae, 0xfd, 0x90, 0x0, 0x48, 0x53, 0x6d, + 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x20, 0x7, 0xce, + 0xff, 0xf5, 0x8, 0xf6, 0x32, 0x3f, 0x50, 0xe8, + 0x0, 0x3, 0xf5, 0xf, 0x70, 0x0, 0x8f, 0x50, + 0xbd, 0x20, 0x6e, 0xf5, 0x1, 0xae, 0xfb, 0x3f, + 0x50, + + /* U+0062 "b" */ + 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, + 0x0, 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe3, 0xcf, + 0xe7, 0x0, 0x8f, 0xe6, 0x49, 0xf6, 0x8, 0xf5, + 0x0, 0xa, 0xe0, 0x8f, 0x0, 0x0, 0x5f, 0x28, + 0xe0, 0x0, 0x3, 0xf3, 0x8f, 0x0, 0x0, 0x5f, + 0x28, 0xf5, 0x0, 0xa, 0xe0, 0x8f, 0xe6, 0x49, + 0xf6, 0x8, 0xe3, 0xcf, 0xe7, 0x0, + + /* U+0063 "c" */ + 0x0, 0x2a, 0xef, 0xd7, 0x3, 0xfd, 0x54, 0x69, + 0xb, 0xe0, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, + 0x1f, 0x70, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x64, 0x69, + 0x0, 0x3b, 0xff, 0xd7, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0xbb, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x5, 0xdf, + 0xd5, 0xbb, 0x4, 0xfb, 0x45, 0xee, 0xb0, 0xcd, + 0x0, 0x3, 0xfb, 0xf, 0x80, 0x0, 0xd, 0xb1, + 0xf6, 0x0, 0x0, 0xcb, 0xf, 0x70, 0x0, 0xd, + 0xb0, 0xcb, 0x0, 0x2, 0xfb, 0x4, 0xf7, 0x2, + 0xcf, 0xb0, 0x5, 0xdf, 0xd6, 0xbb, + + /* U+0065 "e" */ + 0x0, 0x2b, 0xff, 0xc3, 0x0, 0x2f, 0xc5, 0x4a, + 0xf3, 0xb, 0xe0, 0x0, 0xd, 0xa0, 0xf8, 0x0, + 0x0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0xf9, + 0x22, 0x22, 0x22, 0xb, 0xd0, 0x0, 0x0, 0x0, + 0x2f, 0xc6, 0x45, 0x88, 0x0, 0x2a, 0xef, 0xeb, + 0x40, + + /* U+0066 "f" */ + 0x0, 0x5d, 0xff, 0x1, 0xf9, 0x33, 0x3, 0xf3, + 0x0, 0xaf, 0xff, 0xf9, 0x15, 0xf4, 0x21, 0x4, + 0xf3, 0x0, 0x4, 0xf3, 0x0, 0x4, 0xf3, 0x0, + 0x4, 0xf3, 0x0, 0x4, 0xf3, 0x0, 0x4, 0xf3, + 0x0, 0x4, 0xf3, 0x0, + + /* U+0067 "g" */ + 0x0, 0x5d, 0xfd, 0x5b, 0xb0, 0x4f, 0xa4, 0x5d, + 0xeb, 0xc, 0xc0, 0x0, 0x2f, 0xb0, 0xf7, 0x0, + 0x0, 0xdb, 0x1f, 0x60, 0x0, 0xc, 0xb0, 0xf7, + 0x0, 0x0, 0xdb, 0xc, 0xc0, 0x0, 0x2f, 0xb0, + 0x4f, 0xa4, 0x5d, 0xeb, 0x0, 0x5d, 0xfd, 0x5c, + 0xa0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x94, 0x35, + 0xde, 0x10, 0xb, 0xef, 0xea, 0x20, + + /* U+0068 "h" */ + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x2b, 0xfd, 0x60, + 0x8f, 0xd7, 0x49, 0xf4, 0x8f, 0x40, 0x0, 0xda, + 0x8f, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + + /* U+0069 "i" */ + 0x7f, 0x6c, 0x0, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+006A "j" */ + 0x0, 0x7f, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x7f, + 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, + 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, + 0x0, 0x8e, 0x14, 0xda, 0x4f, 0xb2, + + /* U+006B "k" */ + 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, + 0x0, 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, + 0x6f, 0x70, 0x8e, 0x0, 0x7f, 0x60, 0x8, 0xe0, + 0x9f, 0x40, 0x0, 0x8e, 0xae, 0x30, 0x0, 0x8, + 0xff, 0xb0, 0x0, 0x0, 0x8e, 0x3f, 0xa0, 0x0, + 0x8, 0xe0, 0x3f, 0xa0, 0x0, 0x8e, 0x0, 0x3f, + 0xa0, 0x8, 0xe0, 0x0, 0x3f, 0xb0, + + /* U+006C "l" */ + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+006D "m" */ + 0x8e, 0x3c, 0xfd, 0x50, 0x6d, 0xfb, 0x10, 0x8f, + 0xd6, 0x4b, 0xf8, 0xc5, 0x5e, 0xb0, 0x8f, 0x40, + 0x1, 0xfe, 0x0, 0x6, 0xf1, 0x8f, 0x0, 0x0, + 0xea, 0x0, 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, + 0x0, 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, + 0x3, 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, + 0xf3, 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, 0xf3, + 0x8e, 0x0, 0x0, 0xe9, 0x0, 0x3, 0xf3, + + /* U+006E "n" */ + 0x8e, 0x3c, 0xfd, 0x60, 0x8f, 0xc4, 0x16, 0xf4, + 0x8f, 0x30, 0x0, 0xda, 0x8f, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, 0x8e, 0x0, 0x0, 0xac, + 0x8e, 0x0, 0x0, 0xac, + + /* U+006F "o" */ + 0x0, 0x4c, 0xff, 0xb2, 0x0, 0x4f, 0xb4, 0x5d, + 0xe1, 0xc, 0xd0, 0x0, 0x1f, 0x90, 0xf8, 0x0, + 0x0, 0xbd, 0x1f, 0x60, 0x0, 0xa, 0xe0, 0xf8, + 0x0, 0x0, 0xbd, 0xc, 0xd0, 0x0, 0x1f, 0x90, + 0x4f, 0xb5, 0x5d, 0xe1, 0x0, 0x4c, 0xff, 0xb2, + 0x0, + + /* U+0070 "p" */ + 0x8e, 0x4d, 0xfe, 0x70, 0x8, 0xfd, 0x30, 0x6f, + 0x60, 0x8f, 0x40, 0x0, 0x9e, 0x8, 0xf0, 0x0, + 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x3f, 0x38, 0xf0, + 0x0, 0x5, 0xf2, 0x8f, 0x60, 0x0, 0xbe, 0x8, + 0xfe, 0x74, 0x9f, 0x60, 0x8e, 0x3c, 0xfe, 0x70, + 0x8, 0xe0, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x5d, 0xfd, 0x5b, 0xb0, 0x4f, 0xa4, 0x5e, + 0xeb, 0xc, 0xd0, 0x0, 0x3f, 0xb0, 0xf7, 0x0, + 0x0, 0xdb, 0x1f, 0x60, 0x0, 0xc, 0xb0, 0xf7, + 0x0, 0x0, 0xdb, 0xc, 0xd0, 0x0, 0x3f, 0xb0, + 0x4f, 0xb4, 0x5e, 0xeb, 0x0, 0x5d, 0xfd, 0x5b, + 0xb0, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, + 0xb, 0xb0, 0x0, 0x0, 0x0, 0xbb, + + /* U+0072 "r" */ + 0x0, 0x0, 0x0, 0x8e, 0x4c, 0xf9, 0x8f, 0xd4, + 0x12, 0x8f, 0x40, 0x0, 0x8f, 0x0, 0x0, 0x8e, + 0x0, 0x0, 0x8e, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x8e, 0x0, 0x0, + + /* U+0073 "s" */ + 0x1, 0xae, 0xfe, 0xb0, 0xc, 0xd5, 0x35, 0x91, + 0xf, 0x60, 0x0, 0x0, 0xc, 0xe6, 0x20, 0x0, + 0x1, 0x9e, 0xfe, 0x70, 0x0, 0x0, 0x28, 0xf5, + 0x0, 0x0, 0x0, 0xf8, 0x1c, 0x64, 0x49, 0xf3, + 0x9, 0xdf, 0xfc, 0x40, + + /* U+0074 "t" */ + 0x4, 0x70, 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, + 0x0, 0x9f, 0xff, 0xfe, 0x19, 0xf2, 0x21, 0x8, + 0xf0, 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, 0x0, + 0x8, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x5, 0xf6, + 0x32, 0x0, 0x9e, 0xfe, + + /* U+0075 "u" */ + 0xac, 0x0, 0x0, 0xcb, 0xac, 0x0, 0x0, 0xcb, + 0xac, 0x0, 0x0, 0xcb, 0xac, 0x0, 0x0, 0xcb, + 0xac, 0x0, 0x0, 0xcb, 0x9d, 0x0, 0x0, 0xcb, + 0x7e, 0x0, 0x1, 0xfb, 0x2f, 0x81, 0x2b, 0xfb, + 0x5, 0xdf, 0xd5, 0xcb, + + /* U+0076 "v" */ + 0x5f, 0x20, 0x0, 0xb, 0xd0, 0xf8, 0x0, 0x1, + 0xf7, 0x9, 0xe0, 0x0, 0x7f, 0x10, 0x3f, 0x40, + 0xc, 0xb0, 0x0, 0xda, 0x2, 0xf5, 0x0, 0x8, + 0xf0, 0x8f, 0x0, 0x0, 0x2f, 0x5e, 0xa0, 0x0, + 0x0, 0xce, 0xf4, 0x0, 0x0, 0x6, 0xfe, 0x0, + 0x0, + + /* U+0077 "w" */ + 0x3f, 0x30, 0x6, 0xf8, 0x0, 0x2f, 0x40, 0xe7, + 0x0, 0xaf, 0xc0, 0x6, 0xf0, 0xb, 0xb0, 0xe, + 0x8f, 0x0, 0xac, 0x0, 0x6f, 0x3, 0xf1, 0xf4, + 0xe, 0x80, 0x2, 0xf4, 0x7c, 0xb, 0x82, 0xf4, + 0x0, 0xe, 0x8b, 0x80, 0x7c, 0x6f, 0x0, 0x0, + 0xac, 0xf4, 0x3, 0xfb, 0xc0, 0x0, 0x6, 0xff, + 0x0, 0xf, 0xf8, 0x0, 0x0, 0x2f, 0xc0, 0x0, + 0xbf, 0x40, 0x0, + + /* U+0078 "x" */ + 0xd, 0xc0, 0x0, 0x4f, 0x60, 0x3f, 0x80, 0x1e, + 0xb0, 0x0, 0x7f, 0x4b, 0xe1, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0x5, 0xfc, 0x0, 0x0, 0x1, + 0xec, 0xf6, 0x0, 0x0, 0xbe, 0x18, 0xf2, 0x0, + 0x7f, 0x30, 0xc, 0xd0, 0x3f, 0x80, 0x0, 0x2f, + 0x90, + + /* U+0079 "y" */ + 0x4f, 0x30, 0x0, 0xb, 0xc0, 0xe9, 0x0, 0x2, + 0xf6, 0x7, 0xf0, 0x0, 0x8f, 0x0, 0x1f, 0x60, + 0xe, 0x90, 0x0, 0xac, 0x5, 0xf2, 0x0, 0x3, + 0xf3, 0xcc, 0x0, 0x0, 0xd, 0xcf, 0x50, 0x0, + 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x6f, 0x20, 0x0, 0x2, 0x4e, 0xb0, + 0x0, 0x0, 0xbf, 0xc1, 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0xfb, 0x2, 0x22, 0x26, 0xf8, + 0x0, 0x0, 0x1e, 0xb0, 0x0, 0x0, 0xcd, 0x10, + 0x0, 0xa, 0xe2, 0x0, 0x0, 0x8f, 0x40, 0x0, + 0x5, 0xf6, 0x0, 0x0, 0x2f, 0xb2, 0x22, 0x21, + 0x5f, 0xff, 0xff, 0xfb, + + /* U+007B "{" */ + 0x0, 0x9, 0xef, 0x30, 0x6, 0xf6, 0x20, 0x0, + 0x8e, 0x0, 0x0, 0x9, 0xe0, 0x0, 0x0, 0x9d, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x2, 0xe9, 0x0, + 0xf, 0xfc, 0x10, 0x0, 0x25, 0xf8, 0x0, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x9, + 0xe0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x6, 0xf3, + 0x0, 0x0, 0x1c, 0xff, 0x20, 0x0, 0x1, 0x20, + + /* U+007C "|" */ + 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + + /* U+007D "}" */ + 0xfe, 0xb1, 0x0, 0x2, 0x4f, 0x80, 0x0, 0x0, + 0xbb, 0x0, 0x0, 0xb, 0xc0, 0x0, 0x0, 0xbc, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x7f, 0x40, + 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x5f, 0x73, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0xac, 0x0, 0x0, 0xb, + 0xc0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x1e, 0x90, + 0x0, 0xff, 0xd2, 0x0, 0x2, 0x10, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xfe, + 0xa5, 0x12, 0x7a, 0x4d, 0x64, 0x6b, 0xff, 0xfd, + 0x31, 0x0, 0x0, 0x0, 0x31, 0x0, + + /* U+05D0 "א" */ + 0x3f, 0x80, 0x0, 0x3f, 0x40, 0x8f, 0x30, 0x3, + 0xf3, 0x0, 0xdd, 0x0, 0x3f, 0x20, 0x1b, 0xf8, + 0x6, 0xf0, 0xc, 0xb8, 0xf6, 0xe8, 0x4, 0xf1, + 0xc, 0xf7, 0x0, 0x7e, 0x0, 0x2f, 0x80, 0x8, + 0xe0, 0x0, 0x7f, 0x30, 0x8e, 0x0, 0x0, 0xcd, + 0x0, + + /* U+05D1 "ב" */ + 0x5f, 0xff, 0xe8, 0x0, 0x0, 0x11, 0x25, 0xea, + 0x0, 0x0, 0x0, 0x6, 0xf1, 0x0, 0x0, 0x0, + 0x3f, 0x30, 0x0, 0x0, 0x3, 0xf4, 0x0, 0x0, + 0x0, 0x3f, 0x40, 0x0, 0x0, 0x3, 0xf4, 0x0, + 0x22, 0x22, 0x4f, 0x51, 0x5f, 0xff, 0xff, 0xff, + 0x90, + + /* U+05D2 "ג" */ + 0x1f, 0xd8, 0x0, 0x0, 0x14, 0xf7, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x9f, 0x10, 0x0, 0xd, 0xf4, + 0x1, 0x4a, 0xbe, 0x80, 0x4f, 0xc1, 0x9e, 0x0, + + /* U+05D3 "ד" */ + 0x5f, 0xff, 0xff, 0xff, 0x30, 0x11, 0x11, 0xda, + 0x10, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, + 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, + 0x0, 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, + 0x0, 0x0, 0xda, 0x0, 0x0, 0x0, 0xd, 0xa0, + 0x0, + + /* U+05D4 "ה" */ + 0x8f, 0xff, 0xfd, 0x70, 0x1, 0x11, 0x26, 0xf6, + 0x0, 0x0, 0x0, 0x9c, 0x4, 0x0, 0x0, 0x7f, + 0x5f, 0x10, 0x0, 0x7f, 0x6f, 0x10, 0x0, 0x7f, + 0x6f, 0x10, 0x0, 0x7f, 0x6f, 0x10, 0x0, 0x7f, + 0x6f, 0x10, 0x0, 0x7f, + + /* U+05D5 "ו" */ + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, + + /* U+05D6 "ז" */ + 0x5f, 0xff, 0xd0, 0x1c, 0x81, 0x3, 0xf2, 0x0, + 0x6f, 0x10, 0x6, 0xf0, 0x0, 0x6f, 0x0, 0x6, + 0xf0, 0x0, 0x6f, 0x0, 0x6, 0xf0, 0x0, + + /* U+05D7 "ח" */ + 0x8f, 0xff, 0xfd, 0x70, 0x8e, 0x11, 0x26, 0xf7, + 0x8e, 0x0, 0x0, 0x9d, 0x8e, 0x0, 0x0, 0x7f, + 0x8e, 0x0, 0x0, 0x7f, 0x8e, 0x0, 0x0, 0x7f, + 0x8e, 0x0, 0x0, 0x7f, 0x8e, 0x0, 0x0, 0x7f, + 0x8e, 0x0, 0x0, 0x7f, + + /* U+05D8 "ט" */ + 0x8e, 0x0, 0xcf, 0xd4, 0x8, 0xe0, 0x4, 0x3b, + 0xe0, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, 0x0, + 0x0, 0xf7, 0x8e, 0x0, 0x0, 0xf, 0x77, 0xf0, + 0x0, 0x0, 0xf6, 0x4f, 0x30, 0x0, 0x4f, 0x40, + 0xde, 0x63, 0x6e, 0xc0, 0x1, 0xae, 0xfe, 0x91, + 0x0, + + /* U+05D9 "י" */ + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x40, + + /* U+05DA "ך" */ + 0x5f, 0xff, 0xd7, 0x0, 0x1, 0x13, 0x8f, 0x70, + 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, 0x6, 0xf1, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x5, 0xf2, + + /* U+05DB "כ" */ + 0x5f, 0xff, 0xd8, 0x0, 0x1, 0x12, 0x5d, 0xa0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x4, 0xf3, 0x1, 0x12, 0x5d, 0xa0, + 0x5f, 0xff, 0xd8, 0x0, + + /* U+05DC "ל" */ + 0x28, 0x10, 0x0, 0x0, 0x5f, 0x20, 0x0, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfd, + 0x1, 0x11, 0x12, 0xf9, 0x0, 0x0, 0x6, 0xf2, + 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x2f, 0x50, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0xf8, 0x0, + 0x0, 0x6, 0xf2, 0x0, 0x0, 0xc, 0xb0, 0x0, + + /* U+05DD "ם" */ + 0x8f, 0xff, 0xfe, 0x90, 0x8, 0xe1, 0x12, 0x5e, + 0x90, 0x8e, 0x0, 0x0, 0x7f, 0x8, 0xe0, 0x0, + 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x4f, 0x28, 0xe0, + 0x0, 0x4, 0xf2, 0x8e, 0x0, 0x0, 0x4f, 0x28, + 0xe2, 0x22, 0x25, 0xf2, 0x8f, 0xff, 0xff, 0xff, + 0x20, + + /* U+05DE "מ" */ + 0x1f, 0x90, 0xae, 0xfc, 0x20, 0x9, 0xea, 0xc2, + 0x1c, 0xd0, 0x3, 0xff, 0x20, 0x4, 0xf3, 0x0, + 0xfc, 0x0, 0x1, 0xf6, 0x0, 0xf8, 0x0, 0x0, + 0xf6, 0x2, 0xf5, 0x0, 0x0, 0xf6, 0x5, 0xf2, + 0x0, 0x0, 0xf6, 0x8, 0xf0, 0x1, 0x12, 0xf6, + 0xb, 0xc0, 0xf, 0xff, 0xf6, + + /* U+05DF "ן" */ + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, + + /* U+05E0 "נ" */ + 0x1f, 0xea, 0x10, 0x14, 0xea, 0x0, 0x9, 0xe0, + 0x0, 0x8e, 0x0, 0x8, 0xf0, 0x0, 0x8f, 0x0, + 0x8, 0xf0, 0x22, 0x9f, 0x5f, 0xff, 0xf0, + + /* U+05E1 "ס" */ + 0x8f, 0xff, 0xfe, 0x91, 0x8, 0xe3, 0x33, 0x6e, + 0xd0, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, 0x0, + 0x0, 0xf7, 0x8e, 0x0, 0x0, 0xf, 0x77, 0xf0, + 0x0, 0x1, 0xf6, 0x3f, 0x50, 0x0, 0x6f, 0x30, + 0xcf, 0x64, 0x7f, 0xb0, 0x1, 0x9e, 0xfe, 0x90, + 0x0, + + /* U+05E2 "ע" */ + 0x2f, 0x50, 0x0, 0xf, 0x90, 0xea, 0x0, 0x0, + 0xf9, 0x9, 0xe0, 0x0, 0xf, 0x80, 0x4f, 0x30, + 0x0, 0xf7, 0x0, 0xf7, 0x0, 0x2f, 0x50, 0xb, + 0xc0, 0x6, 0xf1, 0x0, 0x6f, 0x2, 0xe9, 0x0, + 0x2, 0xfa, 0xea, 0x0, 0x5, 0xbf, 0xd5, 0x0, + 0x4, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+05E3 "ף" */ + 0x8f, 0xff, 0xfc, 0x50, 0x8e, 0x11, 0x39, 0xf3, + 0x8e, 0x0, 0x0, 0xe9, 0x7f, 0x20, 0x0, 0xbc, + 0x1d, 0xfe, 0x0, 0xac, 0x0, 0x21, 0x0, 0xac, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0xac, + + /* U+05E4 "פ" */ + 0x8f, 0xff, 0xeb, 0x30, 0x8, 0xe1, 0x24, 0xbf, + 0x30, 0x8e, 0x0, 0x0, 0xbc, 0x6, 0xf2, 0x0, + 0x6, 0xf0, 0x1d, 0xfe, 0x0, 0x5f, 0x10, 0x2, + 0x10, 0x6, 0xf0, 0x0, 0x0, 0x0, 0xcc, 0x0, + 0x11, 0x24, 0xaf, 0x30, 0x8f, 0xff, 0xfb, 0x30, + 0x0, + + /* U+05E5 "ץ" */ + 0x1e, 0xa0, 0x0, 0x7f, 0x4, 0xf5, 0x0, 0x8e, + 0x0, 0x9e, 0x10, 0xbb, 0x0, 0x1e, 0x86, 0xf3, + 0x0, 0x9, 0xfe, 0x50, 0x0, 0x6, 0xf1, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x5, 0xf1, 0x0, + + /* U+05E6 "צ" */ + 0x1e, 0xb0, 0x0, 0x6f, 0x0, 0x5f, 0x60, 0x6, + 0xf0, 0x0, 0xaf, 0x10, 0x7e, 0x0, 0x1, 0xeb, + 0xa, 0xb0, 0x0, 0x5, 0xfb, 0xf3, 0x0, 0x0, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, + 0x11, 0x11, 0x7f, 0x60, 0x5f, 0xff, 0xff, 0xff, + 0x0, + + /* U+05E7 "ק" */ + 0x8f, 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x11, + 0x1c, 0xd0, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x4, + 0x0, 0x0, 0x8f, 0x10, 0x5f, 0x10, 0x0, 0xea, + 0x0, 0x5f, 0x10, 0x4, 0xf3, 0x0, 0x5f, 0x10, + 0xb, 0xd0, 0x0, 0x5f, 0x10, 0x1f, 0x60, 0x0, + 0x5f, 0x10, 0x8f, 0x0, 0x0, 0x5f, 0x10, 0x0, + 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, + 0x0, + + /* U+05E8 "ר" */ + 0x5f, 0xff, 0xd9, 0x10, 0x1, 0x12, 0x5e, 0xc0, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0xe9, + + /* U+05E9 "ש" */ + 0x3f, 0x30, 0xf, 0x50, 0xd, 0x91, 0xf5, 0x1, + 0xf4, 0x0, 0xf7, 0xf, 0x70, 0x4f, 0x10, 0x1f, + 0x40, 0xda, 0x1b, 0xc0, 0x4, 0xf1, 0xb, 0xff, + 0xd2, 0x0, 0x8d, 0x0, 0x9e, 0x10, 0x0, 0xd, + 0x80, 0x7, 0xf0, 0x0, 0x9, 0xf1, 0x0, 0x5f, + 0x42, 0x5c, 0xf4, 0x0, 0x2, 0xff, 0xfd, 0x82, + 0x0, 0x0, + + /* U+05EA "ת" */ + 0x7f, 0xff, 0xff, 0xd8, 0x0, 0x3, 0xf6, 0x12, + 0x6f, 0x70, 0x2, 0xf5, 0x0, 0x9, 0xe0, 0x2, + 0xf5, 0x0, 0x6, 0xf0, 0x2, 0xf5, 0x0, 0x6, + 0xf0, 0x2, 0xf5, 0x0, 0x6, 0xf1, 0x2, 0xf4, + 0x0, 0x6, 0xf1, 0x17, 0xf1, 0x0, 0x6, 0xf1, + 0xde, 0x70, 0x0, 0x6, 0xf1, + + /* U+0606 "؆" */ + 0x0, 0x1, 0x51, 0x53, 0x30, 0x0, 0x0, 0xe7, + 0xb8, 0x50, 0xd9, 0x0, 0x9f, 0xcc, 0x10, 0xd, + 0x0, 0x58, 0x0, 0x0, 0x7, 0x60, 0x3a, 0x0, + 0x0, 0x1, 0xc0, 0x2b, 0x0, 0x0, 0x0, 0xb2, + 0x14, 0x0, 0x0, 0x0, 0x58, 0x0, 0x5, 0x50, + 0x0, 0xd, 0x0, 0xe, 0xa5, 0x0, 0x9, 0x40, + 0x4f, 0x10, 0x0, 0x2, 0xa0, 0xab, 0x0, 0x0, + 0x0, 0xc2, 0xf5, 0x0, 0x0, 0x0, 0x6d, 0xf0, + 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, + + /* U+0607 "؇" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xa, + 0xb2, 0x0, 0xc9, 0x0, 0x3c, 0x10, 0x0, 0xc, + 0x0, 0x3d, 0x90, 0x0, 0x7, 0x60, 0xb4, 0x1, + 0x0, 0x1, 0xc0, 0x3c, 0xca, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0xb, 0xd5, + 0x0, 0xd, 0x0, 0x1f, 0x51, 0x0, 0x8, 0x50, + 0x6f, 0x0, 0x0, 0x2, 0xb0, 0xca, 0x0, 0x0, + 0x0, 0xc4, 0xf4, 0x0, 0x0, 0x0, 0x6e, 0xe0, + 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, + + /* U+0609 "؉" */ + 0xd9, 0x0, 0xe, 0x40, 0x0, 0xc8, 0x0, 0x7c, + 0x0, 0x0, 0x0, 0x1, 0xe3, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0x30, 0x0, + 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x2, 0xf2, + 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, + 0x2f, 0x10, 0xe, 0x60, 0x6e, 0xb8, 0x0, 0xf, + 0x70, 0x7f, + + /* U+060A "؊" */ + 0xd9, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0xc8, + 0x0, 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0x10, 0xe, 0x60, 0x6e, 0x0, 0xe7, 0xb8, + 0x0, 0xf, 0x70, 0x7f, 0x0, 0xf7, + + /* U+060C "،" */ + 0x2, 0xc0, 0xba, 0x2f, 0x64, 0xf5, + + /* U+0615 "ؕ" */ + 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, 0x6, 0x65, + 0x50, 0x6, 0xd6, 0xe0, 0xd, 0xdc, 0x70, + + /* U+061B "؛" */ + 0x4, 0xd0, 0xc9, 0x3f, 0x63, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x54, 0xf5, + + /* U+061F "؟" */ + 0x8, 0xef, 0xd8, 0x17, 0xf9, 0x57, 0xd6, 0xcd, + 0x0, 0x0, 0x1b, 0xe0, 0x0, 0x0, 0x3f, 0xa0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x5f, 0x30, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0xd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x0, 0x1, + 0xf7, 0x0, + + /* U+0621 "ء" */ + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x6f, 0x95, + 0x40, 0xad, 0x0, 0x0, 0x8f, 0x40, 0x11, 0x1a, + 0xff, 0xf3, 0x5c, 0xfe, 0x70, 0x9a, 0x40, 0x0, + + /* U+0622 "آ" */ + 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, 0xf0, + 0x0, 0x0, 0x7f, 0x0, 0x0, + + /* U+0623 "أ" */ + 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x17, 0x30, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + + /* U+0624 "ؤ" */ + 0x0, 0x5, 0xc7, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x9, 0xa7, 0x0, 0x0, 0xb, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+0625 "إ" */ + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x16, 0x20, + + /* U+0626 "ئ" */ + 0x1, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xeb, 0x20, 0x0, 0x0, + 0x0, 0x35, 0x20, 0x6d, 0xfe, 0x70, 0x0, 0x0, + 0x4f, 0x94, 0x7f, 0x40, 0x0, 0x5, 0xf7, 0x0, + 0x10, 0x12, 0x0, 0x9, 0xfe, 0x80, 0xc, 0xa0, + 0x0, 0x2, 0x7e, 0xb0, 0xf7, 0x0, 0x0, 0x0, + 0xaf, 0xd, 0xc0, 0x0, 0x2, 0x9f, 0x90, 0x4f, + 0xfc, 0xcf, 0xff, 0x90, 0x0, 0x28, 0xba, 0x85, + 0x10, 0x0, + + /* U+0627 "ا" */ + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+0628 "ب" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, + + /* U+0629 "ة" */ + 0xf, 0x3f, 0x10, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, 0x5a, + 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, 0x3f, + 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, 0x0, + + /* U+062A "ت" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, + 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, 0x0, + + /* U+062B "ث" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+062C "ج" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x2, 0x0, 0x0, 0x6f, 0x0, 0xf, 0x30, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+062D "ح" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, + 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+062E "خ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, + 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+062F "د" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, + + /* U+0630 "ذ" */ + 0x0, 0x7b, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+0631 "ر" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xba, + 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x4e, 0xd0, + 0x14, 0x6c, 0xfd, 0x20, 0xaf, 0xfc, 0x60, 0x0, + 0x33, 0x10, 0x0, 0x0, + + /* U+0632 "ز" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, + 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x4f, 0xd0, 0x14, 0x6c, 0xfd, 0x20, + 0xaf, 0xfc, 0x60, 0x0, 0x33, 0x10, 0x0, 0x0, + + /* U+0633 "س" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xd0, 0x6, + 0xf3, 0x4, 0xf3, 0x5f, 0x10, 0x0, 0x6, 0xf3, + 0xa, 0xf8, 0x6, 0xf1, 0xcb, 0x0, 0x0, 0x6, + 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, + 0x9, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xf8, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbe, + 0x52, 0x27, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0634 "ش" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, + 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, + 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, + 0x10, 0x0, 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, + 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, + 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, + 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0635 "ص" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0636 "ض" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0637 "ط" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+0638 "ظ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x5c, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x1, 0x20, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+0639 "ع" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, + 0x20, 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, + 0xf2, 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, + 0x0, 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, + 0x92, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, + 0xf9, 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+063A "غ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, 0x0, 0x0, + 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, 0x0, 0xaf, + 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, 0x0, 0x0, + 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, 0x31, 0x13, + 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x13, 0x31, 0x0, + + /* U+0640 "ـ" */ + 0x17, 0x77, 0x75, 0x2f, 0xff, 0xfd, + + /* U+0641 "ف" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0xee, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xda, 0x5, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xd1, 0x8f, 0x3b, 0xa0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0xf1, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbc, 0xb, 0xf8, 0x32, 0x12, 0x24, + 0x6a, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, + 0x0, 0x0, + + /* U+0642 "ق" */ + 0x0, 0x0, 0x0, 0x5c, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, + 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, + 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, + 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, + 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, + 0x43, 0x0, 0x0, 0x0, + + /* U+0643 "ك" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, + + /* U+0644 "ل" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, + 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, + 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, + 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, + 0x30, 0x0, 0x0, + + /* U+0645 "م" */ + 0x0, 0x2, 0x87, 0x10, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0xae, 0x11, 0xea, 0x3, 0xdd, 0x32, 0xea, + 0x5f, 0xbe, 0xff, 0xe3, 0xcb, 0x0, 0x23, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + + /* U+0646 "ن" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, + 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, + 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xc9, 0x0, + 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, 0xa, 0xe0, + 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, + 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+0647 "ه" */ + 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, + 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, + 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, + 0x0, + + /* U+0648 "و" */ + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+0649 "ى" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+064A "ي" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x8, 0xff, 0xa1, 0xc, 0xa0, 0x0, 0x0, 0x5e, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xb, 0xd1, + 0x0, 0x4, 0xaf, 0x70, 0x1c, 0xfd, 0xef, 0xfb, + 0x40, 0x0, 0x3, 0x55, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, + 0x0, 0x0, + + /* U+064B "ً" */ + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xd3, 0x27, 0x41, + 0x21, 0x17, 0xbd, 0xb2, 0x25, 0x20, 0x0, + + /* U+064C "ٌ" */ + 0x0, 0x5d, 0x60, 0x0, 0xa7, 0xc0, 0x36, 0x1c, + 0xe3, 0x2a, 0x1c, 0x10, 0x9, 0xc3, 0x0, + + /* U+064D "ٍ" */ + 0x1, 0x48, 0xb3, 0x3c, 0x85, 0x10, 0x3, 0x6a, + 0xd3, 0x3a, 0x63, 0x0, + + /* U+064E "َ" */ + 0x0, 0x0, 0x21, 0x17, 0xbd, 0xb2, 0x25, 0x20, + 0x0, + + /* U+064F "ُ" */ + 0x0, 0x5d, 0x60, 0x0, 0xa7, 0xc0, 0x0, 0x3e, + 0xe3, 0x1, 0x8b, 0x0, 0x3c, 0x60, 0x0, + + /* U+0650 "ِ" */ + 0x0, 0x14, 0x82, 0x3d, 0xc9, 0x50, 0x0, 0x0, + 0x0, + + /* U+0651 "ّ" */ + 0x0, 0x0, 0x32, 0x12, 0x66, 0x56, 0x66, 0x67, + 0x66, 0x66, 0x9c, 0xd3, 0x2e, 0x92, 0x30, + + /* U+0652 "ْ" */ + 0x5, 0xdd, 0x50, 0xe, 0x12, 0xe0, 0xe, 0x22, + 0xe0, 0x5, 0xed, 0x50, + + /* U+0653 "ٓ" */ + 0x2a, 0x20, 0x28, 0x94, 0xbd, 0xa3, 0x0, 0x0, + 0x0, + + /* U+0654 "ٔ" */ + 0x1b, 0xb1, 0x57, 0x0, 0x2e, 0xb3, 0x35, 0x20, + + /* U+0655 "ٕ" */ + 0x1b, 0xb1, 0x57, 0x0, 0x2e, 0xb3, 0x35, 0x20, + + /* U+0657 "ٗ" */ + 0x0, 0x5, 0xc3, 0x0, 0xa8, 0x10, 0x3e, 0xe3, + 0x0, 0xc, 0x7a, 0x0, 0x6, 0xe5, 0x0, + + /* U+065A "ٚ" */ + 0x7, 0x11, 0x70, 0x7, 0xaa, 0x70, 0x0, 0xdd, + 0x0, + + /* U+0660 "٠" */ + 0x8f, 0x29, 0xf2, + + /* U+0661 "١" */ + 0xae, 0x0, 0x4f, 0x30, 0xe, 0x90, 0x9, 0xd0, + 0x5, 0xf1, 0x2, 0xf4, 0x0, 0xf6, 0x0, 0xf6, + 0x0, 0xf7, 0x0, 0xf7, + + /* U+0662 "٢" */ + 0x2f, 0x70, 0x0, 0xac, 0xc, 0xf7, 0x26, 0xf7, + 0x6, 0xff, 0xff, 0xc0, 0x2, 0xf7, 0x33, 0x0, + 0x0, 0xea, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + + /* U+0663 "٣" */ + 0x3f, 0x40, 0xf6, 0x4f, 0x20, 0xda, 0xf, 0x97, + 0xf1, 0x7, 0xfd, 0xff, 0xfc, 0x0, 0x2f, 0x91, + 0x33, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, + + /* U+0664 "٤" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, 0x40, 0x4, + 0xfd, 0x71, 0x0, 0xda, 0x0, 0x0, 0xa, 0xe4, + 0x0, 0x0, 0x2e, 0xf6, 0x0, 0x1e, 0xd6, 0x10, + 0x8, 0xe0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x3, + 0xfb, 0x79, 0xd5, 0x5, 0xdf, 0xd9, 0x10, + + /* U+0665 "٥" */ + 0x0, 0x1, 0x0, 0x0, 0x1d, 0xf9, 0x0, 0xb, + 0xd8, 0xf5, 0x3, 0xf4, 0xb, 0xc0, 0x8e, 0x0, + 0x4f, 0x2c, 0xa0, 0x0, 0xf6, 0xe8, 0x0, 0xe, + 0x8e, 0x80, 0x0, 0xe8, 0xcc, 0x0, 0x2f, 0x67, + 0xfa, 0x8d, 0xf1, 0x8, 0xef, 0xd4, 0x0, + + /* U+0666 "٦" */ + 0x25, 0x21, 0x24, 0x40, 0x4f, 0xff, 0xff, 0xa0, + 0x1, 0x34, 0x3c, 0xa0, 0x0, 0x0, 0xb, 0xb0, + 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, 0x8, 0xe0, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x4, 0xf2, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0xbc, + + /* U+0667 "٧" */ + 0x4f, 0x30, 0x0, 0xad, 0x0, 0xda, 0x0, 0x1f, + 0x60, 0x6, 0xf1, 0x7, 0xe0, 0x0, 0x1f, 0x70, + 0xd9, 0x0, 0x0, 0xbc, 0x2f, 0x40, 0x0, 0x5, + 0xf9, 0xf0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0xdf, 0x70, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x7f, 0x10, 0x0, + + /* U+0668 "٨" */ + 0x0, 0x7, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0x9f, 0x0, 0x0, 0xb, + 0xc2, 0xf4, 0x0, 0x1, 0xf6, 0xd, 0x90, 0x0, + 0x6f, 0x10, 0x7e, 0x0, 0xd, 0xa0, 0x1, 0xf6, + 0x4, 0xf3, 0x0, 0xa, 0xd0, + + /* U+0669 "٩" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf7, 0x0, + 0xd, 0xc5, 0xaf, 0x40, 0x2f, 0x40, 0xd, 0x90, + 0xe, 0xb4, 0x2b, 0xc0, 0x3, 0xdf, 0xff, 0xd0, + 0x0, 0x2, 0x49, 0xf0, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0xbc, + + /* U+066A "٪" */ + 0xd9, 0x0, 0xe, 0x4c, 0x80, 0x7, 0xc0, 0x0, + 0x1, 0xe3, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x1f, + 0x30, 0x0, 0x9, 0xa0, 0x0, 0x2, 0xf2, 0x0, + 0x0, 0xa9, 0x0, 0x0, 0x2f, 0x10, 0xe, 0x6b, + 0x80, 0x0, 0xf7, + + /* U+066B "٫" */ + 0x0, 0x6, 0x80, 0x0, 0x6c, 0x0, 0x8, 0xb0, + 0x0, 0xc7, 0x0, 0x6f, 0x21, 0x7f, 0x60, 0xfe, + 0x60, 0x2, 0x0, 0x0, + + /* U+066C "٬" */ + 0xa, 0x70, 0xf9, 0x3f, 0x27, 0xa0, + + /* U+066D "٭" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x60, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x5, + 0xfd, 0xf1, 0x0, 0x0, 0x94, 0x8, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+066E "ٮ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, + + /* U+066F "ٯ" */ + 0x0, 0x0, 0x0, 0x1b, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0x9e, 0xa0, 0x0, 0x0, 0x0, 0xf9, + 0x7, 0xf0, 0x0, 0x0, 0x0, 0xdc, 0x19, 0xf2, + 0x3, 0x50, 0x0, 0x5f, 0xfe, 0xf3, 0xc, 0x90, + 0x0, 0x1, 0x24, 0xf1, 0xf, 0x50, 0x0, 0x0, + 0x9, 0xd0, 0x2f, 0x40, 0x0, 0x0, 0x3f, 0x60, + 0xf, 0x70, 0x0, 0x4, 0xeb, 0x0, 0xb, 0xe5, + 0x35, 0xaf, 0xb0, 0x0, 0x1, 0xdf, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, 0x0, + + /* U+0670 "ٰ" */ + 0x33, 0x67, 0x67, 0x67, 0x67, + + /* U+0674 "ٴ" */ + 0x8, 0xc5, 0xc, 0x0, 0xc, 0xc7, 0x6, 0x30, + + /* U+0679 "ٹ" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, + 0x66, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe7, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbb, 0xa6, 0x0, 0x1, + 0x18, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, + 0x0, 0x0, 0x18, 0xf6, 0x6f, 0xd8, 0x66, 0x7a, + 0xcf, 0xf7, 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, + 0x0, + + /* U+067A "ٺ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0x0, 0x5, 0x70, 0x0, 0x11, 0x0, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+067B "ٻ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+067C "ټ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, + 0x0, 0x4a, 0xef, 0xff, 0xd9, 0x61, 0x0, 0x0, + 0x0, 0x87, 0x69, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x76, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd3, + 0x0, 0x0, 0x0, + + /* U+067D "ٽ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x60, 0x0, 0x89, 0x0, + 0x0, 0x9b, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+067E "پ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+067F "ٿ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+0680 "ڀ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xa9, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0x0, 0x0, + + /* U+0681 "ځ" */ + 0x0, 0xa, 0xc2, 0x0, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xa4, 0x0, 0x0, 0x0, + 0x38, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, + 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+0682 "ڂ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, + 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+0683 "ڃ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x20, 0x20, 0x0, 0x6f, 0x0, 0xe4, 0xf3, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+0684 "ڄ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xe, 0x30, 0x0, 0x6f, 0x0, + 0x2, 0x0, 0x0, 0x5f, 0x10, 0xf, 0x30, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+0685 "څ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7a, 0x8a, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, + 0xe8, 0x41, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+0686 "چ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, 0x50, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+0687 "ڇ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd5, 0xe4, 0x0, + 0x1f, 0x80, 0x21, 0x20, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+0688 "ڈ" */ + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, + 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, + 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, + 0xe9, 0x10, + + /* U+0689 "ډ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xff, 0xf1, + 0x0, 0xa, 0x58, 0x80, 0x0, 0xb5, 0x88, 0x0, + 0x3, 0xdc, 0x10, + + /* U+068A "ڊ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x11, 0x0, + + /* U+068B "ڋ" */ + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, + 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, + 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, + 0xe9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7, + 0x0, 0x0, 0x1, 0x10, 0x0, + + /* U+068C "ڌ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+068D "ڍ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, + 0x1, 0x11, 0x10, + + /* U+068E "ڎ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, + 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, + 0xe8, 0x0, + + /* U+068F "ڏ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, 0x2b, + 0x60, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0xad, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7f, 0x10, + 0x96, 0xaf, 0xc0, 0xd, 0xfe, 0x91, 0x0, + + /* U+0690 "ڐ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, + 0xe8, 0x0, + + /* U+0691 "ڑ" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0x27, 0x10, 0x0, 0x0, + 0xda, 0x97, 0x0, 0x0, 0x7e, 0xcb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, 0xbb, + 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, + 0x4f, 0xd0, 0x1, 0x46, 0xcf, 0xd1, 0x0, 0xaf, + 0xfc, 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0692 "ڒ" */ + 0x0, 0x0, 0x47, 0x8, 0x40, 0x0, 0x0, 0xd8, + 0xd0, 0x0, 0x0, 0x4, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0xba, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, 0x4e, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0693 "ړ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, 0x1, + 0x9f, 0xfe, 0x90, 0x59, 0xbf, 0xfc, 0xd1, 0xf0, + 0xae, 0xb7, 0x10, 0xbe, 0x90, + + /* U+0694 "ڔ" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xb, + 0xa0, 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, + 0xc, 0xa0, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, + 0x2, 0xed, 0x0, 0x1, 0x4a, 0xfd, 0x20, 0xa, + 0xff, 0xc6, 0x0, 0x98, 0x33, 0x10, 0x0, 0x0, + 0x0, + + /* U+0695 "ڕ" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xd3, 0x0, 0x20, 0x14, 0x6c, 0xfd, 0x2a, + 0x86, 0xb0, 0xaf, 0xfc, 0x60, 0x1, 0xee, 0x20, + 0x33, 0x10, 0x0, 0x0, 0x33, 0x0, + + /* U+0696 "ږ" */ + 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x0, 0x11, 0x0, 0xbb, 0x0, 0x9, 0x90, + 0xe, 0x90, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, + 0x4b, 0xfa, 0x0, 0x7c, 0xef, 0xf9, 0x6, 0x5a, + 0xec, 0x72, 0x0, 0x54, + + /* U+0697 "ڗ" */ + 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, 0x0, + 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, 0xd0, + 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, 0x60, + 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0698 "ژ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+0699 "ڙ" */ + 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+069A "ښ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, 0xc, 0x90, + 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, 0x0, 0x8, + 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, 0x10, 0x0, + 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, 0xca, 0x0, + 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, 0xb0, 0xe8, + 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, + 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, 0x1f, 0x10, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+069B "ڛ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xd0, 0x6, + 0xf3, 0x4, 0xf3, 0x6f, 0x10, 0x0, 0x6, 0xf3, + 0xa, 0xf8, 0x6, 0xf1, 0xca, 0x0, 0x0, 0x6, + 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, + 0xa, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xe8, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x85, 0x59, 0xfe, 0x20, 0xb2, 0xb0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0x91, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, + + /* U+069C "ڜ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, + 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, + 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, + 0x10, 0x0, 0x5, 0xf3, 0xa, 0xf9, 0x7, 0xf1, + 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, + 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, + 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x5f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x85, 0x59, 0xfe, 0x20, + 0xb2, 0xb0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0x91, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+069D "ڝ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0xf3, 0xf0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+069E "ڞ" */ + 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xaf, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, + 0xa, 0x43, 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, + 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, + 0x0, 0x0, 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, + 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, + 0x0, 0xf7, 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+069F "ڟ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0xf, 0x20, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x20, + 0x0, 0x0, 0x0, 0xf, 0x70, 0xf3, 0xf2, 0x0, + 0x0, 0x0, 0xf7, 0x2, 0x2, 0x10, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+06A0 "ڠ" */ + 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, + 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, + 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, + 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, + 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, + 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, + 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+06A1 "ڡ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x9e, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xcd, 0x18, 0xf3, 0xba, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xef, 0x1f, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xc0, 0xbf, 0x83, 0x21, + 0x22, 0x46, 0xaf, 0xe2, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xfc, 0x70, 0x0, 0x0, 0x2, 0x44, 0x43, + 0x10, 0x0, 0x0, 0x0, + + /* U+06A2 "ڢ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, + 0x35, 0x8d, 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xb6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, + + /* U+06A3 "ڣ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, + 0x8d, 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xb6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, + + /* U+06A4 "ڤ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+06A5 "ڥ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x9d, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xc1, 0x6f, 0x3b, 0xb0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0xf3, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x6f, 0x1e, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xc0, 0x7f, 0xa4, 0x21, + 0x23, 0x58, 0xdf, 0xe2, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xfc, 0x70, 0x0, 0x0, 0x2, 0x44, 0x43, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf3, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+06A6 "ڦ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+06A7 "ڧ" */ + 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, + 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, + 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, + 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, + 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, + 0x43, 0x0, 0x0, 0x0, + + /* U+06A8 "ڨ" */ + 0x0, 0x0, 0x0, 0x6, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0x6c, 0x0, 0x0, 0x0, 0x0, 0x2, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, 0xeb, + 0x19, 0xe0, 0x0, 0x0, 0x0, 0xeb, 0x18, 0xf2, + 0x3, 0x50, 0x0, 0x5f, 0xfe, 0xf3, 0xc, 0x90, + 0x0, 0x1, 0x24, 0xf2, 0xf, 0x50, 0x0, 0x0, + 0x9, 0xe0, 0x2f, 0x40, 0x0, 0x0, 0x3f, 0x80, + 0xf, 0x70, 0x0, 0x3, 0xec, 0x0, 0xb, 0xe4, + 0x35, 0xaf, 0xc1, 0x0, 0x1, 0xdf, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, 0x0, + + /* U+06A9 "ک" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf4, 0x0, 0x0, + 0x0, 0x2, 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, + 0x0, 0x0, 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, + 0x49, 0xef, 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, + 0x92, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, + 0x0, 0x0, + + /* U+06AA "ڪ" */ + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, + 0xc9, 0x74, 0x10, 0x0, 0x0, 0x0, 0x5, 0x8b, + 0xdf, 0xff, 0xfc, 0x91, 0x89, 0x0, 0x0, 0x0, + 0x2, 0x57, 0xaf, 0xce, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xd8, 0xf9, 0x42, 0x11, 0x11, 0x24, + 0x9f, 0xf5, 0x7, 0xef, 0xff, 0xff, 0xff, 0xfd, + 0x81, 0x0, 0x0, 0x24, 0x44, 0x44, 0x31, 0x0, + 0x0, + + /* U+06AB "ګ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7e, 0xf4, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe2, 0xd0, 0x0, 0x0, 0x0, 0x9f, + 0x45, 0xa2, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0x20, + 0xbe, 0x50, 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x1e, 0x90, 0x0, 0xd9, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0xb, 0xf0, 0x0, 0x9f, 0x94, 0x22, + 0x49, 0xff, 0x70, 0x0, 0x8, 0xef, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, + 0x0, 0x0, + + /* U+06AC "ڬ" */ + 0x0, 0x0, 0x2f, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x20, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, + + /* U+06AD "ڭ" */ + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf0, 0xe, + 0x90, 0x0, 0x2, 0x2, 0x0, 0xe9, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x2, 0x96, 0x0, + 0xe9, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, + 0x0, 0x58, 0x0, 0xe9, 0x0, 0x2, 0xab, 0x20, + 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x54, + 0x0, 0x0, 0x0, 0xf, 0x7d, 0xa0, 0x0, 0x0, + 0x9, 0xf3, 0x8f, 0xb7, 0x55, 0x8e, 0xf8, 0x0, + 0x5c, 0xef, 0xfe, 0xb4, 0x0, + + /* U+06AE "ڮ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+06AF "گ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xb2, 0x0, 0x0, + 0x0, 0x6, 0xde, 0x81, 0x42, 0x0, 0x0, 0x0, + 0x6b, 0x51, 0x7d, 0xf4, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B0 "ڰ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xaf, 0xa2, 0x0, 0x0, + 0x0, 0x17, 0xde, 0x71, 0x43, 0x0, 0x0, 0x0, + 0x6b, 0x41, 0x7e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xe2, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0x45, 0xa2, + 0xe0, 0x0, 0x0, 0x0, 0x5f, 0x20, 0xbe, 0x50, + 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x35, 0x0, + 0x0, 0x0, 0x1e, 0x90, 0x0, 0xd9, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0xb, 0xf0, 0x0, 0x9f, 0x94, 0x22, 0x49, 0xff, + 0x70, 0x0, 0x8, 0xef, 0xff, 0xfe, 0x93, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B1 "ڱ" */ + 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, + 0x0, 0x0, 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, + 0x0, 0x17, 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, + 0x6b, 0x41, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0x1b, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B2 "ڲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, + 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, + 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd5, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, + + /* U+06B3 "ڳ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, + 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, + 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, + + /* U+06B4 "ڴ" */ + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, 0x0, 0x0, + 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, 0x0, 0x17, + 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, 0x6b, 0x41, + 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xe8, + 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, 0x0, 0x0, + 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x1b, 0xe0, + 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, 0x60, 0x0, + 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, 0x0, 0x0, + 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+06B5 "ڵ" */ + 0x0, 0x0, 0x0, 0x34, 0x5, 0x30, 0x0, 0x0, + 0x1, 0xe5, 0xe0, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x30, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x30, 0x0, 0x0, 0x0, 0x4, 0xf2, 0x3, + 0x60, 0x0, 0x0, 0x5f, 0x20, 0xcb, 0x0, 0x0, + 0x8, 0xf0, 0xd, 0x90, 0x0, 0x2, 0xeb, 0x0, + 0x9f, 0x61, 0x37, 0xef, 0x20, 0x0, 0xaf, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, + 0x0, + + /* U+06B6 "ڶ" */ + 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, 0x5, + 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, 0x0, + 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, 0x20, + 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, 0x30, + 0x0, 0x0, + + /* U+06B7 "ڷ" */ + 0x0, 0x0, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x2f, 0x3e, 0x0, + 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf2, 0x36, 0x0, 0x0, 0x5, 0xf2, 0xcb, 0x0, + 0x0, 0x8, 0xf0, 0xd9, 0x0, 0x0, 0x2e, 0xb0, + 0x9f, 0x61, 0x37, 0xef, 0x20, 0xa, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, + + /* U+06B8 "ڸ" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, + 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, + 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, + 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, + 0x30, 0x0, 0x0, 0x0, 0xb, 0x7b, 0x60, 0x0, + 0x0, 0x1, 0x12, 0x10, 0x0, 0x0, 0x0, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + + /* U+06B9 "ڹ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x60, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x58, + 0x0, 0x0, 0x0, 0xf6, 0xcb, 0x0, 0x0, 0x0, + 0xe8, 0xd9, 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, + 0x0, 0x9, 0xf1, 0x5f, 0x94, 0x23, 0x9f, 0x80, + 0x6, 0xef, 0xff, 0xe7, 0x0, 0x0, 0x3, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, + + /* U+06BA "ں" */ + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x7, 0xf1, 0x12, 0x0, 0x0, 0x1, 0xf5, 0xbc, + 0x0, 0x0, 0x0, 0xf7, 0xda, 0x0, 0x0, 0x0, + 0xf8, 0xd9, 0x0, 0x0, 0x2, 0xf5, 0xac, 0x0, + 0x0, 0xa, 0xf0, 0x4f, 0xa4, 0x24, 0xaf, 0x60, + 0x5, 0xef, 0xff, 0xe6, 0x0, 0x0, 0x3, 0x42, + 0x0, 0x0, + + /* U+06BB "ڻ" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x38, 0x20, 0x0, 0x0, + 0xd, 0xb8, 0x80, 0x0, 0x0, 0x5d, 0xcc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x7a, 0x0, 0x0, 0x0, 0xf7, + 0xca, 0x0, 0x0, 0x0, 0xe8, 0xd9, 0x0, 0x0, + 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x9, 0xf1, 0x5f, + 0xa4, 0x24, 0xaf, 0x80, 0x6, 0xef, 0xff, 0xe6, + 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+06BC "ڼ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, + 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, + 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xd9, 0x0, + 0x0, 0x3, 0xf5, 0xac, 0x0, 0x0, 0xa, 0xe0, + 0x4f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, + 0xe5, 0x0, 0x0, 0xa, 0xfd, 0x70, 0x0, 0x0, + 0xa, 0x66, 0xa0, 0x0, 0x0, 0x3, 0xdd, 0x30, + 0x0, + + /* U+06BD "ڽ" */ + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x2, 0x2, 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, + 0xf2, 0x23, 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, + 0x0, 0x0, 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, + 0xc9, 0x0, 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, + 0xa, 0xe0, 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, + 0xef, 0xff, 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, + 0x0, + + /* U+06BE "ھ" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc3, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xbc, 0xf9, 0x0, 0x0, 0x2f, 0x34, 0xff, + 0x60, 0x0, 0xf, 0x57, 0xe7, 0xe0, 0xda, 0xb, + 0xde, 0x92, 0xf2, 0xce, 0x8b, 0xff, 0x99, 0xf1, + 0x2a, 0xfe, 0x8a, 0xee, 0x70, + + /* U+06BF "ڿ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, + 0x0, 0x0, 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, + 0x6f, 0x0, 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, + 0x50, 0x0, 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, + 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+06C6 "ۆ" */ + 0x0, 0xd, 0x36, 0xb0, 0x0, 0x4, 0xde, 0x20, + 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+06C7 "ۇ" */ + 0x0, 0x2, 0xda, 0x0, 0x0, 0x6, 0x9d, 0x10, + 0x0, 0x1, 0xcf, 0x70, 0x0, 0x5, 0xc2, 0x0, + 0x0, 0xd8, 0x10, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+06C8 "ۈ" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+06CB "ۋ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+06CC "ی" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+06CE "ێ" */ + 0xc, 0x47, 0xa0, 0x0, 0x0, 0x0, 0x2e, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x21, 0x6, 0xdf, 0xe7, + 0x0, 0x0, 0x4, 0xf9, 0x48, 0xf4, 0x0, 0x0, + 0x5f, 0x60, 0x2, 0x10, 0x10, 0x0, 0xbf, 0xe7, + 0x0, 0xbb, 0x0, 0x0, 0x39, 0xfa, 0xf, 0x70, + 0x0, 0x0, 0xa, 0xf0, 0xeb, 0x0, 0x0, 0x17, + 0xfb, 0x6, 0xfd, 0xab, 0xdf, 0xfc, 0x10, 0x5, + 0xdf, 0xfd, 0x94, 0x0, 0x0, + + /* U+06D0 "ې" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x84, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x7, 0xff, 0xa2, 0xd, 0xa0, 0x0, 0x0, 0x5d, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbe, 0xb, 0xd2, + 0x0, 0x14, 0xbf, 0x60, 0x1b, 0xfe, 0xff, 0xea, + 0x30, 0x0, 0x1, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+06D5 "ە" */ + 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, + 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, + 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, + 0x0, + + /* U+06F0 "۰" */ + 0x8f, 0x29, 0xf2, + + /* U+06F1 "۱" */ + 0xae, 0x0, 0x4f, 0x30, 0xe, 0x90, 0x9, 0xd0, + 0x5, 0xf1, 0x2, 0xf4, 0x0, 0xf6, 0x0, 0xf6, + 0x0, 0xf7, 0x0, 0xf7, + + /* U+06F2 "۲" */ + 0x2f, 0x70, 0x0, 0xac, 0xc, 0xf7, 0x26, 0xf7, + 0x6, 0xff, 0xff, 0xc0, 0x2, 0xf7, 0x33, 0x0, + 0x0, 0xea, 0x0, 0x0, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + + /* U+06F3 "۳" */ + 0x3f, 0x40, 0xf6, 0x4f, 0x20, 0xda, 0xf, 0x97, + 0xf1, 0x7, 0xfd, 0xff, 0xfc, 0x0, 0x2f, 0x91, + 0x33, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x0, 0x8, 0xe0, 0x0, 0x0, + + /* U+06F4 "۴" */ + 0x2f, 0x60, 0x9e, 0xd1, 0xc, 0xc6, 0xf5, 0x40, + 0x6, 0xff, 0xf4, 0x22, 0x2, 0xfe, 0xff, 0xf8, + 0x0, 0xe7, 0x24, 0x41, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0x9d, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + + /* U+06F5 "۵" */ + 0x0, 0x4, 0x81, 0x0, 0x0, 0x5f, 0xfd, 0x0, + 0x0, 0xe9, 0x2e, 0x80, 0x7, 0xf1, 0x7, 0xf1, + 0xc, 0xb0, 0x1, 0xf6, 0xf, 0x60, 0x0, 0xd9, + 0x1f, 0x40, 0x0, 0xbb, 0x2f, 0x40, 0x0, 0xab, + 0xf, 0x67, 0xd1, 0xca, 0xc, 0xde, 0xfc, 0xf6, + 0x4, 0xed, 0x6f, 0xc0, + + /* U+06F6 "۶" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0x80, 0x5, + 0xf7, 0x45, 0x0, 0xac, 0x0, 0x0, 0x9, 0xe1, + 0x0, 0x0, 0x2e, 0xfe, 0xf2, 0x0, 0x2f, 0xe7, + 0x0, 0xc, 0xd1, 0x0, 0x6, 0xf2, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, + + /* U+06F7 "۷" */ + 0x4f, 0x30, 0x0, 0xad, 0x0, 0xda, 0x0, 0x1f, + 0x60, 0x6, 0xf1, 0x7, 0xe0, 0x0, 0x1f, 0x70, + 0xd9, 0x0, 0x0, 0xbc, 0x2f, 0x40, 0x0, 0x5, + 0xf9, 0xf0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0xdf, 0x70, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x7f, 0x10, 0x0, + + /* U+06F8 "۸" */ + 0x0, 0x7, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0x9f, 0x0, 0x0, 0xb, + 0xc2, 0xf4, 0x0, 0x1, 0xf6, 0xd, 0x90, 0x0, + 0x6f, 0x10, 0x7e, 0x0, 0xd, 0xa0, 0x1, 0xf6, + 0x4, 0xf3, 0x0, 0xa, 0xd0, + + /* U+06F9 "۹" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf7, 0x0, + 0xd, 0xc5, 0xaf, 0x40, 0x2f, 0x40, 0xd, 0x90, + 0xe, 0xb4, 0x2b, 0xc0, 0x3, 0xdf, 0xff, 0xd0, + 0x0, 0x2, 0x49, 0xf0, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0xbc, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F043 "" */ + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, + 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, + 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0C9 "" */ + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, + + /* U+F0E0 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, + 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, + 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, + 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FB52 "ﭒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+FB53 "ﭓ" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, + + /* U+FB54 "ﭔ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, 0x0, + 0x20, + + /* U+FB55 "ﭕ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FB56 "ﭖ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+FB57 "ﭗ" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, + + /* U+FB58 "ﭘ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, 0x0, 0x3e, 0x0, 0x0, + 0x20, + + /* U+FB59 "ﭙ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FB5A "ﭚ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xa9, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0x0, 0x0, + + /* U+FB5B "ﭛ" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x99, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x0, 0x0, + + /* U+FB5C "ﭜ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, 0x3, 0xf4, 0xe0, 0x2, + 0x2, + + /* U+FB5D "ﭝ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + + /* U+FB5E "ﭞ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0x0, 0x5, 0x70, 0x0, 0x11, 0x0, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+FB5F "ﭟ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x0, 0x11, 0x0, 0x0, 0x9c, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, + 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, + 0xca, 0x51, 0x4, 0xed, + + /* U+FB60 "ﭠ" */ + 0x0, 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FB61 "ﭡ" */ + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3e, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FB62 "ﭢ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+FB63 "ﭣ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, + 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, + 0xca, 0x51, 0x4, 0xed, + + /* U+FB64 "ﭤ" */ + 0x3, 0xf4, 0xe0, 0x2, 0x2, 0x3, 0xf4, 0xe0, + 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FB65 "ﭥ" */ + 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, 0x3, 0xf4, + 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FB66 "ﭦ" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, + 0x66, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe7, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbb, 0xa6, 0x0, 0x1, + 0x18, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, + 0x0, 0x0, 0x18, 0xf6, 0x6f, 0xd8, 0x66, 0x7a, + 0xcf, 0xf7, 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, + 0x0, + + /* U+FB67 "ﭧ" */ + 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x75, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xba, 0x60, 0x0, 0x12, 0x0, 0x89, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xc0, 0xe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xbe, 0x0, 0xeb, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xf1, 0x6, 0xfe, 0x97, 0x78, + 0xad, 0xff, 0x7f, 0xc6, 0x3, 0xae, 0xff, 0xec, + 0x95, 0x0, 0x4e, 0xd0, + + /* U+FB68 "ﭨ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x7f, 0x0, 0x18, 0xeb, 0x0, 0x2f, 0xc2, + 0x0, + + /* U+FB69 "ﭩ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x10, + 0x0, 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, + 0xef, + + /* U+FB6A "ﭪ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+FB6B "ﭫ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, + 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, + 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, + 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, + 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, + + /* U+FB6C "ﭬ" */ + 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FB6D "ﭭ" */ + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, + 0xb9, 0xf4, 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, + 0x0, 0x2f, 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, + 0xf7, 0x71, 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FB6E "ﭮ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc1, 0x8f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcc, 0x17, 0xf3, 0xbb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xef, 0x2f, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xf0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfb, 0x7, 0xfa, 0x42, 0x12, 0x35, 0x8d, + 0xfd, 0x10, 0x6, 0xef, 0xff, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, 0x0, + 0x0, + + /* U+FB6F "ﭯ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, + 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, + 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, + 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, + 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, + + /* U+FB70 "ﭰ" */ + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FB71 "ﭱ" */ + 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x8, 0xa8, 0x90, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, + 0xb9, 0xf4, 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, + 0x0, 0x2f, 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, + 0xf7, 0x71, 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FB72 "ﭲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xe, 0x30, 0x0, 0x6f, 0x0, + 0x2, 0x0, 0x0, 0x5f, 0x10, 0xf, 0x30, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB73 "ﭳ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xff, 0xe7, 0x0, 0x0, + 0xbf, 0x88, 0xd0, 0x0, 0x7, 0xf4, 0x1, 0xf3, + 0x0, 0xf, 0x90, 0x0, 0xac, 0x0, 0x4f, 0x20, + 0xb7, 0x1e, 0xc3, 0x6f, 0x0, 0x11, 0x3, 0xd7, + 0x5f, 0x20, 0xb7, 0x0, 0x0, 0x1f, 0x90, 0x21, + 0x0, 0x0, 0x7, 0xfa, 0x31, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FB74 "ﭴ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+FB75 "ﭵ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+FB76 "ﭶ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x20, 0x20, 0x0, 0x6f, 0x0, 0xe4, 0xf3, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FB77 "ﭷ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x97, 0x5b, 0xff, 0xe6, 0x0, 0x0, + 0xce, 0x67, 0xe0, 0x0, 0xa, 0xe2, 0x1, 0xf4, + 0x0, 0x2f, 0x60, 0x0, 0x9d, 0x10, 0x5f, 0x12, + 0x12, 0x2e, 0xe5, 0x6f, 0x1b, 0x7c, 0x63, 0xd7, + 0x2f, 0x70, 0x0, 0x0, 0x0, 0x9, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB78 "ﭸ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, + + /* U+FB79 "ﭹ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, + + /* U+FB7A "ﭺ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd, 0x50, 0x0, + 0x1f, 0x80, 0x2, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB7B "ﭻ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0xa8, 0x6b, 0xff, 0xe7, 0x0, 0x0, + 0xcf, 0x89, 0xd0, 0x0, 0xa, 0xf3, 0x1, 0xf3, + 0x0, 0x2f, 0x60, 0x0, 0xaa, 0x0, 0x5f, 0x12, + 0x12, 0x2f, 0x71, 0x6f, 0x1c, 0x6d, 0x53, 0xd7, + 0x2f, 0x70, 0xd5, 0x0, 0x0, 0x9, 0xf9, 0x52, + 0x13, 0x73, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB7C "ﭼ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+FB7D "ﭽ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+FB7E "ﭾ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0xd5, 0xd4, 0x0, 0x6f, 0x0, + 0x20, 0x20, 0x0, 0x5f, 0x10, 0xd5, 0xe4, 0x0, + 0x1f, 0x80, 0x21, 0x20, 0x0, 0x8, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB7F "ﭿ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0xa8, 0x6b, 0xff, 0xe7, 0x0, 0x0, + 0xcf, 0x89, 0xd0, 0x0, 0xa, 0xf3, 0x1, 0xf3, + 0x0, 0x2f, 0x60, 0x0, 0xaa, 0x0, 0x5f, 0x12, + 0x12, 0x2f, 0x71, 0x6f, 0x1c, 0x6d, 0x53, 0xd7, + 0x2f, 0x7c, 0x6d, 0x50, 0x0, 0x9, 0xfb, 0x43, + 0x23, 0x73, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FB80 "ﮀ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x79, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x2, 0xef, + 0x60, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x17, 0x8b, + 0xfc, 0x10, 0x0, 0x2f, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x20, + 0x20, 0x0, 0x0, 0x0, 0xd4, 0xe3, 0x0, 0x0, + 0x0, 0x20, 0x20, 0x0, + + /* U+FB81 "ﮁ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x79, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0x3e, 0xe9, 0xf5, 0x0, 0x17, 0x8b, 0xfd, 0x20, + 0xcf, 0x83, 0x2f, 0xeb, 0x60, 0x0, 0x1a, 0xf7, + 0x0, 0x0, 0xe4, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0xd4, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, 0x0, + + /* U+FB82 "ﮂ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, + 0x1, 0x11, 0x10, + + /* U+FB83 "ﮃ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0x60, + 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x0, 0x5, + 0xf2, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, 0x66, + 0xaf, 0xef, 0x83, 0xf, 0xfe, 0x80, 0xaf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0xb7, 0x0, + 0x0, 0x1, 0x11, 0x10, 0x0, + + /* U+FB84 "ﮄ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+FB85 "ﮅ" */ + 0x0, 0xf3, 0xf1, 0x0, 0x0, 0x2, 0x2, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, + 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, 0xf8, + 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FB86 "ﮆ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, + 0xf3, 0xf1, 0x0, 0x2, 0x2, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, 0xdf, + 0xe8, 0x0, + + /* U+FB87 "ﮇ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0xf3, 0xf1, 0x0, 0x0, 0x2, 0x2, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, + 0xdb, 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, + 0x0, 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x0, 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, + 0xf8, 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FB88 "ﮈ" */ + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x26, 0x10, 0x0, + 0xda, 0x98, 0x0, 0x6e, 0xcc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xb7, 0x0, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x5f, 0x20, + 0x0, 0x7, 0xf1, 0x9, 0x6a, 0xfc, 0x0, 0xdf, + 0xe9, 0x10, + + /* U+FB89 "ﮉ" */ + 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x26, 0x10, + 0x0, 0x0, 0xda, 0x98, 0x0, 0x0, 0x6e, 0xcc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xb5, 0x0, 0x0, 0x0, 0x5, 0xf3, 0x0, 0x0, + 0x0, 0xa, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0x7, 0xf6, 0x0, 0x6, 0x6a, 0xfe, + 0xf8, 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FB8A "ﮊ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0xda, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, 0x4f, + 0xd0, 0x1, 0x46, 0xcf, 0xd2, 0x0, 0xaf, 0xfc, + 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+FB8B "ﮋ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, 0x0, + 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0x0, 0xbd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa7, + 0x0, 0x0, 0x0, 0xdd, 0xef, 0x0, 0x0, 0x5, + 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x13, + 0x6b, 0xfb, 0x0, 0x0, 0xaf, 0xfb, 0x50, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+FB8C "ﮌ" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0x27, 0x10, 0x0, 0x0, + 0xda, 0x97, 0x0, 0x0, 0x7e, 0xcb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, 0xbb, + 0x0, 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0x0, 0x4f, 0x50, 0x0, 0x0, + 0x4f, 0xd0, 0x1, 0x46, 0xcf, 0xd1, 0x0, 0xaf, + 0xfc, 0x60, 0x0, 0x3, 0x31, 0x0, 0x0, 0x0, + + /* U+FB8D "ﮍ" */ + 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x38, 0x10, 0x0, + 0x0, 0xe, 0xa9, 0x70, 0x0, 0x0, 0x7e, 0xcb, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xbd, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xa7, 0x0, 0x0, 0x0, 0xdd, 0xef, 0x0, + 0x0, 0x5, 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xb0, + 0x0, 0x13, 0x6b, 0xfb, 0x0, 0x0, 0xaf, 0xfb, + 0x50, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + + /* U+FB8E "ﮎ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf4, 0x0, 0x0, + 0x0, 0x2, 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, + 0x0, 0x0, 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, + 0x49, 0xef, 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, + 0x92, 0x0, 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, + 0x0, 0x0, + + /* U+FB8F "ﮏ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, + 0x1e, 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, + 0x7f, 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, + 0xde, 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, + 0xbf, 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, + 0x0, + + /* U+FB90 "ﮐ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb9, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x8, 0xff, + 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, 0x0, + 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, 0x0, + 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, 0xff, + 0xd4, 0x0, 0x0, + + /* U+FB91 "ﮑ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x90, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x0, + 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, 0x10, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, + 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x17, + 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, 0xd4, 0x8, + 0xef, + + /* U+FB92 "ﮒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xb2, 0x0, 0x0, + 0x0, 0x6, 0xde, 0x81, 0x42, 0x0, 0x0, 0x0, + 0x6b, 0x51, 0x7d, 0xf4, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x1e, 0xb0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+FB93 "ﮓ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xde, 0x30, 0x0, + 0x0, 0x0, 0x3, 0x9f, 0xb5, 0x11, 0x0, 0x0, + 0x0, 0x6, 0xe8, 0x23, 0xaf, 0x50, 0x0, 0x0, + 0x0, 0x11, 0x6d, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x1e, + 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, 0xde, + 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, 0xbf, + 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, + + /* U+FB94 "ﮔ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x17, + 0xd9, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1d, 0xe8, + 0x14, 0xb9, 0x1, 0x51, 0x7d, 0xfc, 0x40, 0x8, + 0xff, 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, + 0x3f, 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, + 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, + 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, + 0xff, 0xd4, 0x0, 0x0, + + /* U+FB95 "ﮕ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, + 0x7d, 0x90, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1, + 0xde, 0x81, 0x4b, 0x90, 0x1, 0x51, 0x7d, 0xfc, + 0x40, 0x0, 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, + 0x10, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, + 0xd4, 0x8, 0xef, + + /* U+FB96 "ﮖ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0x91, 0x0, 0x0, + 0x0, 0x18, 0xed, 0x61, 0x63, 0x0, 0x0, 0x0, + 0x6a, 0x32, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0xb, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xef, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, + + /* U+FB97 "ﮗ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xde, 0x30, 0x0, + 0x0, 0x0, 0x3, 0x9f, 0xb5, 0x11, 0x0, 0x0, + 0x0, 0x6, 0xe8, 0x23, 0xaf, 0x50, 0x0, 0x0, + 0x0, 0x11, 0x6d, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xc0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x1e, + 0xa0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0x60, 0x0, 0xe8, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x30, 0x9, 0xf9, 0x31, 0x24, 0x8e, 0xfa, 0xde, + 0x84, 0x8, 0xef, 0xff, 0xfe, 0xa4, 0x1, 0xbf, + 0xb0, 0x0, 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FB98 "ﮘ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x17, + 0xd9, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1d, 0xe8, + 0x14, 0xb9, 0x1, 0x51, 0x7d, 0xfc, 0x40, 0x8, + 0xff, 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, + 0x3f, 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, + 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, + 0x0, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, + + /* U+FB99 "ﮙ" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x1, + 0x7d, 0x90, 0x0, 0x3, 0xaf, 0xb4, 0x0, 0x1, + 0xde, 0x81, 0x4b, 0x90, 0x1, 0x51, 0x7d, 0xfc, + 0x40, 0x0, 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, + 0x10, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, + 0xd4, 0x8, 0xef, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, + + /* U+FB9A "ﮚ" */ + 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, + 0x0, 0x0, 0x20, 0x25, 0xbf, 0xa1, 0x0, 0x0, + 0x0, 0x17, 0xdd, 0x71, 0x53, 0x0, 0x0, 0x0, + 0x6b, 0x41, 0x8e, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0xe9, 0x0, 0x0, 0x0, + 0x1b, 0xe0, 0x0, 0x8f, 0x94, 0x22, 0x49, 0xff, + 0x60, 0x0, 0x7, 0xef, 0xff, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x2, 0x43, 0x10, 0x0, 0x0, 0x0, + + /* U+FB9B "ﮛ" */ + 0x0, 0x0, 0x0, 0xf3, 0xf2, 0x2, 0x84, 0x0, + 0x0, 0x0, 0x2, 0x3, 0x6b, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x18, 0xec, 0x61, 0x63, 0x0, 0x0, + 0x0, 0x5, 0x93, 0x4a, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xe9, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x3, + 0xf6, 0x0, 0x0, 0xca, 0x0, 0x0, 0x0, 0x8, + 0xf4, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0xaf, + 0xf3, 0x0, 0xaf, 0x83, 0x12, 0x48, 0xef, 0xad, + 0xe8, 0x40, 0x9f, 0xff, 0xff, 0xfa, 0x40, 0x1b, + 0xfb, 0x0, 0x2, 0x43, 0x20, 0x0, 0x0, 0x0, + 0x0, + + /* U+FB9C "ﮜ" */ + 0x6, 0xc7, 0xb0, 0x16, 0x70, 0x12, 0x15, 0xaf, + 0xb4, 0x0, 0x6d, 0xe8, 0x24, 0x60, 0x1b, 0x42, + 0x8e, 0xf7, 0x0, 0x3b, 0xfe, 0x81, 0x0, 0x1f, + 0xc5, 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, + 0xc, 0xe1, 0x0, 0x0, 0x0, 0x1e, 0xd0, 0x0, + 0x0, 0x0, 0x2f, 0xa0, 0x0, 0x0, 0x0, 0x5f, + 0x30, 0x0, 0x0, 0x2, 0xf5, 0x0, 0x17, 0x77, + 0xdf, 0x10, 0x2, 0xff, 0xfd, 0x40, 0x0, + + /* U+FB9D "ﮝ" */ + 0x6, 0xc7, 0xb0, 0x16, 0x70, 0x1, 0x21, 0x5a, + 0xfb, 0x40, 0x0, 0x6d, 0xe8, 0x24, 0x60, 0x1, + 0xb4, 0x28, 0xef, 0x70, 0x0, 0x3b, 0xfe, 0x81, + 0x0, 0x1, 0xfc, 0x50, 0x0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xce, 0x10, 0x0, 0x0, + 0x0, 0x1e, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0x90, 0x0, 0x0, + 0x0, 0x2f, 0xf7, 0x0, 0x17, 0x77, 0xdf, 0xaf, + 0x97, 0x2f, 0xff, 0xd4, 0x8, 0xef, + + /* U+FB9E "ﮞ" */ + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x7, 0xf1, 0x12, 0x0, 0x0, 0x1, 0xf5, 0xbc, + 0x0, 0x0, 0x0, 0xf7, 0xda, 0x0, 0x0, 0x0, + 0xf8, 0xd9, 0x0, 0x0, 0x2, 0xf5, 0xac, 0x0, + 0x0, 0xa, 0xf0, 0x4f, 0xa4, 0x24, 0xaf, 0x60, + 0x5, 0xef, 0xff, 0xe6, 0x0, 0x0, 0x3, 0x42, + 0x0, 0x0, + + /* U+FB9F "ﮟ" */ + 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf2, 0x0, 0x47, 0x0, 0x0, 0x0, + 0xf9, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xef, 0x82, + 0xc9, 0x0, 0x0, 0x0, 0xfe, 0xf5, 0xc9, 0x0, + 0x0, 0x3, 0xf5, 0x0, 0xad, 0x0, 0x0, 0xa, + 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, 0x40, 0x0, + 0x4, 0xef, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, + 0x42, 0x0, 0x0, 0x0, + + /* U+FBA0 "ﮠ" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x38, 0x20, 0x0, 0x0, + 0xd, 0xb8, 0x80, 0x0, 0x0, 0x5d, 0xcc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x7a, 0x0, 0x0, 0x0, 0xf7, + 0xca, 0x0, 0x0, 0x0, 0xe8, 0xd9, 0x0, 0x0, + 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x9, 0xf1, 0x5f, + 0xa4, 0x24, 0xaf, 0x80, 0x6, 0xef, 0xff, 0xe6, + 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+FBA1 "ﮡ" */ + 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x16, 0x10, 0x0, 0x0, 0x0, 0xd, 0xa8, 0x80, + 0x0, 0x0, 0x0, 0x5d, 0xcc, 0x33, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xf1, 0x0, 0x35, 0x0, + 0x0, 0x1, 0xf8, 0x0, 0xac, 0x0, 0x0, 0x0, + 0xef, 0x82, 0xca, 0x0, 0x0, 0x0, 0xfe, 0xf5, + 0xc9, 0x0, 0x0, 0x2, 0xf5, 0x0, 0xad, 0x0, + 0x0, 0xa, 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, + 0x40, 0x0, 0x5, 0xef, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x3, 0x42, 0x0, 0x0, 0x0, + + /* U+FBA2 "ﮢ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x7f, 0x0, 0x18, 0xeb, 0x0, 0x2f, 0xc2, + 0x0, + + /* U+FBA3 "ﮣ" */ + 0x1, 0xb0, 0x0, 0x1, 0xb3, 0x60, 0x1, 0xe9, + 0xa5, 0x8, 0xec, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x6f, 0x10, + 0x0, 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, + 0xef, + + /* U+FBAA "ﮪ" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc3, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xbc, 0xf9, 0x0, 0x0, 0x2f, 0x34, 0xff, + 0x60, 0x0, 0xf, 0x57, 0xe7, 0xe0, 0xda, 0xb, + 0xde, 0x92, 0xf2, 0xce, 0x8b, 0xff, 0x99, 0xf1, + 0x2a, 0xfe, 0x8a, 0xee, 0x70, + + /* U+FBAB "ﮫ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe3, 0x0, 0x0, 0x6, 0xf7, 0xbb, 0x0, 0x0, + 0xd, 0xb0, 0x9c, 0x0, 0xc9, 0xf, 0x75, 0xf8, + 0x0, 0xce, 0x8f, 0xcf, 0xf8, 0x71, 0x2b, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xf, 0x74, 0xd4, 0x0, + 0x0, 0xb, 0xe3, 0xad, 0x0, 0x0, 0x1, 0xcf, + 0xf7, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + + /* U+FBAC "ﮬ" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x9, 0xe6, 0x0, + 0x0, 0x0, 0x2e, 0xfb, 0x0, 0x0, 0xa, 0xda, + 0xfc, 0x0, 0x0, 0xe7, 0xf, 0xfa, 0x0, 0xd, + 0xa4, 0xf7, 0xf3, 0x0, 0x9f, 0xee, 0xe, 0x71, + 0x7a, 0xff, 0xa5, 0xe6, 0x2f, 0xea, 0xae, 0xfa, + 0x0, + + /* U+FBAD "ﮭ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xf8, + 0x0, 0x0, 0x3f, 0x98, 0xf1, 0x0, 0x9, 0xd0, + 0x9e, 0x0, 0x17, 0xdd, 0xbf, 0x97, 0x32, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xbb, 0x6f, 0x60, 0x0, + 0x9, 0xe0, 0x7f, 0x0, 0x0, 0x3f, 0x77, 0xf0, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, + + /* U+FBD3 "ﯓ" */ + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x1, 0xf3, 0xf0, 0xe, + 0x90, 0x0, 0x2, 0x2, 0x0, 0xe9, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x2, 0x96, 0x0, + 0xe9, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, + 0x0, 0x58, 0x0, 0xe9, 0x0, 0x2, 0xab, 0x20, + 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x54, + 0x0, 0x0, 0x0, 0xf, 0x7d, 0xa0, 0x0, 0x0, + 0x9, 0xf3, 0x8f, 0xb7, 0x55, 0x8e, 0xf8, 0x0, + 0x5c, 0xef, 0xfe, 0xb4, 0x0, + + /* U+FBD4 "ﯔ" */ + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, + 0xf0, 0xe, 0x90, 0x0, 0x0, 0x2, 0x2, 0x0, + 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, + 0x0, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x0, 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, + 0x58, 0x0, 0xe9, 0x0, 0x0, 0x2, 0xab, 0x20, + 0xe, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x22, 0x0, 0x0, 0x0, 0xf, 0x90, 0xd, + 0xa0, 0x0, 0x0, 0x9, 0xfa, 0x0, 0x9f, 0xb7, + 0x55, 0x8e, 0xfd, 0xf8, 0x40, 0x6c, 0xff, 0xfe, + 0xa4, 0x9, 0xfa, + + /* U+FBD5 "ﯕ" */ + 0x0, 0x6b, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x6, 0xc7, 0xb0, 0x0, 0x10, 0x12, 0x11, + 0x5, 0xca, 0x0, 0x1, 0x8e, 0xfa, 0x30, 0x9, + 0xfe, 0x81, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0x70, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x0, + 0x0, 0x0, 0xce, 0x20, 0x0, 0x0, 0x1, 0xec, + 0x0, 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, + 0x3f, 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, + 0xff, 0xd4, 0x0, 0x0, + + /* U+FBD6 "ﯖ" */ + 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x6, 0xc7, 0xb0, 0x0, 0x10, 0x1, + 0x21, 0x10, 0x5c, 0xa0, 0x0, 0x1, 0x8e, 0xfa, + 0x30, 0x0, 0x9f, 0xe8, 0x10, 0x0, 0x3, 0xf8, + 0x0, 0x0, 0x0, 0x3, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0xed, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x0, 0x17, 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, + 0xd4, 0x8, 0xef, + + /* U+FBD7 "ﯗ" */ + 0x0, 0x2, 0xda, 0x0, 0x0, 0x6, 0x9d, 0x10, + 0x0, 0x1, 0xcf, 0x70, 0x0, 0x5, 0xc2, 0x0, + 0x0, 0xd8, 0x10, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+FBD8 "ﯘ" */ + 0x0, 0x2, 0xda, 0x0, 0x0, 0x0, 0x6, 0x9d, + 0x10, 0x0, 0x0, 0x1, 0xcf, 0x70, 0x0, 0x0, + 0x5, 0xc2, 0x0, 0x0, 0x0, 0xd8, 0x10, 0x0, + 0x0, 0x0, 0x8, 0xed, 0x40, 0x0, 0x0, 0x6f, + 0xac, 0xf1, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, + 0x0, 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, + 0x0, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, + 0x0, 0x0, 0x0, + + /* U+FBD9 "ﯙ" */ + 0x0, 0xd, 0x36, 0xb0, 0x0, 0x4, 0xde, 0x20, + 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FBDA "ﯚ" */ + 0x0, 0xd, 0x36, 0xb0, 0x0, 0x0, 0x4, 0xde, + 0x20, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, 0x40, + 0x0, 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x0, 0xae, + 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, 0xfb, 0x73, + 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x12, + 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, 0xa1, 0x0, + 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, + + /* U+FBDB "ﯛ" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FBDC "ﯜ" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x60, 0x0, 0x0, 0x7f, 0xac, 0xf2, 0x0, + 0x0, 0xae, 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, + 0xfb, 0x73, 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, + 0x0, 0x12, 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, + 0xa1, 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, + + /* U+FBDE "ﯞ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FBDF "ﯟ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0xa, 0x8b, 0x70, 0x0, 0x0, + 0x1, 0x11, 0x10, 0x0, 0x0, 0x4, 0xaa, 0x20, + 0x0, 0x0, 0x5f, 0xac, 0xe1, 0x0, 0x0, 0xae, + 0x1, 0xf6, 0x0, 0x0, 0x6f, 0xa7, 0xfb, 0x73, + 0x0, 0x8, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x12, + 0x48, 0xee, 0x20, 0x0, 0xaf, 0xff, 0xa1, 0x0, + 0x0, 0x34, 0x20, 0x0, 0x0, 0x0, + + /* U+FBE4 "ﯤ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x84, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x7, 0xff, 0xa2, 0xd, 0xa0, 0x0, 0x0, 0x5d, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbe, 0xb, 0xd2, + 0x0, 0x14, 0xbf, 0x60, 0x1b, 0xfe, 0xff, 0xea, + 0x30, 0x0, 0x1, 0x43, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+FBE5 "ﯥ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + + /* U+FBE6 "ﯦ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x20, 0x0, 0x3e, 0x0, 0x0, + 0x20, + + /* U+FBE7 "ﯧ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FBE8 "ﯨ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, + + /* U+FBE9 "ﯩ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FBFC "ﯼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+FBFD "ﯽ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, + + /* U+FBFE "ﯾ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, + + /* U+FBFF "ﯿ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + + /* U+FE70 "ﹰ" */ + 0x0, 0x0, 0x14, 0x8b, 0xd7, 0x85, 0x21, 0x26, + 0xad, 0xc6, 0x63, 0x0, 0x0, + + /* U+FE71 "ﹱ" */ + 0x0, 0x0, 0x1, 0x4, 0x8b, 0xd7, 0x8, 0x52, + 0x12, 0x6, 0xad, 0xc6, 0x6, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE72 "ﹲ" */ + 0x1, 0xdb, 0x0, 0x4a, 0xc2, 0xa0, 0x9f, 0x8b, + 0x1a, 0x50, 0x4d, 0x70, 0x0, + + /* U+FE73 "ﹳ" */ + 0x2f, 0x50, 0x0, 0xee, 0x72, 0x3, 0xdf, 0x50, + + /* U+FE74 "ﹴ" */ + 0x3, 0x7a, 0x8c, 0xa6, 0x30, 0x25, 0x9c, 0x8a, + 0x84, 0x10, + + /* U+FE76 "ﹶ" */ + 0x0, 0x1, 0x26, 0xad, 0xc6, 0x63, 0x0, 0x0, + + /* U+FE77 "ﹷ" */ + 0x0, 0x0, 0x12, 0x6, 0xad, 0xc6, 0x6, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, + 0x75, 0x2f, 0xff, 0xfd, + + /* U+FE78 "ﹸ" */ + 0x1, 0xdb, 0x0, 0x5a, 0xc2, 0x0, 0xbf, 0x80, + 0x5d, 0x20, 0xc8, 0x10, 0x0, + + /* U+FE79 "ﹹ" */ + 0x0, 0x1d, 0xb0, 0x0, 0x5a, 0xc1, 0x0, 0xc, + 0xe8, 0x0, 0x5c, 0x20, 0xc, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE7A "ﹺ" */ + 0x0, 0x36, 0x6b, 0xda, 0x62, 0x10, 0x0, 0x0, + + /* U+FE7B "ﹻ" */ + 0x17, 0x77, 0x75, 0x2f, 0xff, 0xfd, 0x0, 0x3, + 0x66, 0xb, 0xda, 0x62, 0x1, 0x0, 0x0, + + /* U+FE7C "ﹼ" */ + 0x0, 0x0, 0x5, 0x4, 0xb, 0xc, 0xb, 0xc, + 0x1c, 0x1c, 0x3e, 0xc8, 0xb, 0xd2, 0x50, + + /* U+FE7D "ﹽ" */ + 0x0, 0x5, 0xb, 0xb, 0xc, 0xc, 0x1b, 0x1f, + 0x6a, 0xe, 0xb7, 0xb2, 0x2, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE7E "ﹾ" */ + 0x2c, 0xe9, 0xb, 0x60, 0xb5, 0xb6, 0xb, 0x52, + 0xce, 0x90, + + /* U+FE7F "ﹿ" */ + 0x2, 0xce, 0x90, 0xb, 0x60, 0xb5, 0xb, 0x60, + 0xb5, 0x2, 0xce, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x77, 0x75, 0x2f, + 0xff, 0xfd, + + /* U+FE80 "ﺀ" */ + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x6f, 0x95, + 0x40, 0xad, 0x0, 0x0, 0x8f, 0x40, 0x11, 0x1a, + 0xff, 0xf3, 0x5c, 0xfe, 0x70, 0x9a, 0x40, 0x0, + + /* U+FE81 "ﺁ" */ + 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, 0xf0, + 0x0, 0x0, 0x7f, 0x0, 0x0, + + /* U+FE82 "ﺂ" */ + 0x19, 0x40, 0x19, 0x8, 0x5a, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, + 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, + 0x7, 0xf0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x3, 0xfb, + 0x70, 0x0, 0x7, 0xef, 0x0, + + /* U+FE83 "ﺃ" */ + 0x8, 0xc3, 0x1b, 0x0, 0xd, 0x85, 0x2d, 0x93, + 0x0, 0x0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, + + /* U+FE84 "ﺄ" */ + 0x8, 0xc3, 0x0, 0x1b, 0x0, 0x0, 0xd, 0x85, + 0x0, 0x2d, 0x93, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, + 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, + 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, + 0xf0, 0x0, 0x6, 0xf0, 0x0, 0x3, 0xfb, 0x70, + 0x0, 0x7e, 0xf0, + + /* U+FE85 "ﺅ" */ + 0x0, 0x5, 0xc7, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0x9, 0xa7, 0x0, 0x0, 0xb, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xed, 0x40, + 0x0, 0x6f, 0xac, 0xf1, 0x0, 0x9e, 0x1, 0xf6, + 0x0, 0x6f, 0xa6, 0xf7, 0x0, 0x8, 0xdf, 0xf7, + 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x2e, 0xe0, + 0x12, 0x48, 0xef, 0x30, 0xaf, 0xff, 0xa2, 0x0, + 0x34, 0x20, 0x0, 0x0, + + /* U+FE86 "ﺆ" */ + 0x0, 0x5, 0xc7, 0x0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xb8, 0x0, 0x0, 0x0, + 0x8, 0x62, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x80, 0x0, 0x0, 0x8f, + 0xac, 0xf2, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, + 0x0, 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, + 0x0, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, + 0x0, 0x0, 0x0, + + /* U+FE87 "ﺇ" */ + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, 0x7, 0xf0, + 0x9, 0xc3, 0x1b, 0x0, 0xd, 0xb6, 0x16, 0x20, + + /* U+FE88 "ﺈ" */ + 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, + 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, + 0xf0, 0x0, 0x7, 0xf0, 0x0, 0x7, 0xf0, 0x0, + 0x7, 0xf0, 0x0, 0x6, 0xf0, 0x0, 0x3, 0xfb, + 0x70, 0x0, 0x7e, 0xf0, 0x9, 0xc3, 0x0, 0x1b, + 0x0, 0x0, 0xd, 0xb6, 0x0, 0x16, 0x20, 0x0, + + /* U+FE89 "ﺉ" */ + 0x1, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xeb, 0x20, 0x0, 0x0, + 0x0, 0x35, 0x20, 0x6d, 0xfe, 0x70, 0x0, 0x0, + 0x4f, 0x94, 0x7f, 0x40, 0x0, 0x5, 0xf7, 0x0, + 0x10, 0x12, 0x0, 0x9, 0xfe, 0x80, 0xc, 0xa0, + 0x0, 0x2, 0x7e, 0xb0, 0xf7, 0x0, 0x0, 0x0, + 0xaf, 0xd, 0xc0, 0x0, 0x2, 0x9f, 0x90, 0x4f, + 0xfc, 0xcf, 0xff, 0x90, 0x0, 0x28, 0xba, 0x85, + 0x10, 0x0, + + /* U+FE8A "ﺊ" */ + 0x0, 0x3c, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x95, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x80, + 0xb, 0xb0, 0x0, 0x0, 0xcd, 0x7f, 0x40, 0xe7, + 0x0, 0x0, 0xb, 0xf4, 0x9e, 0x3e, 0x90, 0x0, + 0x0, 0x1d, 0xb0, 0xb7, 0x8f, 0x83, 0x12, 0x49, + 0xf6, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x3, 0x44, 0x20, 0x0, 0x0, 0x0, + + /* U+FE8B "ﺋ" */ + 0x0, 0x8c, 0x50, 0xc, 0x0, 0x0, 0xcb, 0x70, + 0x7, 0x30, 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x17, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FE8C "ﺌ" */ + 0x0, 0x8c, 0x50, 0x0, 0xc0, 0x0, 0x0, 0xcb, + 0x70, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FE8D "ﺍ" */ + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, + + /* U+FE8E "ﺎ" */ + 0x7f, 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x7, + 0xf0, 0x0, 0x7f, 0x0, 0x7, 0xf0, 0x0, 0x7f, + 0x0, 0x7, 0xf0, 0x0, 0x7f, 0x0, 0x6, 0xf0, + 0x0, 0x3f, 0xb7, 0x0, 0x7e, 0xf0, + + /* U+FE8F "ﺏ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xbd, 0xb0, 0x0, 0x0, 0x0, + 0x2a, 0xf4, 0x5f, 0xd8, 0x66, 0x8a, 0xdf, 0xe5, + 0x0, 0x3a, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, + + /* U+FE90 "ﺐ" */ + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xae, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xf1, 0x5, 0xfe, + 0x97, 0x78, 0xad, 0xfe, 0x7f, 0xc6, 0x3, 0xae, + 0xff, 0xec, 0x95, 0x0, 0x4e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+FE91 "ﺑ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x20, + + /* U+FE92 "ﺒ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + + /* U+FE93 "ﺓ" */ + 0xf, 0x3f, 0x10, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, 0x5a, + 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, 0x3f, + 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, 0x0, + + /* U+FE94 "ﺔ" */ + 0x4, 0xe4, 0xd0, 0x0, 0x0, 0x20, 0x20, 0x0, + 0x0, 0x3, 0xb1, 0x0, 0x4, 0xcf, 0xf3, 0x0, + 0x5f, 0x82, 0xf6, 0x0, 0xc9, 0x0, 0xda, 0x0, + 0xae, 0xbd, 0xff, 0x85, 0x4, 0x75, 0x8, 0xfb, + + /* U+FE95 "ﺕ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xce, 0xa0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x7f, 0xd8, 0x66, 0x79, 0xcf, 0xf8, + 0x0, 0x4a, 0xef, 0xfe, 0xc9, 0x61, 0x0, + + /* U+FE96 "ﺖ" */ + 0x0, 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, + 0x70, 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, + 0x77, 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, + 0xfe, 0xca, 0x51, 0x4, 0xed, + + /* U+FE97 "ﺗ" */ + 0x3, 0xf4, 0xe0, 0x2, 0x2, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x6f, 0x0, 0x7, 0xf0, 0x18, + 0xec, 0x2, 0xfc, 0x20, + + /* U+FE98 "ﺘ" */ + 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, + 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FE99 "ﺙ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x99, 0x0, 0x0, 0x5, 0x70, 0x1, 0x11, 0x10, + 0x0, 0x9c, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xce, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x7f, + 0xd8, 0x66, 0x79, 0xcf, 0xf8, 0x0, 0x4a, 0xef, + 0xfe, 0xc9, 0x61, 0x0, + + /* U+FE9A "ﺚ" */ + 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x99, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x1, 0x11, 0x10, 0x0, 0x9c, 0x0, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0xe, 0xa0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0x10, 0x7f, 0xd9, 0x77, + 0x8a, 0xdf, 0xf8, 0xfc, 0x60, 0x4a, 0xef, 0xfe, + 0xca, 0x51, 0x4, 0xed, + + /* U+FE9B "ﺛ" */ + 0x0, 0x3e, 0x0, 0x0, 0x20, 0x3, 0xf4, 0xe0, + 0x2, 0x2, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x6f, 0x0, 0x7, 0xf0, 0x18, 0xec, 0x2, 0xfc, + 0x20, + + /* U+FE9C "ﺜ" */ + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x3, 0xf4, + 0xe0, 0x0, 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, 0x20, + 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FE9D "ﺝ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0x20, + 0x2, 0x0, 0x0, 0x6f, 0x0, 0xf, 0x30, 0x0, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FE9E "ﺞ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x6b, 0xff, 0xe6, 0x0, 0x0, + 0xcf, 0x78, 0xe0, 0x0, 0xa, 0xe2, 0x1, 0xf4, + 0x0, 0x2f, 0x60, 0x0, 0x9c, 0x0, 0x5f, 0x10, + 0x11, 0x1e, 0xc3, 0x6f, 0x10, 0x8a, 0x3, 0xd7, + 0x2f, 0x70, 0x0, 0x0, 0x0, 0x9, 0xf9, 0x31, + 0x13, 0x83, 0x0, 0x7d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FE9F "ﺟ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, + 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x1a, 0xf9, + 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, 0x2f, 0xec, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, + + /* U+FEA0 "ﺠ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x68, 0xbe, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, + 0x0, 0x0, 0x1a, 0xfd, 0xf2, 0x0, 0x17, 0x8a, + 0xfe, 0x41, 0xef, 0x83, 0x2f, 0xec, 0x71, 0x0, + 0x2b, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, + + /* U+FEA1 "ﺡ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xed, 0xff, + 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, 0x6f, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, + 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x31, + 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FEA2 "ﺢ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, + 0xd8, 0x0, 0x98, 0x5b, 0xff, 0xe6, 0x0, 0x0, + 0xbf, 0x78, 0xe0, 0x0, 0x7, 0xf4, 0x1, 0xf4, + 0x0, 0xf, 0x80, 0x0, 0x9c, 0x0, 0x4f, 0x20, + 0x0, 0x1e, 0xc3, 0x6f, 0x0, 0x0, 0x3, 0xd7, + 0x5f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xfa, 0x41, 0x14, 0xa4, 0x0, + 0x5d, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x13, 0x31, + 0x0, + + /* U+FEA3 "ﺣ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, + 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x1a, 0xf9, + 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, 0x2f, 0xec, + 0x71, 0x0, 0x0, + + /* U+FEA4 "ﺤ" */ + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x45, 0x68, 0xbe, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, + 0x0, 0x0, 0x1a, 0xfd, 0xf2, 0x0, 0x17, 0x8a, + 0xfe, 0x41, 0xef, 0x83, 0x2f, 0xec, 0x71, 0x0, + 0x2b, 0xf7, + + /* U+FEA5 "ﺥ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xed, 0xff, 0xe9, 0x0, 0x41, 0x3d, 0xe8, 0x41, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0xc, 0xc0, + 0x0, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xf9, 0x31, 0x14, 0x94, 0x0, 0x6d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FEA6 "ﺦ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, 0x0, 0x7c, 0xff, 0xff, 0xd8, 0x0, 0x98, + 0x5b, 0xff, 0xe6, 0x0, 0x0, 0xbf, 0x78, 0xe0, + 0x0, 0x7, 0xf4, 0x1, 0xf4, 0x0, 0xf, 0x80, + 0x0, 0x9c, 0x0, 0x4f, 0x20, 0x0, 0x1e, 0xc3, + 0x6f, 0x0, 0x0, 0x3, 0xd7, 0x5f, 0x20, 0x0, + 0x0, 0x0, 0x1f, 0x90, 0x0, 0x0, 0x0, 0x7, + 0xfa, 0x41, 0x14, 0xa4, 0x0, 0x5d, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FEA7 "ﺧ" */ + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0xb7, 0x20, 0x0, 0x45, 0x68, 0xbe, + 0xf9, 0x0, 0x0, 0x0, 0x6e, 0xe6, 0x0, 0x0, + 0x1a, 0xf9, 0x0, 0x17, 0x8a, 0xfe, 0x40, 0x0, + 0x2f, 0xec, 0x71, 0x0, 0x0, + + /* U+FEA8 "ﺨ" */ + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0xb7, 0x20, 0x0, + 0x0, 0x45, 0x68, 0xbe, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xe6, 0x0, 0x0, 0x0, 0x1a, 0xfd, + 0xf2, 0x0, 0x17, 0x8a, 0xfe, 0x41, 0xef, 0x83, + 0x2f, 0xec, 0x71, 0x0, 0x2b, 0xf7, + + /* U+FEA9 "ﺩ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x3f, 0x70, 0x0, + 0x0, 0x9e, 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, + 0x7f, 0x10, 0x96, 0xaf, 0xb0, 0xd, 0xfe, 0x90, + 0x0, + + /* U+FEAA "ﺪ" */ + 0x0, 0x2e, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0x60, + 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x0, 0x5, + 0xf2, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, 0x66, + 0xaf, 0xef, 0x83, 0xf, 0xfe, 0x80, 0xaf, 0x90, + + /* U+FEAB "ﺫ" */ + 0x0, 0x7b, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x1, 0xdc, 0x0, 0x0, 0x2, + 0xf8, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x4f, + 0x20, 0x0, 0x8, 0xf1, 0x9, 0x7a, 0xfb, 0x0, + 0xdf, 0xe8, 0x0, + + /* U+FEAC "ﺬ" */ + 0x0, 0x7b, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x1, 0xdb, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x9, 0xe0, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, + 0x0, 0x8, 0xf6, 0x0, 0x6, 0x6a, 0xfe, 0xf8, + 0x30, 0xff, 0xe8, 0xa, 0xf9, + + /* U+FEAD "ﺭ" */ + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xba, + 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x4e, 0xd0, + 0x14, 0x6c, 0xfd, 0x20, 0xaf, 0xfc, 0x60, 0x0, + 0x33, 0x10, 0x0, 0x0, + + /* U+FEAE "ﺮ" */ + 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, + 0xc9, 0x0, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xb7, 0x0, 0x0, 0x0, 0xed, + 0xef, 0x0, 0x0, 0x6, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x13, 0x6c, 0xfb, 0x0, 0x0, + 0xaf, 0xfb, 0x50, 0x0, 0x0, 0x33, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEAF "ﺯ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, + 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x0, 0xda, 0x0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x4f, 0xd0, 0x14, 0x6c, 0xfd, 0x20, + 0xaf, 0xfc, 0x60, 0x0, 0x33, 0x10, 0x0, 0x0, + + /* U+FEB0 "ﺰ" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x0, 0xbd, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa7, 0x0, 0x0, + 0x0, 0xdd, 0xef, 0x0, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x13, 0x6b, 0xfb, + 0x0, 0x0, 0xaf, 0xfb, 0x50, 0x0, 0x0, 0x33, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEB1 "ﺱ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0xd, 0x90, 0x4, 0xf2, + 0x3, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xd0, 0x6, + 0xf3, 0x4, 0xf3, 0x5f, 0x10, 0x0, 0x6, 0xf3, + 0xa, 0xf8, 0x6, 0xf1, 0xcb, 0x0, 0x0, 0x6, + 0xfe, 0xbf, 0xcf, 0xbf, 0xc0, 0xe8, 0x0, 0x0, + 0x9, 0xfc, 0xfa, 0x1a, 0xfb, 0x10, 0xf8, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbe, + 0x52, 0x27, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEB2 "ﺲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x2, + 0x81, 0x3, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xb0, 0x5, 0xf2, 0x4, 0xf3, 0x0, 0x5f, 0x10, + 0x0, 0x7, 0xf1, 0x8, 0xf6, 0x5, 0xf6, 0x0, + 0xbc, 0x0, 0x0, 0x5, 0xfc, 0x8f, 0xde, 0x7d, + 0xff, 0x83, 0xd9, 0x0, 0x0, 0x6, 0xfd, 0xfa, + 0x1b, 0xfc, 0x6c, 0xf9, 0xf7, 0x0, 0x0, 0xa, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x63, 0x27, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FEB3 "ﺳ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x6, 0x40, 0x3, 0x80, 0x5, 0xf1, 0x0, 0xd, + 0x90, 0x7, 0xf0, 0x6, 0xf1, 0x0, 0xf, 0xd0, + 0xa, 0xf4, 0x7, 0xf0, 0x17, 0xcf, 0xfa, 0x9f, + 0xee, 0x7e, 0xa0, 0x2f, 0xe6, 0x7e, 0xe9, 0x2c, + 0xfa, 0x10, + + /* U+FEB4 "ﺴ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0x90, 0x6, 0xf0, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0xa0, 0x8, 0xf1, 0x6, 0xf1, 0x0, + 0x0, 0x2f, 0xe0, 0xc, 0xf6, 0x8, 0xf6, 0x0, + 0x1b, 0xef, 0xfd, 0xdf, 0xcf, 0xbf, 0xff, 0xb4, + 0x2f, 0xe4, 0x4e, 0xe8, 0x1b, 0xfa, 0x3c, 0xf7, + + /* U+FEB5 "ﺵ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x20, 0x3, 0xf3, 0x0, 0x0, 0x0, + 0xc, 0x90, 0x5, 0xf2, 0x3, 0xf3, 0x1, 0x0, + 0x0, 0x8, 0xd0, 0x6, 0xf3, 0x4, 0xf2, 0x6f, + 0x10, 0x0, 0x6, 0xf3, 0xa, 0xf9, 0x7, 0xf1, + 0xca, 0x0, 0x0, 0x6, 0xff, 0xbf, 0xcf, 0xbf, + 0xb0, 0xe8, 0x0, 0x0, 0xa, 0xfc, 0xfa, 0x1a, + 0xfb, 0x10, 0xe8, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xbe, 0x52, 0x27, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FEB6 "ﺶ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x2, 0x0, 0x1, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x30, 0x1, 0x61, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x5, + 0xf2, 0x3, 0xf3, 0x0, 0x2a, 0x10, 0x0, 0x7, + 0xf1, 0x8, 0xf6, 0x5, 0xf5, 0x0, 0x9d, 0x0, + 0x0, 0x5, 0xfc, 0x8f, 0xee, 0x7d, 0xfe, 0x73, + 0xd9, 0x0, 0x0, 0x6, 0xfd, 0xfb, 0x1b, 0xfc, + 0x6c, 0xf9, 0xf7, 0x0, 0x0, 0xa, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x4f, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x63, + 0x27, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEB7 "ﺷ" */ + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x20, 0x2, 0x80, 0x0, 0x5, 0x40, 0x2, + 0x60, 0x5, 0xf1, 0x0, 0xd, 0x90, 0x7, 0xf0, + 0x5, 0xf1, 0x0, 0xf, 0xd0, 0xa, 0xf4, 0x7, + 0xf0, 0x17, 0xcf, 0xfa, 0x9f, 0xee, 0x7e, 0xb0, + 0x2f, 0xe6, 0x7e, 0xe9, 0x2c, 0xfb, 0x10, + + /* U+FEB8 "ﺸ" */ + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x20, 0x2, 0x60, 0x0, + 0x0, 0x2, 0x10, 0x1, 0x20, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0x90, 0x7, 0xf0, 0x5, 0xf1, 0x0, + 0x0, 0xd, 0xa0, 0x8, 0xf1, 0x6, 0xf1, 0x0, + 0x0, 0x2f, 0xe1, 0xc, 0xf7, 0x9, 0xf7, 0x0, + 0x1b, 0xef, 0xfd, 0xcf, 0xcf, 0xbf, 0xff, 0xb4, + 0x2f, 0xe4, 0x4e, 0xe8, 0x1b, 0xfa, 0x3c, 0xf7, + + /* U+FEB9 "ﺹ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEBA "ﺺ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xa4, 0x3f, 0xb0, 0x0, 0x5f, 0x10, 0x4e, 0x10, + 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xa, + 0xc0, 0x0, 0x0, 0xaf, 0xf8, 0x78, 0xbf, 0xff, + 0x95, 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, + 0x83, 0xaf, 0xcf, 0x70, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, 0x32, + 0x8f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x34, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEBB "ﺻ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, 0x4, + 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, 0xd, 0xa1, + 0xdd, 0x20, 0x1, 0xf5, 0x0, 0x1f, 0xec, 0xe1, + 0x0, 0x1a, 0xf3, 0x17, 0xcf, 0xff, 0xa7, 0x8a, + 0xff, 0x80, 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa3, + 0x0, + + /* U+FEBC "ﺼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x60, 0x0, + 0x0, 0x4, 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, + 0x0, 0xd, 0xa1, 0xdd, 0x20, 0x1, 0xf6, 0x0, + 0x0, 0x1f, 0xec, 0xe1, 0x0, 0x1a, 0xf4, 0x0, + 0x17, 0xcf, 0xff, 0xa7, 0x8a, 0xff, 0xfb, 0x70, + 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa4, 0x7e, 0xf0, + + /* U+FEBD "ﺽ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x43, + 0xfb, 0x0, 0x5, 0xf1, 0x4e, 0x10, 0x0, 0xc, + 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xac, 0x0, 0x0, + 0xa, 0xff, 0x87, 0x8b, 0xff, 0x50, 0xd9, 0x0, + 0x0, 0xb, 0xde, 0xff, 0xed, 0x81, 0x0, 0xf7, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x63, 0x28, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+FEBE "ﺾ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xd6, 0x5c, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xa4, 0x3f, 0xb0, 0x0, 0x5f, 0x10, 0x4e, 0x10, + 0x0, 0xc, 0xce, 0xc0, 0x0, 0x2d, 0xf0, 0xa, + 0xc0, 0x0, 0x0, 0xaf, 0xf8, 0x78, 0xbf, 0xff, + 0x95, 0xd9, 0x0, 0x0, 0xb, 0xde, 0xff, 0xed, + 0x83, 0xaf, 0xcf, 0x70, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, 0x32, + 0x8f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x34, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+FEBF "ﺿ" */ + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, 0x4, + 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, 0xd, 0xa1, + 0xdd, 0x20, 0x1, 0xf5, 0x0, 0x1f, 0xec, 0xe1, + 0x0, 0x1a, 0xf3, 0x17, 0xcf, 0xff, 0xa7, 0x8a, + 0xff, 0x80, 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa3, + 0x0, + + /* U+FEC0 "ﻀ" */ + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x60, 0x0, + 0x0, 0x4, 0x30, 0x1d, 0xf7, 0x4a, 0xf2, 0x0, + 0x0, 0xd, 0xa1, 0xdd, 0x20, 0x1, 0xf6, 0x0, + 0x0, 0x1f, 0xec, 0xe1, 0x0, 0x1a, 0xf4, 0x0, + 0x17, 0xcf, 0xff, 0xa7, 0x8a, 0xff, 0xfb, 0x70, + 0x2f, 0xe6, 0x6e, 0xff, 0xfd, 0xa4, 0x7e, 0xf0, + + /* U+FEC1 "ﻁ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+FEC2 "ﻂ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x6, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0xf7, 0xb, + 0xfa, 0x46, 0xf7, 0x0, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xb0, 0x0, 0x0, 0xfd, 0xf5, 0x0, + 0x6, 0xf9, 0x0, 0x67, 0x7f, 0xfd, 0x77, 0x9d, + 0xff, 0xe7, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x4d, 0xf5, + + /* U+FEC3 "ﻃ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x6, 0xef, 0xf9, 0x0, 0x1, 0xf6, + 0xc, 0xf9, 0x47, 0xf6, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0x90, 0x1, 0xfd, 0xf4, 0x0, 0x7, + 0xf7, 0x17, 0x7f, 0xfd, 0x77, 0x9e, 0xfc, 0x2, + 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x0, + + /* U+FEC4 "ﻄ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x6, 0xef, 0xf9, 0x0, 0x0, 0x1, 0xf6, 0xc, + 0xf9, 0x47, 0xf6, 0x0, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0xa0, 0x0, 0x1, 0xfd, 0xf4, 0x0, + 0x7, 0xf8, 0x0, 0x17, 0x7f, 0xfd, 0x77, 0x9e, + 0xff, 0xd7, 0x12, 0xff, 0xff, 0xff, 0xfe, 0xb5, + 0x5d, 0xf4, + + /* U+FEC5 "ﻅ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0x5c, 0x0, 0x0, + 0x0, 0x0, 0xf7, 0x1, 0x20, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x6, 0xdf, 0xf9, 0x0, 0x0, 0xf7, + 0xb, 0xfa, 0x46, 0xf7, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xa0, 0x0, 0xfd, 0xf5, 0x0, 0x6, + 0xf8, 0x67, 0x7f, 0xfd, 0x77, 0x9d, 0xfc, 0x1e, + 0xff, 0xff, 0xff, 0xfe, 0xb5, 0x0, + + /* U+FEC6 "ﻆ" */ + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x70, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x6, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0xf7, 0xb, + 0xfa, 0x46, 0xf7, 0x0, 0x0, 0xf, 0x7b, 0xf6, + 0x0, 0xc, 0xb0, 0x0, 0x0, 0xfd, 0xf5, 0x0, + 0x6, 0xf9, 0x0, 0x67, 0x7f, 0xfd, 0x77, 0x9d, + 0xff, 0xe7, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x4d, 0xf5, + + /* U+FEC7 "ﻇ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x60, 0x6b, 0x0, 0x0, + 0x0, 0x1, 0xf6, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x6, 0xef, 0xf9, 0x0, 0x1, 0xf6, + 0xc, 0xf9, 0x47, 0xf6, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0x90, 0x1, 0xfd, 0xf4, 0x0, 0x7, + 0xf7, 0x17, 0x7f, 0xfd, 0x77, 0x9e, 0xfc, 0x2, + 0xff, 0xff, 0xff, 0xfd, 0xb5, 0x0, + + /* U+FEC8 "ﻈ" */ + 0x0, 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0x60, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf6, + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x6, 0xef, 0xf9, 0x0, 0x0, 0x1, 0xf6, 0xc, + 0xf9, 0x47, 0xf6, 0x0, 0x0, 0x1f, 0x6b, 0xf5, + 0x0, 0xd, 0xa0, 0x0, 0x1, 0xfd, 0xf4, 0x0, + 0x7, 0xf8, 0x0, 0x17, 0x7f, 0xfd, 0x77, 0x9e, + 0xff, 0xd7, 0x12, 0xff, 0xff, 0xff, 0xfe, 0xb5, + 0x5d, 0xf4, + + /* U+FEC9 "ﻉ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, + 0x20, 0x0, 0x0, 0xce, 0x75, 0x0, 0x0, 0x4, + 0xf2, 0x0, 0x0, 0x0, 0x4, 0xf4, 0x26, 0xbd, + 0x0, 0x0, 0xaf, 0xff, 0xd9, 0x0, 0x0, 0xbf, + 0x92, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0x6, + 0xf9, 0x31, 0x13, 0x95, 0x0, 0x6d, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FECA "ﻊ" */ + 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, 0xcf, 0xfc, + 0x20, 0x0, 0x8, 0xf9, 0x8f, 0x90, 0x0, 0x4, + 0xfc, 0xdf, 0x50, 0x0, 0x1, 0xdf, 0xf4, 0x0, + 0x0, 0xa, 0xf7, 0xef, 0x97, 0x40, 0xf, 0x80, + 0x18, 0xdf, 0xa0, 0xf, 0x50, 0x0, 0x0, 0x0, + 0xd, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xfa, 0x31, + 0x13, 0x96, 0x0, 0x5d, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x13, 0x31, 0x0, + + /* U+FECB "ﻋ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, + 0x20, 0x0, 0xc, 0xe7, 0x40, 0x0, 0x3, 0xf3, + 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, 0x2, + 0xf8, 0x1, 0x8d, 0x0, 0x5, 0xff, 0xfe, 0x61, + 0x79, 0xdf, 0xd5, 0x0, 0x2f, 0xd9, 0x30, 0x0, + 0x0, + + /* U+FECC "ﻌ" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x3, 0xdf, 0xfb, + 0x10, 0x0, 0xbf, 0x7a, 0xf7, 0x0, 0x5, 0xfa, + 0xde, 0x20, 0x0, 0x8, 0xff, 0x40, 0x1, 0x79, + 0xfd, 0xee, 0x86, 0x2f, 0xe8, 0x2, 0xaf, 0xe0, + + /* U+FECD "ﻍ" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xef, 0x20, 0x0, 0x0, + 0xce, 0x75, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0x4, 0xf4, 0x26, 0xbd, 0x0, 0x0, 0xaf, + 0xff, 0xd9, 0x0, 0x0, 0xbf, 0x92, 0x0, 0x0, + 0x9, 0xf4, 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x0, 0x0, 0x6, 0xf9, 0x31, 0x13, + 0x95, 0x0, 0x6d, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x13, 0x31, 0x0, + + /* U+FECE "ﻎ" */ + 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x1, + 0xcf, 0xfc, 0x20, 0x0, 0x8, 0xf9, 0x8f, 0x90, + 0x0, 0x4, 0xfc, 0xdf, 0x50, 0x0, 0x1, 0xdf, + 0xf4, 0x0, 0x0, 0xa, 0xf7, 0xef, 0x97, 0x40, + 0xf, 0x80, 0x18, 0xdf, 0xa0, 0xf, 0x50, 0x0, + 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, 0x6, + 0xfa, 0x31, 0x13, 0x96, 0x0, 0x5d, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x13, 0x31, 0x0, + + /* U+FECF "ﻏ" */ + 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xef, 0x20, 0x0, 0xc, 0xe7, 0x40, 0x0, 0x3, + 0xf3, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x2, 0xf8, 0x1, 0x8d, 0x0, 0x5, 0xff, 0xfe, + 0x61, 0x79, 0xdf, 0xd5, 0x0, 0x2f, 0xd9, 0x30, + 0x0, 0x0, + + /* U+FED0 "ﻐ" */ + 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x3, 0xdf, + 0xfb, 0x10, 0x0, 0xbf, 0x7a, 0xf7, 0x0, 0x5, + 0xfa, 0xde, 0x20, 0x0, 0x8, 0xff, 0x40, 0x1, + 0x79, 0xfd, 0xee, 0x86, 0x2f, 0xe8, 0x2, 0xaf, + 0xe0, + + /* U+FED1 "ﻑ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0xee, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xda, 0x5, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xd1, 0x8f, 0x3b, 0xa0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0xf1, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbc, 0xb, 0xf8, 0x32, 0x12, 0x24, + 0x6a, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x0, 0x0, 0x0, 0x24, 0x44, 0x31, 0x0, + 0x0, 0x0, + + /* U+FED2 "ﻒ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xc2, 0x0, + 0x11, 0x0, 0x0, 0x0, 0xb, 0xf9, 0xee, 0x0, + 0xca, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x5f, 0x20, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x6f, 0x0, + 0xaf, 0x83, 0x22, 0x22, 0x35, 0xfd, 0xfd, 0x75, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xfb, + 0x0, 0x3, 0x44, 0x43, 0x32, 0x0, 0x0, 0x0, + + /* U+FED3 "ﻓ" */ + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FED4 "ﻔ" */ + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xb9, 0xf4, + 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, 0x0, 0x2f, + 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, 0xf7, 0x71, + 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FED5 "ﻕ" */ + 0x0, 0x0, 0x0, 0x5c, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x12, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xaf, 0x9e, 0xa0, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0xf0, 0x0, 0x0, + 0x0, 0xdc, 0x19, 0xf2, 0x3, 0x50, 0x0, 0x5f, + 0xfe, 0xf3, 0xc, 0x90, 0x0, 0x1, 0x24, 0xf1, + 0xf, 0x50, 0x0, 0x0, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0x0, 0x3f, 0x60, 0xf, 0x70, 0x0, 0x4, + 0xeb, 0x0, 0xb, 0xe5, 0x35, 0xaf, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x3, + 0x43, 0x0, 0x0, 0x0, + + /* U+FED6 "ﻖ" */ + 0x0, 0x0, 0x0, 0xf, 0x3f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x9e, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf8, + 0x6, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xed, 0x33, + 0xf2, 0x0, 0x9, 0x70, 0x0, 0x8f, 0xfe, 0xf8, + 0x73, 0xf, 0x60, 0x0, 0x8, 0xff, 0xff, 0xf8, + 0x2f, 0x40, 0x0, 0x0, 0xc, 0xd0, 0x0, 0xf, + 0x70, 0x0, 0x0, 0x9f, 0x40, 0x0, 0xb, 0xe6, + 0x23, 0x6d, 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x2, 0x44, 0x10, + 0x0, 0x0, 0x0, + + /* U+FED7 "ﻗ" */ + 0x0, 0xa, 0x8b, 0x70, 0x0, 0x1, 0x11, 0x10, + 0x0, 0x1, 0x76, 0x0, 0x0, 0x2e, 0xff, 0xc0, + 0x0, 0x8f, 0x24, 0xf6, 0x0, 0x8f, 0x23, 0xf7, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x27, 0xf3, + 0x17, 0x77, 0xaf, 0xb0, 0x2f, 0xff, 0xe9, 0x10, + + /* U+FED8 "ﻘ" */ + 0x0, 0x8, 0x99, 0x80, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xb9, 0xf4, + 0x0, 0x0, 0x5f, 0x20, 0xf7, 0x0, 0x0, 0x2f, + 0x86, 0xf4, 0x0, 0x17, 0x7e, 0xff, 0xf7, 0x71, + 0x2f, 0xfe, 0xba, 0xef, 0xf4, + + /* U+FED9 "ﻙ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x90, 0x0, 0x2, 0x96, 0x0, 0xe9, 0x0, 0x0, + 0x76, 0x0, 0xe, 0x90, 0x0, 0x0, 0x58, 0x0, + 0xe9, 0x0, 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x54, 0x0, 0x0, 0x0, + 0xf, 0x7d, 0xa0, 0x0, 0x0, 0x9, 0xf3, 0x8f, + 0xb7, 0x55, 0x8e, 0xf8, 0x0, 0x5c, 0xef, 0xfe, + 0xb4, 0x0, + + /* U+FEDA "ﻚ" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x2, 0x96, 0x0, + 0xe9, 0x0, 0x0, 0x0, 0x76, 0x0, 0xe, 0x90, + 0x0, 0x0, 0x0, 0x58, 0x0, 0xe9, 0x0, 0x0, + 0x2, 0xab, 0x20, 0xe, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe9, 0x0, 0x22, 0x0, 0x0, 0x0, + 0xf, 0x90, 0xd, 0xa0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x9f, 0xb7, 0x55, 0x8e, 0xfd, 0xf8, 0x40, + 0x6c, 0xff, 0xfe, 0xa4, 0x9, 0xfa, + + /* U+FEDB "ﻛ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb9, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x8, 0xff, + 0x93, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0x30, 0x0, 0x0, + 0x0, 0xce, 0x10, 0x0, 0x0, 0x1, 0xec, 0x0, + 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x50, 0x1, 0x77, 0x7d, 0xf1, 0x0, 0x2f, 0xff, + 0xd4, 0x0, 0x0, + + /* U+FEDC "ﻜ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x90, 0x0, 0x1, 0x7d, 0xfc, 0x40, 0x0, + 0x8f, 0xf9, 0x30, 0x0, 0x3, 0xf9, 0x10, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x30, 0x0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, + 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x17, + 0x77, 0xdf, 0xaf, 0x97, 0x2f, 0xff, 0xd4, 0x8, + 0xef, + + /* U+FEDD "ﻝ" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x36, 0x0, 0x0, + 0x5, 0xf2, 0xcb, 0x0, 0x0, 0x8, 0xf0, 0xd9, + 0x0, 0x0, 0x2e, 0xb0, 0x9f, 0x61, 0x37, 0xef, + 0x20, 0xa, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x13, + 0x30, 0x0, 0x0, + + /* U+FEDE "ﻞ" */ + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x25, 0x0, + 0x0, 0x5, 0xf4, 0x0, 0xbb, 0x0, 0x0, 0x8, + 0xfd, 0x71, 0xd9, 0x0, 0x0, 0x2e, 0xed, 0xf4, + 0x9f, 0x61, 0x37, 0xef, 0x30, 0x0, 0x1a, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x13, 0x30, 0x0, + 0x0, 0x0, + + /* U+FEDF "ﻟ" */ + 0x0, 0x1f, 0x60, 0x1, 0xf6, 0x0, 0x1f, 0x60, + 0x1, 0xf6, 0x0, 0x1f, 0x60, 0x1, 0xf6, 0x0, + 0x1f, 0x60, 0x1, 0xf6, 0x0, 0x1f, 0x60, 0x2, + 0xf5, 0x17, 0xcf, 0x12, 0xfe, 0x60, + + /* U+FEE0 "ﻠ" */ + 0x0, 0x1f, 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, + 0x1f, 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, + 0x60, 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x1f, 0x60, 0x0, + 0x2, 0xf7, 0x0, 0x17, 0xcf, 0xe7, 0x32, 0xfe, + 0x8c, 0xf7, + + /* U+FEE1 "ﻡ" */ + 0x0, 0x2, 0x87, 0x10, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0xae, 0x11, 0xea, 0x3, 0xdd, 0x32, 0xea, + 0x5f, 0xbe, 0xff, 0xe3, 0xcb, 0x0, 0x23, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + 0xea, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, + + /* U+FEE2 "ﻢ" */ + 0x0, 0x7, 0xee, 0x60, 0x0, 0x0, 0x5f, 0xbb, + 0xf5, 0x0, 0x0, 0xbc, 0x0, 0xdc, 0x0, 0x5, + 0xee, 0x77, 0xff, 0xb7, 0x6f, 0x7a, 0xef, 0xdd, + 0xfd, 0xca, 0x0, 0x0, 0x0, 0x0, 0xea, 0x0, + 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0x0, 0x0, + 0xc9, 0x0, 0x0, 0x0, 0x0, + + /* U+FEE3 "ﻣ" */ + 0x0, 0x1, 0xbf, 0xd5, 0x0, 0x0, 0xce, 0x9d, + 0xf1, 0x0, 0x1f, 0x50, 0x3f, 0x41, 0x7c, 0xfb, + 0x7b, 0xf2, 0x2f, 0xe9, 0xdf, 0xe6, 0x0, + + /* U+FEE4 "ﻤ" */ + 0x0, 0x1, 0xbf, 0xc3, 0x0, 0x0, 0x0, 0xce, + 0x9d, 0xe1, 0x0, 0x0, 0x1f, 0x50, 0x4f, 0x50, + 0x1, 0x7c, 0xfb, 0x7a, 0xfe, 0x72, 0x2f, 0xe9, + 0xdf, 0xfb, 0xef, 0x60, + + /* U+FEE5 "ﻥ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x4, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf2, 0x23, + 0x0, 0x0, 0x1, 0xf6, 0xbc, 0x0, 0x0, 0x0, + 0xf8, 0xda, 0x0, 0x0, 0x0, 0xf8, 0xc9, 0x0, + 0x0, 0x3, 0xf5, 0xad, 0x0, 0x0, 0xa, 0xe0, + 0x3f, 0xa4, 0x24, 0xaf, 0x60, 0x5, 0xef, 0xff, + 0xe5, 0x0, 0x0, 0x3, 0x42, 0x0, 0x0, + + /* U+FEE6 "ﻦ" */ + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x10, 0x7, 0xf0, 0x0, 0x24, 0x0, 0x0, 0x1, + 0xf7, 0x0, 0xac, 0x0, 0x0, 0x0, 0xff, 0x82, + 0xca, 0x0, 0x0, 0x0, 0xfe, 0xf5, 0xc9, 0x0, + 0x0, 0x2, 0xf5, 0x0, 0xad, 0x0, 0x0, 0x9, + 0xe0, 0x0, 0x3f, 0xa4, 0x24, 0xaf, 0x40, 0x0, + 0x5, 0xef, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, + 0x42, 0x0, 0x0, 0x0, + + /* U+FEE7 "ﻧ" */ + 0x0, 0x3e, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x6f, 0x0, 0x7, 0xf0, 0x18, + 0xec, 0x2, 0xfc, 0x20, + + /* U+FEE8 "ﻨ" */ + 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x6f, 0x10, 0x0, + 0x7f, 0x20, 0x18, 0xef, 0xc7, 0x2f, 0xc8, 0xef, + + /* U+FEE9 "ﻩ" */ + 0x0, 0x10, 0x0, 0x2, 0xef, 0xd5, 0x0, 0xae, + 0x5a, 0xf7, 0xd, 0x90, 0x7, 0xf1, 0xe8, 0x0, + 0x3f, 0x3b, 0xe6, 0x6d, 0xe0, 0x2b, 0xfe, 0x91, + 0x0, + + /* U+FEEA "ﻪ" */ + 0x0, 0x17, 0xf2, 0x0, 0x7, 0xfe, 0xf3, 0x0, + 0x7f, 0x50, 0xf6, 0x0, 0xd9, 0x0, 0xda, 0x0, + 0x9f, 0xdf, 0xff, 0x95, 0x4, 0x75, 0x8, 0xfb, + + /* U+FEEB "ﻫ" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x9, 0xe6, 0x0, + 0x0, 0x0, 0x2e, 0xfb, 0x0, 0x0, 0xa, 0xda, + 0xfc, 0x0, 0x0, 0xe7, 0xf, 0xfa, 0x0, 0xd, + 0xa4, 0xf7, 0xf3, 0x0, 0x9f, 0xee, 0xe, 0x71, + 0x7a, 0xff, 0xa5, 0xe6, 0x2f, 0xea, 0xae, 0xfa, + 0x0, + + /* U+FEEC "ﻬ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xf8, + 0x0, 0x0, 0x3f, 0x98, 0xf1, 0x0, 0x9, 0xd0, + 0x9e, 0x0, 0x17, 0xdd, 0xbf, 0x97, 0x32, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xbb, 0x6f, 0x60, 0x0, + 0x9, 0xe0, 0x7f, 0x0, 0x0, 0x3f, 0x77, 0xf0, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, + + /* U+FEED "ﻭ" */ + 0x0, 0x8, 0xed, 0x40, 0x0, 0x6f, 0xac, 0xf1, + 0x0, 0x9e, 0x1, 0xf6, 0x0, 0x6f, 0xa6, 0xf7, + 0x0, 0x8, 0xdf, 0xf7, 0x0, 0x0, 0x4, 0xf4, + 0x0, 0x0, 0x2e, 0xe0, 0x12, 0x48, 0xef, 0x30, + 0xaf, 0xff, 0xa2, 0x0, 0x34, 0x20, 0x0, 0x0, + + /* U+FEEE "ﻮ" */ + 0x0, 0x8, 0xee, 0x40, 0x0, 0x0, 0x6f, 0xac, + 0xf1, 0x0, 0x0, 0xae, 0x1, 0xf6, 0x0, 0x0, + 0x6f, 0xa7, 0xfb, 0x73, 0x0, 0x8, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x2e, 0xc0, 0x0, 0x12, 0x48, 0xee, 0x20, 0x0, + 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x34, 0x20, 0x0, + 0x0, 0x0, + + /* U+FEEF "ﻯ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x5, 0xf7, 0x0, 0x10, 0x12, 0x0, + 0x9, 0xfe, 0x80, 0xc, 0xa0, 0x0, 0x2, 0x7e, + 0xb0, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xd, 0xc0, + 0x0, 0x2, 0x9f, 0x90, 0x4f, 0xfc, 0xcf, 0xff, + 0x90, 0x0, 0x28, 0xba, 0x85, 0x10, 0x0, + + /* U+FEF0 "ﻰ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, + + /* U+FEF1 "ﻱ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xfe, 0x70, 0x0, 0x0, 0x4f, 0x94, 0x7f, + 0x40, 0x0, 0x4, 0xf8, 0x10, 0x10, 0x24, 0x0, + 0x8, 0xff, 0xa1, 0xc, 0xa0, 0x0, 0x0, 0x5e, + 0xc0, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xb, 0xd1, + 0x0, 0x4, 0xaf, 0x70, 0x1c, 0xfd, 0xef, 0xfb, + 0x40, 0x0, 0x3, 0x55, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, + 0x0, 0x0, + + /* U+FEF2 "ﻲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf8, 0x0, 0xbb, 0x0, 0x0, + 0xc, 0xd7, 0xf4, 0xe, 0x70, 0x0, 0x0, 0xbf, + 0x49, 0xe3, 0xe9, 0x0, 0x0, 0x1, 0xdb, 0xb, + 0x78, 0xf8, 0x31, 0x24, 0x9f, 0x60, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x34, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x3f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x20, 0x0, 0x0, + 0x0, + + /* U+FEF3 "ﻳ" */ + 0x0, 0x38, 0x0, 0x6, 0xf1, 0x0, 0x7f, 0x1, + 0x7e, 0xc0, 0x2f, 0xd3, 0x0, 0x0, 0x0, 0x3, + 0xf4, 0xe0, 0x2, 0x2, + + /* U+FEF4 "ﻴ" */ + 0x0, 0x38, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x7f, + 0x20, 0x17, 0xef, 0xc7, 0x2f, 0xc8, 0xef, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0xe0, 0x0, 0x20, 0x20, + + /* U+FEF5 "ﻵ" */ + 0x1a, 0x30, 0x19, 0x0, 0x0, 0x85, 0xad, 0xb4, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0xf8, 0x0, + 0x1f, 0x50, 0x0, 0xf8, 0x0, 0x9, 0xc0, 0x0, + 0xf8, 0x0, 0x2, 0xf3, 0x0, 0xf8, 0x0, 0x0, + 0xba, 0x0, 0xf8, 0x0, 0x0, 0x4f, 0x20, 0xf7, + 0x0, 0x0, 0xc, 0x90, 0xf6, 0x0, 0x0, 0x5, + 0xf4, 0xf3, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, + 0x0, 0x0, 0xbf, 0x50, 0x0, 0x8, 0x7c, 0xf7, + 0x0, 0x0, 0xb, 0xfc, 0x40, 0x0, + + /* U+FEF6 "ﻶ" */ + 0x1a, 0x30, 0x19, 0x0, 0x0, 0x0, 0x85, 0xad, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0xf8, 0x0, 0x0, 0x1f, 0x50, 0x0, 0xf8, 0x0, + 0x0, 0x9, 0xc0, 0x0, 0xf8, 0x0, 0x0, 0x2, + 0xf3, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xba, 0x0, + 0xf8, 0x0, 0x0, 0x0, 0x4f, 0x20, 0xf8, 0x0, + 0x0, 0x0, 0xc, 0x90, 0xf8, 0x0, 0x0, 0x0, + 0x5, 0xf4, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xcd, 0x0, + 0x0, 0x8, 0x7c, 0xf6, 0x3f, 0xa4, 0x0, 0xb, + 0xfc, 0x40, 0x7, 0xfb, + + /* U+FEF7 "ﻷ" */ + 0x9, 0xc3, 0x0, 0x0, 0x2, 0xa0, 0x0, 0x0, + 0x0, 0x1d, 0x52, 0x0, 0x0, 0x2, 0xed, 0x50, + 0x0, 0x0, 0x2, 0x0, 0x0, 0xf, 0x80, 0x2e, + 0x30, 0x0, 0xf8, 0x0, 0xbb, 0x0, 0xf, 0x80, + 0x3, 0xf2, 0x0, 0xf8, 0x0, 0xc, 0x90, 0xf, + 0x80, 0x0, 0x5f, 0x10, 0xf7, 0x0, 0x0, 0xd8, + 0xf, 0x60, 0x0, 0x6, 0xe4, 0xf3, 0x0, 0x0, + 0xe, 0xee, 0x0, 0x0, 0x0, 0xbf, 0x50, 0x0, + 0x87, 0xcf, 0x70, 0x0, 0xb, 0xfc, 0x40, 0x0, + + /* U+FEF8 "ﻸ" */ + 0x9, 0xc3, 0x0, 0x0, 0x0, 0x2, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x52, 0x0, 0x0, 0x0, + 0x2, 0xed, 0x50, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xf, 0x80, 0x0, 0x2e, 0x30, 0x0, 0xf8, + 0x0, 0x0, 0xbb, 0x0, 0xf, 0x80, 0x0, 0x3, + 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc, 0x90, 0xf, + 0x80, 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, + 0x0, 0xd8, 0xf, 0x80, 0x0, 0x0, 0x6, 0xe4, + 0xf8, 0x0, 0x0, 0x0, 0xe, 0xef, 0x90, 0x0, + 0x0, 0x0, 0xbf, 0xdd, 0x0, 0x0, 0x87, 0xcf, + 0x73, 0xfa, 0x40, 0xb, 0xfc, 0x40, 0x7, 0xfb, + + /* U+FEF9 "ﻹ" */ + 0x0, 0x0, 0x0, 0xf8, 0x2e, 0x30, 0x0, 0xf8, + 0xb, 0xb0, 0x0, 0xf8, 0x3, 0xf2, 0x0, 0xf8, + 0x0, 0xc9, 0x0, 0xf8, 0x0, 0x5f, 0x10, 0xf7, + 0x0, 0xd, 0x80, 0xf6, 0x0, 0x6, 0xe4, 0xf3, + 0x0, 0x0, 0xee, 0xe0, 0x0, 0x0, 0xbf, 0x50, + 0x8, 0x7c, 0xf7, 0x0, 0xb, 0xfc, 0x40, 0x0, + 0x5c, 0x70, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, + 0x9d, 0xa0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, + + /* U+FEFA "ﻺ" */ + 0x0, 0x0, 0x0, 0xf8, 0x0, 0x2e, 0x30, 0x0, + 0xf8, 0x0, 0xb, 0xb0, 0x0, 0xf8, 0x0, 0x3, + 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc9, 0x0, 0xf8, + 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, 0xd, + 0x80, 0xf8, 0x0, 0x0, 0x6, 0xe4, 0xf8, 0x0, + 0x0, 0x0, 0xee, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0xdd, 0x0, 0x8, 0x7c, 0xf7, 0x3f, 0xa4, 0xb, + 0xfc, 0x40, 0x7, 0xfb, 0x5c, 0x70, 0x0, 0x0, + 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9d, 0xa0, + 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, + + /* U+FEFB "ﻻ" */ + 0x0, 0x0, 0x0, 0xf8, 0x2e, 0x30, 0x0, 0xf8, + 0xb, 0xb0, 0x0, 0xf8, 0x3, 0xf2, 0x0, 0xf8, + 0x0, 0xc9, 0x0, 0xf8, 0x0, 0x5f, 0x10, 0xf7, + 0x0, 0xd, 0x80, 0xf6, 0x0, 0x6, 0xe4, 0xf3, + 0x0, 0x0, 0xee, 0xe0, 0x0, 0x0, 0xbf, 0x50, + 0x8, 0x7c, 0xf7, 0x0, 0xb, 0xfc, 0x40, 0x0, + + /* U+FEFC "ﻼ" */ + 0x0, 0x0, 0x0, 0xf8, 0x0, 0x2e, 0x30, 0x0, + 0xf8, 0x0, 0xb, 0xb0, 0x0, 0xf8, 0x0, 0x3, + 0xf2, 0x0, 0xf8, 0x0, 0x0, 0xc9, 0x0, 0xf8, + 0x0, 0x0, 0x5f, 0x10, 0xf8, 0x0, 0x0, 0xd, + 0x80, 0xf8, 0x0, 0x0, 0x6, 0xe4, 0xf8, 0x0, + 0x0, 0x0, 0xee, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0xdd, 0x0, 0x8, 0x7c, 0xf7, 0x3f, 0xa4, 0xb, + 0xfc, 0x40, 0x7, 0xfb, + + /* U+FEFF "" */ + +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 81, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 103, .box_w = 2, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12, .adv_w = 118, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 25, .adv_w = 215, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 163, .box_w = 8, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 157, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 247, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 313, .adv_w = 70, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 318, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 348, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 378, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 410, .adv_w = 215, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 81, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 477, .adv_w = 92, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 485, .adv_w = 81, .box_w = 3, .box_h = 2, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 488, .adv_w = 86, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 527, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 581, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 629, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 677, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 725, .adv_w = 163, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 785, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 833, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 887, .adv_w = 163, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 935, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 989, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1043, .adv_w = 86, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1055, .adv_w = 86, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1070, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1125, .adv_w = 215, .box_w = 11, .box_h = 6, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1158, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1213, .adv_w = 136, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1255, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1360, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1426, .adv_w = 176, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1480, .adv_w = 179, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1546, .adv_w = 197, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1612, .adv_w = 162, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1666, .adv_w = 147, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1714, .adv_w = 198, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1786, .adv_w = 193, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1846, .adv_w = 76, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1864, .adv_w = 76, .box_w = 5, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1902, .adv_w = 168, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1962, .adv_w = 143, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2010, .adv_w = 221, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2082, .adv_w = 192, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2142, .adv_w = 202, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2214, .adv_w = 154, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2268, .adv_w = 202, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2352, .adv_w = 178, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2412, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2466, .adv_w = 156, .box_w = 11, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2532, .adv_w = 187, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2592, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2658, .adv_w = 253, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2754, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2820, .adv_w = 156, .box_w = 11, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2886, .adv_w = 175, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2952, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2982, .adv_w = 86, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3021, .adv_w = 100, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3051, .adv_w = 215, .box_w = 11, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 3079, .adv_w = 128, .box_w = 10, .box_h = 2, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 3089, .adv_w = 128, .box_w = 5, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 3097, .adv_w = 157, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3138, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3192, .adv_w = 141, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3228, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3282, .adv_w = 158, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3323, .adv_w = 90, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3359, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3413, .adv_w = 162, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3461, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3473, .adv_w = 71, .box_w = 4, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 3503, .adv_w = 148, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3557, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3569, .adv_w = 249, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3632, .adv_w = 162, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3668, .adv_w = 157, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3709, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3763, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3817, .adv_w = 105, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3847, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3883, .adv_w = 100, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3919, .adv_w = 162, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3955, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3996, .adv_w = 209, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4055, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4096, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4150, .adv_w = 134, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4186, .adv_w = 163, .box_w = 7, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4242, .adv_w = 86, .box_w = 2, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4258, .adv_w = 163, .box_w = 7, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4314, .adv_w = 215, .box_w = 11, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4336, .adv_w = 171, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4377, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4418, .adv_w = 106, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4450, .adv_w = 140, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4491, .adv_w = 167, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4527, .adv_w = 70, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4536, .adv_w = 89, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4559, .adv_w = 167, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4595, .adv_w = 166, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4636, .adv_w = 57, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4642, .adv_w = 138, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4690, .adv_w = 135, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4726, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4774, .adv_w = 170, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4815, .adv_w = 174, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4860, .adv_w = 70, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4872, .adv_w = 103, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4895, .adv_w = 166, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4936, .adv_w = 160, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4986, .adv_w = 164, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 5034, .adv_w = 160, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5075, .adv_w = 138, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 5123, .adv_w = 152, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5164, .adv_w = 182, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5229, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5265, .adv_w = 181, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5315, .adv_w = 168, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5360, .adv_w = 163, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5435, .adv_w = 163, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5510, .adv_w = 194, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5560, .adv_w = 250, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5630, .adv_w = 83, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5636, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 5651, .adv_w = 81, .box_w = 3, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5666, .adv_w = 136, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5708, .adv_w = 120, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 5732, .adv_w = 71, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5785, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5817, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 5877, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5909, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5975, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5987, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 6046, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6078, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6117, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6169, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6234, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6294, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6364, .adv_w = 114, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6389, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6424, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 6460, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 6508, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6598, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6724, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6832, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6940, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7018, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7096, .adv_w = 153, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 7166, .adv_w = 153, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 7241, .adv_w = 75, .box_w = 6, .box_h = 2, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7247, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7337, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7421, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7487, .adv_w = 186, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7562, .adv_w = 159, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 7602, .adv_w = 188, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7657, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7682, .adv_w = 124, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 7722, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 7777, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7843, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7858, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7873, .adv_w = 0, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 7885, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7894, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7909, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7918, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7933, .adv_w = 0, .box_w = 6, .box_h = 4, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7945, .adv_w = 0, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 7954, .adv_w = 0, .box_w = 4, .box_h = 4, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 7962, .adv_w = 0, .box_w = 4, .box_h = 4, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 7970, .adv_w = 0, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7985, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 7994, .adv_w = 138, .box_w = 3, .box_h = 2, .ofs_x = 3, .ofs_y = 4}, + {.bitmap_index = 7997, .adv_w = 138, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8017, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8057, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8102, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8141, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8180, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8224, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8269, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8314, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8358, .adv_w = 138, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8393, .adv_w = 83, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8413, .adv_w = 81, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 8419, .adv_w = 140, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8455, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8494, .adv_w = 199, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8566, .adv_w = 0, .box_w = 2, .box_h = 5, .ofs_x = 3, .ofs_y = 10}, + {.bitmap_index = 8571, .adv_w = 75, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 8579, .adv_w = 241, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8644, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8696, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8768, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 8827, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8879, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8951, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9003, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9075, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9155, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9235, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9300, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9360, .adv_w = 165, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9440, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9500, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9560, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9602, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9637, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9672, .adv_w = 114, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9725, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9760, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9795, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9837, .adv_w = 114, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9876, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9918, .adv_w = 124, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 9990, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10053, .adv_w = 128, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 10098, .adv_w = 136, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10139, .adv_w = 156, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10193, .adv_w = 136, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 10229, .adv_w = 124, .box_w = 9, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10283, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10346, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10409, .adv_w = 313, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 10517, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 10607, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 10733, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10841, .adv_w = 310, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10967, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11045, .adv_w = 153, .box_w = 10, .box_h = 17, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 11130, .adv_w = 265, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11198, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 11288, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 11393, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11498, .adv_w = 265, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 11596, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11701, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11785, .adv_w = 199, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11881, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11979, .adv_w = 270, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12084, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12182, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12248, .adv_w = 211, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12325, .adv_w = 211, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 12419, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12531, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12643, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12755, .adv_w = 229, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 12881, .adv_w = 229, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 13021, .adv_w = 229, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13147, .adv_w = 186, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13252, .adv_w = 186, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13342, .adv_w = 186, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13437, .adv_w = 186, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 13532, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 13597, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13647, .adv_w = 188, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13717, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 13782, .adv_w = 188, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13847, .adv_w = 179, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13892, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 13962, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14018, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14078, .adv_w = 124, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14142, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 14198, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14253, .adv_w = 200, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14314, .adv_w = 200, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 14391, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14416, .adv_w = 138, .box_w = 3, .box_h = 2, .ofs_x = 3, .ofs_y = 4}, + {.bitmap_index = 14419, .adv_w = 138, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14439, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14479, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14524, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14564, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14608, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14647, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14692, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14737, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14781, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14917, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15013, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15125, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15221, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15287, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15415, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15543, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15669, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15797, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15905, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16033, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16089, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16173, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16317, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16413, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16501, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 16581, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16707, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16812, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16910, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 16990, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 17102, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17172, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17242, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17340, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 17368, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17476, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17636, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17796, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17924, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 17994, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18064, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18204, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18428, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 18573, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18678, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18790, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18888, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18986, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19082, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 19178, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19290, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19402, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19510, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 19672, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19768, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19918, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20018, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20118, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20218, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20318, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20418, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20565, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20661, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20773, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 20918, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21038, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21134, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21228, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21300, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21375, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21400, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21430, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21502, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21577, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21602, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21632, .adv_w = 241, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21704, .adv_w = 251, .box_w = 15, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21779, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21804, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 21834, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21886, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21946, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 21971, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22001, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22053, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22113, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22138, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22168, .adv_w = 241, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22233, .adv_w = 251, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22301, .adv_w = 71, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22334, .adv_w = 77, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22367, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22472, .adv_w = 265, .box_w = 16, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 22568, .adv_w = 122, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22616, .adv_w = 130, .box_w = 10, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22671, .adv_w = 265, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22776, .adv_w = 265, .box_w = 16, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 22872, .adv_w = 122, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22920, .adv_w = 130, .box_w = 10, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22975, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23035, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23100, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23160, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23232, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23297, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 23357, .adv_w = 158, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 23407, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 23467, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23527, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 23587, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23647, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23719, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 23779, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 23839, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23899, .adv_w = 165, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23971, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24006, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24051, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24086, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24131, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24173, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24227, .adv_w = 114, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24269, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24323, .adv_w = 124, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24386, .adv_w = 141, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24456, .adv_w = 124, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24528, .adv_w = 141, .box_w = 10, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 24608, .adv_w = 229, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24706, .adv_w = 229, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24811, .adv_w = 122, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 24870, .adv_w = 141, .box_w = 10, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 24935, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25047, .adv_w = 229, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25167, .adv_w = 122, .box_w = 9, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 25235, .adv_w = 141, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 25310, .adv_w = 229, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 25450, .adv_w = 229, .box_w = 15, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 25608, .adv_w = 122, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 25698, .adv_w = 141, .box_w = 10, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 25798, .adv_w = 229, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25910, .adv_w = 229, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 26023, .adv_w = 122, .box_w = 9, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26086, .adv_w = 141, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26156, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 26206, .adv_w = 195, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 26266, .adv_w = 188, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 26336, .adv_w = 195, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 26414, .adv_w = 71, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26447, .adv_w = 77, .box_w = 6, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26480, .adv_w = 179, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26525, .adv_w = 162, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 26580, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26621, .adv_w = 118, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 26671, .adv_w = 211, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26748, .adv_w = 216, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26839, .adv_w = 122, .box_w = 9, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26907, .adv_w = 141, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26982, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27042, .adv_w = 132, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27117, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27173, .adv_w = 132, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27243, .adv_w = 124, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27307, .adv_w = 132, .box_w = 10, .box_h = 16, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27387, .adv_w = 124, .box_w = 8, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27443, .adv_w = 132, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27513, .adv_w = 200, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 27590, .adv_w = 213, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 27668, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27693, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 27723, .adv_w = 71, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 27736, .adv_w = 77, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 27751, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27806, .adv_w = 213, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 27858, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 27878, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 27902, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 27915, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 27957, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 27970, .adv_w = 67, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27978, .adv_w = 75, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27988, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 27996, .adv_w = 75, .box_w = 6, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28032, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 28045, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28087, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28095, .adv_w = 75, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 28110, .adv_w = 75, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = 10}, + {.bitmap_index = 28125, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28167, .adv_w = 75, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 28177, .adv_w = 75, .box_w = 6, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28219, .adv_w = 120, .box_w = 6, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 28243, .adv_w = 71, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28296, .adv_w = 78, .box_w = 7, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28349, .adv_w = 71, .box_w = 4, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28383, .adv_w = 78, .box_w = 6, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28434, .adv_w = 124, .box_w = 8, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 28494, .adv_w = 132, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 28569, .adv_w = 71, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28601, .adv_w = 78, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28649, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 28715, .adv_w = 213, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 28787, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28812, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28842, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 28854, .adv_w = 78, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 28884, .adv_w = 241, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 28943, .adv_w = 251, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 29011, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29031, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29055, .adv_w = 134, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29087, .adv_w = 137, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29119, .adv_w = 241, .box_w = 13, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29158, .adv_w = 251, .box_w = 15, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29203, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29223, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29247, .adv_w = 241, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29299, .adv_w = 251, .box_w = 15, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29359, .adv_w = 71, .box_w = 5, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29384, .adv_w = 77, .box_w = 6, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29414, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29479, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 29539, .adv_w = 158, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29589, .adv_w = 165, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29649, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29709, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29774, .adv_w = 158, .box_w = 10, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29809, .adv_w = 165, .box_w = 12, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 29851, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29921, .adv_w = 165, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 29991, .adv_w = 158, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30036, .adv_w = 165, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30090, .adv_w = 114, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30115, .adv_w = 134, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30147, .adv_w = 114, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30182, .adv_w = 134, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30227, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30263, .adv_w = 141, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30313, .adv_w = 124, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30361, .adv_w = 141, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 30421, .adv_w = 313, .box_w = 18, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 30511, .adv_w = 326, .box_w = 20, .box_h = 11, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 30621, .adv_w = 215, .box_w = 14, .box_h = 6, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30663, .adv_w = 228, .box_w = 16, .box_h = 6, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 30711, .adv_w = 313, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 30837, .adv_w = 326, .box_w = 20, .box_h = 14, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 30977, .adv_w = 215, .box_w = 14, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31040, .adv_w = 228, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31120, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31228, .adv_w = 314, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31342, .adv_w = 217, .box_w = 14, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31391, .adv_w = 222, .box_w = 16, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31447, .adv_w = 310, .box_w = 18, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31555, .adv_w = 314, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 31669, .adv_w = 217, .box_w = 14, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31718, .adv_w = 222, .box_w = 16, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31774, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 31852, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 31942, .adv_w = 204, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32020, .adv_w = 210, .box_w = 15, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32110, .adv_w = 237, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32188, .adv_w = 243, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32278, .adv_w = 204, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32356, .adv_w = 210, .box_w = 15, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32446, .adv_w = 153, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32516, .adv_w = 136, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32576, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32617, .adv_w = 124, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32649, .adv_w = 153, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32724, .adv_w = 136, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32794, .adv_w = 134, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32844, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 32885, .adv_w = 265, .box_w = 15, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32975, .adv_w = 265, .box_w = 16, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 33055, .adv_w = 122, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33095, .adv_w = 130, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33140, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 33224, .adv_w = 214, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 33315, .adv_w = 122, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33355, .adv_w = 130, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33400, .adv_w = 211, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 33466, .adv_w = 216, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 33544, .adv_w = 122, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33603, .adv_w = 141, .box_w = 10, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33668, .adv_w = 186, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 33743, .adv_w = 194, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 33833, .adv_w = 78, .box_w = 5, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33863, .adv_w = 85, .box_w = 7, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33905, .adv_w = 159, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 33945, .adv_w = 170, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 33990, .adv_w = 137, .box_w = 9, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34013, .adv_w = 148, .box_w = 11, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34041, .adv_w = 188, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 34096, .adv_w = 195, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 34156, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34176, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34200, .adv_w = 134, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 34225, .adv_w = 137, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 34249, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34290, .adv_w = 118, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34340, .adv_w = 124, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34380, .adv_w = 132, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34430, .adv_w = 200, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34485, .adv_w = 213, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 34537, .adv_w = 200, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 34603, .adv_w = 213, .box_w = 13, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 34668, .adv_w = 71, .box_w = 5, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 34688, .adv_w = 77, .box_w = 6, .box_h = 8, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 34712, .adv_w = 146, .box_w = 10, .box_h = 14, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 34782, .adv_w = 153, .box_w = 12, .box_h = 14, .ofs_x = -2, .ofs_y = 0}, + {.bitmap_index = 34866, .adv_w = 146, .box_w = 9, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 34938, .adv_w = 153, .box_w = 11, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 35026, .adv_w = 146, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35090, .adv_w = 153, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35170, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35218, .adv_w = 153, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35278, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_2[] = { + 0x0, 0x1, 0x3, 0x4, 0x6, 0xf, 0x15, 0x19 +}; + +static const uint8_t glyph_id_ofs_list_5[] = { + 0, 0, 0, 1, 0, 0, 0, 0, + 0, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 0, 0, 0, 19 +}; + +static const uint16_t unicode_list_7[] = { + 0x0, 0x1, 0x2, 0x5, 0x6, 0x8, 0xa, 0xf, + 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0xe93b, 0xe942, 0xe945, 0xe946, 0xe947, 0xe94b, + 0xe94d, 0xe94f, 0xe953, 0xe956, 0xe95b, 0xe960, 0xe961, 0xe962, + 0xe978, 0xe97d, 0xe982, 0xe985, 0xe986, 0xe987, 0xe98b, 0xe98c, + 0xe98d, 0xe98e, 0xe9a1, 0xe9a2, 0xe9a8, 0xe9aa, 0xe9ab, 0xe9ae, + 0xe9b1, 0xe9b2, 0xe9b3, 0xe9b5, 0xe9cd, 0xe9cf, 0xe9fe, 0xe9ff, + 0xea01, 0xea03, 0xea1a, 0xea21, 0xea24, 0xea2d, 0xea56, 0xea5e, + 0xea95, 0xeb25, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xebc1, + 0xebcd, 0xec27, 0xec3e, 0xee94, 0xf0fc, 0xf1dc +}; + +static const uint16_t unicode_list_9[] = { + 0x0, 0x1, 0x2, 0x3, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x34, 0x35, + 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x52, 0x53, + 0x54, 0x55, 0x2c6, 0x2c7, 0x2c8, 0x2c9, 0x2ca +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1488, .range_length = 27, .glyph_id_start = 96, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1542, .range_length = 26, .glyph_id_start = 123, + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 8, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 1569, .range_length = 26, .glyph_id_start = 131, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1600, .range_length = 22, .glyph_id_start = 157, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1623, .range_length = 30, .glyph_id_start = 179, + .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_5, .list_length = 30, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL + }, + { + .range_start = 1657, .range_length = 71, .glyph_id_start = 199, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 1734, .range_length = 61917, .glyph_id_start = 270, + .unicode_list = unicode_list_7, .glyph_id_ofs_list = NULL, .list_length = 78, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 64338, .range_length = 82, .glyph_id_start = 348, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 64426, .range_length = 715, .glyph_id_start = 430, + .unicode_list = unicode_list_9, .glyph_id_ofs_list = NULL, .list_length = 31, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 65142, .range_length = 135, .glyph_id_start = 461, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 65279, .range_length = 1, .glyph_id_start = 596, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 12, + .bpp = 4, + .kern_classes = 0, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_dejavu_16_persian_hebrew = { +#else +lv_font_t lv_font_dejavu_16_persian_hebrew = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 24, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_DEJAVU_16_PERSIAN_HEBREW*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_10.c b/inc/lvgl/src/font/lv_font_montserrat_10.c new file mode 100644 index 0000000..80fe261 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_10.c @@ -0,0 +1,1654 @@ +/******************************************************************************* + * Size: 10 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 10 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_10.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_10 + #define LV_FONT_MONTSERRAT_10 1 +#endif + +#if LV_FONT_MONTSERRAT_10 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x3e, 0x2d, 0x2c, 0x1c, 0x5, 0x1, 0x2d, + + /* U+0022 "\"" */ + 0x57, 0x84, 0x56, 0x83, 0x23, 0x41, + + /* U+0023 "#" */ + 0x0, 0xb0, 0x28, 0x0, 0xb, 0x4, 0x60, 0x4a, + 0xea, 0xdc, 0x80, 0x28, 0x8, 0x20, 0x8c, 0xdb, + 0xeb, 0x40, 0x64, 0xb, 0x0, 0x8, 0x30, 0xb0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x13, 0x0, 0x8, 0xde, 0xc3, 0x5b, 0x27, + 0x11, 0x4d, 0x57, 0x0, 0x6, 0xce, 0x80, 0x0, + 0x29, 0x9a, 0x32, 0x27, 0x5b, 0x3c, 0xde, 0xb2, + 0x0, 0x27, 0x0, + + /* U+0025 "%" */ + 0x29, 0x92, 0x2, 0x90, 0x9, 0x11, 0x90, 0xa1, + 0x0, 0x82, 0x28, 0x74, 0x0, 0x1, 0x88, 0x49, + 0x68, 0x40, 0x0, 0xb, 0x29, 0xa, 0x0, 0x8, + 0x32, 0x80, 0xa0, 0x3, 0x80, 0x8, 0x87, 0x0, + + /* U+0026 "&" */ + 0x3, 0xcb, 0x70, 0x0, 0xa4, 0xd, 0x0, 0x5, + 0xba, 0x60, 0x0, 0x7c, 0xc0, 0x10, 0x5a, 0x7, + 0xbb, 0x37, 0x80, 0xa, 0xe0, 0xa, 0xcc, 0x97, + 0x70, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x57, 0x56, 0x23, + + /* U+0028 "(" */ + 0x2, 0xc0, 0x9, 0x60, 0xd, 0x10, 0xe, 0x0, + 0xe, 0x0, 0xe, 0x0, 0xd, 0x10, 0x9, 0x60, + 0x2, 0xc0, + + /* U+0029 ")" */ + 0x68, 0x0, 0xe0, 0xb, 0x30, 0x95, 0x8, 0x60, + 0x95, 0xb, 0x30, 0xe0, 0x68, 0x0, + + /* U+002A "*" */ + 0x24, 0x42, 0x4d, 0xd4, 0x79, 0x97, 0x2, 0x20, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x85, 0x0, 0x3b, 0xdc, + 0xb1, 0x0, 0x85, 0x0, 0x0, 0x85, 0x0, + + /* U+002C "," */ + 0x35, 0x4a, 0x55, + + /* U+002D "-" */ + 0x5c, 0xc3, + + /* U+002E "." */ + 0x2, 0x6a, + + /* U+002F "/" */ + 0x0, 0x2, 0xb0, 0x0, 0x85, 0x0, 0xd, 0x0, + 0x4, 0x90, 0x0, 0xa3, 0x0, 0xd, 0x0, 0x5, + 0x80, 0x0, 0xb2, 0x0, 0x1c, 0x0, 0x0, + + /* U+0030 "0" */ + 0x4, 0xdd, 0xb1, 0x1, 0xe2, 0x6, 0xb0, 0x69, + 0x0, 0xe, 0x17, 0x80, 0x0, 0xd2, 0x69, 0x0, + 0xe, 0x11, 0xe2, 0x6, 0xb0, 0x4, 0xdd, 0xb1, + 0x0, + + /* U+0031 "1" */ + 0xbe, 0xa0, 0x5a, 0x5, 0xa0, 0x5a, 0x5, 0xa0, + 0x5a, 0x5, 0xa0, + + /* U+0032 "2" */ + 0x4c, 0xdd, 0x50, 0x42, 0x1, 0xf0, 0x0, 0x0, + 0xf0, 0x0, 0xa, 0x80, 0x0, 0xa9, 0x0, 0xb, + 0x80, 0x0, 0x8f, 0xdd, 0xd5, + + /* U+0033 "3" */ + 0x8d, 0xde, 0xe0, 0x0, 0xc, 0x40, 0x0, 0x98, + 0x0, 0x0, 0xbd, 0x90, 0x0, 0x0, 0xd3, 0x51, + 0x1, 0xe2, 0x6d, 0xdd, 0x60, + + /* U+0034 "4" */ + 0x0, 0x7, 0xa0, 0x0, 0x5, 0xc0, 0x0, 0x3, + 0xd1, 0x31, 0x1, 0xd2, 0xb, 0x30, 0x8d, 0xcc, + 0xfd, 0x70, 0x0, 0xb, 0x30, 0x0, 0x0, 0xb3, + 0x0, + + /* U+0035 "5" */ + 0xf, 0xdd, 0xd0, 0x1d, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0x3e, 0xdc, 0x60, 0x0, 0x1, 0xd4, 0x31, + 0x0, 0xc4, 0x5c, 0xdd, 0x80, + + /* U+0036 "6" */ + 0x2, 0xbd, 0xd4, 0x1e, 0x40, 0x0, 0x6a, 0x0, + 0x0, 0x7a, 0xab, 0xa1, 0x6e, 0x10, 0x5c, 0x1d, + 0x0, 0x3c, 0x4, 0xcc, 0xb2, + + /* U+0037 "7" */ + 0xbd, 0xdd, 0xe8, 0xb4, 0x0, 0xd3, 0x0, 0x4, + 0xc0, 0x0, 0xc, 0x40, 0x0, 0x3d, 0x0, 0x0, + 0xa6, 0x0, 0x1, 0xe0, 0x0, + + /* U+0038 "8" */ + 0x7, 0xcc, 0xb2, 0x3d, 0x0, 0x6a, 0x2d, 0x0, + 0x79, 0xb, 0xec, 0xf2, 0x6a, 0x0, 0x4d, 0x79, + 0x0, 0x3e, 0x9, 0xcb, 0xc4, + + /* U+0039 "9" */ + 0x1a, 0xcc, 0x60, 0x96, 0x0, 0xb3, 0x97, 0x0, + 0xc9, 0x9, 0xbb, 0x8a, 0x0, 0x0, 0x88, 0x0, + 0x2, 0xe2, 0x2d, 0xdc, 0x40, + + /* U+003A ":" */ + 0x6a, 0x1, 0x0, 0x2, 0x6a, + + /* U+003B ";" */ + 0x6a, 0x1, 0x0, 0x0, 0x6a, 0x38, 0x32, + + /* U+003C "<" */ + 0x0, 0x0, 0x10, 0x0, 0x5a, 0xa1, 0x3e, 0x61, + 0x0, 0x6, 0xb9, 0x30, 0x0, 0x2, 0x81, + + /* U+003D "=" */ + 0x3b, 0xbb, 0xb1, 0x0, 0x0, 0x0, 0x3b, 0xbb, + 0xb1, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x2b, 0xa4, 0x0, 0x0, 0x18, + 0xe1, 0x4, 0xab, 0x50, 0x37, 0x10, 0x0, + + /* U+003F "?" */ + 0x3c, 0xdd, 0x50, 0x52, 0x1, 0xf0, 0x0, 0x3, + 0xd0, 0x0, 0x3d, 0x20, 0x0, 0x85, 0x0, 0x0, + 0x10, 0x0, 0x0, 0xb4, 0x0, + + /* U+0040 "@" */ + 0x0, 0x4a, 0x99, 0xa7, 0x0, 0x6, 0x90, 0x0, + 0x3, 0xa0, 0x1b, 0x7, 0xcb, 0x9b, 0x47, 0x65, + 0x4b, 0x0, 0x8b, 0xa, 0x73, 0x77, 0x0, 0x3b, + 0xa, 0x65, 0x3b, 0x0, 0x8b, 0xa, 0x1b, 0x6, + 0xcb, 0x6c, 0xb3, 0x6, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x9a, 0xa2, 0x0, + + /* U+0041 "A" */ + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x88, 0xc0, + 0x0, 0x0, 0xd, 0x9, 0x40, 0x0, 0x6, 0x70, + 0x2b, 0x0, 0x0, 0xdc, 0xcc, 0xe3, 0x0, 0x59, + 0x0, 0x4, 0xa0, 0xc, 0x30, 0x0, 0xd, 0x10, + + /* U+0042 "B" */ + 0xfc, 0xcc, 0xb2, 0xf, 0x0, 0x7, 0xa0, 0xf0, + 0x0, 0x88, 0xf, 0xcc, 0xdf, 0x30, 0xf0, 0x0, + 0x2e, 0xf, 0x0, 0x1, 0xf0, 0xfc, 0xcc, 0xc5, + 0x0, + + /* U+0043 "C" */ + 0x1, 0x9d, 0xdc, 0x30, 0xd6, 0x0, 0x35, 0x5b, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x35, 0x1, 0x9d, 0xdc, + 0x30, + + /* U+0044 "D" */ + 0xfd, 0xdd, 0xb3, 0xf, 0x0, 0x3, 0xe2, 0xf0, + 0x0, 0x6, 0x9f, 0x0, 0x0, 0x4b, 0xf0, 0x0, + 0x6, 0x9f, 0x0, 0x3, 0xe2, 0xfd, 0xdd, 0xb3, + 0x0, + + /* U+0045 "E" */ + 0xfd, 0xdd, 0xc0, 0xf0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xfc, 0xcc, 0x70, 0xf0, 0x0, 0x0, 0xf0, + 0x0, 0x0, 0xfd, 0xdd, 0xd1, + + /* U+0046 "F" */ + 0xfd, 0xdd, 0xcf, 0x0, 0x0, 0xf0, 0x0, 0xf, + 0xdd, 0xd7, 0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, + 0x0, 0x0, + + /* U+0047 "G" */ + 0x1, 0x9d, 0xdc, 0x40, 0xd7, 0x0, 0x25, 0x5b, + 0x0, 0x0, 0x7, 0x80, 0x0, 0x7, 0x5b, 0x0, + 0x1, 0xd0, 0xd6, 0x0, 0x3d, 0x1, 0x9d, 0xdc, + 0x50, + + /* U+0048 "H" */ + 0xf0, 0x0, 0xf, 0x1f, 0x0, 0x0, 0xf1, 0xf0, + 0x0, 0xf, 0x1f, 0xdd, 0xdd, 0xf1, 0xf0, 0x0, + 0xf, 0x1f, 0x0, 0x0, 0xf1, 0xf0, 0x0, 0xf, + 0x10, + + /* U+0049 "I" */ + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + + /* U+004A "J" */ + 0x4, 0xdd, 0xf2, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xd2, 0x6, + 0x1, 0xe0, 0x8, 0xdd, 0x60, + + /* U+004B "K" */ + 0xf0, 0x0, 0xa8, 0xf, 0x0, 0x99, 0x0, 0xf0, + 0x99, 0x0, 0xf, 0x9f, 0x40, 0x0, 0xfb, 0x4e, + 0x20, 0xf, 0x10, 0x5d, 0x10, 0xf0, 0x0, 0x6b, + 0x0, + + /* U+004C "L" */ + 0xf0, 0x0, 0xf, 0x0, 0x0, 0xf0, 0x0, 0xf, + 0x0, 0x0, 0xf0, 0x0, 0xf, 0x0, 0x0, 0xfd, + 0xdd, 0xa0, + + /* U+004D "M" */ + 0xf2, 0x0, 0x0, 0x97, 0xfc, 0x0, 0x3, 0xf7, + 0xfa, 0x50, 0xc, 0xa7, 0xf1, 0xd0, 0x69, 0x77, + 0xf0, 0x79, 0xd1, 0x77, 0xf0, 0xd, 0x60, 0x77, + 0xf0, 0x1, 0x0, 0x77, + + /* U+004E "N" */ + 0xf4, 0x0, 0xf, 0x1f, 0xe2, 0x0, 0xf1, 0xf6, + 0xd0, 0xf, 0x1f, 0x9, 0xa0, 0xf1, 0xf0, 0xb, + 0x7f, 0x1f, 0x0, 0x1d, 0xf1, 0xf0, 0x0, 0x3f, + 0x10, + + /* U+004F "O" */ + 0x1, 0x9d, 0xdc, 0x40, 0xd, 0x60, 0x2, 0xd4, + 0x5b, 0x0, 0x0, 0x4b, 0x78, 0x0, 0x0, 0x1e, + 0x5b, 0x0, 0x0, 0x4b, 0xd, 0x60, 0x2, 0xd4, + 0x1, 0x9d, 0xdc, 0x40, + + /* U+0050 "P" */ + 0xfd, 0xdd, 0x90, 0xf0, 0x0, 0xa7, 0xf0, 0x0, + 0x5a, 0xf0, 0x0, 0xb6, 0xfd, 0xdc, 0x70, 0xf0, + 0x0, 0x0, 0xf0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x1, 0x9d, 0xdc, 0x40, 0x0, 0xc7, 0x0, 0x3d, + 0x40, 0x5b, 0x0, 0x0, 0x4b, 0x7, 0x80, 0x0, + 0x1, 0xe0, 0x5a, 0x0, 0x0, 0x4c, 0x0, 0xd6, + 0x0, 0x2d, 0x40, 0x1, 0xad, 0xdd, 0x40, 0x0, + 0x0, 0x4, 0xab, 0xa0, + + /* U+0052 "R" */ + 0xfd, 0xdd, 0x90, 0xf0, 0x0, 0xa7, 0xf0, 0x0, + 0x5a, 0xf0, 0x0, 0xb7, 0xfc, 0xcf, 0x90, 0xf0, + 0x5, 0xb0, 0xf0, 0x0, 0x97, + + /* U+0053 "S" */ + 0x8, 0xdc, 0xc3, 0x5b, 0x0, 0x11, 0x4d, 0x20, + 0x0, 0x6, 0xde, 0x90, 0x0, 0x1, 0x9a, 0x33, + 0x0, 0x5b, 0x3b, 0xcc, 0xb2, + + /* U+0054 "T" */ + 0xcd, 0xee, 0xda, 0x0, 0x97, 0x0, 0x0, 0x97, + 0x0, 0x0, 0x97, 0x0, 0x0, 0x97, 0x0, 0x0, + 0x97, 0x0, 0x0, 0x97, 0x0, + + /* U+0055 "U" */ + 0xf, 0x0, 0x1, 0xe0, 0xf0, 0x0, 0x1e, 0xf, + 0x0, 0x1, 0xe0, 0xf0, 0x0, 0x1e, 0xe, 0x0, + 0x2, 0xd0, 0xa7, 0x0, 0x98, 0x1, 0xad, 0xd9, + 0x0, + + /* U+0056 "V" */ + 0xc, 0x40, 0x0, 0x1d, 0x0, 0x5b, 0x0, 0x8, + 0x70, 0x0, 0xe2, 0x0, 0xe1, 0x0, 0x7, 0x90, + 0x69, 0x0, 0x0, 0x1e, 0x1d, 0x20, 0x0, 0x0, + 0x9c, 0xb0, 0x0, 0x0, 0x2, 0xf4, 0x0, 0x0, + + /* U+0057 "W" */ + 0x88, 0x0, 0xf, 0x40, 0x2, 0xc3, 0xd0, 0x5, + 0xea, 0x0, 0x86, 0xd, 0x20, 0xa4, 0xe0, 0xd, + 0x10, 0x88, 0xd, 0xa, 0x43, 0xc0, 0x2, 0xd5, + 0x90, 0x4a, 0x86, 0x0, 0xd, 0xd3, 0x0, 0xed, + 0x10, 0x0, 0x8e, 0x0, 0xa, 0xc0, 0x0, + + /* U+0058 "X" */ + 0x5c, 0x0, 0x1d, 0x10, 0x98, 0xb, 0x50, 0x0, + 0xda, 0x90, 0x0, 0x6, 0xf2, 0x0, 0x1, 0xd7, + 0xc0, 0x0, 0xc5, 0xa, 0x80, 0x8a, 0x0, 0xd, + 0x30, + + /* U+0059 "Y" */ + 0xb, 0x50, 0x0, 0xc3, 0x2, 0xd0, 0x6, 0x90, + 0x0, 0x88, 0x1d, 0x10, 0x0, 0xd, 0xb6, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x0, 0x4, 0xb0, 0x0, + + /* U+005A "Z" */ + 0x6d, 0xdd, 0xdf, 0x10, 0x0, 0xb, 0x70, 0x0, + 0x8, 0xa0, 0x0, 0x4, 0xd0, 0x0, 0x2, 0xe2, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x8f, 0xdd, 0xdd, + 0x30, + + /* U+005B "[" */ + 0xfb, 0x1f, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xfb, 0x10, + + /* U+005C "\\" */ + 0x3a, 0x0, 0x0, 0xc1, 0x0, 0x7, 0x60, 0x0, + 0x1c, 0x0, 0x0, 0xb2, 0x0, 0x5, 0x80, 0x0, + 0xd, 0x0, 0x0, 0xa3, 0x0, 0x4, 0x90, + + /* U+005D "]" */ + 0x9e, 0x40, 0xb4, 0xb, 0x40, 0xb4, 0xb, 0x40, + 0xb4, 0xb, 0x40, 0xb4, 0x9e, 0x40, + + /* U+005E "^" */ + 0x0, 0xa8, 0x0, 0x2, 0x9b, 0x0, 0x9, 0x25, + 0x60, 0x1b, 0x0, 0xb0, + + /* U+005F "_" */ + 0x99, 0x99, 0x90, + + /* U+0060 "`" */ + 0x3a, 0x30, + + /* U+0061 "a" */ + 0x1b, 0xcd, 0x60, 0x1, 0x0, 0xe0, 0x1a, 0xaa, + 0xf1, 0x78, 0x0, 0xe1, 0x2c, 0xaa, 0xe1, + + /* U+0062 "b" */ + 0x1e, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x1e, + 0xac, 0xd6, 0x1, 0xf3, 0x1, 0xe2, 0x1e, 0x0, + 0xa, 0x51, 0xf4, 0x1, 0xe2, 0x1d, 0x9c, 0xd5, + 0x0, + + /* U+0063 "c" */ + 0x7, 0xdd, 0xa0, 0x5c, 0x0, 0x40, 0x87, 0x0, + 0x0, 0x5c, 0x0, 0x41, 0x7, 0xdd, 0xa0, + + /* U+0064 "d" */ + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x8, 0xdc, + 0x9e, 0x5c, 0x0, 0x7e, 0x87, 0x0, 0x1e, 0x5b, + 0x0, 0x6e, 0x8, 0xdb, 0x8e, + + /* U+0065 "e" */ + 0x8, 0xcc, 0x90, 0x5a, 0x0, 0x87, 0x8c, 0xaa, + 0xa8, 0x5b, 0x0, 0x20, 0x7, 0xdc, 0xb1, + + /* U+0066 "f" */ + 0x7, 0xc9, 0xe, 0x0, 0x9f, 0xb6, 0xf, 0x0, + 0xf, 0x0, 0xf, 0x0, 0xf, 0x0, + + /* U+0067 "g" */ + 0x8, 0xdc, 0x9e, 0x5b, 0x0, 0x5f, 0x87, 0x0, + 0xf, 0x5c, 0x0, 0x6f, 0x7, 0xdc, 0x9f, 0x3, + 0x0, 0x4c, 0x1a, 0xcc, 0xb2, + + /* U+0068 "h" */ + 0x1e, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x1e, 0xac, + 0xd4, 0x1f, 0x30, 0x3d, 0x1e, 0x0, 0xe, 0x1e, + 0x0, 0xf, 0x1e, 0x0, 0xf, + + /* U+0069 "i" */ + 0x2d, 0x0, 0x10, 0x1e, 0x1, 0xe0, 0x1e, 0x1, + 0xe0, 0x1e, 0x0, + + /* U+006A "j" */ + 0x1, 0xe0, 0x0, 0x10, 0x0, 0xe0, 0x0, 0xe0, + 0x0, 0xe0, 0x0, 0xe0, 0x0, 0xe0, 0x1, 0xe0, + 0xad, 0x60, + + /* U+006B "k" */ + 0x1e, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x1e, + 0x1, 0xb6, 0x1, 0xe2, 0xd5, 0x0, 0x1f, 0xde, + 0x20, 0x1, 0xf2, 0x5d, 0x0, 0x1e, 0x0, 0x7b, + 0x0, + + /* U+006C "l" */ + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + + /* U+006D "m" */ + 0x1e, 0xab, 0xc5, 0xbb, 0xc2, 0x1f, 0x20, 0x5f, + 0x10, 0x69, 0x1e, 0x0, 0x2c, 0x0, 0x4b, 0x1e, + 0x0, 0x2c, 0x0, 0x4b, 0x1e, 0x0, 0x2c, 0x0, + 0x4b, + + /* U+006E "n" */ + 0x1e, 0xab, 0xc4, 0x1f, 0x20, 0x3d, 0x1e, 0x0, + 0xe, 0x1e, 0x0, 0xf, 0x1e, 0x0, 0xf, + + /* U+006F "o" */ + 0x7, 0xdd, 0xb1, 0x5c, 0x0, 0x7b, 0x87, 0x0, + 0x1e, 0x5c, 0x0, 0x7b, 0x7, 0xdd, 0xb1, + + /* U+0070 "p" */ + 0x1e, 0xab, 0xd6, 0x1, 0xf3, 0x1, 0xd2, 0x1e, + 0x0, 0xa, 0x51, 0xf4, 0x1, 0xe2, 0x1e, 0xac, + 0xd5, 0x1, 0xe0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x8, 0xdc, 0x8e, 0x5c, 0x0, 0x7e, 0x87, 0x0, + 0x1e, 0x5c, 0x0, 0x7e, 0x8, 0xdc, 0x8e, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xe, + + /* U+0072 "r" */ + 0x1d, 0xaa, 0x1f, 0x30, 0x1e, 0x0, 0x1e, 0x0, + 0x1e, 0x0, + + /* U+0073 "s" */ + 0x2c, 0xcc, 0x48, 0x80, 0x0, 0x2a, 0xca, 0x21, + 0x0, 0x6a, 0x6c, 0xcc, 0x30, + + /* U+0074 "t" */ + 0xf, 0x0, 0x9f, 0xb6, 0xf, 0x0, 0xf, 0x0, + 0xe, 0x10, 0x7, 0xd9, + + /* U+0075 "u" */ + 0x2d, 0x0, 0x1d, 0x2d, 0x0, 0x1d, 0x2d, 0x0, + 0x1d, 0xe, 0x10, 0x6d, 0x6, 0xdb, 0x9d, + + /* U+0076 "v" */ + 0xc, 0x30, 0x9, 0x50, 0x5a, 0x1, 0xd0, 0x0, + 0xd2, 0x86, 0x0, 0x6, 0x9d, 0x0, 0x0, 0xe, + 0x80, 0x0, + + /* U+0077 "w" */ + 0xb2, 0x1, 0xf1, 0x2, 0xb5, 0x80, 0x7b, 0x80, + 0x85, 0xd, 0xd, 0x1d, 0xd, 0x0, 0x89, 0x90, + 0x99, 0x80, 0x2, 0xf2, 0x2, 0xf2, 0x0, + + /* U+0078 "x" */ + 0x5b, 0x3, 0xc0, 0x8, 0x9c, 0x10, 0x0, 0xe7, + 0x0, 0xa, 0x7c, 0x20, 0x79, 0x2, 0xd1, + + /* U+0079 "y" */ + 0xc, 0x30, 0x9, 0x50, 0x5a, 0x1, 0xd0, 0x0, + 0xd2, 0x77, 0x0, 0x6, 0x9d, 0x0, 0x0, 0xe, + 0x80, 0x0, 0x0, 0xd1, 0x0, 0xc, 0xd6, 0x0, + 0x0, + + /* U+007A "z" */ + 0x6b, 0xbe, 0xb0, 0x2, 0xd1, 0x1, 0xd2, 0x0, + 0xc4, 0x0, 0x8e, 0xbb, 0x90, + + /* U+007B "{" */ + 0x4, 0xd3, 0x9, 0x50, 0xa, 0x50, 0xa, 0x40, + 0x5f, 0x10, 0xa, 0x40, 0xa, 0x50, 0x9, 0x50, + 0x4, 0xd3, + + /* U+007C "|" */ + 0xee, 0xee, 0xee, 0xee, 0xe0, + + /* U+007D "}" */ + 0xab, 0x0, 0xd2, 0xd, 0x20, 0xc2, 0x9, 0xc0, + 0xc2, 0xd, 0x20, 0xd2, 0xab, 0x0, + + /* U+007E "~" */ + 0x1a, 0x91, 0x62, 0x44, 0x29, 0x90, + + /* U+00B0 "°" */ + 0x7, 0x81, 0x62, 0x8, 0x62, 0x8, 0x7, 0x81, + + /* U+2022 "•" */ + 0x19, 0x23, 0xe4, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0x10, 0x0, 0x16, + 0xbf, 0xff, 0xf2, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x20, 0x5, 0xff, 0xd9, 0x41, 0xf2, 0x0, 0x5f, + 0x20, 0x0, 0x1f, 0x20, 0x5, 0xe0, 0x0, 0x1, + 0xf2, 0x0, 0x5e, 0x0, 0x7, 0x9f, 0x20, 0x48, + 0xe0, 0x7, 0xff, 0xf2, 0xaf, 0xfe, 0x0, 0x2b, + 0xd8, 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x41, 0x88, 0x88, 0x88, 0x14, 0xeb, 0xe7, 0x77, + 0x7e, 0xbe, 0xa2, 0xd0, 0x0, 0xd, 0x2a, 0xeb, + 0xe3, 0x33, 0x3e, 0xbe, 0xb4, 0xfb, 0xbb, 0xbf, + 0x4b, 0xd9, 0xd0, 0x0, 0xd, 0x9d, 0xb5, 0xd0, + 0x0, 0xd, 0x5b, 0xb7, 0xff, 0xff, 0xff, 0x7b, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xd6, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x67, + 0x52, 0x77, 0x77, 0x76, 0xef, 0xc6, 0xff, 0xff, + 0xfe, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x67, 0x52, + 0x77, 0x77, 0x76, 0xef, 0xc6, 0xff, 0xff, 0xfe, + 0xff, 0xe7, 0xff, 0xff, 0xff, 0x78, 0x63, 0x88, + 0x88, 0x87, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x6, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0x7c, + 0x10, 0x6, 0xff, 0x70, 0xdf, 0xd1, 0x6f, 0xf7, + 0x0, 0x1d, 0xfe, 0xff, 0x70, 0x0, 0x1, 0xdf, + 0xf7, 0x0, 0x0, 0x0, 0x1c, 0x60, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x0, 0xc, 0xd1, 0x2, 0xea, 0xaf, + 0xd4, 0xef, 0x80, 0xaf, 0xff, 0x80, 0x2, 0xff, + 0xf1, 0x2, 0xef, 0xdf, 0xd1, 0xdf, 0x80, 0xaf, + 0xb6, 0x70, 0x0, 0x85, + + /* U+F011 "" */ + 0x0, 0x0, 0xa6, 0x0, 0x0, 0x2, 0xa0, 0xea, + 0x29, 0x0, 0xe, 0xe1, 0xea, 0x5f, 0xa0, 0x7f, + 0x40, 0xea, 0x8, 0xf3, 0xbd, 0x0, 0xea, 0x1, + 0xf7, 0xcc, 0x0, 0xb7, 0x0, 0xf8, 0xaf, 0x0, + 0x0, 0x4, 0xf6, 0x4f, 0xa0, 0x0, 0x1d, 0xf1, + 0x9, 0xfd, 0x89, 0xef, 0x50, 0x0, 0x6d, 0xff, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x1, 0x88, 0x10, 0x0, 0x0, 0x5, 0xff, + 0x40, 0x0, 0x1e, 0xcf, 0xff, 0xfc, 0xd0, 0x7f, + 0xff, 0xdd, 0xff, 0xf7, 0x2d, 0xfa, 0x0, 0xbf, + 0xd1, 0xb, 0xf7, 0x0, 0x8f, 0xa0, 0x6f, 0xfe, + 0x55, 0xef, 0xf6, 0x4f, 0xff, 0xff, 0xff, 0xf3, + 0x6, 0x3a, 0xff, 0xa3, 0x60, 0x0, 0x3, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0x90, 0xf8, 0x0, 0x0, 0x9, 0xf8, 0xec, + 0xf8, 0x0, 0x1, 0xbe, 0x5a, 0x5c, 0xf8, 0x0, + 0x2d, 0xd5, 0xef, 0xf6, 0xaf, 0x50, 0xda, 0x6f, + 0xff, 0xff, 0x87, 0xf1, 0x11, 0xff, 0xff, 0xff, + 0xf5, 0x10, 0x2, 0xff, 0xc3, 0x9f, 0xf6, 0x0, + 0x2, 0xff, 0xb0, 0x7f, 0xf6, 0x0, 0x1, 0xbb, + 0x70, 0x4b, 0xb3, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x88, 0x20, 0x0, 0x0, 0x1, 0xff, + 0x60, 0x0, 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, + 0x1, 0xff, 0x60, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x5, + 0xff, 0xb0, 0x0, 0x8b, 0xb9, 0x8b, 0x8b, 0xb9, + 0xdf, 0xff, 0xff, 0xfe, 0xdf, 0xcf, 0xff, 0xff, + 0xfc, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x24, 0x44, 0x44, 0x30, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xf4, 0x0, 0xb, 0xc0, 0x0, 0x0, + 0x8e, 0x10, 0x6e, 0x10, 0x0, 0x0, 0xc, 0xa0, + 0xee, 0xcb, 0x10, 0xa, 0xcd, 0xf2, 0xff, 0xff, + 0xb8, 0x9f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, + + /* U+F021 "" */ + 0x0, 0x4, 0x87, 0x30, 0x5f, 0x2, 0xdf, 0xfe, + 0xfc, 0x7f, 0x1e, 0xd3, 0x0, 0x3c, 0xff, 0x9f, + 0x10, 0x5, 0xfe, 0xff, 0x44, 0x0, 0x2, 0x66, + 0x66, 0x12, 0x22, 0x0, 0x0, 0x11, 0xff, 0xff, + 0x50, 0x0, 0xda, 0xff, 0xa3, 0x10, 0x8, 0xf4, + 0xfc, 0xfb, 0x66, 0xbf, 0x80, 0xf5, 0x5c, 0xff, + 0xd5, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x70, 0x0, 0xbf, 0xab, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3e, 0xf0, 0x0, 0x2c, + + /* U+F027 "" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0xb, 0xf0, 0x0, + 0xab, 0xdf, 0xf0, 0x20, 0xff, 0xff, 0xf0, 0xa6, + 0xff, 0xff, 0xf0, 0x59, 0xff, 0xff, 0xf0, 0x92, + 0x0, 0x3e, 0xf0, 0x0, 0x0, 0x2, 0xc0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x70, 0x0, 0xaa, 0x0, 0x0, 0xb, 0xf0, 0xa, + 0x4a, 0x70, 0xab, 0xdf, 0xf0, 0x23, 0xe2, 0xe0, + 0xff, 0xff, 0xf0, 0xa6, 0x95, 0xc2, 0xff, 0xff, + 0xf0, 0x59, 0x76, 0xc3, 0xff, 0xff, 0xf0, 0x92, + 0xc3, 0xe1, 0x0, 0x3e, 0xf0, 0x9, 0xa6, 0xb0, + 0x0, 0x2, 0xc0, 0x3, 0x3e, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, + + /* U+F03E "" */ + 0x24, 0x44, 0x44, 0x44, 0x42, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xf3, 0xd, 0xff, 0xef, 0xff, 0xf8, + 0x4e, 0xfe, 0x25, 0xff, 0xff, 0x9d, 0xe2, 0x0, + 0x6f, 0xf9, 0x1, 0x20, 0x0, 0x4f, 0xf7, 0x44, + 0x44, 0x44, 0x7f, 0xcf, 0xff, 0xff, 0xff, 0xfc, + + /* U+F043 "" */ + 0x0, 0x1a, 0x0, 0x0, 0x7, 0xf5, 0x0, 0x0, + 0xef, 0xc0, 0x0, 0x8f, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0x1b, 0xff, 0xff, 0xf9, 0xfb, 0xff, 0xff, + 0xdd, 0x6e, 0xff, 0xfc, 0x7e, 0x59, 0xff, 0x60, + 0x9f, 0xff, 0x80, 0x0, 0x13, 0x10, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0xe, 0x70, 0x3, 0xe4, 0xe7, + 0x4, 0xff, 0x5e, 0x75, 0xff, 0xf5, 0xec, 0xff, + 0xff, 0x5e, 0xff, 0xff, 0xf5, 0xea, 0xef, 0xff, + 0x5e, 0x71, 0xdf, 0xf5, 0xe7, 0x1, 0xcf, 0x59, + 0x50, 0x0, 0x92, + + /* U+F04B "" */ + 0x88, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x50, 0x0, + 0x0, 0xff, 0xff, 0xc3, 0x0, 0xf, 0xff, 0xff, + 0xf9, 0x10, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xb2, 0x0, 0xff, 0xfd, 0x40, 0x0, + 0xe, 0xf7, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x90, 0xdf, + 0xf9, 0xff, 0xfc, 0xf, 0xff, 0xcf, 0xff, 0xc0, + 0xff, 0xfc, 0xff, 0xfc, 0xf, 0xff, 0xcf, 0xff, + 0xc0, 0xff, 0xfc, 0xff, 0xfc, 0xf, 0xff, 0xcf, + 0xff, 0xc0, 0xff, 0xfc, 0xff, 0xfb, 0xf, 0xff, + 0xb8, 0xbb, 0x50, 0x8b, 0xb5, + + /* U+F04D "" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0xbb, 0xbb, 0xbb, 0xb5, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0xb, 0xa0, 0x0, 0xe7, 0xcf, + 0xb0, 0xe, 0x7c, 0xff, 0xc1, 0xe7, 0xcf, 0xff, + 0xdf, 0x7c, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0x9e, + 0x7c, 0xff, 0x70, 0xe7, 0xcf, 0x60, 0xe, 0x77, + 0x50, 0x0, 0x95, + + /* U+F052 "" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x60, 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x40, 0x6, 0xff, 0xff, 0xff, + 0xf3, 0xe, 0xff, 0xff, 0xff, 0xfa, 0x3, 0x66, + 0x66, 0x66, 0x62, 0xd, 0xff, 0xff, 0xff, 0xf9, + 0xf, 0xff, 0xff, 0xff, 0xfb, 0x6, 0x88, 0x88, + 0x88, 0x84, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc7, 0x0, 0x1d, + 0xf5, 0x1, 0xdf, 0x50, 0x1d, 0xf5, 0x0, 0x4f, + 0xd0, 0x0, 0x6, 0xfc, 0x0, 0x0, 0x6f, 0xc0, + 0x0, 0x6, 0xf9, 0x0, 0x0, 0x51, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x3e, 0x30, 0x0, 0x2e, 0xf3, + 0x0, 0x2, 0xef, 0x30, 0x0, 0x2e, 0xe3, 0x0, + 0x9, 0xf8, 0x0, 0x8f, 0xa0, 0x8, 0xfa, 0x0, + 0x5f, 0xa0, 0x0, 0x6, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x40, + 0x0, 0x0, 0x9, 0xf5, 0x0, 0x0, 0x0, 0x9f, + 0x50, 0x0, 0x9b, 0xbd, 0xfc, 0xbb, 0x6f, 0xff, + 0xff, 0xff, 0xfb, 0x13, 0x3a, 0xf7, 0x33, 0x10, + 0x0, 0x9f, 0x50, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x39, 0x10, 0x0, + + /* U+F068 "" */ + 0xbd, 0xdd, 0xdd, 0xdd, 0x8e, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x4, 0x8a, 0x95, 0x0, 0x0, 0x1, 0xcf, + 0x84, 0x6e, 0xe3, 0x0, 0x1e, 0xf5, 0x8, 0x72, + 0xff, 0x40, 0xbf, 0xe0, 0x2d, 0xf5, 0xbf, 0xe0, + 0xdf, 0xe3, 0xff, 0xf6, 0xaf, 0xf1, 0x4f, 0xf3, + 0xaf, 0xd1, 0xef, 0x70, 0x5, 0xfd, 0x31, 0x2b, + 0xf7, 0x0, 0x0, 0x19, 0xdf, 0xea, 0x30, 0x0, + + /* U+F070 "" */ + 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0x16, 0xaa, 0x83, 0x0, 0x0, 0x3, 0xef, 0xe6, + 0x49, 0xfb, 0x0, 0x0, 0x1, 0xbe, 0x49, 0x28, + 0xfd, 0x0, 0x1d, 0x40, 0x8f, 0xfe, 0x1f, 0xf9, + 0x4, 0xff, 0x50, 0x5f, 0xf1, 0xff, 0xb0, 0xa, + 0xfc, 0x0, 0x2d, 0xdf, 0xf2, 0x0, 0xa, 0xfa, + 0x10, 0x1b, 0xf7, 0x0, 0x0, 0x4, 0xbe, 0xe4, + 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x2, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xe7, 0xcf, + 0x20, 0x0, 0x0, 0x7, 0xfc, 0x8, 0xfb, 0x0, + 0x0, 0x1, 0xef, 0xd0, 0x9f, 0xf4, 0x0, 0x0, + 0x9f, 0xff, 0x5c, 0xff, 0xd0, 0x0, 0x2f, 0xff, + 0xe1, 0xaf, 0xff, 0x60, 0xb, 0xff, 0xfe, 0x2b, + 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x1, 0x33, 0x33, 0x33, 0x33, 0x32, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xc1, 0xef, 0xd1, 0x3, 0xef, 0xfc, 0x99, + 0xfb, 0x2e, 0xec, 0xf8, 0x0, 0x54, 0xde, 0x25, + 0x70, 0x0, 0xc, 0xf4, 0x1, 0x10, 0x0, 0xbf, + 0x5c, 0x78, 0xd1, 0xff, 0xf6, 0xa, 0xff, 0xfd, + 0x78, 0x60, 0x0, 0x7c, 0xf6, 0x0, 0x0, 0x0, + 0x5, 0x60, + + /* U+F077 "" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0xaf, 0x60, + 0x0, 0x0, 0xaf, 0xef, 0x60, 0x0, 0xaf, 0x90, + 0xcf, 0x60, 0x9f, 0x80, 0x0, 0xcf, 0x57, 0x80, + 0x0, 0x0, 0xa4, + + /* U+F078 "" */ + 0x11, 0x0, 0x0, 0x2, 0xc, 0xe2, 0x0, 0x5, + 0xf8, 0x3f, 0xe2, 0x5, 0xfd, 0x10, 0x3f, 0xe7, + 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x3b, 0x10, 0x0, + + /* U+F079 "" */ + 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xc3, 0xff, 0xff, 0xf5, 0x0, 0xbe, 0xfe, 0xb3, + 0x44, 0x4e, 0x60, 0x4, 0x3f, 0x34, 0x0, 0x0, + 0xd6, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xd, 0x60, + 0x0, 0x2f, 0x20, 0x0, 0x8c, 0xea, 0xf1, 0x1, + 0xff, 0xff, 0xf7, 0xdf, 0xf7, 0x0, 0x4, 0x44, + 0x44, 0x11, 0xc7, 0x0, + + /* U+F07B "" */ + 0x58, 0x88, 0x20, 0x0, 0x0, 0xff, 0xff, 0xe4, + 0x44, 0x41, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfc, + + /* U+F093 "" */ + 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x40, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x2, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x36, 0xff, 0x63, + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x4, + 0xff, 0x40, 0x0, 0x9a, 0xa5, 0xff, 0x5a, 0xa9, + 0xff, 0xff, 0xdd, 0xfe, 0xdf, 0xff, 0xff, 0xff, + 0xfc, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0xa8, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0xd0, 0x0, 0x39, 0x10, 0x4f, 0xf4, 0x0, 0xbf, + 0xfc, 0x9f, 0xf6, 0x0, 0xd, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x9f, 0xfd, 0x81, 0x0, 0x0, 0x1, + 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, 0x30, 0x5, + 0xc6, 0xe7, 0xbb, 0x5, 0xff, 0x4d, 0xbd, 0xb4, + 0xff, 0x40, 0x3c, 0xff, 0xff, 0x40, 0x0, 0x8, + 0xff, 0xb0, 0x0, 0x6f, 0xff, 0xdf, 0x80, 0xe, + 0x7b, 0xb2, 0xef, 0x80, 0xdb, 0xd9, 0x2, 0xef, + 0x73, 0xca, 0x10, 0x2, 0x72, + + /* U+F0C5 "" */ + 0x0, 0x5d, 0xdd, 0x48, 0x0, 0x8, 0xff, 0xf6, + 0xf8, 0xcc, 0x8f, 0xff, 0x84, 0x3f, 0xe8, 0xff, + 0xff, 0xfc, 0xfe, 0x8f, 0xff, 0xff, 0xcf, 0xe8, + 0xff, 0xff, 0xfc, 0xfe, 0x8f, 0xff, 0xff, 0xcf, + 0xe7, 0xff, 0xff, 0xfc, 0xff, 0x46, 0x66, 0x66, + 0x3f, 0xff, 0xff, 0xf4, 0x0, 0x34, 0x44, 0x43, + 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2, 0x22, 0x22, 0x0, 0xe, 0xff, 0xff, 0xfe, + 0x20, 0xf5, 0x22, 0x22, 0xfe, 0x1f, 0x40, 0x0, + 0xe, 0xf8, 0xf7, 0x44, 0x44, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xf6, 0xc, 0xff, 0x9f, + 0xff, 0x20, 0x9f, 0xf9, 0xff, 0xfc, 0x7f, 0xff, + 0x9a, 0xdd, 0xdd, 0xdd, 0xd4, + + /* U+F0C9 "" */ + 0x67, 0x77, 0x77, 0x77, 0x4e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0x77, + 0x77, 0x74, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x45, 0x55, 0x55, 0x55, 0x3f, + 0xff, 0xff, 0xff, 0xfb, 0x11, 0x11, 0x11, 0x11, + 0x0, + + /* U+F0E0 "" */ + 0x58, 0x88, 0x88, 0x88, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0xc5, + 0xdf, 0xff, 0xfd, 0x5c, 0xfe, 0x6a, 0xff, 0xa5, + 0xef, 0xff, 0xf9, 0x55, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfc, + + /* U+F0E7 "" */ + 0x3, 0xaa, 0xa2, 0x0, 0x7, 0xff, 0xf2, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0xb, 0xff, 0xd8, 0x81, + 0xe, 0xff, 0xff, 0xe1, 0xe, 0xff, 0xff, 0x60, + 0x0, 0x5, 0xfd, 0x0, 0x0, 0x9, 0xf4, 0x0, + 0x0, 0xd, 0xa0, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+F0EA "" */ + 0x1, 0x79, 0x11, 0x0, 0xf, 0xfc, 0x9f, 0xf4, + 0x0, 0xff, 0xfd, 0xcc, 0x30, 0xf, 0xfa, 0x79, + 0x93, 0x40, 0xff, 0x8e, 0xff, 0x6f, 0x5f, 0xf8, + 0xef, 0xf7, 0x64, 0xff, 0x8e, 0xff, 0xff, 0xcf, + 0xf8, 0xef, 0xff, 0xfc, 0x46, 0x3e, 0xff, 0xff, + 0xc0, 0x0, 0xdf, 0xff, 0xfc, 0x0, 0x2, 0x44, + 0x44, 0x20, + + /* U+F0F3 "" */ + 0x0, 0x1, 0x90, 0x0, 0x0, 0x2, 0xaf, 0x81, + 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, 0x9f, 0xff, + 0xff, 0x50, 0xc, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xa0, 0x3f, 0xff, 0xff, 0xfe, 0xd, + 0xff, 0xff, 0xff, 0xf9, 0x46, 0x66, 0x66, 0x66, + 0x20, 0x0, 0xbf, 0x70, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, + + /* U+F11C "" */ + 0x24, 0x44, 0x44, 0x44, 0x44, 0x30, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf4, 0xa0, 0xa0, 0xb0, + 0xb0, 0xf4, 0xff, 0xbe, 0xae, 0xae, 0xaf, 0xf4, + 0xff, 0x3a, 0xa, 0xa, 0xf, 0xf4, 0xfb, 0xea, + 0xaa, 0xaa, 0xea, 0xf4, 0xf7, 0xb4, 0x44, 0x44, + 0xc4, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe1, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x29, 0x70, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xe0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0x70, 0x0, 0x5d, 0xff, 0xff, 0xff, 0x10, + 0xc, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xee, + 0xef, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, + + /* U+F15B "" */ + 0xef, 0xff, 0x5b, 0x0, 0xff, 0xff, 0x6f, 0xb0, + 0xff, 0xff, 0x68, 0x83, 0xff, 0xff, 0xfd, 0xd6, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x5, + 0xbf, 0xff, 0xfd, 0x81, 0x0, 0x2c, 0xfe, 0xa8, + 0x78, 0xcf, 0xf7, 0xd, 0xf7, 0x0, 0x0, 0x0, + 0x3c, 0xf5, 0x22, 0x5, 0xbe, 0xfd, 0x81, 0x5, + 0x0, 0x9, 0xfe, 0xa9, 0xcf, 0xe2, 0x0, 0x0, + 0x37, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x10, 0x0, + 0x0, + + /* U+F240 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x55, 0x55, 0x55, 0x5a, 0xf2, 0xf6, 0xff, 0xff, + 0xff, 0xfd, 0x4f, 0x5f, 0x6f, 0xff, 0xff, 0xff, + 0xd1, 0xf5, 0xf5, 0x77, 0x77, 0x77, 0x76, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F241 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x55, 0x55, 0x54, 0x4a, 0xf2, 0xf6, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0x5f, 0x6f, 0xff, 0xff, 0xf0, + 0x1, 0xf5, 0xf5, 0x77, 0x77, 0x77, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F242 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x55, 0x54, 0x44, 0x4a, 0xf2, 0xf6, 0xff, 0xff, + 0x20, 0x0, 0x4f, 0x5f, 0x6f, 0xff, 0xf2, 0x0, + 0x1, 0xf5, 0xf5, 0x77, 0x77, 0x10, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F243 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf, 0x75, + 0x54, 0x44, 0x44, 0x4a, 0xf2, 0xf6, 0xff, 0x50, + 0x0, 0x0, 0x4f, 0x5f, 0x6f, 0xf5, 0x0, 0x0, + 0x1, 0xf5, 0xf5, 0x77, 0x20, 0x0, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F244 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0x74, + 0x44, 0x44, 0x44, 0x4a, 0xf2, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0x5f, 0x40, 0x0, 0x0, 0x0, + 0x1, 0xf5, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x41, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x5b, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xbd, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa1, + 0x3, 0x0, 0x0, 0xa, 0xf7, 0x39, 0x0, 0x0, + 0x7, 0x60, 0xff, 0xea, 0xbf, 0xaa, 0xaa, 0xdf, + 0x45, 0xa3, 0x0, 0x93, 0x0, 0x4, 0x10, 0x0, + 0x0, 0x1, 0xb8, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x6b, 0xca, 0x40, 0x0, 0x9f, 0xf6, 0xff, + 0x40, 0x1f, 0xff, 0x26, 0xfb, 0x4, 0xf6, 0xb4, + 0x6b, 0xf0, 0x6f, 0xf4, 0x6, 0xff, 0x6, 0xff, + 0x90, 0xbf, 0xf0, 0x5f, 0x95, 0x34, 0xcf, 0x2, + 0xfb, 0xf3, 0x4d, 0xc0, 0xc, 0xff, 0x3d, 0xf7, + 0x0, 0x1b, 0xfe, 0xf9, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+F2ED "" */ + 0x12, 0x3b, 0xca, 0x22, 0x1f, 0xff, 0xff, 0xff, + 0xfb, 0x36, 0x66, 0x66, 0x66, 0x16, 0xff, 0xff, + 0xff, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, 0x26, 0xf6, + 0xf6, 0xf7, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, 0x26, + 0xf6, 0xf6, 0xf7, 0xf2, 0x6f, 0x6f, 0x6f, 0x7f, + 0x24, 0xff, 0xff, 0xff, 0xf1, 0x3, 0x44, 0x44, + 0x42, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, 0xa5, 0xef, + 0xe0, 0x0, 0x0, 0xbf, 0xe5, 0xd4, 0x0, 0x0, + 0xbf, 0xff, 0xe0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x2, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x5, 0x88, 0x88, 0x88, 0x86, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, 0xf9, + 0x6f, 0x69, 0xff, 0x88, 0xff, 0xff, 0xc1, 0x21, + 0xcf, 0xf8, 0xdf, 0xff, 0xff, 0x50, 0x5f, 0xff, + 0x82, 0xef, 0xff, 0x71, 0x91, 0x7f, 0xf8, 0x2, + 0xef, 0xfe, 0xdf, 0xde, 0xff, 0x70, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0xe3, + + /* U+F7C2 "" */ + 0x1, 0xdf, 0xff, 0xe5, 0x1d, 0x6c, 0x5a, 0xab, + 0xdf, 0x3b, 0x18, 0x8b, 0xff, 0xdf, 0xde, 0xeb, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x8, 0x10, + 0x0, 0x7, 0xf0, 0xb, 0xf2, 0x0, 0x0, 0x8f, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xfa, + 0x99, 0x99, 0x99, 0x0, 0x6f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 43, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7, .adv_w = 63, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 13, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 38, .adv_w = 99, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65, .adv_w = 135, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 110, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 125, .adv_w = 34, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 128, .adv_w = 54, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146, .adv_w = 54, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 160, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 168, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 183, .adv_w = 36, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 186, .adv_w = 61, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 188, .adv_w = 36, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 190, .adv_w = 56, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 213, .adv_w = 107, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 238, .adv_w = 59, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 249, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 270, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 291, .adv_w = 107, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 316, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 337, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 358, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 379, .adv_w = 103, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 400, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 421, .adv_w = 36, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 426, .adv_w = 36, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 433, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 448, .adv_w = 93, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 457, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 472, .adv_w = 92, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 493, .adv_w = 165, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 538, .adv_w = 117, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 570, .adv_w = 121, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 595, .adv_w = 116, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 620, .adv_w = 132, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 645, .adv_w = 107, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 666, .adv_w = 102, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 684, .adv_w = 124, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 709, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 734, .adv_w = 50, .box_w = 2, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 741, .adv_w = 82, .box_w = 6, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 762, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 787, .adv_w = 95, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 805, .adv_w = 153, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 833, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 858, .adv_w = 134, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 886, .adv_w = 116, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 907, .adv_w = 134, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 943, .adv_w = 116, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 985, .adv_w = 94, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1006, .adv_w = 127, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1031, .adv_w = 114, .box_w = 9, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1063, .adv_w = 180, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1102, .adv_w = 108, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1127, .adv_w = 104, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1155, .adv_w = 105, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1180, .adv_w = 53, .box_w = 3, .box_h = 9, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1194, .adv_w = 56, .box_w = 5, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1217, .adv_w = 53, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1231, .adv_w = 93, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1243, .adv_w = 80, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1246, .adv_w = 96, .box_w = 3, .box_h = 1, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 1248, .adv_w = 96, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1263, .adv_w = 109, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1288, .adv_w = 91, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1303, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1324, .adv_w = 98, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1339, .adv_w = 56, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1353, .adv_w = 110, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1374, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1395, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1406, .adv_w = 45, .box_w = 4, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 1424, .adv_w = 99, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1449, .adv_w = 45, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1456, .adv_w = 169, .box_w = 10, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1481, .adv_w = 109, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1496, .adv_w = 102, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1511, .adv_w = 109, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1536, .adv_w = 109, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1557, .adv_w = 66, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1567, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1580, .adv_w = 66, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1592, .adv_w = 108, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1607, .adv_w = 89, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1625, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1648, .adv_w = 88, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1663, .adv_w = 89, .box_w = 7, .box_h = 7, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 1688, .adv_w = 83, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1701, .adv_w = 56, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1719, .adv_w = 48, .box_w = 1, .box_h = 9, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1724, .adv_w = 56, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1738, .adv_w = 93, .box_w = 6, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1744, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1752, .adv_w = 50, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1755, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1816, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1856, .adv_w = 160, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1906, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1946, .adv_w = 110, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1974, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2029, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2084, .adv_w = 180, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2144, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2199, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2247, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2302, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2322, .adv_w = 120, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2354, .adv_w = 180, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2414, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2454, .adv_w = 110, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2493, .adv_w = 140, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2528, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2578, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2623, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2668, .adv_w = 140, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2703, .adv_w = 140, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2753, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2783, .adv_w = 100, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2813, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2858, .adv_w = 140, .box_w = 9, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2872, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2920, .adv_w = 200, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2992, .adv_w = 180, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3064, .adv_w = 160, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3114, .adv_w = 140, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3141, .adv_w = 140, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3168, .adv_w = 200, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3220, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3260, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3315, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3376, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3421, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3471, .adv_w = 140, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3516, .adv_w = 140, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3557, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3597, .adv_w = 100, .box_w = 8, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3641, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3691, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3741, .adv_w = 180, .box_w = 12, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3789, .adv_w = 160, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3855, .adv_w = 120, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3899, .adv_w = 200, .box_w = 13, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3964, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4010, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4056, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4102, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4148, .adv_w = 200, .box_w = 13, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4194, .adv_w = 200, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4253, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4303, .adv_w = 140, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4353, .adv_w = 160, .box_w = 11, .box_h = 11, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4414, .adv_w = 200, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4466, .adv_w = 120, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4510, .adv_w = 161, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 4, -4, 0, 0, + 0, 0, -9, -10, 1, 8, 4, 3, + -6, 1, 8, 0, 7, 2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 1, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, -5, 0, 0, 0, 0, + 0, -3, 3, 3, 0, 0, -2, 0, + -1, 2, 0, -2, 0, -2, -1, -3, + 0, 0, 0, 0, -2, 0, 0, -2, + -2, 0, 0, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -2, 0, -4, 0, -19, 0, + 0, -3, 0, 3, 5, 0, 0, -3, + 2, 2, 5, 3, -3, 3, 0, 0, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -2, -8, 0, -6, + -1, 0, 0, 0, 0, 0, 6, 0, + -5, -1, 0, 0, 0, -3, 0, 0, + -1, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, -1, 6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 0, 2, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 3, 2, 5, -2, 0, 0, 3, -2, + -5, -22, 1, 4, 3, 0, -2, 0, + 6, 0, 5, 0, 5, 0, -15, 0, + -2, 5, 0, 5, -2, 3, 2, 0, + 0, 0, -2, 0, 0, -3, 13, 0, + 13, 0, 5, 0, 7, 2, 3, 5, + 0, 0, 0, -6, 0, 0, 0, 0, + 0, -1, 0, 1, -3, -2, -3, 1, + 0, -2, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 0, -10, 0, 0, 0, + 0, -1, 0, 16, -2, -2, 2, 2, + -1, 0, -2, 2, 0, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -16, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 10, 0, 0, -6, 0, + 5, 0, -11, -16, -11, -3, 5, 0, + 0, -11, 0, 2, -4, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, -20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -3, 0, 0, + 0, -2, 0, 0, -1, 0, 0, 0, + -3, 0, -1, 0, -4, -3, 0, -4, + -5, -5, -3, 0, -3, 0, -3, 0, + 0, 0, 0, -1, 0, 0, 2, 0, + 1, -2, 0, 0, 0, 0, 0, 2, + -1, 0, 0, 0, -1, 2, 2, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -1, 0, + -2, 0, -3, 0, 0, -1, 0, 5, + 0, 0, -2, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -2, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -2, 0, -5, + -1, -5, 3, 0, 0, -3, 2, 3, + 4, 0, -4, 0, -2, 0, 0, -8, + 2, -1, 1, -8, 2, 0, 0, 0, + -8, 0, -8, -1, -14, -1, 0, -8, + 0, 3, 4, 0, 2, 0, 0, 0, + 0, 0, 0, -3, -2, 0, -5, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -1, -2, -1, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, -1, 0, -3, 2, 0, 0, -2, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -2, 0, -2, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + -1, 0, 0, 0, 0, -2, -2, 0, + -3, 0, 5, -1, 0, -5, 0, 0, + 4, -8, -8, -7, -3, 2, 0, -1, + -10, -3, 0, -3, 0, -3, 2, -3, + -10, 0, -4, 0, 0, 1, 0, 1, + -1, 0, 2, 0, -5, -6, 0, -8, + -4, -3, -4, -5, -2, -4, 0, -3, + -4, 1, 0, 0, 0, -2, 0, 0, + 0, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, 0, -2, 0, -3, -4, + -4, 0, 0, -5, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -3, 0, 0, 0, 0, -8, -5, 0, + 0, 0, -2, -8, 0, 0, -2, 2, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -3, 0, + 0, 0, 0, 2, 0, 1, -3, -3, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, -5, 0, -2, 0, -2, -2, + 0, -4, -4, -5, -1, 0, -3, 0, + -5, 0, 0, 0, 0, 13, 0, 0, + 1, 0, 0, -2, 0, 2, 0, -7, + 0, 0, 0, 0, 0, -15, -3, 5, + 5, -1, -7, 0, 2, -2, 0, -8, + -1, -2, 2, -11, -2, 2, 0, 2, + -6, -2, -6, -5, -7, 0, 0, -10, + 0, 9, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -4, -5, 0, -15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -2, 0, 0, + -3, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 3, + 0, 2, 0, -4, 2, -1, 0, -4, + -2, 0, -2, -2, -1, 0, -2, -3, + 0, 0, -1, 0, -1, -3, -2, 0, + 0, -2, 0, 2, -1, 0, -4, 0, + 0, 0, -3, 0, -3, 0, -3, -3, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 2, 0, -2, 0, -1, -2, + -5, -1, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, -2, -1, -1, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -1, -2, + -1, 0, 1, 6, 0, 0, -4, 0, + -1, 3, 0, -2, -7, -2, 2, 0, + 0, -8, -3, 2, -3, 1, 0, -1, + -1, -5, 0, -2, 1, 0, 0, -3, + 0, 0, 0, 2, 2, -3, -3, 0, + -3, -2, -2, -2, -2, 0, -3, 1, + -3, -3, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -2, 0, -3, 0, 0, 0, -5, 0, + 1, -4, 3, 0, -1, -8, 0, 0, + -4, -2, 0, -6, -4, -4, 0, 0, + -7, -2, -6, -6, -8, 0, -4, 0, + 1, 11, -2, 0, -4, -2, 0, -2, + -3, -4, -3, -6, -7, -4, -2, 0, + 0, -1, 0, 0, 0, 0, -11, -1, + 5, 4, -4, -6, 0, 0, -5, 0, + -8, -1, -2, 3, -15, -2, 0, 0, + 0, -10, -2, -8, -2, -12, 0, 0, + -11, 0, 9, 0, 0, -1, 0, 0, + 0, 0, -1, -1, -6, -1, 0, -10, + 0, 0, 0, 0, -5, 0, -1, 0, + 0, -4, -8, 0, 0, -1, -2, -5, + -2, 0, -1, 0, 0, 0, 0, -7, + -2, -5, -5, -1, -3, -4, -2, -3, + 0, -3, -1, -5, -2, 0, -2, -3, + -2, -3, 0, 1, 0, -1, -5, 0, + 3, 0, -3, 0, 0, 0, 0, 2, + 0, 1, -3, 7, 0, -2, -2, -2, + 0, 0, 0, 0, 0, 0, -5, 0, + -2, 0, -2, -2, 0, -4, -4, -5, + -1, 0, -3, 1, 6, 0, 0, 0, + 0, 13, 0, 0, 1, 0, 0, -2, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -3, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -3, + -2, 0, 0, -3, 0, 3, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 2, 3, 1, -1, 0, -5, + -3, 0, 5, -5, -5, -3, -3, 6, + 3, 2, -14, -1, 3, -2, 0, -2, + 2, -2, -6, 0, -2, 2, -2, -1, + -5, -1, 0, 0, 5, 3, 0, -4, + 0, -9, -2, 5, -2, -6, 0, -2, + -5, -5, -2, 6, 2, 0, -2, 0, + -4, 0, 1, 5, -4, -6, -6, -4, + 5, 0, 0, -12, -1, 2, -3, -1, + -4, 0, -4, -6, -2, -2, -1, 0, + 0, -4, -3, -2, 0, 5, 4, -2, + -9, 0, -9, -2, 0, -6, -9, 0, + -5, -3, -5, -4, 4, 0, 0, -2, + 0, -3, -1, 0, -2, -3, 0, 3, + -5, 2, 0, 0, -8, 0, -2, -4, + -3, -1, -5, -4, -5, -4, 0, -5, + -2, -4, -3, -5, -2, 0, 0, 0, + 8, -3, 0, -5, -2, 0, -2, -3, + -4, -4, -4, -6, -2, -3, 3, 0, + -2, 0, -8, -2, 1, 3, -5, -6, + -3, -5, 5, -2, 1, -15, -3, 3, + -4, -3, -6, 0, -5, -7, -2, -2, + -1, -2, -3, -5, 0, 0, 0, 5, + 4, -1, -10, 0, -10, -4, 4, -6, + -11, -3, -6, -7, -8, -5, 3, 0, + 0, 0, 0, -2, 0, 0, 2, -2, + 3, 1, -3, 3, 0, 0, -5, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 1, 5, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, + -1, 0, 6, 0, 3, 0, 0, -2, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -10, 0, -2, 3, 0, 5, + 0, 0, 16, 2, -3, -3, 2, 2, + -1, 0, -8, 0, 0, 8, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -11, 6, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -4, 0, + 0, 0, 0, 0, 2, 21, -3, -1, + 5, 4, -4, 2, 0, 0, 2, 2, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -4, 0, 0, 0, 0, + -4, -1, 0, 0, 0, -4, 0, -2, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -3, 0, -2, 0, + -4, 0, 0, 0, -3, 2, -2, 0, + 0, -4, -2, -4, 0, 0, -4, 0, + -2, 0, -8, 0, -2, 0, 0, -13, + -3, -6, -2, -6, 0, 0, -11, 0, + -4, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -3, -1, -3, 0, 0, + 0, 0, -4, 0, -4, 2, -2, 3, + 0, -1, -4, -1, -3, -3, 0, -2, + -1, -1, 1, -4, 0, 0, 0, 0, + -14, -1, -2, 0, -4, 0, -1, -8, + -1, 0, 0, -1, -1, 0, 0, 0, + 0, 1, 0, -1, -3, -1, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -4, 0, -1, 0, 0, 0, -3, + 2, 0, 0, 0, -4, -2, -3, 0, + 0, -4, 0, -2, 0, -8, 0, 0, + 0, 0, -16, 0, -3, -6, -8, 0, + 0, -11, 0, -1, -2, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -2, -1, + -2, 0, 0, 0, 3, -2, 0, 5, + 8, -2, -2, -5, 2, 8, 3, 4, + -4, 2, 7, 2, 5, 4, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 8, -3, -2, 0, -1, + 13, 7, 13, 0, 0, 0, 2, 0, + 0, 6, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, -13, -2, -1, -7, + -8, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, -13, -2, -1, + -7, -8, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, -4, 2, 0, -2, + 1, 3, 2, -5, 0, 0, -1, 2, + 0, 1, 0, 0, 0, 0, -4, 0, + -1, -1, -3, 0, -1, -6, 0, 10, + -2, 0, -4, -1, 0, -1, -3, 0, + -2, -4, -3, -2, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, -13, + -2, -1, -7, -8, 0, 0, -11, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, -5, -2, -1, 5, -1, -2, + -6, 0, -1, 0, -1, -4, 0, 4, + 0, 1, 0, 1, -4, -6, -2, 0, + -6, -3, -4, -7, -6, 0, -3, -3, + -2, -2, -1, -1, -2, -1, 0, -1, + 0, 2, 0, 2, -1, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -2, -2, 0, 0, + -4, 0, -1, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, 0, 0, 0, -1, 0, 0, -3, + -2, 2, 0, -3, -3, -1, 0, -5, + -1, -4, -1, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 5, 0, 0, -3, 0, + 0, 0, 0, -2, 0, -2, 0, 0, + -1, 0, 0, -1, 0, -4, 0, 0, + 7, -2, -5, -5, 1, 2, 2, 0, + -4, 1, 2, 1, 5, 1, 5, -1, + -4, 0, 0, -6, 0, 0, -5, -4, + 0, 0, -3, 0, -2, -3, 0, -2, + 0, -2, 0, -1, 2, 0, -1, -5, + -2, 6, 0, 0, -1, 0, -3, 0, + 0, 2, -4, 0, 2, -2, 1, 0, + 0, -5, 0, -1, 0, 0, -2, 2, + -1, 0, 0, 0, -7, -2, -4, 0, + -5, 0, 0, -8, 0, 6, -2, 0, + -3, 0, 1, 0, -2, 0, -2, -5, + 0, -2, 2, 0, 0, 0, 0, -1, + 0, 0, 2, -2, 0, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 4, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 3, 0, 4, + 0, 0, 0, 0, 0, -10, -9, 0, + 7, 5, 3, -6, 1, 7, 0, 6, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_10 = { +#else +lv_font_t lv_font_montserrat_10 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 11, /*The maximum line height required by the font*/ + .base_line = 2, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_10*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_12.c b/inc/lvgl/src/font/lv_font_montserrat_12.c new file mode 100644 index 0000000..6e5c1ea --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_12.c @@ -0,0 +1,1915 @@ +/******************************************************************************* + * Size: 12 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 12 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_12.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_12 + #define LV_FONT_MONTSERRAT_12 1 +#endif + +#if LV_FONT_MONTSERRAT_12 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0x40, 0xf3, 0xf, 0x30, 0xf2, 0xe, 0x20, + 0xd1, 0x3, 0x0, 0x81, 0x1e, 0x30, + + /* U+0022 "\"" */ + 0x3c, 0x1e, 0x3b, 0xe, 0x3b, 0xe, 0x15, 0x7, + + /* U+0023 "#" */ + 0x0, 0x48, 0x3, 0xa0, 0x0, 0x6, 0x60, 0x58, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x10, 0xa, 0x20, + 0x84, 0x0, 0x0, 0xc1, 0xa, 0x30, 0x0, 0xd, + 0x0, 0xb1, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, + 0x1c, 0x0, 0xd0, 0x0, 0x3, 0xa0, 0x1c, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x92, 0x0, 0x3, + 0xcf, 0xfb, 0x31, 0xf7, 0xa5, 0x74, 0x4e, 0x9, + 0x20, 0x1, 0xf9, 0xb2, 0x0, 0x2, 0xbf, 0xe8, + 0x0, 0x0, 0x97, 0xda, 0x0, 0x9, 0x24, 0xe5, + 0xb4, 0xa5, 0xba, 0x8, 0xef, 0xfa, 0x10, 0x0, + 0x92, 0x0, 0x0, 0x4, 0x10, 0x0, + + /* U+0025 "%" */ + 0xa, 0xc8, 0x0, 0xc, 0x10, 0x66, 0xa, 0x20, + 0x76, 0x0, 0x83, 0x7, 0x42, 0xc0, 0x0, 0x57, + 0xa, 0x2b, 0x20, 0x0, 0x9, 0xc6, 0x68, 0x5c, + 0x90, 0x0, 0x1, 0xc1, 0xc0, 0x67, 0x0, 0xa, + 0x43, 0x90, 0x2a, 0x0, 0x49, 0x1, 0xb0, 0x47, + 0x0, 0xc1, 0x0, 0x7b, 0xb1, + + /* U+0026 "&" */ + 0x0, 0x9e, 0xd4, 0x0, 0x0, 0x5c, 0x3, 0xd0, + 0x0, 0x4, 0xc0, 0x5c, 0x0, 0x0, 0xc, 0xbd, + 0x20, 0x0, 0x3, 0xde, 0x80, 0x10, 0x1, 0xe3, + 0x1d, 0x78, 0x80, 0x6b, 0x0, 0x1d, 0xf2, 0x4, + 0xf4, 0x13, 0xcf, 0x60, 0x6, 0xdf, 0xd6, 0x2b, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3c, 0x3b, 0x3b, 0x15, + + /* U+0028 "(" */ + 0xa, 0x71, 0xf1, 0x5c, 0x9, 0x80, 0xb6, 0xc, + 0x40, 0xd4, 0xc, 0x40, 0xb6, 0x9, 0x80, 0x5b, + 0x1, 0xf1, 0xa, 0x70, + + /* U+0029 ")" */ + 0x6b, 0x0, 0xf2, 0xb, 0x60, 0x7a, 0x5, 0xc0, + 0x4d, 0x3, 0xe0, 0x4d, 0x5, 0xc0, 0x7a, 0xb, + 0x60, 0xf1, 0x6b, 0x0, + + /* U+002A "*" */ + 0x0, 0xb0, 0x8, 0x9c, 0xb5, 0xb, 0xf8, 0x8, + 0x7c, 0x95, 0x0, 0xa0, 0x0, + + /* U+002B "+" */ + 0x0, 0xb, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0xf, 0x0, 0x2, 0xee, 0xfe, 0xe2, 0x1, 0x1f, + 0x11, 0x0, 0x0, 0xf0, 0x0, + + /* U+002C "," */ + 0x18, 0x4, 0xf1, 0xd, 0x3, 0x80, + + /* U+002D "-" */ + 0x4f, 0xfd, 0x2, 0x22, + + /* U+002E "." */ + 0x2a, 0x4, 0xd0, + + /* U+002F "/" */ + 0x0, 0x0, 0x34, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0xf0, 0x0, 0x5, 0xb0, 0x0, 0xa, 0x60, 0x0, + 0xe, 0x10, 0x0, 0x4c, 0x0, 0x0, 0x97, 0x0, + 0x0, 0xe2, 0x0, 0x3, 0xd0, 0x0, 0x8, 0x70, + 0x0, 0xd, 0x20, 0x0, 0x2d, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x9e, 0xe9, 0x0, 0xa, 0xd4, 0x4d, 0xa0, + 0x1f, 0x20, 0x2, 0xf1, 0x5e, 0x0, 0x0, 0xd5, + 0x6c, 0x0, 0x0, 0xc6, 0x5e, 0x0, 0x0, 0xd5, + 0x1f, 0x20, 0x2, 0xf1, 0xa, 0xd4, 0x4d, 0xa0, + 0x0, 0x9e, 0xe9, 0x0, + + /* U+0031 "1" */ + 0xef, 0xf3, 0x22, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, + + /* U+0032 "2" */ + 0x19, 0xef, 0xc2, 0x8, 0xb4, 0x3a, 0xe0, 0x0, + 0x0, 0x2f, 0x10, 0x0, 0x5, 0xe0, 0x0, 0x2, + 0xe5, 0x0, 0x1, 0xd7, 0x0, 0x1, 0xd8, 0x0, + 0x1, 0xda, 0x22, 0x21, 0x8f, 0xff, 0xff, 0x70, + + /* U+0033 "3" */ + 0x9f, 0xff, 0xff, 0x1, 0x22, 0x2d, 0x80, 0x0, + 0x9, 0xb0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7c, + 0xf8, 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xe, + 0x4b, 0x94, 0x39, 0xf1, 0x3b, 0xff, 0xc3, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x9b, 0x0, 0x0, 0x4, 0xe1, 0x0, + 0x0, 0x1e, 0x50, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x5, 0xe1, 0xd, 0x40, 0x1e, 0x40, 0xd, 0x40, + 0x8f, 0xff, 0xff, 0xfd, 0x12, 0x22, 0x2e, 0x62, + 0x0, 0x0, 0xe, 0x40, + + /* U+0035 "5" */ + 0xc, 0xff, 0xff, 0x0, 0xe5, 0x22, 0x20, 0xf, + 0x10, 0x0, 0x1, 0xff, 0xeb, 0x30, 0x2, 0x23, + 0x9f, 0x10, 0x0, 0x0, 0xd6, 0x0, 0x0, 0xd, + 0x69, 0xb4, 0x38, 0xf1, 0x2a, 0xef, 0xc4, 0x0, + + /* U+0036 "6" */ + 0x0, 0x6d, 0xfd, 0x50, 0x8, 0xd5, 0x23, 0x20, + 0x1f, 0x20, 0x0, 0x0, 0x4d, 0x6d, 0xea, 0x10, + 0x6f, 0xc4, 0x3c, 0xa0, 0x5f, 0x30, 0x2, 0xf0, + 0x2f, 0x20, 0x2, 0xf0, 0xa, 0xc3, 0x2b, 0xa0, + 0x1, 0xaf, 0xfa, 0x10, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xba, 0x92, 0x22, 0xd7, 0x76, + 0x0, 0x3f, 0x10, 0x0, 0xa, 0x90, 0x0, 0x1, + 0xf2, 0x0, 0x0, 0x7c, 0x0, 0x0, 0xe, 0x50, + 0x0, 0x5, 0xe0, 0x0, 0x0, 0xc8, 0x0, 0x0, + + /* U+0038 "8" */ + 0x3, 0xcf, 0xea, 0x10, 0xe, 0x81, 0x2c, 0xa0, + 0x2f, 0x10, 0x5, 0xd0, 0xe, 0x70, 0x1b, 0x90, + 0x6, 0xff, 0xff, 0x20, 0x3f, 0x50, 0x18, 0xe0, + 0x6c, 0x0, 0x0, 0xf2, 0x3f, 0x61, 0x29, 0xe0, + 0x5, 0xcf, 0xfb, 0x20, + + /* U+0039 "9" */ + 0x7, 0xef, 0xc3, 0x6, 0xe3, 0x15, 0xe1, 0x98, + 0x0, 0xb, 0x87, 0xd2, 0x3, 0xfb, 0xa, 0xff, + 0xd9, 0xc0, 0x0, 0x10, 0x8b, 0x0, 0x0, 0xd, + 0x70, 0x62, 0x4b, 0xd0, 0x1c, 0xfe, 0xa1, 0x0, + + /* U+003A ":" */ + 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xa0, 0x4d, 0x0, + + /* U+003B ";" */ + 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x80, 0x4f, 0x10, 0xd0, 0x38, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x2, 0x10, 0x0, 0x4b, 0xe1, 0x7, + 0xdc, 0x50, 0x3, 0xf8, 0x0, 0x0, 0x4, 0xbe, + 0x71, 0x0, 0x0, 0x29, 0xe2, 0x0, 0x0, 0x0, + 0x0, + + /* U+003D "=" */ + 0x3f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xee, 0xee, 0xe2, 0x1, 0x11, + 0x11, 0x0, + + /* U+003E ">" */ + 0x12, 0x0, 0x0, 0x2, 0xeb, 0x40, 0x0, 0x0, + 0x5c, 0xd6, 0x0, 0x0, 0x8, 0xf2, 0x1, 0x7e, + 0xb4, 0x2, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x1a, 0xef, 0xc3, 0x9, 0xa3, 0x2a, 0xe0, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x9, + 0xc0, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x2, 0x80, 0x0, 0x0, 0x4d, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x4, 0xbd, 0xdd, 0x81, 0x0, 0x0, 0x9b, + 0x30, 0x0, 0x6d, 0x30, 0x7, 0xa0, 0x8e, 0xe8, + 0xd5, 0xd1, 0xd, 0x7, 0xd2, 0x19, 0xf3, 0x77, + 0x4a, 0xd, 0x40, 0x0, 0xf3, 0x1b, 0x58, 0xf, + 0x20, 0x0, 0xd3, 0xc, 0x58, 0xd, 0x40, 0x0, + 0xf3, 0x1b, 0x3a, 0x7, 0xd2, 0x1a, 0xf5, 0x77, + 0xd, 0x0, 0x8e, 0xe8, 0x5f, 0xb0, 0x6, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9b, 0x30, 0x2, + 0x40, 0x0, 0x0, 0x5, 0xbd, 0xed, 0x60, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, 0xdd, + 0x90, 0x0, 0x0, 0x4, 0xe3, 0xf1, 0x0, 0x0, + 0xb, 0x80, 0xc7, 0x0, 0x0, 0x1f, 0x20, 0x6e, + 0x0, 0x0, 0x8c, 0x0, 0x1f, 0x50, 0x0, 0xef, + 0xee, 0xef, 0xb0, 0x6, 0xe2, 0x11, 0x14, 0xf2, + 0xc, 0x70, 0x0, 0x0, 0xb9, + + /* U+0042 "B" */ + 0xbf, 0xff, 0xfb, 0x20, 0xb7, 0x11, 0x2a, 0xd0, + 0xb7, 0x0, 0x3, 0xf0, 0xb7, 0x0, 0x8, 0xc0, + 0xbf, 0xff, 0xff, 0x50, 0xb8, 0x22, 0x26, 0xf2, + 0xb7, 0x0, 0x0, 0xc7, 0xb7, 0x11, 0x15, 0xf4, + 0xbf, 0xff, 0xfd, 0x60, + + /* U+0043 "C" */ + 0x0, 0x3b, 0xef, 0xb3, 0x0, 0x5f, 0x93, 0x38, + 0xe0, 0xe, 0x60, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x4, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0x0, + 0x5f, 0x93, 0x38, 0xe0, 0x0, 0x3b, 0xff, 0xb3, + 0x0, + + /* U+0044 "D" */ + 0xbf, 0xff, 0xea, 0x30, 0xb, 0x82, 0x23, 0x9f, + 0x40, 0xb7, 0x0, 0x0, 0x7e, 0xb, 0x70, 0x0, + 0x0, 0xf3, 0xb7, 0x0, 0x0, 0xe, 0x5b, 0x70, + 0x0, 0x0, 0xf3, 0xb7, 0x0, 0x0, 0x7e, 0xb, + 0x82, 0x23, 0x9f, 0x40, 0xbf, 0xff, 0xeb, 0x30, + 0x0, + + /* U+0045 "E" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x50, + + /* U+0046 "F" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x5f, 0x94, 0x38, + 0xe1, 0xe, 0x70, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x8, 0x24, 0xe0, + 0x0, 0x0, 0xe3, 0xe, 0x60, 0x0, 0xe, 0x30, + 0x5f, 0x93, 0x37, 0xf3, 0x0, 0x3b, 0xef, 0xc4, + 0x0, + + /* U+0048 "H" */ + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xbf, 0xff, 0xff, 0xf7, 0xb8, 0x22, 0x22, 0xc7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, + + /* U+0049 "I" */ + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, + + /* U+004A "J" */ + 0x4, 0xff, 0xff, 0x0, 0x22, 0x5f, 0x0, 0x0, + 0x3f, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x3f, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0x4e, 0xd, 0x52, 0xba, + 0x5, 0xdf, 0xb2, + + /* U+004B "K" */ + 0xb7, 0x0, 0x7, 0xd1, 0xb7, 0x0, 0x5e, 0x20, + 0xb7, 0x4, 0xe3, 0x0, 0xb7, 0x3e, 0x40, 0x0, + 0xb9, 0xef, 0x20, 0x0, 0xbf, 0x89, 0xd0, 0x0, + 0xba, 0x0, 0xca, 0x0, 0xb7, 0x0, 0x1e, 0x70, + 0xb7, 0x0, 0x3, 0xf3, + + /* U+004C "L" */ + 0xb7, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0xb8, 0x0, 0x0, 0x1, 0xf3, 0xbf, 0x10, 0x0, + 0x9, 0xf3, 0xbe, 0xa0, 0x0, 0x2e, 0xf3, 0xb7, + 0xe3, 0x0, 0xb7, 0xf3, 0xb6, 0x7b, 0x4, 0xd0, + 0xf3, 0xb6, 0xd, 0x4c, 0x50, 0xf3, 0xb6, 0x5, + 0xfc, 0x0, 0xf3, 0xb6, 0x0, 0xb3, 0x0, 0xf3, + 0xb6, 0x0, 0x0, 0x0, 0xf3, + + /* U+004E "N" */ + 0xb9, 0x0, 0x0, 0xb7, 0xbf, 0x50, 0x0, 0xb7, + 0xbc, 0xf2, 0x0, 0xb7, 0xb7, 0xad, 0x0, 0xb7, + 0xb7, 0xd, 0x90, 0xb7, 0xb7, 0x2, 0xf5, 0xb7, + 0xb7, 0x0, 0x6f, 0xd7, 0xb7, 0x0, 0xa, 0xf7, + 0xb7, 0x0, 0x0, 0xd7, + + /* U+004F "O" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x5, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd5, 0xe, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf9, 0x33, 0x8f, 0x60, + 0x0, 0x3b, 0xef, 0xb4, 0x0, + + /* U+0050 "P" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x2c, 0xa0, 0xbf, 0xff, 0xfa, 0x10, + 0xb8, 0x22, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x4, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd6, 0xf, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf8, 0x32, 0x7f, 0x60, + 0x0, 0x4c, 0xff, 0xc5, 0x0, 0x0, 0x0, 0xc, + 0xb0, 0x28, 0x0, 0x0, 0x1, 0xbf, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0052 "R" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x1b, 0xb0, 0xbf, 0xff, 0xfb, 0x10, + 0xb8, 0x22, 0xb9, 0x0, 0xb7, 0x0, 0x1f, 0x30, + 0xb7, 0x0, 0x7, 0xd0, + + /* U+0053 "S" */ + 0x3, 0xcf, 0xeb, 0x31, 0xf7, 0x23, 0x74, 0x4e, + 0x0, 0x0, 0x1, 0xf9, 0x20, 0x0, 0x2, 0xbf, + 0xd7, 0x0, 0x0, 0x4, 0xca, 0x0, 0x0, 0x4, + 0xe5, 0xb4, 0x23, 0xbb, 0x8, 0xdf, 0xea, 0x10, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xf2, 0x23, 0xf3, 0x22, 0x0, + 0x1f, 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, + 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, 0x0, + + /* U+0055 "U" */ + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xc7, 0x0, 0x0, 0xf3, + 0x9a, 0x0, 0x2, 0xf1, 0x2f, 0x83, 0x5d, 0xa0, + 0x4, 0xcf, 0xd8, 0x0, + + /* U+0056 "V" */ + 0xc, 0x70, 0x0, 0x0, 0xd5, 0x6, 0xe0, 0x0, + 0x4, 0xe0, 0x0, 0xf4, 0x0, 0xa, 0x80, 0x0, + 0x9b, 0x0, 0x1f, 0x20, 0x0, 0x2f, 0x20, 0x7b, + 0x0, 0x0, 0xc, 0x80, 0xe4, 0x0, 0x0, 0x5, + 0xe5, 0xe0, 0x0, 0x0, 0x0, 0xee, 0x70, 0x0, + 0x0, 0x0, 0x8f, 0x10, 0x0, + + /* U+0057 "W" */ + 0x7c, 0x0, 0x0, 0xe8, 0x0, 0x2, 0xf0, 0x2f, + 0x10, 0x3, 0xfd, 0x0, 0x7, 0xa0, 0xd, 0x60, + 0x8, 0x9f, 0x20, 0xc, 0x50, 0x8, 0xb0, 0xe, + 0x3b, 0x70, 0x1f, 0x0, 0x3, 0xf0, 0x3e, 0x6, + 0xc0, 0x6b, 0x0, 0x0, 0xe5, 0x89, 0x1, 0xf1, + 0xb6, 0x0, 0x0, 0x9a, 0xd4, 0x0, 0xb7, 0xf1, + 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x6f, 0xc0, 0x0, + 0x0, 0xf, 0xa0, 0x0, 0x1f, 0x70, 0x0, + + /* U+0058 "X" */ + 0x5f, 0x10, 0x0, 0xe5, 0xa, 0xb0, 0x9, 0xa0, + 0x1, 0xe6, 0x4e, 0x10, 0x0, 0x4f, 0xe4, 0x0, + 0x0, 0xd, 0xe0, 0x0, 0x0, 0x7d, 0xd8, 0x0, + 0x2, 0xf3, 0x2f, 0x30, 0xc, 0x80, 0x7, 0xd0, + 0x8d, 0x0, 0x0, 0xc9, + + /* U+0059 "Y" */ + 0xc, 0x80, 0x0, 0xa, 0x80, 0x3f, 0x10, 0x3, + 0xe0, 0x0, 0xaa, 0x0, 0xc6, 0x0, 0x1, 0xf3, + 0x5d, 0x0, 0x0, 0x7, 0xce, 0x40, 0x0, 0x0, + 0xe, 0xb0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0xb7, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x6f, 0xff, 0xff, 0xf5, 0x2, 0x22, 0x29, 0xd0, + 0x0, 0x0, 0x3f, 0x30, 0x0, 0x1, 0xe6, 0x0, + 0x0, 0xb, 0xa0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x4, 0xf2, 0x0, 0x0, 0x1e, 0x82, 0x22, 0x21, + 0x7f, 0xff, 0xff, 0xf8, + + /* U+005B "[" */ + 0xbf, 0xcb, 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, + 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, 0x60, 0xb6, + 0xb, 0x60, 0xbf, 0xc0, + + /* U+005C "\\" */ + 0x35, 0x0, 0x0, 0x2e, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x8, 0x80, 0x0, 0x3, 0xd0, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0x87, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x9, 0x70, 0x0, 0x4, + 0xc0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xa6, + + /* U+005D "]" */ + 0xcf, 0xb0, 0x7b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, + 0x6b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, 0x6b, 0x6, + 0xb0, 0x7b, 0xcf, 0xb0, + + /* U+005E "^" */ + 0x0, 0x7, 0x0, 0x0, 0x5, 0xe5, 0x0, 0x0, + 0xb4, 0xb0, 0x0, 0x2c, 0xc, 0x20, 0x8, 0x60, + 0x68, 0x0, 0xd0, 0x0, 0xd0, + + /* U+005F "_" */ + 0xdd, 0xdd, 0xdd, + + /* U+0060 "`" */ + 0x27, 0x10, 0x5, 0xc1, + + /* U+0061 "a" */ + 0x8, 0xdf, 0xc3, 0x0, 0xa4, 0x29, 0xd0, 0x0, + 0x0, 0x1f, 0x10, 0x8d, 0xee, 0xf2, 0x4e, 0x10, + 0xf, 0x24, 0xe0, 0x7, 0xf2, 0x9, 0xed, 0x8f, + 0x20, + + /* U+0062 "b" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7c, 0xfc, 0x40, 0xef, 0x52, + 0x8f, 0x2e, 0x60, 0x0, 0xb8, 0xe4, 0x0, 0x8, + 0xae, 0x60, 0x0, 0xb8, 0xef, 0x52, 0x8f, 0x2e, + 0x6d, 0xfc, 0x40, + + /* U+0063 "c" */ + 0x2, 0xbf, 0xe8, 0x0, 0xda, 0x24, 0xc3, 0x5d, + 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x5d, 0x0, + 0x0, 0x0, 0xda, 0x24, 0xd3, 0x2, 0xbf, 0xe8, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x2, 0xbf, 0xd6, 0xf1, + 0xe, 0x92, 0x3d, 0xf1, 0x5d, 0x0, 0x4, 0xf1, + 0x7b, 0x0, 0x1, 0xf1, 0x5d, 0x0, 0x3, 0xf1, + 0xe, 0x91, 0x2d, 0xf1, 0x2, 0xbf, 0xe6, 0xf1, + + /* U+0065 "e" */ + 0x2, 0xbf, 0xd5, 0x0, 0xe8, 0x14, 0xe4, 0x5c, + 0x0, 0x6, 0xb7, 0xfe, 0xee, 0xec, 0x5d, 0x0, + 0x0, 0x0, 0xe9, 0x23, 0xa2, 0x2, 0xbf, 0xe9, + 0x0, + + /* U+0066 "f" */ + 0x1, 0xcf, 0x60, 0x9a, 0x11, 0xb, 0x60, 0xd, + 0xff, 0xf3, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, + 0x0, + + /* U+0067 "g" */ + 0x2, 0xbf, 0xe6, 0xe2, 0xe, 0xa2, 0x3c, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0x7b, 0x0, 0x0, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0xe, 0xa2, 0x3d, 0xf2, + 0x2, 0xbf, 0xe5, 0xf2, 0x0, 0x0, 0x2, 0xf0, + 0xc, 0x62, 0x3b, 0xa0, 0x6, 0xdf, 0xea, 0x10, + + /* U+0068 "h" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7d, 0xfc, 0x20, 0xee, 0x42, + 0xac, 0xe, 0x60, 0x2, 0xf0, 0xe4, 0x0, 0xf, + 0x1e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, 0x2e, + 0x40, 0x0, 0xf2, + + /* U+0069 "i" */ + 0xd, 0x40, 0x82, 0x0, 0x0, 0xe4, 0xe, 0x40, + 0xe4, 0xe, 0x40, 0xe4, 0xe, 0x40, 0xe4, + + /* U+006A "j" */ + 0x0, 0xd, 0x50, 0x0, 0x72, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, 0xd4, 0x0, + 0xd, 0x40, 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, + 0xd4, 0x0, 0xd, 0x40, 0x22, 0xf2, 0xd, 0xf8, + 0x0, + + /* U+006B "k" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x40, 0xb, 0xa0, 0xe4, 0xb, + 0xb0, 0xe, 0x4b, 0xc0, 0x0, 0xee, 0xfd, 0x0, + 0xe, 0xc1, 0xd9, 0x0, 0xe4, 0x2, 0xf4, 0xe, + 0x40, 0x6, 0xe1, + + /* U+006C "l" */ + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, + + /* U+006D "m" */ + 0xe7, 0xdf, 0xb2, 0x9e, 0xe8, 0xe, 0xd3, 0x2c, + 0xfb, 0x23, 0xe5, 0xe6, 0x0, 0x4f, 0x10, 0x9, + 0x9e, 0x40, 0x3, 0xf0, 0x0, 0x8a, 0xe4, 0x0, + 0x3f, 0x0, 0x8, 0xae, 0x40, 0x3, 0xf0, 0x0, + 0x8a, 0xe4, 0x0, 0x3f, 0x0, 0x8, 0xa0, + + /* U+006E "n" */ + 0xe6, 0xdf, 0xc2, 0xe, 0xe4, 0x1a, 0xc0, 0xe6, + 0x0, 0x1f, 0xe, 0x40, 0x0, 0xf1, 0xe4, 0x0, + 0xf, 0x2e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, + 0x20, + + /* U+006F "o" */ + 0x2, 0xbf, 0xe8, 0x0, 0xe, 0xa2, 0x3e, 0x80, + 0x5d, 0x0, 0x4, 0xf0, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf0, 0xd, 0xa2, 0x3e, 0x80, + 0x2, 0xbf, 0xe8, 0x0, + + /* U+0070 "p" */ + 0xe7, 0xdf, 0xc4, 0xe, 0xf4, 0x16, 0xf2, 0xe6, + 0x0, 0xa, 0x8e, 0x40, 0x0, 0x8a, 0xe7, 0x0, + 0xb, 0x8e, 0xf5, 0x28, 0xf2, 0xe6, 0xcf, 0xc4, + 0xe, 0x40, 0x0, 0x0, 0xe4, 0x0, 0x0, 0xe, + 0x40, 0x0, 0x0, + + /* U+0071 "q" */ + 0x2, 0xbf, 0xd5, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x2, 0xbf, 0xd5, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + + /* U+0072 "r" */ + 0xe6, 0xd8, 0xee, 0x61, 0xe7, 0x0, 0xe4, 0x0, + 0xe4, 0x0, 0xe4, 0x0, 0xe4, 0x0, + + /* U+0073 "s" */ + 0x9, 0xef, 0xc2, 0x6d, 0x22, 0x61, 0x7d, 0x20, + 0x0, 0x9, 0xfe, 0x91, 0x0, 0x2, 0xc9, 0x56, + 0x22, 0xb8, 0x4c, 0xfe, 0xa0, + + /* U+0074 "t" */ + 0x5, 0x30, 0x0, 0xb6, 0x0, 0xdf, 0xff, 0x30, + 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xaa, 0x11, 0x2, 0xdf, 0x60, + + /* U+0075 "u" */ + 0xf3, 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xf3, + 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xe4, 0x0, + 0x4f, 0xa, 0xb2, 0x2c, 0xf0, 0x1b, 0xfe, 0x6f, + 0x0, + + /* U+0076 "v" */ + 0xd, 0x50, 0x0, 0x98, 0x6, 0xc0, 0x0, 0xf2, + 0x1, 0xf2, 0x6, 0xb0, 0x0, 0xa8, 0xc, 0x50, + 0x0, 0x3e, 0x3e, 0x0, 0x0, 0xd, 0xd8, 0x0, + 0x0, 0x6, 0xf2, 0x0, + + /* U+0077 "w" */ + 0xc5, 0x0, 0x3f, 0x10, 0x7, 0x86, 0xa0, 0x9, + 0xf6, 0x0, 0xd3, 0x1f, 0x0, 0xe7, 0xb0, 0x2d, + 0x0, 0xb5, 0x4c, 0xe, 0x18, 0x80, 0x6, 0xa9, + 0x60, 0xa6, 0xd3, 0x0, 0x1f, 0xe1, 0x4, 0xed, + 0x0, 0x0, 0xbb, 0x0, 0xe, 0x80, 0x0, + + /* U+0078 "x" */ + 0x5d, 0x0, 0x4e, 0x10, 0xa9, 0x1e, 0x40, 0x1, + 0xed, 0x90, 0x0, 0x8, 0xf1, 0x0, 0x2, 0xeb, + 0xa0, 0x0, 0xc7, 0xd, 0x60, 0x7c, 0x0, 0x3f, + 0x20, + + /* U+0079 "y" */ + 0xd, 0x50, 0x0, 0x98, 0x7, 0xb0, 0x0, 0xe2, + 0x1, 0xf2, 0x5, 0xc0, 0x0, 0xa7, 0xb, 0x50, + 0x0, 0x4d, 0x1e, 0x0, 0x0, 0xe, 0xb9, 0x0, + 0x0, 0x8, 0xf3, 0x0, 0x0, 0x5, 0xd0, 0x0, + 0x5, 0x2c, 0x60, 0x0, 0x1c, 0xf9, 0x0, 0x0, + + /* U+007A "z" */ + 0x7f, 0xff, 0xfb, 0x0, 0x2, 0xf3, 0x0, 0xc, + 0x70, 0x0, 0x9b, 0x0, 0x4, 0xe1, 0x0, 0x1e, + 0x50, 0x0, 0x8f, 0xff, 0xfd, + + /* U+007B "{" */ + 0x0, 0xbf, 0x4, 0xe1, 0x5, 0xc0, 0x5, 0xc0, + 0x5, 0xc0, 0x6, 0xc0, 0x4f, 0x60, 0x8, 0xc0, + 0x5, 0xc0, 0x5, 0xc0, 0x5, 0xc0, 0x4, 0xe1, + 0x0, 0xbf, + + /* U+007C "|" */ + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + + /* U+007D "}" */ + 0xcd, 0x10, 0xc, 0x70, 0x9, 0x90, 0x9, 0x90, + 0x9, 0x90, 0x8, 0xa0, 0x3, 0xf7, 0x8, 0xb0, + 0x9, 0x90, 0x9, 0x90, 0x9, 0x90, 0xc, 0x80, + 0xcd, 0x20, + + /* U+007E "~" */ + 0xb, 0xe8, 0xa, 0x33, 0x91, 0x8d, 0xa0, + + /* U+00B0 "°" */ + 0x6, 0xb7, 0x3, 0x80, 0x84, 0x64, 0x3, 0x73, + 0x80, 0x84, 0x6, 0xb7, 0x0, + + /* U+2022 "•" */ + 0x4, 0x22, 0xfe, 0xd, 0xa0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, + 0x0, 0x3, 0x7c, 0xff, 0x0, 0x0, 0x59, 0xef, + 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xfd, 0x84, 0x8f, 0x0, 0xf, + 0xd7, 0x20, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, 0x0, 0x8f, + 0x0, 0xf, 0x80, 0x0, 0x7b, 0xdf, 0x2, 0x3f, + 0x80, 0x6, 0xff, 0xff, 0xaf, 0xff, 0x80, 0x2, + 0xef, 0xf9, 0xef, 0xff, 0x60, 0x0, 0x2, 0x10, + 0x29, 0xa7, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, 0xe8, 0xe7, + 0x22, 0x22, 0x7e, 0x8e, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xfc, 0xf6, 0x11, 0x11, 0x7f, 0xcf, + 0xc0, 0xcf, 0xff, 0xff, 0xfb, 0xc, 0xfc, 0xf6, + 0x11, 0x11, 0x7f, 0xcf, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xe8, 0xe7, 0x22, 0x22, 0x7e, 0x8e, + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, + + /* U+F00B "" */ + 0xdf, 0xf6, 0x9f, 0xff, 0xff, 0xfd, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xef, 0xf6, 0xaf, 0xff, + 0xff, 0xfe, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, + 0xff, 0xff, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xef, 0xf6, 0xaf, 0xff, 0xff, 0xfe, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xdf, 0xf6, 0xaf, 0xff, + 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x4d, 0x30, 0x0, 0x3f, 0xff, 0x40, + 0xef, 0xf3, 0x3, 0xff, 0xf4, 0x0, 0x4f, 0xff, + 0x6f, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x3, 0xd3, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x14, 0x0, 0x0, 0x22, 0xd, 0xf7, 0x0, 0x4f, + 0xf1, 0x9f, 0xf7, 0x4f, 0xfd, 0x0, 0xaf, 0xff, + 0xfd, 0x10, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x4f, + 0xff, 0xf7, 0x0, 0x4f, 0xfd, 0xaf, 0xf7, 0xe, + 0xfd, 0x10, 0xaf, 0xf2, 0x5b, 0x10, 0x0, 0x99, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x32, + 0xf, 0xf0, 0x24, 0x0, 0x5, 0xfc, 0xf, 0xf0, + 0xcf, 0x50, 0x1f, 0xf4, 0xf, 0xf0, 0x5f, 0xf1, + 0x7f, 0x80, 0xf, 0xf0, 0x8, 0xf7, 0xbf, 0x20, + 0xf, 0xf0, 0x2, 0xfb, 0xcf, 0x10, 0xe, 0xe0, + 0x1, 0xfc, 0xaf, 0x40, 0x1, 0x10, 0x4, 0xfa, + 0x5f, 0xb0, 0x0, 0x0, 0xb, 0xf6, 0xd, 0xfa, + 0x10, 0x1, 0xaf, 0xd0, 0x2, 0xdf, 0xfc, 0xcf, + 0xfd, 0x20, 0x0, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x14, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x3, 0x43, 0xdf, 0xfd, + 0x34, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0x1b, 0xff, + 0x70, 0x7, 0xff, 0xb1, 0x7, 0xff, 0x20, 0x2, + 0xff, 0x70, 0x1b, 0xff, 0x70, 0x7, 0xff, 0xb1, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x3, 0x42, 0xcf, 0xfc, + 0x23, 0x30, 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x41, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x73, 0x3, 0x83, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x67, 0xf7, 0x0, 0x0, 0x3, + 0xee, 0x5a, 0xfe, 0xf7, 0x0, 0x0, 0x6f, 0xd3, + 0xb5, 0x7f, 0xf7, 0x0, 0x9, 0xfb, 0x3d, 0xff, + 0x85, 0xfe, 0x30, 0xbf, 0x95, 0xff, 0xff, 0xfb, + 0x3e, 0xf4, 0x76, 0x6f, 0xff, 0xff, 0xff, 0xd2, + 0xa1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, + 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xf8, 0x1, 0xff, 0xf3, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x27, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x23, 0x33, 0x5f, 0xf5, 0x33, 0x32, 0xff, 0xff, + 0xa4, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + + /* U+F01C "" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xed, 0x88, 0x88, 0x89, 0xf8, 0x0, 0xa, 0xf2, + 0x0, 0x0, 0x0, 0xaf, 0x30, 0x5f, 0x70, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0xef, 0x88, 0x60, 0x0, + 0x28, 0x8b, 0xf6, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+F021 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x59, 0x0, 0x19, + 0xef, 0xfd, 0x70, 0x9f, 0x3, 0xef, 0xda, 0x9d, + 0xfe, 0xbf, 0xe, 0xf6, 0x0, 0x0, 0x5f, 0xff, + 0x7f, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x69, 0x0, + 0x0, 0x2a, 0xaa, 0xa9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaa, 0xaa, 0xa2, 0x0, 0x0, 0xa6, + 0xff, 0xfe, 0xf3, 0x0, 0x7, 0xf7, 0xff, 0xf5, + 0x0, 0x0, 0x7f, 0xe0, 0xfb, 0xef, 0xd9, 0xad, + 0xfe, 0x30, 0xfa, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x95, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x2a, 0x0, 0x2, 0xef, 0x78, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x0, 0x7, 0xff, + 0x0, 0x0, 0x7f, 0x0, 0x0, 0x1, + + /* U+F027 "" */ + 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x2e, 0xf0, + 0x0, 0x78, 0x8e, 0xff, 0x3, 0xf, 0xff, 0xff, + 0xf0, 0xba, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xff, 0xf0, 0xaa, 0xdf, 0xff, 0xff, 0x4, 0x0, + 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, + 0x2a, 0x0, 0x11, 0x8e, 0x10, 0x0, 0x2, 0xef, + 0x0, 0x7d, 0x2b, 0x90, 0x78, 0x8e, 0xff, 0x3, + 0xa, 0xb3, 0xf0, 0xff, 0xff, 0xff, 0xb, 0xa1, + 0xf1, 0xe3, 0xff, 0xff, 0xff, 0x3, 0xf0, 0xe3, + 0xc5, 0xff, 0xff, 0xff, 0xb, 0xa1, 0xf1, 0xe3, + 0xdf, 0xff, 0xff, 0x3, 0xa, 0xb3, 0xf0, 0x0, + 0x7, 0xff, 0x0, 0x7d, 0x2b, 0x90, 0x0, 0x0, + 0x7f, 0x0, 0x11, 0x9e, 0x10, 0x0, 0x0, 0x1, + 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfd, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x1, 0xff, 0xff, + 0xef, 0xff, 0xfb, 0x18, 0xff, 0xf6, 0x1c, 0xff, + 0xff, 0xfc, 0xff, 0x60, 0x1, 0xdf, 0xff, 0x60, + 0x96, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x88, 0x88, 0x88, 0x88, 0xcf, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F043 "" */ + 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0xcf, 0x10, + 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, 0xef, + 0xff, 0xff, 0x30, 0x8f, 0xff, 0xff, 0xfc, 0xe, + 0xff, 0xff, 0xff, 0xf2, 0xf9, 0xcf, 0xff, 0xff, + 0x3d, 0xc5, 0xff, 0xff, 0xf1, 0x6f, 0xa3, 0xbf, + 0xfa, 0x0, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x26, + 0x74, 0x0, 0x0, + + /* U+F048 "" */ + 0x58, 0x0, 0x0, 0x35, 0x9f, 0x10, 0x5, 0xfe, + 0x9f, 0x10, 0x6f, 0xfe, 0x9f, 0x17, 0xff, 0xfe, + 0x9f, 0x9f, 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xfe, + 0x9f, 0xef, 0xff, 0xfe, 0x9f, 0x2d, 0xff, 0xfe, + 0x9f, 0x10, 0xcf, 0xfe, 0x9f, 0x10, 0xb, 0xfe, + 0x8f, 0x0, 0x0, 0x9b, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x46, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0xf, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0xaf, 0xfe, 0x30, 0xaf, 0xfe, 0x3f, 0xff, 0xf7, + 0xf, 0xff, 0xf7, 0xff, 0xff, 0x80, 0xff, 0xff, + 0x8f, 0xff, 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, + 0x80, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xf, 0xff, + 0xf8, 0xff, 0xff, 0x80, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0xff, + 0xff, 0x8f, 0xff, 0xf7, 0xf, 0xff, 0xf7, 0x48, + 0x98, 0x10, 0x48, 0x98, 0x10, + + /* U+F04D "" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, + 0xff, 0xff, 0xff, 0xfe, 0x30, + + /* U+F051 "" */ + 0x26, 0x0, 0x0, 0x58, 0x7f, 0xa0, 0x0, 0xbf, + 0x8f, 0xfb, 0x0, 0xbf, 0x8f, 0xff, 0xc1, 0xbf, + 0x8f, 0xff, 0xfd, 0xcf, 0x8f, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xef, 0x8f, 0xff, 0xf4, 0xbf, + 0x8f, 0xff, 0x40, 0xbf, 0x8f, 0xe3, 0x0, 0xbf, + 0x5d, 0x20, 0x0, 0xae, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1, 0x34, 0x44, 0x44, 0x44, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+F053 "" */ + 0x0, 0x0, 0x3, 0x10, 0x0, 0x5, 0xfb, 0x0, + 0x5, 0xff, 0x40, 0x5, 0xff, 0x40, 0x5, 0xff, + 0x50, 0x3, 0xff, 0x50, 0x0, 0xb, 0xfc, 0x10, + 0x0, 0xb, 0xfc, 0x10, 0x0, 0xc, 0xfc, 0x10, + 0x0, 0xc, 0xfb, 0x0, 0x0, 0xa, 0x50, + + /* U+F054 "" */ + 0x3, 0x10, 0x0, 0x3, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xb, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xd, 0xfb, 0x0, 0x5, 0xff, + 0x50, 0x5, 0xff, 0x50, 0x5, 0xff, 0x50, 0x3, + 0xff, 0x50, 0x0, 0xa, 0x50, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x69, 0x10, 0x0, 0x0, 0x0, 0xd, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, + 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x58, 0x88, + 0xff, 0xb8, 0x88, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x9b, 0xbb, 0xff, 0xdb, 0xbb, 0x30, 0x0, + 0xe, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, + 0x0, 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9d, 0x20, 0x0, 0x0, + + /* U+F068 "" */ + 0x46, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, + 0x40, + + /* U+F06E "" */ + 0x0, 0x3, 0xad, 0xff, 0xc7, 0x0, 0x0, 0x0, + 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, 0xb, 0xff, + 0x20, 0x77, 0x9, 0xff, 0x40, 0x7f, 0xf9, 0x0, + 0xcf, 0xa1, 0xff, 0xe1, 0xef, 0xf6, 0x7f, 0xff, + 0xf0, 0xef, 0xf7, 0x8f, 0xf9, 0x3f, 0xff, 0xc1, + 0xff, 0xe1, 0xb, 0xff, 0x26, 0xca, 0x19, 0xff, + 0x40, 0x0, 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xc7, 0x0, 0x0, + + /* U+F070 "" */ + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xf8, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0x9f, 0xfd, 0x52, 0x5d, 0xfc, 0x10, 0x0, + 0x0, 0x5, 0xfe, 0x4a, 0x70, 0xcf, 0xe1, 0x0, + 0xb, 0x80, 0x2d, 0xff, 0xf7, 0x4f, 0xfb, 0x0, + 0x2f, 0xfb, 0x0, 0xaf, 0xfb, 0x2f, 0xff, 0x30, + 0xb, 0xff, 0x50, 0x7, 0xfe, 0x7f, 0xfb, 0x0, + 0x1, 0xdf, 0xc0, 0x0, 0x3e, 0xff, 0xe1, 0x0, + 0x0, 0x1b, 0xfc, 0x42, 0x1, 0xbf, 0xa0, 0x0, + 0x0, 0x0, 0x5b, 0xef, 0xb0, 0x8, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfd, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x3, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, + 0xc0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xfd, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xf8, + 0xcf, 0xff, 0xe1, 0x0, 0x1f, 0xff, 0xfc, 0x4, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xd2, 0x7f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc1, 0xff, 0xf8, 0x0, 0x2e, + 0xff, 0xfc, 0xcd, 0xff, 0x62, 0xef, 0xdf, 0xf9, + 0x0, 0x2c, 0x4e, 0xf9, 0xf, 0x90, 0x0, 0x2, + 0xef, 0x90, 0x7, 0x0, 0x0, 0x2e, 0xf8, 0x88, + 0xf, 0xa0, 0xcd, 0xff, 0x80, 0xdf, 0xdf, 0xf9, + 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x10, + + /* U+F077 "" */ + 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf9, 0x0, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0xb, 0xf9, 0x0, 0x0, 0x2e, + 0xf4, 0x27, 0x0, 0x0, 0x0, 0x27, 0x0, + + /* U+F078 "" */ + 0x27, 0x0, 0x0, 0x0, 0x27, 0xb, 0xf9, 0x0, + 0x0, 0x2e, 0xf4, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x0, 0x2e, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xc0, 0x7, 0x77, 0x77, 0x72, 0x0, + 0x3, 0xff, 0xfc, 0x2e, 0xff, 0xff, 0xf9, 0x0, + 0xf, 0xcf, 0xcf, 0xa0, 0x0, 0x0, 0xe9, 0x0, + 0x4, 0x1e, 0x93, 0x20, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0xb5, 0xe9, 0x97, + 0x0, 0xe, 0xc7, 0x77, 0x73, 0xbf, 0xff, 0xf6, + 0x0, 0xd, 0xff, 0xff, 0xfd, 0xb, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, + + /* U+F07B "" */ + 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x98, 0x88, 0x74, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F093 "" */ + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, + 0x30, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x23, 0x32, 0x8f, 0xf8, 0x23, 0x32, 0xff, 0xfe, + 0x39, 0x93, 0xef, 0xff, 0xff, 0xff, 0xc9, 0x9c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x1, + 0x0, 0x9, 0xff, 0x40, 0x1, 0x8e, 0xe1, 0x1a, + 0xff, 0x70, 0x0, 0xef, 0xff, 0xde, 0xff, 0x90, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x8f, 0xff, 0xe9, 0x10, 0x0, 0x0, 0x2, 0x76, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x7, 0x93, 0x0, 0x0, 0x22, 0xa, 0xff, 0xf2, + 0x0, 0x8f, 0xf5, 0xf9, 0x1f, 0x70, 0x8f, 0xf9, + 0xc, 0xfc, 0xf8, 0x8f, 0xf9, 0x0, 0x1a, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x7, 0xbf, 0xff, 0xf6, 0x0, 0xa, 0xff, + 0xfa, 0xbf, 0xf6, 0x0, 0xf9, 0x1f, 0x70, 0xbf, + 0xf6, 0xc, 0xfc, 0xf4, 0x0, 0xbf, 0xf4, 0x1a, + 0xc6, 0x0, 0x0, 0x56, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x3, 0x44, 0x41, 0x20, 0x0, 0x0, 0xff, + 0xff, 0x5e, 0x40, 0x24, 0x1f, 0xff, 0xf5, 0xee, + 0x2f, 0xf4, 0xff, 0xff, 0xc8, 0x82, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0x4f, 0xff, 0xff, 0xff, 0x5f, 0xf4, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0x93, 0x44, 0x44, 0x43, 0xf, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x68, 0x88, 0x88, 0x71, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x48, 0x88, 0x88, 0x87, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xf8, 0x0, 0x0, 0xb, 0xfb, + 0xf, 0x80, 0x0, 0x0, 0xbf, 0xf3, 0xfb, 0x77, + 0x77, 0x7d, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0x42, 0xdf, 0xff, 0x4f, 0xff, + 0xc0, 0x8, 0xff, 0xf4, 0xff, 0xfe, 0x0, 0xaf, + 0xff, 0x4f, 0xff, 0xfc, 0xaf, 0xff, 0xf4, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x10, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0x99, + 0x99, 0x99, 0x99, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x12, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9a, 0xaa, 0xaa, 0xaa, + 0xaa, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0xc3, 0xbf, 0xff, 0xff, 0xfb, 0x3c, + 0xff, 0x57, 0xff, 0xff, 0x75, 0xff, 0xff, 0xf9, + 0x3d, 0xd3, 0x9f, 0xff, 0xff, 0xff, 0xd5, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F0E7 "" */ + 0x1, 0xbb, 0xba, 0x10, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, + 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, + 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x50, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x7, 0xf3, + 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x2a, 0x50, 0x0, 0x0, 0xe, 0xff, 0x8f, + 0xff, 0x20, 0x0, 0xff, 0xf8, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xeb, 0xbb, 0x30, 0x0, 0xff, 0xf4, + 0x99, 0x92, 0x60, 0xf, 0xff, 0x5f, 0xff, 0x4f, + 0xa0, 0xff, 0xf5, 0xff, 0xf5, 0x56, 0x1f, 0xff, + 0x5f, 0xff, 0xff, 0xf4, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0x4e, 0xff, 0x5f, 0xff, 0xff, 0xf4, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x44, 0x44, 0x44, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf1, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x24, + 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xfc, + 0x8e, 0x8e, 0x8e, 0x88, 0xe8, 0xf7, 0xf8, 0xc, + 0xc, 0xb, 0x0, 0xb0, 0xf8, 0xff, 0xec, 0xfc, + 0xec, 0xee, 0xcf, 0xf8, 0xff, 0xa0, 0xc0, 0xa0, + 0x77, 0x2f, 0xf8, 0xff, 0xec, 0xfc, 0xec, 0xee, + 0xcf, 0xf8, 0xf8, 0xc, 0x0, 0x0, 0x0, 0xb0, + 0xf8, 0xfc, 0x8e, 0x88, 0x88, 0x88, 0xe8, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1, 0x34, 0x44, 0xdf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x9b, 0xbb, 0xb2, 0x70, 0xf, 0xff, 0xff, 0x4f, + 0x90, 0xff, 0xff, 0xf4, 0xff, 0x9f, 0xff, 0xff, + 0x54, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0x44, + 0x44, 0x44, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9b, 0xcb, 0x95, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xef, + 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xe3, 0xdf, 0xa1, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd2, 0x60, 0x5, + 0xbe, 0xfe, 0xb5, 0x0, 0x52, 0x0, 0x1c, 0xff, + 0xfe, 0xff, 0xfc, 0x10, 0x0, 0x2, 0xec, 0x40, + 0x0, 0x4c, 0xe2, 0x0, 0x0, 0x1, 0x0, 0x1, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd6, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x43, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xc0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0x90, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x42, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0x80, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0x60, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x41, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0x40, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xcb, 0xfe, 0x0, 0x0, 0x0, + 0x1, 0x0, 0xd, 0x10, 0x42, 0x0, 0x0, 0x0, + 0x9f, 0xd1, 0x68, 0x0, 0x0, 0x0, 0x68, 0x0, + 0xff, 0xfe, 0xee, 0xed, 0xdd, 0xdd, 0xef, 0xc0, + 0x9f, 0xd1, 0x0, 0xb3, 0x0, 0x0, 0x68, 0x0, + 0x1, 0x0, 0x0, 0x3b, 0x5, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbe, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x6e, 0xfe, + 0xfd, 0x20, 0x4, 0xff, 0xf3, 0xff, 0xd0, 0xc, + 0xff, 0xf0, 0x4f, 0xf5, 0xf, 0xd5, 0xf2, 0x95, + 0xf8, 0x2f, 0xf7, 0x41, 0x3c, 0xfa, 0x3f, 0xff, + 0x60, 0xaf, 0xfb, 0x3f, 0xfe, 0x20, 0x4f, 0xfb, + 0x2f, 0xe2, 0x92, 0x75, 0xfa, 0xf, 0xeb, 0xf1, + 0x49, 0xf8, 0x9, 0xff, 0xf0, 0x9f, 0xf2, 0x1, + 0xdf, 0xf9, 0xff, 0x90, 0x0, 0x6, 0xab, 0x95, + 0x0, + + /* U+F2ED "" */ + 0x0, 0x4, 0x88, 0x70, 0x0, 0xb, 0xcc, 0xff, + 0xff, 0xdc, 0xc5, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x52, 0x88, 0x88, 0x88, 0x88, 0x60, 0x4f, 0xff, + 0xff, 0xff, 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x5f, + 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, 0xfc, 0x4, 0xfa, + 0xae, 0x6f, 0x4f, 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, + 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x4f, 0xc0, 0x4f, + 0xaa, 0xe6, 0xf5, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6, 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, 0x0, + 0x1, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xea, + 0x5f, 0xfd, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x5d, + 0x20, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, + 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xd, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x6, 0x64, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, + 0xff, 0xff, 0x91, 0xdd, 0x19, 0xff, 0xf5, 0xff, + 0xff, 0xfd, 0x11, 0x11, 0xdf, 0xff, 0xef, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xf5, 0xff, 0xff, + 0xfd, 0x11, 0x11, 0xdf, 0xff, 0x5, 0xff, 0xff, + 0x91, 0xdd, 0x19, 0xff, 0xf0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F7C2 "" */ + 0x0, 0x17, 0x88, 0x87, 0x20, 0x2d, 0xff, 0xff, + 0xfd, 0x2e, 0xa0, 0xb3, 0x78, 0xfe, 0xfa, 0xb, + 0x37, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x44, + 0x44, 0x44, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x69, 0x0, + 0x0, 0x0, 0xdf, 0x0, 0x7f, 0xc0, 0x0, 0x0, + 0xd, 0xf0, 0x8f, 0xff, 0xdd, 0xdd, 0xdd, 0xff, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 52, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 51, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14, .adv_w = 75, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 22, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 63, .adv_w = 119, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109, .adv_w = 162, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 154, .adv_w = 132, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 199, .adv_w = 40, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 203, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 223, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 243, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 256, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 277, .adv_w = 44, .box_w = 3, .box_h = 4, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 283, .adv_w = 74, .box_w = 4, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 287, .adv_w = 44, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 290, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 329, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 365, .adv_w = 71, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 383, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 415, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 447, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 483, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 515, .adv_w = 118, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 551, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 583, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 619, .adv_w = 118, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 651, .adv_w = 44, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 662, .adv_w = 44, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 676, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 701, .adv_w = 112, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 719, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 744, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 776, .adv_w = 199, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 848, .adv_w = 141, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 893, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 929, .adv_w = 139, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 970, .adv_w = 159, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1011, .adv_w = 129, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1043, .adv_w = 122, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1075, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1116, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1152, .adv_w = 60, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1161, .adv_w = 98, .box_w = 6, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1188, .adv_w = 138, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1224, .adv_w = 114, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1256, .adv_w = 183, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1301, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1337, .adv_w = 161, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1382, .adv_w = 139, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1418, .adv_w = 161, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1478, .adv_w = 140, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1514, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1546, .adv_w = 113, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1578, .adv_w = 152, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1614, .adv_w = 137, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1659, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1722, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1758, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1799, .adv_w = 126, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1835, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1855, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1894, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1914, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1935, .adv_w = 96, .box_w = 6, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1938, .adv_w = 115, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 1942, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1967, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2002, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2027, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2067, .adv_w = 118, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2092, .adv_w = 68, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2117, .adv_w = 132, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2157, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2192, .adv_w = 54, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2207, .adv_w = 55, .box_w = 5, .box_h = 13, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 2240, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2275, .adv_w = 54, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2285, .adv_w = 203, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2324, .adv_w = 131, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2349, .adv_w = 122, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2377, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2412, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2452, .adv_w = 79, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2466, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2487, .adv_w = 79, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2510, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2535, .adv_w = 107, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2563, .adv_w = 173, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2602, .adv_w = 106, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2627, .adv_w = 107, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2667, .adv_w = 100, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2688, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2714, .adv_w = 57, .box_w = 2, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2727, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2753, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 2760, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 2773, .adv_w = 60, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2778, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2856, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2910, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2976, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3030, .adv_w = 132, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3071, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3149, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3227, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3304, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3382, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3445, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3523, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3553, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3598, .adv_w = 216, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3689, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3743, .adv_w = 132, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3802, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3850, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3922, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3983, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4044, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 4092, .adv_w = 168, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 4158, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4197, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4236, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4297, .adv_w = 168, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 4314, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4377, .adv_w = 240, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4481, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4579, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4645, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4684, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4723, .adv_w = 240, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4803, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4857, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4935, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5020, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5081, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5153, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5214, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5275, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5329, .adv_w = 120, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5388, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5460, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5532, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5595, .adv_w = 192, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5686, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5745, .adv_w = 240, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5835, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5903, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5971, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6039, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6107, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6175, .adv_w = 240, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6263, .adv_w = 168, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6328, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6400, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6485, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6553, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6612, .adv_w = 193, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 9, 0, 5, -4, 0, 0, + 0, 0, -11, -12, 1, 9, 4, 3, + -8, 1, 9, 1, 8, 2, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 2, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -6, 0, 0, 0, 0, + 0, -4, 3, 4, 0, 0, -2, 0, + -1, 2, 0, -2, 0, -2, -1, -4, + 0, 0, 0, 0, -2, 0, 0, -2, + -3, 0, 0, -2, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -3, 0, -5, 0, -23, 0, + 0, -4, 0, 4, 6, 0, 0, -4, + 2, 2, 6, 4, -3, 4, 0, 0, + -11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -2, -9, 0, -8, + -1, 0, 0, 0, 0, 0, 7, 0, + -6, -2, -1, 1, 0, -3, 0, 0, + -1, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, -2, 7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 2, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 4, 2, 6, -2, 0, 0, 4, -2, + -6, -26, 1, 5, 4, 0, -2, 0, + 7, 0, 6, 0, 6, 0, -18, 0, + -2, 6, 0, 6, -2, 4, 2, 0, + 0, 1, -2, 0, 0, -3, 15, 0, + 15, 0, 6, 0, 8, 2, 3, 6, + 0, 0, 0, -7, 0, 0, 0, 0, + 1, -1, 0, 1, -3, -2, -4, 1, + 0, -2, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -11, 0, -12, 0, 0, 0, + 0, -1, 0, 19, -2, -2, 2, 2, + -2, 0, -2, 2, 0, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -19, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 12, 0, 0, -7, 0, + 6, 0, -13, -19, -13, -4, 6, 0, + 0, -13, 0, 2, -4, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 6, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -4, 0, -1, + -1, -2, 0, 0, -1, 0, 0, 0, + -4, 0, -2, 0, -4, -4, 0, -5, + -6, -6, -4, 0, -4, 0, -4, 0, + 0, 0, 0, -2, 0, 0, 2, 0, + 1, -2, 0, 1, 0, 0, 0, 2, + -1, 0, 0, 0, -1, 2, 2, -1, + 0, 0, 0, -4, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 2, -1, 0, + -2, 0, -3, 0, 0, -1, 0, 6, + 0, 0, -2, 0, 0, 0, 0, 0, + -1, 1, -1, -1, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -2, 0, + 0, 0, 0, 0, 1, 0, 0, -1, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -3, 0, -6, + -1, -6, 4, 0, 0, -4, 2, 4, + 5, 0, -5, -1, -2, 0, -1, -9, + 2, -1, 1, -10, 2, 0, 0, 1, + -10, 0, -10, -2, -17, -1, 0, -10, + 0, 4, 5, 0, 2, 0, 0, 0, + 0, 0, 0, -3, -2, 0, -6, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -1, -2, -2, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, -1, 0, -4, 2, 0, 0, -2, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -2, 0, -2, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + -4, 0, 6, -1, 1, -6, 0, 0, + 5, -10, -10, -8, -4, 2, 0, -2, + -12, -3, 0, -3, 0, -4, 3, -3, + -12, 0, -5, 0, 0, 1, -1, 2, + -1, 0, 2, 0, -6, -7, 0, -10, + -5, -4, -5, -6, -2, -5, 0, -4, + -5, 1, 0, 1, 0, -2, 0, 0, + 0, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, -1, -2, 0, -3, -4, + -4, -1, 0, -6, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -4, 0, 0, 0, 0, -10, -6, 0, + 0, 0, -3, -10, 0, 0, -2, 2, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -3, 0, + 0, 0, 0, 2, 0, 1, -4, -4, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, -6, 0, -2, 0, -3, -2, + 0, -4, -5, -6, -2, 0, -4, 0, + -6, 0, 0, 0, 0, 15, 0, 0, + 1, 0, 0, -2, 0, 2, 0, -8, + 0, 0, 0, 0, 0, -18, -3, 6, + 6, -2, -8, 0, 2, -3, 0, -10, + -1, -2, 2, -13, -2, 2, 0, 3, + -7, -3, -7, -6, -8, 0, 0, -12, + 0, 11, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -5, -6, 0, -18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -3, 0, 0, + -4, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 4, + -1, 2, 0, -4, 2, -1, -1, -5, + -2, 0, -2, -2, -1, 0, -3, -3, + 0, 0, -2, -1, -1, -3, -2, 0, + 0, -2, 0, 2, -1, 0, -4, 0, + 0, 0, -4, 0, -3, 0, -3, -3, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 2, 0, -3, 0, -1, -2, + -6, -1, -1, -1, -1, -1, -2, -1, + 0, 0, 0, 0, 0, -2, -2, -2, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -2, -2, + -2, 0, 2, 8, -1, 0, -5, 0, + -1, 4, 0, -2, -8, -2, 3, 0, + 0, -9, -3, 2, -3, 1, 0, -1, + -2, -6, 0, -3, 1, 0, 0, -3, + 0, 0, 0, 2, 2, -4, -4, 0, + -3, -2, -3, -2, -2, 0, -3, 1, + -4, -3, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -2, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -3, 0, -4, 0, 0, 0, -6, 0, + 1, -4, 4, 0, -1, -9, 0, 0, + -4, -2, 0, -8, -5, -5, 0, 0, + -8, -2, -8, -7, -9, 0, -5, 0, + 2, 13, -2, 0, -4, -2, -1, -2, + -3, -5, -3, -7, -8, -4, -2, 0, + 0, -1, 0, 1, 0, 0, -13, -2, + 6, 4, -4, -7, 0, 1, -6, 0, + -10, -1, -2, 4, -18, -2, 1, 0, + 0, -12, -2, -10, -2, -14, 0, 0, + -13, 0, 11, 1, 0, -1, 0, 0, + 0, 0, -1, -1, -7, -1, 0, -12, + 0, 0, 0, 0, -6, 0, -2, 0, + -1, -5, -9, 0, 0, -1, -3, -6, + -2, 0, -1, 0, 0, 0, 0, -9, + -2, -6, -6, -2, -3, -5, -2, -3, + 0, -4, -2, -6, -3, 0, -2, -4, + -2, -4, 0, 1, 0, -1, -6, 0, + 4, 0, -3, 0, 0, 0, 0, 2, + 0, 1, -4, 8, 0, -2, -2, -2, + 0, 0, 0, 0, 0, 0, -6, 0, + -2, 0, -3, -2, 0, -4, -5, -6, + -2, 0, -4, 2, 8, 0, 0, 0, + 0, 15, 0, 0, 1, 0, 0, -2, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -4, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -4, + -2, 0, 0, -4, 0, 3, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 4, 2, -2, 0, -6, + -3, 0, 6, -6, -6, -4, -4, 8, + 3, 2, -17, -1, 4, -2, 0, -2, + 2, -2, -7, 0, -2, 2, -2, -2, + -6, -2, 0, 0, 6, 4, 0, -5, + 0, -11, -2, 6, -2, -7, 1, -2, + -6, -6, -2, 8, 2, 0, -3, 0, + -5, 0, 2, 6, -4, -7, -8, -5, + 6, 0, 1, -14, -2, 2, -3, -1, + -4, 0, -4, -7, -3, -3, -2, 0, + 0, -4, -4, -2, 0, 6, 4, -2, + -11, 0, -11, -3, 0, -7, -11, -1, + -6, -3, -6, -5, 5, 0, 0, -2, + 0, -4, -2, 0, -2, -3, 0, 3, + -6, 2, 0, 0, -10, 0, -2, -4, + -3, -1, -6, -5, -6, -4, 0, -6, + -2, -4, -4, -6, -2, 0, 0, 1, + 9, -3, 0, -6, -2, 0, -2, -4, + -4, -5, -5, -7, -2, -4, 4, 0, + -3, 0, -10, -2, 1, 4, -6, -7, + -4, -6, 6, -2, 1, -18, -3, 4, + -4, -3, -7, 0, -6, -8, -2, -2, + -2, -2, -4, -6, -1, 0, 0, 6, + 5, -1, -12, 0, -12, -4, 5, -7, + -13, -4, -7, -8, -10, -6, 4, 0, + 0, 0, 0, -2, 0, 0, 2, -2, + 4, 1, -4, 4, 0, 0, -6, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 2, 6, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 7, 0, 3, 1, 1, -2, + 0, 4, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -12, 0, -2, 3, 0, 6, + 0, 0, 19, 2, -4, -4, 2, 2, + -1, 1, -10, 0, 0, 9, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 7, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -4, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -5, 0, + 0, 1, 0, 0, 2, 25, -4, -2, + 6, 5, -5, 2, 0, 0, 2, 2, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, -5, 0, 0, 0, 0, + -4, -1, 0, 0, 0, -4, 0, -2, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -4, 0, -3, 0, + -5, 0, 0, 0, -3, 2, -2, 0, + 0, -5, -2, -4, 0, 0, -5, 0, + -2, 0, -9, 0, -2, 0, 0, -16, + -4, -8, -2, -7, 0, 0, -13, 0, + -5, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, -2, -3, 0, 0, + 0, 0, -4, 0, -4, 2, -2, 4, + 0, -1, -4, -1, -3, -4, 0, -2, + -1, -1, 1, -5, -1, 0, 0, 0, + -17, -2, -3, 0, -4, 0, -1, -9, + -2, 0, 0, -1, -2, 0, 0, 0, + 0, 1, 0, -1, -3, -1, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -4, 0, -1, 0, 0, 0, -4, + 2, 0, 0, 0, -5, -2, -4, 0, + 0, -5, 0, -2, 0, -9, 0, 0, + 0, 0, -19, 0, -4, -7, -10, 0, + 0, -13, 0, -1, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -3, -1, + -3, 1, 0, 0, 3, -2, 0, 6, + 9, -2, -2, -6, 2, 9, 3, 4, + -5, 2, 8, 2, 6, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 9, -3, -2, 0, -2, + 15, 8, 15, 0, 0, 0, 2, 0, + 0, 7, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, -16, -2, -2, -8, + -9, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, -16, -2, -2, + -8, -9, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -4, 2, 0, -2, + 2, 3, 2, -6, 0, 0, -2, 2, + 0, 2, 0, 0, 0, 0, -5, 0, + -2, -1, -4, 0, -2, -8, 0, 12, + -2, 0, -4, -1, 0, -1, -3, 0, + -2, -5, -4, -2, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, -16, + -2, -2, -8, -9, 0, 0, -13, 0, + 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, -6, -2, -2, 6, -2, -2, + -8, 1, -1, 1, -1, -5, 0, 4, + 0, 2, 1, 2, -5, -8, -2, 0, + -7, -4, -5, -8, -7, 0, -3, -4, + -2, -2, -2, -1, -2, -1, 0, -1, + -1, 3, 0, 3, -1, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -2, -2, 0, 0, + -5, 0, -1, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + 0, 0, 0, 0, -2, 0, 0, -3, + -2, 2, 0, -3, -4, -1, 0, -6, + -1, -4, -1, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 6, 0, 0, -3, 0, + 0, 0, 0, -2, 0, -2, 0, 0, + -1, 0, 0, -1, 0, -4, 0, 0, + 8, -2, -6, -6, 1, 2, 2, 0, + -5, 1, 3, 1, 6, 1, 6, -1, + -5, 0, 0, -8, 0, 0, -6, -5, + 0, 0, -4, 0, -2, -3, 0, -3, + 0, -3, 0, -1, 3, 0, -2, -6, + -2, 7, 0, 0, -2, 0, -4, 0, + 0, 2, -4, 0, 2, -2, 2, 0, + 0, -6, 0, -1, -1, 0, -2, 2, + -2, 0, 0, 0, -8, -2, -4, 0, + -6, 0, 0, -9, 0, 7, -2, 0, + -3, 0, 1, 0, -2, 0, -2, -6, + 0, -2, 2, 0, 0, 0, 0, -1, + 0, 0, 2, -2, 1, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 4, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 4, 0, 4, + 0, 0, 0, 0, 0, -12, -11, 1, + 8, 6, 3, -8, 1, 8, 0, 7, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_12 = { +#else +lv_font_t lv_font_montserrat_12 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 15, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_12*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_14.c b/inc/lvgl/src/font/lv_font_montserrat_14.c new file mode 100644 index 0000000..7c8608c --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_14.c @@ -0,0 +1,2190 @@ +/******************************************************************************* + * Size: 14 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 14 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_14.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_14 + #define LV_FONT_MONTSERRAT_14 1 +#endif + +#if LV_FONT_MONTSERRAT_14 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xe, 0xa0, 0xd9, 0xd, 0x90, 0xc8, 0xc, 0x80, + 0xb7, 0xa, 0x60, 0x11, 0xb, 0x80, 0xd9, + + /* U+0022 "\"" */ + 0x1f, 0x9, 0x91, 0xf0, 0x88, 0x1f, 0x8, 0x80, + 0xf0, 0x88, 0x0, 0x0, 0x0, + + /* U+0023 "#" */ + 0x0, 0xd, 0x20, 0x3c, 0x0, 0x0, 0xf, 0x0, + 0x69, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0x1, + 0x5c, 0x11, 0xa6, 0x10, 0x0, 0x69, 0x0, 0xc3, + 0x0, 0x0, 0x88, 0x0, 0xd2, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xf0, 0x12, 0xc5, 0x23, 0xe2, 0x20, + 0x0, 0xd2, 0x3, 0xc0, 0x0, 0x0, 0xf0, 0x4, + 0xb0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x19, 0xef, + 0xea, 0x30, 0xc, 0xd6, 0xe6, 0xa7, 0x2, 0xf4, + 0xe, 0x0, 0x0, 0x1f, 0x80, 0xe0, 0x0, 0x0, + 0x6f, 0xef, 0x50, 0x0, 0x0, 0x16, 0xff, 0xe5, + 0x0, 0x0, 0xe, 0xa, 0xf0, 0x1, 0x0, 0xe0, + 0x5f, 0x13, 0xf8, 0x5e, 0x6e, 0xb0, 0x5, 0xcf, + 0xfe, 0x91, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, + + /* U+0025 "%" */ + 0x8, 0xdd, 0x30, 0x0, 0xa7, 0x0, 0x4b, 0x2, + 0xd0, 0x4, 0xc0, 0x0, 0x77, 0x0, 0xd0, 0x1d, + 0x20, 0x0, 0x4b, 0x3, 0xd0, 0xa7, 0x0, 0x0, + 0x7, 0xdc, 0x34, 0xc4, 0xcc, 0x30, 0x0, 0x0, + 0x1d, 0x2d, 0x22, 0xd0, 0x0, 0x0, 0xa6, 0x3b, + 0x0, 0xb3, 0x0, 0x5, 0xc0, 0x3a, 0x0, 0xa3, + 0x0, 0x1d, 0x20, 0xd, 0x0, 0xd0, 0x0, 0xa6, + 0x0, 0x4, 0xcc, 0x40, + + /* U+0026 "&" */ + 0x0, 0x4d, 0xfc, 0x30, 0x0, 0x0, 0xf7, 0x18, + 0xc0, 0x0, 0x1, 0xf2, 0x5, 0xd0, 0x0, 0x0, + 0xbb, 0x6e, 0x40, 0x0, 0x0, 0x5f, 0xf3, 0x0, + 0x0, 0x7, 0xe6, 0xdb, 0x3, 0x80, 0x2f, 0x30, + 0x1d, 0xba, 0xa0, 0x5f, 0x0, 0x1, 0xdf, 0x40, + 0x1f, 0xb4, 0x48, 0xfe, 0xc0, 0x3, 0xbf, 0xfc, + 0x40, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1f, 0x1, 0xf0, 0x1f, 0x0, 0xf0, 0x0, 0x0, + + /* U+0028 "(" */ + 0x3, 0xf1, 0xb, 0x90, 0xf, 0x40, 0x4f, 0x0, + 0x7d, 0x0, 0x9b, 0x0, 0xaa, 0x0, 0xaa, 0x0, + 0x9b, 0x0, 0x7d, 0x0, 0x4f, 0x0, 0xf, 0x40, + 0xb, 0x90, 0x3, 0xf1, + + /* U+0029 ")" */ + 0x5e, 0x0, 0xe, 0x60, 0x8, 0xc0, 0x4, 0xf0, + 0x1, 0xf3, 0x0, 0xf5, 0x0, 0xe6, 0x0, 0xe6, + 0x0, 0xf5, 0x1, 0xf3, 0x4, 0xf0, 0x8, 0xc0, + 0xe, 0x60, 0x5e, 0x0, + + /* U+002A "*" */ + 0x0, 0x93, 0x0, 0x88, 0xa6, 0xc2, 0x9, 0xfe, + 0x40, 0x4d, 0xdd, 0xb1, 0x42, 0x93, 0x50, 0x0, + 0x52, 0x0, + + /* U+002B "+" */ + 0x0, 0x4, 0x50, 0x0, 0x0, 0x8, 0xa0, 0x0, + 0x0, 0x8, 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xf3, + 0x3, 0x39, 0xb3, 0x30, 0x0, 0x8, 0xa0, 0x0, + 0x0, 0x8, 0xa0, 0x0, + + /* U+002C "," */ + 0x1, 0x3, 0xf6, 0x1e, 0x60, 0xe1, 0x2c, 0x0, + + /* U+002D "-" */ + 0x0, 0x0, 0x3, 0xff, 0xf9, 0x3, 0x33, 0x10, + + /* U+002E "." */ + 0x0, 0x3, 0xf5, 0x2e, 0x40, + + /* U+002F "/" */ + 0x0, 0x0, 0xe, 0x40, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x9a, 0x0, 0x0, 0xe, 0x40, 0x0, 0x4, + 0xf0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x3, 0xf0, 0x0, 0x0, 0x9a, 0x0, 0x0, + 0xe, 0x50, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x9a, + 0x0, 0x0, 0xe, 0x50, 0x0, 0x3, 0xf0, 0x0, + 0x0, + + /* U+0030 "0" */ + 0x0, 0x4c, 0xfe, 0x70, 0x0, 0x4f, 0xb6, 0x8f, + 0x90, 0xd, 0xb0, 0x0, 0x5f, 0x32, 0xf4, 0x0, + 0x0, 0xe7, 0x4f, 0x20, 0x0, 0xc, 0xa4, 0xf2, + 0x0, 0x0, 0xca, 0x2f, 0x40, 0x0, 0xe, 0x70, + 0xdb, 0x0, 0x5, 0xf2, 0x4, 0xfb, 0x68, 0xf9, + 0x0, 0x4, 0xcf, 0xe7, 0x0, + + /* U+0031 "1" */ + 0xef, 0xfb, 0x44, 0xcb, 0x0, 0xab, 0x0, 0xab, + 0x0, 0xab, 0x0, 0xab, 0x0, 0xab, 0x0, 0xab, + 0x0, 0xab, 0x0, 0xab, + + /* U+0032 "2" */ + 0x7, 0xdf, 0xea, 0x10, 0x8e, 0x85, 0x7e, 0xc0, + 0x1, 0x0, 0x6, 0xf1, 0x0, 0x0, 0x6, 0xf0, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0xcc, 0x0, + 0x0, 0x1c, 0xc0, 0x0, 0x1, 0xdb, 0x0, 0x0, + 0x1d, 0xe5, 0x44, 0x42, 0x7f, 0xff, 0xff, 0xf9, + + /* U+0033 "3" */ + 0x7f, 0xff, 0xff, 0xf0, 0x24, 0x44, 0x5f, 0x90, + 0x0, 0x0, 0xbc, 0x0, 0x0, 0x9, 0xe1, 0x0, + 0x0, 0x3f, 0xd8, 0x10, 0x0, 0x4, 0x6d, 0xd0, + 0x0, 0x0, 0x2, 0xf4, 0x10, 0x0, 0x2, 0xf4, + 0xbd, 0x75, 0x7d, 0xd0, 0x19, 0xdf, 0xea, 0x10, + + /* U+0034 "4" */ + 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, 0xac, + 0x0, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x0, 0x0, + 0x4f, 0x40, 0x10, 0x0, 0x2, 0xf6, 0x0, 0xf5, + 0x0, 0x1d, 0xa0, 0x0, 0xf5, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xf3, 0x13, 0x33, 0x33, 0xf7, 0x30, + 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xf5, 0x0, + + /* U+0035 "5" */ + 0x9, 0xff, 0xff, 0xf0, 0xa, 0xb4, 0x44, 0x40, + 0xc, 0x80, 0x0, 0x0, 0xe, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x40, 0x3, 0x34, 0x5c, 0xf2, + 0x0, 0x0, 0x0, 0xf7, 0x10, 0x0, 0x0, 0xf7, + 0x8e, 0x85, 0x6c, 0xf1, 0x8, 0xdf, 0xfb, 0x30, + + /* U+0036 "6" */ + 0x0, 0x2a, 0xef, 0xd5, 0x0, 0x3f, 0xd6, 0x57, + 0x40, 0xc, 0xc0, 0x0, 0x0, 0x2, 0xf4, 0x0, + 0x0, 0x0, 0x4f, 0x5b, 0xff, 0xa1, 0x4, 0xfe, + 0x84, 0x5d, 0xd0, 0x3f, 0x80, 0x0, 0x3f, 0x30, + 0xe8, 0x0, 0x3, 0xf2, 0x6, 0xf8, 0x45, 0xdc, + 0x0, 0x5, 0xdf, 0xe9, 0x10, + + /* U+0037 "7" */ + 0x9f, 0xff, 0xff, 0xfd, 0x9d, 0x44, 0x44, 0xe9, + 0x9c, 0x0, 0x4, 0xf2, 0x0, 0x0, 0xb, 0xb0, + 0x0, 0x0, 0x2f, 0x40, 0x0, 0x0, 0xad, 0x0, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x8, 0xe0, 0x0, + 0x0, 0xe, 0x80, 0x0, 0x0, 0x6f, 0x10, 0x0, + + /* U+0038 "8" */ + 0x1, 0x9e, 0xfe, 0x91, 0x0, 0xbe, 0x63, 0x6e, + 0xc0, 0xf, 0x60, 0x0, 0x6f, 0x0, 0xcc, 0x20, + 0x2b, 0xc0, 0x2, 0xef, 0xff, 0xe2, 0x0, 0xdc, + 0x42, 0x4c, 0xd0, 0x5f, 0x20, 0x0, 0x1f, 0x55, + 0xf2, 0x0, 0x2, 0xf5, 0xe, 0xd5, 0x35, 0xde, + 0x0, 0x1a, 0xef, 0xea, 0x10, + + /* U+0039 "9" */ + 0x3, 0xbf, 0xea, 0x20, 0x2f, 0xa4, 0x4b, 0xe1, + 0x8e, 0x0, 0x0, 0xe9, 0x9d, 0x0, 0x0, 0xdd, + 0x4f, 0x71, 0x29, 0xff, 0x7, 0xff, 0xfc, 0x9e, + 0x0, 0x2, 0x10, 0xac, 0x0, 0x0, 0x2, 0xf6, + 0x7, 0x65, 0x8f, 0xb0, 0xa, 0xef, 0xd7, 0x0, + + /* U+003A ":" */ + 0x2e, 0x53, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x52, 0xe4, + + /* U+003B ";" */ + 0x2e, 0x53, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x52, 0xf6, 0xd, 0x21, 0xd0, 0x1, + 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x6c, 0xf2, + 0x1, 0x8e, 0xd6, 0x0, 0xf, 0xc3, 0x0, 0x0, + 0xa, 0xfb, 0x40, 0x0, 0x0, 0x17, 0xee, 0x70, + 0x0, 0x0, 0x5, 0xc3, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x1f, 0xff, 0xff, 0xf3, 0x3, 0x33, 0x33, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf3, 0x3, 0x33, 0x33, 0x30, + + /* U+003E ">" */ + 0x4, 0x0, 0x0, 0x0, 0xe, 0xd7, 0x10, 0x0, + 0x0, 0x5c, 0xf9, 0x20, 0x0, 0x0, 0x2a, 0xf2, + 0x0, 0x3, 0xaf, 0xb1, 0x6, 0xde, 0x82, 0x0, + 0x1c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x7, 0xdf, 0xea, 0x10, 0x9e, 0x74, 0x6e, 0xc0, + 0x1, 0x0, 0x6, 0xf0, 0x0, 0x0, 0x9, 0xc0, + 0x0, 0x0, 0x8e, 0x20, 0x0, 0x6, 0xf2, 0x0, + 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x0, 0x0, 0xc, 0x90, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x6c, 0xef, 0xda, 0x40, 0x0, 0x0, + 0x3d, 0xa4, 0x10, 0x16, 0xd9, 0x0, 0x1, 0xe5, + 0x9, 0xee, 0x98, 0xca, 0x90, 0xa, 0x80, 0xbd, + 0x43, 0xaf, 0xc0, 0xd3, 0xf, 0x13, 0xf2, 0x0, + 0xc, 0xc0, 0x69, 0x3c, 0x6, 0xd0, 0x0, 0x7, + 0xc0, 0x3b, 0x4b, 0x6, 0xd0, 0x0, 0x7, 0xc0, + 0x2c, 0x3c, 0x3, 0xf2, 0x0, 0xc, 0xc0, 0x4a, + 0xf, 0x10, 0xbd, 0x43, 0x9e, 0xe3, 0xc5, 0xa, + 0x80, 0x9, 0xee, 0x91, 0xcf, 0x90, 0x1, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xa4, + 0x10, 0x28, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xef, + 0xd9, 0x10, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xd7, 0x0, 0x0, 0x0, 0x0, 0xb9, 0x6e, + 0x0, 0x0, 0x0, 0x2, 0xf2, 0xe, 0x50, 0x0, + 0x0, 0x9, 0xa0, 0x7, 0xd0, 0x0, 0x0, 0x1f, + 0x30, 0x0, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0xe7, 0x33, 0x33, 0x4f, 0x20, + 0x5, 0xf0, 0x0, 0x0, 0xc, 0x90, 0xc, 0x90, + 0x0, 0x0, 0x6, 0xf1, + + /* U+0042 "B" */ + 0x8f, 0xff, 0xfe, 0xc4, 0x8, 0xe3, 0x33, 0x4b, + 0xf2, 0x8e, 0x0, 0x0, 0x1f, 0x58, 0xe0, 0x0, + 0x18, 0xf1, 0x8f, 0xff, 0xff, 0xf8, 0x8, 0xe3, + 0x33, 0x37, 0xf6, 0x8e, 0x0, 0x0, 0x9, 0xc8, + 0xe0, 0x0, 0x0, 0x9d, 0x8e, 0x33, 0x34, 0x7f, + 0x78, 0xff, 0xff, 0xfd, 0x70, + + /* U+0043 "C" */ + 0x0, 0x7, 0xcf, 0xfb, 0x40, 0x0, 0xcf, 0x96, + 0x6a, 0xf5, 0xa, 0xe2, 0x0, 0x0, 0x30, 0x1f, + 0x60, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0x20, 0x0, 0x0, 0x0, 0x1f, 0x60, + 0x0, 0x0, 0x0, 0xa, 0xe2, 0x0, 0x0, 0x30, + 0x1, 0xcf, 0x96, 0x6a, 0xf5, 0x0, 0x7, 0xdf, + 0xfb, 0x40, + + /* U+0044 "D" */ + 0x8f, 0xff, 0xfe, 0xa4, 0x0, 0x8e, 0x44, 0x46, + 0xcf, 0x70, 0x8e, 0x0, 0x0, 0x7, 0xf3, 0x8e, + 0x0, 0x0, 0x0, 0xda, 0x8e, 0x0, 0x0, 0x0, + 0x9d, 0x8e, 0x0, 0x0, 0x0, 0x9d, 0x8e, 0x0, + 0x0, 0x0, 0xda, 0x8e, 0x0, 0x0, 0x7, 0xf3, + 0x8e, 0x44, 0x46, 0xbf, 0x70, 0x8f, 0xff, 0xfe, + 0xa4, 0x0, + + /* U+0045 "E" */ + 0x8f, 0xff, 0xff, 0xf6, 0x8e, 0x44, 0x44, 0x41, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xc0, 0x8e, 0x33, 0x33, 0x20, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x44, 0x44, 0x42, 0x8f, 0xff, 0xff, 0xf9, + + /* U+0046 "F" */ + 0x8f, 0xff, 0xff, 0xf6, 0x8e, 0x44, 0x44, 0x41, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, + 0x8e, 0x33, 0x33, 0x20, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x7, 0xcf, 0xfc, 0x50, 0x0, 0xcf, 0x96, + 0x6a, 0xf6, 0xa, 0xe2, 0x0, 0x0, 0x20, 0x1f, + 0x60, 0x0, 0x0, 0x0, 0x4f, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0x20, 0x0, 0x0, 0xb9, 0x1f, 0x60, + 0x0, 0x0, 0xb9, 0xa, 0xe3, 0x0, 0x0, 0xb9, + 0x0, 0xcf, 0x96, 0x6a, 0xf8, 0x0, 0x7, 0xdf, + 0xfc, 0x60, + + /* U+0048 "H" */ + 0x8e, 0x0, 0x0, 0x8, 0xe8, 0xe0, 0x0, 0x0, + 0x8e, 0x8e, 0x0, 0x0, 0x8, 0xe8, 0xe0, 0x0, + 0x0, 0x8e, 0x8f, 0xff, 0xff, 0xff, 0xe8, 0xe3, + 0x33, 0x33, 0x9e, 0x8e, 0x0, 0x0, 0x8, 0xe8, + 0xe0, 0x0, 0x0, 0x8e, 0x8e, 0x0, 0x0, 0x8, + 0xe8, 0xe0, 0x0, 0x0, 0x8e, + + /* U+0049 "I" */ + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, + + /* U+004A "J" */ + 0x2, 0xff, 0xff, 0xc0, 0x4, 0x44, 0xbc, 0x0, + 0x0, 0x9, 0xc0, 0x0, 0x0, 0x9c, 0x0, 0x0, + 0x9, 0xc0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x9, + 0xc0, 0x20, 0x0, 0xba, 0xe, 0xb5, 0x8f, 0x60, + 0x3c, 0xfe, 0x80, + + /* U+004B "K" */ + 0x8e, 0x0, 0x0, 0x4f, 0x50, 0x8e, 0x0, 0x4, + 0xf6, 0x0, 0x8e, 0x0, 0x3f, 0x70, 0x0, 0x8e, + 0x3, 0xf8, 0x0, 0x0, 0x8e, 0x2e, 0xc0, 0x0, + 0x0, 0x8e, 0xec, 0xf6, 0x0, 0x0, 0x8f, 0xb0, + 0x7f, 0x30, 0x0, 0x8e, 0x0, 0xa, 0xe1, 0x0, + 0x8e, 0x0, 0x0, 0xcc, 0x0, 0x8e, 0x0, 0x0, + 0x1e, 0xa0, + + /* U+004C "L" */ + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8e, 0x44, 0x44, 0x40, 0x8f, 0xff, 0xff, 0xf2, + + /* U+004D "M" */ + 0x8e, 0x0, 0x0, 0x0, 0x8, 0xe8, 0xf7, 0x0, + 0x0, 0x2, 0xfe, 0x8f, 0xf1, 0x0, 0x0, 0xbf, + 0xe8, 0xdc, 0xa0, 0x0, 0x4f, 0x9e, 0x8d, 0x2f, + 0x30, 0xd, 0x87, 0xe8, 0xd0, 0x9c, 0x6, 0xe0, + 0x7e, 0x8d, 0x1, 0xe7, 0xe5, 0x7, 0xe8, 0xd0, + 0x6, 0xfc, 0x0, 0x7e, 0x8d, 0x0, 0xa, 0x20, + 0x7, 0xe8, 0xd0, 0x0, 0x0, 0x0, 0x7e, + + /* U+004E "N" */ + 0x8e, 0x10, 0x0, 0x8, 0xe8, 0xfc, 0x0, 0x0, + 0x8e, 0x8f, 0xf9, 0x0, 0x8, 0xe8, 0xe6, 0xf6, + 0x0, 0x8e, 0x8e, 0x9, 0xf3, 0x8, 0xe8, 0xe0, + 0xc, 0xe1, 0x8e, 0x8e, 0x0, 0x1e, 0xb8, 0xe8, + 0xe0, 0x0, 0x3f, 0xee, 0x8e, 0x0, 0x0, 0x6f, + 0xe8, 0xe0, 0x0, 0x0, 0xae, + + /* U+004F "O" */ + 0x0, 0x7, 0xcf, 0xeb, 0x50, 0x0, 0x0, 0xcf, + 0x96, 0x6b, 0xf9, 0x0, 0xa, 0xe2, 0x0, 0x0, + 0x5f, 0x60, 0x1f, 0x60, 0x0, 0x0, 0xa, 0xd0, + 0x4f, 0x20, 0x0, 0x0, 0x6, 0xf0, 0x4f, 0x20, + 0x0, 0x0, 0x6, 0xf0, 0x1f, 0x60, 0x0, 0x0, + 0xa, 0xd0, 0xa, 0xe2, 0x0, 0x0, 0x5f, 0x60, + 0x0, 0xcf, 0x96, 0x6b, 0xfa, 0x0, 0x0, 0x7, + 0xdf, 0xeb, 0x50, 0x0, + + /* U+0050 "P" */ + 0x8f, 0xff, 0xfd, 0x70, 0x8, 0xe4, 0x45, 0x8f, + 0xb0, 0x8e, 0x0, 0x0, 0x5f, 0x38, 0xe0, 0x0, + 0x1, 0xf5, 0x8e, 0x0, 0x0, 0x3f, 0x48, 0xe0, + 0x1, 0x4d, 0xd0, 0x8f, 0xff, 0xff, 0xb2, 0x8, + 0xe3, 0x33, 0x10, 0x0, 0x8e, 0x0, 0x0, 0x0, + 0x8, 0xe0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x7, 0xcf, 0xeb, 0x50, 0x0, 0x0, 0xcf, + 0x96, 0x6b, 0xf9, 0x0, 0xa, 0xe2, 0x0, 0x0, + 0x5f, 0x60, 0x1f, 0x60, 0x0, 0x0, 0xa, 0xd0, + 0x4f, 0x20, 0x0, 0x0, 0x6, 0xf0, 0x4f, 0x20, + 0x0, 0x0, 0x5, 0xf0, 0x1f, 0x60, 0x0, 0x0, + 0xa, 0xd0, 0xa, 0xe2, 0x0, 0x0, 0x5f, 0x60, + 0x1, 0xdf, 0x85, 0x5a, 0xfa, 0x0, 0x0, 0x8, + 0xdf, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x1, 0xec, + 0x21, 0x94, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + + /* U+0052 "R" */ + 0x8f, 0xff, 0xfd, 0x70, 0x8, 0xe4, 0x45, 0x8f, + 0xb0, 0x8e, 0x0, 0x0, 0x5f, 0x38, 0xe0, 0x0, + 0x1, 0xf5, 0x8e, 0x0, 0x0, 0x3f, 0x38, 0xe0, + 0x1, 0x4d, 0xd0, 0x8f, 0xff, 0xff, 0xc2, 0x8, + 0xe3, 0x33, 0xda, 0x0, 0x8e, 0x0, 0x2, 0xf6, + 0x8, 0xe0, 0x0, 0x5, 0xf3, + + /* U+0053 "S" */ + 0x1, 0x9e, 0xfd, 0xa2, 0x0, 0xce, 0x64, 0x6b, + 0x70, 0x2f, 0x40, 0x0, 0x0, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x6, 0xfd, 0x95, 0x0, 0x0, 0x1, + 0x6a, 0xee, 0x50, 0x0, 0x0, 0x0, 0x9f, 0x0, + 0x20, 0x0, 0x5, 0xf1, 0x3f, 0xa5, 0x47, 0xeb, + 0x0, 0x4b, 0xef, 0xe9, 0x10, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xff, 0x24, 0x44, 0xbd, 0x44, + 0x40, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, 0x9c, + 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, + 0x9c, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, + 0x0, 0x9c, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, + 0x0, 0x0, 0x9c, 0x0, 0x0, + + /* U+0055 "U" */ + 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, 0x0, 0x0, + 0xba, 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, 0x0, + 0x0, 0xba, 0x9c, 0x0, 0x0, 0xb, 0xa9, 0xc0, + 0x0, 0x0, 0xba, 0x8e, 0x0, 0x0, 0xd, 0x94, + 0xf4, 0x0, 0x3, 0xf5, 0xc, 0xf8, 0x68, 0xfd, + 0x0, 0x9, 0xef, 0xe9, 0x10, + + /* U+0056 "V" */ + 0xc, 0xb0, 0x0, 0x0, 0xa, 0xc0, 0x5f, 0x20, + 0x0, 0x1, 0xf5, 0x0, 0xe9, 0x0, 0x0, 0x8e, + 0x0, 0x8, 0xf0, 0x0, 0xe, 0x70, 0x0, 0x1f, + 0x60, 0x5, 0xf1, 0x0, 0x0, 0xad, 0x0, 0xc9, + 0x0, 0x0, 0x3, 0xf4, 0x3f, 0x30, 0x0, 0x0, + 0xc, 0xba, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, + + /* U+0057 "W" */ + 0x6f, 0x10, 0x0, 0xd, 0xb0, 0x0, 0x2, 0xf2, + 0x1f, 0x60, 0x0, 0x3f, 0xf1, 0x0, 0x8, 0xd0, + 0xb, 0xb0, 0x0, 0x8b, 0xe6, 0x0, 0xd, 0x70, + 0x6, 0xf0, 0x0, 0xe6, 0x9b, 0x0, 0x2f, 0x20, + 0x1, 0xf5, 0x3, 0xf1, 0x4f, 0x10, 0x8d, 0x0, + 0x0, 0xca, 0x9, 0xb0, 0xe, 0x60, 0xd8, 0x0, + 0x0, 0x6f, 0xe, 0x60, 0x9, 0xb2, 0xf3, 0x0, + 0x0, 0x1f, 0x9f, 0x10, 0x4, 0xf9, 0xd0, 0x0, + 0x0, 0xc, 0xfb, 0x0, 0x0, 0xef, 0x80, 0x0, + 0x0, 0x7, 0xf6, 0x0, 0x0, 0x9f, 0x30, 0x0, + + /* U+0058 "X" */ + 0x3f, 0x50, 0x0, 0xd, 0xa0, 0x8, 0xf2, 0x0, + 0x9d, 0x0, 0x0, 0xcc, 0x4, 0xf3, 0x0, 0x0, + 0x2f, 0x9e, 0x70, 0x0, 0x0, 0x6, 0xfc, 0x0, + 0x0, 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, 0x4f, + 0x4d, 0xb0, 0x0, 0x1, 0xe8, 0x2, 0xf7, 0x0, + 0xb, 0xd0, 0x0, 0x7f, 0x20, 0x7f, 0x20, 0x0, + 0xb, 0xd0, + + /* U+0059 "Y" */ + 0xc, 0xb0, 0x0, 0x0, 0x9c, 0x0, 0x2f, 0x50, + 0x0, 0x2f, 0x30, 0x0, 0x9e, 0x0, 0xc, 0x90, + 0x0, 0x0, 0xe8, 0x5, 0xf1, 0x0, 0x0, 0x5, + 0xf3, 0xe6, 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0x40, 0x0, 0x0, 0x0, + 0x2, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xf3, 0x0, 0x0, + + /* U+005A "Z" */ + 0x4f, 0xff, 0xff, 0xff, 0x91, 0x44, 0x44, 0x4a, + 0xf3, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x1, + 0xea, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, + 0x9e, 0x10, 0x0, 0x0, 0x6f, 0x40, 0x0, 0x0, + 0x3f, 0x70, 0x0, 0x0, 0x1e, 0xd4, 0x44, 0x44, + 0x36, 0xff, 0xff, 0xff, 0xfc, + + /* U+005B "[" */ + 0x8f, 0xf6, 0x8d, 0x31, 0x8d, 0x0, 0x8d, 0x0, + 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, + 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, 0x8d, 0x0, + 0x8d, 0x31, 0x8f, 0xf6, + + /* U+005C "\\" */ + 0x5d, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0xb, + 0x80, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x1, 0xf2, + 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x6d, 0x0, + 0x0, 0x1, 0xf2, 0x0, 0x0, 0xb, 0x70, 0x0, + 0x0, 0x6d, 0x0, 0x0, 0x1, 0xf2, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x1, + 0xf2, + + /* U+005D "]" */ + 0xbf, 0xf3, 0x25, 0xf3, 0x2, 0xf3, 0x2, 0xf3, + 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, + 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, 0x2, 0xf3, + 0x25, 0xf3, 0xbf, 0xf3, + + /* U+005E "^" */ + 0x0, 0xad, 0x0, 0x0, 0x1e, 0xc4, 0x0, 0x8, + 0x85, 0xa0, 0x0, 0xe2, 0xe, 0x10, 0x5b, 0x0, + 0x97, 0xb, 0x50, 0x2, 0xe0, + + /* U+005F "_" */ + 0xee, 0xee, 0xee, 0xe0, + + /* U+0060 "`" */ + 0xb, 0xc0, 0x0, 0x9, 0xb0, + + /* U+0061 "a" */ + 0x4, 0xcf, 0xea, 0x10, 0xb, 0x74, 0x5d, 0xb0, + 0x0, 0x0, 0x4, 0xf0, 0x4, 0xce, 0xee, 0xf2, + 0x1f, 0x82, 0x14, 0xf2, 0x4f, 0x10, 0x4, 0xf2, + 0x1f, 0x70, 0x3d, 0xf2, 0x4, 0xdf, 0xd7, 0xf2, + + /* U+0062 "b" */ + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x8e, 0xfc, 0x30, + 0xbf, 0xd5, 0x4b, 0xf3, 0xbe, 0x10, 0x0, 0xca, + 0xba, 0x0, 0x0, 0x7e, 0xba, 0x0, 0x0, 0x7e, + 0xbe, 0x10, 0x0, 0xca, 0xbf, 0xd5, 0x5b, 0xf3, + 0xb9, 0x8e, 0xfc, 0x30, + + /* U+0063 "c" */ + 0x0, 0x7d, 0xfd, 0x60, 0x9, 0xf7, 0x48, 0xf4, + 0x2f, 0x50, 0x0, 0x20, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x2f, 0x50, 0x0, 0x20, + 0x9, 0xf7, 0x48, 0xf4, 0x0, 0x7d, 0xfd, 0x60, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, 0x1, + 0xf4, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x8, 0xef, + 0xc4, 0xf4, 0xa, 0xf7, 0x48, 0xff, 0x42, 0xf5, + 0x0, 0x7, 0xf4, 0x5f, 0x0, 0x0, 0x2f, 0x45, + 0xf0, 0x0, 0x1, 0xf4, 0x2f, 0x50, 0x0, 0x6f, + 0x40, 0xae, 0x63, 0x7e, 0xf4, 0x0, 0x8e, 0xfc, + 0x4f, 0x40, + + /* U+0065 "e" */ + 0x0, 0x8e, 0xfc, 0x40, 0xa, 0xd5, 0x38, 0xf4, + 0x2f, 0x20, 0x0, 0x8c, 0x5f, 0xee, 0xee, 0xff, + 0x5f, 0x21, 0x11, 0x11, 0x2f, 0x70, 0x0, 0x10, + 0x9, 0xf8, 0x46, 0xe4, 0x0, 0x7d, 0xfe, 0x80, + + /* U+0066 "f" */ + 0x0, 0x9e, 0xe3, 0x5, 0xf4, 0x41, 0x8, 0xc0, + 0x0, 0xcf, 0xff, 0xf0, 0x29, 0xd3, 0x20, 0x8, + 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, + 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x7e, 0xfc, 0x4e, 0x60, 0xaf, 0x74, 0x7f, + 0xf6, 0x2f, 0x50, 0x0, 0x5f, 0x65, 0xf0, 0x0, + 0x0, 0xf6, 0x5f, 0x0, 0x0, 0xf, 0x62, 0xf6, + 0x0, 0x6, 0xf6, 0x9, 0xf7, 0x47, 0xff, 0x50, + 0x7, 0xef, 0xc4, 0xf5, 0x0, 0x0, 0x0, 0x3f, + 0x20, 0xcb, 0x64, 0x6e, 0xb0, 0x3, 0xae, 0xfd, + 0x80, 0x0, + + /* U+0068 "h" */ + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x8e, 0xfb, 0x20, + 0xbf, 0xc5, 0x6d, 0xd0, 0xbe, 0x0, 0x3, 0xf2, + 0xba, 0x0, 0x0, 0xf4, 0xba, 0x0, 0x0, 0xf5, + 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, + 0xba, 0x0, 0x0, 0xf5, + + /* U+0069 "i" */ + 0xba, 0xa8, 0x0, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, + + /* U+006A "j" */ + 0x0, 0xa, 0xb0, 0x0, 0x99, 0x0, 0x0, 0x0, + 0x0, 0xab, 0x0, 0xa, 0xb0, 0x0, 0xab, 0x0, + 0xa, 0xb0, 0x0, 0xab, 0x0, 0xa, 0xb0, 0x0, + 0xab, 0x0, 0xa, 0xb0, 0x0, 0xaa, 0x6, 0x4e, + 0x71, 0xdf, 0xa0, + + /* U+006B "k" */ + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x1c, 0xc0, + 0xba, 0x1, 0xcc, 0x0, 0xba, 0x1c, 0xd1, 0x0, + 0xbb, 0xcf, 0x60, 0x0, 0xbf, 0xdb, 0xe1, 0x0, + 0xbd, 0x11, 0xdc, 0x0, 0xba, 0x0, 0x3f, 0x70, + 0xba, 0x0, 0x7, 0xf3, + + /* U+006C "l" */ + 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, + + /* U+006D "m" */ + 0xb9, 0x9e, 0xfa, 0x15, 0xdf, 0xd4, 0xb, 0xfb, + 0x45, 0xed, 0xe6, 0x4a, 0xf2, 0xbe, 0x0, 0x6, + 0xf6, 0x0, 0xe, 0x7b, 0xa0, 0x0, 0x4f, 0x20, + 0x0, 0xc9, 0xba, 0x0, 0x3, 0xf1, 0x0, 0xc, + 0x9b, 0xa0, 0x0, 0x3f, 0x10, 0x0, 0xc9, 0xba, + 0x0, 0x3, 0xf1, 0x0, 0xc, 0x9b, 0xa0, 0x0, + 0x3f, 0x10, 0x0, 0xc9, + + /* U+006E "n" */ + 0xb9, 0x9e, 0xfb, 0x20, 0xbf, 0xb4, 0x5d, 0xd0, + 0xbe, 0x0, 0x3, 0xf2, 0xba, 0x0, 0x0, 0xf4, + 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, + 0xba, 0x0, 0x0, 0xf5, 0xba, 0x0, 0x0, 0xf5, + + /* U+006F "o" */ + 0x0, 0x7d, 0xfd, 0x60, 0x0, 0x9f, 0x74, 0x8f, + 0x70, 0x2f, 0x50, 0x0, 0x7f, 0x5, 0xf0, 0x0, + 0x1, 0xf3, 0x5f, 0x0, 0x0, 0x2f, 0x32, 0xf5, + 0x0, 0x7, 0xf0, 0x9, 0xf7, 0x48, 0xf7, 0x0, + 0x7, 0xdf, 0xd6, 0x0, + + /* U+0070 "p" */ + 0xb9, 0x8e, 0xfc, 0x30, 0xbf, 0xc4, 0x3a, 0xf3, + 0xbe, 0x10, 0x0, 0xca, 0xba, 0x0, 0x0, 0x7e, + 0xba, 0x0, 0x0, 0x7e, 0xbe, 0x10, 0x0, 0xca, + 0xbf, 0xd5, 0x5b, 0xf3, 0xba, 0x7e, 0xfc, 0x30, + 0xba, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x8e, 0xfc, 0x3f, 0x40, 0xaf, 0x74, 0x8e, + 0xf4, 0x2f, 0x50, 0x0, 0x7f, 0x45, 0xf0, 0x0, + 0x1, 0xf4, 0x5f, 0x0, 0x0, 0x2f, 0x42, 0xf5, + 0x0, 0x7, 0xf4, 0xa, 0xf7, 0x48, 0xff, 0x40, + 0x8, 0xef, 0xc4, 0xf4, 0x0, 0x0, 0x0, 0x1f, + 0x40, 0x0, 0x0, 0x1, 0xf4, 0x0, 0x0, 0x0, + 0x1f, 0x40, + + /* U+0072 "r" */ + 0xb9, 0x8e, 0x4b, 0xfd, 0x71, 0xbe, 0x10, 0xb, + 0xb0, 0x0, 0xba, 0x0, 0xb, 0xa0, 0x0, 0xba, + 0x0, 0xb, 0xa0, 0x0, + + /* U+0073 "s" */ + 0x5, 0xdf, 0xea, 0x13, 0xf7, 0x35, 0xa0, 0x6f, + 0x0, 0x0, 0x1, 0xee, 0x96, 0x10, 0x1, 0x6a, + 0xef, 0x30, 0x0, 0x0, 0xd9, 0x6c, 0x64, 0x6f, + 0x62, 0xae, 0xfd, 0x70, + + /* U+0074 "t" */ + 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, 0xcf, 0xff, + 0xf0, 0x29, 0xd3, 0x20, 0x8, 0xd0, 0x0, 0x8, + 0xd0, 0x0, 0x8, 0xd0, 0x0, 0x8, 0xd0, 0x0, + 0x5, 0xf5, 0x51, 0x0, 0x9f, 0xe3, + + /* U+0075 "u" */ + 0xc8, 0x0, 0x2, 0xf3, 0xc8, 0x0, 0x2, 0xf3, + 0xc8, 0x0, 0x2, 0xf3, 0xc8, 0x0, 0x2, 0xf3, + 0xc9, 0x0, 0x3, 0xf3, 0xab, 0x0, 0x7, 0xf3, + 0x5f, 0x83, 0x7e, 0xf3, 0x6, 0xdf, 0xc5, 0xf3, + + /* U+0076 "v" */ + 0xd, 0x90, 0x0, 0xa, 0xa0, 0x6e, 0x0, 0x1, + 0xf3, 0x0, 0xf5, 0x0, 0x7d, 0x0, 0x9, 0xc0, + 0xe, 0x60, 0x0, 0x3f, 0x24, 0xf0, 0x0, 0x0, + 0xc8, 0xb9, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, + 0x0, 0xf, 0xc0, 0x0, + + /* U+0077 "w" */ + 0xc8, 0x0, 0x6, 0xf1, 0x0, 0xd, 0x56, 0xd0, + 0x0, 0xcf, 0x60, 0x3, 0xf0, 0x1f, 0x30, 0x2f, + 0x9c, 0x0, 0x9a, 0x0, 0xb8, 0x7, 0xb2, 0xf1, + 0xe, 0x40, 0x5, 0xe0, 0xd6, 0xc, 0x74, 0xe0, + 0x0, 0xf, 0x6f, 0x0, 0x7c, 0x99, 0x0, 0x0, + 0xaf, 0xa0, 0x1, 0xff, 0x40, 0x0, 0x5, 0xf4, + 0x0, 0xb, 0xe0, 0x0, + + /* U+0078 "x" */ + 0x4f, 0x30, 0x7, 0xe1, 0x9, 0xd0, 0x2f, 0x40, + 0x0, 0xd9, 0xd9, 0x0, 0x0, 0x3f, 0xd0, 0x0, + 0x0, 0x4f, 0xe1, 0x0, 0x1, 0xe7, 0xbb, 0x0, + 0xb, 0xb0, 0x1e, 0x70, 0x7e, 0x10, 0x5, 0xf3, + + /* U+0079 "y" */ + 0xd, 0x90, 0x0, 0xa, 0xa0, 0x6f, 0x0, 0x1, + 0xf3, 0x0, 0xf6, 0x0, 0x7d, 0x0, 0x9, 0xc0, + 0xd, 0x60, 0x0, 0x2f, 0x34, 0xf0, 0x0, 0x0, + 0xc9, 0xa9, 0x0, 0x0, 0x5, 0xff, 0x20, 0x0, + 0x0, 0xe, 0xc0, 0x0, 0x0, 0x0, 0xe5, 0x0, + 0x0, 0x94, 0xad, 0x0, 0x0, 0x1b, 0xfc, 0x20, + 0x0, 0x0, + + /* U+007A "z" */ + 0x5f, 0xff, 0xff, 0xa1, 0x33, 0x37, 0xf4, 0x0, + 0x1, 0xe7, 0x0, 0x0, 0xcb, 0x0, 0x0, 0x8e, + 0x10, 0x0, 0x4f, 0x40, 0x0, 0x1e, 0xa3, 0x33, + 0x26, 0xff, 0xff, 0xfc, + + /* U+007B "{" */ + 0x0, 0x6e, 0xa0, 0xf, 0x92, 0x1, 0xf4, 0x0, + 0x1f, 0x40, 0x1, 0xf4, 0x0, 0x3f, 0x30, 0x3f, + 0xc0, 0x0, 0x6f, 0x30, 0x1, 0xf4, 0x0, 0x1f, + 0x40, 0x1, 0xf4, 0x0, 0x1f, 0x40, 0x0, 0xfa, + 0x20, 0x5, 0xea, + + /* U+007C "|" */ + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + + /* U+007D "}" */ + 0xbe, 0x50, 0x2, 0xae, 0x0, 0x5, 0xf0, 0x0, + 0x5f, 0x0, 0x5, 0xf0, 0x0, 0x4f, 0x10, 0x0, + 0xdf, 0x10, 0x4f, 0x50, 0x5, 0xf0, 0x0, 0x5f, + 0x0, 0x5, 0xf0, 0x0, 0x5f, 0x0, 0x2a, 0xe0, + 0xb, 0xe4, 0x0, + + /* U+007E "~" */ + 0x7, 0xec, 0x40, 0xb4, 0x1e, 0x25, 0xdf, 0xc0, + 0x1, 0x0, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x4, 0xcc, 0x30, 0x2b, 0x1, 0xc0, 0x57, 0x0, + 0x93, 0x2b, 0x1, 0xc0, 0x5, 0xcc, 0x30, + + /* U+2022 "•" */ + 0x6, 0xa1, 0xf, 0xf6, 0xb, 0xe2, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xfb, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xd0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xd0, 0x0, 0xa, + 0xff, 0xff, 0xb6, 0x10, 0xed, 0x0, 0x0, 0xaf, + 0x94, 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, + 0x0, 0x0, 0x0, 0xed, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, 0x0, + 0x0, 0x45, 0xfd, 0x0, 0x0, 0xaf, 0x10, 0x1, + 0xef, 0xff, 0xd0, 0x17, 0x9d, 0xf1, 0x0, 0x5f, + 0xff, 0xfc, 0xe, 0xff, 0xff, 0x10, 0x0, 0xaf, + 0xfd, 0x31, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1, + 0x0, 0x3, 0xbd, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x50, 0x18, 0x88, 0x88, 0x88, 0x84, 0x5, 0xfa, + 0xbf, 0xdd, 0xdd, 0xdd, 0xfd, 0xaf, 0xe4, 0x7f, + 0x10, 0x0, 0x0, 0xca, 0x4e, 0xe0, 0x4f, 0x10, + 0x0, 0x0, 0xc8, 0xe, 0xfe, 0xef, 0x10, 0x0, + 0x0, 0xcf, 0xef, 0xe0, 0x3f, 0xee, 0xee, 0xee, + 0xf8, 0xe, 0xf6, 0x8f, 0x76, 0x66, 0x66, 0xeb, + 0x6f, 0xf8, 0xaf, 0x10, 0x0, 0x0, 0xcc, 0x8f, + 0xe0, 0x3f, 0x10, 0x0, 0x0, 0xc8, 0xe, 0xfc, + 0xdf, 0x65, 0x55, 0x55, 0xee, 0xcf, 0xc2, 0x5f, + 0xff, 0xff, 0xff, 0xf9, 0x2c, + + /* U+F00B "" */ + 0x57, 0x75, 0x5, 0x77, 0x77, 0x77, 0x75, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xe, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0x10, 0x0, 0x11, + 0x11, 0x11, 0x10, 0xef, 0xfe, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x68, 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0x68, + 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xe2, 0x2d, 0x60, 0x0, 0x1, + 0xdf, 0xfe, 0x20, 0xdf, 0xf7, 0x0, 0x1d, 0xff, + 0xe2, 0x0, 0x8f, 0xff, 0x71, 0xdf, 0xfe, 0x20, + 0x0, 0x8, 0xff, 0xfe, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0x20, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, + 0xb, 0xe2, 0xef, 0xf6, 0x0, 0xbf, 0xf8, 0x4f, + 0xff, 0x6b, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, 0xbf, + 0xff, 0xf6, 0x0, 0xb, 0xff, 0xdf, 0xff, 0x60, + 0xbf, 0xfd, 0x14, 0xff, 0xf5, 0xcf, 0xd1, 0x0, + 0x4f, 0xf6, 0x17, 0x10, 0x0, 0x3, 0x60, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0x21, 0xff, 0x12, 0xf7, 0x0, 0x6, 0xff, 0x61, + 0xff, 0x16, 0xff, 0x60, 0x1f, 0xf9, 0x1, 0xff, + 0x10, 0x9f, 0xf1, 0x6f, 0xe0, 0x1, 0xff, 0x10, + 0xe, 0xf6, 0xaf, 0x80, 0x1, 0xff, 0x10, 0x8, + 0xfa, 0xcf, 0x60, 0x1, 0xff, 0x10, 0x6, 0xfc, + 0xaf, 0x80, 0x0, 0xaa, 0x0, 0x8, 0xfb, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xf7, 0x1f, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x7, 0xff, 0x91, + 0x0, 0x2a, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xee, + 0xff, 0xf9, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, + 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xd6, 0xdf, + 0xff, 0xfd, 0x6d, 0x30, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xaa, 0xff, + 0xff, 0xf5, 0x1a, 0xff, 0xf4, 0x0, 0x4f, 0xff, + 0xa1, 0x3, 0xff, 0xd0, 0x0, 0xd, 0xff, 0x30, + 0x4, 0xff, 0xf0, 0x0, 0xf, 0xff, 0x40, 0x4f, + 0xff, 0xfb, 0x22, 0xbf, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9, 0xfe, 0xff, + 0xff, 0xff, 0xef, 0x90, 0x0, 0x50, 0x5e, 0xff, + 0xe5, 0x5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x77, 0x40, 0x0, + 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x3, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0xd, 0xf5, 0x0, + 0x0, 0x0, 0x1b, 0xfd, 0xff, 0x8d, 0xf5, 0x0, + 0x0, 0x2, 0xdf, 0xb1, 0x2d, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xf8, 0x3e, 0xc2, 0xbf, 0xf5, 0x0, + 0x7, 0xff, 0x55, 0xff, 0xfe, 0x39, 0xfe, 0x40, + 0x9f, 0xe3, 0x8f, 0xff, 0xff, 0xf5, 0x6f, 0xf6, + 0xac, 0x2a, 0xff, 0xff, 0xff, 0xff, 0x73, 0xe6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x6f, 0xff, 0xd7, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x4f, 0xff, 0x70, 0xb, 0xff, 0xe1, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x0, 0x79, 0x99, + 0x82, 0xde, 0x28, 0x99, 0x97, 0xff, 0xff, 0xfb, + 0x22, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, + + /* U+F01C "" */ + 0x0, 0x6, 0xbb, 0xbb, 0xbb, 0xba, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x6, 0xfb, 0x0, + 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, + 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, + 0xdf, 0x84, 0x42, 0x0, 0x0, 0x34, 0x4b, 0xf9, + 0xff, 0xff, 0xfd, 0x0, 0x1, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0x98, 0x8b, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, + 0x1, 0x8d, 0xff, 0xc6, 0x0, 0xef, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xe4, 0xdf, 0x4, 0xff, 0xb3, + 0x0, 0x4c, 0xff, 0xff, 0xe, 0xf9, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x6f, 0xc0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x8e, 0x50, 0x0, 0x1, 0xde, 0xee, + 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x21, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x8, 0xf8, 0xff, 0xfb, + 0xbc, 0x10, 0x0, 0x1e, 0xf4, 0xff, 0xfc, 0x10, + 0x0, 0x1, 0xdf, 0xc0, 0xfe, 0xef, 0xe8, 0x44, + 0x8e, 0xfe, 0x10, 0xfe, 0x1a, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0xfd, 0x0, 0x28, 0xbb, 0x94, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x2, 0x70, 0x0, 0x2, 0xef, 0x0, + 0x2, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0x47, 0xff, 0xf0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x2, 0x20, 0xff, 0xff, + 0xff, 0xf0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0x0, + 0xe7, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x5f, 0xff, + 0xff, 0xff, 0x8, 0x90, 0x34, 0x47, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x0, + 0x0, 0x0, 0x2, 0x70, 0x0, 0x5, 0xfa, 0x0, + 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x81, 0x4f, 0x60, + 0x0, 0x2, 0xef, 0xf0, 0x1, 0xdd, 0x7, 0xf0, + 0xdf, 0xff, 0xff, 0xf0, 0x32, 0x1e, 0x80, 0xf6, + 0xff, 0xff, 0xff, 0xf0, 0x8e, 0x27, 0xe0, 0xb9, + 0xff, 0xff, 0xff, 0xf0, 0xe, 0x73, 0xf1, 0x9b, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x54, 0xf0, 0x9a, + 0xff, 0xff, 0xff, 0xf0, 0x89, 0xa, 0xc0, 0xd8, + 0x34, 0x47, 0xff, 0xf0, 0x0, 0x7f, 0x43, 0xf3, + 0x0, 0x0, 0x5f, 0xf0, 0x2, 0xf6, 0xc, 0xb0, + 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0xbf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + + /* U+F03E "" */ + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0x32, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x7f, + 0xff, 0xfd, 0xff, 0xff, 0xfd, 0x10, 0xcf, 0xff, + 0xa0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x7, 0xff, 0xff, 0xf3, 0x5f, 0xa0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x3, 0x0, 0x0, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F043 "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xfa, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x6f, 0xff, 0xf1, + 0x0, 0x1, 0xef, 0xff, 0xfa, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xe0, + 0xcf, 0xff, 0xff, 0xff, 0xf6, 0xfe, 0xbf, 0xff, + 0xff, 0xf9, 0xfd, 0x4f, 0xff, 0xff, 0xf9, 0xbf, + 0x49, 0xff, 0xff, 0xf5, 0x3f, 0xe5, 0x2e, 0xff, + 0xd0, 0x6, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x28, + 0xba, 0x60, 0x0, + + /* U+F048 "" */ + 0x4, 0x30, 0x0, 0x0, 0x31, 0x1f, 0xe0, 0x0, + 0x6, 0xf9, 0x1f, 0xe0, 0x0, 0x7f, 0xfa, 0x1f, + 0xe0, 0x9, 0xff, 0xfa, 0x1f, 0xe0, 0xaf, 0xff, + 0xfa, 0x1f, 0xeb, 0xff, 0xff, 0xfa, 0x1f, 0xff, + 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x1f, 0xe6, 0xff, 0xff, 0xfa, 0x1f, 0xe0, 0x5f, + 0xff, 0xfa, 0x1f, 0xe0, 0x4, 0xff, 0xfa, 0x1f, + 0xe0, 0x0, 0x3e, 0xfa, 0xf, 0xd0, 0x0, 0x2, + 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xf, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "" */ + 0x14, 0x44, 0x20, 0x1, 0x44, 0x42, 0xd, 0xff, + 0xff, 0x10, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0x3f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0x30, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xc0, 0x9, 0xff, 0xfc, 0x0, + + /* U+F04D "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x42, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, + + /* U+F051 "" */ + 0x2, 0x10, 0x0, 0x0, 0x42, 0xf, 0xe2, 0x0, + 0x3, 0xfb, 0xf, 0xfe, 0x30, 0x4, 0xfb, 0xf, + 0xff, 0xf4, 0x4, 0xfb, 0xf, 0xff, 0xff, 0x54, + 0xfb, 0xf, 0xff, 0xff, 0xfa, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0xf, 0xff, 0xff, 0xd6, 0xfb, 0xf, 0xff, 0xfd, + 0x14, 0xfb, 0xf, 0xff, 0xc1, 0x4, 0xfb, 0xf, + 0xfb, 0x0, 0x4, 0xfb, 0xc, 0xa0, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x3, 0x99, 0x99, 0x99, 0x99, 0x99, 0x50, 0x5, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0x90, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xa4, 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x10, 0x0, + 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x3f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x7, 0x80, + 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, + 0x6, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x80, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x3f, 0xf7, + 0x11, 0x10, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xd3, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x69, 0x99, 0x99, 0x99, 0x99, 0x98, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xfe, 0xef, 0xf9, 0x10, 0x0, + 0x0, 0x7f, 0xfa, 0x10, 0x3, 0xdf, 0xe4, 0x0, + 0x8, 0xff, 0xa0, 0x9, 0xb4, 0x1e, 0xff, 0x50, + 0x4f, 0xff, 0x20, 0xb, 0xff, 0x26, 0xff, 0xe1, + 0xef, 0xff, 0x9, 0xcf, 0xff, 0x63, 0xff, 0xfa, + 0xbf, 0xff, 0x9, 0xff, 0xff, 0x54, 0xff, 0xf6, + 0x1e, 0xff, 0x51, 0xdf, 0xfb, 0x9, 0xff, 0xb0, + 0x3, 0xef, 0xe2, 0x4, 0x30, 0x5f, 0xfc, 0x10, + 0x0, 0x2c, 0xff, 0x95, 0x6a, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x49, 0xdf, 0xfd, 0x92, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x14, 0x66, 0x40, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xac, 0xff, 0xef, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xa1, + 0x0, 0x4d, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, + 0xf5, 0xab, 0x31, 0xef, 0xf4, 0x0, 0x7, 0xb1, + 0x5, 0xff, 0xff, 0xe1, 0x7f, 0xfe, 0x10, 0xf, + 0xfe, 0x30, 0x2d, 0xff, 0xf5, 0x4f, 0xff, 0x90, + 0xc, 0xff, 0xe0, 0x0, 0xaf, 0xf6, 0x5f, 0xff, + 0x60, 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xef, + 0xfb, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x3e, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xdf, 0xe8, 0x54, + 0x1, 0xbf, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xae, + 0xff, 0x60, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa1, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, + 0xf, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x9b, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, + 0xff, 0xb0, 0xe, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0xff, 0xfe, 0x24, 0xff, 0xff, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x6, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x30, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x80, 0xdd, 0xdb, + 0x0, 0x0, 0x8d, 0xef, 0xf8, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xfd, 0x55, 0x6f, 0xf4, 0x6f, + 0xf8, 0xaf, 0xe2, 0x0, 0x5, 0x74, 0xff, 0x90, + 0x7e, 0x20, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xb2, 0x50, 0x4a, 0x0, + 0x1, 0x2e, 0xfd, 0x1d, 0xf4, 0x8f, 0xb0, 0xff, + 0xff, 0xd1, 0xb, 0xff, 0xff, 0xfb, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xfb, 0x12, 0x21, 0x0, + 0x0, 0x2, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0x95, 0xff, + 0xb0, 0x0, 0x8, 0xff, 0x90, 0x5, 0xff, 0xb0, + 0x7, 0xff, 0x90, 0x0, 0x5, 0xff, 0xb0, 0x9f, + 0x90, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x40, 0x0, + 0x0, 0x0, 0x3, 0x10, + + /* U+F078 "" */ + 0x4c, 0x20, 0x0, 0x0, 0x0, 0xb6, 0xb, 0xfe, + 0x20, 0x0, 0x0, 0xcf, 0xf0, 0x2e, 0xfe, 0x20, + 0x0, 0xcf, 0xf4, 0x0, 0x2e, 0xfe, 0x20, 0xcf, + 0xf4, 0x0, 0x0, 0x2e, 0xfe, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf3, 0x8, 0xbb, 0xbb, 0xbb, + 0x90, 0x0, 0xb, 0xff, 0xff, 0x39, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x8f, 0xcf, 0xcf, 0xf0, 0x0, + 0x0, 0xa, 0xf1, 0x0, 0x38, 0x2f, 0x94, 0x80, + 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, 0x90, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, + 0x90, 0x0, 0x0, 0x3, 0xa, 0xf1, 0x30, 0x0, + 0x2f, 0x90, 0x0, 0x0, 0x1f, 0xcb, 0xf8, 0xf8, + 0x0, 0x2f, 0xeb, 0xbb, 0xbb, 0x39, 0xff, 0xff, + 0xe2, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x9f, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xd1, 0x0, + + /* U+F07B "" */ + 0x37, 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0xcc, 0xcc, 0xb6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x1, 0x1c, 0xff, 0xc1, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x79, 0x99, + 0x3b, 0xff, 0xb3, 0x99, 0x97, 0xff, 0xff, 0xb2, + 0x44, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf3, 0x0, 0x0, 0x4a, 0x30, 0x2, + 0xdf, 0xf8, 0x0, 0x5, 0xdf, 0xfe, 0x15, 0xef, + 0xfb, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x2, 0xba, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x4, 0x86, 0x0, 0x0, 0x0, 0x10, 0x6, 0xff, + 0xfa, 0x0, 0x2, 0xdf, 0xd1, 0xef, 0x3c, 0xf1, + 0x1, 0xdf, 0xfa, 0xe, 0xe0, 0xaf, 0x21, 0xdf, + 0xfa, 0x0, 0x9f, 0xef, 0xf6, 0xdf, 0xfa, 0x0, + 0x0, 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x48, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0xff, + 0xf6, 0x0, 0xe, 0xf3, 0xcf, 0x23, 0xff, 0xf6, + 0x0, 0xee, 0xa, 0xf2, 0x4, 0xff, 0xf6, 0x9, + 0xfe, 0xfc, 0x0, 0x4, 0xff, 0xf1, 0x8, 0xda, + 0x10, 0x0, 0x2, 0x62, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf9, 0x87, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x98, 0xf7, 0x8, 0xa6, 0x8f, 0xff, 0xf9, + 0x59, 0x90, 0xff, 0xa8, 0xff, 0xff, 0xfc, 0xcc, + 0xf, 0xfa, 0x8f, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfa, 0x8f, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xa8, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xfa, 0x8f, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe3, + 0x12, 0x22, 0x22, 0x21, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0xac, 0xcc, 0xcc, 0xcb, 0x50, + 0x0, 0x0, + + /* U+F0C7 "" */ + 0x49, 0x99, 0x99, 0x99, 0x95, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xfd, 0x22, 0x22, + 0x22, 0x4f, 0xf6, 0xf, 0xc0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x6f, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xdc, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x5, + 0xff, 0xff, 0x6f, 0xff, 0xf6, 0x0, 0xf, 0xff, + 0xf6, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xf6, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, + + /* U+F0C9 "" */ + 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xde, + 0xee, 0xee, 0xee, 0xee, 0xee, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0xd2, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x2d, 0xff, 0x64, 0xef, 0xff, 0xfe, + 0x45, 0xff, 0xff, 0xfa, 0x2b, 0xff, 0xb2, 0xaf, + 0xff, 0xff, 0xff, 0xd3, 0x55, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0xa, 0xff, 0xff, 0xaa, 0xa6, 0xc, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xe1, + 0xb, 0xdd, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0x3, + 0xc0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0x55, + 0xef, 0xb5, 0x52, 0x0, 0x0, 0xff, 0xfd, 0x1f, + 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0x53, 0x33, 0x20, 0x0, + 0xf, 0xff, 0x97, 0xff, 0xfb, 0x57, 0x0, 0xff, + 0xf8, 0xaf, 0xff, 0xc6, 0xf8, 0xf, 0xff, 0x8a, + 0xff, 0xfc, 0x4a, 0xa1, 0xff, 0xf8, 0xaf, 0xff, + 0xe3, 0x22, 0xf, 0xff, 0x8a, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xf8, 0xaf, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0x8a, 0xff, 0xff, 0xff, 0xf4, 0x35, 0x52, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfe, 0x20, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xfa, 0x30, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x8, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa2, 0x0, + 0x0, 0x0, + + /* U+F11C "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xfc, 0xc, 0x30, 0xe1, 0x1d, 0xd, 0x11, 0xfc, + 0xfc, 0xb, 0x30, 0xe0, 0x1d, 0xd, 0x10, 0xfc, + 0xff, 0xfe, 0xff, 0xef, 0xfe, 0xfe, 0xef, 0xfc, + 0xff, 0xf1, 0x5a, 0x8, 0x70, 0xa0, 0x5f, 0xfc, + 0xff, 0xf3, 0x7b, 0x29, 0x92, 0xc2, 0x7f, 0xfc, + 0xff, 0xbf, 0xcb, 0xbb, 0xbb, 0xbf, 0xcb, 0xfc, + 0xfc, 0xb, 0x20, 0x0, 0x0, 0xd, 0x0, 0xfc, + 0xff, 0xcf, 0xcc, 0xcc, 0xcc, 0xcf, 0xcc, 0xfb, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x4, 0x9a, 0xaa, 0xaf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xb3, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x35, 0x55, 0x55, 0x2, 0x0, 0xf, 0xff, 0xff, + 0xf2, 0xf4, 0x0, 0xff, 0xff, 0xff, 0x2f, 0xf4, + 0xf, 0xff, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0x32, 0x22, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8a, 0xaa, 0xaa, + 0xaa, 0xaa, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x24, 0x55, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc7, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0xde, 0xff, + 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xb5, 0x10, 0x0, + 0x3, 0x8e, 0xff, 0xb0, 0xdf, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x18, 0x0, 0x5, + 0xae, 0xfe, 0xc8, 0x10, 0x4, 0x60, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x95, 0x34, 0x7d, 0xff, 0x40, 0x0, + 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x96, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xda, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2c, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x21, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x27, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F241 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x21, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x66, 0x63, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F242 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x10, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x50, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F243 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x10, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F244 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa9, 0x3d, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0x40, 0x2, 0xe0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0xb, 0x60, + 0x0, 0x0, 0x0, 0x6c, 0x30, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xf9, + 0x0, 0xc, 0x50, 0x0, 0x0, 0x6d, 0x40, 0x5, + 0x50, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc4, 0x3e, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xef, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xb3, 0x0, 0x0, 0xaf, 0xfd, 0x8f, + 0xff, 0x20, 0x4, 0xff, 0xfd, 0x9, 0xff, 0xb0, + 0xa, 0xfe, 0xfd, 0x12, 0xaf, 0xf0, 0xe, 0xf5, + 0x5d, 0x2c, 0xe, 0xf3, 0xf, 0xff, 0x33, 0x12, + 0x9f, 0xf5, 0xf, 0xff, 0xf3, 0x7, 0xff, 0xf6, + 0xf, 0xff, 0xe2, 0x6, 0xff, 0xf6, 0xf, 0xfe, + 0x24, 0x13, 0x7f, 0xf5, 0xd, 0xf5, 0x7d, 0x2c, + 0xd, 0xf3, 0xa, 0xff, 0xfd, 0x11, 0xbf, 0xf0, + 0x3, 0xff, 0xfe, 0xb, 0xff, 0xa0, 0x0, 0x7f, + 0xfe, 0xbf, 0xfe, 0x10, 0x0, 0x3, 0xac, 0xdc, + 0x81, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x34, 0x43, 0x0, 0x0, 0x5, 0x66, + 0x7f, 0xff, 0xf9, 0x66, 0x50, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x35, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x50, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2f, + 0xf3, 0xfb, 0x7f, 0x6d, 0xf6, 0x2, 0xff, 0x2f, + 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf2, 0xfb, 0x7f, + 0x5d, 0xf6, 0x2, 0xff, 0x2f, 0xb7, 0xf5, 0xdf, + 0x60, 0x2f, 0xf2, 0xfb, 0x7f, 0x5d, 0xf6, 0x2, + 0xff, 0x2f, 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf3, + 0xfb, 0x7f, 0x6d, 0xf6, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x7, 0xbc, 0xcc, 0xcc, 0xcc, + 0x90, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x4, 0x39, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x39, 0xff, 0xa0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x39, 0xb0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xa8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x87, + 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x3e, 0xff, 0xff, 0xcf, 0xff, + 0xcf, 0xff, 0xf7, 0x3, 0xef, 0xff, 0xf9, 0x8, + 0xf8, 0x9, 0xff, 0xf8, 0x3e, 0xff, 0xff, 0xfe, + 0x20, 0x40, 0x2e, 0xff, 0xf8, 0xdf, 0xff, 0xff, + 0xff, 0xe1, 0x1, 0xef, 0xff, 0xf8, 0x9f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8f, 0xff, 0xf8, 0x9, + 0xff, 0xff, 0xf9, 0x2, 0xc2, 0x9, 0xff, 0xf8, + 0x0, 0x9f, 0xff, 0xfe, 0x4e, 0xfe, 0x4e, 0xff, + 0xf8, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xe2, 0x3, 0xfb, 0xfb, 0xce, 0xbf, + 0xa4, 0xff, 0x1d, 0x3, 0xa1, 0xfa, 0xff, 0xf1, + 0xd0, 0x3a, 0x1f, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xaa, 0xaa, + 0xaa, 0xa8, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf1, 0x0, + 0x8, 0x20, 0x0, 0x0, 0x1, 0xff, 0x10, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0xc, 0xff, + 0x94, 0x44, 0x44, 0x45, 0xff, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x7f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 60, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 60, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 28, .adv_w = 157, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 78, .adv_w = 139, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146, .adv_w = 189, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 206, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 261, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 269, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 297, .adv_w = 76, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 325, .adv_w = 90, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 343, .adv_w = 130, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 371, .adv_w = 51, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 379, .adv_w = 86, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 387, .adv_w = 51, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 392, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 441, .adv_w = 149, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 486, .adv_w = 83, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 506, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 546, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 586, .adv_w = 150, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 636, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 676, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 721, .adv_w = 134, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 761, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 806, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 846, .adv_w = 51, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 858, .adv_w = 51, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 875, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 907, .adv_w = 130, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 931, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 963, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1003, .adv_w = 232, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1094, .adv_w = 164, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1154, .adv_w = 170, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1199, .adv_w = 162, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1249, .adv_w = 185, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1299, .adv_w = 150, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1339, .adv_w = 142, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1379, .adv_w = 173, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1429, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1474, .adv_w = 69, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1484, .adv_w = 115, .box_w = 7, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1519, .adv_w = 161, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1569, .adv_w = 133, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1609, .adv_w = 214, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1664, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1709, .adv_w = 188, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1769, .adv_w = 162, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1814, .adv_w = 188, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1892, .adv_w = 163, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1937, .adv_w = 139, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1982, .adv_w = 131, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2027, .adv_w = 177, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2072, .adv_w = 159, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2127, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2207, .adv_w = 151, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2257, .adv_w = 145, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2312, .adv_w = 147, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2357, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2385, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2434, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2462, .adv_w = 131, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 2483, .adv_w = 112, .box_w = 7, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2487, .adv_w = 134, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 2492, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2524, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2568, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2600, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2650, .adv_w = 137, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2682, .adv_w = 79, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2715, .adv_w = 155, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2765, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2809, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2820, .adv_w = 64, .box_w = 5, .box_h = 14, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 2855, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2899, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2910, .adv_w = 237, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2962, .adv_w = 153, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2994, .adv_w = 142, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3030, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3074, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3124, .adv_w = 92, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3144, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3172, .adv_w = 93, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3202, .adv_w = 152, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3234, .adv_w = 125, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3270, .adv_w = 201, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3322, .adv_w = 124, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3354, .adv_w = 125, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 3404, .adv_w = 117, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3432, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3467, .adv_w = 67, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3481, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3516, .adv_w = 130, .box_w = 8, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 3528, .adv_w = 94, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 3543, .adv_w = 70, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 3549, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3662, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3739, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3830, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3907, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3962, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4067, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4172, .adv_w = 252, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4276, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4381, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4469, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4574, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4616, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4682, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4794, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4871, .adv_w = 154, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4946, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5016, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5114, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5199, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5284, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 5354, .adv_w = 196, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 5445, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5504, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5563, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5648, .adv_w = 196, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 5674, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5762, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5897, .adv_w = 252, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6025, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6116, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6168, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 6220, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6319, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6396, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6501, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6614, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6699, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6797, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6882, .adv_w = 196, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6960, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7037, .adv_w = 140, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7112, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7210, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7308, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7396, .adv_w = 224, .box_w = 16, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7516, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7599, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7716, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7806, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7896, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7986, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8076, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8166, .adv_w = 280, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8274, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8364, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8462, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8575, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8674, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8757, .adv_w = 225, .box_w = 15, .box_h = 10, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 2, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 10, 0, 6, -5, 0, 0, + 0, 0, -12, -13, 2, 11, 5, 4, + -9, 2, 11, 1, 9, 2, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -7, 0, 0, 0, 0, + 0, -4, 4, 4, 0, 0, -2, 0, + -2, 2, 0, -2, 0, -2, -1, -4, + 0, 0, 0, 0, -2, 0, 0, -3, + -3, 0, 0, -2, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -3, 0, -6, 0, -27, 0, + 0, -4, 0, 4, 7, 0, 0, -4, + 2, 2, 7, 4, -4, 4, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -6, -3, -11, 0, -9, + -2, 0, 0, 0, 0, 0, 9, 0, + -7, -2, -1, 1, 0, -4, 0, 0, + -2, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, -2, 9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 2, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 4, 2, 7, -2, 0, 0, 4, -2, + -7, -31, 2, 6, 4, 0, -3, 0, + 8, 0, 7, 0, 7, 0, -21, 0, + -3, 7, 0, 7, -2, 4, 2, 0, + 0, 1, -2, 0, 0, -4, 18, 0, + 18, 0, 7, 0, 9, 3, 4, 7, + 0, 0, 0, -8, 0, 0, 0, 0, + 1, -2, 0, 2, -4, -3, -4, 2, + 0, -2, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -12, 0, -14, 0, 0, 0, + 0, -2, 0, 22, -3, -3, 2, 2, + -2, 0, -3, 2, 0, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -22, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -14, 0, 13, 0, 0, -8, 0, + 7, 0, -15, -22, -15, -4, 7, 0, + 0, -15, 0, 3, -5, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 7, -27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -4, 0, -1, + -1, -2, 0, 0, -2, 0, 0, 0, + -4, 0, -2, 0, -5, -4, 0, -6, + -7, -7, -4, 0, -4, 0, -4, 0, + 0, 0, 0, -2, 0, 0, 2, 0, + 2, -2, 0, 1, 0, 0, 0, 2, + -2, 0, 0, 0, -2, 2, 2, -1, + 0, 0, 0, -4, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 3, -2, 0, + -3, 0, -4, 0, 0, -2, 0, 7, + 0, 0, -2, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -2, -3, 0, -3, 0, -7, + -2, -7, 4, 0, 0, -4, 2, 4, + 6, 0, -6, -1, -3, 0, -1, -11, + 2, -2, 2, -12, 2, 0, 0, 1, + -12, 0, -12, -2, -19, -2, 0, -11, + 0, 4, 6, 0, 3, 0, 0, 0, + 0, 0, 0, -4, -3, 0, -7, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -3, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -2, -3, -2, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -4, 2, 0, 0, -3, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -2, 0, -2, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + -4, 0, 7, -2, 1, -7, 0, 0, + 6, -11, -12, -9, -4, 2, 0, -2, + -15, -4, 0, -4, 0, -4, 3, -4, + -14, 0, -6, 0, 0, 1, -1, 2, + -2, 0, 2, 0, -7, -9, 0, -11, + -5, -5, -5, -7, -3, -6, 0, -4, + -6, 1, 0, 1, 0, -2, 0, 0, + 0, 2, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, -1, -2, 0, -4, -5, + -5, -1, 0, -7, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -4, 0, 0, 0, 0, -11, -7, 0, + 0, 0, -3, -11, 0, 0, -2, 2, + 0, -6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -4, 0, + 0, 0, 0, 3, 0, 2, -4, -4, + 0, -2, -2, -3, 0, 0, 0, 0, + 0, 0, -7, 0, -2, 0, -3, -2, + 0, -5, -6, -7, -2, 0, -4, 0, + -7, 0, 0, 0, 0, 18, 0, 0, + 1, 0, 0, -3, 0, 2, 0, -10, + 0, 0, 0, 0, 0, -21, -4, 7, + 7, -2, -9, 0, 2, -3, 0, -11, + -1, -3, 2, -16, -2, 3, 0, 3, + -8, -3, -8, -7, -9, 0, 0, -13, + 0, 13, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -6, -7, 0, -21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -3, 0, 0, + -4, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 4, + -1, 3, 0, -5, 2, -2, -1, -6, + -2, 0, -3, -2, -2, 0, -3, -4, + 0, 0, -2, -1, -2, -4, -3, 0, + 0, -2, 0, 2, -2, 0, -5, 0, + 0, 0, -4, 0, -4, 0, -4, -4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 2, 0, -3, 0, -2, -3, + -7, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -2, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -2, -3, + -2, 0, 2, 9, -1, 0, -6, 0, + -2, 4, 0, -2, -9, -3, 3, 0, + 0, -11, -4, 2, -4, 2, 0, -2, + -2, -7, 0, -3, 1, 0, 0, -4, + 0, 0, 0, 2, 2, -4, -4, 0, + -4, -2, -3, -2, -2, 0, -4, 1, + -4, -4, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -3, 0, -4, 0, 0, 0, -7, 0, + 2, -5, 4, 0, -2, -11, 0, 0, + -5, -2, 0, -9, -6, -6, 0, 0, + -10, -2, -9, -9, -11, 0, -6, 0, + 2, 15, -3, 0, -5, -2, -1, -2, + -4, -6, -4, -8, -9, -5, -2, 0, + 0, -2, 0, 1, 0, 0, -16, -2, + 7, 5, -5, -8, 0, 1, -7, 0, + -11, -2, -2, 4, -21, -3, 1, 0, + 0, -15, -3, -12, -2, -16, 0, 0, + -16, 0, 13, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -9, -2, 0, -15, + 0, 0, 0, 0, -7, 0, -2, 0, + -1, -6, -11, 0, 0, -1, -3, -7, + -2, 0, -2, 0, 0, 0, 0, -10, + -2, -7, -7, -2, -4, -6, -2, -4, + 0, -4, -2, -7, -3, 0, -3, -4, + -2, -4, 0, 1, 0, -2, -7, 0, + 4, 0, -4, 0, 0, 0, 0, 3, + 0, 2, -4, 9, 0, -2, -2, -3, + 0, 0, 0, 0, 0, 0, -7, 0, + -2, 0, -3, -2, 0, -5, -6, -7, + -2, 0, -4, 2, 9, 0, 0, 0, + 0, 18, 0, 0, 1, 0, 0, -3, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, -4, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -4, + -2, 0, 0, -4, 0, 4, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 4, 2, -2, 0, -7, + -4, 0, 7, -7, -7, -4, -4, 9, + 4, 2, -19, -2, 4, -2, 0, -2, + 2, -2, -8, 0, -2, 2, -3, -2, + -7, -2, 0, 0, 7, 4, 0, -6, + 0, -12, -3, 6, -3, -9, 1, -3, + -7, -7, -2, 9, 2, 0, -3, 0, + -6, 0, 2, 7, -5, -8, -9, -6, + 7, 0, 1, -16, -2, 2, -4, -2, + -5, 0, -5, -8, -3, -3, -2, 0, + 0, -5, -5, -2, 0, 7, 5, -2, + -12, 0, -12, -3, 0, -8, -13, -1, + -7, -4, -7, -6, 6, 0, 0, -3, + 0, -4, -2, 0, -2, -4, 0, 4, + -7, 2, 0, 0, -12, 0, -2, -5, + -4, -2, -7, -6, -7, -5, 0, -7, + -2, -5, -4, -7, -2, 0, 0, 1, + 11, -4, 0, -7, -2, 0, -2, -4, + -5, -6, -6, -9, -3, -4, 4, 0, + -3, 0, -11, -3, 1, 4, -7, -8, + -4, -7, 7, -2, 1, -21, -4, 4, + -5, -4, -8, 0, -7, -9, -3, -2, + -2, -2, -5, -7, -1, 0, 0, 7, + 6, -2, -15, 0, -13, -5, 5, -9, + -15, -4, -8, -9, -11, -7, 4, 0, + 0, 0, 0, -3, 0, 0, 2, -3, + 4, 2, -4, 4, 0, 0, -7, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 2, 7, 0, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 9, 0, 4, 1, 1, -3, + 0, 4, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 0, -2, 4, 0, 7, + 0, 0, 22, 3, -4, -4, 2, 2, + -2, 1, -11, 0, 0, 11, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, 9, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -6, 0, + 0, 1, 0, 0, 2, 29, -4, -2, + 7, 6, -6, 2, 0, 0, 2, 2, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -29, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, 0, 0, -6, 0, 0, 0, 0, + -5, -1, 0, 0, 0, -5, 0, -3, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -4, 0, -3, 0, + -6, 0, 0, 0, -4, 2, -3, 0, + 0, -6, -2, -5, 0, 0, -6, 0, + -2, 0, -11, 0, -2, 0, 0, -18, + -4, -9, -2, -8, 0, 0, -15, 0, + -6, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -4, -2, -4, 0, 0, + 0, 0, -5, 0, -5, 3, -2, 4, + 0, -2, -5, -2, -4, -4, 0, -3, + -1, -2, 2, -6, -1, 0, 0, 0, + -20, -2, -3, 0, -5, 0, -2, -11, + -2, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -4, -2, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, -5, 0, -2, 0, 0, 0, -4, + 2, 0, 0, 0, -6, -2, -4, 0, + 0, -6, 0, -2, 0, -11, 0, 0, + 0, 0, -22, 0, -4, -8, -11, 0, + 0, -15, 0, -2, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -3, -1, + -3, 1, 0, 0, 4, -3, 0, 7, + 11, -2, -2, -7, 3, 11, 4, 5, + -6, 3, 9, 3, 6, 5, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 11, -4, -2, 0, -2, + 18, 10, 18, 0, 0, 0, 2, 0, + 0, 8, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, -19, -3, -2, -9, + -11, 0, 0, -15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, -19, -3, -2, + -9, -11, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -5, 2, 0, -2, + 2, 4, 2, -7, 0, 0, -2, 2, + 0, 2, 0, 0, 0, 0, -6, 0, + -2, -2, -4, 0, -2, -9, 0, 14, + -2, 0, -5, -2, 0, -2, -4, 0, + -2, -6, -4, -3, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, -19, + -3, -2, -9, -11, 0, 0, -15, 0, + 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, -7, -3, -2, 7, -2, -2, + -9, 1, -1, 1, -2, -6, 0, 5, + 0, 2, 1, 2, -5, -9, -3, 0, + -9, -4, -6, -9, -9, 0, -4, -4, + -3, -3, -2, -2, -3, -2, 0, -2, + -1, 3, 0, 3, -2, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -2, -2, 0, 0, + -6, 0, -1, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, 0, 0, 0, -2, 0, 0, -4, + -2, 2, 0, -4, -4, -2, 0, -6, + -2, -5, -2, -3, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 7, 0, 0, -4, 0, + 0, 0, 0, -3, 0, -2, 0, 0, + -1, 0, 0, -2, 0, -5, 0, 0, + 9, -3, -7, -7, 2, 2, 2, 0, + -6, 2, 3, 2, 7, 2, 7, -2, + -6, 0, 0, -9, 0, 0, -7, -6, + 0, 0, -4, 0, -3, -4, 0, -3, + 0, -3, 0, -2, 3, 0, -2, -7, + -2, 8, 0, 0, -2, 0, -4, 0, + 0, 3, -5, 0, 2, -2, 2, 0, + 0, -7, 0, -2, -1, 0, -2, 2, + -2, 0, 0, 0, -9, -3, -5, 0, + -7, 0, 0, -11, 0, 8, -2, 0, + -4, 0, 1, 0, -2, 0, -2, -7, + 0, -2, 2, 0, 0, 0, 0, -2, + 0, 0, 2, -3, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 5, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 4, 0, 5, + 0, 0, 0, 0, 0, -14, -13, 1, + 10, 7, 4, -9, 2, 9, 0, 8, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_14 = { +#else +lv_font_t lv_font_montserrat_14 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 16, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; +#endif /*#if LV_FONT_MONTSERRAT_14*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_14_aligned.c b/inc/lvgl/src/font/lv_font_montserrat_14_aligned.c new file mode 100644 index 0000000..6ea0971 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_14_aligned.c @@ -0,0 +1,4179 @@ +/******************************************************************************* + * Size: 14 px + * Bpp: 8 + * Opts: --no-compress --no-prefilter --bpp 8 --stride 16 --align 16 --size 14 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931 --format lvgl -o lv_font_montserrat_14_aligned.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#if !LV_VERSION_CHECK(9, 3, 0) + #error "At least LVGL v9.3 is required to use the stride attribute of the fonts" +#endif + +#ifndef LV_FONT_MONTSERRAT_14_ALIGNED + #define LV_FONT_MONTSERRAT_14_ALIGNED 1 +#endif + +#if LV_FONT_MONTSERRAT_14_ALIGNED + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x0, 0xe4, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdb, 0x9d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc9, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb7, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xae, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0022 "\"" */ + 0x1e, 0xff, 0xc, 0x92, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xff, 0x5, 0x8d, 0x8f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0xfe, 0x0, 0x88, 0x89, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf7, 0x0, 0x83, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0xdd, 0x23, 0x0, 0x3d, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xf5, 0x3, 0x0, 0x64, 0x9b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x18, 0x57, 0xc0, 0x18, 0x18, 0xad, 0x69, + 0x18, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x62, 0x9d, 0x0, 0x0, 0xc0, 0x3d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x80, 0x80, 0x0, 0x0, 0xdd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x98, 0xf4, 0xfa, 0xf9, 0xf4, 0xf4, 0xff, 0xf4, + 0xf4, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0x24, 0xc5, 0x5b, 0x24, 0x39, 0xe8, 0x24, + 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd7, 0x27, 0x0, 0x33, 0xcb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf2, 0xd, 0x0, 0x4e, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0x9f, 0xe7, 0xff, 0xe5, 0xae, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcb, 0xdc, 0x67, 0xe9, 0x64, 0xad, 0x75, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0xff, 0x44, 0x8, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0xfa, 0x87, 0xa, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xf9, 0xe7, 0xf0, 0x58, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x6e, 0xf9, 0xf3, 0xef, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xe0, 0xb, 0xa4, 0xf2, + 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x1b, 0x0, 0x8, 0xe0, 0x0, 0x52, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x40, 0xf1, 0x8d, 0x59, 0xe8, 0x66, 0xe0, 0xba, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xc6, 0xf5, 0xff, 0xe7, 0x97, 0x12, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x8d, 0xd9, 0xd1, 0x3e, 0x0, 0x0, 0x0, + 0xa2, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xb4, 0x2, 0x25, 0xd7, 0x0, 0x0, 0x4d, + 0xc4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x71, 0x74, 0x0, 0x0, 0xdc, 0x6, 0x11, 0xdc, + 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x40, 0xbe, 0x7, 0x30, 0xd0, 0x0, 0xa3, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x79, 0xd4, 0xc5, 0x31, 0x4e, 0xc2, 0x41, + 0xcb, 0xcc, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0xdd, 0x2c, 0xd9, + 0x20, 0x22, 0xdb, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa5, 0x6e, 0x32, 0xb0, + 0x0, 0x0, 0xb1, 0x35, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x50, 0xc2, 0x1, 0x34, 0xaa, + 0x0, 0x0, 0xab, 0x37, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0xdd, 0x23, 0x0, 0xa, 0xd3, + 0xc, 0xf, 0xd7, 0xb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x6d, 0x0, 0x0, 0x0, 0x4d, + 0xc9, 0xca, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x4a, 0xd4, 0xf6, 0xce, 0x35, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xf6, 0x72, 0x15, 0x86, 0xcd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x2c, 0x0, 0x5c, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbe, 0xba, 0x67, 0xee, 0x4b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x50, 0xff, 0xf9, 0x37, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x71, 0xe9, 0x61, 0xd3, 0xb5, 0x7, 0x36, + 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xfe, 0x32, 0x0, 0x14, 0xd0, 0xba, 0xa0, + 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x55, 0xfd, 0x9, 0x0, 0x0, 0x12, 0xd0, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xf5, 0xb7, 0x49, 0x44, 0x80, 0xf4, 0xe0, + 0xc2, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x35, 0xbb, 0xf3, 0xf6, 0xc5, 0x4e, 0xf, + 0xbe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1e, 0xff, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xff, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0028 "(" */ + 0x0, 0x3d, 0xf6, 0x13, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x9a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xfa, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x79, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x96, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa5, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa5, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x96, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x79, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xfa, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb2, 0x9a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xf6, 0x14, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0029 ")" */ + 0x53, 0xea, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xe0, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8e, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xfd, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0x34, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xfc, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xfc, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0x34, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xfd, 0xa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8e, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x53, 0xeb, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0xa0, 0x36, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x89, 0xa7, 0x62, 0xc6, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x92, 0xff, 0xef, 0x4c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xdb, 0xdf, 0xd6, 0xb3, 0x16, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x42, 0x26, 0x9e, 0x35, 0x5b, 0xc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x4a, 0x5e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x84, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x84, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x30, 0x30, 0x9b, 0xb8, 0x30, 0x30, 0x9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x84, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x84, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xff, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xea, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe7, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+002D "-" */ + 0x1, 0x8, 0x8, 0x8, 0x4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x34, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x38, 0x38, 0x38, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+002E "." */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0xf8, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xee, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xeb, 0x49, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x43, 0xef, 0x5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x98, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xe9, 0x4b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x41, 0xf0, 0x6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x95, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe7, 0x4d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x93, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe5, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xf3, 0x8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x91, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe3, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xf4, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x48, 0xc9, 0xf5, 0xe0, 0x7d, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xfd, 0xb2, 0x63, 0x88, 0xf9, 0x9c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xda, 0xb1, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xff, 0x46, 0x0, 0x0, 0x0, 0x2, 0xeb, + 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xff, 0x22, 0x0, 0x0, 0x0, 0x0, 0xca, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xff, 0x21, 0x0, 0x0, 0x0, 0x0, 0xcb, + 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xff, 0x46, 0x0, 0x0, 0x0, 0x3, 0xec, + 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd9, 0xb3, 0x1, 0x0, 0x0, 0x5d, 0xff, + 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xfc, 0xb6, 0x67, 0x8b, 0xfa, 0x9a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0xc9, 0xf6, 0xe0, 0x7d, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xe4, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x43, 0x4c, 0xc4, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xac, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xac, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xac, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xac, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xac, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xac, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xac, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xac, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0032 "2" */ + 0x5, 0x74, 0xd3, 0xf7, 0xe7, 0xa2, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x87, 0xed, 0x83, 0x5a, 0x79, 0xec, 0xc7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x1e, 0x0, 0x0, 0x0, 0x60, 0xff, 0x14, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0xfa, 0xb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xd7, 0x9b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc5, 0xc6, 0xb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xcd, 0xc3, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xd4, 0xbc, 0xa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xdb, 0xe5, 0x54, 0x4c, 0x4c, 0x4c, 0x2a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0033 "3" */ + 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x4c, 0x4c, 0x4c, 0x5e, 0xf7, 0x97, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbd, 0xc2, 0x5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xe1, 0x15, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x32, 0xff, 0xdf, 0x8e, 0x15, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x46, 0x63, 0xd2, 0xdb, 0xa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0xff, 0x49, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x4, 0x0, 0x0, 0x0, 0x2b, 0xff, 0x4c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbb, 0xd8, 0x7f, 0x5e, 0x76, 0xdf, 0xdf, 0x9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x96, 0xdf, 0xfa, 0xeb, 0xa5, 0x1e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0xb, 0xd1, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaa, 0xcf, 0xa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0xeb, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xf9, 0x40, 0x0, 0x1b, 0x9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xf1, 0x6c, 0x0, 0x0, 0xfc, 0x58, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0xd9, 0xa7, 0xc, 0xc, 0xc, 0xfc, 0x5f, + 0xc, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x74, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3f, 0xff, 0x7f, + 0x3c, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x58, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x58, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xae, 0xb8, 0x4c, 0x4c, 0x4c, 0x4c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc7, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x72, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf8, 0xff, 0xff, 0xf8, 0xc4, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x3c, 0x3c, 0x43, 0x5d, 0xc1, 0xf6, 0x28, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf3, 0x75, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0xd, 0x0, 0x0, 0x0, 0xd, 0xf5, 0x76, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xe7, 0x8a, 0x5f, 0x6d, 0xce, 0xf2, 0x1f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x83, 0xd6, 0xf8, 0xf0, 0xb7, 0x32, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x28, 0xa6, 0xe7, 0xf7, 0xd7, 0x5c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0xf2, 0xd1, 0x6d, 0x50, 0x77, 0x44, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc8, 0xc9, 0x6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x21, 0xff, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x45, 0xff, 0x54, 0xbf, 0xf9, 0xf3, 0xac, 0x1d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xee, 0x81, 0x41, 0x58, 0xd8, 0xd5, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0xff, 0x86, 0x0, 0x0, 0x0, 0x36, 0xff, + 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xea, 0x87, 0x0, 0x0, 0x0, 0x39, 0xff, + 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xfb, 0x84, 0x45, 0x5a, 0xda, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xd1, 0xf9, 0xeb, 0x9c, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x94, 0xd5, 0x4c, 0x4c, 0x4c, 0x4d, 0xee, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x94, 0xc4, 0x0, 0x0, 0x0, 0x4a, 0xfe, 0x29, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xf, 0x0, 0x0, 0x0, 0xbc, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x45, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa1, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x19, 0xf9, 0x63, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x86, 0xea, 0x8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xed, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xf8, 0x17, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x13, 0x98, 0xe5, 0xfa, 0xe5, 0x99, 0x14, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbe, 0xe5, 0x63, 0x3f, 0x63, 0xe4, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfd, 0x6c, 0x0, 0x0, 0x0, 0x65, 0xfe, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc6, 0xc2, 0x20, 0x0, 0x20, 0xbe, 0xc7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0xee, 0xff, 0xfd, 0xff, 0xee, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xd9, 0xcc, 0x4f, 0x2f, 0x4f, 0xcc, 0xd9, + 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x51, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x52, 0xff, 0x29, 0x0, 0x0, 0x0, 0x26, 0xff, + 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xe1, 0xd7, 0x5e, 0x3f, 0x5f, 0xd7, 0xe2, + 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xa1, 0xe7, 0xfb, 0xe7, 0xa1, 0x1e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x36, 0xbe, 0xf5, 0xef, 0xaf, 0x27, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0xf4, 0xad, 0x47, 0x4c, 0xb6, 0xec, 0x1b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x83, 0xe1, 0x3, 0x0, 0x0, 0x4, 0xe2, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x90, 0xd4, 0x0, 0x0, 0x0, 0x0, 0xd6, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xff, 0x7b, 0x14, 0x20, 0x90, 0xfc, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0xf5, 0xff, 0xff, 0xc3, 0x96, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x2c, 0x1c, 0x0, 0xa6, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xfa, 0x68, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x62, 0x57, 0x84, 0xf2, 0xbf, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xa1, 0xe8, 0xf8, 0xd9, 0x7e, 0x6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x2f, 0xee, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0xf7, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0xf8, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xee, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003B ";" */ + 0x2f, 0xee, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0xf7, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xef, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xf4, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xde, 0x27, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x62, 0xce, 0xf3, 0x27, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x89, 0xec, 0xd4, 0x6c, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfd, 0xc4, 0x3f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xa5, 0xf7, 0xb6, 0x4c, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0x7d, 0xe4, 0xe0, 0x79, 0xb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x55, 0xc1, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003E ">" */ + 0x8, 0x4a, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xeb, 0xdc, 0x71, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x5c, 0xc5, 0xf4, 0x98, 0x2c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xad, 0xff, 0x2f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xa6, 0xf7, 0xb4, 0x17, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x6a, 0xd3, 0xed, 0x8c, 0x22, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0xcf, 0x64, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x7, 0x7a, 0xd6, 0xf8, 0xe8, 0xa7, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x96, 0xe7, 0x74, 0x4b, 0x6a, 0xe9, 0xca, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x1a, 0x0, 0x0, 0x0, 0x6a, 0xfe, 0x5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xce, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x89, 0xec, 0x2f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xf2, 0x2c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0x7a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc7, 0x98, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0xd, 0x6c, 0xc4, 0xe8, 0xf6, + 0xdd, 0xa5, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0xdb, 0xa8, 0x41, 0x13, 0x4, + 0x1e, 0x64, 0xd5, 0xa0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xe6, 0x57, 0xd, 0x9c, 0xef, 0xef, + 0x99, 0x83, 0xc7, 0xa5, 0x9b, 0x0, 0x0, 0x0, + 0x0, 0xa3, 0x84, 0x0, 0xb9, 0xd8, 0x4d, 0x35, + 0xa0, 0xf6, 0xc0, 0x7, 0xd6, 0x31, 0x0, 0x0, + 0xe, 0xf1, 0x13, 0x34, 0xfc, 0x26, 0x0, 0x0, + 0x1, 0xc9, 0xc0, 0x0, 0x6a, 0x90, 0x0, 0x0, + 0x37, 0xcd, 0x0, 0x67, 0xda, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xc0, 0x0, 0x38, 0xb7, 0x0, 0x0, + 0x4c, 0xb7, 0x0, 0x67, 0xd9, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0xc0, 0x0, 0x2b, 0xc1, 0x0, 0x0, + 0x36, 0xcc, 0x0, 0x33, 0xfc, 0x26, 0x0, 0x0, + 0x0, 0xc7, 0xc0, 0x0, 0x4c, 0xa6, 0x0, 0x0, + 0xd, 0xf0, 0x13, 0x0, 0xb8, 0xd7, 0x4a, 0x31, + 0x9d, 0xe4, 0xe9, 0x38, 0xc0, 0x55, 0x0, 0x0, + 0x0, 0xa1, 0x83, 0x0, 0xd, 0x9d, 0xef, 0xef, + 0x99, 0x18, 0xc2, 0xf6, 0x9a, 0x2, 0x0, 0x0, + 0x0, 0x19, 0xe6, 0x57, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x31, 0xde, 0xa7, 0x42, 0x14, 0xa, + 0x2c, 0x82, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x70, 0xc7, 0xeb, 0xf7, + 0xdb, 0x93, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xf5, 0x12, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0xdb, 0x7a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb0, 0x98, 0x61, 0xe6, + 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x24, 0xfb, 0x26, 0x6, 0xe5, + 0x5e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xae, 0x0, 0x0, 0x77, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0xf4, 0x3a, 0x0, 0x0, 0xf, + 0xf2, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xe3, 0x77, 0x30, 0x30, 0x30, 0x30, + 0x4a, 0xfe, 0x27, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xf3, 0xb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc8, 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcb, 0x9d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x65, 0xf6, 0x14, 0x0, 0x0, 0x0, 0x0, + + /* U+0042 "B" */ + 0x88, 0xff, 0xff, 0xff, 0xff, 0xee, 0xc0, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe6, 0x34, 0x34, 0x34, 0x4a, 0xb3, 0xf8, + 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x14, 0xff, + 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x15, 0x87, 0xf4, + 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe6, 0x30, 0x30, 0x30, 0x3b, 0x79, 0xfb, + 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xcd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe7, 0x38, 0x38, 0x38, 0x42, 0x7d, 0xfb, + 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xd5, 0x75, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x6, 0x73, 0xcf, 0xf4, 0xf0, 0xbc, + 0x49, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xcd, 0xf6, 0x99, 0x60, 0x63, 0xaa, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa5, 0xed, 0x2b, 0x0, 0x0, 0x0, 0x0, + 0x38, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xfc, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x44, 0xff, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x45, 0xff, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xfc, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa5, 0xed, 0x2c, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0xcf, 0xf6, 0x9a, 0x64, 0x67, 0xaf, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x79, 0xd2, 0xf5, 0xf0, 0xbb, + 0x47, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0x88, 0xff, 0xff, 0xff, 0xfd, 0xe6, 0xaf, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe9, 0x4c, 0x4c, 0x4f, 0x6b, 0xc0, 0xfe, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7a, + 0xfe, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd2, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x93, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x93, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd2, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0xfe, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe9, 0x4c, 0x4c, 0x4f, 0x6a, 0xbf, 0xfe, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xfd, 0xe7, 0xaf, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe9, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x1d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe1, 0x8, 0x8, 0x8, 0x8, 0x6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe7, 0x38, 0x38, 0x38, 0x38, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe9, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x2b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0046 "F" */ + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe9, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x1d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe1, 0xc, 0xc, 0xc, 0xc, 0x9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe7, 0x3c, 0x3c, 0x3c, 0x3c, 0x2e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x7, 0x74, 0xce, 0xf3, 0xf2, 0xc1, + 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xce, 0xf6, 0x9a, 0x61, 0x61, 0xa0, + 0xfa, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa5, 0xee, 0x2c, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xfc, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x44, 0xff, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x45, 0xff, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbc, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xfc, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbc, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa5, 0xef, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbc, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xcc, 0xf8, 0x9d, 0x65, 0x68, 0xa1, + 0xf8, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x75, 0xd0, 0xf4, 0xf2, 0xc3, + 0x60, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe1, 0xc, 0xc, 0xc, 0xc, 0xc, 0x86, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe7, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x9e, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0049 "I" */ + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+004A "J" */ + 0x0, 0x20, 0xff, 0xff, 0xff, 0xff, 0xcc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x4c, 0x4c, 0x4c, 0xb6, 0xcc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x98, 0xcc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x98, 0xcc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x98, 0xcc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x98, 0xcc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x99, 0xca, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0xb9, 0xaf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xe4, 0xb0, 0x56, 0x81, 0xfe, 0x64, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x35, 0xc2, 0xf6, 0xe2, 0x81, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+004B "K" */ + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xf8, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x45, 0xf7, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x3c, 0xf5, 0x74, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x34, 0xf1, 0x86, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x2c, 0xec, 0xcf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xef, 0xe7, 0xc2, 0xfe, 0x66, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xb3, 0x4, 0x7e, 0xfa, 0x3c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xeb, 0x9, 0x0, 0x0, 0xa9, 0xe8, 0x1c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xcc, 0xcc, + 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xe6, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+004C "L" */ + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe9, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+004D "M" */ + 0x88, 0xe0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8e, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xfa, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xfb, 0xf5, 0x1d, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0xf9, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0xc1, 0xa7, 0x0, 0x0, 0x0, 0x46, + 0xf7, 0x93, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x2e, 0xfb, 0x3c, 0x0, 0x3, 0xd4, + 0x81, 0x73, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x95, 0xcd, 0x2, 0x6b, 0xe2, + 0xa, 0x73, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x12, 0xec, 0x75, 0xec, 0x56, + 0x0, 0x72, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x67, 0xff, 0xc1, 0x0, + 0x0, 0x72, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x2, 0xaf, 0x2f, 0x0, + 0x0, 0x71, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x70, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+004E "N" */ + 0x88, 0xe8, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xc7, 0x6, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xf4, 0xf7, 0x98, 0x0, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x60, 0xff, 0x61, 0x0, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x96, 0xf7, 0x33, 0x0, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x6, 0xc6, 0xe1, 0x14, 0x80, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x1a, 0xe8, 0xbb, 0x83, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x3d, 0xfb, 0xeb, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+004F "O" */ + 0x0, 0x0, 0x6, 0x71, 0xce, 0xf3, 0xed, 0xbd, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xcb, 0xf6, 0x98, 0x60, 0x67, 0xb0, + 0xff, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa3, 0xed, 0x2b, 0x0, 0x0, 0x0, 0x0, + 0x59, 0xfe, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xfb, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa8, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x44, 0xff, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0xff, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x45, 0xff, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0xfe, 0x8, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xfc, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa8, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa5, 0xed, 0x2c, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfe, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xcc, 0xf6, 0x99, 0x63, 0x6a, 0xb0, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x75, 0xd0, 0xf4, 0xee, 0xbf, + 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x88, 0xff, 0xff, 0xff, 0xf6, 0xd3, 0x78, 0x7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe9, 0x4c, 0x4c, 0x55, 0x85, 0xf1, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x51, 0xff, + 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x35, 0xff, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe1, 0xc, 0xc, 0x15, 0x45, 0xd5, 0xda, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe7, 0x3c, 0x3c, 0x33, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x5, 0x71, 0xce, 0xf3, 0xed, 0xbd, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xc9, 0xf6, 0x98, 0x60, 0x67, 0xb1, + 0xff, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa1, 0xee, 0x2c, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xff, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xfb, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaa, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x43, 0xff, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x61, 0xfe, 0x8, 0x0, 0x0, 0x0, 0x0, + 0x46, 0xff, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xb, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xfd, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xad, 0xea, 0x25, 0x0, 0x0, 0x0, 0x0, + 0x52, 0xfd, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0xd8, 0xf2, 0x8d, 0x57, 0x5e, 0xa6, + 0xfe, 0xa8, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x87, 0xdc, 0xfb, 0xff, 0xcf, + 0x5f, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xe0, 0xc9, + 0x2c, 0x19, 0x9a, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xba, + 0xff, 0xff, 0xcb, 0x1e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0052 "R" */ + 0x88, 0xff, 0xff, 0xff, 0xf6, 0xd3, 0x78, 0x7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe9, 0x4c, 0x4c, 0x55, 0x85, 0xf1, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x51, 0xff, + 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x35, 0xff, + 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe1, 0x8, 0x8, 0x11, 0x42, 0xd4, 0xd7, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe7, 0x38, 0x38, 0x36, 0xd3, 0xab, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x28, 0xf4, 0x6c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xf8, + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0053 "S" */ + 0x0, 0x15, 0x99, 0xe4, 0xf8, 0xdc, 0xa1, 0x2c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcd, 0xe2, 0x6c, 0x4c, 0x67, 0xb8, 0x78, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0xff, 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0xfa, 0x85, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xf7, 0xdd, 0x94, 0x50, 0xa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x61, 0xa4, 0xe9, 0xee, 0x52, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x9a, 0xf2, + 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x23, 0x0, 0x0, 0x0, 0x0, 0x56, 0xff, + 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xf7, 0xa0, 0x5e, 0x4e, 0x73, 0xe7, 0xbd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xb7, 0xed, 0xfa, 0xe1, 0x91, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x47, 0x4c, 0x4c, 0xb4, 0xdb, 0x4c, 0x4c, 0x4c, + 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xcc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xcc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xcc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xcc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xcc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xcc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xcc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xcc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x9c, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, + 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9c, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, + 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9c, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, + 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9c, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, + 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9c, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb0, + 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9a, 0xcb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, + 0xaa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8a, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, + 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x48, 0x0, 0x0, 0x0, 0x34, 0xfe, + 0x5e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xc9, 0xf5, 0x8a, 0x62, 0x83, 0xf0, 0xd2, + 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x92, 0xe3, 0xfb, 0xe6, 0x98, 0x12, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0x0, 0xcd, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x26, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xf9, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xe9, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x80, 0xe4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x82, 0xf2, 0xd, 0x0, 0x0, 0x6, + 0xe8, 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xfa, 0x6e, 0x0, 0x0, 0x5d, + 0xf7, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0xda, 0x1, 0x0, 0xcb, + 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x36, 0xff, 0x4a, 0x3a, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc8, 0xb8, 0xa9, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xfe, 0xfb, 0x54, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xe5, 0xe2, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x63, 0xfb, 0x12, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xbd, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x25, + 0x13, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x37, 0xff, + 0xfc, 0x16, 0x0, 0x0, 0x0, 0x83, 0xd2, 0x0, + 0x0, 0xbb, 0xb3, 0x0, 0x0, 0x0, 0x8e, 0xbf, + 0xed, 0x67, 0x0, 0x0, 0x0, 0xd7, 0x7e, 0x0, + 0x0, 0x68, 0xf8, 0xe, 0x0, 0x1, 0xe3, 0x64, + 0x9d, 0xbc, 0x0, 0x0, 0x2d, 0xff, 0x2b, 0x0, + 0x0, 0x16, 0xfd, 0x59, 0x0, 0x3c, 0xfb, 0x13, + 0x48, 0xfc, 0x14, 0x0, 0x81, 0xd7, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0xad, 0x0, 0x93, 0xb9, 0x0, + 0x4, 0xec, 0x65, 0x0, 0xd6, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xf5, 0xd, 0xe7, 0x63, 0x0, + 0x0, 0x9c, 0xba, 0x2b, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xfe, 0x95, 0xfb, 0x13, 0x0, + 0x0, 0x47, 0xfb, 0x92, 0xdc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc6, 0xfe, 0xb8, 0x0, 0x0, + 0x0, 0x4, 0xec, 0xfd, 0x89, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x72, 0xff, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x9b, 0xff, 0x35, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x40, 0xfd, 0x5b, 0x0, 0x0, 0x0, 0xa, 0xd8, + 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xf1, 0x21, 0x0, 0x0, 0x98, 0xdc, + 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcd, 0xc5, 0x3, 0x4d, 0xfa, 0x36, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xf5, 0x93, 0xea, 0x7a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0xff, 0xc6, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x97, 0xfd, 0xea, 0x18, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xfd, 0x4a, 0xd5, 0xb8, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xeb, 0x8c, 0x0, 0x2f, 0xf8, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbb, 0xd1, 0x7, 0x0, 0x0, 0x72, 0xf8, + 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x74, 0xf8, 0x2d, 0x0, 0x0, 0x0, 0x1, 0xba, + 0xd6, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0059 "Y" */ + 0x0, 0xc2, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x91, 0xcd, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfc, 0x54, 0x0, 0x0, 0x0, 0x2e, + 0xfa, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x91, 0xe2, 0xa, 0x0, 0x0, 0xc2, + 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xe8, 0x86, 0x0, 0x5d, 0xf0, + 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xf9, 0x34, 0xe7, 0x6f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0xf5, 0xd3, 0x4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xff, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xff, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xff, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0xa9, 0xfb, + 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xf9, 0x6d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xe6, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xc6, 0xcc, 0x8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9a, 0xea, 0x1e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x67, 0xfb, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xf9, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xe6, 0xd5, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005B "[" */ + 0x88, 0xff, 0xff, 0x64, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd9, 0x30, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xd9, 0x30, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xff, 0xff, 0x64, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005C "\\" */ + 0x5e, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf9, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb5, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0xfa, 0x2c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb7, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x63, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0xfb, 0x2a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x7e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x65, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0xfb, 0x27, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbc, 0x7c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x67, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xfc, 0x25, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005D "]" */ + 0xbc, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x50, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x50, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbc, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005E "^" */ + 0x0, 0x0, 0xae, 0xd7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xe7, 0xc8, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x82, 0x8a, 0x5e, 0xaa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xe5, 0x24, 0x8, 0xe9, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x56, 0xbb, 0x0, 0x0, 0x92, 0x7d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x53, 0x0, 0x0, 0x2b, 0xe3, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005F "_" */ + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0060 "`" */ + 0xe, 0xb8, 0xc5, 0xb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x96, 0xbd, 0x8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0061 "a" */ + 0x0, 0x4e, 0xc6, 0xf6, 0xeb, 0xaa, 0x1a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xb4, 0x7d, 0x4a, 0x56, 0xd4, 0xbe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0xff, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x43, 0xc0, 0xe4, 0xec, 0xef, 0xff, 0x27, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xf5, 0x88, 0x24, 0x1c, 0x46, 0xff, 0x28, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x40, 0xff, 0x12, 0x0, 0x0, 0x48, 0xff, 0x28, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xf6, 0x79, 0xe, 0x34, 0xd9, 0xff, 0x28, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xd5, 0xf9, 0xd9, 0x74, 0xff, 0x28, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0062 "b" */ + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa2, 0x82, 0xe6, 0xf5, 0xc1, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xf7, 0xd0, 0x5a, 0x4f, 0xb7, 0xfa, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xed, 0x11, 0x0, 0x0, 0x2, 0xcb, 0xaf, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x74, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xab, 0x0, 0x0, 0x0, 0x0, 0x75, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xee, 0x13, 0x0, 0x0, 0x3, 0xcd, 0xaf, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xf1, 0xd3, 0x5e, 0x53, 0xba, 0xfa, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0x92, 0x81, 0xe7, 0xf5, 0xc1, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x2, 0x72, 0xd9, 0xf8, 0xd9, 0x69, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x94, 0xf5, 0x79, 0x48, 0x80, 0xf9, 0x49, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x21, 0xfe, 0x5a, 0x0, 0x0, 0x0, 0x28, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0xfd, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0xfd, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0xfe, 0x5b, 0x0, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x93, 0xf5, 0x7b, 0x4b, 0x83, 0xfa, 0x48, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x72, 0xda, 0xf8, 0xd8, 0x63, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x81, 0xe1, 0xf7, 0xc6, 0x47, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0xf5, 0x77, 0x48, 0x84, 0xf2, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xff, 0x5c, 0x0, 0x0, 0x0, 0x78, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xfd, 0x6, 0x0, 0x0, 0x0, 0x20, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfc, 0x4, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xff, 0x52, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0xee, 0x63, 0x34, 0x70, 0xed, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x82, 0xe2, 0xf9, 0xcb, 0x42, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0065 "e" */ + 0x0, 0x4, 0x80, 0xe1, 0xf7, 0xcb, 0x4d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa0, 0xdc, 0x5c, 0x3f, 0x83, 0xfb, 0x4c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0xfe, 0x27, 0x0, 0x0, 0x0, 0x88, 0xc7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfe, 0xec, 0xec, 0xec, 0xec, 0xf2, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfe, 0x29, 0x1c, 0x1c, 0x1c, 0x1c, 0x1a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0xfe, 0x71, 0x0, 0x0, 0x0, 0x18, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x98, 0xfb, 0x8e, 0x4e, 0x6e, 0xea, 0x47, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x76, 0xd9, 0xf9, 0xe1, 0x83, 0x5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x3, 0x97, 0xee, 0xe7, 0x3a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xf5, 0x4b, 0x49, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x85, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x9e, 0xd9, 0x30, 0x2d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x4, 0x7f, 0xe0, 0xf8, 0xcd, 0x48, 0xe8, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa0, 0xf6, 0x7f, 0x4c, 0x7e, 0xf2, 0xfa, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0xff, 0x5d, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfe, 0x9, 0x0, 0x0, 0x0, 0x7, 0xfc, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfd, 0x6, 0x0, 0x0, 0x0, 0x5, 0xfb, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0xff, 0x67, 0x0, 0x0, 0x0, 0x67, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9d, 0xfb, 0x7f, 0x4b, 0x7e, 0xf6, 0xfe, + 0x5f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x7f, 0xe0, 0xf9, 0xcf, 0x4b, 0xfc, + 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc4, 0xb3, 0x69, 0x4c, 0x6e, 0xe3, 0xbe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0xa8, 0xe7, 0xf9, 0xdb, 0x8d, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa5, 0x8b, 0xe8, 0xf2, 0xb8, 0x24, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xfb, 0xc7, 0x5d, 0x61, 0xdd, 0xd3, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xe8, 0xc, 0x0, 0x0, 0x3e, 0xff, 0x2e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xae, 0x0, 0x0, 0x0, 0xd, 0xff, 0x4c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0069 "i" */ + 0xbf, 0xab, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa2, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0xac, 0xbb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x91, 0x9a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xae, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x62, 0x4d, 0xee, 0x76, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xdb, 0xf4, 0xab, 0xb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+006B "k" */ + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0xf, 0xc9, 0xc4, 0xa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x11, 0xcb, 0xcf, 0xf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x12, 0xcd, 0xd9, 0x16, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xb3, 0xcf, 0xff, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xff, 0xd7, 0xb5, 0xed, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xdc, 0x18, 0x10, 0xde, 0xc1, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x35, 0xfa, 0x7f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x70, 0xfc, 0x3d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+006C "l" */ + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+006D "m" */ + 0xb8, 0x99, 0x96, 0xec, 0xf4, 0xad, 0x17, 0x5e, + 0xd4, 0xf7, 0xd3, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xfb, 0xb4, 0x49, 0x5e, 0xea, 0xde, 0xef, + 0x6b, 0x45, 0xa6, 0xfa, 0x26, 0x0, 0x0, 0x0, + 0xb8, 0xe3, 0x6, 0x0, 0x0, 0x6c, 0xff, 0x66, + 0x0, 0x0, 0x6, 0xea, 0x76, 0x0, 0x0, 0x0, + 0xb8, 0xac, 0x0, 0x0, 0x0, 0x40, 0xff, 0x28, + 0x0, 0x0, 0x0, 0xc4, 0x94, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0x1c, + 0x0, 0x0, 0x0, 0xc0, 0x98, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0x1c, + 0x0, 0x0, 0x0, 0xc0, 0x98, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0x1c, + 0x0, 0x0, 0x0, 0xc0, 0x98, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0x1c, + 0x0, 0x0, 0x0, 0xc0, 0x98, 0x0, 0x0, 0x0, + + /* U+006E "n" */ + 0xb8, 0x98, 0x92, 0xe9, 0xf2, 0xb8, 0x24, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xfb, 0xbb, 0x4d, 0x51, 0xd5, 0xd3, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xe5, 0x8, 0x0, 0x0, 0x39, 0xff, 0x2e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xad, 0x0, 0x0, 0x0, 0xc, 0xff, 0x4c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+006F "o" */ + 0x0, 0x2, 0x77, 0xdc, 0xf7, 0xd5, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x99, 0xf4, 0x77, 0x48, 0x82, 0xfa, 0x7a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0xff, 0x5a, 0x0, 0x0, 0x0, 0x76, 0xf5, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfd, 0x5, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x3d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfd, 0x6, 0x0, 0x0, 0x0, 0x20, 0xff, + 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0xfe, 0x5d, 0x0, 0x0, 0x0, 0x78, 0xf5, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x98, 0xf6, 0x7b, 0x4b, 0x86, 0xfb, 0x7a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x77, 0xdc, 0xf8, 0xd6, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xb8, 0x94, 0x89, 0xe8, 0xf5, 0xc1, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xf7, 0xca, 0x4c, 0x3f, 0xa9, 0xfa, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xec, 0x10, 0x0, 0x0, 0x1, 0xc6, 0xaf, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x72, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xac, 0x0, 0x0, 0x0, 0x0, 0x76, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xef, 0x14, 0x0, 0x0, 0x3, 0xcf, 0xaf, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xf5, 0xd4, 0x5e, 0x53, 0xbb, 0xfa, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa1, 0x7f, 0xe6, 0xf5, 0xc1, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x5, 0x81, 0xe1, 0xf7, 0xc6, 0x3b, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0xf4, 0x77, 0x48, 0x84, 0xef, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xff, 0x5a, 0x0, 0x0, 0x0, 0x77, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xfd, 0x5, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xfd, 0x6, 0x0, 0x0, 0x0, 0x20, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xff, 0x5d, 0x0, 0x0, 0x0, 0x79, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0xf6, 0x7b, 0x4c, 0x88, 0xf1, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x82, 0xe2, 0xf8, 0xc5, 0x43, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, + 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0072 "r" */ + 0xb8, 0x94, 0x8a, 0xe8, 0x43, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xf1, 0xd8, 0x74, 0x1a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xef, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x5a, 0xd2, 0xf6, 0xe2, 0xac, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0xfe, 0x7d, 0x3f, 0x56, 0xa7, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x61, 0xf8, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xe7, 0xe3, 0x9a, 0x63, 0x18, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x6c, 0xa0, 0xe0, 0xf5, 0x39, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x3, 0xd9, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x62, 0xc1, 0x67, 0x47, 0x6b, 0xf6, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xaa, 0xea, 0xf9, 0xdc, 0x78, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x9e, 0xd9, 0x30, 0x2d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x84, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0xfc, 0x5e, 0x58, 0x17, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x9e, 0xf1, 0xe1, 0x37, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0075 "u" */ + 0xcc, 0x8c, 0x0, 0x0, 0x0, 0x28, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcc, 0x8c, 0x0, 0x0, 0x0, 0x28, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcc, 0x8c, 0x0, 0x0, 0x0, 0x28, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcc, 0x8c, 0x0, 0x0, 0x0, 0x28, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc8, 0x90, 0x0, 0x0, 0x0, 0x35, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaa, 0xbc, 0x0, 0x0, 0x0, 0x75, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x51, 0xff, 0x83, 0x3f, 0x71, 0xef, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6a, 0xda, 0xf8, 0xcc, 0x52, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0076 "v" */ + 0x0, 0xd4, 0x92, 0x0, 0x0, 0x0, 0x0, 0xad, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0xee, 0x9, 0x0, 0x0, 0x19, 0xfb, + 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf5, 0x5d, 0x0, 0x0, 0x7d, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9d, 0xc3, 0x0, 0x2, 0xe1, 0x6b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x34, 0xff, 0x29, 0x4d, 0xf4, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0x8e, 0xb5, 0x9b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x65, 0xf0, 0xfd, 0x33, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xf1, 0xcb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xc0, 0x86, 0x0, 0x0, 0x0, 0x6d, 0xfb, 0x14, + 0x0, 0x0, 0x0, 0xdf, 0x53, 0x0, 0x0, 0x0, + 0x68, 0xdd, 0x0, 0x0, 0x0, 0xc7, 0xff, 0x68, + 0x0, 0x0, 0x39, 0xf2, 0x8, 0x0, 0x0, 0x0, + 0x14, 0xfb, 0x34, 0x0, 0x21, 0xfc, 0x9c, 0xc0, + 0x0, 0x0, 0x91, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb7, 0x8a, 0x0, 0x7a, 0xbc, 0x27, 0xfd, + 0x1a, 0x2, 0xe6, 0x49, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xe0, 0x0, 0xd3, 0x60, 0x0, 0xcd, + 0x70, 0x41, 0xec, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xf7, 0x65, 0xf6, 0xe, 0x0, 0x72, + 0xc8, 0x99, 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xad, 0xf3, 0xa9, 0x0, 0x0, 0x1a, + 0xfc, 0xf2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x54, 0xff, 0x4d, 0x0, 0x0, 0x0, + 0xbd, 0xe5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x4d, 0xf9, 0x33, 0x0, 0x0, 0x72, 0xeb, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x97, 0xd8, 0xa, 0x2d, 0xf7, 0x4d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xd7, 0x9e, 0xd2, 0x95, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x31, 0xfb, 0xd7, 0x9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xfe, 0xe9, 0x17, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xea, 0x77, 0xbd, 0xb8, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xb8, 0xbe, 0x2, 0x1d, 0xef, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x71, 0xee, 0x1c, 0x0, 0x0, 0x59, 0xf9, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0079 "y" */ + 0x0, 0xd3, 0x93, 0x0, 0x0, 0x0, 0x0, 0xac, + 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6a, 0xf0, 0xa, 0x0, 0x0, 0x17, 0xfa, + 0x39, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf3, 0x63, 0x0, 0x0, 0x79, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x97, 0xcb, 0x0, 0x1, 0xdd, 0x67, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0x33, 0x46, 0xf1, 0xc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x9b, 0xad, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xf5, 0xfa, 0x2c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xea, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xef, 0x58, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x92, 0x48, 0xa4, 0xdb, 0x4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xbd, 0xf5, 0xcd, 0x2d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x30, 0x30, 0x30, 0x7b, 0xfd, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xec, 0x7f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xc4, 0xbe, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x88, 0xe9, 0x18, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0xfc, 0x44, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xea, 0xa9, 0x30, 0x30, 0x30, 0x25, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007B "{" */ + 0x0, 0x0, 0x6a, 0xeb, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf8, 0x9a, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0xff, 0x45, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0xff, 0x44, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0xff, 0x44, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0xff, 0x3d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x34, 0xff, 0xcd, 0x5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x60, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0xff, 0x43, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0xff, 0x44, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0xff, 0x44, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0xff, 0x46, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf0, 0xa0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xe9, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007C "|" */ + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007D "}" */ + 0xbb, 0xe6, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xa8, 0xeb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x55, 0xff, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x54, 0xff, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x54, 0xff, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xdd, 0xff, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x42, 0xff, 0x52, 0x5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x53, 0xff, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x54, 0xff, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x54, 0xff, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x57, 0xfe, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xad, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbb, 0xe4, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x7f, 0xe7, 0xc3, 0x45, 0x1, 0xb7, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xe6, 0x27, 0x5c, 0xdb, 0xf7, 0xc1, 0x5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x10, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x4e, 0xc7, 0xc3, 0x36, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0xbb, 0xa, 0x17, 0xcc, 0xc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x58, 0x72, 0x0, 0x0, 0x9b, 0x33, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0xbe, 0xb, 0x17, 0xce, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x51, 0xce, 0xc9, 0x39, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x6e, 0xa3, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfe, 0xff, 0x67, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb1, 0xe7, 0x29, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0x72, 0xbe, 0xfa, 0xb9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x44, + 0x90, 0xdc, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x35, 0xae, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0xf9, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xac, 0xff, 0xff, 0xff, + 0xf6, 0xb4, 0x69, 0x1e, 0x0, 0xec, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xac, 0xff, 0x9a, 0x4a, + 0x8, 0x0, 0x0, 0x0, 0x0, 0xec, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xac, 0xff, 0x14, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xec, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xac, 0xff, 0x14, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xec, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xac, 0xff, 0x14, 0x0, + 0x0, 0x0, 0x8, 0x4b, 0x58, 0xf1, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xac, 0xff, 0x14, 0x0, + 0x0, 0x1c, 0xe1, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x18, 0x7c, 0x9b, 0xda, 0xff, 0x14, 0x0, + 0x0, 0x58, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, + 0x9, 0xe4, 0xff, 0xff, 0xff, 0xff, 0x14, 0x0, + 0x0, 0x9, 0xa5, 0xfc, 0xff, 0xda, 0x39, 0x0, + 0x11, 0xf9, 0xff, 0xff, 0xff, 0xee, 0x5, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xb6, 0xd4, 0xaf, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x51, 0x0, 0x1e, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x42, 0x0, 0x51, 0x0, 0x0, + 0xf8, 0xa2, 0xbe, 0xff, 0xd9, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xfb, 0xd7, 0xa1, 0xf7, 0x0, 0x0, + 0xed, 0x42, 0x74, 0xff, 0x14, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcc, 0xa9, 0x41, 0xec, 0x0, 0x0, + 0xe5, 0x2, 0x43, 0xff, 0x14, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcc, 0x8a, 0x1, 0xe4, 0x0, 0x0, + 0xff, 0xe2, 0xed, 0xff, 0x16, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xce, 0xf5, 0xe1, 0xff, 0x0, 0x0, + 0xe1, 0x0, 0x3d, 0xff, 0xee, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xfe, 0x85, 0x0, 0xe1, 0x0, 0x0, + 0xf1, 0x62, 0x8d, 0xff, 0x7a, 0x68, 0x68, 0x68, + 0x68, 0x68, 0xe7, 0xb8, 0x61, 0xf0, 0x0, 0x0, + 0xf5, 0x82, 0xa5, 0xff, 0x14, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcc, 0xc8, 0x81, 0xf4, 0x0, 0x0, + 0xe0, 0x0, 0x3c, 0xff, 0x14, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcc, 0x84, 0x0, 0xe0, 0x0, 0x0, + 0xfd, 0xc2, 0xd6, 0xff, 0x64, 0x50, 0x50, 0x50, + 0x50, 0x50, 0xe2, 0xe6, 0xc1, 0xfc, 0x0, 0x0, + 0xc9, 0x22, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x99, 0x21, 0xc9, 0x0, 0x0, + + /* U+F00B "" */ + 0x56, 0x74, 0x74, 0x5e, 0x0, 0x5c, 0x74, 0x74, + 0x74, 0x74, 0x74, 0x74, 0x74, 0x56, 0x0, 0x0, + 0xfd, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xe7, 0xff, 0xff, 0xf0, 0xf, 0xee, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x9, 0x18, 0x18, 0xb, 0x0, 0xa, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x9, 0x0, 0x0, + 0xe6, 0xff, 0xff, 0xef, 0xe, 0xec, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x6b, 0x8c, 0x8c, 0x75, 0x0, 0x72, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x6b, 0x0, 0x0, + 0x6d, 0x8c, 0x8c, 0x76, 0x0, 0x73, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x6c, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xd4, 0xf4, 0xf4, 0xde, 0xc, 0xdb, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xd4, 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0x54, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xd7, 0xff, 0x8c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xd7, 0xff, 0xff, 0xd9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xd7, 0xff, 0xff, 0xe3, 0x23, 0x0, 0x0, + 0x28, 0xd4, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xd7, 0xff, 0xff, 0xe2, 0x23, 0x0, 0x0, 0x0, + 0xde, 0xff, 0xff, 0x6f, 0x0, 0x0, 0x18, 0xd7, + 0xff, 0xff, 0xe2, 0x22, 0x0, 0x0, 0x0, 0x0, + 0x83, 0xff, 0xff, 0xff, 0x6f, 0x18, 0xd7, 0xff, + 0xff, 0xe1, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x84, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, + 0xe1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x82, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x80, 0xff, 0xff, 0xe0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x79, 0xd0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x72, 0xf3, 0x64, 0x0, 0x0, 0x0, 0x9, 0xb4, + 0xe3, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe5, 0xff, 0xfe, 0x64, 0x0, 0x9, 0xba, 0xff, + 0xff, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xf9, 0xff, 0xfe, 0x6c, 0xba, 0xff, 0xff, + 0xd0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x54, 0xff, 0xff, 0xff, 0xe0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xba, 0xff, 0xff, 0xff, 0xfe, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xba, 0xff, 0xff, 0xd9, 0xf9, 0xff, 0xfe, + 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb0, 0xff, 0xff, 0xd0, 0x13, 0x4b, 0xf9, 0xff, + 0xfe, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xd0, 0x13, 0x0, 0x0, 0x4b, 0xf9, + 0xff, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0x76, 0x12, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x66, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x16, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0xe, 0xfb, 0xfb, + 0xe, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xf5, 0x2d, 0x18, 0xff, 0xff, + 0x18, 0x2d, 0xf5, 0x78, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x64, 0xff, 0xff, 0x65, 0x18, 0xff, 0xff, + 0x18, 0x68, 0xff, 0xff, 0x64, 0x0, 0x0, 0x0, + 0x13, 0xf3, 0xff, 0x99, 0x1, 0x18, 0xff, 0xff, + 0x18, 0x1, 0x9d, 0xff, 0xf2, 0x12, 0x0, 0x0, + 0x6f, 0xff, 0xe2, 0x7, 0x0, 0x18, 0xff, 0xff, + 0x18, 0x0, 0x9, 0xe5, 0xff, 0x6c, 0x0, 0x0, + 0xad, 0xff, 0x8f, 0x0, 0x0, 0x18, 0xff, 0xff, + 0x18, 0x0, 0x0, 0x8f, 0xff, 0xa8, 0x0, 0x0, + 0xc1, 0xff, 0x6e, 0x0, 0x0, 0x18, 0xff, 0xff, + 0x18, 0x0, 0x0, 0x6f, 0xff, 0xc0, 0x0, 0x0, + 0xa9, 0xff, 0x85, 0x0, 0x0, 0x4, 0xa9, 0xa9, + 0x4, 0x0, 0x0, 0x87, 0xff, 0xb1, 0x0, 0x0, + 0x78, 0xff, 0xd8, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xd9, 0xff, 0x7a, 0x0, 0x0, + 0x17, 0xfa, 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x86, 0xff, 0xf8, 0x1f, 0x0, 0x0, + 0x0, 0x76, 0xff, 0xff, 0x9e, 0x1f, 0x0, 0x0, + 0x20, 0xa1, 0xff, 0xff, 0x7c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x91, 0xff, 0xff, 0xff, 0xe7, 0xe7, + 0xff, 0xff, 0xff, 0x95, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x50, 0xcb, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x44, 0x49, + 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0xf9, 0xf9, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xc9, 0xff, 0xff, + 0xc9, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xd0, 0x68, 0xd5, 0xff, 0xff, 0xff, + 0xff, 0xd6, 0x68, 0xd3, 0x3f, 0x0, 0x0, 0x0, + 0x7, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x7, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0x5d, 0x0, 0x0, + 0x12, 0xa0, 0xff, 0xff, 0xff, 0x46, 0x0, 0x0, + 0x46, 0xff, 0xff, 0xff, 0xa0, 0x12, 0x0, 0x0, + 0x0, 0x39, 0xff, 0xff, 0xdf, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x39, 0x0, 0x0, 0x0, + 0x0, 0x44, 0xff, 0xff, 0xf3, 0xb, 0x0, 0x0, + 0xb, 0xf3, 0xff, 0xff, 0x43, 0x0, 0x0, 0x0, + 0x4c, 0xf7, 0xff, 0xff, 0xff, 0xb4, 0x29, 0x29, + 0xb4, 0xff, 0xff, 0xff, 0xf7, 0x4c, 0x0, 0x0, + 0x29, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x29, 0x0, 0x0, + 0x0, 0x98, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0xff, 0x9a, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x53, 0x1, 0x57, 0xe9, 0xff, 0xff, + 0xe9, 0x57, 0x1, 0x51, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x7c, 0x7c, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, + 0x1f, 0x0, 0x0, 0x38, 0x4c, 0x12, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x90, 0xff, + 0xf6, 0x57, 0x0, 0xd7, 0xff, 0x57, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x11, 0xba, 0xff, 0xdd, + 0xf0, 0xff, 0x83, 0xd9, 0xff, 0x58, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xda, 0xff, 0xb2, 0x1d, + 0x2c, 0xd9, 0xff, 0xff, 0xff, 0x58, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xf0, 0xff, 0x89, 0x36, 0xe5, + 0xc3, 0x26, 0xba, 0xff, 0xff, 0x5c, 0x0, 0x0, + 0x0, 0x74, 0xfd, 0xf8, 0x5c, 0x58, 0xf6, 0xff, + 0xff, 0xe0, 0x32, 0x92, 0xff, 0xeb, 0x40, 0x0, + 0x9f, 0xff, 0xe7, 0x39, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x50, 0x65, 0xfa, 0xfb, 0x62, + 0xa3, 0xcd, 0x28, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x7b, 0x3f, 0xeb, 0x63, + 0x3, 0x7, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xa, 0x0, + 0x0, 0x0, 0x60, 0xff, 0xff, 0xff, 0xd0, 0x74, + 0x76, 0xf0, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x60, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0xd0, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x60, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0xd0, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xf3, 0xf4, 0xf4, 0x7b, 0x0, + 0x0, 0xb8, 0xf4, 0xf4, 0xef, 0x15, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x30, 0x30, + 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, 0xff, 0xff, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8d, 0xf0, 0xf0, 0xfc, 0xff, 0xff, + 0xfc, 0xf0, 0xf0, 0x8c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x21, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x23, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x21, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0xdf, 0xff, 0xff, + 0xe1, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x71, 0x90, 0x90, 0x90, 0x82, 0x26, 0xde, 0xe0, + 0x28, 0x82, 0x90, 0x90, 0x90, 0x70, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0x21, 0x22, + 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf3, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0xbb, 0x3d, 0xcd, 0xff, 0x0, 0x0, + 0xa4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xa4, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x67, 0xb2, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xab, 0x3d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0x19, 0x0, 0x0, + 0x0, 0xd, 0xe1, 0xfa, 0x33, 0xc, 0xc, 0xc, + 0xc, 0xc, 0xc, 0x67, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x97, 0xff, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xc2, 0xff, 0x58, 0x0, + 0x40, 0xfe, 0xdc, 0x8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xf9, 0xeb, 0x14, + 0xd1, 0xff, 0x82, 0x40, 0x40, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x32, 0x40, 0x40, 0xb2, 0xff, 0x91, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x2, 0x0, + 0x0, 0x1e, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0x80, + 0x80, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, + 0x9e, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x61, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x34, 0x39, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x89, 0xd8, 0xfb, 0xfa, + 0xcc, 0x6a, 0x9, 0x0, 0xea, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0xed, 0xff, 0xff, 0xfa, 0xfc, + 0xff, 0xff, 0xe8, 0x48, 0xdf, 0xff, 0x0, 0x0, + 0x0, 0x44, 0xfa, 0xff, 0xb7, 0x38, 0x2, 0x6, + 0x45, 0xc2, 0xff, 0xfb, 0xf5, 0xff, 0x0, 0x0, + 0x9, 0xe5, 0xff, 0x97, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x3, 0x8c, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x62, 0xff, 0xcf, 0x2, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xfe, 0xf6, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x86, 0xe0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xdd, 0xe0, 0xe0, 0xe0, 0xe0, 0xd8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x21, 0x28, 0x28, 0x28, 0x28, 0x25, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x28, 0x14, 0x0, 0x0, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x0, + 0x0, 0x0, 0x0, 0x81, 0xff, 0x8e, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xba, 0xb7, 0xc1, 0x13, 0x0, + 0x0, 0x0, 0x17, 0xea, 0xff, 0x41, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc2, 0x17, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xd1, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0xff, 0xea, 0xe0, 0xff, 0xee, 0x8a, 0x49, 0x44, + 0x81, 0xec, 0xff, 0xe2, 0x1e, 0x0, 0x0, 0x0, + 0xff, 0xe1, 0x19, 0xab, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x1e, 0x0, 0x0, 0x0, 0x0, + 0xf1, 0xde, 0x0, 0x0, 0x2b, 0x83, 0xb0, 0xb6, + 0x92, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x21, 0xe1, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0xe0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd4, 0xf4, 0xf4, 0xfa, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x4c, 0x4c, 0x72, 0xfd, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xcd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x21, 0xe1, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0xe0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd4, 0xf4, 0xf4, 0xfa, 0xff, 0xff, 0xff, 0x0, + 0x2d, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x8d, 0xea, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xe6, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x33, 0xf8, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x8d, 0x9b, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x4c, 0x4c, 0x72, 0xfd, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xcc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0x7b, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x50, 0xf8, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x21, 0xe1, 0xff, 0x0, + 0x0, 0xd, 0x84, 0x11, 0x40, 0xfb, 0x69, 0x0, + 0x0, 0x0, 0x0, 0x20, 0xe0, 0xff, 0xff, 0x0, + 0x0, 0x12, 0xdf, 0xd8, 0xd, 0x7f, 0xf1, 0xb, + 0xd4, 0xf4, 0xf4, 0xfa, 0xff, 0xff, 0xff, 0x0, + 0x32, 0x28, 0x1b, 0xe9, 0x8f, 0xf, 0xf5, 0x61, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x8c, 0xed, 0x21, 0x73, 0xef, 0x1, 0xb5, 0x9c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xe5, 0x74, 0x3d, 0xff, 0x16, 0x96, 0xba, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x38, 0xf9, 0x56, 0x4f, 0xff, 0x9, 0x9d, 0xac, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x88, 0x96, 0x1, 0xae, 0xc6, 0x0, 0xd2, 0x87, + 0x33, 0x4c, 0x4c, 0x72, 0xfd, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x78, 0xfe, 0x48, 0x34, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xfd, 0xff, 0x0, + 0x0, 0x20, 0xfa, 0x6c, 0x7, 0xc8, 0xbe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xcd, 0x0, + 0x0, 0x0, 0xa, 0xc, 0xbd, 0xf0, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xe5, 0x34, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x16, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x32, 0x7d, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7d, 0x30, 0x0, 0x0, + 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, 0x0, + 0xff, 0xe6, 0x32, 0x26, 0xd4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0x94, 0x0, 0x0, 0x74, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xda, 0x16, 0xd, 0xc4, 0xff, 0xff, 0xff, + 0xab, 0x4, 0x71, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xfb, 0xf1, 0xfd, 0xff, 0xff, 0xab, + 0x4, 0x0, 0x0, 0x71, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xf3, 0x3c, 0x55, 0xfb, 0xab, 0x4, + 0x0, 0x0, 0x0, 0x0, 0xc4, 0xff, 0x0, 0x0, + 0xff, 0xf4, 0x3c, 0x0, 0x0, 0x3b, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x0, 0x0, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0x0, 0x0, + 0xfd, 0xf0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xf0, 0xfd, 0x0, 0x0, + 0xa1, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9e, 0x0, 0x0, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x21, 0xd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0xf4, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x69, 0xff, 0xf8, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xda, 0xff, 0xff, 0x7f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x67, 0xff, 0xff, 0xff, 0xf1, 0x18, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xee, 0xff, 0xff, 0xff, 0xff, 0xac, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x53, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf5, 0xec, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf1, 0xdb, 0x41, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb7, 0xfe, 0x41, 0x9d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xfd, 0xec, 0x5b, 0x24, 0xe0, 0xff, 0xff, + 0xd4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x63, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xdb, + 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0x8e, 0xb8, 0xaf, 0x6e, 0xa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x1, 0x49, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x6a, + 0xfd, 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x7d, 0xff, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xe4, 0x0, 0x1, 0x91, 0xff, 0xff, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xe4, 0x4, 0xa3, 0xff, 0xff, 0xff, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xe9, 0xb3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xe4, 0x68, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xe4, 0x0, 0x55, 0xf9, 0xff, 0xff, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xe4, 0x0, 0x0, 0x44, 0xf3, 0xff, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x35, 0xeb, + 0xff, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf1, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xd6, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0xb, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xce, 0xff, 0xbe, 0x2c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfb, 0x90, 0xf, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x62, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, + 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x9c, 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0x65, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x2a, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdb, 0xe, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x86, 0xa, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb4, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x4b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7a, 0x7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf5, 0xff, 0xff, 0xa9, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x60, 0xac, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x12, 0x49, 0x4c, 0x4b, 0x22, 0x0, 0x0, 0x12, + 0x49, 0x4c, 0x4b, 0x22, 0x0, 0x0, 0x0, 0x0, + 0xd6, 0xff, 0xff, 0xff, 0xf7, 0x1d, 0x0, 0xd6, + 0xff, 0xff, 0xff, 0xf7, 0x1d, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x0, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0x3c, 0x0, 0x0, 0x0, + 0x95, 0xf1, 0xf4, 0xf3, 0xc4, 0xa, 0x0, 0x95, + 0xf1, 0xf4, 0xf3, 0xc4, 0xa, 0x0, 0x0, 0x0, + + /* U+F04D "" */ + 0x12, 0x49, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4b, 0x22, 0x0, 0x0, 0x0, 0x0, + 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x1d, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3c, 0x0, 0x0, 0x0, + 0x95, 0xf1, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf3, 0xc4, 0xa, 0x0, 0x0, 0x0, + + /* U+F051 "" */ + 0x0, 0x2b, 0x15, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x4b, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xf7, 0xe3, 0x29, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xec, 0x37, 0x0, 0x0, 0x40, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf4, 0x46, 0x0, 0x40, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x57, 0x40, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa6, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xde, 0x63, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x19, 0x40, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xc6, 0x11, 0x0, 0x40, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xb8, 0xa, 0x0, 0x0, 0x40, + 0xff, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcb, 0xa1, 0x5, 0x0, 0x0, 0x0, 0x36, + 0xf3, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x2f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0xf2, 0xfe, + 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xeb, 0xff, 0xff, + 0xfd, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xe1, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0xd5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x34, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xeb, 0x27, 0x0, 0x0, 0x0, + 0x0, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, 0x0, 0x0, + 0x0, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x28, 0x0, 0x0, + 0x0, 0x3c, 0x90, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x93, 0x5e, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x7c, 0x6, 0x0, 0x0, + 0x0, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xbc, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf4, 0xf4, 0xdf, 0x1d, 0x0, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xf1, 0x99, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xf2, 0xff, 0xcd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xf2, 0xff, 0xd4, 0x16, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xf3, 0xff, 0xd4, 0x16, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xf3, 0xff, 0xd3, 0x15, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xf3, 0xff, 0xda, 0x15, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xc8, 0xff, 0xf8, 0x48, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xc8, 0xff, 0xf8, 0x49, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xc7, 0xff, 0xf8, 0x49, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xc7, 0xff, 0xf8, 0x4a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xc6, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xa5, 0x4c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x5, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xce, 0xd4, 0x16, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xf1, 0xff, 0xd5, 0x17, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xf1, 0xff, 0xd5, 0x17, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xf1, 0xff, 0xd6, 0x17, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xf1, 0xff, 0xd6, 0x18, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xf8, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x95, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x95, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0xff, 0xff, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x5a, 0x8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x22, 0xff, 0xff, 0x67, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x61, 0x90, 0x90, 0x90, 0xa5, 0xff, 0xff, 0xc1, + 0x90, 0x90, 0x90, 0x80, 0x6, 0x0, 0x0, 0x0, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0x0, 0x0, 0x0, + 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x24, 0x0, 0x0, 0x0, + 0x3, 0x10, 0x10, 0x10, 0x3d, 0xff, 0xff, 0x79, + 0x10, 0x10, 0x10, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xc6, 0xd6, 0x38, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x65, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x84, 0x7, 0x0, 0x0, 0x0, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0x0, 0x0, 0x0, + 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x23, 0x0, 0x0, 0x0, + 0x2, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, + 0xc, 0xc, 0xc, 0x5, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x53, 0x6c, + 0x68, 0x47, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x39, 0xbc, 0xfe, 0xff, 0xe5, + 0xed, 0xff, 0xf7, 0x9e, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x73, 0xfd, 0xff, 0xaa, 0x1f, 0x0, + 0x0, 0x39, 0xd2, 0xff, 0xed, 0x42, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xae, 0x0, 0x0, 0x96, + 0xbf, 0x41, 0x12, 0xe0, 0xff, 0xfb, 0x53, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0x29, 0x0, 0x0, 0xbc, + 0xff, 0xf7, 0x25, 0x6a, 0xff, 0xff, 0xef, 0x1e, + 0xe6, 0xff, 0xff, 0xf7, 0x0, 0x9a, 0xcc, 0xff, + 0xff, 0xff, 0x6d, 0x37, 0xff, 0xff, 0xff, 0xa6, + 0xb4, 0xff, 0xff, 0xfd, 0x8, 0x9a, 0xff, 0xff, + 0xff, 0xff, 0x52, 0x46, 0xff, 0xff, 0xff, 0x6e, + 0x1e, 0xec, 0xff, 0xff, 0x58, 0x1c, 0xdf, 0xff, + 0xff, 0xb5, 0x2, 0x9b, 0xff, 0xff, 0xbb, 0x1, + 0x0, 0x37, 0xef, 0xff, 0xe9, 0x29, 0xc, 0x4c, + 0x3f, 0x1, 0x59, 0xfe, 0xff, 0xc5, 0x15, 0x0, + 0x0, 0x0, 0x21, 0xc1, 0xff, 0xf5, 0x91, 0x58, + 0x60, 0xac, 0xfe, 0xfe, 0x9b, 0x7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x45, 0x9f, 0xdc, 0xf6, + 0xf5, 0xd4, 0x94, 0x2f, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0xc, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc6, 0xdb, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x80, 0xfe, 0xf6, 0x5f, 0x0, 0x0, 0x16, 0x4e, + 0x6b, 0x67, 0x43, 0xb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xed, 0xff, 0xa5, 0xc1, 0xff, 0xff, + 0xeb, 0xf0, 0xff, 0xf3, 0x95, 0x16, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xcb, 0xff, 0xff, 0xac, 0x1f, + 0x0, 0x1, 0x41, 0xdb, 0xff, 0xe6, 0x37, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x3, 0x6, 0x96, 0xff, 0xf1, 0x52, + 0xae, 0xb8, 0x32, 0x19, 0xe8, 0xff, 0xf8, 0x47, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7c, 0xbf, 0x17, 0x0, 0x5a, 0xf4, 0xff, + 0xf3, 0xff, 0xed, 0x14, 0x76, 0xff, 0xff, 0xea, + 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf9, 0xff, 0xe5, 0x3c, 0x0, 0x2a, 0xd7, + 0xff, 0xff, 0xff, 0x51, 0x44, 0xff, 0xff, 0xff, + 0x9b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xca, 0xff, 0xff, 0xed, 0x0, 0x0, 0xc, + 0xa7, 0xff, 0xff, 0x64, 0x58, 0xff, 0xff, 0xff, + 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0xf4, 0xff, 0xff, 0x43, 0x0, 0x0, + 0x0, 0x6c, 0xf9, 0xfd, 0xe0, 0xff, 0xff, 0xb3, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x46, 0xf0, 0xff, 0xdd, 0x1c, 0x0, + 0x0, 0x0, 0x37, 0xe1, 0xff, 0xff, 0xc8, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xd3, 0xff, 0xee, 0x8a, + 0x59, 0x44, 0x0, 0x13, 0xb7, 0xff, 0xe0, 0x35, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x57, 0xaf, 0xe5, + 0xfb, 0xf2, 0x62, 0x0, 0x1, 0x7e, 0xfd, 0xf9, + 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0xea, + 0xff, 0x6e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xa1, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, + 0xed, 0xd1, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc9, + 0xff, 0xff, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0xff, + 0xff, 0xff, 0xfb, 0x29, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xe8, 0xff, + 0xff, 0xff, 0xff, 0xba, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0xff, 0xf3, + 0xc4, 0xc7, 0xff, 0xff, 0x4f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xfa, 0xff, 0xb2, + 0x0, 0x0, 0xf2, 0xff, 0xdd, 0x7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb7, 0xff, 0xff, 0xc1, + 0x0, 0x2, 0xfe, 0xff, 0xff, 0x7a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x11, 0xff, 0xff, 0xff, 0xf4, 0x1b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xdb, 0xff, 0xff, 0xff, 0xe3, + 0x1, 0x25, 0xff, 0xff, 0xff, 0xff, 0xa6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x99, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x3, 0xec, 0xff, 0xff, 0xff, 0xff, 0xce, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x27, 0x47, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xc1, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xba, + 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x69, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x86, 0x0, 0x0, 0x0, + 0xd1, 0xd8, 0xd8, 0xb4, 0xc, 0x0, 0x0, 0x0, + 0x88, 0xd8, 0xec, 0xff, 0xff, 0x83, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xbc, 0x7, 0x0, 0x79, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x0, 0x0, + 0x51, 0x58, 0x6c, 0xfa, 0xff, 0x48, 0x60, 0xff, + 0xff, 0x8f, 0xac, 0xff, 0xe3, 0x24, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x7e, 0x4a, 0xfb, 0xff, + 0x94, 0x0, 0x70, 0xe3, 0x24, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xf5, 0xff, 0xab, + 0x2, 0x0, 0x1, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xec, 0xff, 0xc0, 0x23, + 0x52, 0x0, 0x4c, 0xa1, 0x7, 0x0, 0x0, 0x0, + 0xc, 0x10, 0x23, 0xe0, 0xff, 0xd1, 0x1b, 0xd0, + 0xf9, 0x48, 0x88, 0xff, 0xb7, 0x7, 0x0, 0x0, + 0xfc, 0xff, 0xff, 0xff, 0xe0, 0x19, 0x7, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xfe, 0xff, 0xff, 0xeb, 0x27, 0x0, 0x0, 0xc, + 0xca, 0xff, 0xff, 0xff, 0xff, 0xbc, 0x0, 0x0, + 0x1a, 0x20, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x20, 0x90, 0xff, 0xc3, 0xc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x55, 0xb2, 0xc, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xa9, 0x8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x82, 0xff, 0xff, 0xb9, + 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x81, 0xff, 0xff, 0xff, 0xff, + 0xb9, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x81, 0xff, 0xff, 0x96, 0x56, 0xfb, + 0xff, 0xb8, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x81, 0xff, 0xff, 0x95, 0x1, 0x0, 0x55, + 0xfb, 0xff, 0xb8, 0x8, 0x0, 0x0, 0x0, 0x0, + 0x76, 0xff, 0xff, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x56, 0xfc, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x9b, 0xff, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x57, 0xfc, 0xd8, 0x4, 0x0, 0x0, 0x0, + 0x5, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x15, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x40, 0xc5, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xb3, 0x6f, 0x0, 0x0, 0x0, 0x0, + 0xb7, 0xff, 0xea, 0x2c, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xc7, 0xff, 0xf4, 0x5, 0x0, 0x0, 0x0, + 0x20, 0xe0, 0xff, 0xea, 0x2c, 0x0, 0x0, 0xd, + 0xc6, 0xff, 0xf8, 0x48, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0xe0, 0xff, 0xea, 0x2c, 0xc, 0xc4, + 0xff, 0xf8, 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x21, 0xe1, 0xff, 0xea, 0xc9, 0xff, + 0xf8, 0x49, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x21, 0xe1, 0xff, 0xff, 0xf8, + 0x49, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x22, 0xe1, 0xf8, 0x4a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x6, 0x84, 0x34, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xb2, 0xff, 0xf1, 0x39, 0x0, 0x87, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x9f, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xb4, 0xff, 0xff, 0xff, 0xf2, 0x3b, 0x95, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8c, 0xff, 0xc7, 0xff, 0xcf, 0xf8, 0xf2, 0xb, + 0xa, 0xc, 0xc, 0xc, 0xc, 0xaf, 0xff, 0x14, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0x8c, 0x2e, 0xff, 0x98, 0x4a, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0xff, 0x14, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xff, 0x98, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0xff, 0x14, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xff, 0x98, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x34, 0xe, 0xac, 0xff, 0x14, + 0x3a, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xff, 0x98, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xfe, 0xca, 0xb9, 0xff, 0x84, + 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xff, 0xe1, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb0, 0x3f, 0x96, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0x1, 0x95, 0xff, 0xff, 0xdf, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xc, 0xc, 0xc, 0xc, + 0xc, 0xc, 0x3, 0x0, 0x0, 0x8f, 0xd5, 0x1e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x32, 0x7d, 0x80, 0x80, 0x80, 0x73, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0x4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xc0, 0xc0, 0xc0, 0xc0, 0xbd, 0x62, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0xa1, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9e, 0x0, 0x0, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xd2, 0xd4, + 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xd2, 0xff, 0xff, + 0xd4, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xd2, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0xd2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x16, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x98, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x97, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x10, 0x10, 0xc4, 0xff, 0xff, + 0xc4, 0x10, 0x10, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x71, 0x90, 0x90, 0x90, 0x38, 0xb8, 0xff, 0xff, + 0xb8, 0x39, 0x90, 0x90, 0x90, 0x70, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x24, 0x48, 0x48, + 0x24, 0xb4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdc, 0xdc, + 0xef, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0xbb, 0x3d, 0xcd, 0xff, 0x0, 0x0, + 0xa4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xa4, 0x0, 0x0, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x40, 0xff, 0xfa, 0xc9, 0x7e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xdd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x60, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, 0x7e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc5, 0xff, 0xff, 0x32, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x41, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xe5, 0xff, 0xff, 0x38, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x41, 0xa2, 0x37, 0x0, 0x0, + 0x20, 0xd4, 0xff, 0xff, 0x8d, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0xd3, 0xff, 0xff, 0xe9, 0x1e, 0x5b, + 0xea, 0xff, 0xff, 0xb5, 0x2, 0x0, 0x0, 0x0, + 0x0, 0xec, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xad, 0xa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x7f, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa4, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xb6, 0xa4, 0x8c, 0x53, 0xd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x47, 0x8a, 0x60, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x1a, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x69, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x20, 0xd3, 0xff, 0xda, 0x17, 0x0, 0x0, 0x0, + 0xe2, 0xf2, 0x3d, 0xc7, 0xff, 0x1b, 0x0, 0x1b, + 0xde, 0xff, 0xff, 0xa1, 0x1, 0x0, 0x0, 0x0, + 0xee, 0xe1, 0x4, 0xa4, 0xff, 0x2b, 0x16, 0xd8, + 0xff, 0xff, 0xa6, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x9a, 0xff, 0xef, 0xff, 0xff, 0x6d, 0xd2, 0xff, + 0xff, 0xab, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x8f, 0xd4, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xd5, + 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0x8c, 0xe7, 0xff, 0xff, 0xff, 0xff, + 0x6f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x69, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xf2, 0xff, + 0xff, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe2, 0xf2, 0x3d, 0xc7, 0xff, 0x20, 0x3e, 0xf6, + 0xff, 0xfe, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xee, 0xe1, 0x4, 0xa4, 0xff, 0x28, 0x0, 0x46, + 0xf8, 0xff, 0xfe, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x9a, 0xff, 0xef, 0xff, 0xcf, 0x2, 0x0, 0x0, + 0x4e, 0xf7, 0xff, 0xf8, 0x1a, 0x0, 0x0, 0x0, + 0xa, 0x8f, 0xd2, 0xa8, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0x26, 0x63, 0x2a, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0xb, 0xc, 0xc, 0xc, + 0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xff, + 0x98, 0x88, 0x6f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x84, 0xff, 0xff, 0xff, 0xff, + 0x98, 0x8c, 0xff, 0x6f, 0x0, 0x0, 0x0, 0x0, + 0x80, 0xa0, 0x64, 0x84, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0x50, 0x94, 0x91, 0x5, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xc3, 0xc0, 0xc0, 0xf, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x14, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x14, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x14, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x14, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x14, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x14, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa6, 0x74, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xb, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xee, 0x34, 0x1f, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x12, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xbf, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x41, 0x95, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x96, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xd1, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x48, 0xff, 0xfe, 0x69, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xff, 0xfe, 0x3c, 0x0, 0x0, 0x0, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0xff, 0xff, 0xff, 0x6b, 0x0, 0x0, 0x0, + 0xff, 0xca, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, + 0x26, 0xff, 0xff, 0xff, 0x6c, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6c, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xde, 0xc4, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0x6c, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xb8, 0x4, 0x0, 0x50, + 0xff, 0xff, 0xff, 0xff, 0x6c, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x6c, 0x0, 0x0, 0x3, + 0xfd, 0xff, 0xff, 0xff, 0x6c, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0xb, 0x0, 0x62, + 0xff, 0xff, 0xff, 0xff, 0x6c, 0x0, 0x0, 0x0, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xee, 0xdb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x68, 0x0, 0x0, 0x0, + 0x90, 0xf1, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf4, 0xd5, 0x1e, 0x0, 0x0, 0x0, + + /* U+F0C9 "" */ + 0xc6, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, + 0xd4, 0xd4, 0xd4, 0xd2, 0x28, 0x0, 0x0, 0x0, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3b, 0x0, 0x0, 0x0, + 0x1a, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, + 0x24, 0x24, 0x24, 0x22, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, + 0xc, 0xc, 0xc, 0xa, 0x0, 0x0, 0x0, 0x0, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x36, 0x0, 0x0, 0x0, + 0xde, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xea, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xea, 0x2e, 0x0, 0x0, 0x0, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x36, 0x0, 0x0, 0x0, + 0x7, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, + 0xc, 0xc, 0xc, 0xa, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x32, 0x7d, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x7d, 0x30, 0x0, 0x0, + 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, 0x0, + 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x1f, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x1f, 0x0, 0x0, + 0xd2, 0x2d, 0x88, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x8b, 0x2c, 0xd0, 0x0, 0x0, + 0xff, 0xf5, 0x61, 0x48, 0xe9, 0xff, 0xff, 0xff, + 0xff, 0xea, 0x49, 0x5f, 0xf4, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xa6, 0x27, 0xbc, 0xff, 0xff, + 0xba, 0x27, 0xa5, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xdc, 0x35, 0x56, 0x55, + 0x34, 0xdb, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb9, 0xb8, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0xa1, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9e, 0x0, 0x0, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x6, 0xc, 0xc, 0xc, 0x6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x42, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x64, 0xff, 0xff, 0xff, 0xff, 0x89, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x86, 0xff, 0xff, 0xff, 0xff, 0x37, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa8, 0xff, 0xff, 0xff, 0xff, 0xad, 0xac, + 0xac, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xca, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xeb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb8, 0xd4, 0xd4, 0xd9, 0xff, 0xff, 0xff, + 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x41, 0xff, 0xff, 0xd0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, 0x3f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb9, 0xff, 0xab, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xf2, 0xf7, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x32, 0xff, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xcf, 0xa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0xa, 0x2b, 0x3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x41, 0x5c, 0x5e, 0xe1, 0xf3, 0xb9, 0x5c, 0x5c, + 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xfb, 0xff, 0xff, 0xd3, 0x14, 0xff, 0xff, 0xff, + 0xbb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf2, 0x5c, 0x34, 0x34, 0x34, + 0x27, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x90, 0x77, 0xf3, 0xf4, 0xf4, + 0xb7, 0x59, 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0xa0, 0xff, 0xff, 0xff, + 0xc0, 0x60, 0xff, 0x82, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0xa0, 0xff, 0xff, 0xff, + 0xc0, 0x40, 0xac, 0xac, 0x1d, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0xa0, 0xff, 0xff, 0xff, + 0xe3, 0x35, 0x2c, 0x2c, 0xb, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0xa0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0xa0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xfa, 0xff, 0xff, 0x80, 0xa0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x39, 0x54, 0x54, 0x2a, 0xa0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x78, 0xf3, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf4, 0xeb, 0x25, 0x0, 0x0, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x84, 0xf0, 0xff, 0xa4, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x54, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x26, 0x0, 0x0, 0x0, 0x0, + 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x6, 0x0, 0x0, 0x0, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0xb, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x81, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x95, 0xaa, 0x27, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x59, 0xb1, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xab, 0x30, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, + 0xff, 0xc9, 0xc, 0xc1, 0x3a, 0xe, 0xe7, 0x14, + 0x1c, 0xdf, 0xd, 0xdf, 0x1c, 0x14, 0xff, 0xc0, + 0xff, 0xc6, 0x0, 0xbe, 0x30, 0x2, 0xe6, 0x8, + 0x10, 0xdd, 0x1, 0xdd, 0x10, 0x8, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xe7, 0xf0, 0xfa, 0xe0, 0xf5, + 0xf4, 0xe1, 0xfd, 0xe1, 0xef, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0x12, 0x5a, 0xa6, 0x0, 0x82, + 0x7e, 0x0, 0xac, 0x0, 0x52, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0x3c, 0x79, 0xba, 0x28, 0x9c, + 0x98, 0x28, 0xc3, 0x29, 0x73, 0xff, 0xff, 0xc0, + 0xff, 0xf3, 0xb8, 0xf0, 0xc9, 0xb8, 0xb8, 0xb8, + 0xb8, 0xb8, 0xb9, 0xf9, 0xc1, 0xbe, 0xff, 0xc0, + 0xff, 0xc0, 0x0, 0xb8, 0x28, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd8, 0x8, 0x0, 0xff, 0xc0, + 0xfd, 0xf4, 0xc0, 0xf3, 0xcf, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc1, 0xfa, 0xc8, 0xc6, 0xff, 0xbd, + 0x9e, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x61, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x2b, 0x6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x5f, 0xd3, 0xff, 0xbf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x74, 0xe4, 0xff, 0xff, 0xff, 0xde, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x89, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0x9e, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0x0, + 0x0, 0x0, 0x3e, 0xb3, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8c, 0x0, 0x0, + 0x0, 0xa2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x1c, 0x0, 0x0, + 0x0, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x9d, 0xa0, 0xa0, 0xa0, 0xa0, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x2d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0xff, 0xff, 0xff, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0xff, 0xff, 0xff, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0xff, 0xff, 0xcb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0xff, 0xff, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, + 0xff, 0xdd, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xb5, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x3a, 0x54, 0x54, 0x54, 0x54, 0x54, 0xa, 0x2c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf8, + 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xff, + 0xf8, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xff, + 0xff, 0xf8, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x38, 0x2c, + 0x2c, 0x2c, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf4, + 0xf4, 0xf4, 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8c, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + 0xac, 0xaa, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x2a, 0x4f, + 0x5e, 0x57, 0x3f, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xa4, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcc, 0x74, 0xf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x24, 0xbc, 0xff, 0xff, 0xff, 0xfe, 0xec, + 0xd7, 0xe1, 0xf7, 0xff, 0xff, 0xff, 0xf1, 0x6d, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x51, 0xf4, 0xff, 0xff, 0xb8, 0x57, 0x12, 0x0, + 0x0, 0x0, 0x1, 0x34, 0x80, 0xeb, 0xff, 0xff, + 0xb5, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd4, 0xff, 0xdb, 0x3a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x8b, 0xfe, + 0xff, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x8c, 0xe, 0x0, 0x2, 0x56, 0xac, 0xe3, + 0xf8, 0xef, 0xcc, 0x87, 0x1e, 0x0, 0x0, 0x4c, + 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xd2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcd, 0xff, 0xf9, 0x9e, 0x54, + 0x37, 0x40, 0x73, 0xd5, 0xff, 0xff, 0x4d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x24, 0xaa, 0x27, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x76, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, + 0x90, 0x66, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd6, + 0xff, 0xff, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xeb, + 0xff, 0xff, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, + 0xd1, 0xa8, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 60, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 60, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 160, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 240, .adv_w = 157, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 400, .adv_w = 139, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 640, .adv_w = 189, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 800, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 976, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 1056, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1280, .adv_w = 76, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1504, .adv_w = 90, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 1600, .adv_w = 130, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1712, .adv_w = 51, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1792, .adv_w = 86, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1840, .adv_w = 51, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1888, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2112, .adv_w = 149, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2272, .adv_w = 83, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2432, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2592, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2752, .adv_w = 150, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2912, .adv_w = 129, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3072, .adv_w = 138, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3232, .adv_w = 134, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3392, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3552, .adv_w = 138, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3712, .adv_w = 51, .box_w = 3, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3840, .adv_w = 51, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4016, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4144, .adv_w = 130, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 4240, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4368, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4528, .adv_w = 232, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4736, .adv_w = 164, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4896, .adv_w = 170, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5056, .adv_w = 162, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5216, .adv_w = 185, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5376, .adv_w = 150, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5536, .adv_w = 142, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5696, .adv_w = 173, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5856, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6016, .adv_w = 69, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6176, .adv_w = 115, .box_w = 7, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6336, .adv_w = 161, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6496, .adv_w = 133, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6656, .adv_w = 214, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6816, .adv_w = 182, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6976, .adv_w = 188, .box_w = 12, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7136, .adv_w = 162, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7296, .adv_w = 188, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7504, .adv_w = 163, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7664, .adv_w = 139, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7824, .adv_w = 131, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7984, .adv_w = 177, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8144, .adv_w = 159, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8304, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8464, .adv_w = 151, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8624, .adv_w = 145, .box_w = 11, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8784, .adv_w = 147, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8944, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 9168, .adv_w = 79, .box_w = 7, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 9392, .adv_w = 75, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9616, .adv_w = 131, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 9712, .adv_w = 112, .box_w = 7, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9728, .adv_w = 134, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 9760, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9888, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10064, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10192, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10368, .adv_w = 137, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10496, .adv_w = 79, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10672, .adv_w = 155, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10848, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11024, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11200, .adv_w = 64, .box_w = 5, .box_h = 14, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 11424, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11600, .adv_w = 62, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11776, .adv_w = 237, .box_w = 13, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11904, .adv_w = 153, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12032, .adv_w = 142, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12160, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 12336, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12512, .adv_w = 92, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12640, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12768, .adv_w = 93, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12928, .adv_w = 152, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13056, .adv_w = 125, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13184, .adv_w = 201, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13312, .adv_w = 124, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13440, .adv_w = 125, .box_w = 9, .box_h = 11, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13616, .adv_w = 117, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13744, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13968, .adv_w = 67, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 14192, .adv_w = 79, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14416, .adv_w = 130, .box_w = 8, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 14464, .adv_w = 94, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 14544, .adv_w = 70, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 14592, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 14832, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15008, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15216, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15392, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15568, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15808, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16048, .adv_w = 252, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16256, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16496, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16672, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16912, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17104, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17296, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17520, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17696, .adv_w = 154, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17936, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18160, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18400, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18608, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18816, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 19040, .adv_w = 196, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 19248, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19456, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19664, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19872, .adv_w = 196, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 19936, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20112, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20592, .adv_w = 252, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 21072, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21280, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21408, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21536, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21888, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22064, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22304, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 22544, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22752, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22992, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 23200, .adv_w = 196, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 23392, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23568, .adv_w = 140, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 23808, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24048, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24288, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24464, .adv_w = 224, .box_w = 16, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 24704, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24944, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 61756, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 50, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 2, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 10, 0, 6, -5, 0, 0, + 0, 0, -12, -13, 2, 11, 5, 4, + -9, 2, 11, 1, 9, 2, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -7, 0, 0, 0, 0, + 0, -4, 4, 4, 0, 0, -2, 0, + -2, 2, 0, -2, 0, -2, -1, -4, + 0, 0, 0, 0, -2, 0, 0, -3, + -3, 0, 0, -2, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + -2, 0, -3, 0, -6, 0, -27, 0, + 0, -4, 0, 4, 7, 0, 0, -4, + 2, 2, 7, 4, -4, 4, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -6, -3, -11, 0, -9, + -2, 0, 0, 0, 0, 0, 9, 0, + -7, -2, -1, 1, 0, -4, 0, 0, + -2, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, -2, 9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 2, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 4, 2, 7, -2, 0, 0, 4, -2, + -7, -31, 2, 6, 4, 0, -3, 0, + 8, 0, 7, 0, 7, 0, -21, 0, + -3, 7, 0, 7, -2, 4, 2, 0, + 0, 1, -2, 0, 0, -4, 18, 0, + 18, 0, 7, 0, 9, 3, 4, 7, + 0, 0, 0, -8, 0, 0, 0, 0, + 1, -2, 0, 2, -4, -3, -4, 2, + 0, -2, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -12, 0, -14, 0, 0, 0, + 0, -2, 0, 22, -3, -3, 2, 2, + -2, 0, -3, 2, 0, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -22, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -14, 0, 13, 0, 0, -8, 0, + 7, 0, -15, -22, -15, -4, 7, 0, + 0, -15, 0, 3, -5, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 7, -27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -4, 0, -1, + -1, -2, 0, 0, -2, 0, 0, 0, + -4, 0, -2, 0, -5, -4, 0, -6, + -7, -7, -4, 0, -4, 0, -4, 0, + 0, 0, 0, -2, 0, 0, 2, 0, + 2, -2, 0, 1, 0, 0, 0, 2, + -2, 0, 0, 0, -2, 2, 2, -1, + 0, 0, 0, -4, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 3, -2, 0, + -3, 0, -4, 0, 0, -2, 0, 7, + 0, 0, -2, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -2, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -2, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -2, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -2, -3, 0, -3, 0, -7, + -2, -7, 4, 0, 0, -4, 2, 4, + 6, 0, -6, -1, -3, 0, -1, -11, + 2, -2, 2, -12, 2, 0, 0, 1, + -12, 0, -12, -2, -19, -2, 0, -11, + 0, 4, 6, 0, 3, 0, 0, 0, + 0, 0, 0, -4, -3, 0, -7, 0, + 0, 0, -2, 0, 0, 0, -2, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -3, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, -2, -3, -2, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -4, 2, 0, 0, -3, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -2, 0, -2, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + -4, 0, 7, -2, 1, -7, 0, 0, + 6, -11, -12, -9, -4, 2, 0, -2, + -15, -4, 0, -4, 0, -4, 3, -4, + -14, 0, -6, 0, 0, 1, -1, 2, + -2, 0, 2, 0, -7, -9, 0, -11, + -5, -5, -5, -7, -3, -6, 0, -4, + -6, 1, 0, 1, 0, -2, 0, 0, + 0, 2, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -1, 0, -1, -2, 0, -4, -5, + -5, -1, 0, -7, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -4, 0, 0, 0, 0, -11, -7, 0, + 0, 0, -3, -11, 0, 0, -2, 2, + 0, -6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, -4, 0, + 0, 0, 0, 3, 0, 2, -4, -4, + 0, -2, -2, -3, 0, 0, 0, 0, + 0, 0, -7, 0, -2, 0, -3, -2, + 0, -5, -6, -7, -2, 0, -4, 0, + -7, 0, 0, 0, 0, 18, 0, 0, + 1, 0, 0, -3, 0, 2, 0, -10, + 0, 0, 0, 0, 0, -21, -4, 7, + 7, -2, -9, 0, 2, -3, 0, -11, + -1, -3, 2, -16, -2, 3, 0, 3, + -8, -3, -8, -7, -9, 0, 0, -13, + 0, 13, 0, 0, -1, 0, 0, 0, + -1, -1, -2, -6, -7, 0, -21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -1, -2, -3, 0, 0, + -4, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 4, + -1, 3, 0, -5, 2, -2, -1, -6, + -2, 0, -3, -2, -2, 0, -3, -4, + 0, 0, -2, -1, -2, -4, -3, 0, + 0, -2, 0, 2, -2, 0, -5, 0, + 0, 0, -4, 0, -4, 0, -4, -4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 2, 0, -3, 0, -2, -3, + -7, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -2, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -2, -3, + -2, 0, 2, 9, -1, 0, -6, 0, + -2, 4, 0, -2, -9, -3, 3, 0, + 0, -11, -4, 2, -4, 2, 0, -2, + -2, -7, 0, -3, 1, 0, 0, -4, + 0, 0, 0, 2, 2, -4, -4, 0, + -4, -2, -3, -2, -2, 0, -4, 1, + -4, -4, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -3, + 0, 0, -2, -2, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -3, 0, -4, 0, 0, 0, -7, 0, + 2, -5, 4, 0, -2, -11, 0, 0, + -5, -2, 0, -9, -6, -6, 0, 0, + -10, -2, -9, -9, -11, 0, -6, 0, + 2, 15, -3, 0, -5, -2, -1, -2, + -4, -6, -4, -8, -9, -5, -2, 0, + 0, -2, 0, 1, 0, 0, -16, -2, + 7, 5, -5, -8, 0, 1, -7, 0, + -11, -2, -2, 4, -21, -3, 1, 0, + 0, -15, -3, -12, -2, -16, 0, 0, + -16, 0, 13, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -9, -2, 0, -15, + 0, 0, 0, 0, -7, 0, -2, 0, + -1, -6, -11, 0, 0, -1, -3, -7, + -2, 0, -2, 0, 0, 0, 0, -10, + -2, -7, -7, -2, -4, -6, -2, -4, + 0, -4, -2, -7, -3, 0, -3, -4, + -2, -4, 0, 1, 0, -2, -7, 0, + 4, 0, -4, 0, 0, 0, 0, 3, + 0, 2, -4, 9, 0, -2, -2, -3, + 0, 0, 0, 0, 0, 0, -7, 0, + -2, 0, -3, -2, 0, -5, -6, -7, + -2, 0, -4, 2, 9, 0, 0, 0, + 0, 18, 0, 0, 1, 0, 0, -3, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, -4, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -2, -2, 0, 0, -4, + -2, 0, 0, -4, 0, 4, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 3, 4, 2, -2, 0, -7, + -4, 0, 7, -7, -7, -4, -4, 9, + 4, 2, -19, -2, 4, -2, 0, -2, + 2, -2, -8, 0, -2, 2, -3, -2, + -7, -2, 0, 0, 7, 4, 0, -6, + 0, -12, -3, 6, -3, -9, 1, -3, + -7, -7, -2, 9, 2, 0, -3, 0, + -6, 0, 2, 7, -5, -8, -9, -6, + 7, 0, 1, -16, -2, 2, -4, -2, + -5, 0, -5, -8, -3, -3, -2, 0, + 0, -5, -5, -2, 0, 7, 5, -2, + -12, 0, -12, -3, 0, -8, -13, -1, + -7, -4, -7, -6, 6, 0, 0, -3, + 0, -4, -2, 0, -2, -4, 0, 4, + -7, 2, 0, 0, -12, 0, -2, -5, + -4, -2, -7, -6, -7, -5, 0, -7, + -2, -5, -4, -7, -2, 0, 0, 1, + 11, -4, 0, -7, -2, 0, -2, -4, + -5, -6, -6, -9, -3, -4, 4, 0, + -3, 0, -11, -3, 1, 4, -7, -8, + -4, -7, 7, -2, 1, -21, -4, 4, + -5, -4, -8, 0, -7, -9, -3, -2, + -2, -2, -5, -7, -1, 0, 0, 7, + 6, -2, -15, 0, -13, -5, 5, -9, + -15, -4, -8, -9, -11, -7, 4, 0, + 0, 0, 0, -3, 0, 0, 2, -3, + 4, 2, -4, 4, 0, 0, -7, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 2, 7, 0, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 9, 0, 4, 1, 1, -3, + 0, 4, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 0, -2, 4, 0, 7, + 0, 0, 22, 3, -4, -4, 2, 2, + -2, 1, -11, 0, 0, 11, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, 9, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -6, 0, + 0, 1, 0, 0, 2, 29, -4, -2, + 7, 6, -6, 2, 0, 0, 2, 2, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -29, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, 0, 0, -6, 0, 0, 0, 0, + -5, -1, 0, 0, 0, -5, 0, -3, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -2, 0, 0, -4, 0, -3, 0, + -6, 0, 0, 0, -4, 2, -3, 0, + 0, -6, -2, -5, 0, 0, -6, 0, + -2, 0, -11, 0, -2, 0, 0, -18, + -4, -9, -2, -8, 0, 0, -15, 0, + -6, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -4, -2, -4, 0, 0, + 0, 0, -5, 0, -5, 3, -2, 4, + 0, -2, -5, -2, -4, -4, 0, -3, + -1, -2, 2, -6, -1, 0, 0, 0, + -20, -2, -3, 0, -5, 0, -2, -11, + -2, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -4, -2, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, -5, 0, -2, 0, 0, 0, -4, + 2, 0, 0, 0, -6, -2, -4, 0, + 0, -6, 0, -2, 0, -11, 0, 0, + 0, 0, -22, 0, -4, -8, -11, 0, + 0, -15, 0, -2, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -3, -1, + -3, 1, 0, 0, 4, -3, 0, 7, + 11, -2, -2, -7, 3, 11, 4, 5, + -6, 3, 9, 3, 6, 5, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 11, -4, -2, 0, -2, + 18, 10, 18, 0, 0, 0, 2, 0, + 0, 8, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, -19, -3, -2, -9, + -11, 0, 0, -15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, -19, -3, -2, + -9, -11, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -5, 2, 0, -2, + 2, 4, 2, -7, 0, 0, -2, 2, + 0, 2, 0, 0, 0, 0, -6, 0, + -2, -2, -4, 0, -2, -9, 0, 14, + -2, 0, -5, -2, 0, -2, -4, 0, + -2, -6, -4, -3, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, -19, + -3, -2, -9, -11, 0, 0, -15, 0, + 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, -7, -3, -2, 7, -2, -2, + -9, 1, -1, 1, -2, -6, 0, 5, + 0, 2, 1, 2, -5, -9, -3, 0, + -9, -4, -6, -9, -9, 0, -4, -4, + -3, -3, -2, -2, -3, -2, 0, -2, + -1, 3, 0, 3, -2, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -2, -2, 0, 0, + -6, 0, -1, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, 0, 0, 0, -2, 0, 0, -4, + -2, 2, 0, -4, -4, -2, 0, -6, + -2, -5, -2, -3, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 7, 0, 0, -4, 0, + 0, 0, 0, -3, 0, -2, 0, 0, + -1, 0, 0, -2, 0, -5, 0, 0, + 9, -3, -7, -7, 2, 2, 2, 0, + -6, 2, 3, 2, 7, 2, 7, -2, + -6, 0, 0, -9, 0, 0, -7, -6, + 0, 0, -4, 0, -3, -4, 0, -3, + 0, -3, 0, -2, 3, 0, -2, -7, + -2, 8, 0, 0, -2, 0, -4, 0, + 0, 3, -5, 0, 2, -2, 2, 0, + 0, -7, 0, -2, -1, 0, -2, 2, + -2, 0, 0, 0, -9, -3, -5, 0, + -7, 0, 0, -11, 0, 8, -2, 0, + -4, 0, 1, 0, -2, 0, -2, -7, + 0, -2, 2, 0, 0, 0, 0, -2, + 0, 0, 2, -3, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 5, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 4, 0, 5, + 0, 0, 0, 0, 0, -14, -13, 1, + 10, 7, 4, -9, 2, 9, 0, 8, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR == 8 + /*Store all the custom data of the font*/ + static lv_font_fmt_txt_glyph_cache_t cache; +#endif + +#if LVGL_VERSION_MAJOR >= 8 +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 8, + .kern_classes = 1, + .bitmap_format = 0, +#if LVGL_VERSION_MAJOR == 8 + .cache = &cache +#endif + .stride = 16 +}; + + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_14_aligned = { +#else +lv_font_t lv_font_montserrat_14_aligned = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 16, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .static_bitmap = 1, + .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9 + .fallback = NULL, +#endif + .user_data = NULL, +}; + + + +#endif /*#if LV_FONT_MONTSERRAT_14_ALIGNED*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_16.c b/inc/lvgl/src/font/lv_font_montserrat_16.c new file mode 100644 index 0000000..36cdea4 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_16.c @@ -0,0 +1,2460 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_16.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_16 + #define LV_FONT_MONTSERRAT_16 1 +#endif + +#if LV_FONT_MONTSERRAT_16 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xbf, 0xb, 0xf0, 0xaf, 0xa, 0xe0, 0x9e, 0x8, + 0xd0, 0x8c, 0x7, 0xc0, 0x0, 0x0, 0x10, 0xbf, + 0x1a, 0xe0, + + /* U+0022 "\"" */ + 0xf5, 0x1f, 0x3f, 0x51, 0xf3, 0xe4, 0xf, 0x3e, + 0x40, 0xf2, 0x72, 0x8, 0x10, + + /* U+0023 "#" */ + 0x0, 0x5, 0xc0, 0x3, 0xe0, 0x0, 0x0, 0x7a, + 0x0, 0x5c, 0x0, 0x0, 0x9, 0x80, 0x7, 0xa0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3, 0x3e, + 0x73, 0x3c, 0x83, 0x30, 0x0, 0xf2, 0x0, 0xc5, + 0x0, 0x0, 0xf, 0x10, 0xe, 0x30, 0x0, 0x2, + 0xf0, 0x0, 0xf2, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x41, 0x38, 0xc3, 0x36, 0xe3, 0x30, 0x0, + 0x89, 0x0, 0x5c, 0x0, 0x0, 0xa, 0x70, 0x7, + 0xa0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xe9, 0x20, 0x6, + 0xfc, 0xbc, 0x9e, 0x90, 0xe, 0xb0, 0x79, 0x0, + 0x10, 0xf, 0x80, 0x79, 0x0, 0x0, 0xd, 0xf5, + 0x79, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x50, 0x0, + 0x0, 0x6, 0xcf, 0xfe, 0x40, 0x0, 0x0, 0x79, + 0x5e, 0xf1, 0x0, 0x0, 0x79, 0x5, 0xf3, 0x7, + 0x0, 0x79, 0x7, 0xf1, 0x2f, 0xe9, 0xbc, 0xaf, + 0xa0, 0x3, 0xae, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, 0x0, + + /* U+0025 "%" */ + 0x3, 0xde, 0x80, 0x0, 0x5, 0xd0, 0x0, 0xe4, + 0xc, 0x50, 0x1, 0xe3, 0x0, 0x4c, 0x0, 0x5a, + 0x0, 0xa9, 0x0, 0x6, 0xa0, 0x4, 0xc0, 0x4e, + 0x0, 0x0, 0x4c, 0x0, 0x5a, 0xd, 0x50, 0x0, + 0x0, 0xe4, 0x1c, 0x58, 0xa0, 0x0, 0x0, 0x3, + 0xce, 0x73, 0xe1, 0x3c, 0xe9, 0x0, 0x0, 0x0, + 0xd6, 0xe, 0x40, 0xa8, 0x0, 0x0, 0x7c, 0x3, + 0xc0, 0x3, 0xd0, 0x0, 0x2e, 0x20, 0x3c, 0x0, + 0x3d, 0x0, 0xb, 0x70, 0x0, 0xe2, 0x9, 0x80, + 0x6, 0xd0, 0x0, 0x4, 0xdd, 0xa0, + + /* U+0026 "&" */ + 0x0, 0x9, 0xef, 0xb1, 0x0, 0x0, 0x9, 0xe4, + 0x3c, 0xa0, 0x0, 0x0, 0xd9, 0x0, 0x7d, 0x0, + 0x0, 0xc, 0xc0, 0x1c, 0xa0, 0x0, 0x0, 0x3f, + 0xae, 0xc1, 0x0, 0x0, 0x1, 0xdf, 0xc0, 0x0, + 0x0, 0x3, 0xeb, 0x8f, 0x70, 0x18, 0x0, 0xdb, + 0x0, 0x7f, 0x65, 0xf0, 0x3f, 0x40, 0x0, 0x8f, + 0xea, 0x3, 0xf7, 0x0, 0x0, 0xcf, 0x70, 0xb, + 0xf9, 0x66, 0xcf, 0xbf, 0x40, 0x8, 0xdf, 0xea, + 0x30, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xf5, 0xf5, 0xe4, 0xe4, 0x72, + + /* U+0028 "(" */ + 0x0, 0xda, 0x5, 0xf2, 0xb, 0xc0, 0xf, 0x70, + 0x3f, 0x40, 0x5f, 0x20, 0x6f, 0x10, 0x7f, 0x0, + 0x6f, 0x10, 0x5f, 0x20, 0x3f, 0x40, 0xf, 0x70, + 0xb, 0xc0, 0x5, 0xf2, 0x0, 0xda, + + /* U+0029 ")" */ + 0x3f, 0x30, 0xc, 0xb0, 0x6, 0xf1, 0x1, 0xf6, + 0x0, 0xe9, 0x0, 0xbc, 0x0, 0xad, 0x0, 0xae, + 0x0, 0xad, 0x0, 0xbc, 0x0, 0xe9, 0x1, 0xf6, + 0x6, 0xf1, 0xc, 0xb0, 0x3f, 0x30, + + /* U+002A "*" */ + 0x0, 0x4a, 0x0, 0x6, 0x74, 0xa4, 0xa0, 0x2b, + 0xff, 0xe5, 0x0, 0x7f, 0xfb, 0x20, 0x7b, 0x6b, + 0x8d, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x13, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x5, 0x10, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0xf, 0x50, 0x0, 0x1, 0x1f, 0x51, 0x10, + 0xef, 0xff, 0xff, 0xf3, 0x34, 0x4f, 0x74, 0x40, + 0x0, 0xf, 0x50, 0x0, 0x0, 0xf, 0x50, 0x0, + + /* U+002C "," */ + 0x9, 0x52, 0xfd, 0xb, 0xa0, 0xc5, 0xf, 0x0, + + /* U+002D "-" */ + 0x1, 0x11, 0x10, 0x1f, 0xff, 0xf3, 0x4, 0x44, + 0x40, + + /* U+002E "." */ + 0x3, 0x12, 0xfc, 0x1e, 0x90, + + /* U+002F "/" */ + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, + 0x0, 0x0, 0xf, 0x60, 0x0, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xf6, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, 0x0, + 0x0, 0xf, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, + 0x0, 0xac, 0x0, 0x0, 0x0, 0xf6, 0x0, 0x0, + 0x4, 0xf1, 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, + 0xe, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x8, 0xef, 0xc5, 0x0, 0x0, 0xcf, 0xa8, + 0xcf, 0x70, 0x7, 0xf5, 0x0, 0xa, 0xf2, 0xd, + 0xc0, 0x0, 0x1, 0xf8, 0x1f, 0x80, 0x0, 0x0, + 0xdc, 0x3f, 0x60, 0x0, 0x0, 0xbd, 0x3f, 0x60, + 0x0, 0x0, 0xbd, 0x1f, 0x80, 0x0, 0x0, 0xdc, + 0xd, 0xc0, 0x0, 0x1, 0xf8, 0x7, 0xf5, 0x0, + 0xa, 0xf2, 0x0, 0xcf, 0xa8, 0xcf, 0x70, 0x0, + 0x8, 0xef, 0xc5, 0x0, + + /* U+0031 "1" */ + 0xef, 0xff, 0x36, 0x7a, 0xf3, 0x0, 0x5f, 0x30, + 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, + 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, + 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, + + /* U+0032 "2" */ + 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfd, 0x98, 0xcf, + 0x90, 0x28, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, + 0x7, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, + 0x0, 0x4f, 0x80, 0x0, 0x0, 0x3f, 0xc0, 0x0, + 0x0, 0x3e, 0xc1, 0x0, 0x0, 0x2e, 0xc1, 0x0, + 0x0, 0x2e, 0xd1, 0x0, 0x0, 0x2e, 0xf8, 0x77, + 0x77, 0x46, 0xff, 0xff, 0xff, 0xfa, + + /* U+0033 "3" */ + 0x6f, 0xff, 0xff, 0xff, 0x2, 0x77, 0x77, 0x9f, + 0xb0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, 0x9, + 0xf3, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, + 0xdf, 0xe9, 0x10, 0x0, 0x4, 0x59, 0xfd, 0x0, + 0x0, 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x64, 0x40, 0x0, 0x8, 0xf3, 0xbf, 0xc9, 0x8c, + 0xfb, 0x0, 0x7c, 0xff, 0xd7, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x1, 0xeb, 0x0, 0x0, 0x0, 0x0, + 0xbe, 0x10, 0x0, 0x0, 0x0, 0x6f, 0x50, 0x0, + 0x0, 0x0, 0x2f, 0x90, 0x0, 0x0, 0x0, 0xc, + 0xd0, 0x0, 0x0, 0x0, 0x8, 0xf3, 0x1, 0xd5, + 0x0, 0x3, 0xf8, 0x0, 0x2f, 0x60, 0x0, 0xed, + 0x22, 0x23, 0xf7, 0x21, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x55, 0x55, 0x56, 0xf9, 0x52, 0x0, + 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xf6, 0x0, + + /* U+0035 "5" */ + 0x5, 0xff, 0xff, 0xff, 0x0, 0x7f, 0x77, 0x77, + 0x70, 0x8, 0xe0, 0x0, 0x0, 0x0, 0xad, 0x0, + 0x0, 0x0, 0xb, 0xc2, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0xfb, 0x30, 0x4, 0x55, 0x68, 0xff, 0x20, + 0x0, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x0, 0xf, + 0x92, 0x50, 0x0, 0x5, 0xf6, 0x8f, 0xd9, 0x8a, + 0xfd, 0x10, 0x5b, 0xef, 0xe9, 0x10, + + /* U+0036 "6" */ + 0x0, 0x5, 0xce, 0xfc, 0x60, 0x0, 0x9f, 0xc8, + 0x8b, 0x70, 0x5, 0xf8, 0x0, 0x0, 0x0, 0xc, + 0xd0, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x2f, 0x68, 0xef, 0xfa, 0x10, 0x3f, 0xee, + 0x64, 0x8f, 0xd0, 0x2f, 0xf1, 0x0, 0x6, 0xf4, + 0xe, 0xc0, 0x0, 0x2, 0xf6, 0x9, 0xf1, 0x0, + 0x6, 0xf3, 0x1, 0xde, 0x86, 0x9f, 0xb0, 0x0, + 0x19, 0xef, 0xd8, 0x0, + + /* U+0037 "7" */ + 0x8f, 0xff, 0xff, 0xff, 0xe8, 0xf7, 0x77, 0x77, + 0xfc, 0x8f, 0x0, 0x0, 0x4f, 0x55, 0x90, 0x0, + 0xb, 0xe0, 0x0, 0x0, 0x2, 0xf8, 0x0, 0x0, + 0x0, 0x9f, 0x10, 0x0, 0x0, 0xf, 0xb0, 0x0, + 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xdd, 0x0, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0x0, 0xa, 0xf1, + 0x0, 0x0, 0x1, 0xf9, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x6, 0xfc, 0x76, + 0xaf, 0xa0, 0xc, 0xd0, 0x0, 0x9, 0xf1, 0xd, + 0xc0, 0x0, 0x7, 0xf2, 0x7, 0xf7, 0x11, 0x5e, + 0xc0, 0x0, 0xbf, 0xff, 0xfe, 0x10, 0x9, 0xf9, + 0x54, 0x7e, 0xd0, 0x2f, 0x80, 0x0, 0x4, 0xf6, + 0x4f, 0x50, 0x0, 0x0, 0xf8, 0x1f, 0xa0, 0x0, + 0x5, 0xf6, 0x9, 0xfb, 0x76, 0xaf, 0xd0, 0x0, + 0x6c, 0xff, 0xd8, 0x10, + + /* U+0039 "9" */ + 0x0, 0x8e, 0xfd, 0x80, 0x0, 0xc, 0xf8, 0x68, + 0xfc, 0x0, 0x5f, 0x50, 0x0, 0x3f, 0x70, 0x8f, + 0x0, 0x0, 0xe, 0xc0, 0x7f, 0x30, 0x0, 0x1f, + 0xf0, 0x1f, 0xd4, 0x13, 0xcf, 0xf1, 0x4, 0xef, + 0xff, 0xa9, 0xf0, 0x0, 0x2, 0x31, 0xa, 0xf0, + 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x0, + 0x9f, 0x30, 0x9, 0xa7, 0x8d, 0xf7, 0x0, 0x7, + 0xdf, 0xeb, 0x40, 0x0, + + /* U+003A ":" */ + 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x12, 0xfc, 0x1e, 0x90, + + /* U+003B ";" */ + 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe9, 0x1f, 0xd0, 0xa8, 0xe, + 0x30, 0xa0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x1, 0x7d, 0xf3, + 0x3, 0x9f, 0xe8, 0x10, 0xbf, 0xb5, 0x0, 0x0, + 0xee, 0x81, 0x0, 0x0, 0x17, 0xdf, 0xb4, 0x0, + 0x0, 0x4, 0xaf, 0xd2, 0x0, 0x0, 0x1, 0x82, + + /* U+003D "=" */ + 0xef, 0xff, 0xff, 0xf3, 0x45, 0x55, 0x55, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x10, + 0xef, 0xff, 0xff, 0xf3, 0x34, 0x44, 0x44, 0x40, + + /* U+003E ">" */ + 0x50, 0x0, 0x0, 0x0, 0xef, 0x92, 0x0, 0x0, + 0x6, 0xcf, 0xb5, 0x0, 0x0, 0x3, 0x9f, 0xe2, + 0x0, 0x0, 0x6c, 0xf3, 0x2, 0x9e, 0xe9, 0x20, + 0xbf, 0xc6, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfc, 0x77, 0xbf, + 0xa0, 0x27, 0x0, 0x0, 0xcf, 0x0, 0x0, 0x0, + 0x9, 0xf0, 0x0, 0x0, 0x1, 0xea, 0x0, 0x0, + 0x1, 0xdd, 0x10, 0x0, 0x0, 0xce, 0x10, 0x0, + 0x0, 0x3f, 0x60, 0x0, 0x0, 0x1, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x17, 0xce, 0xfd, 0xb5, 0x0, 0x0, + 0x0, 0x5, 0xfb, 0x53, 0x23, 0x7d, 0xc2, 0x0, + 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x8e, 0x10, + 0x2, 0xf4, 0x1, 0xae, 0xfa, 0x3f, 0x49, 0xb0, + 0xa, 0x90, 0x1e, 0xe6, 0x5b, 0xef, 0x40, 0xe3, + 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, + 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, + 0x3f, 0x0, 0xe8, 0x0, 0x0, 0x1f, 0x40, 0x5c, + 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, + 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, + 0xa, 0x90, 0x1e, 0xd6, 0x5a, 0xde, 0xa6, 0xf2, + 0x3, 0xf3, 0x1, 0xaf, 0xfa, 0x16, 0xee, 0x50, + 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x53, 0x23, 0x75, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfd, 0xa3, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x2, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x9e, 0xb0, 0x0, 0x0, 0x0, 0x6, 0xf2, 0x7f, + 0x20, 0x0, 0x0, 0x0, 0xdc, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0x60, 0xb, 0xe0, 0x0, 0x0, + 0xb, 0xf0, 0x0, 0x4f, 0x60, 0x0, 0x1, 0xfa, + 0x11, 0x11, 0xed, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xe, 0xc4, 0x44, 0x44, 0x4f, + 0xa0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0xcd, 0x0, 0x0, 0x0, 0x2, 0xf8, + + /* U+0042 "B" */ + 0x5f, 0xff, 0xff, 0xeb, 0x40, 0x5, 0xf8, 0x55, + 0x57, 0xdf, 0x40, 0x5f, 0x40, 0x0, 0x1, 0xfa, + 0x5, 0xf4, 0x0, 0x0, 0xf, 0xa0, 0x5f, 0x51, + 0x11, 0x3a, 0xf4, 0x5, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0x74, 0x44, 0x59, 0xfa, 0x5, 0xf4, + 0x0, 0x0, 0x8, 0xf2, 0x5f, 0x40, 0x0, 0x0, + 0x5f, 0x45, 0xf4, 0x0, 0x0, 0x9, 0xf2, 0x5f, + 0x85, 0x55, 0x6a, 0xfb, 0x5, 0xff, 0xff, 0xff, + 0xd7, 0x0, + + /* U+0043 "C" */ + 0x0, 0x2, 0x8d, 0xfe, 0xb4, 0x0, 0x4, 0xff, + 0xb8, 0x9d, 0xf9, 0x2, 0xfd, 0x20, 0x0, 0x8, + 0x50, 0xbf, 0x20, 0x0, 0x0, 0x0, 0xf, 0xa0, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd2, 0x0, 0x0, 0x85, 0x0, + 0x5f, 0xfb, 0x89, 0xdf, 0x80, 0x0, 0x29, 0xdf, + 0xeb, 0x40, + + /* U+0044 "D" */ + 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, 0x5f, 0x97, + 0x77, 0x9e, 0xf8, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0xaf, 0x60, 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, + 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, 0x5f, 0x40, + 0x0, 0x0, 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, + 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, + 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, 0x5f, 0x40, + 0x0, 0x0, 0xaf, 0x60, 0x5f, 0x97, 0x77, 0x9e, + 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, + + /* U+0045 "E" */ + 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, + 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x51, 0x11, 0x11, 0x5, 0xff, + 0xff, 0xff, 0xe0, 0x5f, 0x74, 0x44, 0x44, 0x5, + 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, + 0x77, 0x65, 0xff, 0xff, 0xff, 0xfd, + + /* U+0046 "F" */ + 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, + 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf5, + 0x22, 0x22, 0x10, 0x5f, 0xff, 0xff, 0xfe, 0x5, + 0xf8, 0x55, 0x55, 0x40, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4f, + 0xfb, 0x89, 0xdf, 0xb0, 0x2, 0xfd, 0x20, 0x0, + 0x6, 0x60, 0xb, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, + 0x9, 0xf0, 0xf, 0xa0, 0x0, 0x0, 0x9, 0xf0, + 0xb, 0xf2, 0x0, 0x0, 0x9, 0xf0, 0x2, 0xfd, + 0x20, 0x0, 0xa, 0xf0, 0x0, 0x4f, 0xfb, 0x89, + 0xdf, 0xc0, 0x0, 0x2, 0x8d, 0xfe, 0xc6, 0x0, + + /* U+0048 "H" */ + 0x5f, 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, + 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, 0x4f, + 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x52, + 0x22, 0x22, 0x5f, 0x55, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x5f, 0x85, 0x55, 0x55, 0x8f, 0x55, 0xf4, + 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, + 0x4f, 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, + 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, 0x0, + 0x4, 0xf5, + + /* U+0049 "I" */ + 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, + 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, + 0x45, 0xf4, + + /* U+004A "J" */ + 0x0, 0xff, 0xff, 0xfa, 0x0, 0x77, 0x77, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0x20, 0x3, 0xf6, + 0xd, 0xe9, 0x8e, 0xf1, 0x1, 0xae, 0xfb, 0x30, + + /* U+004B "K" */ + 0x5f, 0x40, 0x0, 0x2, 0xeb, 0x5, 0xf4, 0x0, + 0x1, 0xec, 0x0, 0x5f, 0x40, 0x1, 0xde, 0x10, + 0x5, 0xf4, 0x0, 0xce, 0x20, 0x0, 0x5f, 0x40, + 0xbf, 0x30, 0x0, 0x5, 0xf4, 0x9f, 0x90, 0x0, + 0x0, 0x5f, 0xcf, 0xef, 0x40, 0x0, 0x5, 0xff, + 0x91, 0xee, 0x10, 0x0, 0x5f, 0xa0, 0x3, 0xfc, + 0x0, 0x5, 0xf4, 0x0, 0x6, 0xf8, 0x0, 0x5f, + 0x40, 0x0, 0x9, 0xf5, 0x5, 0xf4, 0x0, 0x0, + 0xc, 0xf2, + + /* U+004C "L" */ + 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, + 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, + 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, + 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, + 0x77, 0x25, 0xff, 0xff, 0xff, 0xf5, + + /* U+004D "M" */ + 0x5f, 0x40, 0x0, 0x0, 0x0, 0x1e, 0x95, 0xfc, + 0x0, 0x0, 0x0, 0x8, 0xf9, 0x5f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0x95, 0xfd, 0xe0, 0x0, 0x0, + 0xae, 0xf9, 0x5f, 0x5f, 0x70, 0x0, 0x3f, 0x5f, + 0x95, 0xf3, 0x8f, 0x10, 0xb, 0xc0, 0xf9, 0x5f, + 0x31, 0xe9, 0x4, 0xf3, 0xf, 0x95, 0xf3, 0x7, + 0xf2, 0xdb, 0x0, 0xf9, 0x5f, 0x30, 0xd, 0xef, + 0x20, 0xf, 0x95, 0xf3, 0x0, 0x5f, 0x90, 0x0, + 0xf9, 0x5f, 0x30, 0x0, 0x71, 0x0, 0xf, 0x95, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf9, + + /* U+004E "N" */ + 0x5f, 0x50, 0x0, 0x0, 0x4f, 0x55, 0xff, 0x20, + 0x0, 0x4, 0xf5, 0x5f, 0xfd, 0x0, 0x0, 0x4f, + 0x55, 0xfa, 0xf9, 0x0, 0x4, 0xf5, 0x5f, 0x4a, + 0xf5, 0x0, 0x4f, 0x55, 0xf4, 0xd, 0xf2, 0x4, + 0xf5, 0x5f, 0x40, 0x2f, 0xd0, 0x4f, 0x55, 0xf4, + 0x0, 0x6f, 0x94, 0xf5, 0x5f, 0x40, 0x0, 0xaf, + 0xaf, 0x55, 0xf4, 0x0, 0x0, 0xdf, 0xf5, 0x5f, + 0x40, 0x0, 0x2, 0xff, 0x55, 0xf4, 0x0, 0x0, + 0x6, 0xf5, + + /* U+004F "O" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4, + 0xff, 0xb8, 0x9e, 0xfa, 0x0, 0x2, 0xfd, 0x20, + 0x0, 0x8, 0xf9, 0x0, 0xbf, 0x20, 0x0, 0x0, + 0xa, 0xf2, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x3f, + 0x72, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xf9, 0x2f, + 0x60, 0x0, 0x0, 0x0, 0xf, 0x90, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xf7, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0xaf, 0x20, 0x2f, 0xd2, 0x0, 0x0, 0x8f, + 0x90, 0x0, 0x4f, 0xfb, 0x89, 0xef, 0xa0, 0x0, + 0x0, 0x28, 0xdf, 0xeb, 0x50, 0x0, + + /* U+0050 "P" */ + 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, + 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, + 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, + 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x62, + 0x23, 0x6e, 0xf1, 0x5f, 0xff, 0xff, 0xfd, 0x30, + 0x5f, 0x85, 0x54, 0x20, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x0, 0x5f, + 0x40, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x4e, 0xfb, 0x89, 0xef, 0xa0, 0x0, 0x2, 0xfd, + 0x20, 0x0, 0x8, 0xf9, 0x0, 0xa, 0xf2, 0x0, + 0x0, 0x0, 0xaf, 0x20, 0xf, 0xa0, 0x0, 0x0, + 0x0, 0x3f, 0x70, 0x2f, 0x60, 0x0, 0x0, 0x0, + 0xf, 0x90, 0x2f, 0x60, 0x0, 0x0, 0x0, 0xf, + 0x90, 0x1f, 0x90, 0x0, 0x0, 0x0, 0x2f, 0x70, + 0xb, 0xf1, 0x0, 0x0, 0x0, 0xaf, 0x20, 0x3, + 0xfc, 0x10, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x6f, + 0xfa, 0x78, 0xdf, 0xb0, 0x0, 0x0, 0x3, 0xae, + 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd4, 0x15, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0x31, + 0x0, + + /* U+0052 "R" */ + 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, + 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, + 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, + 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x52, + 0x23, 0x6e, 0xe1, 0x5f, 0xff, 0xff, 0xfc, 0x30, + 0x5f, 0x85, 0x55, 0xf9, 0x0, 0x5f, 0x40, 0x0, + 0x7f, 0x40, 0x5f, 0x40, 0x0, 0xc, 0xe0, 0x5f, + 0x40, 0x0, 0x2, 0xf9, + + /* U+0053 "S" */ + 0x0, 0x5c, 0xef, 0xd9, 0x20, 0x7, 0xfc, 0x87, + 0xaf, 0x90, 0xe, 0xc0, 0x0, 0x1, 0x10, 0xf, + 0x80, 0x0, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xea, 0x50, 0x0, 0x0, 0x5, + 0xae, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x4e, 0xf1, + 0x0, 0x0, 0x0, 0x5, 0xf3, 0x8, 0x0, 0x0, + 0x8, 0xf2, 0x2f, 0xfa, 0x77, 0xbf, 0xa0, 0x2, + 0x9d, 0xff, 0xc7, 0x0, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x67, 0x78, 0xfb, + 0x77, 0x72, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, + 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, + 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, + + /* U+0055 "U" */ + 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, + 0x0, 0x8, 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, + 0x16, 0xf3, 0x0, 0x0, 0x8, 0xf1, 0x6f, 0x30, + 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, 0x0, 0x8, + 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x5, 0xf4, + 0x0, 0x0, 0x9, 0xf0, 0x3f, 0x70, 0x0, 0x0, + 0xcd, 0x0, 0xde, 0x20, 0x0, 0x5f, 0x80, 0x4, + 0xff, 0xa8, 0xbf, 0xd0, 0x0, 0x3, 0xbe, 0xfd, + 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0x30, 0x6f, + 0x50, 0x0, 0x0, 0xc, 0xc0, 0x0, 0xfb, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x9, 0xf2, 0x0, 0x0, + 0xae, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x1f, 0x90, + 0x0, 0x0, 0xce, 0x0, 0x7, 0xf2, 0x0, 0x0, + 0x5, 0xf6, 0x0, 0xdb, 0x0, 0x0, 0x0, 0xe, + 0xc0, 0x4f, 0x50, 0x0, 0x0, 0x0, 0x8f, 0x3b, + 0xe0, 0x0, 0x0, 0x0, 0x2, 0xfb, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x5f, 0x40, 0x0, 0x0, 0xdf, 0x0, 0x0, 0x2, + 0xf5, 0xf, 0x90, 0x0, 0x2, 0xff, 0x40, 0x0, + 0x7, 0xf0, 0xb, 0xe0, 0x0, 0x7, 0xfe, 0x90, + 0x0, 0xc, 0xb0, 0x6, 0xf3, 0x0, 0xc, 0xaa, + 0xe0, 0x0, 0x1f, 0x60, 0x1, 0xf8, 0x0, 0x1f, + 0x54, 0xf3, 0x0, 0x6f, 0x10, 0x0, 0xcd, 0x0, + 0x7f, 0x10, 0xf8, 0x0, 0xcc, 0x0, 0x0, 0x7f, + 0x20, 0xcb, 0x0, 0xad, 0x1, 0xf7, 0x0, 0x0, + 0x2f, 0x71, 0xf6, 0x0, 0x5f, 0x26, 0xf2, 0x0, + 0x0, 0xd, 0xc6, 0xf1, 0x0, 0xf, 0x7b, 0xd0, + 0x0, 0x0, 0x8, 0xfd, 0xc0, 0x0, 0xb, 0xdf, + 0x80, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0x6, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x1, 0xfe, 0x0, 0x0, + + /* U+0058 "X" */ + 0x3f, 0x90, 0x0, 0x0, 0xcd, 0x0, 0x8f, 0x40, + 0x0, 0x7f, 0x30, 0x0, 0xde, 0x10, 0x2f, 0x80, + 0x0, 0x3, 0xfa, 0xc, 0xd0, 0x0, 0x0, 0x7, + 0xfb, 0xf3, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xc0, 0x0, 0x0, 0x0, + 0xbf, 0x7f, 0x70, 0x0, 0x0, 0x6f, 0x60, 0xaf, + 0x20, 0x0, 0x2f, 0xb0, 0x1, 0xed, 0x0, 0xc, + 0xf1, 0x0, 0x4, 0xf8, 0x7, 0xf6, 0x0, 0x0, + 0x9, 0xf3, + + /* U+0059 "Y" */ + 0xc, 0xe0, 0x0, 0x0, 0x7, 0xf2, 0x3, 0xf7, + 0x0, 0x0, 0x1f, 0x90, 0x0, 0xaf, 0x10, 0x0, + 0x9e, 0x10, 0x0, 0x1f, 0xa0, 0x2, 0xf6, 0x0, + 0x0, 0x8, 0xf3, 0xb, 0xd0, 0x0, 0x0, 0x0, + 0xec, 0x4f, 0x40, 0x0, 0x0, 0x0, 0x5f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x1, 0x77, 0x77, + 0x77, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x1e, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, 0x0, + 0x8, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xf9, 0x0, + 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x1e, + 0xf8, 0x77, 0x77, 0x77, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf0, + + /* U+005B "[" */ + 0x5f, 0xff, 0x5, 0xf7, 0x50, 0x5f, 0x30, 0x5, + 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, + 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, + 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, + 0x5, 0xf7, 0x50, 0x5f, 0xff, 0x0, + + /* U+005C "\\" */ + 0x7e, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, + 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, + 0x2, 0xf4, 0x0, 0x0, 0x0, 0xc9, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x40, 0x0, + 0x0, 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, + 0x0, 0x2, 0xf3, 0x0, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x7, 0xe0, + + /* U+005D "]" */ + 0xbf, 0xfa, 0x35, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x35, 0xea, 0xbf, 0xfa, + + /* U+005E "^" */ + 0x0, 0x2f, 0x80, 0x0, 0x0, 0x9d, 0xe0, 0x0, + 0x0, 0xf3, 0xd5, 0x0, 0x6, 0xd0, 0x7b, 0x0, + 0xc, 0x60, 0x1f, 0x20, 0x3f, 0x10, 0xb, 0x80, + 0x9a, 0x0, 0x4, 0xe0, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, 0x11, 0x11, + + /* U+0060 "`" */ + 0x7, 0xf6, 0x0, 0x3, 0xe7, + + /* U+0061 "a" */ + 0x1, 0x9e, 0xfd, 0x80, 0x0, 0xce, 0x87, 0xaf, + 0x90, 0x2, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x0, + 0x6, 0xf2, 0x2, 0xbe, 0xff, 0xff, 0x20, 0xec, + 0x42, 0x27, 0xf2, 0x2f, 0x50, 0x0, 0x7f, 0x20, + 0xec, 0x42, 0x7f, 0xf2, 0x2, 0xbf, 0xfb, 0x6f, + 0x20, + + /* U+0062 "b" */ + 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0xec, 0x78, 0xef, + 0x30, 0x8f, 0xa0, 0x0, 0x1e, 0xc0, 0x8f, 0x20, + 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, 0xf3, + 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, 0x0, + 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, 0x8e, + 0x2b, 0xfe, 0xb3, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3a, 0xef, 0xc4, 0x0, 0x4f, 0xd8, 0x7c, + 0xf4, 0xd, 0xd0, 0x0, 0x7, 0x13, 0xf6, 0x0, + 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0x3, 0xf6, + 0x0, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x6, 0x10, + 0x4f, 0xd7, 0x7c, 0xf4, 0x0, 0x3a, 0xef, 0xc4, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x3b, 0xff, 0xa3, 0xf7, 0x4, 0xfd, 0x87, 0xce, + 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, 0x60, + 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, 0xf7, + 0x3f, 0x50, 0x0, 0x3, 0xf7, 0xe, 0xc0, 0x0, + 0xa, 0xf7, 0x4, 0xfc, 0x65, 0xbe, 0xf7, 0x0, + 0x3b, 0xff, 0xb2, 0xf7, + + /* U+0065 "e" */ + 0x0, 0x3b, 0xfe, 0xa2, 0x0, 0x4, 0xfc, 0x67, + 0xee, 0x20, 0xe, 0xc0, 0x0, 0x1e, 0xa0, 0x3f, + 0x50, 0x0, 0x7, 0xf0, 0x4f, 0xff, 0xff, 0xff, + 0xf1, 0x3f, 0x72, 0x22, 0x22, 0x20, 0xe, 0xc0, + 0x0, 0x2, 0x0, 0x4, 0xfd, 0x87, 0xaf, 0x50, + 0x0, 0x3a, 0xef, 0xd6, 0x0, + + /* U+0066 "f" */ + 0x0, 0x5d, 0xfc, 0x0, 0x2f, 0xb5, 0x70, 0x4, + 0xf3, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x48, 0xf7, + 0x53, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, + 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, 0x5f, + 0x30, 0x0, + + /* U+0067 "g" */ + 0x0, 0x3b, 0xff, 0xb2, 0xe9, 0x4, 0xfe, 0x87, + 0xcf, 0xf9, 0xe, 0xd1, 0x0, 0xa, 0xf9, 0x3f, + 0x60, 0x0, 0x1, 0xf9, 0x4f, 0x40, 0x0, 0x0, + 0xf9, 0x3f, 0x60, 0x0, 0x1, 0xf9, 0xe, 0xd0, + 0x0, 0x9, 0xf9, 0x4, 0xfd, 0x87, 0xcf, 0xf8, + 0x0, 0x3b, 0xff, 0xb3, 0xf7, 0x0, 0x0, 0x0, + 0x5, 0xf4, 0x9, 0xe9, 0x77, 0xaf, 0xb0, 0x1, + 0x7c, 0xff, 0xd8, 0x0, + + /* U+0068 "h" */ + 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf2, 0xbf, + 0xea, 0x10, 0x8f, 0xfb, 0x89, 0xfd, 0x8, 0xf8, + 0x0, 0x6, 0xf4, 0x8f, 0x10, 0x0, 0x1f, 0x78, + 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, + 0x88, 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, + 0xf, 0x88, 0xf0, 0x0, 0x0, 0xf8, + + /* U+0069 "i" */ + 0x9e, 0x1a, 0xf2, 0x0, 0x8, 0xf0, 0x8f, 0x8, + 0xf0, 0x8f, 0x8, 0xf0, 0x8f, 0x8, 0xf0, 0x8f, + 0x8, 0xf0, + + /* U+006A "j" */ + 0x0, 0x7, 0xe2, 0x0, 0x9, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, + 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, + 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, + 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x8, 0xf0, 0x18, + 0x6e, 0xc0, 0x3e, 0xfc, 0x20, + + /* U+006B "k" */ + 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, + 0x1d, 0xd1, 0x8f, 0x0, 0x1d, 0xe2, 0x8, 0xf0, + 0x1d, 0xe2, 0x0, 0x8f, 0x2d, 0xf3, 0x0, 0x8, + 0xfe, 0xff, 0x70, 0x0, 0x8f, 0xe2, 0xbf, 0x30, + 0x8, 0xf2, 0x1, 0xee, 0x10, 0x8f, 0x0, 0x3, + 0xfb, 0x8, 0xf0, 0x0, 0x7, 0xf7, + + /* U+006C "l" */ + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, + + /* U+006D "m" */ + 0x8e, 0x3c, 0xfe, 0x91, 0x3b, 0xfe, 0xa2, 0x8, + 0xff, 0x96, 0x9f, 0xcf, 0xc6, 0x8f, 0xd0, 0x8f, + 0x70, 0x0, 0x9f, 0xc0, 0x0, 0x5f, 0x58, 0xf1, + 0x0, 0x5, 0xf6, 0x0, 0x1, 0xf7, 0x8f, 0x0, + 0x0, 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, + 0x4, 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, + 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, 0x4, + 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0x4f, + 0x40, 0x0, 0xf, 0x80, + + /* U+006E "n" */ + 0x8e, 0x3b, 0xfe, 0xa1, 0x8, 0xff, 0xa6, 0x8f, + 0xd0, 0x8f, 0x80, 0x0, 0x6f, 0x48, 0xf1, 0x0, + 0x1, 0xf7, 0x8f, 0x0, 0x0, 0xf, 0x88, 0xf0, + 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, 0x88, + 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, + 0x80, + + /* U+006F "o" */ + 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x4, 0xfd, 0x87, + 0xcf, 0x60, 0xe, 0xd0, 0x0, 0xb, 0xf1, 0x3f, + 0x60, 0x0, 0x3, 0xf5, 0x4f, 0x30, 0x0, 0x1, + 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf5, 0xe, 0xd0, + 0x0, 0xb, 0xf1, 0x4, 0xfd, 0x77, 0xcf, 0x60, + 0x0, 0x3b, 0xef, 0xc4, 0x0, + + /* U+0070 "p" */ + 0x8e, 0x3b, 0xfe, 0xb3, 0x0, 0x8f, 0xfb, 0x57, + 0xdf, 0x30, 0x8f, 0x90, 0x0, 0xd, 0xc0, 0x8f, + 0x10, 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, + 0xf3, 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, + 0x0, 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, + 0x8f, 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x3b, 0xff, 0xa2, 0xf7, 0x4, 0xfd, 0x87, + 0xde, 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, + 0x60, 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, + 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf7, 0xe, 0xd0, + 0x0, 0xb, 0xf7, 0x4, 0xfd, 0x77, 0xce, 0xf7, + 0x0, 0x3b, 0xff, 0xa3, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x0, 0x0, 0x1, 0xf7, + + /* U+0072 "r" */ + 0x8e, 0x2b, 0xf0, 0x8f, 0xed, 0x90, 0x8f, 0xa0, + 0x0, 0x8f, 0x20, 0x0, 0x8f, 0x0, 0x0, 0x8f, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x8f, 0x0, 0x0, + 0x8f, 0x0, 0x0, + + /* U+0073 "s" */ + 0x2, 0xae, 0xfd, 0x91, 0x1e, 0xd7, 0x69, 0xd0, + 0x4f, 0x30, 0x0, 0x0, 0x2f, 0xb4, 0x10, 0x0, + 0x6, 0xef, 0xfd, 0x60, 0x0, 0x1, 0x5b, 0xf5, + 0x1, 0x0, 0x0, 0xf7, 0x5f, 0xa7, 0x6b, 0xf3, + 0x19, 0xdf, 0xec, 0x40, + + /* U+0074 "t" */ + 0x5, 0xf3, 0x0, 0x0, 0x5f, 0x30, 0x0, 0xcf, + 0xff, 0xfa, 0x4, 0x8f, 0x75, 0x30, 0x5, 0xf3, + 0x0, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x5f, 0x30, 0x0, 0x4, 0xf4, 0x0, 0x0, + 0x1f, 0xc6, 0x80, 0x0, 0x5d, 0xfc, 0x10, + + /* U+0075 "u" */ + 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, 0x2, + 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, + 0x2, 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x59, 0xf0, + 0x0, 0x4, 0xf5, 0x6f, 0x30, 0x0, 0xaf, 0x51, + 0xee, 0x76, 0xbf, 0xf5, 0x2, 0xbe, 0xfb, 0x3f, + 0x50, + + /* U+0076 "v" */ + 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf2, 0x0, + 0x2, 0xf5, 0x0, 0xf9, 0x0, 0x9, 0xe0, 0x0, + 0x9e, 0x0, 0xf, 0x80, 0x0, 0x2f, 0x60, 0x6f, + 0x10, 0x0, 0xc, 0xc0, 0xcb, 0x0, 0x0, 0x5, + 0xf6, 0xf4, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0x0, 0x8f, 0x70, 0x0, + + /* U+0077 "w" */ + 0xbb, 0x0, 0x0, 0x9f, 0x10, 0x0, 0x4f, 0x16, + 0xf1, 0x0, 0xe, 0xf6, 0x0, 0x9, 0xc0, 0xf, + 0x60, 0x5, 0xfc, 0xb0, 0x0, 0xf6, 0x0, 0xac, + 0x0, 0xab, 0x5f, 0x10, 0x5f, 0x10, 0x5, 0xf1, + 0xf, 0x50, 0xf7, 0xa, 0xb0, 0x0, 0xf, 0x76, + 0xf0, 0x9, 0xc0, 0xf5, 0x0, 0x0, 0xac, 0xba, + 0x0, 0x4f, 0x8f, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0xe, 0xe0, 0x0, + 0x8, 0xf4, 0x0, 0x0, + + /* U+0078 "x" */ + 0x4f, 0x70, 0x0, 0x9f, 0x20, 0x8f, 0x30, 0x5f, + 0x50, 0x0, 0xcd, 0x2e, 0x90, 0x0, 0x2, 0xff, + 0xd0, 0x0, 0x0, 0xa, 0xf6, 0x0, 0x0, 0x4, + 0xfd, 0xe1, 0x0, 0x1, 0xeb, 0xd, 0xc0, 0x0, + 0xbe, 0x10, 0x3f, 0x80, 0x6f, 0x40, 0x0, 0x7f, + 0x40, + + /* U+0079 "y" */ + 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf3, 0x0, + 0x2, 0xf4, 0x0, 0xea, 0x0, 0x9, 0xd0, 0x0, + 0x8f, 0x10, 0x1f, 0x70, 0x0, 0x1f, 0x70, 0x7f, + 0x10, 0x0, 0xa, 0xe0, 0xd9, 0x0, 0x0, 0x3, + 0xf9, 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xb0, 0x0, + 0x0, 0x0, 0x6f, 0x40, 0x0, 0x0, 0x0, 0xad, + 0x0, 0x0, 0x1c, 0x79, 0xf5, 0x0, 0x0, 0x1a, + 0xee, 0x70, 0x0, 0x0, + + /* U+007A "z" */ + 0x4f, 0xff, 0xff, 0xf9, 0x15, 0x55, 0x5b, 0xf4, + 0x0, 0x0, 0x4f, 0x80, 0x0, 0x1, 0xec, 0x0, + 0x0, 0xb, 0xe1, 0x0, 0x0, 0x8f, 0x40, 0x0, + 0x4, 0xf7, 0x0, 0x0, 0x1e, 0xe5, 0x55, 0x53, + 0x5f, 0xff, 0xff, 0xfc, + + /* U+007B "{" */ + 0x0, 0x2c, 0xf5, 0x0, 0xaf, 0x61, 0x0, 0xcc, + 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, 0x0, + 0xdb, 0x0, 0x2, 0xea, 0x0, 0x1f, 0xf4, 0x0, + 0x5, 0xfa, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, + 0x0, 0x0, 0xdb, 0x0, 0x0, 0xcc, 0x0, 0x0, + 0xaf, 0x61, 0x0, 0x2c, 0xf5, + + /* U+007C "|" */ + 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, + 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, + 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x10, + + /* U+007D "}" */ + 0xbe, 0x80, 0x3, 0xaf, 0x40, 0x1, 0xf6, 0x0, + 0x1f, 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x0, + 0xf9, 0x0, 0xa, 0xfb, 0x0, 0xfb, 0x20, 0x1f, + 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x1, 0xf6, + 0x3, 0xaf, 0x40, 0xbe, 0x90, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xe4, 0x0, + 0xb5, 0xc, 0x86, 0xf5, 0x1e, 0x20, 0xf0, 0x3, + 0xef, 0x90, 0x2, 0x0, 0x0, 0x10, 0x0, + + /* U+00B0 "°" */ + 0x2, 0xce, 0x90, 0xd, 0x40, 0x89, 0x3b, 0x0, + 0xe, 0x3b, 0x0, 0xe, 0xd, 0x40, 0x89, 0x2, + 0xce, 0x90, + + /* U+2022 "•" */ + 0x0, 0x8, 0xf8, 0xef, 0xe7, 0xf7, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F043 "" */ + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, + 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, + 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0C9 "" */ + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, + + /* U+F0E0 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, + 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, + 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, + 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 69, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 69, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18, .adv_w = 100, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 31, .adv_w = 180, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 159, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 177, .adv_w = 216, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 255, .adv_w = 176, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 327, .adv_w = 54, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 332, .adv_w = 86, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 362, .adv_w = 87, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 392, .adv_w = 102, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 417, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 449, .adv_w = 58, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 457, .adv_w = 98, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 466, .adv_w = 58, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 535, .adv_w = 171, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 595, .adv_w = 95, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 625, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 679, .adv_w = 146, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 733, .adv_w = 171, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 799, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 853, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 913, .adv_w = 153, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 967, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1027, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1087, .adv_w = 58, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1101, .adv_w = 58, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1119, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1151, .adv_w = 149, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1175, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1207, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1261, .adv_w = 265, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1381, .adv_w = 187, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1459, .adv_w = 194, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1525, .adv_w = 185, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1591, .adv_w = 211, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1663, .adv_w = 172, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1717, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1771, .adv_w = 198, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1843, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1909, .adv_w = 79, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1927, .adv_w = 131, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1975, .adv_w = 184, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2041, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2095, .adv_w = 244, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2173, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2239, .adv_w = 215, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2317, .adv_w = 185, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2377, .adv_w = 215, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2482, .adv_w = 186, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2542, .adv_w = 159, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2602, .adv_w = 150, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2662, .adv_w = 202, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2728, .adv_w = 182, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2806, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2914, .adv_w = 172, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2980, .adv_w = 166, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3052, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3118, .adv_w = 85, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3156, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3220, .adv_w = 85, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3250, .adv_w = 149, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 3278, .adv_w = 128, .box_w = 8, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3286, .adv_w = 154, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 3291, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3332, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3392, .adv_w = 146, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3433, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3493, .adv_w = 157, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3538, .adv_w = 90, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3580, .adv_w = 177, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3640, .adv_w = 174, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3694, .adv_w = 71, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3712, .adv_w = 73, .box_w = 6, .box_h = 15, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 3757, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3811, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3823, .adv_w = 271, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3891, .adv_w = 174, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3932, .adv_w = 163, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3977, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4037, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4097, .adv_w = 105, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4124, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4160, .adv_w = 106, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4199, .adv_w = 173, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4240, .adv_w = 143, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4285, .adv_w = 230, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4353, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4394, .adv_w = 143, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 4454, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4490, .adv_w = 90, .box_w = 6, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4535, .adv_w = 77, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4558, .adv_w = 90, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4596, .adv_w = 149, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 4619, .adv_w = 107, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 4637, .adv_w = 80, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4643, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4779, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4875, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4987, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5083, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5149, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5277, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5405, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5531, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5659, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5767, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5895, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5951, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6035, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6179, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6275, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6363, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6443, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6569, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6674, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6772, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6852, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 6964, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7034, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7104, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7202, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 7230, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7338, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7498, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7658, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7786, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7856, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7926, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8066, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8162, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8290, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8435, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8540, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8652, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8750, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8848, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8944, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 9040, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9152, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9264, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9372, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9534, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9630, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9780, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9880, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9980, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10080, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10180, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 10280, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10427, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10523, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10635, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10780, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10900, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10996, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 12, 0, 7, -6, 0, 0, + 0, 0, -14, -15, 2, 12, 6, 4, + -10, 2, 13, 1, 11, 3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, -8, 0, 0, 0, 0, + 0, -5, 4, 5, 0, 0, -3, 0, + -2, 3, 0, -3, 0, -3, -1, -5, + 0, 0, 0, 0, -3, 0, 0, -3, + -4, 0, 0, -3, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + -3, 0, -4, 0, -7, 0, -31, 0, + 0, -5, 0, 5, 8, 0, 0, -5, + 3, 3, 8, 5, -4, 5, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, -3, -13, 0, -10, + -2, 0, 0, 0, 0, 1, 10, 0, + -8, -2, -1, 1, 0, -4, 0, 0, + -2, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -20, -2, 10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 3, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 5, 3, 8, -3, 0, 0, 5, -3, + -8, -35, 2, 7, 5, 1, -3, 0, + 9, 0, 8, 0, 8, 0, -24, 0, + -3, 8, 0, 8, -3, 5, 3, 0, + 0, 1, -3, 0, 0, -4, 20, 0, + 20, 0, 8, 0, 11, 3, 4, 8, + 0, 0, 0, -9, 0, 0, 0, 0, + 1, -2, 0, 2, -5, -3, -5, 2, + 0, -3, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -14, 0, -16, 0, 0, 0, + 0, -2, 0, 25, -3, -3, 3, 3, + -2, 0, -3, 3, 0, 0, -14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -25, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -16, 0, 15, 0, 0, -9, 0, + 8, 0, -17, -25, -17, -5, 8, 0, + 0, -17, 0, 3, -6, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 8, -31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -5, 0, -1, + -1, -3, 0, 0, -2, 0, 0, 0, + -5, 0, -2, 0, -6, -5, 0, -6, + -8, -8, -5, 0, -5, 0, -5, 0, + 0, 0, 0, -2, 0, 0, 3, 0, + 2, -3, 0, 1, 0, 0, 0, 3, + -2, 0, 0, 0, -2, 3, 3, -1, + 0, 0, 0, -5, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 3, -2, 0, + -3, 0, -4, 0, 0, -2, 0, 8, + 0, 0, -3, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -3, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -3, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -3, 0, -4, 0, -8, + -2, -8, 5, 0, 0, -5, 3, 5, + 7, 0, -6, -1, -3, 0, -1, -12, + 3, -2, 2, -14, 3, 0, 0, 1, + -13, 0, -14, -2, -22, -2, 0, -13, + 0, 5, 7, 0, 3, 0, 0, 0, + 0, 1, 0, -5, -3, 0, -8, 0, + 0, 0, -3, 0, 0, 0, -3, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -3, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, -2, -3, -2, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -5, 3, 0, 0, -3, + 1, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -3, -4, 0, + -5, 0, 8, -2, 1, -8, 0, 0, + 7, -13, -13, -11, -5, 3, 0, -2, + -17, -5, 0, -5, 0, -5, 4, -5, + -16, 0, -7, 0, 0, 1, -1, 2, + -2, 0, 3, 0, -8, -10, 0, -13, + -6, -5, -6, -8, -3, -7, -1, -5, + -7, 2, 0, 1, 0, -3, 0, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -1, 0, -1, -3, 0, -4, -6, + -6, -1, 0, -8, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -5, 0, 0, 0, 0, -13, -8, 0, + 0, 0, -4, -13, 0, 0, -3, 3, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -5, 0, + 0, 0, 0, 3, 0, 2, -5, -5, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, -8, 0, -3, 0, -4, -3, + 0, -6, -6, -8, -2, 0, -5, 0, + -8, 0, 0, 0, 0, 20, 0, 0, + 1, 0, 0, -3, 0, 3, 0, -11, + 0, 0, 0, 0, 0, -24, -5, 8, + 8, -2, -11, 0, 3, -4, 0, -13, + -1, -3, 3, -18, -3, 3, 0, 4, + -9, -4, -9, -8, -11, 0, 0, -15, + 0, 15, 0, 0, -1, 0, 0, 0, + -1, -1, -3, -7, -8, -1, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -1, -3, -4, 0, 0, + -5, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -5, 0, 0, 5, + -1, 3, 0, -6, 3, -2, -1, -7, + -3, 0, -3, -3, -2, 0, -4, -4, + 0, 0, -2, -1, -2, -4, -3, 0, + 0, -3, 0, 3, -2, 0, -6, 0, + 0, 0, -5, 0, -4, 0, -4, -4, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 3, 0, -4, 0, -2, -3, + -8, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -3, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -2, -3, + -2, 0, 2, 10, -1, 0, -7, 0, + -2, 5, 0, -3, -11, -3, 4, 0, + 0, -12, -4, 3, -4, 2, 0, -2, + -2, -8, 0, -4, 1, 0, 0, -4, + 0, 0, 0, 3, 3, -5, -5, 0, + -4, -3, -4, -3, -3, 0, -4, 1, + -5, -4, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -3, + 0, 0, -3, -3, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -4, 0, -5, 0, 0, 0, -8, 0, + 2, -6, 5, 1, -2, -12, 0, 0, + -6, -3, 0, -10, -6, -7, 0, 0, + -11, -3, -10, -10, -12, 0, -7, 0, + 2, 17, -3, 0, -6, -3, -1, -3, + -4, -7, -5, -9, -10, -6, -3, 0, + 0, -2, 0, 1, 0, 0, -18, -2, + 8, 6, -6, -9, 0, 1, -8, 0, + -13, -2, -3, 5, -24, -3, 1, 0, + 0, -17, -3, -13, -3, -19, 0, 0, + -18, 0, 15, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -10, -2, 0, -17, + 0, 0, 0, 0, -8, 0, -2, 0, + -1, -7, -12, 0, 0, -1, -4, -8, + -3, 0, -2, 0, 0, 0, 0, -12, + -3, -8, -8, -2, -4, -6, -3, -4, + 0, -5, -2, -8, -4, 0, -3, -5, + -3, -5, 0, 1, 0, -2, -8, 0, + 5, 0, -5, 0, 0, 0, 0, 3, + 0, 2, -5, 10, 0, -3, -3, -3, + 0, 0, 0, 0, 0, 0, -8, 0, + -3, 0, -4, -3, 0, -6, -6, -8, + -2, 0, -5, 2, 10, 0, 0, 0, + 0, 20, 0, 0, 1, 0, 0, -3, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -5, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -3, -3, 0, 0, -5, + -3, 0, 0, -5, 0, 4, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 4, 5, 2, -2, 0, -8, + -4, 0, 8, -8, -8, -5, -5, 10, + 5, 3, -22, -2, 5, -3, 0, -3, + 3, -3, -9, 0, -3, 3, -3, -2, + -8, -2, 0, 0, 8, 5, 0, -7, + 0, -14, -3, 7, -3, -10, 1, -3, + -8, -8, -3, 10, 3, 0, -4, 0, + -7, 0, 2, 8, -6, -9, -10, -6, + 8, 0, 1, -19, -2, 3, -4, -2, + -6, 0, -6, -9, -4, -4, -2, 0, + 0, -6, -5, -3, 0, 8, 6, -3, + -14, 0, -14, -4, 0, -9, -15, -1, + -8, -4, -8, -7, 7, 0, 0, -3, + 0, -5, -2, 0, -3, -5, 0, 4, + -8, 3, 0, 0, -14, 0, -3, -6, + -4, -2, -8, -6, -8, -6, 0, -8, + -3, -6, -5, -8, -3, 0, 0, 1, + 12, -4, 0, -8, -3, 0, -3, -5, + -6, -7, -7, -10, -3, -5, 5, 0, + -4, 0, -13, -3, 2, 5, -8, -9, + -5, -8, 8, -3, 1, -24, -5, 5, + -6, -4, -9, 0, -8, -11, -3, -3, + -2, -3, -5, -8, -1, 0, 0, 8, + 7, -2, -17, 0, -15, -6, 6, -10, + -17, -5, -9, -11, -13, -8, 5, 0, + 0, 0, 0, -3, 0, 0, 3, -3, + 5, 2, -5, 5, 0, 0, -8, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 2, 8, 1, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 10, 0, 5, 1, 1, -3, + 0, 5, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, 0, -3, 4, 0, 8, + 0, 0, 25, 3, -5, -5, 3, 3, + -2, 1, -13, 0, 0, 12, -15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -17, 10, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -5, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -7, 0, + 0, 1, 0, 0, 3, 33, -5, -2, + 8, 7, -7, 3, 0, 0, 3, 3, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -33, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, 0, 0, -7, 0, 0, 0, 0, + -6, -1, 0, 0, 0, -6, 0, -3, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -17, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -3, 0, 0, -5, 0, -4, 0, + -7, 0, 0, 0, -4, 3, -3, 0, + 0, -7, -3, -6, 0, 0, -7, 0, + -3, 0, -12, 0, -3, 0, 0, -21, + -5, -10, -3, -9, 0, 0, -17, 0, + -7, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -5, -2, -4, 0, 0, + 0, 0, -6, 0, -6, 3, -3, 5, + 0, -2, -6, -2, -4, -5, 0, -3, + -1, -2, 2, -7, -1, 0, 0, 0, + -23, -2, -4, 0, -6, 0, -2, -12, + -2, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -4, -2, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, -6, 0, -2, 0, 0, 0, -5, + 3, 0, 0, 0, -7, -3, -5, 0, + 0, -7, 0, -3, 0, -12, 0, 0, + 0, 0, -25, 0, -5, -9, -13, 0, + 0, -17, 0, -2, -4, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -4, -1, + -4, 1, 0, 0, 4, -3, 0, 8, + 13, -3, -3, -8, 3, 13, 4, 6, + -7, 3, 11, 3, 7, 6, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 12, -5, -3, 0, -2, + 20, 11, 20, 0, 0, 0, 3, 0, + 0, 9, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, -22, -3, -2, -10, + -13, 0, 0, -17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, -22, -3, -2, + -10, -13, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -6, 3, 0, -3, + 2, 5, 3, -8, 0, -1, -2, 3, + 0, 2, 0, 0, 0, 0, -6, 0, + -2, -2, -5, 0, -2, -10, 0, 16, + -3, 0, -6, -2, 0, -2, -4, 0, + -3, -7, -5, -3, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, -22, + -3, -2, -10, -13, 0, 0, -17, 0, + 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, -8, -3, -2, 8, -2, -3, + -10, 1, -2, 1, -2, -7, 1, 6, + 1, 2, 1, 2, -6, -10, -3, 0, + -10, -5, -7, -11, -10, 0, -4, -5, + -3, -3, -2, -2, -3, -2, 0, -2, + -1, 4, 0, 4, -2, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -3, -3, 0, 0, + -7, 0, -1, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + 0, 0, 0, 0, -2, 0, 0, -4, + -3, 3, 0, -4, -5, -2, 0, -7, + -2, -6, -2, -3, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 8, 0, 0, -5, 0, + 0, 0, 0, -3, 0, -3, 0, 0, + -1, 0, 0, -2, 0, -6, 0, 0, + 11, -3, -8, -8, 2, 3, 3, -1, + -7, 2, 4, 2, 8, 2, 8, -2, + -7, 0, 0, -10, 0, 0, -8, -7, + 0, 0, -5, 0, -3, -4, 0, -4, + 0, -4, 0, -2, 4, 0, -2, -8, + -3, 9, 0, 0, -2, 0, -5, 0, + 0, 3, -6, 0, 3, -3, 2, 0, + 0, -8, 0, -2, -1, 0, -3, 3, + -2, 0, 0, 0, -10, -3, -6, 0, + -8, 0, 0, -12, 0, 9, -3, 0, + -5, 0, 2, 0, -3, 0, -3, -8, + 0, -3, 3, 0, 0, 0, 0, -2, + 0, 0, 3, -3, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -16, 0, 6, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 0, 5, 0, 6, + 0, 0, 0, 0, 0, -16, -15, 1, + 11, 8, 4, -10, 2, 11, 0, 9, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_16 = { +#else +lv_font_t lv_font_montserrat_16 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 18, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_16*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_18.c b/inc/lvgl/src/font/lv_font_montserrat_18.c new file mode 100644 index 0000000..de73390 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_18.c @@ -0,0 +1,2860 @@ +/******************************************************************************* + * Size: 18 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 18 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_18.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_18 + #define LV_FONT_MONTSERRAT_18 1 +#endif + +#if LV_FONT_MONTSERRAT_18 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x9f, 0x68, 0xf6, 0x8f, 0x57, 0xf4, 0x6f, 0x46, + 0xf3, 0x5f, 0x35, 0xf2, 0x4f, 0x10, 0x0, 0x15, + 0xa, 0xf7, 0x7f, 0x40, + + /* U+0022 "\"" */ + 0xda, 0x9, 0xed, 0x90, 0x9d, 0xd9, 0x8, 0xdc, + 0x80, 0x8d, 0xc8, 0x8, 0xc0, 0x0, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0xe5, 0x0, 0x4f, 0x0, 0x0, 0x0, + 0xf, 0x30, 0x6, 0xe0, 0x0, 0x0, 0x2, 0xf1, + 0x0, 0x8c, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x5, 0x5a, 0xe5, 0x55, 0xda, 0x55, + 0x0, 0x0, 0x9b, 0x0, 0xe, 0x60, 0x0, 0x0, + 0xb, 0x90, 0x0, 0xf4, 0x0, 0x0, 0x11, 0xd8, + 0x11, 0x3f, 0x31, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2, 0x45, 0xf6, 0x44, 0x8e, 0x44, + 0x20, 0x0, 0x2f, 0x10, 0x7, 0xc0, 0x0, 0x0, + 0x4, 0xf0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x5e, + 0x0, 0xb, 0x90, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, + 0x0, 0x2, 0xad, 0xff, 0xd9, 0x20, 0x3, 0xff, + 0xbf, 0xcd, 0xfc, 0x0, 0xbf, 0x40, 0xe4, 0x3, + 0x30, 0xe, 0xd0, 0xe, 0x40, 0x0, 0x0, 0xdf, + 0x30, 0xe4, 0x0, 0x0, 0x5, 0xff, 0xaf, 0x50, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xd7, 0x0, 0x0, + 0x0, 0x1e, 0xbe, 0xfb, 0x0, 0x0, 0x0, 0xe4, + 0xb, 0xf4, 0x0, 0x0, 0xe, 0x40, 0x6f, 0x60, + 0xb4, 0x0, 0xe4, 0xb, 0xf3, 0x1e, 0xfd, 0xaf, + 0xbe, 0xfa, 0x0, 0x17, 0xcf, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xe4, 0x0, 0x0, + + /* U+0025 "%" */ + 0x1, 0xbf, 0xc3, 0x0, 0x0, 0x2f, 0x40, 0x0, + 0xc9, 0x16, 0xe0, 0x0, 0xc, 0x90, 0x0, 0x2f, + 0x0, 0xc, 0x50, 0x7, 0xe0, 0x0, 0x4, 0xd0, + 0x0, 0xa7, 0x2, 0xf4, 0x0, 0x0, 0x3f, 0x0, + 0xc, 0x60, 0xc9, 0x0, 0x0, 0x0, 0xd7, 0x4, + 0xf1, 0x7e, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xe4, + 0x2f, 0x41, 0xae, 0xb2, 0x0, 0x0, 0x10, 0xc, + 0x90, 0xc9, 0x28, 0xe0, 0x0, 0x0, 0x6, 0xe1, + 0x3f, 0x0, 0xd, 0x50, 0x0, 0x2, 0xf4, 0x4, + 0xd0, 0x0, 0xa7, 0x0, 0x0, 0xba, 0x0, 0x3e, + 0x0, 0xc, 0x50, 0x0, 0x6e, 0x10, 0x0, 0xd7, + 0x5, 0xe1, 0x0, 0x1f, 0x50, 0x0, 0x2, 0xbf, + 0xc3, 0x0, + + /* U+0026 "&" */ + 0x0, 0x4, 0xcf, 0xe9, 0x0, 0x0, 0x0, 0x3, + 0xfb, 0x57, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0x8, 0xf1, 0x0, 0xdb, + 0x0, 0x0, 0x0, 0x2f, 0xb3, 0xce, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x20, 0x0, 0x0, 0x0, + 0x4e, 0xef, 0xb0, 0x0, 0x10, 0x0, 0x5f, 0xa0, + 0x6f, 0xb0, 0x1f, 0x50, 0xe, 0xc0, 0x0, 0x6f, + 0xb7, 0xf2, 0x2, 0xf8, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0xf, 0xd0, 0x0, 0x1, 0xdf, 0xb0, 0x0, + 0x8f, 0xe9, 0x8a, 0xfe, 0x8f, 0xb0, 0x0, 0x5c, + 0xff, 0xd9, 0x10, 0x68, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xda, 0xd9, 0xd9, 0xc8, 0xc8, 0x0, + + /* U+0028 "(" */ + 0x0, 0x6f, 0x40, 0xd, 0xc0, 0x4, 0xf6, 0x0, + 0x9f, 0x10, 0xd, 0xd0, 0x0, 0xfb, 0x0, 0x2f, + 0x80, 0x3, 0xf7, 0x0, 0x4f, 0x60, 0x4, 0xf6, + 0x0, 0x3f, 0x70, 0x2, 0xf8, 0x0, 0xf, 0xb0, + 0x0, 0xdd, 0x0, 0x8, 0xf1, 0x0, 0x3f, 0x60, + 0x0, 0xdc, 0x0, 0x6, 0xf4, + + /* U+0029 ")" */ + 0x3f, 0x70, 0x0, 0xbe, 0x0, 0x5, 0xf5, 0x0, + 0x1f, 0xa0, 0x0, 0xce, 0x0, 0x9, 0xf1, 0x0, + 0x7f, 0x30, 0x6, 0xf4, 0x0, 0x5f, 0x50, 0x5, + 0xf5, 0x0, 0x6f, 0x40, 0x7, 0xf3, 0x0, 0x9f, + 0x10, 0xc, 0xe0, 0x1, 0xfa, 0x0, 0x5f, 0x50, + 0xb, 0xe0, 0x3, 0xf7, 0x0, + + /* U+002A "*" */ + 0x0, 0xe, 0x20, 0x3, 0x60, 0xe2, 0x56, 0x4d, + 0xdf, 0xce, 0x60, 0x1d, 0xff, 0x30, 0x4e, 0xcf, + 0xbf, 0x63, 0x60, 0xe2, 0x45, 0x0, 0xe, 0x20, + 0x0, + + /* U+002B "+" */ + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x0, 0x8, 0xf0, 0x0, 0x1, 0x22, 0x9f, + 0x22, 0x20, 0xcf, 0xff, 0xff, 0xff, 0x44, 0x55, + 0xaf, 0x55, 0x51, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, + 0x0, + + /* U+002C "," */ + 0x1, 0x10, 0xe, 0xf1, 0xf, 0xf2, 0x7, 0xe0, + 0xb, 0x90, 0xe, 0x40, + + /* U+002D "-" */ + 0x88, 0x88, 0x7f, 0xff, 0xfe, + + /* U+002E "." */ + 0x5, 0x60, 0x1f, 0xf2, 0xc, 0xd0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0xea, + 0x0, 0x0, 0x3, 0xf5, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0x4, 0xf4, 0x0, 0x0, 0x9, 0xe0, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x4f, 0x40, 0x0, + 0x0, 0xae, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, + 0x5, 0xf3, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, + 0xf, 0x90, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, 0x0, 0x6f, + 0xfb, 0xbf, 0xf6, 0x0, 0x2, 0xfd, 0x10, 0x1, + 0xdf, 0x20, 0xa, 0xf3, 0x0, 0x0, 0x3f, 0xa0, + 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0xf, 0xb0, + 0x0, 0x0, 0xb, 0xf0, 0x1f, 0xa0, 0x0, 0x0, + 0xa, 0xf1, 0xf, 0xb0, 0x0, 0x0, 0xb, 0xf0, + 0xe, 0xe0, 0x0, 0x0, 0xe, 0xe0, 0x9, 0xf3, + 0x0, 0x0, 0x3f, 0x90, 0x2, 0xfd, 0x10, 0x1, + 0xdf, 0x20, 0x0, 0x6f, 0xfb, 0xbf, 0xf6, 0x0, + 0x0, 0x4, 0xbe, 0xeb, 0x40, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xc8, 0xaa, 0xfc, 0x0, 0xf, 0xc0, + 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, + 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, 0xc0, 0x0, + 0xfc, 0x0, 0xf, 0xc0, 0x0, 0xfc, 0x0, 0xf, + 0xc0, + + /* U+0032 "2" */ + 0x1, 0x8d, 0xfe, 0xc5, 0x0, 0x4f, 0xfd, 0xac, + 0xff, 0x70, 0x3c, 0x30, 0x0, 0x2f, 0xf0, 0x0, + 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, 0xc, + 0xf1, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x2, 0xee, 0x20, 0x0, 0x0, 0x2e, 0xf3, 0x0, + 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, 0xf3, + 0x0, 0x0, 0x2, 0xef, 0x30, 0x0, 0x0, 0x2e, + 0xfc, 0xaa, 0xaa, 0xa7, 0x5f, 0xff, 0xff, 0xff, + 0xfb, + + /* U+0033 "3" */ + 0x5f, 0xff, 0xff, 0xff, 0xf0, 0x3a, 0xaa, 0xaa, + 0xcf, 0xc0, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, + 0x0, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x9f, 0x60, + 0x0, 0x0, 0x4, 0xfe, 0x61, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3e, 0xf2, + 0x0, 0x0, 0x0, 0x7, 0xf6, 0x0, 0x0, 0x0, + 0x6, 0xf6, 0x69, 0x10, 0x0, 0x1d, 0xf2, 0x9f, + 0xfc, 0xbc, 0xff, 0x80, 0x4, 0xae, 0xfe, 0xb5, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, + 0x0, 0x5, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xc0, 0x3, 0xc5, 0x0, 0x0, 0xde, 0x10, 0x4, + 0xf7, 0x0, 0xb, 0xf4, 0x0, 0x4, 0xf7, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x39, 0x99, + 0x99, 0x9b, 0xfc, 0x98, 0x0, 0x0, 0x0, 0x5, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + + /* U+0035 "5" */ + 0x2, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xfc, 0xaa, + 0xaa, 0xa0, 0x5, 0xf5, 0x0, 0x0, 0x0, 0x7, + 0xf3, 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc7, 0x0, 0x7, 0xaa, + 0xab, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xf6, + 0x0, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, + 0x3, 0xfa, 0x3c, 0x20, 0x0, 0xb, 0xf6, 0x6f, + 0xfd, 0xbb, 0xef, 0xb0, 0x3, 0x9d, 0xff, 0xc7, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x1, 0x8d, 0xfe, 0xc6, 0x0, 0x4, 0xef, + 0xca, 0xad, 0x90, 0x1, 0xee, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0x40, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xfb, 0x2a, 0xef, 0xd7, + 0x0, 0x1f, 0xdf, 0xd9, 0x9d, 0xfb, 0x1, 0xff, + 0xa0, 0x0, 0xa, 0xf5, 0xf, 0xf2, 0x0, 0x0, + 0x3f, 0x90, 0xbf, 0x20, 0x0, 0x3, 0xf8, 0x4, + 0xfa, 0x0, 0x0, 0xaf, 0x40, 0x9, 0xfd, 0x99, + 0xdf, 0xa0, 0x0, 0x5, 0xcf, 0xfc, 0x60, 0x0, + + /* U+0037 "7" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7, 0xfb, 0xaa, + 0xaa, 0xaf, 0xe0, 0x7f, 0x40, 0x0, 0x5, 0xf8, + 0x6, 0xf4, 0x0, 0x0, 0xcf, 0x10, 0x0, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x50, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x4f, 0x90, + 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x2a, 0xef, 0xfc, 0x70, 0x0, 0x3f, 0xfb, + 0x89, 0xdf, 0xb0, 0xa, 0xf5, 0x0, 0x0, 0xbf, + 0x30, 0xbf, 0x10, 0x0, 0x8, 0xf4, 0x4, 0xfc, + 0x42, 0x26, 0xfd, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0x10, 0x5, 0xfe, 0x85, 0x6a, 0xfd, 0x10, 0xee, + 0x10, 0x0, 0x7, 0xf8, 0x2f, 0xa0, 0x0, 0x0, + 0x1f, 0xb2, 0xfb, 0x0, 0x0, 0x2, 0xfb, 0xd, + 0xf4, 0x0, 0x0, 0xaf, 0x70, 0x3f, 0xfb, 0x89, + 0xdf, 0xc0, 0x0, 0x29, 0xdf, 0xfc, 0x60, 0x0, + + /* U+0039 "9" */ + 0x0, 0x6c, 0xff, 0xc6, 0x0, 0x0, 0xaf, 0xd9, + 0x8c, 0xfa, 0x0, 0x3f, 0xb0, 0x0, 0x7, 0xf6, + 0x7, 0xf5, 0x0, 0x0, 0xf, 0xd0, 0x6f, 0x60, + 0x0, 0x2, 0xff, 0x11, 0xff, 0x51, 0x4, 0xdf, + 0xf2, 0x4, 0xef, 0xff, 0xfb, 0x9f, 0x30, 0x0, + 0x57, 0x73, 0xa, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, + 0x0, 0x0, 0x3e, 0xf2, 0x0, 0x8e, 0xba, 0xcf, + 0xf5, 0x0, 0x5, 0xbe, 0xfd, 0x92, 0x0, 0x0, + + /* U+003A ":" */ + 0xc, 0xd0, 0x1f, 0xf2, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x60, + 0x1f, 0xf2, 0xc, 0xd0, + + /* U+003B ";" */ + 0xc, 0xd0, 0x1f, 0xf2, 0x5, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0xe, 0xf1, 0xf, 0xf2, 0x7, 0xe0, 0xb, 0x90, + 0xe, 0x40, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x1, 0x8e, + 0xf4, 0x0, 0x4b, 0xff, 0x93, 0x6, 0xdf, 0xc6, + 0x0, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x5, 0xcf, + 0xe7, 0x10, 0x0, 0x0, 0x39, 0xff, 0xb4, 0x0, + 0x0, 0x1, 0x6d, 0xf4, 0x0, 0x0, 0x0, 0x4, + 0x20, + + /* U+003D "=" */ + 0xcf, 0xff, 0xff, 0xff, 0x46, 0x77, 0x77, 0x77, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0xc, 0xff, + 0xff, 0xff, 0xf4, 0x45, 0x55, 0x55, 0x55, 0x10, + + /* U+003E ">" */ + 0x62, 0x0, 0x0, 0x0, 0xc, 0xfb, 0x40, 0x0, + 0x0, 0x6, 0xcf, 0xe7, 0x10, 0x0, 0x0, 0x39, + 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, 0x40, 0x0, + 0x4b, 0xff, 0x91, 0x18, 0xef, 0xc6, 0x0, 0xc, + 0xfa, 0x30, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x2, 0x9d, 0xfe, 0xc5, 0x0, 0x4f, 0xfb, 0x9b, + 0xff, 0x80, 0x4c, 0x20, 0x0, 0x2f, 0xf0, 0x0, + 0x0, 0x0, 0xc, 0xf0, 0x0, 0x0, 0x0, 0x1f, + 0xc0, 0x0, 0x0, 0x1, 0xcf, 0x30, 0x0, 0x0, + 0x1d, 0xf4, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, + 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0xcd, 0x0, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x2, 0x9d, 0xff, 0xec, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xc7, 0x54, 0x58, 0xdf, + 0x60, 0x0, 0x0, 0xc, 0xe4, 0x0, 0x0, 0x0, + 0x6, 0xf9, 0x0, 0x0, 0xae, 0x10, 0x3b, 0xef, + 0xb2, 0xbd, 0x3f, 0x60, 0x4, 0xf4, 0x4, 0xfe, + 0x97, 0xcf, 0xed, 0x6, 0xe0, 0xa, 0xc0, 0xe, + 0xe1, 0x0, 0x8, 0xfd, 0x0, 0xe5, 0xe, 0x60, + 0x4f, 0x60, 0x0, 0x0, 0xfd, 0x0, 0xa9, 0x1f, + 0x40, 0x6f, 0x30, 0x0, 0x0, 0xcd, 0x0, 0x8b, + 0x2f, 0x30, 0x6f, 0x30, 0x0, 0x0, 0xcd, 0x0, + 0x8b, 0x1f, 0x40, 0x3f, 0x60, 0x0, 0x0, 0xfd, + 0x0, 0x99, 0xe, 0x60, 0xe, 0xe1, 0x0, 0x8, + 0xfe, 0x0, 0xe5, 0xa, 0xc0, 0x4, 0xfe, 0x87, + 0xbf, 0xaf, 0x9b, 0xe0, 0x4, 0xf4, 0x0, 0x3b, + 0xff, 0xb3, 0x1b, 0xfc, 0x30, 0x0, 0x9e, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xc7, 0x54, 0x6a, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9d, 0xff, 0xdb, 0x50, 0x0, + 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf6, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdd, 0xb, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x60, 0x4f, 0x70, 0x0, 0x0, 0x0, 0xb, + 0xe0, 0x0, 0xdd, 0x0, 0x0, 0x0, 0x2, 0xf8, + 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0x10, + 0x0, 0xe, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xf8, 0x88, 0x88, + 0x88, 0xfa, 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, + 0xb, 0xf1, 0x0, 0x5f, 0x60, 0x0, 0x0, 0x0, + 0x4f, 0x80, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xee, 0x0, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xff, 0xfe, 0xb4, 0x0, 0x1f, 0xd8, + 0x88, 0x8a, 0xff, 0x70, 0x1f, 0xb0, 0x0, 0x0, + 0x2f, 0xf0, 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0x2f, 0xc0, 0x1f, 0xd8, + 0x88, 0x8a, 0xfe, 0x30, 0x1f, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x1f, 0xb0, 0x0, 0x1, 0x4d, 0xf3, + 0x1f, 0xb0, 0x0, 0x0, 0x4, 0xf9, 0x1f, 0xb0, + 0x0, 0x0, 0x2, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x8, 0xf8, 0x1f, 0xd8, 0x88, 0x89, 0xcf, 0xe1, + 0x1f, 0xff, 0xff, 0xff, 0xd9, 0x10, + + /* U+0043 "C" */ + 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x1, + 0xbf, 0xfc, 0xac, 0xff, 0xb0, 0x0, 0xbf, 0xb2, + 0x0, 0x1, 0x9c, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xb2, 0x0, 0x1, 0xac, 0x10, + 0x1, 0xbf, 0xfc, 0xbc, 0xff, 0xb0, 0x0, 0x0, + 0x4b, 0xef, 0xeb, 0x50, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x1, 0xfe, + 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x2b, 0xfa, 0x1, 0xfb, 0x0, 0x0, 0x0, + 0xc, 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x3f, + 0xb1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xee, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0xd, 0xf1, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xee, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x3f, 0xb1, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xf4, 0x1f, 0xb0, 0x0, 0x0, 0x2b, 0xfa, 0x1, + 0xfe, 0xaa, 0xaa, 0xcf, 0xfa, 0x0, 0x1f, 0xff, + 0xff, 0xfd, 0xa4, 0x0, 0x0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1, 0xfe, 0xaa, + 0xaa, 0xaa, 0x70, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0xfd, 0x99, 0x99, 0x99, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1, 0xfe, 0xaa, 0xaa, + 0xaa, 0xa0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xea, 0xaa, + 0xaa, 0xa7, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xe9, 0x99, 0x99, 0x90, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x1, + 0xbf, 0xfc, 0xbb, 0xff, 0xc1, 0x0, 0xbf, 0xb2, + 0x0, 0x0, 0x7d, 0x10, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x39, 0x30, 0xfc, 0x0, + 0x0, 0x0, 0x6, 0xf5, 0xc, 0xf1, 0x0, 0x0, + 0x0, 0x6f, 0x50, 0x6f, 0xb0, 0x0, 0x0, 0x6, + 0xf5, 0x0, 0xbf, 0xb2, 0x0, 0x0, 0x9f, 0x50, + 0x0, 0xaf, 0xfd, 0xbc, 0xff, 0xd2, 0x0, 0x0, + 0x4a, 0xef, 0xeb, 0x60, 0x0, + + /* U+0048 "H" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xea, + 0xaa, 0xaa, 0xaa, 0xfb, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0x1, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, + + /* U+0049 "I" */ + 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, + 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, 0xb1, 0xfb, 0x1f, + 0xb1, 0xfb, 0x1f, 0xb0, + + /* U+004A "J" */ + 0x0, 0xef, 0xff, 0xff, 0x70, 0x8, 0xaa, 0xab, + 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, 0x0, + 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, 0x0, + 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x5, 0xf7, 0x0, 0x0, 0x0, 0x5f, + 0x70, 0x0, 0x0, 0x6, 0xf6, 0xa, 0x70, 0x0, + 0xcf, 0x30, 0xcf, 0xda, 0xdf, 0xc0, 0x0, 0x8d, + 0xfe, 0x90, 0x0, + + /* U+004B "K" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xe2, 0x1f, 0xb0, + 0x0, 0x1, 0xdf, 0x30, 0x1f, 0xb0, 0x0, 0xc, + 0xf4, 0x0, 0x1f, 0xb0, 0x0, 0xbf, 0x50, 0x0, + 0x1f, 0xb0, 0xb, 0xf7, 0x0, 0x0, 0x1f, 0xb0, + 0xaf, 0x80, 0x0, 0x0, 0x1f, 0xb9, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xbb, 0xf8, 0x0, 0x0, + 0x1f, 0xfb, 0x1, 0xdf, 0x50, 0x0, 0x1f, 0xd0, + 0x0, 0x2f, 0xf2, 0x0, 0x1f, 0xb0, 0x0, 0x4, + 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, 0x7f, 0xb0, + 0x1f, 0xb0, 0x0, 0x0, 0x9, 0xf8, + + /* U+004C "L" */ + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x1f, + 0xea, 0xaa, 0xaa, 0xa5, 0x1f, 0xff, 0xff, 0xff, + 0xf8, + + /* U+004D "M" */ + 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x41, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xf4, 0x1f, + 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0x41, 0xff, + 0xf5, 0x0, 0x0, 0x2, 0xfe, 0xf4, 0x1f, 0xad, + 0xe0, 0x0, 0x0, 0xbe, 0x8f, 0x41, 0xfa, 0x4f, + 0x80, 0x0, 0x4f, 0x67, 0xf4, 0x1f, 0xa0, 0xaf, + 0x20, 0xd, 0xd0, 0x7f, 0x41, 0xfa, 0x2, 0xfa, + 0x7, 0xf4, 0x7, 0xf4, 0x1f, 0xa0, 0x8, 0xf5, + 0xea, 0x0, 0x7f, 0x41, 0xfa, 0x0, 0xe, 0xff, + 0x20, 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x5f, 0x80, + 0x0, 0x6f, 0x41, 0xfa, 0x0, 0x0, 0x60, 0x0, + 0x6, 0xf4, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0x40, + + /* U+004E "N" */ + 0x1f, 0xb0, 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xf8, + 0x0, 0x0, 0x1, 0xfb, 0x1f, 0xff, 0x50, 0x0, + 0x1, 0xfb, 0x1f, 0xdf, 0xf2, 0x0, 0x1, 0xfb, + 0x1f, 0xb6, 0xfd, 0x0, 0x1, 0xfb, 0x1f, 0xb0, + 0x9f, 0xa0, 0x1, 0xfb, 0x1f, 0xb0, 0xc, 0xf6, + 0x1, 0xfb, 0x1f, 0xb0, 0x1, 0xef, 0x31, 0xfb, + 0x1f, 0xb0, 0x0, 0x4f, 0xe2, 0xfb, 0x1f, 0xb0, + 0x0, 0x7, 0xfd, 0xfb, 0x1f, 0xb0, 0x0, 0x0, + 0xbf, 0xfb, 0x1f, 0xb0, 0x0, 0x0, 0x1d, 0xfb, + 0x1f, 0xb0, 0x0, 0x0, 0x2, 0xfb, + + /* U+004F "O" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, + 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf2, 0x1f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf2, 0xc, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0x0, 0x9f, 0x80, 0x0, 0xbf, 0xb2, 0x0, 0x1, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xfc, 0xbc, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x4a, 0xef, 0xeb, 0x50, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, + 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, + 0x0, 0x0, 0xe, 0xf0, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xea, 0xaa, 0xbe, 0xfd, 0x10, + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0xbc, 0xff, 0xc1, 0x0, 0x0, + 0xbf, 0xb2, 0x0, 0x1, 0xaf, 0xd0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfe, 0x0, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x1f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x30, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf2, 0xd, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xfe, 0x0, 0x7f, 0xa0, 0x0, 0x0, + 0x0, 0x8f, 0x80, 0x0, 0xcf, 0xa1, 0x0, 0x0, + 0x9f, 0xd0, 0x0, 0x1, 0xcf, 0xfb, 0xab, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x6c, 0xef, 0xfd, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xe6, 0x34, + 0xa7, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0x43, 0x0, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x1f, 0xea, + 0xaa, 0xbe, 0xfd, 0x10, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xb0, 0x0, 0x0, 0xe, 0xf0, + 0x1f, 0xb0, 0x0, 0x0, 0xc, 0xf0, 0x1f, 0xb0, + 0x0, 0x0, 0xe, 0xe0, 0x1f, 0xb0, 0x0, 0x0, + 0x9f, 0x90, 0x1f, 0xd9, 0x99, 0xae, 0xfd, 0x10, + 0x1f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xb0, + 0x0, 0x1f, 0xd0, 0x0, 0x1f, 0xb0, 0x0, 0x6, + 0xf9, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0xbf, 0x40, + 0x1f, 0xb0, 0x0, 0x0, 0x1e, 0xe0, + + /* U+0053 "S" */ + 0x0, 0x29, 0xdf, 0xfd, 0x81, 0x0, 0x3f, 0xfc, + 0x9a, 0xdf, 0xc0, 0xb, 0xf4, 0x0, 0x0, 0x23, + 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x61, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xfd, 0x70, 0x0, 0x0, + 0x0, 0x48, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x0, 0x0, 0x6, 0xf6, 0xb, + 0x50, 0x0, 0x0, 0xcf, 0x31, 0xdf, 0xeb, 0x9a, + 0xef, 0x90, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0x89, 0xaa, 0xad, + 0xfb, 0xaa, 0xa5, 0x0, 0x0, 0x9f, 0x20, 0x0, + 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, + 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, + 0x0, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x20, 0x0, 0x0, 0x0, 0x9, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, + 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, + 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, + 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, + 0x0, 0x0, 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, + 0x5, 0xf7, 0x3f, 0x90, 0x0, 0x0, 0x5, 0xf6, + 0x2f, 0xb0, 0x0, 0x0, 0x7, 0xf5, 0xe, 0xf0, + 0x0, 0x0, 0xb, 0xf2, 0x8, 0xfa, 0x0, 0x0, + 0x7f, 0xb0, 0x0, 0xcf, 0xfb, 0xbe, 0xfe, 0x20, + 0x0, 0x7, 0xcf, 0xfd, 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf2, 0x0, 0x0, 0x0, 0x2, 0xf9, 0x6, + 0xf8, 0x0, 0x0, 0x0, 0x9, 0xf3, 0x0, 0xef, + 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x8f, 0x60, + 0x0, 0x0, 0x7f, 0x50, 0x0, 0x1f, 0xd0, 0x0, + 0x0, 0xee, 0x0, 0x0, 0xa, 0xf4, 0x0, 0x5, + 0xf7, 0x0, 0x0, 0x3, 0xfb, 0x0, 0xc, 0xf1, + 0x0, 0x0, 0x0, 0xdf, 0x20, 0x2f, 0xa0, 0x0, + 0x0, 0x0, 0x6f, 0x80, 0x9f, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xe1, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x80, 0x0, 0x0, + + /* U+0057 "W" */ + 0x4f, 0x90, 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, + 0x2, 0xf8, 0xe, 0xe0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x8, 0xf3, 0x9, 0xf3, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0xd, 0xd0, 0x4, 0xf8, + 0x0, 0x0, 0xcd, 0x8f, 0x20, 0x0, 0x2f, 0x80, + 0x0, 0xfe, 0x0, 0x2, 0xf8, 0x3f, 0x80, 0x0, + 0x7f, 0x30, 0x0, 0xaf, 0x30, 0x7, 0xf3, 0xe, + 0xd0, 0x0, 0xde, 0x0, 0x0, 0x5f, 0x80, 0xc, + 0xd0, 0x8, 0xf2, 0x2, 0xf9, 0x0, 0x0, 0xf, + 0xd0, 0x2f, 0x80, 0x3, 0xf7, 0x7, 0xf4, 0x0, + 0x0, 0xa, 0xf2, 0x7f, 0x30, 0x0, 0xed, 0xc, + 0xe0, 0x0, 0x0, 0x5, 0xf7, 0xdd, 0x0, 0x0, + 0x9f, 0x4f, 0x90, 0x0, 0x0, 0x0, 0xfe, 0xf8, + 0x0, 0x0, 0x3f, 0xdf, 0x40, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x0, + + /* U+0058 "X" */ + 0x2f, 0xd0, 0x0, 0x0, 0xb, 0xf3, 0x6, 0xfa, + 0x0, 0x0, 0x7f, 0x70, 0x0, 0xbf, 0x50, 0x2, + 0xfc, 0x0, 0x0, 0x1e, 0xe1, 0xd, 0xf2, 0x0, + 0x0, 0x5, 0xfb, 0x8f, 0x50, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x0, + 0x0, 0x9, 0xf6, 0x5f, 0xa0, 0x0, 0x0, 0x4f, + 0xb0, 0xa, 0xf6, 0x0, 0x1, 0xee, 0x10, 0x1, + 0xef, 0x20, 0xb, 0xf5, 0x0, 0x0, 0x4f, 0xc0, + 0x6f, 0xa0, 0x0, 0x0, 0x8, 0xf8, + + /* U+0059 "Y" */ + 0xc, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0x60, 0x3f, + 0xb0, 0x0, 0x0, 0xe, 0xd0, 0x0, 0x9f, 0x50, + 0x0, 0x8, 0xf3, 0x0, 0x1, 0xee, 0x0, 0x2, + 0xfa, 0x0, 0x0, 0x6, 0xf8, 0x0, 0xbf, 0x10, + 0x0, 0x0, 0xc, 0xf1, 0x4f, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xbd, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfb, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xa, 0xaa, + 0xaa, 0xaa, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x20, 0x0, 0x0, 0x0, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xa0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfb, 0xaa, 0xaa, 0xaa, 0xa2, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+005B "[" */ + 0x1f, 0xff, 0xa1, 0xfc, 0x74, 0x1f, 0xa0, 0x1, + 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, 0x1f, + 0xa0, 0x1, 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, + 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, 0x1f, 0xa0, + 0x1, 0xfa, 0x0, 0x1f, 0xa0, 0x1, 0xfa, 0x0, + 0x1f, 0xc7, 0x41, 0xff, 0xfa, + + /* U+005C "\\" */ + 0x47, 0x0, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, + 0x5, 0xf3, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, + 0x0, 0xae, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0xf, 0x90, 0x0, 0x0, 0xa, 0xe0, 0x0, + 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0xea, + + /* U+005D "]" */ + 0xaf, 0xff, 0x14, 0x7c, 0xf1, 0x0, 0xaf, 0x10, + 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, 0x0, + 0xaf, 0x10, 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, + 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, 0x0, 0xaf, + 0x10, 0xa, 0xf1, 0x0, 0xaf, 0x10, 0xa, 0xf1, + 0x47, 0xcf, 0x1a, 0xff, 0xf1, + + /* U+005E "^" */ + 0x0, 0xa, 0xf2, 0x0, 0x0, 0x1, 0xfe, 0x90, + 0x0, 0x0, 0x7d, 0x5e, 0x0, 0x0, 0xd, 0x70, + 0xf5, 0x0, 0x4, 0xf1, 0x9, 0xc0, 0x0, 0xab, + 0x0, 0x3f, 0x20, 0x1f, 0x50, 0x0, 0xd8, 0x7, + 0xe0, 0x0, 0x6, 0xe0, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x22, 0x22, 0x22, + 0x22, + + /* U+0060 "`" */ + 0x48, 0x40, 0x0, 0xaf, 0x40, 0x0, 0x7f, 0x40, + + /* U+0061 "a" */ + 0x1, 0x7c, 0xff, 0xd6, 0x0, 0x9, 0xfc, 0x99, + 0xef, 0x80, 0x1, 0x30, 0x0, 0xd, 0xf0, 0x0, + 0x0, 0x0, 0x9, 0xf2, 0x1, 0x9e, 0xff, 0xff, + 0xf3, 0xa, 0xf8, 0x43, 0x3a, 0xf3, 0xf, 0xb0, + 0x0, 0x8, 0xf3, 0xf, 0xb0, 0x0, 0xe, 0xf3, + 0x9, 0xf9, 0x46, 0xdf, 0xf3, 0x0, 0x8d, 0xfe, + 0x87, 0xf3, + + /* U+0062 "b" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x56, + 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfc, 0x9b, 0xff, + 0x30, 0x5f, 0xf5, 0x0, 0x4, 0xfe, 0x5, 0xfa, + 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, 0x0, 0x0, + 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, 0xf7, 0x5f, + 0xa0, 0x0, 0x0, 0x8f, 0x45, 0xff, 0x50, 0x0, + 0x4f, 0xe0, 0x5f, 0xcf, 0xc9, 0xbf, 0xf3, 0x5, + 0xf4, 0x6d, 0xfe, 0xa2, 0x0, + + /* U+0063 "c" */ + 0x0, 0x7, 0xdf, 0xeb, 0x30, 0x0, 0xcf, 0xd9, + 0xaf, 0xf4, 0x9, 0xf7, 0x0, 0x2, 0xc3, 0xf, + 0xd0, 0x0, 0x0, 0x0, 0x3f, 0x80, 0x0, 0x0, + 0x0, 0x3f, 0x80, 0x0, 0x0, 0x0, 0xf, 0xc0, + 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x2, 0xc3, + 0x0, 0xcf, 0xd9, 0xaf, 0xf3, 0x0, 0x7, 0xdf, + 0xeb, 0x30, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0x1, 0xfa, 0x0, 0x8, + 0xdf, 0xe8, 0x2f, 0xa0, 0x1d, 0xfd, 0x9b, 0xfd, + 0xfa, 0xa, 0xf8, 0x0, 0x2, 0xef, 0xa0, 0xfd, + 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, 0x0, 0x0, + 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, 0xfa, 0xf, + 0xc0, 0x0, 0x0, 0x5f, 0xa0, 0xaf, 0x60, 0x0, + 0x1e, 0xfa, 0x1, 0xdf, 0xb7, 0x9e, 0xdf, 0xa0, + 0x0, 0x8d, 0xfe, 0x91, 0xfa, + + /* U+0065 "e" */ + 0x0, 0x8, 0xdf, 0xe9, 0x10, 0x0, 0x1d, 0xfb, + 0x8a, 0xfe, 0x20, 0xa, 0xf3, 0x0, 0x3, 0xfb, + 0x0, 0xfa, 0x0, 0x0, 0x9, 0xf1, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0x33, 0xfa, 0x33, 0x33, 0x33, + 0x30, 0xf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x90, 0x0, 0x9, 0x10, 0x0, 0xdf, 0xda, 0xae, + 0xf6, 0x0, 0x0, 0x7d, 0xff, 0xc5, 0x0, + + /* U+0066 "f" */ + 0x0, 0x1a, 0xee, 0x90, 0xa, 0xf9, 0x88, 0x0, + 0xfb, 0x0, 0x0, 0x1f, 0x90, 0x0, 0xbf, 0xff, + 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, + 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x8, 0xdf, 0xe9, 0x1e, 0xc0, 0x1d, 0xfd, + 0x9b, 0xfe, 0xec, 0xa, 0xf8, 0x0, 0x1, 0xdf, + 0xc0, 0xfd, 0x0, 0x0, 0x4, 0xfc, 0x3f, 0x90, + 0x0, 0x0, 0xf, 0xc3, 0xf8, 0x0, 0x0, 0x0, + 0xfc, 0xf, 0xd0, 0x0, 0x0, 0x4f, 0xc0, 0xaf, + 0x80, 0x0, 0x1d, 0xfc, 0x1, 0xdf, 0xd9, 0xaf, + 0xdf, 0xc0, 0x0, 0x8d, 0xfe, 0x91, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x90, 0x27, 0x0, 0x0, + 0xb, 0xf4, 0x7, 0xff, 0xb9, 0xae, 0xfa, 0x0, + 0x4, 0xae, 0xff, 0xc6, 0x0, + + /* U+0068 "h" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x5f, 0x56, 0xdf, 0xea, + 0x10, 0x5f, 0xef, 0xca, 0xdf, 0xd0, 0x5f, 0xf4, + 0x0, 0xa, 0xf6, 0x5f, 0x90, 0x0, 0x2, 0xf9, + 0x5f, 0x60, 0x0, 0x0, 0xfa, 0x5f, 0x50, 0x0, + 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, + 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, + 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, + + /* U+0069 "i" */ + 0x6f, 0x69, 0xf9, 0x4, 0x0, 0x0, 0x5f, 0x55, + 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, + 0x55, 0xf5, 0x5f, 0x55, 0xf5, + + /* U+006A "j" */ + 0x0, 0x4, 0xf7, 0x0, 0x7, 0xfa, 0x0, 0x0, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf7, 0x0, + 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, + 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, + 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, + 0x4, 0xf7, 0x0, 0x4, 0xf7, 0x0, 0x6, 0xf5, + 0x4b, 0x9f, 0xe1, 0x5e, 0xfc, 0x30, + + /* U+006B "k" */ + 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, + 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x50, + 0x0, 0x1d, 0xf3, 0x5, 0xf5, 0x0, 0x2d, 0xf3, + 0x0, 0x5f, 0x50, 0x2e, 0xf4, 0x0, 0x5, 0xf5, + 0x2e, 0xf4, 0x0, 0x0, 0x5f, 0x9e, 0xfe, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xfa, 0x0, 0x0, 0x5f, + 0xe3, 0xc, 0xf6, 0x0, 0x5, 0xf6, 0x0, 0x1e, + 0xf3, 0x0, 0x5f, 0x50, 0x0, 0x4f, 0xd0, 0x5, + 0xf5, 0x0, 0x0, 0x7f, 0xa0, + + /* U+006C "l" */ + 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, + 0xf5, 0x5f, 0x55, 0xf5, 0x5f, 0x55, 0xf5, 0x5f, + 0x55, 0xf5, 0x5f, 0x55, 0xf5, + + /* U+006D "m" */ + 0x5f, 0x58, 0xdf, 0xe8, 0x0, 0x8d, 0xfe, 0x80, + 0x5, 0xfe, 0xfa, 0x9d, 0xfb, 0xdf, 0xa9, 0xdf, + 0xb0, 0x5f, 0xf2, 0x0, 0xd, 0xff, 0x30, 0x0, + 0xcf, 0x35, 0xf9, 0x0, 0x0, 0x7f, 0xa0, 0x0, + 0x6, 0xf6, 0x5f, 0x60, 0x0, 0x5, 0xf7, 0x0, + 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, 0x60, + 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, 0x5f, + 0x60, 0x0, 0x4, 0xf7, 0x5f, 0x50, 0x0, 0x5, + 0xf6, 0x0, 0x0, 0x4f, 0x75, 0xf5, 0x0, 0x0, + 0x5f, 0x60, 0x0, 0x4, 0xf7, + + /* U+006E "n" */ + 0x5f, 0x57, 0xdf, 0xea, 0x10, 0x5f, 0xef, 0xa8, + 0xcf, 0xd0, 0x5f, 0xf3, 0x0, 0x9, 0xf6, 0x5f, + 0x90, 0x0, 0x2, 0xf9, 0x5f, 0x60, 0x0, 0x0, + 0xfa, 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, + 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, 0x0, 0xfb, + 0x5f, 0x50, 0x0, 0x0, 0xfb, 0x5f, 0x50, 0x0, + 0x0, 0xfb, + + /* U+006F "o" */ + 0x0, 0x7, 0xdf, 0xea, 0x30, 0x0, 0xd, 0xfd, + 0x9a, 0xff, 0x50, 0x9, 0xf7, 0x0, 0x2, 0xef, + 0x10, 0xfd, 0x0, 0x0, 0x6, 0xf7, 0x3f, 0x80, + 0x0, 0x0, 0x2f, 0x93, 0xf8, 0x0, 0x0, 0x2, + 0xf9, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0x60, 0x9f, + 0x80, 0x0, 0x2e, 0xf1, 0x0, 0xcf, 0xd9, 0xaf, + 0xf4, 0x0, 0x0, 0x7d, 0xfe, 0xa3, 0x0, + + /* U+0070 "p" */ + 0x5f, 0x46, 0xdf, 0xea, 0x20, 0x5, 0xfd, 0xfa, + 0x8a, 0xff, 0x30, 0x5f, 0xf4, 0x0, 0x3, 0xfe, + 0x5, 0xfa, 0x0, 0x0, 0x8, 0xf4, 0x5f, 0x60, + 0x0, 0x0, 0x4f, 0x75, 0xf6, 0x0, 0x0, 0x4, + 0xf7, 0x5f, 0xa0, 0x0, 0x0, 0x9f, 0x45, 0xff, + 0x50, 0x0, 0x4f, 0xe0, 0x5f, 0xdf, 0xc9, 0xbf, + 0xf3, 0x5, 0xf5, 0x6d, 0xfe, 0xa2, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x5, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x5, + 0xf5, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x8, 0xdf, 0xe8, 0x1f, 0xa0, 0x1d, 0xfd, + 0x9b, 0xfc, 0xfa, 0xa, 0xf7, 0x0, 0x2, 0xef, + 0xa0, 0xfd, 0x0, 0x0, 0x6, 0xfa, 0x3f, 0x80, + 0x0, 0x0, 0x2f, 0xa3, 0xf8, 0x0, 0x0, 0x2, + 0xfa, 0xf, 0xd0, 0x0, 0x0, 0x6f, 0xa0, 0xaf, + 0x80, 0x0, 0x2e, 0xfa, 0x1, 0xdf, 0xd9, 0xaf, + 0xdf, 0xa0, 0x0, 0x8d, 0xfe, 0x82, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xfa, + + /* U+0072 "r" */ + 0x5f, 0x46, 0xdb, 0x5f, 0xcf, 0xd9, 0x5f, 0xf5, + 0x0, 0x5f, 0xa0, 0x0, 0x5f, 0x70, 0x0, 0x5f, + 0x50, 0x0, 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, + 0x5f, 0x50, 0x0, 0x5f, 0x50, 0x0, + + /* U+0073 "s" */ + 0x1, 0x8d, 0xfe, 0xc7, 0x0, 0xcf, 0xb8, 0xad, + 0xd0, 0x3f, 0x90, 0x0, 0x1, 0x2, 0xfb, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb8, 0x40, 0x0, 0x5, + 0x9c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, 0x60, + 0x50, 0x0, 0x5, 0xf7, 0x5f, 0xea, 0x9a, 0xfe, + 0x10, 0x6c, 0xef, 0xd9, 0x20, + + /* U+0074 "t" */ + 0x1, 0xfa, 0x0, 0x0, 0x1f, 0xa0, 0x0, 0xbf, + 0xff, 0xff, 0x55, 0x8f, 0xc7, 0x72, 0x1, 0xfa, + 0x0, 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x1, 0xfa, 0x0, 0x0, + 0xf, 0xc0, 0x0, 0x0, 0xbf, 0xa9, 0x90, 0x1, + 0xbe, 0xe9, + + /* U+0075 "u" */ + 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, + 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, 0xf8, 0x7f, + 0x40, 0x0, 0x3, 0xf8, 0x7f, 0x40, 0x0, 0x3, + 0xf8, 0x7f, 0x40, 0x0, 0x4, 0xf8, 0x6f, 0x60, + 0x0, 0x6, 0xf8, 0x2f, 0xc0, 0x0, 0x1e, 0xf8, + 0xa, 0xfd, 0x89, 0xee, 0xf8, 0x0, 0x8d, 0xfe, + 0x92, 0xf8, + + /* U+0076 "v" */ + 0xd, 0xe0, 0x0, 0x0, 0xd, 0xd0, 0x6, 0xf6, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, + 0xaf, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xf9, 0x0, + 0x0, 0x2f, 0x90, 0x7, 0xf3, 0x0, 0x0, 0xb, + 0xf0, 0xe, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0xed, 0xbe, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf1, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbe, 0x0, 0x0, 0xc, 0xf1, 0x0, 0x0, 0xae, + 0x5, 0xf4, 0x0, 0x2, 0xff, 0x60, 0x0, 0xf, + 0x80, 0xf, 0x90, 0x0, 0x8f, 0xeb, 0x0, 0x5, + 0xf2, 0x0, 0xae, 0x0, 0xd, 0xb8, 0xf1, 0x0, + 0xbd, 0x0, 0x4, 0xf4, 0x3, 0xf5, 0x2f, 0x70, + 0x1f, 0x70, 0x0, 0xe, 0xa0, 0x9e, 0x0, 0xcc, + 0x6, 0xf1, 0x0, 0x0, 0x9f, 0x1e, 0x90, 0x6, + 0xf2, 0xcc, 0x0, 0x0, 0x3, 0xfa, 0xf3, 0x0, + 0x1f, 0xaf, 0x60, 0x0, 0x0, 0xd, 0xfd, 0x0, + 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x5, 0xfb, 0x0, 0x0, + + /* U+0078 "x" */ + 0x3f, 0xb0, 0x0, 0xc, 0xf2, 0x7, 0xf7, 0x0, + 0x7f, 0x60, 0x0, 0xbf, 0x33, 0xfa, 0x0, 0x0, + 0x1e, 0xde, 0xd0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x3f, + 0xbc, 0xf2, 0x0, 0x0, 0xde, 0x12, 0xfc, 0x0, + 0xa, 0xf4, 0x0, 0x5f, 0x90, 0x6f, 0x80, 0x0, + 0xa, 0xf5, + + /* U+0079 "y" */ + 0xd, 0xe0, 0x0, 0x0, 0xc, 0xd0, 0x6, 0xf6, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0xfc, 0x0, 0x0, + 0x9f, 0x10, 0x0, 0x9f, 0x30, 0x1, 0xfa, 0x0, + 0x0, 0x2f, 0x90, 0x6, 0xf3, 0x0, 0x0, 0xc, + 0xf0, 0xd, 0xc0, 0x0, 0x0, 0x5, 0xf6, 0x3f, + 0x60, 0x0, 0x0, 0x0, 0xed, 0xae, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf, 0xb0, + 0x0, 0x0, 0x1, 0x0, 0x7f, 0x40, 0x0, 0x0, + 0x1f, 0xaa, 0xfb, 0x0, 0x0, 0x0, 0x19, 0xee, + 0xa1, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x2f, 0xff, 0xff, 0xff, 0x91, 0x77, 0x77, 0x7e, + 0xf4, 0x0, 0x0, 0x6, 0xf8, 0x0, 0x0, 0x3, + 0xfc, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, + 0x4f, 0xb0, 0x0, 0x0, 0x1e, 0xf8, 0x77, 0x77, + 0x54, 0xff, 0xff, 0xff, 0xfb, + + /* U+007B "{" */ + 0x0, 0x7e, 0xf0, 0x3f, 0xd7, 0x7, 0xf4, 0x0, + 0x8f, 0x30, 0x8, 0xf3, 0x0, 0x8f, 0x30, 0x8, + 0xf3, 0x0, 0x9f, 0x20, 0x8e, 0xe0, 0xf, 0xfa, + 0x0, 0xb, 0xf2, 0x0, 0x8f, 0x30, 0x8, 0xf3, + 0x0, 0x8f, 0x30, 0x8, 0xf3, 0x0, 0x7f, 0x40, + 0x4, 0xfd, 0x70, 0x8, 0xef, + + /* U+007C "|" */ + 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, + 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, + 0x71, 0xf7, 0x1f, 0x71, 0xf7, 0x1f, 0x71, 0xf7, + 0x1f, 0x71, 0xf7, + + /* U+007D "}" */ + 0xaf, 0xa1, 0x0, 0x4b, 0xf9, 0x0, 0x0, 0xed, + 0x0, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, + 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, + 0x0, 0xaf, 0x92, 0x0, 0x5f, 0xf4, 0x0, 0xcf, + 0x10, 0x0, 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, + 0xde, 0x0, 0x0, 0xde, 0x0, 0x0, 0xed, 0x0, + 0x4a, 0xf9, 0x0, 0xaf, 0xb1, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x1, 0x1, 0xdf, 0xc1, 0x0, + 0xc5, 0xac, 0x5c, 0xe3, 0x4f, 0x2d, 0x40, 0x9, + 0xff, 0x90, 0x30, 0x0, 0x2, 0x10, 0x0, + + /* U+00B0 "°" */ + 0x1, 0xaf, 0xd5, 0x0, 0xb8, 0x3, 0xe4, 0x1e, + 0x0, 0x6, 0xa2, 0xe0, 0x0, 0x6a, 0xc, 0x70, + 0x1d, 0x50, 0x2c, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, + + /* U+2022 "•" */ + 0x5, 0x30, 0x9f, 0xf3, 0xcf, 0xf6, 0x4e, 0xc1, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x6a, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x3f, + 0xf2, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x95, 0x0, + 0x1, 0xff, 0x20, 0x0, 0x5, 0xff, 0x73, 0x0, + 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0x5f, 0xe0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x20, 0x0, 0x5, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, + 0x0, 0x5f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x20, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, 0x69, + 0x8f, 0xf2, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x20, 0x3, 0x58, 0xfe, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf2, 0x2d, 0xff, 0xff, + 0xe0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0xb, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x4, 0xbd, 0xc8, 0x10, + 0xaf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x51, 0x6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, + 0x15, 0xf7, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0x8f, 0xfd, 0xcf, 0xf3, 0x33, 0x33, 0x33, + 0x6f, 0xec, 0xdf, 0xf2, 0xc, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0x70, 0x2f, 0xf2, 0xc, 0xe0, 0x0, + 0x0, 0x0, 0x3f, 0x80, 0x2f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf4, 0x2d, + 0xf9, 0x99, 0x99, 0x99, 0xbf, 0x92, 0x4f, 0xf2, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x2f, + 0xfb, 0xaf, 0xf1, 0x11, 0x11, 0x11, 0x5f, 0xda, + 0xbf, 0xf9, 0x8e, 0xe0, 0x0, 0x0, 0x0, 0x3f, + 0xc8, 0x9f, 0xf2, 0xc, 0xe0, 0x0, 0x0, 0x0, + 0x3f, 0x70, 0x2f, 0xf6, 0x4d, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xa4, 0x6f, 0xfe, 0xef, 0xfb, 0xbb, + 0xbb, 0xbb, 0xcf, 0xfe, 0xef, 0xc2, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x2c, + + /* U+F00B "" */ + 0x58, 0x88, 0x70, 0x28, 0x88, 0x88, 0x88, 0x88, + 0x85, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xd1, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xe1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x58, 0x88, 0x60, 0x27, 0x88, 0x88, + 0x88, 0x88, 0x85, 0x47, 0x77, 0x50, 0x17, 0x77, + 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, 0xf3, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x90, 0x9, 0xd2, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x9f, 0xfe, + 0x20, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, 0xdf, + 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, + 0x2e, 0xff, 0xfe, 0x28, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x2d, 0xb0, 0x0, 0x0, 0x6, 0xe6, 0xd, 0xff, + 0xc0, 0x0, 0x6, 0xff, 0xf3, 0xcf, 0xff, 0xc0, + 0x6, 0xff, 0xff, 0x31, 0xdf, 0xff, 0xc7, 0xff, + 0xff, 0x50, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x6, 0xff, 0xff, 0xdf, + 0xff, 0xc0, 0x6, 0xff, 0xff, 0x51, 0xdf, 0xff, + 0xc0, 0xff, 0xff, 0x50, 0x1, 0xdf, 0xff, 0x58, + 0xff, 0x50, 0x0, 0x1, 0xdf, 0xd0, 0x5, 0x30, + 0x0, 0x0, 0x1, 0x61, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0xcd, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xe3, 0x3, 0xff, + 0xa0, 0xb, 0xc1, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x3f, 0xfa, 0x4, 0xff, 0xd1, 0x0, 0x4, 0xff, + 0xf6, 0x3, 0xff, 0xa0, 0x1e, 0xff, 0xa0, 0x0, + 0xdf, 0xf7, 0x0, 0x3f, 0xfa, 0x0, 0x2e, 0xff, + 0x40, 0x3f, 0xfc, 0x0, 0x3, 0xff, 0xa0, 0x0, + 0x6f, 0xfa, 0x8, 0xff, 0x60, 0x0, 0x3f, 0xfa, + 0x0, 0x0, 0xef, 0xf0, 0xaf, 0xf2, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0xb, 0xff, 0x1b, 0xff, 0x10, + 0x0, 0x1f, 0xf8, 0x0, 0x0, 0xbf, 0xf1, 0x9f, + 0xf3, 0x0, 0x0, 0x24, 0x0, 0x0, 0xd, 0xff, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xd0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf8, 0x0, 0x9f, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0xcf, 0xfe, + 0x71, 0x0, 0x4, 0xcf, 0xff, 0x50, 0x0, 0x1, + 0xdf, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, 0xfd, 0xa5, + 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x4, 0x66, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x78, 0x17, 0xff, 0xff, + 0xff, 0x71, 0x87, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3f, 0xff, + 0xff, 0xfe, 0x88, 0xef, 0xff, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, 0xff, 0x80, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xfb, 0x0, 0x1, 0xcf, 0xff, 0x80, 0x0, 0x8, + 0xff, 0xfc, 0x10, 0x3e, 0xff, 0xff, 0xf6, 0x0, + 0x6f, 0xff, 0xff, 0xe3, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, + 0x8e, 0xff, 0xff, 0xff, 0xe8, 0xfd, 0x0, 0x0, + 0x11, 0x1, 0x9f, 0xff, 0xf9, 0x10, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xee, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0x92, 0x0, 0x6b, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xe4, 0xa, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xf6, 0xaf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x31, 0xcf, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x25, 0x70, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x1, 0xbf, 0xfa, + 0x8, 0xff, 0xb0, 0x7f, 0xff, 0x40, 0x0, 0x2, + 0xdf, 0xf8, 0xa, 0xff, 0xff, 0xd2, 0x5f, 0xff, + 0x50, 0x4, 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, + 0xe4, 0x2e, 0xff, 0x70, 0xdf, 0xe3, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x1c, 0xff, 0x13, 0xb1, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, + 0x60, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, + 0x88, 0xbf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x3f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x70, + 0x3, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf5, 0x0, 0x2f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x9, 0xaa, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xc0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x24, 0x44, 0x44, 0x7, + 0xff, 0x70, 0x44, 0x44, 0x42, 0xff, 0xff, 0xff, + 0xc1, 0x66, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x66, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xc4, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x1, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x50, 0x0, 0xbf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x10, 0x6f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xfa, 0xe, 0xff, 0xcc, 0xcc, 0x20, 0x0, 0x0, + 0xbc, 0xcc, 0xef, 0xf2, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0x88, 0x8e, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x15, 0x66, 0x40, 0x0, 0x5, + 0xcb, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0x92, + 0x7, 0xff, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x66, 0xff, 0x0, 0x8f, 0xff, 0xa4, 0x12, + 0x5b, 0xff, 0xfd, 0xff, 0x4, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xd, 0xff, 0x30, + 0x0, 0x0, 0x45, 0x46, 0xff, 0xff, 0x4f, 0xf7, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x8f, + 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x67, 0x77, 0x77, 0x75, 0x0, 0x0, + 0x0, 0x6, 0x73, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x3f, 0xf6, 0xff, 0xff, 0xee, 0xfd, + 0x0, 0x0, 0x0, 0xcf, 0xf1, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x2, 0xbf, 0xfe, 0x10, 0xff, + 0x8d, 0xff, 0xfc, 0xa9, 0xcf, 0xff, 0xe2, 0x0, + 0xff, 0x61, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0xff, 0x70, 0x1, 0x7c, 0xee, 0xd9, 0x30, + 0x0, 0x0, 0x56, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x2, + 0xef, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, 0x3, + 0xef, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xdf, + 0xff, 0xf0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xbe, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xf0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf0, 0x7, 0x10, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x70, 0x8b, 0xbb, + 0xdf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x40, 0x0, 0x0, 0x2d, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0x0, 0x0, 0x40, 0x1c, + 0xf4, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0x5f, 0xb0, 0x1e, 0xe1, 0x0, 0x0, 0x3, 0xef, + 0xff, 0x0, 0x0, 0xaf, 0xa0, 0x6f, 0x70, 0xdf, + 0xff, 0xff, 0xff, 0xf0, 0x7, 0x10, 0xbf, 0x30, + 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xfd, + 0x3, 0xf9, 0xa, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x7, 0xf5, 0xe, 0xc0, 0x8f, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4f, 0x70, 0xdd, 0x7, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1d, 0xf3, + 0xf, 0xb0, 0x9f, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x3, 0xf7, 0x7, 0xf6, 0xc, 0xf0, 0x7b, 0xbb, + 0xdf, 0xff, 0xf0, 0x0, 0x3, 0xfe, 0x12, 0xfa, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x3, 0xff, + 0x40, 0xaf, 0x30, 0x0, 0x0, 0x0, 0xbf, 0xf0, + 0x0, 0x3c, 0x30, 0x6f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xbe, 0x0, 0x0, 0x0, 0x6f, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x90, 0x0, 0x0, + + /* U+F03E "" */ + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xd5, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x50, 0x7, + 0xff, 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, 0xfb, + 0xbf, 0xff, 0xff, 0x50, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xcb, 0xff, 0xf5, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xfc, 0x0, 0xaf, 0x50, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xc0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x74, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F043 "" */ + 0x0, 0x0, 0x6, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0x2c, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xf0, 0x7f, 0xf2, 0x5c, 0xff, 0xff, + 0xfb, 0x0, 0xef, 0xe5, 0x8, 0xff, 0xff, 0x30, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x50, 0x0, 0x1, + 0xaf, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, + 0x31, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x6b, 0x90, 0x0, 0x0, 0x3, 0xa2, 0x9f, 0xe0, + 0x0, 0x0, 0x4f, 0xf9, 0x9f, 0xe0, 0x0, 0x5, + 0xff, 0xfa, 0x9f, 0xe0, 0x0, 0x6f, 0xff, 0xfa, + 0x9f, 0xe0, 0x7, 0xff, 0xff, 0xfa, 0x9f, 0xe0, + 0x8f, 0xff, 0xff, 0xfa, 0x9f, 0xe9, 0xff, 0xff, + 0xff, 0xfa, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xfe, + 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xe1, 0xdf, 0xff, + 0xff, 0xfa, 0x9f, 0xe0, 0x1c, 0xff, 0xff, 0xfa, + 0x9f, 0xe0, 0x0, 0xbf, 0xff, 0xfa, 0x9f, 0xe0, + 0x0, 0xa, 0xff, 0xfa, 0x9f, 0xe0, 0x0, 0x0, + 0x9f, 0xfa, 0x9f, 0xe0, 0x0, 0x0, 0x8, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x3a, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x3a, 0xbb, 0xb9, 0x10, 0x3, 0xab, 0xbb, 0x91, + 0xef, 0xff, 0xff, 0xa0, 0xe, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xfe, 0x40, 0x7, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04D "" */ + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x91, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F051 "" */ + 0x4a, 0x20, 0x0, 0x0, 0xa, 0xb4, 0xbf, 0xe3, + 0x0, 0x0, 0xf, 0xf8, 0xcf, 0xff, 0x40, 0x0, + 0xf, 0xf8, 0xcf, 0xff, 0xf5, 0x0, 0xf, 0xf8, + 0xcf, 0xff, 0xff, 0x60, 0xf, 0xf8, 0xcf, 0xff, + 0xff, 0xf7, 0xf, 0xf8, 0xcf, 0xff, 0xff, 0xff, + 0x9f, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xff, 0xff, 0xdf, 0xf8, 0xcf, 0xff, 0xff, 0xfc, + 0x1f, 0xf8, 0xcf, 0xff, 0xff, 0xb0, 0xf, 0xf8, + 0xcf, 0xff, 0xfa, 0x0, 0xf, 0xf8, 0xcf, 0xff, + 0x80, 0x0, 0xf, 0xf8, 0xbf, 0xf7, 0x0, 0x0, + 0xf, 0xf8, 0x7f, 0x60, 0x0, 0x0, 0xf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x2, 0xca, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, 0x3, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x10, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x20, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0x50, + 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, + 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3c, 0x60, + + /* U+F054 "" */ + 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc1, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x20, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x3d, 0x50, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x39, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x36, 0x77, 0x77, 0xef, 0xfc, 0x77, 0x77, 0x61, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x36, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x3, 0x68, 0x87, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xfd, 0x63, 0x25, 0xbf, 0xff, 0x70, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xa0, 0x0, 0x6, 0xff, 0xfd, 0x0, 0x8, 0xfc, + 0x20, 0x9f, 0xff, 0xa0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x8f, 0xfe, 0x12, 0xff, 0xff, 0x60, 0xcf, + 0xff, 0xf2, 0x16, 0x7f, 0xff, 0xf5, 0xe, 0xff, + 0xfe, 0x1e, 0xff, 0xff, 0x12, 0xff, 0xff, 0xff, + 0x70, 0xdf, 0xff, 0xf2, 0x6f, 0xff, 0xf3, 0xe, + 0xff, 0xff, 0xf3, 0xf, 0xff, 0xfb, 0x0, 0xbf, + 0xff, 0x90, 0x4f, 0xff, 0xf8, 0x5, 0xff, 0xfe, + 0x10, 0x1, 0xdf, 0xff, 0x40, 0x28, 0x84, 0x1, + 0xef, 0xff, 0x30, 0x0, 0x1, 0xbf, 0xff, 0x60, + 0x0, 0x4, 0xef, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xfb, 0xbe, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x71, + 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x4a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x60, 0x0, 0x15, 0x78, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xa6, 0xdf, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xe8, 0x32, 0x5b, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x10, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xf8, 0x7f, 0xd3, 0x9, 0xff, 0xfb, 0x0, + 0x0, 0x1e, 0x70, 0x1, 0xbf, 0xfe, 0xff, 0xf2, + 0x1f, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xa0, 0x0, + 0x8f, 0xff, 0xff, 0x70, 0xdf, 0xff, 0xf1, 0x0, + 0xcf, 0xff, 0xd1, 0x0, 0x5f, 0xff, 0xf9, 0xc, + 0xff, 0xff, 0x30, 0x5, 0xff, 0xff, 0x60, 0x0, + 0x2d, 0xff, 0xb0, 0xef, 0xff, 0xb0, 0x0, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0xa, 0xff, 0xef, 0xff, + 0xe1, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf8, 0x10, 0x0, 0x3, 0xef, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xcb, 0x80, + 0x1, 0xbf, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xdf, 0xfe, 0x70, 0x0, 0x8f, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x33, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf9, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, 0x6f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, + 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfd, 0x0, 0x9f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xcb, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, + 0xfc, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, + 0xff, 0xfe, 0x42, 0xcf, 0xff, 0xff, 0xff, 0xe0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x23, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf9, 0x0, 0x12, 0x22, 0x10, 0x0, 0x0, 0x1, + 0x29, 0xff, 0x90, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0x20, + 0x5, 0xff, 0xff, 0xff, 0xfd, 0x9a, 0xad, 0xff, + 0xd0, 0x5f, 0xff, 0xbd, 0xff, 0xe2, 0x0, 0x0, + 0xcf, 0x44, 0xff, 0xf9, 0x8, 0xfe, 0x20, 0x0, + 0x0, 0x4, 0x4f, 0xff, 0x90, 0x4, 0xd2, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa1, 0x91, 0x6, + 0xf6, 0x0, 0x0, 0x2, 0xef, 0xfb, 0xc, 0xfc, + 0x8, 0xff, 0x60, 0xef, 0xff, 0xff, 0xb0, 0x1d, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xfc, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0xdd, 0xdd, 0xb0, + 0x0, 0x0, 0x2d, 0xde, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfa, 0xcf, 0xfe, 0x30, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xc, 0xff, 0xe3, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xfe, 0x30, + 0x5f, 0xff, 0x90, 0x0, 0x0, 0xc, 0xff, 0xe2, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, + 0x1b, 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0x90, + + /* U+F078 "" */ + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x6f, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, + 0xaf, 0xfe, 0x20, 0x0, 0x0, 0x5, 0xff, 0xf6, + 0x1c, 0xff, 0xe3, 0x0, 0x0, 0x5f, 0xff, 0x90, + 0x1, 0xcf, 0xfe, 0x30, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x1c, 0xff, 0xe3, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x90, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xa0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfa, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xa0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xe, 0xfd, 0xef, 0xcf, 0xf8, 0x0, 0x0, 0x0, + 0x5, 0xfe, 0x0, 0x0, 0xb, 0xe2, 0xdf, 0x67, + 0xf5, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x4, + 0x15, 0xfe, 0x3, 0x20, 0x0, 0x0, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0x6f, 0xd6, 0xfe, 0x4f, 0xf1, + 0x0, 0x0, 0xdf, 0x94, 0x44, 0x44, 0x41, 0x3f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x24, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, + + /* U+F07B "" */ + 0x17, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x44, + 0x44, 0x44, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x11, 0x2f, 0xff, 0xf7, 0x11, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x24, 0x44, 0x42, 0x1f, + 0xff, 0xf6, 0x24, 0x44, 0x42, 0xff, 0xff, 0xfc, + 0x8, 0xbb, 0xa2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x55, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xc4, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb8, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x0, 0x0, 0x4, 0xa5, 0x0, 0x0, 0xaf, 0xff, + 0xd0, 0x0, 0x0, 0x7d, 0xff, 0xf4, 0x2, 0xcf, + 0xff, 0xe2, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xe9, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x35, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xfa, 0x0, 0x0, 0x1, 0x9c, 0xa1, + 0xaf, 0xfe, 0xff, 0x60, 0x0, 0x2e, 0xff, 0xf9, + 0xef, 0x60, 0xaf, 0xb0, 0x3, 0xef, 0xff, 0xb0, + 0xef, 0x92, 0xcf, 0x90, 0x3e, 0xff, 0xfa, 0x0, + 0x7f, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xa0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x36, 0xef, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xaf, 0xfe, 0xff, 0xc2, 0xdf, 0xff, 0xd1, 0x0, + 0xef, 0x60, 0xaf, 0xa0, 0x1c, 0xff, 0xfd, 0x20, + 0xef, 0x92, 0xcf, 0xa0, 0x0, 0xcf, 0xff, 0xe2, + 0x7f, 0xff, 0xff, 0x40, 0x0, 0xb, 0xff, 0xf9, + 0x8, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x58, 0x50, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf1, 0x68, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x7f, 0x80, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x7f, 0xf8, + 0x36, 0x62, 0xaf, 0xff, 0xff, 0xf1, 0x36, 0x66, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xf6, 0x22, 0x22, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x5, 0x66, 0x66, 0x66, 0x66, 0x64, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xff, 0xed, 0xdd, 0xdd, 0xdd, 0xef, 0xf9, 0x0, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0x90, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf9, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xc5, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfe, 0x0, 0x5, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0x93, 0x4d, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + + /* U+F0C9 "" */ + 0x79, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa1, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x3d, 0xfe, 0x42, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x26, 0xff, 0xff, + 0xf9, 0x19, 0xff, 0xff, 0xff, 0x91, 0xbf, 0xff, + 0xff, 0xff, 0xd3, 0x5f, 0xff, 0xe5, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x71, 0x99, 0x17, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x77, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F0E7 "" */ + 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xa5, 0x55, 0x40, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x1, 0x22, 0x23, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x8d, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0xbc, 0xfa, 0xfd, 0xbb, 0x90, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xf1, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x95, 0xff, 0xff, 0xf1, 0x79, 0x0, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xf1, 0x7f, 0xb0, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xf1, 0x7f, 0xfa, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xf2, 0x2, 0x21, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xdd, 0xdc, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x7a, 0xaa, 0x58, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xf4, 0x4, 0xd0, 0x2f, 0x0, 0xf3, 0x3, 0xf0, + 0xf, 0xf4, 0xff, 0x40, 0x5d, 0x2, 0xf0, 0xf, + 0x40, 0x4f, 0x0, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0x22, 0xb7, 0x29, 0xa2, 0x4f, 0x42, 0xcf, + 0xff, 0x4f, 0xff, 0xf0, 0xa, 0x60, 0x79, 0x2, + 0xf2, 0xb, 0xff, 0xf4, 0xff, 0xff, 0xdd, 0xfe, + 0xdf, 0xfd, 0xef, 0xed, 0xff, 0xff, 0x4f, 0xf8, + 0x48, 0xe4, 0x44, 0x44, 0x44, 0x47, 0xf4, 0x5f, + 0xf4, 0xff, 0x40, 0x4d, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0xff, 0x4f, 0xf7, 0x48, 0xe4, 0x44, + 0x44, 0x44, 0x47, 0xf4, 0x4f, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8b, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x17, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x56, + 0x66, 0x66, 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x58, 0x88, 0x88, 0x87, 0x6, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfe, 0xf, 0x90, 0x0, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xf9, 0x0, 0xff, 0xff, 0xff, + 0xfe, 0xf, 0xff, 0x90, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x32, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x14, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, + 0x89, 0xa9, 0x74, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xef, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x6, 0xff, + 0xff, 0xfc, 0x75, 0x43, 0x46, 0x9e, 0xff, 0xff, + 0xb1, 0x8, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xe2, 0xcf, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0x40, 0xb6, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xc7, + 0x20, 0x0, 0x1b, 0x50, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x40, + 0x0, 0x2, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x1, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0x5f, 0xf4, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3f, 0xf5, 0xff, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, + 0x5f, 0xf4, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xf5, 0xff, 0x45, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F241 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x46, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x30, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F242 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x4c, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x4c, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x46, 0x88, 0x88, + 0x88, 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F243 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x49, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0x9f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x49, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x44, 0x88, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F244 "" */ + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf5, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x5f, + 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x45, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x80, + 0x2e, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x6, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xe3, 0x0, 0xd7, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xa1, 0x0, 0xcf, 0xff, 0xd4, + 0x9f, 0x55, 0x55, 0x55, 0x55, 0x55, 0x7f, 0xf7, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xa0, 0x0, + 0xb, 0xb0, 0x0, 0x0, 0x0, 0x3f, 0xb2, 0x0, + 0x9c, 0x90, 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, + 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbb, 0x2, 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xf9, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x1, 0x7b, 0xdd, 0xb8, 0x20, 0x0, 0x0, + 0x5f, 0xff, 0xdf, 0xff, 0xf6, 0x0, 0x4, 0xff, + 0xff, 0x68, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, + 0x60, 0x9f, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0x60, + 0x9, 0xff, 0xf3, 0x8f, 0xf6, 0xbf, 0x61, 0xc0, + 0x9f, 0xf7, 0xbf, 0xf6, 0xb, 0x60, 0xe2, 0x5f, + 0xf9, 0xdf, 0xff, 0x50, 0x20, 0x33, 0xff, 0xfb, + 0xef, 0xff, 0xf5, 0x0, 0x2e, 0xff, 0xfc, 0xef, + 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xfc, 0xdf, 0xff, + 0xd1, 0x0, 0x9, 0xff, 0xfc, 0xcf, 0xfc, 0x14, + 0x50, 0x90, 0xaf, 0xfb, 0xaf, 0xf2, 0x4f, 0x60, + 0xf3, 0x2f, 0xf9, 0x6f, 0xfd, 0xff, 0x70, 0x52, + 0xef, 0xf6, 0x1f, 0xff, 0xff, 0x70, 0x2e, 0xff, + 0xf1, 0x9, 0xff, 0xff, 0x72, 0xef, 0xff, 0x90, + 0x0, 0xbf, 0xff, 0xae, 0xff, 0xfd, 0x10, 0x0, + 0x5, 0xcf, 0xff, 0xfd, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x5, 0x88, 0x88, 0x30, 0x0, 0x0, + 0x56, 0x66, 0x7f, 0xff, 0xff, 0xe6, 0x66, 0x63, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0x1f, 0xf6, 0xaf, 0xc4, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0xf, 0xf5, 0x9f, 0xb3, 0xff, 0xa0, + 0xe, 0xff, 0x1f, 0xf6, 0xaf, 0xc4, 0xff, 0xa0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x34, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x44, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x44, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x44, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x41, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x57, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x72, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0xbf, 0xff, 0xff, 0xf8, + 0xaf, 0xff, 0xa8, 0xff, 0xff, 0xf8, 0x0, 0xbf, + 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xa0, 0xa, 0xff, + 0xff, 0x80, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x60, 0x3, 0xff, 0xff, 0xf8, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xe3, 0x0, + 0xbf, 0xff, 0xf8, 0x0, 0x4f, 0xff, 0xff, 0xfe, + 0x23, 0xff, 0xf3, 0x2e, 0xff, 0xff, 0x80, 0x0, + 0x4f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F7C2 "" */ + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xcf, + 0x47, 0xf4, 0xd8, 0x4f, 0xf5, 0xc, 0xff, 0x3, + 0xe0, 0xc5, 0xe, 0xf5, 0xcf, 0xff, 0x3, 0xe0, + 0xc5, 0xe, 0xf5, 0xff, 0xff, 0x24, 0xe2, 0xc6, + 0x2e, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, 0x34, + 0x44, 0x44, 0x44, 0x42, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, 0x3e, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x3e, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0x2e, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 77, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 77, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20, .adv_w = 113, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 35, .adv_w = 202, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 120, .adv_w = 179, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 219, .adv_w = 243, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 317, .adv_w = 198, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 408, .adv_w = 60, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 414, .adv_w = 97, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 459, .adv_w = 97, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 504, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 529, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 570, .adv_w = 65, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 582, .adv_w = 110, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 587, .adv_w = 65, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 593, .adv_w = 101, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 665, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 743, .adv_w = 107, .box_w = 5, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 776, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 841, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 906, .adv_w = 193, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 984, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1049, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1121, .adv_w = 172, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1193, .adv_w = 185, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1265, .adv_w = 178, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1337, .adv_w = 65, .box_w = 4, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1357, .adv_w = 65, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1383, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1424, .adv_w = 168, .box_w = 9, .box_h = 7, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1456, .adv_w = 168, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1497, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1562, .adv_w = 298, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 1715, .adv_w = 211, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1813, .adv_w = 218, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1891, .adv_w = 208, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1976, .adv_w = 238, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2061, .adv_w = 193, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2133, .adv_w = 183, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2198, .adv_w = 222, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2283, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2361, .adv_w = 89, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2381, .adv_w = 148, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2440, .adv_w = 207, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2518, .adv_w = 171, .box_w = 10, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2583, .adv_w = 275, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2681, .adv_w = 234, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2759, .adv_w = 242, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2857, .adv_w = 208, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2935, .adv_w = 242, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3055, .adv_w = 209, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3133, .adv_w = 179, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3205, .adv_w = 169, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3277, .adv_w = 228, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3355, .adv_w = 205, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3446, .adv_w = 324, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3576, .adv_w = 194, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3654, .adv_w = 186, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3739, .adv_w = 189, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3817, .adv_w = 96, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3862, .adv_w = 101, .box_w = 8, .box_h = 18, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3934, .adv_w = 96, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3979, .adv_w = 168, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4015, .adv_w = 144, .box_w = 9, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4024, .adv_w = 173, .box_w = 5, .box_h = 3, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 4032, .adv_w = 172, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4082, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4159, .adv_w = 164, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4209, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4286, .adv_w = 176, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4341, .adv_w = 102, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4390, .adv_w = 199, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 4467, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4537, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4558, .adv_w = 82, .box_w = 6, .box_h = 18, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 4612, .adv_w = 177, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4689, .adv_w = 80, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4710, .adv_w = 304, .box_w = 17, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4795, .adv_w = 196, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4845, .adv_w = 183, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4900, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 4977, .adv_w = 196, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5054, .adv_w = 118, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5084, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5129, .adv_w = 119, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5171, .adv_w = 195, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5221, .adv_w = 161, .box_w = 12, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5281, .adv_w = 259, .box_w = 17, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5366, .adv_w = 159, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5416, .adv_w = 161, .box_w = 12, .box_h = 14, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 5500, .adv_w = 150, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5545, .adv_w = 101, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5590, .adv_w = 86, .box_w = 3, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5617, .adv_w = 101, .box_w = 6, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5671, .adv_w = 168, .box_w = 9, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 5694, .adv_w = 121, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 5719, .adv_w = 90, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 5727, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 5908, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6034, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6187, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6313, .adv_w = 198, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6398, .adv_w = 288, .box_w = 19, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6569, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6740, .adv_w = 324, .box_w = 21, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6919, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7090, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7237, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7408, .adv_w = 144, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7476, .adv_w = 216, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7581, .adv_w = 324, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7770, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7896, .adv_w = 198, .box_w = 13, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8020, .adv_w = 252, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 8122, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8274, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8410, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8546, .adv_w = 252, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 8648, .adv_w = 252, .box_w = 18, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8801, .adv_w = 180, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8889, .adv_w = 180, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8977, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9113, .adv_w = 252, .box_w = 16, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 9145, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9292, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9511, .adv_w = 324, .box_w = 22, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9720, .adv_w = 288, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9873, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 9953, .adv_w = 252, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 10033, .adv_w = 360, .box_w = 24, .box_h = 15, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 10213, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10339, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10510, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10691, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10827, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10979, .adv_w = 252, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11115, .adv_w = 252, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11235, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11361, .adv_w = 180, .box_w = 13, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11485, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11637, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11789, .adv_w = 324, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11936, .adv_w = 288, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12136, .adv_w = 216, .box_w = 14, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12269, .adv_w = 360, .box_w = 23, .box_h = 18, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12476, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12614, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12752, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 12890, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13028, .adv_w = 360, .box_w = 23, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13166, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13339, .adv_w = 252, .box_w = 14, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 13472, .adv_w = 252, .box_w = 16, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13624, .adv_w = 288, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13805, .adv_w = 360, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13966, .adv_w = 216, .box_w = 14, .box_h = 19, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14099, .adv_w = 290, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 13, 0, 8, -6, 0, 0, + 0, 0, -16, -17, 2, 14, 6, 5, + -12, 2, 14, 1, 12, 3, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, -9, 0, 0, 0, 0, + 0, -6, 5, 6, 0, 0, -3, 0, + -2, 3, 0, -3, 0, -3, -1, -6, + 0, 0, 0, 0, -3, 0, 0, -4, + -4, 0, 0, -3, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + -3, 0, -4, 0, -8, 0, -35, 0, + 0, -6, 0, 6, 9, 0, 0, -6, + 3, 3, 10, 6, -5, 6, 0, 0, + -16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, -3, -14, 0, -12, + -2, 0, 0, 0, 0, 1, 11, 0, + -9, -2, -1, 1, 0, -5, 0, 0, + -2, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -23, -2, 11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 3, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 6, 3, 9, -3, 0, 0, 6, -3, + -10, -39, 2, 8, 6, 1, -4, 0, + 10, 0, 9, 0, 9, 0, -27, 0, + -3, 9, 0, 10, -3, 6, 3, 0, + 0, 1, -3, 0, 0, -5, 23, 0, + 23, 0, 9, 0, 12, 4, 5, 9, + 0, 0, 0, -11, 0, 0, 0, 0, + 1, -2, 0, 2, -5, -4, -6, 2, + 0, -3, 0, 0, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -16, 0, -18, 0, 0, 0, + 0, -2, 0, 29, -3, -4, 3, 3, + -3, 0, -4, 3, 0, 0, -15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -28, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -18, 0, 17, 0, 0, -11, 0, + 10, 0, -20, -28, -20, -6, 9, 0, + 0, -19, 0, 3, -7, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, -35, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -3, -6, 0, -1, + -1, -3, 0, 0, -2, 0, 0, 0, + -6, 0, -2, 0, -7, -6, 0, -7, + -10, -10, -5, 0, -6, 0, -6, 0, + 0, 0, 0, -2, 0, 0, 3, 0, + 2, -3, 0, 1, 0, 0, 0, 3, + -2, 0, 0, 0, -2, 3, 3, -1, + 0, 0, 0, -5, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 4, -2, 0, + -3, 0, -5, 0, 0, -2, 0, 9, + 0, 0, -3, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -3, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -3, -3, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -4, 0, -4, 0, -9, + -2, -9, 6, 0, 0, -6, 3, 6, + 8, 0, -7, -1, -3, 0, -1, -14, + 3, -2, 2, -15, 3, 0, 0, 1, + -15, 0, -15, -2, -25, -2, 0, -14, + 0, 6, 8, 0, 4, 0, 0, 0, + 0, 1, 0, -5, -4, 0, -9, 0, + 0, 0, -3, 0, 0, 0, -3, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -4, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, -2, -3, -2, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -2, 0, -3, + 0, -2, 0, -6, 3, 0, 0, -3, + 1, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -3, -4, 0, + -5, 0, 9, -2, 1, -9, 0, 0, + 8, -14, -15, -12, -6, 3, 0, -2, + -19, -5, 0, -5, 0, -6, 4, -5, + -18, 0, -8, 0, 0, 1, -1, 2, + -2, 0, 3, 0, -9, -11, 0, -14, + -7, -6, -7, -9, -3, -8, -1, -5, + -8, 2, 0, 1, 0, -3, 0, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -1, 0, -1, -3, 0, -5, -6, + -6, -1, 0, -9, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -5, 0, 0, 0, 0, -14, -9, 0, + 0, 0, -4, -14, 0, 0, -3, 3, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -5, 0, + 0, 0, 0, 3, 0, 2, -6, -6, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, -9, 0, -3, 0, -4, -3, + 0, -6, -7, -9, -2, 0, -6, 0, + -9, 0, 0, 0, 0, 23, 0, 0, + 1, 0, 0, -4, 0, 3, 0, -12, + 0, 0, 0, 0, 0, -27, -5, 10, + 9, -2, -12, 0, 3, -4, 0, -14, + -1, -4, 3, -20, -3, 4, 0, 4, + -10, -4, -11, -10, -12, 0, 0, -17, + 0, 16, 0, 0, -1, 0, 0, 0, + -1, -1, -3, -8, -10, -1, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -1, -3, -4, 0, 0, + -6, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -6, 0, 0, 6, + -1, 4, 0, -6, 3, -2, -1, -7, + -3, 0, -4, -3, -2, 0, -4, -5, + 0, 0, -2, -1, -2, -5, -3, 0, + 0, -3, 0, 3, -2, 0, -6, 0, + 0, 0, -6, 0, -5, 0, -5, -5, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 3, 0, -4, 0, -2, -3, + -9, -2, -2, -2, -1, -2, -3, -1, + 0, 0, 0, 0, 0, -3, -2, -2, + 0, 0, 0, 0, 3, -2, 0, -2, + 0, 0, 0, -2, -3, -2, -3, -3, + -3, 0, 2, 12, -1, 0, -8, 0, + -2, 6, 0, -3, -12, -4, 4, 0, + 0, -14, -5, 3, -5, 2, 0, -2, + -2, -9, 0, -4, 1, 0, 0, -5, + 0, 0, 0, 3, 3, -6, -5, 0, + -5, -3, -4, -3, -3, 0, -5, 1, + -5, -5, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -4, + 0, 0, -3, -3, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -4, 0, -6, 0, 0, 0, -10, 0, + 2, -6, 6, 1, -2, -14, 0, 0, + -6, -3, 0, -12, -7, -8, 0, 0, + -12, -3, -12, -11, -14, 0, -7, 0, + 2, 19, -4, 0, -7, -3, -1, -3, + -5, -8, -5, -11, -12, -7, -3, 0, + 0, -2, 0, 1, 0, 0, -20, -3, + 9, 6, -6, -11, 0, 1, -9, 0, + -14, -2, -3, 6, -26, -4, 1, 0, + 0, -19, -3, -15, -3, -21, 0, 0, + -20, 0, 17, 1, 0, -2, 0, 0, + 0, 0, -1, -2, -11, -2, 0, -19, + 0, 0, 0, 0, -9, 0, -3, 0, + -1, -8, -14, 0, 0, -1, -4, -9, + -3, 0, -2, 0, 0, 0, 0, -13, + -3, -10, -9, -2, -5, -7, -3, -5, + 0, -6, -3, -10, -4, 0, -3, -5, + -3, -5, 0, 1, 0, -2, -10, 0, + 6, 0, -5, 0, 0, 0, 0, 3, + 0, 2, -6, 12, 0, -3, -3, -3, + 0, 0, 0, 0, 0, 0, -9, 0, + -3, 0, -4, -3, 0, -6, -7, -9, + -2, 0, -6, 2, 12, 0, 0, 0, + 0, 23, 0, 0, 1, 0, 0, -4, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -6, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -3, -3, 0, 0, -6, + -3, 0, 0, -6, 0, 5, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 4, 6, 2, -3, 0, -9, + -5, 0, 9, -10, -9, -6, -6, 12, + 5, 3, -25, -2, 6, -3, 0, -3, + 3, -3, -10, 0, -3, 3, -4, -2, + -9, -2, 0, 0, 9, 6, 0, -8, + 0, -16, -4, 8, -4, -11, 1, -4, + -10, -10, -3, 12, 3, 0, -4, 0, + -8, 0, 2, 10, -7, -11, -12, -7, + 9, 0, 1, -21, -2, 3, -5, -2, + -7, 0, -6, -11, -4, -4, -2, 0, + 0, -7, -6, -3, 0, 9, 7, -3, + -16, 0, -16, -4, 0, -10, -17, -1, + -9, -5, -10, -8, 8, 0, 0, -4, + 0, -6, -3, 0, -3, -5, 0, 5, + -10, 3, 0, 0, -15, 0, -3, -6, + -5, -2, -9, -7, -10, -7, 0, -9, + -3, -7, -5, -9, -3, 0, 0, 1, + 14, -5, 0, -9, -3, 0, -3, -6, + -7, -8, -8, -11, -4, -6, 6, 0, + -4, 0, -14, -3, 2, 6, -9, -11, + -6, -10, 10, -3, 1, -27, -5, 6, + -6, -5, -11, 0, -9, -12, -3, -3, + -2, -3, -6, -9, -1, 0, 0, 9, + 8, -2, -19, 0, -17, -7, 7, -11, + -20, -6, -10, -12, -14, -10, 6, 0, + 0, 0, 0, -3, 0, 0, 3, -3, + 6, 2, -5, 6, 0, 0, -9, -1, + 0, -1, 0, 1, 1, -2, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 2, 9, 1, 0, -3, 0, 0, + 0, 0, -2, -2, -3, 0, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 11, 0, 5, 1, 1, -4, + 0, 6, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -17, 0, -3, 5, 0, 9, + 0, 0, 29, 3, -6, -6, 3, 3, + -2, 1, -14, 0, 0, 14, -17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -20, 11, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -5, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -8, 0, + 0, 1, 0, 0, 3, 37, -6, -2, + 9, 8, -8, 3, 0, 0, 3, 3, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -37, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, 0, 0, -8, 0, 0, 0, 0, + -6, -1, 0, 0, 0, -6, 0, -3, + 0, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -19, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -3, 0, 0, -5, 0, -4, 0, + -8, 0, 0, 0, -5, 3, -3, 0, + 0, -8, -3, -7, 0, 0, -8, 0, + -3, 0, -14, 0, -3, 0, 0, -23, + -5, -12, -3, -10, 0, 0, -19, 0, + -8, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -5, -2, -5, 0, 0, + 0, 0, -6, 0, -6, 4, -3, 6, + 0, -2, -7, -2, -5, -5, 0, -3, + -1, -2, 2, -8, -1, 0, 0, 0, + -25, -2, -4, 0, -6, 0, -2, -14, + -3, 0, 0, -2, -2, 0, 0, 0, + 0, 2, 0, -2, -5, -2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, + 0, -6, 0, -2, 0, 0, 0, -6, + 3, 0, 0, 0, -8, -3, -6, 0, + 0, -8, 0, -3, 0, -14, 0, 0, + 0, 0, -28, 0, -6, -11, -14, 0, + 0, -19, 0, -2, -4, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -4, -1, + -4, 1, 0, 0, 5, -4, 0, 9, + 14, -3, -3, -9, 3, 14, 5, 6, + -8, 3, 12, 3, 8, 6, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 14, -5, -3, 0, -2, + 23, 12, 23, 0, 0, 0, 3, 0, + 0, 11, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, -24, -3, -2, -12, + -14, 0, 0, -19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, -24, -3, -2, + -12, -14, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -7, 3, 0, -3, + 2, 5, 3, -9, 0, -1, -2, 3, + 0, 2, 0, 0, 0, 0, -7, 0, + -3, -2, -6, 0, -3, -12, 0, 18, + -3, 0, -6, -2, 0, -2, -5, 0, + -3, -8, -6, -3, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, -24, + -3, -2, -12, -14, 0, 0, -19, 0, + 0, 0, 0, 0, 0, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, -9, -3, -3, 9, -3, -3, + -12, 1, -2, 1, -2, -8, 1, 6, + 1, 2, 1, 2, -7, -12, -3, 0, + -11, -5, -8, -12, -11, 0, -5, -6, + -3, -4, -2, -2, -3, -2, 0, -2, + -1, 4, 0, 4, -2, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -3, -3, 0, 0, + -8, 0, -1, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, 0, 0, 0, -2, 0, 0, -5, + -3, 3, 0, -5, -5, -2, 0, -8, + -2, -6, -2, -3, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 9, 0, 0, -5, 0, + 0, 0, 0, -4, 0, -3, 0, 0, + -1, 0, 0, -2, 0, -7, 0, 0, + 12, -4, -10, -9, 2, 3, 3, -1, + -8, 2, 4, 2, 9, 2, 10, -2, + -8, 0, 0, -12, 0, 0, -9, -8, + 0, 0, -6, 0, -4, -5, 0, -4, + 0, -4, 0, -2, 4, 0, -2, -9, + -3, 11, 0, 0, -3, 0, -6, 0, + 0, 4, -7, 0, 3, -3, 2, 0, + 0, -10, 0, -2, -1, 0, -3, 3, + -2, 0, 0, 0, -12, -3, -6, 0, + -9, 0, 0, -14, 0, 11, -3, 0, + -5, 0, 2, 0, -3, 0, -3, -9, + 0, -3, 3, 0, 0, 0, 0, -2, + 0, 0, 3, -4, 1, 0, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 6, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 0, 6, 0, 7, + 0, 0, 0, 0, 0, -18, -16, 1, + 12, 9, 5, -12, 2, 12, 0, 11, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_18 = { +#else +lv_font_t lv_font_montserrat_18 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 21, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_18*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_20.c b/inc/lvgl/src/font/lv_font_montserrat_20.c new file mode 100644 index 0000000..de7e49d --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_20.c @@ -0,0 +1,3217 @@ +/******************************************************************************* + * Size: 20 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 20 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_20.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_20 + #define LV_FONT_MONTSERRAT_20 1 +#endif + +#if LV_FONT_MONTSERRAT_20 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x6f, 0xc6, 0xfc, 0x5f, 0xb4, 0xfa, 0x4f, 0xa3, + 0xf9, 0x3f, 0x92, 0xf8, 0x2f, 0x71, 0xd6, 0x0, + 0x1, 0x94, 0x9f, 0xe4, 0xf9, + + /* U+0022 "\"" */ + 0xbe, 0x1, 0xf8, 0xbe, 0x1, 0xf8, 0xad, 0x1, + 0xf7, 0xad, 0x0, 0xf7, 0xad, 0x0, 0xf7, 0x57, + 0x0, 0x83, + + /* U+0023 "#" */ + 0x0, 0x0, 0x7f, 0x0, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0xac, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x0, + 0xca, 0x0, 0x9, 0xd0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x6, 0x88, 0xfb, 0x88, + 0x8e, 0xc8, 0x84, 0x0, 0x2, 0xf4, 0x0, 0xf, + 0x70, 0x0, 0x0, 0x3, 0xf2, 0x0, 0xf, 0x50, + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x2f, 0x40, 0x0, + 0x0, 0x7, 0xf0, 0x0, 0x4f, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x38, 0x8d, + 0xd8, 0x88, 0xcf, 0x88, 0x70, 0x0, 0xd, 0x90, + 0x0, 0xac, 0x0, 0x0, 0x0, 0xf, 0x70, 0x0, + 0xca, 0x0, 0x0, 0x0, 0x1f, 0x50, 0x0, 0xe8, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf0, + 0x0, 0x0, 0x0, 0x7, 0xcf, 0xff, 0xc8, 0x10, + 0x1, 0xdf, 0xfe, 0xfd, 0xff, 0xd0, 0x8, 0xfc, + 0x15, 0xf0, 0x6, 0x60, 0xc, 0xf3, 0x5, 0xf0, + 0x0, 0x0, 0xc, 0xf5, 0x5, 0xf0, 0x0, 0x0, + 0x6, 0xfe, 0x76, 0xf0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x5, 0xf4, 0xaf, 0xf2, + 0x0, 0x0, 0x5, 0xf0, 0x9, 0xf7, 0x1, 0x0, + 0x5, 0xf0, 0x6, 0xf8, 0xc, 0x92, 0x5, 0xf0, + 0x2d, 0xf4, 0xc, 0xff, 0xed, 0xfd, 0xff, 0xa0, + 0x0, 0x4a, 0xef, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x9e, 0xe9, 0x0, 0x0, 0x0, 0xda, 0x0, + 0x0, 0xad, 0x44, 0xda, 0x0, 0x0, 0x9e, 0x10, + 0x0, 0x1f, 0x40, 0x4, 0xf1, 0x0, 0x4f, 0x40, + 0x0, 0x3, 0xf1, 0x0, 0x1f, 0x30, 0x1e, 0x90, + 0x0, 0x0, 0x2f, 0x30, 0x3, 0xf1, 0xa, 0xd0, + 0x0, 0x0, 0x0, 0xcb, 0x11, 0xbb, 0x5, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfc, 0x11, 0xe8, + 0x1a, 0xfe, 0x70, 0x0, 0x0, 0x11, 0x0, 0xad, + 0xa, 0xd4, 0x5f, 0x60, 0x0, 0x0, 0x0, 0x5f, + 0x32, 0xf3, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x1f, + 0x70, 0x4f, 0x0, 0x4, 0xf0, 0x0, 0x0, 0xb, + 0xc0, 0x4, 0xf0, 0x0, 0x3f, 0x0, 0x0, 0x6, + 0xf2, 0x0, 0x2f, 0x20, 0x6, 0xe0, 0x0, 0x2, + 0xf7, 0x0, 0x0, 0xbb, 0x23, 0xe6, 0x0, 0x0, + 0xcc, 0x0, 0x0, 0x1, 0xaf, 0xe8, 0x0, + + /* U+0026 "&" */ + 0x0, 0x1, 0x9d, 0xfd, 0x70, 0x0, 0x0, 0x0, + 0xd, 0xf9, 0x7b, 0xf7, 0x0, 0x0, 0x0, 0x4f, + 0x90, 0x0, 0xdc, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0xec, 0x0, 0x0, 0x0, 0x1f, 0xe1, 0x1b, + 0xf4, 0x0, 0x0, 0x0, 0x5, 0xfd, 0xef, 0x50, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc7, 0xfd, 0x20, 0x8, 0x30, + 0x7, 0xf9, 0x0, 0x5f, 0xe2, 0x1f, 0x80, 0xe, + 0xe0, 0x0, 0x5, 0xfe, 0xaf, 0x30, 0xf, 0xd0, + 0x0, 0x0, 0x4f, 0xfc, 0x0, 0xd, 0xf7, 0x0, + 0x0, 0x5e, 0xff, 0x30, 0x4, 0xff, 0xeb, 0xbe, + 0xfe, 0x6f, 0xf2, 0x0, 0x29, 0xdf, 0xfc, 0x70, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0027 "'" */ + 0xbe, 0xbe, 0xad, 0xad, 0xad, 0x57, + + /* U+0028 "(" */ + 0x0, 0xe, 0xd0, 0x0, 0x7f, 0x60, 0x0, 0xef, + 0x0, 0x3, 0xfa, 0x0, 0x8, 0xf5, 0x0, 0xb, + 0xf2, 0x0, 0xe, 0xf0, 0x0, 0xf, 0xe0, 0x0, + 0xf, 0xd0, 0x0, 0x1f, 0xc0, 0x0, 0xf, 0xd0, + 0x0, 0xf, 0xe0, 0x0, 0xe, 0xf0, 0x0, 0xb, + 0xf2, 0x0, 0x8, 0xf5, 0x0, 0x3, 0xfa, 0x0, + 0x0, 0xee, 0x0, 0x0, 0x7f, 0x60, 0x0, 0xe, + 0xd0, + + /* U+0029 ")" */ + 0x2f, 0xb0, 0x0, 0xaf, 0x30, 0x3, 0xfa, 0x0, + 0xe, 0xf0, 0x0, 0x9f, 0x40, 0x6, 0xf7, 0x0, + 0x3f, 0xa0, 0x2, 0xfb, 0x0, 0x1f, 0xc0, 0x0, + 0xfd, 0x0, 0x1f, 0xc0, 0x2, 0xfb, 0x0, 0x3f, + 0xa0, 0x6, 0xf7, 0x0, 0x9f, 0x40, 0xe, 0xf0, + 0x3, 0xfa, 0x0, 0xaf, 0x30, 0x2f, 0xb0, 0x0, + + /* U+002A "*" */ + 0x0, 0x9, 0x90, 0x0, 0x26, 0x9, 0x90, 0x62, + 0x5f, 0xcb, 0xbc, 0xf5, 0x2, 0xbf, 0xfb, 0x20, + 0x7, 0xef, 0xfe, 0x70, 0x6f, 0x69, 0x96, 0xf6, + 0x1, 0x9, 0x90, 0x10, 0x0, 0x6, 0x60, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xfa, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, + 0xfd, 0xaa, 0xa2, 0x0, 0x0, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, + + /* U+002C "," */ + 0x6, 0xa1, 0xf, 0xf8, 0xa, 0xf7, 0x5, 0xf2, + 0x9, 0xc0, 0xd, 0x70, + + /* U+002D "-" */ + 0x9b, 0xbb, 0xb5, 0xdf, 0xff, 0xf8, + + /* U+002E "." */ + 0x7, 0xb2, 0xf, 0xf8, 0xa, 0xe4, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, 0x4, + 0xf7, 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, + 0xf, 0xc0, 0x0, 0x0, 0x4, 0xf6, 0x0, 0x0, + 0x0, 0xaf, 0x10, 0x0, 0x0, 0xf, 0xc0, 0x0, + 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0xf, 0xb0, 0x0, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, 0xf, + 0xb0, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, + 0xbf, 0x10, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, + 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x6, 0xf5, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x1, 0x8d, 0xfe, 0xa3, 0x0, 0x0, 0x2, + 0xef, 0xfd, 0xef, 0xf6, 0x0, 0x0, 0xdf, 0xa1, + 0x0, 0x6f, 0xf2, 0x0, 0x6f, 0xc0, 0x0, 0x0, + 0x7f, 0xb0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xff, + 0x0, 0xef, 0x10, 0x0, 0x0, 0xc, 0xf3, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0xaf, 0x50, 0xff, 0x0, + 0x0, 0x0, 0xa, 0xf5, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0xcf, 0x30, 0xbf, 0x40, 0x0, 0x0, 0xf, + 0xf0, 0x6, 0xfc, 0x0, 0x0, 0x7, 0xfb, 0x0, + 0xd, 0xfa, 0x10, 0x6, 0xff, 0x20, 0x0, 0x2e, + 0xff, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x18, 0xdf, + 0xea, 0x30, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xf4, 0xac, 0xce, 0xf4, 0x0, 0xb, + 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, + 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, + 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, + 0xf4, 0x0, 0xb, 0xf4, 0x0, 0xb, 0xf4, 0x0, + 0xb, 0xf4, + + /* U+0032 "2" */ + 0x0, 0x6c, 0xef, 0xea, 0x30, 0x2, 0xdf, 0xfe, + 0xdf, 0xff, 0x50, 0x5f, 0x91, 0x0, 0x9, 0xfe, + 0x0, 0x10, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x20, 0x0, 0x0, 0x0, 0x2f, + 0xd0, 0x0, 0x0, 0x0, 0x1d, 0xf5, 0x0, 0x0, + 0x0, 0x1c, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xf8, + 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, 0x0, + 0x2e, 0xf7, 0x0, 0x0, 0x0, 0x2e, 0xf6, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xcc, 0xcc, 0xcc, 0x94, + 0xff, 0xff, 0xff, 0xff, 0xfc, + + /* U+0033 "3" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x3, 0xcc, 0xcc, + 0xcc, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xe2, + 0x0, 0x0, 0x0, 0x1d, 0xf4, 0x0, 0x0, 0x0, + 0xc, 0xf6, 0x0, 0x0, 0x0, 0x9, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfe, 0x80, 0x0, 0x0, + 0x6, 0x68, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x50, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x1, + 0x0, 0x0, 0x0, 0xaf, 0x77, 0xe6, 0x10, 0x0, + 0x6f, 0xf2, 0x7f, 0xff, 0xee, 0xff, 0xf6, 0x0, + 0x28, 0xcf, 0xfe, 0xa3, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x7, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0x30, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x2e, 0xf2, 0x0, 0x6f, 0x70, + 0x0, 0x0, 0xcf, 0x50, 0x0, 0x6f, 0x70, 0x0, + 0x9, 0xf9, 0x0, 0x0, 0x6f, 0x70, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2c, 0xcc, + 0xcc, 0xcc, 0xdf, 0xec, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0x70, 0x0, + + /* U+0035 "5" */ + 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfc, + 0xcc, 0xcc, 0xc0, 0x2, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xec, 0xca, 0x72, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xa0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x2, + 0x0, 0x0, 0x0, 0x6f, 0xa3, 0xf8, 0x20, 0x0, + 0x5f, 0xf4, 0x4f, 0xff, 0xed, 0xff, 0xf9, 0x0, + 0x17, 0xce, 0xfe, 0xb5, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x5b, 0xef, 0xeb, 0x60, 0x0, 0xb, + 0xff, 0xec, 0xdf, 0xb0, 0x0, 0xaf, 0xb2, 0x0, + 0x1, 0x10, 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf0, + 0x6c, 0xff, 0xc6, 0x0, 0xf, 0xfa, 0xfd, 0xbc, + 0xff, 0xa0, 0xf, 0xff, 0x60, 0x0, 0x2e, 0xf5, + 0xf, 0xfa, 0x0, 0x0, 0x5, 0xfa, 0xc, 0xf7, + 0x0, 0x0, 0x3, 0xfc, 0x7, 0xfa, 0x0, 0x0, + 0x5, 0xfa, 0x1, 0xef, 0x60, 0x0, 0x2e, 0xf4, + 0x0, 0x4f, 0xfe, 0xbc, 0xff, 0x80, 0x0, 0x1, + 0x9d, 0xfe, 0xb4, 0x0, + + /* U+0037 "7" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x6f, 0xec, + 0xcc, 0xcc, 0xdf, 0xf1, 0x6f, 0x80, 0x0, 0x0, + 0x6f, 0xa0, 0x6f, 0x80, 0x0, 0x0, 0xdf, 0x30, + 0x14, 0x20, 0x0, 0x4, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x60, 0x0, + 0x0, 0x0, 0x2, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, 0x0, 0x6, + 0xfb, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x6, 0xce, 0xfe, 0xb5, 0x0, 0x0, 0xcf, + 0xfc, 0xac, 0xff, 0xb0, 0x6, 0xfc, 0x10, 0x0, + 0x2d, 0xf4, 0x9, 0xf6, 0x0, 0x0, 0x8, 0xf7, + 0x6, 0xfb, 0x0, 0x0, 0x1d, 0xf4, 0x0, 0xaf, + 0xea, 0x9a, 0xff, 0x80, 0x0, 0x5e, 0xff, 0xff, + 0xfe, 0x40, 0x6, 0xfe, 0x61, 0x2, 0x7f, 0xf4, + 0xe, 0xf3, 0x0, 0x0, 0x5, 0xfc, 0x1f, 0xe0, + 0x0, 0x0, 0x0, 0xff, 0xf, 0xf1, 0x0, 0x0, + 0x3, 0xfe, 0xa, 0xfb, 0x10, 0x0, 0x2d, 0xf8, + 0x1, 0xdf, 0xfc, 0xbc, 0xff, 0xc0, 0x0, 0x7, + 0xce, 0xfe, 0xb6, 0x0, + + /* U+0039 "9" */ + 0x0, 0x3a, 0xef, 0xeb, 0x40, 0x0, 0x6, 0xff, + 0xda, 0xcf, 0xf8, 0x0, 0x1f, 0xf4, 0x0, 0x1, + 0xcf, 0x50, 0x5f, 0x90, 0x0, 0x0, 0x2f, 0xd0, + 0x6f, 0x90, 0x0, 0x0, 0x3f, 0xf1, 0x2f, 0xf4, + 0x0, 0x1, 0xcf, 0xf4, 0x8, 0xff, 0xda, 0xbf, + 0xec, 0xf5, 0x0, 0x4b, 0xef, 0xd9, 0x1a, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x90, 0x0, 0x40, 0x0, 0x1a, 0xfe, 0x10, + 0x6, 0xfe, 0xdd, 0xff, 0xe3, 0x0, 0x3, 0xad, + 0xfe, 0xc7, 0x10, 0x0, + + /* U+003A ":" */ + 0xa, 0xe4, 0xf, 0xf8, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xb2, 0xf, 0xf8, 0xa, 0xe4, + + /* U+003B ";" */ + 0xa, 0xe4, 0xf, 0xf8, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xa1, 0xf, 0xf8, 0xa, 0xf7, 0x5, 0xf2, + 0x9, 0xc0, 0xd, 0x70, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x2, + 0x9f, 0xf4, 0x0, 0x5, 0xcf, 0xfb, 0x40, 0x28, + 0xef, 0xe8, 0x10, 0x0, 0xaf, 0xc4, 0x0, 0x0, + 0x0, 0x8f, 0xfa, 0x40, 0x0, 0x0, 0x2, 0x9e, + 0xfd, 0x71, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x39, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1, + + /* U+003D "=" */ + 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, 0xaa, + 0xaa, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, 0x6a, 0xaa, + 0xaa, 0xaa, 0xa2, + + /* U+003E ">" */ + 0x63, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd6, 0x10, + 0x0, 0x0, 0x17, 0xdf, 0xf9, 0x30, 0x0, 0x0, + 0x3, 0xaf, 0xfc, 0x60, 0x0, 0x0, 0x1, 0x6e, + 0xf4, 0x0, 0x0, 0x6, 0xcf, 0xf3, 0x0, 0x39, + 0xff, 0xd6, 0x0, 0x5d, 0xff, 0xa3, 0x0, 0x0, + 0xad, 0x71, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x7c, 0xef, 0xda, 0x30, 0x2, 0xef, 0xfc, + 0xce, 0xff, 0x60, 0x6f, 0x80, 0x0, 0x8, 0xfe, + 0x0, 0x10, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x1, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x60, 0x0, 0x0, 0x1, 0xcf, 0x80, 0x0, 0x0, + 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xc0, + 0x0, 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x93, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x6, 0xf8, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfd, 0x97, 0x67, + 0x9e, 0xfb, 0x10, 0x0, 0x0, 0x5, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x4d, 0xe3, 0x0, 0x0, 0x3f, + 0xa0, 0x0, 0x58, 0x85, 0x3, 0x94, 0xbe, 0x10, + 0x0, 0xec, 0x0, 0x2d, 0xff, 0xff, 0xd7, 0xf5, + 0x1d, 0xb0, 0x6, 0xf3, 0x1, 0xef, 0x71, 0x4, + 0xdf, 0xf5, 0x5, 0xf2, 0xb, 0xd0, 0x8, 0xf7, + 0x0, 0x0, 0x1e, 0xf5, 0x0, 0xe7, 0xe, 0x90, + 0xc, 0xf0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0xca, + 0xf, 0x70, 0xe, 0xe0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0xab, 0xf, 0x70, 0xd, 0xf0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0xba, 0xe, 0x90, 0xa, 0xf3, + 0x0, 0x0, 0xb, 0xf5, 0x0, 0xd8, 0xb, 0xd0, + 0x3, 0xfd, 0x10, 0x0, 0x7f, 0xf7, 0x3, 0xf4, + 0x6, 0xf3, 0x0, 0x7f, 0xfa, 0x9d, 0xf7, 0xfe, + 0xae, 0xc0, 0x0, 0xec, 0x0, 0x4, 0xcf, 0xfb, + 0x40, 0x5e, 0xfa, 0x10, 0x0, 0x3f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xfd, 0x97, 0x68, 0xaf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfd, + 0xb7, 0x10, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xaf, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xfa, 0x1f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xf3, 0xa, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xc0, 0x3, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x50, 0x0, 0xcf, 0x30, 0x0, + 0x0, 0x1, 0xfe, 0x0, 0x0, 0x5f, 0xb0, 0x0, + 0x0, 0x8, 0xf7, 0x0, 0x0, 0xe, 0xf2, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x6f, 0xda, 0xaa, 0xaa, 0xaa, 0xff, 0x10, + 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0x9f, 0x80, + 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe0, + 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf6, + + /* U+0042 "B" */ + 0xef, 0xff, 0xff, 0xfe, 0xb5, 0x0, 0xe, 0xfb, + 0xaa, 0xab, 0xdf, 0xfa, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x4f, 0xf3, 0xe, 0xf1, 0x0, 0x0, 0x0, + 0xaf, 0x60, 0xef, 0x10, 0x0, 0x0, 0xc, 0xf4, + 0xe, 0xf1, 0x0, 0x0, 0x29, 0xfc, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0xe, 0xfb, 0xaa, + 0xaa, 0xce, 0xfd, 0x10, 0xef, 0x10, 0x0, 0x0, + 0x8, 0xfb, 0xe, 0xf1, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xff, 0x1e, + 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0xef, 0xba, + 0xaa, 0xab, 0xef, 0xf4, 0xe, 0xff, 0xff, 0xff, + 0xfd, 0x92, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xb5, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xde, 0xff, 0xc1, 0x0, 0x5f, + 0xf9, 0x20, 0x0, 0x3b, 0xf5, 0x2, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x30, 0x8, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x30, 0x0, 0x5f, 0xfa, + 0x30, 0x0, 0x3b, 0xf5, 0x0, 0x5, 0xef, 0xff, + 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x17, 0xce, 0xfe, + 0xb5, 0x0, + + /* U+0044 "D" */ + 0xef, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x0, 0xef, + 0xdc, 0xcc, 0xdf, 0xff, 0xb1, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x5d, 0xfd, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0x1f, 0xf1, 0xef, 0x10, 0x0, 0x0, 0x0, + 0xa, 0xf6, 0xef, 0x10, 0x0, 0x0, 0x0, 0x8, + 0xf8, 0xef, 0x10, 0x0, 0x0, 0x0, 0x7, 0xf8, + 0xef, 0x10, 0x0, 0x0, 0x0, 0xa, 0xf6, 0xef, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xa0, 0xef, 0x10, 0x0, + 0x0, 0x5d, 0xfd, 0x10, 0xef, 0xcc, 0xcc, 0xdf, + 0xff, 0xb1, 0x0, 0xef, 0xff, 0xff, 0xfd, 0xa4, + 0x0, 0x0, + + /* U+0045 "E" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe, 0xfd, 0xcc, + 0xcc, 0xcc, 0xc0, 0xef, 0x10, 0x0, 0x0, 0x0, + 0xe, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xf2, 0xe, 0xfc, + 0xcc, 0xcc, 0xcc, 0x10, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xe, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xcc, 0xcc, 0xcc, 0xcc, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+0046 "F" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdc, 0xcc, + 0xcc, 0xcc, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0xcc, + 0xcc, 0xcc, 0xc1, 0xef, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb6, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xde, 0xff, 0xd2, 0x0, 0x5f, + 0xf9, 0x20, 0x0, 0x29, 0xf7, 0x2, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x20, 0x8, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xfb, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x8, + 0xfa, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x1, 0xff, + 0x60, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x5f, 0xfa, + 0x30, 0x0, 0x2a, 0xfb, 0x0, 0x4, 0xef, 0xff, + 0xdf, 0xff, 0xe4, 0x0, 0x0, 0x17, 0xce, 0xfe, + 0xb6, 0x0, + + /* U+0048 "H" */ + 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xf1, + 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, 0x0, + 0xd, 0xf2, 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, + 0x2e, 0xf1, 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0xfd, 0xcc, + 0xcc, 0xcc, 0xcf, 0xf2, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, 0x0, 0xd, + 0xf2, 0xef, 0x10, 0x0, 0x0, 0x0, 0xdf, 0x2e, + 0xf1, 0x0, 0x0, 0x0, 0xd, 0xf2, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xf1, 0x0, 0x0, + 0x0, 0xd, 0xf2, + + /* U+0049 "I" */ + 0xef, 0x1e, 0xf1, 0xef, 0x1e, 0xf1, 0xef, 0x1e, + 0xf1, 0xef, 0x1e, 0xf1, 0xef, 0x1e, 0xf1, 0xef, + 0x1e, 0xf1, 0xef, 0x1e, 0xf1, + + /* U+004A "J" */ + 0x0, 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x9c, 0xcc, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, + 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, + 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, + 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xf4, + 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, + 0xb, 0xf4, 0x1, 0x0, 0x0, 0xd, 0xf2, 0xc, + 0xc2, 0x0, 0x6f, 0xe0, 0xa, 0xff, 0xde, 0xff, + 0x60, 0x0, 0x6c, 0xff, 0xc5, 0x0, + + /* U+004B "K" */ + 0xef, 0x10, 0x0, 0x0, 0xb, 0xf8, 0xe, 0xf1, + 0x0, 0x0, 0xb, 0xf8, 0x0, 0xef, 0x10, 0x0, + 0xb, 0xf9, 0x0, 0xe, 0xf1, 0x0, 0xb, 0xfa, + 0x0, 0x0, 0xef, 0x10, 0xa, 0xfb, 0x0, 0x0, + 0xe, 0xf1, 0xa, 0xfb, 0x0, 0x0, 0x0, 0xef, + 0x19, 0xff, 0x30, 0x0, 0x0, 0xe, 0xfa, 0xfe, + 0xfe, 0x10, 0x0, 0x0, 0xef, 0xfd, 0x1a, 0xfc, + 0x0, 0x0, 0xe, 0xfd, 0x10, 0xc, 0xfa, 0x0, + 0x0, 0xef, 0x20, 0x0, 0x1e, 0xf7, 0x0, 0xe, + 0xf1, 0x0, 0x0, 0x2f, 0xf4, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x4f, 0xf2, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x6f, 0xd1, + + /* U+004C "L" */ + 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, + 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xef, 0xcc, 0xcc, 0xcc, + 0xc8, 0xef, 0xff, 0xff, 0xff, 0xfb, + + /* U+004D "M" */ + 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xef, + 0xf3, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xef, 0x9f, + 0x60, 0x0, 0x0, 0x4f, 0xaf, 0xfe, 0xf1, 0xee, + 0x10, 0x0, 0xd, 0xf1, 0xff, 0xef, 0x6, 0xf9, + 0x0, 0x7, 0xf7, 0xe, 0xfe, 0xf0, 0xc, 0xf3, + 0x1, 0xfd, 0x0, 0xef, 0xef, 0x0, 0x3f, 0xc0, + 0xaf, 0x40, 0xe, 0xfe, 0xf0, 0x0, 0x9f, 0x9f, + 0xa0, 0x0, 0xef, 0xef, 0x0, 0x1, 0xef, 0xf1, + 0x0, 0xe, 0xfe, 0xf0, 0x0, 0x6, 0xf7, 0x0, + 0x0, 0xef, 0xef, 0x0, 0x0, 0x4, 0x0, 0x0, + 0xe, 0xfe, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, + + /* U+004E "N" */ + 0xef, 0x20, 0x0, 0x0, 0x0, 0xdf, 0x2e, 0xfd, + 0x10, 0x0, 0x0, 0xd, 0xf2, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0xdf, 0x2e, 0xfe, 0xf8, 0x0, 0x0, + 0xd, 0xf2, 0xef, 0x4f, 0xf5, 0x0, 0x0, 0xdf, + 0x2e, 0xf1, 0x5f, 0xf3, 0x0, 0xd, 0xf2, 0xef, + 0x10, 0x8f, 0xe1, 0x0, 0xdf, 0x2e, 0xf1, 0x0, + 0xbf, 0xc0, 0xd, 0xf2, 0xef, 0x10, 0x1, 0xdf, + 0x90, 0xdf, 0x2e, 0xf1, 0x0, 0x2, 0xff, 0x6d, + 0xf2, 0xef, 0x10, 0x0, 0x5, 0xff, 0xff, 0x2e, + 0xf1, 0x0, 0x0, 0x8, 0xff, 0xf2, 0xef, 0x10, + 0x0, 0x0, 0xb, 0xff, 0x2e, 0xf1, 0x0, 0x0, + 0x0, 0xd, 0xf2, + + /* U+004F "O" */ + 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xfe, 0xdf, 0xff, 0xd3, 0x0, + 0x0, 0x5f, 0xf9, 0x20, 0x0, 0x3b, 0xff, 0x20, + 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xd0, + 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf5, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, + 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf5, + 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xd0, + 0x0, 0x5f, 0xfa, 0x20, 0x0, 0x3b, 0xff, 0x20, + 0x0, 0x4, 0xef, 0xff, 0xdf, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xb5, 0x0, 0x0, + + /* U+0050 "P" */ + 0xef, 0xff, 0xff, 0xec, 0x70, 0x0, 0xef, 0xdc, + 0xcd, 0xef, 0xfd, 0x20, 0xef, 0x10, 0x0, 0x2, + 0xbf, 0xc0, 0xef, 0x10, 0x0, 0x0, 0xe, 0xf3, + 0xef, 0x10, 0x0, 0x0, 0xa, 0xf5, 0xef, 0x10, + 0x0, 0x0, 0xb, 0xf5, 0xef, 0x10, 0x0, 0x0, + 0x2f, 0xf2, 0xef, 0x10, 0x0, 0x15, 0xdf, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xef, 0xcc, + 0xcc, 0xb9, 0x40, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x16, 0xce, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xfd, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x5f, 0xfa, 0x20, 0x0, 0x4b, 0xff, + 0x20, 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x9, + 0xfd, 0x0, 0x8, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf5, 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xfc, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xc0, 0xd, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfa, 0x0, 0x9f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x50, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x0, 0x6, 0xff, + 0x92, 0x0, 0x3, 0xbf, 0xf3, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0xce, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xe2, 0x0, 0x1a, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0xbf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xef, 0xb3, + 0x0, + + /* U+0052 "R" */ + 0xef, 0xff, 0xff, 0xec, 0x70, 0x0, 0xef, 0xdc, + 0xcd, 0xef, 0xfd, 0x20, 0xef, 0x10, 0x0, 0x2, + 0xbf, 0xc0, 0xef, 0x10, 0x0, 0x0, 0xe, 0xf3, + 0xef, 0x10, 0x0, 0x0, 0xa, 0xf5, 0xef, 0x10, + 0x0, 0x0, 0xb, 0xf5, 0xef, 0x10, 0x0, 0x0, + 0x2f, 0xf2, 0xef, 0x10, 0x0, 0x15, 0xdf, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xcc, + 0xcb, 0xdf, 0x90, 0x0, 0xef, 0x10, 0x0, 0x1e, + 0xf2, 0x0, 0xef, 0x10, 0x0, 0x4, 0xfd, 0x0, + 0xef, 0x10, 0x0, 0x0, 0x9f, 0x90, 0xef, 0x10, + 0x0, 0x0, 0xd, 0xf4, + + /* U+0053 "S" */ + 0x0, 0x6, 0xce, 0xfe, 0xc7, 0x10, 0x0, 0xcf, + 0xfd, 0xcd, 0xff, 0xd0, 0x8, 0xfc, 0x20, 0x0, + 0x17, 0x60, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd9, + 0x40, 0x0, 0x0, 0x1, 0x6a, 0xef, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xf7, 0x1, 0x0, 0x0, 0x0, + 0x7, 0xf8, 0xd, 0xb3, 0x0, 0x0, 0x3e, 0xf4, + 0xa, 0xff, 0xfc, 0xce, 0xff, 0x90, 0x0, 0x39, + 0xdf, 0xfe, 0xa4, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbc, 0xcc, + 0xdf, 0xfc, 0xcc, 0xc8, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0xff, + 0x0, 0x0, 0x0, 0x2, 0xfd, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x2f, 0xd0, 0xff, 0x0, 0x0, 0x0, + 0x2, 0xfd, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x2f, + 0xd0, 0xff, 0x0, 0x0, 0x0, 0x2, 0xfd, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0xff, 0x0, + 0x0, 0x0, 0x2, 0xfc, 0xf, 0xf0, 0x0, 0x0, + 0x0, 0x2f, 0xc0, 0xdf, 0x30, 0x0, 0x0, 0x5, + 0xfa, 0x9, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0x60, + 0x2f, 0xf8, 0x0, 0x1, 0xaf, 0xe0, 0x0, 0x5f, + 0xff, 0xde, 0xff, 0xe3, 0x0, 0x0, 0x29, 0xdf, + 0xfd, 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf1, + 0x5, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x90, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0xdf, 0x20, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x4, 0xfb, 0x0, + 0x0, 0x1f, 0xf2, 0x0, 0x0, 0xb, 0xf4, 0x0, + 0x0, 0x9, 0xf8, 0x0, 0x0, 0x2f, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0x0, 0x0, 0x9f, 0x60, 0x0, + 0x0, 0x0, 0xbf, 0x60, 0x1, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xd0, 0x7, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf4, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfb, 0x5f, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xef, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x3f, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0x60, 0x0, + 0x0, 0x2, 0xfb, 0xd, 0xf3, 0x0, 0x0, 0x1, + 0xff, 0xc0, 0x0, 0x0, 0x8, 0xf5, 0x8, 0xf8, + 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0xd, + 0xf1, 0x3, 0xfd, 0x0, 0x0, 0xc, 0xf8, 0xf7, + 0x0, 0x0, 0x3f, 0xb0, 0x0, 0xdf, 0x30, 0x0, + 0x2f, 0xb2, 0xfc, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x8f, 0x80, 0x0, 0x7f, 0x50, 0xcf, 0x10, 0x0, + 0xdf, 0x0, 0x0, 0x3f, 0xd0, 0x0, 0xdf, 0x0, + 0x7f, 0x70, 0x3, 0xfb, 0x0, 0x0, 0xd, 0xf3, + 0x2, 0xfa, 0x0, 0x2f, 0xc0, 0x8, 0xf5, 0x0, + 0x0, 0x8, 0xf8, 0x8, 0xf5, 0x0, 0xc, 0xf2, + 0xe, 0xf0, 0x0, 0x0, 0x3, 0xfd, 0xd, 0xf0, + 0x0, 0x7, 0xf7, 0x3f, 0xb0, 0x0, 0x0, 0x0, + 0xdf, 0x6f, 0xa0, 0x0, 0x1, 0xfc, 0x8f, 0x50, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, + 0xcf, 0xef, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0x0, 0x0, + + /* U+0058 "X" */ + 0x1f, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0x70, 0x5, + 0xfe, 0x10, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x9f, + 0xa0, 0x0, 0x2f, 0xe1, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0xdf, 0x40, 0x0, 0x0, 0x3, 0xff, 0x29, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xef, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x7, 0xfc, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x3f, + 0xf2, 0x0, 0xaf, 0xa0, 0x0, 0x0, 0xdf, 0x50, + 0x0, 0xd, 0xf5, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x3, 0xff, 0x20, 0x5f, 0xd0, 0x0, 0x0, 0x0, + 0x7f, 0xc0, + + /* U+0059 "Y" */ + 0xc, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, + 0x2f, 0xe1, 0x0, 0x0, 0x0, 0xdf, 0x20, 0x0, + 0x8f, 0x90, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0xef, 0x30, 0x0, 0x2f, 0xd0, 0x0, 0x0, 0x5, + 0xfc, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, + 0xf6, 0x5, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xe1, 0xef, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xf7, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xcc, + 0xcc, 0xcc, 0xcc, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfe, + 0xcc, 0xcc, 0xcc, 0xcc, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, + + /* U+005B "[" */ + 0xef, 0xff, 0x4e, 0xfa, 0xa2, 0xef, 0x0, 0xe, + 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, 0xef, + 0x0, 0xe, 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, + 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, 0xef, 0x0, + 0xe, 0xf0, 0x0, 0xef, 0x0, 0xe, 0xf0, 0x0, + 0xef, 0x0, 0xe, 0xfa, 0xa2, 0xef, 0xff, 0x40, + + /* U+005C "\\" */ + 0x57, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x0, 0xcf, 0x0, + 0x0, 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x1f, + 0xa0, 0x0, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0xbf, 0x10, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, + 0x0, 0xf, 0xb0, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0xf, + 0xb0, 0x0, 0x0, 0x0, 0xaf, 0x10, 0x0, 0x0, + 0x5, 0xf6, + + /* U+005D "]" */ + 0xaf, 0xff, 0x96, 0xac, 0xf9, 0x0, 0x5f, 0x90, + 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, 0x0, + 0x5f, 0x90, 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, + 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, 0x0, 0x5f, + 0x90, 0x5, 0xf9, 0x0, 0x5f, 0x90, 0x5, 0xf9, + 0x0, 0x5f, 0x96, 0xac, 0xf9, 0xaf, 0xff, 0x90, + + /* U+005E "^" */ + 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x10, 0x0, 0x0, 0xc, 0xbf, 0x70, 0x0, 0x0, + 0x3f, 0x49, 0xd0, 0x0, 0x0, 0x9d, 0x3, 0xf4, + 0x0, 0x1, 0xf7, 0x0, 0xcb, 0x0, 0x7, 0xf1, + 0x0, 0x6f, 0x20, 0xd, 0xa0, 0x0, 0xf, 0x80, + 0x4f, 0x30, 0x0, 0x9, 0xe0, + + /* U+005F "_" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x33, 0x33, 0x33, 0x33, 0x33, + + /* U+0060 "`" */ + 0x27, 0x70, 0x0, 0x5, 0xfc, 0x10, 0x0, 0x2d, + 0xd1, + + /* U+0061 "a" */ + 0x5, 0xbe, 0xfe, 0xb4, 0x0, 0x7f, 0xfd, 0xbd, + 0xff, 0x50, 0x2a, 0x10, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0xd, 0xf2, 0x0, 0x1, 0x11, 0x1c, + 0xf3, 0x8, 0xef, 0xff, 0xff, 0xf3, 0x9f, 0xc6, + 0x44, 0x4c, 0xf3, 0xff, 0x0, 0x0, 0xb, 0xf3, + 0xef, 0x10, 0x0, 0x3f, 0xf3, 0x8f, 0xd7, 0x69, + 0xfe, 0xf3, 0x6, 0xcf, 0xfc, 0x59, 0xf3, + + /* U+0062 "b" */ + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xb1, 0x9e, 0xfd, 0x92, 0x0, 0x3f, 0xde, + 0xfd, 0xce, 0xfe, 0x40, 0x3f, 0xfe, 0x30, 0x0, + 0x8f, 0xe1, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xd0, 0x0, 0x0, 0x4, 0xfa, 0x3f, 0xb0, + 0x0, 0x0, 0x2, 0xfc, 0x3f, 0xd0, 0x0, 0x0, + 0x4, 0xfa, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xfe, 0x30, 0x0, 0x8f, 0xe1, 0x3f, 0xce, + 0xfd, 0xce, 0xff, 0x40, 0x3f, 0xa1, 0x9e, 0xfe, + 0x92, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3, 0xae, 0xfe, 0x91, 0x0, 0x7, 0xff, + 0xdc, 0xef, 0xe2, 0x4, 0xfe, 0x40, 0x0, 0x7f, + 0x60, 0xcf, 0x40, 0x0, 0x0, 0x10, 0xf, 0xe0, + 0x0, 0x0, 0x0, 0x2, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x40, 0x0, 0x0, 0x10, 0x4, 0xfe, 0x40, 0x0, + 0x7f, 0x60, 0x7, 0xff, 0xdc, 0xef, 0xe2, 0x0, + 0x3, 0xae, 0xfe, 0x91, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, + 0x0, 0x4, 0xbe, 0xfc, 0x61, 0xfd, 0x0, 0x8f, + 0xfd, 0xce, 0xfb, 0xfd, 0x5, 0xfe, 0x40, 0x0, + 0x7f, 0xfd, 0xc, 0xf5, 0x0, 0x0, 0x9, 0xfd, + 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x2f, 0xc0, + 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, + 0x3, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x8, 0xfd, + 0x5, 0xfe, 0x20, 0x0, 0x5f, 0xfd, 0x0, 0x8f, + 0xfb, 0xad, 0xfb, 0xfd, 0x0, 0x4, 0xbe, 0xfd, + 0x70, 0xfd, + + /* U+0065 "e" */ + 0x0, 0x4, 0xbe, 0xfc, 0x60, 0x0, 0x0, 0x8f, + 0xfc, 0xbe, 0xfc, 0x0, 0x5, 0xfd, 0x20, 0x0, + 0xaf, 0x80, 0xc, 0xf3, 0x0, 0x0, 0xd, 0xf0, + 0xf, 0xe1, 0x11, 0x11, 0x19, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xf, 0xe4, 0x44, 0x44, + 0x44, 0x41, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xfe, 0x40, 0x0, 0x2b, 0x20, 0x0, 0x7f, + 0xfe, 0xcd, 0xff, 0x60, 0x0, 0x3, 0xae, 0xfe, + 0xa3, 0x0, + + /* U+0066 "f" */ + 0x0, 0x6, 0xdf, 0xd6, 0x0, 0x6f, 0xea, 0xc6, + 0x0, 0xcf, 0x20, 0x0, 0x0, 0xef, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf1, 0x7a, 0xff, 0xaa, 0xa0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x4, 0xbe, 0xfd, 0x70, 0xdf, 0x0, 0x8f, + 0xfd, 0xce, 0xfc, 0xef, 0x5, 0xfe, 0x40, 0x0, + 0x5f, 0xff, 0xc, 0xf4, 0x0, 0x0, 0x6, 0xff, + 0xf, 0xe0, 0x0, 0x0, 0x0, 0xff, 0x2f, 0xc0, + 0x0, 0x0, 0x0, 0xff, 0xf, 0xe0, 0x0, 0x0, + 0x1, 0xff, 0xc, 0xf5, 0x0, 0x0, 0x7, 0xff, + 0x5, 0xfe, 0x40, 0x0, 0x5f, 0xff, 0x0, 0x8f, + 0xfd, 0xbe, 0xfc, 0xff, 0x0, 0x4, 0xbe, 0xfd, + 0x71, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfb, + 0x1, 0xa4, 0x0, 0x0, 0x2d, 0xf5, 0x4, 0xff, + 0xfc, 0xbd, 0xff, 0xa0, 0x0, 0x28, 0xce, 0xfe, + 0xb5, 0x0, + + /* U+0068 "h" */ + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, + 0x3, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb1, + 0x9e, 0xfe, 0x91, 0x3, 0xfd, 0xef, 0xdd, 0xff, + 0xd0, 0x3f, 0xfd, 0x20, 0x2, 0xdf, 0x73, 0xff, + 0x20, 0x0, 0x4, 0xfc, 0x3f, 0xd0, 0x0, 0x0, + 0x1f, 0xd3, 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, + 0xb0, 0x0, 0x0, 0xf, 0xe3, 0xfb, 0x0, 0x0, + 0x0, 0xfe, 0x3f, 0xb0, 0x0, 0x0, 0xf, 0xe3, + 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, 0xb0, 0x0, + 0x0, 0xf, 0xe0, + + /* U+0069 "i" */ + 0x3e, 0xb0, 0x7f, 0xf0, 0x8, 0x40, 0x0, 0x0, + 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, + 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, + 0x3f, 0xb0, 0x3f, 0xb0, 0x3f, 0xb0, + + /* U+006A "j" */ + 0x0, 0x2, 0xec, 0x0, 0x0, 0x5f, 0xf1, 0x0, + 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xfd, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, + 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, + 0x0, 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, + 0x1f, 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x1f, + 0xd0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x1f, 0xd0, + 0x0, 0x5, 0xfa, 0x7, 0xdb, 0xff, 0x40, 0x7e, + 0xfd, 0x50, 0x0, + + /* U+006B "k" */ + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xb0, 0x0, 0x2, 0xdf, 0x50, 0x3f, 0xb0, + 0x0, 0x2e, 0xf6, 0x0, 0x3f, 0xb0, 0x3, 0xef, + 0x60, 0x0, 0x3f, 0xb0, 0x3f, 0xf6, 0x0, 0x0, + 0x3f, 0xb4, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xef, + 0xff, 0xf2, 0x0, 0x0, 0x3f, 0xff, 0x59, 0xfd, + 0x0, 0x0, 0x3f, 0xf4, 0x0, 0xcf, 0x90, 0x0, + 0x3f, 0xb0, 0x0, 0x1e, 0xf6, 0x0, 0x3f, 0xb0, + 0x0, 0x4, 0xff, 0x20, 0x3f, 0xb0, 0x0, 0x0, + 0x7f, 0xd0, + + /* U+006C "l" */ + 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, + 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, + 0xb3, 0xfb, 0x3f, 0xb3, 0xfb, 0x3f, 0xb0, + + /* U+006D "m" */ + 0x3f, 0xa3, 0xae, 0xfd, 0x70, 0x5, 0xcf, 0xfc, + 0x50, 0x3, 0xfd, 0xfe, 0xbc, 0xff, 0xaa, 0xfe, + 0xbc, 0xff, 0x70, 0x3f, 0xfb, 0x10, 0x3, 0xff, + 0xf9, 0x0, 0x4, 0xff, 0x13, 0xff, 0x10, 0x0, + 0x9, 0xfe, 0x0, 0x0, 0xb, 0xf4, 0x3f, 0xd0, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x8f, 0x63, + 0xfb, 0x0, 0x0, 0x5, 0xf9, 0x0, 0x0, 0x8, + 0xf6, 0x3f, 0xb0, 0x0, 0x0, 0x5f, 0x90, 0x0, + 0x0, 0x8f, 0x63, 0xfb, 0x0, 0x0, 0x5, 0xf9, + 0x0, 0x0, 0x8, 0xf6, 0x3f, 0xb0, 0x0, 0x0, + 0x5f, 0x90, 0x0, 0x0, 0x8f, 0x63, 0xfb, 0x0, + 0x0, 0x5, 0xf9, 0x0, 0x0, 0x8, 0xf6, 0x3f, + 0xb0, 0x0, 0x0, 0x5f, 0x90, 0x0, 0x0, 0x8f, + 0x60, + + /* U+006E "n" */ + 0x3f, 0xa2, 0xae, 0xfe, 0x91, 0x3, 0xfd, 0xff, + 0xcb, 0xef, 0xd0, 0x3f, 0xfc, 0x10, 0x1, 0xcf, + 0x73, 0xff, 0x20, 0x0, 0x4, 0xfc, 0x3f, 0xd0, + 0x0, 0x0, 0x1f, 0xd3, 0xfb, 0x0, 0x0, 0x0, + 0xfe, 0x3f, 0xb0, 0x0, 0x0, 0xf, 0xe3, 0xfb, + 0x0, 0x0, 0x0, 0xfe, 0x3f, 0xb0, 0x0, 0x0, + 0xf, 0xe3, 0xfb, 0x0, 0x0, 0x0, 0xfe, 0x3f, + 0xb0, 0x0, 0x0, 0xf, 0xe0, + + /* U+006F "o" */ + 0x0, 0x3, 0xae, 0xfd, 0x91, 0x0, 0x0, 0x7f, + 0xfd, 0xce, 0xfe, 0x30, 0x5, 0xfe, 0x40, 0x0, + 0x7f, 0xe1, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xf7, + 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfb, 0x2f, 0xc0, + 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, + 0x3, 0xfb, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xf7, + 0x4, 0xfe, 0x40, 0x0, 0x7f, 0xe1, 0x0, 0x7f, + 0xfd, 0xce, 0xfe, 0x30, 0x0, 0x3, 0xae, 0xfd, + 0x91, 0x0, + + /* U+0070 "p" */ + 0x3f, 0xa2, 0x9e, 0xfd, 0x92, 0x0, 0x3f, 0xce, + 0xfb, 0xad, 0xfe, 0x40, 0x3f, 0xfd, 0x20, 0x0, + 0x6f, 0xe1, 0x3f, 0xf3, 0x0, 0x0, 0x9, 0xf7, + 0x3f, 0xd0, 0x0, 0x0, 0x4, 0xfa, 0x3f, 0xb0, + 0x0, 0x0, 0x2, 0xfc, 0x3f, 0xd0, 0x0, 0x0, + 0x4, 0xfa, 0x3f, 0xf3, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xfe, 0x30, 0x0, 0x8f, 0xe1, 0x3f, 0xde, + 0xfd, 0xce, 0xff, 0x40, 0x3f, 0xb1, 0x9e, 0xfe, + 0x92, 0x0, 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x4, 0xbe, 0xfc, 0x60, 0xfd, 0x0, 0x8f, + 0xfd, 0xce, 0xfa, 0xfd, 0x5, 0xfe, 0x40, 0x0, + 0x7f, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xfd, + 0xf, 0xe0, 0x0, 0x0, 0x3, 0xfd, 0x2f, 0xc0, + 0x0, 0x0, 0x1, 0xfd, 0xf, 0xe0, 0x0, 0x0, + 0x3, 0xfd, 0xc, 0xf4, 0x0, 0x0, 0x9, 0xfd, + 0x5, 0xfe, 0x40, 0x0, 0x7f, 0xfd, 0x0, 0x8f, + 0xfd, 0xce, 0xfb, 0xfd, 0x0, 0x4, 0xbe, 0xfc, + 0x61, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xfd, + + /* U+0072 "r" */ + 0x3f, 0xa1, 0x9e, 0x83, 0xfc, 0xef, 0xf7, 0x3f, + 0xfe, 0x40, 0x3, 0xff, 0x40, 0x0, 0x3f, 0xe0, + 0x0, 0x3, 0xfc, 0x0, 0x0, 0x3f, 0xb0, 0x0, + 0x3, 0xfb, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x3, + 0xfb, 0x0, 0x0, 0x3f, 0xb0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x5c, 0xef, 0xea, 0x50, 0x9, 0xff, 0xcb, + 0xdf, 0xd0, 0x1f, 0xe1, 0x0, 0x2, 0x30, 0x2f, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x63, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xfb, 0x30, 0x0, 0x1, + 0x47, 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x9, 0xf6, + 0x9, 0x30, 0x0, 0xb, 0xf5, 0x5f, 0xfe, 0xbb, + 0xef, 0xc0, 0x5, 0xae, 0xfe, 0xc7, 0x0, + + /* U+0074 "t" */ + 0x0, 0x78, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf1, + 0x7a, 0xff, 0xaa, 0xa0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xef, 0x0, 0x0, + 0x0, 0xef, 0x0, 0x0, 0x0, 0xcf, 0x40, 0x0, + 0x0, 0x6f, 0xfb, 0xd7, 0x0, 0x7, 0xdf, 0xd5, + + /* U+0075 "u" */ + 0x4f, 0xa0, 0x0, 0x0, 0x3f, 0xb4, 0xfa, 0x0, + 0x0, 0x3, 0xfb, 0x4f, 0xa0, 0x0, 0x0, 0x3f, + 0xb4, 0xfa, 0x0, 0x0, 0x3, 0xfb, 0x4f, 0xa0, + 0x0, 0x0, 0x3f, 0xb4, 0xfa, 0x0, 0x0, 0x3, + 0xfb, 0x4f, 0xb0, 0x0, 0x0, 0x5f, 0xb2, 0xfd, + 0x0, 0x0, 0x9, 0xfb, 0xd, 0xf7, 0x0, 0x5, + 0xff, 0xb0, 0x4f, 0xfd, 0xad, 0xfc, 0xfb, 0x0, + 0x3b, 0xef, 0xd7, 0x2f, 0xb0, + + /* U+0076 "v" */ + 0xd, 0xf2, 0x0, 0x0, 0x0, 0xef, 0x0, 0x6f, + 0x90, 0x0, 0x0, 0x5f, 0x90, 0x0, 0xff, 0x0, + 0x0, 0xb, 0xf2, 0x0, 0x9, 0xf6, 0x0, 0x2, + 0xfb, 0x0, 0x0, 0x2f, 0xc0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xbf, 0x30, 0xf, 0xd0, 0x0, 0x0, + 0x4, 0xfa, 0x6, 0xf7, 0x0, 0x0, 0x0, 0xd, + 0xf1, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x7f, 0xbf, + 0x90, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbf, 0x10, 0x0, 0x0, 0xef, 0x0, 0x0, 0x1, + 0xfa, 0x5f, 0x70, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x6, 0xf5, 0xf, 0xd0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0xc, 0xe0, 0xa, 0xf2, 0x0, 0x1f, 0xab, + 0xf1, 0x0, 0x1f, 0x90, 0x4, 0xf8, 0x0, 0x6f, + 0x55, 0xf7, 0x0, 0x7f, 0x30, 0x0, 0xed, 0x0, + 0xce, 0x0, 0xec, 0x0, 0xde, 0x0, 0x0, 0x8f, + 0x32, 0xf9, 0x0, 0x9f, 0x23, 0xf8, 0x0, 0x0, + 0x3f, 0x98, 0xf3, 0x0, 0x3f, 0x88, 0xf2, 0x0, + 0x0, 0xd, 0xee, 0xd0, 0x0, 0xd, 0xde, 0xc0, + 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x7, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x2, + 0xff, 0x10, 0x0, + + /* U+0078 "x" */ + 0x2f, 0xe1, 0x0, 0x0, 0xdf, 0x30, 0x6f, 0xb0, + 0x0, 0xaf, 0x60, 0x0, 0xaf, 0x70, 0x6f, 0xa0, + 0x0, 0x0, 0xdf, 0x5f, 0xd1, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xb, 0xfb, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xfe, 0x2e, 0xf2, 0x0, 0x0, 0xdf, 0x40, 0x3f, + 0xd0, 0x0, 0x9f, 0x80, 0x0, 0x8f, 0xa0, 0x5f, + 0xc0, 0x0, 0x0, 0xcf, 0x60, + + /* U+0079 "y" */ + 0xd, 0xf2, 0x0, 0x0, 0x0, 0xef, 0x0, 0x6f, + 0x90, 0x0, 0x0, 0x5f, 0x80, 0x0, 0xef, 0x0, + 0x0, 0xb, 0xf2, 0x0, 0x8, 0xf7, 0x0, 0x2, + 0xfb, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x9f, 0x40, + 0x0, 0x0, 0xaf, 0x40, 0xf, 0xd0, 0x0, 0x0, + 0x3, 0xfb, 0x6, 0xf6, 0x0, 0x0, 0x0, 0xd, + 0xf2, 0xdf, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xcf, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x40, 0x0, 0x0, 0x3, 0x0, + 0x3f, 0xc0, 0x0, 0x0, 0x2, 0xfd, 0xbf, 0xf3, + 0x0, 0x0, 0x0, 0x8, 0xef, 0xc4, 0x0, 0x0, + 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0xff, 0xf8, 0xa, 0xaa, 0xaa, + 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x0, + 0x0, 0x6, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xe1, + 0x0, 0x0, 0x1, 0xdf, 0x40, 0x0, 0x0, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xb0, 0x0, 0x0, + 0x4, 0xfd, 0x10, 0x0, 0x0, 0x1e, 0xfc, 0xaa, + 0xaa, 0xa6, 0x3f, 0xff, 0xff, 0xff, 0xfb, + + /* U+007B "{" */ + 0x0, 0x3c, 0xfa, 0x0, 0xef, 0xc6, 0x3, 0xfc, + 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, + 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x5, 0xfa, 0x0, + 0x8e, 0xf6, 0x0, 0xdf, 0xe2, 0x0, 0x7, 0xf9, + 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, + 0xfa, 0x0, 0x4, 0xfa, 0x0, 0x4, 0xfa, 0x0, + 0x2, 0xfd, 0x0, 0x0, 0xef, 0xc6, 0x0, 0x3c, + 0xfa, + + /* U+007C "|" */ + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, + + /* U+007D "}" */ + 0xaf, 0xc3, 0x0, 0x6c, 0xfe, 0x0, 0x0, 0xcf, + 0x30, 0x0, 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, + 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, 0x9f, 0x50, + 0x0, 0x5f, 0xe8, 0x0, 0x2e, 0xfd, 0x0, 0x9f, + 0x70, 0x0, 0x9f, 0x40, 0x0, 0xaf, 0x40, 0x0, + 0xaf, 0x40, 0x0, 0xaf, 0x40, 0x0, 0xaf, 0x40, + 0x0, 0xcf, 0x30, 0x6c, 0xfe, 0x0, 0xaf, 0xc3, + 0x0, + + /* U+007E "~" */ + 0x9, 0xee, 0x60, 0x0, 0xd6, 0x7f, 0xab, 0xfb, + 0x26, 0xf3, 0xb9, 0x0, 0x5e, 0xff, 0x90, 0x31, + 0x0, 0x0, 0x32, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x6d, 0xea, 0x10, 0x7, 0xe5, 0x3b, 0xc0, + 0xe, 0x40, 0x0, 0xe4, 0x1f, 0x0, 0x0, 0xb7, + 0xf, 0x30, 0x0, 0xd5, 0x8, 0xc2, 0x8, 0xe0, + 0x0, 0x9f, 0xfc, 0x20, 0x0, 0x0, 0x10, 0x0, + + /* U+2022 "•" */ + 0x9, 0xa2, 0x8f, 0xfc, 0x9f, 0xfd, 0x2d, 0xe5, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0xae, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x69, 0xff, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xfe, 0x95, 0x0, 0x8, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xc7, 0x30, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, + 0x1, 0x7b, 0xbd, 0xff, 0x0, 0x0, 0xf, 0xf8, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x0, 0x13, + 0x3f, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xa1, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x7f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8a, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0xc4, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4c, 0xfd, 0xcd, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xff, 0xdc, 0xdf, 0xfa, 0x8a, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xb8, 0xaf, 0xf4, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x4f, + 0xf4, 0x4, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x50, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x47, 0xfd, 0x77, + 0x77, 0x77, 0x77, 0xdf, 0x84, 0x7f, 0xf4, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4f, + 0xf7, 0x47, 0xfd, 0x77, 0x77, 0x77, 0x77, 0xdf, + 0x84, 0x7f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x4, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x50, 0x4f, 0xf4, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x40, 0x4f, + 0xfa, 0x8a, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb8, 0xaf, 0xfd, 0xcd, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xff, 0xdc, 0xdf, 0xc4, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x4c, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xfa, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xf9, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf9, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xfa, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf9, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xfa, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x60, 0x6, 0xe4, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf6, 0x0, 0x7f, 0xff, 0x40, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x6, 0x70, 0x0, 0x0, 0x0, 0x18, 0x40, 0x8f, + 0xfb, 0x0, 0x0, 0x1, 0xdf, 0xf4, 0xff, 0xff, + 0xb0, 0x0, 0x1d, 0xff, 0xfb, 0x7f, 0xff, 0xfb, + 0x1, 0xdf, 0xff, 0xf4, 0x8, 0xff, 0xff, 0xbd, + 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1d, 0xff, + 0xff, 0x48, 0xff, 0xff, 0xb0, 0xcf, 0xff, 0xf4, + 0x0, 0x8f, 0xff, 0xf9, 0xdf, 0xff, 0x40, 0x0, + 0x8, 0xff, 0xf9, 0x2e, 0xf4, 0x0, 0x0, 0x0, + 0x8f, 0xc0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x26, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, + 0xdf, 0xf4, 0x0, 0x72, 0x0, 0x0, 0x0, 0xb, + 0xfe, 0x10, 0xdf, 0xf4, 0x9, 0xfe, 0x30, 0x0, + 0x0, 0xaf, 0xff, 0x50, 0xdf, 0xf4, 0xe, 0xff, + 0xe1, 0x0, 0x5, 0xff, 0xfb, 0x0, 0xdf, 0xf4, + 0x5, 0xff, 0xfb, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0xdf, 0xf4, 0x0, 0x5f, 0xff, 0x40, 0x4f, 0xff, + 0x20, 0x0, 0xdf, 0xf4, 0x0, 0xb, 0xff, 0xa0, + 0x8f, 0xfb, 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x4, + 0xff, 0xf0, 0xbf, 0xf7, 0x0, 0x0, 0xdf, 0xf4, + 0x0, 0x1, 0xff, 0xf1, 0xbf, 0xf6, 0x0, 0x0, + 0xdf, 0xf4, 0x0, 0x0, 0xff, 0xf2, 0xbf, 0xf7, + 0x0, 0x0, 0x8d, 0xc1, 0x0, 0x0, 0xff, 0xf1, + 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0xaf, 0xff, 0xd5, 0x10, 0x3, 0x9f, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9e, 0xff, 0xff, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x2b, 0xff, 0xff, 0xb2, 0x0, 0x10, 0x0, + 0x0, 0x8f, 0x87, 0xff, 0xff, 0xff, 0xff, 0x79, + 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x2f, 0xff, + 0xff, 0xff, 0xc7, 0x7c, 0xff, 0xff, 0xff, 0xf2, + 0x7, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x70, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xe0, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x6f, + 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, + 0x7, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x70, 0x2f, 0xff, 0xff, 0xff, 0xc7, 0x7c, + 0xff, 0xff, 0xff, 0xf2, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x8f, 0x97, 0xff, 0xff, 0xff, 0xff, 0x78, + 0xf8, 0x0, 0x0, 0x1, 0x0, 0x1b, 0xff, 0xff, + 0xb1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x0, + 0x67, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x20, 0xf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0x51, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, + 0x8f, 0xff, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfa, 0x0, 0x4e, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x8, 0xd3, + 0x2d, 0xff, 0xff, 0x10, 0x0, 0x0, 0xa, 0xff, + 0xf5, 0x1b, 0xff, 0xf5, 0xb, 0xff, 0xf4, 0x0, + 0x0, 0x1c, 0xff, 0xe2, 0x2d, 0xff, 0xff, 0xf7, + 0x8, 0xff, 0xf6, 0x0, 0x3e, 0xff, 0xc1, 0x4e, + 0xff, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xf9, 0xe, + 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x13, 0xef, 0xf6, 0x4f, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x31, 0xcc, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x80, 0x1, 0xef, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0xe, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x60, 0x0, 0xef, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0xe, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x40, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x56, 0x65, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xee, 0xef, 0xff, 0xff, 0xfe, 0xee, + 0x70, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0x91, + 0x4f, 0xf4, 0x19, 0xaa, 0xaa, 0xa7, 0xff, 0xff, + 0xff, 0xfd, 0x23, 0x32, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, + + /* U+F01C "" */ + 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x98, 0x88, 0x88, 0x88, 0x88, 0xdf, + 0xf3, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xd0, 0x0, 0x1, 0xef, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x80, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x5f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0xd, 0xff, 0x98, 0x88, 0x70, 0x0, 0x0, 0x3, + 0x88, 0x88, 0xdf, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x7, 0xba, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, + 0xb5, 0x0, 0xb, 0xff, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xb, 0xff, 0x0, 0xa, + 0xff, 0xff, 0xdb, 0xbe, 0xff, 0xff, 0x9a, 0xff, + 0x0, 0xaf, 0xff, 0xa2, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xd, 0xff, 0x60, 0x0, + 0x0, 0x7, 0xba, 0x9c, 0xff, 0xff, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xf6, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0xff, 0xff, 0xc9, 0xaa, + 0x70, 0x0, 0x0, 0x7, 0xff, 0xd0, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x3b, 0xff, + 0xf9, 0x0, 0xff, 0xa9, 0xff, 0xff, 0xeb, 0xbd, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xb0, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xb0, + 0x0, 0x5b, 0xff, 0xff, 0xc8, 0x10, 0x0, 0x0, + 0xab, 0x70, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x2, 0xee, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x47, 0x77, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x89, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x73, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5f, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x85, 0x4, 0x77, 0x77, 0xef, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xee, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x9, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xee, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, + 0x0, 0x8, 0x70, 0x8, 0xfd, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0x0, 0x0, 0xef, 0xb0, 0xc, + 0xf6, 0x4, 0x77, 0x77, 0xef, 0xff, 0xf0, 0x0, + 0x2, 0xdf, 0x80, 0x3f, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x74, 0x1, 0xff, 0x10, 0xcf, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xf4, + 0x8, 0xf7, 0x7, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x5f, 0xc0, 0x3f, 0xa0, 0x4f, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x2, + 0xfb, 0x4, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5f, 0xc0, 0x3f, 0xa0, 0x5f, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xf4, 0x8, 0xf7, + 0x7, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x74, 0x2, 0xff, 0x10, 0xcf, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0xf0, 0x0, 0x2, 0xef, 0x80, 0x3f, + 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, + 0xef, 0xb0, 0xc, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf0, 0x0, 0x8, 0x70, 0x8, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0x20, 0x0, 0x0, + + /* U+F03E "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf6, 0x38, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x7f, 0xff, 0xff, 0xfb, 0xef, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xcf, 0xff, 0xff, + 0x90, 0x3e, 0xff, 0xff, 0xff, 0xfa, 0x7c, 0xff, + 0xff, 0xf9, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0x90, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf9, 0x0, 0x6, 0x90, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xc8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x8c, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xa6, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xef, 0x91, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xbf, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xf9, 0x7, 0xcf, 0xff, 0xff, 0xf2, 0xc, + 0xff, 0xb3, 0x9, 0xff, 0xff, 0x80, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x15, 0x77, + 0x40, 0x0, 0x0, + + /* U+F048 "" */ + 0x47, 0x60, 0x0, 0x0, 0x0, 0x16, 0x1b, 0xff, + 0x10, 0x0, 0x0, 0x2d, 0xfb, 0xbf, 0xf1, 0x0, + 0x0, 0x2e, 0xff, 0xcb, 0xff, 0x10, 0x0, 0x3e, + 0xff, 0xfc, 0xbf, 0xf1, 0x0, 0x4f, 0xff, 0xff, + 0xcb, 0xff, 0x10, 0x5f, 0xff, 0xff, 0xfc, 0xbf, + 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xcb, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, + 0xff, 0x4e, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xf1, + 0x2d, 0xff, 0xff, 0xff, 0xcb, 0xff, 0x10, 0x1c, + 0xff, 0xff, 0xfc, 0xbf, 0xf1, 0x0, 0xc, 0xff, + 0xff, 0xcb, 0xff, 0x10, 0x0, 0xb, 0xff, 0xfc, + 0xbf, 0xf1, 0x0, 0x0, 0xa, 0xff, 0xca, 0xff, + 0x10, 0x0, 0x0, 0x8, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x6, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x6, 0x77, 0x77, 0x30, 0x0, 0x6, 0x77, 0x77, + 0x30, 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, + 0xf6, 0x6f, 0xff, 0xff, 0xc1, 0x0, 0x6f, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04D "" */ + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x30, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F051 "" */ + 0x5, 0x20, 0x0, 0x0, 0x0, 0x57, 0x66, 0xff, + 0x40, 0x0, 0x0, 0xc, 0xff, 0x8f, 0xff, 0x60, + 0x0, 0x0, 0xdf, 0xf8, 0xff, 0xff, 0x70, 0x0, + 0xd, 0xff, 0x8f, 0xff, 0xff, 0x80, 0x0, 0xdf, + 0xf8, 0xff, 0xff, 0xff, 0x90, 0xd, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xb0, 0xdf, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xcd, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0x40, 0xdf, 0xf8, 0xff, 0xff, 0xfe, + 0x30, 0xd, 0xff, 0x8f, 0xff, 0xfe, 0x20, 0x0, + 0xdf, 0xf8, 0xff, 0xfd, 0x20, 0x0, 0xd, 0xff, + 0x7f, 0xfd, 0x10, 0x0, 0x0, 0xdf, 0xf3, 0xfb, + 0x10, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x40, 0x0, 0x0, 0x5f, 0xff, 0xe2, 0x0, 0x0, + 0x5f, 0xff, 0xe2, 0x0, 0x0, 0x5f, 0xff, 0xe3, + 0x0, 0x0, 0x5f, 0xff, 0xe3, 0x0, 0x0, 0x5f, + 0xff, 0xe3, 0x0, 0x0, 0x5f, 0xff, 0xe3, 0x0, + 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, + 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x2, 0x55, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x37, + 0x77, 0x77, 0x8f, 0xff, 0xc7, 0x77, 0x77, 0x60, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x14, 0x44, 0x44, 0x5f, 0xff, + 0xb4, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x49, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x2, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x10, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xec, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xef, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x92, 0x0, 0x5, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x2, + 0x52, 0x1, 0xcf, 0xff, 0xb0, 0x0, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x7f, 0xf9, 0x1, 0xef, 0xff, + 0xb0, 0x1, 0xef, 0xff, 0xf0, 0x0, 0x8, 0xff, + 0xf7, 0x8, 0xff, 0xff, 0x80, 0xaf, 0xff, 0xfb, + 0x2, 0x25, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xa0, 0x7f, 0xff, 0xff, 0xff, + 0x2, 0xff, 0xff, 0xf7, 0x9f, 0xff, 0xfb, 0x5, + 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0x21, + 0xef, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xf5, 0x7, + 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0x80, 0x1a, + 0xff, 0xe5, 0x1, 0xef, 0xff, 0xb0, 0x0, 0x4, + 0xff, 0xff, 0x50, 0x0, 0x10, 0x1, 0xcf, 0xff, + 0xb0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0x92, 0x0, + 0x5, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xef, 0xff, 0xfc, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xef, 0xec, + 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x4, 0x8c, 0xef, 0xed, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0xef, 0xff, 0xfe, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xc4, 0x0, + 0x4, 0xcf, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x60, 0x3, 0x10, 0x9, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x4f, 0xfa, 0x0, 0xcf, 0xff, 0xe1, 0x0, + 0x0, 0xb, 0xb0, 0x0, 0x4e, 0xff, 0xef, 0xff, + 0xa0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xfd, + 0x30, 0x1, 0xcf, 0xff, 0xff, 0xf1, 0xf, 0xff, + 0xff, 0x50, 0x0, 0xbf, 0xff, 0xf6, 0x0, 0x8, + 0xff, 0xff, 0xf3, 0xe, 0xff, 0xff, 0xa0, 0x0, + 0x6f, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, + 0x40, 0x0, 0x2, 0xdf, 0xfe, 0x8f, 0xff, 0xfa, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xc4, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xfe, 0xe3, + 0x0, 0x1b, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9d, 0xef, 0xec, 0x20, 0x0, 0x8f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x60, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xa2, 0x24, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xa0, 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x3, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xc0, 0x4, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd0, 0x5, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xf9, 0x9c, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf5, 0x2b, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x90, 0x1, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x1, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x40, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf7, 0x22, 0x23, 0xdf, 0xf8, + 0x9, 0xff, 0xf7, 0x2f, 0xff, 0x80, 0x0, 0x0, + 0x2e, 0xb0, 0x7f, 0xff, 0x90, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x3, 0x6, 0xff, 0xfa, 0x0, 0x7, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfd, 0x3, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xe1, 0x3f, 0x90, 0xf, 0xf8, 0x0, + 0x22, 0x23, 0xdf, 0xfe, 0x22, 0xef, 0xf7, 0x2f, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0x50, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xae, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf9, 0x2, 0xef, 0xff, 0x50, 0x0, 0x0, 0xcf, + 0xff, 0x90, 0x0, 0x2e, 0xff, 0xf5, 0x0, 0xc, + 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, + 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf2, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xe1, 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0x20, + + /* U+F078 "" */ + 0x6, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x20, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xe1, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xf2, 0xb, 0xff, 0xf9, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x50, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x3e, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x3, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xae, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x9c, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xd1, 0x0, 0x58, 0x88, 0x88, 0x88, 0x88, 0x81, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x20, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xe2, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x8f, 0xfc, 0xff, 0xcf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, 0x0, + 0x0, 0x7f, 0xc2, 0xff, 0x67, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x3, 0x1, + 0xff, 0x60, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x3, 0xd7, 0x1f, 0xf6, + 0x3d, 0x70, 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x7f, 0xf9, 0xef, 0xf0, 0x0, + 0x1, 0xff, 0xb8, 0x88, 0x88, 0x88, 0x32, 0xef, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x2e, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x2, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + + /* U+F07B "" */ + 0x5e, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb8, 0x88, 0x88, 0x88, 0x60, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x11, 0x1b, 0xff, 0xff, 0x51, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0x2b, + 0xff, 0xff, 0x42, 0xaa, 0xaa, 0xa7, 0xff, 0xff, + 0xff, 0x82, 0x67, 0x76, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x77, 0x77, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xef, 0xff, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x29, 0xff, 0x70, 0x0, 0x3e, 0xff, + 0xff, 0x30, 0x0, 0x4, 0xbf, 0xff, 0xff, 0x40, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x57, 0x64, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x25, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x4, + 0xaa, 0x50, 0x7f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xef, 0xd3, 0x7f, 0xf6, 0x0, + 0x8, 0xff, 0xff, 0xb0, 0xff, 0x80, 0xf, 0xf7, + 0x0, 0x8f, 0xff, 0xfb, 0x0, 0xdf, 0xe7, 0xaf, + 0xf5, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x5f, 0xff, + 0xff, 0xfd, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x9f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfb, + 0x6f, 0xff, 0xfd, 0x10, 0x0, 0xef, 0xd3, 0x7f, + 0xf5, 0x5, 0xff, 0xff, 0xd1, 0x0, 0xff, 0x80, + 0xf, 0xf7, 0x0, 0x5f, 0xff, 0xfd, 0x10, 0xdf, + 0xe7, 0xaf, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xd1, + 0x5f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, + 0xf4, 0x5, 0xef, 0xfb, 0x10, 0x0, 0x0, 0x1, + 0x66, 0x20, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0x50, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x81, + 0xfb, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x81, 0xff, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x81, 0xff, 0xf8, 0x8c, 0xc9, 0xf, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xfc, 0xf, + 0xff, 0xff, 0xff, 0xd5, 0x44, 0x43, 0xff, 0xfc, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xfc, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xfe, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x58, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x10, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x6, 0x77, 0x77, 0x77, 0x77, 0x77, 0x60, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xfc, 0x10, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xc0, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, 0xef, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xe4, 0x2, + 0xcf, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xfc, 0x8a, 0xff, 0xff, 0xff, 0xf4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0E0 "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0xe3, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x3e, 0xff, 0x70, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x7, 0xff, 0xff, 0xfb, + 0x13, 0xdf, 0xff, 0xff, 0xfd, 0x31, 0xbf, 0xff, + 0xff, 0xff, 0xe4, 0xa, 0xff, 0xff, 0xa0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x5d, 0xd5, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F0E7 "" */ + 0x0, 0x14, 0x44, 0x44, 0x41, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x40, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x6, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x44, 0xbf, 0xfe, 0x44, 0x43, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x4f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x3f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xa8, 0x88, 0x88, 0x20, 0x0, 0x0, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xcf, 0xff, 0xff, 0x51, 0xe2, 0x0, + 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, 0x51, 0xfe, + 0x20, 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, 0x51, + 0xff, 0xe2, 0xff, 0xff, 0xf0, 0xef, 0xff, 0xff, + 0x50, 0xbb, 0xb7, 0xff, 0xff, 0xf0, 0xef, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xcf, 0xff, 0xf0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x75, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xc8, 0x8f, 0xa8, 0xaf, 0x88, 0xbf, 0x88, 0xfb, + 0x88, 0xff, 0x8f, 0xf8, 0x0, 0xf4, 0x4, 0xf0, + 0x5, 0xe0, 0xe, 0x50, 0xf, 0xf8, 0xff, 0x80, + 0xf, 0x40, 0x4f, 0x0, 0x6f, 0x0, 0xf6, 0x0, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x94, + 0x6f, 0x64, 0x8f, 0x44, 0xbb, 0x44, 0xff, 0xff, + 0x8f, 0xff, 0xf6, 0x2, 0xf2, 0x5, 0xf0, 0x8, + 0x80, 0xe, 0xff, 0xf8, 0xff, 0xff, 0x94, 0x6f, + 0x64, 0x8f, 0x44, 0xbb, 0x44, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0x80, 0xf, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xf6, 0x0, 0xff, 0x8f, 0xf8, + 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0x50, + 0xf, 0xf8, 0xff, 0xc8, 0x8f, 0xa8, 0x88, 0x88, + 0x88, 0x88, 0xfb, 0x88, 0xff, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x18, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x2, 0xac, 0xcc, 0xcc, 0xcd, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x24, 0x44, 0x44, 0x44, 0x30, 0x30, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0x60, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xff, 0x60, 0xf, 0xff, + 0xff, 0xff, 0xfc, 0xf, 0xff, 0x60, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xfc, 0xb, 0xbb, 0xbb, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x43, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xff, 0xff, 0xff, 0xfc, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x72, 0x0, + 0x0, 0x2, 0x7b, 0xff, 0xff, 0xf8, 0xa, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xfa, 0xbf, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xb0, + 0xba, 0x10, 0x0, 0x5, 0x9d, 0xef, 0xed, 0x95, + 0x0, 0x0, 0x1a, 0xb0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xb1, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x9d, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5b, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0x84, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F241 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F242 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F243 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x81, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x81, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x81, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F244 "" */ + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8e, + 0xfd, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfb, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0x70, 0xa, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x32, 0x0, 0x0, 0x9e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0x90, 0x1, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x30, 0x0, 0xcf, 0xff, 0xf6, 0x3c, 0xf3, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x5f, 0xf9, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xf6, + 0x33, 0x34, 0xed, 0x33, 0x33, 0x33, 0x33, 0x5f, + 0xfa, 0x10, 0x2d, 0xff, 0x90, 0x0, 0x0, 0x5f, + 0x30, 0x0, 0x0, 0x0, 0x1c, 0x30, 0x0, 0x0, + 0x32, 0x0, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf3, 0xa, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, + 0xae, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xbe, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x20, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x34, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfa, 0xff, 0xff, 0xb0, 0x0, + 0x4, 0xff, 0xff, 0xf1, 0x9f, 0xff, 0xf8, 0x0, + 0xd, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, 0x10, + 0x3f, 0xff, 0xff, 0xf1, 0x0, 0xbf, 0xff, 0x60, + 0x7f, 0xfd, 0x8f, 0xf1, 0x66, 0xc, 0xff, 0xa0, + 0xaf, 0xf8, 0x7, 0xf1, 0x6f, 0x13, 0xff, 0xd0, + 0xcf, 0xff, 0x70, 0x71, 0x53, 0x1e, 0xff, 0xf0, + 0xdf, 0xff, 0xf7, 0x0, 0x1, 0xdf, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0x60, 0xc, 0xff, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xf3, 0x0, 0x10, 0x8f, 0xff, 0xf0, + 0xcf, 0xff, 0x30, 0xb1, 0x67, 0x9, 0xff, 0xf0, + 0x9f, 0xf6, 0xb, 0xf2, 0x6e, 0x2, 0xff, 0xd0, + 0x6f, 0xff, 0xcf, 0xf2, 0x52, 0x2e, 0xff, 0xa0, + 0x1f, 0xff, 0xff, 0xf2, 0x2, 0xef, 0xff, 0x50, + 0x9, 0xff, 0xff, 0xf2, 0x2e, 0xff, 0xfe, 0x0, + 0x0, 0xdf, 0xff, 0xf4, 0xef, 0xff, 0xf5, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x27, 0xab, 0xb9, 0x50, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x2, 0xab, 0xbb, 0xb7, 0x0, 0x0, + 0x0, 0x57, 0x77, 0x7c, 0xff, 0xff, 0xff, 0x77, + 0x77, 0x72, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x20, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xc, 0xff, 0x77, 0xff, 0x3b, 0xfe, 0x1e, 0xff, + 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, + 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, + 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, 0x2a, + 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, 0xff, + 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, 0x66, + 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, 0xff, + 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, 0xc, + 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, 0x40, + 0xc, 0xff, 0x66, 0xff, 0x2a, 0xfe, 0xe, 0xff, + 0x40, 0xc, 0xff, 0x77, 0xff, 0x3b, 0xfe, 0x1e, + 0xff, 0x40, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x57, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x90, 0x8f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xb0, 0x8f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xb0, 0x8f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xb0, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x75, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x85, 0xff, 0xff, 0x58, 0xff, + 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, + 0x4, 0xff, 0x40, 0xb, 0xff, 0xff, 0xf0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x4, 0x40, 0x4, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0xef, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4, + 0x40, 0x4, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xb0, 0x4, 0xff, 0x40, 0xb, 0xff, + 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x85, + 0xff, 0xff, 0x58, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x28, 0x88, 0x88, 0x88, 0x73, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1d, + 0xf6, 0xe, 0x50, 0xd6, 0x8, 0xff, 0x1d, 0xff, + 0x60, 0xe5, 0xd, 0x60, 0x8f, 0xfc, 0xff, 0xf6, + 0xe, 0x50, 0xd6, 0x8, 0xff, 0xff, 0xff, 0x60, + 0xe5, 0xd, 0x60, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xab, + 0xbb, 0xbb, 0xbb, 0xbb, 0xa6, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x0, 0xa, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x10, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1d, + 0xff, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, + 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9f, + 0xff, 0xf9, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x40, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 86, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 86, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21, .adv_w = 125, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 39, .adv_w = 225, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 137, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 257, .adv_w = 270, .box_w = 17, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 376, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 481, .adv_w = 67, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 487, .adv_w = 108, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 544, .adv_w = 108, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 592, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 624, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 674, .adv_w = 73, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 686, .adv_w = 123, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 692, .adv_w = 73, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 698, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 788, .adv_w = 213, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 879, .adv_w = 118, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 921, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 998, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1075, .adv_w = 214, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1173, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1250, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1334, .adv_w = 191, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1418, .adv_w = 206, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1502, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1586, .adv_w = 73, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1608, .adv_w = 73, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1636, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1686, .adv_w = 186, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 1721, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1771, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1848, .adv_w = 331, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 2028, .adv_w = 234, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2140, .adv_w = 242, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2231, .adv_w = 231, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2329, .adv_w = 264, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2427, .adv_w = 214, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2504, .adv_w = 203, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2574, .adv_w = 247, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2672, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2763, .adv_w = 99, .box_w = 3, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2784, .adv_w = 164, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2854, .adv_w = 230, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2945, .adv_w = 190, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3015, .adv_w = 306, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3120, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3211, .adv_w = 269, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3323, .adv_w = 231, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3407, .adv_w = 269, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3552, .adv_w = 233, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3636, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3720, .adv_w = 188, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3804, .adv_w = 253, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3895, .adv_w = 228, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4007, .adv_w = 360, .box_w = 22, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4161, .adv_w = 215, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4259, .adv_w = 207, .box_w = 15, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4364, .adv_w = 210, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4455, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 4503, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4593, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 4641, .adv_w = 187, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4686, .adv_w = 160, .box_w = 10, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4701, .adv_w = 192, .box_w = 6, .box_h = 3, .ofs_x = 2, .ofs_y = 12}, + {.bitmap_index = 4710, .adv_w = 191, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4765, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4855, .adv_w = 183, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4916, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5006, .adv_w = 196, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5072, .adv_w = 113, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5132, .adv_w = 221, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5222, .adv_w = 218, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5305, .adv_w = 89, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5335, .adv_w = 91, .box_w = 7, .box_h = 19, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 5402, .adv_w = 197, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5492, .adv_w = 89, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5515, .adv_w = 338, .box_w = 19, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5620, .adv_w = 218, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5681, .adv_w = 203, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5747, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5837, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5927, .adv_w = 131, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5966, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6021, .adv_w = 132, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6077, .adv_w = 217, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6138, .adv_w = 179, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6210, .adv_w = 288, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6309, .adv_w = 177, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6370, .adv_w = 179, .box_w = 13, .box_h = 15, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 6468, .adv_w = 167, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6523, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6580, .adv_w = 96, .box_w = 2, .box_h = 19, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 6599, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 6656, .adv_w = 186, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 6676, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 6708, .adv_w = 100, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 6716, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6926, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7076, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7266, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7416, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7521, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7731, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7941, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8160, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8370, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8543, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8753, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8833, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8953, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9172, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9322, .adv_w = 220, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9469, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 9593, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9782, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9953, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10124, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 10248, .adv_w = 280, .box_w = 19, .box_h = 19, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 10429, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10534, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10639, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10810, .adv_w = 280, .box_w = 18, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 10855, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11028, .adv_w = 400, .box_w = 26, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11301, .adv_w = 360, .box_w = 24, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 11553, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11743, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 11842, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 11941, .adv_w = 400, .box_w = 26, .box_h = 16, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12149, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12299, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12509, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12730, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12901, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13090, .adv_w = 280, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13261, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13414, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13564, .adv_w = 200, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 13711, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13900, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14089, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14262, .adv_w = 320, .box_w = 22, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 14493, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14651, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14889, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15052, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15215, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15378, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15541, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15704, .adv_w = 400, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15925, .adv_w = 280, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 16093, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16282, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 16503, .adv_w = 400, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16691, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16849, .adv_w = 322, .box_w = 21, .box_h = 13, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 14, 0, 9, -7, 0, 0, + 0, 0, -18, -19, 2, 15, 7, 5, + -13, 2, 16, 1, 13, 3, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 3, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, -10, 0, 0, 0, 0, + 0, -6, 5, 6, 0, 0, -3, 0, + -2, 3, 0, -3, 0, -3, -2, -6, + 0, 0, 0, 0, -3, 0, 0, -4, + -5, 0, 0, -3, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + -3, 0, -5, 0, -9, 0, -39, 0, + 0, -6, 0, 6, 10, 0, 0, -6, + 3, 3, 11, 6, -5, 6, 0, 0, + -18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -9, -4, -16, 0, -13, + -2, 0, 0, 0, 0, 1, 12, 0, + -10, -3, -1, 1, 0, -5, 0, 0, + -2, -24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, -3, 12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, + 0, 3, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 6, 3, 10, -3, 0, 0, 6, -3, + -11, -44, 2, 9, 6, 1, -4, 0, + 12, 0, 10, 0, 10, 0, -30, 0, + -4, 10, 0, 11, -3, 6, 3, 0, + 0, 1, -3, 0, 0, -5, 26, 0, + 26, 0, 10, 0, 13, 4, 5, 10, + 0, 0, 0, -12, 0, 0, 0, 0, + 1, -2, 0, 2, -6, -4, -6, 2, + 0, -3, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -18, 0, -20, 0, 0, 0, + 0, -2, 0, 32, -4, -4, 3, 3, + -3, 0, -4, 3, 0, 0, -17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -31, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -20, 0, 19, 0, 0, -12, 0, + 11, 0, -22, -31, -22, -6, 10, 0, + 0, -21, 0, 4, -7, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 10, -39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -4, -6, 0, -1, + -1, -3, 0, 0, -2, 0, 0, 0, + -6, 0, -3, 0, -7, -6, 0, -8, + -11, -11, -6, 0, -6, 0, -6, 0, + 0, 0, 0, -3, 0, 0, 3, 0, + 2, -3, 0, 1, 0, 0, 0, 3, + -2, 0, 0, 0, -2, 3, 3, -1, + 0, 0, 0, -6, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 4, -2, 0, + -4, 0, -5, 0, 0, -2, 0, 10, + 0, 0, -3, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -3, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -3, -4, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -3, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -4, 0, -5, 0, -10, + -2, -10, 6, 0, 0, -6, 3, 6, + 9, 0, -8, -1, -4, 0, -1, -15, + 3, -2, 2, -17, 3, 0, 0, 1, + -17, 0, -17, -3, -28, -2, 0, -16, + 0, 6, 9, 0, 4, 0, 0, 0, + 0, 1, 0, -6, -4, 0, -10, 0, + 0, 0, -3, 0, 0, 0, -3, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -4, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, -2, -4, -3, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, -2, 0, -6, 3, 0, 0, -4, + 2, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -4, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -4, -5, 0, + -6, 0, 10, -2, 1, -10, 0, 0, + 9, -16, -17, -13, -6, 3, 0, -3, + -21, -6, 0, -6, 0, -6, 5, -6, + -20, 0, -9, 0, 0, 2, -1, 3, + -2, 0, 3, 0, -10, -12, 0, -16, + -8, -7, -8, -10, -4, -9, -1, -6, + -9, 2, 0, 1, 0, -3, 0, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -2, 0, -1, -3, 0, -5, -7, + -7, -1, 0, -10, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -6, 0, 0, 0, 0, -16, -10, 0, + 0, 0, -5, -16, 0, 0, -3, 3, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, -6, 0, + 0, 0, 0, 4, 0, 2, -6, -6, + 0, -3, -3, -4, 0, 0, 0, 0, + 0, 0, -10, 0, -3, 0, -5, -3, + 0, -7, -8, -10, -3, 0, -6, 0, + -10, 0, 0, 0, 0, 26, 0, 0, + 2, 0, 0, -4, 0, 3, 0, -14, + 0, 0, 0, 0, 0, -30, -6, 11, + 10, -3, -13, 0, 3, -5, 0, -16, + -2, -4, 3, -22, -3, 4, 0, 5, + -11, -5, -12, -11, -13, 0, 0, -19, + 0, 18, 0, 0, -2, 0, 0, 0, + -2, -2, -3, -9, -11, -1, -30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, -2, -3, -5, 0, 0, + -6, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -6, 0, 0, 6, + -1, 4, 0, -7, 3, -2, -1, -8, + -3, 0, -4, -3, -2, 0, -5, -5, + 0, 0, -3, -1, -2, -5, -4, 0, + 0, -3, 0, 3, -2, 0, -7, 0, + 0, 0, -6, 0, -5, 0, -5, -5, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 3, 0, -4, 0, -2, -4, + -10, -2, -2, -2, -1, -2, -4, -1, + 0, 0, 0, 0, 0, -3, -3, -3, + 0, 0, 0, 0, 4, -2, 0, -2, + 0, 0, 0, -2, -4, -2, -3, -4, + -3, 0, 3, 13, -1, 0, -9, 0, + -2, 6, 0, -3, -13, -4, 5, 0, + 0, -15, -5, 3, -5, 2, 0, -2, + -3, -10, 0, -5, 2, 0, 0, -5, + 0, 0, 0, 3, 3, -6, -6, 0, + -5, -3, -5, -3, -3, 0, -5, 2, + -6, -5, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -4, + 0, 0, -3, -3, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -5, 0, -6, 0, 0, 0, -11, 0, + 2, -7, 6, 1, -2, -15, 0, 0, + -7, -3, 0, -13, -8, -9, 0, 0, + -14, -3, -13, -12, -15, 0, -8, 0, + 3, 21, -4, 0, -7, -3, -1, -3, + -5, -9, -6, -12, -13, -7, -3, 0, + 0, -2, 0, 1, 0, 0, -22, -3, + 10, 7, -7, -12, 0, 1, -10, 0, + -16, -2, -3, 6, -29, -4, 1, 0, + 0, -21, -4, -17, -3, -23, 0, 0, + -22, 0, 19, 1, 0, -2, 0, 0, + 0, 0, -2, -2, -12, -2, 0, -21, + 0, 0, 0, 0, -10, 0, -3, 0, + -1, -9, -15, 0, 0, -2, -5, -10, + -3, 0, -2, 0, 0, 0, 0, -14, + -3, -11, -10, -3, -5, -8, -3, -5, + 0, -6, -3, -11, -5, 0, -4, -6, + -3, -6, 0, 2, 0, -2, -11, 0, + 6, 0, -6, 0, 0, 0, 0, 4, + 0, 2, -6, 13, 0, -3, -3, -4, + 0, 0, 0, 0, 0, 0, -10, 0, + -3, 0, -5, -3, 0, -7, -8, -10, + -3, 0, -6, 3, 13, 0, 0, 0, + 0, 26, 0, 0, 2, 0, 0, -4, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -6, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -3, -3, 0, 0, -6, + -3, 0, 0, -6, 0, 5, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 5, 6, 3, -3, 0, -10, + -5, 0, 10, -11, -10, -6, -6, 13, + 6, 3, -28, -2, 6, -3, 0, -3, + 4, -3, -11, 0, -3, 3, -4, -3, + -10, -3, 0, 0, 10, 6, 0, -9, + 0, -18, -4, 9, -4, -12, 1, -4, + -11, -11, -3, 13, 3, 0, -5, 0, + -9, 0, 3, 11, -7, -12, -13, -8, + 10, 0, 1, -23, -3, 3, -5, -2, + -7, 0, -7, -12, -5, -5, -3, 0, + 0, -7, -7, -3, 0, 10, 7, -3, + -18, 0, -18, -4, 0, -11, -19, -1, + -10, -5, -11, -9, 9, 0, 0, -4, + 0, -6, -3, 0, -3, -6, 0, 5, + -11, 3, 0, 0, -17, 0, -3, -7, + -5, -2, -10, -8, -11, -7, 0, -10, + -3, -7, -6, -10, -3, 0, 0, 1, + 15, -5, 0, -10, -3, 0, -3, -6, + -7, -9, -9, -12, -4, -6, 6, 0, + -5, 0, -16, -4, 2, 6, -10, -12, + -6, -11, 11, -3, 2, -30, -6, 6, + -7, -5, -12, 0, -10, -13, -4, -3, + -3, -3, -7, -10, -1, 0, 0, 10, + 9, -2, -21, 0, -19, -7, 8, -12, + -22, -6, -11, -13, -16, -11, 6, 0, + 0, 0, 0, -4, 0, 0, 3, -4, + 6, 2, -6, 6, 0, 0, -10, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 3, 10, 1, 0, -4, 0, 0, + 0, 0, -2, -2, -4, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 12, 0, 6, 1, 1, -4, + 0, 6, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -19, 0, -3, 5, 0, 10, + 0, 0, 32, 4, -6, -6, 3, 3, + -2, 1, -16, 0, 0, 15, -19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -22, 12, 45, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -6, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -9, 0, + 0, 1, 0, 0, 3, 41, -6, -3, + 10, 9, -9, 3, 0, 0, 3, 3, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -42, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -9, + 0, 0, 0, -9, 0, 0, 0, 0, + -7, -2, 0, 0, 0, -7, 0, -4, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -21, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -3, 0, 0, -6, 0, -5, 0, + -9, 0, 0, 0, -5, 3, -4, 0, + 0, -9, -3, -7, 0, 0, -9, 0, + -3, 0, -15, 0, -4, 0, 0, -26, + -6, -13, -4, -12, 0, 0, -21, 0, + -9, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -6, -3, -5, 0, 0, + 0, 0, -7, 0, -7, 4, -4, 6, + 0, -2, -7, -2, -5, -6, 0, -4, + -2, -2, 2, -9, -1, 0, 0, 0, + -28, -3, -4, 0, -7, 0, -2, -15, + -3, 0, 0, -2, -3, 0, 0, 0, + 0, 2, 0, -2, -5, -2, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 0, + 0, -7, 0, -2, 0, 0, 0, -6, + 3, 0, 0, 0, -9, -3, -6, 0, + 0, -9, 0, -3, 0, -15, 0, 0, + 0, 0, -31, 0, -6, -12, -16, 0, + 0, -21, 0, -2, -5, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -5, -2, + -5, 1, 0, 0, 5, -4, 0, 10, + 16, -3, -3, -10, 4, 16, 5, 7, + -9, 4, 13, 4, 9, 7, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 20, 15, -6, -3, 0, -3, + 26, 14, 26, 0, 0, 0, 3, 0, + 0, 12, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, -27, -4, -3, -13, + -16, 0, 0, -21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, -27, -4, -3, + -13, -16, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -7, 3, 0, -3, + 3, 6, 3, -10, 0, -1, -3, 3, + 0, 3, 0, 0, 0, 0, -8, 0, + -3, -2, -6, 0, -3, -13, 0, 20, + -3, 0, -7, -2, 0, -2, -5, 0, + -3, -9, -6, -4, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, -27, + -4, -3, -13, -16, 0, 0, -21, 0, + 0, 0, 0, 0, 0, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, -10, -4, -3, 10, -3, -3, + -13, 1, -2, 1, -2, -9, 1, 7, + 1, 3, 1, 3, -8, -13, -4, 0, + -12, -6, -9, -13, -12, 0, -5, -6, + -4, -4, -3, -2, -4, -2, 0, -2, + -1, 5, 0, 5, -2, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -3, -3, 0, 0, + -9, 0, -2, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, 0, 0, 0, -3, 0, 0, -5, + -3, 3, 0, -5, -6, -2, 0, -9, + -2, -7, -2, -4, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 10, 0, 0, -6, 0, + 0, 0, 0, -4, 0, -3, 0, 0, + -2, 0, 0, -2, 0, -7, 0, 0, + 13, -4, -11, -10, 2, 4, 4, -1, + -9, 2, 5, 2, 10, 2, 11, -2, + -9, 0, 0, -13, 0, 0, -10, -9, + 0, 0, -6, 0, -4, -5, 0, -5, + 0, -5, 0, -2, 5, 0, -3, -10, + -3, 12, 0, 0, -3, 0, -6, 0, + 0, 4, -7, 0, 3, -3, 3, 0, + 0, -11, 0, -2, -1, 0, -3, 4, + -3, 0, 0, 0, -13, -4, -7, 0, + -10, 0, 0, -15, 0, 12, -3, 0, + -6, 0, 2, 0, -3, 0, -3, -10, + 0, -3, 3, 0, 0, 0, 0, -2, + 0, 0, 3, -4, 1, 0, 0, -4, + -2, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, 0, 7, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -3, -3, 0, 0, 0, 6, 0, 7, + 0, 0, 0, 0, 0, -20, -18, 1, + 14, 10, 5, -13, 2, 13, 0, 12, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_20 = { +#else +lv_font_t lv_font_montserrat_20 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 22, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_20*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_22.c b/inc/lvgl/src/font/lv_font_montserrat_22.c new file mode 100644 index 0000000..3390743 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_22.c @@ -0,0 +1,3646 @@ +/******************************************************************************* + * Size: 22 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 22 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_22.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_22 + #define LV_FONT_MONTSERRAT_22 1 +#endif + +#if LV_FONT_MONTSERRAT_22 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x4f, 0xf2, 0x3f, 0xf2, 0x3f, 0xf1, 0x2f, 0xf1, + 0x1f, 0xf0, 0x1f, 0xf0, 0xf, 0xf0, 0xf, 0xe0, + 0xf, 0xd0, 0xf, 0xd0, 0xa, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xb0, 0x6f, 0xf5, 0x2d, 0xd1, + + /* U+0022 "\"" */ + 0x9f, 0x30, 0x9f, 0x39, 0xf3, 0x9, 0xf2, 0x8f, + 0x20, 0x9f, 0x28, 0xf2, 0x8, 0xf2, 0x8f, 0x10, + 0x8f, 0x17, 0xf1, 0x8, 0xf1, 0x0, 0x0, 0x0, + 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0xf, 0x90, 0x0, 0x4f, 0x40, 0x0, + 0x0, 0x1, 0xf7, 0x0, 0x6, 0xf2, 0x0, 0x0, + 0x0, 0x3f, 0x50, 0x0, 0x8f, 0x0, 0x0, 0x0, + 0x5, 0xf3, 0x0, 0xa, 0xe0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7a, 0xad, + 0xfa, 0xaa, 0xaf, 0xda, 0xa8, 0x0, 0x0, 0xbd, + 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xb0, + 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0xf9, 0x0, + 0x3, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0x70, 0x0, + 0x5f, 0x30, 0x0, 0x4a, 0xab, 0xfc, 0xaa, 0xac, + 0xfa, 0xaa, 0x16, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x6, 0xf2, 0x0, 0xb, 0xd0, + 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, 0xdb, 0x0, + 0x0, 0x0, 0xa, 0xe0, 0x0, 0xf, 0x90, 0x0, + 0x0, 0x0, 0xcc, 0x0, 0x1, 0xf7, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xca, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xfe, + 0xc7, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x3f, 0xf8, 0x1c, 0xa0, 0x4a, 0xa0, 0x9, + 0xfa, 0x0, 0xca, 0x0, 0x0, 0x0, 0xbf, 0x70, + 0xc, 0xa0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0xca, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x7d, 0xa0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x6, 0xbf, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0xcc, 0x9f, 0xff, 0x20, 0x0, 0x0, 0xc, + 0xa0, 0x1d, 0xf9, 0x0, 0x0, 0x0, 0xca, 0x0, + 0x7f, 0xb0, 0x42, 0x0, 0xc, 0xa0, 0x9, 0xfa, + 0xd, 0xf8, 0x20, 0xca, 0x17, 0xff, 0x40, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x28, 0xcf, + 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, 0xc, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x50, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x6d, 0xfd, 0x40, 0x0, 0x0, 0xa, 0xf1, + 0x0, 0x6, 0xf8, 0x5a, 0xf3, 0x0, 0x0, 0x4f, + 0x60, 0x0, 0xe, 0x90, 0x0, 0xcb, 0x0, 0x0, + 0xeb, 0x0, 0x0, 0x1f, 0x50, 0x0, 0x8e, 0x0, + 0x9, 0xf1, 0x0, 0x0, 0x2f, 0x40, 0x0, 0x7e, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0xf, 0x80, 0x0, + 0xbc, 0x0, 0xec, 0x0, 0x0, 0x0, 0x8, 0xf5, + 0x16, 0xf5, 0x9, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x80, 0x3f, 0x70, 0x9f, 0xfb, 0x20, + 0x0, 0x1, 0x31, 0x0, 0xdc, 0x9, 0xf6, 0x5d, + 0xd0, 0x0, 0x0, 0x0, 0x8, 0xf2, 0x1f, 0x60, + 0x2, 0xf6, 0x0, 0x0, 0x0, 0x3f, 0x70, 0x4f, + 0x10, 0x0, 0xd9, 0x0, 0x0, 0x0, 0xdc, 0x0, + 0x6f, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x8, 0xf2, + 0x0, 0x4f, 0x10, 0x0, 0xc9, 0x0, 0x0, 0x3f, + 0x80, 0x0, 0x1f, 0x50, 0x1, 0xf5, 0x0, 0x0, + 0xdd, 0x0, 0x0, 0x8, 0xe5, 0x3c, 0xd0, 0x0, + 0x8, 0xf3, 0x0, 0x0, 0x0, 0x8e, 0xfb, 0x10, + + /* U+0026 "&" */ + 0x0, 0x0, 0x4c, 0xee, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfa, 0xaf, 0xf5, 0x0, 0x0, 0x0, + 0xf, 0xf2, 0x0, 0x2f, 0xc0, 0x0, 0x0, 0x1, + 0xfe, 0x0, 0x0, 0xfd, 0x0, 0x0, 0x0, 0xf, + 0xf2, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, 0x8f, + 0xc1, 0x8f, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0xdf, + 0xa0, 0x0, 0x63, 0x0, 0x3f, 0xf4, 0x1, 0xdf, + 0xa0, 0xe, 0xe0, 0xb, 0xf6, 0x0, 0x1, 0xdf, + 0xa4, 0xf9, 0x0, 0xff, 0x10, 0x0, 0x1, 0xdf, + 0xff, 0x30, 0xe, 0xf4, 0x0, 0x0, 0x1, 0xef, + 0xd0, 0x0, 0x9f, 0xe3, 0x0, 0x2, 0xaf, 0xff, + 0xa0, 0x1, 0xcf, 0xfe, 0xce, 0xff, 0xc3, 0xdf, + 0x80, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x1, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x9f, 0x39, 0xf3, 0x8f, 0x28, 0xf2, 0x8f, 0x17, + 0xf1, 0x0, 0x0, + + /* U+0028 "(" */ + 0x0, 0x8f, 0x70, 0x1f, 0xf0, 0x8, 0xf8, 0x0, + 0xdf, 0x30, 0x2f, 0xe0, 0x6, 0xfa, 0x0, 0x8f, + 0x80, 0xb, 0xf5, 0x0, 0xcf, 0x40, 0xd, 0xf3, + 0x0, 0xef, 0x20, 0xd, 0xf3, 0x0, 0xcf, 0x40, + 0xb, 0xf5, 0x0, 0x8f, 0x70, 0x5, 0xfa, 0x0, + 0x2f, 0xe0, 0x0, 0xdf, 0x30, 0x7, 0xf8, 0x0, + 0x1f, 0xf0, 0x0, 0x8f, 0x70, + + /* U+0029 ")" */ + 0x1f, 0xe0, 0x0, 0x9, 0xf7, 0x0, 0x2, 0xfe, + 0x0, 0x0, 0xcf, 0x40, 0x0, 0x7f, 0x90, 0x0, + 0x4f, 0xc0, 0x0, 0x1f, 0xf0, 0x0, 0xe, 0xf2, + 0x0, 0xd, 0xf3, 0x0, 0xc, 0xf4, 0x0, 0xb, + 0xf5, 0x0, 0xc, 0xf4, 0x0, 0xd, 0xf3, 0x0, + 0xe, 0xf2, 0x0, 0x1f, 0xf0, 0x0, 0x3f, 0xc0, + 0x0, 0x7f, 0x90, 0x0, 0xcf, 0x40, 0x2, 0xfe, + 0x0, 0x9, 0xf7, 0x0, 0x1f, 0xe0, 0x0, + + /* U+002A "*" */ + 0x0, 0x4, 0xf0, 0x0, 0x0, 0x40, 0x4f, 0x0, + 0x50, 0x5f, 0xb6, 0xf4, 0xdf, 0x20, 0x4d, 0xff, + 0xfc, 0x30, 0x0, 0x8f, 0xff, 0x60, 0x4, 0xef, + 0xaf, 0xaf, 0xc2, 0x2a, 0x13, 0xf0, 0x3b, 0x0, + 0x0, 0x4f, 0x0, 0x0, 0x0, 0x1, 0x60, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x6d, 0x40, 0x0, 0x0, 0x0, 0x8, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x6c, 0xcc, + 0xef, 0xdc, 0xcc, 0x48, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x8f, 0x50, 0x0, 0x0, 0x0, + 0x8, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, + 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, + + /* U+002C "," */ + 0x3, 0xb, 0xfb, 0xdf, 0xe4, 0xfb, 0x3f, 0x67, + 0xf1, 0xbb, 0x0, + + /* U+002D "-" */ + 0xad, 0xdd, 0xdd, 0x2c, 0xff, 0xff, 0xf2, + + /* U+002E "." */ + 0x0, 0x9, 0xf9, 0xff, 0xe8, 0xf7, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x8, 0xf6, 0x0, 0x0, 0x0, + 0xd, 0xf1, 0x0, 0x0, 0x0, 0x3f, 0xb0, 0x0, + 0x0, 0x0, 0x9f, 0x50, 0x0, 0x0, 0x0, 0xef, + 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, 0x0, + 0x9, 0xf5, 0x0, 0x0, 0x0, 0xe, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0xaf, + 0x40, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0, 0x0, + 0x5, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xf3, 0x0, + 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0x5f, + 0x80, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, 0x0, + 0x1, 0xfd, 0x0, 0x0, 0x0, 0x6, 0xf8, 0x0, + 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, 0x1f, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0x0, + + /* U+0030 "0" */ + 0x0, 0x3, 0xae, 0xfd, 0x81, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, 0xff, 0x81, + 0x3, 0xbf, 0xf1, 0x0, 0xef, 0x60, 0x0, 0x0, + 0xbf, 0xa0, 0x5f, 0xd0, 0x0, 0x0, 0x3, 0xff, + 0x1a, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf5, 0xcf, + 0x50, 0x0, 0x0, 0x0, 0xaf, 0x7e, 0xf4, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x9f, 0x9c, 0xf5, 0x0, 0x0, 0x0, 0xa, + 0xf7, 0xaf, 0x80, 0x0, 0x0, 0x0, 0xdf, 0x55, + 0xfd, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0x1e, 0xf6, + 0x0, 0x0, 0xb, 0xfa, 0x0, 0x6f, 0xf7, 0x10, + 0x2b, 0xff, 0x10, 0x0, 0x8f, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x3a, 0xef, 0xd8, 0x10, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xfd, 0xcf, 0xff, 0xfd, 0x0, 0x5, + 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, + 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, + 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, + 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, + 0x5, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x5, 0xfd, + + /* U+0032 "2" */ + 0x0, 0x39, 0xdf, 0xfd, 0x81, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x6f, 0xe7, 0x20, 0x15, + 0xef, 0xc0, 0x6, 0x20, 0x0, 0x0, 0x4f, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, + + /* U+0033 "3" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1e, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x0, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x46, 0x8b, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, + 0x6, 0x0, 0x0, 0x0, 0x1e, 0xf6, 0x8f, 0xc5, + 0x10, 0x14, 0xcf, 0xe0, 0x6f, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x1, 0x7b, 0xef, 0xed, 0x81, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x30, 0x3, 0x63, 0x0, 0x0, 0x1, 0xef, 0x70, + 0x0, 0x8f, 0x80, 0x0, 0x0, 0xbf, 0xb0, 0x0, + 0x8, 0xf8, 0x0, 0x0, 0x7f, 0xe1, 0x0, 0x0, + 0x8f, 0x80, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x62, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, + + /* U+0035 "5" */ + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xec, + 0x82, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x14, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfc, + 0x7, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x4f, 0xe7, + 0x20, 0x3, 0xbf, 0xf3, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x5a, 0xdf, 0xfd, 0x92, 0x0, + + /* U+0036 "6" */ + 0x0, 0x1, 0x7c, 0xef, 0xdb, 0x60, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xd0, 0x3, 0xff, 0xb3, 0x0, + 0x4, 0x40, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, 0x6a, 0xcb, + 0x82, 0x0, 0xef, 0x6d, 0xff, 0xff, 0xff, 0x60, + 0xef, 0xff, 0x71, 0x2, 0xaf, 0xf4, 0xdf, 0xf4, + 0x0, 0x0, 0xa, 0xfb, 0xbf, 0xe0, 0x0, 0x0, + 0x4, 0xfe, 0x8f, 0xd0, 0x0, 0x0, 0x3, 0xfe, + 0x2f, 0xf2, 0x0, 0x0, 0x8, 0xfb, 0x9, 0xfd, + 0x40, 0x0, 0x6f, 0xf4, 0x0, 0xaf, 0xfe, 0xdf, + 0xff, 0x70, 0x0, 0x5, 0xbe, 0xfe, 0xa3, 0x0, + + /* U+0037 "7" */ + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5f, 0xc0, 0x0, + 0x0, 0x6, 0xfd, 0x5, 0xfc, 0x0, 0x0, 0x0, + 0xdf, 0x60, 0x4d, 0x90, 0x0, 0x0, 0x4f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf4, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x2, 0x9d, 0xff, 0xd9, 0x30, 0x0, 0x0, + 0x4f, 0xff, 0xee, 0xff, 0xf7, 0x0, 0x1, 0xff, + 0xa1, 0x0, 0x19, 0xff, 0x20, 0x5, 0xfe, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x7, 0xfc, 0x0, 0x0, + 0x0, 0x8f, 0x90, 0x4, 0xfe, 0x10, 0x0, 0x0, + 0xcf, 0x70, 0x0, 0xcf, 0xc4, 0x10, 0x3b, 0xfe, + 0x10, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x8f, 0xfe, 0xcc, 0xef, 0xfa, 0x0, 0x7, + 0xfe, 0x50, 0x0, 0x3, 0xdf, 0x90, 0xe, 0xf5, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0xf, 0xf3, 0x0, + 0x0, 0x0, 0xf, 0xf2, 0xe, 0xf7, 0x0, 0x0, + 0x0, 0x4f, 0xf0, 0x7, 0xff, 0x60, 0x0, 0x5, + 0xef, 0xa0, 0x0, 0xaf, 0xff, 0xed, 0xff, 0xfc, + 0x10, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x50, 0x0, + + /* U+0039 "9" */ + 0x0, 0x7, 0xcf, 0xfd, 0x91, 0x0, 0x0, 0x1c, + 0xff, 0xed, 0xff, 0xf4, 0x0, 0xb, 0xfd, 0x30, + 0x0, 0x8f, 0xf2, 0x2, 0xff, 0x20, 0x0, 0x0, + 0x9f, 0xb0, 0x5f, 0xd0, 0x0, 0x0, 0x3, 0xff, + 0x15, 0xfd, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x2f, + 0xf3, 0x0, 0x0, 0xb, 0xff, 0x60, 0xbf, 0xe6, + 0x10, 0x3a, 0xff, 0xf7, 0x1, 0xcf, 0xff, 0xff, + 0xf9, 0xbf, 0x70, 0x0, 0x5a, 0xcc, 0x94, 0xc, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xf6, 0x0, 0x7, 0x20, 0x1, + 0x6e, 0xfb, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x18, 0xce, 0xfd, 0xa4, 0x0, 0x0, + + /* U+003A ":" */ + 0x8f, 0x8f, 0xfe, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf9, 0xff, + 0xe8, 0xf7, + + /* U+003B ";" */ + 0x8f, 0x8f, 0xfe, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0xef, + 0xe7, 0xfc, 0x2f, 0x76, 0xf2, 0xac, 0x3, 0x20, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x17, 0x30, 0x0, 0x0, + 0x3, 0xaf, 0xf5, 0x0, 0x1, 0x7d, 0xff, 0xc6, + 0x0, 0x3a, 0xff, 0xe9, 0x20, 0x0, 0x7f, 0xfc, + 0x50, 0x0, 0x0, 0x8, 0xfe, 0x71, 0x0, 0x0, + 0x0, 0x18, 0xef, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x5, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x56, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xcc, 0xcc, 0xcc, 0xcc, + 0xc4, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x50, + + /* U+003E ">" */ + 0x56, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0x92, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x4a, 0xff, 0xe8, 0x20, 0x0, 0x0, + 0x1, 0x6d, 0xff, 0x40, 0x0, 0x0, 0x2, 0x8f, + 0xf5, 0x0, 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x29, + 0xef, 0xfa, 0x30, 0x0, 0x7f, 0xfd, 0x71, 0x0, + 0x0, 0x8, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x4a, 0xdf, 0xfd, 0x81, 0x0, 0xa, 0xff, + 0xfe, 0xff, 0xfe, 0x30, 0x8f, 0xe5, 0x0, 0x4, + 0xef, 0xc0, 0x6, 0x10, 0x0, 0x0, 0x5f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xf6, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xb, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xd9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xea, 0x87, + 0x8a, 0xef, 0xd4, 0x0, 0x0, 0x0, 0xa, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x4d, 0xf8, 0x0, 0x0, + 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf7, 0x0, 0x6, 0xf9, 0x0, 0x5, 0xcf, 0xfc, + 0x50, 0xfe, 0xa, 0xf3, 0x0, 0xec, 0x0, 0xa, + 0xff, 0xdc, 0xef, 0x9f, 0xe0, 0xe, 0xc0, 0x6f, + 0x40, 0x7, 0xfd, 0x20, 0x0, 0x8f, 0xfe, 0x0, + 0x6f, 0x2a, 0xf0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0xaf, 0xe0, 0x1, 0xf6, 0xdc, 0x0, 0x4f, 0xb0, + 0x0, 0x0, 0x3, 0xfe, 0x0, 0xe, 0x9e, 0xa0, + 0x6, 0xf9, 0x0, 0x0, 0x0, 0xf, 0xe0, 0x0, + 0xda, 0xea, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, + 0xfe, 0x0, 0xd, 0xad, 0xc0, 0x4, 0xfb, 0x0, + 0x0, 0x0, 0x3f, 0xe0, 0x0, 0xe9, 0xaf, 0x0, + 0xe, 0xf2, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x2f, + 0x65, 0xf5, 0x0, 0x7f, 0xd2, 0x0, 0x8, 0xff, + 0xf1, 0x9, 0xf1, 0xe, 0xd0, 0x0, 0xaf, 0xfc, + 0xce, 0xf9, 0x9f, 0xec, 0xf8, 0x0, 0x6f, 0x90, + 0x0, 0x5c, 0xff, 0xc5, 0x1, 0xbf, 0xe7, 0x0, + 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc4, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xfe, 0xa8, 0x89, 0xbf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xee, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x87, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x21, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfb, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf4, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0x0, 0xc, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x60, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, 0xef, + 0x40, 0x0, 0x0, 0x9, 0xff, 0xcc, 0xcc, 0xcc, + 0xef, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xb0, 0x0, + 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0xef, 0x40, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, 0x5, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0xc, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xe0, + + /* U+0042 "B" */ + 0xbf, 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, 0xbf, + 0xed, 0xdd, 0xdd, 0xff, 0xfa, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x7, 0xff, 0x50, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xbf, 0xa0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x8f, 0xb0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0xbf, 0x80, 0x0, 0x0, 0x7, 0xff, + 0x20, 0xbf, 0xed, 0xdd, 0xdd, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xbf, + 0x80, 0x0, 0x0, 0x14, 0xcf, 0xd0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xe, 0xf5, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xb, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xd, 0xf7, 0xbf, 0x80, 0x0, 0x0, 0x1, + 0x9f, 0xf2, 0xbf, 0xed, 0xdd, 0xdd, 0xef, 0xff, + 0x70, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x93, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x29, 0xdf, 0xfe, 0xa5, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0xcf, 0xfa, 0x41, 0x2, 0x6e, 0xfc, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x9, 0x20, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x92, 0x0, 0xc, 0xff, 0xa4, 0x10, 0x16, 0xef, + 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x3, 0x9d, 0xff, 0xea, 0x50, 0x0, + + /* U+0044 "D" */ + 0xbf, 0xff, 0xff, 0xfe, 0xd9, 0x30, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x38, 0xff, 0xe1, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xb0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x38, 0xff, 0xe1, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0xd9, 0x30, 0x0, 0x0, + + /* U+0045 "E" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfe, 0xee, 0xee, 0xee, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+0046 "F" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x29, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0xcf, 0xfa, 0x41, 0x1, 0x5c, 0xfe, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x8, 0x30, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x10, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x1c, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf1, 0x8f, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x12, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xf, 0xf1, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xff, 0x10, 0xc, 0xff, 0xa4, 0x10, 0x25, 0xcf, + 0xf1, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, + + /* U+0048 "H" */ + 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xf8, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xa, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, + + /* U+0049 "I" */ + 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, + 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, + 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, 0xbf, 0x8b, 0xf8, + + /* U+004A "J" */ + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x2f, 0xf0, 0x3, 0x50, 0x0, 0x5, 0xfe, 0x0, + 0xef, 0x70, 0x3, 0xef, 0x90, 0x8, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x4, 0xae, 0xfe, 0x91, 0x0, + + /* U+004B "K" */ + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, 0xd1, 0xbf, + 0x80, 0x0, 0x0, 0x8, 0xfe, 0x10, 0xbf, 0x80, + 0x0, 0x0, 0x7f, 0xe2, 0x0, 0xbf, 0x80, 0x0, + 0x6, 0xff, 0x30, 0x0, 0xbf, 0x80, 0x0, 0x5f, + 0xf4, 0x0, 0x0, 0xbf, 0x80, 0x4, 0xff, 0x50, + 0x0, 0x0, 0xbf, 0x80, 0x3f, 0xf7, 0x0, 0x0, + 0x0, 0xbf, 0x83, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xbf, 0xae, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb4, 0xff, 0x90, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x5f, 0xf6, 0x0, 0x0, 0xbf, 0xc0, 0x0, + 0x8, 0xff, 0x30, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0xbf, 0xe1, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xd, + 0xfc, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x1, 0xef, + 0x90, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x3f, 0xf6, + + /* U+004C "L" */ + 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+004D "M" */ + 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xab, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfa, 0xbf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xab, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfa, 0xbf, 0xef, 0xa0, 0x0, 0x0, 0x0, + 0xaf, 0xef, 0xab, 0xf7, 0xef, 0x30, 0x0, 0x0, + 0x3f, 0xd7, 0xfa, 0xbf, 0x65, 0xfc, 0x0, 0x0, + 0xc, 0xf5, 0x6f, 0xab, 0xf6, 0xc, 0xf6, 0x0, + 0x5, 0xfc, 0x6, 0xfa, 0xbf, 0x60, 0x3f, 0xe0, + 0x0, 0xef, 0x30, 0x6f, 0xbb, 0xf6, 0x0, 0xaf, + 0x80, 0x7f, 0x90, 0x6, 0xfb, 0xbf, 0x60, 0x1, + 0xff, 0x3f, 0xf1, 0x0, 0x6f, 0xbb, 0xf6, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x6, 0xfb, 0xbf, 0x60, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x6f, 0xbb, 0xf6, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x6, 0xfb, 0xbf, + 0x60, 0x0, 0x0, 0x10, 0x0, 0x0, 0x6f, 0xbb, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfb, + + /* U+004E "N" */ + 0xbf, 0x70, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, + 0xf4, 0x0, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xff, 0xc0, + 0x0, 0x0, 0xa, 0xf8, 0xbf, 0xbf, 0xf9, 0x0, + 0x0, 0xa, 0xf8, 0xbf, 0x86, 0xff, 0x50, 0x0, + 0xa, 0xf8, 0xbf, 0x80, 0x9f, 0xf2, 0x0, 0xa, + 0xf8, 0xbf, 0x80, 0xc, 0xfd, 0x0, 0xa, 0xf8, + 0xbf, 0x80, 0x2, 0xef, 0xb0, 0xa, 0xf8, 0xbf, + 0x80, 0x0, 0x4f, 0xf7, 0xa, 0xf8, 0xbf, 0x80, + 0x0, 0x8, 0xff, 0x4a, 0xf8, 0xbf, 0x80, 0x0, + 0x0, 0xbf, 0xeb, 0xf8, 0xbf, 0x80, 0x0, 0x0, + 0x1e, 0xff, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x3, + 0xff, 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x6f, + 0xf8, 0xbf, 0x80, 0x0, 0x0, 0x0, 0xa, 0xf8, + + /* U+004F "O" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0xbf, 0xfa, 0x41, 0x2, 0x7e, 0xff, + 0x40, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x1b, + 0xfe, 0x10, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfa, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf1, 0xcf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x4e, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf6, 0xef, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x6c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0x8f, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x12, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xa0, 0x8, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xbf, 0xe2, 0x0, 0xc, + 0xff, 0xa4, 0x10, 0x26, 0xef, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x0, + + /* U+0050 "P" */ + 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0x80, 0x0, + 0x1, 0x6e, 0xfd, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, + 0xab, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xfb, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0x9f, 0xab, 0xf8, 0x0, + 0x0, 0x0, 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x1, + 0x6e, 0xfd, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x41, 0x2, 0x7e, + 0xff, 0x40, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, + 0x1, 0xbf, 0xe1, 0x0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfa, 0x0, 0x8f, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0xcf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x40, 0xef, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x60, + 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x50, 0xcf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x40, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xfa, 0x0, 0xa, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xdf, 0xf9, + 0x30, 0x1, 0x6d, 0xff, 0x50, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xef, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe5, 0x0, 0x7, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xec, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xef, 0xd7, 0x0, + + /* U+0052 "R" */ + 0xbf, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0x80, 0x0, + 0x1, 0x6e, 0xfd, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x1e, 0xf6, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x9f, + 0xab, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xfb, 0xbf, + 0x80, 0x0, 0x0, 0x0, 0x9f, 0x9b, 0xf8, 0x0, + 0x0, 0x0, 0x1e, 0xf5, 0xbf, 0x80, 0x0, 0x1, + 0x5d, 0xfd, 0xb, 0xff, 0xee, 0xef, 0xff, 0xfd, + 0x20, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x5f, 0xe1, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0xbf, 0xa0, 0xb, 0xf8, 0x0, 0x0, + 0x1, 0xef, 0x50, 0xbf, 0x80, 0x0, 0x0, 0x6, + 0xfe, 0x1b, 0xf8, 0x0, 0x0, 0x0, 0xb, 0xfa, + + /* U+0053 "S" */ + 0x0, 0x2, 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x6, + 0xff, 0xff, 0xef, 0xff, 0xe0, 0x3, 0xff, 0x92, + 0x0, 0x4, 0xba, 0x0, 0x9f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xe7, 0x20, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xea, 0x50, 0x0, 0x0, 0x0, 0x6b, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x38, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfb, 0x4, 0x20, + 0x0, 0x0, 0x0, 0xaf, 0x90, 0xdf, 0x94, 0x0, + 0x1, 0x8f, 0xf3, 0x7, 0xff, 0xff, 0xef, 0xff, + 0xf7, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xa, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, + + /* U+0055 "U" */ + 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, + 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, + 0x0, 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, + 0x0, 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, + 0xf, 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, + 0xf3, 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, + 0xdf, 0x60, 0x0, 0x0, 0x0, 0xf, 0xf3, 0xcf, + 0x60, 0x0, 0x0, 0x0, 0xf, 0xf2, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x8f, 0xc0, 0x0, + 0x0, 0x0, 0x5f, 0xe0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0xdf, 0x80, 0xa, 0xff, 0x71, 0x0, 0x4d, + 0xfe, 0x10, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x5, 0xbe, 0xff, 0xc7, 0x10, 0x0, + + /* U+0056 "V" */ + 0xc, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x70, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xf1, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x9, + 0xfa, 0x0, 0x8, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x30, 0x0, 0x1f, 0xf4, 0x0, 0x0, 0x0, + 0x6f, 0xc0, 0x0, 0x0, 0xbf, 0xa0, 0x0, 0x0, + 0xd, 0xf5, 0x0, 0x0, 0x4, 0xff, 0x10, 0x0, + 0x4, 0xfe, 0x0, 0x0, 0x0, 0xd, 0xf8, 0x0, + 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xe0, + 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x50, 0x8, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xfc, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf3, 0x6f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x9d, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x2f, 0xf2, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, + 0x0, 0x0, 0x2, 0xfe, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8f, + 0x90, 0x7, 0xfc, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x40, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x2f, 0xf1, + 0x0, 0x0, 0xb, 0xfc, 0xf9, 0x0, 0x0, 0x2, + 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0xff, + 0x3f, 0xe0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x8, + 0xfb, 0x0, 0x0, 0x5f, 0xa0, 0xdf, 0x40, 0x0, + 0xc, 0xf4, 0x0, 0x0, 0x3f, 0xf1, 0x0, 0xb, + 0xf5, 0x8, 0xf9, 0x0, 0x2, 0xff, 0x0, 0x0, + 0x0, 0xef, 0x50, 0x1, 0xff, 0x0, 0x3f, 0xe0, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x8, 0xfa, 0x0, + 0x5f, 0xa0, 0x0, 0xdf, 0x30, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x3f, 0xf0, 0xb, 0xf5, 0x0, 0x8, + 0xf9, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x51, 0xff, 0x0, 0x0, 0x3f, 0xe0, 0x6f, 0xb0, + 0x0, 0x0, 0x0, 0x9, 0xfa, 0x6f, 0xa0, 0x0, + 0x0, 0xdf, 0x3c, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfb, 0xf5, 0x0, 0x0, 0x8, 0xfa, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, + + /* U+0058 "X" */ + 0x1e, 0xf7, 0x0, 0x0, 0x0, 0xa, 0xfc, 0x0, + 0x5f, 0xf3, 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, + 0x9f, 0xd0, 0x0, 0x1, 0xef, 0x50, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x3, + 0xff, 0x40, 0x6f, 0xe1, 0x0, 0x0, 0x0, 0x8, + 0xfe, 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xbf, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0xdf, + 0xa0, 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x2, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x7, 0xfe, + 0x10, 0x0, 0x1e, 0xf8, 0x0, 0x0, 0xc, 0xfb, + 0x0, 0xa, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xf7, + 0x5, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xf2, + + /* U+0059 "Y" */ + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, + 0x3, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0x70, + 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x1f, 0xf4, 0x0, 0x0, 0xe, 0xf4, 0x0, + 0x0, 0x7, 0xfd, 0x0, 0x0, 0x8f, 0xb0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x1, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x4f, 0xf1, 0xa, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfa, 0x4f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xef, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0xbf, 0xff, 0xeb, 0xfd, 0xcb, 0xbf, 0x60, 0xb, + 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, + 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, + 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, + 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, 0xf6, 0x0, + 0xbf, 0x60, 0xb, 0xf6, 0x0, 0xbf, 0x60, 0xb, + 0xfd, 0xcb, 0xbf, 0xff, 0xe0, + + /* U+005C "\\" */ + 0xaf, 0x40, 0x0, 0x0, 0x0, 0x5f, 0x90, 0x0, + 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0xa, + 0xf4, 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x50, 0x0, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x0, + 0x0, 0xe, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x60, + 0x0, 0x0, 0x0, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0xd, 0xf1, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, + 0x0, 0x0, 0x2, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x20, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, + 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x0, 0x0, 0xc, + 0xf2, + + /* U+005D "]" */ + 0x9f, 0xff, 0xf0, 0x7c, 0xcf, 0xf0, 0x0, 0x1f, + 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, + 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, + 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, + 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, + 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, + 0x0, 0x1f, 0xf0, 0x0, 0x1f, 0xf0, 0x0, 0x1f, + 0xf0, 0x7c, 0xcf, 0xf0, 0x9f, 0xff, 0xf0, + + /* U+005E "^" */ + 0x0, 0x0, 0x48, 0x30, 0x0, 0x0, 0x0, 0xd, + 0xfb, 0x0, 0x0, 0x0, 0x4, 0xfc, 0xf1, 0x0, + 0x0, 0x0, 0xae, 0x2f, 0x80, 0x0, 0x0, 0x1f, + 0x80, 0xbe, 0x0, 0x0, 0x8, 0xf2, 0x4, 0xf5, + 0x0, 0x0, 0xeb, 0x0, 0xe, 0xb0, 0x0, 0x5f, + 0x50, 0x0, 0x8f, 0x20, 0xb, 0xe0, 0x0, 0x1, + 0xf8, 0x2, 0xf8, 0x0, 0x0, 0xb, 0xe0, + + /* U+005F "_" */ + 0x11, 0x11, 0x11, 0x11, 0x11, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x40, + + /* U+0060 "`" */ + 0x1b, 0xfb, 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, + 0x6, 0xfb, 0x0, + + /* U+0061 "a" */ + 0x2, 0x8d, 0xff, 0xea, 0x20, 0x4, 0xff, 0xfe, + 0xef, 0xff, 0x30, 0x1d, 0x61, 0x0, 0x2c, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x30, 0x3a, 0xef, 0xff, 0xff, + 0xf3, 0x4f, 0xfc, 0x98, 0x88, 0xff, 0x3c, 0xf8, + 0x0, 0x0, 0xe, 0xf3, 0xef, 0x30, 0x0, 0x1, + 0xff, 0x3b, 0xf8, 0x0, 0x0, 0xbf, 0xf3, 0x3f, + 0xfc, 0x99, 0xef, 0xef, 0x30, 0x2a, 0xef, 0xea, + 0x2c, 0xf3, + + /* U+0062 "b" */ + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf1, 0x4b, 0xef, 0xd8, 0x10, 0x0, 0xff, + 0x9f, 0xff, 0xef, 0xfe, 0x40, 0xf, 0xff, 0xc3, + 0x0, 0x2b, 0xfe, 0x10, 0xff, 0xd0, 0x0, 0x0, + 0xc, 0xf9, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x5f, + 0xe0, 0xff, 0x20, 0x0, 0x0, 0x1, 0xff, 0xf, + 0xf2, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0xff, 0x50, + 0x0, 0x0, 0x5, 0xfe, 0xf, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0x80, 0xff, 0xfc, 0x30, 0x3, 0xcf, + 0xe1, 0xf, 0xf8, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xff, 0x4, 0xbe, 0xfd, 0x81, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x7c, 0xef, 0xd8, 0x0, 0x0, 0x3d, + 0xff, 0xfe, 0xff, 0xe2, 0x1, 0xef, 0xc3, 0x0, + 0x2b, 0xf8, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x50, + 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0x0, 0x0, 0x0, 0x50, 0x1, 0xef, + 0xc3, 0x0, 0x2c, 0xf9, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x7c, 0xef, 0xd7, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf0, 0x0, 0x18, 0xdf, 0xeb, 0x41, 0xff, 0x0, + 0x4e, 0xff, 0xef, 0xff, 0x9f, 0xf0, 0x1e, 0xfc, + 0x20, 0x3, 0xcf, 0xff, 0x9, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0xf0, 0xef, 0x50, 0x0, 0x0, 0x5, + 0xff, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xf0, + 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xe, 0xf4, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x9f, 0xc0, 0x0, + 0x0, 0xc, 0xff, 0x1, 0xef, 0xa1, 0x0, 0x1a, + 0xff, 0xf0, 0x4, 0xef, 0xfc, 0xdf, 0xf9, 0xff, + 0x0, 0x1, 0x8d, 0xff, 0xb5, 0xf, 0xf0, + + /* U+0065 "e" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x3, + 0xef, 0xfd, 0xef, 0xfa, 0x0, 0x1, 0xef, 0x90, + 0x0, 0x3d, 0xf8, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x2f, 0xf1, 0xe, 0xf2, 0x0, 0x0, 0x0, 0xaf, + 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf, + 0xf9, 0x88, 0x88, 0x88, 0x88, 0x40, 0xef, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfd, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x1e, 0xfc, 0x40, 0x1, 0x7f, + 0x50, 0x0, 0x3e, 0xff, 0xfe, 0xff, 0xf5, 0x0, + 0x0, 0x7, 0xce, 0xfd, 0x92, 0x0, + + /* U+0066 "f" */ + 0x0, 0x2, 0xbf, 0xfc, 0x30, 0x0, 0xef, 0xed, + 0xf3, 0x0, 0x7f, 0xc0, 0x2, 0x0, 0x9, 0xf6, + 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc0, 0x8c, 0xef, 0xdc, 0xc9, 0x0, + 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, + 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, + 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, + 0x60, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, + 0xbf, 0x60, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, + 0x0, 0xbf, 0x60, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x2, 0x8d, 0xfe, 0xc6, 0xd, 0xf2, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xbd, 0xf2, 0x3, 0xff, + 0xb2, 0x0, 0x19, 0xff, 0xf2, 0xa, 0xfa, 0x0, + 0x0, 0x0, 0x8f, 0xf2, 0xf, 0xf3, 0x0, 0x0, + 0x0, 0x1f, 0xf2, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0xe, 0xf2, 0xf, 0xf3, 0x0, 0x0, 0x0, 0x1f, + 0xf2, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x9f, 0xf2, + 0x3, 0xff, 0xa2, 0x0, 0x19, 0xff, 0xf2, 0x0, + 0x5f, 0xff, 0xee, 0xff, 0xaf, 0xf2, 0x0, 0x2, + 0x9d, 0xff, 0xc5, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xc0, 0x1, 0xec, 0x51, 0x0, 0x7, + 0xff, 0x60, 0x2, 0xdf, 0xff, 0xee, 0xff, 0xf9, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xea, 0x40, 0x0, + + /* U+0068 "h" */ + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, + 0xbe, 0xfd, 0x80, 0x0, 0xff, 0xbf, 0xff, 0xff, + 0xfd, 0x0, 0xff, 0xfa, 0x20, 0x6, 0xff, 0x80, + 0xff, 0xc0, 0x0, 0x0, 0x7f, 0xd0, 0xff, 0x50, + 0x0, 0x0, 0x2f, 0xf0, 0xff, 0x20, 0x0, 0x0, + 0xf, 0xf0, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, + 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + + /* U+0069 "i" */ + 0x1d, 0xe2, 0x5f, 0xf6, 0xa, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, + 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, + 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, 0xf, 0xf1, + 0xf, 0xf1, + + /* U+006A "j" */ + 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0x0, 0x9, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xe, 0xf3, + 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0xf, 0xf2, + 0x1, 0x0, 0x4f, 0xf0, 0xb, 0xfd, 0xff, 0x80, + 0x8, 0xef, 0xe8, 0x0, + + /* U+006B "k" */ + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x2, 0xef, 0x80, 0xff, 0x10, 0x0, 0x3e, + 0xf8, 0x0, 0xff, 0x10, 0x3, 0xff, 0x80, 0x0, + 0xff, 0x10, 0x4f, 0xf8, 0x0, 0x0, 0xff, 0x15, + 0xff, 0x90, 0x0, 0x0, 0xff, 0x7f, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xff, 0xbf, 0xf4, 0x0, 0x0, + 0xff, 0xf6, 0xa, 0xfe, 0x20, 0x0, 0xff, 0x60, + 0x0, 0xcf, 0xc0, 0x0, 0xff, 0x10, 0x0, 0x2e, + 0xf9, 0x0, 0xff, 0x10, 0x0, 0x4, 0xff, 0x50, + 0xff, 0x10, 0x0, 0x0, 0x7f, 0xf2, + + /* U+006C "l" */ + 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, + 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, + 0x1f, 0xf1, 0xff, 0x1f, 0xf1, 0xff, 0x1f, 0xf1, + 0xff, 0x10, + + /* U+006D "m" */ + 0xff, 0x6, 0xcf, 0xfc, 0x60, 0x3, 0xae, 0xfe, + 0xa2, 0x0, 0xff, 0xbf, 0xfd, 0xff, 0xfa, 0x6f, + 0xfe, 0xdf, 0xff, 0x30, 0xff, 0xf7, 0x0, 0x7, + 0xff, 0xfe, 0x30, 0x1, 0xcf, 0xd0, 0xff, 0xa0, + 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x2f, 0xf2, + 0xff, 0x40, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, + 0xd, 0xf5, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xc0, + 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, + 0xff, 0x10, 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, + 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, 0x6f, 0xb0, + 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, 0xff, 0x10, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0xc, 0xf5, + + /* U+006E "n" */ + 0xff, 0x6, 0xce, 0xfd, 0x80, 0x0, 0xff, 0xbf, + 0xfd, 0xef, 0xfd, 0x0, 0xff, 0xf8, 0x0, 0x4, + 0xef, 0x80, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xd0, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xf0, 0xff, 0x20, + 0x0, 0x0, 0xf, 0xf0, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, + 0x0, 0x0, 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xf1, 0xff, 0x10, 0x0, 0x0, 0xf, 0xf1, + + /* U+006F "o" */ + 0x0, 0x1, 0x7c, 0xff, 0xc7, 0x10, 0x0, 0x0, + 0x3e, 0xff, 0xef, 0xff, 0xd3, 0x0, 0x1, 0xef, + 0xb2, 0x0, 0x2b, 0xfe, 0x10, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0xcf, 0x80, 0xe, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0xf, 0xf1, 0x0, 0x0, 0x0, + 0x2f, 0xf0, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x2f, + 0xf0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xd0, + 0x8, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x1, + 0xef, 0xc3, 0x0, 0x3c, 0xfd, 0x10, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1, 0x7c, + 0xff, 0xc7, 0x0, 0x0, + + /* U+0070 "p" */ + 0xff, 0x5, 0xbe, 0xfd, 0x81, 0x0, 0xf, 0xfa, + 0xff, 0xdd, 0xff, 0xe4, 0x0, 0xff, 0xfb, 0x10, + 0x1, 0xaf, 0xe1, 0xf, 0xfc, 0x0, 0x0, 0x0, + 0xcf, 0x90, 0xff, 0x50, 0x0, 0x0, 0x4, 0xfe, + 0xf, 0xf2, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0xff, + 0x20, 0x0, 0x0, 0x1, 0xff, 0xf, 0xf5, 0x0, + 0x0, 0x0, 0x5f, 0xe0, 0xff, 0xd0, 0x0, 0x0, + 0xd, 0xf8, 0xf, 0xff, 0xc3, 0x0, 0x3c, 0xfe, + 0x10, 0xff, 0x9f, 0xff, 0xff, 0xfe, 0x30, 0xf, + 0xf1, 0x4b, 0xef, 0xd8, 0x10, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb4, 0xf, 0xf0, 0x4, + 0xef, 0xfe, 0xff, 0xf8, 0xff, 0x1, 0xef, 0xb2, + 0x0, 0x3c, 0xff, 0xf0, 0x9f, 0xc0, 0x0, 0x0, + 0xd, 0xff, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x5f, + 0xf0, 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xf, + 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xf0, 0xef, 0x50, + 0x0, 0x0, 0x5, 0xff, 0x9, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0xf0, 0x1e, 0xfc, 0x30, 0x3, 0xcf, + 0xff, 0x0, 0x4e, 0xff, 0xff, 0xff, 0x9f, 0xf0, + 0x0, 0x18, 0xdf, 0xeb, 0x41, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + + /* U+0072 "r" */ + 0xff, 0x5, 0xbe, 0x4f, 0xf8, 0xff, 0xf4, 0xff, + 0xfc, 0x41, 0xf, 0xfd, 0x0, 0x0, 0xff, 0x50, + 0x0, 0xf, 0xf3, 0x0, 0x0, 0xff, 0x10, 0x0, + 0xf, 0xf1, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, + 0xf1, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, 0xf1, + 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x29, 0xdf, 0xfd, 0x93, 0x0, 0x5f, 0xff, + 0xde, 0xff, 0xc0, 0xe, 0xf8, 0x0, 0x1, 0x73, + 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xeb, 0x72, + 0x0, 0x0, 0x28, 0xcf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x2, 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x50, 0xd8, 0x20, 0x0, 0x4f, 0xf3, 0x4f, + 0xff, 0xfe, 0xff, 0xf9, 0x0, 0x28, 0xcf, 0xfd, + 0xb4, 0x0, + + /* U+0074 "t" */ + 0x0, 0x58, 0x30, 0x0, 0x0, 0xb, 0xf6, 0x0, + 0x0, 0x0, 0xbf, 0x60, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xc0, 0x8c, 0xef, 0xdc, 0xc9, 0x0, 0xb, + 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, + 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x0, + 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0x60, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x7f, + 0xc0, 0x2, 0x0, 0x1, 0xff, 0xfe, 0xf4, 0x0, + 0x2, 0xbe, 0xeb, 0x20, + + /* U+0075 "u" */ + 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, + 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, + 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, + 0x1f, 0xf0, 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, + 0x0, 0x0, 0x3, 0xfe, 0x1f, 0xf0, 0x0, 0x0, + 0x4, 0xfe, 0x1f, 0xf1, 0x0, 0x0, 0x6, 0xfe, + 0xe, 0xf5, 0x0, 0x0, 0xc, 0xfe, 0x9, 0xfe, + 0x30, 0x0, 0x9f, 0xfe, 0x1, 0xdf, 0xfe, 0xdf, + 0xfb, 0xfe, 0x0, 0x8, 0xdf, 0xfc, 0x52, 0xfe, + + /* U+0076 "v" */ + 0xd, 0xf5, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x6, + 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0xff, + 0x30, 0x0, 0x0, 0xdf, 0x40, 0x0, 0x8f, 0x90, + 0x0, 0x3, 0xfd, 0x0, 0x0, 0x2f, 0xf1, 0x0, + 0xa, 0xf6, 0x0, 0x0, 0xb, 0xf7, 0x0, 0x1f, + 0xe0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x0, 0xdf, 0x40, 0xef, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xb5, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfd, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x60, 0x0, 0x0, + + /* U+0077 "w" */ + 0xbf, 0x50, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, + 0x6, 0xf7, 0x5f, 0xa0, 0x0, 0x0, 0x8f, 0xf5, + 0x0, 0x0, 0xc, 0xf1, 0xf, 0xf0, 0x0, 0x0, + 0xdf, 0xfb, 0x0, 0x0, 0x2f, 0xb0, 0x9, 0xf6, + 0x0, 0x3, 0xfa, 0xdf, 0x10, 0x0, 0x8f, 0x50, + 0x3, 0xfb, 0x0, 0x9, 0xf4, 0x8f, 0x70, 0x0, + 0xdf, 0x0, 0x0, 0xef, 0x10, 0xf, 0xe0, 0x2f, + 0xc0, 0x3, 0xfa, 0x0, 0x0, 0x8f, 0x60, 0x5f, + 0x80, 0xc, 0xf2, 0x9, 0xf4, 0x0, 0x0, 0x2f, + 0xc0, 0xbf, 0x20, 0x6, 0xf8, 0xe, 0xe0, 0x0, + 0x0, 0xc, 0xf3, 0xfc, 0x0, 0x0, 0xfe, 0x5f, + 0x90, 0x0, 0x0, 0x7, 0xfe, 0xf6, 0x0, 0x0, + 0xaf, 0xdf, 0x30, 0x0, 0x0, 0x1, 0xff, 0xf1, + 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xa0, 0x0, 0x0, 0xe, 0xf7, 0x0, 0x0, + + /* U+0078 "x" */ + 0x2f, 0xf4, 0x0, 0x0, 0x2f, 0xf3, 0x5, 0xfe, + 0x10, 0x0, 0xcf, 0x70, 0x0, 0x9f, 0xb0, 0x9, + 0xfb, 0x0, 0x0, 0xd, 0xf7, 0x4f, 0xe1, 0x0, + 0x0, 0x2, 0xff, 0xef, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0x0, 0x0, 0x0, 0x5, 0xfe, 0xdf, 0x60, 0x0, + 0x0, 0x2f, 0xf4, 0x2f, 0xf3, 0x0, 0x0, 0xcf, + 0x80, 0x6, 0xfe, 0x10, 0x9, 0xfc, 0x0, 0x0, + 0xaf, 0xb0, 0x5f, 0xe1, 0x0, 0x0, 0xd, 0xf7, + + /* U+0079 "y" */ + 0xd, 0xf6, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x6, + 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0xef, + 0x40, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x7f, 0xb0, + 0x0, 0x4, 0xfc, 0x0, 0x0, 0x1f, 0xf2, 0x0, + 0xb, 0xf5, 0x0, 0x0, 0x9, 0xf9, 0x0, 0x2f, + 0xd0, 0x0, 0x0, 0x2, 0xff, 0x0, 0x9f, 0x70, + 0x0, 0x0, 0x0, 0xbf, 0x71, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xd7, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfc, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x2e, 0xf5, 0x0, + 0x0, 0x0, 0x4f, 0xfe, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x8, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0xcc, 0xcc, + 0xcc, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xf9, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + 0x5, 0xfe, 0x20, 0x0, 0x0, 0x2, 0xff, 0x40, + 0x0, 0x0, 0x1, 0xdf, 0x80, 0x0, 0x0, 0x0, + 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xd1, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0xe, + 0xfe, 0xcc, 0xcc, 0xcc, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xfa, + + /* U+007B "{" */ + 0x0, 0x9, 0xef, 0x40, 0x9, 0xff, 0xd3, 0x0, + 0xef, 0x60, 0x0, 0xf, 0xf2, 0x0, 0x0, 0xff, + 0x20, 0x0, 0xf, 0xf2, 0x0, 0x0, 0xff, 0x20, + 0x0, 0xf, 0xf2, 0x0, 0x1, 0xff, 0x10, 0x9, + 0xef, 0xb0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x3f, + 0xf0, 0x0, 0x0, 0xff, 0x10, 0x0, 0xf, 0xf2, + 0x0, 0x0, 0xff, 0x20, 0x0, 0xf, 0xf2, 0x0, + 0x0, 0xff, 0x20, 0x0, 0xf, 0xf2, 0x0, 0x0, + 0xdf, 0x60, 0x0, 0x8, 0xff, 0xd3, 0x0, 0x8, + 0xef, 0x40, + + /* U+007C "|" */ + 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, + 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, + 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, + 0xbf, 0x4b, 0xf4, 0xbf, 0x4b, 0xf4, 0xbf, 0x40, + + /* U+007D "}" */ + 0x9f, 0xd6, 0x0, 0x7, 0xef, 0xf4, 0x0, 0x0, + 0xaf, 0xa0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x6f, + 0xb0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x6f, 0xb0, + 0x0, 0x6, 0xfb, 0x0, 0x0, 0x5f, 0xd0, 0x0, + 0x1, 0xef, 0xd5, 0x0, 0xb, 0xff, 0x70, 0x4, + 0xfe, 0x10, 0x0, 0x5f, 0xb0, 0x0, 0x6, 0xfb, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x6, 0xfb, 0x0, + 0x0, 0x6f, 0xb0, 0x0, 0x6, 0xfb, 0x0, 0x0, + 0xaf, 0x90, 0x7, 0xef, 0xf3, 0x0, 0x9f, 0xd5, + 0x0, 0x0, + + /* U+007E "~" */ + 0x1, 0x89, 0x50, 0x0, 0x9, 0x51, 0xef, 0xff, + 0xa0, 0x2, 0xf5, 0x7f, 0x41, 0x8f, 0xd8, 0xdf, + 0x1a, 0xb0, 0x0, 0x3c, 0xfd, 0x40, + + /* U+00B0 "°" */ + 0x0, 0x4c, 0xfd, 0x60, 0x0, 0x4f, 0x83, 0x6f, + 0x80, 0xc, 0x80, 0x0, 0x5f, 0x0, 0xf4, 0x0, + 0x1, 0xf3, 0xd, 0x60, 0x0, 0x4f, 0x10, 0x7e, + 0x50, 0x3d, 0xa0, 0x0, 0x8f, 0xff, 0xa0, 0x0, + 0x0, 0x2, 0x10, 0x0, + + /* U+2022 "•" */ + 0x0, 0x0, 0x1, 0xcf, 0xb0, 0x7f, 0xff, 0x56, + 0xff, 0xf5, 0xb, 0xfa, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x1, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x94, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0x0, 0xa, 0xff, 0xea, 0x50, 0x0, 0x0, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, + 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x3, 0x54, 0xff, 0xd0, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xd0, 0x1, 0x69, 0x9d, 0xff, + 0x10, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0x61, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x2a, 0xff, 0xfc, 0x50, 0x1f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xcc, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x42, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x0, 0x24, 0xf8, 0x22, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x22, 0x8f, 0xff, 0xff, + 0xff, 0xb9, 0x99, 0x99, 0x99, 0x9b, 0xff, 0xff, + 0xff, 0xf9, 0x44, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x44, 0x9f, 0xf6, 0x0, 0xef, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf7, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, 0x66, 0xff, + 0x74, 0x44, 0x44, 0x44, 0x47, 0xff, 0x66, 0xaf, + 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x6f, 0xf6, 0x0, 0xef, 0xdc, 0xcc, + 0xcc, 0xcc, 0xcd, 0xfe, 0x0, 0x6f, 0xff, 0xee, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xee, + 0xff, 0xfc, 0x88, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x88, 0xcf, 0xf6, 0x0, 0xef, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf6, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0x0, 0x6f, 0xfe, 0xcc, 0xff, 0x41, 0x11, 0x11, + 0x11, 0x14, 0xff, 0xcc, 0xef, 0xfd, 0xaa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xdf, + 0xc6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x6c, + + /* U+F00B "" */ + 0xbf, 0xff, 0xfe, 0x31, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, + 0x88, 0x87, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x31, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x47, 0x88, 0x87, 0x0, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0x31, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x37, 0x77, 0x76, 0x0, 0x57, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x74, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0x30, 0x4, 0xe8, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x4f, 0xff, 0x80, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x30, 0x0, + 0xef, 0xff, 0xf8, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x2, + 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf8, 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x8, 0xc4, 0x0, 0x0, 0x0, 0x2, 0xc9, 0x0, + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x2e, 0xff, 0xb0, + 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, 0xf1, + 0x7f, 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0x90, + 0x8, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xfa, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x2, 0xef, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x0, + 0x2e, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x8f, 0xff, 0xe0, + 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x50, 0xe, 0xff, 0x80, + 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0xe, 0xff, 0x80, 0x4f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0xe0, 0xe, 0xff, 0x80, 0x5f, 0xff, + 0xf2, 0x0, 0x3, 0xff, 0xfe, 0x30, 0xe, 0xff, + 0x80, 0x8, 0xff, 0xfc, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0xe, 0xff, 0x80, 0x0, 0xaf, 0xff, 0x50, + 0x1f, 0xff, 0x90, 0x0, 0xe, 0xff, 0x80, 0x0, + 0x1f, 0xff, 0xb0, 0x6f, 0xff, 0x30, 0x0, 0xe, + 0xff, 0x80, 0x0, 0x9, 0xff, 0xf0, 0x8f, 0xff, + 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x5, 0xff, + 0xf2, 0xaf, 0xfd, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x3, 0xff, 0xf3, 0x9f, 0xfd, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x4, 0xff, 0xf2, 0x8f, + 0xff, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x20, 0x1, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, 0x0, 0x4f, + 0xff, 0xfd, 0x62, 0x1, 0x49, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0xff, 0xff, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x65, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, + 0xee, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x2a, + 0xff, 0xff, 0xff, 0xb2, 0x3, 0x80, 0x0, 0x0, + 0x8f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xf8, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x55, 0xaf, 0xff, + 0xff, 0xff, 0xf2, 0x6, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x7, 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x20, 0x0, 0x1, 0xff, 0xff, + 0xf9, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xe1, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, + 0xb2, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0x2a, 0xf3, + 0x0, 0x0, 0x1, 0x0, 0x2, 0xdf, 0xff, 0xfe, + 0x30, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x66, + 0x41, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xe9, 0x0, + 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfc, 0x10, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfe, 0x37, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb4, 0xdf, 0xff, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0x80, + 0x1, 0xbf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0x50, 0x8f, 0x50, 0x9f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x30, + 0xbf, 0xff, 0x70, 0x6f, 0xff, 0xf1, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x12, 0xdf, 0xff, 0xff, 0xa0, + 0x3e, 0xff, 0xe3, 0x0, 0xa, 0xff, 0xfa, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xc1, 0x2d, 0xff, 0xf6, + 0xc, 0xff, 0xf7, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0xb, 0xff, 0xf8, 0x9f, 0xf5, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x8, + 0xff, 0x50, 0x93, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x5, 0x70, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xcc, 0xcf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x44, 0x40, 0x0, 0x1, 0x44, 0x44, 0x41, + 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xee, 0xee, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfc, 0x4, 0xff, 0x40, 0xcf, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x23, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x44, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, + 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F01C "" */ + 0x0, 0x0, 0x4, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfa, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf5, 0x3, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xe1, 0xdf, 0xfa, 0x44, 0x44, + 0x20, 0x0, 0x0, 0x0, 0x34, 0x44, 0x4d, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x88, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x76, 0x0, 0x0, 0x0, 0x5, 0x9c, + 0xdd, 0xb8, 0x30, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x40, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xf, 0xff, 0x0, 0xc, 0xff, 0xff, + 0xa5, 0x34, 0x6b, 0xff, 0xff, 0xce, 0xff, 0x0, + 0xaf, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x7d, 0xdc, 0xbf, 0xff, 0xff, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x2, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xde, + 0xee, 0xee, 0xee, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x9e, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xe0, + 0xff, 0xff, 0xf4, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x61, 0x0, 0x5, 0xcf, 0xff, 0xf2, + 0x0, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0xff, 0xf0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x28, 0xdf, 0xff, 0xfe, 0xa3, 0x0, + 0x0, 0x0, 0xab, 0xa0, 0x0, 0x0, 0x1, 0x33, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x24, 0x44, + 0x47, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x24, 0x44, 0x47, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x75, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2f, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xdf, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1, 0xfe, 0x20, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x1, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x5, 0xf9, 0x0, 0x9f, 0xe1, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0xdf, 0x80, 0x24, 0x44, 0x47, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x3f, 0xf7, 0x4, 0xff, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x86, 0x0, + 0x4f, 0xf1, 0xd, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x2f, 0xf7, 0x0, 0xcf, 0x60, 0x9f, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6f, + 0xf1, 0x7, 0xf9, 0x6, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0x40, 0x5f, 0xb0, + 0x5f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1f, 0xf2, 0x5, 0xfa, 0x5, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xd, 0xfc, 0x0, 0x9f, + 0x80, 0x7f, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xfd, 0x20, 0x1e, 0xf3, 0xb, 0xf6, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0xa, + 0xfc, 0x1, 0xff, 0x20, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x0, 0x0, 0xb, 0xff, 0x20, 0x8f, 0xc0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x7, + 0xff, 0x40, 0x2f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0x0, 0x0, 0x19, 0x20, 0x1d, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, + 0x0, 0x0, 0x2d, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x50, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0xff, 0xdb, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xff, + 0xfd, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xfb, 0x56, + 0xef, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf7, 0x2e, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x2, 0xed, 0x10, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0xef, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xc0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x9f, 0xf5, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x3f, 0xfe, 0x21, 0x8b, 0xff, 0xff, 0xff, 0x50, + 0xa, 0xff, 0xf7, 0x20, 0xdf, 0xff, 0xfb, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xab, 0xa7, 0x20, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xd3, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x82, 0xff, + 0xe0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x2f, 0xfe, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x92, 0xff, 0xe0, + 0x0, 0x3e, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x92, 0xff, 0xe0, 0x5f, + 0xff, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2f, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x92, 0xff, 0xe0, 0xbf, 0xff, 0xff, 0xff, + 0xf9, 0x2f, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x92, 0xff, 0xe0, 0x0, 0x8f, 0xff, 0xff, 0xf9, + 0x2f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x92, + 0xff, 0xe0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x92, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x4, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + + /* U+F04B "" */ + 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x3d, 0xff, 0xff, 0xe6, 0x0, 0x3, 0xdf, 0xff, + 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0x10, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x30, 0xf, + 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, + 0x44, 0x30, 0x0, 0x0, 0x24, 0x44, 0x43, 0x0, + + /* U+F04D "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdc, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x7f, + 0xfd, 0x20, 0x0, 0x0, 0xd, 0xff, 0x47, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0xdf, 0xf4, 0x7f, 0xff, + 0xff, 0x40, 0x0, 0xd, 0xff, 0x47, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xdf, 0xf4, 0x7f, 0xff, 0xff, + 0xff, 0x60, 0xd, 0xff, 0x47, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xdf, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x8d, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xcd, + 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xdf, + 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xff, + 0x47, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, 0xf4, + 0x7f, 0xff, 0xff, 0x80, 0x0, 0xd, 0xff, 0x47, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xdf, 0xf4, 0x7f, + 0xff, 0x60, 0x0, 0x0, 0xd, 0xff, 0x44, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x2, 0x20, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xea, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x56, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x27, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x30, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xe2, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xd1, + 0x0, 0x0, 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x1, + 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x1d, 0xff, 0xfc, + 0x10, 0x0, 0x1, 0xdf, 0xff, 0xc1, 0x0, 0x0, + 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+F054 "" */ + 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf3, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x1c, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x1, 0xbe, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x14, 0x55, + 0x55, 0x59, 0xff, 0xfc, 0x55, 0x55, 0x54, 0x20, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, + 0xdd, 0xde, 0xff, 0xff, 0xdd, 0xdd, 0xdc, 0x90, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x36, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x43, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, 0xce, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x71, 0x0, 0x2, 0x9f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfe, 0x20, 0x2, + 0x53, 0x0, 0x5f, 0xff, 0xfb, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x30, 0x0, 0x6f, 0xfc, 0x10, 0x7f, + 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, + 0x6, 0xff, 0xfc, 0x0, 0xef, 0xff, 0xf8, 0x6, + 0xff, 0xff, 0xf5, 0x1, 0x3, 0xef, 0xff, 0xf4, + 0x9, 0xff, 0xff, 0xf3, 0xef, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, + 0xad, 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, + 0xf6, 0x7, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xff, 0xff, 0x10, 0xaf, 0xff, + 0xfe, 0x10, 0x8f, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0x60, 0x1f, 0xff, 0xff, 0x50, 0x0, 0xaf, + 0xff, 0xf6, 0x0, 0x6c, 0xdb, 0x40, 0xa, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfc, 0x52, 0x12, 0x6d, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xde, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x60, 0x28, 0xcf, 0xff, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xfc, 0xff, 0xff, 0xec, 0xdf, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x6e, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x70, + 0x15, 0x40, 0x1, 0xdf, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1c, 0xff, 0xfb, 0x1f, 0xfe, + 0x50, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7e, + 0x30, 0x0, 0x9f, 0xff, 0xef, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfa, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, 0x2d, + 0xff, 0xff, 0xfd, 0x1, 0xff, 0xff, 0xff, 0x0, + 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xfb, 0x2, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, + 0xff, 0xfd, 0x0, 0x0, 0x6, 0xff, 0xff, 0x55, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x3d, 0xff, 0xfe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xe8, 0x31, 0x20, 0x0, 0x3e, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xbf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xef, 0xfd, 0x80, 0x0, 0x8, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x88, 0x8f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xa0, 0x0, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, + 0x0, 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xfd, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x6f, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x17, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x2, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, + 0x0, 0x12, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x9f, 0xff, 0x50, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x55, 0xbf, + 0xff, 0x60, 0xaf, 0xff, 0xd5, 0xaf, 0xff, 0x80, + 0x0, 0x0, 0xb, 0xf8, 0xa, 0xff, 0xfe, 0x10, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x70, 0x9f, + 0xff, 0xe2, 0x0, 0x4f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0x10, + 0x0, 0x2a, 0x30, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x41, 0xda, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0xd, 0xff, 0x90, 0x8f, + 0xff, 0x30, 0xef, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xfa, 0x67, 0x77, 0x75, 0x0, 0x0, + 0x0, 0x3, 0x77, 0xbf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfc, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfa, 0x5, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x5, 0xff, + 0xff, 0x70, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x7a, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x2e, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x50, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x40, + + /* U+F078 "" */ + 0x9, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcb, 0x18, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xfc, 0x9f, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xd0, 0xbf, 0xff, 0xe3, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, 0xbf, + 0xff, 0xe3, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, + 0x0, 0xbf, 0xff, 0xe3, 0x1, 0xcf, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe4, 0xcf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x27, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfd, + 0x10, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x15, 0xbb, 0xbb, + 0xbb, 0xbb, 0xef, 0xf1, 0x0, 0x0, 0xdf, 0xfb, + 0xef, 0xdc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x9f, 0xc0, 0xef, 0xd1, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x3, 0x0, 0xef, 0xd0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x50, 0xaf, 0xf1, + 0x19, 0x30, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0xaf, 0xf3, 0xdf, 0xe0, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xef, 0xfe, 0xff, 0xd0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x6f, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xba, 0x30, 0x6, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x5, 0x78, 0x88, 0x88, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcb, 0x91, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x11, 0x11, 0xef, + 0xff, 0xf9, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xe0, 0xdf, 0xff, 0xf8, 0xe, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf3, 0x26, + 0x66, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x52, 0x22, 0x25, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, + 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc8, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xf6, 0x0, 0x8, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf4, 0x4d, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xb9, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x1, 0x8c, 0xda, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x1d, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0xef, 0xe1, + 0xc, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xfe, 0x30, + 0xff, 0xd0, 0xa, 0xff, 0x30, 0xb, 0xff, 0xff, + 0xe3, 0x0, 0xbf, 0xfc, 0xbf, 0xff, 0x10, 0xcf, + 0xff, 0xfe, 0x30, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xdc, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x1, 0x2d, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x8c, + 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x33, 0xef, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xe1, 0xc, 0xff, + 0x20, 0x2e, 0xff, 0xff, 0xc1, 0x0, 0xff, 0xd0, + 0xa, 0xff, 0x30, 0x2, 0xef, 0xff, 0xfc, 0x10, + 0xbf, 0xfc, 0xbf, 0xff, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xd1, 0x3, 0xdf, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x4, 0x75, 0x0, 0x0, 0x1, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xe, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfe, 0xe, 0xf7, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, 0xff, 0x70, + 0x1, 0x22, 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, + 0xff, 0xf2, 0xdf, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x24, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0x50, 0x56, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x8b, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xb7, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2a, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x91, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x10, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf5, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, + 0xff, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xfe, 0x51, 0x3b, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xda, 0xbf, 0xff, 0xff, + 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + + /* U+F0C9 "" */ + 0xce, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x13, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x10, + + /* U+F0E0 "" */ + 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x20, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0xb1, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x3e, 0xfe, 0x50, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x7, 0xff, + 0xff, 0xf9, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x31, 0xbf, 0xff, 0xff, 0xff, 0xd3, 0x1b, 0xff, + 0xff, 0xff, 0xb1, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x6f, 0xff, 0xf6, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x12, 0x99, 0x22, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x33, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F0E7 "" */ + 0x0, 0x3, 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfe, 0x66, 0x66, 0x51, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x1, 0x22, 0x22, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8c, 0xcc, 0xdf, 0xbc, + 0xfc, 0xcc, 0xc6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfe, 0x1, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfc, 0x1, 0x22, 0x22, 0x22, 0x1, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xfc, 0xe, + 0x70, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xfc, 0xe, 0xf7, 0x0, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xfc, 0xe, 0xff, 0x70, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xfc, 0xe, 0xff, 0xf2, + 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x58, 0x88, 0x84, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x80, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xf9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0x81, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0x0, + 0x8f, 0x10, 0x7f, 0x10, 0x5f, 0x30, 0x3f, 0x50, + 0x1f, 0xfc, 0xff, 0xc0, 0x7, 0xe0, 0x6, 0xf0, + 0x4, 0xf2, 0x2, 0xf4, 0x0, 0xff, 0xcf, 0xfc, + 0x0, 0x8f, 0x0, 0x7f, 0x10, 0x5f, 0x30, 0x3f, + 0x50, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xfe, 0x66, 0xbf, 0x66, 0xaf, 0x76, 0x8f, + 0x86, 0x7f, 0xff, 0xfc, 0xff, 0xff, 0xd0, 0x6, + 0xf0, 0x5, 0xf1, 0x3, 0xf3, 0x1, 0xff, 0xff, + 0xcf, 0xff, 0xfd, 0x0, 0x7f, 0x0, 0x5f, 0x10, + 0x3f, 0x30, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xfe, 0x66, 0xcf, 0x76, 0x66, 0x66, + 0x66, 0x66, 0x9f, 0xa6, 0x7f, 0xfc, 0xff, 0xc0, + 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf4, + 0x0, 0xff, 0xcf, 0xfc, 0x0, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x40, 0xf, 0xfc, 0xff, + 0xfc, 0xce, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, + 0xfd, 0xcc, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, + 0x22, 0x7f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x37, 0x77, 0x77, 0x77, 0x74, 0x5, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xfa, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xfa, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9c, 0xde, 0xdc, 0xb8, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xdb, 0x99, 0x9a, + 0xcf, 0xff, 0xff, 0xff, 0xb1, 0x0, 0xa, 0xff, + 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xfe, 0x40, 0xcf, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf4, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xf2, + 0xa, 0xd2, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, + 0xb6, 0x20, 0x0, 0x0, 0x8e, 0x30, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfb, + 0x87, 0x89, 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xba, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F241 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F242 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F243 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F244 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x76, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x4c, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x0, 0x0, 0xd, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xd2, 0x0, + 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x40, 0x0, 0xaf, 0xff, 0xfc, 0x1, 0xde, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0x88, 0x88, 0x9f, 0xe8, 0x88, 0x88, 0x88, + 0x88, 0x8f, 0xff, 0x91, 0x5f, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xc3, 0x0, 0x4, 0xbb, 0x60, 0x0, 0x0, 0x0, + 0xeb, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x30, + 0x8, 0x88, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xc1, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9e, 0xff, 0xff, 0xc7, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0x20, 0x0, 0x8, 0xff, 0xff, 0xf2, 0xdf, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0xff, 0xff, 0x11, 0xdf, + 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x1, + 0xef, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0x12, + 0x12, 0xef, 0xff, 0x53, 0xff, 0xf4, 0x7f, 0xf1, + 0x3d, 0x13, 0xff, 0xf8, 0x6f, 0xff, 0x40, 0x7f, + 0x13, 0xf5, 0xc, 0xff, 0xb8, 0xff, 0xff, 0x40, + 0x71, 0x35, 0xa, 0xff, 0xfd, 0x9f, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xea, 0xff, 0xff, + 0xff, 0x30, 0x6, 0xff, 0xff, 0xfe, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x6f, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x8f, + 0xff, 0xf4, 0x6, 0x13, 0x50, 0x8f, 0xff, 0xd6, + 0xff, 0xf4, 0x7, 0xf1, 0x3f, 0x40, 0x9f, 0xfb, + 0x3f, 0xff, 0x47, 0xff, 0x13, 0xd1, 0x1d, 0xff, + 0x90, 0xff, 0xff, 0xff, 0xf1, 0x21, 0x1d, 0xff, + 0xf5, 0xa, 0xff, 0xff, 0xff, 0x20, 0x2e, 0xff, + 0xff, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, 0x4e, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xdd, + 0xc9, 0x40, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xac, 0xcc, 0xcd, 0xff, + 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xa, 0xff, 0xe1, 0xef, 0xf2, 0xcf, + 0xf3, 0xbf, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, + 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, + 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, + 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, + 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, + 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, + 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xe1, 0xef, 0xf1, 0xcf, 0xf3, 0xaf, 0xfe, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7b, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcb, 0x91, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf4, 0xc, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0xc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xf4, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0xc, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb9, 0x75, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x2, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xc, 0xfc, 0x0, + 0xc, 0xff, 0xff, 0xf8, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x90, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x5, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xf8, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x5f, + 0xff, 0x50, 0x2e, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x2, 0xef, 0xbb, 0xfc, 0xbf, 0xdb, + 0xbf, 0xf9, 0x2, 0xef, 0xd0, 0x2f, 0x40, 0xe7, + 0x1, 0xff, 0xa2, 0xef, 0xfd, 0x2, 0xf4, 0xe, + 0x70, 0x1f, 0xfa, 0xef, 0xff, 0xd0, 0x2f, 0x40, + 0xe7, 0x1, 0xff, 0xaf, 0xff, 0xfd, 0x24, 0xf6, + 0x2e, 0x82, 0x3f, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x10, 0x0, 0x3, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x4, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x6, 0xff, 0xff, + 0xf6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x9f, 0xff, + 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x2, 0xef, 0xff, 0xf1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x2, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 95, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 94, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32, .adv_w = 138, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 57, .adv_w = 247, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 177, .adv_w = 219, .box_w = 13, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 320, .adv_w = 297, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 464, .adv_w = 241, .box_w = 15, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 592, .adv_w = 74, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 603, .adv_w = 119, .box_w = 5, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 656, .adv_w = 119, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 719, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 760, .adv_w = 205, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 815, .adv_w = 80, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 826, .adv_w = 135, .box_w = 7, .box_h = 2, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 833, .adv_w = 80, .box_w = 3, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 839, .adv_w = 124, .box_w = 10, .box_h = 21, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 944, .adv_w = 235, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1048, .adv_w = 130, .box_w = 6, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1096, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1192, .adv_w = 201, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1288, .adv_w = 235, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1408, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1504, .adv_w = 217, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1600, .adv_w = 210, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1704, .adv_w = 227, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1816, .adv_w = 217, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1920, .adv_w = 80, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1938, .adv_w = 80, .box_w = 3, .box_h = 16, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1962, .adv_w = 205, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 2023, .adv_w = 205, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 2062, .adv_w = 205, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 2123, .adv_w = 202, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2219, .adv_w = 364, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2429, .adv_w = 258, .box_w = 18, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2573, .adv_w = 266, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2685, .adv_w = 254, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2805, .adv_w = 291, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2933, .adv_w = 236, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3029, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3125, .adv_w = 272, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3245, .adv_w = 286, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3357, .adv_w = 109, .box_w = 3, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3381, .adv_w = 181, .box_w = 11, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3469, .adv_w = 253, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3581, .adv_w = 209, .box_w = 11, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3669, .adv_w = 336, .box_w = 17, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3805, .adv_w = 286, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3917, .adv_w = 296, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4053, .adv_w = 254, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4157, .adv_w = 296, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4328, .adv_w = 256, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4432, .adv_w = 219, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4536, .adv_w = 207, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4640, .adv_w = 278, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4752, .adv_w = 251, .box_w = 17, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4888, .adv_w = 396, .box_w = 25, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5088, .adv_w = 237, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5208, .adv_w = 228, .box_w = 16, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5336, .adv_w = 231, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5448, .adv_w = 117, .box_w = 5, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 5501, .adv_w = 124, .box_w = 10, .box_h = 21, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5606, .adv_w = 117, .box_w = 6, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5669, .adv_w = 205, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 5724, .adv_w = 176, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5741, .adv_w = 211, .box_w = 7, .box_h = 3, .ofs_x = 2, .ofs_y = 14}, + {.bitmap_index = 5752, .adv_w = 210, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5818, .adv_w = 240, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5929, .adv_w = 201, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6001, .adv_w = 240, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6112, .adv_w = 215, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6190, .adv_w = 124, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6267, .adv_w = 243, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 6379, .adv_w = 240, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6481, .adv_w = 98, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6515, .adv_w = 100, .box_w = 8, .box_h = 21, .ofs_x = -3, .ofs_y = -4}, + {.bitmap_index = 6599, .adv_w = 217, .box_w = 12, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6701, .adv_w = 98, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6727, .adv_w = 372, .box_w = 20, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6847, .adv_w = 240, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6919, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7003, .adv_w = 240, .box_w = 13, .box_h = 16, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 7107, .adv_w = 240, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7211, .adv_w = 144, .box_w = 7, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7253, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7319, .adv_w = 146, .box_w = 9, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7387, .adv_w = 238, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7459, .adv_w = 197, .box_w = 14, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7543, .adv_w = 316, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7663, .adv_w = 194, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7735, .adv_w = 197, .box_w = 14, .box_h = 16, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 7847, .adv_w = 183, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7913, .adv_w = 124, .box_w = 7, .box_h = 21, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 7987, .adv_w = 105, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 8019, .adv_w = 124, .box_w = 7, .box_h = 21, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8093, .adv_w = 205, .box_w = 11, .box_h = 4, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 8115, .adv_w = 147, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 8151, .adv_w = 111, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 8164, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 8429, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8616, .adv_w = 352, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8836, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9023, .adv_w = 242, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9151, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9404, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9657, .adv_w = 396, .box_w = 25, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9907, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10160, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10373, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10626, .adv_w = 176, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10725, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10878, .adv_w = 396, .box_w = 25, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11153, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11340, .adv_w = 242, .box_w = 16, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11524, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 11682, .adv_w = 308, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11922, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12122, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12322, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 12480, .adv_w = 308, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 12690, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12810, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12930, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13130, .adv_w = 308, .box_w = 20, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 13180, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13393, .adv_w = 440, .box_w = 28, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13715, .adv_w = 396, .box_w = 27, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 14026, .adv_w = 352, .box_w = 22, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14257, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 14371, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 14485, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14737, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14924, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15177, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 15442, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15642, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15872, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16072, .adv_w = 308, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16252, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16439, .adv_w = 220, .box_w = 15, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 16612, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16842, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17072, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17285, .adv_w = 352, .box_w = 24, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 17561, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17757, .adv_w = 440, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18051, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18261, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18471, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18681, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18891, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 19101, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19353, .adv_w = 308, .box_w = 17, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 19549, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19779, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 20044, .adv_w = 440, .box_w = 28, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20282, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20478, .adv_w = 354, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 16, 0, 10, -8, 0, 0, + 0, 0, -19, -21, 2, 17, 8, 6, + -14, 2, 17, 1, 15, 4, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 3, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 0, -11, 0, 0, 0, 0, + 0, -7, 6, 7, 0, 0, -4, 0, + -2, 4, 0, -4, 0, -4, -2, -7, + 0, 0, 0, 0, -4, 0, 0, -5, + -5, 0, 0, -4, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -5, 0, -10, 0, -43, 0, + 0, -7, 0, 7, 11, 0, 0, -7, + 4, 4, 12, 7, -6, 7, 0, 0, + -20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, -4, -17, 0, -14, + -2, 0, 0, 0, 0, 1, 14, 0, + -11, -3, -1, 1, 0, -6, 0, 0, + -2, -26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -28, -3, 13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 12, + 0, 4, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 7, 4, 11, -4, 0, 0, 7, -4, + -12, -48, 2, 10, 7, 1, -5, 0, + 13, 0, 11, 0, 11, 0, -33, 0, + -4, 11, 0, 12, -4, 7, 4, 0, + 0, 1, -4, 0, 0, -6, 28, 0, + 28, 0, 11, 0, 15, 5, 6, 11, + 0, 0, 0, -13, 0, 0, 0, 0, + 1, -2, 0, 2, -6, -5, -7, 2, + 0, -4, 0, 0, 0, -14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -19, 0, -22, 0, 0, 0, + 0, -2, 0, 35, -4, -5, 4, 4, + -3, 0, -5, 4, 0, 0, -19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -34, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -22, 0, 21, 0, 0, -13, 0, + 12, 0, -24, -34, -24, -7, 11, 0, + 0, -24, 0, 4, -8, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 11, -43, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 2, 0, 0, 0, + 0, 0, 2, 2, -4, -7, 0, -1, + -1, -4, 0, 0, -2, 0, 0, 0, + -7, 0, -3, 0, -8, -7, 0, -9, + -12, -12, -7, 0, -7, 0, -7, 0, + 0, 0, 0, -3, 0, 0, 4, 0, + 2, -4, 0, 1, 0, 0, 0, 4, + -2, 0, 0, 0, -2, 4, 4, -1, + 0, 0, 0, -7, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 5, -2, 0, + -4, 0, -6, 0, 0, -2, 0, 11, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -2, -2, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -4, 0, + 0, 0, 0, 0, 1, 0, 0, -2, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -2, -5, 0, -5, 0, -11, + -2, -11, 7, 0, 0, -7, 4, 7, + 10, 0, -9, -1, -4, 0, -1, -17, + 4, -2, 2, -19, 4, 0, 0, 1, + -18, 0, -19, -3, -31, -2, 0, -18, + 0, 7, 10, 0, 5, 0, 0, 0, + 0, 1, 0, -6, -5, 0, -11, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -5, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -2, -4, -3, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -4, + 0, -2, 0, -7, 4, 0, 0, -4, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -4, 0, -4, -2, -4, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -4, -5, 0, + -7, 0, 11, -2, 1, -11, 0, 0, + 10, -18, -18, -15, -7, 4, 0, -3, + -23, -6, 0, -6, 0, -7, 5, -6, + -23, 0, -10, 0, 0, 2, -1, 3, + -2, 0, 4, 0, -11, -13, 0, -18, + -8, -7, -8, -11, -4, -10, -1, -7, + -10, 2, 0, 1, 0, -4, 0, 0, + 0, 2, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -6, -8, + -8, -1, 0, -11, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 1, + -2, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -7, 0, 0, 0, 0, -18, -11, 0, + 0, 0, -5, -18, 0, 0, -4, 4, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -6, 0, + 0, 0, 0, 4, 0, 2, -7, -7, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, -11, 0, -4, 0, -5, -4, + 0, -8, -9, -11, -3, 0, -7, 0, + -11, 0, 0, 0, 0, 28, 0, 0, + 2, 0, 0, -5, 0, 4, 0, -15, + 0, 0, 0, 0, 0, -33, -6, 12, + 11, -3, -15, 0, 4, -5, 0, -18, + -2, -5, 4, -25, -4, 5, 0, 5, + -12, -5, -13, -12, -15, 0, 0, -21, + 0, 20, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -10, -12, -1, -33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -5, 0, 0, + -7, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -7, 0, 0, 7, + -1, 5, 0, -8, 4, -2, -1, -9, + -4, 0, -5, -4, -2, 0, -5, -6, + 0, 0, -3, -1, -2, -6, -4, 0, + 0, -4, 0, 4, -2, 0, -8, 0, + 0, 0, -7, 0, -6, 0, -6, -6, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 4, 0, -5, 0, -2, -4, + -11, -2, -2, -2, -1, -2, -4, -1, + 0, 0, 0, 0, 0, -4, -3, -3, + 0, 0, 0, 0, 4, -2, 0, -2, + 0, 0, 0, -2, -4, -2, -3, -4, + -3, 0, 3, 14, -1, 0, -10, 0, + -2, 7, 0, -4, -15, -5, 5, 0, + 0, -17, -6, 4, -6, 2, 0, -2, + -3, -11, 0, -5, 2, 0, 0, -6, + 0, 0, 0, 4, 4, -7, -7, 0, + -6, -4, -5, -4, -4, 0, -6, 2, + -7, -6, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -5, 0, -7, 0, 0, 0, -12, 0, + 2, -8, 7, 1, -2, -17, 0, 0, + -8, -4, 0, -14, -9, -10, 0, 0, + -15, -4, -14, -13, -17, 0, -9, 0, + 3, 24, -5, 0, -8, -4, -1, -4, + -6, -10, -6, -13, -14, -8, -4, 0, + 0, -2, 0, 1, 0, 0, -25, -3, + 11, 8, -8, -13, 0, 1, -11, 0, + -18, -2, -4, 7, -32, -5, 1, 0, + 0, -23, -4, -18, -4, -26, 0, 0, + -25, 0, 21, 1, 0, -2, 0, 0, + 0, 0, -2, -2, -13, -2, 0, -23, + 0, 0, 0, 0, -11, 0, -3, 0, + -1, -10, -17, 0, 0, -2, -5, -11, + -4, 0, -2, 0, 0, 0, 0, -16, + -4, -12, -11, -3, -6, -9, -4, -6, + 0, -7, -3, -12, -5, 0, -4, -7, + -4, -7, 0, 2, 0, -2, -12, 0, + 7, 0, -6, 0, 0, 0, 0, 4, + 0, 2, -7, 14, 0, -4, -4, -4, + 0, 0, 0, 0, 0, 0, -11, 0, + -4, 0, -5, -4, 0, -8, -9, -11, + -3, 0, -7, 3, 14, 0, 0, 0, + 0, 28, 0, 0, 2, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -2, -7, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -7, + -4, 0, 0, -7, 0, 6, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 5, 7, 3, -3, 0, -11, + -6, 0, 11, -12, -11, -7, -7, 14, + 6, 4, -31, -2, 7, -4, 0, -4, + 4, -4, -12, 0, -4, 4, -5, -3, + -11, -3, 0, 0, 11, 7, 0, -10, + 0, -19, -5, 10, -5, -13, 1, -5, + -12, -12, -4, 14, 4, 0, -5, 0, + -10, 0, 3, 12, -8, -13, -14, -9, + 11, 0, 1, -26, -3, 4, -6, -2, + -8, 0, -8, -13, -5, -5, -3, 0, + 0, -8, -7, -4, 0, 11, 8, -4, + -19, 0, -19, -5, 0, -12, -20, -1, + -11, -6, -12, -10, 10, 0, 0, -5, + 0, -7, -3, 0, -4, -6, 0, 6, + -12, 4, 0, 0, -19, 0, -4, -8, + -6, -2, -11, -9, -12, -8, 0, -11, + -4, -8, -7, -11, -4, 0, 0, 1, + 17, -6, 0, -11, -4, 0, -4, -7, + -8, -10, -10, -13, -5, -7, 7, 0, + -5, 0, -18, -4, 2, 7, -11, -13, + -7, -12, 12, -4, 2, -33, -6, 7, + -8, -6, -13, 0, -11, -15, -4, -4, + -3, -4, -7, -11, -1, 0, 0, 11, + 10, -2, -23, 0, -21, -8, 8, -13, + -24, -7, -12, -15, -18, -12, 7, 0, + 0, 0, 0, -4, 0, 0, 4, -4, + 7, 2, -7, 7, 0, 0, -11, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 3, 11, 1, 0, -4, 0, 0, + 0, 0, -2, -2, -4, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 13, 0, 6, 1, 1, -5, + 0, 7, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -21, 0, -4, 6, 0, 11, + 0, 0, 35, 4, -7, -7, 4, 4, + -2, 1, -18, 0, 0, 17, -21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -24, 13, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -10, 0, + 0, 1, 0, 0, 4, 45, -7, -3, + 11, 10, -10, 4, 0, 0, 4, 4, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -46, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + 0, 0, 0, -10, 0, 0, 0, 0, + -8, -2, 0, 0, 0, -8, 0, -4, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -24, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -7, 0, -5, 0, + -10, 0, 0, 0, -6, 4, -4, 0, + 0, -10, -4, -8, 0, 0, -10, 0, + -4, 0, -17, 0, -4, 0, 0, -29, + -7, -14, -4, -13, 0, 0, -24, 0, + -10, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -6, -3, -6, 0, 0, + 0, 0, -8, 0, -8, 5, -4, 7, + 0, -2, -8, -2, -6, -7, 0, -4, + -2, -2, 2, -10, -1, 0, 0, 0, + -31, -3, -5, 0, -8, 0, -2, -17, + -3, 0, 0, -2, -3, 0, 0, 0, + 0, 2, 0, -2, -6, -2, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, -8, 0, -2, 0, 0, 0, -7, + 4, 0, 0, 0, -10, -4, -7, 0, + 0, -10, 0, -4, 0, -17, 0, 0, + 0, 0, -34, 0, -7, -13, -18, 0, + 0, -24, 0, -2, -5, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -5, -2, + -5, 1, 0, 0, 6, -5, 0, 11, + 17, -4, -4, -11, 4, 17, 6, 8, + -10, 4, 15, 4, 10, 8, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 17, -6, -4, 0, -3, + 28, 15, 28, 0, 0, 0, 4, 0, + 0, 13, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, -30, -4, -3, -14, + -17, 0, 0, -24, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, -30, -4, -3, + -14, -17, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -8, 4, 0, -4, + 3, 6, 4, -11, 0, -1, -3, 4, + 0, 3, 0, 0, 0, 0, -9, 0, + -3, -2, -7, 0, -3, -14, 0, 22, + -4, 0, -8, -2, 0, -2, -6, 0, + -4, -10, -7, -4, 0, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, -30, + -4, -3, -14, -17, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, -11, -4, -3, 11, -3, -4, + -14, 1, -2, 1, -2, -10, 1, 8, + 1, 3, 1, 3, -8, -14, -4, 0, + -13, -7, -10, -15, -14, 0, -6, -7, + -4, -5, -3, -2, -4, -2, 0, -2, + -1, 5, 0, 5, -2, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, -4, -4, 0, 0, + -10, 0, -2, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, 0, 0, 0, -3, 0, 0, -6, + -4, 4, 0, -6, -7, -2, 0, -10, + -2, -8, -2, -4, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -24, 0, 11, 0, 0, -6, 0, + 0, 0, 0, -5, 0, -4, 0, 0, + -2, 0, 0, -2, 0, -8, 0, 0, + 15, -5, -12, -11, 2, 4, 4, -1, + -10, 2, 5, 2, 11, 2, 12, -2, + -10, 0, 0, -14, 0, 0, -11, -10, + 0, 0, -7, 0, -5, -6, 0, -5, + 0, -5, 0, -2, 5, 0, -3, -11, + -4, 13, 0, 0, -3, 0, -7, 0, + 0, 5, -8, 0, 4, -4, 3, 0, + 0, -12, 0, -2, -1, 0, -4, 4, + -3, 0, 0, 0, -14, -4, -8, 0, + -11, 0, 0, -17, 0, 13, -4, 0, + -6, 0, 2, 0, -4, 0, -4, -11, + 0, -4, 4, 0, 0, 0, 0, -2, + 0, 0, 4, -5, 1, 0, 0, -4, + -2, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, 0, 8, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 7, 0, 8, + 0, 0, 0, 0, 0, -22, -20, 1, + 15, 11, 6, -14, 2, 15, 0, 13, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_22 = { +#else +lv_font_t lv_font_montserrat_22 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 24, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_22*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_24.c b/inc/lvgl/src/font/lv_font_montserrat_24.c new file mode 100644 index 0000000..ffb9c83 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_24.c @@ -0,0 +1,4057 @@ +/******************************************************************************* + * Size: 24 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 24 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_24.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_24 + #define LV_FONT_MONTSERRAT_24 1 +#endif + +#if LV_FONT_MONTSERRAT_24 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x1f, 0xf8, 0x1f, 0xf8, 0xf, 0xf7, 0xf, 0xf7, + 0xf, 0xf6, 0xe, 0xf5, 0xe, 0xf5, 0xd, 0xf4, + 0xd, 0xf3, 0xc, 0xf3, 0xb, 0xf2, 0x7, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf6, 0x4f, 0xfb, + 0xc, 0xe5, + + /* U+0022 "\"" */ + 0x7f, 0x80, 0x2f, 0xd7, 0xf7, 0x1, 0xfd, 0x6f, + 0x70, 0x1f, 0xc6, 0xf7, 0x1, 0xfc, 0x6f, 0x60, + 0xf, 0xc5, 0xf6, 0x0, 0xfb, 0x38, 0x30, 0x8, + 0x60, + + /* U+0023 "#" */ + 0x0, 0x0, 0x8, 0xf2, 0x0, 0x5, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x7f, 0x30, + 0x0, 0x0, 0x0, 0xd, 0xe0, 0x0, 0x9, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0xbf, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x7c, 0xcd, 0xfe, 0xcc, 0xcc, + 0xfe, 0xcc, 0xc2, 0x0, 0x0, 0x4f, 0x60, 0x0, + 0x1f, 0x90, 0x0, 0x0, 0x0, 0x6, 0xf4, 0x0, + 0x3, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x20, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0x0, 0xa, 0xf0, + 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xce, + 0x0, 0x0, 0x8f, 0x20, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4c, 0xcc, + 0xfe, 0xcc, 0xcc, 0xff, 0xcc, 0xc5, 0x0, 0x0, + 0x2f, 0x90, 0x0, 0xe, 0xd0, 0x0, 0x0, 0x0, + 0x4, 0xf7, 0x0, 0x0, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0x50, 0x0, 0x2f, 0x90, 0x0, 0x0, + 0x0, 0x8, 0xf3, 0x0, 0x4, 0xf7, 0x0, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x1, 0x7c, + 0xff, 0xfe, 0xb6, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x1, 0xef, 0xe6, 0x5f, 0x73, + 0x7d, 0xc0, 0x6, 0xff, 0x20, 0x3f, 0x50, 0x0, + 0x20, 0x9, 0xfc, 0x0, 0x3f, 0x50, 0x0, 0x0, + 0x8, 0xfe, 0x0, 0x3f, 0x50, 0x0, 0x0, 0x3, + 0xff, 0xc3, 0x3f, 0x50, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xef, 0x91, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x1, 0x7f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3f, 0x53, + 0xbf, 0xf7, 0x0, 0x0, 0x0, 0x3f, 0x50, 0xb, + 0xfc, 0x0, 0x0, 0x0, 0x3f, 0x50, 0x7, 0xfe, + 0x5, 0x70, 0x0, 0x3f, 0x50, 0xc, 0xfb, 0xc, + 0xfd, 0x73, 0x4f, 0x64, 0xbf, 0xf4, 0x5, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x6, 0xbe, + 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x50, 0x0, + 0x0, + + /* U+0025 "%" */ + 0x0, 0x3c, 0xfe, 0x90, 0x0, 0x0, 0x0, 0x6f, + 0x70, 0x0, 0x3, 0xfd, 0x78, 0xfb, 0x0, 0x0, + 0x2, 0xfc, 0x0, 0x0, 0xb, 0xe1, 0x0, 0x6f, + 0x40, 0x0, 0xc, 0xf2, 0x0, 0x0, 0xf, 0x90, + 0x0, 0xf, 0x90, 0x0, 0x7f, 0x60, 0x0, 0x0, + 0x1f, 0x70, 0x0, 0xe, 0xa0, 0x2, 0xfb, 0x0, + 0x0, 0x0, 0xf, 0x80, 0x0, 0xf, 0x90, 0xc, + 0xf1, 0x0, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x3f, + 0x60, 0x7f, 0x60, 0x0, 0x0, 0x0, 0x5, 0xf9, + 0x24, 0xde, 0x2, 0xfb, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xd3, 0xc, 0xe1, 0x8, 0xff, + 0xe7, 0x0, 0x0, 0x1, 0x43, 0x0, 0x7f, 0x50, + 0x9f, 0x85, 0xaf, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xfa, 0x2, 0xf8, 0x0, 0xb, 0xf0, 0x0, 0x0, + 0x0, 0xd, 0xe1, 0x5, 0xf3, 0x0, 0x5, 0xf4, + 0x0, 0x0, 0x0, 0x8f, 0x50, 0x6, 0xf1, 0x0, + 0x3, 0xf5, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x5, + 0xf3, 0x0, 0x5, 0xf3, 0x0, 0x0, 0xd, 0xe1, + 0x0, 0x1, 0xf8, 0x0, 0xa, 0xe0, 0x0, 0x0, + 0x8f, 0x40, 0x0, 0x0, 0x8f, 0x84, 0x9f, 0x60, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0x7, 0xdf, + 0xd6, 0x0, + + /* U+0026 "&" */ + 0x0, 0x1, 0x9e, 0xfe, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfe, 0xbd, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xaf, 0xb0, 0x0, 0x7f, 0xb0, 0x0, 0x0, + 0x0, 0xdf, 0x50, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0xcf, 0x70, 0x0, 0x6f, 0xa0, 0x0, 0x0, + 0x0, 0x6f, 0xe1, 0x6, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0xbf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x51, 0xcf, 0xd1, 0x0, 0xac, 0x20, + 0x4f, 0xf2, 0x0, 0xc, 0xfd, 0x20, 0xff, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0xcf, 0xe8, 0xfb, 0x0, + 0xef, 0x60, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, + 0x6f, 0xfa, 0x20, 0x1, 0x6e, 0xff, 0xfe, 0x20, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xbf, 0xd0, + 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0xb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x7f, 0x87, 0xf7, 0x6f, 0x76, 0xf7, 0x6f, 0x65, + 0xf6, 0x38, 0x30, + + /* U+0028 "(" */ + 0x0, 0x2f, 0xf1, 0x0, 0x9f, 0x90, 0x1, 0xff, + 0x20, 0x6, 0xfc, 0x0, 0xc, 0xf7, 0x0, 0xf, + 0xf3, 0x0, 0x3f, 0xf0, 0x0, 0x6f, 0xd0, 0x0, + 0x8f, 0xb0, 0x0, 0x9f, 0xa0, 0x0, 0xaf, 0x90, + 0x0, 0xbf, 0x80, 0x0, 0xaf, 0x90, 0x0, 0x9f, + 0xa0, 0x0, 0x8f, 0xb0, 0x0, 0x6f, 0xd0, 0x0, + 0x3f, 0xf0, 0x0, 0xf, 0xf3, 0x0, 0xc, 0xf7, + 0x0, 0x6, 0xfc, 0x0, 0x1, 0xff, 0x20, 0x0, + 0x9f, 0x90, 0x0, 0x2f, 0xf1, + + /* U+0029 ")" */ + 0xf, 0xf3, 0x0, 0x8, 0xfb, 0x0, 0x1, 0xff, + 0x30, 0x0, 0xbf, 0x80, 0x0, 0x6f, 0xd0, 0x0, + 0x1f, 0xf2, 0x0, 0xe, 0xf5, 0x0, 0xb, 0xf8, + 0x0, 0x9, 0xfa, 0x0, 0x8, 0xfb, 0x0, 0x7, + 0xfc, 0x0, 0x6, 0xfd, 0x0, 0x7, 0xfc, 0x0, + 0x8, 0xfb, 0x0, 0x9, 0xfa, 0x0, 0xb, 0xf8, + 0x0, 0xe, 0xf5, 0x0, 0x1f, 0xf2, 0x0, 0x6f, + 0xd0, 0x0, 0xbf, 0x80, 0x1, 0xff, 0x30, 0x8, + 0xfb, 0x0, 0xf, 0xf3, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x3, 0x0, 0xe8, + 0x0, 0x20, 0x4f, 0xa1, 0xe8, 0x4d, 0xe0, 0x8, + 0xff, 0xfe, 0xfd, 0x40, 0x0, 0x2e, 0xff, 0xb0, + 0x0, 0x7, 0xef, 0xff, 0xfc, 0x30, 0x5f, 0xb2, + 0xe8, 0x5e, 0xe0, 0x4, 0x0, 0xe8, 0x0, 0x30, + 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5e, 0xee, 0xef, 0xfe, + 0xee, 0xe5, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, + + /* U+002C "," */ + 0x3b, 0x80, 0xcf, 0xf3, 0xaf, 0xf3, 0xf, 0xe0, + 0x1f, 0x90, 0x5f, 0x40, 0x9e, 0x0, + + /* U+002D "-" */ + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0xaf, + 0xff, 0xff, 0xd0, + + /* U+002E "." */ + 0x4, 0x10, 0x9f, 0xf1, 0xdf, 0xf4, 0x6f, 0xb0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5f, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xf6, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xf5, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x0, 0xd, 0xf4, + 0x0, 0x0, 0x0, 0x2, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x1, 0xff, + 0xe7, 0x33, 0x7e, 0xff, 0x10, 0xb, 0xfe, 0x20, + 0x0, 0x2, 0xef, 0xb0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xf2, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0xe, 0xf7, 0xaf, 0xb0, 0x0, 0x0, 0x0, 0xb, + 0xfa, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x9, 0xfc, + 0xdf, 0x80, 0x0, 0x0, 0x0, 0x8, 0xfd, 0xcf, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xfc, 0xaf, 0xb0, + 0x0, 0x0, 0x0, 0xb, 0xfa, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0xe, 0xf7, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xf2, 0xb, 0xfe, 0x10, 0x0, 0x2, + 0xef, 0xb0, 0x1, 0xff, 0xe7, 0x33, 0x7e, 0xff, + 0x10, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x1, 0x7c, 0xee, 0xc7, 0x10, 0x0, + + /* U+0031 "1" */ + 0xdf, 0xff, 0xff, 0x5d, 0xff, 0xff, 0xf5, 0x11, + 0x11, 0xff, 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, + 0xff, 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, + 0x50, 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, + 0xf, 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, 0xf, + 0xf5, 0x0, 0x0, 0xff, 0x50, 0x0, 0xf, 0xf5, + 0x0, 0x0, 0xff, 0x50, + + /* U+0032 "2" */ + 0x0, 0x17, 0xce, 0xfe, 0xc6, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xfc, 0x63, + 0x35, 0xbf, 0xfa, 0x0, 0x97, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xc1, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xc2, 0x11, 0x11, + 0x11, 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0033 "3" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x1, 0x11, 0x11, + 0x11, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x15, 0xef, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x81, 0xa1, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x9f, 0xfa, 0x53, 0x34, 0x9f, + 0xfd, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x49, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x9d, 0x70, 0x0, + 0x0, 0x1e, 0xfa, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0x7, 0xff, 0x41, 0x11, 0x11, 0xbf, 0x91, 0x11, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x90, 0x0, + + /* U+0035 "5" */ + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xbf, 0x81, + 0x11, 0x11, 0x11, 0x0, 0xd, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x31, 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xfe, 0xa3, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x26, 0xdf, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x93, 0x0, 0x0, + 0x0, 0x1e, 0xfa, 0x5f, 0xfb, 0x63, 0x24, 0x7e, + 0xff, 0x31, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x28, 0xce, 0xfe, 0xc8, 0x10, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xb5, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0xcf, + 0xf9, 0x42, 0x23, 0x76, 0x0, 0x8, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xa0, 0x5b, 0xef, 0xd9, 0x30, + 0x0, 0xbf, 0x9a, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xdf, 0xff, 0xc4, 0x1, 0x4c, 0xff, 0x40, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0xbf, 0xf5, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x8f, 0xf2, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x4f, 0xf4, 0x0, 0x0, + 0x0, 0x4f, 0xf0, 0xd, 0xfc, 0x0, 0x0, 0x0, + 0xbf, 0xb0, 0x4, 0xff, 0xc3, 0x0, 0x3b, 0xff, + 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xd9, 0x20, 0x0, + + /* U+0037 "7" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4f, 0xf2, + 0x11, 0x11, 0x11, 0x8f, 0xf1, 0x4f, 0xf0, 0x0, + 0x0, 0x0, 0xef, 0x90, 0x4f, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0x20, 0x2, 0x20, 0x0, 0x0, 0xc, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x6, 0xbe, 0xff, 0xd9, 0x20, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xd, 0xff, + 0x71, 0x0, 0x4b, 0xff, 0x40, 0x3f, 0xf5, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x4f, 0xf1, 0x0, 0x0, + 0x0, 0x9f, 0xc0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0xa, 0xff, 0x72, 0x1, 0x4c, 0xff, + 0x20, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x4, 0xdf, 0xff, 0xef, 0xff, 0xf8, 0x0, 0x2f, + 0xfc, 0x40, 0x0, 0x18, 0xff, 0x90, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x6f, 0xf2, 0xdf, 0x80, 0x0, + 0x0, 0x0, 0xf, 0xf5, 0xdf, 0x80, 0x0, 0x0, + 0x0, 0x1f, 0xf5, 0xaf, 0xe1, 0x0, 0x0, 0x0, + 0x8f, 0xf2, 0x3f, 0xfd, 0x51, 0x0, 0x3a, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x17, 0xce, 0xff, 0xd9, 0x40, 0x0, + + /* U+0039 "9" */ + 0x0, 0x4, 0xae, 0xfe, 0xc7, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, + 0x82, 0x0, 0x4c, 0xfe, 0x10, 0x1f, 0xf6, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x3f, 0xf0, 0x0, 0x0, + 0x0, 0x6f, 0xf1, 0x4f, 0xf0, 0x0, 0x0, 0x0, + 0x6f, 0xf5, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0xcf, + 0xf8, 0xa, 0xff, 0x82, 0x0, 0x4c, 0xff, 0xf9, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xfa, 0x0, + 0x6, 0xbe, 0xfe, 0xa4, 0xd, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x50, 0x0, 0xa7, 0x31, 0x25, 0xcf, 0xf9, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x7b, 0xdf, 0xec, 0x82, 0x0, 0x0, + + /* U+003A ":" */ + 0x5f, 0xb0, 0xdf, 0xf4, 0x9f, 0xf1, 0x4, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x10, 0x9f, 0xf1, 0xdf, 0xf4, + 0x6f, 0xb0, + + /* U+003B ";" */ + 0x5f, 0xb0, 0xdf, 0xf4, 0x9f, 0xf1, 0x4, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xb0, 0xcf, 0xf4, + 0x8f, 0xf2, 0xf, 0xd0, 0x2f, 0x80, 0x6f, 0x30, + 0x7b, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xf5, 0x0, 0x0, 0x18, 0xef, + 0xfe, 0x81, 0x0, 0x4b, 0xff, 0xfa, 0x40, 0x0, + 0x3e, 0xff, 0xd7, 0x10, 0x0, 0x0, 0x6f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xd7, 0x10, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xfa, 0x40, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x84, + + /* U+003D "=" */ + 0x5e, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xee, 0xee, 0xee, + 0xee, 0xe5, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+003E ">" */ + 0x47, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x40, 0x0, 0x0, 0x0, 0x18, 0xef, 0xfe, 0x71, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x1, 0x7d, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xe3, 0x0, 0x4, 0xaf, 0xff, 0xb4, 0x0, + 0x18, 0xef, 0xfe, 0x71, 0x0, 0x0, 0x6f, 0xfb, + 0x40, 0x0, 0x0, 0x0, 0x47, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x28, 0xce, 0xfe, 0xc7, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x7f, 0xfb, 0x52, + 0x13, 0xaf, 0xfb, 0x0, 0x96, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xfd, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xca, 0x9a, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xc5, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xd2, 0x0, 0x0, 0x2, 0xef, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, 0xdf, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xd0, 0x0, 0x8f, 0x80, 0x0, 0x7, 0xcf, 0xfc, + 0x60, 0xaf, 0x70, 0x7f, 0x70, 0xf, 0xe0, 0x0, + 0x2d, 0xff, 0xfe, 0xff, 0xcb, 0xf7, 0x0, 0xde, + 0x5, 0xf7, 0x0, 0xd, 0xfd, 0x30, 0x1, 0x7f, + 0xff, 0x70, 0x7, 0xf4, 0x9f, 0x30, 0x6, 0xfe, + 0x10, 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x2f, 0x7c, + 0xf0, 0x0, 0xbf, 0x70, 0x0, 0x0, 0x0, 0xef, + 0x70, 0x0, 0xf9, 0xde, 0x0, 0xd, 0xf3, 0x0, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0xf, 0xad, 0xe0, + 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0xaf, 0x70, + 0x0, 0xf9, 0xbf, 0x0, 0xb, 0xf7, 0x0, 0x0, + 0x0, 0xd, 0xf7, 0x0, 0x2f, 0x79, 0xf3, 0x0, + 0x6f, 0xe0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x6, + 0xf4, 0x5f, 0x70, 0x0, 0xdf, 0xc3, 0x0, 0x7, + 0xff, 0xfb, 0x1, 0xde, 0x0, 0xee, 0x0, 0x2, + 0xdf, 0xfe, 0xdf, 0xfc, 0x3f, 0xfe, 0xff, 0x50, + 0x8, 0xf9, 0x0, 0x0, 0x7c, 0xff, 0xc7, 0x0, + 0x5d, 0xfd, 0x50, 0x0, 0xd, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfc, 0x50, 0x0, + 0x0, 0x2, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfc, 0xaa, 0xbd, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, + 0xd9, 0x40, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x5d, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x6f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf7, 0x0, 0xef, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x10, 0x8, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, + 0x1f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, 0xa, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xff, 0x50, 0x0, 0x0, 0xd, 0xfa, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x7, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0xef, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x5f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, + 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x50, + + /* U+0042 "B" */ + 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x7f, + 0xe0, 0x0, 0x0, 0x2, 0x9f, 0xfa, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x7f, 0xe0, 0x0, + 0x0, 0x2, 0x9f, 0xf5, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x14, 0xcf, 0xf3, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xa7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfd, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xe7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xfc, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x30, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x5f, 0xff, 0xb6, 0x43, 0x59, 0xff, 0xf2, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0x80, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0x80, + 0x0, 0x5f, 0xff, 0xb5, 0x33, 0x49, 0xff, 0xf2, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x5, 0xae, 0xff, 0xda, 0x50, 0x0, + + /* U+0044 "D" */ + 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x7f, 0xe1, 0x11, 0x12, 0x36, 0xbf, 0xff, + 0x40, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xfe, 0x20, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfb, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf2, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x77, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf9, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xa7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf9, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x77, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x20, 0x7f, + 0xe1, 0x11, 0x11, 0x35, 0xbf, 0xff, 0x40, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x0, + + /* U+0045 "E" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xe1, 0x11, + 0x11, 0x11, 0x11, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7, 0xfe, 0x11, 0x11, 0x11, 0x11, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe1, 0x11, 0x11, 0x11, + 0x11, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+0046 "F" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xe1, 0x11, + 0x11, 0x11, 0x11, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x7f, 0xe1, 0x11, 0x11, 0x11, 0x10, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x5f, 0xff, 0xb6, 0x43, 0x48, 0xef, 0xf5, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x9, 0xb0, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7, 0x94, + 0xcf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x3, 0xff, 0xd3, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x0, 0x5f, 0xff, 0xb6, 0x32, 0x47, 0xdf, 0xf7, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x71, 0x0, + + /* U+0048 "H" */ + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x11, 0x11, 0x11, + 0x11, 0x17, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, + + /* U+0049 "I" */ + 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, + 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, + 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, 0x7f, 0xe7, 0xfe, + 0x7f, 0xe0, + + /* U+004A "J" */ + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1, 0x11, 0x11, 0x7f, + 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xd0, + 0x5a, 0x0, 0x0, 0xd, 0xfa, 0xf, 0xfc, 0x41, + 0x3b, 0xff, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x29, 0xdf, 0xfc, 0x60, 0x0, + + /* U+004B "K" */ + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe3, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x7f, 0xfe, 0xfd, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd1, 0x2f, 0xfd, 0x10, 0x0, 0x0, + 0x7f, 0xfe, 0x10, 0x4, 0xff, 0xb0, 0x0, 0x0, + 0x7f, 0xf2, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x10, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xc0, + + /* U+004C "L" */ + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe1, 0x11, 0x11, 0x11, + 0x11, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x67, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf6, 0x7f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x67, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x67, + 0xfd, 0xbf, 0xb0, 0x0, 0x0, 0x0, 0xcf, 0x8e, + 0xf6, 0x7f, 0xd2, 0xff, 0x40, 0x0, 0x0, 0x5f, + 0xe0, 0xef, 0x67, 0xfd, 0x8, 0xfd, 0x0, 0x0, + 0xe, 0xf6, 0xe, 0xf6, 0x7f, 0xd0, 0xe, 0xf7, + 0x0, 0x8, 0xfc, 0x0, 0xef, 0x67, 0xfd, 0x0, + 0x5f, 0xf1, 0x1, 0xff, 0x30, 0xe, 0xf6, 0x7f, + 0xd0, 0x0, 0xbf, 0xa0, 0xaf, 0x90, 0x0, 0xef, + 0x67, 0xfd, 0x0, 0x2, 0xff, 0x7f, 0xe1, 0x0, + 0xe, 0xf6, 0x7f, 0xd0, 0x0, 0x8, 0xff, 0xf6, + 0x0, 0x0, 0xef, 0x67, 0xfd, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0xe, 0xf6, 0x7f, 0xd0, 0x0, + 0x0, 0x5f, 0x40, 0x0, 0x0, 0xef, 0x67, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf6, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x60, + + /* U+004E "N" */ + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf7, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x7f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x7f, 0xf7, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xfd, + 0xfe, 0x20, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x3f, + 0xfd, 0x0, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x5f, + 0xfa, 0x0, 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x8f, + 0xf7, 0x0, 0x7, 0xff, 0x7f, 0xe0, 0x0, 0xbf, + 0xf4, 0x0, 0x7f, 0xf7, 0xfe, 0x0, 0x1, 0xef, + 0xe1, 0x7, 0xff, 0x7f, 0xe0, 0x0, 0x3, 0xff, + 0xc0, 0x7f, 0xf7, 0xfe, 0x0, 0x0, 0x6, 0xff, + 0xa7, 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x9, 0xff, + 0xdf, 0xf7, 0xfe, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, + + /* U+004F "O" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb6, 0x33, + 0x5a, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xfd, 0x30, + 0x0, 0x0, 0x1, 0xcf, 0xf5, 0x0, 0xd, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x4, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfc, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x9f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x70, 0xd, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x3f, 0xfd, 0x30, 0x0, + 0x0, 0x1, 0xcf, 0xf5, 0x0, 0x0, 0x5f, 0xff, + 0xb5, 0x33, 0x59, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x7f, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x7f, + 0xe1, 0x11, 0x12, 0x49, 0xff, 0xe1, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0xfe, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xe0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xf9, 0x7, 0xfe, 0x11, 0x11, 0x24, + 0x8f, 0xfe, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb6, 0x33, + 0x5a, 0xff, 0xf7, 0x0, 0x0, 0x2f, 0xfd, 0x30, + 0x0, 0x0, 0x2, 0xcf, 0xf5, 0x0, 0xd, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, 0x4, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfc, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x70, 0xe, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x4f, 0xfc, 0x20, 0x0, + 0x0, 0x1, 0xbf, 0xf6, 0x0, 0x0, 0x7f, 0xff, + 0xa4, 0x22, 0x48, 0xef, 0xf9, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xff, 0xfd, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf7, + 0x10, 0x4, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xef, 0xea, 0x40, + + /* U+0052 "R" */ + 0x7f, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x7f, + 0xe1, 0x11, 0x12, 0x49, 0xff, 0xe1, 0x7, 0xfe, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x7f, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0xfe, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xe0, 0x7f, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xf8, 0x7, 0xfe, 0x11, 0x11, 0x13, + 0x8f, 0xfe, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x7f, 0xf2, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x1, 0xef, 0x90, + 0x7, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0x40, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xfe, 0x10, + + /* U+0053 "S" */ + 0x0, 0x0, 0x6b, 0xef, 0xfd, 0xa5, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xef, + 0xe7, 0x21, 0x14, 0x8e, 0xc0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x20, 0x9, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xd9, 0x51, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xc5, 0x0, 0x0, + 0x0, 0x1, 0x59, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfe, 0x5, 0x80, 0x0, 0x0, 0x0, + 0xc, 0xfb, 0xd, 0xfe, 0x84, 0x21, 0x25, 0xcf, + 0xf4, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x4, 0x9d, 0xef, 0xec, 0x82, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, + 0x13, 0xff, 0x51, 0x11, 0x11, 0x0, 0x0, 0x2, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + + /* U+0055 "U" */ + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x9a, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf9, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x99, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf9, 0x9f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x87, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf6, 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x20, 0xdf, 0xe1, 0x0, 0x0, 0x1, 0xef, + 0xc0, 0x3, 0xff, 0xe7, 0x32, 0x38, 0xef, 0xf3, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x1, 0x7c, 0xef, 0xec, 0x71, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xfe, 0x0, 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0x70, 0x0, 0xef, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x8, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xf9, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xb0, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x2f, + 0xf4, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, + 0x0, 0x0, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xa0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x10, 0xd, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x5, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, 0xcf, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0x1f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, 0xbf, 0xb0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xc0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0xef, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0x10, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0x1f, 0xf4, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xc0, 0x0, 0x6, 0xff, 0x10, 0x0, + 0x6, 0xfd, 0xc, 0xf8, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0xbf, 0x70, + 0x6f, 0xe0, 0x0, 0x3, 0xff, 0x10, 0x0, 0x0, + 0xcf, 0xb0, 0x0, 0x1f, 0xf2, 0x1, 0xff, 0x30, + 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x6, 0xff, 0x0, + 0x6, 0xfd, 0x0, 0xc, 0xf8, 0x0, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0xbf, 0x70, + 0x0, 0x6f, 0xe0, 0x3, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xcf, 0xb0, 0x1f, 0xf2, 0x0, 0x1, 0xff, + 0x30, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x6, 0xfc, 0x0, 0x0, 0xb, 0xf8, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, 0xcf, 0x70, + 0x0, 0x0, 0x6f, 0xe3, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xcf, 0xf2, 0x0, 0x0, 0x1, + 0xff, 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xe, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe1, + 0x3, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0x50, + 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x1e, 0xf9, 0x0, + 0x0, 0xc, 0xfe, 0x10, 0x0, 0xbf, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0xa0, 0x6, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x2f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfa, 0x9f, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xe1, 0xd, 0xfd, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x40, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x6f, 0xf4, 0x0, + 0x0, 0xdf, 0xd0, 0x0, 0x0, 0xb, 0xfe, 0x10, + 0x9, 0xff, 0x20, 0x0, 0x0, 0x1, 0xef, 0xb0, + 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, + + /* U+0059 "Y" */ + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x50, 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb0, 0x0, 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x4f, + 0xf2, 0x0, 0x1, 0xef, 0x90, 0x0, 0x0, 0xd, + 0xf8, 0x0, 0x0, 0x6, 0xff, 0x20, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x1, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, + 0xaf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe0, + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0x9d, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x11, + 0x11, 0x11, 0x11, 0x11, 0xcf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfa, 0x11, 0x11, 0x11, 0x11, 0x11, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + + /* U+005B "[" */ + 0x7f, 0xff, 0xf8, 0x7f, 0xfe, 0xe7, 0x7f, 0xd0, + 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, + 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, + 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, + 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, + 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, + 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, + 0x0, 0x7f, 0xd0, 0x0, 0x7f, 0xd0, 0x0, 0x7f, + 0xfe, 0xe7, 0x7f, 0xff, 0xf8, + + /* U+005C "\\" */ + 0xbf, 0x50, 0x0, 0x0, 0x0, 0x6, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x5, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x60, 0x0, 0x0, 0x0, 0x5, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, 0x0, + 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x90, 0x0, 0x0, 0x0, 0x2, 0xfe, 0x0, + + /* U+005D "]" */ + 0x8f, 0xff, 0xf7, 0x8e, 0xef, 0xf7, 0x0, 0xd, + 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, + 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, + 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, + 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, + 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, + 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, + 0xf7, 0x0, 0xd, 0xf7, 0x0, 0xd, 0xf7, 0x8e, + 0xef, 0xf7, 0x8f, 0xff, 0xf7, + + /* U+005E "^" */ + 0x0, 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xbf, + 0x10, 0x0, 0x0, 0x7, 0xf5, 0x5f, 0x70, 0x0, + 0x0, 0xd, 0xe0, 0xe, 0xd0, 0x0, 0x0, 0x4f, + 0x80, 0x8, 0xf4, 0x0, 0x0, 0xbf, 0x10, 0x1, + 0xfb, 0x0, 0x2, 0xfa, 0x0, 0x0, 0xaf, 0x20, + 0x9, 0xf4, 0x0, 0x0, 0x4f, 0x80, 0xf, 0xd0, + 0x0, 0x0, 0xd, 0xe0, + + /* U+005F "_" */ + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x8, 0xff, 0x40, 0x0, 0x4, 0xef, 0x60, 0x0, + 0x1, 0xbf, 0x70, + + /* U+0061 "a" */ + 0x0, 0x6b, 0xef, 0xfd, 0x81, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0xe, 0xb5, 0x10, 0x27, + 0xff, 0xb0, 0x1, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0x0, 0x37, + 0xaa, 0xaa, 0xaf, 0xf4, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x6f, 0xf6, 0x10, 0x0, 0xf, 0xf4, + 0xbf, 0x90, 0x0, 0x0, 0xf, 0xf4, 0xcf, 0x80, + 0x0, 0x0, 0x5f, 0xf4, 0x8f, 0xe2, 0x0, 0x4, + 0xff, 0xf4, 0x1d, 0xff, 0xcb, 0xdf, 0xdf, 0xf4, + 0x1, 0x8d, 0xff, 0xd8, 0xe, 0xf4, + + /* U+0062 "b" */ + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x70, 0x7c, 0xfe, 0xc7, + 0x10, 0x0, 0xdf, 0x9d, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0xdf, 0xff, 0xa3, 0x12, 0x6e, 0xfe, 0x20, + 0xdf, 0xf8, 0x0, 0x0, 0x1, 0xef, 0xa0, 0xdf, + 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf1, 0xdf, 0x90, + 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0xf, 0xf5, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x1f, 0xf3, 0xdf, 0xe0, 0x0, 0x0, 0x0, + 0x6f, 0xf1, 0xdf, 0xf8, 0x0, 0x0, 0x2, 0xef, + 0xa0, 0xdf, 0xff, 0xa3, 0x12, 0x6e, 0xff, 0x20, + 0xdf, 0x8d, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xdf, + 0x60, 0x7d, 0xfe, 0xc7, 0x10, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3, 0xad, 0xfe, 0xc6, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xc1, 0x9, 0xff, 0x93, 0x12, + 0x7f, 0xfa, 0x4f, 0xf6, 0x0, 0x0, 0x3, 0x91, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, + 0x0, 0x0, 0x2, 0x91, 0x9, 0xff, 0x93, 0x12, + 0x7f, 0xfa, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x3, 0xad, 0xfe, 0xc6, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xf3, 0x0, 0x5, 0xbe, 0xfe, 0x92, + 0x2f, 0xf3, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x7f, + 0xf3, 0xb, 0xff, 0x93, 0x12, 0x7f, 0xff, 0xf3, + 0x5f, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xf3, 0xbf, + 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1f, 0xf3, 0xdf, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xf3, 0xbf, 0xb0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x5f, 0xf5, 0x0, 0x0, 0x2, 0xff, + 0xf3, 0xb, 0xff, 0x71, 0x0, 0x5e, 0xff, 0xf3, + 0x1, 0xbf, 0xff, 0xef, 0xff, 0x7f, 0xf3, 0x0, + 0x5, 0xbe, 0xfe, 0xa3, 0xf, 0xf3, + + /* U+0065 "e" */ + 0x0, 0x5, 0xbe, 0xfd, 0xa3, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xfe, 0x61, + 0x2, 0x8f, 0xf7, 0x4, 0xff, 0x20, 0x0, 0x0, + 0x5f, 0xf1, 0xaf, 0x90, 0x0, 0x0, 0x0, 0xcf, + 0x6d, 0xfc, 0xbb, 0xbb, 0xbb, 0xbd, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x60, 0x0, 0x0, 0x6, + 0x0, 0xa, 0xff, 0xa3, 0x11, 0x4b, 0xf8, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3, + 0xad, 0xff, 0xd8, 0x10, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x8d, 0xfe, 0xa1, 0x0, 0xb, 0xff, + 0xff, 0xf0, 0x0, 0x4f, 0xf5, 0x0, 0x30, 0x0, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x70, 0x9e, 0xff, + 0xfe, 0xee, 0x60, 0x0, 0x7f, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, + 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x5, 0xbe, 0xfe, 0xa3, 0xd, 0xf5, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x8d, 0xf5, 0xb, 0xff, + 0x93, 0x12, 0x6e, 0xff, 0xf5, 0x4f, 0xf6, 0x0, + 0x0, 0x1, 0xef, 0xf5, 0xbf, 0xc0, 0x0, 0x0, + 0x0, 0x5f, 0xf5, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0xf, 0xf5, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, + 0xf5, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xf, 0xf5, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xf5, 0x4f, + 0xf6, 0x0, 0x0, 0x1, 0xef, 0xf5, 0xa, 0xff, + 0xa3, 0x12, 0x6e, 0xff, 0xf5, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x8f, 0xf5, 0x0, 0x5, 0xbe, 0xfe, + 0xa3, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf1, 0x3, 0x10, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0xd, 0xf9, 0x52, 0x11, 0x4b, 0xff, 0x50, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x28, 0xce, 0xff, 0xd9, 0x30, 0x0, + + /* U+0068 "h" */ + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf7, 0x18, 0xdf, 0xfc, 0x70, 0x0, 0xdf, + 0xae, 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xf8, + 0x31, 0x4a, 0xff, 0x90, 0xdf, 0xf5, 0x0, 0x0, + 0xa, 0xff, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x3f, + 0xf2, 0xdf, 0x80, 0x0, 0x0, 0x1, 0xff, 0x3d, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0xff, 0x4d, 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, + 0x0, 0x0, 0x0, 0xf, 0xf4, + + /* U+0069 "i" */ + 0xb, 0xf6, 0x2f, 0xfd, 0xb, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, + 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, + 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, 0xd, 0xf7, + 0xd, 0xf7, 0xd, 0xf7, + + /* U+006A "j" */ + 0x0, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, 0xf9, 0x0, + 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, 0xf9, + 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, 0xb, + 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, + 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, 0x90, + 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0x90, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, + 0xdf, 0x80, 0x4, 0x20, 0x5f, 0xf4, 0x0, 0xef, + 0xff, 0xfc, 0x0, 0x9, 0xef, 0xe9, 0x0, 0x0, + + /* U+006B "k" */ + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf7, 0x0, 0x0, 0x3, 0xef, 0xa0, 0xdf, + 0x70, 0x0, 0x3, 0xff, 0xb0, 0xd, 0xf7, 0x0, + 0x4, 0xff, 0xb0, 0x0, 0xdf, 0x70, 0x5, 0xff, + 0xb0, 0x0, 0xd, 0xf7, 0x6, 0xff, 0xb0, 0x0, + 0x0, 0xdf, 0x77, 0xff, 0xf1, 0x0, 0x0, 0xd, + 0xfe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, 0xff, + 0x87, 0xff, 0x70, 0x0, 0xd, 0xff, 0x70, 0xa, + 0xff, 0x40, 0x0, 0xdf, 0x90, 0x0, 0xd, 0xfe, + 0x10, 0xd, 0xf7, 0x0, 0x0, 0x2e, 0xfc, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x4f, 0xf9, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0x7f, 0xf5, + + /* U+006C "l" */ + 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, + 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, + 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, 0xdf, 0x7d, 0xf7, + 0xdf, 0x7d, 0xf7, + + /* U+006D "m" */ + 0xdf, 0x61, 0x9d, 0xfe, 0xb5, 0x0, 0x7, 0xcf, + 0xfd, 0x80, 0x0, 0xdf, 0xaf, 0xff, 0xff, 0xff, + 0x92, 0xef, 0xff, 0xff, 0xfd, 0x10, 0xdf, 0xfe, + 0x60, 0x3, 0xcf, 0xff, 0xfa, 0x20, 0x17, 0xff, + 0xa0, 0xdf, 0xf3, 0x0, 0x0, 0xe, 0xff, 0xa0, + 0x0, 0x0, 0x8f, 0xf0, 0xdf, 0xc0, 0x0, 0x0, + 0x9, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xf3, 0xdf, + 0x80, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, + 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, + 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, + 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, + 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, + 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, + 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x6, 0xfe, 0x0, + 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, + 0x6, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xf4, + + /* U+006E "n" */ + 0xdf, 0x61, 0x8d, 0xff, 0xc7, 0x0, 0xd, 0xf9, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0x61, + 0x2, 0x8f, 0xf9, 0xd, 0xff, 0x40, 0x0, 0x0, + 0x9f, 0xf0, 0xdf, 0xc0, 0x0, 0x0, 0x3, 0xff, + 0x2d, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xf3, 0xdf, + 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, 0xf7, 0x0, + 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, 0x0, 0x0, + 0x0, 0xff, 0x4d, 0xf7, 0x0, 0x0, 0x0, 0xf, + 0xf4, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xff, 0x4d, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0xff, 0x40, + + /* U+006F "o" */ + 0x0, 0x4, 0xad, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0xa, 0xff, + 0x93, 0x12, 0x7f, 0xfd, 0x0, 0x4f, 0xf6, 0x0, + 0x0, 0x3, 0xff, 0x80, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x8f, 0xe0, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0x3f, 0xf1, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, + 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xf1, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xe0, 0x4f, + 0xf6, 0x0, 0x0, 0x3, 0xff, 0x80, 0xa, 0xff, + 0x93, 0x12, 0x7f, 0xfd, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x4, 0xad, 0xfe, + 0xb5, 0x0, 0x0, + + /* U+0070 "p" */ + 0xdf, 0x61, 0x8d, 0xfe, 0xc7, 0x10, 0x0, 0xdf, + 0x8e, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xdf, 0xff, + 0x92, 0x0, 0x5d, 0xfe, 0x20, 0xdf, 0xf7, 0x0, + 0x0, 0x1, 0xef, 0xa0, 0xdf, 0xd0, 0x0, 0x0, + 0x0, 0x5f, 0xf1, 0xdf, 0x90, 0x0, 0x0, 0x0, + 0x1f, 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0xf, + 0xf5, 0xdf, 0x90, 0x0, 0x0, 0x0, 0x1f, 0xf3, + 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0xf1, 0xdf, + 0xf8, 0x0, 0x0, 0x2, 0xef, 0xa0, 0xdf, 0xff, + 0xa3, 0x12, 0x6e, 0xff, 0x20, 0xdf, 0x9d, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0xdf, 0x70, 0x7c, 0xfe, + 0xc7, 0x10, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x5, 0xbe, 0xfe, 0xa2, 0xf, 0xf3, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0x6f, 0xf3, 0xb, 0xff, + 0x93, 0x12, 0x7f, 0xff, 0xf3, 0x5f, 0xf6, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0xbf, 0xc0, 0x0, 0x0, + 0x0, 0x8f, 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, + 0x3f, 0xf3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, + 0xf3, 0xdf, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x5f, + 0xf6, 0x0, 0x0, 0x3, 0xff, 0xf3, 0xb, 0xff, + 0x93, 0x12, 0x7f, 0xff, 0xf3, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0x7f, 0xf3, 0x0, 0x5, 0xbe, 0xfe, + 0x92, 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf3, + + /* U+0072 "r" */ + 0xdf, 0x61, 0x8d, 0xf0, 0xdf, 0x7e, 0xff, 0xf0, + 0xdf, 0xff, 0xb5, 0x40, 0xdf, 0xf7, 0x0, 0x0, + 0xdf, 0xd0, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0xdf, 0x70, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x18, 0xcf, 0xfe, 0xb7, 0x10, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xb0, 0xb, 0xfe, 0x41, 0x2, + 0x6c, 0x30, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xd9, 0x52, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xe9, 0x10, 0x0, 0x0, 0x47, 0xad, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x1, 0x0, + 0x0, 0x0, 0xf, 0xf4, 0xe, 0xc6, 0x20, 0x3, + 0xaf, 0xf1, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, + + /* U+0074 "t" */ + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x70, 0x9e, 0xff, 0xfe, 0xee, + 0x60, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x4f, 0xf7, 0x1, 0x50, 0x0, 0xc, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x9e, 0xfd, 0x81, + + /* U+0075 "u" */ + 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, 0xf, 0xf6, + 0x0, 0x0, 0x0, 0x4f, 0xf0, 0xff, 0x60, 0x0, + 0x0, 0x4, 0xff, 0xf, 0xf6, 0x0, 0x0, 0x0, + 0x4f, 0xf0, 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, + 0xf, 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0xff, + 0x60, 0x0, 0x0, 0x4, 0xff, 0xe, 0xf6, 0x0, + 0x0, 0x0, 0x5f, 0xf0, 0xdf, 0x80, 0x0, 0x0, + 0x8, 0xff, 0xa, 0xfe, 0x0, 0x0, 0x1, 0xef, + 0xf0, 0x3f, 0xfb, 0x20, 0x4, 0xdf, 0xff, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0x9f, 0xf0, 0x0, 0x4b, + 0xef, 0xea, 0x32, 0xff, 0x0, + + /* U+0076 "v" */ + 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, + 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0xef, 0x60, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x8, + 0xfd, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x2f, + 0xf3, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xbf, + 0xa0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x4, 0xff, + 0x10, 0x9, 0xfa, 0x0, 0x0, 0x0, 0xd, 0xf7, + 0x1, 0xff, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xe0, + 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x5d, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, + 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0x80, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, + 0x0, 0xc, 0xf4, 0x5f, 0xd0, 0x0, 0x0, 0xb, + 0xff, 0x50, 0x0, 0x0, 0x2f, 0xe0, 0xe, 0xf3, + 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x8f, + 0x80, 0x9, 0xf9, 0x0, 0x0, 0x7f, 0xbf, 0xf1, + 0x0, 0x0, 0xef, 0x20, 0x3, 0xfe, 0x0, 0x0, + 0xcf, 0x4b, 0xf7, 0x0, 0x4, 0xfc, 0x0, 0x0, + 0xdf, 0x40, 0x2, 0xfe, 0x5, 0xfc, 0x0, 0xa, + 0xf6, 0x0, 0x0, 0x7f, 0xa0, 0x8, 0xf8, 0x0, + 0xef, 0x20, 0xf, 0xf1, 0x0, 0x0, 0x2f, 0xf0, + 0xe, 0xf2, 0x0, 0x9f, 0x80, 0x5f, 0xb0, 0x0, + 0x0, 0xc, 0xf5, 0x4f, 0xc0, 0x0, 0x3f, 0xe0, + 0xbf, 0x50, 0x0, 0x0, 0x6, 0xfb, 0xaf, 0x60, + 0x0, 0xd, 0xf5, 0xfe, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x1e, 0xf8, 0x0, 0x0, 0x4, 0xff, 0x40, 0x4f, + 0xf4, 0x0, 0x1, 0xef, 0x80, 0x0, 0x8f, 0xe1, + 0x0, 0xbf, 0xb0, 0x0, 0x0, 0xcf, 0xb0, 0x7f, + 0xe1, 0x0, 0x0, 0x1, 0xef, 0xaf, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0x5e, + 0xf7, 0x0, 0x0, 0x1, 0xef, 0x80, 0x4f, 0xf3, + 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x8f, 0xe1, 0x0, + 0x8f, 0xe1, 0x0, 0x0, 0xcf, 0xb0, 0x4f, 0xf4, + 0x0, 0x0, 0x2, 0xff, 0x80, + + /* U+0079 "y" */ + 0xd, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, + 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0xef, 0x60, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x8, + 0xfd, 0x0, 0x0, 0x4, 0xfe, 0x0, 0x0, 0x2f, + 0xf4, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x4, 0xff, + 0x10, 0x8, 0xfa, 0x0, 0x0, 0x0, 0xd, 0xf8, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xe0, + 0x6f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x6c, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa4, 0x2, 0xcf, 0xb0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xfe, 0x91, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xd, 0xee, + 0xee, 0xee, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x7f, + 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xee, 0xee, 0xee, 0xe8, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+007B "{" */ + 0x0, 0x3, 0xce, 0xf0, 0x2, 0xff, 0xfe, 0x0, + 0x8f, 0xe2, 0x0, 0xa, 0xfa, 0x0, 0x0, 0xbf, + 0x90, 0x0, 0xb, 0xf9, 0x0, 0x0, 0xbf, 0x90, + 0x0, 0xb, 0xf9, 0x0, 0x0, 0xbf, 0x90, 0x0, + 0xb, 0xf9, 0x0, 0x1, 0xef, 0x70, 0xa, 0xff, + 0xd1, 0x0, 0x9f, 0xfe, 0x20, 0x0, 0xd, 0xf8, + 0x0, 0x0, 0xbf, 0x90, 0x0, 0xb, 0xf9, 0x0, + 0x0, 0xbf, 0x90, 0x0, 0xb, 0xf9, 0x0, 0x0, + 0xbf, 0x90, 0x0, 0xb, 0xfa, 0x0, 0x0, 0x9f, + 0xe2, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x4, 0xcf, + 0xf0, + + /* U+007C "|" */ + 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, + 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, + 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, + 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, 0xfa, 0x7f, 0xa7, + 0xfa, 0x7f, 0xa0, + + /* U+007D "}" */ + 0x8f, 0xd7, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x3f, 0xf1, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0xf, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xf0, + 0x0, 0x9, 0xff, 0xf0, 0x0, 0x1f, 0xf5, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x9f, 0xf0, 0x0, 0x8f, 0xff, 0xa0, 0x0, + 0x8f, 0xd8, 0x0, 0x0, + + /* U+007E "~" */ + 0x3, 0xcf, 0xd5, 0x0, 0x0, 0xf8, 0xe, 0xfd, + 0xff, 0x90, 0x5, 0xf5, 0x6f, 0x60, 0x1b, 0xfe, + 0xbf, 0xe0, 0x8f, 0x0, 0x0, 0x6d, 0xfc, 0x20, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, + 0x1e, 0xc5, 0x5c, 0xe2, 0x9d, 0x0, 0x0, 0xda, + 0xd8, 0x0, 0x0, 0x7e, 0xd7, 0x0, 0x0, 0x7e, + 0xac, 0x0, 0x0, 0xcb, 0x3f, 0xa2, 0x2a, 0xf3, + 0x4, 0xef, 0xfe, 0x40, 0x0, 0x2, 0x20, 0x0, + + /* U+2022 "•" */ + 0x1, 0x64, 0x1, 0xef, 0xf7, 0x5f, 0xff, 0xd4, + 0xff, 0xfc, 0x8, 0xfd, 0x20, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xdf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x30, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x3a, 0xdf, 0xef, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0x3, 0xad, 0xfe, 0xff, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfe, + 0x6f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xea, 0x30, + 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xae, 0xfe, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xb7, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x7b, 0xfd, 0x88, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x88, 0xdf, + 0xff, 0xff, 0xff, 0xb4, 0x44, 0x44, 0x44, 0x44, + 0x5f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf5, 0x0, 0x9f, + 0xf8, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf4, 0x0, 0x8f, 0xf9, 0x0, 0xcf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf5, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfd, 0x88, 0xef, 0xa2, + 0x22, 0x22, 0x22, 0x22, 0x3f, 0xfb, 0x88, 0xdf, + 0xf8, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x8f, 0xf8, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8f, + 0xfd, 0x88, 0xef, 0xa2, 0x22, 0x22, 0x22, 0x22, + 0x3f, 0xfb, 0x88, 0xdf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf5, 0x0, 0x9f, 0xf8, 0x0, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x8f, + 0xf9, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf5, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xb4, + 0x44, 0x44, 0x44, 0x44, 0x5f, 0xff, 0xff, 0xff, + 0xfd, 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x88, 0xdf, 0xb7, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7b, + + /* U+F00B "" */ + 0x14, 0x44, 0x44, 0x10, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x41, 0xef, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7b, 0xbb, 0xbb, 0x60, 0x2a, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xb0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xb0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x10, + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0xef, 0xff, 0xff, 0xe0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, 0x60, + 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, + 0x2, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xd1, 0x0, 0x2e, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xdf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, + 0x0, 0xc, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xcc, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x1, 0x41, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, + 0x1, 0xdf, 0xd2, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x70, 0xcf, 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x4e, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, + 0xff, 0xf6, 0x4f, 0xff, 0xff, 0xe2, 0x8, 0xff, + 0xff, 0xfb, 0x0, 0x4f, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, + 0xff, 0xfb, 0x5f, 0xff, 0xff, 0xe2, 0x7, 0xff, + 0xff, 0xfb, 0x0, 0x4f, 0xff, 0xff, 0xe1, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x7a, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0xef, 0xfd, 0x0, + 0x7, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf3, + 0x0, 0xef, 0xfd, 0x0, 0x5f, 0xfb, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0xef, 0xfd, 0x0, + 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0xef, 0xfd, 0x0, 0x7f, 0xff, 0xf7, 0x0, + 0x3, 0xff, 0xff, 0x60, 0x0, 0xef, 0xfd, 0x0, + 0x8, 0xff, 0xff, 0x20, 0xa, 0xff, 0xf9, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0xbf, 0xff, 0x90, + 0x1f, 0xff, 0xe0, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x1f, 0xff, 0xf0, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0xa, 0xff, 0xf3, + 0x8f, 0xff, 0x40, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x6, 0xff, 0xf6, 0x9f, 0xff, 0x20, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0x4, 0xff, 0xf8, + 0x9f, 0xff, 0x20, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x8f, 0xff, 0x40, 0x0, + 0x0, 0x37, 0x72, 0x0, 0x0, 0x6, 0xff, 0xf6, + 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, + 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xa0, 0x3, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, + 0x9f, 0xff, 0xf8, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe8, 0x42, 0x24, 0x9e, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x89, 0x97, 0x51, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x89, 0x98, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xc3, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x3c, 0xc0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x94, 0x49, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x6, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x1e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe1, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfe, 0x60, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x94, 0x49, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xc3, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x3c, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x89, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x10, + 0x0, 0x2, 0x44, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x40, 0x0, 0xdf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x70, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xb3, 0xbf, 0xff, 0xce, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x5d, + 0x50, 0x6f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x30, 0x8f, 0xff, 0x70, 0x4e, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfd, + 0x20, 0xaf, 0xff, 0xff, 0xa0, 0x2d, 0xff, 0xfb, + 0x0, 0x0, 0x2d, 0xff, 0xfb, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xc1, 0xb, 0xff, 0xfd, 0x20, 0x4f, + 0xff, 0xf8, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x8, 0xff, 0xfe, 0x4e, 0xff, 0xf5, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x5, + 0xff, 0xfe, 0x4f, 0xe3, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3, 0xef, 0x40, + 0x41, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x1, 0x40, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xeb, 0xbb, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x4f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xbb, 0xbb, + 0xba, 0x10, 0x0, 0x1a, 0xbb, 0xbb, 0xb3, 0x0, + 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0xdd, 0xdd, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xdd, + 0xdf, 0xff, 0xff, 0xfd, 0xdd, 0xda, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x55, 0x55, 0x55, 0x11, 0xdf, 0xfd, 0x11, + 0x55, 0x55, 0x55, 0x52, 0xef, 0xff, 0xff, 0xff, + 0xd1, 0x1d, 0xd1, 0x1d, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x71, 0xe7, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0xfb, 0x6f, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F01C "" */ + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, 0x0, 0x1e, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x10, 0x0, 0xa, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfa, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x1, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xe1, 0xaf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x32, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x67, 0x75, 0x20, 0x0, 0x0, 0x4f, 0xff, + 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xfd, + 0x70, 0x0, 0x4f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x3f, 0xff, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xfb, 0x3f, 0xff, 0x0, 0xd, 0xff, 0xff, + 0xb4, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xdf, 0xff, + 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0x4, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xee, 0xef, 0xff, 0xff, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4, 0x43, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x34, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf1, 0xff, 0xff, 0xfd, 0xee, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0x40, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xfa, 0x0, + 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xd0, 0x0, 0xff, 0xf3, 0xbf, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0xff, 0xf3, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x17, + 0xdf, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0xff, 0xf4, 0x0, 0x0, 0x2, 0x67, 0x76, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xa7, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0x14, 0x44, 0x44, 0xcf, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, + 0xbb, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x13, 0x33, 0x33, 0xcf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4a, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xe1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3e, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x5, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x2e, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xcf, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5b, 0x30, 0x7c, 0xcc, 0xcc, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x70, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x0, 0x0, 0x6, 0x30, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf0, 0x0, 0x3, 0xff, 0x70, 0x8, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x0, + 0x0, 0xc, 0xff, 0x70, 0xc, 0xfc, 0x1, 0x44, + 0x44, 0x4c, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0x30, 0x4f, 0xf3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5a, 0x20, 0xc, 0xfb, 0x0, + 0xdf, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xfe, 0x20, 0x4f, 0xf1, 0x8, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2e, 0xfa, + 0x0, 0xff, 0x50, 0x5f, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x6f, 0xe0, 0xc, 0xf7, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x6, 0xfe, 0x0, 0xcf, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0xef, + 0xa0, 0xf, 0xf5, 0x6, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xcf, 0xe2, 0x4, 0xff, + 0x10, 0x9f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x4, 0xa2, 0x0, 0xcf, 0xb0, 0xd, 0xf8, + 0x7b, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xf3, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xf7, + 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x6f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0x0, 0x53, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xca, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x42, 0x8f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6b, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xbf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0xc, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xef, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3c, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x8f, 0xfc, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1, 0xff, 0xf9, 0x2, 0x7c, 0xff, 0xff, + 0xff, 0x50, 0x7, 0xff, 0xfb, 0x40, 0x6f, 0xff, + 0xff, 0xb0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, + 0xda, 0x40, 0x0, 0x0, + + /* U+F048 "" */ + 0x34, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x1d, 0xfb, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xea, 0xbb, 0x30, + 0x0, 0x0, 0x0, 0x5, 0xb4, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F04C "" */ + 0x19, 0xcc, 0xcc, 0xc9, 0x10, 0x0, 0x19, 0xcc, + 0xcc, 0xc9, 0x1b, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x50, 0x13, 0x33, 0x33, + 0x10, 0x0, 0x0, 0x13, 0x33, 0x33, 0x10, + + /* U+F04D "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x8b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x81, + + /* U+F051 "" */ + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x3b, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x86, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x16, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xba, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x40, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+F054 "" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x43, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x77, 0x77, 0x77, 0x7d, 0xff, 0xfd, 0x77, + 0x77, 0x77, 0x71, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xab, 0xa2, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x76, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xe9, 0x54, 0x59, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x70, 0x0, 0x14, 0x20, 0x0, 0x7f, + 0xff, 0xfe, 0x20, 0x0, 0x1e, 0xff, 0xff, 0xb0, + 0x0, 0x6, 0xff, 0xc2, 0x0, 0xbf, 0xff, 0xfe, + 0x10, 0xb, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x5f, + 0xff, 0xe2, 0x3, 0xff, 0xff, 0xfb, 0x6, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xf5, 0xef, 0xff, 0xff, 0xc0, + 0xd, 0xcf, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0xff, 0xee, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xfe, 0x5f, + 0xff, 0xff, 0xe0, 0xc, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xef, 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, + 0x30, 0x4f, 0xff, 0xff, 0xff, 0x50, 0x3f, 0xff, + 0xff, 0xb0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0x80, 0xb, 0xff, 0xff, 0xe1, 0x0, + 0x2, 0xef, 0xff, 0xf7, 0x0, 0x39, 0xb9, 0x30, + 0x7, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, + 0x95, 0x45, 0x9e, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, 0x71, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x5, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfe, 0x40, 0x0, 0x48, 0xce, 0xff, 0xeb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xb6, 0x45, 0x7d, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf6, 0x1, 0x76, 0x20, 0x4, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x4e, 0xff, 0xfa, 0x1f, 0xff, 0x90, 0x8, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x6e, 0x40, 0x0, + 0x2c, 0xff, 0xfd, 0xff, 0xff, 0x80, 0xf, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, 0xff, + 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xb1, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf3, 0x9, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x9f, 0xff, 0xff, 0xd1, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0x30, 0x9f, 0xff, 0xff, + 0xf1, 0x0, 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x1, 0xbf, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf7, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x64, 0x51, + 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x2, 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9d, 0xef, 0xfe, 0xa1, + 0x0, 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xc0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xa4, 0x44, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf7, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x80, + 0x0, 0x8f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x0, 0x9, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x26, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x30, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x0, 0x9b, 0xbb, 0xbb, 0x30, + 0x0, 0x0, 0x0, 0x3b, 0xbb, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3e, 0xff, + 0xe2, 0xc, 0xff, 0xfe, 0x20, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x3, 0xff, 0x30, 0xaf, 0xff, 0xf3, + 0x0, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x54, + 0x9, 0xff, 0xff, 0x40, 0x0, 0xbe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x4, 0x50, + 0x0, 0xbe, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xa0, 0x3f, 0xf3, 0x0, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xfc, 0x2, 0xef, 0xfe, + 0x30, 0xff, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9b, 0xbb, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x3b, + 0xbb, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfd, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf9, 0xa, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0xa, + 0xff, 0xff, 0x90, 0x0, 0x0, 0xaf, 0xff, 0xf9, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x0, 0xaf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x90, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x79, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0xb, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, + + /* U+F078 "" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0xbf, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xa0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x89, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf7, 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, + 0x90, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0xaf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0xaf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x3, 0xd9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xfa, 0x0, 0x0, 0x34, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x5, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xef, 0xfe, + 0xdf, 0xfb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf1, 0x0, 0x0, 0xd, 0xfe, 0x2b, + 0xff, 0x48, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x10, 0x0, 0x0, 0x17, 0x20, 0xbf, + 0xf4, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0xef, 0xf1, + 0x4f, 0xc0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x6e, 0xff, 0x5f, + 0xff, 0x60, 0x0, 0x0, 0xbf, 0xf7, 0x44, 0x44, + 0x44, 0x44, 0x20, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xbf, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0x60, 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, + 0x2f, 0xff, 0xff, 0xf2, 0x22, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x55, 0x55, 0x52, 0xf, 0xff, 0xff, 0xf0, + 0x25, 0x55, 0x55, 0x52, 0xef, 0xff, 0xff, 0xf9, + 0xc, 0xff, 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x1, 0x10, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x88, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x71, 0xe7, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0xfb, 0x6f, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xea, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x3a, 0xff, 0xa0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0x70, 0x3, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x6a, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0xc9, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x2, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x73, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x90, 0xaf, 0xff, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xb0, 0xef, 0xf4, 0x4, 0xff, + 0xe0, 0x0, 0x9, 0xff, 0xff, 0xfb, 0x0, 0xff, + 0xf1, 0x1, 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xff, + 0xb0, 0x0, 0xcf, 0xfb, 0x5b, 0xff, 0xc0, 0x9, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xf5, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xbe, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0xef, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xff, 0xcf, + 0xff, 0xd0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0xef, 0xf4, 0x4, 0xff, 0xe0, 0x2, 0xef, 0xff, + 0xff, 0x50, 0x0, 0xff, 0xf1, 0x1, 0xff, 0xf0, + 0x0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xfb, + 0x5b, 0xff, 0xc0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x5f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xd0, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xae, 0xea, 0x20, 0x0, + 0x39, 0xb9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xfb, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x8, + 0xff, 0xfa, 0x47, 0x88, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x48, 0x88, 0x7f, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x74, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, + 0xff, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, + 0xf8, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf8, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x54, 0x44, 0x44, 0x44, 0x44, 0x45, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xce, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x8b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x81, + + /* U+F0C9 "" */ + 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x57, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xeb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x31, + + /* U+F0E0 "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xe4, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x4e, 0xff, 0x80, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x8, 0xff, + 0xff, 0xfc, 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x4, + 0xef, 0xff, 0xff, 0xfe, 0x40, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x1c, 0xff, 0xff, 0xb1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x6d, 0xd6, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd9, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F0E7 "" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xc8, 0x88, 0x87, 0x30, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x37, + 0x88, 0x88, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x70, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x3, 0xdf, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x78, 0x88, 0xff, 0xef, 0xf8, + 0x88, 0x74, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x90, 0x9f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf9, 0x9, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf4, 0x7, 0x88, 0x88, + 0x88, 0x3, 0x30, 0x0, 0xff, 0xff, 0xff, 0x7, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0x40, 0xf, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0x8, 0xff, + 0x40, 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0x4f, 0xff, 0xff, 0xf0, 0x8f, + 0xff, 0xff, 0xff, 0x8, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xb8, 0x88, 0x88, 0xff, 0xff, 0xff, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x78, 0x88, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6f, 0xff, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xc3, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0x90, 0x9, 0xf1, 0x1, + 0xf9, 0x0, 0x9f, 0x10, 0x1f, 0xff, 0xff, 0xf0, + 0x0, 0xf8, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x8, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0x10, 0x1f, 0x90, + 0x9, 0xf1, 0x1, 0xf9, 0x0, 0x9f, 0x10, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb8, 0x8f, 0xe8, 0x8b, 0xfb, 0x88, 0xfe, + 0x88, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xcc, 0x0, 0x4f, 0x40, 0xc, 0xc0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, 0xc0, 0x4, + 0xf4, 0x0, 0xcc, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x88, 0xfe, 0x88, 0xbf, 0xb8, 0x8f, + 0xe8, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf1, 0x1, 0xff, 0xff, + 0xff, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0xf, 0xff, 0xff, 0xf1, 0x1, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf1, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x57, + 0x88, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe4, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x56, 0x77, 0x65, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x50, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc9, 0x65, 0x44, 0x56, 0x9c, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x1c, 0xff, 0xff, 0xfd, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xff, + 0xc1, 0xdf, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x9, + 0xf6, 0x0, 0x0, 0x0, 0x48, 0xcd, 0xff, 0xdc, + 0x84, 0x0, 0x0, 0x0, 0x6f, 0x90, 0x0, 0x10, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xc5, 0x10, 0x0, 0x1, 0x5c, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xaa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F240 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F241 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F242 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F243 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0xbf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F244 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xa1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x4f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4a, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x18, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x7d, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xf5, 0x3a, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xf6, 0x0, 0x9, 0xda, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x50, + 0x0, 0x6f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa4, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x30, + 0x1e, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x10, 0xe, 0xff, 0xff, 0xfd, 0xbe, + 0xfe, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xff, 0xff, 0x60, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x1c, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xd4, 0x0, 0x1c, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x2f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x70, + 0x0, 0x0, 0x4, 0x63, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfb, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xf8, 0x4b, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x5c, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfe, 0xa6, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, 0xff, + 0xff, 0x5, 0xff, 0xff, 0xfe, 0x10, 0x2, 0xff, + 0xff, 0xff, 0xf0, 0x5, 0xff, 0xff, 0xf8, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xfc, 0xff, 0xf0, 0x16, 0x7, + 0xff, 0xff, 0x21, 0xff, 0xf8, 0x9, 0xff, 0x1, + 0xf6, 0x7, 0xff, 0xf5, 0x4f, 0xff, 0xd1, 0x9, + 0xf0, 0x1f, 0x70, 0x6f, 0xff, 0x86, 0xff, 0xff, + 0xd1, 0x7, 0x1, 0x70, 0x5f, 0xff, 0xf9, 0x7f, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xa7, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x2e, 0xff, + 0xff, 0xfb, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x5, + 0xff, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xfa, 0x6f, 0xff, 0xff, + 0x40, 0x30, 0x3, 0x7, 0xff, 0xff, 0xa4, 0xff, + 0xff, 0x40, 0x4e, 0x1, 0xe2, 0x8, 0xff, 0xf8, + 0x2f, 0xff, 0x70, 0x4f, 0xf0, 0x1f, 0x90, 0x2f, + 0xff, 0x60, 0xef, 0xff, 0x7f, 0xff, 0x1, 0xb0, + 0x2e, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x0, 0x2e, 0xff, 0xff, 0x90, 0x0, 0xbf, + 0xff, 0xff, 0xf0, 0x2e, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, + 0xec, 0x82, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x1a, 0xcc, 0xcc, 0xca, 0x10, + 0x0, 0x0, 0x2, 0x44, 0x44, 0x49, 0xff, 0xff, + 0xff, 0xf9, 0x44, 0x44, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0x66, 0xff, 0xd1, 0xdf, 0xf6, 0x6f, 0xff, + 0x80, 0x8, 0xff, 0xf4, 0x4f, 0xfc, 0xc, 0xff, + 0x44, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x44, 0xff, + 0xc0, 0xcf, 0xf4, 0x4f, 0xff, 0x80, 0x8, 0xff, + 0xf4, 0x4f, 0xfc, 0xc, 0xff, 0x44, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0x44, 0xff, 0xc0, 0xcf, 0xf4, + 0x4f, 0xff, 0x80, 0x8, 0xff, 0xf4, 0x4f, 0xfc, + 0xc, 0xff, 0x44, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0x44, 0xff, 0xc0, 0xcf, 0xf4, 0x4f, 0xff, 0x80, + 0x8, 0xff, 0xf4, 0x4f, 0xfc, 0xc, 0xff, 0x44, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x44, 0xff, 0xc0, + 0xcf, 0xf4, 0x4f, 0xff, 0x80, 0x8, 0xff, 0xf4, + 0x4f, 0xfc, 0xc, 0xff, 0x44, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0x44, 0xff, 0xc0, 0xcf, 0xf4, 0x4f, + 0xff, 0x80, 0x8, 0xff, 0xf6, 0x6f, 0xfd, 0x1d, + 0xff, 0x66, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x3f, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xb0, 0x3f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xb0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, 0x3f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xdb, 0xa8, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xf8, 0x6, 0xff, 0xff, 0x60, 0x8f, + 0xff, 0xff, 0xff, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x6f, 0xf6, 0x0, 0xc, 0xff, + 0xff, 0xff, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x6, 0x60, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x6, 0x60, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xf6, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xf8, 0x6, 0xff, 0xff, 0x60, 0x8f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xf4, 0x8, 0xf0, + 0xe, 0x90, 0xf, 0xff, 0x8, 0xff, 0xf4, 0x8, + 0xf0, 0xe, 0x90, 0xf, 0xff, 0x8f, 0xff, 0xf4, + 0x8, 0xf0, 0xe, 0x90, 0xf, 0xff, 0xff, 0xff, + 0xf4, 0x8, 0xf0, 0xe, 0x90, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x8c, 0xf8, 0x8f, 0xc8, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x10, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x0, 0x0, 0x1c, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, + 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf1, 0x0, 0x2d, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x2e, 0xff, 0xff, 0xa2, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x2b, 0xff, 0xf1, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xd9, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x60, 0x0, 0x7f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 103, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 103, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 34, .adv_w = 150, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 59, .adv_w = 270, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 204, .adv_w = 238, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 365, .adv_w = 324, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 535, .adv_w = 263, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 679, .adv_w = 81, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 690, .adv_w = 129, .box_w = 6, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 759, .adv_w = 130, .box_w = 6, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 828, .adv_w = 154, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 878, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 944, .adv_w = 87, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 958, .adv_w = 147, .box_w = 7, .box_h = 3, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 969, .adv_w = 87, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 977, .adv_w = 135, .box_w = 11, .box_h = 23, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 1104, .adv_w = 256, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1223, .adv_w = 142, .box_w = 7, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1283, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1394, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1505, .adv_w = 257, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1641, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1752, .adv_w = 237, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1871, .adv_w = 230, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1990, .adv_w = 247, .box_w = 14, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2109, .adv_w = 237, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2228, .adv_w = 87, .box_w = 4, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2254, .adv_w = 87, .box_w = 4, .box_h = 17, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2288, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2354, .adv_w = 223, .box_w = 12, .box_h = 8, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2402, .adv_w = 223, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2468, .adv_w = 220, .box_w = 13, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2579, .adv_w = 397, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2832, .adv_w = 281, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2994, .adv_w = 291, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3122, .adv_w = 278, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3258, .adv_w = 317, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3403, .adv_w = 257, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3514, .adv_w = 244, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3625, .adv_w = 296, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3761, .adv_w = 312, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3889, .adv_w = 119, .box_w = 3, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3915, .adv_w = 197, .box_w = 11, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4009, .adv_w = 276, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4145, .adv_w = 228, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4256, .adv_w = 367, .box_w = 19, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4418, .adv_w = 312, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4546, .adv_w = 323, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4708, .adv_w = 277, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4836, .adv_w = 323, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 5026, .adv_w = 279, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5154, .adv_w = 238, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5273, .adv_w = 225, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5392, .adv_w = 304, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5520, .adv_w = 273, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5682, .adv_w = 432, .box_w = 27, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5912, .adv_w = 258, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6048, .adv_w = 248, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6193, .adv_w = 252, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6321, .adv_w = 128, .box_w = 6, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 6390, .adv_w = 135, .box_w = 11, .box_h = 23, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6517, .adv_w = 128, .box_w = 6, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 6586, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 6646, .adv_w = 192, .box_w = 12, .box_h = 2, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6658, .adv_w = 230, .box_w = 7, .box_h = 3, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 6669, .adv_w = 230, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6747, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6873, .adv_w = 219, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6951, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7077, .adv_w = 235, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7162, .adv_w = 136, .box_w = 10, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7252, .adv_w = 265, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7378, .adv_w = 262, .box_w = 13, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7495, .adv_w = 107, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7531, .adv_w = 109, .box_w = 9, .box_h = 23, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 7635, .adv_w = 237, .box_w = 13, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7752, .adv_w = 107, .box_w = 3, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7779, .adv_w = 406, .box_w = 22, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7922, .adv_w = 262, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8007, .adv_w = 244, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8098, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 8224, .adv_w = 262, .box_w = 14, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8350, .adv_w = 157, .box_w = 8, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8402, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8480, .adv_w = 159, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8560, .adv_w = 260, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8645, .adv_w = 215, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8743, .adv_w = 345, .box_w = 22, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8886, .adv_w = 212, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8971, .adv_w = 215, .box_w = 15, .box_h = 18, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 9106, .adv_w = 200, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9184, .adv_w = 135, .box_w = 7, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9265, .adv_w = 115, .box_w = 3, .box_h = 23, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 9300, .adv_w = 135, .box_w = 8, .box_h = 23, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 9392, .adv_w = 223, .box_w = 12, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 9416, .adv_w = 161, .box_w = 8, .box_h = 10, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 9456, .adv_w = 121, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 9469, .adv_w = 384, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9769, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9985, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10249, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10465, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10618, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10906, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11194, .adv_w = 432, .box_w = 27, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11491, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 11779, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12022, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12334, .adv_w = 192, .box_w = 12, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12448, .adv_w = 288, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12619, .adv_w = 432, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12943, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13159, .adv_w = 264, .box_w = 17, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13363, .adv_w = 336, .box_w = 15, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 13528, .adv_w = 336, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13801, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14032, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14263, .adv_w = 336, .box_w = 15, .box_h = 22, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 14428, .adv_w = 336, .box_w = 23, .box_h = 22, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 14681, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14824, .adv_w = 240, .box_w = 13, .box_h = 22, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14967, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15198, .adv_w = 336, .box_w = 21, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 15261, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15504, .adv_w = 480, .box_w = 31, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 15876, .adv_w = 432, .box_w = 29, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 16224, .adv_w = 384, .box_w = 24, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16488, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 16635, .adv_w = 336, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 16782, .adv_w = 480, .box_w = 31, .box_h = 19, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 17077, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17293, .adv_w = 384, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17581, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 17894, .adv_w = 336, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18136, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 18388, .adv_w = 336, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18619, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18829, .adv_w = 384, .box_w = 24, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19045, .adv_w = 240, .box_w = 17, .box_h = 24, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 19249, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19501, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19753, .adv_w = 432, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19996, .adv_w = 384, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 20334, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20550, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20895, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21135, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21375, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21615, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 21855, .adv_w = 480, .box_w = 30, .box_h = 16, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 22095, .adv_w = 480, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22405, .adv_w = 336, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 22633, .adv_w = 336, .box_w = 21, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22885, .adv_w = 384, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23198, .adv_w = 480, .box_w = 30, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23468, .adv_w = 288, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 23684, .adv_w = 386, .box_w = 25, .box_h = 16, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 17, 0, 10, -8, 0, 0, + 0, 0, -21, -23, 3, 18, 8, 7, + -15, 3, 19, 1, 16, 4, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 3, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, -12, 0, 0, 0, 0, + 0, -8, 7, 8, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -8, + 0, 0, 0, 0, -4, 0, 0, -5, + -6, 0, 0, -4, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -6, 0, -10, 0, -46, 0, + 0, -8, 0, 8, 12, 0, 0, -8, + 4, 4, 13, 8, -7, 8, 0, 0, + -22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, -5, -19, 0, -15, + -3, 0, 0, 0, 0, 1, 15, 0, + -12, -3, -1, 1, 0, -7, 0, 0, + -3, -28, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -31, -3, 15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, + 0, 4, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 8, 4, 12, -4, 0, 0, 8, -4, + -13, -53, 3, 10, 8, 1, -5, 0, + 14, 0, 12, 0, 12, 0, -36, 0, + -5, 12, 0, 13, -4, 8, 4, 0, + 0, 1, -4, 0, 0, -7, 31, 0, + 31, 0, 12, 0, 16, 5, 7, 12, + 0, 0, 0, -14, 0, 0, 0, 0, + 1, -3, 0, 3, -7, -5, -8, 3, + 0, -4, 0, 0, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -21, 0, -24, 0, 0, 0, + 0, -3, 0, 38, -5, -5, 4, 4, + -3, 0, -5, 4, 0, 0, -20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -37, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -24, 0, 23, 0, 0, -14, 0, + 13, 0, -26, -37, -26, -8, 12, 0, + 0, -26, 0, 5, -9, 0, -6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 12, -47, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -8, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -8, 0, -3, 0, -9, -8, 0, -10, + -13, -13, -7, 0, -8, 0, -8, 0, + 0, 0, 0, -3, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -7, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 5, -3, 0, + -5, 0, -7, 0, 0, -3, 0, 12, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -3, -5, 0, -6, 0, -12, + -3, -12, 8, 0, 0, -8, 4, 8, + 10, 0, -10, -1, -5, 0, -1, -18, + 4, -3, 3, -20, 4, 0, 0, 1, + -20, 0, -20, -3, -33, -3, 0, -19, + 0, 8, 11, 0, 5, 0, 0, 0, + 0, 1, 0, -7, -5, 0, -12, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -5, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -3, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -5, + 0, -3, 0, -8, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -4, -6, 0, + -7, 0, 12, -3, 1, -12, 0, 0, + 10, -19, -20, -16, -8, 4, 0, -3, + -25, -7, 0, -7, 0, -8, 6, -7, + -25, 0, -10, 0, 0, 2, -1, 3, + -3, 0, 4, 0, -12, -15, 0, -19, + -9, -8, -9, -12, -5, -10, -1, -7, + -10, 2, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -7, -8, + -8, -1, 0, -12, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 2, + -2, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -7, 0, 0, 0, 0, -19, -12, 0, + 0, 0, -6, -19, 0, 0, -4, 4, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -7, 0, + 0, 0, 0, 5, 0, 3, -8, -8, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -12, 0, -4, 0, -6, -4, + 0, -8, -10, -12, -3, 0, -8, 0, + -12, 0, 0, 0, 0, 31, 0, 0, + 2, 0, 0, -5, 0, 4, 0, -17, + 0, 0, 0, 0, 0, -36, -7, 13, + 12, -3, -16, 0, 4, -6, 0, -19, + -2, -5, 4, -27, -4, 5, 0, 6, + -13, -6, -14, -13, -16, 0, 0, -23, + 0, 22, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -10, -13, -1, -36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -6, 0, 0, + -8, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -8, 0, 0, 8, + -1, 5, 0, -8, 4, -3, -1, -10, + -4, 0, -5, -4, -3, 0, -6, -7, + 0, 0, -3, -1, -3, -7, -5, 0, + 0, -4, 0, 4, -3, 0, -8, 0, + 0, 0, -8, 0, -7, 0, -7, -7, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 4, 0, -5, 0, -3, -5, + -12, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -3, -3, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -3, -5, + -3, 0, 3, 15, -1, 0, -10, 0, + -3, 8, 0, -4, -16, -5, 6, 0, + 0, -18, -7, 4, -7, 3, 0, -3, + -3, -12, 0, -6, 2, 0, 0, -7, + 0, 0, 0, 4, 4, -8, -7, 0, + -7, -4, -6, -4, -4, 0, -7, 2, + -7, -7, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -6, 0, -8, 0, 0, 0, -13, 0, + 3, -8, 8, 1, -3, -18, 0, 0, + -8, -4, 0, -15, -10, -11, 0, 0, + -17, -4, -15, -15, -18, 0, -10, 0, + 3, 26, -5, 0, -9, -4, -1, -4, + -7, -10, -7, -14, -16, -9, -4, 0, + 0, -3, 0, 1, 0, 0, -27, -3, + 12, 8, -8, -14, 0, 1, -12, 0, + -19, -3, -4, 8, -35, -5, 1, 0, + 0, -25, -5, -20, -4, -28, 0, 0, + -27, 0, 23, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -15, -3, 0, -25, + 0, 0, 0, 0, -12, 0, -3, 0, + -1, -11, -18, 0, 0, -2, -6, -12, + -4, 0, -3, 0, 0, 0, 0, -17, + -4, -13, -12, -3, -7, -10, -4, -7, + 0, -8, -3, -13, -6, 0, -5, -7, + -4, -7, 0, 2, 0, -3, -13, 0, + 8, 0, -7, 0, 0, 0, 0, 5, + 0, 3, -8, 16, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -12, 0, + -4, 0, -6, -4, 0, -8, -10, -12, + -3, 0, -8, 3, 15, 0, 0, 0, + 0, 31, 0, 0, 2, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -8, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -8, + -4, 0, 0, -8, 0, 7, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 6, 8, 3, -3, 0, -12, + -6, 0, 12, -13, -12, -8, -8, 15, + 7, 4, -33, -3, 8, -4, 0, -4, + 4, -4, -13, 0, -4, 4, -5, -3, + -12, -3, 0, 0, 12, 8, 0, -11, + 0, -21, -5, 11, -5, -15, 1, -5, + -13, -13, -4, 15, 4, 0, -6, 0, + -10, 0, 3, 13, -9, -14, -15, -10, + 12, 0, 1, -28, -3, 4, -7, -3, + -9, 0, -8, -14, -6, -6, -3, 0, + 0, -9, -8, -4, 0, 12, 9, -4, + -21, 0, -21, -5, 0, -13, -22, -1, + -12, -7, -13, -11, 10, 0, 0, -5, + 0, -8, -3, 0, -4, -7, 0, 7, + -13, 4, 0, 0, -20, 0, -4, -8, + -7, -3, -12, -10, -13, -9, 0, -12, + -4, -9, -7, -12, -4, 0, 0, 1, + 18, -7, 0, -12, -4, 0, -4, -8, + -9, -10, -11, -15, -5, -8, 8, 0, + -6, 0, -19, -5, 2, 8, -12, -14, + -8, -13, 13, -4, 2, -36, -7, 8, + -8, -7, -14, 0, -12, -16, -5, -4, + -3, -4, -8, -12, -1, 0, 0, 12, + 11, -3, -25, 0, -23, -9, 9, -15, + -26, -8, -13, -16, -19, -13, 8, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 8, 3, -7, 8, 0, 0, -12, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 3, 12, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 15, 0, 7, 1, 1, -5, + 0, 8, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -23, 0, -4, 7, 0, 12, + 0, 0, 38, 5, -8, -8, 4, 4, + -3, 1, -19, 0, 0, 18, -23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -26, 15, 54, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -7, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -10, 0, + 0, 1, 0, 0, 4, 50, -8, -3, + 12, 10, -10, 4, 0, 0, 4, 4, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -50, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -11, + 0, 0, 0, -10, 0, 0, 0, 0, + -8, -2, 0, 0, 0, -8, 0, -5, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -7, 0, -6, 0, + -10, 0, 0, 0, -7, 4, -5, 0, + 0, -10, -4, -9, 0, 0, -10, 0, + -4, 0, -18, 0, -4, 0, 0, -31, + -7, -15, -4, -14, 0, 0, -26, 0, + -10, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -6, -7, -3, -7, 0, 0, + 0, 0, -8, 0, -8, 5, -4, 8, + 0, -3, -9, -3, -7, -7, 0, -5, + -2, -3, 3, -10, -1, 0, 0, 0, + -34, -3, -5, 0, -8, 0, -3, -18, + -3, 0, 0, -3, -3, 0, 0, 0, + 0, 3, 0, -3, -7, -3, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, -8, 0, -3, 0, 0, 0, -8, + 4, 0, 0, 0, -10, -4, -8, 0, + 0, -11, 0, -4, 0, -18, 0, 0, + 0, 0, -37, 0, -8, -14, -19, 0, + 0, -26, 0, -3, -6, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -6, -2, + -6, 1, 0, 0, 7, -5, 0, 12, + 19, -4, -4, -12, 5, 19, 7, 8, + -10, 5, 16, 5, 11, 8, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 18, -7, -4, 0, -3, + 31, 17, 31, 0, 0, 0, 4, 0, + 0, 14, 0, 0, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, -32, -5, -3, -16, + -19, 0, 0, -26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, -32, -5, -3, + -16, -19, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -9, 4, 0, -4, + 3, 7, 4, -12, 0, -1, -3, 4, + 0, 3, 0, 0, 0, 0, -10, 0, + -3, -3, -8, 0, -3, -15, 0, 24, + -4, 0, -8, -3, 0, -3, -7, 0, + -4, -11, -8, -5, 0, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, -32, + -5, -3, -16, -19, 0, 0, -26, 0, + 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, -12, -5, -3, 12, -3, -4, + -15, 1, -2, 1, -3, -10, 1, 8, + 1, 3, 1, 3, -9, -15, -5, 0, + -15, -7, -10, -16, -15, 0, -6, -8, + -5, -5, -3, -3, -5, -3, 0, -3, + -1, 6, 0, 6, -3, 0, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -10, 0, -2, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -23, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, 0, 0, 0, -3, 0, 0, -7, + -4, 4, 0, -7, -7, -3, 0, -11, + -3, -8, -3, -5, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -26, 0, 12, 0, 0, -7, 0, + 0, 0, 0, -5, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -9, 0, 0, + 16, -5, -13, -12, 3, 4, 4, -1, + -11, 3, 6, 3, 12, 3, 13, -3, + -10, 0, 0, -15, 0, 0, -12, -10, + 0, 0, -8, 0, -5, -7, 0, -6, + 0, -6, 0, -3, 6, 0, -3, -12, + -4, 14, 0, 0, -3, 0, -8, 0, + 0, 5, -9, 0, 4, -4, 3, 0, + 0, -13, 0, -3, -1, 0, -4, 4, + -3, 0, 0, 0, -16, -5, -8, 0, + -12, 0, 0, -18, 0, 14, -4, 0, + -7, 0, 2, 0, -4, 0, -4, -12, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -5, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, 0, 8, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 8, 0, 9, + 0, 0, 0, 0, 0, -24, -22, 1, + 17, 12, 7, -15, 3, 16, 0, 14, + 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_24 = { +#else +lv_font_t lv_font_montserrat_24 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 27, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_24*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_26.c b/inc/lvgl/src/font/lv_font_montserrat_26.c new file mode 100644 index 0000000..93d4f71 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_26.c @@ -0,0 +1,4592 @@ +/******************************************************************************* + * Size: 26 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 26 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_26.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_26 + #define LV_FONT_MONTSERRAT_26 1 +#endif + +#if LV_FONT_MONTSERRAT_26 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0xff, 0x0, 0xef, 0xe0, 0xe, 0xfd, 0x0, + 0xdf, 0xd0, 0xc, 0xfc, 0x0, 0xcf, 0xb0, 0xb, + 0xfb, 0x0, 0xbf, 0xa0, 0xa, 0xfa, 0x0, 0x9f, + 0x90, 0x9, 0xf8, 0x0, 0x8f, 0x80, 0x4, 0x84, + 0x0, 0x0, 0x0, 0x1, 0x41, 0x0, 0xef, 0xe0, + 0x2f, 0xff, 0x10, 0x9f, 0x90, + + /* U+0022 "\"" */ + 0x5f, 0xd0, 0xa, 0xf8, 0x5f, 0xc0, 0xa, 0xf7, + 0x4f, 0xc0, 0x9, 0xf7, 0x4f, 0xb0, 0x9, 0xf6, + 0x4f, 0xb0, 0x8, 0xf6, 0x3f, 0xa0, 0x8, 0xf6, + 0x3f, 0xa0, 0x8, 0xf5, 0x1, 0x0, 0x0, 0x10, + + /* U+0023 "#" */ + 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x0, 0x0, 0x3, 0xf9, 0x0, 0x0, 0x7f, + 0x50, 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, + 0xaf, 0x30, 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, + 0x0, 0xcf, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x6, 0xee, 0xef, + 0xfe, 0xee, 0xee, 0xff, 0xee, 0xe8, 0x0, 0x0, + 0xe, 0xf0, 0x0, 0x2, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xd0, 0x0, 0x4, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xb0, 0x0, 0x6, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x90, 0x0, 0x8, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0x70, 0x0, 0xa, + 0xf3, 0x0, 0x0, 0x4e, 0xee, 0xff, 0xfe, 0xee, + 0xef, 0xfe, 0xee, 0xa0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, + 0x10, 0x0, 0xf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xfd, 0x0, 0x0, 0x3f, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xfb, 0x0, 0x0, 0x5f, 0x70, 0x0, + 0x0, 0x0, 0x3, 0xf9, 0x0, 0x0, 0x7f, 0x60, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xae, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xb, 0xff, 0xc6, + 0xbf, 0x57, 0xbf, 0xe0, 0x3, 0xff, 0xa0, 0x9, + 0xf0, 0x0, 0x14, 0x0, 0x6f, 0xf2, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, 0x9, 0xf0, + 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x10, 0x9f, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xac, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x9e, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x9, 0xf0, 0x7, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x9f, 0x0, 0xa, 0xff, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x8f, 0xf0, 0x4c, + 0x30, 0x0, 0x9f, 0x0, 0x1e, 0xfd, 0xc, 0xff, + 0xb7, 0x4b, 0xf4, 0x7e, 0xff, 0x50, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x3, 0x9d, + 0xef, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x1a, 0xef, 0xc5, 0x0, 0x0, 0x0, 0x3, + 0xfc, 0x0, 0x0, 0x1e, 0xfa, 0x9d, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0x20, 0x0, 0x9, 0xf5, 0x0, + 0xd, 0xf0, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, + 0xed, 0x0, 0x0, 0x6f, 0x40, 0x0, 0x4f, 0xb0, + 0x0, 0x0, 0xf, 0xb0, 0x0, 0x4, 0xf6, 0x0, + 0xe, 0xf1, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, + 0x5f, 0x50, 0xa, 0xf6, 0x0, 0x0, 0x0, 0xb, + 0xf1, 0x0, 0xa, 0xf1, 0x5, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xd4, 0x38, 0xfa, 0x1, 0xee, + 0x10, 0x1, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, + 0x0, 0xbf, 0x40, 0x7e, 0xff, 0xb1, 0x0, 0x0, + 0x4, 0x42, 0x0, 0x6f, 0x90, 0x8f, 0xb6, 0x8f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x1f, + 0xc0, 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0xc, + 0xf3, 0x5, 0xf5, 0x0, 0x0, 0xec, 0x0, 0x0, + 0x0, 0x7, 0xf8, 0x0, 0x7f, 0x30, 0x0, 0xc, + 0xe0, 0x0, 0x0, 0x2, 0xfd, 0x0, 0x7, 0xf3, + 0x0, 0x0, 0xce, 0x0, 0x0, 0x0, 0xcf, 0x30, + 0x0, 0x5f, 0x50, 0x0, 0xe, 0xc0, 0x0, 0x0, + 0x8f, 0x70, 0x0, 0x0, 0xfc, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x6, 0xfb, + 0x68, 0xfc, 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xe9, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x5c, 0xff, 0xd9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xef, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x1c, 0xfa, 0x0, + 0x0, 0x0, 0x8, 0xfc, 0x0, 0x0, 0x5f, 0xc0, + 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x0, 0x7, 0xfb, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, 0x4, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0x49, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x9c, + 0xff, 0x40, 0x0, 0x44, 0x0, 0xb, 0xfe, 0x30, + 0xc, 0xff, 0x40, 0xb, 0xf7, 0x6, 0xff, 0x20, + 0x0, 0xb, 0xff, 0x51, 0xff, 0x20, 0xbf, 0xb0, + 0x0, 0x0, 0xa, 0xff, 0xbf, 0xc0, 0xc, 0xfa, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0xaf, + 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x2, + 0xff, 0xe8, 0x31, 0x25, 0xaf, 0xfd, 0xff, 0x80, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, + 0x30, 0x1, 0x7c, 0xef, 0xec, 0x82, 0x0, 0x8, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x5f, 0xd5, 0xfc, 0x4f, 0xc4, 0xfb, 0x4f, 0xb3, + 0xfa, 0x3f, 0xa0, 0x10, + + /* U+0028 "(" */ + 0x0, 0xb, 0xfb, 0x0, 0x3f, 0xf3, 0x0, 0xbf, + 0xb0, 0x1, 0xff, 0x50, 0x6, 0xff, 0x0, 0xb, + 0xfb, 0x0, 0xf, 0xf7, 0x0, 0x2f, 0xf4, 0x0, + 0x4f, 0xf2, 0x0, 0x6f, 0xf0, 0x0, 0x7f, 0xf0, + 0x0, 0x8f, 0xe0, 0x0, 0x8f, 0xe0, 0x0, 0x7f, + 0xf0, 0x0, 0x6f, 0xf0, 0x0, 0x4f, 0xf2, 0x0, + 0x2f, 0xf4, 0x0, 0xe, 0xf7, 0x0, 0xb, 0xfb, + 0x0, 0x6, 0xff, 0x0, 0x1, 0xff, 0x50, 0x0, + 0xbf, 0xb0, 0x0, 0x3f, 0xf3, 0x0, 0xb, 0xfb, + + /* U+0029 ")" */ + 0xe, 0xf7, 0x0, 0x0, 0x6f, 0xe1, 0x0, 0x0, + 0xef, 0x80, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x3f, + 0xf3, 0x0, 0x0, 0xef, 0x80, 0x0, 0xb, 0xfb, + 0x0, 0x0, 0x8f, 0xe0, 0x0, 0x5, 0xff, 0x10, + 0x0, 0x4f, 0xf2, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x2f, 0xf4, 0x0, 0x2, 0xff, 0x40, 0x0, 0x3f, + 0xf3, 0x0, 0x4, 0xff, 0x20, 0x0, 0x5f, 0xf1, + 0x0, 0x8, 0xfe, 0x0, 0x0, 0xbf, 0xb0, 0x0, + 0xe, 0xf8, 0x0, 0x3, 0xff, 0x30, 0x0, 0x9f, + 0xd0, 0x0, 0xe, 0xf7, 0x0, 0x6, 0xfe, 0x0, + 0x0, 0xef, 0x70, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x9f, 0x0, 0x0, 0x1, 0x0, 0x9f, + 0x0, 0x0, 0x2f, 0x91, 0x8f, 0x6, 0xe8, 0x2b, + 0xff, 0xdf, 0xcf, 0xe5, 0x0, 0x4d, 0xff, 0xf7, + 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x20, 0x3e, 0xfc, + 0xbf, 0x8f, 0xf8, 0x1d, 0x50, 0x8f, 0x2, 0xb6, + 0x0, 0x0, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x3, 0x74, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x11, 0x11, + 0x9f, 0xa1, 0x11, 0x10, 0x0, 0x0, 0x8, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x0, + + /* U+002C "," */ + 0x3, 0x20, 0x6f, 0xf5, 0xbf, 0xfa, 0x6f, 0xf8, + 0xc, 0xf2, 0xf, 0xd0, 0x4f, 0x80, 0x8f, 0x20, + + /* U+002D "-" */ + 0x12, 0x22, 0x22, 0x21, 0x8f, 0xff, 0xff, 0xf7, + 0x8f, 0xff, 0xff, 0xf7, + + /* U+002E "." */ + 0x7, 0x70, 0x9f, 0xf8, 0xbf, 0xf9, 0x4e, 0xd2, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x18, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x4, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x1, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0xbf, 0xfd, 0x85, 0x6b, 0xff, 0xe1, 0x0, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xfb, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, + 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0x9f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, + 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0xff, 0x80, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x6, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xfb, 0x0, + 0x0, 0xbf, 0xfd, 0x75, 0x6b, 0xff, 0xe1, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xec, 0xff, 0xff, 0xfe, 0x34, + 0x44, 0xcf, 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, + 0xbf, 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, + 0xe0, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, + 0x0, 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0xb, 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, + 0xfe, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, 0xfe, + 0x0, 0x0, 0xbf, 0xe0, 0x0, 0xb, 0xfe, + + /* U+0032 "2" */ + 0x0, 0x5, 0xad, 0xff, 0xea, 0x40, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x5f, + 0xff, 0xb7, 0x56, 0x9f, 0xff, 0x90, 0x0, 0xbd, + 0x20, 0x0, 0x0, 0x1e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x64, 0x44, 0x44, 0x44, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0033 "3" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0x44, + 0x44, 0x44, 0x4b, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x6, 0x78, 0xbf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf9, 0x2e, 0x60, 0x0, 0x0, 0x0, 0xaf, + 0xf4, 0xaf, 0xfe, 0xa6, 0x56, 0x8e, 0xff, 0xb0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x28, 0xce, 0xff, 0xda, 0x40, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xe1, 0x0, 0xa, 0xc7, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x30, 0x0, 0xd, 0xfa, 0x0, + 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x0, 0xd, 0xfa, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0xd, + 0xfa, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x4, 0x44, 0x44, + 0x44, 0x44, 0x4e, 0xfb, 0x44, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, + 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xe4, 0x44, 0x44, 0x44, 0x40, 0x0, 0xa, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x94, + 0x43, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xd0, 0xd, 0xa2, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x5, 0xff, 0xfb, 0x76, 0x67, 0xdf, 0xfe, 0x10, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x1, 0x6a, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x7f, 0xff, 0xa6, 0x44, 0x6b, 0xa0, 0x0, 0x3f, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x1, 0x10, 0x0, 0x0, 0xa, 0xfe, 0x3, 0xaf, + 0xff, 0xfb, 0x50, 0x0, 0xbf, 0xd6, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xb, 0xff, 0xff, 0x72, 0x1, + 0x5d, 0xff, 0x80, 0xaf, 0xff, 0x30, 0x0, 0x0, + 0xc, 0xff, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5f, 0xf3, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x41, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, + 0xf3, 0x9, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xfd, + 0x0, 0xd, 0xff, 0x94, 0x23, 0x6e, 0xff, 0x50, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xd8, 0x20, 0x0, + + /* U+0037 "7" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, + 0xf7, 0x44, 0x44, 0x44, 0x4b, 0xff, 0x33, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x3f, 0xf4, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x1, 0x77, 0x20, + 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x4, 0x9d, 0xff, 0xec, 0x82, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xa, + 0xff, 0xc6, 0x32, 0x37, 0xef, 0xf5, 0x0, 0xff, + 0xb0, 0x0, 0x0, 0x1, 0xef, 0xc0, 0x2f, 0xf6, + 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x8, 0xff, 0xa3, + 0x10, 0x15, 0xcf, 0xf3, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0xcf, 0xfa, 0x31, 0x2, + 0x5c, 0xff, 0x80, 0x6f, 0xf6, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x2b, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf7, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x8b, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x20, 0xdf, 0xfc, 0x53, 0x23, 0x7e, 0xff, 0x90, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x49, 0xde, 0xfe, 0xc8, 0x20, 0x0, + + /* U+0039 "9" */ + 0x0, 0x1, 0x8c, 0xef, 0xea, 0x50, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x4, + 0xff, 0xe7, 0x32, 0x49, 0xff, 0xd0, 0x0, 0xcf, + 0xd1, 0x0, 0x0, 0x3, 0xff, 0x90, 0x1f, 0xf6, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x13, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x2f, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x90, 0xef, 0xd1, 0x0, + 0x0, 0x3, 0xff, 0xfb, 0x6, 0xff, 0xe7, 0x32, + 0x39, 0xff, 0xff, 0xc0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x6d, 0xfc, 0x0, 0x3, 0x9d, 0xff, 0xd9, + 0x20, 0xef, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf4, + 0x0, 0x9, 0xb6, 0x54, 0x5a, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x5, 0xad, 0xff, 0xeb, 0x71, 0x0, 0x0, + + /* U+003A ":" */ + 0x3e, 0xd3, 0xbf, 0xfa, 0x9f, 0xf7, 0x7, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x9f, 0xf8, + 0xbf, 0xf9, 0x4e, 0xd2, + + /* U+003B ";" */ + 0x3e, 0xd3, 0xbf, 0xfa, 0x9f, 0xf7, 0x7, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x6f, 0xf5, + 0xbf, 0xfa, 0x6f, 0xf8, 0xc, 0xf2, 0xf, 0xd0, + 0x4f, 0x80, 0x8f, 0x20, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x50, 0x0, + 0x0, 0x0, 0x5, 0xcf, 0xf6, 0x0, 0x0, 0x2, + 0x9e, 0xff, 0xf9, 0x20, 0x0, 0x6c, 0xff, 0xfc, + 0x60, 0x0, 0x19, 0xff, 0xfe, 0x82, 0x0, 0x0, + 0x4, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, + 0xfd, 0x71, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xfb, 0x40, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + + /* U+003D "=" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, + + /* U+003E ">" */ + 0x39, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xfd, + 0x61, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xf6, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xff, 0x60, 0x0, 0x1, + 0x6c, 0xff, 0xfb, 0x50, 0x0, 0x4a, 0xff, 0xfe, + 0x81, 0x0, 0x2, 0xdf, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x4f, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x2, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x6, 0xbd, 0xff, 0xea, 0x50, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x5f, 0xff, + 0x95, 0x34, 0x7e, 0xff, 0x90, 0x2c, 0xc1, 0x0, + 0x0, 0x1, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0x60, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xfe, 0xcb, 0xce, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x51, 0x0, 0x0, + 0x1, 0x5b, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xa0, 0x0, 0x0, 0x7f, 0xd1, 0x0, 0x17, 0xcf, + 0xfc, 0x70, 0x4f, 0xf1, 0xcf, 0x70, 0x0, 0x2f, + 0xf2, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xd6, 0xff, + 0x1, 0xef, 0x20, 0xa, 0xf6, 0x0, 0x1e, 0xfe, + 0x61, 0x3, 0x9f, 0xff, 0xf0, 0x4, 0xfa, 0x1, + 0xfe, 0x0, 0xa, 0xfe, 0x20, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0xc, 0xf1, 0x6f, 0x80, 0x0, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x7f, + 0x59, 0xf5, 0x0, 0x4f, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x4, 0xf8, 0xbf, 0x30, 0x5, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, + 0x2f, 0x9b, 0xf2, 0x0, 0x5f, 0xe0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x0, 0x2, 0xf9, 0xbf, 0x30, + 0x4, 0xff, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x3f, 0x89, 0xf5, 0x0, 0xf, 0xf6, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x0, 0x5, 0xf6, 0x6f, + 0x90, 0x0, 0x9f, 0xe2, 0x0, 0x0, 0x6, 0xff, + 0xf0, 0x0, 0xaf, 0x21, 0xfe, 0x0, 0x1, 0xef, + 0xe6, 0x10, 0x29, 0xfd, 0xff, 0x70, 0x6f, 0xc0, + 0xa, 0xf6, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, + 0x2b, 0xff, 0xff, 0xf2, 0x0, 0x2f, 0xf2, 0x0, + 0x0, 0x7c, 0xff, 0xc7, 0x0, 0x1a, 0xef, 0xb2, + 0x0, 0x0, 0x7f, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x61, 0x0, + 0x0, 0x2, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xfe, 0xcc, 0xce, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, + 0xdf, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf2, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x9, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x10, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x0, 0xaf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfb, + 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xc0, 0x0, 0x0, 0x0, + 0xcf, 0x90, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xef, 0x81, 0x11, 0x11, 0x11, 0x11, + 0x8f, 0xf0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0xd, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x0, + 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xd0, + + /* U+0042 "B" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x60, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x4f, 0xf6, 0x22, 0x22, 0x23, 0x5c, 0xff, + 0xd0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x30, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf6, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x50, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf1, 0x4, 0xff, 0x62, 0x22, 0x22, + 0x35, 0xcf, 0xf7, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x14, 0xbf, 0xf8, 0x4, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x44, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x24, + 0xff, 0x62, 0x22, 0x22, 0x23, 0x6c, 0xff, 0xb0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, + 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa5, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x1c, 0xff, 0xfc, 0x76, 0x57, 0xcf, + 0xff, 0x60, 0xc, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x3d, 0xe2, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0xcf, 0xfc, 0x20, 0x0, 0x0, 0x3, 0xde, 0x30, + 0x1, 0xcf, 0xff, 0xc7, 0x65, 0x7c, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xda, 0x50, + 0x0, + + /* U+0044 "D" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x40, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x46, + 0x9e, 0xff, 0xf7, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf6, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x4, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x90, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf1, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x34, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x14, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf9, 0x4, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0x10, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0x60, 0x4, 0xff, + 0x84, 0x44, 0x44, 0x68, 0xef, 0xff, 0x70, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, + 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, 0xf8, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0x33, 0x33, 0x33, 0x33, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0046 "F" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4f, 0xf8, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xb6, 0x10, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x1c, 0xff, 0xfc, 0x86, 0x57, 0xbf, + 0xff, 0x90, 0xc, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x1a, 0xf4, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x1b, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x9f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd6, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x1f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x8f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x0, + 0xcf, 0xfc, 0x20, 0x0, 0x0, 0x1, 0xcf, 0xd0, + 0x1, 0xcf, 0xff, 0xc8, 0x65, 0x7a, 0xff, 0xfc, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, 0x71, + 0x0, + + /* U+0048 "H" */ + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x64, 0xff, 0x84, 0x44, 0x44, + 0x44, 0x44, 0x6f, 0xf6, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x64, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x64, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, + + /* U+0049 "I" */ + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, 0x4f, 0xf5, + 0x4f, 0xf5, 0x4f, 0xf5, + + /* U+004A "J" */ + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x14, 0x44, 0x44, + 0x4d, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x10, + 0x0, 0x0, 0xf, 0xfa, 0x7, 0xe2, 0x0, 0x0, + 0x6f, 0xf6, 0xe, 0xff, 0x95, 0x59, 0xff, 0xf1, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, 0x17, + 0xcf, 0xfd, 0x92, 0x0, + + /* U+004B "K" */ + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, + 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x4f, 0xfc, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x4f, 0xfc, + 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x4, 0xff, 0x50, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x3f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x8e, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x3c, 0xff, 0x60, 0x0, 0x0, 0x4, 0xff, 0xfe, + 0x30, 0x1e, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x2f, 0xfe, 0x20, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x4, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, + 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf4, + + /* U+004C "L" */ + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf8, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + + /* U+004D "M" */ + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x14, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x14, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf1, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x14, 0xff, 0xaf, 0xf2, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xaf, 0xf1, 0x4f, + 0xf3, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0xdf, 0x96, + 0xff, 0x14, 0xff, 0x34, 0xff, 0x50, 0x0, 0x0, + 0x8f, 0xe1, 0x6f, 0xf1, 0x4f, 0xf3, 0xa, 0xfe, + 0x0, 0x0, 0x2f, 0xf6, 0x6, 0xff, 0x14, 0xff, + 0x30, 0x1f, 0xf8, 0x0, 0xa, 0xfc, 0x0, 0x6f, + 0xf1, 0x4f, 0xf3, 0x0, 0x6f, 0xf2, 0x4, 0xff, + 0x30, 0x6, 0xff, 0x14, 0xff, 0x30, 0x0, 0xdf, + 0xc0, 0xdf, 0x90, 0x0, 0x6f, 0xf1, 0x4f, 0xf3, + 0x0, 0x3, 0xff, 0xbf, 0xe1, 0x0, 0x6, 0xff, + 0x14, 0xff, 0x30, 0x0, 0x9, 0xff, 0xf6, 0x0, + 0x0, 0x6f, 0xf1, 0x4f, 0xf3, 0x0, 0x0, 0x1e, + 0xfc, 0x0, 0x0, 0x6, 0xff, 0x14, 0xff, 0x30, + 0x0, 0x0, 0x6d, 0x30, 0x0, 0x0, 0x6f, 0xf1, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x14, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf1, + + /* U+004E "N" */ + 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x64, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x64, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x3f, 0xf6, 0x4f, 0xfe, 0xff, 0x80, 0x0, 0x0, + 0x3, 0xff, 0x64, 0xff, 0x6d, 0xff, 0x50, 0x0, + 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x2f, 0xff, 0x20, + 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, 0x4f, 0xfe, + 0x10, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, 0x7f, + 0xfc, 0x0, 0x3, 0xff, 0x64, 0xff, 0x50, 0x0, + 0xaf, 0xf9, 0x0, 0x3f, 0xf6, 0x4f, 0xf5, 0x0, + 0x0, 0xdf, 0xf6, 0x3, 0xff, 0x64, 0xff, 0x50, + 0x0, 0x1, 0xef, 0xf3, 0x3f, 0xf6, 0x4f, 0xf5, + 0x0, 0x0, 0x3, 0xff, 0xe5, 0xff, 0x64, 0xff, + 0x50, 0x0, 0x0, 0x6, 0xff, 0xef, 0xf6, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x64, + 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0x64, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf6, + + /* U+004F "O" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfc, + 0x76, 0x68, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0xbf, + 0xfc, 0x20, 0x0, 0x0, 0x3, 0xdf, 0xf9, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x60, 0x1f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xe0, 0x6f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x9f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf9, 0x9f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x6f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x1f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xe0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x60, 0x0, 0xcf, 0xfc, 0x20, + 0x0, 0x0, 0x3, 0xdf, 0xfa, 0x0, 0x0, 0x1c, + 0xff, 0xfb, 0x76, 0x68, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, + 0xb6, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x4f, 0xf8, 0x44, 0x44, 0x57, 0xbf, 0xff, 0x30, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0x4f, 0xf5, 0x0, 0x0, 0x2, 0x7e, 0xff, 0x60, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x4f, 0xf8, 0x44, 0x44, 0x32, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xfc, 0x76, 0x68, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0xb, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0x90, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x50, 0x1, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x6f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf3, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0xbf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf8, 0xb, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x80, 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xd0, + 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf6, 0x0, 0x0, 0xdf, 0xfb, 0x10, 0x0, + 0x0, 0x2, 0xcf, 0xfb, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xa6, 0x45, 0x6b, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xdf, 0xff, + 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xe2, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x22, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0xfe, 0xb5, 0x0, + + /* U+0052 "R" */ + 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x4f, 0xf8, 0x44, 0x44, 0x57, 0xbf, 0xff, 0x30, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0x4f, 0xf5, 0x0, 0x0, 0x2, 0x7e, 0xff, 0x60, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x4f, 0xf7, 0x33, 0x33, 0x3c, 0xfe, 0x10, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x10, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, + + /* U+0053 "S" */ + 0x0, 0x3, 0x9d, 0xef, 0xec, 0x94, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0xa, + 0xff, 0xc7, 0x43, 0x47, 0xbf, 0xe0, 0x3, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x25, 0x0, 0x6f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf0, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x1e, 0xfc, + 0xc, 0xff, 0xd9, 0x54, 0x35, 0x8e, 0xff, 0x40, + 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x2, 0x7b, 0xef, 0xfe, 0xb7, 0x10, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x44, 0x44, 0x44, 0xcf, 0xf4, 0x44, 0x44, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfd, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, + 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, + 0x7, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0xcf, 0xfe, 0x96, 0x57, 0xbf, 0xff, 0x50, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x39, 0xdf, 0xfe, 0xc7, 0x10, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf4, 0x5, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xd0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x2, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, + 0xbf, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, 0xd, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, + 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x60, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xd0, 0x3, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf5, 0xa, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0x40, 0xaf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xe0, 0x5, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0xf, 0xfb, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x3, + 0xff, 0x40, 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x0, + 0xff, 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x9f, 0xe0, + 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x6f, 0xf0, + 0xbf, 0xc0, 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, + 0xf, 0xfb, 0x0, 0x0, 0xb, 0xfa, 0x5, 0xff, + 0x20, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0xaf, + 0xf0, 0x0, 0x1, 0xff, 0x50, 0xf, 0xf7, 0x0, + 0x0, 0x9f, 0xe0, 0x0, 0x0, 0x4, 0xff, 0x50, + 0x0, 0x6f, 0xf0, 0x0, 0xaf, 0xd0, 0x0, 0xe, + 0xf9, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, 0xc, + 0xfa, 0x0, 0x5, 0xff, 0x20, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x2, 0xff, 0x40, + 0x0, 0xf, 0xf8, 0x0, 0x9f, 0xe0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x50, 0x7f, 0xe0, 0x0, 0x0, + 0x9f, 0xd0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfb, 0xd, 0xf9, 0x0, 0x0, 0x4, 0xff, + 0x34, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf4, 0xff, 0x40, 0x0, 0x0, 0xe, 0xf8, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xdf, + 0xe0, 0x0, 0x0, 0x0, 0x9f, 0xef, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x1, + 0xef, 0xc0, 0x0, 0x0, 0xa, 0xff, 0x40, 0x0, + 0xb, 0xff, 0x20, 0x0, 0x0, 0x1, 0xef, 0xe1, + 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x8d, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xdf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x19, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf4, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x90, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, + 0xcf, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, + 0x8, 0xff, 0x60, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x10, 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xc0, + + /* U+0059 "Y" */ + 0xc, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xf9, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xe1, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x60, 0x0, 0xe, 0xfc, 0x0, 0x0, + 0x0, 0xc, 0xfc, 0x0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x0, 0xbf, + 0xf1, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x40, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xd1, 0xdf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, + 0x0, 0x0, + + /* U+005A "Z" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x4c, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfe, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+005B "[" */ + 0x4f, 0xff, 0xff, 0x24, 0xff, 0xff, 0xf2, 0x4f, + 0xf4, 0x11, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, + 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, + 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, + 0xff, 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, + 0x4f, 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, + 0xf3, 0x0, 0x4, 0xff, 0x30, 0x0, 0x4f, 0xf3, + 0x0, 0x4, 0xff, 0x41, 0x10, 0x4f, 0xff, 0xff, + 0x24, 0xff, 0xff, 0xf2, + + /* U+005C "\\" */ + 0x78, 0x20, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0x50, 0x0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x60, 0x0, 0x0, 0x0, 0x8, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x60, 0x0, 0x0, 0x0, + 0x7, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, + 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x90, + 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xa0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, + + /* U+005D "]" */ + 0x8f, 0xff, 0xfe, 0x8f, 0xff, 0xfe, 0x1, 0x19, + 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, + 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, + 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, + 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, + 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, + 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, + 0xfe, 0x0, 0x9, 0xfe, 0x0, 0x9, 0xfe, 0x1, + 0x19, 0xfe, 0x8f, 0xff, 0xfe, 0x8f, 0xff, 0xfe, + + /* U+005E "^" */ + 0x0, 0x0, 0xa, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xaf, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xf0, 0xdf, + 0x10, 0x0, 0x0, 0x5, 0xf9, 0x6, 0xf7, 0x0, + 0x0, 0x0, 0xcf, 0x30, 0x1f, 0xe0, 0x0, 0x0, + 0x2f, 0xc0, 0x0, 0x9f, 0x50, 0x0, 0x9, 0xf6, + 0x0, 0x3, 0xfb, 0x0, 0x0, 0xfe, 0x0, 0x0, + 0xc, 0xf2, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x6f, + 0x90, 0xd, 0xf2, 0x0, 0x0, 0x0, 0xff, 0x0, + + /* U+005F "_" */ + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x58, 0x83, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, + 0x7f, 0xf4, 0x0, 0x0, 0x4e, 0xf4, + + /* U+0061 "a" */ + 0x0, 0x39, 0xdf, 0xfe, 0xb6, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xe, 0xfa, 0x63, + 0x36, 0xdf, 0xf8, 0x0, 0x42, 0x0, 0x0, 0x0, + 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, + 0x6b, 0xef, 0xff, 0xff, 0xff, 0x40, 0xbf, 0xff, + 0xdd, 0xdd, 0xdf, 0xf4, 0x6f, 0xf7, 0x0, 0x0, + 0x3, 0xff, 0x4a, 0xfd, 0x0, 0x0, 0x0, 0x3f, + 0xf4, 0xaf, 0xe0, 0x0, 0x0, 0xa, 0xff, 0x45, + 0xff, 0x80, 0x0, 0x1a, 0xff, 0xf4, 0xa, 0xff, + 0xfd, 0xdf, 0xfa, 0xff, 0x40, 0x6, 0xcf, 0xfe, + 0xb5, 0x1f, 0xf4, + + /* U+0062 "b" */ + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x2, + 0x9e, 0xfe, 0xc6, 0x0, 0x0, 0xaf, 0xd6, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0xa, 0xff, 0xff, 0xa5, + 0x35, 0xaf, 0xff, 0x20, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x5f, 0xfc, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8f, 0xf3, 0xaf, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x7a, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x9a, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xf7, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x3a, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0xaf, 0xff, 0xfa, 0x53, 0x5a, 0xff, 0xf2, 0xa, + 0xfc, 0x6f, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xaf, + 0xc0, 0x39, 0xef, 0xec, 0x60, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x1, 0x7c, 0xef, 0xea, 0x50, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xf9, + 0x43, 0x5b, 0xff, 0xa1, 0xef, 0xe2, 0x0, 0x0, + 0x7, 0xd3, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0x20, 0x0, 0x0, 0x7d, 0x40, + 0x4f, 0xff, 0x94, 0x35, 0xbf, 0xfa, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x17, 0xce, + 0xfe, 0xa4, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x18, + 0xde, 0xfd, 0x81, 0x2f, 0xf5, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xe5, 0xff, 0x50, 0x5f, 0xff, 0x84, + 0x36, 0xcf, 0xff, 0xf5, 0x1f, 0xfe, 0x20, 0x0, + 0x0, 0x8f, 0xff, 0x57, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xcf, 0xf5, 0xbf, 0xd0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x5d, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf5, 0xdf, 0xa0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x5b, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x51, 0xff, 0xd1, 0x0, 0x0, 0x6, 0xff, 0xf5, + 0x5, 0xff, 0xe6, 0x21, 0x3a, 0xff, 0xff, 0x50, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xf5, 0x0, + 0x2, 0x8d, 0xff, 0xd8, 0x10, 0xff, 0x50, + + /* U+0065 "e" */ + 0x0, 0x2, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, + 0xd5, 0x22, 0x5d, 0xff, 0x40, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0xbf, 0xe0, 0x7f, 0xf1, 0x0, 0x0, + 0x0, 0x1f, 0xf5, 0xbf, 0xb0, 0x0, 0x0, 0x0, + 0xa, 0xfa, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xdf, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, + 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfd, + 0x20, 0x0, 0x0, 0x19, 0x0, 0x4, 0xff, 0xf9, + 0x43, 0x48, 0xef, 0xa0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x1, 0x6c, 0xef, 0xeb, + 0x60, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xfc, 0x31, 0x43, + 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, + 0xf2, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x14, + 0xff, 0x41, 0x11, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x2, 0x8d, 0xef, 0xd9, 0x20, 0xdf, 0x80, + 0x7, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xf8, 0x7, + 0xff, 0xe8, 0x43, 0x49, 0xff, 0xff, 0x82, 0xff, + 0xc1, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x8f, 0xf2, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x8c, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf8, 0xef, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x8c, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf8, 0x9f, 0xf1, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x83, 0xff, 0xb0, 0x0, 0x0, + 0x2, 0xef, 0xf8, 0x9, 0xff, 0xd5, 0x10, 0x27, + 0xef, 0xff, 0x80, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xf8, 0x0, 0x5, 0xbf, 0xff, 0xfc, 0x40, + 0xff, 0x80, 0x0, 0x0, 0x2, 0x20, 0x0, 0x1f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x30, 0x4a, 0x10, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0xe, 0xff, 0xa6, 0x43, 0x48, 0xef, 0xf5, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x5, 0xad, 0xff, 0xec, 0x82, 0x0, 0x0, + + /* U+0068 "h" */ + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x3a, 0xef, 0xfc, + 0x60, 0x0, 0xaf, 0xd8, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xaf, 0xff, 0xf8, 0x54, 0x6d, 0xff, 0x90, + 0xaf, 0xfe, 0x20, 0x0, 0x0, 0xdf, 0xf1, 0xaf, + 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0xaf, 0xf0, + 0x0, 0x0, 0x0, 0x2f, 0xf6, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0xf, 0xf6, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, + 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0xf, 0xf7, + + /* U+0069 "i" */ + 0x8, 0xfb, 0x0, 0xff, 0xf3, 0xc, 0xfe, 0x10, + 0x3, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0xa, + 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, 0xaf, + 0xd0, 0xa, 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, + 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, 0xaf, 0xd0, + 0xa, 0xfd, 0x0, 0xaf, 0xd0, 0xa, 0xfd, 0x0, + + /* U+006A "j" */ + 0x0, 0x0, 0x6, 0xfc, 0x10, 0x0, 0x0, 0xef, + 0xf6, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x8, + 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, + 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x8f, + 0xf0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, + 0x8f, 0xf0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x74, + 0x26, 0xff, 0x90, 0x2f, 0xff, 0xff, 0xe1, 0x1, + 0xad, 0xfe, 0xa2, 0x0, + + /* U+006B "k" */ + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x3, + 0xef, 0xd1, 0xaf, 0xd0, 0x0, 0x0, 0x4f, 0xfc, + 0x10, 0xaf, 0xd0, 0x0, 0x5, 0xff, 0xc1, 0x0, + 0xaf, 0xd0, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0xaf, + 0xd0, 0x7, 0xff, 0xc1, 0x0, 0x0, 0xaf, 0xd0, + 0x8f, 0xfd, 0x10, 0x0, 0x0, 0xaf, 0xd9, 0xff, + 0xff, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0xff, + 0xd1, 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x7f, 0xfb, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0xa, 0xff, 0x70, + 0x0, 0xaf, 0xd0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0x2f, 0xfe, 0x10, 0xaf, + 0xd0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0x8f, 0xf9, + + /* U+006C "l" */ + 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, + 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, + 0xda, 0xfd, 0xaf, 0xda, 0xfd, 0xaf, 0xda, 0xfd, + 0xaf, 0xda, 0xfd, 0xaf, 0xd0, + + /* U+006D "m" */ + 0xaf, 0xc0, 0x5b, 0xef, 0xea, 0x40, 0x0, 0x5a, + 0xef, 0xeb, 0x50, 0x0, 0xaf, 0xca, 0xff, 0xff, + 0xff, 0xf8, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xaf, 0xff, 0xd6, 0x22, 0x6e, 0xff, 0xdf, 0xe7, + 0x32, 0x5d, 0xff, 0x60, 0xaf, 0xfd, 0x0, 0x0, + 0x2, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xef, 0xd0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0x0, 0x7f, 0xf1, 0xaf, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + + /* U+006E "n" */ + 0xaf, 0xc0, 0x4a, 0xef, 0xfc, 0x60, 0x0, 0xaf, + 0xc9, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xe6, 0x32, 0x4c, 0xff, 0x90, 0xaf, 0xfd, 0x10, + 0x0, 0x0, 0xcf, 0xf1, 0xaf, 0xf4, 0x0, 0x0, + 0x0, 0x4f, 0xf4, 0xaf, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xf6, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xf6, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, + 0x0, 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, + 0x0, 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xaf, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xf7, + + /* U+006F "o" */ + 0x0, 0x1, 0x7c, 0xef, 0xda, 0x40, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x4, + 0xff, 0xf8, 0x43, 0x5c, 0xff, 0xc0, 0x1, 0xff, + 0xe2, 0x0, 0x0, 0x8, 0xff, 0x80, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0xb, 0xfe, 0xb, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf3, 0xdf, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x5d, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf5, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x37, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xbf, 0xe0, 0x1e, 0xfe, 0x20, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x4f, 0xff, 0x84, 0x36, 0xcf, + 0xfc, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x17, 0xce, 0xfd, 0xa4, 0x0, + 0x0, + + /* U+0070 "p" */ + 0xaf, 0xc0, 0x3a, 0xef, 0xec, 0x60, 0x0, 0xa, + 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xaf, + 0xff, 0xf8, 0x31, 0x38, 0xff, 0xf2, 0xa, 0xff, + 0xf3, 0x0, 0x0, 0x3, 0xff, 0xc0, 0xaf, 0xf6, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x3a, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf7, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x9a, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf9, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x7a, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8f, 0xf3, 0xaf, 0xff, 0x40, 0x0, 0x0, + 0x5f, 0xfc, 0xa, 0xff, 0xff, 0xa5, 0x35, 0xaf, + 0xff, 0x20, 0xaf, 0xd6, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0xa, 0xfd, 0x2, 0x9d, 0xfe, 0xc6, 0x0, + 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x1, 0x8d, 0xef, 0xd8, 0x10, 0xff, 0x50, + 0x6, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xf5, 0x5, + 0xff, 0xf8, 0x43, 0x6c, 0xff, 0xff, 0x51, 0xff, + 0xe2, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x5b, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf5, 0xdf, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x5d, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf5, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x57, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xbf, 0xf5, 0x1f, 0xfe, 0x20, 0x0, 0x0, + 0x8f, 0xff, 0x50, 0x5f, 0xff, 0x84, 0x36, 0xcf, + 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xe5, + 0xff, 0x50, 0x0, 0x28, 0xdf, 0xfd, 0x81, 0x2f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, + + /* U+0072 "r" */ + 0xaf, 0xc0, 0x3a, 0xec, 0xaf, 0xc7, 0xff, 0xfc, + 0xaf, 0xef, 0xfb, 0x75, 0xaf, 0xff, 0x30, 0x0, + 0xaf, 0xf6, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0xaf, 0xd0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x5, 0xbe, 0xff, 0xda, 0x50, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x8, 0xff, 0xa4, + 0x23, 0x59, 0xf2, 0x0, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xfd, 0xa6, 0x0, 0x0, 0x0, 0x6b, + 0xef, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x14, + 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf3, 0x4, 0x20, 0x0, 0x0, 0x5, 0xff, 0x30, + 0xef, 0xb6, 0x33, 0x47, 0xff, 0xd0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x5, 0xad, 0xff, + 0xec, 0x71, 0x0, + + /* U+0074 "t" */ + 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x9f, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x14, 0xff, 0x41, 0x11, + 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0xe, 0xfe, + 0x52, 0x55, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x5c, 0xff, 0xc6, 0x0, + + /* U+0075 "u" */ + 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, + 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, + 0x0, 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, + 0x4f, 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, + 0xf3, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x9f, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x5f, 0xf7, + 0x0, 0x0, 0x5, 0xff, 0xf3, 0xe, 0xff, 0x83, + 0x13, 0x8f, 0xff, 0xf3, 0x3, 0xef, 0xff, 0xff, + 0xff, 0x7f, 0xf3, 0x0, 0x18, 0xdf, 0xfd, 0x91, + 0x2f, 0xf3, + + /* U+0076 "v" */ + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0x6, 0xff, 0x20, 0x0, 0x0, 0x0, 0x8f, 0xe0, + 0x0, 0xef, 0x90, 0x0, 0x0, 0x0, 0xef, 0x70, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xd, 0xf9, 0x0, + 0x0, 0xa, 0xfd, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x3, 0xff, 0x40, 0x0, 0xbf, 0xc0, 0x0, + 0x0, 0x0, 0xdf, 0xb0, 0x2, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x6f, 0xf2, 0x8, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf8, 0xe, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xfe, 0x7f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xb0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, + 0x0, 0x0, 0x3f, 0xf1, 0x4f, 0xf1, 0x0, 0x0, + 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0xa0, + 0xe, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0xef, 0x40, 0x9, 0xfc, 0x0, 0x0, + 0x9, 0xfd, 0xff, 0x10, 0x0, 0x4, 0xfe, 0x0, + 0x3, 0xff, 0x20, 0x0, 0xf, 0xf4, 0xdf, 0x60, + 0x0, 0xa, 0xf8, 0x0, 0x0, 0xdf, 0x70, 0x0, + 0x5f, 0xe0, 0x8f, 0xc0, 0x0, 0x1f, 0xf3, 0x0, + 0x0, 0x7f, 0xd0, 0x0, 0xbf, 0x80, 0x2f, 0xf2, + 0x0, 0x6f, 0xd0, 0x0, 0x0, 0x1f, 0xf3, 0x1, + 0xff, 0x20, 0xc, 0xf8, 0x0, 0xcf, 0x70, 0x0, + 0x0, 0xb, 0xf9, 0x7, 0xfc, 0x0, 0x6, 0xfe, + 0x2, 0xff, 0x10, 0x0, 0x0, 0x5, 0xfe, 0xd, + 0xf6, 0x0, 0x0, 0xff, 0x48, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x8f, 0xf0, 0x0, 0x0, 0xaf, + 0x9d, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x90, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, 0x0, 0x0, + + /* U+0078 "x" */ + 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x4, + 0xff, 0x80, 0x0, 0x2, 0xff, 0x80, 0x0, 0x7f, + 0xf4, 0x0, 0xd, 0xfc, 0x0, 0x0, 0xb, 0xfe, + 0x10, 0xaf, 0xe1, 0x0, 0x0, 0x1, 0xef, 0xc6, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0xfc, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x83, 0xff, 0x80, 0x0, 0x0, 0x1e, + 0xfc, 0x0, 0x7f, 0xf4, 0x0, 0x0, 0xbf, 0xe1, + 0x0, 0xb, 0xfe, 0x20, 0x8, 0xff, 0x40, 0x0, + 0x1, 0xef, 0xc0, 0x4f, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0xf9, + + /* U+0079 "y" */ + 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xe0, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xef, 0x70, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x1f, 0xf8, 0x0, 0x0, 0xd, 0xf9, 0x0, + 0x0, 0x9, 0xfe, 0x0, 0x0, 0x4f, 0xf2, 0x0, + 0x0, 0x2, 0xff, 0x60, 0x0, 0xbf, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xd0, 0x2, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0x8, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfb, 0xf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x8f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xb0, 0x0, 0x0, 0x0, + 0xd, 0x73, 0x3a, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xcf, 0xeb, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x1, 0x11, 0x11, 0x14, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1e, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xd, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x4f, 0xfa, 0x11, 0x11, 0x11, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, + + /* U+007B "{" */ + 0x0, 0x1, 0x9d, 0xfa, 0x0, 0xc, 0xff, 0xfa, + 0x0, 0x3f, 0xfa, 0x20, 0x0, 0x6f, 0xf2, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf0, 0x0, + 0x1, 0xbf, 0xf0, 0x0, 0x8f, 0xff, 0x60, 0x0, + 0x8f, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x7f, 0xf1, 0x0, + 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x3f, 0xfa, 0x20, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x1, 0x9d, 0xfa, + + /* U+007C "|" */ + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, 0x4f, 0xf0, + + /* U+007D "}" */ + 0x8f, 0xea, 0x10, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x1, 0x9f, 0xf6, 0x0, 0x0, 0xf, 0xf8, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xc, 0xfd, 0x20, 0x0, 0x4, 0xef, 0xfa, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0xd, 0xfc, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0xf, 0xf8, 0x0, 0x1, 0x9f, 0xf6, 0x0, + 0x8f, 0xff, 0xe0, 0x0, 0x8f, 0xea, 0x10, 0x0, + + /* U+007E "~" */ + 0x1, 0xaf, 0xfa, 0x20, 0x0, 0x1f, 0x80, 0xcf, + 0xff, 0xff, 0x60, 0x8, 0xf6, 0x3f, 0xb1, 0x17, + 0xff, 0xed, 0xfe, 0x6, 0xf3, 0x0, 0x2, 0xae, + 0xfb, 0x20, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xe8, + 0x0, 0xd, 0xe7, 0x58, 0xfb, 0x7, 0xf2, 0x0, + 0x4, 0xf5, 0xcb, 0x0, 0x0, 0xe, 0xac, 0xb0, + 0x0, 0x0, 0xda, 0x8f, 0x10, 0x0, 0x3f, 0x71, + 0xed, 0x52, 0x5e, 0xd0, 0x2, 0xdf, 0xff, 0xc2, + 0x0, 0x0, 0x24, 0x20, 0x0, + + /* U+2022 "•" */ + 0x2, 0xab, 0x40, 0xe, 0xff, 0xf2, 0x3f, 0xff, + 0xf5, 0x1f, 0xff, 0xf3, 0x5, 0xee, 0x70, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9c, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x6f, + 0xff, 0x20, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x30, 0x1, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xa5, 0x10, + 0x0, 0x0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x20, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x58, + 0x98, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x2, + 0x44, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x5d, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x4, + 0xac, 0xdb, 0x81, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0x34, 0x0, 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x81, 0x0, 0x43, 0xea, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xae, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xcc, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfd, 0xcc, 0xff, 0xfa, 0x0, 0x2f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, 0x0, + 0xaf, 0xfa, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x0, 0xaf, 0xfb, 0x0, + 0x3f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf3, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0xaa, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfc, 0xaa, 0xef, 0xfa, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xaf, 0xfa, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xaf, 0xfc, + 0x22, 0x5f, 0xfb, 0x77, 0x77, 0x77, 0x77, 0x77, + 0xbf, 0xf5, 0x22, 0xcf, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xfe, 0x88, 0xaf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfa, 0x88, 0xef, 0xfa, 0x0, + 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf2, 0x0, 0xaf, 0xfa, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf2, 0x0, 0xaf, + 0xfc, 0x44, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf6, 0x44, 0xcf, 0xff, 0xff, 0xff, + 0xfb, 0x77, 0x77, 0x77, 0x77, 0x77, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0x66, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x66, 0xdf, 0xa9, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x9a, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x37, 0x77, 0x77, 0x60, 0x1, + 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x37, 0x88, 0x88, 0x70, 0x2, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xe3, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x48, 0x88, 0x88, 0x71, 0x2, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xbd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xc, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfe, 0x20, 0x9, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xe3, 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x3, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x20, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe2, 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0xb, 0xff, 0xff, 0xfb, 0x3f, 0xff, 0xff, 0xfa, + 0x0, 0xbf, 0xff, 0xff, 0xe2, 0x3, 0xff, 0xff, + 0xff, 0xab, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xfa, 0x0, 0xb, 0xff, 0xff, + 0xfe, 0x23, 0xff, 0xff, 0xff, 0xa0, 0xaf, 0xff, + 0xff, 0xe2, 0x0, 0x3f, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x3, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf6, 0x9, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x3, + 0xef, 0x70, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xbb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x2f, + 0xff, 0xe0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xf5, 0x0, 0x2f, 0xff, 0xe0, 0x0, + 0x8f, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x0, 0x2f, 0xff, 0xe0, 0x2, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xe0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xbf, + 0xff, 0xfa, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0xcf, + 0xff, 0xf8, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, + 0x2f, 0xff, 0xe0, 0x0, 0xc, 0xff, 0xff, 0x20, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xe0, + 0x0, 0x1, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x2f, + 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0xb, 0xff, 0xf6, 0xbf, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x9, 0xff, + 0xf7, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0xbf, 0xff, + 0x60, 0x0, 0x0, 0xa, 0xdd, 0x70, 0x0, 0x0, + 0xa, 0xff, 0xf6, 0x8f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf1, 0xf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xc0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x2, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, 0x85, 0x34, + 0x59, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x9c, 0xdc, 0xb9, 0x50, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x55, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x6, 0x10, + 0x0, 0x0, 0xd, 0xfd, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc5, 0xdf, 0xd0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x33, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xb, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf6, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf4, + 0x0, 0x0, 0x7, 0xe5, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x5d, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9b, 0xdd, 0xc9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfd, 0x30, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf6, 0x0, + 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x4f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0x5f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xf5, 0x3, 0xef, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfe, + 0x30, 0x20, 0x1c, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xc1, 0x9, + 0xfb, 0x10, 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x1, 0xbf, 0xff, + 0xd2, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x70, 0x2d, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xfc, 0x10, 0x0, 0x1, 0xcf, + 0xff, 0xf4, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x2, 0xdf, 0xff, 0xe3, 0x0, 0x3e, 0xff, 0xfd, + 0x20, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x1b, 0xff, 0xff, 0x50, 0xef, 0xff, 0xc1, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x9f, 0xff, 0xf2, 0x6f, 0xf9, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x6, + 0xff, 0xa0, 0x7, 0x60, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x39, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0x83, 0x33, 0x5f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0x20, 0x0, 0xe, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbb, 0xbb, 0xb9, 0x0, + 0x0, 0x7, 0xbb, 0xbb, 0xba, 0x10, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xdd, 0xda, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x14, 0xff, 0xff, 0xff, 0x41, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe3, 0x9, + 0xff, 0x90, 0x3e, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x77, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x4a, 0xf5, 0x7f, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0x10, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x6f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xef, 0xff, + 0xcc, 0xcc, 0xcc, 0x40, 0x0, 0x0, 0x0, 0x1b, + 0xcc, 0xcc, 0xce, 0xff, 0xf2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x88, 0x88, 0x8b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x77, 0x52, + 0x0, 0x0, 0x0, 0x6e, 0xec, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x9f, 0xff, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd2, 0x7f, 0xff, 0x0, 0x3, 0xef, 0xff, + 0xfe, 0x84, 0x22, 0x59, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0x0, 0x1e, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, + 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, 0x17, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0xff, 0xff, 0xfe, 0x56, 0x77, 0x81, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf4, + 0x0, 0xff, 0xfd, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x3, 0x9f, 0xff, 0xff, 0x80, 0x0, 0xff, 0xf7, + 0x8f, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0xf8, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, + 0x0, 0x3, 0x8b, 0xdd, 0xb9, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf6, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xdf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0xb5, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, + 0xdf, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x2f, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6f, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xfe, 0x20, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf0, 0x0, 0x0, 0x6d, 0x40, 0x2, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x5f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x3e, 0xff, 0x50, 0xb, 0xff, 0x0, + 0x6b, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x1, 0xdf, 0xf2, 0x3, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xc6, + 0x0, 0x3f, 0xf9, 0x0, 0xdf, 0xb0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0x70, + 0xa, 0xff, 0x0, 0x8f, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0xdf, 0xf1, 0x5, + 0xff, 0x30, 0x5f, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1f, 0xf6, 0x2, 0xff, + 0x50, 0x3f, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xf, 0xf7, 0x1, 0xff, 0x50, + 0x3f, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x6f, 0xf4, 0x3, 0xff, 0x40, 0x4f, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x6, 0xff, 0xd0, 0x7, 0xff, 0x10, 0x6f, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xfd, 0x20, 0xd, 0xfc, 0x0, 0xbf, 0xd0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x40, + 0x0, 0x8f, 0xf5, 0x1, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, + 0xff, 0xb0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xfe, + 0x10, 0x1e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xc1, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xf0, 0x0, 0x0, 0x15, 0x0, 0x9, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x50, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x72, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x2b, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x7, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc2, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x2, 0xcb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xef, 0xfb, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xef, 0xf6, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xfb, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x6f, 0xff, 0x40, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, 0xf3, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, + 0xff, 0x93, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xfd, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x10, + 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xd2, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x7b, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xfe, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xe2, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, + 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x8b, 0xff, 0xe0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x8b, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xf8, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0x66, 0xbb, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8b, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xa0, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x7a, 0xbb, 0xbb, 0xa5, 0x0, 0x0, 0x7, + 0xab, 0xbb, 0xba, 0x50, + + /* U+F04D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x7a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0x50, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xee, 0x30, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x9a, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x1, 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x1f, 0xff, 0x9a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0xff, 0xf9, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0x9a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x9a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0xff, 0xf9, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1f, 0xff, + 0x9a, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xff, + 0xf9, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x1f, + 0xff, 0x9a, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x1, + 0xff, 0xf9, 0xaf, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x1f, 0xff, 0x9a, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x1, 0xff, 0xf9, 0x8f, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x91, 0x99, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xab, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x6, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x0, + + /* U+F054 "" */ + 0x2, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0xa, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x33, 0x33, 0x33, 0xff, 0xff, 0xd3, 0x33, + 0x33, 0x33, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x3a, 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, + 0xbb, 0xbb, 0xbb, 0xb9, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xa8, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xb2, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x56, 0x77, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x38, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xe2, + 0x0, 0x3, 0x98, 0x30, 0x0, 0xcf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x4, 0xff, 0xfa, 0x0, 0x2f, 0xff, 0xff, 0xe2, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xa0, 0x9, 0xff, 0xff, 0xfd, 0x0, + 0x3f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf2, 0x4, 0xff, 0xff, 0xff, 0x70, 0xcf, + 0xff, 0xff, 0xf6, 0x1, 0xc9, 0xdf, 0xff, 0xff, + 0xf7, 0x2, 0xff, 0xff, 0xff, 0xf1, 0xef, 0xff, + 0xff, 0xf5, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1, 0xff, 0xff, 0xff, 0xf2, 0x8f, 0xff, 0xff, + 0xf6, 0x1, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2, + 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xff, 0xfa, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x6, 0xff, + 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xff, 0x10, + 0x1d, 0xff, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x1, + 0x9f, 0xff, 0xb3, 0x0, 0x7f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x10, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xc8, 0x78, 0xbf, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xdb, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x9, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x25, 0x77, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x5a, + 0xef, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf8, 0x30, 0x1, 0x4b, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xb1, 0x7, 0x97, 0x10, 0x4, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x5, 0xff, 0xff, 0xd3, 0xaf, 0xff, 0x50, 0x7, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x1e, 0xa0, + 0x0, 0x2, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0x40, + 0xe, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9, 0xff, + 0xd2, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xaf, 0xff, 0xff, 0xf2, 0x0, 0x2, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x4f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0x10, 0x7f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xf0, 0x9, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xb1, 0xdf, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xef, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xa8, 0x78, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0xa, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8b, 0xef, 0xfe, 0xc8, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9d, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x80, 0x0, 0x4f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xee, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x72, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x13, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x10, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfd, 0x10, 0xdf, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xd1, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x1, 0x11, 0x1b, 0xff, 0xfc, 0x1, 0xdf, 0xff, + 0xf8, 0x18, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xcf, 0xd1, 0x1d, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0xcf, + 0xff, 0xf9, 0x0, 0x6, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, + 0x26, 0x0, 0x4, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfc, 0x1, 0xdf, 0x50, 0x7, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xd1, 0x1d, 0xff, 0xf5, 0x8, 0xff, 0xfc, 0x10, + 0xde, 0xee, 0xef, 0xff, 0xfd, 0x10, 0x3f, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x12, 0x22, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x29, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x91, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x1, 0xdf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x90, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfb, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0xb, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf5, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, 0x6e, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcc, + 0x10, + + /* U+F078 "" */ + 0x1, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x40, 0x1, 0xdf, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x70, 0xaf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x48, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0xa, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xf4, 0x0, 0xa, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe2, 0x0, 0x7, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xe2, 0x7, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe9, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x3, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x4, 0x44, 0x44, 0x44, 0x44, 0x4e, 0xff, + 0x60, 0x0, 0x0, 0xcf, 0xff, 0x6f, 0xff, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0x42, 0xff, 0xf2, + 0x4f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x3, 0x20, 0x2f, 0xff, + 0x20, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbe, 0x40, 0xdf, 0xf6, 0xa, 0xf5, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x3d, 0xff, 0x69, 0xff, 0xf1, 0x0, + 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0xef, 0xfd, 0xff, 0xfd, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x5, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x5, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x40, 0x0, 0x5, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x4, 0x78, 0x88, 0x88, 0x88, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc2, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xee, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x20, 0xff, + 0xff, 0xff, 0x62, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x7b, 0xbb, 0xb9, 0x15, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xaa, + 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x4a, 0xf5, 0x7f, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb8, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xfd, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xb0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x28, + 0xef, 0xff, 0xa0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, + 0x70, 0x1a, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xeb, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x20, 0x0, + 0xb, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xfd, 0x20, 0x6f, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, + 0xcf, 0xfd, 0x35, 0xff, 0xf8, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xfd, 0x10, 0xff, 0xf5, 0x0, 0x9f, + 0xfb, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xd1, 0x0, + 0xff, 0xf6, 0x0, 0xaf, 0xfb, 0x0, 0xc, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xbf, 0xff, 0x89, 0xff, + 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x4c, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xce, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x18, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xcf, 0xfd, 0x35, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xff, 0xf5, 0x0, 0x9f, 0xfb, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xff, 0xf6, 0x0, 0xaf, + 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, + 0xbf, 0xff, 0x89, 0xff, 0xf7, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x30, 0x4f, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, + 0x6, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xe8, 0x0, 0x0, 0x3a, 0xcc, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x4c, 0xdd, 0xdd, 0xdd, 0xdd, + 0x11, 0xb2, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x11, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x11, 0xff, + 0xff, 0xb9, 0xff, 0xfd, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xfe, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xe0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xfe, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0x41, 0x89, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x82, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x13, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x31, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xf6, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x24, 0xff, 0xff, + 0x80, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x70, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xf8, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x9f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf9, 0xff, 0xf9, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x45, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x87, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x41, 0x9d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdc, 0x60, + + /* U+F0C9 "" */ + 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x69, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x69, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0E0 "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xb2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4e, + 0xff, 0x60, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x8, 0xff, 0xff, 0xfa, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xe4, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x1c, 0xff, 0xff, 0xff, 0xc1, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x8f, 0xff, 0xf8, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2, 0x99, + 0x20, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc2, + + /* U+F0E7 "" */ + 0x0, 0x9, 0xaa, 0xaa, 0xaa, 0xa9, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, + 0x60, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x6c, 0xc8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x33, 0x33, 0x8f, 0xff, + 0xfb, 0x33, 0x33, 0x10, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0xbf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf5, 0x3f, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xd0, + 0x7d, 0xdd, 0xdd, 0xdd, 0x21, 0xb2, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, + 0x1f, 0xe2, 0x0, 0xff, 0xff, 0xff, 0x80, 0xef, + 0xff, 0xff, 0xff, 0x31, 0xff, 0xe2, 0xf, 0xff, + 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x1f, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0x31, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xa2, 0x22, 0x22, 0x1f, 0xff, 0xff, 0xf8, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf8, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x56, 0x66, 0x63, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xf4, 0x0, 0x9f, + 0x20, 0xb, 0xf1, 0x0, 0xcf, 0x0, 0xf, 0xc0, + 0x1, 0xff, 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, + 0xa, 0xf0, 0x0, 0xbe, 0x0, 0xe, 0xb0, 0x0, + 0xff, 0xf4, 0xff, 0xf5, 0x0, 0xaf, 0x20, 0xb, + 0xf1, 0x0, 0xcf, 0x0, 0xf, 0xc0, 0x1, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xaa, 0xbf, 0xea, 0xac, 0xfe, + 0xaa, 0xdf, 0xda, 0xad, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xfb, 0x0, 0x1f, 0x80, 0x2, 0xf7, 0x0, + 0x4f, 0x40, 0x7, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xfb, 0x0, 0x1f, 0x80, 0x2, 0xf7, 0x0, 0x4f, + 0x40, 0x7, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xfc, + 0x0, 0x3f, 0xa0, 0x4, 0xf9, 0x0, 0x6f, 0x60, + 0x8, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xfc, 0x99, 0xef, 0xb9, + 0x99, 0x99, 0x99, 0x99, 0x99, 0xaf, 0xf9, 0x9a, + 0xff, 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xff, + 0xf4, 0xff, 0xf4, 0x0, 0x8f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xb0, 0x0, 0xff, 0xf4, + 0xff, 0xf8, 0x44, 0xbf, 0x64, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4f, 0xd4, 0x45, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x1, 0xad, 0xee, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x83, 0x7, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xf, 0xc1, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xf, 0xfc, 0x10, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, 0xc1, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, + 0xfc, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xf, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xff, + 0xff, 0xff, 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xfc, + 0x84, 0x20, 0x0, 0x1, 0x36, 0xae, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x2d, 0xff, 0xff, 0xfe, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xf7, 0xd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xf5, 0x8f, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x10, 0x8f, 0xa0, 0x0, + 0x0, 0x0, 0x38, 0xcd, 0xef, 0xec, 0xa6, 0x10, + 0x0, 0x0, 0x4, 0xfe, 0x20, 0x0, 0x30, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfb, 0x63, 0x21, 0x24, + 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xae, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbd, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x79, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x80, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F241 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x10, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F242 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x42, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x42, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x42, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x41, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F243 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x41, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x1f, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x41, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x1f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x41, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x1f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x40, + 0x88, 0x88, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F244 "" */ + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xf, 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xaf, + 0xfe, 0x90, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8f, 0xff, 0x5f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x5f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xff, 0xf5, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x5f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbc, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xfe, 0x31, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x50, 0x0, 0x5c, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x46, 0x50, 0x0, 0x0, + 0x3f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd2, 0x0, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc8, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, + 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0x50, 0xe, 0xff, 0xff, 0xff, + 0xcc, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x2, 0xdf, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfa, 0x10, 0x2e, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x3, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xd3, 0x0, 0x0, 0x18, + 0xb9, 0x20, 0x0, 0x0, 0x0, 0xb, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xa0, + 0x0, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x30, 0x1f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xfe, 0x77, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x56, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x33, 0x30, 0x0, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x26, 0xac, 0xdc, 0xb8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xe0, 0xaf, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, + 0xbf, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0x30, 0x5, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1, 0xdf, 0xff, + 0xf8, 0x0, 0xaf, 0xff, 0xd9, 0xff, 0xe0, 0x3a, + 0x1, 0xdf, 0xff, 0xc0, 0xd, 0xff, 0xf1, 0x8, + 0xfe, 0x2, 0xfa, 0x2, 0xef, 0xff, 0x0, 0xff, + 0xff, 0xb0, 0x8, 0xe0, 0x2f, 0x50, 0x5f, 0xff, + 0xf1, 0x1f, 0xff, 0xff, 0xa0, 0x7, 0x2, 0x50, + 0x4f, 0xff, 0xff, 0x22, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf3, 0x3f, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0x43, 0xff, 0xff, 0xff, 0xff, 0x40, 0x7, 0xff, + 0xff, 0xff, 0xf4, 0x3f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x32, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0x50, 0x1c, 0x2, 0xa0, 0xb, + 0xff, 0xff, 0x20, 0xef, 0xff, 0x50, 0x1d, 0xf0, + 0x2f, 0xa0, 0xd, 0xff, 0xf0, 0xc, 0xff, 0xf4, + 0x1d, 0xff, 0x2, 0xf5, 0x4, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xfd, 0xff, 0xf0, 0x25, 0x3, 0xff, + 0xff, 0xa0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xf6, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xbf, 0xff, 0xff, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x4, 0xbc, 0xcc, 0xcc, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, 0x22, 0xef, + 0xff, 0xff, 0xff, 0xa2, 0x22, 0x22, 0x10, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x10, 0x1, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x6, 0xff, 0xfd, 0x1d, 0xff, + 0xb1, 0xef, 0xf9, 0x2f, 0xff, 0xf2, 0x0, 0x6f, + 0xff, 0xb0, 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, + 0xff, 0x20, 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, + 0xdf, 0xf7, 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, + 0xb0, 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, + 0x20, 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, + 0xf7, 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, + 0xbf, 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, + 0x6, 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, + 0xf, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, + 0xf9, 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, + 0xff, 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, 0xf, + 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, 0xf9, + 0xd, 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, 0xff, + 0xfb, 0xb, 0xff, 0x90, 0xdf, 0xf7, 0xf, 0xff, + 0xf2, 0x0, 0x6f, 0xff, 0xb0, 0xbf, 0xf9, 0xd, + 0xff, 0x70, 0xff, 0xff, 0x20, 0x6, 0xff, 0xfd, + 0x1d, 0xff, 0xb1, 0xef, 0xf9, 0x2f, 0xff, 0xf2, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0x34, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf5, 0x7, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, + 0x7, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf5, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf5, 0x7, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xec, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xdf, 0xff, 0xff, 0xda, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xdf, 0xff, 0xd1, 0x8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x1, 0xdf, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x80, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x1, 0xb1, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x86, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x3, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x7, + 0xf7, 0x0, 0x1, 0xef, 0xff, 0xff, 0xf8, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x7, + 0xff, 0xf7, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x27, + 0xff, 0xff, 0xf7, 0x2e, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1d, + 0xfc, 0x44, 0xfc, 0x44, 0xfc, 0x44, 0xff, 0xf5, + 0x1, 0xdf, 0xfb, 0x0, 0xeb, 0x0, 0xeb, 0x0, + 0xef, 0xf5, 0x1d, 0xff, 0xfb, 0x0, 0xeb, 0x0, + 0xeb, 0x0, 0xef, 0xf5, 0xdf, 0xff, 0xfb, 0x0, + 0xeb, 0x0, 0xeb, 0x0, 0xef, 0xf5, 0xff, 0xff, + 0xfb, 0x0, 0xeb, 0x0, 0xeb, 0x0, 0xef, 0xf5, + 0xff, 0xff, 0xff, 0xdd, 0xff, 0xdd, 0xff, 0xdd, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, + 0x1, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x10, 0x0, 0x1, 0xdf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x2, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x2, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x3, 0xef, 0xff, 0xff, + 0x86, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xff, + 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x7, 0xff, 0xff, 0xff, 0xcb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa7, 0x0, + 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xee, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 112, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 111, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 45, .adv_w = 163, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 77, .adv_w = 292, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 239, .adv_w = 258, .box_w = 15, .box_h = 25, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 427, .adv_w = 351, .box_w = 21, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 616, .adv_w = 285, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 778, .adv_w = 87, .box_w = 3, .box_h = 8, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 790, .adv_w = 140, .box_w = 6, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 862, .adv_w = 141, .box_w = 7, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 946, .adv_w = 166, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 996, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1074, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1090, .adv_w = 159, .box_w = 8, .box_h = 3, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 1102, .adv_w = 94, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1110, .adv_w = 146, .box_w = 12, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1260, .adv_w = 277, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1404, .adv_w = 154, .box_w = 7, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1467, .adv_w = 239, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1602, .adv_w = 238, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1728, .adv_w = 278, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1890, .adv_w = 239, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2025, .adv_w = 257, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2160, .adv_w = 249, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2295, .adv_w = 268, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2430, .adv_w = 257, .box_w = 15, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2565, .adv_w = 94, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2593, .adv_w = 94, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2629, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2707, .adv_w = 242, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2766, .adv_w = 242, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2844, .adv_w = 238, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2970, .adv_w = 430, .box_w = 25, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3258, .adv_w = 305, .box_w = 21, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3447, .adv_w = 315, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3600, .adv_w = 301, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3753, .adv_w = 344, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3924, .adv_w = 279, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4050, .adv_w = 264, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4176, .adv_w = 321, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4329, .adv_w = 338, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4482, .adv_w = 129, .box_w = 4, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4518, .adv_w = 213, .box_w = 12, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4626, .adv_w = 299, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4779, .adv_w = 247, .box_w = 14, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4905, .adv_w = 397, .box_w = 21, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5094, .adv_w = 338, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5247, .adv_w = 349, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5427, .adv_w = 300, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5571, .adv_w = 349, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 5802, .adv_w = 302, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5946, .adv_w = 258, .box_w = 15, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6081, .adv_w = 244, .box_w = 16, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6225, .adv_w = 329, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6369, .adv_w = 296, .box_w = 20, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6549, .adv_w = 468, .box_w = 29, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6810, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6972, .adv_w = 269, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7134, .adv_w = 273, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7278, .adv_w = 139, .box_w = 7, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 7362, .adv_w = 146, .box_w = 11, .box_h = 25, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 7500, .adv_w = 139, .box_w = 6, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 7572, .adv_w = 243, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 7644, .adv_w = 208, .box_w = 13, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7657, .adv_w = 250, .box_w = 7, .box_h = 4, .ofs_x = 3, .ofs_y = 16}, + {.bitmap_index = 7671, .adv_w = 249, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7762, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7905, .adv_w = 238, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7996, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8139, .adv_w = 255, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8237, .adv_w = 147, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8342, .adv_w = 287, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8485, .adv_w = 283, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8618, .adv_w = 116, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8666, .adv_w = 118, .box_w = 9, .box_h = 24, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 8774, .adv_w = 256, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8907, .adv_w = 116, .box_w = 3, .box_h = 19, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8936, .adv_w = 440, .box_w = 24, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9104, .adv_w = 283, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9202, .adv_w = 264, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9307, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 9450, .adv_w = 284, .box_w = 15, .box_h = 19, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9593, .adv_w = 171, .box_w = 8, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9649, .adv_w = 208, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9740, .adv_w = 172, .box_w = 11, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9834, .adv_w = 282, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9932, .adv_w = 233, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10044, .adv_w = 374, .box_w = 24, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10212, .adv_w = 230, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10310, .adv_w = 233, .box_w = 16, .box_h = 19, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 10462, .adv_w = 217, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10546, .adv_w = 146, .box_w = 8, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10642, .adv_w = 124, .box_w = 4, .box_h = 24, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 10690, .adv_w = 146, .box_w = 8, .box_h = 24, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 10786, .adv_w = 242, .box_w = 13, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 10812, .adv_w = 174, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 10857, .adv_w = 131, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 10872, .adv_w = 416, .box_w = 27, .box_h = 28, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11250, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11510, .adv_w = 416, .box_w = 26, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11822, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12082, .adv_w = 286, .box_w = 18, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12253, .adv_w = 416, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12591, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12942, .adv_w = 468, .box_w = 30, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13302, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13653, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13953, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14304, .adv_w = 208, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14441, .adv_w = 312, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14651, .adv_w = 468, .box_w = 30, .box_h = 26, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15041, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15301, .adv_w = 286, .box_w = 18, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15544, .adv_w = 364, .box_w = 17, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 15757, .adv_w = 364, .box_w = 23, .box_h = 28, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16079, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16355, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16631, .adv_w = 364, .box_w = 17, .box_h = 25, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 16844, .adv_w = 364, .box_w = 25, .box_h = 24, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17144, .adv_w = 260, .box_w = 14, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17305, .adv_w = 260, .box_w = 14, .box_h = 23, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 17466, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17742, .adv_w = 364, .box_w = 23, .box_h = 6, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 17811, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18111, .adv_w = 520, .box_w = 33, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18557, .adv_w = 468, .box_w = 31, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 18976, .adv_w = 416, .box_w = 26, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19288, .adv_w = 364, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 19449, .adv_w = 364, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 19610, .adv_w = 520, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19957, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20217, .adv_w = 416, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 20568, .adv_w = 416, .box_w = 27, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 20933, .adv_w = 364, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21221, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21532, .adv_w = 364, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21808, .adv_w = 364, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22050, .adv_w = 416, .box_w = 26, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22310, .adv_w = 260, .box_w = 18, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 22553, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22864, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23175, .adv_w = 468, .box_w = 30, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23475, .adv_w = 416, .box_w = 28, .box_h = 28, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23867, .adv_w = 312, .box_w = 20, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24137, .adv_w = 520, .box_w = 33, .box_h = 24, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24533, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 24814, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25095, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25376, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25657, .adv_w = 520, .box_w = 33, .box_h = 17, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25938, .adv_w = 520, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26285, .adv_w = 364, .box_w = 21, .box_h = 27, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 26569, .adv_w = 364, .box_w = 23, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 26880, .adv_w = 416, .box_w = 27, .box_h = 27, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27245, .adv_w = 520, .box_w = 33, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27575, .adv_w = 312, .box_w = 20, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27845, .adv_w = 418, .box_w = 27, .box_h = 18, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 19, 0, 11, -9, 0, 0, + 0, 0, -23, -25, 3, 20, 9, 7, + -17, 3, 20, 1, 17, 4, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 25, 3, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, -12, 0, 0, 0, 0, + 0, -8, 7, 8, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -8, + 0, 0, 0, 0, -4, 0, 0, -5, + -6, 0, 0, -4, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -6, 0, -11, 0, -50, 0, + 0, -8, 0, 8, 12, 0, 0, -8, + 4, 4, 14, 8, -7, 8, 0, 0, + -24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -11, -5, -20, 0, -17, + -3, 0, 0, 0, 0, 1, 16, 0, + -12, -3, -1, 1, 0, -7, 0, 0, + -3, -31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -33, -3, 16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 14, + 0, 4, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 16, 3, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 8, 4, 12, -4, 0, 0, 8, -4, + -14, -57, 3, 11, 8, 1, -5, 0, + 15, 0, 13, 0, 13, 0, -39, 0, + -5, 12, 0, 14, -4, 8, 4, 0, + 0, 1, -4, 0, 0, -7, 33, 0, + 33, 0, 12, 0, 17, 5, 7, 12, + 0, 0, 0, -15, 0, 0, 0, 0, + 1, -3, 0, 3, -7, -5, -8, 3, + 0, -4, 0, 0, 0, -17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -23, 0, -26, 0, 0, 0, + 0, -3, 0, 41, -5, -5, 4, 4, + -4, 0, -5, 4, 0, 0, -22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -40, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -26, 0, 25, 0, 0, -15, 0, + 14, 0, -28, -40, -28, -8, 12, 0, + 0, -28, 0, 5, -10, 0, -6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 12, -51, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 20, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -8, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -8, 0, -3, 0, -10, -8, 0, -10, + -14, -14, -8, 0, -8, 0, -8, 0, + 0, 0, 0, -3, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -8, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 5, -3, 0, + -5, 0, -7, 0, 0, -3, 0, 12, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, -3, -5, 0, -6, 0, -12, + -3, -12, 8, 0, 0, -8, 4, 8, + 11, 0, -10, -1, -5, 0, -1, -20, + 4, -3, 3, -22, 4, 0, 0, 1, + -22, 0, -22, -3, -36, -3, 0, -21, + 0, 8, 12, 0, 5, 0, 0, 0, + 0, 1, 0, -7, -5, 0, -12, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -5, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -3, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, -3, 0, -5, + 0, -3, 0, -8, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 3, 0, + -3, 0, 0, 0, 0, -5, -6, 0, + -8, 0, 12, -3, 1, -13, 0, 0, + 11, -21, -22, -17, -8, 4, 0, -3, + -27, -7, 0, -7, 0, -8, 6, -7, + -27, 0, -11, 0, 0, 2, -1, 3, + -3, 0, 4, 0, -12, -16, 0, -21, + -10, -9, -10, -12, -5, -11, -1, -8, + -11, 2, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -7, -9, + -9, -1, 0, -12, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 2, + -2, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -8, 0, 0, 0, 0, -21, -12, 0, + 0, 0, -6, -21, 0, 0, -4, 4, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -7, 0, + 0, 0, 0, 5, 0, 3, -8, -8, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -12, 0, -4, 0, -6, -4, + 0, -9, -10, -12, -3, 0, -8, 0, + -12, 0, 0, 0, 0, 33, 0, 0, + 2, 0, 0, -5, 0, 4, 0, -18, + 0, 0, 0, 0, 0, -39, -7, 14, + 12, -3, -17, 0, 4, -6, 0, -21, + -2, -5, 4, -29, -4, 5, 0, 6, + -15, -6, -15, -14, -17, 0, 0, -25, + 0, 24, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -11, -14, -1, -39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -6, 0, 0, + -8, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -8, 0, 0, 8, + -1, 5, 0, -9, 4, -3, -1, -11, + -4, 0, -5, -4, -3, 0, -6, -7, + 0, 0, -3, -1, -3, -7, -5, 0, + 0, -4, 0, 4, -3, 0, -9, 0, + 0, 0, -8, 0, -7, 0, -7, -7, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 4, 0, -6, 0, -3, -5, + -13, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -3, -3, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -4, -5, + -4, 0, 3, 17, -1, 0, -11, 0, + -3, 8, 0, -4, -17, -5, 6, 0, + 0, -20, -7, 4, -7, 3, 0, -3, + -3, -13, 0, -6, 2, 0, 0, -7, + 0, 0, 0, 4, 4, -8, -8, 0, + -7, -4, -6, -4, -4, 0, -7, 2, + -8, -7, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, -5, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -6, 0, -8, 0, 0, 0, -14, 0, + 3, -9, 8, 1, -3, -20, 0, 0, + -9, -4, 0, -17, -10, -12, 0, 0, + -18, -4, -17, -16, -20, 0, -11, 0, + 3, 28, -5, 0, -10, -4, -1, -4, + -7, -11, -7, -15, -17, -10, -4, 0, + 0, -3, 0, 1, 0, 0, -29, -4, + 12, 9, -9, -15, 0, 1, -13, 0, + -21, -3, -4, 8, -38, -5, 1, 0, + 0, -27, -5, -22, -4, -30, 0, 0, + -29, 0, 25, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -16, -3, 0, -27, + 0, 0, 0, 0, -13, 0, -4, 0, + -1, -12, -20, 0, 0, -2, -6, -12, + -4, 0, -3, 0, 0, 0, 0, -19, + -4, -14, -13, -3, -7, -10, -4, -7, + 0, -8, -4, -14, -6, 0, -5, -8, + -4, -8, 0, 2, 0, -3, -14, 0, + 8, 0, -7, 0, 0, 0, 0, 5, + 0, 3, -8, 17, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -12, 0, + -4, 0, -6, -4, 0, -9, -10, -12, + -3, 0, -8, 3, 17, 0, 0, 0, + 0, 33, 0, 0, 2, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -8, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -8, + -4, 0, 0, -8, 0, 7, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 6, 8, 3, -4, 0, -13, + -7, 0, 12, -14, -13, -8, -8, 17, + 7, 4, -36, -3, 8, -4, 0, -4, + 5, -4, -15, 0, -4, 4, -5, -3, + -12, -3, 0, 0, 12, 8, 0, -12, + 0, -23, -5, 12, -5, -16, 1, -5, + -14, -14, -4, 17, 4, 0, -6, 0, + -11, 0, 3, 14, -10, -15, -17, -10, + 12, 0, 1, -30, -3, 4, -7, -3, + -10, 0, -9, -15, -6, -6, -3, 0, + 0, -10, -9, -4, 0, 12, 10, -4, + -23, 0, -23, -6, 0, -15, -24, -1, + -13, -7, -14, -12, 11, 0, 0, -5, + 0, -8, -4, 0, -4, -7, 0, 7, + -14, 4, 0, 0, -22, 0, -4, -9, + -7, -3, -12, -10, -14, -10, 0, -12, + -4, -10, -8, -12, -4, 0, 0, 1, + 20, -7, 0, -12, -4, 0, -4, -8, + -10, -11, -12, -16, -5, -8, 8, 0, + -6, 0, -21, -5, 2, 8, -13, -15, + -8, -14, 14, -4, 2, -39, -7, 8, + -9, -7, -15, 0, -12, -17, -5, -4, + -3, -4, -9, -12, -1, 0, 0, 12, + 12, -3, -27, 0, -25, -10, 10, -16, + -28, -8, -15, -17, -21, -14, 8, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 8, 3, -8, 8, 0, 0, -13, -1, + 0, -1, 0, 1, 1, -3, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 3, 12, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 3, 0, 0, 0, 0, 3, 0, + -3, 0, 16, 0, 7, 1, 1, -5, + 0, 8, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -25, 0, -4, 7, 0, 12, + 0, 0, 41, 5, -8, -8, 4, 4, + -3, 1, -21, 0, 0, 20, -25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -28, 16, 58, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -8, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -11, 0, + 0, 1, 0, 0, 4, 54, -8, -3, + 13, 11, -11, 4, 0, 0, 4, 4, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -54, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -12, + 0, 0, 0, -11, 0, 0, 0, 0, + -9, -2, 0, 0, 0, -9, 0, -5, + 0, -20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -28, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -8, 0, -6, 0, + -11, 0, 0, 0, -7, 4, -5, 0, + 0, -11, -4, -10, 0, 0, -11, 0, + -4, 0, -20, 0, -5, 0, 0, -34, + -8, -17, -5, -15, 0, 0, -28, 0, + -11, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -6, -7, -3, -7, 0, 0, + 0, 0, -9, 0, -9, 5, -5, 8, + 0, -3, -10, -3, -7, -8, 0, -5, + -2, -3, 3, -11, -1, 0, 0, 0, + -37, -3, -6, 0, -9, 0, -3, -20, + -4, 0, 0, -3, -3, 0, 0, 0, + 0, 3, 0, -3, -7, -3, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 0, 0, 0, 0, + 0, -9, 0, -3, 0, 0, 0, -8, + 4, 0, 0, 0, -11, -4, -8, 0, + 0, -12, 0, -4, 0, -20, 0, 0, + 0, 0, -40, 0, -8, -15, -21, 0, + 0, -28, 0, -3, -6, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -6, -2, + -6, 1, 0, 0, 7, -5, 0, 13, + 20, -4, -4, -12, 5, 20, 7, 9, + -11, 5, 17, 5, 12, 9, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 20, -7, -4, 0, -3, + 33, 18, 33, 0, 0, 0, 4, 0, + 0, 15, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, -35, -5, -3, -17, + -20, 0, 0, -28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, -35, -5, -3, + -17, -20, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, -10, 4, 0, -4, + 3, 7, 4, -12, 0, -1, -3, 4, + 0, 3, 0, 0, 0, 0, -10, 0, + -4, -3, -8, 0, -4, -17, 0, 26, + -4, 0, -9, -3, 0, -3, -7, 0, + -4, -12, -8, -5, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, -35, + -5, -3, -17, -20, 0, 0, -28, 0, + 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -13, -5, -4, 12, -4, -4, + -17, 1, -2, 1, -3, -11, 1, 9, + 1, 3, 1, 3, -10, -17, -5, 0, + -16, -8, -11, -17, -16, 0, -7, -8, + -5, -5, -3, -3, -5, -3, 0, -3, + -1, 6, 0, 6, -3, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -11, 0, -2, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, 0, 0, 0, -3, 0, 0, -7, + -4, 4, 0, -7, -8, -3, 0, -12, + -3, -9, -3, -5, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -28, 0, 13, 0, 0, -7, 0, + 0, 0, 0, -5, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -10, 0, 0, + 17, -5, -14, -13, 3, 5, 5, -1, + -12, 3, 6, 3, 12, 3, 14, -3, + -11, 0, 0, -17, 0, 0, -12, -11, + 0, 0, -8, 0, -5, -7, 0, -6, + 0, -6, 0, -3, 6, 0, -3, -12, + -4, 15, 0, 0, -4, 0, -8, 0, + 0, 5, -10, 0, 4, -4, 3, 0, + 0, -14, 0, -3, -1, 0, -4, 5, + -3, 0, 0, 0, -17, -5, -9, 0, + -12, 0, 0, -20, 0, 15, -4, 0, + -7, 0, 2, 0, -4, 0, -4, -12, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -5, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 9, 0, + 0, -3, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 8, 0, 10, + 0, 0, 0, 0, 0, -26, -24, 1, + 18, 12, 7, -17, 3, 17, 0, 15, + 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_26 = { +#else +lv_font_t lv_font_montserrat_26 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 29, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_26*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_28.c b/inc/lvgl/src/font/lv_font_montserrat_28.c new file mode 100644 index 0000000..a186747 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_28.c @@ -0,0 +1,5140 @@ +/******************************************************************************* + * Size: 28 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 28 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_28.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_28 + #define LV_FONT_MONTSERRAT_28 1 +#endif + +#if LV_FONT_MONTSERRAT_28 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xc, 0xff, 0x50, 0xcf, 0xf4, 0xb, 0xff, 0x30, + 0xaf, 0xf3, 0xa, 0xff, 0x20, 0x9f, 0xf2, 0x9, + 0xff, 0x10, 0x8f, 0xf0, 0x7, 0xff, 0x0, 0x7f, + 0xf0, 0x6, 0xfe, 0x0, 0x6f, 0xe0, 0x5, 0xfd, + 0x0, 0x27, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x86, 0x0, 0xdf, 0xf6, 0xf, 0xff, 0x80, + 0x6f, 0xc1, + + /* U+0022 "\"" */ + 0x3f, 0xf1, 0x2, 0xff, 0x23, 0xff, 0x10, 0x2f, + 0xf2, 0x2f, 0xf0, 0x1, 0xff, 0x12, 0xff, 0x0, + 0x1f, 0xf1, 0x2f, 0xf0, 0x1, 0xff, 0x11, 0xff, + 0x0, 0xf, 0xf0, 0x1f, 0xf0, 0x0, 0xff, 0x0, + 0x98, 0x0, 0x9, 0x90, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0xaf, 0x50, 0x0, 0x6, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf3, 0x0, 0x0, + 0x7f, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x9, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0xbf, 0x40, 0x0, 0x0, 0x0, + 0x1, 0xfd, 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, 0x80, 0x0, + 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, + 0x0, 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x40, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xf2, 0x0, 0x0, 0x9f, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xa, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, + 0xcf, 0x30, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x7, 0xf8, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0x60, 0x0, 0x4, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x6f, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x20, 0x0, + 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, 0xaf, 0x50, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8c, 0xef, 0xff, 0xd9, 0x40, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x5, 0xff, 0xfc, 0x8f, 0xd7, 0xae, 0xff, 0x10, + 0xe, 0xff, 0x50, 0xf, 0xc0, 0x0, 0x59, 0x0, + 0x4f, 0xf9, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x5f, 0xf6, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x4f, 0xfa, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x80, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xbf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x1, 0x6b, 0xff, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xed, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x3c, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0xdf, 0xf1, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x8f, 0xf3, + 0x4, 0x0, 0x0, 0xf, 0xc0, 0x0, 0xbf, 0xf1, + 0x5f, 0xa2, 0x0, 0xf, 0xc0, 0x5, 0xff, 0xc0, + 0xaf, 0xff, 0xc8, 0x7f, 0xd8, 0xcf, 0xff, 0x30, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x17, 0xbe, 0xff, 0xff, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x7d, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0xa, 0xfd, 0x9c, 0xfc, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0x0, 0x0, 0x4f, 0xb0, + 0x0, 0x8f, 0x70, 0x0, 0x0, 0x4f, 0xd0, 0x0, + 0x0, 0xbf, 0x30, 0x0, 0xf, 0xd0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0x0, 0xef, 0x0, 0x0, 0xc, + 0xf1, 0x0, 0x9, 0xf9, 0x0, 0x0, 0x0, 0xfe, + 0x0, 0x0, 0xa, 0xf1, 0x0, 0x4f, 0xd0, 0x0, + 0x0, 0x0, 0xef, 0x0, 0x0, 0xc, 0xf1, 0x0, + 0xef, 0x30, 0x0, 0x0, 0x0, 0xbf, 0x30, 0x0, + 0xf, 0xd0, 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xb0, 0x0, 0x8f, 0x70, 0x4f, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x9c, 0xfc, 0x0, + 0xef, 0x30, 0x5, 0x88, 0x50, 0x0, 0x0, 0x7d, + 0xfe, 0x80, 0x9, 0xf8, 0x1, 0xcf, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xd0, 0xb, + 0xf9, 0x11, 0x8f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x30, 0x2f, 0xc0, 0x0, 0xc, 0xf3, 0x0, + 0x0, 0x0, 0x9, 0xf8, 0x0, 0x6f, 0x60, 0x0, + 0x6, 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xd0, 0x0, + 0x8f, 0x40, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x1, + 0xef, 0x30, 0x0, 0x7f, 0x50, 0x0, 0x5, 0xf8, + 0x0, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x4f, 0x80, + 0x0, 0x8, 0xf5, 0x0, 0x0, 0x4f, 0xd0, 0x0, + 0x0, 0xe, 0xe1, 0x0, 0x1e, 0xe0, 0x0, 0x1, + 0xef, 0x30, 0x0, 0x0, 0x4, 0xfe, 0x87, 0xef, + 0x40, 0x0, 0xa, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xff, 0xb3, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x19, 0xdf, 0xfd, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfe, 0x40, 0x5, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, 0x0, + 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, + 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xf7, + 0x0, 0x1, 0xef, 0x80, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x20, 0x2d, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xd8, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x8f, 0xfd, 0x10, + 0x0, 0x24, 0x0, 0x6, 0xff, 0xa1, 0x5, 0xff, + 0xd1, 0x0, 0x9f, 0xb0, 0x2f, 0xfb, 0x0, 0x0, + 0x5f, 0xfd, 0x10, 0xdf, 0x70, 0x8f, 0xf2, 0x0, + 0x0, 0x5, 0xff, 0xd6, 0xff, 0x30, 0xbf, 0xe0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, 0xaf, + 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, + 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x10, 0xd, 0xff, 0xe7, 0x54, 0x59, 0xef, 0xfb, + 0xff, 0xd1, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x5f, 0xf8, 0x0, 0x4, 0x9d, 0xff, 0xeb, + 0x60, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3f, 0xf1, 0x3f, 0xf1, 0x2f, 0xf0, 0x2f, 0xf0, + 0x2f, 0xf0, 0x1f, 0xf0, 0x1f, 0xf0, 0x9, 0x80, + + /* U+0028 "(" */ + 0x0, 0x4, 0xff, 0x40, 0x0, 0xcf, 0xc0, 0x0, + 0x4f, 0xf5, 0x0, 0xb, 0xfe, 0x0, 0x0, 0xff, + 0x90, 0x0, 0x5f, 0xf4, 0x0, 0x9, 0xff, 0x0, + 0x0, 0xcf, 0xd0, 0x0, 0xf, 0xfa, 0x0, 0x2, + 0xff, 0x70, 0x0, 0x3f, 0xf6, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x5f, 0xf5, 0x0, 0x5, 0xff, 0x50, + 0x0, 0x4f, 0xf6, 0x0, 0x3, 0xff, 0x60, 0x0, + 0x2f, 0xf7, 0x0, 0x0, 0xff, 0xa0, 0x0, 0xc, + 0xfd, 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x5, 0xff, + 0x40, 0x0, 0xf, 0xf9, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x4, 0xff, 0x50, 0x0, 0xc, 0xfc, 0x0, + 0x0, 0x4f, 0xf4, + + /* U+0029 ")" */ + 0xd, 0xfb, 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x0, + 0xdf, 0xb0, 0x0, 0x7, 0xff, 0x20, 0x0, 0x2f, + 0xf7, 0x0, 0x0, 0xdf, 0xc0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x6f, 0xf3, 0x0, 0x3, 0xff, 0x60, + 0x0, 0xf, 0xf9, 0x0, 0x0, 0xff, 0xa0, 0x0, + 0xe, 0xfb, 0x0, 0x0, 0xdf, 0xc0, 0x0, 0xd, + 0xfc, 0x0, 0x0, 0xef, 0xb0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0xff, 0x90, 0x0, 0x3f, 0xf6, 0x0, + 0x6, 0xff, 0x30, 0x0, 0x8f, 0xf0, 0x0, 0xd, + 0xfc, 0x0, 0x2, 0xff, 0x70, 0x0, 0x7f, 0xf2, + 0x0, 0xd, 0xfb, 0x0, 0x6, 0xff, 0x30, 0x0, + 0xdf, 0xb0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, 0x0, 0x3, + 0xf6, 0x0, 0x0, 0x1e, 0x80, 0x3f, 0x60, 0x7e, + 0x33, 0xdf, 0xe9, 0xfa, 0xdf, 0xe5, 0x0, 0x7e, + 0xff, 0xff, 0x91, 0x0, 0x1, 0xaf, 0xff, 0xc2, + 0x0, 0x7, 0xef, 0xef, 0xef, 0xf9, 0x13, 0xfe, + 0x63, 0xf6, 0x4d, 0xf6, 0x6, 0x10, 0x3f, 0x60, + 0x6, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x17, 0x30, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x44, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x50, 0x0, 0x0, 0x3, 0x33, 0x33, 0xff, 0x73, + 0x33, 0x31, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x50, 0x0, 0x0, + + /* U+002C "," */ + 0x1a, 0xb4, 0x8, 0xff, 0xe0, 0x9f, 0xff, 0x2, + 0xdf, 0xc0, 0xa, 0xf6, 0x0, 0xef, 0x10, 0x2f, + 0xc0, 0x6, 0xf6, 0x0, + + /* U+002D "-" */ + 0x25, 0x55, 0x55, 0x55, 0x6, 0xff, 0xff, 0xff, + 0xf2, 0x6f, 0xff, 0xff, 0xff, 0x20, + + /* U+002E "." */ + 0x1a, 0xc4, 0x9, 0xff, 0xe0, 0xaf, 0xff, 0x2, + 0xde, 0x60, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x86, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x20, 0x0, 0x0, 0x0, 0xa, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x90, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x7, 0xcf, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x4f, 0xff, 0xd9, 0x8a, 0xff, 0xfd, + 0x10, 0x0, 0x1e, 0xff, 0x70, 0x0, 0x1, 0xbf, + 0xfa, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xdf, 0xf3, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x90, 0x3f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0x7, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf1, 0x9f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x3a, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf4, 0xaf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x49, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x13, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0xe, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0x30, + 0x1, 0xef, 0xf7, 0x0, 0x0, 0x1b, 0xff, 0xa0, + 0x0, 0x4, 0xff, 0xfd, 0x98, 0xaf, 0xff, 0xd1, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xeb, 0x50, + 0x0, 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, 0xf6, + 0x57, 0x77, 0xaf, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5f, 0xf6, + + /* U+0032 "2" */ + 0x0, 0x3, 0x8c, 0xef, 0xfc, 0x82, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x2e, 0xff, 0xfb, 0x98, 0xae, 0xff, 0xf5, 0x0, + 0x2d, 0xf9, 0x10, 0x0, 0x0, 0x8f, 0xfe, 0x0, + 0x1, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfa, 0x77, 0x77, 0x77, 0x77, 0x70, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+0033 "3" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, + 0x77, 0x77, 0x77, 0x77, 0xdf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3, 0x88, 0xad, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, + 0x3f, 0xc4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x2a, + 0xff, 0xfe, 0xa8, 0x89, 0xdf, 0xff, 0x70, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1, + 0x6a, 0xdf, 0xfe, 0xc7, 0x20, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xa0, 0x0, 0xa, 0xb7, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x1, 0xef, 0xf2, 0x0, 0x0, 0xf, + 0xfa, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, 0x8f, 0xfd, 0x66, 0x66, + 0x66, 0x6f, 0xfc, 0x66, 0x62, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x4f, 0xf9, 0x77, 0x77, 0x77, 0x77, 0x0, + 0x0, 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, + 0xd, 0xe6, 0x0, 0x0, 0x0, 0x2c, 0xff, 0x70, + 0x5f, 0xff, 0xfb, 0x98, 0x9b, 0xff, 0xfd, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x4, 0x9c, 0xef, 0xed, 0x94, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfd, 0xa4, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x1d, 0xff, 0xfb, 0x86, 0x89, 0xed, 0x0, + 0x0, 0xcf, 0xfb, 0x20, 0x0, 0x0, 0x2, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x5, 0xae, 0xfe, 0xd8, 0x20, 0x0, + 0xaf, 0xf3, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xaf, 0xfd, 0xff, 0x95, 0x46, 0xaf, 0xff, 0x60, + 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x4, 0xff, 0xe0, + 0x7f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, + 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, + 0xa, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf4, + 0x2, 0xff, 0xd1, 0x0, 0x0, 0x4, 0xff, 0xd0, + 0x0, 0x7f, 0xff, 0x95, 0x45, 0xaf, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc7, 0x10, 0x0, + + /* U+0037 "7" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x2f, 0xfb, 0x77, 0x77, 0x77, 0x77, 0xcf, 0xf5, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x5a, 0xdf, 0xfd, 0xa6, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x2, 0xef, 0xfd, 0x75, 0x57, 0xdf, 0xff, 0x20, + 0xa, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, + 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, + 0xa, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x1, 0xef, 0xfa, 0x42, 0x25, 0xaf, 0xfe, 0x10, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xb, 0xff, 0xc5, 0x20, 0x2, 0x6d, 0xff, 0xb0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf5, + 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, + 0x4f, 0xfd, 0x20, 0x0, 0x0, 0x2, 0xdf, 0xf5, + 0xa, 0xff, 0xfa, 0x64, 0x56, 0xaf, 0xff, 0xb0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x2, 0x7c, 0xef, 0xfe, 0xc7, 0x20, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x5b, 0xef, 0xed, 0x93, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x1, 0xdf, 0xfc, 0x64, 0x58, 0xdf, 0xfa, 0x0, + 0x9, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0x60, + 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, + 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, + 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, + 0xa, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x2, 0xff, 0xfd, 0x75, 0x58, 0xdf, 0xee, 0xfe, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x3e, 0xfe, + 0x0, 0x0, 0x7c, 0xef, 0xeb, 0x60, 0xf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x10, + 0x0, 0x8f, 0xa8, 0x67, 0xae, 0xff, 0xf3, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x39, 0xcf, 0xff, 0xd9, 0x40, 0x0, 0x0, + + /* U+003A ":" */ + 0x2d, 0xe6, 0xa, 0xff, 0xf0, 0x9f, 0xfe, 0x1, + 0xac, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xac, 0x40, 0x9f, 0xfe, + 0xa, 0xff, 0xf0, 0x2d, 0xe6, 0x0, + + /* U+003B ";" */ + 0x2d, 0xe6, 0xa, 0xff, 0xf0, 0x9f, 0xfe, 0x1, + 0xac, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xab, 0x40, 0x8f, 0xfe, + 0x9, 0xff, 0xf0, 0x2d, 0xfc, 0x0, 0xaf, 0x60, + 0xe, 0xf1, 0x2, 0xfc, 0x0, 0x6f, 0x60, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x96, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xb2, 0x0, 0x1, 0x7d, + 0xff, 0xfd, 0x71, 0x0, 0x4, 0xaf, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x2f, 0xff, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x61, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xdf, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0x3, 0x9f, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, + + /* U+003D "=" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x3, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x31, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+003E ">" */ + 0x1b, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x9, 0xef, + 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xf6, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xc3, + 0x0, 0x0, 0x5c, 0xff, 0xfe, 0x82, 0x0, 0x3, + 0x9f, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x1f, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x2f, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x4, 0x9d, 0xef, 0xfc, 0x92, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3e, + 0xff, 0xe9, 0x76, 0x8d, 0xff, 0xf6, 0x4, 0xef, + 0x70, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x1, 0x50, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xaa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xed, 0x10, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfe, + 0xb8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd7, + 0x20, 0x0, 0x0, 0x26, 0xcf, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x1d, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xfd, 0x10, 0x0, 0x0, 0x1d, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x10, 0x0, 0xa, 0xfc, 0x0, 0x0, + 0x18, 0xdf, 0xfd, 0x81, 0xf, 0xf8, 0xb, 0xfa, + 0x0, 0x3, 0xff, 0x20, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xe4, 0xff, 0x80, 0x1e, 0xf3, 0x0, 0xbf, + 0x80, 0x0, 0x4f, 0xff, 0x83, 0x35, 0xbf, 0xff, + 0xf8, 0x0, 0x6f, 0xb0, 0x1f, 0xf1, 0x0, 0xe, + 0xfe, 0x20, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0xef, 0x15, 0xfc, 0x0, 0x5, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xaf, 0xf8, 0x0, 0xa, 0xf4, 0x8f, + 0x80, 0x0, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x80, 0x0, 0x7f, 0x79, 0xf7, 0x0, 0xd, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, + 0x5, 0xf8, 0xaf, 0x60, 0x0, 0xef, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x80, 0x0, 0x4f, 0x99, + 0xf7, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x5, 0xf8, 0x7f, 0x90, 0x0, + 0xaf, 0xd0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, + 0x0, 0x7f, 0x75, 0xfc, 0x0, 0x5, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0xa, 0xf4, + 0x1f, 0xf1, 0x0, 0xe, 0xfe, 0x20, 0x0, 0x0, + 0x6f, 0xff, 0x90, 0x1, 0xff, 0x0, 0xbf, 0x80, + 0x0, 0x4f, 0xff, 0x83, 0x24, 0xaf, 0xfc, 0xff, + 0x53, 0xcf, 0x80, 0x3, 0xff, 0x20, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xe4, 0x4f, 0xff, 0xff, 0xc0, + 0x0, 0xa, 0xfc, 0x0, 0x0, 0x18, 0xcf, 0xfd, + 0x81, 0x0, 0x5d, 0xfe, 0x80, 0x0, 0x0, 0xd, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xd7, 0x30, 0x0, + 0x0, 0x37, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xfe, 0xee, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x37, 0xbe, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe9, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x81, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x10, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x6, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x33, 0x33, 0x33, 0x3c, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfe, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x60, 0x5, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xd0, 0xc, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf4, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa5, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x1f, 0xfc, 0x44, 0x44, 0x44, 0x69, + 0xff, 0xfd, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0x60, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xa0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x40, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x14, 0xbf, 0xfb, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x1f, 0xfc, 0x44, 0x44, 0x44, + 0x45, 0x8e, 0xff, 0xa0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x1f, 0xfc, 0x44, 0x44, 0x44, 0x45, 0x8e, + 0xff, 0xe1, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xda, 0x50, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, + 0x89, 0xbf, 0xff, 0xf8, 0x0, 0x5, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x6, 0xef, 0xb0, 0x1, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0x80, 0x0, + 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0, + 0x0, 0x5f, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x6e, + 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0xa8, 0x8a, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xef, 0xed, 0xa5, 0x0, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x1f, 0xfd, 0x77, 0x77, + 0x77, 0x9c, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xf8, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x40, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xc0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf7, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf3, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xf8, 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x9c, + 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1f, 0xfd, 0x66, 0x66, 0x66, 0x66, 0x63, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x71, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1f, + 0xfd, 0x77, 0x77, 0x77, 0x77, 0x77, 0x51, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xd6, 0x66, 0x66, + 0x66, 0x66, 0x30, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, 0x61, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, + 0x88, 0xae, 0xff, 0xfb, 0x0, 0x4, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x4, 0xdf, 0xd1, 0x1, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x81, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x38, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x31, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x9, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x1f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, + 0x0, 0x4f, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x3c, + 0xff, 0x30, 0x0, 0x5f, 0xff, 0xfd, 0xa8, 0x89, + 0xdf, 0xff, 0xe1, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xef, 0xfd, 0xa6, 0x10, 0x0, + + /* U+0048 "H" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x1f, 0xfd, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x7f, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfc, + + /* U+0049 "I" */ + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, 0x1f, 0xfb, + + /* U+004A "J" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x17, 0x77, + 0x77, 0x78, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x80, 0x6, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0xa, 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x11, 0xdf, + 0xfd, 0x86, 0x8e, 0xff, 0xa0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5b, 0xef, 0xeb, + 0x60, 0x0, + + /* U+004B "K" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xe2, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xf3, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf4, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x1, 0xdf, 0xf5, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x1, 0xdf, 0xf6, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0xbf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x9f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x20, 0x8f, 0xfe, + 0x10, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x20, 0x0, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x20, + 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x1, 0xef, 0xf7, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe2, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xb0, + + /* U+004C "L" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xd7, 0x77, 0x77, 0x77, 0x77, 0x72, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+004D "M" */ + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xfc, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x1f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfc, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x1f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0x1f, + 0xfe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfc, 0x1f, 0xfa, 0xcf, 0xe1, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x7e, 0xfc, 0x1f, 0xfa, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0xd, 0xfd, 0xe, 0xfc, + 0x1f, 0xfa, 0x9, 0xff, 0x20, 0x0, 0x0, 0x6f, + 0xf4, 0xe, 0xfc, 0x1f, 0xfa, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xb0, 0xe, 0xfc, 0x1f, 0xfa, + 0x0, 0x7f, 0xf5, 0x0, 0x8, 0xff, 0x20, 0xe, + 0xfc, 0x1f, 0xfa, 0x0, 0xd, 0xfe, 0x0, 0x2f, + 0xf8, 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x4, + 0xff, 0x70, 0xbf, 0xe0, 0x0, 0xe, 0xfc, 0x1f, + 0xfa, 0x0, 0x0, 0xaf, 0xf6, 0xff, 0x60, 0x0, + 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, 0xe, 0xfc, + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, + 0x0, 0xe, 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x0, + 0x49, 0x10, 0x0, 0x0, 0xe, 0xfc, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfc, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfc, + + /* U+004E "N" */ + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfc, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x1f, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfc, 0xdf, + 0xf9, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x1f, 0xfb, + 0x2f, 0xff, 0x50, 0x0, 0x0, 0xf, 0xfc, 0x1f, + 0xfb, 0x5, 0xff, 0xf2, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xfb, 0x0, 0x9f, 0xfd, 0x10, 0x0, 0xf, + 0xfc, 0x1f, 0xfb, 0x0, 0xc, 0xff, 0xb0, 0x0, + 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x1, 0xef, 0xf8, + 0x0, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x3f, + 0xff, 0x40, 0xf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, + 0x6, 0xff, 0xf2, 0xf, 0xfc, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0xaf, 0xfd, 0xf, 0xfc, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xaf, 0xfc, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfc, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfc, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xda, 0x89, 0xbf, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x4f, 0xff, 0xb3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf9, 0x0, 0x9, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x20, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x90, 0x5f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, + 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf0, 0xaf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0xaf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf2, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf0, 0x5f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x90, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x20, 0x1, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf9, 0x0, + 0x0, 0x4f, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xda, + 0x89, 0xbf, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xda, + 0x60, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x78, 0xaf, 0xff, + 0xf3, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xd0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x51, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb1, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xfb, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x91, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf5, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x1, 0xff, 0xd7, + 0x77, 0x77, 0x7a, 0xff, 0xff, 0x30, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xda, 0x89, 0xbf, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xef, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf8, + 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf2, 0x0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, + 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfd, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x9, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x20, 0xaf, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xd0, 0x1, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x20, 0x0, 0x2f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x90, 0x0, + 0x0, 0x5f, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfc, + 0x87, 0x79, 0xef, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xa5, 0x46, 0xdf, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xce, 0xfd, 0x81, 0x0, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x1f, 0xfd, 0x77, 0x77, 0x78, 0xaf, + 0xff, 0xf3, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfd, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x50, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x90, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x50, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x1f, 0xfd, 0x66, 0x66, 0x67, + 0x9e, 0xff, 0xf3, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x1f, + 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xa0, + 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf5, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xfe, 0x10, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xb0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x6b, 0xdf, 0xfe, 0xc8, 0x30, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x4, 0xff, 0xfc, 0x86, 0x67, 0xbf, 0xff, 0x10, + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x69, 0x0, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa6, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x5f, 0xb4, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0xaf, 0xff, 0xe9, 0x76, 0x68, 0xdf, 0xff, 0x30, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x5, 0x9d, 0xef, 0xed, 0xa5, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x67, 0x77, 0x77, 0x8f, 0xfc, 0x77, 0x77, + 0x77, 0x20, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf5, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf5, 0x3f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x2f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf4, 0xf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0xc, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x7, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x4f, 0xff, 0xea, 0x88, 0xae, 0xff, + 0xf5, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x6, 0xae, 0xff, + 0xeb, 0x60, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0xef, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x70, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0xaf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, + 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x20, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, 0xfa, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf1, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x6, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, + 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf5, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0xa, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x32, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfa, 0x8f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x4, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0xe, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0xaf, + 0xf3, 0x0, 0x0, 0x0, 0xe, 0xfb, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x4, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0x4b, 0xff, 0x0, + 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0xf, 0xfe, + 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x6f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xf3, + 0x0, 0x0, 0xe, 0xfa, 0x1, 0xff, 0xa0, 0x0, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x5, 0xff, 0x80, + 0x0, 0x4, 0xff, 0x40, 0xb, 0xff, 0x0, 0x0, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x6f, 0xf4, 0x0, 0x2, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xf3, 0x0, + 0xf, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x8f, + 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0x80, 0x4, + 0xff, 0x40, 0x0, 0xb, 0xff, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x0, 0xaf, + 0xe0, 0x0, 0x0, 0x5f, 0xf4, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0xf, 0xf9, + 0x0, 0x0, 0x0, 0xff, 0x90, 0x7f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x85, 0xff, 0x40, + 0x0, 0x0, 0xb, 0xfe, 0xd, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfd, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x5f, 0xf7, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf3, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf9, 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x2f, 0xfd, 0x0, 0x0, 0x6f, 0xfc, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0xbf, 0xf7, + 0x0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x1, + 0xef, 0xf3, 0x0, 0x4, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xd0, 0x1, 0xef, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0xaf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xd2, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf2, + 0x6, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf7, 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x1e, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x3f, 0xfe, + 0x10, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x8f, 0xfa, 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf6, 0x4, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x50, 0x0, 0x9f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x1e, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, + 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x3, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x50, 0x1, 0xef, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe0, 0x9, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0xdf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x74, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, + + /* U+005B "[" */ + 0x1f, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xfc, 0x1f, + 0xfb, 0x33, 0x21, 0xff, 0xa0, 0x0, 0x1f, 0xfa, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, + 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, + 0x1f, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, + 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, + 0x1, 0xff, 0xb3, 0x32, 0x1f, 0xff, 0xff, 0xc1, + 0xff, 0xff, 0xfc, + + /* U+005C "\\" */ + 0x7, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x60, + + /* U+005D "]" */ + 0x7f, 0xff, 0xff, 0x67, 0xff, 0xff, 0xf6, 0x13, + 0x37, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, + 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, + 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, + 0x4f, 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, + 0xf6, 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, + 0x0, 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, + 0x4, 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, + 0xff, 0x60, 0x0, 0x4f, 0xf6, 0x0, 0x4, 0xff, + 0x61, 0x33, 0x7f, 0xf6, 0x7f, 0xff, 0xff, 0x67, + 0xff, 0xff, 0xf6, + + /* U+005E "^" */ + 0x0, 0x0, 0x7, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xd7, 0xf9, + 0x0, 0x0, 0x0, 0xa, 0xf6, 0x1f, 0xf0, 0x0, + 0x0, 0x1, 0xff, 0x0, 0xaf, 0x60, 0x0, 0x0, + 0x8f, 0x90, 0x3, 0xfd, 0x0, 0x0, 0xe, 0xf2, + 0x0, 0xd, 0xf4, 0x0, 0x6, 0xfb, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0xff, + 0x20, 0x4f, 0xd0, 0x0, 0x0, 0x9, 0xf9, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf0, + + /* U+005F "_" */ + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x38, 0x87, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, + 0x0, 0x2d, 0xfc, 0x10, 0x0, 0x0, 0xaf, 0xd1, + + /* U+0061 "a" */ + 0x0, 0x17, 0xbe, 0xff, 0xda, 0x40, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xd, 0xfe, + 0xa6, 0x56, 0xaf, 0xff, 0x60, 0x3, 0x70, 0x0, + 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf4, 0x0, 0x28, 0xce, 0xef, 0xff, 0xff, + 0xf4, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x2f, 0xfe, 0x51, 0x0, 0x0, 0x6f, 0xf5, 0x7f, + 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x9f, 0xf1, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x7f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0xf5, 0x2f, 0xfe, 0x50, 0x1, + 0x6e, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xf5, 0x0, 0x29, 0xef, 0xfd, 0x92, 0x3f, + 0xf5, + + /* U+0062 "b" */ + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x5, 0xbe, 0xfd, 0xb5, 0x0, 0x0, + 0x7f, 0xf5, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xfe, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, + 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, 0xf5, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x7f, 0xfd, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, + 0x7f, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xf2, 0x5, 0xbe, 0xfe, 0xb5, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xdf, 0xfe, 0x96, 0x69, 0xff, 0xf8, 0x0, 0xbf, + 0xfa, 0x0, 0x0, 0x1, 0xcf, 0x80, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x8, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, + 0x1, 0x20, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x1, + 0xcf, 0x80, 0x1, 0xdf, 0xfe, 0x96, 0x69, 0xff, + 0xf8, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x5a, 0xdf, 0xec, 0x60, 0x2f, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x4f, 0xf8, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0xf8, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x9f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf8, + 0xc, 0xff, 0x80, 0x0, 0x0, 0xb, 0xff, 0xf8, + 0x1, 0xef, 0xfc, 0x63, 0x47, 0xef, 0xef, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xf8, + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x70, 0xf, 0xf8, + + /* U+0065 "e" */ + 0x0, 0x0, 0x4b, 0xdf, 0xec, 0x61, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x1, + 0xef, 0xfb, 0x64, 0x59, 0xff, 0xf4, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0x2, 0xdf, 0xe1, 0x3f, 0xf6, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x69, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xfb, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xbf, 0xfb, 0x10, 0x0, 0x0, + 0x5e, 0x30, 0x1, 0xdf, 0xff, 0x96, 0x68, 0xcf, + 0xfc, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x39, 0xde, 0xfe, 0xa5, 0x0, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x18, 0xdf, 0xeb, 0x40, 0x0, 0x1d, + 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, 0xa4, 0x49, + 0x30, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0xf, + 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0x90, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x23, 0x4f, 0xfb, 0x33, + 0x33, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, + 0xfa, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x71, 0xc, 0xfc, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xfe, 0x4c, 0xfc, + 0x3, 0xff, 0xfd, 0x86, 0x68, 0xef, 0xfe, 0xfc, + 0xd, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xfc, + 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfc, + 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0xaf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, + 0xd, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x2, 0xff, 0xfe, 0x96, 0x69, 0xef, 0xff, 0xfc, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xfb, + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x71, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x3, 0xe6, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0xc, 0xff, 0xea, 0x76, 0x68, 0xcf, 0xff, 0x50, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x3, 0x8b, 0xef, 0xfe, 0xb7, 0x10, 0x0, + + /* U+0068 "h" */ + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x6, + 0xbe, 0xfe, 0xb5, 0x0, 0x7, 0xff, 0x5d, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xfe, 0x97, + 0x7a, 0xff, 0xf9, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x3, 0xff, 0xf2, 0x7f, 0xfe, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x67, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x97, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, + 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa7, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x7f, + 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa7, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x7f, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, + + /* U+0069 "i" */ + 0x5e, 0xd3, 0xdf, 0xfa, 0xbf, 0xf7, 0x6, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, + + /* U+006A "j" */ + 0x0, 0x0, 0x3, 0xee, 0x40, 0x0, 0x0, 0xbf, + 0xfc, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, + 0x6, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5, 0xff, + 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x5, + 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, + 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, 0x0, + 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, 0xf6, + 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0x5f, + 0xf6, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, + 0x5f, 0xf6, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x0, 0x5f, 0xf5, 0x0, 0x0, 0x9, 0xff, 0x30, + 0xb6, 0x58, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xf4, + 0x2, 0xad, 0xfe, 0xb3, 0x0, + + /* U+006B "k" */ + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x20, + 0x7f, 0xf3, 0x0, 0x0, 0x5, 0xff, 0xe2, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x6f, 0xfe, 0x20, 0x0, + 0x7f, 0xf3, 0x0, 0x7, 0xff, 0xe2, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x8f, 0xfe, 0x20, 0x0, 0x0, + 0x7f, 0xf3, 0x9, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x7f, 0xf4, 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x7f, 0xfe, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x5f, 0xff, 0x20, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x7f, 0xfa, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x10, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, + + /* U+006C "l" */ + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, 0x7f, 0xf3, + 0x7f, 0xf3, + + /* U+006D "m" */ + 0x7f, 0xf2, 0x18, 0xce, 0xfd, 0x93, 0x0, 0x2, + 0x8d, 0xff, 0xd9, 0x20, 0x0, 0x7f, 0xf5, 0xef, + 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x7f, 0xff, 0xfc, 0x64, 0x5a, 0xff, + 0xfa, 0xff, 0xc6, 0x45, 0xaf, 0xff, 0x30, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xb0, 0x7f, 0xfd, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xdf, + 0xf0, 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x9f, 0xf1, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0xf2, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, + 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, + 0xf3, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x7f, 0xf3, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xf3, + + /* U+006E "n" */ + 0x7f, 0xf2, 0x7, 0xce, 0xfe, 0xb5, 0x0, 0x7, + 0xff, 0x5e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xfd, 0x75, 0x58, 0xef, 0xf9, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x2, 0xef, 0xf2, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x67, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x2f, 0xf8, 0x7f, 0xf4, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x97, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xa7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, + 0xfa, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, + + /* U+006F "o" */ + 0x0, 0x0, 0x4a, 0xdf, 0xed, 0x82, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xfb, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0x70, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe0, + 0xb, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0x70, + 0x1, 0xdf, 0xfe, 0x96, 0x6a, 0xff, 0xfb, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xed, 0x92, 0x0, 0x0, + + /* U+0070 "p" */ + 0x7f, 0xf2, 0x6, 0xbe, 0xfd, 0xb5, 0x0, 0x0, + 0x7f, 0xf4, 0xdf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xfe, 0xfe, 0x84, 0x46, 0xcf, 0xff, 0x20, + 0x7f, 0xff, 0xc1, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xf5, + 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, + 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x7f, 0xff, 0xd2, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x7f, 0xfe, 0xff, 0xa7, 0x68, 0xef, 0xff, 0x20, + 0x7f, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x7f, 0xf3, 0x5, 0xbe, 0xfe, 0xb5, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x5a, 0xdf, 0xec, 0x60, 0xf, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xf8, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x2c, 0xff, 0xf8, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x1c, 0xff, 0xf8, + 0x1, 0xef, 0xfe, 0x96, 0x6a, 0xff, 0xef, 0xf8, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xf8, + 0x0, 0x0, 0x5b, 0xdf, 0xec, 0x60, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, + + /* U+0072 "r" */ + 0x7f, 0xf2, 0x6, 0xce, 0x87, 0xff, 0x3d, 0xff, + 0xf8, 0x7f, 0xfd, 0xff, 0xc9, 0x57, 0xff, 0xfd, + 0x20, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x7, 0xff, + 0x80, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, 0x7, + 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, 0x0, + 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0x30, 0x0, 0x0, 0x7f, + 0xf3, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x2, 0x9d, 0xff, 0xec, 0x83, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x5, 0xff, + 0xe8, 0x65, 0x69, 0xef, 0x20, 0xb, 0xff, 0x20, + 0x0, 0x0, 0x3, 0x0, 0xd, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0xb8, 0x51, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0x36, 0x9c, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x5, 0x70, 0x0, + 0x0, 0x0, 0xbf, 0xf1, 0xe, 0xff, 0xa7, 0x55, + 0x7c, 0xff, 0xb0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x38, 0xce, 0xff, 0xda, 0x50, + 0x0, + + /* U+0074 "t" */ + 0x0, 0x8, 0x85, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfe, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x23, 0x4f, 0xfb, 0x33, 0x33, 0x0, 0x1, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb5, 0x5a, 0x40, 0x0, 0x2e, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x19, 0xef, 0xea, + 0x30, + + /* U+0075 "u" */ + 0x9f, 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, + 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x69, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x9f, 0xf1, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x68, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x8f, 0xf6, 0x5f, 0xf7, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x61, 0xff, 0xe2, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x8, 0xff, 0xe8, 0x44, 0x6d, 0xff, + 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, 0xfe, 0x5f, + 0xf6, 0x0, 0x4, 0xae, 0xfe, 0xc7, 0x2, 0xff, + 0x60, + + /* U+0076 "v" */ + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x1f, + 0xf9, 0x0, 0x8, 0xff, 0x30, 0x0, 0x0, 0x7, + 0xff, 0x20, 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, + 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xf5, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xc0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x37, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd4, 0xff, 0x40, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xe, + 0xf7, 0xe, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0x5, 0xff, 0x10, 0x8f, 0xf0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xbf, 0xb0, 0x2, 0xff, 0x50, 0x0, 0x2, 0xff, + 0x5f, 0xf6, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0xc, + 0xfb, 0x0, 0x0, 0x8f, 0xd0, 0xbf, 0xc0, 0x0, + 0x6, 0xfe, 0x0, 0x0, 0x7f, 0xf1, 0x0, 0xe, + 0xf7, 0x5, 0xff, 0x20, 0x0, 0xcf, 0x90, 0x0, + 0x1, 0xff, 0x60, 0x4, 0xff, 0x10, 0xe, 0xf8, + 0x0, 0x2f, 0xf3, 0x0, 0x0, 0xb, 0xfc, 0x0, + 0xaf, 0xb0, 0x0, 0x9f, 0xe0, 0x8, 0xfd, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x1f, 0xf5, 0x0, 0x3, + 0xff, 0x40, 0xef, 0x70, 0x0, 0x0, 0x0, 0xef, + 0x86, 0xff, 0x0, 0x0, 0xc, 0xf9, 0x4f, 0xf1, + 0x0, 0x0, 0x0, 0x9, 0xfd, 0xcf, 0x90, 0x0, + 0x0, 0x6f, 0xfa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x1e, 0xfe, 0x10, 0x0, 0x0, 0x9, 0xff, 0x50, + 0x3, 0xff, 0xc0, 0x0, 0x0, 0x5f, 0xf9, 0x0, + 0x0, 0x6f, 0xf8, 0x0, 0x2, 0xef, 0xc0, 0x0, + 0x0, 0xa, 0xff, 0x50, 0xc, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xdf, 0xe2, 0x9f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x5f, 0xf9, 0x0, 0x0, + 0x0, 0x1d, 0xfe, 0x10, 0x9, 0xff, 0x50, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xfd, 0x0, + 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, + + /* U+0079 "y" */ + 0xd, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x70, 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x7, 0xff, 0x50, 0x0, 0x0, 0x8, + 0xff, 0x10, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, + 0xef, 0xa0, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, + 0x6f, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, + 0xd, 0xfc, 0x0, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf0, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x79, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xeb, 0x65, 0xaf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+007A "z" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x23, 0x33, 0x33, + 0x33, 0x8f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, + 0x33, 0x33, 0x33, 0x33, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, + + /* U+007B "{" */ + 0x0, 0x0, 0x6c, 0xff, 0x40, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0xe, 0xff, 0x73, 0x10, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, + 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, + 0x2, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, + 0x0, 0x2, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xf8, + 0x0, 0x1, 0x3a, 0xff, 0x50, 0x0, 0x6f, 0xff, + 0x90, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x7f, 0xf6, 0x0, 0x0, 0x2, 0xff, 0x80, 0x0, + 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x2, + 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, + 0x0, 0xef, 0xf8, 0x31, 0x0, 0x6, 0xff, 0xff, + 0x40, 0x0, 0x5, 0xcf, 0xf4, + + /* U+007C "|" */ + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, 0x1f, 0xf7, + 0x1f, 0xf7, 0x1f, 0xf7, + + /* U+007D "}" */ + 0x7f, 0xfb, 0x40, 0x0, 0x7, 0xff, 0xff, 0x40, + 0x0, 0x14, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0xdf, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x30, 0x0, 0x1, + 0xbf, 0xff, 0x30, 0x0, 0x2e, 0xff, 0xf3, 0x0, + 0x9, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x1, + 0x49, 0xff, 0xc0, 0x0, 0x7f, 0xff, 0xf4, 0x0, + 0x7, 0xff, 0xb4, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x7e, 0xfc, 0x30, 0x0, 0x2, 0xfa, 0x7, + 0xff, 0xff, 0xf6, 0x0, 0x5, 0xf8, 0xe, 0xf6, + 0x27, 0xff, 0x80, 0x1d, 0xf4, 0x3f, 0xb0, 0x0, + 0x4e, 0xff, 0xff, 0xb0, 0x5f, 0x70, 0x0, 0x1, + 0xaf, 0xfa, 0x10, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xc4, 0x0, 0xa, 0xfa, 0x67, 0xdf, 0x50, 0x4f, + 0x80, 0x0, 0xc, 0xf0, 0x9f, 0x0, 0x0, 0x4, + 0xf5, 0xbd, 0x0, 0x0, 0x2, 0xf6, 0x9f, 0x10, + 0x0, 0x5, 0xf4, 0x3f, 0xa0, 0x0, 0x1e, 0xe0, + 0x8, 0xfd, 0x9a, 0xff, 0x40, 0x0, 0x5c, 0xfe, + 0xa2, 0x0, + + /* U+2022 "•" */ + 0x0, 0x1, 0x0, 0x4, 0xef, 0xc1, 0xe, 0xff, + 0xfb, 0x1f, 0xff, 0xfd, 0xe, 0xff, 0xfa, 0x3, + 0xcf, 0xb1, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x73, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x10, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0x7a, 0xcb, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, + 0x33, 0x2f, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xfb, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x32, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xaa, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x9b, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, 0xfe, 0x44, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x44, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x88, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x88, 0xff, + 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xfc, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0xcf, 0xfd, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xfc, 0x0, + 0xc, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xff, 0xc0, 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xc0, 0x0, 0xcf, + 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0xdf, 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, + 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xff, 0x88, + 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x44, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x44, 0xef, + 0xab, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, + + /* U+F00B "" */ + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8e, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xa, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf6, 0x6, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xe7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xfa, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0xef, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf1, 0x2e, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0x50, 0x2, 0xef, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf6, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xff, 0x50, + 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xf2, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x96, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xa8, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x8a, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x60, 0x3, 0xff, 0xff, + 0x30, 0x6, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, 0x3, + 0xff, 0xff, 0x30, 0x3, 0xef, 0xff, 0xf9, 0x0, + 0x2, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x9, 0xff, + 0xff, 0x50, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x5, 0xff, 0xff, 0x90, 0xe, 0xff, 0xfc, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x7f, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x8f, 0xff, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0xe, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xe0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x2, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x0, 0x9f, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, + 0x75, 0x57, 0xaf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, + 0xff, 0xfe, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6d, 0x40, + 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x32, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x13, 0xcf, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x4, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xfb, 0x10, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x32, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x10, 0x0, 0x1, + 0xc8, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0x60, 0x0, 0x0, 0x48, 0x88, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfd, 0x10, 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xe3, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, + 0xcf, 0xff, 0xf9, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x30, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xd2, 0x3, + 0x10, 0x7f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x8f, + 0xd2, 0x4, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x80, 0xb, 0xff, + 0xff, 0x40, 0x2d, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf5, 0x2, 0xdf, 0xff, + 0xff, 0xf7, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x30, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x9, 0xff, 0xff, 0xc1, 0x0, + 0xa, 0xff, 0xff, 0xc1, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xfe, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x4, 0xef, 0xff, 0xf4, + 0xbf, 0xff, 0x70, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x2d, 0xff, 0xf3, + 0xd, 0xf4, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xbf, 0x60, + 0x1, 0x20, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x55, 0x55, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdd, 0xdd, 0xef, + 0xff, 0xff, 0xfe, 0xdd, 0xdd, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x10, 0x8, + 0xff, 0xff, 0x80, 0x1, 0x11, 0x11, 0x11, 0x10, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8f, 0xf8, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x6, 0x60, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, + 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x20, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, + 0xdf, 0xff, 0xb8, 0x88, 0x88, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x88, 0x88, 0x8e, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x58, 0x86, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xef, 0xfe, 0xb7, 0x20, + 0x0, 0x0, 0xdf, 0xff, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0xdf, 0xff, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0xcf, 0xff, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xe3, 0xbf, 0xff, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x94, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xfe, 0xdf, 0xff, 0x0, 0xd, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x8, 0xff, 0xff, 0xff, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xff, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2b, 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbc, 0xb2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xd0, 0x0, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xa4, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xff, 0xfb, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xfc, + 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x38, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xb9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6f, 0xfc, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xcf, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xdf, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xbf, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x6f, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0xdb, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x1c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, + 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x2, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xa1, 0x0, 0x8f, 0xf6, 0x0, 0xcf, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xf0, 0x6, 0xff, 0x30, 0x2f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xa1, 0x0, 0x9f, 0xf6, 0x0, 0xdf, 0xe0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x3, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, + 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x1d, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x93, 0x27, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3e, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x3, 0xef, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x3b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x39, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xfa, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xf8, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xdf, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x9f, 0xff, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xb0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xfa, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfe, 0x10, + 0x2, 0xff, 0xff, 0xd6, 0x10, 0xbf, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x67, 0x64, 0x0, 0x0, + 0x0, 0x0, + + /* U+F048 "" */ + 0x48, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x70, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf9, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0x30, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfc, 0xbf, + 0xff, 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0x37, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, + 0xff, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0x31, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0x30, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, 0xbf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x9f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04B "" */ + 0x3, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x1a, 0xef, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x1a, + 0xef, 0xff, 0xff, 0xd5, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x66, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4, 0x89, 0x99, 0x98, + 0x71, 0x0, 0x0, 0x4, 0x89, 0x99, 0x98, 0x71, + 0x0, + + /* U+F04D "" */ + 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, + + /* U+F051 "" */ + 0x5, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, + 0x87, 0x5f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x7f, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x1c, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9a, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F054 "" */ + 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xa8, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x23, 0x33, 0x33, 0x33, + 0x8f, 0xff, 0xfe, 0x33, 0x33, 0x33, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xdc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "" */ + 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x10, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x1, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, + 0xbd, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x39, + 0x95, 0x0, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3f, + 0xff, 0xd2, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, + 0xff, 0xfe, 0x10, 0xd, 0xff, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xc0, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x48, 0x6b, 0xff, + 0xff, 0xff, 0xd0, 0x5, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xff, 0xf9, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x5, 0xff, 0xff, 0xff, 0xf5, + 0x1f, 0xff, 0xff, 0xff, 0x20, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x20, 0xd, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xad, + 0xc8, 0x10, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, + 0xac, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xff, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x4, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x26, 0xad, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xfa, 0x16, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xba, 0xbe, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc5, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xc1, 0x6, 0xba, 0x50, + 0x0, 0x7f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe4, 0x7f, + 0xff, 0xc1, 0x0, 0xbf, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0xad, 0x20, 0x0, 0x4, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0xe, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xfa, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xd2, 0xe, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xfe, 0xba, 0xb5, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xbd, 0xef, 0xfd, 0xb4, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x80, 0x0, 0x1e, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xef, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0xf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x13, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x48, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x98, 0x71, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe3, 0x0, 0x24, 0x44, 0x44, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x4f, 0xff, 0xfe, 0x30, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x12, 0x22, 0x26, 0xff, 0xff, 0xa0, 0x1d, 0xff, + 0xff, 0xd2, 0x2f, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0xf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xc0, 0xc, 0xff, 0xff, 0xe2, 0x0, 0xe, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfe, 0x20, 0x0, 0x4, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x4, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf5, 0x5, 0xe2, 0x0, 0xe, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x60, 0x4f, 0xfd, 0x10, 0xf, 0xff, 0xe2, 0x0, + 0x12, 0x22, 0x26, 0xff, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0xd2, 0x2f, 0xff, 0xfe, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x24, 0x44, + 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0x44, + 0x4f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe2, 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe0, 0x9f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x11, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x1, + 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x50, 0x0, + + /* U+F078 "" */ + 0x1, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x60, 0x1, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x9f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x16, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0x0, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf4, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, + 0x0, 0x0, 0xf, 0xff, 0xf4, 0xef, 0xf9, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xf5, 0xe, 0xff, + 0x90, 0xaf, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x32, 0x0, + 0xef, 0xf9, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x80, + 0xe, 0xff, 0x90, 0x2a, 0x70, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0xef, 0xf9, 0x2e, 0xff, 0x60, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x9e, 0xff, 0xad, 0xff, 0xf9, + 0x0, 0x0, 0xe, 0xff, 0xc7, 0x77, 0x77, 0x77, + 0x77, 0x73, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdb, 0x0, 0x0, + 0x0, + + /* U+F07B "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0xcf, + 0xff, 0xff, 0xf6, 0x22, 0x22, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x0, 0xbf, + 0xff, 0xff, 0xf4, 0x0, 0x11, 0x11, 0x11, 0x10, + 0xbf, 0xff, 0xff, 0xff, 0xc0, 0xaf, 0xff, 0xff, + 0xf3, 0xc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x18, 0x99, 0x99, 0x60, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, + 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0x76, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x5, 0x99, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xb8, + 0x10, 0x1e, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x38, 0xff, 0xff, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf4, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf5, 0xf, 0xff, + 0x80, 0x0, 0xff, 0xf7, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf5, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, + 0x60, 0x2, 0xef, 0xff, 0xff, 0xf5, 0x0, 0xa, + 0xff, 0xfd, 0xbf, 0xff, 0xf4, 0x3, 0xef, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x18, 0xcd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x99, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xef, + 0xff, 0xf6, 0x5, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, 0x5, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0xf, 0xff, 0x80, + 0x0, 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xe2, 0xa, 0xff, + 0xfd, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xe2, 0x2f, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbe, 0xfb, 0x30, 0x0, 0x18, 0xcd, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, + 0x42, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xe, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xf4, 0xaf, 0xff, 0xf4, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xb3, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf5, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x37, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0xf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x30, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfe, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf3, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0xff, 0xfd, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x7e, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x82, 0x15, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa9, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x1a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, + + /* U+F0C9 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x61, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xae, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xed, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0xe5, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x5e, + 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x9, 0xff, 0xff, 0xfd, + 0x20, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x2d, 0xff, 0xff, + 0xd2, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x7e, 0xe7, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x95, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + + /* U+F0E7 "" */ + 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x1, 0x43, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0x99, 0x99, 0xff, 0xef, 0xfe, 0x99, + 0x99, 0x81, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xa0, 0x1e, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x1, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0x64, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x20, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0xd6, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xef, 0xf6, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xef, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x4, 0x44, 0x44, 0x1f, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, 0xf0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xfa, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0xff, 0x98, + 0x8e, 0xfa, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, + 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, + 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0xdf, 0x10, + 0xc, 0xf3, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, + 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, + 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x2f, + 0x80, 0x0, 0xed, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, + 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, + 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xef, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x30, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xf, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xff, 0xa0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xa0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x14, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x69, 0xab, 0xcb, 0xa9, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xba, + 0xaa, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc7, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, + 0xff, 0xd1, 0x3, 0xef, 0xff, 0xff, 0xf9, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xe7, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x7, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x2d, 0xf7, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xc8, 0x76, 0x78, 0xcf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xdb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x23, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xcd, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xe1, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x50, 0x0, 0x7, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xfc, 0x20, 0x0, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe1, 0x0, 0x4f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfb, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xfa, + 0x35, 0xef, 0x94, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4d, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xef, 0xff, 0xff, 0xfe, 0xbb, 0xbb, 0xbc, 0xff, + 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xff, + 0xfe, 0x50, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xb2, 0x0, 0x0, 0x0, 0x58, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x20, 0x6, 0xdd, 0xdd, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc0, 0x9, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xde, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, 0x32, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, + 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xc7, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xc0, 0x9, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xaf, 0xff, 0xff, 0xb0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, 0xf1, + 0x6, 0xff, 0xff, 0xaf, 0xff, 0xc0, 0x39, 0x0, + 0xcf, 0xff, 0xf5, 0xa, 0xff, 0xf9, 0x3, 0xef, + 0xc0, 0x3f, 0x90, 0x1d, 0xff, 0xf8, 0xc, 0xff, + 0xfd, 0x10, 0x3e, 0xc0, 0x2f, 0xb0, 0xc, 0xff, + 0xfa, 0xe, 0xff, 0xff, 0xd1, 0x3, 0xb0, 0x2b, + 0x0, 0xaf, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xfd, + 0x10, 0x10, 0x0, 0x9, 0xff, 0xff, 0xfd, 0xf, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x5, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xfb, 0x0, + 0x20, 0x11, 0x4, 0xff, 0xff, 0xfd, 0xe, 0xff, + 0xff, 0xb0, 0x5, 0xc0, 0x2d, 0x10, 0x5f, 0xff, + 0xfc, 0xc, 0xff, 0xfb, 0x0, 0x5f, 0xc0, 0x2f, + 0xd0, 0x7, 0xff, 0xfa, 0x9, 0xff, 0xfb, 0x5, + 0xff, 0xc0, 0x3f, 0x60, 0x1d, 0xff, 0xf7, 0x5, + 0xff, 0xff, 0xdf, 0xff, 0xc0, 0x36, 0x1, 0xdf, + 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1d, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xd0, 0x1, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xd0, 0x1d, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xd1, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xec, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x58, 0xab, 0xba, 0x84, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x4f, 0xff, 0xf5, 0x5f, 0xff, 0x92, + 0xff, 0xfc, 0x1c, 0xff, 0xfc, 0x0, 0x4, 0xff, + 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, 0xaf, + 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, 0xff, + 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, 0x4, + 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, + 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, + 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, + 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, + 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, + 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, + 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, + 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, + 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, + 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, + 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, + 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, + 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, + 0xf6, 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, + 0x4f, 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, + 0xa, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x55, + 0xff, 0xf9, 0x2f, 0xff, 0xc1, 0xcf, 0xff, 0xc0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x4, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x61, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x66, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xec, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfc, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xfc, 0x0, 0xbf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfc, 0x0, 0xbf, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xbe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xec, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x76, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x8, 0xff, 0x80, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x99, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x50, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x2e, 0xff, 0x20, 0x1f, 0xa0, + 0xe, 0xd0, 0x8, 0xff, 0xf0, 0x2e, 0xff, 0xf2, + 0x1, 0xfa, 0x0, 0xed, 0x0, 0x8f, 0xff, 0x3e, + 0xff, 0xff, 0x20, 0x1f, 0xa0, 0xe, 0xd0, 0x8, + 0xff, 0xfe, 0xff, 0xff, 0xf2, 0x1, 0xfa, 0x0, + 0xed, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x1f, 0xa0, 0xe, 0xd0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x5c, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, 0x9f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0xaf, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfe, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x10, 0x0, 0x1c, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 121, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 120, .box_w = 5, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 50, .adv_w = 175, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 86, .adv_w = 315, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 276, .adv_w = 278, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 484, .adv_w = 378, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 704, .adv_w = 307, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 893, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 909, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 1000, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 1091, .adv_w = 179, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 1152, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 1243, .adv_w = 102, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1263, .adv_w = 172, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 1277, .adv_w = 102, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1287, .adv_w = 158, .box_w = 12, .box_h = 27, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1449, .adv_w = 299, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1619, .adv_w = 166, .box_w = 8, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1699, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1859, .adv_w = 256, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2009, .adv_w = 300, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2189, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2349, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2509, .adv_w = 268, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2669, .adv_w = 289, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2829, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2989, .adv_w = 102, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3027, .adv_w = 102, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3075, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 3166, .adv_w = 261, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 3229, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 3320, .adv_w = 257, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3470, .adv_w = 463, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3808, .adv_w = 328, .box_w = 22, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4028, .adv_w = 339, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4208, .adv_w = 324, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4398, .adv_w = 370, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4598, .adv_w = 300, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4758, .adv_w = 284, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4908, .adv_w = 346, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5098, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5278, .adv_w = 139, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5318, .adv_w = 230, .box_w = 13, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5448, .adv_w = 322, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5638, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5788, .adv_w = 428, .box_w = 22, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6008, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6188, .adv_w = 376, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6408, .adv_w = 323, .box_w = 17, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6578, .adv_w = 376, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6854, .adv_w = 326, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7034, .adv_w = 278, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7194, .adv_w = 263, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7364, .adv_w = 354, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7544, .adv_w = 319, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7754, .adv_w = 504, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8064, .adv_w = 302, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8254, .adv_w = 290, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8454, .adv_w = 294, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8624, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 8715, .adv_w = 158, .box_w = 13, .box_h = 27, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 8891, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 8982, .adv_w = 261, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 9060, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9074, .adv_w = 269, .box_w = 8, .box_h = 4, .ofs_x = 3, .ofs_y = 17}, + {.bitmap_index = 9090, .adv_w = 268, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9195, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9363, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9476, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9644, .adv_w = 274, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9757, .adv_w = 158, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9873, .adv_w = 309, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10033, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10191, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10233, .adv_w = 127, .box_w = 9, .box_h = 26, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 10350, .adv_w = 276, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10518, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10560, .adv_w = 474, .box_w = 26, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10755, .adv_w = 305, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10868, .adv_w = 284, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10988, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 11148, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 11308, .adv_w = 184, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11376, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11481, .adv_w = 185, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11586, .adv_w = 303, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11699, .adv_w = 250, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11827, .adv_w = 403, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12015, .adv_w = 247, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12135, .adv_w = 250, .box_w = 17, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 12305, .adv_w = 233, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12403, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 12520, .adv_w = 134, .box_w = 4, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 12572, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 12689, .adv_w = 261, .box_w = 14, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 12724, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 12774, .adv_w = 141, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 12792, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13198, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13492, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13842, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14136, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14346, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14752, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 15144, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15544, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15950, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16286, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16692, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16853, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17095, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 17527, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17821, .adv_w = 308, .box_w = 20, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18111, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 18345, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18708, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19021, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19334, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 19568, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 19893, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20093, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 20293, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20606, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 20694, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21030, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21538, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 22017, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22367, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 22555, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 22743, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23128, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23422, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23828, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 24249, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24562, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24925, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25238, .adv_w = 392, .box_w = 25, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25526, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25820, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 26096, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 26459, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 26822, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27158, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27593, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27898, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28353, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 28686, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29019, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29352, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29685, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 30018, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30432, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 30751, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31114, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 31535, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31903, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 32208, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 20, 0, 12, -10, 0, 0, + 0, 0, -25, -27, 3, 21, 10, 8, + -18, 3, 22, 1, 19, 4, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 4, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, -13, 0, 0, 0, 0, + 0, -9, 8, 9, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -9, + 0, 0, 0, 0, -4, 0, 0, -6, + -7, 0, 0, -4, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -7, 0, -12, 0, -54, 0, + 0, -9, 0, 9, 13, 0, 0, -9, + 4, 4, 15, 9, -8, 9, 0, 0, + -26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -12, -5, -22, 0, -18, + -3, 0, 0, 0, 0, 1, 17, 0, + -13, -4, -1, 1, 0, -8, 0, 0, + -3, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -36, -4, 17, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, + 0, 4, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 4, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 9, 4, 13, -4, 0, 0, 9, -4, + -15, -61, 3, 12, 9, 1, -6, 0, + 16, 0, 14, 0, 14, 0, -42, 0, + -5, 13, 0, 15, -4, 9, 4, 0, + 0, 1, -4, 0, 0, -8, 36, 0, + 36, 0, 13, 0, 19, 6, 8, 13, + 0, 0, 0, -17, 0, 0, 0, 0, + 1, -3, 0, 3, -8, -6, -9, 3, + 0, -4, 0, 0, 0, -18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -25, 0, -28, 0, 0, 0, + 0, -3, 0, 44, -5, -6, 4, 4, + -4, 0, -6, 4, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -43, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -28, 0, 27, 0, 0, -17, 0, + 15, 0, -30, -43, -30, -9, 13, 0, + 0, -30, 0, 5, -10, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 13, -55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -9, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -9, 0, -4, 0, -10, -9, 0, -11, + -15, -15, -9, 0, -9, 0, -9, 0, + 0, 0, 0, -4, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -9, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 6, -3, 0, + -5, 0, -8, 0, 0, -3, 0, 13, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -3, -6, 0, -7, 0, -13, + -3, -13, 9, 0, 0, -9, 4, 9, + 12, 0, -11, -1, -5, 0, -1, -21, + 4, -3, 3, -24, 4, 0, 0, 1, + -23, 0, -24, -4, -39, -3, 0, -22, + 0, 9, 13, 0, 6, 0, 0, 0, + 0, 1, 0, -8, -6, 0, -13, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -4, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, -3, 0, -9, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -5, -7, 0, + -9, 0, 13, -3, 1, -14, 0, 0, + 12, -22, -23, -19, -9, 4, 0, -4, + -29, -8, 0, -8, 0, -9, 7, -8, + -29, 0, -12, 0, 0, 2, -1, 4, + -3, 0, 4, 0, -13, -17, 0, -22, + -11, -9, -11, -13, -5, -12, -1, -9, + -12, 3, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -8, -10, + -10, -1, 0, -13, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -9, 0, 0, 0, 0, -22, -13, 0, + 0, 0, -7, -22, 0, 0, -4, 4, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -8, 0, + 0, 0, 0, 5, 0, 3, -9, -9, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -13, 0, -4, 0, -7, -4, + 0, -10, -11, -13, -4, 0, -9, 0, + -13, 0, 0, 0, 0, 36, 0, 0, + 2, 0, 0, -6, 0, 4, 0, -19, + 0, 0, 0, 0, 0, -42, -8, 15, + 13, -4, -19, 0, 4, -7, 0, -22, + -2, -6, 4, -31, -4, 6, 0, 7, + -16, -7, -17, -15, -19, 0, 0, -27, + 0, 26, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -12, -15, -1, -42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -7, 0, 0, + -9, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -9, 0, 0, 9, + -1, 6, 0, -10, 4, -3, -1, -12, + -4, 0, -6, -4, -3, 0, -7, -8, + 0, 0, -4, -1, -3, -8, -5, 0, + 0, -4, 0, 4, -3, 0, -10, 0, + 0, 0, -9, 0, -8, 0, -8, -8, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 4, 0, -6, 0, -3, -5, + -14, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -4, -5, + -4, 0, 4, 18, -1, 0, -12, 0, + -3, 9, 0, -4, -19, -6, 7, 0, + 0, -21, -8, 4, -8, 3, 0, -3, + -4, -14, 0, -7, 2, 0, 0, -8, + 0, 0, 0, 4, 4, -9, -9, 0, + -8, -4, -7, -4, -4, 0, -8, 2, + -9, -8, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -6, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -7, 0, -9, 0, 0, 0, -15, 0, + 3, -10, 9, 1, -3, -21, 0, 0, + -10, -4, 0, -18, -11, -13, 0, 0, + -19, -4, -18, -17, -22, 0, -12, 0, + 4, 30, -6, 0, -10, -4, -1, -4, + -8, -12, -8, -17, -18, -10, -4, 0, + 0, -3, 0, 1, 0, 0, -31, -4, + 13, 10, -10, -17, 0, 1, -14, 0, + -22, -3, -4, 9, -41, -6, 1, 0, + 0, -29, -5, -23, -4, -33, 0, 0, + -31, 0, 26, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -17, -3, 0, -29, + 0, 0, 0, 0, -14, 0, -4, 0, + -1, -13, -21, 0, 0, -2, -7, -13, + -4, 0, -3, 0, 0, 0, 0, -20, + -4, -15, -14, -4, -8, -11, -4, -8, + 0, -9, -4, -15, -7, 0, -5, -9, + -4, -9, 0, 2, 0, -3, -15, 0, + 9, 0, -8, 0, 0, 0, 0, 5, + 0, 3, -9, 18, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -13, 0, + -4, 0, -7, -4, 0, -10, -11, -13, + -4, 0, -9, 4, 18, 0, 0, 0, + 0, 36, 0, 0, 2, 0, 0, -6, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -9, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -9, + -4, 0, 0, -9, 0, 8, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 7, 9, 4, -4, 0, -14, + -7, 0, 13, -15, -14, -9, -9, 18, + 8, 4, -39, -3, 9, -4, 0, -4, + 5, -4, -16, 0, -4, 4, -6, -4, + -13, -4, 0, 0, 13, 9, 0, -13, + 0, -25, -6, 13, -6, -17, 1, -6, + -15, -15, -4, 18, 4, 0, -7, 0, + -12, 0, 4, 15, -10, -17, -18, -11, + 13, 0, 1, -33, -4, 4, -8, -3, + -10, 0, -10, -17, -7, -7, -4, 0, + 0, -10, -9, -4, 0, 13, 10, -4, + -25, 0, -25, -6, 0, -16, -26, -1, + -14, -8, -15, -13, 12, 0, 0, -6, + 0, -9, -4, 0, -4, -8, 0, 8, + -15, 4, 0, 0, -24, 0, -4, -10, + -8, -3, -13, -11, -15, -10, 0, -13, + -4, -10, -9, -13, -4, 0, 0, 1, + 21, -8, 0, -13, -4, 0, -4, -9, + -10, -12, -13, -17, -6, -9, 9, 0, + -7, 0, -22, -5, 3, 9, -14, -17, + -9, -15, 15, -4, 2, -42, -8, 9, + -10, -8, -17, 0, -13, -19, -5, -4, + -4, -4, -9, -13, -1, 0, 0, 13, + 13, -3, -29, 0, -27, -10, 11, -17, + -30, -9, -16, -19, -22, -15, 9, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 9, 3, -9, 9, 0, 0, -14, -1, + 0, -1, 0, 1, 1, -4, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 4, 13, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 17, 0, 8, 1, 1, -6, + 0, 9, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -27, 0, -4, 8, 0, 13, + 0, 0, 44, 5, -9, -9, 4, 4, + -3, 1, -22, 0, 0, 22, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -30, 17, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -12, 0, + 0, 1, 0, 0, 4, 58, -9, -4, + 14, 12, -12, 4, 0, 0, 4, 4, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -58, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, -12, 0, 0, 0, 0, + -10, -2, 0, 0, 0, -10, 0, -5, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -30, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -9, 0, -7, 0, + -12, 0, 0, 0, -8, 4, -5, 0, + 0, -12, -4, -10, 0, 0, -12, 0, + -4, 0, -21, 0, -5, 0, 0, -36, + -9, -18, -5, -16, 0, 0, -30, 0, + -12, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -8, -4, -8, 0, 0, + 0, 0, -10, 0, -10, 6, -5, 9, + 0, -3, -10, -3, -8, -9, 0, -5, + -2, -3, 3, -12, -1, 0, 0, 0, + -39, -4, -6, 0, -10, 0, -3, -21, + -4, 0, 0, -3, -4, 0, 0, 0, + 0, 3, 0, -3, -8, -3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, -10, 0, -3, 0, 0, 0, -9, + 4, 0, 0, 0, -12, -4, -9, 0, + 0, -13, 0, -4, 0, -21, 0, 0, + 0, 0, -43, 0, -9, -17, -22, 0, + 0, -30, 0, -3, -7, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -7, -2, + -7, 1, 0, 0, 8, -6, 0, 14, + 22, -4, -4, -13, 5, 22, 8, 10, + -12, 5, 19, 5, 13, 10, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 21, -8, -4, 0, -4, + 36, 19, 36, 0, 0, 0, 4, 0, + 0, 17, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, -38, -5, -4, -18, + -22, 0, 0, -30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, -38, -5, -4, + -18, -22, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -10, 4, 0, -4, + 4, 8, 4, -13, 0, -1, -4, 4, + 0, 4, 0, 0, 0, 0, -11, 0, + -4, -3, -9, 0, -4, -18, 0, 28, + -4, 0, -10, -3, 0, -3, -8, 0, + -4, -13, -9, -5, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, -38, + -5, -4, -18, -22, 0, 0, -30, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -14, -5, -4, 13, -4, -4, + -18, 1, -3, 1, -3, -12, 1, 10, + 1, 4, 1, 4, -11, -18, -5, 0, + -17, -9, -12, -19, -17, 0, -7, -9, + -5, -6, -4, -3, -5, -3, 0, -3, + -1, 7, 0, 7, -3, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -12, 0, -2, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, 0, 0, 0, -4, 0, 0, -8, + -4, 4, 0, -8, -9, -3, 0, -13, + -3, -10, -3, -5, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 14, 0, 0, -8, 0, + 0, 0, 0, -6, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -10, 0, 0, + 19, -6, -15, -14, 3, 5, 5, -1, + -13, 3, 7, 3, 13, 3, 15, -3, + -12, 0, 0, -18, 0, 0, -13, -12, + 0, 0, -9, 0, -6, -8, 0, -7, + 0, -7, 0, -3, 7, 0, -4, -13, + -4, 17, 0, 0, -4, 0, -9, 0, + 0, 6, -10, 0, 4, -4, 4, 0, + 0, -15, 0, -3, -1, 0, -4, 5, + -4, 0, 0, 0, -18, -5, -10, 0, + -13, 0, 0, -21, 0, 17, -4, 0, + -8, 0, 3, 0, -4, 0, -4, -13, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -6, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 10, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 9, 0, 10, + 0, 0, 0, 0, 0, -28, -26, 1, + 19, 13, 8, -18, 3, 19, 0, 17, + 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_28 = { +#else +lv_font_t lv_font_montserrat_28 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 30, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_28*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_28_compressed.c b/inc/lvgl/src/font/lv_font_montserrat_28_compressed.c new file mode 100644 index 0000000..170ab48 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_28_compressed.c @@ -0,0 +1,3271 @@ +/******************************************************************************* + * Size: 28 px + * Bpp: 4 + * Opts: --bpp 4 --size 28 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_28_compressed.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_28_COMPRESSED + #define LV_FONT_MONTSERRAT_28_COMPRESSED 1 +#endif + +#if LV_FONT_MONTSERRAT_28_COMPRESSED + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xc, 0xff, 0x28, 0x6, 0x10, 0x70, 0x3, 0x80, + 0x80, 0x7c, 0x20, 0x60, 0x1f, 0x18, 0x8, 0x0, + 0x43, 0xc0, 0x3f, 0x84, 0x4, 0x3, 0xe3, 0x3, + 0x0, 0x3c, 0x40, 0x0, 0x4e, 0xa0, 0x1f, 0x14, + 0x30, 0x3, 0xde, 0x58, 0x8, 0x1, 0xc1, 0x20, + 0x72, + + /* U+0022 "\"" */ + 0x3f, 0xf0, 0x81, 0x7f, 0x88, 0x3, 0xf8, 0x40, + 0x2, 0x6, 0x0, 0x30, 0xf, 0xfe, 0x31, 0x80, + 0x61, 0x0, 0x8, 0x7, 0xf0, 0xb3, 0x80, 0x4c, + 0xc0, + + /* U+0023 "#" */ + 0x0, 0xf5, 0x7a, 0x80, 0x66, 0xfa, 0x0, 0xfe, + 0x10, 0x60, 0xc, 0x20, 0x40, 0x1f, 0xcc, 0x4, + 0x1, 0xb8, 0x38, 0x3, 0xf8, 0x80, 0x40, 0x31, + 0x1, 0x0, 0x7e, 0x10, 0x20, 0xe, 0x60, 0x60, + 0xc, 0xbf, 0xf7, 0x1, 0x7f, 0xf1, 0x6, 0xff, + 0xb8, 0x3, 0xff, 0x90, 0xbf, 0xf3, 0x83, 0xff, + 0xeb, 0x3, 0xff, 0xb8, 0x3, 0x84, 0x38, 0x3, + 0x8, 0x30, 0x7, 0xf1, 0x1, 0x0, 0x62, 0x2, + 0x0, 0xfe, 0x60, 0x60, 0xd, 0xc1, 0xc0, 0x1f, + 0xc4, 0x4, 0x1, 0x8c, 0x8, 0x3, 0xf0, 0x80, + 0x80, 0x73, 0x3, 0x80, 0x64, 0xff, 0xb8, 0x7, + 0xff, 0x8c, 0x33, 0xfe, 0x0, 0xff, 0xe4, 0x27, + 0xfd, 0x0, 0xff, 0xfb, 0x40, 0xbf, 0xf0, 0x7, + 0x70, 0x70, 0x6, 0x60, 0x60, 0xf, 0xe2, 0x2, + 0x0, 0xc4, 0x4, 0x1, 0xfc, 0xc0, 0xc0, 0x1b, + 0x83, 0x80, 0x3f, 0x88, 0x8, 0x3, 0x10, 0x10, + 0x7, 0x0, + + /* U+0024 "$" */ + 0x0, 0xfb, 0xf0, 0x3, 0xff, 0xbc, 0x31, 0x9c, + 0x7, 0xfb, 0x28, 0x1, 0xcd, 0xce, 0x62, 0x1, + 0x13, 0x5e, 0x90, 0x1, 0x64, 0x0, 0x6e, 0x5, + 0xa, 0x20, 0x46, 0x0, 0xb0, 0x5, 0x64, 0x0, + 0xbd, 0x75, 0x30, 0x82, 0x8, 0x32, 0x80, 0x7c, + 0xb2, 0x0, 0x10, 0x7, 0x80, 0x7f, 0xf0, 0x4, + 0x1, 0x80, 0x1f, 0xfc, 0x4, 0x10, 0x58, 0x0, + 0xff, 0xe0, 0x40, 0x1, 0xfe, 0xc0, 0x3f, 0xcd, + 0x42, 0x0, 0x40, 0x3e, 0x94, 0x0, 0xf2, 0xfc, + 0xa0, 0x4, 0x2d, 0x78, 0x60, 0x1c, 0x2d, 0x7c, + 0x2, 0x40, 0x3, 0xc3, 0x0, 0xf8, 0x40, 0xb7, + 0xc, 0x1, 0xe0, 0x1f, 0xf1, 0xe1, 0x1, 0x88, + 0x7, 0xff, 0x1, 0x40, 0x4, 0x8, 0x1, 0xfe, + 0x30, 0x1, 0x2d, 0xd1, 0x0, 0x7c, 0xa8, 0x6, + 0x3e, 0xb, 0xb9, 0xe, 0x3, 0x19, 0x40, 0xf, + 0xa, 0x60, 0x1, 0xbc, 0x1, 0x39, 0x80, 0xd9, + 0x80, 0x27, 0xa1, 0x4, 0x3, 0x1c, 0x72, 0x0, + 0x61, 0x7b, 0xef, 0x3, 0xfc, 0x70, 0xf, 0xfe, + 0xc0, + + /* U+0025 "%" */ + 0x0, 0x3e, 0xff, 0x40, 0x7, 0xf6, 0xf9, 0x80, + 0x6a, 0x80, 0x62, 0x7c, 0x0, 0xfa, 0x49, 0x8c, + 0x2, 0x45, 0x4d, 0x9c, 0x73, 0x70, 0xe, 0x46, + 0x29, 0x0, 0xde, 0x10, 0x1, 0x40, 0x50, 0x7, + 0x48, 0x70, 0x7, 0x28, 0x18, 0x6, 0x32, 0x10, + 0xa, 0x49, 0x8c, 0x3, 0x84, 0x40, 0x1c, 0xc0, + 0x19, 0x18, 0xa4, 0x3, 0xc2, 0x20, 0xe, 0x60, + 0xd, 0x41, 0xc0, 0x1f, 0x28, 0x18, 0x6, 0x32, + 0x10, 0x91, 0x73, 0x0, 0xfb, 0xc2, 0x0, 0x28, + 0xa, 0x4, 0x62, 0x80, 0xf, 0xc8, 0xa9, 0xb3, + 0x8e, 0x6e, 0x14, 0x1c, 0x0, 0x58, 0x82, 0x80, + 0x6a, 0x80, 0x62, 0x7c, 0x9, 0x17, 0x31, 0xca, + 0x77, 0x56, 0x8, 0x4, 0xfb, 0xfd, 0x0, 0x8c, + 0x50, 0x14, 0x6d, 0xdc, 0x73, 0xa0, 0xf, 0xea, + 0xe, 0x2, 0x43, 0x91, 0x14, 0x1a, 0x18, 0x7, + 0xd2, 0x2e, 0x60, 0x81, 0x40, 0x1a, 0x81, 0x0, + 0x3c, 0x8c, 0x50, 0x0, 0xe0, 0x20, 0xc, 0x41, + 0xe0, 0x1c, 0x34, 0x1c, 0x1, 0x78, 0x8, 0x6, + 0x10, 0xf, 0xac, 0x5c, 0xc0, 0x23, 0xd, 0x0, + 0xda, 0x1a, 0x1, 0x91, 0x4a, 0x0, 0x32, 0xb, + 0x8, 0x0, 0x58, 0x54, 0x2, 0x1a, 0xe, 0x0, + 0xf5, 0xf, 0xc3, 0xf8, 0xd0, 0x6, 0xb1, 0x73, + 0x0, 0xf2, 0x62, 0xbc, 0x2e, 0x20, 0x0, + + /* U+0026 "&" */ + 0x0, 0xc3, 0x3b, 0xfe, 0xd8, 0x0, 0xff, 0x1f, + 0x31, 0x0, 0x9, 0xf4, 0x3, 0xfb, 0x80, 0x6f, + 0xfd, 0x40, 0x50, 0x1, 0xf1, 0x90, 0x5a, 0x0, + 0x15, 0x81, 0x0, 0x3e, 0x70, 0x3, 0x0, 0x61, + 0x0, 0xfe, 0x60, 0x2, 0x0, 0x42, 0xc0, 0x80, + 0x1f, 0x11, 0x84, 0x10, 0x16, 0x8, 0xa4, 0x3, + 0xf7, 0x80, 0x3e, 0x34, 0x87, 0x44, 0x3, 0xf1, + 0xd0, 0x13, 0x82, 0x79, 0x80, 0x7f, 0x1c, 0x80, + 0x43, 0x42, 0x1, 0xfc, 0xd8, 0x62, 0xe0, 0x38, + 0x20, 0x11, 0x20, 0x4, 0xd2, 0xb, 0xf1, 0x40, + 0x58, 0x20, 0xb, 0xb8, 0xa, 0x41, 0x28, 0x41, + 0x68, 0xb, 0x4, 0x10, 0x30, 0x28, 0x1, 0x20, + 0x19, 0x68, 0xb, 0x18, 0x81, 0x0, 0xc0, 0x48, + 0x3, 0x96, 0x80, 0xa4, 0x10, 0xc0, 0x40, 0x44, + 0x1, 0xe5, 0xa0, 0xb, 0x80, 0x18, 0x0, 0xb0, + 0xf, 0xb0, 0x2, 0x81, 0x6, 0x20, 0x5e, 0x75, + 0x45, 0x9e, 0x60, 0x40, 0x2c, 0x10, 0xc4, 0x1, + 0x8a, 0xba, 0x61, 0x14, 0xdd, 0x1, 0x48, 0xd, + 0xd9, 0x88, 0x0, 0x29, 0x3c, 0xc0, 0xb4, 0x90, + 0x1, 0x24, 0xef, 0xfb, 0xad, 0x80, 0x32, 0xd8, + 0x0, + + /* U+0027 "'" */ + 0x3f, 0xf0, 0x80, 0x61, 0x0, 0x8, 0x7, 0xe3, + 0x0, 0xf8, 0x59, 0xc0, + + /* U+0028 "(" */ + 0x0, 0x93, 0xfc, 0x80, 0x14, 0x1, 0xa0, 0x1, + 0xc, 0x24, 0x2, 0xf0, 0x15, 0x0, 0x90, 0x1c, + 0x2, 0x50, 0x6, 0x80, 0x58, 0x0, 0x40, 0x9, + 0x40, 0x80, 0x31, 0x83, 0x80, 0x44, 0x0, 0xd0, + 0x8, 0x40, 0x2, 0x1, 0x38, 0x7, 0x84, 0x0, + 0x60, 0x1f, 0xe1, 0x0, 0x18, 0x4, 0xe0, 0x1e, + 0x10, 0x0, 0x80, 0x44, 0x0, 0xd0, 0xc, 0x60, + 0xe0, 0x19, 0x40, 0x80, 0x36, 0x0, 0x10, 0x2, + 0x50, 0x6, 0x80, 0x65, 0x7, 0x0, 0xdc, 0x2, + 0xa0, 0x12, 0x18, 0x48, 0x6, 0x80, 0x34, + + /* U+0029 ")" */ + 0xd, 0xfb, 0x0, 0xd6, 0x8, 0x60, 0x13, 0x10, + 0x40, 0x6, 0xa0, 0x42, 0x0, 0x94, 0x0, 0xa0, + 0x11, 0x10, 0x2c, 0x3, 0x28, 0x18, 0x6, 0xe0, + 0x1, 0x80, 0x4a, 0x0, 0x50, 0x8, 0xc0, 0x1e, + 0x1, 0xe3, 0x0, 0xc2, 0x2, 0x1, 0x8c, 0x1c, + 0x3, 0xfe, 0x30, 0x70, 0xc, 0x20, 0x20, 0x1e, + 0x30, 0x8, 0xc0, 0x1e, 0x1, 0x28, 0x1, 0x40, + 0x2e, 0x0, 0x18, 0x4, 0xa0, 0x60, 0x11, 0x10, + 0x2c, 0x2, 0x50, 0x2, 0x80, 0x54, 0x8, 0x40, + 0x6, 0x20, 0x80, 0xa, 0xc1, 0xc, 0x0, + + /* U+002A "*" */ + 0x0, 0xc7, 0xec, 0x1, 0xff, 0xc3, 0x1e, 0x80, + 0xe, 0x7e, 0x32, 0x37, 0xea, 0xc, 0xd8, 0x6, + 0x3d, 0x80, 0x60, 0x52, 0x6f, 0x50, 0x3, 0x20, + 0x4, 0x76, 0x20, 0x7, 0xf5, 0x10, 0x13, 0xd9, + 0x13, 0x80, 0x9d, 0x8, 0xb2, 0x67, 0x39, 0xf6, + 0x0, 0x93, 0x65, 0x81, 0x84, 0x3, 0xcc, 0x1, + 0xc5, 0xa, 0x1, 0x80, + + /* U+002B "+" */ + 0x0, 0xf2, 0x20, 0x40, 0x3f, 0xeb, 0xb2, 0x0, + 0x7f, 0xf9, 0xc, 0xf8, 0x0, 0x46, 0x78, 0x4b, + 0x33, 0x80, 0x11, 0x99, 0x9c, 0x3, 0xff, 0x84, + 0x5f, 0xfc, 0x0, 0xaf, 0xfc, 0xc0, 0x1f, 0xfe, + 0xc0, + + /* U+002C "," */ + 0x1a, 0xb4, 0x9, 0x54, 0xa0, 0x10, 0x0, 0x85, + 0x90, 0x18, 0x13, 0x85, 0x0, 0x10, 0x1c, 0x8, + 0x4c, 0x41, 0x2, 0x80, 0x0, + + /* U+002D "-" */ + 0x25, 0x5f, 0x81, 0x2a, 0xbe, 0x20, 0xf, 0xe0, + + /* U+002E "." */ + 0x1a, 0xc4, 0x8, 0x53, 0xa0, 0x30, 0x0, 0x84, + 0x10, 0xc8, 0x0, + + /* U+002F "/" */ + 0x0, 0xfe, 0x58, 0x60, 0xf, 0xeb, 0x7e, 0x0, + 0xfc, 0x62, 0x16, 0x1, 0xfa, 0x80, 0x8c, 0x3, + 0xf3, 0x85, 0x0, 0x7e, 0x41, 0x5, 0x0, 0xfd, + 0xc0, 0x64, 0x1, 0xf9, 0x42, 0xc0, 0x3f, 0x28, + 0x1, 0x80, 0x3f, 0x78, 0x18, 0x80, 0x7e, 0x50, + 0xa0, 0xf, 0xcc, 0x0, 0x70, 0xf, 0xda, 0x8, + 0x20, 0x1f, 0xa, 0x7, 0x0, 0x7e, 0x70, 0x2, + 0x80, 0x7e, 0xa0, 0x50, 0xf, 0xc4, 0x61, 0xe0, + 0x1f, 0x94, 0x5, 0x40, 0x3f, 0x50, 0x38, 0x7, + 0xe2, 0x20, 0x68, 0x7, 0xea, 0x1, 0x40, 0xf, + 0xca, 0xe, 0x1, 0xf8, 0xc8, 0x28, 0x3, 0xf5, + 0x1, 0x18, 0x7, 0xe7, 0x5, 0x0, 0xfc, 0x82, + 0x14, 0x1, 0xfb, 0x40, 0x88, 0x1, 0xf8, + + /* U+0030 "0" */ + 0x0, 0xe7, 0xcf, 0xf7, 0x5a, 0x80, 0x7e, 0x4e, + 0x83, 0x0, 0xa, 0x55, 0x88, 0x7, 0x25, 0x88, + 0x13, 0x3a, 0x80, 0x13, 0x4, 0x2, 0x1a, 0x0, + 0x46, 0xcc, 0x57, 0x20, 0x15, 0x80, 0x52, 0x20, + 0xee, 0x0, 0xc3, 0x64, 0xa, 0x60, 0x6, 0x1, + 0x80, 0xf, 0xa4, 0x1, 0x40, 0x62, 0xe, 0x1, + 0xf9, 0x4, 0x1c, 0x10, 0x1, 0x80, 0x1f, 0xca, + 0x2, 0x2e, 0x0, 0x30, 0x7, 0xf1, 0x80, 0x8, + 0xc0, 0x2, 0x1, 0xfd, 0xe0, 0x7, 0x0, 0xff, + 0xe2, 0x98, 0x0, 0x40, 0x3f, 0xbc, 0x0, 0xfc, + 0x0, 0x60, 0xf, 0xe3, 0x0, 0x12, 0x0, 0x30, + 0x3, 0xf9, 0x40, 0x44, 0x62, 0xe, 0x1, 0xf9, + 0x4, 0x1c, 0x0, 0xc0, 0x30, 0x1, 0xf4, 0x80, + 0x28, 0x1, 0x22, 0xe, 0xe0, 0xc, 0x36, 0x40, + 0xa6, 0x0, 0x1a, 0x0, 0x46, 0xcc, 0x57, 0x20, + 0x15, 0x80, 0x64, 0xb1, 0x2, 0x67, 0x50, 0x1, + 0xe0, 0x80, 0x72, 0x74, 0x18, 0x0, 0x52, 0xb0, + 0x40, 0x20, + + /* U+0031 "1" */ + 0xcf, 0xff, 0x30, 0x7, 0xe9, 0x88, 0x94, 0x2, + 0x57, 0x7b, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, 0xfe, + 0xc0, + + /* U+0032 "2" */ + 0x0, 0x8e, 0x33, 0xbf, 0xd9, 0x4, 0x1, 0xc5, + 0x78, 0xe6, 0x20, 0x3, 0x7d, 0x60, 0x8, 0xb1, + 0x0, 0x8, 0xce, 0xa2, 0x0, 0x95, 0x0, 0x8c, + 0x1b, 0xae, 0x62, 0xb9, 0xc0, 0x16, 0x0, 0x2c, + 0x99, 0x8, 0x7, 0x41, 0x80, 0x90, 0x0, 0x58, + 0x3, 0xf2, 0x0, 0x18, 0x3, 0xff, 0x80, 0x20, + 0x6, 0x0, 0xff, 0xe0, 0x38, 0x9, 0x0, 0x7f, + 0xce, 0x20, 0xe0, 0x1f, 0xf2, 0x40, 0xc, 0x0, + 0x7f, 0x8e, 0xc0, 0x14, 0x20, 0x1f, 0xc9, 0x80, + 0xb, 0x40, 0xf, 0xe4, 0xb0, 0x5, 0xa0, 0x7, + 0xf2, 0x58, 0x2, 0xd0, 0x3, 0xf9, 0x2c, 0x1, + 0x68, 0x1, 0xfc, 0xb6, 0x0, 0xc4, 0x0, 0xfe, + 0x5a, 0x0, 0x61, 0x80, 0x7f, 0x2d, 0x0, 0x15, + 0x1d, 0xff, 0x0, 0x28, 0x2, 0x58, 0x8f, 0xe2, + 0x0, 0xff, 0xe2, 0x0, + + /* U+0033 "3" */ + 0xf, 0xff, 0xfe, 0x8, 0x7, 0xff, 0x16, 0x62, + 0x3f, 0x10, 0x2, 0x0, 0xc, 0xef, 0xf0, 0x90, + 0x2b, 0x80, 0x7f, 0x1c, 0x81, 0x50, 0x7, 0xf0, + 0xe8, 0x3, 0xc0, 0x3f, 0xda, 0x21, 0x64, 0x1, + 0xfd, 0x26, 0x10, 0x80, 0x1f, 0xca, 0xc0, 0xe, + 0x61, 0x0, 0xfc, 0x40, 0x13, 0x4f, 0x38, 0x7, + 0xc8, 0xee, 0x52, 0x0, 0x44, 0x80, 0x78, 0xe2, + 0x15, 0xb6, 0x0, 0x63, 0x0, 0xff, 0x24, 0x80, + 0x2c, 0x3, 0xfe, 0x70, 0x1, 0x80, 0x7f, 0xf0, + 0x84, 0x14, 0x3, 0xf9, 0xc0, 0x4, 0x75, 0x88, + 0x1, 0xe5, 0x90, 0x5, 0x48, 0x1d, 0xf5, 0x44, + 0x27, 0x68, 0x1, 0x5, 0x4c, 0x0, 0x15, 0x77, + 0x31, 0x0, 0x21, 0xc0, 0x13, 0xd2, 0xa4, 0x0, + 0x13, 0x8d, 0x70, 0x0, + + /* U+0034 "4" */ + 0x0, 0xfe, 0x4f, 0xf5, 0x80, 0x7f, 0xf0, 0x4a, + 0x80, 0x68, 0x3, 0xff, 0x83, 0xc2, 0x1a, 0x20, + 0x1f, 0xfc, 0x9, 0x30, 0x83, 0x0, 0xff, 0xe0, + 0x2b, 0x2, 0xb8, 0x7, 0xff, 0x0, 0xa8, 0xa, + 0x80, 0x3f, 0xf8, 0x3e, 0x0, 0xe0, 0xf, 0xfe, + 0xd, 0x10, 0x49, 0x80, 0x7f, 0xf0, 0x1d, 0x41, + 0x58, 0x2, 0xab, 0x70, 0xf, 0x1c, 0x1, 0x50, + 0x6, 0x54, 0xd0, 0xe, 0x1d, 0x0, 0x78, 0x7, + 0xff, 0x6, 0x84, 0x28, 0x80, 0x3f, 0xf8, 0x10, + 0x80, 0x46, 0xcd, 0xe0, 0x3, 0x36, 0x26, 0x0, + 0x14, 0xcf, 0xc0, 0x3, 0x99, 0x90, 0x40, 0x3f, + 0xf8, 0xbf, 0xff, 0xf0, 0x1, 0x7f, 0xe6, 0x0, + 0xff, 0xfe, 0x0, + + /* U+0035 "5" */ + 0x0, 0xf, 0xff, 0xfc, 0x1, 0x88, 0x3, 0xff, + 0x86, 0xe0, 0x6, 0x88, 0xfc, 0x1, 0x88, 0x1, + 0x4e, 0xff, 0x80, 0x37, 0x0, 0x8, 0x3, 0xff, + 0x80, 0x20, 0x1, 0x0, 0xff, 0xe0, 0x10, 0x8, + 0x7, 0xff, 0x5, 0xc0, 0xc0, 0x3f, 0xf8, 0x24, + 0x5, 0xff, 0x76, 0x4a, 0x0, 0x78, 0x40, 0x38, + 0x4d, 0xaf, 0x8, 0x3, 0x44, 0x79, 0x8c, 0x0, + 0x78, 0x20, 0x13, 0xbf, 0xa7, 0x34, 0xc0, 0x60, + 0x3, 0xfe, 0x2d, 0x0, 0x38, 0x7, 0xff, 0x0, + 0x4c, 0x4, 0x3, 0xff, 0x8c, 0x62, 0x1, 0xf8, + 0x4c, 0x8, 0x1, 0xde, 0xc0, 0x1e, 0x2d, 0x0, + 0x50, 0x29, 0xc, 0xfd, 0xcc, 0x4d, 0xe9, 0x81, + 0x38, 0x2d, 0x10, 0x1, 0x19, 0xd9, 0x0, 0x9, + 0x80, 0x12, 0xed, 0xb1, 0x88, 0x9, 0x35, 0xd8, + 0x40, 0x0, + + /* U+0036 "6" */ + 0x0, 0xe2, 0x8c, 0xef, 0xf6, 0xd2, 0x0, 0x70, + 0xd6, 0xb9, 0x88, 0x0, 0x96, 0xd0, 0x2, 0x1c, + 0x50, 0x2, 0x3c, 0xbb, 0x9, 0x20, 0x5, 0xa4, + 0x9, 0xb7, 0xd, 0x13, 0xde, 0x1, 0x31, 0x82, + 0x59, 0x0, 0x78, 0x80, 0x2b, 0x0, 0x50, 0x7, + 0xfc, 0x44, 0x5, 0x10, 0xf, 0xf9, 0x0, 0x18, + 0x1, 0xff, 0xc0, 0xe0, 0x2, 0x82, 0xd7, 0x7f, + 0x6c, 0x10, 0x4, 0x40, 0x15, 0xd2, 0x88, 0x9, + 0x3e, 0xb8, 0x7, 0x72, 0x3, 0x55, 0xca, 0x80, + 0x21, 0x80, 0xc0, 0x4, 0x4e, 0x95, 0x46, 0xab, + 0x0, 0x40, 0x70, 0x5, 0xc2, 0x1, 0xc8, 0xe0, + 0x2a, 0x60, 0x1, 0x30, 0xf, 0xb0, 0x0, 0x4a, + 0x1, 0xff, 0xc2, 0x11, 0x28, 0x9, 0x80, 0x7d, + 0x80, 0x2, 0x8, 0x0, 0x70, 0x80, 0x72, 0x38, + 0x12, 0x1, 0x40, 0x17, 0x4a, 0xa2, 0xd5, 0x80, + 0x24, 0x2, 0x79, 0x0, 0x35, 0x5d, 0x28, 0xd, + 0xa0, 0x6, 0x6e, 0x83, 0x10, 0x13, 0x8f, 0x40, + 0x0, + + /* U+0037 "7" */ + 0x2f, 0xff, 0xfe, 0x15, 0x0, 0x7f, 0xf0, 0xcc, + 0x2, 0x48, 0x8f, 0xc6, 0x0, 0xc0, 0x8, 0xdd, + 0xff, 0x18, 0xa, 0x80, 0x7f, 0xcc, 0x0, 0x90, + 0xf, 0xfe, 0x5, 0x80, 0x18, 0xb, 0xfd, 0x0, + 0x1e, 0x42, 0x6, 0x10, 0xf, 0xfa, 0x0, 0x16, + 0x1, 0xff, 0x19, 0x81, 0x8, 0x3, 0xfe, 0x90, + 0x7, 0x80, 0x7f, 0xc2, 0xa0, 0x48, 0x1, 0xff, + 0x48, 0x2, 0xc0, 0x3f, 0xf8, 0xc, 0x2, 0xc0, + 0x1f, 0xf3, 0x8, 0x30, 0x7, 0xff, 0x2, 0xc0, + 0x12, 0x1, 0xff, 0x21, 0x2, 0x88, 0x7, 0xfd, + 0xe0, 0x9, 0x0, 0xff, 0x89, 0x0, 0xcc, 0x1, + 0xff, 0x58, 0x2, 0x40, 0x3f, 0xe1, 0x60, 0x15, + 0x0, 0xf8, + + /* U+0038 "8" */ + 0x0, 0xcb, 0x5b, 0xfe, 0xda, 0x60, 0xf, 0x1e, + 0xd2, 0x90, 0x0, 0x96, 0x74, 0xc0, 0x22, 0xd2, + 0x2, 0x8a, 0xa4, 0x10, 0x16, 0x10, 0x2, 0x4, + 0x1f, 0x5d, 0x54, 0xfa, 0xe0, 0x8, 0x0, 0x20, + 0xc, 0x0, 0x7a, 0x8, 0x14, 0x0, 0x20, 0xa0, + 0x1f, 0x9c, 0x3, 0xcc, 0x1, 0xf9, 0x80, 0x32, + 0x81, 0x28, 0x7, 0x94, 0xc1, 0x40, 0x16, 0x21, + 0x54, 0x42, 0x22, 0xd5, 0x0, 0x6c, 0x0, 0x38, + 0x60, 0xb7, 0xba, 0xa5, 0x3, 0xc1, 0x0, 0xa8, + 0xc0, 0x3f, 0x1d, 0x0, 0x56, 0xe0, 0x75, 0xbf, + 0xed, 0x92, 0x7, 0xb0, 0x54, 0x4, 0xc5, 0x20, + 0x1, 0x36, 0xa8, 0x22, 0xf8, 0x2, 0x40, 0x3f, + 0x40, 0x3, 0xc4, 0x0, 0x40, 0x1f, 0x88, 0x0, + 0xc4, 0x0, 0x40, 0xf, 0xc8, 0x0, 0x6d, 0x0, + 0x49, 0x0, 0x78, 0xa4, 0x1, 0xe8, 0xa0, 0x5b, + 0x4c, 0x8a, 0xd5, 0xa4, 0x8, 0xa1, 0x4c, 0x0, + 0x59, 0xba, 0x95, 0x0, 0x35, 0x80, 0x53, 0xb0, + 0x62, 0x0, 0x13, 0x8d, 0x90, 0x0, + + /* U+0039 "9" */ + 0x0, 0xcb, 0x7d, 0xfd, 0xb2, 0x60, 0x1e, 0x2c, + 0xa4, 0x10, 0x12, 0x6c, 0x90, 0xc, 0x3e, 0x60, + 0x73, 0x74, 0xe4, 0xd, 0x40, 0x14, 0x10, 0x3e, + 0x32, 0x2c, 0x6a, 0x82, 0xb0, 0x1, 0x80, 0xa0, + 0x3, 0xd4, 0x21, 0x0, 0x40, 0x5, 0x0, 0xfc, + 0xe0, 0x2a, 0x1, 0xff, 0xc3, 0xc2, 0x0, 0x28, + 0x7, 0xe7, 0x0, 0x28, 0x28, 0x14, 0x0, 0x7a, + 0x84, 0x0, 0x21, 0x0, 0x7, 0xd7, 0x55, 0x46, + 0xa8, 0x88, 0xc, 0xb, 0x4, 0xa, 0x2a, 0x8e, + 0x43, 0xa0, 0x1c, 0x7d, 0x6, 0x20, 0x29, 0x3c, + 0x62, 0x6, 0x1, 0x9f, 0x3b, 0xfa, 0xd8, 0x8, + 0x0, 0xe0, 0x1f, 0xfc, 0x4, 0x0, 0x68, 0x7, + 0xff, 0x2, 0x80, 0xc, 0x1, 0xff, 0x39, 0x82, + 0x88, 0x0, 0x44, 0x1, 0xe8, 0x80, 0xd, 0x80, + 0x53, 0xd5, 0xc, 0xf5, 0xce, 0x0, 0xd1, 0x0, + 0x9c, 0x15, 0xe6, 0x14, 0x40, 0xf4, 0xc0, 0x36, + 0x31, 0x80, 0x44, 0xd7, 0x84, 0x1, 0x0, + + /* U+003A ":" */ + 0x2d, 0xe6, 0x8, 0x21, 0x90, 0x30, 0x0, 0x84, + 0x29, 0xd0, 0xd, 0x62, 0x0, 0x7f, 0xf4, 0xc6, + 0xb1, 0x2, 0x14, 0xe8, 0xc, 0x0, 0x21, 0x4, + 0x32, 0x0, + + /* U+003B ";" */ + 0x2d, 0xe6, 0x8, 0x21, 0x90, 0x30, 0x0, 0x84, + 0x29, 0xd0, 0xd, 0x62, 0x0, 0x7f, 0xf4, 0xc6, + 0xad, 0x2, 0x55, 0x28, 0x4, 0x0, 0x21, 0x64, + 0x6, 0x4, 0xe1, 0x40, 0x4, 0x7, 0x2, 0x13, + 0x10, 0x40, 0xa0, 0x0, + + /* U+003C "<" */ + 0x0, 0xff, 0x8e, 0x58, 0x3, 0xf0, 0xb6, 0xe3, + 0x0, 0x7c, 0x75, 0xd2, 0x40, 0x88, 0x0, 0x85, + 0xf7, 0x14, 0xa, 0x3a, 0xc8, 0x12, 0xba, 0x8, + 0x17, 0x35, 0xc4, 0x0, 0x56, 0xa0, 0x73, 0xf4, + 0x60, 0x1f, 0x86, 0x9c, 0x3, 0xf1, 0x28, 0xc, + 0xf5, 0x20, 0x7, 0xd5, 0xd2, 0x40, 0xb7, 0xae, + 0x20, 0x1c, 0x2d, 0xb8, 0xc0, 0x51, 0xd6, 0xa0, + 0x1e, 0x39, 0xf9, 0x30, 0x4a, 0x60, 0xf, 0xcd, + 0x98, 0x60, 0xf, 0xfe, 0x1, 0xcf, 0xb8, + + /* U+003D "=" */ + 0x2f, 0xff, 0xfe, 0x3, 0x0, 0x7f, 0xf0, 0x8b, + 0x33, 0xff, 0x80, 0xe0, 0x67, 0xff, 0xc0, 0x10, + 0xf, 0xfe, 0x89, 0x9f, 0xff, 0x0, 0x4b, 0x33, + 0xff, 0x80, 0xe0, 0x1f, 0xfc, 0x20, + + /* U+003E ">" */ + 0x1b, 0x50, 0xf, 0xf8, 0xd2, 0xba, 0x8, 0x3, + 0xf1, 0x30, 0x89, 0xf7, 0x14, 0x3, 0xe9, 0xea, + 0x40, 0x3a, 0xe9, 0x20, 0xf, 0x2d, 0xeb, 0x88, + 0x9b, 0x71, 0x80, 0x3c, 0x51, 0xd6, 0xa0, 0x72, + 0xc0, 0x1f, 0x93, 0x90, 0x3, 0xf8, 0xa3, 0xad, + 0x0, 0xd4, 0x3, 0x2e, 0x6b, 0x88, 0x9f, 0x70, + 0xc0, 0xe7, 0xe8, 0xc1, 0x2b, 0xa0, 0x80, 0x3, + 0x8c, 0x2, 0xfb, 0x6a, 0x1, 0xc6, 0x9, 0x5d, + 0x4, 0x1, 0xf1, 0x75, 0xa8, 0x7, 0xf8, + + /* U+003F "?" */ + 0x0, 0x92, 0x77, 0xbf, 0xd9, 0x24, 0x1, 0x8a, + 0xec, 0xc4, 0x20, 0x3, 0x6d, 0x80, 0x1, 0xe2, + 0x0, 0xb4, 0x4b, 0x90, 0x1, 0xd8, 0x1c, 0x1, + 0x1d, 0x2e, 0xd1, 0xb0, 0x0, 0x80, 0x4f, 0xa7, + 0x0, 0xf3, 0x90, 0x8, 0x80, 0x54, 0x3, 0xf3, + 0x0, 0x7f, 0xf0, 0x94, 0x4, 0x40, 0x1f, 0xe8, + 0x10, 0x60, 0xf, 0xf4, 0x38, 0x1c, 0x0, 0x7f, + 0x4b, 0x81, 0xe0, 0x7, 0xf4, 0x30, 0x26, 0x0, + 0x7f, 0x13, 0x81, 0x58, 0x7, 0xf9, 0x40, 0x16, + 0x1, 0xff, 0x12, 0xa9, 0x0, 0x3f, 0xe5, 0xaa, + 0x10, 0x7, 0xff, 0x38, 0x61, 0x80, 0x3f, 0xf8, + 0x18, 0xf2, 0xc0, 0x1f, 0xf1, 0x0, 0x38, 0x3, + 0xfe, 0x91, 0x29, 0x0, 0xe0, + + /* U+0040 "@" */ + 0x0, 0xfc, 0x4f, 0x7b, 0xff, 0x75, 0xc1, 0x80, + 0x7f, 0xf0, 0x93, 0x36, 0x10, 0x84, 0x84, 0x48, + 0xf9, 0x85, 0x0, 0xff, 0xaa, 0xcc, 0xa3, 0x7f, + 0xb7, 0xbf, 0x64, 0xcd, 0x56, 0x20, 0x1f, 0xe, + 0xa8, 0xd6, 0xb9, 0x0, 0x71, 0x36, 0x59, 0x26, + 0x8, 0x7, 0xe, 0x11, 0xfa, 0x80, 0x7f, 0xc9, + 0xaa, 0x58, 0x20, 0x1a, 0xc8, 0xf0, 0x40, 0x3, + 0x1b, 0xfe, 0xd8, 0x10, 0xff, 0x45, 0x21, 0x58, + 0x4, 0x6a, 0x1c, 0x1, 0x27, 0x39, 0x0, 0x9, + 0xfd, 0x0, 0x35, 0xa, 0x98, 0x2, 0x1, 0xc8, + 0x0, 0x96, 0x0, 0x7c, 0xc5, 0x20, 0xd8, 0x6, + 0x18, 0x8, 0x1, 0x40, 0x90, 0xa, 0x80, 0x76, + 0xc, 0xcb, 0x72, 0x1, 0xe6, 0x14, 0x14, 0x3, + 0x10, 0x2, 0x88, 0x51, 0x0, 0x73, 0x28, 0x7, + 0x90, 0x17, 0x41, 0x0, 0x2f, 0x2, 0x40, 0xf, + 0xa4, 0x3, 0xda, 0x6, 0x21, 0xe0, 0x13, 0x83, + 0x80, 0x7e, 0x30, 0xf, 0x10, 0x79, 0x80, 0x80, + 0x46, 0x6, 0x1, 0xfc, 0x20, 0x1c, 0x20, 0x26, + 0x2, 0x1, 0x18, 0x18, 0x7, 0xf0, 0x80, 0x70, + 0x80, 0xf0, 0x70, 0x4, 0xe0, 0xe0, 0x1f, 0x8c, + 0x3, 0xc4, 0x1e, 0x40, 0xa0, 0x17, 0x81, 0x20, + 0x7, 0xd2, 0x1, 0xed, 0x3, 0x40, 0x31, 0x0, + 0x28, 0x85, 0x10, 0x7, 0x32, 0x80, 0x4, 0x0, + 0x2a, 0x8, 0x28, 0x12, 0x1, 0x50, 0xe, 0xc1, + 0x92, 0x54, 0x81, 0x83, 0x29, 0xe8, 0x38, 0x2, + 0x1, 0xc8, 0x0, 0x96, 0x0, 0x7c, 0xdb, 0x51, + 0xb8, 0x0, 0x56, 0x19, 0xa0, 0x0, 0x6a, 0x1c, + 0x1, 0x27, 0x39, 0x80, 0x9, 0xfd, 0x11, 0x44, + 0x2, 0xf8, 0x1, 0xa8, 0x8f, 0x4, 0x0, 0x31, + 0x9f, 0xed, 0x81, 0x0, 0x2e, 0xff, 0x40, 0x7, + 0xb0, 0x8f, 0xd4, 0x3, 0xff, 0x94, 0x38, 0xa3, + 0x5a, 0xe6, 0x1, 0xc6, 0xf8, 0x1, 0xff, 0xc0, + 0x1a, 0xb3, 0x28, 0xcf, 0xee, 0xbf, 0x20, 0xd0, + 0x3, 0xff, 0x82, 0x99, 0x88, 0x41, 0x1c, 0x4b, + 0x3c, 0x80, 0x1f, 0x0, + + /* U+0041 "A" */ + 0x0, 0xfe, 0x6f, 0xf6, 0x80, 0x7f, 0xf1, 0xac, + 0x0, 0x48, 0x1, 0xff, 0xc4, 0x42, 0x0, 0xbc, + 0x3, 0xff, 0x89, 0xe0, 0x2c, 0x8, 0x40, 0x1f, + 0xfc, 0x22, 0x40, 0x68, 0x0, 0x40, 0x7, 0xff, + 0xa, 0xc0, 0x12, 0x2a, 0xa, 0x20, 0x1f, 0xfc, + 0x1, 0x60, 0x51, 0x9, 0x0, 0x48, 0x7, 0xff, + 0x1, 0x80, 0x12, 0x0, 0x33, 0x3, 0x0, 0x7f, + 0xf0, 0x24, 0x8, 0xc0, 0x2a, 0x1, 0x60, 0xf, + 0xf2, 0x88, 0x58, 0x6, 0x61, 0xb, 0x0, 0xff, + 0x40, 0xb, 0x0, 0x73, 0x1, 0x20, 0x7, 0xe4, + 0x20, 0x60, 0xf, 0x48, 0x3, 0xc0, 0x3f, 0x78, + 0x3, 0x4c, 0xfc, 0x46, 0x8, 0x60, 0x1e, 0x24, + 0x0, 0x56, 0x67, 0xc6, 0x0, 0x90, 0xf, 0x58, + 0x7, 0xff, 0x9, 0x44, 0x3, 0xb, 0x1, 0xff, + 0xff, 0xa8, 0x1, 0x20, 0x19, 0x80, 0x12, 0x1, + 0xfe, 0x51, 0x6, 0x0, 0xd2, 0x2, 0xa0, 0x1f, + 0xf3, 0x0, 0xb0, 0x1, 0x44, 0x18, 0x3, 0xff, + 0x81, 0x20, 0xb, 0x0, 0x48, 0x2, 0x40, 0x3f, + 0xf8, 0x2, 0xa0, 0x48, + + /* U+0042 "B" */ + 0x1f, 0xff, 0xf6, 0xd2, 0x80, 0x7f, 0xf0, 0xc9, + 0x6b, 0x48, 0x3, 0x8e, 0xef, 0xd2, 0xc0, 0x2, + 0xf0, 0xe, 0x74, 0x4f, 0x34, 0xf1, 0x81, 0x30, + 0x7, 0xff, 0x4, 0x7c, 0x1, 0x80, 0x1f, 0xfc, + 0x22, 0x0, 0x8, 0x7, 0xff, 0x8, 0xc0, 0x4, + 0x1, 0xff, 0xc2, 0xb0, 0x6, 0x80, 0x7f, 0xc2, + 0x96, 0xc0, 0x88, 0x0, 0xc9, 0xff, 0xee, 0xb4, + 0x5, 0xb0, 0xf, 0xfe, 0x22, 0x38, 0x7, 0x1d, + 0xdf, 0xd4, 0xe2, 0x28, 0xa0, 0xc, 0xe8, 0x9f, + 0x2c, 0x71, 0x82, 0xa0, 0x7, 0xff, 0xb, 0xc0, + 0x1a, 0x1, 0xff, 0xc2, 0x30, 0x2, 0x80, 0x7f, + 0xf0, 0x8c, 0x0, 0xe0, 0x1f, 0xfc, 0x28, 0x0, + 0x60, 0x4, 0xe8, 0x9f, 0x2c, 0x72, 0x0, 0xb0, + 0x4, 0x77, 0x7f, 0x53, 0x88, 0x16, 0x8, 0x7, + 0xff, 0x0, 0x96, 0xb4, 0x80, + + /* U+0043 "C" */ + 0x0, 0xf1, 0xc6, 0x77, 0xf6, 0xd2, 0x80, 0x7e, + 0x2b, 0xc7, 0x31, 0x1, 0x25, 0xae, 0x50, 0xe, + 0x5d, 0x40, 0x1, 0x2b, 0xb2, 0x0, 0x6, 0xa0, + 0x2, 0x5a, 0x0, 0x26, 0x6d, 0x44, 0xdf, 0xc8, + 0x81, 0x80, 0x6, 0x80, 0xf, 0x66, 0x1, 0xe6, + 0xc7, 0xb0, 0x5, 0x80, 0x16, 0x0, 0x3f, 0x8a, + 0x0, 0x2, 0xa0, 0xa, 0x0, 0xff, 0xe1, 0x20, + 0x1, 0x80, 0x3f, 0xf8, 0x7a, 0x0, 0xc0, 0xf, + 0xfe, 0x19, 0x0, 0x18, 0x3, 0xff, 0xac, 0x40, + 0x6, 0x0, 0xff, 0xe1, 0xe8, 0x3, 0x0, 0x3f, + 0xf8, 0x68, 0x0, 0x60, 0xf, 0xfe, 0x18, 0xa8, + 0x2, 0x80, 0x3f, 0xf8, 0x76, 0x0, 0x58, 0x0, + 0xfe, 0x29, 0x0, 0x86, 0x80, 0xf, 0x66, 0x1, + 0xe6, 0xc6, 0xb0, 0x9, 0x68, 0x0, 0x99, 0xb5, + 0x10, 0xaf, 0x91, 0x3, 0x0, 0xcb, 0xa6, 0x0, + 0x25, 0x77, 0x28, 0x0, 0x6a, 0x0, 0x38, 0xb3, + 0xe, 0x62, 0x2, 0x4b, 0x5c, 0xa0, 0x0, + + /* U+0044 "D" */ + 0x1f, 0xff, 0xee, 0xc9, 0x40, 0xf, 0xfe, 0x20, + 0x9b, 0x5e, 0xa0, 0x7, 0xc5, 0x11, 0xe6, 0x30, + 0x1, 0x5c, 0x0, 0x79, 0x9d, 0xfd, 0x39, 0xac, + 0x0, 0x78, 0x0, 0xff, 0xe1, 0x14, 0xd0, 0x1, + 0xd0, 0x3, 0xff, 0x86, 0xb2, 0x0, 0x80, 0xf, + 0xfe, 0x23, 0x10, 0x19, 0x80, 0x3f, 0xf8, 0x96, + 0x0, 0x40, 0xf, 0xfe, 0x22, 0x80, 0x34, 0x3, + 0xff, 0x88, 0x40, 0x6, 0x0, 0xff, 0xec, 0x10, + 0x1, 0x80, 0x3f, 0xf8, 0x8a, 0x0, 0xd0, 0xf, + 0xfe, 0x25, 0x80, 0x10, 0x3, 0xff, 0x86, 0xc4, + 0x6, 0x60, 0xf, 0xfe, 0x12, 0x48, 0x2, 0x0, + 0x3f, 0xf8, 0x23, 0x36, 0x0, 0x74, 0x0, 0xcc, + 0xef, 0xe9, 0xce, 0x60, 0x3, 0xc0, 0x7, 0x14, + 0x47, 0x98, 0xc0, 0x5, 0x70, 0x1, 0xff, 0xc1, + 0x13, 0x6b, 0xd4, 0x0, 0xc0, + + /* U+0045 "E" */ + 0x1f, 0xff, 0xfe, 0xe, 0x0, 0x7f, 0xf2, 0xa, + 0x23, 0xfd, 0x20, 0x19, 0x9d, 0xff, 0xca, 0x1, + 0xff, 0xff, 0x0, 0xfe, 0x4f, 0xff, 0xe9, 0x0, + 0xff, 0xe4, 0x94, 0xcf, 0xf5, 0x0, 0x73, 0x37, + 0xf8, 0xc0, 0x3f, 0xff, 0x2c, 0xef, 0xff, 0x8, + 0x4, 0x51, 0x1f, 0xf1, 0x80, 0x7f, 0xf1, 0x0, + + /* U+0046 "F" */ + 0x1f, 0xff, 0xfe, 0xe, 0x0, 0x7f, 0xf1, 0x8a, + 0x23, 0xfd, 0x20, 0x13, 0x3b, 0xff, 0x94, 0x3, + 0xff, 0xfe, 0x1, 0x33, 0x7f, 0x8c, 0x3, 0x14, + 0xcf, 0xf5, 0x0, 0x7f, 0xf1, 0xd3, 0xff, 0xfa, + 0x40, 0x3f, 0xff, 0xe0, 0x1f, 0xfd, 0x30, + + /* U+0047 "G" */ + 0x0, 0xf1, 0xc6, 0x77, 0xfb, 0x69, 0x84, 0x3, + 0xe2, 0xbc, 0x73, 0x10, 0x1, 0x2c, 0xf3, 0x80, + 0x72, 0xea, 0x0, 0x9, 0x5d, 0xca, 0x20, 0x8, + 0xb0, 0x9, 0x28, 0x0, 0x79, 0xb5, 0x10, 0xae, + 0xb2, 0x6, 0x10, 0x1b, 0x0, 0x3e, 0x18, 0x7, + 0x93, 0x5f, 0x4, 0x20, 0x0, 0xb0, 0x1, 0xfe, + 0x81, 0x1, 0x60, 0x5, 0x0, 0x7f, 0xf0, 0x90, + 0x0, 0xc0, 0x1f, 0xfc, 0x3d, 0x0, 0x60, 0x7, + 0xff, 0xc, 0x80, 0xc, 0x1, 0xff, 0xc0, 0x11, + 0x0, 0x7f, 0xf1, 0x1f, 0xb8, 0x64, 0x0, 0x60, + 0xf, 0xfe, 0x1e, 0x80, 0x30, 0x3, 0xff, 0x86, + 0x80, 0x6, 0x0, 0xff, 0xe1, 0x8b, 0x0, 0x28, + 0x3, 0xff, 0x87, 0x0, 0x5, 0x80, 0xf, 0xfe, + 0x10, 0xd8, 0x1, 0xf0, 0xc0, 0x3c, 0x76, 0x1, + 0xc9, 0x40, 0x3, 0xcd, 0xa8, 0x84, 0xee, 0x18, + 0x9, 0x0, 0x4b, 0xa8, 0x0, 0x25, 0x77, 0x31, + 0x0, 0x1b, 0xc4, 0x3, 0x15, 0xe3, 0x98, 0x80, + 0x9, 0x67, 0xa4, 0x40, + + /* U+0048 "H" */ + 0x1f, 0xf5, 0x80, 0x7f, 0xdf, 0xec, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0x13, 0xff, 0xfe, 0x0, + 0xff, 0xe6, 0x14, 0x47, 0xfc, 0x1, 0xe6, 0x77, + 0xff, 0x80, 0x3f, 0xff, 0xe0, 0x1f, 0xfe, 0xa0, + + /* U+0049 "I" */ + 0x1f, 0xf5, 0x80, 0x7f, 0xff, 0xc0, + + /* U+004A "J" */ + 0x0, 0x27, 0xff, 0xf4, 0x80, 0x7f, 0xf0, 0xd6, + 0x23, 0xce, 0x1, 0xc2, 0xef, 0xeb, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xfd, 0xdc, 0x0, 0x20, 0x6, + 0x0, 0xf6, 0x0, 0x38, 0x2a, 0x60, 0x3, 0xb, + 0x80, 0x1c, 0x5c, 0x1f, 0x61, 0xa3, 0xc0, 0xa, + 0x22, 0xf3, 0x2, 0x79, 0x71, 0x3, 0xa0, 0x1, + 0x65, 0x20, 0x80, 0xa4, 0xe0, 0x0, + + /* U+004B "K" */ + 0x1f, 0xf5, 0x80, 0x7f, 0x17, 0x7f, 0x10, 0x7, + 0xff, 0x4, 0xb0, 0x43, 0x48, 0x3, 0xff, 0x80, + 0x38, 0x21, 0x66, 0x1, 0xff, 0xc0, 0x1c, 0x10, + 0xa4, 0x0, 0xff, 0xe0, 0xe, 0x10, 0x4a, 0x80, + 0x7f, 0xf0, 0x74, 0x82, 0x18, 0x3, 0xff, 0x83, + 0x86, 0xe, 0xe0, 0xf, 0xfe, 0xd, 0x98, 0x34, + 0x0, 0x7f, 0xf0, 0x6d, 0x1, 0x64, 0x3, 0xff, + 0x83, 0x48, 0x0, 0x30, 0xf, 0xfe, 0xc, 0xa8, + 0x4, 0xcc, 0x0, 0xff, 0x91, 0x80, 0x5c, 0x1, + 0x26, 0x1, 0xff, 0xc0, 0x1c, 0x87, 0x0, 0x68, + 0x80, 0x7f, 0x87, 0x8, 0x21, 0x0, 0x74, 0x3, + 0xf8, 0x70, 0x80, 0x2b, 0x30, 0x3a, 0x0, 0xfc, + 0xa4, 0x1, 0xda, 0x20, 0xae, 0x1, 0xff, 0xc2, + 0x1d, 0x0, 0x42, 0x0, 0x7f, 0xf0, 0x8e, 0xc0, + 0x14, 0x40, 0x1f, 0xfc, 0x24, 0x80, 0x1f, 0x0, + 0xff, 0xe1, 0xbb, 0x1, 0x58, 0x0, + + /* U+004C "L" */ + 0x1f, 0xf5, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, + 0xe0, 0x1f, 0xff, 0xf0, 0xf, 0xfe, 0x8b, 0x3b, + 0xff, 0x88, 0x2, 0x28, 0x8f, 0xf3, 0x80, 0x7f, + 0xf0, 0xc0, + + /* U+004D "M" */ + 0x1f, 0xf4, 0x0, 0x7f, 0xf0, 0xf3, 0xf0, 0x2, + 0x72, 0x0, 0xff, 0xe0, 0xb1, 0x80, 0x7a, 0x0, + 0x3f, 0xf8, 0x30, 0x1, 0xf2, 0xa0, 0x7, 0xfd, + 0x2, 0x1, 0xfa, 0x40, 0x3f, 0xc4, 0xe0, 0x1f, + 0x8, 0x13, 0x0, 0x7f, 0x40, 0x7, 0xe4, 0x30, + 0x81, 0x0, 0xf9, 0x14, 0x20, 0x40, 0x3d, 0xe0, + 0x30, 0x1, 0xf4, 0x81, 0x38, 0x7, 0xc6, 0xc0, + 0xc4, 0x1, 0xcc, 0x41, 0x20, 0x1f, 0xd0, 0x0, + 0x90, 0xe, 0x80, 0x44, 0x0, 0x7f, 0xc, 0x2, + 0x28, 0x5, 0x2, 0x12, 0x1, 0xff, 0x39, 0x5, + 0x80, 0x9, 0xc1, 0xc8, 0x3, 0xff, 0x81, 0x20, + 0x2e, 0x12, 0x3, 0x0, 0x1f, 0xfc, 0x14, 0x50, + 0x86, 0x40, 0x80, 0xf, 0xfe, 0x1c, 0x0, 0x24, + 0xd, 0x80, 0x3f, 0xf8, 0x64, 0xe0, 0x17, 0x80, + 0x7f, 0xf1, 0x60, 0x41, 0x4c, 0x3, 0xff, 0x8d, + 0x4d, 0x60, 0x1f, 0xfc, 0x74, 0x91, 0x0, 0xff, + 0xe9, 0x80, + + /* U+004E "N" */ + 0x1f, 0xf5, 0x0, 0x7f, 0xdf, 0xec, 0x0, 0x95, + 0x80, 0x3f, 0xf8, 0xb2, 0x60, 0x1f, 0xfc, 0x5d, + 0x10, 0xf, 0xfe, 0x20, 0xe8, 0x7, 0xff, 0x8, + 0xc8, 0xe, 0x40, 0x3f, 0xf8, 0x2f, 0xe0, 0x6, + 0x50, 0xf, 0xfe, 0x9, 0x50, 0x2, 0x88, 0x3, + 0xff, 0x82, 0xac, 0x0, 0xf1, 0x0, 0xff, 0xe0, + 0xc9, 0x81, 0x50, 0x7, 0xff, 0xb, 0x44, 0x12, + 0x0, 0x3f, 0xf8, 0x23, 0xa0, 0x7, 0x40, 0xf, + 0xfe, 0x9, 0xc8, 0x2, 0xc8, 0x3, 0xff, 0x82, + 0xca, 0x0, 0xf0, 0xf, 0xfe, 0x15, 0x18, 0x15, + 0x0, 0x7f, 0xf0, 0xb8, 0x41, 0x40, 0x3f, 0xf8, + 0x45, 0x40, 0x1f, 0xfc, 0x54, 0x80, 0xf, 0xfe, + 0x2b, 0xa8, 0x7, 0xff, 0x16, 0x88, 0x0, + + /* U+004F "O" */ + 0x0, 0xf1, 0xc6, 0x77, 0xfb, 0x69, 0x80, 0x3f, + 0xe2, 0xbc, 0x73, 0x10, 0x1, 0x2c, 0xf3, 0x80, + 0x7e, 0x5d, 0x40, 0x1, 0x2b, 0xb2, 0x0, 0x6, + 0x2c, 0x40, 0x39, 0x28, 0x0, 0x99, 0xb5, 0x13, + 0x7f, 0x20, 0x4, 0xd0, 0xc, 0x34, 0x0, 0x7b, + 0x30, 0xf, 0x36, 0x90, 0x1c, 0x80, 0x50, 0x20, + 0xb0, 0x1, 0xfc, 0x5e, 0x0, 0x62, 0x1, 0x60, + 0x5, 0x0, 0x7f, 0xc5, 0x0, 0xb, 0x4, 0x0, + 0x30, 0x7, 0xff, 0x5, 0x80, 0x8, 0x1a, 0x0, + 0xc0, 0xf, 0xfe, 0x8, 0x90, 0x10, 0x10, 0x1, + 0x80, 0x3f, 0xf8, 0x4c, 0x0, 0x20, 0xf, 0xfe, + 0x51, 0x0, 0x18, 0x3, 0xff, 0x84, 0xc0, 0x2, + 0xd0, 0x6, 0x0, 0x7f, 0xf0, 0x44, 0x80, 0x81, + 0x0, 0xc, 0x1, 0xff, 0xc1, 0x60, 0x2, 0x0, + 0xb0, 0x2, 0x80, 0x3f, 0xe2, 0x80, 0x5, 0x80, + 0x20, 0x41, 0x60, 0x3, 0xf8, 0xbc, 0x0, 0xc4, + 0x0, 0x1a, 0x0, 0x3d, 0x98, 0x7, 0x9b, 0x48, + 0xe, 0x40, 0x32, 0x50, 0x1, 0x33, 0x6a, 0x26, + 0xfe, 0x40, 0x7, 0xa0, 0x1e, 0x5d, 0x40, 0x1, + 0x2b, 0xb2, 0x0, 0x51, 0x82, 0x1, 0xf1, 0x5e, + 0x39, 0x88, 0x0, 0x96, 0x7d, 0xc0, 0x38, + + /* U+0050 "P" */ + 0x1f, 0xff, 0xed, 0xa5, 0x0, 0xff, 0xe1, 0x12, + 0xd6, 0x98, 0x7, 0x14, 0x47, 0x3a, 0x80, 0xb, + 0xc, 0x3, 0x33, 0xbf, 0x45, 0x7a, 0x80, 0x38, + 0x3, 0xff, 0x83, 0x48, 0x4, 0xa0, 0x1f, 0xfc, + 0x1f, 0x0, 0x60, 0x7, 0xff, 0x5, 0x40, 0x4, + 0x1, 0xff, 0xd2, 0x50, 0x1, 0x0, 0x7f, 0xf0, + 0x7c, 0x1, 0x80, 0x1f, 0xfc, 0x9, 0x40, 0x25, + 0x0, 0x99, 0xdf, 0xd5, 0xec, 0x0, 0xe0, 0xc, + 0x51, 0x1e, 0x50, 0x1, 0x61, 0x80, 0x7f, 0xc4, + 0xb5, 0xa6, 0x1, 0xc9, 0xff, 0xed, 0xa5, 0x0, + 0xff, 0xff, 0x80, 0x7f, 0xf0, 0x80, + + /* U+0051 "Q" */ + 0x0, 0xf1, 0x46, 0x77, 0xfb, 0x69, 0x80, 0x3f, + 0xf8, 0x5, 0x7a, 0xe6, 0x20, 0x2, 0x59, 0xe7, + 0x0, 0xfe, 0x4d, 0x40, 0x1, 0x2b, 0xb2, 0x0, + 0x6, 0x2c, 0x40, 0x3c, 0x96, 0x0, 0x3c, 0xda, + 0x89, 0xbf, 0x80, 0x2, 0x68, 0x7, 0xd, 0x0, + 0x1f, 0xc, 0x3, 0xcf, 0xa4, 0x7, 0x0, 0x1a, + 0x4, 0x16, 0x0, 0x3f, 0x8b, 0xc0, 0xe, 0x40, + 0x13, 0x0, 0x28, 0x3, 0xfe, 0x27, 0x0, 0x50, + 0x1, 0x40, 0xc, 0x1, 0xff, 0xc1, 0x90, 0x2, + 0x80, 0x34, 0x1, 0x80, 0x1f, 0xfc, 0x11, 0x20, + 0x20, 0x0, 0x80, 0x18, 0x3, 0xff, 0x84, 0xc0, + 0x2, 0x3, 0x0, 0xff, 0xe2, 0x88, 0x0, 0xc0, + 0x80, 0xc, 0x1, 0xff, 0xc2, 0x60, 0x0, 0x86, + 0x80, 0x34, 0x3, 0xff, 0x82, 0x26, 0x4, 0x0, + 0x40, 0x3, 0x0, 0x7f, 0xf0, 0x58, 0x0, 0xa0, + 0x1, 0x50, 0x19, 0x0, 0xff, 0x8a, 0x0, 0x14, + 0x1, 0x40, 0x1, 0x9c, 0x3, 0xf8, 0x7c, 0x0, + 0xc4, 0x1, 0x15, 0x0, 0x22, 0x88, 0x3, 0xcb, + 0xe4, 0x7, 0x20, 0x1c, 0xb2, 0x0, 0x5d, 0xc8, + 0x77, 0x4f, 0x50, 0x81, 0xe8, 0x7, 0xcd, 0x84, + 0x0, 0x37, 0x88, 0x30, 0x80, 0x23, 0x4, 0x3, + 0xf1, 0xed, 0x29, 0x0, 0x62, 0x9e, 0x70, 0xf, + 0xfe, 0x2, 0xd6, 0xfc, 0x0, 0x8, 0x82, 0x1, + 0xa4, 0xc0, 0x3f, 0xe7, 0x90, 0x5, 0xd2, 0xa3, + 0x6b, 0x70, 0x7, 0xff, 0x1, 0xac, 0x41, 0x6a, + 0xe4, 0x82, 0x40, 0x3f, 0xf8, 0x29, 0xd2, 0x62, + 0x4, 0xfc, 0x80, + + /* U+0052 "R" */ + 0x1f, 0xff, 0xed, 0xa5, 0x0, 0xff, 0xe1, 0x92, + 0xd6, 0x98, 0x7, 0x8a, 0x23, 0x9d, 0x40, 0x5, + 0x86, 0x1, 0xcc, 0xef, 0xd1, 0x5e, 0xa0, 0xe, + 0x0, 0xff, 0xe1, 0x52, 0x1, 0x28, 0x7, 0xff, + 0xb, 0xc0, 0x18, 0x1, 0xff, 0xc2, 0x50, 0x1, + 0x0, 0x7f, 0xf5, 0x14, 0x0, 0x40, 0x1f, 0xfc, + 0x2f, 0x0, 0x60, 0x7, 0xff, 0x6, 0x50, 0x5, + 0x40, 0x33, 0x37, 0x9e, 0x79, 0x80, 0x1a, 0x1, + 0xc5, 0x33, 0xd0, 0xc2, 0x5, 0x86, 0x1, 0xff, + 0xc2, 0x4d, 0x30, 0xf, 0x27, 0xff, 0x8c, 0x10, + 0xc0, 0x3f, 0xf8, 0x5c, 0x0, 0xd0, 0xf, 0xfe, + 0x11, 0x48, 0xd, 0x0, 0x7f, 0xf0, 0x99, 0x1, + 0x54, 0x1, 0xff, 0xc2, 0xa1, 0xb, 0x10, 0xf, + 0xfe, 0x8, 0xd0, 0xd, 0x0, + + /* U+0053 "S" */ + 0x0, 0xcd, 0x7b, 0xfe, 0xec, 0x83, 0x0, 0xe5, + 0xe9, 0x42, 0x0, 0x9, 0xbe, 0x60, 0x80, 0x9, + 0x42, 0x6, 0xf3, 0x28, 0x40, 0x1, 0x98, 0x1, + 0x20, 0xa, 0xc8, 0x66, 0x3d, 0xfc, 0xb0, 0x81, + 0x90, 0x32, 0x80, 0x7c, 0xd2, 0x0, 0x60, 0x7, + 0x80, 0x7f, 0xf0, 0x18, 0x1, 0x80, 0x1f, 0xfc, + 0x3, 0x10, 0x58, 0x0, 0xff, 0xe0, 0x40, 0x1, + 0xfe, 0x98, 0x80, 0x3f, 0x35, 0x8, 0x1, 0x67, + 0x75, 0x28, 0x1, 0xe5, 0xe9, 0x40, 0x8, 0x9a, + 0xf4, 0xc0, 0x3c, 0xd7, 0xf6, 0xe6, 0x0, 0x2c, + 0x30, 0xf, 0xc9, 0x19, 0xa8, 0x0, 0xe0, 0xf, + 0xf8, 0xac, 0xc0, 0x84, 0x3, 0xff, 0x80, 0x80, + 0x2, 0x5, 0x0, 0xff, 0x10, 0x0, 0x96, 0xad, + 0x0, 0x3e, 0x65, 0x4, 0x1f, 0x4, 0xbe, 0x97, + 0x66, 0x46, 0xc8, 0x2, 0x2, 0xa0, 0x40, 0x5a, + 0x26, 0x4e, 0x40, 0x58, 0x60, 0x7, 0xea, 0x62, + 0x10, 0x12, 0x5a, 0xd3, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xfe, 0x1a, 0x80, 0x7f, 0xf1, 0x62, + 0x3c, 0xe0, 0x3, 0x88, 0xf3, 0xb3, 0xbf, 0x50, + 0x1, 0x5d, 0xfc, 0x40, 0x1f, 0xff, 0xf0, 0xf, + 0xff, 0xf8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xc6, + + /* U+0055 "U" */ + 0x3f, 0xf4, 0x80, 0x7f, 0x9b, 0xfc, 0xa0, 0x1f, + 0xff, 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0x90, + 0x40, 0x6, 0x1, 0xfe, 0x10, 0x0, 0x90, 0x1, + 0xc0, 0x3f, 0xda, 0x0, 0x60, 0x30, 0x22, 0x0, + 0x7f, 0x20, 0x9, 0x5, 0x80, 0x20, 0x3, 0xf3, + 0x88, 0x38, 0x1, 0xc4, 0x16, 0x40, 0x3c, 0xf0, + 0x0, 0xb0, 0xa, 0x80, 0xd, 0xd5, 0x10, 0xae, + 0x80, 0x5, 0x10, 0x4, 0x98, 0x20, 0x2a, 0xee, + 0x51, 0x1, 0xb5, 0x0, 0xe3, 0xe9, 0x51, 0x0, + 0xa, 0x4f, 0x20, 0x4, + + /* U+0056 "V" */ + 0xd, 0xff, 0x18, 0x7, 0xff, 0x0, 0x7f, 0xd8, + 0x16, 0x0, 0x90, 0xf, 0xfe, 0x3, 0x0, 0x24, + 0x18, 0x41, 0x44, 0x3, 0xfe, 0x90, 0x15, 0x0, + 0x30, 0x2, 0x40, 0x3f, 0xca, 0x21, 0x20, 0x14, + 0x80, 0x18, 0x3, 0xfd, 0x20, 0x6, 0x0, 0x85, + 0x40, 0x54, 0x3, 0xf1, 0x98, 0x18, 0x40, 0x34, + 0x80, 0x24, 0x3, 0xf4, 0x80, 0x2c, 0x3, 0x8c, + 0xc0, 0x66, 0x0, 0xf0, 0xa8, 0x21, 0x0, 0x7a, + 0x40, 0x12, 0x1, 0xe9, 0x0, 0x70, 0x7, 0xca, + 0x20, 0xa2, 0x1, 0xcc, 0x2, 0xa0, 0x1f, 0x98, + 0x1, 0x20, 0x19, 0x84, 0x24, 0x3, 0xfa, 0x40, + 0xc, 0x1, 0xac, 0x0, 0xc0, 0x1f, 0xc2, 0xa0, + 0x2a, 0x0, 0x42, 0x6, 0x10, 0xf, 0xf4, 0x80, + 0x24, 0x1, 0xc0, 0xb, 0x0, 0xff, 0x8c, 0xc0, + 0x66, 0x25, 0x4, 0x20, 0xf, 0xfe, 0x4, 0x80, + 0x26, 0x80, 0x1e, 0x1, 0xff, 0xc1, 0x51, 0x5, + 0x70, 0x24, 0x0, 0xff, 0xe1, 0x48, 0x6, 0xa0, + 0xf, 0xfe, 0x1b, 0x0, 0x66, 0x0, 0xff, 0xe1, + 0x8b, 0x0, 0x18, 0x40, 0x3e, + + /* U+0057 "W" */ + 0xe, 0xfe, 0x0, 0xff, 0x4f, 0xf9, 0x40, 0x3f, + 0x8f, 0xfc, 0xe0, 0xe0, 0x28, 0x1, 0xfc, 0xe0, + 0xf, 0x0, 0xfe, 0xb0, 0x2, 0x86, 0x80, 0x34, + 0x3, 0xf2, 0x8, 0x1, 0x40, 0x3f, 0x94, 0xc, + 0x81, 0x4, 0x1c, 0x3, 0xf6, 0x80, 0x65, 0x0, + 0xf8, 0xc8, 0x2c, 0x2, 0x40, 0x13, 0x0, 0xf9, + 0xc1, 0x0, 0x1e, 0x1, 0xf5, 0x80, 0x14, 0x2, + 0xe0, 0x5, 0x0, 0x79, 0x4, 0x3d, 0x1, 0x40, + 0x3e, 0x50, 0x22, 0x0, 0x48, 0x0, 0x70, 0xf, + 0x68, 0x1, 0x34, 0x0, 0xa0, 0x1c, 0x44, 0xa, + 0x0, 0xe5, 0x1, 0x30, 0xe, 0x70, 0x50, 0x70, + 0x7, 0x80, 0x75, 0x0, 0x14, 0x3, 0xbc, 0x1, + 0x60, 0x19, 0x4, 0x38, 0x5, 0x1, 0x40, 0x39, + 0x40, 0x88, 0x1, 0xca, 0x0, 0x50, 0xd, 0xc0, + 0x28, 0x0, 0xd0, 0x2, 0x0, 0x44, 0x40, 0x50, + 0xf, 0x94, 0x8, 0xc0, 0x25, 0x4, 0x0, 0x9c, + 0x1, 0xc0, 0x15, 0x0, 0x2c, 0x3, 0xef, 0x0, + 0x58, 0x1, 0x0, 0x1c, 0x1, 0xa, 0x2, 0x80, + 0x4a, 0x4, 0x60, 0x1f, 0x28, 0x1, 0x40, 0x1c, + 0x2, 0x80, 0x1b, 0x80, 0x8, 0x4, 0x40, 0x50, + 0xf, 0xe5, 0x2, 0x20, 0x28, 0x38, 0x7, 0x28, + 0x3, 0x41, 0x40, 0x16, 0x1, 0xfd, 0xe0, 0xa, + 0x50, 0x6, 0x80, 0x79, 0x1, 0xc2, 0x80, 0x8c, + 0x3, 0xf9, 0x40, 0xb, 0xe0, 0x28, 0x1, 0xee, + 0x1, 0x72, 0x5, 0x0, 0xff, 0x90, 0x9, 0x41, + 0xc0, 0x3e, 0x50, 0x4, 0x0, 0x2c, 0x3, 0xfe, + 0xe0, 0xd, 0xa0, 0x1f, 0x90, 0x2, 0x13, 0x0, + 0xff, 0x90, 0x2, 0x14, 0x0, 0xfd, 0xc0, 0x13, + 0x80, 0x7f, 0xf0, 0x5, 0x0, 0xe, 0x1, 0xfc, + 0xa0, 0x15, 0x0, 0x78, + + /* U+0058 "X" */ + 0xc, 0xff, 0x28, 0x7, 0xf3, 0x7f, 0xa4, 0x1, + 0xc0, 0xa, 0x20, 0xf, 0x8a, 0x40, 0xa4, 0x0, + 0x52, 0x0, 0xe0, 0xf, 0xbc, 0x1, 0xc0, 0x19, + 0x90, 0xd, 0xc0, 0x3a, 0x8, 0x20, 0xc0, 0x3a, + 0x84, 0x20, 0xc0, 0x24, 0x70, 0x47, 0x0, 0xf0, + 0xd0, 0x3, 0x80, 0x3, 0x40, 0x34, 0x1, 0xf9, + 0x18, 0xa, 0x82, 0xc4, 0x2c, 0x40, 0x3f, 0xa4, + 0x81, 0x69, 0x41, 0x94, 0x3, 0xfe, 0xf0, 0x2, + 0x81, 0x48, 0x7, 0xff, 0x0, 0xa0, 0x2, 0x90, + 0xf, 0xfe, 0x15, 0x80, 0x5c, 0x1, 0xff, 0xc1, + 0x83, 0x0, 0x95, 0x80, 0x3f, 0xe4, 0x70, 0x2d, + 0x0, 0x49, 0x0, 0x7f, 0xd, 0x0, 0x3c, 0xa4, + 0x1, 0xc0, 0x1f, 0xd6, 0x21, 0x4, 0xc, 0xa0, + 0x70, 0x1, 0xf3, 0x28, 0x23, 0x80, 0x56, 0x20, + 0xe8, 0x1, 0xc5, 0x20, 0x34, 0x1, 0x87, 0x40, + 0x14, 0x20, 0x1b, 0xc0, 0x16, 0x20, 0x1c, 0x6e, + 0x3, 0x60, 0x14, 0x90, 0x2a, 0x80, 0x3e, 0x83, + 0x5, 0x60, 0x46, 0x2, 0xa0, 0xf, 0xee, 0x0, + 0x49, 0x0, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x18, 0x7, 0xfd, 0xbf, 0xc0, 0xf, + 0x0, 0x78, 0x7, 0xf9, 0xc8, 0x2c, 0x0, 0x6c, + 0x6, 0xc0, 0x1f, 0x86, 0x1, 0x14, 0x2, 0x81, + 0x8, 0x0, 0xfd, 0x60, 0x9, 0x0, 0xc3, 0x0, + 0x32, 0x1, 0xe3, 0x50, 0x72, 0x0, 0xe6, 0x20, + 0x62, 0x0, 0xee, 0x1, 0x80, 0xf, 0xb8, 0x1, + 0x20, 0x19, 0x88, 0x2c, 0x3, 0xf1, 0xa8, 0x22, + 0x80, 0x6, 0x0, 0xd4, 0x3, 0xfa, 0xc0, 0x16, + 0x0, 0x81, 0xe, 0x0, 0xff, 0xc, 0x0, 0xc1, + 0xb0, 0x31, 0x0, 0x7f, 0xce, 0x40, 0xfc, 0x3, + 0x20, 0x1f, 0xfc, 0x1e, 0x0, 0x10, 0x40, 0x7, + 0xff, 0x8, 0xd4, 0x0, 0x6c, 0x1, 0xff, 0xc3, + 0xf0, 0x5, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xfd, + 0x20, + + /* U+005A "Z" */ + 0x9f, 0xff, 0xfe, 0x19, 0x80, 0x7f, 0xf1, 0x76, + 0x23, 0xfe, 0x20, 0x2, 0x1a, 0x3b, 0xff, 0x8c, + 0x80, 0x68, 0x3, 0xfe, 0x2b, 0x0, 0x68, 0x80, + 0x7f, 0xde, 0x0, 0x93, 0x0, 0xff, 0xa8, 0x81, + 0x98, 0x1, 0xff, 0x3a, 0x81, 0xc8, 0x7, 0xfc, + 0x90, 0x3, 0xc0, 0x1f, 0xf0, 0xd0, 0x2, 0x88, + 0x3, 0xfe, 0xd1, 0x8, 0x40, 0xf, 0xfa, 0x4c, + 0x11, 0xc0, 0x3f, 0xe6, 0x60, 0x15, 0x80, 0x7f, + 0xc7, 0x20, 0xf, 0x0, 0xff, 0x87, 0x40, 0x14, + 0x40, 0x1f, 0xf5, 0x8, 0x32, 0x80, 0x7f, 0xd0, + 0x80, 0x72, 0x1, 0xff, 0x2b, 0x80, 0x11, 0xdf, + 0xfe, 0x49, 0x0, 0x9e, 0x23, 0xfe, 0xd0, 0xf, + 0xfe, 0x28, + + /* U+005B "[" */ + 0x1f, 0xfe, 0xc0, 0xf, 0xf2, 0x66, 0x38, 0x2, + 0x13, 0x31, 0x0, 0x7f, 0xff, 0xc0, 0x3f, 0xfe, + 0x22, 0x66, 0x20, 0x9, 0x33, 0x1c, 0x1, 0xf0, + + /* U+005C "\\" */ + 0x7, 0x83, 0x0, 0xff, 0x63, 0xc0, 0x7, 0xfb, + 0x81, 0x4, 0x3, 0xf9, 0x40, 0xe, 0x1, 0xfe, + 0x50, 0xa0, 0xf, 0xf7, 0x81, 0x88, 0x7, 0xf2, + 0x80, 0x18, 0x3, 0xfc, 0xa1, 0x40, 0x1f, 0xee, + 0x2, 0x20, 0x7, 0xf2, 0x8, 0x50, 0x7, 0xf9, + 0xc1, 0x40, 0x3f, 0xd4, 0x4, 0x60, 0x1f, 0xc6, + 0x21, 0x60, 0x1f, 0xe6, 0x6, 0x0, 0xff, 0x50, + 0xa, 0x0, 0x7f, 0x11, 0x3, 0x40, 0x3f, 0xd4, + 0xe, 0x1, 0xfe, 0x50, 0x14, 0x0, 0xfe, 0x23, + 0xe, 0x0, 0xff, 0x58, 0x28, 0x7, 0xf9, 0x80, + 0xa, 0x1, 0xfc, 0x28, 0x1c, 0x1, 0xfe, 0xd0, + 0x41, 0x0, 0xfe, 0x70, 0x3, 0x80, 0x7f, 0xa, + 0x6, 0x80, 0x7f, 0xb8, 0x10, 0x40, 0x3f, 0x94, + 0x0, 0xe0, + + /* U+005D "]" */ + 0x7f, 0xfe, 0x60, 0xf, 0x9b, 0x31, 0x0, 0x10, + 0x99, 0xc0, 0x1f, 0xff, 0xf0, 0xf, 0xff, 0x88, + 0x99, 0xc0, 0x13, 0x66, 0x20, 0x3, 0xfc, + + /* U+005E "^" */ + 0x0, 0xe7, 0x83, 0x0, 0xfe, 0x58, 0x78, 0x0, + 0xfe, 0x90, 0x2, 0x10, 0x7, 0xc6, 0x62, 0x80, + 0xb0, 0xf, 0xa4, 0x2d, 0x81, 0x80, 0x3c, 0x2a, + 0xc, 0x2a, 0xc, 0x1, 0xd2, 0xc, 0x0, 0x90, + 0xb0, 0xe, 0x60, 0xb0, 0x1, 0x91, 0x10, 0x2, + 0x61, 0x42, 0x0, 0xac, 0x3c, 0x2, 0xb0, 0xf0, + 0xc, 0xc0, 0x84, 0x8, 0x44, 0x40, 0xe, 0x60, + 0xb0, 0xf0, 0xa0, 0xf, 0x58, 0x30, 0x0, + + /* U+005F "_" */ + 0xbb, 0xff, 0xe1, 0x22, 0x7f, 0xf0, 0x80, + + /* U+0060 "`" */ + 0x38, 0x83, 0x80, 0x63, 0xe7, 0x8b, 0x0, 0xcd, + 0xa4, 0x98, 0x20, 0x11, 0x6a, 0x9e, 0x8, + + /* U+0061 "a" */ + 0x0, 0xb, 0xdf, 0x7f, 0xb6, 0x90, 0x3, 0x47, + 0x42, 0x8, 0x0, 0x96, 0xe4, 0x2, 0x50, 0x15, + 0x9a, 0x95, 0x0, 0x33, 0x0, 0x1d, 0x1d, 0x4c, + 0xad, 0x5a, 0x0, 0x80, 0x1, 0xb8, 0x7, 0x89, + 0xc0, 0x48, 0x3, 0xfd, 0xc0, 0x6, 0x0, 0x14, + 0x67, 0x73, 0xfe, 0x90, 0xc, 0xda, 0xe6, 0x22, + 0x0, 0xf0, 0x94, 0x80, 0xd7, 0x7f, 0xe9, 0x0, + 0x94, 0x1, 0x4a, 0x20, 0x1f, 0xb8, 0x0, 0xa0, + 0x1e, 0xe0, 0xb, 0x80, 0x8, 0x1, 0xc4, 0xe0, + 0x12, 0x80, 0x2d, 0x40, 0x2, 0xd8, 0x1, 0x8a, + 0x80, 0x6b, 0xfd, 0xd2, 0x2c, 0x1, 0x97, 0x58, + 0x40, 0x4, 0xdb, 0x40, 0x10, + + /* U+0062 "b" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, + 0x4b, 0x7d, 0xfb, 0x6a, 0x1, 0xf3, 0x65, 0x20, + 0x81, 0x25, 0x69, 0x0, 0x75, 0x98, 0x2c, 0x4b, + 0x88, 0x16, 0x90, 0x6, 0x12, 0xda, 0x76, 0x8e, + 0x60, 0x7, 0x80, 0x77, 0x90, 0x7, 0x4a, 0x81, + 0x28, 0x4, 0xc4, 0x1, 0xf4, 0x0, 0x3c, 0x2, + 0xc0, 0xf, 0xc4, 0x20, 0xc0, 0x13, 0x0, 0x7f, + 0x18, 0x10, 0x4, 0xc0, 0x1f, 0xc6, 0x4, 0x1, + 0x60, 0x7, 0xe3, 0x10, 0x60, 0x9, 0x88, 0x3, + 0xe8, 0x0, 0x78, 0x6, 0xf2, 0x0, 0xe9, 0x40, + 0x25, 0x0, 0x88, 0x9b, 0x4e, 0xd1, 0xcc, 0x0, + 0xf0, 0xd, 0xc6, 0xb, 0x12, 0xe2, 0x5, 0xa4, + 0x1, 0x87, 0x29, 0x4, 0x5, 0x2b, 0x48, 0x0, + + /* U+0063 "c" */ + 0x0, 0xc7, 0x3b, 0xfe, 0xd9, 0x30, 0xe, 0x1b, + 0xc6, 0x20, 0x1, 0x36, 0x48, 0x4, 0x38, 0x80, + 0x2d, 0x32, 0x60, 0x3, 0x40, 0x2, 0x88, 0x17, + 0xa5, 0x99, 0x3c, 0x60, 0x11, 0xa0, 0x1d, 0x0, + 0x70, 0xee, 0xa0, 0x2c, 0x1, 0x0, 0x1f, 0x9, + 0x0, 0xc, 0x0, 0x80, 0x1f, 0xf3, 0x80, 0x80, + 0x7f, 0xf0, 0x1c, 0x4, 0x3, 0xff, 0x80, 0x60, + 0x4, 0x0, 0xff, 0xa8, 0x1, 0x0, 0x1f, 0x9, + 0x0, 0x9, 0x0, 0xe8, 0x3, 0x87, 0x75, 0x0, + 0xa, 0x20, 0x5e, 0x96, 0x64, 0xf1, 0x80, 0x61, + 0xc4, 0x1, 0x69, 0x93, 0x0, 0x1e, 0x0, 0x21, + 0xbc, 0x62, 0x0, 0x13, 0x64, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0xff, 0xe0, 0x17, 0xfa, 0x0, 0x3f, 0xff, + 0xe0, 0x1f, 0xcb, 0x5b, 0xfd, 0x8c, 0x1, 0xf1, + 0x65, 0x29, 0x0, 0x9c, 0xeb, 0x0, 0x61, 0xc3, + 0x1, 0x69, 0x92, 0x81, 0x50, 0x6, 0xd1, 0x5, + 0xe9, 0x66, 0x57, 0x18, 0x80, 0x46, 0x60, 0x3a, + 0x0, 0xe1, 0xd1, 0x0, 0xa8, 0x1, 0x0, 0x1f, + 0xb, 0x0, 0x44, 0x0, 0x40, 0xf, 0xd6, 0x1, + 0x38, 0x8, 0x7, 0xf0, 0x80, 0x4e, 0x2, 0x1, + 0xfc, 0x20, 0x11, 0x0, 0xc, 0x3, 0xf2, 0x0, + 0x54, 0x0, 0x80, 0xf, 0xd4, 0x1, 0x19, 0x81, + 0x20, 0x3, 0xd6, 0x40, 0x1b, 0x44, 0x1f, 0x18, + 0xd1, 0xf9, 0x4, 0x3, 0xe, 0x18, 0x1c, 0xe5, + 0xc0, 0x8b, 0x40, 0x38, 0xb2, 0x90, 0x80, 0x4e, + 0x38, 0xc0, 0x20, + + /* U+0065 "e" */ + 0x0, 0xc9, 0x7b, 0xfd, 0x8c, 0x20, 0x1c, 0x39, + 0x68, 0x40, 0x27, 0x3e, 0x80, 0x10, 0xf9, 0x82, + 0x4d, 0xd3, 0x0, 0xda, 0x0, 0x28, 0x42, 0xec, + 0xc8, 0xb3, 0xa4, 0x14, 0x26, 0x81, 0x28, 0x1, + 0xc5, 0xe0, 0x2f, 0x40, 0x6, 0x0, 0xf8, 0x90, + 0x34, 0x80, 0x1f, 0xff, 0xc8, 0xc, 0xe0, 0x1f, + 0xfc, 0x13, 0x70, 0x7, 0xff, 0xfd, 0xc6, 0x0, + 0x40, 0xf, 0xfa, 0xc0, 0x10, 0x1, 0xf8, 0x40, + 0x6, 0x80, 0x76, 0x20, 0x1c, 0xbe, 0x60, 0xa, + 0x20, 0x4e, 0x96, 0x64, 0x65, 0xf, 0x80, 0x7, + 0x10, 0x0, 0xd3, 0x27, 0x30, 0x2e, 0x0, 0x86, + 0xf1, 0x88, 0x40, 0x56, 0xb4, 0x80, + + /* U+0066 "f" */ + 0x0, 0xc3, 0x1b, 0xfd, 0x68, 0x1, 0xe, 0x39, + 0x0, 0xa6, 0x80, 0x50, 0x40, 0xb7, 0x66, 0xa0, + 0x9, 0xc0, 0xa9, 0x11, 0x26, 0x1, 0x8, 0x20, + 0x7, 0xc2, 0x1, 0xfa, 0x7f, 0x80, 0xd, 0xff, + 0x70, 0x7, 0xff, 0x2, 0xf2, 0xc0, 0x9, 0x99, + 0x68, 0x11, 0xa8, 0x0, 0x4c, 0xf0, 0x7, 0xff, + 0xfc, 0x3, 0xff, 0xc6, + + /* U+0067 "g" */ + 0x0, 0xcb, 0x7b, 0xfd, 0x8e, 0x21, 0x9f, 0x80, + 0x3, 0xda, 0x42, 0x1, 0x38, 0xf4, 0x0, 0xc7, + 0x84, 0x4, 0xf3, 0x27, 0x11, 0x59, 0x0, 0x5c, + 0x0, 0x7d, 0x86, 0x64, 0x73, 0x80, 0x80, 0x14, + 0x81, 0xa0, 0x3, 0xd0, 0xc0, 0x17, 0x80, 0x2c, + 0x3, 0xf5, 0x80, 0x4c, 0x2, 0x40, 0x1f, 0x88, + 0x40, 0x30, 0x80, 0x7f, 0x84, 0x0, 0xc0, 0x2, + 0x0, 0xfc, 0x40, 0x17, 0x80, 0x20, 0x3, 0xf4, + 0x0, 0x4a, 0x40, 0xb2, 0x1, 0xe9, 0x50, 0xd, + 0xe0, 0x6, 0xe9, 0x66, 0x4f, 0x30, 0x7, 0x16, + 0x10, 0xb, 0x4c, 0x98, 0x45, 0x60, 0x7, 0x0, + 0x1e, 0xd2, 0x10, 0x9, 0xc7, 0xa0, 0x0, 0x40, + 0x32, 0xde, 0xff, 0x63, 0x89, 0x0, 0xc, 0x3, + 0xff, 0x81, 0x40, 0xc, 0x3, 0xe6, 0x0, 0xf9, + 0x5c, 0x5, 0x43, 0xc6, 0x7a, 0x9d, 0x99, 0x19, + 0x40, 0xb, 0x0, 0x71, 0x80, 0xac, 0x4c, 0x9c, + 0xc0, 0x12, 0xa0, 0x2, 0xcc, 0x3a, 0x8, 0x0, + 0x52, 0x39, 0x80, 0x0, + + /* U+0068 "h" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf8, + 0x8d, 0x7d, 0xfd, 0x6a, 0x1, 0xe6, 0xd9, 0x41, + 0x1, 0x4a, 0xb0, 0xe, 0xa2, 0x16, 0x88, 0x28, + 0x1, 0x24, 0x3, 0x93, 0xa5, 0xdd, 0x58, 0x0, + 0x62, 0x0, 0x86, 0xc0, 0x38, 0xe0, 0x0, 0x80, + 0x14, 0x80, 0x7c, 0x80, 0xe, 0x0, 0x8c, 0x3, + 0xe2, 0x0, 0x8, 0x4, 0xe0, 0x1f, 0xe3, 0x0, + 0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80, + + /* U+0069 "i" */ + 0x5e, 0xd3, 0x81, 0x29, 0x60, 0x6, 0xdc, 0xd3, + 0x83, 0x28, 0x7, 0x3f, 0xf8, 0xc0, 0x3f, 0xfd, + 0x80, + + /* U+006A "j" */ + 0x0, 0xe3, 0xee, 0x20, 0x7, 0x40, 0x8a, 0x0, + 0x38, 0x80, 0xa, 0x1, 0xd3, 0x38, 0x3, 0xcc, + 0xc0, 0xf, 0xfe, 0x1a, 0xff, 0x98, 0x3, 0xff, + 0xfe, 0x1, 0xff, 0xef, 0x30, 0xe, 0xc0, 0x3, + 0x5, 0xb2, 0xc3, 0x0, 0x9a, 0xa4, 0xd3, 0x80, + 0x28, 0x1d, 0x48, 0x5, 0x31, 0x0, + + /* U+006B "k" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, + 0xe9, 0xfe, 0xe2, 0x0, 0xff, 0x2d, 0x80, 0xe1, + 0x0, 0x7f, 0x35, 0x0, 0xe1, 0x0, 0x7f, 0x3c, + 0x80, 0xe1, 0x0, 0x7f, 0x44, 0x0, 0x70, 0x80, + 0x3f, 0xa5, 0xc0, 0x70, 0x80, 0x3f, 0x3d, 0x30, + 0x1, 0xc8, 0x3, 0xfa, 0x94, 0x2, 0x65, 0x0, + 0xfe, 0x10, 0x3a, 0x0, 0x51, 0x0, 0x7f, 0x26, + 0x2b, 0x80, 0x3c, 0x3, 0xf2, 0xd8, 0x2, 0x10, + 0xa, 0x80, 0x3e, 0x90, 0xd, 0x64, 0xa, 0xe0, + 0x1f, 0xfc, 0xf, 0x0, 0x42, 0x0, 0x7f, 0xc5, + 0x40, 0xa, 0x10, 0xf, 0xf9, 0x5c, 0x7, 0x40, + + /* U+006C "l" */ + 0x7f, 0xf1, 0x80, 0x7f, 0xff, 0xc0, 0x38, + + /* U+006D "m" */ + 0x7f, 0xf1, 0xc, 0x67, 0x7e, 0xc9, 0x80, 0x45, + 0x1b, 0xfe, 0xd9, 0x20, 0xf, 0x3f, 0xb9, 0x88, + 0x13, 0x63, 0x83, 0xeb, 0x90, 0x0, 0x9b, 0x58, + 0x3, 0xa8, 0x4e, 0x6e, 0x94, 0x1, 0x15, 0x0, + 0x73, 0x74, 0xa0, 0x9, 0x30, 0xe, 0x7c, 0x64, + 0x5a, 0x90, 0x2, 0x83, 0xe3, 0x22, 0xd4, 0x0, + 0x20, 0x3, 0x14, 0x0, 0x73, 0x10, 0x0, 0xe0, + 0x3, 0x9c, 0x81, 0x0, 0x35, 0x0, 0x7c, 0x80, + 0xb, 0x0, 0xf9, 0x0, 0x2, 0x1, 0x18, 0x7, + 0xdc, 0x0, 0x30, 0xf, 0x84, 0x0, 0x60, 0x13, + 0x80, 0x7f, 0x9c, 0x3, 0xfc, 0x20, 0x1f, 0xff, + 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0x50, + + /* U+006E "n" */ + 0x7f, 0xf1, 0x3, 0xe7, 0x7f, 0x5a, 0x80, 0x79, + 0xfa, 0xc, 0x40, 0x52, 0xac, 0x3, 0xa8, 0x4a, + 0x2a, 0x8e, 0x20, 0x92, 0x1, 0xcd, 0xae, 0xaa, + 0x8c, 0x10, 0x62, 0x0, 0x8a, 0x40, 0x38, 0xa4, + 0x0, 0x80, 0x15, 0x0, 0x7c, 0xa0, 0xe, 0x0, + 0x8c, 0x3, 0xe3, 0x0, 0x8, 0x4, 0xe0, 0x1f, + 0xe3, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf4, 0x80, + + /* U+006F "o" */ + 0x0, 0xc9, 0x5b, 0xfd, 0xb0, 0x40, 0x1e, 0x1b, + 0xb2, 0x90, 0x9, 0x3e, 0xc0, 0x6, 0x1f, 0x40, + 0x16, 0x99, 0x28, 0x1, 0xec, 0x2, 0xa1, 0x5, + 0xe9, 0x66, 0x57, 0x18, 0x23, 0x81, 0xa0, 0x1d, + 0x0, 0x70, 0xe8, 0x84, 0x85, 0x80, 0x20, 0x3, + 0xe1, 0x90, 0x15, 0x30, 0x2, 0x0, 0x7e, 0x40, + 0x1, 0x38, 0x8, 0x7, 0xf0, 0x80, 0x39, 0xc0, + 0x40, 0x3f, 0x84, 0x1, 0xc6, 0x0, 0x40, 0xf, + 0xd6, 0x0, 0x2b, 0x0, 0x40, 0x7, 0xc2, 0xc0, + 0x2a, 0x68, 0x7, 0x40, 0x1c, 0x3a, 0x21, 0x20, + 0xa, 0x20, 0x5e, 0x96, 0x65, 0x71, 0x82, 0x38, + 0x0, 0x71, 0x0, 0x5a, 0x64, 0xa0, 0x7, 0xb0, + 0xc, 0x37, 0x65, 0x20, 0x12, 0x6d, 0x80, 0x8, + + /* U+0070 "p" */ + 0x7f, 0xf1, 0x3, 0x5f, 0x7e, 0xda, 0x80, 0x7c, + 0xdb, 0x28, 0x20, 0x49, 0x5a, 0x40, 0x1d, 0x44, + 0x2f, 0x76, 0x93, 0x2, 0xd2, 0x0, 0xc2, 0x7f, + 0x8, 0x86, 0xc8, 0x0, 0x78, 0x6, 0x1d, 0x10, + 0xe, 0x76, 0x2, 0x50, 0x9, 0x84, 0x3, 0xeb, + 0x0, 0x78, 0x5, 0x80, 0x1f, 0x88, 0x41, 0x80, + 0x27, 0x0, 0xfe, 0x30, 0x20, 0x9, 0x80, 0x3f, + 0x8c, 0x8, 0x2, 0xc0, 0xf, 0xc6, 0x20, 0xc0, + 0x13, 0x10, 0x7, 0xd0, 0x0, 0xf0, 0xd, 0xe4, + 0x1, 0xd2, 0x80, 0x4a, 0x1, 0x9, 0x6d, 0x3b, + 0x47, 0x30, 0x3, 0xc0, 0x35, 0x18, 0x2c, 0x4b, + 0x88, 0x16, 0x90, 0x6, 0x7c, 0xa4, 0x10, 0x14, + 0xad, 0x20, 0xf, 0x96, 0xfb, 0xfa, 0xd4, 0x3, + 0xff, 0xf0, + + /* U+0071 "q" */ + 0x0, 0xcb, 0x5b, 0xfd, 0x8c, 0x0, 0xff, 0x40, + 0x0, 0xb2, 0x94, 0x80, 0x4e, 0x74, 0x80, 0x30, + 0xe1, 0x80, 0xb4, 0xc9, 0x40, 0xb0, 0x3, 0x68, + 0x82, 0xf4, 0xb3, 0x2b, 0x4c, 0x40, 0x23, 0x30, + 0x1d, 0x0, 0x71, 0x68, 0x80, 0x54, 0x0, 0x80, + 0xf, 0x86, 0x40, 0x22, 0x0, 0x20, 0x7, 0xe4, + 0x0, 0x9c, 0x4, 0x3, 0xf8, 0x40, 0x27, 0x1, + 0x0, 0xfe, 0x10, 0x8, 0x80, 0x8, 0x1, 0xfa, + 0xc0, 0x2a, 0x0, 0x40, 0x7, 0xc2, 0xc0, 0x11, + 0x98, 0xe, 0x80, 0x38, 0x74, 0x40, 0x36, 0x88, + 0x2f, 0x4b, 0x32, 0xb8, 0xc4, 0x3, 0xe, 0x18, + 0xb, 0x4c, 0x94, 0xf, 0x40, 0x38, 0xb2, 0x90, + 0x80, 0x4e, 0x70, 0x40, 0x3e, 0x5b, 0xdf, 0xec, + 0x60, 0xf, 0xff, 0xc8, + + /* U+0072 "r" */ + 0x7f, 0xf1, 0x3, 0x67, 0x40, 0x4, 0x3b, 0x26, + 0x20, 0x1b, 0x88, 0xd, 0xb4, 0x2, 0x22, 0x6e, + 0x4a, 0x80, 0x6c, 0x20, 0xf, 0x38, 0x80, 0x7d, + 0xa0, 0x1f, 0x98, 0x3, 0xff, 0xf0, + + /* U+0073 "s" */ + 0x0, 0x8a, 0x77, 0xfd, 0xd9, 0x6, 0x1, 0xa3, + 0x58, 0x80, 0x2, 0x6f, 0x90, 0x0, 0x57, 0x1, + 0x79, 0xa9, 0x61, 0xa, 0x0, 0x70, 0x3, 0x21, + 0x95, 0xa7, 0xb0, 0x80, 0xc, 0x4, 0x40, 0xf, + 0x18, 0x4, 0xc0, 0x4e, 0x1, 0xfe, 0x80, 0x4, + 0x75, 0xc2, 0x88, 0x7, 0x1d, 0x90, 0xa, 0x3d, + 0x76, 0xa8, 0x6, 0x4d, 0xc9, 0x63, 0x0, 0x15, + 0x38, 0x7, 0x1b, 0x4e, 0x7d, 0x8, 0x40, 0x7, + 0xf9, 0x58, 0x0, 0x40, 0xae, 0x1, 0xf1, 0x80, + 0xc, 0x2e, 0x3e, 0x9d, 0x54, 0xf8, 0x80, 0x82, + 0x22, 0x0, 0x2c, 0x55, 0x20, 0xc0, 0xe8, 0x7, + 0x30, 0xe6, 0x20, 0x2, 0x5a, 0xc1, 0x0, + + /* U+0074 "t" */ + 0x0, 0xa2, 0xa, 0x1, 0xf0, 0xbb, 0xbc, 0x3, + 0xff, 0x9f, 0x3f, 0xc0, 0x5, 0xff, 0xb8, 0x3, + 0xff, 0x81, 0x79, 0x60, 0x4, 0xcc, 0xb4, 0x8, + 0xd4, 0x0, 0x26, 0x78, 0x3, 0xff, 0xf2, 0x20, + 0x1f, 0xfc, 0x14, 0x0, 0xfc, 0xa0, 0x36, 0xaa, + 0xa4, 0x0, 0xa0, 0x41, 0x2a, 0x8b, 0xe0, 0x11, + 0x7b, 0x8, 0xa, 0xc0, + + /* U+0075 "u" */ + 0x9f, 0xf0, 0x80, 0x7c, 0xbf, 0xe6, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xf8, 0x44, 0x0, 0x40, 0x1f, + 0x68, 0x5, 0xa0, 0x4, 0x0, 0xf9, 0x80, 0x24, + 0x0, 0x49, 0x0, 0x75, 0x8, 0x4, 0x2e, 0x3, + 0x90, 0x88, 0x6d, 0x50, 0xe, 0x85, 0x1, 0x7b, + 0xb4, 0x90, 0xd0, 0x7, 0x55, 0xa8, 0x80, 0x9c, + 0x73, 0x80, 0x40, + + /* U+0076 "v" */ + 0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80, + 0xb0, 0x7, 0xeb, 0x0, 0x30, 0x30, 0x85, 0x0, + 0x7c, 0x2c, 0xc, 0x20, 0x6, 0x3, 0x30, 0x7, + 0x98, 0x1, 0x60, 0x15, 0x0, 0x24, 0x3, 0xd2, + 0x8, 0x40, 0x11, 0x28, 0x28, 0x80, 0x65, 0x10, + 0xf0, 0xe, 0x90, 0x4, 0x80, 0x69, 0x2, 0x40, + 0xe, 0x32, 0x6, 0x0, 0x8c, 0xc1, 0x60, 0x1f, + 0x58, 0xa, 0x80, 0x24, 0x0, 0xc0, 0x1f, 0x30, + 0x84, 0x80, 0xa8, 0x30, 0x7, 0xf3, 0x1, 0x99, + 0x80, 0x16, 0x1, 0xfd, 0x20, 0x9, 0x90, 0x21, + 0x0, 0x7f, 0xa, 0x82, 0x88, 0x78, 0x7, 0xfd, + 0x20, 0x11, 0x20, 0x7, 0xfc, 0x66, 0x0, 0x58, + 0x7, 0x80, + + /* U+0077 "w" */ + 0xaf, 0xe0, 0xf, 0xd5, 0xfc, 0x1, 0xfa, 0x7f, + 0x78, 0x5, 0x0, 0x3c, 0x2a, 0x2, 0xa0, 0x1f, + 0x38, 0x52, 0x8, 0x68, 0x7, 0x9c, 0x2, 0xe0, + 0xf, 0x28, 0x83, 0x3, 0x3, 0x0, 0x7a, 0x80, + 0x24, 0x10, 0xe, 0xe0, 0x41, 0xa, 0x0, 0x28, + 0x6, 0x23, 0xa, 0x0, 0x38, 0x6, 0x14, 0xe, + 0x0, 0x11, 0x87, 0x0, 0x6a, 0x2, 0x54, 0xa, + 0x0, 0xce, 0x2, 0xa0, 0x15, 0x82, 0x8, 0x4, + 0xc1, 0x41, 0xc0, 0x64, 0x1, 0x50, 0x38, 0x6, + 0x60, 0x3, 0x80, 0x10, 0x41, 0x81, 0x44, 0x28, + 0x0, 0x46, 0x14, 0x1, 0x85, 0x2, 0x80, 0x1c, + 0x8, 0x20, 0x7, 0x6, 0x0, 0x50, 0x11, 0x80, + 0x77, 0x1, 0x90, 0xa8, 0x70, 0x5, 0x40, 0x28, + 0xc, 0x14, 0x1, 0xe5, 0x10, 0xa7, 0x0, 0x28, + 0x4, 0x66, 0xd, 0x41, 0x6, 0x0, 0xf9, 0xc1, + 0x68, 0x18, 0x3, 0xa8, 0x1b, 0x81, 0x4, 0x3, + 0xea, 0x2, 0x30, 0xa0, 0xe, 0x70, 0x2, 0x86, + 0x80, 0x7e, 0x32, 0x0, 0x11, 0x80, 0x70, 0xa8, + 0x4, 0xc0, 0x1f, 0xd4, 0x0, 0xa0, 0xf, 0xb8, + 0x0, 0xa0, 0x1c, + + /* U+0078 "x" */ + 0x1e, 0xfe, 0x10, 0xf, 0x4f, 0xf9, 0x40, 0x74, + 0x7, 0x40, 0x39, 0x58, 0x19, 0x40, 0x7, 0x20, + 0x70, 0x1, 0x15, 0x81, 0xc8, 0x6, 0x65, 0x7, + 0x50, 0x7, 0x8, 0x70, 0x7, 0xa8, 0x82, 0xca, + 0x4c, 0x28, 0x80, 0x3e, 0xf0, 0x1c, 0x60, 0x75, + 0x0, 0xfc, 0x52, 0x2, 0x7, 0x0, 0x1f, 0xe6, + 0x10, 0x4, 0x80, 0x7f, 0xd4, 0x20, 0xb, 0x20, + 0xf, 0xe6, 0x50, 0x50, 0x1e, 0x0, 0xfc, 0x72, + 0x7, 0x54, 0x3, 0x90, 0xf, 0xf, 0x0, 0xe8, + 0x2b, 0x3, 0x28, 0x7, 0x51, 0x5, 0x8, 0x2, + 0x48, 0x28, 0x80, 0x27, 0x40, 0x74, 0x0, 0xde, + 0x0, 0xf0, 0x1, 0xc0, 0x1c, 0x0, 0x71, 0x50, + 0x15, 0x0, + + /* U+0079 "y" */ + 0xd, 0xfe, 0x0, 0xfe, 0x2f, 0xf3, 0x85, 0x80, + 0xb0, 0x7, 0xeb, 0x0, 0x38, 0x30, 0x85, 0x80, + 0x7c, 0x2c, 0xe, 0x1, 0x48, 0x12, 0x80, 0x7a, + 0x40, 0x12, 0x1, 0x30, 0x2, 0x40, 0x3c, 0xc0, + 0xa2, 0x1, 0xb, 0x1, 0x98, 0x3, 0x30, 0x84, + 0x80, 0x75, 0x80, 0x24, 0x3, 0x58, 0x19, 0x80, + 0x38, 0x94, 0x14, 0x40, 0x8, 0x41, 0x0, 0x1f, + 0x48, 0x2, 0x40, 0x1e, 0x4, 0x80, 0x1f, 0x19, + 0x81, 0xc0, 0x90, 0x2c, 0x3, 0xfa, 0x0, 0xf, + 0x60, 0x2c, 0x1, 0xfc, 0x84, 0x12, 0xc1, 0x20, + 0x1f, 0xf5, 0x80, 0x80, 0x18, 0x3, 0xfe, 0x61, + 0x0, 0x30, 0x80, 0x7f, 0xf0, 0x1c, 0x1, 0x60, + 0x1f, 0xfc, 0x1, 0x60, 0x42, 0x0, 0xf8, 0x40, + 0x34, 0x0, 0x20, 0x3, 0xf7, 0xdb, 0x2d, 0x30, + 0x29, 0x80, 0x7c, 0xc2, 0x93, 0x4a, 0x5, 0x60, + 0x1f, 0x9a, 0x4c, 0x0, 0x51, 0xa2, 0x1, 0xf8, + + /* U+007A "z" */ + 0xbf, 0xff, 0xf9, 0x40, 0x3f, 0xf8, 0x3, 0x39, + 0x9f, 0x38, 0x1, 0x10, 0x46, 0x7e, 0x17, 0x2, + 0xa0, 0xf, 0x87, 0xc0, 0x1c, 0x20, 0x1f, 0x51, + 0x5, 0x18, 0x7, 0xd0, 0x80, 0xea, 0x1, 0xf2, + 0x38, 0x24, 0x0, 0x7c, 0x56, 0x3, 0x40, 0x1f, + 0xbc, 0x1, 0xa2, 0x1, 0xf5, 0x10, 0x49, 0x80, + 0x7c, 0xea, 0xc, 0xc0, 0xf, 0x92, 0x0, 0x68, + 0xcf, 0xe1, 0x90, 0x0, 0xe6, 0x7e, 0x93, 0x0, + 0xff, 0xe0, 0x0, + + /* U+007B "{" */ + 0x0, 0xcd, 0x9f, 0xe4, 0x0, 0x9e, 0x4c, 0x3, + 0xd2, 0x0, 0x8c, 0x50, 0x0, 0x88, 0x11, 0xcc, + 0x40, 0x6, 0x0, 0x30, 0xf, 0xff, 0x68, 0x9c, + 0x0, 0x34, 0x2, 0x7c, 0x50, 0x65, 0x0, 0xf9, + 0x4, 0x2, 0x6f, 0x80, 0x27, 0x0, 0xe5, 0x0, + 0x70, 0x7, 0xff, 0xbc, 0xc0, 0x6, 0x1, 0xc2, + 0x20, 0x48, 0x31, 0x0, 0xa0, 0x0, 0xf8, 0xa0, + 0x13, 0x51, 0x80, 0x40, + + /* U+007C "|" */ + 0x1f, 0xf3, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, + 0xa0, + + /* U+007D "}" */ + 0x7f, 0xf5, 0xa0, 0x7, 0xc9, 0x68, 0x1, 0x35, + 0xb0, 0x2, 0x0, 0x21, 0x49, 0x20, 0x30, 0xf, + 0x38, 0x7, 0xff, 0xc8, 0x80, 0x10, 0x60, 0x1a, + 0x50, 0x1f, 0xc, 0x2, 0x35, 0x0, 0xfa, 0xc4, + 0x2b, 0xcc, 0x2, 0x30, 0x2, 0x80, 0x7f, 0xfb, + 0xdc, 0x3, 0x85, 0x24, 0x80, 0xc0, 0x26, 0xb6, + 0x0, 0x40, 0x7, 0x92, 0xd0, 0x2, + + /* U+007E "~" */ + 0x0, 0x3f, 0x7e, 0x18, 0x6, 0x2f, 0xa0, 0x78, + 0x10, 0x3c, 0x60, 0x9, 0xc0, 0x82, 0x42, 0x76, + 0x2, 0x60, 0x6, 0x3, 0xc, 0x51, 0x89, 0xec, + 0x5f, 0xf8, 0x91, 0xc, 0x18, 0x1, 0x27, 0xa8, + 0x1, 0x68, 0x0, + + /* U+00B0 "°" */ + 0x0, 0xc2, 0x1, 0xf3, 0xf7, 0x3f, 0x10, 0x2, + 0xa8, 0x49, 0x81, 0xb5, 0x4, 0x57, 0xa6, 0x7d, + 0x3a, 0xd, 0x8, 0x0, 0xd0, 0xa, 0x44, 0x0, + 0xe6, 0x3, 0x22, 0x8, 0x6, 0x70, 0x2a, 0xb, + 0x0, 0x86, 0xc5, 0xd, 0xd7, 0x66, 0xb8, 0x68, + 0x1, 0x14, 0x2c, 0x8b, 0xa8, 0x0, + + /* U+2022 "•" */ + 0x0, 0x84, 0x2, 0x4e, 0xe6, 0x8, 0x50, 0x81, + 0xd0, 0x88, 0x2, 0x61, 0x10, 0x4, 0xe1, 0xa6, + 0x9, 0x60, + + /* U+F001 "" */ + 0x0, 0xff, 0xe6, 0x89, 0x80, 0x7f, 0xf2, 0xce, + 0x37, 0xb2, 0x40, 0x3f, 0xf8, 0xc2, 0xb5, 0xd8, + 0xe4, 0x0, 0x60, 0xf, 0xfe, 0x19, 0x3e, 0x75, + 0x28, 0x80, 0x7f, 0xf1, 0x92, 0x7b, 0x60, 0xc0, + 0x3f, 0xf8, 0xc2, 0xd7, 0xf6, 0xc2, 0x1, 0xff, + 0xc8, 0x8e, 0x94, 0x0, 0xff, 0xe6, 0x38, 0x7, + 0xff, 0x78, 0x59, 0x0, 0x3f, 0xf9, 0x47, 0x19, + 0xd2, 0x60, 0x1f, 0xfc, 0x61, 0x5a, 0xec, 0x73, + 0x0, 0xff, 0xe3, 0x13, 0xe7, 0x52, 0x88, 0x7, + 0xff, 0x1d, 0x77, 0x50, 0x60, 0x1f, 0xfc, 0xb2, + 0x20, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xf8, 0x2f, + 0x59, 0x68, 0x1, 0xff, 0xc9, 0x5e, 0x85, 0x34, + 0x30, 0xf, 0xfe, 0x41, 0x50, 0x7, 0xff, 0x0, + 0x4c, 0xc4, 0x1, 0xfe, 0x50, 0xf, 0xf8, 0xf3, + 0xb3, 0x1a, 0x1, 0xfe, 0x20, 0xf, 0xe2, 0x5c, + 0x30, 0xf, 0xfe, 0x12, 0xa0, 0x7, 0xe9, 0x80, + 0xf, 0xfe, 0x2d, 0xc0, 0x80, 0x64, 0xd4, 0x20, + 0xf, 0xef, 0x0, 0xfc, 0xfd, 0xcc, 0xdf, 0xb2, + 0x5, 0x0, 0xfe, 0x50, 0xf, 0xf0, 0x99, 0x0, + 0x6a, 0x50, 0xf, 0xd, 0x90, 0x7, 0xff, 0x1a, + 0xb6, 0x15, 0x4d, 0x5c, 0x80, 0x1f, 0xfc, 0x60, + + /* U+F008 "" */ + 0x9b, 0x0, 0xb3, 0xff, 0xff, 0x89, 0x60, 0x15, + 0xcb, 0x2a, 0x24, 0x40, 0x1f, 0xfc, 0x45, 0x44, + 0x95, 0x80, 0x6e, 0xe1, 0x0, 0x2a, 0xff, 0xf0, + 0x0, 0x3, 0x77, 0x8, 0x4, 0xef, 0x0, 0xa, + 0xab, 0xff, 0x80, 0x20, 0x7, 0x78, 0x2, 0x38, + 0x88, 0xc0, 0x3f, 0xf8, 0x89, 0x11, 0x18, 0x7, + 0xff, 0x48, 0x40, 0x21, 0x0, 0xff, 0xe2, 0x30, + 0x4, 0x20, 0x2, 0xff, 0x88, 0x3, 0xff, 0x88, + 0x5f, 0xf1, 0x0, 0x46, 0x70, 0x0, 0xc0, 0x3f, + 0xf8, 0x66, 0x70, 0x4, 0x79, 0x91, 0x80, 0xee, + 0xff, 0xf0, 0x4, 0xf, 0x32, 0x30, 0xf, 0xe2, + 0x2f, 0xfe, 0x0, 0x1, 0xc0, 0x3f, 0xf8, 0x24, + 0x5f, 0xfc, 0x0, 0x3, 0x80, 0x78, 0xf3, 0x23, + 0x1, 0xdd, 0xff, 0xe0, 0x8, 0x1e, 0x64, 0x60, + 0x11, 0x9c, 0x0, 0x30, 0xf, 0xfe, 0x19, 0x9c, + 0x1, 0x17, 0xfc, 0x40, 0x1f, 0xfc, 0x42, 0xff, + 0x88, 0x0, 0x20, 0x10, 0x80, 0x7f, 0xf1, 0x18, + 0x2, 0x10, 0xf, 0xfe, 0x91, 0xc4, 0x46, 0x1, + 0xff, 0xc4, 0x48, 0x88, 0xc0, 0x27, 0x78, 0x0, + 0x55, 0x5f, 0xfc, 0x1, 0x0, 0x3b, 0xc0, 0x10, + 0xdd, 0xc2, 0x0, 0x55, 0xff, 0xe0, 0x0, 0x6, + 0xee, 0x10, 0x55, 0x22, 0x44, 0x1, 0xff, 0xc4, + 0x54, 0x49, 0x58, + + /* U+F00B "" */ + 0x9f, 0xff, 0x58, 0x2, 0xbf, 0xff, 0xf8, 0x92, + 0xc0, 0x1e, 0x42, 0x15, 0x0, 0xff, 0xe2, 0x30, + 0x7, 0xff, 0xfc, 0x3, 0xff, 0xb2, 0xa0, 0x1e, + 0x32, 0x13, 0x0, 0xff, 0xe2, 0x2d, 0x7f, 0xfb, + 0x0, 0x19, 0xff, 0xff, 0xc4, 0xa0, 0xf, 0xfe, + 0x84, 0xff, 0xfa, 0xc0, 0x17, 0xff, 0xff, 0xc4, + 0x96, 0x0, 0xf2, 0x10, 0xa0, 0x7, 0xff, 0x11, + 0x80, 0x3f, 0xff, 0xe0, 0x1f, 0xfd, 0x95, 0x0, + 0xf1, 0x90, 0xa0, 0x7, 0xff, 0x11, 0xab, 0xff, + 0xd8, 0x0, 0xbf, 0xff, 0xfe, 0x24, 0x80, 0x7f, + 0xf4, 0x2b, 0xff, 0xd8, 0x0, 0xcf, 0xff, 0xfe, + 0x25, 0x28, 0x7, 0x8c, 0x84, 0xc0, 0x3f, 0xf8, + 0x8a, 0x1, 0xff, 0xff, 0x0, 0xff, 0xec, 0xb0, + 0x7, 0x90, 0x85, 0x40, 0x3f, 0xf8, 0x8c, + + /* U+F00C "" */ + 0x0, 0xff, 0xe5, 0xaf, 0x48, 0x7, 0xff, 0x31, + 0xa8, 0x5a, 0x80, 0x3f, 0xf9, 0x4d, 0x20, 0x12, + 0xc8, 0x7, 0xff, 0x21, 0xa4, 0x3, 0x98, 0x3, + 0xff, 0x8e, 0xd2, 0x1, 0xe7, 0x0, 0xff, 0xe3, + 0x34, 0x80, 0x79, 0xe0, 0x3, 0xff, 0x8a, 0xd2, + 0x1, 0xe7, 0x80, 0xa, 0x39, 0x40, 0x3f, 0xe6, + 0x90, 0xf, 0x3c, 0x0, 0x54, 0xe3, 0x4c, 0x1, + 0xfc, 0xd2, 0x1, 0xe7, 0x80, 0xa, 0x54, 0x2, + 0x96, 0x0, 0xf9, 0xa4, 0x3, 0xcf, 0x0, 0x19, + 0x80, 0x3a, 0x58, 0x3, 0x9a, 0x40, 0x3c, 0xf0, + 0x1, 0xce, 0x1, 0xe9, 0x60, 0x9, 0xa4, 0x3, + 0xcf, 0x0, 0x1e, 0x87, 0x0, 0xf4, 0xb0, 0x34, + 0x80, 0x79, 0xe0, 0x3, 0xf4, 0x38, 0x7, 0xa6, + 0xa4, 0x3, 0xcf, 0x0, 0x1f, 0xe8, 0x70, 0xf, + 0x28, 0x7, 0x9e, 0x0, 0x3f, 0xf8, 0x10, 0xe0, + 0x1f, 0xf3, 0xc0, 0x7, 0xff, 0xa, 0x1c, 0x3, + 0xf9, 0xe0, 0x3, 0xff, 0x89, 0xe, 0x1, 0xf4, + 0x40, 0x3, 0xff, 0x8d, 0x10, 0x0, 0xe8, 0x70, + 0xf, 0xfe, 0x43, 0xc0, 0x5, 0xe, 0x1, 0xff, + 0xca, 0x78, 0x18, 0x70, 0xf, 0xfe, 0x18, + + /* U+F00D "" */ + 0x0, 0xff, 0xe2, 0x8, 0x6, 0x6f, 0xf2, 0x80, + 0x7f, 0x16, 0xf5, 0x0, 0x1a, 0x40, 0x14, 0xa0, + 0x1f, 0x16, 0x10, 0x2d, 0x4, 0x0, 0x6a, 0x50, + 0xe, 0x2c, 0x10, 0x9, 0x48, 0x80, 0x1d, 0x4a, + 0x1, 0x16, 0x8, 0x7, 0x1f, 0x8, 0x7, 0x52, + 0x81, 0x60, 0x80, 0x75, 0x9, 0x60, 0x80, 0x75, + 0x3e, 0x8, 0x7, 0x52, 0x80, 0xb, 0x4, 0x3, + 0xa0, 0x40, 0x3a, 0x94, 0x3, 0x16, 0x8, 0x7, + 0xfa, 0x94, 0x3, 0xc5, 0x82, 0x1, 0xfa, 0x94, + 0x3, 0xf1, 0x50, 0x7, 0xce, 0xa0, 0x1f, 0xc5, + 0x40, 0x1f, 0x3a, 0x80, 0x7e, 0x2c, 0x10, 0xf, + 0xd4, 0xa0, 0x1e, 0x2c, 0x10, 0xf, 0xf5, 0x28, + 0x6, 0x2c, 0x10, 0xe, 0x91, 0x0, 0xea, 0x50, + 0x1, 0x60, 0x80, 0x75, 0xb6, 0x8, 0x7, 0x52, + 0x87, 0x8, 0x7, 0x5a, 0x1, 0x60, 0x80, 0x75, + 0x9, 0x0, 0x75, 0xa0, 0x4, 0x58, 0x20, 0x1c, + 0x70, 0x1, 0xad, 0x0, 0x38, 0xb0, 0x40, 0x25, + 0x26, 0x90, 0x5, 0xa0, 0x7, 0xc5, 0x84, 0xb, + 0x40, 0x6, 0xff, 0x20, 0x7, 0xf1, 0x6f, 0x50, + 0x0, + + /* U+F011 "" */ + 0x0, 0xff, 0xe0, 0x34, 0xc9, 0x80, 0x3f, 0xf9, + 0x65, 0x2c, 0xc9, 0x20, 0xf, 0xfe, 0x50, 0x80, + 0x61, 0x0, 0xff, 0xe2, 0xd, 0x40, 0x7, 0xff, + 0x2, 0x28, 0x40, 0x3f, 0x8f, 0xd5, 0xd8, 0x3, + 0xfc, 0xce, 0xbe, 0x60, 0x1f, 0x16, 0x88, 0x2, + 0x0, 0x3f, 0xd0, 0x0, 0x1c, 0x30, 0xf, 0x78, + 0x80, 0x7f, 0xf1, 0xf8, 0x40, 0x34, 0x90, 0x4, + 0x3a, 0x1, 0xfe, 0xd1, 0x0, 0x8a, 0x0, 0x22, + 0x60, 0x8, 0x70, 0xc0, 0x3f, 0xc7, 0x82, 0x1, + 0x31, 0x0, 0x2c, 0x3, 0x59, 0x0, 0x7f, 0xf0, + 0xa, 0xc0, 0x35, 0x80, 0x1c, 0x2, 0x35, 0x0, + 0xff, 0xe1, 0x29, 0x80, 0x4e, 0x6, 0x20, 0x14, + 0x80, 0x7f, 0xf1, 0x28, 0x2, 0x13, 0x50, 0xc, + 0xa0, 0x1f, 0xfc, 0x46, 0x0, 0xca, 0x20, 0x10, + 0x80, 0x7f, 0xf1, 0x84, 0x2, 0xef, 0x0, 0x8c, + 0x3, 0xc2, 0x1, 0x84, 0x3, 0xc6, 0x1, 0xf8, + 0xc0, 0x3c, 0x42, 0x0, 0x12, 0x0, 0xf1, 0x80, + 0x5f, 0xc0, 0x10, 0x80, 0x7d, 0xdb, 0xae, 0x0, + 0xf8, 0x40, 0x21, 0x50, 0xc, 0xa0, 0x1f, 0x11, + 0x0, 0x3e, 0x50, 0xc, 0xa6, 0x20, 0x17, 0x0, + 0x7f, 0xf1, 0x38, 0x2, 0x13, 0x7, 0x0, 0x91, + 0x0, 0x1f, 0xfc, 0x24, 0x40, 0x4, 0xe0, 0xb, + 0x0, 0xd4, 0x40, 0x1f, 0xfc, 0x2, 0xa0, 0xd, + 0x60, 0x2, 0x60, 0x8, 0x70, 0xc0, 0x3f, 0xc7, + 0x82, 0x1, 0x31, 0x0, 0x50, 0x20, 0x10, 0xe4, + 0x0, 0x7e, 0x8c, 0x10, 0x8, 0xa0, 0x3, 0xe, + 0x80, 0x73, 0xfd, 0x3a, 0xa9, 0xeb, 0xdc, 0x3, + 0xf, 0x88, 0x7, 0x1e, 0x8, 0x7, 0x2c, 0x55, + 0x21, 0x40, 0x38, 0x74, 0x80, 0x3e, 0x3c, 0x30, + 0xf, 0xfe, 0x11, 0xf9, 0x80, 0x7f, 0x16, 0x48, + 0x80, 0x7f, 0x86, 0x70, 0x40, 0x3f, 0xf8, 0xd, + 0xd6, 0xc4, 0x1, 0x9, 0x35, 0xf3, 0x0, 0x7f, + 0xf1, 0x12, 0x77, 0xfe, 0xed, 0x94, 0x0, 0xfe, + + /* U+F013 "" */ + 0x0, 0xff, 0xec, 0x16, 0x7f, 0xed, 0x60, 0xf, + 0xfe, 0x3b, 0x98, 0x6, 0x2c, 0x0, 0xff, 0xf1, + 0x68, 0x7, 0x98, 0x40, 0x3f, 0xe1, 0xc8, 0x0, + 0x2e, 0xb8, 0x7, 0x8f, 0xa0, 0x0, 0xda, 0x80, + 0x1d, 0xa6, 0xfd, 0x54, 0x20, 0xf, 0xe7, 0xcc, + 0x49, 0x51, 0x0, 0x4e, 0x60, 0x1, 0x50, 0xf, + 0xfe, 0x1, 0x98, 0x0, 0x32, 0x0, 0x18, 0x0, + 0xff, 0xe5, 0x22, 0x1, 0x80, 0x3f, 0xf9, 0x9e, + 0x16, 0x1, 0xfc, 0x31, 0x9b, 0x44, 0x1, 0xfc, + 0x83, 0xe6, 0x1, 0xf0, 0xfb, 0x99, 0x2e, 0xa0, + 0x7, 0xc3, 0x22, 0x79, 0x0, 0x1e, 0xa1, 0x0, + 0xeb, 0x10, 0xe, 0x4f, 0x60, 0x8, 0xc0, 0x38, + 0x50, 0x3, 0xe7, 0x0, 0xe2, 0x10, 0xc, 0x20, + 0x1c, 0x40, 0x1f, 0x84, 0x3, 0x8c, 0x3, 0x84, + 0x3, 0x88, 0x3, 0xf0, 0x80, 0x71, 0x0, 0x71, + 0x80, 0x70, 0xa0, 0x7, 0xce, 0x1, 0xc6, 0x20, + 0x3, 0xc8, 0x0, 0xf5, 0x8, 0x7, 0x58, 0x80, + 0x72, 0x7b, 0x7, 0x98, 0x7, 0xc3, 0xee, 0x64, + 0xba, 0x80, 0x1f, 0xc, 0x8d, 0x80, 0x7f, 0xc, + 0x66, 0xd1, 0x0, 0x7f, 0x20, 0xb0, 0x80, 0x7f, + 0xf2, 0xfc, 0x6, 0x40, 0x3f, 0xf9, 0x48, 0x80, + 0x3, 0x98, 0x0, 0x54, 0x3, 0xff, 0x80, 0x66, + 0x0, 0xd, 0x0, 0x6d, 0x37, 0xea, 0xa1, 0x0, + 0x7f, 0x3e, 0x62, 0x8a, 0x84, 0x3, 0xe, 0x40, + 0x1, 0x75, 0xc0, 0x3c, 0x7f, 0x0, 0x5, 0xd4, + 0x0, 0xff, 0xe0, 0x68, 0x7, 0x98, 0x3, 0xff, + 0xc4, 0xe6, 0x1, 0x8b, 0x0, 0x3f, 0xf8, 0xe5, + 0x9f, 0xfb, 0x58, 0x3, 0xfc, + + /* U+F015 "" */ + 0x0, 0xff, 0xe1, 0x1b, 0xb0, 0x7, 0x24, 0x44, + 0x80, 0x1f, 0xfc, 0x67, 0xc8, 0x9d, 0x10, 0xb, + 0x9d, 0xee, 0x0, 0xff, 0xe2, 0xd4, 0x0, 0x45, + 0xe6, 0x0, 0x10, 0x8, 0x40, 0x3f, 0xf8, 0x63, + 0x8a, 0x1, 0xc3, 0x8c, 0x1, 0xff, 0xc8, 0x3f, + 0x30, 0x9, 0xcc, 0x2, 0x99, 0x0, 0x7f, 0xf1, + 0x9b, 0x4, 0x0, 0x39, 0x18, 0xa0, 0x13, 0x20, + 0x7, 0xff, 0x12, 0x24, 0x2, 0x2c, 0x33, 0xd, + 0x40, 0x7, 0xff, 0x18, 0x6d, 0xc0, 0x25, 0xd2, + 0x8c, 0xc1, 0x3d, 0x80, 0x7f, 0xf1, 0xb, 0x10, + 0x2, 0x7a, 0xb, 0x70, 0x2d, 0x44, 0x69, 0x0, + 0x7f, 0xf0, 0x53, 0x48, 0x2, 0xa8, 0x2d, 0x40, + 0xd, 0x6e, 0x58, 0x80, 0x12, 0x50, 0x7, 0x9e, + 0xc0, 0x21, 0xc5, 0x3c, 0x20, 0xf, 0x45, 0xd, + 0xb0, 0x4, 0xb8, 0x20, 0x15, 0x40, 0x4, 0x7e, + 0x6d, 0x82, 0x1, 0xf9, 0x70, 0x66, 0x40, 0x11, + 0xf9, 0x85, 0xa8, 0x4, 0xb8, 0x33, 0x20, 0xf, + 0xf8, 0xfc, 0xda, 0xc4, 0x0, 0x38, 0x80, 0x1a, + 0x28, 0x6d, 0x80, 0x3f, 0xf8, 0x23, 0x8a, 0x98, + 0x40, 0x13, 0xd9, 0x5, 0xb9, 0x62, 0x0, 0x7f, + 0xf1, 0x2a, 0xb, 0x50, 0x24, 0xc3, 0x35, 0x2, + 0x48, 0x3, 0xff, 0x8c, 0xe6, 0x17, 0x8c, 0x0, + 0x12, 0x0, 0x38, 0x7, 0xff, 0x21, 0xc0, 0x6, + 0x1, 0xff, 0xe3, 0xbf, 0xfc, 0x60, 0x1f, 0xfc, + 0xe6, 0x0, 0xcc, 0x1, 0xff, 0xff, 0x0, 0xff, + 0xfd, 0xa0, 0x7, 0x88, 0x80, 0x1b, 0x0, 0x3c, + 0x2a, 0x1, 0xc0, + + /* U+F019 "" */ + 0x0, 0xff, 0x8d, 0x57, 0x18, 0x7, 0xff, 0x25, + 0x72, 0xab, 0x62, 0x80, 0x7f, 0xf2, 0x34, 0x3, + 0xda, 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, + 0x7f, 0xff, 0xc0, 0x3f, 0xf8, 0x23, 0x9b, 0xb9, + 0x80, 0x3c, 0xdb, 0xbb, 0x4, 0x3, 0xf2, 0x99, + 0x16, 0x10, 0xf, 0x9, 0x16, 0x35, 0x0, 0xfc, + 0x8c, 0x1, 0xff, 0xc4, 0x64, 0x0, 0xfe, 0x96, + 0x0, 0xff, 0xe1, 0x34, 0x80, 0x7f, 0xd2, 0xc0, + 0x1f, 0xfc, 0x6, 0x90, 0xf, 0xfe, 0xc, 0xb8, + 0x7, 0xf9, 0xe4, 0x3, 0xff, 0x87, 0xe, 0x1, + 0xf9, 0xe0, 0x3, 0xff, 0x8b, 0xe, 0x1, 0xe7, + 0x80, 0xf, 0xf0, 0x8f, 0xe0, 0x87, 0x0, 0xcf, + 0x0, 0x23, 0xf8, 0x2f, 0xbb, 0xf6, 0x8c, 0x38, + 0x1, 0xe0, 0x77, 0xbb, 0xf5, 0xa0, 0x7, 0xe2, + 0xf2, 0x89, 0x94, 0x16, 0x10, 0x7, 0xe4, 0x0, + 0xff, 0xe, 0x1b, 0x30, 0xf0, 0x80, 0x3f, 0xf9, + 0x23, 0x9b, 0xac, 0x10, 0xf, 0xfe, 0x61, 0x10, + 0x3, 0xff, 0xa9, 0x7c, 0x29, 0xee, 0x1, 0xff, + 0xca, 0x13, 0x7, 0x10, 0xc, 0x20, 0x1f, 0xfc, + 0x6a, 0xd1, 0x3e, 0x70, 0x0, 0xec, 0x3b, 0xff, + 0xf3, 0x23, 0x40, + + /* U+F01C "" */ + 0x0, 0xf1, 0x5f, 0xff, 0xff, 0xf, 0xa0, 0x3, + 0xff, 0x80, 0x38, 0x80, 0x1f, 0xfc, 0x31, 0x78, + 0x0, 0xff, 0xac, 0x40, 0x3f, 0xf8, 0xce, 0x60, + 0x1f, 0xca, 0xa0, 0x1, 0x3b, 0xff, 0xf0, 0x58, + 0x2, 0xe0, 0xf, 0xc3, 0x60, 0x17, 0x44, 0x7f, + 0xf0, 0x65, 0x0, 0x5, 0x0, 0x1f, 0x58, 0x80, + 0x1c, 0xc0, 0x3f, 0xf8, 0x54, 0x20, 0x7, 0x30, + 0xe, 0x55, 0x0, 0xa, 0x0, 0x3f, 0xf8, 0x63, + 0x60, 0x17, 0x0, 0x61, 0xb0, 0xb, 0x80, 0x3f, + 0xf8, 0xaa, 0x80, 0x2, 0x80, 0xa, 0xc4, 0x0, + 0xe6, 0x1, 0xff, 0xc6, 0xa1, 0x0, 0x39, 0x2, + 0xa8, 0x0, 0x50, 0x1, 0xff, 0xc7, 0x1b, 0x0, + 0xbc, 0x20, 0x2, 0x68, 0x8e, 0x70, 0xf, 0xe4, + 0x88, 0xed, 0x10, 0x1, 0x29, 0x0, 0x48, 0xef, + 0xd0, 0xe0, 0x1f, 0xa9, 0xdf, 0xc2, 0x1, 0x10, + 0x7, 0xfd, 0x20, 0x1f, 0x38, 0x80, 0x7f, 0xbc, + 0x3, 0xfe, 0x17, 0x0, 0xf4, 0x80, 0x7f, 0xf3, + 0x23, 0xff, 0xc2, 0x1, 0xff, 0xff, 0x0, 0xff, + 0xfa, 0x7a, 0x0, 0x7f, 0xf4, 0x92, 0x90, 0x3, + 0xff, 0x9e, 0x34, 0x60, + + /* U+F021 "" */ + 0x0, 0xff, 0xe6, 0x2c, 0x41, 0x80, 0x3f, 0x92, + 0x77, 0xbf, 0xdd, 0x6e, 0x40, 0x1d, 0xe, 0xe9, + 0x0, 0xf9, 0xb6, 0xd8, 0x84, 0x0, 0x29, 0x1b, + 0x66, 0x1, 0xff, 0xc0, 0x1b, 0x92, 0x0, 0xff, + 0x26, 0x50, 0x80, 0x80, 0x7c, 0x5e, 0x80, 0x1e, + 0x11, 0x0, 0x79, 0x7c, 0xdc, 0x3, 0xc5, 0x82, + 0x1, 0x9a, 0xff, 0xb9, 0xf6, 0x80, 0x18, 0x75, + 0x80, 0x3d, 0xe2, 0x1, 0x1e, 0xca, 0x0, 0x64, + 0xbc, 0x30, 0x8, 0x48, 0x3, 0xa4, 0x80, 0x26, + 0xc2, 0x0, 0xfc, 0x78, 0xe0, 0x1f, 0x89, 0x80, + 0x26, 0x90, 0xf, 0xc2, 0x20, 0x4, 0x38, 0x7, + 0xd6, 0x1, 0x14, 0x80, 0x7e, 0x3e, 0xe7, 0xfb, + 0x98, 0x3, 0xe7, 0x0, 0xa4, 0x3, 0xf9, 0xc0, + 0x30, 0x88, 0x3, 0xc6, 0x20, 0x1, 0x40, 0xf, + 0xfe, 0x50, 0xa1, 0x9a, 0x0, 0x3f, 0xca, 0x86, + 0x7f, 0xe5, 0x2b, 0xcc, 0x30, 0x7, 0xf8, 0x6f, + 0x33, 0xfd, 0x40, 0x1f, 0xfe, 0xca, 0xcc, 0xff, + 0x58, 0x80, 0x7f, 0x9a, 0xf2, 0xc9, 0x4c, 0xff, + 0xc8, 0xa0, 0x1f, 0xe8, 0x43, 0x40, 0xf, 0xfe, + 0x5a, 0x88, 0x0, 0x48, 0x3, 0xc2, 0x20, 0xc, + 0xe0, 0x1f, 0xd0, 0x1, 0x38, 0x7, 0xcd, 0xdf, + 0xee, 0xe1, 0x80, 0x7e, 0xa2, 0x0, 0xac, 0x3, + 0xe7, 0x80, 0x0, 0x88, 0x3, 0xf4, 0xa8, 0x4, + 0xc4, 0x1, 0xf9, 0xec, 0x80, 0x3f, 0x16, 0x30, + 0x4, 0x52, 0x1, 0xc4, 0x20, 0x12, 0x6d, 0x20, + 0x6, 0x4a, 0xd3, 0x0, 0x87, 0xc0, 0x3c, 0xda, + 0x20, 0x19, 0x6f, 0xfb, 0x9f, 0x6a, 0x1, 0x87, + 0x8, 0x3, 0xce, 0x7e, 0xa0, 0x1e, 0x11, 0x0, + 0x79, 0x3c, 0x80, 0x3e, 0x10, 0x1a, 0xc4, 0x0, + 0xff, 0x14, 0xd8, 0x80, 0x7f, 0xf0, 0xe, 0xf6, + 0xc, 0x3, 0x13, 0x5e, 0xb0, 0x7, 0xd2, 0xee, + 0x80, 0xe, 0x27, 0xcf, 0xfd, 0xb2, 0x80, 0x1f, + 0xc0, + + /* U+F026 "" */ + 0x0, 0xff, 0xe6, 0x9d, 0xb0, 0x7, 0xf8, 0xf1, + 0x24, 0x3, 0xf8, 0xf0, 0x3, 0xfe, 0x3c, 0x0, + 0xff, 0x8f, 0x0, 0x38, 0xe2, 0x3d, 0x80, 0x1e, + 0xd7, 0x7f, 0x0, 0x7c, 0x20, 0x1f, 0xff, 0xf0, + 0xf, 0xfe, 0xc3, 0x0, 0x7f, 0xf0, 0x67, 0xff, + 0xce, 0x1, 0xff, 0xc1, 0x87, 0x0, 0xff, 0xe0, + 0xc3, 0x80, 0x7f, 0xf0, 0x61, 0xc0, 0x3f, 0xf8, + 0x30, 0xe0, 0x60, 0x1f, 0xf4, 0x76, 0x0, + + /* U+F027 "" */ + 0x0, 0xff, 0xea, 0x1d, 0xb0, 0x7, 0xff, 0x14, + 0xf5, 0x24, 0x3, 0xff, 0x88, 0x78, 0x20, 0x1f, + 0xfc, 0x53, 0xc0, 0xf, 0xfe, 0x31, 0xe0, 0x7, + 0xff, 0x0, 0xe2, 0x3d, 0x80, 0x1f, 0xfc, 0x1d, + 0x77, 0xf0, 0x7, 0xf0, 0xdc, 0x80, 0x4, 0x3, + 0xff, 0x86, 0xe8, 0xd8, 0x1, 0xff, 0xc5, 0x73, + 0x3, 0x70, 0xf, 0xfe, 0x20, 0xe0, 0x85, 0x0, + 0x7f, 0xf1, 0x90, 0x8, 0x3, 0xff, 0x8c, 0xe0, + 0x40, 0x1f, 0xfc, 0x5b, 0x20, 0x50, 0xf, 0xfe, + 0x23, 0x20, 0x14, 0x0, 0x7f, 0xf1, 0x10, 0x93, + 0x1, 0x80, 0x3f, 0xf8, 0x65, 0xb6, 0x21, 0x3f, + 0xfe, 0x70, 0xf, 0xfe, 0x44, 0x38, 0x7, 0xff, + 0x22, 0x1c, 0x3, 0xff, 0x91, 0xe, 0x1, 0xff, + 0xc8, 0x87, 0x3, 0x0, 0xff, 0xe3, 0x46, 0xe0, + 0x7, 0xc0, + + /* U+F028 "" */ + 0x0, 0xff, 0xe5, 0xc, 0x28, 0x7, 0xff, 0x45, + 0x9e, 0xa8, 0x1, 0xff, 0xd0, 0x40, 0x2, 0xe0, + 0x80, 0x7f, 0xf0, 0xce, 0xd8, 0x3, 0xf1, 0xe9, + 0x1, 0xe8, 0x7, 0xff, 0x8, 0xf1, 0x24, 0x3, + 0xc4, 0x20, 0x58, 0x60, 0x72, 0x1, 0xff, 0xc0, + 0x3c, 0x0, 0xfc, 0x9b, 0xea, 0x3, 0xa2, 0xc, + 0x60, 0x1f, 0xe3, 0xc0, 0xf, 0xe1, 0x1, 0xa6, + 0x1, 0xa0, 0x7, 0x80, 0x7f, 0x1e, 0x0, 0x7f, + 0x96, 0x0, 0x12, 0x80, 0x8a, 0x6, 0x80, 0x71, + 0x1e, 0xc0, 0xf, 0xfe, 0x3, 0xd0, 0x2, 0x80, + 0x10, 0x0, 0xe0, 0xd7, 0x7f, 0x0, 0x7f, 0xe, + 0x50, 0x82, 0xb8, 0xb, 0x1, 0x18, 0x28, 0x8, + 0x7, 0xff, 0xd, 0xcd, 0x70, 0x1, 0x20, 0xa, + 0x0, 0x20, 0x0, 0x80, 0x3f, 0xf8, 0x8e, 0x60, + 0x50, 0x2, 0xa0, 0x60, 0xc, 0x0, 0x38, 0x7, + 0xff, 0x10, 0x70, 0x81, 0x40, 0x1a, 0x0, 0x20, + 0x70, 0x1, 0x0, 0x7f, 0xf1, 0x9c, 0x8, 0x0, + 0x20, 0x1, 0x1, 0x0, 0xff, 0xe4, 0xb8, 0x10, + 0x0, 0x40, 0x2, 0x2, 0x1, 0xff, 0xc7, 0x1c, + 0x20, 0x50, 0x6, 0x80, 0x8, 0x1c, 0x0, 0x40, + 0x1f, 0xfc, 0x47, 0x30, 0x28, 0x1, 0x50, 0x30, + 0x6, 0x0, 0x1c, 0x3, 0xff, 0x88, 0xe6, 0xb8, + 0x0, 0x80, 0x5, 0x0, 0x14, 0x4, 0x98, 0x3, + 0xff, 0x86, 0x39, 0x42, 0xa, 0xc0, 0x2c, 0x6, + 0x40, 0x81, 0x3f, 0xfe, 0x70, 0xf, 0xfe, 0x3, + 0xd0, 0x2, 0x80, 0x12, 0x0, 0xe0, 0xf, 0xd0, + 0xe0, 0x1f, 0xe5, 0x80, 0x4, 0xa0, 0x22, 0x81, + 0xa0, 0x7, 0xf4, 0x38, 0x7, 0xf0, 0x80, 0xd3, + 0x0, 0xd0, 0x3, 0xc0, 0x3f, 0xe8, 0x70, 0xf, + 0xc9, 0xbe, 0xa0, 0x38, 0x20, 0xc6, 0x1, 0xff, + 0xc0, 0x87, 0x3, 0x0, 0xf1, 0x8, 0x16, 0x10, + 0x1c, 0x80, 0x7f, 0xf0, 0xa3, 0xb0, 0x3, 0xf1, + 0xe9, 0x1, 0xe8, 0x7, 0xff, 0x10, 0x40, 0x3f, + 0x90, 0x0, 0xb8, 0x20, 0x1f, 0xfc, 0xe6, 0x7a, + 0xa0, 0x7, 0x80, + + /* U+F03E "" */ + 0x1b, 0xff, 0xff, 0xe6, 0x58, 0xd2, 0x0, 0x7f, + 0xf3, 0x12, 0x90, 0x3, 0xff, 0x9c, 0x80, 0x19, + 0xb3, 0x60, 0x3, 0xff, 0x96, 0xd2, 0x64, 0xf4, + 0x1, 0xff, 0xca, 0xb0, 0xc, 0xa2, 0x1, 0xff, + 0xd8, 0x27, 0x0, 0xff, 0x94, 0x3, 0x18, 0x80, + 0x7c, 0x79, 0x12, 0x1, 0xfe, 0x85, 0x0, 0x1f, + 0x0, 0x7c, 0x7a, 0x20, 0xd2, 0x1, 0xfe, 0xae, + 0xe6, 0x10, 0x7, 0x8f, 0x44, 0x2, 0x69, 0x0, + 0xff, 0x8, 0xc0, 0x1e, 0x3d, 0x10, 0xe, 0x69, + 0x0, 0xff, 0x1f, 0xe0, 0x80, 0x47, 0xa2, 0x1, + 0xf3, 0x30, 0x3, 0xf1, 0xe8, 0x9e, 0x88, 0x1e, + 0x88, 0x7, 0xf0, 0x80, 0x7c, 0x7a, 0x20, 0x3, + 0xd4, 0xd1, 0x0, 0xff, 0xe2, 0x96, 0x88, 0x6, + 0x3b, 0x10, 0xf, 0xfe, 0x32, 0x88, 0x7, 0xff, + 0xa9, 0x22, 0x3f, 0xf9, 0x8, 0x1, 0xe3, 0x77, + 0xff, 0xe4, 0x18, 0x4, 0x80, 0x1f, 0xfc, 0xe4, + 0xa4, 0x0, 0xff, 0xe6, 0x25, 0x0, + + /* U+F043 "" */ + 0x0, 0xfc, 0x72, 0xa0, 0x1f, 0xfc, 0x5d, 0x6a, + 0x20, 0xf, 0xfe, 0x1a, 0x8, 0x2, 0x80, 0x3f, + 0xf8, 0x7c, 0x1, 0x30, 0x7, 0xff, 0x8, 0x54, + 0x2, 0x14, 0x0, 0xff, 0xe0, 0xc8, 0x7, 0x40, + 0x7, 0xff, 0x0, 0x5c, 0x3, 0x8d, 0x0, 0x3f, + 0xe9, 0x0, 0xfa, 0x0, 0x3f, 0xc4, 0xe0, 0x1f, + 0x1b, 0x0, 0x7f, 0x70, 0x7, 0xf4, 0x88, 0x7, + 0xce, 0x60, 0x1f, 0xea, 0x0, 0xf1, 0xc0, 0x7, + 0xfc, 0x8e, 0x1, 0xdc, 0x1, 0xff, 0xc1, 0x83, + 0x0, 0x9c, 0x80, 0x3f, 0xf8, 0x50, 0x1, 0x48, + 0x7, 0xff, 0xd, 0xc, 0x18, 0x40, 0x3f, 0xf8, + 0x94, 0x1a, 0x1, 0xff, 0xc5, 0x70, 0x60, 0xf, + 0xfe, 0x28, 0x88, 0x80, 0xb, 0xe4, 0x1, 0xff, + 0xc1, 0x21, 0x0, 0x10, 0x38, 0x7, 0xff, 0x4, + 0x4c, 0x0, 0x81, 0x80, 0x1f, 0xfc, 0x13, 0x40, + 0x1, 0x93, 0x18, 0x7, 0xfc, 0x43, 0xa0, 0x14, + 0x86, 0x30, 0x7, 0xfa, 0x81, 0xc, 0x0, 0x94, + 0x13, 0xfa, 0x60, 0x1e, 0x16, 0x0, 0x70, 0x4, + 0xba, 0xc2, 0x4e, 0x1, 0xeb, 0x10, 0x1, 0x50, + 0x4, 0x53, 0xde, 0x80, 0x1c, 0xea, 0x1, 0x96, + 0xc4, 0x3, 0xfd, 0x30, 0x1, 0xe4, 0xf7, 0x0, + 0xf9, 0x75, 0x80, 0x3f, 0xc, 0x7d, 0xcc, 0x4d, + 0xfd, 0x10, 0x7, 0x0, + + /* U+F048 "" */ + 0x48, 0x88, 0x3, 0xfe, 0x77, 0x7, 0xbb, 0xc6, + 0x1, 0xfd, 0x71, 0x9, 0x0, 0xff, 0xe0, 0xe, + 0x20, 0x1, 0x40, 0x3f, 0xe1, 0xc3, 0x0, 0xff, + 0xe1, 0x17, 0x90, 0x7, 0xff, 0x8, 0xf0, 0x40, + 0x3f, 0xf8, 0x49, 0x82, 0x1, 0xff, 0xc2, 0x5b, + 0x0, 0xff, 0xe1, 0xb5, 0x0, 0x7f, 0xf0, 0xde, + 0x40, 0x3f, 0xf8, 0x71, 0x0, 0xf, 0xfe, 0x22, + 0x0, 0x7f, 0xfe, 0xe8, 0x80, 0x3f, 0xf8, 0x8d, + 0x86, 0x1, 0xff, 0xc4, 0x1c, 0x40, 0xf, 0xfe, + 0x2d, 0xa8, 0x7, 0xff, 0x16, 0x98, 0x3, 0xff, + 0x8b, 0x2e, 0x1, 0xff, 0xc5, 0x89, 0x0, 0xff, + 0xe2, 0xb5, 0x0, 0x7f, 0xf1, 0x56, 0xc0, 0x27, + 0x20, 0x0, 0x88, 0x3, 0xf2, 0x61, 0x12, 0x27, + 0xfd, 0xc4, 0x1, 0xfc, 0x7b, 0xa3, + + /* U+F04B "" */ + 0x3, 0x75, 0x0, 0xff, 0xe4, 0xbe, 0x45, 0x61, + 0x80, 0x7f, 0xf1, 0xe4, 0x2, 0x3c, 0x91, 0x0, + 0xff, 0xe2, 0x88, 0x7, 0x37, 0xb0, 0x7, 0xff, + 0x2c, 0x67, 0x4c, 0x3, 0xff, 0x96, 0x59, 0x42, + 0x1, 0xff, 0xcb, 0x5e, 0x70, 0xf, 0xfe, 0x64, + 0x6a, 0x0, 0x7f, 0xf2, 0xca, 0xec, 0x40, 0x1f, + 0xfc, 0xb4, 0xd8, 0x0, 0xff, 0xe6, 0x3f, 0x28, + 0x7, 0xff, 0x2c, 0x6a, 0xc8, 0x3, 0xff, 0x96, + 0x9a, 0xe0, 0x1f, 0xfc, 0xc8, 0x40, 0xf, 0xfe, + 0x61, 0x80, 0x7f, 0xf3, 0xc, 0x3, 0xff, 0x97, + 0x8, 0x1, 0xff, 0xc9, 0x4d, 0x70, 0xf, 0xfe, + 0x40, 0xd5, 0x90, 0x7, 0xff, 0x21, 0xf9, 0x40, + 0x3f, 0xf9, 0x9, 0xb0, 0x1, 0xff, 0xc8, 0x2b, + 0xb1, 0x0, 0x7f, 0xf2, 0x23, 0x50, 0x3, 0xff, + 0x90, 0xbc, 0xe0, 0x1f, 0xfc, 0x82, 0xca, 0x10, + 0xf, 0xfe, 0x38, 0xce, 0x98, 0x7, 0xff, 0x8, + 0x40, 0x39, 0xbd, 0x80, 0x3f, 0xf8, 0x90, 0x1, + 0x1e, 0x48, 0x80, 0x7f, 0xf1, 0x5b, 0x22, 0xf0, + 0xc0, 0x3f, 0xf8, 0xe0, + + /* U+F04C "" */ + 0x1a, 0xef, 0xfe, 0xd5, 0x0, 0xc3, 0x5d, 0xff, + 0xda, 0xa1, 0x6a, 0x20, 0x1c, 0x54, 0x40, 0x15, + 0xa8, 0x80, 0x71, 0x51, 0x28, 0x7, 0xf2, 0x80, + 0x4a, 0x1, 0xfc, 0xa0, 0x1f, 0xef, 0x0, 0xff, + 0xe0, 0xf8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xfe, + 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, 0x7f, + 0xff, 0xc0, 0x3f, 0xfe, 0x1e, 0x1, 0xff, 0xc1, + 0xf1, 0x0, 0xfe, 0x10, 0x8, 0x40, 0x3f, 0x86, + 0x0, 0x3f, 0x13, 0x0, 0x50, 0x1, 0xf8, 0x99, + 0x96, 0xec, 0xd9, 0xe3, 0x0, 0x33, 0x5b, 0xb3, + 0x67, 0x8c, 0x0, + + /* U+F04D "" */ + 0x3, 0x88, 0xff, 0xe4, 0x30, 0x1, 0xb1, 0xdf, + 0xff, 0x91, 0x3a, 0x10, 0x1, 0xff, 0xca, 0x26, + 0x10, 0xf, 0xfe, 0x58, 0x80, 0x7f, 0xf3, 0x3c, + 0x3, 0xff, 0xfe, 0x1, 0xff, 0xff, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, + 0x1f, 0xff, 0xef, 0x50, 0xf, 0xfe, 0x5a, 0xda, + 0x88, 0x7, 0xff, 0x1c, 0xa8, 0x80, + + /* U+F051 "" */ + 0x5, 0x81, 0x0, 0xff, 0x34, 0x41, 0xd6, 0x9f, + 0xc8, 0x3, 0xfa, 0x1d, 0xd0, 0x40, 0x1, 0xc3, + 0x0, 0xfc, 0x20, 0x17, 0x80, 0x43, 0x88, 0x1, + 0xff, 0xc5, 0xb5, 0x0, 0xff, 0xe2, 0xd3, 0x0, + 0x7f, 0xf1, 0x66, 0x0, 0x3f, 0xf8, 0xaf, 0x20, + 0x1f, 0xfc, 0x56, 0xa0, 0xf, 0xfe, 0x2a, 0xd8, + 0x7, 0xff, 0x15, 0x30, 0x3, 0xff, 0x8a, 0x60, + 0x1f, 0xff, 0xa1, 0xc0, 0xf, 0xfe, 0x18, 0xe1, + 0x80, 0x7f, 0xf0, 0x8b, 0x8, 0x3, 0xff, 0x84, + 0x58, 0x40, 0x1f, 0xfc, 0x23, 0xc1, 0x0, 0xff, + 0xe1, 0x26, 0x8, 0x7, 0xff, 0x9, 0x6c, 0x3, + 0xff, 0x86, 0xd4, 0x1, 0xff, 0x78, 0x4, 0xf2, + 0x1, 0xff, 0xc0, 0x63, 0x9, 0x80, 0xf, 0xe3, + 0x0, 0x10, 0xe7, 0xb0, 0x7, 0xfb, 0x3f, 0xda, + + /* U+F052 "" */ + 0x0, 0xff, 0x86, 0x69, 0x40, 0x3f, 0xf9, 0x23, + 0xec, 0xb5, 0x0, 0x1f, 0xfc, 0x71, 0xc1, 0x0, + 0x9d, 0x80, 0x3f, 0xf8, 0xda, 0x40, 0x1d, 0x2a, + 0x1, 0xff, 0xc4, 0xb3, 0x0, 0xfa, 0x90, 0x3, + 0xff, 0x85, 0x48, 0x1, 0xfd, 0x66, 0x1, 0xff, + 0xc0, 0x95, 0x0, 0xff, 0xb4, 0x80, 0x3f, 0xd0, + 0xc0, 0x1f, 0xfc, 0x1, 0xc1, 0x0, 0xfc, 0xce, + 0x1, 0xff, 0xc2, 0x1c, 0x10, 0xf, 0x2c, 0x80, + 0x7f, 0xf1, 0xb, 0x40, 0x39, 0x28, 0x3, 0xff, + 0x8c, 0x76, 0x1, 0x1d, 0x80, 0x7f, 0xf2, 0x12, + 0x80, 0x1e, 0x1, 0xff, 0xca, 0x55, 0x1, 0x80, + 0x7f, 0xf2, 0xc8, 0x14, 0x3, 0xff, 0x96, 0x81, + 0x68, 0x1, 0xff, 0xc8, 0x19, 0x30, 0x1b, 0xff, + 0xff, 0xe4, 0x73, 0x0, 0x7f, 0xf4, 0x1b, 0xff, + 0xff, 0x95, 0xa2, 0x12, 0x1, 0xff, 0xca, 0x26, + 0x0, 0xff, 0xe6, 0xf8, 0x7, 0xff, 0xa4, 0x40, + 0x3f, 0xf9, 0x7c, 0x16, 0x20, 0x1f, 0xfc, 0x94, + 0x60, + + /* U+F053 "" */ + 0x0, 0xff, 0x8e, 0x4c, 0x3, 0xff, 0x80, 0x98, + 0xd8, 0x60, 0x1f, 0xe4, 0xb0, 0xb, 0x40, 0x3f, + 0x92, 0xc0, 0x31, 0x0, 0x7e, 0x4b, 0x0, 0xc5, + 0xa0, 0x1f, 0x25, 0x80, 0x62, 0xc1, 0x0, 0xf2, + 0x58, 0x6, 0x2c, 0x10, 0xf, 0x25, 0x80, 0x62, + 0xc1, 0x0, 0xf2, 0x58, 0x6, 0x2c, 0x10, 0xf, + 0x25, 0x80, 0x62, 0xc1, 0x0, 0xf2, 0x58, 0x6, + 0x2c, 0x10, 0xf, 0x1d, 0x80, 0x62, 0xc1, 0x0, + 0xf9, 0x0, 0x3a, 0x84, 0x3, 0xf3, 0xa0, 0x6, + 0x86, 0x0, 0xfe, 0xb4, 0x0, 0xd2, 0xc0, 0x1f, + 0xd6, 0x80, 0x1a, 0x58, 0x3, 0xfa, 0xd0, 0x3, + 0x4b, 0x0, 0x7f, 0x5a, 0x0, 0x69, 0x60, 0xf, + 0xeb, 0x30, 0xd, 0x2c, 0x1, 0xfd, 0x86, 0x1, + 0xa5, 0x80, 0x3f, 0xb0, 0xc0, 0x34, 0xb0, 0x7, + 0xf6, 0x18, 0x6, 0x90, 0xf, 0xf6, 0x18, 0x4, + 0xa0, 0x1f, 0xf6, 0x20, 0x2d, 0x0, 0x7f, 0xf0, + 0x2f, 0x68, 0x0, + + /* U+F054 "" */ + 0x0, 0x3c, 0x0, 0x7f, 0xf0, 0x6a, 0x1e, 0xc0, + 0x3f, 0xe6, 0x50, 0x2, 0x58, 0x7, 0xf8, 0x80, + 0x32, 0x58, 0x7, 0xf2, 0x40, 0x6, 0x4b, 0x0, + 0xfe, 0x78, 0x0, 0xc9, 0x60, 0x1f, 0xcf, 0x0, + 0x19, 0x2c, 0x3, 0xf9, 0xe0, 0x3, 0x25, 0x80, + 0x7f, 0x3c, 0x0, 0x64, 0xb0, 0xf, 0xe7, 0x80, + 0xc, 0x96, 0x1, 0xfc, 0xf0, 0x1, 0x92, 0xc0, + 0x3f, 0x9e, 0x0, 0x32, 0x50, 0x7, 0xf3, 0x8, + 0x6, 0x50, 0xf, 0xc3, 0xa2, 0x1, 0xa8, 0x3, + 0xe1, 0xd3, 0x0, 0xd4, 0xa0, 0x1e, 0x1d, 0x30, + 0xd, 0x4a, 0x1, 0xe1, 0xd3, 0x0, 0xd4, 0xa0, + 0x1e, 0x1d, 0x30, 0xd, 0x4a, 0x1, 0xe1, 0xd3, + 0x0, 0xd4, 0xa0, 0x1e, 0x1c, 0x30, 0xd, 0x4a, + 0x1, 0xe1, 0xc2, 0x0, 0xd4, 0xa0, 0x1f, 0x31, + 0x0, 0x6a, 0x50, 0xf, 0xca, 0x1, 0xa9, 0x40, + 0x3f, 0x8b, 0x0, 0x14, 0xa0, 0x1f, 0xf1, 0xf7, + 0x14, 0x3, 0xfe, + + /* U+F067 "" */ + 0x0, 0xff, 0x2d, 0x52, 0x4, 0x3, 0xff, 0x8e, + 0x74, 0xaa, 0x7a, 0x0, 0xff, 0xe3, 0xb0, 0x6, + 0x60, 0xf, 0xfe, 0x39, 0x80, 0x63, 0x0, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xcd, 0xff, + 0xfa, 0x40, 0x30, 0xff, 0xfe, 0xc1, 0x90, 0xf, + 0xfe, 0x51, 0xb0, 0x7, 0xff, 0x33, 0xc0, 0x3f, + 0xf9, 0x9e, 0xc0, 0x1f, 0xfc, 0xa1, 0x59, 0xdc, + 0xcf, 0x9c, 0x3, 0xe, 0x67, 0xef, 0x20, 0x23, + 0x3f, 0xb8, 0x3, 0x8c, 0xff, 0x8, 0x7, 0xff, + 0xfc, 0x3, 0xff, 0xfe, 0x1, 0xfe, 0x20, 0xc, + 0x40, 0x1f, 0xfc, 0x74, 0x72, 0x21, 0xf8, 0x7, + 0xf8, + + /* U+F068 "" */ + 0x1, 0x22, 0xff, 0xe4, 0x8, 0x2, 0x3b, 0x77, + 0xff, 0x91, 0xdc, 0x17, 0x0, 0xff, 0xe5, 0xb, + 0x0, 0x7f, 0xf3, 0x3c, 0x3, 0xff, 0x99, 0xf0, + 0x1, 0xff, 0xca, 0x16, 0x7e, 0xdd, 0xff, 0xe4, + 0x77, 0x4, + + /* U+F06E "" */ + 0x0, 0xff, 0x13, 0x56, 0xf7, 0xfb, 0xb2, 0x54, + 0x3, 0xff, 0x8e, 0xb9, 0xb2, 0xa4, 0x20, 0x1, + 0x36, 0xaf, 0xa2, 0x0, 0xff, 0xe1, 0x1e, 0x51, + 0x80, 0x64, 0x54, 0x20, 0xc, 0xbb, 0x22, 0x1, + 0xff, 0x46, 0x18, 0x4, 0x55, 0xf7, 0x57, 0xbc, + 0xe0, 0x19, 0xbd, 0x0, 0x3f, 0xad, 0xc0, 0x32, + 0xea, 0x80, 0x70, 0xc6, 0x8, 0x4, 0x36, 0xc0, + 0x1f, 0x62, 0x0, 0x64, 0xa0, 0x8, 0xe6, 0x4a, + 0x0, 0x3c, 0x10, 0xd, 0x2e, 0x1, 0xd4, 0x60, + 0x18, 0x6c, 0x3, 0x99, 0x95, 0xa4, 0x5, 0x60, + 0x1d, 0xa, 0x1, 0x3a, 0x80, 0x74, 0x80, 0x7f, + 0x16, 0x8, 0x29, 0x0, 0x75, 0x10, 0x14, 0x0, + 0x79, 0x40, 0x3a, 0x40, 0x30, 0xc8, 0x1, 0x40, + 0x3d, 0xc1, 0x20, 0x1f, 0x10, 0x24, 0x35, 0xa8, + 0x7, 0x28, 0x3, 0x40, 0x3c, 0x6a, 0x80, 0x1e, + 0x10, 0x1, 0xbc, 0xa0, 0x7, 0x88, 0x0, 0x20, + 0x1f, 0x62, 0x0, 0x78, 0x40, 0x2, 0x1, 0xfc, + 0x20, 0x1, 0x0, 0xfb, 0x28, 0x3, 0xe2, 0x7, + 0x0, 0xfe, 0x70, 0x6, 0x80, 0x78, 0xd4, 0x64, + 0x3, 0xca, 0x2, 0xe0, 0x1f, 0xac, 0x0, 0xa0, + 0x1e, 0xe0, 0x3, 0x28, 0x7, 0x48, 0x2, 0x14, + 0x3, 0xd6, 0x40, 0xa4, 0x1, 0xd4, 0x40, 0x15, + 0x20, 0x6, 0x1b, 0x0, 0x55, 0xa9, 0x1b, 0xf2, + 0x1, 0x58, 0x7, 0x42, 0x80, 0x75, 0xa0, 0x6, + 0x4a, 0x0, 0x25, 0x6e, 0x40, 0x81, 0xe0, 0x80, + 0x69, 0x70, 0xf, 0xae, 0x0, 0x32, 0xea, 0x80, + 0x70, 0xc6, 0x8, 0x4, 0x36, 0xc0, 0x1f, 0xcf, + 0x86, 0x1, 0x15, 0x7d, 0xd5, 0x33, 0x9c, 0x3, + 0x37, 0xa0, 0x7, 0xfc, 0x79, 0x66, 0x1, 0x91, + 0x54, 0x60, 0x19, 0x76, 0x44, 0x3, 0xff, 0x84, + 0x99, 0xb2, 0xa4, 0x1, 0x9, 0xb5, 0x7d, 0x10, + 0x7, 0xe0, + + /* U+F070 "" */ + 0x4, 0x40, 0x7, 0xff, 0x51, 0x2e, 0xd0, 0x1, + 0xff, 0xd3, 0xa0, 0x3, 0xe0, 0x80, 0x7f, 0xf4, + 0x58, 0x2, 0x3f, 0x30, 0xf, 0xfe, 0x84, 0x50, + 0x4, 0x38, 0xe0, 0x18, 0x9a, 0xb7, 0xfd, 0xdb, + 0x6e, 0x60, 0x1f, 0xfc, 0x15, 0xd2, 0x0, 0xa2, + 0x85, 0xb7, 0x52, 0xa4, 0x0, 0x12, 0x48, 0xcd, + 0x70, 0xf, 0xfe, 0x1, 0x6a, 0x80, 0x4b, 0xd2, + 0x40, 0x19, 0x15, 0x4, 0x2, 0x28, 0xe6, 0x0, + 0xff, 0xe0, 0x54, 0x0, 0x7c, 0x75, 0xf7, 0x57, + 0xd8, 0x80, 0x10, 0xcd, 0x88, 0x7, 0xfc, 0xf8, + 0x20, 0x18, 0xb1, 0x40, 0x38, 0xee, 0x0, 0x32, + 0x79, 0x0, 0x7f, 0xc7, 0xe8, 0x1, 0x16, 0x8, + 0x35, 0xd2, 0x80, 0x1e, 0x0, 0x30, 0xe1, 0x0, + 0x7f, 0xc3, 0x6e, 0x1, 0x1f, 0xa0, 0xa2, 0xd6, + 0x8, 0x3a, 0x0, 0x61, 0xf1, 0x0, 0xf5, 0x69, + 0x0, 0x51, 0x60, 0x10, 0xdd, 0x80, 0x23, 0xd0, + 0x4, 0x0, 0x71, 0x50, 0x7, 0x2a, 0x8b, 0x54, + 0x2, 0x4d, 0x20, 0x8, 0xc0, 0x31, 0xa8, 0x18, + 0x80, 0x72, 0x28, 0x6, 0xb0, 0xa, 0xa4, 0x2, + 0x2d, 0x50, 0xf, 0xde, 0x0, 0x50, 0xf, 0x58, + 0x4, 0x42, 0x1, 0x9b, 0x8, 0x2, 0xa9, 0x0, + 0xf8, 0x40, 0x2, 0x1, 0xe1, 0x20, 0x1, 0x8, + 0x7, 0x1f, 0x0, 0x66, 0xc1, 0x0, 0xe1, 0x0, + 0x30, 0x7, 0x84, 0x80, 0x2b, 0x0, 0xf1, 0x80, + 0x71, 0xfa, 0x0, 0x67, 0x20, 0x20, 0xf, 0x58, + 0x6, 0x54, 0x0, 0xf2, 0x0, 0x70, 0xdc, 0x0, + 0x45, 0xb0, 0x20, 0x1c, 0xca, 0x1, 0xd6, 0x40, + 0x1d, 0x0, 0x1f, 0x3d, 0x88, 0x4, 0xe0, 0x1c, + 0x72, 0x1, 0xf7, 0x88, 0x6, 0x38, 0x0, 0xf9, + 0x3c, 0xc0, 0x3e, 0x1d, 0x0, 0xfc, 0x58, 0x40, + 0x19, 0xdc, 0x1, 0xf0, 0xe3, 0x0, 0x70, 0xe0, + 0x80, 0x7f, 0x16, 0x20, 0x6, 0x8c, 0x40, 0xf, + 0xa6, 0x80, 0x30, 0xa0, 0x7, 0xfc, 0x37, 0x22, + 0x1, 0x1d, 0xf5, 0xd5, 0xa8, 0x4, 0xba, 0x40, + 0x14, 0xd0, 0x7, 0xff, 0x1, 0xba, 0x8, 0x2, + 0x14, 0x54, 0xa8, 0x0, 0x8b, 0x54, 0x2, 0x5d, + 0x20, 0xf, 0xfe, 0x3, 0xee, 0x42, 0x10, 0x80, + 0x8, 0xd0, 0x3, 0x54, 0x0, 0x45, 0xaa, 0x1, + 0xff, 0xc1, 0x37, 0xbd, 0xef, 0xf6, 0xda, 0x0, + 0x73, 0xe0, 0x80, 0x55, 0x0, 0x1f, 0xfd, 0x3, + 0xf3, 0x0, 0x98, 0x3, 0xff, 0xa2, 0x38, 0xe0, + 0xa, 0x0, 0xff, 0xe9, 0xc5, 0xd9, 0x0, + + /* U+F071 "" */ + 0x0, 0xff, 0xe1, 0xa4, 0x38, 0x80, 0x7f, 0xf4, + 0x16, 0xde, 0x30, 0x3, 0xff, 0x9e, 0x36, 0x1, + 0x13, 0x80, 0x7f, 0xf3, 0xa4, 0x40, 0x34, 0x8, + 0x7, 0xff, 0x30, 0x9c, 0x3, 0xd6, 0x1, 0xff, + 0xcc, 0x90, 0xf, 0x94, 0xc0, 0x3f, 0xf9, 0x48, + 0x80, 0xf, 0xde, 0x1, 0xff, 0xca, 0x90, 0xf, + 0xe3, 0x50, 0xf, 0xfe, 0x43, 0x10, 0x7, 0xfa, + 0xc0, 0x3f, 0xf8, 0xe3, 0x0, 0x1f, 0xf0, 0xc0, + 0x7, 0xff, 0x1a, 0x4, 0x2, 0x7f, 0xfb, 0x84, + 0x2, 0x71, 0x0, 0xff, 0xe2, 0x13, 0x0, 0x6e, + 0x0, 0x84, 0x3, 0xac, 0x3, 0xff, 0x89, 0x20, + 0x1c, 0x20, 0x18, 0x40, 0x32, 0x98, 0x7, 0xff, + 0x9, 0x10, 0x1, 0xde, 0x1, 0xfe, 0xf0, 0xf, + 0xfe, 0x14, 0x80, 0x7f, 0xf1, 0x4d, 0x40, 0x3f, + 0xf8, 0xe, 0x40, 0x1e, 0x10, 0x8, 0x40, 0x3e, + 0xb0, 0xf, 0xf8, 0x60, 0x3, 0xe3, 0x0, 0x8c, + 0x3, 0xe1, 0x80, 0xf, 0xf4, 0x0, 0x7e, 0x10, + 0x8, 0x40, 0x3f, 0x38, 0x80, 0x7e, 0x26, 0x0, + 0xfc, 0xc2, 0x0, 0x50, 0xf, 0xeb, 0x0, 0xfd, + 0x20, 0x1f, 0xc5, 0xdf, 0xe9, 0x0, 0xfe, 0x53, + 0x0, 0xf2, 0xa0, 0x7, 0xfa, 0xbf, 0x90, 0x3, + 0xfd, 0xe0, 0x1e, 0x80, 0xf, 0xf4, 0x28, 0xd, + 0x88, 0x7, 0xf1, 0xb0, 0x6, 0x72, 0x0, 0xff, + 0x18, 0x6, 0x20, 0xf, 0xf4, 0x0, 0x43, 0x0, + 0x1f, 0xf6, 0x0, 0x42, 0x60, 0x1f, 0xe1, 0x80, + 0x4, 0x0, 0x7f, 0xf0, 0x1d, 0x84, 0xf4, 0x3, + 0xff, 0x80, 0xe2, 0xc, 0x1, 0xff, 0xc1, 0x9e, + 0xc3, 0x0, 0xff, 0xe0, 0xb0, 0x8, 0x7, 0xff, + 0x48, 0x42, 0x40, 0x3f, 0xfa, 0x22, 0xc0, 0xf6, + 0xec, 0xdf, 0xfc, 0xd7, 0x8f, 0x0, + + /* U+F074 "" */ + 0x0, 0xff, 0xe4, 0xb5, 0x10, 0x7, 0xff, 0x36, + 0x57, 0xc, 0x3, 0xff, 0x9c, 0x3a, 0x60, 0x2, + 0x44, 0xe3, 0x0, 0xff, 0x12, 0x24, 0x1, 0xe, + 0x98, 0x6d, 0xdf, 0x65, 0x80, 0x7e, 0x3d, 0xbb, + 0x80, 0x30, 0xe9, 0x80, 0x7c, 0x94, 0x1, 0xe3, + 0xc0, 0xf, 0xe1, 0xd0, 0xf, 0xcb, 0x20, 0x18, + 0xb4, 0x3, 0xfe, 0x30, 0xf, 0xe6, 0x80, 0x0, + 0xe0, 0x80, 0x7f, 0x8b, 0x3b, 0x77, 0x48, 0x6, + 0x20, 0x1c, 0x10, 0x8, 0xb7, 0x40, 0x18, 0xb0, + 0x44, 0x45, 0x9a, 0x0, 0x9, 0x43, 0x84, 0x1, + 0x16, 0x11, 0x0, 0x22, 0xc1, 0x0, 0xf9, 0xdc, + 0x76, 0x1a, 0x40, 0x10, 0xf8, 0x80, 0x4, 0xb, + 0x4, 0x3, 0xfa, 0x30, 0x2c, 0xc0, 0x21, 0xc2, + 0x0, 0xa9, 0xf0, 0x40, 0x3f, 0xf8, 0x14, 0x80, + 0x1b, 0x48, 0x3, 0x24, 0x8, 0x7, 0xff, 0x2, + 0x54, 0x3, 0x59, 0x80, 0x72, 0x40, 0x80, 0x7f, + 0xd0, 0xc0, 0x1a, 0x91, 0x78, 0x80, 0x2a, 0x7f, + 0x20, 0xf, 0xe7, 0x70, 0x6, 0x95, 0x4a, 0x1f, + 0x10, 0x0, 0x80, 0xe1, 0x0, 0x4, 0x8b, 0x34, + 0x0, 0x68, 0x63, 0xb0, 0x1, 0x61, 0x10, 0x2, + 0x1c, 0x20, 0xed, 0xdd, 0x20, 0x19, 0xdc, 0x4, + 0x20, 0x11, 0x6e, 0x80, 0x30, 0xe1, 0x0, 0x7f, + 0x34, 0x0, 0x7, 0x4, 0x3, 0xfc, 0x3e, 0x1, + 0xf9, 0x64, 0x3, 0x16, 0x80, 0x7f, 0xf1, 0xd2, + 0x80, 0x3c, 0x78, 0x1, 0xfc, 0x3f, 0xb7, 0x7d, + 0x96, 0x1, 0xf8, 0xf6, 0xee, 0x0, 0xc3, 0x84, + 0x44, 0x4e, 0x30, 0xf, 0xf1, 0x22, 0x40, 0x10, + 0xe9, 0x0, 0x7f, 0xf3, 0x7, 0x4c, 0x3, 0xff, + 0x97, 0x2b, 0x86, 0x1, 0x0, + + /* U+F077 "" */ + 0x0, 0xff, 0x9e, 0xc8, 0x3, 0xff, 0x93, 0x10, + 0x4c, 0x20, 0xf, 0xfe, 0x3c, 0x38, 0x0, 0x70, + 0x80, 0x3f, 0xf8, 0xb0, 0xe0, 0x18, 0x70, 0x80, + 0x3f, 0xf8, 0x70, 0xe0, 0x1e, 0x1c, 0x20, 0xf, + 0xfe, 0xc, 0x38, 0x7, 0xe1, 0xc2, 0x0, 0xff, + 0xa1, 0xc0, 0x32, 0xe0, 0x6, 0x1c, 0x20, 0xf, + 0xe8, 0x70, 0xc, 0xb4, 0x78, 0x1, 0x87, 0x8, + 0x3, 0xe8, 0x70, 0xc, 0xb4, 0x0, 0x3c, 0x0, + 0xc3, 0x84, 0x1, 0xd0, 0xe0, 0x19, 0x68, 0x3, + 0x1e, 0x0, 0x61, 0xc2, 0x0, 0xa1, 0xc0, 0x32, + 0xd0, 0x7, 0x8f, 0x0, 0x30, 0xe1, 0x3, 0x38, + 0x6, 0x5a, 0x0, 0xfc, 0x78, 0x1, 0x87, 0x3, + 0xc0, 0x32, 0xd0, 0x7, 0xf8, 0xf0, 0x3, 0x8, + 0xa0, 0x80, 0xb, 0x40, 0x1f, 0xfc, 0x3, 0xc0, + 0xa, 0x44, 0x58, 0xaf, 0x40, 0x1f, 0xfc, 0x23, + 0xc4, 0xa6, 0x0, + + /* U+F078 "" */ + 0x1, 0xa8, 0x0, 0xff, 0xe2, 0x1d, 0xb0, 0x0, + 0x71, 0x5e, 0x80, 0x3f, 0xf8, 0x47, 0x89, 0x2c, + 0x10, 0x40, 0x5, 0xa0, 0xf, 0xfe, 0x1, 0xe0, + 0x5, 0x23, 0xe0, 0x19, 0x68, 0x3, 0xfc, 0x78, + 0x1, 0x88, 0x59, 0xc0, 0x32, 0xd0, 0x7, 0xe3, + 0xc0, 0xc, 0x3e, 0x0, 0x87, 0x0, 0xcb, 0x40, + 0x1e, 0x3c, 0x0, 0xc3, 0x84, 0x1, 0x43, 0x80, + 0x65, 0xa0, 0xc, 0x78, 0x1, 0x87, 0x8, 0x3, + 0xa1, 0xc0, 0x32, 0xd0, 0x0, 0xf0, 0x3, 0xe, + 0x10, 0x7, 0xd0, 0xe0, 0x19, 0x68, 0xf0, 0x3, + 0xe, 0x10, 0x7, 0xf4, 0x38, 0x6, 0x5c, 0x0, + 0xc3, 0x84, 0x1, 0xff, 0x43, 0x80, 0x7e, 0x1c, + 0x20, 0xf, 0xfe, 0xc, 0x38, 0x7, 0x87, 0x8, + 0x3, 0xff, 0x87, 0xe, 0x1, 0x87, 0x8, 0x3, + 0xff, 0x8b, 0xe, 0x0, 0x1c, 0x20, 0xf, 0xfe, + 0x3c, 0x4a, 0xe1, 0x0, 0x7f, 0x80, + + /* U+F079 "" */ + 0x0, 0xf2, 0x10, 0x7, 0xff, 0x52, 0x6f, 0x50, + 0x3, 0xff, 0xa5, 0x2c, 0x0, 0xb4, 0x0, 0xca, + 0xef, 0xff, 0xc1, 0x60, 0xf, 0xe9, 0x60, 0xd, + 0x68, 0x0, 0x4a, 0x88, 0xff, 0xe0, 0xcb, 0x80, + 0x7d, 0x2c, 0x1, 0xeb, 0x40, 0x60, 0xf, 0xfe, + 0x1f, 0x0, 0x7a, 0x58, 0x3, 0xf5, 0xa1, 0x58, + 0x7, 0xff, 0x22, 0x58, 0x3, 0xc2, 0x1, 0x5a, + 0x23, 0xff, 0xfe, 0x10, 0xf, 0xcc, 0x1, 0x58, + 0x80, 0x1d, 0x80, 0x2d, 0x0, 0xff, 0xe4, 0xc0, + 0x2, 0x90, 0x3, 0x4a, 0x80, 0xd8, 0x7, 0xff, + 0x25, 0xf3, 0x54, 0x3, 0xd5, 0x7e, 0x40, 0x1f, + 0xfc, 0xa3, 0x20, 0xf, 0xc8, 0x20, 0x1f, 0xff, + 0xf0, 0xf, 0xfe, 0xd0, 0xcc, 0x0, 0x7c, 0x54, + 0xe0, 0x1f, 0xfc, 0xad, 0x67, 0xa0, 0xe, 0x2c, + 0x58, 0x60, 0xf, 0xfe, 0x49, 0x0, 0x16, 0x40, + 0x23, 0xf1, 0x0, 0x78, 0x7, 0xe5, 0x77, 0xff, + 0x18, 0x50, 0x4, 0xc2, 0x0, 0x52, 0x0, 0x1c, + 0x0, 0x7e, 0x38, 0x8f, 0xf6, 0x2a, 0x58, 0x7, + 0xf1, 0xe8, 0x80, 0x7f, 0xf2, 0x28, 0x12, 0xc0, + 0x3e, 0x3d, 0x10, 0xf, 0x38, 0x7, 0xff, 0x9, + 0x40, 0x9, 0x80, 0x1c, 0x7a, 0x20, 0x1f, 0x4f, + 0xff, 0xff, 0xa, 0x80, 0x23, 0xc0, 0x8, 0xf4, + 0x40, 0x3f, 0xfa, 0x7, 0x84, 0x98, 0x20, 0x18, + + /* U+F07B "" */ + 0x1b, 0xff, 0xfe, 0xc1, 0x0, 0xff, 0xe1, 0xd2, + 0x0, 0x7f, 0x1e, 0x88, 0x7, 0xff, 0x9, 0x0, + 0x3f, 0xe3, 0xd1, 0x0, 0xff, 0xe7, 0x1e, 0x44, + 0x7f, 0x9c, 0xc0, 0x3f, 0xf8, 0x64, 0xef, 0xfe, + 0x8c, 0x50, 0xf, 0xfe, 0x7d, 0x80, 0x7f, 0xf3, + 0xc4, 0x3, 0xff, 0xfe, 0x1, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xfb, + 0x8, 0x1, 0xff, 0xce, 0x4a, 0x40, 0xf, 0xfe, + 0x62, 0x50, + + /* U+F093 "" */ + 0x0, 0xff, 0xe0, 0x98, 0x80, 0x7f, 0xf3, 0x5f, + 0x3c, 0x80, 0x3f, 0xf9, 0x6f, 0x0, 0x38, 0x40, + 0x1f, 0xfc, 0x97, 0x80, 0x8, 0x70, 0x80, 0x3f, + 0xf8, 0xef, 0x0, 0x1c, 0x38, 0x40, 0x1f, 0xfc, + 0x57, 0x80, 0xf, 0x87, 0x8, 0x3, 0xff, 0x86, + 0xf0, 0x1, 0xfc, 0x38, 0x40, 0x1f, 0xfc, 0x17, + 0x80, 0xf, 0xf8, 0x70, 0x80, 0x3f, 0xe7, 0x80, + 0xf, 0xfe, 0x8, 0xe1, 0x0, 0x7f, 0x2c, 0x0, + 0x7f, 0xf0, 0xc7, 0x0, 0x3f, 0x8c, 0x3, 0xff, + 0x8a, 0x20, 0x1f, 0xcd, 0xbb, 0xc6, 0x1, 0xe9, + 0xdd, 0xdc, 0x1, 0xfe, 0x22, 0xe7, 0x0, 0xf1, + 0x17, 0x8, 0x7, 0xff, 0xfc, 0x3, 0xff, 0xfe, + 0x1, 0xff, 0xcc, 0x11, 0xf8, 0x3, 0xff, 0x80, + 0x23, 0xf0, 0x5f, 0x77, 0xd8, 0x2, 0x1, 0xe7, + 0xc, 0xee, 0xfa, 0xd0, 0x3, 0xe3, 0x1b, 0x76, + 0x6d, 0x26, 0x26, 0x1, 0xf2, 0x0, 0x7f, 0x68, + 0x44, 0xce, 0x61, 0xd0, 0xf, 0xfe, 0x31, 0xf6, + 0x67, 0xb8, 0xc0, 0x3f, 0xf9, 0x6, 0x7e, 0x0, + 0xff, 0xe9, 0x5f, 0xa, 0x7b, 0x80, 0x7f, 0xf2, + 0x84, 0xc1, 0xc4, 0x3, 0x8, 0x7, 0xff, 0x1a, + 0xb4, 0x4f, 0x9c, 0x0, 0x3b, 0xe, 0xff, 0xfc, + 0xc8, 0xd0, + + /* U+F095 "" */ + 0x0, 0xff, 0xe4, 0xb3, 0x8, 0x3, 0xff, 0x9a, + 0x93, 0x2d, 0xeb, 0x73, 0x0, 0xff, 0xe4, 0xf8, + 0x4, 0x29, 0x19, 0x80, 0xf, 0xfe, 0x39, 0x20, + 0x7, 0xc6, 0x1, 0xff, 0xc7, 0xb0, 0xf, 0xc2, + 0x1, 0xff, 0xc6, 0x16, 0x0, 0xff, 0xe7, 0xb0, + 0x7, 0xf1, 0x0, 0x7f, 0xf1, 0xa8, 0x3, 0xf9, + 0x80, 0x3f, 0xf8, 0xcc, 0x1, 0xfd, 0xa0, 0x1f, + 0xfc, 0x6b, 0x40, 0xf, 0xc8, 0x1, 0xff, 0xc7, + 0xb7, 0x0, 0xf8, 0xc0, 0x3f, 0xf9, 0x11, 0x0, + 0xe, 0x60, 0xf, 0xfe, 0x56, 0x80, 0x76, 0x80, + 0x7f, 0xf2, 0x4d, 0x40, 0x31, 0x20, 0x7, 0xff, + 0x27, 0xc0, 0x3a, 0x0, 0x3f, 0xf9, 0x32, 0x60, + 0x18, 0xd4, 0x3, 0xff, 0x90, 0xcc, 0x0, 0xef, + 0x0, 0xff, 0x13, 0x8, 0x7, 0xcb, 0x20, 0x1c, + 0xe6, 0x1, 0xf9, 0x2f, 0x67, 0x40, 0x3c, 0xd4, + 0x1, 0xc7, 0x0, 0x1f, 0x36, 0xda, 0x0, 0xe, + 0x80, 0x35, 0x48, 0x7, 0xe, 0x80, 0x79, 0xfe, + 0x48, 0x3, 0x95, 0xc1, 0x79, 0x40, 0x38, 0x70, + 0x40, 0x3d, 0x0, 0x1f, 0xd1, 0xb4, 0x20, 0x1c, + 0x38, 0x40, 0x1f, 0x18, 0x7, 0xf8, 0x80, 0x3c, + 0x58, 0x40, 0x1f, 0x90, 0x3, 0xff, 0x88, 0xba, + 0x40, 0x1f, 0xd8, 0x1, 0xff, 0xc2, 0x19, 0xa0, + 0xf, 0xf9, 0x40, 0x3f, 0xf8, 0x2d, 0xec, 0x1, + 0xff, 0xc0, 0x12, 0x0, 0xfe, 0x16, 0xe9, 0x10, + 0xf, 0xfe, 0x12, 0x0, 0x78, 0x9a, 0xfa, 0x44, + 0x3, 0xff, 0x89, 0x11, 0x4d, 0x67, 0xec, 0xa0, + 0x7, 0xff, 0x14, + + /* U+F0C4 "" */ + 0x0, 0x96, 0x64, 0xe4, 0x1, 0xff, 0xc6, 0x2d, + 0xa6, 0x64, 0x6b, 0x80, 0x7f, 0xb, 0xdd, 0xa0, + 0x40, 0x70, 0x80, 0x3a, 0x1c, 0x3, 0xe2, 0xf8, + 0x44, 0x3f, 0x9c, 0x88, 0x4, 0x20, 0x14, 0x8, + 0x7, 0x16, 0x8, 0x6, 0x17, 0x50, 0x0, 0xf7, + 0x20, 0x2, 0x40, 0xc, 0x58, 0x20, 0x1d, 0x48, + 0x40, 0x6, 0x10, 0x70, 0x8, 0x80, 0x22, 0xc1, + 0x0, 0xea, 0x50, 0x10, 0x2, 0x0, 0x10, 0x2, + 0x10, 0x1, 0x60, 0x80, 0x75, 0x28, 0x1, 0x0, + 0x7, 0xb7, 0x60, 0x8, 0x80, 0xf0, 0x40, 0x3a, + 0x94, 0x2, 0x80, 0x8, 0x90, 0x3, 0x52, 0xe8, + 0x80, 0x75, 0x28, 0x6, 0x2b, 0x0, 0xfc, 0x34, + 0x20, 0x1d, 0x4a, 0x1, 0xe4, 0xe7, 0x32, 0x0, + 0xff, 0xa9, 0x40, 0x3f, 0xc, 0x66, 0xd0, 0x7, + 0xf5, 0x28, 0x7, 0xff, 0x5, 0x60, 0x3, 0xe8, + 0x50, 0xf, 0xfe, 0x11, 0xc8, 0x7, 0xd2, 0x40, + 0x1f, 0xf2, 0xcc, 0xb4, 0x40, 0x3e, 0x1c, 0x20, + 0xf, 0xc5, 0xb4, 0xcc, 0x10, 0xf, 0xe1, 0xc2, + 0x0, 0xf0, 0xe1, 0x0, 0x7e, 0x60, 0xe, 0x1c, + 0x20, 0xe, 0x91, 0x0, 0x84, 0x3, 0x4c, 0xa8, + 0x3, 0x87, 0x8, 0x3, 0x28, 0x0, 0x7b, 0x90, + 0x1, 0x18, 0x2d, 0x0, 0x70, 0xe1, 0x0, 0x44, + 0x0, 0x61, 0x7, 0x0, 0x88, 0x0, 0xb4, 0x1, + 0xc3, 0x84, 0x0, 0x10, 0x2, 0x0, 0x10, 0x2, + 0x10, 0x9, 0x68, 0x3, 0x87, 0x8, 0x10, 0x0, + 0x7b, 0x76, 0x0, 0x90, 0x3, 0x2d, 0x0, 0x70, + 0xe1, 0x40, 0x4, 0x48, 0x1, 0x31, 0x0, 0x72, + 0xd8, 0x7, 0xb, 0x15, 0x80, 0x79, 0x24, 0x3, + 0xe4, 0xc4, 0x10, 0x4c, 0x40, 0x4e, 0x73, 0x24, + 0xab, 0x0, 0xfe, 0x3b, 0xef, 0xb3, 0x0, + + /* U+F0C5 "" */ + 0x0, 0xf8, 0x51, 0x3f, 0x88, 0xc, 0x3, 0xff, + 0x81, 0x97, 0x7f, 0xd4, 0x1b, 0x60, 0x1f, 0xf1, + 0x0, 0x7f, 0xf0, 0x12, 0xc0, 0x3f, 0xf9, 0x89, + 0x60, 0x1f, 0xfc, 0xc4, 0xb0, 0xf, 0xfe, 0x62, + 0x22, 0xbf, 0xf2, 0x0, 0x7f, 0xc4, 0x1d, 0xff, + 0x91, 0x40, 0x3f, 0xf8, 0x8b, 0x97, 0x7c, 0x60, + 0x1f, 0xfc, 0x63, 0x44, 0xe6, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, + 0xff, 0xf0, 0xf, 0xfe, 0x90, 0x82, 0x80, 0x7f, + 0xf0, 0xc5, 0x0, 0x3b, 0x82, 0xbf, 0xff, 0xf8, + 0x7c, 0x20, 0x1c, 0x94, 0x40, 0x1f, 0xfc, 0xb5, + 0xdf, 0xff, 0xe8, 0x0, 0xff, 0xea, 0x8, 0x7, + 0xff, 0x13, 0x80, 0x3e, 0xd8, 0x77, 0xff, 0xe1, + 0x4b, 0x0, 0x7c, + + /* U+F0C7 "" */ + 0x4, 0x88, 0xff, 0xe1, 0xb9, 0x0, 0x79, 0xad, + 0xdf, 0xff, 0x87, 0x1a, 0x80, 0x1d, 0x0, 0x1f, + 0xfc, 0x6b, 0x40, 0xc, 0x20, 0x1f, 0xfc, 0x7b, + 0x40, 0xf, 0x37, 0xff, 0xff, 0x4, 0x80, 0x2b, + 0x40, 0xe, 0x10, 0xf, 0xfe, 0xb, 0x0, 0x6b, + 0x30, 0xf, 0xfe, 0x66, 0x80, 0x7f, 0xf3, 0x4, + 0xc0, 0x3f, 0xf9, 0x8e, 0x1, 0xff, 0xd0, 0x57, + 0x7f, 0xfe, 0xa, 0x80, 0x7f, 0x8a, 0x23, 0xff, + 0x82, 0x20, 0x1f, 0xff, 0x77, 0xde, 0xa1, 0x0, + 0xff, 0xe3, 0xc4, 0x8, 0x57, 0x40, 0x3f, 0xf8, + 0xee, 0x1, 0x8d, 0x0, 0x3f, 0xf8, 0xa6, 0x1, + 0xe3, 0x0, 0xff, 0xe2, 0x90, 0x7, 0x84, 0x3, + 0xff, 0x8a, 0x26, 0x1, 0xce, 0x1, 0xff, 0xc6, + 0xe1, 0x0, 0xa4, 0x40, 0x3f, 0xf8, 0xc5, 0xf5, + 0x3a, 0xc0, 0x1f, 0xfc, 0x81, 0x56, 0x20, 0xf, + 0xf3, 0xa8, 0x7, 0xff, 0x28, 0x4e, 0xd4, 0x40, + 0x3f, 0xf8, 0xe7, 0xa0, + + /* U+F0C9 "" */ + 0x0, 0xff, 0xe6, 0xef, 0xff, 0xff, 0x2d, 0x48, + 0x3, 0xff, 0x97, 0xa0, 0x1f, 0xfc, 0xd5, 0x11, + 0xff, 0xe5, 0x16, 0x57, 0x77, 0xff, 0x2b, 0x50, + 0x3, 0xff, 0xfe, 0xf7, 0x7f, 0xfc, 0xaa, 0x28, + 0x44, 0xff, 0xe5, 0x2a, 0x80, 0x3f, 0xf9, 0x9e, + 0x20, 0x1f, 0xfc, 0xbe, 0xfb, 0xbf, 0xfe, 0x56, + 0x30, 0xa2, 0x7f, 0xf2, 0x8c, 0x3, 0xff, 0xfe, + 0x15, 0xdd, 0xff, 0xca, 0xd4, 0x51, 0x1f, 0xfe, + 0x51, 0x60, 0x7, 0xff, 0x34, 0x80, 0x3f, 0xf9, + 0x7b, 0xaf, 0xff, 0xfe, 0x5a, 0x80, + + /* U+F0E0 "" */ + 0x1b, 0xff, 0xff, 0xe6, 0x58, 0xd2, 0x0, 0x7f, + 0xf3, 0x12, 0x90, 0x3, 0xff, 0x9c, 0x80, 0x1f, + 0xfd, 0x5, 0x0, 0xff, 0xe7, 0x2d, 0x40, 0x7, + 0xff, 0x32, 0x28, 0x1f, 0x4, 0x3, 0xff, 0x90, + 0x38, 0xe1, 0xca, 0x7e, 0x80, 0x1f, 0xfc, 0x64, + 0xf3, 0x5e, 0x1a, 0x91, 0xb8, 0x0, 0xff, 0xe2, + 0x45, 0x8c, 0xd0, 0x80, 0x1b, 0x49, 0xf0, 0x80, + 0x3f, 0xf8, 0x5, 0x8e, 0x5a, 0xc0, 0x1c, 0x5a, + 0xc7, 0xaa, 0x1, 0xfe, 0x5d, 0x36, 0xd2, 0x0, + 0xfd, 0x34, 0x35, 0x20, 0x1f, 0xa6, 0x82, 0xa4, + 0x3, 0xfe, 0x5f, 0x36, 0xd2, 0x0, 0xc5, 0xac, + 0x7a, 0xa0, 0x1f, 0xfc, 0x11, 0xc6, 0x2d, 0x81, + 0x14, 0x69, 0x3e, 0x10, 0x7, 0xff, 0x12, 0x6c, + 0x5f, 0xb8, 0xe3, 0x70, 0x1, 0xff, 0xc7, 0x4e, + 0x95, 0x54, 0xf2, 0x0, 0x7f, 0xf2, 0x9a, 0xa8, + 0xc0, 0x1f, 0xff, 0x84, 0x0, 0xff, 0xe7, 0x25, + 0x20, 0x7, 0xff, 0x31, 0x28, + + /* U+F0E7 "" */ + 0x0, 0xa2, 0xef, 0xf4, 0x0, 0x7e, 0x37, 0x44, + 0xfc, 0xe4, 0x1, 0xf2, 0x80, 0x7f, 0x88, 0x3, + 0xee, 0x0, 0xfe, 0x40, 0xf, 0xc4, 0x1, 0xfd, + 0xc0, 0x1f, 0x98, 0x3, 0xf9, 0x0, 0x3f, 0x10, + 0x7, 0xe4, 0x10, 0xf, 0xc2, 0x1, 0xfb, 0x40, + 0x3f, 0x18, 0x7, 0xf3, 0x80, 0x7e, 0x60, 0xf, + 0xee, 0xff, 0xed, 0x20, 0x20, 0xf, 0xfe, 0x19, + 0x28, 0x70, 0x7, 0xff, 0x11, 0x80, 0x80, 0x3f, + 0xf8, 0x70, 0x20, 0xc0, 0x1f, 0xfc, 0x22, 0x70, + 0x1, 0x0, 0x7f, 0xf0, 0xa0, 0x2, 0x50, 0xf, + 0xfe, 0xa, 0x28, 0x5, 0x5f, 0xfe, 0xa0, 0xf, + 0x48, 0x7, 0xfd, 0xa0, 0x1c, 0xc4, 0x1, 0xff, + 0x20, 0x6, 0x18, 0x0, 0xff, 0xe0, 0x18, 0x6, + 0x81, 0x0, 0xff, 0x8c, 0x3, 0x13, 0x0, 0x7f, + 0xf0, 0x10, 0x3, 0x48, 0x7, 0xff, 0x7, 0x0, + 0x24, 0x40, 0x7, 0xff, 0x5, 0x40, 0x29, 0x0, + 0xff, 0xe0, 0x90, 0x80, 0x1c, 0x80, 0x3f, 0xf8, + 0x28, 0x0, 0x18, 0x0, 0xff, 0xe1, 0x60, 0x2, + 0x0, 0x3f, 0xf8, 0x66, 0x6, 0xc0, 0x1f, 0xfc, + 0x39, 0xcc, 0x0, 0x7f, 0x80, + + /* U+F0EA "" */ + 0x0, 0xf8, 0x50, 0xc0, 0x3f, 0xf9, 0x2f, 0xd7, + 0x9c, 0x60, 0x1f, 0xfc, 0x14, 0x99, 0xe8, 0x1, + 0x1, 0xd9, 0x9d, 0x2, 0x1, 0xf5, 0xb3, 0x70, + 0x2f, 0x70, 0x44, 0xcd, 0x9e, 0x0, 0x3f, 0xf9, + 0x86, 0x1, 0xff, 0xc2, 0x5f, 0xe1, 0x0, 0xff, + 0xf1, 0x9c, 0xdd, 0xfd, 0x20, 0x1f, 0xfc, 0x24, + 0xc6, 0x44, 0xf8, 0xc0, 0x3f, 0xf8, 0x52, 0x15, + 0xff, 0xf5, 0x6, 0xb0, 0x7, 0xfc, 0x42, 0xa0, + 0x1f, 0xc7, 0x2c, 0x1, 0xff, 0xcc, 0x96, 0x0, + 0xff, 0xe6, 0x4b, 0x0, 0x7f, 0xf3, 0x24, 0xc0, + 0x3f, 0xf8, 0xf5, 0x77, 0x88, 0x3, 0xff, 0x8a, + 0x82, 0x89, 0xc2, 0x1, 0xff, 0xc5, 0x1e, 0xff, + 0xe5, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf9, 0x94, + 0x3, 0xff, 0x99, 0x5f, 0xfe, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xf3, 0x84, 0x40, 0x1f, 0xfc, 0x27, + 0x0, 0xfe, 0xfb, 0xbf, 0xfe, 0xe, 0x90, + + /* U+F0F3 "" */ + 0x0, 0xff, 0x9e, 0x88, 0x3, 0xff, 0x92, 0xb0, + 0xbe, 0x1, 0xff, 0xc9, 0x20, 0x1, 0x0, 0x7f, + 0xf1, 0xca, 0x28, 0x2, 0xa5, 0x0, 0xff, 0xe2, + 0x4e, 0xb9, 0x0, 0x4b, 0x5a, 0x80, 0x1f, 0xfc, + 0x1, 0xc6, 0x0, 0xfc, 0x56, 0xa0, 0x1f, 0xf6, + 0x98, 0x7, 0xfd, 0x48, 0x1, 0xfc, 0xc6, 0x1, + 0xff, 0xc1, 0x90, 0xf, 0xe8, 0x0, 0xff, 0xe1, + 0x12, 0x80, 0x7c, 0x62, 0x1, 0xff, 0xc3, 0xe0, + 0xf, 0x94, 0x3, 0xff, 0x88, 0xc0, 0x1f, 0x8, + 0x7, 0xff, 0x10, 0x80, 0x3e, 0xf0, 0xf, 0xfe, + 0x60, 0x80, 0x7f, 0xf1, 0x44, 0x3, 0xca, 0x1, + 0xff, 0xc5, 0x50, 0xf, 0x18, 0x7, 0xff, 0x14, + 0xc0, 0x38, 0xc0, 0x3f, 0xf8, 0xd8, 0x1, 0xd4, + 0x1, 0xff, 0xc6, 0x41, 0x0, 0x8d, 0x80, 0x3f, + 0xf8, 0xf6, 0x0, 0x1d, 0x0, 0xff, 0xe4, 0x2b, + 0x85, 0x8, 0x7, 0xff, 0x26, 0xd, 0x40, 0x3f, + 0xf9, 0x69, 0x0, 0x1f, 0xfc, 0xa2, 0x66, 0x7f, + 0xff, 0xf2, 0xb4, 0x40, 0x3f, 0xfa, 0xa7, 0xff, + 0xeb, 0x0, 0xff, 0xe2, 0x98, 0x80, 0x76, 0x80, + 0x7f, 0xf1, 0xb4, 0x40, 0x26, 0x60, 0x7, 0xff, + 0x18, 0xfe, 0xa3, 0x24, 0x3, 0xfc, + + /* U+F11C "" */ + 0x1b, 0xff, 0xff, 0xe7, 0xf2, 0x85, 0x20, 0x7, + 0xff, 0x3c, 0x68, 0xd0, 0x3, 0xff, 0xa4, 0x80, + 0x11, 0x3b, 0x98, 0x0, 0xef, 0x0, 0x19, 0xdc, + 0x20, 0xae, 0xe4, 0x2, 0x77, 0x30, 0x5, 0xe0, + 0x12, 0xc4, 0x24, 0xe, 0x22, 0x30, 0x98, 0x82, + 0x5, 0xc4, 0x3c, 0x2a, 0x21, 0x20, 0x1f, 0xfd, + 0xb1, 0x0, 0x8, 0x8, 0x4, 0x20, 0x20, 0x6, + 0x2, 0x0, 0x10, 0x70, 0x0, 0x40, 0x3e, 0x6f, + 0xf7, 0x1, 0x7f, 0xc4, 0x1d, 0xfe, 0x30, 0xcf, + 0xf4, 0x83, 0x7f, 0xb8, 0x3, 0xfc, 0x46, 0x61, + 0x1, 0x33, 0x10, 0x0, 0xcc, 0x40, 0x3, 0x38, + 0x3, 0xff, 0x83, 0xf9, 0x88, 0x8, 0xcc, 0x70, + 0x3e, 0x63, 0x40, 0xb3, 0x25, 0x0, 0xff, 0xe4, + 0x8, 0x7, 0x8, 0x7, 0xff, 0x34, 0x40, 0x38, + 0x40, 0x3f, 0xf8, 0xbf, 0x98, 0x80, 0x8c, 0xc7, + 0x3, 0xe6, 0x34, 0xb, 0x32, 0x50, 0xf, 0xfe, + 0x1, 0x19, 0x84, 0x4, 0xcc, 0x40, 0x3, 0x31, + 0x0, 0xc, 0xe0, 0xf, 0xf3, 0x7f, 0xb8, 0xb, + 0xff, 0xff, 0x83, 0x20, 0xdf, 0xee, 0x0, 0xf8, + 0x40, 0x2, 0x2, 0x1, 0xff, 0xc1, 0x20, 0xe0, + 0x0, 0x80, 0x7f, 0xf6, 0xd6, 0x21, 0x20, 0x71, + 0x1f, 0xfc, 0x1f, 0xa, 0x88, 0x48, 0x7, 0xc4, + 0xee, 0x60, 0x3, 0xbf, 0xff, 0x5, 0x0, 0x9d, + 0xcc, 0x1, 0x7a, 0x0, 0x7f, 0xf4, 0x92, 0x90, + 0x3, 0xff, 0x9e, 0x34, 0x60, + + /* U+F124 "" */ + 0x0, 0xff, 0xe6, 0xab, 0x90, 0x7, 0xff, 0x35, + 0xba, 0xa3, 0x50, 0x3, 0xff, 0x92, 0x31, 0xd2, + 0x20, 0x14, 0x80, 0x7f, 0xf1, 0xca, 0x79, 0xc4, + 0x3, 0x8c, 0x3, 0xff, 0x8a, 0x75, 0xac, 0x1, + 0xf9, 0xc0, 0x3f, 0xf8, 0x69, 0x98, 0x50, 0xf, + 0xf5, 0x80, 0x7f, 0xf0, 0x5b, 0x6c, 0xc0, 0x3f, + 0xe4, 0x20, 0xf, 0xf0, 0xbf, 0x49, 0x0, 0x7f, + 0xf0, 0x60, 0x3, 0xf8, 0x63, 0xa0, 0x40, 0x3f, + 0xf8, 0x46, 0x60, 0xf, 0x8a, 0xb9, 0xc0, 0x3f, + 0xf8, 0xb2, 0x1, 0xe4, 0xbd, 0x50, 0xf, 0xfe, + 0x31, 0x28, 0x6, 0x1b, 0xb2, 0x0, 0x7f, 0xf2, + 0x2c, 0x3, 0xa9, 0x0, 0x3f, 0xf9, 0x22, 0xc0, + 0x1c, 0x80, 0x1f, 0xfc, 0xa9, 0x0, 0xf1, 0x0, + 0x7f, 0xf2, 0x98, 0x3, 0xd2, 0x1, 0xff, 0xc9, + 0x61, 0x0, 0xf2, 0x7e, 0x5d, 0xff, 0x10, 0x7, + 0xf5, 0x80, 0x7f, 0x1a, 0x27, 0xf0, 0x80, 0x7e, + 0x52, 0x0, 0xff, 0xe8, 0x48, 0x7, 0xff, 0x41, + 0xc, 0x3, 0xff, 0xa1, 0xe0, 0x1f, 0xfd, 0x2, + 0x40, 0xf, 0xfe, 0x84, 0x0, 0x7f, 0xf4, 0x5, + 0x40, 0x3f, 0xfa, 0x12, 0x1, 0xff, 0xcb, 0x70, + 0xe, 0x70, 0xf, 0xfe, 0x58, 0x80, 0x67, 0x0, + 0xff, 0xe6, 0x40, 0x4, 0x50, 0x1, 0xff, 0xcc, + 0x2e, 0x89, 0xd0, 0xf, 0xfe, 0x0, + + /* U+F15B "" */ + 0x14, 0x4f, 0xf8, 0x40, 0xc0, 0x3d, 0x97, 0x7f, + 0xf2, 0x86, 0x50, 0x7, 0x10, 0x7, 0xff, 0x9, + 0x68, 0x3, 0xff, 0x90, 0xb4, 0x1, 0xff, 0xc8, + 0x5a, 0x0, 0xff, 0xe4, 0x2d, 0x0, 0x7f, 0xf2, + 0x16, 0x40, 0x3f, 0xf8, 0x48, 0x9e, 0x20, 0xf, + 0xfe, 0x6, 0x5, 0xdf, 0xc0, 0x1f, 0xfc, 0x7, + 0xff, 0xfc, 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, + 0xfe, 0xd2, 0x0, 0xff, 0xe3, 0x96, 0x5d, 0xff, + 0xf1, 0xf0, + + /* U+F1EB "" */ + 0x0, 0xff, 0xf1, 0x9b, 0x4d, 0x5e, 0x5d, 0x4b, + 0x18, 0x7, 0xff, 0x20, 0x9f, 0x3f, 0x25, 0x95, + 0xd, 0x15, 0xa7, 0x3f, 0x1c, 0x80, 0x3f, 0xf8, + 0x47, 0x7b, 0x6, 0x1, 0xff, 0xc1, 0x38, 0xdb, + 0x30, 0xf, 0xf1, 0x66, 0x10, 0x3, 0xff, 0x8e, + 0x99, 0x82, 0x0, 0xfa, 0x34, 0xc0, 0x3f, 0x12, + 0x2a, 0xc8, 0x40, 0x1f, 0x8f, 0x60, 0x3, 0xe, + 0xb8, 0x7, 0x8e, 0x33, 0xf6, 0xea, 0xab, 0xdf, + 0xc8, 0x30, 0xf, 0x3e, 0x88, 0x1f, 0x90, 0x7, + 0x36, 0xe3, 0x98, 0x7, 0xf1, 0xbe, 0x6b, 0x0, + 0x71, 0x79, 0xe8, 0x80, 0x64, 0xd9, 0x20, 0xf, + 0xfe, 0x19, 0x4e, 0xa0, 0x6, 0x1d, 0x90, 0xd, + 0x36, 0x40, 0x1f, 0xfc, 0x72, 0xb9, 0x0, 0xd2, + 0xf0, 0x3, 0xac, 0x1, 0xe4, 0x8b, 0xef, 0xfb, + 0x6e, 0x10, 0x3, 0xcd, 0xa4, 0x10, 0xe0, 0xf7, + 0xe4, 0x1, 0x86, 0x3a, 0xdd, 0x4, 0x2, 0x24, + 0x7b, 0xe8, 0x10, 0xc, 0x59, 0x6e, 0x1, 0x20, + 0x80, 0x66, 0xf7, 0x10, 0xf, 0xf8, 0x5f, 0xd8, + 0x3, 0xa, 0x0, 0x7e, 0x1b, 0x91, 0x0, 0xff, + 0xe1, 0x8c, 0xd8, 0x80, 0x7f, 0xf0, 0x29, 0x0, + 0x3c, 0x6f, 0x13, 0xe, 0x60, 0x1e, 0x4d, 0x0, + 0xff, 0xe0, 0x18, 0x6, 0x18, 0xfc, 0x87, 0x67, + 0x8c, 0xf8, 0x10, 0xc, 0x80, 0x1f, 0xfc, 0x8, + 0x70, 0x3, 0x73, 0x80, 0x7f, 0x3f, 0x30, 0x1, + 0xa0, 0x3, 0xff, 0x83, 0x13, 0x72, 0x1, 0xff, + 0xc1, 0x9b, 0x89, 0x0, 0xff, 0xe1, 0xb2, 0x0, + 0x7c, 0x20, 0x1f, 0x23, 0x80, 0x7f, 0xf2, 0xdf, + 0xfb, 0xdc, 0x3, 0xff, 0xa2, 0xf0, 0x1, 0x43, + 0x80, 0x7f, 0xf4, 0x24, 0x3, 0xa4, 0x3, 0xff, + 0xa0, 0x20, 0x1c, 0x20, 0x1f, 0xfd, 0x3, 0x0, + 0xe3, 0x0, 0xff, 0xe8, 0x40, 0x7, 0x40, 0x7, + 0xff, 0x41, 0x31, 0x9, 0x31, 0x0, 0x3f, 0xf8, + 0x40, + + /* U+F240 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xb3, 0xff, 0xff, 0x94, 0x1, + 0xff, 0xd8, 0x67, 0x30, 0xf, 0xfe, 0xa1, 0x42, + 0x0, 0x7f, 0xff, 0xc0, 0x3f, 0xf9, 0xe7, 0xee, + 0x1, 0xff, 0xd4, 0x70, 0xf, 0xf6, 0x7f, 0xff, + 0xf2, 0x80, 0x3c, 0x20, 0x11, 0xbb, 0xff, 0xf3, + 0x74, 0x2, 0x5d, 0x0, 0x92, 0x23, 0xff, 0x9a, + 0xc0, 0x14, 0x9a, 0x0, 0x7f, 0xf4, 0xc4, 0xc2, + 0x90, 0x3, 0xff, 0xa2, 0x5a, 0x0, 0x1b, 0xff, + 0xff, 0xe8, 0xe9, 0x80, 0x0, + + /* U+F241 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xff, 0x89, 0x20, + 0x1f, 0xfd, 0xd6, 0x73, 0x0, 0xff, 0xea, 0x14, + 0x20, 0x7, 0xff, 0xfc, 0x3, 0xff, 0x9e, 0x7e, + 0xe0, 0x1f, 0xfd, 0x47, 0x0, 0xff, 0x77, 0xff, + 0xff, 0x12, 0x40, 0x3f, 0xe1, 0x0, 0x8d, 0xdf, + 0xff, 0x9b, 0xa0, 0x12, 0xe8, 0x4, 0x91, 0x1f, + 0xfc, 0xd6, 0x0, 0xa4, 0xd0, 0x3, 0xff, 0xa6, + 0x26, 0x14, 0x80, 0x1f, 0xfd, 0x12, 0xd0, 0x0, + 0xdf, 0xff, 0xff, 0x47, 0x4c, 0x0, + + /* U+F242 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xfe, 0x50, 0xf, + 0xff, 0x13, 0x39, 0x80, 0x7f, 0xf5, 0xa, 0x10, + 0x3, 0xff, 0xfe, 0x1, 0xff, 0xcf, 0x3f, 0x70, + 0xf, 0xfe, 0xa3, 0x80, 0x7f, 0xbb, 0xff, 0xfe, + 0x50, 0xf, 0xfe, 0x20, 0x80, 0x46, 0xef, 0xff, + 0xcd, 0xd0, 0x9, 0x74, 0x2, 0x48, 0x8f, 0xfe, + 0x6b, 0x0, 0x52, 0x68, 0x1, 0xff, 0xd3, 0x13, + 0xa, 0x40, 0xf, 0xfe, 0x89, 0x68, 0x0, 0x6f, + 0xff, 0xff, 0xa3, 0xa6, 0x0, + + /* U+F243 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xbb, 0xff, 0xc2, 0x1, 0xff, + 0xe7, 0x67, 0x30, 0xf, 0xfe, 0xa1, 0x42, 0x0, + 0x7f, 0xff, 0xc0, 0x3f, 0xf9, 0xe7, 0xee, 0x1, + 0xff, 0xd4, 0x70, 0xf, 0xf7, 0x7f, 0xf8, 0x40, + 0x3f, 0xf9, 0x22, 0x1, 0x1b, 0xbf, 0xff, 0x37, + 0x40, 0x25, 0xd0, 0x9, 0x22, 0x3f, 0xf9, 0xac, + 0x1, 0x49, 0xa0, 0x7, 0xff, 0x4c, 0x4c, 0x29, + 0x0, 0x3f, 0xfa, 0x25, 0xa0, 0x1, 0xbf, 0xff, + 0xfe, 0x8e, 0x98, 0x0, + + /* U+F244 "" */ + 0x2, 0x67, 0x7f, 0xfe, 0x82, 0x0, 0x4b, 0xb3, + 0x11, 0xff, 0xd0, 0xb9, 0x0, 0x40, 0x7, 0xff, + 0x4d, 0x84, 0x8, 0x3, 0xff, 0xa8, 0x40, 0x19, + 0xff, 0xff, 0xf9, 0xb6, 0x1, 0x64, 0x80, 0x7f, + 0xf5, 0x98, 0x3, 0xff, 0xe8, 0xce, 0x60, 0x1f, + 0xfd, 0x42, 0x84, 0x0, 0xff, 0xff, 0x80, 0x7f, + 0xf3, 0xcf, 0xdc, 0x3, 0xff, 0xa8, 0xe0, 0x1f, + 0xfd, 0xb1, 0x0, 0x8d, 0xdf, 0xff, 0x9b, 0xa0, + 0x12, 0xe8, 0x4, 0x91, 0x1f, 0xfc, 0xd6, 0x0, + 0xa4, 0xd0, 0x3, 0xff, 0xa6, 0x26, 0x14, 0x80, + 0x1f, 0xfd, 0x12, 0xd0, 0x0, 0xdf, 0xff, 0xff, + 0x47, 0x4c, 0x0, + + /* U+F287 "" */ + 0x0, 0xff, 0xe4, 0x8, 0x7, 0xff, 0x55, 0x7b, + 0xa4, 0x0, 0xff, 0xe8, 0x9, 0x1d, 0x8, 0xd, + 0x88, 0x7, 0xff, 0x34, 0x6f, 0xb7, 0x0, 0x39, + 0x0, 0x3f, 0xf9, 0xb4, 0x80, 0x64, 0x1, 0xc2, + 0x1, 0xff, 0xcc, 0x54, 0x1e, 0xcd, 0x30, 0x8, + 0xd0, 0x3, 0xff, 0x99, 0x1, 0x62, 0x0, 0xc8, + 0x58, 0xc0, 0xf, 0xfe, 0x21, 0x8, 0x7, 0x90, + 0x88, 0xa0, 0x19, 0xe9, 0xc0, 0x3f, 0xf8, 0x69, + 0xdb, 0xd8, 0x40, 0x1a, 0x2, 0x0, 0x3f, 0xf8, + 0x6e, 0x80, 0x1c, 0x96, 0x20, 0x3, 0xc1, 0x0, + 0x21, 0x8a, 0x80, 0x7f, 0xf0, 0xee, 0xe2, 0x0, + 0xa0, 0x3, 0x86, 0xcd, 0x68, 0x1d, 0x13, 0xff, + 0x88, 0x20, 0x9a, 0xe0, 0x3, 0x0, 0xf2, 0xe5, + 0x8, 0x35, 0xdf, 0xff, 0x10, 0x80, 0x28, 0xd0, + 0x10, 0xf, 0xa, 0x27, 0x18, 0x0, 0xd1, 0x3f, + 0xf8, 0x0, 0x18, 0x60, 0x18, 0x3, 0xd5, 0x77, + 0xd8, 0xc0, 0xd7, 0x7f, 0xfc, 0x3, 0x0, 0x3f, + 0x28, 0x42, 0x0, 0x67, 0x40, 0xf, 0x48, 0xa9, + 0x0, 0x7f, 0xf0, 0x13, 0x60, 0x3, 0x5d, 0x3c, + 0x64, 0x0, 0x7e, 0x90, 0x80, 0xf, 0xfb, 0x2c, + 0x80, 0x3c, 0xb0, 0xe6, 0x1, 0xfc, 0xc0, 0xa4, + 0x0, 0x6d, 0xdd, 0x84, 0x1, 0xff, 0xcb, 0x17, + 0xe, 0x0, 0x79, 0x16, 0x36, 0x0, 0xff, 0xe6, + 0x41, 0x9b, 0xf5, 0xc0, 0x3f, 0xfa, 0x7a, 0xa0, + 0x42, 0x1, 0xff, 0xd3, 0x1a, 0xfe, 0x60, 0xf, + 0xfe, 0xb0, 0x88, 0x3, 0xff, 0xaf, 0x1f, 0xfc, + 0x80, 0x1f, 0x80, + + /* U+F293 "" */ + 0x0, 0xfe, 0x13, 0x43, 0x20, 0xf, 0xfe, 0x11, + 0xd7, 0x73, 0x2f, 0x37, 0xed, 0x40, 0x3f, 0xd5, + 0x8a, 0x20, 0x1e, 0x4a, 0xc1, 0x0, 0xf0, 0xe2, + 0x80, 0x63, 0x80, 0xe, 0x3c, 0x10, 0xe, 0xa3, + 0x0, 0xf3, 0xb8, 0x3, 0x8b, 0x40, 0x32, 0xa0, + 0x7, 0xe8, 0x60, 0xe, 0x35, 0x0, 0xa4, 0x3, + 0xfd, 0x2a, 0x1, 0xdc, 0x0, 0x23, 0x0, 0xff, + 0xa9, 0x0, 0x32, 0x8, 0x20, 0x6, 0x50, 0xe, + 0x39, 0xb, 0x30, 0xc, 0x81, 0x80, 0x13, 0x56, + 0x8, 0x6, 0x69, 0xd, 0x20, 0xb, 0x41, 0x80, + 0x24, 0x13, 0xd1, 0x0, 0x8, 0x10, 0x8, 0x80, + 0x22, 0x2, 0x0, 0x8b, 0x4, 0xf5, 0xc0, 0x9, + 0x61, 0x46, 0x1, 0x30, 0x8, 0x6, 0x2c, 0x13, + 0xa0, 0x2b, 0x9, 0x50, 0xc, 0x20, 0x1f, 0x16, + 0x8, 0x80, 0x27, 0x60, 0xe, 0x31, 0x0, 0xf8, + 0xb0, 0x40, 0xb, 0x0, 0x1f, 0xfc, 0x46, 0x10, + 0x3, 0x0, 0x7e, 0x10, 0xf, 0x92, 0xc0, 0x23, + 0xc0, 0xf, 0x18, 0x7, 0xc9, 0x60, 0x40, 0x22, + 0x3b, 0x0, 0xf8, 0x40, 0x32, 0x58, 0x2f, 0x1, + 0xe0, 0xa5, 0x0, 0x61, 0x2, 0x0, 0x92, 0xc1, + 0x68, 0x2, 0x2c, 0x5, 0x80, 0x9, 0x81, 0x40, + 0x39, 0x68, 0x2, 0x10, 0xb0, 0x1a, 0x0, 0xb4, + 0x30, 0x2, 0x4d, 0xa0, 0xe, 0x96, 0x1c, 0x20, + 0x8, 0xc1, 0x0, 0x31, 0x0, 0x42, 0x6, 0xc3, + 0x84, 0x1, 0x90, 0x5, 0x40, 0x3f, 0xc3, 0x84, + 0x1, 0x94, 0x2, 0x80, 0xf, 0xe1, 0xc2, 0x0, + 0xe8, 0x0, 0x8a, 0x40, 0x3e, 0x1d, 0x20, 0xe, + 0x72, 0x0, 0xcd, 0x20, 0x1c, 0x7a, 0x60, 0x1c, + 0x90, 0x1, 0xe6, 0xd5, 0x0, 0x84, 0xc0, 0x30, + 0xc5, 0x80, 0x7e, 0x2a, 0xea, 0x75, 0x44, 0x2b, + 0xdf, 0x38, 0x6, + + /* U+F2ED "" */ + 0x0, 0xfc, 0x28, 0x9e, 0x30, 0xf, 0xfe, 0x20, + 0xf5, 0xdf, 0xb2, 0x40, 0x3f, 0x2c, 0x47, 0xb4, + 0x3, 0xf3, 0x44, 0x7c, 0x34, 0xef, 0xe3, 0x0, + 0xfe, 0x77, 0xf9, 0x80, 0x3f, 0xf9, 0x9e, 0x80, + 0x1f, 0xfc, 0xa1, 0xcb, 0xff, 0xff, 0xe5, 0x72, + 0x1, 0x44, 0x7f, 0xf2, 0x18, 0x2, 0x67, 0x7f, + 0xfe, 0x45, 0x0, 0x7f, 0xfb, 0xaa, 0x80, 0x13, + 0x68, 0x4, 0x7c, 0x60, 0x1f, 0xfc, 0x7, 0x70, + 0x5, 0xe4, 0x20, 0x6, 0x16, 0x0, 0xff, 0xff, + 0x80, 0x7f, 0xff, 0xc0, 0x3f, 0xff, 0xe0, 0x1f, + 0xff, 0x27, 0x70, 0x5, 0xe4, 0x20, 0x6, 0x16, + 0x0, 0xf9, 0xc0, 0x35, 0x50, 0x2, 0x6d, 0x0, + 0x8f, 0x8c, 0x2, 0x70, 0x8, 0x40, 0x3f, 0xf9, + 0x2, 0x1, 0x13, 0x0, 0x7f, 0xf1, 0xe0, 0x3, + 0x4d, 0xc3, 0xbf, 0xff, 0xe, 0x78, 0x80, 0x0, + + /* U+F304 "" */ + 0x0, 0xff, 0xe5, 0x33, 0x4, 0x3, 0xff, 0x98, + 0x5b, 0x32, 0xf3, 0x0, 0xff, 0xe5, 0x16, 0x10, + 0x0, 0x70, 0xc0, 0x3f, 0xf9, 0x5, 0x82, 0x1, + 0xd8, 0x60, 0x1f, 0xfc, 0x7b, 0x10, 0xf, 0xb0, + 0xc0, 0x3f, 0xf8, 0x82, 0x12, 0x80, 0x1f, 0xbc, + 0x3, 0xff, 0x86, 0x5f, 0x81, 0x68, 0x1, 0xf1, + 0x80, 0x7f, 0xf0, 0x8b, 0x4, 0xf0, 0x2d, 0x0, + 0x3c, 0x80, 0x1f, 0xfc, 0x12, 0xc1, 0x0, 0x1e, + 0x5, 0xa0, 0x6, 0x1a, 0x0, 0xff, 0xe0, 0x16, + 0x8, 0x6, 0x3c, 0xb, 0x40, 0x0, 0xe0, 0x80, + 0x7f, 0xc5, 0x82, 0x1, 0xe3, 0xc0, 0xb4, 0x1c, + 0x20, 0xf, 0xf8, 0xb0, 0x40, 0x3f, 0x1e, 0x5, + 0xf9, 0x0, 0x7f, 0xc5, 0x82, 0x1, 0xfe, 0x3a, + 0x1, 0x0, 0xff, 0x8b, 0x4, 0x3, 0xfe, 0x18, + 0x0, 0xff, 0xe0, 0x16, 0x8, 0x7, 0xfc, 0x38, + 0x40, 0x1f, 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, + 0x1, 0xff, 0x16, 0x8, 0x7, 0xfc, 0x38, 0x40, + 0x1f, 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, 0x1, + 0xff, 0x16, 0x8, 0x7, 0xfc, 0x38, 0x40, 0x1f, + 0xf1, 0x60, 0x80, 0x7f, 0xc3, 0x84, 0x1, 0xff, + 0xe, 0x8, 0x7, 0xfc, 0x38, 0x40, 0x1f, 0xfc, + 0x4, 0x10, 0xf, 0xf8, 0x70, 0x80, 0x3f, 0xf8, + 0x24, 0x1, 0xff, 0xe, 0x10, 0x7, 0xff, 0xb, + 0x80, 0x3f, 0xc3, 0x84, 0x1, 0xff, 0xc3, 0x20, + 0xf, 0xe1, 0xc2, 0x0, 0xff, 0xe2, 0x30, 0x7, + 0xe1, 0xc2, 0x0, 0xff, 0xe2, 0x90, 0x7, 0xc3, + 0x84, 0x1, 0xff, 0xc6, 0x10, 0xe, 0x13, 0xc2, + 0x0, 0xff, 0xe3, 0xec, 0x4d, 0xef, 0xf6, 0x10, + 0x7, 0xff, 0x1c, + + /* U+F55A "" */ + 0x0, 0xfe, 0x8e, 0xff, 0xff, 0xe4, 0xea, 0x80, + 0x7f, 0x5b, 0x88, 0x7, 0xff, 0x24, 0xa9, 0x40, + 0x3e, 0xb4, 0x0, 0xff, 0xe6, 0xc0, 0x7, 0xad, + 0x0, 0x3f, 0xf9, 0xc4, 0x1, 0xd6, 0x80, 0x1f, + 0xcc, 0xc0, 0xf, 0x33, 0x0, 0x3f, 0xf8, 0x36, + 0x80, 0x1f, 0xcf, 0x32, 0x70, 0xc, 0xf3, 0x28, + 0x0, 0xff, 0xad, 0x0, 0x3f, 0x86, 0x0, 0x10, + 0xe0, 0x7, 0x80, 0x3, 0x88, 0x7, 0xf5, 0xa0, + 0x7, 0xf8, 0x60, 0x2, 0x87, 0x74, 0x0, 0x50, + 0x20, 0x1f, 0xad, 0x0, 0x3f, 0xf8, 0xf, 0x0, + 0x14, 0x40, 0x2, 0x87, 0x0, 0xfd, 0x48, 0x1, + 0xff, 0xc2, 0x78, 0x0, 0xf4, 0x38, 0x7, 0xf2, + 0x80, 0x7f, 0xf1, 0x1d, 0x0, 0x32, 0x38, 0x7, + 0xf9, 0x40, 0x3f, 0xf8, 0x8e, 0x80, 0x19, 0x1c, + 0x3, 0xfd, 0x48, 0x1, 0xff, 0xc2, 0x78, 0x0, + 0xf4, 0x38, 0x7, 0xfa, 0xd0, 0x3, 0xff, 0x80, + 0xf0, 0x1, 0x44, 0x0, 0x28, 0x70, 0xf, 0xf5, + 0xa0, 0x7, 0xf8, 0x60, 0x2, 0x87, 0x74, 0x0, + 0x50, 0x20, 0x1f, 0xeb, 0x40, 0xf, 0xe1, 0x80, + 0x4, 0x38, 0x1, 0xe0, 0x1, 0x2, 0x1, 0xff, + 0x5a, 0x0, 0x7f, 0x3c, 0xc9, 0xc0, 0x33, 0xcc, + 0x9c, 0x3, 0xff, 0x83, 0x68, 0x1, 0xfc, 0xcc, + 0x0, 0xf3, 0x30, 0x3, 0xff, 0x87, 0x68, 0x1, + 0xff, 0xce, 0x20, 0xf, 0xad, 0x40, 0x3f, 0xf9, + 0xb0, 0x1, 0xfa, 0x9c, 0x40, 0x3f, 0xf9, 0x25, + 0x4a, + + /* U+F7C2 "" */ + 0x0, 0xf0, 0xbc, 0x47, 0xf3, 0xa8, 0x7, 0xc3, + 0x90, 0xef, 0xfd, 0x15, 0x82, 0x1, 0x8b, 0x8, + 0x3, 0xff, 0x80, 0x76, 0x1, 0x16, 0x10, 0x7, + 0xff, 0x9, 0x40, 0x5, 0x82, 0x1b, 0xfc, 0xb, + 0xfe, 0x12, 0xff, 0x38, 0x6, 0x2c, 0x10, 0xf, + 0xfe, 0x29, 0xe0, 0x80, 0x7f, 0xf1, 0xb4, 0x40, + 0x3f, 0xf8, 0xe2, 0x1, 0xff, 0xce, 0xdf, 0xe0, + 0x5f, 0xf0, 0x97, 0xf9, 0xc0, 0x3f, 0xff, 0xe0, + 0x1f, 0xff, 0xf0, 0xf, 0xff, 0xf8, 0x7, 0xff, + 0xfc, 0x3, 0xff, 0x8c, 0x20, 0x1f, 0xfc, 0x71, + 0x60, 0xf, 0xfe, 0x3b, 0x42, 0x80, 0x7f, 0xf1, + 0x5a, 0x2, 0xb6, 0xef, 0xff, 0x87, 0xb2, 0x0, + + /* U+F8A2 "" */ + 0x0, 0xff, 0xe7, 0xa0, 0x7, 0xff, 0x3e, 0x6c, + 0x40, 0x3f, 0xf9, 0xb2, 0xc0, 0x1f, 0xfc, 0xe9, + 0x60, 0xf, 0xe5, 0xc5, 0x0, 0xff, 0xe1, 0x1b, + 0x0, 0x7f, 0x3d, 0x1c, 0x0, 0x7f, 0xf0, 0x9c, + 0x3, 0xfa, 0x20, 0x1, 0xff, 0xce, 0x97, 0x0, + 0xff, 0xe7, 0x53, 0x0, 0x7f, 0xf3, 0xad, 0x40, + 0x38, 0xbf, 0xff, 0xf8, 0x56, 0x1, 0xd4, 0x80, + 0x1f, 0xfc, 0xf6, 0x0, 0xff, 0xe8, 0x70, 0x80, + 0x7f, 0xf3, 0x44, 0x45, 0xe4, 0x1, 0xc3, 0x55, + 0xff, 0xc6, 0xf0, 0x0, 0xe1, 0x80, 0x63, 0x55, + 0xff, 0xe3, 0x8, 0x4, 0x38, 0x60, 0x1f, 0xfd, + 0xc, 0x40, 0xf, 0xfe, 0x85, 0xa8, 0x20, 0x7, + 0xff, 0x3a, 0xba, 0x40, 0x3f, 0xf9, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 121, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 120, .box_w = 5, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 41, .adv_w = 175, .box_w = 9, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 66, .adv_w = 315, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 196, .adv_w = 278, .box_w = 16, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 341, .adv_w = 378, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 524, .adv_w = 307, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 685, .adv_w = 94, .box_w = 4, .box_h = 8, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 697, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 776, .adv_w = 151, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 855, .adv_w = 179, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 907, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 940, .adv_w = 102, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 961, .adv_w = 172, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 969, .adv_w = 102, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 980, .adv_w = 158, .box_w = 12, .box_h = 27, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1083, .adv_w = 299, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1221, .adv_w = 166, .box_w = 8, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1238, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1354, .adv_w = 256, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1462, .adv_w = 300, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1561, .adv_w = 257, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1675, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1812, .adv_w = 268, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1910, .adv_w = 289, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2052, .adv_w = 276, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2187, .adv_w = 102, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2213, .adv_w = 102, .box_w = 5, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2249, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2320, .adv_w = 261, .box_w = 14, .box_h = 9, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2350, .adv_w = 261, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 2421, .adv_w = 257, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2522, .adv_w = 463, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2798, .adv_w = 328, .box_w = 22, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2946, .adv_w = 339, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3063, .adv_w = 324, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3198, .adv_w = 370, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3315, .adv_w = 300, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3363, .adv_w = 284, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3402, .adv_w = 346, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3542, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3574, .adv_w = 139, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3580, .adv_w = 230, .box_w = 13, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3634, .adv_w = 322, .box_w = 19, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3760, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3786, .adv_w = 428, .box_w = 22, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3916, .adv_w = 364, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4019, .adv_w = 376, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4186, .adv_w = 323, .box_w = 17, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4272, .adv_w = 376, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 4483, .adv_w = 326, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4592, .adv_w = 278, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4726, .adv_w = 263, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4758, .adv_w = 354, .box_w = 18, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4834, .adv_w = 319, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4983, .adv_w = 504, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5219, .adv_w = 302, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5365, .adv_w = 290, .box_w = 20, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5470, .adv_w = 294, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5568, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 5592, .adv_w = 158, .box_w = 13, .box_h = 27, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 5698, .adv_w = 149, .box_w = 7, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 5721, .adv_w = 261, .box_w = 13, .box_h = 12, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5784, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5791, .adv_w = 269, .box_w = 8, .box_h = 4, .ofs_x = 3, .ofs_y = 17}, + {.bitmap_index = 5806, .adv_w = 268, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5899, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6003, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6098, .adv_w = 306, .box_w = 16, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6205, .adv_w = 274, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6299, .adv_w = 158, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6351, .adv_w = 309, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6491, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6553, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6570, .adv_w = 127, .box_w = 9, .box_h = 26, .ofs_x = -3, .ofs_y = -5}, + {.bitmap_index = 6616, .adv_w = 276, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6704, .adv_w = 125, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6711, .adv_w = 474, .box_w = 26, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6806, .adv_w = 305, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6862, .adv_w = 284, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6966, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 7072, .adv_w = 306, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7180, .adv_w = 184, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7210, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7305, .adv_w = 185, .box_w = 11, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7357, .adv_w = 303, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7408, .adv_w = 250, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7506, .adv_w = 403, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7661, .adv_w = 247, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7759, .adv_w = 250, .box_w = 17, .box_h = 20, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 7887, .adv_w = 233, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7954, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8014, .adv_w = 134, .box_w = 4, .box_h = 26, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 8023, .adv_w = 157, .box_w = 9, .box_h = 26, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 8077, .adv_w = 261, .box_w = 14, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 8112, .adv_w = 188, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 8158, .adv_w = 141, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 8176, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8344, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8523, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8634, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8793, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8946, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 9210, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 9431, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9642, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 9805, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9961, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10218, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10281, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10395, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10670, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10804, .adv_w = 308, .box_w = 20, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10984, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 11094, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11242, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11325, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11379, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 11491, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 11628, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11759, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11890, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11979, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 12013, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12263, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12598, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 12836, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13065, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 13188, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 13314, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13498, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13564, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13734, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 13945, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14184, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14291, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14423, .adv_w = 392, .box_w = 25, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14501, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14634, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 14791, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14918, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15084, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15281, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 15463, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15537, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15794, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15895, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 15997, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16098, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16198, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16289, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16500, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 16743, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16863, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 17090, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17291, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 17387, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 20, 0, 12, -10, 0, 0, + 0, 0, -25, -27, 3, 21, 10, 8, + -18, 3, 22, 1, 19, 4, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 4, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, -13, 0, 0, 0, 0, + 0, -9, 8, 9, 0, 0, -4, 0, + -3, 4, 0, -4, 0, -4, -2, -9, + 0, 0, 0, 0, -4, 0, 0, -6, + -7, 0, 0, -4, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, -7, 0, -12, 0, -54, 0, + 0, -9, 0, 9, 13, 0, 0, -9, + 4, 4, 15, 9, -8, 9, 0, 0, + -26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -12, -5, -22, 0, -18, + -3, 0, 0, 0, 0, 1, 17, 0, + -13, -4, -1, 1, 0, -8, 0, 0, + -3, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -36, -4, 17, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 15, + 0, 4, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 4, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 9, 4, 13, -4, 0, 0, 9, -4, + -15, -61, 3, 12, 9, 1, -6, 0, + 16, 0, 14, 0, 14, 0, -42, 0, + -5, 13, 0, 15, -4, 9, 4, 0, + 0, 1, -4, 0, 0, -8, 36, 0, + 36, 0, 13, 0, 19, 6, 8, 13, + 0, 0, 0, -17, 0, 0, 0, 0, + 1, -3, 0, 3, -8, -6, -9, 3, + 0, -4, 0, 0, 0, -18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -25, 0, -28, 0, 0, 0, + 0, -3, 0, 44, -5, -6, 4, 4, + -4, 0, -6, 4, 0, 0, -24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -43, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -28, 0, 27, 0, 0, -17, 0, + 15, 0, -30, -43, -30, -9, 13, 0, + 0, -30, 0, 5, -10, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 13, -55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -5, -9, 0, -1, + -1, -4, 0, 0, -3, 0, 0, 0, + -9, 0, -4, 0, -10, -9, 0, -11, + -15, -15, -9, 0, -9, 0, -9, 0, + 0, 0, 0, -4, 0, 0, 4, 0, + 3, -4, 0, 1, 0, 0, 0, 4, + -3, 0, 0, 0, -3, 4, 4, -1, + 0, 0, 0, -9, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 6, -3, 0, + -5, 0, -8, 0, 0, -3, 0, 13, + 0, 0, -4, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -4, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -4, -5, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -4, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -3, -6, 0, -7, 0, -13, + -3, -13, 9, 0, 0, -9, 4, 9, + 12, 0, -11, -1, -5, 0, -1, -21, + 4, -3, 3, -24, 4, 0, 0, 1, + -23, 0, -24, -4, -39, -3, 0, -22, + 0, 9, 13, 0, 6, 0, 0, 0, + 0, 1, 0, -8, -6, 0, -13, 0, + 0, 0, -4, 0, 0, 0, -4, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, -3, -5, -4, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -5, + 0, -3, 0, -9, 4, 0, 0, -5, + 2, 4, 4, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -4, 0, -4, -3, -5, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -5, -7, 0, + -9, 0, 13, -3, 1, -14, 0, 0, + 12, -22, -23, -19, -9, 4, 0, -4, + -29, -8, 0, -8, 0, -9, 7, -8, + -29, 0, -12, 0, 0, 2, -1, 4, + -3, 0, 4, 0, -13, -17, 0, -22, + -11, -9, -11, -13, -5, -12, -1, -9, + -12, 3, 0, 1, 0, -4, 0, 0, + 0, 3, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -2, 0, -1, -4, 0, -8, -10, + -10, -1, 0, -13, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -9, 0, 0, 0, 0, -22, -13, 0, + 0, 0, -7, -22, 0, 0, -4, 4, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, -8, 0, + 0, 0, 0, 5, 0, 3, -9, -9, + 0, -4, -4, -5, 0, 0, 0, 0, + 0, 0, -13, 0, -4, 0, -7, -4, + 0, -10, -11, -13, -4, 0, -9, 0, + -13, 0, 0, 0, 0, 36, 0, 0, + 2, 0, 0, -6, 0, 4, 0, -19, + 0, 0, 0, 0, 0, -42, -8, 15, + 13, -4, -19, 0, 4, -7, 0, -22, + -2, -6, 4, -31, -4, 6, 0, 7, + -16, -7, -17, -15, -19, 0, 0, -27, + 0, 26, 0, 0, -2, 0, 0, 0, + -2, -2, -4, -12, -15, -1, -42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, -4, -7, 0, 0, + -9, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -9, 0, 0, 9, + -1, 6, 0, -10, 4, -3, -1, -12, + -4, 0, -6, -4, -3, 0, -7, -8, + 0, 0, -4, -1, -3, -8, -5, 0, + 0, -4, 0, 4, -3, 0, -10, 0, + 0, 0, -9, 0, -8, 0, -8, -8, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 4, 0, -6, 0, -3, -5, + -14, -3, -3, -3, -1, -3, -5, -1, + 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 5, -3, 0, -3, + 0, 0, 0, -3, -5, -3, -4, -5, + -4, 0, 4, 18, -1, 0, -12, 0, + -3, 9, 0, -4, -19, -6, 7, 0, + 0, -21, -8, 4, -8, 3, 0, -3, + -4, -14, 0, -7, 2, 0, 0, -8, + 0, 0, 0, 4, 4, -9, -9, 0, + -8, -4, -7, -4, -4, 0, -8, 2, + -9, -8, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -6, + 0, 0, -4, -4, 0, 0, 0, 0, + -4, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -7, 0, -9, 0, 0, 0, -15, 0, + 3, -10, 9, 1, -3, -21, 0, 0, + -10, -4, 0, -18, -11, -13, 0, 0, + -19, -4, -18, -17, -22, 0, -12, 0, + 4, 30, -6, 0, -10, -4, -1, -4, + -8, -12, -8, -17, -18, -10, -4, 0, + 0, -3, 0, 1, 0, 0, -31, -4, + 13, 10, -10, -17, 0, 1, -14, 0, + -22, -3, -4, 9, -41, -6, 1, 0, + 0, -29, -5, -23, -4, -33, 0, 0, + -31, 0, 26, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -17, -3, 0, -29, + 0, 0, 0, 0, -14, 0, -4, 0, + -1, -13, -21, 0, 0, -2, -7, -13, + -4, 0, -3, 0, 0, 0, 0, -20, + -4, -15, -14, -4, -8, -11, -4, -8, + 0, -9, -4, -15, -7, 0, -5, -9, + -4, -9, 0, 2, 0, -3, -15, 0, + 9, 0, -8, 0, 0, 0, 0, 5, + 0, 3, -9, 18, 0, -4, -4, -5, + 0, 0, 0, 0, 0, 0, -13, 0, + -4, 0, -7, -4, 0, -10, -11, -13, + -4, 0, -9, 4, 18, 0, 0, 0, + 0, 36, 0, 0, 2, 0, 0, -6, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -9, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -4, -4, 0, 0, -9, + -4, 0, 0, -9, 0, 8, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 7, 9, 4, -4, 0, -14, + -7, 0, 13, -15, -14, -9, -9, 18, + 8, 4, -39, -3, 9, -4, 0, -4, + 5, -4, -16, 0, -4, 4, -6, -4, + -13, -4, 0, 0, 13, 9, 0, -13, + 0, -25, -6, 13, -6, -17, 1, -6, + -15, -15, -4, 18, 4, 0, -7, 0, + -12, 0, 4, 15, -10, -17, -18, -11, + 13, 0, 1, -33, -4, 4, -8, -3, + -10, 0, -10, -17, -7, -7, -4, 0, + 0, -10, -9, -4, 0, 13, 10, -4, + -25, 0, -25, -6, 0, -16, -26, -1, + -14, -8, -15, -13, 12, 0, 0, -6, + 0, -9, -4, 0, -4, -8, 0, 8, + -15, 4, 0, 0, -24, 0, -4, -10, + -8, -3, -13, -11, -15, -10, 0, -13, + -4, -10, -9, -13, -4, 0, 0, 1, + 21, -8, 0, -13, -4, 0, -4, -9, + -10, -12, -13, -17, -6, -9, 9, 0, + -7, 0, -22, -5, 3, 9, -14, -17, + -9, -15, 15, -4, 2, -42, -8, 9, + -10, -8, -17, 0, -13, -19, -5, -4, + -4, -4, -9, -13, -1, 0, 0, 13, + 13, -3, -29, 0, -27, -10, 11, -17, + -30, -9, -16, -19, -22, -15, 9, 0, + 0, 0, 0, -5, 0, 0, 4, -5, + 9, 3, -9, 9, 0, 0, -14, -1, + 0, -1, 0, 1, 1, -4, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 4, 13, 1, 0, -5, 0, 0, + 0, 0, -3, -3, -5, 0, 0, 0, + 1, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 17, 0, 8, 1, 1, -6, + 0, 9, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -27, 0, -4, 8, 0, 13, + 0, 0, 44, 5, -9, -9, 4, 4, + -3, 1, -22, 0, 0, 22, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -30, 17, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -9, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -12, 0, + 0, 1, 0, 0, 4, 58, -9, -4, + 14, 12, -12, 4, 0, 0, 4, 4, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -58, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, -12, 0, 0, 0, 0, + -10, -2, 0, 0, 0, -10, 0, -5, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -30, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -4, 0, 0, -9, 0, -7, 0, + -12, 0, 0, 0, -8, 4, -5, 0, + 0, -12, -4, -10, 0, 0, -12, 0, + -4, 0, -21, 0, -5, 0, 0, -36, + -9, -18, -5, -16, 0, 0, -30, 0, + -12, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -8, -4, -8, 0, 0, + 0, 0, -10, 0, -10, 6, -5, 9, + 0, -3, -10, -3, -8, -9, 0, -5, + -2, -3, 3, -12, -1, 0, 0, 0, + -39, -4, -6, 0, -10, 0, -3, -21, + -4, 0, 0, -3, -4, 0, 0, 0, + 0, 3, 0, -3, -8, -3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, -10, 0, -3, 0, 0, 0, -9, + 4, 0, 0, 0, -12, -4, -9, 0, + 0, -13, 0, -4, 0, -21, 0, 0, + 0, 0, -43, 0, -9, -17, -22, 0, + 0, -30, 0, -3, -7, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -7, -2, + -7, 1, 0, 0, 8, -6, 0, 14, + 22, -4, -4, -13, 5, 22, 8, 10, + -12, 5, 19, 5, 13, 10, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 28, 21, -8, -4, 0, -4, + 36, 19, 36, 0, 0, 0, 4, 0, + 0, 17, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, -38, -5, -4, -18, + -22, 0, 0, -30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, -38, -5, -4, + -18, -22, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -10, 4, 0, -4, + 4, 8, 4, -13, 0, -1, -4, 4, + 0, 4, 0, 0, 0, 0, -11, 0, + -4, -3, -9, 0, -4, -18, 0, 28, + -4, 0, -10, -3, 0, -3, -8, 0, + -4, -13, -9, -5, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, -38, + -5, -4, -18, -22, 0, 0, -30, 0, + 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -14, -5, -4, 13, -4, -4, + -18, 1, -3, 1, -3, -12, 1, 10, + 1, 4, 1, 4, -11, -18, -5, 0, + -17, -9, -12, -19, -17, 0, -7, -9, + -5, -6, -4, -3, -5, -3, 0, -3, + -1, 7, 0, 7, -3, 0, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -4, -4, 0, 0, + -12, 0, -2, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, 0, 0, 0, -4, 0, 0, -8, + -4, 4, 0, -8, -9, -3, 0, -13, + -3, -10, -3, -5, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 14, 0, 0, -8, 0, + 0, 0, 0, -6, 0, -4, 0, 0, + -2, 0, 0, -3, 0, -10, 0, 0, + 19, -6, -15, -14, 3, 5, 5, -1, + -13, 3, 7, 3, 13, 3, 15, -3, + -12, 0, 0, -18, 0, 0, -13, -12, + 0, 0, -9, 0, -6, -8, 0, -7, + 0, -7, 0, -3, 7, 0, -4, -13, + -4, 17, 0, 0, -4, 0, -9, 0, + 0, 6, -10, 0, 4, -4, 4, 0, + 0, -15, 0, -3, -1, 0, -4, 5, + -4, 0, 0, 0, -18, -5, -10, 0, + -13, 0, 0, -21, 0, 17, -4, 0, + -8, 0, 3, 0, -4, 0, -4, -13, + 0, -4, 4, 0, 0, 0, 0, -3, + 0, 0, 4, -6, 1, 0, 0, -5, + -3, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 10, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -4, -4, 0, 0, 0, 9, 0, 10, + 0, 0, 0, 0, 0, -28, -26, 1, + 19, 13, 8, -18, 3, 19, 0, 17, + 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 1, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_28_compressed = { +#else +lv_font_t lv_font_montserrat_28_compressed = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 30, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_28_COMPRESSED*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_30.c b/inc/lvgl/src/font/lv_font_montserrat_30.c new file mode 100644 index 0000000..30e48eb --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_30.c @@ -0,0 +1,5723 @@ +/******************************************************************************* + * Size: 30 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 30 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_30.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_30 + #define LV_FONT_MONTSERRAT_30 1 +#endif + +#if LV_FONT_MONTSERRAT_30 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xaf, 0xfb, 0x9f, 0xfa, 0x9f, 0xfa, 0x8f, 0xf9, + 0x7f, 0xf8, 0x7f, 0xf8, 0x6f, 0xf7, 0x6f, 0xf6, + 0x5f, 0xf6, 0x4f, 0xf5, 0x4f, 0xf4, 0x3f, 0xf4, + 0x3f, 0xf3, 0x2f, 0xf3, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xb3, 0xcf, 0xfd, 0xdf, 0xfe, + 0x4e, 0xe4, + + /* U+0022 "\"" */ + 0x1f, 0xf6, 0x0, 0xaf, 0xd1, 0xff, 0x50, 0xa, + 0xfc, 0xf, 0xf5, 0x0, 0xaf, 0xc0, 0xff, 0x50, + 0x9, 0xfb, 0xf, 0xf4, 0x0, 0x9f, 0xb0, 0xff, + 0x40, 0x9, 0xfb, 0xf, 0xf3, 0x0, 0x8f, 0xa0, + 0xff, 0x30, 0x8, 0xfa, 0x1, 0x10, 0x0, 0x1, + 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x2f, 0xf0, 0x0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, + 0x0, 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xb0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf9, 0x0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0x70, 0x0, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x2, 0x22, 0x3f, 0xf3, 0x22, 0x22, + 0x6f, 0xd2, 0x22, 0x20, 0x0, 0x0, 0x2, 0xff, + 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x8f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0xa, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, + 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf7, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x0, + 0x0, 0x22, 0x22, 0xcf, 0x72, 0x22, 0x22, 0xff, + 0x52, 0x22, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x5f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0x7, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xb0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xf9, 0x0, 0x0, 0xb, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, + 0xdf, 0x40, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x3, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x2, 0xef, 0xff, 0xcc, 0xfc, + 0xbe, 0xff, 0xf3, 0x0, 0xbf, 0xfc, 0x20, 0x7f, + 0x70, 0x2, 0x9c, 0x0, 0x1f, 0xff, 0x10, 0x7, + 0xf7, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x7f, 0x70, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, + 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfd, 0x69, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf9, 0x8e, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x7, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, + 0x9f, 0xf5, 0x8, 0x10, 0x0, 0x7, 0xf7, 0x0, + 0xd, 0xff, 0x34, 0xfe, 0x71, 0x0, 0x7f, 0x70, + 0xa, 0xff, 0xd0, 0x8f, 0xff, 0xfc, 0xac, 0xfb, + 0xbf, 0xff, 0xf3, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x4, 0x9d, 0xef, + 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x5c, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xcd, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, + 0x3f, 0xe3, 0x0, 0x3e, 0xf2, 0x0, 0x0, 0x1, + 0xff, 0x40, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x7, + 0xf9, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x6f, + 0xd0, 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x1, + 0xfd, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xdf, 0x30, 0x0, 0x3, 0xfc, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x70, 0x0, 0x7, + 0xf9, 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xe2, 0x0, 0x3e, 0xf2, 0x2, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xcc, 0xff, + 0x70, 0xc, 0xf7, 0x0, 0x59, 0xa8, 0x20, 0x0, + 0x0, 0x5c, 0xff, 0xc5, 0x0, 0x8f, 0xc0, 0xc, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x20, 0xaf, 0xb2, 0x5, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, 0x1, 0xfe, + 0x0, 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xb0, 0x6, 0xf9, 0x0, 0x0, 0xf, 0xf0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x10, 0x8, 0xf6, + 0x0, 0x0, 0xd, 0xf2, 0x0, 0x0, 0x0, 0xe, + 0xf6, 0x0, 0x8, 0xf6, 0x0, 0x0, 0xc, 0xf2, + 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, 0x7, 0xf7, + 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, 0x4, 0xfe, + 0x10, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x3f, 0xd0, + 0x0, 0x0, 0x1e, 0xf5, 0x0, 0x0, 0x0, 0xcf, + 0x40, 0x0, 0xbf, 0x60, 0x0, 0x0, 0xaf, 0xa0, + 0x0, 0x0, 0x0, 0x2e, 0xfa, 0x9d, 0xfa, 0x0, + 0x0, 0x5, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xae, 0xfd, 0x70, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb4, + 0x23, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0xa, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1e, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, + 0x1, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf3, 0x5e, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfc, 0x35, 0xff, 0xf4, 0x0, 0x4, 0xc7, 0x0, + 0x9, 0xff, 0x90, 0x0, 0x4f, 0xff, 0x40, 0x9, + 0xfe, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0xe, 0xf9, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xaf, 0xf4, 0x0, 0xaf, 0xf3, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, + 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x80, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x4, + 0xdf, 0xff, 0xf6, 0x0, 0x9, 0xff, 0xfd, 0x86, + 0x78, 0xdf, 0xff, 0x8e, 0xff, 0x70, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x2, 0xef, 0xc0, + 0x0, 0x2, 0x7c, 0xef, 0xed, 0x95, 0x0, 0x0, + 0x2c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1f, 0xf6, 0x1f, 0xf5, 0xf, 0xf5, 0xf, 0xf5, + 0xf, 0xf4, 0xf, 0xf4, 0xf, 0xf3, 0xf, 0xf3, + 0x1, 0x10, + + /* U+0028 "(" */ + 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x5, 0xff, 0x60, + 0x0, 0xd, 0xfe, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xff, 0xd0, 0x0, + 0x4, 0xff, 0x80, 0x0, 0x7, 0xff, 0x50, 0x0, + 0xa, 0xff, 0x20, 0x0, 0xd, 0xff, 0x0, 0x0, + 0xf, 0xfd, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, + 0x2f, 0xfb, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfd, 0x0, 0x0, + 0xd, 0xff, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, + 0x7, 0xff, 0x50, 0x0, 0x4, 0xff, 0x80, 0x0, + 0x0, 0xef, 0xd0, 0x0, 0x0, 0xaf, 0xf2, 0x0, + 0x0, 0x4f, 0xf7, 0x0, 0x0, 0xd, 0xfe, 0x0, + 0x0, 0x5, 0xff, 0x60, 0x0, 0x0, 0xdf, 0xe0, + + /* U+0029 ")" */ + 0xc, 0xfe, 0x0, 0x0, 0x5, 0xff, 0x70, 0x0, + 0x0, 0xdf, 0xf1, 0x0, 0x0, 0x6f, 0xf6, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, 0xb, 0xff, 0x10, + 0x0, 0x6, 0xff, 0x60, 0x0, 0x3, 0xff, 0x90, + 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0xdf, 0xf0, + 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0xaf, 0xf2, + 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x8f, 0xf4, + 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x9f, 0xf3, + 0x0, 0x0, 0xaf, 0xf2, 0x0, 0x0, 0xbf, 0xf1, + 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, 0xff, 0xc0, + 0x0, 0x3, 0xff, 0x90, 0x0, 0x6, 0xff, 0x60, + 0x0, 0xb, 0xff, 0x10, 0x0, 0x1f, 0xfc, 0x0, + 0x0, 0x6f, 0xf6, 0x0, 0x0, 0xdf, 0xe1, 0x0, + 0x5, 0xff, 0x70, 0x0, 0xc, 0xfe, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0xe, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xe0, 0x0, 0x0, 0xc, 0x70, 0xe, 0xe0, + 0x7, 0xc0, 0x3f, 0xfe, 0x5e, 0xe5, 0xef, 0xf3, + 0x2, 0xaf, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x4, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x3e, 0xff, 0x7e, 0xe7, 0xff, 0xe3, + 0xd, 0xa1, 0xe, 0xe0, 0x1a, 0xd0, 0x0, 0x0, + 0xe, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x56, 0x66, 0x6b, 0xff, 0x66, 0x66, 0x62, 0x0, + 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, + + /* U+002C "," */ + 0x1, 0x41, 0x3, 0xff, 0xe1, 0x8f, 0xff, 0x55, + 0xff, 0xf4, 0x9, 0xff, 0x0, 0x8f, 0xa0, 0xc, + 0xf5, 0x0, 0xff, 0x0, 0x4f, 0xa0, 0x0, + + /* U+002D "-" */ + 0x27, 0x77, 0x77, 0x77, 0x64, 0xff, 0xff, 0xff, + 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xc0, + + /* U+002E "." */ + 0x0, 0x0, 0x1, 0xdf, 0xb0, 0x8f, 0xff, 0x58, + 0xff, 0xf4, 0x1b, 0xf9, 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x3, 0x9d, 0xff, 0xd9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xbb, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0xaf, 0xfe, 0x50, 0x0, + 0x5, 0xef, 0xfa, 0x0, 0x4, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x40, 0xb, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, 0xf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf4, + 0x6f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf6, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf8, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf8, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf8, 0x6f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf6, 0x4f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0xf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0xb, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, + 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x40, 0x0, 0xaf, 0xfe, 0x50, 0x0, 0x4, 0xef, + 0xfa, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xbb, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x3, 0x9d, + 0xff, 0xda, 0x30, 0x0, 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0x79, 0x99, 0x9f, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0xf, 0xff, + + /* U+0032 "2" */ + 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x1c, 0xff, 0xff, 0xcb, 0xbd, 0xff, 0xff, + 0x30, 0x3, 0xef, 0xe5, 0x0, 0x0, 0x4, 0xdf, + 0xfd, 0x0, 0x2, 0xa1, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x10, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, + + /* U+0033 "3" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0x99, 0x99, 0x99, 0x99, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, 0x80, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x11, 0x13, 0x8e, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, + 0x4f, 0xfa, 0x30, 0x0, 0x0, 0x1a, 0xff, 0xf1, + 0x9f, 0xff, 0xfe, 0xca, 0xbd, 0xff, 0xff, 0x50, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x4, 0x8c, 0xef, 0xfd, 0xb6, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x33, 0x20, 0x0, 0x0, 0x0, 0x7f, + 0xfc, 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x20, 0x0, 0x1, 0xff, 0xb0, 0x0, + 0x0, 0x1e, 0xff, 0x40, 0x0, 0x0, 0x1f, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x8, 0xff, 0xf9, 0x99, 0x99, + 0x99, 0x9f, 0xfe, 0x99, 0x96, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1f, 0xfd, 0x99, 0x99, 0x99, 0x99, + 0x90, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xfe, 0xb8, 0x20, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x89, 0x99, + 0x9a, 0xbd, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, + 0x0, 0xef, 0xd5, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x3f, 0xff, 0xff, 0xdb, 0xac, 0xff, 0xff, + 0xa0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xc9, 0x40, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x8, 0xff, 0xff, 0xca, 0x99, 0xcf, + 0xe0, 0x0, 0x6, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x13, 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x1, 0x7c, + 0xef, 0xec, 0x71, 0x0, 0x8, 0xff, 0x75, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x8f, 0xfb, 0xff, + 0xea, 0x77, 0x9e, 0xff, 0xf5, 0x8, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x9, 0xff, 0xe0, 0x7f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x65, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x1f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xa0, + 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x50, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x9, 0xff, + 0xd0, 0x0, 0x2e, 0xff, 0xea, 0x77, 0x9e, 0xff, + 0xf3, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xff, 0xeb, + 0x60, 0x0, 0x0, + + /* U+0037 "7" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x1f, 0xfe, 0x99, 0x99, 0x99, 0x99, 0x9e, + 0xff, 0x81, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf1, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xfa, 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x20, 0x5, 0x54, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x39, 0xce, 0xfe, 0xda, 0x50, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0xdf, 0xff, 0xb8, 0x78, 0xaf, 0xff, + 0xf3, 0x0, 0x7f, 0xfe, 0x30, 0x0, 0x0, 0x1a, + 0xff, 0xc0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x10, 0xef, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf3, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x10, 0x7f, 0xfc, 0x10, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0x96, + 0x45, 0x8d, 0xff, 0xe2, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x7f, 0xff, + 0x93, 0x10, 0x3, 0x7e, 0xff, 0xb0, 0x2f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x67, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0xaf, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xc1, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x7, 0xff, + 0xf5, 0x5, 0xff, 0xff, 0xa7, 0x67, 0x9e, 0xff, + 0xf9, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xdb, + 0x61, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x38, 0xde, 0xfe, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb7, 0x78, 0xcf, + 0xff, 0x80, 0x0, 0x6, 0xff, 0xd2, 0x0, 0x0, + 0x3, 0xdf, 0xf5, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0xf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x1f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0xf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf0, 0x3, 0xff, 0xfb, 0x41, 0x1, 0x5c, 0xff, + 0xff, 0xf0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xf0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xfb, 0x30, 0xff, 0xf0, 0x0, 0x0, 0x1, 0x46, + 0x64, 0x10, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf9, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xd0, 0x0, 0x0, 0x7f, 0xeb, 0xa9, 0xae, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, + 0xec, 0x82, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x1b, 0xfa, 0x8, 0xff, 0xf4, 0x8f, 0xff, 0x51, + 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfb, + 0x8, 0xff, 0xf5, 0x8f, 0xff, 0x41, 0xbf, 0x90, + + /* U+003B ";" */ + 0x1b, 0xfa, 0x8, 0xff, 0xf4, 0x8f, 0xff, 0x51, + 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, + 0x7, 0xff, 0xf4, 0x7f, 0xff, 0x51, 0xcf, 0xf1, + 0x7, 0xfc, 0x0, 0xbf, 0x70, 0xf, 0xf1, 0x3, + 0xfc, 0x0, 0x25, 0x20, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xdf, 0xf7, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xc3, 0x0, 0x2, 0x8e, 0xff, + 0xfe, 0x93, 0x0, 0x5, 0xbf, 0xff, 0xfb, 0x50, + 0x0, 0x0, 0xef, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003D "=" */ + 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x52, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+003E ">" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfd, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xf7, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xf9, 0x30, 0x0, 0x5b, + 0xff, 0xff, 0xc5, 0x0, 0x0, 0x8e, 0xff, 0xfe, + 0x82, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xb7, 0x10, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x1d, 0xff, 0xfe, 0xa9, 0x9c, 0xff, 0xff, 0x40, + 0x6f, 0xfd, 0x40, 0x0, 0x0, 0x2d, 0xff, 0xd0, + 0x3, 0xa0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x43, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xf9, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xdf, 0xff, + 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xcf, 0xfe, 0x94, 0x20, 0x0, 0x14, 0x7c, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xf8, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x2, 0x44, + 0x20, 0x0, 0x25, 0x50, 0x5f, 0xf4, 0x0, 0x0, + 0xcf, 0xc0, 0x0, 0x0, 0x7d, 0xff, 0xff, 0xd6, + 0x9, 0xff, 0x0, 0x7f, 0xe0, 0x0, 0x4f, 0xf2, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x9f, + 0xf0, 0x0, 0xcf, 0x70, 0xb, 0xfa, 0x0, 0x0, + 0xcf, 0xfc, 0x51, 0x2, 0x7e, 0xff, 0xff, 0x0, + 0x5, 0xfd, 0x0, 0xff, 0x40, 0x0, 0x7f, 0xfa, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0xe, + 0xf2, 0x4f, 0xf0, 0x0, 0xe, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0xbf, 0x56, + 0xfc, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf0, 0x0, 0x8, 0xf7, 0x8f, 0xa0, + 0x0, 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x0, 0x7f, 0x88, 0xfa, 0x0, 0x6, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, + 0x0, 0x7, 0xf8, 0x8f, 0xa0, 0x0, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x0, 0x0, + 0x8f, 0x76, 0xfc, 0x0, 0x1, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0xa, 0xf5, + 0x3f, 0xf0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x0, 0x0, 0xef, 0x20, 0xff, + 0x40, 0x0, 0x4f, 0xfd, 0x20, 0x0, 0x0, 0x5f, + 0xff, 0xf3, 0x0, 0x6f, 0xd0, 0xa, 0xfa, 0x0, + 0x0, 0x9f, 0xff, 0x95, 0x46, 0xbf, 0xf9, 0xff, + 0xc5, 0x7f, 0xf5, 0x0, 0x4f, 0xf2, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf6, 0xc, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xbf, 0xc0, 0x0, 0x0, 0x29, + 0xdf, 0xfd, 0x82, 0x0, 0x19, 0xef, 0xd6, 0x0, + 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xfe, 0x95, 0x21, 0x1, 0x36, 0xaf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, + 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xcd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x7f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x70, 0x9, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x4, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xb6, 0x66, 0x66, 0x66, 0x6c, 0xff, 0x90, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, + 0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0xc, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xc0, + + /* U+0042 "B" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0xdf, 0xf8, 0x66, 0x66, 0x66, + 0x8b, 0xff, 0xff, 0x30, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xfb, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf9, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x14, 0xaf, 0xfe, 0x10, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0xd, 0xff, 0x86, 0x66, 0x66, 0x67, 0x8b, 0xff, + 0xfb, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xf8, 0xd, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x2d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x1d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xb0, 0xdf, 0xf8, 0x66, 0x66, 0x66, + 0x78, 0xbf, 0xff, 0xf2, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xda, 0x50, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x5, 0x9d, 0xff, 0xed, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xba, 0xbd, 0xff, 0xff, 0xa0, 0x0, 0x1d, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x29, 0xff, 0xf3, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x40, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x40, 0x0, 0x1d, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x29, 0xff, 0xf3, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xba, 0xbd, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xed, 0x95, + 0x0, 0x0, + + /* U+0044 "D" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0x0, 0x0, 0xdf, 0xfa, 0x99, + 0x99, 0x9a, 0xce, 0xff, 0xff, 0xa0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xb0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x80, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x2d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf4, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x5d, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x2d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x80, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xb0, 0x0, 0xdf, 0xfa, 0x99, + 0x99, 0x9a, 0xce, 0xff, 0xff, 0xa0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x90, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x86, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x93, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+0046 "F" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xdf, 0xfa, 0x99, 0x99, 0x99, 0x99, + 0x96, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xca, 0xbd, 0xff, 0xff, 0xd1, 0x0, 0xc, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x17, 0xef, 0xf6, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0x70, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xa5, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x2f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x4, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0xc, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x5, 0xdf, 0xf9, 0x0, 0x1, 0xbf, 0xff, + 0xfe, 0xba, 0xbc, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x5, 0x9d, 0xff, 0xed, 0xa6, + 0x10, 0x0, + + /* U+0048 "H" */ + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3d, 0xff, 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xef, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x30, + + /* U+0049 "I" */ + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, 0xdf, 0xf2, + 0xdf, 0xf2, + + /* U+004A "J" */ + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x19, + 0x99, 0x99, 0x99, 0xdf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x1, 0xb1, 0x0, 0x0, 0x1, 0xff, 0xf2, 0xc, + 0xfd, 0x20, 0x0, 0xa, 0xff, 0xd0, 0xc, 0xff, + 0xfc, 0x99, 0xef, 0xff, 0x50, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xad, 0xff, + 0xd9, 0x20, 0x0, + + /* U+004B "K" */ + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xf7, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xf8, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xf9, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0xbf, 0xfc, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0xaf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0xaf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x35, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x7, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0xd, 0xff, + 0x40, 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xa0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x70, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, + + /* U+004C "L" */ + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+004D "M" */ + 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x7d, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x7d, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, 0xdf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x7d, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xf7, 0xdf, 0xf9, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xff, + 0x7d, 0xff, 0x1e, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x6f, 0xf8, 0x6f, 0xf7, 0xdf, 0xf0, 0x5f, 0xfa, + 0x0, 0x0, 0x0, 0xe, 0xfe, 0x6, 0xff, 0x7d, + 0xff, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x6f, 0xf7, 0xdf, 0xf0, 0x2, 0xff, 0xd0, + 0x0, 0x2, 0xff, 0xb0, 0x6, 0xff, 0x7d, 0xff, + 0x0, 0x8, 0xff, 0x60, 0x0, 0xbf, 0xf2, 0x0, + 0x6f, 0xf7, 0xdf, 0xf0, 0x0, 0xe, 0xff, 0x10, + 0x4f, 0xf8, 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, + 0x0, 0x5f, 0xf9, 0xd, 0xfe, 0x0, 0x0, 0x6f, + 0xf7, 0xdf, 0xf0, 0x0, 0x0, 0xbf, 0xfa, 0xff, + 0x50, 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x6f, 0xf7, + 0xdf, 0xf0, 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, + 0x0, 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, 0x0, + 0xe, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x7d, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xdf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x70, + + /* U+004E "N" */ + 0xdf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x3d, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xc, 0xff, 0x3d, + 0xff, 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0xdf, 0xf3, 0xdf, 0xfc, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x3d, 0xff, 0x22, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0xdf, 0xf2, 0x5, 0xff, + 0xf7, 0x0, 0x0, 0xc, 0xff, 0x3d, 0xff, 0x20, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0xcf, 0xf3, 0xdf, + 0xf2, 0x0, 0xb, 0xff, 0xe2, 0x0, 0xc, 0xff, + 0x3d, 0xff, 0x20, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0xcf, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0xc, 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, + 0x4f, 0xff, 0x70, 0xcf, 0xf3, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x4c, 0xff, 0x3d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0xef, 0xf3, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x3d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf3, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x3d, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa3, 0x0, + 0x0, 0x2, 0x8f, 0xff, 0xe2, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xd0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x80, 0xc, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf5, 0x5f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x98, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfb, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x92, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf5, 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x0, 0x4f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xa3, + 0x0, 0x0, 0x2, 0x8f, 0xff, 0xe2, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9d, 0xff, 0xfd, 0xa6, 0x10, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xd9, 0x40, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0xdf, 0xfa, 0x99, 0x99, 0x9a, 0xdf, + 0xff, 0xf4, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0x10, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xc0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, 0x1, + 0x49, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0xdf, 0xfa, + 0x99, 0x99, 0x98, 0x63, 0x0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfe, 0xba, 0xbd, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x29, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x80, 0x7f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, + 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xb0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, + 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x90, 0x2f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x0, 0x6, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, + 0x0, 0xcf, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xd0, 0x0, 0x0, 0x1e, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x17, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xfd, 0xa9, 0xac, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xff, 0xe6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0x2, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x92, 0x2, 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x54, 0x0, 0x0, + + /* U+0052 "R" */ + 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xd9, 0x40, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0xdf, 0xfa, 0x99, 0x99, 0x9a, 0xdf, + 0xff, 0xf4, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0x10, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0xdf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xc0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, 0x1, + 0x49, 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0xdf, 0xf9, + 0x88, 0x88, 0x89, 0xff, 0xd0, 0x0, 0x0, 0xdf, + 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0xdf, 0xf2, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xe1, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfb, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0xdf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf2, + + /* U+0053 "S" */ + 0x0, 0x0, 0x38, 0xce, 0xff, 0xeb, 0x72, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x1, 0xef, 0xff, 0xc9, 0x89, 0xbe, 0xff, + 0xf4, 0x0, 0xaf, 0xfc, 0x20, 0x0, 0x0, 0x3, + 0xad, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xae, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, + 0x9, 0x20, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x35, 0xff, 0x92, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xc0, 0x7f, 0xff, 0xfe, 0xb9, 0x89, 0xcf, 0xff, + 0xf3, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0x3, 0x7b, 0xdf, 0xfe, 0xd9, + 0x40, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x89, 0x99, 0x99, 0x9d, 0xff, 0xb9, + 0x99, 0x99, 0x94, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xb0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xa0, 0xef, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf9, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x7f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfc, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, 0xca, + 0xbd, 0xff, 0xff, 0x70, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x2, 0x8c, 0xef, 0xfe, 0xa6, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x20, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf4, 0x0, 0x7, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x1f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x60, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xfe, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x30, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, + 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf2, 0x0, 0x9f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x80, 0x1f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x7, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf7, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xa0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf4, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xdf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x3, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0xaf, 0xf3, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, + 0x0, 0xa, 0xff, 0x24, 0xff, 0x90, 0x0, 0x0, + 0x3, 0xff, 0xa0, 0x0, 0x0, 0x8f, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xc0, 0xe, 0xfe, 0x0, 0x0, + 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xd0, + 0x0, 0x0, 0x5f, 0xf7, 0x0, 0x9f, 0xf4, 0x0, + 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x30, 0x0, 0xa, 0xff, 0x10, 0x4, 0xff, 0x90, + 0x0, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x8f, + 0xf8, 0x0, 0x0, 0xff, 0xc0, 0x0, 0xe, 0xfe, + 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xd0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x9f, + 0xf4, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x30, 0xb, 0xff, 0x10, 0x0, 0x4, + 0xff, 0x90, 0x3, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf8, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0xe, 0xfe, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xd0, 0x6f, 0xf6, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0xe, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x3b, 0xff, 0x10, 0x0, + 0x0, 0x3, 0xff, 0xa4, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfa, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xe, 0xfe, 0x9f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xd0, 0x1, 0xef, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x30, 0x0, 0x5f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x9, + 0xff, 0xd0, 0x0, 0x0, 0x8, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x4f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x1, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xe1, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x6f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfd, 0xcf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x70, 0x6, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfc, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0xd, 0xff, + 0x80, 0x0, 0x0, 0x1e, 0xff, 0x50, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x8, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xf6, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x30, 0x3f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x9f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xe1, 0x0, + 0x1, 0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x60, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x10, 0x0, 0x6, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x1, + 0xef, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf4, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x3f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x7d, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x49, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x9d, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xc9, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x98, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0xdf, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf6, 0xdf, + 0xf6, 0x55, 0x2d, 0xff, 0x0, 0x0, 0xdf, 0xf0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, + 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, + 0xdf, 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, + 0xf0, 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0xd, 0xff, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0xd, + 0xff, 0x65, 0x52, 0xdf, 0xff, 0xff, 0x6d, 0xff, + 0xff, 0xf6, + + /* U+005C "\\" */ + 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf3, + + /* U+005D "]" */ + 0x7f, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xfd, 0x25, + 0x56, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, + 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, + 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, + 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, + 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, + 0xfd, 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, + 0x0, 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, + 0xff, 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, + 0xd0, 0x0, 0xf, 0xfd, 0x0, 0x0, 0xff, 0xd2, + 0x55, 0x6f, 0xfd, 0x7f, 0xff, 0xff, 0xd7, 0xff, + 0xff, 0xfd, + + /* U+005E "^" */ + 0x0, 0x0, 0x4, 0x87, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xff, 0x19, + 0xfa, 0x0, 0x0, 0x0, 0x9, 0xfa, 0x2, 0xff, + 0x10, 0x0, 0x0, 0xf, 0xf4, 0x0, 0xbf, 0x70, + 0x0, 0x0, 0x6f, 0xd0, 0x0, 0x5f, 0xe0, 0x0, + 0x0, 0xdf, 0x60, 0x0, 0xe, 0xf5, 0x0, 0x4, + 0xff, 0x0, 0x0, 0x8, 0xfc, 0x0, 0xb, 0xf9, + 0x0, 0x0, 0x1, 0xff, 0x20, 0x2f, 0xf2, 0x0, + 0x0, 0x0, 0xaf, 0x90, 0x8f, 0xc0, 0x0, 0x0, + 0x0, 0x4f, 0xf1, + + /* U+005F "_" */ + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x1c, 0xff, 0xa0, 0x0, 0x0, 0x9, 0xff, 0xa0, + 0x0, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x3, + 0xef, 0xb0, + + /* U+0061 "a" */ + 0x0, 0x4, 0x9d, 0xef, 0xec, 0x82, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xc, + 0xff, 0xea, 0x88, 0x9e, 0xff, 0xf4, 0x0, 0x3e, + 0x50, 0x0, 0x0, 0xa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x19, 0xff, 0x50, 0x2, 0x9d, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x51, 0xff, 0xf8, 0x20, 0x0, + 0x0, 0x8f, 0xf5, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x57, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xbf, 0xf5, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x50, 0xef, 0xf9, 0x31, 0x14, 0xaf, 0xff, + 0xf5, 0x3, 0xef, 0xff, 0xff, 0xff, 0xd8, 0xff, + 0x50, 0x1, 0x8c, 0xff, 0xec, 0x70, 0x6f, 0xf5, + + /* U+0062 "b" */ + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x1, 0x8c, 0xef, 0xea, 0x50, 0x0, 0x0, 0x4f, + 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x4f, 0xfd, 0xff, 0xfb, 0x99, 0xcf, 0xff, 0xf2, + 0x0, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x2, 0xcf, + 0xfd, 0x0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xd0, 0x4f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xd0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x70, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x2, + 0xcf, 0xfd, 0x0, 0x4f, 0xfc, 0xff, 0xfb, 0x89, + 0xbf, 0xff, 0xf2, 0x0, 0x4f, 0xf7, 0x5f, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x4f, 0xf7, 0x1, + 0x8c, 0xff, 0xda, 0x40, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc7, 0x10, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x8f, 0xff, 0xea, 0x89, 0xdf, 0xff, 0x70, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x46, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x46, 0x0, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x8f, 0xff, 0xea, 0x89, 0xdf, 0xff, 0x70, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc8, 0x20, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x28, 0xdf, 0xfe, + 0xa4, 0x2, 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfb, 0x3f, 0xfb, 0x0, 0xaf, 0xff, 0xea, + 0x8a, 0xef, 0xfd, 0xff, 0xb0, 0x7f, 0xff, 0x70, + 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x1f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb6, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x9f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xbb, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xbf, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xb9, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x6f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xb1, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfb, 0x7, 0xff, 0xe4, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xb0, 0xa, 0xff, 0xfb, 0x75, 0x7b, 0xff, + 0xdf, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0xff, 0xb0, 0x0, 0x2, 0x8c, 0xef, 0xea, + 0x50, 0xf, 0xfb, + + /* U+0065 "e" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0xaf, 0xff, 0xb7, 0x79, 0xef, 0xfe, + 0x20, 0x0, 0x6f, 0xfd, 0x20, 0x0, 0x0, 0x8f, + 0xfc, 0x0, 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x5, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x9f, 0xf4, 0x11, 0x11, 0x11, + 0x11, 0x1c, 0xfe, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x19, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x6, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x8f, 0x40, 0x0, 0x9, + 0xff, 0xfe, 0xa8, 0x8b, 0xff, 0xfd, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x1, 0x7b, 0xef, 0xfd, 0x94, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x5, 0xbe, 0xfd, 0x92, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf6, 0x0, 0x5, 0xff, 0xf8, + 0x68, 0xc0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x36, 0x6e, 0xff, 0x66, 0x66, 0x30, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x28, 0xce, 0xfe, 0xb5, 0x0, 0xcf, + 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x2c, + 0xff, 0x0, 0xbf, 0xff, 0xea, 0x89, 0xcf, 0xfe, + 0xef, 0xf0, 0x8f, 0xff, 0x60, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xf6, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xaf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfb, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xbf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x4f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0xdf, 0xfb, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x2, 0xff, + 0xfd, 0x62, 0x1, 0x4b, 0xff, 0xff, 0xf0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0x0, + 0x1, 0xaf, 0xff, 0xff, 0xfe, 0x50, 0xff, 0xe0, + 0x0, 0x0, 0x4, 0x67, 0x63, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xa0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf5, 0x2, 0xfd, 0x50, 0x0, 0x0, 0x1, 0xaf, + 0xfe, 0x0, 0xaf, 0xff, 0xfb, 0x98, 0x9b, 0xff, + 0xff, 0x40, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, + 0xa6, 0x0, 0x0, + + /* U+0068 "h" */ + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x2, 0x8d, 0xef, 0xea, 0x40, 0x0, + 0x4f, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x4f, 0xfe, 0xff, 0xea, 0x9a, 0xef, 0xff, 0x90, + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xf2, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xf8, + 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + + /* U+0069 "i" */ + 0x2d, 0xe7, 0xb, 0xff, 0xf0, 0x9f, 0xfe, 0x1, + 0x9a, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, + 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, + 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, + 0x4f, 0xf9, 0x4, 0xff, 0x90, 0x4f, 0xf9, 0x4, + 0xff, 0x90, 0x4f, 0xf9, 0x4, 0xff, 0x90, + + /* U+006A "j" */ + 0x0, 0x0, 0x1, 0xcf, 0x90, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x8a, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, + 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, + 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, + 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, + 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, + 0xc0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, + 0x2, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x8, 0xff, 0x80, 0x1e, 0x97, 0xaf, + 0xff, 0x20, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x3a, + 0xdf, 0xfb, 0x40, 0x0, + + /* U+006B "k" */ + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf4, 0x4, 0xff, 0x90, 0x0, 0x0, + 0x5, 0xff, 0xf4, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf4, 0x0, 0x4, 0xff, 0x90, 0x0, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x4, 0xff, 0x90, + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xbc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xd1, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0x0, 0x8f, 0xff, 0x20, 0x0, + 0x4, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xfd, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x1, 0xdf, 0xfa, + 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x2, 0xff, + 0xf7, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe1, + + /* U+006C "l" */ + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, 0x4f, 0xf9, + 0x4f, 0xf9, 0x4f, 0xf9, + + /* U+006D "m" */ + 0x4f, 0xf7, 0x3, 0x9d, 0xff, 0xd8, 0x20, 0x0, + 0x6, 0xbe, 0xfe, 0xc7, 0x0, 0x0, 0x4f, 0xf7, + 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x4f, 0xfe, 0xff, 0xc8, + 0x78, 0xef, 0xff, 0x8f, 0xff, 0xa7, 0x79, 0xff, + 0xfe, 0x10, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1d, 0xff, 0x80, + 0x4f, 0xff, 0x60, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x4f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf0, 0x4f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf1, 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf2, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + + /* U+006E "n" */ + 0x4f, 0xf7, 0x3, 0x9d, 0xef, 0xea, 0x40, 0x0, + 0x4f, 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x4f, 0xfe, 0xff, 0xd8, 0x77, 0xcf, 0xff, 0x90, + 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x5, 0xff, 0xf2, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xf8, + 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x4f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, + + /* U+006F "o" */ + 0x0, 0x0, 0x17, 0xce, 0xff, 0xc8, 0x10, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xea, 0x8a, 0xef, 0xff, + 0xa0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x6f, + 0xff, 0x60, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x15, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf6, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xab, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfc, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xc9, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x5f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x60, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x5, 0xff, + 0xf6, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x9, + 0xff, 0xfe, 0x98, 0x9d, 0xff, 0xf9, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0x7c, 0xef, 0xfc, 0x81, 0x0, 0x0, + + /* U+0070 "p" */ + 0x4f, 0xf7, 0x2, 0x8d, 0xef, 0xea, 0x50, 0x0, + 0x0, 0x4f, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x4f, 0xfd, 0xff, 0xe9, 0x67, 0x9f, + 0xff, 0xf2, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x1, 0xbf, 0xfd, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x70, 0x4f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xd0, 0x4f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf2, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf1, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd0, 0x4f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x70, 0x4f, 0xff, 0xfb, 0x10, + 0x0, 0x2, 0xdf, 0xfd, 0x0, 0x4f, 0xfd, 0xff, + 0xfb, 0x89, 0xbf, 0xff, 0xf2, 0x0, 0x4f, 0xf9, + 0x5e, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x4f, + 0xf9, 0x1, 0x8c, 0xef, 0xda, 0x40, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x28, 0xdf, 0xfe, 0xa4, 0x0, 0xff, + 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfb, 0x1f, + 0xfb, 0x0, 0xaf, 0xff, 0xea, 0x8a, 0xef, 0xfc, + 0xff, 0xb0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x6f, + 0xff, 0xfb, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xb6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xbb, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfb, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xb9, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfb, 0x6f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xb1, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0x7, 0xff, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xb0, 0xa, + 0xff, 0xfe, 0x98, 0x9d, 0xff, 0xdf, 0xfb, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xb0, + 0x0, 0x2, 0x8c, 0xef, 0xea, 0x40, 0x2f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfb, + + /* U+0072 "r" */ + 0x4f, 0xf7, 0x2, 0x8d, 0xe4, 0x4f, 0xf7, 0x6f, + 0xff, 0xf4, 0x4f, 0xfc, 0xff, 0xfd, 0xc3, 0x4f, + 0xff, 0xfb, 0x20, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x4f, 0xfc, + 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, + 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf9, + 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb7, 0x20, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2, + 0xff, 0xfd, 0x97, 0x79, 0xdf, 0xf1, 0x0, 0x9f, + 0xf9, 0x0, 0x0, 0x0, 0x35, 0x0, 0xb, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xc9, 0x40, 0x0, 0x0, 0x3, 0xae, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x1, 0x47, + 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf1, 0x6, 0xc4, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x0, 0xef, 0xfe, 0xa8, 0x78, 0xbf, 0xff, + 0x80, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x1, 0x7b, 0xdf, 0xfe, 0xc9, 0x30, 0x0, + + /* U+0074 "t" */ + 0x0, 0x6, 0x88, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x36, 0x6e, 0xff, 0x66, + 0x66, 0x30, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x79, 0xe1, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x6, 0xcf, 0xfd, 0x81, + + /* U+0075 "u" */ + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, + 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, + 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, 0xf8, + 0x3, 0xff, 0xfe, 0x86, 0x7a, 0xff, 0xef, 0xf8, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x4f, 0xf8, + 0x0, 0x1, 0x8c, 0xff, 0xeb, 0x50, 0x3f, 0xf8, + + /* U+0076 "v" */ + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf2, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x40, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, + 0x40, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x3, + 0xff, 0xb0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xf2, 0x0, 0x4, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5f, 0xf8, 0x0, 0xb, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x2f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0x9f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd1, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x94, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x5f, 0xf3, 0xe, 0xfc, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xfd, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x1, 0xff, 0x70, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x5f, 0xf8, 0xff, 0x60, 0x0, + 0x0, 0x7f, 0xf2, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0xb, 0xfd, 0xd, 0xfc, 0x0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x2, 0xff, 0x70, + 0x8f, 0xf2, 0x0, 0x3, 0xff, 0x60, 0x0, 0x1, + 0xff, 0xa0, 0x0, 0x8f, 0xf1, 0x2, 0xff, 0x80, + 0x0, 0x9f, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x0, + 0xd, 0xfb, 0x0, 0xb, 0xfe, 0x0, 0xe, 0xfa, + 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x4, 0xff, 0x50, + 0x0, 0x5f, 0xf4, 0x5, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0xaf, 0xe0, 0x0, 0x0, 0xff, + 0x90, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x2f, 0xf9, 0x0, 0x0, 0x9, 0xff, 0x1f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0xff, 0x20, + 0x0, 0x0, 0x3f, 0xfc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, + + /* U+0078 "x" */ + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0xbf, 0xf6, + 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xfa, + 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x3f, 0xfd, + 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x1e, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0xb, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfc, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x10, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x40, 0x0, 0xbf, 0xf6, 0x0, 0x0, 0xa, + 0xff, 0x80, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x6, + 0xff, 0xc0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0x3, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, + + /* U+0079 "y" */ + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf2, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xb0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x40, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0x0, 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, + 0x50, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x3, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xf2, 0x0, 0x3, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5f, 0xf9, 0x0, 0xa, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x70, 0x8f, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x6f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xe9, 0x7a, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfd, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x36, 0x66, + 0x66, 0x66, 0x6c, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x75, 0x55, 0x55, + 0x55, 0x52, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+007B "{" */ + 0x0, 0x0, 0x19, 0xef, 0xf0, 0x0, 0x1e, 0xff, + 0xff, 0x0, 0x9, 0xff, 0xe7, 0x50, 0x0, 0xcf, + 0xf4, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, + 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x4f, + 0xff, 0xc2, 0x0, 0x1, 0x6a, 0xff, 0xc0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xef, 0xf0, + 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0xef, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0xef, 0xf0, 0x0, 0x0, 0xd, 0xff, 0x30, + 0x0, 0x0, 0x9f, 0xfe, 0x75, 0x0, 0x2, 0xef, + 0xff, 0xf0, 0x0, 0x2, 0xae, 0xff, + + /* U+007C "|" */ + 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, + 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, + 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, + 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, + 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, + 0xdd, 0xfd, + + /* U+007D "}" */ + 0x7f, 0xfc, 0x60, 0x0, 0x7, 0xff, 0xff, 0x90, + 0x0, 0x26, 0xaf, 0xff, 0x20, 0x0, 0x0, 0xbf, + 0xf5, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, + 0x0, 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, + 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, + 0x70, 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x0, 0x4, + 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, + 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x3f, 0xfe, 0x74, + 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xf7, + 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, 0x7f, + 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, + 0x0, 0x7f, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x60, + 0x2, 0x6a, 0xff, 0xf2, 0x0, 0x7f, 0xff, 0xf9, + 0x0, 0x7, 0xff, 0xc6, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x4c, 0xfe, 0x80, 0x0, 0x0, 0x3f, 0xa0, + 0x4f, 0xff, 0xff, 0xd2, 0x0, 0x7, 0xf8, 0xd, + 0xfc, 0x46, 0xef, 0xf6, 0x4, 0xef, 0x41, 0xff, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xb0, 0x3f, 0xb0, + 0x0, 0x0, 0x5c, 0xfe, 0x90, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x3, 0x78, 0x61, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xf6, 0x0, 0xb, 0xf8, 0x20, 0x4d, 0xf5, + 0x4, 0xf8, 0x0, 0x0, 0x1e, 0xd0, 0x9f, 0x20, + 0x0, 0x0, 0x9f, 0x29, 0xf1, 0x0, 0x0, 0x8, + 0xf2, 0x7f, 0x50, 0x0, 0x0, 0xcf, 0x1, 0xfe, + 0x20, 0x0, 0x8f, 0x90, 0x4, 0xff, 0xca, 0xef, + 0xc0, 0x0, 0x2, 0xae, 0xfd, 0x70, 0x0, + + /* U+2022 "•" */ + 0x0, 0x26, 0x40, 0x0, 0x5f, 0xff, 0xb0, 0xd, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xf5, 0xa, 0xff, + 0xff, 0x10, 0x1a, 0xfd, 0x40, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x72, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, + 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x53, 0xef, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x16, 0x99, + 0x8c, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x3, 0xae, 0xff, + 0xfc, 0x60, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xac, 0xdc, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x26, 0x0, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x62, 0xee, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xee, 0xff, 0xba, + 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0x48, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xb4, 0x44, 0xff, 0xfe, 0x0, 0x3, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, + 0x0, 0xef, 0xfe, 0x0, 0x3, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, + 0xef, 0xff, 0x10, 0x5, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xee, 0xff, 0xfe, 0x0, + 0x4, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xad, 0xff, 0x90, 0x0, 0xef, 0xfe, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xef, 0xfe, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xef, 0xff, 0x76, 0x6a, 0xff, 0xc2, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x28, 0xff, 0xc6, + 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x98, 0x8b, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd8, 0x88, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0xef, 0xfe, + 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x80, 0x0, 0xef, 0xfe, 0x0, + 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x80, 0x0, 0xef, 0xff, 0xcc, 0xce, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x32, 0x27, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x22, 0xff, 0x9d, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xd9, + + /* U+F00B "" */ + 0x26, 0x77, 0x77, 0x76, 0x0, 0x4, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x62, 0xef, + 0xff, 0xff, 0xff, 0x90, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x50, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0x90, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x27, + 0x88, 0x88, 0x87, 0x10, 0x5, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x88, 0x88, + 0x87, 0x10, 0x6, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x83, 0xef, 0xff, 0xff, 0xff, + 0xa0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xfe, 0x40, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x6, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xa3, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F00D "" */ + 0x0, 0x67, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0x30, 0x0, 0xbf, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x50, 0x9f, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x3f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf9, 0xbf, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x51, 0xcf, 0xff, 0xff, + 0xfd, 0x10, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x1, + 0xcf, 0xff, 0xff, 0xfd, 0x7f, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x71, 0xcf, 0xff, 0xff, 0xfd, 0x10, + 0x5f, 0xff, 0xff, 0xff, 0x70, 0x1, 0xcf, 0xff, + 0xff, 0xfd, 0x1e, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xf8, 0xdf, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x73, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xc0, 0x4, 0xef, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x10, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, + 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xc0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x5, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfa, 0x0, + 0x2f, 0xff, 0xf9, 0x0, 0x3f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf4, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, + 0xf9, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x10, 0x2, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, 0x8, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf5, 0x2f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf9, 0x5f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfc, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x6f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6, 0xbb, 0xa1, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x3f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfb, 0xf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf2, 0x4, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0xcf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x30, 0x0, 0x2f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, + 0x0, 0x17, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xeb, 0x99, 0xad, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xef, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xcc, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x12, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x70, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7, 0xff, 0x30, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x11, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x99, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x8, 0xff, 0xe7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x7e, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x99, 0x10, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x32, 0x0, 0x0, 0x0, 0x34, 0x44, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xb1, 0x0, 0x1, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x20, 0x1, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x1, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xfc, 0x24, 0xef, 0xff, + 0xfb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xa0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf7, 0x0, 0x75, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x50, 0x1b, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xe3, 0x2, + 0xdf, 0xff, 0xfb, 0x0, 0x5f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfc, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x1c, + 0xff, 0xff, 0xd2, 0x0, 0x8, 0xff, 0xff, 0xf7, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xaf, 0xff, 0xff, 0x40, 0xaf, 0xff, 0xff, + 0x40, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x7, 0xff, 0xff, 0xf6, 0xcf, 0xff, + 0xd2, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x5f, 0xff, 0xf8, 0x2e, + 0xfb, 0x10, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xc0, + 0x3, 0x70, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x18, + 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xa7, 0x77, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xcd, + 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdc, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x77, 0x77, 0x77, 0x77, + 0x10, 0x4f, 0xff, 0xf5, 0x1, 0x77, 0x77, 0x77, + 0x77, 0x62, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x4, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x22, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x8f, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, + 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa5, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x2, 0x9b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe1, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x50, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xe1, 0xcf, 0xff, 0xd4, 0x44, 0x44, + 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, + 0x44, 0x4f, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x88, 0x88, + 0x88, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0xab, 0xdd, 0xb8, + 0x40, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x92, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0xff, 0xff, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xb8, 0x66, 0x8c, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xd, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x9f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x22, 0x10, 0xd, 0xff, 0xff, 0xff, 0x8, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2e, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x22, 0x10, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xec, 0xcd, + 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x50, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, + 0x0, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0x90, 0x0, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x14, + 0x9f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x1, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xd9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x2, 0x43, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x9, 0xc4, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x2, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xb, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x4f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xef, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xef, 0xfb, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfd, 0x10, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x36, 0x0, 0x0, 0x44, 0x44, 0x44, 0x7f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x4, + 0x92, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0x50, 0x0, 0xdf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x9, 0xff, + 0x70, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xc0, 0x2, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xad, 0x40, 0x0, 0xef, 0xf4, + 0x0, 0xcf, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2, 0xff, 0xf5, 0x0, 0x6f, + 0xf9, 0x0, 0x7f, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x0, + 0xf, 0xfe, 0x0, 0x4f, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, + 0x60, 0xc, 0xff, 0x0, 0x2f, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4, + 0xff, 0x80, 0xb, 0xff, 0x10, 0x1f, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x6, 0xff, 0x70, 0xc, 0xff, 0x10, 0x2f, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x3e, 0xff, 0x30, 0xe, 0xff, 0x0, 0x3f, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xff, 0xfb, 0x0, 0x3f, 0xfc, 0x0, + 0x6f, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1, 0xff, 0xc1, 0x0, 0xaf, 0xf7, + 0x0, 0xaf, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x35, 0x0, 0x4, 0xff, + 0xf1, 0x0, 0xef, 0xf0, 0x4, 0x44, 0x44, 0x47, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x70, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x6, + 0xff, 0xfc, 0x0, 0xd, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xc1, 0x0, 0x8f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0xc, 0xf9, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x3f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0x60, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x45, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x54, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x1c, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xc, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, + 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xd0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xcf, + 0xff, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xff, 0xf8, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x2f, 0xff, 0xf4, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x9f, + 0xff, 0xf4, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0x50, 0x1, 0xef, 0xff, 0xfb, 0x41, 0xc, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9a, + 0xba, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x4, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x10, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xf2, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf7, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xf0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf8, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0x2e, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xba, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x34, 0x44, 0x44, 0x41, 0x0, 0x0, 0x0, + 0x3, 0x44, 0x44, 0x44, 0x10, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x29, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9, + 0xef, 0xff, 0xff, 0xeb, 0x20, 0x0, 0x0, 0x9e, + 0xff, 0xff, 0xfe, 0xb2, 0x0, + + /* U+F04D "" */ + 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, + + /* U+F051 "" */ + 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x40, 0x2e, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x6f, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xe, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xe, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x7f, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf4, 0x6f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0xa, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x6a, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x20, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0x10, 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x56, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x11, 0x11, 0xbf, 0xff, 0xff, 0x11, + 0x11, 0x11, 0x11, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x17, 0x99, 0x99, 0x99, 0x99, 0xdf, 0xff, 0xff, + 0x99, 0x99, 0x99, 0x99, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xde, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x17, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x82, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x89, + 0xaa, 0x87, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfd, 0x84, 0x23, 0x49, 0xef, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x5, 0xdd, 0x93, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x80, 0x0, 0xcf, 0xff, 0xff, 0xf6, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf6, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x30, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x10, 0xf, 0xff, 0xff, + 0xff, 0xc0, 0xaf, 0xff, 0xff, 0xff, 0x80, 0x5, + 0x44, 0x9f, 0xff, 0xff, 0xff, 0x50, 0xc, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xb, + 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, + 0x80, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xc, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, + 0xff, 0xa0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0xe, 0xff, 0xff, 0xff, 0xe1, 0x9, 0xff, + 0xff, 0xff, 0xe0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0xff, 0xf5, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xfd, 0x0, 0x3, 0xdf, + 0xff, 0xfb, 0x10, 0x3, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x2, 0x55, 0x10, 0x0, 0x1e, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf8, 0x20, 0x0, 0x3, 0xaf, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7a, 0xde, 0xff, 0xec, + 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x4, 0x79, 0xa9, 0x87, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xb1, 0x2, 0x8c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfd, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x23, 0x59, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xe3, 0x6, 0xdc, + 0x92, 0x0, 0x9, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x54, 0xff, 0xff, 0x60, 0x0, 0xef, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6, 0xf5, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xf5, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x2f, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x10, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x30, 0xe, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xfe, 0xde, 0xc1, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xff, + 0xec, 0x80, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0x20, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x11, 0x11, + 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdc, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb5, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x81, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x7c, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf6, 0x0, 0x8a, 0xaa, 0xaa, 0xa7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xaa, 0xdf, + 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xf5, 0x2, 0xef, 0xff, + 0xff, 0x40, 0x8f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0x70, 0x1e, 0xff, 0xff, 0xf4, + 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xe8, 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x1d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1a, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x90, 0x1a, 0x10, 0x0, 0x5f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, + 0xcf, 0xd1, 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, 0xb, 0xff, + 0xfc, 0x0, 0x8f, 0xff, 0xf6, 0x0, 0x8a, 0xaa, + 0xab, 0xff, 0xff, 0xfb, 0x0, 0x5f, 0xff, 0xff, + 0xca, 0xdf, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xef, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xde, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xa6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0x0, 0x6f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x30, 0x1d, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xf3, 0x9f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfd, 0x6f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfa, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0x0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xde, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xce, 0x40, 0x1e, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf4, 0x9f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xf9, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x7f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf3, 0x0, 0x1d, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x31, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x2a, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0x90, 0x0, 0x5, 0xab, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xf9, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x3f, 0xff, 0xfe, 0xff, 0xfe, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xe4, + 0xff, 0xf9, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x3f, 0xfe, 0x22, 0xff, 0xf9, 0xa, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x10, 0x0, 0x0, 0x3, 0x82, 0x2, 0xff, 0xf9, + 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0xaf, 0xff, 0x10, + 0x2, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x40, + 0xaf, 0xff, 0x10, 0xcf, 0xb0, 0x0, 0x0, 0x2, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0xaf, 0xff, 0x1c, 0xff, 0xf7, + 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xdf, 0xff, + 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x2e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x2, 0x68, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xca, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xec, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, + 0x33, 0x3e, 0xff, 0xff, 0xff, 0xa3, 0x33, 0x32, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x77, 0x77, 0x77, 0x72, + 0xe, 0xff, 0xff, 0xff, 0x90, 0x27, 0x77, 0x77, + 0x77, 0x62, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xb, + 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x45, + 0x55, 0x53, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x8f, 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, + 0x60, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa5, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xc8, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0xd1, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x73, 0xbf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xba, 0x98, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x2, 0x79, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x8a, 0x83, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xff, + 0xa3, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf5, 0xf, 0xff, 0xe0, 0x0, 0xaf, + 0xff, 0x20, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xff, 0xfd, 0x0, 0x9, 0xff, 0xf3, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xd, 0xff, + 0xf5, 0x2, 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0xff, + 0xff, 0xf2, 0x7, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe8, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xde, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0x9b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xb, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x37, 0xff, 0xff, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0xa, 0xff, 0xf2, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0xf, 0xff, 0xd0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0xb, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xdf, 0xff, 0x50, 0x2f, 0xff, 0xf1, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xe2, 0x7, 0xff, + 0xff, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xe1, 0xd, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfd, 0x10, 0x2d, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xce, 0xd8, 0x0, 0x0, + 0x7, 0xbd, 0xc8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8f, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x8, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x8, 0xff, 0xff, + 0xd0, 0x16, 0x66, 0x64, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x59, 0x99, 0x99, 0xd, 0xff, + 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfa, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xfa, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xa0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xfa, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xa0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xfc, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xe6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x40, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x3, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x96, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xff, 0xfe, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7f, + 0xff, 0xfd, 0x10, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, + 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x9, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0x0, + + /* U+F0C9 "" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x24, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0xc3, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x5f, 0xff, + 0x70, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x9, 0xff, 0xff, 0xfb, + 0x10, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xe4, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x2d, 0xff, 0xff, 0xff, 0xd2, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x9f, 0xff, 0xf9, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x3, + 0x99, 0x30, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xaa, 0xaa, 0xaa, 0x92, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x6, 0xcd, 0xdd, 0xdd, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x13, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x66, 0x66, 0xcf, 0xff, + 0xff, 0xb6, 0x66, 0x65, 0x10, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0x29, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x54, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfb, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xe0, 0x8b, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x8, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x8f, 0xfc, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, + 0xfe, 0x8, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8f, + 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0x80, 0x7f, + 0xff, 0xff, 0xff, 0xfe, 0x5, 0xaa, 0xaa, 0xa0, + 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x82, + 0x22, 0x22, 0x20, 0xff, 0xff, 0xff, 0xf8, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0x80, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xf8, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x11, 0x55, 0x55, 0x55, 0x20, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xab, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, + 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfd, 0x10, 0x1d, + 0xf5, 0x0, 0x1f, 0xf2, 0x0, 0x4f, 0xe1, 0x1, + 0xef, 0x40, 0x2, 0xff, 0xfc, 0xff, 0xfc, 0x0, + 0xb, 0xf2, 0x0, 0xe, 0xf0, 0x0, 0x1f, 0xc0, + 0x0, 0xcf, 0x10, 0x0, 0xff, 0xfc, 0xff, 0xfc, + 0x0, 0xb, 0xf2, 0x0, 0xe, 0xf0, 0x0, 0x1f, + 0xc0, 0x0, 0xcf, 0x10, 0x0, 0xff, 0xfc, 0xff, + 0xfd, 0x0, 0xd, 0xf4, 0x0, 0x1f, 0xf2, 0x0, + 0x3f, 0xe0, 0x0, 0xef, 0x30, 0x2, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xfe, + 0xef, 0xff, 0xee, 0xef, 0xff, 0xee, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, + 0x20, 0x1, 0xff, 0x0, 0x6, 0xf6, 0x0, 0xd, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xcf, 0x10, 0x0, 0xff, 0x0, 0x5, 0xf5, 0x0, + 0xd, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xcf, 0x10, 0x0, 0xff, 0x0, 0x5, 0xf5, + 0x0, 0xd, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xb2, 0x23, 0xef, 0x52, 0x24, 0xff, 0x32, 0x29, + 0xf9, 0x22, 0x3e, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xbb, 0xbf, 0xfd, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbc, 0xff, 0xdb, 0xbd, 0xff, 0xfc, + 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, 0x0, 0xff, + 0xfc, 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x10, 0x0, + 0xff, 0xfc, 0xff, 0xfc, 0x0, 0xb, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0xff, 0xfc, 0xff, 0xff, 0xcc, 0xcf, 0xfd, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, + 0xdc, 0xcd, 0xff, 0xfc, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x59, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xaa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x26, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, 0x6, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0xfd, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xfd, + 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0xff, 0xfd, 0x10, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xfd, + 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0xff, 0xff, 0xfd, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x45, 0x65, 0x43, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xb8, 0x65, 0x55, 0x67, 0x9c, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7f, 0xff, + 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xf7, 0x6f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xc1, 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, 0x3, + 0x8b, 0xdf, 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, + 0x0, 0x1c, 0xfc, 0x10, 0x0, 0x43, 0x0, 0x0, + 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x40, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xec, 0xbc, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, 0x61, + 0x0, 0x0, 0x0, 0x48, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x98, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xdc, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x40, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x6, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x3, 0x88, 0x88, 0x88, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x5, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xff, 0xfa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfa, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf7, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7c, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xac, 0xcf, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa5, 0x5e, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, + 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf3, 0x0, 0x0, 0x15, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x30, + 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0x70, 0x0, 0x0, 0xef, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf8, 0x0, + 0x7, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xfc, 0x30, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x32, 0x5f, 0xf7, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x2b, 0xff, 0xf9, + 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xaf, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1c, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf7, 0x0, 0x2e, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfa, 0x10, 0x0, 0x2, 0xbf, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x60, 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xef, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x2f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x33, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9d, 0xff, 0xff, 0xfd, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf9, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf7, 0x2e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xf7, 0x2, 0xef, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x3, 0xff, 0xff, 0xff, 0x80, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, 0x20, + 0x4f, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xa7, + 0xff, 0xf7, 0x2, 0xe2, 0x5, 0xff, 0xff, 0xf0, + 0xa, 0xff, 0xfc, 0x0, 0x6f, 0xf7, 0x1, 0xfe, + 0x20, 0x5f, 0xff, 0xf3, 0xc, 0xff, 0xff, 0x70, + 0x6, 0xf7, 0x1, 0xfc, 0x0, 0x8f, 0xff, 0xf6, + 0xe, 0xff, 0xff, 0xf7, 0x0, 0x67, 0x1, 0xc0, + 0x7, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf8, + 0xf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfa, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf9, 0xe, 0xff, 0xff, 0xf8, + 0x0, 0x47, 0x1, 0xa0, 0x6, 0xff, 0xff, 0xf7, + 0xc, 0xff, 0xff, 0x80, 0x4, 0xf7, 0x1, 0xfa, + 0x0, 0x7f, 0xff, 0xf6, 0xa, 0xff, 0xfc, 0x0, + 0x4f, 0xf8, 0x1, 0xfe, 0x20, 0x2e, 0xff, 0xf4, + 0x7, 0xff, 0xff, 0x95, 0xff, 0xf8, 0x2, 0xe3, + 0x2, 0xef, 0xff, 0xf1, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0x30, 0x2e, 0xff, 0xff, 0xd0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xf9, 0x3, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf9, 0x3e, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x58, 0xbc, 0xdd, 0xca, + 0x61, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0x77, 0x77, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x99, 0x99, 0x99, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa9, 0x99, 0x99, 0x98, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x40, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xff, 0xff, 0xb0, 0xbf, 0xff, + 0x62, 0xff, 0xfe, 0x18, 0xff, 0xff, 0x60, 0x0, + 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, + 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, + 0x90, 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, + 0xff, 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, + 0xf3, 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, + 0x2, 0xff, 0xff, 0x90, 0x9f, 0xff, 0x30, 0xff, + 0xfd, 0x5, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, + 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, 0xd0, 0x5f, + 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x90, 0x9f, + 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, + 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, + 0xff, 0x90, 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, + 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, + 0xff, 0xf3, 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, + 0x0, 0x2, 0xff, 0xff, 0x90, 0x9f, 0xff, 0x30, + 0xff, 0xfd, 0x5, 0xff, 0xff, 0x60, 0x0, 0x2f, + 0xff, 0xf9, 0x9, 0xff, 0xf3, 0xf, 0xff, 0xd0, + 0x5f, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x9f, 0xff, 0x30, 0xff, 0xfd, 0x5, 0xff, 0xff, + 0x60, 0x0, 0x2f, 0xff, 0xf9, 0x9, 0xff, 0xf3, + 0xf, 0xff, 0xd0, 0x5f, 0xff, 0xf6, 0x0, 0x2, + 0xff, 0xff, 0xb0, 0xbf, 0xff, 0x62, 0xff, 0xfe, + 0x18, 0xff, 0xff, 0x60, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x7, 0xbc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, + 0x81, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xba, 0x86, 0x43, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4e, 0xff, 0xff, 0xfe, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x2, 0xef, 0xff, 0xe3, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2e, + 0xfe, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x2, 0xd3, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x50, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x9, + 0xf9, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x9, 0xff, 0xff, 0xf9, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, + 0xff, 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, + 0xff, 0xdb, 0xbf, 0xfb, 0xbb, 0xff, 0xbb, 0xbf, + 0xff, 0xa0, 0x3, 0xff, 0xf9, 0x0, 0xcf, 0x10, + 0xf, 0xf0, 0x1, 0xff, 0xfa, 0x4, 0xff, 0xff, + 0x90, 0xc, 0xf1, 0x0, 0xff, 0x0, 0x1f, 0xff, + 0xa4, 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x10, 0xf, + 0xf0, 0x1, 0xff, 0xfa, 0xff, 0xff, 0xff, 0x90, + 0xc, 0xf1, 0x0, 0xff, 0x0, 0x1f, 0xff, 0xaf, + 0xff, 0xff, 0xf9, 0x0, 0xcf, 0x10, 0xf, 0xf0, + 0x1, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x6a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa9, 0x40, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x1b, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x2d, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x2e, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, 0x3e, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x4f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0xff, + 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xef, 0xff, 0xf1, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 129, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 129, .box_w = 4, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 42, .adv_w = 188, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 83, .adv_w = 337, .box_w = 21, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 304, .adv_w = 298, .box_w = 17, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 551, .adv_w = 405, .box_w = 24, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 803, .adv_w = 329, .box_w = 20, .box_h = 22, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1023, .adv_w = 101, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 1041, .adv_w = 162, .box_w = 8, .box_h = 28, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 1153, .adv_w = 162, .box_w = 8, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 1265, .adv_w = 192, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 1337, .adv_w = 279, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 1435, .adv_w = 109, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1458, .adv_w = 184, .box_w = 9, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 1472, .adv_w = 109, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1485, .adv_w = 169, .box_w = 13, .box_h = 28, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1667, .adv_w = 320, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1856, .adv_w = 178, .box_w = 8, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1940, .adv_w = 276, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2119, .adv_w = 275, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2287, .adv_w = 321, .box_w = 19, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2487, .adv_w = 276, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2666, .adv_w = 296, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2845, .adv_w = 287, .box_w = 17, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3024, .adv_w = 309, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3203, .adv_w = 296, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3392, .adv_w = 109, .box_w = 5, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3432, .adv_w = 109, .box_w = 5, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3485, .adv_w = 279, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = 3}, + {.bitmap_index = 3590, .adv_w = 279, .box_w = 14, .box_h = 10, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 3660, .adv_w = 279, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = 3}, + {.bitmap_index = 3765, .adv_w = 275, .box_w = 16, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3933, .adv_w = 496, .box_w = 29, .box_h = 27, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 4325, .adv_w = 351, .box_w = 23, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4567, .adv_w = 363, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4767, .adv_w = 347, .box_w = 20, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4977, .adv_w = 396, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5198, .adv_w = 322, .box_w = 16, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5366, .adv_w = 305, .box_w = 15, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5524, .adv_w = 371, .box_w = 20, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5734, .adv_w = 390, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5934, .adv_w = 149, .box_w = 4, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5976, .adv_w = 246, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6123, .adv_w = 345, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6323, .adv_w = 285, .box_w = 15, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6481, .adv_w = 458, .box_w = 23, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6723, .adv_w = 390, .box_w = 19, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6923, .adv_w = 403, .box_w = 23, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7165, .adv_w = 347, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7354, .adv_w = 403, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 7666, .adv_w = 349, .box_w = 18, .box_h = 21, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7855, .adv_w = 298, .box_w = 17, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8034, .adv_w = 282, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8223, .adv_w = 380, .box_w = 19, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8423, .adv_w = 342, .box_w = 23, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8665, .adv_w = 540, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9012, .adv_w = 323, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9222, .adv_w = 311, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9443, .adv_w = 315, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9632, .adv_w = 160, .box_w = 7, .box_h = 28, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 9730, .adv_w = 169, .box_w = 14, .box_h = 28, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 9926, .adv_w = 160, .box_w = 7, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 10024, .adv_w = 280, .box_w = 14, .box_h = 13, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 10115, .adv_w = 240, .box_w = 15, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10130, .adv_w = 288, .box_w = 9, .box_h = 4, .ofs_x = 3, .ofs_y = 18}, + {.bitmap_index = 10148, .adv_w = 287, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10268, .adv_w = 327, .box_w = 18, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10466, .adv_w = 274, .box_w = 16, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10594, .adv_w = 327, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10781, .adv_w = 294, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10917, .adv_w = 169, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11049, .adv_w = 331, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 11236, .adv_w = 327, .box_w = 16, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11412, .adv_w = 134, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11467, .adv_w = 136, .box_w = 10, .box_h = 28, .ofs_x = -3, .ofs_y = -6}, + {.bitmap_index = 11607, .adv_w = 296, .box_w = 17, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11794, .adv_w = 134, .box_w = 4, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11838, .adv_w = 507, .box_w = 28, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12062, .adv_w = 327, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12190, .adv_w = 305, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12326, .adv_w = 327, .box_w = 18, .box_h = 22, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 12524, .adv_w = 327, .box_w = 17, .box_h = 22, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 12711, .adv_w = 197, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12791, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12911, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13031, .adv_w = 325, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13159, .adv_w = 268, .box_w = 18, .box_h = 16, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13303, .adv_w = 432, .box_w = 27, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13519, .adv_w = 265, .box_w = 17, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13655, .adv_w = 268, .box_w = 18, .box_h = 22, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 13853, .adv_w = 250, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13965, .adv_w = 168, .box_w = 9, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 14091, .adv_w = 144, .box_w = 3, .box_h = 28, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 14133, .adv_w = 168, .box_w = 9, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 14259, .adv_w = 279, .box_w = 15, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 14297, .adv_w = 201, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 11}, + {.bitmap_index = 14352, .adv_w = 151, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 6}, + {.bitmap_index = 14373, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 14854, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15199, .adv_w = 480, .box_w = 30, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15604, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15949, .adv_w = 330, .box_w = 21, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16180, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16645, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 17110, .adv_w = 540, .box_w = 34, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17569, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18034, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18425, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18890, .adv_w = 240, .box_w = 15, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19070, .adv_w = 360, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19346, .adv_w = 540, .box_w = 34, .box_h = 29, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19839, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20184, .adv_w = 330, .box_w = 21, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 20510, .adv_w = 420, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 20790, .adv_w = 420, .box_w = 27, .box_h = 32, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 21222, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21587, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21952, .adv_w = 420, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 22232, .adv_w = 420, .box_w = 28, .box_h = 27, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 22610, .adv_w = 300, .box_w = 17, .box_h = 27, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 22840, .adv_w = 300, .box_w = 17, .box_h = 27, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 23070, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23435, .adv_w = 420, .box_w = 27, .box_h = 7, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 23530, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23921, .adv_w = 600, .box_w = 38, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24510, .adv_w = 540, .box_w = 36, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 25068, .adv_w = 480, .box_w = 30, .box_h = 28, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 25488, .adv_w = 420, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 25709, .adv_w = 420, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 25930, .adv_w = 600, .box_w = 38, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26386, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26731, .adv_w = 480, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27196, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27677, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28042, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28461, .adv_w = 420, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28826, .adv_w = 420, .box_w = 27, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29150, .adv_w = 480, .box_w = 30, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29495, .adv_w = 300, .box_w = 20, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 29805, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 30224, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 30643, .adv_w = 540, .box_w = 34, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31034, .adv_w = 480, .box_w = 32, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 31530, .adv_w = 360, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31887, .adv_w = 600, .box_w = 38, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32419, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 32799, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33179, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33559, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 33939, .adv_w = 600, .box_w = 38, .box_h = 20, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 34319, .adv_w = 600, .box_w = 38, .box_h = 24, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34775, .adv_w = 420, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 35147, .adv_w = 420, .box_w = 27, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35566, .adv_w = 480, .box_w = 31, .box_h = 31, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 36047, .adv_w = 600, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 36484, .adv_w = 360, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 36841, .adv_w = 483, .box_w = 31, .box_h = 20, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 5, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 22, 0, 13, -11, 0, 0, + 0, 0, -26, -29, 3, 23, 11, 8, + -19, 3, 24, 1, 20, 5, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 4, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, -14, 0, 0, 0, 0, + 0, -10, 8, 10, 0, 0, -5, 0, + -3, 5, 0, -5, 0, -5, -2, -10, + 0, 0, 0, 0, -5, 0, 0, -6, + -7, 0, 0, -5, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, -7, 0, -13, 0, -58, 0, + 0, -10, 0, 10, 14, 0, 0, -10, + 5, 5, 16, 10, -8, 10, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, -6, -24, 0, -19, + -3, 0, 0, 0, 0, 1, 19, 0, + -14, -4, -1, 1, 0, -8, 0, 0, + -3, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -38, -4, 18, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 16, + 0, 5, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 4, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 10, 5, 14, -5, 0, 0, 10, -5, + -16, -66, 3, 13, 10, 1, -6, 0, + 17, 0, 15, 0, 15, 0, -45, 0, + -6, 14, 0, 16, -5, 10, 5, 0, + 0, 1, -5, 0, 0, -8, 38, 0, + 38, 0, 14, 0, 20, 6, 8, 14, + 0, 0, 0, -18, 0, 0, 0, 0, + 1, -3, 0, 3, -9, -6, -10, 3, + 0, -5, 0, 0, 0, -19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, -26, 0, -30, 0, 0, 0, + 0, -3, 0, 48, -6, -6, 5, 5, + -4, 0, -6, 5, 0, 0, -25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -47, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 29, 0, 0, -18, 0, + 16, 0, -33, -47, -33, -10, 14, 0, + 0, -32, 0, 6, -11, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 14, -59, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 3, 0, 0, 0, + 0, 0, 3, 3, -6, -10, 0, -1, + -1, -5, 0, 0, -3, 0, 0, 0, + -10, 0, -4, 0, -11, -10, 0, -12, + -16, -16, -9, 0, -10, 0, -10, 0, + 0, 0, 0, -4, 0, 0, 5, 0, + 3, -5, 0, 1, 0, 0, 0, 5, + -3, 0, 0, 0, -3, 5, 5, -1, + 0, 0, 0, -9, 0, -1, 0, 0, + 0, 0, 0, 1, 0, 6, -3, 0, + -6, 0, -8, 0, 0, -3, 0, 14, + 0, 0, -5, 0, 0, 0, 0, 0, + -1, 1, -3, -3, 0, 0, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, -5, -6, 0, + 0, 0, 0, 0, 1, 0, 0, -3, + 0, -5, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -3, -6, 0, -7, 0, -14, + -3, -14, 10, 0, 0, -10, 5, 10, + 13, 0, -12, -1, -6, 0, -1, -23, + 5, -3, 3, -25, 5, 0, 0, 1, + -25, 0, -25, -4, -42, -3, 0, -24, + 0, 10, 13, 0, 6, 0, 0, 0, + 0, 1, 0, -9, -6, 0, -14, 0, + 0, 0, -5, 0, 0, 0, -5, 0, + 0, 0, 0, 0, -2, -2, 0, -2, + -6, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, -3, -6, -4, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, -3, 0, -10, 5, 0, 0, -6, + 2, 5, 5, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 3, + 0, 0, -5, 0, -5, -3, -6, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -5, -7, 0, + -9, 0, 14, -3, 1, -15, 0, 0, + 13, -24, -25, -20, -10, 5, 0, -4, + -31, -9, 0, -9, 0, -10, 7, -9, + -31, 0, -13, 0, 0, 2, -1, 4, + -3, 0, 5, 0, -14, -18, 0, -24, + -12, -10, -12, -14, -6, -13, -1, -9, + -13, 3, 0, 1, 0, -5, 0, 0, + 0, 3, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -2, 0, -1, -5, 0, -8, -11, + -11, -1, 0, -14, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 23, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + -9, 0, 0, 0, 0, -24, -14, 0, + 0, 0, -7, -24, 0, 0, -5, 5, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, -9, 0, + 0, 0, 0, 6, 0, 3, -10, -10, + 0, -5, -5, -6, 0, 0, 0, 0, + 0, 0, -14, 0, -5, 0, -7, -5, + 0, -11, -12, -14, -4, 0, -10, 0, + -14, 0, 0, 0, 0, 38, 0, 0, + 2, 0, 0, -6, 0, 5, 0, -21, + 0, 0, 0, 0, 0, -45, -9, 16, + 14, -4, -20, 0, 5, -7, 0, -24, + -2, -6, 5, -34, -5, 6, 0, 7, + -17, -7, -18, -16, -20, 0, 0, -29, + 0, 27, 0, 0, -2, 0, 0, 0, + -2, -2, -5, -13, -16, -1, -45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -2, -5, -7, 0, 0, + -10, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -10, 0, 0, 10, + -1, 6, 0, -11, 5, -3, -1, -12, + -5, 0, -6, -5, -3, 0, -7, -8, + 0, 0, -4, -1, -3, -8, -6, 0, + 0, -5, 0, 5, -3, 0, -11, 0, + 0, 0, -10, 0, -8, 0, -8, -8, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 5, 0, -7, 0, -3, -6, + -15, -3, -3, -3, -1, -3, -6, -1, + 0, 0, 0, 0, 0, -5, -4, -4, + 0, 0, 0, 0, 6, -3, 0, -3, + 0, 0, 0, -3, -6, -3, -4, -6, + -4, 0, 4, 19, -1, 0, -13, 0, + -3, 10, 0, -5, -20, -6, 7, 0, + 0, -23, -8, 5, -8, 3, 0, -3, + -4, -15, 0, -7, 2, 0, 0, -8, + 0, 0, 0, 5, 5, -10, -9, 0, + -8, -5, -7, -5, -5, 0, -8, 2, + -9, -8, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, -6, + 0, 0, -5, -5, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -7, 0, -10, 0, 0, 0, -16, 0, + 3, -11, 10, 1, -3, -23, 0, 0, + -11, -5, 0, -19, -12, -13, 0, 0, + -21, -5, -19, -18, -23, 0, -12, 0, + 4, 32, -6, 0, -11, -5, -1, -5, + -8, -13, -9, -18, -20, -11, -5, 0, + 0, -3, 0, 1, 0, 0, -34, -4, + 14, 11, -11, -18, 0, 1, -15, 0, + -24, -3, -5, 10, -44, -6, 1, 0, + 0, -31, -6, -25, -5, -35, 0, 0, + -34, 0, 28, 1, 0, -3, 0, 0, + 0, 0, -2, -3, -18, -3, 0, -31, + 0, 0, 0, 0, -15, 0, -4, 0, + -1, -13, -23, 0, 0, -2, -7, -14, + -5, 0, -3, 0, 0, 0, 0, -22, + -5, -16, -15, -4, -8, -12, -5, -8, + 0, -10, -4, -16, -7, 0, -6, -9, + -5, -9, 0, 2, 0, -3, -16, 0, + 10, 0, -9, 0, 0, 0, 0, 6, + 0, 3, -10, 20, 0, -5, -5, -6, + 0, 0, 0, 0, 0, 0, -14, 0, + -5, 0, -7, -5, 0, -11, -12, -14, + -4, 0, -10, 4, 19, 0, 0, 0, + 0, 38, 0, 0, 2, 0, 0, -6, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -3, -10, 0, 0, 0, 0, 0, -2, + 0, 0, 0, -5, -5, 0, 0, -10, + -5, 0, 0, -10, 0, 8, -2, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 7, 10, 4, -4, 0, -15, + -8, 0, 14, -16, -15, -10, -10, 19, + 9, 5, -42, -3, 10, -5, 0, -5, + 5, -5, -17, 0, -5, 5, -6, -4, + -14, -4, 0, 0, 14, 10, 0, -13, + 0, -26, -6, 14, -6, -18, 1, -6, + -16, -16, -5, 19, 5, 0, -7, 0, + -13, 0, 4, 16, -11, -18, -19, -12, + 14, 0, 1, -35, -4, 5, -8, -3, + -11, 0, -11, -18, -7, -7, -4, 0, + 0, -11, -10, -5, 0, 14, 11, -5, + -26, 0, -26, -7, 0, -17, -28, -1, + -15, -8, -16, -13, 13, 0, 0, -6, + 0, -10, -4, 0, -5, -9, 0, 8, + -16, 5, 0, 0, -25, 0, -5, -11, + -8, -3, -14, -12, -16, -11, 0, -14, + -5, -11, -9, -14, -5, 0, 0, 1, + 23, -8, 0, -14, -5, 0, -5, -10, + -11, -13, -13, -18, -6, -10, 10, 0, + -7, 0, -24, -6, 3, 10, -15, -18, + -10, -16, 16, -5, 2, -45, -9, 10, + -11, -8, -18, 0, -14, -20, -6, -5, + -4, -5, -10, -14, -1, 0, 0, 14, + 13, -3, -31, 0, -29, -11, 12, -18, + -33, -10, -17, -20, -24, -16, 10, 0, + 0, 0, 0, -6, 0, 0, 5, -6, + 10, 3, -9, 10, 0, 0, -15, -1, + 0, -1, 0, 1, 1, -4, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 4, 14, 1, 0, -6, 0, 0, + 0, 0, -3, -3, -6, 0, 0, 0, + 1, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 18, 0, 9, 1, 1, -6, + 0, 10, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -29, 0, -5, 8, 0, 14, + 0, 0, 48, 6, -10, -10, 5, 5, + -3, 1, -24, 0, 0, 23, -29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -33, 18, 67, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -9, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -13, 0, + 0, 1, 0, 0, 5, 62, -10, -4, + 15, 13, -13, 5, 0, 0, 5, 5, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -62, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, -13, 0, 0, 0, 0, + -11, -2, 0, 0, 0, -11, 0, -6, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -32, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, -5, 0, 0, -9, 0, -7, 0, + -13, 0, 0, 0, -8, 5, -6, 0, + 0, -13, -5, -11, 0, 0, -13, 0, + -5, 0, -23, 0, -5, 0, 0, -39, + -9, -19, -5, -17, 0, 0, -32, 0, + -13, -2, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -9, -4, -8, 0, 0, + 0, 0, -11, 0, -11, 6, -5, 10, + 0, -3, -11, -3, -8, -9, 0, -6, + -2, -3, 3, -13, -1, 0, 0, 0, + -42, -4, -7, 0, -11, 0, -3, -23, + -4, 0, 0, -3, -4, 0, 0, 0, + 0, 3, 0, -3, -8, -3, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, -11, 0, -3, 0, 0, 0, -10, + 5, 0, 0, 0, -13, -5, -10, 0, + 0, -13, 0, -5, 0, -23, 0, 0, + 0, 0, -47, 0, -10, -18, -24, 0, + 0, -32, 0, -3, -7, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -7, -2, + -7, 1, 0, 0, 8, -6, 0, 15, + 24, -5, -5, -14, 6, 24, 8, 11, + -13, 6, 20, 6, 14, 11, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 23, -9, -5, 0, -4, + 38, 21, 38, 0, 0, 0, 5, 0, + 0, 18, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 0, 0, 0, -40, -6, -4, -20, + -24, 0, 0, -32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, -40, -6, -4, + -20, -24, 0, 0, -19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -11, 5, 0, -5, + 4, 9, 5, -14, 0, -1, -4, 5, + 0, 4, 0, 0, 0, 0, -12, 0, + -4, -3, -10, 0, -4, -19, 0, 30, + -5, 0, -11, -3, 0, -3, -8, 0, + -5, -13, -10, -6, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, -40, + -6, -4, -20, -24, 0, 0, -32, 0, + 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, -15, -6, -4, 14, -4, -5, + -19, 1, -3, 1, -3, -13, 1, 11, + 1, 4, 1, 4, -12, -19, -6, 0, + -18, -9, -13, -20, -19, 0, -8, -10, + -6, -6, -4, -3, -6, -3, 0, -3, + -1, 7, 0, 7, -3, 0, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -5, -5, 0, 0, + -13, 0, -2, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -6, + 0, 0, 0, 0, -4, 0, 0, -8, + -5, 5, 0, -8, -9, -3, 0, -14, + -3, -11, -3, -6, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -32, 0, 15, 0, 0, -9, 0, + 0, 0, 0, -6, 0, -5, 0, 0, + -2, 0, 0, -3, 0, -11, 0, 0, + 20, -6, -16, -15, 3, 5, 5, -1, + -13, 3, 7, 3, 14, 3, 16, -3, + -13, 0, 0, -19, 0, 0, -14, -13, + 0, 0, -10, 0, -6, -8, 0, -7, + 0, -7, 0, -3, 7, 0, -4, -14, + -5, 18, 0, 0, -4, 0, -10, 0, + 0, 6, -11, 0, 5, -5, 4, 0, + 0, -16, 0, -3, -1, 0, -5, 5, + -4, 0, 0, 0, -20, -6, -11, 0, + -14, 0, 0, -23, 0, 18, -5, 0, + -9, 0, 3, 0, -5, 0, -5, -14, + 0, -5, 5, 0, 0, 0, 0, -3, + 0, 0, 5, -6, 1, 0, 0, -6, + -3, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -30, 0, 11, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -5, -5, 0, 0, 0, 10, 0, 11, + 0, 0, 0, 0, 0, -30, -27, 1, + 21, 14, 8, -19, 3, 20, 0, 18, + 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_30 = { +#else +lv_font_t lv_font_montserrat_30 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 33, /*The maximum line height required by the font*/ + .base_line = 6, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_30*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_32.c b/inc/lvgl/src/font/lv_font_montserrat_32.c new file mode 100644 index 0000000..a12a49c --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_32.c @@ -0,0 +1,6212 @@ +/******************************************************************************* + * Size: 32 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 32 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_32.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_32 + #define LV_FONT_MONTSERRAT_32 1 +#endif + +#if LV_FONT_MONTSERRAT_32 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x7f, 0xff, 0x17, 0xff, 0xf0, 0x6f, 0xff, 0x5, + 0xff, 0xf0, 0x5f, 0xfe, 0x4, 0xff, 0xe0, 0x4f, + 0xfd, 0x3, 0xff, 0xc0, 0x2f, 0xfc, 0x2, 0xff, + 0xb0, 0x1f, 0xfb, 0x1, 0xff, 0xa0, 0xf, 0xf9, + 0x0, 0xff, 0x90, 0xf, 0xf8, 0x0, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0xb, + 0xff, 0xf4, 0xaf, 0xff, 0x42, 0xcf, 0x90, + + /* U+0022 "\"" */ + 0xff, 0xb0, 0x2, 0xff, 0x7f, 0xfa, 0x0, 0x2f, + 0xf7, 0xef, 0xa0, 0x2, 0xff, 0x6e, 0xf9, 0x0, + 0x1f, 0xf6, 0xef, 0x90, 0x1, 0xff, 0x6d, 0xf8, + 0x0, 0x1f, 0xf5, 0xdf, 0x80, 0x0, 0xff, 0x5d, + 0xf8, 0x0, 0xf, 0xf4, 0x79, 0x40, 0x0, 0x99, + 0x20, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x6, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf6, + 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf4, 0x0, 0x0, 0xb, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf2, 0x0, 0x0, + 0xd, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf0, 0x0, 0x0, 0xf, 0xf4, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x55, 0x55, + 0xcf, 0xb5, 0x55, 0x55, 0x9f, 0xe5, 0x55, 0x53, + 0x0, 0x0, 0x0, 0xcf, 0x70, 0x0, 0x0, 0x7f, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, + 0x0, 0x0, 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x40, 0x0, 0x0, 0xbf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x20, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x30, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0x55, 0x5d, 0xfa, 0x55, 0x55, 0x59, 0xfe, + 0x55, 0x55, 0x30, 0x0, 0x0, 0xd, 0xf6, 0x0, + 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf4, 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0xc, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, + 0x0, 0x0, 0xe, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xe0, 0x0, 0x0, 0xf, 0xf3, 0x0, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xce, + 0xff, 0xfe, 0xb8, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0xbf, + 0xff, 0xfc, 0xff, 0xde, 0xff, 0xff, 0x50, 0x7, + 0xff, 0xf8, 0x10, 0xef, 0x20, 0x16, 0xce, 0x0, + 0xe, 0xff, 0x70, 0x0, 0xef, 0x20, 0x0, 0x2, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xef, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x0, 0xef, + 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x30, + 0xef, 0x20, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xfd, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xef, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xef, 0x22, 0x9f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x0, 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x20, 0x0, 0xaf, 0xf8, 0xb, 0x50, 0x0, + 0x0, 0xef, 0x20, 0x1, 0xef, 0xf4, 0x4f, 0xfc, + 0x51, 0x0, 0xef, 0x20, 0x3d, 0xff, 0xd0, 0x5f, + 0xff, 0xff, 0xdc, 0xff, 0xce, 0xff, 0xff, 0x30, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xfe, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x10, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x2a, 0xef, 0xd8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xe1, 0x0, 0x0, 0x3f, 0xff, 0xdf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xf5, 0x0, + 0x0, 0xe, 0xf8, 0x0, 0xa, 0xfb, 0x0, 0x0, + 0x0, 0xc, 0xfa, 0x0, 0x0, 0x6, 0xfd, 0x0, + 0x0, 0x1f, 0xf3, 0x0, 0x0, 0x8, 0xfe, 0x0, + 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, 0xaf, 0x70, + 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0xdf, 0x80, + 0x0, 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, 0x8f, + 0x80, 0x0, 0x9f, 0xd0, 0x0, 0x0, 0x0, 0xa, + 0xf7, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x4f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x1, + 0xff, 0x20, 0x1e, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xb2, 0x3, 0xcf, 0xa0, 0xb, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xc0, 0x6, 0xff, 0x20, 0x19, 0xdf, 0xe9, + 0x20, 0x0, 0x0, 0x7b, 0xcb, 0x60, 0x2, 0xff, + 0x60, 0x1e, 0xff, 0xdf, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xa0, 0xc, 0xfb, 0x10, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xe1, 0x3, 0xff, 0x10, 0x0, 0xe, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x0, 0xd, + 0xf9, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x5, 0xfc, + 0x0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x9f, + 0x70, 0x0, 0x0, 0x5f, 0xc0, 0x0, 0x0, 0x4, + 0xff, 0x30, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x7, + 0xfa, 0x0, 0x0, 0x1, 0xef, 0x80, 0x0, 0x0, + 0x3f, 0xe0, 0x0, 0x0, 0xcf, 0x60, 0x0, 0x0, + 0xaf, 0xc0, 0x0, 0x0, 0x0, 0xcf, 0x80, 0x0, + 0x6f, 0xe0, 0x0, 0x0, 0x5f, 0xf2, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xda, 0xcf, 0xf3, 0x0, 0x0, + 0x1e, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, + 0xfe, 0xa2, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf9, 0x54, 0x6e, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, + 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf2, + 0x0, 0x0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x90, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0x60, 0x3d, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xfe, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x50, 0x0, 0x1, 0xdf, + 0xfa, 0x10, 0x4f, 0xff, 0x80, 0x0, 0x5f, 0xf4, + 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x9, 0xff, 0x10, 0x3f, 0xfd, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x91, 0xff, 0xc0, 0x7, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xef, 0xf5, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfc, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x1e, 0xff, 0xb2, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xc1, 0x0, + 0x5f, 0xff, 0xfc, 0xa8, 0x9c, 0xff, 0xff, 0x6c, + 0xff, 0xc1, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x1c, 0xfe, 0x20, 0x0, 0x5, 0xad, + 0xff, 0xec, 0x83, 0x0, 0x0, 0x1c, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0xff, 0xbf, 0xfa, 0xef, 0xae, 0xf9, 0xef, 0x9d, + 0xf8, 0xdf, 0x8d, 0xf8, 0x79, 0x40, + + /* U+0028 "(" */ + 0x0, 0x6, 0xff, 0x80, 0x0, 0xef, 0xe0, 0x0, + 0x7f, 0xf8, 0x0, 0xe, 0xff, 0x10, 0x3, 0xff, + 0xb0, 0x0, 0x8f, 0xf6, 0x0, 0xe, 0xff, 0x10, + 0x1, 0xff, 0xd0, 0x0, 0x4f, 0xfa, 0x0, 0x7, + 0xff, 0x80, 0x0, 0xaf, 0xf5, 0x0, 0xc, 0xff, + 0x30, 0x0, 0xcf, 0xf2, 0x0, 0xd, 0xff, 0x20, + 0x0, 0xef, 0xf1, 0x0, 0xe, 0xff, 0x10, 0x0, + 0xdf, 0xf2, 0x0, 0xc, 0xff, 0x20, 0x0, 0xcf, + 0xf3, 0x0, 0xa, 0xff, 0x50, 0x0, 0x7f, 0xf8, + 0x0, 0x4, 0xff, 0xa0, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0xdf, 0xf1, 0x0, 0x8, 0xff, 0x60, 0x0, + 0x3f, 0xfb, 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x6, + 0xff, 0x80, 0x0, 0xe, 0xfe, 0x0, 0x0, 0x6f, + 0xf8, + + /* U+0029 ")" */ + 0xbf, 0xf3, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xc, + 0xff, 0x30, 0x0, 0x5f, 0xfb, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x5f, 0xfb, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0xe, 0xff, 0x10, + 0x0, 0xbf, 0xf4, 0x0, 0x8, 0xff, 0x70, 0x0, + 0x6f, 0xf9, 0x0, 0x6, 0xff, 0xa0, 0x0, 0x5f, + 0xfb, 0x0, 0x4, 0xff, 0xb0, 0x0, 0x4f, 0xfc, + 0x0, 0x5, 0xff, 0xb0, 0x0, 0x6f, 0xfa, 0x0, + 0x6, 0xff, 0x90, 0x0, 0x8f, 0xf7, 0x0, 0xb, + 0xff, 0x40, 0x0, 0xef, 0xf1, 0x0, 0x1f, 0xfe, + 0x0, 0x5, 0xff, 0xb0, 0x0, 0xaf, 0xf5, 0x0, + 0xf, 0xff, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xcf, + 0xf3, 0x0, 0x3f, 0xfb, 0x0, 0xb, 0xff, 0x30, + 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x50, 0x0, 0x0, 0x9, 0x70, 0x8, + 0xf5, 0x0, 0x87, 0x2, 0xff, 0xd4, 0x8f, 0x56, + 0xef, 0xe0, 0x4, 0xdf, 0xfe, 0xfe, 0xff, 0xb3, + 0x0, 0x0, 0x6e, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x7e, 0xff, + 0xdf, 0xdf, 0xfd, 0x50, 0x2f, 0xfa, 0x28, 0xf5, + 0x3c, 0xfe, 0x0, 0x74, 0x0, 0x8f, 0x50, 0x6, + 0x50, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0x40, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0xee, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x78, 0x88, 0x88, 0xff, + 0xd8, 0x88, 0x88, 0x30, 0x0, 0x0, 0xf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, + 0x0, + + /* U+002C "," */ + 0x7, 0xca, 0x14, 0xff, 0xf9, 0x6f, 0xff, 0xb2, + 0xef, 0xf8, 0x4, 0xff, 0x30, 0x6f, 0xe0, 0xa, + 0xf9, 0x0, 0xef, 0x30, 0x2f, 0xe0, 0x0, + + /* U+002D "-" */ + 0x1a, 0xaa, 0xaa, 0xaa, 0xa4, 0x2f, 0xff, 0xff, + 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xf7, + + /* U+002E "." */ + 0x1, 0x42, 0x1, 0xef, 0xf4, 0x7f, 0xff, 0xb6, + 0xff, 0xf9, 0xa, 0xfc, 0x10, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfc, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfd, + 0xef, 0xff, 0xfc, 0x0, 0x0, 0x5, 0xff, 0xfc, + 0x40, 0x0, 0x29, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, + 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x21, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf6, 0x4f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x96, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xc7, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfc, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xb4, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x1f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x60, 0xdf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, + 0x7, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfc, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x40, 0x0, 0x5f, 0xff, 0xc4, 0x0, + 0x2, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xde, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xd8, 0x20, 0x0, + 0x0, + + /* U+0031 "1" */ + 0xcf, 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, + 0xf7, 0x9c, 0xcc, 0xce, 0xff, 0x70, 0x0, 0x0, + 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, + 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, 0xb, + 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x0, + 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, 0x0, + 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xf7, + 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0xbf, 0xf7, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0xbf, 0xf7, + + /* U+0032 "2" */ + 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x9, 0xff, 0xff, 0xfe, 0xde, 0xff, + 0xff, 0xe2, 0x0, 0x4f, 0xff, 0xb4, 0x0, 0x0, + 0x18, 0xff, 0xfb, 0x0, 0x4, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc3, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+0033 "3" */ + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x9, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x6, 0x99, 0xad, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf7, 0x5f, 0xfe, 0x83, 0x0, 0x0, 0x16, 0xef, + 0xfe, 0x7, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, + 0xff, 0x30, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x27, 0xbd, 0xef, 0xed, + 0x94, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0x3, 0xdd, 0x90, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, + 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xc0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, + 0xbb, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xc0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xe, 0xff, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfd, 0xcc, 0xba, 0x96, 0x20, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x49, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf0, 0x6, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x1e, 0xff, 0xb5, 0x10, 0x0, 0x4, + 0xcf, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xfe, 0xdd, + 0xff, 0xff, 0xf8, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x59, + 0xde, 0xff, 0xdb, 0x61, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, 0x94, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x3, 0xef, 0xff, 0xfe, 0xcb, + 0xcf, 0xff, 0x10, 0x0, 0x2e, 0xff, 0xf8, 0x10, + 0x0, 0x0, 0x36, 0x0, 0x0, 0xcf, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x0, 0x2, 0x68, 0x87, 0x40, 0x0, + 0x0, 0x5f, 0xfc, 0x4, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x6f, 0xfb, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x7f, 0xff, 0xff, 0xd6, 0x10, + 0x3, 0x9f, 0xff, 0xc0, 0x6f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x5f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x2f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfc, 0xe, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, + 0x9, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfb, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf6, 0x0, 0x8f, 0xff, 0x60, 0x0, 0x0, + 0x2c, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xfe, 0xb9, + 0x9c, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfd, 0xa4, 0x0, 0x0, + + /* U+0037 "7" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xf, 0xff, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xff, 0xfb, 0xf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xc0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0xb, 0xbb, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x16, 0xbd, 0xff, 0xed, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x9f, 0xff, 0xfc, 0xa9, + 0xbd, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x91, + 0x0, 0x0, 0x4, 0xdf, 0xfe, 0x0, 0x9, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x60, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf4, 0x0, 0x6f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x0, 0xcf, 0xfe, 0x83, + 0x10, 0x14, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x1c, 0xff, 0xfc, 0x97, 0x67, 0xaf, 0xff, + 0xf7, 0x0, 0xb, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf5, 0x3, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x7f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x19, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf2, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x14, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xd0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xf6, 0x0, 0x1d, 0xff, 0xff, + 0xb9, 0x9a, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x2, 0x7b, 0xdf, 0xfe, 0xd9, 0x50, 0x0, + 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfb, 0x99, + 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x0, 0x0, 0x8, 0xff, 0xf3, 0x0, 0xb, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x40, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfa, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0xc, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x0, + 0xaf, 0xff, 0xfb, 0x99, 0xbf, 0xff, 0xaf, 0xff, + 0x20, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xff, 0xf2, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xc8, + 0x20, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf7, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, + 0x3b, 0xff, 0xfb, 0x0, 0x0, 0x5, 0xff, 0xec, + 0xbc, 0xef, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xdf, 0xff, 0xda, 0x60, 0x0, 0x0, + 0x0, + + /* U+003A ":" */ + 0x9, 0xfc, 0x16, 0xff, 0xf9, 0x7f, 0xff, 0xb1, + 0xef, 0xf4, 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x42, + 0x1, 0xef, 0xf4, 0x7f, 0xff, 0xb6, 0xff, 0xf9, + 0xa, 0xfc, 0x10, + + /* U+003B ";" */ + 0x9, 0xfc, 0x16, 0xff, 0xf9, 0x7f, 0xff, 0xb1, + 0xef, 0xf4, 0x1, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xc1, 0x5f, 0xff, 0xa6, 0xff, 0xfb, + 0x1d, 0xff, 0x80, 0x3f, 0xf3, 0x7, 0xfd, 0x0, + 0xbf, 0x80, 0xf, 0xf2, 0x2, 0xdb, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x39, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x6, 0xcf, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x8f, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0xd, 0xff, 0xc5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xfa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0x60, + + /* U+003D "=" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x78, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x83, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, + + /* U+003E ">" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x1, 0x6d, + 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x3, + 0x9e, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x3, 0x9e, + 0xff, 0xff, 0xa2, 0x0, 0x1, 0x6d, 0xff, 0xff, + 0xc6, 0x10, 0x0, 0x4a, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0xd, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0xa, 0xff, 0xff, 0xec, 0xbd, 0xff, 0xff, + 0xf3, 0x6, 0xff, 0xf9, 0x20, 0x0, 0x1, 0x8f, + 0xff, 0xc0, 0x5, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xee, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe4, + 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbd, 0xff, + 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xea, 0x63, 0x21, 0x23, + 0x58, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xe2, 0x0, 0x0, 0x0, 0xbf, + 0xf5, 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x1, + 0x77, 0x41, 0xdf, 0xd0, 0x0, 0x0, 0x6f, 0xf6, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0x91, 0x3f, + 0xf9, 0x1, 0xef, 0x90, 0x0, 0xe, 0xfa, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe5, 0xff, + 0x90, 0x4, 0xff, 0x20, 0x6, 0xff, 0x20, 0x0, + 0x3f, 0xff, 0xc4, 0x10, 0x26, 0xef, 0xff, 0xf9, + 0x0, 0xb, 0xf9, 0x0, 0xcf, 0xa0, 0x0, 0xd, + 0xff, 0x80, 0x0, 0x0, 0x1, 0xcf, 0xff, 0x90, + 0x0, 0x5f, 0xe0, 0x1f, 0xf5, 0x0, 0x4, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x0, + 0x0, 0xff, 0x34, 0xff, 0x10, 0x0, 0x9f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, + 0xc, 0xf6, 0x6f, 0xf0, 0x0, 0xc, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x0, + 0xbf, 0x77, 0xfe, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0xa, + 0xf8, 0x7f, 0xe0, 0x0, 0xd, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, 0xaf, + 0x76, 0xff, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, 0xb, 0xf6, + 0x3f, 0xf2, 0x0, 0x7, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0xef, 0x40, + 0xff, 0x50, 0x0, 0x1f, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x3f, 0xf0, 0xc, + 0xfa, 0x0, 0x0, 0x8f, 0xfd, 0x30, 0x0, 0x0, + 0x6f, 0xff, 0xfd, 0x0, 0xb, 0xfa, 0x0, 0x6f, + 0xf2, 0x0, 0x0, 0xcf, 0xff, 0xb7, 0x68, 0xdf, + 0xf9, 0xcf, 0xfb, 0x7b, 0xff, 0x20, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf8, + 0x5, 0xff, 0xff, 0xff, 0x60, 0x0, 0x5, 0xff, + 0x60, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0x93, 0x0, + 0x4, 0xcf, 0xeb, 0x40, 0x0, 0x0, 0xa, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xa6, 0x43, 0x23, 0x47, 0xaf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9b, 0xef, 0xff, 0xdb, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfb, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x1b, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xa0, 0x4f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf3, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x6, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x40, 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x0, + 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf6, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x7, 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, + 0x88, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xd, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x40, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0xcf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf3, + + /* U+0042 "B" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x60, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0xaf, 0xfd, 0x99, 0x99, + 0x99, 0x9a, 0xdf, 0xff, 0xf6, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x40, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x60, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xf9, 0x0, 0xaf, 0xfd, 0x99, 0x99, 0x99, 0x9a, + 0xdf, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x14, 0xaf, + 0xff, 0x80, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf2, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xf1, 0xaf, 0xfd, + 0x99, 0x99, 0x99, 0x99, 0xad, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xa5, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x7f, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x5b, + 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xeb, 0x0, 0x1e, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x8, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x5, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x7, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x5, 0xbf, 0xff, 0xa0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xbd, 0xff, 0xed, 0x95, 0x0, 0x0, + + /* U+0044 "D" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x40, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0xaf, 0xfe, + 0xcc, 0xcc, 0xcc, 0xde, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xdf, 0xff, 0xd1, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x70, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xe0, 0xaf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfd, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfd, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf5, 0xaf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x70, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xd1, + 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xce, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x40, 0x0, + 0x0, 0x0, + + /* U+0045 "E" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0x2a, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xdb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb8, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xc7, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, + + /* U+0046 "F" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0x2a, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0x90, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfe, 0xde, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x7, 0xff, 0xff, 0xb4, 0x0, 0x0, + 0x4, 0x9f, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcd, 0x10, 0x1, + 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x10, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf0, 0x5f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x2f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf0, 0x8, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, + 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x6, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x3, 0x8f, 0xff, + 0xf0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xde, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xda, 0x61, + 0x0, 0x0, + + /* U+0048 "H" */ + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xef, 0xfa, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, + + /* U+0049 "I" */ + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, 0xaf, 0xf9, + 0xaf, 0xf9, 0xaf, 0xf9, + + /* U+004A "J" */ + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xc, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, + 0x3e, 0x40, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x1e, + 0xff, 0x81, 0x0, 0x5, 0xff, 0xf8, 0x0, 0xaf, + 0xff, 0xfd, 0xce, 0xff, 0xfe, 0x10, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x28, + 0xce, 0xfe, 0xb6, 0x0, 0x0, + + /* U+004B "K" */ + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xd1, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfd, 0x10, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xd1, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x10, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe2, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0xbf, + 0xfe, 0x20, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0xb, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0xaf, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0xa, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0xaf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0xa, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0xaf, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf7, 0xef, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, + 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x60, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, + 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x30, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe1, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xb0, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf8, + + /* U+004C "L" */ + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+004D "M" */ + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x2a, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf2, 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x2a, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf2, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x2a, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xf2, 0xaf, 0xfb, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xce, 0xff, 0x2a, + 0xff, 0x7b, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf2, 0xef, 0xf2, 0xaf, 0xf7, 0x1f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0xe, 0xff, + 0x2a, 0xff, 0x70, 0x7f, 0xfb, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0xef, 0xf2, 0xaf, 0xf7, 0x0, + 0xdf, 0xf5, 0x0, 0x0, 0xb, 0xff, 0x50, 0xe, + 0xff, 0x2a, 0xff, 0x70, 0x3, 0xff, 0xe0, 0x0, + 0x4, 0xff, 0xb0, 0x0, 0xef, 0xf3, 0xaf, 0xf7, + 0x0, 0xa, 0xff, 0x80, 0x0, 0xdf, 0xf2, 0x0, + 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, 0x1e, 0xff, + 0x20, 0x8f, 0xf8, 0x0, 0x0, 0xef, 0xf3, 0xaf, + 0xf7, 0x0, 0x0, 0x6f, 0xfb, 0x2f, 0xfe, 0x0, + 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, 0x0, + 0xcf, 0xfd, 0xff, 0x50, 0x0, 0x0, 0xef, 0xf3, + 0xaf, 0xf7, 0x0, 0x0, 0x3, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xf3, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x1e, 0xf7, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf3, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x3a, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf3, + + /* U+004E "N" */ + 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xfe, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0xbf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x2, 0xef, 0xfd, 0x10, 0x0, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x1, 0xef, + 0xfe, 0x10, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x9f, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x9f, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xef, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfa, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfa, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0xde, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0x30, 0x0, 0xe, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xfd, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xc0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf3, 0x7f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x47, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x32, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0xe, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfc, 0x0, 0x8f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xf3, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xad, 0xff, 0xfd, 0xa6, 0x10, + 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0x70, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0x40, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf2, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x5a, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf6, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x5a, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0x40, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, 0xdf, + 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xec, 0x94, 0x0, 0x0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0xde, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xef, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xd0, 0x0, 0x7, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x0, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x30, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x40, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x30, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0xe, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfc, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, 0x93, 0x0, + 0x0, 0x3, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xec, 0xbc, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xff, + 0xfe, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x30, 0x14, 0xcf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x67, 0x74, 0x0, 0x0, + + /* U+0052 "R" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xec, 0x94, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0xaf, 0xfe, 0xcc, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0x70, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0x40, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf2, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x5a, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf6, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x5a, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0x40, 0xaf, 0xfd, 0xbb, 0xbb, 0xbb, 0xcf, + 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xa, 0xff, + 0x90, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe1, + 0x0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x60, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x20, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0xa, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xf7, + + /* U+0053 "S" */ + 0x0, 0x0, 0x16, 0xbd, 0xef, 0xed, 0xa6, 0x10, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0xbf, 0xff, 0xfd, 0xbb, 0xce, + 0xff, 0xff, 0x60, 0x7, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x27, 0xde, 0x0, 0xd, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0xf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xfc, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xcf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf7, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf4, 0x5f, 0xfe, 0x83, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xd0, 0x4e, 0xff, 0xff, 0xfd, 0xbb, + 0xcf, 0xff, 0xfe, 0x20, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x1, 0x59, + 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, + + /* U+0054 "T" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xac, 0xcc, 0xcc, 0xcc, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0x80, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, + + /* U+0055 "U" */ + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0xdf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xb0, + 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x70, 0xb, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x2, 0xff, 0xff, 0x71, + 0x0, 0x0, 0x5d, 0xff, 0xf6, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xef, 0xfd, + 0xa6, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf9, 0x5, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0x7f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x30, + 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf8, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0xf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x70, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0xc, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfd, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0x0, 0xcf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xfa, + 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x53, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, + 0xfc, 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0xe, 0xff, 0x30, 0x0, 0x0, + 0x9, 0xff, 0x70, 0x0, 0x0, 0x1f, 0xff, 0x30, + 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x8f, 0xf8, 0x0, + 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xf8, 0x0, 0x0, 0xa, 0xff, 0x40, 0x3, 0xff, + 0xd0, 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xd0, 0x0, 0x0, 0xff, 0xe0, 0x0, + 0xd, 0xff, 0x30, 0x0, 0xa, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, 0x6f, 0xf9, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0xb, + 0xff, 0x30, 0x0, 0x2, 0xff, 0xe0, 0x0, 0x5f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x1, 0xff, 0xe0, 0x0, 0x0, 0xc, 0xff, 0x40, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x30, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x7f, + 0xf9, 0x0, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf9, 0xc, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xff, 0xe0, 0x5f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe2, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x4b, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xbf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, + + /* U+0058 "X" */ + 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x30, 0x1, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xf6, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xa0, + 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x27, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xdf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x5d, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x2, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xc0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf4, 0x0, 0x7, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x10, 0x3f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xb0, + + /* U+0059 "Y" */ + 0xc, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf8, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x40, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfa, 0x0, 0x0, 0x5, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xe0, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x9, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x20, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xc0, 0xdf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfc, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x4c, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, + + /* U+005B "[" */ + 0xaf, 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xf0, + 0xaf, 0xfb, 0x88, 0x80, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0xaf, 0xfb, 0x88, 0x80, + 0xaf, 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xf0, + + /* U+005C "\\" */ + 0x1f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xe0, + + /* U+005D "]" */ + 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xff, 0xf4, + 0x38, 0x88, 0xef, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0xcf, 0xf4, + 0x0, 0x0, 0xcf, 0xf4, 0x38, 0x88, 0xef, 0xf4, + 0x6f, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xff, 0xf4, + + /* U+005E "^" */ + 0x0, 0x0, 0x2, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfe, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfe, 0x3f, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x70, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x5f, + 0xf1, 0x6, 0xff, 0x0, 0x0, 0x0, 0xc, 0xfa, + 0x0, 0xe, 0xf6, 0x0, 0x0, 0x3, 0xff, 0x30, + 0x0, 0x8f, 0xd0, 0x0, 0x0, 0xaf, 0xc0, 0x0, + 0x1, 0xff, 0x40, 0x0, 0x1f, 0xf5, 0x0, 0x0, + 0xa, 0xfb, 0x0, 0x8, 0xfe, 0x0, 0x0, 0x0, + 0x4f, 0xf2, 0x0, 0xef, 0x70, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x6f, 0xf1, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x10, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x4, 0xef, 0xf4, + 0x0, 0x0, 0x1, 0xcf, 0xf6, 0x0, 0x0, 0x0, + 0x8f, 0xf7, + + /* U+0061 "a" */ + 0x0, 0x2, 0x8b, 0xef, 0xfe, 0xb6, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0xb, 0xff, 0xfe, 0xba, 0xbd, 0xff, 0xff, 0x20, + 0x2, 0xfa, 0x30, 0x0, 0x0, 0x3e, 0xff, 0xb0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x0, 0x5, 0xad, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xb, 0xff, 0xe8, 0x43, 0x33, 0x33, 0xcf, 0xf5, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, + 0x2f, 0xff, 0x30, 0x0, 0x0, 0x2d, 0xff, 0xf5, + 0xa, 0xff, 0xe8, 0x43, 0x49, 0xff, 0xff, 0xf5, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xf5, + 0x0, 0x5, 0xbe, 0xff, 0xda, 0x40, 0x9f, 0xf5, + + /* U+0062 "b" */ + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x4, 0x9d, 0xff, + 0xda, 0x40, 0x0, 0x0, 0x1f, 0xff, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x1, 0xff, 0xfc, + 0xff, 0xfc, 0xbc, 0xff, 0xff, 0xe3, 0x0, 0x1f, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x6f, 0xff, 0xd1, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x90, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x1, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf4, 0x1f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x61, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x61, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf4, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x1f, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x6f, 0xff, 0xd1, 0x1, + 0xff, 0xec, 0xff, 0xfc, 0xbc, 0xff, 0xff, 0xf3, + 0x0, 0x1f, 0xfd, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x1, 0xff, 0xd0, 0x4, 0xad, 0xff, + 0xda, 0x40, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xdb, 0x61, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x3f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, + 0xf6, 0x0, 0x1e, 0xff, 0xe5, 0x0, 0x0, 0x2a, + 0xff, 0xe0, 0xb, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x9, 0xa1, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x9, 0xa1, 0x0, 0x1e, + 0xff, 0xe5, 0x0, 0x0, 0x2a, 0xff, 0xe0, 0x0, + 0x3f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, 0xf5, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xeb, 0x61, 0x0, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, + 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x20, 0x2f, 0xfe, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x2f, + 0xfe, 0x0, 0x5f, 0xff, 0xfe, 0xcb, 0xdf, 0xff, + 0xcf, 0xfe, 0x2, 0xff, 0xfe, 0x50, 0x0, 0x2, + 0xbf, 0xff, 0xfe, 0xc, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x2f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x7f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x9f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, + 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfe, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x2, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x5f, 0xff, + 0xfb, 0x98, 0xaf, 0xff, 0xcf, 0xfe, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xfe, 0x0, + 0x0, 0x6, 0xbe, 0xff, 0xd9, 0x30, 0xf, 0xfe, + + /* U+0065 "e" */ + 0x0, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x40, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x9a, 0xcf, + 0xff, 0xe1, 0x0, 0x2, 0xff, 0xf9, 0x10, 0x0, + 0x2, 0xcf, 0xfc, 0x0, 0xb, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x60, 0x2f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x7f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x9f, 0xf9, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x30, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x1, 0x80, 0x0, 0x2, 0xef, 0xfe, + 0x50, 0x0, 0x0, 0x5d, 0xf8, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xcb, 0xce, 0xff, 0xfc, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xec, 0x83, 0x0, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x1, 0x9d, 0xff, 0xd7, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, + 0xfe, 0x99, 0xdd, 0x0, 0x0, 0x5f, 0xfe, 0x10, + 0x0, 0x10, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x4, 0x88, 0xdf, 0xfb, 0x88, 0x88, + 0x20, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf7, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xd9, 0x40, 0xc, + 0xff, 0x20, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xcf, 0xf2, 0x0, 0x7f, 0xff, 0xfe, 0xbb, + 0xcf, 0xff, 0xdd, 0xff, 0x20, 0x4f, 0xff, 0xc3, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0xd, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x24, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf2, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x2a, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0xaf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x28, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0x4f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0x4, 0xff, 0xfd, 0x40, 0x0, 0x1, + 0x7f, 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xec, + 0xbc, 0xff, 0xfd, 0xff, 0xf2, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0x1f, 0xff, 0x20, 0x0, + 0x0, 0x6b, 0xef, 0xfd, 0x94, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xc0, 0x0, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xf7, 0x0, 0x2f, 0xfb, 0x50, + 0x0, 0x0, 0x5, 0xef, 0xfe, 0x0, 0x7, 0xff, + 0xff, 0xfd, 0xbb, 0xcf, 0xff, 0xff, 0x40, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x38, 0xbd, 0xff, 0xed, 0xa5, + 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x4a, 0xdf, 0xfd, 0xa3, 0x0, 0x0, + 0x1f, 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x1f, 0xff, 0xdf, 0xff, 0xcc, 0xdf, 0xff, + 0xf9, 0x0, 0x1f, 0xff, 0xff, 0x60, 0x0, 0x2, + 0xcf, 0xff, 0x30, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x90, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x1f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + + /* U+0069 "i" */ + 0x1b, 0xfb, 0x8, 0xff, 0xf6, 0x8f, 0xff, 0x61, + 0xbe, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, 0xff, + 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x1, + 0xff, 0xf0, 0x1f, 0xff, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x1, 0xff, 0xf0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0xaf, 0xc1, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0xae, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, + 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, + 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x2, 0x0, 0x8, 0xff, 0xd0, 0x5f, + 0xb9, 0xcf, 0xff, 0x70, 0xbf, 0xff, 0xff, 0xfb, + 0x0, 0x4a, 0xdf, 0xfc, 0x60, 0x0, + + /* U+006B "k" */ + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x60, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x9, 0xff, + 0xf6, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xaf, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x1, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x1d, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xef, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xe6, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x20, 0x6f, 0xff, 0x80, + 0x0, 0x0, 0x1f, 0xff, 0xc1, 0x0, 0x9, 0xff, + 0xf5, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xd0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, + + /* U+006C "l" */ + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, 0x1f, 0xff, + + /* U+006D "m" */ + 0x1f, 0xfd, 0x0, 0x6b, 0xef, 0xec, 0x71, 0x0, + 0x0, 0x49, 0xde, 0xfe, 0xa4, 0x0, 0x0, 0x1f, + 0xfd, 0x3d, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1b, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1f, 0xfe, + 0xef, 0xfc, 0xa9, 0xcf, 0xff, 0xf5, 0xdf, 0xff, + 0xb9, 0xae, 0xff, 0xfb, 0x0, 0x1f, 0xff, 0xfd, + 0x30, 0x0, 0x3, 0xef, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x1f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf1, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + + /* U+006E "n" */ + 0x1f, 0xfd, 0x0, 0x5a, 0xdf, 0xfd, 0xa3, 0x0, + 0x0, 0x1f, 0xfd, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x1f, 0xfe, 0xef, 0xfd, 0xa9, 0xbf, + 0xff, 0xf9, 0x0, 0x1f, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0x1f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xd0, 0x1f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf0, + + /* U+006F "o" */ + 0x0, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xcb, 0xdf, + 0xff, 0xf8, 0x0, 0x2, 0xef, 0xfe, 0x50, 0x0, + 0x2, 0xbf, 0xff, 0x50, 0xb, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x2f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x6f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x9f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x2f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf7, 0xb, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x1, 0xef, 0xfe, + 0x40, 0x0, 0x2, 0xbf, 0xff, 0x50, 0x0, 0x4f, + 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xad, 0xff, 0xeb, 0x60, 0x0, + 0x0, + + /* U+0070 "p" */ + 0x1f, 0xfd, 0x0, 0x4a, 0xdf, 0xfd, 0xa4, 0x0, + 0x0, 0x1, 0xff, 0xd1, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x1f, 0xfe, 0xdf, 0xfe, 0xa8, + 0x9d, 0xff, 0xfe, 0x30, 0x1, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x4, 0xef, 0xfd, 0x10, 0x1f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, 0x1, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x41, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf6, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x71, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, 0x1f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x41, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf9, 0x1, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x6, 0xff, 0xfd, 0x10, 0x1f, 0xff, 0xbf, + 0xff, 0xcb, 0xcf, 0xff, 0xff, 0x30, 0x1, 0xff, + 0xf0, 0xaf, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x1f, 0xff, 0x0, 0x39, 0xdf, 0xfd, 0xa4, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x30, 0xf, + 0xfe, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf9, + 0xf, 0xfe, 0x0, 0x5f, 0xff, 0xfe, 0xcb, 0xdf, + 0xff, 0xaf, 0xfe, 0x2, 0xff, 0xfe, 0x50, 0x0, + 0x2, 0xbf, 0xff, 0xfe, 0xc, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfe, 0x2f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x7f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x9f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfe, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0x2f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0xc, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfe, 0x2, 0xff, 0xfe, + 0x40, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0x0, 0x5f, + 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xbf, 0xfe, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xfe, + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xd8, 0x20, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, + + /* U+0072 "r" */ + 0x1f, 0xfd, 0x0, 0x5a, 0xdf, 0x1, 0xff, 0xd1, + 0xbf, 0xff, 0xf0, 0x1f, 0xfd, 0xcf, 0xff, 0xfe, + 0x1, 0xff, 0xff, 0xf9, 0x30, 0x0, 0x1f, 0xff, + 0xf5, 0x0, 0x0, 0x1, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x1, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xd9, 0x50, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xdf, 0xff, 0xdb, 0xaa, 0xdf, 0xff, 0x10, + 0x6, 0xff, 0xe3, 0x0, 0x0, 0x1, 0x87, 0x0, + 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfd, 0xa7, 0x40, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, + 0x0, 0x0, 0x15, 0x9c, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6e, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x6, 0xf9, 0x30, 0x0, 0x0, 0xa, 0xff, 0xd0, + 0xe, 0xff, 0xff, 0xca, 0xac, 0xff, 0xff, 0x50, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0x9c, 0xef, 0xfe, 0xb7, 0x10, 0x0, + + /* U+0074 "t" */ + 0x0, 0x5, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x48, + 0x8d, 0xff, 0xb8, 0x88, 0x82, 0x0, 0x0, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0x10, 0x0, 0x20, 0x0, 0x1, 0xff, + 0xff, 0xaa, 0xdd, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3, 0xae, 0xff, 0xc6, + 0x0, + + /* U+0075 "u" */ + 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xb4, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfb, 0x4f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xb3, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x3f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xb1, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0xd, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xb0, 0x7f, + 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x0, + 0xcf, 0xff, 0xd9, 0x9a, 0xef, 0xfd, 0xff, 0xb0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xfb, + 0x0, 0x0, 0x4a, 0xef, 0xfd, 0x93, 0x3, 0xff, + 0xb0, + + /* U+0076 "v" */ + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xb0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf4, 0x0, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfd, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x1f, + 0xff, 0x10, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0xe, + 0xff, 0x10, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, + 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, 0xfc, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf3, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x90, 0xa, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x12, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x8f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, + 0x0, 0x0, + + /* U+0077 "w" */ + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x64, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf0, 0xe, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1f, 0xfa, 0x0, 0x8f, 0xf6, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x7, + 0xff, 0x40, 0x2, 0xff, 0xb0, 0x0, 0x0, 0x8, + 0xff, 0xbf, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, 0xef, 0xd1, + 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, + 0x6f, 0xf7, 0x0, 0x0, 0x4f, 0xf7, 0xb, 0xff, + 0x20, 0x0, 0x9, 0xff, 0x20, 0x0, 0x1, 0xff, + 0xd0, 0x0, 0xa, 0xff, 0x10, 0x4f, 0xf8, 0x0, + 0x0, 0xef, 0xc0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x1, 0xff, 0xb0, 0x0, 0xef, 0xe0, 0x0, 0x5f, + 0xf6, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, 0x7f, + 0xf5, 0x0, 0x8, 0xff, 0x40, 0xb, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xef, 0xe0, 0xd, 0xfe, 0x0, + 0x0, 0x2f, 0xf9, 0x1, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x43, 0xff, 0x80, 0x0, 0x0, + 0xcf, 0xf0, 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x9f, 0xf2, 0x0, 0x0, 0x6, 0xff, + 0x5d, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x70, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xaf, + 0xfb, 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x6, + 0xff, 0xd1, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, 0xcf, 0xf9, + 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x6a, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xdf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x16, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, + 0x0, 0xaf, 0xfb, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x80, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xfc, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x6, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x20, + 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, + + /* U+0079 "y" */ + 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xb0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x7, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x1f, + 0xff, 0x20, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, + 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf7, + 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0xe, + 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf5, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xc0, 0xb, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x32, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0x4, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0xab, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xae, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x38, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x48, + 0x88, 0x88, 0x88, 0x88, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xb8, 0x88, 0x88, 0x88, 0x88, + 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + + /* U+007B "{" */ + 0x0, 0x0, 0x6, 0xcf, 0xfa, 0x0, 0x0, 0x9f, + 0xff, 0xfa, 0x0, 0x3, 0xff, 0xfd, 0x95, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, 0x80, + 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, + 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, + 0x9, 0xff, 0x70, 0x0, 0x0, 0xa, 0xff, 0x60, + 0x0, 0x0, 0x2e, 0xff, 0x40, 0x0, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x18, 0xaf, 0xff, 0x20, 0x0, 0x0, 0xb, 0xff, + 0x60, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, + 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, + 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, + 0x80, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x85, 0x0, 0x0, 0xaf, 0xff, + 0xfa, 0x0, 0x0, 0x6, 0xcf, 0xfa, + + /* U+007C "|" */ + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf3, 0xaf, 0xf3, + + /* U+007D "}" */ + 0x6f, 0xfd, 0x80, 0x0, 0x0, 0x6f, 0xff, 0xfc, + 0x0, 0x0, 0x38, 0xcf, 0xff, 0x70, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xd0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x0, 0x2, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x2d, 0xff, 0xf6, + 0x0, 0x0, 0xef, 0xfc, 0x83, 0x0, 0x2, 0xff, + 0xf0, 0x0, 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x4, 0xff, + 0xd0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0x38, + 0xbf, 0xff, 0x70, 0x0, 0x6f, 0xff, 0xfd, 0x0, + 0x0, 0x6f, 0xfd, 0x81, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x1, 0x44, 0x10, 0x0, 0x0, 0x1, 0x54, + 0x0, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xfb, + 0x4, 0xff, 0xff, 0xff, 0xd2, 0x0, 0xa, 0xf8, + 0xb, 0xfd, 0x20, 0x7f, 0xfe, 0x62, 0x7f, 0xf3, + 0xf, 0xf3, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xa0, + 0x1f, 0xf0, 0x0, 0x0, 0x7, 0xdf, 0xe8, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x18, 0xdf, 0xea, 0x30, 0x0, 0x2e, 0xfe, + 0xbd, 0xff, 0x60, 0xd, 0xf7, 0x0, 0x3, 0xef, + 0x34, 0xfa, 0x0, 0x0, 0x4, 0xfb, 0x7f, 0x50, + 0x0, 0x0, 0xf, 0xe7, 0xf5, 0x0, 0x0, 0x0, + 0xfe, 0x4f, 0xa0, 0x0, 0x0, 0x4f, 0xb0, 0xdf, + 0x70, 0x0, 0x3e, 0xf3, 0x2, 0xef, 0xec, 0xdf, + 0xf7, 0x0, 0x1, 0x8d, 0xfe, 0xa3, 0x0, + + /* U+2022 "•" */ + 0x5, 0xbb, 0x50, 0x5f, 0xff, 0xf5, 0xcf, 0xff, + 0xfc, 0xdf, 0xff, 0xfd, 0x7f, 0xff, 0xf7, 0x8, + 0xee, 0x80, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9d, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x3a, 0xdf, 0xfd, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0xa3, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xdf, 0xfd, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x8f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf8, + 0xff, 0x20, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xfa, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xaf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xfa, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xaf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x2, 0xff, + 0x8f, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf8, + + /* U+F00B "" */ + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x3d, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x4, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xd1, 0x1d, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x1, 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xfc, 0x10, 0x1e, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe1, 0xcf, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0xa, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xaa, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xa0, 0x9f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfc, 0x1e, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe1, 0x1, + 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xfc, 0x10, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x95, 0x0, 0x0, 0xef, 0xff, 0xf1, + 0x0, 0x3, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf3, 0x0, 0xe, 0xff, 0xff, 0x10, + 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xf1, 0x0, + 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0x10, 0xe, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xb0, 0x0, 0xef, 0xff, 0xf1, 0x0, 0x9f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xb0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x9f, + 0xff, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x50, 0x9, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0xfc, 0x0, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf1, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x67, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf9, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xca, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xda, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xb5, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x2f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x40, 0xcf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf0, 0x6, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x20, 0x0, 0x5f, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xc7, 0x64, 0x57, 0xbf, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9a, + 0xba, 0x97, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, 0x77, + 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x91, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x2a, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0x85, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x58, 0xff, 0xf3, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x3c, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x3f, 0xff, 0x85, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x58, 0xff, 0xf3, 0x0, 0x0, 0x5, + 0xa2, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x2a, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, + 0x77, 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xe8, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, + 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfc, 0xcf, 0xff, 0xff, 0x88, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x1a, 0xa1, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc1, 0x2, + 0xdf, 0xfd, 0x20, 0x1c, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, + 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0xaf, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0x70, 0x7, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4f, 0xff, 0xff, 0xd2, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x20, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x2, 0xdf, 0xff, + 0xff, 0x50, 0x7f, 0xff, 0xff, 0xb1, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x1c, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xf9, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xfd, 0x3f, 0xff, + 0x60, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x6, 0xff, 0xf3, + 0x6, 0xe4, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x4e, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, 0xef, + 0xfe, 0x20, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2d, + 0xd2, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x61, + 0x16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1e, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, 0x0, + 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfa, 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x50, 0x1e, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe1, 0x9f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x57, + 0x75, 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x0, 0x5, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x4, 0xff, 0xff, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa5, 0x20, + 0x2, 0x6b, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xd, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x54, 0x43, 0x5f, 0xff, 0xff, 0xff, + 0x7, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, + 0xff, 0xff, 0xff, 0xf5, 0x34, 0x45, 0x64, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xb6, 0x20, + 0x2, 0x5a, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x50, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x4a, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3, 0x67, + 0x76, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8, 0xe7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, 0xf9, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3e, + 0xc2, 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0xcf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfe, + 0x10, 0x9, 0xff, 0xb0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0x90, 0x1, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, + 0xf8, 0x0, 0x4, 0xff, 0xf1, 0x0, 0xcf, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0xcf, 0xf7, 0x0, + 0x7f, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x6f, + 0xfb, 0x0, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfb, + 0x0, 0x2f, 0xfe, 0x0, 0x1f, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x1f, 0xfe, 0x0, 0xf, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1f, 0xfe, 0x0, 0xf, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfb, 0x0, 0x2f, + 0xfe, 0x0, 0x2f, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xf5, + 0x0, 0x6f, 0xfb, 0x0, 0x3f, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0xcf, 0xf7, 0x0, 0x7f, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x9, 0xf8, 0x0, 0x4, 0xff, 0xf1, 0x0, + 0xcf, 0xf6, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x90, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xfe, 0x10, 0x9, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x4e, 0xc2, 0x0, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xce, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xfd, 0x88, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x88, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x33, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x6f, 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1f, 0xff, 0xfb, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, + 0xff, 0xb0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xcf, 0xff, 0xfe, 0x72, 0x3, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbd, 0xff, 0xdb, 0x61, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xe5, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x83, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xef, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xee, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x7, 0xdf, 0xff, 0xff, 0xfd, 0x70, 0x0, 0x0, + 0x7, 0xdf, 0xff, 0xff, 0xfd, 0x70, + + /* U+F04D "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0xef, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x38, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xef, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x5e, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xc5, 0x0, + + /* U+F054 "" */ + 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, + 0xef, 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xb5, 0x20, 0x2, + 0x5b, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x4e, 0xfc, 0x70, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x1f, 0xff, + 0xfd, 0x10, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0x30, 0xd, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x41, 0x17, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xf7, 0xc, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x3, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x1, 0xcf, + 0xff, 0xff, 0xfc, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x6, 0xcf, 0xfc, 0x70, 0x0, 0xd, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xb5, + 0x20, 0x2, 0x5b, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, + 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x9, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x15, + 0x9c, 0xef, 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xfa, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xde, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x30, 0x2, 0x5b, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0x30, 0x4e, 0xfc, 0x70, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf7, 0x1f, 0xff, 0xfd, + 0x10, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xf9, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xc2, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0x70, 0x6f, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xb5, 0x20, 0x1, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, 0xca, + 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x90, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x40, 0x0, 0x4, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x33, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x33, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x3f, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, 0x2, 0xef, + 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x40, 0x1e, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x1, 0xdf, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfd, + 0x10, 0x40, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xe1, + 0x4, 0xfa, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfe, 0x20, + 0x3f, 0xff, 0x90, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x2, + 0xef, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf9, 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf4, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x6f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf6, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd1, + 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x10, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, + + /* U+F078 "" */ + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x4, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xfd, 0x10, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xd1, 0xbf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, + 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf2, 0x8, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0xff, + 0xff, 0xef, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0xff, + 0xff, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x6, 0xb4, 0x0, 0xff, 0xff, 0x0, 0x4b, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xb4, 0x0, 0xff, 0xff, 0x0, 0x4b, 0x60, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0xff, + 0xff, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0xff, + 0xff, 0xef, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x8f, 0xff, + 0xff, 0xf8, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xee, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xee, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xea, 0x63, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xb8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x20, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xfe, + 0x20, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfe, 0xec, 0xa8, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x7, 0xcf, 0xfc, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xc5, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xfa, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xc0, 0xcf, 0xff, 0xb1, 0x1b, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, + 0xf, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0xff, + 0xff, 0x10, 0x1, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xc, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xc0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xca, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0xcf, 0xff, 0xb1, 0x1b, 0xff, 0xfc, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0xff, + 0xff, 0x10, 0x1, 0xff, 0xff, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0xc, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xa0, 0x1, 0xdf, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfc, 0x50, 0x0, + 0x0, 0x7c, 0xff, 0xc7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F0C9 "" */ + 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x74, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xf6, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x6f, + 0xff, 0xa0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0xa, 0xff, + 0xff, 0xfd, 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3e, 0xff, + 0xff, 0xe3, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x8e, + 0xe8, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x41, + 0x14, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F0E7 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xff, 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xbf, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, + 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, + 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, + 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, + 0xff, 0x20, 0x2, 0xff, 0x20, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x2f, 0xf2, 0x0, 0x2f, 0xf2, 0x0, 0x2f, + 0xf2, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xf, 0xf0, 0x0, 0xf, 0xf0, + 0x0, 0xf, 0xf0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xf0, 0x0, + 0xf, 0xf0, 0x0, 0xf, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x2f, + 0xf2, 0x0, 0x2f, 0xf2, 0x0, 0x2f, 0xf2, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x2, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x20, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x2, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x20, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9e, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x7a, 0xde, 0xff, 0xff, 0xed, + 0xa7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x96, + 0x42, 0x10, 0x1, 0x24, 0x69, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x7f, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, + 0x5f, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xf5, 0x5, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xbd, 0xef, 0xfe, 0xdb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, + 0x0, 0x46, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0x73, 0x20, 0x2, 0x37, 0xbf, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F241 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F242 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F243 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F244 "" */ + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xce, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb5, + 0x5b, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xc0, 0x0, 0x1d, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0x0, 0x0, 0x6, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x64, 0x0, + 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xfd, 0x30, 0x0, 0x3, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x10, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xbf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf9, 0x12, 0x8f, + 0xf5, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0xaf, 0xff, 0xd3, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xbf, + 0xff, 0xff, 0xff, 0x92, 0x22, 0x22, 0x24, 0xef, + 0xc2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xfd, 0x40, 0x3, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x56, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x3a, 0xaa, 0xaa, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x40, 0x8, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x76, 0xbf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xcc, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x4, 0x8c, 0xdf, 0xfe, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf4, 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf4, 0xa, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x90, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe0, + 0x2f, 0xff, 0xff, 0xef, 0xff, 0xf4, 0x5, 0x20, + 0x1d, 0xff, 0xff, 0xf3, 0x6f, 0xff, 0xfc, 0x19, + 0xff, 0xf4, 0x6, 0xe2, 0x2, 0xef, 0xff, 0xf7, + 0x9f, 0xff, 0xf3, 0x0, 0x9f, 0xf4, 0x6, 0xfe, + 0x10, 0x3f, 0xff, 0xf9, 0xbf, 0xff, 0xfe, 0x20, + 0x9, 0xf4, 0x6, 0xf8, 0x0, 0xaf, 0xff, 0xfb, + 0xdf, 0xff, 0xff, 0xe2, 0x0, 0x94, 0x6, 0x80, + 0x9, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x1, 0x0, 0x7f, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x33, 0x4, 0x20, 0xc, 0xff, 0xff, 0xfe, + 0xcf, 0xff, 0xff, 0x70, 0x3, 0xe4, 0x6, 0xe2, + 0x0, 0xcf, 0xff, 0xfc, 0xaf, 0xff, 0xf7, 0x0, + 0x3f, 0xf4, 0x6, 0xfe, 0x10, 0x1e, 0xff, 0xfb, + 0x7f, 0xff, 0xf7, 0x3, 0xff, 0xf4, 0x6, 0xf8, + 0x0, 0x6f, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0x9f, + 0xff, 0xf4, 0x6, 0x80, 0x6, 0xff, 0xff, 0xf5, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x1, 0x0, + 0x6f, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf5, 0x6, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x8c, 0xef, 0xff, 0xec, 0x83, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf3, 0x3f, 0xff, 0xf3, 0x3f, + 0xff, 0xf3, 0x3f, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xf0, 0xf, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x3f, 0xff, + 0xf3, 0x3f, 0xff, 0xf3, 0x3f, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8c, 0x10, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x10, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x10, + 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, + 0x10, 0x6f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x6f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xec, 0xa9, 0x75, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xaf, 0xff, + 0xff, 0xfa, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xaf, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, + 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfa, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, + 0xf0, 0x0, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xf0, + 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, + 0x8, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, + 0xf0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0x0, 0xf, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0x0, 0xf, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x2, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x10, 0x1, 0xcf, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0x12, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x20, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 138, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 137, .box_w = 5, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 55, .adv_w = 200, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, + {.bitmap_index = 96, .adv_w = 360, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 338, .adv_w = 318, .box_w = 18, .box_h = 30, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 608, .adv_w = 432, .box_w = 25, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 883, .adv_w = 351, .box_w = 21, .box_h = 23, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1125, .adv_w = 108, .box_w = 3, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, + {.bitmap_index = 1139, .adv_w = 173, .box_w = 7, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 1244, .adv_w = 173, .box_w = 7, .box_h = 30, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1349, .adv_w = 205, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1427, .adv_w = 298, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 1532, .adv_w = 116, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1555, .adv_w = 196, .box_w = 10, .box_h = 3, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 1570, .adv_w = 116, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1583, .adv_w = 180, .box_w = 14, .box_h = 30, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 1793, .adv_w = 342, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2002, .adv_w = 189, .box_w = 9, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2101, .adv_w = 294, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2299, .adv_w = 293, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2486, .adv_w = 343, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2717, .adv_w = 294, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2915, .adv_w = 316, .box_w = 18, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3113, .adv_w = 306, .box_w = 18, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3311, .adv_w = 330, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3520, .adv_w = 316, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3729, .adv_w = 116, .box_w = 5, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3772, .adv_w = 116, .box_w = 5, .box_h = 22, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 3827, .adv_w = 298, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 3940, .adv_w = 298, .box_w = 15, .box_h = 10, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 4015, .adv_w = 298, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4128, .adv_w = 293, .box_w = 17, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4315, .adv_w = 529, .box_w = 31, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 4749, .adv_w = 375, .box_w = 25, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5024, .adv_w = 388, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5244, .adv_w = 370, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5475, .adv_w = 423, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5717, .adv_w = 343, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 5904, .adv_w = 325, .box_w = 17, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6091, .adv_w = 395, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6333, .adv_w = 416, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6553, .adv_w = 159, .box_w = 4, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6597, .adv_w = 263, .box_w = 15, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6762, .adv_w = 368, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6982, .adv_w = 304, .box_w = 16, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7158, .adv_w = 489, .box_w = 25, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7433, .adv_w = 416, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7653, .adv_w = 430, .box_w = 25, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7928, .adv_w = 370, .box_w = 19, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8137, .adv_w = 430, .box_w = 26, .box_h = 27, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 8488, .adv_w = 372, .box_w = 19, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8697, .adv_w = 318, .box_w = 18, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8895, .adv_w = 301, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9104, .adv_w = 405, .box_w = 20, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9324, .adv_w = 365, .box_w = 24, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9588, .adv_w = 577, .box_w = 35, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9973, .adv_w = 345, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10215, .adv_w = 331, .box_w = 22, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10457, .adv_w = 336, .box_w = 20, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10677, .adv_w = 170, .box_w = 8, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 10797, .adv_w = 180, .box_w = 15, .box_h = 30, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 11022, .adv_w = 170, .box_w = 8, .box_h = 30, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 11142, .adv_w = 298, .box_w = 15, .box_h = 13, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 11240, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11256, .adv_w = 307, .box_w = 9, .box_h = 4, .ofs_x = 3, .ofs_y = 19}, + {.bitmap_index = 11274, .adv_w = 306, .box_w = 16, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11410, .adv_w = 349, .box_w = 19, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11638, .adv_w = 292, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11783, .adv_w = 349, .box_w = 18, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11999, .adv_w = 313, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12152, .adv_w = 181, .box_w = 13, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12308, .adv_w = 353, .box_w = 19, .box_h = 23, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 12527, .adv_w = 349, .box_w = 18, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12743, .adv_w = 143, .box_w = 5, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12803, .adv_w = 145, .box_w = 10, .box_h = 30, .ofs_x = -3, .ofs_y = -6}, + {.bitmap_index = 12953, .adv_w = 315, .box_w = 18, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13169, .adv_w = 143, .box_w = 4, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13217, .adv_w = 541, .box_w = 30, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13472, .adv_w = 349, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13625, .adv_w = 325, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13778, .adv_w = 349, .box_w = 19, .box_h = 23, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 13997, .adv_w = 349, .box_w = 18, .box_h = 23, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 14204, .adv_w = 210, .box_w = 11, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14298, .adv_w = 257, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14434, .adv_w = 212, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14571, .adv_w = 347, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14716, .adv_w = 286, .box_w = 19, .box_h = 17, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14878, .adv_w = 460, .box_w = 29, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15125, .adv_w = 283, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15278, .adv_w = 286, .box_w = 19, .box_h = 23, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 15497, .adv_w = 267, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15625, .adv_w = 180, .box_w = 10, .box_h = 30, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 15775, .adv_w = 153, .box_w = 4, .box_h = 30, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 15835, .adv_w = 180, .box_w = 10, .box_h = 30, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 15985, .adv_w = 298, .box_w = 16, .box_h = 6, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 16033, .adv_w = 215, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = 12}, + {.bitmap_index = 16088, .adv_w = 161, .box_w = 6, .box_h = 6, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 16106, .adv_w = 512, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16634, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17018, .adv_w = 512, .box_w = 32, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17466, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17850, .adv_w = 352, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 18092, .adv_w = 512, .box_w = 31, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 18588, .adv_w = 512, .box_w = 30, .box_h = 32, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 19068, .adv_w = 576, .box_w = 36, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19572, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 20084, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20516, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21028, .adv_w = 256, .box_w = 16, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21236, .adv_w = 384, .box_w = 24, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21548, .adv_w = 576, .box_w = 36, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22124, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22508, .adv_w = 352, .box_w = 22, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22860, .adv_w = 448, .box_w = 20, .box_h = 30, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 23160, .adv_w = 448, .box_w = 28, .box_h = 34, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 23636, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24042, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24434, .adv_w = 448, .box_w = 20, .box_h = 30, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 24734, .adv_w = 448, .box_w = 30, .box_h = 28, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 25154, .adv_w = 320, .box_w = 18, .box_h = 28, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25406, .adv_w = 320, .box_w = 18, .box_h = 28, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25658, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26050, .adv_w = 448, .box_w = 28, .box_h = 6, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 26134, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26566, .adv_w = 640, .box_w = 40, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 27206, .adv_w = 576, .box_w = 38, .box_h = 32, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 27814, .adv_w = 512, .box_w = 32, .box_h = 30, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28294, .adv_w = 448, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 28546, .adv_w = 448, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 28798, .adv_w = 640, .box_w = 40, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29318, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29702, .adv_w = 512, .box_w = 32, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 30214, .adv_w = 512, .box_w = 33, .box_h = 33, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 30759, .adv_w = 448, .box_w = 29, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31165, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31613, .adv_w = 448, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32005, .adv_w = 448, .box_w = 28, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32369, .adv_w = 512, .box_w = 32, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32753, .adv_w = 320, .box_w = 22, .box_h = 32, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 33105, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 33553, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 34001, .adv_w = 576, .box_w = 36, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34433, .adv_w = 512, .box_w = 34, .box_h = 34, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 35011, .adv_w = 384, .box_w = 24, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35395, .adv_w = 640, .box_w = 40, .box_h = 29, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35975, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 36375, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 36775, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 37175, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 37575, .adv_w = 640, .box_w = 40, .box_h = 20, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 37975, .adv_w = 640, .box_w = 41, .box_h = 26, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 38508, .adv_w = 448, .box_w = 24, .box_h = 32, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 38892, .adv_w = 448, .box_w = 28, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 39340, .adv_w = 512, .box_w = 33, .box_h = 33, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 39885, .adv_w = 640, .box_w = 40, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 40365, .adv_w = 384, .box_w = 24, .box_h = 32, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 40749, .adv_w = 515, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 5, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 23, 0, 14, -11, 0, 0, + 0, 0, -28, -31, 4, 24, 11, 9, + -20, 4, 25, 2, 22, 5, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 4, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 0, -15, 0, 0, 0, 0, + 0, -10, 9, 10, 0, 0, -5, 0, + -4, 5, 0, -5, 0, -5, -3, -10, + 0, 0, 0, 0, -5, 0, 0, -7, + -8, 0, 0, -5, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, -8, 0, -14, 0, -62, 0, + 0, -10, 0, 10, 15, 1, 0, -10, + 5, 5, 17, 10, -9, 10, 0, 0, + -29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -14, -6, -25, 0, -20, + -4, 0, 0, 0, 0, 1, 20, 0, + -15, -4, -2, 2, 0, -9, 0, 0, + -4, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -41, -4, 19, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 17, + 0, 5, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 10, 5, 15, -5, 0, 0, 10, -5, + -17, -70, 4, 14, 10, 1, -7, 0, + 18, 0, 16, 0, 16, 0, -48, 0, + -6, 15, 0, 17, -5, 10, 5, 0, + 0, 2, -5, 0, 0, -9, 41, 0, + 41, 0, 15, 0, 22, 7, 9, 15, + 0, 0, 0, -19, 0, 0, 0, 0, + 2, -4, 0, 4, -9, -7, -10, 4, + 0, -5, 0, 0, 0, -20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -28, 0, -32, 0, 0, 0, + 0, -4, 0, 51, -6, -7, 5, 5, + -5, 0, -7, 5, 0, 0, -27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -50, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -32, 0, 31, 0, 0, -19, 0, + 17, 0, -35, -50, -35, -10, 15, 0, + 0, -34, 0, 6, -12, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13, 15, -62, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -6, -10, 0, -2, + -2, -5, 0, 0, -4, 0, 0, 0, + -10, 0, -4, 0, -12, -10, 0, -13, + -17, -17, -10, 0, -10, 0, -10, 0, + 0, 0, 0, -4, 0, 0, 5, 0, + 4, -5, 0, 2, 0, 0, 0, 5, + -4, 0, 0, 0, -4, 5, 5, -2, + 0, 0, 0, -10, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 7, -4, 0, + -6, 0, -9, 0, 0, -4, 0, 15, + 0, 0, -5, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -5, -6, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -5, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -4, -7, 0, -8, 0, -15, + -4, -15, 10, 0, 0, -10, 5, 10, + 14, 0, -13, -2, -6, 0, -2, -24, + 5, -4, 4, -27, 5, 0, 0, 2, + -27, 0, -27, -4, -45, -4, 0, -26, + 0, 10, 14, 0, 7, 0, 0, 0, + 0, 1, 0, -9, -7, 0, -15, 0, + 0, 0, -5, 0, 0, 0, -5, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -7, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, -4, -6, -4, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -6, + 0, -4, 0, -10, 5, 0, 0, -6, + 3, 5, 5, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -5, 0, -5, -4, -6, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -6, -8, 0, + -10, 0, 15, -4, 2, -16, 0, 0, + 14, -26, -27, -22, -10, 5, 0, -4, + -33, -9, 0, -9, 0, -10, 8, -9, + -33, 0, -14, 0, 0, 3, -2, 4, + -4, 0, 5, 1, -15, -19, 0, -26, + -12, -11, -12, -15, -6, -14, -1, -10, + -14, 3, 0, 2, 0, -5, 0, 0, + 0, 4, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -3, 0, -2, -5, 0, -9, -11, + -11, -2, 0, -15, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -10, 0, 0, 0, 0, -26, -15, 0, + 0, 0, -8, -26, 0, 0, -5, 5, + 0, -14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, -9, 0, + 0, 0, 0, 6, 0, 4, -10, -10, + 0, -5, -5, -6, 0, 0, 0, 0, + 0, 0, -15, 0, -5, 0, -8, -5, + 0, -11, -13, -15, -4, 0, -10, 0, + -15, 0, 0, 0, 0, 41, 0, 0, + 3, 0, 0, -7, 0, 5, 0, -22, + 0, 0, 0, 0, 0, -48, -9, 17, + 15, -4, -22, 0, 5, -8, 0, -26, + -3, -7, 5, -36, -5, 7, 0, 8, + -18, -8, -19, -17, -22, 0, 0, -31, + 0, 29, 0, 0, -3, 0, 0, 0, + -3, -3, -5, -14, -17, -1, -48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -3, -5, -8, 0, 0, + -10, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -10, 0, 0, 10, + -2, 7, 0, -11, 5, -4, -2, -13, + -5, 0, -7, -5, -4, 0, -8, -9, + 0, 0, -4, -2, -4, -9, -6, 0, + 0, -5, 0, 5, -4, 0, -11, 0, + 0, 0, -10, 0, -9, 0, -9, -9, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 5, 0, -7, 0, -4, -6, + -16, -4, -4, -4, -2, -4, -6, -2, + 0, 0, 0, 0, 0, -5, -4, -4, + 0, 0, 0, 0, 6, -4, 0, -4, + 0, 0, 0, -4, -6, -4, -5, -6, + -5, 0, 4, 20, -2, 0, -14, 0, + -4, 10, 0, -5, -22, -7, 8, 1, + 0, -24, -9, 5, -9, 4, 0, -4, + -4, -16, 0, -8, 3, 0, 0, -9, + 0, 0, 0, 5, 5, -10, -10, 0, + -9, -5, -8, -5, -5, 0, -9, 3, + -10, -9, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -7, + 0, 0, -5, -5, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -8, 0, -10, 0, 0, 0, -17, 0, + 4, -11, 10, 1, -4, -24, 0, 0, + -11, -5, 0, -20, -13, -14, 0, 0, + -22, -5, -20, -19, -25, 0, -13, 0, + 4, 34, -7, 0, -12, -5, -2, -5, + -9, -14, -9, -19, -21, -12, -5, 0, + 0, -4, 0, 2, 0, 0, -36, -5, + 15, 11, -11, -19, 0, 2, -16, 0, + -26, -4, -5, 10, -47, -7, 2, 0, + 0, -33, -6, -27, -5, -37, 0, 0, + -36, 0, 30, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -19, -4, 0, -33, + 0, 0, 0, 0, -16, 0, -5, 0, + -2, -14, -24, 0, 0, -3, -8, -15, + -5, 0, -4, 0, 0, 0, 0, -23, + -5, -17, -16, -4, -9, -13, -5, -9, + 0, -10, -5, -17, -8, 0, -6, -10, + -5, -10, 0, 3, 0, -4, -17, 0, + 10, 0, -9, 0, 0, 0, 0, 6, + 0, 4, -10, 21, 0, -5, -5, -6, + 0, 0, 0, 0, 0, 0, -15, 0, + -5, 0, -8, -5, 0, -11, -13, -15, + -4, 0, -10, 4, 20, 0, 0, 0, + 0, 41, 0, 0, 3, 0, 0, -7, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -10, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -5, -5, 0, 0, -10, + -5, 0, 0, -10, 0, 9, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 8, 10, 4, -5, 0, -16, + -8, 0, 15, -17, -16, -10, -10, 20, + 9, 5, -45, -4, 10, -5, 0, -5, + 6, -5, -18, 0, -5, 5, -7, -4, + -15, -4, 0, 0, 15, 10, 0, -14, + 0, -28, -7, 15, -7, -19, 2, -7, + -17, -17, -5, 20, 5, 0, -8, 0, + -14, 0, 4, 17, -12, -19, -20, -13, + 15, 0, 2, -37, -4, 5, -9, -4, + -12, 0, -11, -19, -8, -8, -4, 0, + 0, -12, -11, -5, 0, 15, 12, -5, + -28, 0, -28, -7, 0, -18, -30, -2, + -16, -9, -17, -14, 14, 0, 0, -7, + 0, -10, -5, 0, -5, -9, 0, 9, + -17, 5, 0, 0, -27, 0, -5, -11, + -9, -4, -15, -13, -17, -12, 0, -15, + -5, -12, -10, -15, -5, 0, 0, 2, + 24, -9, 0, -15, -5, 0, -5, -10, + -12, -14, -14, -19, -7, -10, 10, 0, + -8, 0, -26, -6, 3, 10, -16, -19, + -10, -17, 17, -5, 3, -48, -9, 10, + -11, -9, -19, 0, -15, -22, -6, -5, + -4, -5, -11, -15, -2, 0, 0, 15, + 14, -4, -33, 0, -31, -12, 12, -19, + -35, -10, -18, -22, -26, -17, 10, 0, + 0, 0, 0, -6, 0, 0, 5, -6, + 10, 4, -10, 10, 0, 0, -16, -2, + 0, -2, 0, 2, 2, -4, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 4, 15, 1, 0, -6, 0, 0, + 0, 0, -4, -4, -6, 0, 0, 0, + 2, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 19, 0, 9, 2, 2, -7, + 0, 10, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -31, 0, -5, 9, 0, 15, + 0, 0, 51, 6, -10, -10, 5, 5, + -4, 2, -26, 0, 0, 25, -31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -35, 19, 72, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -10, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -14, 0, + 0, 2, 0, 0, 5, 66, -10, -4, + 16, 14, -14, 5, 0, 0, 5, 5, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -67, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -14, + 0, 0, 0, -14, 0, 0, 0, 0, + -11, -3, 0, 0, 0, -11, 0, -6, + 0, -24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -34, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -5, 0, 0, -10, 0, -8, 0, + -14, 0, 0, 0, -9, 5, -6, 0, + 0, -14, -5, -12, 0, 0, -14, 0, + -5, 0, -24, 0, -6, 0, 0, -41, + -10, -20, -6, -18, 0, 0, -34, 0, + -14, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -8, -9, -4, -9, 0, 0, + 0, 0, -11, 0, -11, 7, -6, 10, + 0, -4, -12, -4, -9, -10, 0, -6, + -3, -4, 4, -14, -2, 0, 0, 0, + -45, -4, -7, 0, -11, 0, -4, -24, + -5, 0, 0, -4, -4, 0, 0, 0, + 0, 4, 0, -4, -9, -4, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, -11, 0, -4, 0, 0, 0, -10, + 5, 0, 0, 0, -14, -5, -10, 0, + 0, -14, 0, -5, 0, -24, 0, 0, + 0, 0, -50, 0, -10, -19, -26, 0, + 0, -34, 0, -4, -8, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -8, -3, + -8, 2, 0, 0, 9, -7, 0, 16, + 25, -5, -5, -15, 6, 25, 9, 11, + -14, 6, 22, 6, 15, 11, 14, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 24, -9, -5, 0, -4, + 41, 22, 41, 0, 0, 0, 5, 0, + 0, 19, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 7, + 0, 0, 0, 0, -43, -6, -4, -21, + -25, 0, 0, -34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, -43, -6, -4, + -21, -25, 0, 0, -20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -12, 5, 0, -5, + 4, 9, 5, -15, 0, -1, -4, 5, + 0, 4, 0, 0, 0, 0, -13, 0, + -5, -4, -10, 0, -5, -20, 0, 32, + -5, 0, -11, -4, 0, -4, -9, 0, + -5, -14, -10, -6, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, -43, + -6, -4, -21, -25, 0, 0, -34, 0, + 0, 0, 0, 0, 0, 26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, -16, -6, -5, 15, -5, -5, + -20, 2, -3, 2, -4, -14, 1, 11, + 1, 4, 2, 4, -12, -20, -6, 0, + -19, -10, -14, -22, -20, 0, -8, -10, + -6, -7, -4, -4, -6, -4, 0, -4, + -2, 8, 0, 8, -4, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -5, -5, 0, 0, + -14, 0, -3, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, 0, 0, 0, -4, 0, 0, -9, + -5, 5, 0, -9, -10, -4, 0, -15, + -4, -11, -4, -6, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -34, 0, 16, 0, 0, -9, 0, + 0, 0, 0, -7, 0, -5, 0, 0, + -3, 0, 0, -4, 0, -12, 0, 0, + 22, -7, -17, -16, 4, 6, 6, -1, + -14, 4, 8, 4, 15, 4, 17, -4, + -14, 0, 0, -20, 0, 0, -15, -14, + 0, 0, -10, 0, -7, -9, 0, -8, + 0, -8, 0, -4, 8, 0, -4, -15, + -5, 19, 0, 0, -5, 0, -10, 0, + 0, 7, -12, 0, 5, -5, 4, 1, + 0, -17, 0, -4, -2, 0, -5, 6, + -4, 0, 0, 0, -21, -6, -11, 0, + -15, 0, 0, -24, 0, 19, -5, 0, + -9, 0, 3, 0, -5, 0, -5, -15, + 0, -5, 5, 0, 0, 0, 0, -4, + 0, 0, 5, -7, 2, 0, 0, -6, + -4, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -32, 0, 11, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -5, -5, 0, 0, 0, 10, 0, 12, + 0, 0, 0, 0, 0, -32, -29, 2, + 22, 15, 9, -20, 4, 22, 0, 19, + 0, 10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_32 = { +#else +lv_font_t lv_font_montserrat_32 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 35, /*The maximum line height required by the font*/ + .base_line = 6, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_32*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_34.c b/inc/lvgl/src/font/lv_font_montserrat_34.c new file mode 100644 index 0000000..7577c73 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_34.c @@ -0,0 +1,7011 @@ +/******************************************************************************* + * Size: 34 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 34 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_34.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_34 + #define LV_FONT_MONTSERRAT_34 1 +#endif + +#if LV_FONT_MONTSERRAT_34 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x5f, 0xff, 0x74, 0xff, 0xf7, 0x4f, 0xff, 0x63, + 0xff, 0xf5, 0x2f, 0xff, 0x52, 0xff, 0xf4, 0x1f, + 0xff, 0x31, 0xff, 0xf3, 0xf, 0xff, 0x20, 0xff, + 0xf1, 0xf, 0xff, 0x10, 0xef, 0xf0, 0xd, 0xff, + 0x0, 0xdf, 0xf0, 0xc, 0xfe, 0x0, 0xcf, 0xd0, + 0x1, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x10, 0x2e, 0xff, 0x49, 0xff, 0xfb, 0x8f, + 0xff, 0x90, 0xbf, 0xc1, + + /* U+0022 "\"" */ + 0xdf, 0xf0, 0x0, 0xbf, 0xf2, 0xdf, 0xf0, 0x0, + 0xaf, 0xf1, 0xcf, 0xe0, 0x0, 0xaf, 0xf1, 0xcf, + 0xe0, 0x0, 0xaf, 0xf0, 0xcf, 0xe0, 0x0, 0x9f, + 0xf0, 0xbf, 0xd0, 0x0, 0x9f, 0xf0, 0xbf, 0xd0, + 0x0, 0x8f, 0xf0, 0xbf, 0xc0, 0x0, 0x8f, 0xf0, + 0xaf, 0xc0, 0x0, 0x8f, 0xe0, 0x1, 0x0, 0x0, + 0x1, 0x10, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x4, 0xff, 0x20, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf0, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xc0, + 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, + 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x77, 0x77, 0x9f, + 0xf8, 0x77, 0x77, 0x7b, 0xff, 0x77, 0x77, 0x70, + 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, 0x8f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf0, + 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xb0, 0x0, + 0x0, 0xe, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf9, 0x0, 0x0, 0x0, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x70, 0x0, 0x0, + 0x2f, 0xf4, 0x0, 0x0, 0x0, 0x77, 0x77, 0x7f, + 0xfa, 0x77, 0x77, 0x79, 0xff, 0x97, 0x77, 0x60, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd0, 0x0, + 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, + 0xf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xf7, 0x0, 0x0, 0x1, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x50, 0x0, 0x0, 0x3f, + 0xf2, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xad, 0xff, 0xff, 0xdb, 0x71, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xe6, 0x15, 0xfd, + 0x1, 0x4a, 0xff, 0x20, 0xa, 0xff, 0xe2, 0x0, + 0x5f, 0xd0, 0x0, 0x2, 0x70, 0x0, 0xef, 0xf7, + 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x50, 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf7, 0x0, 0x5, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe3, 0x0, 0x5f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf9, 0x35, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xd1, 0x7e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x5, 0xfd, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xd0, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0xaf, + 0xfb, 0x2, 0x0, 0x0, 0x0, 0x5f, 0xd0, 0x0, + 0xc, 0xff, 0x90, 0xdd, 0x30, 0x0, 0x5, 0xfd, + 0x0, 0x4, 0xff, 0xf5, 0x4f, 0xff, 0xb5, 0x10, + 0x5f, 0xd0, 0x28, 0xff, 0xfd, 0x3, 0xef, 0xff, + 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfe, 0x20, 0x1, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x5, 0x9d, 0xef, 0xff, 0xfd, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x7, 0xdf, 0xeb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xb0, 0x0, 0x0, 0xa, 0xfd, 0x30, 0x7, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, + 0x3, 0xff, 0x30, 0x0, 0x9, 0xfc, 0x0, 0x0, + 0x0, 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x7f, 0xc0, + 0x0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, + 0xff, 0x30, 0x0, 0x9, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0xbf, 0x70, 0x0, 0x0, 0xe, 0xf4, 0x0, + 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, 0xf9, + 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, 0xef, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, + 0x2f, 0xf1, 0x0, 0x9f, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x9, 0xfc, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xfd, 0x30, 0x7, 0xff, 0x40, 0x1e, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0x70, 0xa, 0xfe, 0x10, 0x6, 0xbe, 0xda, + 0x30, 0x0, 0x0, 0x7, 0xdf, 0xeb, 0x40, 0x5, + 0xff, 0x40, 0xb, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0x90, 0x9, + 0xfe, 0x50, 0x18, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xe0, 0x1, 0xff, 0x40, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf4, 0x0, 0x6f, 0xd0, 0x0, 0x0, 0x2f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xf9, 0x0, 0x9, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0x0, 0x0, 0x9f, 0x80, 0x0, + 0x0, 0xd, 0xf6, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x30, 0x0, 0x9, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0x50, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, + 0x6f, 0xc0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x2, 0xff, 0x20, + 0x0, 0x7, 0xfd, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0x0, 0x0, 0x0, 0xa, 0xfc, 0x10, 0x3, 0xff, + 0x50, 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xcc, 0xff, 0x90, 0x0, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xfb, 0x50, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x5a, 0xef, 0xfd, 0x92, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x96, 0x6b, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0x7f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, + 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf5, 0x0, 0x7, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x32, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0xc, 0xff, 0xf4, 0x0, 0x2, + 0xff, 0x60, 0x6, 0xff, 0xe3, 0x0, 0x0, 0xcf, + 0xff, 0x40, 0x7, 0xff, 0x60, 0xe, 0xff, 0x50, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xc, 0xff, 0x10, + 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x8f, 0xfc, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf4, 0x0, 0x6f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf5, 0x0, 0xc, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0x50, 0x1, + 0xdf, 0xff, 0xfd, 0xbb, 0xcf, 0xff, 0xfe, 0x3a, + 0xff, 0xf5, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0xaf, 0xf5, 0x0, 0x0, 0x27, + 0xce, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x9, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xdf, 0xfd, 0xff, 0xcf, 0xec, 0xfe, 0xcf, 0xeb, + 0xfd, 0xbf, 0xdb, 0xfc, 0xaf, 0xc0, 0x10, + + /* U+0028 "(" */ + 0x0, 0x1, 0xef, 0xf2, 0x0, 0x9, 0xff, 0x90, + 0x0, 0x1f, 0xff, 0x20, 0x0, 0x7f, 0xfa, 0x0, + 0x0, 0xdf, 0xf4, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0xc, 0xff, 0x60, 0x0, + 0xf, 0xff, 0x30, 0x0, 0x3f, 0xff, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x0, 0x8f, 0xfa, 0x0, 0x0, + 0x9f, 0xf9, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0x0, + 0xbf, 0xf8, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, + 0xcf, 0xf7, 0x0, 0x0, 0xbf, 0xf8, 0x0, 0x0, + 0xaf, 0xf8, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x8f, 0xfa, 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, + 0xc, 0xff, 0x60, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xe0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xe, 0xff, 0x20, + 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0xef, 0xf2, + + /* U+0029 ")" */ + 0xaf, 0xf7, 0x0, 0x0, 0x2f, 0xff, 0x10, 0x0, + 0xa, 0xff, 0x80, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x7f, 0xfb, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0xe, 0xff, 0x40, + 0x0, 0xb, 0xff, 0x70, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0x6, 0xff, 0xd0, 0x0, 0x3, 0xff, 0xf0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0x0, 0xff, 0xf3, 0x0, 0x0, 0xff, 0xf4, + 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xf3, + 0x0, 0x1, 0xff, 0xf2, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x3, 0xff, 0xf0, 0x0, 0x6, 0xff, 0xd0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0xb, 0xff, 0x70, + 0x0, 0xe, 0xff, 0x40, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x3, 0xff, 0xe0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x6, 0x60, 0x3, + 0xfc, 0x0, 0x19, 0x21, 0xff, 0xc3, 0x3f, 0xc0, + 0x7f, 0xfa, 0x8, 0xff, 0xfb, 0xfe, 0xdf, 0xfd, + 0x40, 0x1, 0x9f, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x2e, 0xff, 0xb5, 0xfc, + 0x6e, 0xff, 0xa0, 0xcd, 0x50, 0x3f, 0xc0, 0x8, + 0xf6, 0x1, 0x0, 0x3, 0xfc, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x87, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x6b, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x7a, 0xaa, 0xaa, 0xdf, 0xfc, 0xaa, 0xaa, 0xa5, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x54, 0x0, 0xd, 0xff, 0x90, 0x4f, 0xff, + 0xf0, 0x4f, 0xff, 0xf0, 0xa, 0xff, 0xc0, 0x1, + 0xff, 0x70, 0x5, 0xff, 0x20, 0x9, 0xfc, 0x0, + 0xd, 0xf7, 0x0, 0x1f, 0xf1, 0x0, + + /* U+002D "-" */ + 0xc, 0xcc, 0xcc, 0xcc, 0xcc, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x10, + + /* U+002E "." */ + 0x2, 0x87, 0x0, 0x1f, 0xff, 0xc0, 0x6f, 0xff, + 0xf1, 0x3f, 0xff, 0xe0, 0x7, 0xed, 0x40, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x88, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x39, 0xcf, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xc5, 0x10, 0x26, 0xef, 0xff, + 0x80, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0x30, 0x0, 0x1f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xfb, 0x0, 0x7, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x0, 0xcf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x70, 0xf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xd0, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x5f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x4, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf7, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x20, 0x1, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x41, 0x1, + 0x6e, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xeb, + 0x71, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, + 0xff, 0xf0, 0xae, 0xee, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xf0, + + /* U+0032 "2" */ + 0x0, 0x0, 0x27, 0xbd, 0xef, 0xec, 0x82, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0xa5, + 0x10, 0x2, 0x6e, 0xff, 0xf8, 0x0, 0x7, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x0, + 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xe5, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, + + /* U+0033 "3" */ + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xa, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, + 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xaa, 0xcf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfd, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfb, 0xd, 0xe5, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf5, 0x7f, 0xff, 0xd8, 0x31, + 0x0, 0x15, 0xcf, 0xff, 0xc0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x1, 0x59, 0xce, 0xff, 0xdb, 0x72, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc0, + 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0x10, 0x0, 0x6, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, + 0x0, 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x1, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, 0xd0, + 0x0, 0x0, 0xc, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xd0, 0x0, 0x0, 0x8f, 0xff, 0xfe, + 0xee, 0xee, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xe4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0xe0, 0x0, 0x0, 0xcf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xec, 0x95, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x49, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf4, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x20, 0x6f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xd0, 0x1e, 0xff, + 0xe9, 0x52, 0x0, 0x3, 0x9f, 0xff, 0xf4, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xdf, 0xfe, + 0xda, 0x50, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xc8, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xf3, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x83, 0x0, 0x0, 0x27, 0xa0, 0x0, + 0x0, 0x4f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x30, 0x1, 0x69, 0xaa, + 0x85, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x12, 0xbf, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5f, 0xff, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x5f, 0xff, 0xef, 0xfa, 0x41, 0x1, 0x5b, 0xff, + 0xfc, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x60, 0x3f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x1f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0xcf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xe5, 0x0, 0x0, 0x7, 0xff, + 0xfd, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0xbc, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xce, 0xfe, 0xc9, 0x30, 0x0, 0x0, + + /* U+0037 "7" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xff, 0xfd, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xe0, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x33, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xdc, 0xce, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xef, + 0xff, 0x81, 0x0, 0x0, 0x29, 0xff, 0xfd, 0x0, + 0x6, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x40, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x70, 0x9, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x7, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, + 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xb5, 0x10, 0x2, + 0x5c, 0xff, 0xf5, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x7f, 0xff, 0xfd, 0xa9, 0x9a, 0xef, 0xff, + 0xf5, 0x0, 0x6, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0x50, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x5f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, + 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf5, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x5f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0xf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe0, + 0x7, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x16, 0xef, + 0xff, 0x50, 0x0, 0x8f, 0xff, 0xff, 0xdb, 0xcd, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x5, 0x9c, 0xef, 0xfe, 0xc8, 0x40, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xec, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xdc, 0xdf, 0xff, 0xfe, 0x30, 0x0, 0x0, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0x5e, 0xff, 0xe1, 0x0, + 0x6, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xfb, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x30, 0xf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x90, 0xf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf3, 0x6, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0xdf, + 0xff, 0xb5, 0x10, 0x14, 0xaf, 0xfe, 0xff, 0xf5, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xf4, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xfb, 0x21, 0xff, 0xf3, 0x0, 0x0, 0x1, 0x69, + 0xab, 0x97, 0x20, 0x3, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf4, 0x0, + 0x0, 0xa, 0x72, 0x0, 0x0, 0x38, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xef, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x7, 0xed, 0x40, 0x4f, 0xff, 0xe0, 0x6f, 0xff, + 0xf1, 0x1f, 0xff, 0xb0, 0x2, 0x87, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x87, 0x0, 0x1f, 0xff, 0xc0, 0x6f, 0xff, 0xf1, + 0x3f, 0xff, 0xe0, 0x7, 0xed, 0x40, + + /* U+003B ";" */ + 0x7, 0xed, 0x40, 0x4f, 0xff, 0xe0, 0x6f, 0xff, + 0xf1, 0x1f, 0xff, 0xb0, 0x2, 0x87, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x54, 0x0, 0xd, 0xff, 0x90, 0x4f, 0xff, 0xf0, + 0x4f, 0xff, 0xf0, 0xa, 0xff, 0xc0, 0x1, 0xff, + 0x70, 0x5, 0xff, 0x20, 0x9, 0xfc, 0x0, 0xd, + 0xf7, 0x0, 0x1f, 0xf1, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xc8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xc6, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xfe, 0x82, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xfb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xfe, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, + + /* U+003D "=" */ + 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+003E ">" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7d, 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, 0xd7, 0x10, + 0x0, 0x6, 0xcf, 0xff, 0xff, 0xa3, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x27, 0xcd, 0xff, 0xec, 0x83, 0x0, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xf8, 0x20, 0x0, + 0x6, 0xef, 0xff, 0x90, 0x9, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf0, 0x0, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x55, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xb0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xde, + 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc8, + 0x64, 0x44, 0x57, 0xae, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x20, 0x0, 0x5, 0xff, 0x80, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xd9, 0x30, 0xd, 0xff, + 0x10, 0x1e, 0xfb, 0x0, 0x0, 0xdf, 0xd0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xdf, + 0xf1, 0x0, 0x5f, 0xf3, 0x0, 0x4f, 0xf6, 0x0, + 0x0, 0x2e, 0xff, 0xfe, 0xa9, 0xbf, 0xff, 0xce, + 0xff, 0x10, 0x0, 0xdf, 0x90, 0xa, 0xfe, 0x0, + 0x0, 0xd, 0xff, 0xe4, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf1, 0x0, 0x7, 0xfe, 0x0, 0xef, 0xa0, + 0x0, 0x8, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x10, 0x0, 0x2f, 0xf2, 0x1f, 0xf6, + 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x0, 0x0, 0xff, 0x54, 0xff, + 0x30, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0x0, 0xd, 0xf7, 0x5f, + 0xf2, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0xcf, 0x85, + 0xff, 0x10, 0x0, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0xc, 0xf7, + 0x5f, 0xf2, 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0xdf, + 0x74, 0xff, 0x30, 0x0, 0x2f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x0, 0xf, + 0xf5, 0x1f, 0xf6, 0x0, 0x0, 0xef, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x3, + 0xff, 0x20, 0xef, 0xa0, 0x0, 0x8, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, + 0x8f, 0xd0, 0x9, 0xfe, 0x0, 0x0, 0xd, 0xff, + 0xe4, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, + 0x3f, 0xf7, 0x0, 0x4f, 0xf6, 0x0, 0x0, 0x2e, + 0xff, 0xfd, 0xa9, 0xbe, 0xff, 0xc6, 0xff, 0xfa, + 0xaf, 0xfd, 0x0, 0x0, 0xdf, 0xd0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa1, 0xc, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x5, 0xff, 0x80, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xd9, 0x40, 0x0, 0x18, + 0xdf, 0xe9, 0x10, 0x0, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x29, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xc8, 0x64, 0x44, 0x69, + 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9b, 0xef, 0xff, + 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xe3, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x10, 0x4f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x6, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, + 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xcb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, 0x0, + 0xf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x50, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x5, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf3, 0xc, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, + + /* U+0042 "B" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa5, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x7f, 0xff, + 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0x50, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xf1, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfa, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf7, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xcf, 0xff, 0x60, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x7f, + 0xff, 0xbb, 0xbb, 0xbb, 0xbb, 0xcd, 0xff, 0xff, + 0xe3, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0x20, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x90, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xc0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0x50, 0x7f, + 0xff, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, + 0xfa, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xda, 0x61, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, + 0x20, 0x1, 0x38, 0xef, 0xff, 0xe1, 0x0, 0xc, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf6, 0x0, 0x8, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x46, 0x0, 0x1, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x60, 0x0, 0x0, 0xcf, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x1, + 0xcf, 0xff, 0xfb, 0x62, 0x0, 0x13, 0x8e, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, + 0xc9, 0x50, 0x0, 0x0, + + /* U+0044 "D" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x15, 0xaf, 0xff, 0xfe, 0x20, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xe1, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf6, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf6, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf3, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xa0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x30, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xd1, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x15, 0xaf, + 0xff, 0xfe, 0x20, 0x0, 0x7f, 0xff, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7f, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xe5, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xec, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+0046 "F" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7f, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xe5, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xed, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xed, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, + 0x30, 0x1, 0x37, 0xcf, 0xff, 0xf3, 0x0, 0xb, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xfa, 0x0, 0x7, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x0, 0x1, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x20, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x54, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x50, 0xdf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x50, 0x1f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x7f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x50, 0x0, 0xbf, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0xcf, 0xff, 0xfc, 0x62, 0x0, 0x2, 0x6b, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, + + /* U+0048 "H" */ + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + + /* U+0049 "I" */ + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, + + /* U+004A "J" */ + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xd, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x60, 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x6, 0xfb, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x1f, 0xff, 0xd5, 0x0, 0x4, 0xdf, 0xff, 0x20, + 0x7, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1, 0x6b, 0xef, 0xfd, 0x93, 0x0, 0x0, + + /* U+004B "K" */ + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x40, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x60, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x5f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x4f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x3, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x3f, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xef, 0xff, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0xb, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x40, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf4, 0x0, 0x0, 0x1e, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, + 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xe1, + + /* U+004C "L" */ + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xec, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, + + /* U+004D "M" */ + 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfd, 0x7f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x7f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfd, 0x7f, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfd, 0x7f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xfd, 0x7f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xef, 0xfd, 0x7f, 0xfd, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x7f, 0xfd, + 0x7f, 0xfd, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf6, 0x6f, 0xfe, 0x7f, 0xfd, 0x7, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0xdf, 0xf8, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x40, 0x6f, 0xfe, 0x7f, + 0xfd, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0xa, + 0xff, 0xb0, 0x0, 0x3, 0xff, 0xf1, 0x0, 0x6f, + 0xfe, 0x7f, 0xfd, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0xc, 0xff, 0x70, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, + 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x5f, 0xfd, 0x0, + 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0xd, + 0xff, 0x70, 0xef, 0xf4, 0x0, 0x0, 0x6f, 0xfe, + 0x7f, 0xfd, 0x0, 0x0, 0x4, 0xff, 0xf9, 0xff, + 0xb0, 0x0, 0x0, 0x6f, 0xfe, 0x7f, 0xfd, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x7f, + 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x50, 0x0, 0x0, 0x0, 0x5f, + 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x7f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + + /* U+004E "N" */ + 0x7f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x1d, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x5f, 0xff, + 0xd1, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, 0x5, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x1d, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x5, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xd1, 0x5, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x5, 0xff, 0xf0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x85, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfa, 0xff, 0xf0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xf0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfb, 0x62, 0x0, 0x13, 0x8e, + 0xff, 0xff, 0x60, 0x0, 0x0, 0xb, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, + 0x0, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x1, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x90, 0x8, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, + 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf6, 0x1f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfa, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x5f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfe, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x1f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfa, 0xd, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x1, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x0, + 0xb, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfb, 0x62, 0x0, 0x3, 0x7e, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbe, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x7f, 0xff, 0xee, 0xee, + 0xee, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x1, 0x4a, 0xff, 0xff, 0x40, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfc, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xc0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x2, + 0x5b, 0xff, 0xff, 0x30, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x7f, 0xff, 0xee, 0xee, 0xee, 0xed, 0xa7, 0x20, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x62, + 0x0, 0x14, 0x8e, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0x10, 0x0, 0x1, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x90, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfa, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x5f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x4f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfd, 0x0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfa, 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfa, 0x40, 0x0, 0x2, + 0x6d, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, + 0xff, 0xff, 0xe6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xc4, + 0x10, 0x28, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xa9, 0x84, 0x0, 0x0, + + /* U+0052 "R" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x7f, 0xff, 0xee, + 0xee, 0xee, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x14, 0xaf, 0xff, + 0xf4, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd0, 0x7, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x7, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, + 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x25, 0xbf, + 0xff, 0xf3, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x7f, 0xff, 0xdd, 0xdd, 0xdd, 0xde, 0xff, 0xd0, + 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x7, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xfa, 0x0, 0x7, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf2, 0x7, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x3, 0x8c, 0xdf, 0xfe, 0xc9, 0x50, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xf8, + 0x20, 0x0, 0x2, 0x6b, 0xff, 0x20, 0x9, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x70, 0x0, + 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x8c, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6d, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfb, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x90, 0xde, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x5f, 0xff, + 0xe8, 0x40, 0x0, 0x0, 0x39, 0xff, 0xfc, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xfe, + 0xdb, 0x72, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xce, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xee, 0xee, 0xee, 0xec, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x8a, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf8, 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x8a, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xf8, 0xaf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x8a, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xaf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x8a, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf7, 0x9f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x68, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x31, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf0, 0xb, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, 0x0, + 0x4f, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0x20, 0x0, 0x9f, 0xff, 0xe8, 0x30, 0x0, + 0x38, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, 0xef, 0xed, + 0xa5, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf1, 0x6, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x90, 0x0, 0xef, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x3, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x80, 0x0, + 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x6f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x30, 0xdf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xb0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x10, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xe9, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, + 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x10, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x40, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x9, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0xe, + 0xff, 0x40, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x8, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x3, 0xff, 0xe0, 0x0, 0x9, 0xff, 0xb0, + 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0xe, 0xff, + 0x30, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x50, + 0x4, 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf0, 0xe, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x8, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x54, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfa, 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0xe, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xfb, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfe, 0x10, 0x0, 0x0, 0x8f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf8, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf4, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xe2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf6, 0x9, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0xd, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0x10, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x1e, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf2, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xd0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x30, + 0x0, 0xaf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x2, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xe1, 0x0, 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xf9, 0x0, 0x0, 0x5f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x30, 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x9, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xcf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4e, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x58, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, + + /* U+005B "[" */ + 0x7f, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xfa, + 0x7f, 0xff, 0xaa, 0xa7, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xaa, 0xa7, + 0x7f, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xfa, + + /* U+005C "\\" */ + 0x18, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + + /* U+005D "]" */ + 0x5f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xfc, + 0x3a, 0xaa, 0xdf, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x8f, 0xfc, + 0x0, 0x0, 0x8f, 0xfc, 0x3a, 0xaa, 0xdf, 0xfc, + 0x5f, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xfc, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xf9, 0xbf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x4f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xb0, 0xe, 0xfa, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x40, 0x7, 0xff, 0x10, 0x0, + 0x0, 0xa, 0xfe, 0x0, 0x1, 0xff, 0x70, 0x0, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xaf, 0xe0, 0x0, + 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x3f, 0xf5, 0x0, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0xc, 0xfc, 0x0, + 0x6, 0xff, 0x30, 0x0, 0x0, 0x6, 0xff, 0x30, + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, 0x90, + 0x3f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + + /* U+005F "_" */ + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, + + /* U+0060 "`" */ + 0x5, 0x88, 0x83, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x30, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0x40, 0x0, 0x0, 0x2, 0xdf, + 0xf4, + + /* U+0061 "a" */ + 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, 0x40, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0xde, 0xff, 0xff, + 0xd1, 0x0, 0x2f, 0xf9, 0x30, 0x0, 0x2, 0xaf, + 0xff, 0x90, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x14, 0x45, + 0x55, 0x55, 0xef, 0xf5, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xe7, + 0x20, 0x0, 0x0, 0xe, 0xff, 0x61, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x4f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x63, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0xf, + 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, + 0x7f, 0xff, 0xd7, 0x55, 0x7d, 0xff, 0xff, 0xf6, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6b, 0xff, + 0x60, 0x0, 0x29, 0xdf, 0xfe, 0xc8, 0x20, 0xbf, + 0xf6, + + /* U+0062 "b" */ + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x50, 0x6, 0xbe, 0xff, + 0xd9, 0x40, 0x0, 0x0, 0xef, 0xf5, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0xe, 0xff, 0xaf, + 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xe3, 0x0, 0xef, + 0xff, 0xff, 0x82, 0x0, 0x3, 0xaf, 0xff, 0xe1, + 0xe, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xa0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x2e, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf7, 0xef, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xae, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xbe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfa, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x7e, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0xef, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0xe, + 0xff, 0xff, 0xf8, 0x20, 0x0, 0x3a, 0xff, 0xfe, + 0x10, 0xef, 0xf8, 0xff, 0xff, 0xed, 0xff, 0xff, + 0xfe, 0x30, 0xe, 0xff, 0x34, 0xef, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0xef, 0xf3, 0x0, 0x6b, + 0xef, 0xfd, 0x94, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0x40, 0x0, 0xbf, 0xff, 0xc4, 0x0, + 0x1, 0x6e, 0xff, 0xe1, 0x6, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x40, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x6, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xde, 0x40, 0x0, 0xaf, + 0xff, 0xc4, 0x0, 0x0, 0x6e, 0xff, 0xe1, 0x0, + 0xb, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa4, + 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x2, 0x8c, 0xff, 0xec, 0x71, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x62, + 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, 0xfd, 0xef, + 0xff, 0xfa, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xc4, + 0x0, 0x1, 0x7e, 0xff, 0xff, 0xf1, 0x8, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf1, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf1, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x8f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf1, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0xe, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0x0, 0xcf, 0xff, 0x91, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, + 0xca, 0xbd, 0xff, 0xfa, 0xff, 0xf1, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xf1, + 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x82, 0x0, + 0xff, 0xf1, + + /* U+0065 "e" */ + 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xcb, + 0xdf, 0xff, 0xfc, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x18, 0xff, 0xf9, 0x0, 0x7, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xb0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x17, 0xff, 0xd5, 0x55, 0x55, 0x55, + 0x55, 0x55, 0xef, 0xf4, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x7f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0xaf, 0xff, + 0xc4, 0x0, 0x0, 0x29, 0xff, 0xa0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xed, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, + 0x71, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x6b, 0xef, 0xeb, 0x50, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xaf, 0xff, 0xdb, 0xcf, 0x90, 0x0, 0x1, 0xff, + 0xf7, 0x0, 0x1, 0x10, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5a, + 0xac, 0xff, 0xfa, 0xaa, 0xaa, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x2, 0x8c, 0xef, 0xec, 0x82, 0x0, + 0xcf, 0xf5, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xcf, 0xf5, 0x0, 0x1d, 0xff, 0xff, + 0xfd, 0xdf, 0xff, 0xfb, 0xcf, 0xf5, 0x0, 0xcf, + 0xff, 0xb4, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xf5, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf5, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x7f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf5, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, 0x3f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, + 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf5, 0x6, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xf5, 0x0, 0xaf, 0xff, 0xe7, + 0x20, 0x13, 0x8e, 0xff, 0xff, 0xf5, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xf5, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x59, 0xcc, 0xba, + 0x50, 0x0, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, + 0x0, 0x6a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x60, 0x1, 0xff, 0xfa, 0x41, 0x0, 0x0, + 0x28, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xed, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0x16, 0x9c, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, + + /* U+0068 "h" */ + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf5, 0x1, 0x7b, 0xef, 0xfd, 0x92, 0x0, 0x0, + 0xef, 0xf5, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xef, 0xfc, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xf9, 0x0, 0xef, 0xff, 0xfe, 0x61, 0x0, 0x16, + 0xef, 0xff, 0x40, 0xef, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xb0, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf0, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0xef, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, + + /* U+0069 "i" */ + 0x2, 0x75, 0x2, 0xff, 0xf9, 0x6f, 0xff, 0xe3, + 0xff, 0xfa, 0x5, 0xa8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0xef, + 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, + 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, + 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, + 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, 0xf5, 0xe, + 0xff, 0x50, 0xef, 0xf5, 0xe, 0xff, 0x50, 0xef, + 0xf5, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x1, 0x66, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xa9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x60, 0x1, 0x40, + 0x0, 0x9f, 0xff, 0x20, 0x8, 0xfe, 0xce, 0xff, + 0xfa, 0x0, 0xe, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x4, 0xbe, 0xff, 0xc7, 0x0, 0x0, + + /* U+006B "k" */ + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x90, 0x0, 0xef, 0xf5, 0x0, 0x0, 0xa, 0xff, + 0xf8, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0xbf, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x1c, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x1, + 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x2e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xfe, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfe, 0x33, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xef, 0xff, 0xe2, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0xef, 0xfd, 0x20, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf2, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf7, + + /* U+006C "l" */ + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, 0xef, 0xf5, + 0xef, 0xf5, + + /* U+006D "m" */ + 0xef, 0xf3, 0x2, 0x8c, 0xef, 0xec, 0x61, 0x0, + 0x0, 0x27, 0xce, 0xfe, 0xc8, 0x20, 0x0, 0xe, + 0xff, 0x38, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xef, + 0xfc, 0xff, 0xfd, 0xbc, 0xff, 0xff, 0xf3, 0xbf, + 0xff, 0xec, 0xce, 0xff, 0xff, 0x70, 0xe, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x4, 0xef, 0xff, 0x10, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x2, 0xff, 0xf8, 0xe, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xc0, 0xef, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0xe, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + + /* U+006E "n" */ + 0xef, 0xf3, 0x1, 0x7c, 0xef, 0xfd, 0x92, 0x0, + 0x0, 0xef, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xef, 0xfc, 0xff, 0xfe, 0xcc, 0xef, + 0xff, 0xf9, 0x0, 0xef, 0xff, 0xfc, 0x30, 0x0, + 0x3, 0xdf, 0xff, 0x40, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xb0, 0xef, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0xef, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0xef, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf2, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, + + /* U+006F "o" */ + 0x0, 0x0, 0x1, 0x7c, 0xef, 0xfd, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xfd, 0xef, 0xff, 0xff, 0x70, 0x0, 0x0, 0xbf, + 0xff, 0xc4, 0x0, 0x1, 0x6e, 0xff, 0xf4, 0x0, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0x10, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x80, 0x4f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, 0x7f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf2, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x3f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x70, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xfe, 0x10, 0x0, 0xaf, 0xff, 0xc4, + 0x0, 0x1, 0x6e, 0xff, 0xf4, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, + 0xa5, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xef, 0xf3, 0x1, 0x7b, 0xef, 0xfd, 0x94, 0x0, + 0x0, 0xe, 0xff, 0x36, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0xef, 0xfa, 0xff, 0xfe, 0xcb, + 0xcf, 0xff, 0xfe, 0x30, 0xe, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x17, 0xff, 0xfe, 0x10, 0xef, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xe, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf2, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x7e, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfa, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xbe, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, 0xef, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xae, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf7, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x2e, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0xef, 0xff, 0xff, + 0x82, 0x0, 0x3, 0xaf, 0xff, 0xe1, 0xe, 0xff, + 0xaf, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xe3, 0x0, + 0xef, 0xf5, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0xe, 0xff, 0x50, 0x6, 0xbe, 0xff, 0xd9, + 0x40, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, 0x71, 0x0, + 0xff, 0xf1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xff, 0xf1, 0x0, 0x1d, 0xff, 0xff, + 0xfd, 0xef, 0xff, 0xf8, 0xff, 0xf1, 0x0, 0xcf, + 0xff, 0xc4, 0x0, 0x1, 0x7f, 0xff, 0xff, 0xf1, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xf1, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf1, 0x4f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x7f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf1, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf1, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xc4, + 0x0, 0x1, 0x6e, 0xff, 0xff, 0xf1, 0x0, 0x1d, + 0xff, 0xff, 0xfd, 0xef, 0xff, 0xf9, 0xff, 0xf1, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x52, + 0xff, 0xf1, 0x0, 0x0, 0x2, 0x8c, 0xff, 0xec, + 0x71, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf1, + + /* U+0072 "r" */ + 0xef, 0xf3, 0x1, 0x7b, 0xec, 0xef, 0xf3, 0x5e, + 0xff, 0xfc, 0xef, 0xf7, 0xff, 0xff, 0xfc, 0xef, + 0xff, 0xff, 0x94, 0x21, 0xef, 0xff, 0xe2, 0x0, + 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0xef, 0xfc, + 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, + 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x28, 0xce, 0xff, 0xeb, 0x84, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0xaf, 0xff, 0xfe, 0xcc, 0xef, 0xff, + 0xe0, 0x0, 0x3f, 0xff, 0x92, 0x0, 0x0, 0x16, + 0xd6, 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x85, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x18, 0xdf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x69, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x0, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf0, 0x6, + 0xfd, 0x73, 0x0, 0x0, 0x5, 0xef, 0xfa, 0x0, + 0xef, 0xff, 0xff, 0xdc, 0xdf, 0xff, 0xff, 0x20, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x38, 0xbe, 0xff, 0xfd, 0xa4, 0x0, + 0x0, + + /* U+0074 "t" */ + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x5a, 0xac, 0xff, 0xfa, 0xaa, 0xaa, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfa, 0x0, 0x3, 0x20, 0x0, 0x0, 0xbf, + 0xff, 0xec, 0xdf, 0xa0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7c, 0xff, + 0xea, 0x30, + + /* U+0075 "u" */ + 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, 0x1f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfe, + 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfe, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0xf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfe, 0xd, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x2, 0xff, + 0xfe, 0x40, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0x0, + 0x7f, 0xff, 0xfe, 0xbb, 0xdf, 0xff, 0xcf, 0xfe, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, + 0xfe, 0x0, 0x0, 0x17, 0xce, 0xfe, 0xc8, 0x20, + 0x3f, 0xfe, + + /* U+0076 "v" */ + 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfd, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x60, 0x0, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xe0, 0x0, + 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfa, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, + 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf6, 0x0, 0x5, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xcf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfa, 0xa, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x23, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x2, 0xff, 0xc0, 0xd, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x7f, + 0xf9, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x10, 0x2, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0xff, 0x60, + 0x0, 0x0, 0x3, 0xff, 0xa0, 0x0, 0xc, 0xff, + 0x40, 0x0, 0x0, 0x2f, 0xfd, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x8, 0xff, 0x70, 0xef, 0xf2, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0xdf, 0xf1, 0x8, 0xff, 0x80, 0x0, + 0x5, 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0x60, + 0x0, 0x4f, 0xfb, 0x0, 0x2f, 0xfd, 0x0, 0x0, + 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xfc, 0x0, + 0xa, 0xff, 0x40, 0x0, 0xbf, 0xf3, 0x0, 0x1f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0xff, 0xe0, 0x0, 0x5, 0xff, 0x90, 0x7, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, 0x70, 0x6f, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0x0, 0xdf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0xc, 0xff, + 0x20, 0x0, 0x0, 0x9f, 0xf5, 0x3f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf6, 0xff, 0xc0, + 0x0, 0x0, 0x3, 0xff, 0xb9, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xf8, 0x0, 0x1e, 0xff, 0x90, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, + 0x0, 0x8f, 0xfe, 0x10, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xfa, 0xc, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x7f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x8f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x80, + 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x1, 0xef, 0xf9, 0x0, 0x0, 0x9, + 0xff, 0xe1, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x0, + 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf2, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, + + /* U+0079 "y" */ + 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x60, 0x0, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, + 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf8, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x3, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x90, 0x0, 0x0, + 0x5f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf7, 0x0, 0x3, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0xef, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xdf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x3, + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xcd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xc7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xa4, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+007B "{" */ + 0x0, 0x0, 0x2, 0x9e, 0xff, 0x40, 0x0, 0x3, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0xdf, 0xff, 0xda, + 0x20, 0x0, 0x2f, 0xff, 0x80, 0x0, 0x0, 0x4, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xb0, 0x0, 0x1, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xbc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x5f, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0xa2, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x2a, 0xef, 0xf4, + + /* U+007C "|" */ + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, 0x7f, 0xf9, + + /* U+007D "}" */ + 0x5f, 0xfd, 0x91, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x20, 0x0, 0x3a, 0xdf, 0xff, 0xc0, 0x0, 0x0, + 0x9, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xba, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x1, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xf2, + 0x0, 0x3a, 0xdf, 0xff, 0xd0, 0x0, 0x5f, 0xff, + 0xff, 0x30, 0x0, 0x5f, 0xfe, 0x92, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x8, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x6f, + 0xc0, 0xb, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x9, + 0xfa, 0x5, 0xff, 0xd8, 0xbf, 0xfe, 0x30, 0x1, + 0xff, 0x70, 0xbf, 0xc0, 0x0, 0x6f, 0xff, 0xa8, + 0xef, 0xf2, 0xe, 0xf5, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xf7, 0x0, 0xcc, 0x20, 0x0, 0x0, 0x19, + 0xef, 0xd6, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x5, 0xbe, 0xfc, 0x60, 0x0, 0x0, 0xaf, + 0xfd, 0xdf, 0xfc, 0x10, 0x8, 0xfc, 0x20, 0x1, + 0xaf, 0xc0, 0x1f, 0xe1, 0x0, 0x0, 0xc, 0xf4, + 0x5f, 0x90, 0x0, 0x0, 0x5, 0xf9, 0x6f, 0x70, + 0x0, 0x0, 0x3, 0xfa, 0x5f, 0x90, 0x0, 0x0, + 0x5, 0xf9, 0x1f, 0xe1, 0x0, 0x0, 0xc, 0xf4, + 0x8, 0xfc, 0x20, 0x1, 0xbf, 0xc0, 0x0, 0xaf, + 0xfe, 0xdf, 0xfd, 0x10, 0x0, 0x5, 0xbe, 0xfc, + 0x70, 0x0, + + /* U+2022 "•" */ + 0x0, 0x1, 0x0, 0x0, 0x7f, 0xfd, 0x30, 0x5f, + 0xff, 0xfe, 0x1a, 0xff, 0xff, 0xf4, 0xaf, 0xff, + 0xff, 0x44, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xb2, + 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0x10, 0x1f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x84, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x89, 0x87, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x24, 0x54, 0x6f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xcd, 0xdb, 0x72, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, 0xff, 0xea, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x17, 0x10, 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0x0, 0x1, + 0x71, 0xdf, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x2, 0xfd, 0xff, 0x96, 0x66, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xcc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xcc, 0xce, 0xff, 0xff, 0x20, 0x0, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf8, 0x0, 0x2, 0xff, 0xff, 0x20, + 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x2, 0xff, 0xff, + 0x20, 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x62, 0x22, 0xef, 0xfc, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0xef, + 0xfb, 0x22, 0x26, 0xff, 0xff, 0x20, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, + 0x0, 0xcf, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xde, 0xff, 0xf8, 0x0, 0x2, 0xff, 0xff, + 0xca, 0xaa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0xaa, 0xac, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0x88, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x88, + 0x8b, 0xff, 0xff, 0x20, 0x0, 0xcf, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf7, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0xcf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0xcf, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf7, 0x0, 0x2, 0xff, 0xff, 0x74, 0x44, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfc, 0x44, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, 0xef, 0xff, + 0xff, 0x30, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x3, + 0xff, 0x7f, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x2, 0xf7, + + /* U+F00B "" */ + 0x28, 0x88, 0x88, 0x88, 0x71, 0x0, 0x28, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6e, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x17, 0x88, 0x88, 0x88, 0x71, + 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x77, 0x77, + 0x77, 0x60, 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x61, 0xcf, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x1c, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x2, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdb, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x26, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0x40, 0x0, 0x4, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x0, + 0x4f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xa0, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf3, + 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xc0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2e, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xd1, 0x8f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xcf, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe1, + 0xb, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x30, 0x0, 0x9e, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xc3, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xdd, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x13, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xfb, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x3, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0xef, 0xff, 0xf7, 0x0, + 0xc, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xd0, 0x0, 0xef, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xef, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, 0x0, 0xef, + 0xff, 0xf7, 0x0, 0xa, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xef, 0xff, 0xf7, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xef, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfe, 0x0, 0xb, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x3f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, 0x5f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xf0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf0, 0x5f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x44, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xe0, 0x2f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x40, 0x5, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xb9, 0x78, 0x9d, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0xbc, 0xdd, 0xca, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x20, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x4, 0xdf, 0x40, 0x0, + 0x0, 0x4f, 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xe2, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x20, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x4, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, + 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xc, 0xff, 0xa1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x2b, 0xff, 0xa0, 0x0, + 0x0, 0x1, 0x93, 0x0, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0xab, + 0xba, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9a, 0x50, 0x0, 0x0, 0x7, 0xbb, 0xba, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0xe, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xe, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf6, 0x4e, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xe3, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xa0, 0x2, 0xdf, 0x40, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x70, 0x4, + 0xff, 0xff, 0x70, 0x4, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x50, 0x7, 0xff, 0xff, 0xff, 0xa0, 0x2, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x20, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x1, 0xbf, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfc, 0x10, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x9f, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xf9, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xff, 0xf5, + 0x0, 0x5f, 0xff, 0xff, 0xf6, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x3e, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xe4, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x2d, 0xff, 0xff, 0xf2, + 0x5f, 0xff, 0xd2, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0xb, 0xff, 0xf9, 0x0, 0x9f, 0xb0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x8, 0xfc, 0x0, 0x0, + 0x40, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x88, 0x88, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x88, + 0x88, 0x88, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xac, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0xcc, 0xcc, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x10, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xb, + 0xff, 0xc0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x99, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x66, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x8, 0xfa, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x6, 0xf8, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfe, 0x10, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfa, 0xd, 0xff, 0xff, + 0xcc, 0xcc, 0xcc, 0xcc, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, 0x88, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdd, + 0xda, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xef, 0xff, 0xfd, 0x95, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x8, 0xff, 0xff, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xe, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa9, 0x87, 0x76, 0xbf, + 0xff, 0xff, 0xff, 0x7, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xaa, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0xff, + 0xff, 0xff, 0xfd, 0xdd, 0xef, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfb, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x20, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, 0x9e, 0xff, + 0xff, 0xff, 0xfb, 0x63, 0x11, 0x36, 0xaf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xff, 0xff, 0x81, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xff, 0xff, + 0x90, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x29, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, + 0x79, 0xba, 0x98, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x43, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xab, 0xbb, 0xbb, 0xbd, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x7f, 0xa1, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xef, + 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xa0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x8, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xef, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x1, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2d, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xdf, 0xff, 0x60, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xdf, + 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x29, 0x40, 0x0, 0x3a, + 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x98, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0x50, 0x0, + 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x1, 0xff, 0xd3, 0x0, 0x7, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, + 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x8f, 0xfe, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x70, 0x1, 0xff, 0xf4, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x8, 0xfb, 0x10, 0x0, 0xaf, 0xfe, 0x0, 0xb, + 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xfe, 0x10, 0x2, + 0xff, 0xf4, 0x0, 0x6f, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, + 0xff, 0xfa, 0x0, 0xc, 0xff, 0x80, 0x3, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x8f, + 0xfb, 0x0, 0xf, 0xff, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xe, + 0xff, 0x50, 0x6, 0xff, 0xd0, 0x0, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xf6, 0x0, 0x5f, 0xfd, + 0x0, 0xf, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, + 0x30, 0x6, 0xff, 0xc0, 0x0, 0xff, 0xf2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2d, 0xff, 0xe0, 0x0, 0xaf, 0xfa, 0x0, + 0x2f, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xd, 0xff, 0xf5, 0x0, + 0xe, 0xff, 0x70, 0x5, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xdf, 0xf7, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x9f, + 0xfb, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x2, 0x83, 0x0, 0x1, 0xef, + 0xfb, 0x0, 0xe, 0xff, 0x70, 0x3a, 0xbb, 0xbb, + 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x5, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x80, + 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xb0, 0x0, 0x6f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x1e, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x9d, + 0x60, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x2, 0x8a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + 0x20, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x31, + 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x3f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x70, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xd9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, 0x50, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x9f, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x4f, 0xff, 0xf6, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0x30, + 0x7, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xb5, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xcf, 0xff, 0xff, 0xd9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xbb, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8b, 0x50, 0xbf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf7, 0xcf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf8, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xf0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xf2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, + 0xff, 0xf0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf8, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf7, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xf6, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xab, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x2, 0x9b, 0xbb, 0xbb, 0xba, 0x81, 0x0, 0x0, + 0x0, 0x29, 0xbb, 0xbb, 0xbb, 0xa8, 0x10, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x8, 0xef, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F04D "" */ + 0x2, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa8, 0x10, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xb7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbb, 0xb5, 0x5f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1f, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1f, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x2f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1f, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfb, 0x8f, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x7f, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfb, 0xb, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xc4, 0x0, + + /* U+F054 "" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xba, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xa9, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xa1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x4, 0x67, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, 0x77, + 0x77, 0x77, 0x77, 0x76, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "" */ + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x20, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x44, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xd9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xf8, 0x30, 0x0, + 0x2, 0x7e, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x4f, 0xff, 0xa2, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf6, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xd0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x20, 0x4, 0xef, + 0xff, 0xff, 0xff, 0x40, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x2f, 0xde, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x9, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x10, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x1, 0x69, 0x97, 0x20, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfd, 0x95, 0x33, 0x47, + 0xcf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x2, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x44, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x1, 0x59, 0xdf, 0xff, 0xff, 0xff, + 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x90, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x51, 0x0, 0x2, + 0x6d, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xfe, 0x30, 0x2e, 0xfd, + 0x92, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x60, 0xef, 0xff, 0xf5, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xb1, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xae, 0xff, 0xff, 0xf4, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xe3, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x90, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xb1, 0xdf, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, + 0x95, 0x33, 0x51, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, + 0xac, 0xef, 0xfe, 0xdb, 0x81, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x43, 0x33, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x71, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x38, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x20, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xc1, 0x0, 0x35, 0x55, 0x55, 0x55, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x55, + 0x5a, 0xff, 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xc0, 0x3, 0xff, 0xff, 0xff, 0xc0, 0x8, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfd, 0x10, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x8, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xe2, 0x2, 0xef, 0xff, 0xff, 0xe1, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x30, 0x1e, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0x50, 0xb, 0x70, 0x0, 0x5, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0xaf, 0xf6, 0x0, 0x8, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0x50, 0x8, + 0xff, 0xff, 0xc1, 0x0, 0x35, 0x55, 0x55, 0x9f, + 0xff, 0xff, 0xf9, 0x0, 0x6f, 0xff, 0xff, 0xf6, + 0x5a, 0xff, 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xcf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xae, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf9, 0x2, + 0xef, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf6, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0x60, 0x9f, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf2, 0x9f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf1, + 0x1c, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, 0x0, + 0xbf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x38, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x70, 0x0, 0x5, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x4f, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0xaf, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x9f, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x29, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x14, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x5d, 0xff, 0xf6, 0xbf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf6, 0xd, 0xff, 0xf6, 0xc, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xae, 0x60, 0xd, + 0xff, 0xf6, 0x1, 0xbd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x31, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x31, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x50, + 0x5f, 0xff, 0xe0, 0xa, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x5f, 0xff, + 0xe0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x8f, 0xff, 0xe9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0xa, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, + + /* U+F07B "" */ + 0x1, 0x57, 0x88, 0x88, 0x88, 0x88, 0x87, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x31, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x70, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x46, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x33, 0x33, 0x4f, 0xff, 0xff, 0xff, 0xf8, + 0x33, 0x33, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x22, 0x22, 0x10, 0x1f, 0xff, 0xff, + 0xff, 0xf6, 0x1, 0x22, 0x22, 0x22, 0x22, 0x10, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, + 0xff, 0xff, 0xf5, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, + 0xbc, 0xcc, 0xcb, 0x80, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x55, 0x55, 0x55, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x8, 0xfa, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x6, 0xf8, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xdf, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x84, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xd9, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfc, + 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x15, 0x64, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x53, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xef, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf6, 0xd, 0xff, 0xfd, + 0x10, 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xff, 0x50, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0xa, 0xff, 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xcf, 0xff, 0xe5, 0x27, + 0xff, 0xff, 0x70, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x56, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd1, + 0x3, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, + 0x9, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, + 0xaf, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xc, 0xff, 0xfe, 0x52, 0x7f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x7d, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x6, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x7, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x7, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x7, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, + 0xff, 0xfc, 0x28, 0x99, 0x99, 0x30, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3, 0x66, 0x66, + 0x66, 0xdf, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x32, 0x22, 0x22, 0x22, 0xff, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x90, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x64, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xfd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xe2, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, + 0x20, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe1, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x56, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x23, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x1, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, + 0x0, + + /* U+F0C9 "" */ + 0x8c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x1, 0xc3, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x6f, 0xff, 0x80, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0xa, 0xff, 0xff, 0xfc, 0x20, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x1, 0xbf, + 0xff, 0xfa, 0x10, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x3, 0x99, 0x30, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x77, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x70, + + /* U+F0E7 "" */ + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x55, 0x55, 0x55, 0x51, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x39, 0xb9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xaa, + 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xa9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf6, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x12, 0x22, 0x22, 0x22, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x7, 0xe4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, + 0xff, 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, + 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x1, 0x44, 0x44, 0x43, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xdd, 0xdd, 0xdc, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xaa, 0xaa, + 0xaa, 0x50, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x43, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xf6, 0x0, 0x6, 0xfe, 0x0, + 0x3, 0xff, 0x10, 0x1, 0xff, 0x50, 0x0, 0x5f, + 0xf1, 0x0, 0x1f, 0xff, 0xf4, 0xff, 0xff, 0x40, + 0x0, 0x4f, 0xd0, 0x0, 0x2f, 0xf0, 0x0, 0xe, + 0xf3, 0x0, 0x3, 0xfe, 0x0, 0x0, 0xff, 0xff, + 0x4f, 0xff, 0xf4, 0x0, 0x4, 0xfd, 0x0, 0x2, + 0xff, 0x0, 0x0, 0xef, 0x30, 0x0, 0x3f, 0xe0, + 0x0, 0xf, 0xff, 0xf4, 0xff, 0xff, 0x60, 0x0, + 0x7f, 0xe0, 0x0, 0x4f, 0xf2, 0x0, 0x1f, 0xf5, + 0x0, 0x5, 0xff, 0x10, 0x2, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xa2, 0x22, 0x6f, 0xf3, 0x22, 0x3f, + 0xf6, 0x22, 0x2e, 0xf9, 0x22, 0x27, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x2, + 0xfe, 0x0, 0x0, 0xff, 0x30, 0x0, 0xcf, 0x50, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x2f, 0xe0, 0x0, 0xf, 0xf3, + 0x0, 0xc, 0xf5, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xfe, + 0x0, 0x0, 0xff, 0x30, 0x0, 0xdf, 0x60, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0xdd, 0xff, 0xfe, 0xdd, 0xef, 0xff, 0xdd, + 0xef, 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xfa, 0x44, 0x4a, + 0xff, 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x9f, 0xf6, 0x44, 0x7f, 0xff, 0xf4, 0xff, + 0xff, 0x40, 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0xff, 0xff, 0x4f, 0xff, 0xf4, 0x0, 0x4, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xe0, 0x0, 0xf, 0xff, 0xf4, 0xff, 0xff, + 0x40, 0x0, 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0xff, + 0xff, 0x4f, 0xff, 0xf9, 0x44, 0x4a, 0xff, 0x54, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x9f, + 0xf5, 0x44, 0x6f, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x56, 0x66, 0x66, 0x66, 0x66, 0x67, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, + 0x8, 0x20, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xe2, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xf, 0xfe, 0x20, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, + 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, 0xfe, 0x20, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xf, 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, + 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0xf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x10, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x68, 0x9a, + 0xa9, 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdc, 0xbb, 0xbc, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x9, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xe2, 0xef, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0x64, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xb0, 0x4, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xce, 0xff, 0xfd, 0xb9, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, 0x0, + 0x3, 0x91, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x76, + 0x56, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x45, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x5, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x80, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F241 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F242 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F243 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0x9f, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0x9, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0x9f, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x4, 0x88, 0x88, + 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F244 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x3f, 0xff, 0xf5, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x5f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x5f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8f, 0xff, 0xf5, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xf7, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, + 0xff, 0xfc, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xcc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x57, 0x7a, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x2f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x0, 0x0, 0x4e, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x10, + 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x86, 0x20, + 0x0, 0x0, 0x0, 0xef, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0x30, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x91, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x1b, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xe6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, + 0xff, 0xf7, 0x55, 0x55, 0x55, 0x8f, 0xfe, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5b, 0xff, + 0xff, 0xc3, 0x5, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0x50, 0x0, + 0x9, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xbd, + 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf2, 0x0, 0xd, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc9, + 0x9f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xac, 0xcf, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x26, 0xab, 0xcd, 0xcb, + 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x12, 0xef, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x2e, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x80, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xff, + 0xec, 0xff, 0xff, 0x10, 0x39, 0x0, 0x5f, 0xff, + 0xff, 0xf1, 0x4f, 0xff, 0xfe, 0x20, 0xbf, 0xff, + 0x10, 0x3f, 0xa0, 0x5, 0xff, 0xff, 0xf4, 0x7f, + 0xff, 0xfb, 0x0, 0xb, 0xff, 0x10, 0x3f, 0xf6, + 0x0, 0xaf, 0xff, 0xf7, 0x9f, 0xff, 0xff, 0xa0, + 0x0, 0xbf, 0x10, 0x3f, 0xa0, 0x5, 0xff, 0xff, + 0xf9, 0xbf, 0xff, 0xff, 0xfa, 0x0, 0xb, 0x10, + 0x2a, 0x0, 0x3f, 0xff, 0xff, 0xfa, 0xcf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xfc, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xfc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0xdf, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0x60, 0x1, 0x0, 0x11, 0x0, 0xbf, 0xff, 0xff, + 0xfb, 0xaf, 0xff, 0xff, 0xf6, 0x0, 0x1d, 0x10, + 0x3d, 0x10, 0xb, 0xff, 0xff, 0xfa, 0x8f, 0xff, + 0xff, 0x60, 0x1, 0xdf, 0x10, 0x3f, 0xc1, 0x0, + 0xcf, 0xff, 0xf8, 0x6f, 0xff, 0xfa, 0x0, 0x2d, + 0xff, 0x10, 0x3f, 0xf4, 0x0, 0x7f, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0x52, 0xef, 0xff, 0x20, 0x3f, + 0x50, 0x6, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0x20, 0x35, 0x0, 0x6f, 0xff, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x7, 0xff, 0xff, 0xff, 0xb0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x7, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x7f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x38, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8b, 0xef, 0xff, 0xff, 0xeb, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0x88, 0x88, + 0x88, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x36, 0x66, + 0x66, 0x66, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb6, 0x66, 0x66, 0x66, 0x61, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x9d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xfa, 0xa, + 0xff, 0xfe, 0x14, 0xff, 0xff, 0x61, 0xdf, 0xff, + 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, + 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, + 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, + 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, + 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, + 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, + 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, + 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, + 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, + 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, + 0x0, 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, + 0x0, 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, + 0xff, 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0xef, 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, + 0xff, 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, + 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, + 0x30, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, + 0xf7, 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xf7, + 0x7, 0xff, 0xfd, 0x1, 0xff, 0xff, 0x30, 0xbf, + 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0xfa, 0xa, + 0xff, 0xfe, 0x14, 0xff, 0xff, 0x61, 0xdf, 0xff, + 0xfa, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x13, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x60, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x60, 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0xa, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xa, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xfd, 0xb9, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x74, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x4, + 0xff, 0xf4, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x4, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x8, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xfb, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xb, 0xff, + 0xfb, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0xb, 0xff, 0xff, 0xfb, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5b, 0xff, 0xff, 0xff, 0xfb, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xf9, + 0x44, 0x7f, 0xf4, 0x45, 0xff, 0x54, 0x4f, 0xff, + 0xf5, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x3f, 0xe0, + 0x1, 0xff, 0x10, 0xe, 0xff, 0xf5, 0x0, 0xcf, + 0xff, 0xf7, 0x0, 0x3f, 0xe0, 0x1, 0xff, 0x10, + 0xe, 0xff, 0xf5, 0xc, 0xff, 0xff, 0xf7, 0x0, + 0x3f, 0xe0, 0x1, 0xff, 0x10, 0xe, 0xff, 0xf5, + 0xcf, 0xff, 0xff, 0xf7, 0x0, 0x3f, 0xe0, 0x1, + 0xff, 0x10, 0xe, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x3f, 0xe0, 0x1, 0xff, 0x10, 0xe, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf8, 0x22, 0x4f, + 0xe2, 0x22, 0xff, 0x22, 0x2e, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x2, 0x34, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3e, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x7f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xd4, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 146, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 146, .box_w = 5, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 60, .adv_w = 213, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 14}, + {.bitmap_index = 110, .adv_w = 382, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 386, .adv_w = 338, .box_w = 19, .box_h = 32, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 690, .adv_w = 459, .box_w = 27, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1014, .adv_w = 373, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1289, .adv_w = 114, .box_w = 3, .box_h = 10, .ofs_x = 2, .ofs_y = 14}, + {.bitmap_index = 1304, .adv_w = 183, .box_w = 8, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 1432, .adv_w = 184, .box_w = 8, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 1560, .adv_w = 218, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1645, .adv_w = 317, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 1765, .adv_w = 123, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1795, .adv_w = 208, .box_w = 11, .box_h = 3, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 1812, .adv_w = 123, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1827, .adv_w = 191, .box_w = 15, .box_h = 32, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2067, .adv_w = 363, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2319, .adv_w = 201, .box_w = 10, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2439, .adv_w = 312, .box_w = 19, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2667, .adv_w = 311, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2883, .adv_w = 364, .box_w = 22, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3147, .adv_w = 312, .box_w = 19, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3375, .adv_w = 336, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3615, .adv_w = 325, .box_w = 18, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3831, .adv_w = 350, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4071, .adv_w = 336, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4311, .adv_w = 123, .box_w = 6, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4365, .adv_w = 123, .box_w = 6, .box_h = 23, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4434, .adv_w = 317, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4562, .adv_w = 317, .box_w = 16, .box_h = 11, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 4650, .adv_w = 317, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 4778, .adv_w = 312, .box_w = 18, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4994, .adv_w = 562, .box_w = 33, .box_h = 31, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 5506, .adv_w = 398, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5818, .adv_w = 412, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6082, .adv_w = 393, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6358, .adv_w = 449, .box_w = 24, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6646, .adv_w = 364, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6862, .adv_w = 345, .box_w = 18, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7078, .adv_w = 420, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7354, .adv_w = 442, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7618, .adv_w = 169, .box_w = 4, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7666, .adv_w = 279, .box_w = 16, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7858, .adv_w = 391, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8122, .adv_w = 323, .box_w = 17, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8326, .adv_w = 520, .box_w = 26, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8638, .adv_w = 442, .box_w = 22, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8902, .adv_w = 457, .box_w = 26, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9214, .adv_w = 393, .box_w = 20, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9454, .adv_w = 457, .box_w = 28, .box_h = 29, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 9860, .adv_w = 395, .box_w = 21, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10112, .adv_w = 338, .box_w = 19, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10340, .adv_w = 319, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10580, .adv_w = 430, .box_w = 21, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10832, .adv_w = 387, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11144, .adv_w = 613, .box_w = 37, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11588, .adv_w = 366, .box_w = 23, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11864, .adv_w = 352, .box_w = 24, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12152, .adv_w = 357, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12404, .adv_w = 181, .box_w = 8, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 12532, .adv_w = 191, .box_w = 15, .box_h = 32, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 12772, .adv_w = 181, .box_w = 8, .box_h = 32, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 12900, .adv_w = 317, .box_w = 16, .box_h = 14, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 13012, .adv_w = 272, .box_w = 17, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13038, .adv_w = 326, .box_w = 10, .box_h = 5, .ofs_x = 3, .ofs_y = 20}, + {.bitmap_index = 13063, .adv_w = 325, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13216, .adv_w = 371, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13454, .adv_w = 311, .box_w = 18, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13616, .adv_w = 371, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13866, .adv_w = 333, .box_w = 19, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14037, .adv_w = 192, .box_w = 14, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14212, .adv_w = 375, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 14462, .adv_w = 370, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 14687, .adv_w = 152, .box_w = 5, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14752, .adv_w = 154, .box_w = 12, .box_h = 33, .ofs_x = -4, .ofs_y = -7}, + {.bitmap_index = 14950, .adv_w = 335, .box_w = 18, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15175, .adv_w = 152, .box_w = 4, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15225, .adv_w = 575, .box_w = 31, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15504, .adv_w = 370, .box_w = 18, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15666, .adv_w = 345, .box_w = 20, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15846, .adv_w = 371, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 16084, .adv_w = 371, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 16334, .adv_w = 223, .box_w = 10, .box_h = 18, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16424, .adv_w = 273, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16577, .adv_w = 225, .box_w = 14, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16731, .adv_w = 368, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16893, .adv_w = 304, .box_w = 21, .box_h = 18, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 17082, .adv_w = 489, .box_w = 31, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17361, .adv_w = 300, .box_w = 19, .box_h = 18, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17532, .adv_w = 304, .box_w = 21, .box_h = 25, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 17795, .adv_w = 283, .box_w = 16, .box_h = 18, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17939, .adv_w = 191, .box_w = 11, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 18115, .adv_w = 163, .box_w = 4, .box_h = 32, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 18179, .adv_w = 191, .box_w = 10, .box_h = 32, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 18339, .adv_w = 317, .box_w = 17, .box_h = 6, .ofs_x = 1, .ofs_y = 9}, + {.bitmap_index = 18390, .adv_w = 228, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = 13}, + {.bitmap_index = 18456, .adv_w = 171, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 18481, .adv_w = 544, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 19111, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19553, .adv_w = 544, .box_w = 34, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 20080, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20522, .adv_w = 374, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 20810, .adv_w = 544, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21388, .adv_w = 544, .box_w = 32, .box_h = 35, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 21948, .adv_w = 612, .box_w = 39, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22553, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 23148, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23655, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 24250, .adv_w = 272, .box_w = 17, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24480, .adv_w = 408, .box_w = 26, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24831, .adv_w = 612, .box_w = 39, .box_h = 33, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 25475, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25917, .adv_w = 374, .box_w = 24, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26337, .adv_w = 476, .box_w = 22, .box_h = 32, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 26689, .adv_w = 476, .box_w = 30, .box_h = 36, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 27229, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 27694, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28159, .adv_w = 476, .box_w = 22, .box_h = 32, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 28511, .adv_w = 476, .box_w = 32, .box_h = 31, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 29007, .adv_w = 340, .box_w = 19, .box_h = 30, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29292, .adv_w = 340, .box_w = 19, .box_h = 30, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 29577, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30042, .adv_w = 476, .box_w = 30, .box_h = 7, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 30147, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30654, .adv_w = 680, .box_w = 43, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 31407, .adv_w = 612, .box_w = 40, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 32107, .adv_w = 544, .box_w = 34, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 32634, .adv_w = 476, .box_w = 30, .box_h = 19, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 32919, .adv_w = 476, .box_w = 30, .box_h = 19, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 33204, .adv_w = 680, .box_w = 44, .box_h = 27, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 33798, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34240, .adv_w = 544, .box_w = 34, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 34835, .adv_w = 544, .box_w = 35, .box_h = 36, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 35465, .adv_w = 476, .box_w = 31, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 35946, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 36471, .adv_w = 476, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36936, .adv_w = 476, .box_w = 30, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37341, .adv_w = 544, .box_w = 34, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37783, .adv_w = 340, .box_w = 23, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 38186, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38711, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 39236, .adv_w = 612, .box_w = 39, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39743, .adv_w = 544, .box_w = 36, .box_h = 36, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 40391, .adv_w = 408, .box_w = 26, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 40846, .adv_w = 680, .box_w = 43, .box_h = 32, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41534, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42007, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42480, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42953, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 43426, .adv_w = 680, .box_w = 43, .box_h = 22, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 43899, .adv_w = 680, .box_w = 43, .box_h = 27, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44480, .adv_w = 476, .box_w = 26, .box_h = 35, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 44935, .adv_w = 476, .box_w = 30, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 45460, .adv_w = 544, .box_w = 35, .box_h = 35, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 46073, .adv_w = 680, .box_w = 43, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46632, .adv_w = 408, .box_w = 26, .box_h = 35, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 47087, .adv_w = 547, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 5, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 24, 0, 15, -12, 0, 0, + 0, 0, -30, -33, 4, 26, 12, 9, + -22, 4, 27, 2, 23, 5, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 4, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 0, -16, 0, 0, 0, 0, + 0, -11, 9, 11, 0, 0, -5, 0, + -4, 5, 0, -5, 0, -5, -3, -11, + 0, 0, 0, 0, -5, 0, 0, -7, + -8, 0, 0, -5, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, -8, 0, -15, 0, -66, 0, + 0, -11, 0, 11, 16, 1, 0, -11, + 5, 5, 18, 11, -9, 11, 0, 0, + -31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -15, -7, -27, 0, -22, + -4, 0, 0, 0, 0, 1, 21, 0, + -16, -4, -2, 2, 0, -9, 0, 0, + -4, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -44, -4, 21, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 18, + 0, 5, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 4, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -20, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 11, 5, 16, -5, 0, 0, 11, -5, + -18, -75, 4, 15, 11, 1, -7, 0, + 20, 0, 17, 0, 17, 0, -51, 0, + -7, 16, 0, 18, -5, 11, 5, 0, + 0, 2, -5, 0, 0, -9, 44, 0, + 44, 0, 16, 0, 23, 7, 9, 16, + 0, 0, 0, -20, 0, 0, 0, 0, + 2, -4, 0, 4, -10, -7, -11, 4, + 0, -5, 0, 0, 0, -22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -30, 0, -34, 0, 0, 0, + 0, -4, 0, 54, -7, -7, 5, 5, + -5, 0, -7, 5, 0, 0, -29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -53, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -34, 0, 33, 0, 0, -20, 0, + 18, 0, -37, -53, -37, -11, 16, 0, + 0, -36, 0, 7, -13, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 14, 16, -66, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 26, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -7, -11, 0, -2, + -2, -5, 0, 0, -4, 0, 0, 0, + -11, 0, -4, 0, -13, -11, 0, -14, + -18, -18, -10, 0, -11, 0, -11, 0, + 0, 0, 0, -4, 0, 0, 5, 0, + 4, -5, 0, 2, 0, 0, 0, 5, + -4, 0, 0, 0, -4, 5, 5, -2, + 0, 0, 0, -10, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 7, -4, 0, + -7, 0, -9, 0, 0, -4, 0, 16, + 0, 0, -5, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -5, -7, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -5, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -4, -7, 0, -8, 0, -16, + -4, -16, 11, 0, 0, -11, 5, 11, + 15, 0, -14, -2, -7, 0, -2, -26, + 5, -4, 4, -29, 5, 0, 0, 2, + -28, 0, -29, -4, -47, -4, 0, -27, + 0, 11, 15, 0, 7, 0, 0, 0, + 0, 1, 0, -10, -7, 0, -16, 0, + 0, 0, -5, 0, 0, 0, -5, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -7, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, -4, -7, -4, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -7, + 0, -4, 0, -11, 5, 0, 0, -7, + 3, 5, 5, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -5, 0, -5, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + -4, 0, 0, 0, 0, -6, -8, 0, + -10, 0, 16, -4, 2, -17, 0, 0, + 15, -27, -28, -23, -11, 5, 0, -4, + -35, -10, 0, -10, 0, -11, 8, -10, + -35, 0, -15, 0, 0, 3, -2, 4, + -4, 0, 5, 1, -16, -21, 0, -27, + -13, -11, -13, -16, -7, -15, -1, -10, + -15, 3, 0, 2, 0, -5, 0, 0, + 0, 4, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -3, 0, -2, -5, 0, -9, -12, + -12, -2, 0, -16, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -10, 0, 0, 0, 0, -27, -16, 0, + 0, 0, -8, -27, 0, 0, -5, 5, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, -10, 0, + 0, 0, 0, 7, 0, 4, -11, -11, + 0, -5, -5, -7, 0, 0, 0, 0, + 0, 0, -16, 0, -5, 0, -8, -5, + 0, -12, -14, -16, -4, 0, -11, 0, + -16, 0, 0, 0, 0, 44, 0, 0, + 3, 0, 0, -7, 0, 5, 0, -23, + 0, 0, 0, 0, 0, -51, -10, 18, + 16, -4, -23, 0, 5, -8, 0, -27, + -3, -7, 5, -38, -5, 7, 0, 8, + -19, -8, -20, -18, -23, 0, 0, -33, + 0, 31, 0, 0, -3, 0, 0, 0, + -3, -3, -5, -15, -18, -1, -51, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -3, -5, -8, 0, 0, + -11, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -11, 0, 0, 11, + -2, 7, 0, -12, 5, -4, -2, -14, + -5, 0, -7, -5, -4, 0, -8, -9, + 0, 0, -4, -2, -4, -9, -7, 0, + 0, -5, 0, 5, -4, 0, -12, 0, + 0, 0, -11, 0, -9, 0, -9, -9, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 5, 0, -8, 0, -4, -7, + -17, -4, -4, -4, -2, -4, -7, -2, + 0, 0, 0, 0, 0, -5, -4, -4, + 0, 0, 0, 0, 7, -4, 0, -4, + 0, 0, 0, -4, -7, -4, -5, -7, + -5, 0, 4, 22, -2, 0, -15, 0, + -4, 11, 0, -5, -23, -7, 8, 1, + 0, -26, -9, 5, -9, 4, 0, -4, + -4, -17, 0, -8, 3, 0, 0, -9, + 0, 0, 0, 5, 5, -11, -10, 0, + -9, -5, -8, -5, -5, 0, -9, 3, + -10, -9, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, -7, + 0, 0, -5, -5, 0, 0, 0, 0, + -5, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -8, 0, -11, 0, 0, 0, -18, 0, + 4, -12, 11, 1, -4, -26, 0, 0, + -12, -5, 0, -22, -14, -15, 0, 0, + -23, -5, -22, -21, -26, 0, -14, 0, + 4, 36, -7, 0, -13, -5, -2, -5, + -9, -15, -10, -20, -22, -13, -5, 0, + 0, -4, 0, 2, 0, 0, -38, -5, + 16, 12, -12, -20, 0, 2, -17, 0, + -27, -4, -5, 11, -50, -7, 2, 0, + 0, -35, -7, -28, -5, -40, 0, 0, + -38, 0, 32, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -21, -4, 0, -35, + 0, 0, 0, 0, -17, 0, -5, 0, + -2, -15, -26, 0, 0, -3, -8, -16, + -5, 0, -4, 0, 0, 0, 0, -24, + -5, -18, -17, -4, -9, -14, -5, -9, + 0, -11, -5, -18, -8, 0, -7, -10, + -5, -10, 0, 3, 0, -4, -18, 0, + 11, 0, -10, 0, 0, 0, 0, 7, + 0, 4, -11, 22, 0, -5, -5, -7, + 0, 0, 0, 0, 0, 0, -16, 0, + -5, 0, -8, -5, 0, -12, -14, -16, + -4, 0, -11, 4, 22, 0, 0, 0, + 0, 44, 0, 0, 3, 0, 0, -7, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -11, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -5, -5, 0, 0, -11, + -5, 0, 0, -11, 0, 9, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 8, 11, 4, -5, 0, -17, + -9, 0, 16, -18, -17, -11, -11, 22, + 10, 5, -47, -4, 11, -5, 0, -5, + 6, -5, -19, 0, -5, 5, -7, -4, + -16, -4, 0, 0, 16, 11, 0, -15, + 0, -30, -7, 16, -7, -21, 2, -7, + -18, -18, -5, 22, 5, 0, -8, 0, + -15, 0, 4, 18, -13, -20, -22, -14, + 16, 0, 2, -40, -4, 5, -9, -4, + -13, 0, -12, -20, -8, -8, -4, 0, + 0, -13, -11, -5, 0, 16, 13, -5, + -30, 0, -30, -8, 0, -19, -32, -2, + -17, -9, -18, -15, 15, 0, 0, -7, + 0, -11, -5, 0, -5, -10, 0, 9, + -18, 5, 0, 0, -29, 0, -5, -12, + -9, -4, -16, -14, -18, -13, 0, -16, + -5, -13, -10, -16, -5, 0, 0, 2, + 26, -9, 0, -16, -5, 0, -5, -11, + -13, -15, -15, -21, -7, -11, 11, 0, + -8, 0, -27, -7, 3, 11, -17, -20, + -11, -18, 18, -5, 3, -51, -10, 11, + -12, -9, -20, 0, -16, -23, -7, -5, + -4, -5, -11, -16, -2, 0, 0, 16, + 15, -4, -35, 0, -33, -13, 13, -21, + -37, -11, -19, -23, -27, -18, 11, 0, + 0, 0, 0, -7, 0, 0, 5, -7, + 11, 4, -10, 11, 0, 0, -17, -2, + 0, -2, 0, 2, 2, -4, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 4, 16, 1, 0, -7, 0, 0, + 0, 0, -4, -4, -7, 0, 0, 0, + 2, 4, 0, 0, 0, 0, 4, 0, + -4, 0, 21, 0, 10, 2, 2, -7, + 0, 11, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 16, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -33, 0, -5, 9, 0, 16, + 0, 0, 54, 7, -11, -11, 5, 5, + -4, 2, -27, 0, 0, 26, -33, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -37, 21, 76, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -10, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -15, 0, + 0, 2, 0, 0, 5, 70, -11, -4, + 17, 15, -15, 5, 0, 0, 5, 5, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -71, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -15, + 0, 0, 0, -15, 0, 0, 0, 0, + -12, -3, 0, 0, 0, -12, 0, -7, + 0, -26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -36, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -5, 0, 0, -10, 0, -8, 0, + -15, 0, 0, 0, -9, 5, -7, 0, + 0, -15, -5, -13, 0, 0, -15, 0, + -5, 0, -26, 0, -6, 0, 0, -44, + -10, -22, -6, -20, 0, 0, -36, 0, + -15, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -8, -10, -4, -9, 0, 0, + 0, 0, -12, 0, -12, 7, -6, 11, + 0, -4, -13, -4, -9, -10, 0, -7, + -3, -4, 4, -15, -2, 0, 0, 0, + -48, -4, -8, 0, -12, 0, -4, -26, + -5, 0, 0, -4, -4, 0, 0, 0, + 0, 4, 0, -4, -9, -4, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, -12, 0, -4, 0, 0, 0, -11, + 5, 0, 0, 0, -15, -5, -11, 0, + 0, -15, 0, -5, 0, -26, 0, 0, + 0, 0, -53, 0, -11, -20, -27, 0, + 0, -36, 0, -4, -8, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -8, -3, + -8, 2, 0, 0, 9, -7, 0, 17, + 27, -5, -5, -16, 7, 27, 9, 12, + -15, 7, 23, 7, 16, 12, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 26, -10, -5, 0, -4, + 44, 23, 44, 0, 0, 0, 5, 0, + 0, 20, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 0, 0, 0, -46, -7, -4, -22, + -27, 0, 0, -36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, -46, -7, -4, + -22, -27, 0, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, -13, 5, 0, -5, + 4, 10, 5, -16, 0, -1, -4, 5, + 0, 4, 0, 0, 0, 0, -14, 0, + -5, -4, -11, 0, -5, -22, 0, 34, + -5, 0, -12, -4, 0, -4, -9, 0, + -5, -15, -11, -7, 0, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, -46, + -7, -4, -22, -27, 0, 0, -36, 0, + 0, 0, 0, 0, 0, 27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, -17, -7, -5, 16, -5, -5, + -22, 2, -3, 2, -4, -15, 1, 12, + 1, 4, 2, 4, -13, -22, -7, 0, + -21, -10, -15, -23, -21, 0, -9, -11, + -7, -7, -4, -4, -7, -4, 0, -4, + -2, 8, 0, 8, -4, 0, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -5, -5, 0, 0, + -15, 0, -3, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, 0, 0, 0, -4, 0, 0, -9, + -5, 5, 0, -9, -10, -4, 0, -16, + -4, -12, -4, -7, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -36, 0, 17, 0, 0, -10, 0, + 0, 0, 0, -7, 0, -5, 0, 0, + -3, 0, 0, -4, 0, -13, 0, 0, + 23, -7, -18, -17, 4, 6, 6, -1, + -15, 4, 8, 4, 16, 4, 18, -4, + -15, 0, 0, -22, 0, 0, -16, -15, + 0, 0, -11, 0, -7, -9, 0, -8, + 0, -8, 0, -4, 8, 0, -4, -16, + -5, 20, 0, 0, -5, 0, -11, 0, + 0, 7, -13, 0, 5, -5, 4, 1, + 0, -18, 0, -4, -2, 0, -5, 6, + -4, 0, 0, 0, -22, -7, -12, 0, + -16, 0, 0, -26, 0, 20, -5, 0, + -10, 0, 3, 0, -5, 0, -5, -16, + 0, -5, 5, 0, 0, 0, 0, -4, + 0, 0, 5, -7, 2, 0, 0, -7, + -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -34, 0, 12, 0, + 0, -4, 0, 0, 0, 0, 1, 0, + -5, -5, 0, 0, 0, 11, 0, 13, + 0, 0, 0, 0, 0, -34, -31, 2, + 23, 16, 9, -22, 4, 23, 0, 20, + 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_34 = { +#else +lv_font_t lv_font_montserrat_34 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 38, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_34*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_36.c b/inc/lvgl/src/font/lv_font_montserrat_36.c new file mode 100644 index 0000000..f5ef2ec --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_36.c @@ -0,0 +1,7655 @@ +/******************************************************************************* + * Size: 36 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 36 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_36.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_36 + #define LV_FONT_MONTSERRAT_36 1 +#endif + +#if LV_FONT_MONTSERRAT_36 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x1f, 0xff, + 0xc0, 0xf, 0xff, 0xb0, 0xf, 0xff, 0xb0, 0xf, + 0xff, 0xa0, 0xf, 0xff, 0x90, 0xe, 0xff, 0x90, + 0xd, 0xff, 0x80, 0xd, 0xff, 0x70, 0xc, 0xff, + 0x70, 0xc, 0xff, 0x60, 0xb, 0xff, 0x50, 0xa, + 0xff, 0x50, 0xa, 0xff, 0x40, 0x9, 0xff, 0x30, + 0x9, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x76, 0x0, 0x2f, + 0xff, 0xc0, 0x7f, 0xff, 0xf1, 0x5f, 0xff, 0xf0, + 0x8, 0xed, 0x40, + + /* U+0022 "\"" */ + 0xbf, 0xf4, 0x0, 0x3f, 0xfc, 0xbf, 0xf4, 0x0, + 0x3f, 0xfc, 0xaf, 0xf3, 0x0, 0x2f, 0xfb, 0xaf, + 0xf3, 0x0, 0x2f, 0xfb, 0xaf, 0xf2, 0x0, 0x1f, + 0xfb, 0x9f, 0xf2, 0x0, 0x1f, 0xfa, 0x9f, 0xf2, + 0x0, 0x1f, 0xfa, 0x9f, 0xf1, 0x0, 0xf, 0xf9, + 0x8f, 0xf1, 0x0, 0xf, 0xf9, 0x49, 0x90, 0x0, + 0x9, 0x95, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, + 0x7, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfa, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, + 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x1, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x89, 0x99, 0x9f, + 0xfe, 0x99, 0x99, 0x99, 0xdf, 0xf9, 0x99, 0x99, + 0x30, 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, 0x0, + 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfd, + 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x9, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x99, + 0x9e, 0xfe, 0x99, 0x99, 0x91, 0x0, 0x0, 0x0, + 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, + 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xf2, 0x0, 0x0, 0x0, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0x0, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x4, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x0, 0x0, 0x0, 0x6f, 0xf1, 0x0, 0x0, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8c, 0xef, 0xff, + 0xed, 0xa6, 0x10, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xdf, 0xff, 0xc6, 0x2c, 0xf9, 0x24, 0x8d, + 0xff, 0x40, 0x6, 0xff, 0xf9, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x4a, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xa0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xb0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x60, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfe, 0xae, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x95, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfc, 0xcf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x2, 0x9f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0xaf, 0xfd, + 0x4, 0x30, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0xef, 0xfb, 0xc, 0xf9, 0x10, 0x0, 0xc, 0xf8, + 0x0, 0x9, 0xff, 0xf6, 0x4f, 0xff, 0xfa, 0x62, + 0x1c, 0xf8, 0x15, 0xcf, 0xff, 0xd0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x37, 0xbd, 0xff, 0xff, + 0xec, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf8, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x5, 0xbe, 0xfd, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfc, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0x71, + 0x4, 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x60, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x1, + 0xff, 0x70, 0x0, 0x0, 0x1, 0xef, 0xb0, 0x0, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x9, 0xfc, + 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, 0x0, + 0x9, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, + 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xb0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x2f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0xc, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, + 0x9, 0xfc, 0x0, 0x7, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0x1, 0xff, + 0x70, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x71, 0x4, 0xdf, 0xe0, 0x0, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x8f, 0xf4, + 0x0, 0x5c, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xfe, 0x91, 0x0, 0x3f, 0xf8, 0x0, 0xaf, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfd, 0x0, 0x7f, 0xf8, 0x11, + 0x5e, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x30, 0xf, 0xf7, 0x0, 0x0, 0x4f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x70, 0x5, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xc0, 0x0, + 0x9f, 0xc0, 0x0, 0x0, 0x8, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf2, 0x0, 0xa, 0xfa, + 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf6, 0x0, 0x0, 0xaf, 0xa0, 0x0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xfb, 0x0, 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x10, + 0x0, 0x0, 0x5f, 0xe0, 0x0, 0x0, 0xb, 0xfa, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xff, 0x50, 0x0, 0x2, 0xff, 0x50, 0x0, + 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x40, 0x2, 0xdf, 0xc0, 0x0, 0x0, 0x0, + 0xcf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xed, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x7f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xfd, + 0x70, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x18, 0xce, 0xfe, 0xc7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xea, 0x89, 0xef, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, 0x4, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x8, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x9, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf8, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, + 0x2b, 0xff, 0xf7, 0x0, 0x0, 0xb, 0x83, 0x0, + 0x0, 0xcf, 0xfe, 0x40, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x2f, 0xfc, 0x0, 0x8, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x0, 0x7f, 0xf8, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x90, 0xef, 0xf3, 0x0, 0x4f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfc, 0xff, 0xc0, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, + 0x1f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xb0, 0x0, 0x8, 0xff, 0xfe, 0x61, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, + 0xd2, 0x7f, 0xff, 0xc0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x0, 0x6, 0xff, 0x90, + 0x0, 0x0, 0x5, 0xad, 0xef, 0xed, 0xa5, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xbf, 0xf4, 0xbf, 0xf4, 0xaf, 0xf3, 0xaf, 0xf3, + 0xaf, 0xf2, 0x9f, 0xf2, 0x9f, 0xf2, 0x9f, 0xf1, + 0x8f, 0xf1, 0x49, 0x90, + + /* U+0028 "(" */ + 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x2, 0xff, 0xf2, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x2f, 0xff, 0x30, + 0x0, 0x8f, 0xfd, 0x0, 0x0, 0xef, 0xf7, 0x0, + 0x3, 0xff, 0xf2, 0x0, 0x7, 0xff, 0xe0, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0xe, 0xff, 0x70, 0x0, + 0x1f, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x8f, 0xfe, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x9f, 0xfc, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x8f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0x5f, 0xff, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x1f, 0xff, 0x40, 0x0, 0xe, 0xff, 0x70, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x7, 0xff, 0xd0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0xcf, 0xf7, 0x0, + 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x30, + 0x0, 0x9, 0xff, 0xa0, 0x0, 0x1, 0xff, 0xf2, + 0x0, 0x0, 0x8f, 0xfb, + + /* U+0029 ")" */ + 0x9f, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x5f, 0xff, 0x10, + 0x0, 0xf, 0xff, 0x50, 0x0, 0xc, 0xff, 0xa0, + 0x0, 0x8, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xf6, + 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0xcf, 0xf9, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0xaf, 0xfb, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0xcf, 0xf9, + 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0xff, 0xf6, + 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xf1, + 0x0, 0x8, 0xff, 0xd0, 0x0, 0xb, 0xff, 0xa0, + 0x0, 0xf, 0xff, 0x40, 0x0, 0x5f, 0xfe, 0x0, + 0x0, 0xbf, 0xf9, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0x8, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x9f, 0xfb, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x40, 0x0, 0x0, 0x4, 0x40, + 0x0, 0xdf, 0x40, 0x1, 0x70, 0xd, 0xfb, 0x20, + 0xdf, 0x40, 0x8f, 0xf4, 0x1b, 0xff, 0xf9, 0xef, + 0x9e, 0xff, 0xe4, 0x0, 0x4c, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xc3, 0x0, + 0x7, 0xff, 0xfc, 0xef, 0xbf, 0xff, 0xb2, 0x1f, + 0xfe, 0x60, 0xdf, 0x42, 0xbf, 0xf6, 0x6, 0x80, + 0x0, 0xdf, 0x40, 0x4, 0xb0, 0x0, 0x0, 0x0, + 0xdf, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x10, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x8, 0x88, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x87, 0xdd, 0xdd, 0xdd, + 0xff, 0xfd, 0xdd, 0xdd, 0xd7, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x4, 0xcd, 0x60, 0x1f, 0xff, 0xf3, 0x3f, 0xff, + 0xf7, 0x1f, 0xff, 0xf5, 0x3, 0xef, 0xf1, 0x0, + 0xff, 0xb0, 0x3, 0xff, 0x60, 0x7, 0xff, 0x0, + 0xb, 0xfb, 0x0, 0xf, 0xf5, 0x0, + + /* U+002D "-" */ + 0xef, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+002E "." */ + 0x3, 0xcc, 0x50, 0x1f, 0xff, 0xf3, 0x4f, 0xff, + 0xf7, 0x2f, 0xff, 0xf4, 0x5, 0xee, 0x70, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x6, 0xae, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xb5, 0x33, 0x5a, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfc, 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0xf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x2f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf3, 0x4f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf3, 0x2f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf2, 0xf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x9, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x3, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x30, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf3, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xa5, 0x33, 0x5a, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xff, + 0xff, 0xf8, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x11, + 0x11, 0x11, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xf8, + + /* U+0032 "2" */ + 0x0, 0x0, 0x5, 0xac, 0xef, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3f, 0xff, + 0xfe, 0x95, 0x32, 0x36, 0xbf, 0xff, 0xf6, 0x0, + 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe3, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, + + /* U+0033 "3" */ + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x12, 0xdf, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfc, 0x63, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x33, 0x6a, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe0, 0x45, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0xe, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x48, + 0xff, 0xff, 0xc8, 0x53, 0x23, 0x5a, 0xff, 0xff, + 0xb0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x48, 0xbd, + 0xef, 0xed, 0xa5, 0x10, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xe1, + 0x0, 0x0, 0x48, 0x87, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x2, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9, + 0xff, 0xc1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x31, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xc9, 0x40, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, + 0x7d, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x8, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xb0, 0x2f, 0xff, 0xfe, 0xa6, 0x42, 0x34, + 0x8e, 0xff, 0xff, 0x30, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, 0xc8, 0x30, + 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xeb, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x94, 0x21, 0x13, 0x6b, + 0xd0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x70, 0x3, 0x8c, 0xef, 0xed, + 0x94, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x4f, 0xff, + 0x6d, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0x40, + 0x3, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfa, 0x1, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, + 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x20, 0xaf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf3, 0x5, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x20, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xff, + 0xc5, 0x0, 0x0, 0x3a, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xee, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xec, 0x82, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xef, 0xf9, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, 0xff, 0x90, + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x20, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfb, 0x0, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x89, 0x94, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x1, 0x6a, 0xde, 0xfe, 0xdb, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xee, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0xb, 0xff, 0xfe, 0x61, 0x0, 0x1, 0x5d, 0xff, + 0xfd, 0x0, 0x2, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x7, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xfa, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x1, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x29, 0xff, 0xfb, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xeb, 0xbb, 0xdf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x1d, 0xff, 0xfd, 0x73, 0x0, 0x2, 0x6c, + 0xff, 0xfe, 0x20, 0xa, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfc, 0x1, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x76, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf9, 0x5f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x82, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xfb, + 0x51, 0x0, 0x0, 0x4a, 0xff, 0xff, 0x60, 0x0, + 0x5f, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x2, 0x7b, + 0xde, 0xfe, 0xdb, 0x73, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x16, 0xbd, 0xff, 0xdb, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xa, 0xff, + 0xfc, 0x50, 0x0, 0x4, 0xaf, 0xff, 0xd0, 0x0, + 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x20, 0xef, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xe0, + 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf4, 0x6f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf6, 0xd, 0xff, + 0xfd, 0x50, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xf7, + 0x2, 0xef, 0xff, 0xff, 0xee, 0xff, 0xff, 0xf5, + 0xff, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x32, 0xff, 0xf6, 0x0, 0x0, 0x38, 0xce, + 0xfe, 0xd9, 0x40, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0xbc, 0x73, 0x10, 0x13, 0x7d, + 0xff, 0xff, 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x17, 0xbd, 0xff, 0xfd, 0xb7, 0x20, 0x0, + 0x0, 0x0, + + /* U+003A ":" */ + 0x5, 0xee, 0x70, 0x2f, 0xff, 0xf4, 0x4f, 0xff, + 0xf6, 0x1f, 0xff, 0xf3, 0x4, 0xcc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcc, 0x50, 0x1f, 0xff, 0xf3, + 0x4f, 0xff, 0xf7, 0x2f, 0xff, 0xf4, 0x5, 0xee, + 0x70, + + /* U+003B ";" */ + 0x5, 0xee, 0x70, 0x2f, 0xff, 0xf4, 0x4f, 0xff, + 0xf6, 0x1f, 0xff, 0xf3, 0x4, 0xcc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xcd, 0x60, 0x1f, 0xff, 0xf3, + 0x3f, 0xff, 0xf7, 0x1f, 0xff, 0xf5, 0x3, 0xef, + 0xf1, 0x0, 0xff, 0xb0, 0x3, 0xff, 0x60, 0x7, + 0xff, 0x0, 0xb, 0xfb, 0x0, 0xf, 0xf5, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xfd, 0x71, 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7d, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, + + /* U+003D "=" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0x79, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xff, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xcf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x1, + 0x7d, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x5b, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x16, 0xad, 0xff, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xff, 0xd7, + 0x31, 0x1, 0x4a, 0xff, 0xff, 0x80, 0x2c, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, 0x0, + 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0xe6, 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xbe, + 0xef, 0xfe, 0xca, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0xfd, 0xa7, 0x65, 0x56, 0x8b, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x10, + 0x0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfb, 0x0, 0x0, 0x1, 0xef, 0xf2, 0x0, 0x0, + 0x0, 0x5a, 0xef, 0xfd, 0x94, 0x0, 0x7f, 0xfa, + 0x0, 0x8f, 0xf6, 0x0, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x27, + 0xff, 0xa0, 0x0, 0xcf, 0xe0, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0xcd, 0xff, + 0xfe, 0x9f, 0xfa, 0x0, 0x4, 0xff, 0x60, 0x5, + 0xff, 0x60, 0x0, 0x2, 0xff, 0xfe, 0x60, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xa0, 0x0, 0xd, 0xfb, + 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xdf, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, + 0x7f, 0xf0, 0xe, 0xfc, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xa0, + 0x0, 0x4, 0xff, 0x31, 0xff, 0x90, 0x0, 0x9, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfa, 0x0, 0x0, 0x1f, 0xf6, 0x2f, 0xf7, 0x0, + 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xa0, 0x0, 0x0, 0xff, 0x73, 0xff, + 0x60, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0xf, 0xf7, + 0x3f, 0xf6, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0x72, 0xff, 0x70, 0x0, 0xc, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, + 0x0, 0x1f, 0xf6, 0x1f, 0xf9, 0x0, 0x0, 0x9f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xa0, 0x0, 0x3, 0xff, 0x30, 0xef, 0xc0, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xf0, 0xa, 0xff, + 0x10, 0x0, 0xc, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xb0, 0x0, 0xd, 0xfb, 0x0, + 0x5f, 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xe6, 0x0, + 0x0, 0x17, 0xff, 0xef, 0xff, 0x30, 0x8, 0xff, + 0x40, 0x0, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xcb, 0xdf, 0xff, 0xe1, 0xef, 0xff, 0xcd, + 0xff, 0xb0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x5, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x1e, 0xff, 0x20, + 0x0, 0x0, 0x5, 0xae, 0xff, 0xda, 0x40, 0x0, + 0x4, 0xbe, 0xfc, 0x70, 0x0, 0x0, 0x0, 0x4f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x28, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xda, 0x76, 0x66, 0x8a, 0xdf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, + 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf5, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xe0, 0x9, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x70, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x4f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, + 0x60, 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0x0, 0xe, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, 0x6f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfc, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x30, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, + 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + + /* U+0042 "B" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, + 0x50, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x3f, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xf9, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xf5, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x2, 0x5c, 0xff, 0xfb, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x3, 0xff, 0xfe, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, 0xf4, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8f, 0xff, 0xf4, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x33, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0x13, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xef, 0xff, 0x90, 0x3f, 0xff, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xc0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xa6, 0x10, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc7, 0x43, 0x24, 0x6b, 0xff, 0xff, 0xf4, + 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xd1, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x10, + 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x10, + 0x0, 0x6, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xff, 0xd2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc7, 0x43, 0x24, 0x6b, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, + + /* U+0044 "D" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x3f, + 0xff, 0x61, 0x11, 0x11, 0x11, 0x24, 0x8d, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf8, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x10, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xe1, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x11, 0x24, + 0x8d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x3f, 0xff, + 0x61, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, + + /* U+0046 "F" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x93, 0xff, 0xf6, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc8, 0x53, 0x24, 0x5a, 0xef, 0xff, 0xf8, + 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xf3, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0x30, + 0x0, 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0xa7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfb, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfb, 0x4, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x0, 0x5, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xfb, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xc8, 0x43, 0x23, 0x59, 0xef, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, + + /* U+0048 "H" */ + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x73, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x61, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x3f, 0xff, 0x73, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, + + /* U+0049 "I" */ + 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, + 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, + 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, + 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, + 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, + 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x63, + 0xff, 0xf6, 0x3f, 0xff, 0x63, 0xff, 0xf6, 0x3f, + 0xff, 0x63, 0xff, 0xf6, 0x3f, 0xff, 0x60, + + /* U+004A "J" */ + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfc, + 0x0, 0x93, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8, 0xfe, 0x30, 0x0, 0x0, 0xa, 0xff, 0xf5, + 0x1f, 0xff, 0xfa, 0x41, 0x14, 0xbf, 0xff, 0xe0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xb6, 0x0, 0x0, + + /* U+004B "K" */ + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfa, 0x3, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfb, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x4, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x4, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x4, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf6, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x63, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x68, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x60, 0xa, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x60, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd1, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + + /* U+004C "L" */ + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x10, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf9, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, + 0x3f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf9, 0x3f, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf9, 0x3f, 0xff, 0xaf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfa, 0xef, 0xf9, + 0x3f, 0xff, 0x3c, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf9, 0x3f, 0xff, + 0x33, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0x70, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x9f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, + 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x1e, 0xff, 0x90, + 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, 0xef, 0xf9, + 0x3f, 0xff, 0x30, 0x6, 0xff, 0xf3, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0xef, 0xf9, 0x3f, 0xff, + 0x30, 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x5f, 0xff, + 0x10, 0x0, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, + 0x2f, 0xff, 0x60, 0x0, 0xef, 0xf7, 0x0, 0x0, + 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x9, 0xff, + 0xe1, 0x8, 0xff, 0xd0, 0x0, 0x0, 0xef, 0xf9, + 0x3f, 0xff, 0x30, 0x0, 0x0, 0xef, 0xf9, 0x2f, + 0xff, 0x40, 0x0, 0x0, 0xef, 0xf9, 0x3f, 0xff, + 0x30, 0x0, 0x0, 0x5f, 0xff, 0xcf, 0xfa, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x3f, 0xff, 0x30, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x3f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf9, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf9, + + /* U+004E "N" */ + 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x73, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x73, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x73, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0xdf, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x73, 0xff, 0xf6, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x73, + 0xff, 0xf6, 0x2, 0xef, 0xff, 0x70, 0x0, 0x0, + 0x2, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x4, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, + 0xf6, 0x0, 0x7, 0xff, 0xfe, 0x20, 0x0, 0x2, + 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, 0xa, 0xff, + 0xfd, 0x0, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x2, 0xff, + 0xf7, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x1e, 0xff, + 0xf7, 0x0, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x2, 0xff, 0xf7, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf2, 0x2f, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd3, 0xff, 0xf7, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf7, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x73, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xc7, + 0x43, 0x23, 0x6b, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0xe, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x1f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x3, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x70, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfe, 0x10, 0x0, 0x2f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xc7, 0x43, 0x23, 0x6a, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x12, 0x47, + 0xdf, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xe0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xe0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x25, 0xbf, 0xff, + 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xca, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfc, 0x74, 0x32, 0x46, 0xbf, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x0, 0x0, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xd0, 0x0, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x20, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x3, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x4f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf7, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x70, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, + 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x4f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0x0, 0x3, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0x60, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, 0x52, 0x11, + 0x24, 0x9e, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbe, 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x6, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfb, 0x30, 0x0, 0x3a, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xed, 0xef, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8c, 0xff, + 0xeb, 0x60, 0x0, + + /* U+0052 "R" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x3f, 0xff, 0x61, 0x11, 0x11, 0x12, 0x47, + 0xdf, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xe0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xe0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x25, 0xbf, 0xff, + 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x3f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfd, 0x0, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf3, + + /* U+0053 "S" */ + 0x0, 0x0, 0x1, 0x7b, 0xdf, 0xff, 0xeb, 0x84, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, + 0xff, 0xd7, 0x31, 0x1, 0x25, 0x9e, 0xff, 0x40, + 0x6, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfe, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfd, 0x95, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x5, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, + 0xd, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf5, 0x5f, 0xff, 0xfd, 0x84, 0x21, 0x1, + 0x37, 0xdf, 0xff, 0xc0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xda, 0x61, + 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x11, 0x11, 0x11, 0x14, 0xff, 0xf6, 0x11, 0x11, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x7f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x5f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfb, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0xc, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf3, 0x6, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x50, 0x0, + 0x3f, 0xff, 0xfe, 0x85, 0x32, 0x36, 0xcf, 0xff, + 0xf9, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xed, 0x95, + 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x5f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x1f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfc, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x50, + 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf9, 0x0, 0xbf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf1, 0x2f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x79, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0057 "W" */ + 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x35, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0xf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x5, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xd0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xaf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0xaf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc3, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf7, 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0x0, 0xf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x8f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xc0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xef, 0xf6, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0xef, 0xf6, 0x0, 0x0, + 0xc, 0xff, 0xa0, 0x0, 0xa, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x1, + 0xff, 0xf5, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf6, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xa0, 0xa, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xb0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x1b, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf5, 0x5f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xba, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0xdf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x10, + 0x0, 0x2f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf4, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf3, 0x0, 0x0, 0xc, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x8f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xa0, 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x1e, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf7, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x9, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xfe, 0x10, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x2f, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x90, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x1e, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, 0x0, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x0, 0x6, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, + 0x3f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf6, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x20, 0x3f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xd0, 0x0, 0x1, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf4, 0x0, 0x0, 0x6, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0xb, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x1, + 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x9f, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, + 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x5c, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x12, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfc, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x10, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, + + /* U+005B "[" */ + 0x3f, 0xff, 0xff, 0xff, 0x43, 0xff, 0xff, 0xff, + 0xf4, 0x3f, 0xff, 0xdd, 0xdd, 0x33, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, + 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, + 0xff, 0xdd, 0xdd, 0x33, 0xff, 0xff, 0xff, 0xf4, + 0x3f, 0xff, 0xff, 0xff, 0x40, + + /* U+005C "\\" */ + 0x28, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, + + /* U+005D "]" */ + 0x5f, 0xff, 0xff, 0xff, 0x35, 0xff, 0xff, 0xff, + 0xf3, 0x4d, 0xdd, 0xdf, 0xff, 0x30, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, + 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, + 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, + 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, 0x4f, + 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x0, 0x0, + 0x4f, 0xff, 0x30, 0x0, 0x4, 0xff, 0xf3, 0x4d, + 0xdd, 0xdf, 0xff, 0x35, 0xff, 0xff, 0xff, 0xf3, + 0x5f, 0xff, 0xff, 0xff, 0x30, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf7, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfd, 0xc, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x60, 0x6f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x9, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0x20, + 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0xef, 0xc0, + 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x6f, 0xf5, + 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, 0xc, 0xfe, + 0x0, 0x0, 0x0, 0xe, 0xfc, 0x0, 0x3, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0xaf, + 0xf1, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, 0x1f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, + + /* U+005F "_" */ + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x38, 0x88, 0x60, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xb0, 0x0, 0x0, + 0x1, 0xaf, 0xfc, 0x10, 0x0, 0x0, 0x6, 0xff, + 0xd1, + + /* U+0061 "a" */ + 0x0, 0x0, 0x38, 0xbe, 0xff, 0xec, 0x82, 0x0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x1, 0xff, 0xe8, 0x30, 0x0, + 0x26, 0xef, 0xff, 0x70, 0x0, 0x67, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf5, + 0x0, 0x1, 0x7b, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x4, 0xff, 0xff, 0xb8, 0x77, 0x77, + 0x77, 0xff, 0xf6, 0xd, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0x1f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0x2f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xc, + 0xff, 0xe3, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf6, + 0x3, 0xff, 0xff, 0xb8, 0x78, 0xcf, 0xfe, 0xff, + 0xf6, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xef, 0xf6, 0x0, 0x1, 0x6b, 0xef, 0xfd, 0xa6, + 0x0, 0xef, 0xf6, + + /* U+0062 "b" */ + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x2, 0x8c, 0xef, 0xec, + 0x83, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0xb, 0xff, + 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x2, 0x7d, + 0xff, 0xfe, 0x10, 0xb, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0xbf, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x90, 0xbf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfd, 0xb, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf0, 0xbf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0xb, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x90, 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0xbf, + 0xff, 0xff, 0xe8, 0x30, 0x2, 0x7d, 0xff, 0xfe, + 0x10, 0xb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0xbf, 0xf9, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0xb, 0xff, + 0x90, 0x2, 0x8c, 0xef, 0xec, 0x83, 0x0, 0x0, + 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xd9, 0x40, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x5, 0xff, 0xff, + 0xa4, 0x10, 0x14, 0xbf, 0xff, 0xe1, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x52, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x52, 0x0, 0x2, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0x4, + 0xff, 0xff, 0xa4, 0x10, 0x14, 0xaf, 0xff, 0xe1, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, + 0xff, 0xd9, 0x40, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x40, 0x0, 0x0, 0x5, 0xad, 0xff, 0xdb, + 0x50, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x3f, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xf4, 0x0, 0x7f, 0xff, 0xfa, 0x41, 0x1, 0x5b, + 0xff, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf4, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x41, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0x4f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x46, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, + 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x46, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf4, 0x4f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x41, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf4, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xd2, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf4, 0x0, + 0x7f, 0xff, 0xf7, 0x10, 0x0, 0x18, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x8f, 0xff, 0xff, 0xec, 0xef, + 0xff, 0xf8, 0xff, 0xf4, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xf, 0xff, 0x40, 0x0, + 0x0, 0x6, 0xad, 0xff, 0xeb, 0x60, 0x0, 0xff, + 0xf4, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfe, 0xef, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6f, + 0xff, 0xd5, 0x10, 0x0, 0x4c, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x40, 0xa, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x1f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf1, 0x4f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x6f, 0xff, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x7, 0xe2, 0x0, 0x0, 0x6f, + 0xff, 0xfb, 0x51, 0x0, 0x26, 0xdf, 0xfd, 0x10, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xce, 0xff, 0xda, 0x60, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfd, 0x92, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x6f, 0xff, 0xfe, 0xdf, 0xf5, 0x0, 0x0, 0xef, + 0xfe, 0x30, 0x0, 0x50, 0x0, 0x2, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5c, + 0xcd, 0xff, 0xfd, 0xcc, 0xcc, 0x80, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x6a, 0xdf, 0xfe, 0xb6, 0x10, + 0xc, 0xff, 0x80, 0x0, 0x5, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xcf, 0xf8, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0xff, 0x80, + 0x9, 0xff, 0xff, 0x94, 0x10, 0x3, 0x8f, 0xff, + 0xff, 0xf8, 0x5, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0x80, 0xdf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x85, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf8, 0x7f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x87, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf8, 0x5f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x82, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x80, 0x4f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xfa, 0x41, + 0x1, 0x39, 0xff, 0xff, 0xff, 0x80, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xef, 0xf8, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xe, 0xff, 0x80, 0x0, 0x0, 0x6, 0xad, 0xff, + 0xeb, 0x71, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf2, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x7, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x1, + 0xff, 0xff, 0xa6, 0x20, 0x0, 0x26, 0xdf, 0xff, + 0xe1, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xbd, 0xef, 0xfe, 0xb8, 0x20, 0x0, + 0x0, + + /* U+0068 "h" */ + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb0, 0x3, 0x8c, 0xef, + 0xec, 0x81, 0x0, 0x0, 0xbf, 0xfb, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xb, 0xff, 0xcd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xbf, + 0xff, 0xff, 0xd6, 0x21, 0x14, 0xaf, 0xff, 0xf4, + 0xb, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x1b, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf4, 0xbf, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x5b, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + + /* U+0069 "i" */ + 0x0, 0x66, 0x10, 0xd, 0xff, 0xd0, 0x4f, 0xff, + 0xf4, 0x2f, 0xff, 0xf2, 0x6, 0xdd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, + 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, + 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, + 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, + 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, + 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, + 0xb, 0xff, 0xb0, 0xb, 0xff, 0xb0, 0xb, 0xff, + 0xb0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x57, 0x20, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xce, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xb0, 0x4, 0x60, 0x0, 0x9f, + 0xff, 0x60, 0xb, 0xff, 0xef, 0xff, 0xfe, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x5, 0xbe, + 0xff, 0xd8, 0x10, 0x0, + + /* U+006B "k" */ + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x1, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x2d, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x3, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf7, 0xef, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xe3, 0x0, 0x6, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0xbf, 0xfe, 0x20, 0x0, 0x0, 0x9f, 0xff, 0xb0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x50, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfd, 0x10, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xb0, + + /* U+006C "l" */ + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, 0xbf, 0xfb, + 0xbf, 0xfb, 0xbf, 0xfb, + + /* U+006D "m" */ + 0xbf, 0xf9, 0x0, 0x5a, 0xdf, 0xfd, 0xb5, 0x0, + 0x0, 0x0, 0x5a, 0xde, 0xfe, 0xb6, 0x0, 0x0, + 0xbf, 0xf9, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xbf, 0xfc, 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x27, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0x92, 0x0, 0x3, 0xcf, 0xff, + 0xef, 0xff, 0xa3, 0x0, 0x3, 0xbf, 0xff, 0xd0, + 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, + 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + + /* U+006E "n" */ + 0xbf, 0xf9, 0x0, 0x49, 0xde, 0xfe, 0xc8, 0x10, + 0x0, 0xb, 0xff, 0x92, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xbf, 0xfb, 0xef, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xfa, + 0x30, 0x0, 0x17, 0xff, 0xff, 0x40, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf1, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x4b, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf5, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x6b, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x6b, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf6, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x60, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, + 0xf3, 0x0, 0x2, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xe1, 0x0, 0xaf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x80, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf2, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x47, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf5, 0x6f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf2, 0xf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0x0, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x70, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xe1, 0x0, 0x5, 0xff, + 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, 0xf3, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xdf, 0xff, 0xc9, 0x40, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xbf, 0xf9, 0x0, 0x38, 0xce, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0xb, 0xff, 0x91, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0xbf, 0xfb, 0xdf, + 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xe3, 0x0, 0xb, + 0xff, 0xff, 0xfd, 0x50, 0x0, 0x4, 0xbf, 0xff, + 0xe1, 0x0, 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xb0, 0xb, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x40, 0xbf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf9, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0xbf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf9, + 0xb, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x40, 0xbf, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xb0, 0xb, 0xff, 0xff, + 0xff, 0x83, 0x0, 0x27, 0xdf, 0xff, 0xe1, 0x0, + 0xbf, 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0xb, 0xff, 0xb0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x28, 0xce, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfd, 0xb6, 0x0, + 0xf, 0xff, 0x40, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0x40, + 0x7, 0xff, 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, + 0xff, 0xf4, 0x3, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x40, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x1f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf4, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x47, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf4, 0x6f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x44, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x40, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf4, 0x3, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0x7, 0xff, + 0xff, 0xa4, 0x10, 0x15, 0xbf, 0xff, 0xff, 0xf4, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0x40, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x33, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x6a, 0xdf, 0xfd, 0xb5, 0x0, 0x3f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf4, + + /* U+0072 "r" */ + 0xbf, 0xf9, 0x0, 0x38, 0xce, 0x8b, 0xff, 0x90, + 0xaf, 0xff, 0xf8, 0xbf, 0xf9, 0xbf, 0xff, 0xff, + 0x8b, 0xff, 0xff, 0xff, 0x96, 0x42, 0xbf, 0xff, + 0xfc, 0x10, 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x6, 0xad, 0xff, 0xed, 0xa7, 0x20, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x1f, 0xff, 0xe6, 0x10, 0x0, 0x25, + 0xbf, 0x60, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xfd, 0xa7, 0x30, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x0, 0x0, 0x0, 0x4, + 0x8b, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x8e, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xd0, + 0x7f, 0xfc, 0x73, 0x0, 0x0, 0x3a, 0xff, 0xf8, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, 0xeb, 0x82, + 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x5c, 0xcd, 0xff, 0xfd, 0xcc, 0xcc, + 0x80, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x50, 0x1, 0x81, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xef, 0xf7, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x4a, 0xef, 0xfc, + 0x81, + + /* U+0075 "u" */ + 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x1e, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf1, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x1e, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x1e, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x1e, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x1e, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf1, 0xef, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf1, 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x19, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x10, 0xcf, + 0xff, 0xb3, 0x0, 0x1, 0x6e, 0xff, 0xff, 0xf1, + 0x2, 0xef, 0xff, 0xff, 0xde, 0xff, 0xff, 0xaf, + 0xff, 0x10, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x53, 0xff, 0xf1, 0x0, 0x0, 0x4a, 0xdf, 0xfe, + 0xb6, 0x0, 0x3f, 0xff, 0x10, + + /* U+0076 "v" */ + 0xd, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xe0, 0x6, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x10, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xb0, 0x0, 0x0, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0xef, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf1, 0x0, 0xd, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, 0x4f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfe, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x52, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc9, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, + + /* U+0077 "w" */ + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x90, 0xd, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf3, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xef, 0xf6, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x4, 0xff, 0xd7, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0xaf, 0xf7, 0x1f, 0xff, 0x20, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x0, + 0x0, 0x1f, 0xff, 0x10, 0xbf, 0xf7, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x9, 0xff, 0x90, + 0x0, 0x7, 0xff, 0xb0, 0x4, 0xff, 0xd0, 0x0, + 0x2, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3f, 0xfe, + 0x0, 0x0, 0xdf, 0xf4, 0x0, 0xe, 0xff, 0x30, + 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf5, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x8f, 0xf9, + 0x0, 0xe, 0xff, 0x30, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xb0, 0x9, 0xff, 0x80, 0x0, 0x2, 0xff, + 0xf0, 0x4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x10, 0xef, 0xf2, 0x0, 0x0, 0xc, + 0xff, 0x50, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf6, 0x5f, 0xfc, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xcb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xff, 0xf7, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, + + /* U+0078 "x" */ + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x90, 0x1, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xfc, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0xb, 0xff, 0xe1, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x4, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd1, 0x1e, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf5, 0x7f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x90, 0xb, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfc, + 0x0, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe1, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x7, 0xff, + 0xf6, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x30, 0x2f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xe1, + + /* U+0079 "y" */ + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xe0, 0x6, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0xef, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x10, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x9, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xb0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xbf, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0xef, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xb0, + 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf2, 0x0, 0xc, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x3f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x10, 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0x72, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xe9, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xa3, 0x0, 0x3d, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xd9, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x4c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x59, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, + + /* U+007B "{" */ + 0x0, 0x0, 0x7, 0xcf, 0xff, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xec, 0x0, + 0xd, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0xf, 0xff, 0x60, 0x0, 0x0, 0x1f, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, + 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x1f, 0xff, 0x50, 0x0, 0x0, 0x8f, + 0xff, 0x30, 0x0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xcd, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x1f, 0xff, 0x50, 0x0, 0x0, 0x1f, 0xff, 0x60, + 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, + 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, + 0x60, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0xf, 0xff, 0x90, + 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xec, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x0, 0x0, 0x7, 0xcf, 0xff, + + /* U+007C "|" */ + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, + 0x3f, 0xff, + + /* U+007D "}" */ + 0x5f, 0xfe, 0xb4, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xef, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, 0x3, + 0xff, 0xff, 0xd7, 0x0, 0x0, 0x9f, 0xff, 0x10, + 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0x0, 0x4d, 0xff, 0xff, + 0xf2, 0x0, 0x5, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x5f, 0xfe, 0xa4, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x6c, 0xfe, 0xb3, 0x0, 0x0, 0x0, 0x7f, + 0xd0, 0x8f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xb, + 0xfb, 0x3f, 0xff, 0xbb, 0xff, 0xfc, 0x20, 0x4, + 0xff, 0x79, 0xff, 0x30, 0x3, 0xdf, 0xff, 0xbb, + 0xff, 0xf2, 0xcf, 0x90, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0xa, 0xc5, 0x0, 0x0, 0x0, 0x4b, + 0xff, 0xc5, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x1, 0x7b, 0xdb, 0x71, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xf5, 0x0, 0x2, 0xff, 0x92, + 0x2, 0x8f, 0xf3, 0x0, 0xcf, 0x70, 0x0, 0x0, + 0x7f, 0xd0, 0x2f, 0xe0, 0x0, 0x0, 0x0, 0xef, + 0x34, 0xfa, 0x0, 0x0, 0x0, 0xa, 0xf6, 0x5f, + 0xa0, 0x0, 0x0, 0x0, 0xaf, 0x62, 0xfe, 0x0, + 0x0, 0x0, 0xd, 0xf4, 0xd, 0xf6, 0x0, 0x0, + 0x6, 0xfe, 0x0, 0x4f, 0xf7, 0x10, 0x7, 0xff, + 0x50, 0x0, 0x6f, 0xff, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x29, 0xdf, 0xea, 0x30, 0x0, + + /* U+2022 "•" */ + 0x0, 0x37, 0x50, 0x0, 0x9f, 0xff, 0xd1, 0x5f, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xfd, 0x7f, 0xff, + 0xff, 0xb1, 0xff, 0xff, 0xf5, 0x3, 0xcf, 0xd5, + 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6a, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xcf, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcc, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x51, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x69, 0xbc, 0xac, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x3, 0x43, 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xa3, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x20, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7a, 0xba, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0x6f, 0x40, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x4, 0xf6, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x4, 0xff, 0xff, 0xec, 0xcc, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xcc, 0xce, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa6, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x88, 0xcf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x88, + 0x8c, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, + 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf7, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x94, + 0x44, 0x9f, 0xff, 0x73, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x37, 0xff, 0xf9, 0x44, 0x49, 0xff, + 0xff, 0x40, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0x94, + 0x44, 0x9f, 0xff, 0x73, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x37, 0xff, 0xf9, 0x44, 0x49, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf7, 0x0, 0x6, 0xff, 0xff, 0x40, + 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x4, 0xff, + 0xff, 0x40, 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf4, 0x0, 0x4, 0xff, 0xff, 0xc8, 0x88, 0xcf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x88, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa6, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x69, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xce, 0xff, 0xff, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x4, 0xff, 0x7f, 0x40, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x4, 0xf6, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6e, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x9, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x9, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xa, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8d, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x6c, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcc, 0x40, 0x0, 0x8f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x50, 0x7f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xa4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0xef, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, + 0x8f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x50, 0x0, 0x6c, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcc, 0x40, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x56, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xed, 0x10, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x4, 0xed, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf4, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x7f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xef, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfb, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0x20, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x70, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xb0, 0x2f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xe0, + 0x4f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf1, 0x5f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf2, 0x6f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf3, 0x6f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf2, + 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4, + 0xcd, 0xdb, 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf1, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, 0xb, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x6, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x30, 0x0, 0xef, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x30, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xdb, 0xbd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xde, 0xed, + 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xce, 0xee, 0xda, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x18, + 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, 0xa2, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x6e, 0xff, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x60, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x9, 0xff, 0xb2, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x6e, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7, + 0x40, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x20, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xce, 0xee, 0xda, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x62, 0x0, 0x0, 0x0, 0x6, 0x77, + 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf8, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x5f, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x5f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xec, 0xff, 0xff, 0xff, 0x75, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xc1, 0x6, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x70, 0x2, 0x50, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0x40, 0x5, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xfd, 0x20, 0x7, 0xff, 0xff, + 0xd2, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfb, + 0x10, 0xa, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x5f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x3e, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x1c, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xe3, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xa, 0xff, + 0xff, 0xff, 0x70, 0x4, 0xef, 0xff, 0xff, 0xd2, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x7, 0xff, 0xff, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x4, 0xff, 0xff, 0xff, 0x67, 0xff, 0xff, 0x80, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x2, 0xdf, 0xff, + 0xe1, 0xa, 0xff, 0x50, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x1, 0xbf, 0xf3, 0x0, 0x9, 0x30, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x75, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0xbb, 0xbb, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x33, 0x33, + 0x39, 0xff, 0xff, 0xff, 0xff, 0x93, 0x33, 0x33, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x8, 0xff, 0xff, 0x80, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x8f, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x5, 0x50, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x61, 0x16, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xcf, 0xfd, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xf2, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x8f, 0xfa, 0x5d, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa3, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf9, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x8d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x70, 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x5f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfc, 0xc, 0xff, 0xff, 0xc8, 0x88, 0x88, + 0x88, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa1, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x9b, 0xde, 0xec, 0xa7, 0x30, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x71, 0x0, 0x0, 0xe, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0xd, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xc, 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x42, 0x24, 0x7c, 0xff, + 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1e, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xed, 0xcb, 0xaa, 0xff, 0xff, 0xff, 0xff, + 0x6, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xbc, + 0xdd, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe1, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xca, 0xff, + 0xff, 0xff, 0xff, 0xb7, 0x42, 0x24, 0x6b, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xff, 0xff, + 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, 0xed, + 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0xbb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x16, + 0x77, 0x77, 0x77, 0x7e, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x4e, 0xe4, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6f, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x9f, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x3f, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x5f, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xa, 0xff, 0xf7, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5f, 0xf7, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x11, 0x0, 0x1, 0x67, 0x77, 0x77, 0x77, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, + 0xa8, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x30, 0x0, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x30, 0x0, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfe, + 0x20, 0x1, 0xef, 0xfc, 0x0, 0x16, 0x77, 0x77, + 0x77, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, 0x7, 0xff, + 0xf3, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x1f, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xff, 0x50, 0x0, 0x1e, 0xff, 0xc0, 0x0, + 0xbf, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x60, + 0x0, 0x8f, 0xff, 0x20, 0x6, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5, 0xff, 0xff, 0x20, 0x1, 0xff, 0xf6, + 0x0, 0x2f, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0x90, 0x0, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, 0xbf, + 0xfb, 0x0, 0xf, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x6f, 0xff, 0x0, 0xa, 0xff, 0xc0, 0x0, 0xef, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, + 0xbf, 0xfb, 0x0, 0xf, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x4, 0xff, 0xf9, 0x0, 0xd, 0xff, 0x90, 0x0, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, 0xff, 0x20, + 0x1, 0xff, 0xf6, 0x0, 0x3f, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xaf, 0xff, 0x60, 0x0, 0x8f, 0xff, 0x20, + 0x7, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xff, 0x50, + 0x0, 0x1e, 0xff, 0xc0, 0x0, 0xbf, 0xfd, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, + 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfb, 0x0, 0x8, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfe, + 0x20, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x30, 0x0, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x2, 0xa8, 0x0, 0x0, 0x3f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x4a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x73, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x1c, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x1, 0xcf, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x1c, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x1, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xfc, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x80, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbd, 0xff, 0xf9, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xcf, 0xff, 0xd0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x87, 0xff, 0xff, 0x40, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2f, 0xff, + 0xfc, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x18, + 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x3, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x83, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x56, + 0x76, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x6, 0x77, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x65, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xc0, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xf2, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfd, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x57, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x57, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x47, 0x77, 0x77, 0x77, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, 0x62, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04D "" */ + 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x62, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F051 "" */ + 0x1, 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x57, 0x77, 0x42, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x7f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x1, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x1, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x31, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xf0, 0xaf, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xc5, 0x0, + + /* U+F054 "" */ + 0x0, 0x9, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x55, + 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x19, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, + 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x19, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0xad, 0xef, 0xfe, 0xdb, 0x85, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x76, + 0x8a, 0xef, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x14, 0x53, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xc1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x11, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x6, 0xfc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x23, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x8e, 0xff, + 0xfb, 0x40, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x66, 0x7a, 0xef, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, + 0xdb, 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x16, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xdf, 0xfe, 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf9, 0x0, 0x16, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x76, + 0x79, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x2, 0x32, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xf6, 0x1, 0xff, 0xfe, 0x80, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfa, 0xb, 0xff, 0xff, 0xd2, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe4, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xd0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x10, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xfd, 0x30, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xd9, 0x66, 0x76, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0x9c, 0xde, 0xfe, 0xdc, 0x95, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0x10, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x56, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x75, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x31, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x17, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x84, + 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xe2, 0x0, 0x7a, 0xaa, 0xaa, 0xaa, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0xaa, 0xaf, + 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf9, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xa0, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xfa, 0x0, 0x56, 0x0, + 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xb0, 0x4, + 0xff, 0x50, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfb, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x7a, 0xaa, + 0xaa, 0xaa, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0xaa, 0xaf, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, + 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xa0, + 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x4c, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x90, 0x0, + + /* U+F078 "" */ + 0x0, 0x4c, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x90, 0x0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, + 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, + 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0x7c, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x1f, 0xff, 0xf6, 0xc, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x1, 0xff, 0xff, 0x60, 0x1d, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xa9, 0x10, 0x1f, + 0xff, 0xf6, 0x0, 0x6b, 0x60, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xfc, 0x1, 0xff, 0xff, + 0x60, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfb, 0x1f, 0xff, 0xf6, 0x6f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb8, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x40, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x75, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xcc, 0xcc, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xcc, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x68, 0x88, 0x88, + 0x73, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x10, 0x0, 0x0, 0x1, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xcf, 0xfd, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xf2, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x8f, 0xfa, 0x5d, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa3, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x77, 0x65, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x3, 0x54, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xfb, 0x20, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe3, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf5, + 0xbf, 0xff, 0xf9, 0x35, 0xef, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xef, 0xff, 0xb0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf6, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0xaf, 0xff, 0xfc, 0x68, 0xff, 0xff, 0xf2, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x55, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf9, 0x35, 0xef, 0xff, 0xf2, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xef, 0xff, 0xb0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf6, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xaf, 0xff, 0xfc, 0x68, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf6, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xd7, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xab, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x50, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xfa, + 0x6e, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x44, 0x44, 0x44, 0x43, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xf1, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x17, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x60, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf5, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x50, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xe9, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x89, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x97, + 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C9 "" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + + /* U+F0E0 "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x1, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x7f, 0xff, 0xb1, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xfe, + 0x40, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x5e, + 0xff, 0xff, 0xe5, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x1, 0x8e, 0xe8, 0x10, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x34, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9a, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x66, 0x66, 0x6a, 0xff, 0xff, 0xff, 0xd6, + 0x66, 0x66, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x53, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x53, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xf9, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0x90, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xf9, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1f, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0xb, 0xbb, 0xbb, 0xb7, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x6e, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xab, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x91, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa1, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xe8, 0x88, 0xaf, 0xfc, + 0x88, 0x8c, 0xff, 0xa8, 0x88, 0xdf, 0xf9, 0x88, + 0x9f, 0xfd, 0x88, 0x8a, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x4f, 0xf0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0xff, 0x50, 0x0, + 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0x0, 0xf, + 0xf4, 0x0, 0x4, 0xff, 0x0, 0x0, 0x5f, 0xe0, + 0x0, 0xe, 0xf5, 0x0, 0x0, 0xff, 0xff, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x4f, + 0xf0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0xef, 0x50, + 0x0, 0xf, 0xff, 0xf8, 0xff, 0xff, 0xa0, 0x0, + 0x2f, 0xf6, 0x0, 0x6, 0xff, 0x20, 0x0, 0x8f, + 0xf1, 0x0, 0x1f, 0xf8, 0x0, 0x2, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf5, 0x44, 0x5f, + 0xfb, 0x44, 0x46, 0xff, 0xa4, 0x44, 0x7f, 0xf7, + 0x44, 0x4b, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, 0xe, + 0xf5, 0x0, 0x0, 0xff, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xd, 0xf6, 0x0, 0x0, 0xef, 0x50, 0x0, 0xf, + 0xf0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0x60, 0x0, + 0xe, 0xf5, 0x0, 0x0, 0xff, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf5, + 0x44, 0x5f, 0xfb, 0x44, 0x46, 0xff, 0xa4, 0x44, + 0x7f, 0xf7, 0x44, 0x4b, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf8, 0x0, 0x2, 0xff, 0xff, 0x8f, 0xff, 0xf8, + 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x50, 0x0, 0xf, + 0xff, 0xf8, 0xff, 0xff, 0x80, 0x0, 0xf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xf5, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x50, 0x0, + 0xf, 0xff, 0xf8, 0xff, 0xff, 0xe8, 0x88, 0xaf, + 0xfc, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x9f, 0xfd, 0x88, 0x8a, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x55, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa1, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x0, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xd1, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xd1, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0xf, 0xff, 0xd1, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, + 0xff, 0xd1, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xd1, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xff, 0xff, 0xff, 0xd1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, + 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xba, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x34, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0xad, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xa7, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x87, + 0x66, 0x67, 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xae, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfe, 0x3f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x30, 0x3f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, 0xce, 0xff, + 0xfe, 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x30, 0x0, 0x3b, 0x40, 0x0, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x81, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcb, + 0xab, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, + 0x2, 0x6c, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xdb, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x40, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x7b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc8, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xef, 0xff, 0xd6, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb2, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xdd, + 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xbb, 0xbf, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf4, 0x0, 0xb, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xa0, 0x0, 0x0, 0x9f, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x44, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x91, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfe, 0x60, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfc, 0x30, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x88, 0xbf, 0xff, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x9c, 0xff, 0xff, + 0xf9, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x91, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xc3, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x6, 0xaa, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x7, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xe8, 0x8b, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x77, 0x77, 0x77, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0xef, 0xff, 0xff, 0xfe, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe1, 0xdf, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x0, 0xd, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xe0, 0x9, 0x30, 0x8, 0xff, 0xff, + 0xff, 0x40, 0x1f, 0xff, 0xff, 0xb0, 0x5f, 0xff, + 0xe0, 0xa, 0xf3, 0x0, 0x9f, 0xff, 0xff, 0x70, + 0x3f, 0xff, 0xff, 0x10, 0x5, 0xff, 0xe0, 0xa, + 0xff, 0x20, 0xb, 0xff, 0xff, 0xa0, 0x6f, 0xff, + 0xff, 0xd1, 0x0, 0x5f, 0xe0, 0x9, 0xfa, 0x0, + 0x3f, 0xff, 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfd, + 0x10, 0x4, 0xe0, 0x9, 0xa0, 0x2, 0xef, 0xff, + 0xff, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x30, 0x4, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf0, + 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf0, 0x9f, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x40, 0x5, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x5, + 0xe0, 0x9, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xd0, + 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xf0, 0x9, + 0xfa, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x3f, 0xff, + 0xff, 0x10, 0x6, 0xff, 0xf0, 0xa, 0xfe, 0x10, + 0x8, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xc1, + 0x6f, 0xff, 0xf0, 0xa, 0xe2, 0x0, 0x7f, 0xff, + 0xff, 0x70, 0xc, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xf0, 0x8, 0x20, 0x7, 0xff, 0xff, 0xff, 0x40, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x68, 0x9a, 0xba, + 0x97, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xbb, 0xbb, + 0xbb, 0xbb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x37, 0x77, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x77, 0x77, 0x77, 0x77, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x82, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x22, 0xff, 0xff, 0xd1, + 0x6f, 0xff, 0xfa, 0xa, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xa0, + 0x2f, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x22, 0xff, 0xff, 0xd1, + 0x6f, 0xff, 0xfa, 0xa, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x61, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xb1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xd1, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xd1, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x1, 0xdf, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xd1, 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x1, 0xdf, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, + 0xde, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfd, 0xca, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x76, 0x53, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xc0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, + 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xc, + 0xff, 0xff, 0xc0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, + 0xff, 0xc0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1d, 0xff, 0xe0, + 0x0, 0xef, 0x50, 0x2, 0xff, 0x20, 0x8, 0xff, + 0xff, 0x0, 0x1d, 0xff, 0xfe, 0x0, 0xe, 0xf5, + 0x0, 0x2f, 0xf2, 0x0, 0x8f, 0xff, 0xf0, 0x1d, + 0xff, 0xff, 0xe0, 0x0, 0xef, 0x50, 0x2, 0xff, + 0x20, 0x8, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xfe, + 0x0, 0xe, 0xf5, 0x0, 0x2f, 0xf2, 0x0, 0x8f, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xe0, 0x0, 0xef, + 0x50, 0x2, 0xff, 0x20, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xe, 0xf5, 0x0, 0x2f, + 0xf2, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0xef, 0x50, 0x2, 0xff, 0x20, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x39, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb9, 0x30, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x10, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 155, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 154, .box_w = 6, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 75, .adv_w = 225, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 125, .adv_w = 405, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 438, .adv_w = 358, .box_w = 20, .box_h = 34, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 778, .adv_w = 486, .box_w = 29, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1141, .adv_w = 395, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1453, .adv_w = 121, .box_w = 4, .box_h = 10, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 1473, .adv_w = 194, .box_w = 8, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 1605, .adv_w = 195, .box_w = 8, .box_h = 33, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 1737, .adv_w = 230, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1835, .adv_w = 335, .box_w = 17, .box_h = 16, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 1971, .adv_w = 131, .box_w = 6, .box_h = 10, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2001, .adv_w = 221, .box_w = 10, .box_h = 3, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 2016, .adv_w = 131, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2031, .adv_w = 203, .box_w = 16, .box_h = 34, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 2303, .adv_w = 384, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2578, .adv_w = 213, .box_w = 10, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2703, .adv_w = 331, .box_w = 20, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2953, .adv_w = 329, .box_w = 19, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3191, .adv_w = 385, .box_w = 23, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3479, .adv_w = 331, .box_w = 20, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3729, .adv_w = 355, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3992, .adv_w = 344, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4242, .adv_w = 371, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4505, .adv_w = 355, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4755, .adv_w = 131, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4812, .adv_w = 131, .box_w = 6, .box_h = 24, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4884, .adv_w = 335, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5029, .adv_w = 335, .box_w = 17, .box_h = 11, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 5123, .adv_w = 335, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5268, .adv_w = 330, .box_w = 19, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5506, .adv_w = 596, .box_w = 35, .box_h = 32, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 6066, .adv_w = 422, .box_w = 28, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 6416, .adv_w = 436, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 6704, .adv_w = 416, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7004, .adv_w = 476, .box_w = 26, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7329, .adv_w = 386, .box_w = 20, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7579, .adv_w = 366, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7817, .adv_w = 445, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8117, .adv_w = 468, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8405, .adv_w = 179, .box_w = 5, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8468, .adv_w = 295, .box_w = 16, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8668, .adv_w = 414, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8956, .adv_w = 342, .box_w = 19, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9194, .adv_w = 550, .box_w = 28, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9544, .adv_w = 468, .box_w = 23, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9832, .adv_w = 484, .box_w = 28, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10182, .adv_w = 416, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10457, .adv_w = 484, .box_w = 29, .box_h = 30, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 10892, .adv_w = 419, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11167, .adv_w = 358, .box_w = 20, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11417, .adv_w = 338, .box_w = 21, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11680, .adv_w = 456, .box_w = 22, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11955, .adv_w = 410, .box_w = 27, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 12293, .adv_w = 649, .box_w = 39, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12781, .adv_w = 388, .box_w = 24, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13081, .adv_w = 373, .box_w = 25, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13394, .adv_w = 378, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13669, .adv_w = 192, .box_w = 9, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 13818, .adv_w = 203, .box_w = 16, .box_h = 34, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 14090, .adv_w = 192, .box_w = 9, .box_h = 33, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 14239, .adv_w = 336, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 14367, .adv_w = 288, .box_w = 18, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14394, .adv_w = 346, .box_w = 10, .box_h = 5, .ofs_x = 4, .ofs_y = 22}, + {.bitmap_index = 14419, .adv_w = 344, .box_w = 18, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14590, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 14863, .adv_w = 329, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15044, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15317, .adv_w = 353, .box_w = 20, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15507, .adv_w = 203, .box_w = 14, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15689, .adv_w = 397, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 15962, .adv_w = 392, .box_w = 19, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16209, .adv_w = 161, .box_w = 6, .box_h = 27, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16290, .adv_w = 164, .box_w = 12, .box_h = 34, .ofs_x = -4, .ofs_y = -7}, + {.bitmap_index = 16494, .adv_w = 355, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16754, .adv_w = 161, .box_w = 4, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16806, .adv_w = 609, .box_w = 32, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 17110, .adv_w = 392, .box_w = 19, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 17291, .adv_w = 366, .box_w = 21, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17491, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 17764, .adv_w = 393, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 18037, .adv_w = 236, .box_w = 11, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18142, .adv_w = 289, .box_w = 17, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18304, .adv_w = 238, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18465, .adv_w = 390, .box_w = 19, .box_h = 19, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18646, .adv_w = 322, .box_w = 22, .box_h = 19, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18855, .adv_w = 518, .box_w = 33, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19169, .adv_w = 318, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19359, .adv_w = 322, .box_w = 22, .box_h = 26, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 19645, .adv_w = 300, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19807, .adv_w = 202, .box_w = 10, .box_h = 33, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 19972, .adv_w = 172, .box_w = 4, .box_h = 33, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 20038, .adv_w = 202, .box_w = 11, .box_h = 33, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 20220, .adv_w = 335, .box_w = 17, .box_h = 6, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 20271, .adv_w = 241, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 20349, .adv_w = 181, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 20374, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 21040, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21526, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 22120, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 22606, .adv_w = 396, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 22919, .adv_w = 576, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23567, .adv_w = 576, .box_w = 35, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 24215, .adv_w = 648, .box_w = 41, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24892, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 25558, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26112, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26778, .adv_w = 288, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27039, .adv_w = 432, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27431, .adv_w = 648, .box_w = 41, .box_h = 35, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28149, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28635, .adv_w = 396, .box_w = 25, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 29098, .adv_w = 504, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 29494, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 30086, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30614, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 31142, .adv_w = 504, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 31522, .adv_w = 504, .box_w = 34, .box_h = 33, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 32083, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32393, .adv_w = 360, .box_w = 20, .box_h = 31, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32703, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33231, .adv_w = 504, .box_w = 32, .box_h = 7, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 33343, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33897, .adv_w = 720, .box_w = 47, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 34767, .adv_w = 648, .box_w = 42, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 35544, .adv_w = 576, .box_w = 36, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36138, .adv_w = 504, .box_w = 32, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 36442, .adv_w = 504, .box_w = 32, .box_h = 19, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 36746, .adv_w = 720, .box_w = 45, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37399, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37885, .adv_w = 576, .box_w = 36, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38551, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 39236, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39764, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 40356, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40884, .adv_w = 504, .box_w = 32, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41348, .adv_w = 576, .box_w = 36, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 41834, .adv_w = 360, .box_w = 24, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 42278, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 42870, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 43462, .adv_w = 648, .box_w = 41, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 44016, .adv_w = 576, .box_w = 38, .box_h = 38, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 44738, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 45238, .adv_w = 720, .box_w = 45, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46003, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 46521, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 47039, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 47557, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 48075, .adv_w = 720, .box_w = 45, .box_h = 23, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 48593, .adv_w = 720, .box_w = 46, .box_h = 29, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 49260, .adv_w = 504, .box_w = 28, .box_h = 37, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 49778, .adv_w = 504, .box_w = 32, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 50370, .adv_w = 576, .box_w = 37, .box_h = 37, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 51055, .adv_w = 720, .box_w = 45, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 51663, .adv_w = 432, .box_w = 27, .box_h = 37, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 52163, .adv_w = 579, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 6, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 26, 0, 16, -13, 0, 0, + 0, 0, -32, -35, 4, 27, 13, 10, + -23, 4, 28, 2, 24, 6, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 5, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, -17, 0, 0, 0, 0, + 0, -12, 10, 12, 0, 0, -6, 0, + -4, 6, 0, -6, 0, -6, -3, -12, + 0, 0, 0, 0, -6, 0, 0, -7, + -9, 0, 0, -6, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -6, 0, -9, 0, -16, 0, -70, 0, + 0, -12, 0, 12, 17, 1, 0, -12, + 6, 6, 19, 12, -10, 12, 0, 0, + -33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -16, -7, -28, 0, -23, + -4, 0, 0, 0, 0, 1, 22, 0, + -17, -5, -2, 2, 0, -10, 0, 0, + -4, -43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -46, -5, 22, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, + 0, 6, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 12, 6, 17, -6, 0, 0, 12, -6, + -19, -79, 4, 16, 12, 1, -7, 0, + 21, 0, 18, 0, 18, 0, -54, 0, + -7, 17, 0, 19, -6, 12, 6, 0, + 0, 2, -6, 0, 0, -10, 46, 0, + 46, 0, 17, 0, 24, 7, 10, 17, + 0, 0, 0, -21, 0, 0, 0, 0, + 2, -4, 0, 4, -10, -7, -12, 4, + 0, -6, 0, 0, 0, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -32, 0, -36, 0, 0, 0, + 0, -4, 0, 57, -7, -7, 6, 6, + -5, 0, -7, 6, 0, 0, -31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -56, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -36, 0, 35, 0, 0, -21, 0, + 19, 0, -39, -56, -39, -12, 17, 0, + 0, -39, 0, 7, -13, 0, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 17, -70, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -7, -12, 0, -2, + -2, -6, 0, 0, -4, 0, 0, 0, + -12, 0, -5, 0, -13, -12, 0, -14, + -19, -19, -11, 0, -12, 0, -12, 0, + 0, 0, 0, -5, 0, 0, 6, 0, + 4, -6, 0, 2, 0, 0, 0, 6, + -4, 0, 0, 0, -4, 6, 6, -2, + 0, 0, 0, -11, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 7, -4, 0, + -7, 0, -10, 0, 0, -4, 0, 17, + 0, 0, -6, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -6, -7, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -6, -6, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -4, -7, 0, -9, 0, -17, + -4, -17, 12, 0, 0, -12, 6, 12, + 16, 0, -14, -2, -7, 0, -2, -27, + 6, -4, 4, -31, 6, 0, 0, 2, + -30, 0, -31, -5, -50, -4, 0, -29, + 0, 12, 16, 0, 7, 0, 0, 0, + 0, 1, 0, -10, -7, 0, -17, 0, + 0, 0, -6, 0, 0, 0, -6, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -7, 0, 0, 0, 0, 0, 0, 0, + -6, -6, 0, -4, -7, -5, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, -4, 0, -12, 6, 0, 0, -7, + 3, 6, 6, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -6, 0, -6, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -6, -9, 0, + -11, 0, 17, -4, 2, -18, 0, 0, + 16, -29, -30, -24, -12, 6, 0, -5, + -37, -10, 0, -10, 0, -12, 9, -10, + -37, 0, -16, 0, 0, 3, -2, 5, + -4, 0, 6, 1, -17, -22, 0, -29, + -14, -12, -14, -17, -7, -16, -1, -11, + -16, 3, 0, 2, 0, -6, 0, 0, + 0, 4, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -3, 0, -2, -6, 0, -10, -13, + -13, -2, 0, -17, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 2, + -3, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -11, 0, 0, 0, 0, -29, -17, 0, + 0, 0, -9, -29, 0, 0, -6, 6, + 0, -16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, -10, 0, + 0, 0, 0, 7, 0, 4, -12, -12, + 0, -6, -6, -7, 0, 0, 0, 0, + 0, 0, -17, 0, -6, 0, -9, -6, + 0, -13, -14, -17, -5, 0, -12, 0, + -17, 0, 0, 0, 0, 46, 0, 0, + 3, 0, 0, -7, 0, 6, 0, -25, + 0, 0, 0, 0, 0, -54, -10, 19, + 17, -5, -24, 0, 6, -9, 0, -29, + -3, -7, 6, -40, -6, 7, 0, 9, + -20, -9, -21, -19, -24, 0, 0, -35, + 0, 33, 0, 0, -3, 0, 0, 0, + -3, -3, -6, -16, -19, -1, -54, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -3, -6, -9, 0, 0, + -12, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -12, 0, 0, 12, + -2, 7, 0, -13, 6, -4, -2, -15, + -6, 0, -7, -6, -4, 0, -9, -10, + 0, 0, -5, -2, -4, -10, -7, 0, + 0, -6, 0, 6, -4, 0, -13, 0, + 0, 0, -12, 0, -10, 0, -10, -10, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 6, 0, -8, 0, -4, -7, + -18, -4, -4, -4, -2, -4, -7, -2, + 0, 0, 0, 0, 0, -6, -5, -5, + 0, 0, 0, 0, 7, -4, 0, -4, + 0, 0, 0, -4, -7, -4, -5, -7, + -5, 0, 5, 23, -2, 0, -16, 0, + -4, 12, 0, -6, -24, -7, 9, 1, + 0, -27, -10, 6, -10, 4, 0, -4, + -5, -18, 0, -9, 3, 0, 0, -10, + 0, 0, 0, 6, 6, -12, -11, 0, + -10, -6, -9, -6, -6, 0, -10, 3, + -11, -10, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -7, + 0, 0, -6, -6, 0, 0, 0, 0, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -9, 0, -12, 0, 0, 0, -19, 0, + 4, -13, 12, 1, -4, -27, 0, 0, + -13, -6, 0, -23, -14, -16, 0, 0, + -25, -6, -23, -22, -28, 0, -15, 0, + 5, 39, -7, 0, -13, -6, -2, -6, + -10, -16, -10, -21, -24, -13, -6, 0, + 0, -4, 0, 2, 0, 0, -40, -5, + 17, 13, -13, -21, 0, 2, -18, 0, + -29, -4, -6, 12, -53, -7, 2, 0, + 0, -37, -7, -30, -6, -42, 0, 0, + -40, 0, 34, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -22, -4, 0, -37, + 0, 0, 0, 0, -18, 0, -5, 0, + -2, -16, -27, 0, 0, -3, -9, -17, + -6, 0, -4, 0, 0, 0, 0, -26, + -6, -19, -18, -5, -10, -14, -6, -10, + 0, -12, -5, -19, -9, 0, -7, -11, + -6, -11, 0, 3, 0, -4, -19, 0, + 12, 0, -10, 0, 0, 0, 0, 7, + 0, 4, -12, 24, 0, -6, -6, -7, + 0, 0, 0, 0, 0, 0, -17, 0, + -6, 0, -9, -6, 0, -13, -14, -17, + -5, 0, -12, 5, 23, 0, 0, 0, + 0, 46, 0, 0, 3, 0, 0, -7, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -12, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -6, -6, 0, 0, -12, + -6, 0, 0, -12, 0, 10, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 9, 12, 5, -5, 0, -18, + -9, 0, 17, -19, -18, -12, -12, 23, + 10, 6, -50, -4, 12, -6, 0, -6, + 6, -6, -20, 0, -6, 6, -7, -5, + -17, -5, 0, 0, 17, 12, 0, -16, + 0, -32, -7, 17, -7, -22, 2, -7, + -19, -19, -6, 23, 6, 0, -9, 0, + -16, 0, 5, 19, -13, -21, -23, -14, + 17, 0, 2, -42, -5, 6, -10, -4, + -13, 0, -13, -21, -9, -9, -5, 0, + 0, -13, -12, -6, 0, 17, 13, -6, + -32, 0, -32, -8, 0, -20, -33, -2, + -18, -10, -19, -16, 16, 0, 0, -7, + 0, -12, -5, 0, -6, -10, 0, 10, + -19, 6, 0, 0, -31, 0, -6, -13, + -10, -4, -17, -14, -19, -13, 0, -17, + -6, -13, -11, -17, -6, 0, 0, 2, + 27, -10, 0, -17, -6, 0, -6, -12, + -13, -16, -16, -22, -7, -12, 12, 0, + -9, 0, -29, -7, 3, 12, -18, -21, + -12, -19, 19, -6, 3, -54, -10, 12, + -13, -10, -21, 0, -17, -24, -7, -6, + -5, -6, -12, -17, -2, 0, 0, 17, + 16, -4, -37, 0, -35, -13, 14, -22, + -39, -12, -20, -24, -29, -19, 12, 0, + 0, 0, 0, -7, 0, 0, 6, -7, + 12, 4, -11, 12, 0, 0, -18, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 5, 17, 1, 0, -7, 0, 0, + 0, 0, -4, -4, -7, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 22, 0, 10, 2, 2, -7, + 0, 12, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -35, 0, -6, 10, 0, 17, + 0, 0, 57, 7, -12, -12, 6, 6, + -4, 2, -29, 0, 0, 28, -35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -39, 22, 81, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -11, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -16, 0, + 0, 2, 0, 0, 6, 74, -12, -5, + 18, 16, -16, 6, 0, 0, 6, 6, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -75, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -16, + 0, 0, 0, -16, 0, 0, 0, 0, + -13, -3, 0, 0, 0, -13, 0, -7, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -39, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -6, 0, 0, -11, 0, -9, 0, + -16, 0, 0, 0, -10, 6, -7, 0, + 0, -16, -6, -13, 0, 0, -16, 0, + -6, 0, -27, 0, -6, 0, 0, -47, + -11, -23, -6, -21, 0, 0, -39, 0, + -16, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -9, -10, -5, -10, 0, 0, + 0, 0, -13, 0, -13, 7, -6, 12, + 0, -4, -13, -4, -10, -11, 0, -7, + -3, -4, 4, -16, -2, 0, 0, 0, + -51, -5, -8, 0, -13, 0, -4, -27, + -5, 0, 0, -4, -5, 0, 0, 0, + 0, 4, 0, -4, -10, -4, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, + 0, -13, 0, -4, 0, 0, 0, -12, + 6, 0, 0, 0, -16, -6, -12, 0, + 0, -16, 0, -6, 0, -27, 0, 0, + 0, 0, -56, 0, -12, -21, -29, 0, + 0, -39, 0, -4, -9, 0, 0, 0, + 0, 0, 0, 0, 0, -6, -9, -3, + -9, 2, 0, 0, 10, -7, 0, 18, + 28, -6, -6, -17, 7, 28, 10, 13, + -16, 7, 24, 7, 17, 13, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 27, -10, -6, 0, -5, + 46, 25, 46, 0, 0, 0, 6, 0, + 0, 21, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 0, 0, 0, -48, -7, -5, -24, + -28, 0, 0, -39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, -48, -7, -5, + -24, -28, 0, 0, -23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -13, 6, 0, -6, + 5, 10, 6, -17, 0, -1, -5, 6, + 0, 5, 0, 0, 0, 0, -14, 0, + -5, -4, -12, 0, -5, -23, 0, 36, + -6, 0, -13, -4, 0, -4, -10, 0, + -6, -16, -12, -7, 0, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, -48, + -7, -5, -24, -28, 0, 0, -39, 0, + 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, -18, -7, -5, 17, -5, -6, + -23, 2, -3, 2, -4, -16, 1, 13, + 1, 5, 2, 5, -14, -23, -7, 0, + -22, -11, -16, -24, -22, 0, -9, -12, + -7, -7, -5, -4, -7, -4, 0, -4, + -2, 9, 0, 9, -4, 0, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -6, -6, 0, 0, + -16, 0, -3, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -35, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -7, + 0, 0, 0, 0, -5, 0, 0, -10, + -6, 6, 0, -10, -11, -4, 0, -17, + -4, -13, -4, -7, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -39, 0, 18, 0, 0, -10, 0, + 0, 0, 0, -7, 0, -6, 0, 0, + -3, 0, 0, -4, 0, -13, 0, 0, + 24, -7, -19, -18, 4, 6, 6, -1, + -16, 4, 9, 4, 17, 4, 19, -4, + -16, 0, 0, -23, 0, 0, -17, -16, + 0, 0, -12, 0, -7, -10, 0, -9, + 0, -9, 0, -4, 9, 0, -5, -17, + -6, 21, 0, 0, -5, 0, -12, 0, + 0, 7, -13, 0, 6, -6, 5, 1, + 0, -19, 0, -4, -2, 0, -6, 6, + -5, 0, 0, 0, -24, -7, -13, 0, + -17, 0, 0, -27, 0, 21, -6, 0, + -10, 0, 3, 0, -6, 0, -6, -17, + 0, -6, 6, 0, 0, 0, 0, -4, + 0, 0, 6, -7, 2, 0, 0, -7, + -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -36, 0, 13, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -6, -6, 0, 0, 0, 12, 0, 13, + 0, 0, 0, 0, 0, -36, -33, 2, + 25, 17, 10, -23, 4, 24, 0, 21, + 0, 12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_36 = { +#else +lv_font_t lv_font_montserrat_36 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 40, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_36*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_38.c b/inc/lvgl/src/font/lv_font_montserrat_38.c new file mode 100644 index 0000000..992b5c6 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_38.c @@ -0,0 +1,8400 @@ +/******************************************************************************* + * Size: 38 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 38 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_38.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_38 + #define LV_FONT_MONTSERRAT_38 1 +#endif + +#if LV_FONT_MONTSERRAT_38 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, + 0xf2, 0xe, 0xff, 0xf1, 0xd, 0xff, 0xf1, 0xd, + 0xff, 0xf0, 0xc, 0xff, 0xf0, 0xc, 0xff, 0xf0, + 0xb, 0xff, 0xe0, 0xa, 0xff, 0xe0, 0xa, 0xff, + 0xd0, 0x9, 0xff, 0xc0, 0x9, 0xff, 0xc0, 0x8, + 0xff, 0xb0, 0x7, 0xff, 0xa0, 0x7, 0xff, 0xa0, + 0x6, 0xff, 0x90, 0x5, 0xee, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xab, 0x50, 0x1f, 0xff, 0xf3, 0x5f, 0xff, 0xf8, + 0x2f, 0xff, 0xf5, 0x6, 0xee, 0x80, + + /* U+0022 "\"" */ + 0x9f, 0xf9, 0x0, 0xb, 0xff, 0x79, 0xff, 0x80, + 0x0, 0xbf, 0xf6, 0x8f, 0xf8, 0x0, 0xa, 0xff, + 0x68, 0xff, 0x70, 0x0, 0xaf, 0xf6, 0x8f, 0xf7, + 0x0, 0xa, 0xff, 0x57, 0xff, 0x70, 0x0, 0x9f, + 0xf5, 0x7f, 0xf6, 0x0, 0x9, 0xff, 0x47, 0xff, + 0x60, 0x0, 0x9f, 0xf4, 0x6f, 0xf5, 0x0, 0x8, + 0xff, 0x36, 0xff, 0x50, 0x0, 0x8f, 0xf3, 0x1, + 0x10, 0x0, 0x0, 0x11, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x5, 0xff, 0x50, 0x0, 0x0, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x10, 0x0, + 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xef, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfd, 0x0, + 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x8, 0xbb, 0xbb, 0xdf, + 0xfc, 0xbb, 0xbb, 0xbb, 0xef, 0xfb, 0xbb, 0xbb, + 0x70, 0x0, 0x0, 0x8, 0xff, 0x20, 0x0, 0x0, + 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf0, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0x0, 0xe, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, 0x0, + 0xbb, 0xbb, 0xbd, 0xff, 0xcb, 0xbb, 0xbb, 0xbd, + 0xff, 0xcb, 0xbb, 0xb5, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0xef, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xa0, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, + 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x20, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xfe, 0xc9, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x9f, 0xff, 0xfb, 0x66, 0xff, 0x65, 0x8b, + 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0x40, 0x3, + 0xff, 0x30, 0x0, 0x18, 0xe0, 0x0, 0x8, 0xff, + 0xf5, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf0, 0x0, 0x3, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, + 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf4, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x30, 0x3, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xfb, 0x54, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x57, 0xdf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x4, 0xef, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0x30, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0xc, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0xc, 0xff, 0xf0, 0x4, 0x90, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x1f, 0xff, 0xc0, 0xc, 0xfd, + 0x60, 0x0, 0x3, 0xff, 0x30, 0x1, 0xcf, 0xff, + 0x70, 0x3f, 0xff, 0xfe, 0xa6, 0x45, 0xff, 0x55, + 0x9f, 0xff, 0xfd, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x15, 0xac, 0xef, 0xff, + 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x88, 0x10, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x2, 0xae, 0xfe, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, + 0xc4, 0x24, 0xaf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfc, 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, + 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0xcf, + 0xf2, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x0, 0x0, + 0x1, 0xff, 0x60, 0x0, 0x0, 0x8, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0, 0x0, + 0xdf, 0x90, 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0xbf, + 0xb0, 0x0, 0x0, 0xdf, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xb0, + 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf5, 0x0, 0x0, 0x2, 0xff, 0x60, 0x1, 0xef, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0x10, 0xb, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc5, + 0x24, 0xbf, 0xf7, 0x0, 0x6f, 0xf8, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x90, 0x2, 0xff, 0xc0, 0x0, 0x6d, 0xff, + 0xfc, 0x50, 0x0, 0x0, 0x3, 0xae, 0xfe, 0xb4, + 0x0, 0xc, 0xff, 0x20, 0xa, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf6, 0x0, 0x8f, 0xf9, 0x20, 0x2b, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xb0, 0x1, 0xff, 0x90, 0x0, 0x0, 0xcf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0x10, + 0x6, 0xff, 0x10, 0x0, 0x0, 0x4f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf5, 0x0, 0x9, + 0xfd, 0x0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0xb, 0xfb, + 0x0, 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xfe, 0x0, 0x0, 0xa, 0xfb, 0x0, + 0x0, 0x0, 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf3, 0x0, 0x0, 0x9, 0xfd, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x80, 0x0, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0xbf, + 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf7, 0x0, 0x1a, 0xff, 0x40, + 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xef, 0xea, 0x30, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0xba, 0xcf, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf7, 0x0, + 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x4f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x83, 0xcf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfd, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0xef, 0xb1, 0x0, 0x1e, 0xff, 0xe3, 0x0, + 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x3f, 0xfe, 0x0, + 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xc1, 0x8, 0xff, 0xa0, 0x0, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd2, 0xff, 0xf5, + 0x0, 0x3f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0x0, 0x4, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x50, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, 0xc6, 0x20, + 0x1, 0x37, 0xef, 0xff, 0xef, 0xff, 0xf4, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x4f, 0xff, 0xf3, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x3f, 0xfc, + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x84, + 0x0, 0x0, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x9f, 0xf9, 0x9f, 0xf8, 0x8f, 0xf8, 0x8f, 0xf7, + 0x8f, 0xf7, 0x7f, 0xf7, 0x7f, 0xf6, 0x7f, 0xf6, + 0x6f, 0xf5, 0x6f, 0xf5, 0x1, 0x10, + + /* U+0028 "(" */ + 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, 0xb, 0xff, + 0xc0, 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0xbf, + 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x7, + 0xff, 0xf1, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x5, 0xff, 0xf3, 0x0, + 0x0, 0x9f, 0xff, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xff, + 0x70, 0x0, 0x3, 0xff, 0xf6, 0x0, 0x0, 0x4f, + 0xff, 0x40, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, + 0x5f, 0xff, 0x30, 0x0, 0x6, 0xff, 0xf3, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x3, 0xff, + 0xf6, 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0xff, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, + 0x0, 0x9f, 0xff, 0x0, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0x0, 0xcf, + 0xfb, 0x0, 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x0, 0xbf, 0xfd, 0x0, + 0x0, 0x3, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xff, + 0xc0, 0x0, 0x0, 0x2f, 0xff, 0x50, + + /* U+0029 ")" */ + 0x8f, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xa0, 0x0, + 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x2f, 0xff, 0x60, 0x0, 0x0, 0xff, + 0xf9, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0xaf, 0xfe, 0x0, 0x0, 0x8, 0xff, 0xf0, 0x0, + 0x0, 0x7f, 0xff, 0x10, 0x0, 0x6, 0xff, 0xf2, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x5, 0xff, + 0xf3, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0x10, 0x0, + 0x8, 0xff, 0xf0, 0x0, 0x0, 0xaf, 0xfe, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf9, + 0x0, 0x0, 0x2f, 0xff, 0x60, 0x0, 0x5, 0xff, + 0xf2, 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0xe, + 0xff, 0xa0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, + 0x7, 0xff, 0xf1, 0x0, 0x0, 0xef, 0xf8, 0x0, + 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xfb, 0x0, 0x0, 0x0, 0x2, + 0x40, 0x0, 0x8f, 0xb0, 0x0, 0x24, 0x0, 0xbf, + 0xa2, 0x8, 0xfb, 0x1, 0x9f, 0xe0, 0x1e, 0xff, + 0xf8, 0x8f, 0xb6, 0xef, 0xff, 0x30, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x1, 0x8f, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x1, 0xef, 0xfe, 0x78, 0xfb, + 0x5d, 0xff, 0xf3, 0xa, 0xf9, 0x10, 0x8f, 0xb0, + 0x7, 0xfd, 0x0, 0x12, 0x0, 0x8, 0xfb, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfa, 0x0, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x3, 0x66, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0x0, + + /* U+002C "," */ + 0x0, 0x35, 0x20, 0x9, 0xff, 0xf4, 0x1f, 0xff, + 0xfb, 0x1f, 0xff, 0xfc, 0xb, 0xff, 0xf9, 0x0, + 0xcf, 0xf4, 0x0, 0xdf, 0xe0, 0x1, 0xff, 0x90, + 0x5, 0xff, 0x40, 0x9, 0xfe, 0x0, 0xd, 0xf9, + 0x0, + + /* U+002D "-" */ + 0x11, 0x11, 0x11, 0x11, 0x11, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+002E "." */ + 0x0, 0x0, 0x0, 0x5, 0xef, 0xc1, 0x1f, 0xff, + 0xfa, 0x3f, 0xff, 0xfc, 0xe, 0xff, 0xf9, 0x3, + 0xdf, 0xa0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x2, 0x8c, 0xef, 0xfd, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xb7, + 0x56, 0x9e, 0xff, 0xff, 0x70, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x30, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0xa, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf3, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x51, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x72, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf7, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, + 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x30, 0xaf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x7f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xd0, 0x0, 0x0, 0xdf, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xfb, 0x75, 0x69, 0xef, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x50, + 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x44, 0x44, 0x4c, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, + 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, + 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, 0x0, + 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf1, + + /* U+0032 "2" */ + 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xd9, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, + 0xdf, 0xff, 0xfe, 0x97, 0x55, 0x7a, 0xff, 0xff, + 0xf5, 0x0, 0x1b, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xd0, 0x0, 0x9, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf7, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x20, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, + + /* U+0033 "3" */ + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xbb, 0xdf, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xe0, 0x6, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfa, 0x1, 0xef, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x30, 0x9f, + 0xff, 0xff, 0xc8, 0x75, 0x56, 0xae, 0xff, 0xff, + 0x90, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x2, 0x6a, 0xde, 0xff, 0xec, 0x95, 0x0, 0x0, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x5, + 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xa, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xe0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x13, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x3d, 0xff, 0xe3, 0x33, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x6f, 0xff, 0x54, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xc9, + 0x61, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x1, 0x44, 0x44, 0x44, 0x45, 0x79, 0xdf, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf5, 0x1, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x10, 0x9f, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xa0, 0x2f, + 0xff, 0xff, 0xea, 0x76, 0x56, 0x8c, 0xff, 0xff, + 0xe1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xbd, 0xef, 0xfd, 0xb7, 0x20, 0x0, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xfd, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0xa6, 0x43, + 0x45, 0x8d, 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x3f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x5a, 0xdf, 0xfe, 0xc8, 0x30, 0x0, + 0x0, 0x1f, 0xff, 0xb0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x2f, 0xff, 0xa8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x2f, + 0xff, 0xef, 0xff, 0xb5, 0x10, 0x3, 0x7e, 0xff, + 0xfe, 0x10, 0x1f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xa0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, + 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf4, 0xb, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf6, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, 0xb5, 0x21, + 0x13, 0x7e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xef, 0xfe, 0xb7, 0x10, 0x0, 0x0, + + /* U+0037 "7" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, + 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x6f, + 0xff, 0xc0, 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0xd, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0xdf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x60, 0xc, 0xee, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x48, 0xcd, 0xff, 0xed, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x62, 0x10, 0x14, + 0x9f, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x50, 0x3, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xa0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xd0, 0x4, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, + 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0xbf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0x20, 0x0, 0x2e, + 0xff, 0xfc, 0x52, 0x0, 0x13, 0x8f, 0xff, 0xf7, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xed, 0xef, 0xff, 0xff, + 0xe5, 0x0, 0x1, 0xdf, 0xff, 0xe7, 0x20, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0x50, 0x9, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf7, 0x3f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x4f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0xf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, 0xa, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x1, 0xef, 0xff, 0xfa, 0x52, 0x10, + 0x13, 0x7d, 0xff, 0xff, 0x70, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0x0, 0x1, 0x59, 0xcd, + 0xff, 0xed, 0xb7, 0x20, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, 0xa5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x8f, 0xff, 0xfa, 0x41, 0x1, 0x37, 0xdf, 0xff, + 0xc0, 0x0, 0x3f, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x80, 0x9, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0xdf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf8, 0xe, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xe0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x2b, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf5, 0x5f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x70, 0xcf, 0xff, 0xf9, 0x41, + 0x0, 0x27, 0xdf, 0xff, 0xff, 0xf8, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, + 0x90, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x13, 0xff, 0xf9, 0x0, 0x0, 0x27, 0xbe, 0xff, + 0xec, 0x83, 0x0, 0x4f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xb0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xff, 0xe1, 0x0, 0x0, + 0x9f, 0xc7, 0x43, 0x45, 0x8d, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x59, 0xce, 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, + 0x0, + + /* U+003A ":" */ + 0x3, 0xdf, 0xa0, 0xe, 0xff, 0xf9, 0x3f, 0xff, + 0xfc, 0x1f, 0xff, 0xf9, 0x5, 0xef, 0xc1, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xc1, + 0x1f, 0xff, 0xfa, 0x3f, 0xff, 0xfc, 0xe, 0xff, + 0xf9, 0x3, 0xdf, 0xa0, + + /* U+003B ";" */ + 0x3, 0xdf, 0xa0, 0xe, 0xff, 0xf9, 0x3f, 0xff, + 0xfc, 0x1f, 0xff, 0xf9, 0x5, 0xef, 0xc1, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xa1, + 0xe, 0xff, 0xf9, 0x2f, 0xff, 0xfc, 0xe, 0xff, + 0xfb, 0x4, 0xef, 0xf6, 0x0, 0xbf, 0xf1, 0x0, + 0xff, 0xc0, 0x3, 0xff, 0x60, 0x8, 0xff, 0x10, + 0xc, 0xfb, 0x0, 0x6, 0x63, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9e, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, 0x39, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, + 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9f, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003D "=" */ + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, + + /* U+003E ">" */ + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, + 0xfd, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xcf, 0xff, 0xff, 0xd7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x39, 0xef, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2d, 0xff, + 0xff, 0xb7, 0x43, 0x34, 0x8e, 0xff, 0xff, 0x60, + 0x3e, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xd0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xaa, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfc, + 0x20, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, + 0xee, 0xff, 0xed, 0xa8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xec, 0x98, 0x78, 0x8a, + 0xdf, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xe8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xbf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x49, 0xcd, + 0xdb, 0x83, 0x0, 0x1e, 0xee, 0x22, 0xef, 0xf5, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x3, + 0xcf, 0xff, 0xff, 0xff, 0xfb, 0x22, 0xff, 0xf3, + 0x2, 0xff, 0xe1, 0x0, 0x0, 0x3f, 0xfe, 0x10, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x4f, 0xff, 0x30, 0x5, 0xff, 0x90, 0x0, 0xb, + 0xff, 0x50, 0x0, 0x4, 0xff, 0xff, 0xa4, 0x10, + 0x25, 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xb, 0xff, + 0x20, 0x1, 0xff, 0xd0, 0x0, 0x0, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, + 0x0, 0x3f, 0xf8, 0x0, 0x7f, 0xf6, 0x0, 0x0, + 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf3, 0x0, 0x0, 0xdf, 0xd0, 0xb, 0xff, + 0x10, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x8, 0xff, + 0x10, 0xef, 0xe0, 0x0, 0x1, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0x0, + 0x0, 0x5f, 0xf4, 0xf, 0xfb, 0x0, 0x0, 0x4f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x30, 0x0, 0x3, 0xff, 0x51, 0xff, 0xa0, + 0x0, 0x5, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, 0x2f, 0xf6, + 0x2f, 0xf9, 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x2, 0xff, 0x71, 0xff, 0xa0, 0x0, 0x4, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x2f, 0xf6, 0xf, 0xfb, 0x0, + 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x30, 0x0, 0x4, 0xff, 0x40, + 0xef, 0xe0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, + 0x7f, 0xf2, 0xb, 0xff, 0x20, 0x0, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x30, 0x0, 0xb, 0xfe, 0x0, 0x7f, 0xf7, 0x0, + 0x0, 0x1e, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf5, 0x0, 0x2, 0xff, 0x90, 0x1, + 0xff, 0xd0, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x20, + 0x0, 0x29, 0xff, 0xed, 0xff, 0xd1, 0x2, 0xdf, + 0xf2, 0x0, 0xa, 0xff, 0x50, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xf3, 0x7f, 0xff, + 0xfd, 0xff, 0xf8, 0x0, 0x0, 0x3f, 0xfe, 0x10, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xff, + 0xda, 0x40, 0x0, 0x0, 0x8d, 0xfe, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xe8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xec, 0x98, 0x88, 0x9b, 0xef, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, + 0xef, 0xff, 0xec, 0x96, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x7b, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, + 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x10, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x90, 0x0, 0xd, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, + 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xd0, 0x0, 0x0, 0x7, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x0, 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, + 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf3, 0x0, 0xd, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xb0, 0x5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x20, 0xcf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfa, + + /* U+0042 "B" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x1, 0x26, 0xcf, 0xff, 0xf9, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x10, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x60, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x20, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x25, + 0xbf, 0xff, 0xe2, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x5b, 0xff, 0xff, 0x70, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf8, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfa, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x5a, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xca, 0x61, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xfd, 0x97, 0x55, 0x79, + 0xef, 0xff, 0xff, 0x60, 0x0, 0x1, 0xdf, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0x80, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf7, 0x0, 0x0, 0x7f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf7, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0x80, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xfd, 0x96, 0x55, 0x79, 0xef, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6a, 0xde, 0xff, 0xec, 0x95, 0x0, + 0x0, 0x0, + + /* U+0044 "D" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, 0x44, 0x57, + 0xbf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xf3, + 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x60, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfc, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x50, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x80, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf8, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, + 0x0, 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x45, + 0x7b, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xff, 0xfd, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x30, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xf, 0xff, 0xd2, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, + + /* U+0046 "F" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, + 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, + 0xd3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xce, 0xff, + 0xed, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xfe, 0x97, 0x55, 0x78, + 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x1, 0xdf, 0xff, + 0xfb, 0x40, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdb, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x20, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf1, 0xe, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf1, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf1, 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf1, 0x0, 0xb, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf1, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xf1, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xfe, 0x97, 0x55, 0x68, 0xbf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6a, 0xce, 0xff, 0xec, 0x96, 0x10, + 0x0, 0x0, + + /* U+0048 "H" */ + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + + /* U+0049 "I" */ + 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, + 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, + 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, + 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, + 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, + 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, + 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, 0xfc, 0xf, + 0xff, 0xc0, 0xff, 0xfc, 0xf, 0xff, 0xc0, 0xff, + 0xfc, + + /* U+004A "J" */ + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf9, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0xaf, 0xf9, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x1e, 0xff, 0xfe, 0x85, 0x35, + 0xaf, 0xff, 0xf9, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x3, 0x8c, + 0xef, 0xed, 0x93, 0x0, 0x0, + + /* U+004B "K" */ + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe2, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe2, + 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe3, 0x0, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x4f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x3f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x3f, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xef, 0xff, 0xfb, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, + 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xa, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf3, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe1, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc0, + + /* U+004C "L" */ + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, + + /* U+004D "M" */ + 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0xf, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, 0xff, 0xf4, + 0xf, 0xff, 0xa8, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xb6, 0xff, 0xf4, 0xf, + 0xff, 0xa0, 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x26, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf8, 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd0, 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x2, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, + 0x6, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x7f, + 0xff, 0x40, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x6, + 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0xd, 0xff, + 0xd0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x5, 0xff, + 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x4, 0xff, 0xf8, + 0x0, 0x2f, 0xff, 0x70, 0x0, 0x5, 0xff, 0xf4, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0x20, + 0xbf, 0xfd, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xb5, 0xff, + 0xf4, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xcd, 0x30, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf4, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + + /* U+004E "N" */ + 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc7, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0xc, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x1, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, 0x60, + 0x0, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0xb, 0xff, 0xfe, + 0x10, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfa, 0x0, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf5, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfd, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, + 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xfd, 0x96, 0x55, 0x69, 0xdf, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, + 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, + 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x40, 0xb, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0xe, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xd0, 0x1f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x2f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf0, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x5, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0xef, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfd, + 0x96, 0x55, 0x69, 0xdf, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, 0xec, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, + 0x45, 0x7a, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xf4, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf4, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf6, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf1, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xd4, 0x44, 0x44, 0x44, 0x57, + 0xaf, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xdb, 0x83, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xce, 0xff, + 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xd9, 0x65, 0x56, 0x9e, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x40, 0x0, 0xaf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0xe, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xd0, 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf0, 0x2, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x10, 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, + 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, + 0x6f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x1, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xfc, 0x75, 0x33, 0x57, 0xcf, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xce, 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x1, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x61, 0x0, 0x38, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7c, 0xef, 0xec, 0x82, 0x0, + 0x0, + + /* U+0052 "R" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xff, 0xfd, 0x44, 0x44, 0x44, + 0x45, 0x7a, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xf4, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf4, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf6, 0xf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf2, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xd2, 0x22, 0x22, 0x22, 0x35, + 0x9e, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe1, + 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xb0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0x0, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0x20, 0xf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xed, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x74, 0x33, 0x45, + 0x9d, 0xff, 0xf6, 0x0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xe0, 0x0, 0x8, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xc8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x9d, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xbf, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x5, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0xd, + 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0x60, 0x4f, 0xff, 0xff, 0xd9, 0x54, 0x33, + 0x46, 0xbf, 0xff, 0xfc, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, + 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x23, 0x44, 0x44, 0x44, 0x44, 0xcf, + 0xff, 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf4, 0x2f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, + 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0xf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x10, 0x0, 0x7f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xea, 0x75, 0x57, 0xae, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x9c, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, 0x5f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, + 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x20, 0x0, 0x0, 0xc, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf9, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x9, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf5, 0x1, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xc0, 0x8f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x4e, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0057 "W" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x64, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf1, 0xe, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0x60, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0xe, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x2f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x50, 0x0, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xa0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x6, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, 0x3, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, + 0x4, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xfe, 0x0, + 0x0, 0xf, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xaf, 0xfe, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0x5, 0xff, 0xf3, + 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x1, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x1f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf1, 0x6, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf5, 0x1, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x60, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, + 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x1f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfe, 0x10, 0x0, 0xcf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf4, 0x0, 0x0, 0x1e, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe1, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x1, 0xef, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x8c, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xaf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x5, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, + 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, + 0x6, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfe, 0x10, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xb0, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf6, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xc0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, + 0x1e, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xc0, 0x0, 0x0, 0xef, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x10, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xa0, 0xdf, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x61, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xef, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x54, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0xf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xf0, + + /* U+005C "\\" */ + 0x4f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x30, + + /* U+005D "]" */ + 0x4f, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, + 0xfa, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xfa, + 0x4f, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, + 0xfa, 0x4f, 0xff, 0xff, 0xff, 0xa0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x4, 0x88, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xa7, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x31, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xf6, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xe0, 0x0, 0xc, 0xff, 0x10, + 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x5, 0xff, + 0x70, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, + 0xef, 0xe0, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x0, 0xaf, 0xf4, 0x0, + 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x1, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x8, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0xe, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, + + /* U+005F "_" */ + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0060 "`" */ + 0x1c, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xfa, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xfb, 0x0, + + /* U+0061 "a" */ + 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, 0xd8, + 0x42, 0x12, 0x5b, 0xff, 0xff, 0x50, 0x0, 0x6c, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x3, 0x67, + 0x89, 0x99, 0x99, 0xaf, 0xff, 0x60, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x6f, 0xff, 0xe6, 0x20, 0x0, 0x0, 0x3, + 0xff, 0xf6, 0xd, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x60, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf6, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x60, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, + 0x9, 0xff, 0xf9, 0x10, 0x0, 0x1, 0x8f, 0xff, + 0xff, 0x60, 0x1d, 0xff, 0xff, 0xb9, 0x9b, 0xff, + 0xfc, 0xff, 0xf6, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x1f, 0xff, 0x60, 0x0, 0x4, 0xad, + 0xff, 0xec, 0x93, 0x0, 0xff, 0xf6, + + /* U+0062 "b" */ + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x4, 0x9d, 0xef, 0xec, 0x72, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x13, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x8f, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x84, 0x23, 0x5a, + 0xff, 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfc, 0x0, 0x8f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x50, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x8f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf4, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xb0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x50, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfc, 0x0, + 0x8f, 0xff, 0xff, 0xfe, 0x84, 0x23, 0x5a, 0xff, + 0xff, 0xe2, 0x0, 0x8f, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x8f, 0xff, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x4, 0x9d, 0xff, 0xec, + 0x82, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x16, 0xbd, 0xff, 0xec, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, + 0xff, 0xff, 0xa5, 0x32, 0x48, 0xef, 0xff, 0xd0, + 0x0, 0xcf, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xc2, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, 0xcf, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xc2, + 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x32, 0x48, 0xef, + 0xff, 0xc0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xbe, 0xff, 0xec, 0x82, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xd9, 0x40, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x23, 0xff, 0xf7, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, + 0xf7, 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf7, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x2f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x1f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, 0xd, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf7, 0x0, 0xdf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, + 0x0, 0x3f, 0xff, 0xfd, 0x61, 0x0, 0x16, 0xcf, + 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xf7, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, + 0x50, 0x0, 0xff, 0xf7, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x28, 0xce, 0xff, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xc5, 0x20, 0x14, 0x9f, 0xff, + 0xf7, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xf3, 0x0, 0x6f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0xd, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x11, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf6, 0x4f, 0xff, 0xb9, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x9f, 0xff, 0x86, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x94, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0xd, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x2c, 0xf4, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xa6, 0x32, 0x35, 0xaf, + 0xff, 0xf2, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xd9, 0x40, + 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0xc7, 0x10, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x7, 0xff, 0xfb, 0x30, 0x4, 0x90, 0x0, 0x0, + 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xda, 0x50, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0xbf, 0xfb, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, + 0xfb, 0x0, 0x5f, 0xff, 0xff, 0x95, 0x32, 0x37, + 0xcf, 0xff, 0xff, 0xfb, 0x1, 0xef, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x9, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfb, 0xe, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfb, 0x3f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + 0x5f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfb, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x5f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfb, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfb, 0xe, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x8, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfb, 0x1, 0xef, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, + 0xff, 0xa5, 0x32, 0x47, 0xdf, 0xff, 0xff, 0xfb, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xef, 0xfb, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x50, 0xef, 0xfa, 0x0, 0x0, + 0x0, 0x38, 0xce, 0xff, 0xda, 0x50, 0x0, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf0, 0x0, 0x4f, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0x80, 0x1, 0xef, 0xff, + 0xea, 0x64, 0x22, 0x36, 0xaf, 0xff, 0xfd, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x1, 0x69, 0xce, 0xff, 0xed, 0xa7, 0x10, 0x0, + 0x0, + + /* U+0068 "h" */ + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x5, 0xad, 0xef, 0xeb, 0x71, + 0x0, 0x0, 0x8f, 0xff, 0x14, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x8f, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0xfc, 0x74, 0x34, 0x8e, 0xff, 0xff, 0x50, + 0x8f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xd0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf2, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x8f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + + /* U+0069 "i" */ + 0x0, 0x57, 0x20, 0xa, 0xff, 0xf4, 0x1f, 0xff, + 0xfa, 0x1f, 0xff, 0xf9, 0x6, 0xff, 0xd1, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x8, 0xff, + 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, + 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, + 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, + 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, + 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, + 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, + 0xf1, 0x8, 0xff, 0xf1, 0x8, 0xff, 0xf1, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x47, 0x40, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x7, 0x83, 0x12, 0xaf, 0xff, 0xb0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x5, 0xbe, 0xff, 0xd9, 0x20, 0x0, + + /* U+006B "k" */ + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd1, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd1, + 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xd1, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x1, 0xcf, 0xff, 0xc1, 0x0, 0x0, + 0x8, 0xff, 0xf1, 0x0, 0x1, 0xdf, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x2, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, + 0x3, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x14, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x62, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x50, 0x4, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x8, 0xff, 0xff, 0x40, + 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x8f, + 0xff, 0x40, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x10, + 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf2, 0x8, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd1, + + /* U+006C "l" */ + 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, + 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, + 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, + 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, + 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, + 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, + 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, 0x8f, + 0xff, 0x18, 0xff, 0xf1, 0x8f, 0xff, 0x18, 0xff, + 0xf1, 0x8f, 0xff, 0x18, 0xff, 0xf1, + + /* U+006D "m" */ + 0x8f, 0xff, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x40, + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xed, 0x93, 0x0, + 0x0, 0x8f, 0xff, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x8f, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x8f, 0xff, 0xff, 0xf8, 0x31, + 0x2, 0x7e, 0xff, 0xfd, 0xef, 0xff, 0x83, 0x11, + 0x38, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x8f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x8f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x8f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, + + /* U+006E "n" */ + 0x8f, 0xff, 0x0, 0x6, 0xad, 0xff, 0xeb, 0x71, + 0x0, 0x0, 0x8f, 0xff, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x8f, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x41, 0x1, 0x5c, 0xff, 0xff, 0x50, + 0x8f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xd0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf2, 0x8f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf6, 0x8f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x33, 0x49, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0xdf, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, 0x10, 0x6, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x80, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x1f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf6, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf3, 0xd, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xe0, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x80, 0x0, 0xcf, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xa5, 0x33, 0x49, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, + 0x82, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0x8f, 0xff, 0x0, 0x5, 0xad, 0xff, 0xec, 0x72, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x8f, 0xff, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x27, + 0xef, 0xff, 0xe2, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfc, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf4, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf4, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf3, 0x8f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xb0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x50, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xfc, 0x0, + 0x8f, 0xff, 0xff, 0xfe, 0x94, 0x23, 0x5b, 0xff, + 0xff, 0xe2, 0x0, 0x8f, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x8f, 0xff, + 0x12, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x4, 0x9d, 0xff, 0xec, + 0x82, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x28, 0xce, 0xfe, 0xd9, 0x40, + 0x0, 0xff, 0xf7, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0xff, 0xf7, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xf7, 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf7, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x2f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x6f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0xd, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf7, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0xdf, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf7, + 0x0, 0x3f, 0xff, 0xff, 0xa5, 0x33, 0x49, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0xff, 0xf7, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x23, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x38, 0xce, 0xfe, 0xd9, + 0x30, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf7, + + /* U+0072 "r" */ + 0x8f, 0xff, 0x0, 0x5, 0xad, 0xe4, 0x8f, 0xff, + 0x3, 0xdf, 0xff, 0xf4, 0x8f, 0xff, 0x4f, 0xff, + 0xff, 0xf4, 0x8f, 0xff, 0xef, 0xff, 0xb8, 0x72, + 0x8f, 0xff, 0xff, 0x91, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x3, 0x9c, 0xef, 0xfe, 0xc9, 0x51, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0xdf, 0xff, 0xc5, 0x21, + 0x12, 0x59, 0xef, 0x50, 0x3, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x0, 0x6, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfe, 0xb7, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x50, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x3, 0x69, + 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, + 0xd8, 0x10, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + 0x7, 0xff, 0xfb, 0x74, 0x21, 0x24, 0x8f, 0xff, + 0xf5, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, + 0xed, 0xa6, 0x10, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfd, 0x41, 0x15, 0xb0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x18, + 0xcf, 0xfe, 0xb5, 0x0, + + /* U+0075 "u" */ + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, + 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf3, 0x8f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x5f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0xe, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf3, + 0x7, 0xff, 0xff, 0x93, 0x0, 0x14, 0xbf, 0xff, + 0xff, 0xf3, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xf3, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x33, 0xff, 0xf3, 0x0, 0x0, + 0x17, 0xbe, 0xff, 0xda, 0x50, 0x3, 0xff, 0xf3, + + /* U+0076 "v" */ + 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x6f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x8, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x1f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x40, 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x60, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfd, 0x0, 0x0, 0x7, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, + 0x0, 0x0, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x5f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf8, 0x3, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0xaf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfb, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf5, 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf0, 0x7, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x90, 0x1, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xda, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, 0x74, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, + 0xe, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, 0x10, + 0xef, 0xf7, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, + 0x0, 0x9, 0xff, 0xc0, 0x0, 0x0, 0xaf, 0xfa, + 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0xff, + 0xf4, 0x0, 0x1f, 0xff, 0x30, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x6, + 0xff, 0xe0, 0x0, 0xb, 0xff, 0x90, 0x0, 0x4f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, + 0xc, 0xff, 0x80, 0x0, 0x5, 0xff, 0xf0, 0x0, + 0xaf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x40, 0x2f, 0xff, 0x10, 0x0, 0x0, 0xef, 0xf5, + 0x1, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xa0, 0x8f, 0xfb, 0x0, 0x0, 0x0, 0x9f, + 0xfb, 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf1, 0xef, 0xf5, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x1c, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfa, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xaf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x0, 0x1d, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x3f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xfe, 0x2d, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0xaf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xe1, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x5, 0xff, + 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x4, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, 0x2, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xe1, + + /* U+0079 "y" */ + 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x10, 0x6f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x0, 0x0, 0x1f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x30, 0x0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x80, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x8, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, + 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xd0, 0x0, 0x6f, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0xd, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfc, 0x4, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf3, 0xbf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xde, 0x62, 0x14, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8c, 0xef, 0xeb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, + + /* U+007B "{" */ + 0x0, 0x0, 0x3, 0xad, 0xff, 0x90, 0x0, 0x6, + 0xff, 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x8f, 0xff, 0xc2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xd0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x30, 0x0, 0xd, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xcf, 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc2, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0x90, 0x0, 0x6, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3, 0xae, 0xff, + 0x90, + + /* U+007C "|" */ + 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, + 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, + 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, + 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, + 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, + 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, + 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, + 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, + 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, + 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, 0xff, 0xf6, + 0xf, 0xff, 0x60, 0xff, 0xf6, 0xf, 0xff, 0x60, + + /* U+007D "}" */ + 0x4f, 0xfe, 0xb6, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x18, 0xff, 0xfe, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xfe, 0xb6, 0x0, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x7, 0xbb, 0x93, 0x0, 0x0, 0x0, 0x6, + 0xca, 0x1, 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xa, 0xfc, 0xc, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xe, 0xfa, 0x3f, 0xfc, 0x20, 0x5e, 0xff, + 0xd2, 0x0, 0x9f, 0xf6, 0x8f, 0xf2, 0x0, 0x1, + 0xdf, 0xff, 0xce, 0xff, 0xe0, 0xbf, 0xc0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x40, 0x9b, 0x70, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xb3, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x1, 0x7c, 0xfe, 0xc6, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x2, 0xff, + 0xb3, 0x0, 0x4d, 0xfe, 0x10, 0xb, 0xfb, 0x0, + 0x0, 0x0, 0xcf, 0x90, 0x1f, 0xf2, 0x0, 0x0, + 0x0, 0x3f, 0xf0, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0xf, 0xf2, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0xf, + 0xf2, 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x4f, 0xf0, + 0xb, 0xfb, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x2, + 0xff, 0xc4, 0x1, 0x5d, 0xfe, 0x10, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x1, 0x7d, + 0xfe, 0xc7, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x7c, 0xb6, 0x0, 0xb, 0xff, 0xff, 0xa0, + 0x4f, 0xff, 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xf5, + 0x4f, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xc0, + 0x1, 0xae, 0xe9, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x5e, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x10, 0x0, 0x0, 0xe, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfb, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x55, 0x53, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1, + 0x58, 0x99, 0x7c, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xef, 0xff, 0xfb, 0x60, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xcd, 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x17, 0x30, 0x0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, + 0x0, 0x3, 0x71, 0xcf, 0x60, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x6, 0xfc, 0xff, 0xa2, + 0x22, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb4, 0x44, 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x44, + 0x4b, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x6, 0xff, + 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0x0, 0x6, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf1, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x66, 0x7f, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf7, 0x66, 0x6c, 0xff, 0xff, + 0x60, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x6, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x6, 0xff, + 0xff, 0x70, 0x0, 0xf, 0xff, 0xf9, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x9f, 0xff, 0xf0, + 0x0, 0x7, 0xff, 0xff, 0xfe, 0xee, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xee, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x88, 0x9f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x88, 0x8d, 0xff, 0xff, 0x60, 0x0, 0xe, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x6, 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe0, 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x7, 0xff, + 0xff, 0xfc, 0xcc, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xaa, 0xae, + 0xff, 0xff, 0x60, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x6, 0xff, 0x6f, 0x60, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x6, 0xf6, + + /* U+F00B "" */ + 0x5e, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x17, 0x88, 0x88, 0x88, 0x87, + 0x10, 0x0, 0x58, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17, + 0x88, 0x88, 0x88, 0x87, 0x10, 0x0, 0x47, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x6, 0x77, 0x77, 0x77, 0x76, + 0x10, 0x0, 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x60, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x7, + 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0xb, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc1, 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xd1, + 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xef, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf0, 0x5f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf7, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x4c, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xc6, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0x30, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x2, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0xe, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x8f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x1, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfe, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x50, 0x6, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf0, + 0xe, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf6, 0x3f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf6, 0x3f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf6, 0x2f, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf5, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xd0, 0x4, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x90, 0x0, 0xef, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x10, 0x0, 0x0, + 0x49, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, + 0xff, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x58, 0x9a, 0xa9, 0x74, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xad, 0x50, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x8, 0xf7, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x4a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x85, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x1, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x75, 0x58, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xec, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, + 0xff, 0xd4, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x6e, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xdf, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xce, 0xb3, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xb, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xbf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x8e, 0xff, + 0xff, 0xff, 0x4b, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xfa, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x26, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x4f, 0xfd, 0x20, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x7f, 0xff, 0xfe, 0x40, 0x3, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x60, 0x1, 0xcf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0x70, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x7f, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x10, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2e, 0xff, 0xff, 0xff, 0x70, + 0xcf, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, + 0xf6, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x9, + 0xff, 0xff, 0xf8, 0x1e, 0xff, 0xe4, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x7, 0xff, 0xfc, + 0x0, 0x3f, 0xd2, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x4, 0xfe, 0x10, 0x0, 0x10, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x22, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x7, 0xff, 0x70, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x33, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x33, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x8f, 0xd0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x4f, + 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x72, 0xcf, 0xf4, 0x4e, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8a, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0x10, 0x0, 0xd, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0x0, 0x9, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x3, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xe1, 0xbf, 0xff, 0xff, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x6f, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x77, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x46, 0x77, 0x53, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x2f, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x1f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xf, 0xff, 0xff, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x2, + 0x7c, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xe, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xed, 0xdd, 0xff, 0xff, 0xff, 0xff, 0x5, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x1, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0x10, 0xff, 0xff, 0xff, 0xff, 0x90, 0x1, 0x23, + 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x85, 0x33, 0x57, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf1, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf2, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, + 0xff, 0xff, 0xd9, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0xaa, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xf0, 0x34, 0x44, 0x44, 0x44, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, + 0x44, 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, 0xef, 0x90, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xb0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4, 0xff, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x4, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x6, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1f, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x9f, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xaf, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x6f, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, + 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, 0xb3, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x1, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xa1, 0x0, 0x1, + 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xe2, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xd0, + 0x0, 0xe, 0xff, 0xf0, 0x0, 0x34, 0x44, 0x44, + 0x44, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0x90, 0x0, 0x7f, + 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x20, 0x0, + 0x2, 0xff, 0xff, 0x20, 0x0, 0xff, 0xfb, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x2, 0xef, 0xa0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0xa, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x7f, 0xff, 0xc0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x5f, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, + 0x80, 0x0, 0x7f, 0xff, 0x30, 0x2, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x4, 0xef, 0xff, 0x10, 0x3, + 0xff, 0xf6, 0x0, 0xf, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0xf, 0xff, 0x80, + 0x0, 0xef, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1f, + 0xff, 0x70, 0x0, 0xff, 0xf9, 0x0, 0xd, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0xf, 0xff, 0x90, 0x0, 0xef, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x1, 0xff, 0xf8, + 0x0, 0xf, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xbf, + 0xff, 0xc0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xf3, 0x0, + 0xa, 0xff, 0xf1, 0x0, 0x4f, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x6, 0xff, 0xf5, 0x0, 0x2, 0xff, 0xfc, + 0x0, 0x8, 0xff, 0xf2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x7, + 0x93, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0xdf, + 0xfe, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xd0, 0x0, 0x4f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf7, 0x0, 0x4, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf9, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf7, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x6, 0x92, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x72, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x29, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xfb, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xfd, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xef, + 0xff, 0xd0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xfe, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xaf, 0xff, 0xf3, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, + 0x40, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x9f, 0xff, 0xff, 0x30, 0x2, + 0x8a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xc6, 0x20, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x79, 0xbb, + 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xee, + 0x70, 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf7, 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x84, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x84, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0x10, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, 0xff, + 0xff, 0xf2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x84, + 0xff, 0xff, 0xf1, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x84, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf7, + 0x4f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x63, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, 0x3, 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x40, 0x0, + + /* U+F04B "" */ + 0x0, 0x13, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8b, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, + + /* U+F04D "" */ + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xe3, 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x65, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xe, 0xff, + 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xe, + 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xf6, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9e, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x65, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0xe, 0xff, 0xff, 0x65, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, 0xff, + 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x65, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, 0x5f, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x65, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf6, + 0x3f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x60, 0xaf, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf5, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x44, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbe, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x46, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x3, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x75, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xe6, 0x0, + + /* U+F054 "" */ + 0x0, 0x26, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9d, + 0xed, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xcd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xca, 0x20, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1, 0x45, 0x55, 0x55, + 0x55, 0x55, 0x5f, 0xff, 0xff, 0xff, 0x75, 0x55, + 0x55, 0x55, 0x55, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x65, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F068 "" */ + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x45, 0x77, 0x65, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x73, + 0x21, 0x24, 0x8d, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x14, 0x54, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xa1, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe3, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xe2, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x2, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x9, 0xa7, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x3, 0x9c, 0xdc, 0x82, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x15, 0xdf, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xba, 0x9a, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xce, 0xff, 0xed, 0xc9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x67, 0x76, 0x42, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x38, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfb, 0x11, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x31, 0x23, 0x7b, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x35, 0x42, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xd4, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xb1, 0x8f, 0xff, 0xff, 0x80, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x80, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xf7, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0x74, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xa9, 0xab, 0x20, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xcd, 0xef, 0xfe, 0xca, 0x72, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa7, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x55, 0x57, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x21, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x3b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xd9, 0x10, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xbe, 0xee, 0xee, 0xef, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0x60, 0x5, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x90, 0x3, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x5f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x10, 0x0, 0x0, 0x9, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x9, 0xe1, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x50, 0x6, 0xff, 0xff, 0xc0, 0x0, + 0x8f, 0xff, 0xff, 0x60, 0x0, 0x1, 0x11, 0x11, + 0x18, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x4f, 0xff, + 0xff, 0xfb, 0x11, 0x8f, 0xff, 0xff, 0xf6, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xad, + 0xdd, 0xdd, 0xdd, 0xdb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xdd, 0xdd, 0xef, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x82, 0x0, 0x0, + 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x7f, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, + 0x6f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xa7, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfb, 0x1d, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x30, 0x1d, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x30, 0x0, 0x17, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x58, 0x20, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf9, + 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xfa, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xc2, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf5, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x40, 0x1d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x6a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x2e, 0xff, 0xfd, 0x3f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0xe, 0xff, 0xfd, 0x4, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x40, 0xe, 0xff, 0xfd, 0x0, 0x5f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, + 0x0, 0xa, 0xff, 0xff, 0x10, 0x3, 0x72, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xc0, 0xa, 0xff, 0xff, 0x10, 0x6f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfb, 0xa, 0xff, 0xff, 0x15, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xba, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xab, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x10, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x0, 0x57, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xb9, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x11, 0xef, 0xff, 0xff, 0xff, + 0xf9, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x5, 0x66, + 0x66, 0x66, 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x73, 0x22, 0x22, 0x22, + 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x8f, 0xd0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x4f, + 0xa0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x72, 0xcf, 0xf4, 0x4e, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xc9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfd, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbb, + 0xa9, 0x86, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x6a, 0xdd, 0xb7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xa9, + 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xfe, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0xcf, 0xff, 0xf9, + 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xe0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xdf, 0xff, 0xf5, 0x0, 0x2e, 0xff, 0xff, 0x10, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xba, 0xff, 0xff, 0xfd, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf9, 0x0, 0x6f, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xff, + 0x20, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x9, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x2e, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x9f, 0xff, 0xff, 0xba, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xa3, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xed, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xef, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xef, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xef, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xef, 0xff, 0xff, 0xf2, + 0x6f, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xf3, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x26, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x10, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x83, 0x12, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x9a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x10, 0x0, + + /* U+F0C9 "" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x26, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x26, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x14, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x1, 0xc4, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x7f, 0xff, 0x90, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x1b, 0xff, 0xff, 0xfc, 0x20, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x2, 0xcf, 0xff, + 0xfc, 0x20, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x4, 0xaa, 0x40, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, + 0x33, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x13, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x66, 0x66, 0x66, 0x53, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x12, + 0x22, 0x22, 0x22, 0x28, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xcc, 0xcc, 0xcc, 0xff, + 0xfe, 0xef, 0xff, 0xcc, 0xcc, 0xcc, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x0, 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xed, 0x10, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xef, 0xd1, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xef, 0xfd, 0x10, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, 0xd1, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, + 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, + 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xef, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0xff, 0xf8, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x17, + 0x88, 0x88, 0x88, 0x84, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x40, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xa, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xba, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xba, 0x60, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xfe, 0x10, 0x1, + 0xaf, 0xf2, 0x0, 0x9, 0xff, 0x40, 0x0, 0x7f, + 0xf5, 0x0, 0x5, 0xff, 0x70, 0x0, 0x4f, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x6f, 0xf0, 0x0, 0x4, 0xff, 0x20, 0x0, + 0x2f, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x7f, 0xe0, 0x0, 0x6, 0xff, + 0x0, 0x0, 0x4f, 0xf2, 0x0, 0x2, 0xff, 0x40, + 0x0, 0xf, 0xff, 0xfc, 0xff, 0xff, 0xc0, 0x0, + 0x7, 0xfe, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x4, + 0xff, 0x20, 0x0, 0x2f, 0xf4, 0x0, 0x0, 0xff, + 0xff, 0xcf, 0xff, 0xfe, 0x10, 0x0, 0xaf, 0xf2, + 0x0, 0x9, 0xff, 0x30, 0x0, 0x7f, 0xf5, 0x0, + 0x5, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x66, + 0x8f, 0xfd, 0x66, 0x68, 0xff, 0xd6, 0x66, 0x7f, + 0xfd, 0x66, 0x66, 0xef, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xff, 0x70, + 0x0, 0xe, 0xf7, 0x0, 0x0, 0xef, 0x70, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xf, 0xf7, 0x0, 0x0, 0xef, + 0x70, 0x0, 0xe, 0xf7, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xff, 0x70, 0x0, 0xe, 0xf7, 0x0, 0x0, + 0xef, 0x70, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1f, 0xf9, + 0x0, 0x1, 0xff, 0x90, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0x76, 0x67, 0xdf, 0xf8, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6a, + 0xff, 0xb6, 0x66, 0x9f, 0xff, 0xfc, 0xff, 0xff, + 0xc0, 0x0, 0x7, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x0, + 0x0, 0xff, 0xff, 0xcf, 0xff, 0xfc, 0x0, 0x0, + 0x7f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x40, 0x0, 0xf, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x0, 0x7, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xcf, 0xff, + 0xfd, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, + 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xfd, 0xcc, + 0xcf, 0xff, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0xcc, 0xce, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xab, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x6, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x40, 0x6, 0x10, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xfe, + 0x30, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xf, 0xff, 0xfe, 0x30, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xf, 0xff, 0xff, 0xfe, 0x30, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, + 0xff, 0xfe, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x32, + 0x22, 0x22, 0x22, 0x22, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x8a, 0xcd, 0xee, 0xed, 0xcb, 0x96, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x86, 0x42, 0x11, 0x12, 0x35, 0x79, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0xcf, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xf5, + 0x2e, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, + 0x2, 0xef, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x69, 0xce, 0xff, 0xfe, 0xdb, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, + 0x0, 0x2c, 0x70, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x42, 0x0, 0x1, 0x26, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x35, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x7, 0x88, 0x88, 0x88, 0x88, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf8, 0x20, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x7f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xdf, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xc2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x93, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8b, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x22, 0xcf, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf9, 0x88, 0xef, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x40, 0x0, 0x5f, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf9, 0x0, 0x0, 0x5, 0xef, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x78, 0x61, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0xc, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xb2, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb9, 0x9e, 0xff, + 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xac, 0xff, 0xff, 0xfd, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe6, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x2a, 0xef, 0xd7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, 0xa, 0xdd, + 0xdd, 0xdd, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x53, 0x3e, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x56, 0x6f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0xff, + 0xd9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfe, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x20, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xfe, 0x0, 0x5c, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xe3, + 0x5, 0xff, 0xfe, 0x0, 0x4f, 0xc1, 0x0, 0xbf, + 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, 0xb0, 0x0, + 0x4f, 0xfe, 0x0, 0x4f, 0xfa, 0x0, 0x1f, 0xff, + 0xff, 0x90, 0x1f, 0xff, 0xff, 0xfb, 0x0, 0x4, + 0xfe, 0x0, 0x4f, 0xd1, 0x0, 0xaf, 0xff, 0xff, + 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x4e, + 0x0, 0x4d, 0x10, 0x8, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, 0x0, + 0x21, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x5f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, + 0x0, 0x10, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x2d, 0x0, + 0x4b, 0x0, 0x8, 0xff, 0xff, 0xff, 0xe0, 0x1f, + 0xff, 0xff, 0xfd, 0x10, 0x2, 0xef, 0x0, 0x4f, + 0xa0, 0x0, 0x9f, 0xff, 0xff, 0xc0, 0xf, 0xff, + 0xff, 0xd1, 0x0, 0x2e, 0xff, 0x0, 0x4f, 0xf9, + 0x0, 0xc, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, + 0xd1, 0x2, 0xef, 0xff, 0x0, 0x4f, 0xe2, 0x0, + 0x5f, 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0x0, 0x5e, 0x20, 0x5, 0xff, + 0xff, 0xff, 0x50, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x32, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x48, + 0xab, 0xcd, 0xdc, 0xa7, 0x30, 0x0, 0x0, 0x0, + 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8c, 0xcc, 0xcc, 0xcc, 0xcc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xcc, + 0xcc, 0xcc, 0xcc, 0xa0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xfb, 0x7, + 0xff, 0xff, 0xc1, 0x5f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, + 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, + 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, + 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, + 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, + 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, + 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, + 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, + 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, + 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, + 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, + 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, 0x1f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, 0x90, + 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, 0xff, + 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, 0x3, + 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xf7, + 0x3, 0xff, 0xff, 0x90, 0x1f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x90, 0x9f, 0xff, + 0xfb, 0x7, 0xff, 0xff, 0xc1, 0x5f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x7b, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcb, 0x81, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xab, 0x97, + 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x76, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x98, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x60, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x6, 0xf6, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xa1, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xfd, 0x10, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x1, 0xdf, 0xff, 0xd1, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xfd, + 0x10, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x21, 0xdf, 0xff, 0xff, 0xff, + 0xd1, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa2, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x2, 0xef, 0xfc, 0xbb, 0xbf, 0xfc, + 0xbb, 0xcf, 0xfc, 0xbb, 0xbf, 0xff, 0xfa, 0x0, + 0x2, 0xef, 0xff, 0x50, 0x2, 0xff, 0x40, 0x3, + 0xff, 0x30, 0x1, 0xff, 0xff, 0xa0, 0x2, 0xef, + 0xff, 0xf5, 0x0, 0x2f, 0xf4, 0x0, 0x3f, 0xf3, + 0x0, 0x1f, 0xff, 0xfa, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x2, 0xff, 0x40, 0x3, 0xff, 0x30, 0x1, + 0xff, 0xff, 0xa2, 0xef, 0xff, 0xff, 0xf5, 0x0, + 0x2f, 0xf4, 0x0, 0x3f, 0xf3, 0x0, 0x1f, 0xff, + 0xfa, 0xef, 0xff, 0xff, 0xff, 0x50, 0x2, 0xff, + 0x40, 0x3, 0xff, 0x30, 0x1, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x2f, 0xf4, 0x0, + 0x3f, 0xf3, 0x0, 0x1f, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0x62, 0x24, 0xff, 0x62, 0x25, 0xff, + 0x52, 0x23, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xac, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x5c, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x20, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf1, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xff, 0xff, 0xff, 0x10, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x40, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 164, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 163, .box_w = 6, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 78, .adv_w = 238, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 139, .adv_w = 427, .box_w = 25, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 464, .adv_w = 378, .box_w = 22, .box_h = 36, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 860, .adv_w = 513, .box_w = 30, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1250, .adv_w = 417, .box_w = 25, .box_h = 27, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1588, .adv_w = 128, .box_w = 4, .box_h = 11, .ofs_x = 2, .ofs_y = 15}, + {.bitmap_index = 1610, .adv_w = 205, .box_w = 9, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 1768, .adv_w = 206, .box_w = 9, .box_h = 35, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 1926, .adv_w = 243, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = 14}, + {.bitmap_index = 2031, .adv_w = 354, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 2184, .adv_w = 138, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 2217, .adv_w = 233, .box_w = 11, .box_h = 4, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 2239, .adv_w = 138, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2257, .adv_w = 214, .box_w = 17, .box_h = 35, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 2555, .adv_w = 406, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2854, .adv_w = 225, .box_w = 11, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2997, .adv_w = 349, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3270, .adv_w = 348, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3543, .adv_w = 407, .box_w = 24, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3855, .adv_w = 349, .box_w = 21, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4128, .adv_w = 375, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4414, .adv_w = 364, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4687, .adv_w = 392, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4973, .adv_w = 375, .box_w = 21, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5246, .adv_w = 138, .box_w = 6, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5306, .adv_w = 138, .box_w = 6, .box_h = 26, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 5384, .adv_w = 354, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5546, .adv_w = 354, .box_w = 18, .box_h = 12, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 5654, .adv_w = 354, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 5816, .adv_w = 348, .box_w = 20, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6076, .adv_w = 629, .box_w = 37, .box_h = 33, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 6687, .adv_w = 445, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7064, .adv_w = 460, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 7376, .adv_w = 440, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7714, .adv_w = 502, .box_w = 27, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8065, .adv_w = 407, .box_w = 21, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8338, .adv_w = 386, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 8598, .adv_w = 469, .box_w = 26, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8936, .adv_w = 494, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9248, .adv_w = 188, .box_w = 5, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9313, .adv_w = 312, .box_w = 17, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9534, .adv_w = 437, .box_w = 25, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 9859, .adv_w = 361, .box_w = 20, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10119, .adv_w = 581, .box_w = 30, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10509, .adv_w = 494, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 10821, .adv_w = 511, .box_w = 30, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11211, .adv_w = 439, .box_w = 23, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 11510, .adv_w = 511, .box_w = 31, .box_h = 31, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 11991, .adv_w = 442, .box_w = 23, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12290, .adv_w = 378, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12576, .adv_w = 357, .box_w = 23, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12875, .adv_w = 481, .box_w = 24, .box_h = 26, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 13187, .adv_w = 433, .box_w = 29, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13564, .adv_w = 685, .box_w = 41, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14097, .adv_w = 409, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14435, .adv_w = 393, .box_w = 26, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14773, .adv_w = 399, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15072, .adv_w = 202, .box_w = 9, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 15230, .adv_w = 214, .box_w = 17, .box_h = 35, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 15528, .adv_w = 202, .box_w = 9, .box_h = 35, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 15686, .adv_w = 354, .box_w = 18, .box_h = 16, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 15830, .adv_w = 304, .box_w = 19, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15859, .adv_w = 365, .box_w = 11, .box_h = 5, .ofs_x = 4, .ofs_y = 23}, + {.bitmap_index = 15887, .adv_w = 364, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16077, .adv_w = 415, .box_w = 22, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 16385, .adv_w = 347, .box_w = 20, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16585, .adv_w = 415, .box_w = 22, .box_h = 28, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16893, .adv_w = 372, .box_w = 21, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17103, .adv_w = 215, .box_w = 15, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17313, .adv_w = 420, .box_w = 22, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 17610, .adv_w = 414, .box_w = 20, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 17890, .adv_w = 170, .box_w = 6, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17977, .adv_w = 173, .box_w = 12, .box_h = 36, .ofs_x = -4, .ofs_y = -7}, + {.bitmap_index = 18193, .adv_w = 375, .box_w = 21, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18487, .adv_w = 170, .box_w = 5, .box_h = 28, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18557, .adv_w = 643, .box_w = 34, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 18897, .adv_w = 414, .box_w = 20, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 19097, .adv_w = 386, .box_w = 22, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19317, .adv_w = 415, .box_w = 22, .box_h = 27, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 19614, .adv_w = 415, .box_w = 22, .box_h = 27, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 19911, .adv_w = 249, .box_w = 12, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20031, .adv_w = 305, .box_w = 18, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20211, .adv_w = 252, .box_w = 15, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20399, .adv_w = 412, .box_w = 20, .box_h = 20, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20599, .adv_w = 340, .box_w = 23, .box_h = 20, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20829, .adv_w = 547, .box_w = 34, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21169, .adv_w = 336, .box_w = 21, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21379, .adv_w = 340, .box_w = 23, .box_h = 27, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 21690, .adv_w = 317, .box_w = 18, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21870, .adv_w = 213, .box_w = 11, .box_h = 35, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 22063, .adv_w = 182, .box_w = 5, .box_h = 35, .ofs_x = 3, .ofs_y = -7}, + {.bitmap_index = 22151, .adv_w = 213, .box_w = 12, .box_h = 35, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 22361, .adv_w = 354, .box_w = 18, .box_h = 7, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 22424, .adv_w = 255, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 22508, .adv_w = 191, .box_w = 8, .box_h = 7, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 22536, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 23297, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23848, .adv_w = 608, .box_w = 38, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 24494, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25045, .adv_w = 418, .box_w = 27, .box_h = 27, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25410, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26151, .adv_w = 608, .box_w = 36, .box_h = 39, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 26853, .adv_w = 684, .box_w = 43, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 27584, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 28325, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28949, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 29690, .adv_w = 304, .box_w = 19, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29975, .adv_w = 456, .box_w = 29, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30410, .adv_w = 684, .box_w = 43, .box_h = 37, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 31206, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31757, .adv_w = 418, .box_w = 27, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32284, .adv_w = 532, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 32722, .adv_w = 532, .box_w = 34, .box_h = 40, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 33402, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33980, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34558, .adv_w = 532, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 34996, .adv_w = 532, .box_w = 35, .box_h = 34, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 35591, .adv_w = 380, .box_w = 20, .box_h = 33, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 35921, .adv_w = 380, .box_w = 20, .box_h = 33, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 36251, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36829, .adv_w = 532, .box_w = 34, .box_h = 8, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 36965, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37589, .adv_w = 760, .box_w = 48, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38525, .adv_w = 684, .box_w = 45, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 39403, .adv_w = 608, .box_w = 38, .box_h = 35, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 40068, .adv_w = 532, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 40415, .adv_w = 532, .box_w = 33, .box_h = 21, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 40762, .adv_w = 760, .box_w = 48, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41482, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 42033, .adv_w = 608, .box_w = 38, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 42774, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 43535, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 44113, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 44776, .adv_w = 532, .box_w = 34, .box_h = 34, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45354, .adv_w = 532, .box_w = 34, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45864, .adv_w = 608, .box_w = 38, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46415, .adv_w = 380, .box_w = 26, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 46922, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 47585, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 48248, .adv_w = 684, .box_w = 43, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 48872, .adv_w = 608, .box_w = 40, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 49652, .adv_w = 456, .box_w = 29, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 50218, .adv_w = 760, .box_w = 48, .box_h = 35, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51058, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 51658, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 52258, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 52858, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 53458, .adv_w = 760, .box_w = 48, .box_h = 25, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 54058, .adv_w = 760, .box_w = 48, .box_h = 30, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54778, .adv_w = 532, .box_w = 30, .box_h = 39, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 55363, .adv_w = 532, .box_w = 34, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 56026, .adv_w = 608, .box_w = 39, .box_h = 39, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 56787, .adv_w = 760, .box_w = 48, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 57483, .adv_w = 456, .box_w = 29, .box_h = 39, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 58049, .adv_w = 612, .box_w = 39, .box_h = 25, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 6, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 27, 0, 16, -13, 0, 0, + 0, 0, -33, -36, 4, 29, 13, 10, + -24, 4, 30, 2, 26, 6, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 5, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, -18, 0, 0, 0, 0, + 0, -12, 10, 12, 0, 0, -6, 0, + -4, 6, 0, -6, 0, -6, -3, -12, + 0, 0, 0, 0, -6, 0, 0, -8, + -9, 0, 0, -6, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -6, 0, -9, 0, -16, 0, -74, 0, + 0, -12, 0, 12, 18, 1, 0, -12, + 6, 6, 20, 12, -10, 12, 0, 0, + -35, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -16, -7, -30, 0, -24, + -4, 0, 0, 0, 0, 1, 24, 0, + -18, -5, -2, 2, 0, -10, 0, 0, + -4, -45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -49, -5, 23, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, + 0, 6, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 12, 6, 18, -6, 0, 0, 12, -6, + -20, -83, 4, 16, 12, 1, -8, 0, + 22, 0, 19, 0, 19, 0, -57, 0, + -7, 18, 0, 20, -6, 12, 6, 0, + 0, 2, -6, 0, 0, -10, 49, 0, + 49, 0, 18, 0, 26, 8, 10, 18, + 0, 0, 0, -22, 0, 0, 0, 0, + 2, -4, 0, 4, -11, -8, -12, 4, + 0, -6, 0, 0, 0, -24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -33, 0, -38, 0, 0, 0, + 0, -4, 0, 60, -7, -8, 6, 6, + -5, 0, -8, 6, 0, 0, -32, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -59, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -38, 0, 36, 0, 0, -22, 0, + 20, 0, -41, -59, -41, -12, 18, 0, + 0, -41, 0, 7, -14, 0, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 16, 18, -74, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -7, -12, 0, -2, + -2, -6, 0, 0, -4, 0, 0, 0, + -12, 0, -5, 0, -14, -12, 0, -15, + -20, -20, -12, 0, -12, 0, -12, 0, + 0, 0, 0, -5, 0, 0, 6, 0, + 4, -6, 0, 2, 0, 0, 0, 6, + -4, 0, 0, 0, -4, 6, 6, -2, + 0, 0, 0, -12, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 8, -4, 0, + -7, 0, -10, 0, 0, -4, 0, 18, + 0, 0, -6, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -6, -7, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -6, -6, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -4, -8, 0, -9, 0, -18, + -4, -18, 12, 0, 0, -12, 6, 12, + 16, 0, -15, -2, -7, 0, -2, -29, + 6, -4, 4, -32, 6, 0, 0, 2, + -32, 0, -32, -5, -53, -4, 0, -30, + 0, 12, 17, 0, 8, 0, 0, 0, + 0, 1, 0, -11, -8, 0, -18, 0, + 0, 0, -6, 0, 0, 0, -6, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -8, 0, 0, 0, 0, 0, 0, 0, + -6, -6, 0, -4, -7, -5, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -7, + 0, -4, 0, -12, 6, 0, 0, -7, + 3, 6, 6, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -6, 0, -6, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -7, -9, 0, + -12, 0, 18, -4, 2, -19, 0, 0, + 16, -30, -32, -26, -12, 6, 0, -5, + -40, -11, 0, -11, 0, -12, 9, -11, + -39, 0, -16, 0, 0, 3, -2, 5, + -4, 0, 6, 1, -18, -23, 0, -30, + -15, -13, -15, -18, -7, -16, -1, -12, + -16, 4, 0, 2, 0, -6, 0, 0, + 0, 4, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -3, 0, -2, -6, 0, -10, -13, + -13, -2, 0, -18, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 2, + -4, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -12, 0, 0, 0, 0, -30, -18, 0, + 0, 0, -9, -30, 0, 0, -6, 6, + 0, -16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, -11, 0, + 0, 0, 0, 7, 0, 4, -12, -12, + 0, -6, -6, -7, 0, 0, 0, 0, + 0, 0, -18, 0, -6, 0, -9, -6, + 0, -13, -15, -18, -5, 0, -12, 0, + -18, 0, 0, 0, 0, 49, 0, 0, + 3, 0, 0, -8, 0, 6, 0, -26, + 0, 0, 0, 0, 0, -57, -11, 20, + 18, -5, -26, 0, 6, -9, 0, -30, + -3, -8, 6, -43, -6, 8, 0, 9, + -21, -9, -22, -20, -26, 0, 0, -36, + 0, 35, 0, 0, -3, 0, 0, 0, + -3, -3, -6, -16, -20, -1, -57, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -3, -6, -9, 0, 0, + -12, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -12, 0, 0, 12, + -2, 8, 0, -13, 6, -4, -2, -16, + -6, 0, -8, -6, -4, 0, -9, -10, + 0, 0, -5, -2, -4, -10, -7, 0, + 0, -6, 0, 6, -4, 0, -13, 0, + 0, 0, -12, 0, -10, 0, -10, -10, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 6, 0, -9, 0, -4, -7, + -19, -4, -4, -4, -2, -4, -7, -2, + 0, 0, 0, 0, 0, -6, -5, -5, + 0, 0, 0, 0, 7, -4, 0, -4, + 0, 0, 0, -4, -7, -4, -5, -7, + -5, 0, 5, 24, -2, 0, -16, 0, + -4, 12, 0, -6, -26, -8, 9, 1, + 0, -29, -10, 6, -10, 4, 0, -4, + -5, -19, 0, -9, 3, 0, 0, -10, + 0, 0, 0, 6, 6, -12, -12, 0, + -10, -6, -9, -6, -6, 0, -10, 3, + -12, -10, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, -8, + 0, 0, -6, -6, 0, 0, 0, 0, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -9, 0, -12, 0, 0, 0, -20, 0, + 4, -13, 12, 1, -4, -29, 0, 0, + -13, -6, 0, -24, -15, -17, 0, 0, + -26, -6, -24, -23, -29, 0, -16, 0, + 5, 41, -8, 0, -14, -6, -2, -6, + -10, -16, -11, -22, -25, -14, -6, 0, + 0, -4, 0, 2, 0, 0, -43, -5, + 18, 13, -13, -22, 0, 2, -19, 0, + -30, -4, -6, 12, -56, -8, 2, 0, + 0, -40, -7, -32, -6, -44, 0, 0, + -43, 0, 36, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -23, -4, 0, -40, + 0, 0, 0, 0, -19, 0, -5, 0, + -2, -17, -29, 0, 0, -3, -9, -18, + -6, 0, -4, 0, 0, 0, 0, -27, + -6, -20, -19, -5, -10, -15, -6, -10, + 0, -12, -5, -20, -9, 0, -7, -12, + -6, -12, 0, 3, 0, -4, -20, 0, + 12, 0, -11, 0, 0, 0, 0, 7, + 0, 4, -12, 25, 0, -6, -6, -7, + 0, 0, 0, 0, 0, 0, -18, 0, + -6, 0, -9, -6, 0, -13, -15, -18, + -5, 0, -12, 5, 24, 0, 0, 0, + 0, 49, 0, 0, 3, 0, 0, -8, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -12, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -6, -6, 0, 0, -12, + -6, 0, 0, -12, 0, 10, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 9, 12, 5, -5, 0, -19, + -10, 0, 18, -20, -19, -12, -12, 24, + 11, 6, -53, -4, 12, -6, 0, -6, + 7, -6, -21, 0, -6, 6, -8, -5, + -18, -5, 0, 0, 18, 12, 0, -17, + 0, -33, -8, 18, -8, -23, 2, -8, + -20, -20, -6, 24, 6, 0, -9, 0, + -16, 0, 5, 20, -14, -22, -24, -15, + 18, 0, 2, -44, -5, 6, -10, -4, + -14, 0, -13, -22, -9, -9, -5, 0, + 0, -14, -13, -6, 0, 18, 14, -6, + -33, 0, -33, -9, 0, -21, -35, -2, + -19, -10, -20, -17, 16, 0, 0, -8, + 0, -12, -5, 0, -6, -11, 0, 10, + -20, 6, 0, 0, -32, 0, -6, -13, + -10, -4, -18, -15, -20, -14, 0, -18, + -6, -14, -12, -18, -6, 0, 0, 2, + 29, -10, 0, -18, -6, 0, -6, -12, + -14, -16, -17, -23, -8, -12, 12, 0, + -9, 0, -30, -7, 4, 12, -19, -22, + -12, -20, 20, -6, 3, -57, -11, 12, + -13, -10, -22, 0, -18, -26, -7, -6, + -5, -6, -13, -18, -2, 0, 0, 18, + 17, -4, -40, 0, -36, -14, 15, -23, + -41, -12, -21, -26, -30, -20, 12, 0, + 0, 0, 0, -7, 0, 0, 6, -7, + 12, 4, -12, 12, 0, 0, -19, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 5, 18, 1, 0, -7, 0, 0, + 0, 0, -4, -4, -7, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 23, 0, 11, 2, 2, -8, + 0, 12, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -36, 0, -6, 10, 0, 18, + 0, 0, 60, 7, -12, -12, 6, 6, + -4, 2, -30, 0, 0, 29, -36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -41, 23, 85, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -16, 0, + 0, 2, 0, 0, 6, 78, -12, -5, + 19, 16, -16, 6, 0, 0, 6, 6, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -79, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -17, + 0, 0, 0, -16, 0, 0, 0, 0, + -13, -3, 0, 0, 0, -13, 0, -7, + 0, -29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -41, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -6, 0, 0, -12, 0, -9, 0, + -16, 0, 0, 0, -10, 6, -7, 0, + 0, -16, -6, -14, 0, 0, -16, 0, + -6, 0, -29, 0, -7, 0, 0, -49, + -12, -24, -7, -22, 0, 0, -41, 0, + -16, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -9, -11, -5, -10, 0, 0, + 0, 0, -13, 0, -13, 8, -7, 12, + 0, -4, -14, -4, -10, -12, 0, -7, + -3, -4, 4, -16, -2, 0, 0, 0, + -54, -5, -9, 0, -13, 0, -4, -29, + -5, 0, 0, -4, -5, 0, 0, 0, + 0, 4, 0, -4, -10, -4, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, + 0, -13, 0, -4, 0, 0, 0, -12, + 6, 0, 0, 0, -16, -6, -12, 0, + 0, -17, 0, -6, 0, -29, 0, 0, + 0, 0, -59, 0, -12, -22, -30, 0, + 0, -41, 0, -4, -9, 0, 0, 0, + 0, 0, 0, 0, 0, -6, -9, -3, + -9, 2, 0, 0, 10, -8, 0, 19, + 30, -6, -6, -18, 7, 30, 10, 13, + -16, 7, 26, 7, 18, 13, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 29, -11, -6, 0, -5, + 49, 26, 49, 0, 0, 0, 6, 0, + 0, 22, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, -51, -7, -5, -25, + -30, 0, 0, -41, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, -51, -7, -5, + -25, -30, 0, 0, -24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -14, 6, 0, -6, + 5, 11, 6, -18, 0, -1, -5, 6, + 0, 5, 0, 0, 0, 0, -15, 0, + -5, -4, -12, 0, -5, -24, 0, 38, + -6, 0, -13, -4, 0, -4, -10, 0, + -6, -17, -12, -7, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, -51, + -7, -5, -25, -30, 0, 0, -41, 0, + 0, 0, 0, 0, 0, 30, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, -19, -7, -5, 18, -5, -6, + -24, 2, -4, 2, -4, -16, 1, 13, + 1, 5, 2, 5, -15, -24, -7, 0, + -23, -12, -16, -26, -24, 0, -10, -12, + -7, -8, -5, -4, -7, -4, 0, -4, + -2, 9, 0, 9, -4, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -6, -6, 0, 0, + -16, 0, -3, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -8, + 0, 0, 0, 0, -5, 0, 0, -10, + -6, 6, 0, -10, -12, -4, 0, -18, + -4, -13, -4, -7, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -41, 0, 19, 0, 0, -11, 0, + 0, 0, 0, -8, 0, -6, 0, 0, + -3, 0, 0, -4, 0, -14, 0, 0, + 26, -8, -20, -19, 4, 7, 7, -1, + -17, 4, 9, 4, 18, 4, 20, -4, + -16, 0, 0, -24, 0, 0, -18, -16, + 0, 0, -12, 0, -8, -10, 0, -9, + 0, -9, 0, -4, 9, 0, -5, -18, + -6, 22, 0, 0, -5, 0, -12, 0, + 0, 8, -14, 0, 6, -6, 5, 1, + 0, -20, 0, -4, -2, 0, -6, 7, + -5, 0, 0, 0, -25, -7, -13, 0, + -18, 0, 0, -29, 0, 22, -6, 0, + -11, 0, 4, 0, -6, 0, -6, -18, + 0, -6, 6, 0, 0, 0, 0, -4, + 0, 0, 6, -8, 2, 0, 0, -7, + -4, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -38, 0, 13, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -6, -6, 0, 0, 0, 12, 0, 14, + 0, 0, 0, 0, 0, -38, -35, 2, + 26, 18, 10, -24, 4, 26, 0, 22, + 0, 12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_38 = { +#else +lv_font_t lv_font_montserrat_38 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 41, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_38*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_40.c b/inc/lvgl/src/font/lv_font_montserrat_40.c new file mode 100644 index 0000000..36c7d31 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_40.c @@ -0,0 +1,9248 @@ +/******************************************************************************* + * Size: 40 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 40 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_40.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_40 + #define LV_FONT_MONTSERRAT_40 1 +#endif + +#if LV_FONT_MONTSERRAT_40 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xd, 0xff, 0xf9, 0xd, 0xff, 0xf9, 0xc, 0xff, + 0xf8, 0xb, 0xff, 0xf8, 0xb, 0xff, 0xf7, 0xa, + 0xff, 0xf6, 0xa, 0xff, 0xf6, 0x9, 0xff, 0xf5, + 0x9, 0xff, 0xf4, 0x8, 0xff, 0xf4, 0x7, 0xff, + 0xf3, 0x7, 0xff, 0xf3, 0x6, 0xff, 0xf2, 0x6, + 0xff, 0xf1, 0x5, 0xff, 0xf1, 0x4, 0xff, 0xf0, + 0x4, 0xff, 0xf0, 0x3, 0xff, 0xf0, 0x3, 0xff, + 0xe0, 0x1, 0xbb, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x6, 0xff, 0xe3, 0x1f, 0xff, 0xfc, 0x2f, 0xff, + 0xfe, 0xe, 0xff, 0xfa, 0x3, 0xcf, 0xb1, + + /* U+0022 "\"" */ + 0x7f, 0xfd, 0x0, 0x3, 0xff, 0xf1, 0x7f, 0xfd, + 0x0, 0x3, 0xff, 0xf1, 0x6f, 0xfc, 0x0, 0x2, + 0xff, 0xf0, 0x6f, 0xfc, 0x0, 0x2, 0xff, 0xf0, + 0x6f, 0xfc, 0x0, 0x2, 0xff, 0xf0, 0x5f, 0xfb, + 0x0, 0x1, 0xff, 0xf0, 0x5f, 0xfb, 0x0, 0x1, + 0xff, 0xf0, 0x5f, 0xfa, 0x0, 0x1, 0xff, 0xe0, + 0x4f, 0xfa, 0x0, 0x0, 0xff, 0xe0, 0x4f, 0xfa, + 0x0, 0x0, 0xff, 0xe0, 0x4f, 0xf9, 0x0, 0x0, + 0xff, 0xd0, 0x1, 0x11, 0x0, 0x0, 0x11, 0x10, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfd, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf9, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x70, 0x0, 0x0, 0x0, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, + 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x1f, 0xfb, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x20, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x6f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, + 0x1, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x3f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x20, 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, + 0xfe, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xea, 0xdf, 0xf9, 0xbe, 0xff, 0xff, 0x90, 0x0, + 0xc, 0xff, 0xfe, 0x50, 0xa, 0xfe, 0x0, 0x2, + 0x8f, 0xf3, 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x8f, + 0xff, 0x80, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf9, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, + 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfc, 0x50, 0xaf, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xe0, 0x5b, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, + 0x4, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x0, + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0xcf, 0xff, 0x20, 0x5, + 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x0, 0xe, + 0xff, 0xf0, 0x6, 0xf9, 0x10, 0x0, 0x0, 0xaf, + 0xe0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0xdf, 0xff, + 0x82, 0x0, 0xa, 0xfe, 0x0, 0x18, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xfd, 0xa9, 0xdf, 0xf8, + 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbd, + 0xef, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x58, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x7d, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, + 0x1, 0xef, 0xfa, 0x66, 0xaf, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x60, 0x0, 0x5, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xf, 0xfb, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, + 0x0, 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x0, + 0x0, 0x6, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, + 0x0, 0x1f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x0, + 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x1f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x20, 0x0, 0x2, 0xff, 0xb0, 0x0, + 0xbf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe5, 0x0, 0x5e, 0xff, 0x30, 0x5, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1e, + 0xff, 0x10, 0x2, 0x9d, 0xfe, 0xb5, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xfd, 0x40, 0x0, 0xaf, + 0xf6, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, 0x5, 0xff, + 0xb0, 0x3, 0xff, 0xf9, 0x67, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0x20, 0xc, 0xff, 0x30, 0x0, 0xb, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, + 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x20, + 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf7, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, + 0x0, 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x7f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, + 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xe0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xc, 0xff, 0x30, 0x0, 0xb, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf9, 0x57, 0xdf, 0xf9, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xb5, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf7, 0x10, 0x3, 0xbf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x50, 0x0, 0x0, 0xd, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf2, 0x0, 0x1b, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x15, + 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xc3, + 0xcf, 0xff, 0xd1, 0x0, 0x0, 0x7, 0x72, 0x0, + 0x0, 0x3f, 0xff, 0xf7, 0x0, 0xc, 0xff, 0xfd, + 0x10, 0x0, 0xe, 0xff, 0x50, 0x1, 0xef, 0xff, + 0x40, 0x0, 0x0, 0xcf, 0xff, 0xd1, 0x0, 0x2f, + 0xff, 0x20, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfd, 0x10, 0x8f, 0xfe, 0x0, 0xe, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xd1, 0xef, 0xf9, 0x0, 0x1f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0xff, 0xf2, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0x30, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, + 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xfc, 0x10, 0x0, 0xdf, 0xff, + 0xfe, 0x96, 0x45, 0x6a, 0xef, 0xff, 0xfa, 0xcf, + 0xff, 0xc0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x1d, 0xff, 0xf9, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x1, 0xdf, 0xe1, 0x0, 0x0, 0x1, 0x5a, + 0xde, 0xfe, 0xdb, 0x62, 0x0, 0x0, 0x0, 0x1d, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x7f, 0xfd, 0x7f, 0xfd, 0x6f, 0xfc, 0x6f, 0xfc, + 0x6f, 0xfc, 0x5f, 0xfb, 0x5f, 0xfb, 0x5f, 0xfa, + 0x4f, 0xfa, 0x4f, 0xfa, 0x4f, 0xf9, 0x1, 0x11, + + /* U+0028 "(" */ + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x4f, + 0xff, 0x70, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x9, 0xff, 0xf1, + 0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x5f, + 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, + 0x0, 0xef, 0xfd, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, + 0x0, 0xd, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, + 0xc0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, + 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x3f, + 0xff, 0x90, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x1f, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, 0x0, + 0xf, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, 0xe0, + 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, + 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, + 0xc0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, + 0xb, 0xff, 0xe0, + + /* U+0029 ")" */ + 0x7f, 0xff, 0x30, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x4, + 0xff, 0xf7, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0x0, 0xaf, 0xff, 0x10, 0x0, 0x5, 0xff, 0xf6, + 0x0, 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, 0xef, + 0xfd, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x9f, 0xff, 0x30, 0x0, 0x6, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xff, 0x70, 0x0, 0x3, 0xff, 0xf8, + 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x1, 0xff, + 0xfa, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0xff, 0xfb, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, + 0x1, 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xff, 0x90, + 0x0, 0x3, 0xff, 0xf8, 0x0, 0x0, 0x4f, 0xff, + 0x70, 0x0, 0x6, 0xff, 0xf5, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xf7, + 0x0, 0x0, 0xaf, 0xff, 0x10, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0xef, + 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x2f, 0xf2, 0x0, 0x1, 0x0, + 0x7, 0xf7, 0x0, 0x2f, 0xf2, 0x0, 0x7f, 0x70, + 0x1e, 0xff, 0xd4, 0x2f, 0xf2, 0x4d, 0xff, 0xe0, + 0x5, 0xef, 0xff, 0xcf, 0xfc, 0xff, 0xfe, 0x50, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x1e, 0xff, 0xf8, 0x3f, 0xf3, 0x8f, 0xff, 0xe1, + 0xa, 0xfb, 0x20, 0x2f, 0xf2, 0x2, 0xcf, 0xa0, + 0x1, 0x50, 0x0, 0x2f, 0xf2, 0x0, 0x5, 0x10, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x51, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0x33, 0x33, 0x33, 0x4f, 0xff, + 0x73, 0x33, 0x33, 0x32, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x50, + 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x36, 0x40, 0x0, 0x6f, 0xff, 0x80, 0xe, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xff, 0x0, 0x2d, 0xff, 0xc0, 0x0, 0x8f, 0xf7, + 0x0, 0xc, 0xff, 0x10, 0x0, 0xff, 0xc0, 0x0, + 0x4f, 0xf7, 0x0, 0x8, 0xff, 0x20, 0x0, 0xcf, + 0xc0, 0x0, + + /* U+002D "-" */ + 0x46, 0x66, 0x66, 0x66, 0x66, 0x60, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+002E "." */ + 0x0, 0x59, 0x60, 0x0, 0x9f, 0xff, 0xa0, 0xf, + 0xff, 0xff, 0x11, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xfd, 0x0, 0x2b, 0xfc, 0x20, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xec, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x17, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0xe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0xe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, + 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x0, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x90, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0xe, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xeb, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x96, 0x99, 0x99, 0x9b, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, + 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, + 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, + + /* U+0032 "2" */ + 0x0, 0x0, 0x1, 0x6a, 0xde, 0xff, 0xeb, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xdb, 0xab, 0xdf, + 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xfe, 0x61, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfa, 0x0, 0x3, + 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+0033 "3" */ + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x4, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfc, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x45, 0x7b, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf0, 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xc0, 0xa, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, + 0x3f, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x1, 0x8f, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xdb, + 0xab, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, + 0xde, 0xff, 0xeb, 0x72, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0xbe, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xef, 0xff, 0x88, 0x88, 0x82, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, + 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2, 0xff, 0xfc, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x0, 0x0, 0x3, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xe9, 0x99, 0x87, 0x64, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x47, 0xcf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf7, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf3, 0x2, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0xb, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0x60, 0x1f, 0xff, 0xff, 0xff, 0xec, + 0xbb, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, + 0xce, 0xff, 0xec, 0x95, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, + 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xeb, 0x99, 0x9b, 0xef, 0xf3, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x48, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x10, 0x1, 0x6b, 0xdf, 0xfe, 0xb7, 0x10, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xfe, 0x86, 0x56, + 0x9e, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x0, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0xc, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x70, 0x9f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x80, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0xaf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x30, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xe9, 0x65, 0x69, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, + 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xcf, 0xff, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0xaf, 0xff, 0xf0, 0xcf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0xcf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, + 0x9c, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x15, 0xac, 0xef, 0xfd, 0xc8, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfe, 0x96, + 0x55, 0x7a, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, + 0xf4, 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x2, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x1, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, + 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xa0, 0x0, 0x7f, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, + 0xcf, 0xff, 0xf8, 0x41, 0x0, 0x15, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x6, 0xff, 0xff, + 0xf9, 0x53, 0x22, 0x36, 0xbf, 0xff, 0xfe, 0x20, + 0x2, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xfd, 0x0, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xc2, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfe, 0xf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x2, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, + 0x7, 0xff, 0xff, 0xfd, 0x96, 0x55, 0x7a, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, + 0xfe, 0xca, 0x61, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xfc, 0x86, 0x57, 0xaf, + 0xff, 0xff, 0x70, 0x0, 0xb, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x3f, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfd, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x50, 0xcf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xb0, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf1, 0xdf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xbf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf7, 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf9, 0x1f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfa, 0x7, + 0xff, 0xff, 0xe7, 0x30, 0x1, 0x4a, 0xff, 0xfe, + 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0xff, 0xfb, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x14, 0xff, 0xfb, + 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xfa, 0x40, + 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2, 0x45, + 0x42, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, + 0x0, 0x1a, 0x30, 0x0, 0x0, 0x0, 0x4d, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x9f, 0xfe, 0xa9, 0x89, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, + 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x1, 0xbf, 0xc2, 0x0, 0xcf, 0xff, 0xd0, 0x1f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xfa, 0x0, 0x5, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x60, 0x0, 0x9f, 0xff, 0xa0, 0xf, + 0xff, 0xff, 0x11, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xfd, 0x0, 0x2b, 0xfc, 0x20, + + /* U+003B ";" */ + 0x1, 0xbf, 0xc2, 0x0, 0xcf, 0xff, 0xd0, 0x1f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xfa, 0x0, 0x5, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, 0x40, 0x0, 0x6f, 0xff, 0x80, 0xe, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf2, 0xc, 0xff, + 0xff, 0x0, 0x2d, 0xff, 0xc0, 0x0, 0x8f, 0xf7, + 0x0, 0xc, 0xff, 0x10, 0x0, 0xff, 0xc0, 0x0, + 0x4f, 0xf7, 0x0, 0x8, 0xff, 0x20, 0x0, 0xcf, + 0xc0, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xfc, 0x60, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xe9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x50, + + /* U+003D "=" */ + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x95, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, + + /* U+003E ">" */ + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xef, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xfd, 0x71, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xeb, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0xaf, 0xff, 0xff, 0xea, 0x98, 0x9b, 0xff, 0xff, + 0xff, 0x20, 0x5f, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x1, 0x9f, 0xff, 0xfa, 0x0, 0x6f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, 0x0, + 0x26, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xac, 0xcc, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xde, 0x80, 0x0, 0x0, 0x0, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, + 0xbd, 0xef, 0xfe, 0xda, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, + 0xcb, 0xcd, 0xef, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x14, 0x9e, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x0, 0x0, 0x1, 0x22, 0x10, + 0x3f, 0xff, 0x50, 0x0, 0x0, 0x6, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xff, 0xfc, 0x71, + 0x0, 0xcf, 0xfb, 0x0, 0x4f, 0xfe, 0x10, 0x0, + 0x0, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0xc, 0xff, 0xb0, 0x0, + 0x9f, 0xf8, 0x0, 0x0, 0x7f, 0xfb, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xfb, 0x0, 0x1, 0xff, 0xf0, 0x0, 0xd, + 0xff, 0x40, 0x0, 0x0, 0xaf, 0xff, 0xfa, 0x41, + 0x1, 0x4b, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x8, + 0xff, 0x50, 0x3, 0xff, 0xd0, 0x0, 0x0, 0x5f, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x2f, 0xfb, 0x0, 0x7f, 0xf8, + 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, + 0xf0, 0xa, 0xff, 0x40, 0x0, 0x4, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, + 0x0, 0x0, 0xa, 0xff, 0x20, 0xdf, 0xf1, 0x0, + 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x7f, 0xf4, + 0xf, 0xff, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, + 0x0, 0x5, 0xff, 0x50, 0xff, 0xe0, 0x0, 0x0, + 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xf6, 0x1f, + 0xfd, 0x0, 0x0, 0xd, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x4, 0xff, 0x60, 0xff, 0xe0, 0x0, 0x0, 0xdf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xb0, 0x0, 0x0, 0x5f, 0xf5, 0xf, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, 0x7, + 0xff, 0x40, 0xdf, 0xf1, 0x0, 0x0, 0x7f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xb0, 0x0, 0x0, 0x9f, 0xf2, 0xa, 0xff, 0x40, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0xd, 0xff, + 0x0, 0x7f, 0xf8, 0x0, 0x0, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, + 0x0, 0x2, 0xff, 0xa0, 0x2, 0xff, 0xd0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x10, 0x0, 0xbf, 0xf5, 0x0, + 0xd, 0xff, 0x40, 0x0, 0x0, 0x8f, 0xff, 0xfc, + 0x63, 0x23, 0x6d, 0xff, 0xf8, 0xff, 0xfb, 0x33, + 0xaf, 0xfd, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xef, 0xf5, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x6, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x6, 0xbe, 0xff, 0xda, 0x50, 0x0, 0x0, + 0x3a, 0xef, 0xd9, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x26, + 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, + 0xdc, 0xcd, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, + 0xfe, 0xc9, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x1e, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x7f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf3, 0x1, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x20, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x4a, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x3, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x50, 0x0, 0x8, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x6f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, + + /* U+0042 "B" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x95, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xc, 0xff, 0xf7, + 0x55, 0x55, 0x55, 0x55, 0x68, 0xcf, 0xff, 0xff, + 0x90, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0x20, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x30, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xb0, 0x0, 0xcf, 0xff, + 0x75, 0x55, 0x55, 0x55, 0x56, 0x8c, 0xff, 0xff, + 0xd1, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x60, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x5b, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0x70, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0xc, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x3c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf3, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x2c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, + 0xc, 0xff, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x56, + 0x7a, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x60, + 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xec, + 0xab, 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x4, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0x50, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x5, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0x50, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0x60, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe7, 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xad, 0xef, 0xfe, 0xc9, 0x40, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, + 0x9b, 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x30, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xd0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x50, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf1, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf7, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xd0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, + 0xa9, 0x99, 0x99, 0x99, 0x9b, 0xdf, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xda, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc, + 0xff, 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x80, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x97, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x94, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, + + /* U+0046 "F" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0xcf, 0xff, 0xa8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x10, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, + 0xfe, 0xca, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xec, + 0xbb, 0xce, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x3, + 0x8e, 0xff, 0xff, 0x60, 0x0, 0x2e, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0x90, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x90, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xaa, 0x40, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf7, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x70, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, 0x0, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x70, 0x5, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf7, 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x2e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe8, 0x20, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xec, 0xaa, 0xbe, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xfd, 0xc9, 0x51, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, + 0xa9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0xef, 0xff, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x40, + + /* U+0049 "I" */ + 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, + 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, + 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, + 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, + 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, + 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, + 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, + 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, 0x3c, 0xff, + 0xf3, 0xcf, 0xff, 0x3c, 0xff, 0xf3, 0xcf, 0xff, + 0x30, + + /* U+004A "J" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x4, 0x99, 0x99, 0x99, + 0x99, 0x9b, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, 0x64, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, 0x4, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, + 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xa0, 0xc, 0xff, 0xff, 0xfb, 0x99, 0xcf, 0xff, + 0xff, 0x20, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x17, 0xbe, + 0xff, 0xda, 0x60, 0x0, 0x0, + + /* U+004B "K" */ + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xf7, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf9, + 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfa, 0x0, 0xc, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xfb, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf3, 0x4, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x33, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xd7, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xe2, 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xd1, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xb0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, + + /* U+004C "L" */ + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x93, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+004D "M" */ + 0xcf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xcf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xcf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xcf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfc, 0xef, 0xff, 0xcf, + 0xff, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf3, 0xef, 0xff, 0xcf, 0xff, + 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x90, 0xdf, 0xff, 0xcf, 0xff, 0x0, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x5f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, + 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, 0x0, + 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x3, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, 0xdf, + 0xff, 0xcf, 0xff, 0x0, 0x0, 0x9f, 0xff, 0x50, + 0x0, 0x1, 0xff, 0xfb, 0x0, 0x0, 0xdf, 0xff, + 0xcf, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0xa, 0xff, 0xf2, 0x0, 0x0, 0xdf, 0xff, 0xcf, + 0xff, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x3f, + 0xff, 0x90, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, 0xcf, 0xfe, + 0x10, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xa5, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xcf, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, + + /* U+004E "N" */ + 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x4c, + 0xff, 0xfd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x4d, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x4c, 0xff, 0xf3, 0x2f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, 0xff, + 0x30, 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x1, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xf4, 0xcf, + 0xff, 0x30, 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x80, 0x0, 0xb, 0xff, 0xf4, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xfe, 0x20, 0xb, 0xff, + 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xfd, 0x0, 0xbf, 0xff, 0x4c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0xb, + 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf6, 0xbf, 0xff, 0x4c, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfd, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0x4c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf4, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x4c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x40, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xeb, 0xab, 0xcf, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x4, + 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x0, 0x5, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf7, 0x0, 0x3f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x8, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x20, 0xcf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf6, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x80, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfa, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0xdf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe7, 0x20, 0x0, 0x0, 0x3, 0xaf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xc, 0xff, 0xfa, 0x99, 0x99, 0x99, + 0x9a, 0xdf, 0xff, 0xff, 0xf7, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xff, + 0xf4, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xc0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x3c, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xac, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfc, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xcc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x8c, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf3, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfd, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0x40, + 0xcf, 0xff, 0xa9, 0x99, 0x99, 0x99, 0xad, 0xff, + 0xff, 0xff, 0x70, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xda, 0x72, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xeb, 0xab, 0xcf, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe7, + 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0xbf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0xe, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x1f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe0, 0x0, 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf7, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0x2, 0x8f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xc9, 0x89, 0xad, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xff, 0xfe, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0x85, 0x47, 0xcf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xd9, 0x30, + 0x0, 0x0, + + /* U+0052 "R" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0xcf, 0xff, 0xa9, 0x99, + 0x99, 0x99, 0xad, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xff, 0xff, 0xf3, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfb, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x20, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x70, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xc0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x90, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x14, 0x8e, + 0xff, 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x98, 0x88, 0x88, 0x87, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x20, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xda, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xb9, + 0x88, 0x9c, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xcf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, + 0x30, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x80, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, 0xa6, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xae, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x7f, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0xe, 0xff, 0xfb, 0x51, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xf4, 0x2, + 0xef, 0xff, 0xff, 0xfc, 0xa9, 0x88, 0xad, 0xff, + 0xff, 0xf9, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0xce, 0xff, + 0xfe, 0xb8, 0x30, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x79, 0x99, 0x99, 0x99, + 0x9a, 0xff, 0xfe, 0x99, 0x99, 0x99, 0x99, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xa0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf8, 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0xcf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf5, 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x5f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0xef, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, + 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x10, 0x0, 0xd, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xfe, 0xca, 0xbc, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x5a, 0xde, 0xff, 0xdc, 0x84, 0x0, + 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x6, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x8f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x10, 0x0, 0x2f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf9, 0x0, 0x0, 0xb, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf2, 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x5, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x0, 0xc, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0xaf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xc1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x8f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x93, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf4, 0xe, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf5, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x9f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x3, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0x3, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, + 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0x0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x4, 0xff, + 0xf8, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0xbf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x5, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, 0xaf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, + 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf0, 0xf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x45, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf8, 0x1f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xbf, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xd6, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xdf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0xd, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfb, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x60, 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe1, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, + 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x50, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x4, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0xbf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xe1, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf4, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x4, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0xd, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9e, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfa, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x91, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x24, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, + + /* U+005B "[" */ + 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xff, 0xff, + 0xf9, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, 0xf4, + 0x44, 0x42, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, + 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, + 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, + 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, + 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, + 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, 0xcf, + 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, + 0x0, 0xcf, 0xff, 0x0, 0x0, 0xc, 0xff, 0xf4, + 0x33, 0x32, 0xcf, 0xff, 0xff, 0xff, 0x9c, 0xff, + 0xff, 0xff, 0xf9, 0xcf, 0xff, 0xff, 0xff, 0x90, + + /* U+005C "\\" */ + 0x38, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf0, + + /* U+005D "]" */ + 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, 0xff, + 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x4, + 0x44, 0x4c, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, + 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, + 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, + 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, + 0x0, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf2, 0x3, + 0x33, 0x3c, 0xff, 0xf2, 0x3f, 0xff, 0xff, 0xff, + 0xf2, 0x3f, 0xff, 0xff, 0xff, 0xf2, 0x3f, 0xff, + 0xff, 0xff, 0xf2, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xcf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x2c, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x6, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf5, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xe0, 0x0, 0x9f, 0xf6, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x80, 0x0, 0x3f, 0xfc, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0xc, 0xff, + 0x30, 0x0, 0x0, 0x4f, 0xfb, 0x0, 0x0, 0x6, + 0xff, 0x90, 0x0, 0x0, 0xbf, 0xf5, 0x0, 0x0, + 0x0, 0xff, 0xf1, 0x0, 0x2, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0xe, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xc, 0xff, 0x40, 0x6f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xb0, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf1, + + /* U+005F "_" */ + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x7, 0x88, 0x86, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xf8, + + /* U+0061 "a" */ + 0x0, 0x0, 0x48, 0xbd, 0xef, 0xed, 0x95, 0x0, + 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x1, 0xef, 0xff, 0xfb, + 0x87, 0x79, 0xcf, 0xff, 0xff, 0x20, 0x7, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf9, 0x0, + 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x5, + 0x8b, 0xcd, 0xdd, 0xdd, 0xde, 0xff, 0xf7, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x3f, 0xff, 0xf9, 0x31, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x7a, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf7, 0xef, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x7f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf7, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x7a, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xfc, 0x52, 0x11, + 0x4a, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xf7, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x3f, 0xff, 0x70, + 0x0, 0x17, 0xce, 0xff, 0xda, 0x60, 0x3, 0xff, + 0xf7, + + /* U+0062 "b" */ + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x16, 0xbd, 0xff, 0xeb, 0x61, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x5f, 0xff, 0xef, 0xff, 0xfc, 0x97, + 0x9b, 0xff, 0xff, 0xfd, 0x10, 0x5, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xfb, + 0x0, 0x5f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, + 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x15, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x5f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x85, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf9, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x95, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x5f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x55, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf1, 0x5f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x5, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x50, 0x5f, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xb0, 0x5, 0xff, + 0xfc, 0xff, 0xff, 0xc9, 0x79, 0xbf, 0xff, 0xff, + 0xe1, 0x0, 0x5f, 0xff, 0x59, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x5, 0xff, 0xf5, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0xfe, + 0xb6, 0x10, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xb6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xd9, 0x78, 0xaf, 0xff, + 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x40, 0xe, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfe, 0x40, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xe5, 0x0, 0x5, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x8, 0xff, + 0xff, 0xfd, 0x97, 0x8a, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xce, 0xff, 0xeb, 0x61, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xc7, 0x20, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xa0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0xff, 0xfa, 0x0, 0xa, 0xff, 0xff, 0xfc, 0x97, + 0x8b, 0xff, 0xff, 0xef, 0xff, 0xa0, 0x7, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xfa, 0x1, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, + 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xa1, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x3f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xa4, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xa3, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfa, 0x1f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xa0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfa, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, + 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfa, 0x0, 0x7f, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xaf, 0xff, 0xff, 0xd9, 0x78, 0xbf, 0xff, 0xfc, + 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xa0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, + 0x72, 0x0, 0xf, 0xff, 0xa0, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xd9, 0x65, 0x7a, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xfe, 0x10, 0x1, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x90, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf0, 0xd, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf5, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf9, 0x3f, 0xff, 0xed, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xfb, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xc0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x1, 0xaf, 0xfa, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfd, 0x98, 0x79, 0xcf, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfd, 0xc8, 0x30, + 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xea, 0x40, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x64, 0x6c, 0xa0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x13, 0x33, 0xdf, 0xff, 0x43, 0x33, 0x33, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0xbf, 0xfe, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4b, 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0xc9, + 0x78, 0x9d, 0xff, 0xff, 0xef, 0xfe, 0x0, 0x9f, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xe0, 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfe, 0x9, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xe0, 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe4, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfe, 0x4f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe4, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xe0, 0x2f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, + 0x0, 0x8f, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, + 0xd9, 0x78, 0xae, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3e, 0xff, 0xe0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x5, 0xad, 0xff, 0xec, 0x83, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf4, 0x0, 0xc, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, + 0x6, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xff, 0xea, + 0x87, 0x79, 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7a, 0xde, 0xff, 0xec, 0x95, 0x0, 0x0, + 0x0, + + /* U+0068 "h" */ + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x0, 0x16, 0xbd, 0xff, 0xda, 0x60, 0x0, + 0x0, 0x5f, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x5, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xfb, 0x99, 0xae, 0xff, 0xff, 0xf3, + 0x5, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xc0, 0x5f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x25, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x95, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x5f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, + + /* U+0069 "i" */ + 0x0, 0x37, 0x40, 0x0, 0x7f, 0xff, 0x90, 0xe, + 0xff, 0xff, 0x10, 0xff, 0xff, 0xf1, 0x9, 0xff, + 0xfa, 0x0, 0x6, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, + 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, + 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, + 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, + 0x0, 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, + 0x5f, 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, + 0x70, 0x5, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0x70, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x97, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf8, 0x0, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0x40, 0xc, 0xc7, 0x57, 0xdf, 0xff, 0xe0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x5b, 0xef, + 0xfd, 0x92, 0x0, 0x0, + + /* U+006B "k" */ + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0xbf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x1, 0xcf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x1d, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x71, 0xdf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xae, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0x39, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe2, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x20, 0x0, 0x1e, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd2, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x5f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x60, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, + + /* U+006C "l" */ + 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, + 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, + 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, + 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, + 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, + 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, + 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, + 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x75, 0xff, + 0xf7, 0x5f, 0xff, 0x75, 0xff, 0xf7, 0x5f, 0xff, + 0x75, 0xff, 0xf7, 0x5f, 0xff, 0x70, + + /* U+006D "m" */ + 0x5f, 0xff, 0x50, 0x2, 0x8c, 0xef, 0xec, 0x93, + 0x0, 0x0, 0x0, 0x16, 0xbe, 0xff, 0xeb, 0x71, + 0x0, 0x0, 0x5f, 0xff, 0x51, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x5f, 0xff, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xb7, 0x56, 0x8e, 0xff, 0xff, 0xbb, + 0xff, 0xff, 0xa6, 0x56, 0xaf, 0xff, 0xff, 0x50, + 0x5f, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xd0, 0x5f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf4, 0x5f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfd, + + /* U+006E "n" */ + 0x5f, 0xff, 0x50, 0x2, 0x7b, 0xdf, 0xfd, 0xa6, + 0x0, 0x0, 0x5, 0xff, 0xf5, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x5f, 0xff, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x5, + 0xff, 0xff, 0xff, 0xfc, 0x86, 0x57, 0xbf, 0xff, + 0xff, 0x30, 0x5f, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0x5f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x65, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x5f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb5, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfc, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xc5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc9, + 0x78, 0xaf, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x5f, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xc0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x60, 0x7, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0xf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x73, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf9, 0x4f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xb4, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf7, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x30, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xfb, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xfd, 0x97, 0x8b, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, 0xff, + 0xda, 0x60, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0xfe, 0xb6, + 0x10, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5f, + 0xff, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x5, 0xff, 0xfe, 0xff, 0xfe, 0x85, + 0x45, 0x8e, 0xff, 0xff, 0xd1, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xb0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x50, 0x5f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x5f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x55, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf8, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x95, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf9, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x75, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x15, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x5f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf5, 0x5, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xfb, 0x0, 0x5f, + 0xff, 0xdf, 0xff, 0xfc, 0x97, 0x9b, 0xff, 0xff, + 0xfe, 0x10, 0x5, 0xff, 0xf7, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x5f, 0xff, + 0x70, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x5, 0xbd, 0xff, + 0xeb, 0x61, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xec, 0x72, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x1f, 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, 0xc9, + 0x78, 0xbf, 0xff, 0xfc, 0xff, 0xfa, 0x0, 0x7f, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xa0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x8, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xa0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfa, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa3, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfa, 0x4f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa4, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa1, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfa, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xa0, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, + 0x1, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xa0, 0x7, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xfa, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x97, 0x8b, 0xff, 0xff, + 0xdf, 0xff, 0xa0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0xff, 0xfa, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, + 0xc7, 0x10, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfa, + + /* U+0072 "r" */ + 0x5f, 0xff, 0x50, 0x1, 0x6b, 0xdf, 0x5, 0xff, + 0xf5, 0x7, 0xff, 0xff, 0xf0, 0x5f, 0xff, 0x5a, + 0xff, 0xff, 0xff, 0x5, 0xff, 0xfb, 0xff, 0xff, + 0xfd, 0xc0, 0x5f, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0x5, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xdb, 0x83, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8, 0xff, 0xff, + 0xd8, 0x66, 0x78, 0xcf, 0xff, 0x60, 0x0, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x18, 0xc0, 0x0, + 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xb8, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa4, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x4, 0x7a, 0xdf, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc0, 0x1f, 0xf9, 0x30, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xea, 0x87, + 0x78, 0xaf, 0xff, 0xff, 0x10, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x3, 0x7a, 0xde, 0xff, 0xec, 0x83, 0x0, + 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x13, 0x33, 0xdf, 0xff, 0x43, 0x33, 0x33, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x75, 0x7d, 0xb0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, 0xd9, 0x20, + + /* U+0075 "u" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x69, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x9f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x9f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x69, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf6, 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x69, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x67, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf6, 0x6f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x63, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x60, 0x8f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x1, 0xef, 0xff, + 0xff, 0xb9, 0x9a, 0xef, 0xff, 0xdf, 0xff, 0x60, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0xff, 0xf6, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x49, + 0xde, 0xfe, 0xc7, 0x20, 0x3, 0xff, 0xf6, + + /* U+0076 "v" */ + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x50, 0x0, 0x9f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x0, + 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xef, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xd0, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x10, 0x0, 0xaf, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x70, 0x1, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, 0x5f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xdf, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x3f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0xd, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x8, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, + 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfe, 0xef, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xef, 0xf8, 0x9f, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf6, 0x0, 0x0, 0x1f, + 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0xf2, 0x3f, + 0xff, 0x50, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xd0, 0xd, 0xff, 0xb0, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0x5, 0xff, 0xf3, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x7, 0xff, 0xf1, 0x0, 0x0, + 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0xff, 0xf9, + 0x0, 0x0, 0x6f, 0xff, 0x10, 0x1, 0xff, 0xf6, + 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0x0, 0x0, 0xcf, 0xfb, 0x0, 0x0, + 0xbf, 0xfc, 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x40, 0x2, 0xff, 0xf5, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, 0x7, + 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x9, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf0, 0xd, 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, + 0xd0, 0xe, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x4, 0xff, 0xf3, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfb, 0x9f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf8, 0xaf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xef, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfe, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x1, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x10, 0x0, 0x3f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x80, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x10, + 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xc9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x54, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfa, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfa, 0x0, 0x5, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x2e, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf2, + + /* U+0079 "y" */ + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x6, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x50, 0x0, 0x9f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0x0, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, + 0x0, 0x4, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x90, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe0, 0x0, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0x0, 0x3f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x9f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xa0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x7, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf7, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x5f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, + 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xfd, 0x86, 0x8e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xef, 0xec, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x36, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x15, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x56, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x6c, 0xef, 0xf4, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xc6, 0x41, + 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xf1, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x34, 0x7f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb5, 0x31, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6c, + 0xef, 0xf4, + + /* U+007C "|" */ + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + 0xcf, 0xfc, 0xcf, 0xfc, 0xcf, 0xfc, + + /* U+007D "}" */ + 0x3f, 0xfe, 0xc6, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x4, 0x5b, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xe, 0xff, 0xf8, 0x43, 0x0, 0x0, 0x2f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x70, 0x0, 0x3, 0x5b, 0xff, 0xff, 0x30, 0x0, + 0x3f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x3f, 0xfe, 0xc7, 0x0, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9e, 0xff, 0xa3, 0x0, 0x0, + 0x0, 0x7, 0xcb, 0x1, 0xef, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xcf, 0xd0, 0xbf, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x2f, 0xfa, 0x2f, 0xff, + 0x50, 0x2a, 0xff, 0xfd, 0x41, 0x3d, 0xff, 0x66, + 0xff, 0x60, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x9f, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xf4, 0x7, 0xba, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xfe, 0xa2, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xdf, 0xe6, + 0x10, 0x29, 0xff, 0x90, 0x7, 0xfe, 0x20, 0x0, + 0x0, 0x6f, 0xf3, 0xe, 0xf7, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x1f, 0xf2, 0x0, 0x0, 0x0, 0x6, + 0xfd, 0x2f, 0xf1, 0x0, 0x0, 0x0, 0x5, 0xfe, + 0x1f, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xfd, 0xd, + 0xf8, 0x0, 0x0, 0x0, 0xd, 0xf9, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x9f, 0xf2, 0x0, 0xbf, 0xfa, + 0x53, 0x6c, 0xff, 0x70, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x4b, 0xef, 0xd9, + 0x30, 0x0, + + /* U+2022 "•" */ + 0x0, 0x16, 0x84, 0x0, 0x3, 0xef, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xff, 0xfc, + 0x5f, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xfa, + 0xa, 0xff, 0xff, 0xf2, 0x0, 0x8e, 0xfc, 0x30, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x48, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x94, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x20, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xcf, + 0xfe, 0xcf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0x9c, 0xff, + 0xec, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xdf, 0xff, 0xd9, 0x30, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xfd, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x5e, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xe5, 0xef, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x8, 0xfe, + 0xff, 0xe8, 0x88, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x88, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1d, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0xb, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, 0x1d, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x88, 0x9f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd8, 0x88, 0x8e, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, + 0x50, 0x0, 0x8, 0xff, 0xff, 0xe8, 0x88, 0x9f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd8, 0x88, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x80, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0xb, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0x0, 0x8, 0xff, + 0xff, 0xa0, 0x0, 0x1d, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x88, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd8, 0x88, 0x8e, 0xff, + 0xef, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x8, 0xfe, 0x5e, 0x80, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x8, 0xe5, + + /* U+F00B "" */ + 0x3, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x30, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, 0x19, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x2a, 0xbb, 0xbb, 0xbb, + 0xbb, 0x80, 0x0, 0x19, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa2, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x5, 0xdb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x22, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x17, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x79, 0x40, 0x0, 0x2, 0xef, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0x80, 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0xcf, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf4, 0x3f, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xb0, 0x4, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x3b, 0xc7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xac, 0x80, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xe3, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x3e, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfd, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfd, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x30, + 0x9, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xd0, + 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf4, 0x5f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf5, + 0x5f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xf5, 0x4f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf4, + 0x3f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x78, 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf1, + 0xd, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x90, + 0x3, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x51, 0x0, 0x0, 0x16, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9d, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x45, 0x54, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x34, 0x55, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, + 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xe6, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x7f, 0xfb, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xda, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xcc, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x40, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xad, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x6e, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, + 0x0, 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x55, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x2, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x2f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xfd, 0x7d, 0xff, 0xff, 0xff, 0xb3, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfb, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x5, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x2d, 0xfd, 0x20, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x4e, 0xff, 0xfe, 0x40, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x50, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xfe, 0x30, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xfc, 0x10, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xd2, 0x5, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf5, 0xef, 0xff, 0xff, + 0xf7, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xf4, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x4, 0xff, + 0xff, 0xf7, 0xa, 0xff, 0xd2, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x2, 0xdf, 0xfa, + 0x0, 0xc, 0xb1, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x1, 0xbc, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, 0x0, 0x0, + 0x3, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0x10, 0x0, + 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbc, 0xcc, 0xcc, 0xcb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x42, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x4, 0xff, 0xff, 0x40, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x4f, 0xf4, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc8, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2, 0xef, 0x90, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0x30, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x46, 0xff, 0xc4, 0x6f, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xfe, 0x10, 0x0, + 0xa, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, 0x5, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf5, 0x1, 0xef, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xe1, 0x9f, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x67, 0x75, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x5f, 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xa6, 0x42, 0x24, 0x7b, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xff, 0xff, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x21, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xef, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x4, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3, 0x55, 0x55, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x53, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x67, 0x77, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xec, 0xdd, 0xef, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf6, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xb7, 0x42, 0x24, 0x6b, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0xff, 0xff, 0xf5, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf5, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf6, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x67, 0x76, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0x3, 0x44, 0x44, 0x44, 0x44, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x33, 0x33, 0x33, 0x33, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xd2, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x4, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2, + 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4e, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xdf, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x2, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2d, 0xff, 0xf7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xef, + 0xe4, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x14, 0x10, + 0x0, 0x3b, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x16, 0x40, 0x0, + 0x0, 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xb1, 0x0, 0x0, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd2, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xe1, 0x0, 0x8, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xc0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0x34, 0x44, 0x44, 0x44, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0xa0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xd, 0xfe, 0x30, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0xa, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x5f, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2f, 0xff, 0xfe, + 0x0, 0x0, 0xdf, 0xff, 0x10, 0x2, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x3e, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xf4, 0x0, 0xe, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x5f, + 0xff, 0x60, 0x0, 0xdf, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x4, 0xff, 0xf7, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x4f, 0xff, 0x70, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0x5, 0xff, 0xf6, 0x0, 0xd, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x3, 0xdf, 0xff, 0x70, + 0x0, 0x9f, 0xff, 0x40, 0x0, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0xd, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x5, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, + 0xdf, 0xe3, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0xaf, 0xff, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x30, + 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x1f, 0xff, + 0xf0, 0x2a, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfc, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x10, + 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x20, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xfb, 0x10, 0x0, 0x1d, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, + 0x74, 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaa, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x67, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb7, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x4, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, + 0xf4, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0xf1, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x9f, 0xff, + 0xf9, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0x20, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xb0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x7, 0xff, 0xff, 0xf9, 0x0, 0x2, 0x68, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0x94, 0x10, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, + 0xff, 0xfd, 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x24, 0x44, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x41, 0xe, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xf4, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x98, 0xbb, 0xbb, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xfe, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x1, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, 0x91, 0x0, + 0x0, 0x0, 0x1, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, + 0x91, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x23, 0x33, + 0x33, 0x33, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x33, 0x33, 0x33, 0x20, 0x0, + + /* U+F04D "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x17, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, + + /* U+F051 "" */ + 0x1, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x44, 0x24, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfe, 0xef, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xaf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf0, 0x7b, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x7, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb7, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x44, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x8a, 0xff, 0xff, 0xff, 0xfa, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8b, 0xbb, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x84, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa1, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x36, 0xac, 0xde, 0xfe, 0xdc, 0xa6, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x0, 0x2, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x24, 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfa, 0x20, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x50, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x73, 0x2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x1, 0x69, 0xba, 0x61, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x27, + 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xcd, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, 0xff, + 0xed, 0xca, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x6e, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x4, 0x8a, 0xde, 0xff, 0xed, 0xb7, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xa3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0xde, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0x10, 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x57, 0x74, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x70, 0xd, + 0xff, 0xff, 0x80, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x30, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xa0, 0x8f, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xdb, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xf9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xcd, 0xe7, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xcd, 0xef, + 0xfe, 0xda, 0x73, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdd, 0x10, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xdf, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xce, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x79, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x52, 0x5c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x24, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x44, 0x44, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x40, 0x7, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf5, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x50, 0x5, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0xef, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5d, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, + 0x0, 0x0, 0x0, 0x5d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x5e, 0x20, 0x0, 0x0, 0xef, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0x60, 0x5, 0xff, + 0xe2, 0x0, 0x0, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x4f, 0xff, 0xfe, 0x20, 0x0, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x3, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x24, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x44, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xfc, 0xb, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf4, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x10, 0xbf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0x50, 0x0, 0xbf, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x50, 0x0, + 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, + 0x0, + + /* U+F078 "" */ + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, + 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xf5, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xf5, 0x8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf1, 0xbf, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x44, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xc0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x81, 0xdf, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x24, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x6, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x5b, 0xff, 0xff, + 0x5c, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0xb, 0xff, + 0xff, 0x40, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x70, 0xb, + 0xff, 0xff, 0x40, 0x1d, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, + 0xb, 0xff, 0xff, 0x40, 0x0, 0x53, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xeb, 0x10, 0xe, 0xff, 0xff, + 0x10, 0x9, 0xea, 0x10, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0xe, 0xff, + 0xff, 0x10, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfb, 0xe, + 0xff, 0xff, 0x19, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xae, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x74, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xa3, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x33, 0x33, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x33, 0x33, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0x11, 0x11, 0x10, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x88, 0x88, 0x88, 0x88, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2, 0xef, 0x90, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0x30, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x46, 0xff, 0xc4, 0x6f, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xea, 0x63, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xb8, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x96, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xee, + 0xdb, 0x86, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x34, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xdf, 0xfd, 0x81, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfe, 0x40, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xec, 0xef, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xcf, 0xff, 0xfb, 0x0, + 0x1b, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xef, 0xff, + 0xf2, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xef, 0xff, 0xf6, 0x0, 0x6, 0xff, + 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x85, + 0x8f, 0xff, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xab, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x34, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xec, 0xef, 0xff, + 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, + 0x1b, 0xff, 0xff, 0xc0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xef, 0xff, + 0xf2, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xef, 0xff, 0xf6, 0x0, 0x6, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xaf, 0xff, 0xff, 0x85, + 0x8f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x46, 0x64, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xab, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xe0, 0x68, 0x88, 0x88, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x48, 0x88, 0x88, 0x87, 0xbf, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x86, 0xf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xf, + 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xfe, 0x20, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x74, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x64, 0x6b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x17, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, + + /* U+F0C9 "" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + + /* U+F0E0 "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x10, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xf8, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x8f, 0xff, 0xc1, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x1c, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0x9e, 0xe9, 0x10, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb9, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + + /* U+F0E7 "" */ + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x68, 0x88, 0x88, 0x88, 0x88, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, 0xfe, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xc8, 0x88, 0x88, 0x86, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x72, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x27, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x3, 0x78, 0x88, 0x88, 0x88, 0x88, 0x80, 0x3, + 0x60, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xb0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xb0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, + 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x98, 0x88, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6, 0x88, 0x88, 0x88, 0x88, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbf, 0xff, 0xff, + 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9e, 0xfe, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, 0xfb, 0x0, + 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, 0xb0, 0x0, + 0xb, 0xff, 0x30, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x8, + 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x8f, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x8f, 0xf0, + 0x0, 0x0, 0xff, 0x80, 0x0, 0x8, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0x80, 0x0, 0x8, 0xff, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, + 0xfb, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0x30, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x88, 0x8b, 0xff, 0xd8, 0x88, + 0xaf, 0xfe, 0x88, 0x88, 0xbf, 0xfd, 0x88, 0x89, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0xff, + 0x90, 0x0, 0x1, 0xff, 0x70, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x1, 0xff, 0x60, 0x0, 0xe, 0xf9, 0x0, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x1f, 0xf6, 0x0, 0x0, 0xef, 0x90, 0x0, 0x1, + 0xff, 0x60, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xff, + 0x70, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x1f, 0xf7, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x98, 0x88, 0xbf, 0xfd, 0x88, + 0x8a, 0xff, 0xe8, 0x88, 0x8b, 0xff, 0xd8, 0x88, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x3, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x3, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8e, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x45, 0x78, 0x88, 0x87, 0x54, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdd, 0xcc, 0xdd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x73, 0x10, 0x0, 0x0, 0x0, 0x1, 0x37, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0xfd, 0x2e, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe2, 0x2, 0xef, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x9b, 0xde, 0xff, 0xed, 0xb9, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfe, 0x20, 0x0, + 0x2d, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x65, + 0x44, 0x56, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7c, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xaa, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xfa, 0x30, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xaf, 0xff, 0xfd, 0xa2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x1, 0x7b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa4, + 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0x88, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x65, 0x5a, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0x30, 0x0, 0x1d, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x90, 0x0, + 0x0, 0x19, 0xef, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x5, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x1, 0xef, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xd4, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x23, 0xcf, 0xfc, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x36, 0xff, 0xff, 0xfb, 0x20, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, + 0xaa, 0xaa, 0xaa, 0xdf, 0xff, 0xba, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbf, 0xff, + 0xff, 0xf9, 0x10, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x60, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xba, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xa4, 0x38, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x78, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x55, + 0x55, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xac, 0xef, + 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x1, 0x60, 0x1, 0xdf, 0xff, + 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x6f, + 0xff, 0xfc, 0x0, 0x1f, 0x60, 0x1, 0xef, 0xff, + 0xff, 0xf2, 0xa, 0xff, 0xff, 0xf6, 0x0, 0x6f, + 0xff, 0xc0, 0x1, 0xff, 0x60, 0x2, 0xef, 0xff, + 0xff, 0x50, 0xcf, 0xff, 0xff, 0x60, 0x0, 0x6f, + 0xfc, 0x0, 0x1f, 0xff, 0x10, 0x7, 0xff, 0xff, + 0xf7, 0xf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, + 0xc0, 0x1, 0xff, 0x30, 0x4, 0xff, 0xff, 0xff, + 0x90, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6c, + 0x0, 0x1f, 0x30, 0x3, 0xff, 0xff, 0xff, 0xfb, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x30, + 0x0, 0x30, 0x2, 0xef, 0xff, 0xff, 0xff, 0xc3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x80, 0x0, 0x90, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0xcc, 0x0, 0x1f, 0x90, 0x0, 0x8f, + 0xff, 0xff, 0xfa, 0xd, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0xcf, 0xc0, 0x1, 0xff, 0x80, 0x0, 0x9f, + 0xff, 0xff, 0x90, 0xbf, 0xff, 0xff, 0x20, 0x1, + 0xcf, 0xfd, 0x0, 0x1f, 0xfd, 0x0, 0x4, 0xff, + 0xff, 0xf7, 0x8, 0xff, 0xff, 0xfd, 0x11, 0xcf, + 0xff, 0xd0, 0x1, 0xfd, 0x10, 0x4, 0xff, 0xff, + 0xff, 0x40, 0x4f, 0xff, 0xff, 0xfd, 0xcf, 0xff, + 0xfd, 0x0, 0x1d, 0x10, 0x4, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x10, 0x5, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xde, 0xff, 0xfe, 0xca, 0x61, + 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xac, 0xcc, + 0xcc, 0xcc, 0xcc, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x64, + 0x44, 0x44, 0x44, 0x44, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x22, 0xef, 0xff, 0xf9, 0x9, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, + 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, + 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, + 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, + 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, + 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, + 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, + 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, + 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, + 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, + 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, + 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, + 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, + 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, + 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, + 0xff, 0xff, 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, + 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xc0, 0xc, 0xff, 0xff, 0x40, 0x4f, 0xff, + 0xfc, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xfc, 0x0, 0xcf, 0xff, 0xff, + 0x80, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0xcf, + 0xff, 0xf4, 0x4, 0xff, 0xff, 0xc0, 0xc, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe2, + 0x2e, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xfe, 0x22, + 0xef, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xfd, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x61, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xd1, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd1, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xd1, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x9f, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x9f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xfd, 0xb9, 0x86, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x1, 0xdf, 0xff, 0xff, 0xfd, + 0x10, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1, 0xdf, + 0xfd, 0x10, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x1d, 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x1, 0xdf, 0xfd, 0x10, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x1, 0xdf, 0xff, 0xff, 0xfd, 0x10, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, 0xc0, + 0x0, 0x8f, 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, + 0x8f, 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0x8f, + 0xf0, 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, + 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, + 0x0, 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, + 0x1f, 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, 0x1f, + 0xf6, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x8f, 0xf0, 0x0, 0x1f, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x88, 0xcf, 0xf8, 0x88, 0x8f, 0xfb, 0x88, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf2, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0xff, + 0xff, 0xff, 0x20, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 172, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 172, .box_w = 6, .box_h = 29, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 87, .adv_w = 250, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 17}, + {.bitmap_index = 159, .adv_w = 450, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 551, .adv_w = 397, .box_w = 23, .box_h = 39, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1000, .adv_w = 540, .box_w = 32, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1464, .adv_w = 439, .box_w = 26, .box_h = 30, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1854, .adv_w = 134, .box_w = 4, .box_h = 12, .ofs_x = 2, .ofs_y = 17}, + {.bitmap_index = 1878, .adv_w = 216, .box_w = 10, .box_h = 39, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 2073, .adv_w = 216, .box_w = 9, .box_h = 39, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 2249, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 15}, + {.bitmap_index = 2377, .adv_w = 372, .box_w = 19, .box_h = 18, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 2548, .adv_w = 145, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 2590, .adv_w = 245, .box_w = 12, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 2614, .adv_w = 145, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2635, .adv_w = 225, .box_w = 18, .box_h = 39, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 2986, .adv_w = 427, .box_w = 24, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3334, .adv_w = 237, .box_w = 11, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3494, .adv_w = 367, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3813, .adv_w = 366, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4132, .adv_w = 428, .box_w = 26, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4509, .adv_w = 367, .box_w = 22, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4828, .adv_w = 395, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5162, .adv_w = 383, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5481, .adv_w = 412, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5815, .adv_w = 395, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6134, .adv_w = 145, .box_w = 7, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6211, .adv_w = 145, .box_w = 7, .box_h = 28, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 6309, .adv_w = 372, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 6490, .adv_w = 372, .box_w = 19, .box_h = 13, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 6614, .adv_w = 372, .box_w = 19, .box_h = 19, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 6795, .adv_w = 367, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7100, .adv_w = 662, .box_w = 39, .box_h = 37, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 7822, .adv_w = 468, .box_w = 31, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8272, .adv_w = 484, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 8635, .adv_w = 463, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9027, .adv_w = 529, .box_w = 28, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9433, .adv_w = 429, .box_w = 21, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9738, .adv_w = 406, .box_w = 20, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10028, .adv_w = 494, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10420, .adv_w = 520, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10783, .adv_w = 198, .box_w = 5, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10856, .adv_w = 328, .box_w = 18, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11117, .adv_w = 460, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11480, .adv_w = 380, .box_w = 20, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11770, .adv_w = 611, .box_w = 30, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12205, .adv_w = 520, .box_w = 25, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12568, .adv_w = 538, .box_w = 31, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 13018, .adv_w = 462, .box_w = 23, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13352, .adv_w = 538, .box_w = 33, .box_h = 35, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 13930, .adv_w = 465, .box_w = 24, .box_h = 29, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14278, .adv_w = 397, .box_w = 23, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 14612, .adv_w = 376, .box_w = 24, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14960, .adv_w = 506, .box_w = 25, .box_h = 29, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15323, .adv_w = 456, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 15758, .adv_w = 721, .box_w = 43, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 16382, .adv_w = 431, .box_w = 27, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16774, .adv_w = 414, .box_w = 28, .box_h = 29, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 17180, .adv_w = 420, .box_w = 25, .box_h = 29, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17543, .adv_w = 213, .box_w = 9, .box_h = 39, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 17719, .adv_w = 225, .box_w = 18, .box_h = 39, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 18070, .adv_w = 213, .box_w = 10, .box_h = 39, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 18265, .adv_w = 373, .box_w = 18, .box_h = 17, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 18418, .adv_w = 320, .box_w = 20, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 18448, .adv_w = 384, .box_w = 11, .box_h = 6, .ofs_x = 4, .ofs_y = 25}, + {.bitmap_index = 18481, .adv_w = 383, .box_w = 19, .box_h = 22, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 18690, .adv_w = 436, .box_w = 23, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 19047, .adv_w = 365, .box_w = 21, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19278, .adv_w = 436, .box_w = 23, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19635, .adv_w = 392, .box_w = 22, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19877, .adv_w = 226, .box_w = 16, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20125, .adv_w = 442, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 20470, .adv_w = 436, .box_w = 21, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20796, .adv_w = 179, .box_w = 7, .box_h = 32, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 20908, .adv_w = 182, .box_w = 13, .box_h = 40, .ofs_x = -4, .ofs_y = -8}, + {.bitmap_index = 21168, .adv_w = 394, .box_w = 22, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 21509, .adv_w = 179, .box_w = 5, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 21587, .adv_w = 676, .box_w = 36, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 21983, .adv_w = 436, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 22214, .adv_w = 406, .box_w = 23, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22467, .adv_w = 436, .box_w = 23, .box_h = 30, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 22812, .adv_w = 436, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 23157, .adv_w = 262, .box_w = 13, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23300, .adv_w = 321, .box_w = 19, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23509, .adv_w = 265, .box_w = 16, .box_h = 27, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23725, .adv_w = 433, .box_w = 21, .box_h = 22, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23956, .adv_w = 358, .box_w = 24, .box_h = 22, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 24220, .adv_w = 575, .box_w = 36, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24616, .adv_w = 353, .box_w = 22, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24858, .adv_w = 358, .box_w = 24, .box_h = 30, .ofs_x = -1, .ofs_y = -8}, + {.bitmap_index = 25218, .adv_w = 333, .box_w = 19, .box_h = 22, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25427, .adv_w = 225, .box_w = 12, .box_h = 39, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 25661, .adv_w = 191, .box_w = 4, .box_h = 39, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 25739, .adv_w = 225, .box_w = 12, .box_h = 39, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 25973, .adv_w = 372, .box_w = 19, .box_h = 8, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 26049, .adv_w = 268, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = 16}, + {.bitmap_index = 26147, .adv_w = 201, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 26179, .adv_w = 640, .box_w = 40, .box_h = 41, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 26999, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27599, .adv_w = 640, .box_w = 40, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 28319, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28919, .adv_w = 440, .box_w = 28, .box_h = 28, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 29311, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 30111, .adv_w = 640, .box_w = 38, .box_h = 40, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 30871, .adv_w = 720, .box_w = 45, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 31681, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32481, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33156, .adv_w = 640, .box_w = 40, .box_h = 42, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 33996, .adv_w = 320, .box_w = 20, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34316, .adv_w = 480, .box_w = 30, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34796, .adv_w = 720, .box_w = 45, .box_h = 38, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 35651, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 36251, .adv_w = 440, .box_w = 28, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 36811, .adv_w = 560, .box_w = 25, .box_h = 37, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 37274, .adv_w = 560, .box_w = 35, .box_h = 42, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 38009, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 38639, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39269, .adv_w = 560, .box_w = 25, .box_h = 37, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 39732, .adv_w = 560, .box_w = 37, .box_h = 36, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 40398, .adv_w = 400, .box_w = 21, .box_h = 36, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 40776, .adv_w = 400, .box_w = 21, .box_h = 36, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 41154, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41784, .adv_w = 560, .box_w = 35, .box_h = 8, .ofs_x = 0, .ofs_y = 11}, + {.bitmap_index = 41924, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 42599, .adv_w = 800, .box_w = 51, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 43619, .adv_w = 720, .box_w = 47, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 44559, .adv_w = 640, .box_w = 40, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45279, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 45664, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 46049, .adv_w = 800, .box_w = 50, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46849, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 47449, .adv_w = 640, .box_w = 40, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 48249, .adv_w = 640, .box_w = 41, .box_h = 41, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 49090, .adv_w = 560, .box_w = 36, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49738, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 50438, .adv_w = 560, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51068, .adv_w = 560, .box_w = 35, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51628, .adv_w = 640, .box_w = 40, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 52228, .adv_w = 400, .box_w = 27, .box_h = 40, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 52768, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 53468, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 54168, .adv_w = 720, .box_w = 45, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 54843, .adv_w = 640, .box_w = 42, .box_h = 42, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 55725, .adv_w = 480, .box_w = 30, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 56325, .adv_w = 800, .box_w = 50, .box_h = 37, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 57250, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 57900, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 58550, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 59200, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 59850, .adv_w = 800, .box_w = 50, .box_h = 26, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 60500, .adv_w = 800, .box_w = 51, .box_h = 32, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61316, .adv_w = 560, .box_w = 31, .box_h = 40, .ofs_x = 2, .ofs_y = -5}, + {.bitmap_index = 61936, .adv_w = 560, .box_w = 35, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 62636, .adv_w = 640, .box_w = 41, .box_h = 41, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 63477, .adv_w = 800, .box_w = 50, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 64227, .adv_w = 480, .box_w = 30, .box_h = 40, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 64827, .adv_w = 644, .box_w = 41, .box_h = 26, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 6, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 29, 0, 17, -14, 0, 0, + 0, 0, -35, -38, 4, 30, 14, 11, + -26, 4, 31, 2, 27, 6, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 38, 5, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, -19, 0, 0, 0, 0, + 0, -13, 11, 13, 0, 0, -6, 0, + -4, 6, 0, -6, 0, -6, -3, -13, + 0, 0, 0, 0, -6, 0, 0, -8, + -10, 0, 0, -6, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -6, 0, -10, 0, -17, 0, -77, 0, + 0, -13, 0, 13, 19, 1, 0, -13, + 6, 6, 21, 13, -11, 13, 0, 0, + -36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -24, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -17, -8, -31, 0, -26, + -4, 0, 0, 0, 0, 1, 25, 0, + -19, -5, -2, 2, 0, -11, 0, 0, + -4, -47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -51, -5, 24, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, + 0, 6, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 13, 6, 19, -6, 0, 0, 13, -6, + -21, -88, 4, 17, 13, 1, -8, 0, + 23, 0, 20, 0, 20, 0, -60, 0, + -8, 19, 0, 21, -6, 13, 6, 0, + 0, 2, -6, 0, 0, -11, 51, 0, + 51, 0, 19, 0, 27, 8, 11, 19, + 0, 0, 0, -24, 0, 0, 0, 0, + 2, -4, 0, 4, -12, -8, -13, 4, + 0, -6, 0, 0, 0, -26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -35, 0, -40, 0, 0, 0, + 0, -4, 0, 63, -8, -8, 6, 6, + -6, 0, -8, 6, 0, 0, -34, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -62, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -40, 0, 38, 0, 0, -24, 0, + 21, 0, -44, -62, -44, -13, 19, 0, + 0, -43, 0, 8, -15, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 19, -78, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 0, 4, 0, 0, 0, + 0, 0, 4, 4, -8, -13, 0, -2, + -2, -6, 0, 0, -4, 0, 0, 0, + -13, 0, -5, 0, -15, -13, 0, -16, + -21, -21, -12, 0, -13, 0, -13, 0, + 0, 0, 0, -5, 0, 0, 6, 0, + 4, -6, 0, 2, 0, 0, 0, 6, + -4, 0, 0, 0, -4, 6, 6, -2, + 0, 0, 0, -12, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 8, -4, 0, + -8, 0, -11, 0, 0, -4, 0, 19, + 0, 0, -6, 0, 0, 0, 0, 0, + -2, 2, -4, -4, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -6, -8, 0, + 0, 0, 0, 0, 2, 0, 0, -4, + 0, -6, -6, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -4, -8, 0, -10, 0, -19, + -4, -19, 13, 0, 0, -13, 6, 13, + 17, 0, -16, -2, -8, 0, -2, -30, + 6, -4, 4, -34, 6, 0, 0, 2, + -33, 0, -34, -5, -56, -4, 0, -32, + 0, 13, 18, 0, 8, 0, 0, 0, + 0, 1, 0, -12, -8, 0, -19, 0, + 0, 0, -6, 0, 0, 0, -6, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -8, 0, 0, 0, 0, 0, 0, 0, + -6, -6, 0, -4, -8, -5, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -8, + 0, -4, 0, -13, 6, 0, 0, -8, + 3, 6, 6, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 4, + 0, 0, -6, 0, -6, -4, -8, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -7, -10, 0, + -12, 0, 19, -4, 2, -20, 0, 0, + 17, -32, -33, -27, -13, 6, 0, -5, + -42, -12, 0, -12, 0, -13, 10, -12, + -41, 0, -17, 0, 0, 3, -2, 5, + -4, 0, 6, 1, -19, -24, 0, -32, + -15, -13, -15, -19, -8, -17, -1, -12, + -17, 4, 0, 2, 0, -6, 0, 0, + 0, 4, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -3, 0, -2, -6, 0, -11, -14, + -14, -2, 0, -19, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + -12, 0, 0, 0, 0, -32, -19, 0, + 0, 0, -10, -32, 0, 0, -6, 6, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, -12, 0, + 0, 0, 0, 8, 0, 4, -13, -13, + 0, -6, -6, -8, 0, 0, 0, 0, + 0, 0, -19, 0, -6, 0, -10, -6, + 0, -14, -16, -19, -5, 0, -13, 0, + -19, 0, 0, 0, 0, 51, 0, 0, + 3, 0, 0, -8, 0, 6, 0, -28, + 0, 0, 0, 0, 0, -60, -12, 21, + 19, -5, -27, 0, 6, -10, 0, -32, + -3, -8, 6, -45, -6, 8, 0, 10, + -22, -10, -24, -21, -27, 0, 0, -38, + 0, 36, 0, 0, -3, 0, 0, 0, + -3, -3, -6, -17, -21, -1, -60, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -3, -6, -10, 0, 0, + -13, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -13, 0, 0, 13, + -2, 8, 0, -14, 6, -4, -2, -17, + -6, 0, -8, -6, -4, 0, -10, -11, + 0, 0, -5, -2, -4, -11, -8, 0, + 0, -6, 0, 6, -4, 0, -14, 0, + 0, 0, -13, 0, -11, 0, -11, -11, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 6, 0, -9, 0, -4, -8, + -20, -4, -4, -4, -2, -4, -8, -2, + 0, 0, 0, 0, 0, -6, -5, -5, + 0, 0, 0, 0, 8, -4, 0, -4, + 0, 0, 0, -4, -8, -4, -6, -8, + -6, 0, 5, 26, -2, 0, -17, 0, + -4, 13, 0, -6, -27, -8, 10, 1, + 0, -30, -11, 6, -11, 4, 0, -4, + -5, -20, 0, -10, 3, 0, 0, -11, + 0, 0, 0, 6, 6, -13, -12, 0, + -11, -6, -10, -6, -6, 0, -11, 3, + -12, -11, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -8, + 0, 0, -6, -6, 0, 0, 0, 0, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + -10, 0, -13, 0, 0, 0, -21, 0, + 4, -14, 13, 1, -4, -30, 0, 0, + -14, -6, 0, -26, -16, -18, 0, 0, + -28, -6, -26, -24, -31, 0, -17, 0, + 5, 43, -8, 0, -15, -6, -2, -6, + -11, -17, -12, -24, -26, -15, -6, 0, + 0, -4, 0, 2, 0, 0, -45, -6, + 19, 14, -14, -24, 0, 2, -20, 0, + -32, -4, -6, 13, -59, -8, 2, 0, + 0, -42, -8, -33, -6, -47, 0, 0, + -45, 0, 38, 2, 0, -4, 0, 0, + 0, 0, -3, -4, -24, -4, 0, -42, + 0, 0, 0, 0, -20, 0, -6, 0, + -2, -18, -30, 0, 0, -3, -10, -19, + -6, 0, -4, 0, 0, 0, 0, -29, + -6, -21, -20, -5, -11, -16, -6, -11, + 0, -13, -6, -21, -10, 0, -8, -12, + -6, -12, 0, 3, 0, -4, -21, 0, + 13, 0, -12, 0, 0, 0, 0, 8, + 0, 4, -13, 26, 0, -6, -6, -8, + 0, 0, 0, 0, 0, 0, -19, 0, + -6, 0, -10, -6, 0, -14, -16, -19, + -5, 0, -13, 5, 26, 0, 0, 0, + 0, 51, 0, 0, 3, 0, 0, -8, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -4, -13, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -6, -6, 0, 0, -13, + -6, 0, 0, -13, 0, 11, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 10, 13, 5, -6, 0, -20, + -10, 0, 19, -21, -20, -13, -13, 26, + 12, 6, -56, -4, 13, -6, 0, -6, + 7, -6, -22, 0, -6, 6, -8, -5, + -19, -5, 0, 0, 19, 13, 0, -18, + 0, -35, -8, 19, -8, -24, 2, -8, + -21, -21, -6, 26, 6, 0, -10, 0, + -17, 0, 5, 21, -15, -24, -26, -16, + 19, 0, 2, -47, -5, 6, -11, -4, + -15, 0, -14, -24, -10, -10, -5, 0, + 0, -15, -13, -6, 0, 19, 15, -6, + -35, 0, -35, -9, 0, -22, -37, -2, + -20, -11, -21, -18, 17, 0, 0, -8, + 0, -13, -6, 0, -6, -12, 0, 11, + -21, 6, 0, 0, -34, 0, -6, -14, + -11, -4, -19, -16, -21, -15, 0, -19, + -6, -15, -12, -19, -6, 0, 0, 2, + 30, -11, 0, -19, -6, 0, -6, -13, + -15, -17, -18, -24, -8, -13, 13, 0, + -10, 0, -32, -8, 4, 13, -20, -24, + -13, -21, 21, -6, 3, -60, -12, 13, + -14, -11, -24, 0, -19, -27, -8, -6, + -5, -6, -13, -19, -2, 0, 0, 19, + 18, -4, -42, 0, -38, -15, 15, -24, + -44, -13, -22, -27, -32, -21, 13, 0, + 0, 0, 0, -8, 0, 0, 6, -8, + 13, 4, -12, 13, 0, 0, -20, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 5, 19, 1, 0, -8, 0, 0, + 0, 0, -4, -4, -8, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 24, 0, 12, 2, 2, -8, + 0, 13, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -38, 0, -6, 11, 0, 19, + 0, 0, 63, 8, -13, -13, 6, 6, + -4, 2, -32, 0, 0, 31, -38, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -44, 24, 90, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -12, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -17, 0, + 0, 2, 0, 0, 6, 83, -13, -5, + 20, 17, -17, 6, 0, 0, 6, 6, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -83, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -18, + 0, 0, 0, -17, 0, 0, 0, 0, + -14, -3, 0, 0, 0, -14, 0, -8, + 0, -30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -43, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -6, 0, 0, -12, 0, -10, 0, + -17, 0, 0, 0, -11, 6, -8, 0, + 0, -17, -6, -15, 0, 0, -17, 0, + -6, 0, -30, 0, -7, 0, 0, -52, + -12, -26, -7, -23, 0, 0, -43, 0, + -17, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -10, -12, -5, -11, 0, 0, + 0, 0, -14, 0, -14, 8, -7, 13, + 0, -4, -15, -4, -11, -12, 0, -8, + -3, -4, 4, -17, -2, 0, 0, 0, + -56, -5, -9, 0, -14, 0, -4, -30, + -6, 0, 0, -4, -5, 0, 0, 0, + 0, 4, 0, -4, -11, -4, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 0, 0, 0, 0, + 0, -14, 0, -4, 0, 0, 0, -13, + 6, 0, 0, 0, -17, -6, -13, 0, + 0, -18, 0, -6, 0, -30, 0, 0, + 0, 0, -62, 0, -13, -24, -32, 0, + 0, -43, 0, -4, -10, 0, 0, 0, + 0, 0, 0, 0, 0, -6, -10, -3, + -10, 2, 0, 0, 11, -8, 0, 20, + 31, -6, -6, -19, 8, 31, 11, 14, + -17, 8, 27, 8, 19, 14, 17, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 30, -12, -6, 0, -5, + 51, 28, 51, 0, 0, 0, 6, 0, + 0, 24, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, -54, -8, -5, -26, + -31, 0, 0, -43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, -54, -8, -5, + -26, -31, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -15, 6, 0, -6, + 5, 12, 6, -19, 0, -1, -5, 6, + 0, 5, 0, 0, 0, 0, -16, 0, + -6, -4, -13, 0, -6, -26, 0, 40, + -6, 0, -14, -4, 0, -4, -11, 0, + -6, -18, -13, -8, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, -54, + -8, -5, -26, -31, 0, 0, -43, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, -20, -8, -6, 19, -6, -6, + -26, 2, -4, 2, -4, -17, 1, 14, + 1, 5, 2, 5, -15, -26, -8, 0, + -24, -12, -17, -27, -25, 0, -10, -13, + -8, -8, -5, -4, -8, -4, 0, -4, + -2, 10, 0, 10, -4, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -6, -6, 0, 0, + -17, 0, -3, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -8, + 0, 0, 0, 0, -5, 0, 0, -11, + -6, 6, 0, -11, -12, -4, 0, -19, + -4, -14, -4, -8, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -43, 0, 20, 0, 0, -12, 0, + 0, 0, 0, -8, 0, -6, 0, 0, + -3, 0, 0, -4, 0, -15, 0, 0, + 27, -8, -21, -20, 4, 7, 7, -1, + -18, 4, 10, 4, 19, 4, 21, -4, + -17, 0, 0, -26, 0, 0, -19, -17, + 0, 0, -13, 0, -8, -11, 0, -10, + 0, -10, 0, -4, 10, 0, -5, -19, + -6, 24, 0, 0, -6, 0, -13, 0, + 0, 8, -15, 0, 6, -6, 5, 1, + 0, -21, 0, -4, -2, 0, -6, 7, + -5, 0, 0, 0, -26, -8, -14, 0, + -19, 0, 0, -30, 0, 24, -6, 0, + -12, 0, 4, 0, -6, 0, -6, -19, + 0, -6, 6, 0, 0, 0, 0, -4, + 0, 0, 6, -8, 2, 0, 0, -8, + -4, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -40, 0, 14, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -6, -6, 0, 0, 0, 13, 0, 15, + 0, 0, 0, 0, 0, -40, -36, 2, + 28, 19, 11, -26, 4, 27, 0, 24, + 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_40 = { +#else +lv_font_t lv_font_montserrat_40 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 44, /*The maximum line height required by the font*/ + .base_line = 8, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_40*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_42.c b/inc/lvgl/src/font/lv_font_montserrat_42.c new file mode 100644 index 0000000..71fdd93 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_42.c @@ -0,0 +1,10090 @@ +/******************************************************************************* + * Size: 42 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 42 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_42.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_42 + #define LV_FONT_MONTSERRAT_42 1 +#endif + +#if LV_FONT_MONTSERRAT_42 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xb, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0xe0, 0x8, 0xff, + 0xfd, 0x0, 0x8f, 0xff, 0xc0, 0x7, 0xff, 0xfc, + 0x0, 0x7f, 0xff, 0xb0, 0x6, 0xff, 0xfa, 0x0, + 0x6f, 0xff, 0xa0, 0x5, 0xff, 0xf9, 0x0, 0x4f, + 0xff, 0x90, 0x4, 0xff, 0xf8, 0x0, 0x3f, 0xff, + 0x70, 0x3, 0xff, 0xf7, 0x0, 0x2f, 0xff, 0x60, + 0x1, 0xff, 0xf6, 0x0, 0x1f, 0xff, 0x50, 0x0, + 0xff, 0xf4, 0x0, 0xf, 0xff, 0x40, 0x0, 0x99, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x6f, 0xff, 0xb0, 0xf, 0xff, 0xff, 0x30, 0xff, + 0xff, 0xf4, 0xc, 0xff, 0xfe, 0x10, 0x1b, 0xfd, + 0x30, + + /* U+0022 "\"" */ + 0x5f, 0xff, 0x20, 0x0, 0xbf, 0xfc, 0x5f, 0xff, + 0x20, 0x0, 0xbf, 0xfb, 0x4f, 0xff, 0x10, 0x0, + 0xbf, 0xfb, 0x4f, 0xff, 0x10, 0x0, 0xaf, 0xfb, + 0x4f, 0xff, 0x0, 0x0, 0xaf, 0xfa, 0x3f, 0xff, + 0x0, 0x0, 0xaf, 0xfa, 0x3f, 0xff, 0x0, 0x0, + 0x9f, 0xf9, 0x3f, 0xff, 0x0, 0x0, 0x9f, 0xf9, + 0x2f, 0xff, 0x0, 0x0, 0x9f, 0xf9, 0x2f, 0xfe, + 0x0, 0x0, 0x8f, 0xf8, 0x2f, 0xfe, 0x0, 0x0, + 0x8f, 0xf8, 0x19, 0x98, 0x0, 0x0, 0x49, 0x94, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf2, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x1, 0x22, 0x22, 0x2b, + 0xff, 0x62, 0x22, 0x22, 0x22, 0xdf, 0xf4, 0x22, + 0x22, 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x12, 0x22, 0x23, 0xff, + 0xe2, 0x22, 0x22, 0x22, 0x5f, 0xfc, 0x22, 0x22, + 0x22, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xaf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x0, 0x0, + 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfe, 0xcf, 0xfe, 0xde, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x8f, 0xff, 0xfc, 0x40, 0x1f, 0xf9, 0x0, + 0x26, 0xcf, 0xf5, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf9, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x60, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x10, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xfb, 0x7f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfc, 0xaf, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x6e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0xa1, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x6, 0xfe, 0x50, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0xbf, 0xff, 0xd0, 0xd, 0xff, 0xfd, 0x72, + 0x0, 0x1f, 0xf9, 0x0, 0x4c, 0xff, 0xff, 0x50, + 0x1e, 0xff, 0xff, 0xff, 0xec, 0xbf, 0xfd, 0xbe, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, + 0xde, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x5b, 0xef, 0xea, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xbf, 0xfe, 0x97, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x10, 0x0, 0x2e, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x4f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0xdf, 0xe0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x10, 0x0, 0x0, 0x3f, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0xf2, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x20, 0x0, 0x9, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x9f, 0xf1, 0x0, 0x3, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0xd, 0xfe, 0x0, 0x0, 0xdf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf1, + 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0x9f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xc0, 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x3f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xe8, 0x79, 0xff, 0xf8, 0x0, 0xd, 0xff, + 0x50, 0x0, 0x4, 0x66, 0x40, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, + 0xa0, 0x0, 0x6e, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x5, 0xbe, 0xfe, 0xa4, 0x0, 0x4, 0xff, + 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf5, 0x0, 0x6f, 0xfd, 0x50, 0x5, 0xef, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0xe, 0xfe, 0x10, 0x0, 0x2, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfe, 0x10, 0x5, 0xff, 0x70, 0x0, 0x0, 0x7, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x40, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xa0, 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xe1, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0xc, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfe, 0x10, 0x0, 0x0, 0x7, 0xff, 0x40, + 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xff, 0x40, 0x0, 0x0, 0x0, 0x2f, 0xfb, + 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x88, 0xcf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xde, 0xfe, 0xc8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, 0x62, + 0x2, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd1, 0x0, 0x0, 0x3, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, 0xcf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0x0, 0x0, 0x9f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x30, 0x3c, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xfe, 0xcf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x91, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xaf, 0xa4, 0x0, 0x0, 0x5f, + 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x1, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, 0x3, 0xff, + 0xf5, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf4, 0x9, 0xff, 0xf1, 0x0, + 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x5f, 0xff, 0xb0, 0x0, 0xf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x4, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xd9, 0x77, 0x8a, 0xef, 0xff, 0xff, 0x9a, 0xff, + 0xff, 0x50, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x38, 0xcd, 0xff, 0xec, 0xa5, 0x10, 0x0, + 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x5f, 0xff, 0x25, 0xff, 0xf2, 0x4f, 0xff, 0x14, + 0xff, 0xf1, 0x4f, 0xff, 0x3, 0xff, 0xf0, 0x3f, + 0xff, 0x3, 0xff, 0xf0, 0x2f, 0xff, 0x2, 0xff, + 0xe0, 0x2f, 0xfe, 0x1, 0x99, 0x80, + + /* U+0028 "(" */ + 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0xd, + 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0xdf, 0xff, 0x10, 0x0, 0x4, 0xff, 0xfa, + 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0xf, + 0xff, 0xe0, 0x0, 0x0, 0x4f, 0xff, 0xa0, 0x0, + 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0xdf, 0xff, + 0x10, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x4, + 0xff, 0xfa, 0x0, 0x0, 0x6, 0xff, 0xf8, 0x0, + 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, 0xb, 0xff, + 0xf3, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, + 0xe, 0xff, 0xf1, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, + 0xc, 0xff, 0xf2, 0x0, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, 0x0, 0x6, + 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x10, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xe0, 0x0, 0x0, 0x9, 0xff, 0xf4, 0x0, 0x0, + 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x10, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, + 0xd, 0xff, 0xf1, 0x0, 0x0, 0x4, 0xff, 0xf8, + + /* U+0029 ")" */ + 0x6f, 0xff, 0x70, 0x0, 0x0, 0xd, 0xff, 0xf1, + 0x0, 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x5f, 0xff, + 0x90, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, + 0xf, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0xc, 0xff, 0xf2, 0x0, 0x0, + 0xc, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xf1, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xe0, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, + 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, + 0x70, 0x0, 0x0, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0xef, 0xff, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, + 0x0, 0x7, 0xff, 0xf7, 0x0, 0x0, 0xc, 0xff, + 0xf2, 0x0, 0x0, 0x2f, 0xff, 0xc0, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0xef, 0xff, 0x0, + 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0xd, 0xff, + 0xf1, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x10, + 0x5, 0xe6, 0x0, 0xd, 0xfa, 0x0, 0x8, 0xf2, + 0xd, 0xff, 0xc3, 0xd, 0xfa, 0x5, 0xef, 0xfa, + 0x8, 0xff, 0xff, 0x9d, 0xfb, 0xbf, 0xff, 0xe6, + 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x8, 0xff, 0xff, 0x9d, 0xfb, 0xbf, 0xff, 0xe6, + 0xd, 0xff, 0xc3, 0xd, 0xfa, 0x5, 0xef, 0xfa, + 0x5, 0xe6, 0x0, 0xd, 0xfa, 0x0, 0x8, 0xf2, + 0x0, 0x10, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xdd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x16, 0x66, + 0x66, 0x66, 0xbf, 0xff, 0x66, 0x66, 0x66, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x9, 0xed, 0x50, 0x9f, 0xff, 0xf2, 0xef, 0xff, + 0xf7, 0xef, 0xff, 0xf7, 0x8f, 0xff, 0xf5, 0x8, + 0xff, 0xf0, 0x7, 0xff, 0xb0, 0xa, 0xff, 0x50, + 0xe, 0xff, 0x0, 0x2f, 0xfb, 0x0, 0x6f, 0xf5, + 0x0, 0xaf, 0xf1, 0x0, + + /* U+002D "-" */ + 0x59, 0x99, 0x99, 0x99, 0x99, 0x96, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+002E "." */ + 0x0, 0x8d, 0xc4, 0x0, 0x9f, 0xff, 0xf2, 0xf, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0x20, 0x1a, 0xed, 0x50, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0x88, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfe, 0xb7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xaf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x30, 0xa, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf0, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, + 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0xef, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfe, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x8f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf5, 0xf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, + 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xa0, 0x3, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfa, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x7b, 0xbb, 0xbb, 0xbf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf2, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x48, 0xce, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x2f, 0xff, + 0xff, 0xb6, 0x10, 0x0, 0x2, 0x7f, 0xff, 0xff, + 0x80, 0x0, 0x5f, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xfe, 0x0, 0x0, 0x3c, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, + + /* U+0033 "3" */ + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xfb, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xcc, 0xde, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5c, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x0, 0x2b, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0xb, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x4, + 0xff, 0xff, 0xe8, 0x40, 0x0, 0x0, 0x16, 0xdf, + 0xff, 0xfd, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xdd, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xac, 0xef, 0xfe, 0xda, 0x61, 0x0, 0x0, + 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x7, 0x88, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x96, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbf, 0xff, 0xfb, 0xbb, 0xbb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xcb, 0xbb, 0xa9, 0x85, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x59, 0xef, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x60, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf2, 0x4, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0xcf, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0x40, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8b, 0xde, 0xff, 0xeb, 0x83, 0x0, 0x0, + 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xfd, 0xbb, 0xce, 0xff, 0xf5, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf9, 0x30, 0x0, 0x0, 0x2, 0x7c, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf7, 0x0, 0x0, 0x4, 0x57, 0x65, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x5, 0xbf, 0xff, + 0xff, 0xff, 0xe8, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0xff, 0xff, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, 0xfe, 0xff, + 0xfc, 0x62, 0x0, 0x25, 0xbf, 0xff, 0xff, 0x30, + 0xef, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfd, 0xd, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xcf, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x89, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x6f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xc2, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfb, 0xd, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x6f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, + 0x3, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0x60, 0x0, 0x7, 0xff, 0xff, 0xfe, + 0xa8, 0x89, 0xcf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbd, 0xef, 0xfd, 0x94, 0x0, 0x0, + 0x0, + + /* U+0037 "7" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6b, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xf2, 0xbf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x40, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x1, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xfe, 0xdb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xea, 0x88, 0x8a, 0xef, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0x40, 0x0, 0xb, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, + 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xa0, 0x0, 0x2, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfa, 0x75, 0x45, 0x7a, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xa5, 0x20, 0x0, 0x25, + 0xaf, 0xff, 0xff, 0x60, 0x0, 0x2f, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0x20, 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x22, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf2, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xe0, 0x8, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, + 0x0, 0x1e, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x4f, 0xff, + 0xff, 0xfd, 0xa8, 0x78, 0xad, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, + 0xff, 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfe, 0xdb, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, 0x98, + 0x8a, 0xef, 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0x20, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfc, 0x0, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xb0, 0xcf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x1c, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf4, 0xbf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x88, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xfb, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc0, 0xbf, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, + 0xfd, 0x1, 0xef, 0xff, 0xff, 0xc9, 0x88, 0xae, + 0xff, 0xff, 0x9f, 0xff, 0xd0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x65, 0xff, 0xfd, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x17, 0xbe, + 0xff, 0xec, 0x83, 0x0, 0x7, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x30, 0x0, + 0x1, 0xd7, 0x20, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, 0xec, 0xbb, + 0xdf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xad, 0xef, 0xfe, 0xca, 0x51, 0x0, 0x0, 0x0, + 0x0, + + /* U+003A ":" */ + 0x1, 0xae, 0xd5, 0x0, 0xaf, 0xff, 0xf3, 0xf, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0x9, 0xff, + 0xff, 0x20, 0x8, 0xdb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xdc, 0x40, 0x9, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xf7, 0xf, 0xff, + 0xff, 0x70, 0xaf, 0xff, 0xf2, 0x1, 0xae, 0xd5, + 0x0, + + /* U+003B ";" */ + 0x1, 0xae, 0xd5, 0x0, 0xaf, 0xff, 0xf3, 0xf, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xf7, 0x9, 0xff, + 0xff, 0x20, 0x8, 0xdb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xed, 0x50, 0x9, + 0xff, 0xff, 0x20, 0xef, 0xff, 0xf7, 0xe, 0xff, + 0xff, 0x70, 0x8f, 0xff, 0xf5, 0x0, 0x8f, 0xff, + 0x0, 0x7, 0xff, 0xb0, 0x0, 0xaf, 0xf5, 0x0, + 0xe, 0xff, 0x0, 0x2, 0xff, 0xb0, 0x0, 0x6f, + 0xf5, 0x0, 0xa, 0xff, 0x10, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xfe, 0x81, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, + 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, 0x6c, 0xff, + 0xff, 0xff, 0xd7, 0x10, 0x0, 0x0, 0x2, 0x9e, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7e, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, + 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xef, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xea, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + + /* U+003D "=" */ + 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x64, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x64, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, + + /* U+003E ">" */ + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xff, 0xff, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xfb, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7d, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8e, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xff, 0xd7, 0x10, 0x0, 0x0, 0x3, 0x9f, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xed, 0xa7, + 0x10, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xec, 0xbb, 0xcf, + 0xff, 0xff, 0xfe, 0x10, 0x5f, 0xff, 0xff, 0x93, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x90, 0x9, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xe0, 0x0, 0x4b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x66, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd4, 0x0, 0x0, + 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, + 0xcd, 0xef, 0xfe, 0xdb, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, 0xfd, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xfd, 0x84, 0x10, 0x0, 0x0, 0x2, + 0x59, 0xef, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x44, 0x20, 0x0, + 0x0, 0x15, 0x55, 0x10, 0xbf, 0xfe, 0x10, 0x0, + 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5b, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x6f, 0xff, 0x40, + 0xc, 0xff, 0xa0, 0x0, 0x0, 0xaf, 0xfd, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x6f, 0xff, 0x40, 0x2, 0xff, 0xf3, 0x0, + 0x2, 0xff, 0xf3, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x6f, 0xff, 0x40, + 0x0, 0x7f, 0xfb, 0x0, 0x9, 0xff, 0xb0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x94, 0x10, 0x14, 0xaf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xe, 0xff, 0x20, + 0xe, 0xff, 0x40, 0x0, 0x0, 0xbf, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x40, + 0x0, 0x8, 0xff, 0x70, 0x4f, 0xfe, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x40, 0x0, 0x2, 0xff, 0xc0, + 0x8f, 0xf9, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xef, 0xf0, 0xaf, 0xf6, 0x0, 0x0, + 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0xbf, 0xf2, + 0xdf, 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, + 0x0, 0x0, 0x8f, 0xf4, 0xef, 0xf2, 0x0, 0x0, + 0x4f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xf5, + 0xff, 0xf1, 0x0, 0x0, 0x5f, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x40, + 0x0, 0x0, 0x7f, 0xf6, 0xff, 0xf1, 0x0, 0x0, + 0x5f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xf5, + 0xef, 0xf2, 0x0, 0x0, 0x4f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x0, 0x8f, 0xf4, 0xdf, 0xf4, 0x0, 0x0, + 0x1f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0xaf, 0xf3, + 0xaf, 0xf6, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xdf, 0xf0, 0x7f, 0xfa, 0x0, 0x0, + 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x40, 0x0, 0x1, 0xff, 0xd0, + 0x3f, 0xfe, 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x50, + 0x0, 0x7, 0xff, 0x80, 0xe, 0xff, 0x40, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, 0x20, + 0x9, 0xff, 0xc0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xe9, 0x54, 0x69, 0xef, 0xff, 0x6e, 0xff, 0xfa, + 0x57, 0xef, 0xfa, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0xcf, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x1e, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x16, 0xbe, 0xff, 0xeb, 0x60, + 0x0, 0x0, 0x7, 0xdf, 0xfc, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, 0x95, + 0x20, 0x0, 0x0, 0x14, 0x7c, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x69, 0xce, 0xff, 0xfe, 0xca, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, + 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x80, + 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf3, 0x0, + 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xa7, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0xdf, 0xff, 0x70, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, + 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, + 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, + 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, + 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, + 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, + + /* U+0042 "B" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x9f, + 0xff, 0xc7, 0x77, 0x77, 0x77, 0x78, 0x8b, 0xef, + 0xff, 0xff, 0xc0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xf6, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x10, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x7d, 0xff, 0xff, 0x70, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x9f, 0xff, 0xc7, 0x77, 0x77, 0x77, 0x77, 0x78, + 0xad, 0xff, 0xff, 0xfb, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0x80, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xd0, 0x9f, 0xff, 0xc7, 0x77, 0x77, 0x77, + 0x77, 0x78, 0xad, 0xff, 0xff, 0xff, 0x30, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, + 0xde, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0x70, 0x0, 0xaf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xc1, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xc1, 0x0, 0x1f, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x6, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcc, 0x10, 0x0, 0xa, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, + 0xfd, 0x10, 0x0, 0xb, 0xff, 0xff, 0xfe, 0x83, + 0x0, 0x0, 0x2, 0x7d, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xed, 0xef, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xff, + 0xec, 0x84, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x9, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xcd, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0x70, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0x30, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfd, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf5, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x19, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x79, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf9, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xa9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x99, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x49, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xf3, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf7, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbc, + 0xdf, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xca, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb1, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x9f, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa3, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, + + /* U+0046 "F" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb1, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbd, 0xef, + 0xfe, 0xc9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xed, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf9, 0x40, 0x0, + 0x0, 0x15, 0xaf, 0xff, 0xff, 0xc0, 0x0, 0xa, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0x30, 0x0, 0x6f, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xe3, 0x0, 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x22, 0x20, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x9f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x8, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x1, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, + 0x0, 0xa, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x14, + 0x9f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, 0xfd, 0xc9, + 0x51, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xce, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + + /* U+0049 "I" */ + 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, + 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, + 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, + 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, + 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, + 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, + 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, + 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, 0x99, 0xff, + 0xf9, 0x9f, 0xff, 0x99, 0xff, 0xf9, 0x9f, 0xff, + 0x99, 0xff, 0xf9, + + /* U+004A "J" */ + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf0, 0x6, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0x2, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x2c, 0xff, 0xff, 0x50, 0xa, + 0xff, 0xff, 0xfe, 0xcb, 0xdf, 0xff, 0xff, 0xc0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, + 0xfe, 0xc8, 0x30, 0x0, 0x0, + + /* U+004B "K" */ + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xd1, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xd1, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe2, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xe2, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf3, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x5f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x5f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x4f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0x35, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x30, + 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x9, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xc, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf2, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd1, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xb0, + + /* U+004C "L" */ + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x69, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, + + /* U+004D "M" */ + 0x9f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, + 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, + 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0xff, 0xfa, + 0x9f, 0xff, 0x7d, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd6, 0xff, 0xfa, + 0x9f, 0xff, 0x74, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x45, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfa, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf1, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0xdf, 0xff, 0x40, 0x0, + 0x0, 0x2, 0xff, 0xfe, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0xb, 0xff, 0xf7, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x2, 0xff, 0xff, 0x10, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x8f, 0xff, 0x90, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf3, + 0xe, 0xff, 0xe1, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x6, 0xff, 0xfc, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + + /* U+004E "N" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x9b, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x2f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x5, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0xb, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x3f, 0xff, 0xfe, 0x20, 0x0, 0x8, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xd0, 0x0, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x8, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x70, 0x8, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf3, 0x8, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x18, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xc8, 0xff, 0xfb, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfb, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xfb, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfb, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, + 0x0, 0x26, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, + 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x0, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf2, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x0, + 0x1, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe8, 0x30, 0x0, + 0x0, 0x26, 0xcf, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd9, + 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xb0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x19, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf6, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xda, 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfe, 0xde, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xe8, + 0x30, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x50, 0x0, 0x8, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xfd, 0x0, 0x0, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x4f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x8, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0xcf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0xe, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe0, 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x40, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xe0, 0x0, 0x2, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xfd, 0x61, 0x0, 0x0, 0x0, 0x5b, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xfe, 0xcb, 0xbd, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xff, 0xff, + 0xf6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x3, 0xcf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xfb, 0x86, 0x8c, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xb6, + 0x10, 0x0, + + /* U+0052 "R" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xd9, + 0x61, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x9, 0xff, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbc, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0x50, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfe, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xb0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x19, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf7, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfe, 0x10, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0x60, 0x9, 0xff, 0xfd, 0xaa, + 0xaa, 0xaa, 0xab, 0xcf, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x30, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x9f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf9, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, 0xff, 0xec, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xdb, 0xab, 0xcf, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x8f, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, + 0x38, 0xef, 0xf6, 0x0, 0x0, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x8d, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, + 0x7, 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xc0, 0xe, 0xff, 0xff, 0xa5, + 0x10, 0x0, 0x0, 0x1, 0x6e, 0xff, 0xff, 0x40, + 0x1d, 0xff, 0xff, 0xff, 0xfd, 0xcb, 0xab, 0xdf, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0xbd, 0xff, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x79, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbe, 0xff, 0xfd, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0xdf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0xaf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd0, 0x7f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xa0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0xf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x20, 0x9, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfb, 0x0, + 0x2, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, + 0xde, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xde, 0xfe, + 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x1f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0xaf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf9, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x0, 0x0, + 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0xb, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, 0x2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf2, 0xf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x96, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xdf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0057 "W" */ + 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0xd, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x20, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xc0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, + 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0x8f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf3, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf7, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x7, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf3, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xfd, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x80, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xb, 0xff, 0xf3, 0x0, + 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x1, 0xff, 0xfd, 0x0, 0x0, 0x7, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, + 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, 0xb, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, + 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xb0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x0, 0xb, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x30, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf8, 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x6f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xc, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x37, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0xcf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xef, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x6, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, 0x0, 0xbf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfd, 0x0, 0x0, 0x1e, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x20, 0x0, + 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xc0, 0x5, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf7, 0x1e, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x4f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xb0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x10, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1e, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, + 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x2f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf5, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x4f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xd0, 0x0, 0x1, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf4, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, 0x4f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x50, 0xd, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xeb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+005B "[" */ + 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, + 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, + 0xff, 0xa6, 0x66, 0x61, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xa6, 0x66, + 0x61, 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xf3, + + /* U+005C "\\" */ + 0x48, 0x88, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfc, + + /* U+005D "]" */ + 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x16, + 0x66, 0x6a, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x16, 0x66, 0x6a, 0xff, + 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, 0x3f, 0xff, + 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, 0xff, 0xf9, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd4, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf6, 0xe, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x10, 0x8f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x1, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf3, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x5f, + 0xfd, 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x60, 0x0, 0x0, 0xef, 0xf4, 0x0, + 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, + 0xa0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x10, 0x0, 0xf, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xbf, 0xf7, 0x0, 0x6, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xe0, 0x0, 0xdf, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, + 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xfb, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf2, + + /* U+005F "_" */ + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0060 "`" */ + 0x6, 0x88, 0x88, 0x20, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, + + /* U+0061 "a" */ + 0x0, 0x0, 0x16, 0xad, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0xe, 0xff, + 0xff, 0xfc, 0xa9, 0xac, 0xff, 0xff, 0xfe, 0x10, + 0x6, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0x80, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x5a, 0xde, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x2f, 0xff, 0xfc, 0x51, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x9f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0xdf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, + 0xef, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf7, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0x8f, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf7, 0x2f, 0xff, + 0xff, 0x95, 0x33, 0x59, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, + 0xff, 0xf7, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x15, 0xff, 0xf7, 0x0, 0x0, 0x5a, 0xdf, + 0xfe, 0xc8, 0x30, 0x5, 0xff, 0xf7, + + /* U+0062 "b" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x27, 0xce, 0xff, 0xda, 0x50, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xd2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x2f, 0xff, 0xee, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x2f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe0, + 0x2f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x2f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x2f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, + 0x2f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x2f, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, + 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x60, 0x2f, 0xff, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xcd, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xff, 0xd1, 0x0, 0x2f, 0xff, 0xb2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x2f, 0xff, 0xb0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x0, + 0x28, 0xce, 0xff, 0xda, 0x60, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xdb, 0xab, + 0xef, 0xff, 0xff, 0xa0, 0x0, 0x1e, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xf5, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0x80, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x93, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x93, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x1e, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xf5, 0x0, 0x3, 0xff, 0xff, 0xff, 0xeb, 0xab, + 0xef, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, + 0xff, 0xda, 0x50, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, + 0x7b, 0xef, 0xfd, 0xb6, 0x10, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xfd, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xfc, 0xff, 0xfd, 0x0, 0x2f, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x4, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0xe, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfd, 0xe, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfd, 0x4, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfd, + 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfd, 0x0, 0x2f, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xdb, 0xac, 0xef, + 0xff, 0xfa, 0xff, 0xfd, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xfd, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x2, + 0x7b, 0xef, 0xfd, 0xb6, 0x0, 0x0, 0xff, 0xfd, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, 0xb7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xea, + 0x88, 0xae, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2f, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xc0, 0x0, 0xb, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0x70, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0xe, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x91, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfc, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xd1, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfe, + 0xba, 0xac, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xde, 0xfe, 0xdb, 0x61, 0x0, 0x0, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfd, 0x92, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x76, + 0xaf, 0x60, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x26, 0x66, + 0xcf, 0xff, 0xa6, 0x66, 0x66, 0x50, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x2, 0x8b, 0xef, 0xfd, 0xb7, + 0x10, 0x0, 0xbf, 0xff, 0x10, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0xb, 0xff, + 0xf1, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0xbf, 0xff, 0x10, 0x0, 0x7f, + 0xff, 0xff, 0xfd, 0xba, 0xbd, 0xff, 0xff, 0xed, + 0xff, 0xf1, 0x0, 0x4f, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0x10, 0xe, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, + 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x12, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x3f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x13, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x1f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x10, 0xef, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, 0xa, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xf1, + 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0x10, 0x1, 0xef, 0xff, + 0xfe, 0x83, 0x10, 0x13, 0x8e, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xef, 0xff, 0x10, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x58, 0x99, 0x75, 0x10, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x2, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, + 0x0, 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xfe, 0x0, 0x0, 0x5f, 0xff, + 0xe7, 0x20, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0xff, 0xec, 0xaa, + 0xac, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x8c, 0xde, 0xff, 0xec, 0x84, + 0x0, 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x38, + 0xce, 0xfe, 0xda, 0x50, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x2f, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xdb, 0xce, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xc0, 0x2f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, + 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfe, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + + /* U+0069 "i" */ + 0x2, 0x66, 0x0, 0x4f, 0xff, 0xd1, 0xcf, 0xff, + 0xf7, 0xdf, 0xff, 0xf7, 0x8f, 0xff, 0xf2, 0x8, + 0xcc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, + 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, + 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, + 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, + 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, + 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, + 0xff, 0xd0, 0x2f, 0xff, 0xd0, 0x2f, 0xff, 0xd0, + 0x2f, 0xff, 0xd0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x5, 0xcc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x4, 0x0, 0x0, 0x1d, 0xff, 0xf9, + 0x0, 0xfe, 0x98, 0x9e, 0xff, 0xff, 0x30, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x6, 0xbe, 0xff, 0xda, + 0x30, 0x0, 0x0, + + /* U+006B "k" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x50, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x60, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x60, 0x0, 0x2, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x1d, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x2e, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x2e, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfd, 0x3e, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x40, 0x9f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x30, 0x0, 0xcf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x30, + 0x0, 0x1, 0xef, 0xff, 0xe2, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x20, 0x2, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfa, 0x2, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, + + /* U+006C "l" */ + 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, + 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, + 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, + 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, + 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, + 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, + 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, + 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, + 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, 0x2f, 0xff, + 0xd2, 0xff, 0xfd, 0x2f, 0xff, 0xd2, 0xff, 0xfd, + + /* U+006D "m" */ + 0x2f, 0xff, 0xb0, 0x0, 0x5a, 0xde, 0xfe, 0xc8, + 0x30, 0x0, 0x0, 0x0, 0x49, 0xce, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x2f, 0xff, + 0xb7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x2f, 0xff, 0xef, 0xff, 0xfc, 0x98, 0x9c, + 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xfe, 0xa8, 0x8a, + 0xef, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x2f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfa, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfc, + + /* U+006E "n" */ + 0x2f, 0xff, 0xb0, 0x0, 0x49, 0xce, 0xfe, 0xda, + 0x50, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x2f, 0xff, + 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x2f, 0xff, 0xef, 0xff, 0xfd, 0x98, 0x8a, + 0xef, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x2f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf4, 0x2f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, + 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, 0x2f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xc9, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xdb, 0xab, 0xef, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xd0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf4, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xd0, 0x0, 0xaf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, + 0x0, 0x1e, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xfe, 0xd9, + 0x40, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0x2f, 0xff, 0xb0, 0x0, 0x38, 0xce, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xb0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, + 0x2f, 0xff, 0xb4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x2f, 0xff, 0xdf, 0xff, + 0xfe, 0x97, 0x68, 0xbf, 0xff, 0xff, 0xe1, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xe0, 0x2f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf4, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf8, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0x2f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x2f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, + 0x2f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xd0, 0x2f, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xed, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xff, 0xd1, 0x0, + 0x2f, 0xff, 0xd1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x2f, 0xff, 0xd0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x27, 0xce, 0xff, 0xda, + 0x60, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xb6, + 0x10, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xfd, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xfa, 0xff, 0xfd, + 0x0, 0x2f, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, + 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfd, 0xa, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfd, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfd, + 0x0, 0x2f, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xdb, 0xac, 0xef, 0xff, 0xfc, 0xff, 0xfd, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x93, 0xff, 0xfd, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfd, 0xa5, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, + + /* U+0072 "r" */ + 0x2f, 0xff, 0xb0, 0x0, 0x49, 0xce, 0xc2, 0xff, + 0xfb, 0x2, 0xcf, 0xff, 0xfc, 0x2f, 0xff, 0xb3, + 0xff, 0xff, 0xff, 0xc2, 0xff, 0xfc, 0xef, 0xff, + 0xff, 0xfc, 0x2f, 0xff, 0xff, 0xff, 0xa4, 0x10, + 0x2, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, 0xc9, 0x61, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xff, + 0xda, 0x89, 0xac, 0xff, 0xff, 0x50, 0xd, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x5d, 0xc0, 0x2, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xa6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x10, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x27, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x58, 0xbf, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xc0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfb, 0x1f, 0xfd, 0x72, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x68, 0xff, 0xff, 0xfe, + 0xba, 0x99, 0xbe, 0xff, 0xff, 0xd0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x1, 0x59, 0xce, 0xff, 0xed, 0xa7, + 0x10, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x26, 0x66, 0xcf, 0xff, + 0xa6, 0x66, 0x66, 0x50, 0x0, 0x0, 0x9, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x3, 0x10, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xc8, 0x8b, 0xf8, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x18, 0xce, 0xfe, 0xb7, 0x0, + + /* U+0075 "u" */ + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xf9, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf9, 0x6f, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x5f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf9, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x3f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf9, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf9, 0xa, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf9, 0x3, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xfc, 0xbc, 0xef, + 0xff, 0xfc, 0xff, 0xf9, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xf9, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x4, + 0xff, 0xf9, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xfd, + 0xb6, 0x10, 0x4, 0xff, 0xf9, + + /* U+0076 "v" */ + 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x40, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xd0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, 0x9, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x10, 0x0, 0x2f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x90, 0x0, 0x0, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x7, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x4f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x40, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x9f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x80, 0xf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x6, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xf6, 0xdf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf5, 0x3f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xe0, 0xd, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x90, 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x30, 0x2, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xef, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xf8, 0x0, 0x0, 0x6f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x8c, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf2, 0x0, 0x0, 0x1f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x26, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, + 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xdf, + 0xfc, 0x0, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, + 0x0, 0x3, 0xff, 0xf6, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0x0, 0x8f, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xff, 0xfc, 0x0, 0x0, 0x9, 0xff, 0xf1, 0x0, + 0x4f, 0xff, 0x60, 0x0, 0x0, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0xe, + 0xff, 0xa0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x4, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x70, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xf2, 0x0, 0x9, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xd0, 0x0, 0xbf, 0xfe, 0x0, + 0x0, 0x2, 0xff, 0xf8, 0x0, 0xf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf3, 0x1, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, + 0x5f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf8, 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x30, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xc, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0x91, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x6f, 0xff, 0x70, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xe6, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x10, 0x0, + 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x9f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x50, 0x1e, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x2c, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf9, 0x7, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0xb, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x20, 0x0, 0x1e, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0x60, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xe1, 0x0, 0x0, 0x8f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x1e, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x30, + + /* U+0079 "y" */ + 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x40, 0x6f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xd0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x8, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf2, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, + 0x0, 0x5f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x80, 0x0, 0xc, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x3, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, 0x9f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x1f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x37, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0xef, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x91, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfa, 0x89, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xef, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x6a, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xff, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x76, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x47, 0x9f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x76, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x39, 0xdf, 0xff, + + /* U+007C "|" */ + 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, + 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, + 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, + 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, + 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, + 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, + 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, + 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, + 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, + 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, + 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, 0xff, 0x29, + 0xff, 0xf2, 0x9f, 0xff, 0x29, 0xff, 0xf2, 0x9f, + 0xff, 0x29, 0xff, 0xf2, + + /* U+007D "}" */ + 0x3f, 0xff, 0xc8, 0x10, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x1, 0x68, 0xcf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xaf, 0xff, 0xe8, 0x72, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x16, 0x8c, 0xff, 0xff, 0x80, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xfc, + 0x81, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0xae, 0xe0, 0x1, 0xdf, 0xff, + 0xff, 0xfe, 0x40, 0x0, 0x0, 0xe, 0xfe, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x5, + 0xff, 0xb0, 0x1f, 0xff, 0x81, 0x6, 0xef, 0xff, + 0xc5, 0x37, 0xff, 0xf6, 0x4, 0xff, 0xb0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, + 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x30, 0x6, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x3a, + 0xef, 0xe9, 0x20, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x29, 0xdf, 0xec, 0x60, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x7f, 0xfd, 0x75, 0x5a, 0xff, 0xe1, 0x0, 0x2f, + 0xfa, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x9, 0xfd, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x30, 0xef, 0x70, + 0x0, 0x0, 0x0, 0xe, 0xf8, 0xf, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xa0, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xb, 0xfa, 0xe, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x80, 0x9f, 0xd0, 0x0, 0x0, + 0x0, 0x6f, 0xf3, 0x2, 0xff, 0xb0, 0x0, 0x0, + 0x4f, 0xfc, 0x0, 0x7, 0xff, 0xe8, 0x56, 0xaf, + 0xfe, 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x2, 0x9d, 0xfe, 0xc6, 0x0, + 0x0, + + /* U+2022 "•" */ + 0x0, 0x3b, 0xdb, 0x40, 0x0, 0x4f, 0xff, 0xff, + 0x60, 0xe, 0xff, 0xff, 0xff, 0x12, 0xff, 0xff, + 0xff, 0xf5, 0x3f, 0xff, 0xff, 0xff, 0x50, 0xff, + 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0xf8, 0x0, + 0x5, 0xdf, 0xd7, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xca, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x84, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x62, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfe, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x47, 0x89, 0x86, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x1, 0x35, 0x53, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xdd, 0xda, 0x71, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9d, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F008 "" */ + 0x6, 0x50, 0x0, 0x1, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x10, 0x0, 0x5, 0x60, 0xbf, 0xa0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xa, 0xfb, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xc, 0xff, 0xff, + 0xfe, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcc, 0xce, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xec, 0xcc, 0xcf, 0xff, 0xff, 0xb0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x30, + 0x0, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x50, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xaa, 0xad, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xda, 0xaa, 0xaf, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0x20, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xd2, 0x22, 0x27, 0xff, 0xff, + 0x53, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x35, 0xff, 0xff, 0x72, 0x22, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x88, 0x8c, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xc8, 0x88, 0x8f, 0xff, 0xff, 0xa0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0xa, 0xff, + 0xff, 0xa0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x20, 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xe4, 0x44, 0x49, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x94, 0x44, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x66, 0x6a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x66, 0x6e, 0xff, 0xef, 0xa0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xa, 0xfe, 0x4e, 0xa0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, 0xe4, + + /* U+F00B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x5, + 0x77, 0x77, 0x77, 0x77, 0x61, 0x0, 0x0, 0x67, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x6, 0x88, 0x88, 0x88, 0x88, 0x71, 0x0, 0x1, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x7, 0x88, 0x88, 0x88, 0x88, 0x72, 0x0, + 0x1, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x3, 0xcd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x5, + 0xef, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xe3, 0x0, 0x5, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf3, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x81, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xfd, 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x81, + 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xc0, 0x1, 0xdf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xc0, 0x0, 0x1, 0x8b, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x70, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xcc, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x93, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x18, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0x20, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xb0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x5, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x30, 0x2, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0x90, 0x7, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xe0, + 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf5, 0x2f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xfa, 0x5f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xfb, 0x5f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xfb, 0x4f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xfb, 0x3f, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4c, 0xee, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf9, + 0x1f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf7, 0xd, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf5, 0xa, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf1, 0x5, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb7, 0x31, 0x0, 0x12, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x67, 0x89, + 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x19, 0xcf, 0xff, 0xff, 0xeb, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x91, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x2b, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x60, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x19, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdb, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x53, 0x36, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xe6, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x1, + 0xaf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x4, 0x20, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x70, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x47, 0x89, 0x98, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xdf, 0xe7, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0x70, 0x5f, 0xff, 0xff, 0xff, + 0xda, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x3a, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x60, + 0xef, 0xff, 0xff, 0xfd, 0x20, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xa0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xc0, + 0xc, 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x5, 0xff, 0xfe, 0x10, + 0x1, 0xef, 0x50, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x2e, 0xf4, 0x0, + 0x0, 0x11, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x53, 0x33, 0x33, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xdd, 0xdd, 0xdd, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x41, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xc, + 0xff, 0xc1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x99, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xaf, 0xff, 0xea, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, 0xfd, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x2c, 0xff, 0x71, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf5, 0x0, + 0xc, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x10, + 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, + 0xdf, 0xff, 0xff, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xcc, 0xc8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, + 0xfd, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x60, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0xaf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x9f, 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x95, 0x10, 0x0, 0x1, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xff, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xed, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xaa, 0xa9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x90, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x67, 0x89, + 0xab, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x74, 0x22, 0x46, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xfa, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfb, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x8a, 0xbb, + 0xb9, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x55, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xfb, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xc, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2e, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf6, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x3, 0xcc, 0x30, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xbc, + 0x50, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf9, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0x70, 0x0, 0xd, 0xff, 0xf7, 0x0, + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x33, 0x0, 0x0, + 0x1e, 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, 0x20, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xa0, 0x0, + 0x4, 0xff, 0xff, 0x20, 0x0, 0xaf, 0xff, 0x70, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xfc, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x5f, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, 0xff, 0x90, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1, 0xbf, 0xff, 0xf2, + 0x0, 0x1f, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0xd, 0xff, 0xf1, 0x0, 0xd, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0xc, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xfa, + 0x0, 0xb, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0xc, 0xff, 0xf2, 0x0, 0xc, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xd0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0xf, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xe, 0xff, 0xff, 0x30, + 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x3f, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xd, 0xff, 0xf5, 0x0, + 0x1, 0xff, 0xff, 0x40, 0x0, 0x7f, 0xff, 0x90, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xbb, 0x20, 0x0, + 0xa, 0xff, 0xfe, 0x0, 0x0, 0xcf, 0xff, 0x50, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf6, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x40, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xc2, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x34, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x48, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x84, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x11, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x35, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcb, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x1d, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1d, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xde, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xda, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xfd, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xf5, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0x60, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x98, 0xff, 0xff, 0xf1, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0x90, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xdf, + 0xff, 0xff, 0x50, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x2, 0x4c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe8, + 0x31, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, + 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, + 0x33, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfe, 0x50, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0x2d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf6, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, + 0xff, 0xff, 0xf1, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, + 0x11, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, + 0xff, 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, + 0xff, 0xff, 0x10, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xf6, 0xdf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x6d, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x15, 0xbb, 0xbb, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xbb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xfd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x6, 0xab, 0xbb, + 0xbb, 0xbb, 0xba, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0xbb, 0xbb, 0xbb, 0xbb, 0xa5, 0x0, + + /* U+F04D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x6, 0xab, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa5, 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf8, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xb8, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3, 0xff, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x3f, 0xff, 0xff, 0xb8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3f, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0xff, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xb8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x73, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, + 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xff, 0xff, 0xfb, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x3, 0xff, + 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, + 0x8f, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb8, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xfb, 0x8f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xb7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfb, 0x2f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xb0, 0x2a, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9b, 0xbb, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8e, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x4, 0x89, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x73, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x8, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x30, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x3a, 0xff, 0xff, 0xff, 0xf7, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0x9a, 0x97, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x8, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xc5, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x71, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x89, 0xab, 0xa9, 0x86, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x53, 0x46, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x1, 0x89, 0x86, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xd2, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x93, 0x13, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x7c, 0xff, 0xfe, 0x91, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x62, 0x0, 0x1, 0x49, 0xef, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7a, 0xce, 0xff, 0xfd, 0xcb, 0x74, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x2, 0xdc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, + 0x79, 0xab, 0xa8, 0x75, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x1, + 0x6a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa6, 0x43, 0x57, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x6, 0xbc, 0xb7, 0x20, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x5f, + 0xff, 0xff, 0x80, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x51, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf6, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xe3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xfe, 0x94, 0x10, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x48, 0xbd, 0xef, 0xfe, + 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0xed, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xfb, 0x77, 0x77, 0x79, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x33, 0x33, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x74, 0x6c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x34, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x23, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x31, 0x0, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x69, 0x99, 0x99, 0x99, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xe9, 0x9c, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfb, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x8, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xfd, 0x10, 0x7, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe1, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x8d, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x80, 0x0, 0x0, + 0x2, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0xa, 0xfb, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8f, 0xff, + 0x90, 0x0, 0x8, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x6, 0xff, 0xff, 0xf8, 0x0, 0x8, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x48, 0x88, 0x88, 0x88, 0x88, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x88, 0x8c, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0x4, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf1, 0x7f, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0x22, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xc0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xc1, 0x0, 0x3, 0xef, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xb0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x6, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x83, 0x0, 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, 0x5, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x4e, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x92, 0xff, 0xff, 0xf2, + 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0x2f, + 0xff, 0xff, 0x20, 0xaf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xa0, 0x2, 0xff, 0xff, 0xf2, 0x0, 0xaf, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x2f, 0xff, 0xff, 0x20, + 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9d, 0x80, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x2b, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x90, 0xd, 0xff, 0xff, + 0x60, 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x80, + 0xdf, 0xff, 0xf6, 0x1e, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0x7d, 0xff, 0xff, 0x7d, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9b, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xee, + 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xee, 0xee, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x29, 0xbb, 0xbb, 0xbb, 0xa5, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0xad, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xaf, 0xff, 0xea, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, 0xfd, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x2c, 0xff, 0x71, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x20, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x84, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xd9, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xdb, 0x85, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x32, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbc, 0xb8, 0x20, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xaf, 0xff, 0xff, 0x93, 0x4c, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xfa, + 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0xdf, 0xff, + 0xfd, 0x0, 0x2, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xd7, 0x8e, 0xff, 0xff, + 0xf4, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xbc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x19, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x92, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x93, 0x4c, 0xff, 0xff, + 0xf5, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x0, + 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xfd, + 0x0, 0x2, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x8f, 0xff, 0xff, 0xd7, 0x8e, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x68, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xbc, 0xca, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x10, 0x1c, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x1f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x1, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1, + 0xff, 0xff, 0xff, 0xfc, 0x4d, 0xff, 0xff, 0xfd, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xe0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xe0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x5, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x96, 0xf, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, + 0xff, 0xf9, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x28, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xd1, 0xf, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xfb, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x47, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb7, 0x68, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x19, 0xcd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb5, 0x0, + + /* U+F0C9 "" */ + 0x8d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x0, + + /* U+F0E0 "" */ + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x30, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x1, 0xd5, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x1c, + 0xff, 0xff, 0xfd, 0x30, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x3, 0xcf, 0xff, 0xfc, + 0x30, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x4, 0xaa, 0x40, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x61, 0x0, 0x16, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x3, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, + 0x88, 0x88, 0x87, 0x20, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xcc, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x33, 0x33, + 0x33, 0x5f, 0xff, 0xff, 0xff, 0xf7, 0x33, 0x33, + 0x33, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x2b, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd2, 0x1, 0xc7, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x1f, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x1, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x1f, 0xff, + 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x1f, 0xff, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x1, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x1f, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x42, + 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc9, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x66, 0x66, + 0x66, 0x66, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x31, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xea, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xff, 0xff, 0xf7, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x82, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x2, 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0xaf, 0xf0, 0x0, 0x0, 0xbf, 0xe0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xbf, 0xf5, 0x0, + 0x0, 0xcf, 0xf3, 0x0, 0x1, 0xdf, 0xf2, 0x0, + 0x2, 0xff, 0xd1, 0x0, 0x3, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xaa, 0xaa, 0xff, + 0xfd, 0xaa, 0xab, 0xff, 0xfc, 0xaa, 0xac, 0xff, + 0xfb, 0xaa, 0xac, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xf2, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0xff, + 0xc0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, + 0xf1, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0xef, + 0xb0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x1, 0xcf, + 0xf5, 0x0, 0x1, 0xdf, 0xf3, 0x0, 0x3, 0xff, + 0xe2, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xfd, 0x99, 0x99, 0xff, 0xfc, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x9b, 0xff, 0xfa, 0x99, 0x9c, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x9f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xfa, 0x44, 0x44, 0xdf, 0xf8, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x46, 0xff, 0xe5, 0x44, 0x47, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xaa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xde, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x7, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x30, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xec, 0xa7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0xa8, + 0x87, 0x77, 0x89, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x96, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf4, 0x1d, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xf7, 0x0, 0x1d, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x9b, 0xde, 0xff, 0xfe, 0xca, 0x73, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xf7, 0x0, + 0x0, 0x1d, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xca, 0x99, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x9c, 0xdb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x58, 0x97, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x1, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0x74, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4a, 0xff, 0xff, 0xea, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, + 0x8f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf5, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x33, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xcb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xde, 0xee, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xd3, 0x11, 0x3f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf2, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, + 0x0, 0x0, 0x4c, 0xed, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x63, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x9f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xb2, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x11, 0x4e, 0xff, 0xb2, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x24, 0xff, 0xff, 0xfd, 0x40, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xdd, 0xdd, 0xdd, 0xdf, 0xff, 0xfe, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdf, 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfa, 0x10, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xd3, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, + 0x0, 0x6, 0xaa, 0xaa, 0xaa, 0xa7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfb, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, + 0xbb, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xbc, + 0xdd, 0xba, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x10, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x90, 0x8, 0x50, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x5, 0xff, + 0xff, 0xff, 0x90, 0x9f, 0xff, 0xf9, 0x0, 0x8f, + 0x50, 0x0, 0xdf, 0xff, 0xff, 0xf5, 0x0, 0x8f, + 0xff, 0xff, 0xa0, 0x0, 0x8f, 0xff, 0x90, 0x8, + 0xff, 0x50, 0x1, 0xdf, 0xff, 0xff, 0x80, 0xa, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x8f, 0xf9, 0x0, + 0x8f, 0xfa, 0x0, 0xa, 0xff, 0xff, 0xfb, 0x0, + 0xdf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x8f, 0x90, + 0x8, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd0, + 0xe, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x89, + 0x0, 0x8a, 0x0, 0x7, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x30, 0x3, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x11, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x40, 0x4, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0xe, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xa9, 0x0, 0x8c, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xa0, 0x8, 0xfc, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x8f, + 0xfa, 0x0, 0x4, 0xff, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0xc0, 0x0, 0xaf, 0xff, 0xa0, 0x8, + 0xfe, 0x30, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x4, + 0xff, 0xff, 0xff, 0xc1, 0xbf, 0xff, 0xfa, 0x0, + 0x8e, 0x30, 0x0, 0xcf, 0xff, 0xff, 0xf5, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x8, 0x30, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8b, 0xef, 0xff, 0xff, 0xfe, 0xb7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x21, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xcc, + 0xcc, 0xcc, 0xcc, 0xca, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, + 0x22, 0x22, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x22, 0x22, 0x22, 0x22, 0x21, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x1, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, + 0xf6, 0xa, 0xff, 0xff, 0xf4, 0x1b, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, + 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, + 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, + 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, + 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, + 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, + 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, + 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, + 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, + 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, + 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, + 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, + 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, + 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, + 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, + 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, + 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, 0xff, 0xf0, + 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, + 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0x10, 0x5f, + 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x3, 0xff, 0xff, + 0xf1, 0x5, 0xff, 0xff, 0xf0, 0x7, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, + 0x3f, 0xff, 0xff, 0x10, 0x5f, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf3, 0x3, 0xff, 0xff, 0xf1, 0x5, 0xff, + 0xff, 0xf0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x6, 0xff, 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, + 0x10, 0x5f, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x8, + 0xff, 0xff, 0xf6, 0xa, 0xff, 0xff, 0xf4, 0x1b, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x34, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0xb7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf8, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1d, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xfe, 0xca, 0x86, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x8, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x2c, 0x20, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x2e, 0xfe, 0x20, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x2e, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x8e, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x1d, 0xff, 0xf6, 0x44, 0x4f, 0xfc, + 0x44, 0x45, 0xff, 0xa4, 0x44, 0xff, 0xff, 0xf5, + 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0x0, 0x1d, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0x1, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0x1d, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xdf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xe, 0xfb, + 0x0, 0x1, 0xff, 0x80, 0x0, 0xef, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdd, 0xdf, 0xff, + 0xdd, 0xdd, 0xff, 0xed, 0xdd, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1, 0xac, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x10, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xcf, 0xff, 0xff, 0xf1, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 181, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 180, .box_w = 7, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 105, .adv_w = 263, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 177, .adv_w = 472, .box_w = 28, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 597, .adv_w = 417, .box_w = 24, .box_h = 41, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1089, .adv_w = 566, .box_w = 33, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1584, .adv_w = 461, .box_w = 28, .box_h = 31, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2018, .adv_w = 141, .box_w = 5, .box_h = 12, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 2048, .adv_w = 226, .box_w = 10, .box_h = 40, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 2248, .adv_w = 227, .box_w = 10, .box_h = 40, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 2448, .adv_w = 269, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = 15}, + {.bitmap_index = 2584, .adv_w = 391, .box_w = 20, .box_h = 19, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 2774, .adv_w = 153, .box_w = 6, .box_h = 12, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 2810, .adv_w = 257, .box_w = 12, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 2834, .adv_w = 153, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2855, .adv_w = 237, .box_w = 19, .box_h = 41, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 3245, .adv_w = 448, .box_w = 24, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3605, .adv_w = 249, .box_w = 12, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3785, .adv_w = 386, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4130, .adv_w = 384, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4475, .adv_w = 450, .box_w = 27, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4880, .adv_w = 386, .box_w = 23, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5225, .adv_w = 415, .box_w = 23, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5570, .adv_w = 402, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5915, .adv_w = 433, .box_w = 25, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6290, .adv_w = 415, .box_w = 23, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6635, .adv_w = 153, .box_w = 7, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6716, .adv_w = 153, .box_w = 7, .box_h = 29, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 6818, .adv_w = 391, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7018, .adv_w = 391, .box_w = 20, .box_h = 14, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 7158, .adv_w = 391, .box_w = 20, .box_h = 20, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7358, .adv_w = 385, .box_w = 22, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7688, .adv_w = 695, .box_w = 40, .box_h = 38, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 8448, .adv_w = 492, .box_w = 32, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8928, .adv_w = 509, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 9318, .adv_w = 486, .box_w = 27, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9723, .adv_w = 555, .box_w = 29, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10158, .adv_w = 450, .box_w = 22, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10488, .adv_w = 427, .box_w = 22, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10818, .adv_w = 519, .box_w = 28, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11238, .adv_w = 546, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11628, .adv_w = 208, .box_w = 5, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11703, .adv_w = 345, .box_w = 19, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11988, .adv_w = 483, .box_w = 27, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12393, .adv_w = 399, .box_w = 21, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12708, .adv_w = 642, .box_w = 32, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13188, .adv_w = 546, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13578, .adv_w = 564, .box_w = 32, .box_h = 30, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14058, .adv_w = 485, .box_w = 25, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14433, .adv_w = 564, .box_w = 33, .box_h = 36, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 15027, .adv_w = 489, .box_w = 25, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15402, .adv_w = 417, .box_w = 24, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15762, .adv_w = 394, .box_w = 25, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16137, .adv_w = 532, .box_w = 26, .box_h = 30, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16527, .adv_w = 478, .box_w = 31, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 16992, .adv_w = 757, .box_w = 45, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17667, .adv_w = 452, .box_w = 28, .box_h = 30, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18087, .adv_w = 435, .box_w = 29, .box_h = 30, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18522, .adv_w = 442, .box_w = 26, .box_h = 30, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18912, .adv_w = 224, .box_w = 10, .box_h = 40, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 19112, .adv_w = 237, .box_w = 18, .box_h = 41, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 19481, .adv_w = 224, .box_w = 10, .box_h = 40, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 19681, .adv_w = 392, .box_w = 19, .box_h = 18, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 19852, .adv_w = 336, .box_w = 21, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 19884, .adv_w = 403, .box_w = 12, .box_h = 6, .ofs_x = 4, .ofs_y = 26}, + {.bitmap_index = 19920, .adv_w = 402, .box_w = 20, .box_h = 23, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 20150, .adv_w = 458, .box_w = 24, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 20534, .adv_w = 384, .box_w = 22, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20787, .adv_w = 458, .box_w = 24, .box_h = 32, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21171, .adv_w = 411, .box_w = 23, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21436, .adv_w = 237, .box_w = 17, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21708, .adv_w = 464, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 22096, .adv_w = 458, .box_w = 22, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 22448, .adv_w = 187, .box_w = 6, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 22547, .adv_w = 191, .box_w = 13, .box_h = 41, .ofs_x = -4, .ofs_y = -8}, + {.bitmap_index = 22814, .adv_w = 414, .box_w = 23, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23182, .adv_w = 187, .box_w = 5, .box_h = 32, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23262, .adv_w = 710, .box_w = 38, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23699, .adv_w = 458, .box_w = 22, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 23952, .adv_w = 427, .box_w = 24, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 24228, .adv_w = 458, .box_w = 24, .box_h = 31, .ofs_x = 3, .ofs_y = -8}, + {.bitmap_index = 24600, .adv_w = 458, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = -8}, + {.bitmap_index = 24972, .adv_w = 276, .box_w = 13, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 25122, .adv_w = 337, .box_w = 19, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25341, .adv_w = 278, .box_w = 17, .box_h = 28, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25579, .adv_w = 455, .box_w = 22, .box_h = 23, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 25832, .adv_w = 376, .box_w = 25, .box_h = 23, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 26120, .adv_w = 604, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26557, .adv_w = 371, .box_w = 23, .box_h = 23, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26822, .adv_w = 376, .box_w = 25, .box_h = 31, .ofs_x = -1, .ofs_y = -8}, + {.bitmap_index = 27210, .adv_w = 350, .box_w = 20, .box_h = 23, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 27440, .adv_w = 236, .box_w = 12, .box_h = 40, .ofs_x = 2, .ofs_y = -8}, + {.bitmap_index = 27680, .adv_w = 201, .box_w = 5, .box_h = 40, .ofs_x = 4, .ofs_y = -8}, + {.bitmap_index = 27780, .adv_w = 236, .box_w = 13, .box_h = 40, .ofs_x = 0, .ofs_y = -8}, + {.bitmap_index = 28040, .adv_w = 391, .box_w = 21, .box_h = 8, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 28124, .adv_w = 282, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = 16}, + {.bitmap_index = 28229, .adv_w = 211, .box_w = 9, .box_h = 8, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 28265, .adv_w = 672, .box_w = 43, .box_h = 44, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 29211, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29883, .adv_w = 672, .box_w = 42, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 30681, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31353, .adv_w = 462, .box_w = 29, .box_h = 30, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 31788, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 32670, .adv_w = 672, .box_w = 40, .box_h = 43, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 33530, .adv_w = 756, .box_w = 48, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 34442, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 35345, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 36113, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 37016, .adv_w = 336, .box_w = 21, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37363, .adv_w = 504, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37891, .adv_w = 756, .box_w = 48, .box_h = 41, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 38875, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39547, .adv_w = 462, .box_w = 29, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 40171, .adv_w = 588, .box_w = 27, .box_h = 39, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 40698, .adv_w = 588, .box_w = 37, .box_h = 44, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 41512, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42215, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 42918, .adv_w = 588, .box_w = 27, .box_h = 39, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 43445, .adv_w = 588, .box_w = 39, .box_h = 38, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 44186, .adv_w = 420, .box_w = 23, .box_h = 37, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 44612, .adv_w = 420, .box_w = 23, .box_h = 37, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 45038, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 45741, .adv_w = 588, .box_w = 37, .box_h = 9, .ofs_x = 0, .ofs_y = 11}, + {.bitmap_index = 45908, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46676, .adv_w = 840, .box_w = 53, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 47816, .adv_w = 756, .box_w = 49, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 48870, .adv_w = 672, .box_w = 42, .box_h = 39, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 49689, .adv_w = 588, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 50115, .adv_w = 588, .box_w = 37, .box_h = 23, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 50541, .adv_w = 840, .box_w = 53, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51416, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 52088, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 52991, .adv_w = 672, .box_w = 43, .box_h = 44, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 53937, .adv_w = 588, .box_w = 38, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54659, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 55455, .adv_w = 588, .box_w = 37, .box_h = 38, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 56158, .adv_w = 588, .box_w = 37, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56769, .adv_w = 672, .box_w = 42, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 57441, .adv_w = 420, .box_w = 28, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 58043, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 58839, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 59635, .adv_w = 756, .box_w = 48, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 60403, .adv_w = 672, .box_w = 44, .box_h = 44, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 61371, .adv_w = 504, .box_w = 32, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 62059, .adv_w = 840, .box_w = 53, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 63093, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 63809, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 64525, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 65241, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 65957, .adv_w = 840, .box_w = 53, .box_h = 27, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 66673, .adv_w = 840, .box_w = 53, .box_h = 33, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67548, .adv_w = 588, .box_w = 33, .box_h = 43, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 68258, .adv_w = 588, .box_w = 37, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 69054, .adv_w = 672, .box_w = 43, .box_h = 43, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 69979, .adv_w = 840, .box_w = 53, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 70827, .adv_w = 504, .box_w = 32, .box_h = 43, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 71515, .adv_w = 676, .box_w = 43, .box_h = 28, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 7, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 30, 0, 18, -15, 0, 0, + 0, 0, -37, -40, 5, 32, 15, 11, + -27, 5, 33, 2, 28, 7, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 5, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, -20, 0, 0, 0, 0, + 0, -13, 11, 13, 0, 0, -7, 0, + -5, 7, 0, -7, 0, -7, -3, -13, + 0, 0, 0, 0, -7, 0, 0, -9, + -10, 0, 0, -7, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, -10, 0, -18, 0, -81, 0, + 0, -13, 0, 13, 20, 1, 0, -13, + 7, 7, 22, 13, -11, 13, 0, 0, + -38, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -18, -8, -33, 0, -27, + -5, 0, 0, 0, 0, 1, 26, 0, + -20, -5, -2, 2, 0, -11, 0, 0, + -5, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -54, -5, 26, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, + 0, 7, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 26, 5, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 13, 7, 20, -7, 0, 0, 13, -7, + -22, -92, 5, 18, 13, 1, -9, 0, + 24, 0, 22, 0, 22, 0, -62, 0, + -8, 20, 0, 22, -7, 13, 7, 0, + 0, 2, -7, 0, 0, -11, 54, 0, + 54, 0, 20, 0, 28, 9, 11, 20, + 0, 0, 0, -25, 0, 0, 0, 0, + 2, -5, 0, 5, -12, -9, -13, 5, + 0, -7, 0, 0, 0, -27, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -37, 0, -42, 0, 0, 0, + 0, -5, 0, 67, -8, -9, 7, 7, + -6, 0, -9, 7, 0, 0, -36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -65, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -42, 0, 40, 0, 0, -25, 0, + 22, 0, -46, -65, -46, -13, 20, 0, + 0, -45, 0, 8, -15, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 20, -82, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -8, -13, 0, -2, + -2, -7, 0, 0, -5, 0, 0, 0, + -13, 0, -5, 0, -15, -13, 0, -17, + -22, -22, -13, 0, -13, 0, -13, 0, + 0, 0, 0, -5, 0, 0, 7, 0, + 5, -7, 0, 2, 0, 0, 0, 7, + -5, 0, 0, 0, -5, 7, 7, -2, + 0, 0, 0, -13, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 9, -5, 0, + -8, 0, -11, 0, 0, -5, 0, 20, + 0, 0, -7, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, -7, -8, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -7, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -5, -9, 0, -10, 0, -20, + -5, -20, 13, 0, 0, -13, 7, 13, + 18, 0, -17, -2, -8, 0, -2, -32, + 7, -5, 5, -36, 7, 0, 0, 2, + -35, 0, -36, -5, -58, -5, 0, -34, + 0, 13, 19, 0, 9, 0, 0, 0, + 0, 1, 0, -12, -9, 0, -20, 0, + 0, 0, -7, 0, 0, 0, -7, 0, + 0, 0, 0, 0, -3, -3, 0, -3, + -9, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, -5, -8, -5, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -8, + 0, -5, 0, -13, 7, 0, 0, -8, + 3, 7, 7, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -7, 0, -7, -5, -8, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + -5, 0, 0, 0, 0, -7, -10, 0, + -13, 0, 20, -5, 2, -22, 0, 0, + 18, -34, -35, -28, -13, 7, 0, -5, + -44, -12, 0, -12, 0, -13, 10, -12, + -43, 0, -18, 0, 0, 3, -2, 5, + -5, 0, 7, 1, -20, -26, 0, -34, + -16, -14, -16, -20, -8, -18, -1, -13, + -18, 4, 0, 2, 0, -7, 0, 0, + 0, 5, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, -3, 0, -2, -7, 0, -11, -15, + -15, -2, 0, -20, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -13, 0, 0, 0, 0, -34, -20, 0, + 0, 0, -10, -34, 0, 0, -7, 7, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, -12, 0, + 0, 0, 0, 8, 0, 5, -13, -13, + 0, -7, -7, -8, 0, 0, 0, 0, + 0, 0, -20, 0, -7, 0, -10, -7, + 0, -15, -17, -20, -5, 0, -13, 0, + -20, 0, 0, 0, 0, 54, 0, 0, + 3, 0, 0, -9, 0, 7, 0, -29, + 0, 0, 0, 0, 0, -62, -12, 22, + 20, -5, -28, 0, 7, -10, 0, -34, + -3, -9, 7, -47, -7, 9, 0, 10, + -24, -10, -25, -22, -28, 0, 0, -40, + 0, 38, 0, 0, -3, 0, 0, 0, + -3, -3, -7, -18, -22, -1, -62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, -3, -7, -10, 0, 0, + -13, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -13, 0, 0, 13, + -2, 9, 0, -15, 7, -5, -2, -17, + -7, 0, -9, -7, -5, 0, -10, -11, + 0, 0, -5, -2, -5, -11, -8, 0, + 0, -7, 0, 7, -5, 0, -15, 0, + 0, 0, -13, 0, -11, 0, -11, -11, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 7, 0, -9, 0, -5, -8, + -21, -5, -5, -5, -2, -5, -8, -2, + 0, 0, 0, 0, 0, -7, -5, -5, + 0, 0, 0, 0, 8, -5, 0, -5, + 0, 0, 0, -5, -8, -5, -6, -8, + -6, 0, 5, 27, -2, 0, -18, 0, + -5, 13, 0, -7, -28, -9, 10, 1, + 0, -32, -11, 7, -11, 5, 0, -5, + -5, -22, 0, -10, 3, 0, 0, -11, + 0, 0, 0, 7, 7, -13, -13, 0, + -11, -7, -10, -7, -7, 0, -11, 3, + -13, -11, 20, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, -9, + 0, 0, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -10, 0, -13, 0, 0, 0, -22, 0, + 5, -15, 13, 1, -5, -32, 0, 0, + -15, -7, 0, -27, -17, -19, 0, 0, + -29, -7, -27, -26, -32, 0, -17, 0, + 5, 45, -9, 0, -15, -7, -2, -7, + -11, -18, -12, -25, -28, -15, -7, 0, + 0, -5, 0, 2, 0, 0, -47, -6, + 20, 15, -15, -25, 0, 2, -21, 0, + -34, -5, -7, 13, -62, -9, 2, 0, + 0, -44, -8, -35, -7, -49, 0, 0, + -47, 0, 40, 2, 0, -5, 0, 0, + 0, 0, -3, -5, -26, -5, 0, -44, + 0, 0, 0, 0, -22, 0, -6, 0, + -2, -19, -32, 0, 0, -3, -10, -20, + -7, 0, -5, 0, 0, 0, 0, -30, + -7, -22, -22, -5, -11, -17, -7, -11, + 0, -13, -6, -22, -10, 0, -8, -13, + -7, -13, 0, 3, 0, -5, -22, 0, + 13, 0, -12, 0, 0, 0, 0, 8, + 0, 5, -13, 28, 0, -7, -7, -8, + 0, 0, 0, 0, 0, 0, -20, 0, + -7, 0, -10, -7, 0, -15, -17, -20, + -5, 0, -13, 5, 27, 0, 0, 0, + 0, 54, 0, 0, 3, 0, 0, -9, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -5, -13, 0, 0, 0, 0, 0, -3, + 0, 0, 0, -7, -7, 0, 0, -13, + -7, 0, 0, -13, 0, 11, -3, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 10, 13, 5, -6, 0, -22, + -11, 0, 20, -22, -22, -13, -13, 27, + 12, 7, -58, -5, 13, -7, 0, -7, + 7, -7, -24, 0, -7, 7, -9, -5, + -20, -5, 0, 0, 20, 13, 0, -19, + 0, -37, -9, 19, -9, -26, 2, -9, + -22, -22, -7, 27, 7, 0, -10, 0, + -18, 0, 5, 22, -15, -25, -27, -17, + 20, 0, 2, -49, -5, 7, -11, -5, + -15, 0, -15, -25, -10, -10, -5, 0, + 0, -15, -14, -7, 0, 20, 15, -7, + -37, 0, -37, -9, 0, -24, -39, -2, + -22, -11, -22, -19, 18, 0, 0, -9, + 0, -13, -6, 0, -7, -12, 0, 11, + -22, 7, 0, 0, -36, 0, -7, -15, + -11, -5, -20, -17, -22, -15, 0, -20, + -7, -15, -13, -20, -7, 0, 0, 2, + 32, -11, 0, -20, -7, 0, -7, -13, + -15, -18, -19, -26, -9, -13, 13, 0, + -10, 0, -34, -8, 4, 13, -22, -25, + -13, -22, 22, -7, 3, -62, -12, 13, + -15, -11, -25, 0, -20, -28, -8, -7, + -5, -7, -14, -20, -2, 0, 0, 20, + 19, -5, -44, 0, -40, -15, 16, -26, + -46, -13, -24, -28, -34, -22, 13, 0, + 0, 0, 0, -8, 0, 0, 7, -8, + 13, 5, -13, 13, 0, 0, -21, -2, + 0, -2, 0, 2, 2, -5, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 5, 20, 1, 0, -8, 0, 0, + 0, 0, -5, -5, -8, 0, 0, 0, + 2, 5, 0, 0, 0, 0, 5, 0, + -5, 0, 26, 0, 12, 2, 2, -9, + 0, 13, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 20, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -40, 0, -7, 11, 0, 20, + 0, 0, 67, 8, -13, -13, 7, 7, + -5, 2, -34, 0, 0, 32, -40, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -46, 26, 94, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -18, 0, + 0, 2, 0, 0, 7, 87, -13, -5, + 22, 18, -18, 7, 0, 0, 7, 7, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -87, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -19, + 0, 0, 0, -18, 0, 0, 0, 0, + -15, -3, 0, 0, 0, -15, 0, -8, + 0, -32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -45, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -7, 0, 0, -13, 0, -10, 0, + -18, 0, 0, 0, -11, 7, -8, 0, + 0, -18, -7, -15, 0, 0, -18, 0, + -7, 0, -32, 0, -7, 0, 0, -54, + -13, -27, -7, -24, 0, 0, -45, 0, + -18, -3, 0, 0, 0, 0, 0, 0, + 0, 0, -10, -12, -5, -11, 0, 0, + 0, 0, -15, 0, -15, 9, -7, 13, + 0, -5, -15, -5, -11, -13, 0, -8, + -3, -5, 5, -18, -2, 0, 0, 0, + -59, -5, -9, 0, -15, 0, -5, -32, + -6, 0, 0, -5, -5, 0, 0, 0, + 0, 5, 0, -5, -11, -5, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, + 0, -15, 0, -5, 0, 0, 0, -13, + 7, 0, 0, 0, -18, -7, -13, 0, + 0, -19, 0, -7, 0, -32, 0, 0, + 0, 0, -65, 0, -13, -25, -34, 0, + 0, -45, 0, -5, -10, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -10, -3, + -10, 2, 0, 0, 11, -9, 0, 21, + 33, -7, -7, -20, 8, 33, 11, 15, + -18, 8, 28, 8, 19, 15, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 42, 32, -12, -7, 0, -5, + 54, 29, 54, 0, 0, 0, 7, 0, + 0, 25, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, -56, -8, -5, -28, + -33, 0, 0, -45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 0, 0, 0, -56, -8, -5, + -28, -33, 0, 0, -27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, -15, 7, 0, -7, + 5, 12, 7, -20, 0, -1, -5, 7, + 0, 5, 0, 0, 0, 0, -17, 0, + -6, -5, -13, 0, -6, -27, 0, 42, + -7, 0, -15, -5, 0, -5, -11, 0, + -7, -19, -13, -8, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, -56, + -8, -5, -28, -33, 0, 0, -45, 0, + 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, -22, -8, -6, 20, -6, -7, + -27, 2, -4, 2, -5, -18, 1, 15, + 1, 5, 2, 5, -16, -27, -8, 0, + -26, -13, -18, -28, -26, 0, -11, -13, + -8, -9, -5, -5, -8, -5, 0, -5, + -2, 10, 0, 10, -5, 0, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -7, -7, 0, 0, + -18, 0, -3, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, -9, + 0, 0, 0, 0, -5, 0, 0, -11, + -7, 7, 0, -11, -13, -5, 0, -19, + -5, -15, -5, -8, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -45, 0, 22, 0, 0, -12, 0, + 0, 0, 0, -9, 0, -7, 0, 0, + -3, 0, 0, -5, 0, -15, 0, 0, + 28, -9, -22, -21, 5, 7, 7, -1, + -19, 5, 10, 5, 20, 5, 22, -5, + -18, 0, 0, -27, 0, 0, -20, -18, + 0, 0, -13, 0, -9, -11, 0, -10, + 0, -10, 0, -5, 10, 0, -5, -20, + -7, 25, 0, 0, -6, 0, -13, 0, + 0, 9, -15, 0, 7, -7, 5, 1, + 0, -22, 0, -5, -2, 0, -7, 7, + -5, 0, 0, 0, -28, -8, -15, 0, + -20, 0, 0, -32, 0, 25, -7, 0, + -12, 0, 4, 0, -7, 0, -7, -20, + 0, -7, 7, 0, 0, 0, 0, -5, + 0, 0, 7, -9, 2, 0, 0, -8, + -5, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -42, 0, 15, 0, + 0, -5, 0, 0, 0, 0, 1, 0, + -7, -7, 0, 0, 0, 13, 0, 15, + 0, 0, 0, 0, 0, -42, -38, 2, + 29, 20, 11, -27, 5, 28, 0, 25, + 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 36, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_42 = { +#else +lv_font_t lv_font_montserrat_42 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 46, /*The maximum line height required by the font*/ + .base_line = 8, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_42*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_44.c b/inc/lvgl/src/font/lv_font_montserrat_44.c new file mode 100644 index 0000000..0707153 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_44.c @@ -0,0 +1,10916 @@ +/******************************************************************************* + * Size: 44 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 44 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_44.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_44 + #define LV_FONT_MONTSERRAT_44 1 +#endif + +#if LV_FONT_MONTSERRAT_44 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x8f, 0xff, 0xf6, 0x8f, 0xff, 0xf5, 0x7f, 0xff, + 0xf4, 0x7f, 0xff, 0xf4, 0x6f, 0xff, 0xf3, 0x5f, + 0xff, 0xf3, 0x5f, 0xff, 0xf2, 0x4f, 0xff, 0xf1, + 0x4f, 0xff, 0xf1, 0x3f, 0xff, 0xf0, 0x2f, 0xff, + 0xf0, 0x2f, 0xff, 0xf0, 0x1f, 0xff, 0xe0, 0x1f, + 0xff, 0xe0, 0xf, 0xff, 0xd0, 0xf, 0xff, 0xc0, + 0xf, 0xff, 0xc0, 0xe, 0xff, 0xb0, 0xe, 0xff, + 0xa0, 0xd, 0xff, 0xa0, 0xd, 0xff, 0x90, 0x6, + 0x77, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaa, 0x30, 0x6f, 0xff, + 0xf3, 0xdf, 0xff, 0xfa, 0xef, 0xff, 0xfa, 0x9f, + 0xff, 0xf5, 0x9, 0xee, 0x70, + + /* U+0022 "\"" */ + 0x3f, 0xff, 0x70, 0x0, 0x4f, 0xff, 0x63, 0xff, + 0xf6, 0x0, 0x3, 0xff, 0xf6, 0x2f, 0xff, 0x60, + 0x0, 0x3f, 0xff, 0x52, 0xff, 0xf6, 0x0, 0x3, + 0xff, 0xf5, 0x2f, 0xff, 0x50, 0x0, 0x2f, 0xff, + 0x51, 0xff, 0xf5, 0x0, 0x2, 0xff, 0xf4, 0x1f, + 0xff, 0x40, 0x0, 0x2f, 0xff, 0x41, 0xff, 0xf4, + 0x0, 0x1, 0xff, 0xf3, 0xf, 0xff, 0x30, 0x0, + 0x1f, 0xff, 0x30, 0xff, 0xf3, 0x0, 0x0, 0xff, + 0xf3, 0xf, 0xff, 0x30, 0x0, 0xf, 0xff, 0x20, + 0xff, 0xf2, 0x0, 0x0, 0xff, 0xf2, 0x1, 0x11, + 0x0, 0x0, 0x1, 0x11, 0x0, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1, 0x44, 0x44, 0x47, 0xff, 0xe4, 0x44, + 0x44, 0x44, 0x4e, 0xff, 0x74, 0x44, 0x44, 0x30, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf8, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x47, 0xff, + 0xd4, 0x44, 0x44, 0x44, 0x4e, 0xff, 0x74, 0x44, + 0x44, 0x10, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5f, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf3, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xdf, 0xff, 0xfe, 0xda, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xa3, 0x8, 0xff, 0x50, 0x15, 0x9f, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x8f, + 0xf5, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x2, 0xff, + 0xff, 0x60, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, + 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x70, 0x0, 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xe7, 0x28, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x54, 0xaf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x0, 0x1a, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, 0x8, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xf5, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, + 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf5, 0x0, 0x0, 0xe, 0xff, 0xf6, 0x0, + 0xd6, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, 0x0, + 0x4, 0xff, 0xff, 0x30, 0x6f, 0xfb, 0x30, 0x0, + 0x0, 0x8f, 0xf5, 0x0, 0x2, 0xef, 0xff, 0xe0, + 0xd, 0xff, 0xff, 0xc7, 0x20, 0x8, 0xff, 0x50, + 0x28, 0xff, 0xff, 0xf5, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xfd, 0xef, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x18, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xff, 0xfe, 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x3a, 0xdf, 0xec, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc9, 0x9e, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, + 0x0, 0x8, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x50, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x50, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, 0xf9, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xc0, 0x0, 0x0, 0x1, 0xef, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xfe, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, 0x6f, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1f, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xfd, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf5, 0x0, 0x0, 0x0, 0xbf, 0xf5, + 0x0, 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x8f, + 0xfd, 0x0, 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x9a, + 0xef, 0xff, 0x30, 0x0, 0xcf, 0xf9, 0x0, 0x0, + 0x57, 0x87, 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x7f, 0xfd, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x3, 0xae, 0xff, 0xc8, 0x10, 0x0, 0x2f, 0xff, + 0x30, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0x80, 0x5, 0xff, 0xf7, 0x10, 0x3b, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xd0, 0x0, 0xdf, 0xf4, 0x0, 0x0, + 0xb, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf3, 0x0, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x8, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfd, 0x0, 0x0, + 0xbf, 0xf1, 0x0, 0x0, 0x0, 0x8, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x20, + 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0x70, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0xf3, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, 0x4f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfe, 0xa9, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xef, 0xe9, 0x30, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbe, 0xff, 0xeb, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfb, 0x52, 0x35, 0xbf, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa0, + 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x1, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x67, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x3b, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x4, 0x83, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0xb, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xaf, 0xfd, 0x0, 0x0, 0x8f, 0xff, + 0xe3, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, + 0xe, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x4, 0xff, + 0xf8, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x90, 0xbf, 0xff, 0x20, + 0x0, 0xdf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xaf, 0xff, 0xc0, 0x0, 0xf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x2, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xeb, 0x9a, 0xbd, 0xff, + 0xff, 0xff, 0x66, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x40, 0x7, 0xff, 0xff, 0x40, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x7, 0xff, 0x80, 0x0, 0x0, 0x0, 0x15, 0xac, + 0xef, 0xfd, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x7, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3f, 0xff, 0x73, 0xff, 0xf6, 0x2f, 0xff, 0x62, + 0xff, 0xf6, 0x2f, 0xff, 0x51, 0xff, 0xf5, 0x1f, + 0xff, 0x41, 0xff, 0xf4, 0xf, 0xff, 0x30, 0xff, + 0xf3, 0xf, 0xff, 0x30, 0xff, 0xf2, 0x1, 0x11, + 0x0, + + /* U+0028 "(" */ + 0x0, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x6f, + 0xff, 0xa0, 0x0, 0x0, 0xef, 0xff, 0x20, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, + 0x2, 0xff, 0xfe, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x0, 0x1f, 0xff, 0xf0, 0x0, + 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xb0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x0, + 0x9f, 0xff, 0x80, 0x0, 0x0, 0xbf, 0xff, 0x60, + 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x0, 0x0, + 0xbf, 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, 0x0, 0x6f, + 0xff, 0xb0, 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, + 0x0, 0x1f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf3, 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x9f, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xe0, + 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0xef, 0xff, 0x20, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0xd, + 0xff, 0xf2, + + /* U+0029 ")" */ + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0xd, 0xff, 0xf4, + 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0xb, + 0xff, 0xf7, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xcf, + 0xff, 0x50, 0x0, 0x0, 0x9f, 0xff, 0x80, 0x0, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x0, 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xf9, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, + 0xfa, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf9, + 0x0, 0x0, 0x9, 0xff, 0xf8, 0x0, 0x0, 0xa, + 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xf6, 0x0, + 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xf1, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x9f, 0xff, 0x80, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0xdf, + 0xff, 0x30, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0x0, 0x0, 0x5f, 0xff, 0xb0, + 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x2e, 0x50, 0x0, 0x7f, 0xf1, 0x0, + 0x19, 0xb0, 0xa, 0xff, 0xb2, 0x7, 0xff, 0x10, + 0x6e, 0xff, 0x40, 0xcf, 0xff, 0xf8, 0x8f, 0xf4, + 0xcf, 0xff, 0xf6, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x1, 0x9f, 0xff, + 0xfe, 0xff, 0xef, 0xff, 0xe6, 0x0, 0xef, 0xff, + 0xd4, 0x7f, 0xf1, 0x7f, 0xff, 0xf8, 0x8, 0xff, + 0x70, 0x7, 0xff, 0x10, 0x1a, 0xff, 0x20, 0x9, + 0x10, 0x0, 0x7f, 0xf1, 0x0, 0x4, 0x70, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbb, 0x10, 0x0, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0xaa, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x88, 0x88, 0x88, + 0x8f, 0xff, 0xd8, 0x88, 0x88, 0x88, 0x50, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, + + /* U+002C "," */ + 0x1, 0x66, 0x10, 0x2e, 0xff, 0xf3, 0xbf, 0xff, + 0xfb, 0xdf, 0xff, 0xfe, 0xbf, 0xff, 0xfc, 0x3f, + 0xff, 0xf9, 0x3, 0xff, 0xf4, 0x5, 0xff, 0xe0, + 0x9, 0xff, 0x90, 0xd, 0xff, 0x40, 0x1f, 0xfe, + 0x0, 0x4f, 0xf9, 0x0, 0x8f, 0xf4, 0x0, + + /* U+002D "-" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x37, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x57, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+002E "." */ + 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, 0x9f, 0xff, + 0xf9, 0xef, 0xff, 0xfd, 0xdf, 0xff, 0xfd, 0x8f, + 0xff, 0xf7, 0x8, 0xee, 0x80, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfa, 0x51, 0x1, 0x38, 0xef, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x5f, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xdf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, + 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x70, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0xef, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xcf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x8f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0x5f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x10, 0x6, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x5f, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x51, + 0x1, 0x38, 0xef, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xce, 0xff, 0xda, 0x60, 0x0, + 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x9e, 0xee, 0xee, 0xef, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfa, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x27, 0xad, 0xff, 0xfe, 0xc9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x2f, 0xff, 0xff, 0xfa, 0x52, 0x10, 0x2, 0x6c, + 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x0, + 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x30, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xeb, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, + + /* U+0033 "3" */ + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x5, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfd, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x55, 0x67, 0xaf, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, + 0x3, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xb0, 0xc, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x50, + 0x6f, 0xff, 0xff, 0xd8, 0x42, 0x10, 0x2, 0x5a, + 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x58, 0xcd, 0xef, 0xfe, 0xc9, + 0x40, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x77, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xed, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xff, 0xff, 0xdd, 0xdd, 0xdc, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xed, 0xc9, + 0x61, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, + 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, + 0x0, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf3, 0x4, 0xff, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xc0, + 0xd, 0xff, 0xff, 0xfb, 0x63, 0x10, 0x1, 0x38, + 0xef, 0xff, 0xff, 0x40, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xac, 0xef, 0xff, 0xda, + 0x72, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xde, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x94, 0x0, 0x0, + 0x1, 0x49, 0xe0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, + 0x1, 0x58, 0x9a, 0x97, 0x40, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xa0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0xcf, 0xff, 0x90, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0xdf, 0xff, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xef, 0xff, + 0xfa, 0x41, 0x0, 0x26, 0xdf, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xd0, 0xcf, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0xbf, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfa, 0xaf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, + 0x6f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfe, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfd, 0x9, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, + 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x9f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xe0, + 0x0, 0xd, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x1, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xec, 0xaa, 0xcf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x49, 0xcd, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf5, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xe0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, + 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x0, 0x46, 0x66, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x1, 0x59, 0xcd, 0xff, 0xed, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xeb, 0xaa, 0xbd, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, + 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x10, 0x0, 0x7f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x4, + 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xfe, 0xa8, 0x66, 0x79, 0xdf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xe8, 0x41, 0x0, 0x13, + 0x6c, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xdf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0x30, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, 0xc, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf1, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0xf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf5, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0xa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x3, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x90, 0x0, 0xaf, 0xff, 0xff, 0x82, 0x0, + 0x0, 0x0, 0x16, 0xef, 0xff, 0xfe, 0x10, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xeb, 0xaa, 0xbd, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7a, 0xde, 0xff, 0xfd, 0xb8, 0x40, + 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xca, 0xab, 0xdf, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x28, 0xff, 0xff, 0xe1, 0x0, 0x0, 0xef, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfb, 0x0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, + 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x50, 0xaf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf9, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x1f, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xfd, 0x0, 0x9f, 0xff, 0xfe, 0x71, 0x0, + 0x0, 0x2, 0x8f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xdf, 0xff, 0xff, 0xfd, 0xba, 0xbd, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, + 0xad, 0xff, 0xfe, 0xb7, 0x20, 0x0, 0x8f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0xe, 0xd7, + 0x20, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xbe, 0xff, 0xfe, 0xb8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x8, 0xee, 0x80, 0x8f, 0xff, 0xf7, 0xdf, 0xff, + 0xfd, 0xef, 0xff, 0xfd, 0x9f, 0xff, 0xf8, 0xa, + 0xff, 0xa0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0x9f, 0xff, 0xf9, 0xef, 0xff, 0xfd, 0xdf, + 0xff, 0xfd, 0x8f, 0xff, 0xf7, 0x8, 0xee, 0x80, + + /* U+003B ";" */ + 0x8, 0xee, 0x80, 0x8f, 0xff, 0xf7, 0xdf, 0xff, + 0xfd, 0xef, 0xff, 0xfd, 0x9f, 0xff, 0xf8, 0xa, + 0xff, 0xa0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xee, + 0x80, 0x7f, 0xff, 0xf7, 0xcf, 0xff, 0xfd, 0xdf, + 0xff, 0xfd, 0x8f, 0xff, 0xfb, 0x9, 0xff, 0xf6, + 0x3, 0xff, 0xf1, 0x7, 0xff, 0xc0, 0xb, 0xff, + 0x60, 0xe, 0xff, 0x10, 0x2f, 0xfc, 0x0, 0x6f, + 0xf7, 0x0, 0x58, 0x81, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, + 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, + 0x4a, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x17, 0xdf, 0xff, 0xff, 0xfe, 0x92, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, + 0xff, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x50, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, + + /* U+003E ">" */ + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfe, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, + 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, + 0xff, 0xff, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xfb, + 0x30, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, + 0xfe, 0x81, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x37, 0xbd, 0xff, 0xfe, 0xc9, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfe, + 0xdd, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x3f, 0xff, + 0xff, 0xe7, 0x30, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0xf7, 0x1, 0xbf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x6f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9a, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x9c, 0xde, 0xff, 0xed, 0xb8, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xea, 0x63, + 0x10, 0x0, 0x1, 0x46, 0xaf, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xfd, 0xb5, 0x10, 0x0, 0xff, 0xfc, + 0x0, 0x7f, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xff, 0xfc, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x0, 0xbf, 0xfe, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xf7, 0x0, 0x3, + 0xff, 0xf5, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xb8, 0x79, 0xbf, 0xff, 0xfb, 0xff, 0xfc, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x9, 0xff, 0xd0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x81, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xe, 0xff, + 0x40, 0xe, 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x8, 0xff, 0x90, 0x3f, 0xff, + 0x10, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0x0, 0x0, + 0x3, 0xff, 0xd0, 0x6f, 0xfd, 0x0, 0x0, 0x4, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x9f, 0xfa, 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xcf, 0xf7, 0x0, + 0x0, 0xb, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xbf, 0xf4, 0xcf, 0xf6, 0x0, 0x0, 0xd, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xaf, 0xf5, 0xdf, + 0xf5, 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xaf, 0xf5, 0xdf, 0xf5, 0x0, 0x0, + 0xd, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xaf, + 0xf5, 0xcf, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0xbf, 0xf7, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x9f, 0xfa, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfc, 0x0, 0x0, 0x1, 0xff, 0xf0, + 0x6f, 0xfd, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0xb0, 0x3f, 0xff, 0x20, + 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0xc, + 0xff, 0x60, 0xe, 0xff, 0x70, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x1, 0x8f, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x7f, 0xfe, 0x10, 0x9, + 0xff, 0xd0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xa7, 0x68, 0xaf, 0xff, 0xfa, 0x7f, 0xff, 0xf9, + 0x7b, 0xff, 0xf7, 0x0, 0x2, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xaf, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x2f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, + 0xfe, 0xb7, 0x10, 0x0, 0x0, 0x3a, 0xef, 0xeb, + 0x50, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xfa, 0x74, 0x21, 0x0, 0x14, + 0x6a, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0x9c, 0xef, 0xff, 0xec, 0xa7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x97, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x21, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, + 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xd0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x60, 0x0, 0x4, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9c, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xc0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf3, 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfa, 0x0, 0x0, 0xef, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x20, 0x5, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, + + /* U+0042 "B" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x6f, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xab, 0xdf, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xf1, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf1, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xb0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7f, 0xff, 0xfe, 0x10, 0x0, 0x6f, 0xff, + 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xab, 0xdf, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x5a, + 0xff, 0xff, 0xf7, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0x20, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x90, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0x20, 0x6f, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xac, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc9, 0x61, 0x0, + 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, + 0xff, 0xeb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x95, 0x20, 0x1, 0x25, 0x9e, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x0, + 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0x60, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x40, 0x0, 0x4, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x40, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0x60, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0x95, + 0x20, 0x1, 0x25, 0xae, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x9c, 0xef, 0xff, 0xeb, 0x84, 0x0, 0x0, + 0x0, 0x0, + + /* U+0044 "D" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x20, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf7, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x26, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x26, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x20, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xca, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0045 "E" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x56, 0xff, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+0046 "F" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x56, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x56, 0xff, 0xff, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xe5, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0x60, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, + 0xff, 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xa5, 0x20, 0x0, 0x24, 0x8d, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xb0, 0x0, + 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x4, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xaa, 0xa2, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x3c, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x36, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x3, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0xb, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x1e, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa5, + 0x20, 0x0, 0x13, 0x7c, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x9b, 0xef, 0xff, 0xec, 0x95, 0x10, 0x0, + 0x0, 0x0, + + /* U+0048 "H" */ + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xef, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, + + /* U+0049 "I" */ + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, + 0xf0, 0x6f, 0xff, 0xf0, 0x6f, 0xff, 0xf0, 0x6f, + 0xff, 0xf0, 0x6f, 0xff, 0xf0, + + /* U+004A "J" */ + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x3, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, + 0x0, 0xae, 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x8, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x2f, 0xff, 0xff, 0x92, + 0x0, 0x2, 0x9f, 0xff, 0xff, 0x10, 0x7, 0xff, + 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xff, 0xed, 0xa6, 0x0, 0x0, 0x0, + + /* U+004B "K" */ + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x60, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x6f, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x5, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x5f, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x4, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x4f, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x7e, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xf5, 0x3, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x5f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0x40, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfd, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xf3, + + /* U+004C "L" */ + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xea, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+004D "M" */ + 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf5, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf5, 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf5, 0x6f, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, + 0x6f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf5, 0x6f, 0xff, 0xd9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x7e, + 0xff, 0xf5, 0x6f, 0xff, 0xd1, 0xef, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0xd, 0xff, 0xf5, 0x6f, 0xff, 0xd0, 0x6f, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xf4, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0xc, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xb0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, + 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x20, 0xd, 0xff, 0xf6, 0x6f, 0xff, + 0xd0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf8, 0x0, 0xd, 0xff, 0xf6, 0x6f, + 0xff, 0xd0, 0x0, 0x1e, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xe0, 0x0, 0xd, 0xff, 0xf6, + 0x6f, 0xff, 0xd0, 0x0, 0x6, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0xd, 0xff, + 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0xdf, 0xff, + 0x80, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x3f, + 0xff, 0xf2, 0x0, 0x1e, 0xff, 0xf2, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0xa, 0xff, 0xfb, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x53, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xec, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + + /* U+004E "N" */ + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf8, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x2, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, + 0x0, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x4f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x4f, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x90, 0x4f, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xf6, 0x4f, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x8f, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf1, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf1, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf1, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf1, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9b, 0xef, + 0xff, 0xeb, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x95, 0x20, 0x0, 0x25, 0x9e, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0xb, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfa, 0x0, 0x3, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xa0, 0x1f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x16, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x9f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x8c, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xce, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xcc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xfb, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x86, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf5, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xa0, 0x3, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0x95, 0x20, 0x0, 0x25, 0x9e, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9b, 0xef, 0xff, + 0xec, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x6f, + 0xff, 0xfe, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7d, 0xff, 0xff, 0xf7, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x20, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xa0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf5, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf6, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf5, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xe0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x10, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x9e, 0xff, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xed, + 0xcb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xef, + 0xff, 0xeb, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfe, 0x95, 0x20, 0x0, 0x25, + 0x9e, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfa, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, 0x0, 0x1f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x0, + 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x80, 0xb, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfb, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0xe, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xc0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfb, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x90, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x2f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, + 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, + 0x0, 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x73, 0x0, 0x0, + 0x2, 0x7d, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xef, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xbe, 0xff, 0xff, 0xff, 0xf6, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x38, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x4e, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe7, 0x20, 0x14, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x78, 0x75, 0x10, 0x0, + 0x0, + + /* U+0052 "R" */ + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, + 0x95, 0x10, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x6f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7d, 0xff, + 0xff, 0xf8, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xa0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x50, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf7, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x30, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x10, 0x6, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xef, 0xff, + 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x10, 0x0, 0x0, 0x6, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0xdc, 0xcd, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xc0, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x6, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0x0, 0x6f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfa, 0x0, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x1, 0x6a, 0xce, 0xff, 0xed, + 0xb8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xb5, 0x10, + 0x0, 0x0, 0x36, 0xbf, 0xff, 0x80, 0x0, 0xc, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xf1, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xc8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xae, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x0, 0xe8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x30, 0x7f, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, + 0xe9, 0x51, 0x0, 0x0, 0x1, 0x4a, 0xff, 0xff, + 0xf5, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xde, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xec, 0xa6, + 0x10, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xce, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf6, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf6, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x6a, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf6, + 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x6a, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf6, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x58, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x6f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x23, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, 0xaf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x60, 0x3, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xe0, 0x0, 0xb, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xf7, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xfa, 0x52, 0x0, 0x12, 0x6c, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xcd, 0xef, 0xed, 0xb7, 0x30, 0x0, + 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x20, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, + 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf3, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf8, 0x0, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xe0, 0x5f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x5c, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfe, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xa0, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, + 0x6, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfd, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf6, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf1, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xb0, 0x1f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x50, 0xb, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x0, 0x6, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfb, 0x0, 0x1, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, 0xf8, + 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x1, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfd, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, 0x7, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x0, 0xc, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x80, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x2f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xd0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x7f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf2, 0x4, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0xdf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf8, 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa2, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xfd, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, + 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x5f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x2, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xac, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x9e, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x60, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf3, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfe, 0x10, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xa0, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf5, 0x4, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0xaf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, 0x1f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf1, 0x0, 0x4, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfa, 0x0, 0xd, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x40, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xd2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0xbe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xef, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xe9, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, + + /* U+005B "[" */ + 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, + 0xff, 0xfd, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, + 0xff, 0xe8, 0x88, 0x87, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, + 0xe8, 0x88, 0x87, 0x6f, 0xff, 0xff, 0xff, 0xfd, + 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, + 0xff, 0xfd, + + /* U+005C "\\" */ + 0x48, 0x88, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0x80, + + /* U+005D "]" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x1, 0x88, 0x88, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x18, 0x88, 0x8a, 0xff, 0xff, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x78, 0x85, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xef, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf3, 0x8f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0x60, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x0, 0x5, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0xef, 0xf6, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, + 0x0, 0x0, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0x30, 0x0, + 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, 0xb, 0xff, + 0xa0, 0x0, 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf1, 0x0, 0x0, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x3, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x40, 0x1f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xb0, 0x7f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf2, + + /* U+005F "_" */ + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, + + /* U+0060 "`" */ + 0x4f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xe2, + + /* U+0061 "a" */ + 0x0, 0x0, 0x4, 0x8b, 0xde, 0xfe, 0xda, 0x71, + 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xdf, 0xff, 0xff, 0xfd, 0xcc, 0xdf, 0xff, 0xff, + 0xfc, 0x0, 0x5, 0xff, 0xf9, 0x40, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xf6, 0x0, 0xb, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf7, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xdf, 0xff, 0xfa, 0x52, 0x11, 0x11, 0x11, + 0x1c, 0xff, 0xf7, 0x5f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x7a, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0xcf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x7b, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x9f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x74, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xf7, 0xc, 0xff, 0xff, 0xe8, 0x65, 0x58, + 0xdf, 0xff, 0xef, 0xff, 0x70, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa8, 0xff, 0xf7, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x8f, + 0xff, 0x70, 0x0, 0x3, 0x8c, 0xef, 0xfd, 0xb6, + 0x10, 0x8, 0xff, 0xf7, + + /* U+0062 "b" */ + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x4, 0x9c, 0xef, 0xed, + 0x95, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xed, 0xce, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, 0x20, + 0x0, 0x2, 0x8f, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf6, 0xf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x2f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf2, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe0, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, + 0xf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf0, 0xf, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x82, 0x0, 0x0, 0x28, 0xff, 0xff, + 0xfc, 0x0, 0xf, 0xff, 0xf8, 0xff, 0xff, 0xfe, + 0xcc, 0xef, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xff, + 0xff, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0xf, 0xff, 0xf0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xed, 0xde, 0xff, 0xff, 0xff, 0x90, 0x0, 0xa, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x2, 0x8f, 0xff, + 0xff, 0x40, 0x6, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xff, 0xc2, 0x0, 0xef, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x70, + 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xe7, 0x0, 0x0, + 0x5f, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xfd, 0x30, 0x0, 0xaf, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x28, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x5, 0x9d, 0xef, 0xec, + 0x94, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, + 0xff, 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x73, 0xff, 0xff, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xfe, 0xcd, 0xef, 0xff, 0xff, + 0xaf, 0xff, 0xf0, 0x0, 0xcf, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf0, 0xbf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x1f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, + 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xb, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf0, 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xf0, 0x7, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0x0, 0xc, + 0xff, 0xff, 0xf8, 0x20, 0x0, 0x2, 0x8f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xec, 0xce, 0xff, 0xff, 0xf8, 0xff, 0xff, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xff, 0xda, + 0x50, 0x0, 0xf, 0xff, 0xf0, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xde, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xfe, 0xba, 0xbe, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, 0xb3, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xfc, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xe0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x60, 0xb, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0xef, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xd0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0x31, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0xe, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xf4, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xdc, 0xdf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xef, 0xfe, 0xda, + 0x51, 0x0, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xfe, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xeb, 0x9a, 0xef, 0x30, 0x0, 0x0, 0xf, 0xff, + 0xfb, 0x10, 0x0, 0x5, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x38, 0x88, 0xbf, 0xff, + 0xe8, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0xde, 0xfe, 0xda, + 0x50, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xb, + 0xff, 0xf5, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x1b, 0xff, 0xf5, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0xdc, 0xef, 0xff, + 0xff, 0xdc, 0xff, 0xf5, 0x0, 0xe, 0xff, 0xff, + 0xf8, 0x20, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x9f, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf5, 0x2, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf5, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, + 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf5, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf5, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x2f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf5, 0x1f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xf5, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0xc, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf5, 0x7, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, + 0x1, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf5, 0x0, 0x9f, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xf9, 0x30, + 0x0, 0x1, 0x7d, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xdc, 0xef, 0xff, + 0xff, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1e, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xe, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x59, 0xde, 0xfe, 0xda, 0x50, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x2, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, 0x0, + 0xb, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfe, 0x0, 0x0, 0x5f, 0xff, 0xfd, + 0x73, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x0, 0x4, 0x9d, 0xef, 0xed, 0x94, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0xf, 0xff, + 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfe, + 0xef, 0xff, 0xff, 0xff, 0x30, 0xf, 0xff, 0xff, + 0xff, 0xe6, 0x10, 0x0, 0x16, 0xef, 0xff, 0xfd, + 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xfd, 0xf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x20, + + /* U+0069 "i" */ + 0x1, 0x66, 0x20, 0x1e, 0xff, 0xf4, 0x9f, 0xff, + 0xfd, 0xbf, 0xff, 0xfe, 0x7f, 0xff, 0xfa, 0x9, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, + 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, + 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, + 0xff, 0xf3, 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + 0xf, 0xff, 0xf3, 0xf, 0xff, 0xf3, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x20, 0x0, 0x71, 0x0, + 0x1, 0xdf, 0xff, 0xe0, 0x0, 0x3f, 0xfc, 0xab, + 0xff, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xfe, 0xa4, + 0x0, 0x0, 0x0, + + /* U+006B "k" */ + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x90, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x1, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x2e, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x2, + 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x3e, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x34, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x66, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xaf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xd, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf9, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x50, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xa0, + + /* U+006C "l" */ + 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, + 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, + 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, + 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, + 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, + 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, + 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, + 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, + 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, 0xff, 0xff, + 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf3, + 0xff, 0xff, 0x30, + + /* U+006D "m" */ + 0xff, 0xff, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x82, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, + 0xff, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xdb, + 0xab, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xfe, + 0xba, 0xbe, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xf7, 0xf, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xe0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x9f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfa, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfb, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfb, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, + + /* U+006E "n" */ + 0xff, 0xff, 0x0, 0x1, 0x5a, 0xde, 0xfe, 0xd9, + 0x40, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0xff, + 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xeb, + 0xab, 0xdf, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, + 0xff, 0xfb, 0x30, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x50, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfa, + 0xf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf1, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf2, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf2, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfe, 0xcd, 0xef, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf8, 0x20, 0x0, 0x2, 0x8f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x6f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xf5, 0x0, 0x0, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfd, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xd0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x2f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x2f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xd0, 0xa, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, 0xef, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfd, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf8, 0x20, 0x0, 0x2, 0x8f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfe, 0xcc, 0xef, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xff, 0xff, 0x0, 0x0, 0x5a, 0xde, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0xf, 0xff, 0xfb, + 0xff, 0xff, 0xeb, 0x99, 0xae, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xfc, 0x0, 0xf, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xf7, 0x0, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xe0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfe, 0xf, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf6, 0xf, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0x70, 0xf, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x2, 0x8f, 0xff, 0xff, + 0xc0, 0x0, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xec, + 0xce, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xf, 0xff, + 0xf3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0xff, 0xff, 0x30, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0xf, + 0xff, 0xf3, 0x0, 0x4, 0x9c, 0xef, 0xfd, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0xde, 0xff, 0xda, + 0x50, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xf, 0xff, 0xf0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xec, 0xde, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, 0xf8, 0x20, + 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, 0xf0, 0x7, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf0, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xb, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x1f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x2f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf1, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0xbf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xf0, 0x0, 0xcf, + 0xff, 0xff, 0x82, 0x0, 0x0, 0x28, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfe, + 0xcc, 0xef, 0xff, 0xff, 0xaf, 0xff, 0xf0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x73, 0xff, 0xff, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, 0xed, 0x94, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf0, + + /* U+0072 "r" */ + 0xff, 0xff, 0x0, 0x0, 0x6a, 0xdf, 0x8f, 0xff, + 0xf0, 0x6, 0xef, 0xff, 0xf8, 0xff, 0xff, 0x9, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x32, + 0x1f, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x2, 0x7b, 0xdf, 0xff, 0xdb, 0x84, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x2, 0xff, + 0xff, 0xff, 0xdb, 0xbc, 0xdf, 0xff, 0xff, 0x40, + 0xa, 0xff, 0xff, 0x81, 0x0, 0x0, 0x0, 0x4a, + 0xfc, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x22, 0x0, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xb8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x20, 0x0, + 0x0, 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x6b, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfb, 0x8, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x1f, 0xff, + 0xc6, 0x20, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xf3, + 0x9f, 0xff, 0xff, 0xff, 0xdc, 0xbc, 0xff, 0xff, + 0xff, 0xa0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x2, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, + 0x48, 0xbd, 0xef, 0xfe, 0xc9, 0x50, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x38, 0x88, 0xbf, 0xff, 0xe8, 0x88, 0x88, 0x84, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfd, 0x20, 0x0, 0x7, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, 0xab, + 0xff, 0x50, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xef, 0xfd, 0xa4, 0x0, + + /* U+0075 "u" */ + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xb3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb3, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb3, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xb0, 0xbf, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfb, 0x5, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xb0, 0xe, 0xff, 0xff, 0xd6, 0x10, + 0x0, 0x27, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xb0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x74, 0xff, 0xfb, 0x0, 0x0, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x4f, 0xff, + 0xb0, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xed, 0xa4, + 0x0, 0x4, 0xff, 0xfb, + + /* U+0076 "v" */ + 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe0, 0x0, + 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0xa, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfc, 0x0, 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x8f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0x90, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf6, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x8f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf1, 0x3f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xc0, + 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x60, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfa, 0x0, 0x0, 0xbf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xf8, 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf2, 0x9f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, 0x0, + 0x0, 0xa, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xc0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, 0xd, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x4, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x50, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x1, 0xff, + 0xfc, 0x0, 0x0, 0xa, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x8, 0xff, + 0xf4, 0x0, 0x0, 0xbf, 0xff, 0x20, 0x0, 0xf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf1, 0x0, 0xe, 0xff, 0xe0, 0x0, 0x0, 0x5f, + 0xff, 0x80, 0x0, 0x6f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf6, 0x0, 0x4f, 0xff, + 0x80, 0x0, 0x0, 0xf, 0xff, 0xd0, 0x0, 0xbf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfc, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, 0x9, + 0xff, 0xf3, 0x1, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x10, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xf9, 0x7, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x75, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xfe, 0xd, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xdb, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x7f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, 0x3, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf5, 0x1e, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xbf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfa, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd0, 0xa, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x20, 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf6, 0x0, 0x0, 0x3f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xe1, 0x0, 0x0, 0x8f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfc, 0x0, + 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x80, 0x1e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, + + /* U+0079 "y" */ + 0xd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf6, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, + 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x20, 0x0, 0x2f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf4, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x5f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf7, 0x0, 0x9, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xfe, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x6f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0xdf, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf6, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xd4, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xeb, 0xbe, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xdf, 0xfd, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8d, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xb8, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x23, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x43, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x6, 0xbe, 0xff, 0x90, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x6, 0xff, 0xff, + 0xfb, 0x95, 0x0, 0x0, 0xbf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x10, 0x0, 0x4, 0x9a, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1, 0x9f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x80, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xb9, 0x50, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x7c, 0xef, + 0xf9, + + /* U+007C "|" */ + 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, + 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, + 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, + 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, + 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, + 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, + 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, + 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, + 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, + 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, + 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, + 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, 0xf8, 0x6f, + 0xff, 0x86, 0xff, 0xf8, 0x6f, 0xff, 0x86, 0xff, + 0xf8, + + /* U+007D "}" */ + 0x2f, 0xff, 0xd9, 0x30, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x1, 0x8a, 0xdf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfc, 0x98, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xfe, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0x70, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x70, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x18, + 0xad, 0xff, 0xff, 0xe0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x2, 0xff, 0xfd, 0x93, 0x0, 0x0, + 0x0, + + /* U+007E "~" */ + 0x0, 0x3, 0xae, 0xfd, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x9b, 0xb0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x2, 0xff, + 0xd0, 0xa, 0xff, 0xf8, 0x58, 0xff, 0xff, 0x90, + 0x0, 0xa, 0xff, 0x90, 0xf, 0xff, 0x40, 0x0, + 0x2d, 0xff, 0xfd, 0x65, 0xbf, 0xff, 0x40, 0x3f, + 0xfc, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x4b, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xef, 0xd8, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x0, 0x24, 0x53, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xff, 0xe8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x8f, 0xfc, 0x41, 0x3, 0x9f, 0xfe, 0x10, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0x5, 0xff, 0x90, + 0x9, 0xfe, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0xd, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf4, + 0xf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf6, + 0xe, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf5, + 0xc, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, + 0x7, 0xff, 0x30, 0x0, 0x0, 0x0, 0xdf, 0xd0, + 0x1, 0xef, 0xe3, 0x0, 0x0, 0x1b, 0xff, 0x60, + 0x0, 0x4f, 0xff, 0xb7, 0x79, 0xef, 0xfa, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfd, 0x93, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x0, 0x22, 0x0, 0x0, 0x5, 0xef, 0xfd, + 0x30, 0x5, 0xff, 0xff, 0xff, 0x20, 0xdf, 0xff, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xd0, 0xff, + 0xff, 0xff, 0xfd, 0xc, 0xff, 0xff, 0xff, 0x80, + 0x3f, 0xff, 0xff, 0xe1, 0x0, 0x3b, 0xfe, 0xa1, + 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x8d, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6a, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x30, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x61, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0xbc, 0xb9, 0xbf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x23, 0x43, 0xf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xcf, 0xff, 0xff, 0xe9, + 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x23, 0x21, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9a, 0xba, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x4d, 0xb0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xb, 0xd4, 0xef, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xfd, 0xff, 0xe5, 0x44, 0x45, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x44, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x88, 0x89, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x98, 0x88, 0x9f, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xe1, 0x0, 0x1, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xcc, 0xcd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xdc, 0xcc, 0xdf, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xdf, 0xff, 0xe9, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9e, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xdf, 0xff, 0xe9, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9e, 0xff, 0xfc, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xfd, 0xcc, 0xcd, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xdc, 0xcc, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x1, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, 0x10, 0x0, + 0x1e, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfb, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf9, 0x88, 0x89, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x98, 0x88, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x44, 0x45, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x54, 0x44, + 0x5f, 0xff, 0xef, 0xc0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xfd, + 0x4e, 0xb0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xb, 0xe4, + + /* U+F00B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xdb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x1, 0xbd, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x2, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x30, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x7, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xb0, 0x5, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xa0, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x2a, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xd0, 0x1d, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf3, 0x0, 0x1d, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, + 0x0, 0x0, 0x8, 0xca, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0xa2, 0x0, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x89, 0x99, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xcf, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0x30, 0x1, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xf3, 0xd, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf9, + 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, 0x3f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xfc, 0x3f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, + 0x1f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf9, 0xd, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf7, 0xa, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xf4, + 0x5, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x85, 0x21, 0x11, 0x36, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x7a, 0xbc, 0xcc, 0xb9, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, 0xab, 0xcc, + 0xb9, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x10, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xfa, 0x10, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x3, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf7, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x9f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xaa, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x60, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xaa, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf8, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfb, + 0x20, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x3, 0xcf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x10, + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x58, + 0xab, 0xcc, 0xba, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x76, 0x10, 0x0, 0x0, + 0x0, 0x4, 0x88, 0x88, 0x84, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 0xf8, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf5, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x2, 0xa7, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, + 0xb0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x7, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x20, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0xcf, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xf9, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xf5, 0x2f, 0xff, 0xff, + 0x60, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x1c, 0xff, 0xff, 0x90, 0x5, 0xff, + 0xe3, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x9f, 0xfc, 0x0, 0x0, + 0x6b, 0x20, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xcb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0xbf, 0xfb, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x7, 0x70, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x3f, 0xfb, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xd, 0xf5, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4f, 0xfc, + 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xfe, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8a, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xc0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf7, 0x0, 0xa, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x20, 0x4f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xc0, + 0xcf, 0xff, 0xff, 0xe8, 0x88, 0x88, 0x88, 0x88, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x88, 0x88, 0x88, 0x88, 0xaf, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x47, 0x77, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9b, + 0xcd, 0xdb, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd5, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0xdf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd9, 0x75, 0x57, 0xad, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0xcf, 0xff, 0xff, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5f, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x43, 0x22, 0x10, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8, 0xcc, 0xcc, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xee, 0xed, 0x90, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xd0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xde, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x1, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0xff, 0xff, + 0xfd, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, + 0x75, 0x57, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x3a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x7a, 0xcd, 0xdc, 0xb9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x66, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6, 0x88, 0x88, 0x88, 0x88, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xba, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x88, 0x88, + 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2, 0x30, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x7, 0xff, 0xb1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xef, 0xff, 0xd1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x2d, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, + 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xff, 0xff, 0xe2, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x9, 0xff, 0xd2, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x5, 0x50, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x70, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xc1, 0x0, 0x2, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0x70, + 0x0, 0xe, 0xff, 0xf9, 0x0, 0x6, 0x88, 0x88, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf2, 0x0, 0x7, 0xff, 0xfe, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x3f, + 0xff, 0xfa, 0x0, 0x1, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x8f, 0xfc, 0x10, 0x0, + 0x8, 0xff, 0xff, 0x10, 0x0, 0xbf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x6f, 0xff, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x3f, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0x50, 0x0, 0x4f, 0xff, 0xf0, 0x0, + 0xf, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x1f, 0xff, 0xf1, + 0x0, 0xe, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0xf, 0xff, + 0xf3, 0x0, 0xd, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, + 0xf, 0xff, 0xf3, 0x0, 0xc, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0x1f, 0xff, 0xf1, 0x0, 0xe, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0x50, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x3f, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, + 0xff, 0xe1, 0x0, 0x1, 0xff, 0xff, 0x70, 0x0, + 0x6f, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xfc, 0x10, 0x0, 0x8, 0xff, 0xff, 0x10, + 0x0, 0xbf, 0xff, 0x90, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x0, 0x1, 0xff, 0xff, 0x40, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf2, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0x70, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xc0, 0x0, 0x2, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb9, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x9f, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x9f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x88, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xfc, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0x80, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2d, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xaf, 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6, + 0xff, 0xff, 0xf7, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1f, + 0xff, 0xff, 0xf1, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, + 0xff, 0xff, 0xc0, 0x0, 0x29, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x13, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xfb, 0x62, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x46, 0x77, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, + 0x88, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x94, 0x0, 0x4f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf9, 0x4, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf1, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf3, 0x4f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x34, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, + 0xff, 0xff, 0xfe, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, + 0xff, 0xe0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x34, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0x34, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf2, 0x4f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x2, 0xef, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x77, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x1, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xec, 0x50, + 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xec, 0x50, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x37, 0x89, + 0x99, 0x99, 0x99, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0x89, 0x99, 0x99, 0x99, 0x86, 0x0, + 0x0, + + /* U+F04D "" */ + 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x86, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x21, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x50, + 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x88, 0x85, 0xd, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x7f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x13, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0x2f, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x4, 0xdf, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xb8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xaa, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, + 0xb8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x5a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xdd, 0xda, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "" */ + 0x1, 0x56, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x30, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x68, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x7, 0xcd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb2, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0xac, 0xef, 0xff, 0xed, 0xb9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x53, + 0x23, 0x47, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x18, 0x99, 0x72, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x13, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x6f, + 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x2, 0x8b, 0xdc, 0xa6, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x53, + 0x23, 0x46, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xac, 0xef, 0xff, 0xfd, 0xb9, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F070 "" */ + 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x69, 0xbd, 0xff, 0xfe, 0xdb, + 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfc, 0x11, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x32, 0x34, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x4, 0xab, 0xa8, 0x30, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xd2, + 0x2, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0xef, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xe4, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x84, 0x22, 0x35, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x4, + 0xef, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x8b, 0xde, 0xff, 0xfd, 0xca, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x50, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xfd, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x99, 0x99, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x20, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x41, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x4, 0x89, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x97, + 0x10, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x67, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xad, 0xdd, 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xdd, + 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfa, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x4, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x5f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x4, 0xff, 0xfa, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x3f, 0xff, 0xff, 0xa0, 0x0, + 0xf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x3, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, 0x10, 0x0, + 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xb5, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x6f, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfe, 0x5f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xb, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x40, 0x0, 0x8, 0xd9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xc3, 0x0, + + /* U+F078 "" */ + 0x0, 0x8, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xc3, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0xb, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xf4, 0x5f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfe, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xb5, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2, 0x67, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x76, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xfa, 0xcf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xf9, 0xe, 0xff, 0xff, 0x91, 0xdf, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0xef, 0xff, + 0xf9, 0x1, 0xef, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0xe, 0xff, 0xff, 0x90, 0x2, 0xdf, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x82, 0x0, 0xe, 0xff, 0xff, 0x90, 0x0, 0x49, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xe2, 0x0, 0xef, 0xff, + 0xf9, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xe2, 0xe, 0xff, 0xff, 0x90, 0x6f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xd1, 0xef, 0xff, 0xf9, + 0x5f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xc7, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x73, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x62, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x33, 0x33, 0x33, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x33, 0x33, 0x33, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5, 0x99, + 0x99, 0x99, 0x98, 0x20, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x3f, 0xfb, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xd, 0xf5, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x4f, 0xfc, + 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x50, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0xb7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xef, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x14, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x76, 0x54, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x2, 0x79, 0x98, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x31, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xfd, 0x50, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x76, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xbf, 0xff, 0xff, + 0x90, 0x3, 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0xe, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x70, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0xe, + 0xff, 0xff, 0xb0, 0x0, 0x3, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x1, + 0xcf, 0xff, 0xff, 0x30, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xcb, 0xef, 0xff, 0xff, 0xf0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xac, 0xde, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x79, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x90, 0x3, 0xef, + 0xff, 0xff, 0x20, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xc0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, 0xff, 0xb0, + 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xcf, 0xff, 0xff, 0x50, 0x1, 0xcf, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xff, 0xcb, + 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x75, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xac, 0xdb, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0x44, + 0xef, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb3, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, + 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xfe, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x11, 0x39, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x40, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x9b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x1, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, + 0x0, + + /* U+F0C9 "" */ + 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x32, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x64, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x6c, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x3, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x32, 0x0, + + /* U+F0E0 "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x10, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x2, 0xf9, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x9f, + 0xff, 0xd2, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x40, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x2, + 0x9e, 0xe9, 0x20, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x75, 0x57, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x3a, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x64, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9b, 0xcc, 0xcc, 0xcc, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x87, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xdb, 0x10, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xe, 0xfd, 0x10, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, + 0xfd, 0x10, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xfd, 0x10, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, + 0xfd, 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0xe, 0xff, 0xff, 0xfd, 0x10, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xef, 0xff, 0xff, + 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xe, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x54, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8a, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xdf, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x67, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xfe, + 0x88, 0x88, 0xaf, 0xff, 0x98, 0x88, 0x9f, 0xff, + 0xa8, 0x88, 0x8f, 0xff, 0xb8, 0x88, 0x8b, 0xff, + 0xf8, 0x88, 0x8a, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x1, + 0xff, 0xb0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, + 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0xa, 0xff, + 0x10, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x3f, + 0xfe, 0x10, 0x0, 0x1e, 0xff, 0x30, 0x0, 0xd, + 0xff, 0x40, 0x0, 0x4, 0xff, 0xd0, 0x0, 0x3, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcc, 0xcc, 0xdf, 0xff, 0xdc, 0xcc, + 0xcf, 0xff, 0xec, 0xcc, 0xce, 0xff, 0xfc, 0xcc, + 0xce, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x3, 0xff, 0xa0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, 0x2, + 0xff, 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0xa, 0xff, 0x10, 0x0, + 0x2, 0xff, 0x90, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xf, 0xfe, 0x0, 0x0, 0xb, 0xff, 0x20, + 0x0, 0x3, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcc, 0xcc, 0xdf, 0xff, 0xdc, 0xcc, 0xcf, 0xff, + 0xec, 0xcc, 0xce, 0xff, 0xfc, 0xcc, 0xce, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xd0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x0, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0x88, 0x88, + 0xaf, 0xff, 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x8b, 0xff, 0xf8, 0x88, + 0x8a, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, + 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x76, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x33, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x41, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x42, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x79, 0xbc, 0xcc, 0xcc, 0xb9, 0x75, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xa8, 0x64, 0x32, 0x22, 0x34, 0x68, + 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0xcf, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xc1, + 0x1, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x8b, 0xde, 0xff, 0xfe, 0xdb, + 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xc1, 0x0, 0x1, 0xcf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc1, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc8, 0x41, 0x0, 0x0, 0x1, + 0x48, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xcd, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x16, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x63, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfd, + 0x3f, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x88, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfb, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x9f, 0xff, 0xff, 0xa6, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x34, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfd, 0xde, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfc, + 0x10, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf1, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x8c, 0xda, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9c, 0xca, + 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x9f, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x43, 0x49, 0xff, 0xf9, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x45, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdf, 0xff, 0xfe, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x53, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xa0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf3, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xfe, 0x20, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, + 0xde, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x26, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x34, 0x43, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x6, 0x60, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xe0, 0x5, 0xff, 0xff, + 0xff, 0xe2, 0x6f, 0xff, 0xff, 0x30, 0x6, 0xf6, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf1, 0x8, 0xff, + 0xff, 0xfe, 0x20, 0x6, 0xff, 0xff, 0x30, 0x6, + 0xff, 0x60, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0xb, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x5f, 0xff, 0x30, + 0x6, 0xff, 0xf2, 0x0, 0x1f, 0xff, 0xff, 0xf6, + 0xd, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x5, 0xff, + 0x30, 0x5, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xff, + 0xf9, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x5f, 0x30, 0x5, 0xf4, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x5, 0x30, 0x5, 0x40, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfb, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x4, 0x30, 0x5, 0x40, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x4f, 0x30, 0x5, 0xf3, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xfa, 0xd, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x5, 0xff, 0x30, 0x5, 0xff, + 0x30, 0x0, 0x9f, 0xff, 0xff, 0xf9, 0xb, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x5f, 0xff, 0x40, 0x6, + 0xff, 0xe1, 0x0, 0xc, 0xff, 0xff, 0xf7, 0x8, + 0xff, 0xff, 0xfe, 0x20, 0x5, 0xff, 0xff, 0x40, + 0x6, 0xff, 0x60, 0x0, 0x6f, 0xff, 0xff, 0xf5, + 0x5, 0xff, 0xff, 0xff, 0xe2, 0x5f, 0xff, 0xff, + 0x40, 0x6, 0xf6, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf2, 0x1, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0x40, 0x6, 0x60, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x89, 0xab, 0xba, 0x97, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x60, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xe2, 0x2e, 0xff, 0xff, 0xf4, 0x1b, 0xff, 0xff, + 0xf8, 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, + 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, + 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, + 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, + 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, + 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, + 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, + 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, + 0x0, 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, + 0x20, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, + 0x6, 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, + 0xaf, 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, + 0xff, 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, + 0xff, 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, + 0xff, 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, + 0xfe, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xa0, 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, + 0xf2, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, + 0x0, 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, + 0xa, 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, + 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xfe, 0x0, + 0x6f, 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xa0, 0xa, + 0xff, 0xff, 0xe0, 0x6, 0xff, 0xff, 0xf2, 0x2, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfe, 0x22, 0xef, 0xff, 0xff, 0x41, 0xbf, + 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x78, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x61, 0x0, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x47, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x20, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xee, + 0x20, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfe, 0x20, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x3, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x3, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x3, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xfe, 0xcb, 0x97, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, + 0x54, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xea, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xe3, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x33, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xea, 0x20, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x2e, 0xff, 0xfa, + 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, 0xf9, 0x0, + 0x8, 0xff, 0xff, 0xf0, 0x0, 0x2e, 0xff, 0xff, + 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, 0xff, 0x90, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x2e, 0xff, 0xff, + 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, 0xf9, + 0x0, 0x8, 0xff, 0xff, 0xf0, 0x2e, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, 0xff, + 0x90, 0x0, 0x8f, 0xff, 0xff, 0x3e, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, 0x2f, + 0xf9, 0x0, 0x8, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, 0x2, + 0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1, 0xff, 0xa0, 0x0, + 0x2f, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1f, 0xfa, 0x0, + 0x2, 0xff, 0x90, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, + 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x10, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xdf, + 0xff, 0xff, 0xf1, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x12, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x71, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 189, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 189, .box_w = 6, .box_h = 31, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 93, .adv_w = 275, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 178, .adv_w = 495, .box_w = 29, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 628, .adv_w = 437, .box_w = 25, .box_h = 42, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 1153, .adv_w = 593, .box_w = 35, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1696, .adv_w = 483, .box_w = 29, .box_h = 32, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2160, .adv_w = 148, .box_w = 5, .box_h = 13, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 2193, .adv_w = 237, .box_w = 10, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 2403, .adv_w = 238, .box_w = 10, .box_h = 42, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 2613, .adv_w = 282, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = 16}, + {.bitmap_index = 2758, .adv_w = 410, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 2968, .adv_w = 160, .box_w = 6, .box_h = 13, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 3007, .adv_w = 270, .box_w = 13, .box_h = 4, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 3033, .adv_w = 160, .box_w = 6, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3054, .adv_w = 248, .box_w = 20, .box_h = 43, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 3484, .adv_w = 470, .box_w = 26, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3887, .adv_w = 260, .box_w = 12, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4073, .adv_w = 404, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4445, .adv_w = 403, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4817, .adv_w = 471, .box_w = 28, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5251, .adv_w = 404, .box_w = 24, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5623, .adv_w = 434, .box_w = 24, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5995, .adv_w = 421, .box_w = 24, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6367, .adv_w = 453, .box_w = 26, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6770, .adv_w = 434, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7158, .adv_w = 160, .box_w = 6, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7230, .adv_w = 160, .box_w = 6, .box_h = 31, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 7323, .adv_w = 410, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7544, .adv_w = 410, .box_w = 21, .box_h = 14, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 7691, .adv_w = 410, .box_w = 21, .box_h = 21, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 7912, .adv_w = 403, .box_w = 23, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8269, .adv_w = 728, .box_w = 42, .box_h = 40, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 9109, .adv_w = 515, .box_w = 34, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9636, .adv_w = 533, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 10070, .adv_w = 509, .box_w = 29, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 10520, .adv_w = 582, .box_w = 31, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11001, .adv_w = 472, .box_w = 23, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11358, .adv_w = 447, .box_w = 23, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11715, .adv_w = 543, .box_w = 29, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12165, .adv_w = 572, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12599, .adv_w = 218, .box_w = 6, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12692, .adv_w = 361, .box_w = 20, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13002, .adv_w = 506, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13436, .adv_w = 418, .box_w = 22, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13777, .adv_w = 672, .box_w = 34, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14304, .adv_w = 572, .box_w = 28, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14738, .adv_w = 591, .box_w = 33, .box_h = 31, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 15250, .adv_w = 508, .box_w = 26, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15653, .adv_w = 591, .box_w = 35, .box_h = 38, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 16318, .adv_w = 512, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16737, .adv_w = 437, .box_w = 25, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17125, .adv_w = 413, .box_w = 26, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 17528, .adv_w = 557, .box_w = 27, .box_h = 31, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 17947, .adv_w = 501, .box_w = 33, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18459, .adv_w = 793, .box_w = 48, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 19203, .adv_w = 474, .box_w = 30, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19668, .adv_w = 455, .box_w = 30, .box_h = 31, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20133, .adv_w = 463, .box_w = 27, .box_h = 31, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20552, .adv_w = 234, .box_w = 10, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 20762, .adv_w = 248, .box_w = 19, .box_h = 43, .ofs_x = -2, .ofs_y = -4}, + {.bitmap_index = 21171, .adv_w = 234, .box_w = 11, .box_h = 42, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 21402, .adv_w = 410, .box_w = 20, .box_h = 19, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 21592, .adv_w = 352, .box_w = 22, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 21625, .adv_w = 422, .box_w = 12, .box_h = 6, .ofs_x = 5, .ofs_y = 27}, + {.bitmap_index = 21661, .adv_w = 421, .box_w = 21, .box_h = 24, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 21913, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 22326, .adv_w = 402, .box_w = 23, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22602, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 23015, .adv_w = 431, .box_w = 25, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 23315, .adv_w = 249, .box_w = 18, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23612, .adv_w = 486, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 24041, .adv_w = 479, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 24421, .adv_w = 196, .box_w = 6, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 24523, .adv_w = 200, .box_w = 15, .box_h = 43, .ofs_x = -5, .ofs_y = -9}, + {.bitmap_index = 24846, .adv_w = 434, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 25242, .adv_w = 196, .box_w = 5, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 25325, .adv_w = 744, .box_w = 39, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 25793, .adv_w = 479, .box_w = 23, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 26069, .adv_w = 447, .box_w = 26, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 26381, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 26794, .adv_w = 480, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 27207, .adv_w = 289, .box_w = 13, .box_h = 24, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27363, .adv_w = 353, .box_w = 20, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 27603, .adv_w = 291, .box_w = 18, .box_h = 29, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27864, .adv_w = 477, .box_w = 23, .box_h = 24, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 28140, .adv_w = 394, .box_w = 26, .box_h = 24, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 28452, .adv_w = 633, .box_w = 40, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 28932, .adv_w = 389, .box_w = 24, .box_h = 24, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29220, .adv_w = 394, .box_w = 26, .box_h = 33, .ofs_x = -1, .ofs_y = -9}, + {.bitmap_index = 29649, .adv_w = 367, .box_w = 21, .box_h = 24, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29901, .adv_w = 247, .box_w = 13, .box_h = 42, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 30174, .adv_w = 210, .box_w = 5, .box_h = 42, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 30279, .adv_w = 247, .box_w = 13, .box_h = 42, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 30552, .adv_w = 410, .box_w = 22, .box_h = 8, .ofs_x = 2, .ofs_y = 12}, + {.bitmap_index = 30640, .adv_w = 295, .box_w = 16, .box_h = 15, .ofs_x = 1, .ofs_y = 17}, + {.bitmap_index = 30760, .adv_w = 221, .box_w = 9, .box_h = 9, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 30801, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 31791, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32517, .adv_w = 704, .box_w = 44, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 33375, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34101, .adv_w = 484, .box_w = 31, .box_h = 31, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 34582, .adv_w = 704, .box_w = 44, .box_h = 44, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 35550, .adv_w = 704, .box_w = 42, .box_h = 45, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 36495, .adv_w = 792, .box_w = 50, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 37470, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 38460, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39285, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 40275, .adv_w = 352, .box_w = 22, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 40660, .adv_w = 528, .box_w = 33, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41238, .adv_w = 792, .box_w = 50, .box_h = 43, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 42313, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 43039, .adv_w = 484, .box_w = 31, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 43737, .adv_w = 616, .box_w = 29, .box_h = 41, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 44332, .adv_w = 616, .box_w = 39, .box_h = 47, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 45249, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46010, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 46771, .adv_w = 616, .box_w = 28, .box_h = 41, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 47345, .adv_w = 616, .box_w = 41, .box_h = 39, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 48145, .adv_w = 440, .box_w = 24, .box_h = 39, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 48613, .adv_w = 440, .box_w = 24, .box_h = 39, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 49081, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 49842, .adv_w = 616, .box_w = 39, .box_h = 9, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 50018, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 50843, .adv_w = 880, .box_w = 56, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 52103, .adv_w = 792, .box_w = 52, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 53273, .adv_w = 704, .box_w = 44, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54131, .adv_w = 616, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 54568, .adv_w = 616, .box_w = 38, .box_h = 23, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 55005, .adv_w = 880, .box_w = 55, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55968, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 56694, .adv_w = 704, .box_w = 44, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 57684, .adv_w = 704, .box_w = 45, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 58697, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 59458, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 60336, .adv_w = 616, .box_w = 39, .box_h = 39, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 61097, .adv_w = 616, .box_w = 39, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61780, .adv_w = 704, .box_w = 44, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 62506, .adv_w = 440, .box_w = 29, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 63159, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 64037, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 64915, .adv_w = 792, .box_w = 50, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 65740, .adv_w = 704, .box_w = 46, .box_h = 46, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 66798, .adv_w = 528, .box_w = 33, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 67541, .adv_w = 880, .box_w = 55, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 68669, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 69467, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 70265, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 71063, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 71861, .adv_w = 880, .box_w = 55, .box_h = 29, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 72659, .adv_w = 880, .box_w = 56, .box_h = 35, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73639, .adv_w = 616, .box_w = 34, .box_h = 45, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 74404, .adv_w = 616, .box_w = 39, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 75282, .adv_w = 704, .box_w = 45, .box_h = 45, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 76295, .adv_w = 880, .box_w = 55, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 77203, .adv_w = 528, .box_w = 33, .box_h = 45, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 77946, .adv_w = 708, .box_w = 45, .box_h = 29, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 7, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 32, 0, 19, -15, 0, 0, + 0, 0, -39, -42, 5, 33, 15, 12, + -28, 5, 34, 2, 30, 7, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 42, 6, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, -21, 0, 0, 0, 0, + 0, -14, 12, 14, 0, 0, -7, 0, + -5, 7, 0, -7, 0, -7, -4, -14, + 0, 0, 0, 0, -7, 0, 0, -9, + -11, 0, 0, -7, 0, -14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, -11, 0, -19, 0, -85, 0, + 0, -14, 0, 14, 21, 1, 0, -14, + 7, 7, 23, 14, -12, 14, 0, 0, + -40, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -19, -8, -34, 0, -28, + -5, 0, 0, 0, 0, 1, 27, 0, + -21, -6, -2, 2, 0, -12, 0, 0, + -5, -52, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -56, -6, 27, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 23, + 0, 7, 0, 0, -14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 6, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 14, 7, 21, -7, 0, 0, 14, -7, + -23, -96, 5, 19, 14, 1, -9, 0, + 25, 0, 23, 0, 23, 0, -65, 0, + -8, 21, 0, 23, -7, 14, 7, 0, + 0, 2, -7, 0, 0, -12, 56, 0, + 56, 0, 21, 0, 30, 9, 12, 21, + 0, 0, 0, -26, 0, 0, 0, 0, + 2, -5, 0, 5, -13, -9, -14, 5, + 0, -7, 0, 0, 0, -28, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -39, 0, -44, 0, 0, 0, + 0, -5, 0, 70, -8, -9, 7, 7, + -6, 0, -9, 7, 0, 0, -37, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -68, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -44, 0, 42, 0, 0, -26, 0, + 23, 0, -48, -68, -48, -14, 21, 0, + 0, -47, 0, 8, -16, 0, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 18, 21, -86, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -8, -14, 0, -2, + -2, -7, 0, 0, -5, 0, 0, 0, + -14, 0, -6, 0, -16, -14, 0, -18, + -23, -23, -13, 0, -14, 0, -14, 0, + 0, 0, 0, -6, 0, 0, 7, 0, + 5, -7, 0, 2, 0, 0, 0, 7, + -5, 0, 0, 0, -5, 7, 7, -2, + 0, 0, 0, -13, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 9, -5, 0, + -8, 0, -12, 0, 0, -5, 0, 21, + 0, 0, -7, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, -7, -8, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -7, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -5, -9, 0, -11, 0, -21, + -5, -21, 14, 0, 0, -14, 7, 14, + 19, 0, -18, -2, -8, 0, -2, -33, + 7, -5, 5, -37, 7, 0, 0, 2, + -37, 0, -37, -6, -61, -5, 0, -35, + 0, 14, 20, 0, 9, 0, 0, 0, + 0, 1, 0, -13, -9, 0, -21, 0, + 0, 0, -7, 0, 0, 0, -7, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -9, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, -5, -8, -6, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -8, + 0, -5, 0, -14, 7, 0, 0, -8, + 4, 7, 7, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -7, 0, -7, -5, -8, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + -6, 0, 0, 0, 0, -8, -11, 0, + -13, 0, 21, -5, 2, -23, 0, 0, + 19, -35, -37, -30, -14, 7, 0, -6, + -46, -13, 0, -13, 0, -14, 11, -13, + -45, 0, -19, 0, 0, 4, -2, 6, + -5, 0, 7, 1, -21, -27, 0, -35, + -17, -15, -17, -21, -8, -19, -1, -13, + -19, 4, 0, 2, 0, -7, 0, 0, + 0, 5, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, -4, 0, -2, -7, 0, -12, -15, + -15, -2, 0, -21, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -13, 0, 0, 0, 0, -35, -21, 0, + 0, 0, -11, -35, 0, 0, -7, 7, + 0, -19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, -13, 0, + 0, 0, 0, 8, 0, 5, -14, -14, + 0, -7, -7, -8, 0, 0, 0, 0, + 0, 0, -21, 0, -7, 0, -11, -7, + 0, -15, -18, -21, -6, 0, -14, 0, + -21, 0, 0, 0, 0, 56, 0, 0, + 4, 0, 0, -9, 0, 7, 0, -30, + 0, 0, 0, 0, 0, -65, -13, 23, + 21, -6, -30, 0, 7, -11, 0, -35, + -4, -9, 7, -49, -7, 9, 0, 11, + -25, -11, -26, -23, -30, 0, 0, -42, + 0, 40, 0, 0, -4, 0, 0, 0, + -4, -4, -7, -19, -23, -1, -65, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, -4, -7, -11, 0, 0, + -14, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -14, 0, 0, 14, + -2, 9, 0, -15, 7, -5, -2, -18, + -7, 0, -9, -7, -5, 0, -11, -12, + 0, 0, -6, -2, -5, -12, -8, 0, + 0, -7, 0, 7, -5, 0, -15, 0, + 0, 0, -14, 0, -12, 0, -12, -12, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, -14, 7, 0, -10, 0, -5, -8, + -22, -5, -5, -5, -2, -5, -8, -2, + 0, 0, 0, 0, 0, -7, -6, -6, + 0, 0, 0, 0, 8, -5, 0, -5, + 0, 0, 0, -5, -8, -5, -6, -8, + -6, 0, 6, 28, -2, 0, -19, 0, + -5, 14, 0, -7, -30, -9, 11, 1, + 0, -33, -12, 7, -12, 5, 0, -5, + -6, -23, 0, -11, 4, 0, 0, -12, + 0, 0, 0, 7, 7, -14, -13, 0, + -12, -7, -11, -7, -7, 0, -12, 4, + -13, -12, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -9, + 0, 0, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -11, 0, -14, 0, 0, 0, -23, 0, + 5, -15, 14, 1, -5, -33, 0, 0, + -15, -7, 0, -28, -18, -20, 0, 0, + -30, -7, -28, -27, -34, 0, -18, 0, + 6, 47, -9, 0, -16, -7, -2, -7, + -12, -19, -13, -26, -29, -16, -7, 0, + 0, -5, 0, 2, 0, 0, -49, -6, + 21, 15, -15, -26, 0, 2, -22, 0, + -35, -5, -7, 14, -65, -9, 2, 0, + 0, -46, -8, -37, -7, -51, 0, 0, + -49, 0, 42, 2, 0, -5, 0, 0, + 0, 0, -4, -5, -27, -5, 0, -46, + 0, 0, 0, 0, -23, 0, -6, 0, + -2, -20, -33, 0, 0, -4, -11, -21, + -7, 0, -5, 0, 0, 0, 0, -32, + -7, -23, -23, -6, -12, -18, -7, -12, + 0, -14, -6, -23, -11, 0, -8, -13, + -7, -13, 0, 4, 0, -5, -23, 0, + 14, 0, -13, 0, 0, 0, 0, 8, + 0, 5, -14, 29, 0, -7, -7, -8, + 0, 0, 0, 0, 0, 0, -21, 0, + -7, 0, -11, -7, 0, -15, -18, -21, + -6, 0, -14, 6, 28, 0, 0, 0, + 0, 56, 0, 0, 4, 0, 0, -9, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -5, -14, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -7, -7, 0, 0, -14, + -7, 0, 0, -14, 0, 12, -4, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 11, 14, 6, -6, 0, -23, + -11, 0, 21, -23, -23, -14, -14, 28, + 13, 7, -61, -5, 14, -7, 0, -7, + 8, -7, -25, 0, -7, 7, -9, -6, + -21, -6, 0, 0, 21, 14, 0, -20, + 0, -39, -9, 20, -9, -27, 2, -9, + -23, -23, -7, 28, 7, 0, -11, 0, + -19, 0, 6, 23, -16, -26, -28, -18, + 21, 0, 2, -51, -6, 7, -12, -5, + -16, 0, -15, -26, -11, -11, -6, 0, + 0, -16, -15, -7, 0, 21, 16, -7, + -39, 0, -39, -10, 0, -25, -41, -2, + -23, -12, -23, -20, 19, 0, 0, -9, + 0, -14, -6, 0, -7, -13, 0, 12, + -23, 7, 0, 0, -37, 0, -7, -15, + -12, -5, -21, -18, -23, -16, 0, -21, + -7, -16, -13, -21, -7, 0, 0, 2, + 33, -12, 0, -21, -7, 0, -7, -14, + -16, -19, -20, -27, -9, -14, 14, 0, + -11, 0, -35, -8, 4, 14, -23, -26, + -14, -23, 23, -7, 4, -65, -13, 14, + -15, -12, -26, 0, -21, -30, -8, -7, + -6, -7, -15, -21, -2, 0, 0, 21, + 20, -5, -46, 0, -42, -16, 17, -27, + -48, -14, -25, -30, -35, -23, 14, 0, + 0, 0, 0, -8, 0, 0, 7, -8, + 14, 5, -13, 14, 0, 0, -22, -2, + 0, -2, 0, 2, 2, -6, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 6, 21, 1, 0, -8, 0, 0, + 0, 0, -5, -5, -8, 0, 0, 0, + 2, 6, 0, 0, 0, 0, 6, 0, + -6, 0, 27, 0, 13, 2, 2, -9, + 0, 14, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 21, 0, 20, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -42, 0, -7, 12, 0, 21, + 0, 0, 70, 8, -14, -14, 7, 7, + -5, 2, -35, 0, 0, 34, -42, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -48, 27, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -13, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -19, 0, + 0, 2, 0, 0, 7, 91, -14, -6, + 23, 19, -19, 7, 0, 0, 7, 7, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -92, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -20, + 0, 0, 0, -19, 0, 0, 0, 0, + -15, -4, 0, 0, 0, -15, 0, -8, + 0, -33, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -47, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -7, 0, 0, -13, 0, -11, 0, + -19, 0, 0, 0, -12, 7, -8, 0, + 0, -19, -7, -16, 0, 0, -19, 0, + -7, 0, -33, 0, -8, 0, 0, -57, + -13, -28, -8, -25, 0, 0, -47, 0, + -19, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -11, -13, -6, -12, 0, 0, + 0, 0, -15, 0, -15, 9, -8, 14, + 0, -5, -16, -5, -12, -13, 0, -8, + -4, -5, 5, -19, -2, 0, 0, 0, + -62, -6, -10, 0, -15, 0, -5, -33, + -6, 0, 0, -5, -6, 0, 0, 0, + 0, 5, 0, -5, -12, -5, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, + 0, -15, 0, -5, 0, 0, 0, -14, + 7, 0, 0, 0, -19, -7, -14, 0, + 0, -20, 0, -7, 0, -33, 0, 0, + 0, 0, -68, 0, -14, -26, -35, 0, + 0, -47, 0, -5, -11, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -11, -4, + -11, 2, 0, 0, 12, -9, 0, 22, + 34, -7, -7, -21, 8, 34, 12, 15, + -19, 8, 30, 8, 20, 15, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 33, -13, -7, 0, -6, + 56, 30, 56, 0, 0, 0, 7, 0, + 0, 26, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, -59, -8, -6, -29, + -34, 0, 0, -47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, -59, -8, -6, + -29, -34, 0, 0, -28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, -16, 7, 0, -7, + 6, 13, 7, -21, 0, -1, -6, 7, + 0, 6, 0, 0, 0, 0, -18, 0, + -6, -5, -14, 0, -6, -28, 0, 44, + -7, 0, -15, -5, 0, -5, -12, 0, + -7, -20, -14, -8, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, -59, + -8, -6, -29, -34, 0, 0, -47, 0, + 0, 0, 0, 0, 0, 35, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, -23, -8, -6, 21, -6, -7, + -28, 2, -4, 2, -5, -19, 1, 15, + 1, 6, 2, 6, -17, -28, -8, 0, + -27, -13, -19, -30, -27, 0, -11, -14, + -8, -9, -6, -5, -8, -5, 0, -5, + -2, 11, 0, 11, -5, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -7, -7, 0, 0, + -19, 0, -4, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, -9, + 0, 0, 0, 0, -6, 0, 0, -12, + -7, 7, 0, -12, -13, -5, 0, -20, + -5, -15, -5, -8, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -47, 0, 23, 0, 0, -13, 0, + 0, 0, 0, -9, 0, -7, 0, 0, + -4, 0, 0, -5, 0, -16, 0, 0, + 30, -9, -23, -22, 5, 8, 8, -1, + -20, 5, 11, 5, 21, 5, 23, -5, + -19, 0, 0, -28, 0, 0, -21, -19, + 0, 0, -14, 0, -9, -12, 0, -11, + 0, -11, 0, -5, 11, 0, -6, -21, + -7, 26, 0, 0, -6, 0, -14, 0, + 0, 9, -16, 0, 7, -7, 6, 1, + 0, -23, 0, -5, -2, 0, -7, 8, + -6, 0, 0, 0, -29, -8, -15, 0, + -21, 0, 0, -33, 0, 26, -7, 0, + -13, 0, 4, 0, -7, 0, -7, -21, + 0, -7, 7, 0, 0, 0, 0, -5, + 0, 0, 7, -9, 2, 0, 0, -8, + -5, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -44, 0, 15, 0, + 0, -6, 0, 0, 0, 0, 1, 0, + -7, -7, 0, 0, 0, 14, 0, 16, + 0, 0, 0, 0, 0, -44, -40, 2, + 30, 21, 12, -28, 5, 30, 0, 26, + 0, 14, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_44 = { +#else +lv_font_t lv_font_montserrat_44 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 49, /*The maximum line height required by the font*/ + .base_line = 9, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_44*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_46.c b/inc/lvgl/src/font/lv_font_montserrat_46.c new file mode 100644 index 0000000..48fa687 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_46.c @@ -0,0 +1,11868 @@ +/******************************************************************************* + * Size: 46 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 46 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_46.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_46 + #define LV_FONT_MONTSERRAT_46 1 +#endif + +#if LV_FONT_MONTSERRAT_46 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x6f, 0xff, 0xfc, 0x5, 0xff, 0xff, 0xb0, 0x5f, + 0xff, 0xfa, 0x4, 0xff, 0xff, 0xa0, 0x3f, 0xff, + 0xf9, 0x3, 0xff, 0xff, 0x90, 0x2f, 0xff, 0xf8, + 0x2, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf7, 0x0, + 0xff, 0xff, 0x60, 0xf, 0xff, 0xf5, 0x0, 0xff, + 0xff, 0x50, 0xf, 0xff, 0xf4, 0x0, 0xef, 0xff, + 0x40, 0xd, 0xff, 0xf3, 0x0, 0xdf, 0xff, 0x20, + 0xc, 0xff, 0xf2, 0x0, 0xcf, 0xff, 0x10, 0xb, + 0xff, 0xf0, 0x0, 0xbf, 0xff, 0x0, 0xa, 0xff, + 0xf0, 0x0, 0x9f, 0xff, 0x0, 0x3, 0x66, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, + 0xea, 0x10, 0x5f, 0xff, 0xfb, 0xb, 0xff, 0xff, + 0xf1, 0xbf, 0xff, 0xff, 0x16, 0xff, 0xff, 0xb0, + 0x7, 0xde, 0xa1, 0x0, + + /* U+0022 "\"" */ + 0x1f, 0xff, 0xc0, 0x0, 0xc, 0xff, 0xf1, 0x1f, + 0xff, 0xb0, 0x0, 0xc, 0xff, 0xf0, 0xf, 0xff, + 0xb0, 0x0, 0xb, 0xff, 0xf0, 0xf, 0xff, 0xa0, + 0x0, 0xb, 0xff, 0xf0, 0xf, 0xff, 0xa0, 0x0, + 0xa, 0xff, 0xf0, 0xf, 0xff, 0x90, 0x0, 0xa, + 0xff, 0xf0, 0xf, 0xff, 0x90, 0x0, 0xa, 0xff, + 0xe0, 0xf, 0xff, 0x90, 0x0, 0x9, 0xff, 0xe0, + 0xe, 0xff, 0x80, 0x0, 0x9, 0xff, 0xd0, 0xe, + 0xff, 0x80, 0x0, 0x9, 0xff, 0xd0, 0xe, 0xff, + 0x70, 0x0, 0x8, 0xff, 0xd0, 0xd, 0xff, 0x70, + 0x0, 0x8, 0xff, 0xc0, 0x8, 0xaa, 0x40, 0x0, + 0x5, 0xaa, 0x70, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x16, 0x66, 0x66, 0x6e, 0xff, + 0xa6, 0x66, 0x66, 0x66, 0x6f, 0xff, 0x96, 0x66, + 0x66, 0x60, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x90, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x50, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x56, 0x66, 0x66, 0xaf, + 0xfe, 0x66, 0x66, 0x66, 0x66, 0xbf, 0xfd, 0x66, + 0x66, 0x66, 0x40, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0xce, 0xff, 0xff, 0xec, 0x95, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xe, 0xff, 0xff, 0xf9, 0x41, + 0xff, 0xf1, 0x25, 0x8d, 0xff, 0xfa, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x20, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x4c, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xe1, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x40, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x30, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x60, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xfe, 0x83, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf4, 0x9f, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x6e, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x1, 0xdf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0xd, 0xff, 0xfa, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x0, 0xed, 0x20, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x6, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x7, 0xff, + 0xff, 0xd0, 0xd, 0xff, 0xff, 0xfb, 0x63, 0x10, + 0xff, 0xf0, 0x26, 0xcf, 0xff, 0xff, 0x40, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xad, 0xef, 0xff, 0xff, 0xeb, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x17, 0xce, 0xfd, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfb, 0xbd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xa1, 0x0, 0x5, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x6, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf4, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x90, 0x0, 0x0, 0x6, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x1, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x90, 0x0, + 0x0, 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf8, 0x0, 0x0, 0x6f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x50, 0x0, 0x1f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x60, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, 0xb, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xfe, 0x20, 0x0, 0x0, 0xaf, 0xfa, + 0x0, 0x6, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, 0x51, 0x3, + 0xbf, 0xff, 0x20, 0x1, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x5a, 0xef, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x6f, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x27, 0x9a, 0x84, + 0x0, 0x0, 0x1f, 0xff, 0x70, 0x0, 0xcf, 0xff, + 0xdb, 0xcf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, 0x0, + 0x8f, 0xfe, 0x30, 0x0, 0x2d, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf2, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x2f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xf7, 0x0, 0x6, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfd, 0x0, 0x0, 0x9f, + 0xf5, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, + 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0x70, 0x0, 0x0, 0xdf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, + 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xcf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x3f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xf3, 0x0, 0x0, 0x2, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe3, 0x0, 0x2, + 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfd, 0xbc, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xb6, + 0x0, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, 0xff, 0xda, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xfa, 0x64, 0x58, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x4e, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x9f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf7, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0x95, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x37, 0x20, 0x0, 0x0, 0x5f, 0xff, + 0xfd, 0x30, 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x8, 0xff, 0xd2, 0x0, 0x3f, 0xff, 0xfb, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, + 0xff, 0x10, 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, 0xd0, + 0x5, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf3, 0x7, 0xff, 0xf8, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf3, 0xef, 0xff, 0x20, 0xd, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x5, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xc, 0xff, + 0xff, 0xf8, 0x20, 0x0, 0x0, 0x15, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, 0xff, 0x53, + 0xff, 0xff, 0xf3, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd6, 0x0, 0x0, 0x4, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x48, 0xce, 0xff, 0xfd, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x1f, 0xff, 0xc1, 0xff, 0xfb, 0xf, 0xff, 0xb0, + 0xff, 0xfa, 0xf, 0xff, 0xa0, 0xff, 0xf9, 0xf, + 0xff, 0x90, 0xff, 0xf9, 0xe, 0xff, 0x80, 0xef, + 0xf8, 0xe, 0xff, 0x70, 0xdf, 0xf7, 0x8, 0xaa, + 0x40, + + /* U+0028 "(" */ + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, 0x0, 0x8, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x1f, 0xff, 0xf3, 0x0, 0x0, 0x5, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x50, 0x0, 0x0, 0x1f, 0xff, 0xf3, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x6, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, 0x0, + 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, 0x0, + 0x0, 0x8, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xe0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xe, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, + 0x8, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x10, + 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x40, 0x0, 0x0, 0x8, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, + + /* U+0029 ")" */ + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0x80, 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0xa, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, + 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2f, 0xff, + 0xf2, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xe0, 0x0, 0x0, 0x8, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, 0xd, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, + 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xb0, + 0x0, 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x5, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, + 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x2, 0xff, + 0x80, 0x0, 0x1a, 0x50, 0x8, 0xff, 0xb2, 0x2, + 0xff, 0x80, 0x7, 0xff, 0xe0, 0xd, 0xff, 0xff, + 0x72, 0xff, 0x84, 0xdf, 0xff, 0xf4, 0x0, 0x8f, + 0xff, 0xfe, 0xff, 0xef, 0xff, 0xfb, 0x30, 0x0, + 0x1, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x8, 0xff, 0xff, 0xd6, 0xff, + 0xaa, 0xff, 0xff, 0xc2, 0xb, 0xff, 0xf7, 0x2, + 0xff, 0x80, 0x3d, 0xff, 0xf2, 0x3, 0xfa, 0x10, + 0x2, 0xff, 0x80, 0x0, 0x7f, 0x90, 0x0, 0x20, + 0x0, 0x2, 0xff, 0x80, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x66, 0x30, 0x0, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x47, 0x77, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xab, 0xbb, + 0xbb, 0xbb, 0xdf, 0xff, 0xcb, 0xbb, 0xbb, 0xbb, + 0x70, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xfb, 0x10, 0x5f, + 0xff, 0xfc, 0xb, 0xff, 0xff, 0xf2, 0xbf, 0xff, + 0xff, 0x37, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xfd, + 0x0, 0xf, 0xff, 0x70, 0x3, 0xff, 0xf2, 0x0, + 0x7f, 0xfd, 0x0, 0xb, 0xff, 0x80, 0x0, 0xff, + 0xf2, 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, 0x80, + 0x0, + + /* U+002D "-" */ + 0x5e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, + + /* U+002E "." */ + 0x0, 0x45, 0x10, 0x1, 0xcf, 0xff, 0x50, 0x9f, + 0xff, 0xff, 0xd, 0xff, 0xff, 0xf3, 0xcf, 0xff, + 0xff, 0x25, 0xff, 0xff, 0xc0, 0x6, 0xdf, 0xa1, + 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xb6, 0x42, 0x47, 0xdf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, 0x1f, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfa, 0x0, 0x6, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf1, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x1f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfb, 0x4, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x29, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xbf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x6c, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x7c, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0xbf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x69, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x24, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x70, 0x6, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, + 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, 0xdf, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb6, + 0x32, 0x47, 0xdf, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, 0xed, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1, 0x11, 0x11, 0x16, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xa6, 0x43, + 0x24, 0x6b, 0xff, 0xff, 0xff, 0x30, 0x0, 0xbf, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xc1, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, + + /* U+0033 "3" */ + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xfa, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x56, 0x66, 0x7a, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x10, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xe0, 0x5, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf9, 0x0, 0xdf, 0xff, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0x20, 0x7f, 0xff, + 0xff, 0xfd, 0x96, 0x43, 0x23, 0x6a, 0xff, 0xff, + 0xff, 0x80, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x48, 0xbd, 0xff, 0xff, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x3, 0x33, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xa1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, + 0xb, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xfd, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xb8, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x25, 0x8d, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x3, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x0, 0xcf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x20, 0x5f, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xb0, 0xe, 0xff, + 0xff, 0xff, 0xb7, 0x53, 0x23, 0x47, 0xdf, 0xff, + 0xff, 0xf2, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xff, 0xec, + 0x95, 0x0, 0x0, 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xbe, 0xff, + 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xfa, 0x62, 0x10, 0x12, 0x48, 0xef, 0x20, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x3, 0x8c, 0xef, + 0xfe, 0xc9, 0x40, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xe0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xcf, 0xff, 0xd8, 0xff, 0xff, 0xff, 0xdc, 0xdf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0xf9, 0x0, 0xbf, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, 0xaf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x90, 0x9f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xd0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf1, 0xf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x3, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, + 0x2f, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfe, 0x10, 0x0, 0x7, 0xff, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xec, + 0xdf, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfe, + 0xb7, 0x20, 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xaf, 0xff, 0xd1, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x1b, 0xff, 0xff, 0x1a, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0xaf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x50, + 0x9, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x3, 0x8b, 0xdf, 0xff, 0xec, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0xef, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xf4, + 0x0, 0x2, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xfc, 0x0, 0x8, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x20, 0xb, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x60, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x60, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x5, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf7, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd7, 0x31, 0x0, + 0x14, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfe, 0xb9, 0x99, 0xad, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x16, 0xef, 0xff, 0xfd, 0x10, 0x1e, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x90, 0x7f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf1, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf5, 0x7f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, 0x1f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xa0, 0x6, 0xff, 0xff, 0xfe, + 0x72, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0xcd, + 0xef, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xff, 0xed, + 0xa7, 0x30, 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xfe, 0xc8, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xec, 0xde, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfd, + 0x61, 0x0, 0x0, 0x27, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, + 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x50, 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x80, 0x9f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xc0, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe0, 0x2f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf0, 0xb, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xf1, 0x2, 0xff, 0xff, 0xff, 0xa4, + 0x10, 0x2, 0x5a, 0xff, 0xff, 0xef, 0xff, 0xf2, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7f, + 0xff, 0xf1, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0x8a, 0xcc, 0xb9, 0x72, 0x0, + 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x63, + 0x10, 0x12, 0x48, 0xdf, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xad, 0xef, 0xfe, 0xda, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x6, 0xdf, 0xa1, 0x5, 0xff, 0xff, 0xc0, 0xcf, + 0xff, 0xff, 0x2d, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xfe, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x45, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x45, 0x10, 0x1, 0xcf, 0xff, 0x50, 0x9f, 0xff, + 0xff, 0xd, 0xff, 0xff, 0xf3, 0xcf, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xc0, 0x6, 0xdf, 0xa1, 0x0, + + /* U+003B ";" */ + 0x6, 0xdf, 0xa1, 0x5, 0xff, 0xff, 0xc0, 0xcf, + 0xff, 0xff, 0x2d, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xfe, 0x1, 0xcf, 0xff, 0x50, 0x0, 0x45, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xfb, 0x10, 0x5f, 0xff, + 0xfc, 0xb, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, + 0x37, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xfd, 0x0, + 0xf, 0xff, 0x70, 0x3, 0xff, 0xf2, 0x0, 0x7f, + 0xfd, 0x0, 0xb, 0xff, 0x80, 0x0, 0xff, 0xf2, + 0x0, 0x3f, 0xfd, 0x0, 0x7, 0xff, 0x80, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5c, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8e, + 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xff, 0xff, 0xff, 0xa4, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, 0xff, + 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0xff, 0xff, 0xff, 0xfe, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, + 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x80, + + /* U+003D "=" */ + 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+003E ">" */ + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xd7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xfd, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, + 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xd7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, + 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xdf, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, + 0xff, 0xe8, 0x20, 0x0, 0x0, 0x1, 0x7d, 0xff, + 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xfe, 0x82, 0x0, 0x0, 0x0, + 0x28, 0xef, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfe, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x16, 0xac, 0xef, 0xfe, 0xdb, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1e, 0xff, 0xff, 0xfd, 0x73, 0x10, 0x1, 0x49, + 0xff, 0xff, 0xff, 0x40, 0x3e, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xb0, + 0x1, 0xbf, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf0, 0x0, 0x6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x77, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xed, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xed, 0x60, + 0x0, 0x0, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x69, 0xcd, 0xef, 0xfe, 0xdb, 0x96, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xb8, 0x53, 0x21, 0x12, 0x36, 0x8c, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfc, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xdf, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, + 0xff, 0xdb, 0x61, 0x0, 0xa, 0xff, 0xf5, 0x0, + 0x5f, 0xff, 0x60, 0x0, 0x0, 0x4f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xa, 0xff, 0xf5, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x1a, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xf7, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfd, 0xb9, 0xad, 0xff, 0xff, 0xdb, 0xff, + 0xf5, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x9, 0xff, + 0xe0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x1f, 0xff, 0x40, 0xe, 0xff, 0x90, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xb, + 0xff, 0x90, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x5, 0xff, 0xd0, + 0x5f, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf5, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x8f, 0xfd, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xff, 0xf2, 0xaf, 0xfb, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xef, 0xf3, 0xbf, 0xfa, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xf4, + 0xcf, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xcf, 0xf5, 0xcf, 0xf9, + 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0xbf, 0xfa, 0x0, 0x0, + 0x4, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xdf, 0xf4, 0xaf, 0xfb, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xf2, + 0x8f, 0xfe, 0x0, 0x0, 0x0, 0xef, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x5f, 0xff, + 0x10, 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x2f, 0xff, 0x50, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xb, + 0xff, 0x80, 0xd, 0xff, 0xa0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x2f, 0xff, 0x30, + 0x8, 0xff, 0xf1, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xfa, 0x20, 0x0, 0x0, 0x19, 0xff, 0xfe, 0xff, + 0xfe, 0x10, 0x1, 0xdf, 0xfc, 0x0, 0x2, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, + 0xa9, 0x9c, 0xff, 0xff, 0xc2, 0xff, 0xff, 0xea, + 0xaf, 0xff, 0xf3, 0x0, 0x0, 0xbf, 0xfe, 0x10, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x3f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbe, 0xff, 0xeb, 0x71, 0x0, 0x0, 0x0, + 0x7c, 0xff, 0xd9, 0x20, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xfc, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xff, 0xff, 0xff, 0xc8, 0x53, 0x32, 0x23, + 0x57, 0xae, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, + 0xef, 0xfe, 0xda, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x8e, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x1, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x3f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, 0x0, + 0x0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xb0, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x20, 0x0, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x6f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf1, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x70, + + /* U+0042 "B" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xb8, 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x2, 0xff, 0xff, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xde, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xfc, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x90, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfd, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xff, 0x20, 0x0, 0x2f, 0xff, 0xfe, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x36, 0xbf, + 0xff, 0xff, 0xb0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0x60, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x62, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf5, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x22, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7e, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xec, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfb, 0x74, 0x32, 0x45, 0x8d, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xe2, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfe, + 0x20, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb2, 0x0, + 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc2, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xfb, 0x74, 0x32, 0x45, 0x8d, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x12, + 0x46, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x12, + 0x36, 0xaf, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0045 "E" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x32, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, + + /* U+0046 "F" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfc, 0x75, 0x32, 0x35, 0x7b, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf5, 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0x50, 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x75, 0x0, + 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xbb, 0xb6, 0xbf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x8f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf9, 0x5f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf9, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0xb, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf9, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x3f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x7, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xfc, 0x75, 0x32, 0x34, 0x7a, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfe, 0xc9, 0x51, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x12, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, + + /* U+0049 "I" */ + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, + 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, + 0xff, 0xf7, 0x2f, 0xff, 0xf7, 0x2f, 0xff, 0xf7, + 0x2f, 0xff, 0xf7, + + /* U+004A "J" */ + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x18, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, 0x0, 0x2, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xb0, 0x1, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x2f, 0xff, + 0xff, 0xd7, 0x31, 0x3, 0x8f, 0xff, 0xff, 0xb0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7b, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, + + /* U+004B "K" */ + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x1, + 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xc, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xbf, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0xb, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xbf, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x1d, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x2, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x30, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xe1, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, + + /* U+004C "L" */ + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, + + /* U+004D "M" */ + 0x2f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf0, + 0x2f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xf0, 0x2f, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf0, 0x2f, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xf0, + 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf0, 0x2f, 0xff, 0xfc, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xaf, 0xff, 0xf0, 0x2f, 0xff, 0xf4, 0xef, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfb, 0x5f, 0xff, 0xf0, 0x2f, 0xff, + 0xf4, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf2, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0xc, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, + 0x10, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x9f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x1e, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0xdf, + 0xff, 0xb0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x4f, 0xff, + 0xf2, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, + 0xdf, 0xff, 0x80, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x70, 0x6, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf1, 0x1e, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0x9f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf1, + + /* U+004E "N" */ + 0x2f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xfd, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x7b, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0xd, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x2f, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x8f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x1, 0xef, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x1, 0xff, 0xff, 0x82, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf2, 0x0, + 0x1, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, 0x0, 0x1f, + 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xb0, 0x1, 0xff, 0xff, + 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf8, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x41, 0xff, 0xff, 0x82, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xfe, 0x3f, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, + 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x82, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x82, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x80, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xfb, 0x74, 0x32, 0x35, + 0x8d, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0xcf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x0, 0xb, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf5, + 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xb0, 0x5f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf2, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x4b, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x6b, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x48, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x5f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xb0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf5, 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfe, 0x0, 0x0, 0xcf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x3, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xfb, 0x74, 0x32, 0x35, 0x8c, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0050 "P" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xc8, 0x50, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2f, 0xff, + 0xf7, 0x11, 0x11, 0x11, 0x11, 0x23, 0x7b, 0xff, + 0xff, 0xff, 0x80, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0x30, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x2, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf2, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xb2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfc, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x72, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf2, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x2, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0x40, 0x2f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x5a, 0xff, 0xff, 0xff, 0x90, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xd9, 0x61, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x71, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, + 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xfb, 0x74, + 0x32, 0x35, 0x8d, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf8, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0x60, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xe0, 0x0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf5, 0x0, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, + 0x4f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x20, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0xbf, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x60, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0xbf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, 0x8f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, + 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x6, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xe9, 0x52, + 0x10, 0x13, 0x6a, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, + 0xff, 0xff, 0xff, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x1, 0xaf, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xe8, 0x30, 0x3, 0x8e, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9a, 0xa8, 0x50, 0x0, 0x0, + + /* U+0052 "R" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xc8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x11, 0x11, 0x11, 0x11, 0x23, + 0x7b, 0xff, 0xff, 0xff, 0x80, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xf3, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xfc, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x70, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xb0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x70, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xff, 0xff, 0xf4, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x59, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xe1, 0x0, 0x2f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xfa, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xe1, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xbd, 0xff, 0xfe, + 0xda, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x20, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0xd, 0xff, 0xff, + 0xfa, 0x52, 0x0, 0x1, 0x36, 0xaf, 0xff, 0xfa, + 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xf4, 0x0, 0x0, 0xef, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfd, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6a, 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7d, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfa, 0x0, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0xee, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x7, + 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xd0, 0xe, 0xff, 0xff, 0xfe, + 0x96, 0x30, 0x0, 0x1, 0x48, 0xef, 0xff, 0xff, + 0x40, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x39, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, 0xff, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x1c, 0xff, 0xfc, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x4f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0x1f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf6, 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, + 0x9, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x3, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x80, 0x0, 0xcf, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x10, 0x0, 0x3f, 0xff, 0xff, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xb7, 0x43, 0x24, + 0x6a, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xef, 0xfe, + 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0x6, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x0, 0xef, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xb0, 0x0, 0x8f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x2f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, 0xb, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x3f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xaf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x1, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x8, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf7, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0057 "W" */ + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf2, 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xd0, 0xb, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x80, 0x6, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x20, 0x1, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfd, 0x0, 0x0, 0xbf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, 0x0, 0x6f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, + 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xac, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, + 0x0, 0xc, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x57, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x1, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfa, 0x0, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf5, 0x0, + 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf0, + 0x0, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xa0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x50, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x9, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xa0, 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, + 0x0, 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xe0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf8, 0x0, 0x0, 0x9f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf9, 0x0, 0x0, 0x7f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfd, 0x0, 0x0, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfe, 0x0, 0x0, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x4, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x2, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x80, 0xa, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x90, + 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0xf, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x4f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf4, 0x1f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, + 0xaf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf9, 0x7f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0058 "X" */ + 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, 0x0, + 0x9, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x50, 0x0, 0x3f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfe, 0x10, 0xd, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfb, 0x9, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xbf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x90, 0xcf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x2, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x6, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf8, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x9f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x90, + 0x0, 0x5f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, + 0x1e, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, 0x10, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x4f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf7, 0x0, 0x2, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0xe, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf2, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xb0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x50, 0x3, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf8, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+005A "Z" */ + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf8, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + + /* U+005B "[" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x72, 0xff, 0xff, 0xcb, 0xbb, 0xb4, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0xbb, + 0xbb, 0x42, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xf7, + + /* U+005C "\\" */ + 0x9f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf4, + + /* U+005D "]" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0x71, 0xbb, 0xbb, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, + 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, + 0xe, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x70, 0x0, 0x0, 0xe, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x70, 0x0, 0x0, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xf7, 0x1b, 0xbb, 0xbb, 0xff, + 0xff, 0x72, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0x72, 0xff, 0xff, 0xff, + 0xff, 0xf7, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x48, 0x88, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xbf, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xe1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf7, 0xa, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x10, 0x3f, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xa0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, 0xf, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, + 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x10, 0x0, 0xa, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, + 0x1, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xe0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x50, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x5, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf2, + + /* U+005F "_" */ + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, + + /* U+0060 "`" */ + 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xb0, + + /* U+0061 "a" */ + 0x0, 0x0, 0x2, 0x6a, 0xce, 0xff, 0xec, 0x95, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x4, 0xff, 0xfe, 0x94, + 0x10, 0x0, 0x15, 0xcf, 0xff, 0xff, 0x40, 0x0, + 0xbf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xb0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x22, 0x33, 0x33, 0x33, 0x3e, 0xff, + 0xf7, 0x0, 0x0, 0x4a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xc, 0xff, 0xff, 0xb5, 0x20, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf8, 0x4f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf8, + 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf8, 0xaf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x7f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xf8, 0xa, + 0xff, 0xff, 0xfd, 0x97, 0x79, 0xcf, 0xff, 0xfe, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6b, 0xff, 0xf8, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd4, 0xb, 0xff, 0xf8, + 0x0, 0x0, 0x17, 0xbe, 0xff, 0xec, 0x94, 0x0, + 0xb, 0xff, 0xf8, + + /* U+0062 "b" */ + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x17, 0xbe, + 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x91, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0xdf, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, + 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x10, 0xdf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x80, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0xdf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf2, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf4, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xdf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf1, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xd0, 0xdf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x80, 0xdf, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x10, 0xdf, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0xdf, 0xff, 0x61, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0xdf, 0xff, 0x60, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x60, 0x0, 0x17, 0xbe, + 0xff, 0xec, 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0xac, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x5, 0xff, 0xff, 0xfe, 0x83, 0x0, 0x1, + 0x6c, 0xff, 0xff, 0xf4, 0x0, 0x1f, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x10, 0x2, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x20, 0x0, 0x1e, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x83, 0x0, 0x1, + 0x6c, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xad, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, 0x83, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x3f, + 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0x30, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xf3, 0x0, 0x7, 0xff, + 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0x30, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0xe, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x30, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x30, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x30, 0x2f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, + 0x3, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, 0xff, + 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbe, 0xff, 0xec, 0x83, 0x0, 0x0, 0xff, 0xff, + 0x30, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xdc, 0xef, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xfa, 0x30, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0xbf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfd, 0x0, 0x2, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x7, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xa0, 0xb, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xe0, 0xe, 0xff, 0xf8, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x4f, 0xff, 0xf0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xe, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x60, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x94, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xbe, 0xff, 0xda, + 0x40, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfe, 0xbb, 0xef, 0xf1, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x70, 0x0, 0x3, 0x70, 0x0, 0x0, 0xe, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x3b, 0xbb, 0xbf, + 0xff, 0xfc, 0xbb, 0xbb, 0xbb, 0x20, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0xaf, 0xff, 0x80, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xa, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xaf, 0xff, + 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xf8, 0x0, 0x9, + 0xff, 0xff, 0xfe, 0x73, 0x0, 0x1, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x4, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xf8, 0x0, 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x4f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0xf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x80, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x80, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf8, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x80, 0x9f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, + 0x3, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0xc, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x8f, 0xff, 0xff, 0xf9, 0x41, 0x0, + 0x26, 0xcf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xef, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0xce, 0xed, 0xb7, 0x30, + 0x0, 0xf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, 0x1c, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x70, 0x0, 0x9, 0xff, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xf1, 0x0, + 0x4, 0xff, 0xff, 0xfc, 0x84, 0x10, 0x0, 0x3, + 0x7d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0x8b, 0xde, 0xff, 0xed, 0xa6, 0x20, + 0x0, 0x0, 0x0, + + /* U+0068 "h" */ + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x16, 0xbd, 0xef, 0xec, + 0x83, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x19, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0xdf, 0xff, 0x93, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xdf, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xd7, 0x31, 0x1, 0x4a, + 0xff, 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x50, + 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, + 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, + + /* U+0069 "i" */ + 0x0, 0x57, 0x40, 0x0, 0xcf, 0xff, 0x90, 0x6f, + 0xff, 0xff, 0x38, 0xff, 0xff, 0xf5, 0x5f, 0xff, + 0xff, 0x20, 0xaf, 0xff, 0x60, 0x0, 0x24, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, + 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, + 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, + 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, + 0x0, 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, + 0xdf, 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, + 0xff, 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, + 0x90, 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, + 0xd, 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, 0xd, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0x90, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x0, 0xa3, 0x0, 0x2, + 0xdf, 0xff, 0xf3, 0x0, 0x6f, 0xfe, 0xcd, 0xff, + 0xff, 0xfb, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x1, 0xef, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x6b, 0xef, 0xfe, 0xa5, 0x0, + 0x0, 0x0, + + /* U+006B "k" */ + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xb0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xb0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x3f, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, + 0x0, 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x5f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf9, 0x6f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x70, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0xaf, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x60, 0x0, 0x0, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xc0, 0x0, 0xd, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0x80, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0x20, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfd, 0x0, + + /* U+006C "l" */ + 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, + 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, + 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, + 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, + 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, + 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, + 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, + 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, + 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, + 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x9d, 0xff, 0xf9, + 0xdf, 0xff, 0x9d, 0xff, 0xf9, 0xdf, 0xff, 0x90, + + /* U+006D "m" */ + 0xdf, 0xff, 0x60, 0x0, 0x38, 0xce, 0xff, 0xeb, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, 0xfe, + 0xda, 0x60, 0x0, 0x0, 0xd, 0xff, 0xf6, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0xdf, 0xff, 0x64, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0xd, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xc6, 0x20, + 0x12, 0x7e, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xc6, + 0x20, 0x12, 0x7e, 0xff, 0xff, 0xf4, 0xd, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x1d, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf5, 0xdf, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x8d, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf9, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xad, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xad, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfa, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xa0, + + /* U+006E "n" */ + 0xdf, 0xff, 0x60, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x83, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, 0x1a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0xdf, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xdf, 0xff, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xd7, 0x31, 0x1, 0x4a, + 0xff, 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x50, + 0xdf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xb0, 0xdf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, + 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf5, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf5, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfd, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x2, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xaf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x2f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x50, 0x7, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfa, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0xe, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x20, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x40, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfa, 0x0, 0x1f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x50, 0x0, 0xaf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xd0, + 0x0, 0x1, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xad, 0xff, 0xfd, 0xb7, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+0070 "p" */ + 0xdf, 0xff, 0x60, 0x0, 0x17, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x62, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0xdf, + 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf9, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0xc0, + 0x0, 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x10, 0xdf, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x80, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xe0, 0xdf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf6, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf6, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf4, 0xdf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf1, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xd0, 0xdf, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0xdf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x10, 0xdf, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf8, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0xc0, + 0x0, 0xdf, 0xff, 0xad, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xdf, 0xff, + 0x91, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x16, 0xbe, 0xff, 0xec, + 0x94, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xec, + 0x83, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0xf, 0xff, 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, + 0x30, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xf3, 0x0, 0x7, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x2f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x30, 0xcf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0xe, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x30, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0xe, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x30, 0xbf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x30, 0x2f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x30, 0x3, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x7, + 0xff, 0xff, 0xfe, 0x72, 0x0, 0x2, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xf3, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x43, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbe, 0xff, 0xec, 0x83, 0x0, 0x3, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf3, + + /* U+0072 "r" */ + 0xdf, 0xff, 0x60, 0x0, 0x27, 0xbe, 0xf4, 0xdf, + 0xff, 0x60, 0x1a, 0xff, 0xff, 0xf4, 0xdf, 0xff, + 0x63, 0xef, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0x8e, + 0xff, 0xff, 0xff, 0xf4, 0xdf, 0xff, 0xff, 0xff, + 0xfb, 0x75, 0x41, 0xdf, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xed, 0xa7, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe8, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xed, 0xde, 0xff, 0xff, + 0xff, 0x40, 0x7, 0xff, 0xff, 0xd6, 0x10, 0x0, + 0x1, 0x49, 0xef, 0xb0, 0x0, 0xdf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0xf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xc9, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc8, 0x40, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x25, + 0x7a, 0xdf, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x8f, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf7, 0x1f, 0xff, 0xfb, 0x63, 0x0, 0x0, + 0x3, 0x8f, 0xff, 0xff, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0x70, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x36, 0xac, + 0xef, 0xfe, 0xdb, 0x82, 0x0, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x18, 0x88, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x3b, 0xbb, 0xbf, 0xff, 0xfc, 0xbb, 0xbb, + 0xbb, 0x20, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xa1, + 0x0, 0x5, 0x90, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xdd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xce, 0xfe, 0xc8, 0x20, + + /* U+0075 "u" */ + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0xf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfe, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfe, 0xb, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, + 0x7, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfe, 0x1, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, + 0x0, 0x9f, 0xff, 0xff, 0xc6, 0x20, 0x2, 0x6c, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xfe, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x54, 0xff, 0xfe, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x4, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x16, 0xad, 0xef, 0xfc, 0x93, + 0x0, 0x4, 0xff, 0xfe, + + /* U+0076 "v" */ + 0xd, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, 0x7f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf2, 0x1, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfb, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x40, 0x0, 0x2f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0x0, 0xe, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x5, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf8, 0x0, 0x0, 0xcf, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xe0, 0x0, 0x2f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x9, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0x1, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf3, 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xae, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0077 "w" */ + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x2f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x80, 0xd, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x20, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfc, 0x0, 0x1, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf6, + 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf1, 0x0, 0x0, 0x5f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x2c, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x50, 0x0, + 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfc, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf6, 0x0, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x5, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x60, + 0x0, 0x0, 0xb, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0x0, 0x0, 0x5f, 0xff, + 0xa0, 0x0, 0x4f, 0xff, 0xc0, 0x0, 0x0, 0x1f, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xe0, 0x0, 0x0, 0xbf, 0xff, 0x40, 0x0, 0xe, + 0xff, 0xf2, 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xf4, 0x0, 0x1, + 0xff, 0xfe, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xf8, 0x0, + 0x0, 0x2, 0xff, 0xfd, 0x0, 0x2, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x0, 0xd, 0xff, 0xf2, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x30, 0x8, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x50, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x90, 0xd, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xb0, 0x9f, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xe0, 0x3f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf1, + 0xef, 0xff, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xf5, 0x9f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xfb, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x8, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xfd, 0x0, 0xc, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x20, 0x0, 0x1e, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x4f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xd0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, 0x2f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x6d, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xfc, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfd, 0x8, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x20, 0xc, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, + 0x1e, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, + 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x90, 0x1e, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x50, + + /* U+0079 "y" */ + 0x0, 0xdf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, 0x0, 0x7f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0xf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x30, + 0x0, 0x2, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x50, 0x0, 0x5, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf3, 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf9, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x11, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x77, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xed, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x32, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x81, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xed, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x9, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb2, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x3, 0x9d, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xfc, 0xb2, 0x0, 0x0, 0x6f, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x4b, 0xcf, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfc, 0xb2, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x3, 0x9d, 0xff, 0xf4, + + /* U+007C "|" */ + 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, + 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, + 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, + 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, + 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, + 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, + 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, + 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, + 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, + 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, + 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, + 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, 0x2f, + 0xff, 0xe2, 0xff, 0xfe, 0x2f, 0xff, 0xe2, 0xff, + 0xfe, 0x2f, 0xff, 0xe2, 0xff, 0xfe, + + /* U+007D "}" */ + 0x2f, 0xff, 0xda, 0x40, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x1b, 0xce, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0xb5, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x5, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x1b, 0xce, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xda, + 0x40, 0x0, 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xbb, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x1, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, + 0x4f, 0xfd, 0x0, 0x8f, 0xff, 0xc7, 0x8e, 0xff, + 0xff, 0x60, 0x0, 0xd, 0xff, 0xa0, 0xd, 0xff, + 0xa0, 0x0, 0xa, 0xff, 0xff, 0xc8, 0x8e, 0xff, + 0xf4, 0x1, 0xff, 0xf1, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3f, 0xfc, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfd, 0x10, + 0x3, 0xbb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0xff, 0xc7, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x1, 0xef, 0xfe, 0x97, 0x9d, 0xff, 0xf4, 0x0, + 0xb, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xfe, 0x10, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, + 0xaf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0xdf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0xef, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, + 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xff, 0x90, + 0xb, 0xff, 0x90, 0x0, 0x0, 0x7f, 0xfe, 0x10, + 0x1, 0xef, 0xfe, 0xa8, 0x9e, 0xff, 0xf4, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xeb, 0x60, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x27, 0x85, 0x0, 0x0, 0x7f, 0xff, 0xfc, + 0x10, 0x5f, 0xff, 0xff, 0xfb, 0xc, 0xff, 0xff, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, + 0xff, 0xff, 0xf4, 0x9f, 0xff, 0xff, 0xfe, 0x1, + 0xef, 0xff, 0xff, 0x50, 0x1, 0x9e, 0xfc, 0x40, + 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xae, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa6, 0x10, 0xe, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x94, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x72, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfe, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x55, 0x42, 0xef, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x4, 0x79, 0x99, 0x6c, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x1, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, + 0xea, 0x50, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8b, 0xcd, 0xcb, 0x73, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x5, 0x60, 0x0, 0x0, 0x18, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x84, 0x0, 0x0, 0x6, 0x50, 0x9f, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xf9, 0xff, 0xe0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xfc, 0xaa, + 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x44, 0x44, 0xaf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xfd, 0x44, 0x44, 0x5f, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x7f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfb, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x5f, 0xff, 0xfa, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x8f, 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xf8, 0x66, 0x66, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfd, 0x66, + 0x66, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x88, 0x88, 0xcf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xfe, 0x88, 0x88, 0xaf, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xf8, 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf8, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf9, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x22, 0x22, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x22, 0x22, 0x3f, 0xff, 0xdf, + 0xe0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xe, 0xfd, 0x3d, 0xd0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xd, 0xd3, + + /* U+F00B "" */ + 0x4, 0x77, 0x77, 0x77, 0x77, 0x76, 0x10, 0x0, + 0x3, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x40, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x5, 0x78, + 0x88, 0x88, 0x88, 0x87, 0x10, 0x0, 0x3, 0x78, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x87, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x20, 0x0, 0x4, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x60, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x1b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x9d, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbd, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfe, 0x70, 0x0, + 0x1, 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf9, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x90, + 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe1, + 0x7, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x7f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe2, 0x0, + 0x0, 0x3, 0x77, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x86, 0x0, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x22, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xb5, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x1, 0x9b, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf4, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x60, 0x0, 0xd, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x30, + 0x1, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x30, 0xdf, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x92, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfb, 0x3f, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xc4, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfd, 0x3f, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xc2, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xbb, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0x50, 0x8f, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xf2, 0x3, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xfd, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x53, 0x22, 0x46, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, + 0xff, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, + 0x78, 0x87, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xa3, 0x0, 0x0, 0x4, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x6a, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xa2, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3c, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xca, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb9, 0x9c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x31, 0x14, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf9, 0x16, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x42, 0xbf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, + 0x30, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x4, 0xdf, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x92, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xce, + 0xff, 0xff, 0xdb, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x44, 0x44, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfe, + 0x50, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x5f, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x5f, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xe5, 0x7f, 0xff, 0xff, 0xff, 0xf9, + 0x5f, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x5f, 0xd2, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x8, 0xff, 0xff, 0x40, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xf7, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xaf, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf6, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xc1, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x4e, 0xff, 0xff, 0xe1, 0x7, 0xff, + 0xfa, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x2, 0xdf, 0xff, 0x30, + 0x0, 0x9f, 0x80, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb, + 0xf6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x97, 0x77, 0x77, + 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8c, 0xcc, 0xcc, 0xcc, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, + 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x63, + 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0x36, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x7f, 0xff, 0xf8, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x7, 0xff, 0x70, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x22, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x11, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x9f, 0xf7, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, + 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xaf, 0xf8, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x6, 0x89, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, + 0x60, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xfa, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0x50, + 0x3f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xe0, 0xbf, 0xff, 0xff, 0xf6, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x9f, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x67, 0x88, 0x75, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x2, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x31, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb6, 0x21, 0x0, 0x3, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, + 0x54, 0x43, 0x21, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x9, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x43, 0x10, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xb0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xcd, 0xef, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xb8, 0x77, 0x9a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x10, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x20, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x19, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xfe, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xad, 0xee, 0xec, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x2, 0x44, 0x44, 0x44, 0x44, + 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xec, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x24, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xfe, + 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x1, 0xcf, 0xff, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, + 0xff, 0xc0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xaf, 0xff, 0xd2, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2, 0xcf, 0xa0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x44, 0x44, 0x44, 0x48, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xec, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xab, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x93, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x70, 0x0, 0x0, 0x5f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xfb, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe0, 0x0, + 0x4, 0xff, 0xff, 0x50, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x36, 0x10, 0x0, 0x0, 0x9f, 0xff, + 0xf7, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x8f, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xc, 0xff, 0xff, + 0x60, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, 0x3f, + 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x9, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0x90, + 0x0, 0xf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x1, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xff, 0xc0, 0x0, 0xd, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, + 0x0, 0x6f, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x60, 0x0, 0x4f, 0xff, 0xf0, 0x0, 0xa, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xf1, + 0x0, 0x9, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, 0x4f, + 0xff, 0xf1, 0x0, 0x9, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, + 0x0, 0x5f, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0xc, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x5, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xcf, 0xff, 0xb0, + 0x0, 0xe, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xb, 0xff, 0xff, 0xc0, 0x0, 0x2, 0xff, + 0xff, 0x60, 0x0, 0x1f, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xa, 0xff, 0xfc, 0x10, 0x0, + 0xa, 0xff, 0xff, 0x10, 0x0, 0x6f, 0xff, 0xf1, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xbe, 0x80, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0xbf, + 0xff, 0xd0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, + 0x2, 0xff, 0xff, 0x70, 0x2, 0x44, 0x44, 0x44, + 0x44, 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xa0, 0x0, 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xfe, 0x10, 0x0, 0x1f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x9f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0x40, 0x0, 0x4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xe3, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfa, + 0x10, 0x0, 0x0, 0xcf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xec, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x7a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x46, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x5, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x5, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x10, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xef, 0xff, 0xff, 0xb8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xef, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xcf, 0xff, 0xff, 0x10, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x9f, 0xff, 0xff, 0x60, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x5f, 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x9, 0xff, 0xff, 0xff, 0x40, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x1, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x1, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x94, 0x20, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x69, 0xbb, + 0xba, 0x85, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x3, 0x44, 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x52, 0x0, 0x2f, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x80, 0x4f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf4, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf7, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf3, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xf7, 0x3f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf2, + 0x1e, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0xfc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x2, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x30, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x60, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xb8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x44, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xea, 0x20, + 0x0, + + /* U+F04D "" */ + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x20, + 0x0, + + /* U+F051 "" */ + 0x0, 0x15, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x44, 0x40, 0x5, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xf6, 0x1f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0xf, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x1f, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xf8, 0x4f, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf8, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf7, + 0x2, 0xbf, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x5, 0x9b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xba, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x10, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x7, 0xca, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x56, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x79, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, + 0xff, 0xff, 0xff, 0xff, 0xc9, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x98, 0x40, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xde, 0xed, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "" */ + 0x2, 0x89, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x98, 0x40, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x35, 0x67, 0x66, 0x53, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7b, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x51, 0x0, 0x0, + 0x26, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x2, 0xbd, 0xdb, + 0x71, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x3, 0x10, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xa, 0xfc, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, + 0xe9, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x35, 0x53, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, + 0x65, 0x57, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xce, + 0xff, 0xff, 0xdc, 0x97, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x46, 0x66, 0x64, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x15, 0x9c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xda, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xd3, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, 0x2, 0x6b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x3b, 0xdc, 0xa6, 0x10, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0xf, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, + 0xff, 0xf5, 0xc, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x9c, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf9, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x86, 0x55, 0x74, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x48, 0xac, 0xef, 0xff, 0xed, + 0xb8, 0x51, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xb3, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfe, 0xcc, 0xcc, 0xcc, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x11, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x8, 0xce, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xdb, 0x60, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xda, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xdd, 0xdd, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x25, 0x55, 0x55, 0x55, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xf8, 0x55, 0xaf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x20, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf4, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xb, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xc9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0xc8, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0xb, 0xff, 0x70, 0x0, + 0x0, 0x7f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x8, 0xff, 0xff, 0xff, 0x50, 0x0, 0x8f, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x11, 0x11, + 0x11, 0x2d, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xf4, 0x11, 0x8f, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x1, 0x22, 0x22, + 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, 0x9f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xdb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xfb, 0x2f, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf7, + 0x4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x90, 0x0, 0x5f, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0x0, 0x3, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x60, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xe3, 0x0, + 0x0, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xfe, 0x30, 0xb, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xe2, + 0x4f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x2, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xad, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xf6, 0x2f, 0xff, 0xff, 0x91, 0xdf, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x70, + 0x2f, 0xff, 0xff, 0x90, 0x2e, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf8, 0x0, 0x2f, 0xff, 0xff, + 0x90, 0x2, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0x30, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x16, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf9, 0x0, 0xa, 0xff, + 0xff, 0xf1, 0x0, 0x4e, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xa0, 0xa, 0xff, 0xff, 0xf1, 0x4, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf9, + 0xa, 0xff, 0xff, 0xf1, 0x3f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x7a, 0xff, 0xff, + 0xf3, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xba, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x0, 0x16, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0xa5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x10, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x33, 0x33, 0x33, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa3, 0x33, 0x33, 0x33, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x20, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x2, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x40, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x10, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x14, 0x44, + 0x44, 0x44, 0x30, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x21, 0x11, 0x11, 0x11, + 0x12, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x9f, 0xf7, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3f, + 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0xaf, 0xf8, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x6, 0x89, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x98, + 0x60, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd3, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9b, 0xba, 0x98, 0x64, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x0, 0x57, 0x98, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xdf, 0xff, 0xe8, 0x10, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x23, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x9f, 0xff, 0xff, 0xf7, 0x35, + 0xef, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xd, + 0xff, 0xff, 0xf4, 0x0, 0x1, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xf, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x20, 0x0, 0xd, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xfd, 0x20, 0x1a, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xcd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x79, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0x73, 0x5e, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x40, 0x0, 0x1f, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0xe, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xaf, 0xff, 0xff, 0xd2, 0x1, 0xaf, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x56, 0x52, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xdc, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x8f, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x46, 0x66, 0x66, 0x64, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x59, 0x99, 0x99, 0x99, 0x90, 0x8f, 0xff, 0xff, + 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xdd, 0xdd, + 0xdd, 0xdd, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xb9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x27, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x97, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x32, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, 0xf, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x60, + 0xf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x10, 0x0, 0x3c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x8d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x30, + 0x0, + + /* U+F0C9 "" */ + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x27, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x74, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x10, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x11, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x2, 0xd6, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0xaf, 0xff, 0xb1, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x2d, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x4, 0xdf, 0xff, 0xfd, 0x40, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x5, 0xaa, 0x50, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x20, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xab, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x1, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x10, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xca, 0xaa, 0xaa, 0xaa, 0xaa, 0xa7, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x1, 0xad, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0xff, 0xfc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, + 0x44, 0x44, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x64, + 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x7b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x9c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x82, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x8e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x8d, 0x50, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x8, + 0xff, 0x50, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0x50, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, 0xff, + 0x50, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x8, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x8, 0xff, 0xff, 0xff, 0xfe, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x5a, + 0xaa, 0xaa, 0xaa, 0xa0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x42, 0x22, 0x22, 0x22, + 0x22, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x2, 0x55, 0x55, 0x55, 0x55, + 0x52, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x30, 0x0, 0x12, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8b, 0xb9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x82, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x1e, 0xff, 0x60, 0x0, 0x3, 0xff, 0xf4, + 0x0, 0x0, 0x5f, 0xfe, 0x20, 0x0, 0x2e, 0xff, + 0x50, 0x0, 0x4, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, + 0xef, 0xf0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, + 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, 0x1f, 0xfc, + 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, + 0xff, 0x20, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, + 0x1f, 0xfc, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, + 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0xef, 0xf0, + 0x0, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0xc, 0xff, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x1d, 0xff, 0x60, 0x0, 0x2, + 0xff, 0xf3, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, + 0x1e, 0xff, 0x40, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xee, 0xef, 0xff, 0xfe, 0xee, 0xee, + 0xff, 0xff, 0xee, 0xee, 0xff, 0xff, 0xfe, 0xee, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xe0, + 0x0, 0x0, 0xef, 0xf3, 0x0, 0x0, 0x1f, 0xff, + 0x10, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, + 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0xcf, 0xf1, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xf1, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, 0xff, 0xc0, + 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x62, 0x22, 0x27, + 0xff, 0xf3, 0x22, 0x23, 0xff, 0xf7, 0x22, 0x22, + 0x5f, 0xff, 0x52, 0x22, 0x2a, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xcb, 0xbb, 0xcf, 0xff, 0xeb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xcf, 0xff, 0xeb, 0xbb, 0xbd, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xb, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x10, 0x0, + 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0xc, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xdc, 0xcc, 0xcf, + 0xff, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xdf, 0xff, 0xec, 0xcc, + 0xce, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x1, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x89, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x9b, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x4, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0xf, 0xff, 0xff, 0x60, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, + 0x60, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0xf, + 0xff, 0xff, 0xff, 0xff, 0x60, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x18, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa4, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x34, 0x56, 0x66, 0x65, 0x32, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xb7, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xdd, 0xee, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, + 0x53, 0x10, 0x0, 0x0, 0x0, 0x2, 0x47, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, + 0xff, 0xff, 0xf3, 0xb, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0x40, + 0x0, 0xcf, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x48, 0xac, 0xef, 0xff, 0xed, + 0xb9, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0xb, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x97, + 0x53, 0x33, 0x46, 0x8b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0x98, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xdc, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x38, 0x88, 0x88, 0x88, 0x88, 0x88, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x49, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb8, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xfe, 0xa0, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xcd, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x77, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe2, 0xff, 0xff, 0xfe, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xff, 0xff, 0xd4, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xad, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xaa, 0xae, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfd, 0x99, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xb0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x3, 0x9b, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x98, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb9, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x1, 0xef, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x9, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xde, + 0xff, 0xff, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xff, 0xff, 0xff, 0xfe, 0x50, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x55, 0x55, + 0x55, 0x55, 0xaf, 0xff, 0xd5, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf6, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xdd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x45, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x89, 0x99, 0x99, 0x99, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6a, 0xdf, 0xff, 0xff, 0xff, 0xc9, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xff, 0xf0, 0x0, 0xd5, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x3, 0xff, 0xff, 0xff, + 0xf5, 0x8, 0xff, 0xff, 0xf0, 0x0, 0xdf, 0x50, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x50, 0x6, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0xcf, 0xf6, 0x0, 0x9, 0xff, 0xff, 0xff, 0x80, + 0x9, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x8, 0xff, + 0xf0, 0x0, 0xcf, 0xfc, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xa0, 0xb, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0xcf, 0xc0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xc0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x7, 0xf0, 0x0, 0xcc, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xe0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x70, 0x0, + 0x80, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x30, 0x0, 0x40, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x3, 0xe0, 0x0, 0xc7, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x3e, 0xf1, 0x0, 0xcf, 0x60, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xd0, 0xa, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x3, 0xff, 0xf1, 0x0, + 0xcf, 0xf6, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3f, 0xff, + 0xf1, 0x0, 0xcf, 0xf9, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0x90, 0x4, 0xff, 0xff, 0xff, 0xd1, 0x3, + 0xff, 0xff, 0xf1, 0x0, 0xdf, 0xa0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x70, 0x1, 0xff, 0xff, 0xff, + 0xfd, 0x5f, 0xff, 0xff, 0xf1, 0x0, 0xda, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x70, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x8a, 0xcd, 0xdd, 0xcb, 0x96, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x67, + 0x77, 0x77, 0x77, 0x77, 0x76, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x9d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x50, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xc4, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x70, 0x7f, + 0xff, 0xff, 0xe3, 0x1c, 0xff, 0xff, 0xfb, 0x14, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, + 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, + 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, + 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, + 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, + 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, + 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, + 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, + 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, + 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, 0xff, + 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, 0xff, + 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, 0xff, + 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, 0xff, + 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0xdf, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, 0x7f, + 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, 0x1f, + 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, 0x0, + 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0x10, + 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, 0xf5, + 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, 0xfb, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0x10, 0x1f, 0xff, 0xff, 0xb0, 0x7, 0xff, 0xff, + 0xf5, 0x0, 0xdf, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xf1, 0x1, 0xff, 0xff, + 0xfb, 0x0, 0x7f, 0xff, 0xff, 0x50, 0xd, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0x70, 0x7f, 0xff, 0xff, 0xe3, 0x1c, 0xff, + 0xff, 0xfb, 0x14, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xab, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, + 0x71, 0x0, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdb, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x9b, 0xa8, 0x64, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x1d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3, 0xe3, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x53, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xeb, 0x40, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x3, 0xff, 0xff, 0xbb, 0xbb, + 0xff, 0xfb, 0xbb, 0xbc, 0xff, 0xeb, 0xbb, 0xbf, + 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, 0xff, 0xf1, + 0x0, 0xc, 0xff, 0x10, 0x0, 0x3f, 0xfa, 0x0, + 0x1, 0xff, 0xff, 0xfa, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x10, 0x0, 0xcf, 0xf1, 0x0, 0x3, 0xff, + 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xa0, 0x3, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0xc, 0xff, 0x10, 0x0, + 0x3f, 0xfa, 0x0, 0x1, 0xff, 0xff, 0xfa, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0xcf, 0xf1, + 0x0, 0x3, 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xff, + 0xa4, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xc, + 0xff, 0x10, 0x0, 0x3f, 0xfa, 0x0, 0x1, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0xcf, 0xf1, 0x0, 0x3, 0xff, 0xa0, 0x0, + 0x1f, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0xc, 0xff, 0x10, 0x0, 0x3f, 0xfa, + 0x0, 0x1, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0xcf, 0xf1, 0x0, 0x3, + 0xff, 0xa0, 0x0, 0x1f, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x65, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, 0x8a, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x61, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xd8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x32, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 198, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 197, .box_w = 7, .box_h = 33, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 116, .adv_w = 288, .box_w = 14, .box_h = 13, .ofs_x = 2, .ofs_y = 20}, + {.bitmap_index = 207, .adv_w = 517, .box_w = 31, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 719, .adv_w = 457, .box_w = 26, .box_h = 45, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1304, .adv_w = 620, .box_w = 37, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1915, .adv_w = 505, .box_w = 29, .box_h = 34, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2408, .adv_w = 155, .box_w = 5, .box_h = 13, .ofs_x = 2, .ofs_y = 20}, + {.bitmap_index = 2441, .adv_w = 248, .box_w = 11, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 2683, .adv_w = 249, .box_w = 11, .box_h = 44, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 2925, .adv_w = 294, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = 17}, + {.bitmap_index = 3087, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 3308, .adv_w = 167, .box_w = 7, .box_h = 14, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 3357, .adv_w = 282, .box_w = 13, .box_h = 4, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 3383, .adv_w = 167, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3408, .adv_w = 259, .box_w = 20, .box_h = 44, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 3848, .adv_w = 491, .box_w = 27, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4294, .adv_w = 272, .box_w = 13, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4509, .adv_w = 422, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4922, .adv_w = 421, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5335, .adv_w = 492, .box_w = 30, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5830, .adv_w = 422, .box_w = 25, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6243, .adv_w = 454, .box_w = 26, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6672, .adv_w = 440, .box_w = 25, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7085, .adv_w = 474, .box_w = 26, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7514, .adv_w = 454, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7943, .adv_w = 167, .box_w = 7, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8031, .adv_w = 167, .box_w = 7, .box_h = 32, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 8143, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 8364, .adv_w = 428, .box_w = 21, .box_h = 15, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 8522, .adv_w = 428, .box_w = 21, .box_h = 21, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 8743, .adv_w = 422, .box_w = 24, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9139, .adv_w = 761, .box_w = 44, .box_h = 42, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 10063, .adv_w = 539, .box_w = 35, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10641, .adv_w = 557, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 11120, .adv_w = 532, .box_w = 30, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 11615, .adv_w = 608, .box_w = 32, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12143, .adv_w = 493, .box_w = 25, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12556, .adv_w = 467, .box_w = 24, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 12952, .adv_w = 568, .box_w = 30, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13447, .adv_w = 598, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13926, .adv_w = 228, .box_w = 6, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14025, .adv_w = 378, .box_w = 21, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14372, .adv_w = 529, .box_w = 30, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 14867, .adv_w = 437, .box_w = 23, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15247, .adv_w = 703, .box_w = 36, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 15841, .adv_w = 598, .box_w = 29, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 16320, .adv_w = 618, .box_w = 35, .box_h = 33, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 16898, .adv_w = 531, .box_w = 27, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 17344, .adv_w = 618, .box_w = 36, .box_h = 40, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 18064, .adv_w = 535, .box_w = 28, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 18526, .adv_w = 457, .box_w = 26, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18955, .adv_w = 432, .box_w = 27, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19401, .adv_w = 582, .box_w = 28, .box_h = 33, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 19863, .adv_w = 524, .box_w = 34, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20424, .adv_w = 829, .box_w = 50, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 21249, .adv_w = 495, .box_w = 31, .box_h = 33, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21761, .adv_w = 476, .box_w = 31, .box_h = 33, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 22273, .adv_w = 484, .box_w = 28, .box_h = 33, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22735, .adv_w = 245, .box_w = 11, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 22977, .adv_w = 259, .box_w = 20, .box_h = 44, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 23417, .adv_w = 245, .box_w = 11, .box_h = 44, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 23659, .adv_w = 429, .box_w = 21, .box_h = 20, .ofs_x = 3, .ofs_y = 7}, + {.bitmap_index = 23869, .adv_w = 368, .box_w = 23, .box_h = 3, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 23904, .adv_w = 442, .box_w = 13, .box_h = 6, .ofs_x = 5, .ofs_y = 28}, + {.bitmap_index = 23943, .adv_w = 440, .box_w = 22, .box_h = 25, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 24218, .adv_w = 502, .box_w = 26, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 24673, .adv_w = 420, .box_w = 24, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 24973, .adv_w = 502, .box_w = 27, .box_h = 35, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25446, .adv_w = 450, .box_w = 26, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 25771, .adv_w = 260, .box_w = 18, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26086, .adv_w = 508, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 26545, .adv_w = 501, .box_w = 24, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 26965, .adv_w = 205, .box_w = 7, .box_h = 36, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 27091, .adv_w = 209, .box_w = 15, .box_h = 45, .ofs_x = -5, .ofs_y = -9}, + {.bitmap_index = 27429, .adv_w = 453, .box_w = 25, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27867, .adv_w = 205, .box_w = 5, .box_h = 35, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 27955, .adv_w = 778, .box_w = 41, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 28468, .adv_w = 501, .box_w = 24, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 28768, .adv_w = 467, .box_w = 27, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 29106, .adv_w = 502, .box_w = 26, .box_h = 34, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 29548, .adv_w = 502, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 30007, .adv_w = 302, .box_w = 14, .box_h = 25, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30182, .adv_w = 369, .box_w = 21, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 30445, .adv_w = 305, .box_w = 18, .box_h = 31, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 30724, .adv_w = 498, .box_w = 24, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 31024, .adv_w = 411, .box_w = 27, .box_h = 25, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 31362, .adv_w = 662, .box_w = 42, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 31887, .adv_w = 406, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32200, .adv_w = 411, .box_w = 28, .box_h = 34, .ofs_x = -2, .ofs_y = -9}, + {.bitmap_index = 32676, .adv_w = 383, .box_w = 22, .box_h = 25, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32951, .adv_w = 258, .box_w = 14, .box_h = 44, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 33259, .adv_w = 220, .box_w = 5, .box_h = 44, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 33369, .adv_w = 258, .box_w = 14, .box_h = 44, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 33677, .adv_w = 428, .box_w = 23, .box_h = 8, .ofs_x = 2, .ofs_y = 12}, + {.bitmap_index = 33769, .adv_w = 308, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 18}, + {.bitmap_index = 33889, .adv_w = 231, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 33930, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 35035, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 35840, .adv_w = 736, .box_w = 46, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 36783, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 37588, .adv_w = 506, .box_w = 32, .box_h = 33, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 38116, .adv_w = 736, .box_w = 45, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 39174, .adv_w = 736, .box_w = 44, .box_h = 47, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 40208, .adv_w = 828, .box_w = 52, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 41274, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 42355, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 43265, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 44346, .adv_w = 368, .box_w = 23, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44760, .adv_w = 552, .box_w = 35, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45390, .adv_w = 828, .box_w = 52, .box_h = 44, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 46534, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 47339, .adv_w = 506, .box_w = 32, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 48091, .adv_w = 644, .box_w = 30, .box_h = 42, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 48721, .adv_w = 644, .box_w = 41, .box_h = 48, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 49705, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 50546, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 51387, .adv_w = 644, .box_w = 30, .box_h = 42, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 52017, .adv_w = 644, .box_w = 42, .box_h = 41, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 52878, .adv_w = 460, .box_w = 25, .box_h = 40, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 53378, .adv_w = 460, .box_w = 25, .box_h = 40, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 53878, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54719, .adv_w = 644, .box_w = 41, .box_h = 10, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 54924, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 55834, .adv_w = 920, .box_w = 58, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 57197, .adv_w = 828, .box_w = 54, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 58466, .adv_w = 736, .box_w = 46, .box_h = 42, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 59432, .adv_w = 644, .box_w = 40, .box_h = 25, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 59932, .adv_w = 644, .box_w = 40, .box_h = 25, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 60432, .adv_w = 920, .box_w = 58, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61476, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 62281, .adv_w = 736, .box_w = 46, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 63362, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 64467, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 65308, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 66272, .adv_w = 644, .box_w = 41, .box_h = 41, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 67113, .adv_w = 644, .box_w = 41, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67851, .adv_w = 736, .box_w = 46, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 68656, .adv_w = 460, .box_w = 31, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 69385, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 70349, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 71313, .adv_w = 828, .box_w = 52, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 72223, .adv_w = 736, .box_w = 48, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 73351, .adv_w = 552, .box_w = 35, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 74174, .adv_w = 920, .box_w = 58, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 75392, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 76262, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 77132, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 78002, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 78872, .adv_w = 920, .box_w = 58, .box_h = 30, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 79742, .adv_w = 920, .box_w = 58, .box_h = 36, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80786, .adv_w = 644, .box_w = 36, .box_h = 47, .ofs_x = 2, .ofs_y = -6}, + {.bitmap_index = 81632, .adv_w = 644, .box_w = 41, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 82596, .adv_w = 736, .box_w = 47, .box_h = 47, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 83701, .adv_w = 920, .box_w = 58, .box_h = 35, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 84716, .adv_w = 552, .box_w = 35, .box_h = 47, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 85539, .adv_w = 740, .box_w = 47, .box_h = 30, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 7, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 33, 0, 20, -16, 0, 0, + 0, 0, -40, -44, 5, 35, 16, 13, + -29, 5, 36, 2, 31, 7, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 6, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, -22, 0, 0, 0, 0, + 0, -15, 13, 15, 0, 0, -7, 0, + -5, 7, 0, -7, 0, -7, -4, -15, + 0, 0, 0, 0, -7, 0, 0, -10, + -11, 0, 0, -7, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, -11, 0, -20, 0, -89, 0, + 0, -15, 0, 15, 22, 1, 0, -15, + 7, 7, 24, 15, -13, 15, 0, 0, + -42, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -20, -9, -36, 0, -29, + -5, 0, 0, 0, 0, 1, 29, 0, + -22, -6, -2, 2, 0, -13, 0, 0, + -5, -54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -59, -6, 28, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, + 0, 7, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 28, 6, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 15, 7, 22, -7, 0, 0, 15, -7, + -24, -101, 5, 20, 15, 1, -10, 0, + 26, 0, 24, 0, 24, 0, -68, 0, + -9, 22, 0, 24, -7, 15, 7, 0, + 0, 2, -7, 0, 0, -13, 59, 0, + 59, 0, 22, 0, 31, 10, 13, 22, + 0, 0, 0, -27, 0, 0, 0, 0, + 2, -5, 0, 5, -13, -10, -15, 5, + 0, -7, 0, 0, 0, -29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -40, 0, -46, 0, 0, 0, + 0, -5, 0, 73, -9, -10, 7, 7, + -7, 0, -10, 7, 0, 0, -39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -71, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -46, 0, 44, 0, 0, -27, 0, + 24, 0, -50, -71, -50, -15, 22, 0, + 0, -49, 0, 9, -17, 0, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 22, -90, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -9, -15, 0, -2, + -2, -7, 0, 0, -5, 0, 0, 0, + -15, 0, -6, 0, -17, -15, 0, -18, + -24, -24, -14, 0, -15, 0, -15, 0, + 0, 0, 0, -6, 0, 0, 7, 0, + 5, -7, 0, 2, 0, 0, 0, 7, + -5, 0, 0, 0, -5, 7, 7, -2, + 0, 0, 0, -14, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 10, -5, 0, + -9, 0, -13, 0, 0, -5, 0, 22, + 0, 0, -7, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, -7, -9, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -7, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -5, -10, 0, -11, 0, -22, + -5, -22, 15, 0, 0, -15, 7, 15, + 20, 0, -18, -2, -9, 0, -2, -35, + 7, -5, 5, -39, 7, 0, 0, 2, + -38, 0, -39, -6, -64, -5, 0, -37, + 0, 15, 21, 0, 10, 0, 0, 0, + 0, 1, 0, -13, -10, 0, -22, 0, + 0, 0, -7, 0, 0, 0, -7, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -10, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, -5, -9, -6, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -9, + 0, -5, 0, -15, 7, 0, 0, -9, + 4, 7, 7, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -7, 0, -7, -5, -9, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + -6, 0, 0, 0, 0, -8, -11, 0, + -14, 0, 22, -5, 2, -24, 0, 0, + 20, -37, -38, -31, -15, 7, 0, -6, + -48, -13, 0, -13, 0, -15, 11, -13, + -47, 0, -20, 0, 0, 4, -2, 6, + -5, 0, 7, 1, -22, -28, 0, -37, + -18, -15, -18, -22, -9, -20, -1, -14, + -20, 4, 0, 2, 0, -7, 0, 0, + 0, 5, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, -4, 0, -2, -7, 0, -13, -16, + -16, -2, 0, -22, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 3, + -4, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 35, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -14, 0, 0, 0, 0, -37, -22, 0, + 0, 0, -11, -37, 0, 0, -7, 7, + 0, -20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -14, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, -13, 0, + 0, 0, 0, 9, 0, 5, -15, -15, + 0, -7, -7, -9, 0, 0, 0, 0, + 0, 0, -22, 0, -7, 0, -11, -7, + 0, -16, -18, -22, -6, 0, -15, 0, + -22, 0, 0, 0, 0, 59, 0, 0, + 4, 0, 0, -10, 0, 7, 0, -32, + 0, 0, 0, 0, 0, -68, -13, 24, + 22, -6, -31, 0, 7, -11, 0, -37, + -4, -10, 7, -52, -7, 10, 0, 11, + -26, -11, -27, -24, -31, 0, 0, -44, + 0, 42, 0, 0, -4, 0, 0, 0, + -4, -4, -7, -20, -24, -1, -68, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, -4, -7, -11, 0, 0, + -15, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -15, 0, 0, 15, + -2, 10, 0, -16, 7, -5, -2, -19, + -7, 0, -10, -7, -5, 0, -11, -13, + 0, 0, -6, -2, -5, -13, -9, 0, + 0, -7, 0, 7, -5, 0, -16, 0, + 0, 0, -15, 0, -13, 0, -13, -13, + 7, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 7, 0, -10, 0, -5, -9, + -23, -5, -5, -5, -2, -5, -9, -2, + 0, 0, 0, 0, 0, -7, -6, -6, + 0, 0, 0, 0, 9, -5, 0, -5, + 0, 0, 0, -5, -9, -5, -7, -9, + -7, 0, 6, 29, -2, 0, -20, 0, + -5, 15, 0, -7, -31, -10, 11, 1, + 0, -35, -13, 7, -13, 5, 0, -5, + -6, -24, 0, -11, 4, 0, 0, -13, + 0, 0, 0, 7, 7, -15, -14, 0, + -13, -7, -11, -7, -7, 0, -13, 4, + -14, -13, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, -10, + 0, 0, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -11, 0, -15, 0, 0, 0, -24, 0, + 5, -16, 15, 1, -5, -35, 0, 0, + -16, -7, 0, -29, -18, -21, 0, 0, + -32, -7, -29, -28, -35, 0, -19, 0, + 6, 49, -10, 0, -17, -7, -2, -7, + -13, -20, -13, -27, -30, -17, -7, 0, + 0, -5, 0, 2, 0, 0, -52, -7, + 22, 16, -16, -27, 0, 2, -23, 0, + -37, -5, -7, 15, -68, -10, 2, 0, + 0, -48, -9, -38, -7, -54, 0, 0, + -52, 0, 43, 2, 0, -5, 0, 0, + 0, 0, -4, -5, -28, -5, 0, -48, + 0, 0, 0, 0, -24, 0, -7, 0, + -2, -21, -35, 0, 0, -4, -11, -22, + -7, 0, -5, 0, 0, 0, 0, -33, + -7, -24, -24, -6, -13, -18, -7, -13, + 0, -15, -7, -24, -11, 0, -9, -14, + -7, -14, 0, 4, 0, -5, -24, 0, + 15, 0, -13, 0, 0, 0, 0, 9, + 0, 5, -15, 30, 0, -7, -7, -9, + 0, 0, 0, 0, 0, 0, -22, 0, + -7, 0, -11, -7, 0, -16, -18, -22, + -6, 0, -15, 6, 29, 0, 0, 0, + 0, 59, 0, 0, 4, 0, 0, -10, + 0, 7, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 0, + -5, -15, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -7, -7, 0, 0, -15, + -7, 0, 0, -15, 0, 13, -4, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 11, 15, 6, -7, 0, -24, + -12, 0, 22, -24, -24, -15, -15, 29, + 13, 7, -64, -5, 15, -7, 0, -7, + 8, -7, -26, 0, -7, 7, -10, -6, + -22, -6, 0, 0, 22, 15, 0, -21, + 0, -40, -10, 21, -10, -28, 2, -10, + -24, -24, -7, 29, 7, 0, -11, 0, + -20, 0, 6, 24, -17, -27, -29, -18, + 22, 0, 2, -54, -6, 7, -13, -5, + -17, 0, -16, -27, -11, -11, -6, 0, + 0, -17, -15, -7, 0, 22, 17, -7, + -40, 0, -40, -10, 0, -26, -43, -2, + -24, -13, -24, -21, 20, 0, 0, -10, + 0, -15, -7, 0, -7, -13, 0, 13, + -24, 7, 0, 0, -39, 0, -7, -16, + -13, -5, -22, -18, -24, -17, 0, -22, + -7, -17, -14, -22, -7, 0, 0, 2, + 35, -13, 0, -22, -7, 0, -7, -15, + -17, -20, -21, -28, -10, -15, 15, 0, + -11, 0, -37, -9, 4, 15, -24, -27, + -15, -24, 24, -7, 4, -68, -13, 15, + -16, -13, -27, 0, -22, -31, -9, -7, + -6, -7, -15, -22, -2, 0, 0, 22, + 21, -5, -48, 0, -44, -17, 18, -28, + -50, -15, -26, -31, -37, -24, 15, 0, + 0, 0, 0, -9, 0, 0, 7, -9, + 15, 5, -14, 15, 0, 0, -23, -2, + 0, -2, 0, 2, 2, -6, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 6, 22, 1, 0, -9, 0, 0, + 0, 0, -5, -5, -9, 0, 0, 0, + 2, 6, 0, 0, 0, 0, 6, 0, + -6, 0, 28, 0, 13, 2, 2, -10, + 0, 15, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -44, 0, -7, 13, 0, 22, + 0, 0, 73, 9, -15, -15, 7, 7, + -5, 2, -37, 0, 0, 35, -44, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -50, 28, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -14, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -20, 0, + 0, 2, 0, 0, 7, 95, -15, -6, + 24, 20, -20, 7, 0, 0, 7, 7, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -96, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -21, + 0, 0, 0, -20, 0, 0, 0, 0, + -16, -4, 0, 0, 0, -16, 0, -9, + 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -49, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -7, 0, 0, -14, 0, -11, 0, + -20, 0, 0, 0, -13, 7, -9, 0, + 0, -20, -7, -17, 0, 0, -20, 0, + -7, 0, -35, 0, -8, 0, 0, -60, + -14, -29, -8, -26, 0, 0, -49, 0, + -20, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -11, -13, -6, -13, 0, 0, + 0, 0, -16, 0, -16, 10, -8, 15, + 0, -5, -17, -5, -13, -14, 0, -9, + -4, -5, 5, -20, -2, 0, 0, 0, + -65, -6, -10, 0, -16, 0, -5, -35, + -7, 0, 0, -5, -6, 0, 0, 0, + 0, 5, 0, -5, -13, -5, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, + 0, -16, 0, -5, 0, 0, 0, -15, + 7, 0, 0, 0, -20, -7, -15, 0, + 0, -21, 0, -7, 0, -35, 0, 0, + 0, 0, -71, 0, -15, -27, -37, 0, + 0, -49, 0, -5, -11, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -11, -4, + -11, 2, 0, 0, 13, -10, 0, 23, + 36, -7, -7, -22, 9, 36, 13, 16, + -20, 9, 31, 9, 21, 16, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 35, -13, -7, 0, -6, + 59, 32, 59, 0, 0, 0, 7, 0, + 0, 27, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, -62, -9, -6, -30, + -36, 0, 0, -49, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, -62, -9, -6, + -30, -36, 0, 0, -29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, -17, 7, 0, -7, + 6, 13, 7, -22, 0, -1, -6, 7, + 0, 6, 0, 0, 0, 0, -18, 0, + -7, -5, -15, 0, -7, -29, 0, 46, + -7, 0, -16, -5, 0, -5, -13, 0, + -7, -21, -15, -9, 0, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, -62, + -9, -6, -30, -36, 0, 0, -49, 0, + 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, -24, -9, -7, 22, -7, -7, + -29, 2, -4, 2, -5, -20, 1, 16, + 1, 6, 2, 6, -18, -29, -9, 0, + -28, -14, -20, -31, -29, 0, -12, -15, + -9, -10, -6, -5, -9, -5, 0, -5, + -2, 11, 0, 11, -5, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -7, -7, 0, 0, + -20, 0, -4, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -44, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, -10, + 0, 0, 0, 0, -6, 0, 0, -13, + -7, 7, 0, -13, -14, -5, 0, -21, + -5, -16, -5, -9, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -49, 0, 24, 0, 0, -13, 0, + 0, 0, 0, -10, 0, -7, 0, 0, + -4, 0, 0, -5, 0, -17, 0, 0, + 31, -10, -24, -23, 5, 8, 8, -1, + -21, 5, 11, 5, 22, 5, 24, -5, + -20, 0, 0, -29, 0, 0, -22, -20, + 0, 0, -15, 0, -10, -13, 0, -11, + 0, -11, 0, -5, 11, 0, -6, -22, + -7, 27, 0, 0, -7, 0, -15, 0, + 0, 10, -17, 0, 7, -7, 6, 1, + 0, -24, 0, -5, -2, 0, -7, 8, + -6, 0, 0, 0, -30, -9, -16, 0, + -22, 0, 0, -35, 0, 27, -7, 0, + -13, 0, 4, 0, -7, 0, -7, -22, + 0, -7, 7, 0, 0, 0, 0, -5, + 0, 0, 7, -10, 2, 0, 0, -9, + -5, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -46, 0, 16, 0, + 0, -6, 0, 0, 0, 0, 1, 0, + -7, -7, 0, 0, 0, 15, 0, 17, + 0, 0, 0, 0, 0, -46, -42, 2, + 32, 22, 13, -29, 5, 31, 0, 27, + 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_46 = { +#else +lv_font_t lv_font_montserrat_46 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 50, /*The maximum line height required by the font*/ + .base_line = 9, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -3, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_46*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_48.c b/inc/lvgl/src/font/lv_font_montserrat_48.c new file mode 100644 index 0000000..1f731ac --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_48.c @@ -0,0 +1,12569 @@ +/******************************************************************************* + * Size: 48 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 48 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_48.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_48 + #define LV_FONT_MONTSERRAT_48 1 +#endif + +#if LV_FONT_MONTSERRAT_48 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x3f, 0xff, 0xff, 0x23, 0xff, 0xff, 0xf1, 0x2f, + 0xff, 0xff, 0x11, 0xff, 0xff, 0xf0, 0x1f, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xfe, + 0x0, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xfd, 0x0, + 0xef, 0xff, 0xc0, 0xd, 0xff, 0xfc, 0x0, 0xdf, + 0xff, 0xb0, 0xc, 0xff, 0xfa, 0x0, 0xcf, 0xff, + 0xa0, 0xb, 0xff, 0xf9, 0x0, 0xaf, 0xff, 0x80, + 0xa, 0xff, 0xf8, 0x0, 0x9f, 0xff, 0x70, 0x9, + 0xff, 0xf7, 0x0, 0x8f, 0xff, 0x60, 0x7, 0xff, + 0xf5, 0x0, 0x7f, 0xff, 0x50, 0x6, 0xff, 0xf4, + 0x0, 0x14, 0x44, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x7, 0xff, 0xf6, 0x4, 0xff, 0xff, + 0xf3, 0x9f, 0xff, 0xff, 0x79, 0xff, 0xff, 0xf6, + 0x3f, 0xff, 0xff, 0x10, 0x4c, 0xfc, 0x30, + + /* U+0022 "\"" */ + 0xff, 0xff, 0x0, 0x0, 0x4f, 0xff, 0xbf, 0xff, + 0xf0, 0x0, 0x4, 0xff, 0xfb, 0xef, 0xff, 0x0, + 0x0, 0x3f, 0xff, 0xae, 0xff, 0xf0, 0x0, 0x3, + 0xff, 0xfa, 0xef, 0xff, 0x0, 0x0, 0x3f, 0xff, + 0xad, 0xff, 0xe0, 0x0, 0x2, 0xff, 0xf9, 0xdf, + 0xfe, 0x0, 0x0, 0x2f, 0xff, 0x9c, 0xff, 0xd0, + 0x0, 0x1, 0xff, 0xf8, 0xcf, 0xfd, 0x0, 0x0, + 0x1f, 0xff, 0x8c, 0xff, 0xc0, 0x0, 0x1, 0xff, + 0xf7, 0xbf, 0xfc, 0x0, 0x0, 0xf, 0xff, 0x7b, + 0xff, 0xc0, 0x0, 0x0, 0xff, 0xf7, 0xbf, 0xfb, + 0x0, 0x0, 0xf, 0xff, 0x61, 0x22, 0x10, 0x0, + 0x0, 0x22, 0x20, + + /* U+0023 "#" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x1, 0x88, 0x88, 0x88, 0xcf, 0xff, 0x88, 0x88, + 0x88, 0x88, 0x9f, 0xff, 0xb8, 0x88, 0x88, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x88, 0x88, 0x8d, 0xff, 0xe8, 0x88, 0x88, + 0x88, 0x89, 0xff, 0xfa, 0x88, 0x88, 0x87, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x20, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, + 0xff, 0xfd, 0xc8, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa1, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0xa, 0xff, 0xff, 0xfe, 0x95, 0x7f, 0xfc, 0x45, + 0x8c, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xf8, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x1, 0x7e, + 0xf5, 0x0, 0x0, 0xbf, 0xff, 0xf7, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x20, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x30, + 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xb4, 0x6, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xfe, 0xcf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xee, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x3, + 0xaf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x1b, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, + 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xb0, 0x0, 0x0, 0xe, 0xff, 0xfc, + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x90, 0xe, 0xf8, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, + 0xcf, 0xff, 0xf5, 0x6, 0xff, 0xfe, 0x71, 0x0, + 0x0, 0x6f, 0xfb, 0x0, 0x1, 0xbf, 0xff, 0xfd, + 0x0, 0xdf, 0xff, 0xff, 0xfb, 0x74, 0x37, 0xff, + 0xb3, 0x6a, 0xff, 0xff, 0xff, 0x40, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x48, 0xbe, 0xff, 0xff, 0xff, 0xda, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x88, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0025 "%" */ + 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xfe, 0xcd, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xfe, 0x40, 0x0, 0x3c, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf2, 0x0, + 0x0, 0x1, 0xdf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x5f, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xf, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x50, 0x0, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x50, 0x0, 0x0, 0x8f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x40, 0x0, + 0x3, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x30, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x10, 0x0, 0xd, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x5f, 0xfd, 0x0, 0x0, 0x9f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf2, 0x0, 0x0, 0x1, 0xdf, 0xf7, 0x0, + 0x4, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x50, 0x0, 0x3c, + 0xff, 0xe0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xfe, 0xce, 0xff, 0xff, 0x30, 0x0, 0x9f, 0xff, + 0x20, 0x0, 0x16, 0xab, 0xb9, 0x40, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x4, 0xff, 0xf6, 0x0, 0x5, 0xef, 0xff, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x5, 0xbe, 0xfe, + 0xc7, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x10, 0x3, 0xff, 0xfb, 0x30, 0x15, 0xef, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xf6, 0x0, 0xd, 0xff, 0xa0, 0x0, + 0x0, 0x1d, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x3f, + 0xfe, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x10, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf5, 0x0, 0x0, 0xbf, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xb0, 0x0, 0x0, + 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, + 0x10, 0x0, 0x0, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfd, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x70, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf7, + 0x0, 0x2, 0xbf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfd, 0xdf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xdf, 0xfd, 0x81, 0x0, 0x0, + + /* U+0026 "&" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0xad, 0xff, 0xec, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xa7, 0x68, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x5f, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfa, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf7, + 0x0, 0x6, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf6, + 0x3c, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xf6, 0x4, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x4f, 0xb6, 0x10, 0x0, 0x8, + 0xff, 0xff, 0xc1, 0x0, 0x4, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xcf, 0xff, 0x40, 0x0, 0xef, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, + 0x0, 0x2f, 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, + 0x9, 0xff, 0xfa, 0x0, 0xa, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf9, + 0xff, 0xff, 0x40, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xbf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xfe, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xe7, 0x30, 0x0, + 0x1, 0x59, 0xff, 0xff, 0xff, 0xef, 0xff, 0xfa, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0x31, 0xdf, 0xff, 0xfa, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x2, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb4, 0x0, 0x0, 0x2, 0xef, 0xe1, 0x0, + 0x0, 0x0, 0x2, 0x7a, 0xdf, 0xff, 0xed, 0xa6, + 0x10, 0x0, 0x0, 0x0, 0x2, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xff, 0xff, 0xf, 0xff, 0xf0, 0xef, 0xff, 0xe, + 0xff, 0xf0, 0xef, 0xff, 0xd, 0xff, 0xe0, 0xdf, + 0xfe, 0xc, 0xff, 0xd0, 0xcf, 0xfd, 0xc, 0xff, + 0xc0, 0xbf, 0xfc, 0xb, 0xff, 0xc0, 0xbf, 0xfb, + 0x1, 0x22, 0x10, + + /* U+0028 "(" */ + 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x9f, 0xff, 0xd0, 0x0, 0x0, 0x2f, 0xff, 0xf5, + 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x7f, 0xff, 0xf0, + 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x7f, 0xff, 0xf0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xff, + 0xf2, 0x0, 0x0, 0x6, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x6f, 0xff, 0xf2, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4f, + 0xff, 0xf3, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x40, + 0x0, 0x0, 0xc, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x60, + + /* U+0029 ")" */ + 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xc0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, + 0x0, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xb0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xe0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf3, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x1f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x90, 0x0, 0x0, 0xd, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0xd, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x90, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x1f, + 0xff, 0xf6, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0xc, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, 0xf3, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xa0, 0x0, 0x0, 0x1f, 0xff, 0xf6, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x4f, 0xff, 0xf4, + 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xaf, 0xff, 0xc0, + 0x0, 0x0, 0x3f, 0xff, 0xf3, 0x0, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, + 0xd, 0xff, 0x0, 0x0, 0x2a, 0x10, 0x5, 0xff, + 0xa1, 0x0, 0xdf, 0xf0, 0x0, 0x8f, 0xf8, 0x0, + 0xdf, 0xff, 0xf7, 0xc, 0xff, 0x5, 0xef, 0xff, + 0xf1, 0x2, 0xbf, 0xff, 0xfd, 0xef, 0xfb, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x4d, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x6, 0xef, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xee, 0xff, 0xcf, 0xff, + 0xfb, 0x20, 0xd, 0xff, 0xff, 0x80, 0xcf, 0xf0, + 0x6e, 0xff, 0xff, 0x10, 0x6f, 0xfb, 0x20, 0xd, + 0xff, 0x0, 0x19, 0xff, 0x90, 0x0, 0xb5, 0x0, + 0x0, 0xdf, 0xf0, 0x0, 0x3, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdf, + 0xff, 0xfd, 0xdd, 0xdd, 0xdd, 0xd9, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, + + /* U+002C "," */ + 0x0, 0x57, 0x50, 0x0, 0xcf, 0xff, 0xb0, 0x7f, + 0xff, 0xff, 0x5a, 0xff, 0xff, 0xf9, 0x9f, 0xff, + 0xff, 0x83, 0xff, 0xff, 0xf5, 0x4, 0xef, 0xff, + 0x10, 0xd, 0xff, 0xb0, 0x1, 0xff, 0xf6, 0x0, + 0x5f, 0xff, 0x10, 0x9, 0xff, 0xb0, 0x0, 0xdf, + 0xf6, 0x0, 0x1f, 0xff, 0x10, 0x5, 0xff, 0xb0, + 0x0, + + /* U+002D "-" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, + + /* U+002E "." */ + 0x0, 0x79, 0x70, 0x1, 0xdf, 0xff, 0xc0, 0x8f, + 0xff, 0xff, 0x6b, 0xff, 0xff, 0xf9, 0xaf, 0xff, + 0xff, 0x73, 0xff, 0xff, 0xf1, 0x4, 0xcf, 0xc3, + 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, 0xfe, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x75, 0x57, + 0xbf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, + 0x2, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x8, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x80, 0xd, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0x1f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0x5f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf7, 0x9f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf9, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfa, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfb, 0xaf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xfa, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, + 0x7f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf7, 0x5f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf5, 0x1f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0xd, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xd0, + 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x2, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xfb, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfb, 0x76, 0x67, 0xbf, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, + + /* U+0031 "1" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x23, 0x33, 0x33, 0x34, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, + + /* U+0032 "2" */ + 0x0, 0x0, 0x0, 0x3, 0x7b, 0xde, 0xff, 0xed, + 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfa, 0x76, 0x55, 0x7a, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x1c, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf5, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, + + /* U+0033 "3" */ + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x38, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xfd, 0xa7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xee, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x8e, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe0, 0x6, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0x90, 0xe, 0xff, 0xfe, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, + 0x10, 0x8f, 0xff, 0xff, 0xff, 0xd9, 0x76, 0x56, + 0x7a, 0xef, 0xff, 0xff, 0xf7, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x9c, 0xef, 0xff, 0xec, 0x96, 0x10, 0x0, + 0x0, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x3, 0xbb, 0xbb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x42, 0x22, 0x22, 0x22, 0x22, 0x22, 0x7f, + 0xff, 0xf4, 0x22, 0x22, 0x21, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x82, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf2, 0x0, 0x0, 0x0, + + /* U+0035 "5" */ + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf4, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdc, 0x96, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x2, 0x33, + 0x33, 0x33, 0x33, 0x45, 0x79, 0xdf, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfa, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf6, 0x0, + 0xdf, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf1, 0x6, 0xff, 0xff, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, + 0x90, 0xe, 0xff, 0xff, 0xff, 0xfc, 0x87, 0x65, + 0x68, 0xcf, 0xff, 0xff, 0xfe, 0x10, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x7b, 0xde, 0xff, 0xfd, 0xb8, 0x40, 0x0, + 0x0, 0x0, + + /* U+0036 "6" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xac, 0xef, + 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x81, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xb7, 0x53, 0x33, 0x57, + 0xbf, 0xf4, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x17, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0x5, 0xad, 0xef, 0xfe, + 0xb8, 0x30, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf3, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x22, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xb, 0xff, 0xff, + 0xef, 0xff, 0xf9, 0x41, 0x0, 0x3, 0x8e, 0xff, + 0xff, 0xf8, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xf2, + 0x9, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x8f, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x6, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x3f, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0xb, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0x30, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x7, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x70, 0x0, 0xd, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xfa, 0x41, 0x0, 0x3, + 0x8e, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xce, 0xff, 0xfd, 0xa6, 0x10, + 0x0, 0x0, 0x0, + + /* U+0037 "7" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x9f, 0xff, 0xf4, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xdf, 0xff, + 0xf4, 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xc0, 0x9f, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x50, 0x9f, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x0, + 0x9f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf7, 0x0, 0x9f, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf1, 0x0, 0x25, 0x55, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x0, 0x0, 0x1, 0x69, 0xce, 0xff, 0xfe, + 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xf8, 0x41, 0x0, 0x1, 0x49, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xf, 0xff, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xfe, + 0x0, 0x5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, 0x0, 0x9f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x70, 0xa, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xf9, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, 0x7, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x3f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x10, 0x0, 0xbf, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0x90, 0x0, + 0x1, 0xef, 0xff, 0xff, 0x95, 0x20, 0x0, 0x25, + 0xaf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0xdb, 0xbc, 0xdf, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x1, 0xef, 0xff, 0xff, 0x93, + 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xff, 0xd1, + 0x0, 0xbf, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0x90, 0x3f, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0x29, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf7, 0xcf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xad, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfc, 0xdf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xcc, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x8f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x73, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, + 0x2e, 0xff, 0xff, 0xfd, 0x73, 0x0, 0x0, 0x14, + 0x8e, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xac, 0xef, 0xff, 0xec, 0xa6, 0x20, + 0x0, 0x0, 0x0, + + /* U+0039 "9" */ + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xef, 0xff, 0xdb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xb5, 0x10, 0x0, 0x15, 0xbf, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0x70, + 0x0, 0xe, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0x20, 0x4, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xf9, 0x0, 0x8f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x50, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf9, 0x9, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xc0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0x20, 0x2f, 0xff, 0xff, 0xfb, 0x52, + 0x0, 0x1, 0x5b, 0xff, 0xff, 0xef, 0xff, 0xf3, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0x40, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x19, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x50, 0x9, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x1, 0x6a, 0xdf, 0xff, 0xec, + 0x84, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0xbf, 0xfa, 0x74, 0x33, 0x45, 0x9d, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x69, 0xce, 0xff, 0xfe, 0xb9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+003A ":" */ + 0x4, 0xcf, 0xc3, 0x3, 0xff, 0xff, 0xf2, 0xaf, + 0xff, 0xff, 0x7b, 0xff, 0xff, 0xf9, 0x8f, 0xff, + 0xff, 0x61, 0xef, 0xff, 0xc0, 0x0, 0x79, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x97, 0x0, 0x1d, 0xff, + 0xfc, 0x8, 0xff, 0xff, 0xf6, 0xbf, 0xff, 0xff, + 0x9a, 0xff, 0xff, 0xf7, 0x3f, 0xff, 0xff, 0x10, + 0x4c, 0xfc, 0x30, + + /* U+003B ";" */ + 0x4, 0xcf, 0xc3, 0x3, 0xff, 0xff, 0xf2, 0xaf, + 0xff, 0xff, 0x7b, 0xff, 0xff, 0xf9, 0x8f, 0xff, + 0xff, 0x61, 0xef, 0xff, 0xc0, 0x0, 0x79, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0x75, 0x0, 0xc, 0xff, + 0xfb, 0x7, 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, + 0x99, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0x50, + 0x4e, 0xff, 0xf1, 0x0, 0xdf, 0xfb, 0x0, 0x1f, + 0xff, 0x60, 0x5, 0xff, 0xf1, 0x0, 0x9f, 0xfb, + 0x0, 0xd, 0xff, 0x60, 0x1, 0xff, 0xf1, 0x0, + 0x5f, 0xfb, 0x0, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, 0xff, + 0x93, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xff, 0xff, + 0xff, 0xfc, 0x60, 0x0, 0x0, 0x0, 0x6, 0xcf, + 0xff, 0xff, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x0, + 0x39, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, + 0xe8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x36, + + /* U+003D "=" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xd9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xd9, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+003E ">" */ + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xfe, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, + 0xff, 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x9e, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xef, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, + 0xfe, 0x92, 0x0, 0x0, 0x0, 0x2, 0x9e, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xff, 0xe9, 0x20, 0x0, 0x0, + 0x0, 0x39, 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xfe, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xe9, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x0, 0x4, 0x8b, 0xdf, 0xff, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc7, 0x43, + 0x22, 0x48, 0xef, 0xff, 0xff, 0xf3, 0x4, 0xff, + 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xa0, 0x2, 0xdf, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, + 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xfc, 0x20, 0x0, 0x0, 0x0, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x37, 0x9c, 0xde, 0xff, 0xed, 0xc9, 0x63, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xfd, 0xa7, 0x54, + 0x33, 0x45, 0x7a, 0xdf, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xd6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6d, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xab, 0xba, 0x73, 0x0, 0x0, 0x3b, + 0xbb, 0xa0, 0xc, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x5f, 0xff, + 0xd0, 0x1, 0xdf, 0xff, 0x20, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x5f, 0xff, 0xd0, + 0x0, 0x3f, 0xff, 0xb0, 0x0, 0x0, 0x6f, 0xff, + 0x80, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x5f, 0xff, 0xd0, 0x0, + 0x7, 0xff, 0xf3, 0x0, 0x0, 0xef, 0xfe, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf9, 0x41, 0x1, + 0x38, 0xef, 0xff, 0xef, 0xff, 0xd0, 0x0, 0x0, + 0xef, 0xfa, 0x0, 0x4, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, + 0xff, 0x10, 0xa, 0xff, 0xf0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x1f, 0xff, + 0x60, 0xf, 0xff, 0xb0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0xb, 0xff, 0xa0, + 0x2f, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7, 0xff, 0xd0, 0x5f, + 0xff, 0x30, 0x0, 0x0, 0x7f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xd0, 0x0, 0x0, 0x4, 0xff, 0xf0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xd0, + 0x0, 0x0, 0x1, 0xff, 0xf2, 0x9f, 0xfe, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xff, 0xf3, 0xaf, 0xfd, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0xff, 0xf4, 0xbf, 0xfd, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xff, 0xf4, 0xaf, 0xfd, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, + 0xf3, 0x9f, 0xfe, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xd0, 0x0, 0x0, 0x1, 0xff, 0xf3, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xd0, 0x0, 0x0, 0x2, 0xff, 0xf1, 0x5f, + 0xff, 0x30, 0x0, 0x0, 0x3f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x5, 0xff, 0xe0, 0x2f, 0xff, + 0x60, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x9, 0xff, 0xb0, 0xe, 0xff, 0xb0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0xf, 0xff, 0x60, 0x9, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8f, 0xff, 0x10, 0x4, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xde, 0xff, 0xfb, 0x0, 0x6, 0xff, + 0xf9, 0x0, 0x0, 0xdf, 0xfe, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xfc, 0xbc, 0xef, 0xff, + 0xff, 0x2a, 0xff, 0xff, 0xeb, 0xdf, 0xff, 0xe1, + 0x0, 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xd, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2, + 0x8b, 0xef, 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x2, + 0x9e, 0xfe, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xd6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x9f, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xfd, 0xa7, 0x55, 0x44, 0x56, 0x9b, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0xac, + 0xee, 0xff, 0xed, 0xb8, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfe, + 0xd, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x70, 0x7f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf1, 0x0, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf9, 0x0, + 0x9, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x20, 0x0, 0x2f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0xbf, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfe, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfb, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x90, 0x0, 0xe, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x10, + 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0xdf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xe0, + + /* U+0042 "B" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe8, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x30, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x7d, 0xff, 0xff, 0xfe, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x10, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf0, 0xf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x70, 0xf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xe0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x8e, 0xff, 0xff, 0xf3, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xff, 0xff, + 0xff, 0x30, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfd, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf5, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xaf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfe, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xcf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf8, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xaf, 0xff, 0xff, 0x3f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x49, 0xff, + 0xff, 0xff, 0xa0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, + 0xc9, 0x61, 0x0, 0x0, 0x0, + + /* U+0043 "C" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xc9, 0x65, 0x56, + 0x8b, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xff, 0xff, 0xf8, 0x0, 0x2, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe8, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0xd, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x90, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0x97, 0x55, 0x68, 0xbf, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7a, 0xde, + 0xff, 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, + + /* U+0044 "D" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdb, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, + 0x33, 0x45, 0x79, 0xdf, 0xff, 0xff, 0xff, 0xd2, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xd0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x30, 0xf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xf2, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x80, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfc, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf5, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xc0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf8, 0xf, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0x20, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xb0, 0xf, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xf9, 0x0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xf, 0xff, + 0xfe, 0x33, 0x33, 0x33, 0x33, 0x34, 0x46, 0x9d, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xee, 0xc9, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0045 "E" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0xf, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfe, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, + + /* U+0046 "F" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x32, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0xff, 0xff, 0xd2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x21, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xac, + 0xef, 0xff, 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xd9, + 0x75, 0x56, 0x7a, 0xef, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xd0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xfd, 0x10, + 0x0, 0xd, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xc1, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x33, 0x20, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x2f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x0, 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xe0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xd9, + 0x76, 0x56, 0x7a, 0xdf, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xef, 0xff, 0xdb, 0x95, 0x10, 0x0, 0x0, 0x0, + + /* U+0048 "H" */ + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, + + /* U+0049 "I" */ + 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, + 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, + 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, + 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, + 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, + 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, + 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, + 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, + 0xdf, 0xff, 0xfd, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0xff, 0xff, 0xdf, 0xff, 0xfd, + + /* U+004A "J" */ + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xfa, 0x0, 0x3d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x2e, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf3, 0x1d, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfd, + 0x2, 0xff, 0xff, 0xff, 0xc6, 0x43, 0x48, 0xef, + 0xff, 0xff, 0x60, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, + 0x0, 0x1, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x16, 0xad, 0xff, + 0xed, 0xa6, 0x10, 0x0, 0x0, + + /* U+004B "K" */ + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x1d, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x1, + 0xdf, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0xc, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0xcf, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0xb, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x68, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0xaf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xc, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x30, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x90, + 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xf6, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xe2, + + /* U+004C "L" */ + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xe3, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+004D "M" */ + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfc, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfc, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xee, 0xff, 0xfc, 0xff, 0xff, 0xab, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x6d, 0xff, 0xfc, 0xff, 0xff, + 0xa2, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0xe, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xa0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x5, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x10, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0xbf, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf7, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xd0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x8, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0x40, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xef, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, + 0xfb, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x10, 0x1, 0xff, 0xff, 0x80, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf2, 0x3f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfb, 0xcf, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, + + /* U+004E "N" */ + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x7f, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xaf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x2, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x4, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x70, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x40, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xfe, 0x20, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xfd, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xfa, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf7, + 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, + + /* U+004F "O" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xc9, 0x65, 0x56, 0x8b, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xfc, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, + 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xc0, 0x0, 0xcf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x20, 0x1f, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf7, + 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfd, 0x9, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xa, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xf0, 0x9f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x8, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xd0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfa, 0x1, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0xc, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf2, 0x0, 0x7f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xfc, 0x0, 0x0, 0xef, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x50, 0x0, 0x7, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xcf, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfc, + 0x96, 0x55, 0x68, 0xbf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7a, 0xde, 0xff, 0xed, 0xb8, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0050 "P" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x82, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x34, 0x56, + 0xae, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf1, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xf5, 0x0, 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, + 0x34, 0x56, 0xae, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xed, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xc9, 0x65, 0x56, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xfe, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x6, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xc0, + 0x0, 0xc, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x4f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xfa, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x9f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x0, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfd, 0x0, 0x5f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf7, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf2, 0x0, 0x8, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xc0, 0x0, + 0x1, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xa7, 0x43, + 0x34, 0x69, 0xdf, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6a, 0xde, 0xff, 0xff, 0xff, 0xf7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x4, 0xef, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0x94, 0x10, 0x25, 0xbf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x8b, 0xcd, 0xc9, + 0x50, 0x0, 0x0, + + /* U+0052 "R" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x81, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0xff, 0xff, 0xe3, 0x33, 0x33, 0x33, 0x34, 0x56, + 0xae, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xff, 0xff, 0xf5, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x50, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xa0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf2, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xf1, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xe0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x60, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xf6, 0x0, 0xff, 0xff, 0xd2, 0x22, 0x22, 0x22, + 0x22, 0x35, 0x8d, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, + 0x0, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x70, 0x0, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xf3, 0x0, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf5, + + /* U+0053 "S" */ + 0x0, 0x0, 0x0, 0x0, 0x16, 0x9c, 0xef, 0xff, + 0xec, 0x96, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x10, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xa6, 0x42, 0x23, 0x46, 0xad, + 0xff, 0xff, 0xd0, 0x0, 0x4, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9f, 0xf6, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x0, 0x0, 0xf, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, + 0x9d, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7e, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, + 0x65, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x90, 0xe, 0xfa, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf4, 0x6, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xfd, 0x0, + 0xdf, 0xff, 0xff, 0xfe, 0xa6, 0x42, 0x22, 0x35, + 0x7c, 0xff, 0xff, 0xff, 0x40, 0x3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x9c, 0xef, 0xff, 0xed, 0xb8, 0x40, + 0x0, 0x0, 0x0, + + /* U+0054 "T" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x37, 0xff, 0xff, + 0x93, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0055 "U" */ + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf2, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, + 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x4f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf2, 0x3f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf2, 0x2f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf1, 0x1f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0xf, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0xc, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xb0, + 0x8, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x4, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, 0x0, 0xdf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xfd, 0x97, 0x55, 0x79, 0xdf, 0xff, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x6a, 0xde, 0xff, 0xec, + 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+0056 "V" */ + 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x90, 0x0, 0xef, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x8f, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfb, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf4, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xd0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xf7, 0x0, 0x0, 0xe, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x6f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, + 0xdf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xc0, 0x4, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf2, 0xb, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x2f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x4f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf5, 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x5, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x50, + 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xfb, 0x0, 0x0, 0x5f, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0xf, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfd, 0xbf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xf8, 0x5f, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf2, 0xf, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xd0, 0xb, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x80, 0x5, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x20, 0x0, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x0, 0x0, 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x5, 0xff, 0xff, 0x40, 0x0, 0x0, 0xe, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf8, 0x0, 0x0, 0x5, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfd, 0x0, 0x0, 0xa, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xe0, + 0x0, 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x30, 0x0, + 0xf, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xf4, 0x0, 0x0, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0x80, 0x0, 0x5f, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x8, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf3, 0x1, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x40, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf8, 0x6, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x90, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xfd, 0xb, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x8f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x4f, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf4, 0xef, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xdf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfc, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0058 "X" */ + 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x70, + 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfb, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, + 0x0, 0x3f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, + 0x0, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, + 0x9, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, + 0x5f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x8f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xe1, + 0xc, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0x40, + 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf9, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x1, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x9f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x0, + 0x4, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x90, + 0x1e, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf5, + + /* U+0059 "Y" */ + 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0x50, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xb0, 0x0, 0x1, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xf2, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf7, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa0, 0x0, + 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0x30, + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, + 0x7, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x5f, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0xfd, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x30, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+005B "[" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xdd, 0xdd, 0xd1, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xdd, 0xdd, 0xd1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + + /* U+005C "\\" */ + 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf0, + + /* U+005D "]" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf1, 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+005E "^" */ + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xbb, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x44, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x0, + 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xf7, 0x0, 0x7f, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf1, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xa0, + 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x0, 0x0, 0x0, + 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, + 0xa, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xf1, 0x0, 0x0, 0x7f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, 0xf7, 0x0, + 0x0, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xfe, 0x0, 0x5, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0xc, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xc0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xf2, + + /* U+005F "_" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0x7, 0x88, 0x88, 0x50, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x2, 0xcf, 0xff, 0x70, + + /* U+0061 "a" */ + 0x0, 0x0, 0x0, 0x48, 0xbd, 0xef, 0xfd, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x3, 0xff, + 0xff, 0xd9, 0x52, 0x11, 0x25, 0x9f, 0xff, 0xff, + 0xf2, 0x0, 0xa, 0xfc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xa0, 0x0, 0x27, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x49, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x6, 0xff, 0xff, 0xfd, 0x86, 0x55, 0x55, + 0x55, 0x56, 0xff, 0xff, 0x80, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0x5f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x88, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0x9f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x87, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf8, 0x4f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0x80, 0xef, 0xff, 0xfa, 0x20, 0x0, 0x0, + 0x17, 0xef, 0xff, 0xff, 0xf8, 0x5, 0xff, 0xff, + 0xff, 0xda, 0x9a, 0xcf, 0xff, 0xfe, 0xef, 0xff, + 0x80, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x2d, 0xff, 0xf8, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0xdf, 0xff, 0x80, + 0x0, 0x0, 0x49, 0xce, 0xff, 0xdb, 0x72, 0x0, + 0xd, 0xff, 0xf8, + + /* U+0062 "b" */ + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x3, 0x8c, 0xef, 0xfe, 0xb8, + 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, 0xa, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x95, 0x21, 0x25, 0x9f, 0xff, 0xff, + 0xfd, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf9, 0x0, + 0xaf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xaf, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xba, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfb, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xaa, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0xaf, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, 0xa, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x30, 0xaf, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x52, 0x12, 0x59, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xaf, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xfc, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x3, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, 0x0, + 0xa, 0xff, 0xfc, 0x0, 0x0, 0x38, 0xce, 0xff, + 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+0063 "c" */ + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbd, 0xff, 0xfd, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x1d, 0xff, 0xff, 0xfe, 0x84, 0x21, 0x35, + 0xbf, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xf8, + 0x5, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfe, 0x50, 0xd, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, + 0x4f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x81, 0x0, 0x5, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x50, + 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xf8, 0x0, 0x1d, 0xff, 0xff, + 0xfe, 0x84, 0x21, 0x35, 0xbf, 0xff, 0xff, 0xf2, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xbd, 0xff, 0xfd, 0xa6, 0x10, 0x0, 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, 0x71, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x33, 0xff, 0xff, 0x60, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf6, 0x0, 0x2f, 0xff, + 0xff, 0xfe, 0x84, 0x21, 0x36, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xf6, + 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x69, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0xcf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x6e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x6f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x9f, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0x64, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xf6, 0xe, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x60, + 0x7f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf6, 0x0, 0xdf, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0x60, 0x2, 0xff, 0xff, 0xff, 0xe8, + 0x42, 0x13, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0x60, 0x0, 0x3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0xf, 0xff, 0xf6, + + /* U+0065 "e" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf8, 0x30, 0x0, 0x15, 0xcf, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xcf, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x5, 0xef, 0xff, 0xf4, 0x0, 0x6, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xfd, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x50, + 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xa0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf0, 0xcf, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef, 0xff, + 0xc5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x51, 0xcf, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9c, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0x90, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0x95, 0x31, + 0x23, 0x6b, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbd, 0xff, 0xfe, 0xc8, 0x40, 0x0, + 0x0, 0x0, + + /* U+0066 "f" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xef, 0xec, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xde, 0xff, 0xd0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xd4, 0x0, 0x2, 0x86, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x3, 0xdd, 0xdd, 0xff, 0xff, + 0xfd, 0xdd, 0xdd, 0xdc, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x0, 0x0, 0x0, 0x59, 0xce, 0xff, 0xec, + 0x83, 0x0, 0x0, 0xaf, 0xff, 0xb0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x40, + 0xa, 0xff, 0xfb, 0x0, 0x0, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0xaf, 0xff, + 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xaa, 0xff, 0xfb, 0x0, 0x6f, + 0xff, 0xff, 0xfd, 0x84, 0x21, 0x24, 0x8e, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x2f, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xfb, 0xb, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xb2, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xfb, 0x7f, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xbb, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfb, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xbf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xbe, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, 0xbf, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xb8, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, + 0x2f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xb0, 0xbf, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xfb, 0x2, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0x6, 0xff, 0xff, 0xff, 0xc7, 0x31, 0x1, + 0x37, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xef, 0xff, 0xb0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xe, 0xff, + 0xfb, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0xef, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x16, 0xbe, 0xff, 0xff, 0xd9, 0x40, + 0x0, 0xf, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x20, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xe0, 0x0, 0x1f, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0x10, 0x3, 0xff, 0xff, + 0xff, 0xd9, 0x53, 0x21, 0x23, 0x7b, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x3, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x6a, + 0xcd, 0xef, 0xfd, 0xc9, 0x61, 0x0, 0x0, 0x0, + 0x0, + + /* U+0068 "h" */ + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xb7, 0x20, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0xa, 0xff, 0xff, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x85, 0x33, 0x58, 0xef, + 0xff, 0xff, 0xe0, 0xa, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x60, + 0xaf, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xfd, 0xa, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf1, 0xaf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0xaf, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x7a, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, + + /* U+0069 "i" */ + 0x0, 0x37, 0x50, 0x0, 0x8f, 0xff, 0xd1, 0x3f, + 0xff, 0xff, 0x96, 0xff, 0xff, 0xfb, 0x4f, 0xff, + 0xff, 0x90, 0xaf, 0xff, 0xe1, 0x0, 0x58, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, + 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, + 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, + 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, + 0xaf, 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, + 0xff, 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, + 0xf0, 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, + 0xff, 0xff, 0x0, 0xaf, 0xff, 0xf0, 0xa, 0xff, + 0xff, 0x0, + + /* U+006A "j" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, + 0x3, 0xd5, 0x10, 0x4, 0xdf, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x1, 0x6b, 0xef, 0xfe, 0xb6, 0x0, 0x0, 0x0, + + /* U+006B "k" */ + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, 0x10, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xd1, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xfd, 0x10, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x4, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x5f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x6, + 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x5f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0x90, 0x8, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x10, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xc0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x50, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xf2, + + /* U+006C "l" */ + 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, + 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, + 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, + 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, + 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, + 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, + 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, + 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, + 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, + 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, 0xff, 0xff, + 0xaf, 0xff, 0xfa, 0xff, 0xff, 0xaf, 0xff, 0xfa, + 0xff, 0xff, + + /* U+006D "m" */ + 0xaf, 0xff, 0xc0, 0x0, 0x5, 0xad, 0xff, 0xfd, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8b, 0xef, + 0xfe, 0xc8, 0x40, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x0, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc3, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0xa, 0xff, 0xfc, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0x74, 0x34, 0x6b, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xb6, 0x43, 0x47, 0xcf, + 0xff, 0xff, 0xf1, 0xa, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x80, 0xaf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0xa, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xf2, 0xaf, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x6a, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, 0xaf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf9, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x9a, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xf9, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x9a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + + /* U+006E "n" */ + 0xaf, 0xff, 0xc0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xb7, 0x20, 0x0, 0x0, 0xa, 0xff, 0xfc, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0x0, 0xaf, 0xff, 0xc0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0xa, 0xff, 0xfc, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x85, + 0x33, 0x58, 0xef, 0xff, 0xff, 0xe0, 0xa, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x60, 0xaf, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfd, 0xa, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf1, 0xaf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x4a, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf6, 0xaf, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x7a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf8, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xf8, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x8a, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xf8, + + /* U+006F "o" */ + 0x0, 0x0, 0x0, 0x0, 0x38, 0xbe, 0xff, 0xed, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xfe, 0x84, 0x21, 0x25, 0xaf, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf3, + 0x0, 0x6, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xd0, 0x0, 0xdf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x50, 0x4f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfb, 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x3e, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x7f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xb0, 0xd, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xf5, + 0x0, 0x5f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0x30, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xe8, 0x42, 0x12, 0x5a, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8b, 0xef, + 0xfe, 0xda, 0x61, 0x0, 0x0, 0x0, 0x0, + + /* U+0070 "p" */ + 0xaf, 0xff, 0xc0, 0x0, 0x3, 0x8c, 0xef, 0xfe, + 0xb8, 0x30, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfc, + 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0xa, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x95, 0x21, 0x25, 0x9f, 0xff, + 0xff, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xff, 0xfb, + 0x10, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xf9, + 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf3, 0xa, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xa, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0xaf, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x8a, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xba, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfb, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xaa, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf7, + 0xaf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x4a, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xf0, 0xaf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfa, + 0xa, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x30, 0xaf, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x52, 0x12, 0x59, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xaf, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, + 0xff, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x38, 0xce, + 0xff, 0xeb, 0x83, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0071 "q" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xce, 0xff, 0xeb, + 0x72, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0xf, 0xff, 0xf6, 0x0, 0x0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, + 0x60, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xf6, 0x0, 0x2f, + 0xff, 0xff, 0xfe, 0x84, 0x21, 0x36, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x60, 0xd, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xf6, 0x7, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xf6, 0x4f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x69, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf6, 0xcf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x6e, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x6f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0xef, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x6c, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, + 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0x64, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xf6, 0xe, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x60, 0x7f, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf6, 0x0, 0xdf, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x2, 0xdf, + 0xff, 0xff, 0xff, 0x60, 0x2, 0xff, 0xff, 0xff, + 0xe8, 0x42, 0x13, 0x6b, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x60, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xef, + 0xfe, 0xb7, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x60, + + /* U+0072 "r" */ + 0xaf, 0xff, 0xc0, 0x0, 0x4, 0x9c, 0xef, 0xa, + 0xff, 0xfc, 0x0, 0x5e, 0xff, 0xff, 0xf0, 0xaf, + 0xff, 0xc0, 0x9f, 0xff, 0xff, 0xff, 0xa, 0xff, + 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xaf, 0xff, + 0xef, 0xff, 0xff, 0xd9, 0x88, 0xa, 0xff, 0xff, + 0xff, 0xfa, 0x20, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+0073 "s" */ + 0x0, 0x0, 0x0, 0x38, 0xbd, 0xef, 0xfe, 0xc9, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc5, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x4, 0xff, 0xff, 0xfb, + 0x52, 0x0, 0x1, 0x48, 0xdf, 0xfa, 0x0, 0xa, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xc2, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xfd, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xa7, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x26, 0x9c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x58, 0xdf, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xdf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xf8, 0x8, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, 0x1f, + 0xff, 0xff, 0xa7, 0x32, 0x10, 0x13, 0x7d, 0xff, + 0xff, 0xe0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x5c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x15, 0x8c, 0xde, + 0xff, 0xec, 0x96, 0x10, 0x0, 0x0, + + /* U+0074 "t" */ + 0x0, 0x0, 0x7, 0x88, 0x85, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xdd, 0xdd, + 0xff, 0xff, 0xfd, 0xdd, 0xdd, 0xdc, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x71, 0x0, + 0x3a, 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0xef, 0xfe, 0xb6, 0x0, + + /* U+0075 "u" */ + 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x1e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0x1e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf1, 0xdf, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0x1d, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf1, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0x1a, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xf1, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0x12, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xe4, 0x0, 0x0, + 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0x10, 0x4f, + 0xff, 0xff, 0xfc, 0x74, 0x34, 0x6a, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0x10, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x4f, 0xff, 0xf1, 0x0, 0x0, 0x4c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x4, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x4, 0x8c, 0xef, 0xfe, 0xb7, + 0x20, 0x0, 0x4f, 0xff, 0xf1, + + /* U+0076 "v" */ + 0xd, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x7, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf3, 0x1, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xc0, 0x0, 0x9f, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x60, + 0x0, 0x2f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xfe, 0x0, 0x0, 0xb, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf8, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfc, 0x0, 0x0, 0xd, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0x30, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x90, 0x0, + 0xbf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x2, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf7, 0x8, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xfd, 0xf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xbf, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0077 "w" */ + 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xa2, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xf4, 0xc, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfe, + 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x1, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xf3, 0x0, 0xb, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x0, 0x0, 0x5f, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfc, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, 0x0, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0xa, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xc0, 0x9f, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xf6, 0x3, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x60, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x0, 0xd, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x90, 0x0, + 0x7f, 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf1, 0x0, + 0x0, 0xe, 0xff, 0xf3, 0x0, 0x1, 0xff, 0xff, + 0x20, 0x0, 0x0, 0xdf, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x70, 0x0, 0x4, 0xff, + 0xfd, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x2f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0x70, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x8, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xf3, + 0x0, 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x30, 0x0, 0xef, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0x80, 0x6, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x0, + 0x4f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xfe, 0x0, 0xcf, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xe0, 0xa, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xf4, 0x2f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x50, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x98, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, + 0x5f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfc, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + + /* U+0078 "x" */ + 0x7, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xd0, 0x0, 0xbf, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x30, 0x0, 0x1e, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf6, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, + 0x0, 0xcf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xff, 0xf2, 0x0, 0x9, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfd, 0x0, 0x5f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xa1, 0xef, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xd7, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0x30, 0xaf, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf6, + 0x0, 0x1e, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xa0, 0x0, 0x3, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0x60, 0x0, 0x0, 0xa, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x7f, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfd, 0x0, + 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xa0, 0x1e, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf7, + + /* U+0079 "y" */ + 0x0, 0xdf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x6, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf3, 0x0, 0xf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0x50, 0x0, 0x1, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xe0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x90, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x20, 0x0, 0x0, 0x1f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xf9, 0x0, 0x0, 0x7, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf1, 0x0, 0x0, 0xef, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x70, 0x0, 0x5f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xfe, 0x0, + 0xc, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x3, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xc0, 0xaf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0x5f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x50, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xb4, 0x10, 0x27, + 0xef, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xef, 0xec, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+007A "z" */ + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdf, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x31, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, + + /* U+007B "{" */ + 0x0, 0x0, 0x0, 0x1, 0x7b, 0xef, 0xff, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xdc, 0x0, 0x0, 0x1f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf0, 0x0, 0x0, 0x3e, 0xef, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe7, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xdc, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, + 0x7b, 0xef, 0xff, + + /* U+007C "|" */ + 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, + 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, + 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, + 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, + 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, + 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, + 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, + 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, + 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, + 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, + 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, 0x5f, 0xff, + 0xf5, 0xff, 0xff, 0x5f, 0xff, 0xf5, 0xff, 0xff, + 0x50, + + /* U+007D "}" */ + 0x1f, 0xff, 0xeb, 0x60, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x1, 0xde, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x1, + 0x9f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xee, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xfe, 0x0, 0x0, 0x1, 0xde, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xe1, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xeb, 0x60, 0x0, 0x0, + 0x0, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x15, 0x88, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x40, 0x0, 0x5, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf1, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x2, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x9, 0xff, 0xd0, + 0x8, 0xff, 0xf9, 0x10, 0x4d, 0xff, 0xff, 0x60, + 0x0, 0x3f, 0xff, 0x90, 0xc, 0xff, 0xb0, 0x0, + 0x0, 0xbf, 0xff, 0xfd, 0xab, 0xff, 0xff, 0x30, + 0xf, 0xff, 0x30, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x2f, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x2a, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, + 0xfe, 0xc6, 0x0, 0x0, + + /* U+00B0 "°" */ + 0x0, 0x0, 0x2, 0x68, 0x86, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x3, 0xff, 0xfa, 0x30, 0x3, 0x9f, 0xff, 0x40, + 0xd, 0xff, 0x50, 0x0, 0x0, 0x5, 0xff, 0xe1, + 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf7, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfc, + 0xcf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0xdf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0x7f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, + 0x2f, 0xfe, 0x10, 0x0, 0x0, 0x1, 0xef, 0xf3, + 0x8, 0xff, 0xd4, 0x0, 0x0, 0x3d, 0xff, 0x90, + 0x0, 0xbf, 0xff, 0xda, 0xad, 0xff, 0xfc, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x39, 0xdf, 0xfd, 0x93, 0x0, 0x0, + + /* U+2022 "•" */ + 0x0, 0x5b, 0xdc, 0x60, 0x0, 0x9f, 0xff, 0xff, + 0x90, 0x5f, 0xff, 0xff, 0xff, 0x5b, 0xff, 0xff, + 0xff, 0xfb, 0xcf, 0xff, 0xff, 0xff, 0xdb, 0xff, + 0xff, 0xff, 0xfb, 0x6f, 0xff, 0xff, 0xff, 0x60, + 0xbf, 0xff, 0xff, 0xb0, 0x0, 0x7d, 0xfd, 0x80, + 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xee, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x72, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xa5, 0x10, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xe9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xce, 0xff, 0xeb, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x38, 0xce, 0xff, 0xeb, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xce, 0xff, 0xec, 0x83, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xce, 0xff, 0xec, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0x3d, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xd3, + 0xdf, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xfd, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xdf, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, + 0xdf, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfd, + 0x3d, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xd3, + + /* U+F00B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, + 0x0, 0x2, 0xcf, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xc2, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xe2, 0x1, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xe1, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x5e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x2b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x5f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x7f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x49, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xa9, 0x30, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x40, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x2, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xf9, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x50, + 0x5, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xa0, + 0x9, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe0, + 0xc, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf2, + 0xf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf4, + 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, + 0x2f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf7, + 0x3f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0x2f, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, + 0x1f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xf6, + 0xf, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf4, + 0xb, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xf2, + 0x8, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xe0, + 0x4, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc9, 0x76, 0x56, 0x8b, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7a, 0xdf, 0xff, 0xff, 0xfe, 0xc9, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x33, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xfd, 0x40, 0x0, 0x4, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x5, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xfb, 0x20, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x2, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0x88, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x6e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x88, 0xae, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xfb, 0x20, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x2, 0xbf, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xfe, 0x50, 0x0, 0x4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x4, 0xdf, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x5, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x50, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xfc, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x33, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0xcf, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, + 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x22, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x8, 0xff, 0x80, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0xaf, 0xff, 0xfa, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd2, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x8f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x1, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x8f, 0xff, 0xff, 0xf6, 0x9, 0xff, 0xff, + 0x50, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x5, 0xff, 0xff, 0x90, + 0x0, 0xcf, 0xe3, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x3e, 0xfc, 0x0, 0x0, 0x17, 0x10, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x1, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x4e, 0xe4, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x40, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xdf, 0x80, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x50, + 0x1e, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xe1, 0x8f, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7b, 0xef, 0xff, 0xff, 0xfc, 0x84, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x30, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x50, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x8, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x7, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x6, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0xba, 0xab, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x10, 0x0, 0x0, 0x1, 0x6c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xa9, 0x87, + 0x76, 0x54, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xaf, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0x90, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x45, 0x67, + 0x78, 0x9a, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb6, 0x10, 0x0, 0x0, 0x1, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xba, 0xab, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x60, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x1, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x4, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xcf, 0xff, 0xff, 0xfe, 0xb8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8e, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1, 0x52, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2f, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x70, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x9f, 0xff, + 0xfc, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x4f, 0xff, 0xb1, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x85, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x75, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xd3, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0xdf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0xb, 0xff, + 0xff, 0x30, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xc0, + 0x0, 0x4, 0xff, 0xff, 0x80, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x2, 0x74, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf4, 0x0, 0x0, 0xdf, 0xff, 0xd0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, + 0x90, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, + 0x8f, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x9f, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, + 0x0, 0x5, 0xff, 0xff, 0x60, 0x0, 0xf, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, 0xa0, + 0x0, 0xd, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, + 0xcf, 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x9, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xf0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0x0, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, + 0x9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xf9, 0x0, 0x0, 0xcf, + 0xff, 0xc0, 0x0, 0xa, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xff, 0xff, 0xa0, 0x0, 0xc, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0x80, 0x0, 0x5, 0xff, 0xff, 0x60, + 0x0, 0xf, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x9f, 0xff, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0xff, 0x10, 0x0, 0x3f, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f, 0xff, 0x90, + 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, 0x0, 0x8f, + 0xff, 0xf2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x2, 0x74, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0xdf, 0xff, 0xd0, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xc0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x30, 0x0, 0xc, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0xdf, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xc3, 0x0, 0x0, 0x2, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x75, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x45, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x22, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x45, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x2e, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x2e, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + + /* U+F043 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x48, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xf3, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xbf, 0xff, 0xff, 0x70, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb7, 0xff, 0xff, 0xfc, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x3f, 0xff, 0xff, 0xf4, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0xdf, 0xff, 0xff, 0xd1, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x5, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x73, 0x10, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xfe, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x80, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0xcf, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, 0xfd, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x40, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0xfd, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe9, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x7d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0x0, + + /* U+F04D "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd8, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x9f, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xef, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0x8, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe8, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x89, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, + 0x0, 0x0, + + /* U+F054 "" */ + 0x0, 0x2, 0x98, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xcf, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x86, 0x10, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe3, 0x1, 0x68, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xcf, 0xff, 0xff, + 0xff, 0xfc, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x86, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcf, 0xff, + 0xfc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F068 "" */ + 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x42, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb9, 0x30, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x47, 0xac, 0xef, 0xff, 0xfe, 0xca, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xba, 0x88, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xda, 0x40, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x20, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0xdc, 0x98, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x4, 0x9d, 0xff, 0xda, 0x40, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xba, 0x88, 0xab, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0x9c, 0xee, 0xff, 0xfe, + 0xca, 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x58, 0xad, 0xef, 0xff, 0xec, 0xa7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xb1, + 0x1, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xa8, 0x8a, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, + 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x2, + 0xdf, 0xfd, 0xa4, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, 0xcf, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x9f, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xee, + 0x30, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, + 0xff, 0xfb, 0xaf, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x98, 0x89, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x7a, 0xce, 0xff, 0xfe, 0xdc, 0x96, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xfb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xa8, 0x88, 0x88, 0x8a, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xaa, 0xaa, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x51, 0x15, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x10, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x73, 0x37, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x47, 0x88, 0x88, 0x88, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe2, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf3, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x40, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x4, 0x50, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x3f, 0xf4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x2, 0xef, 0xff, 0x30, + 0x0, 0x0, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x2e, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x47, 0x88, 0x88, 0x88, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xe8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x46, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x2f, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xf8, 0xa, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0xbf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, + 0x0, 0xb, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x45, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, + 0x10, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x35, 0x10, 0x0, 0x0, 0xb, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xe3, 0x0, 0x0, 0xbf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, 0xa, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xe2, 0x2f, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xd9, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0x90, 0xf, 0xff, 0xff, 0xf0, 0x9, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0x60, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x6, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0x60, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x6, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfa, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0x90, 0xf, 0xff, + 0xff, 0xf0, 0x9, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xf0, + 0x8f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x51, 0x0, 0x0, 0x0, 0x0, 0x15, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0xdf, 0x80, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x2, 0xff, 0xd0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xae, 0xff, 0xfe, 0xae, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xea, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xb8, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x2, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xfe, 0xdd, 0xb9, 0x74, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x4, 0xad, 0xff, 0xda, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x77, + 0x51, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xff, 0xff, 0xfb, 0x20, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x40, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0xaf, 0xff, 0xff, 0xf7, 0x11, 0x7f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xd, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1f, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0x71, 0x17, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xf7, 0x11, 0x7f, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x1, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x70, 0x0, + 0x7, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0x71, 0x17, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x2, 0xcf, 0xff, + 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x57, 0x75, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfd, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xfe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x3d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x83, 0x0, 0x38, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x83, 0x0, 0x38, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x8d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x0, + + /* U+F0C9 "" */ + 0x39, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x93, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x2, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x39, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x93, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x2, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x93, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, + + /* U+F0E0 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, + 0x10, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x2, + 0xfa, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0xaf, + 0xff, 0xd3, 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x2d, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x1, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe4, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x10, 0x0, 0x3e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x2, 0x9e, 0xe9, 0x20, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe7, 0x30, 0x13, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x0, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, + 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xb1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xfe, 0x20, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xe2, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xfe, 0x20, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xe2, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xfe, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xee, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xff, 0xff, 0xff, 0xea, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7c, 0xff, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xf3, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xf8, 0x0, + 0x0, 0x1e, 0xff, 0x80, 0x0, 0x1, 0xef, 0xf8, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0xbf, 0xf4, 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xb, + 0xff, 0x40, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0xbf, 0xf4, + 0x0, 0x0, 0xb, 0xff, 0x40, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x1e, 0xff, 0x80, 0x0, 0x1, 0xef, 0xf8, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x30, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, 0xfc, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xfc, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xfb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x68, + 0xbd, 0xef, 0xff, 0xff, 0xfe, 0xdb, 0x86, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xec, 0xa9, 0x98, 0x89, 0x9a, 0xce, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x7b, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfa, + 0xb, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xb0, 0x0, 0xbf, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x7a, 0xce, 0xef, 0xfe, 0xec, 0xa7, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0xb, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xb0, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0x98, 0x89, + 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xce, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xec, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xcf, 0xfc, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xcf, 0xfc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xd3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x80, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, + 0xfe, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbd, + 0xdc, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xfe, 0x99, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xfc, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0x10, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x18, 0xcc, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x66, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x9, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xf9, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xfe, 0x60, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x76, 0x79, 0xff, + 0xff, 0x97, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, + 0xff, 0xff, 0xff, 0xc3, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xee, 0xee, 0xee, 0xee, 0xef, 0xff, 0xff, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff, 0xa1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xa1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0xbd, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0x10, + 0x0, 0x1, 0xde, 0xee, 0xee, 0xee, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xf6, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xfa, 0x88, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0xbc, + 0xcd, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xbd, + 0xef, 0xff, 0xec, 0xa7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x81, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x71, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xe, 0xff, 0xff, 0xff, 0xf8, 0xaf, + 0xff, 0xff, 0xe0, 0x0, 0xac, 0x10, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0x80, 0xa, 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xd1, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xf3, 0x4f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xe0, 0x0, + 0x9f, 0xfd, 0x10, 0x1, 0xdf, 0xff, 0xff, 0xf6, + 0x7f, 0xff, 0xff, 0xff, 0x50, 0x0, 0xa, 0xff, + 0xe0, 0x0, 0x9f, 0xfe, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x9f, 0xe0, 0x0, 0x9f, 0xe2, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x9, 0xe0, 0x0, 0x9e, 0x20, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x70, 0x0, + 0x72, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x1d, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x0, 0x1, 0xb0, 0x0, 0x85, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0xff, 0xfd, 0xaf, 0xff, 0xff, 0xff, + 0xfd, 0x10, 0x0, 0x1d, 0xe0, 0x0, 0x9f, 0x50, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xfb, 0x8f, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xe0, 0x0, + 0x9f, 0xf4, 0x0, 0x2, 0xef, 0xff, 0xff, 0xfa, + 0x6f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x1d, 0xff, + 0xe0, 0x0, 0x9f, 0xff, 0x20, 0x0, 0x4f, 0xff, + 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xfd, 0x10, 0x2, + 0xef, 0xff, 0xe0, 0x0, 0x9f, 0xf8, 0x0, 0x1, + 0xdf, 0xff, 0xff, 0xf5, 0xf, 0xff, 0xff, 0xff, + 0xd1, 0x2e, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0x80, + 0x0, 0x1d, 0xff, 0xff, 0xff, 0xf3, 0xc, 0xff, + 0xff, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xf0, 0x0, + 0xa8, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x30, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x58, 0xbd, 0xef, 0xff, + 0xed, 0xb9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xd2, + 0x2d, 0xff, 0xff, 0xfd, 0x22, 0xdf, 0xff, 0xff, + 0xd2, 0x2d, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x80, 0x8, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, + 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x80, 0x8, 0xff, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xd2, 0x2d, 0xff, 0xff, 0xfd, 0x22, + 0xdf, 0xff, 0xff, 0xd2, 0x2d, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xa2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8e, 0x20, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfe, 0x20, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0xcf, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0xcf, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0xcf, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0xfe, 0xca, 0x86, 0x53, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, + 0x40, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x70, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, + 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, + 0xff, 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, + 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, 0xf4, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xf, 0xff, 0x0, 0x0, 0xbf, + 0xf4, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x6, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x60, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x3, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x10, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcd, 0xff, 0xff, 0xff, 0xf1, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcb, 0x91, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 207, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 206, .box_w = 7, .box_h = 34, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 119, .adv_w = 300, .box_w = 13, .box_h = 14, .ofs_x = 3, .ofs_y = 20}, + {.bitmap_index = 210, .adv_w = 540, .box_w = 32, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 754, .adv_w = 477, .box_w = 27, .box_h = 46, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1375, .adv_w = 647, .box_w = 38, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2021, .adv_w = 527, .box_w = 31, .box_h = 35, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2564, .adv_w = 161, .box_w = 5, .box_h = 14, .ofs_x = 3, .ofs_y = 20}, + {.bitmap_index = 2599, .adv_w = 259, .box_w = 11, .box_h = 45, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 2847, .adv_w = 260, .box_w = 11, .box_h = 45, .ofs_x = 1, .ofs_y = -9}, + {.bitmap_index = 3095, .adv_w = 307, .box_w = 19, .box_h = 19, .ofs_x = 0, .ofs_y = 17}, + {.bitmap_index = 3276, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 3518, .adv_w = 174, .box_w = 7, .box_h = 14, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 3567, .adv_w = 294, .box_w = 14, .box_h = 5, .ofs_x = 2, .ofs_y = 11}, + {.bitmap_index = 3602, .adv_w = 174, .box_w = 7, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3627, .adv_w = 270, .box_w = 21, .box_h = 46, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 4110, .adv_w = 512, .box_w = 28, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4586, .adv_w = 284, .box_w = 13, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4807, .adv_w = 441, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5249, .adv_w = 439, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5691, .adv_w = 514, .box_w = 31, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6218, .adv_w = 441, .box_w = 26, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6660, .adv_w = 474, .box_w = 27, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 7119, .adv_w = 459, .box_w = 26, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7561, .adv_w = 495, .box_w = 27, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8020, .adv_w = 474, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8479, .adv_w = 174, .box_w = 7, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 8570, .adv_w = 174, .box_w = 7, .box_h = 33, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 8686, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 8928, .adv_w = 447, .box_w = 22, .box_h = 15, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 9093, .adv_w = 447, .box_w = 22, .box_h = 22, .ofs_x = 3, .ofs_y = 6}, + {.bitmap_index = 9335, .adv_w = 440, .box_w = 25, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9760, .adv_w = 794, .box_w = 46, .box_h = 43, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 10749, .adv_w = 562, .box_w = 37, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11378, .adv_w = 581, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 11871, .adv_w = 555, .box_w = 31, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 12398, .adv_w = 634, .box_w = 33, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 12959, .adv_w = 515, .box_w = 25, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 13384, .adv_w = 488, .box_w = 24, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 13792, .adv_w = 593, .box_w = 32, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 14336, .adv_w = 624, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 14829, .adv_w = 238, .box_w = 5, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 14914, .adv_w = 394, .box_w = 21, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 15271, .adv_w = 552, .box_w = 30, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 15781, .adv_w = 456, .box_w = 24, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 16189, .adv_w = 733, .box_w = 36, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 16801, .adv_w = 624, .box_w = 29, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 17294, .adv_w = 645, .box_w = 37, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17923, .adv_w = 554, .box_w = 28, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 18399, .adv_w = 645, .box_w = 38, .box_h = 41, .ofs_x = 2, .ofs_y = -7}, + {.bitmap_index = 19178, .adv_w = 558, .box_w = 28, .box_h = 34, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 19654, .adv_w = 477, .box_w = 27, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 20113, .adv_w = 451, .box_w = 28, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 20589, .adv_w = 607, .box_w = 30, .box_h = 34, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 21099, .adv_w = 547, .box_w = 36, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 21711, .adv_w = 865, .box_w = 52, .box_h = 34, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 22595, .adv_w = 517, .box_w = 32, .box_h = 34, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 23139, .adv_w = 497, .box_w = 33, .box_h = 34, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 23700, .adv_w = 505, .box_w = 29, .box_h = 34, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 24193, .adv_w = 256, .box_w = 11, .box_h = 45, .ofs_x = 5, .ofs_y = -9}, + {.bitmap_index = 24441, .adv_w = 270, .box_w = 21, .box_h = 46, .ofs_x = -2, .ofs_y = -5}, + {.bitmap_index = 24924, .adv_w = 256, .box_w = 11, .box_h = 45, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 25172, .adv_w = 448, .box_w = 22, .box_h = 20, .ofs_x = 3, .ofs_y = 7}, + {.bitmap_index = 25392, .adv_w = 384, .box_w = 24, .box_h = 4, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 25440, .adv_w = 461, .box_w = 13, .box_h = 7, .ofs_x = 5, .ofs_y = 29}, + {.bitmap_index = 25486, .adv_w = 459, .box_w = 23, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 25785, .adv_w = 524, .box_w = 27, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 26271, .adv_w = 439, .box_w = 24, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 26583, .adv_w = 524, .box_w = 27, .box_h = 36, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 27069, .adv_w = 470, .box_w = 26, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 27407, .adv_w = 271, .box_w = 19, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 27749, .adv_w = 530, .box_w = 27, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 28222, .adv_w = 523, .box_w = 25, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 28672, .adv_w = 214, .box_w = 7, .box_h = 37, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 28802, .adv_w = 218, .box_w = 16, .box_h = 46, .ofs_x = -5, .ofs_y = -9}, + {.bitmap_index = 29170, .adv_w = 473, .box_w = 26, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 29638, .adv_w = 214, .box_w = 5, .box_h = 36, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 29728, .adv_w = 812, .box_w = 43, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30287, .adv_w = 523, .box_w = 25, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 30612, .adv_w = 488, .box_w = 27, .box_h = 26, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 30963, .adv_w = 524, .box_w = 27, .box_h = 35, .ofs_x = 4, .ofs_y = -9}, + {.bitmap_index = 31436, .adv_w = 524, .box_w = 27, .box_h = 35, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 31909, .adv_w = 315, .box_w = 15, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 32104, .adv_w = 385, .box_w = 22, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32390, .adv_w = 318, .box_w = 19, .box_h = 32, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 32694, .adv_w = 520, .box_w = 25, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 33019, .adv_w = 429, .box_w = 28, .box_h = 26, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 33383, .adv_w = 690, .box_w = 43, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 33942, .adv_w = 424, .box_w = 26, .box_h = 26, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 34280, .adv_w = 429, .box_w = 29, .box_h = 35, .ofs_x = -2, .ofs_y = -9}, + {.bitmap_index = 34788, .adv_w = 400, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 35087, .adv_w = 270, .box_w = 14, .box_h = 45, .ofs_x = 2, .ofs_y = -9}, + {.bitmap_index = 35402, .adv_w = 230, .box_w = 5, .box_h = 45, .ofs_x = 5, .ofs_y = -9}, + {.bitmap_index = 35515, .adv_w = 270, .box_w = 15, .box_h = 45, .ofs_x = 0, .ofs_y = -9}, + {.bitmap_index = 35853, .adv_w = 447, .box_w = 24, .box_h = 9, .ofs_x = 2, .ofs_y = 13}, + {.bitmap_index = 35961, .adv_w = 322, .box_w = 16, .box_h = 16, .ofs_x = 2, .ofs_y = 19}, + {.bitmap_index = 36089, .adv_w = 241, .box_w = 9, .box_h = 9, .ofs_x = 3, .ofs_y = 9}, + {.bitmap_index = 36130, .adv_w = 768, .box_w = 48, .box_h = 49, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 37306, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 38170, .adv_w = 768, .box_w = 48, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 39178, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 40042, .adv_w = 528, .box_w = 33, .box_h = 34, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 40603, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 41755, .adv_w = 768, .box_w = 46, .box_h = 48, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 42859, .adv_w = 864, .box_w = 54, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 43993, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 45145, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46117, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 47269, .adv_w = 384, .box_w = 24, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47725, .adv_w = 576, .box_w = 36, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48409, .adv_w = 864, .box_w = 54, .box_h = 46, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 49651, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 50515, .adv_w = 528, .box_w = 33, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 51307, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, + {.bitmap_index = 51967, .adv_w = 672, .box_w = 42, .box_h = 50, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 53017, .adv_w = 672, .box_w = 42, .box_h = 43, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 53920, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 54802, .adv_w = 672, .box_w = 30, .box_h = 44, .ofs_x = 6, .ofs_y = -4}, + {.bitmap_index = 55462, .adv_w = 672, .box_w = 44, .box_h = 42, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 56386, .adv_w = 480, .box_w = 26, .box_h = 42, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 56932, .adv_w = 480, .box_w = 26, .box_h = 42, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 57478, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 58360, .adv_w = 672, .box_w = 42, .box_h = 10, .ofs_x = 0, .ofs_y = 13}, + {.bitmap_index = 58570, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 59542, .adv_w = 960, .box_w = 60, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 60982, .adv_w = 864, .box_w = 56, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 62326, .adv_w = 768, .box_w = 48, .box_h = 44, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 63382, .adv_w = 672, .box_w = 42, .box_h = 26, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 63928, .adv_w = 672, .box_w = 42, .box_h = 26, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 64474, .adv_w = 960, .box_w = 60, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65614, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 66478, .adv_w = 768, .box_w = 48, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 67630, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 68831, .adv_w = 672, .box_w = 43, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 69734, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 70742, .adv_w = 672, .box_w = 42, .box_h = 42, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 71624, .adv_w = 672, .box_w = 42, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72422, .adv_w = 768, .box_w = 48, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 73286, .adv_w = 480, .box_w = 32, .box_h = 48, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 74054, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 75062, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 76070, .adv_w = 864, .box_w = 54, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 77042, .adv_w = 768, .box_w = 50, .box_h = 50, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 78292, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 79156, .adv_w = 960, .box_w = 60, .box_h = 44, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 80476, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 81376, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 82276, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 83176, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 84076, .adv_w = 960, .box_w = 60, .box_h = 30, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 84976, .adv_w = 960, .box_w = 61, .box_h = 38, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86135, .adv_w = 672, .box_w = 36, .box_h = 48, .ofs_x = 3, .ofs_y = -6}, + {.bitmap_index = 86999, .adv_w = 672, .box_w = 42, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 88007, .adv_w = 768, .box_w = 49, .box_h = 49, .ofs_x = -1, .ofs_y = -7}, + {.bitmap_index = 89208, .adv_w = 960, .box_w = 60, .box_h = 36, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 90288, .adv_w = 576, .box_w = 36, .box_h = 48, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 91152, .adv_w = 773, .box_w = 49, .box_h = 31, .ofs_x = 0, .ofs_y = 3} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 8, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 35, 0, 21, -17, 0, 0, + 0, 0, -42, -46, 5, 36, 17, 13, + -31, 5, 38, 2, 32, 8, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 6, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, -23, 0, 0, 0, 0, + 0, -15, 13, 15, 0, 0, -8, 0, + -5, 8, 0, -8, 0, -8, -4, -15, + 0, 0, 0, 0, -8, 0, 0, -10, + -12, 0, 0, -8, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + -8, 0, -12, 0, -21, 0, -93, 0, + 0, -15, 0, 15, 23, 1, 0, -15, + 8, 8, 25, 15, -13, 15, 0, 0, + -44, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -21, -9, -38, 0, -31, + -5, 0, 0, 0, 0, 2, 30, 0, + -23, -6, -2, 2, 0, -13, 0, 0, + -5, -57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -61, -6, 29, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 25, + 0, 8, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 6, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 15, 8, 23, -8, 0, 0, 15, -8, + -25, -105, 5, 21, 15, 2, -10, 0, + 28, 0, 25, 0, 25, 0, -71, 0, + -9, 23, 0, 25, -8, 15, 8, 0, + 0, 2, -8, 0, 0, -13, 61, 0, + 61, 0, 23, 0, 32, 10, 13, 23, + 0, 0, 0, -28, 0, 0, 0, 0, + 2, -5, 0, 5, -14, -10, -15, 5, + 0, -8, 0, 0, 0, -31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, -42, 0, -48, 0, 0, 0, + 0, -5, 0, 76, -9, -10, 8, 8, + -7, 0, -10, 8, 0, 0, -41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -74, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -48, 0, 46, 0, 0, -28, 0, + 25, 0, -52, -74, -52, -15, 23, 0, + 0, -51, 0, 9, -18, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 20, 23, -94, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 36, 0, 5, 0, 0, 0, + 0, 0, 5, 5, -9, -15, 0, -2, + -2, -8, 0, 0, -5, 0, 0, 0, + -15, 0, -6, 0, -18, -15, 0, -19, + -25, -25, -15, 0, -15, 0, -15, 0, + 0, 0, 0, -6, 0, 0, 8, 0, + 5, -8, 0, 2, 0, 0, 0, 8, + -5, 0, 0, 0, -5, 8, 8, -2, + 0, 0, 0, -15, 0, -2, 0, 0, + 0, 0, 0, 2, 0, 10, -5, 0, + -9, 0, -13, 0, 0, -5, 0, 23, + 0, 0, -8, 0, 0, 0, 0, 0, + -2, 2, -5, -5, 0, 0, -8, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, -8, -9, 0, + 0, 0, 0, 0, 2, 0, 0, -5, + 0, -8, -8, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, -5, -10, 0, -12, 0, -23, + -5, -23, 15, 0, 0, -15, 8, 15, + 21, 0, -19, -2, -9, 0, -2, -36, + 8, -5, 5, -41, 8, 0, 0, 2, + -40, 0, -41, -6, -67, -5, 0, -38, + 0, 15, 22, 0, 10, 0, 0, 0, + 0, 2, 0, -14, -10, 0, -23, 0, + 0, 0, -8, 0, 0, 0, -8, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -10, 0, 0, 0, 0, 0, 0, 0, + -8, -8, 0, -5, -9, -6, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, -6, 0, -9, + 0, -5, 0, -15, 8, 0, 0, -9, + 4, 8, 8, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 5, + 0, 0, -8, 0, -8, -5, -9, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + -6, 0, 0, 0, 0, -8, -12, 0, + -15, 0, 23, -5, 2, -25, 0, 0, + 21, -38, -40, -32, -15, 8, 0, -6, + -50, -14, 0, -14, 0, -15, 12, -14, + -49, 0, -21, 0, 0, 4, -2, 6, + -5, 0, 8, 1, -23, -29, 0, -38, + -18, -16, -18, -23, -9, -21, -2, -15, + -21, 5, 0, 2, 0, -8, 0, 0, + 0, 5, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, -4, 0, -2, -8, 0, -13, -17, + -17, -2, 0, -23, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 3, + -5, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 37, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -14, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + -15, 0, 0, 0, 0, -38, -23, 0, + 0, 0, -12, -38, 0, 0, -8, 8, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, -14, 0, + 0, 0, 0, 9, 0, 5, -15, -15, + 0, -8, -8, -9, 0, 0, 0, 0, + 0, 0, -23, 0, -8, 0, -12, -8, + 0, -17, -19, -23, -6, 0, -15, 0, + -23, 0, 0, 0, 0, 61, 0, 0, + 4, 0, 0, -10, 0, 8, 0, -33, + 0, 0, 0, 0, 0, -71, -14, 25, + 23, -6, -32, 0, 8, -12, 0, -38, + -4, -10, 8, -54, -8, 10, 0, 12, + -27, -12, -28, -25, -32, 0, 0, -46, + 0, 44, 0, 0, -4, 0, 0, 0, + -4, -4, -8, -21, -25, -2, -71, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, -4, -8, -12, 0, 0, + -15, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -15, 0, 0, 15, + -2, 10, 0, -17, 8, -5, -2, -20, + -8, 0, -10, -8, -5, 0, -12, -13, + 0, 0, -6, -2, -5, -13, -9, 0, + 0, -8, 0, 8, -5, 0, -17, 0, + 0, 0, -15, 0, -13, 0, -13, -13, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 8, 0, -11, 0, -5, -9, + -24, -5, -5, -5, -2, -5, -9, -2, + 0, 0, 0, 0, 0, -8, -6, -6, + 0, 0, 0, 0, 9, -5, 0, -5, + 0, 0, 0, -5, -9, -5, -7, -9, + -7, 0, 6, 31, -2, 0, -21, 0, + -5, 15, 0, -8, -32, -10, 12, 1, + 0, -36, -13, 8, -13, 5, 0, -5, + -6, -25, 0, -12, 4, 0, 0, -13, + 0, 0, 0, 8, 8, -15, -15, 0, + -13, -8, -12, -8, -8, 0, -13, 4, + -15, -13, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -10, + 0, 0, -8, -8, 0, 0, 0, 0, + -8, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + -12, 0, -15, 0, 0, 0, -25, 0, + 5, -17, 15, 2, -5, -36, 0, 0, + -17, -8, 0, -31, -19, -22, 0, 0, + -33, -8, -31, -29, -37, 0, -20, 0, + 6, 51, -10, 0, -18, -8, -2, -8, + -13, -21, -14, -28, -31, -18, -8, 0, + 0, -5, 0, 2, 0, 0, -54, -7, + 23, 17, -17, -28, 0, 2, -24, 0, + -38, -5, -8, 15, -71, -10, 2, 0, + 0, -50, -9, -40, -8, -56, 0, 0, + -54, 0, 45, 2, 0, -5, 0, 0, + 0, 0, -4, -5, -29, -5, 0, -50, + 0, 0, 0, 0, -25, 0, -7, 0, + -2, -22, -36, 0, 0, -4, -12, -23, + -8, 0, -5, 0, 0, 0, 0, -35, + -8, -25, -25, -6, -13, -19, -8, -13, + 0, -15, -7, -25, -12, 0, -9, -15, + -8, -15, 0, 4, 0, -5, -25, 0, + 15, 0, -14, 0, 0, 0, 0, 9, + 0, 5, -15, 31, 0, -8, -8, -9, + 0, 0, 0, 0, 0, 0, -23, 0, + -8, 0, -12, -8, 0, -17, -19, -23, + -6, 0, -15, 6, 31, 0, 0, 0, + 0, 61, 0, 0, 4, 0, 0, -10, + 0, 8, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 0, + -5, -15, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -8, -8, 0, 0, -15, + -8, 0, 0, -15, 0, 13, -4, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 12, 15, 6, -7, 0, -25, + -12, 0, 23, -25, -25, -15, -15, 31, + 14, 8, -67, -5, 15, -8, 0, -8, + 8, -8, -27, 0, -8, 8, -10, -6, + -23, -6, 0, 0, 23, 15, 0, -22, + 0, -42, -10, 22, -10, -29, 2, -10, + -25, -25, -8, 31, 8, 0, -12, 0, + -21, 0, 6, 25, -18, -28, -31, -19, + 23, 0, 2, -56, -6, 8, -13, -5, + -18, 0, -17, -28, -12, -12, -6, 0, + 0, -18, -16, -8, 0, 23, 18, -8, + -42, 0, -42, -11, 0, -27, -45, -2, + -25, -13, -25, -22, 21, 0, 0, -10, + 0, -15, -7, 0, -8, -14, 0, 13, + -25, 8, 0, 0, -41, 0, -8, -17, + -13, -5, -23, -19, -25, -18, 0, -23, + -8, -18, -15, -23, -8, 0, 0, 2, + 36, -13, 0, -23, -8, 0, -8, -15, + -18, -21, -22, -29, -10, -15, 15, 0, + -12, 0, -38, -9, 5, 15, -25, -28, + -15, -25, 25, -8, 4, -71, -14, 15, + -17, -13, -28, 0, -23, -32, -9, -8, + -6, -8, -16, -23, -2, 0, 0, 23, + 22, -5, -50, 0, -46, -18, 18, -29, + -52, -15, -27, -32, -38, -25, 15, 0, + 0, 0, 0, -9, 0, 0, 8, -9, + 15, 5, -15, 15, 0, 0, -24, -2, + 0, -2, 0, 2, 2, -6, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 6, 23, 2, 0, -9, 0, 0, + 0, 0, -5, -5, -9, 0, 0, 0, + 2, 6, 0, 0, 0, 0, 6, 0, + -6, 0, 29, 0, 14, 2, 2, -10, + 0, 15, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -46, 0, -8, 13, 0, 23, + 0, 0, 76, 9, -15, -15, 8, 8, + -5, 2, -38, 0, 0, 37, -46, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -52, 29, 108, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -12, 0, 0, -15, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -21, 0, + 0, 2, 0, 0, 8, 99, -15, -6, + 25, 21, -21, 8, 0, 0, 8, 8, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -100, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -22, + 0, 0, 0, -21, 0, 0, 0, 0, + -17, -4, 0, 0, 0, -17, 0, -9, + 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -51, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -8, 0, 0, -15, 0, -12, 0, + -21, 0, 0, 0, -13, 8, -9, 0, + 0, -21, -8, -18, 0, 0, -21, 0, + -8, 0, -36, 0, -8, 0, 0, -62, + -15, -31, -8, -28, 0, 0, -51, 0, + -21, -4, 0, 0, 0, 0, 0, 0, + 0, 0, -12, -14, -6, -13, 0, 0, + 0, 0, -17, 0, -17, 10, -8, 15, + 0, -5, -18, -5, -13, -15, 0, -9, + -4, -5, 5, -21, -2, 0, 0, 0, + -68, -6, -11, 0, -17, 0, -5, -36, + -7, 0, 0, -5, -6, 0, 0, 0, + 0, 5, 0, -5, -13, -5, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 0, 0, 0, + 0, -17, 0, -5, 0, 0, 0, -15, + 8, 0, 0, 0, -21, -8, -15, 0, + 0, -22, 0, -8, 0, -36, 0, 0, + 0, 0, -74, 0, -15, -28, -38, 0, + 0, -51, 0, -5, -12, 0, 0, 0, + 0, 0, 0, 0, 0, -8, -12, -4, + -12, 2, 0, 0, 13, -10, 0, 24, + 38, -8, -8, -23, 9, 38, 13, 17, + -21, 9, 32, 9, 22, 17, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 36, -14, -8, 0, -6, + 61, 33, 61, 0, 0, 0, 8, 0, + 0, 28, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 11, + 0, 0, 0, 0, -65, -9, -6, -31, + -38, 0, 0, -51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, -65, -9, -6, + -31, -38, 0, 0, -31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, -18, 8, 0, -8, + 6, 14, 8, -23, 0, -2, -6, 8, + 0, 6, 0, 0, 0, 0, -19, 0, + -7, -5, -15, 0, -7, -31, 0, 48, + -8, 0, -17, -5, 0, -5, -13, 0, + -8, -22, -15, -9, 0, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 0, 0, 0, -65, + -9, -6, -31, -38, 0, 0, -51, 0, + 0, 0, 0, 0, 0, 38, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -12, 0, -25, -9, -7, 23, -7, -8, + -31, 2, -5, 2, -5, -21, 2, 17, + 2, 6, 2, 6, -18, -31, -9, 0, + -29, -15, -21, -32, -30, 0, -12, -15, + -9, -10, -6, -5, -9, -5, 0, -5, + -2, 12, 0, 12, -5, 0, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -8, -8, 0, 0, + -21, 0, -4, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -46, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, -8, 0, -10, + 0, 0, 0, 0, -6, 0, 0, -13, + -8, 8, 0, -13, -15, -5, 0, -22, + -5, -17, -5, -9, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -51, 0, 25, 0, 0, -14, 0, + 0, 0, 0, -10, 0, -8, 0, 0, + -4, 0, 0, -5, 0, -18, 0, 0, + 32, -10, -25, -24, 5, 8, 8, -2, + -22, 5, 12, 5, 23, 5, 25, -5, + -21, 0, 0, -31, 0, 0, -23, -21, + 0, 0, -15, 0, -10, -13, 0, -12, + 0, -12, 0, -5, 12, 0, -6, -23, + -8, 28, 0, 0, -7, 0, -15, 0, + 0, 10, -18, 0, 8, -8, 6, 1, + 0, -25, 0, -5, -2, 0, -8, 8, + -6, 0, 0, 0, -31, -9, -17, 0, + -23, 0, 0, -36, 0, 28, -8, 0, + -14, 0, 5, 0, -8, 0, -8, -23, + 0, -8, 8, 0, 0, 0, 0, -5, + 0, 0, 8, -10, 2, 0, 0, -9, + -5, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -48, 0, 17, 0, + 0, -6, 0, 0, 0, 0, 2, 0, + -8, -8, 0, 0, 0, 15, 0, 18, + 0, 0, 0, 0, 0, -48, -44, 2, + 33, 23, 13, -31, 5, 32, 0, 28, + 0, 15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 41, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_48 = { +#else +lv_font_t lv_font_montserrat_48 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 52, /*The maximum line height required by the font*/ + .base_line = 9, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -4, + .underline_thickness = 2, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_48*/ diff --git a/inc/lvgl/src/font/lv_font_montserrat_8.c b/inc/lvgl/src/font/lv_font_montserrat_8.c new file mode 100644 index 0000000..6985792 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_montserrat_8.c @@ -0,0 +1,1440 @@ +/******************************************************************************* + * Size: 8 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 8 --font Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_montserrat_8.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRAT_8 + #define LV_FONT_MONTSERRAT_8 1 +#endif + +#if LV_FONT_MONTSERRAT_8 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x58, 0x57, 0x46, 0x23, 0x46, + + /* U+0022 "\"" */ + 0x73, 0x97, 0x29, 0x0, 0x0, + + /* U+0023 "#" */ + 0x4, 0x52, 0x60, 0x4b, 0x9b, 0xa3, 0x8, 0x7, + 0x20, 0x6c, 0x8c, 0x81, 0x9, 0x9, 0x0, + + /* U+0024 "$" */ + 0x0, 0x80, 0x2, 0xbd, 0xa2, 0x76, 0x80, 0x0, + 0x8d, 0x81, 0x0, 0x84, 0x95, 0xad, 0xb3, 0x0, + 0x80, 0x0, + + /* U+0025 "%" */ + 0x58, 0x70, 0x63, 0x8, 0x8, 0x36, 0x0, 0x27, + 0x58, 0x67, 0x10, 0x8, 0x27, 0x26, 0x6, 0x20, + 0x88, 0x20, + + /* U+0026 "&" */ + 0x9, 0x99, 0x0, 0xb, 0x3a, 0x0, 0x19, 0xc2, + 0x20, 0x83, 0x1a, 0xa0, 0x3a, 0x99, 0x92, 0x0, + 0x0, 0x0, + + /* U+0027 "'" */ + 0x72, 0x72, 0x0, + + /* U+0028 "(" */ + 0x8, 0x20, 0xb0, 0x1a, 0x3, 0x80, 0x1a, 0x0, + 0xb0, 0x8, 0x20, + + /* U+0029 ")" */ + 0x73, 0x19, 0xb, 0xc, 0xb, 0x19, 0x73, + + /* U+002A "*" */ + 0x48, 0x40, 0x6e, 0x80, 0x15, 0x10, + + /* U+002B "+" */ + 0x0, 0x20, 0x0, 0xa, 0x0, 0x49, 0xd9, 0x10, + 0xa, 0x0, + + /* U+002C "," */ + 0x0, 0x75, 0x71, + + /* U+002D "-" */ + 0x5a, 0x60, + + /* U+002E "." */ + 0x0, 0x74, + + /* U+002F "/" */ + 0x0, 0xa, 0x0, 0x2, 0x80, 0x0, 0x82, 0x0, + 0xa, 0x0, 0x4, 0x60, 0x0, 0x91, 0x0, 0x19, + 0x0, 0x0, + + /* U+0030 "0" */ + 0xa, 0xbb, 0x26, 0x60, 0x1b, 0x93, 0x0, 0xc6, + 0x60, 0x1b, 0xa, 0xbb, 0x20, + + /* U+0031 "1" */ + 0x9e, 0x20, 0xa2, 0xa, 0x20, 0xa2, 0xa, 0x20, + + /* U+0032 "2" */ + 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0x58, 0x0, + 0x87, 0x0, 0x9e, 0xaa, 0x30, + + /* U+0033 "3" */ + 0x7a, 0xbe, 0x0, 0xa, 0x20, 0x4, 0xa9, 0x0, + 0x0, 0xa2, 0x8a, 0xa9, 0x0, + + /* U+0034 "4" */ + 0x0, 0x49, 0x0, 0x3, 0xa0, 0x0, 0x1b, 0x8, + 0x20, 0x8b, 0xad, 0xb2, 0x0, 0x9, 0x30, + + /* U+0035 "5" */ + 0x3d, 0xaa, 0x5, 0x60, 0x0, 0x5b, 0xa8, 0x0, + 0x0, 0x93, 0x7a, 0xaa, 0x0, + + /* U+0036 "6" */ + 0x9, 0xaa, 0x36, 0x70, 0x0, 0x98, 0x9a, 0x26, + 0x80, 0x2a, 0x9, 0x9a, 0x40, + + /* U+0037 "7" */ + 0xca, 0xad, 0x67, 0x0, 0xc0, 0x0, 0x67, 0x0, + 0xc, 0x0, 0x6, 0x70, 0x0, + + /* U+0038 "8" */ + 0x1a, 0xab, 0x25, 0x60, 0x48, 0x1d, 0xad, 0x38, + 0x40, 0x1b, 0x3a, 0x9a, 0x40, + + /* U+0039 "9" */ + 0x4a, 0x99, 0xb, 0x10, 0x95, 0x3a, 0x99, 0x80, + 0x0, 0x95, 0x3a, 0xb8, 0x0, + + /* U+003A ":" */ + 0x74, 0x0, 0x0, 0x74, + + /* U+003B ";" */ + 0x74, 0x0, 0x0, 0x75, 0x62, 0x0, + + /* U+003C "<" */ + 0x0, 0x1, 0x0, 0x49, 0x80, 0x5c, 0x30, 0x0, + 0x16, 0x91, 0x0, 0x0, 0x0, + + /* U+003D "=" */ + 0x49, 0x99, 0x10, 0x0, 0x0, 0x49, 0x99, 0x10, + + /* U+003E ">" */ + 0x10, 0x0, 0x3, 0x98, 0x20, 0x0, 0x6d, 0x14, + 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0xa4, 0x0, + 0x3, 0x0, 0x2, 0x80, 0x0, + + /* U+0040 "@" */ + 0x3, 0x87, 0x78, 0x50, 0x28, 0x4a, 0x9c, 0x75, + 0x80, 0xb0, 0xa, 0x28, 0x80, 0xb0, 0xa, 0x28, + 0x28, 0x49, 0x99, 0xa6, 0x3, 0x88, 0x75, 0x0, + + /* U+0041 "A" */ + 0x0, 0xb, 0x90, 0x0, 0x3, 0x8a, 0x10, 0x0, + 0xb1, 0x39, 0x0, 0x4d, 0x99, 0xd1, 0xb, 0x10, + 0x3, 0x90, + + /* U+0042 "B" */ + 0x2d, 0x99, 0xb1, 0x2a, 0x0, 0x84, 0x2d, 0x9a, + 0xd1, 0x2a, 0x0, 0x39, 0x2d, 0x99, 0xb4, + + /* U+0043 "C" */ + 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x7, 0xba, 0xa2, + + /* U+0044 "D" */ + 0x2e, 0xab, 0xb3, 0x2, 0xa0, 0x1, 0xc0, 0x2a, + 0x0, 0x9, 0x22, 0xa0, 0x1, 0xc0, 0x2e, 0xab, + 0xb3, 0x0, + + /* U+0045 "E" */ + 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2d, 0xaa, 0x42, + 0xa0, 0x0, 0x2e, 0xaa, 0x90, + + /* U+0046 "F" */ + 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2e, 0xaa, 0x42, + 0xa0, 0x0, 0x2a, 0x0, 0x0, + + /* U+0047 "G" */ + 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, + 0x23, 0x59, 0x0, 0x47, 0x7, 0xba, 0xa3, + + /* U+0048 "H" */ + 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, 0x2e, 0xaa, + 0xba, 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, + + /* U+0049 "I" */ + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + + /* U+004A "J" */ + 0x5, 0xad, 0x50, 0x0, 0x75, 0x0, 0x7, 0x50, + 0x0, 0x84, 0x9, 0xab, 0x0, + + /* U+004B "K" */ + 0x2a, 0x1, 0xa2, 0x2a, 0x1b, 0x20, 0x2c, 0xc7, + 0x0, 0x2d, 0x19, 0x50, 0x2a, 0x0, 0xa4, + + /* U+004C "L" */ + 0x2a, 0x0, 0x2, 0xa0, 0x0, 0x2a, 0x0, 0x2, + 0xa0, 0x0, 0x2e, 0xaa, 0x70, + + /* U+004D "M" */ + 0x2c, 0x0, 0x3, 0xc2, 0xd7, 0x0, 0xbc, 0x29, + 0x92, 0x84, 0xc2, 0x91, 0xb9, 0xc, 0x29, 0x3, + 0x0, 0xc0, + + /* U+004E "N" */ + 0x2d, 0x10, 0x2a, 0x2c, 0xb0, 0x2a, 0x2a, 0x4b, + 0x2a, 0x2a, 0x5, 0xca, 0x2a, 0x0, 0x7a, + + /* U+004F "O" */ + 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, + 0x0, 0x8, 0x45, 0x90, 0x1, 0xc1, 0x7, 0xbb, + 0xb3, 0x0, + + /* U+0050 "P" */ + 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, + 0xa3, 0x2e, 0xaa, 0x60, 0x2a, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, + 0x0, 0x8, 0x45, 0x90, 0x0, 0xc1, 0x7, 0xbb, + 0xb3, 0x0, 0x0, 0x39, 0x93, + + /* U+0052 "R" */ + 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, + 0xa3, 0x2d, 0xac, 0x80, 0x2a, 0x1, 0xa1, + + /* U+0053 "S" */ + 0x2a, 0xaa, 0x27, 0x60, 0x0, 0x8, 0x98, 0x10, + 0x0, 0x49, 0x5a, 0xaa, 0x30, + + /* U+0054 "T" */ + 0xaa, 0xea, 0x60, 0xc, 0x0, 0x0, 0xc0, 0x0, + 0xc, 0x0, 0x0, 0xc0, 0x0, + + /* U+0055 "U" */ + 0x39, 0x0, 0x48, 0x39, 0x0, 0x48, 0x39, 0x0, + 0x48, 0x1c, 0x0, 0x66, 0x6, 0xba, 0xa0, + + /* U+0056 "V" */ + 0xb, 0x10, 0x5, 0x70, 0x49, 0x0, 0xb0, 0x0, + 0xc1, 0x57, 0x0, 0x4, 0x9c, 0x0, 0x0, 0xc, + 0x70, 0x0, + + /* U+0057 "W" */ + 0x94, 0x0, 0xf1, 0x3, 0x93, 0xa0, 0x69, 0x70, + 0x93, 0xc, 0xb, 0xb, 0xb, 0x0, 0x79, 0x80, + 0x89, 0x70, 0x1, 0xf2, 0x2, 0xf1, 0x0, + + /* U+0058 "X" */ + 0x58, 0x2, 0xa0, 0x8, 0x7b, 0x10, 0x0, 0xf5, + 0x0, 0xa, 0x4b, 0x10, 0x76, 0x2, 0xb0, + + /* U+0059 "Y" */ + 0xa, 0x20, 0xb, 0x0, 0x1b, 0x9, 0x30, 0x0, + 0x5b, 0x80, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, + 0x0, 0x0, + + /* U+005A "Z" */ + 0x6a, 0xac, 0xd0, 0x0, 0x1b, 0x10, 0x0, 0xb2, + 0x0, 0xb, 0x30, 0x0, 0x8d, 0xaa, 0xa0, + + /* U+005B "[" */ + 0x2d, 0x42, 0x90, 0x29, 0x2, 0x90, 0x29, 0x2, + 0x90, 0x2d, 0x40, + + /* U+005C "\\" */ + 0x19, 0x0, 0x0, 0xa0, 0x0, 0x5, 0x50, 0x0, + 0xa, 0x0, 0x0, 0x91, 0x0, 0x3, 0x70, 0x0, + 0xa, 0x0, + + /* U+005D "]" */ + 0x8c, 0xc, 0xc, 0xc, 0xc, 0xc, 0x8c, + + /* U+005E "^" */ + 0x3, 0xc0, 0x0, 0x94, 0x50, 0x27, 0x9, 0x0, + + /* U+005F "_" */ + 0x77, 0x77, + + /* U+0060 "`" */ + 0x6, 0x60, + + /* U+0061 "a" */ + 0x29, 0x98, 0x2, 0x98, 0xd0, 0x84, 0xc, 0x13, + 0xb9, 0xd1, + + /* U+0062 "b" */ + 0x48, 0x0, 0x0, 0x48, 0x0, 0x0, 0x4c, 0xab, + 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, 0xc0, 0x4c, + 0xaa, 0x50, + + /* U+0063 "c" */ + 0x1a, 0xaa, 0x18, 0x40, 0x0, 0x84, 0x0, 0x1, + 0xaa, 0xa1, + + /* U+0064 "d" */ + 0x0, 0x0, 0xb0, 0x0, 0xb, 0x1a, 0xaa, 0xb9, + 0x40, 0x3b, 0x94, 0x2, 0xb1, 0xa9, 0x9b, + + /* U+0065 "e" */ + 0x19, 0x99, 0x19, 0x98, 0x86, 0x85, 0x1, 0x1, + 0xaa, 0xb1, + + /* U+0066 "f" */ + 0xa, 0xa0, 0x2a, 0x0, 0x9d, 0x70, 0x29, 0x0, + 0x29, 0x0, 0x29, 0x0, + + /* U+0067 "g" */ + 0x1a, 0x99, 0xb9, 0x40, 0x1c, 0x94, 0x2, 0xc1, + 0xaa, 0xab, 0x18, 0x9a, 0x30, + + /* U+0068 "h" */ + 0x48, 0x0, 0x4, 0x80, 0x0, 0x4c, 0x9b, 0x44, + 0x90, 0x1b, 0x48, 0x0, 0xc4, 0x80, 0xc, + + /* U+0069 "i" */ + 0x37, 0x0, 0x48, 0x48, 0x48, 0x48, + + /* U+006A "j" */ + 0x3, 0x70, 0x0, 0x3, 0x80, 0x38, 0x3, 0x80, + 0x38, 0x6b, 0x40, + + /* U+006B "k" */ + 0x48, 0x0, 0x4, 0x80, 0x0, 0x48, 0xa, 0x44, + 0x9c, 0x30, 0x4d, 0x6a, 0x4, 0x80, 0x77, + + /* U+006C "l" */ + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + + /* U+006D "m" */ + 0x4c, 0x9b, 0x89, 0xb4, 0x49, 0x3, 0xb0, 0xb, + 0x48, 0x2, 0xa0, 0xc, 0x48, 0x2, 0xa0, 0xc, + + /* U+006E "n" */ + 0x4c, 0x9b, 0x44, 0x90, 0x1b, 0x48, 0x0, 0xc4, + 0x80, 0xc, + + /* U+006F "o" */ + 0x1a, 0xaa, 0x18, 0x40, 0x3a, 0x84, 0x3, 0xa1, + 0xaa, 0xa1, + + /* U+0070 "p" */ + 0x4c, 0xab, 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, + 0xc0, 0x4c, 0xaa, 0x50, 0x48, 0x0, 0x0, + + /* U+0071 "q" */ + 0x1a, 0xa9, 0xb9, 0x40, 0x3b, 0x94, 0x3, 0xb1, + 0xaa, 0x9b, 0x0, 0x0, 0xb0, + + /* U+0072 "r" */ + 0x4b, 0xa0, 0x4a, 0x0, 0x48, 0x0, 0x48, 0x0, + + /* U+0073 "s" */ + 0x5b, 0x95, 0x87, 0x30, 0x3, 0x79, 0x7a, 0xa6, + + /* U+0074 "t" */ + 0x29, 0x0, 0x9d, 0x70, 0x29, 0x0, 0x29, 0x0, + 0xb, 0x90, + + /* U+0075 "u" */ + 0x57, 0x1, 0xb5, 0x70, 0x1b, 0x48, 0x3, 0xb0, + 0xa9, 0x9b, + + /* U+0076 "v" */ + 0xb, 0x0, 0x84, 0x5, 0x70, 0xb0, 0x0, 0xb7, + 0x50, 0x0, 0x6d, 0x0, + + /* U+0077 "w" */ + 0xb0, 0xe, 0x20, 0xa0, 0x55, 0x59, 0x82, 0x80, + 0xa, 0xa0, 0xa8, 0x20, 0x9, 0x80, 0x6b, 0x0, + + /* U+0078 "x" */ + 0x67, 0x1b, 0x0, 0x9b, 0x10, 0xa, 0xb2, 0x7, + 0x51, 0xb0, + + /* U+0079 "y" */ + 0xb, 0x10, 0x83, 0x3, 0x81, 0xa0, 0x0, 0xaa, + 0x30, 0x0, 0x4a, 0x0, 0xa, 0xb2, 0x0, + + /* U+007A "z" */ + 0x59, 0xbb, 0x1, 0xb1, 0xb, 0x20, 0x9c, 0x98, + + /* U+007B "{" */ + 0xa, 0x60, 0xc0, 0xc, 0x5, 0xb0, 0xc, 0x0, + 0xc0, 0xa, 0x60, + + /* U+007C "|" */ + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + + /* U+007D "}" */ + 0x97, 0x0, 0xb0, 0xb, 0x0, 0xd3, 0xb, 0x0, + 0xb0, 0x97, 0x0, + + /* U+007E "~" */ + 0x29, 0x35, 0x15, 0x6, 0x80, + + /* U+00B0 "°" */ + 0x26, 0x47, 0x7, 0x27, 0x50, + + /* U+2022 "•" */ + 0x0, 0x5d, 0x2, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbe, + 0x0, 0x8d, 0xff, 0xff, 0x0, 0xff, 0xe9, 0x5f, + 0x0, 0xf3, 0x0, 0xf, 0x0, 0xf0, 0x0, 0xf, + 0x0, 0xf0, 0xa, 0xff, 0xaf, 0xf0, 0xa, 0xfa, + 0xaf, 0xa0, 0x0, 0x0, + + /* U+F008 "" */ + 0xbd, 0xcc, 0xce, 0xab, 0x8b, 0x0, 0x7, 0x58, + 0xcd, 0x66, 0x6a, 0xac, 0xcd, 0x66, 0x6a, 0xac, + 0x8b, 0x0, 0x7, 0x58, 0xbd, 0xcc, 0xce, 0xab, + + /* U+F00B "" */ + 0x34, 0x14, 0x44, 0x43, 0xff, 0x7f, 0xff, 0xff, + 0xab, 0x4b, 0xbb, 0xba, 0xbc, 0x5c, 0xcc, 0xcb, + 0xff, 0x7f, 0xff, 0xff, 0x67, 0x17, 0x88, 0x86, + 0xff, 0x7f, 0xff, 0xff, 0xab, 0x4b, 0xbb, 0xba, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x9, 0xfa, + 0xa9, 0x0, 0x9f, 0xa0, 0xaf, 0x99, 0xfa, 0x0, + 0xa, 0xff, 0xa0, 0x0, 0x0, 0x99, 0x0, 0x0, + + /* U+F00D "" */ + 0x63, 0x0, 0x82, 0xcf, 0x4a, 0xf4, 0x1d, 0xff, + 0x60, 0xa, 0xff, 0x30, 0xaf, 0x7d, 0xf3, 0xa6, + 0x1, 0xb3, + + /* U+F011 "" */ + 0x0, 0xc, 0x51, 0x0, 0x1d, 0x7d, 0x6e, 0x70, + 0x8d, 0xd, 0x65, 0xf1, 0xc7, 0xd, 0x60, 0xe6, + 0xd7, 0x6, 0x20, 0xe6, 0x9d, 0x0, 0x4, 0xf2, + 0x1e, 0xc7, 0x8f, 0x80, 0x1, 0x9d, 0xc6, 0x0, + + /* U+F013 "" */ + 0x0, 0xc, 0xc0, 0x0, 0x18, 0x8f, 0xf8, 0x81, + 0x8f, 0xfe, 0xef, 0xf8, 0x2f, 0xe0, 0xe, 0xf2, + 0x2f, 0xe0, 0xe, 0xf2, 0x8f, 0xfe, 0xef, 0xf8, + 0x18, 0x8f, 0xf8, 0x81, 0x0, 0xc, 0xc0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x30, 0x22, 0x0, 0x0, 0xaf, 0xaa, + 0xa0, 0x1, 0xda, 0x6a, 0xfa, 0x3, 0xe8, 0xbf, + 0xb8, 0xe3, 0xb6, 0xdf, 0xff, 0xd6, 0xb0, 0x8f, + 0xfb, 0xff, 0x80, 0x8, 0xfc, 0xc, 0xf8, 0x0, + 0x5b, 0x80, 0x8b, 0x50, + + /* U+F019 "" */ + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x9f, 0xf9, 0x0, 0x78, 0x7a, 0xa7, 0x87, + 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xbf, + + /* U+F01C "" */ + 0x5, 0xff, 0xff, 0xf5, 0x1, 0xe3, 0x0, 0x3, + 0xe1, 0xa8, 0x0, 0x0, 0x8, 0xaf, 0xff, 0x60, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x3, 0x2, 0xbf, 0xfb, 0x3f, + 0x2e, 0x91, 0x18, 0xff, 0x9a, 0x0, 0x6c, 0xff, + 0x31, 0x0, 0x24, 0x44, 0x44, 0x42, 0x0, 0x13, + 0xff, 0xc6, 0x0, 0xb9, 0xfe, 0xa5, 0x5b, 0xd1, + 0xf2, 0x8c, 0xc8, 0x10, 0x30, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x9, 0x34, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xab, 0xff, 0x0, 0x4f, 0x0, 0x1, + + /* U+F027 "" */ + 0x0, 0x9, 0x0, 0x34, 0xcf, 0x1, 0xff, 0xff, + 0x1b, 0xff, 0xff, 0x1b, 0xbb, 0xff, 0x1, 0x0, + 0x4f, 0x0, 0x0, 0x1, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x90, 0x23, + 0xb3, 0x34, 0xcf, 0x2, 0xc3, 0xbf, 0xff, 0xf1, + 0xb5, 0x6c, 0xff, 0xff, 0x1b, 0x56, 0xca, 0xbf, + 0xf0, 0x2c, 0x3a, 0x0, 0x4f, 0x2, 0x3b, 0x30, + 0x0, 0x10, 0x5, 0x40, + + /* U+F03E "" */ + 0xdf, 0xff, 0xff, 0xfd, 0xf0, 0x7f, 0xff, 0xff, + 0xf8, 0xcf, 0xb1, 0xbf, 0xfb, 0x5b, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0xf, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F043 "" */ + 0x0, 0xb4, 0x0, 0x3, 0xfb, 0x0, 0xb, 0xff, + 0x40, 0x6f, 0xff, 0xd0, 0xdf, 0xff, 0xf5, 0xf8, + 0xff, 0xf7, 0xaa, 0x8f, 0xf2, 0x1a, 0xfd, 0x40, + + /* U+F048 "" */ + 0x40, 0x0, 0x2f, 0x20, 0x8f, 0xf2, 0x9f, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, 0xf2, + 0x2e, 0xfb, 0x10, 0x19, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0xd, 0xa1, 0x0, 0x0, 0xff, + 0xf7, 0x0, 0xf, 0xff, 0xfd, 0x40, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xd4, + 0xf, 0xff, 0x70, 0x0, 0xda, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x9b, 0x90, 0x9b, 0x9f, 0xff, 0xf, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, 0xff, + 0xf2, 0x42, 0x2, 0x42, + + /* U+F04D "" */ + 0x24, 0x44, 0x44, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xbb, 0xbb, 0xb8, + + /* U+F051 "" */ + 0x20, 0x0, 0x4f, 0x80, 0x2f, 0xff, 0x92, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xfd, + 0x22, 0xf9, 0x10, 0x1b, + + /* U+F052 "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, 0x5f, 0xff, + 0xff, 0x50, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x58, + 0x88, 0x88, 0x50, 0xf, 0xff, 0xff, 0xff, 0x0, + 0xab, 0xbb, 0xbb, 0xa0, + + /* U+F053 "" */ + 0x0, 0x6, 0x20, 0x7, 0xf4, 0x7, 0xf5, 0x5, + 0xf6, 0x0, 0x1e, 0xb0, 0x0, 0x2e, 0xb0, 0x0, + 0x2e, 0x60, 0x0, 0x10, + + /* U+F054 "" */ + 0x26, 0x0, 0x4, 0xf7, 0x0, 0x5, 0xf7, 0x0, + 0x6, 0xf5, 0x0, 0xbe, 0x10, 0xbe, 0x20, 0x6e, + 0x20, 0x0, 0x10, 0x0, + + /* U+F067 "" */ + 0x0, 0x4, 0x0, 0x0, 0x3, 0xf3, 0x0, 0x0, + 0x4f, 0x40, 0x7, 0x8a, 0xfa, 0x87, 0xef, 0xff, + 0xff, 0xe0, 0x4, 0xf4, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x1, 0xb1, 0x0, + + /* U+F068 "" */ + 0x78, 0x88, 0x88, 0x7e, 0xff, 0xff, 0xfe, + + /* U+F06E "" */ + 0x0, 0x8c, 0xcc, 0x80, 0x1, 0xdd, 0x16, 0x3d, + 0xd1, 0xcf, 0x55, 0xed, 0x5f, 0xcb, 0xf5, 0xdf, + 0xd5, 0xfc, 0x1d, 0xd3, 0x73, 0xdd, 0x10, 0x8, + 0xdc, 0xc8, 0x10, + + /* U+F070 "" */ + 0x1d, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x8c, + 0xcc, 0xa2, 0x0, 0x0, 0x2d, 0xb4, 0x49, 0xf4, + 0x0, 0x7a, 0x1a, 0xff, 0x3f, 0xe1, 0x7, 0xfa, + 0x6, 0xf7, 0xff, 0x10, 0xa, 0xf3, 0x3, 0xef, + 0x40, 0x0, 0x6, 0xcc, 0x71, 0xbb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x89, + + /* U+F071 "" */ + 0x0, 0x0, 0x3e, 0x30, 0x0, 0x0, 0x0, 0xc, + 0xfc, 0x0, 0x0, 0x0, 0x6, 0xfc, 0xf6, 0x0, + 0x0, 0x0, 0xed, 0xd, 0xe0, 0x0, 0x0, 0x8f, + 0xe0, 0xef, 0x80, 0x0, 0x2f, 0xff, 0x6f, 0xff, + 0x20, 0xb, 0xff, 0xe2, 0xef, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xd0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x20, 0x44, 0x0, 0x4, 0xf5, + 0xef, 0xb1, 0xcf, 0xfd, 0x1, 0x8c, 0xd1, 0xc1, + 0x1, 0xdc, 0x81, 0xc1, 0xef, 0xc1, 0xbf, 0xfd, + 0x44, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0x20, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xe4, 0x0, 0x4, + 0xfc, 0xf4, 0x4, 0xf8, 0x8, 0xf4, 0xb8, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x8b, 0x4f, + 0x80, 0x8f, 0x40, 0x4f, 0xcf, 0x40, 0x0, 0x4e, + 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x94, 0x14, 0x44, 0x40, 0x0, 0xbf, 0xf8, + 0xbb, 0xbf, 0x10, 0x8, 0xb7, 0x60, 0x0, 0xe1, + 0x0, 0xb, 0x40, 0x0, 0x1e, 0x20, 0x0, 0xb7, + 0x44, 0x5e, 0xfd, 0x50, 0x7, 0xbb, 0xb8, 0x5f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F07B "" */ + 0xdf, 0xfb, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F093 "" */ + 0x0, 0x9, 0x90, 0x0, 0x0, 0x9f, 0xf9, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x78, 0x4f, 0xf4, 0x87, + 0xff, 0xe8, 0x8e, 0xff, 0xff, 0xff, 0xfb, 0xbf, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xea, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, + 0x0, 0x1d, 0xe0, 0x7, 0xdc, 0x4d, 0xf3, 0x0, + 0xef, 0xff, 0xe3, 0x0, 0xa, 0xec, 0x70, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x3, 0x0, 0x0, 0x0, 0xcd, 0xc0, 0x2d, 0xc0, + 0xe7, 0xf2, 0xee, 0x20, 0x4b, 0xff, 0xe2, 0x0, + 0x4, 0xff, 0xa0, 0x0, 0xcd, 0xf9, 0xf9, 0x0, + 0xe7, 0xe0, 0x7f, 0x90, 0x4a, 0x40, 0x4, 0x50, + + /* U+F0C5 "" */ + 0x0, 0xff, 0xf7, 0x47, 0x4f, 0xff, 0x47, 0xf8, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, 0x78, 0x88, + 0x7f, 0xff, 0xff, 0x0, + + /* U+F0C7 "" */ + 0x24, 0x44, 0x41, 0xf, 0xbb, 0xbb, 0xe2, 0xf0, + 0x0, 0xf, 0xdf, 0x44, 0x44, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xf9, 0x9, 0xff, 0xff, 0xd5, 0xdf, + 0xf8, 0xbb, 0xbb, 0xb8, + + /* U+F0C9 "" */ + 0x1, 0x11, 0x11, 0xf, 0xff, 0xff, 0xff, 0x1, + 0x11, 0x11, 0x5, 0x55, 0x55, 0x55, 0xcc, 0xcc, + 0xcc, 0xc0, 0x11, 0x11, 0x10, 0xff, 0xff, 0xff, + 0xf0, 0x11, 0x11, 0x10, + + /* U+F0E0 "" */ + 0xdf, 0xff, 0xff, 0xfd, 0x9f, 0xff, 0xff, 0xf9, + 0xb7, 0xff, 0xff, 0x7b, 0xfe, 0x7c, 0xc7, 0xef, + 0xff, 0xfa, 0xaf, 0xff, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F0E7 "" */ + 0x7, 0xff, 0x60, 0x0, 0xaf, 0xf2, 0x0, 0xc, + 0xff, 0x87, 0x0, 0xef, 0xff, 0xb0, 0x7, 0x8e, + 0xf2, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x6, 0x50, 0x0, + + /* U+F0EA "" */ + 0x79, 0xb9, 0x70, 0xf, 0xfc, 0xff, 0x0, 0xff, + 0x68, 0x83, 0xf, 0xf8, 0xff, 0x8b, 0xff, 0x8f, + 0xf8, 0x8f, 0xf8, 0xff, 0xff, 0x78, 0x8f, 0xff, + 0xf0, 0x7, 0xff, 0xff, + + /* U+F0F3 "" */ + 0x0, 0xd, 0x0, 0x0, 0x4e, 0xfe, 0x30, 0xd, + 0xff, 0xfd, 0x0, 0xff, 0xff, 0xf0, 0x3f, 0xff, + 0xff, 0x3b, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x60, 0x4, 0xf4, 0x0, + + /* U+F11C "" */ + 0xdf, 0xff, 0xff, 0xff, 0xdf, 0x18, 0x81, 0x88, + 0x1f, 0xfe, 0xaa, 0xca, 0xae, 0xff, 0xea, 0xac, + 0xaa, 0xef, 0xf1, 0x80, 0x0, 0x81, 0xfd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xc0, 0x0, 0x0, 0x5c, 0xff, 0xb0, 0x0, + 0x6e, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, 0xfc, + 0x0, 0x6, 0x88, 0xcf, 0xf5, 0x0, 0x0, 0x0, + 0x8f, 0xe0, 0x0, 0x0, 0x0, 0x8f, 0x60, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xff, 0xf8, 0xb0, 0xff, 0xf8, 0xfb, 0xff, 0xfc, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+F1EB "" */ + 0x0, 0x4, 0x77, 0x40, 0x0, 0x9, 0xff, 0xcc, + 0xff, 0x90, 0xcd, 0x40, 0x0, 0x4, 0xdc, 0x20, + 0x4b, 0xff, 0xb4, 0x2, 0x1, 0xfa, 0x55, 0xaf, + 0x10, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0xee, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, + + /* U+F240 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xee, 0xee, 0x5f, 0xf8, + 0xff, 0xff, 0xff, 0x2f, 0xf5, 0x66, 0x66, 0x66, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F241 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xee, 0x70, 0x5f, 0xf8, + 0xff, 0xff, 0x80, 0x2f, 0xf5, 0x66, 0x66, 0x54, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F242 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xe0, 0x0, 0x5f, 0xf8, + 0xff, 0xf0, 0x0, 0x2f, 0xf5, 0x66, 0x64, 0x44, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F243 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xe7, 0x0, 0x0, 0x5f, 0xf8, + 0xf8, 0x0, 0x0, 0x2f, 0xf5, 0x65, 0x44, 0x44, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F244 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xd8, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0xf0, + 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x44, 0x44, 0x44, + 0xad, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xd8, 0x0, 0x0, 0x0, 0x7, 0x36, 0x40, 0x0, + 0x9, 0xb1, 0x91, 0x11, 0x17, 0x20, 0xef, 0x88, + 0xd8, 0x88, 0xd9, 0x2, 0x20, 0x6, 0x48, 0x70, + 0x0, 0x0, 0x0, 0x6, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x6, 0xdd, 0xc3, 0x4, 0xff, 0x3e, 0xd0, 0x9c, + 0xb5, 0x5f, 0x2b, 0xf7, 0x1a, 0xf4, 0xbf, 0x81, + 0xbf, 0x39, 0xc9, 0x64, 0xf2, 0x4f, 0xf3, 0xde, + 0x0, 0x6d, 0xed, 0x30, + + /* U+F2ED "" */ + 0x78, 0xdf, 0xd8, 0x77, 0x88, 0x88, 0x87, 0x8f, + 0xff, 0xff, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, + 0xcc, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, 0xcc, + 0x85, 0xff, 0xff, 0xf5, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x7e, 0x30, 0x0, 0x0, 0x4b, + 0xfe, 0x0, 0x0, 0x8f, 0x9b, 0x70, 0x0, 0x8f, + 0xff, 0x40, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0x80, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, + 0xee, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0xaf, 0xff, 0xff, 0xfc, 0xb, 0xff, 0x9c, + 0xc9, 0xff, 0xaf, 0xff, 0xc1, 0x1c, 0xff, 0xaf, + 0xff, 0xc1, 0x1c, 0xff, 0xb, 0xff, 0x9c, 0xc9, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xfc, + + /* U+F7C2 "" */ + 0x7, 0xff, 0xfe, 0x17, 0xb6, 0x27, 0xc3, 0xfe, + 0xb9, 0xbe, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0x3c, 0xff, 0xff, 0xe1, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x3, 0x0, 0x23, 0x0, 0x2, + 0xf0, 0x2e, 0x92, 0x22, 0x5f, 0xd, 0xff, 0xff, + 0xff, 0xf0, 0x2e, 0x92, 0x22, 0x21, 0x0, 0x23, + 0x0, 0x0, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 34, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 34, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5, .adv_w = 50, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 10, .adv_w = 90, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25, .adv_w = 79, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 61, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79, .adv_w = 27, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 82, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100, .adv_w = 51, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 106, .adv_w = 74, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 116, .adv_w = 29, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119, .adv_w = 49, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 121, .adv_w = 29, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 123, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 141, .adv_w = 85, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 154, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 162, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 175, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 188, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 203, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 216, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 229, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 242, .adv_w = 82, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 255, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 268, .adv_w = 29, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 272, .adv_w = 29, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 278, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 291, .adv_w = 74, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 299, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 312, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 325, .adv_w = 132, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 349, .adv_w = 94, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 367, .adv_w = 97, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 382, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 397, .adv_w = 106, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 415, .adv_w = 86, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 428, .adv_w = 81, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 441, .adv_w = 99, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 456, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 40, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 476, .adv_w = 66, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 489, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 504, .adv_w = 76, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 517, .adv_w = 122, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 535, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 550, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 568, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 583, .adv_w = 108, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 604, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 619, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 632, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 645, .adv_w = 101, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 660, .adv_w = 91, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 678, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 701, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 716, .adv_w = 83, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 734, .adv_w = 84, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 749, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 760, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 778, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 785, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 793, .adv_w = 64, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 795, .adv_w = 77, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 797, .adv_w = 77, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 807, .adv_w = 87, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 825, .adv_w = 73, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 835, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 850, .adv_w = 78, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 860, .adv_w = 45, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 872, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 885, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 900, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 906, .adv_w = 36, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 917, .adv_w = 79, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 932, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 938, .adv_w = 135, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 954, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 81, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 974, .adv_w = 87, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 989, .adv_w = 87, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1002, .adv_w = 52, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1010, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1018, .adv_w = 53, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1028, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1038, .adv_w = 72, .box_w = 6, .box_h = 4, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1050, .adv_w = 115, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1066, .adv_w = 71, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1076, .adv_w = 72, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1091, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1099, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1110, .adv_w = 38, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1117, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1128, .adv_w = 74, .box_w = 5, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1133, .adv_w = 54, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1138, .adv_w = 40, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1141, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1177, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1201, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1233, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1257, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1275, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1307, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1339, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1375, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1407, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1434, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1474, .adv_w = 64, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1488, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1509, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1545, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1569, .adv_w = 88, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1593, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1613, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1648, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1676, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1704, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1724, .adv_w = 112, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1760, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1780, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1800, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1828, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1835, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1862, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1906, .adv_w = 144, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1950, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1982, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2003, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2024, .adv_w = 160, .box_w = 11, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2063, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2087, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2119, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2160, .adv_w = 112, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2192, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2220, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2248, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2276, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2300, .adv_w = 80, .box_w = 7, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2328, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2356, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2384, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2411, .adv_w = 128, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2461, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2485, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2525, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2555, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2585, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2615, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2645, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2675, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2719, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2747, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2775, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2816, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2846, .adv_w = 96, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2874, .adv_w = 129, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef93, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, + 0xefa3, 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, + 0xefc7, 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, + 0xf017, 0xf019, 0xf030, 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, + 0xf0ab, 0xf13b, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, + 0xf1e3, 0xf23d, 0xf254, 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 62, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 3, -3, 0, 0, + 0, 0, -7, -8, 1, 6, 3, 2, + -5, 1, 6, 0, 5, 1, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 1, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, -4, 0, 0, 0, 0, + 0, -3, 2, 3, 0, 0, -1, 0, + -1, 1, 0, -1, 0, -1, -1, -3, + 0, 0, 0, 0, -1, 0, 0, -2, + -2, 0, 0, -1, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + -1, 0, -2, 0, -3, 0, -15, 0, + 0, -3, 0, 3, 4, 0, 0, -3, + 1, 1, 4, 3, -2, 3, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -2, -6, 0, -5, + -1, 0, 0, 0, 0, 0, 5, 0, + -4, -1, 0, 0, 0, -2, 0, 0, + -1, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, -1, 5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 1, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 3, 1, 4, -1, 0, 0, 3, -1, + -4, -18, 1, 3, 3, 0, -2, 0, + 5, 0, 4, 0, 4, 0, -12, 0, + -2, 4, 0, 4, -1, 3, 1, 0, + 0, 0, -1, 0, 0, -2, 10, 0, + 10, 0, 4, 0, 5, 2, 2, 4, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, -1, 0, 1, -2, -2, -3, 1, + 0, -1, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, -8, 0, 0, 0, + 0, -1, 0, 13, -2, -2, 1, 1, + -1, 0, -2, 1, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -12, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 8, 0, 0, -5, 0, + 4, 0, -9, -12, -9, -3, 4, 0, + 0, -9, 0, 2, -3, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 4, -16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -3, 0, 0, + 0, -1, 0, 0, -1, 0, 0, 0, + -3, 0, -1, 0, -3, -3, 0, -3, + -4, -4, -2, 0, -3, 0, -3, 0, + 0, 0, 0, -1, 0, 0, 1, 0, + 1, -1, 0, 0, 0, 0, 0, 1, + -1, 0, 0, 0, -1, 1, 1, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -1, 0, + -2, 0, -2, 0, 0, -1, 0, 4, + 0, 0, -1, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, 0, -1, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, -1, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -2, 0, -4, + -1, -4, 3, 0, 0, -3, 1, 3, + 3, 0, -3, 0, -2, 0, 0, -6, + 1, -1, 1, -7, 1, 0, 0, 0, + -7, 0, -7, -1, -11, -1, 0, -6, + 0, 3, 4, 0, 2, 0, 0, 0, + 0, 0, 0, -2, -2, 0, -4, 0, + 0, 0, -1, 0, 0, 0, -1, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -1, -1, 0, -1, -2, -1, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, -1, 0, -3, 1, 0, 0, -2, + 1, 1, 1, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -1, 0, -1, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + -1, 0, 0, 0, 0, -1, -2, 0, + -2, 0, 4, -1, 0, -4, 0, 0, + 3, -6, -7, -5, -3, 1, 0, -1, + -8, -2, 0, -2, 0, -3, 2, -2, + -8, 0, -3, 0, 0, 1, 0, 1, + -1, 0, 1, 0, -4, -5, 0, -6, + -3, -3, -3, -4, -2, -3, 0, -2, + -3, 1, 0, 0, 0, -1, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, 0, 0, -1, 0, -2, -3, + -3, 0, 0, -4, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -2, 0, 0, 0, 0, -6, -4, 0, + 0, 0, -2, -6, 0, 0, -1, 1, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, -2, 0, + 0, 0, 0, 2, 0, 1, -3, -3, + 0, -1, -1, -2, 0, 0, 0, 0, + 0, 0, -4, 0, -1, 0, -2, -1, + 0, -3, -3, -4, -1, 0, -3, 0, + -4, 0, 0, 0, 0, 10, 0, 0, + 1, 0, 0, -2, 0, 1, 0, -6, + 0, 0, 0, 0, 0, -12, -2, 4, + 4, -1, -5, 0, 1, -2, 0, -6, + -1, -2, 1, -9, -1, 2, 0, 2, + -4, -2, -5, -4, -5, 0, 0, -8, + 0, 7, 0, 0, -1, 0, 0, 0, + -1, -1, -1, -3, -4, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, -1, -1, -2, 0, 0, + -3, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 3, + 0, 2, 0, -3, 1, -1, 0, -3, + -1, 0, -2, -1, -1, 0, -2, -2, + 0, 0, -1, 0, -1, -2, -2, 0, + 0, -1, 0, 1, -1, 0, -3, 0, + 0, 0, -3, 0, -2, 0, -2, -2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 1, 0, -2, 0, -1, -2, + -4, -1, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, -1, -1, -1, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -1, -2, + -1, 0, 1, 5, 0, 0, -3, 0, + -1, 3, 0, -1, -5, -2, 2, 0, + 0, -6, -2, 1, -2, 1, 0, -1, + -1, -4, 0, -2, 1, 0, 0, -2, + 0, 0, 0, 1, 1, -3, -2, 0, + -2, -1, -2, -1, -1, 0, -2, 1, + -2, -2, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, -1, -1, 0, 0, 0, 0, + -1, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -2, 0, -3, 0, 0, 0, -4, 0, + 1, -3, 3, 0, -1, -6, 0, 0, + -3, -1, 0, -5, -3, -4, 0, 0, + -6, -1, -5, -5, -6, 0, -3, 0, + 1, 9, -2, 0, -3, -1, 0, -1, + -2, -3, -2, -5, -5, -3, -1, 0, + 0, -1, 0, 0, 0, 0, -9, -1, + 4, 3, -3, -5, 0, 0, -4, 0, + -6, -1, -1, 3, -12, -2, 0, 0, + 0, -8, -2, -7, -1, -9, 0, 0, + -9, 0, 8, 0, 0, -1, 0, 0, + 0, 0, -1, -1, -5, -1, 0, -8, + 0, 0, 0, 0, -4, 0, -1, 0, + 0, -4, -6, 0, 0, -1, -2, -4, + -1, 0, -1, 0, 0, 0, 0, -6, + -1, -4, -4, -1, -2, -3, -1, -2, + 0, -3, -1, -4, -2, 0, -2, -2, + -1, -2, 0, 1, 0, -1, -4, 0, + 3, 0, -2, 0, 0, 0, 0, 2, + 0, 1, -3, 5, 0, -1, -1, -2, + 0, 0, 0, 0, 0, 0, -4, 0, + -1, 0, -2, -1, 0, -3, -3, -4, + -1, 0, -3, 1, 5, 0, 0, 0, + 0, 10, 0, 0, 1, 0, 0, -2, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -3, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -1, -1, 0, 0, -3, + -1, 0, 0, -3, 0, 2, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 2, 3, 1, -1, 0, -4, + -2, 0, 4, -4, -4, -3, -3, 5, + 2, 1, -11, -1, 3, -1, 0, -1, + 1, -1, -4, 0, -1, 1, -2, -1, + -4, -1, 0, 0, 4, 3, 0, -4, + 0, -7, -2, 4, -2, -5, 0, -2, + -4, -4, -1, 5, 1, 0, -2, 0, + -3, 0, 1, 4, -3, -5, -5, -3, + 4, 0, 0, -9, -1, 1, -2, -1, + -3, 0, -3, -5, -2, -2, -1, 0, + 0, -3, -3, -1, 0, 4, 3, -1, + -7, 0, -7, -2, 0, -4, -7, 0, + -4, -2, -4, -4, 3, 0, 0, -2, + 0, -3, -1, 0, -1, -2, 0, 2, + -4, 1, 0, 0, -7, 0, -1, -3, + -2, -1, -4, -3, -4, -3, 0, -4, + -1, -3, -2, -4, -1, 0, 0, 0, + 6, -2, 0, -4, -1, 0, -1, -3, + -3, -3, -4, -5, -2, -3, 3, 0, + -2, 0, -6, -2, 1, 3, -4, -5, + -3, -4, 4, -1, 1, -12, -2, 3, + -3, -2, -5, 0, -4, -5, -2, -1, + -1, -1, -3, -4, 0, 0, 0, 4, + 4, -1, -8, 0, -8, -3, 3, -5, + -9, -3, -4, -5, -6, -4, 3, 0, + 0, 0, 0, -2, 0, 0, 1, -2, + 3, 1, -2, 3, 0, 0, -4, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + 0, 1, 4, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, + -1, 0, 5, 0, 2, 0, 0, -2, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, -1, 2, 0, 4, + 0, 0, 13, 2, -3, -3, 1, 1, + -1, 0, -6, 0, 0, 6, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 5, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -3, 0, + 0, 0, 0, 0, 1, 17, -3, -1, + 4, 3, -3, 1, 0, 0, 1, 1, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -3, 0, 0, 0, 0, + -3, -1, 0, 0, 0, -3, 0, -2, + 0, -6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, -2, 0, -2, 0, + -3, 0, 0, 0, -2, 1, -2, 0, + 0, -3, -1, -3, 0, 0, -3, 0, + -1, 0, -6, 0, -1, 0, 0, -10, + -2, -5, -1, -5, 0, 0, -9, 0, + -3, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, -1, -2, 0, 0, + 0, 0, -3, 0, -3, 2, -1, 3, + 0, -1, -3, -1, -2, -2, 0, -2, + -1, -1, 1, -3, 0, 0, 0, 0, + -11, -1, -2, 0, -3, 0, -1, -6, + -1, 0, 0, -1, -1, 0, 0, 0, + 0, 1, 0, -1, -2, -1, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -3, 0, -1, 0, 0, 0, -3, + 1, 0, 0, 0, -3, -1, -3, 0, + 0, -4, 0, -1, 0, -6, 0, 0, + 0, 0, -12, 0, -3, -5, -6, 0, + 0, -9, 0, -1, -2, 0, 0, 0, + 0, 0, 0, 0, 0, -1, -2, -1, + -2, 0, 0, 0, 2, -2, 0, 4, + 6, -1, -1, -4, 2, 6, 2, 3, + -3, 2, 5, 2, 4, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 6, -2, -1, 0, -1, + 10, 6, 10, 0, 0, 0, 1, 0, + 0, 5, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, -11, -2, -1, -5, + -6, 0, 0, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, -11, -2, -1, + -5, -6, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, -3, 1, 0, -1, + 1, 2, 1, -4, 0, 0, -1, 1, + 0, 1, 0, 0, 0, 0, -3, 0, + -1, -1, -3, 0, -1, -5, 0, 8, + -1, 0, -3, -1, 0, -1, -2, 0, + -1, -4, -3, -2, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, -11, + -2, -1, -5, -6, 0, 0, -9, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, -4, -2, -1, 4, -1, -1, + -5, 0, -1, 0, -1, -3, 0, 3, + 0, 1, 0, 1, -3, -5, -2, 0, + -5, -2, -3, -5, -5, 0, -2, -3, + -2, -2, -1, -1, -2, -1, 0, -1, + 0, 2, 0, 2, -1, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -1, -1, 0, 0, + -3, 0, -1, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, 0, 0, 0, -1, 0, 0, -2, + -1, 1, 0, -2, -2, -1, 0, -4, + -1, -3, -1, -2, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 4, 0, 0, -2, 0, + 0, 0, 0, -2, 0, -1, 0, 0, + -1, 0, 0, -1, 0, -3, 0, 0, + 5, -2, -4, -4, 1, 1, 1, 0, + -4, 1, 2, 1, 4, 1, 4, -1, + -3, 0, 0, -5, 0, 0, -4, -3, + 0, 0, -3, 0, -2, -2, 0, -2, + 0, -2, 0, -1, 2, 0, -1, -4, + -1, 5, 0, 0, -1, 0, -3, 0, + 0, 2, -3, 0, 1, -1, 1, 0, + 0, -4, 0, -1, 0, 0, -1, 1, + -1, 0, 0, 0, -5, -2, -3, 0, + -4, 0, 0, -6, 0, 5, -1, 0, + -2, 0, 1, 0, -1, 0, -1, -4, + 0, -1, 1, 0, 0, 0, 0, -1, + 0, 0, 1, -2, 0, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 3, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + -1, -1, 0, 0, 0, 3, 0, 3, + 0, 0, 0, 0, 0, -8, -7, 0, + 6, 4, 2, -5, 1, 5, 0, 5, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_montserrat_8 = { +#else +lv_font_t lv_font_montserrat_8 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 10, /*The maximum line height required by the font*/ + .base_line = 2, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_MONTSERRAT_8*/ diff --git a/inc/lvgl/src/font/lv_font_source_han_sans_sc_14_cjk.c b/inc/lvgl/src/font/lv_font_source_han_sans_sc_14_cjk.c new file mode 100644 index 0000000..a03b4c3 --- /dev/null +++ b/inc/lvgl/src/font/lv_font_source_han_sans_sc_14_cjk.c @@ -0,0 +1,23898 @@ +/******************************************************************************* + * Size: 14 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 14 --font SourceHanSansSC-Normal.otf -r 0x20-0x7f --symbols (),盗提陽帯鼻画輕ッ冊ェル写父ぁフ結想正四O夫源庭場天續鳥れ講猿苦階給了製守8祝己妳薄泣塩帰ぺ吃変輪那着仍嗯爭熱創味保字宿捨準查達肯ァ薬得査障該降察ね網加昼料等図邪秋コ態品屬久原殊候路願楽確針上被怕悲風份重歡っ附ぷ既4黨價娘朝凍僅際洋止右航よ专角應酸師個比則響健昇豐筆歷適修據細忙跟管長令家ザ期般花越ミ域泳通些油乏ラ。營ス返調農叫樹刊愛間包知把ヤ貧橋拡普聞前ジ建当繰ネ送習渇用補ィ覺體法遊宙ョ酔余利壊語くつ払皆時辺追奇そ們只胸械勝住全沈力光ん深溝二類北面社值試9和五勵ゃ貿幾逐打課ゲて領3鼓辦発評1渉詳暇込计駄供嘛郵頃腦反構絵お容規借身妻国慮剛急乗静必議置克土オ乎荷更肉還混古渡授合主離條値決季晴東大尚央州が嗎験流先医亦林田星晩拿60旅婦量為痛テ孫う環友況玩務其ぼち揺坐一肩腰犯タょ希即果ぶ物練待み高九找やヶ都グ去」サ、气仮雑酒許終企笑録形リ銀切ギ快問滿役単黄集森毎實研喜蘇司鉛洲川条媽ノ才兩話言雖媒出客づ卻現異故り誌逮同訊已視本題ぞを横開音第席費持眾怎選元退限ー賽処喝就残無いガ多ケ沒義遠歌隣錢某雪析嬉採自透き側員予ゼ白婚电へ顯呀始均畫似懸格車騒度わ親店週維億締慣免帳電甚來園浴ゅ愈京と杯各海怒ぜ排敗挙老買7極模実紀ヒ携隻告シ並屋這孩讓質ワブ富賃争康由辞マ火於短樣削弟材注節另室ダ招擁ぃ若套底波行勤關著泊背疲狭作念推ぐ民貸祖介說ビ代温契你我レ入描變再札ソ派頭智遅私聽舉灣山伸放直安ト誕煙付符幅ふ絡她届耳飲忘参革團仕様載ど歩獲嫌息の汚交興魚指資雙與館初学年幸史位柱族走括び考青也共腕Lで販擔理病イ今逃當寺猫邊菓係ム秘示解池影ド文例斷曾事茶寫明科桃藝売便え導禁財飛替而亡到し具空寝辛業ウ府セ國何基菜厳市努張缺雲根外だ断万砂ゴ超使台实ぽ礼最慧算軟界段律像夕丈窓助刻月夏政呼ぴざ擇趣除動従涼方勉名線対存請子氏將5少否諸論美感或西者定食御表は參歳緑命進易性錯房も捕皿判中觀戦ニ緩町ピ番ず金千ろ?不た象治関ャ每看徒卒統じ手範訪押座步号ベ旁以母すほ密減成往歲件緒読歯效院种七謂凝濃嵌震喉繼クュ拭死円2積水欲如ポにさ寒道區精啦姐ア聯能足及停思壓2春且メ裏株官答概黒過氷柿戻厚ぱ党祭織引計け委暗複誘港バ失下村較続神ぇ尤強秀膝兒来績十書済化服破新廠1紹您情半式產系好教暑早め樂地休協良な哪常要揮周かエ麗境働避護ンツ香夜太見設非改広聲他検求危清彼經未在起葉控靴所差內造寄南望尺換向展備眠點完約ぎ裡分説申童優伝島机須塊日立拉,鉄軽單気信很転識支布数紙此迎受心輸坊モ處「訳三曇兄野顔戰增ナ伊列又髪両有取左毛至困吧昔赤狀相夠整別士経頼然簡ホ会發隨営需脱ヨば接永居冬迫圍甘醫誰部充消連弱宇會咲覚姉麼的増首统帶糖朋術商担移景功育庫曲總劃牛程駅犬報ロ學責因パ嚴八世後平負公げ曜陸專午之閉ぬ談ご災昨冷職悪謝對它近射敢意運船臉局難什産頗!球真記ま但蔵究制機案湖臺ひ害券男留内木驗雨施種特復句末濟キ色訴依せ百型る石牠討呢时任執飯歐宅組傳配小活ゆべ暖ズ漸站素らボ束価チ浅回女片独妹英目從認生違策僕楚ペ米こ掛む爸六状落漢プ投カ校做啊洗声探あ割体項履触々訓技ハ低工映是標速善点人デ口次可廿节宵植树端阳旦腊妇费愚劳动儿军师庆圣诞闰 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_source_han_sans_sc_14_cjk.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_SOURCE_HAN_SANS_SC_14_CJK + #define LV_FONT_SOURCE_HAN_SANS_SC_14_CJK 1 +#endif + +#if LV_FONT_SOURCE_HAN_SANS_SC_14_CJK + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x5c, 0x5, 0xb0, 0x5b, 0x4, 0xb0, 0x4a, 0x3, + 0xa0, 0x39, 0x2, 0x60, 0x0, 0x5, 0xa0, 0x7c, + 0x0, + + /* U+0022 "\"" */ + 0xb7, 0x1f, 0x1b, 0x71, 0xf0, 0x95, 0xf, 0x8, + 0x40, 0xc0, + + /* U+0023 "#" */ + 0x0, 0x65, 0x7, 0x40, 0x0, 0x83, 0x9, 0x20, + 0x0, 0xa1, 0xb, 0x0, 0x1d, 0xfd, 0xdf, 0xd2, + 0x0, 0xb0, 0xc, 0x0, 0x0, 0xb0, 0xb, 0x0, + 0x0, 0xb0, 0x2a, 0x0, 0x5d, 0xec, 0xde, 0xb0, + 0x4, 0x70, 0x56, 0x0, 0x6, 0x50, 0x74, 0x0, + 0x8, 0x30, 0x92, 0x0, + + /* U+0024 "$" */ + 0x0, 0x8, 0x50, 0x0, 0x1, 0xa8, 0x0, 0x2, + 0xeb, 0xae, 0x30, 0x9a, 0x0, 0x31, 0xb, 0x70, + 0x0, 0x0, 0x6d, 0x20, 0x0, 0x0, 0x7f, 0x80, + 0x0, 0x0, 0x3c, 0xc1, 0x0, 0x0, 0xc, 0x80, + 0x0, 0x0, 0x7b, 0x6, 0x0, 0xa, 0x90, 0x9e, + 0xac, 0xe1, 0x0, 0x1a, 0x80, 0x0, 0x0, 0x85, + 0x0, + + /* U+0025 "%" */ + 0x6, 0xcc, 0x20, 0x0, 0x75, 0x0, 0x1, 0xc0, + 0x2c, 0x0, 0xc, 0x0, 0x0, 0x58, 0x0, 0xd0, + 0x7, 0x50, 0x0, 0x6, 0x70, 0xc, 0x20, 0xb0, + 0x0, 0x0, 0x58, 0x0, 0xd0, 0x84, 0x3b, 0xb2, + 0x0, 0xd0, 0x3b, 0x1b, 0xd, 0x12, 0xc0, 0x4, + 0xba, 0x18, 0x43, 0x90, 0xc, 0x10, 0x0, 0x1, + 0xb0, 0x58, 0x0, 0xa3, 0x0, 0x0, 0x93, 0x4, + 0x90, 0xb, 0x10, 0x0, 0x1b, 0x0, 0xd, 0x1, + 0xd0, 0x0, 0x9, 0x30, 0x0, 0x5c, 0xc3, 0x0, + + /* U+0026 "&" */ + 0x0, 0x4d, 0xe7, 0x0, 0x0, 0x0, 0xe4, 0x1e, + 0x0, 0x0, 0x1, 0xf0, 0xe, 0x0, 0x0, 0x0, + 0xf2, 0x99, 0x0, 0x0, 0x0, 0x9e, 0x90, 0x0, + 0x0, 0x2, 0xdf, 0x10, 0x3, 0xc0, 0xe, 0x58, + 0xb0, 0x8, 0x80, 0x6c, 0x0, 0xc9, 0x1e, 0x10, + 0x6b, 0x0, 0xc, 0xe7, 0x0, 0x1f, 0x50, 0x2b, + 0xed, 0x40, 0x3, 0xcf, 0xd7, 0x6, 0xc0, + + /* U+0027 "'" */ + 0xb7, 0xb7, 0x95, 0x84, + + /* U+0028 "(" */ + 0x0, 0x80, 0x3, 0xa0, 0xa, 0x40, 0x1d, 0x0, + 0x59, 0x0, 0x87, 0x0, 0xa5, 0x0, 0xa4, 0x0, + 0xa5, 0x0, 0x87, 0x0, 0x59, 0x0, 0x1d, 0x0, + 0xa, 0x30, 0x3, 0xa0, 0x0, 0x80, + + /* U+0029 ")" */ + 0x35, 0x0, 0x1c, 0x0, 0xa, 0x40, 0x3, 0xb0, + 0x0, 0xf0, 0x0, 0xd2, 0x0, 0xc4, 0x0, 0xa4, + 0x0, 0xb4, 0x0, 0xd2, 0x0, 0xf0, 0x3, 0xb0, + 0x9, 0x40, 0x1d, 0x0, 0x35, 0x0, + + /* U+002A "*" */ + 0x0, 0x29, 0x0, 0x8, 0x8c, 0x73, 0x3, 0xdf, + 0x60, 0x1, 0xd9, 0x80, 0x1, 0x20, 0x40, + + /* U+002B "+" */ + 0x0, 0x2, 0x10, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x9, 0x40, 0x0, 0x0, 0x9, 0x40, 0x0, + 0x6d, 0xdf, 0xed, 0xd2, 0x0, 0x9, 0x40, 0x0, + 0x0, 0x9, 0x40, 0x0, 0x0, 0x9, 0x40, 0x0, + + /* U+002C "," */ + 0x7, 0x60, 0xbe, 0x1, 0xd0, 0xa5, 0x14, 0x0, + + /* U+002D "-" */ + 0x5e, 0xee, 0x20, + + /* U+002E "." */ + 0x96, 0xc8, + + /* U+002F "/" */ + 0x0, 0x0, 0xa2, 0x0, 0x0, 0xc0, 0x0, 0x4, + 0x80, 0x0, 0x9, 0x30, 0x0, 0xd, 0x0, 0x0, + 0x39, 0x0, 0x0, 0x85, 0x0, 0x0, 0xc0, 0x0, + 0x2, 0xb0, 0x0, 0x7, 0x60, 0x0, 0xc, 0x10, + 0x0, 0x1c, 0x0, 0x0, 0x67, 0x0, 0x0, 0xb2, + 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x8e, 0xd5, 0x0, 0x7c, 0x13, 0xe2, 0xd, + 0x30, 0x8, 0x81, 0xf0, 0x0, 0x4c, 0x3e, 0x0, + 0x3, 0xe4, 0xd0, 0x0, 0x2f, 0x3e, 0x0, 0x3, + 0xe1, 0xf0, 0x0, 0x4c, 0xd, 0x30, 0x9, 0x80, + 0x7c, 0x13, 0xe2, 0x0, 0x8e, 0xd4, 0x0, + + /* U+0031 "1" */ + 0x17, 0xda, 0x0, 0x28, 0xba, 0x0, 0x0, 0x6a, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x6a, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0x6a, 0x0, 0xbf, 0xff, + 0xfc, + + /* U+0032 "2" */ + 0x4, 0xbe, 0xc4, 0x2, 0xd4, 0x5, 0xf1, 0x1, + 0x0, 0xd, 0x60, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0xe, 0x30, 0x0, 0x5, 0xd0, 0x0, 0x0, 0xd5, + 0x0, 0x0, 0xb9, 0x0, 0x0, 0x9c, 0x0, 0x0, + 0x8d, 0x10, 0x0, 0x5f, 0xff, 0xff, 0xf0, + + /* U+0033 "3" */ + 0x3, 0xbe, 0xd6, 0x0, 0xc4, 0x4, 0xf3, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0xc6, 0x0, 0x1, + 0x7c, 0x0, 0x7, 0xfe, 0x20, 0x0, 0x0, 0x5d, + 0x40, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x5, 0xd5, + 0xc3, 0x3, 0xd7, 0x6, 0xbf, 0xd7, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0xad, 0x0, 0x0, 0x4, 0xed, 0x0, + 0x0, 0xd, 0x7d, 0x0, 0x0, 0x7a, 0x3d, 0x0, + 0x2, 0xe1, 0x3d, 0x0, 0xb, 0x60, 0x3d, 0x0, + 0x4c, 0x0, 0x3d, 0x0, 0xbf, 0xee, 0xff, 0xe3, + 0x0, 0x0, 0x3d, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x0, 0x3d, 0x0, + + /* U+0035 "5" */ + 0x7, 0xff, 0xff, 0x60, 0x88, 0x0, 0x0, 0x9, + 0x60, 0x0, 0x0, 0xa5, 0x0, 0x0, 0xb, 0xbd, + 0xd7, 0x0, 0x53, 0x3, 0xe6, 0x0, 0x0, 0x6, + 0xc0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x7, 0xb5, + 0xb3, 0x4, 0xe4, 0x6, 0xcf, 0xd5, 0x0, + + /* U+0036 "6" */ + 0x0, 0x3c, 0xfc, 0x40, 0x2, 0xe5, 0x4, 0x60, + 0x9, 0x70, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, + 0xf, 0x3b, 0xd9, 0x0, 0x2f, 0xb1, 0xa, 0x90, + 0x1f, 0x0, 0x2, 0xe0, 0xf, 0x0, 0x0, 0xf0, + 0xc, 0x50, 0x3, 0xe0, 0x4, 0xd2, 0xb, 0x70, + 0x0, 0x5d, 0xe8, 0x0, + + /* U+0037 "7" */ + 0x4f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x9, 0x80, + 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0xa6, 0x0, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0x6, 0xb0, 0x0, + 0x0, 0xa, 0x70, 0x0, 0x0, 0xd, 0x40, 0x0, + 0x0, 0xf, 0x20, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x2f, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x9e, 0xd8, 0x0, 0x8, 0xb1, 0xc, 0x50, + 0xc, 0x40, 0x6, 0xa0, 0x9, 0x70, 0x7, 0x70, + 0x2, 0xe8, 0x2d, 0x10, 0x1, 0xbc, 0xf8, 0x0, + 0xc, 0x40, 0x4d, 0x60, 0x4d, 0x0, 0x3, 0xe0, + 0x4c, 0x0, 0x1, 0xf0, 0xe, 0x60, 0x9, 0xa0, + 0x2, 0xbe, 0xd9, 0x0, + + /* U+0039 "9" */ + 0x1, 0xbe, 0xc3, 0x0, 0xc6, 0x4, 0xe1, 0x3d, + 0x0, 0x9, 0x85, 0xc0, 0x0, 0x5b, 0x3f, 0x0, + 0x4, 0xd0, 0xe6, 0x4, 0xdd, 0x2, 0xbd, 0x95, + 0xc0, 0x0, 0x0, 0x6a, 0x0, 0x0, 0xc, 0x40, + 0x82, 0x18, 0xc0, 0x7, 0xde, 0xa1, 0x0, + + /* U+003A ":" */ + 0xb8, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x96, 0xc8, + + /* U+003B ";" */ + 0xb, 0x80, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x60, 0xbe, 0x1, 0xd0, 0xa5, 0x14, + 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x41, 0x0, 0x1, 0x7d, 0xc1, + 0x3, 0xad, 0x82, 0x0, 0x7f, 0x50, 0x0, 0x0, + 0x18, 0xd9, 0x30, 0x0, 0x0, 0x5, 0xbd, 0x70, + 0x0, 0x0, 0x2, 0x82, + + /* U+003D "=" */ + 0x6e, 0xee, 0xee, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xdd, 0xdd, 0xd2, + + /* U+003E ">" */ + 0x32, 0x0, 0x0, 0x0, 0x4d, 0xb5, 0x0, 0x0, + 0x0, 0x4a, 0xd8, 0x10, 0x0, 0x0, 0x19, 0xf2, + 0x0, 0x5, 0xbc, 0x60, 0x29, 0xe9, 0x30, 0x0, + 0x56, 0x10, 0x0, 0x0, + + /* U+003F "?" */ + 0x6, 0xdf, 0xa1, 0x2a, 0x22, 0xc8, 0x0, 0x0, + 0x6b, 0x0, 0x0, 0xa8, 0x0, 0x4, 0xe1, 0x0, + 0xe, 0x40, 0x0, 0x5b, 0x0, 0x0, 0x56, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x9a, + 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x4b, 0xdd, 0xc7, 0x0, 0x0, 0x0, + 0x9b, 0x20, 0x1, 0x8c, 0x0, 0x0, 0xa7, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x4b, 0x0, 0x5b, 0xab, + 0x0, 0xd0, 0xc, 0x20, 0x4b, 0x4, 0xd0, 0xb, + 0x20, 0xe0, 0xc, 0x20, 0x3a, 0x0, 0x94, 0x2c, + 0x0, 0xe0, 0x5, 0x80, 0xa, 0x22, 0xb0, 0x1c, + 0x0, 0x86, 0x0, 0xc0, 0xd, 0x0, 0xd1, 0x2d, + 0x70, 0x86, 0x0, 0xc3, 0x4, 0xb8, 0x9, 0xa5, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xd4, 0x0, 0x16, 0x0, 0x0, 0x0, 0x2, + 0x9c, 0xcb, 0x60, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0xeb, 0x50, + 0x0, 0x0, 0x3c, 0x6a, 0x0, 0x0, 0x8, 0x82, + 0xf0, 0x0, 0x0, 0xd4, 0xe, 0x40, 0x0, 0x3f, + 0x0, 0x99, 0x0, 0x8, 0xb0, 0x5, 0xe0, 0x0, + 0xdf, 0xee, 0xff, 0x30, 0x2f, 0x10, 0x0, 0xb8, + 0x7, 0xb0, 0x0, 0x6, 0xe0, 0xc6, 0x0, 0x0, + 0x1f, 0x30, + + /* U+0042 "B" */ + 0x9f, 0xff, 0xd8, 0x0, 0x99, 0x0, 0x2c, 0x80, + 0x99, 0x0, 0x5, 0xd0, 0x99, 0x0, 0x5, 0xb0, + 0x99, 0x0, 0x3d, 0x50, 0x9f, 0xef, 0xfb, 0x0, + 0x99, 0x0, 0x17, 0xe1, 0x99, 0x0, 0x0, 0xc6, + 0x99, 0x0, 0x0, 0xc5, 0x99, 0x0, 0x18, 0xe1, + 0x9f, 0xff, 0xea, 0x20, + + /* U+0043 "C" */ + 0x0, 0x8, 0xde, 0xb3, 0x0, 0xc, 0xb3, 0x16, + 0xc0, 0x7, 0xc0, 0x0, 0x0, 0x0, 0xd5, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x2, 0xf0, + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, + 0xe5, 0x0, 0x0, 0x0, 0x7, 0xc0, 0x0, 0x1, + 0x0, 0xd, 0xb3, 0x15, 0xe2, 0x0, 0x9, 0xde, + 0xb3, 0x0, + + /* U+0044 "D" */ + 0x9f, 0xfe, 0xb4, 0x0, 0x99, 0x1, 0x5e, 0x70, + 0x99, 0x0, 0x3, 0xf1, 0x99, 0x0, 0x0, 0xc7, + 0x99, 0x0, 0x0, 0x99, 0x99, 0x0, 0x0, 0x7b, + 0x99, 0x0, 0x0, 0x99, 0x99, 0x0, 0x0, 0xc7, + 0x99, 0x0, 0x3, 0xf1, 0x99, 0x1, 0x6f, 0x70, + 0x9f, 0xfe, 0xb4, 0x0, + + /* U+0045 "E" */ + 0x9f, 0xff, 0xff, 0x49, 0x90, 0x0, 0x0, 0x99, + 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x99, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x80, 0x99, 0x0, 0x0, + 0x9, 0x90, 0x0, 0x0, 0x99, 0x0, 0x0, 0x9, + 0x90, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x60, + + /* U+0046 "F" */ + 0x9f, 0xff, 0xff, 0x39, 0x90, 0x0, 0x0, 0x99, + 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x99, 0x0, + 0x0, 0x9, 0xfe, 0xee, 0x70, 0x9a, 0x11, 0x10, + 0x9, 0x90, 0x0, 0x0, 0x99, 0x0, 0x0, 0x9, + 0x90, 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x7, 0xcf, 0xc6, 0x0, 0xc, 0xc4, 0x14, + 0xc2, 0x6, 0xd0, 0x0, 0x0, 0x0, 0xd5, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x2, 0xf0, + 0x0, 0xcf, 0xf8, 0xf, 0x20, 0x0, 0x8, 0x80, + 0xd5, 0x0, 0x0, 0x88, 0x7, 0xc0, 0x0, 0x8, + 0x80, 0xc, 0xc4, 0x14, 0xd7, 0x0, 0x8, 0xdf, + 0xc7, 0x0, + + /* U+0048 "H" */ + 0x99, 0x0, 0x0, 0x7a, 0x99, 0x0, 0x0, 0x7a, + 0x99, 0x0, 0x0, 0x7a, 0x99, 0x0, 0x0, 0x7a, + 0x99, 0x0, 0x0, 0x7a, 0x9f, 0xee, 0xee, 0xfa, + 0x9a, 0x11, 0x11, 0x8a, 0x99, 0x0, 0x0, 0x7a, + 0x99, 0x0, 0x0, 0x7a, 0x99, 0x0, 0x0, 0x7a, + 0x99, 0x0, 0x0, 0x7a, + + /* U+0049 "I" */ + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, + + /* U+004A "J" */ + 0x0, 0x0, 0x1f, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0x1f, 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x1f, + 0x0, 0x0, 0x2, 0xf0, 0x1, 0x0, 0x3e, 0x3, + 0xe3, 0x1b, 0xa0, 0x6, 0xcf, 0xa1, 0x0, + + /* U+004B "K" */ + 0x99, 0x0, 0x5, 0xe1, 0x99, 0x0, 0x2e, 0x30, + 0x99, 0x0, 0xd6, 0x0, 0x99, 0xa, 0xa0, 0x0, + 0x99, 0x7f, 0x50, 0x0, 0x9d, 0xf8, 0xd0, 0x0, + 0x9f, 0x50, 0xd6, 0x0, 0x9a, 0x0, 0x4e, 0x0, + 0x99, 0x0, 0xc, 0x80, 0x99, 0x0, 0x3, 0xf1, + 0x99, 0x0, 0x0, 0xb9, + + /* U+004C "L" */ + 0x99, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x99, + 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x99, 0x0, + 0x0, 0x9, 0x90, 0x0, 0x0, 0x99, 0x0, 0x0, + 0x9, 0x90, 0x0, 0x0, 0x99, 0x0, 0x0, 0x9, + 0x90, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x10, + + /* U+004D "M" */ + 0x9f, 0x0, 0x0, 0xc, 0xd9, 0xe5, 0x0, 0x1, + 0xed, 0x9a, 0xa0, 0x0, 0x6a, 0xd9, 0x7e, 0x0, + 0xc, 0x5d, 0x97, 0x95, 0x1, 0xd3, 0xd9, 0x74, + 0xa0, 0x67, 0x3d, 0x97, 0xe, 0xc, 0x23, 0xd9, + 0x70, 0x96, 0xc0, 0x3d, 0x97, 0x4, 0xe7, 0x3, + 0xd9, 0x70, 0xd, 0x20, 0x3d, 0x97, 0x0, 0x0, + 0x3, 0xd0, + + /* U+004E "N" */ + 0x9d, 0x0, 0x0, 0x79, 0x9f, 0x70, 0x0, 0x79, + 0x98, 0xe0, 0x0, 0x79, 0x97, 0x98, 0x0, 0x79, + 0x98, 0x2e, 0x10, 0x79, 0x98, 0x8, 0x90, 0x79, + 0x98, 0x1, 0xe2, 0x79, 0x98, 0x0, 0x7b, 0x69, + 0x98, 0x0, 0xe, 0x89, 0x98, 0x0, 0x6, 0xf9, + 0x98, 0x0, 0x0, 0xd9, + + /* U+004F "O" */ + 0x0, 0x9, 0xde, 0xb3, 0x0, 0x0, 0xda, 0x32, + 0x7f, 0x40, 0x7, 0xc0, 0x0, 0x7, 0xc0, 0xe, + 0x50, 0x0, 0x0, 0xf3, 0xf, 0x20, 0x0, 0x0, + 0xd5, 0x2f, 0x0, 0x0, 0x0, 0xb7, 0xf, 0x20, + 0x0, 0x0, 0xd5, 0xe, 0x50, 0x0, 0x0, 0xf2, + 0x7, 0xc0, 0x0, 0x7, 0xc0, 0x0, 0xdb, 0x32, + 0x7f, 0x30, 0x0, 0x9, 0xde, 0xb2, 0x0, + + /* U+0050 "P" */ + 0x9f, 0xff, 0xd7, 0x0, 0x99, 0x0, 0x3c, 0x90, + 0x99, 0x0, 0x3, 0xe0, 0x99, 0x0, 0x1, 0xf0, + 0x99, 0x0, 0x4, 0xe0, 0x99, 0x0, 0x3d, 0x70, + 0x9f, 0xff, 0xd6, 0x0, 0x99, 0x0, 0x0, 0x0, + 0x99, 0x0, 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, + 0x99, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x19, 0xde, 0xb3, 0x0, 0x1, 0xda, 0x32, + 0x7f, 0x40, 0x8, 0xb0, 0x0, 0x6, 0xd0, 0xe, + 0x40, 0x0, 0x0, 0xf3, 0xf, 0x10, 0x0, 0x0, + 0xc5, 0x2f, 0x0, 0x0, 0x0, 0xb7, 0xf, 0x20, + 0x0, 0x0, 0xd5, 0xc, 0x60, 0x0, 0x1, 0xf2, + 0x5, 0xe1, 0x0, 0xa, 0xa0, 0x0, 0x8e, 0x76, + 0xbc, 0x10, 0x0, 0x3, 0xaf, 0x50, 0x0, 0x0, + 0x0, 0xd, 0xb3, 0x0, 0x0, 0x0, 0x1, 0x9e, + 0xf8, + + /* U+0052 "R" */ + 0x9f, 0xff, 0xe9, 0x10, 0x99, 0x0, 0x2a, 0xb0, + 0x99, 0x0, 0x2, 0xf0, 0x99, 0x0, 0x2, 0xf0, + 0x99, 0x0, 0x2c, 0xa0, 0x9f, 0xff, 0xf6, 0x0, + 0x99, 0x3, 0xf1, 0x0, 0x99, 0x0, 0xb8, 0x0, + 0x99, 0x0, 0x3f, 0x10, 0x99, 0x0, 0xb, 0x90, + 0x99, 0x0, 0x3, 0xf2, + + /* U+0053 "S" */ + 0x0, 0x7d, 0xfb, 0x40, 0x7, 0xd4, 0x15, 0xd1, + 0xc, 0x60, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, + 0x2, 0xec, 0x40, 0x0, 0x0, 0x19, 0xfd, 0x30, + 0x0, 0x0, 0x19, 0xf3, 0x0, 0x0, 0x0, 0xa9, + 0x2, 0x0, 0x0, 0x98, 0x1e, 0x93, 0x15, 0xf3, + 0x1, 0x9d, 0xfc, 0x40, + + /* U+0054 "T" */ + 0x8f, 0xff, 0xff, 0xfd, 0x0, 0x7, 0xc0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0x6, 0xb0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0x6, 0xb0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0x6, 0xb0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0x6, 0xb0, 0x0, + 0x0, 0x6, 0xb0, 0x0, + + /* U+0055 "U" */ + 0x98, 0x0, 0x0, 0x7a, 0x98, 0x0, 0x0, 0x7a, + 0x98, 0x0, 0x0, 0x7a, 0x98, 0x0, 0x0, 0x7a, + 0x98, 0x0, 0x0, 0x7a, 0x98, 0x0, 0x0, 0x7a, + 0x99, 0x0, 0x0, 0x79, 0x7a, 0x0, 0x0, 0x97, + 0x4e, 0x0, 0x0, 0xd5, 0xc, 0xa2, 0x29, 0xd0, + 0x1, 0xae, 0xea, 0x10, + + /* U+0056 "V" */ + 0xd6, 0x0, 0x0, 0x6c, 0x8a, 0x0, 0x0, 0xa7, + 0x3e, 0x0, 0x0, 0xe2, 0xe, 0x30, 0x3, 0xd0, + 0xa, 0x80, 0x8, 0x90, 0x5, 0xc0, 0xc, 0x40, + 0x0, 0xf1, 0x1f, 0x0, 0x0, 0xb5, 0x5a, 0x0, + 0x0, 0x6a, 0xa6, 0x0, 0x0, 0x2e, 0xe1, 0x0, + 0x0, 0xd, 0xc0, 0x0, + + /* U+0057 "W" */ + 0x8a, 0x0, 0x8, 0xc0, 0x0, 0x6b, 0x5d, 0x0, + 0xc, 0xf0, 0x0, 0x97, 0x1f, 0x0, 0xd, 0xb4, + 0x0, 0xc4, 0xe, 0x30, 0x3a, 0x78, 0x0, 0xf1, + 0xb, 0x60, 0x77, 0x4b, 0x2, 0xe0, 0x8, 0x90, + 0xb3, 0xf, 0x5, 0xb0, 0x5, 0xc0, 0xe0, 0xc, + 0x38, 0x80, 0x1, 0xe2, 0xc0, 0x8, 0x6a, 0x50, + 0x0, 0xe7, 0x80, 0x5, 0xad, 0x20, 0x0, 0xbd, + 0x40, 0x1, 0xee, 0x0, 0x0, 0x8f, 0x10, 0x0, + 0xdb, 0x0, + + /* U+0058 "X" */ + 0x4e, 0x0, 0x1, 0xe3, 0xc, 0x70, 0x8, 0xa0, + 0x3, 0xe0, 0x1e, 0x20, 0x0, 0xb7, 0x79, 0x0, + 0x0, 0x2e, 0xe1, 0x0, 0x0, 0xe, 0xc0, 0x0, + 0x0, 0x5b, 0xe3, 0x0, 0x0, 0xd3, 0x6c, 0x0, + 0x6, 0xb0, 0xe, 0x40, 0xe, 0x30, 0x6, 0xd0, + 0x7b, 0x0, 0x0, 0xd5, + + /* U+0059 "Y" */ + 0xc7, 0x0, 0x1, 0xf1, 0x4d, 0x0, 0x8, 0x90, + 0xd, 0x40, 0xe, 0x20, 0x6, 0xb0, 0x6b, 0x0, + 0x0, 0xe2, 0xd3, 0x0, 0x0, 0x7c, 0xc0, 0x0, + 0x0, 0x1f, 0x50, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0xe, 0x30, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0xe, 0x30, 0x0, + + /* U+005A "Z" */ + 0xc, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x1, 0xf3, + 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x3e, 0x10, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x6, 0xc0, 0x0, + 0x0, 0x1e, 0x30, 0x0, 0x0, 0x9a, 0x0, 0x0, + 0x3, 0xf1, 0x0, 0x0, 0xc, 0x70, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfb, + + /* U+005B "[" */ + 0x8c, 0xb2, 0x85, 0x0, 0x85, 0x0, 0x85, 0x0, + 0x85, 0x0, 0x85, 0x0, 0x85, 0x0, 0x85, 0x0, + 0x85, 0x0, 0x85, 0x0, 0x85, 0x0, 0x85, 0x0, + 0x85, 0x0, 0x6b, 0xa1, + + /* U+005C "\\" */ + 0xa2, 0x0, 0x0, 0x57, 0x0, 0x0, 0x1c, 0x0, + 0x0, 0xb, 0x10, 0x0, 0x6, 0x60, 0x0, 0x1, + 0xb0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x85, 0x0, + 0x0, 0x3a, 0x0, 0x0, 0xd, 0x0, 0x0, 0x9, + 0x40, 0x0, 0x4, 0x90, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xa2, + + /* U+005D "]" */ + 0x6b, 0xe2, 0x0, 0xb2, 0x0, 0xb2, 0x0, 0xb2, + 0x0, 0xb2, 0x0, 0xb2, 0x0, 0xb2, 0x0, 0xb2, + 0x0, 0xb2, 0x0, 0xb2, 0x0, 0xb2, 0x0, 0xb2, + 0x0, 0xb2, 0x5a, 0xc2, + + /* U+005E "^" */ + 0x0, 0xd, 0x80, 0x0, 0x4, 0xad, 0x0, 0x0, + 0xa4, 0x95, 0x0, 0x1d, 0x3, 0xb0, 0x7, 0x80, + 0xd, 0x20, 0xd2, 0x0, 0x78, + + /* U+005F "_" */ + 0xac, 0xcc, 0xcc, 0xc7, + + /* U+0060 "`" */ + 0x20, 0x0, 0x9b, 0x0, 0xb, 0x80, 0x0, 0x80, + + /* U+0061 "a" */ + 0x2, 0xad, 0xe9, 0x0, 0x75, 0x12, 0xe5, 0x0, + 0x0, 0x9, 0x90, 0x4, 0x9c, 0xea, 0x9, 0xb3, + 0x7, 0xa1, 0xf0, 0x0, 0x7a, 0xf, 0x50, 0x4e, + 0xa0, 0x6e, 0xe9, 0x5a, + + /* U+0062 "b" */ + 0xa7, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0xa7, + 0x0, 0x0, 0xa, 0x79, 0xed, 0x60, 0xae, 0x50, + 0x4e, 0x4a, 0x70, 0x0, 0x8a, 0xa7, 0x0, 0x5, + 0xca, 0x70, 0x0, 0x6c, 0xa7, 0x0, 0xa, 0x9a, + 0xd3, 0x6, 0xf1, 0xa6, 0xbf, 0xc3, 0x0, + + /* U+0063 "c" */ + 0x0, 0x6d, 0xfb, 0x20, 0x7d, 0x30, 0x52, 0xf, + 0x40, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x3f, 0x0, + 0x0, 0x0, 0xf3, 0x0, 0x0, 0x8, 0xd3, 0x5, + 0x50, 0x7, 0xde, 0xb2, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0xd4, + 0x0, 0x0, 0x0, 0xd4, 0x0, 0x7d, 0xe8, 0xd4, + 0x7, 0xd3, 0x6, 0xf4, 0xf, 0x40, 0x0, 0xd4, + 0x2f, 0x0, 0x0, 0xd4, 0x3f, 0x0, 0x0, 0xd4, + 0xf, 0x30, 0x0, 0xd4, 0xa, 0xc2, 0x18, 0xf4, + 0x0, 0x9e, 0xd6, 0xa4, + + /* U+0065 "e" */ + 0x0, 0x7d, 0xea, 0x10, 0x7, 0xb1, 0x8, 0xa0, + 0xe, 0x0, 0x0, 0xf0, 0x2f, 0xdd, 0xdd, 0xe1, + 0x2f, 0x0, 0x0, 0x0, 0xf, 0x40, 0x0, 0x0, + 0x7, 0xd3, 0x2, 0x40, 0x0, 0x6d, 0xfc, 0x50, + + /* U+0066 "f" */ + 0x0, 0x9e, 0x90, 0x5e, 0x11, 0x7, 0xa0, 0x0, + 0x79, 0x0, 0x8f, 0xff, 0x40, 0x79, 0x0, 0x7, + 0x90, 0x0, 0x79, 0x0, 0x7, 0x90, 0x0, 0x79, + 0x0, 0x7, 0x90, 0x0, 0x79, 0x0, + + /* U+0067 "g" */ + 0x1, 0xae, 0xff, 0xe7, 0xb, 0x90, 0x1e, 0x40, + 0xe, 0x30, 0x9, 0x70, 0x9, 0x90, 0x2d, 0x40, + 0x3, 0xdc, 0xc5, 0x0, 0xa, 0x30, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0x5, 0xff, 0xff, 0xc2, + 0xd, 0x10, 0x1, 0xb8, 0x2e, 0x20, 0x2, 0xd4, + 0x6, 0xde, 0xcb, 0x40, + + /* U+0068 "h" */ + 0xa7, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0xa7, + 0x0, 0x0, 0xa, 0x78, 0xde, 0x50, 0xae, 0x61, + 0x6f, 0xa, 0x80, 0x0, 0xf3, 0xa7, 0x0, 0xe, + 0x4a, 0x70, 0x0, 0xd4, 0xa7, 0x0, 0xd, 0x4a, + 0x70, 0x0, 0xd4, 0xa7, 0x0, 0xd, 0x40, + + /* U+0069 "i" */ + 0xb8, 0x54, 0x0, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa7, 0xa7, 0xa7, + + /* U+006A "j" */ + 0x0, 0xb7, 0x0, 0x63, 0x0, 0x0, 0x0, 0xa7, + 0x0, 0xa7, 0x0, 0xa7, 0x0, 0xa7, 0x0, 0xa7, + 0x0, 0xa7, 0x0, 0xa7, 0x0, 0xa7, 0x0, 0xb7, + 0x1, 0xe5, 0x6f, 0xb0, + + /* U+006B "k" */ + 0xa7, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0xa7, + 0x0, 0x0, 0xa, 0x70, 0x8, 0xb0, 0xa7, 0x5, + 0xd1, 0xa, 0x72, 0xe2, 0x0, 0xa7, 0xdc, 0x0, + 0xa, 0xf8, 0xc5, 0x0, 0xab, 0x3, 0xe0, 0xa, + 0x70, 0xa, 0x80, 0xa7, 0x0, 0x1f, 0x20, + + /* U+006C "l" */ + 0xa7, 0xa, 0x70, 0xa7, 0xa, 0x70, 0xa7, 0xa, + 0x70, 0xa7, 0xa, 0x70, 0xa7, 0xa, 0x80, 0x5e, + 0x20, + + /* U+006D "m" */ + 0xa4, 0x8e, 0xc3, 0x2b, 0xfa, 0xa, 0xe6, 0x19, + 0xdb, 0x32, 0xd6, 0xa8, 0x0, 0x2f, 0x10, 0x8, + 0x9a, 0x70, 0x1, 0xf0, 0x0, 0x7a, 0xa7, 0x0, + 0x1f, 0x0, 0x7, 0xaa, 0x70, 0x1, 0xf0, 0x0, + 0x7a, 0xa7, 0x0, 0x1f, 0x0, 0x7, 0xaa, 0x70, + 0x1, 0xf0, 0x0, 0x7a, + + /* U+006E "n" */ + 0xa4, 0x8d, 0xe5, 0xa, 0xe6, 0x16, 0xf0, 0xa8, + 0x0, 0xf, 0x3a, 0x70, 0x0, 0xe4, 0xa7, 0x0, + 0xd, 0x4a, 0x70, 0x0, 0xd4, 0xa7, 0x0, 0xd, + 0x4a, 0x70, 0x0, 0xd4, + + /* U+006F "o" */ + 0x0, 0x7d, 0xea, 0x10, 0x7, 0xd2, 0x18, 0xd0, + 0xf, 0x30, 0x0, 0xc6, 0x2f, 0x0, 0x0, 0x89, + 0x2f, 0x0, 0x0, 0x89, 0xf, 0x30, 0x0, 0xc6, + 0x7, 0xd2, 0x7, 0xe0, 0x0, 0x7d, 0xea, 0x10, + + /* U+0070 "p" */ + 0xa5, 0x9e, 0xd6, 0xa, 0xe5, 0x4, 0xe4, 0xa7, + 0x0, 0x8, 0xaa, 0x70, 0x0, 0x5c, 0xa7, 0x0, + 0x6, 0xca, 0x70, 0x0, 0xa9, 0xad, 0x30, 0x6f, + 0x2a, 0x9b, 0xfc, 0x30, 0xa7, 0x0, 0x0, 0xa, + 0x70, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x7d, 0xe9, 0xb4, 0x7, 0xd3, 0x6, 0xf4, + 0xf, 0x40, 0x0, 0xd4, 0x2f, 0x0, 0x0, 0xd4, + 0x3f, 0x0, 0x0, 0xd4, 0xf, 0x30, 0x0, 0xd4, + 0xa, 0xc2, 0x18, 0xf4, 0x0, 0x9e, 0xd6, 0xc4, + 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0xd4, + 0x0, 0x0, 0x0, 0xd4, + + /* U+0072 "r" */ + 0xa4, 0x8f, 0x3a, 0xc7, 0x20, 0xaa, 0x0, 0xa, + 0x70, 0x0, 0xa7, 0x0, 0xa, 0x70, 0x0, 0xa7, + 0x0, 0xa, 0x70, 0x0, + + /* U+0073 "s" */ + 0x4, 0xde, 0xc4, 0xf, 0x50, 0x33, 0xf, 0x20, + 0x0, 0x6, 0xe9, 0x20, 0x0, 0x18, 0xe6, 0x0, + 0x0, 0x4e, 0x38, 0x10, 0x8c, 0x8, 0xde, 0xb2, + + /* U+0074 "t" */ + 0x5, 0xa0, 0x0, 0x6a, 0x0, 0x9f, 0xff, 0xb0, + 0x7a, 0x0, 0x7, 0xa0, 0x0, 0x7a, 0x0, 0x7, + 0xa0, 0x0, 0x7b, 0x0, 0x4, 0xe2, 0x10, 0xa, + 0xfb, + + /* U+0075 "u" */ + 0xc5, 0x0, 0xf, 0x1c, 0x50, 0x0, 0xf1, 0xc5, + 0x0, 0xf, 0x1c, 0x50, 0x0, 0xf1, 0xc5, 0x0, + 0xf, 0x1b, 0x60, 0x1, 0xf1, 0x8c, 0x13, 0xbf, + 0x11, 0xbf, 0xb2, 0xd1, + + /* U+0076 "v" */ + 0xa8, 0x0, 0x4, 0xc4, 0xd0, 0x0, 0x97, 0xe, + 0x20, 0xe, 0x20, 0x97, 0x4, 0xc0, 0x4, 0xc0, + 0x97, 0x0, 0xe, 0x1e, 0x10, 0x0, 0x99, 0xc0, + 0x0, 0x3, 0xf6, 0x0, + + /* U+0077 "w" */ + 0x7a, 0x0, 0x2f, 0x40, 0x8, 0x93, 0xe0, 0x6, + 0xc8, 0x0, 0xc5, 0xf, 0x20, 0xa5, 0xc0, 0xf, + 0x10, 0xb6, 0xd, 0xe, 0x3, 0xc0, 0x6, 0xa2, + 0xb0, 0xa4, 0x78, 0x0, 0x2e, 0x67, 0x6, 0x8b, + 0x40, 0x0, 0xeb, 0x30, 0x2c, 0xe0, 0x0, 0x9, + 0xf0, 0x0, 0xec, 0x0, + + /* U+0078 "x" */ + 0x4e, 0x0, 0x1e, 0x20, 0xb8, 0x9, 0x80, 0x1, + 0xe4, 0xd0, 0x0, 0x7, 0xf5, 0x0, 0x0, 0xae, + 0x60, 0x0, 0x4c, 0x2e, 0x10, 0xd, 0x30, 0x8a, + 0x7, 0xa0, 0x0, 0xe4, + + /* U+0079 "y" */ + 0x98, 0x0, 0x4, 0xc3, 0xe0, 0x0, 0xa7, 0xd, + 0x40, 0xe, 0x20, 0x6a, 0x4, 0xc0, 0x1, 0xe0, + 0x96, 0x0, 0xa, 0x6e, 0x10, 0x0, 0x3d, 0xb0, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x1e, 0x10, 0x0, + 0x1b, 0x70, 0x0, 0x5f, 0xa0, 0x0, 0x0, + + /* U+007A "z" */ + 0x1f, 0xff, 0xff, 0x0, 0x0, 0xc, 0x70, 0x0, + 0x6, 0xc0, 0x0, 0x1, 0xe3, 0x0, 0x0, 0xb8, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x1e, 0x40, 0x0, + 0x7, 0xff, 0xff, 0xf2, + + /* U+007B "{" */ + 0x0, 0xac, 0x20, 0x3c, 0x0, 0x3, 0xa0, 0x0, + 0x3b, 0x0, 0x2, 0xc0, 0x0, 0x5a, 0x0, 0x5f, + 0x20, 0x0, 0x69, 0x0, 0x2, 0xb0, 0x0, 0x2b, + 0x0, 0x3, 0xb0, 0x0, 0x4b, 0x0, 0x2, 0xd0, + 0x0, 0x8, 0xb1, + + /* U+007C "|" */ + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + + /* U+007D "}" */ + 0x6c, 0x60, 0x0, 0x2d, 0x0, 0x0, 0xd0, 0x0, + 0x1d, 0x0, 0x1, 0xc0, 0x0, 0xe, 0x0, 0x0, + 0x8e, 0x10, 0xe, 0x10, 0x1, 0xc0, 0x0, 0x1c, + 0x0, 0x1, 0xd0, 0x0, 0x1d, 0x0, 0x4, 0xc0, + 0x5, 0xc4, 0x0, + + /* U+007E "~" */ + 0x9, 0xd9, 0x30, 0x50, 0x14, 0x5, 0xcd, 0x60, + + /* U+3001 "、" */ + 0x0, 0x0, 0x0, 0xd4, 0x0, 0x5, 0xf4, 0x0, + 0x4, 0xf4, 0x0, 0x5, 0x30, + + /* U+3002 "。" */ + 0x4, 0x94, 0x4, 0xa2, 0x94, 0x82, 0x1, 0x96, + 0x60, 0x57, 0xa, 0xba, 0x0, + + /* U+3005 "々" */ + 0x0, 0x0, 0x39, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xee, 0xee, 0xf7, 0x0, 0x1e, + 0x20, 0x0, 0xe, 0x20, 0xa, 0x80, 0x0, 0x7, + 0xa0, 0x6, 0xd0, 0x0, 0x1, 0xe2, 0x3, 0xe1, + 0x2d, 0x40, 0xa7, 0x0, 0x1, 0x0, 0x3d, 0xdd, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, + + /* U+300C "「" */ + 0xed, 0xdd, 0x6e, 0x0, 0x0, 0xe0, 0x0, 0xe, + 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0xe0, + 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, + + /* U+300D "」" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, + 0x0, 0xe, 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, + 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0xe6, 0xdd, + 0xde, + + /* U+3041 "ぁ" */ + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x6, 0x70, + 0x2, 0x10, 0x2c, 0xbd, 0xdd, 0xdb, 0x40, 0x0, + 0xa, 0x30, 0x34, 0x0, 0x0, 0xb, 0xbb, 0xeb, + 0x20, 0x0, 0x9e, 0x31, 0xc3, 0xd2, 0xb, 0x4a, + 0x29, 0x40, 0x69, 0x57, 0x8, 0xaa, 0x0, 0x59, + 0x85, 0xa, 0xc0, 0x0, 0xc4, 0x3c, 0xc8, 0x82, + 0x7d, 0x70, 0x0, 0x0, 0x3, 0x61, 0x0, + + /* U+3042 "あ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x2, 0x11, 0x78, 0x34, + 0x69, 0x40, 0x8, 0xcc, 0xec, 0xa9, 0x75, 0x10, + 0x0, 0x0, 0x93, 0x0, 0x92, 0x0, 0x0, 0x0, + 0xcc, 0xdd, 0xfa, 0x20, 0x0, 0x2c, 0xe4, 0x8, + 0x64, 0xd2, 0x2, 0xd4, 0xb2, 0x1d, 0x0, 0x5a, + 0xb, 0x40, 0x94, 0xb5, 0x0, 0x3c, 0x1d, 0x0, + 0x7e, 0x70, 0x0, 0x6a, 0x1d, 0x14, 0xdb, 0x0, + 0x2, 0xe2, 0x8, 0xda, 0x5a, 0x5, 0x9e, 0x40, + 0x0, 0x0, 0x0, 0x8, 0x50, 0x0, + + /* U+3043 "ぃ" */ + 0x1, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, + 0x8, 0x10, 0x3b, 0x0, 0x0, 0x7, 0x90, 0x3b, + 0x0, 0x0, 0x0, 0xe1, 0x2c, 0x0, 0x0, 0x0, + 0x96, 0xe, 0x0, 0x0, 0x0, 0x5a, 0xd, 0x10, + 0x76, 0x0, 0x2d, 0x8, 0x90, 0xd2, 0x0, 0x4, + 0x1, 0xdf, 0x80, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, + + /* U+3044 "い" */ + 0x1b, 0x0, 0x0, 0x0, 0x2, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0xb, 0x60, 0xf, 0x0, 0x0, 0x0, 0x4, 0xd0, + 0xf, 0x0, 0x0, 0x0, 0x0, 0xe2, 0xe, 0x10, + 0x0, 0x0, 0x0, 0xb5, 0xb, 0x40, 0x5, 0x30, + 0x0, 0x79, 0x7, 0x90, 0xc, 0x50, 0x0, 0x49, + 0x1, 0xf5, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+3046 "う" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0xa8, + 0x76, 0x0, 0x0, 0x2, 0x46, 0x79, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x48, 0xac, 0xb6, + 0x0, 0x7f, 0xa6, 0x42, 0x4c, 0x90, 0x10, 0x0, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xe2, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0xc, 0x80, 0x0, 0x0, 0x4, 0xca, 0x0, 0x0, + 0x4a, 0xed, 0x40, 0x0, 0x0, 0x15, 0x10, 0x0, + 0x0, + + /* U+3047 "ぇ" */ + 0x0, 0x1a, 0x75, 0x31, 0x0, 0x0, 0x3, 0x58, + 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xbc, 0xdd, 0xf7, 0x0, 0x1, 0x21, 0xa, 0x80, + 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x9, + 0xdd, 0x10, 0x0, 0x0, 0x98, 0x8, 0x60, 0x0, + 0x9, 0xa0, 0x3, 0xd3, 0x34, 0x18, 0x0, 0x0, + 0x6b, 0xa7, + + /* U+3048 "え" */ + 0x0, 0x8, 0x96, 0x42, 0x0, 0x0, 0x0, 0x2, + 0x57, 0xac, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x45, 0x60, 0x0, + 0x6, 0xfd, 0xcb, 0xaf, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xae, 0xb0, 0x0, 0x0, + 0x0, 0xa, 0x70, 0xa6, 0x0, 0x0, 0x0, 0xa8, + 0x0, 0x5b, 0x0, 0x0, 0xa, 0xa0, 0x0, 0xe, + 0x64, 0x55, 0x8, 0x0, 0x0, 0x3, 0x9b, 0xa5, + + /* U+304A "お" */ + 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x0, 0x30, 0x81, 0x0, 0xa, 0xbb, 0xfd, + 0xc8, 0x5, 0xe6, 0x0, 0x23, 0x3e, 0x0, 0x0, + 0x1, 0xc2, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x7b, 0xdc, 0x81, 0x0, 0x0, + 0x2b, 0xf6, 0x20, 0x28, 0xc0, 0x0, 0x6c, 0x3e, + 0x0, 0x0, 0xd, 0x20, 0x1d, 0x0, 0xe0, 0x0, + 0x0, 0xe1, 0x1, 0xe3, 0xe, 0x0, 0x3, 0xbb, + 0x0, 0x4, 0xdf, 0xb0, 0x5e, 0xe8, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+304B "か" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x79, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x97, + 0x11, 0x0, 0xd4, 0x0, 0xc, 0xdd, 0xfd, 0xce, + 0xa0, 0x3d, 0x0, 0x3, 0x11, 0xe0, 0x0, 0xe2, + 0xb, 0x50, 0x0, 0x5, 0xa0, 0x0, 0xc3, 0x4, + 0xd0, 0x0, 0xa, 0x50, 0x0, 0xd2, 0x0, 0xb1, + 0x0, 0x1e, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x8, 0x90, 0x0, 0x0, 0x8, 0x80, 0x4e, + 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, + + /* U+304C "が" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x80, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x85, 0xa3, 0x0, 0x0, + 0x79, 0x0, 0x0, 0x1a, 0x12, 0x0, 0x0, 0x97, + 0x10, 0x0, 0xe2, 0x0, 0xc, 0xcd, 0xfe, 0xdf, + 0x90, 0x5b, 0x0, 0x3, 0x21, 0xe0, 0x0, 0xe1, + 0xc, 0x40, 0x0, 0x5, 0xa0, 0x0, 0xc3, 0x5, + 0xc0, 0x0, 0xa, 0x50, 0x0, 0xd1, 0x0, 0xd1, + 0x0, 0x1e, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x1, 0xe1, + 0x0, 0x7, 0x90, 0x0, 0x0, 0x9, 0x80, 0x4d, + 0xde, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, 0x0, 0x0, + + /* U+304D "き" */ + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x1, 0x43, 0x22, + 0xe6, 0x8c, 0x20, 0x29, 0xab, 0xbd, 0xc6, 0x20, + 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x45, 0x44, + 0x45, 0xe8, 0xbe, 0x4, 0x89, 0x99, 0x89, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x20, 0x0, 0x81, + 0x0, 0x49, 0xbc, 0x0, 0x2d, 0x0, 0x0, 0x35, + 0x50, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xa4, 0x22, 0x35, 0x10, 0x0, 0x6, 0xac, 0xcb, + 0x92, 0x0, + + /* U+304E "ぎ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + 0x0, 0xa4, 0x0, 0xb3, 0xb0, 0x5, 0x32, 0x29, + 0xa7, 0xa8, 0x85, 0x10, 0x9a, 0xbb, 0xbf, 0x73, + 0x1, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x1, 0x54, 0x33, 0x4b, 0xaa, 0xd5, 0x0, 0x29, + 0x9a, 0xa9, 0x8f, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x0, 0x4, 0x30, 0x1, 0x87, + 0xe2, 0x0, 0x0, 0xc3, 0x0, 0x4, 0x68, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x30, 0x0, 0x12, 0x0, 0x0, 0x0, 0x7c, + 0xef, 0xed, 0x70, 0x0, 0x0, + + /* U+304F "く" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x70, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x1d, + 0x80, 0x0, 0x0, 0x3e, 0x50, 0x0, 0x0, 0x5e, + 0x30, 0x0, 0x0, 0xf, 0x40, 0x0, 0x0, 0x0, + 0x9c, 0x10, 0x0, 0x0, 0x0, 0x8e, 0x30, 0x0, + 0x0, 0x0, 0x5e, 0x40, 0x0, 0x0, 0x0, 0x4e, + 0x60, 0x0, 0x0, 0x0, 0x3e, 0x70, 0x0, 0x0, + 0x0, 0x39, 0x0, + + /* U+3050 "ぐ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xd4, 0x0, 0x0, 0x0, 0x1d, 0x80, 0x0, 0x0, + 0x3, 0xe6, 0x0, 0x50, 0x0, 0x6e, 0x30, 0x72, + 0xa3, 0x8, 0xd1, 0x0, 0x2b, 0x16, 0x2f, 0x10, + 0x0, 0x3, 0x0, 0xb, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xac, 0x10, 0x0, 0x0, 0x0, 0x8, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0x40, 0x0, 0x0, + 0x0, 0x5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x57, + 0x0, + + /* U+3051 "け" */ + 0x7, 0x70, 0x0, 0x0, 0x5b, 0x0, 0x0, 0xa5, + 0x0, 0x0, 0x4, 0xb0, 0x0, 0xd, 0x20, 0x0, + 0x0, 0x4b, 0x24, 0x0, 0xe0, 0x4, 0xff, 0xef, + 0xfd, 0xb0, 0xd, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x1, 0xd0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x1c, + 0x21, 0x0, 0x0, 0x4a, 0x0, 0x0, 0xe8, 0x10, + 0x0, 0x6, 0x80, 0x0, 0xe, 0xb0, 0x0, 0x0, + 0xb5, 0x0, 0x0, 0xc8, 0x0, 0x0, 0x4d, 0x0, + 0x0, 0x8, 0x60, 0x0, 0x7e, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, + + /* U+3052 "げ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0x0, 0xb2, + 0x0, 0x0, 0xc, 0x4a, 0x73, 0xf, 0x0, 0x0, + 0x0, 0xc3, 0x91, 0x22, 0xc0, 0x0, 0x0, 0xc, + 0x31, 0x20, 0x4a, 0x0, 0xae, 0xdd, 0xff, 0xe8, + 0x6, 0x80, 0x0, 0x11, 0x1b, 0x30, 0x0, 0x77, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x7, 0x73, 0x0, + 0x0, 0xc, 0x20, 0x0, 0x68, 0xa0, 0x0, 0x0, + 0xe0, 0x0, 0x5, 0xd7, 0x0, 0x0, 0x2d, 0x0, + 0x0, 0x3f, 0x30, 0x0, 0xb, 0x60, 0x0, 0x0, + 0xe0, 0x0, 0x1b, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x80, 0x0, 0x0, 0x0, + + /* U+3053 "こ" */ + 0xd, 0xed, 0xdd, 0xde, 0x80, 0x0, 0x12, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0x30, 0x0, 0x0, 0x22, 0x7, 0xdf, 0xee, + 0xff, 0xd5, 0x0, 0x0, 0x21, 0x0, 0x0, + + /* U+3054 "ご" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x83, 0xc1, 0x5, 0x43, 0x33, 0x45, + 0x5b, 0x34, 0x9, 0xbc, 0xcc, 0xba, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x96, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8c, 0x10, 0x0, 0x0, + 0x11, 0x0, 0x9, 0xfd, 0xcc, 0xde, 0xf5, 0x0, + 0x0, 0x2, 0x33, 0x21, 0x0, 0x0, + + /* U+3055 "さ" */ + 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x96, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, 0x47, + 0x9, 0xec, 0xcc, 0xdf, 0xeb, 0x70, 0x1, 0x12, + 0x21, 0x87, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x62, + 0x0, 0x49, 0x9f, 0x20, 0xe, 0x0, 0x1, 0x46, + 0x81, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x64, 0x34, + 0x55, 0x0, 0x0, 0x39, 0xbb, 0xb9, 0x50, 0x0, + + /* U+3056 "ざ" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x80, 0x0, 0x0, + 0x8, 0x30, 0x67, 0x85, 0x0, 0x0, 0x7, 0x80, + 0xa, 0x13, 0x45, 0x43, 0x36, 0xd8, 0xbe, 0x10, + 0x69, 0xab, 0xaa, 0xd9, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x30, 0x0, 0x2, 0x0, 0x2, 0x46, 0xc0, 0x0, + 0xe, 0x20, 0x3, 0x9a, 0xc2, 0x0, 0x2c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xb5, 0x22, 0x34, 0x40, 0x0, + 0x0, 0x5a, 0xcc, 0xca, 0x50, 0x0, + + /* U+3057 "し" */ + 0xc6, 0x0, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0x0, 0xb1, 0xb4, 0x0, 0x0, + 0xb, 0xb0, 0x7d, 0x30, 0x26, 0xda, 0x0, 0x7, + 0xdf, 0xda, 0x40, 0x0, + + /* U+3058 "じ" */ + 0x82, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x12, + 0x76, 0x0, 0xd2, 0x0, 0x2c, 0xd, 0x10, 0xe1, + 0x0, 0x9, 0x53, 0x10, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xf0, 0x0, 0x0, 0x0, 0x90, 0xe2, 0x0, 0x0, + 0x1b, 0xa0, 0xab, 0x20, 0x26, 0xe9, 0x0, 0x9, + 0xef, 0xda, 0x30, 0x0, + + /* U+3059 "す" */ + 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x5d, 0xee, 0xdd, + 0xef, 0xdd, 0xee, 0x30, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x9d, 0xee, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0x3, 0xf0, 0x0, 0x0, 0x0, + 0xa, 0x50, 0xf, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0x16, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0xac, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x6a, 0x20, 0x0, 0x0, 0x0, + + /* U+305A "ず" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, + 0x0, 0x0, 0xf1, 0x58, 0x76, 0x0, 0x0, 0x0, + 0xe, 0x10, 0xa1, 0x42, 0xde, 0xee, 0xee, 0xfe, + 0xee, 0xe6, 0x1, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xbc, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xd5, 0x1d, 0x20, 0x0, 0x0, 0x0, 0x1e, + 0x0, 0xa6, 0x0, 0x0, 0x0, 0x0, 0xe5, 0x1e, + 0x70, 0x0, 0x0, 0x0, 0x3, 0xbb, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xbd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xa7, 0x0, 0x0, 0x0, 0x0, + + /* U+305B "せ" */ + 0x0, 0x0, 0x50, 0x0, 0x8, 0x40, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x9, 0x40, 0x0, 0x1, 0x3e, 0x57, 0x8a, + 0xed, 0xee, 0x1f, 0xdb, 0xf8, 0x65, 0x3b, 0x40, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xe0, 0x1, 0xd, 0x10, 0x0, 0x0, 0xe, + 0x0, 0x8d, 0xb0, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xed, 0xde, 0xf6, 0x0, + 0x0, 0x0, 0x1, 0x21, 0x10, 0x0, + + /* U+305C "ぜ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x4, 0x10, 0x0, 0x2a, 0x53, 0xb0, 0x0, 0xc, + 0x30, 0x0, 0x2c, 0x19, 0x72, 0x0, 0xc, 0x30, + 0x0, 0x2b, 0x2, 0x0, 0x0, 0x1c, 0x76, 0x79, + 0xbe, 0xcd, 0x50, 0xcf, 0xdf, 0xb8, 0x75, 0x6b, + 0x11, 0x0, 0x10, 0xc, 0x20, 0x0, 0x3a, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0x59, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x4d, 0xe5, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xde, + 0xcc, 0xde, 0xd0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x21, 0x0, 0x0, + + /* U+305D "そ" */ + 0x0, 0x2, 0x23, 0x34, 0x60, 0x0, 0x0, 0x3c, + 0xba, 0x9d, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0x10, 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, + 0x0, 0x2, 0xc7, 0x0, 0x1, 0x10, 0x26, 0x8e, + 0xec, 0xee, 0xcc, 0xc3, 0x48, 0x64, 0x3b, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x94, + 0x41, 0x0, 0x0, 0x0, 0x2, 0x7a, 0xb3, 0x0, + + /* U+305E "ぞ" */ + 0x0, 0x59, 0x9a, 0xbc, 0xc0, 0x0, 0x0, 0x34, + 0x43, 0x4e, 0x60, 0x70, 0x0, 0x0, 0x2, 0xd4, + 0x1a, 0x58, 0x0, 0x0, 0x3d, 0x30, 0xa, 0x35, + 0x0, 0x5, 0xd2, 0x0, 0x2, 0x20, 0x47, 0xaf, + 0xdd, 0xed, 0xcb, 0xc0, 0x67, 0x53, 0x4b, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x84, + 0x40, 0x0, 0x0, 0x0, 0x3, 0x9b, 0xb0, 0x0, + + /* U+305F "た" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x90, 0x20, + 0x0, 0x0, 0x8a, 0xad, 0xee, 0xd2, 0x0, 0x0, + 0x34, 0x4e, 0x30, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0x0, 0x8c, 0xcc, 0xc5, 0x0, 0x6a, 0x0, 0x22, + 0x11, 0x21, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf1, 0x3, 0x30, 0x0, 0x0, 0x5, 0xb0, + 0x8, 0x60, 0x0, 0x0, 0xc, 0x60, 0x8, 0x90, + 0x0, 0x0, 0x3f, 0x0, 0x1, 0xbe, 0xdd, 0xfa, + 0x3, 0x0, 0x0, 0x0, 0x11, 0x0, + + /* U+3060 "だ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x45, 0x60, 0x0, 0x9, 0x60, + 0x20, 0xb, 0x2c, 0x19, 0x99, 0xed, 0xed, 0x0, + 0x25, 0x0, 0x55, 0x6f, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0x9, 0xbc, 0xbb, 0x0, 0x0, + 0x97, 0x0, 0x33, 0x22, 0x30, 0x0, 0xe, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xd0, 0x3, 0x10, + 0x0, 0x0, 0x0, 0x88, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xe, 0x30, 0xb, 0x50, 0x0, 0x0, 0x6, + 0xd0, 0x0, 0x3d, 0xdb, 0xde, 0x40, 0x23, 0x0, + 0x0, 0x2, 0x32, 0x10, 0x0, + + /* U+3061 "ち" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x80, 0x13, 0x58, + 0x5, 0xee, 0xfe, 0xdc, 0xb9, 0x60, 0x0, 0xc, + 0x20, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x29, 0xbd, 0xb5, 0x0, 0xb, + 0xdb, 0x52, 0x3, 0xd6, 0x1, 0xf6, 0x0, 0x0, + 0x4, 0xc0, 0x2, 0x0, 0x0, 0x0, 0x4c, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x50, 0x0, 0x48, 0x89, + 0xce, 0x50, 0x0, 0x2, 0x66, 0x63, 0x0, 0x0, + + /* U+3063 "っ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xad, + 0xed, 0x60, 0x6d, 0xd7, 0x30, 0x1, 0xc6, 0x22, + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0x5c, 0xa0, 0x0, 0x8, 0xde, 0xb4, 0x0, + 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+3064 "つ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8b, 0xee, 0xea, 0x20, 0x49, 0xec, 0x73, 0x0, + 0x7, 0xe1, 0x78, 0x20, 0x0, 0x0, 0x0, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7a, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x80, + 0x0, 0x0, 0x34, 0x7c, 0xe7, 0x0, 0x0, 0x0, + 0xdb, 0x95, 0x0, 0x0, + + /* U+3065 "づ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x95, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0x80, 0x0, 0x0, 0x15, + 0x9b, 0xb9, 0x41, 0x0, 0x3, 0x7c, 0xd9, 0x53, + 0x26, 0xe6, 0x0, 0x1e, 0x93, 0x0, 0x0, 0x0, + 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xe4, 0x0, 0x0, 0x0, + 0x2, 0x47, 0xdd, 0x30, 0x0, 0x0, 0x0, 0x7e, + 0xc9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+3066 "て" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x35, 0x68, + 0x9b, 0xce, 0xff, 0xe3, 0xaa, 0x86, 0x43, 0xb9, + 0x10, 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x96, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+3067 "で" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x56, + 0x89, 0xbc, 0xdf, 0xf3, 0xbb, 0x97, 0x54, 0xbb, + 0x30, 0x0, 0x0, 0x0, 0x9, 0x90, 0x1, 0x81, + 0x0, 0x0, 0x2d, 0x0, 0x2b, 0x3a, 0x0, 0x0, + 0x86, 0x0, 0x7, 0x22, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + + /* U+3068 "と" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x0, + 0x0, 0x0, 0x3, 0xd0, 0x0, 0x0, 0x30, 0x0, + 0xc5, 0x0, 0x2a, 0xd1, 0x0, 0x4c, 0x19, 0xd6, + 0x0, 0x0, 0xd, 0xe7, 0x0, 0x0, 0x0, 0xab, + 0x10, 0x0, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x91, 0x0, 0x0, 0x13, 0x1, + 0x9e, 0xed, 0xef, 0xfa, 0x0, 0x0, 0x12, 0x10, + 0x0, + + /* U+3069 "ど" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, + 0x0, 0x0, 0x32, 0xb1, 0xa, 0x70, 0x0, 0x0, + 0x2b, 0x48, 0x3, 0xe0, 0x0, 0x2, 0x56, 0x0, + 0x0, 0xb5, 0x1, 0x9d, 0x50, 0x0, 0x0, 0x3d, + 0x8d, 0x60, 0x0, 0x0, 0x0, 0x3f, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xd7, 0x44, 0x56, 0x86, 0x0, + 0x0, 0x49, 0xbb, 0xba, 0x84, 0x0, + + /* U+306A "な" */ + 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, + 0x61, 0x1, 0x0, 0x5, 0xee, 0xee, 0xb7, 0x14, + 0xe6, 0x0, 0x0, 0xa, 0x50, 0x0, 0x1, 0xbb, + 0x0, 0x1, 0xe0, 0x0, 0x15, 0x0, 0x50, 0x0, + 0x88, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x1e, 0x10, + 0x0, 0x1c, 0x0, 0x0, 0x9, 0x90, 0x0, 0x11, + 0xd0, 0x0, 0x2, 0xe1, 0x6, 0xdb, 0xdf, 0x50, + 0x0, 0x0, 0x1, 0xe0, 0x0, 0xeb, 0xd2, 0x0, + 0x0, 0x1e, 0x20, 0x5c, 0x7, 0x70, 0x0, 0x0, + 0x6c, 0xed, 0x30, 0x0, 0x0, + + /* U+306B "に" */ + 0x4, 0x40, 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, + 0x3, 0x43, 0x33, 0x40, 0xb, 0x30, 0x5, 0xbb, + 0xbb, 0xa1, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0x91, 0xa, 0x0, 0x0, 0x0, + 0x1d, 0xb0, 0x3b, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x1e, 0x62, 0x24, 0x64, 0xd, 0x30, 0x3, 0xac, + 0xdc, 0xb5, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+306C "ぬ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x7, 0x0, 0x0, + 0xf0, 0x0, 0x0, 0x0, 0xc3, 0x7, 0xcf, 0xdc, + 0x40, 0x0, 0x7, 0xac, 0x65, 0xa0, 0x2c, 0x50, + 0x0, 0x5f, 0x10, 0x77, 0x0, 0x2e, 0x0, 0xd, + 0xb5, 0xc, 0x30, 0x0, 0xc2, 0x7, 0x73, 0xd3, + 0xd0, 0x0, 0xc, 0x20, 0xb2, 0xa, 0xe6, 0x29, + 0x95, 0xe0, 0xd, 0x10, 0x7c, 0xd, 0x43, 0x9f, + 0x20, 0x99, 0x9d, 0x10, 0xe0, 0x1b, 0x9d, 0x11, + 0x87, 0x10, 0x7, 0xdd, 0x70, 0x40, + + /* U+306D "ね" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x40, + 0x0, 0x0, 0x0, 0x4, 0x79, 0xf8, 0x7, 0xdd, + 0xc1, 0x0, 0x57, 0x4f, 0x4c, 0x60, 0x6, 0xb0, + 0x0, 0x1, 0xfd, 0x20, 0x0, 0xe, 0x10, 0x0, + 0xaf, 0x10, 0x0, 0x0, 0xc3, 0x0, 0x4d, 0xe0, + 0x0, 0x0, 0xc, 0x20, 0x1e, 0x3e, 0x0, 0x3b, + 0xb7, 0xe1, 0xb, 0x70, 0xe0, 0xe, 0x30, 0x4f, + 0x70, 0x50, 0xe, 0x0, 0xe1, 0x7, 0x9c, 0x60, + 0x0, 0xf0, 0x6, 0xcd, 0x90, 0x1, 0x0, 0x8, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+306E "の" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xad, 0xfd, 0x91, 0x0, 0x0, 0x9b, 0x46, 0xa1, + 0x5e, 0x40, 0x8, 0x90, 0x9, 0x70, 0x2, 0xe1, + 0x3d, 0x0, 0xc, 0x40, 0x0, 0x97, 0x77, 0x0, + 0xf, 0x10, 0x0, 0x5a, 0xa4, 0x0, 0x5c, 0x0, + 0x0, 0x5a, 0x95, 0x0, 0xb6, 0x0, 0x0, 0x97, + 0x5c, 0x5, 0xe0, 0x0, 0x2, 0xe2, 0xb, 0xff, + 0x30, 0x0, 0x5e, 0x60, 0x0, 0x31, 0x0, 0x9e, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, + + /* U+306F "は" */ + 0x5, 0x40, 0x0, 0x0, 0x82, 0x0, 0x0, 0xa5, + 0x0, 0x0, 0xc, 0x30, 0x0, 0xc, 0x20, 0x0, + 0x0, 0xc4, 0x33, 0x0, 0xe0, 0x7, 0xee, 0xef, + 0xdb, 0x60, 0xd, 0x0, 0x0, 0x0, 0xb2, 0x0, + 0x1, 0xb0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x3, 0xb9, 0x0, + 0x6a, 0xbd, 0x60, 0x0, 0x2d, 0xa0, 0x6a, 0x11, + 0xae, 0xb1, 0x0, 0xf5, 0x9, 0x70, 0xc, 0x47, + 0xd0, 0xd, 0x20, 0x2d, 0xdd, 0xc0, 0x1, 0x0, + 0x20, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+3070 "ば" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x80, + 0x0, 0x0, 0x9, 0x28, 0x92, 0xe, 0x0, 0x0, + 0x0, 0xf0, 0xb3, 0x43, 0xb0, 0x0, 0x0, 0xf, + 0x14, 0x20, 0x59, 0x0, 0xae, 0xee, 0xfd, 0xb4, + 0x7, 0x60, 0x0, 0x0, 0xf, 0x0, 0x0, 0x85, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xa5, 0x90, 0x6, 0x99, + 0xe2, 0x0, 0x9, 0xb5, 0xa, 0x82, 0x3d, 0xe6, + 0x0, 0x8f, 0x10, 0xe0, 0x0, 0xe5, 0xe8, 0x6, + 0xc0, 0xc, 0x83, 0x6e, 0x2, 0x60, 0x29, 0x0, + 0x18, 0xba, 0x20, 0x0, 0x0, + + /* U+3071 "ぱ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x99, 0x20, 0x80, + 0x0, 0x0, 0x9, 0x36, 0x8, 0xe, 0x0, 0x0, + 0x0, 0xf0, 0xa9, 0x43, 0xb0, 0x0, 0x0, 0xf, + 0x13, 0x30, 0x59, 0x0, 0xae, 0xee, 0xfd, 0xb4, + 0x7, 0x60, 0x0, 0x0, 0xf, 0x0, 0x0, 0x85, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x9, 0x40, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xa5, 0x90, 0x6, 0x99, + 0xe2, 0x0, 0x9, 0xb5, 0xa, 0x82, 0x3d, 0xe6, + 0x0, 0x8f, 0x10, 0xe0, 0x0, 0xe5, 0xe8, 0x6, + 0xc0, 0xc, 0x83, 0x6e, 0x2, 0x60, 0x29, 0x0, + 0x18, 0xba, 0x20, 0x0, 0x0, + + /* U+3072 "ひ" */ + 0x13, 0x46, 0x9b, 0x0, 0x85, 0x0, 0x5, 0xb9, + 0xad, 0x20, 0x6, 0x90, 0x0, 0x0, 0x1d, 0x20, + 0x0, 0x5e, 0x0, 0x0, 0x9, 0x60, 0x0, 0x4, + 0xf5, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x3a, 0xd1, + 0x0, 0x78, 0x0, 0x0, 0x4, 0x85, 0xc0, 0xa, + 0x50, 0x0, 0x0, 0x78, 0x7, 0x0, 0xb4, 0x0, + 0x0, 0xa, 0x40, 0x0, 0x9, 0x70, 0x0, 0x2, + 0xe0, 0x0, 0x0, 0x2e, 0x61, 0x15, 0xe3, 0x0, + 0x0, 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x0, 0x0, + + /* U+3073 "び" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x34, 0xa1, 0x23, 0x57, 0xa8, + 0x0, 0xb1, 0xb3, 0x68, 0xb9, 0xca, 0x10, 0xa, + 0x53, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x9a, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x8, 0xf2, 0x0, 0x5, + 0x90, 0x0, 0x0, 0x79, 0xa0, 0x0, 0xb3, 0x0, + 0x0, 0x8, 0x4a, 0x80, 0xe, 0x10, 0x0, 0x0, + 0xb4, 0x7, 0x0, 0xf0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x6d, 0x30, 0x17, 0xd1, 0x0, 0x0, 0x0, 0x6d, + 0xfe, 0xa2, 0x0, 0x0, 0x0, + + /* U+3074 "ぴ" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x99, 0x32, 0x45, + 0x79, 0x60, 0xa, 0x63, 0x18, 0x79, 0x7d, 0x80, + 0x0, 0xd2, 0x78, 0x10, 0x5, 0xb0, 0x0, 0xc, + 0x70, 0x0, 0x0, 0xd1, 0x0, 0x0, 0xae, 0x0, + 0x0, 0x69, 0x0, 0x0, 0x9, 0x89, 0x0, 0xc, + 0x30, 0x0, 0x0, 0xa1, 0xb8, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x1, 0x60, 0xf, 0x0, 0x0, 0x1, + 0xc0, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x87, 0x0, + 0x0, 0x6, 0xd3, 0x2, 0x8b, 0x0, 0x0, 0x0, + 0x6, 0xdf, 0xe9, 0x0, 0x0, 0x0, + + /* U+3075 "ふ" */ + 0x0, 0x0, 0x9, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x6, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xd2, 0x0, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x10, 0x6a, + 0x0, 0x0, 0x8, 0x80, 0x7, 0xa0, 0xc, 0x40, + 0x1, 0xbb, 0x0, 0x0, 0xf0, 0x4, 0xd0, 0x2e, + 0x70, 0x0, 0x2, 0xf1, 0x0, 0xd3, 0x2, 0x0, + 0x8f, 0xdf, 0x80, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, + + /* U+3076 "ぶ" */ + 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbc, 0x30, 0x43, 0x80, 0x0, 0x0, + 0x0, 0x8, 0xd0, 0x94, 0xb2, 0x0, 0x0, 0x0, + 0xa, 0x20, 0x17, 0x0, 0x0, 0x0, 0x7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb0, 0x0, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa8, 0x0, 0xc4, + 0x0, 0x0, 0xb, 0x30, 0xd, 0x40, 0x2d, 0x0, + 0x2, 0xd8, 0x0, 0x5, 0xa0, 0xa, 0x70, 0x5e, + 0x60, 0x0, 0x6, 0xb0, 0x3, 0xe0, 0x22, 0x0, + 0xdc, 0xcf, 0x50, 0x0, 0x30, 0x0, 0x0, 0x2, + 0x31, 0x0, 0x0, 0x0, + + /* U+3077 "ぷ" */ + 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xd9, 0x10, 0x49, 0x90, 0x0, 0x0, + 0x0, 0x9, 0xd0, 0x90, 0x72, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x49, 0x90, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0xd3, + 0x0, 0x0, 0xb, 0x30, 0xd, 0x30, 0x3d, 0x0, + 0x2, 0xc9, 0x0, 0x6, 0xa0, 0xb, 0x50, 0x5e, + 0x60, 0x0, 0x6, 0xb0, 0x4, 0xc0, 0x22, 0x0, + 0xdc, 0xcf, 0x50, 0x0, 0x30, 0x0, 0x0, 0x2, + 0x31, 0x0, 0x0, 0x0, + + /* U+3078 "へ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd9, 0xc9, 0x0, 0x0, 0x0, 0x0, 0xa, 0x90, + 0xd, 0x70, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x1, + 0xe5, 0x0, 0x0, 0x6, 0xe1, 0x0, 0x0, 0x3e, + 0x40, 0x0, 0xc, 0x40, 0x0, 0x0, 0x4, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+3079 "べ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x1c, 0x0, 0x0, 0x0, + 0x7, 0x30, 0xb, 0x37, 0x70, 0x0, 0x0, 0xbc, + 0xe3, 0x2, 0xb0, 0x30, 0x0, 0x9, 0xa0, 0x3e, + 0x20, 0x0, 0x0, 0x0, 0x6d, 0x0, 0x5, 0xd1, + 0x0, 0x0, 0x4, 0xe2, 0x0, 0x0, 0x8c, 0x0, + 0x0, 0x1f, 0x40, 0x0, 0x0, 0xa, 0xc0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x60, + + /* U+307A "ぺ" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xba, 0x10, 0x0, + 0x0, 0x4, 0x10, 0xa, 0x2, 0x80, 0x0, 0x0, + 0x8e, 0xe2, 0xa, 0x25, 0x70, 0x0, 0x6, 0xd1, + 0x5e, 0x11, 0x87, 0x0, 0x0, 0x3e, 0x20, 0x7, + 0xd0, 0x0, 0x0, 0x2, 0xe4, 0x0, 0x0, 0x9b, + 0x0, 0x0, 0x1e, 0x70, 0x0, 0x0, 0xb, 0xb0, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0xca, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x90, + + /* U+307B "ほ" */ + 0x5, 0x50, 0x0, 0x0, 0x0, 0x10, 0x0, 0xa5, + 0x1, 0xed, 0xde, 0xdc, 0x30, 0xc, 0x20, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0xd, 0x0, 0x4c, 0xcc, 0xfd, 0xe8, + 0x1, 0xc0, 0x0, 0x11, 0x2e, 0x0, 0x0, 0x3b, + 0x10, 0x0, 0x0, 0xd0, 0x0, 0x3, 0xb9, 0x0, + 0x6a, 0xae, 0x30, 0x0, 0x2d, 0x90, 0x7a, 0x22, + 0xdd, 0xa1, 0x0, 0xf5, 0x9, 0x70, 0xe, 0x16, + 0xd0, 0xd, 0x20, 0x1b, 0xde, 0x90, 0x1, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+307C "ぼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x90, + 0x0, 0x0, 0x0, 0xa, 0x65, 0x1d, 0x0, 0x5d, + 0xdd, 0xed, 0xe2, 0x54, 0xa0, 0x0, 0x0, 0x2b, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0xb0, 0x0, + 0x8, 0x60, 0x6, 0xbb, 0xbe, 0xcd, 0x50, 0x94, + 0x0, 0x12, 0x24, 0xc1, 0x0, 0xa, 0x30, 0x0, + 0x0, 0x1c, 0x0, 0x0, 0xb3, 0x60, 0x0, 0x1, + 0xd0, 0x0, 0xa, 0x96, 0x5, 0xdc, 0xcf, 0x60, + 0x0, 0x9f, 0x10, 0xe1, 0x0, 0xe9, 0xd3, 0x7, + 0xc0, 0xd, 0x73, 0x7c, 0x4, 0x80, 0x49, 0x0, + 0x16, 0xa9, 0x20, 0x0, 0x0, + + /* U+307D "ぽ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x79, 0x50, 0x70, + 0x0, 0x0, 0x0, 0x9, 0x9, 0x1d, 0x0, 0x5d, + 0xdd, 0xed, 0xb9, 0x33, 0xa0, 0x0, 0x0, 0x2b, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0xb0, 0x0, + 0x8, 0x60, 0x6, 0xbb, 0xbe, 0xcd, 0x50, 0x94, + 0x0, 0x12, 0x24, 0xc1, 0x0, 0xa, 0x30, 0x0, + 0x0, 0x1c, 0x0, 0x0, 0xb3, 0x60, 0x0, 0x1, + 0xd0, 0x0, 0xa, 0x96, 0x5, 0xdc, 0xcf, 0x60, + 0x0, 0x9f, 0x10, 0xe1, 0x0, 0xe9, 0xd3, 0x7, + 0xc0, 0xd, 0x73, 0x7c, 0x4, 0x80, 0x39, 0x0, + 0x16, 0xa9, 0x20, 0x0, 0x0, + + /* U+307E "ま" */ + 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x31, 0x0, + 0xe1, 0x24, 0x50, 0xb, 0xcd, 0xdf, 0xcb, 0xa7, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x4, 0x21, + 0x1f, 0x23, 0x56, 0x1, 0xab, 0xcc, 0xfb, 0xa9, + 0x70, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x17, + 0xaa, 0xf4, 0x0, 0x0, 0xc, 0x73, 0x3d, 0xdc, + 0x40, 0x2, 0xd0, 0x0, 0xd2, 0x5e, 0x80, 0xe, + 0x62, 0x6e, 0x0, 0x1b, 0x0, 0x28, 0xb9, 0x30, + 0x0, 0x0, + + /* U+307F "み" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xc, + 0xee, 0xdf, 0x60, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa5, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x2d, 0x0, 0x3, 0xb0, + 0x0, 0x2a, 0xdf, 0xee, 0xb5, 0x4a, 0x0, 0x2d, + 0x41, 0xe0, 0x3, 0x9f, 0xb0, 0xb, 0x30, 0x87, + 0x0, 0x0, 0xbc, 0xd1, 0xd1, 0x2e, 0x0, 0x0, + 0x4d, 0x4, 0x7, 0xee, 0x50, 0x0, 0x2e, 0x30, + 0x0, 0x1, 0x10, 0x0, 0x7e, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + + /* U+3080 "む" */ + 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x10, 0xc, + 0x35, 0x60, 0x42, 0x0, 0x9d, 0xdf, 0xc9, 0x50, + 0x4e, 0x40, 0x0, 0xc, 0x10, 0x0, 0x2, 0xe3, + 0x5, 0xbf, 0x10, 0x0, 0x0, 0x31, 0x3c, 0x1b, + 0x40, 0x0, 0x0, 0x0, 0x85, 0x8, 0x60, 0x0, + 0x0, 0x0, 0x87, 0xc, 0x30, 0x0, 0x9, 0x10, + 0x2e, 0xec, 0x0, 0x0, 0xc, 0x30, 0x0, 0x5b, + 0x0, 0x0, 0xe, 0x20, 0x0, 0x2e, 0x42, 0x34, + 0xac, 0x0, 0x0, 0x5, 0xac, 0xba, 0x70, 0x0, + + /* U+3081 "め" */ + 0x0, 0x0, 0x0, 0xa, 0x40, 0x0, 0x4, 0xb0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xe1, 0x59, 0xcf, + 0x82, 0x0, 0x0, 0xae, 0x94, 0x79, 0x6d, 0x50, + 0x2, 0xeb, 0x0, 0xc2, 0x1, 0xe2, 0xd, 0x3e, + 0x12, 0xd0, 0x0, 0x78, 0x69, 0x7, 0x9a, 0x60, + 0x0, 0x4b, 0xa4, 0x0, 0xed, 0x0, 0x0, 0x69, + 0xb3, 0x1, 0xdd, 0x10, 0x0, 0xa6, 0x7b, 0x5d, + 0x67, 0x20, 0x7, 0xd0, 0x8, 0xa4, 0x0, 0x26, + 0xcc, 0x20, 0x0, 0x0, 0x0, 0x79, 0x50, 0x0, + + /* U+3082 "も" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0x0, 0x0, 0x0, 0x11, 0x4, 0xa0, 0x0, 0x0, + 0x5, 0xce, 0xde, 0xcd, 0x60, 0x0, 0x0, 0x9, + 0x72, 0x10, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, + 0x0, 0x75, 0x2c, 0x20, 0x20, 0x4b, 0x6, 0x9c, + 0xfe, 0xed, 0x40, 0xb6, 0x0, 0xe, 0x0, 0x0, + 0x4, 0xb0, 0x0, 0xf0, 0x0, 0x0, 0x2d, 0x0, + 0xd, 0x20, 0x0, 0x8, 0xa0, 0x0, 0x7c, 0x42, + 0x4a, 0xe1, 0x0, 0x0, 0x6b, 0xca, 0x70, 0x0, + + /* U+3083 "ゃ" */ + 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x9, 0x10, + 0x5a, 0x0, 0x0, 0x0, 0x88, 0x5, 0xad, 0xda, + 0x0, 0x2, 0xfd, 0x93, 0x0, 0x98, 0x1a, 0xec, + 0x70, 0x0, 0x5, 0xa0, 0x70, 0x2d, 0x5, 0x33, + 0xc6, 0x0, 0x0, 0xb3, 0x6a, 0xa5, 0x0, 0x0, + 0x5, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, + + /* U+3084 "や" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0x69, 0x0, + 0x1c, 0x40, 0x0, 0x0, 0x0, 0xe2, 0x3, 0x9b, + 0xdd, 0x80, 0x0, 0x7, 0xcc, 0xb5, 0x20, 0xa, + 0x70, 0x4a, 0xde, 0x30, 0x0, 0x0, 0x4b, 0xa, + 0x60, 0x79, 0x1, 0x0, 0xa, 0x80, 0x0, 0x1, + 0xe0, 0x6e, 0xde, 0xa0, 0x0, 0x0, 0xa, 0x60, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x0, 0x0, 0x0, + + /* U+3085 "ゅ" */ + 0x0, 0x0, 0x7, 0x30, 0x0, 0xd, 0x10, 0x7, + 0x60, 0x0, 0xd, 0x1, 0x9d, 0xec, 0x70, 0x1c, + 0x3c, 0x44, 0x90, 0x98, 0x2c, 0xb0, 0x3, 0xa0, + 0xd, 0x2f, 0x32, 0x5, 0x80, 0x1d, 0x1e, 0x9, + 0x78, 0x60, 0x98, 0xd, 0x0, 0x9f, 0xde, 0x90, + 0x0, 0x0, 0x7a, 0x10, 0x0, 0x0, 0x4, 0xb1, + 0x0, 0x0, + + /* U+3086 "ゆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x0, 0x9, 0x30, 0x0, 0x77, + 0x0, 0x0, 0xc, 0x10, 0x19, 0xef, 0xd9, 0x10, + 0xd, 0x4, 0xc5, 0x5a, 0x6, 0xd0, 0xd, 0x3b, + 0x10, 0x3b, 0x0, 0x87, 0xd, 0xb1, 0x0, 0x3a, + 0x0, 0x4a, 0xf, 0x70, 0x10, 0x48, 0x0, 0x69, + 0xf, 0x23, 0xc0, 0x67, 0x0, 0xc5, 0xd, 0x10, + 0x8c, 0xc7, 0x5c, 0xa0, 0x7, 0x10, 0x5, 0xfb, + 0x95, 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+3087 "ょ" */ + 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xcc, 0xd2, 0x0, + 0x0, 0x4a, 0x10, 0x0, 0x0, 0x0, 0x4a, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x3, 0xac, + 0xdd, 0x40, 0x0, 0x1d, 0x30, 0x2d, 0xbc, 0x20, + 0x2d, 0x10, 0x6b, 0x5, 0xe2, 0x6, 0xde, 0xd3, + 0x0, 0x20, + + /* U+3088 "よ" */ + 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa2, + 0x24, 0x40, 0x0, 0x0, 0x5, 0xec, 0xba, 0x80, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0x0, 0x0, 0x7a, 0xcc, 0xd2, 0x0, 0x0, + 0xc, 0x83, 0x26, 0xee, 0xb3, 0x0, 0x2d, 0x0, + 0x4, 0xc0, 0x6e, 0x70, 0xd, 0x83, 0x4b, 0x90, + 0x3, 0xb0, 0x1, 0x8b, 0xc8, 0x0, 0x0, 0x0, + + /* U+3089 "ら" */ + 0x0, 0x49, 0x51, 0x0, 0x0, 0x0, 0x26, 0xad, + 0xec, 0x0, 0x4, 0x10, 0x0, 0x2, 0x0, 0xd, + 0x20, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x5, 0xac, 0xdc, 0x60, 0x2d, 0xb9, + 0x20, 0x2, 0xc6, 0x5f, 0x50, 0x0, 0x0, 0x3c, + 0x24, 0x0, 0x0, 0x0, 0x5b, 0x0, 0x0, 0x0, + 0x2, 0xd6, 0x0, 0x46, 0x67, 0xbe, 0x70, 0x0, + 0x5a, 0xa9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+308A "り" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x96, 0x1b, 0xde, 0x70, 0xb, 0x4c, 0x40, + 0x1d, 0x40, 0xcb, 0x30, 0x0, 0x5b, 0xe, 0xa0, + 0x0, 0x1, 0xe0, 0xf4, 0x0, 0x0, 0xf, 0xf, + 0x10, 0x0, 0x2, 0xe0, 0xd1, 0x0, 0x0, 0x5b, + 0x0, 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x1a, + 0xa0, 0x0, 0x4, 0x8e, 0x80, 0x0, 0x1, 0xb6, + 0x20, 0x0, 0x0, + + /* U+308B "る" */ + 0x0, 0x0, 0x0, 0x12, 0x30, 0x0, 0x9, 0xed, + 0xdc, 0xdf, 0x30, 0x0, 0x0, 0x0, 0x3d, 0x30, + 0x0, 0x0, 0x0, 0x6c, 0x10, 0x0, 0x0, 0x0, + 0x9b, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xba, 0xbd, + 0x50, 0x2, 0xd9, 0x10, 0x0, 0x1c, 0x62, 0xe5, + 0x0, 0x0, 0x0, 0x3c, 0x2, 0x3, 0xcc, 0xa1, + 0x2, 0xd0, 0x0, 0xc3, 0x6, 0xb0, 0x99, 0x0, + 0x9, 0x93, 0x2f, 0xbc, 0x0, 0x0, 0x7, 0xbb, + 0x95, 0x0, + + /* U+308C "れ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x4, 0x79, 0xf7, + 0x6, 0xde, 0x80, 0x0, 0x5, 0x64, 0xf3, 0xb7, + 0x0, 0xe2, 0x0, 0x0, 0x1, 0xfd, 0x30, 0x0, + 0xc3, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x4e, 0xd0, 0x0, 0x0, 0xf0, 0x0, + 0x1, 0xe4, 0xd0, 0x0, 0x0, 0xd0, 0x0, 0xb, + 0x71, 0xd0, 0x0, 0x2, 0xc0, 0x0, 0x7, 0x1, + 0xd0, 0x0, 0x2, 0xd1, 0x5b, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0xbf, 0xc2, 0x0, 0x1, 0x80, 0x0, + 0x0, 0x0, 0x0, + + /* U+308D "ろ" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0xa, 0xee, + 0xed, 0xef, 0x20, 0x0, 0x0, 0x0, 0x3d, 0x40, + 0x0, 0x0, 0x0, 0x4c, 0x20, 0x0, 0x0, 0x0, + 0x6b, 0x20, 0x0, 0x0, 0x0, 0x9f, 0xcb, 0xcd, + 0x60, 0x1, 0xbc, 0x30, 0x0, 0x1c, 0x52, 0xd8, + 0x0, 0x0, 0x0, 0x4c, 0x5, 0x0, 0x0, 0x0, + 0x5, 0xb0, 0x0, 0x0, 0x0, 0x1, 0xc7, 0x0, + 0x2, 0x33, 0x48, 0xe9, 0x0, 0x0, 0x5b, 0xbb, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+308F "わ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x40, + 0x0, 0x0, 0x0, 0x2, 0x45, 0xd7, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0x8e, 0x34, 0xbd, 0xde, 0x80, + 0x0, 0x0, 0xda, 0xb3, 0x0, 0x1b, 0x90, 0x0, + 0x5f, 0x70, 0x0, 0x0, 0xe, 0x0, 0x1d, 0xe0, + 0x0, 0x0, 0x0, 0xe2, 0xc, 0x5e, 0x0, 0x0, + 0x0, 0x1f, 0x8, 0xa0, 0xe0, 0x0, 0x0, 0xb, + 0x80, 0x80, 0xe, 0x0, 0x1, 0x5d, 0xa0, 0x0, + 0x0, 0xf0, 0x2, 0xea, 0x40, 0x0, 0x0, 0x8, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3092 "を" */ + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x23, 0x23, + 0xe3, 0x56, 0x80, 0x0, 0x5b, 0xbe, 0xca, 0x87, + 0x60, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaa, 0xba, 0x30, 0x28, 0xe1, 0x6, 0xe5, + 0x14, 0xdb, 0xd7, 0x10, 0x5e, 0x10, 0x9, 0xf4, + 0x0, 0x0, 0x33, 0x3, 0xd6, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0xe0, 0x0, 0x0, 0x0, 0x2d, + 0x0, 0x60, 0x0, 0x0, 0x0, 0xe, 0x74, 0x22, + 0x35, 0x20, 0x0, 0x1, 0x8b, 0xcb, 0xb9, 0x30, + + /* U+3093 "ん" */ + 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xba, 0xc5, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xa2, 0x3e, 0x0, 0x0, + 0x0, 0x0, 0x8c, 0x0, 0xe, 0x10, 0x1, 0xb0, + 0x1, 0xf1, 0x0, 0xe, 0x10, 0x8, 0xa0, 0x7, + 0xa0, 0x0, 0xd, 0x30, 0x3e, 0x20, 0xe, 0x30, + 0x0, 0x7, 0xfd, 0xe4, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x22, 0x0, 0x0, + + /* U+30A1 "ァ" */ + 0x8c, 0xcc, 0xcc, 0xcc, 0xc9, 0x12, 0x22, 0x22, + 0x22, 0xd6, 0x0, 0x0, 0xb3, 0x9, 0xa0, 0x0, + 0x0, 0xc2, 0x9a, 0x0, 0x0, 0x0, 0xe1, 0x10, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0xb, + 0x60, 0x0, 0x0, 0x1, 0xba, 0x0, 0x0, 0x0, + 0x6, 0x70, 0x0, 0x0, 0x0, + + /* U+30A2 "ア" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0xee, 0xee, 0xee, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe3, 0x0, 0x0, 0x7, 0x20, 0xc, 0x70, + 0x0, 0x0, 0xc, 0x42, 0xd7, 0x0, 0x0, 0x0, + 0xc, 0x36, 0x60, 0x0, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xd0, 0x0, 0x0, 0x0, 0x2, 0xcc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+30A3 "ィ" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x2c, 0x90, + 0x0, 0x0, 0x0, 0x7e, 0x60, 0x0, 0x0, 0x27, + 0xea, 0xe0, 0x0, 0x0, 0xbe, 0x81, 0x1e, 0x0, + 0x0, 0x2, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0x0, 0x0, + + /* U+30A4 "イ" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, + 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0x7, 0xe4, + 0x0, 0x0, 0x0, 0x3c, 0xc1, 0x0, 0x0, 0x2, + 0xae, 0xf2, 0x0, 0x1, 0x7c, 0xe7, 0xe, 0x20, + 0x0, 0x8b, 0x50, 0x0, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, 0x0, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x10, 0x0, + + /* U+30A6 "ウ" */ + 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x30, 0x0, 0x0, 0xf, 0xee, 0xef, 0xfe, + 0xee, 0xd0, 0xf, 0x0, 0x0, 0x0, 0x5, 0xc0, + 0xf, 0x0, 0x0, 0x0, 0x8, 0x90, 0xf, 0x0, + 0x0, 0x0, 0xd, 0x40, 0x5, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd6, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xb0, 0x0, 0x0, 0x0, + 0x6, 0xea, 0x0, 0x0, 0x0, 0x5, 0xed, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + + /* U+30A7 "ェ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0xee, + 0xfe, 0xee, 0xe0, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0xfe, + 0xee, 0xff, 0xee, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30A8 "エ" */ + 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2f, + 0xee, 0xef, 0xfe, 0xee, 0xd0, 0x0, 0x0, 0x0, + 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x0, 0x0, 0xe, 0xee, 0xee, 0xfe, + 0xee, 0xee, 0x80, 0x22, 0x11, 0x11, 0x11, 0x11, + 0x21, + + /* U+30AA "オ" */ + 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x12, 0x22, 0x22, 0x2f, + 0x22, 0x21, 0x5d, 0xcc, 0xcc, 0xef, 0xcc, 0xc6, + 0x0, 0x0, 0x1, 0xdf, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x6e, 0x0, 0x0, 0x0, 0x2, 0xd6, 0xe, + 0x10, 0x0, 0x0, 0x6d, 0x40, 0xe, 0x10, 0x0, + 0x3c, 0xa1, 0x0, 0xe, 0x10, 0x0, 0x54, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x5e, 0xde, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, + + /* U+30AB "カ" */ + 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf0, 0x0, 0x0, 0x3, 0x22, 0x3e, 0x22, 0x22, + 0x12, 0xcc, 0xcd, 0xfc, 0xcc, 0xdd, 0x0, 0x0, + 0x59, 0x0, 0x2, 0xd0, 0x0, 0x8, 0x60, 0x0, + 0x3c, 0x0, 0x0, 0xe2, 0x0, 0x4, 0xa0, 0x0, + 0x5b, 0x0, 0x0, 0x69, 0x0, 0x1e, 0x30, 0x0, + 0x8, 0x70, 0x2d, 0x70, 0x0, 0x0, 0xd3, 0x1e, + 0x70, 0x0, 0xbf, 0xfb, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+30AC "ガ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, + 0x2, 0xf0, 0x0, 0xa2, 0xc0, 0x0, 0x0, 0x1e, + 0x0, 0x3, 0xa5, 0x30, 0x0, 0x2, 0xd0, 0x0, + 0x3, 0x0, 0x2f, 0xfe, 0xff, 0xee, 0xef, 0xd0, + 0x0, 0x0, 0x5, 0x90, 0x0, 0x2d, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x3, 0xc0, 0x0, 0x0, 0xe, + 0x20, 0x0, 0x4b, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x6, 0x90, 0x0, 0x1, 0xe3, 0x0, 0x0, 0x87, + 0x0, 0x1, 0xd7, 0x0, 0x0, 0xd, 0x30, 0x1, + 0xe8, 0x0, 0xc, 0xee, 0xc0, 0x0, 0x2, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, + + /* U+30AD "キ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, + 0x2, 0x0, 0x0, 0x2, 0x7e, 0xac, 0xfd, 0x30, + 0x4e, 0xfd, 0xaf, 0x63, 0x0, 0x0, 0x12, 0x0, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9, 0x70, + 0x2, 0x53, 0x0, 0x2, 0x5b, 0xdd, 0xfd, 0xa4, + 0x5e, 0xfc, 0xa8, 0xe2, 0x0, 0x0, 0x12, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x44, 0x0, 0x0, + + /* U+30AE "ギ" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x63, 0x0, 0x0, + 0x9, 0x20, 0x0, 0xc2, 0xc0, 0x0, 0x0, 0xb5, + 0x0, 0x4, 0x52, 0x0, 0x0, 0x8, 0xa6, 0x9c, + 0xe0, 0x0, 0x6a, 0xcf, 0xee, 0x86, 0x31, 0x0, + 0x4, 0x52, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x20, 0x0, 0x0, 0x2, + 0xca, 0xac, 0xfd, 0x20, 0x6a, 0xdf, 0xdd, 0xc5, + 0x20, 0x0, 0x4, 0x52, 0x0, 0x4b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x93, 0x0, 0x0, 0x0, + + /* U+30AF "ク" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7b, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xee, 0xee, 0xee, 0xe0, + 0x0, 0x1d, 0x50, 0x0, 0x7, 0xa0, 0x1, 0xd8, + 0x0, 0x0, 0xd, 0x40, 0x3e, 0x60, 0x0, 0x0, + 0x5d, 0x0, 0x2, 0x0, 0x0, 0x1, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, + 0x1, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xa0, + 0x0, 0x0, 0x0, 0x5b, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x66, 0x0, 0x0, 0x0, 0x0, + + /* U+30B0 "グ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x50, 0x0, + 0x0, 0x8, 0x80, 0x0, 0xb2, 0xc1, 0x0, 0x0, + 0xe, 0x30, 0x0, 0x28, 0x21, 0x0, 0x0, 0x9f, + 0xee, 0xee, 0xf5, 0x0, 0x0, 0x6, 0xd0, 0x0, + 0x1, 0xf1, 0x0, 0x0, 0x6e, 0x10, 0x0, 0x6, + 0xb0, 0x0, 0xa, 0xc1, 0x0, 0x0, 0xd, 0x50, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x17, 0xeb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x30, 0x0, + 0x0, 0x0, 0x0, + + /* U+30B1 "ケ" */ + 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x22, 0x22, + 0x22, 0x22, 0x0, 0xbd, 0xdd, 0xdf, 0xdd, 0xda, + 0x6, 0xd0, 0x0, 0x1f, 0x0, 0x0, 0x4f, 0x30, + 0x0, 0x3c, 0x0, 0x0, 0x84, 0x0, 0x0, 0x7a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x30, 0x0, 0x0, 0x0, 0x6, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, + + /* U+30B2 "ゲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x83, 0x0, 0x0, 0xa2, 0xb0, 0x0, 0x0, + 0xf2, 0x0, 0x0, 0x58, 0x51, 0x0, 0x5, 0xc0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0xc, 0xfe, 0xef, + 0xfe, 0xef, 0x90, 0x0, 0x7c, 0x0, 0x3, 0xc0, + 0x0, 0x0, 0x5, 0xe2, 0x0, 0x6, 0xa0, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x9, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa3, 0x0, + 0x0, 0x0, 0x0, + + /* U+30B3 "コ" */ + 0x14, 0x33, 0x33, 0x33, 0x33, 0x5c, 0xcb, 0xbb, + 0xbb, 0xce, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0x9f, 0xee, 0xee, 0xee, 0xee, 0x11, 0x11, 0x11, + 0x11, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x4, + + /* U+30B4 "ゴ" */ + 0x0, 0x0, 0x0, 0x0, 0x31, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0x3a, 0x1, 0x0, 0x0, 0x0, + 0x7, 0x1, 0xf, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x40, 0x0, 0x0, 0x0, 0x0, 0xb, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x40, 0x1, 0x11, 0x11, 0x11, + 0x1c, 0x40, 0x3f, 0xfe, 0xee, 0xee, 0xef, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x20, + + /* U+30B5 "サ" */ + 0x0, 0x1, 0xd0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x1, 0xe0, + 0x0, 0xf, 0x0, 0x0, 0xff, 0xff, 0xee, 0xee, + 0xff, 0xfd, 0x0, 0x1, 0xe0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x18, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xdb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, + + /* U+30B6 "ザ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x1, 0xa0, 0x0, 0xc, 0x26, 0xa1, 0x0, 0x2, + 0xd0, 0x0, 0xf, 0xb, 0x35, 0x0, 0x1, 0xd0, + 0x0, 0xf, 0x2, 0x0, 0x1e, 0xee, 0xfe, 0xee, + 0xef, 0xee, 0xc0, 0x1, 0x12, 0xd0, 0x0, 0x1f, + 0x1, 0x10, 0x0, 0x1, 0xd0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x3d, 0x0, 0x0, + 0x0, 0x1, 0x80, 0x0, 0x6a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0x50, + 0x0, 0x0, 0x0, + + /* U+30B7 "シ" */ + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0x0, + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x2d, 0xb2, 0x0, 0x0, 0x0, 0x98, 0x0, 0x7d, + 0x0, 0x0, 0x5, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x20, 0x0, 0x0, 0x0, 0x8, 0xe4, 0x0, + 0x0, 0x0, 0x2, 0xcc, 0x10, 0x0, 0x0, 0x4, + 0xbf, 0x70, 0x0, 0x0, 0x8, 0xfd, 0x70, 0x0, + 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+30B8 "ジ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x40, 0x0, 0x2, 0xa, 0x30, 0x0, 0x3d, 0xa1, + 0x0, 0x58, 0x2c, 0x0, 0x0, 0x9, 0xc0, 0x0, + 0xc1, 0x30, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xe8, 0x0, 0x0, 0x0, 0x9, 0x60, 0x1, + 0xbb, 0x0, 0x0, 0x5, 0xd1, 0x0, 0x0, 0x10, + 0x0, 0x5, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xb1, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0x70, 0x0, 0x0, 0x0, + 0x9f, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x3, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30B9 "ス" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x10, 0x0, 0x0, + 0xa8, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0x3a, 0xc0, 0x0, + 0x0, 0x8, 0xe2, 0x0, 0xac, 0x0, 0x6, 0xea, + 0x10, 0x0, 0xb, 0xb0, 0x3d, 0x40, 0x0, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30BA "ズ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x54, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x3b, 0x10, 0x7b, 0xbb, 0xbb, 0xbb, + 0xa5, 0x0, 0x3, 0x44, 0x44, 0x44, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xe6, 0xe5, 0x0, + 0x0, 0x0, 0x8, 0xd2, 0x3, 0xe5, 0x0, 0x0, + 0x5d, 0xb1, 0x0, 0x3, 0xf4, 0x0, 0x8e, 0x50, + 0x0, 0x0, 0x5, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, + + /* U+30BB "セ" */ + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x3, 0x68, 0x0, 0x0, 0xe, 0x79, 0xce, + 0xcd, 0xb0, 0x2a, 0xdf, 0xf9, 0x52, 0x1, 0xe2, + 0x1, 0x62, 0xd, 0x10, 0x0, 0xa7, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x8b, 0x0, 0x0, 0x0, 0xd, + 0x10, 0x3, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x5e, 0xdd, 0xde, 0xf7, 0x0, + 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, + + /* U+30BC "ゼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x40, 0x0, + 0x0, 0xb1, 0x0, 0x0, 0xb2, 0xc0, 0x0, 0x0, + 0xe1, 0x0, 0x0, 0x37, 0x20, 0x0, 0x0, 0xe1, + 0x0, 0x1, 0x56, 0x0, 0x0, 0x0, 0xe6, 0x8b, + 0xed, 0xdc, 0x0, 0x29, 0xce, 0xfa, 0x63, 0x1, + 0xe2, 0x0, 0x27, 0x30, 0xe1, 0x0, 0xa, 0x80, + 0x0, 0x0, 0x0, 0xe1, 0x0, 0x8b, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0x41, 0x0, 0x0, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xcb, 0xcd, 0xf7, 0x0, 0x0, 0x0, 0x1, 0x33, + 0x32, 0x0, 0x0, + + /* U+30BD "ソ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, + 0x0, 0x0, 0x7b, 0x8, 0xb0, 0x0, 0x0, 0xa, + 0x70, 0xe, 0x40, 0x0, 0x0, 0xe2, 0x0, 0x6d, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x40, 0x0, 0xc, + 0x60, 0x0, 0x0, 0x0, 0x5, 0xe0, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x0, 0x0, 0x0, 0x2, 0xe6, + 0x0, 0x0, 0x0, 0x6, 0xf7, 0x0, 0x0, 0x0, + 0xc, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, + + /* U+30BF "タ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x7c, 0x22, + 0x22, 0x20, 0x0, 0x2, 0xec, 0xcc, 0xcd, 0xf0, + 0x0, 0x1d, 0x40, 0x0, 0x7, 0x90, 0x1, 0xd7, + 0x0, 0x0, 0xd, 0x30, 0x3e, 0x60, 0x9b, 0x10, + 0x6c, 0x0, 0x13, 0x0, 0x7, 0xe7, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xd1, 0x0, 0x0, 0x0, + 0x1, 0xd9, 0xae, 0x0, 0x0, 0x0, 0x4e, 0x70, + 0x3, 0x0, 0x0, 0x5d, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, + + /* U+30C0 "ダ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x50, 0x0, + 0x0, 0x5, 0x90, 0x0, 0xb2, 0xc1, 0x0, 0x0, + 0xd, 0x50, 0x0, 0x49, 0x21, 0x0, 0x0, 0x7f, + 0xee, 0xee, 0xf7, 0x0, 0x0, 0x4, 0xd1, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0x4e, 0x20, 0x0, 0x4, + 0xd0, 0x0, 0x7, 0xd2, 0x1d, 0x40, 0xc, 0x60, + 0x0, 0x6, 0x10, 0x4, 0xd9, 0x7c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x8f, 0x60, 0x0, 0x0, 0x0, + 0x7, 0xe3, 0x3, 0x20, 0x0, 0x0, 0x7, 0xeb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x30, 0x0, + 0x0, 0x0, 0x0, + + /* U+30C1 "チ" */ + 0x0, 0x0, 0x0, 0x3, 0x6a, 0x10, 0x5, 0xcc, + 0xde, 0xfb, 0x85, 0x10, 0x0, 0x21, 0x2, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, + 0x11, 0x0, 0x3, 0xd0, 0x0, 0x11, 0x8e, 0xdd, + 0xde, 0xfd, 0xdd, 0xec, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x9b, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, + + /* U+30C3 "ッ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0xd0, + 0x0, 0x34, 0x4c, 0x0, 0xb4, 0x0, 0x98, 0xd, + 0x30, 0x6a, 0x0, 0xd2, 0x7, 0x80, 0x1, 0x4, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0x9a, 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, + 0x0, 0x7, 0xe9, 0x0, 0x0, 0x0, 0x6c, 0x30, + 0x0, 0x0, + + /* U+30C4 "ツ" */ + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x25, 0x0, + 0x5b, 0x0, 0x0, 0xa4, 0x3e, 0x0, 0xe, 0x10, + 0x0, 0xf3, 0xc, 0x50, 0x9, 0x70, 0x4, 0xd0, + 0x5, 0xb0, 0x2, 0x30, 0x9, 0x80, 0x0, 0x60, + 0x0, 0x0, 0x2f, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0xb0, 0x0, 0x0, 0x0, 0x1c, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+30C6 "テ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xee, + 0xee, 0xee, 0xef, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9e, 0xee, 0xee, 0xee, 0xee, 0xeb, 0x0, 0x0, + 0x4, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xc8, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+30C7 "デ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x17, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x85, 0xa3, 0x3, 0xee, 0xee, + 0xee, 0xe3, 0xa1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x60, 0x22, + 0x11, 0x19, 0x91, 0x11, 0x21, 0x0, 0x0, 0x0, + 0x96, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30C8 "ト" */ + 0x3e, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x1f, 0xfa, 0x40, 0x0, 0x1e, 0x17, 0xde, 0x81, + 0x1e, 0x0, 0x4, 0xbb, 0x1e, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x2f, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + + /* U+30C9 "ド" */ + 0xc2, 0x0, 0x10, 0xa0, 0xe2, 0x0, 0x86, 0x77, + 0xe2, 0x0, 0xd, 0x4, 0xe2, 0x0, 0x0, 0x0, + 0xee, 0x94, 0x0, 0x0, 0xe4, 0x8d, 0xe7, 0x10, + 0xe2, 0x0, 0x4b, 0xe0, 0xe2, 0x0, 0x0, 0x10, + 0xe2, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, + 0xe3, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, + + /* U+30CA "ナ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x7b, 0xbb, 0xbc, 0xfb, 0xbb, 0xba, 0x24, 0x33, + 0x36, 0xe3, 0x33, 0x43, 0x0, 0x0, 0x4, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0x0, 0x0, 0x0, 0x0, 0x6, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x9d, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30CB "ニ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x10, + + /* U+30CD "ネ" */ + 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0x0, 0x0, 0x0, 0xb, 0xee, 0xee, + 0xee, 0xef, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x90, 0x0, 0x0, 0x0, + 0x2, 0xaf, 0xc0, 0x85, 0x0, 0x1, 0x6b, 0xe7, + 0x5b, 0x3, 0xcc, 0x20, 0x5a, 0x50, 0x4, 0xb0, + 0x0, 0x6b, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, + + /* U+30CE "ノ" */ + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x4, 0xe0, 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, + 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, 0x7b, + 0x0, 0x0, 0x0, 0x1, 0xf3, 0x0, 0x0, 0x0, + 0xa, 0x90, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, + 0x0, 0x1b, 0xc0, 0x0, 0x0, 0x7, 0xfa, 0x0, + 0x0, 0x0, 0xad, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30CF "ハ" */ + 0x0, 0x3, 0x50, 0x6, 0x30, 0x0, 0x0, 0x9, + 0x80, 0x6, 0xb0, 0x0, 0x0, 0xc, 0x40, 0x0, + 0xe3, 0x0, 0x0, 0xf, 0x0, 0x0, 0x7a, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x1f, 0x10, 0x0, 0xb6, + 0x0, 0x0, 0xa, 0x70, 0x2, 0xf0, 0x0, 0x0, + 0x4, 0xd0, 0xa, 0x80, 0x0, 0x0, 0x0, 0xe3, + 0x4e, 0x10, 0x0, 0x0, 0x0, 0x98, 0x75, 0x0, + 0x0, 0x0, 0x0, 0x47, + + /* U+30D0 "バ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x92, 0xb0, 0x0, 0x0, + 0x21, 0x0, 0x50, 0x67, 0x62, 0x0, 0x0, 0xa7, + 0x0, 0xb7, 0x2, 0x0, 0x0, 0x0, 0xe3, 0x0, + 0x3e, 0x0, 0x0, 0x0, 0x1, 0xf0, 0x0, 0xb, + 0x60, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x4, 0xd0, + 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0xb7, 0x0, 0x0, 0x0, 0x2f, 0x0, 0x5, 0xe0, + 0x0, 0x0, 0x0, 0xd, 0x50, 0xb, 0x50, 0x0, + 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+30D1 "パ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0x92, 0x0, + 0x0, 0x21, 0x0, 0x40, 0x90, 0x27, 0x0, 0x0, + 0xa7, 0x0, 0xb7, 0x29, 0x91, 0x0, 0x0, 0xd3, + 0x0, 0x3e, 0x0, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x4, + 0xe0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0xd5, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x7b, 0x0, + 0x0, 0xb7, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x5, + 0xe0, 0x0, 0x0, 0x0, 0xc, 0x70, 0xb, 0x50, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30D2 "ヒ" */ + 0xb1, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0x19, 0xe, 0x10, 0x16, + 0xbe, 0x81, 0xe9, 0xce, 0xa4, 0x0, 0xe, 0x93, + 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, 0xe, + 0x10, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, + 0xc, 0x71, 0x0, 0x11, 0x34, 0x3b, 0xef, 0xfe, + 0xed, 0x90, + + /* U+30D3 "ビ" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x17, 0x0, + 0x0, 0x2, 0x86, 0x70, 0x1e, 0x0, 0x0, 0x0, + 0xa3, 0x70, 0x1e, 0x0, 0x0, 0x0, 0x50, 0x0, + 0x1e, 0x0, 0x3, 0x9e, 0xa0, 0x0, 0x1e, 0x59, + 0xec, 0x71, 0x0, 0x0, 0x1f, 0xb6, 0x20, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, + 0x1, 0x0, 0x8, 0xfd, 0xcc, 0xde, 0xf8, 0x0, + 0x0, 0x2, 0x32, 0x21, 0x0, 0x0, + + /* U+30D4 "ピ" */ + 0x3, 0x0, 0x0, 0x0, 0x59, 0x70, 0x1f, 0x0, + 0x0, 0x0, 0x90, 0x90, 0x1e, 0x0, 0x0, 0x0, + 0x79, 0x50, 0x1e, 0x0, 0x3, 0x8e, 0xa0, 0x0, + 0x1e, 0x49, 0xdd, 0x72, 0x0, 0x0, 0x1f, 0xb7, + 0x20, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, + 0x0, 0x0, 0x1, 0x0, 0x8, 0xfd, 0xcc, 0xde, + 0xf8, 0x0, 0x0, 0x2, 0x32, 0x21, 0x0, 0x0, + + /* U+30D5 "フ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x0, + 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x1, + 0xf1, 0x0, 0x0, 0x0, 0x8, 0xa0, 0x0, 0x0, + 0x0, 0x2f, 0x20, 0x0, 0x0, 0x2, 0xe7, 0x0, + 0x0, 0x0, 0x3e, 0x70, 0x0, 0x0, 0x4a, 0xe6, + 0x0, 0x0, 0x4, 0xe8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30D6 "ブ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x92, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x57, 0x31, 0xcb, 0xbb, 0xbb, 0xbb, + 0xc8, 0x0, 0x4, 0x33, 0x33, 0x33, 0x3b, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd7, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x29, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, + + /* U+30D7 "プ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xab, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x62, 0x17, 0x39, 0x88, 0x88, + 0x88, 0x8c, 0x65, 0x52, 0x88, 0x88, 0x88, 0x88, + 0xeb, 0x70, 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xed, 0x40, 0x0, 0x0, 0x0, 0x0, 0x34, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30D9 "ベ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x1c, 0x0, 0x0, 0x0, + 0x7, 0x30, 0xb, 0x37, 0x70, 0x0, 0x0, 0xbc, + 0xe4, 0x2, 0xb0, 0x20, 0x0, 0x9, 0xb0, 0x3e, + 0x40, 0x0, 0x0, 0x0, 0x6d, 0x10, 0x3, 0xe4, + 0x0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x4e, 0x30, + 0x0, 0xe, 0x50, 0x0, 0x0, 0x6, 0xe2, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x8e, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+30DA "ペ" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x99, 0x20, 0x0, + 0x0, 0x1a, 0x60, 0xa, 0x1, 0x90, 0x0, 0x0, + 0xd9, 0xd8, 0x4, 0x9a, 0x30, 0x0, 0xb, 0x90, + 0x1c, 0x80, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x1, + 0xd8, 0x0, 0x0, 0x8, 0xe1, 0x0, 0x0, 0x1e, + 0x70, 0x0, 0xc, 0x30, 0x0, 0x0, 0x2, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+30DB "ホ" */ + 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x2b, 0xbb, 0xbb, + 0xfb, 0xbb, 0xb9, 0x0, 0x43, 0x33, 0x5f, 0x33, + 0x34, 0x30, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x3, 0xa0, 0x1e, 0x0, 0xb2, 0x0, 0x0, + 0xd4, 0x1, 0xe0, 0x5, 0xc0, 0x0, 0x9a, 0x0, + 0x1e, 0x0, 0xb, 0x70, 0x5d, 0x0, 0x1, 0xe0, + 0x0, 0x2e, 0x0, 0x10, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdd, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + + /* U+30DC "ボ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x72, 0x2, 0x68, 0x50, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0xc2, 0xa0, 0x1, 0x10, 0x0, + 0xc4, 0x0, 0x32, 0x0, 0xd, 0xed, 0xdd, 0xfe, + 0xdd, 0xde, 0x10, 0x0, 0x0, 0x0, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0xc3, 0x1, 0x10, + 0x0, 0x0, 0x3e, 0x0, 0xc3, 0x7, 0xa0, 0x0, + 0x0, 0xc5, 0x0, 0xc3, 0x0, 0xc5, 0x0, 0xa, + 0xa0, 0x0, 0xc3, 0x0, 0x3e, 0x10, 0x1a, 0x0, + 0x0, 0xc3, 0x0, 0x7, 0x30, 0x0, 0x0, 0x32, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0xa0, + 0x0, 0x0, 0x0, + + /* U+30DD "ポ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x99, 0x30, 0x0, + 0x0, 0xb, 0x30, 0x62, 0x9, 0x0, 0x0, 0x0, + 0xc3, 0x3, 0xa8, 0x60, 0x11, 0x0, 0xc, 0x40, + 0x2, 0x40, 0xd, 0xed, 0xdd, 0xfe, 0xdd, 0xee, + 0x10, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x2, 0x0, 0xc3, 0x2, 0x0, 0x0, 0x3, 0xe0, + 0xc, 0x30, 0xa9, 0x0, 0x0, 0xc5, 0x0, 0xc3, + 0x1, 0xe4, 0x0, 0xaa, 0x0, 0xc, 0x30, 0x4, + 0xe1, 0x1a, 0x0, 0x0, 0xc3, 0x0, 0x8, 0x20, + 0x0, 0x3, 0x2e, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xac, 0xa0, 0x0, 0x0, 0x0, + + /* U+30DE "マ" */ + 0x23, 0x33, 0x33, 0x33, 0x33, 0x31, 0x6c, 0xbb, + 0xbb, 0xbb, 0xbb, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x50, + 0x0, 0x12, 0x0, 0x1, 0xc8, 0x0, 0x0, 0x5e, + 0x40, 0x1d, 0x80, 0x0, 0x0, 0x3, 0xe7, 0xd7, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x60, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x60, 0x0, + + /* U+30DF "ミ" */ + 0x0, 0x74, 0x10, 0x0, 0x0, 0x1, 0x8b, 0xee, + 0xa6, 0x20, 0x0, 0x0, 0x1, 0x59, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xa7, 0x30, 0x0, + 0x0, 0x2, 0x58, 0xcf, 0xc7, 0x10, 0x0, 0x0, + 0x0, 0x49, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x69, 0x62, 0x0, 0x0, 0x0, 0x36, 0x9d, 0xfb, + 0x62, 0x0, 0x0, 0x0, 0x15, 0x9e, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x10, + + /* U+30E0 "ム" */ + 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x88, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x89, 0x0, 0x7, 0x10, 0x0, 0x0, + 0xd, 0x30, 0x0, 0x8a, 0x0, 0x0, 0x3, 0xe0, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x88, 0x0, 0x1, + 0x39, 0xc0, 0x6, 0x7e, 0xcb, 0xdf, 0xec, 0xae, + 0x50, 0x88, 0x75, 0x32, 0x0, 0x0, 0x6c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+30E1 "メ" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x22, 0x0, 0x0, + 0x98, 0x0, 0x0, 0x5e, 0x60, 0x1, 0xf1, 0x0, + 0x0, 0x2, 0xca, 0x1a, 0x80, 0x0, 0x0, 0x0, + 0x9, 0xee, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfe, + 0x40, 0x0, 0x0, 0x0, 0x2e, 0x54, 0xf5, 0x0, + 0x0, 0x3, 0xe6, 0x0, 0x4f, 0x60, 0x0, 0x9e, + 0x50, 0x0, 0x4, 0xc0, 0x1e, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30E2 "モ" */ + 0x3, 0xfe, 0xee, 0xee, 0xee, 0xc0, 0x0, 0x0, + 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x5f, 0xee, 0xef, 0xee, 0xee, 0xea, 0x0, 0x0, + 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfd, 0xde, 0xf3, 0x0, 0x0, 0x0, 0x2, + 0x11, 0x0, + + /* U+30E3 "ャ" */ + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x7, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0x3, 0x69, 0xdd, + 0x4, 0x7a, 0xfd, 0xa7, 0x4b, 0x50, 0x67, 0x39, + 0x60, 0x6, 0xa0, 0x0, 0x0, 0x4a, 0x5, 0xd0, + 0x0, 0x0, 0x0, 0xe0, 0x21, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, + + /* U+30E4 "ヤ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf1, + 0x0, 0x0, 0x2, 0x10, 0x0, 0xb, 0x52, 0x58, + 0xbe, 0xf8, 0x4, 0x69, 0xef, 0xc9, 0x63, 0x3e, + 0x10, 0xb9, 0x65, 0xd0, 0x0, 0x1d, 0x40, 0x0, + 0x0, 0xe, 0x20, 0x1c, 0x70, 0x0, 0x0, 0x0, + 0xa6, 0x6, 0x90, 0x0, 0x0, 0x0, 0x6, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x35, 0x0, 0x0, 0x0, + + /* U+30E5 "ュ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, + 0x0, 0x88, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + + /* U+30E7 "ョ" */ + 0x9d, 0xcc, 0xcc, 0xcb, 0x11, 0x11, 0x11, 0x2e, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x1e, + 0x6d, 0xdd, 0xdd, 0xde, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xe, 0xde, 0xee, 0xee, 0xee, + 0x0, 0x0, 0x0, 0x1e, + + /* U+30E8 "ヨ" */ + 0x6f, 0xee, 0xee, 0xee, 0xeb, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xe, 0xdd, 0xdd, 0xdd, + 0xec, 0x1, 0x11, 0x11, 0x11, 0x5c, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x12, 0x22, 0x22, 0x22, 0x5c, 0x8d, 0xdd, 0xdd, + 0xdd, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x1, + + /* U+30E9 "ラ" */ + 0x0, 0x11, 0x11, 0x11, 0x11, 0x0, 0x0, 0xcd, + 0xdd, 0xdd, 0xde, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xee, 0xee, 0xee, 0xee, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x0, 0x0, + 0x2, 0xbd, 0x20, 0x0, 0x0, 0x5, 0xce, 0x80, + 0x0, 0x0, 0x0, 0x3, 0x50, 0x0, 0x0, 0x0, + + /* U+30EA "リ" */ + 0x91, 0x0, 0x0, 0x3a, 0xe1, 0x0, 0x0, 0x3d, + 0xe1, 0x0, 0x0, 0x3d, 0xe1, 0x0, 0x0, 0x3d, + 0xe1, 0x0, 0x0, 0x3c, 0xe1, 0x0, 0x0, 0x4c, + 0xe2, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0xb6, + 0x0, 0x0, 0x6, 0xe0, 0x0, 0x0, 0x9e, 0x30, + 0x0, 0x7f, 0xa1, 0x0, 0x0, 0x11, 0x0, 0x0, + + /* U+30EB "ル" */ + 0x0, 0x16, 0x0, 0x52, 0x0, 0x0, 0x0, 0x2, + 0xd0, 0xc, 0x40, 0x0, 0x0, 0x0, 0x2d, 0x0, + 0xb4, 0x0, 0x0, 0x0, 0x2, 0xc0, 0xb, 0x40, + 0x0, 0x0, 0x0, 0x3c, 0x0, 0xb4, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0x69, 0x0, 0xb4, 0x0, 0x7, 0x0, 0xb, 0x50, + 0xb, 0x40, 0xb, 0xa0, 0x3, 0xe0, 0x0, 0xb4, + 0x1b, 0xa0, 0x1, 0xc7, 0x0, 0xc, 0x9e, 0x80, + 0x0, 0xba, 0x0, 0x0, 0xcc, 0x30, 0x0, 0x1, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + + /* U+30EC "レ" */ + 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, + 0x72, 0xe, 0x10, 0x0, 0x0, 0x8d, 0x10, 0xe1, + 0x0, 0x1, 0xbc, 0x10, 0xe, 0x10, 0x7, 0xe8, + 0x0, 0x0, 0xe5, 0x8e, 0xb2, 0x0, 0x0, 0xe, + 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30ED "ロ" */ + 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xe5, 0x33, 0x33, + 0x33, 0x4f, 0xe1, 0x0, 0x0, 0x0, 0x1e, 0xe1, + 0x0, 0x0, 0x0, 0x1e, 0xe1, 0x0, 0x0, 0x0, + 0x1e, 0xe1, 0x0, 0x0, 0x0, 0x1e, 0xe1, 0x0, + 0x0, 0x0, 0x1e, 0xe1, 0x0, 0x0, 0x0, 0x1e, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xc2, 0x0, 0x0, + 0x0, 0x1c, + + /* U+30EF "ワ" */ + 0x1e, 0xee, 0xee, 0xee, 0xee, 0xe1, 0xf, 0x0, + 0x0, 0x0, 0x3, 0xf0, 0xf, 0x0, 0x0, 0x0, + 0x5, 0xc0, 0xf, 0x0, 0x0, 0x0, 0x8, 0x90, + 0xc, 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe5, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x80, 0x0, + 0x0, 0x0, 0x18, 0xe7, 0x0, 0x0, 0x0, 0x4, + 0xf9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+30F3 "ン" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe6, 0x0, 0x0, 0x17, 0x0, 0x2, + 0x10, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, 0x6, + 0xd0, 0x0, 0x0, 0x0, 0x7, 0xe2, 0x0, 0x0, + 0x0, 0x9, 0xd2, 0x0, 0x0, 0x0, 0x4c, 0xc1, + 0x0, 0x0, 0x27, 0xce, 0x60, 0x0, 0x0, 0xaf, + 0xa6, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30F6 "ヶ" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x71, 0x11, 0x11, + 0x10, 0x2, 0xed, 0xdd, 0xfd, 0xdd, 0x1, 0xd4, + 0x0, 0x4b, 0x0, 0x0, 0xc8, 0x0, 0x6, 0x80, + 0x0, 0x1, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x30, + 0x0, 0x0, 0x0, 0x4e, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, + + /* U+30FC "ー" */ + 0xbf, 0xee, 0xee, 0xee, 0xef, 0xf4, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x20, + + /* U+4E00 "一" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E03 "七" */ + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0x0, 0x0, 0x1, 0x42, 0x0, 0x0, 0x1e, 0x46, + 0x9c, 0xfe, 0xb4, 0x5, 0x8b, 0xef, 0xc9, 0x64, + 0x10, 0x0, 0xa, 0x74, 0x3e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xf, + 0x42, 0x11, 0x27, 0xb0, 0x0, 0x0, 0x6, 0xcc, + 0xcc, 0xcb, 0x20, + + /* U+4E07 "万" */ + 0x1e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe1, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xee, + 0xee, 0xeb, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x4b, + 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x59, 0x0, + 0x0, 0xb, 0x60, 0x0, 0x0, 0x78, 0x0, 0x0, + 0x4d, 0x0, 0x0, 0x0, 0x96, 0x0, 0x4, 0xe2, + 0x0, 0x0, 0x0, 0xd3, 0x0, 0x3d, 0x20, 0x0, + 0xd, 0xde, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+4E08 "丈" */ + 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0x1e, 0xee, 0xee, + 0xee, 0xfe, 0xee, 0xe1, 0x0, 0x3, 0x0, 0x1, + 0xe0, 0x0, 0x0, 0x0, 0xd, 0x20, 0x3, 0xc0, + 0x0, 0x0, 0x0, 0x7, 0x80, 0x5, 0xa0, 0x0, + 0x0, 0x0, 0x1, 0xe1, 0x8, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0xe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xfb, 0x30, 0x0, 0x0, 0x0, 0x48, 0xe7, + 0x5, 0xdb, 0x62, 0x0, 0xb, 0xc7, 0x10, 0x0, + 0x5, 0x9c, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4E09 "三" */ + 0x0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x3, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5e, 0xee, 0xee, 0xee, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xe1, + + /* U+4E0A "上" */ + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xee, + 0xee, 0x40, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xb, 0xbb, 0xbb, + 0xfb, 0xbb, 0xbb, 0xb5, 0x3, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x31, + + /* U+4E0B "下" */ + 0x3e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe3, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xba, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x2a, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x5e, + 0x30, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x1, 0x0, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, + + /* U+4E0D "不" */ + 0xe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe0, 0x0, + 0x0, 0x0, 0x2e, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xf7, 0x50, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x97, + 0x8d, 0x20, 0x0, 0x0, 0x9, 0xc1, 0x87, 0x4, + 0xe6, 0x0, 0x3, 0xca, 0x10, 0x87, 0x0, 0x1c, + 0x90, 0x1e, 0x50, 0x0, 0x87, 0x0, 0x0, 0xa2, + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, + + /* U+4E13 "专" */ + 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0xee, 0xef, + 0xee, 0xee, 0xee, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x2a, 0xaa, 0xce, 0xaa, 0xaa, 0xaa, + 0xa0, 0x33, 0x3c, 0x63, 0x33, 0x33, 0x33, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xdd, 0xdd, 0xde, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xc0, 0x0, 0x0, 0x1, 0x0, 0x8, 0xc0, + 0x0, 0x0, 0x1, 0xcc, 0x68, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xea, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+4E14 "且" */ + 0x0, 0xf, 0xee, 0xee, 0xee, 0xf2, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0xf, 0xaa, + 0xaa, 0xaa, 0xe2, 0x0, 0x0, 0xf, 0x33, 0x33, + 0x33, 0xd2, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xc2, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xc2, + 0x0, 0x0, 0xf, 0xee, 0xee, 0xee, 0xf2, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x3, 0x3f, + 0x33, 0x33, 0x33, 0xd5, 0x30, 0x2a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa2, + + /* U+4E16 "世" */ + 0x0, 0x0, 0x0, 0x67, 0x0, 0x10, 0x0, 0x0, + 0xe, 0x0, 0x67, 0x0, 0xc2, 0x0, 0x0, 0xe, + 0x0, 0x67, 0x0, 0xc2, 0x0, 0x0, 0xe, 0x0, + 0x67, 0x0, 0xc2, 0x0, 0x1e, 0xef, 0xee, 0xff, + 0xee, 0xfe, 0xe6, 0x0, 0xe, 0x0, 0x67, 0x0, + 0xc2, 0x0, 0x0, 0xe, 0x0, 0x67, 0x0, 0xc2, + 0x0, 0x0, 0xe, 0x0, 0x67, 0x0, 0xc2, 0x0, + 0x0, 0xe, 0x0, 0x6e, 0xdd, 0xf2, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xee, + 0xee, 0xee, 0xee, 0xc0, + + /* U+4E21 "両" */ + 0x2e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe2, 0x0, + 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x85, 0x0, 0x0, 0x0, 0x6, 0xee, 0xee, + 0xff, 0xee, 0xee, 0x70, 0x7, 0x60, 0x0, 0x85, + 0x0, 0x6, 0x70, 0x7, 0x61, 0x50, 0x85, 0x4, + 0x6, 0x70, 0x7, 0x62, 0xa0, 0x85, 0xc, 0x6, + 0x70, 0x7, 0x62, 0xa0, 0x85, 0xc, 0x6, 0x70, + 0x7, 0x62, 0xa0, 0x96, 0xc, 0x6, 0x70, 0x7, + 0x61, 0xcc, 0xcc, 0xcc, 0x6, 0x70, 0x7, 0x60, + 0x0, 0x0, 0x0, 0x6, 0x70, 0x7, 0x60, 0x0, + 0x0, 0x6, 0xdd, 0x40, + + /* U+4E26 "並" */ + 0x0, 0x8, 0x10, 0x0, 0x1, 0xa0, 0x0, 0x0, + 0x5, 0xb0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x1d, 0x0, 0x0, 0xc, 0xee, 0xee, + 0xee, 0xef, 0xee, 0xd0, 0x0, 0x0, 0xe, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x70, 0xe, 0x0, 0xe0, + 0x9, 0x10, 0x0, 0xd2, 0xe, 0x0, 0xe0, 0x2e, + 0x0, 0x0, 0x68, 0xe, 0x0, 0xe0, 0x78, 0x0, + 0x0, 0x2c, 0xe, 0x0, 0xe0, 0xd2, 0x0, 0x0, + 0xc, 0xe, 0x0, 0xe2, 0xa0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0xe0, 0x0, 0x0, 0x2b, 0xbb, 0xbf, + 0xbb, 0xfb, 0xbb, 0xb2, 0x3, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x30, + + /* U+4E2D "中" */ + 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0xd, 0xee, 0xee, 0xfe, 0xee, 0xef, 0xd1, 0x0, + 0xe, 0x10, 0x0, 0xfd, 0x10, 0x0, 0xe1, 0x0, + 0xf, 0xd1, 0x0, 0xe, 0x10, 0x0, 0xfd, 0x43, + 0x33, 0xe4, 0x33, 0x3f, 0xdb, 0xaa, 0xaf, 0xba, + 0xaa, 0xf7, 0x0, 0x0, 0xe1, 0x0, 0x7, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, + + /* U+4E3B "主" */ + 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x50, 0x0, 0x0, 0x8, 0xee, 0xee, + 0xef, 0xee, 0xee, 0x80, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x0, 0x0, 0xde, 0xee, 0xff, 0xee, 0xee, 0x0, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, + 0x88, 0x11, 0x11, 0x10, 0x2c, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc3, + + /* U+4E45 "久" */ + 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xf4, 0x33, 0x30, 0x0, 0x0, 0x0, 0x9, 0xdb, + 0xbb, 0xe5, 0x0, 0x0, 0x0, 0x2e, 0x10, 0x1, + 0xe0, 0x0, 0x0, 0x0, 0xd5, 0x0, 0x7, 0x90, + 0x0, 0x0, 0xb, 0x90, 0x0, 0xd, 0x50, 0x0, + 0x0, 0x3a, 0x0, 0x0, 0x7e, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe2, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x50, 0x2c, 0x0, 0x0, 0x0, 0x3, + 0xe6, 0x0, 0x8, 0xb0, 0x0, 0x0, 0x7e, 0x50, + 0x0, 0x0, 0xac, 0x20, 0x1e, 0xb2, 0x0, 0x0, + 0x0, 0x7, 0xf3, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, + + /* U+4E4B "之" */ + 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x0, 0x0, 0x0, 0x8, 0xee, 0xee, + 0xee, 0xee, 0xec, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x50, 0x0, 0x0, 0x0, 0x0, 0x6b, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb6, 0xd7, + 0x21, 0x1, 0x12, 0x31, 0x1b, 0x0, 0x17, 0xbd, + 0xdd, 0xdc, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4E4E "乎" */ + 0x0, 0x0, 0x0, 0x1, 0x35, 0x87, 0x0, 0x2, + 0xbc, 0xde, 0xfe, 0xb9, 0x63, 0x0, 0x0, 0x32, + 0x0, 0x59, 0x0, 0x5, 0x0, 0x0, 0x68, 0x0, + 0x59, 0x0, 0x6a, 0x0, 0x0, 0xe, 0x10, 0x59, + 0x0, 0xc3, 0x0, 0x0, 0x9, 0x60, 0x59, 0x4, + 0xa0, 0x0, 0x0, 0x1, 0x10, 0x59, 0x1, 0x10, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x69, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0xd4, + 0x0, 0x0, 0x0, + + /* U+4E4F "乏" */ + 0x0, 0x0, 0x0, 0x0, 0x24, 0x69, 0x10, 0x2, + 0xab, 0xcd, 0xed, 0xca, 0x74, 0x10, 0x0, 0x32, + 0x13, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, + 0x0, 0x0, 0x0, 0x4, 0xee, 0xee, 0xee, 0xee, + 0xec, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x9b, + 0xda, 0x10, 0x0, 0x0, 0x0, 0x9, 0x84, 0xe7, + 0x0, 0x0, 0x0, 0x11, 0x1c, 0x0, 0x29, 0xee, + 0xdd, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4E57 "乗" */ + 0x0, 0x0, 0x0, 0x1, 0x35, 0x86, 0x0, 0x2, + 0xcd, 0xdd, 0xed, 0xa8, 0x52, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x0, 0x0, 0x0, 0x6, 0xdd, 0xdd, + 0xee, 0xdd, 0xdd, 0x80, 0x0, 0x8, 0x50, 0x76, + 0x5, 0x80, 0x0, 0x0, 0x8, 0x50, 0x76, 0x5, + 0x80, 0x0, 0x2d, 0xde, 0xed, 0xee, 0xde, 0xed, + 0xd2, 0x0, 0x8, 0x50, 0x76, 0x5, 0x80, 0x0, + 0x8, 0xde, 0xed, 0xee, 0xde, 0xed, 0x90, 0x0, + 0x0, 0x2c, 0xcc, 0xc2, 0x0, 0x0, 0x0, 0x7, + 0xd3, 0x76, 0x4d, 0x60, 0x0, 0x19, 0xe8, 0x10, + 0x76, 0x1, 0x9e, 0x81, 0x6, 0x0, 0x0, 0x76, + 0x0, 0x1, 0x80, + + /* U+4E5D "九" */ + 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xee, 0xff, 0xee, + 0xef, 0x10, 0x0, 0x0, 0x0, 0x2c, 0x0, 0xe, + 0x10, 0x0, 0x0, 0x0, 0x5a, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0x87, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x5, 0xc0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x2e, + 0x30, 0x0, 0xe, 0x10, 0x37, 0x4, 0xd6, 0x0, + 0x0, 0xe, 0x10, 0x49, 0x4e, 0x40, 0x0, 0x0, + 0x9, 0xee, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4E5F "也" */ + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x0, 0xe, 0x0, 0x3, 0x0, 0x0, 0xe, 0x0, + 0xe, 0x5a, 0xde, 0x30, 0x0, 0xf, 0x37, 0xcf, + 0x73, 0xc, 0x20, 0x5, 0x9f, 0xa5, 0x1e, 0x0, + 0xc, 0x10, 0x58, 0x3f, 0x0, 0xe, 0x0, 0xe, + 0x0, 0x0, 0xe, 0x0, 0xe, 0x0, 0x1d, 0x0, + 0x0, 0xe, 0x0, 0xe, 0x2d, 0xd5, 0x0, 0x0, + 0xe, 0x0, 0xc, 0x0, 0x0, 0x72, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x1, 0xe0, 0x0, 0x5, 0xdd, 0xdd, + 0xdd, 0xed, 0x50, + + /* U+4E86 "了" */ + 0x5d, 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, 0x1, 0x11, + 0x11, 0x11, 0x1b, 0xa0, 0x0, 0x0, 0x0, 0x2, + 0xc9, 0x0, 0x0, 0x0, 0x0, 0x7d, 0x40, 0x0, + 0x0, 0x0, 0x3, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb0, + 0x0, 0x0, 0x0, 0xe, 0xee, 0x60, 0x0, 0x0, + + /* U+4E88 "予" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9d, 0xdd, 0xdd, 0xdd, 0xfa, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x1b, 0xa0, 0x0, 0x0, 0x0, 0x6d, + 0x86, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xb3, 0x0, 0x0, 0xb, 0xbb, 0xbb, 0xbc, 0xfe, + 0xbb, 0xc3, 0x2, 0x22, 0x22, 0x4d, 0x22, 0x26, + 0xd0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x1d, 0x30, + 0x0, 0x0, 0x0, 0x2c, 0x0, 0x76, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7e, 0xd7, + 0x0, 0x0, 0x0, + + /* U+4E89 "争" */ + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xee, 0xcc, 0xcc, 0x20, 0x0, 0x0, 0xb, + 0x50, 0x0, 0x7b, 0x0, 0x0, 0x1, 0xd7, 0x0, + 0x3, 0xe1, 0x0, 0x0, 0x7, 0xbd, 0xdd, 0xee, + 0xdd, 0xeb, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, + 0x3b, 0x0, 0x2c, 0xcc, 0xcc, 0xee, 0xcc, 0xdf, + 0xc8, 0x0, 0x0, 0x0, 0x88, 0x0, 0x4b, 0x0, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x3b, 0x0, 0x0, + 0xdd, 0xdd, 0xee, 0xdd, 0xda, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xd3, + 0x0, 0x0, 0x0, + + /* U+4E8B "事" */ + 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0xa, + 0xbb, 0xbb, 0xde, 0xbb, 0xbb, 0xb3, 0x1, 0x11, + 0x11, 0x89, 0x11, 0x11, 0x10, 0x0, 0x8c, 0xaa, + 0xdd, 0xaa, 0xbc, 0x0, 0x0, 0x85, 0x0, 0x68, + 0x0, 0x1d, 0x0, 0x0, 0x6a, 0xaa, 0xdd, 0xaa, + 0xa9, 0x0, 0x0, 0x55, 0x55, 0xab, 0x55, 0x55, + 0x0, 0x0, 0x44, 0x44, 0x9a, 0x44, 0x4e, 0x10, + 0xc, 0xcc, 0xcc, 0xde, 0xcc, 0xcf, 0xc6, 0x0, + 0x0, 0x0, 0x68, 0x0, 0xd, 0x10, 0x1, 0xcc, + 0xcc, 0xde, 0xcc, 0xcf, 0x10, 0x0, 0x0, 0x0, + 0x78, 0x0, 0x8, 0x0, 0x0, 0x0, 0x7c, 0xd5, + 0x0, 0x0, 0x0, + + /* U+4E8C "二" */ + 0x0, 0xee, 0xee, 0xee, 0xee, 0xee, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0x2d, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3, + + /* U+4E94 "五" */ + 0x0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x3, + 0xcc, 0xcd, 0xfc, 0xcc, 0xcc, 0x20, 0x0, 0x0, + 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0xdf, 0xed, 0xde, + 0xd0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x3, 0xb0, + 0x0, 0x0, 0x0, 0x2d, 0x0, 0x5, 0xa0, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x8, 0x60, 0x0, 0x2d, 0xdd, + 0xfe, 0xdd, 0xde, 0xed, 0xd3, 0x1, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x10, + + /* U+4E9B "些" */ + 0x0, 0x3, 0xa0, 0x4, 0xa0, 0x0, 0x0, 0x0, + 0x3, 0xa0, 0x4, 0xa0, 0x0, 0x0, 0x6, 0x63, + 0xb0, 0x4, 0xa0, 0x6e, 0x40, 0x6, 0x63, 0xec, + 0xb4, 0xec, 0x71, 0x0, 0x6, 0x63, 0xa0, 0x4, + 0xa0, 0x0, 0x20, 0x6, 0x63, 0xa0, 0x14, 0xa0, + 0x0, 0x94, 0x2b, 0xdc, 0xfe, 0xc2, 0xed, 0xcd, + 0xe0, 0x28, 0x53, 0x10, 0x0, 0x1, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xdd, 0xdd, 0xdd, 0xda, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xe2, + + /* U+4EA1 "亡" */ + 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x2e, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xe3, 0x0, 0x2d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xee, + 0xee, 0xee, 0xee, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+4EA4 "交" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x79, 0x0, 0x0, 0x0, 0xe, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xe0, 0x0, 0x0, 0x51, 0x0, + 0x5, 0x0, 0x0, 0x0, 0x8, 0xb0, 0x0, 0xa, + 0xb1, 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0x6d, + 0x10, 0xa, 0x80, 0xb2, 0x0, 0x2d, 0x5, 0xc0, + 0x0, 0x0, 0x4b, 0x0, 0xa6, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x86, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xee, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0xa9, 0xd4, 0x0, 0x0, 0x2, 0x6b, 0xd4, 0x0, + 0x3c, 0xc8, 0x40, 0x1d, 0x93, 0x0, 0x0, 0x0, + 0x27, 0xb1, + + /* U+4EA6 "亦" */ + 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xdf, + 0xdd, 0xee, 0xdd, 0xd1, 0x0, 0x0, 0xe, 0x0, + 0x86, 0x0, 0x0, 0x0, 0x35, 0xe, 0x0, 0x86, + 0x51, 0x0, 0x0, 0xa5, 0xe, 0x0, 0x86, 0x5a, + 0x0, 0x1, 0xe0, 0x1d, 0x0, 0x86, 0xc, 0x30, + 0xa, 0x70, 0x5a, 0x0, 0x86, 0x5, 0xa0, 0x8, + 0x0, 0xb5, 0x0, 0x86, 0x0, 0xd0, 0x0, 0x5, + 0xc0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x4e, 0x30, + 0x0, 0x86, 0x0, 0x0, 0x1, 0xd4, 0x0, 0xbe, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4EAC "京" */ + 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x1e, 0xee, + 0xee, 0xef, 0xee, 0xee, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xdd, 0xdd, + 0xdd, 0xd6, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x5e, 0xdd, 0xdd, 0xdd, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x78, 0x1, 0xc1, 0x0, 0x0, 0xc5, + 0x0, 0x78, 0x0, 0x6c, 0x0, 0xc, 0x70, 0x0, + 0x78, 0x0, 0x9, 0xa0, 0x4, 0x0, 0xad, 0xe4, + 0x0, 0x0, 0x50, + + /* U+4EBA "人" */ + 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x9e, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x49, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x3, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0xb6, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0x0, 0x2e, 0x30, 0x0, 0x0, 0x7d, + 0x10, 0x0, 0x4, 0xe3, 0x0, 0x1b, 0xc1, 0x0, + 0x0, 0x0, 0x4d, 0x80, 0x27, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x70, + + /* U+4EC0 "什" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x5, + 0xb0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x6d, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x3, 0xfd, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0xd, 0x8d, 0x2e, 0xee, 0xef, 0xee, + 0xea, 0x8, 0x1d, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4ECA "今" */ + 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xed, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0x21, 0xc5, 0x0, 0x0, 0x0, 0x7, 0xd2, + 0x0, 0x1c, 0x80, 0x0, 0x3, 0xca, 0x13, 0xd3, + 0x0, 0xad, 0x40, 0x3e, 0x40, 0x0, 0x3d, 0x40, + 0x4, 0xd3, 0x0, 0x0, 0x0, 0x2, 0x50, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4ECB "介" */ + 0x0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x24, 0xd2, 0x0, 0x0, 0x0, 0x5, 0xd2, + 0x0, 0x4e, 0x50, 0x0, 0x2, 0xad, 0x20, 0x0, + 0x2, 0xcb, 0x40, 0x4e, 0x70, 0x50, 0x0, 0x5, + 0x6, 0xd4, 0x0, 0x0, 0xe0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x1, 0xe0, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x6, 0xa0, 0x0, 0xe, 0x10, 0x0, 0x0, 0xd, + 0x40, 0x0, 0xe, 0x10, 0x0, 0x1, 0xb9, 0x0, + 0x0, 0xe, 0x10, 0x0, 0xa, 0x70, 0x0, 0x0, + 0xe, 0x10, 0x0, + + /* U+4ECD "仍" */ + 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb7, 0xdd, 0xdd, 0xdd, 0x0, 0x0, 0xb4, 0x0, + 0xd1, 0x0, 0xd0, 0x0, 0x3f, 0x0, 0xd, 0x10, + 0x3a, 0x0, 0xd, 0xf0, 0x0, 0xe0, 0x7, 0x60, + 0x7, 0xae, 0x0, 0xe, 0x0, 0xbe, 0xdb, 0x31, + 0xe0, 0x2, 0xc0, 0x0, 0x2, 0xc0, 0xe, 0x0, + 0x4a, 0x0, 0x0, 0x3b, 0x0, 0xe0, 0x8, 0x70, + 0x0, 0x4, 0xa0, 0xe, 0x0, 0xd2, 0x0, 0x0, + 0x68, 0x0, 0xe0, 0x3d, 0x0, 0x0, 0x7, 0x60, + 0xe, 0xd, 0x40, 0x0, 0x0, 0xb3, 0x0, 0xe5, + 0x90, 0x0, 0x5e, 0xeb, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+4ED5 "仕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x5, + 0xc0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xc, 0x40, + 0x0, 0x2c, 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x2d, + 0x0, 0x0, 0xc, 0xbc, 0x5d, 0xdd, 0xef, 0xdd, + 0xdc, 0x3b, 0x2c, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x0, 0x2c, 0x2, 0x22, + 0x4d, 0x22, 0x22, 0x0, 0x2c, 0xb, 0xbb, 0xbb, + 0xbb, 0xb8, + + /* U+4ED6 "他" */ + 0x0, 0x9, 0x20, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x2d, 0x3, 0x0, 0xb2, 0x0, 0x0, 0x0, 0xa7, + 0xd, 0x10, 0xb2, 0x0, 0x10, 0x3, 0xf1, 0xd, + 0x10, 0xb6, 0x9e, 0xa0, 0x1e, 0xf0, 0xd, 0x48, + 0xfb, 0x54, 0xa0, 0xa9, 0xe0, 0x6f, 0xc6, 0xc2, + 0x3, 0xa0, 0x50, 0xe3, 0x8e, 0x10, 0xb2, 0x4, + 0x90, 0x0, 0xe0, 0xd, 0x10, 0xb2, 0x5, 0x80, + 0x0, 0xe0, 0xd, 0x10, 0xb4, 0xad, 0x40, 0x0, + 0xe0, 0xd, 0x10, 0x82, 0x21, 0x10, 0x0, 0xe0, + 0xd, 0x10, 0x0, 0x0, 0xa3, 0x0, 0xe0, 0xc, + 0x30, 0x0, 0x0, 0xd1, 0x0, 0xe0, 0x6, 0xdd, + 0xdd, 0xdd, 0x90, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4ED8 "付" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x5, + 0xb0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0xd, 0x40, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x5d, 0xc, 0xdd, + 0xdd, 0xdf, 0xd7, 0x1, 0xec, 0x1, 0x11, 0x11, + 0x5c, 0x11, 0xd, 0x9c, 0x0, 0x20, 0x0, 0x3b, + 0x0, 0x7, 0x2c, 0x0, 0xc4, 0x0, 0x3b, 0x0, + 0x0, 0x2c, 0x0, 0x3e, 0x0, 0x3b, 0x0, 0x0, + 0x2c, 0x0, 0x9, 0x80, 0x3b, 0x0, 0x0, 0x2c, + 0x0, 0x1, 0x50, 0x3b, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x2b, 0x0, 0x2, 0xee, + 0xd5, 0x0, + + /* U+4EE3 "代" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb2, 0x2, 0xc0, 0x83, 0x0, 0x0, 0x4, + 0xc0, 0x1, 0xd0, 0x1d, 0x40, 0x0, 0xd, 0x30, + 0x0, 0xe0, 0x1, 0xb0, 0x0, 0x7e, 0x0, 0x0, + 0xe0, 0x1, 0x31, 0x4, 0xed, 0x15, 0x79, 0xfd, + 0xed, 0xb3, 0x3e, 0x4d, 0x39, 0x75, 0xc4, 0x0, + 0x0, 0x44, 0x1d, 0x0, 0x0, 0x95, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0xe, 0x10, 0x3, 0x0, 0x1d, 0x0, + 0x0, 0x9, 0x80, 0x39, 0x0, 0x1d, 0x0, 0x0, + 0x1, 0xe6, 0x76, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x3e, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4EE4 "令" */ + 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x76, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xd5, + 0x0, 0x4d, 0x50, 0x0, 0x1, 0x9d, 0x31, 0xd3, + 0x2, 0xcb, 0x20, 0x3e, 0x70, 0x0, 0x3d, 0x20, + 0x5, 0xe4, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, + 0x0, 0x0, 0x8d, 0xdd, 0xdd, 0xdd, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xb0, 0x0, 0x0, + 0x0, 0x24, 0x0, 0x8c, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xa8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, + + /* U+4EE5 "以" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, + 0x1, 0x0, 0x0, 0xa5, 0x0, 0xe, 0x10, 0xb6, + 0x0, 0xb, 0x40, 0x0, 0xe1, 0x1, 0xd2, 0x0, + 0xc2, 0x0, 0xe, 0x10, 0x6, 0xa0, 0xe, 0x0, + 0x0, 0xe1, 0x0, 0x4, 0x1, 0xe0, 0x0, 0xe, + 0x10, 0x0, 0x0, 0x69, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0xa, 0x40, 0x0, 0xe, 0x10, 0x23, 0x1, + 0xe0, 0x0, 0x0, 0xe4, 0xad, 0x40, 0xaf, 0x60, + 0x0, 0x3f, 0xd5, 0x0, 0x6c, 0x1d, 0x60, 0x6, + 0x50, 0x0, 0x7e, 0x10, 0x1e, 0x40, 0x0, 0x2, + 0xd9, 0x10, 0x0, 0x3e, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, + + /* U+4EEE "仮" */ + 0x0, 0x8, 0x40, 0x0, 0x0, 0x26, 0x30, 0x0, + 0x1e, 0x7, 0xab, 0xcc, 0xb7, 0x20, 0x0, 0x88, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x1, 0xe1, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xa, 0xf0, 0xc, 0x31, + 0x11, 0x12, 0x0, 0x7d, 0xe0, 0xd, 0xde, 0xcc, + 0xce, 0x60, 0x92, 0xe0, 0xe, 0x2c, 0x0, 0xd, + 0x10, 0x0, 0xe0, 0xe, 0xb, 0x30, 0x3b, 0x0, + 0x0, 0xe0, 0x1c, 0x3, 0xc0, 0xc3, 0x0, 0x0, + 0xe0, 0x5a, 0x0, 0x9c, 0x90, 0x0, 0x0, 0xe0, + 0x95, 0x0, 0x8f, 0x70, 0x0, 0x0, 0xe1, 0xe0, + 0x3c, 0x91, 0xca, 0x20, 0x0, 0xe6, 0x64, 0xc4, + 0x0, 0x6, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4EF6 "件" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x41, 0x30, 0xb3, 0x0, 0x0, 0x0, 0x2e, + 0x5, 0x90, 0xb3, 0x0, 0x0, 0x0, 0x98, 0x9, + 0x60, 0xb3, 0x0, 0x0, 0x2, 0xf2, 0xe, 0xfe, + 0xff, 0xee, 0x60, 0xd, 0xf1, 0x5b, 0x0, 0xb3, + 0x0, 0x0, 0x8b, 0xd1, 0xa3, 0x0, 0xb3, 0x0, + 0x0, 0x31, 0xd1, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xd1, 0xbe, 0xee, 0xff, 0xee, 0xe1, 0x0, + 0xd1, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0xb3, + 0x0, 0x0, + + /* U+4EFB "任" */ + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x3, 0x60, 0x0, + 0x4, 0xc1, 0x46, 0x9c, 0xeb, 0x70, 0x0, 0xd, + 0x3a, 0x97, 0x6d, 0x0, 0x0, 0x0, 0x6d, 0x0, + 0x0, 0x1c, 0x0, 0x0, 0x3, 0xfc, 0x0, 0x0, + 0x1c, 0x0, 0x0, 0x2e, 0x6c, 0x0, 0x0, 0x1c, + 0x0, 0x0, 0x15, 0x2c, 0x7e, 0xee, 0xef, 0xee, + 0xec, 0x0, 0x2c, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x2c, 0x2, + 0x22, 0x3d, 0x22, 0x21, 0x0, 0x2c, 0xb, 0xcc, + 0xcc, 0xcc, 0xc7, + + /* U+4EFD "份" */ + 0x0, 0x3, 0x10, 0x0, 0x0, 0x10, 0x0, 0x0, + 0xd, 0x20, 0x4b, 0x4, 0xa0, 0x0, 0x0, 0x5b, + 0x0, 0xa5, 0x0, 0xe0, 0x0, 0x0, 0xc3, 0x1, + 0xe0, 0x0, 0x97, 0x0, 0x7, 0xf1, 0xc, 0x70, + 0x0, 0x1e, 0x30, 0x3e, 0xe1, 0xac, 0x0, 0x0, + 0x6, 0xe2, 0x75, 0xd1, 0x99, 0xdf, 0xed, 0xec, + 0x62, 0x0, 0xd1, 0x0, 0xc, 0x10, 0x2b, 0x0, + 0x0, 0xd1, 0x0, 0xe, 0x0, 0x3a, 0x0, 0x0, + 0xd1, 0x0, 0x59, 0x0, 0x59, 0x0, 0x0, 0xd1, + 0x0, 0xd3, 0x0, 0x77, 0x0, 0x0, 0xd1, 0xa, + 0x80, 0x0, 0xa5, 0x0, 0x0, 0xd1, 0x87, 0x0, + 0x9d, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4F01 "企" */ + 0x0, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x77, 0xa0, 0x0, 0x0, 0x0, 0x2, 0xc6, + 0x0, 0x7c, 0x10, 0x0, 0x0, 0x6e, 0x50, 0x36, + 0x4, 0xd8, 0x0, 0x3d, 0x91, 0x0, 0x59, 0x0, + 0x8, 0xe4, 0x2, 0x1, 0x0, 0x59, 0x0, 0x0, + 0x20, 0x0, 0xd, 0x0, 0x5f, 0xdd, 0xd9, 0x0, + 0x0, 0xd, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, + 0x59, 0x0, 0x0, 0x0, 0xc, 0xef, 0xdd, 0xef, + 0xdd, 0xdd, 0xd0, + + /* U+4F0A "伊" */ + 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x5d, 0xdd, 0xdd, 0xdd, 0x0, 0x0, 0x88, + 0x0, 0xa, 0x30, 0xe, 0x0, 0x2, 0xf2, 0x0, + 0xa, 0x30, 0xe, 0x0, 0xd, 0xf4, 0xaa, 0xae, + 0xca, 0xaf, 0xa0, 0xa9, 0xc3, 0x33, 0x3b, 0x63, + 0x3e, 0x30, 0x60, 0xc2, 0x0, 0xa, 0x30, 0xe, + 0x0, 0x0, 0xc2, 0x0, 0xb, 0x30, 0xe, 0x0, + 0x0, 0xc2, 0x7d, 0xdf, 0xed, 0xdf, 0x0, 0x0, + 0xc2, 0x0, 0x3c, 0x0, 0x5, 0x0, 0x0, 0xc2, + 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0xc2, 0x1b, + 0x80, 0x0, 0x0, 0x0, 0x0, 0xc3, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4F11 "休" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x6, + 0xb0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0xd, 0x40, + 0x0, 0xb2, 0x0, 0x0, 0x0, 0x6e, 0x0, 0x0, + 0xb2, 0x0, 0x0, 0x2, 0xfc, 0x8e, 0xef, 0xff, + 0xee, 0xe4, 0x1d, 0xac, 0x0, 0x8, 0xfe, 0x10, + 0x0, 0x39, 0x2c, 0x0, 0x1d, 0xc8, 0xa0, 0x0, + 0x0, 0x2c, 0x0, 0x86, 0xb3, 0xc3, 0x0, 0x0, + 0x2c, 0x2, 0xd0, 0xb2, 0x3c, 0x0, 0x0, 0x2c, + 0x1d, 0x40, 0xb2, 0x9, 0xa0, 0x0, 0x2c, 0xc7, + 0x0, 0xb2, 0x0, 0xb6, 0x0, 0x2c, 0x10, 0x0, + 0xb2, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xb2, + 0x0, 0x0, + + /* U+4F1A "会" */ + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xa7, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xc9, + 0x0, 0x5d, 0x50, 0x0, 0x2, 0xaf, 0x82, 0x22, + 0x24, 0xbd, 0x50, 0x1d, 0x83, 0xbb, 0xbb, 0xbb, + 0x53, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xee, 0xee, 0xee, 0xee, 0xee, 0xd0, + 0x0, 0x0, 0x1d, 0x40, 0x2, 0x0, 0x0, 0x0, + 0x0, 0xb6, 0x0, 0x1c, 0x50, 0x0, 0x0, 0xa, + 0x80, 0x0, 0x2, 0xe4, 0x0, 0x0, 0xbf, 0xac, + 0xde, 0xec, 0xbe, 0x20, 0x0, 0x65, 0x32, 0x10, + 0x0, 0x5, 0x50, + + /* U+4F1D "伝" */ + 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xa, 0xdd, 0xdd, 0xdd, 0x30, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xe0, 0x8b, 0xbb, 0xbb, + 0xbb, 0xb0, 0x31, 0xe0, 0x12, 0x2e, 0x52, 0x22, + 0x20, 0x0, 0xe0, 0x0, 0x5c, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0xc4, 0x0, 0xd2, 0x0, 0x0, + 0xe0, 0x5, 0xb0, 0x0, 0x5a, 0x0, 0x0, 0xe0, + 0x1e, 0x43, 0x46, 0x7f, 0x20, 0x0, 0xe0, 0x7f, + 0xdb, 0x97, 0x68, 0xa0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xa0, + + /* U+4F38 "伸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0xe, 0x0, 0x0, 0x0, 0x4b, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xb, 0x59, 0xbb, 0xbf, + 0xbb, 0xbb, 0x4, 0xf0, 0xd2, 0x11, 0xe1, 0x11, + 0xe1, 0xef, 0xd, 0x0, 0xe, 0x0, 0xe, 0xb8, + 0xe0, 0xdd, 0xdd, 0xfd, 0xdd, 0xe4, 0xe, 0xd, + 0x10, 0xe, 0x0, 0xe, 0x0, 0xe0, 0xd0, 0x0, + 0xe0, 0x0, 0xe0, 0xe, 0xd, 0xed, 0xdf, 0xdd, + 0xde, 0x0, 0xe0, 0x90, 0x0, 0xe0, 0x0, 0x80, + 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0xe, 0x0, 0x0, + + /* U+4F3C "似" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x6, 0x0, 0x0, 0xe, 0x0, 0x0, 0x87, + 0xe, 0x1d, 0x0, 0xe, 0x0, 0x0, 0xe1, 0xe, + 0x9, 0x60, 0x1d, 0x0, 0x9, 0xf0, 0xe, 0x1, + 0xd0, 0x2c, 0x0, 0x4d, 0xe0, 0xe, 0x0, 0xc3, + 0x4a, 0x0, 0x93, 0xe0, 0xe, 0x0, 0x20, 0x77, + 0x0, 0x0, 0xe0, 0xe, 0x0, 0x0, 0xa6, 0x0, + 0x0, 0xe0, 0xe, 0x2, 0x71, 0xec, 0x0, 0x0, + 0xe0, 0xe, 0x8d, 0x37, 0x9b, 0x40, 0x0, 0xe0, + 0x3f, 0x80, 0x1e, 0x13, 0xc0, 0x0, 0xe0, 0x14, + 0x1, 0xd6, 0x0, 0xd2, 0x0, 0xe0, 0x0, 0x6, + 0x70, 0x0, 0x41, + + /* U+4F46 "但" */ + 0x0, 0x6, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x2a, 0xee, 0xee, 0xee, 0x10, 0x0, 0x6a, + 0xb, 0x30, 0x0, 0xe, 0x10, 0x0, 0xe3, 0xb, + 0x30, 0x0, 0xe, 0x10, 0xb, 0xf2, 0xb, 0x30, + 0x0, 0xe, 0x10, 0x7d, 0xc2, 0xb, 0xed, 0xdd, + 0xdf, 0x10, 0x72, 0xb2, 0xb, 0x30, 0x0, 0xe, + 0x10, 0x0, 0xb2, 0xb, 0x30, 0x0, 0xe, 0x10, + 0x0, 0xb2, 0xb, 0x30, 0x0, 0xe, 0x10, 0x0, + 0xb2, 0xa, 0xee, 0xee, 0xee, 0x10, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x22, + 0x22, 0x22, 0x22, 0x20, 0x0, 0xb2, 0xab, 0xbb, + 0xbb, 0xbb, 0xb3, + + /* U+4F4D "位" */ + 0x0, 0x0, 0x50, 0x0, 0x52, 0x0, 0x0, 0x0, + 0x3, 0xc0, 0x0, 0x78, 0x0, 0x0, 0x0, 0xb, + 0x50, 0x0, 0x28, 0x0, 0x0, 0x0, 0x3d, 0x8, + 0xee, 0xee, 0xee, 0xe0, 0x1, 0xeb, 0x0, 0x0, + 0x0, 0x3, 0x0, 0xb, 0xcb, 0x0, 0x85, 0x0, + 0xf, 0x0, 0x1a, 0x3b, 0x0, 0x58, 0x0, 0x3c, + 0x0, 0x0, 0x3b, 0x0, 0x2b, 0x0, 0x59, 0x0, + 0x0, 0x3b, 0x0, 0xe, 0x0, 0x86, 0x0, 0x0, + 0x3b, 0x0, 0xd, 0x10, 0xb2, 0x0, 0x0, 0x3b, + 0x0, 0xb, 0x20, 0xd0, 0x0, 0x0, 0x3b, 0x2, + 0x23, 0x25, 0xb2, 0x21, 0x0, 0x3b, 0x2b, 0xbb, + 0xbb, 0xbb, 0xb6, + + /* U+4F4E "低" */ + 0x0, 0x3, 0x10, 0x0, 0x0, 0x15, 0x0, 0x0, + 0xd, 0x21, 0x46, 0x9d, 0xc8, 0x10, 0x0, 0x5a, + 0xe, 0x96, 0x4d, 0x0, 0x0, 0x0, 0xd3, 0xd, + 0x0, 0xe, 0x0, 0x0, 0x8, 0xf0, 0xd, 0x0, + 0xe, 0x0, 0x0, 0x5e, 0xe0, 0xd, 0x11, 0x1d, + 0x21, 0x10, 0xb3, 0xd0, 0xe, 0xcc, 0xce, 0xcc, + 0xc0, 0x0, 0xd0, 0xd, 0x0, 0x9, 0x40, 0x0, + 0x0, 0xd0, 0xd, 0x0, 0x7, 0x70, 0x0, 0x0, + 0xd0, 0xd, 0x0, 0x4, 0xa0, 0x0, 0x0, 0xd0, + 0xd, 0x0, 0xb0, 0xe0, 0x83, 0x0, 0xd0, 0xe, + 0x59, 0x76, 0x99, 0xb1, 0x0, 0xd0, 0x5d, 0x83, + 0x8, 0xa, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4F4F "住" */ + 0x0, 0x0, 0x80, 0x0, 0x90, 0x0, 0x0, 0x0, + 0x4, 0xb0, 0x0, 0x88, 0x0, 0x0, 0x0, 0xc, + 0x40, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x5d, 0xe, + 0xee, 0xef, 0xee, 0xe6, 0x2, 0xfb, 0x0, 0x0, + 0x4a, 0x0, 0x0, 0xd, 0xab, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x7, 0x3b, 0x0, 0x0, 0x4a, 0x0, + 0x0, 0x0, 0x3b, 0x8, 0xee, 0xef, 0xee, 0xe0, + 0x0, 0x3b, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x3b, 0x1, + 0x11, 0x5a, 0x11, 0x10, 0x0, 0x3b, 0x5d, 0xdd, + 0xdd, 0xdd, 0xd8, + + /* U+4F53 "体" */ + 0x0, 0xb, 0x10, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x96, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x2, 0xf1, 0xee, + 0xee, 0xfe, 0xee, 0xe2, 0xb, 0xf0, 0x0, 0xc, + 0xfb, 0x0, 0x0, 0x6d, 0xe0, 0x0, 0x59, 0xea, + 0x30, 0x0, 0x63, 0xe0, 0x0, 0xc2, 0xe3, 0xb0, + 0x0, 0x0, 0xe0, 0x4, 0x90, 0xe0, 0xc2, 0x0, + 0x0, 0xe0, 0x1d, 0x20, 0xe0, 0x3c, 0x0, 0x0, + 0xe0, 0xb7, 0x33, 0xe3, 0x39, 0xa0, 0x0, 0xe4, + 0x84, 0xaa, 0xfa, 0xa2, 0xa2, 0x0, 0xe0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0xd0, 0x0, 0x0, + + /* U+4F55 "何" */ + 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x21, 0x11, 0x11, 0x11, 0x10, 0x0, 0x79, + 0x7c, 0xcc, 0xcc, 0xcf, 0xc0, 0x0, 0xe4, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xa, 0xf2, 0x2, 0x22, + 0x20, 0xe, 0x0, 0x5e, 0xd2, 0x2e, 0xaa, 0xe2, + 0xe, 0x0, 0x43, 0xc2, 0x2a, 0x0, 0xb2, 0xe, + 0x0, 0x0, 0xc2, 0x2a, 0x0, 0xb2, 0xe, 0x0, + 0x0, 0xc2, 0x2e, 0xaa, 0xe2, 0xe, 0x0, 0x0, + 0xc2, 0x2b, 0x22, 0x20, 0xe, 0x0, 0x0, 0xc2, + 0x16, 0x0, 0x0, 0xe, 0x0, 0x0, 0xc2, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x9f, 0xea, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4F59 "余" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xb9, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, + 0x0, 0x7c, 0x10, 0x0, 0x0, 0x3c, 0x80, 0x0, + 0x5, 0xd7, 0x0, 0x2a, 0xc9, 0xaa, 0xaa, 0xaa, + 0x98, 0xe5, 0x16, 0x1, 0x33, 0x7b, 0x33, 0x20, + 0x22, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, + 0x8, 0xee, 0xee, 0xef, 0xee, 0xee, 0xd0, 0x0, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x80, 0x4a, 0x7, 0xa0, 0x0, 0x0, 0x6c, 0x0, + 0x4a, 0x0, 0x9b, 0x0, 0x9, 0xb1, 0x0, 0x5a, + 0x0, 0x9, 0xa0, 0x3, 0x0, 0x4e, 0xe6, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4F5C "作" */ + 0x0, 0x0, 0x40, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xd0, 0xd, 0x10, 0x0, 0x0, 0x0, 0xb, + 0x50, 0x5c, 0x22, 0x22, 0x21, 0x0, 0x3e, 0x0, + 0xcb, 0xfc, 0xbb, 0xb5, 0x1, 0xdb, 0x6, 0xa0, + 0xd1, 0x0, 0x0, 0xb, 0xcb, 0x2e, 0x10, 0xd3, + 0x22, 0x20, 0x1b, 0x3b, 0x24, 0x0, 0xdc, 0xbb, + 0xb2, 0x0, 0x3b, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0xdd, 0xdd, 0xd4, 0x0, 0x3b, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0xd1, 0x0, 0x0, + + /* U+4F60 "你" */ + 0x0, 0x6, 0x20, 0x80, 0x0, 0x0, 0x0, 0x1, + 0xe0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x88, 0x6, + 0x80, 0x0, 0x0, 0x0, 0x1f, 0x10, 0xce, 0xdf, + 0xed, 0xee, 0xc, 0xf0, 0x5b, 0x0, 0xc2, 0x2, + 0xb9, 0xbe, 0xc, 0x30, 0xc, 0x20, 0x57, 0x70, + 0xe0, 0x11, 0x90, 0xc2, 0x74, 0x0, 0xe, 0x0, + 0x68, 0xc, 0x23, 0xb0, 0x0, 0xe0, 0xb, 0x30, + 0xc2, 0xc, 0x20, 0xe, 0x4, 0xc0, 0xc, 0x20, + 0x77, 0x0, 0xe0, 0xa3, 0x0, 0xc2, 0x2, 0xb0, + 0xe, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0xd0, + 0x0, 0x4e, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+4F7F "使" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x40, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x98, 0xcd, + 0xdd, 0xfd, 0xdd, 0xd1, 0x3, 0xf3, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xd, 0xf2, 0x6d, 0xcc, 0xfc, + 0xcc, 0x80, 0xaa, 0xc2, 0x76, 0x0, 0xe0, 0x4, + 0x90, 0x50, 0xc2, 0x76, 0x0, 0xe0, 0x4, 0x90, + 0x0, 0xc2, 0x7e, 0xcc, 0xfc, 0xcd, 0x90, 0x0, + 0xc2, 0x26, 0x2, 0xc0, 0x0, 0x0, 0x0, 0xc2, + 0xb, 0x57, 0x80, 0x0, 0x0, 0x0, 0xc2, 0x0, + 0xbf, 0x30, 0x0, 0x0, 0x0, 0xc2, 0x17, 0xd6, + 0xcb, 0x62, 0x0, 0x0, 0xc4, 0xc7, 0x0, 0x3, + 0x7b, 0xc0, + + /* U+4F86 "來" */ + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0xe, 0xee, + 0xee, 0xff, 0xee, 0xee, 0xe1, 0x0, 0x5, 0x20, + 0x87, 0x0, 0x80, 0x0, 0x0, 0xe, 0x10, 0x87, + 0x3, 0xc0, 0x0, 0x0, 0x5f, 0x30, 0x87, 0x9, + 0xd1, 0x0, 0x1, 0xe6, 0xe3, 0x99, 0x4d, 0x5d, + 0x20, 0xc, 0x70, 0x35, 0xff, 0xa2, 0x3, 0xc0, + 0x2, 0x0, 0x3c, 0xa9, 0xd2, 0x0, 0x0, 0x0, + 0x4, 0xd2, 0x87, 0x2d, 0x30, 0x0, 0x0, 0x8d, + 0x20, 0x87, 0x3, 0xe8, 0x0, 0x2e, 0x80, 0x0, + 0x87, 0x0, 0x1a, 0xe2, 0x2, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x20, + + /* U+4F8B "例" */ + 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x7, + 0x7b, 0xef, 0xee, 0x0, 0xd, 0x0, 0xc2, 0x6, + 0x80, 0x4, 0x80, 0xd0, 0x3f, 0x0, 0xb4, 0x0, + 0x48, 0xd, 0xc, 0xe0, 0xf, 0xed, 0x84, 0x80, + 0xd5, 0xce, 0x4, 0xa0, 0x57, 0x48, 0xd, 0x22, + 0xd0, 0xc4, 0x9, 0x54, 0x80, 0xd0, 0xd, 0x4c, + 0x71, 0xd1, 0x48, 0xd, 0x0, 0xd0, 0x15, 0xdc, + 0x4, 0x80, 0xd0, 0xd, 0x0, 0x9, 0x60, 0x36, + 0xd, 0x0, 0xd0, 0x3, 0xd0, 0x0, 0x0, 0xd0, + 0xd, 0x2, 0xd4, 0x0, 0x0, 0xd, 0x0, 0xd0, + 0xb5, 0x0, 0x0, 0xde, 0x90, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+4F9B "供" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x40, 0xb3, 0x0, 0xe0, 0x0, 0x0, 0x2d, + 0x0, 0xb3, 0x0, 0xe0, 0x0, 0x0, 0x97, 0x0, + 0xb3, 0x0, 0xe0, 0x0, 0x2, 0xf1, 0x8e, 0xfe, + 0xee, 0xfe, 0xe0, 0xb, 0xf0, 0x0, 0xb3, 0x0, + 0xe0, 0x0, 0x8b, 0xe0, 0x0, 0xb3, 0x0, 0xe0, + 0x0, 0x81, 0xe0, 0x0, 0xb3, 0x0, 0xe0, 0x0, + 0x0, 0xe0, 0x0, 0xb3, 0x0, 0xe0, 0x0, 0x0, + 0xe0, 0xde, 0xee, 0xee, 0xee, 0xe2, 0x0, 0xe0, + 0x0, 0x20, 0x0, 0x10, 0x0, 0x0, 0xe0, 0x1, + 0xd1, 0x0, 0xc4, 0x0, 0x0, 0xe0, 0x1c, 0x40, + 0x0, 0x1d, 0x30, 0x0, 0xe0, 0xa5, 0x0, 0x0, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+4F9D "依" */ + 0x0, 0x5, 0x20, 0x2, 0x30, 0x0, 0x0, 0x0, + 0xe, 0x10, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x69, + 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0xd3, 0xee, + 0xef, 0xfe, 0xee, 0xe0, 0xa, 0xf0, 0x0, 0x1e, + 0xb0, 0x0, 0x0, 0x6d, 0xe0, 0x0, 0xc6, 0xd1, + 0x0, 0x70, 0x52, 0xe0, 0x1b, 0xa0, 0x86, 0x1c, + 0x60, 0x0, 0xe3, 0xdc, 0x70, 0x3d, 0xc2, 0x0, + 0x0, 0xe7, 0x46, 0x70, 0xb, 0x50, 0x0, 0x0, + 0xe0, 0x6, 0x70, 0x3, 0xe1, 0x0, 0x0, 0xe0, + 0x6, 0x70, 0x10, 0x7b, 0x0, 0x0, 0xe0, 0x8, + 0xbc, 0xb1, 0x9, 0xd1, 0x0, 0xe0, 0xc, 0x82, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4FA1 "価" */ + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x88, + 0xac, 0xce, 0xce, 0xdc, 0xc0, 0x1, 0xe1, 0x0, + 0x2b, 0x8, 0x50, 0x0, 0xb, 0xf0, 0x0, 0x2b, + 0x8, 0x50, 0x0, 0x8b, 0xe0, 0xae, 0xdf, 0xde, + 0xed, 0xf0, 0x51, 0xe0, 0xa3, 0x1b, 0x8, 0x40, + 0xe0, 0x0, 0xe0, 0xa3, 0x1b, 0x8, 0x40, 0xe0, + 0x0, 0xe0, 0xa3, 0x1b, 0x8, 0x40, 0xe0, 0x0, + 0xe0, 0xa3, 0x1b, 0x8, 0x40, 0xe0, 0x0, 0xe0, + 0xa3, 0x1b, 0x8, 0x40, 0xe0, 0x0, 0xe0, 0xad, + 0xde, 0xde, 0xdd, 0xf0, 0x0, 0xe0, 0xa3, 0x0, + 0x0, 0x0, 0xd0, + + /* U+4FBF "便" */ + 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x8d, 0xdd, 0xfe, 0xdd, 0xd0, 0x0, 0x88, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x1, 0xe1, 0x2c, + 0xbb, 0xec, 0xbc, 0x70, 0xa, 0xf0, 0x3a, 0x0, + 0xb3, 0x5, 0x80, 0x5d, 0xe0, 0x3e, 0xbb, 0xec, + 0xbd, 0x80, 0x53, 0xe0, 0x3a, 0x0, 0xb3, 0x5, + 0x80, 0x0, 0xe0, 0x3b, 0x11, 0xb4, 0x16, 0x80, + 0x0, 0xe0, 0x2a, 0xaa, 0xfa, 0xaa, 0x50, 0x0, + 0xe0, 0x3a, 0x1, 0xd0, 0x0, 0x0, 0x0, 0xe0, + 0x7, 0xbb, 0x50, 0x0, 0x0, 0x0, 0xe0, 0x4, + 0xdc, 0xc7, 0x31, 0x0, 0x0, 0xe2, 0xd9, 0x20, + 0x16, 0x9c, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4FC2 "係" */ + 0x0, 0x7, 0x10, 0x0, 0x0, 0x14, 0x0, 0x0, + 0x2d, 0x47, 0x8a, 0xcd, 0xc9, 0x10, 0x0, 0x87, + 0x45, 0x6e, 0x20, 0x10, 0x0, 0x1, 0xf1, 0x0, + 0xc2, 0x4, 0xe1, 0x0, 0xb, 0xf0, 0x1d, 0xdb, + 0xbd, 0x20, 0x0, 0x6d, 0xe0, 0x5, 0x39, 0xb1, + 0x62, 0x0, 0x72, 0xd0, 0x1, 0xb7, 0x0, 0x5d, + 0x0, 0x0, 0xd0, 0x5e, 0xec, 0xfb, 0xaa, 0x90, + 0x0, 0xd0, 0x23, 0x10, 0xe0, 0x0, 0x80, 0x0, + 0xd0, 0xa, 0x40, 0xe0, 0x87, 0x0, 0x0, 0xd0, + 0x4c, 0x0, 0xe0, 0xb, 0x40, 0x0, 0xd3, 0xd1, + 0x0, 0xe0, 0x2, 0xc0, 0x0, 0xd0, 0x10, 0x5e, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4FDD "保" */ + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x2e, 0xdd, 0xdd, 0xdf, 0x50, 0x0, 0x69, + 0xe, 0x0, 0x0, 0x9, 0x50, 0x1, 0xe2, 0xe, + 0x0, 0x0, 0x9, 0x50, 0xc, 0xf2, 0xe, 0xbb, + 0xbb, 0xbe, 0x50, 0x99, 0xc2, 0x1, 0x11, 0xd3, + 0x11, 0x0, 0x50, 0xc2, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0x0, 0xc2, 0xdd, 0xdd, 0xfe, 0xdd, 0xd1, + 0x0, 0xc2, 0x0, 0xc, 0xed, 0x20, 0x0, 0x0, + 0xc2, 0x0, 0xa6, 0xc4, 0xd1, 0x0, 0x0, 0xc2, + 0x1a, 0x90, 0xc1, 0x5c, 0x20, 0x0, 0xc4, 0xd6, + 0x0, 0xc1, 0x4, 0xe3, 0x0, 0xb2, 0x20, 0x0, + 0xc1, 0x0, 0x20, + + /* U+4FE1 "信" */ + 0x0, 0x4, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x88, + 0x22, 0x22, 0xa3, 0x22, 0x20, 0x1, 0xe2, 0x89, + 0x99, 0x99, 0x99, 0x90, 0xc, 0xf0, 0x4, 0x55, + 0x55, 0x55, 0x0, 0x7b, 0xd0, 0x4, 0x55, 0x55, + 0x54, 0x0, 0x30, 0xd0, 0x9, 0xaa, 0xaa, 0xa9, + 0x0, 0x0, 0xd0, 0x1, 0x22, 0x22, 0x22, 0x0, + 0x0, 0xd0, 0x9, 0x99, 0x99, 0x99, 0x0, 0x0, + 0xd0, 0xd, 0x22, 0x22, 0x2d, 0x0, 0x0, 0xd0, + 0xc, 0x0, 0x0, 0xc, 0x0, 0x0, 0xd0, 0xc, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0xf, 0xbb, + 0xbb, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+4FEE "修" */ + 0x0, 0x4, 0x0, 0x3, 0x40, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, 0x96, + 0x0, 0x5e, 0xcc, 0xce, 0x90, 0x1, 0xf0, 0x4, + 0xdb, 0x30, 0x1c, 0x10, 0xa, 0xf0, 0xa7, 0x20, + 0xb7, 0xc3, 0x0, 0x5c, 0xe0, 0xc0, 0x4, 0xbc, + 0xc4, 0x0, 0x92, 0xe0, 0xc8, 0xc8, 0x23, 0x39, + 0xd2, 0x0, 0xe0, 0xc0, 0x1, 0x89, 0x0, 0x0, + 0x0, 0xe0, 0xc0, 0x6a, 0x40, 0x85, 0x0, 0x0, + 0xe0, 0xc0, 0x1, 0x7c, 0x50, 0x40, 0x0, 0xe0, + 0xc0, 0x4a, 0x40, 0x2b, 0x70, 0x0, 0xe0, 0x0, + 0x3, 0x7b, 0xb3, 0x0, 0x0, 0xe0, 0x1, 0xc9, + 0x50, 0x0, 0x0, + + /* U+500B "個" */ + 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xc1, 0xfd, 0xdd, 0xdd, 0xde, 0x0, 0xa5, 0x1c, + 0x0, 0x52, 0x0, 0xe0, 0x2f, 0x1, 0xc0, 0x7, + 0x30, 0xe, 0xd, 0xf0, 0x1c, 0x7b, 0xdc, 0xb5, + 0xe9, 0xae, 0x1, 0xc0, 0x7, 0x30, 0xe, 0x60, + 0xe0, 0x1c, 0xb, 0xdc, 0x90, 0xe0, 0xe, 0x1, + 0xc0, 0xb0, 0xc, 0xe, 0x0, 0xe0, 0x1c, 0xb, + 0x0, 0xc0, 0xe0, 0xe, 0x1, 0xc0, 0xeb, 0xbc, + 0xe, 0x0, 0xe0, 0x1c, 0x0, 0x0, 0x0, 0xe0, + 0xe, 0x1, 0xfd, 0xdd, 0xdd, 0xde, 0x0, 0xe0, + 0x1c, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5011 "們" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x9d, 0xcc, 0xf0, 0xfc, 0xce, 0x0, 0xc4, 0xd0, + 0xb, 0xc, 0x0, 0xe0, 0x3f, 0xd, 0xcb, 0xe0, + 0xfb, 0xbe, 0xd, 0xf0, 0xd0, 0xb, 0xc, 0x0, + 0xe7, 0xbe, 0xd, 0xcc, 0xf0, 0xfc, 0xce, 0x71, + 0xe0, 0xd0, 0x0, 0x0, 0x0, 0xe0, 0xe, 0xd, + 0x0, 0x0, 0x0, 0xe, 0x0, 0xe0, 0xd0, 0x0, + 0x0, 0x0, 0xe0, 0xe, 0xd, 0x0, 0x0, 0x0, + 0xe, 0x0, 0xe0, 0xd0, 0x0, 0x0, 0x0, 0xe0, + 0xe, 0xd, 0x0, 0x0, 0x0, 0xe, 0x0, 0xe0, + 0xd0, 0x0, 0x6, 0xed, 0x80, + + /* U+5019 "候" */ + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x7c, 0xcc, 0xcf, 0x0, 0x0, 0x86, + 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0xe0, 0xb4, + 0xaa, 0xaa, 0xbe, 0xa3, 0x9, 0xf0, 0xd0, 0x2b, + 0x32, 0x22, 0x20, 0x3d, 0xe0, 0xd0, 0x3e, 0x55, + 0x55, 0x40, 0x33, 0xe0, 0xd0, 0xb8, 0x6f, 0x66, + 0x50, 0x0, 0xe0, 0xd3, 0x90, 0xe, 0x0, 0x0, + 0x0, 0xe0, 0xd3, 0xaa, 0xaf, 0xaa, 0xa3, 0x0, + 0xe0, 0xd1, 0x22, 0x6f, 0x62, 0x20, 0x0, 0xe0, + 0x10, 0x0, 0xc6, 0xc0, 0x0, 0x0, 0xe0, 0x0, + 0x4d, 0x60, 0x6d, 0x40, 0x0, 0xe0, 0x7, 0xa2, + 0x0, 0x3, 0xb3, + + /* U+501F "借" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x50, 0xa3, 0x0, 0xe0, 0x0, 0x0, 0x1e, + 0x0, 0xa3, 0x0, 0xe0, 0x0, 0x0, 0x88, 0x7d, + 0xfd, 0xdd, 0xfd, 0xc0, 0x1, 0xf1, 0x0, 0xa3, + 0x0, 0xe0, 0x0, 0xb, 0xf0, 0x0, 0xa3, 0x0, + 0xe0, 0x0, 0x8c, 0xe2, 0xdd, 0xdd, 0xdd, 0xdd, + 0xd6, 0x81, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0xa, 0xdc, 0xcc, 0xcf, 0x20, 0x0, + 0xe0, 0xa, 0x30, 0x0, 0xc, 0x20, 0x0, 0xe0, + 0xa, 0xcb, 0xbb, 0xbf, 0x20, 0x0, 0xe0, 0xa, + 0x30, 0x0, 0xc, 0x20, 0x0, 0xe0, 0xa, 0x51, + 0x11, 0x1c, 0x20, 0x0, 0xd0, 0xa, 0xca, 0xaa, + 0xae, 0x20, + + /* U+5024 "値" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x60, 0x0, 0x39, 0x0, 0x0, 0x0, 0xe, + 0x20, 0x0, 0x49, 0x0, 0x0, 0x0, 0x6a, 0xc, + 0xcc, 0xde, 0xcc, 0xb0, 0x0, 0xe2, 0x0, 0x0, + 0x65, 0x0, 0x0, 0x9, 0xf0, 0x16, 0xf, 0xbb, + 0xbf, 0x10, 0x6d, 0xe0, 0x3a, 0xe, 0x0, 0xc, + 0x10, 0xa2, 0xe0, 0x3a, 0xf, 0xaa, 0xae, 0x10, + 0x0, 0xe0, 0x3a, 0xe, 0x11, 0x1c, 0x10, 0x0, + 0xe0, 0x3a, 0xf, 0x99, 0x9e, 0x10, 0x0, 0xe0, + 0x3a, 0xe, 0x44, 0x4d, 0x10, 0x0, 0xe0, 0x3a, + 0x5, 0x55, 0x55, 0x0, 0x0, 0xe0, 0x3e, 0xaa, + 0xaa, 0xaa, 0xa0, 0x0, 0xe0, 0x3b, 0x22, 0x22, + 0x22, 0x20, + + /* U+503C "值" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x40, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x1e, + 0x10, 0x0, 0xe1, 0x0, 0x0, 0x0, 0x79, 0x7c, + 0xcc, 0xfc, 0xcc, 0x90, 0x1, 0xe2, 0x0, 0x4, + 0x90, 0x0, 0x0, 0xa, 0xf0, 0xc, 0xcb, 0xbb, + 0xbe, 0x0, 0x5d, 0xe0, 0xc, 0x0, 0x0, 0xe, + 0x0, 0x53, 0xd0, 0xc, 0xbb, 0xbb, 0xbe, 0x0, + 0x0, 0xd0, 0xc, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xd0, 0xc, 0xbb, 0xbb, 0xbe, 0x0, 0x0, 0xd0, + 0xc, 0x0, 0x0, 0xe, 0x0, 0x0, 0xd0, 0xc, + 0xbb, 0xbb, 0xbe, 0x0, 0x0, 0xd0, 0xc, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xd2, 0xcf, 0xdc, 0xcc, + 0xcf, 0xc3, + + /* U+505A "做" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x4, 0x70, 0x8, 0x60, 0x0, 0x0, 0x5a, + 0x4, 0x70, 0xc, 0x30, 0x0, 0x0, 0xb5, 0x4, + 0x70, 0xe, 0x0, 0x0, 0x2, 0xf3, 0xde, 0xed, + 0x7f, 0xcd, 0xf5, 0xa, 0xf0, 0x4, 0x70, 0x8a, + 0x4, 0xa0, 0x4d, 0xe0, 0x4, 0x70, 0xdc, 0x6, + 0x70, 0x93, 0xd0, 0x26, 0x95, 0x9c, 0x9, 0x40, + 0x0, 0xd0, 0xda, 0xaf, 0x9, 0x3d, 0x0, 0x0, + 0xd0, 0xd0, 0xc, 0x4, 0xba, 0x0, 0x0, 0xd0, + 0xd0, 0xc, 0x0, 0xf4, 0x0, 0x0, 0xd0, 0xd0, + 0xd, 0x5, 0xf8, 0x0, 0x0, 0xd0, 0xdc, 0xcc, + 0x4c, 0x1b, 0x50, 0x0, 0xd0, 0x90, 0x5, 0x90, + 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+505C "停" */ + 0x0, 0x6, 0x30, 0x1, 0x90, 0x0, 0x0, 0x0, + 0xe, 0x56, 0x67, 0xe8, 0x66, 0x61, 0x0, 0x69, + 0x35, 0x55, 0x55, 0x55, 0x50, 0x0, 0xd2, 0x7, + 0xba, 0xaa, 0xac, 0x0, 0x8, 0xf0, 0x9, 0x40, + 0x0, 0xe, 0x0, 0x4d, 0xe0, 0x7, 0xbb, 0xbb, + 0xbc, 0x0, 0x64, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0xdb, 0xbb, 0xbb, 0xbb, 0xe1, + 0x0, 0xd0, 0xd1, 0x22, 0x22, 0x22, 0xb1, 0x0, + 0xd0, 0x26, 0x99, 0xfa, 0x98, 0x20, 0x0, 0xd0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xac, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5065 "健" */ + 0x0, 0x2b, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, + 0x78, 0xdd, 0xd6, 0xbe, 0xcb, 0x50, 0x0, 0xc2, + 0x5, 0x90, 0xa, 0x14, 0x70, 0x3, 0xf0, 0xc, + 0x3c, 0xce, 0xcd, 0xe6, 0xc, 0xe0, 0x59, 0x0, + 0xa, 0x14, 0x70, 0x5c, 0xd1, 0xeb, 0x86, 0xbe, + 0xcc, 0x70, 0x22, 0xd0, 0x43, 0xc0, 0xa, 0x10, + 0x0, 0x0, 0xd1, 0x32, 0xa8, 0xbe, 0xcb, 0x80, + 0x0, 0xd1, 0xc6, 0x70, 0xa, 0x10, 0x0, 0x0, + 0xd0, 0x9d, 0x2c, 0xce, 0xcc, 0xc2, 0x0, 0xd0, + 0x4f, 0x40, 0xa, 0x10, 0x0, 0x0, 0xd1, 0xc3, + 0xb9, 0x45, 0x10, 0x0, 0x0, 0xd8, 0x50, 0x4, + 0x8a, 0xcd, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5074 "側" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x78, 0xbd, + 0xcd, 0xc0, 0x30, 0xd0, 0xd, 0x3b, 0x10, 0x1c, + 0xc, 0xd, 0x4, 0xf0, 0xb7, 0x56, 0xc0, 0xc0, + 0xd0, 0xdf, 0xb, 0x76, 0x7c, 0xc, 0xd, 0x7b, + 0xe0, 0xb1, 0x1, 0xc0, 0xc0, 0xd8, 0x1e, 0xb, + 0xcb, 0xbc, 0xc, 0xd, 0x0, 0xe0, 0xb2, 0x1, + 0xc0, 0xc0, 0xd0, 0xe, 0xb, 0x20, 0x2c, 0xc, + 0xd, 0x0, 0xe0, 0x8b, 0xbb, 0x80, 0xb0, 0xd0, + 0xe, 0x1, 0xb0, 0x83, 0x0, 0xd, 0x0, 0xe0, + 0xb5, 0x2, 0xc0, 0x0, 0xd0, 0xe, 0x37, 0x0, + 0x5, 0x5, 0xda, + + /* U+5099 "備" */ + 0x0, 0xc, 0x0, 0x76, 0x1, 0xc0, 0x0, 0x0, + 0x5a, 0x0, 0x77, 0x2, 0xc0, 0x0, 0x0, 0xb5, + 0x8d, 0xee, 0xdd, 0xfd, 0x90, 0x2, 0xf0, 0x0, + 0x76, 0x1, 0xc0, 0x0, 0xb, 0xf0, 0xdd, 0xfe, + 0xde, 0xed, 0xd1, 0x4d, 0xe0, 0x7, 0xa0, 0x0, + 0x0, 0x0, 0x53, 0xe0, 0x8f, 0xdc, 0xdd, 0xcd, + 0x60, 0x0, 0xe8, 0x9e, 0x0, 0xa3, 0x7, 0x60, + 0x0, 0xe0, 0xd, 0xbb, 0xec, 0xbd, 0x60, 0x0, + 0xe0, 0xd, 0x0, 0xa3, 0x7, 0x60, 0x0, 0xe0, + 0xd, 0xcb, 0xec, 0xbd, 0x60, 0x0, 0xe0, 0xd, + 0x0, 0xa3, 0x7, 0x60, 0x0, 0xe0, 0xd, 0x0, + 0xa3, 0x5c, 0x40, + + /* U+50B3 "傳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x40, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x2e, + 0xad, 0xdd, 0xfd, 0xdd, 0xd1, 0x0, 0x97, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x2, 0xf1, 0x2e, 0x99, + 0xfa, 0x9c, 0x70, 0xd, 0xf0, 0x2d, 0x77, 0xe8, + 0x7a, 0x70, 0xab, 0xe0, 0x2b, 0x11, 0xd2, 0x17, + 0x70, 0x70, 0xe0, 0x1a, 0xaa, 0xfa, 0xcd, 0x50, + 0x0, 0xe0, 0x56, 0x66, 0xe7, 0x8f, 0x60, 0x0, + 0xe0, 0x56, 0x55, 0x44, 0xc6, 0x91, 0x0, 0xe1, + 0xcc, 0xcc, 0xcc, 0xed, 0xc2, 0x0, 0xe0, 0x4, + 0x90, 0x0, 0xa3, 0x0, 0x0, 0xe0, 0x0, 0x79, + 0x0, 0xb3, 0x0, 0x0, 0xd0, 0x0, 0x1, 0x8c, + 0xd1, 0x0, + + /* U+50C5 "僅" */ + 0x0, 0xa, 0x20, 0xd0, 0x0, 0xd1, 0x0, 0x0, + 0x3d, 0x8a, 0xfa, 0xaa, 0xfa, 0xa0, 0x0, 0xa7, + 0x11, 0xe1, 0x11, 0xd2, 0x10, 0x2, 0xf1, 0x0, + 0xda, 0xaa, 0xf1, 0x0, 0xd, 0xf0, 0x0, 0x12, + 0xe2, 0x20, 0x0, 0xac, 0xe0, 0x2e, 0xaa, 0xfb, + 0xad, 0x60, 0x71, 0xe0, 0x2c, 0x11, 0xe2, 0x19, + 0x60, 0x0, 0xe0, 0x17, 0x77, 0xf8, 0x77, 0x30, + 0x0, 0xe0, 0x5b, 0xbb, 0xfc, 0xbb, 0x70, 0x0, + 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, + 0x1b, 0xbb, 0xfb, 0xbb, 0x30, 0x0, 0xe0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, 0xbb, 0xbb, + 0xfc, 0xbb, 0xb0, + + /* U+50CD "働" */ + 0x0, 0xb, 0x0, 0x25, 0x60, 0xb1, 0x0, 0x0, + 0x6a, 0xbb, 0xe7, 0x40, 0xb1, 0x0, 0x0, 0xc4, + 0x66, 0xe6, 0x61, 0xb1, 0x0, 0x3, 0xf1, 0x55, + 0xe5, 0x5a, 0xeb, 0xb3, 0xc, 0xf0, 0xaa, 0xfa, + 0xa1, 0xc3, 0x94, 0x6b, 0xd0, 0xa0, 0xb0, 0xb0, + 0xc0, 0x93, 0x62, 0xd0, 0xe9, 0xe9, 0xe0, 0xd0, + 0x93, 0x0, 0xd0, 0xb1, 0xb1, 0xb0, 0xd0, 0xa2, + 0x0, 0xd0, 0x77, 0xe7, 0x71, 0xc0, 0xa2, 0x0, + 0xd0, 0x99, 0xe9, 0x96, 0x80, 0xb1, 0x0, 0xd0, + 0x11, 0xd1, 0x1b, 0x30, 0xd0, 0x0, 0xd1, 0x56, + 0xea, 0xcb, 0x0, 0xd0, 0x0, 0xd3, 0x86, 0x42, + 0xb2, 0x8d, 0x80, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+50CF "像" */ + 0x0, 0x5, 0x40, 0x64, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x22, 0xfc, 0xbb, 0x10, 0x0, 0x0, 0x6a, + 0x1c, 0x50, 0x3a, 0x0, 0x0, 0x1, 0xe4, 0xdf, + 0xbb, 0xed, 0xbc, 0x10, 0xb, 0xf2, 0x5d, 0x0, + 0xb0, 0xb, 0x20, 0x7c, 0xe0, 0xf, 0xbc, 0xeb, + 0xbe, 0x20, 0x41, 0xe0, 0x0, 0x8f, 0x10, 0x2, + 0x0, 0x0, 0xe0, 0x7d, 0x75, 0x90, 0x8b, 0x0, + 0x0, 0xe0, 0x20, 0x6a, 0xac, 0xd0, 0x0, 0x0, + 0xe0, 0x6c, 0x71, 0xc7, 0x75, 0x0, 0x0, 0xe0, + 0x41, 0x6b, 0x59, 0x1d, 0x20, 0x0, 0xe0, 0x7d, + 0x80, 0x58, 0x3, 0xd0, 0x0, 0xd0, 0x50, 0xb, + 0xd2, 0x0, 0x0, + + /* U+50D5 "僕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x55, 0xc, 0xc, 0x4, 0x30, 0x0, 0x2e, + 0xd, 0xc, 0xc, 0xc, 0x20, 0x0, 0xa7, 0x5, + 0x2c, 0xc, 0x17, 0x0, 0x3, 0xf1, 0xcd, 0xfc, + 0xcc, 0xed, 0xc1, 0x1e, 0xf0, 0x0, 0xd1, 0x0, + 0xd1, 0x0, 0xb9, 0xe0, 0x7b, 0xec, 0xbc, 0xeb, + 0x90, 0x60, 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xe0, 0x2b, 0xbb, 0xfb, 0xbb, 0x30, 0x0, + 0xe0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, + 0xcc, 0xcc, 0xfc, 0xcc, 0xc3, 0x0, 0xe0, 0x0, + 0x9, 0xbc, 0x10, 0x0, 0x0, 0xe0, 0x3, 0xb9, + 0x4, 0xd6, 0x10, 0x0, 0xe0, 0xbb, 0x30, 0x0, + 0x29, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+50F9 "價" */ + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xab, 0xce, 0xbe, 0xcb, 0xb0, 0x0, 0xb3, + 0x59, 0xad, 0x9e, 0xa9, 0x60, 0x2, 0xf0, 0x84, + 0x2a, 0xa, 0x23, 0xa0, 0xc, 0xf0, 0x8a, 0x9d, + 0x8d, 0x9a, 0xa0, 0x7a, 0xe0, 0x13, 0x33, 0x33, + 0x33, 0x20, 0x71, 0xe0, 0x3d, 0x77, 0x77, 0x7b, + 0x70, 0x0, 0xe0, 0x3d, 0x99, 0x99, 0x9c, 0x70, + 0x0, 0xe0, 0x3a, 0x11, 0x11, 0x18, 0x70, 0x0, + 0xe0, 0x3d, 0x77, 0x77, 0x7b, 0x70, 0x0, 0xe0, + 0x3d, 0x99, 0x99, 0x9c, 0x70, 0x0, 0xe0, 0x2, + 0x94, 0x4, 0xa4, 0x0, 0x0, 0xe1, 0xb9, 0x30, + 0x0, 0x28, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5104 "億" */ + 0x0, 0x3, 0x10, 0x2, 0x40, 0x0, 0x0, 0x0, + 0xd, 0x31, 0x12, 0xd1, 0x11, 0x10, 0x0, 0x5a, + 0x4a, 0xd9, 0x99, 0xea, 0x70, 0x0, 0xd3, 0x11, + 0xc2, 0x13, 0xd1, 0x10, 0xa, 0xf1, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa2, 0x6c, 0xe0, 0x9, 0xaa, 0xaa, + 0xaa, 0x10, 0x41, 0xe0, 0xe, 0x11, 0x11, 0x1d, + 0x10, 0x0, 0xe0, 0xe, 0x77, 0x77, 0x7e, 0x10, + 0x0, 0xe0, 0xe, 0x99, 0x99, 0x9e, 0x10, 0x0, + 0xe0, 0x0, 0x7, 0x90, 0x1, 0x0, 0x0, 0xe0, + 0x56, 0xd0, 0x79, 0xc, 0x20, 0x0, 0xe0, 0xd1, + 0xd0, 0x0, 0x56, 0xc0, 0x0, 0xe1, 0x60, 0x9c, + 0xcc, 0xc2, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+512A "優" */ + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x7b, 0xbb, 0xfc, 0xbb, 0xb1, 0x0, 0xa5, + 0x5, 0x88, 0xe8, 0x88, 0x0, 0x1, 0xf0, 0x8, + 0xb8, 0x88, 0x8e, 0x0, 0xb, 0xf0, 0x8, 0x84, + 0x44, 0x4e, 0x0, 0x6b, 0xe0, 0x8, 0x84, 0x44, + 0x4e, 0x0, 0x81, 0xe0, 0xe9, 0xab, 0xfa, 0x9a, + 0xd5, 0x0, 0xe0, 0xb7, 0x78, 0x46, 0x4b, 0x94, + 0x0, 0xe0, 0x56, 0x1d, 0x98, 0x71, 0xa0, 0x0, + 0xe0, 0x1, 0xbf, 0xa9, 0x97, 0x0, 0x0, 0xe0, + 0xaa, 0xa9, 0x3, 0xc4, 0x0, 0x0, 0xe0, 0x10, + 0x2b, 0xef, 0x61, 0x0, 0x0, 0xe1, 0xbb, 0x95, + 0x14, 0x9c, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+513F "儿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xd0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x1, + 0xd0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x3, 0xb0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xc, 0x40, 0x0, 0xe, 0x0, 0x26, 0x0, 0x5c, + 0x0, 0x0, 0xe, 0x0, 0x39, 0x4, 0xe3, 0x0, + 0x0, 0xd, 0x10, 0x68, 0x1d, 0x30, 0x0, 0x0, + 0x9, 0xee, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5143 "元" */ + 0x0, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xe2, 0x0, 0x0, 0x96, 0x0, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0xe1, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0xc2, 0x0, 0x41, 0x0, + 0xd, 0x50, 0x0, 0xc2, 0x0, 0x85, 0x1, 0xaa, + 0x0, 0x0, 0xc3, 0x0, 0xa3, 0x1e, 0x70, 0x0, + 0x0, 0x7e, 0xee, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5144 "兄" */ + 0x0, 0xde, 0xee, 0xee, 0xee, 0xee, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0xce, 0xff, 0xee, 0xfe, + 0xed, 0x0, 0x0, 0x0, 0xb5, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0xd2, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x0, 0xe0, 0x0, 0x10, 0x0, + 0xb, 0x70, 0x0, 0xe0, 0x0, 0x76, 0x2, 0xbb, + 0x0, 0x0, 0xf0, 0x0, 0x95, 0x4d, 0x60, 0x0, + 0x0, 0xbe, 0xee, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5145 "充" */ + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0xb, 0xbb, + 0xbb, 0xbd, 0xbb, 0xbb, 0xb1, 0x3, 0x33, 0x8e, + 0x43, 0x34, 0x33, 0x30, 0x0, 0x2, 0xd2, 0x0, + 0x4c, 0x10, 0x0, 0x0, 0x1d, 0x40, 0x0, 0x4, + 0xd3, 0x0, 0x1, 0xee, 0xbc, 0xcd, 0xee, 0xde, + 0x20, 0x0, 0x54, 0x5d, 0x10, 0xf0, 0x4, 0x60, + 0x0, 0x0, 0x5a, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0xe0, 0x0, 0x10, 0x0, 0x2, + 0xe1, 0x0, 0xe0, 0x0, 0x95, 0x0, 0x3e, 0x50, + 0x0, 0xe1, 0x0, 0xb3, 0xb, 0xd5, 0x0, 0x0, + 0xae, 0xde, 0xc0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5148 "先" */ + 0x0, 0x5, 0x20, 0x77, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x20, 0x77, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xbb, 0xdd, 0xbb, 0xbb, 0x10, 0x0, 0xb6, 0x22, + 0x99, 0x22, 0x22, 0x0, 0x4, 0xc0, 0x0, 0x77, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x77, 0x0, + 0x0, 0x0, 0x1e, 0xee, 0xee, 0xff, 0xee, 0xee, + 0xe2, 0x0, 0x0, 0x87, 0x0, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0xe1, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x0, 0xa4, 0x0, 0x84, 0x0, 0x7d, 0x10, + 0x0, 0xa4, 0x0, 0xa3, 0x1d, 0xa1, 0x0, 0x0, + 0x6e, 0xee, 0xc0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5149 "光" */ + 0x0, 0x10, 0x0, 0x86, 0x0, 0x3, 0x0, 0x0, + 0xc3, 0x0, 0x86, 0x0, 0x2e, 0x0, 0x0, 0x4b, + 0x0, 0x86, 0x0, 0x97, 0x0, 0x0, 0xd, 0x20, + 0x86, 0x1, 0xd0, 0x0, 0x0, 0x6, 0x50, 0x86, + 0x5, 0x60, 0x0, 0x1, 0x11, 0x11, 0x98, 0x11, + 0x11, 0x10, 0x2c, 0xcc, 0xde, 0xcc, 0xed, 0xcc, + 0xc3, 0x0, 0x0, 0x87, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xa, + 0x80, 0x0, 0xb3, 0x0, 0x75, 0x3, 0xba, 0x0, + 0x0, 0xb3, 0x0, 0x94, 0x3d, 0x50, 0x0, 0x0, + 0x7e, 0xee, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+514B "克" */ + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x87, 0x11, 0x11, 0x10, 0xc, 0xcc, + 0xcc, 0xee, 0xcc, 0xcc, 0xc0, 0x0, 0x0, 0x0, + 0x86, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xdd, 0xee, + 0xdd, 0xd7, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, + 0x68, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x68, + 0x0, 0x0, 0x7e, 0xcc, 0xcc, 0xcc, 0xd8, 0x0, + 0x0, 0x1, 0x5b, 0x11, 0xf1, 0x10, 0x0, 0x0, + 0x0, 0x97, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x2, + 0xe1, 0x0, 0xe0, 0x0, 0x84, 0x0, 0x5e, 0x50, + 0x0, 0xf0, 0x0, 0xa4, 0x1e, 0xa3, 0x0, 0x0, + 0xbe, 0xee, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+514D "免" */ + 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfc, 0xcc, 0xc4, 0x0, 0x0, 0x0, 0x2d, + 0x20, 0x1, 0xd1, 0x0, 0x0, 0x2, 0xe5, 0x0, + 0xb, 0x70, 0x0, 0x0, 0x2e, 0xfd, 0xdd, 0xff, + 0xdd, 0xdf, 0x10, 0x3, 0xe0, 0x0, 0xb8, 0x0, + 0xe, 0x10, 0x0, 0xe0, 0x0, 0xd5, 0x0, 0xe, + 0x10, 0x0, 0xed, 0xdd, 0xfe, 0xdd, 0xdf, 0x10, + 0x0, 0x0, 0x6, 0xb3, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x43, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xb9, 0x3, 0xc0, 0x0, 0x91, 0x0, 0x5e, 0x80, + 0x3, 0xc0, 0x0, 0xd0, 0x2e, 0xa3, 0x0, 0x0, + 0xdd, 0xdd, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5152 "兒" */ + 0x0, 0x0, 0x49, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xac, 0x84, 0x5, 0xdd, 0xdc, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0xed, 0xdd, 0x11, + 0xdd, 0xdd, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0xcd, 0xdf, 0xdd, 0xfd, 0xdb, 0x0, + 0x0, 0x0, 0x3c, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x79, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x1, + 0xe2, 0x2, 0xc0, 0x0, 0x82, 0x0, 0x3d, 0x60, + 0x2, 0xc0, 0x0, 0xb2, 0x3d, 0xb3, 0x0, 0x0, + 0xcb, 0xbb, 0xb0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+515A "党" */ + 0x0, 0x44, 0x0, 0xb3, 0x0, 0x45, 0x0, 0x0, + 0x2e, 0x10, 0xb3, 0x0, 0xd4, 0x0, 0x0, 0x8, + 0x40, 0xb3, 0x5, 0xb0, 0x0, 0xe, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xf0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0xe, 0xd, 0xdd, 0xdd, 0xdd, + 0xe0, 0xe0, 0x0, 0xd, 0x10, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0xb, 0xdf, 0xde, 0xfd, 0xc0, 0x0, 0x0, + 0x0, 0x4b, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xc5, 0x4, 0xb0, 0x0, 0x42, 0x0, 0x4c, 0x90, + 0x4, 0xc0, 0x0, 0xa4, 0x1e, 0xb4, 0x0, 0x1, + 0xee, 0xee, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5165 "入" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf9, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa1, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x40, 0x7a, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0xe, 0x30, 0x0, 0x0, + 0x3, 0xe2, 0x0, 0x6, 0xd0, 0x0, 0x0, 0x2e, + 0x50, 0x0, 0x0, 0xbb, 0x0, 0x5, 0xe7, 0x0, + 0x0, 0x0, 0x1c, 0xc1, 0x1c, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5167 "內" */ + 0x0, 0x1, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x30, + 0x0, 0x0, 0x2c, 0xcc, 0xce, 0xec, 0xcc, 0xcb, + 0x3b, 0x11, 0x19, 0xf4, 0x11, 0x2d, 0x3b, 0x0, + 0xc, 0x6a, 0x0, 0x1d, 0x3b, 0x0, 0x58, 0xd, + 0x10, 0x1d, 0x3b, 0x2, 0xe1, 0x6, 0xc0, 0x1d, + 0x3b, 0x5e, 0x40, 0x0, 0xad, 0x4d, 0x3b, 0x72, + 0x0, 0x0, 0x5, 0x4d, 0x3b, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x3b, 0x0, 0x0, 0x0, 0x5e, 0xe8, + + /* U+5168 "全" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0x0, 0xb7, 0x0, 0x0, 0x0, 0x8, 0xc0, 0x0, + 0xb, 0x90, 0x0, 0x3, 0xc8, 0x0, 0x0, 0x0, + 0x8e, 0x50, 0x4d, 0x6c, 0xcc, 0xcc, 0xcc, 0xc7, + 0xd5, 0x0, 0x1, 0x11, 0x88, 0x11, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0xaa, 0xdd, 0xaa, 0xa3, 0x0, 0x0, 0x3, + 0x33, 0x99, 0x33, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x0, 0xc, 0xdd, 0xdd, 0xee, 0xdd, + 0xdd, 0xd0, + + /* U+5169 "兩" */ + 0x2e, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe1, 0x0, + 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x86, 0x0, 0x0, 0x0, 0x6, 0xed, 0xdd, + 0xee, 0xdd, 0xde, 0x50, 0x6, 0x70, 0x0, 0x85, + 0x0, 0x8, 0x50, 0x6, 0x73, 0x90, 0x85, 0x48, + 0x8, 0x50, 0x6, 0x70, 0xe1, 0x85, 0xe, 0x18, + 0x50, 0x6, 0x74, 0xc9, 0x85, 0x4c, 0x88, 0x50, + 0x6, 0x7a, 0x2d, 0x85, 0xa2, 0xc8, 0x50, 0x6, + 0x99, 0x8, 0xa7, 0x90, 0xaa, 0x50, 0x6, 0x70, + 0x0, 0x85, 0x0, 0x8, 0x50, 0x6, 0x70, 0x0, + 0x43, 0x5, 0xdd, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+516B "八" */ + 0x0, 0x0, 0x41, 0x0, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0xf0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0x0, 0x87, 0x0, 0x0, 0x0, 0x4, 0xb0, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x1e, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xb, 0x40, + 0x0, 0x0, 0x2e, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0x97, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x2, + 0xe1, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x1d, 0x40, + 0x0, 0x0, 0x0, 0xc, 0x80, 0x67, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+516C "公" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x4, + 0xd0, 0x0, 0xd, 0x50, 0x0, 0x0, 0xc, 0x50, + 0x0, 0x3, 0xe1, 0x0, 0x0, 0x9b, 0x0, 0x10, + 0x0, 0x8c, 0x0, 0x8, 0xd0, 0x0, 0xd5, 0x0, + 0xb, 0xb0, 0x1b, 0x10, 0x6, 0xc0, 0x0, 0x0, + 0xa2, 0x0, 0x0, 0x1e, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x99, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x5, 0xc0, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x2e, + 0x20, 0x1, 0x23, 0xe6, 0x0, 0x0, 0xef, 0xef, + 0xed, 0xcb, 0xae, 0x10, 0x0, 0x32, 0x10, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+516D "六" */ + 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x13, 0x0, + 0x0, 0x0, 0x1, 0xf2, 0x0, 0x2e, 0x20, 0x0, + 0x0, 0xa, 0x80, 0x0, 0x6, 0xc0, 0x0, 0x0, + 0x3e, 0x10, 0x0, 0x0, 0xb7, 0x0, 0x0, 0xd6, + 0x0, 0x0, 0x0, 0x2e, 0x20, 0xb, 0xa0, 0x0, + 0x0, 0x0, 0x7, 0xc0, 0x2c, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5171 "共" */ + 0x0, 0x0, 0xc2, 0x0, 0xb, 0x40, 0x0, 0x0, + 0x0, 0xc2, 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, + 0xc2, 0x0, 0xb, 0x40, 0x0, 0x7, 0xee, 0xfe, + 0xee, 0xef, 0xee, 0xe1, 0x0, 0x0, 0xc2, 0x0, + 0xb, 0x40, 0x0, 0x0, 0x0, 0xc2, 0x0, 0xb, + 0x40, 0x0, 0x0, 0x0, 0xc2, 0x0, 0xb, 0x40, + 0x0, 0x2, 0x22, 0xd4, 0x22, 0x2b, 0x62, 0x21, + 0x1b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x0, + 0x0, 0x12, 0x0, 0x3, 0x0, 0x0, 0x0, 0x2, + 0xd5, 0x0, 0x2d, 0x80, 0x0, 0x0, 0x4d, 0x50, + 0x0, 0x0, 0xab, 0x10, 0x7, 0xd3, 0x0, 0x0, + 0x0, 0x8, 0xd0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, + + /* U+5176 "其" */ + 0x0, 0x9, 0x40, 0x0, 0x5, 0x90, 0x0, 0x0, + 0x9, 0x40, 0x0, 0x5, 0x90, 0x0, 0xb, 0xdf, + 0xed, 0xdd, 0xde, 0xfd, 0xc0, 0x0, 0x9, 0x40, + 0x0, 0x5, 0x90, 0x0, 0x0, 0x9, 0xdc, 0xcc, + 0xcd, 0x90, 0x0, 0x0, 0x9, 0x40, 0x0, 0x5, + 0x90, 0x0, 0x0, 0x9, 0x50, 0x0, 0x5, 0x90, + 0x0, 0x0, 0x9, 0xdc, 0xcc, 0xcd, 0x90, 0x0, + 0x0, 0x9, 0x40, 0x0, 0x5, 0x90, 0x0, 0x3d, + 0xdf, 0xed, 0xdd, 0xde, 0xfd, 0xd3, 0x0, 0x0, + 0x56, 0x0, 0x65, 0x0, 0x0, 0x1, 0x6d, 0x91, + 0x0, 0x28, 0xd8, 0x10, 0x1c, 0x71, 0x0, 0x0, + 0x0, 0x7, 0xb0, + + /* U+5177 "具" */ + 0x0, 0xd, 0xdc, 0xcc, 0xcc, 0xe6, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x86, 0x0, 0x0, 0xd, + 0xbb, 0xbb, 0xbb, 0xd6, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x86, 0x0, 0x0, 0xd, 0xbb, 0xbb, + 0xbb, 0xd6, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x86, 0x0, 0x0, 0xd, 0xbb, 0xbb, 0xbb, 0xd6, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x86, 0x0, + 0x1d, 0xdf, 0xdd, 0xdd, 0xdd, 0xee, 0xd6, 0x0, + 0x0, 0x94, 0x0, 0xb, 0x40, 0x0, 0x0, 0x6d, + 0x80, 0x0, 0x2, 0xbc, 0x30, 0xc, 0x92, 0x0, + 0x0, 0x0, 0x4, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5185 "内" */ + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x11, 0x11, 0x1b, 0x51, + 0x11, 0x10, 0xcd, 0xcc, 0xcf, 0xdc, 0xcc, 0xf2, + 0xc1, 0x0, 0xc, 0x20, 0x0, 0xb2, 0xc1, 0x0, + 0xf, 0x10, 0x0, 0xb2, 0xc1, 0x0, 0x5c, 0xc1, + 0x0, 0xb2, 0xc1, 0x1, 0xd1, 0x4d, 0x10, 0xb2, + 0xc1, 0x2d, 0x50, 0x4, 0xd1, 0xb2, 0xc4, 0xe5, + 0x0, 0x0, 0x58, 0xb2, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0xb2, 0xc1, 0x0, 0x0, 0x0, 0x0, 0xc2, + 0xc1, 0x0, 0x0, 0x1, 0xee, 0xc0, + + /* U+5186 "円" */ + 0xce, 0xee, 0xee, 0xee, 0xee, 0xed, 0xd1, 0x0, + 0xd, 0x10, 0x0, 0x1d, 0xd1, 0x0, 0xd, 0x10, + 0x0, 0x1d, 0xd1, 0x0, 0xd, 0x10, 0x0, 0x1d, + 0xd1, 0x0, 0xd, 0x10, 0x0, 0x1d, 0xdd, 0xdd, + 0xdf, 0xdd, 0xdd, 0xdd, 0xd2, 0x11, 0x11, 0x11, + 0x11, 0x2d, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, 0x9e, 0xd8, + + /* U+518A "冊" */ + 0x0, 0xce, 0xef, 0xee, 0xff, 0xef, 0x60, 0x0, + 0xc1, 0xb, 0x10, 0xa3, 0x8, 0x60, 0x0, 0xc1, + 0xb, 0x10, 0xa3, 0x8, 0x60, 0x0, 0xc1, 0xb, + 0x10, 0xa3, 0x8, 0x60, 0x0, 0xc1, 0xb, 0x10, + 0xa3, 0x8, 0x60, 0x2e, 0xfe, 0xef, 0xee, 0xfe, + 0xef, 0xf9, 0x0, 0xc1, 0xb, 0x10, 0xa3, 0x8, + 0x60, 0x0, 0xc1, 0xb, 0x10, 0xa3, 0x8, 0x60, + 0x0, 0xc1, 0xb, 0x10, 0xa3, 0x8, 0x60, 0x0, + 0xc1, 0xb, 0x10, 0xa3, 0x8, 0x60, 0x0, 0xc1, + 0xb, 0x10, 0xa3, 0x8, 0x60, 0x0, 0xc1, 0xb, + 0x10, 0xa3, 0xcd, 0x30, + + /* U+518D "再" */ + 0x9, 0xdd, 0xdd, 0xef, 0xdd, 0xdd, 0xd2, 0x0, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x6c, + 0xcc, 0xde, 0xcc, 0xcb, 0x0, 0x0, 0x87, 0x11, + 0x6a, 0x11, 0x1e, 0x0, 0x0, 0x86, 0x0, 0x4a, + 0x0, 0xe, 0x0, 0x0, 0x8e, 0xdd, 0xef, 0xdd, + 0xdf, 0x0, 0x0, 0x86, 0x0, 0x4a, 0x0, 0xe, + 0x0, 0x0, 0x86, 0x0, 0x4a, 0x0, 0xe, 0x0, + 0x2d, 0xfe, 0xdd, 0xdd, 0xdd, 0xdf, 0xd9, 0x0, + 0x86, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x86, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x86, 0x0, + 0x0, 0x3e, 0xea, 0x0, + + /* U+5199 "写" */ + 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xee, 0xd0, 0xa, + 0x10, 0x0, 0x0, 0x1e, 0x90, 0xe, 0x0, 0x0, + 0x0, 0x9, 0x0, 0x3f, 0xdd, 0xdd, 0xdd, 0x20, + 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, + 0x22, 0x22, 0x22, 0x10, 0x0, 0x9b, 0xbb, 0xbb, + 0xbd, 0x70, 0x0, 0x0, 0x0, 0x0, 0x9, 0x50, + 0x9d, 0xdd, 0xdd, 0xdd, 0x3b, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0x0, 0x4, 0xdd, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+519B "军" */ + 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xe, 0x0, + 0x7, 0x10, 0x0, 0x0, 0xe0, 0xc0, 0x2, 0xd0, + 0x0, 0x0, 0xd, 0x0, 0x6d, 0xfd, 0xdd, 0xdd, + 0xd6, 0x0, 0x0, 0x1c, 0x0, 0x90, 0x0, 0x0, + 0x0, 0xa, 0x40, 0xe, 0x0, 0x0, 0x0, 0x3, + 0xfd, 0xdd, 0xfd, 0xdd, 0xb0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0xc, 0xdd, 0xdd, 0xdf, 0xdd, 0xdd, + 0xd0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + + /* U+51AC "冬" */ + 0x0, 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0x11, 0x11, 0x10, 0x0, 0x0, 0x1, + 0xdb, 0xbb, 0xbd, 0xd0, 0x0, 0x0, 0x2d, 0xd1, + 0x0, 0x1d, 0x30, 0x0, 0x4, 0xe5, 0x3c, 0x22, + 0xd5, 0x0, 0x0, 0x6, 0x30, 0x3, 0xee, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x7d, 0x99, 0xd6, 0x0, + 0x0, 0x16, 0xbe, 0x91, 0x0, 0x29, 0xec, 0x81, + 0x8, 0x40, 0xb, 0x94, 0x0, 0x3, 0x70, 0x0, + 0x0, 0x0, 0x4a, 0xe8, 0x0, 0x0, 0x0, 0x4, + 0x40, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x9d, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xdc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x0, 0x0, + + /* U+51B7 "冷" */ + 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x1b, + 0x0, 0x0, 0x5, 0xf3, 0x0, 0x0, 0x8, 0x80, + 0x0, 0x2d, 0x5d, 0x10, 0x0, 0x0, 0xe2, 0x2, + 0xd4, 0x4, 0xc0, 0x0, 0x0, 0x31, 0x4e, 0x63, + 0x30, 0x6d, 0x20, 0x0, 0x3, 0xe3, 0x1, 0xd3, + 0x4, 0xe1, 0x0, 0x0, 0x10, 0x0, 0x22, 0x0, + 0x0, 0x0, 0x42, 0xe, 0xee, 0xee, 0xee, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x3, + 0xd0, 0x0, 0x0, 0x8, 0xa0, 0x0, 0xa, 0x60, + 0x0, 0xa9, 0x7b, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x7, 0xf3, 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, + 0x3d, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, + + /* U+51CD "凍" */ + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x17, + 0x0, 0x11, 0x11, 0xd2, 0x11, 0x10, 0xa, 0xa0, + 0xbb, 0xbb, 0xfc, 0xbb, 0xb2, 0x0, 0xb5, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xbb, + 0xfb, 0xbd, 0x80, 0x0, 0x0, 0x49, 0x0, 0xd0, + 0x4, 0x80, 0x0, 0x1, 0x4d, 0xaa, 0xfb, 0xac, + 0x80, 0x0, 0x68, 0x49, 0x0, 0xd0, 0x4, 0x80, + 0x0, 0xe1, 0x3c, 0xcf, 0xff, 0xcc, 0x60, 0x8, + 0x80, 0x0, 0x6b, 0xea, 0x60, 0x0, 0x3e, 0x0, + 0x7, 0xb0, 0xd1, 0xb6, 0x0, 0x3, 0x4, 0xd9, + 0x0, 0xd0, 0xa, 0xb2, 0x0, 0x5, 0x30, 0x0, + 0xd0, 0x0, 0x51, + + /* U+51DD "凝" */ + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x0, 0xc1, 0x76, 0x9c, 0xcd, 0xd0, 0xb, 0x80, + 0xe9, 0x40, 0x4, 0x1c, 0x20, 0x0, 0xa4, 0xc0, + 0xa, 0x2a, 0xe5, 0x0, 0x0, 0x0, 0xac, 0xc9, + 0x0, 0x4b, 0x0, 0x0, 0x0, 0xb2, 0x0, 0xbc, + 0xcc, 0xc2, 0x0, 0x2, 0xee, 0xda, 0x0, 0xc0, + 0xb0, 0x0, 0x87, 0x38, 0x40, 0x73, 0xc0, 0x30, + 0x1, 0xd6, 0xce, 0xdc, 0xa2, 0xcc, 0xc1, 0x8, + 0x60, 0xc, 0x40, 0xb2, 0xc0, 0x0, 0xe, 0x0, + 0x1d, 0xd2, 0xc8, 0xc0, 0x0, 0x48, 0x0, 0xb5, + 0x3a, 0x99, 0xe0, 0x0, 0x0, 0x9, 0x70, 0x9, + 0x20, 0xad, 0xd3, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+51E6 "処" */ + 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa4, 0x0, 0x6, 0x88, 0x80, 0x0, 0x0, 0xd3, + 0x11, 0xc, 0x64, 0xe0, 0x0, 0x1, 0xfb, 0xbe, + 0xc, 0x10, 0xd0, 0x0, 0x4, 0xa0, 0x1b, 0xc, + 0x10, 0xd0, 0x0, 0xa, 0xb0, 0x49, 0xd, 0x0, + 0xd0, 0x0, 0x1e, 0xc0, 0x86, 0xd, 0x0, 0xd0, + 0x0, 0x96, 0x84, 0xd1, 0x1c, 0x0, 0xd0, 0x0, + 0x20, 0x2d, 0xb0, 0x58, 0x0, 0xd0, 0x10, 0x0, + 0xc, 0x80, 0xc3, 0x0, 0xd1, 0xb0, 0x0, 0x6c, + 0xd6, 0x70, 0x0, 0x59, 0x40, 0x4, 0xd1, 0x1c, + 0xb5, 0x10, 0x0, 0x0, 0x4d, 0x20, 0x0, 0x4a, + 0xde, 0xee, 0xe1, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+51FA "出" */ + 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x6, 0x30, + 0x1, 0xe0, 0x0, 0x90, 0xa, 0x50, 0x1, 0xe0, + 0x0, 0xe1, 0xa, 0x50, 0x1, 0xe0, 0x0, 0xe1, + 0xa, 0x50, 0x1, 0xe0, 0x0, 0xe1, 0xa, 0xdc, + 0xcd, 0xfc, 0xcc, 0xf1, 0x1, 0x11, 0x13, 0xe1, + 0x11, 0x10, 0x39, 0x0, 0x1, 0xe0, 0x0, 0x48, + 0x4b, 0x0, 0x1, 0xe0, 0x0, 0x5a, 0x4b, 0x0, + 0x1, 0xe0, 0x0, 0x5a, 0x4b, 0x0, 0x1, 0xe0, + 0x0, 0x5a, 0x4f, 0xee, 0xee, 0xfe, 0xee, 0xea, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6a, + + /* U+5206 "分" */ + 0x0, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x3d, 0x0, 0x0, 0x0, 0x5, + 0xc0, 0x0, 0x9, 0x70, 0x0, 0x0, 0xe, 0x30, + 0x0, 0x1, 0xe2, 0x0, 0x0, 0xb9, 0x0, 0x0, + 0x0, 0x5d, 0x10, 0xb, 0xb3, 0x22, 0x22, 0x22, + 0x29, 0xd1, 0x18, 0x4b, 0xbe, 0xdb, 0xbb, 0xe5, + 0x60, 0x0, 0x0, 0xc, 0x30, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x79, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x3, + 0xe2, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x5e, 0x30, + 0x0, 0x3, 0xd0, 0x0, 0xc, 0xa2, 0x0, 0xe, + 0xee, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5207 "切" */ + 0x0, 0xe0, 0x3, 0xaa, 0xaa, 0xaa, 0xa0, 0xe, + 0x0, 0x3, 0x3f, 0x33, 0x3e, 0x0, 0xe2, 0x67, + 0x0, 0xe0, 0x0, 0xe6, 0xbf, 0xb8, 0x40, 0xd, + 0x0, 0x1d, 0x32, 0xe0, 0x0, 0x2, 0xc0, 0x1, + 0xd0, 0xe, 0x0, 0x0, 0x4a, 0x0, 0x2c, 0x0, + 0xe0, 0x0, 0x7, 0x70, 0x3, 0xb0, 0xe, 0x4, + 0xa0, 0xc3, 0x0, 0x4b, 0x0, 0xfd, 0xa3, 0x3d, + 0x0, 0x5, 0x90, 0x4a, 0x20, 0xb, 0x50, 0x0, + 0x78, 0x0, 0x0, 0x9, 0xb0, 0x0, 0xb, 0x50, + 0x0, 0x8, 0xa0, 0x2, 0xee, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+520A "刊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xbe, + 0xef, 0xee, 0x70, 0x0, 0xe, 0x0, 0x2, 0xd0, + 0x0, 0x1d, 0x0, 0xe0, 0x0, 0x2d, 0x0, 0x1, + 0xd0, 0xe, 0x0, 0x2, 0xd0, 0x0, 0x1d, 0x0, + 0xe0, 0x44, 0x5d, 0x44, 0x31, 0xd0, 0xe, 0x2a, + 0xab, 0xfa, 0xaa, 0x1d, 0x0, 0xe0, 0x0, 0x2d, + 0x0, 0x1, 0xd0, 0xe, 0x0, 0x2, 0xd0, 0x0, + 0x1d, 0x0, 0xe0, 0x0, 0x2d, 0x0, 0x1, 0x90, + 0xe, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x2, + 0xc0, 0x0, 0x6, 0xfe, 0x90, + + /* U+5217 "列" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd1, 0xee, + 0xfe, 0xee, 0xe0, 0x0, 0x1d, 0x0, 0xe, 0x0, + 0x0, 0xe, 0x1, 0xd0, 0x4, 0xb0, 0x0, 0x0, + 0xe0, 0x1d, 0x0, 0x9e, 0xdd, 0xd6, 0xe, 0x1, + 0xd0, 0x1e, 0x10, 0x9, 0x40, 0xe0, 0x1d, 0x9, + 0x80, 0x0, 0xd0, 0xe, 0x1, 0xd0, 0xc3, 0xa0, + 0x3b, 0x0, 0xe0, 0x1d, 0x0, 0x7, 0xdc, 0x40, + 0xe, 0x1, 0xd0, 0x0, 0x7, 0xb0, 0x0, 0xa0, + 0x1d, 0x0, 0x3, 0xd2, 0x0, 0x0, 0x1, 0xd0, + 0x6, 0xe2, 0x0, 0x0, 0x0, 0x1d, 0x9, 0xa1, + 0x0, 0x0, 0x0, 0xde, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+521D "初" */ + 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xc0, 0x4, 0x44, 0x44, 0x44, 0x0, 0x8, 0x21, + 0x99, 0xea, 0x99, 0xf2, 0xdd, 0xdf, 0x60, 0xd, + 0x20, 0xe, 0x0, 0x1, 0xd0, 0x0, 0xe0, 0x0, + 0xe0, 0x0, 0xa6, 0x20, 0xe, 0x0, 0x1d, 0x0, + 0x5f, 0x5b, 0x2, 0xd0, 0x1, 0xd0, 0x5e, 0xfe, + 0x10, 0x59, 0x0, 0x2c, 0x3e, 0x3e, 0x4b, 0x8, + 0x60, 0x3, 0xb0, 0x11, 0xe0, 0x20, 0xe1, 0x0, + 0x4a, 0x0, 0x1e, 0x0, 0x79, 0x0, 0x6, 0x80, + 0x1, 0xe0, 0x4e, 0x20, 0x0, 0xa5, 0x0, 0x1e, + 0xc, 0x30, 0x3e, 0xec, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, + + /* U+5224 "判" */ + 0x1, 0x0, 0xe0, 0x1, 0x0, 0x0, 0xe0, 0xb3, + 0xe, 0x4, 0xb0, 0x0, 0xe, 0x3, 0xb0, 0xe0, + 0xc4, 0xe, 0x0, 0xe0, 0xc, 0x2e, 0x3c, 0x0, + 0xe0, 0xe, 0x6, 0x88, 0xf8, 0x95, 0xe, 0x0, + 0xe0, 0x45, 0x6f, 0x55, 0x30, 0xe0, 0xe, 0x0, + 0x0, 0xe0, 0x0, 0xe, 0x0, 0xe0, 0x11, 0x3e, + 0x11, 0x10, 0xe0, 0xe, 0x4b, 0xbd, 0xeb, 0xbb, + 0xe, 0x0, 0xe0, 0x0, 0x96, 0x0, 0x0, 0x90, + 0xe, 0x0, 0x1e, 0x10, 0x0, 0x0, 0x0, 0xe0, + 0x1c, 0x70, 0x0, 0x0, 0x0, 0xe, 0xa, 0x80, + 0x0, 0x0, 0x6, 0xee, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5225 "別" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0xdd, + 0xdd, 0xea, 0x0, 0x0, 0x2b, 0xd, 0x0, 0x3, + 0xa0, 0xe0, 0x2, 0xb0, 0xd0, 0x0, 0x3a, 0xe, + 0x0, 0x2b, 0xd, 0x66, 0x68, 0xa0, 0xe0, 0x2, + 0xb0, 0x6a, 0xc7, 0x74, 0xe, 0x0, 0x2b, 0x0, + 0x68, 0x0, 0x0, 0xe0, 0x2, 0xb0, 0x8, 0xed, + 0xdb, 0xe, 0x0, 0x2b, 0x0, 0xb3, 0x3, 0xa0, + 0xe0, 0x2, 0xb0, 0xd, 0x0, 0x49, 0x9, 0x0, + 0x2b, 0x5, 0xa0, 0x5, 0x80, 0x0, 0x2, 0xb1, + 0xd3, 0x0, 0x86, 0x0, 0x0, 0x3b, 0x76, 0x9, + 0xcc, 0x10, 0xb, 0xee, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5229 "利" */ + 0x0, 0x0, 0x38, 0xc1, 0x0, 0x0, 0xe0, 0x8b, + 0xff, 0x82, 0x0, 0x0, 0xe, 0x6, 0x32, 0xd0, + 0x0, 0x67, 0x0, 0xe0, 0x0, 0x1d, 0x0, 0x6, + 0x70, 0xe, 0x7, 0x78, 0xe7, 0x74, 0x67, 0x0, + 0xe0, 0x66, 0xae, 0x66, 0x36, 0x70, 0xe, 0x0, + 0xd, 0xe1, 0x0, 0x67, 0x0, 0xe0, 0x6, 0xae, + 0xc2, 0x6, 0x70, 0xe, 0x1, 0xd2, 0xd2, 0xd3, + 0x67, 0x0, 0xe0, 0xb5, 0x1d, 0x2, 0x14, 0x50, + 0xe, 0x39, 0x1, 0xd0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0xe, 0x0, 0x1, + 0xc0, 0x0, 0x4, 0xee, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5230 "到" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xee, + 0xee, 0xee, 0xe2, 0x70, 0xe, 0x0, 0x1d, 0x22, + 0x20, 0xe, 0x0, 0xe0, 0x7, 0x70, 0x4b, 0x0, + 0xe0, 0xe, 0x3, 0xe4, 0x57, 0xd7, 0xe, 0x0, + 0xe0, 0x6a, 0x86, 0x53, 0xc0, 0xe0, 0xe, 0x0, + 0x0, 0xc1, 0x0, 0xe, 0x0, 0xe0, 0x36, 0x6e, + 0x76, 0x50, 0xe0, 0xe, 0x4, 0x66, 0xe7, 0x66, + 0xe, 0x0, 0xe0, 0x0, 0xd, 0x10, 0x0, 0xd0, + 0xe, 0x0, 0x0, 0xd5, 0x7a, 0x0, 0x0, 0xe0, + 0x7a, 0xde, 0xa7, 0x40, 0x0, 0xe, 0x7, 0x41, + 0x0, 0x0, 0x1, 0xee, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5236 "制" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xa, 0x30, 0x0, 0x0, 0xe, 0x1, 0xd0, 0xa3, + 0x0, 0x2, 0x50, 0xe0, 0x6f, 0xdf, 0xed, 0xd1, + 0x48, 0xe, 0xd, 0x20, 0xa3, 0x0, 0x4, 0x80, + 0xe1, 0xb7, 0x7d, 0x97, 0x75, 0x48, 0xe, 0x5, + 0x55, 0xc8, 0x55, 0x34, 0x80, 0xe0, 0x12, 0x2b, + 0x52, 0x20, 0x48, 0xe, 0x7, 0xdb, 0xec, 0xbe, + 0x24, 0x80, 0xe0, 0x76, 0xa, 0x30, 0xb2, 0x48, + 0xe, 0x7, 0x60, 0xa3, 0xb, 0x20, 0x0, 0xe0, + 0x76, 0xa, 0x30, 0xb2, 0x0, 0xe, 0x7, 0x50, + 0xa4, 0xcd, 0x10, 0x0, 0xe0, 0x0, 0xa, 0x30, + 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5238 "券" */ + 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x40, 0x78, 0x2, 0xc0, 0x0, 0x0, 0x2, + 0xa0, 0xc3, 0xc, 0x30, 0x0, 0x3, 0xdd, 0xde, + 0xfd, 0xdd, 0xdd, 0x20, 0x0, 0x0, 0xc, 0x40, + 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xef, 0xdd, 0xdd, + 0xdd, 0xd2, 0x0, 0x8, 0xc0, 0x0, 0x2d, 0x30, + 0x0, 0x0, 0x9d, 0x10, 0x0, 0x3, 0xe5, 0x0, + 0x3e, 0x9d, 0xdf, 0xdd, 0xde, 0xcb, 0xd3, 0x2, + 0x0, 0xe, 0x0, 0x5, 0x90, 0x31, 0x0, 0x0, + 0x79, 0x0, 0x7, 0x70, 0x0, 0x0, 0x19, 0xc1, + 0x0, 0xa, 0x50, 0x0, 0x5, 0xd7, 0x0, 0xd, + 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+523B "刻" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x10, 0x0, 0x0, 0xe, 0x0, 0x0, 0x96, + 0x0, 0x0, 0x0, 0xe1, 0xdd, 0xef, 0xed, 0xd7, + 0x67, 0xe, 0x0, 0xa, 0x60, 0x0, 0x6, 0x70, + 0xe0, 0x6, 0x90, 0xa, 0x30, 0x67, 0xe, 0x5, + 0xf8, 0x8a, 0xb0, 0x6, 0x70, 0xe0, 0x35, 0x47, + 0xd1, 0x20, 0x67, 0xe, 0x0, 0x5, 0xd2, 0x1d, + 0x16, 0x70, 0xe0, 0x1a, 0xc1, 0xc, 0x40, 0x67, + 0xe, 0x9, 0x70, 0xb, 0x90, 0x4, 0x50, 0xe0, + 0x0, 0x2d, 0x8d, 0x50, 0x0, 0xe, 0x1, 0x8e, + 0x40, 0x1c, 0x50, 0x0, 0xe0, 0xa8, 0x0, 0x0, + 0x11, 0xd, 0xda, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5247 "則" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc0, 0xdd, + 0xdd, 0xec, 0x0, 0x0, 0x2c, 0xd, 0x0, 0x2, + 0xc0, 0xe0, 0x2, 0xc0, 0xd8, 0x88, 0x9c, 0xe, + 0x0, 0x2c, 0xd, 0x44, 0x46, 0xc0, 0xe0, 0x2, + 0xc0, 0xd0, 0x0, 0x2c, 0xe, 0x0, 0x2c, 0xd, + 0xcc, 0xcd, 0xc0, 0xe0, 0x2, 0xc0, 0xd0, 0x0, + 0x2c, 0xe, 0x0, 0x2c, 0xd, 0x43, 0x35, 0xc0, + 0xe0, 0x2, 0xc0, 0x89, 0x99, 0x97, 0x9, 0x0, + 0x2c, 0x2, 0xc0, 0xb, 0x10, 0x0, 0x2, 0xc0, + 0xc6, 0x0, 0x5a, 0x0, 0x0, 0x3c, 0x68, 0x0, + 0x0, 0x80, 0xb, 0xee, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+524A "削" */ + 0x15, 0xb, 0x30, 0x63, 0x0, 0x1, 0xd0, 0xd0, + 0xb3, 0xe, 0x14, 0x10, 0x1d, 0x9, 0x4b, 0x34, + 0xb0, 0xa3, 0x1, 0xd0, 0x33, 0xb3, 0x53, 0xa, + 0x30, 0x1d, 0xc, 0xef, 0xee, 0xd0, 0xa3, 0x1, + 0xd0, 0xe0, 0x0, 0xe, 0xa, 0x30, 0x1d, 0xe, + 0xaa, 0xaa, 0xe0, 0xa3, 0x1, 0xd0, 0xe1, 0x11, + 0x1e, 0xa, 0x30, 0x1d, 0xe, 0x0, 0x0, 0xe0, + 0xa3, 0x1, 0xd0, 0xed, 0xdd, 0xde, 0x8, 0x20, + 0x1d, 0xe, 0x0, 0x0, 0xe0, 0x0, 0x1, 0xd0, + 0xe0, 0x0, 0xe, 0x0, 0x0, 0x1d, 0xd, 0x0, + 0xcd, 0x80, 0xc, 0xee, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+524D "前" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x3, + 0xd0, 0x0, 0xb, 0x60, 0x0, 0x2b, 0xbb, 0xeb, + 0xbb, 0xbf, 0xbb, 0xb2, 0x2, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x20, 0x1, 0x33, 0x33, 0x20, 0x0, + 0x6, 0x20, 0x5, 0xda, 0xab, 0xb0, 0x76, 0xa, + 0x40, 0x5, 0x80, 0x3, 0xb0, 0x76, 0xa, 0x40, + 0x5, 0xec, 0xcd, 0xb0, 0x76, 0xa, 0x40, 0x5, + 0x80, 0x3, 0xb0, 0x76, 0xa, 0x40, 0x5, 0xd9, + 0x9b, 0xb0, 0x76, 0xa, 0x40, 0x5, 0x91, 0x14, + 0xb0, 0x54, 0xa, 0x40, 0x5, 0x80, 0x3, 0xb0, + 0x0, 0xa, 0x40, 0x5, 0x80, 0xbd, 0x70, 0x9, + 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+525B "剛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xdd, 0xdd, + 0xdd, 0xe6, 0x1, 0xd, 0xd0, 0x70, 0x27, 0x76, + 0xd, 0xd, 0xd0, 0x90, 0x65, 0x76, 0xd, 0xd, + 0xd0, 0x53, 0xb1, 0x86, 0xd, 0xd, 0xd4, 0xad, + 0xba, 0x86, 0xd, 0xd, 0xd0, 0x37, 0x23, 0x76, + 0xd, 0xd, 0xd0, 0x97, 0x29, 0x76, 0xd, 0xd, + 0xd0, 0x97, 0x29, 0x76, 0xd, 0xd, 0xd0, 0x97, + 0x29, 0x76, 0xa, 0xd, 0xd0, 0xaa, 0xa6, 0x76, + 0x0, 0xd, 0xd0, 0x0, 0x0, 0x86, 0x0, 0xd, + 0xd0, 0x0, 0x6d, 0xd2, 0xc, 0xd9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+5272 "割" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x0, 0xe, 0x99, 0x9f, 0xa9, 0x95, + 0x0, 0xe, 0xd1, 0x13, 0x21, 0x48, 0xa2, 0xe, + 0x89, 0x9e, 0x99, 0x93, 0xa2, 0xe, 0x3, 0x3d, + 0x33, 0x20, 0xa2, 0xe, 0xa, 0xbf, 0xbb, 0x50, + 0xa2, 0xe, 0x0, 0xc, 0x0, 0x0, 0xa2, 0xe, + 0xab, 0xbf, 0xbb, 0xb4, 0xa2, 0xe, 0x0, 0xc, + 0x0, 0x0, 0xa2, 0xe, 0x2e, 0xdd, 0xdd, 0xd0, + 0x82, 0xe, 0x29, 0x0, 0x0, 0xd0, 0x0, 0xe, + 0x2d, 0xaa, 0xaa, 0xd0, 0x0, 0xe, 0x2a, 0x11, + 0x11, 0xc0, 0x2d, 0xda, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5275 "創" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x0, 0x0, 0xe, 0x0, 0xa, 0xac, + 0x40, 0x5, 0x0, 0xe0, 0xa, 0xa8, 0x1b, 0x80, + 0xd0, 0xe, 0x2e, 0x80, 0x86, 0x7, 0x1d, 0x0, + 0xe0, 0x49, 0x99, 0x99, 0x60, 0xd0, 0xe, 0x0, + 0xd2, 0x22, 0x4a, 0xd, 0x0, 0xe0, 0xe, 0xaa, + 0xab, 0xa0, 0xd0, 0xe, 0x2, 0xc3, 0x33, 0x5a, + 0xd, 0x0, 0xe0, 0x3c, 0x77, 0x77, 0x50, 0xd0, + 0xe, 0x7, 0x8b, 0xbb, 0xb8, 0x6, 0x0, 0xe0, + 0xc5, 0x90, 0x1, 0xb0, 0x0, 0xe, 0x59, 0x3e, + 0xaa, 0xbb, 0x0, 0x0, 0xe0, 0x13, 0xa1, 0x12, + 0xa0, 0x3e, 0xe9, + + /* U+5283 "劃" */ + 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0xe0, 0x2a, + 0xad, 0xba, 0xe0, 0x11, 0xe, 0x19, 0x99, 0xda, + 0x9e, 0x88, 0x50, 0xe0, 0x22, 0x2a, 0x52, 0xd2, + 0x85, 0xe, 0x2, 0x99, 0xdb, 0x9a, 0x8, 0x50, + 0xe0, 0x38, 0x8d, 0xa8, 0x82, 0x85, 0xe, 0x9, + 0x99, 0xdb, 0x99, 0x88, 0x50, 0xe0, 0x14, 0x44, + 0x44, 0x41, 0x85, 0xe, 0x3, 0xb6, 0xb9, 0x6e, + 0x8, 0x50, 0xe0, 0x3c, 0x8c, 0xa8, 0xe0, 0x53, + 0xe, 0x3, 0xc7, 0xb9, 0x7e, 0x0, 0x0, 0xe0, + 0x2, 0x22, 0x34, 0x42, 0x0, 0xe, 0x1c, 0xcc, + 0xcb, 0xa9, 0x80, 0xbe, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+529B "力" */ + 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0x8d, 0xdd, 0xdf, 0xdd, 0xdd, 0xdc, + 0x1, 0x11, 0x2e, 0x11, 0x11, 0x3d, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x78, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x5a, + 0x0, 0x4, 0xd0, 0x0, 0x0, 0x68, 0x0, 0xe, + 0x40, 0x0, 0x0, 0x87, 0x0, 0xa9, 0x0, 0x0, + 0x0, 0xb4, 0xb, 0xb0, 0x0, 0x0, 0x1, 0xe1, + 0xb9, 0x0, 0x0, 0xd, 0xef, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+529F "功" */ + 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x16, + 0x66, 0x65, 0x0, 0xc2, 0x0, 0x0, 0x18, 0x9e, + 0x88, 0x0, 0xc2, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0xbb, 0xfc, 0xbb, 0xb2, 0x0, 0x1d, 0x0, 0x22, + 0xe3, 0x22, 0xc2, 0x0, 0x1d, 0x0, 0x0, 0xe0, + 0x0, 0xc2, 0x0, 0x1d, 0x0, 0x1, 0xd0, 0x0, + 0xd1, 0x0, 0x1d, 0x0, 0x5, 0xa0, 0x0, 0xe0, + 0x0, 0x2e, 0x9d, 0x29, 0x60, 0x0, 0xe0, 0x2c, + 0xea, 0x61, 0x1e, 0x10, 0x0, 0xe0, 0x14, 0x0, + 0x0, 0x98, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x8, + 0xd0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x6b, 0x0, + 0x3e, 0xee, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+52A0 "加" */ + 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xb0, 0x0, 0x1, 0x11, 0x11, 0x0, 0x3b, 0x0, + 0x0, 0xff, 0xff, 0xd3, 0xef, 0xfe, 0xed, 0xe, + 0x0, 0x1d, 0x0, 0x4a, 0x1, 0xc0, 0xe0, 0x1, + 0xd0, 0x5, 0x90, 0x2c, 0xe, 0x0, 0x1d, 0x0, + 0x67, 0x2, 0xc0, 0xe0, 0x1, 0xd0, 0x8, 0x50, + 0x2b, 0xe, 0x0, 0x1d, 0x0, 0xb3, 0x3, 0xb0, + 0xe0, 0x1, 0xd0, 0xe, 0x0, 0x4a, 0xe, 0x0, + 0x1d, 0x5, 0xa0, 0x5, 0x90, 0xe0, 0x1, 0xd0, + 0xd4, 0x0, 0x87, 0xf, 0xee, 0xed, 0x59, 0x7, + 0xed, 0x20, 0xe0, 0x1, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+52A8 "动" */ + 0x0, 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x9, + 0xcc, 0xcc, 0x80, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x7e, 0x87, 0x71, 0x0, 0x0, 0x0, 0x8, + 0x9f, 0x99, 0xe2, 0x3d, 0xef, 0xdd, 0xc0, 0xe, + 0x0, 0xc2, 0x0, 0x78, 0x0, 0x0, 0xe, 0x0, + 0xc1, 0x0, 0xb3, 0xa, 0x0, 0x3b, 0x0, 0xd1, + 0x0, 0xd0, 0x9, 0x40, 0x68, 0x0, 0xe0, 0x6, + 0x80, 0x39, 0xa0, 0xb4, 0x0, 0xe0, 0xe, 0xec, + 0x96, 0xd2, 0xe0, 0x1, 0xd0, 0x4, 0x0, 0x0, + 0x1b, 0x70, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x4b, + 0xa, 0xee, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+52A9 "助" */ + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0xbe, + 0xdd, 0xd0, 0x1, 0xd0, 0x0, 0xb, 0x20, 0xd, + 0x0, 0x1c, 0x0, 0x0, 0xb2, 0x0, 0xd5, 0x89, + 0xe8, 0x86, 0xb, 0xed, 0xdd, 0x35, 0x7d, 0x57, + 0xb0, 0xb2, 0x0, 0xd0, 0x4, 0xa0, 0x2b, 0xb, + 0x20, 0xd, 0x0, 0x68, 0x3, 0xb0, 0xbd, 0xdd, + 0xd0, 0x9, 0x50, 0x3a, 0xb, 0x20, 0xd, 0x0, + 0xe1, 0x4, 0x90, 0xb2, 0x1, 0xe5, 0x5b, 0x0, + 0x58, 0x3d, 0xbe, 0xc9, 0x4d, 0x20, 0x7, 0x76, + 0x74, 0x0, 0x1c, 0x80, 0x0, 0xa5, 0x0, 0x0, + 0xa, 0x70, 0xb, 0xed, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+52AA "努" */ + 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x50, 0x5, 0xed, 0xdd, 0xf1, 0xd, 0xef, + 0xdd, 0xe0, 0xd1, 0x3, 0xb0, 0x0, 0xa5, 0x5, + 0x90, 0x68, 0xb, 0x40, 0x0, 0xba, 0x4d, 0x10, + 0xc, 0xb8, 0x0, 0x0, 0x6, 0xfd, 0x30, 0x4c, + 0xd9, 0x20, 0x8, 0xc9, 0x13, 0x78, 0x92, 0x5, + 0xd5, 0x4, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, + 0x1, 0xcc, 0xcc, 0xee, 0xcc, 0xcc, 0x70, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0x8, 0x70, 0x0, 0x0, + 0xb, 0x70, 0x0, 0xa, 0x40, 0x0, 0x5, 0xd8, + 0x0, 0x0, 0xe, 0x10, 0x8, 0xe9, 0x20, 0x0, + 0x6d, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+52B3 "劳" */ + 0x0, 0x0, 0xf0, 0x0, 0xe, 0x0, 0x0, 0x2, + 0x22, 0xf2, 0x22, 0x3e, 0x22, 0x20, 0x1b, 0xbb, + 0xfb, 0xbb, 0xbf, 0xbb, 0xb2, 0x0, 0x0, 0xe0, + 0x0, 0xe, 0x0, 0x0, 0xb, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xa0, 0xd, 0x10, 0x0, 0x70, 0x0, + 0x2, 0xc0, 0x8, 0x0, 0x1, 0xd0, 0x0, 0x1, + 0x60, 0x1, 0xcc, 0xcc, 0xfc, 0xcc, 0xca, 0x0, + 0x0, 0x11, 0x19, 0x81, 0x11, 0x3c, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x3b, 0x0, 0x0, 0x0, + 0xa9, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4d, 0xa0, + 0x0, 0x0, 0x87, 0x0, 0x1e, 0xa4, 0x0, 0x6, + 0xee, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+52C9 "勉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xae, + 0xb8, 0x0, 0xe, 0x0, 0x0, 0x3, 0xc1, 0x39, + 0x0, 0xe, 0x0, 0x0, 0x1e, 0x30, 0x84, 0xd, + 0xdf, 0xdd, 0xb0, 0x8f, 0xcc, 0xfc, 0xf4, 0x4d, + 0x34, 0xc0, 0xd, 0x0, 0xc0, 0xc1, 0x2b, 0x2, + 0xb0, 0xd, 0x1, 0xc0, 0xc1, 0x59, 0x2, 0xb0, + 0xd, 0xcd, 0xfc, 0xf1, 0x95, 0x4, 0x90, 0x0, + 0x6, 0xb7, 0x1, 0xe0, 0x5, 0x80, 0x0, 0xc, + 0x67, 0xa, 0x70, 0x9, 0x60, 0x0, 0x5b, 0x37, + 0x79, 0x3, 0xdb, 0x51, 0x4, 0xd1, 0x28, 0x0, + 0x0, 0x0, 0xc2, 0x6c, 0x10, 0xb, 0xcc, 0xcc, + 0xcd, 0xa0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+52D5 "動" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x59, 0xd4, 0xc, 0x20, 0x0, 0xa, 0xba, + 0xe6, 0x31, 0xc, 0x20, 0x0, 0x15, 0x56, 0xd5, + 0x54, 0xc, 0x20, 0x0, 0x15, 0x56, 0xd5, 0x57, + 0x7e, 0x87, 0x72, 0x7, 0xab, 0xea, 0xa7, 0x6e, + 0x66, 0xc5, 0xb, 0x1, 0xc0, 0x48, 0xe, 0x0, + 0xa4, 0xb, 0xab, 0xea, 0xc8, 0x1e, 0x0, 0xa3, + 0xb, 0x44, 0xd3, 0x78, 0x2c, 0x0, 0xb3, 0x4, + 0x67, 0xd6, 0x63, 0x68, 0x0, 0xc2, 0x9, 0xbc, + 0xfb, 0xb6, 0xb4, 0x0, 0xd1, 0x0, 0x1, 0xc0, + 0x3, 0xd0, 0x0, 0xe0, 0x6, 0x79, 0xfc, 0xdf, + 0x50, 0x2, 0xd0, 0x7, 0x53, 0x20, 0x77, 0x5, + 0xde, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+52D9 "務" */ + 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, 0x0, 0x3d, + 0xdd, 0xdf, 0x13, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x99, 0x1d, 0xdc, 0xcd, 0xa0, 0x2, 0x97, 0xa0, + 0xc9, 0xb0, 0x1c, 0x20, 0x0, 0x5e, 0x0, 0x20, + 0x3b, 0xc4, 0x0, 0x5d, 0xde, 0xdd, 0x52, 0x9c, + 0xca, 0x40, 0x0, 0x7f, 0xa, 0xbc, 0x73, 0x5, + 0xb6, 0x0, 0xce, 0xc, 0x0, 0x4a, 0x0, 0x0, + 0x7, 0x7e, 0x24, 0xac, 0xee, 0xcd, 0xc0, 0x3d, + 0xe, 0x0, 0x0, 0xc2, 0x2, 0xc0, 0x33, 0xe, + 0x0, 0x6, 0xb0, 0x4, 0xa0, 0x0, 0xe, 0x0, + 0x7d, 0x10, 0x8, 0x60, 0x4, 0xdc, 0x9, 0x81, + 0x8, 0xdc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+52DD "勝" */ + 0x0, 0x0, 0x0, 0x10, 0x35, 0x2, 0x0, 0xb, + 0xdd, 0xd1, 0xc2, 0x67, 0x2c, 0x0, 0xb, 0x0, + 0xd0, 0x26, 0x85, 0x92, 0x0, 0xb, 0x0, 0xd4, + 0xcc, 0xfd, 0xcc, 0x60, 0xb, 0xcc, 0xd0, 0x1, + 0xd0, 0x0, 0x0, 0xc, 0x0, 0xda, 0xce, 0xec, + 0xdc, 0xc1, 0xc, 0x21, 0xd0, 0x5b, 0x41, 0xa5, + 0x0, 0xc, 0xbb, 0xd7, 0xc1, 0xc1, 0xa, 0x91, + 0xc, 0x0, 0xe7, 0xdc, 0xfc, 0xcc, 0x40, 0xc, + 0x0, 0xd0, 0x3, 0xb0, 0xd, 0x0, 0x2c, 0x0, + 0xd0, 0xb, 0x50, 0x1c, 0x0, 0x58, 0x0, 0xd0, + 0x7b, 0x0, 0x3a, 0x0, 0x74, 0x5d, 0x99, 0x90, + 0x2c, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+52E4 "勤" */ + 0x0, 0xa2, 0x8, 0x50, 0x9, 0x30, 0x0, 0x2b, + 0xec, 0xbd, 0xda, 0xa, 0x30, 0x0, 0x0, 0xa2, + 0x8, 0x50, 0xa, 0x30, 0x0, 0x0, 0x6a, 0xe9, + 0x33, 0x9d, 0xb9, 0x93, 0x7, 0xab, 0xea, 0xa5, + 0x3c, 0x53, 0xa5, 0xa, 0x22, 0xb0, 0x85, 0xd, + 0x10, 0x85, 0xa, 0x88, 0xd6, 0xb5, 0xe, 0x0, + 0x94, 0x3, 0x46, 0xd4, 0x41, 0xd, 0x0, 0xa4, + 0x9, 0xbb, 0xeb, 0xb6, 0x2a, 0x0, 0xa3, 0x0, + 0x2, 0xb0, 0x0, 0x67, 0x0, 0xb2, 0x6, 0xab, + 0xea, 0xa3, 0xc1, 0x0, 0xd1, 0x3, 0x46, 0xd7, + 0x8a, 0xa0, 0x0, 0xe0, 0x19, 0x76, 0x43, 0x3c, + 0x2, 0xde, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+52F5 "勵" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xb, + 0xcb, 0xbb, 0xbb, 0x40, 0xd0, 0x0, 0xb, 0x13, + 0xa1, 0xb1, 0x0, 0xd0, 0x0, 0xb, 0x69, 0xd8, + 0xe8, 0x33, 0xd2, 0x20, 0xb, 0x26, 0x96, 0xa5, + 0x8b, 0xea, 0xe2, 0xb, 0x4a, 0x3b, 0x3b, 0x2, + 0xb0, 0xb1, 0xc, 0x4c, 0x9d, 0x9c, 0x3, 0x90, + 0xb1, 0xc, 0x4c, 0x8d, 0x8c, 0x5, 0x70, 0xc1, + 0xc, 0x13, 0x3b, 0x33, 0x7, 0x50, 0xc0, 0xc, + 0xaa, 0x9d, 0x9d, 0x2b, 0x20, 0xd0, 0x3a, 0xa2, + 0xa, 0x98, 0x3d, 0x0, 0xd0, 0x66, 0xa7, 0xa7, + 0x9a, 0xa7, 0x1, 0xc0, 0x42, 0xa2, 0x0, 0x5c, + 0xc0, 0xad, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5305 "包" */ + 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xfe, 0xee, 0xee, 0xee, 0x40, 0x0, 0x89, 0x0, + 0x0, 0x0, 0xa, 0x40, 0x7, 0xd3, 0x22, 0x22, + 0x20, 0xa, 0x40, 0x1b, 0x1f, 0xaa, 0xaa, 0xd0, + 0xb, 0x30, 0x0, 0xe, 0x0, 0x0, 0xd0, 0xc, + 0x20, 0x0, 0xe, 0x11, 0x11, 0xd0, 0xd, 0x10, + 0x0, 0xf, 0xbb, 0xbb, 0xa0, 0x1e, 0x0, 0x0, + 0xe, 0x0, 0x0, 0xa, 0xe7, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, 0xf, 0x10, + 0x0, 0x0, 0x0, 0xa6, 0x0, 0x7, 0xee, 0xee, + 0xee, 0xee, 0xb0, + + /* U+5316 "化" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe1, 0xe, 0x10, 0x0, 0x0, 0x0, 0x7, + 0xa0, 0xe, 0x10, 0x0, 0x0, 0x0, 0xe, 0x20, + 0xe, 0x10, 0x6, 0xa0, 0x0, 0x9f, 0x0, 0xe, + 0x10, 0x3e, 0x30, 0x5, 0xef, 0x0, 0xe, 0x12, + 0xd5, 0x0, 0x2e, 0x4f, 0x0, 0xe, 0x3e, 0x60, + 0x0, 0x4, 0xf, 0x0, 0xe, 0xe5, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x8f, 0x40, 0x0, 0x0, 0x0, + 0xf, 0x2d, 0xbf, 0x10, 0x0, 0x0, 0x0, 0xf, + 0x5, 0xe, 0x10, 0x0, 0xa3, 0x0, 0xf, 0x0, + 0xe, 0x10, 0x0, 0xb3, 0x0, 0xf, 0x0, 0xe, + 0x20, 0x0, 0xe0, 0x0, 0xf, 0x0, 0x8, 0xfe, + 0xee, 0x80, + + /* U+5317 "北" */ + 0x0, 0x0, 0x3b, 0x0, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0xe1, 0x0, 0x10, 0x0, 0x0, 0x3b, + 0x0, 0xe1, 0x4, 0xe2, 0xc, 0xee, 0xfb, 0x0, + 0xe1, 0x8d, 0x30, 0x0, 0x0, 0x3b, 0x0, 0xed, + 0x80, 0x0, 0x0, 0x0, 0x3b, 0x0, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0xe1, 0x0, 0x0, 0x0, + 0x17, 0xdb, 0x0, 0xe1, 0x0, 0x18, 0x1b, 0xe8, + 0x5b, 0x0, 0xe1, 0x0, 0x2c, 0x5, 0x0, 0x3b, + 0x0, 0xd2, 0x0, 0x5a, 0x0, 0x0, 0x3b, 0x0, + 0x8f, 0xee, 0xe3, + + /* U+533B "医" */ + 0xde, 0xee, 0xee, 0xee, 0xee, 0xeb, 0xd, 0x10, + 0x8, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x7, 0xa1, + 0x11, 0x11, 0x10, 0xd, 0x13, 0xeb, 0xbf, 0xbb, + 0xb9, 0x0, 0xd1, 0xb3, 0x0, 0xc1, 0x0, 0x0, + 0xd, 0x12, 0x22, 0x2d, 0x42, 0x22, 0x10, 0xd2, + 0xaa, 0xaa, 0xfb, 0xaa, 0xa5, 0xd, 0x10, 0x0, + 0x5d, 0xc2, 0x0, 0x0, 0xd1, 0x0, 0x4d, 0x23, + 0xd4, 0x0, 0xd, 0x14, 0xbc, 0x20, 0x1, 0xd5, + 0x0, 0xd3, 0x85, 0x21, 0x11, 0x13, 0x71, 0xa, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb1, + + /* U+5340 "區" */ + 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xd4, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xfa, 0xaa, + 0xf2, 0x0, 0xe0, 0x0, 0xe0, 0x0, 0xd2, 0x0, + 0xe0, 0x0, 0xdb, 0xbb, 0xc1, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0xcb, 0xbe, 0xf, + 0xbb, 0xd0, 0xe0, 0xc0, 0xb, 0xc, 0x0, 0xd0, + 0xe0, 0xc5, 0x5d, 0xe, 0x55, 0xd0, 0xe0, 0x34, + 0x44, 0x4, 0x44, 0x30, 0xeb, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + + /* U+5341 "十" */ + 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x3, 0x33, 0x33, 0x8b, 0x33, + 0x33, 0x31, 0xb, 0xbb, 0xbb, 0xce, 0xbb, 0xbb, + 0xb4, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, + + /* U+5343 "千" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, + 0x0, 0x13, 0x57, 0xad, 0xd8, 0x0, 0x2, 0xde, + 0xca, 0xbc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, + 0x0, 0x0, 0x1e, 0xee, 0xee, 0xff, 0xee, 0xee, + 0xe6, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, + 0x0, 0x0, 0x0, + + /* U+5348 "午" */ + 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xee, 0xee, 0xee, 0xee, 0x20, 0x0, 0xd3, 0x0, + 0x77, 0x0, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x77, + 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, 0x77, 0x0, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x88, 0x11, 0x11, + 0x10, 0x3d, 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0xd3, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x0, + + /* U+534A "半" */ + 0x0, 0x42, 0x0, 0x59, 0x0, 0x6, 0x0, 0x0, + 0x5b, 0x0, 0x59, 0x0, 0x5c, 0x0, 0x0, 0xd, + 0x30, 0x59, 0x0, 0xd3, 0x0, 0x0, 0x6, 0xa0, + 0x59, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x59, + 0x0, 0x10, 0x0, 0x2, 0xee, 0xee, 0xff, 0xee, + 0xee, 0x80, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe6, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, + 0x0, 0x0, 0x0, + + /* U+5352 "卒" */ + 0x0, 0x0, 0x0, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0xc, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xc0, 0x0, 0x1, 0xa0, + 0x0, 0x6, 0x40, 0x0, 0x0, 0x8, 0xa0, 0x0, + 0x1e, 0x10, 0x0, 0x0, 0x1e, 0xc7, 0x0, 0xad, + 0x80, 0x0, 0x2, 0xd5, 0x9, 0x5b, 0x80, 0x8c, + 0x10, 0xc, 0x70, 0x0, 0x48, 0x0, 0x5, 0xa0, + 0x1, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x3d, + 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0xd3, 0x0, 0x0, + 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x86, + 0x0, 0x0, 0x0, + + /* U+5354 "協" */ + 0x0, 0x95, 0x0, 0x0, 0x74, 0x0, 0x0, 0x0, + 0x95, 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0x95, + 0x5, 0xcc, 0xfc, 0xcd, 0xa0, 0x0, 0x95, 0x0, + 0x4, 0xa0, 0x7, 0x80, 0x5d, 0xee, 0xc0, 0x4d, + 0x10, 0xb, 0x40, 0x0, 0x95, 0xa, 0xc2, 0x6, + 0xc9, 0x0, 0x0, 0x95, 0x3, 0x60, 0x0, 0x80, + 0x0, 0x0, 0x95, 0x15, 0xb2, 0x12, 0xd2, 0x20, + 0x0, 0x95, 0x6c, 0xcb, 0xaa, 0xe9, 0xd3, 0x0, + 0x95, 0x8, 0x43, 0x81, 0xa0, 0x93, 0x0, 0x95, + 0xc, 0x14, 0x85, 0x60, 0xa2, 0x0, 0x95, 0x5a, + 0x6, 0x7c, 0x10, 0xc0, 0x0, 0x95, 0xa0, 0x9c, + 0x74, 0x4c, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5357 "南" */ + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x98, 0x11, 0x11, 0x10, 0x1d, 0xdd, + 0xdd, 0xee, 0xdd, 0xdd, 0xd2, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x4, 0xdd, 0xdd, 0xfe, + 0xdd, 0xdd, 0x50, 0x5, 0x90, 0x44, 0x0, 0x54, + 0x8, 0x60, 0x5, 0x90, 0x1c, 0x0, 0xc1, 0x8, + 0x60, 0x5, 0x93, 0xcd, 0xcd, 0xec, 0x58, 0x60, + 0x5, 0x90, 0x0, 0x76, 0x0, 0x8, 0x60, 0x5, + 0x96, 0xaa, 0xdd, 0xaa, 0x78, 0x60, 0x5, 0x91, + 0x11, 0x87, 0x11, 0x18, 0x60, 0x5, 0x90, 0x0, + 0x76, 0x0, 0x9, 0x60, 0x5, 0x90, 0x0, 0x76, + 0x9, 0xcd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5358 "単" */ + 0x0, 0x20, 0x0, 0x50, 0x0, 0x5, 0x0, 0x0, + 0x6b, 0x0, 0xc3, 0x0, 0x8a, 0x0, 0x0, 0xb, + 0x30, 0x58, 0x2, 0xd1, 0x0, 0x0, 0xbd, 0xcc, + 0xde, 0xcc, 0xcf, 0x20, 0x0, 0xb2, 0x0, 0x59, + 0x0, 0xc, 0x20, 0x0, 0xbc, 0xcc, 0xde, 0xcc, + 0xcf, 0x20, 0x0, 0xb2, 0x0, 0x59, 0x0, 0xc, + 0x20, 0x0, 0xbc, 0xbb, 0xce, 0xbb, 0xbe, 0x20, + 0x0, 0x11, 0x11, 0x6a, 0x11, 0x11, 0x0, 0x1, + 0x11, 0x11, 0x6a, 0x11, 0x11, 0x10, 0xc, 0xcc, + 0xcc, 0xde, 0xcc, 0xcc, 0xc5, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, + 0x0, 0x0, 0x0, + + /* U+5371 "危" */ + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfd, 0xdd, 0xd2, 0x0, 0x0, 0x0, 0x1e, + 0x20, 0x2, 0xe0, 0x0, 0x0, 0x2, 0xd8, 0x22, + 0x2a, 0x92, 0x22, 0x20, 0x2e, 0xfb, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa0, 0x45, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd1, 0x2f, 0xdd, 0xdd, 0xf0, + 0x0, 0x0, 0xf0, 0x2c, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xe0, 0x2c, 0x0, 0x2, 0xd0, 0x0, 0x2, + 0xc0, 0x2c, 0x2, 0xcd, 0x70, 0x0, 0x8, 0x70, + 0x2c, 0x0, 0x0, 0x0, 0xb1, 0x1e, 0x10, 0x2d, + 0x0, 0x0, 0x0, 0xe0, 0x87, 0x0, 0xb, 0xed, + 0xdd, 0xde, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5373 "即" */ + 0x3f, 0xdd, 0xdf, 0xb, 0xed, 0xde, 0x3b, 0x0, + 0xd, 0xc, 0x10, 0xe, 0x3b, 0x0, 0xd, 0xc, + 0x10, 0xe, 0x3f, 0xdd, 0xdf, 0xc, 0x10, 0xe, + 0x3b, 0x0, 0xd, 0xc, 0x10, 0xe, 0x3b, 0x11, + 0x1e, 0xc, 0x10, 0xe, 0x3e, 0xcc, 0xcc, 0xc, + 0x10, 0xe, 0x3b, 0x1, 0x50, 0xc, 0x10, 0xe, + 0x3b, 0x0, 0xc2, 0xc, 0x2a, 0xcd, 0x4b, 0x4a, + 0xdb, 0xc, 0x11, 0x10, 0x9f, 0xb5, 0xc, 0x2c, + 0x10, 0x0, 0x31, 0x0, 0x1, 0xc, 0x10, 0x0, + + /* U+537B "卻" */ + 0x0, 0x4, 0x4, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xb0, 0x6b, 0x3, 0xfd, 0xed, 0x2, 0xd2, 0x0, + 0xa8, 0x3b, 0x1, 0xd1, 0xd4, 0x1d, 0x1, 0xc4, + 0xb0, 0x1d, 0x3, 0x9, 0xe7, 0x0, 0x3b, 0x1, + 0xd0, 0x2, 0xd0, 0xa9, 0x3, 0xb0, 0x1d, 0x1, + 0xd3, 0x0, 0xa8, 0x3b, 0x1, 0xd2, 0xd6, 0x0, + 0x1, 0xa4, 0xb0, 0x1d, 0x24, 0xec, 0xcc, 0xf0, + 0x3b, 0x1, 0xd0, 0xd, 0x0, 0xd, 0x3, 0xb2, + 0x4d, 0x0, 0xd0, 0x0, 0xd0, 0x3b, 0x79, 0x40, + 0xe, 0xdd, 0xdf, 0x3, 0xb0, 0x0, 0x0, 0xd0, + 0x0, 0xd0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+539A "厚" */ + 0x0, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, 0x0, + 0xe0, 0x45, 0x55, 0x55, 0x55, 0x0, 0x0, 0xe0, + 0xe5, 0x55, 0x55, 0x5f, 0x0, 0x0, 0xe0, 0xea, + 0x99, 0x99, 0x9f, 0x0, 0x0, 0xe0, 0xe2, 0x11, + 0x11, 0x1f, 0x0, 0x0, 0xf0, 0x78, 0x88, 0x88, + 0x87, 0x0, 0x1, 0xe0, 0xab, 0xbb, 0xbb, 0xba, + 0x0, 0x1, 0xc0, 0x0, 0x0, 0x2a, 0xc3, 0x0, + 0x4, 0xa0, 0x0, 0x0, 0xf4, 0x0, 0x0, 0x7, + 0x6b, 0xcc, 0xcc, 0xfc, 0xcc, 0xc6, 0xd, 0x20, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x2a, 0x0, 0x5, + 0xcc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+539F "原" */ + 0x0, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, 0x0, + 0xe0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, 0xe0, + 0xab, 0xbe, 0xdb, 0xbb, 0x0, 0x0, 0xe0, 0xe0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0xf0, 0xe9, 0x99, + 0x99, 0x9f, 0x10, 0x0, 0xf0, 0xe1, 0x11, 0x11, + 0x1d, 0x10, 0x1, 0xe0, 0xe0, 0x0, 0x0, 0xd, + 0x10, 0x2, 0xc0, 0xab, 0xbb, 0xfb, 0xbb, 0x0, + 0x5, 0x90, 0x7, 0x0, 0xe0, 0x60, 0x0, 0x9, + 0x50, 0x98, 0x0, 0xe0, 0x6b, 0x0, 0xe, 0x19, + 0x90, 0x0, 0xe0, 0x7, 0xb0, 0x16, 0x2, 0x3, + 0xdd, 0xa0, 0x0, 0x40, + + /* U+53B3 "厳" */ + 0x0, 0x81, 0x3, 0x70, 0x0, 0x77, 0x0, 0x0, + 0x5a, 0x0, 0xd0, 0x2, 0xd1, 0x0, 0x7, 0xde, + 0xcc, 0xdc, 0xce, 0xec, 0xc0, 0x9, 0x42, 0x22, + 0x20, 0x6, 0x0, 0x0, 0x9, 0x59, 0x99, 0xe1, + 0x4b, 0x0, 0x0, 0x9, 0x53, 0x35, 0xc2, 0x8e, + 0xcc, 0xc2, 0x9, 0x6e, 0x77, 0xd6, 0xe4, 0x9, + 0x50, 0xa, 0x3c, 0xaa, 0xe9, 0xba, 0xc, 0x10, + 0xb, 0x2c, 0x0, 0xb4, 0xc, 0x3b, 0x0, 0xc, + 0xc, 0xaa, 0xe1, 0x6, 0xe4, 0x0, 0xd, 0xc, + 0x0, 0xb1, 0x6, 0xf2, 0x0, 0x59, 0x6e, 0xbb, + 0xe7, 0x7a, 0x4d, 0x30, 0x82, 0x11, 0x0, 0xb8, + 0x70, 0x2, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+53BB "去" */ + 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0xbb, + 0xbb, 0xce, 0xbb, 0xbb, 0x40, 0x0, 0x33, 0x33, + 0x7b, 0x33, 0x33, 0x10, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, + 0x0, 0x0, 0x1e, 0xee, 0xee, 0xff, 0xee, 0xee, + 0xe7, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x89, 0x0, 0x1d, 0x10, 0x0, 0x0, + 0x3, 0xd0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x1d, + 0x20, 0x0, 0x12, 0xb9, 0x0, 0x0, 0xde, 0xce, + 0xee, 0xcb, 0xad, 0x40, 0x0, 0x53, 0x20, 0x0, + 0x0, 0x3, 0x60, + + /* U+53C2 "参" */ + 0x0, 0x0, 0x6, 0xa0, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x99, 0x0, 0x2c, 0x80, 0x0, 0x0, 0x4e, + 0xd9, 0xaa, 0xbc, 0xfb, 0x0, 0x0, 0x25, 0x46, + 0xd1, 0x0, 0x9, 0x50, 0x0, 0x0, 0x9, 0x70, + 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xef, 0xdd, 0xef, + 0xdd, 0xd5, 0x0, 0x2, 0xd3, 0x3, 0x2a, 0x70, + 0x0, 0x0, 0x4e, 0x44, 0xba, 0x10, 0xba, 0x10, + 0xb, 0xc3, 0xb8, 0x20, 0x66, 0x6, 0xe5, 0x3, + 0x0, 0x3, 0x8c, 0x70, 0x10, 0x10, 0x0, 0x2, + 0xd9, 0x40, 0x5, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xd9, 0x20, 0x0, 0x0, 0x19, 0xbd, 0xb6, + 0x10, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+53C3 "參" */ + 0x0, 0x0, 0x9, 0x20, 0x30, 0x0, 0x0, 0x0, + 0x4, 0xc5, 0x0, 0x6c, 0x20, 0x0, 0x0, 0x6e, + 0xcc, 0xbb, 0xa9, 0xc3, 0x0, 0x0, 0x39, 0x0, + 0x0, 0x8, 0x31, 0x0, 0x1, 0xc2, 0x90, 0xb8, + 0x4b, 0x1c, 0x20, 0x9, 0xdb, 0xcd, 0xab, 0xfc, + 0xba, 0xc0, 0x0, 0x1, 0xa7, 0x2, 0x9b, 0x20, + 0x20, 0x2, 0x8c, 0x53, 0xb7, 0x3, 0xba, 0x50, + 0x2c, 0x56, 0xb8, 0x10, 0x94, 0x2, 0x94, 0x0, + 0x2, 0x3, 0x8b, 0x40, 0x41, 0x0, 0x0, 0x7, + 0xc9, 0x30, 0x19, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xc5, 0x0, 0x0, 0x0, 0x39, 0xcc, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+53C8 "又" */ + 0x9, 0xee, 0xee, 0xee, 0xee, 0xec, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x7, 0x80, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x1, 0xe1, 0x0, + 0xc, 0x40, 0x0, 0x0, 0x0, 0x6b, 0x0, 0x89, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x75, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xdd, 0x90, 0x0, 0x0, 0x0, + 0x4, 0xd9, 0x0, 0xad, 0x40, 0x0, 0x17, 0xdc, + 0x40, 0x0, 0x5, 0xcd, 0x71, 0x19, 0x20, 0x0, + 0x0, 0x0, 0x2, 0x92, + + /* U+53CA "及" */ + 0x8, 0xef, 0xfe, 0xee, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x1, + 0xf4, 0x0, 0x76, 0x0, 0x0, 0x0, 0x1, 0xfa, + 0x0, 0xcd, 0xcc, 0x90, 0x0, 0x3, 0xcd, 0x10, + 0x11, 0x18, 0x70, 0x0, 0x6, 0xa6, 0x70, 0x0, + 0xe, 0x10, 0x0, 0x9, 0x60, 0xd2, 0x0, 0x6a, + 0x0, 0x0, 0x1f, 0x10, 0x4c, 0x3, 0xd1, 0x0, + 0x0, 0x7a, 0x0, 0x7, 0xce, 0x30, 0x0, 0x3, + 0xf2, 0x0, 0x7, 0xee, 0x50, 0x0, 0x1e, 0x50, + 0x27, 0xd9, 0x13, 0xcd, 0x71, 0x5, 0x0, 0x88, + 0x20, 0x0, 0x3, 0x93, + + /* U+53CB "友" */ + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, + 0x7a, 0x22, 0x22, 0x22, 0x20, 0xc, 0xcc, 0xed, + 0xcc, 0xcc, 0xcc, 0xc0, 0x0, 0x0, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xdc, 0xbb, 0xbb, + 0xc4, 0x0, 0x0, 0x2, 0xfb, 0x22, 0x23, 0xe1, + 0x0, 0x0, 0x8, 0x6c, 0x20, 0x6, 0xa0, 0x0, + 0x0, 0xd, 0x4, 0xc0, 0x2d, 0x20, 0x0, 0x0, + 0x88, 0x0, 0x6c, 0xd4, 0x0, 0x0, 0x4, 0xc0, + 0x0, 0x5e, 0xe5, 0x0, 0x0, 0x3e, 0x21, 0x6c, + 0xb2, 0x2b, 0xd7, 0x30, 0x2, 0x8, 0x93, 0x0, + 0x0, 0x27, 0xc2, + + /* U+53CD "反" */ + 0x0, 0x0, 0x0, 0x12, 0x57, 0xb5, 0x0, 0x9, + 0xdd, 0xdc, 0xb9, 0x63, 0x0, 0x0, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc5, 0x33, 0x33, 0x33, 0x31, + 0x0, 0xd, 0xbe, 0xba, 0xaa, 0xae, 0x60, 0x0, + 0xe1, 0x77, 0x0, 0x1, 0xe0, 0x0, 0xf, 0x1, + 0xd0, 0x0, 0x89, 0x0, 0x0, 0xe0, 0x7, 0xa0, + 0x3d, 0x10, 0x0, 0x2d, 0x0, 0xb, 0x9e, 0x30, + 0x0, 0x6, 0x90, 0x0, 0x6f, 0xc0, 0x0, 0x0, + 0xc4, 0x3, 0xbc, 0x37, 0xe6, 0x10, 0x3d, 0x1d, + 0xc5, 0x0, 0x2, 0x8e, 0x80, 0x10, 0x10, 0x0, + 0x0, 0x0, 0x0, + + /* U+53D6 "取" */ + 0x6e, 0xed, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x7, + 0x60, 0xd, 0xe, 0xfe, 0xee, 0xb0, 0x7, 0x60, + 0xd, 0x3, 0xa0, 0x4, 0x80, 0x7, 0xed, 0xdd, + 0x0, 0xd0, 0x8, 0x50, 0x7, 0x60, 0xd, 0x0, + 0xc1, 0xc, 0x10, 0x7, 0x60, 0xd, 0x0, 0x85, + 0x1d, 0x0, 0x7, 0xed, 0xdd, 0x0, 0x2b, 0x86, + 0x0, 0x7, 0x60, 0xd, 0x0, 0xc, 0xd0, 0x0, + 0x7, 0x62, 0x5e, 0x90, 0xa, 0xb0, 0x0, 0x5e, + 0xdb, 0x9e, 0x20, 0x5c, 0xc6, 0x0, 0x0, 0x0, + 0xd, 0x5, 0xd1, 0x1d, 0x70, 0x0, 0x0, 0xd, + 0x2b, 0x10, 0x1, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+53D7 "受" */ + 0x0, 0x1, 0x23, 0x46, 0x79, 0xca, 0x0, 0x9, + 0xdc, 0xba, 0xb7, 0x53, 0x22, 0x0, 0x0, 0x77, + 0x0, 0xb3, 0x0, 0x88, 0x0, 0x0, 0x1e, 0x0, + 0x68, 0x2, 0xd0, 0x0, 0xc, 0xde, 0xdd, 0xdd, + 0xde, 0xed, 0xd0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x4f, 0xee, 0xee, 0xee, 0xe0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0x8a, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xdd, 0x70, 0x0, 0x0, 0x0, 0x2, 0x7d, + 0xaa, 0xd8, 0x20, 0x0, 0xb, 0xec, 0x71, 0x0, + 0x17, 0xce, 0xb0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, + + /* U+53E3 "口" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xee, + 0xee, 0xee, 0xee, 0xf1, 0x1e, 0x0, 0x0, 0x0, + 0x0, 0xe1, 0x1e, 0x0, 0x0, 0x0, 0x0, 0xe1, + 0x1e, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x1e, 0x0, + 0x0, 0x0, 0x0, 0xe1, 0x1e, 0x0, 0x0, 0x0, + 0x0, 0xe1, 0x1e, 0x0, 0x0, 0x0, 0x0, 0xe1, + 0x1e, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x1e, 0x33, + 0x33, 0x33, 0x33, 0xe1, 0x1f, 0xbb, 0xbb, 0xbb, + 0xbb, 0xf1, 0x1e, 0x0, 0x0, 0x0, 0x0, 0xd1, + + /* U+53E4 "古" */ + 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x1e, 0xee, 0xee, + 0xff, 0xee, 0xee, 0xe6, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xee, 0xee, 0xee, 0xee, 0x0, + 0x0, 0x86, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x86, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x86, + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x8d, 0xcc, + 0xcc, 0xcc, 0xce, 0x0, 0x0, 0x87, 0x11, 0x11, + 0x11, 0x3d, 0x0, + + /* U+53E5 "句" */ + 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xed, + 0xdd, 0xdd, 0xdd, 0xb0, 0x9, 0x70, 0x0, 0x0, + 0x0, 0x3c, 0x3, 0xd0, 0x0, 0x0, 0x0, 0x3, + 0xc1, 0xd3, 0xcd, 0xdd, 0xda, 0x0, 0x3b, 0x36, + 0xe, 0x0, 0x2, 0xb0, 0x4, 0xa0, 0x0, 0xe0, + 0x0, 0x2b, 0x0, 0x59, 0x0, 0xe, 0x0, 0x2, + 0xb0, 0x6, 0x80, 0x0, 0xeb, 0xbb, 0xcb, 0x0, + 0x87, 0x0, 0xe, 0x11, 0x11, 0x10, 0xa, 0x50, + 0x0, 0x20, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xee, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+53E6 "另" */ + 0x0, 0xbe, 0xee, 0xee, 0xee, 0xec, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x2, 0xc0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0xb, 0x30, 0x0, 0x0, + 0x2, 0xc0, 0x0, 0xae, 0xee, 0xfe, 0xee, 0xeb, + 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0xd, + 0xdd, 0xdd, 0xfd, 0xdd, 0xdd, 0x30, 0x0, 0x0, + 0x6b, 0x0, 0x0, 0xc3, 0x0, 0x0, 0xd, 0x40, + 0x0, 0xd, 0x20, 0x0, 0xb, 0x90, 0x0, 0x0, + 0xf0, 0x1, 0x6e, 0x80, 0x0, 0x0, 0x2d, 0x1, + 0xd9, 0x20, 0x0, 0xd, 0xee, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53EA "只" */ + 0x0, 0xce, 0xee, 0xee, 0xee, 0xed, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0xd2, 0x11, 0x11, 0x11, + 0x2e, 0x0, 0x0, 0xbd, 0xdd, 0xdd, 0xdd, 0xdb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x84, 0x0, 0x39, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0x0, 0x8, 0xc1, 0x0, 0x1, 0xab, + 0x0, 0x0, 0x0, 0x6d, 0x20, 0x2e, 0x70, 0x0, + 0x0, 0x0, 0x5, 0xe1, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, + + /* U+53EB "叫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x8a, 0xaa, + 0x70, 0x90, 0x0, 0xe1, 0xd3, 0x35, 0xb0, 0xe1, + 0x0, 0xe1, 0xd0, 0x2, 0xb0, 0xe1, 0x0, 0xe1, + 0xd0, 0x2, 0xb0, 0xe1, 0x0, 0xe1, 0xd0, 0x2, + 0xb0, 0xe1, 0x0, 0xe1, 0xd0, 0x2, 0xb0, 0xe1, + 0x0, 0xe1, 0xd0, 0x2, 0xb0, 0xe1, 0x0, 0xe1, + 0xd2, 0x14, 0xb0, 0xe1, 0x26, 0xf1, 0xdc, 0xcc, + 0x83, 0xfe, 0xc8, 0xe1, 0x80, 0x0, 0x2, 0x61, + 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, + + /* U+53EF "可" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0xad, 0xdd, + 0xdd, 0x0, 0x78, 0x0, 0x0, 0xb3, 0x0, 0xe, + 0x0, 0x78, 0x0, 0x0, 0xb2, 0x0, 0xe, 0x0, + 0x78, 0x0, 0x0, 0xb2, 0x0, 0xe, 0x0, 0x78, + 0x0, 0x0, 0xb4, 0x22, 0x2e, 0x0, 0x78, 0x0, + 0x0, 0xbc, 0xcc, 0xcb, 0x0, 0x78, 0x0, 0x0, + 0x51, 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xd3, 0x0, + + /* U+53F0 "台" */ + 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x5, 0xc0, + 0x0, 0xa1, 0x0, 0x0, 0x3, 0xc1, 0x0, 0x5, + 0xd2, 0x0, 0x3, 0xc1, 0x0, 0x12, 0x38, 0xe2, + 0x1, 0xff, 0xee, 0xdc, 0xba, 0x99, 0xd0, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x3e, 0xee, + 0xee, 0xee, 0xec, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x1e, + 0x0, 0x3, 0xb0, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x3f, 0xdd, 0xdd, 0xdd, 0xde, 0x0, 0x3, 0xb1, + 0x11, 0x11, 0x13, 0xd0, 0x0, + + /* U+53F2 "史" */ + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0xbb, + 0xbb, 0xbf, 0xbb, 0xbb, 0x90, 0x0, 0xe3, 0x33, + 0x4e, 0x33, 0x34, 0xd0, 0x0, 0xe0, 0x0, 0x1e, + 0x0, 0x1, 0xd0, 0x0, 0xe0, 0x0, 0x1e, 0x0, + 0x1, 0xd0, 0x0, 0xfe, 0xee, 0xef, 0xee, 0xee, + 0xd0, 0x0, 0x14, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x69, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xd2, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xe7, + 0xbd, 0x85, 0x20, 0x0, 0xd, 0xc7, 0x0, 0x2, + 0x6a, 0xce, 0xea, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+53F3 "右" */ + 0x0, 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x40, 0x0, 0x0, 0x0, 0x1e, 0xee, 0xff, + 0xee, 0xee, 0xee, 0xe1, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xb2, 0x22, 0x22, 0x22, + 0x0, 0x0, 0x7f, 0xec, 0xcc, 0xcc, 0xcf, 0x10, + 0x7, 0xe6, 0xb0, 0x0, 0x0, 0xd, 0x10, 0x4c, + 0x13, 0xb0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x3, + 0xb0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x3, 0xfd, + 0xdd, 0xdd, 0xdf, 0x10, 0x0, 0x3, 0xb1, 0x11, + 0x11, 0x1d, 0x10, + + /* U+53F7 "号" */ + 0x0, 0x6e, 0xdd, 0xdd, 0xdd, 0xe5, 0x0, 0x0, + 0x68, 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x69, + 0x11, 0x11, 0x11, 0xa5, 0x0, 0x0, 0x4b, 0xbb, + 0xbb, 0xbb, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xde, 0xfd, 0xdd, 0xdd, + 0xdd, 0xd0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xed, 0xdd, 0xdd, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0xdd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+53F8 "司" */ + 0x9e, 0xee, 0xee, 0xee, 0xee, 0xeb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x12, 0x22, 0x22, 0x22, + 0x20, 0x3b, 0x6b, 0xbb, 0xbb, 0xbb, 0xa0, 0x3b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x9, 0xdd, + 0xdd, 0xdd, 0x0, 0x3b, 0x9, 0x40, 0x0, 0xe, + 0x0, 0x3b, 0x9, 0x40, 0x0, 0xe, 0x0, 0x3b, + 0x9, 0x51, 0x11, 0x1e, 0x0, 0x3b, 0x9, 0xcb, + 0xbb, 0xba, 0x0, 0x3b, 0x5, 0x20, 0x0, 0x0, + 0x0, 0x4b, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe6, + + /* U+5403 "吃" */ + 0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x9, 0xaa, + 0x90, 0xe, 0x10, 0x0, 0x0, 0xe3, 0x3d, 0x5, + 0xfc, 0xcc, 0xcc, 0x4d, 0x0, 0xd0, 0xd4, 0x11, + 0x11, 0x10, 0xd0, 0xd, 0x88, 0x0, 0x0, 0x0, + 0xd, 0x0, 0xd1, 0x4d, 0xdd, 0xdd, 0x50, 0xd0, + 0xd, 0x0, 0x0, 0x1d, 0x80, 0xd, 0x0, 0xd0, + 0x0, 0x2e, 0x60, 0x0, 0xe0, 0xd, 0x0, 0x2e, + 0x50, 0x0, 0xe, 0xdd, 0xc0, 0x2e, 0x40, 0x0, + 0x0, 0xa0, 0x0, 0xc, 0x50, 0x0, 0x3, 0x80, + 0x0, 0x2, 0xe0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0xa, 0xee, 0xee, 0xee, 0x20, + + /* U+5404 "各" */ + 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xec, 0xcc, 0xcd, 0xf1, 0x0, 0x0, 0x9c, 0xd3, + 0x0, 0xc, 0x60, 0x0, 0xc, 0x90, 0x2d, 0x63, + 0xc6, 0x0, 0x0, 0x1, 0x0, 0x2, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x3, 0xad, 0x65, 0xca, 0x40, + 0x0, 0x29, 0xdb, 0x50, 0x0, 0x4, 0xae, 0xa2, + 0x14, 0x1d, 0xdd, 0xdd, 0xdd, 0xd1, 0x40, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x1e, 0x22, + 0x22, 0x22, 0xe1, 0x0, 0x0, 0x1f, 0xaa, 0xaa, + 0xaa, 0xe1, 0x0, + + /* U+5408 "合" */ + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xd5, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x9c, + 0x10, 0x2d, 0x70, 0x0, 0x0, 0x4d, 0x80, 0x0, + 0x0, 0x9d, 0x50, 0xc, 0xb8, 0xdd, 0xdd, 0xdd, + 0xc2, 0xb9, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xbb, 0xbb, 0xbb, 0xb8, 0x0, + 0x0, 0x1e, 0x11, 0x11, 0x11, 0x4c, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x1f, 0xdd, + 0xdd, 0xdd, 0xec, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x0, 0x3b, 0x0, + + /* U+540C "同" */ + 0xee, 0xee, 0xee, 0xee, 0xee, 0xec, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x1c, 0xe0, 0xbc, 0xcc, 0xcc, + 0xc2, 0x1c, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xe0, 0x2e, + 0xcc, 0xce, 0x70, 0x1c, 0xe0, 0x2a, 0x0, 0x6, + 0x70, 0x1c, 0xe0, 0x2a, 0x0, 0x6, 0x70, 0x1c, + 0xe0, 0x2f, 0xcc, 0xce, 0x70, 0x1c, 0xe0, 0x2a, + 0x0, 0x0, 0x0, 0x1c, 0xe0, 0x14, 0x0, 0x0, + 0x0, 0x2c, 0xe0, 0x0, 0x0, 0x0, 0x9e, 0xd7, + + /* U+540D "名" */ + 0x0, 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xd7, 0x11, 0x11, 0x10, 0x0, 0x1, 0xcc, + 0xbb, 0xbb, 0xeb, 0x0, 0x5, 0xe5, 0x0, 0x0, + 0x2d, 0x20, 0x6, 0xa2, 0x95, 0x0, 0x3d, 0x30, + 0x0, 0x0, 0x1, 0xba, 0x8b, 0x20, 0x0, 0x0, + 0x0, 0x17, 0xe6, 0x0, 0x0, 0x0, 0x15, 0xaf, + 0xfe, 0xdd, 0xdd, 0xd1, 0xb, 0x97, 0xb0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x3b, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x3, 0xb0, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x3e, 0xbb, 0xbb, 0xbb, 0xf1, 0x0, 0x3, + 0xc1, 0x11, 0x11, 0x1e, 0x10, + + /* U+5411 "向" */ + 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0x0, 0x0, 0x0, 0x11, 0x11, 0xc6, 0x11, + 0x11, 0x10, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xf3, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0xb3, 0xc1, 0xa, + 0xaa, 0xaa, 0x70, 0xb3, 0xc1, 0xe, 0x22, 0x24, + 0xb0, 0xb3, 0xc1, 0xd, 0x0, 0x1, 0xb0, 0xb3, + 0xc1, 0xd, 0x0, 0x1, 0xb0, 0xb3, 0xc1, 0xf, + 0xdd, 0xde, 0xb0, 0xb3, 0xc1, 0xd, 0x0, 0x0, + 0x0, 0xb3, 0xc1, 0x0, 0x0, 0x0, 0x0, 0xb3, + 0xc1, 0x0, 0x0, 0x0, 0xbe, 0xd1, + + /* U+5426 "否" */ + 0xe, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xe0, 0x0, + 0x0, 0x0, 0x6d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xf7, 0x65, 0x0, 0x0, 0x0, 0x6, 0xd7, + 0x87, 0x2a, 0xd5, 0x0, 0x18, 0xeb, 0x20, 0x77, + 0x0, 0x2b, 0xb1, 0x19, 0x20, 0x0, 0x77, 0x0, + 0x0, 0x50, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0xdd, 0xdd, 0xdd, 0xe9, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x69, 0x0, 0x0, 0x7d, + 0xaa, 0xaa, 0xaa, 0xc9, 0x0, 0x0, 0x78, 0x22, + 0x22, 0x22, 0x79, 0x0, + + /* U+5427 "吧" */ + 0x22, 0x22, 0xe, 0xee, 0xfe, 0xef, 0xd, 0xbb, + 0xe0, 0xe0, 0xd, 0x0, 0xe0, 0xd0, 0xe, 0xe, + 0x0, 0xd0, 0xe, 0xd, 0x0, 0xe0, 0xe0, 0xd, + 0x0, 0xe0, 0xd0, 0xe, 0xe, 0x0, 0xd0, 0xe, + 0xd, 0x0, 0xe0, 0xe5, 0x5e, 0x55, 0xe0, 0xd0, + 0xe, 0xe, 0x77, 0x77, 0x7e, 0xd, 0xbb, 0xe0, + 0xe0, 0x0, 0x0, 0x40, 0xd2, 0x22, 0xe, 0x0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x66, 0x0, 0x0, 0xe, 0x10, 0x0, 0xa, 0x50, + 0x0, 0x0, 0x7e, 0xee, 0xee, 0xc0, + + /* U+5440 "呀" */ + 0x33, 0x33, 0x6e, 0xee, 0xee, 0xfe, 0x3e, 0xaa, + 0xd0, 0x21, 0x0, 0x2b, 0x0, 0xe0, 0xd, 0xa, + 0x30, 0x2, 0xb0, 0xe, 0x0, 0xd0, 0xd1, 0x0, + 0x2b, 0x0, 0xe0, 0xd, 0xe, 0x11, 0x14, 0xc1, + 0xe, 0x0, 0xd2, 0xcc, 0xcd, 0xff, 0xc6, 0xe0, + 0xd, 0x0, 0x0, 0x8c, 0xb0, 0xe, 0x0, 0xd0, + 0x0, 0x79, 0x3b, 0x0, 0xed, 0xdc, 0x0, 0x9a, + 0x2, 0xb0, 0xd, 0x0, 0x3, 0xc7, 0x0, 0x2b, + 0x0, 0x0, 0x2, 0xc3, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7e, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+544A "告" */ + 0x0, 0x8, 0x30, 0x2c, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xdd, 0xef, 0xdd, 0xdd, 0x10, 0x4, 0xd0, 0x0, + 0x2c, 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0x2c, + 0x0, 0x0, 0x0, 0x1b, 0xbb, 0xbb, 0xcf, 0xbb, + 0xbb, 0xb2, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xdd, 0xdd, 0xdd, 0xe8, 0x0, 0x0, + 0x58, 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x58, + 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x5d, 0xaa, + 0xaa, 0xaa, 0xd8, 0x0, 0x0, 0x5a, 0x33, 0x33, + 0x33, 0x88, 0x0, + + /* U+5462 "呢" */ + 0x33, 0x32, 0xf, 0xdd, 0xdd, 0xde, 0xf, 0xab, + 0xb0, 0xc0, 0x0, 0x0, 0xe0, 0xd0, 0x1b, 0xc, + 0x0, 0x0, 0xe, 0xd, 0x1, 0xb0, 0xfd, 0xdd, + 0xdd, 0xc0, 0xd0, 0x1b, 0xc, 0x8, 0x0, 0x0, + 0xd, 0x1, 0xb1, 0xb0, 0xe0, 0x1, 0x60, 0xd0, + 0x1b, 0x3a, 0xe, 0x5, 0xd7, 0xd, 0x2, 0xb4, + 0x80, 0xfc, 0x91, 0x0, 0xfd, 0xda, 0x67, 0xe, + 0x10, 0x0, 0xd, 0x0, 0xb, 0x20, 0xe0, 0x0, + 0x42, 0x0, 0x3, 0xc0, 0xe, 0x0, 0x8, 0x50, + 0x0, 0x93, 0x0, 0xbe, 0xdd, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5468 "周" */ + 0x0, 0xde, 0xee, 0xef, 0xee, 0xef, 0x10, 0xd, + 0x0, 0x6, 0x70, 0x0, 0xd1, 0x0, 0xd0, 0xbb, + 0xdd, 0xbb, 0x2d, 0x10, 0xd, 0x0, 0x6, 0x70, + 0x0, 0xd1, 0x0, 0xe4, 0x99, 0xcc, 0x99, 0x5d, + 0x10, 0xe, 0x2, 0x22, 0x22, 0x21, 0xd1, 0x0, + 0xe0, 0x12, 0x22, 0x22, 0xd, 0x10, 0x1c, 0xa, + 0xb9, 0x9a, 0xc0, 0xd1, 0x4, 0xa0, 0xa3, 0x0, + 0x1c, 0xd, 0x10, 0x86, 0xa, 0xcb, 0xbb, 0xc0, + 0xd1, 0x1e, 0x10, 0xa4, 0x0, 0x0, 0xe, 0x14, + 0x80, 0x2, 0x10, 0x0, 0xcd, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5473 "味" */ + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x0, 0x7, 0x77, + 0x60, 0x0, 0x2c, 0x0, 0x0, 0xea, 0xad, 0x2, + 0x24, 0xd2, 0x22, 0xd, 0x0, 0xd0, 0xbb, 0xcf, + 0xbb, 0xa0, 0xd0, 0xd, 0x0, 0x2, 0xc0, 0x0, + 0xd, 0x0, 0xd0, 0x0, 0x2c, 0x0, 0x0, 0xd0, + 0xd, 0x8e, 0xef, 0xfe, 0xee, 0x7d, 0x0, 0xd0, + 0x0, 0xef, 0x90, 0x0, 0xe0, 0xd, 0x0, 0x9a, + 0xdd, 0x20, 0xf, 0xdd, 0xc0, 0x3c, 0x2c, 0x4b, + 0x0, 0xa0, 0x0, 0x3d, 0x22, 0xc0, 0x99, 0x0, + 0x0, 0x3d, 0x20, 0x2c, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x2, 0xc0, 0x0, 0x0, + + /* U+547C "呼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x3, 0x56, 0x8a, 0xdd, 0x80, 0xed, 0xf2, 0x77, + 0x66, 0xd0, 0x0, 0xd, 0xb, 0x22, 0x70, 0x1c, + 0x1, 0xc0, 0xd0, 0xb2, 0xd, 0x11, 0xc0, 0x77, + 0xd, 0xb, 0x20, 0x86, 0x1c, 0xd, 0x0, 0xd0, + 0xb2, 0x2, 0x31, 0xc1, 0x40, 0xd, 0xb, 0x4d, + 0xdd, 0xdf, 0xdd, 0xd8, 0xee, 0xf2, 0x0, 0x1, + 0xc0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x1c, 0x0, + 0x0, 0xa0, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xde, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+547D "命" */ + 0x0, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0x40, 0xb7, 0x0, 0x0, 0x0, 0x2a, 0xd2, + 0x0, 0x9, 0xc4, 0x0, 0x1c, 0xd5, 0x8d, 0xdd, + 0xdc, 0x3b, 0xd2, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0xfd, 0xde, 0x32, 0xed, 0xde, + 0x20, 0x0, 0xd0, 0xa, 0x32, 0xb0, 0xb, 0x20, + 0x0, 0xd0, 0xa, 0x32, 0xb0, 0xb, 0x20, 0x0, + 0xe2, 0x2b, 0x32, 0xb0, 0xb, 0x20, 0x0, 0xfa, + 0xaa, 0x22, 0xb3, 0xdd, 0x10, 0x0, 0xd0, 0x0, + 0x2, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xb0, 0x0, 0x0, + + /* U+548C "和" */ + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x57, + 0xad, 0xb5, 0x13, 0x33, 0x32, 0x7, 0x59, 0x60, + 0x8, 0xda, 0xab, 0xd0, 0x0, 0x76, 0x0, 0x86, + 0x0, 0x1d, 0x3d, 0xde, 0xed, 0xc8, 0x60, 0x1, + 0xd0, 0x1, 0xe9, 0x0, 0x86, 0x0, 0x1d, 0x0, + 0x6e, 0xe6, 0x8, 0x60, 0x1, 0xd0, 0xc, 0x87, + 0xc3, 0x86, 0x0, 0x1d, 0x7, 0x77, 0x62, 0x88, + 0x60, 0x1, 0xd4, 0xc0, 0x76, 0x0, 0x86, 0x0, + 0x1d, 0x42, 0x7, 0x60, 0x8, 0xec, 0xcd, 0xd0, + 0x0, 0x76, 0x0, 0x87, 0x11, 0x3d, 0x0, 0x7, + 0x60, 0x5, 0x40, 0x1, 0x70, + + /* U+54B2 "咲" */ + 0x0, 0x0, 0x8, 0x20, 0x0, 0x67, 0x7, 0x77, + 0x70, 0x5b, 0x0, 0xd, 0x20, 0xe6, 0x6e, 0x0, + 0xc1, 0x4, 0x80, 0xe, 0x0, 0xe5, 0xee, 0xee, + 0xee, 0xe3, 0xe0, 0xe, 0x0, 0x2, 0xc0, 0x0, + 0xe, 0x0, 0xe0, 0x0, 0x2c, 0x0, 0x0, 0xe0, + 0xe, 0x45, 0x57, 0xd5, 0x55, 0x3e, 0x0, 0xe5, + 0x88, 0xaf, 0x88, 0x85, 0xee, 0xef, 0x0, 0x8, + 0xf5, 0x0, 0xe, 0x0, 0x0, 0x1, 0xe3, 0xc0, + 0x0, 0x70, 0x0, 0x1, 0xc6, 0x9, 0x60, 0x0, + 0x0, 0x5, 0xd7, 0x0, 0x1d, 0x60, 0x0, 0x8, + 0xb3, 0x0, 0x0, 0x1b, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+54C1 "品" */ + 0x0, 0xee, 0xee, 0xee, 0xed, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0xe3, 0x33, 0x33, 0x4d, 0x0, + 0x0, 0x9a, 0xaa, 0xaa, 0xa9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xee, 0xee, 0xf0, 0x2f, + 0xee, 0xed, 0xe0, 0x0, 0xe0, 0x2b, 0x0, 0x1d, + 0xe0, 0x0, 0xe0, 0x2b, 0x0, 0x1d, 0xe0, 0x0, + 0xe0, 0x2b, 0x0, 0x1d, 0xec, 0xcc, 0xf0, 0x2f, + 0xcc, 0xdd, 0xe1, 0x11, 0xc0, 0x2c, 0x11, 0x2c, + + /* U+54E1 "員" */ + 0x0, 0x4e, 0xcc, 0xcc, 0xcc, 0xf3, 0x0, 0x0, + 0x49, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x4d, + 0xcc, 0xcc, 0xcc, 0xe2, 0x0, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x0, 0x0, 0xe6, 0x55, 0x55, + 0x55, 0x7c, 0x0, 0x0, 0xea, 0xaa, 0xaa, 0xaa, + 0xbc, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0xea, 0xaa, 0xaa, 0xaa, 0xbc, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0xbb, 0xcb, 0xbb, 0xcb, 0xb9, 0x0, 0x0, 0x39, + 0xd2, 0x0, 0x7d, 0x93, 0x0, 0x2d, 0xb5, 0x0, + 0x0, 0x0, 0x5b, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+54EA "哪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, + 0x6d, 0xed, 0xd4, 0xec, 0xe2, 0xeb, 0xe0, 0x39, + 0xc, 0x47, 0xc, 0xc, 0xc, 0x3, 0x90, 0xc4, + 0x73, 0x90, 0xc0, 0xc6, 0xde, 0xcc, 0x47, 0x74, + 0xc, 0xc, 0x3, 0x90, 0xc4, 0x7b, 0x0, 0xc0, + 0xc0, 0x48, 0xc, 0x47, 0x57, 0xc, 0xc, 0x16, + 0x82, 0xc4, 0x70, 0xc0, 0xd4, 0xd5, 0xdc, 0xac, + 0x47, 0xb, 0xd, 0x66, 0xb, 0x10, 0xb4, 0x70, + 0xc1, 0xb0, 0x1, 0xc0, 0x1b, 0x47, 0xca, 0x0, + 0x0, 0xa5, 0x3, 0x94, 0x70, 0x0, 0x0, 0x1a, + 0xc, 0xe4, 0x47, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5546 "商" */ + 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0x1d, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, 0x0, 0x0, 0xd1, + 0x0, 0x1d, 0x10, 0x0, 0x0, 0x11, 0x76, 0x11, + 0x98, 0x11, 0x0, 0x4, 0xeb, 0xbb, 0xbb, 0xbb, + 0xbd, 0x50, 0x4, 0x90, 0x3b, 0x0, 0xb6, 0x8, + 0x50, 0x4, 0x97, 0xb1, 0x0, 0x9, 0xb9, 0x50, + 0x4, 0x93, 0x8c, 0xbb, 0xc7, 0x38, 0x50, 0x4, + 0x90, 0x93, 0x0, 0x48, 0x8, 0x50, 0x4, 0x90, + 0x9b, 0xaa, 0xb8, 0x8, 0x50, 0x4, 0x90, 0x84, + 0x0, 0x0, 0x8, 0x50, 0x4, 0x90, 0x0, 0x0, + 0x7, 0xbc, 0x20, + + /* U+554A "啊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xdc, + 0x2f, 0xdc, 0xce, 0xee, 0xf6, 0xc1, 0xc2, 0x94, + 0x70, 0x0, 0x1b, 0xb, 0xc, 0x29, 0x83, 0x6b, + 0xb1, 0xb0, 0xb0, 0xc2, 0x9b, 0x9, 0x3b, 0x1b, + 0xb, 0xc, 0x29, 0xa2, 0x91, 0xa1, 0xb0, 0xb0, + 0xc2, 0x92, 0x99, 0x1a, 0x1b, 0xb, 0xc, 0x29, + 0xc, 0x91, 0xa1, 0xb0, 0xec, 0xe2, 0x90, 0xc9, + 0xce, 0x1b, 0xc, 0x11, 0x2a, 0xc8, 0x93, 0x21, + 0xb0, 0x50, 0x2, 0x90, 0x1, 0x0, 0x1b, 0x0, + 0x0, 0x29, 0x0, 0x0, 0x2, 0xb0, 0x0, 0x2, + 0x90, 0x0, 0xd, 0xd6, 0x0, + + /* U+554F "問" */ + 0xec, 0xcc, 0xf0, 0xcc, 0xcc, 0xcc, 0xe0, 0x0, + 0xc0, 0xc1, 0x0, 0x2c, 0xeb, 0xbb, 0xe0, 0xcb, + 0xbb, 0xcc, 0xe0, 0x0, 0xc0, 0xc1, 0x0, 0x2c, + 0xec, 0xcc, 0xc0, 0x9c, 0xbb, 0xcc, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xe0, 0xd, 0xcc, 0xce, + 0x30, 0x2c, 0xe0, 0xd, 0x0, 0xb, 0x30, 0x2c, + 0xe0, 0xd, 0x0, 0xb, 0x30, 0x2c, 0xe0, 0xe, + 0xcc, 0xcf, 0x30, 0x2c, 0xe0, 0xd, 0x0, 0x0, + 0x0, 0x3c, 0xe0, 0x0, 0x0, 0x0, 0xce, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5566 "啦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x3, 0x90, 0x0, 0x88, 0x80, 0xd, + 0x0, 0xd, 0x0, 0xd, 0x6d, 0x0, 0xd0, 0x22, + 0x93, 0x20, 0xc0, 0xc6, 0xdf, 0xa9, 0xaa, 0xaa, + 0xc, 0xc, 0x0, 0xd0, 0x31, 0x3, 0x50, 0xc0, + 0xc0, 0xd, 0x6, 0x50, 0x67, 0xc, 0xc, 0x0, + 0xe8, 0x48, 0x8, 0x50, 0xc0, 0xc5, 0xde, 0x32, + 0xa0, 0xa3, 0xe, 0xbf, 0x11, 0xd0, 0xc, 0xc, + 0x0, 0xc2, 0x20, 0xd, 0x0, 0xd0, 0xc0, 0x8, + 0x0, 0x0, 0xd0, 0xd, 0x1b, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x24, 0x80, 0x0, 0x0, 0x4d, 0x95, + 0xdd, 0xdd, 0xd4, + + /* U+5584 "善" */ + 0x0, 0x1, 0x50, 0x0, 0x4, 0x30, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0xd, 0x20, 0x0, 0x3, 0xbb, + 0xbb, 0xde, 0xbb, 0xbb, 0x70, 0x0, 0x25, 0x55, + 0x9b, 0x55, 0x54, 0x0, 0x0, 0x24, 0x44, 0x8b, + 0x44, 0x43, 0x0, 0x8, 0xcc, 0xcc, 0xde, 0xcc, + 0xcc, 0xc1, 0x0, 0xb, 0x20, 0x59, 0x0, 0xc1, + 0x0, 0x7, 0x7a, 0xc7, 0xac, 0x7a, 0xd7, 0x73, + 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x52, 0x0, + 0x2c, 0xcc, 0xcc, 0xcc, 0xc7, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x3e, 0xcc, 0xcc, + 0xcc, 0xd9, 0x0, + + /* U+5589 "喉" */ + 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, 0xd, 0xdd, + 0x0, 0xe1, 0xbc, 0xcf, 0x20, 0xc0, 0xc0, 0x58, + 0x0, 0x0, 0xc0, 0xc, 0xc, 0xd, 0x3c, 0xcc, + 0xcf, 0xc2, 0xc0, 0xc7, 0xf0, 0xb, 0x0, 0x0, + 0xc, 0xc, 0xde, 0x2, 0xd0, 0x0, 0x0, 0xc0, + 0xc3, 0xd0, 0xad, 0xde, 0xba, 0xc, 0xc, 0xd, + 0x4c, 0x5, 0x80, 0x0, 0xc2, 0xc0, 0xd3, 0x64, + 0x8a, 0x44, 0xe, 0xbb, 0xd, 0x47, 0x7c, 0xf8, + 0x71, 0x80, 0x0, 0xd0, 0x1, 0xd9, 0x40, 0x0, + 0x0, 0xd, 0x3, 0xc4, 0xc, 0x40, 0x0, 0x0, + 0xd5, 0xb2, 0x0, 0x1b, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+559C "喜" */ + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x7, + 0xbb, 0xbb, 0xce, 0xbb, 0xbb, 0xb1, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x6a, 0xaa, + 0xaa, 0xaa, 0xaa, 0x10, 0x0, 0xa, 0xaa, 0xaa, + 0xaa, 0xa4, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x0, 0xf, 0xaa, 0xaa, 0xaa, 0xd6, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0xd, 0x20, 0x0, + 0xc, 0xcc, 0xdd, 0xcc, 0xce, 0xcc, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xaa, 0xaa, 0xaa, 0xbb, 0x0, 0x0, 0x3a, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x3e, 0xbb, 0xbb, + 0xbb, 0xcb, 0x0, + + /* U+559D "喝" */ + 0x33, 0x32, 0xf, 0xbb, 0xbb, 0xcb, 0xe, 0xbb, + 0xb0, 0xd0, 0x0, 0x2, 0xb0, 0xd0, 0x1b, 0xf, + 0xaa, 0xaa, 0xbb, 0xd, 0x1, 0xb0, 0xe3, 0x33, + 0x35, 0xb0, 0xd0, 0x1b, 0xa, 0xa6, 0x66, 0x64, + 0xd, 0x1, 0xb0, 0xcc, 0xaa, 0xaa, 0xa4, 0xd0, + 0x1b, 0x87, 0x11, 0x81, 0x18, 0x6e, 0xbc, 0xc8, + 0x70, 0x3d, 0x10, 0x85, 0xd2, 0x21, 0xb, 0x3a, + 0x3c, 0x29, 0x49, 0x0, 0x0, 0xb4, 0x10, 0x21, + 0xb3, 0x0, 0x0, 0xa, 0xaa, 0xaa, 0x7d, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xa0, + + /* U+55AE "單" */ + 0x1, 0xea, 0xac, 0x65, 0xda, 0xae, 0x30, 0x1, + 0xc0, 0x7, 0x65, 0x70, 0xa, 0x30, 0x0, 0x88, + 0x88, 0x33, 0x88, 0x88, 0x10, 0x0, 0x9c, 0xcc, + 0xcc, 0xcc, 0xcb, 0x0, 0x0, 0xc2, 0x0, 0x87, + 0x0, 0xe, 0x0, 0x0, 0xcc, 0xbb, 0xdd, 0xbb, + 0xbe, 0x0, 0x0, 0xc2, 0x0, 0x87, 0x0, 0xe, + 0x0, 0x0, 0xcc, 0xcc, 0xed, 0xcc, 0xce, 0x0, + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x2d, + 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0xd3, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, + + /* U+55B6 "営" */ + 0x8, 0x10, 0x1b, 0x0, 0x2, 0x90, 0x6, 0xa0, + 0xa, 0x60, 0xc, 0x40, 0xab, 0xfb, 0xbc, 0xdb, + 0xce, 0xba, 0xd1, 0x11, 0x11, 0x11, 0x11, 0x2e, + 0xd0, 0xab, 0xbb, 0xbb, 0xb9, 0xe, 0x0, 0xd0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0xab, 0xbb, 0xbb, 0xb9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xdd, + 0xdd, 0xdd, 0xdd, 0xe0, 0xc, 0x10, 0x0, 0x0, + 0x0, 0xe0, 0xc, 0x21, 0x11, 0x11, 0x11, 0xe0, + 0xc, 0xcb, 0xbb, 0xbb, 0xbc, 0xe0, + + /* U+55CE "嗎" */ + 0x44, 0x44, 0x2f, 0xdd, 0xfd, 0xd9, 0xe, 0x88, + 0xd2, 0xa0, 0x1b, 0x0, 0x0, 0xd0, 0xd, 0x2e, + 0xcc, 0xfc, 0xc5, 0xd, 0x0, 0xd2, 0xa0, 0x1b, + 0x0, 0x0, 0xd0, 0xd, 0x2e, 0xcc, 0xfc, 0xc5, + 0xd, 0x0, 0xd2, 0xa0, 0x1b, 0x0, 0x0, 0xd0, + 0xd, 0x2d, 0x89, 0xe8, 0x88, 0x1f, 0xdd, 0xd0, + 0x33, 0x44, 0x63, 0xd1, 0xd0, 0x0, 0x73, 0x95, + 0x59, 0x2d, 0x5, 0x0, 0xa, 0xb, 0xa, 0x26, + 0xd0, 0x0, 0x1, 0xa0, 0xa0, 0x40, 0x2c, 0x0, + 0x0, 0x12, 0x0, 0x1, 0xcd, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+55EF "嗯" */ + 0x33, 0x30, 0xdc, 0xcc, 0xcc, 0xd7, 0xd, 0x7d, + 0xd, 0x0, 0x64, 0x6, 0x70, 0xc0, 0xb0, 0xd4, + 0xbe, 0xbb, 0x67, 0xc, 0xb, 0xd, 0x1, 0xe7, + 0x6, 0x70, 0xc0, 0xb0, 0xd1, 0xb3, 0x6a, 0x67, + 0xc, 0xb, 0xd, 0x55, 0x33, 0x58, 0x70, 0xc0, + 0xb0, 0x78, 0x88, 0x88, 0x83, 0xe, 0xbe, 0x25, + 0x62, 0x76, 0x9, 0x10, 0xc2, 0x25, 0x79, 0x40, + 0xd1, 0x59, 0x8, 0x0, 0xa3, 0x94, 0x4, 0x46, + 0xd0, 0x0, 0x1c, 0x9, 0x40, 0x5, 0x78, 0x40, + 0x0, 0x30, 0x6e, 0xcc, 0xd2, 0x0, + + /* U+561B "嘛" */ + 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x7, 0x76, + 0x1, 0x11, 0xa7, 0x11, 0x10, 0xc5, 0xb6, 0xca, + 0xaa, 0xaa, 0xaa, 0x4b, 0xb, 0x65, 0x9, 0x0, + 0x17, 0x0, 0xb0, 0xb6, 0x50, 0xc0, 0x2, 0x90, + 0xb, 0xb, 0x79, 0xcf, 0xb6, 0xde, 0xb0, 0xb0, + 0xb7, 0x54, 0xf4, 0x9, 0xe0, 0xb, 0xb, 0x84, + 0x9c, 0xb1, 0xdf, 0x20, 0xc0, 0xb9, 0x39, 0xc4, + 0x68, 0xb7, 0xd, 0xb9, 0xa8, 0x5c, 0xb, 0x39, + 0x90, 0xb0, 0xc, 0x90, 0xc6, 0x62, 0x95, 0x40, + 0x2, 0xb0, 0xc, 0x10, 0x29, 0x0, 0x0, 0x55, + 0x0, 0xc0, 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+56B4 "嚴" */ + 0x0, 0xc9, 0x9a, 0xb0, 0xd9, 0x9a, 0xb0, 0x0, + 0xc6, 0x46, 0xb0, 0xd4, 0x47, 0xb0, 0x0, 0x56, + 0x66, 0x51, 0x56, 0x66, 0x40, 0x1, 0xeb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb1, 0x1, 0xb1, 0x88, 0x98, + 0x5, 0x80, 0x0, 0x2, 0xb4, 0x55, 0xb9, 0x3b, + 0xdc, 0xd2, 0x2, 0xb5, 0xd5, 0x5d, 0x6f, 0x0, + 0xb0, 0x3, 0x91, 0xe9, 0x9d, 0xa9, 0x65, 0x80, + 0x4, 0x81, 0xc0, 0xd, 0x0, 0xca, 0x30, 0x8, + 0x51, 0xe8, 0x8d, 0x0, 0x8c, 0x0, 0xd, 0x27, + 0xd8, 0x9e, 0x64, 0xbb, 0x50, 0x29, 0x4, 0x31, + 0xd, 0x78, 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+56DB "四" */ + 0xab, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0xd3, 0x25, + 0xc2, 0x2e, 0x22, 0x5c, 0xd1, 0x3, 0xa0, 0xd, + 0x0, 0x2c, 0xd1, 0x4, 0xa0, 0xd, 0x0, 0x2c, + 0xd1, 0x7, 0x70, 0xd, 0x0, 0x2c, 0xd1, 0xb, + 0x40, 0xd, 0x0, 0x2c, 0xd1, 0x5d, 0x0, 0xc, + 0xbb, 0x9c, 0xd7, 0xe3, 0x0, 0x0, 0x11, 0x3c, + 0xd3, 0x10, 0x0, 0x0, 0x0, 0x2c, 0xd3, 0x22, + 0x22, 0x22, 0x22, 0x4c, 0xdc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, + + /* U+56DE "回" */ + 0xef, 0xee, 0xee, 0xee, 0xee, 0xfe, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xe1, 0xd, 0xdd, 0xdd, 0xc0, 0x1e, + 0xe1, 0xe, 0x0, 0x1, 0xd0, 0x1e, 0xe1, 0xe, + 0x0, 0x1, 0xd0, 0x1e, 0xe1, 0xe, 0x0, 0x1, + 0xd0, 0x1e, 0xe1, 0xe, 0xdd, 0xdd, 0xd0, 0x1e, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xec, 0xcc, 0xcc, 0xcc, + 0xcc, 0xce, 0xe2, 0x11, 0x11, 0x11, 0x11, 0x2e, + + /* U+56E0 "因" */ + 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xe0, 0x0, + 0x1, 0x50, 0x0, 0x1d, 0xe0, 0x0, 0x4, 0xa0, + 0x0, 0x1d, 0xe0, 0x11, 0x16, 0xa1, 0x11, 0x1d, + 0xe1, 0xcc, 0xce, 0xec, 0xcc, 0x2d, 0xe0, 0x0, + 0xa, 0x70, 0x0, 0x1d, 0xe0, 0x0, 0x1d, 0xa7, + 0x0, 0x1d, 0xe0, 0x0, 0xa5, 0x9, 0x70, 0x1d, + 0xe0, 0x1a, 0xa0, 0x0, 0xa6, 0x1d, 0xe0, 0xa6, + 0x0, 0x0, 0x8, 0x1d, 0xea, 0xaa, 0xaa, 0xaa, + 0xaa, 0xad, 0xe2, 0x22, 0x22, 0x22, 0x22, 0x3d, + + /* U+56F0 "困" */ + 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xee, 0xd1, 0x0, + 0x6, 0x10, 0x0, 0x1e, 0xd1, 0x0, 0xb, 0x20, + 0x0, 0x1e, 0xd2, 0xaa, 0xae, 0xba, 0xaa, 0x2e, + 0xd1, 0x33, 0x9f, 0xc3, 0x33, 0x1e, 0xd1, 0x2, + 0xbc, 0x9b, 0x0, 0x1e, 0xd1, 0x1c, 0x2b, 0x27, + 0xb0, 0x1e, 0xd2, 0xc5, 0xb, 0x20, 0x8a, 0x1e, + 0xd4, 0x50, 0xb, 0x20, 0x8, 0x2e, 0xd1, 0x0, + 0xb, 0x20, 0x0, 0x1e, 0xd4, 0x33, 0x33, 0x33, + 0x33, 0x4e, 0xdb, 0xaa, 0xaa, 0xaa, 0xaa, 0xbe, + + /* U+56F3 "図" */ + 0xde, 0xee, 0xee, 0xee, 0xee, 0xed, 0xd1, 0x0, + 0x9, 0x30, 0x0, 0x1d, 0xd1, 0x50, 0x1, 0xc4, + 0x16, 0x1d, 0xd1, 0x95, 0x59, 0x13, 0x87, 0x1d, + 0xd1, 0x1d, 0x8, 0x71, 0xe0, 0x1d, 0xd1, 0x8, + 0x90, 0x4b, 0x60, 0x1d, 0xd1, 0x0, 0xa9, 0xb8, + 0x0, 0x1d, 0xd1, 0x0, 0x5f, 0xe3, 0x0, 0x1d, + 0xd3, 0x7d, 0xb2, 0x4d, 0xc7, 0x4d, 0xd4, 0x71, + 0x0, 0x0, 0x37, 0x4d, 0xde, 0xee, 0xee, 0xee, + 0xee, 0xed, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1d, + + /* U+56FD "国" */ + 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xea, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xd1, 0x9d, 0xde, 0xdd, + 0xd6, 0x4a, 0xd1, 0x0, 0x9, 0x40, 0x0, 0x4a, + 0xd1, 0x0, 0x9, 0x40, 0x0, 0x4a, 0xd1, 0x4d, + 0xde, 0xdd, 0xd2, 0x4a, 0xd1, 0x0, 0x9, 0x46, + 0x40, 0x4a, 0xd1, 0x0, 0x9, 0x40, 0xa1, 0x4a, + 0xd1, 0xcc, 0xce, 0xdc, 0xca, 0x4a, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xdb, 0xaa, 0xaa, 0xaa, + 0xaa, 0xca, 0xd3, 0x22, 0x22, 0x22, 0x22, 0x6a, + + /* U+570B "國" */ + 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xe0, 0x0, + 0x0, 0xa0, 0xa3, 0xe, 0xe0, 0x44, 0x44, 0xd4, + 0x58, 0x1e, 0xe1, 0x66, 0x66, 0xd7, 0x66, 0x1e, + 0xe0, 0x69, 0x96, 0xa2, 0x55, 0xe, 0xe0, 0xa0, + 0xa, 0x85, 0xd1, 0xe, 0xe0, 0xa9, 0xaa, 0x4c, + 0xa0, 0xe, 0xe0, 0x0, 0x3, 0x2f, 0x11, 0xe, + 0xe2, 0xac, 0xb8, 0xcd, 0x68, 0x3e, 0xe1, 0x20, + 0xa, 0x61, 0xbd, 0xe, 0xe2, 0x22, 0x24, 0x22, + 0x22, 0x2e, 0xea, 0xaa, 0xaa, 0xaa, 0xaa, 0xae, + + /* U+570D "圍" */ + 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xe0, 0x0, + 0x38, 0x0, 0x0, 0xe, 0xe0, 0x28, 0xca, 0x89, + 0xa0, 0xe, 0xe1, 0x88, 0xc9, 0x89, 0xc8, 0xe, + 0xe0, 0x19, 0x88, 0x88, 0x90, 0xe, 0xe0, 0x2b, + 0x0, 0x0, 0xd0, 0xe, 0xe0, 0x17, 0x77, 0xe7, + 0x70, 0xe, 0xe0, 0x9c, 0x99, 0xf9, 0x98, 0xe, + 0xe0, 0x57, 0x0, 0xd0, 0x0, 0xe, 0xe0, 0x59, + 0x99, 0xf9, 0x97, 0xe, 0xe2, 0x22, 0x22, 0x82, + 0x22, 0x2e, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbe, + + /* U+5712 "園" */ + 0xed, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xe0, 0x0, + 0xb, 0x10, 0x0, 0xe, 0xe0, 0x69, 0x9e, 0xa9, + 0x90, 0xe, 0xe2, 0x66, 0x6d, 0x76, 0x66, 0xe, + 0xe1, 0x44, 0x44, 0x44, 0x43, 0xe, 0xe0, 0x9a, + 0x88, 0x88, 0xe0, 0xe, 0xe0, 0x9b, 0x99, 0x99, + 0xe1, 0xe, 0xe0, 0x0, 0x8f, 0x82, 0xa6, 0xe, + 0xe0, 0x6a, 0x3d, 0x3a, 0xb2, 0xe, 0xe4, 0x50, + 0xd, 0x0, 0x39, 0xe, 0xe2, 0x22, 0x23, 0x22, + 0x22, 0x2e, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbe, + + /* U+5718 "團" */ + 0xdc, 0xcc, 0xcd, 0xcc, 0xcc, 0xe2, 0xd2, 0x55, + 0x5e, 0x55, 0x53, 0xb2, 0xd2, 0x55, 0x5e, 0x55, + 0x53, 0xb2, 0xd0, 0xc8, 0x8e, 0x88, 0xc2, 0xb2, + 0xd0, 0xc7, 0x7e, 0x77, 0xb2, 0xb2, 0xd0, 0x88, + 0x8e, 0x89, 0xa1, 0xb2, 0xd2, 0x99, 0x9e, 0x89, + 0xc2, 0xb2, 0xd5, 0xa9, 0x99, 0x9d, 0xa9, 0xb2, + 0xd0, 0x9, 0x20, 0xd, 0x0, 0xb2, 0xd0, 0x1, + 0x72, 0x7d, 0x0, 0xb2, 0xda, 0x99, 0x9a, 0xba, + 0x99, 0xe2, 0xd2, 0x22, 0x22, 0x22, 0x22, 0xa2, + + /* U+571F "土" */ + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, + 0x0, 0x0, 0x0, 0x2, 0xee, 0xee, 0xff, 0xee, + 0xee, 0x80, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0xa, 0xaa, 0xaa, + 0xce, 0xaa, 0xaa, 0xa4, 0x3, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x31, + + /* U+5723 "圣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xef, 0xdd, 0xdd, 0xdd, 0xf9, 0x0, 0x0, 0xc, + 0x60, 0x0, 0x5, 0xd1, 0x0, 0x0, 0x1, 0xd7, + 0x0, 0x7d, 0x20, 0x0, 0x0, 0x0, 0xa, 0xdc, + 0xa0, 0x0, 0x0, 0x0, 0x14, 0x9d, 0xab, 0xd8, + 0x30, 0x0, 0x3d, 0xc9, 0x50, 0x11, 0x16, 0xad, + 0xd2, 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xdd, 0xee, 0xdd, 0xd8, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, + 0x88, 0x11, 0x11, 0x10, 0x2c, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc2, + + /* U+5728 "在" */ + 0x0, 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x1b, 0xbb, + 0xcf, 0xbb, 0xbb, 0xbb, 0xb1, 0x2, 0x22, 0xe4, + 0x22, 0x22, 0x22, 0x20, 0x0, 0x7, 0xa0, 0x0, + 0x63, 0x0, 0x0, 0x0, 0x1e, 0x20, 0x0, 0x95, + 0x0, 0x0, 0x0, 0xcb, 0x0, 0x0, 0x95, 0x0, + 0x0, 0xc, 0xda, 0xb, 0xdd, 0xfe, 0xdd, 0x80, + 0x3a, 0x4a, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x3a, + 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x3a, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x3a, 0x5e, 0xee, + 0xfe, 0xee, 0xe1, + + /* U+5730 "地" */ + 0x0, 0x74, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x20, 0xd, 0x0, 0x0, 0x0, 0x85, + 0x0, 0xe0, 0xd, 0x0, 0x0, 0x1, 0x96, 0x10, + 0xe0, 0xe, 0x3a, 0xd0, 0x4c, 0xed, 0xc0, 0xe0, + 0x6f, 0xb5, 0xd0, 0x0, 0x85, 0x4, 0xfd, 0x7d, + 0x1, 0xd0, 0x0, 0x85, 0x49, 0xe0, 0xd, 0x1, + 0xc0, 0x0, 0x85, 0x0, 0xe0, 0xd, 0x2, 0xc0, + 0x0, 0x9b, 0xd1, 0xe0, 0xd, 0x5c, 0x80, 0x2b, + 0xe8, 0x10, 0xe0, 0xa, 0x1, 0x10, 0x37, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x8d, + 0xdd, 0xdd, 0xb0, + + /* U+5747 "均" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x50, 0x0, 0x4b, 0x0, 0x0, 0x0, 0x95, 0x0, + 0xb, 0x50, 0x0, 0x0, 0x9, 0x50, 0x2, 0xf8, + 0x77, 0x77, 0x1, 0xa6, 0x10, 0xbb, 0x99, 0x99, + 0xe4, 0xce, 0xdc, 0x8c, 0x0, 0x0, 0xd, 0x0, + 0x95, 0xa, 0x29, 0x10, 0x0, 0xe0, 0x9, 0x50, + 0x0, 0x4c, 0x20, 0xd, 0x0, 0x95, 0x0, 0x0, + 0x29, 0x1, 0xd0, 0x9, 0x56, 0x50, 0x0, 0x7c, + 0x3c, 0x1, 0xbe, 0x70, 0x17, 0xd6, 0x3, 0xa4, + 0xe7, 0x0, 0x2e, 0x70, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, + 0x6, 0xde, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+574A "坊" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x3a, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x3a, 0x2, + 0x44, 0x47, 0x54, 0x42, 0x0, 0x3a, 0x8, 0xcd, + 0xfc, 0xcc, 0xc7, 0x1e, 0xef, 0xe6, 0x1, 0xd0, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0x3a, 0x0, 0x2, 0xfd, 0xde, 0xc0, + 0x0, 0x3a, 0x0, 0x3, 0xb0, 0x3, 0xb0, 0x0, + 0x3a, 0x45, 0x8, 0x80, 0x3, 0xb0, 0x3, 0x9f, + 0xa3, 0xe, 0x20, 0x4, 0xa0, 0x3d, 0x71, 0x0, + 0x8a, 0x0, 0x6, 0x80, 0x0, 0x0, 0x8, 0xd0, + 0x0, 0x9, 0x60, 0x0, 0x0, 0x5b, 0x10, 0xc, + 0xed, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5750 "坐" */ + 0x0, 0x2, 0x30, 0x59, 0x0, 0x31, 0x0, 0x0, + 0xa, 0x50, 0x59, 0x0, 0xc3, 0x0, 0x0, 0xe, + 0x10, 0x59, 0x2, 0xe0, 0x0, 0x0, 0x4f, 0x40, + 0x59, 0x7, 0xd0, 0x0, 0x0, 0xb7, 0xe3, 0x59, + 0x1e, 0x8b, 0x0, 0x6, 0xc0, 0x3d, 0x6a, 0xb7, + 0x9, 0x90, 0x1e, 0x20, 0x3, 0x5c, 0x90, 0x0, + 0xc2, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0xee, 0xee, 0xff, 0xee, 0xee, 0x70, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, + 0x6a, 0x22, 0x22, 0x20, 0xb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb5, + + /* U+578B "型" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, 0xa, + 0xee, 0xdf, 0xd6, 0x49, 0xa, 0x30, 0x0, 0x66, + 0xb, 0x20, 0x49, 0xa, 0x30, 0x1, 0x77, 0x1b, + 0x31, 0x49, 0xa, 0x30, 0x2b, 0xed, 0xbe, 0xc9, + 0x49, 0xa, 0x30, 0x0, 0xc2, 0xb, 0x20, 0x26, + 0xa, 0x30, 0x4, 0xb0, 0xb, 0x20, 0x0, 0xa, + 0x30, 0x1c, 0x10, 0x7, 0x62, 0x6, 0xdb, 0x0, + 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x1, + 0xdd, 0xdd, 0xfe, 0xdd, 0xd8, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, + 0xa6, 0x11, 0x11, 0x10, 0x7c, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc1, + + /* U+57DF "域" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, + 0xc0, 0x0, 0x0, 0xe, 0x2c, 0x10, 0x1, 0xc0, + 0x0, 0x0, 0xe, 0x4, 0x90, 0x1, 0xc0, 0x8d, + 0xdd, 0xdf, 0xdd, 0xd0, 0x36, 0xe5, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x7c, 0xfc, 0x22, 0x22, 0xc, + 0x10, 0x0, 0x1, 0xc0, 0x4c, 0x9e, 0xb, 0x25, + 0x90, 0x1, 0xc0, 0x46, 0xb, 0xa, 0x3b, 0x30, + 0x1, 0xc0, 0x46, 0xb, 0x8, 0x7d, 0x0, 0x1, + 0xc1, 0x4c, 0xcc, 0x5, 0xe5, 0x0, 0x4, 0xfc, + 0x20, 0x3, 0x66, 0xd0, 0x0, 0x8c, 0x40, 0x8b, + 0xc9, 0x8e, 0xd0, 0x51, 0x0, 0x0, 0x51, 0x5, + 0xc2, 0xa5, 0xa0, 0x0, 0x0, 0x0, 0x1a, 0x0, + 0x2d, 0xb0, + + /* U+57F7 "執" */ + 0x0, 0x7, 0x60, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x7, 0x70, 0x0, 0x3a, 0x0, 0x0, 0x7, 0xcd, + 0xdc, 0x60, 0x3a, 0x0, 0x0, 0x0, 0x7, 0x60, + 0xb, 0xde, 0xcd, 0x10, 0x2d, 0xdd, 0xdd, 0xc0, + 0x3a, 0xc, 0x10, 0x1, 0xb0, 0xc, 0x0, 0x49, + 0xc, 0x10, 0x0, 0x91, 0x49, 0xb, 0x78, 0xc, + 0x10, 0x9, 0xce, 0xed, 0x83, 0xe8, 0xc, 0x10, + 0x0, 0x6, 0x60, 0x0, 0xbe, 0x5b, 0x10, 0x2c, + 0xce, 0xec, 0xc0, 0xe1, 0xaa, 0x20, 0x0, 0x6, + 0x60, 0x6, 0x80, 0x8, 0x48, 0x0, 0x6, 0x60, + 0x2d, 0x10, 0x4, 0xa9, 0x0, 0x6, 0x60, 0xa3, + 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+57FA "基" */ + 0x0, 0x4, 0x90, 0x0, 0x2, 0xc0, 0x0, 0x4, + 0x8b, 0xd8, 0x88, 0x89, 0xe8, 0x80, 0x1, 0x47, + 0xb4, 0x44, 0x45, 0xd4, 0x40, 0x0, 0x4, 0xeb, + 0xbb, 0xbc, 0xc0, 0x0, 0x0, 0x4, 0x90, 0x0, + 0x2, 0xc0, 0x0, 0x0, 0x4, 0xeb, 0xbb, 0xbc, + 0xc0, 0x0, 0x0, 0x4, 0x90, 0x0, 0x2, 0xc0, + 0x0, 0x1c, 0xcd, 0xfc, 0xcc, 0xcd, 0xec, 0xc7, + 0x0, 0xb, 0x60, 0x14, 0x0, 0xc5, 0x0, 0x5, + 0xda, 0xaa, 0xce, 0xaa, 0x8c, 0xb3, 0xc, 0x30, + 0x11, 0x5b, 0x11, 0x10, 0x64, 0x0, 0x0, 0x0, + 0x4a, 0x0, 0x0, 0x0, 0x0, 0xcc, 0xcc, 0xde, + 0xcc, 0xcc, 0x60, + + /* U+5831 "報" */ + 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, 0x8, 0xed, 0xdd, 0xe0, 0x8, 0xce, + 0xdc, 0x78, 0x50, 0x0, 0xe0, 0x0, 0x7, 0x60, + 0x8, 0x50, 0x22, 0xe0, 0x1d, 0xdd, 0xdd, 0xc8, + 0x50, 0x9a, 0x50, 0x0, 0xb0, 0xd, 0x8, 0x84, + 0x44, 0x40, 0x0, 0xa1, 0x67, 0x8, 0xdb, 0x88, + 0xe0, 0xb, 0xde, 0xed, 0x98, 0x7d, 0x2, 0xb0, + 0x0, 0x7, 0x60, 0x8, 0x5a, 0x69, 0x50, 0x2d, + 0xde, 0xed, 0xc8, 0x51, 0xdc, 0x0, 0x0, 0x7, + 0x60, 0x8, 0x51, 0xdb, 0x0, 0x0, 0x7, 0x60, + 0x8, 0x6c, 0x6a, 0xb1, 0x0, 0x7, 0x60, 0x8, + 0xe5, 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5834 "場" */ + 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0xeb, 0xbb, 0xbc, 0xa0, 0x0, 0x85, + 0x0, 0xe6, 0x66, 0x68, 0xa0, 0x3e, 0xfe, 0xd0, + 0xd1, 0x11, 0x14, 0xa0, 0x0, 0x85, 0x0, 0xea, + 0xaa, 0xac, 0xa0, 0x0, 0x85, 0x0, 0x11, 0x11, + 0x11, 0x10, 0x0, 0x85, 0x4d, 0xee, 0xdd, 0xdd, + 0xd5, 0x0, 0x85, 0x10, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x9d, 0xc9, 0xdd, 0xfc, 0xfd, 0xe0, 0x3c, + 0xc5, 0xb8, 0xa, 0x41, 0xc0, 0xa0, 0x13, 0x0, + 0x20, 0x88, 0xa, 0x40, 0xa0, 0x0, 0x0, 0x1b, + 0x70, 0x7a, 0x0, 0xb0, 0x0, 0x0, 0x3, 0x4, + 0xb0, 0xac, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+584A "塊" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x75, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x75, + 0x0, 0x11, 0x88, 0x11, 0x10, 0x0, 0x75, 0x5, + 0xda, 0xbe, 0xaa, 0xe0, 0x3, 0x98, 0x35, 0x70, + 0x2b, 0x0, 0xd0, 0x19, 0xcb, 0x85, 0xdb, 0xce, + 0xbb, 0xe0, 0x0, 0x75, 0x5, 0x70, 0x58, 0x0, + 0xd0, 0x0, 0x75, 0x5, 0x92, 0x88, 0x22, 0xe0, + 0x0, 0x75, 0x3, 0xaa, 0xee, 0xaa, 0x90, 0x0, + 0x75, 0x0, 0x0, 0xdc, 0x9, 0x10, 0x0, 0x9d, + 0xd1, 0x7, 0x6c, 0x55, 0xa0, 0x3e, 0xa4, 0x0, + 0x2d, 0xc, 0xda, 0xc2, 0x1, 0x0, 0x3, 0xd3, + 0xd, 0x0, 0x26, 0x0, 0x0, 0x2d, 0x30, 0xb, + 0xcc, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5869 "塩" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x76, + 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x76, 0x2, + 0xfd, 0xdd, 0xdd, 0xd3, 0x1, 0x87, 0x1b, 0x60, + 0x0, 0x0, 0x0, 0xb, 0xdd, 0xcc, 0xeb, 0xbb, + 0xbe, 0x30, 0x0, 0x76, 0x0, 0xd0, 0x0, 0x9, + 0x30, 0x0, 0x76, 0x0, 0xdb, 0xbb, 0xbe, 0x30, + 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7a, 0xb7, 0xcc, 0xcc, 0xcc, 0xb0, 0x6, 0xec, + 0x48, 0x35, 0x70, 0xb0, 0xd0, 0x2b, 0x40, 0x8, + 0x35, 0x70, 0xb0, 0xd0, 0x0, 0x0, 0x8, 0x35, + 0x70, 0xb0, 0xd0, 0x0, 0x2, 0xdf, 0xee, 0xed, + 0xfd, 0xf6, + + /* U+5883 "境" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x86, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x86, + 0x2, 0xcc, 0xcf, 0xcc, 0xc0, 0x0, 0x86, 0x0, + 0xa, 0x0, 0x26, 0x0, 0x3, 0x98, 0x20, 0xc, + 0x20, 0x85, 0x0, 0xb, 0xdd, 0x88, 0xcc, 0xcc, + 0xcc, 0xc4, 0x0, 0x86, 0x0, 0x66, 0x66, 0x66, + 0x40, 0x0, 0x86, 0x0, 0xe2, 0x22, 0x27, 0x90, + 0x0, 0x86, 0x0, 0xea, 0xaa, 0xac, 0x90, 0x0, + 0x86, 0x0, 0xd0, 0x0, 0x5, 0x90, 0x0, 0x8c, + 0xd0, 0xad, 0xda, 0xfa, 0x60, 0x2d, 0xc6, 0x0, + 0xa, 0x50, 0xd0, 0x0, 0x2, 0x0, 0x0, 0x5d, + 0x0, 0xd0, 0x1a, 0x0, 0x0, 0x4c, 0xb2, 0x0, + 0xcc, 0xc6, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, + + /* U+5897 "増" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0xa5, 0x0, 0xd, 0x30, 0x0, 0x85, + 0x0, 0x4d, 0x0, 0x3b, 0x0, 0x0, 0x85, 0x7, + 0xcf, 0xcc, 0xdd, 0xc3, 0x4, 0xa8, 0x49, 0x30, + 0xc, 0x0, 0xa3, 0x19, 0xcb, 0x89, 0xcb, 0xbf, + 0xbb, 0xe3, 0x0, 0x85, 0x9, 0x30, 0xc, 0x0, + 0xa3, 0x0, 0x85, 0x9, 0xcb, 0xce, 0xbb, 0xe3, + 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x71, 0xfc, 0xcc, 0xcc, 0xb0, 0x5, 0xce, + 0x80, 0xd0, 0x0, 0x2, 0xb0, 0x4b, 0x50, 0x0, + 0xfb, 0xbb, 0xbc, 0xb0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, 0xfb, 0xbb, + 0xbc, 0xb0, + + /* U+589E "增" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x50, 0x6, 0x90, 0x4, 0xa0, 0x0, 0x85, 0x0, + 0xe, 0x20, 0xb2, 0x0, 0x8, 0x50, 0x7b, 0xcb, + 0xbf, 0xb8, 0x1, 0x96, 0x9, 0x53, 0x1b, 0x14, + 0xa0, 0xce, 0xd9, 0x93, 0xb1, 0xb7, 0x4a, 0x0, + 0x85, 0x9, 0x25, 0x3b, 0x62, 0xa0, 0x8, 0x50, + 0x8b, 0xbb, 0xdb, 0xb9, 0x0, 0x85, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x50, 0xd, 0xbb, 0xbb, + 0xf0, 0x0, 0xac, 0xb0, 0xd2, 0x22, 0x2e, 0x1, + 0xd8, 0x20, 0xd, 0x66, 0x66, 0xf0, 0x0, 0x0, + 0x0, 0xd9, 0x99, 0x9f, 0x0, 0x0, 0x0, 0xd, + 0x22, 0x22, 0xe0, + + /* U+58CA "壊" */ + 0x0, 0x93, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x93, 0x4a, 0xaa, 0xfa, 0xaa, 0xa4, 0x0, 0x93, + 0x12, 0x22, 0xd3, 0x22, 0x21, 0x1, 0xa4, 0x8, + 0x88, 0xe9, 0x88, 0x70, 0xc, 0xed, 0x6c, 0x3c, + 0x3b, 0x63, 0xd0, 0x0, 0x93, 0xc, 0x2c, 0x2a, + 0x52, 0xd0, 0x0, 0x93, 0x6, 0x66, 0xc6, 0x66, + 0x50, 0x0, 0x93, 0x6b, 0xbb, 0xfc, 0xbb, 0xb5, + 0x0, 0xab, 0x90, 0x3d, 0xc6, 0x4, 0x70, 0x1b, + 0xd5, 0x7, 0xf2, 0x1d, 0x8b, 0x10, 0x4, 0x1, + 0xd7, 0xc0, 0x3, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0xd6, 0xa6, 0x2d, 0x92, 0x0, 0x0, 0x0, 0xc7, + 0x10, 0x0, 0x64, + + /* U+58D3 "壓" */ + 0xa, 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb0, 0xa, + 0x2a, 0x77, 0xb0, 0x1, 0x87, 0x10, 0xa, 0x2d, + 0x77, 0xd0, 0x1, 0x92, 0x80, 0xa, 0x2a, 0x88, + 0xa5, 0xcc, 0xec, 0xc0, 0xa, 0x5a, 0x88, 0xa2, + 0x4, 0xf1, 0x0, 0xb, 0x5c, 0x77, 0xc3, 0xa, + 0x87, 0x0, 0xc, 0x4c, 0x88, 0xc3, 0x5b, 0xc, + 0x10, 0xc, 0x48, 0x4, 0xba, 0xd1, 0x4, 0xd1, + 0xd, 0x13, 0x4, 0x5a, 0x10, 0x0, 0x30, 0x1c, + 0xa, 0xbb, 0xbf, 0xbb, 0xbb, 0x30, 0x58, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x92, 0xab, 0xbb, + 0xbf, 0xbb, 0xbb, 0xb2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+58EB "士" */ + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x1e, 0xee, 0xee, 0xff, 0xee, + 0xee, 0xe6, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x4, 0xdd, 0xdd, + 0xef, 0xdd, 0xdd, 0x90, 0x0, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x0, + + /* U+58F0 "声" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0xcc, + 0xcc, 0xce, 0xdc, 0xcc, 0xcc, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x70, + 0x0, 0x0, 0x1, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdc, 0xbb, 0xdd, 0xbb, 0xbf, 0x10, 0xd, 0x10, + 0x7, 0x60, 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x76, + 0x0, 0xd, 0x10, 0xf, 0xdd, 0xdd, 0xdd, 0xdd, + 0xf1, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x7, 0x0, + 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+58F2 "売" */ + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x87, 0x11, 0x11, 0x10, 0xc, 0xcc, + 0xcc, 0xee, 0xcc, 0xcc, 0xc1, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0xad, 0xdd, 0xed, + 0xdd, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x90, 0xa, 0x30, 0x0, 0x0, 0x10, 0x3, 0xa0, + 0x7, 0x20, 0x78, 0x0, 0xe0, 0x2, 0x80, 0x0, + 0x0, 0xa5, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x1, + 0xe0, 0x0, 0xe0, 0x0, 0x71, 0x0, 0x2d, 0x60, + 0x0, 0xe0, 0x0, 0xc1, 0x1c, 0xc4, 0x0, 0x0, + 0xae, 0xde, 0xb0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5909 "変" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0xa, 0xaa, + 0xaa, 0xce, 0xaa, 0xaa, 0xa0, 0x2, 0x22, 0x3e, + 0x22, 0xe3, 0x22, 0x20, 0x0, 0x1b, 0x1d, 0x0, + 0xd2, 0xb1, 0x0, 0x0, 0xa5, 0xd, 0x0, 0xd0, + 0x4d, 0x10, 0x9, 0x90, 0xd, 0x0, 0xd0, 0x5, + 0xb0, 0x1, 0x0, 0xa, 0x20, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0x32, 0x22, 0x10, 0x0, 0x0, + 0x8, 0xfa, 0xaa, 0xad, 0xc0, 0x0, 0x4, 0xd9, + 0x97, 0x0, 0x3d, 0x20, 0x0, 0x6, 0x30, 0x8, + 0xa8, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x49, 0xed, + 0xa4, 0x0, 0x0, 0x19, 0xcd, 0xa4, 0x0, 0x4a, + 0xdd, 0xa2, 0x4, 0x10, 0x0, 0x0, 0x0, 0x1, + 0x40, + + /* U+590F "夏" */ + 0xb, 0xcc, 0xcc, 0xed, 0xcc, 0xcc, 0xb0, 0x0, + 0x59, 0x99, 0xeb, 0x99, 0x95, 0x0, 0x0, 0x87, + 0x22, 0x22, 0x22, 0x78, 0x0, 0x0, 0x8a, 0x77, + 0x77, 0x77, 0xa8, 0x0, 0x0, 0x8c, 0xaa, 0xaa, + 0xaa, 0xc8, 0x0, 0x0, 0x87, 0x11, 0x11, 0x11, + 0x78, 0x0, 0x0, 0x48, 0xbe, 0x88, 0x88, 0x84, + 0x0, 0x0, 0x5, 0xfd, 0xbb, 0xbb, 0xa0, 0x0, + 0x5, 0xc9, 0xb6, 0x0, 0x2c, 0x50, 0x0, 0x18, + 0x10, 0x8, 0xb8, 0xc3, 0x0, 0x0, 0x0, 0x25, + 0x8c, 0xaa, 0xd9, 0x53, 0x10, 0x3c, 0xa7, 0x40, + 0x0, 0x4, 0x8a, 0xd3, + + /* U+5915 "夕" */ + 0x0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0x0, 0x0, 0x0, 0x0, 0x1, 0xed, 0xbb, + 0xbb, 0xb3, 0x0, 0xc, 0x73, 0x33, 0x33, 0xe1, + 0x0, 0xb9, 0x0, 0x0, 0x5, 0xa0, 0x1c, 0xa3, + 0x60, 0x0, 0xc, 0x40, 0x77, 0x1, 0xab, 0x10, + 0x6c, 0x0, 0x0, 0x0, 0x6, 0xe6, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x0, + 0x5, 0xe6, 0x0, 0x0, 0x0, 0x1, 0x9d, 0x30, + 0x0, 0x0, 0x3, 0xae, 0x90, 0x0, 0x0, 0x0, + 0xc, 0x71, 0x0, 0x0, 0x0, 0x0, + + /* U+5916 "外" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x40, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xe, + 0x10, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x3f, 0xcc, + 0xc5, 0x2c, 0x0, 0x0, 0x0, 0x87, 0x11, 0xb4, + 0x2c, 0x0, 0x0, 0x1, 0xe0, 0x0, 0xe0, 0x2e, + 0x50, 0x0, 0x9, 0x92, 0x2, 0xd0, 0x2d, 0xc8, + 0x0, 0xa, 0x3d, 0x68, 0x80, 0x2c, 0xa, 0xa0, + 0x0, 0x0, 0xbf, 0x10, 0x2c, 0x0, 0xb6, 0x0, + 0x0, 0x7a, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x3, + 0xe2, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x2e, 0x40, + 0x0, 0x2c, 0x0, 0x0, 0x6, 0xf6, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x2c, + 0x0, 0x0, + + /* U+591A "多" */ + 0x0, 0x0, 0x1d, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xeb, 0xbb, 0x90, 0x0, 0x0, 0x8d, 0x42, + 0x22, 0xc5, 0x0, 0x1, 0xd8, 0x65, 0x1, 0xb8, + 0x0, 0x0, 0x1, 0x0, 0xab, 0xd5, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0x92, 0xc6, 0x0, 0x0, 0x6c, + 0xd8, 0x11, 0xcf, 0xcc, 0xcc, 0x2, 0x20, 0x6, + 0xd4, 0x0, 0xa, 0x70, 0x0, 0x6c, 0x96, 0x30, + 0x7, 0xb0, 0x0, 0x6, 0x10, 0x2d, 0x7b, 0xa1, + 0x0, 0x0, 0x0, 0x3, 0xae, 0x50, 0x0, 0x1, + 0x36, 0x9d, 0xb6, 0x0, 0x0, 0x0, 0x9b, 0x85, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+591C "夜" */ + 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x2e, 0xee, + 0xfe, 0xee, 0xee, 0xee, 0xe2, 0x0, 0x4, 0xb0, + 0x7, 0x90, 0x0, 0x0, 0x0, 0xd, 0x20, 0x1e, + 0xdc, 0xcc, 0x80, 0x0, 0x7a, 0x0, 0x96, 0x40, + 0x9, 0x50, 0x6, 0xfa, 0x8, 0xf1, 0xa7, 0xd, + 0x0, 0x5d, 0x5a, 0x7c, 0x68, 0x8, 0x88, 0x0, + 0x12, 0x4a, 0x10, 0xa, 0x44, 0xc0, 0x0, 0x0, + 0x4a, 0x0, 0x1, 0xdd, 0x20, 0x0, 0x0, 0x4a, + 0x0, 0x6, 0xde, 0x50, 0x0, 0x0, 0x4a, 0x4, + 0xca, 0x11, 0xcb, 0x30, 0x0, 0x4a, 0x7b, 0x40, + 0x0, 0x5, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5920 "夠" */ + 0x0, 0x9, 0x30, 0x0, 0x73, 0x0, 0x0, 0x0, + 0x4f, 0x99, 0x30, 0xd1, 0x0, 0x0, 0x3, 0xc4, + 0x3c, 0x33, 0xfd, 0xdd, 0xd0, 0xd, 0x72, 0x4b, + 0xa, 0x40, 0x0, 0xd0, 0x0, 0x3d, 0xc2, 0x4c, + 0x0, 0x0, 0xd0, 0x0, 0x2c, 0x80, 0x65, 0xec, + 0xf0, 0xd0, 0x7, 0xc8, 0xc1, 0x11, 0xa0, 0xc0, + 0xd0, 0x2, 0x3d, 0xbb, 0xe1, 0xa0, 0xc0, 0xe0, + 0x7, 0xd3, 0x7, 0x81, 0xa0, 0xc0, 0xe0, 0x7, + 0x1c, 0x6e, 0x11, 0xec, 0xc0, 0xd0, 0x0, 0x2, + 0xf4, 0x1, 0xa0, 0x2, 0xc0, 0x0, 0x5d, 0x50, + 0x0, 0x0, 0x5, 0xa0, 0xc, 0xa2, 0x0, 0x0, + 0x4, 0xde, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5927 "大" */ + 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa5, 0x0, 0x0, 0x0, 0x1e, 0xee, 0xee, 0xfe, + 0xee, 0xee, 0xe2, 0x0, 0x0, 0x1, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xba, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x63, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0xb7, 0x0, 0x0, 0x0, + 0x1, 0xd5, 0x0, 0x2e, 0x30, 0x0, 0x0, 0x1d, + 0x80, 0x0, 0x5, 0xe3, 0x0, 0x7, 0xe7, 0x0, + 0x0, 0x0, 0x5f, 0x80, 0x1a, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xa1, + + /* U+5929 "天" */ + 0x7, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x60, 0x0, + 0x11, 0x11, 0x97, 0x11, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x96, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0xa6, + 0x11, 0x11, 0x10, 0xd, 0xdd, 0xdd, 0xff, 0xdd, + 0xdd, 0xd1, 0x0, 0x0, 0x1, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x97, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0x20, 0xd3, 0x0, 0x0, 0x0, + 0x3, 0xe5, 0x0, 0x3e, 0x30, 0x0, 0x0, 0x7e, + 0x40, 0x0, 0x4, 0xe7, 0x0, 0x2e, 0x91, 0x0, + 0x0, 0x0, 0x2a, 0xe3, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, + + /* U+592A "太" */ + 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa5, 0x0, 0x0, 0x0, 0x1e, 0xee, 0xee, 0xff, + 0xee, 0xee, 0xe2, 0x0, 0x0, 0x0, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xc8, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x82, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x10, 0xa7, 0x0, 0x0, 0x0, + 0x0, 0xbb, 0x0, 0x1e, 0x20, 0x0, 0x0, 0xa, + 0xb9, 0xb0, 0x5, 0xe2, 0x0, 0x3, 0xdb, 0x0, + 0x9b, 0x0, 0x7e, 0x50, 0x2e, 0x50, 0x0, 0x9, + 0x30, 0x4, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+592B "夫" */ + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x1, 0xcc, + 0xcc, 0xee, 0xcc, 0xcc, 0x30, 0x0, 0x22, 0x22, + 0xa8, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x96, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, + 0x0, 0x0, 0xd, 0xdd, 0xdd, 0xfe, 0xdd, 0xdd, + 0xd1, 0x1, 0x11, 0x13, 0xfd, 0x21, 0x11, 0x10, + 0x0, 0x0, 0x7, 0xab, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x22, 0xe2, 0x0, 0x0, 0x0, 0x6, + 0xe4, 0x0, 0x4e, 0x40, 0x0, 0x5, 0xcc, 0x20, + 0x0, 0x3, 0xdb, 0x50, 0x2b, 0x40, 0x0, 0x0, + 0x0, 0x5, 0xa2, + + /* U+592E "央" */ + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0xee, 0xff, 0xee, 0xee, 0x0, 0x0, 0x86, 0x0, + 0x59, 0x0, 0xf, 0x0, 0x0, 0x86, 0x0, 0x59, + 0x0, 0xf, 0x0, 0x0, 0x86, 0x0, 0x68, 0x0, + 0xf, 0x0, 0x0, 0x86, 0x0, 0x77, 0x0, 0xf, + 0x0, 0x1e, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe6, + 0x0, 0x0, 0x1, 0xea, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x91, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x9c, 0x0, 0x5d, 0x10, 0x0, 0x0, 0x4c, 0xa0, + 0x0, 0x5, 0xe6, 0x0, 0xd, 0xc5, 0x0, 0x0, + 0x0, 0x29, 0xe6, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5931 "失" */ + 0x0, 0x8, 0x20, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x10, 0x86, 0x0, 0x0, 0x0, 0x0, 0x6c, + 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0xce, 0xee, + 0xff, 0xee, 0xee, 0x10, 0x6, 0xd0, 0x0, 0x96, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x96, 0x0, + 0x0, 0x0, 0x4, 0x33, 0x33, 0xb7, 0x33, 0x33, + 0x30, 0x2b, 0xbb, 0xbc, 0xff, 0xbb, 0xbb, 0xb2, + 0x0, 0x0, 0x4, 0xdc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x63, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xba, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x4d, 0x90, + 0x0, 0x9, 0xd4, 0x0, 0x2d, 0xc4, 0x0, 0x0, + 0x0, 0x4c, 0xe3, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, + + /* U+5947 "奇" */ + 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x3, + 0xaa, 0xaa, 0xcd, 0xaa, 0xaa, 0x80, 0x1, 0x33, + 0x33, 0xe8, 0x33, 0x33, 0x20, 0x0, 0x0, 0x9, + 0xbc, 0xc6, 0x0, 0x0, 0x0, 0x37, 0xda, 0x0, + 0x3a, 0xe7, 0x0, 0x5, 0xb7, 0x20, 0x0, 0x0, + 0x29, 0x30, 0x1d, 0xdd, 0xdd, 0xdd, 0xdd, 0xee, + 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x9d, 0xcc, 0xce, 0x0, 0x77, 0x0, 0x0, + 0x94, 0x0, 0xe, 0x0, 0x77, 0x0, 0x0, 0x95, + 0x11, 0x1e, 0x0, 0x77, 0x0, 0x0, 0x9c, 0xaa, + 0xa9, 0x0, 0x77, 0x0, 0x0, 0x52, 0x0, 0x0, + 0xdd, 0xd4, 0x0, + + /* U+5951 "契" */ + 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xbe, 0xcb, 0x7d, 0xdf, 0xdd, 0xe0, 0x0, 0xa, + 0x30, 0x0, 0x2b, 0x0, 0xe0, 0x8, 0xbe, 0xcb, + 0x30, 0x49, 0x0, 0xd0, 0x0, 0xa, 0x30, 0x0, + 0x95, 0x1, 0xc0, 0x1b, 0xbe, 0xcb, 0x73, 0xd0, + 0x3, 0xa0, 0x0, 0xa, 0x30, 0x6e, 0x31, 0xbd, + 0x60, 0x0, 0x3, 0x10, 0x94, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x1c, + 0xcc, 0xcd, 0xff, 0xdc, 0xcc, 0xc1, 0x0, 0x0, + 0x9, 0x87, 0x90, 0x0, 0x0, 0x0, 0x3, 0xba, + 0x0, 0xab, 0x30, 0x0, 0x2a, 0xdb, 0x40, 0x0, + 0x5, 0xcd, 0xb2, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x30, + + /* U+5957 "套" */ + 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x15, 0xd1, 0x11, 0x11, 0x10, 0xb, 0xbb, + 0xdf, 0xbb, 0xed, 0xbb, 0xb0, 0x0, 0x3, 0xd3, + 0x0, 0x1b, 0x50, 0x0, 0x1, 0x8e, 0xec, 0xcc, + 0xcc, 0xba, 0x30, 0x2d, 0x56, 0xb4, 0x44, 0x44, + 0x13, 0xc3, 0x0, 0x5, 0xb6, 0x66, 0x66, 0x20, + 0x0, 0x0, 0x5, 0xdb, 0xbb, 0xbb, 0x40, 0x0, + 0x0, 0x5, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0xcd, 0xed, 0xcc, 0xcc, 0xcc, 0xc1, 0x0, 0x4, + 0xc2, 0x0, 0xa, 0x40, 0x0, 0x0, 0x9f, 0x88, + 0x9a, 0xbc, 0xf6, 0x0, 0x0, 0x55, 0x43, 0x21, + 0x0, 0xa, 0x10, + + /* U+5973 "女" */ + 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x40, 0x0, 0x0, 0x0, 0x1, 0x11, 0x4f, + 0x21, 0x11, 0x11, 0x10, 0x1d, 0xdd, 0xfe, 0xdd, + 0xdf, 0xed, 0xd2, 0x0, 0x0, 0xe1, 0x0, 0xc, + 0x40, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0xe, 0x30, 0x0, 0x8a, 0x0, 0x0, + 0x0, 0x3d, 0xc5, 0x2, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xed, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xeb, 0xe7, 0x0, 0x0, 0x0, 0x26, 0xdc, + 0x20, 0x2a, 0xe5, 0x0, 0x1e, 0xea, 0x40, 0x0, + 0x0, 0x4d, 0x80, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, + + /* U+5979 "她" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x58, 0x0, 0x0, 0xa, 0x20, 0x0, 0x0, 0x85, + 0x0, 0x4, 0xa, 0x20, 0x0, 0x0, 0xa3, 0x0, + 0xd, 0xa, 0x20, 0x0, 0x1d, 0xfe, 0xe6, 0xd, + 0xa, 0x7a, 0xf2, 0x0, 0xd0, 0x76, 0xe, 0x8f, + 0xa4, 0xc2, 0x3, 0xa0, 0x97, 0xbf, 0x7b, 0x20, + 0xc1, 0x7, 0x70, 0xb4, 0x4d, 0xa, 0x20, 0xc1, + 0xc, 0x30, 0xd0, 0xd, 0xa, 0x20, 0xc0, 0x5, + 0xb5, 0xa0, 0xd, 0xa, 0x43, 0xe0, 0x0, 0x2e, + 0x70, 0xd, 0x6, 0x3a, 0x71, 0x0, 0x5a, 0xb7, + 0xd, 0x0, 0x0, 0x49, 0x2, 0xd1, 0x16, 0xe, + 0x0, 0x0, 0x76, 0xd, 0x30, 0x0, 0x9, 0xed, + 0xde, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+597D "好" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, + 0x0, 0x5d, 0xdd, 0xdd, 0xa0, 0x0, 0xc2, 0x0, + 0x0, 0x0, 0x1d, 0x40, 0x5d, 0xfe, 0xdb, 0x0, + 0x0, 0xb7, 0x0, 0x2, 0xb0, 0x2b, 0x0, 0x9, + 0x80, 0x0, 0x6, 0x70, 0x58, 0x0, 0xb, 0x30, + 0x0, 0xa, 0x30, 0x86, 0xee, 0xef, 0xee, 0xe6, + 0xe, 0x30, 0xd1, 0x0, 0xb, 0x30, 0x0, 0x4, + 0xea, 0xb0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x1f, + 0xb0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x9a, 0xba, + 0x0, 0xb, 0x30, 0x0, 0x9, 0xc0, 0x6, 0x0, + 0xb, 0x30, 0x0, 0x59, 0x0, 0x0, 0x9, 0xdd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5982 "如" */ + 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0x90, 0x0, 0x23, 0x33, 0x33, 0x0, 0x76, 0x0, + 0xb, 0xba, 0xaa, 0xd7, 0xdf, 0xed, 0xe5, 0xb2, + 0x0, 0x1d, 0x0, 0xe0, 0xa, 0x4b, 0x20, 0x1, + 0xd0, 0x2c, 0x0, 0xd1, 0xb2, 0x0, 0x1d, 0x6, + 0x80, 0xe, 0xb, 0x20, 0x1, 0xd0, 0xa5, 0x4, + 0xa0, 0xb2, 0x0, 0x1d, 0x5, 0xe5, 0xa4, 0xb, + 0x20, 0x1, 0xd0, 0x2, 0xdf, 0x0, 0xb2, 0x0, + 0x1d, 0x0, 0x1d, 0xd9, 0xb, 0x20, 0x1, 0xd0, + 0x3d, 0x80, 0xb3, 0xbe, 0xdd, 0xed, 0x4f, 0x70, + 0x0, 0xb, 0x20, 0x0, 0x70, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5987 "妇" */ + 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xa0, 0x3, 0x77, 0x77, 0x75, 0x0, 0x68, 0x0, + 0x36, 0x66, 0x67, 0xc0, 0xdf, 0xed, 0xb0, 0x0, + 0x0, 0x1c, 0x0, 0xd1, 0x1b, 0x0, 0x0, 0x1, + 0xc0, 0xd, 0x4, 0x90, 0x0, 0x0, 0x1c, 0x4, + 0x90, 0x76, 0x2e, 0xee, 0xee, 0xc0, 0x98, 0xc, + 0x20, 0x0, 0x0, 0x1c, 0x1, 0xca, 0xd0, 0x0, + 0x0, 0x1, 0xc0, 0x0, 0xcd, 0x10, 0x0, 0x0, + 0x1c, 0x0, 0x5c, 0x7c, 0x0, 0x0, 0x1, 0xc0, + 0x5e, 0x20, 0x28, 0xdd, 0xdd, 0xec, 0x1b, 0x10, + 0x0, 0x0, 0x0, 0x1, 0xc0, + + /* U+59B3 "妳" */ + 0x0, 0x82, 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x2f, 0x88, 0x88, 0x80, 0x8e, 0xfd, 0xe2, + 0x98, 0x5e, 0x55, 0xe0, 0x5, 0x80, 0xc3, 0xd0, + 0xe, 0x5, 0x90, 0x9, 0x40, 0xd2, 0x42, 0xe, + 0x6, 0x20, 0xc, 0x1, 0xc0, 0xd, 0xe, 0xd, + 0x0, 0x2d, 0x5, 0x80, 0x2b, 0xe, 0x8, 0x60, + 0x8, 0xcb, 0x40, 0x77, 0xe, 0x2, 0xb0, 0x0, + 0x7f, 0x10, 0xd1, 0xe, 0x0, 0xd0, 0x0, 0xbb, + 0xd0, 0x20, 0xe, 0x0, 0x40, 0x9, 0xb0, 0x40, + 0x0, 0xe, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x8, + 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+59B9 "妹" */ + 0x0, 0x84, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xa2, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x66, 0x7e, 0x66, 0x60, 0x3d, 0xfd, 0xe4, + 0x77, 0x8e, 0x77, 0x70, 0x3, 0xa0, 0xb2, 0x0, + 0xd, 0x0, 0x0, 0x6, 0x70, 0xd0, 0x0, 0xd, + 0x0, 0x0, 0xa, 0x30, 0xe6, 0xdd, 0xef, 0xed, + 0xd5, 0xe, 0x14, 0xa0, 0x0, 0xbf, 0x90, 0x0, + 0x5, 0xdb, 0x50, 0x4, 0xbe, 0xb2, 0x0, 0x0, + 0x3f, 0x70, 0xc, 0x2d, 0x2c, 0x0, 0x0, 0xa8, + 0xd3, 0xb6, 0xd, 0x7, 0xa0, 0x8, 0xc0, 0x9, + 0x70, 0xd, 0x0, 0x84, 0x4a, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, + + /* U+59BB "妻" */ + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0xb, + 0xcc, 0xcc, 0xed, 0xcc, 0xcc, 0xa0, 0x0, 0x0, + 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x9b, 0xbb, + 0xed, 0xbb, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x86, + 0x0, 0x4a, 0x0, 0x3c, 0xcc, 0xcc, 0xed, 0xcc, + 0xde, 0xc3, 0x0, 0x45, 0x55, 0xb9, 0x55, 0x8a, + 0x0, 0x0, 0x44, 0x4a, 0xb4, 0x44, 0x43, 0x0, + 0x2c, 0xcc, 0xcf, 0xdc, 0xcc, 0xcc, 0xc2, 0x0, + 0x1, 0xd2, 0x0, 0xc, 0x40, 0x0, 0x0, 0x8, + 0xd9, 0x53, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xfd, 0xe9, 0x40, 0x0, 0x1c, 0xcc, 0xb7, 0x20, + 0x4, 0x9d, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+59C9 "姉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x2, 0xb0, 0x4, + 0xbb, 0xbf, 0xbb, 0xb3, 0x8e, 0xfd, 0xe3, 0x33, + 0x4e, 0x33, 0x31, 0x7, 0x60, 0xd0, 0x0, 0xd, + 0x0, 0x0, 0xa, 0x30, 0xd1, 0xee, 0xef, 0xee, + 0xc0, 0xd, 0x2, 0xb1, 0xd0, 0xd, 0x0, 0xe0, + 0x1d, 0x6, 0x71, 0xd0, 0xd, 0x0, 0xe0, 0x7, + 0xbc, 0x21, 0xd0, 0xd, 0x0, 0xe0, 0x0, 0x7f, + 0x11, 0xd0, 0xd, 0x0, 0xe0, 0x0, 0xc8, 0xd3, + 0xd0, 0xd, 0x3d, 0xb0, 0xa, 0x90, 0x40, 0x10, + 0xd, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+59CB "始" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb2, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0xd0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0xd0, 0x0, + 0xc, 0x40, 0x80, 0x0, 0x8e, 0xfd, 0xe2, 0x6a, + 0x0, 0x5a, 0x0, 0x6, 0x70, 0xc2, 0xe4, 0x34, + 0x5e, 0x40, 0x9, 0x30, 0xd8, 0xdc, 0xa9, 0x87, + 0xc0, 0xc, 0x1, 0xc0, 0x0, 0x0, 0x0, 0x30, + 0x2e, 0x16, 0x70, 0xac, 0xcc, 0xcc, 0x20, 0x7, + 0xed, 0x30, 0xd1, 0x11, 0x1b, 0x30, 0x0, 0x5f, + 0x30, 0xd0, 0x0, 0xa, 0x30, 0x0, 0xb9, 0xe1, + 0xd0, 0x0, 0xa, 0x30, 0x7, 0xa0, 0x63, 0xd2, + 0x22, 0x2b, 0x30, 0x58, 0x0, 0x0, 0xda, 0xaa, + 0xae, 0x30, + + /* U+59D0 "姐" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, + 0x0, 0xde, 0xee, 0xef, 0x10, 0x0, 0xc1, 0x0, + 0xd0, 0x0, 0xd, 0x10, 0x3d, 0xfd, 0xe3, 0xd0, + 0x0, 0xd, 0x10, 0x2, 0xb0, 0xb1, 0xdb, 0xbb, + 0xbf, 0x10, 0x5, 0x80, 0xd0, 0xd2, 0x22, 0x2e, + 0x10, 0x8, 0x50, 0xd0, 0xd0, 0x0, 0xd, 0x10, + 0xc, 0x23, 0xa0, 0xd0, 0x0, 0xd, 0x10, 0x9, + 0xb8, 0x60, 0xde, 0xdd, 0xdf, 0x10, 0x0, 0x7f, + 0x30, 0xd0, 0x0, 0xd, 0x10, 0x0, 0x6e, 0xc0, + 0xd0, 0x0, 0xd, 0x10, 0x2, 0xe1, 0x71, 0xd0, + 0x0, 0xd, 0x10, 0x1e, 0x40, 0x3d, 0xdd, 0xdd, + 0xdd, 0xd4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+59D4 "委" */ + 0x0, 0x0, 0x12, 0x34, 0x68, 0xb7, 0x0, 0x1, + 0xcb, 0xa9, 0xbb, 0x54, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0xd, 0xdd, 0xdd, + 0xee, 0xdd, 0xdd, 0xd5, 0x0, 0x0, 0x5c, 0x89, + 0xa8, 0x0, 0x0, 0x0, 0x2a, 0xa0, 0x68, 0x7, + 0xd6, 0x0, 0x1c, 0xb4, 0x2, 0xa7, 0x0, 0x18, + 0xe5, 0x2, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x1d, 0xdd, 0xfe, 0xdd, 0xde, 0xed, 0xd7, 0x0, + 0x5, 0xc0, 0x0, 0x1e, 0x20, 0x0, 0x0, 0xb, + 0xda, 0x64, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x18, + 0xfd, 0xdb, 0x62, 0x0, 0x9, 0xcd, 0xc8, 0x20, + 0x2, 0x7c, 0xc1, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5A18 "娘" */ + 0x0, 0x43, 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0xc1, + 0x0, 0xed, 0xdd, 0xdf, 0x30, 0x2b, 0xfb, 0xb0, + 0xe0, 0x0, 0xb, 0x30, 0x2, 0xa0, 0xd0, 0xec, + 0xcc, 0xcf, 0x30, 0x6, 0x70, 0xd0, 0xe0, 0x0, + 0xb, 0x30, 0xa, 0x42, 0xb0, 0xe0, 0x0, 0xb, + 0x30, 0xe, 0x6, 0x80, 0xec, 0xee, 0xcc, 0x20, + 0xb, 0x7a, 0x30, 0xe0, 0x3a, 0x3, 0x70, 0x0, + 0xaf, 0x0, 0xe0, 0xd, 0x8c, 0x20, 0x0, 0x8e, + 0x70, 0xe0, 0x3, 0xe1, 0x0, 0x4, 0xd1, 0xb1, + 0xf3, 0x83, 0x7c, 0x20, 0x3d, 0x20, 0x3, 0xfa, + 0x40, 0x5, 0xd0, 0x1, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+5A5A "婚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x1, 0x36, 0x9e, 0x30, 0x0, 0xa4, + 0x0, 0xcb, 0x9d, 0x62, 0x0, 0x0, 0xc1, 0x0, + 0xc1, 0x9, 0x30, 0x0, 0x2d, 0xfe, 0xe3, 0xcc, + 0xcd, 0xdc, 0xc3, 0x2, 0xb0, 0xa2, 0xc1, 0x1, + 0xc0, 0x0, 0x6, 0x70, 0xd1, 0xd6, 0x83, 0x96, + 0x45, 0x9, 0x30, 0xe3, 0xb7, 0x40, 0xa, 0xd2, + 0xe, 0x44, 0xa0, 0x6a, 0xaa, 0xaa, 0x20, 0x7, + 0xfc, 0x60, 0x95, 0x11, 0x1b, 0x30, 0x0, 0x4f, + 0x60, 0x95, 0x22, 0x2b, 0x30, 0x0, 0x7b, 0xe4, + 0x9b, 0x99, 0x9e, 0x30, 0x4, 0xd0, 0x34, 0x94, + 0x0, 0xb, 0x30, 0x2b, 0x10, 0x0, 0x9c, 0xbb, + 0xbe, 0x30, + + /* U+5A66 "婦" */ + 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0xab, 0xbb, 0xbe, 0x30, 0x0, 0xd0, + 0x0, 0x8b, 0xbb, 0xbe, 0x30, 0x4f, 0xff, 0xe0, + 0x0, 0x0, 0xb, 0x30, 0x3, 0x90, 0xc0, 0xbb, + 0xbb, 0xbd, 0x30, 0x6, 0x61, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x33, 0xa8, 0xba, 0xaf, 0xaa, + 0xe1, 0xd, 0x7, 0x68, 0x30, 0xe, 0x0, 0xb1, + 0xa, 0x8b, 0x20, 0xec, 0xcf, 0xce, 0x60, 0x0, + 0x8f, 0x0, 0xd0, 0xe, 0x7, 0x60, 0x0, 0xba, + 0xb0, 0xd0, 0xe, 0x7, 0x60, 0x8, 0xa0, 0x72, + 0xd0, 0xe, 0x5d, 0x30, 0x39, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, + + /* U+5A92 "媒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa2, 0x0, 0x1c, 0x0, 0xe, 0x0, 0x0, 0xc1, + 0x0, 0x1c, 0x0, 0xe, 0x0, 0x0, 0xd0, 0x7, + 0xdf, 0xdd, 0xdf, 0xd3, 0x2b, 0xfb, 0xb0, 0x1c, + 0x0, 0xe, 0x0, 0x4, 0xa1, 0xd0, 0x1f, 0xbb, + 0xbe, 0x0, 0x7, 0x60, 0xd0, 0x1c, 0x0, 0xe, + 0x0, 0xa, 0x32, 0xb0, 0x1d, 0xce, 0xcd, 0x0, + 0xd, 0x6, 0x70, 0x0, 0xe, 0x0, 0x0, 0xa, + 0xab, 0x36, 0xdd, 0xdf, 0xdd, 0xd2, 0x0, 0x8f, + 0x10, 0x1, 0xcf, 0xb0, 0x0, 0x0, 0xbb, 0xc0, + 0x1c, 0x3e, 0x5b, 0x0, 0x8, 0xb0, 0x57, 0xd4, + 0xe, 0x6, 0xd3, 0x39, 0x0, 0x6, 0x10, 0xe, + 0x0, 0x41, + + /* U+5ABD "媽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, + 0x2, 0xed, 0xdf, 0xdd, 0xc0, 0x0, 0xd0, 0x2, + 0x90, 0xe, 0x0, 0x0, 0x3e, 0xfd, 0xd4, 0xec, + 0xcf, 0xcc, 0x70, 0x5, 0x80, 0xc3, 0x90, 0xe, + 0x0, 0x0, 0x8, 0x40, 0xd2, 0xec, 0xcf, 0xcc, + 0x70, 0xc, 0x11, 0xc2, 0x90, 0xe, 0x0, 0x0, + 0xe, 0x16, 0x82, 0xec, 0xcf, 0xcc, 0xc1, 0x6, + 0xdc, 0x30, 0x10, 0x1, 0x40, 0xd0, 0x0, 0x6f, + 0x14, 0x69, 0x19, 0x64, 0xd0, 0x0, 0xba, 0xc8, + 0x3b, 0xb, 0x4, 0xd0, 0x8, 0xb0, 0x3c, 0x9, + 0x2, 0x2, 0xc0, 0x4a, 0x0, 0x1, 0x0, 0x0, + 0xcd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5ACC "嫌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb1, 0x0, 0x92, 0x0, 0x78, 0x0, 0x0, 0xd0, + 0x0, 0x3b, 0x3, 0xd1, 0x0, 0x0, 0xd0, 0x7, + 0xac, 0xae, 0xca, 0xa3, 0x3e, 0xfe, 0xb1, 0x1d, + 0x1c, 0x31, 0x10, 0x4, 0x81, 0xa4, 0xcf, 0xcf, + 0xcc, 0x80, 0x8, 0x43, 0x80, 0xd, 0xb, 0x10, + 0xb0, 0xb, 0x16, 0x6b, 0xcf, 0xcf, 0xcc, 0xf6, + 0xd, 0x9, 0x20, 0xd, 0xb, 0x10, 0xb0, 0xa, + 0x9c, 0x5, 0xbf, 0xbe, 0xcc, 0xb0, 0x0, 0x9d, + 0x0, 0x7f, 0xb, 0xd1, 0x0, 0x0, 0xc9, 0xb3, + 0xbd, 0xb, 0x6c, 0x0, 0x9, 0x80, 0x8d, 0x2d, + 0xb, 0x16, 0xd2, 0x48, 0x0, 0x33, 0xd, 0xb, + 0x10, 0x32, + + /* U+5B09 "嬉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0xc1, + 0xa, 0xbb, 0xbf, 0xbb, 0xb6, 0x0, 0xd0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x3d, 0xfd, 0xe4, 0xaa, + 0xaa, 0xaa, 0xa1, 0x3, 0x90, 0xc0, 0xaa, 0xaa, + 0xaa, 0x70, 0x6, 0x61, 0xb0, 0xe0, 0x0, 0x3, + 0xb0, 0x9, 0x33, 0xa0, 0xea, 0xaa, 0xab, 0xa0, + 0xd, 0x6, 0x70, 0x1b, 0x0, 0x2b, 0x0, 0xb, + 0x8a, 0x58, 0x8e, 0x98, 0xbb, 0x87, 0x0, 0xaf, + 0x13, 0x33, 0x33, 0x33, 0x33, 0x0, 0x8e, 0x80, + 0xfb, 0xbb, 0xbb, 0xe0, 0x3, 0xc1, 0xb1, 0xe0, + 0x0, 0x0, 0xe0, 0x1b, 0x10, 0x0, 0xfb, 0xbb, + 0xbb, 0xd0, + + /* U+5B50 "子" */ + 0x0, 0x9e, 0xee, 0xee, 0xee, 0xee, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xab, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x0, 0xb, 0xbb, 0xbb, 0xce, 0xbb, + 0xbb, 0xb5, 0x3, 0x33, 0x33, 0x6c, 0x33, 0x33, + 0x31, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0x0, 0x0, 0x0, 0x0, 0x0, 0xde, + 0xe6, 0x0, 0x0, 0x0, + + /* U+5B57 "字" */ + 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x80, 0x0, 0x0, 0xd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xde, 0xd0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xa, 0x1a, 0xee, 0xee, 0xee, 0x81, + 0xa0, 0x0, 0x0, 0x0, 0x7, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x90, 0x0, 0x0, 0xe, 0xee, 0xee, 0xff, + 0xee, 0xee, 0xe0, 0x0, 0x0, 0x7, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x9e, 0xe4, 0x0, 0x0, 0x0, + + /* U+5B58 "存" */ + 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x1e, 0xee, + 0xef, 0xee, 0xee, 0xee, 0xe1, 0x0, 0x0, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa0, 0x11, + 0x11, 0x12, 0x0, 0x0, 0x2e, 0x11, 0xbb, 0xbb, + 0xdf, 0x30, 0x2, 0xea, 0x0, 0x0, 0x7, 0xb2, + 0x0, 0x2e, 0xb9, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x24, 0x49, 0x4e, 0xee, 0xef, 0xee, 0xe5, 0x0, + 0x49, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x49, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x49, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0x49, 0x0, 0x8d, + 0xe5, 0x0, 0x0, + + /* U+5B63 "季" */ + 0x0, 0x0, 0x12, 0x35, 0x79, 0xc4, 0x0, 0x1, + 0xcb, 0xba, 0xcb, 0x53, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x0, 0x0, 0x0, 0x2d, 0xdd, 0xdd, + 0xee, 0xdd, 0xdd, 0xd2, 0x0, 0x0, 0x4c, 0xa9, + 0xd4, 0x0, 0x0, 0x0, 0x7, 0xc1, 0x76, 0x2c, + 0x70, 0x0, 0x6, 0xd8, 0x0, 0x44, 0x0, 0x7d, + 0x70, 0x28, 0x1a, 0xcc, 0xcc, 0xef, 0x51, 0x81, + 0x0, 0x0, 0x0, 0x3a, 0x71, 0x0, 0x0, 0x2d, + 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0xd2, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9c, 0xd4, + 0x0, 0x0, 0x0, + + /* U+5B66 "学" */ + 0x0, 0x20, 0x0, 0x70, 0x0, 0x4, 0x0, 0x0, + 0x6b, 0x0, 0x87, 0x0, 0x89, 0x0, 0x2, 0x2c, + 0x52, 0x4c, 0x24, 0xe3, 0x20, 0xd, 0xba, 0xaa, + 0xaa, 0xaa, 0xaa, 0xf0, 0xd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x7, 0xa, 0xdd, 0xdd, 0xdf, + 0xa0, 0x80, 0x0, 0x0, 0x0, 0x6, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7a, 0x10, 0x0, 0x0, + 0x2e, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe3, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdd, 0xd3, + 0x0, 0x0, 0x0, + + /* U+5B69 "孩" */ + 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0xc, + 0xdd, 0xd9, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, + 0xb4, 0xdd, 0xde, 0xed, 0xd8, 0x0, 0x4, 0x90, + 0x0, 0xa4, 0x0, 0x0, 0x0, 0xd, 0x10, 0x4, + 0xb0, 0x9, 0x0, 0x0, 0xe, 0x0, 0x3d, 0x65, + 0xa7, 0x0, 0x0, 0xe, 0x46, 0x79, 0x8d, 0xa0, + 0x10, 0x5, 0xaf, 0xa4, 0x0, 0x9b, 0x4, 0xc0, + 0x1a, 0x5e, 0x0, 0x3c, 0x80, 0x1d, 0x20, 0x0, + 0xe, 0x0, 0xb3, 0x2, 0xd4, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x5d, 0xba, 0x0, 0x0, 0xe, 0x0, + 0x4b, 0xb1, 0x8, 0xb0, 0xa, 0xd9, 0x8, 0xb4, + 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5B6B "孫" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x47, 0x90, 0x8, + 0xcc, 0xd6, 0x9c, 0xdd, 0x85, 0x10, 0x0, 0x0, + 0xd1, 0x0, 0xa5, 0x1, 0x0, 0x0, 0x7, 0x70, + 0x8, 0x60, 0x5c, 0x0, 0x0, 0x1c, 0x0, 0xae, + 0xab, 0xc0, 0x0, 0x0, 0x2b, 0x0, 0x43, 0x8b, + 0x7, 0x10, 0x0, 0x2c, 0x66, 0x9, 0x90, 0x5, + 0xa0, 0x5, 0xbe, 0x72, 0xdf, 0xce, 0xba, 0xc4, + 0x9, 0x5b, 0x0, 0x32, 0xd, 0x3, 0x23, 0x0, + 0x2b, 0x0, 0x68, 0xd, 0x8, 0x70, 0x0, 0x2b, + 0x1, 0xd1, 0xd, 0x0, 0xc2, 0x0, 0x2b, 0xc, + 0x50, 0xd, 0x0, 0x4a, 0x5, 0xc8, 0x2, 0x3, + 0xcb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5B78 "學" */ + 0x0, 0x1, 0x40, 0x3, 0x10, 0x0, 0x0, 0x0, + 0xc8, 0x52, 0xcc, 0xa, 0xae, 0x40, 0x0, 0xea, + 0xa6, 0x55, 0x4a, 0xae, 0x30, 0x0, 0xd3, 0x33, + 0xab, 0x13, 0x3d, 0x10, 0x0, 0xc7, 0x67, 0xaa, + 0x46, 0x6f, 0x0, 0x9, 0xec, 0xbc, 0xbb, 0xcb, + 0xbf, 0xb1, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd1, 0x9, 0x7, 0xbb, 0xbb, 0xcf, 0x70, 0xa1, + 0x0, 0x0, 0x0, 0x19, 0x93, 0x0, 0x0, 0xb, + 0xbb, 0xbb, 0xce, 0xbb, 0xbb, 0xb4, 0x1, 0x11, + 0x11, 0x69, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xd5, + 0x0, 0x0, 0x0, + + /* U+5B83 "它" */ + 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x90, 0x0, 0x0, 0xce, 0xee, 0xee, 0xfe, + 0xee, 0xec, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x30, 0x0, 0x0, 0x0, 0x1d, 0x0, 0xe1, + 0x0, 0x0, 0x13, 0x0, 0x0, 0xe1, 0x0, 0x4a, + 0xe8, 0x0, 0x0, 0xe5, 0x9e, 0xb5, 0x0, 0x0, + 0x0, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x59, 0x0, 0xd3, 0x0, 0x0, 0x0, 0xa6, + 0x0, 0x6e, 0xee, 0xee, 0xee, 0xb1, + + /* U+5B85 "宅" */ + 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, 0xd, 0xed, + 0xdd, 0xdd, 0xdd, 0xde, 0xe0, 0xd, 0x10, 0x0, + 0x0, 0x3, 0x1, 0xe0, 0xc, 0x10, 0x3, 0x6a, + 0xec, 0x41, 0xc0, 0x0, 0xad, 0xdb, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xe4, 0x57, 0x9b, 0xd1, + 0x29, 0xbc, 0xed, 0xfa, 0x86, 0x42, 0x0, 0x15, + 0x31, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, + 0xf0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0xaf, + 0xee, 0xee, 0x60, + + /* U+5B87 "宇" */ + 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x0, 0xfd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdf, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0xe1, 0xdd, 0xdd, 0xdd, 0xdd, 0xf, + 0x0, 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x80, 0x0, 0x0, 0x3, 0x33, 0x33, + 0x8a, 0x33, 0x33, 0x30, 0xaa, 0xaa, 0xad, 0xda, + 0xaa, 0xaa, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xee, 0x40, 0x0, 0x0, 0x0, + + /* U+5B88 "守" */ + 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0xd, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xc0, 0xd, 0x10, 0x0, + 0x0, 0x12, 0x3, 0xc0, 0xa, 0x10, 0x0, 0x0, + 0x68, 0x2, 0x90, 0x0, 0x0, 0x0, 0x0, 0x69, + 0x0, 0x0, 0x2d, 0xdd, 0xdd, 0xdd, 0xef, 0xdd, + 0xd2, 0x0, 0x2, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x1d, 0x30, 0x0, 0x68, 0x0, 0x0, 0x0, + 0x2, 0xd1, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, + 0x65, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0xde, + 0xd4, 0x0, 0x0, + + /* U+5B89 "安" */ + 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb6, 0x0, 0x0, 0x0, 0xae, 0xee, 0xee, + 0xee, 0xee, 0xea, 0xa, 0x40, 0x1, 0x50, 0x0, + 0x4, 0xa0, 0x83, 0x0, 0x89, 0x0, 0x0, 0x38, + 0x0, 0x0, 0x1e, 0x20, 0x0, 0x0, 0x0, 0xdd, + 0xdf, 0xed, 0xdd, 0xfe, 0xdd, 0x0, 0x3, 0xe0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0xd8, 0x0, 0xa, + 0x80, 0x0, 0x0, 0x5, 0xbd, 0x88, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xfc, 0x40, 0x0, 0x0, + 0x2, 0x8e, 0x60, 0x5d, 0xd4, 0x0, 0x6e, 0xc7, + 0x10, 0x0, 0x5, 0xe6, 0x1, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5B8C "完" */ + 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x98, 0x0, 0x0, 0x0, 0xd, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xc0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0x2, 0xc0, 0xd, 0x1b, 0xdd, 0xdd, + 0xdd, 0xa2, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xee, 0xef, 0xee, 0xfe, 0xee, 0xe2, + 0x0, 0x0, 0x77, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0xa5, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x1, + 0xe0, 0x0, 0xd1, 0x0, 0x53, 0x0, 0x2d, 0x60, + 0x0, 0xd1, 0x0, 0x94, 0x2c, 0xc4, 0x0, 0x0, + 0x9e, 0xde, 0xd0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5B98 "官" */ + 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, 0x22, 0x22, + 0x27, 0xb2, 0x22, 0x22, 0xec, 0xbb, 0xbb, 0xbb, + 0xbb, 0xce, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1e, + 0x42, 0xfd, 0xdd, 0xdd, 0xdf, 0x14, 0x2, 0xc0, + 0x0, 0x0, 0xd, 0x10, 0x2, 0xfb, 0xbb, 0xbb, + 0xbf, 0x10, 0x2, 0xd1, 0x11, 0x11, 0x11, 0x0, + 0x2, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfd, + 0xdd, 0xdd, 0xde, 0x90, 0x2, 0xc0, 0x0, 0x0, + 0x5, 0x90, 0x2, 0xd3, 0x33, 0x33, 0x38, 0x90, + 0x2, 0xea, 0xaa, 0xaa, 0xac, 0x80, + + /* U+5B99 "宙" */ + 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x40, 0x0, 0x0, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xed, 0xe0, 0x0, 0xb, 0x10, 0x0, 0x1d, + 0xc0, 0x0, 0xd, 0x10, 0x0, 0x1b, 0x9, 0xbb, + 0xbf, 0xbb, 0xbb, 0x90, 0xc, 0x32, 0x2d, 0x42, + 0x24, 0xd0, 0xc, 0x0, 0xd, 0x10, 0x1, 0xd0, + 0xc, 0xcb, 0xbf, 0xcb, 0xbc, 0xd0, 0xc, 0x10, + 0xd, 0x20, 0x2, 0xd0, 0xc, 0x0, 0xd, 0x10, + 0x1, 0xd0, 0xc, 0xbb, 0xbf, 0xbb, 0xbb, 0xd0, + 0xc, 0x32, 0x22, 0x22, 0x24, 0xd0, + + /* U+5B9A "定" */ + 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0xd, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xd0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0xd, 0x13, 0x33, 0x33, + 0x33, 0x21, 0xd0, 0x0, 0x1b, 0xbb, 0xec, 0xbb, + 0xa0, 0x0, 0x0, 0x1, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0x0, 0xbe, 0xee, 0xe6, 0x0, 0x0, + 0x9f, 0x10, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xd6, + 0xb0, 0xb3, 0x0, 0x0, 0x0, 0x7, 0x90, 0x7d, + 0xd4, 0x0, 0x0, 0x0, 0x3d, 0x0, 0x2, 0x9d, + 0xef, 0xee, 0xf4, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5B9E "实" */ + 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0x0, 0xae, 0xdd, 0xdd, + 0xdd, 0xdd, 0xeb, 0xa, 0x33, 0x30, 0xa, 0x0, + 0x3, 0xb0, 0x82, 0x2c, 0x50, 0xf0, 0x0, 0x28, + 0x0, 0x10, 0x18, 0xe, 0x0, 0x0, 0x0, 0x9, + 0xb1, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x4, 0x60, + 0x5a, 0x0, 0x0, 0x0, 0xbb, 0xbb, 0xbd, 0xeb, + 0xbb, 0xbb, 0x0, 0x0, 0x4, 0xe2, 0x51, 0x0, + 0x0, 0x0, 0x4, 0xd4, 0x1a, 0xd6, 0x0, 0x1, + 0x5b, 0xc3, 0x0, 0x1, 0x9d, 0x40, 0x79, 0x40, + 0x0, 0x0, 0x0, 0x38, 0x0, + + /* U+5B9F "実" */ + 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x89, 0x11, 0x11, 0x10, 0xe, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbc, 0xd0, 0xe, 0x0, 0x0, + 0x75, 0x0, 0x1, 0xd0, 0x7, 0x9c, 0xcc, 0xee, + 0xcc, 0xcb, 0x70, 0x0, 0x0, 0x0, 0x86, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0xcc, 0xee, 0xcc, 0xc7, + 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, + 0x1a, 0xaa, 0xaa, 0xeb, 0xaa, 0xaa, 0xa2, 0x2, + 0x22, 0x2a, 0x9b, 0x72, 0x22, 0x20, 0x0, 0x0, + 0x9b, 0x1, 0xd5, 0x0, 0x0, 0x2, 0x7d, 0x70, + 0x0, 0x1b, 0xc5, 0x10, 0xb, 0x61, 0x0, 0x0, + 0x0, 0x39, 0xc1, + + /* U+5BA2 "客" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x9, 0xaa, + 0xaa, 0xce, 0xaa, 0xaa, 0x90, 0xe, 0x33, 0x37, + 0x33, 0x33, 0x34, 0xd0, 0xd, 0x0, 0x8c, 0x0, + 0x0, 0x1, 0xc0, 0x0, 0x6, 0xfb, 0xbb, 0xbf, + 0x60, 0x0, 0x1, 0xbb, 0xc8, 0x0, 0x99, 0x0, + 0x0, 0x5, 0x60, 0xa, 0xcc, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xcc, 0xb5, 0x0, 0x0, 0x15, + 0x9d, 0x92, 0x0, 0x39, 0xec, 0x82, 0x29, 0x5e, + 0xcc, 0xcc, 0xcd, 0xe3, 0x60, 0x0, 0xe, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x1, 0xd0, 0x0, 0x0, 0xe, 0xcc, 0xcc, 0xcd, + 0xd0, 0x0, + + /* U+5BA4 "室" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0xa, 0xaa, + 0xaa, 0xce, 0xaa, 0xaa, 0xa0, 0xe, 0x22, 0x22, + 0x22, 0x22, 0x22, 0xf0, 0xa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb0, 0x0, 0x6b, 0xbf, 0xdb, 0xbb, + 0xb7, 0x0, 0x0, 0x0, 0x7a, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0x9, 0xa2, 0x34, 0x5c, 0xc1, 0x0, + 0x0, 0x7d, 0xba, 0xa9, 0x65, 0x6a, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0xcd, + 0xdd, 0xee, 0xdd, 0xdc, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x2d, 0xdd, 0xdd, 0xee, 0xdd, + 0xdd, 0xd2, + + /* U+5BB3 "害" */ + 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x1, + 0x22, 0x22, 0x99, 0x22, 0x22, 0x10, 0xc, 0xcb, + 0xbb, 0xdd, 0xbb, 0xbb, 0xd0, 0xc, 0x20, 0x0, + 0x88, 0x0, 0x2, 0xd0, 0x3, 0x39, 0x99, 0xcc, + 0x99, 0x93, 0x30, 0x0, 0x8a, 0xaa, 0xdd, 0xaa, + 0xa9, 0x0, 0x0, 0x1, 0x11, 0x88, 0x11, 0x11, + 0x0, 0xc, 0xcc, 0xcc, 0xee, 0xcc, 0xcc, 0xc0, + 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0xcc, 0xdd, 0xcc, 0xd6, 0x0, 0x0, 0x49, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x49, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x4e, 0xcc, 0xcc, + 0xcc, 0xd7, 0x0, + + /* U+5BB5 "宵" */ + 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x23, 0x33, + 0x3c, 0x73, 0x33, 0x31, 0xea, 0xaa, 0xad, 0xba, + 0xaa, 0xc8, 0xe0, 0x90, 0xc, 0x10, 0x74, 0x68, + 0x50, 0x58, 0xc, 0x13, 0xc0, 0x23, 0x3, 0x7b, + 0x7e, 0x8b, 0x97, 0x0, 0x6, 0x93, 0x33, 0x33, + 0x3e, 0x10, 0x6, 0xdb, 0xbb, 0xbb, 0xbf, 0x10, + 0x6, 0x80, 0x0, 0x0, 0xd, 0x10, 0x6, 0xda, + 0xaa, 0xaa, 0xaf, 0x10, 0x6, 0x81, 0x11, 0x11, + 0x1d, 0x10, 0x6, 0x70, 0x0, 0x0, 0xd, 0x10, + 0x6, 0x70, 0x0, 0xb, 0xcc, 0x0, + + /* U+5BB6 "家" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x9, 0xaa, + 0xaa, 0xed, 0xaa, 0xaa, 0x90, 0xe, 0x22, 0x22, + 0x22, 0x22, 0x24, 0xe0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x2, 0x2c, 0xcd, 0xfd, 0xcc, + 0xc1, 0x20, 0x0, 0x0, 0x5d, 0xa0, 0x0, 0x24, + 0x0, 0x4, 0x9b, 0x71, 0xc3, 0x5, 0xd4, 0x0, + 0x6, 0x30, 0x19, 0xac, 0xad, 0x10, 0x0, 0x0, + 0x5a, 0xa2, 0x1e, 0x5c, 0x10, 0x0, 0x9, 0x82, + 0x5, 0xcc, 0x44, 0xa0, 0x0, 0x0, 0x16, 0xc8, + 0xa, 0x50, 0xa9, 0x0, 0xb, 0xd7, 0x10, 0x1e, + 0x20, 0x9, 0xd2, 0x3, 0x0, 0x3d, 0xe7, 0x0, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5BB9 "容" */ + 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x2, + 0x33, 0x33, 0xa9, 0x33, 0x33, 0x20, 0xe, 0xaa, + 0xaa, 0xaa, 0xaa, 0xab, 0xd0, 0xe, 0x0, 0x62, + 0x0, 0x43, 0x1, 0xd0, 0x3, 0xa, 0x90, 0x22, + 0x1b, 0x91, 0x30, 0x4, 0xd7, 0x1, 0xdc, 0x10, + 0x6d, 0x30, 0x4, 0x20, 0x2c, 0x35, 0xd3, 0x3, + 0x20, 0x0, 0x18, 0xb1, 0x0, 0x2c, 0x81, 0x0, + 0x18, 0xef, 0xcc, 0xcc, 0xcc, 0xfe, 0xa2, 0x39, + 0x1e, 0x0, 0x0, 0x1, 0xd0, 0x71, 0x0, 0xe, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0xf, 0xcc, 0xcc, + 0xcd, 0xd0, 0x0, + + /* U+5BBF "宿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xa, 0xaa, 0xaa, + 0xed, 0xaa, 0xaa, 0x80, 0xe2, 0x22, 0x22, 0x22, + 0x22, 0x5b, 0x8, 0xa, 0x40, 0x0, 0x0, 0x1, + 0x40, 0x3, 0xd4, 0xdd, 0xdf, 0xed, 0xdc, 0x0, + 0xb7, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x8f, 0x50, + 0x9d, 0xdf, 0xdd, 0xd2, 0x5d, 0x95, 0xb, 0x20, + 0x0, 0xc, 0x22, 0x28, 0x50, 0xb3, 0x0, 0x0, + 0xc2, 0x0, 0x85, 0xb, 0xcc, 0xcc, 0xcf, 0x20, + 0x8, 0x50, 0xb2, 0x0, 0x0, 0xc2, 0x0, 0x85, + 0xb, 0xdc, 0xcc, 0xcf, 0x20, 0x8, 0x50, 0xb3, + 0x0, 0x0, 0xb2, + + /* U+5BC4 "寄" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0xc, 0xcc, + 0xcc, 0xde, 0xcc, 0xcc, 0xc0, 0xe, 0x0, 0x0, + 0x45, 0x0, 0x0, 0xe0, 0xb, 0x5c, 0xcc, 0xee, + 0xcc, 0xc5, 0xc0, 0x0, 0x0, 0x4, 0xf9, 0x30, + 0x0, 0x0, 0x0, 0x25, 0xab, 0x13, 0x8d, 0x81, + 0x0, 0x16, 0xdd, 0x96, 0x66, 0x67, 0xc9, 0x61, + 0x16, 0x66, 0x66, 0x66, 0x66, 0xd8, 0x61, 0x0, + 0x4a, 0xaa, 0xaa, 0x10, 0xb2, 0x0, 0x0, 0x77, + 0x11, 0x1b, 0x20, 0xb2, 0x0, 0x0, 0x76, 0x0, + 0xb, 0x20, 0xb2, 0x0, 0x0, 0x7d, 0xcc, 0xcc, + 0x10, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xad, + 0xd0, 0x0, + + /* U+5BC6 "密" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0xa, 0xbb, + 0xbb, 0xec, 0xbb, 0xbb, 0xb0, 0xe, 0x11, 0x28, + 0x21, 0x12, 0x11, 0xe0, 0xe, 0x0, 0x25, 0xd3, + 0x2d, 0x30, 0xe0, 0x0, 0x91, 0xd0, 0x16, 0xd4, + 0x56, 0x0, 0x4, 0xb0, 0xd0, 0x8d, 0x30, 0x4c, + 0x60, 0x1d, 0x10, 0xee, 0x80, 0x3, 0xb1, 0xd2, + 0x6, 0xad, 0xbe, 0xcc, 0xce, 0x50, 0x20, 0x18, + 0x30, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, 0x91, + 0x0, 0xb3, 0x0, 0xd, 0x0, 0x0, 0xb2, 0x0, + 0xb3, 0x0, 0xe, 0x0, 0x0, 0xbb, 0xaa, 0xeb, + 0xaa, 0xae, 0x0, 0x0, 0x23, 0x33, 0x33, 0x33, + 0x3e, 0x0, + + /* U+5BCC "富" */ + 0x0, 0x0, 0x1b, 0x0, 0x0, 0x0, 0x89, 0x99, + 0x9e, 0xb9, 0x99, 0x97, 0xe3, 0x33, 0x33, 0x33, + 0x33, 0x4d, 0xe1, 0xaa, 0xaa, 0xaa, 0xaa, 0x1d, + 0x0, 0x11, 0x11, 0x11, 0x11, 0x0, 0x0, 0xf9, + 0x99, 0x99, 0x9e, 0x0, 0x0, 0xe5, 0x55, 0x55, + 0x5e, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x0, + 0xd, 0xbb, 0xbe, 0xcb, 0xbb, 0xe0, 0xe, 0x0, + 0xc, 0x10, 0x0, 0xe0, 0xe, 0xaa, 0xaf, 0xba, + 0xaa, 0xf0, 0xe, 0x0, 0xc, 0x10, 0x0, 0xe0, + 0xe, 0xbb, 0xbb, 0xbb, 0xbb, 0xe0, + + /* U+5BD2 "寒" */ + 0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0xb, + 0xcc, 0xcc, 0xef, 0xcc, 0xcc, 0xb0, 0xe, 0x0, + 0x33, 0x0, 0x33, 0x0, 0xe0, 0xa, 0x8a, 0xdd, + 0xaa, 0xdd, 0xa8, 0xa0, 0x0, 0x0, 0x87, 0x0, + 0x78, 0x0, 0x0, 0x0, 0x5b, 0xdd, 0xbb, 0xdd, + 0xb5, 0x0, 0x0, 0x0, 0x77, 0x0, 0x68, 0x0, + 0x0, 0x1c, 0xcc, 0xed, 0xcc, 0xee, 0xcc, 0xc2, + 0x0, 0x5, 0xc3, 0x30, 0x1c, 0x50, 0x0, 0x0, + 0x7d, 0x13, 0x9c, 0x70, 0xb9, 0x20, 0x2e, 0x70, + 0x30, 0x0, 0x30, 0x5, 0xd2, 0x1, 0x1, 0x9c, + 0xc8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5BDD "寝" */ + 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0xb, + 0xcc, 0xcc, 0xef, 0xcc, 0xcc, 0xc0, 0xd, 0x4, + 0x1, 0x11, 0x11, 0x11, 0xd0, 0x6, 0xe, 0x5, + 0x88, 0x88, 0x8e, 0x60, 0x9, 0xe, 0x2, 0x99, + 0x99, 0x9e, 0x0, 0x9, 0x4e, 0x1, 0x22, 0x22, + 0x2e, 0x0, 0x3, 0xae, 0x5, 0x77, 0x77, 0x77, + 0x0, 0x0, 0x1e, 0x3b, 0xbb, 0xbb, 0xbb, 0xb0, + 0x0, 0x1e, 0x47, 0x0, 0x0, 0x0, 0xd0, 0x18, + 0xdf, 0x13, 0xec, 0xaa, 0xda, 0x30, 0x47, 0xe, + 0x0, 0x2c, 0x45, 0xb1, 0x0, 0x0, 0xe, 0x0, + 0x27, 0xff, 0x62, 0x0, 0x0, 0xe, 0x3c, 0xa5, + 0x1, 0x6a, 0xc1, + + /* U+5BDF "察" */ + 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0xc, + 0xcc, 0xcc, 0xcf, 0xcc, 0xcc, 0xc0, 0xe, 0x2, + 0x70, 0x6, 0x0, 0x0, 0xe0, 0x4, 0xc, 0xda, + 0xa8, 0xba, 0xaa, 0x70, 0x1, 0xa7, 0x3, 0xa1, + 0xd2, 0x3d, 0x0, 0x1d, 0x63, 0xcc, 0x30, 0x89, + 0xa4, 0x0, 0x2, 0x94, 0xb7, 0x0, 0xb, 0xb0, + 0x0, 0x0, 0x4f, 0x8c, 0xcc, 0xc9, 0xab, 0x40, + 0x2c, 0xb3, 0x11, 0x11, 0x11, 0x15, 0xa3, 0x1, + 0x8b, 0xbb, 0xcf, 0xbb, 0xb9, 0x0, 0x0, 0x5, + 0xa0, 0x1d, 0x7, 0x80, 0x0, 0x2, 0xab, 0x10, + 0x1d, 0x0, 0x6d, 0x50, 0xa, 0x40, 0xb, 0xd9, + 0x0, 0x1, 0x70, + + /* U+5BE6 "實" */ + 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x6, + 0x77, 0x77, 0xbb, 0x77, 0x77, 0x70, 0xd, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xe0, 0xa, 0xd, 0x99, + 0xbc, 0x99, 0xe5, 0x90, 0x3a, 0xbe, 0x88, 0xbb, + 0x88, 0xec, 0xa6, 0x0, 0x2e, 0x99, 0xcb, 0x99, + 0xf2, 0x0, 0x0, 0x25, 0x55, 0x55, 0x55, 0x53, + 0x0, 0x0, 0x6a, 0x44, 0x44, 0x44, 0x7b, 0x0, + 0x0, 0x6c, 0x88, 0x88, 0x88, 0xab, 0x0, 0x0, + 0x6c, 0x88, 0x88, 0x88, 0xab, 0x0, 0x0, 0x6c, + 0x99, 0x99, 0x99, 0xab, 0x0, 0x0, 0x4, 0x98, + 0x0, 0x9a, 0x61, 0x0, 0x9, 0xb7, 0x20, 0x0, + 0x0, 0x5a, 0x90, + + /* U+5BEB "寫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x20, 0x0, 0x0, 0xb, 0xcc, 0xcc, + 0xdd, 0xcc, 0xcc, 0xb0, 0xe0, 0x0, 0x33, 0x0, + 0x0, 0xe, 0x8, 0x1a, 0xb8, 0x39, 0xbb, 0xb0, + 0x80, 0x3, 0xb0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x3e, 0xaa, 0x66, 0xaa, 0xf0, 0x0, 0x3, 0xc2, + 0x22, 0x22, 0x2d, 0x0, 0x0, 0x17, 0xdb, 0x77, + 0x77, 0x70, 0x0, 0x0, 0x9f, 0xaa, 0xaa, 0xaa, + 0xa5, 0x5, 0xc8, 0x44, 0x35, 0x45, 0x2a, 0x71, + 0xa2, 0x77, 0x66, 0xc1, 0xc1, 0xb5, 0x0, 0x1d, + 0x13, 0x98, 0x43, 0x1d, 0x30, 0x3, 0x40, 0x3, + 0x1, 0xcd, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5BFA "寺" */ + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0xce, + 0xee, 0xef, 0xee, 0xee, 0x60, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xdd, 0xdd, 0xdf, + 0xed, 0xd6, 0x0, 0x0, 0x0, 0x0, 0xc, 0x20, + 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0xbf, 0xcb, 0xb2, + 0x1, 0x25, 0x22, 0x22, 0x2d, 0x52, 0x20, 0x0, + 0x8, 0xb0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, + 0xa9, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x7, + 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xec, 0x0, 0x0, + + /* U+5BFE "対" */ + 0x0, 0x9, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0xe, 0x0, 0x4, 0x45, + 0xb4, 0x40, 0x0, 0xe, 0x0, 0x2b, 0xbb, 0xbc, + 0xa1, 0x11, 0x1e, 0x10, 0x0, 0x0, 0xe, 0x1c, + 0xcc, 0xcf, 0xc7, 0x4, 0x60, 0x2d, 0x0, 0x0, + 0xe, 0x0, 0x1, 0xd4, 0x6a, 0x6, 0x30, 0xe, + 0x0, 0x0, 0x2d, 0xc4, 0x2, 0xd0, 0xe, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0xa5, 0xe, 0x0, 0x0, + 0xb, 0xbb, 0x0, 0x23, 0xe, 0x0, 0x0, 0x7b, + 0xc, 0x50, 0x0, 0xe, 0x0, 0x9, 0xc1, 0x2, + 0x20, 0x0, 0xe, 0x0, 0x19, 0x0, 0x0, 0x0, + 0x1f, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5C04 "射" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x6, + 0x90, 0x0, 0x0, 0xd, 0x0, 0x0, 0xfc, 0xcc, + 0xd0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0xd2, + 0x44, 0x4e, 0x42, 0x0, 0xfb, 0xbb, 0xd6, 0x99, + 0x9f, 0x95, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd, + 0x0, 0x0, 0xfb, 0xbb, 0xd0, 0xb0, 0xd, 0x0, + 0x0, 0xd0, 0x0, 0xd0, 0x77, 0xd, 0x0, 0xa, + 0xdd, 0xdf, 0xd0, 0xd, 0xd, 0x0, 0x0, 0x1, + 0xc4, 0xd0, 0x4, 0xd, 0x0, 0x0, 0x3c, 0x40, + 0xd0, 0x0, 0xd, 0x0, 0xa, 0xa1, 0x0, 0xd0, + 0x0, 0xe, 0x0, 0x2, 0x0, 0xbd, 0x90, 0xb, + 0xda, 0x0, + + /* U+5C07 "將" */ + 0x0, 0x0, 0xe0, 0x0, 0x2b, 0x0, 0x0, 0xd, + 0x0, 0xe0, 0x2, 0xed, 0xbb, 0xa0, 0xd, 0x0, + 0xe0, 0x6b, 0x52, 0x7, 0x70, 0xd, 0x0, 0xe7, + 0x73, 0x1b, 0x8c, 0x0, 0xd, 0xdd, 0xe0, 0x9, + 0x77, 0xb0, 0x0, 0x0, 0x0, 0xe0, 0x16, 0xe7, + 0x28, 0x0, 0x0, 0x0, 0xe4, 0xc7, 0x10, 0x3a, + 0x0, 0x3e, 0xdd, 0xe7, 0xcc, 0xcc, 0xde, 0xc6, + 0xa, 0x20, 0xe0, 0x24, 0x11, 0x4b, 0x10, 0xb, + 0x10, 0xe0, 0x2d, 0x20, 0x3a, 0x0, 0xc, 0x0, + 0xe0, 0x5, 0xc0, 0x3a, 0x0, 0x1a, 0x0, 0xe0, + 0x0, 0x30, 0x3a, 0x0, 0x35, 0x0, 0xe0, 0x0, + 0x2e, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5C08 "專" */ + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x8, + 0xcc, 0xcc, 0xde, 0xcc, 0xcc, 0xc0, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0xab, 0xaa, + 0xbe, 0xaa, 0xae, 0x20, 0x0, 0xa9, 0x66, 0x9c, + 0x66, 0x6e, 0x20, 0x0, 0xa6, 0x33, 0x6b, 0x33, + 0x3d, 0x20, 0x0, 0x8a, 0xaa, 0xbe, 0xac, 0xcc, + 0x10, 0x3, 0x55, 0x55, 0x8c, 0x69, 0xfb, 0x20, + 0x3, 0x65, 0x55, 0x44, 0x4c, 0x53, 0x70, 0x1c, + 0xcc, 0xcc, 0xcc, 0xcf, 0xdc, 0xc7, 0x0, 0x8, + 0x80, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, 0x7c, + 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, 0x1, 0x9, + 0xcd, 0x10, 0x0, + + /* U+5C0D "對" */ + 0x4, 0xc, 0xb, 0x4, 0x0, 0xd, 0x0, 0x7, + 0x6c, 0xb, 0x87, 0x0, 0xe, 0x0, 0x0, 0x9c, + 0xd, 0x90, 0x0, 0xe, 0x0, 0x2c, 0xcf, 0xcf, + 0xcb, 0x0, 0xe, 0x0, 0x1, 0x93, 0x14, 0x83, + 0xdd, 0xdf, 0xd5, 0x0, 0x3a, 0xa, 0x30, 0x0, + 0xe, 0x0, 0x8, 0xcd, 0xdf, 0xc6, 0x83, 0xe, + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x4a, 0xe, 0x0, + 0x0, 0x23, 0xd2, 0x20, 0xd, 0xe, 0x0, 0x2, + 0x9a, 0xe9, 0x91, 0x7, 0x1e, 0x0, 0x0, 0x0, + 0xd0, 0x12, 0x0, 0xe, 0x0, 0x8, 0xac, 0xec, + 0xa7, 0x0, 0xe, 0x0, 0x4, 0x20, 0x0, 0x0, + 0xb, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5C0E "導" */ + 0x5, 0x20, 0x0, 0xa2, 0x0, 0xb2, 0x0, 0x3, + 0xd3, 0x6a, 0xcd, 0xab, 0xea, 0xa0, 0x0, 0x34, + 0x2, 0x24, 0xc2, 0x22, 0x0, 0x15, 0x52, 0xb, + 0x97, 0x77, 0x7e, 0x0, 0x27, 0xa7, 0xb, 0x98, + 0x88, 0x8e, 0x0, 0x0, 0x57, 0xb, 0x87, 0x77, + 0x7e, 0x0, 0x0, 0x9b, 0xb, 0x98, 0x88, 0x8e, + 0x0, 0xb, 0x63, 0xb9, 0x65, 0x55, 0x66, 0x72, + 0x4, 0x0, 0x2, 0x56, 0x6c, 0x95, 0x40, 0x2b, + 0xbb, 0xbb, 0xbb, 0xbe, 0xcb, 0xb1, 0x0, 0x9, + 0x60, 0x0, 0x9, 0x50, 0x0, 0x0, 0x1, 0xc6, + 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x3, 0x8, + 0xcd, 0x20, 0x0, + + /* U+5C0F "小" */ + 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, + 0x3c, 0x0, 0x62, 0x0, 0x0, 0x3e, 0x0, 0x3c, + 0x0, 0x6a, 0x0, 0x0, 0x79, 0x0, 0x3c, 0x0, + 0xe, 0x30, 0x0, 0xc4, 0x0, 0x3c, 0x0, 0x6, + 0xb0, 0x3, 0xe0, 0x0, 0x3c, 0x0, 0x0, 0xf2, + 0xb, 0x70, 0x0, 0x3c, 0x0, 0x0, 0x97, 0x1a, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0x5b, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5C11 "少" */ + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x28, + 0x0, 0xd0, 0x1, 0x80, 0x0, 0x0, 0x96, 0x0, + 0xd0, 0x0, 0xb4, 0x0, 0x1, 0xd0, 0x0, 0xd0, + 0x0, 0x2d, 0x0, 0xb, 0x50, 0x0, 0xd0, 0x0, + 0x8, 0x80, 0x3b, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xb0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x91, 0x0, + 0x0, 0x0, 0x0, 0x80, 0xa, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xca, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9d, 0x40, 0x0, 0x0, 0x14, 0x7a, 0xeb, + 0x50, 0x0, 0x0, 0x0, 0x6a, 0x74, 0x10, 0x0, + 0x0, 0x0, 0x0, + + /* U+5C1A "尚" */ + 0x5, 0x0, 0x2, 0xc0, 0x0, 0x44, 0x8, 0xa0, + 0x2, 0xc0, 0x0, 0xe3, 0x0, 0xc6, 0x2, 0xc0, + 0xa, 0x70, 0x0, 0x26, 0x2, 0xc0, 0x18, 0x0, + 0x1d, 0xdd, 0xdd, 0xfd, 0xdd, 0xd9, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x1d, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0x1d, 0x2, 0xec, 0xcc, 0xe0, 0x2b, + 0x1d, 0x2, 0xb0, 0x0, 0xe0, 0x2b, 0x1d, 0x2, + 0xb0, 0x0, 0xe0, 0x2b, 0x1d, 0x2, 0xfc, 0xcc, + 0xb0, 0x2b, 0x1d, 0x2, 0x90, 0x0, 0x0, 0x3b, + 0x1d, 0x0, 0x0, 0x0, 0x5e, 0xd7, + + /* U+5C24 "尤" */ + 0x0, 0x0, 0x0, 0xe0, 0x38, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0xa, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x6e, 0x0, 0x3, 0x33, 0x34, + 0xe3, 0x33, 0x35, 0x30, 0x2a, 0xaa, 0xab, 0xea, + 0xaa, 0xaa, 0xa2, 0x0, 0x0, 0x4, 0xa7, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x7c, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x4c, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xa7, 0xc, 0x20, 0x0, 0x41, 0x0, 0x8, + 0xb0, 0xc, 0x20, 0x0, 0x94, 0x1, 0xad, 0x10, + 0xc, 0x30, 0x0, 0xc2, 0x2f, 0x90, 0x0, 0x7, + 0xfe, 0xee, 0xa0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5C31 "就" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, 0xd, 0x1, 0x0, 0x0, 0x5, + 0x90, 0x0, 0xe, 0xc, 0x20, 0x3d, 0xdd, 0xdd, + 0xd2, 0xe, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x1, + 0x1e, 0x11, 0x40, 0x6, 0xdc, 0xcd, 0x88, 0xcf, + 0xcc, 0xc6, 0x7, 0x50, 0x4, 0x80, 0x1c, 0x20, + 0x0, 0x7, 0xc9, 0x9b, 0x80, 0x3a, 0xe0, 0x0, + 0x1, 0x26, 0x92, 0x10, 0x58, 0xe0, 0x0, 0x1, + 0xa4, 0x8a, 0x20, 0x94, 0xe0, 0x0, 0x5, 0x74, + 0x84, 0x80, 0xd0, 0xe0, 0x0, 0xc, 0x24, 0x80, + 0x95, 0x80, 0xe0, 0x8, 0x19, 0x4, 0x80, 0x1c, + 0x10, 0xf0, 0xb, 0x0, 0x6d, 0x50, 0x94, 0x0, + 0xbb, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5C3A "尺" */ + 0x0, 0xaf, 0xee, 0xee, 0xee, 0xed, 0x0, 0x0, + 0xa4, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0xa4, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0xbd, 0xbb, 0xbb, + 0xbb, 0xcd, 0x0, 0x0, 0xb5, 0x22, 0x2c, 0x52, + 0x22, 0x0, 0x0, 0xd0, 0x0, 0x7, 0x80, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x1, 0xe1, 0x0, 0x0, + 0x4, 0xb0, 0x0, 0x0, 0x7a, 0x0, 0x0, 0xa, + 0x60, 0x0, 0x0, 0xb, 0xa0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0xad, 0x50, 0x65, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xa0, + + /* U+5C40 "局" */ + 0x0, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xd2, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0xd, 0xcb, 0xbb, 0xbb, + 0xbb, 0xa0, 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x2b, 0xd, + 0xcc, 0xcc, 0xd0, 0x3b, 0x6, 0x80, 0xd0, 0x0, + 0xd, 0x4, 0xa0, 0xb2, 0xd, 0x99, 0x9a, 0xd0, + 0x68, 0x3a, 0x0, 0xd2, 0x22, 0x22, 0x9, 0x63, + 0x30, 0x5, 0x0, 0x0, 0x9d, 0xc1, + + /* U+5C45 "居" */ + 0x0, 0xfd, 0xdd, 0xdd, 0xdd, 0xdf, 0x40, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x9, 0x40, 0x0, 0xfa, + 0xaa, 0xaa, 0xaa, 0xae, 0x40, 0x0, 0xf2, 0x22, + 0x25, 0xc2, 0x22, 0x0, 0x0, 0xf0, 0x0, 0x3, + 0xb0, 0x0, 0x0, 0x0, 0xfd, 0xdd, 0xde, 0xfd, + 0xdd, 0xd1, 0x1, 0xd0, 0x0, 0x3, 0xb0, 0x0, + 0x0, 0x2, 0xb0, 0x23, 0x35, 0xc3, 0x33, 0x0, + 0x4, 0x90, 0xea, 0xaa, 0xaa, 0xaf, 0x0, 0x8, + 0x50, 0xe0, 0x0, 0x0, 0xd, 0x0, 0xd, 0x10, + 0xe0, 0x0, 0x0, 0xe, 0x0, 0x48, 0x0, 0xec, + 0xcc, 0xcc, 0xcf, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5C4A "届" */ + 0x0, 0xfd, 0xdd, 0xdd, 0xdd, 0xdf, 0x10, 0xe, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0xf, 0xdd, 0xdd, 0xdd, + 0xdd, 0xd1, 0x0, 0xe0, 0x0, 0x1, 0xc0, 0x0, + 0x0, 0x1d, 0xc, 0xcc, 0xdf, 0xcc, 0xc3, 0x2, + 0xc0, 0xe0, 0x2, 0xc0, 0xa, 0x30, 0x3b, 0xd, + 0x0, 0x1c, 0x0, 0xa3, 0x5, 0x90, 0xfc, 0xcc, + 0xfc, 0xce, 0x30, 0x95, 0xd, 0x0, 0x1c, 0x0, + 0xa3, 0xd, 0x10, 0xe0, 0x2, 0xc0, 0xb, 0x34, + 0x80, 0xf, 0xcc, 0xcc, 0xcc, 0xe3, + + /* U+5C4B "屋" */ + 0x0, 0xfc, 0xcc, 0xcc, 0xcc, 0xcf, 0x10, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x0, 0xfc, + 0xcc, 0xcc, 0xcc, 0xcf, 0x10, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xeb, 0xcc, 0xdc, + 0xcc, 0xcc, 0xa0, 0x1, 0xe0, 0x1c, 0x40, 0xb, + 0x60, 0x0, 0x2, 0xd3, 0xeb, 0x9a, 0xbc, 0xfa, + 0x0, 0x3, 0xb1, 0x54, 0x3d, 0x20, 0x8, 0x30, + 0x5, 0x93, 0xbb, 0xbf, 0xbb, 0xba, 0x0, 0x9, + 0x50, 0x0, 0xd, 0x20, 0x0, 0x0, 0xd, 0x10, + 0x0, 0xc, 0x10, 0x0, 0x0, 0x4b, 0x4c, 0xcc, + 0xcf, 0xcc, 0xcc, 0xc3, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5C55 "展" */ + 0x0, 0xfd, 0xdd, 0xdd, 0xdd, 0xdf, 0x30, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xfd, + 0xdd, 0xdd, 0xdd, 0xdf, 0x30, 0x0, 0xe0, 0x2, + 0x60, 0x8, 0x0, 0x0, 0x0, 0xe1, 0x25, 0xa2, + 0x2d, 0x32, 0x10, 0x1, 0xe5, 0xab, 0xda, 0xae, + 0xaa, 0x50, 0x2, 0xd0, 0x2, 0x90, 0xc, 0x10, + 0x0, 0x3, 0xbd, 0xdf, 0xde, 0xed, 0xdd, 0xd0, + 0x6, 0x80, 0x2b, 0x2, 0xb0, 0x4b, 0x0, 0xa, + 0x50, 0x2b, 0x0, 0x6c, 0x90, 0x0, 0x1e, 0x0, + 0x4c, 0x5a, 0x67, 0xb3, 0x0, 0x58, 0x0, 0xbb, + 0x72, 0x0, 0x3a, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5C65 "履" */ + 0x0, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc0, 0x0, + 0xe1, 0x11, 0x11, 0x11, 0x13, 0xc0, 0x0, 0xf8, + 0x8b, 0x8a, 0xa8, 0x88, 0x60, 0x0, 0xe0, 0x97, + 0xc, 0xca, 0xaa, 0xa0, 0x0, 0xe9, 0x82, 0x9b, + 0x44, 0x44, 0x20, 0x1, 0xe0, 0x3c, 0x7d, 0x55, + 0x56, 0xa0, 0x2, 0xc3, 0xe2, 0xe, 0x88, 0x89, + 0xa0, 0x3, 0xcc, 0xe0, 0xb, 0xa8, 0x78, 0x80, + 0x6, 0x80, 0xd0, 0x5, 0xfa, 0xaa, 0x60, 0xa, + 0x50, 0xd1, 0xab, 0xa1, 0x3c, 0x20, 0x1e, 0x0, + 0xd0, 0x30, 0x8f, 0xf6, 0x0, 0x38, 0x0, 0xd0, + 0x9a, 0x62, 0x27, 0xb3, + + /* U+5C6C "屬" */ + 0x0, 0xfa, 0xaa, 0xaa, 0xaa, 0xab, 0xd0, 0x0, + 0xf8, 0x88, 0x88, 0x88, 0x88, 0xd0, 0x0, 0xe0, + 0x89, 0x35, 0x63, 0x88, 0x10, 0x0, 0xe1, 0x58, + 0x96, 0x76, 0x86, 0x10, 0x0, 0xe4, 0xc8, 0x79, + 0x97, 0x7b, 0x60, 0x1, 0xd6, 0x71, 0xc1, 0x1c, + 0x13, 0xb0, 0x2, 0xc3, 0x8e, 0x98, 0x89, 0x88, + 0x60, 0x3, 0xb0, 0xac, 0x9c, 0x99, 0x99, 0xc0, + 0x5, 0x9c, 0xd8, 0x8e, 0x88, 0x60, 0xd0, 0x8, + 0x50, 0xc6, 0x7e, 0x68, 0x90, 0xd0, 0xc, 0x10, + 0x12, 0x4d, 0x5d, 0x51, 0xc0, 0x2b, 0x6, 0xaa, + 0x87, 0x53, 0xbc, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5C71 "山" */ + 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe0, 0x0, 0x0, 0x3, 0x90, 0x0, 0x1e, 0x0, + 0x0, 0xc0, 0x3b, 0x0, 0x1, 0xe0, 0x0, 0xe, + 0x3, 0xb0, 0x0, 0x1e, 0x0, 0x0, 0xe0, 0x3b, + 0x0, 0x1, 0xe0, 0x0, 0xe, 0x3, 0xb0, 0x0, + 0x1e, 0x0, 0x0, 0xe0, 0x3b, 0x0, 0x1, 0xe0, + 0x0, 0xe, 0x3, 0xb0, 0x0, 0x1e, 0x0, 0x0, + 0xe0, 0x3b, 0x0, 0x1, 0xe0, 0x0, 0xe, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x0, + + /* U+5CF6 "島" */ + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0xbd, 0xdb, 0xbb, 0xa0, 0x0, 0xb, 0x20, 0x0, + 0x0, 0xe, 0x0, 0x0, 0xbb, 0xaa, 0xaa, 0xaa, + 0xe0, 0x0, 0xb, 0x20, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xbc, 0xbb, 0xbb, 0xbb, 0xa0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb2, 0xb, 0x75, 0x55, 0x55, + 0x55, 0x54, 0x0, 0x35, 0xa6, 0x55, 0x55, 0x59, + 0x90, 0xd0, 0xa, 0x20, 0xd, 0x0, 0x87, 0xd, + 0xaa, 0xeb, 0xaa, 0xd0, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x9, 0xac, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5D4C "嵌" */ + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x9, + 0x50, 0x0, 0xb3, 0x0, 0xe, 0x10, 0x9, 0xed, + 0xdd, 0xfd, 0xdd, 0xdf, 0x10, 0x1, 0x10, 0x0, + 0x0, 0x60, 0x0, 0x0, 0x6, 0x70, 0xd, 0x3, + 0xb1, 0x11, 0x10, 0x8e, 0xed, 0xdf, 0xd8, 0xca, + 0xaa, 0xd0, 0x7, 0x80, 0xe, 0xb, 0x25, 0x23, + 0x90, 0x6, 0x70, 0xd, 0x2d, 0xb, 0x37, 0x50, + 0x6, 0xec, 0xcf, 0x3, 0xd, 0x40, 0x0, 0x6, + 0x70, 0xd, 0x0, 0x1f, 0xb0, 0x0, 0x6, 0x70, + 0xd, 0x0, 0x96, 0xc3, 0x0, 0x6, 0xed, 0xdf, + 0x7, 0xb0, 0x3d, 0x10, 0x6, 0x70, 0xd, 0x49, + 0x0, 0x3, 0xb0, + + /* U+5DDD "川" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x40, 0x0, 0xd1, 0x0, 0xd1, 0x0, + 0x2c, 0x0, 0xd, 0x10, 0xd, 0x10, 0x2, 0xc0, + 0x0, 0xd1, 0x0, 0xd1, 0x0, 0x2c, 0x0, 0xd, + 0x10, 0xe, 0x10, 0x2, 0xc0, 0x0, 0xd1, 0x0, + 0xf0, 0x0, 0x2c, 0x0, 0xd, 0x10, 0xf, 0x0, + 0x2, 0xc0, 0x0, 0xd1, 0x1, 0xe0, 0x0, 0x2c, + 0x0, 0xd, 0x10, 0x3c, 0x0, 0x2, 0xc0, 0x0, + 0xd1, 0x8, 0x70, 0x0, 0x2c, 0x0, 0xd, 0x11, + 0xe1, 0x0, 0x2, 0xb0, 0x0, 0xd1, 0x77, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5DDE "州" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xd, 0x10, + 0xd, 0x10, 0xd, 0x0, 0x0, 0xd1, 0x0, 0xd1, + 0x0, 0xd0, 0x0, 0xd, 0x10, 0xd, 0x10, 0xd, + 0x0, 0x84, 0xd5, 0x60, 0xd6, 0x60, 0xd0, 0xc, + 0xe, 0x2c, 0xd, 0x2d, 0xd, 0x3, 0xb0, 0xe0, + 0xc1, 0xd1, 0x85, 0xd0, 0x74, 0x1e, 0x7, 0x3d, + 0x13, 0x5d, 0x0, 0x3, 0xb0, 0x0, 0xd1, 0x0, + 0xd0, 0x0, 0x87, 0x0, 0xd, 0x10, 0xd, 0x0, + 0xe, 0x10, 0x0, 0xd1, 0x0, 0xd0, 0x9, 0x80, + 0x0, 0xd, 0x10, 0xd, 0x2, 0xc0, 0x0, 0x0, + 0x40, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5DE5 "工" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xee, 0xee, 0xff, 0xee, 0xee, 0xb0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x1e, 0xee, + 0xee, 0xff, 0xee, 0xee, 0xe7, + + /* U+5DE6 "左" */ + 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x0, 0x0, 0xe, 0xee, 0xff, + 0xee, 0xee, 0xee, 0xe0, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xdb, 0xbb, 0xbb, 0xbb, + 0x60, 0x0, 0xc, 0x42, 0x24, 0xd2, 0x22, 0x10, + 0x0, 0x2d, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0xc5, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x7, 0xb0, + 0x0, 0x2, 0xc0, 0x0, 0x0, 0x4d, 0x10, 0x0, + 0x2, 0xc0, 0x0, 0x0, 0x12, 0xb, 0xee, 0xee, + 0xfe, 0xee, 0xe3, + + /* U+5DEE "差" */ + 0x0, 0x4, 0x40, 0x0, 0x5, 0x60, 0x0, 0x0, + 0x1, 0xd0, 0x0, 0xe, 0x20, 0x0, 0x7, 0xdd, + 0xfe, 0xdd, 0xef, 0xdd, 0x80, 0x0, 0x0, 0x0, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xbd, 0xdd, 0xfd, + 0xdd, 0xdc, 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x0, 0x1a, 0xaa, 0xaf, 0xca, 0xaa, 0xaa, + 0xa1, 0x2, 0x22, 0xa9, 0x22, 0x22, 0x22, 0x20, + 0x0, 0x3, 0xeb, 0xaa, 0xaa, 0xaa, 0x0, 0x0, + 0x1d, 0x43, 0x35, 0xd3, 0x33, 0x0, 0x3, 0xd7, + 0x0, 0x2, 0xc0, 0x0, 0x0, 0x2f, 0x63, 0x33, + 0x35, 0xd3, 0x33, 0x30, 0x2, 0x9, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa1, + + /* U+5DF1 "己" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x1, 0x11, 0x11, 0x11, 0x14, 0xc0, + 0x0, 0xdd, 0xcc, 0xcc, 0xcc, 0xdc, 0x0, 0xd, + 0x10, 0x0, 0x0, 0x1, 0x40, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x4, 0x30, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x87, 0xd, 0x40, 0x0, 0x0, 0x0, 0x1d, 0x30, + 0x5d, 0xee, 0xee, 0xee, 0xee, 0x80, + + /* U+5DF2 "已" */ + 0x7e, 0xee, 0xee, 0xee, 0xef, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3b, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0xe, 0x0, 0x0, 0x0, 0x3, 0xb0, + 0x0, 0xee, 0xee, 0xee, 0xee, 0xfb, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x50, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xa5, 0xd, 0x40, 0x0, 0x0, 0x0, 0x2e, 0x10, + 0x5d, 0xee, 0xee, 0xee, 0xed, 0x60, + + /* U+5E02 "市" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xdd, + 0xef, 0xed, 0xdd, 0xd6, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0xee, 0xff, 0xee, 0xee, + 0x20, 0x0, 0xa4, 0x0, 0x59, 0x0, 0xb, 0x30, + 0x0, 0xa4, 0x0, 0x59, 0x0, 0xb, 0x30, 0x0, + 0xa4, 0x0, 0x59, 0x0, 0xb, 0x30, 0x0, 0xa4, + 0x0, 0x59, 0x0, 0xc, 0x30, 0x0, 0xa4, 0x0, + 0x59, 0xb, 0xbe, 0x10, 0x0, 0x20, 0x0, 0x59, + 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, + 0x0, 0x0, + + /* U+5E03 "布" */ + 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0x1c, 0xcc, + 0xcf, 0xcc, 0xcc, 0xcc, 0xc1, 0x1, 0x12, 0xd5, + 0x12, 0x21, 0x11, 0x10, 0x0, 0x5, 0xc0, 0xc, + 0x10, 0x0, 0x0, 0x0, 0xe, 0x30, 0xc, 0x10, + 0x0, 0x0, 0x0, 0xbf, 0xee, 0xef, 0xee, 0xef, + 0x50, 0xc, 0xae, 0x0, 0xc, 0x10, 0x9, 0x50, + 0x49, 0xd, 0x0, 0xc, 0x10, 0x9, 0x50, 0x0, + 0xd, 0x0, 0xc, 0x10, 0x9, 0x50, 0x0, 0xd, + 0x0, 0xc, 0x10, 0xa, 0x50, 0x0, 0xc, 0x0, + 0xc, 0x18, 0xca, 0x10, 0x0, 0x0, 0x0, 0xc, + 0x10, 0x0, 0x0, + + /* U+5E08 "师" */ + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xb, 0xdd, 0xee, 0xdd, 0xd0, 0xd0, 0xd0, 0x0, + 0x7, 0x60, 0x0, 0xd, 0xd, 0x1, 0x44, 0xa9, + 0x44, 0x20, 0xd0, 0xd0, 0x5c, 0x8c, 0xc8, 0xb7, + 0xd, 0xd, 0x5, 0x80, 0x76, 0x6, 0x70, 0xd0, + 0xe0, 0x58, 0x7, 0x60, 0x67, 0xd, 0xf, 0x5, + 0x80, 0x76, 0x6, 0x70, 0x91, 0xd0, 0x58, 0x7, + 0x60, 0x67, 0x0, 0x3b, 0x5, 0x80, 0x76, 0x6, + 0x70, 0x8, 0x60, 0x58, 0x7, 0x68, 0xd4, 0x2, + 0xd0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x84, 0x0, + 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5E0C "希" */ + 0x0, 0x13, 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, + 0x39, 0xc9, 0x40, 0x6c, 0x70, 0x0, 0x0, 0x0, + 0x18, 0xff, 0xf4, 0x0, 0x0, 0x3, 0x9d, 0xdc, + 0x90, 0x4b, 0xd6, 0x0, 0x1, 0x51, 0xc, 0x40, + 0x0, 0x24, 0x0, 0x2d, 0xdd, 0xee, 0xdd, 0xdd, + 0xdd, 0xd2, 0x0, 0x3, 0xd1, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xca, 0xaf, 0xaa, 0xaa, 0x0, + 0x7, 0xde, 0x42, 0x2e, 0x22, 0x2e, 0x10, 0x39, + 0xc, 0x20, 0xe, 0x0, 0xd, 0x10, 0x0, 0xc, + 0x20, 0xe, 0x0, 0xd, 0x10, 0x0, 0xc, 0x20, + 0xe, 0x9, 0xcb, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, + + /* U+5E2B "師" */ + 0x2, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x85, + 0x4, 0xdd, 0xdf, 0xdd, 0xd4, 0xbf, 0xdc, 0x10, + 0x0, 0xd0, 0x0, 0xd, 0x0, 0xb1, 0x68, 0x8f, + 0x88, 0x70, 0xd0, 0xb, 0x1c, 0x65, 0xe5, 0x5e, + 0xd, 0xdd, 0xf1, 0xc1, 0xd, 0x0, 0xe0, 0xd0, + 0x0, 0xc, 0x10, 0xd0, 0xe, 0xd, 0xaa, 0xa2, + 0xc1, 0xd, 0x0, 0xe0, 0xd2, 0x2b, 0x3c, 0x10, + 0xd0, 0xe, 0xd, 0x0, 0x93, 0xc1, 0xd, 0x0, + 0xe0, 0xd0, 0x9, 0x3c, 0x10, 0xd2, 0xdc, 0xd, + 0xcc, 0xc3, 0x10, 0xd, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, + + /* U+5E2D "席" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x1b, 0x71, 0x11, 0x10, 0x0, 0xfc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xc5, 0x0, 0xd0, 0x7, + 0x60, 0x0, 0xe0, 0x0, 0x0, 0xd8, 0xce, 0xec, + 0xcc, 0xfc, 0xc4, 0x1, 0xd0, 0x7, 0x60, 0x0, + 0xe0, 0x0, 0x1, 0xc0, 0x7, 0xc9, 0x99, 0xf0, + 0x0, 0x2, 0xb0, 0x1, 0x22, 0xe2, 0x20, 0x0, + 0x3, 0xa0, 0xab, 0xbb, 0xfb, 0xbb, 0x60, 0x4, + 0x90, 0xe1, 0x11, 0xe1, 0x17, 0x80, 0x8, 0x50, + 0xe0, 0x0, 0xe0, 0x5, 0x80, 0xc, 0x10, 0xe0, + 0x0, 0xe0, 0x27, 0x80, 0x2a, 0x0, 0xa0, 0x0, + 0xe0, 0xa9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5E2F "帯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x20, 0x49, 0x0, 0xb2, 0x0, 0x0, 0xb, + 0x20, 0x49, 0x0, 0xc2, 0x0, 0xc, 0xcf, 0xdc, + 0xde, 0xcc, 0xfd, 0xc6, 0x0, 0xb, 0x20, 0x49, + 0x0, 0xb2, 0x0, 0x0, 0x9, 0xcc, 0xcc, 0xcc, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xcb, 0xbb, 0xde, 0xbb, 0xbb, 0xf1, + 0xa, 0x20, 0x0, 0x49, 0x0, 0x0, 0xd1, 0x7, + 0x3e, 0xcc, 0xde, 0xcc, 0xda, 0x80, 0x0, 0x1c, + 0x0, 0x49, 0x0, 0x3a, 0x0, 0x0, 0x1c, 0x0, + 0x49, 0x0, 0x4a, 0x0, 0x0, 0x1c, 0x0, 0x49, + 0xc, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x49, 0x0, + 0x0, 0x0, + + /* U+5E30 "帰" */ + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x2, 0xbb, 0xbb, 0xbe, 0x0, 0x1, 0xd, + 0x1, 0xbb, 0xbb, 0xbe, 0x0, 0xb, 0xd, 0x0, + 0x0, 0x0, 0xe, 0x0, 0xc, 0xd, 0x7, 0xbb, + 0xbb, 0xbc, 0x0, 0xc, 0xd, 0x1, 0x11, 0x11, + 0x11, 0x10, 0x1b, 0xd, 0x6d, 0x99, 0xf9, 0x99, + 0xf0, 0x26, 0xd, 0x69, 0x0, 0xe0, 0x0, 0xd0, + 0x0, 0x1c, 0x3, 0xec, 0xfc, 0xcf, 0x10, 0x0, + 0x49, 0x2, 0xb0, 0xe0, 0xd, 0x0, 0x0, 0xb4, + 0x2, 0xb0, 0xe0, 0xd, 0x0, 0x5, 0xc0, 0x2, + 0xb0, 0xe1, 0xcb, 0x0, 0xb, 0x10, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5E33 "帳" */ + 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x0, 0x5e, 0xcc, 0xcc, 0xa0, 0x0, 0xc0, 0x5, + 0x90, 0x0, 0x0, 0xf, 0xdf, 0xe4, 0x5d, 0xaa, + 0xaa, 0x30, 0xb0, 0xc6, 0x45, 0x90, 0x0, 0x0, + 0xb, 0xc, 0x64, 0x5e, 0xbb, 0xbb, 0x40, 0xb0, + 0xc6, 0x46, 0x90, 0x0, 0x0, 0xb, 0xc, 0x69, + 0xfd, 0xed, 0xcc, 0xc0, 0xb0, 0xc6, 0x4b, 0x24, + 0xa0, 0x67, 0xb, 0xc, 0xd1, 0xb2, 0xa, 0xb9, + 0x0, 0x10, 0xc0, 0xb, 0x20, 0x1e, 0x40, 0x0, + 0xc, 0x0, 0xc7, 0xa9, 0x2d, 0x70, 0x0, 0xc0, + 0xd, 0x82, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5E36 "帶" */ + 0x0, 0xd, 0xc, 0x0, 0xd0, 0xd0, 0x0, 0x0, + 0xd, 0xc, 0x0, 0xd0, 0xd0, 0x0, 0x2c, 0xcf, + 0xcf, 0xcc, 0xfc, 0xfc, 0xc2, 0x0, 0x3c, 0xc, + 0x0, 0xd0, 0xd0, 0x51, 0x2, 0xc3, 0xc, 0xaa, + 0xd0, 0xc7, 0xc2, 0x9, 0x30, 0x2, 0x33, 0x20, + 0x26, 0x40, 0xd, 0xcc, 0xcc, 0xed, 0xcc, 0xcc, + 0xf0, 0xd, 0x0, 0x0, 0x76, 0x0, 0x0, 0xe0, + 0x8, 0x7d, 0xcc, 0xed, 0xcc, 0xd9, 0x90, 0x0, + 0x76, 0x0, 0x76, 0x0, 0x4a, 0x0, 0x0, 0x76, + 0x0, 0x76, 0x0, 0x4a, 0x0, 0x0, 0x76, 0x0, + 0x76, 0x2c, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x76, + 0x0, 0x0, 0x0, + + /* U+5E38 "常" */ + 0x8, 0x30, 0x4, 0xa0, 0x6, 0x50, 0x4, 0xd0, + 0x4, 0xa0, 0x2d, 0x10, 0x9a, 0xda, 0xac, 0xea, + 0xbc, 0xa9, 0xe2, 0x22, 0x22, 0x22, 0x22, 0x4d, + 0xe0, 0xab, 0xbb, 0xbb, 0xb9, 0x1d, 0x60, 0xe0, + 0x0, 0x0, 0x1d, 0x5, 0x0, 0xea, 0xaa, 0xaa, + 0xbd, 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0xb, 0xbb, 0xbc, 0xeb, 0xbb, 0xb0, 0xd, 0x22, + 0x25, 0xc2, 0x22, 0xe0, 0xc, 0x0, 0x3, 0xb0, + 0x0, 0xd0, 0xc, 0x0, 0x3, 0xb0, 0x11, 0xe0, + 0x8, 0x0, 0x3, 0xb0, 0x9b, 0x70, + + /* U+5E45 "幅" */ + 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x0, 0xcc, 0xcc, 0xcc, 0xc4, 0x0, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xdf, 0xd8, 0x3e, 0xbb, + 0xbd, 0x80, 0xb0, 0xc3, 0x83, 0x90, 0x0, 0x48, + 0xb, 0xc, 0x38, 0x3e, 0xbb, 0xbd, 0x80, 0xb0, + 0xc3, 0x80, 0x0, 0x0, 0x0, 0xb, 0xc, 0x38, + 0xac, 0xcc, 0xcc, 0xc1, 0xb0, 0xc3, 0x8d, 0x0, + 0xd0, 0xb, 0x2b, 0xc, 0xb4, 0xda, 0xaf, 0xaa, + 0xe2, 0x0, 0xc0, 0xd, 0x11, 0xd1, 0x1c, 0x20, + 0xc, 0x0, 0xd0, 0xd, 0x0, 0xb2, 0x0, 0xc0, + 0xd, 0xcc, 0xcc, 0xce, 0x20, + + /* U+5E73 "平" */ + 0x5, 0xee, 0xee, 0xee, 0xee, 0xee, 0x90, 0x0, + 0x1, 0x0, 0x59, 0x0, 0x12, 0x0, 0x0, 0x2d, + 0x0, 0x59, 0x0, 0x88, 0x0, 0x0, 0xa, 0x50, + 0x59, 0x0, 0xe1, 0x0, 0x0, 0x4, 0xb0, 0x59, + 0x7, 0x70, 0x0, 0x0, 0x0, 0x10, 0x59, 0x2, + 0x0, 0x0, 0x1e, 0xee, 0xee, 0xff, 0xee, 0xee, + 0xe6, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, + + /* U+5E74 "年" */ + 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xee, 0xef, 0xfe, 0xee, 0xb0, 0x0, 0xa8, 0x0, + 0xa, 0x30, 0x0, 0x0, 0x8, 0xc0, 0x0, 0xa, + 0x30, 0x0, 0x0, 0x7, 0x1b, 0xee, 0xef, 0xee, + 0xee, 0x50, 0x0, 0xc, 0x10, 0xa, 0x30, 0x0, + 0x0, 0x0, 0xc, 0x10, 0xa, 0x30, 0x0, 0x0, + 0x0, 0xc, 0x10, 0xa, 0x30, 0x0, 0x0, 0x1e, + 0xee, 0xee, 0xef, 0xee, 0xee, 0xe7, 0x0, 0x0, + 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x30, 0x0, 0x0, + + /* U+5E78 "幸" */ + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0xdd, 0xef, 0xdd, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x4a, 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xdd, 0xef, + 0xdd, 0xdd, 0xd7, 0x0, 0x3, 0xa0, 0x0, 0x4, + 0x90, 0x0, 0x0, 0x0, 0xd3, 0x0, 0xc, 0x40, + 0x0, 0x0, 0xcd, 0xed, 0xdd, 0xdf, 0xdd, 0x60, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x9, 0xdd, + 0xdd, 0xef, 0xdd, 0xdd, 0xd1, 0x0, 0x0, 0x0, + 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x0, + + /* U+5E7E "幾" */ + 0x0, 0x9, 0x0, 0x85, 0x1, 0x90, 0x0, 0x0, + 0x57, 0x0, 0x76, 0x8, 0x33, 0x20, 0x1, 0xb0, + 0xb3, 0x67, 0x3a, 0x3c, 0x10, 0xb, 0xcd, 0x60, + 0x58, 0x79, 0xe5, 0x10, 0x0, 0x58, 0x28, 0x3b, + 0x9, 0x45, 0x90, 0x6, 0xe9, 0xae, 0x2e, 0x8d, + 0xc9, 0xc1, 0x3, 0x39, 0x43, 0x2c, 0x22, 0xc4, + 0x10, 0x1c, 0xce, 0xdc, 0xcf, 0xdc, 0xdd, 0xc5, + 0x0, 0xd, 0x10, 0x3, 0xc0, 0x55, 0x0, 0x0, + 0x2f, 0xa1, 0x0, 0xc5, 0xd1, 0x0, 0x0, 0x78, + 0x5d, 0x10, 0x8f, 0x20, 0x25, 0x2, 0xe1, 0x2, + 0x4c, 0xaa, 0xa1, 0x67, 0xc, 0x30, 0x7, 0xb3, + 0x0, 0x8d, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5E83 "広" */ + 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, 0xde, + 0xee, 0xee, 0xfe, 0xee, 0xe5, 0x0, 0xe0, 0x0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xe, + 0x20, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x4c, 0x0, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0xe0, 0x1, 0xe0, 0x5, 0x30, 0x0, + 0x1, 0xc0, 0x9, 0x60, 0x3, 0xd1, 0x0, 0x3, + 0xb0, 0x1d, 0x0, 0x0, 0x8a, 0x0, 0x7, 0x70, + 0xa5, 0x0, 0x12, 0x4f, 0x40, 0xd, 0x34, 0xfc, + 0xdd, 0xca, 0x98, 0xc0, 0x1a, 0x1, 0x42, 0x0, + 0x0, 0x0, 0xa1, + + /* U+5E86 "庆" */ + 0x0, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x1, 0xfe, + 0xee, 0xee, 0xee, 0xee, 0xe7, 0x1, 0xc0, 0x0, + 0x0, 0x50, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x3, + 0xc0, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x5, 0xb0, + 0x0, 0x0, 0x2, 0xc4, 0xdd, 0xde, 0xfd, 0xdd, + 0xd3, 0x3, 0xb0, 0x0, 0xb, 0xe0, 0x0, 0x0, + 0x4, 0xa0, 0x0, 0xe, 0x87, 0x0, 0x0, 0x5, + 0x90, 0x0, 0x89, 0xc, 0x30, 0x0, 0x8, 0x60, + 0x3, 0xe1, 0x2, 0xd2, 0x0, 0xd, 0x20, 0x4e, + 0x30, 0x0, 0x5e, 0x40, 0x3c, 0x9, 0xc2, 0x0, + 0x0, 0x4, 0xd6, 0x1, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5E95 "底" */ + 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x1d, 0x31, 0x11, 0x10, 0x0, 0xfc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xc6, 0x0, 0xd0, 0x0, + 0x12, 0x35, 0x67, 0x0, 0x0, 0xd0, 0xcc, 0xba, + 0xd9, 0x42, 0x0, 0x1, 0xd0, 0xc1, 0x0, 0x95, + 0x0, 0x0, 0x1, 0xc0, 0xc1, 0x0, 0x76, 0x0, + 0x0, 0x2, 0xb0, 0xcd, 0xdd, 0xee, 0xdd, 0xb0, + 0x3, 0xa0, 0xc1, 0x0, 0x1c, 0x0, 0x0, 0x4, + 0x90, 0xc1, 0x3, 0xc, 0x10, 0x0, 0x8, 0x60, + 0xc1, 0x7, 0x66, 0x80, 0x56, 0xc, 0x20, 0xd9, + 0xc4, 0xd0, 0xd3, 0x87, 0x2c, 0x1, 0xb5, 0x0, + 0x72, 0x2c, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5E97 "店" */ + 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0xfe, + 0xee, 0xee, 0xee, 0xee, 0xe5, 0x0, 0xf0, 0x0, + 0x7, 0x10, 0x0, 0x0, 0x0, 0xf0, 0x0, 0xc, + 0x20, 0x0, 0x0, 0x0, 0xf0, 0x0, 0xc, 0xed, + 0xdd, 0xa0, 0x0, 0xe0, 0x0, 0xc, 0x20, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0xc, 0x20, 0x0, 0x0, + 0x2, 0xc0, 0xed, 0xdd, 0xdd, 0xdf, 0x10, 0x4, + 0xa0, 0xe0, 0x0, 0x0, 0xd, 0x10, 0x8, 0x70, + 0xe0, 0x0, 0x0, 0xd, 0x10, 0xe, 0x30, 0xeb, + 0xbb, 0xbb, 0xbf, 0x10, 0x2c, 0x0, 0xe1, 0x11, + 0x11, 0x1d, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5E9C "府" */ + 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x2, 0xfe, + 0xee, 0xee, 0xee, 0xee, 0xe7, 0x2, 0xc0, 0x3, + 0x80, 0x0, 0xa, 0x0, 0x2, 0xc0, 0xb, 0x50, + 0x0, 0xd, 0x0, 0x2, 0xc0, 0x3e, 0x3d, 0xdd, + 0xef, 0xd7, 0x2, 0xc1, 0xee, 0x0, 0x0, 0xd, + 0x0, 0x3, 0xb9, 0x6e, 0x6, 0x50, 0xd, 0x0, + 0x3, 0xa0, 0xe, 0x1, 0xd0, 0xd, 0x0, 0x4, + 0x90, 0xe, 0x0, 0x77, 0xd, 0x0, 0x7, 0x70, + 0xe, 0x0, 0x0, 0xd, 0x0, 0xb, 0x40, 0xe, + 0x0, 0x0, 0x1d, 0x0, 0x1c, 0x0, 0xe, 0x0, + 0xd, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5EA6 "度" */ + 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x1a, 0x71, 0x11, 0x10, 0x0, 0xfc, + 0xcc, 0xdc, 0xcc, 0xdc, 0xc6, 0x0, 0xe0, 0x2, + 0xb0, 0x0, 0xe0, 0x0, 0x0, 0xe8, 0xcd, 0xfc, + 0xcc, 0xfc, 0xc3, 0x0, 0xe0, 0x2, 0xb0, 0x0, + 0xe0, 0x0, 0x0, 0xe0, 0x2, 0xd7, 0x77, 0xf0, + 0x0, 0x1, 0xd0, 0x0, 0x44, 0x44, 0x40, 0x0, + 0x2, 0xc5, 0xcc, 0xcc, 0xcc, 0xcc, 0x10, 0x4, + 0xa0, 0x8, 0x80, 0x0, 0x98, 0x0, 0x7, 0x70, + 0x0, 0x9b, 0x4b, 0x70, 0x0, 0xc, 0x30, 0x36, + 0x9e, 0xdd, 0x74, 0x0, 0x1b, 0xc, 0xb8, 0x50, + 0x2, 0x7b, 0xe5, + + /* U+5EA7 "座" */ + 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x9, 0xed, 0xdd, + 0xdd, 0xdd, 0xdd, 0xc0, 0x94, 0x1, 0x10, 0x60, + 0x2, 0x0, 0x9, 0x40, 0xa4, 0xd, 0x0, 0xe0, + 0x0, 0xa4, 0xe, 0x20, 0xd0, 0x5b, 0x0, 0xa, + 0x47, 0xac, 0x1d, 0x1c, 0x99, 0x0, 0xb6, 0xb0, + 0x38, 0xdb, 0x50, 0x6a, 0xc, 0x21, 0x0, 0xd, + 0x10, 0x0, 0x10, 0xd1, 0xad, 0xdd, 0xfd, 0xdd, + 0xd1, 0xd, 0x0, 0x0, 0xd, 0x0, 0x0, 0x4, + 0xa0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa4, 0x8d, + 0xdd, 0xdf, 0xdd, 0xdd, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5EAB "庫" */ + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x1, + 0xaa, 0xaa, 0xad, 0xea, 0xaa, 0xa2, 0x1, 0xd1, + 0x11, 0x12, 0x61, 0x11, 0x10, 0x1, 0xc2, 0x66, + 0x67, 0xe6, 0x66, 0x60, 0x1, 0xc2, 0x55, 0x55, + 0xe5, 0x55, 0x40, 0x1, 0xc0, 0x8a, 0xaa, 0xfa, + 0xaa, 0x10, 0x2, 0xb0, 0xd0, 0x0, 0xd0, 0xb, + 0x20, 0x3, 0xa0, 0xda, 0xaa, 0xfa, 0xae, 0x20, + 0x4, 0x90, 0xd3, 0x33, 0xe3, 0x3c, 0x20, 0x5, + 0x80, 0x56, 0x67, 0xe6, 0x66, 0x10, 0x9, 0x59, + 0x99, 0x9a, 0xf9, 0x99, 0x93, 0xd, 0x12, 0x22, + 0x23, 0xe2, 0x22, 0x20, 0x2a, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5EAD "庭" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x0, 0x1, 0xaa, + 0xaa, 0xad, 0xca, 0xaa, 0xa5, 0x2, 0xc3, 0x33, + 0x33, 0x33, 0x33, 0x31, 0x2, 0xb6, 0xaa, 0x71, + 0x36, 0x9c, 0x50, 0x2, 0xb1, 0x2c, 0x36, 0x8a, + 0x90, 0x0, 0x2, 0xb0, 0x58, 0x0, 0x5, 0x80, + 0x0, 0x3, 0xb3, 0xea, 0x74, 0xac, 0xda, 0x90, + 0x3, 0xa2, 0x24, 0xa0, 0x26, 0x92, 0x10, 0x4, + 0x94, 0x46, 0x60, 0x5, 0x80, 0x0, 0x6, 0x82, + 0xbb, 0x11, 0x16, 0x91, 0x10, 0x8, 0x50, 0xba, + 0xa, 0xbb, 0xbb, 0xb1, 0xc, 0x23, 0xdd, 0x81, + 0x0, 0x0, 0x0, 0x1c, 0x2d, 0x21, 0x7c, 0xdd, + 0xdd, 0xd6, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5EB7 "康" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x1, 0xaa, + 0xaa, 0xaf, 0xca, 0xaa, 0xa2, 0x1, 0xd2, 0x22, + 0x2b, 0x52, 0x22, 0x20, 0x1, 0xc3, 0xaa, 0xae, + 0xba, 0xaa, 0x0, 0x1, 0xc0, 0x0, 0xb, 0x40, + 0xe, 0x0, 0x1, 0xdb, 0xbb, 0xbe, 0xcb, 0xbf, + 0xc5, 0x2, 0xb0, 0x0, 0xb, 0x30, 0xe, 0x10, + 0x3, 0xa5, 0xbb, 0xbe, 0xcb, 0xbf, 0x0, 0x4, + 0x94, 0x70, 0xb, 0x80, 0x7, 0x30, 0x6, 0x80, + 0x6a, 0x1c, 0xd7, 0xb6, 0x0, 0x9, 0x40, 0x4b, + 0xad, 0x48, 0xa1, 0x0, 0xd, 0x2c, 0x81, 0xb, + 0x30, 0x4b, 0xb2, 0x29, 0x0, 0xa, 0xcd, 0x10, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5EE0 "廠" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0x7, 0xaa, + 0xaa, 0xbf, 0xba, 0xaa, 0xa3, 0xb, 0x31, 0x24, + 0x11, 0x13, 0x21, 0x10, 0xb, 0x36, 0xc, 0x9, + 0x9, 0x50, 0x0, 0xb, 0x2b, 0x2c, 0x76, 0xd, + 0x10, 0x0, 0xb, 0x23, 0x3c, 0x51, 0x3f, 0xcd, + 0xe4, 0xc, 0x4c, 0x88, 0x8d, 0xce, 0x5, 0x80, + 0xc, 0x37, 0x79, 0x5a, 0x98, 0x48, 0x40, 0xd, + 0x37, 0x81, 0x8a, 0x12, 0x9d, 0x0, 0xd, 0x27, + 0x80, 0x8a, 0x10, 0xd9, 0x0, 0x1b, 0x27, 0xaa, + 0x7a, 0x10, 0xd8, 0x0, 0x68, 0x27, 0x10, 0xa, + 0x2b, 0x5b, 0x50, 0x82, 0x27, 0x1, 0xbb, 0xc5, + 0x1, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5EFA "建" */ + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x1d, + 0xdf, 0x75, 0xbb, 0xfc, 0xbb, 0x20, 0x0, 0xd, + 0x10, 0x0, 0xd1, 0xa, 0x20, 0x0, 0x77, 0x5c, + 0xcc, 0xfc, 0xce, 0xc2, 0x1, 0xd0, 0x0, 0x0, + 0xd0, 0xa, 0x20, 0xc, 0xed, 0x76, 0xcc, 0xfc, + 0xce, 0x20, 0x1, 0x7, 0x60, 0x0, 0xd0, 0x0, + 0x0, 0x8, 0xa, 0x38, 0xbb, 0xfb, 0xbb, 0x60, + 0x7, 0x6d, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x1, + 0xd9, 0x4c, 0xcc, 0xfc, 0xcc, 0xc0, 0x0, 0xcb, + 0x10, 0x0, 0xd0, 0x0, 0x0, 0x6, 0x93, 0xc6, + 0x10, 0x10, 0x0, 0x0, 0x3d, 0x10, 0x7, 0xbd, + 0xdd, 0xdd, 0xd2, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5EFF "廿" */ + 0x0, 0x5, 0x90, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x5, 0x90, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x5, + 0x90, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x5, 0x90, + 0x0, 0x3, 0xc0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x5, 0x90, 0x0, 0x3, + 0xc0, 0x0, 0x0, 0x5, 0x90, 0x0, 0x3, 0xc0, + 0x0, 0x0, 0x5, 0x90, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x5, 0x90, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x5, 0x90, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x5, + 0x90, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0x90, 0x0, + 0x3, 0xb0, 0x0, + + /* U+5F0F "式" */ + 0x0, 0x0, 0x0, 0x0, 0xf0, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x3e, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x4, 0x30, 0x3e, 0xee, 0xee, + 0xee, 0xfe, 0xee, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb4, + 0x0, 0x0, 0xa, 0xee, 0xfe, 0xe7, 0x96, 0x0, + 0x0, 0x0, 0x2, 0xc0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x2, 0xc0, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x0, 0xe, 0x10, 0x22, 0x0, 0x2, + 0xd5, 0x8a, 0x9, 0x70, 0x67, 0x7, 0xbe, 0xc9, + 0x51, 0x2, 0xe3, 0x94, 0x6, 0x30, 0x0, 0x0, + 0x0, 0x5e, 0xc0, + + /* U+5F15 "引" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0xdd, 0xdd, + 0xec, 0x0, 0xe, 0x0, 0x0, 0x1, 0xc0, 0x0, + 0xe0, 0x0, 0x0, 0x1c, 0x0, 0xe, 0xc, 0xed, + 0xde, 0xc0, 0x0, 0xe0, 0xe0, 0x0, 0x0, 0x0, + 0xe, 0x2c, 0x0, 0x0, 0x0, 0x0, 0xe6, 0xfd, + 0xdd, 0xdb, 0x0, 0xe, 0x0, 0x0, 0x3, 0xb0, + 0x0, 0xe0, 0x0, 0x0, 0x4a, 0x0, 0xe, 0x0, + 0x0, 0x7, 0x80, 0x0, 0xe0, 0x0, 0x0, 0xb5, + 0x0, 0xe, 0x0, 0x8e, 0xfb, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F1F "弟" */ + 0x0, 0x6, 0x70, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x1e, 0x10, 0x0, 0xb4, 0x0, 0x5, 0xcc, 0xed, + 0xcc, 0xcf, 0xcc, 0x20, 0x1, 0x11, 0x14, 0xb1, + 0x11, 0xb3, 0x0, 0x0, 0x0, 0x3b, 0x0, 0xb, + 0x30, 0x8, 0xdd, 0xde, 0xfd, 0xdd, 0xf3, 0x0, + 0xc2, 0x0, 0x3b, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x3, 0xb0, 0x0, 0x0, 0x3, 0xdd, 0xdd, 0xff, + 0xdd, 0xde, 0xd0, 0x0, 0x0, 0xad, 0xb0, 0x0, + 0x2c, 0x0, 0x4, 0xd7, 0x3b, 0x0, 0x6, 0x90, + 0x8e, 0xb3, 0x3, 0xb0, 0x8b, 0xe4, 0x6, 0x20, + 0x0, 0x3b, 0x0, 0x10, 0x0, + + /* U+5F31 "弱" */ + 0xd, 0xdd, 0xdf, 0x27, 0xdd, 0xdd, 0xb0, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0x3b, 0x7, 0xbb, 0xbf, + 0x27, 0xbb, 0xbc, 0xb0, 0xa4, 0x11, 0x10, 0xa5, + 0x11, 0x11, 0xb, 0x20, 0x0, 0xa, 0x20, 0x0, + 0x0, 0xcd, 0xcc, 0xc2, 0xad, 0xcc, 0xcb, 0x4, + 0x30, 0xc, 0x23, 0x30, 0x1, 0xd0, 0x4a, 0xc3, + 0xd1, 0x39, 0xd6, 0x2c, 0x0, 0x4, 0x8f, 0x0, + 0x1, 0x8a, 0xb1, 0x7c, 0xb6, 0xe0, 0x49, 0xc8, + 0x79, 0x27, 0x10, 0x4b, 0x6, 0x30, 0x8, 0x70, + 0x4, 0xdd, 0x40, 0x5, 0xbb, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x10, 0x0, + + /* U+5F35 "張" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xdd, 0xc0, 0x9d, 0xcc, 0xcc, 0xc0, 0x0, 0x0, + 0xc0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, + 0x9c, 0xbb, 0xbb, 0x50, 0xa, 0xdd, 0xc0, 0x94, + 0x0, 0x0, 0x0, 0xd, 0x11, 0x10, 0x9d, 0xbb, + 0xbb, 0x50, 0xd, 0x0, 0x2, 0xa7, 0x33, 0x33, + 0x30, 0xe, 0xdd, 0xa6, 0xf8, 0xda, 0x88, 0x82, + 0x0, 0x1, 0xc0, 0xd0, 0x4a, 0x7, 0x80, 0x0, + 0x2, 0xb0, 0xd0, 0xa, 0xb9, 0x0, 0x0, 0x4, + 0x90, 0xd0, 0x1, 0xd4, 0x0, 0x0, 0x7, 0x70, + 0xe6, 0xb4, 0x1d, 0x80, 0x9, 0xdd, 0x21, 0xd7, + 0x10, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5F37 "強" */ + 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, 0x0, 0x2d, + 0xdd, 0xf1, 0x4, 0xc0, 0x22, 0x0, 0x0, 0x0, + 0xc1, 0xc, 0x20, 0x2c, 0x10, 0x0, 0x0, 0xc1, + 0xba, 0x78, 0xad, 0xb0, 0x7, 0x99, 0xe1, 0x87, + 0x5b, 0x21, 0xa3, 0xd, 0x44, 0x40, 0x0, 0xe, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xfc, 0xcf, 0xcc, + 0xd0, 0x2d, 0x77, 0x71, 0xd0, 0xe, 0x0, 0xd0, + 0x16, 0x66, 0xd2, 0xe2, 0x2e, 0x22, 0xd0, 0x0, + 0x0, 0xd1, 0xaa, 0xaf, 0xaa, 0x90, 0x0, 0x0, + 0xe0, 0x0, 0xe, 0xa, 0x30, 0x0, 0x2, 0xd0, + 0x0, 0xe, 0x37, 0xd0, 0x2, 0xdd, 0x68, 0xed, + 0xca, 0x86, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5F53 "当" */ + 0x2, 0x0, 0xb, 0x40, 0x0, 0x50, 0x2d, 0x0, + 0xb, 0x40, 0x5, 0xb0, 0x8, 0x90, 0xb, 0x40, + 0xd, 0x30, 0x1, 0xe1, 0xb, 0x40, 0x79, 0x0, + 0x0, 0x10, 0xb, 0x40, 0x21, 0x0, 0x4e, 0xee, + 0xef, 0xfe, 0xee, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0xc, 0xee, 0xee, 0xee, 0xee, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x23, 0x33, 0x33, 0x33, 0x34, 0xe0, + 0x6b, 0xbb, 0xbb, 0xbb, 0xbb, 0xe0, + + /* U+5F62 "形" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x30, 0x4d, + 0xfe, 0xde, 0xfc, 0x0, 0x6d, 0x10, 0x0, 0xa3, + 0x6, 0x80, 0x8, 0xd1, 0x0, 0x0, 0xa3, 0x6, + 0x80, 0xc9, 0x0, 0x0, 0x0, 0xa3, 0x6, 0x80, + 0x0, 0x0, 0x60, 0x0, 0xa4, 0x6, 0x80, 0x0, + 0x1c, 0x60, 0x6d, 0xfe, 0xde, 0xed, 0x12, 0xc6, + 0x0, 0x0, 0xb2, 0x6, 0x80, 0x7d, 0x30, 0x0, + 0x0, 0xd0, 0x6, 0x80, 0x20, 0x0, 0x72, 0x0, + 0xd0, 0x6, 0x80, 0x0, 0x7, 0xb0, 0x5, 0xa0, + 0x6, 0x80, 0x0, 0x9b, 0x0, 0xd, 0x30, 0x6, + 0x80, 0x5d, 0x70, 0x0, 0x58, 0x0, 0x6, 0x85, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5F71 "影" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xda, 0xaa, 0xbc, 0x0, 0x1c, 0x50, 0x6, 0xc9, + 0x99, 0xac, 0x2, 0xc6, 0x0, 0x6, 0x70, 0x0, + 0x1c, 0x5d, 0x40, 0x0, 0x4, 0xaa, 0xda, 0xa8, + 0x1, 0x0, 0x60, 0x17, 0x77, 0xf7, 0x77, 0x20, + 0xb, 0x70, 0x4, 0x44, 0x44, 0x44, 0x13, 0xc6, + 0x0, 0x5, 0xdb, 0xbb, 0xca, 0x5d, 0x30, 0x0, + 0x5, 0x80, 0x0, 0x4a, 0x0, 0x0, 0x41, 0x3, + 0xaa, 0xfb, 0xa7, 0x0, 0x3, 0xc0, 0x2, 0xb0, + 0xd1, 0xb0, 0x0, 0x4d, 0x10, 0xc, 0x40, 0xd1, + 0x49, 0x1a, 0xb1, 0x0, 0x4, 0x1c, 0xd0, 0x2, + 0xb6, 0x0, 0x0, + + /* U+5F79 "役" */ + 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x10, 0xbe, 0xdd, 0xf1, 0x0, 0x3, 0xd3, + 0x0, 0xc2, 0x0, 0xd1, 0x0, 0xb, 0x22, 0x40, + 0xf0, 0x0, 0xd1, 0x0, 0x0, 0xd, 0x48, 0x90, + 0x0, 0xb8, 0x73, 0x0, 0xab, 0x7a, 0x0, 0x0, + 0x4, 0x41, 0xb, 0xca, 0x2b, 0xbb, 0xbb, 0xbc, + 0x30, 0x19, 0x3a, 0x7, 0xa2, 0x22, 0x3e, 0x0, + 0x0, 0x3a, 0x0, 0xd3, 0x0, 0xb7, 0x0, 0x0, + 0x3a, 0x0, 0x3d, 0x3a, 0x90, 0x0, 0x0, 0x3a, + 0x0, 0x7, 0xfd, 0x0, 0x0, 0x0, 0x3a, 0x4, + 0xbd, 0x6b, 0xd6, 0x10, 0x0, 0x3a, 0xca, 0x50, + 0x0, 0x49, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5F7C "彼" */ + 0x0, 0x2b, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, + 0x40, 0x0, 0xe, 0x0, 0x0, 0x2d, 0x60, 0xc, + 0xdd, 0xfd, 0xdd, 0x74, 0x50, 0x91, 0xe0, 0xe, + 0x0, 0xa4, 0x0, 0x5c, 0xe, 0x0, 0xe0, 0xd, + 0x0, 0x1e, 0x40, 0xe0, 0xe, 0x0, 0x40, 0x1d, + 0xf2, 0xf, 0xfd, 0xdd, 0xec, 0x8, 0x8c, 0x20, + 0xe8, 0x40, 0x7, 0x60, 0x0, 0xc2, 0x1c, 0x1c, + 0x1, 0xd1, 0x0, 0xc, 0x24, 0xa0, 0x78, 0xb5, + 0x0, 0x0, 0xc2, 0x86, 0x1, 0xec, 0x0, 0x0, + 0xc, 0x3e, 0x14, 0xd6, 0x9c, 0x40, 0x0, 0xc5, + 0x77, 0xa2, 0x0, 0x3a, 0x80, + + /* U+5F80 "往" */ + 0x0, 0x4, 0x30, 0x0, 0x80, 0x0, 0x0, 0x0, + 0x3d, 0x10, 0x0, 0x97, 0x0, 0x0, 0x4, 0xd3, + 0x0, 0x0, 0x1a, 0x0, 0x0, 0xb, 0x21, 0x4d, + 0xee, 0xef, 0xee, 0xe3, 0x0, 0xa, 0x60, 0x0, + 0x4a, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x4a, + 0x0, 0x0, 0x7, 0xfb, 0x0, 0x0, 0x4a, 0x0, + 0x0, 0x2c, 0x5b, 0x5, 0xee, 0xef, 0xee, 0xb0, + 0x0, 0x3b, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x3b, 0x4e, 0xee, + 0xef, 0xee, 0xe8, + + /* U+5F85 "待" */ + 0x0, 0x8, 0x60, 0x0, 0x3a, 0x0, 0x0, 0x0, + 0x4d, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x5, 0xd2, + 0x5, 0xdd, 0xef, 0xdd, 0xd0, 0xb, 0x11, 0x50, + 0x0, 0x3a, 0x0, 0x0, 0x0, 0xb, 0x60, 0x0, + 0x3a, 0x0, 0x0, 0x0, 0x9d, 0x2d, 0xdd, 0xdd, + 0xef, 0xd9, 0xa, 0xdc, 0x0, 0x0, 0x0, 0x4a, + 0x0, 0x19, 0x2c, 0xd, 0xdd, 0xdd, 0xef, 0xd7, + 0x0, 0x2c, 0x0, 0x40, 0x0, 0x4a, 0x0, 0x0, + 0x2c, 0x0, 0x7a, 0x0, 0x4a, 0x0, 0x0, 0x2c, + 0x0, 0xc, 0x40, 0x4a, 0x0, 0x0, 0x2c, 0x0, + 0x2, 0x10, 0x4a, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x3d, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5F88 "很" */ + 0x0, 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x20, 0xfd, 0xdd, 0xdf, 0x20, 0x6, 0xd2, + 0x0, 0xe0, 0x0, 0xc, 0x20, 0x8, 0x2, 0x80, + 0xfa, 0xaa, 0xae, 0x20, 0x0, 0xc, 0x50, 0xe1, + 0x11, 0x1c, 0x20, 0x0, 0x8c, 0x0, 0xe0, 0x0, + 0xc, 0x20, 0x9, 0xeb, 0x0, 0xfd, 0xdd, 0xdf, + 0x20, 0x2c, 0x4b, 0x0, 0xe0, 0x66, 0x0, 0x30, + 0x0, 0x2b, 0x0, 0xe0, 0x1c, 0x2c, 0x60, 0x0, + 0x2b, 0x0, 0xe0, 0x9, 0xc2, 0x0, 0x0, 0x2b, + 0x0, 0xe0, 0x1, 0xd2, 0x0, 0x0, 0x2b, 0x1, + 0xf7, 0xb7, 0x3e, 0x60, 0x0, 0x2b, 0x5, 0xc7, + 0x20, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5F8B "律" */ + 0x0, 0x5, 0x60, 0x0, 0x86, 0x0, 0x0, 0x0, + 0x2d, 0x10, 0x0, 0x86, 0x0, 0x0, 0x3, 0xd3, + 0x8, 0xcc, 0xee, 0xcd, 0xb0, 0xc, 0x20, 0x40, + 0x0, 0x86, 0x3, 0xb0, 0x0, 0xa, 0x7c, 0xcc, + 0xee, 0xcd, 0xf9, 0x0, 0x6c, 0x0, 0x0, 0x86, + 0x3, 0xb0, 0x7, 0xeb, 0x9, 0xcc, 0xee, 0xcc, + 0x90, 0x2c, 0x3b, 0x0, 0x0, 0x86, 0x0, 0x0, + 0x0, 0x2b, 0x7, 0xcc, 0xee, 0xcc, 0xb0, 0x0, + 0x2b, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x2b, + 0x3c, 0xcc, 0xee, 0xcc, 0xc7, 0x0, 0x2b, 0x0, + 0x0, 0x86, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, + 0x86, 0x0, 0x0, + + /* U+5F8C "後" */ + 0x0, 0x18, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, + 0xb6, 0x0, 0x2c, 0x10, 0x20, 0x0, 0xb, 0x80, + 0x3, 0xc1, 0x5, 0xc2, 0x0, 0x56, 0xa, 0x5f, + 0xdb, 0xc9, 0x10, 0x0, 0x0, 0x6a, 0x1, 0x5a, + 0x30, 0x96, 0x0, 0x4, 0xf3, 0x4d, 0xe9, 0xab, + 0xbf, 0x50, 0x5d, 0xd2, 0x35, 0x5e, 0x30, 0x1, + 0xb0, 0x31, 0xb2, 0x0, 0xce, 0xaa, 0xa8, 0x0, + 0x0, 0xb2, 0x3d, 0xd4, 0x11, 0xc5, 0x0, 0x0, + 0xb3, 0xb3, 0x1c, 0x2b, 0x90, 0x0, 0x0, 0xb2, + 0x0, 0x5, 0xfc, 0x0, 0x0, 0x0, 0xb2, 0x5, + 0xbc, 0x59, 0xd6, 0x10, 0x0, 0xb3, 0xd9, 0x40, + 0x0, 0x28, 0xd2, + + /* U+5F92 "徒" */ + 0x0, 0x3a, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1, + 0xd3, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x1d, 0x50, + 0xd, 0xdd, 0xfd, 0xdd, 0x40, 0x74, 0xa, 0x10, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0x7a, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x5, 0xf3, 0xad, 0xdd, 0xfd, + 0xdd, 0xd1, 0x5e, 0xd3, 0x0, 0x0, 0xb2, 0x0, + 0x0, 0x72, 0xa3, 0xa, 0x20, 0xb2, 0x0, 0x0, + 0x0, 0xa3, 0xe, 0x0, 0xbd, 0xdd, 0x60, 0x0, + 0xa3, 0xf, 0x20, 0xb2, 0x0, 0x0, 0x0, 0xa3, + 0x4c, 0xb0, 0xb2, 0x0, 0x0, 0x0, 0xa3, 0xb2, + 0x8b, 0xc2, 0x0, 0x0, 0x0, 0xa7, 0x80, 0x5, + 0xbe, 0xdd, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5F93 "従" */ + 0x0, 0x2b, 0x0, 0xa0, 0x0, 0x9, 0x30, 0x1, + 0xd3, 0x0, 0x78, 0x0, 0x1d, 0x0, 0x3d, 0x40, + 0x0, 0xd, 0x10, 0x96, 0x0, 0x42, 0xc, 0x3b, + 0xbd, 0xbb, 0xdb, 0xb0, 0x0, 0x88, 0x2, 0x22, + 0x6b, 0x22, 0x20, 0x6, 0xf3, 0x0, 0x0, 0x49, + 0x0, 0x0, 0x7c, 0xc3, 0x3, 0xa0, 0x49, 0x0, + 0x0, 0x51, 0xa3, 0x4, 0x90, 0x4f, 0xee, 0xb0, + 0x0, 0xa3, 0x7, 0x70, 0x49, 0x0, 0x0, 0x0, + 0xa3, 0xa, 0xb0, 0x49, 0x0, 0x0, 0x0, 0xa3, + 0x1e, 0xb3, 0x49, 0x0, 0x0, 0x0, 0xa3, 0x87, + 0x2e, 0xa9, 0x0, 0x0, 0x0, 0xa5, 0xb0, 0x2, + 0xae, 0xee, 0xe2, + + /* U+5F97 "得" */ + 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x20, 0xfb, 0xbb, 0xbd, 0x90, 0x7, 0xd2, + 0x0, 0xf9, 0x99, 0x9b, 0x90, 0x8, 0x3, 0x70, + 0xe1, 0x11, 0x16, 0x90, 0x0, 0x1d, 0x30, 0xf9, + 0x99, 0x9b, 0x90, 0x0, 0xbb, 0x0, 0x22, 0x22, + 0x22, 0x10, 0xc, 0xca, 0xb, 0xcc, 0xcc, 0xcc, + 0xc4, 0x38, 0x3a, 0x0, 0x0, 0x0, 0x76, 0x0, + 0x0, 0x3a, 0x3d, 0xdd, 0xdd, 0xee, 0xd7, 0x0, + 0x3a, 0x0, 0x71, 0x0, 0x76, 0x0, 0x0, 0x3a, + 0x0, 0x5c, 0x0, 0x76, 0x0, 0x0, 0x3a, 0x0, + 0x7, 0x30, 0x86, 0x0, 0x0, 0x3a, 0x0, 0x0, + 0x4d, 0xd3, 0x0, + + /* U+5F9E "從" */ + 0x0, 0x8, 0x0, 0x54, 0x0, 0x90, 0x0, 0x0, + 0xb6, 0x0, 0xb4, 0x2, 0xd0, 0x0, 0x1b, 0x70, + 0x1, 0xf1, 0x6, 0xa0, 0x0, 0x75, 0x8, 0x37, + 0xcb, 0x1c, 0xc6, 0x0, 0x0, 0x5b, 0x3f, 0x25, + 0xc7, 0xc, 0x60, 0x3, 0xf3, 0x95, 0x0, 0xb0, + 0x0, 0x90, 0x5e, 0xd3, 0x0, 0x20, 0xc1, 0x0, + 0x0, 0x72, 0xa3, 0x3, 0xa0, 0xc1, 0x0, 0x0, + 0x0, 0xa3, 0x5, 0x90, 0xcd, 0xcc, 0x30, 0x0, + 0xa3, 0x9, 0xb0, 0xc1, 0x0, 0x0, 0x0, 0xa3, + 0xd, 0xc2, 0xc1, 0x0, 0x0, 0x0, 0xa3, 0x79, + 0x2c, 0xd1, 0x0, 0x0, 0x0, 0xa5, 0xb0, 0x2, + 0xbd, 0xdd, 0xb0, + + /* U+5FA1 "御" */ + 0x0, 0x33, 0x6, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x22, 0xc0, 0x0, 0x27, 0x77, 0xc, 0x50, 0x7e, + 0xee, 0xd6, 0xa6, 0xe5, 0x52, 0x9d, 0x8, 0x40, + 0x57, 0xd, 0x0, 0xb6, 0x30, 0x84, 0x5, 0x70, + 0xd0, 0x7f, 0xd, 0xdf, 0xed, 0x77, 0xd, 0x5d, + 0xe0, 0x10, 0x84, 0x5, 0x70, 0xd4, 0x1d, 0x9, + 0x28, 0xba, 0x67, 0xd, 0x0, 0xd0, 0x92, 0x86, + 0x25, 0x70, 0xd0, 0xd, 0x9, 0x28, 0x40, 0x57, + 0xd, 0x0, 0xd0, 0x92, 0x85, 0x47, 0x7c, 0xb0, + 0xd, 0x3d, 0xdd, 0xb8, 0x87, 0x0, 0x0, 0xd1, + 0x20, 0x0, 0x5, 0x70, 0x0, + + /* U+5FA9 "復" */ + 0x0, 0x1a, 0x0, 0x94, 0x0, 0x0, 0x0, 0x1, + 0xc4, 0x2, 0xf8, 0x66, 0x66, 0x60, 0x2d, 0x50, + 0xa, 0xa5, 0x55, 0x55, 0x50, 0x53, 0xb, 0xbd, + 0xba, 0xaa, 0xaa, 0x0, 0x0, 0x7b, 0x22, 0xd0, + 0x0, 0xd, 0x0, 0x5, 0xf3, 0x0, 0xfa, 0xaa, + 0xaf, 0x0, 0x6d, 0xc3, 0x0, 0xe4, 0x44, 0x4e, + 0x0, 0x51, 0xa3, 0x0, 0x6e, 0x75, 0x55, 0x0, + 0x0, 0xa3, 0x0, 0x8f, 0xbb, 0xb9, 0x0, 0x0, + 0xa3, 0x1a, 0xbb, 0x10, 0xb6, 0x0, 0x0, 0xa3, + 0x56, 0x4, 0xcc, 0x70, 0x0, 0x0, 0xa3, 0x1, + 0x5a, 0xcc, 0xa4, 0x0, 0x0, 0xa3, 0x8c, 0x83, + 0x0, 0x49, 0xc0, + + /* U+5FC3 "心" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x90, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, + 0x80, 0x0, 0x0, 0x1, 0x60, 0xe1, 0x0, 0x0, + 0x1a, 0x0, 0x4, 0xa0, 0xe1, 0x0, 0x0, 0xd, + 0x30, 0x7, 0x70, 0xe1, 0x0, 0x0, 0x6, 0x90, + 0xb, 0x40, 0xe1, 0x0, 0x0, 0x1, 0xe0, 0xe, + 0x0, 0xe1, 0x0, 0x0, 0x90, 0xc3, 0x3a, 0x0, + 0xe1, 0x0, 0x1, 0xd0, 0x53, 0x0, 0x0, 0xd2, + 0x0, 0x4, 0xa0, 0x0, 0x0, 0x0, 0x8e, 0xee, + 0xee, 0x30, 0x0, + + /* U+5FC5 "必" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0x70, 0x0, 0x47, 0x0, 0x0, 0x0, + 0x1, 0xba, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x30, + 0x7, 0x7, 0x80, 0x0, 0x1, 0x30, 0xd1, 0x0, + 0x3d, 0x0, 0x0, 0x5, 0x90, 0xd1, 0x2, 0xd3, + 0x84, 0x0, 0x9, 0x50, 0xd1, 0x1d, 0x50, 0x2d, + 0x0, 0xe, 0x10, 0xd3, 0xd4, 0x0, 0x9, 0x70, + 0x69, 0x0, 0xdd, 0x40, 0x0, 0x2, 0xe0, 0x42, + 0x6, 0xf4, 0x0, 0x0, 0x60, 0xa2, 0x3, 0xcb, + 0xe1, 0x0, 0x2, 0xc0, 0x0, 0x6d, 0x50, 0xd2, + 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x7f, 0xee, + 0xee, 0x30, 0x0, + + /* U+5FD8 "忘" */ + 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0xe, 0xef, + 0xee, 0xee, 0xee, 0xee, 0xd0, 0x0, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0x11, 0x11, 0x11, + 0x11, 0x0, 0x0, 0x2c, 0xcc, 0xcc, 0xcc, 0xcc, + 0x30, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, 0x7a, 0x0, 0x3, 0x0, 0x1, + 0xd2, 0xc0, 0xa, 0x60, 0xd, 0x30, 0x8, 0x71, + 0xc0, 0x1, 0x10, 0x54, 0xb0, 0x1e, 0x1, 0xd0, + 0x0, 0x1, 0xd0, 0xd2, 0x2, 0x0, 0xce, 0xdd, + 0xde, 0x70, 0x20, + + /* U+5FD9 "忙" */ + 0x0, 0xb1, 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, + 0xb1, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0xb6, + 0x10, 0x0, 0x7, 0x10, 0x0, 0x29, 0xb7, 0x8e, + 0xee, 0xee, 0xee, 0xe2, 0x47, 0xb2, 0xc0, 0x95, + 0x0, 0x0, 0x0, 0x84, 0xb1, 0x20, 0x95, 0x0, + 0x0, 0x0, 0x60, 0xb1, 0x0, 0x95, 0x0, 0x0, + 0x0, 0x0, 0xb1, 0x0, 0x95, 0x0, 0x0, 0x0, + 0x0, 0xb1, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, + 0xb1, 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0xb1, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x0, + 0x9e, 0xdd, 0xdd, 0xd0, 0x0, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+5FEB "快" */ + 0x0, 0xc2, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0xc2, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x2, 0xc9, + 0x7, 0xbb, 0xfb, 0xba, 0x0, 0x29, 0xca, 0x71, + 0x22, 0xe2, 0x2e, 0x0, 0x47, 0xc5, 0xe0, 0x0, + 0xd0, 0xd, 0x0, 0x74, 0xc2, 0x40, 0x0, 0xd0, + 0xd, 0x0, 0xa1, 0xc2, 0x0, 0x1, 0xd0, 0xe, + 0x0, 0x0, 0xc2, 0xbd, 0xdd, 0xfe, 0xdd, 0xd1, + 0x0, 0xc2, 0x0, 0x6, 0xda, 0x0, 0x0, 0x0, + 0xc2, 0x0, 0xd, 0x2c, 0x30, 0x0, 0x0, 0xc2, + 0x0, 0x99, 0x4, 0xc0, 0x0, 0x0, 0xc2, 0x1a, + 0xa0, 0x0, 0x9c, 0x20, 0x0, 0xc2, 0xc7, 0x0, + 0x0, 0x7, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5FF5 "念" */ + 0x0, 0x0, 0x0, 0x98, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xaa, 0x80, 0x0, 0x0, 0x0, 0x2, + 0xb7, 0x10, 0x6c, 0x40, 0x0, 0x3, 0xad, 0x40, + 0xb8, 0x3, 0xbc, 0x50, 0x2d, 0x60, 0x0, 0x7, + 0x10, 0x3, 0xb4, 0x0, 0x5d, 0xdd, 0xdd, 0xdd, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa0, + 0x0, 0x0, 0x0, 0x5, 0x30, 0x4d, 0x10, 0x0, + 0x0, 0x0, 0x32, 0xd3, 0xa1, 0x2, 0x0, 0x1, + 0xd1, 0xd0, 0x3d, 0x10, 0x1d, 0x10, 0x6, 0x81, + 0xd0, 0x4, 0x10, 0x45, 0xa0, 0xd, 0x21, 0xe0, + 0x0, 0x1, 0xd0, 0xd2, 0x16, 0x0, 0xbe, 0xdd, + 0xde, 0x70, 0x31, + + /* U+600E "怎" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdd, 0xdf, + 0xdd, 0xdd, 0xdc, 0x0, 0x7b, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x5e, 0x10, 0xf, 0xcc, 0xcc, 0xc3, + 0x8, 0x30, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xcc, 0xcc, 0xc7, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0xb0, 0xd0, 0x5d, 0x30, 0x3c, + 0x0, 0x2c, 0xe, 0x0, 0x28, 0x3, 0xa5, 0x9, + 0x60, 0xe0, 0x0, 0x0, 0xd2, 0xd0, 0x70, 0xa, + 0xed, 0xdd, 0xe7, 0x7, 0x10, + + /* U+6012 "怒" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x1e, 0xed, 0xde, 0x70, 0x3d, 0xfe, + 0xde, 0x86, 0x80, 0xb, 0x30, 0x0, 0xe1, 0xb, + 0x31, 0xd0, 0x2d, 0x0, 0x8, 0xb0, 0x2c, 0x0, + 0x88, 0xc4, 0x0, 0x1, 0x8c, 0xd3, 0x0, 0xf, + 0xa0, 0x0, 0x0, 0x3d, 0xcb, 0x13, 0xc9, 0xd8, + 0x0, 0x1b, 0xc3, 0x5, 0x2b, 0x20, 0x19, 0xe1, + 0x2, 0x0, 0x5, 0xc3, 0x0, 0x0, 0x10, 0x0, + 0xb1, 0xd1, 0x3d, 0x50, 0x69, 0x0, 0x4, 0xb0, + 0xd1, 0x0, 0x5, 0x1c, 0x50, 0xd, 0x30, 0xd1, + 0x0, 0xc, 0x22, 0xe0, 0x26, 0x0, 0x8e, 0xdd, + 0xeb, 0x0, 0x62, + + /* U+6015 "怕" */ + 0x0, 0x2c, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x2c, + 0x20, 0x0, 0x78, 0x0, 0x0, 0x7, 0x4c, 0xc0, + 0xee, 0xee, 0xee, 0xf1, 0xa, 0x3c, 0x65, 0xe0, + 0x0, 0x0, 0xd1, 0xc, 0x2c, 0x13, 0xe0, 0x0, + 0x0, 0xd1, 0x17, 0x2c, 0x0, 0xe0, 0x0, 0x0, + 0xd1, 0x0, 0x2c, 0x0, 0xed, 0xdd, 0xdd, 0xf1, + 0x0, 0x2c, 0x0, 0xe0, 0x0, 0x0, 0xd1, 0x0, + 0x2c, 0x0, 0xe0, 0x0, 0x0, 0xd1, 0x0, 0x2c, + 0x0, 0xe0, 0x0, 0x0, 0xd1, 0x0, 0x2c, 0x0, + 0xec, 0xcc, 0xcc, 0xf1, 0x0, 0x2c, 0x0, 0xe1, + 0x11, 0x11, 0xc1, + + /* U+601D "思" */ + 0x0, 0xed, 0xdd, 0xfd, 0xdd, 0xdf, 0x0, 0x0, + 0xd0, 0x0, 0xb3, 0x0, 0xe, 0x0, 0x0, 0xe9, + 0x99, 0xeb, 0x99, 0x9f, 0x0, 0x0, 0xe2, 0x22, + 0xc5, 0x22, 0x2e, 0x0, 0x0, 0xd0, 0x0, 0xb3, + 0x0, 0xe, 0x0, 0x0, 0xed, 0xdd, 0xfe, 0xdd, + 0xdf, 0x0, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x34, 0xd8, 0x0, 0x13, 0x0, + 0x0, 0xd0, 0xe0, 0xb, 0xa0, 0x1d, 0x10, 0x5, + 0x90, 0xe0, 0x0, 0x12, 0x56, 0xa0, 0xd, 0x20, + 0xe0, 0x0, 0x5, 0x80, 0xe2, 0x5, 0x0, 0xae, + 0xdd, 0xde, 0x30, 0x31, + + /* U+6025 "急" */ + 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfd, 0xcc, 0xcb, 0x0, 0x0, 0x3, 0xd3, 0x0, + 0x9, 0x80, 0x0, 0x5, 0xfd, 0xaa, 0xaa, 0xfa, + 0xa9, 0x0, 0x42, 0x11, 0x11, 0x11, 0x12, 0xd0, + 0x0, 0x8, 0x99, 0x99, 0x99, 0xad, 0x0, 0x0, + 0x11, 0x11, 0x11, 0x12, 0xd0, 0x0, 0x2, 0x22, + 0x22, 0x22, 0x2d, 0x0, 0x4, 0xaa, 0xab, 0xaa, + 0xaa, 0x90, 0x0, 0x20, 0x50, 0x98, 0x0, 0x5, + 0x20, 0xd, 0x2d, 0x0, 0xa8, 0x3, 0x4c, 0x8, + 0x81, 0xe0, 0x0, 0x40, 0xd1, 0xa5, 0x71, 0xb, + 0xdd, 0xdd, 0xea, 0x2, 0x30, + + /* U+6027 "性" */ + 0x0, 0xb2, 0x0, 0x30, 0x76, 0x0, 0x0, 0x0, + 0xb2, 0x0, 0xe0, 0x77, 0x0, 0x0, 0x2, 0xb7, + 0x13, 0xc0, 0x77, 0x0, 0x0, 0x29, 0xb6, 0x97, + 0xfe, 0xff, 0xee, 0xa0, 0x47, 0xb3, 0xbd, 0x20, + 0x77, 0x0, 0x0, 0x83, 0xb2, 0x5b, 0x0, 0x77, + 0x0, 0x0, 0x60, 0xb2, 0x1, 0x0, 0x77, 0x0, + 0x0, 0x0, 0xb2, 0x7, 0xdd, 0xee, 0xdd, 0x50, + 0x0, 0xb2, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, + 0xb2, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0xb2, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0xb2, 0x1, + 0x11, 0x88, 0x11, 0x10, 0x0, 0xb2, 0x7c, 0xcc, + 0xcc, 0xcc, 0xc0, + + /* U+606F "息" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xaa, 0xeb, 0xaa, 0xa2, 0x0, 0x0, 0xe, 0x11, + 0x11, 0x11, 0xb3, 0x0, 0x0, 0xf, 0xaa, 0xaa, + 0xaa, 0xe3, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0xf, 0xbb, 0xbb, 0xbb, 0xe3, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xa3, 0x0, + 0x0, 0xf, 0xcc, 0xcc, 0xcc, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x61, + 0x80, 0x3d, 0x0, 0x1b, 0x0, 0x2, 0xc1, 0xc0, + 0x7, 0x50, 0x39, 0x70, 0xb, 0x51, 0xd0, 0x0, + 0x3, 0xa1, 0xe0, 0x6, 0x0, 0xce, 0xdd, 0xee, + 0x40, 0x10, + + /* U+60A8 "您" */ + 0x0, 0x0, 0x60, 0x24, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x70, 0xa8, 0x22, 0x22, 0x20, 0x0, 0x6d, + 0x5, 0xda, 0xad, 0xaa, 0xf3, 0x7, 0xea, 0x3d, + 0x10, 0xe, 0x2, 0x80, 0x1a, 0x4a, 0x0, 0x68, + 0xe, 0xc, 0x0, 0x0, 0x3a, 0x1, 0xd1, 0xe, + 0x6, 0x90, 0x0, 0x3a, 0xa, 0x50, 0xe, 0x0, + 0xd1, 0x0, 0x3a, 0x0, 0x7, 0xcb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, 0x0, 0x0, + 0x71, 0xb0, 0xd, 0x30, 0xa, 0x40, 0x2, 0xd1, + 0xd0, 0x3, 0xa0, 0x34, 0xc0, 0xa, 0x61, 0xe0, + 0x0, 0x0, 0xb3, 0xc3, 0x8, 0x0, 0xbe, 0xdd, + 0xde, 0xc0, 0x32, + + /* U+60AA "悪" */ + 0xc, 0xcc, 0xdf, 0xcc, 0xfc, 0xcc, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xfc, + 0xcf, 0xcc, 0xfc, 0xcf, 0x0, 0x0, 0xd0, 0xd, + 0x0, 0xe0, 0xd, 0x0, 0x0, 0xfa, 0xaf, 0xaa, + 0xfa, 0xaf, 0x0, 0x0, 0x11, 0x2e, 0x11, 0xe1, + 0x11, 0x0, 0x2, 0x22, 0x3e, 0x22, 0xe2, 0x22, + 0x20, 0x2a, 0xaa, 0xad, 0xca, 0xaa, 0xaa, 0xa2, + 0x0, 0x30, 0x44, 0xb8, 0x0, 0x51, 0x0, 0x0, + 0xd1, 0xb2, 0x7, 0x11, 0x5d, 0x20, 0x9, 0x90, + 0xb3, 0x0, 0xb, 0x25, 0xd0, 0x18, 0x0, 0x6e, + 0xdd, 0xec, 0x0, 0x61, + + /* U+60B2 "悲" */ + 0x0, 0x0, 0xe, 0x1, 0xe0, 0x0, 0x0, 0x9, + 0xaa, 0xaf, 0x1, 0xfa, 0xaa, 0xa0, 0x2, 0x22, + 0x2f, 0x1, 0xe2, 0x22, 0x20, 0x0, 0x11, 0x1f, + 0x1, 0xe1, 0x11, 0x0, 0x5, 0xbb, 0xbf, 0x1, + 0xfb, 0xbb, 0x50, 0x0, 0x0, 0xf, 0x1, 0xe0, + 0x0, 0x0, 0xc, 0xcc, 0xdf, 0x1, 0xfd, 0xdd, + 0xd2, 0x0, 0x0, 0xa, 0x0, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x40, 0xa5, 0x0, 0x20, 0x0, 0x0, + 0xb0, 0xe0, 0x1d, 0x20, 0x79, 0x0, 0x4, 0xa0, + 0xe0, 0x4, 0x82, 0x2c, 0x40, 0xd, 0x20, 0xe0, + 0x0, 0x7, 0x62, 0xe0, 0x5, 0x0, 0xae, 0xdd, + 0xde, 0x20, 0x40, + + /* U+60C5 "情" */ + 0x0, 0xd0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, + 0xd0, 0x6c, 0xcc, 0xfc, 0xcc, 0xa0, 0x0, 0xd7, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0xa, 0xd9, 0x4b, + 0xbb, 0xfb, 0xbb, 0x50, 0x29, 0xd2, 0x63, 0x33, + 0xe4, 0x33, 0x30, 0x66, 0xd0, 0x66, 0x66, 0x66, + 0x66, 0x61, 0x41, 0xd0, 0xa, 0xbb, 0xbb, 0xbb, + 0x10, 0x0, 0xd0, 0xd, 0x0, 0x0, 0xc, 0x10, + 0x0, 0xd0, 0xe, 0xbb, 0xbb, 0xbf, 0x10, 0x0, + 0xd0, 0xd, 0x0, 0x0, 0xc, 0x10, 0x0, 0xd0, + 0xe, 0xbb, 0xbb, 0xbf, 0x10, 0x0, 0xd0, 0xd, + 0x0, 0x0, 0xc, 0x10, 0x0, 0xd0, 0xd, 0x0, + 0x6, 0xcc, 0x0, + + /* U+60F3 "想" */ + 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x60, 0xa, 0xdc, 0xcc, 0xe0, 0x9, 0x9c, + 0xc9, 0x7a, 0x30, 0x0, 0xe0, 0x3, 0x3e, 0x83, + 0x2a, 0xcb, 0xbb, 0xe0, 0x0, 0x6e, 0xd3, 0xa, + 0x30, 0x0, 0xe0, 0x3, 0xc7, 0x7b, 0x6a, 0xcb, + 0xbb, 0xe0, 0x2d, 0x27, 0x60, 0x2a, 0x30, 0x0, + 0xe0, 0x1, 0x7, 0x60, 0xa, 0xcb, 0xbb, 0xe0, + 0x0, 0x0, 0x0, 0xb2, 0x0, 0x2, 0x0, 0x0, + 0x70, 0x70, 0x4d, 0x0, 0xb, 0x50, 0x4, 0xa0, + 0xd0, 0x7, 0x51, 0x32, 0xd0, 0xc, 0x30, 0xd1, + 0x0, 0x4, 0xa0, 0xa5, 0x5, 0x0, 0x7e, 0xdd, + 0xde, 0x40, 0x10, + + /* U+6108 "愈" */ + 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xbb, 0x50, 0x0, 0x0, 0x0, 0x17, + 0xc5, 0x0, 0x7c, 0x61, 0x0, 0x2b, 0xa5, 0x8a, + 0xaa, 0xa3, 0x4a, 0xb2, 0x1, 0x97, 0x78, 0x60, + 0x60, 0xa, 0x0, 0x0, 0xe8, 0x8a, 0x90, 0xd0, + 0xd, 0x0, 0x0, 0xd3, 0x37, 0x90, 0xd0, 0xd, + 0x0, 0x0, 0xe6, 0x69, 0x90, 0x90, 0xd, 0x0, + 0x0, 0xd0, 0x3b, 0x50, 0x4, 0xbb, 0x0, 0x0, + 0x10, 0x12, 0xc4, 0x0, 0x1, 0x0, 0x0, 0xc1, + 0xc1, 0x1c, 0x41, 0x3c, 0x10, 0x7, 0x90, 0xc1, + 0x0, 0xc, 0x36, 0xa0, 0x8, 0x0, 0x7d, 0xdd, + 0xdd, 0x0, 0x80, + + /* U+610F "意" */ + 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x4, + 0xcc, 0xcc, 0xdf, 0xcc, 0xcc, 0x40, 0x0, 0x0, + 0xc0, 0x0, 0xd, 0x10, 0x0, 0x7, 0x77, 0xd9, + 0x77, 0x9d, 0x77, 0x70, 0x5, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x50, 0x0, 0x4c, 0xaa, 0xaa, 0xaa, + 0xc5, 0x0, 0x0, 0x5b, 0x44, 0x44, 0x44, 0xa6, + 0x0, 0x0, 0x5b, 0x55, 0x55, 0x55, 0xb6, 0x0, + 0x0, 0x5d, 0xaa, 0xaa, 0xaa, 0xd6, 0x0, 0x0, + 0x0, 0x1, 0xc4, 0x0, 0x11, 0x0, 0x0, 0xc2, + 0xc1, 0x1c, 0x31, 0x3c, 0x0, 0x7, 0x90, 0xc1, + 0x0, 0xc, 0x16, 0x90, 0x8, 0x0, 0x7d, 0xcc, + 0xdb, 0x0, 0x50, + + /* U+611A "愚" */ + 0x0, 0x2e, 0xaa, 0xaf, 0xaa, 0xbc, 0x0, 0x0, + 0x2e, 0xaa, 0xaf, 0xaa, 0xbc, 0x0, 0x0, 0x2c, + 0x11, 0x1e, 0x11, 0x3c, 0x0, 0x0, 0x18, 0x88, + 0x8f, 0x88, 0x87, 0x0, 0x1, 0xbb, 0xbb, 0xbf, + 0xbb, 0xbb, 0x90, 0x2, 0xb0, 0x0, 0xe, 0x8, + 0x21, 0xc0, 0x2, 0xb6, 0xbb, 0xac, 0xaa, 0xc3, + 0xc0, 0x2, 0xb0, 0x0, 0x92, 0x0, 0x3b, 0xa0, + 0x0, 0x20, 0x50, 0x4d, 0x60, 0x2, 0x0, 0x0, + 0xd2, 0xe0, 0x1, 0xb3, 0x18, 0x90, 0x7, 0xa0, + 0xe0, 0x0, 0x0, 0xd0, 0xc4, 0x8, 0x10, 0xae, + 0xdd, 0xde, 0x70, 0x35, + + /* U+611B "愛" */ + 0x0, 0x0, 0x0, 0x2, 0x35, 0x78, 0x0, 0x3, + 0xcd, 0xcc, 0xfa, 0x86, 0x84, 0x0, 0x0, 0xb, + 0x60, 0x75, 0x1, 0xd2, 0x0, 0x9, 0xac, 0xea, + 0xbc, 0xad, 0xda, 0xa0, 0xe, 0x11, 0x12, 0xb7, + 0x11, 0x21, 0xe0, 0xa, 0x1b, 0x3a, 0x8, 0x22, + 0xc4, 0xb0, 0x1, 0xb5, 0x2c, 0x55, 0x7a, 0x1d, + 0x30, 0x2, 0x50, 0xd, 0x85, 0x51, 0x2, 0x10, + 0x0, 0x1, 0xce, 0xaa, 0xaa, 0x60, 0x0, 0x1, + 0x8c, 0xc7, 0x11, 0x4d, 0x20, 0x0, 0x9, 0x60, + 0x8, 0xb9, 0xc2, 0x0, 0x0, 0x0, 0x14, 0x8b, + 0xba, 0xc9, 0x52, 0x0, 0xc, 0xb8, 0x50, 0x0, + 0x4, 0x8b, 0xd1, + + /* U+611F "感" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x94, 0xa5, 0x0, 0x0, 0x11, + 0x11, 0x11, 0x95, 0x2c, 0x20, 0x0, 0xfb, 0xbb, + 0xbb, 0xdd, 0xbb, 0xb5, 0x0, 0xd3, 0x66, 0x66, + 0x58, 0x4, 0x40, 0x1, 0xd1, 0x33, 0x33, 0x1c, + 0xd, 0x20, 0x2, 0xb4, 0xda, 0xab, 0xc, 0x89, + 0x0, 0x4, 0x94, 0x80, 0xc, 0x7, 0xe0, 0x23, + 0x9, 0x54, 0xda, 0xac, 0x6d, 0xd4, 0x56, 0xd, + 0x0, 0x0, 0x11, 0xa1, 0x1b, 0xe2, 0x0, 0x0, + 0x80, 0x79, 0x0, 0x5, 0x0, 0x1, 0xd1, 0xe0, + 0xa, 0x60, 0x49, 0x60, 0xa, 0x51, 0xe0, 0x0, + 0x10, 0xd1, 0xd0, 0x7, 0x0, 0xbc, 0xcc, 0xcd, + 0x80, 0x30, + + /* U+614B "態" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x41, 0x0, 0xe0, 0x3, 0x10, 0x0, 0xb6, + 0xb, 0x50, 0xe6, 0xca, 0x20, 0xb, 0xeb, 0xbc, + 0xe2, 0xe6, 0x10, 0x50, 0x3, 0x54, 0x33, 0x52, + 0xc6, 0x56, 0xd0, 0x3, 0xc6, 0x67, 0xc0, 0x65, + 0x55, 0x10, 0x3, 0xd9, 0x9a, 0xc0, 0xe0, 0x6, + 0x50, 0x3, 0xb3, 0x34, 0xc0, 0xea, 0xb6, 0x10, + 0x3, 0xc5, 0x56, 0xc0, 0xe0, 0x0, 0x80, 0x3, + 0xa0, 0x4b, 0xa0, 0xbb, 0xaa, 0xc0, 0x0, 0x20, + 0x10, 0x58, 0x2, 0x26, 0x10, 0x3, 0xb0, 0xe0, + 0xb, 0x31, 0x7, 0x80, 0xc, 0x40, 0xe0, 0x1, + 0x7, 0x51, 0xe0, 0x5, 0x0, 0xad, 0xcc, 0xcd, + 0x10, 0x50, + + /* U+6163 "慣" */ + 0x0, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb1, 0x6, 0xda, 0xdc, 0xae, 0x20, 0x0, 0xb4, + 0x4c, 0xb7, 0xba, 0x7d, 0xa3, 0x9, 0xb9, 0x5a, + 0x52, 0xa4, 0x2d, 0x31, 0x9, 0xb4, 0x77, 0xaa, + 0xaa, 0xaa, 0x0, 0x47, 0xb2, 0x47, 0x99, 0x99, + 0x99, 0x20, 0x52, 0xb1, 0xc, 0x21, 0x11, 0x1a, + 0x40, 0x0, 0xb1, 0xc, 0xba, 0xaa, 0xad, 0x40, + 0x0, 0xb1, 0xc, 0x76, 0x66, 0x6c, 0x40, 0x0, + 0xb1, 0xc, 0x53, 0x33, 0x3b, 0x40, 0x0, 0xb1, + 0xb, 0xbb, 0xaa, 0xbd, 0x40, 0x0, 0xb1, 0x2, + 0xa7, 0x0, 0xb8, 0x10, 0x0, 0xb1, 0x9a, 0x30, + 0x0, 0x5, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6167 "慧" */ + 0x0, 0x9, 0x40, 0x0, 0xb, 0x20, 0x0, 0x8a, + 0xdb, 0xa2, 0x9a, 0xeb, 0xa5, 0x6, 0xad, 0xba, + 0x7, 0xae, 0xba, 0x20, 0x55, 0xc8, 0x53, 0x55, + 0xd6, 0x54, 0x3, 0x3a, 0x63, 0x23, 0x3c, 0x53, + 0x30, 0xa, 0xaa, 0xaa, 0xaa, 0xaa, 0x50, 0x0, + 0x12, 0x22, 0x22, 0x22, 0x87, 0x0, 0x3, 0x66, + 0x66, 0x66, 0x6a, 0x70, 0x0, 0xaa, 0xaa, 0xaa, + 0xaa, 0xc7, 0x0, 0x0, 0x1, 0x9, 0x10, 0x0, + 0x0, 0x0, 0xa0, 0xe0, 0x3c, 0x10, 0x2c, 0x0, + 0x77, 0xe, 0x0, 0x20, 0x84, 0x88, 0x8, 0x0, + 0xbd, 0xcc, 0xcd, 0x11, 0x90, + + /* U+616E "慮" */ + 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9c, 0xaa, 0xaa, 0x10, 0x0, 0x77, + 0x77, 0xca, 0x77, 0x77, 0x60, 0x0, 0xe5, 0x55, + 0xb7, 0x55, 0x66, 0xa0, 0x0, 0xe2, 0x99, 0xda, + 0x98, 0x73, 0x70, 0x0, 0xe0, 0x0, 0x3a, 0x99, + 0x99, 0x80, 0x0, 0xd0, 0x88, 0x88, 0x88, 0x88, + 0x0, 0x1, 0xc1, 0xc3, 0x3c, 0x53, 0x3e, 0x0, + 0x2, 0xb1, 0xc5, 0x5d, 0x65, 0x5e, 0x0, 0x3, + 0xa1, 0x98, 0xab, 0x88, 0x89, 0x0, 0x6, 0x72, + 0x27, 0x3c, 0x50, 0x17, 0x0, 0xb, 0x4b, 0x2d, + 0x0, 0x32, 0x57, 0x90, 0xd, 0x66, 0x9, 0xcc, + 0xcc, 0x50, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+61C9 "應" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x8, 0xcc, + 0xcc, 0xdf, 0xcc, 0xcc, 0xc1, 0xa, 0x30, 0x45, + 0x36, 0x28, 0x0, 0x0, 0xa, 0x30, 0xd1, 0xba, + 0x7e, 0x87, 0x40, 0xa, 0x3a, 0xd5, 0xf2, 0x2d, + 0x22, 0x10, 0xa, 0xcb, 0xdc, 0xd8, 0x8e, 0x88, + 0x10, 0xb, 0x50, 0xd0, 0xc8, 0x8e, 0x88, 0x10, + 0xc, 0x10, 0xd0, 0xc1, 0x1d, 0x11, 0x0, 0xd, + 0x0, 0xa0, 0xab, 0xaa, 0xaa, 0x80, 0xe, 0x0, + 0x11, 0x2b, 0x80, 0x30, 0x0, 0x1c, 0x6, 0x96, + 0x50, 0x73, 0x5b, 0x0, 0x68, 0x2d, 0x16, 0x50, + 0x4, 0x78, 0x80, 0x92, 0x54, 0x3, 0xdc, 0xcd, + 0x40, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+61F8 "懸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x1, + 0xea, 0xac, 0x65, 0x9b, 0xb9, 0x40, 0x1, 0xd7, + 0x7b, 0x60, 0x3a, 0x5, 0x0, 0x1, 0xd8, 0x8b, + 0x63, 0xea, 0xb8, 0x0, 0x1, 0xc4, 0x49, 0x60, + 0x3b, 0x55, 0x20, 0x1, 0xb3, 0x38, 0x66, 0xfa, + 0x9a, 0xc0, 0x9, 0xaa, 0xda, 0x93, 0x63, 0xa4, + 0x41, 0x4, 0xa2, 0xa8, 0x54, 0x91, 0xa3, 0xa0, + 0xa, 0x4a, 0x90, 0x56, 0x3b, 0x90, 0x31, 0x0, + 0x2, 0x10, 0xb7, 0x1, 0x1, 0x0, 0x0, 0xc0, + 0xd0, 0xb, 0x50, 0x4c, 0x10, 0x8, 0x70, 0xd0, + 0x0, 0x8, 0x25, 0xc0, 0x9, 0x0, 0x8c, 0xcc, + 0xcd, 0x0, 0x61, + + /* U+6210 "成" */ + 0x0, 0x0, 0x0, 0x1, 0xd1, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe0, 0x5e, 0x40, 0x0, 0x11, + 0x11, 0x12, 0xe1, 0x14, 0x80, 0x0, 0xfc, 0xcc, + 0xcc, 0xfd, 0xcc, 0xc7, 0x0, 0xe0, 0x0, 0x0, + 0xe1, 0x1, 0x20, 0x0, 0xfb, 0xbb, 0x80, 0xc3, + 0x8, 0x70, 0x0, 0xe2, 0x25, 0xb0, 0xa5, 0xe, + 0x10, 0x1, 0xd0, 0x3, 0xa0, 0x69, 0x89, 0x0, + 0x2, 0xc0, 0x4, 0x90, 0x2e, 0xe1, 0x0, 0x4, + 0xa0, 0x6, 0x80, 0x1f, 0x50, 0x14, 0x7, 0x77, + 0xdd, 0x31, 0xcd, 0x80, 0x2a, 0xd, 0x30, 0x0, + 0x3d, 0x51, 0xe4, 0x57, 0x2b, 0x0, 0x0, 0xc3, + 0x0, 0x3d, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6211 "我" */ + 0x0, 0x1, 0x59, 0xb1, 0xe0, 0x80, 0x0, 0xa, + 0xed, 0xe5, 0x10, 0xe0, 0x6c, 0x0, 0x2, 0x2, + 0xc0, 0x0, 0xf0, 0x8, 0x90, 0x0, 0x2, 0xc0, + 0x0, 0xf0, 0x0, 0x10, 0x2c, 0xcc, 0xfc, 0xcc, + 0xfc, 0xcc, 0xc2, 0x1, 0x13, 0xc1, 0x11, 0xc4, + 0x12, 0x10, 0x0, 0x2, 0xc0, 0x0, 0x96, 0xc, + 0x40, 0x0, 0x4, 0xea, 0xd5, 0x79, 0x8a, 0x0, + 0x3c, 0xec, 0xd4, 0x0, 0x3e, 0xd1, 0x0, 0x3, + 0x2, 0xc0, 0x0, 0x5f, 0x30, 0x21, 0x0, 0x2, + 0xc0, 0x7, 0xcb, 0x60, 0x66, 0x0, 0x2, 0xc1, + 0xc8, 0x2, 0xe2, 0x94, 0x4, 0xee, 0x70, 0x30, + 0x0, 0x5e, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6216 "或" */ + 0x0, 0x0, 0x0, 0x3, 0xc1, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xc0, 0x1b, 0x60, 0xa, 0xaa, + 0xaa, 0xab, 0xfa, 0xab, 0xb0, 0x3, 0x33, 0x33, + 0x34, 0xe3, 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xf0, 0x2, 0x0, 0x2, 0xfc, 0xcd, 0x90, 0xd1, + 0xc, 0x40, 0x2, 0xa0, 0x4, 0x90, 0xb4, 0x2d, + 0x0, 0x2, 0xa0, 0x4, 0x90, 0x87, 0xb6, 0x0, + 0x2, 0xec, 0xcd, 0x90, 0x5e, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0x20, 0x21, 0x0, 0x36, + 0xad, 0xd4, 0xdd, 0x50, 0x75, 0xe, 0xb7, 0x41, + 0x6c, 0x23, 0xe2, 0xa3, 0x0, 0x0, 0x4, 0xa0, + 0x0, 0x5e, 0xc0, + + /* U+6226 "戦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0x8, 0x40, 0x3a, 0xe, 0x9, 0x0, 0xd, 0x15, + 0x90, 0xa5, 0xe, 0x7, 0x90, 0x7, 0x41, 0x61, + 0xc0, 0xd, 0x0, 0xb1, 0x9, 0xaa, 0xaa, 0xb5, + 0xc, 0x23, 0x53, 0xd, 0x2, 0xb0, 0x6b, 0xdf, + 0xda, 0x83, 0xd, 0x9a, 0xe9, 0xb8, 0xa, 0x30, + 0x80, 0xd, 0x23, 0xc2, 0x77, 0x8, 0x54, 0xb0, + 0xd, 0x2, 0xb0, 0x67, 0x6, 0x7a, 0x40, 0x9, + 0xab, 0xea, 0xa5, 0x4, 0xcc, 0x0, 0x0, 0x2, + 0xc0, 0x0, 0x1, 0xf4, 0x0, 0x4c, 0xcd, 0xfc, + 0xcb, 0xa, 0xf3, 0x8, 0x0, 0x2, 0xc0, 0x3, + 0xc8, 0x5c, 0x68, 0x0, 0x2, 0xc0, 0x1b, 0x40, + 0x9, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6230 "戰" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0x5, 0x0, 0xd, + 0xae, 0x5c, 0xb9, 0xd, 0xa, 0x50, 0xb, 0xc, + 0x57, 0x39, 0xd, 0x1, 0xd1, 0x7, 0x88, 0x28, + 0x85, 0xc, 0x10, 0x31, 0x9, 0xbb, 0xbb, 0xb8, + 0xae, 0xed, 0xc5, 0xc, 0x1, 0xb0, 0x58, 0x4b, + 0x40, 0x40, 0xc, 0xbb, 0xeb, 0xd7, 0x8, 0x53, + 0xc0, 0xc, 0x1, 0xb0, 0x57, 0x6, 0x8b, 0x50, + 0xb, 0xbc, 0xeb, 0xd7, 0x3, 0xdc, 0x0, 0x0, + 0x2, 0xb0, 0x0, 0x1, 0xf3, 0x0, 0x4d, 0xdd, + 0xfd, 0xdc, 0x1c, 0xe4, 0xa, 0x0, 0x2, 0xb0, + 0x4, 0xd6, 0x4c, 0x58, 0x0, 0x2, 0xb0, 0xa, + 0x30, 0x9, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+623B "戻" */ + 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0xcc, + 0xcc, 0xdf, 0xcc, 0xcc, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xfb, 0xbb, 0xbb, 0xbb, + 0xbb, 0x0, 0x1, 0xd0, 0x0, 0x8, 0x30, 0x0, + 0x0, 0x2, 0xc0, 0x0, 0xc, 0x20, 0x0, 0x0, + 0x3, 0xaa, 0xdd, 0xdf, 0xed, 0xdd, 0x50, 0x6, + 0x80, 0x0, 0x6d, 0xb0, 0x0, 0x0, 0xa, 0x40, + 0x2, 0xd1, 0xa9, 0x0, 0x0, 0x1e, 0x0, 0x7d, + 0x30, 0x9, 0xc4, 0x0, 0x36, 0x5d, 0x81, 0x0, + 0x0, 0x29, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+623F "房" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x18, 0x91, 0x11, 0x10, 0x0, 0xeb, 0xbb, + 0xbb, 0xbb, 0xbe, 0x30, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0xec, 0xcc, 0xcd, 0xcc, 0xcd, + 0x20, 0xf, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0xf0, 0x0, 0x5, 0x80, 0x0, 0x0, 0x1e, 0x6c, + 0xcf, 0xcc, 0xcc, 0xc9, 0x2, 0xc0, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x3e, 0xcc, 0xcc, + 0xf0, 0x8, 0x60, 0xa, 0x30, 0x0, 0x3d, 0x0, + 0xe1, 0x8, 0xa0, 0x0, 0x7, 0xa0, 0x3a, 0xc, + 0x80, 0x0, 0xab, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+6240 "所" */ + 0x0, 0x0, 0x4, 0x0, 0x0, 0x5, 0x20, 0x5, + 0x8b, 0xea, 0x25, 0x8c, 0xe9, 0x30, 0xc, 0x62, + 0x0, 0xd, 0x51, 0x0, 0x0, 0xc, 0x43, 0x33, + 0xd, 0x10, 0x0, 0x0, 0xc, 0xaa, 0xae, 0xd, + 0x10, 0x0, 0x0, 0xc, 0x10, 0xe, 0xd, 0xee, + 0xfe, 0xe0, 0xd, 0x10, 0xe, 0xd, 0x10, 0xa3, + 0x0, 0xd, 0xdd, 0xdc, 0xe, 0x0, 0xa3, 0x0, + 0xe, 0x0, 0x0, 0xe, 0x0, 0xa3, 0x0, 0xe, + 0x0, 0x0, 0x2c, 0x0, 0xa3, 0x0, 0x2c, 0x0, + 0x0, 0x68, 0x0, 0xa3, 0x0, 0x67, 0x0, 0x0, + 0xd3, 0x0, 0xa3, 0x0, 0x92, 0x0, 0x4, 0x90, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+624B "手" */ + 0x0, 0x0, 0x0, 0x13, 0x57, 0xba, 0x0, 0x0, + 0xcd, 0xdd, 0xde, 0x86, 0x30, 0x0, 0x0, 0x10, + 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0x0, 0x2, 0xee, 0xee, 0xef, + 0xee, 0xee, 0xa0, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0xb, 0xbb, 0xbb, 0xce, 0xbb, 0xbb, 0xb5, + 0x3, 0x33, 0x33, 0x6c, 0x33, 0x33, 0x31, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x0, 0x0, 0x1, 0xee, 0xd5, + 0x0, 0x0, 0x0, + + /* U+624D "才" */ + 0x0, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0x0, 0xe, 0xee, 0xee, + 0xee, 0xff, 0xee, 0xe1, 0x0, 0x0, 0x0, 0x2e, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb7, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xb0, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x6d, 0x0, 0xb4, 0x0, 0x0, + 0x0, 0x8, 0xd1, 0x0, 0xb4, 0x0, 0x0, 0x1, + 0xac, 0x10, 0x0, 0xb4, 0x0, 0x0, 0x3e, 0x90, + 0x0, 0x0, 0xb4, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6253 "打" */ + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0xbb, 0xbb, 0xbb, 0xb6, 0x0, 0xe, + 0x0, 0x44, 0x44, 0xf5, 0x42, 0x2e, 0xef, 0xed, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xf0, 0x0, 0x0, 0xe, 0x59, 0x0, 0x0, 0xf0, + 0x0, 0x17, 0xbf, 0x94, 0x0, 0x0, 0xf0, 0x0, + 0x18, 0x3e, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x8, 0xea, 0x0, 0x7, + 0xee, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+6255 "払" */ + 0x0, 0xe, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0xd, 0xdf, 0xda, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x3, + 0xb0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x7, 0x80, + 0x0, 0x0, 0x0, 0xe, 0x46, 0xc, 0x40, 0x90, + 0x0, 0x7, 0xbf, 0x94, 0xe, 0x0, 0xa5, 0x0, + 0x8, 0x3e, 0x0, 0x5b, 0x0, 0x4c, 0x0, 0x0, + 0xe, 0x0, 0xa5, 0x0, 0xd, 0x40, 0x0, 0xe, + 0x1, 0xf1, 0x2, 0x4b, 0xa0, 0x0, 0xe, 0x8, + 0xfd, 0xdb, 0x86, 0xf0, 0x7, 0xdb, 0x2, 0x30, + 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+627E "找" */ + 0x0, 0xd, 0x0, 0x4, 0xa0, 0x50, 0x0, 0x0, + 0xd, 0x0, 0x3, 0xb0, 0xb7, 0x0, 0x0, 0xd, + 0x0, 0x1, 0xc0, 0xd, 0x10, 0x1d, 0xef, 0xd8, + 0x0, 0xe1, 0x35, 0x72, 0x0, 0xd, 0x2, 0xce, + 0xfc, 0xa8, 0x61, 0x0, 0xd, 0x0, 0x10, 0xc2, + 0x2, 0x10, 0x0, 0xd, 0x56, 0x0, 0xa4, 0xa, + 0x50, 0x17, 0xcf, 0x93, 0x0, 0x78, 0x5c, 0x0, + 0x17, 0x4d, 0x0, 0x0, 0x3d, 0xd2, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x2f, 0x50, 0x1, 0x0, 0xd, + 0x0, 0x4, 0xeb, 0xa0, 0x1b, 0x0, 0x1d, 0x2, + 0xbd, 0x21, 0xe6, 0x68, 0x9, 0xd9, 0x2, 0x60, + 0x0, 0x3d, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6280 "技" */ + 0x0, 0x77, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x77, + 0x6, 0x88, 0xae, 0x88, 0x81, 0x3d, 0xee, 0xd5, + 0x55, 0x7d, 0x55, 0x51, 0x0, 0x77, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x0, 0x77, 0x4, 0xaa, 0xbe, + 0xaa, 0x70, 0x0, 0x7a, 0x92, 0xc6, 0x33, 0x39, + 0x70, 0x3b, 0xfc, 0x50, 0x5b, 0x0, 0x1e, 0x0, + 0x14, 0x77, 0x0, 0xc, 0x50, 0xa7, 0x0, 0x0, + 0x77, 0x0, 0x1, 0xea, 0xa0, 0x0, 0x0, 0x77, + 0x0, 0x1, 0xcf, 0x50, 0x0, 0x0, 0x77, 0x2, + 0x8e, 0x62, 0xca, 0x30, 0xd, 0xe4, 0x4d, 0x71, + 0x0, 0x6, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+628A "把" */ + 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x76, 0x3, 0xfe, 0xef, 0xee, 0xe0, 0x0, 0x76, + 0x3, 0xc0, 0xd, 0x1, 0xe0, 0x3d, 0xee, 0xc3, + 0xc0, 0xd, 0x1, 0xe0, 0x0, 0x76, 0x3, 0xc0, + 0xd, 0x1, 0xe0, 0x0, 0x76, 0x3, 0xc0, 0xd, + 0x1, 0xe0, 0x0, 0x8a, 0x94, 0xeb, 0xbf, 0xbb, + 0xe0, 0x2b, 0xfc, 0x53, 0xc2, 0x22, 0x24, 0xe0, + 0x26, 0x96, 0x3, 0xc0, 0x0, 0x0, 0x40, 0x0, + 0x76, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x76, + 0x3, 0xc0, 0x0, 0x0, 0x49, 0x0, 0x86, 0x2, + 0xe0, 0x0, 0x0, 0x87, 0xa, 0xe3, 0x0, 0xbe, + 0xee, 0xee, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6295 "投" */ + 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x94, 0x0, 0xce, 0xdd, 0xe0, 0x0, 0x0, 0x94, + 0x0, 0xd1, 0x0, 0xe0, 0x0, 0x7d, 0xfe, 0xd1, + 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x94, 0x8, 0x90, + 0x0, 0xd7, 0x70, 0x0, 0x94, 0x2a, 0x0, 0x0, + 0x14, 0x40, 0x0, 0x99, 0x7b, 0xbb, 0xbb, 0xbb, + 0x10, 0x6d, 0xfa, 0x37, 0x82, 0x22, 0x6c, 0x0, + 0x32, 0x94, 0x0, 0xd1, 0x0, 0xd4, 0x0, 0x0, + 0x94, 0x0, 0x4d, 0x2c, 0x70, 0x0, 0x0, 0x94, + 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, 0x94, 0x3, + 0xbd, 0x7d, 0xb4, 0x0, 0x2d, 0xd2, 0xcc, 0x60, + 0x0, 0x6b, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+62BC "押" */ + 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x60, 0x4f, 0xdd, 0xfd, 0xdf, 0x0, 0x86, 0x4, + 0xa0, 0xe, 0x0, 0xe3, 0xef, 0xfe, 0x4a, 0x0, + 0xe0, 0xe, 0x0, 0x86, 0x4, 0xfd, 0xdf, 0xdd, + 0xf0, 0x8, 0x60, 0x4a, 0x0, 0xe0, 0xe, 0x0, + 0x89, 0x84, 0xa0, 0xe, 0x0, 0xe3, 0xbf, 0xb5, + 0x4f, 0xdd, 0xfd, 0xdf, 0x14, 0x86, 0x4, 0x90, + 0xe, 0x0, 0xc0, 0x8, 0x60, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x86, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x8, 0x60, 0x0, 0x0, 0xe0, 0x0, 0xc, 0xd3, + 0x0, 0x0, 0xe, 0x0, 0x0, + + /* U+62C5 "担" */ + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0xbe, 0xee, 0xee, 0xa0, 0x0, 0x1d, + 0x0, 0xd2, 0x11, 0x14, 0xb0, 0x1d, 0xef, 0xd7, + 0xd1, 0x0, 0x3, 0xb0, 0x0, 0x1d, 0x0, 0xd1, + 0x0, 0x3, 0xb0, 0x0, 0x1d, 0x0, 0xdd, 0xdd, + 0xde, 0xb0, 0x0, 0x1d, 0x44, 0xd1, 0x0, 0x3, + 0xb0, 0x16, 0xbf, 0xa3, 0xd1, 0x0, 0x3, 0xb0, + 0x19, 0x5d, 0x0, 0xd1, 0x0, 0x3, 0xb0, 0x0, + 0x1d, 0x0, 0xbe, 0xee, 0xee, 0xa0, 0x0, 0x1d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x2, + 0x22, 0x22, 0x22, 0x21, 0x9, 0xd9, 0xa, 0xbb, + 0xbb, 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+62C9 "拉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x67, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x67, 0x1, + 0x22, 0x48, 0x22, 0x20, 0x2d, 0xee, 0xd4, 0xbb, + 0xbb, 0xbb, 0xb1, 0x0, 0x67, 0x0, 0x11, 0x0, + 0x5, 0x0, 0x0, 0x67, 0x0, 0x49, 0x0, 0xe, + 0x0, 0x0, 0x68, 0x40, 0x1c, 0x0, 0x3b, 0x0, + 0x16, 0xcf, 0xa0, 0xe, 0x0, 0x68, 0x0, 0x29, + 0xa7, 0x0, 0xc, 0x20, 0x85, 0x0, 0x0, 0x67, + 0x0, 0x9, 0x40, 0xc2, 0x0, 0x0, 0x67, 0x0, + 0x8, 0x60, 0xd0, 0x0, 0x0, 0x77, 0x2, 0x23, + 0x25, 0xb2, 0x21, 0xa, 0xd4, 0xb, 0xbb, 0xbb, + 0xbb, 0xb5, + + /* U+62DB "招" */ + 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x94, 0x4, 0xdd, 0xfe, 0xdd, 0xf0, 0x0, 0x94, + 0x0, 0x0, 0xe0, 0x0, 0xe0, 0x5d, 0xfe, 0xd0, + 0x5, 0xa0, 0x0, 0xe0, 0x0, 0x94, 0x0, 0x1d, + 0x30, 0x2, 0xc0, 0x0, 0x94, 0x4, 0xd6, 0x2, + 0x8b, 0x80, 0x0, 0x99, 0x94, 0x30, 0x0, 0x43, + 0x0, 0x4c, 0xfa, 0x20, 0xcd, 0xdd, 0xdd, 0xb0, + 0x23, 0x94, 0x0, 0xe0, 0x0, 0x1, 0xd0, 0x0, + 0x94, 0x0, 0xe0, 0x0, 0x1, 0xd0, 0x0, 0x94, + 0x0, 0xe0, 0x0, 0x1, 0xd0, 0x0, 0x94, 0x0, + 0xeb, 0xaa, 0xab, 0xd0, 0xd, 0xd2, 0x0, 0xd2, + 0x22, 0x23, 0xc0, + + /* U+62E1 "拡" */ + 0x0, 0x85, 0x0, 0x0, 0x72, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, 0x85, + 0x4, 0xaa, 0xaf, 0xaa, 0xa2, 0x4d, 0xfe, 0xc7, + 0x94, 0x44, 0x44, 0x41, 0x0, 0x85, 0x7, 0x60, + 0xa, 0x0, 0x0, 0x0, 0x85, 0x7, 0x60, 0x3c, + 0x0, 0x0, 0x0, 0x88, 0x68, 0x50, 0x77, 0x0, + 0x0, 0x28, 0xec, 0x69, 0x40, 0xb3, 0x44, 0x0, + 0x36, 0x95, 0xb, 0x30, 0xe0, 0x1c, 0x0, 0x0, + 0x85, 0xd, 0x15, 0x90, 0xa, 0x30, 0x0, 0x85, + 0x2c, 0xc, 0x30, 0x4, 0xa0, 0x0, 0x85, 0x97, + 0x4f, 0xbd, 0xdc, 0xe1, 0xc, 0xd2, 0xa0, 0x15, + 0x30, 0x0, 0x63, + + /* U+62EC "括" */ + 0x0, 0x85, 0x0, 0x0, 0x13, 0x6a, 0x90, 0x0, + 0x85, 0x3, 0xcd, 0xdf, 0x74, 0x0, 0x1, 0x96, + 0x10, 0x0, 0xe, 0x0, 0x0, 0x4c, 0xed, 0xc0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x85, 0x6, 0xbb, + 0xbf, 0xbb, 0xb7, 0x0, 0x85, 0x1, 0x22, 0x3e, + 0x22, 0x21, 0x0, 0x87, 0x71, 0x0, 0xe, 0x0, + 0x0, 0x28, 0xee, 0x81, 0x0, 0xe, 0x0, 0x0, + 0x48, 0xa5, 0x1, 0xfd, 0xdd, 0xde, 0xd0, 0x0, + 0x85, 0x1, 0xd0, 0x0, 0x1, 0xd0, 0x0, 0x85, + 0x1, 0xd0, 0x0, 0x1, 0xd0, 0x0, 0x85, 0x1, + 0xe2, 0x22, 0x23, 0xd0, 0x1d, 0xd2, 0x1, 0xfb, + 0xbb, 0xbb, 0xc0, + + /* U+62ED "拭" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x0, 0x1, 0xd5, 0x40, 0x0, 0x85, + 0x0, 0x0, 0x1, 0xe0, 0xc2, 0x0, 0x85, 0x0, + 0x0, 0x0, 0xe0, 0x33, 0x4d, 0xfe, 0xca, 0xee, + 0xee, 0xfe, 0xe6, 0x0, 0x85, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x85, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x0, 0x88, 0x77, 0xdd, 0xd8, 0xd1, 0x0, + 0x3a, 0xec, 0x60, 0xd, 0x0, 0xb2, 0x0, 0x25, + 0x95, 0x0, 0xd, 0x0, 0x94, 0x0, 0x0, 0x85, + 0x0, 0xd, 0x0, 0x77, 0x1, 0x0, 0x85, 0x0, + 0x2e, 0x8b, 0x5b, 0x39, 0x0, 0x95, 0xe, 0xc9, + 0x63, 0xe, 0x86, 0x1d, 0xc2, 0x0, 0x0, 0x0, + 0x6, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+62FF "拿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x67, 0xb4, 0x0, 0x0, 0x3, 0x8e, 0xd6, + 0x44, 0x6d, 0xd9, 0x40, 0x3b, 0x51, 0x55, 0x55, + 0x55, 0x15, 0xa2, 0x0, 0x4c, 0xaa, 0xaa, 0xaa, + 0xd3, 0x0, 0x0, 0x4b, 0x33, 0x33, 0x33, 0xc3, + 0x0, 0x0, 0x16, 0x66, 0x66, 0x66, 0x92, 0x0, + 0x0, 0xaa, 0xaa, 0xbb, 0xaa, 0x83, 0x0, 0x1, + 0x54, 0x44, 0xa9, 0x44, 0x44, 0x20, 0x2, 0x66, + 0x66, 0xba, 0x66, 0x66, 0x20, 0x1b, 0xbb, 0xbb, + 0xdd, 0xbb, 0xbb, 0xb1, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xd4, 0x0, + 0x0, 0x0, + + /* U+6301 "持" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x76, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x76, 0x1, + 0xff, 0xff, 0xff, 0xe0, 0x4d, 0xee, 0xc0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x76, 0xb, 0xdd, 0xdd, 0xef, + 0xd8, 0x0, 0x79, 0x70, 0x0, 0x0, 0x2b, 0x0, + 0x4b, 0xfa, 0x39, 0xdd, 0xdd, 0xef, 0xd7, 0x23, + 0x76, 0x0, 0x23, 0x0, 0x2c, 0x0, 0x0, 0x76, + 0x0, 0x2d, 0x0, 0x2b, 0x0, 0x0, 0x76, 0x0, + 0x8, 0x80, 0x2b, 0x0, 0x0, 0x76, 0x0, 0x0, + 0x30, 0x2b, 0x0, 0xc, 0xd2, 0x0, 0x0, 0xd, + 0xe7, 0x0, + + /* U+6307 "指" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x85, + 0x0, 0xe0, 0x4, 0x9d, 0x20, 0x0, 0x85, 0x0, + 0xfc, 0xda, 0x50, 0x0, 0x7d, 0xfe, 0xd1, 0xe1, + 0x0, 0x0, 0x63, 0x0, 0x85, 0x0, 0xe1, 0x0, + 0x0, 0xb3, 0x0, 0x85, 0x0, 0x7c, 0xdd, 0xdd, + 0x90, 0x0, 0x88, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xed, 0x71, 0xfc, 0xcc, 0xcd, 0xc0, 0x45, + 0x95, 0x0, 0xe0, 0x0, 0x1, 0xc0, 0x0, 0x85, + 0x0, 0xfc, 0xcc, 0xcc, 0xc0, 0x0, 0x85, 0x0, + 0xe0, 0x0, 0x1, 0xc0, 0x0, 0x85, 0x0, 0xe2, + 0x22, 0x24, 0xc0, 0x1d, 0xe3, 0x0, 0xfa, 0xaa, + 0xaa, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6319 "挙" */ + 0x0, 0x21, 0x2, 0x40, 0x0, 0x32, 0x0, 0x0, + 0x5b, 0x0, 0xd2, 0x0, 0xd3, 0x0, 0x0, 0xa, + 0x50, 0x66, 0x9, 0x70, 0x0, 0x2d, 0xdd, 0xfd, + 0xdd, 0xdf, 0xdd, 0xd3, 0x0, 0x5, 0xc0, 0x0, + 0x1a, 0x60, 0x0, 0x0, 0x4e, 0xaa, 0xbc, 0xa4, + 0xc6, 0x0, 0x1a, 0xd1, 0x21, 0x86, 0x0, 0x9, + 0xc2, 0x26, 0x3c, 0xcc, 0xed, 0xcc, 0xc1, 0x41, + 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0xb, + 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0xb0, 0x0, 0x0, + 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbc, 0xd3, + 0x0, 0x0, 0x0, + + /* U+6355 "捕" */ + 0x0, 0x67, 0x0, 0x0, 0x1c, 0x66, 0x0, 0x0, + 0x67, 0x0, 0x0, 0x1c, 0x7, 0xa0, 0x1, 0x78, + 0x1b, 0xdd, 0xdf, 0xdd, 0xd3, 0x6f, 0xff, 0xf1, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x67, 0x0, 0x11, + 0x2d, 0x11, 0x10, 0x0, 0x67, 0x6, 0xeb, 0xcf, + 0xbb, 0xe0, 0x0, 0x68, 0x57, 0x80, 0x1c, 0x0, + 0xe0, 0x38, 0xed, 0x77, 0xec, 0xdf, 0xcc, 0xe0, + 0x45, 0x87, 0x6, 0x80, 0x1c, 0x0, 0xe0, 0x0, + 0x67, 0x6, 0xec, 0xdf, 0xcc, 0xe0, 0x0, 0x67, + 0x6, 0x80, 0x1c, 0x0, 0xe0, 0x0, 0x77, 0x6, + 0x80, 0x1c, 0x0, 0xe0, 0xc, 0xd4, 0x6, 0x80, + 0x1b, 0x4c, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6368 "捨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x66, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, 0x66, + 0x0, 0xa, 0x9c, 0x10, 0x0, 0x0, 0x66, 0x0, + 0x69, 0x4, 0xc3, 0x0, 0x1e, 0xff, 0xc9, 0xa0, + 0x0, 0x3d, 0x80, 0x0, 0x66, 0x47, 0x8d, 0xfd, + 0xd2, 0x83, 0x0, 0x66, 0x0, 0x0, 0xb1, 0x0, + 0x0, 0x0, 0x69, 0x5d, 0xdd, 0xfd, 0xdd, 0xa0, + 0x1a, 0xeb, 0x30, 0x0, 0xb1, 0x0, 0x0, 0x4, + 0x76, 0x4, 0xcc, 0xfc, 0xca, 0x0, 0x0, 0x66, + 0x5, 0x60, 0x0, 0xd, 0x0, 0x0, 0x66, 0x5, + 0x60, 0x0, 0xd, 0x0, 0x0, 0x66, 0x5, 0x72, + 0x22, 0x2d, 0x0, 0xb, 0xd3, 0x5, 0xca, 0xaa, + 0xad, 0x0, + + /* U+6388 "授" */ + 0x0, 0x85, 0x0, 0x1, 0x35, 0x7a, 0x50, 0x0, + 0x85, 0x7, 0xba, 0x97, 0x42, 0x10, 0x1, 0x86, + 0x11, 0x80, 0x84, 0x7, 0x70, 0x4c, 0xed, 0xb0, + 0xc1, 0x38, 0x1c, 0x0, 0x0, 0x85, 0x8, 0xba, + 0xaa, 0xcc, 0xa1, 0x0, 0x85, 0xd, 0x22, 0x22, + 0x22, 0xc1, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x71, 0x2a, 0xfb, 0x52, 0xdd, 0xcc, 0xcd, 0x10, + 0x25, 0x85, 0x0, 0x68, 0x0, 0x4a, 0x0, 0x0, + 0x85, 0x0, 0xc, 0x42, 0xc1, 0x0, 0x0, 0x85, + 0x0, 0x1, 0xee, 0x20, 0x0, 0x0, 0x85, 0x1, + 0x5c, 0xaa, 0xc5, 0x0, 0xd, 0xe2, 0x2d, 0x82, + 0x0, 0x39, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6392 "排" */ + 0x0, 0x68, 0x0, 0x0, 0xd0, 0xd0, 0x0, 0x0, + 0x68, 0x0, 0x0, 0xe0, 0xe0, 0x0, 0x0, 0x68, + 0x0, 0x55, 0xe0, 0xf5, 0x51, 0x2d, 0xef, 0xd2, + 0x88, 0xe0, 0xf8, 0x82, 0x0, 0x68, 0x0, 0x0, + 0xe0, 0xe0, 0x0, 0x0, 0x68, 0x0, 0x23, 0xe0, + 0xe2, 0x20, 0x0, 0x68, 0x21, 0xaa, 0xe0, 0xfa, + 0xa1, 0x28, 0xdd, 0x81, 0x0, 0xe0, 0xe0, 0x0, + 0x14, 0x68, 0x5, 0xbb, 0xe0, 0xfa, 0xa4, 0x0, + 0x68, 0x0, 0x22, 0xe0, 0xe2, 0x21, 0x0, 0x68, + 0x0, 0x0, 0xe0, 0xe0, 0x0, 0x0, 0x68, 0x0, + 0x0, 0xe0, 0xe0, 0x0, 0xa, 0xe4, 0x0, 0x0, + 0xe0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+639B "掛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x66, 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0x66, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0x66, 0xc, + 0xdf, 0xd5, 0xd0, 0x0, 0x2d, 0xee, 0xa0, 0xd, + 0x0, 0xd0, 0x0, 0x0, 0x66, 0x0, 0xd, 0x0, + 0xd0, 0x0, 0x0, 0x66, 0x3c, 0xcc, 0xc9, 0xdb, + 0x10, 0x0, 0x6a, 0x90, 0xa, 0x0, 0xd4, 0xd2, + 0x2b, 0xfb, 0x30, 0xd, 0x0, 0xd0, 0x35, 0x13, + 0x66, 0x1c, 0xcf, 0xc7, 0xd0, 0x0, 0x0, 0x66, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0x66, 0x0, + 0xd, 0x24, 0xd0, 0x0, 0x0, 0x66, 0x6b, 0xcb, + 0x95, 0xd0, 0x0, 0xb, 0xd3, 0x11, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+63A1 "採" */ + 0x0, 0x85, 0x0, 0x0, 0x1, 0x47, 0x70, 0x0, + 0x85, 0x8, 0xcd, 0xdc, 0x96, 0x20, 0x0, 0x85, + 0x1, 0x10, 0x42, 0x0, 0x63, 0x4d, 0xfe, 0xc6, + 0x70, 0x58, 0x0, 0xd1, 0x0, 0x85, 0x0, 0xd0, + 0x1c, 0x7, 0x70, 0x0, 0x85, 0x0, 0x61, 0x8, + 0xc, 0x0, 0x0, 0x8a, 0x90, 0x0, 0xd, 0x0, + 0x0, 0x3c, 0xfa, 0x3b, 0xdd, 0xdf, 0xdd, 0xd6, + 0x23, 0x85, 0x0, 0x3, 0xdf, 0xc0, 0x0, 0x0, + 0x85, 0x0, 0x2d, 0x3d, 0x6a, 0x0, 0x0, 0x85, + 0x5, 0xd4, 0xd, 0x8, 0xa0, 0x0, 0x85, 0x5c, + 0x10, 0xd, 0x0, 0x69, 0xd, 0xd2, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+63A2 "探" */ + 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0xa, 0xdd, 0xdd, 0xdd, 0xf0, 0x0, 0x67, + 0xa, 0x30, 0x0, 0x10, 0xd0, 0x1d, 0xee, 0xc4, + 0x18, 0x80, 0xc3, 0x50, 0x0, 0x67, 0x0, 0x7c, + 0x0, 0x1d, 0x20, 0x0, 0x67, 0x8, 0xb0, 0x6, + 0x4, 0xa0, 0x0, 0x6a, 0x80, 0x0, 0xd, 0x0, + 0x0, 0x8, 0xec, 0x5b, 0xdd, 0xef, 0xdd, 0xd2, + 0x7, 0x77, 0x0, 0x2, 0xdf, 0xb0, 0x0, 0x0, + 0x67, 0x0, 0xc, 0x3d, 0x77, 0x0, 0x0, 0x67, + 0x3, 0xc5, 0xd, 0xc, 0x60, 0x0, 0x67, 0x4d, + 0x30, 0xd, 0x0, 0xc5, 0x9, 0xd4, 0x0, 0x0, + 0xd, 0x0, 0x0, + + /* U+63A5 "接" */ + 0x0, 0x76, 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, + 0x76, 0x2, 0x55, 0x8c, 0x55, 0x50, 0x0, 0x76, + 0x3, 0x9a, 0x88, 0x9a, 0x81, 0x2d, 0xee, 0xb0, + 0x2c, 0x0, 0x5a, 0x0, 0x0, 0x76, 0x0, 0x9, + 0x30, 0xd1, 0x0, 0x0, 0x76, 0xb, 0xcc, 0xdd, + 0xdc, 0xc6, 0x0, 0x79, 0x50, 0x1, 0xd0, 0x0, + 0x0, 0x2b, 0xfb, 0x5b, 0xbd, 0xeb, 0xbb, 0xb8, + 0x14, 0x86, 0x1, 0x4c, 0x11, 0x4c, 0x10, 0x0, + 0x76, 0x0, 0xd8, 0x0, 0xa6, 0x0, 0x0, 0x76, + 0x0, 0x28, 0xdb, 0xc0, 0x0, 0x0, 0x76, 0x0, + 0x16, 0xd9, 0xda, 0x20, 0xa, 0xd3, 0x1d, 0xb7, + 0x10, 0x6, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+63A7 "控" */ + 0x0, 0x76, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, + 0x76, 0x1, 0x11, 0x2e, 0x21, 0x11, 0x0, 0x76, + 0xa, 0xdc, 0xcc, 0xcc, 0xdb, 0x2d, 0xee, 0xca, + 0x30, 0x20, 0x10, 0x2b, 0x0, 0x76, 0x4, 0x19, + 0x80, 0x89, 0x2, 0x0, 0x76, 0x0, 0xa9, 0x0, + 0x6, 0xb0, 0x0, 0x78, 0x64, 0x60, 0x0, 0x0, + 0x52, 0x17, 0xdd, 0x60, 0xdd, 0xdd, 0xdd, 0xc0, + 0x28, 0x96, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x76, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x76, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0xc, 0xe3, 0x1d, 0xdd, + 0xdd, 0xdd, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+63A8 "推" */ + 0x0, 0x95, 0x0, 0x29, 0x19, 0x0, 0x0, 0x0, + 0x95, 0x0, 0x87, 0xc, 0x30, 0x0, 0x0, 0x95, + 0x0, 0xe6, 0x38, 0x93, 0x30, 0x5e, 0xfe, 0xd4, + 0xfa, 0xae, 0xaa, 0xa0, 0x0, 0x95, 0xd, 0xe0, + 0xc, 0x10, 0x0, 0x0, 0x95, 0x89, 0xe2, 0x2d, + 0x42, 0x20, 0x0, 0x95, 0x80, 0xfa, 0xae, 0xaa, + 0x80, 0x28, 0xdc, 0x60, 0xe0, 0xc, 0x10, 0x0, + 0x24, 0x95, 0x0, 0xfd, 0xdf, 0xdd, 0xa0, 0x0, + 0x95, 0x0, 0xe0, 0xd, 0x10, 0x0, 0x0, 0x95, + 0x0, 0xe0, 0xc, 0x10, 0x0, 0x0, 0x95, 0x0, + 0xfd, 0xdf, 0xdd, 0xd4, 0xd, 0xe2, 0x0, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+63CF "描" */ + 0x0, 0x75, 0x0, 0xe, 0x0, 0x1c, 0x0, 0x0, + 0x75, 0x0, 0xe, 0x0, 0x1c, 0x0, 0x0, 0x75, + 0xa, 0xcf, 0xcc, 0xcf, 0xc8, 0x3d, 0xee, 0xc2, + 0x2e, 0x22, 0x4d, 0x21, 0x0, 0x75, 0x0, 0xb, + 0x0, 0x1a, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x76, 0x33, 0xec, 0xcf, 0xcc, + 0xf2, 0x28, 0xdc, 0x73, 0x90, 0x1e, 0x0, 0xb2, + 0x14, 0x85, 0x3, 0xda, 0xaf, 0xaa, 0xe2, 0x0, + 0x75, 0x3, 0xb3, 0x4e, 0x33, 0xc2, 0x0, 0x75, + 0x3, 0x90, 0x1e, 0x0, 0xb2, 0x0, 0x85, 0x3, + 0xeb, 0xbf, 0xbb, 0xe2, 0xc, 0xd2, 0x3, 0xa1, + 0x11, 0x11, 0xb2, + + /* U+63D0 "提" */ + 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x1, 0xfb, 0xbb, 0xbe, 0x30, 0x0, 0x85, + 0x1, 0xd4, 0x44, 0x4c, 0x30, 0x4d, 0xfe, 0xc1, + 0xd5, 0x55, 0x5c, 0x30, 0x0, 0x85, 0x1, 0xe8, + 0x88, 0x8d, 0x30, 0x0, 0x85, 0x0, 0x22, 0x22, + 0x22, 0x0, 0x0, 0x88, 0x79, 0xcc, 0xcc, 0xcc, + 0xc0, 0x29, 0xec, 0x50, 0x10, 0x1c, 0x0, 0x0, + 0x38, 0xa5, 0x0, 0xe0, 0x1c, 0x0, 0x0, 0x0, + 0x85, 0x3, 0xe0, 0x1f, 0xcc, 0x40, 0x0, 0x85, + 0x7, 0xe6, 0x1c, 0x0, 0x0, 0x0, 0x85, 0x2e, + 0x2d, 0x8c, 0x0, 0x0, 0xb, 0xe3, 0xb5, 0x1, + 0x9d, 0xdd, 0xd4, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+63DB "換" */ + 0x0, 0xc0, 0x0, 0xc, 0x10, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x5f, 0xcc, 0x40, 0x0, 0x1, 0xc0, + 0x2, 0xd2, 0xb, 0x10, 0x0, 0x8c, 0xfc, 0x3d, + 0xe9, 0xbd, 0x99, 0x0, 0x0, 0xc0, 0x28, 0xa2, + 0x33, 0x2c, 0x0, 0x0, 0xc0, 0x2, 0x94, 0x69, + 0x2b, 0x0, 0x0, 0xd7, 0x12, 0x9a, 0x1, 0x9b, + 0x0, 0x4b, 0xf8, 0x2, 0xb6, 0x42, 0x7b, 0x0, + 0x75, 0xc0, 0x2, 0x90, 0x92, 0xb, 0x0, 0x0, + 0xc0, 0x8c, 0xcc, 0xfe, 0xcc, 0xc0, 0x0, 0xc0, + 0x0, 0x5, 0xab, 0x10, 0x0, 0x0, 0xc0, 0x0, + 0x7b, 0x2, 0xc5, 0x0, 0x4e, 0x90, 0xab, 0x60, + 0x0, 0x17, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+63EE "揮" */ + 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0xb, 0xdc, 0xcc, 0xcc, 0xe5, 0x0, 0x85, + 0xb, 0x20, 0x9, 0x0, 0x75, 0x4d, 0xfe, 0xc5, + 0xcc, 0xcf, 0xcc, 0xc1, 0x0, 0x85, 0x0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0x85, 0x1, 0xeb, 0xbf, + 0xbb, 0xc0, 0x0, 0x88, 0x71, 0xb0, 0xc, 0x0, + 0xd0, 0x29, 0xec, 0x51, 0xea, 0xbf, 0xaa, 0xd0, + 0x24, 0x85, 0x1, 0xd4, 0x5d, 0x45, 0xd0, 0x0, + 0x85, 0x0, 0x44, 0x5d, 0x44, 0x30, 0x0, 0x85, + 0x2c, 0xcc, 0xcf, 0xcc, 0xc8, 0x0, 0x85, 0x0, + 0x0, 0xc, 0x0, 0x0, 0xd, 0xd2, 0x0, 0x0, + 0xc, 0x0, 0x0, + + /* U+63FA "揺" */ + 0x0, 0x67, 0x0, 0x0, 0x2, 0x47, 0x60, 0x0, + 0x67, 0xa, 0xcc, 0xca, 0x86, 0x30, 0x0, 0x67, + 0x1, 0x50, 0x63, 0x2, 0xc0, 0x5d, 0xee, 0xd1, + 0xd1, 0x48, 0xa, 0x50, 0x0, 0x67, 0x0, 0x63, + 0x14, 0x1c, 0x0, 0x0, 0x67, 0x9, 0xcc, 0xdd, + 0xdd, 0xc2, 0x0, 0x7a, 0x81, 0x0, 0x1c, 0x0, + 0x0, 0x4b, 0xfb, 0x5c, 0xcc, 0xcf, 0xcc, 0xc6, + 0x33, 0x77, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, + 0x67, 0x6, 0x70, 0x1c, 0x0, 0xc0, 0x0, 0x67, + 0x6, 0x80, 0x1c, 0x0, 0xd0, 0x0, 0x77, 0x6, + 0xdb, 0xce, 0xbb, 0xd0, 0xc, 0xd4, 0x6, 0x81, + 0x11, 0x11, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+643A "携" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x75, 0x3a, 0x0, 0x0, 0x0, 0x85, + 0x0, 0xe6, 0x4e, 0x64, 0x40, 0x0, 0x85, 0x6, + 0xe8, 0x8e, 0x88, 0x70, 0x1d, 0xfe, 0xbe, 0xe8, + 0x8e, 0x88, 0x50, 0x0, 0x85, 0x23, 0xd1, 0x1d, + 0x11, 0x10, 0x0, 0x85, 0x0, 0xe9, 0x9f, 0x99, + 0x70, 0x0, 0x86, 0x30, 0xd1, 0x1e, 0x11, 0x10, + 0x5, 0xcd, 0x60, 0xd9, 0x99, 0x99, 0x92, 0x7, + 0xa5, 0x8, 0xab, 0xaa, 0xa0, 0x0, 0x0, 0x85, + 0x0, 0xd, 0x4, 0xeb, 0xb4, 0x0, 0x85, 0x0, + 0x59, 0x0, 0x0, 0xa3, 0x0, 0x85, 0x2, 0xd2, + 0x0, 0x0, 0xd1, 0xb, 0xe3, 0x4d, 0x30, 0x1, + 0xcc, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+64C1 "擁" */ + 0x0, 0xc0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc0, + 0x8d, 0xdd, 0xdd, 0xdd, 0xd3, 0x3b, 0xfb, 0x17, + 0x20, 0x26, 0x70, 0x0, 0x2, 0xd3, 0xc, 0x0, + 0x86, 0x87, 0x20, 0x0, 0xc0, 0x68, 0x86, 0xe9, + 0xda, 0x91, 0x0, 0xc3, 0xab, 0xda, 0xf0, 0x92, + 0x0, 0x17, 0xfb, 0x17, 0x45, 0xcb, 0xeb, 0xa0, + 0x27, 0xd0, 0x3d, 0x88, 0xc0, 0x92, 0x0, 0x0, + 0xc0, 0x87, 0xb2, 0xcb, 0xeb, 0x90, 0x0, 0xc0, + 0x2, 0xc0, 0xc0, 0x92, 0x0, 0x0, 0xd0, 0x3d, + 0x30, 0xcc, 0xec, 0xc4, 0x1c, 0xc0, 0xc3, 0x0, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+64C7 "擇" */ + 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x5, 0xdb, 0xeb, 0xeb, 0xf0, 0x0, 0x67, + 0x5, 0x70, 0xc0, 0xb0, 0xc0, 0x1d, 0xee, 0xc4, + 0xba, 0xbe, 0xba, 0xb0, 0x0, 0x67, 0x1, 0x66, + 0x7d, 0x66, 0x40, 0x0, 0x67, 0x0, 0x33, 0x4d, + 0x33, 0x20, 0x0, 0x7c, 0xba, 0xcc, 0xcf, 0xcc, + 0xc1, 0x2e, 0xea, 0x10, 0xc, 0x0, 0x48, 0x0, + 0x1, 0x67, 0x5, 0x9d, 0xb9, 0xdb, 0x80, 0x0, + 0x67, 0x1, 0x22, 0x3c, 0x22, 0x20, 0x0, 0x67, + 0xb, 0xbb, 0xbf, 0xbb, 0xb4, 0x0, 0x67, 0x0, + 0x0, 0xc, 0x0, 0x0, 0xb, 0xd3, 0x0, 0x0, + 0xc, 0x0, 0x0, + + /* U+64D4 "擔" */ + 0x0, 0x75, 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x75, 0x0, 0x5e, 0xaa, 0xe4, 0x0, 0x0, 0x75, + 0x4, 0xf8, 0x56, 0xe5, 0x53, 0x1d, 0xee, 0x8c, + 0xd6, 0x7a, 0x69, 0x64, 0x0, 0x75, 0x2, 0xc2, + 0xb2, 0x18, 0x90, 0x0, 0x75, 0x2, 0xc5, 0x13, + 0x90, 0x32, 0x0, 0x78, 0x62, 0xc9, 0x99, 0xa9, + 0x97, 0x8, 0xeb, 0x33, 0xa4, 0x99, 0x99, 0x90, + 0x7, 0x95, 0x4, 0xa1, 0x44, 0x44, 0x30, 0x0, + 0x75, 0x5, 0x82, 0x55, 0x55, 0x50, 0x0, 0x75, + 0x8, 0x57, 0xca, 0xaa, 0xe1, 0x0, 0x85, 0xc, + 0x27, 0x60, 0x0, 0xc1, 0xa, 0xd2, 0x2b, 0x7, + 0xc9, 0x99, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+64DA "據" */ + 0x0, 0xd0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0xdb, 0xbb, 0x50, 0x0, 0xd0, + 0x5, 0x55, 0xe6, 0x55, 0x50, 0x7d, 0xfd, 0x2d, + 0x66, 0xe6, 0x66, 0xc0, 0x0, 0xd0, 0x1b, 0x57, + 0xea, 0xa4, 0x60, 0x0, 0xd0, 0x1b, 0x42, 0xd3, + 0x34, 0x70, 0x0, 0xd3, 0x2b, 0x0, 0x47, 0x77, + 0x10, 0x17, 0xfb, 0x4a, 0x9a, 0xdd, 0xaa, 0x70, + 0x67, 0xd0, 0x38, 0x48, 0xa6, 0x6, 0x70, 0x0, + 0xd0, 0x57, 0x44, 0x9b, 0xab, 0x0, 0x0, 0xd0, + 0x95, 0xa6, 0x5b, 0x7a, 0x10, 0x0, 0xd0, 0xd0, + 0x49, 0x53, 0x82, 0xb1, 0x3d, 0xa4, 0x64, 0x60, + 0x8c, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+652F "支" */ + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0xb, 0xcc, + 0xcc, 0xed, 0xcc, 0xcc, 0xa0, 0x2, 0x22, 0x22, + 0x98, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x86, + 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, 0x98, 0x22, + 0x20, 0x0, 0x3, 0xcf, 0xcc, 0xcc, 0xcc, 0xf7, + 0x0, 0x0, 0xa, 0x60, 0x0, 0x3, 0xd0, 0x0, + 0x0, 0x1, 0xe2, 0x0, 0x1d, 0x30, 0x0, 0x0, + 0x0, 0x3d, 0x43, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4, 0xad, + 0x77, 0xea, 0x40, 0x0, 0x3c, 0xea, 0x50, 0x0, + 0x6, 0xae, 0xd3, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, + + /* U+6539 "改" */ + 0x0, 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x9, + 0x99, 0x99, 0x0, 0xe0, 0x0, 0x0, 0x4, 0x44, + 0x4e, 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xa, 0xed, 0xdf, 0xe3, 0x0, 0x0, 0xe, 0x1f, + 0x50, 0xe, 0x10, 0xc, 0xee, 0xef, 0xa9, 0xa0, + 0x2d, 0x0, 0xd, 0x10, 0x0, 0x80, 0xd0, 0x69, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x96, 0xd3, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x2e, 0xb0, 0x0, 0xd, + 0x10, 0x49, 0x0, 0x1e, 0x80, 0x0, 0xe, 0x9e, + 0xb5, 0x1, 0xd7, 0xd5, 0x0, 0x1e, 0x81, 0x0, + 0x5e, 0x70, 0x2e, 0x80, 0x0, 0x0, 0x1, 0xb3, + 0x0, 0x1, 0x92, + + /* U+653E "放" */ + 0x0, 0x7, 0x0, 0x0, 0x44, 0x0, 0x0, 0x0, + 0xa, 0x40, 0x0, 0xa5, 0x0, 0x0, 0x15, 0x58, + 0x85, 0x50, 0xe2, 0x0, 0x0, 0x28, 0xdb, 0x88, + 0x83, 0xfd, 0xdf, 0xe6, 0x0, 0x94, 0x0, 0x9, + 0xc0, 0xa, 0x40, 0x0, 0x9e, 0xdd, 0x6d, 0xc0, + 0xd, 0x0, 0x0, 0x95, 0xa, 0x95, 0x85, 0x2c, + 0x0, 0x0, 0xb3, 0xb, 0x20, 0x3b, 0x86, 0x0, + 0x0, 0xd2, 0xb, 0x20, 0xc, 0xe0, 0x0, 0x0, + 0xe0, 0xc, 0x10, 0xa, 0xc0, 0x0, 0x4, 0xa0, + 0xd, 0x0, 0x7c, 0xc6, 0x0, 0xc, 0x30, 0xe, + 0x9, 0xd1, 0x1e, 0x70, 0x59, 0xa, 0xe8, 0xa9, + 0x0, 0x1, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+653F "政" */ + 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, 0x0, 0x29, + 0x99, 0x99, 0x91, 0xb4, 0x0, 0x0, 0x14, 0x47, + 0xc4, 0x41, 0xf1, 0x0, 0x0, 0x0, 0x4, 0xa0, + 0x4, 0xfd, 0xdf, 0xe5, 0x6, 0x24, 0xa0, 0xc, + 0xa0, 0xa, 0x40, 0xa, 0x34, 0xfd, 0xcc, 0xd0, + 0xe, 0x0, 0xa, 0x34, 0xa0, 0x63, 0xa3, 0x2c, + 0x0, 0xa, 0x34, 0xa0, 0x0, 0x59, 0x96, 0x0, + 0xa, 0x34, 0xa0, 0x0, 0xd, 0xd0, 0x0, 0xa, + 0x34, 0xc7, 0xb2, 0xb, 0xb0, 0x0, 0x3d, 0xde, + 0xa7, 0x30, 0x9b, 0xb7, 0x0, 0x36, 0x20, 0x0, + 0x2b, 0xb0, 0x1d, 0x90, 0x0, 0x0, 0x0, 0x76, + 0x0, 0x0, 0x93, + + /* U+6545 "故" */ + 0x0, 0x9, 0x50, 0x0, 0xa3, 0x0, 0x0, 0x0, + 0x9, 0x50, 0x0, 0xe1, 0x0, 0x0, 0x0, 0x9, + 0x50, 0x3, 0xd0, 0x0, 0x0, 0x2d, 0xdf, 0xed, + 0xc8, 0xed, 0xdf, 0xe5, 0x0, 0x9, 0x50, 0xe, + 0x90, 0xb, 0x30, 0x0, 0x9, 0x50, 0x8b, 0xc0, + 0xe, 0x0, 0x6, 0xad, 0xca, 0xa1, 0xc1, 0x2c, + 0x0, 0x9, 0x73, 0x3a, 0x50, 0x78, 0x96, 0x0, + 0x9, 0x40, 0x8, 0x50, 0x1e, 0xd0, 0x0, 0x9, + 0x40, 0x8, 0x50, 0xc, 0x90, 0x0, 0x9, 0x62, + 0x2a, 0x50, 0x9c, 0xe4, 0x0, 0x9, 0xcb, 0xbb, + 0x8c, 0xa0, 0x3e, 0x70, 0x2, 0x10, 0x1, 0xb3, + 0x0, 0x1, 0xa3, + + /* U+6548 "效" */ + 0x0, 0x6, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, + 0xb, 0x40, 0x0, 0x3b, 0x0, 0x0, 0x17, 0x79, + 0xb7, 0x71, 0x78, 0x0, 0x0, 0x5, 0x75, 0x57, + 0x50, 0xae, 0xee, 0xf4, 0x0, 0xd0, 0x1d, 0x10, + 0xe0, 0x8, 0x60, 0x8, 0x70, 0x5, 0xa6, 0xf0, + 0xb, 0x20, 0x3c, 0x30, 0x38, 0x5d, 0xb5, 0xd, + 0x0, 0x1, 0xa8, 0x94, 0x3, 0x3b, 0x5a, 0x0, + 0x0, 0xb, 0xe0, 0x0, 0xd, 0xc3, 0x0, 0x0, + 0xb, 0xe4, 0x0, 0x8, 0xc0, 0x0, 0x0, 0x7a, + 0x2e, 0x10, 0x2d, 0xd4, 0x0, 0x8, 0xc0, 0x6, + 0x33, 0xd4, 0x2e, 0x30, 0x2a, 0x0, 0x0, 0x7d, + 0x30, 0x3, 0xe3, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x10, + + /* U+6557 "敗" */ + 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0xe, + 0xcc, 0xcf, 0x1, 0xe0, 0x0, 0x0, 0xe, 0x0, + 0xe, 0x6, 0xb2, 0x22, 0x20, 0xe, 0xbb, 0xbf, + 0xb, 0xa8, 0x8f, 0x92, 0xe, 0x0, 0xe, 0x3f, + 0x60, 0xe, 0x0, 0xe, 0x0, 0xe, 0xca, 0xa0, + 0x3c, 0x0, 0xe, 0xcc, 0xcf, 0xa0, 0xd0, 0x78, + 0x0, 0xe, 0x0, 0xe, 0x0, 0xb4, 0xc3, 0x0, + 0xe, 0x11, 0x1e, 0x0, 0x4c, 0xc0, 0x0, 0x9, + 0xaa, 0xba, 0x0, 0xf, 0x70, 0x0, 0x2, 0xb0, + 0x93, 0x0, 0x8d, 0xe1, 0x0, 0xa, 0x50, 0x2d, + 0x18, 0xd0, 0x7d, 0x20, 0x6b, 0x0, 0x4, 0xda, + 0x10, 0x7, 0xe3, 0x1, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x10, + + /* U+6559 "教" */ + 0x0, 0x2b, 0x0, 0x42, 0x58, 0x0, 0x0, 0x0, + 0x2c, 0x1, 0xe1, 0xa6, 0x0, 0x0, 0xc, 0xdf, + 0xcf, 0x80, 0xe3, 0x0, 0x0, 0x0, 0x2b, 0x1e, + 0x12, 0xfc, 0xbd, 0xd5, 0x8d, 0xde, 0xfe, 0xdc, + 0xe0, 0xa, 0x50, 0x0, 0x9, 0xa0, 0x2f, 0xd2, + 0xe, 0x10, 0x6, 0xfd, 0xcf, 0x97, 0x76, 0x2d, + 0x0, 0x3d, 0x72, 0xb4, 0x0, 0x3c, 0x87, 0x0, + 0x23, 0xa, 0x51, 0x31, 0xc, 0xe1, 0x0, 0x6b, + 0xcf, 0xdb, 0x92, 0xa, 0xd0, 0x0, 0x12, 0xa, + 0x30, 0x0, 0x8c, 0xc8, 0x0, 0x0, 0xa, 0x30, + 0x1a, 0xc1, 0x1e, 0x80, 0x3, 0xcd, 0x10, 0xa8, + 0x0, 0x1, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6562 "敢" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x4, + 0xcc, 0xce, 0x50, 0x3c, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x10, 0x79, 0x11, 0x10, 0x1d, 0xdd, 0xdf, + 0xd9, 0xac, 0xce, 0xd7, 0x0, 0xd0, 0x6, 0x71, + 0xf2, 0x9, 0x40, 0x0, 0xd1, 0x17, 0x77, 0xf4, + 0xc, 0x10, 0x0, 0xea, 0xac, 0x7d, 0x78, 0xd, + 0x0, 0x0, 0xd0, 0x6, 0x72, 0x1d, 0x3a, 0x0, + 0x0, 0xfc, 0xcd, 0x70, 0xc, 0xb4, 0x0, 0x0, + 0xd0, 0x6, 0x81, 0x5, 0xf0, 0x0, 0x16, 0xfa, + 0xce, 0xd5, 0xc, 0xd6, 0x0, 0x27, 0x52, 0x6, + 0x71, 0xb8, 0x1d, 0x80, 0x0, 0x0, 0x6, 0x7b, + 0x60, 0x1, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6570 "数" */ + 0x2, 0x32, 0xb0, 0x60, 0xa, 0x0, 0x0, 0x2, + 0xb2, 0xb2, 0xb0, 0x3b, 0x0, 0x0, 0x1, 0x93, + 0xc6, 0x41, 0x78, 0x0, 0x0, 0xa, 0xad, 0xfb, + 0xa7, 0xbe, 0xde, 0xe6, 0x0, 0x5d, 0xdb, 0x61, + 0xf6, 0x8, 0x50, 0xa, 0xa2, 0xb0, 0x78, 0xab, + 0xb, 0x20, 0x4, 0x6, 0x30, 0xa, 0xc, 0x1d, + 0x0, 0x8, 0xbf, 0xbb, 0xa0, 0x8, 0xa8, 0x0, + 0x1, 0x97, 0x15, 0xa0, 0x2, 0xf2, 0x0, 0x0, + 0xe7, 0x2d, 0x20, 0x6, 0xf4, 0x0, 0x0, 0x8, + 0xfb, 0x0, 0x3c, 0x3d, 0x10, 0x3, 0x8c, 0x37, + 0x57, 0xd1, 0x5, 0xd3, 0x9, 0x40, 0x0, 0x39, + 0x0, 0x0, 0x45, + + /* U+6574 "整" */ + 0x0, 0x3, 0x90, 0x0, 0x2a, 0x0, 0x0, 0xb, + 0xbc, 0xeb, 0xb3, 0x8a, 0x55, 0x52, 0x4, 0x8a, + 0xd8, 0x71, 0xf7, 0x6c, 0xa3, 0x8, 0x44, 0xa1, + 0xcb, 0x97, 0x1e, 0x10, 0x8, 0xbb, 0xda, 0xd2, + 0xb, 0xa8, 0x0, 0x0, 0x2c, 0xc9, 0x20, 0x8, + 0xf3, 0x0, 0x8, 0xa4, 0x91, 0x65, 0xb6, 0x2c, + 0xa3, 0x3, 0x1, 0x20, 0x4, 0x10, 0x0, 0x52, + 0x2, 0xcc, 0xcc, 0xde, 0xcc, 0xcc, 0x60, 0x0, + 0x2, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x10, 0x5e, 0xcc, 0xc6, 0x0, 0x0, 0xc, 0x10, + 0x58, 0x0, 0x0, 0x0, 0x1c, 0xcf, 0xdc, 0xee, + 0xcc, 0xcc, 0xc7, + + /* U+6587 "文" */ + 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x10, 0x0, 0x0, 0x1e, 0xef, 0xee, + 0xee, 0xee, 0xfe, 0xe7, 0x0, 0x9, 0x60, 0x0, + 0x1, 0xe1, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x8, + 0x80, 0x0, 0x0, 0x0, 0x97, 0x0, 0x1e, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0x30, 0xb7, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe9, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x95, 0xe8, 0x0, 0x0, 0x0, 0x4a, 0xe4, + 0x0, 0x1a, 0xd7, 0x10, 0x1d, 0xc5, 0x0, 0x0, + 0x0, 0x39, 0xf6, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6599 "料" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xd, 0x0, 0x1a, 0xd, + 0xc, 0x6, 0x70, 0xd, 0x0, 0xc, 0xd, 0x1b, + 0x0, 0xaa, 0xd, 0x0, 0x9, 0x3d, 0x65, 0x0, + 0x6, 0xd, 0x0, 0x2, 0x1d, 0x30, 0x0, 0x0, + 0xd, 0x0, 0x4e, 0xef, 0xee, 0x5d, 0x40, 0xd, + 0x0, 0x0, 0x8f, 0x20, 0x1, 0xc4, 0xd, 0x0, + 0x0, 0xce, 0xc0, 0x0, 0x0, 0xd, 0x0, 0x6, + 0x7d, 0x5a, 0x0, 0x35, 0x8f, 0xd8, 0x1c, 0x1d, + 0x4, 0xad, 0xa8, 0x5e, 0x0, 0x56, 0xd, 0x0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+65AD "断" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x18, 0xd0, 0xd3, 0x1c, 0x6, + 0x15, 0xaf, 0xc7, 0x1d, 0x46, 0xc2, 0xc0, 0xe4, + 0x0, 0x0, 0xd0, 0x8c, 0x74, 0xe, 0x0, 0x0, + 0xd, 0x47, 0xd7, 0x72, 0xe0, 0x0, 0x0, 0xd3, + 0x6f, 0x75, 0x2f, 0xee, 0xfe, 0x6d, 0x7, 0xfc, + 0x20, 0xd0, 0xe, 0x0, 0xd1, 0xac, 0x2d, 0x2c, + 0x0, 0xe0, 0xd, 0xa2, 0xc0, 0x12, 0xb0, 0xe, + 0x0, 0xd0, 0xc, 0x0, 0x3a, 0x0, 0xe0, 0xd, + 0x0, 0x0, 0x6, 0x70, 0xe, 0x0, 0xbd, 0xdd, + 0xdd, 0xc3, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x1b, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+65B0 "新" */ + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x8, 0x70, 0x0, 0x48, 0xbd, 0x70, 0x1c, 0xcc, + 0xcd, 0xc4, 0xc4, 0x10, 0x0, 0x1, 0xc0, 0xd, + 0x3, 0xa0, 0x0, 0x0, 0x0, 0xb1, 0x4a, 0x3, + 0xa0, 0x0, 0x0, 0x4c, 0xcd, 0xdc, 0xc7, 0xfd, + 0xdf, 0xd5, 0x0, 0x6, 0x60, 0x3, 0xa0, 0xe, + 0x0, 0x3d, 0xde, 0xed, 0xd6, 0x90, 0xe, 0x0, + 0x0, 0x26, 0x63, 0x5, 0x70, 0xe, 0x0, 0x6, + 0x76, 0x6a, 0x27, 0x60, 0xe, 0x0, 0xd, 0x16, + 0x63, 0xaa, 0x30, 0xe, 0x0, 0x25, 0x6, 0x60, + 0x3d, 0x0, 0xe, 0x0, 0x0, 0x6d, 0x40, 0x56, + 0x0, 0xe, 0x0, + + /* U+65B7 "斷" */ + 0x0, 0x20, 0x3, 0x0, 0x0, 0x24, 0xd, 0xa, + 0x10, 0x91, 0x5, 0xbc, 0x50, 0xd7, 0xb8, 0xaa, + 0x70, 0xd1, 0x0, 0xd, 0x2a, 0x43, 0x94, 0xc, + 0x0, 0x0, 0xd8, 0x9a, 0x98, 0xa0, 0xd3, 0x33, + 0x2d, 0xbb, 0xcb, 0xbb, 0x1e, 0x8e, 0x84, 0xd0, + 0x50, 0x6, 0x0, 0xc0, 0xc0, 0xd, 0x18, 0x53, + 0x76, 0xb, 0xc, 0x0, 0xda, 0xb6, 0xbc, 0x41, + 0xa0, 0xc0, 0xd, 0x18, 0x42, 0x75, 0x39, 0xc, + 0x0, 0xd9, 0x9a, 0xa8, 0x97, 0x60, 0xc0, 0xd, + 0xcc, 0xcc, 0xc7, 0xc1, 0xc, 0x0, 0x0, 0x0, + 0x0, 0x18, 0x0, 0xc0, 0x0, + + /* U+65B9 "方" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x10, 0x0, 0x0, 0xd, 0xdd, 0xdf, + 0xdd, 0xdd, 0xdd, 0xd0, 0x0, 0x0, 0x2d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xee, 0xee, 0xfa, + 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, 0x68, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x6, 0xb0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x1e, + 0x30, 0x0, 0x0, 0xc3, 0x0, 0x2, 0xd7, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0x1e, 0x50, 0x0, 0x1e, + 0xee, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+65BC "於" */ + 0x0, 0x15, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, + 0xd, 0x30, 0x0, 0xf, 0x90, 0x0, 0x2, 0x27, + 0x82, 0x10, 0x7c, 0xe4, 0x0, 0xa, 0xec, 0xaa, + 0x62, 0xe2, 0x3e, 0x20, 0x0, 0xa4, 0x0, 0x3d, + 0x50, 0x5, 0xd4, 0x0, 0xac, 0xbb, 0x63, 0x13, + 0x0, 0x34, 0x0, 0xb4, 0x2e, 0x0, 0x2d, 0x70, + 0x0, 0x0, 0xc0, 0xe, 0x0, 0x1, 0xc4, 0x0, + 0x0, 0xd0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0x1d, 0x0, 0x30, 0x0, 0x0, 0x5, 0x90, + 0x2b, 0x2, 0xda, 0x10, 0x0, 0xc, 0x40, 0x59, + 0x0, 0x7, 0xe5, 0x0, 0x2c, 0xb, 0xe3, 0x0, + 0x0, 0x39, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+65BD "施" */ + 0x0, 0x13, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0xa, 0x50, 0x0, 0x0, 0x13, 0x3b, + 0x53, 0x1f, 0x98, 0x88, 0x82, 0x4a, 0xfa, 0xaa, + 0x9b, 0x56, 0x55, 0x51, 0x0, 0xe0, 0x2, 0xe4, + 0xc, 0x1, 0x30, 0x0, 0xf8, 0x84, 0x2d, 0xc, + 0xae, 0xa0, 0x1, 0xe5, 0x98, 0xd, 0x9f, 0x52, + 0xa0, 0x2, 0xb0, 0x58, 0x9f, 0x5c, 0x2, 0xa0, + 0x4, 0x90, 0x67, 0x4d, 0xc, 0x2, 0xa0, 0x7, + 0x70, 0x67, 0xd, 0xc, 0x4b, 0x70, 0xb, 0x30, + 0x76, 0xd, 0xb, 0x12, 0x10, 0x2e, 0x0, 0xa4, + 0xd, 0x0, 0x0, 0x84, 0x66, 0x5d, 0xc0, 0x8, + 0xdd, 0xdd, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+65C1 "旁" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x6, 0xaa, + 0xaa, 0xbf, 0xaa, 0xaa, 0xa0, 0x1, 0x23, 0xd3, + 0x22, 0x29, 0x72, 0x20, 0x0, 0x0, 0xa7, 0x0, + 0xe, 0x10, 0x0, 0x8, 0xdd, 0xee, 0xdd, 0xef, + 0xdd, 0xd0, 0xa, 0x30, 0x0, 0x44, 0x0, 0x0, + 0xe0, 0x4, 0x10, 0x0, 0x4d, 0x0, 0x0, 0x60, + 0x1d, 0xdd, 0xdf, 0xdd, 0xdd, 0xdd, 0xd5, 0x0, + 0x0, 0x4b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9e, 0xcc, 0xcc, 0xd8, 0x0, 0x0, 0x3, 0xe0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x6e, 0x30, 0x0, + 0x0, 0xb4, 0x0, 0x2e, 0x91, 0x0, 0x5, 0xcc, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+65C5 "旅" */ + 0x0, 0x14, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x7, 0x70, 0x0, 0x0, 0x2, 0x29, + 0x42, 0xd, 0xb9, 0x99, 0x92, 0x3b, 0xec, 0xbb, + 0x9a, 0x33, 0x47, 0x70, 0x0, 0xb2, 0x0, 0xb3, + 0x69, 0xb9, 0x40, 0x0, 0xbd, 0xd9, 0xe, 0x4a, + 0x30, 0x10, 0x0, 0xc2, 0x3b, 0xe, 0x6, 0x76, + 0xc0, 0x0, 0xd0, 0x3a, 0xe, 0x3, 0xeb, 0x0, + 0x0, 0xd0, 0x39, 0xe, 0x0, 0xe1, 0x0, 0x2, + 0xb0, 0x49, 0xe, 0x0, 0x97, 0x0, 0x7, 0x60, + 0x58, 0xe, 0x2, 0x3d, 0x0, 0xd, 0x10, 0x76, + 0xf, 0xac, 0x28, 0xb0, 0x58, 0xc, 0xd2, 0x2c, + 0x40, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+65CF "族" */ + 0x0, 0x41, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0xa, 0x30, 0x0, 0x0, 0x13, 0x3a, + 0x53, 0x1f, 0xaa, 0xaa, 0xa3, 0x4a, 0xeb, 0xaa, + 0xb7, 0x73, 0x33, 0x30, 0x0, 0xc1, 0x1, 0x84, + 0xa2, 0x22, 0x10, 0x0, 0xdb, 0xb7, 0xb, 0x8f, + 0x88, 0x60, 0x0, 0xd2, 0x59, 0x76, 0xd, 0x0, + 0x0, 0x0, 0xc0, 0x49, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xb0, 0x49, 0xad, 0xdf, 0xed, 0xd3, 0x3, + 0xa0, 0x58, 0x0, 0x3e, 0xa0, 0x0, 0x7, 0x70, + 0x67, 0x0, 0xb4, 0xc3, 0x0, 0xd, 0x20, 0x85, + 0x8, 0x90, 0x3d, 0x40, 0x4a, 0x2d, 0xd1, 0xc8, + 0x0, 0x2, 0xd3, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+65E2 "既" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xdc, 0xcd, 0x1d, 0xdd, 0xdd, 0xb0, 0xc, 0x10, + 0xd, 0x0, 0x4, 0x80, 0x0, 0xc, 0x31, 0x1d, + 0x8, 0x45, 0x80, 0x0, 0xc, 0xa9, 0x9d, 0xb, + 0x16, 0x60, 0x0, 0xc, 0x10, 0xd, 0xd, 0x8, + 0x50, 0x0, 0xc, 0xdd, 0xdd, 0x4c, 0xcf, 0xcc, + 0xc1, 0xc, 0x10, 0x0, 0x0, 0x1f, 0x40, 0x0, + 0xc, 0x10, 0x92, 0x0, 0x6c, 0x90, 0x0, 0xc, + 0x10, 0x59, 0x0, 0xc5, 0x90, 0x0, 0xc, 0x49, + 0xdd, 0x5, 0xb2, 0x90, 0x52, 0xf, 0xe6, 0x5, + 0x3d, 0x12, 0x90, 0x73, 0x6, 0x0, 0x0, 0xc4, + 0x1, 0xdd, 0xc0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+65E5 "日" */ + 0x3e, 0xee, 0xee, 0xee, 0xed, 0x4b, 0x0, 0x0, + 0x0, 0x1e, 0x4b, 0x0, 0x0, 0x0, 0x1e, 0x4b, + 0x0, 0x0, 0x0, 0x1e, 0x4b, 0x0, 0x0, 0x0, + 0x1e, 0x4f, 0xee, 0xee, 0xee, 0xee, 0x4b, 0x0, + 0x0, 0x0, 0x1e, 0x4b, 0x0, 0x0, 0x0, 0x1e, + 0x4b, 0x0, 0x0, 0x0, 0x1e, 0x4b, 0x0, 0x0, + 0x0, 0x1e, 0x4f, 0xee, 0xee, 0xee, 0xfe, 0x4b, + 0x0, 0x0, 0x0, 0x1d, + + /* U+65E6 "旦" */ + 0x0, 0xf, 0xee, 0xee, 0xee, 0xf2, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0xf, 0xee, 0xee, + 0xee, 0xf2, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xc2, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0xc2, + 0x0, 0x0, 0xe, 0x33, 0x33, 0x33, 0xd2, 0x0, + 0x0, 0xb, 0xbb, 0xbb, 0xbb, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x3, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x30, + + /* U+65E9 "早" */ + 0x0, 0x9e, 0xdd, 0xdd, 0xdd, 0xdf, 0x0, 0x0, + 0x94, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x9d, + 0xcc, 0xcc, 0xcc, 0xcf, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x94, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x8d, 0xdd, 0xef, 0xdd, + 0xdd, 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xef, 0xee, 0xee, 0xe8, 0x0, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0x0, 0x0, 0x0, + + /* U+65F6 "时" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0xa, 0xbb, + 0xb2, 0x0, 0x0, 0x1d, 0x0, 0xe2, 0x2b, 0x20, + 0x0, 0x1, 0xd0, 0xe, 0x0, 0xa4, 0xee, 0xee, + 0xef, 0xe8, 0xe0, 0xa, 0x20, 0x0, 0x1, 0xd0, + 0xe, 0xbb, 0xe2, 0x39, 0x0, 0x1d, 0x0, 0xe1, + 0x1b, 0x20, 0xc5, 0x1, 0xd0, 0xe, 0x0, 0xa2, + 0x3, 0xe1, 0x1d, 0x0, 0xe0, 0xa, 0x20, 0x9, + 0x71, 0xd0, 0xe, 0x22, 0xb2, 0x0, 0x0, 0x1d, + 0x0, 0xeb, 0xbb, 0x10, 0x0, 0x1, 0xd0, 0x9, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xee, 0x70, 0x0, + + /* U+6607 "昇" */ + 0x0, 0x9d, 0xcc, 0xcc, 0xcc, 0xcf, 0x0, 0x0, + 0x95, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x9d, + 0xbb, 0xbb, 0xbb, 0xbf, 0x0, 0x0, 0x95, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x7c, 0xcc, 0xcd, + 0xcc, 0xcc, 0x0, 0x0, 0x14, 0x69, 0xd8, 0x7, + 0x70, 0x0, 0x4, 0xb9, 0xb8, 0x0, 0x7, 0x70, + 0x0, 0x1, 0x11, 0x88, 0x11, 0x18, 0x81, 0x10, + 0x1b, 0xbb, 0xed, 0xbb, 0xbd, 0xdb, 0xb6, 0x0, + 0x0, 0xd2, 0x0, 0x7, 0x70, 0x0, 0x0, 0x1b, + 0x80, 0x0, 0x7, 0x70, 0x0, 0x5, 0xc5, 0x0, + 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+660E "明" */ + 0xed, 0xdd, 0xd0, 0xfd, 0xdd, 0xee, 0xe0, 0x0, + 0xd0, 0xe0, 0x0, 0xe, 0xe0, 0x0, 0xd0, 0xe0, + 0x0, 0xe, 0xe0, 0x0, 0xd0, 0xf8, 0x88, 0x9e, + 0xed, 0xdd, 0xd0, 0xf5, 0x55, 0x5e, 0xe0, 0x0, + 0xd0, 0xe0, 0x0, 0xe, 0xe0, 0x0, 0xd1, 0xd0, + 0x0, 0xe, 0xe3, 0x33, 0xd3, 0xfc, 0xcc, 0xde, + 0xea, 0xaa, 0x97, 0x70, 0x0, 0xe, 0x90, 0x0, + 0xe, 0x20, 0x0, 0xe, 0x0, 0x0, 0x9a, 0x0, + 0x0, 0xe, 0x0, 0x3, 0xd1, 0x0, 0x3e, 0xe9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6613 "易" */ + 0x0, 0x2f, 0xcc, 0xcc, 0xcc, 0xdd, 0x0, 0x2, + 0xc0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x2f, 0xcc, + 0xcc, 0xcc, 0xcd, 0x0, 0x2, 0xc0, 0x0, 0x0, + 0x1, 0xd0, 0x0, 0x2f, 0xcc, 0xcc, 0xcc, 0xcd, + 0x0, 0x0, 0x1d, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xeb, 0xbb, 0xbb, 0xbb, 0x80, 0x2d, 0x61, + 0x7b, 0x15, 0xc1, 0x5a, 0xc, 0x40, 0x3d, 0x10, + 0xb4, 0x5, 0x90, 0x0, 0x2d, 0x30, 0x4c, 0x0, + 0x76, 0x0, 0x5d, 0x30, 0x3d, 0x20, 0xb, 0x40, + 0x6, 0x20, 0xb, 0x30, 0xcc, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6614 "昔" */ + 0x0, 0x0, 0xd1, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0xe, 0x0, 0x0, 0x5, 0xdd, + 0xfe, 0xdd, 0xef, 0xdd, 0x70, 0x0, 0x0, 0xd1, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, + 0xe, 0x0, 0x0, 0x2e, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xcc, 0xcc, 0xcc, 0xf2, 0x0, + 0x0, 0x1c, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x1f, 0xcc, 0xcc, 0xcc, 0xf2, 0x0, 0x0, 0x1c, + 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x1f, 0xcc, 0xcc, + 0xcc, 0xf2, 0x0, + + /* U+661F "星" */ + 0x0, 0x9d, 0xbb, 0xbb, 0xbb, 0xda, 0x0, 0x0, + 0x94, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x9d, + 0xbb, 0xbb, 0xbb, 0xca, 0x0, 0x0, 0x94, 0x0, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x7c, 0xcc, 0xcc, + 0xcc, 0xc8, 0x0, 0x0, 0x1b, 0x0, 0x44, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xdd, 0xee, 0xdd, 0xdd, + 0x30, 0xb, 0x70, 0x0, 0x77, 0x0, 0x0, 0x0, + 0x4, 0x5b, 0xbb, 0xdd, 0xbb, 0xb7, 0x0, 0x0, + 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xdd, + 0xee, 0xdd, 0xdd, 0xd1, + + /* U+6620 "映" */ + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0xd, 0xee, + 0xd0, 0x0, 0xd, 0x0, 0x0, 0xd0, 0xd, 0x9, + 0xaa, 0xfa, 0xa9, 0xd, 0x0, 0xd0, 0xd2, 0x2e, + 0x22, 0xd0, 0xd0, 0xd, 0xd, 0x0, 0xd0, 0xd, + 0xe, 0xbb, 0xd0, 0xd0, 0xd, 0x0, 0xd0, 0xd2, + 0x2d, 0xd, 0x0, 0xd0, 0xd, 0xd, 0x0, 0xda, + 0xfd, 0xdf, 0xdd, 0xfa, 0xd0, 0xd, 0x0, 0x6, + 0xf6, 0x0, 0xd, 0x22, 0xd0, 0x0, 0xc6, 0xd0, + 0x0, 0xea, 0xa9, 0x0, 0x8b, 0x9, 0x70, 0x7, + 0x0, 0x1, 0xab, 0x10, 0x1d, 0x60, 0x0, 0x1, + 0xd7, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+6625 "春" */ + 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x5, + 0xbb, 0xbb, 0xec, 0xbb, 0xbb, 0x50, 0x0, 0x11, + 0x13, 0xe1, 0x11, 0x11, 0x0, 0x0, 0xcc, 0xcd, + 0xfc, 0xcc, 0xcc, 0x0, 0x0, 0x0, 0xe, 0x20, + 0x0, 0x0, 0x0, 0x3d, 0xdd, 0xdf, 0xdd, 0xdd, + 0xdd, 0xd3, 0x0, 0x6, 0xd0, 0x0, 0xb, 0x60, + 0x0, 0x0, 0x6f, 0xec, 0xcc, 0xcd, 0xf7, 0x0, + 0x2b, 0xbb, 0x50, 0x0, 0x4, 0xca, 0xd2, 0x5, + 0x9, 0xdb, 0xbb, 0xbc, 0xb0, 0x30, 0x0, 0x9, + 0x50, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x9, 0x61, + 0x11, 0x15, 0xb0, 0x0, 0x0, 0x9, 0xdb, 0xbb, + 0xbc, 0xa0, 0x0, + + /* U+6628 "昨" */ + 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0xdd, + 0xd0, 0x3c, 0x0, 0x0, 0x0, 0xe0, 0xe, 0x8, + 0xdb, 0xbb, 0xbb, 0x3e, 0x0, 0xe1, 0xe3, 0xe3, + 0x22, 0x20, 0xe0, 0xe, 0x97, 0xe, 0x0, 0x0, + 0xe, 0xdd, 0xf6, 0x0, 0xec, 0xcc, 0xb0, 0xe0, + 0xe, 0x0, 0xe, 0x11, 0x11, 0xe, 0x0, 0xe0, + 0x0, 0xe0, 0x0, 0x0, 0xe0, 0xe, 0x0, 0xe, + 0x55, 0x55, 0xe, 0x33, 0xe0, 0x0, 0xea, 0xaa, + 0xa0, 0xea, 0xaa, 0x0, 0xe, 0x0, 0x0, 0x7, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, + + /* U+662F "是" */ + 0x0, 0xac, 0xbb, 0xbb, 0xbb, 0xc9, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0xac, + 0xaa, 0xaa, 0xaa, 0xc9, 0x0, 0x0, 0xa6, 0x33, + 0x33, 0x33, 0x79, 0x0, 0x0, 0x45, 0x55, 0x55, + 0x55, 0x53, 0x0, 0x2b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xb2, 0x1, 0x14, 0x21, 0x6a, 0x11, 0x11, + 0x10, 0x0, 0xf, 0x10, 0x59, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x0, 0x5e, 0xdd, 0xdd, 0x30, 0x0, + 0xac, 0x80, 0x59, 0x0, 0x0, 0x0, 0x7, 0xd0, + 0xbb, 0x89, 0x0, 0x0, 0x0, 0x3e, 0x20, 0x5, + 0xbe, 0xee, 0xee, 0xe4, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+663C "昼" */ + 0x0, 0xad, 0xcc, 0xcc, 0xcc, 0xde, 0x0, 0x0, + 0xa4, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xbd, + 0xcc, 0xcc, 0xcc, 0xce, 0x0, 0x0, 0xd2, 0x0, + 0x0, 0x3e, 0x20, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x9, 0xc0, 0x0, 0x7, 0x8e, 0xbb, 0xbb, 0xbc, + 0xfd, 0x40, 0x3e, 0x1d, 0x0, 0x0, 0x1, 0xd5, + 0xd2, 0x2, 0xe, 0xaa, 0xaa, 0xab, 0xc0, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, + 0xa, 0xbb, 0xbb, 0xbb, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xb0, + + /* U+6642 "時" */ + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0xe, 0xdd, + 0xf0, 0x0, 0xe, 0x0, 0x0, 0xd0, 0xe, 0x1d, + 0xdd, 0xfd, 0xdd, 0xd, 0x0, 0xe0, 0x0, 0xe, + 0x0, 0x0, 0xd0, 0xe, 0x46, 0x66, 0xf6, 0x66, + 0x4e, 0xdd, 0xf4, 0x66, 0x66, 0x7d, 0x63, 0xd0, + 0xe, 0x0, 0x0, 0x2, 0xc0, 0xd, 0x0, 0xe8, + 0xdd, 0xdd, 0xdf, 0xd6, 0xd0, 0xe, 0x3, 0x20, + 0x2, 0xc0, 0xe, 0xbb, 0xf0, 0x3d, 0x20, 0x2c, + 0x0, 0xe1, 0x11, 0x0, 0x6b, 0x2, 0xc0, 0x3, + 0x0, 0x0, 0x0, 0x10, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdd, 0x80, 0x0, + + /* U+6669 "晩" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0xd, 0xdd, + 0xc0, 0x1f, 0xdb, 0xb2, 0x0, 0xd0, 0xd, 0xa, + 0x60, 0x2c, 0x0, 0xd, 0x0, 0xd9, 0xe6, 0x6b, + 0xa6, 0x50, 0xd0, 0xe, 0xbd, 0x66, 0xe6, 0x6e, + 0xe, 0xdd, 0xd2, 0xb0, 0xd, 0x0, 0xd0, 0xd0, + 0xd, 0x2b, 0x0, 0xd0, 0xd, 0xd, 0x0, 0xd2, + 0xfd, 0xdf, 0xdd, 0xe0, 0xd0, 0xd, 0x0, 0x95, + 0x1c, 0x0, 0xe, 0xbb, 0xd0, 0xc, 0x21, 0xc0, + 0x0, 0xd1, 0x11, 0x4, 0xc0, 0x1c, 0x4, 0x53, + 0x0, 0x4, 0xd3, 0x1, 0xc0, 0x66, 0x0, 0xa, + 0xb2, 0x0, 0xc, 0xde, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+666E "普" */ + 0x0, 0x3, 0x60, 0x0, 0x3, 0x60, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0xc, 0x30, 0x0, 0x3, 0xcc, + 0xce, 0xdc, 0xfc, 0xcc, 0x90, 0x0, 0x57, 0xa, + 0x30, 0xe0, 0x3b, 0x0, 0x0, 0xd, 0x1a, 0x30, + 0xe0, 0xb3, 0x0, 0x6, 0x69, 0x7d, 0x86, 0xe6, + 0xa6, 0x63, 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x52, 0x0, 0x1b, 0xbb, 0xbb, 0xbb, 0xb6, 0x0, + 0x0, 0x1c, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, + 0x1e, 0xaa, 0xaa, 0xaa, 0xc9, 0x0, 0x0, 0x1d, + 0x11, 0x11, 0x11, 0x69, 0x0, 0x0, 0x1c, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x1f, 0xcc, 0xcc, + 0xcc, 0xd8, 0x0, + + /* U+666F "景" */ + 0x0, 0x9c, 0xaa, 0xaa, 0xaa, 0xc9, 0x0, 0x0, + 0x9a, 0x77, 0x77, 0x77, 0xa9, 0x0, 0x0, 0x96, + 0x11, 0x11, 0x11, 0x69, 0x0, 0x0, 0x6a, 0xaa, + 0xdb, 0xaa, 0xa6, 0x0, 0x16, 0x66, 0x66, 0xc9, + 0x66, 0x66, 0x61, 0x16, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x61, 0x0, 0x3c, 0xbb, 0xbb, 0xbb, 0xc4, + 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x95, 0x0, + 0x0, 0x4e, 0xbb, 0xbb, 0xbb, 0xe5, 0x0, 0x0, + 0x4, 0x60, 0x77, 0x6, 0x10, 0x0, 0x4, 0xaa, + 0x10, 0x77, 0x4, 0xba, 0x20, 0x19, 0x30, 0x2b, + 0xd4, 0x0, 0x3, 0x90, + + /* U+6674 "晴" */ + 0x0, 0x0, 0x0, 0x1, 0xc0, 0x0, 0xc, 0xdd, + 0x93, 0xaa, 0xae, 0xaa, 0xa1, 0xc0, 0xb, 0x1, + 0x13, 0xd1, 0x11, 0xc, 0x0, 0xb0, 0xbb, 0xbf, + 0xbb, 0x90, 0xc0, 0xb, 0x24, 0x45, 0xd4, 0x44, + 0x1e, 0xcc, 0xb4, 0x66, 0x66, 0x66, 0x62, 0xc0, + 0xb, 0x8, 0xbb, 0xbb, 0xb5, 0xc, 0x0, 0xb0, + 0xb1, 0x0, 0x6, 0x70, 0xc0, 0xb, 0xb, 0xba, + 0xaa, 0xc7, 0xd, 0x89, 0xb0, 0xb1, 0x0, 0x6, + 0x70, 0xd4, 0x43, 0xb, 0xbb, 0xbb, 0xd7, 0x4, + 0x0, 0x0, 0xb1, 0x0, 0x6, 0x70, 0x0, 0x0, + 0xb, 0x10, 0xa, 0xd4, 0x0, + + /* U+667A "智" */ + 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xcc, 0xc8, 0x4c, 0xcc, 0xc3, 0xd, 0x15, 0x90, + 0x6, 0x70, 0xa, 0x42, 0xb9, 0xbd, 0x99, 0x66, + 0x0, 0xa4, 0x2, 0x2c, 0xa2, 0x26, 0x60, 0xa, + 0x40, 0x6, 0xb7, 0xc3, 0x6e, 0xdd, 0xf4, 0x1a, + 0xa0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x42, 0xcc, + 0xcc, 0xcc, 0xcc, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x3, 0xea, 0xaa, 0xaa, 0xaf, + 0x10, 0x0, 0x3b, 0x11, 0x11, 0x11, 0xd1, 0x0, + 0x3, 0xb0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x3e, + 0xcc, 0xcc, 0xcc, 0xf1, 0x0, + + /* U+6687 "暇" */ + 0xcd, 0xd2, 0xdc, 0xcd, 0x7d, 0xdf, 0xc, 0x9, + 0x2d, 0x0, 0xd0, 0x0, 0xd0, 0xc0, 0x92, 0xd0, + 0xd, 0x0, 0xd, 0xc, 0x9, 0x2d, 0xcc, 0xd7, + 0xcc, 0xf0, 0xec, 0xe2, 0xd0, 0x0, 0x0, 0x0, + 0xd, 0x4b, 0x2d, 0x0, 0x8, 0x88, 0x80, 0xc0, + 0x92, 0xdc, 0xc5, 0xa7, 0x5d, 0xc, 0x9, 0x2d, + 0x0, 0x3, 0x96, 0x90, 0xea, 0xd2, 0xdc, 0xca, + 0xc, 0xd1, 0xd, 0x33, 0xd, 0x0, 0x0, 0xab, + 0x0, 0x50, 0x0, 0xd0, 0x0, 0x9a, 0xb7, 0x0, + 0x0, 0xd, 0x0, 0xa6, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6691 "暑" */ + 0x0, 0xcb, 0xaa, 0xaa, 0xaa, 0xc8, 0x0, 0x0, + 0xc8, 0x77, 0x77, 0x77, 0xb8, 0x0, 0x0, 0xc4, + 0x22, 0x22, 0x22, 0x78, 0x0, 0x0, 0x8a, 0xac, + 0xca, 0xaa, 0xa8, 0x20, 0x1, 0x88, 0x8b, 0xc8, + 0x88, 0x6b, 0x20, 0x0, 0x33, 0x37, 0xa3, 0x7e, + 0x70, 0x0, 0x1b, 0xbb, 0xbd, 0xed, 0xed, 0xbb, + 0xb0, 0x0, 0x16, 0xaf, 0xb5, 0x33, 0x32, 0x0, + 0x2d, 0xde, 0x86, 0x66, 0x66, 0x8b, 0x0, 0x1, + 0xb, 0xba, 0xaa, 0xaa, 0xbb, 0x0, 0x0, 0xb, + 0x30, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xb, 0xba, + 0xaa, 0xaa, 0xbb, 0x0, + + /* U+6696 "暖" */ + 0x0, 0x0, 0x0, 0x12, 0x45, 0x86, 0xc, 0xdd, + 0xb6, 0xba, 0xa9, 0x66, 0x40, 0xd0, 0xd, 0xc, + 0x6, 0x60, 0xa6, 0xd, 0x0, 0xd0, 0x83, 0x26, + 0x2c, 0x0, 0xd0, 0xd, 0x5c, 0xed, 0xcc, 0xcc, + 0x2e, 0xaa, 0xd0, 0xc, 0x20, 0x0, 0x0, 0xd2, + 0x2d, 0xbc, 0xfc, 0xcc, 0xcc, 0x6d, 0x0, 0xd0, + 0x1e, 0x33, 0x34, 0x10, 0xd0, 0xd, 0x5, 0xf7, + 0x67, 0xe4, 0xe, 0xbb, 0xd0, 0xb7, 0xa0, 0x6c, + 0x0, 0xd2, 0x21, 0x5a, 0x6, 0xcd, 0x10, 0x4, + 0x0, 0x4c, 0x24, 0xac, 0xea, 0x40, 0x0, 0xa, + 0x18, 0xb4, 0x0, 0x7c, 0x70, + + /* U+6697 "暗" */ + 0x0, 0x0, 0x0, 0x3, 0x60, 0x0, 0x9, 0xaa, + 0x80, 0x0, 0x1e, 0x0, 0x0, 0xd3, 0x3d, 0x4d, + 0xdd, 0xdd, 0xdd, 0x2d, 0x0, 0xd0, 0x4a, 0x0, + 0xe, 0x10, 0xd0, 0xd, 0x0, 0xe0, 0x5, 0xa0, + 0xd, 0xaa, 0xd9, 0xde, 0xdd, 0xee, 0xd8, 0xd3, + 0x3d, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0xd0, + 0xcc, 0xcc, 0xcc, 0xa0, 0xd0, 0xd, 0xd, 0x0, + 0x0, 0x2b, 0xd, 0x22, 0xd0, 0xd6, 0x66, 0x68, + 0xb0, 0xea, 0xa9, 0xd, 0x55, 0x55, 0x7b, 0x7, + 0x0, 0x0, 0xd1, 0x11, 0x13, 0xb0, 0x0, 0x0, + 0xd, 0xaa, 0xaa, 0xbb, 0x0, + + /* U+66C7 "曇" */ + 0x0, 0xb9, 0x88, 0x88, 0x88, 0xaa, 0x0, 0x0, + 0xb8, 0x77, 0x77, 0x77, 0x9a, 0x0, 0x0, 0x89, + 0x88, 0x88, 0x88, 0x97, 0x0, 0x3, 0x99, 0x99, + 0xba, 0x99, 0x99, 0x30, 0x9, 0xaa, 0xaa, 0xdc, + 0xaa, 0xaa, 0x90, 0xd, 0x16, 0x65, 0x75, 0x56, + 0x61, 0xd0, 0x3, 0x1, 0x11, 0x75, 0x11, 0x10, + 0x30, 0x0, 0x47, 0x75, 0x54, 0x68, 0x85, 0x0, + 0x0, 0x69, 0x99, 0x99, 0x99, 0x97, 0x0, 0x2a, + 0xaa, 0xcc, 0xaa, 0xac, 0xaa, 0xa2, 0x0, 0x5, + 0xd2, 0x0, 0x1d, 0x80, 0x0, 0x0, 0x8f, 0xba, + 0xaa, 0xab, 0xdc, 0x10, 0x0, 0x22, 0x10, 0x0, + 0x0, 0x4, 0x10, + + /* U+66DC "曜" */ + 0xcd, 0xd8, 0x9b, 0xbc, 0x7b, 0xbe, 0xc, 0x2, + 0xa3, 0xa0, 0xc1, 0xb1, 0xd0, 0xc0, 0x2a, 0x5, + 0x8c, 0x2, 0x8e, 0xc, 0x2, 0xa7, 0xc5, 0xc5, + 0xc7, 0xd0, 0xd8, 0x9a, 0x32, 0x45, 0x90, 0x5, + 0xc, 0x3, 0xa0, 0xbc, 0xae, 0xba, 0xa0, 0xc0, + 0x2a, 0x5e, 0x11, 0xa4, 0x11, 0xc, 0x2, 0xcc, + 0xfa, 0xad, 0xba, 0x60, 0xd8, 0x9a, 0x1d, 0x0, + 0x93, 0x0, 0xd, 0x44, 0x30, 0xfa, 0xae, 0xca, + 0x60, 0x40, 0x0, 0xe, 0x0, 0x93, 0x0, 0x0, + 0x0, 0x0, 0xfb, 0xbb, 0xbb, 0xb3, + + /* U+66F2 "曲" */ + 0x0, 0x3, 0xb0, 0xe, 0x0, 0x0, 0x0, 0x3, + 0xb0, 0xe, 0x0, 0x0, 0x0, 0x3, 0xb0, 0xe, + 0x0, 0x0, 0xce, 0xef, 0xfe, 0xef, 0xee, 0xe3, + 0xc1, 0x3, 0xb0, 0xe, 0x0, 0xb3, 0xc1, 0x3, + 0xb0, 0xe, 0x0, 0xb3, 0xc1, 0x3, 0xb0, 0xe, + 0x0, 0xb3, 0xce, 0xde, 0xfd, 0xdf, 0xdd, 0xf3, + 0xc1, 0x3, 0xb0, 0xe, 0x0, 0xb3, 0xc1, 0x3, + 0xb0, 0xe, 0x0, 0xb3, 0xc1, 0x3, 0xb0, 0xe, + 0x0, 0xb3, 0xcf, 0xef, 0xfe, 0xef, 0xee, 0xf3, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0xa3, + + /* U+66F4 "更" */ + 0x1d, 0xdd, 0xdd, 0xef, 0xdd, 0xdd, 0xd1, 0x0, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0xbc, + 0xcc, 0xee, 0xcc, 0xcd, 0x20, 0x0, 0xc1, 0x0, + 0x68, 0x0, 0xb, 0x30, 0x0, 0xcc, 0xcc, 0xde, + 0xcc, 0xcf, 0x30, 0x0, 0xc1, 0x0, 0x68, 0x0, + 0xb, 0x30, 0x0, 0xc2, 0x11, 0x79, 0x11, 0x1c, + 0x30, 0x0, 0x9c, 0xbb, 0xed, 0xbb, 0xbb, 0x20, + 0x0, 0x1d, 0x30, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdb, 0x80, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xda, 0xc8, 0x42, 0x0, 0x0, 0x1e, 0xc7, 0x0, + 0x4, 0x9b, 0xde, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+66F8 "書" */ + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, + 0x7a, 0xaa, 0xdc, 0xaa, 0xb5, 0x0, 0x3, 0x33, + 0x33, 0xa9, 0x33, 0x99, 0x30, 0x17, 0x77, 0x77, + 0xbb, 0x77, 0xbb, 0x71, 0x0, 0x8a, 0xaa, 0xdc, + 0xaa, 0xc7, 0x0, 0x0, 0x33, 0x33, 0x98, 0x33, + 0x33, 0x0, 0x1, 0x66, 0x66, 0xba, 0x66, 0x66, + 0x20, 0x2b, 0xbb, 0xbb, 0xdd, 0xbb, 0xbb, 0xb2, + 0x0, 0x14, 0x44, 0x44, 0x44, 0x42, 0x0, 0x0, + 0x6b, 0x66, 0x66, 0x66, 0xa8, 0x0, 0x0, 0x6d, + 0x99, 0x99, 0x99, 0xc8, 0x0, 0x0, 0x68, 0x0, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x6d, 0xaa, 0xaa, + 0xaa, 0xc8, 0x0, + + /* U+66FE "曾" */ + 0x0, 0x9, 0x0, 0x0, 0x90, 0x0, 0x0, 0x8, + 0x70, 0x5, 0x90, 0x0, 0x1e, 0xbc, 0xcc, 0xdc, + 0xcb, 0xe1, 0x1d, 0x19, 0x3, 0xa0, 0x81, 0xe1, + 0x1d, 0x6, 0x73, 0xa4, 0x80, 0xe1, 0x1e, 0x66, + 0x88, 0xc8, 0x66, 0xf1, 0x5, 0x55, 0x55, 0x55, + 0x55, 0x50, 0x2, 0xbb, 0xbb, 0xbb, 0xbb, 0x20, + 0x2, 0xd0, 0x0, 0x0, 0xc, 0x30, 0x2, 0xfb, + 0xbb, 0xbb, 0xbe, 0x30, 0x2, 0xd0, 0x0, 0x0, + 0xc, 0x30, 0x2, 0xe9, 0x99, 0x99, 0x9e, 0x30, + 0x2, 0xd2, 0x22, 0x22, 0x2c, 0x30, + + /* U+66FF "替" */ + 0x0, 0x7, 0x60, 0x0, 0x3, 0xa0, 0x0, 0x7, + 0xad, 0xda, 0x35, 0xac, 0xea, 0xa0, 0x0, 0x8, + 0x60, 0x0, 0x5, 0xa0, 0x0, 0x9, 0x9d, 0xc9, + 0x58, 0x9c, 0xd9, 0x93, 0x2, 0x3f, 0xa2, 0x12, + 0x3e, 0xc6, 0x21, 0x0, 0x98, 0xaa, 0x1, 0xb8, + 0x1d, 0x10, 0x9, 0xa0, 0x7, 0x2d, 0x70, 0x4, + 0xd5, 0x6, 0x3d, 0xdd, 0xdd, 0xdd, 0xd7, 0x12, + 0x0, 0x49, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, + 0x4e, 0xbb, 0xbb, 0xbb, 0xd9, 0x0, 0x0, 0x49, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4a, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x4e, 0xcc, 0xcc, + 0xcc, 0xd8, 0x0, + + /* U+6700 "最" */ + 0x0, 0xac, 0xbb, 0xbb, 0xbb, 0xd7, 0x0, 0x0, + 0xac, 0xaa, 0xaa, 0xaa, 0xc7, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x8b, 0xaa, + 0xaa, 0xaa, 0xc6, 0x0, 0x25, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x50, 0x26, 0xd5, 0x5a, 0xa5, 0x55, + 0x55, 0x50, 0x1, 0xfb, 0xbd, 0x7b, 0xcc, 0xcc, + 0x60, 0x1, 0xc0, 0x7, 0x71, 0xb0, 0xb, 0x30, + 0x1, 0xfb, 0xbd, 0x70, 0x76, 0x6b, 0x0, 0x1, + 0xc0, 0x8, 0x91, 0xc, 0xd1, 0x0, 0x4b, 0xfc, + 0xcd, 0xb2, 0x7b, 0xc7, 0x0, 0x11, 0x0, 0x7, + 0x7b, 0x50, 0x7, 0xc1, + + /* U+6703 "會" */ + 0x0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x8d, 0x70, 0x0, 0x0, 0x0, 0x5, + 0xc6, 0x23, 0xdd, 0x50, 0x0, 0x28, 0xc7, 0x78, + 0x88, 0x84, 0x9d, 0x93, 0x25, 0x9a, 0xaa, 0xba, + 0xaa, 0xa9, 0x52, 0x0, 0xd1, 0x80, 0xc0, 0x57, + 0x1c, 0x0, 0x0, 0xd0, 0x91, 0xc0, 0xa1, 0x1c, + 0x0, 0x0, 0x89, 0x99, 0x99, 0x99, 0x97, 0x0, + 0x0, 0xa, 0xaa, 0xaa, 0xaa, 0xa1, 0x0, 0x0, + 0xc, 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0xe, + 0xaa, 0xaa, 0xab, 0xf1, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0xe, 0xaa, 0xaa, + 0xab, 0xf1, 0x0, + + /* U+6708 "月" */ + 0x0, 0xf, 0xee, 0xee, 0xee, 0xf3, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0xf, 0xdd, 0xdd, 0xdd, 0xf3, + 0x0, 0xe, 0x11, 0x11, 0x11, 0xc3, 0x0, 0x1c, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0x3c, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x6f, 0xee, 0xee, 0xee, 0xf3, + 0x0, 0xb5, 0x0, 0x0, 0x0, 0xc3, 0x2, 0xe0, + 0x0, 0x0, 0x0, 0xc3, 0xc, 0x60, 0x0, 0x0, + 0x0, 0xc3, 0x59, 0x0, 0x0, 0x8, 0xfe, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6709 "有" */ + 0x0, 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xdd, + 0xef, 0xdd, 0xdd, 0xdd, 0xd1, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd1, 0x11, + 0x11, 0x10, 0x0, 0x0, 0x2f, 0xec, 0xcc, 0xcc, + 0xe7, 0x0, 0x2, 0xdb, 0x80, 0x0, 0x0, 0x77, + 0x0, 0x2d, 0x46, 0xec, 0xcc, 0xcc, 0xe7, 0x0, + 0x2, 0x6, 0x80, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x6, 0xeb, 0xbb, 0xbb, 0xd7, 0x0, 0x0, 0x6, + 0x91, 0x11, 0x11, 0x77, 0x0, 0x0, 0x6, 0x80, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x6, 0x80, 0x0, + 0x9d, 0xd3, 0x0, + + /* U+670B "朋" */ + 0x0, 0xfe, 0xee, 0xa0, 0xfe, 0xee, 0xe0, 0xd, + 0x0, 0x3a, 0xe, 0x0, 0xe, 0x0, 0xd0, 0x3, + 0xa0, 0xe0, 0x0, 0xe0, 0xf, 0xdd, 0xea, 0xf, + 0xdd, 0xde, 0x0, 0xd0, 0x3, 0xa0, 0xe0, 0x0, + 0xe0, 0xd, 0x0, 0x3a, 0xe, 0x0, 0xe, 0x1, + 0xfd, 0xdd, 0xa1, 0xfd, 0xdd, 0xe0, 0x2b, 0x0, + 0x4a, 0x2b, 0x0, 0xe, 0x4, 0x80, 0x3, 0xa3, + 0x90, 0x0, 0xe0, 0x76, 0x0, 0x3a, 0x76, 0x0, + 0xe, 0xc, 0x10, 0x4, 0xac, 0x10, 0x0, 0xe2, + 0xa0, 0xc, 0xc7, 0x90, 0xe, 0xe9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+670D "服" */ + 0xa, 0xed, 0xf1, 0x1e, 0xdd, 0xde, 0xa0, 0xa, + 0x20, 0xc1, 0x1b, 0x0, 0x2, 0xb0, 0xa, 0x20, + 0xc1, 0x1b, 0x0, 0x36, 0xb0, 0xa, 0xed, 0xf1, + 0x1b, 0x0, 0x88, 0x30, 0xa, 0x20, 0xc1, 0x1d, + 0x77, 0x77, 0x70, 0xb, 0x20, 0xc1, 0x1d, 0xc6, + 0x45, 0xd0, 0xb, 0xcc, 0xf1, 0x1b, 0x69, 0x5, + 0x80, 0xc, 0x21, 0xc1, 0x1b, 0xe, 0x1c, 0x20, + 0xd, 0x0, 0xc1, 0x1b, 0x6, 0xd9, 0x0, 0xc, + 0x0, 0xc1, 0x1b, 0x3, 0xf6, 0x0, 0x58, 0x0, + 0xc1, 0x1b, 0x3c, 0x4d, 0x60, 0x73, 0x2e, 0xd0, + 0x1c, 0xa1, 0x1, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+671B "望" */ + 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x1a, 0x71, 0x14, 0xeb, 0xbb, 0xe0, 0x15, 0xe6, + 0x55, 0x54, 0xda, 0xaa, 0xe0, 0x0, 0xd0, 0x0, + 0x4, 0x90, 0x0, 0xe0, 0x0, 0xd0, 0x3, 0x36, + 0xdb, 0xbb, 0xe0, 0x1, 0xfb, 0xea, 0x3b, 0x20, + 0x0, 0xe0, 0x2, 0x83, 0x0, 0x7b, 0x0, 0x67, + 0xe0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x57, 0x30, + 0x2, 0xcc, 0xcc, 0xee, 0xcc, 0xcc, 0x60, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x8c, + 0xcc, 0xee, 0xcc, 0xca, 0x0, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x2c, 0xcc, 0xcc, 0xee, + 0xcc, 0xcc, 0xc5, + + /* U+671D "朝" */ + 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x94, 0x0, 0x2f, 0xdd, 0xde, 0x3d, 0xdf, 0xed, + 0xd2, 0xc0, 0x0, 0xe0, 0x0, 0x94, 0x0, 0x2c, + 0x0, 0xe, 0xd, 0xbb, 0xbc, 0x92, 0xe9, 0x99, + 0xe0, 0xd0, 0x0, 0x39, 0x2d, 0x44, 0x4e, 0xd, + 0xbb, 0xbc, 0x92, 0xc0, 0x0, 0xe0, 0xd0, 0x0, + 0x39, 0x3c, 0x33, 0x3e, 0xa, 0xbe, 0xcb, 0x75, + 0xda, 0xaa, 0xe0, 0x0, 0x94, 0x0, 0x86, 0x0, + 0xe, 0x5d, 0xde, 0xed, 0xde, 0x20, 0x0, 0xe0, + 0x0, 0x94, 0x6, 0xb0, 0x0, 0xe, 0x0, 0x9, + 0x40, 0xc2, 0x0, 0xbe, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+671F "期" */ + 0x0, 0xc0, 0x4, 0x90, 0x0, 0x0, 0x0, 0xc, + 0x0, 0x49, 0xa, 0xed, 0xdf, 0xd, 0xfd, 0xde, + 0xe8, 0xa2, 0x0, 0xe0, 0xc, 0x0, 0x49, 0xa, + 0x20, 0xe, 0x0, 0xcb, 0xbc, 0x90, 0xae, 0xdd, + 0xf0, 0xc, 0x10, 0x59, 0xa, 0x20, 0xe, 0x0, + 0xca, 0xac, 0x90, 0xa2, 0x0, 0xe0, 0xc, 0x21, + 0x59, 0xb, 0xcb, 0xbf, 0x0, 0xc0, 0x4, 0x90, + 0xc6, 0x55, 0xf2, 0xdd, 0xdd, 0xdd, 0x8d, 0x0, + 0xe, 0x0, 0x75, 0x9, 0x1, 0xc0, 0x0, 0xe0, + 0x3d, 0x0, 0x79, 0x77, 0x0, 0xe, 0xc, 0x20, + 0x0, 0x4b, 0x10, 0x9e, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+6728 "木" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x88, 0x0, 0x0, 0x0, 0xe, 0xee, 0xee, 0xff, + 0xee, 0xee, 0xe1, 0x0, 0x0, 0x5, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x99, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x77, 0x4b, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x77, 0x8, 0xa0, 0x0, 0x0, + 0xba, 0x0, 0x77, 0x0, 0x9b, 0x10, 0x3d, 0x80, + 0x0, 0x77, 0x0, 0x8, 0xe3, 0x14, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x0, + + /* U+672A "未" */ + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x22, + 0x22, 0x98, 0x22, 0x22, 0x0, 0x1, 0xbb, 0xbb, + 0xed, 0xbb, 0xbb, 0x20, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, + 0x0, 0x0, 0x1e, 0xee, 0xef, 0xff, 0xfe, 0xee, + 0xe2, 0x0, 0x0, 0x8, 0xfe, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x87, 0xa6, 0x0, 0x0, 0x0, + 0x7, 0xb0, 0x87, 0xb, 0x70, 0x0, 0x2, 0xba, + 0x0, 0x87, 0x0, 0xbb, 0x20, 0x3e, 0x50, 0x0, + 0x87, 0x0, 0x6, 0xe3, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, + + /* U+672B "末" */ + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x11, 0x98, 0x11, 0x11, 0x10, 0x1c, 0xcc, 0xcc, + 0xee, 0xcc, 0xcc, 0xc2, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, + 0x0, 0x0, 0x5, 0xee, 0xee, 0xff, 0xee, 0xee, + 0x60, 0x0, 0x0, 0x8, 0xee, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x87, 0x96, 0x0, 0x0, 0x0, + 0x7, 0xb0, 0x87, 0xb, 0x80, 0x0, 0x2, 0xba, + 0x0, 0x87, 0x0, 0xac, 0x30, 0x2e, 0x60, 0x0, + 0x87, 0x0, 0x6, 0xe3, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, + + /* U+672C "本" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x1e, 0xee, 0xee, + 0xff, 0xee, 0xee, 0xe1, 0x0, 0x0, 0x1d, 0x99, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x96, 0x77, 0x96, + 0x0, 0x0, 0x0, 0x3, 0xd0, 0x77, 0x1d, 0x10, + 0x0, 0x0, 0xd, 0x40, 0x77, 0x5, 0xc0, 0x0, + 0x0, 0xb8, 0x0, 0x77, 0x0, 0x9b, 0x0, 0x1c, + 0x99, 0xbb, 0xdd, 0xbb, 0x99, 0xd2, 0x6, 0x2, + 0x33, 0x99, 0x33, 0x20, 0x50, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x0, + + /* U+672D "札" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, 0x5, 0x80, 0x0, 0x0, 0x0, 0x8, + 0x60, 0x5, 0x80, 0x0, 0x0, 0x0, 0x8, 0x60, + 0x5, 0x80, 0x0, 0x0, 0x2e, 0xef, 0xee, 0xd5, + 0x80, 0x0, 0x0, 0x0, 0xe, 0x80, 0x5, 0x80, + 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x5, 0x80, 0x0, + 0x0, 0x0, 0xab, 0x8d, 0x25, 0x80, 0x0, 0x0, + 0x2, 0xb8, 0x65, 0x85, 0x80, 0x0, 0x0, 0xb, + 0x48, 0x60, 0x5, 0x80, 0x0, 0x0, 0x5b, 0x8, + 0x60, 0x5, 0x80, 0x0, 0x41, 0x32, 0x8, 0x60, + 0x5, 0x80, 0x0, 0x93, 0x0, 0x8, 0x60, 0x5, + 0x90, 0x0, 0xc1, 0x0, 0x8, 0x60, 0x1, 0xdd, + 0xdd, 0xa0, + + /* U+673A "机" */ + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0xf, 0xee, 0xed, 0x0, 0x0, 0xe, + 0x0, 0xf, 0x0, 0x1d, 0x0, 0x3e, 0xef, 0xee, + 0x2f, 0x0, 0x1d, 0x0, 0x0, 0x3f, 0x0, 0xf, + 0x0, 0x1d, 0x0, 0x0, 0x8f, 0x30, 0xf, 0x0, + 0x1d, 0x0, 0x0, 0xce, 0xc2, 0xf, 0x0, 0x1d, + 0x0, 0x5, 0x7e, 0x3d, 0x1e, 0x0, 0x1d, 0x0, + 0xc, 0x1e, 0x4, 0x3b, 0x0, 0x1d, 0x0, 0x67, + 0xe, 0x0, 0x78, 0x0, 0x1d, 0x4, 0x10, 0xe, + 0x0, 0xc2, 0x0, 0x1d, 0xb, 0x0, 0xe, 0x6, + 0xb0, 0x0, 0x1d, 0x1a, 0x0, 0xe, 0xb, 0x10, + 0x0, 0xc, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6750 "材" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x20, 0x0, 0x0, 0xe, 0x0, 0x0, 0xc, + 0x20, 0x0, 0x0, 0xe, 0x0, 0x0, 0xc, 0x20, + 0x0, 0x0, 0xe, 0x0, 0x1e, 0xef, 0xee, 0x6e, + 0xee, 0xef, 0xe5, 0x0, 0x1f, 0x50, 0x0, 0x0, + 0xae, 0x0, 0x0, 0x7f, 0xd2, 0x0, 0x3, 0xde, + 0x0, 0x0, 0xcc, 0x5d, 0x10, 0xc, 0x3e, 0x0, + 0x5, 0x8c, 0x26, 0x30, 0x98, 0xe, 0x0, 0xd, + 0x2c, 0x20, 0x7, 0xc0, 0xe, 0x0, 0x77, 0xc, + 0x20, 0x8d, 0x10, 0xe, 0x0, 0x10, 0xc, 0x20, + 0x71, 0x0, 0xe, 0x0, 0x0, 0xc, 0x20, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0xc, 0x20, 0x0, 0x5f, + 0xe9, 0x0, + + /* U+6751 "村" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x50, 0x0, 0x0, 0xd, 0x10, 0x0, 0x8, + 0x50, 0x0, 0x0, 0xd, 0x10, 0x0, 0x8, 0x50, + 0x0, 0x0, 0xd, 0x10, 0x1d, 0xdf, 0xed, 0x8e, + 0xee, 0xef, 0xe8, 0x0, 0xe, 0x60, 0x0, 0x0, + 0xd, 0x10, 0x0, 0x4f, 0x80, 0x3, 0x10, 0xd, + 0x10, 0x0, 0xab, 0xe7, 0x6, 0xa0, 0xd, 0x10, + 0x2, 0xb8, 0x6c, 0x40, 0xc3, 0xd, 0x10, 0xa, + 0x48, 0x52, 0x10, 0x5a, 0xd, 0x10, 0x3a, 0x8, + 0x50, 0x0, 0x2, 0xd, 0x10, 0x1, 0x8, 0x50, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x8, 0x50, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x8, 0x50, 0x0, 0x2f, + 0xeb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+675F "束" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0xd, 0xdd, + 0xdd, 0xee, 0xdd, 0xdd, 0xd0, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0xdd, 0xdd, 0xee, + 0xdd, 0xdd, 0x0, 0x0, 0xe0, 0x0, 0x77, 0x0, + 0xf, 0x0, 0x0, 0xe0, 0x0, 0x77, 0x0, 0xf, + 0x0, 0x0, 0xfd, 0xdd, 0xee, 0xdd, 0xdf, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xaa, 0x87, 0x99, 0x0, 0x0, 0x0, 0x4c, + 0x80, 0x77, 0x8, 0xd4, 0x0, 0x2c, 0xc3, 0x0, + 0x77, 0x0, 0x3c, 0xc2, 0x4, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x40, + + /* U+6761 "条" */ + 0x0, 0x0, 0x1d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xce, 0xaa, 0xaa, 0x60, 0x0, 0x0, 0x1c, + 0xe4, 0x22, 0x3e, 0x40, 0x0, 0x6, 0xd5, 0x3c, + 0x22, 0xc6, 0x0, 0x0, 0x4, 0x10, 0x3, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x3, 0x9d, 0x88, 0xea, + 0x40, 0x0, 0x3c, 0xeb, 0x50, 0x44, 0x5, 0xae, + 0xd3, 0x2, 0x0, 0x0, 0x77, 0x0, 0x0, 0x10, + 0x0, 0xcd, 0xdd, 0xee, 0xdd, 0xdb, 0x0, 0x0, + 0x0, 0x60, 0x77, 0x6, 0x0, 0x0, 0x0, 0xb, + 0x50, 0x77, 0x8, 0xb0, 0x0, 0x3, 0xd5, 0x0, + 0x77, 0x0, 0x7b, 0x0, 0x1, 0x30, 0x9, 0xd4, + 0x0, 0x5, 0x0, + + /* U+6765 "来" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x7, 0xee, + 0xee, 0xff, 0xee, 0xee, 0x90, 0x0, 0x17, 0x0, + 0x77, 0x0, 0x64, 0x0, 0x0, 0xc, 0x30, 0x77, + 0x1, 0xe1, 0x0, 0x0, 0x4, 0x90, 0x77, 0x8, + 0x60, 0x0, 0x2b, 0xbb, 0xbb, 0xdd, 0xbb, 0xbb, + 0xb2, 0x2, 0x22, 0x2a, 0xfe, 0xa2, 0x22, 0x20, + 0x0, 0x0, 0x6b, 0x88, 0xb6, 0x0, 0x0, 0x0, + 0x6, 0xc0, 0x77, 0xc, 0x60, 0x0, 0x0, 0x9c, + 0x10, 0x77, 0x1, 0xc9, 0x0, 0x3e, 0x80, 0x0, + 0x77, 0x0, 0x9, 0xe3, 0x2, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x20, + + /* U+676F "杯" */ + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x4, 0xcc, 0xcc, 0xcc, 0xc6, 0x0, 0xe, + 0x0, 0x22, 0x28, 0xb2, 0x21, 0x2e, 0xef, 0xed, + 0x0, 0x1e, 0x30, 0x0, 0x0, 0x3f, 0x10, 0x0, + 0xae, 0x60, 0x0, 0x0, 0x8f, 0xc1, 0x5, 0xde, + 0x6c, 0x10, 0x0, 0xce, 0x59, 0x5d, 0x1e, 0x5, + 0xc0, 0x4, 0x7e, 0xa, 0xd2, 0xe, 0x0, 0x88, + 0xc, 0x1e, 0x3, 0x0, 0xe, 0x0, 0x0, 0x48, + 0xe, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, + 0xe, 0x0, 0x0, + + /* U+6771 "東" */ + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x2, + 0x22, 0x22, 0x98, 0x22, 0x22, 0x20, 0xb, 0xbb, + 0xbb, 0xdd, 0xbb, 0xbb, 0xb1, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0xdc, 0xbb, 0xed, + 0xbb, 0xbf, 0x0, 0x0, 0xd1, 0x0, 0x86, 0x0, + 0xe, 0x0, 0x0, 0xdc, 0xbb, 0xdd, 0xbb, 0xbf, + 0x0, 0x0, 0xd1, 0x0, 0x86, 0x0, 0xe, 0x0, + 0x0, 0xbc, 0xbc, 0xff, 0xcb, 0xbd, 0x0, 0x0, + 0x0, 0x3d, 0xba, 0xc3, 0x0, 0x0, 0x0, 0x7, + 0xd2, 0x86, 0x2d, 0x60, 0x0, 0x6, 0xd9, 0x0, + 0x86, 0x1, 0x9d, 0x60, 0x19, 0x20, 0x0, 0x86, + 0x0, 0x2, 0x91, + + /* U+6790 "析" */ + 0x0, 0xe, 0x0, 0x0, 0x1, 0x7b, 0x10, 0x0, + 0xe, 0x0, 0x19, 0xdd, 0x94, 0x0, 0x0, 0xe, + 0x0, 0x4a, 0x10, 0x0, 0x0, 0x1c, 0xcf, 0xcc, + 0x48, 0x0, 0x0, 0x0, 0x2, 0x5e, 0x22, 0x48, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x50, 0x4f, 0xee, + 0xee, 0xe5, 0x0, 0xce, 0xc2, 0x48, 0x0, 0xd0, + 0x0, 0x5, 0x7e, 0x3a, 0x57, 0x0, 0xd0, 0x0, + 0xc, 0x1e, 0x0, 0x76, 0x0, 0xd0, 0x0, 0x58, + 0xe, 0x0, 0x84, 0x0, 0xd0, 0x0, 0x0, 0xe, + 0x0, 0xc1, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x2, + 0xc0, 0x0, 0xd0, 0x0, 0x0, 0xe, 0x6, 0x50, + 0x0, 0xd0, 0x0, + + /* U+6797 "林" */ + 0x0, 0x8, 0x60, 0x0, 0x2, 0xc0, 0x0, 0x0, + 0x8, 0x60, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x8, + 0x60, 0x0, 0x2, 0xc0, 0x0, 0x1e, 0xef, 0xee, + 0x6c, 0xee, 0xfe, 0xe6, 0x0, 0xd, 0x90, 0x0, + 0x9, 0xf3, 0x0, 0x0, 0x4f, 0xe7, 0x0, 0x1f, + 0xf9, 0x0, 0x0, 0xab, 0x6c, 0x50, 0x7a, 0xcd, + 0x0, 0x2, 0xb8, 0x62, 0x50, 0xd3, 0xc8, 0x60, + 0xb, 0x48, 0x60, 0x9, 0x72, 0xc1, 0xd0, 0x4a, + 0x8, 0x60, 0x6d, 0x2, 0xc0, 0x89, 0x1, 0x8, + 0x60, 0x82, 0x2, 0xc0, 0x4, 0x0, 0x8, 0x60, + 0x0, 0x2, 0xc0, 0x0, 0x0, 0x8, 0x60, 0x0, + 0x2, 0xc0, 0x0, + + /* U+679C "果" */ + 0x0, 0xcd, 0xdd, 0xee, 0xdd, 0xdd, 0x0, 0x0, + 0xc3, 0x0, 0x77, 0x0, 0x2d, 0x0, 0x0, 0xcd, + 0xcc, 0xee, 0xcc, 0xdd, 0x0, 0x0, 0xc3, 0x0, + 0x77, 0x0, 0x2d, 0x0, 0x0, 0xc5, 0x22, 0x99, + 0x22, 0x4d, 0x0, 0x0, 0x8a, 0xaa, 0xdd, 0xaa, + 0xa9, 0x0, 0x1, 0x11, 0x11, 0x88, 0x11, 0x11, + 0x10, 0x1c, 0xcc, 0xce, 0xff, 0xec, 0xcc, 0xc1, + 0x0, 0x0, 0x4c, 0xa9, 0xc5, 0x0, 0x0, 0x0, + 0x18, 0xc1, 0x77, 0xa, 0x92, 0x0, 0x19, 0xd6, + 0x0, 0x77, 0x0, 0x5c, 0xa2, 0x6, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x40, + + /* U+67D0 "某" */ + 0x0, 0x9, 0x50, 0x0, 0x6, 0x80, 0x0, 0x0, + 0x9, 0x60, 0x0, 0x7, 0x90, 0x0, 0x2c, 0xce, + 0xdc, 0xcc, 0xcd, 0xec, 0xc2, 0x0, 0x9, 0x50, + 0x0, 0x6, 0x80, 0x0, 0x0, 0x9, 0xdc, 0xcc, + 0xcd, 0x80, 0x0, 0x0, 0x9, 0x50, 0x0, 0x6, + 0x80, 0x0, 0x0, 0x7, 0xcc, 0xee, 0xcc, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, + 0x2d, 0xdd, 0xde, 0xff, 0xed, 0xdd, 0xd3, 0x0, + 0x0, 0x4c, 0xaa, 0xc3, 0x0, 0x0, 0x0, 0x7, + 0xc1, 0x77, 0x1c, 0x70, 0x0, 0x17, 0xd7, 0x0, + 0x77, 0x0, 0x7d, 0x81, 0x18, 0x10, 0x0, 0x77, + 0x0, 0x0, 0x71, + + /* U+67E5 "查" */ + 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x2c, 0xcc, + 0xcd, 0xff, 0xdc, 0xcc, 0xc2, 0x0, 0x0, 0x5c, + 0x98, 0xd5, 0x0, 0x0, 0x0, 0x8, 0xc0, 0x76, + 0x1c, 0x91, 0x0, 0x17, 0xe8, 0x0, 0x54, 0x0, + 0x7e, 0xa2, 0x29, 0x19, 0xbb, 0xbb, 0xbb, 0x91, + 0x81, 0x0, 0xd, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0xd, 0xba, 0xaa, 0xab, 0xd0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0xc, + 0xbb, 0xbb, 0xbb, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd0, + + /* U+67F1 "柱" */ + 0x0, 0xe, 0x0, 0x0, 0x39, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x8, 0x40, 0x0, 0x1d, 0xef, 0xda, + 0xcc, 0xcf, 0xdc, 0xc2, 0x0, 0x3e, 0x0, 0x0, + 0xe, 0x10, 0x0, 0x0, 0x8f, 0x80, 0x0, 0xe, + 0x10, 0x0, 0x0, 0xbe, 0xa4, 0x0, 0xe, 0x10, + 0x0, 0x4, 0x8e, 0x18, 0x9d, 0xdf, 0xdd, 0xb0, + 0xb, 0x2e, 0x0, 0x0, 0xe, 0x10, 0x0, 0x2a, + 0xe, 0x0, 0x0, 0xe, 0x10, 0x0, 0x1, 0xe, + 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0xe, 0x6, 0xdd, + 0xdf, 0xdd, 0xd6, + + /* U+67FB "査" */ + 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x2c, 0xcc, + 0xcd, 0xff, 0xdc, 0xcc, 0xc2, 0x0, 0x0, 0x5c, + 0x98, 0xc4, 0x0, 0x0, 0x0, 0x9, 0xb1, 0x76, + 0x1c, 0x91, 0x0, 0x18, 0xd6, 0x0, 0x54, 0x0, + 0x6d, 0xa2, 0x17, 0xb, 0xcc, 0xcc, 0xcc, 0xb0, + 0x61, 0x0, 0xd, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0xbb, 0xbb, 0xbb, 0xe0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xd, + 0xbb, 0xbb, 0xbb, 0xe0, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x3d, 0xdf, 0xdd, 0xdd, + 0xdd, 0xfd, 0xd3, + + /* U+67FF "柿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x85, + 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, 0x85, 0x9, + 0xdd, 0xdf, 0xdd, 0xd5, 0x6d, 0xfe, 0xd2, 0x11, + 0x1e, 0x11, 0x10, 0x0, 0xd7, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x1, 0xfe, 0x10, 0xfd, 0xdf, 0xdd, + 0xd0, 0x5, 0xe9, 0xa0, 0xe0, 0xe, 0x0, 0xe0, + 0xb, 0x95, 0x90, 0xe0, 0xe, 0x0, 0xe0, 0x2b, + 0x85, 0x0, 0xe0, 0xe, 0x0, 0xe0, 0x74, 0x85, + 0x0, 0xe0, 0xe, 0x0, 0xe0, 0x10, 0x85, 0x0, + 0xe0, 0xe, 0x4d, 0xa0, 0x0, 0x85, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x85, 0x0, 0x0, 0xe, + 0x0, 0x0, + + /* U+6811 "树" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x75, 0x0, 0x0, 0x0, 0x4, 0x90, 0x0, 0x75, + 0x4, 0x44, 0x20, 0x4, 0x90, 0x0, 0x75, 0x8, + 0x8b, 0x90, 0x4, 0x90, 0x1d, 0xee, 0x90, 0x7, + 0x8d, 0xde, 0xe9, 0x0, 0xb6, 0xb, 0xa, 0x40, + 0x4, 0x90, 0x0, 0xed, 0x7, 0x7d, 0x14, 0x4, + 0x90, 0x2, 0xfa, 0x60, 0xdd, 0x5, 0x84, 0x90, + 0x7, 0xc5, 0x90, 0x6c, 0x0, 0xc5, 0x90, 0xc, + 0x85, 0x0, 0xbe, 0x40, 0x57, 0x90, 0x38, 0x75, + 0x1, 0xd3, 0xd0, 0x4, 0x90, 0x1, 0x75, 0x9, + 0x60, 0x20, 0x4, 0x90, 0x0, 0x75, 0x3b, 0x0, + 0x0, 0x4, 0x90, 0x0, 0x75, 0x1, 0x0, 0x2, + 0xed, 0x50, + + /* U+6821 "校" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x39, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x39, 0x5, + 0xcc, 0xcd, 0xcc, 0xc3, 0x1d, 0xef, 0xd3, 0x15, + 0x21, 0x61, 0x10, 0x0, 0x9a, 0x0, 0x2d, 0x0, + 0x6b, 0x0, 0x0, 0xdf, 0x31, 0xc4, 0x0, 0x8, + 0x90, 0x2, 0xdb, 0xb8, 0x7b, 0x0, 0x76, 0xa0, + 0x8, 0x79, 0x81, 0xb, 0x30, 0xd1, 0x0, 0xc, + 0x49, 0x0, 0x3, 0xc6, 0xa0, 0x0, 0x66, 0x39, + 0x0, 0x0, 0x9f, 0x10, 0x0, 0x0, 0x39, 0x0, + 0x3, 0xec, 0xa0, 0x0, 0x0, 0x39, 0x0, 0x7d, + 0x30, 0x9d, 0x50, 0x0, 0x39, 0x9, 0x91, 0x0, + 0x3, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+682A "株" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x2, 0xe, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x1d, 0xe, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x4a, 0xe, 0x0, 0x0, 0x1d, 0xef, 0xda, 0x8e, + 0xdf, 0xdd, 0xa0, 0x0, 0x4f, 0x10, 0xe1, 0xe, + 0x0, 0x0, 0x0, 0x9f, 0xa1, 0x60, 0xe, 0x0, + 0x0, 0x0, 0xae, 0x79, 0xdd, 0xdf, 0xdd, 0xd4, + 0x6, 0x5e, 0x2, 0x0, 0xbf, 0xc0, 0x0, 0x1c, + 0xe, 0x0, 0x5, 0x9e, 0x76, 0x0, 0x36, 0xe, + 0x0, 0xd, 0x1e, 0xd, 0x10, 0x0, 0xe, 0x0, + 0xb5, 0xe, 0x5, 0xb0, 0x0, 0xe, 0xa, 0x60, + 0xe, 0x0, 0x86, 0x0, 0xe, 0x1, 0x0, 0xe, + 0x0, 0x0, + + /* U+6839 "根" */ + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0xdd, 0xdd, 0xdf, 0x30, 0x2, 0x2e, + 0x21, 0xd0, 0x0, 0xb, 0x30, 0xa, 0xaf, 0xa6, + 0xdb, 0xaa, 0xae, 0x30, 0x0, 0x4f, 0x10, 0xd2, + 0x11, 0x1b, 0x30, 0x0, 0x9f, 0xa0, 0xd0, 0x0, + 0xb, 0x30, 0x0, 0xcd, 0x94, 0xdd, 0xdd, 0xdf, + 0x30, 0x5, 0x8d, 0x13, 0xd0, 0x57, 0x0, 0x40, + 0xd, 0x2d, 0x0, 0xd0, 0xd, 0x2b, 0x70, 0x18, + 0xd, 0x0, 0xd0, 0x8, 0xd3, 0x0, 0x0, 0xd, + 0x0, 0xd0, 0x1, 0xd3, 0x0, 0x0, 0xd, 0x0, + 0xd6, 0x98, 0x2e, 0x70, 0x0, 0xd, 0x0, 0xd8, + 0x30, 0x2, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+683C "格" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x5, 0xf7, 0x66, 0x40, 0x0, 0x0, + 0xe0, 0x1, 0xe8, 0x66, 0xc7, 0x0, 0x1d, 0xdf, + 0xdc, 0xcb, 0xa0, 0x3e, 0x0, 0x0, 0x3, 0xf0, + 0x68, 0xa, 0x7d, 0x50, 0x0, 0x0, 0x8f, 0x90, + 0x0, 0x2f, 0xb0, 0x0, 0x0, 0xb, 0xe9, 0x50, + 0x3d, 0x7b, 0xa1, 0x0, 0x3, 0x9e, 0x19, 0xbc, + 0x20, 0x6, 0xe9, 0x0, 0xa3, 0xe0, 0x89, 0xec, + 0xcc, 0xdc, 0x30, 0x3a, 0xe, 0x0, 0x49, 0x0, + 0x2, 0xb0, 0x0, 0x20, 0xe0, 0x4, 0x90, 0x0, + 0x2b, 0x0, 0x0, 0xe, 0x0, 0x4a, 0x22, 0x24, + 0xb0, 0x0, 0x0, 0xe0, 0x4, 0xda, 0xaa, 0xbb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6843 "桃" */ + 0x0, 0x58, 0x0, 0x2, 0xb0, 0xe0, 0x0, 0x0, + 0x58, 0x0, 0x2, 0xb0, 0xe0, 0x0, 0x0, 0x58, + 0x3, 0x32, 0xb0, 0xe0, 0x62, 0x3d, 0xef, 0xc2, + 0xc2, 0xb0, 0xe0, 0xd0, 0x0, 0x9a, 0x0, 0xa6, + 0xb0, 0xe7, 0x60, 0x0, 0xef, 0x50, 0x35, 0xb0, + 0xe5, 0x0, 0x2, 0xf9, 0xc1, 0x2, 0xa0, 0xe1, + 0x0, 0x8, 0xa8, 0x30, 0x1c, 0xa0, 0xec, 0x30, + 0xd, 0x68, 0x6, 0xd8, 0x70, 0xe1, 0xc2, 0x47, + 0x58, 0x8, 0x19, 0x30, 0xe0, 0x24, 0x0, 0x58, + 0x0, 0x1b, 0x0, 0xe0, 0x14, 0x0, 0x58, 0x1, + 0xb3, 0x0, 0xe0, 0x3a, 0x0, 0x58, 0x1b, 0x20, + 0x0, 0xbd, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6848 "案" */ + 0x0, 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x8, + 0xcc, 0xcc, 0xdf, 0xcc, 0xcc, 0xc1, 0xa, 0x30, + 0x2, 0x80, 0x0, 0x0, 0xc1, 0x3, 0x21, 0x1a, + 0x61, 0x11, 0x11, 0x40, 0xa, 0xaa, 0xec, 0xaa, + 0xae, 0xda, 0xa3, 0x0, 0x7, 0xc2, 0x0, 0x6c, + 0x0, 0x0, 0x0, 0x3, 0x6c, 0xfe, 0xf7, 0x30, + 0x0, 0x9, 0xcb, 0xb7, 0x64, 0x15, 0xae, 0x80, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x1d, + 0xdd, 0xdd, 0xff, 0xed, 0xdd, 0xd5, 0x0, 0x0, + 0x5b, 0x8a, 0xb9, 0x10, 0x0, 0x2, 0x7c, 0x80, + 0x59, 0x5, 0xc9, 0x40, 0x1a, 0x50, 0x0, 0x59, + 0x0, 0x3, 0x96, + + /* U+689D "條" */ + 0x0, 0x9, 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x6, 0xf8, 0x88, 0x30, 0x0, 0xa4, + 0xc0, 0x5f, 0x63, 0x4e, 0x10, 0x2, 0xf0, 0xd3, + 0xc4, 0xc1, 0xc6, 0x0, 0xb, 0xf0, 0xd0, 0x0, + 0x6f, 0x80, 0x0, 0x5d, 0xe0, 0xd0, 0x28, 0xc6, + 0xd8, 0x20, 0x43, 0xe0, 0xd6, 0xb5, 0xb, 0x6, + 0xb3, 0x0, 0xe0, 0xd0, 0x33, 0x3e, 0x33, 0x30, + 0x0, 0xe0, 0xd2, 0x99, 0x9f, 0x99, 0x90, 0x0, + 0xe0, 0xd0, 0x37, 0xe, 0x9, 0x0, 0x0, 0xe0, + 0x80, 0xd2, 0xe, 0x7, 0x80, 0x0, 0xe0, 0xb, + 0x50, 0xe, 0x0, 0xb1, 0x0, 0xe0, 0x1, 0x6, + 0xd8, 0x0, 0x0, + + /* U+68B0 "械" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x66, 0x0, 0x0, 0x5, 0x86, 0x0, 0x0, 0x66, + 0x0, 0x0, 0x5, 0x94, 0xb0, 0x0, 0x66, 0x0, + 0x0, 0x5, 0x90, 0x40, 0xa, 0xdd, 0x7b, 0xee, + 0xef, 0xfe, 0xe7, 0x4, 0xa9, 0x30, 0x20, 0x32, + 0xb0, 0x0, 0x0, 0xcd, 0x0, 0xc0, 0xc1, 0xc0, + 0x63, 0x1, 0xfb, 0x80, 0xc0, 0xc0, 0xd0, 0xd1, + 0x5, 0xc7, 0x4a, 0xfc, 0xf7, 0xd3, 0xc0, 0xc, + 0x76, 0x1, 0xb0, 0xc0, 0xbb, 0x50, 0x49, 0x66, + 0x3, 0x80, 0xc0, 0x8d, 0x0, 0x22, 0x66, 0x7, + 0x50, 0xc0, 0xba, 0x5, 0x0, 0x66, 0x1c, 0x0, + 0xba, 0x7d, 0x39, 0x0, 0x66, 0x12, 0x0, 0x84, + 0x5, 0xe4, + + /* U+68EE "森" */ + 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0x4, + 0xdd, 0xde, 0xff, 0xfd, 0xdd, 0xc0, 0x0, 0x0, + 0x3, 0xc9, 0xba, 0x80, 0x0, 0x0, 0x0, 0x29, + 0xb1, 0x5a, 0x6, 0xc6, 0x10, 0x0, 0x7b, 0x51, + 0x5, 0xa0, 0x2, 0x6c, 0x30, 0x0, 0x7, 0x60, + 0x1, 0x3, 0xb0, 0x0, 0x0, 0x22, 0x97, 0x21, + 0x12, 0x5b, 0x22, 0x10, 0xa, 0xbf, 0xca, 0x58, + 0xbf, 0xfc, 0xa7, 0x0, 0x7, 0xed, 0x30, 0x6, + 0xcc, 0xb0, 0x0, 0x5, 0xb8, 0x7b, 0x34, 0xc3, + 0xb5, 0xa0, 0x3, 0xc1, 0x76, 0x8, 0xb1, 0x3b, + 0x7, 0xb0, 0x0, 0x7, 0x60, 0x20, 0x3, 0xb0, + 0x2, 0x0, + + /* U+690D "植" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x76, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x76, + 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x76, 0x9, + 0xcd, 0xfc, 0xcc, 0xa0, 0x3d, 0xee, 0xc0, 0x2, + 0xb0, 0x0, 0x0, 0x0, 0xa7, 0x2, 0xeb, 0xbb, + 0xbf, 0x0, 0x0, 0xfe, 0x12, 0xb0, 0x0, 0xe, + 0x0, 0x4, 0xea, 0xa2, 0xeb, 0xbb, 0xbf, 0x0, + 0xa, 0x96, 0x62, 0xb0, 0x0, 0xe, 0x0, 0x1c, + 0x76, 0x2, 0xea, 0xaa, 0xaf, 0x0, 0x75, 0x76, + 0x2, 0xb0, 0x0, 0xe, 0x0, 0x0, 0x76, 0x2, + 0xeb, 0xbb, 0xbf, 0x0, 0x0, 0x76, 0x2, 0xb0, + 0x0, 0xe, 0x0, 0x0, 0x76, 0x5d, 0xfc, 0xcc, + 0xcf, 0xc3, + + /* U+691C "検" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0xae, 0x20, 0x0, 0x0, 0x3a, + 0x0, 0x7, 0xb4, 0xd1, 0x0, 0x0, 0x3a, 0x0, + 0x9b, 0x0, 0x4d, 0x50, 0x3d, 0xef, 0xde, 0xda, + 0x99, 0x9b, 0xc6, 0x0, 0x8a, 0x1, 0x12, 0x6a, + 0x22, 0x0, 0x0, 0xdc, 0x0, 0x0, 0x49, 0x0, + 0x0, 0x2, 0xff, 0x85, 0xdb, 0xce, 0xbc, 0xc0, + 0x8, 0x9a, 0xb7, 0x70, 0x49, 0x1, 0xc0, 0x1d, + 0x4a, 0x5, 0xda, 0xcd, 0xaa, 0xc0, 0x66, 0x3a, + 0x0, 0x11, 0xae, 0x41, 0x10, 0x0, 0x3a, 0x0, + 0x4, 0xd3, 0xc0, 0x0, 0x0, 0x3a, 0x0, 0x7d, + 0x20, 0x6c, 0x40, 0x0, 0x3a, 0x1d, 0x80, 0x0, + 0x3, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+695A "楚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, 0x0, 0xb, 0x20, 0x0, 0x9, 0xad, + 0xca, 0x4a, 0xae, 0xba, 0x90, 0x2, 0x5f, 0xd4, + 0x12, 0x8f, 0xc3, 0x20, 0x2, 0xc9, 0x8c, 0x23, + 0xac, 0x6b, 0x20, 0x2d, 0x28, 0x61, 0x4c, 0x1b, + 0x22, 0xc0, 0x0, 0x5, 0x40, 0x0, 0x7, 0x10, + 0x0, 0xb, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xb0, + 0x0, 0x3, 0x10, 0x95, 0x0, 0x8, 0x80, 0x0, + 0xe, 0x10, 0x85, 0x0, 0x8, 0x10, 0x0, 0x3f, + 0x10, 0x8e, 0xdd, 0xd6, 0x0, 0x0, 0x8d, 0x90, + 0x85, 0x0, 0x0, 0x0, 0x4, 0xe1, 0xbb, 0xa5, + 0x0, 0x0, 0x0, 0x2d, 0x30, 0x6, 0xbe, 0xee, + 0xee, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+696D "業" */ + 0x0, 0x81, 0xc, 0x11, 0xc0, 0x9, 0x0, 0x0, + 0x5a, 0xc, 0x11, 0xc0, 0x79, 0x0, 0x0, 0xc, + 0xc, 0x11, 0xc0, 0xc1, 0x0, 0xc, 0xcc, 0xfc, + 0xcc, 0xcf, 0xdc, 0xc0, 0x0, 0x0, 0xb4, 0x0, + 0x3b, 0x0, 0x0, 0x6, 0xcc, 0xde, 0xcc, 0xed, + 0xcc, 0x70, 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, + 0x0, 0x0, 0x8b, 0xbb, 0xdd, 0xbb, 0xba, 0x0, + 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x1c, + 0xcc, 0xce, 0xff, 0xec, 0xcc, 0xc1, 0x0, 0x1, + 0x9b, 0x98, 0xb8, 0x0, 0x0, 0x4, 0xad, 0x50, + 0x76, 0x6, 0xd9, 0x40, 0x29, 0x40, 0x0, 0x76, + 0x0, 0x4, 0xa2, + + /* U+6975 "極" */ + 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x75, 0xc, 0xdd, 0xdd, 0xdf, 0x90, 0x0, 0x75, + 0x0, 0x0, 0x2, 0xb8, 0x0, 0x1e, 0xfe, 0x80, + 0x0, 0x6b, 0x20, 0x0, 0x0, 0xb5, 0xd, 0xb9, + 0x85, 0xbb, 0xe2, 0x0, 0xfd, 0xb, 0xa, 0x85, + 0x30, 0xc0, 0x3, 0xf9, 0x8b, 0xa, 0x85, 0xa7, + 0xa0, 0x8, 0xa5, 0x2b, 0xa, 0x84, 0xd, 0x50, + 0x1c, 0x75, 0xe, 0xba, 0x84, 0x2d, 0xa0, 0x46, + 0x75, 0xb, 0x0, 0x86, 0xc2, 0xa2, 0x0, 0x75, + 0x0, 0xa, 0xb4, 0x30, 0x10, 0x0, 0x75, 0x7a, + 0xaa, 0xaa, 0xaa, 0xa7, 0x0, 0x75, 0x22, 0x22, + 0x22, 0x22, 0x22, + + /* U+697D "楽" */ + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x6, + 0x10, 0x1, 0xa6, 0x10, 0x3, 0x80, 0x3, 0xd3, + 0x8c, 0xaa, 0xc9, 0x3c, 0x20, 0x0, 0x29, 0x84, + 0x0, 0x4a, 0x91, 0x0, 0x0, 0x2, 0x9d, 0xbb, + 0xda, 0x50, 0x0, 0x1, 0xab, 0x94, 0x0, 0x4a, + 0x9c, 0x30, 0x3d, 0x50, 0x8d, 0xcc, 0xd9, 0x3, + 0xd2, 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, + 0x2d, 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0xd3, 0x0, + 0x0, 0x3c, 0xbb, 0xc2, 0x0, 0x0, 0x0, 0x6, + 0xd2, 0x77, 0x2d, 0x60, 0x0, 0x7, 0xd9, 0x10, + 0x77, 0x1, 0x9d, 0x81, 0x29, 0x20, 0x0, 0x77, + 0x0, 0x1, 0x71, + + /* U+6982 "概" */ + 0x0, 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x84, 0x1e, 0xce, 0x3d, 0xdf, 0xd4, 0x0, 0x84, + 0x19, 0xb, 0x1, 0xc, 0x0, 0xc, 0xed, 0x8d, + 0x9e, 0xb, 0x1c, 0x0, 0x0, 0xb5, 0x1a, 0x1b, + 0xc, 0xc, 0x0, 0x0, 0xfc, 0x19, 0xb, 0x2b, + 0x1b, 0x0, 0x3, 0xfc, 0x7e, 0xce, 0x6d, 0xee, + 0xc6, 0x7, 0xd6, 0x79, 0x0, 0x0, 0x98, 0x0, + 0xc, 0x94, 0x19, 0x29, 0x0, 0xec, 0x0, 0x49, + 0x84, 0x19, 0x3e, 0x16, 0x8c, 0x0, 0x1, 0x84, + 0x3e, 0xa6, 0x5d, 0x1c, 0x5, 0x0, 0x84, 0x65, + 0x0, 0xa4, 0xc, 0x8, 0x0, 0x84, 0x0, 0x6, + 0x60, 0xc, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+69CB "構" */ + 0x0, 0xc, 0x0, 0xd, 0x0, 0x2c, 0x0, 0x0, + 0xc, 0x3, 0xbf, 0xbb, 0xce, 0xb6, 0x0, 0xc, + 0x0, 0x1d, 0x21, 0x3c, 0x10, 0x1e, 0xef, 0xe7, + 0x9e, 0xa9, 0xae, 0x93, 0x0, 0x5c, 0x3, 0x5e, + 0x65, 0x7d, 0x54, 0x0, 0x9f, 0x23, 0x55, 0x6f, + 0x55, 0x54, 0x0, 0xce, 0xb0, 0xab, 0xbf, 0xbb, + 0xb0, 0x4, 0x8c, 0x75, 0xc0, 0x1e, 0x0, 0xc0, + 0xb, 0x2c, 0x0, 0xeb, 0xbf, 0xbb, 0xf0, 0x39, + 0xc, 0x0, 0xc0, 0x1e, 0x0, 0xc0, 0x1, 0xc, + 0xa, 0xfb, 0xcc, 0xbb, 0xfc, 0x0, 0xc, 0x0, + 0xc0, 0x0, 0x0, 0xc0, 0x0, 0xc, 0x0, 0xc0, + 0x0, 0x6b, 0xc0, + + /* U+69D8 "様" */ + 0x0, 0xc, 0x0, 0xa, 0x0, 0xc, 0x10, 0x0, + 0xc, 0x0, 0xb, 0x30, 0x3b, 0x0, 0x0, 0xc, + 0x3, 0xcd, 0xce, 0xcd, 0xc4, 0xa, 0xae, 0xa4, + 0x0, 0xe, 0x0, 0x0, 0x4, 0x8d, 0x42, 0xac, + 0xcf, 0xcc, 0xc0, 0x0, 0x8e, 0x10, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xce, 0xa7, 0xcc, 0xcf, 0xcc, + 0xc6, 0x3, 0x9c, 0x85, 0x60, 0xf, 0x10, 0x61, + 0xb, 0x3c, 0x11, 0x79, 0xf, 0x87, 0x90, 0x39, + 0xc, 0x0, 0x6, 0x2e, 0xb9, 0x0, 0x1, 0xc, + 0x0, 0x5c, 0x5e, 0x1d, 0x20, 0x0, 0xc, 0xc, + 0x91, 0xe, 0x2, 0xd6, 0x0, 0xc, 0x0, 0x7, + 0xda, 0x0, 0x2, + + /* U+6A02 "樂" */ + 0x0, 0x82, 0x0, 0xa2, 0x0, 0x64, 0x0, 0x0, + 0xb0, 0x19, 0xe9, 0x60, 0xc0, 0x0, 0x6, 0x57, + 0x5d, 0x25, 0xa4, 0x82, 0xa0, 0x1e, 0xab, 0xd, + 0x3, 0xad, 0x9c, 0x20, 0x4, 0xa3, 0xf, 0xbc, + 0xa7, 0x88, 0x0, 0x5, 0x65, 0x5d, 0x3, 0xa1, + 0xa2, 0x70, 0x1e, 0xa9, 0x9d, 0xbc, 0x9c, 0xca, + 0xc0, 0x0, 0x0, 0x10, 0x83, 0x1, 0x0, 0x20, + 0x5c, 0xcc, 0xcd, 0xfe, 0xcc, 0xcc, 0xc1, 0x0, + 0x0, 0x3c, 0xdb, 0xa1, 0x0, 0x0, 0x0, 0x19, + 0xb1, 0xa4, 0x3c, 0x71, 0x0, 0x3b, 0xc5, 0x0, + 0xa4, 0x0, 0x6d, 0xa1, 0x14, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0x50, + + /* U+6A19 "標" */ + 0x0, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0xa, 0xcd, 0xed, 0xec, 0xc3, 0x0, 0x67, + 0x2, 0x69, 0xb7, 0xc6, 0x50, 0x6e, 0xff, 0xe7, + 0x86, 0x95, 0xb3, 0xd0, 0x0, 0xa7, 0x5, 0x63, + 0x71, 0x90, 0xd0, 0x0, 0xfb, 0x5, 0xed, 0xed, + 0xec, 0xe0, 0x4, 0xee, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x98, 0xc0, 0xbb, 0xbb, 0xbb, 0x60, + 0x1c, 0x67, 0x20, 0x0, 0x0, 0x0, 0x0, 0x85, + 0x67, 0xb, 0xcc, 0xde, 0xcc, 0xc3, 0x20, 0x67, + 0x0, 0xa3, 0x49, 0x1a, 0x10, 0x0, 0x67, 0x1b, + 0x70, 0x49, 0x4, 0xc1, 0x0, 0x67, 0x13, 0x9, + 0xd6, 0x0, 0x30, + + /* U+6A21 "模" */ + 0x0, 0x76, 0x0, 0xe, 0x0, 0xe0, 0x0, 0x0, + 0x76, 0xa, 0xaf, 0xaa, 0xfa, 0xa0, 0x0, 0x76, + 0x3, 0x3e, 0x33, 0xe3, 0x30, 0x3d, 0xee, 0xc2, + 0x79, 0x77, 0x97, 0x20, 0x0, 0xa8, 0x5, 0xa5, + 0x55, 0x5b, 0x40, 0x0, 0xee, 0x25, 0xdb, 0xbb, + 0xbe, 0x40, 0x3, 0xf9, 0xa5, 0x70, 0x0, 0x9, + 0x40, 0x9, 0xa6, 0x75, 0xcb, 0xbb, 0xbd, 0x40, + 0x1c, 0x76, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x55, + 0x76, 0x3c, 0xcd, 0xfd, 0xcc, 0xc0, 0x0, 0x76, + 0x0, 0x7, 0x9a, 0x40, 0x0, 0x0, 0x76, 0x0, + 0x8c, 0x10, 0xc7, 0x10, 0x0, 0x76, 0x5c, 0x70, + 0x0, 0x6, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6A23 "樣" */ + 0x0, 0xc, 0x0, 0xb, 0x0, 0xb, 0x0, 0x0, + 0xc, 0x1, 0x5b, 0x85, 0x9a, 0x51, 0x0, 0xc, + 0x1, 0x55, 0x5f, 0x55, 0x52, 0x1e, 0xef, 0xe6, + 0x7a, 0xaf, 0xaa, 0x90, 0x0, 0x5c, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0xaf, 0x27, 0xcc, 0xcf, + 0xcc, 0xc6, 0x0, 0xde, 0xb0, 0x0, 0xaa, 0x40, + 0x0, 0x4, 0x8c, 0x75, 0x47, 0x78, 0x83, 0x0, + 0xb, 0x3c, 0x0, 0x23, 0x3f, 0x12, 0xc0, 0x39, + 0xc, 0x7, 0xad, 0x3f, 0xbb, 0x20, 0x1, 0xc, + 0x0, 0x2b, 0xe, 0x78, 0x0, 0x0, 0xc, 0x5, + 0xc2, 0xe, 0x7, 0xb3, 0x0, 0xc, 0x6, 0x5, + 0xcb, 0x0, 0x23, + + /* U+6A2A "横" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x0, 0xc, 0x10, 0x1c, 0x0, 0x0, 0x1c, + 0x3, 0xae, 0xaa, 0xae, 0xa5, 0x0, 0x1c, 0x0, + 0x2d, 0x32, 0x3d, 0x21, 0xb, 0xbf, 0xb5, 0xc, + 0x10, 0x1c, 0x0, 0x4, 0x8d, 0x4a, 0xcc, 0xdf, + 0xcc, 0xca, 0x0, 0x8e, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x0, 0xdf, 0x81, 0xea, 0xbf, 0xaa, 0xd4, + 0x3, 0x9c, 0xa5, 0xa0, 0x1f, 0x0, 0x94, 0xa, + 0x4c, 0x23, 0xea, 0xbf, 0xaa, 0xd4, 0x3a, 0x1c, + 0x1, 0xa0, 0x2f, 0x0, 0x94, 0x12, 0x1c, 0x1, + 0xaa, 0xaa, 0xaa, 0xa3, 0x0, 0x1c, 0x0, 0x4d, + 0x20, 0x1b, 0x50, 0x0, 0x1c, 0x9, 0x91, 0x0, + 0x0, 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6A39 "樹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x57, 0x0, 0xd, 0x0, 0x0, 0xd0, 0x0, 0x57, + 0x1, 0x1d, 0x11, 0x0, 0xd0, 0x0, 0x57, 0x3b, + 0xbf, 0xba, 0x0, 0xd0, 0x9, 0xbc, 0x71, 0x1d, + 0x11, 0x66, 0xe5, 0x3, 0xa9, 0x28, 0x88, 0x85, + 0x55, 0xe4, 0x0, 0xcb, 0x9, 0xbb, 0xb5, 0x40, + 0xd0, 0x1, 0xfd, 0x4c, 0x10, 0x57, 0xc0, 0xd0, + 0x5, 0xa8, 0xac, 0x10, 0x57, 0x84, 0xd0, 0xb, + 0x67, 0x28, 0xbb, 0xb5, 0x57, 0xd0, 0x38, 0x57, + 0x5, 0x60, 0xa2, 0x12, 0xd0, 0x1, 0x57, 0x2, + 0xd1, 0xd0, 0x0, 0xd0, 0x0, 0x57, 0x13, 0x99, + 0xdb, 0x10, 0xe0, 0x0, 0x57, 0x49, 0x64, 0x10, + 0x6d, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6A4B "橋" */ + 0x0, 0x58, 0x0, 0x1, 0x23, 0x58, 0x10, 0x0, + 0x58, 0x4, 0xa9, 0xf8, 0x53, 0x0, 0x0, 0x58, + 0x5, 0x67, 0xe6, 0x66, 0x61, 0x3b, 0xdd, 0xb5, + 0x5e, 0x75, 0xd7, 0x51, 0x3, 0xaa, 0x30, 0x9f, + 0xaa, 0xcd, 0x20, 0x0, 0xda, 0xc, 0x8c, 0x0, + 0x69, 0xd4, 0x2, 0xfe, 0x51, 0xd, 0xaa, 0xb5, + 0x0, 0x7, 0x98, 0xc4, 0x66, 0x66, 0x66, 0x60, + 0xc, 0x58, 0x28, 0x84, 0x44, 0x44, 0xe0, 0x66, + 0x58, 0x8, 0x48, 0xaa, 0xd0, 0xd0, 0x10, 0x58, + 0x8, 0x49, 0x20, 0xb0, 0xd0, 0x0, 0x58, 0x8, + 0x49, 0xba, 0xa0, 0xd0, 0x0, 0x58, 0x8, 0x43, + 0x0, 0x5c, 0xc0, + + /* U+6A5F "機" */ + 0x0, 0xc0, 0x2, 0x31, 0xa0, 0x33, 0x0, 0x0, + 0xc0, 0x9, 0x20, 0xc0, 0x91, 0x0, 0x0, 0xc0, + 0x18, 0x44, 0xd3, 0x87, 0x50, 0x6e, 0xfd, 0xbb, + 0xb0, 0xd8, 0xbc, 0x0, 0x2, 0xe0, 0x17, 0x63, + 0xc0, 0x94, 0x60, 0x6, 0xf5, 0x5b, 0xaa, 0xb8, + 0xd9, 0xb0, 0xa, 0xcb, 0x39, 0x15, 0x94, 0x77, + 0x20, 0x19, 0xc2, 0x8e, 0xbb, 0xdc, 0xbe, 0xa0, + 0x74, 0xc0, 0xe, 0x20, 0x4a, 0x19, 0x10, 0x50, + 0xc0, 0x1e, 0xc3, 0xd, 0x69, 0x0, 0x0, 0xc0, + 0x58, 0x1b, 0xa, 0xc0, 0x20, 0x0, 0xc1, 0xc1, + 0x2, 0xaa, 0xd3, 0x93, 0x0, 0xc6, 0x40, 0x1b, + 0x30, 0x3c, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6B21 "次" */ + 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x5, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xd3, + 0x2, 0xe1, 0x11, 0x11, 0x0, 0x0, 0x3c, 0x7, + 0xed, 0xdd, 0xdd, 0xd0, 0x0, 0x0, 0xe, 0x30, + 0x70, 0x6, 0x80, 0x0, 0x0, 0x7c, 0x0, 0xf0, + 0xc, 0x30, 0x0, 0x0, 0x73, 0x0, 0xf0, 0x1a, + 0x0, 0x0, 0xb, 0x10, 0x3, 0xf4, 0x0, 0x0, + 0x0, 0x7b, 0x0, 0x8, 0xda, 0x0, 0x0, 0x2, + 0xe1, 0x0, 0x1e, 0x2d, 0x20, 0x0, 0xd, 0x60, + 0x0, 0xb8, 0x5, 0xc0, 0x0, 0x19, 0x0, 0x1b, + 0xa0, 0x0, 0x9c, 0x20, 0x0, 0x4, 0xe7, 0x0, + 0x0, 0x7, 0xe2, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x10, + + /* U+6B32 "欲" */ + 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, + 0x78, 0xc, 0x30, 0x95, 0x0, 0x0, 0x2, 0xd0, + 0x1, 0xd2, 0xc4, 0x11, 0x10, 0x1d, 0x32, 0x80, + 0x35, 0xec, 0xcc, 0xe8, 0x1, 0xb, 0xd5, 0x8, + 0x71, 0xb0, 0x94, 0x0, 0x59, 0xc, 0x5c, 0x3, + 0xa0, 0xc0, 0x6, 0xb0, 0x0, 0xc4, 0x4, 0xa0, + 0x10, 0x2c, 0xed, 0xdd, 0xb2, 0x7, 0xe0, 0x0, + 0x0, 0xe0, 0x2, 0xb0, 0xa, 0xc2, 0x0, 0x0, + 0xd0, 0x1, 0xb0, 0xb, 0x48, 0x0, 0x0, 0xd0, + 0x1, 0xb0, 0x77, 0xd, 0x10, 0x0, 0xfd, 0xdd, + 0xb3, 0xd1, 0x5, 0xc0, 0x0, 0xd0, 0x0, 0xb, + 0x20, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6B4C "歌" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x3d, + 0xdd, 0xde, 0xe8, 0x69, 0x0, 0x0, 0x0, 0x11, + 0x14, 0x90, 0x99, 0x33, 0x30, 0x7, 0xb9, 0xb4, + 0x90, 0xda, 0x99, 0xd4, 0x7, 0x30, 0xb4, 0x95, + 0xc1, 0x60, 0xc1, 0x5, 0xaa, 0x84, 0x9c, 0x42, + 0xb0, 0xc0, 0x25, 0x55, 0x58, 0xb6, 0x3, 0xb0, + 0x30, 0x26, 0x66, 0x68, 0xc6, 0x5, 0xe0, 0x0, + 0x7, 0xbb, 0x82, 0xa0, 0x8, 0xe3, 0x0, 0xa, + 0x20, 0xc2, 0xa0, 0xd, 0x49, 0x0, 0xa, 0xba, + 0xc2, 0xa0, 0x69, 0xc, 0x20, 0x9, 0x30, 0x2, + 0xa3, 0xe1, 0x3, 0xc0, 0x0, 0x0, 0x7b, 0x8c, + 0x30, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6B50 "歐" */ + 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, 0xe, 0xcc, + 0xcc, 0xc5, 0x89, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xb, 0x82, 0x22, 0xd, 0xe, 0xab, 0x61, 0xfb, + 0xbb, 0xf2, 0xd0, 0xb0, 0x36, 0x7c, 0x1, 0xd, + 0xd, 0xe, 0xab, 0x6d, 0x43, 0xa3, 0x70, 0xd0, + 0x0, 0x0, 0x10, 0x5a, 0x0, 0xd, 0x8a, 0x7c, + 0xd0, 0x7, 0xe0, 0x0, 0xd8, 0x17, 0x88, 0x0, + 0x9f, 0x30, 0xd, 0x85, 0x7a, 0xa0, 0xd, 0x59, + 0x0, 0xd3, 0x52, 0x55, 0x5, 0x90, 0xd2, 0xe, + 0xaa, 0xaa, 0xa9, 0xe2, 0x4, 0xc1, 0x11, 0x11, + 0x12, 0xa3, 0x0, 0x5, 0x30, + + /* U+6B61 "歡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x93, 0xa, 0x30, 0xd, 0x0, 0x0, 0x3b, 0xec, + 0xbe, 0xca, 0x1c, 0x0, 0x0, 0x0, 0x41, 0x4, + 0x10, 0x5e, 0xbb, 0xb5, 0xb, 0x9c, 0x5b, 0xb5, + 0x99, 0x66, 0xb5, 0xa, 0xa, 0x55, 0x46, 0xc0, + 0x80, 0xa1, 0x7, 0xb8, 0x48, 0x89, 0x70, 0xc0, + 0xb0, 0x0, 0xd4, 0xb6, 0x42, 0x0, 0xd0, 0x20, + 0x9, 0xc6, 0xb9, 0x63, 0x1, 0xf1, 0x0, 0x4c, + 0xda, 0xdc, 0xa2, 0x4, 0xf4, 0x0, 0x3, 0xa2, + 0x97, 0x21, 0xa, 0x6a, 0x0, 0x3, 0xc6, 0xb9, + 0x62, 0x2d, 0xb, 0x20, 0x3, 0xd9, 0xcb, 0x95, + 0xd5, 0x3, 0xc0, 0x3, 0x91, 0x11, 0x15, 0x90, + 0x0, 0x64, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6B62 "止" */ + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0xf, 0xee, + 0xee, 0xa0, 0x0, 0x77, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x77, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x77, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x5b, 0xdd, 0xbb, + 0xcf, 0xbb, 0xbb, 0xb0, 0x12, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x20, + + /* U+6B63 "正" */ + 0x8, 0xee, 0xee, 0xee, 0xee, 0xee, 0xd0, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0xf, 0xee, + 0xee, 0x40, 0x0, 0x2c, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0xe, 0x0, 0x0, 0x0, 0xa, 0xbe, + 0xaa, 0xbf, 0xaa, 0xaa, 0xa5, 0x3, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x31, + + /* U+6B64 "此" */ + 0x0, 0x0, 0x3b, 0x0, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0xe1, 0x0, 0x0, 0x0, 0xc0, 0x3b, + 0x0, 0xe1, 0x0, 0x50, 0x0, 0xe0, 0x3c, 0x22, + 0xe1, 0x3d, 0xb0, 0x0, 0xe0, 0x3e, 0xb9, 0xea, + 0xd5, 0x0, 0x0, 0xe0, 0x3b, 0x0, 0xe7, 0x0, + 0x0, 0x0, 0xe0, 0x3b, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xe0, 0x3b, 0x0, 0xe1, 0x0, 0x0, 0x0, + 0xe0, 0x3b, 0x0, 0xe1, 0x0, 0x14, 0x0, 0xe0, + 0x3b, 0x0, 0xe1, 0x0, 0x3a, 0x0, 0xe5, 0x9e, + 0xdc, 0xd4, 0x11, 0x78, 0x1f, 0xda, 0x74, 0x10, + 0x5c, 0xdd, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6B65 "步" */ + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0x5f, 0xdd, 0xda, 0x0, 0x0, 0xf, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x3, 0x3f, 0x33, 0x7b, + 0x33, 0x33, 0x30, 0x1a, 0xaa, 0xaa, 0xdd, 0xaa, + 0xaa, 0xa1, 0x0, 0x1, 0x70, 0x68, 0x0, 0x15, + 0x0, 0x0, 0xb, 0x60, 0x68, 0x0, 0xa7, 0x0, + 0x0, 0xaa, 0x0, 0x68, 0x6, 0xc0, 0x0, 0x6, + 0xa0, 0x0, 0x69, 0x8d, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xa0, 0x0, 0x0, 0x0, 0x3, 0x8e, + 0xb4, 0x0, 0x0, 0x0, 0x1d, 0xeb, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6B69 "歩" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x7e, 0xdd, 0xdc, 0x0, 0x0, 0x1d, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, 0x78, + 0x0, 0x0, 0x0, 0x2d, 0xdd, 0xdd, 0xee, 0xdd, + 0xdd, 0xd3, 0x0, 0x6, 0x40, 0x77, 0x1, 0x70, + 0x0, 0x0, 0x4d, 0x10, 0x77, 0x0, 0x8b, 0x0, + 0x7, 0xd2, 0x0, 0x77, 0x4, 0x98, 0xb0, 0x5, + 0x10, 0x5d, 0xd4, 0xd, 0x40, 0x50, 0x0, 0x0, + 0x0, 0x3, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xbd, 0x40, 0x0, 0x0, 0x0, 0xbe, 0xc9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6B6F "歯" */ + 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x5e, 0xcc, 0xcc, 0x0, 0x0, 0xd, + 0x0, 0x58, 0x0, 0x0, 0x0, 0xb, 0xbf, 0xbb, + 0xcd, 0xbb, 0xbb, 0xb5, 0x2, 0x42, 0x22, 0x34, + 0x22, 0x23, 0x31, 0x2, 0xa0, 0xa0, 0x57, 0xa, + 0x7, 0x70, 0x2, 0xa0, 0x66, 0x57, 0x57, 0x7, + 0x70, 0x2, 0xa8, 0xbb, 0xdd, 0xcc, 0xb7, 0x70, + 0x2, 0xa0, 0x4, 0xe8, 0x80, 0x7, 0x70, 0x2, + 0xa0, 0x5b, 0x67, 0x6a, 0x7, 0x70, 0x2, 0xa7, + 0xa0, 0x57, 0x5, 0x47, 0x70, 0x2, 0xb3, 0x22, + 0x55, 0x22, 0x28, 0x70, 0x1, 0xaa, 0xaa, 0xaa, + 0xaa, 0xad, 0x70, + + /* U+6B72 "歲" */ + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x5c, 0x77, 0x76, 0x0, 0x0, 0xd, + 0x0, 0x5a, 0x22, 0x22, 0x0, 0x1c, 0xcf, 0xcc, + 0xde, 0xcc, 0xcc, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0xc2, 0xb6, 0x0, 0x2, 0x88, 0x88, 0x88, 0xe9, + 0x9d, 0x80, 0x4, 0xa4, 0x44, 0x44, 0xb7, 0x44, + 0x40, 0x5, 0x88, 0xbc, 0xb8, 0x66, 0x1c, 0x0, + 0x5, 0x72, 0x2c, 0x3, 0x39, 0x86, 0x0, 0x7, + 0x6b, 0x2c, 0x39, 0xd, 0xc0, 0x0, 0x9, 0x6a, + 0xb, 0xc1, 0x1d, 0x60, 0x41, 0xd, 0x10, 0x4c, + 0x32, 0xc7, 0xd1, 0x92, 0x3a, 0xa, 0x80, 0x2c, + 0x20, 0x4c, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6B73 "歳" */ + 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x4e, 0xbb, 0xb8, 0x0, 0x0, 0xd, + 0x0, 0x49, 0x0, 0x0, 0x0, 0x1c, 0xcf, 0xdc, + 0xde, 0xcc, 0xcc, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0xa6, 0x0, 0x4, 0xcc, 0xcc, 0xcc, 0xfd, + 0xcf, 0xd1, 0x5, 0x80, 0x0, 0x0, 0x85, 0x2, + 0x0, 0x5, 0x89, 0xbb, 0xba, 0x58, 0xd, 0x20, + 0x6, 0x71, 0x1c, 0x0, 0x1c, 0x5b, 0x0, 0x7, + 0x59, 0x3c, 0x39, 0xc, 0xd3, 0x0, 0xa, 0x5c, + 0xc, 0xb, 0x1a, 0xb0, 0x23, 0xd, 0x23, 0xc, + 0x2, 0xc9, 0xc4, 0x55, 0x47, 0x0, 0xba, 0xb, + 0x50, 0x1b, 0xd1, + + /* U+6B77 "歷" */ + 0x0, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x0, + 0xd1, 0x36, 0xa3, 0x14, 0x6a, 0x40, 0x0, 0xd2, + 0x5b, 0x30, 0x25, 0xd0, 0x0, 0x0, 0xd6, 0xbd, + 0xca, 0x7b, 0xfb, 0xb5, 0x0, 0xd0, 0x4f, 0xa0, + 0xa, 0xec, 0x0, 0x1, 0xd2, 0xc9, 0x89, 0x76, + 0xc5, 0xb1, 0x2, 0xcc, 0x28, 0x33, 0xa0, 0xb0, + 0x69, 0x3, 0xb0, 0x0, 0x1, 0xb0, 0x0, 0x0, + 0x4, 0x90, 0x29, 0x1, 0xfc, 0xcc, 0x30, 0x7, + 0x60, 0x2b, 0x1, 0xd0, 0x0, 0x0, 0xc, 0x20, + 0x2b, 0x1, 0xd0, 0x0, 0x0, 0x2d, 0x3c, 0xdf, + 0xcd, 0xfc, 0xcc, 0xc8, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+6B7B "死" */ + 0x3e, 0xef, 0xfe, 0xee, 0xfe, 0xee, 0xe3, 0x0, + 0xa, 0x50, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x1e, + 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x7e, 0xbb, + 0xb1, 0xd1, 0x8, 0x90, 0x2, 0xd2, 0x22, 0xe0, + 0xd2, 0xbb, 0x0, 0xd, 0x51, 0x3, 0xb0, 0xde, + 0x70, 0x0, 0x37, 0x5c, 0x19, 0x60, 0xd3, 0x0, + 0x0, 0x0, 0x7, 0xdd, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xd5, 0x0, 0xd1, 0x0, 0x10, 0x0, + 0xa, 0x90, 0x0, 0xd1, 0x0, 0x75, 0x3, 0xc9, + 0x0, 0x0, 0xc3, 0x0, 0xa4, 0x2d, 0x50, 0x0, + 0x0, 0x6c, 0xdd, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+6B8A "殊" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x3d, + 0xee, 0xdd, 0x2c, 0xe, 0x0, 0x0, 0x0, 0xa4, + 0x0, 0x3b, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x8f, 0xef, 0xee, 0xb0, 0x3, 0xfd, 0xeb, 0xd1, + 0xe, 0x0, 0x0, 0xa, 0x60, 0x6b, 0x50, 0xe, + 0x0, 0x0, 0x2e, 0x70, 0xa7, 0xdd, 0xdf, 0xdd, + 0xd5, 0x55, 0x7d, 0xe0, 0x0, 0xbf, 0xc0, 0x0, + 0x0, 0x7, 0xa0, 0x7, 0x8e, 0x77, 0x0, 0x0, + 0xd, 0x30, 0x5c, 0xe, 0xc, 0x30, 0x0, 0x7a, + 0x7, 0xd1, 0xe, 0x2, 0xe4, 0x7, 0xd1, 0x19, + 0x0, 0xe, 0x0, 0x33, 0xa, 0x10, 0x0, 0x0, + 0xe, 0x0, 0x0, + + /* U+6B8B "残" */ + 0x0, 0x0, 0x0, 0x0, 0xe0, 0x50, 0x0, 0x3d, + 0xee, 0xdd, 0x10, 0xe0, 0x8b, 0x10, 0x0, 0x95, + 0x0, 0x0, 0xe0, 0x4, 0x10, 0x0, 0xd1, 0x0, + 0x36, 0xfb, 0xdd, 0x70, 0x1, 0xfd, 0xe8, 0x97, + 0xe4, 0x0, 0x0, 0x7, 0x80, 0x75, 0x0, 0xb3, + 0x14, 0x70, 0xe, 0x20, 0xb3, 0x58, 0xee, 0xc9, + 0x60, 0x59, 0xa7, 0xd1, 0x85, 0x87, 0x0, 0x80, + 0x0, 0xb, 0x80, 0x0, 0x3b, 0xb, 0x50, 0x0, + 0xd, 0x20, 0x0, 0xe, 0xc6, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x7f, 0x70, 0x20, 0x6, 0xd0, 0x2, + 0x8c, 0x63, 0xd2, 0x93, 0x2c, 0x10, 0x7, 0x60, + 0x0, 0x6e, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6BB5 "段" */ + 0x0, 0x0, 0x17, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0xc7, 0x10, 0xfc, 0xdc, 0x0, 0x1, 0xd1, + 0x0, 0x0, 0xd0, 0xc, 0x0, 0x1, 0xd1, 0x11, + 0x2, 0xb0, 0xc, 0x0, 0x1, 0xfb, 0xbb, 0x17, + 0x80, 0xd, 0x0, 0x1, 0xd0, 0x0, 0x4d, 0x10, + 0x8, 0xb8, 0x1, 0xd3, 0x33, 0x24, 0x22, 0x22, + 0x10, 0x1, 0xe9, 0x99, 0x2d, 0xca, 0xad, 0x90, + 0x1, 0xd0, 0x0, 0x3, 0xa0, 0xc, 0x30, 0x2, + 0xe5, 0x7a, 0x40, 0xa5, 0x5b, 0x0, 0x2d, 0xe7, + 0x52, 0x0, 0x1d, 0xd1, 0x0, 0x1, 0xd0, 0x0, + 0x1, 0x9c, 0xc9, 0x10, 0x1, 0xd0, 0x0, 0xbc, + 0x60, 0x6, 0xd8, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+6BCD "母" */ + 0x0, 0xd, 0xed, 0xdd, 0xdd, 0xed, 0x0, 0x0, + 0xf, 0x1, 0x50, 0x0, 0x2c, 0x0, 0x0, 0x2d, + 0x0, 0x7c, 0x30, 0x3b, 0x0, 0x0, 0x4a, 0x0, + 0x2, 0x60, 0x4a, 0x0, 0x2d, 0xef, 0xdd, 0xdd, + 0xdd, 0xef, 0xd2, 0x0, 0x96, 0x2, 0x0, 0x0, + 0x69, 0x0, 0x0, 0xb3, 0x9, 0xb2, 0x0, 0x78, + 0x0, 0x0, 0xe1, 0x0, 0x4d, 0x30, 0x86, 0x0, + 0x0, 0xe0, 0x0, 0x3, 0x20, 0xa5, 0x0, 0x3, + 0xdd, 0xdd, 0xdd, 0xdd, 0xfe, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xde, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+6BCE "毎" */ + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xc1, 0x11, 0x11, 0x11, 0x10, 0x0, 0x1e, + 0xcc, 0xcc, 0xcc, 0xcc, 0xb0, 0x0, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x78, 0xed, 0xdf, + 0xdd, 0xdc, 0x0, 0x0, 0xa, 0x40, 0xe, 0x0, + 0x2b, 0x0, 0x0, 0xc, 0x10, 0x1c, 0x0, 0x3a, + 0x0, 0x2d, 0xdf, 0xdd, 0xef, 0xdd, 0xef, 0xd8, + 0x0, 0x2c, 0x0, 0x58, 0x0, 0x68, 0x0, 0x0, + 0x49, 0x0, 0x76, 0x0, 0x86, 0x0, 0x0, 0x8e, + 0xdd, 0xee, 0xdd, 0xee, 0xd3, 0x0, 0x93, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbc, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6BCF "每" */ + 0x0, 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x91, 0x11, 0x11, 0x11, 0x10, 0x0, 0x2e, + 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, 0x1, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x8b, 0xed, 0xdd, + 0xdd, 0xeb, 0x0, 0x4, 0xd, 0x11, 0xb5, 0x0, + 0x3b, 0x0, 0x0, 0xe, 0x0, 0x8, 0x80, 0x4a, + 0x0, 0x2d, 0xdf, 0xcc, 0xcc, 0xdc, 0xdf, 0xd8, + 0x0, 0x3a, 0x5, 0x91, 0x0, 0x58, 0x0, 0x0, + 0x68, 0x0, 0x3c, 0x30, 0x67, 0x0, 0x0, 0x9e, + 0xcc, 0xcd, 0xdc, 0xee, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbc, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6BD4 "比" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0xe0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x3, 0xc0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x3c, 0x0, 0x6a, + 0x1, 0xe2, 0x22, 0x13, 0xc0, 0x7e, 0x30, 0x1f, + 0xcc, 0xc5, 0x3d, 0xab, 0x10, 0x1, 0xe0, 0x0, + 0x3, 0xf6, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x3c, + 0x0, 0x0, 0x1, 0xe0, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x3c, 0x0, 0xb, 0x21, + 0xe0, 0x1, 0x23, 0xc0, 0x0, 0xc1, 0x2e, 0x7c, + 0xe4, 0x2d, 0x0, 0xe, 0x7, 0xe8, 0x30, 0x0, + 0xce, 0xee, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6BDB "毛" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, + 0x1, 0x47, 0xbe, 0xa3, 0x0, 0x49, 0xbe, 0xde, + 0x73, 0x0, 0x0, 0x3, 0x42, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x35, 0x7a, 0xc4, + 0x3, 0x8a, 0xce, 0xfa, 0x86, 0x41, 0x0, 0x36, + 0x31, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xd0, 0x24, 0x68, 0xa3, 0x35, 0x79, 0xcf, 0xec, + 0xa7, 0x53, 0x8, 0x86, 0x44, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x4, 0x60, + 0x0, 0x1, 0xe0, 0x0, 0x0, 0x87, 0x0, 0x0, + 0xa, 0xee, 0xee, 0xed, 0x10, + + /* U+6C0F "氏" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x1, + 0x35, 0x68, 0xbe, 0xd6, 0x0, 0xd, 0xca, 0x97, + 0xe4, 0x0, 0x0, 0x0, 0xd1, 0x0, 0xc, 0x30, + 0x0, 0x0, 0xd, 0x10, 0x0, 0xb4, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0xa, 0x50, 0x0, 0x0, 0xd, + 0xed, 0xdd, 0xef, 0xdd, 0xdd, 0x0, 0xd1, 0x0, + 0x4, 0xa0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x1e, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0xc3, 0x0, + 0x0, 0xd, 0x10, 0x27, 0x15, 0xa0, 0x9, 0x10, + 0xeb, 0xeb, 0x60, 0xc, 0x70, 0xd0, 0x1a, 0x40, + 0x0, 0x0, 0x1a, 0xe9, 0x0, + + /* U+6C11 "民" */ + 0x2f, 0xdd, 0xdd, 0xdd, 0xdd, 0xd0, 0x2, 0xd0, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x2d, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x2, 0xfd, 0xdd, 0xee, 0xdd, + 0xed, 0x0, 0x2d, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x2, 0xd0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x2f, + 0xee, 0xee, 0xfe, 0xee, 0xec, 0x2, 0xd0, 0x0, + 0x9, 0x70, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x3d, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x30, 0xb7, 0x0, + 0xa0, 0x3d, 0x6b, 0xe8, 0x1, 0xe6, 0xd, 0x9, + 0xd8, 0x30, 0x0, 0x2, 0xbe, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C14 "气" */ + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xdd, 0xdd, 0xdd, 0xdd, 0xd0, 0x0, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xa5, 0xcc, 0xcc, + 0xcc, 0xcc, 0x0, 0x4d, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xac, 0xcc, 0xcc, 0xcd, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa4, 0x22, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0x56, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xe2, + + /* U+6C17 "気" */ + 0x0, 0x3, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x0, 0xb7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xc3, 0xcc, 0xcc, + 0xcc, 0xca, 0x0, 0x2b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xcc, 0xcc, 0xcc, 0xcc, 0xf3, + 0x0, 0x0, 0x2, 0x0, 0xa, 0x30, 0xa4, 0x0, + 0x0, 0x2c, 0x91, 0x89, 0x0, 0xa4, 0x0, 0x0, + 0x0, 0x6e, 0xe0, 0x0, 0x96, 0x0, 0x0, 0x0, + 0xab, 0xba, 0x0, 0x68, 0x15, 0x0, 0x6d, 0x60, + 0x8, 0xd0, 0x2d, 0x38, 0xb, 0x91, 0x0, 0x0, + 0x30, 0x7, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6C34 "水" */ + 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0xa, 0x30, 0xb, 0xee, 0xfc, 0x3f, + 0x20, 0x8b, 0x0, 0x0, 0x0, 0x68, 0x3f, 0xa7, + 0xb0, 0x0, 0x0, 0x0, 0xc3, 0x3b, 0xab, 0x0, + 0x0, 0x0, 0x3, 0xc0, 0x3b, 0x1d, 0x20, 0x0, + 0x0, 0xc, 0x50, 0x3b, 0x5, 0xd1, 0x0, 0x0, + 0x9a, 0x0, 0x3b, 0x0, 0x7d, 0x30, 0xa, 0xc0, + 0x0, 0x3b, 0x0, 0x6, 0xf7, 0x6, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x22, 0x0, 0x0, 0x2f, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6C37 "氷" */ + 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, + 0x97, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xc1, 0x3c, 0x0, 0x1, 0x80, 0x0, 0x0, 0x78, + 0x3f, 0x10, 0xc, 0x80, 0x0, 0x0, 0x0, 0x3f, + 0x70, 0xb8, 0x0, 0xd, 0xee, 0xea, 0x3c, 0xdb, + 0x70, 0x0, 0x0, 0x0, 0x87, 0x3b, 0x99, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x3b, 0x1e, 0x10, 0x0, + 0x0, 0x7, 0x90, 0x3b, 0x7, 0xc0, 0x0, 0x0, + 0x4d, 0x10, 0x3b, 0x0, 0xa9, 0x0, 0x5, 0xe3, + 0x0, 0x3b, 0x0, 0xb, 0xc2, 0xb, 0x20, 0x0, + 0x4b, 0x0, 0x0, 0x76, 0x0, 0x0, 0x9f, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6C38 "永" */ + 0x0, 0x0, 0x78, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xbe, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x87, 0x0, 0x0, 0x0, 0x2e, 0xee, + 0xea, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0x0, 0x1, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0x40, + 0x1d, 0x60, 0xe, 0xee, 0xf7, 0x3f, 0xb3, 0xd5, + 0x0, 0x0, 0x0, 0xd2, 0x3c, 0xcc, 0x20, 0x0, + 0x0, 0x7, 0xb0, 0x3b, 0x3d, 0x10, 0x0, 0x0, + 0x1e, 0x20, 0x3b, 0x7, 0xc0, 0x0, 0x2, 0xd5, + 0x0, 0x3b, 0x0, 0x7d, 0x50, 0x1d, 0x50, 0x0, + 0x4b, 0x0, 0x4, 0xc6, 0x0, 0x0, 0x4e, 0xe7, + 0x0, 0x0, 0x0, + + /* U+6C42 "求" */ + 0x0, 0x0, 0x0, 0x87, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x4, 0xe5, 0x0, 0x1, 0x11, + 0x11, 0x98, 0x11, 0x4a, 0x10, 0xc, 0xcc, 0xcc, + 0xee, 0xcc, 0xcc, 0xc1, 0x0, 0x20, 0x0, 0x8b, + 0x0, 0x4, 0x10, 0x1, 0xc5, 0x0, 0x8f, 0x30, + 0x4d, 0x10, 0x0, 0x1d, 0x40, 0x8a, 0xb4, 0xd2, + 0x0, 0x0, 0x2, 0x50, 0xa7, 0x9c, 0x10, 0x0, + 0x0, 0x0, 0x4c, 0xd7, 0xd, 0x30, 0x0, 0x0, + 0x3b, 0xb2, 0x87, 0x4, 0xe3, 0x0, 0x1a, 0xd4, + 0x0, 0x87, 0x0, 0x4e, 0x91, 0x5, 0x0, 0x0, + 0x97, 0x0, 0x1, 0x92, 0x0, 0x0, 0xdf, 0xd3, + 0x0, 0x0, 0x0, + + /* U+6C5A "汚" */ + 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xc9, 0x1e, 0xef, 0xee, 0xee, 0x90, 0x0, 0x5, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x0, 0x6b, 0x30, 0x9d, 0xdf, + 0xdd, 0xdd, 0xd2, 0x3, 0xd3, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, 0xec, 0xbb, 0xbb, 0x20, + 0x0, 0x3c, 0x0, 0x22, 0x22, 0x2d, 0x20, 0x0, + 0xb5, 0x0, 0x0, 0x0, 0xe, 0x0, 0x3, 0xd0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0xc, 0x50, 0x0, + 0x0, 0x0, 0x5b, 0x0, 0x9, 0x0, 0x0, 0x3, + 0xdd, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6C60 "池" */ + 0x2, 0x80, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x8d, 0x31, 0x30, 0xe, 0x0, 0x0, 0x0, 0x3, + 0x43, 0xb0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xb0, 0xe, 0x4b, 0xf0, 0x7, 0x10, 0x3, 0xb1, + 0x7f, 0xb4, 0xe0, 0x7, 0xe6, 0x6, 0xfe, 0x8e, + 0x0, 0xe0, 0x0, 0x14, 0xbc, 0xc0, 0xe, 0x0, + 0xe0, 0x0, 0x0, 0x3, 0xb0, 0xe, 0x0, 0xe0, + 0x0, 0x7, 0x43, 0xb0, 0xe, 0x13, 0xd0, 0x0, + 0x1e, 0x13, 0xb0, 0xa, 0x4a, 0x50, 0x0, 0x97, + 0x3, 0xb0, 0x0, 0x0, 0x49, 0x3, 0xd0, 0x2, + 0xd0, 0x0, 0x0, 0x77, 0x6, 0x50, 0x0, 0xbe, + 0xee, 0xee, 0xd1, + + /* U+6C7A "決" */ + 0x8, 0x60, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x1, + 0xac, 0x0, 0x2, 0xb0, 0x0, 0x0, 0x0, 0x3, + 0xa, 0xbb, 0xeb, 0xbb, 0x0, 0x0, 0x0, 0x3, + 0x35, 0xc3, 0x3d, 0x10, 0x59, 0x10, 0x0, 0x2, + 0xb0, 0xc, 0x10, 0x7, 0xe3, 0x0, 0x2, 0xb0, + 0xc, 0x10, 0x0, 0x30, 0x11, 0x14, 0xb1, 0x1d, + 0x20, 0x0, 0x0, 0xbc, 0xce, 0xfe, 0xcc, 0xc3, + 0x0, 0x2a, 0x0, 0x9, 0xbb, 0x0, 0x0, 0x0, + 0x96, 0x0, 0x1e, 0x1e, 0x30, 0x0, 0x2, 0xe0, + 0x0, 0xa8, 0x6, 0xb0, 0x0, 0xa, 0x60, 0xa, + 0xb0, 0x0, 0xba, 0x0, 0x1c, 0x3, 0xe8, 0x0, + 0x0, 0x9, 0xe1, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x20, + + /* U+6C88 "沈" */ + 0x3, 0x80, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, + 0x8e, 0x30, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3, + 0x10, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xee, 0xfe, 0xee, 0xf1, 0x7, 0x10, 0xd, 0x0, + 0xd1, 0x0, 0xd1, 0x6, 0xd6, 0xc, 0x0, 0xe4, + 0x0, 0xc1, 0x0, 0x13, 0x0, 0x1, 0xed, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xbd, 0x0, 0x0, + 0x0, 0x8, 0x50, 0x9, 0x6d, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x2e, 0x1d, 0x0, 0x0, 0x0, 0x96, + 0x0, 0xb7, 0xd, 0x0, 0x65, 0x3, 0xd0, 0xa, + 0xb0, 0xd, 0x0, 0x85, 0x7, 0x40, 0xa9, 0x0, + 0xc, 0xed, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6C92 "沒" */ + 0x6, 0x70, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0x20, 0x7e, 0xaa, 0xaa, 0x50, 0x0, 0x3, + 0x0, 0xb6, 0x33, 0x39, 0x60, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x9, 0x50, 0x3a, 0x20, 0x8, 0x90, + 0x0, 0xb, 0x30, 0x6, 0xe5, 0x4d, 0x0, 0xa, + 0xae, 0x0, 0x0, 0x12, 0x23, 0x0, 0x3, 0x40, + 0x0, 0x0, 0x0, 0xd, 0xfd, 0xdd, 0xdf, 0x50, + 0x0, 0xb, 0x10, 0xb4, 0x0, 0x2d, 0x0, 0x0, + 0x4b, 0x0, 0x1d, 0x21, 0xd4, 0x0, 0x0, 0xd3, + 0x0, 0x3, 0xed, 0x40, 0x0, 0x6, 0xb0, 0x0, + 0x4b, 0xcc, 0xa2, 0x0, 0xb, 0x20, 0x8e, 0xb4, + 0x0, 0x6d, 0xd2, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x20, + + /* U+6CB9 "油" */ + 0x6, 0x70, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x19, + 0xd2, 0x0, 0xc, 0x10, 0x0, 0x0, 0x4, 0x10, + 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, 0xde, 0xef, + 0xee, 0xe3, 0x29, 0x20, 0xe, 0x0, 0xc1, 0xa, + 0x30, 0x5d, 0x50, 0xe0, 0xc, 0x10, 0xa3, 0x0, + 0x1, 0xe, 0x0, 0xc1, 0xa, 0x30, 0x0, 0x0, + 0xee, 0xef, 0xee, 0xf3, 0x0, 0x8, 0xe, 0x0, + 0xc1, 0xa, 0x30, 0x6, 0xa0, 0xe0, 0xc, 0x10, + 0xa3, 0x0, 0xe2, 0xe, 0x0, 0xc1, 0xa, 0x30, + 0x98, 0x0, 0xee, 0xef, 0xee, 0xf3, 0x7, 0x0, + 0xe, 0x0, 0x0, 0x9, 0x30, + + /* U+6CBB "治" */ + 0x2, 0x40, 0x0, 0x5, 0x50, 0x0, 0x0, 0x2, + 0xbb, 0x20, 0xe, 0x20, 0x0, 0x0, 0x0, 0x5, + 0x20, 0x88, 0x6, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xd0, 0x1, 0xd4, 0x0, 0x27, 0x0, 0xc, 0x30, + 0x0, 0x4e, 0x10, 0x7, 0xd4, 0x9f, 0xde, 0xed, + 0xcc, 0xa0, 0x0, 0x11, 0x22, 0x0, 0x0, 0x0, + 0x40, 0x0, 0x3, 0xa, 0xbb, 0xbb, 0xbb, 0x0, + 0x0, 0xe, 0x1e, 0x22, 0x22, 0x2e, 0x10, 0x0, + 0x88, 0xe, 0x0, 0x0, 0xd, 0x10, 0x1, 0xe1, + 0xe, 0x0, 0x0, 0xd, 0x10, 0xb, 0x70, 0xe, + 0x22, 0x22, 0x2e, 0x10, 0x9, 0x0, 0xe, 0xbb, + 0xbb, 0xbe, 0x10, + + /* U+6CC1 "況" */ + 0x3, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcb, 0x1d, 0xed, 0xdd, 0xdf, 0x20, 0x0, 0x5, + 0xd, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0xd, + 0x0, 0x0, 0xb, 0x20, 0x24, 0x0, 0xd, 0x0, + 0x0, 0xb, 0x20, 0x3a, 0xd4, 0xd, 0x21, 0x11, + 0x1c, 0x20, 0x0, 0x23, 0xa, 0xde, 0xcf, 0xdc, + 0x20, 0x0, 0x0, 0x0, 0x67, 0xd, 0x10, 0x0, + 0x0, 0xa, 0x30, 0x85, 0xd, 0x10, 0x0, 0x0, + 0x3c, 0x0, 0xc2, 0xd, 0x10, 0x0, 0x0, 0xc3, + 0x2, 0xd0, 0xd, 0x10, 0x90, 0x8, 0x90, 0x3d, + 0x30, 0xd, 0x10, 0xd0, 0xb, 0x13, 0xd4, 0x0, + 0x9, 0xed, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6CCA "泊" */ + 0x1, 0x10, 0x0, 0x0, 0x50, 0x0, 0x0, 0x4d, + 0x80, 0x0, 0x2e, 0x0, 0x0, 0x0, 0x8, 0x20, + 0x6, 0x90, 0x0, 0x0, 0x0, 0x0, 0xee, 0xee, + 0xee, 0xed, 0x16, 0x0, 0xe, 0x0, 0x0, 0x1, + 0xd1, 0x8d, 0x30, 0xe0, 0x0, 0x0, 0x1d, 0x0, + 0x21, 0xe, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x10, + 0xed, 0xdd, 0xdd, 0xed, 0x0, 0xd, 0xe, 0x0, + 0x0, 0x1, 0xd0, 0x6, 0x90, 0xe0, 0x0, 0x0, + 0x1d, 0x0, 0xe1, 0xe, 0x0, 0x0, 0x1, 0xd0, + 0x88, 0x0, 0xec, 0xcc, 0xcc, 0xcd, 0x6, 0x10, + 0xe, 0x11, 0x11, 0x13, 0xc0, + + /* U+6CD5 "法" */ + 0x5, 0x70, 0x0, 0x0, 0x95, 0x0, 0x0, 0x2, + 0xbc, 0x20, 0x0, 0x95, 0x0, 0x0, 0x0, 0x7, + 0x30, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xdd, 0xee, 0xdd, 0x70, 0x17, 0x10, 0x0, 0x0, + 0x95, 0x0, 0x0, 0x6, 0xd5, 0x0, 0x0, 0x95, + 0x0, 0x0, 0x0, 0x1, 0x3e, 0xee, 0xfe, 0xee, + 0xe1, 0x0, 0x1, 0x0, 0x4, 0xd0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0xc, 0x40, 0x40, 0x0, 0x0, + 0x4b, 0x0, 0x5b, 0x0, 0xa5, 0x0, 0x0, 0xd3, + 0x1, 0xd1, 0x0, 0x3e, 0x10, 0x8, 0x90, 0xb, + 0xed, 0xdc, 0xaa, 0x90, 0x6, 0x10, 0x4, 0x30, + 0x0, 0x0, 0xb0, + + /* U+6CE2 "波" */ + 0x5, 0x70, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, + 0x9d, 0x10, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x3, + 0xd, 0xdd, 0xfe, 0xdd, 0xd0, 0x0, 0x0, 0xe, + 0x0, 0xc1, 0x3, 0xc0, 0x2a, 0x10, 0xe, 0x0, + 0xc1, 0x9, 0x50, 0x7, 0xe3, 0xe, 0x0, 0xc2, + 0x3, 0x0, 0x0, 0x32, 0xf, 0xfd, 0xdd, 0xdf, + 0x0, 0x0, 0x0, 0x2c, 0x66, 0x0, 0x4a, 0x0, + 0x0, 0xa, 0x3a, 0xd, 0x0, 0xc3, 0x0, 0x0, + 0x78, 0x59, 0x6, 0xa8, 0x90, 0x0, 0x0, 0xe1, + 0x95, 0x0, 0xde, 0x0, 0x0, 0x7, 0x90, 0xe1, + 0x1a, 0xb9, 0xc3, 0x0, 0xc, 0x18, 0x87, 0xe7, + 0x0, 0x4c, 0xc1, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x20, + + /* U+6CE3 "泣" */ + 0x1, 0x20, 0x0, 0x0, 0x70, 0x0, 0x0, 0x3, + 0xca, 0x10, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x6, + 0x40, 0x0, 0x74, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xee, 0xee, 0xee, 0xe1, 0x17, 0x10, 0x0, 0x10, + 0x0, 0x14, 0x0, 0x6, 0xd5, 0x3, 0xb0, 0x0, + 0x4b, 0x0, 0x0, 0x12, 0x0, 0xe0, 0x0, 0x77, + 0x0, 0x0, 0x1, 0x0, 0xd2, 0x0, 0xb4, 0x0, + 0x0, 0xa, 0x40, 0xa4, 0x0, 0xe0, 0x0, 0x0, + 0x3c, 0x0, 0x87, 0x2, 0xb0, 0x0, 0x0, 0xd4, + 0x0, 0x56, 0x7, 0x70, 0x0, 0x7, 0xa0, 0xaa, + 0xaa, 0xae, 0xca, 0xa5, 0x5, 0x10, 0x33, 0x33, + 0x33, 0x33, 0x31, + + /* U+6CE8 "注" */ + 0x3, 0x20, 0x0, 0x2, 0x60, 0x0, 0x0, 0x4, + 0xd9, 0x10, 0x0, 0xd2, 0x0, 0x0, 0x0, 0x7, + 0x10, 0x0, 0x66, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0xee, 0xfe, 0xee, 0xe0, 0x26, 0x0, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x18, 0xd3, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xee, 0xfe, 0xee, 0x70, + 0x0, 0xc, 0x10, 0x0, 0xb3, 0x0, 0x0, 0x0, + 0x5b, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0xd3, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x7, 0xa0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0xd, 0x20, 0xde, 0xee, + 0xfe, 0xee, 0xe4, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6CF3 "泳" */ + 0x6, 0x20, 0x0, 0x86, 0x20, 0x0, 0x0, 0x4, + 0xd9, 0x0, 0x27, 0xcc, 0x40, 0x0, 0x0, 0x6, + 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x0, 0xc, + 0xee, 0xe0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x30, 0x19, 0xd2, 0x0, 0x0, 0xe5, + 0x9, 0x90, 0x0, 0x43, 0xcc, 0xf3, 0xea, 0x99, + 0x0, 0x0, 0x0, 0x0, 0xe0, 0xec, 0x80, 0x0, + 0x0, 0x2a, 0x6, 0x90, 0xe4, 0x90, 0x0, 0x0, + 0xa5, 0xd, 0x20, 0xe0, 0xc4, 0x0, 0x3, 0xd0, + 0xa7, 0x0, 0xe0, 0x2e, 0x50, 0xc, 0x47, 0x90, + 0x0, 0xe0, 0x3, 0xd1, 0x18, 0x0, 0x0, 0xae, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6D0B "洋" */ + 0x2, 0x0, 0x1, 0x60, 0x0, 0x26, 0x0, 0x8, + 0xc2, 0x0, 0xc3, 0x0, 0xa6, 0x0, 0x0, 0x4d, + 0x0, 0x49, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x4d, + 0xdd, 0xfe, 0xdd, 0xb0, 0x24, 0x0, 0x0, 0x0, + 0xc2, 0x0, 0x0, 0x2b, 0xc2, 0x0, 0x0, 0xc2, + 0x0, 0x0, 0x0, 0x53, 0xc, 0xee, 0xfe, 0xee, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, + 0xd3, 0xae, 0xee, 0xfe, 0xee, 0xe2, 0x5, 0xb0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0xc2, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, + 0xc2, 0x0, 0x0, + + /* U+6D17 "洗" */ + 0x7, 0x30, 0x1, 0x80, 0xb2, 0x0, 0x0, 0x4, + 0xe5, 0x5, 0xa0, 0xb2, 0x0, 0x0, 0x0, 0x2a, + 0x9, 0x92, 0xc5, 0x22, 0x20, 0x0, 0x0, 0xe, + 0xbb, 0xec, 0xbb, 0x70, 0x36, 0x0, 0x7a, 0x0, + 0xb2, 0x0, 0x0, 0x18, 0xc1, 0x51, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0x30, 0xde, 0xee, 0xfe, 0xee, + 0xe3, 0x0, 0x0, 0x0, 0x77, 0x8, 0x50, 0x0, + 0x0, 0x49, 0x0, 0x95, 0x8, 0x50, 0x0, 0x0, + 0xb3, 0x0, 0xc2, 0x8, 0x50, 0x0, 0x3, 0xc0, + 0x3, 0xd0, 0x8, 0x50, 0x64, 0xb, 0x50, 0x2d, + 0x40, 0x8, 0x60, 0x85, 0xb, 0x4, 0xd5, 0x0, + 0x4, 0xdd, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6D32 "洲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0x40, 0xe, 0x0, 0xe0, 0xe, 0x0, 0x2a, 0x0, + 0xe0, 0xe, 0x0, 0xe0, 0x0, 0x0, 0xe, 0x0, + 0xe0, 0xe, 0x6, 0x0, 0x13, 0xe3, 0xe, 0x50, + 0xe0, 0x8d, 0x45, 0x6e, 0xb1, 0xeb, 0x2e, 0x0, + 0x22, 0xa3, 0xd6, 0x6e, 0x39, 0xe0, 0x0, 0x1b, + 0x2d, 0x28, 0xe0, 0xae, 0x0, 0x26, 0x3, 0xb0, + 0xe, 0x0, 0xe0, 0x9, 0x60, 0x58, 0x0, 0xe0, + 0xe, 0x0, 0xe0, 0xa, 0x30, 0xe, 0x0, 0xe0, + 0x79, 0x2, 0xc0, 0x0, 0xe0, 0xe, 0xa, 0x10, + 0xa2, 0x0, 0xe, 0x0, 0xe0, + + /* U+6D3B "活" */ + 0x8, 0x40, 0x0, 0x0, 0x25, 0x8c, 0x20, 0x2, + 0xbc, 0x1b, 0xdd, 0xea, 0x51, 0x0, 0x0, 0x3, + 0x1, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x59, 0x10, 0xad, 0xdd, + 0xfe, 0xdd, 0xd2, 0x7, 0xe3, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x11, 0xb4, 0x11, 0x0, + 0x0, 0xb, 0xb, 0xdc, 0xcc, 0xce, 0x30, 0x0, + 0x78, 0xb, 0x20, 0x0, 0xb, 0x30, 0x1, 0xe1, + 0xb, 0x20, 0x0, 0xb, 0x30, 0xb, 0x60, 0xb, + 0x42, 0x22, 0x2b, 0x30, 0x19, 0x0, 0xb, 0xba, + 0xaa, 0xad, 0x20, + + /* U+6D3E "派" */ + 0x3, 0x20, 0x0, 0x0, 0x1, 0x59, 0x10, 0x3, + 0xd8, 0x4, 0x8b, 0xdd, 0x95, 0x0, 0x0, 0x7, + 0xd, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x1, 0x48, 0xda, 0x0, 0x28, 0x10, 0xd, 0xb, + 0x9e, 0x10, 0x0, 0x7, 0xd2, 0xd, 0xb, 0x1a, + 0x30, 0x0, 0x0, 0x20, 0xe, 0xb, 0x17, 0x64, + 0xc0, 0x0, 0x1, 0xe, 0xb, 0x14, 0xdb, 0x10, + 0x0, 0x3a, 0x1c, 0xb, 0x10, 0xe0, 0x0, 0x0, + 0xa4, 0x3a, 0xb, 0x10, 0xa6, 0x0, 0x3, 0xc0, + 0x76, 0xb, 0x11, 0x4d, 0x0, 0xb, 0x50, 0xd1, + 0xd, 0xbc, 0x39, 0xb0, 0x8, 0x4, 0x90, 0xb, + 0x40, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6D41 "流" */ + 0x4, 0x10, 0x0, 0x1, 0x70, 0x0, 0x0, 0x6, + 0xd3, 0x0, 0x0, 0xd1, 0x0, 0x0, 0x0, 0x29, + 0xad, 0xde, 0xfe, 0xdd, 0xd1, 0x0, 0x0, 0x0, + 0x5b, 0x0, 0x80, 0x0, 0x37, 0x0, 0x3, 0xd1, + 0x0, 0x7a, 0x0, 0x8, 0xd3, 0x5f, 0xdc, 0xdd, + 0xdd, 0x70, 0x0, 0x31, 0x14, 0x20, 0x0, 0x1, + 0x80, 0x0, 0x0, 0x8, 0x40, 0xc0, 0x85, 0x0, + 0x0, 0xd, 0x9, 0x40, 0xc0, 0x85, 0x0, 0x0, + 0x79, 0xb, 0x30, 0xc0, 0x85, 0x0, 0x1, 0xe1, + 0xe, 0x0, 0xc0, 0x85, 0x31, 0xa, 0x70, 0x7a, + 0x0, 0xc0, 0x85, 0x64, 0xc, 0x3, 0xd1, 0x0, + 0x60, 0x5d, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6D45 "浅" */ + 0x6, 0x70, 0x0, 0xe, 0x8, 0x20, 0x0, 0x0, + 0x8c, 0x0, 0xd, 0x13, 0xd3, 0x0, 0x0, 0x3, + 0x0, 0xd, 0x21, 0x46, 0x40, 0x0, 0x0, 0x49, + 0xbf, 0xec, 0xa8, 0x50, 0x2c, 0x40, 0x24, 0x2a, + 0x50, 0x0, 0x0, 0x2, 0xc4, 0x0, 0x8, 0x72, + 0x46, 0x81, 0x0, 0x0, 0x6a, 0xce, 0xfc, 0xa7, + 0x61, 0x0, 0x2, 0x44, 0x22, 0xd0, 0x4, 0xc0, + 0x0, 0x3b, 0x0, 0x0, 0xc2, 0x4d, 0x20, 0x0, + 0xb4, 0x0, 0x0, 0x8c, 0xc2, 0x20, 0x2, 0xd0, + 0x0, 0x6, 0xdf, 0x10, 0x84, 0xb, 0x50, 0x39, + 0xd8, 0x17, 0xb1, 0xb2, 0x8, 0x0, 0x45, 0x0, + 0x0, 0x8e, 0xa0, + + /* U+6D74 "浴" */ + 0x2, 0x0, 0x0, 0x13, 0x1, 0x20, 0x0, 0x6, + 0xd4, 0x0, 0xb5, 0x3, 0xd2, 0x0, 0x0, 0x2c, + 0x18, 0xa0, 0x0, 0x4d, 0x10, 0x0, 0x0, 0x8b, + 0x2, 0xe0, 0x5, 0xc0, 0x24, 0x0, 0x40, 0xb, + 0xc6, 0x0, 0x10, 0x2b, 0xb1, 0x0, 0x89, 0xc, + 0x40, 0x0, 0x0, 0x50, 0x8, 0xb0, 0x1, 0xd6, + 0x0, 0x0, 0x2, 0xca, 0x0, 0x0, 0x1b, 0xc2, + 0x0, 0x15, 0x6e, 0xdd, 0xdd, 0xdd, 0x62, 0x0, + 0x96, 0xe, 0x0, 0x0, 0x1d, 0x0, 0x2, 0xd0, + 0xe, 0x0, 0x0, 0x1d, 0x0, 0xa, 0x60, 0xe, + 0x22, 0x22, 0x3d, 0x0, 0x9, 0x0, 0xe, 0xbb, + 0xbb, 0xbc, 0x0, + + /* U+6D77 "海" */ + 0x2, 0x10, 0x0, 0x70, 0x0, 0x0, 0x0, 0x3, + 0xc8, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xb, 0xed, 0xdd, 0xdd, 0xd1, 0x0, 0x0, 0x5b, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0xd6, 0xdd, + 0xdd, 0xdd, 0x60, 0x1a, 0xb1, 0x6, 0x70, 0xa1, + 0x7, 0x60, 0x0, 0x51, 0x8, 0x50, 0x29, 0x8, + 0x50, 0x0, 0x0, 0xdf, 0xed, 0xdd, 0xdf, 0xe6, + 0x0, 0x58, 0xc, 0x14, 0x80, 0xa, 0x30, 0x0, + 0xb3, 0xe, 0x0, 0x66, 0xb, 0x20, 0x2, 0xd0, + 0x2f, 0xdd, 0xdd, 0xdf, 0xd0, 0x9, 0x60, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x9, 0x0, 0x0, 0x0, + 0x4c, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6D88 "消" */ + 0x8, 0x40, 0x4, 0x0, 0xe0, 0x4, 0x20, 0x2c, + 0x90, 0xc2, 0xe, 0x0, 0xd2, 0x0, 0x4, 0x4, + 0xa0, 0xe0, 0x78, 0x0, 0x0, 0x0, 0x5, 0xe, + 0x4, 0x0, 0x5a, 0x10, 0xc, 0xee, 0xfe, 0xee, + 0x0, 0x8e, 0x20, 0xd1, 0x0, 0x0, 0xe0, 0x0, + 0x40, 0xd, 0x10, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xdc, 0xcc, 0xcc, 0xf0, 0x0, 0x1a, 0xd, 0x10, + 0x0, 0xe, 0x0, 0x9, 0x60, 0xdd, 0xcc, 0xcc, + 0xf0, 0x2, 0xd0, 0xd, 0x10, 0x0, 0xe, 0x0, + 0xb5, 0x0, 0xd1, 0x0, 0x0, 0xe0, 0x9, 0x0, + 0xd, 0x10, 0xa, 0xda, 0x0, + + /* U+6DBC "涼" */ + 0x4, 0x10, 0x0, 0x2, 0x70, 0x0, 0x0, 0x6, + 0xd6, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x18, + 0x7d, 0xdd, 0xdd, 0xdd, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, 0xd, 0xdd, + 0xdd, 0xdf, 0x10, 0x19, 0xc1, 0xd, 0x10, 0x0, + 0xd, 0x10, 0x0, 0x30, 0xd, 0x10, 0x0, 0xd, + 0x10, 0x0, 0x0, 0xb, 0xdd, 0xfd, 0xdd, 0x10, + 0x0, 0x1c, 0x1, 0x20, 0xd1, 0x1, 0x0, 0x0, + 0x96, 0x9, 0x60, 0xd1, 0x5b, 0x0, 0x2, 0xd0, + 0x4c, 0x0, 0xd1, 0xa, 0x50, 0xc, 0x51, 0xd1, + 0x0, 0xd1, 0x2, 0xd0, 0x19, 0x0, 0x0, 0x9c, + 0xd0, 0x0, 0x0, + + /* U+6DF1 "深" */ + 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xc9, 0x5e, 0xdd, 0xdd, 0xdd, 0xd0, 0x0, 0x4, + 0x58, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x23, + 0x5b, 0x4, 0xc1, 0x50, 0x29, 0x20, 0x4, 0xd1, + 0x0, 0x5c, 0x0, 0x6, 0xd5, 0x2d, 0x20, 0x61, + 0x7, 0x70, 0x0, 0x11, 0x0, 0x0, 0xc2, 0x0, + 0x0, 0x0, 0x1, 0x5d, 0xde, 0xff, 0xdd, 0xc0, + 0x0, 0x2b, 0x0, 0xc, 0xed, 0x30, 0x0, 0x0, + 0x95, 0x0, 0x96, 0xc4, 0xd1, 0x0, 0x2, 0xd0, + 0x9, 0xa0, 0xc2, 0x4d, 0x20, 0xa, 0x50, 0xd7, + 0x0, 0xc2, 0x4, 0xe1, 0x7, 0x0, 0x10, 0x0, + 0xc2, 0x0, 0x10, + + /* U+6DF7 "混" */ + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xc8, 0xf, 0xcc, 0xcc, 0xcf, 0x0, 0x0, 0x7, + 0x2e, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xf, + 0xbb, 0xbb, 0xbf, 0x0, 0x18, 0x10, 0xe, 0x0, + 0x0, 0xe, 0x0, 0x8, 0xe4, 0xf, 0xcc, 0xcc, + 0xcf, 0x0, 0x0, 0x23, 0x4, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x1, 0xe, 0x0, 0xe, 0x0, 0x50, + 0x0, 0xb, 0x3e, 0xdd, 0x7e, 0x6d, 0x60, 0x0, + 0x4b, 0xe, 0x0, 0xe, 0x71, 0x0, 0x0, 0xc3, + 0xe, 0x0, 0xe, 0x0, 0x52, 0x6, 0xa0, 0xe, + 0x26, 0x5e, 0x0, 0x93, 0xa, 0x20, 0x3f, 0xc7, + 0x2a, 0xed, 0xd0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, + + /* U+6E05 "清" */ + 0x6, 0x40, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x3, + 0xd8, 0x6c, 0xcc, 0xfc, 0xcc, 0x90, 0x0, 0x5, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xbb, 0xfb, 0xbb, 0x40, 0x39, 0x10, 0x33, 0x33, + 0xe4, 0x33, 0x31, 0x5, 0xd2, 0x66, 0x66, 0x66, + 0x66, 0x61, 0x0, 0x10, 0xb, 0xbb, 0xbb, 0xbb, + 0x0, 0x0, 0x1, 0xd, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x3b, 0xe, 0xbb, 0xbb, 0xbf, 0x0, 0x0, + 0xa6, 0xd, 0x0, 0x0, 0xd, 0x0, 0x2, 0xe0, + 0xe, 0xbb, 0xbb, 0xbf, 0x0, 0xa, 0x70, 0xd, + 0x0, 0x0, 0xd, 0x0, 0x9, 0x0, 0xd, 0x0, + 0x7, 0xcb, 0x0, + + /* U+6E07 "渇" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x30, 0xbd, 0xcc, 0xcc, 0xf0, 0x0, 0x39, 0xb, + 0x20, 0x0, 0xe, 0x0, 0x0, 0x0, 0xbc, 0xbb, + 0xbb, 0xf0, 0x35, 0x0, 0xb, 0x20, 0x0, 0xe, + 0x2, 0xbc, 0x10, 0x8e, 0xdb, 0xbb, 0xb0, 0x0, + 0x40, 0x2, 0xe3, 0x11, 0x11, 0x10, 0x0, 0x1, + 0xdb, 0xbb, 0xbb, 0xcb, 0x0, 0x59, 0xdd, 0x22, + 0x78, 0x4, 0x90, 0xc, 0x32, 0xac, 0x95, 0x0, + 0x58, 0x4, 0xb0, 0xa, 0x20, 0x5, 0x37, 0x60, + 0xd3, 0x0, 0x5d, 0xcc, 0xc1, 0xa4, 0x18, 0x0, + 0x0, 0x0, 0x8, 0xdc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+6E08 "済" */ + 0x1, 0x0, 0x0, 0x4, 0x20, 0x0, 0x0, 0x9, + 0x90, 0x11, 0x14, 0xb1, 0x11, 0x10, 0x0, 0x76, + 0xad, 0xdb, 0xbb, 0xdd, 0xb0, 0x0, 0x0, 0x3, + 0xc1, 0x2, 0xd1, 0x0, 0x43, 0x0, 0x0, 0x2c, + 0x9c, 0x20, 0x0, 0x2c, 0x70, 0x48, 0xba, 0x7b, + 0xdb, 0x70, 0x0, 0x40, 0x56, 0x10, 0x0, 0x35, + 0x40, 0x0, 0x0, 0x9, 0x61, 0x11, 0x86, 0x0, + 0x0, 0x44, 0xa, 0xca, 0xaa, 0xd6, 0x0, 0x0, + 0xc1, 0xc, 0x30, 0x0, 0x76, 0x0, 0x5, 0x90, + 0xe, 0xbb, 0xbb, 0xd6, 0x0, 0xd, 0x10, 0x89, + 0x0, 0x0, 0x76, 0x0, 0x17, 0x2, 0xc0, 0x0, + 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6E09 "渉" */ + 0x6, 0x60, 0x0, 0x0, 0x76, 0x0, 0x0, 0x1, + 0xbb, 0x3, 0x70, 0x76, 0x0, 0x0, 0x0, 0x7, + 0x4, 0x90, 0x7e, 0xdd, 0xa0, 0x0, 0x0, 0x4, + 0x90, 0x76, 0x0, 0x0, 0x3c, 0x40, 0xac, 0xeb, + 0xdd, 0xbb, 0xb4, 0x3, 0xc5, 0x22, 0x22, 0x97, + 0x23, 0x20, 0x0, 0x0, 0x1, 0xd0, 0x76, 0x1d, + 0x10, 0x0, 0x1, 0xb, 0x50, 0x76, 0x5, 0xb0, + 0x0, 0x1d, 0x79, 0x0, 0x86, 0x8, 0xa3, 0x0, + 0x96, 0x0, 0x2d, 0xc2, 0x88, 0x0, 0x2, 0xe0, + 0x0, 0x0, 0x9, 0xb0, 0x0, 0xb, 0x60, 0x0, + 0x27, 0xd8, 0x0, 0x0, 0xa, 0x0, 0x3e, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6E1B "減" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x70, 0x0, 0x0, 0xc, 0x4b, 0x10, 0x1, 0xaa, + 0x0, 0x0, 0xb, 0x14, 0xb0, 0x0, 0x1, 0x9a, + 0xaa, 0xae, 0xba, 0xb0, 0x0, 0x0, 0xd2, 0x22, + 0x2b, 0x52, 0x20, 0x5b, 0x30, 0xd4, 0xaa, 0xa9, + 0x40, 0x50, 0x3, 0xc0, 0xd0, 0x11, 0x17, 0x56, + 0x80, 0x0, 0x0, 0xd3, 0xbb, 0xa6, 0x7b, 0x40, + 0x0, 0x31, 0xd4, 0x60, 0xb3, 0xbd, 0x0, 0x0, + 0xc2, 0xc4, 0x60, 0xb1, 0xf6, 0x0, 0x2, 0xc2, + 0xb4, 0xdb, 0xd2, 0xf0, 0x10, 0x9, 0x66, 0x74, + 0x60, 0x1c, 0xc3, 0x55, 0x1e, 0xc, 0x20, 0x2, + 0xc3, 0x5b, 0x92, 0x26, 0x1a, 0x0, 0x9, 0x30, + 0xa, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6E21 "渡" */ + 0x0, 0x10, 0x0, 0x0, 0x33, 0x0, 0x0, 0x2, + 0xd8, 0x0, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x8, + 0x3f, 0xbc, 0xcb, 0xbc, 0xb5, 0x0, 0x0, 0x1c, + 0xc, 0x10, 0xd, 0x0, 0xa, 0x30, 0x1d, 0xcf, + 0xcc, 0xcf, 0xc4, 0x3, 0xd7, 0x1c, 0xc, 0x10, + 0xd, 0x0, 0x0, 0x1, 0x2b, 0xc, 0xaa, 0xae, + 0x0, 0x0, 0x0, 0x3a, 0x1, 0x11, 0x11, 0x0, + 0x0, 0x1b, 0x49, 0xbf, 0xcc, 0xce, 0x90, 0x0, + 0x87, 0x67, 0x9, 0x40, 0x1d, 0x10, 0x1, 0xe1, + 0xa3, 0x0, 0xb7, 0xd3, 0x0, 0x8, 0x81, 0xd0, + 0x3, 0xbd, 0xd6, 0x10, 0xa, 0x17, 0x73, 0xda, + 0x30, 0x39, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6E29 "温" */ + 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xd8, 0xf, 0xcc, 0xcc, 0xdc, 0x0, 0x0, 0x6, + 0xe, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0xf, + 0xcc, 0xcc, 0xcc, 0x0, 0x58, 0x10, 0xe, 0x0, + 0x0, 0x1c, 0x0, 0x6, 0xd3, 0xf, 0xcc, 0xcc, + 0xdc, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x5b, 0xbb, 0xbb, 0xbb, 0x20, + 0x0, 0x3c, 0x77, 0x3a, 0x1c, 0x1a, 0x30, 0x0, + 0xa5, 0x76, 0x19, 0xb, 0xa, 0x30, 0x2, 0xd0, + 0x76, 0x19, 0xb, 0xa, 0x30, 0xb, 0x50, 0x76, + 0x19, 0xb, 0xa, 0x30, 0x1c, 0x9, 0xee, 0xdf, + 0xdf, 0xdf, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6E2F "港" */ + 0x4, 0x80, 0x0, 0x85, 0x0, 0xc2, 0x0, 0x1, + 0x9c, 0x10, 0x85, 0x0, 0xc2, 0x0, 0x0, 0x6, + 0x7d, 0xfe, 0xdd, 0xfe, 0xd4, 0x0, 0x0, 0x0, + 0x85, 0x0, 0xc2, 0x0, 0x1d, 0x50, 0xaa, 0xdc, + 0xaa, 0xeb, 0xa7, 0x3, 0xc7, 0x33, 0xc6, 0x33, + 0xb8, 0x32, 0x0, 0x0, 0x5, 0xd0, 0x0, 0x3e, + 0x0, 0x0, 0x0, 0x3e, 0xfb, 0xbb, 0xec, 0xc1, + 0x0, 0xc, 0xd3, 0xd0, 0x0, 0x84, 0x79, 0x0, + 0x69, 0x0, 0xec, 0xcc, 0xe4, 0x0, 0x0, 0xd2, + 0x0, 0xd0, 0x0, 0x0, 0x40, 0x7, 0xa0, 0x0, + 0xd0, 0x0, 0x1, 0xc0, 0x9, 0x20, 0x0, 0x9e, + 0xdd, 0xde, 0x60, + + /* U+6E56 "湖" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0x60, 0xc, 0x0, 0xad, 0xdf, 0x0, 0x7, 0x0, + 0xc0, 0xa, 0x10, 0xd0, 0x0, 0x2b, 0xbf, 0xb8, + 0xa1, 0xd, 0xa, 0x30, 0x12, 0xd1, 0x1a, 0xdd, + 0xf0, 0x3b, 0x50, 0xc, 0x0, 0xa1, 0xd, 0x0, + 0x0, 0x57, 0xe7, 0x2b, 0x10, 0xd0, 0x0, 0xb, + 0x64, 0xa5, 0xcb, 0xaf, 0x0, 0x4a, 0xb2, 0x8, + 0x5c, 0x22, 0xe0, 0xa, 0x5b, 0x20, 0x85, 0xb0, + 0xd, 0x1, 0xe0, 0xbd, 0xde, 0x89, 0x0, 0xd0, + 0x88, 0xb, 0x20, 0xa, 0x30, 0xd, 0x9, 0x10, + 0x30, 0x2, 0xa0, 0x4c, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+6E90 "源" */ + 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xb9, 0x1f, 0xdd, 0xdd, 0xdd, 0xd6, 0x0, 0x5, + 0x1e, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x3b, 0xce, 0xbb, 0xb0, 0xc, 0x50, 0xe, 0x48, + 0x0, 0x0, 0xd0, 0x1, 0xb7, 0x1d, 0x4d, 0xbb, + 0xbb, 0xe0, 0x0, 0x0, 0x2c, 0x48, 0x0, 0x0, + 0xd0, 0x0, 0x2, 0x3a, 0x4d, 0xaa, 0xaa, 0xe0, + 0x0, 0x2d, 0x49, 0x1, 0x1e, 0x11, 0x10, 0x0, + 0x96, 0x86, 0x1c, 0xe, 0x7, 0x70, 0x1, 0xe0, + 0xc2, 0xa5, 0xe, 0x0, 0xd2, 0x8, 0x84, 0xc2, + 0xb0, 0xe, 0x0, 0x67, 0x7, 0x17, 0x30, 0x5, + 0xcc, 0x0, 0x0, + + /* U+6E96 "準" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa5, 0x1, 0xc0, 0x74, 0x0, 0x0, 0x0, 0x1a, + 0x4a, 0xb6, 0xad, 0x66, 0x40, 0x5, 0x0, 0x6f, + 0x54, 0x8a, 0x44, 0x30, 0x7, 0xd6, 0xde, 0x99, + 0xbc, 0x99, 0x20, 0x0, 0x10, 0xd, 0x11, 0x69, + 0x11, 0x0, 0x0, 0xa, 0x2d, 0xaa, 0xcd, 0xaa, + 0x20, 0x0, 0x98, 0xd, 0x0, 0x58, 0x0, 0x0, + 0x8, 0xa0, 0xd, 0xcc, 0xde, 0xcc, 0xb0, 0x3, + 0x0, 0x6, 0x55, 0x0, 0x0, 0x0, 0xc, 0xcc, + 0xcc, 0xee, 0xcc, 0xcc, 0xc5, 0x1, 0x11, 0x11, + 0x78, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x68, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, + 0x0, 0x0, + + /* U+6E9D "溝" */ + 0x5, 0x70, 0x0, 0x68, 0x0, 0xe0, 0x0, 0x1, + 0xac, 0x5b, 0xde, 0xbc, 0xfb, 0xb0, 0x0, 0x6, + 0x0, 0x68, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xb, + 0xdd, 0xbb, 0xfb, 0x80, 0x1b, 0x40, 0x33, 0x8a, + 0x33, 0xe3, 0x31, 0x3, 0xc5, 0x77, 0x77, 0xd9, + 0x77, 0x73, 0x0, 0x0, 0x8, 0xbb, 0xec, 0xbb, + 0x40, 0x0, 0x1, 0xb, 0x20, 0xb2, 0x8, 0x50, + 0x0, 0x1d, 0xb, 0xcb, 0xec, 0xbd, 0x50, 0x0, + 0x88, 0xb, 0x20, 0xb2, 0x8, 0x50, 0x1, 0xe2, + 0xcf, 0xdc, 0xdc, 0xce, 0xd6, 0x8, 0x80, 0xb, + 0x20, 0x0, 0x8, 0x50, 0x8, 0x10, 0xb, 0x20, + 0x4, 0xbd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6EFF "滿" */ + 0x6, 0x10, 0x0, 0xe0, 0x0, 0xd1, 0x0, 0x6, + 0xe3, 0x22, 0xe2, 0x22, 0xd3, 0x20, 0x0, 0x36, + 0xbb, 0xfb, 0xbb, 0xfb, 0xb4, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0xd1, 0x0, 0x23, 0x0, 0x0, 0xbc, + 0xfc, 0xc0, 0x0, 0x2c, 0xa0, 0x12, 0x22, 0xe2, + 0x22, 0x20, 0x0, 0x50, 0xab, 0xaa, 0xfa, 0xaa, + 0xe0, 0x0, 0x0, 0xa2, 0x70, 0xd1, 0x70, 0xd0, + 0x0, 0x38, 0xa1, 0xa1, 0xd0, 0xc1, 0xd0, 0x0, + 0xb2, 0xa3, 0xb8, 0xd4, 0xa7, 0xd0, 0x4, 0xa0, + 0xaa, 0x1a, 0xd9, 0xa, 0xd0, 0xd, 0x20, 0xa2, + 0x0, 0xd0, 0x0, 0xd0, 0x6, 0x0, 0xa1, 0x0, + 0xb0, 0x4b, 0xb0, + + /* U+6F22 "漢" */ + 0x7, 0x50, 0x0, 0xd0, 0x2, 0xb0, 0x0, 0x2, + 0xc9, 0xbc, 0xfc, 0xcc, 0xfc, 0xc1, 0x0, 0x5, + 0x0, 0xd0, 0x2, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x8a, 0xfa, 0x70, 0x0, 0x5b, 0x20, 0x2a, 0xaa, + 0xfa, 0xaa, 0x30, 0x5, 0xe2, 0x3a, 0x0, 0xe0, + 0x9, 0x40, 0x0, 0x10, 0x3d, 0x99, 0xf9, 0x9d, + 0x40, 0x0, 0x0, 0x1, 0x11, 0xe1, 0x11, 0x0, + 0x0, 0x3a, 0x4b, 0xbc, 0xfb, 0xbb, 0x50, 0x0, + 0xb5, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x2, 0xd0, + 0xbb, 0xbf, 0xde, 0xbb, 0xb1, 0xa, 0x60, 0x0, + 0xaa, 0xa, 0x80, 0x0, 0x1d, 0x0, 0x9d, 0x60, + 0x0, 0x7c, 0xa1, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x30, + + /* U+6F38 "漸" */ + 0x5, 0x20, 0x1, 0xb0, 0x0, 0x0, 0x31, 0x3, + 0xd2, 0x2, 0xb0, 0x1, 0x6c, 0xc2, 0x0, 0x36, + 0xbb, 0xeb, 0x97, 0xa2, 0x0, 0x0, 0x0, 0x1, + 0xb0, 0x7, 0x60, 0x0, 0x3, 0x0, 0xda, 0xdb, + 0x87, 0x60, 0x0, 0xa, 0x80, 0xa0, 0x82, 0x87, + 0xdb, 0xe4, 0x0, 0x40, 0xda, 0xdb, 0x87, 0x60, + 0xb0, 0x0, 0x0, 0xa0, 0x82, 0x88, 0x50, 0xb0, + 0x0, 0x55, 0x9b, 0xea, 0x59, 0x40, 0xb0, 0x0, + 0xb1, 0x1, 0xb0, 0xa, 0x20, 0xb0, 0x2, 0xa3, + 0xcc, 0xec, 0xad, 0x0, 0xb0, 0x9, 0x40, 0x1, + 0xb0, 0x4a, 0x0, 0xb0, 0x7, 0x0, 0x1, 0xb0, + 0x53, 0x0, 0xb0, + + /* U+6FC3 "濃" */ + 0x3, 0x70, 0x0, 0xc, 0x0, 0xc0, 0x0, 0x1, + 0xbc, 0x1d, 0xae, 0xaa, 0xea, 0xf0, 0x0, 0x7, + 0xc, 0xc, 0x0, 0xc0, 0xd0, 0x0, 0x0, 0xd, + 0x9e, 0x99, 0xe9, 0xf0, 0x7, 0x10, 0xd, 0x5d, + 0x55, 0xd5, 0xe0, 0x7, 0xd3, 0x4, 0x44, 0x44, + 0x44, 0x40, 0x0, 0x20, 0x2e, 0xbb, 0xbb, 0xbb, + 0xb5, 0x0, 0x0, 0x2a, 0x57, 0x77, 0x77, 0x40, + 0x0, 0xc, 0x3a, 0x22, 0x22, 0x22, 0x10, 0x0, + 0x58, 0x5e, 0xdd, 0xcf, 0xcb, 0xc7, 0x0, 0xd1, + 0x76, 0x56, 0x7, 0x95, 0xb1, 0x6, 0x90, 0xc1, + 0x66, 0x14, 0xac, 0x10, 0x9, 0x15, 0x90, 0xae, + 0xb7, 0x5, 0xd6, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+6FDF "濟" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x10, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x3, 0xc2, + 0x99, 0x99, 0xf9, 0x99, 0x92, 0x0, 0x31, 0x22, + 0x29, 0x3b, 0x32, 0x30, 0x0, 0x0, 0x99, 0x97, + 0x94, 0x8c, 0x40, 0x39, 0x0, 0x47, 0x92, 0xb3, + 0x77, 0x10, 0x6, 0xc0, 0x92, 0x91, 0xb3, 0x63, + 0x80, 0x0, 0x23, 0x75, 0xb0, 0xb5, 0xb5, 0x71, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, 0x0, 0x0, + 0xa0, 0xe, 0xcc, 0xcc, 0xcd, 0x0, 0x1, 0xb0, + 0xf, 0x0, 0x0, 0xd, 0x0, 0x8, 0x50, 0x2f, + 0xcc, 0xcc, 0xcd, 0x0, 0xd, 0x0, 0xa7, 0x0, + 0x0, 0xd, 0x0, 0x16, 0x4, 0xa0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7063 "灣" */ + 0x7, 0x10, 0x52, 0x3, 0x50, 0x7, 0x0, 0x8, + 0xe2, 0x84, 0x48, 0xc7, 0x53, 0x60, 0x0, 0x67, + 0xfc, 0x12, 0x22, 0xdf, 0x30, 0x0, 0x0, 0x63, + 0x28, 0x85, 0x26, 0x40, 0x26, 0x5, 0xb8, 0x77, + 0x85, 0xb8, 0x91, 0x8, 0xb3, 0x44, 0x5d, 0x9a, + 0x55, 0x70, 0x0, 0x19, 0x17, 0x5b, 0x7a, 0x79, + 0x52, 0x0, 0x0, 0x7a, 0xaa, 0xaa, 0xba, 0x10, + 0x0, 0xb2, 0x2, 0x22, 0x22, 0x2d, 0x10, 0x1, + 0xd0, 0x5c, 0x77, 0x77, 0x77, 0x0, 0x7, 0x80, + 0x9c, 0xaa, 0xaa, 0xaa, 0x70, 0xd, 0x20, 0x0, + 0x0, 0x0, 0x8, 0x60, 0x19, 0x0, 0x0, 0x0, + 0x6b, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+706B "火" */ + 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x59, 0x0, 0x0, 0x10, 0x0, 0x1e, 0x0, + 0x68, 0x0, 0x6, 0xb0, 0x0, 0x5a, 0x0, 0x87, + 0x0, 0xd, 0x30, 0x0, 0xd3, 0x0, 0xb9, 0x0, + 0x5b, 0x0, 0x5, 0xa0, 0x0, 0xee, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0x3, 0xda, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x72, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x7, + 0xd2, 0x0, 0xa, 0xc1, 0x0, 0x5, 0xcb, 0x10, + 0x0, 0x0, 0x6e, 0xa3, 0x6, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x62, + + /* U+707D "災" */ + 0x0, 0x9, 0x0, 0x9, 0x10, 0x8, 0x20, 0x0, + 0xa7, 0x0, 0xa7, 0x0, 0x98, 0x0, 0x7, 0xa0, + 0x8, 0xa0, 0x8, 0xa0, 0x0, 0x2, 0xd2, 0x2, + 0xd3, 0x3, 0xd2, 0x0, 0x0, 0x3d, 0x10, 0x2d, + 0x20, 0x2d, 0x20, 0x0, 0x4, 0x10, 0x45, 0x0, + 0x4, 0x30, 0x0, 0x7, 0x0, 0xb7, 0x0, 0x6, + 0x20, 0x0, 0x4b, 0x0, 0xda, 0x0, 0x2d, 0x0, + 0x2, 0xd2, 0x2, 0xed, 0x0, 0xc3, 0x0, 0x5, + 0x30, 0x9, 0x88, 0x81, 0x50, 0x0, 0x0, 0x0, + 0x6d, 0x11, 0xd4, 0x0, 0x0, 0x0, 0x4b, 0xc2, + 0x0, 0x2e, 0x93, 0x0, 0x2e, 0xb5, 0x0, 0x0, + 0x0, 0x7c, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+70B9 "点" */ + 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xde, 0xee, 0xee, 0xa0, 0x0, 0x0, 0x0, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x9a, 0xaa, 0xfb, + 0xaa, 0xa2, 0x0, 0x0, 0xd3, 0x33, 0x33, 0x33, + 0xc3, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xb3, 0x0, + 0x0, 0xde, 0xdd, 0xdd, 0xdd, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0xe0, + 0x47, 0x6, 0x60, 0x89, 0x0, 0xa, 0x70, 0x3b, + 0x1, 0xd0, 0xc, 0x70, 0x4b, 0x0, 0x2b, 0x0, + 0xb1, 0x2, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+70BA "為" */ + 0x0, 0x5, 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x90, 0x3d, 0x0, 0x0, 0x0, 0x1, 0x12, + 0xb2, 0x98, 0x11, 0x10, 0x0, 0x9, 0xcc, 0xcd, + 0xfc, 0xcc, 0xd0, 0x0, 0x0, 0x0, 0xa, 0x60, + 0x4, 0x90, 0x0, 0x0, 0x0, 0x5f, 0xdd, 0xde, + 0xec, 0x0, 0x0, 0x1, 0xe2, 0x0, 0x0, 0xc, + 0x0, 0x0, 0x2d, 0x70, 0x0, 0x0, 0x4a, 0x0, + 0x4, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xf0, 0x4e, + 0x54, 0x2, 0x4, 0x7, 0x0, 0xe0, 0x1, 0x59, + 0xb, 0xb, 0x16, 0x73, 0xb0, 0x0, 0xc2, 0xc, + 0x6, 0x40, 0x17, 0x80, 0x4, 0x70, 0x4, 0x0, + 0xa, 0xdd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7121 "無" */ + 0x0, 0x5, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xdf, 0xde, 0xfd, 0xfe, 0xa0, 0x1c, 0xc9, 0xc, + 0x3, 0x90, 0x93, 0x0, 0x5, 0x49, 0xc, 0x3, + 0x90, 0x93, 0x0, 0xb, 0xef, 0xdf, 0xee, 0xfd, + 0xfe, 0xb0, 0x0, 0x49, 0xc, 0x3, 0x90, 0x93, + 0x0, 0x0, 0x49, 0xc, 0x3, 0x90, 0x93, 0x0, + 0x2a, 0xbd, 0xae, 0xab, 0xda, 0xdb, 0xa1, 0x3, + 0x43, 0x33, 0x33, 0x33, 0x34, 0x30, 0x0, 0xd1, + 0xb, 0x1, 0xb0, 0x2d, 0x10, 0x7, 0x90, 0xe, + 0x0, 0xc2, 0x6, 0xb0, 0x1a, 0x0, 0x9, 0x0, + 0x64, 0x0, 0xa2, + + /* U+7136 "然" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x50, 0x0, 0xd, 0x36, 0x0, 0x0, 0x2f, + 0xdc, 0xc0, 0xd, 0xc, 0x30, 0x0, 0x97, 0x1, + 0xb0, 0xd, 0x2, 0x50, 0x5, 0xd6, 0x86, 0x8e, + 0xef, 0xee, 0xd0, 0x2e, 0x30, 0x5f, 0x10, 0xf, + 0x30, 0x0, 0x13, 0x98, 0x68, 0x0, 0x5e, 0xa0, + 0x0, 0x0, 0x9, 0xd0, 0x0, 0xc3, 0xd1, 0x0, + 0x0, 0x5d, 0x10, 0x9, 0x90, 0x5b, 0x0, 0xb, + 0xa1, 0x1, 0xba, 0x0, 0x8, 0xc0, 0x2, 0x0, + 0x0, 0x50, 0x0, 0x0, 0x30, 0x0, 0xd1, 0xa, + 0x3, 0x90, 0x4c, 0x0, 0x8, 0x70, 0xe, 0x0, + 0xd0, 0x9, 0x80, 0x2a, 0x0, 0xa, 0x0, 0x72, + 0x0, 0xb0, + + /* U+7159 "煙" */ + 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x6d, 0xdf, 0xde, 0xed, 0xd0, 0x0, 0xc0, + 0x0, 0xd, 0x6, 0x70, 0x0, 0x8, 0xc4, 0x9c, + 0xcf, 0xce, 0xec, 0x90, 0x28, 0xc8, 0x4a, 0xc, + 0x6, 0x61, 0xb0, 0x65, 0xc7, 0x2a, 0xc, 0x6, + 0x61, 0xb0, 0x50, 0xd0, 0x2e, 0xcf, 0xce, 0xed, + 0xb0, 0x0, 0xd0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x2, + 0xe6, 0xc, 0xcc, 0xed, 0xcc, 0x70, 0x7, 0x6c, + 0x10, 0x0, 0xa4, 0x0, 0x0, 0xd, 0x15, 0x30, + 0x0, 0xa4, 0x0, 0x0, 0x77, 0x0, 0xcd, 0xdd, + 0xfd, 0xdd, 0xd2, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+71B1 "熱" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x7, 0x50, 0x0, 0xd, 0x0, 0x0, 0x6, 0xbd, + 0xcb, 0x50, 0xd, 0x0, 0x0, 0x0, 0x7, 0x50, + 0x8, 0xbf, 0xbb, 0x0, 0x1b, 0xbc, 0xcb, 0xa1, + 0x3c, 0x2d, 0x0, 0x1, 0xa1, 0x18, 0x16, 0x5a, + 0xd, 0x0, 0x19, 0x15, 0x32, 0x92, 0xcb, 0xd, + 0x0, 0x8, 0xbd, 0xcb, 0x60, 0xaa, 0xac, 0x0, + 0x0, 0x8, 0x60, 0x1, 0xd0, 0x2b, 0x46, 0x1, + 0x3a, 0xa8, 0xab, 0x60, 0x7, 0x85, 0x2b, 0x98, + 0x64, 0x68, 0x0, 0x1, 0xb1, 0x0, 0x61, 0x4, + 0x0, 0x50, 0x18, 0x0, 0x3, 0xc0, 0x1d, 0x0, + 0xe2, 0xb, 0x70, 0xd, 0x20, 0xe, 0x0, 0x95, + 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+71DF "營" */ + 0x0, 0x17, 0x51, 0x1, 0xa, 0x20, 0x20, 0x9, + 0x49, 0x2a, 0x4b, 0x1d, 0x8, 0x80, 0x6, 0x1f, + 0x63, 0x24, 0x5f, 0x66, 0x0, 0x16, 0xd4, 0x9a, + 0x39, 0xc2, 0x9c, 0x40, 0x1b, 0x64, 0x48, 0x79, + 0x54, 0x47, 0xc0, 0xe, 0x77, 0x77, 0x77, 0x77, + 0x78, 0xd0, 0xe, 0x9, 0xaa, 0xaa, 0xaa, 0x61, + 0xd0, 0x4, 0xd, 0x0, 0x0, 0x5, 0xa0, 0x40, + 0x0, 0xd, 0xaa, 0xaa, 0xac, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, + 0xbb, 0xbb, 0xbb, 0xcf, 0x0, 0x0, 0xc1, 0x0, + 0x0, 0x0, 0x1f, 0x0, 0x0, 0xcc, 0xbb, 0xbb, + 0xbb, 0xcf, 0x0, + + /* U+722D "爭" */ + 0x0, 0x0, 0x12, 0x34, 0x67, 0xab, 0x10, 0x4, + 0xcb, 0xa9, 0xa7, 0x64, 0x36, 0x0, 0x0, 0x1c, + 0x0, 0xb4, 0x0, 0x99, 0x0, 0x0, 0x8, 0x40, + 0x47, 0x4, 0xc0, 0x0, 0x0, 0xac, 0xcc, 0xcc, + 0xcc, 0xda, 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, + 0x1d, 0x0, 0x1, 0x11, 0x11, 0x89, 0x11, 0x2d, + 0x11, 0x2b, 0xbb, 0xbb, 0xdd, 0xbb, 0xbf, 0xb7, + 0x0, 0x0, 0x0, 0x78, 0x0, 0x1d, 0x0, 0x0, + 0xcc, 0xcc, 0xde, 0xcc, 0xcc, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdd, 0xd4, + 0x0, 0x0, 0x0, + + /* U+7236 "父" */ + 0x0, 0x0, 0x52, 0x0, 0x25, 0x0, 0x0, 0x0, + 0x4, 0xe1, 0x0, 0x1d, 0x50, 0x0, 0x0, 0x1e, + 0x40, 0x0, 0x1, 0xd6, 0x0, 0x2, 0xd7, 0x0, + 0x0, 0x0, 0x2e, 0x40, 0xd, 0x62, 0x60, 0x0, + 0x7, 0x43, 0xe0, 0x1, 0x0, 0xe1, 0x0, 0x1e, + 0x10, 0x10, 0x0, 0x0, 0x79, 0x0, 0x89, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x43, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xed, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x7e, 0x54, 0xe9, 0x0, 0x0, 0x2, 0x8e, 0xb1, + 0x0, 0x1a, 0xe9, 0x40, 0x3f, 0x92, 0x0, 0x0, + 0x0, 0x28, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7238 "爸" */ + 0x0, 0x0, 0x97, 0x0, 0x1b, 0x40, 0x0, 0x0, + 0x1b, 0xd0, 0x0, 0x3, 0xfa, 0x10, 0x7, 0xd5, + 0x8c, 0x20, 0x5e, 0x56, 0xe2, 0x2, 0x10, 0x3, + 0xdc, 0xc1, 0x0, 0x20, 0x0, 0x0, 0x6c, 0xb7, + 0xca, 0x40, 0x0, 0x18, 0xcd, 0x82, 0x0, 0x3, + 0x9d, 0xb6, 0x6, 0x4c, 0xcc, 0xcc, 0xcc, 0xcc, + 0x32, 0x0, 0x2c, 0x0, 0xe, 0x0, 0xd, 0x0, + 0x0, 0x2c, 0x0, 0xe, 0x0, 0xd, 0x0, 0x0, + 0x2f, 0xcc, 0xcd, 0xcc, 0xcd, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x69, 0x0, 0x9, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd2, + + /* U+7247 "片" */ + 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x3, + 0xb0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x1e, + 0x0, 0x0, 0x0, 0x3f, 0xee, 0xee, 0xee, 0xee, + 0xc0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, + 0xee, 0xee, 0xe9, 0x0, 0x0, 0x78, 0x0, 0x0, + 0x5, 0xa0, 0x0, 0xb, 0x40, 0x0, 0x0, 0x4a, + 0x0, 0x1, 0xe0, 0x0, 0x0, 0x4, 0xa0, 0x0, + 0xa8, 0x0, 0x0, 0x0, 0x4a, 0x0, 0xb, 0x0, + 0x0, 0x0, 0x4, 0xa0, 0x0, + + /* U+725B "牛" */ + 0x0, 0x4, 0x20, 0x2d, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x30, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0xae, 0xee, + 0xef, 0xee, 0xee, 0x90, 0x4, 0xd0, 0x0, 0x2d, + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x2d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x0, 0x0, + 0x0, 0x1e, 0xee, 0xee, 0xef, 0xee, 0xee, 0xe6, + 0x0, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, + 0x0, 0x0, 0x0, + + /* U+7260 "牠" */ + 0x0, 0xd, 0x0, 0x0, 0xd, 0x0, 0x0, 0xa, + 0x1d, 0x0, 0x30, 0xd, 0x0, 0x0, 0xc, 0xd, + 0x0, 0xa2, 0xd, 0x0, 0x20, 0xf, 0xef, 0xe3, + 0xa2, 0xd, 0x8d, 0xf0, 0x39, 0xd, 0x0, 0xb9, + 0xcf, 0x60, 0xd0, 0x54, 0xd, 0xb, 0xf7, 0x1d, + 0x0, 0xd0, 0x0, 0xe, 0x66, 0xa2, 0xd, 0x0, + 0xd0, 0x28, 0xcf, 0x71, 0xa2, 0xd, 0x0, 0xd0, + 0x25, 0x1d, 0x0, 0xa2, 0xd, 0x3b, 0x90, 0x0, + 0xd, 0x0, 0xa2, 0x9, 0x1, 0x0, 0x0, 0xd, + 0x0, 0xa2, 0x0, 0x0, 0x55, 0x0, 0xd, 0x0, + 0xa3, 0x0, 0x0, 0x85, 0x0, 0xd, 0x0, 0x5d, + 0xcc, 0xcd, 0xc0, + + /* U+7269 "物" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0xa, 0x30, 0x0, 0x0, 0xb, 0x2d, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xd, 0xd, 0x0, + 0x4e, 0x77, 0x77, 0x71, 0xf, 0xef, 0xe7, 0xb8, + 0xba, 0xab, 0xd3, 0x3a, 0xd, 0x5, 0xb0, 0xc1, + 0x94, 0xb2, 0x75, 0xd, 0xc, 0x23, 0xa0, 0xc0, + 0xc1, 0x0, 0xd, 0x14, 0x9, 0x42, 0xb0, 0xe0, + 0x3, 0x8f, 0xc6, 0x3c, 0x8, 0x50, 0xe0, 0x5b, + 0x6e, 0x1, 0xd3, 0xd, 0x0, 0xd0, 0x0, 0xd, + 0x7, 0x60, 0x87, 0x2, 0xc0, 0x0, 0xd, 0x0, + 0x2, 0xd0, 0x5, 0x90, 0x0, 0xd, 0x0, 0x2d, + 0x30, 0xa, 0x60, 0x0, 0xd, 0x0, 0x85, 0x9, + 0xec, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7279 "特" */ + 0x0, 0xd, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x5, + 0x1e, 0x0, 0x0, 0x3b, 0x0, 0x0, 0xb, 0x1e, + 0x0, 0xdd, 0xef, 0xdd, 0x70, 0xd, 0xaf, 0xa0, + 0x0, 0x3b, 0x0, 0x0, 0xd, 0x4e, 0x42, 0x33, + 0x5c, 0x33, 0x30, 0x49, 0xe, 0x8, 0xaa, 0xaa, + 0xdd, 0xa1, 0x12, 0xe, 0x0, 0x0, 0x0, 0x76, + 0x0, 0x1, 0x5f, 0xd9, 0xdd, 0xdd, 0xee, 0xd1, + 0x3e, 0x9e, 0x0, 0x41, 0x0, 0x76, 0x0, 0x0, + 0xe, 0x0, 0x4c, 0x0, 0x76, 0x0, 0x0, 0xe, + 0x0, 0x8, 0x70, 0x76, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x76, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x7e, 0xe3, 0x0, + + /* U+72AC "犬" */ + 0x0, 0x0, 0x0, 0x87, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x86, 0x8, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x5d, 0x10, 0x0, 0x0, 0x0, + 0xa5, 0x0, 0x2, 0x0, 0x3c, 0xcc, 0xcc, 0xfd, + 0xcc, 0xcc, 0xc3, 0x1, 0x11, 0x12, 0xfe, 0x21, + 0x11, 0x10, 0x0, 0x0, 0x3, 0xdb, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x84, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0x10, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0xc7, 0x0, 0x3e, 0x20, 0x0, 0x0, 0x1c, + 0x90, 0x0, 0x6, 0xe2, 0x0, 0x6, 0xe8, 0x0, + 0x0, 0x0, 0x6f, 0x81, 0x1a, 0x20, 0x0, 0x0, + 0x0, 0x2, 0xa2, + + /* U+72AF "犯" */ + 0x9, 0x10, 0x66, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xd5, 0xe1, 0x3d, 0xdd, 0xdd, 0xa0, 0x0, 0x7f, + 0x30, 0x3b, 0x0, 0x2, 0xc0, 0x4, 0xed, 0x20, + 0x3a, 0x0, 0x2, 0xc0, 0x3d, 0x27, 0x80, 0x3a, + 0x0, 0x2, 0xc0, 0x1, 0x3, 0xc0, 0x3a, 0x0, + 0x2, 0xc0, 0x0, 0xc, 0xd0, 0x3a, 0x1, 0x14, + 0xc0, 0x0, 0x9a, 0xe0, 0x3a, 0x7, 0xdc, 0x50, + 0xa, 0xb0, 0xe0, 0x3a, 0x0, 0x0, 0x0, 0x48, + 0x0, 0xd0, 0x3a, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xc0, 0x3a, 0x0, 0x0, 0x3a, 0x0, 0x7, 0x90, + 0x3d, 0x10, 0x0, 0x78, 0xb, 0xdc, 0x10, 0xa, + 0xee, 0xee, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+72B6 "状" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x0, 0xe0, 0x40, 0x0, 0x0, 0xa, + 0x30, 0x0, 0xe0, 0x6a, 0x0, 0x3b, 0xa, 0x30, + 0x0, 0xe0, 0xb, 0x50, 0x9, 0x7a, 0x30, 0x0, + 0xe0, 0x1, 0x10, 0x0, 0xab, 0x7c, 0xcc, 0xfc, + 0xcc, 0xc0, 0x0, 0xa, 0x42, 0x23, 0xf5, 0x22, + 0x20, 0x0, 0xd, 0x30, 0x3, 0xf8, 0x0, 0x0, + 0x0, 0xce, 0x30, 0x7, 0x9c, 0x0, 0x0, 0x1d, + 0x6a, 0x30, 0xc, 0x3b, 0x40, 0x0, 0x85, 0xa, + 0x30, 0x4c, 0x4, 0xb0, 0x0, 0x0, 0xa, 0x30, + 0xd4, 0x0, 0xb7, 0x0, 0x0, 0xa, 0x4c, 0x80, + 0x0, 0x1e, 0x70, 0x0, 0xa, 0x99, 0x0, 0x0, + 0x2, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+72C0 "狀" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x3a, 0x0, 0x0, 0xd, 0x0, + 0xe0, 0x0, 0x3a, 0x3c, 0x10, 0xd, 0x0, 0xe0, + 0x0, 0x3a, 0x5, 0xb0, 0xd, 0x0, 0xe0, 0x0, + 0x3a, 0x0, 0x40, 0xd, 0xdd, 0xf6, 0xcc, 0xde, + 0xcc, 0xc6, 0x0, 0x0, 0xe1, 0x22, 0x6f, 0x22, + 0x21, 0x0, 0x0, 0xe0, 0x0, 0x6f, 0x20, 0x0, + 0x5d, 0xdd, 0xf0, 0x0, 0xad, 0x60, 0x0, 0x5, + 0x80, 0xe0, 0x0, 0xe5, 0xb0, 0x0, 0x7, 0x60, + 0xe0, 0x7, 0xa0, 0xd3, 0x0, 0x9, 0x40, 0xe0, + 0x2e, 0x20, 0x5c, 0x0, 0x1d, 0x0, 0xe3, 0xe5, + 0x0, 0xa, 0xc1, 0x34, 0x0, 0xeb, 0x50, 0x0, + 0x0, 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+72EC "独" */ + 0x17, 0x2, 0x50, 0x0, 0xc2, 0x0, 0x0, 0xa, + 0x5b, 0x40, 0x0, 0xc2, 0x0, 0x0, 0x0, 0xea, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x6, 0xf7, 0xd, + 0xdd, 0xfd, 0xdd, 0xa0, 0x4b, 0x2c, 0xe, 0x0, + 0xc2, 0x3, 0xb0, 0x0, 0xd, 0x1e, 0x0, 0xc2, + 0x3, 0xb0, 0x0, 0x5f, 0x2e, 0x0, 0xc2, 0x3, + 0xb0, 0x2, 0xdc, 0x3e, 0xdd, 0xfd, 0xdd, 0xb0, + 0x3e, 0x3b, 0x30, 0x0, 0xc2, 0x4, 0x0, 0x23, + 0xb, 0x20, 0x0, 0xc2, 0xe, 0x30, 0x0, 0xd, + 0x10, 0x0, 0xc2, 0x7, 0xa0, 0x0, 0x1e, 0x37, + 0x9b, 0xfe, 0xfd, 0xe1, 0xd, 0xe6, 0x37, 0x64, + 0x21, 0x0, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+72ED "狭" */ + 0x9, 0x10, 0xb1, 0x0, 0x1e, 0x0, 0x0, 0x5, + 0xc9, 0x80, 0x0, 0x1e, 0x0, 0x0, 0x0, 0xad, + 0x4, 0xee, 0xef, 0xee, 0xe4, 0x6, 0xdd, 0x0, + 0x40, 0x1e, 0x0, 0x50, 0x1b, 0x1a, 0x40, 0xa4, + 0x1e, 0x6, 0x90, 0x0, 0x7, 0x80, 0x4a, 0x1d, + 0xc, 0x20, 0x0, 0x1e, 0x90, 0x7, 0x2c, 0x7, + 0x0, 0x0, 0xc8, 0xab, 0xee, 0xff, 0xee, 0xe8, + 0x1c, 0x74, 0xa0, 0x0, 0x9f, 0x30, 0x0, 0x15, + 0x4, 0x90, 0x1, 0xe3, 0xb0, 0x0, 0x0, 0x6, + 0x80, 0x1c, 0x50, 0x88, 0x0, 0x0, 0xa, 0x54, + 0xd7, 0x0, 0xc, 0x91, 0xa, 0xdb, 0x4c, 0x30, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+732B "猫" */ + 0x5, 0x10, 0x60, 0xe, 0x0, 0x3a, 0x0, 0x4, + 0xc7, 0x90, 0xe, 0x0, 0x3a, 0x0, 0x0, 0x9e, + 0xd, 0xdf, 0xdd, 0xef, 0xd8, 0x6, 0xdd, 0x0, + 0xe, 0x0, 0x3a, 0x0, 0x1a, 0x1a, 0x40, 0xb, + 0x0, 0x28, 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x94, 0xec, 0xcf, 0xcc, + 0xf1, 0x1, 0xc9, 0xa4, 0x80, 0x1d, 0x0, 0xc1, + 0xd, 0x74, 0xa4, 0xda, 0xaf, 0xaa, 0xe1, 0x2, + 0x4, 0x94, 0xa3, 0x4d, 0x33, 0xd1, 0x0, 0x6, + 0x84, 0x80, 0x1d, 0x0, 0xc1, 0x0, 0x1a, 0x44, + 0xdb, 0xbf, 0xbb, 0xe1, 0x6, 0xc9, 0x4, 0x91, + 0x11, 0x11, 0xc1, + + /* U+733F "猿" */ + 0x28, 0x4, 0x70, 0x0, 0xc2, 0x0, 0x0, 0xa, + 0x8d, 0x28, 0xcc, 0xfd, 0xcc, 0x30, 0x0, 0xf7, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0xa, 0xd8, 0x4b, + 0xbb, 0xfc, 0xbb, 0xa0, 0x58, 0x1d, 0x1, 0x11, + 0x11, 0x11, 0x10, 0x0, 0xe, 0x18, 0xcb, 0xbb, + 0xbd, 0x20, 0x0, 0x6f, 0x29, 0x40, 0x0, 0xb, + 0x20, 0x4, 0xcb, 0x39, 0xcb, 0xbb, 0xbe, 0x20, + 0x4d, 0x2b, 0x30, 0x1b, 0xb8, 0x2, 0x60, 0x22, + 0xb, 0x49, 0xf5, 0xb, 0x7c, 0x30, 0x0, 0xc, + 0x55, 0xa2, 0x3, 0xe0, 0x0, 0x0, 0x1d, 0x0, + 0xb7, 0x82, 0x8c, 0x20, 0xd, 0xd6, 0x1, 0xe9, + 0x40, 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7372 "獲" */ + 0x6, 0x3, 0x40, 0xb, 0x0, 0xf0, 0x0, 0xa, + 0x8d, 0x3b, 0xbe, 0xbb, 0xfc, 0xb3, 0x0, 0xe7, + 0x0, 0x4a, 0x53, 0xb0, 0x0, 0x8, 0xf8, 0x1, + 0xe1, 0x2d, 0x0, 0x0, 0x6c, 0x2d, 0xb, 0xe9, + 0x9f, 0x99, 0x90, 0x10, 0xe, 0x59, 0xe7, 0x7e, + 0x77, 0x40, 0x0, 0x6f, 0x20, 0xe9, 0x9e, 0x99, + 0x50, 0x3, 0xca, 0x30, 0xd2, 0x2d, 0x22, 0x20, + 0x3d, 0x2a, 0x30, 0xc7, 0x77, 0x77, 0x70, 0x23, + 0xb, 0x28, 0xcb, 0xbb, 0xbc, 0x80, 0x0, 0xc, + 0x10, 0xa9, 0x0, 0x7c, 0x10, 0x0, 0xd, 0x0, + 0x9, 0xee, 0xa0, 0x0, 0xd, 0xe6, 0x3b, 0xc9, + 0x55, 0x9c, 0xc4, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x10, + + /* U+73A9 "玩" */ + 0x1c, 0xcc, 0xc7, 0xbe, 0xee, 0xee, 0xc0, 0x1, + 0x4b, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xde, 0xc9, 0xee, + 0xee, 0xee, 0xe8, 0x1, 0x4b, 0x10, 0xa, 0x40, + 0xe0, 0x0, 0x0, 0x3a, 0x0, 0xb, 0x20, 0xe0, + 0x0, 0x0, 0x3a, 0x0, 0xd, 0x10, 0xe0, 0x0, + 0x0, 0x4d, 0x9a, 0x1d, 0x0, 0xe0, 0x0, 0x2c, + 0xe9, 0x40, 0x97, 0x0, 0xe0, 0x8, 0x3, 0x0, + 0x6, 0xd0, 0x0, 0xe0, 0x2b, 0x0, 0x0, 0x8a, + 0x10, 0x0, 0xae, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+73FE "現" */ + 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x10, 0x1d, + 0xef, 0xd9, 0x9c, 0xbb, 0xbb, 0xe0, 0x0, 0x1c, + 0x0, 0x94, 0x0, 0x0, 0xe0, 0x0, 0x1c, 0x0, + 0x9d, 0xcc, 0xcc, 0xe0, 0x2, 0x4d, 0x31, 0x94, + 0x0, 0x0, 0xe0, 0x8, 0xae, 0x95, 0x9d, 0xbb, + 0xbb, 0xe0, 0x0, 0x1c, 0x0, 0x94, 0x0, 0x0, + 0xe0, 0x0, 0x1c, 0x0, 0x94, 0x0, 0x0, 0xe0, + 0x0, 0x1c, 0x2, 0x7d, 0xec, 0xfc, 0xb0, 0x2, + 0x6f, 0xd9, 0x7, 0x60, 0xe0, 0x0, 0x2c, 0x73, + 0x0, 0xd, 0x20, 0xe0, 0x2, 0x0, 0x0, 0x1, + 0xb8, 0x0, 0xe0, 0xc, 0x0, 0x0, 0x6d, 0x60, + 0x0, 0xad, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7403 "球" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x27, 0x0, 0x4d, + 0xdd, 0xc0, 0x0, 0xe, 0xa, 0x70, 0x13, 0xb6, + 0x30, 0x0, 0xe, 0x1, 0x50, 0x0, 0x94, 0x9, + 0xcc, 0xdf, 0xcc, 0xc7, 0x0, 0x94, 0x1, 0x30, + 0xf, 0x0, 0x51, 0x3d, 0xfe, 0xa1, 0xd1, 0xf, + 0x33, 0xc0, 0x0, 0x94, 0x0, 0x5b, 0xf, 0x8c, + 0x20, 0x0, 0x94, 0x0, 0x3, 0x6f, 0xf3, 0x0, + 0x0, 0x94, 0x0, 0x8, 0xae, 0x95, 0x0, 0x0, + 0x98, 0xa2, 0xa9, 0xe, 0x1d, 0x10, 0x3b, 0xe9, + 0x5c, 0x80, 0xe, 0x5, 0xd2, 0x23, 0x0, 0x4, + 0x0, 0xe, 0x0, 0x49, 0x0, 0x0, 0x0, 0x1d, + 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7406 "理" */ + 0x4d, 0xdd, 0xd4, 0xfd, 0xdf, 0xdd, 0xe0, 0x0, + 0x85, 0x4, 0xa0, 0xd, 0x0, 0xe0, 0x0, 0x85, + 0x4, 0xb2, 0x2d, 0x22, 0xe0, 0x0, 0x85, 0x4, + 0xd9, 0x9e, 0x99, 0xe0, 0x1a, 0xdc, 0x84, 0xa0, + 0xd, 0x0, 0xe0, 0x0, 0x96, 0x4, 0xec, 0xcf, + 0xcc, 0xe0, 0x0, 0x85, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x85, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x87, 0x76, 0xdd, 0xdf, 0xdd, 0xd1, 0x17, + 0xed, 0x80, 0x0, 0xe, 0x0, 0x0, 0x49, 0x30, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x7d, + 0xdd, 0xdd, 0xdd, 0xd7, + + /* U+74B0 "環" */ + 0x58, 0x88, 0x1d, 0xae, 0xae, 0xac, 0x60, 0x25, + 0xc3, 0xc, 0xa, 0xa, 0x6, 0x60, 0x1, 0xb0, + 0x9, 0xbb, 0xbb, 0xbb, 0x40, 0x1, 0xb0, 0x38, + 0x88, 0x88, 0x88, 0x80, 0x5b, 0xea, 0x13, 0x33, + 0x33, 0x33, 0x30, 0x14, 0xc2, 0x7, 0xdb, 0xbb, + 0xbf, 0x0, 0x1, 0xb0, 0x7, 0x50, 0x0, 0xd, + 0x0, 0x1, 0xb0, 0x6, 0xcc, 0xdc, 0xbe, 0x0, + 0x1, 0xb4, 0x0, 0x6b, 0x38, 0x7, 0x50, 0x5b, + 0xe9, 0x8c, 0xd0, 0x4, 0xd6, 0x0, 0x43, 0x0, + 0x20, 0xc3, 0x65, 0x99, 0x10, 0x0, 0x0, 0x2, + 0xd9, 0x51, 0x6, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+7518 "甘" */ + 0x0, 0x7, 0x80, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x7, 0x80, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x7, + 0x80, 0x0, 0x1, 0xe0, 0x0, 0x1e, 0xef, 0xfe, + 0xee, 0xee, 0xfe, 0xe7, 0x0, 0x7, 0x80, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0x7, 0x80, 0x0, 0x1, + 0xe0, 0x0, 0x0, 0x7, 0x80, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x7, 0xfe, 0xee, 0xee, 0xe0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x7, 0x80, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x7, + 0x80, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x7, 0xfe, + 0xee, 0xee, 0xe0, 0x0, 0x0, 0x7, 0x80, 0x0, + 0x1, 0xd0, 0x0, + + /* U+751A "甚" */ + 0x0, 0x5, 0x80, 0x0, 0x3, 0xa0, 0x0, 0x0, + 0x6, 0x80, 0x0, 0x4, 0xb0, 0x0, 0x9, 0xcd, + 0xec, 0xcc, 0xcd, 0xec, 0xc0, 0x0, 0x5, 0xa4, + 0x44, 0x47, 0xa0, 0x0, 0x0, 0x5, 0xb5, 0x55, + 0x58, 0xa0, 0x0, 0x0, 0x5, 0xd9, 0x99, 0x9b, + 0xa0, 0x0, 0x0, 0x5, 0x91, 0x11, 0x15, 0xa0, + 0x0, 0x2, 0x27, 0xa2, 0x22, 0x26, 0xb2, 0x21, + 0xa, 0xcd, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0x0, + 0x68, 0x2, 0xc0, 0x4c, 0x10, 0x0, 0x0, 0x68, + 0x1c, 0x20, 0x4, 0xc1, 0x0, 0x0, 0x68, 0x55, + 0x0, 0x0, 0x52, 0x0, 0x0, 0x4b, 0xbb, 0xbb, + 0xbb, 0xbb, 0x30, + + /* U+751F "生" */ + 0x0, 0x7, 0x20, 0x78, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x10, 0x78, 0x0, 0x0, 0x0, 0x0, 0x6b, + 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xee, + 0xff, 0xee, 0xee, 0x80, 0x6, 0xc0, 0x0, 0x78, + 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x0, 0xae, 0xee, 0xff, 0xee, 0xee, 0x10, + 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, + 0x88, 0x11, 0x11, 0x10, 0x2d, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd3, + + /* U+7522 "產" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x0, 0x9a, + 0xaa, 0xaf, 0xaa, 0xaa, 0xa0, 0x0, 0x24, 0xd9, + 0x52, 0x3a, 0xb2, 0x20, 0x0, 0x0, 0x5, 0xde, + 0xf8, 0x0, 0x0, 0x0, 0x5, 0xba, 0x51, 0x39, + 0xc4, 0x0, 0x0, 0xed, 0xcc, 0xcc, 0xcc, 0xdd, + 0xc5, 0x0, 0xe0, 0x52, 0x4, 0x50, 0x0, 0x0, + 0x0, 0xe0, 0xec, 0xcd, 0xec, 0xcc, 0x70, 0x0, + 0xda, 0x30, 0x5, 0x80, 0x0, 0x0, 0x2, 0xc4, + 0x8b, 0xbd, 0xdb, 0xbb, 0x10, 0x4, 0xa0, 0x0, + 0x6, 0x80, 0x0, 0x0, 0x9, 0x60, 0x0, 0x5, + 0x80, 0x0, 0x0, 0x1e, 0x1a, 0xcc, 0xcc, 0xcc, + 0xcc, 0xc8, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7523 "産" */ + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x7a, 0x11, 0x11, 0x10, 0x2, 0xbb, + 0xdb, 0xbb, 0xbc, 0xbb, 0x80, 0x0, 0x0, 0x87, + 0x0, 0xc, 0x40, 0x0, 0x0, 0xaa, 0xae, 0xaa, + 0xbe, 0xaa, 0xa2, 0x0, 0xe2, 0x33, 0x23, 0x32, + 0x22, 0x20, 0x0, 0xd0, 0x68, 0x7, 0x60, 0x0, + 0x0, 0x0, 0xc1, 0xdc, 0xce, 0xdc, 0xcc, 0x20, + 0x2, 0xb9, 0x50, 0x7, 0x60, 0x0, 0x0, 0x3, + 0xa0, 0x8c, 0xce, 0xdc, 0xc9, 0x0, 0x6, 0x70, + 0x0, 0x7, 0x60, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x7, 0x60, 0x0, 0x0, 0x2d, 0xb, 0xdd, 0xde, + 0xed, 0xdd, 0xd3, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7528 "用" */ + 0x0, 0xce, 0xee, 0xee, 0xee, 0xee, 0x20, 0xd, + 0x10, 0x3, 0xb0, 0x0, 0xc2, 0x0, 0xd1, 0x0, + 0x3b, 0x0, 0xc, 0x20, 0xd, 0xba, 0xac, 0xea, + 0xaa, 0xe2, 0x0, 0xd4, 0x33, 0x5c, 0x33, 0x3d, + 0x20, 0xd, 0x10, 0x3, 0xb0, 0x0, 0xc2, 0x0, + 0xf0, 0x0, 0x3b, 0x0, 0xc, 0x20, 0xf, 0xdd, + 0xde, 0xfd, 0xdd, 0xf2, 0x2, 0xc0, 0x0, 0x3b, + 0x0, 0xc, 0x20, 0x68, 0x0, 0x3, 0xb0, 0x0, + 0xc2, 0xd, 0x30, 0x0, 0x3b, 0x0, 0xc, 0x25, + 0x90, 0x0, 0x3, 0xb0, 0xcd, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7530 "田" */ + 0xce, 0xee, 0xee, 0xee, 0xee, 0xe3, 0xd1, 0x0, + 0xd, 0x10, 0x0, 0xb3, 0xd1, 0x0, 0xd, 0x10, + 0x0, 0xb3, 0xd1, 0x0, 0xd, 0x10, 0x0, 0xb3, + 0xd1, 0x0, 0xd, 0x10, 0x0, 0xb3, 0xdf, 0xee, + 0xef, 0xfe, 0xee, 0xf3, 0xd1, 0x0, 0xd, 0x10, + 0x0, 0xb3, 0xd1, 0x0, 0xd, 0x10, 0x0, 0xb3, + 0xd1, 0x0, 0xd, 0x10, 0x0, 0xb3, 0xd1, 0x0, + 0xd, 0x10, 0x0, 0xb3, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xd1, 0x0, 0x0, 0x0, 0x0, 0xb3, + + /* U+7531 "由" */ + 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x2f, 0xee, 0xef, 0xfe, 0xee, 0xff, + 0x2c, 0x0, 0x1, 0xe0, 0x0, 0xf, 0x2c, 0x0, + 0x1, 0xe0, 0x0, 0xf, 0x2c, 0x0, 0x1, 0xe0, + 0x0, 0xf, 0x2f, 0xee, 0xee, 0xfe, 0xee, 0xef, + 0x2c, 0x0, 0x1, 0xe0, 0x0, 0xf, 0x2c, 0x0, + 0x1, 0xe0, 0x0, 0xf, 0x2c, 0x0, 0x1, 0xe0, + 0x0, 0xf, 0x2f, 0xee, 0xef, 0xfe, 0xee, 0xff, + 0x2c, 0x0, 0x0, 0x0, 0x0, 0xe, + + /* U+7533 "申" */ + 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0x2e, 0xee, 0xee, 0xfe, + 0xee, 0xec, 0x2b, 0x0, 0x1, 0xe0, 0x0, 0x1d, + 0x2b, 0x0, 0x1, 0xe0, 0x0, 0x1d, 0x2f, 0xdd, + 0xdd, 0xfd, 0xdd, 0xdd, 0x2b, 0x0, 0x1, 0xe0, + 0x0, 0x1d, 0x2b, 0x0, 0x1, 0xe0, 0x0, 0x1d, + 0x2f, 0xee, 0xee, 0xfe, 0xee, 0xed, 0x2b, 0x0, + 0x1, 0xe0, 0x0, 0x1c, 0x0, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + + /* U+7535 "电" */ + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0x1e, 0xee, 0xef, + 0xfe, 0xee, 0xe1, 0x1, 0xd0, 0x0, 0xb3, 0x0, + 0xd, 0x10, 0x1d, 0x0, 0xb, 0x30, 0x0, 0xd1, + 0x1, 0xfd, 0xdd, 0xfe, 0xdd, 0xdf, 0x10, 0x1d, + 0x0, 0xb, 0x30, 0x0, 0xd1, 0x1, 0xd0, 0x0, + 0xb3, 0x0, 0xd, 0x10, 0x1f, 0xdd, 0xdf, 0xed, + 0xdd, 0xf1, 0x1, 0xd0, 0x0, 0xb4, 0x0, 0x0, + 0x42, 0x0, 0x0, 0xb, 0x40, 0x0, 0x9, 0x50, + 0x0, 0x0, 0xa6, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x4, 0xef, 0xff, 0xfa, 0x0, + + /* U+7537 "男" */ + 0x0, 0xdd, 0xcc, 0xee, 0xcc, 0xdd, 0x0, 0xd, + 0x10, 0x8, 0x60, 0x1, 0xd0, 0x0, 0xdc, 0xbb, + 0xed, 0xbb, 0xcd, 0x0, 0xd, 0x10, 0x8, 0x60, + 0x1, 0xd0, 0x0, 0xd1, 0x0, 0x86, 0x0, 0x1d, + 0x0, 0xa, 0xdd, 0xdf, 0xdd, 0xdd, 0xa0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, 0xdd, 0xdd, + 0xef, 0xdd, 0xdd, 0xf4, 0x0, 0x0, 0xa, 0x60, + 0x0, 0xc, 0x20, 0x0, 0x7, 0xc0, 0x0, 0x0, + 0xe0, 0x0, 0x4c, 0xb1, 0x0, 0x0, 0x3c, 0x1, + 0xea, 0x40, 0x0, 0x1d, 0xdd, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+753A "町" */ + 0x44, 0x44, 0x40, 0x11, 0x11, 0x11, 0xe, 0x8e, + 0x8d, 0x4c, 0xcc, 0xfd, 0xc2, 0xc0, 0xb0, 0xa2, + 0x0, 0xb, 0x20, 0xc, 0xb, 0xa, 0x20, 0x0, + 0xb2, 0x0, 0xd0, 0xc0, 0xb2, 0x0, 0xb, 0x20, + 0xf, 0xcf, 0xce, 0x20, 0x0, 0xb2, 0x0, 0xc0, + 0xb0, 0xa2, 0x0, 0xb, 0x20, 0xc, 0xb, 0xa, + 0x20, 0x0, 0xb2, 0x0, 0xc0, 0xb0, 0xa2, 0x0, + 0xb, 0x20, 0xf, 0xde, 0xde, 0x20, 0x0, 0xb2, + 0x0, 0xc0, 0x0, 0x0, 0x0, 0xc, 0x20, 0x0, + 0x0, 0x0, 0x4, 0xee, 0xc0, 0x0, + + /* U+753B "画" */ + 0xbe, 0xee, 0xee, 0xee, 0xee, 0xea, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x50, 0xcb, 0xbf, 0xbb, 0xf0, 0x15, + 0xd1, 0xc0, 0xd, 0x0, 0xd0, 0x2c, 0xd1, 0xcb, + 0xbf, 0xbb, 0xf0, 0x2c, 0xd1, 0xc0, 0xd, 0x0, + 0xd0, 0x2c, 0xd1, 0xc0, 0xd, 0x0, 0xd0, 0x2c, + 0xd1, 0xcc, 0xcf, 0xcc, 0xf0, 0x2c, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x2c, 0xdb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xcc, 0x22, 0x22, 0x22, 0x22, 0x22, 0x4c, + + /* U+754C "界" */ + 0x0, 0xdd, 0xcc, 0xfd, 0xcc, 0xdc, 0x0, 0x0, + 0xd1, 0x0, 0xc2, 0x0, 0x2c, 0x0, 0x0, 0xdc, + 0xbb, 0xfc, 0xbb, 0xcc, 0x0, 0x0, 0xd1, 0x0, + 0xc2, 0x0, 0x2c, 0x0, 0x0, 0xdc, 0xbb, 0xfc, + 0xbb, 0xcc, 0x0, 0x0, 0x1, 0x98, 0x12, 0xd9, + 0x10, 0x0, 0x0, 0x1b, 0x80, 0x0, 0x1c, 0xb2, + 0x0, 0x19, 0xd5, 0x93, 0x0, 0x1c, 0x6d, 0xa2, + 0x6, 0x0, 0xc2, 0x0, 0x1d, 0x0, 0x50, 0x0, + 0x1, 0xe0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x2c, + 0x60, 0x0, 0x1d, 0x0, 0x0, 0x2, 0xd5, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+7559 "留" */ + 0x0, 0x3, 0x94, 0x0, 0x0, 0x0, 0x1, 0xbc, + 0x95, 0xd, 0xdf, 0xdd, 0xf0, 0x2c, 0x0, 0x10, + 0x0, 0xc0, 0xe, 0x2, 0xb0, 0x1d, 0x0, 0x49, + 0x0, 0xe0, 0x2b, 0x14, 0xc7, 0xb, 0x30, 0x1c, + 0x7, 0xfd, 0x95, 0xb9, 0x90, 0x69, 0x90, 0x12, + 0x0, 0x3, 0x70, 0x5, 0x50, 0x0, 0x4c, 0xcc, + 0xcc, 0xcc, 0xcc, 0x0, 0x6, 0x90, 0x0, 0xe0, + 0x0, 0xf0, 0x0, 0x6e, 0xbb, 0xbf, 0xbb, 0xbf, + 0x0, 0x6, 0x90, 0x0, 0xe0, 0x0, 0xf0, 0x0, + 0x69, 0x0, 0xe, 0x0, 0xf, 0x0, 0x6, 0xec, + 0xcc, 0xcc, 0xcc, 0xe0, 0x0, + + /* U+756A "番" */ + 0x0, 0x0, 0x0, 0x1, 0x35, 0x74, 0x0, 0x2, + 0xbb, 0xcc, 0xed, 0x97, 0x62, 0x0, 0x0, 0xb, + 0x20, 0x76, 0x2, 0xe0, 0x0, 0x0, 0x6, 0xa0, + 0x76, 0xb, 0x40, 0x0, 0x1c, 0xcd, 0xec, 0xee, + 0xcf, 0xcc, 0xc2, 0x0, 0x0, 0x4d, 0xaa, 0xd4, + 0x0, 0x0, 0x0, 0x7, 0xd2, 0x76, 0x2d, 0x80, + 0x0, 0x6, 0xea, 0x10, 0x65, 0x1, 0x9f, 0x81, + 0x29, 0x8d, 0xaa, 0xdd, 0xaa, 0xca, 0x81, 0x0, + 0x59, 0x0, 0x76, 0x0, 0x68, 0x0, 0x0, 0x5d, + 0xaa, 0xdd, 0xaa, 0xc8, 0x0, 0x0, 0x59, 0x0, + 0x76, 0x0, 0x68, 0x0, 0x0, 0x5e, 0xbb, 0xbb, + 0xbb, 0xd8, 0x0, + + /* U+756B "畫" */ + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x99, 0xbd, 0x99, 0xae, 0x0, 0x9, 0x99, + 0x99, 0xcd, 0x99, 0xaf, 0x94, 0x0, 0x11, 0x11, + 0x6a, 0x11, 0x2e, 0x0, 0x0, 0x58, 0x88, 0xac, + 0x88, 0x87, 0x0, 0x0, 0x99, 0x99, 0xbd, 0x99, + 0x99, 0x40, 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x0, 0x9, 0x99, 0x99, 0x99, 0x99, 0x99, 0x94, + 0x0, 0x6a, 0x88, 0x9a, 0x88, 0x8b, 0x0, 0x0, + 0x7b, 0x88, 0xbd, 0x88, 0x9e, 0x0, 0x0, 0x77, + 0x0, 0x59, 0x0, 0x1e, 0x0, 0x0, 0x38, 0x88, + 0x88, 0x88, 0x87, 0x0, 0xa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa5, + + /* U+7570 "異" */ + 0x0, 0xbc, 0xbb, 0xde, 0xbb, 0xbf, 0x10, 0x0, + 0xb2, 0x0, 0x59, 0x0, 0xd, 0x10, 0x0, 0xbc, + 0xbb, 0xde, 0xbb, 0xbf, 0x10, 0x0, 0xb2, 0x0, + 0x59, 0x0, 0xd, 0x10, 0x0, 0x8b, 0xec, 0xbb, + 0xbf, 0xcb, 0x0, 0x0, 0x0, 0xa3, 0x0, 0xe, + 0x0, 0x0, 0x2, 0xdd, 0xfe, 0xdd, 0xdf, 0xdd, + 0x80, 0x0, 0x0, 0xa3, 0x0, 0xe, 0x0, 0x0, + 0x1, 0x11, 0xb5, 0x11, 0x1f, 0x11, 0x10, 0xb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, 0x0, 0x3, + 0xa9, 0x0, 0x4d, 0x82, 0x0, 0x7, 0xdb, 0x40, + 0x0, 0x0, 0x6d, 0xb1, 0x2, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x30, + + /* U+7576 "當" */ + 0x7, 0x20, 0xc, 0x20, 0x6, 0x50, 0x4, 0xc0, + 0xc, 0x20, 0x1e, 0x10, 0xab, 0xeb, 0xbf, 0xbb, + 0xce, 0xb9, 0xe2, 0x22, 0x22, 0x22, 0x22, 0x3d, + 0xe0, 0xab, 0xbb, 0xbb, 0xb9, 0x1d, 0x40, 0xd0, + 0x0, 0x0, 0x1d, 0x4, 0x0, 0xd7, 0x77, 0x77, + 0x8d, 0x0, 0x0, 0x33, 0x33, 0x33, 0x33, 0x0, + 0xd, 0xbb, 0xbd, 0xcb, 0xbb, 0xd0, 0xc, 0x0, + 0xb, 0x20, 0x0, 0xc0, 0xe, 0xaa, 0xae, 0xba, + 0xaa, 0xe0, 0xc, 0x0, 0xb, 0x20, 0x0, 0xc0, + 0xe, 0xbb, 0xbe, 0xcb, 0xbb, 0xe0, + + /* U+75B2 "疲" */ + 0x0, 0x0, 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, + 0x1a, 0xaa, 0xab, 0xea, 0xaa, 0xa4, 0x0, 0x2c, + 0x22, 0x22, 0x43, 0x22, 0x21, 0xc, 0x2b, 0x0, + 0x0, 0xa2, 0x0, 0x0, 0x9, 0x6b, 0xd, 0xdd, + 0xfd, 0xdd, 0xe1, 0x4, 0x7b, 0xd, 0x0, 0xa2, + 0x3, 0xb0, 0x0, 0x2a, 0xe, 0x0, 0xa2, 0x3, + 0x30, 0x1, 0x98, 0xf, 0xed, 0xcc, 0xcf, 0x10, + 0x2d, 0xa7, 0x1c, 0x39, 0x0, 0x69, 0x0, 0x0, + 0x85, 0x39, 0xb, 0x42, 0xd1, 0x0, 0x0, 0xc1, + 0x76, 0x1, 0xdd, 0x30, 0x0, 0x5, 0xb0, 0xd1, + 0x19, 0xcc, 0xa3, 0x0, 0xb, 0x26, 0x77, 0xd6, + 0x0, 0x4b, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+75C5 "病" */ + 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, 0xf, + 0xdd, 0xdd, 0xdd, 0xdd, 0xd7, 0x9, 0xe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x5e, 0x6d, 0xdd, + 0xfd, 0xdd, 0xd5, 0x2, 0x6e, 0x0, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0xe, 0x1d, 0xdd, 0xfd, 0xdd, + 0xd0, 0x2, 0xad, 0x1a, 0x0, 0xe0, 0x0, 0xe0, + 0x2d, 0x8b, 0x1a, 0x3, 0xea, 0x0, 0xe0, 0x0, + 0x78, 0x1a, 0x1c, 0x26, 0xb0, 0xe0, 0x0, 0xc3, + 0x1b, 0xb4, 0x0, 0x75, 0xe0, 0x6, 0xc0, 0x1a, + 0x0, 0x0, 0x0, 0xe0, 0xa, 0x20, 0x1a, 0x0, + 0x0, 0xad, 0xa0, + + /* U+75DB "痛" */ + 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x55, 0x5b, 0xa5, 0x55, 0x52, 0x0, 0x2d, + 0x77, 0x77, 0x77, 0x77, 0x73, 0x1c, 0x2b, 0xa, + 0xbb, 0xbb, 0xbb, 0x30, 0x9, 0x6b, 0x0, 0x53, + 0x5, 0xc6, 0x0, 0x3, 0x7b, 0x0, 0x28, 0xed, + 0x10, 0x0, 0x0, 0x2b, 0x3d, 0xbb, 0xec, 0xcb, + 0xd0, 0x2, 0xaa, 0x39, 0x0, 0xd0, 0x0, 0xd0, + 0x3c, 0x88, 0x3e, 0xbb, 0xfb, 0xbb, 0xd0, 0x0, + 0x95, 0x39, 0x0, 0xd0, 0x0, 0xd0, 0x0, 0xd1, + 0x3e, 0xbb, 0xfb, 0xbb, 0xd0, 0x7, 0xa0, 0x39, + 0x0, 0xd0, 0x0, 0xd0, 0xa, 0x10, 0x39, 0x0, + 0xc0, 0x7b, 0xa0, + + /* U+767A "発" */ + 0x0, 0x0, 0x0, 0x6, 0x0, 0x40, 0x0, 0x6, + 0xdd, 0xdf, 0x38, 0x58, 0xa0, 0x0, 0x3, 0x50, + 0x5a, 0x0, 0xe8, 0x4, 0x80, 0x0, 0xa9, 0xd1, + 0x0, 0x4c, 0x79, 0x0, 0x0, 0x5d, 0x20, 0x0, + 0x5, 0xe2, 0x0, 0x2a, 0xbf, 0xee, 0xee, 0xee, + 0xdd, 0x80, 0x54, 0x0, 0x86, 0x0, 0xf0, 0x0, + 0x70, 0x0, 0x0, 0x86, 0x0, 0xf0, 0x0, 0x0, + 0xb, 0xdd, 0xee, 0xdd, 0xfd, 0xdd, 0x40, 0x0, + 0x0, 0xc3, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x4, + 0xd0, 0x0, 0xf0, 0x2, 0x50, 0x0, 0x5e, 0x30, + 0x0, 0xf0, 0x4, 0x90, 0xb, 0xa2, 0x0, 0x0, + 0xbe, 0xde, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+767C "發" */ + 0x0, 0x0, 0x0, 0x6, 0x0, 0x31, 0x0, 0x0, + 0xcc, 0xcf, 0x56, 0x76, 0xa1, 0x0, 0x1, 0xa2, + 0x6a, 0x0, 0xab, 0x6, 0xa0, 0x0, 0x3e, 0x90, + 0x0, 0x7, 0xd9, 0x0, 0x19, 0xff, 0xb9, 0x9, + 0xbb, 0xdc, 0xb3, 0x26, 0x0, 0xd, 0xc, 0x0, + 0xc0, 0x31, 0x0, 0x23, 0x3d, 0x1c, 0x0, 0xc0, + 0x0, 0x0, 0xe9, 0x98, 0xb4, 0x0, 0x7a, 0xa0, + 0x1, 0xb0, 0x0, 0x47, 0x77, 0x77, 0x0, 0x3, + 0xdb, 0xcb, 0x38, 0x33, 0x8a, 0x0, 0x0, 0x0, + 0x1b, 0x8, 0xb5, 0xd1, 0x0, 0x0, 0x0, 0x59, + 0x2, 0xbe, 0x90, 0x0, 0x0, 0x9c, 0xd3, 0xbc, + 0x50, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+767D "白" */ + 0x0, 0x0, 0x62, 0x0, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x33, 0x38, 0xc3, 0x33, 0x33, 0xeb, + 0xbb, 0xbb, 0xbb, 0xbf, 0xe0, 0x0, 0x0, 0x0, + 0xf, 0xe0, 0x0, 0x0, 0x0, 0xf, 0xe0, 0x0, + 0x0, 0x0, 0xf, 0xee, 0xee, 0xee, 0xee, 0xef, + 0xe0, 0x0, 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, + 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0xf, 0xee, + 0xee, 0xee, 0xee, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xe, + + /* U+767E "百" */ + 0x1e, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe1, 0x0, + 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xee, + 0xfe, 0xee, 0xe9, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, + 0x4a, 0x0, 0x0, 0x78, 0x11, 0x11, 0x11, 0x5a, + 0x0, 0x0, 0x7e, 0xcc, 0xcc, 0xcc, 0xda, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x7f, + 0xee, 0xee, 0xee, 0xea, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x0, 0x4a, 0x0, + + /* U+7684 "的" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, + 0x0, 0xd, 0x10, 0x0, 0x1, 0xd0, 0x0, 0x2c, + 0x0, 0x0, 0x9c, 0xeb, 0xa0, 0x8e, 0xbb, 0xb9, + 0xd1, 0x11, 0xd0, 0xe3, 0x11, 0x3c, 0xd0, 0x0, + 0xd8, 0x80, 0x0, 0x1c, 0xd0, 0x0, 0xd5, 0x25, + 0x0, 0x2b, 0xdc, 0xcc, 0xe0, 0xd, 0x30, 0x3b, + 0xd0, 0x0, 0xd0, 0x3, 0xd0, 0x3a, 0xd0, 0x0, + 0xd0, 0x0, 0xa6, 0x49, 0xd0, 0x0, 0xd0, 0x0, + 0x10, 0x68, 0xd0, 0x0, 0xd0, 0x0, 0x0, 0x86, + 0xdd, 0xdd, 0xc0, 0x0, 0x0, 0xb3, 0xd0, 0x0, + 0x0, 0x6, 0xcd, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, + + /* U+7686 "皆" */ + 0xd, 0x20, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x20, + 0x0, 0xd0, 0x5, 0xa0, 0xd, 0xdd, 0xd7, 0xd9, + 0xda, 0x40, 0xd, 0x20, 0x0, 0xd4, 0x0, 0x0, + 0xe, 0x34, 0x76, 0xd1, 0x0, 0x1c, 0x4f, 0xc8, + 0x55, 0x9e, 0xdd, 0xe7, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0x0, 0x7, 0xcc, 0xee, 0xcc, 0xcc, 0x10, + 0x8, 0x50, 0x0, 0x0, 0xd, 0x20, 0x8, 0xdb, + 0xbb, 0xbb, 0xbf, 0x20, 0x8, 0x60, 0x0, 0x0, + 0xd, 0x20, 0x8, 0x50, 0x0, 0x0, 0xd, 0x20, + 0x8, 0xec, 0xcc, 0xcc, 0xcf, 0x20, + + /* U+76BF "皿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xce, 0xef, 0xee, 0xff, 0xef, 0x50, 0x0, 0xc2, + 0xb, 0x20, 0xa3, 0x9, 0x50, 0x0, 0xc2, 0xb, + 0x20, 0xa3, 0x9, 0x50, 0x0, 0xc2, 0xb, 0x20, + 0xa3, 0x9, 0x50, 0x0, 0xc2, 0xb, 0x20, 0xa3, + 0x9, 0x50, 0x0, 0xc2, 0xb, 0x20, 0xa3, 0x9, + 0x50, 0x0, 0xc2, 0xb, 0x20, 0xa3, 0x9, 0x50, + 0x0, 0xc2, 0xb, 0x20, 0xa3, 0x9, 0x50, 0x0, + 0xc2, 0xb, 0x20, 0xa3, 0x9, 0x50, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, + + /* U+76D7 "盗" */ + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x7, + 0xb3, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0x34, 0xec, 0xee, 0xcc, 0xf2, 0x0, 0x0, 0x1d, + 0x20, 0xa7, 0x2, 0xd0, 0x0, 0x0, 0x34, 0x0, + 0xeb, 0x4, 0x50, 0x0, 0x3c, 0x70, 0xa, 0x86, + 0x70, 0x0, 0x9, 0xc3, 0x4, 0xc9, 0x0, 0xaa, + 0x30, 0x5, 0x0, 0x8b, 0x40, 0x0, 0x5, 0xb4, + 0x0, 0x6d, 0xcd, 0xdc, 0xdc, 0xce, 0x0, 0x0, + 0x76, 0xa, 0x30, 0xc1, 0xe, 0x0, 0x0, 0x76, + 0xa, 0x30, 0xc1, 0xe, 0x0, 0x0, 0x76, 0xa, + 0x30, 0xc1, 0xe, 0x0, 0x1d, 0xee, 0xdf, 0xed, + 0xfe, 0xdf, 0xd8, + + /* U+76EE "目" */ + 0xde, 0xee, 0xee, 0xee, 0xec, 0xd1, 0x0, 0x0, + 0x0, 0x2c, 0xd1, 0x0, 0x0, 0x0, 0x2c, 0xdc, + 0xbb, 0xbb, 0xbb, 0xcc, 0xd3, 0x22, 0x22, 0x22, + 0x4c, 0xd1, 0x0, 0x0, 0x0, 0x2c, 0xd1, 0x0, + 0x0, 0x0, 0x2c, 0xde, 0xee, 0xee, 0xee, 0xec, + 0xd1, 0x0, 0x0, 0x0, 0x2c, 0xd1, 0x0, 0x0, + 0x0, 0x2c, 0xde, 0xee, 0xee, 0xee, 0xec, 0xd1, + 0x0, 0x0, 0x0, 0x2c, + + /* U+76F4 "直" */ + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x7, + 0xbb, 0xbb, 0xdd, 0xbb, 0xbb, 0xb1, 0x1, 0x22, + 0x22, 0xb6, 0x22, 0x22, 0x20, 0x0, 0xa, 0xaa, + 0xeb, 0xaa, 0xa6, 0x0, 0x0, 0x1d, 0x22, 0x22, + 0x22, 0x6a, 0x0, 0x0, 0x1e, 0x99, 0x99, 0x99, + 0xba, 0x0, 0x0, 0x1d, 0x22, 0x22, 0x22, 0x6a, + 0x0, 0x0, 0x1e, 0xaa, 0xaa, 0xaa, 0xca, 0x0, + 0x0, 0x1d, 0x11, 0x11, 0x11, 0x5a, 0x0, 0x0, + 0x1e, 0x99, 0x99, 0x99, 0xba, 0x0, 0x0, 0x1d, + 0x11, 0x11, 0x11, 0x6a, 0x0, 0x1, 0x2d, 0x11, + 0x11, 0x11, 0x6a, 0x10, 0x1c, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc7, + + /* U+76F8 "相" */ + 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x5, 0xfe, 0xee, 0xee, 0x0, 0xe, 0x0, + 0x58, 0x0, 0x0, 0xe3, 0xdd, 0xfd, 0xd5, 0x80, + 0x0, 0xe, 0x0, 0x3f, 0x0, 0x5e, 0xcc, 0xcc, + 0xe0, 0x9, 0xf2, 0x5, 0x91, 0x11, 0x1e, 0x0, + 0xce, 0xc0, 0x58, 0x0, 0x0, 0xe0, 0x57, 0xe5, + 0xa5, 0x80, 0x0, 0xe, 0xc, 0x1e, 0x7, 0x5e, + 0xdd, 0xdd, 0xe6, 0x70, 0xe0, 0x5, 0x80, 0x0, + 0xe, 0x10, 0xe, 0x0, 0x58, 0x0, 0x0, 0xe0, + 0x0, 0xe0, 0x5, 0xfd, 0xdd, 0xde, 0x0, 0xe, + 0x0, 0x58, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+770B "看" */ + 0x0, 0x0, 0x0, 0x1, 0x34, 0x77, 0x0, 0x2, + 0xcc, 0xcd, 0xea, 0x87, 0x52, 0x0, 0x0, 0x0, + 0x6, 0x90, 0x0, 0x0, 0x0, 0x1, 0xbb, 0xbf, + 0xcb, 0xbb, 0xbb, 0x40, 0x4, 0x44, 0x6e, 0x44, + 0x44, 0x44, 0x40, 0x16, 0x66, 0xf7, 0x66, 0x66, + 0x66, 0x61, 0x0, 0x9, 0xeb, 0xbb, 0xbb, 0xb8, + 0x0, 0x0, 0x6f, 0x80, 0x0, 0x0, 0x2c, 0x0, + 0x9, 0xb6, 0xda, 0xaa, 0xaa, 0xbc, 0x0, 0x39, + 0x5, 0x80, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x5, + 0xda, 0xaa, 0xaa, 0xbc, 0x0, 0x0, 0x5, 0x80, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x5, 0xec, 0xcc, + 0xcc, 0xcc, 0x0, + + /* U+771F "真" */ + 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x6, + 0x77, 0x77, 0xcb, 0x77, 0x77, 0x60, 0x4, 0x44, + 0x44, 0xc7, 0x44, 0x44, 0x40, 0x0, 0x2b, 0xaa, + 0xdb, 0xaa, 0xb2, 0x0, 0x0, 0x2c, 0x11, 0x11, + 0x11, 0xb3, 0x0, 0x0, 0x2d, 0x88, 0x88, 0x88, + 0xd3, 0x0, 0x0, 0x2e, 0x99, 0x99, 0x99, 0xe3, + 0x0, 0x0, 0x2c, 0x22, 0x22, 0x22, 0xc3, 0x0, + 0x0, 0x2d, 0x66, 0x66, 0x66, 0xd3, 0x0, 0x29, + 0xbe, 0x99, 0x99, 0x99, 0xeb, 0x92, 0x2, 0x22, + 0x74, 0x22, 0x57, 0x32, 0x20, 0x0, 0x5c, 0xa2, + 0x0, 0x28, 0xd9, 0x20, 0xa, 0x82, 0x0, 0x0, + 0x0, 0x5, 0xa0, + + /* U+7720 "眠" */ + 0xfd, 0xde, 0xf, 0xdd, 0xdd, 0xde, 0xe, 0x0, + 0xe0, 0xe0, 0x0, 0x0, 0xe0, 0xe0, 0xe, 0xe, + 0x22, 0x22, 0x2e, 0xf, 0xdd, 0xe0, 0xfb, 0xbf, + 0xbb, 0xa0, 0xe0, 0xe, 0xe, 0x0, 0xc1, 0x0, + 0xe, 0x0, 0xe0, 0xe0, 0xb, 0x30, 0x0, 0xfd, + 0xde, 0xf, 0xdd, 0xee, 0xdd, 0x5e, 0x0, 0xe0, + 0xe0, 0x7, 0x70, 0x0, 0xe0, 0xe, 0xe, 0x0, + 0x4a, 0x0, 0xf, 0xdd, 0xc0, 0xe0, 0x0, 0xe0, + 0x5, 0xc0, 0x0, 0x1e, 0x7a, 0x78, 0x93, 0x70, + 0x0, 0x7, 0xd8, 0x30, 0xb, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+773E "眾" */ + 0xb, 0xdd, 0xef, 0xdd, 0xfd, 0xdf, 0x10, 0xb2, + 0x3, 0xa0, 0xd, 0x0, 0xd1, 0xb, 0x42, 0x5b, + 0x22, 0xe2, 0x2d, 0x10, 0x8a, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa0, 0x0, 0x1, 0x11, 0x23, 0x45, 0x78, + 0x0, 0x9d, 0xcc, 0xbd, 0xb8, 0x65, 0x20, 0x0, + 0x7, 0x20, 0x85, 0x1, 0xa0, 0x0, 0x1, 0xe0, + 0x8, 0x50, 0x68, 0x0, 0x0, 0x9d, 0x90, 0x85, + 0xc, 0xc1, 0x0, 0x6c, 0x6, 0xb8, 0x57, 0x84, + 0xc1, 0x7a, 0x10, 0x1, 0x8b, 0xa0, 0x4, 0x90, + 0x0, 0x0, 0x8, 0x50, 0x0, 0x0, + + /* U+7740 "着" */ + 0x0, 0x3, 0x60, 0x0, 0x5, 0x30, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x2d, 0x10, 0x0, 0x5, 0xcc, + 0xcc, 0xfc, 0xcc, 0xcc, 0x50, 0x0, 0x0, 0x4, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0xaf, 0xba, + 0xaa, 0xa8, 0x0, 0x6, 0x66, 0x7e, 0x66, 0x66, + 0x66, 0x60, 0x5, 0x56, 0xf6, 0x55, 0x55, 0x55, + 0x50, 0x0, 0xb, 0xeb, 0xbb, 0xbb, 0xc9, 0x0, + 0x0, 0x9c, 0xc3, 0x33, 0x33, 0x6b, 0x0, 0x1b, + 0x83, 0xd6, 0x66, 0x66, 0x8b, 0x0, 0x37, 0x3, + 0xe9, 0x99, 0x99, 0xbb, 0x0, 0x0, 0x3, 0xb0, + 0x0, 0x0, 0x3b, 0x0, 0x0, 0x3, 0xeb, 0xbb, + 0xbb, 0xcb, 0x0, + + /* U+77E5 "知" */ + 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x38, 0x88, 0x86, 0x8, 0xfe, 0xee, + 0x96, 0xa5, 0x57, 0xc0, 0xd1, 0x86, 0x0, 0x68, + 0x0, 0x2c, 0x78, 0x8, 0x60, 0x6, 0x80, 0x2, + 0xc0, 0x10, 0x86, 0x0, 0x68, 0x0, 0x2c, 0x7e, + 0xef, 0xee, 0xe8, 0x80, 0x2, 0xc0, 0x0, 0xb3, + 0x0, 0x68, 0x0, 0x2c, 0x0, 0xe, 0xa0, 0x6, + 0x80, 0x2, 0xc0, 0x3, 0xb9, 0x80, 0x68, 0x0, + 0x2c, 0x0, 0xb4, 0xc, 0x66, 0x91, 0x14, 0xc0, + 0x7c, 0x0, 0x19, 0x6e, 0xcc, 0xdc, 0x5d, 0x10, + 0x0, 0x6, 0x80, 0x2, 0xa0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+77ED "短" */ + 0x1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x90, 0x0, 0xad, 0xdd, 0xdd, 0xd6, 0x8, 0xdc, + 0xb8, 0x0, 0x0, 0x0, 0x0, 0xd, 0xe, 0x0, + 0x3d, 0xdd, 0xdd, 0xc0, 0x39, 0xe, 0x0, 0x49, + 0x0, 0x0, 0xe0, 0x2, 0x1e, 0x11, 0x49, 0x0, + 0x0, 0xe0, 0x5d, 0xdf, 0xdc, 0x49, 0x0, 0x0, + 0xe0, 0x0, 0x2d, 0x0, 0x3d, 0xdd, 0xdd, 0xc0, + 0x0, 0x5f, 0x20, 0x5, 0x0, 0x4, 0x30, 0x0, + 0x98, 0xc0, 0x8, 0x50, 0xd, 0x20, 0x1, 0xd0, + 0x79, 0x2, 0xb0, 0x2c, 0x0, 0xa, 0x60, 0x3, + 0x0, 0x80, 0x95, 0x0, 0x3a, 0x0, 0x4, 0xdd, + 0xdd, 0xdd, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+77F3 "石" */ + 0xd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0xee, 0xee, + 0xef, 0x30, 0x1, 0xed, 0x50, 0x0, 0x0, 0xb, + 0x30, 0x1d, 0x58, 0x50, 0x0, 0x0, 0xb, 0x30, + 0x46, 0x8, 0x50, 0x0, 0x0, 0xb, 0x30, 0x0, + 0x8, 0x50, 0x0, 0x0, 0xb, 0x30, 0x0, 0x8, + 0xfe, 0xee, 0xee, 0xef, 0x30, 0x0, 0x8, 0x50, + 0x0, 0x0, 0xb, 0x30, + + /* U+7802 "砂" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1d, + 0xef, 0xdc, 0x0, 0xe, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x4, 0xe, 0x6, 0x0, 0x0, 0xb2, 0x0, + 0x1c, 0xe, 0x9, 0x50, 0x0, 0xd0, 0x0, 0x49, + 0xe, 0x1, 0xd0, 0x8, 0xfd, 0xd7, 0x94, 0xe, + 0x0, 0xb3, 0x2e, 0xc0, 0x48, 0xc0, 0xe, 0x0, + 0x21, 0x67, 0xc0, 0x48, 0x0, 0xe, 0x6, 0x80, + 0x1, 0xc0, 0x48, 0x0, 0x9, 0xd, 0x10, 0x1, + 0xc0, 0x48, 0x0, 0x0, 0xc7, 0x0, 0x1, 0xfb, + 0xd8, 0x0, 0x3c, 0x80, 0x0, 0x1, 0xc1, 0x11, + 0x5a, 0xd4, 0x0, 0x0, 0x0, 0x30, 0x5, 0xa4, + 0x0, 0x0, 0x0, + + /* U+7814 "研" */ + 0x1d, 0xef, 0xdb, 0x5e, 0xfe, 0xef, 0xe4, 0x0, + 0x77, 0x0, 0x3, 0xa0, 0xe, 0x0, 0x0, 0xb2, + 0x0, 0x3, 0xa0, 0xe, 0x0, 0x0, 0xd0, 0x0, + 0x3, 0xa0, 0xe, 0x0, 0x5, 0xea, 0xa6, 0x3, + 0xa0, 0xe, 0x0, 0xd, 0xc2, 0x68, 0xbe, 0xfe, + 0xef, 0xe8, 0x3c, 0xb0, 0x48, 0x4, 0x90, 0xe, + 0x0, 0x2, 0xb0, 0x48, 0x6, 0x70, 0xe, 0x0, + 0x1, 0xb0, 0x48, 0x8, 0x50, 0xe, 0x0, 0x1, + 0xeb, 0xd8, 0xd, 0x20, 0xe, 0x0, 0x1, 0xb1, + 0x10, 0x5b, 0x0, 0xe, 0x0, 0x0, 0x30, 0x0, + 0xb2, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+7834 "破" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x1d, + 0xef, 0xd8, 0x0, 0xd, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x8c, 0xcf, 0xcc, 0xc2, 0x0, 0xb2, 0x0, + 0xa3, 0x1d, 0x11, 0xd0, 0x0, 0xe0, 0x0, 0xa2, + 0xd, 0x1, 0xb0, 0x6, 0xd8, 0x82, 0xb2, 0xd, + 0x1, 0x30, 0xe, 0xd6, 0xc3, 0xbf, 0xcc, 0xcd, + 0x90, 0x4d, 0xa0, 0x93, 0xc9, 0x50, 0x9, 0x30, + 0x3, 0xa0, 0x93, 0xd1, 0xc0, 0x3b, 0x0, 0x2, + 0xa0, 0x94, 0xd0, 0x4b, 0xc1, 0x0, 0x2, 0xeb, + 0xe7, 0xa0, 0x2e, 0xc0, 0x0, 0x2, 0xb1, 0x19, + 0x54, 0xd4, 0x6d, 0x30, 0x0, 0x40, 0xb, 0x4b, + 0x20, 0x3, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+78BA "確" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x8, + 0x88, 0x84, 0x0, 0x1e, 0x10, 0x0, 0x5, 0xaa, + 0x54, 0xfb, 0xed, 0xbb, 0xf0, 0x0, 0xa4, 0x1, + 0xc1, 0xd4, 0x50, 0xd0, 0x0, 0xe0, 0x0, 0x3a, + 0x92, 0xd1, 0x50, 0x2, 0xe7, 0x72, 0x9f, 0xbb, + 0xfb, 0xa0, 0xa, 0xd4, 0xbb, 0xbe, 0x0, 0xd0, + 0x0, 0x2f, 0xb0, 0x94, 0xf, 0xbb, 0xfb, 0xb0, + 0x26, 0xb0, 0x93, 0xe, 0x0, 0xd0, 0x0, 0x0, + 0xb0, 0x93, 0xf, 0xbb, 0xfb, 0xb0, 0x0, 0xea, + 0xd3, 0xe, 0x0, 0xd0, 0x0, 0x0, 0xd5, 0x51, + 0xe, 0x11, 0xe1, 0x11, 0x0, 0x70, 0x0, 0xf, + 0xaa, 0xaa, 0xa7, + + /* U+793A "示" */ + 0x0, 0xce, 0xee, 0xee, 0xee, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xdd, 0xef, + 0xdd, 0xdd, 0xd2, 0x0, 0x0, 0x0, 0x78, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x10, 0x78, 0x2, 0x70, + 0x0, 0x0, 0x5c, 0x0, 0x78, 0x0, 0xc5, 0x0, + 0x1, 0xd3, 0x0, 0x78, 0x0, 0x2e, 0x10, 0xc, + 0x70, 0x0, 0x78, 0x0, 0x8, 0x90, 0x27, 0x0, + 0x0, 0x88, 0x0, 0x1, 0x80, 0x0, 0x0, 0xce, + 0xe4, 0x0, 0x0, 0x0, + + /* U+793C "礼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0xd, + 0x30, 0x1, 0xc0, 0x0, 0x0, 0x1, 0x16, 0x61, + 0x1, 0xc0, 0x0, 0x0, 0xb, 0xcc, 0xdd, 0x1, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x1, 0xc0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x1, 0xc0, 0x0, + 0x0, 0x0, 0x3f, 0x70, 0x1, 0xc0, 0x0, 0x0, + 0x5, 0xdf, 0xb7, 0x1, 0xc0, 0x0, 0x0, 0x4c, + 0x1e, 0xc, 0x51, 0xc0, 0x0, 0x0, 0x0, 0xe, + 0x1, 0x1, 0xc0, 0x0, 0x30, 0x0, 0xe, 0x0, + 0x1, 0xc0, 0x0, 0xb2, 0x0, 0xe, 0x0, 0x1, + 0xd0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0x0, 0xce, + 0xde, 0x90, + + /* U+793E "社" */ + 0x0, 0x57, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, + 0xd, 0x30, 0x0, 0x8, 0x60, 0x0, 0x1, 0x16, + 0x51, 0x0, 0x8, 0x60, 0x0, 0x2c, 0xcc, 0xde, + 0x0, 0x8, 0x60, 0x0, 0x0, 0x0, 0xb5, 0x1, + 0x18, 0x71, 0x10, 0x0, 0x8, 0xa0, 0x8c, 0xce, + 0xec, 0xc6, 0x0, 0x6f, 0x70, 0x0, 0x8, 0x60, + 0x0, 0x9, 0xde, 0xb8, 0x0, 0x8, 0x60, 0x0, + 0x6a, 0xe, 0xa, 0x10, 0x8, 0x60, 0x0, 0x0, + 0xe, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0xe, 0x0, + 0x22, 0x29, 0x82, 0x22, 0x0, 0xe, 0x3, 0xbb, + 0xbb, 0xbb, 0xb9, + + /* U+7956 "祖" */ + 0x0, 0x46, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x30, 0x2f, 0xee, 0xef, 0x20, 0x6, 0x69, + 0x85, 0x2b, 0x0, 0xb, 0x20, 0x6, 0x66, 0xab, + 0x2b, 0x0, 0xb, 0x20, 0x0, 0x1, 0xe2, 0x2e, + 0xbb, 0xbe, 0x20, 0x0, 0xb, 0x60, 0x2c, 0x22, + 0x2c, 0x20, 0x0, 0x9f, 0xb0, 0x2b, 0x0, 0xb, + 0x20, 0x1b, 0x9e, 0x8b, 0x2b, 0x0, 0xb, 0x20, + 0x37, 0xe, 0x7, 0x2f, 0xdd, 0xdf, 0x20, 0x0, + 0xe, 0x0, 0x2b, 0x0, 0xb, 0x20, 0x0, 0xe, + 0x0, 0x2b, 0x0, 0xb, 0x20, 0x0, 0xe, 0x0, + 0x2c, 0x0, 0xc, 0x30, 0x0, 0xe, 0xd, 0xdd, + 0xdd, 0xdd, 0xd5, + + /* U+795D "祝" */ + 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x89, 0x99, 0x99, 0x70, 0x1, 0x18, + 0x40, 0xe4, 0x44, 0x45, 0xc0, 0x1c, 0xcc, 0xe6, + 0xe0, 0x0, 0x1, 0xc0, 0x0, 0x1, 0xd0, 0xe0, + 0x0, 0x1, 0xc0, 0x0, 0xb, 0x60, 0xe0, 0x0, + 0x1, 0xc0, 0x0, 0x7f, 0x50, 0xce, 0xed, 0xfd, + 0xa0, 0x9, 0xde, 0xc5, 0x7, 0x70, 0xe0, 0x0, + 0x2b, 0xe, 0x19, 0x9, 0x50, 0xe0, 0x0, 0x0, + 0xe, 0x0, 0xc, 0x20, 0xe0, 0x0, 0x0, 0xe, + 0x0, 0x3d, 0x0, 0xe0, 0x15, 0x0, 0xe, 0x2, + 0xd3, 0x0, 0xe0, 0x39, 0x0, 0xe, 0x2d, 0x40, + 0x0, 0xbc, 0xd4, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+795E "神" */ + 0x0, 0x47, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0xe0, 0x0, 0x1, 0x16, 0x40, + 0x44, 0x4f, 0x44, 0x40, 0xcc, 0xce, 0x6d, 0x99, + 0xf9, 0x9f, 0x0, 0x1, 0xb0, 0xd0, 0xe, 0x0, + 0xe0, 0x0, 0xa3, 0xd, 0xcc, 0xfc, 0xcf, 0x0, + 0x9f, 0x90, 0xd0, 0xe, 0x0, 0xe1, 0xb9, 0xc8, + 0x8d, 0x0, 0xe0, 0xe, 0x6, 0xc, 0x3, 0xdd, + 0xdf, 0xdd, 0xf0, 0x0, 0xc0, 0xc, 0x0, 0xe0, + 0xb, 0x0, 0xc, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+796D "祭" */ + 0x0, 0x8, 0x30, 0x6, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xcc, 0xba, 0xdc, 0xcd, 0x50, 0x1, 0xc2, + 0x4, 0x94, 0xa0, 0x2e, 0x10, 0xc, 0x48, 0x8c, + 0x30, 0xd2, 0xc5, 0x0, 0x4, 0x40, 0xb9, 0x0, + 0x4e, 0x80, 0x0, 0x0, 0xab, 0xd1, 0x0, 0xa, + 0xa0, 0x0, 0x1, 0xab, 0x9d, 0xdd, 0xda, 0x9c, + 0x30, 0x3d, 0x60, 0x0, 0x0, 0x0, 0x4, 0xc4, + 0x0, 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0x30, 0x0, + 0x1, 0x60, 0x68, 0x5, 0x0, 0x0, 0x0, 0x3d, + 0x40, 0x68, 0x6, 0xc2, 0x0, 0x7, 0xd2, 0x0, + 0x78, 0x0, 0x4d, 0x30, 0x3, 0x0, 0x1d, 0xe5, + 0x0, 0x2, 0x20, + + /* U+7981 "禁" */ + 0x0, 0x8, 0x50, 0x0, 0x7, 0x60, 0x0, 0x1, + 0x19, 0x61, 0x1, 0x18, 0x71, 0x10, 0xb, 0xbf, + 0xdb, 0x3b, 0xbf, 0xfb, 0xa0, 0x0, 0x8e, 0xc6, + 0x0, 0x9d, 0xd6, 0x0, 0x8, 0x99, 0x56, 0x4a, + 0x77, 0x69, 0x80, 0x26, 0x7, 0x40, 0x44, 0x6, + 0x50, 0x61, 0x0, 0x49, 0x99, 0x99, 0x99, 0x96, + 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x0, + 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0xa, + 0xaa, 0xaa, 0xcd, 0xaa, 0xaa, 0xa1, 0x0, 0x1b, + 0x10, 0x68, 0x5, 0x80, 0x0, 0x3, 0xc5, 0x0, + 0x68, 0x0, 0x6c, 0x20, 0x9, 0x20, 0x6c, 0xd5, + 0x0, 0x3, 0x70, + + /* U+79C0 "秀" */ + 0x0, 0x0, 0x0, 0x2, 0x46, 0x93, 0x0, 0x3, + 0xcc, 0xcd, 0xec, 0x86, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x76, 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xdd, + 0xee, 0xdd, 0xdd, 0xd0, 0x0, 0x0, 0x4d, 0xa9, + 0xc4, 0x0, 0x0, 0x0, 0x7, 0xd2, 0x76, 0x1c, + 0x80, 0x0, 0x5, 0xd9, 0x10, 0x76, 0x0, 0x8d, + 0x70, 0x4b, 0x6b, 0xbb, 0xbb, 0xb4, 0x1, 0x91, + 0x0, 0x2, 0x6b, 0x22, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0xcd, 0xdf, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x4e, 0x40, + 0x0, 0x0, 0x4b, 0x0, 0xb, 0xb3, 0x0, 0x0, + 0xcd, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+79C1 "私" */ + 0x0, 0x0, 0x27, 0x10, 0x5, 0x0, 0x0, 0x8, + 0xbe, 0xc6, 0x10, 0x1e, 0x0, 0x0, 0x3, 0x19, + 0x50, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x8, 0x50, + 0x0, 0x87, 0x0, 0x0, 0x1d, 0xdf, 0xed, 0x90, + 0xc3, 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, 0xf0, + 0x0, 0x0, 0x0, 0x7e, 0xb9, 0x4, 0xb0, 0xa3, + 0x0, 0x1, 0xc9, 0x5a, 0x59, 0x60, 0x5a, 0x0, + 0xa, 0x58, 0x51, 0x1e, 0x20, 0xe, 0x10, 0x5a, + 0x8, 0x50, 0x3c, 0x0, 0x8, 0x80, 0x10, 0x8, + 0x50, 0xa9, 0x46, 0x9c, 0xe0, 0x0, 0x8, 0x50, + 0xfd, 0xa7, 0x52, 0xd3, 0x0, 0x8, 0x50, 0x0, + 0x0, 0x0, 0x42, + + /* U+79CB "秋" */ + 0x0, 0x15, 0xa6, 0x0, 0xd, 0x0, 0x0, 0x3d, + 0xbf, 0x40, 0x0, 0xd, 0x0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x18, 0x1c, 0x1, 0x90, 0x6e, 0xef, 0xee, 0x58, + 0x2b, 0x7, 0x70, 0x0, 0x5f, 0x20, 0x95, 0x4c, + 0xd, 0x10, 0x0, 0xcf, 0xb1, 0xd0, 0x6f, 0x49, + 0x0, 0x5, 0x8e, 0x57, 0x0, 0x8f, 0x20, 0x0, + 0xd, 0x1e, 0x0, 0x0, 0xe6, 0x80, 0x0, 0x96, + 0xe, 0x0, 0x5, 0xc0, 0xc0, 0x0, 0x20, 0xe, + 0x0, 0xc, 0x40, 0x78, 0x0, 0x0, 0xe, 0x0, + 0xb8, 0x0, 0xc, 0x70, 0x0, 0xe, 0x8, 0x70, + 0x0, 0x1, 0xb2, + + /* U+79CD "种" */ + 0x0, 0x3, 0x77, 0x0, 0xc, 0x20, 0x0, 0xb, + 0xdf, 0x71, 0x0, 0xc, 0x20, 0x0, 0x0, 0xd, + 0x10, 0x0, 0xc, 0x20, 0x0, 0x0, 0xd, 0x10, + 0x9e, 0xef, 0xee, 0xe1, 0x1d, 0xdf, 0xec, 0x94, + 0xd, 0x30, 0xd1, 0x0, 0x3f, 0x30, 0x93, 0xc, + 0x20, 0xc1, 0x0, 0xaf, 0xc0, 0x93, 0xc, 0x20, + 0xc1, 0x1, 0xcd, 0x69, 0x95, 0x2d, 0x42, 0xd1, + 0xa, 0x4d, 0x16, 0x9c, 0xbf, 0xcb, 0xf1, 0x4a, + 0xd, 0x10, 0x31, 0xc, 0x20, 0x40, 0x1, 0xd, + 0x10, 0x0, 0xc, 0x20, 0x0, 0x0, 0xd, 0x10, + 0x0, 0xc, 0x20, 0x0, 0x0, 0xd, 0x10, 0x0, + 0xc, 0x20, 0x0, + + /* U+79D1 "科" */ + 0x0, 0x3, 0x86, 0x0, 0x0, 0x1d, 0x0, 0x1b, + 0xdf, 0x61, 0x8, 0x60, 0x1d, 0x0, 0x1, 0xe, + 0x0, 0x0, 0xa9, 0x1d, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x6, 0x1d, 0x0, 0x5d, 0xdf, 0xdd, 0x10, + 0x0, 0x1d, 0x0, 0x0, 0x5f, 0x20, 0x2d, 0x40, + 0x1d, 0x0, 0x0, 0xbf, 0xb1, 0x1, 0xc7, 0x1d, + 0x0, 0x3, 0x9e, 0x4a, 0x0, 0x2, 0x1d, 0x0, + 0xc, 0x2e, 0x2, 0x0, 0x13, 0x6f, 0xb8, 0x68, + 0xe, 0x0, 0xce, 0xda, 0x8e, 0x20, 0x10, 0xe, + 0x0, 0x20, 0x0, 0x1d, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x1d, 0x0, + + /* U+79D8 "秘" */ + 0x0, 0x2, 0x70, 0x1, 0x70, 0x0, 0x0, 0x7, + 0xde, 0x71, 0x0, 0x8b, 0x5, 0x50, 0x1, 0x2c, + 0x0, 0x0, 0x6, 0x7b, 0x20, 0x0, 0x1c, 0x0, + 0x0, 0x90, 0xc, 0x0, 0x1e, 0xef, 0xe6, 0x31, + 0xd0, 0x58, 0x0, 0x0, 0x6e, 0x0, 0xc1, 0xd0, + 0xbc, 0x40, 0x0, 0xcf, 0x91, 0xb1, 0xd3, 0xb4, + 0xa0, 0x2, 0xcc, 0xb8, 0x81, 0xdb, 0x30, 0xd0, + 0xa, 0x5c, 0x2b, 0x21, 0xfa, 0x0, 0xa3, 0x3c, + 0x1c, 0x3, 0x2, 0xf2, 0x0, 0x32, 0x2, 0x1c, + 0x0, 0x2d, 0xd0, 0x7, 0x30, 0x0, 0x1c, 0x3, + 0xe8, 0xd0, 0xa, 0x20, 0x0, 0x1c, 0x8, 0x50, + 0xcd, 0xdc, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+79FB "移" */ + 0x0, 0x0, 0x30, 0x0, 0x6, 0x0, 0x0, 0x5, + 0x9d, 0xb3, 0x0, 0xba, 0x22, 0x10, 0x4, 0x3e, + 0x0, 0x3c, 0xba, 0xae, 0x80, 0x0, 0xd, 0x2, + 0xb6, 0x70, 0x9d, 0x0, 0x1e, 0xef, 0xe9, 0x0, + 0xaf, 0xc1, 0x0, 0x0, 0x4f, 0x10, 0x5c, 0xfa, + 0x90, 0x0, 0x0, 0xaf, 0xa2, 0xc7, 0x2c, 0x82, + 0x20, 0x1, 0xce, 0x95, 0x1, 0xbc, 0xaa, 0xe5, + 0x8, 0x6d, 0x12, 0x4d, 0x70, 0x2, 0xc0, 0x1d, + 0xd, 0x0, 0x92, 0x98, 0x2c, 0x30, 0x3, 0xd, + 0x0, 0x0, 0xa, 0xe3, 0x0, 0x0, 0xd, 0x0, + 0x5, 0xc9, 0x10, 0x0, 0x0, 0xd, 0x6, 0xc8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7A0B "程" */ + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x9d, 0xc6, 0x6e, 0xdd, 0xdd, 0xe0, 0x5, 0x2d, + 0x10, 0x67, 0x0, 0x0, 0xe0, 0x0, 0xc, 0x10, + 0x67, 0x0, 0x0, 0xe0, 0x1d, 0xdf, 0xec, 0x6e, + 0xcc, 0xcc, 0xe0, 0x0, 0x3f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0xb0, 0xab, 0xbb, 0xbb, + 0xb4, 0x1, 0xbc, 0x7b, 0x11, 0x1e, 0x11, 0x10, + 0x9, 0x4c, 0x14, 0x0, 0xe, 0x0, 0x0, 0x3b, + 0xc, 0x10, 0x7c, 0xcf, 0xcc, 0xc1, 0x2, 0xc, + 0x10, 0x0, 0xe, 0x0, 0x0, 0x0, 0xc, 0x10, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xc, 0x17, 0xdd, + 0xdf, 0xdd, 0xd9, + + /* U+7A2E "種" */ + 0x0, 0x1, 0x65, 0x0, 0x23, 0x57, 0x80, 0xa, + 0xcf, 0x93, 0xbb, 0xaf, 0x75, 0x20, 0x2, 0xc, + 0x12, 0x66, 0x6e, 0x66, 0x61, 0x0, 0xc, 0x12, + 0x55, 0x5e, 0x55, 0x51, 0x1d, 0xdf, 0xec, 0x8a, + 0xaf, 0xaa, 0xa0, 0x0, 0x3f, 0x20, 0xc1, 0xe, + 0x0, 0xe0, 0x0, 0xaf, 0xa0, 0xca, 0xaf, 0xaa, + 0xf0, 0x1, 0xbc, 0x89, 0xc0, 0xe, 0x0, 0xe0, + 0xa, 0x4c, 0x26, 0xcb, 0xbf, 0xbb, 0xf0, 0x3b, + 0xc, 0x10, 0x0, 0xe, 0x0, 0x0, 0x1, 0xc, + 0x10, 0xbc, 0xcf, 0xcc, 0xc0, 0x0, 0xc, 0x10, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xc, 0x19, 0xcc, + 0xcf, 0xcc, 0xc6, + + /* U+7A4D "積" */ + 0x0, 0x2, 0x75, 0x0, 0xe, 0x0, 0x0, 0xa, + 0xdf, 0x83, 0xaa, 0xaf, 0xaa, 0xa3, 0x1, 0xd, + 0x0, 0x69, 0x9f, 0x99, 0x90, 0x0, 0xd, 0x0, + 0x22, 0x2e, 0x22, 0x21, 0x1e, 0xef, 0xec, 0x88, + 0x88, 0x88, 0x86, 0x0, 0x3f, 0x0, 0x4a, 0xaa, + 0xaa, 0x90, 0x0, 0x9f, 0x80, 0x76, 0x0, 0x0, + 0xd0, 0x1, 0xbd, 0x97, 0x7c, 0xaa, 0xaa, 0xd0, + 0xa, 0x4d, 0x5, 0x7a, 0x66, 0x66, 0xd0, 0x4b, + 0xd, 0x0, 0x78, 0x33, 0x33, 0xd0, 0x1, 0xd, + 0x0, 0x6b, 0xaa, 0xaa, 0xc0, 0x0, 0xd, 0x0, + 0x1a, 0x80, 0x3b, 0x30, 0x0, 0xd, 0x9, 0xb4, + 0x0, 0x2, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7A76 "究" */ + 0x0, 0x0, 0x1, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0xe, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xe0, 0xe, 0x0, 0x25, + 0x0, 0x61, 0x0, 0xe0, 0x4, 0x18, 0xc2, 0x0, + 0x3b, 0xa2, 0x30, 0x4, 0xd6, 0x2, 0x0, 0x0, + 0x3b, 0x50, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x8, 0xdd, 0xdf, 0xed, 0xdf, 0x10, 0x0, + 0x0, 0x0, 0xe, 0x10, 0xd, 0x10, 0x0, 0x0, + 0x0, 0x3d, 0x0, 0xd, 0x10, 0x0, 0x0, 0x1, + 0xd5, 0x0, 0xd, 0x10, 0x65, 0x0, 0x4d, 0x60, + 0x0, 0xd, 0x10, 0x85, 0xc, 0xb3, 0x0, 0x0, + 0xa, 0xee, 0xd1, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7A7A "空" */ + 0x0, 0x0, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x60, 0x0, 0x0, 0xee, 0xdd, 0xdd, 0xdd, + 0xdd, 0xee, 0xe0, 0x0, 0x10, 0x0, 0x0, 0xe, + 0xe0, 0xa, 0x80, 0xc, 0x92, 0xb, 0x16, 0xd6, + 0x0, 0x0, 0x5d, 0x91, 0x79, 0x10, 0x0, 0x0, + 0x0, 0x77, 0x6, 0xdd, 0xdd, 0xdd, 0xdd, 0x70, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, + + /* U+7A93 "窓" */ + 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, 0xa, + 0xbb, 0xbb, 0xcf, 0xbb, 0xbb, 0xb0, 0xe, 0x0, + 0x6, 0x0, 0x30, 0x0, 0xf0, 0x7, 0x3, 0xc6, + 0x0, 0x6c, 0x60, 0x60, 0x2, 0xbb, 0x23, 0xc0, + 0x0, 0x9b, 0x0, 0x0, 0x30, 0x2d, 0x20, 0x66, + 0x1, 0x0, 0x0, 0x3, 0xd3, 0x0, 0x2c, 0x90, + 0x0, 0x0, 0x4f, 0xec, 0xcc, 0xba, 0xb9, 0x0, + 0x0, 0x1, 0x0, 0x61, 0x0, 0x3, 0x0, 0x0, + 0x81, 0xa0, 0x4c, 0x0, 0x69, 0x0, 0x5, 0xa2, + 0xc0, 0x7, 0x80, 0x3c, 0x50, 0xd, 0x22, 0xd0, + 0x0, 0x2, 0xb2, 0xe0, 0x15, 0x0, 0xcd, 0xdd, + 0xde, 0x50, 0x20, + + /* U+7ACB "立" */ + 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x46, 0x0, 0x0, 0x0, 0x9, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x8, 0x70, 0x0, 0x7, + 0xa0, 0x0, 0x0, 0x4, 0xb0, 0x0, 0xb, 0x50, + 0x0, 0x0, 0x0, 0xf0, 0x0, 0xf, 0x10, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0x4b, 0x0, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, + 0x69, 0x0, 0xe1, 0x0, 0x0, 0x3, 0x33, 0x43, + 0x36, 0xc3, 0x33, 0x30, 0x2b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xb2, + + /* U+7AD9 "站" */ + 0x0, 0x47, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x3, 0x38, + 0x43, 0x0, 0x1d, 0x0, 0x0, 0x1a, 0xaa, 0xaa, + 0x20, 0x1f, 0xee, 0xe7, 0x4, 0x20, 0x45, 0x0, + 0x1d, 0x0, 0x0, 0x6, 0x50, 0x85, 0x0, 0x1d, + 0x0, 0x0, 0x4, 0x80, 0xa3, 0x0, 0x1d, 0x0, + 0x0, 0x1, 0xb0, 0xc0, 0x6f, 0xee, 0xee, 0xd0, + 0x0, 0xc0, 0xc0, 0x68, 0x0, 0x1, 0xd0, 0x0, + 0x63, 0xb7, 0x88, 0x0, 0x1, 0xd0, 0x2a, 0xdd, + 0x95, 0x78, 0x0, 0x1, 0xd0, 0x15, 0x10, 0x0, + 0x6d, 0xaa, 0xab, 0xd0, 0x0, 0x0, 0x0, 0x69, + 0x22, 0x23, 0xd0, + + /* U+7AE5 "童" */ + 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x1, + 0xcc, 0xcc, 0xcf, 0xcc, 0xcc, 0x80, 0x0, 0x0, + 0xc1, 0x0, 0xa, 0x40, 0x0, 0x6, 0x66, 0xca, + 0x66, 0x7f, 0x66, 0x63, 0x6, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x63, 0x0, 0x6a, 0xaa, 0xab, 0xaa, + 0xab, 0x0, 0x0, 0x85, 0x0, 0x3a, 0x0, 0xe, + 0x0, 0x0, 0x8c, 0x99, 0xbe, 0x99, 0x9f, 0x0, + 0x0, 0x89, 0x55, 0x7c, 0x55, 0x5f, 0x0, 0x0, + 0x24, 0x44, 0x7c, 0x44, 0x44, 0x0, 0x1, 0xbb, + 0xbb, 0xce, 0xbb, 0xbb, 0x60, 0x0, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0x0, 0x1c, 0xcc, 0xcc, 0xde, + 0xcc, 0xcc, 0xc7, + + /* U+7AEF "端" */ + 0x0, 0x63, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0x4a, 0x0, 0xe0, 0xd, 0x0, 0xd0, 0x0, 0x9, + 0x0, 0xe0, 0xd, 0x0, 0xd0, 0x1e, 0xee, 0xe8, + 0xe7, 0x7e, 0x78, 0xd0, 0x4, 0x10, 0x70, 0x33, + 0x33, 0x33, 0x30, 0x7, 0x40, 0xc7, 0xdd, 0xdd, + 0xdd, 0xd4, 0x4, 0x70, 0xc0, 0x0, 0x2d, 0x0, + 0x0, 0x2, 0x91, 0xa0, 0xaa, 0xce, 0xaa, 0xa0, + 0x1, 0xb4, 0x70, 0xc2, 0xc2, 0xc2, 0xd0, 0x0, + 0x57, 0x86, 0xc0, 0xc0, 0xc0, 0xc0, 0x8, 0xbe, + 0xa5, 0xc0, 0xc0, 0xc0, 0xc0, 0x7, 0x20, 0x0, + 0xc0, 0xc0, 0xc0, 0xc0, 0x0, 0x0, 0x0, 0xc0, + 0xa0, 0xa7, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7B11 "笑" */ + 0x0, 0x34, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + 0xb5, 0x0, 0x5, 0xb0, 0x0, 0x0, 0x3, 0xee, + 0xdc, 0xcc, 0xdf, 0xed, 0xd2, 0x1d, 0x34, 0xb0, + 0x99, 0x5, 0xa0, 0x0, 0x14, 0x0, 0x50, 0x52, + 0x46, 0xda, 0x0, 0x2, 0xcd, 0xdd, 0xde, 0xa8, + 0x51, 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, + 0x2d, 0xdd, 0xdd, 0xff, 0xdd, 0xdd, 0xd3, 0x0, + 0x0, 0x7, 0xa9, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0x10, 0xc6, 0x0, 0x0, 0x0, 0x19, 0xd2, + 0x0, 0x1c, 0xa2, 0x0, 0xc, 0xc6, 0x0, 0x0, + 0x0, 0x6d, 0xc0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, + + /* U+7B26 "符" */ + 0x0, 0x24, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + 0xa8, 0x22, 0x15, 0xc2, 0x22, 0x20, 0x2, 0xeb, + 0xea, 0x7c, 0xae, 0xba, 0xa0, 0xc, 0x40, 0xd0, + 0x88, 0x4, 0xb0, 0x0, 0x5, 0x2, 0x81, 0x30, + 0x0, 0x71, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x7d, 0x1d, 0xdd, 0xdd, 0xfe, + 0xd2, 0x5, 0xec, 0x0, 0x20, 0x0, 0xa3, 0x0, + 0xd, 0x3c, 0x1, 0xd1, 0x0, 0xa3, 0x0, 0x0, + 0x1c, 0x0, 0x6a, 0x0, 0xa3, 0x0, 0x0, 0x1c, + 0x0, 0x9, 0x0, 0xa3, 0x0, 0x0, 0x1c, 0x0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x1c, 0x0, 0x0, + 0xdd, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7B2C "第" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x60, 0x0, 0x1d, 0x0, 0x0, 0x0, 0xec, 0xbb, + 0x97, 0xeb, 0xbb, 0xb0, 0x96, 0x3b, 0x1, 0xd1, + 0x5a, 0x0, 0x4a, 0x0, 0xa0, 0x66, 0x0, 0xa1, + 0x0, 0x5c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc0, 0x0, + 0x0, 0x0, 0xb2, 0x0, 0xe, 0x0, 0xb, 0xcc, + 0xcf, 0xdc, 0xcc, 0xf0, 0x0, 0xd0, 0x0, 0xb2, + 0x0, 0x0, 0x0, 0x2c, 0x22, 0x2c, 0x52, 0x22, + 0x21, 0x3, 0xaa, 0xae, 0xfb, 0xaa, 0xae, 0x40, + 0x0, 0x8, 0x9c, 0x20, 0x0, 0xc2, 0x0, 0x3b, + 0x60, 0xb2, 0x1, 0x2e, 0x0, 0x98, 0x10, 0xb, + 0x21, 0xbb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7B46 "筆" */ + 0x0, 0x67, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0xdd, 0xbb, 0xbc, 0xeb, 0xbb, 0xb4, 0x8, 0x75, + 0xa0, 0xa8, 0xb, 0x50, 0x0, 0x9, 0x0, 0x70, + 0xa6, 0x1, 0x50, 0x0, 0x0, 0x7b, 0xbb, 0xde, + 0xbb, 0xbd, 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, + 0xf, 0x0, 0xb, 0xbb, 0xbb, 0xdd, 0xbb, 0xbf, + 0xb5, 0x0, 0x45, 0x55, 0xab, 0x55, 0x5f, 0x0, + 0x0, 0x34, 0x44, 0x9a, 0x44, 0x44, 0x0, 0x1, + 0xbb, 0xbb, 0xde, 0xbb, 0xbb, 0x40, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0xa, 0xbb, 0xbb, + 0xde, 0xbb, 0xbb, 0xb3, 0x0, 0x0, 0x0, 0x68, + 0x0, 0x0, 0x0, + + /* U+7B49 "等" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xdd, + 0xbb, 0xb6, 0xfb, 0xbb, 0xb5, 0x6, 0x86, 0x90, + 0x2d, 0x27, 0x90, 0x0, 0x1b, 0x1, 0xa0, 0x79, + 0x0, 0xc0, 0x0, 0x0, 0x8c, 0xcc, 0xde, 0xcc, + 0xcc, 0x30, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, + 0x0, 0x2, 0x22, 0x22, 0x6b, 0x22, 0x22, 0x21, + 0x1a, 0xaa, 0xaa, 0xaa, 0xac, 0xda, 0xa6, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x90, 0x0, 0x8, 0xcc, + 0xcc, 0xcc, 0xcd, 0xec, 0xc2, 0x0, 0x4, 0xc3, + 0x0, 0x6, 0x80, 0x0, 0x0, 0x0, 0x2d, 0x30, + 0x6, 0x80, 0x0, 0x0, 0x0, 0x1, 0x8, 0xde, + 0x50, 0x0, + + /* U+7B54 "答" */ + 0x0, 0x24, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + 0xa7, 0x22, 0x21, 0xe2, 0x22, 0x20, 0x3, 0xdc, + 0xda, 0x9a, 0xbd, 0xda, 0xa1, 0x1d, 0x21, 0xd0, + 0x2a, 0x2, 0xd0, 0x0, 0x3, 0x0, 0x41, 0xca, + 0x0, 0x40, 0x0, 0x0, 0x0, 0x2c, 0x78, 0xb2, + 0x0, 0x0, 0x0, 0x18, 0xe5, 0x11, 0x5d, 0xa4, + 0x0, 0x19, 0xe8, 0xab, 0xbb, 0xbb, 0x5c, 0xd3, + 0x6, 0x1, 0x11, 0x11, 0x11, 0x10, 0x30, 0x0, + 0xf, 0xbb, 0xbb, 0xbb, 0xf1, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, 0xe, 0x11, + 0x11, 0x11, 0xe1, 0x0, 0x0, 0xf, 0xbb, 0xbb, + 0xbb, 0xe1, 0x0, + + /* U+7B56 "策" */ + 0x0, 0x85, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x1, + 0xfc, 0xbb, 0x8a, 0xeb, 0xbb, 0xb1, 0xc, 0x58, + 0x81, 0x8c, 0x1a, 0x61, 0x10, 0x38, 0x1, 0x90, + 0xc7, 0x2, 0x80, 0x0, 0xb, 0xbb, 0xbb, 0xde, + 0xbb, 0xbb, 0xb0, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0x0, 0xdd, 0xdd, 0xee, 0xdd, 0xdd, + 0x20, 0x0, 0xf0, 0x0, 0x68, 0x0, 0xc, 0x20, + 0x0, 0xf0, 0x0, 0xab, 0x0, 0xc, 0x20, 0x0, + 0xe0, 0x9, 0xde, 0xa2, 0xbc, 0x10, 0x0, 0x5, + 0xc5, 0x68, 0x4d, 0x71, 0x0, 0x17, 0xc9, 0x20, + 0x68, 0x1, 0x8e, 0xb2, 0x6, 0x10, 0x0, 0x68, + 0x0, 0x0, 0x50, + + /* U+7B97 "算" */ + 0x0, 0x93, 0x0, 0x2, 0xa0, 0x0, 0x0, 0x3, + 0xfc, 0xcc, 0xab, 0xec, 0xcc, 0xc1, 0x1d, 0x36, + 0x90, 0x8a, 0x5, 0xb0, 0x0, 0x14, 0x4a, 0xd9, + 0xca, 0x9a, 0xd7, 0x0, 0x0, 0x78, 0x11, 0x11, + 0x11, 0x4b, 0x0, 0x0, 0x7c, 0x99, 0x99, 0x99, + 0xbb, 0x0, 0x0, 0x7b, 0x77, 0x77, 0x77, 0x9b, + 0x0, 0x0, 0x78, 0x11, 0x11, 0x11, 0x4b, 0x0, + 0x0, 0x5a, 0xdc, 0xaa, 0xaf, 0xa7, 0x0, 0x0, + 0x0, 0x95, 0x0, 0xf, 0x0, 0x0, 0x2c, 0xcc, + 0xfd, 0xcc, 0xcf, 0xcc, 0xc3, 0x0, 0x1b, 0x90, + 0x0, 0xf, 0x0, 0x0, 0x8, 0xb4, 0x0, 0x0, + 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7BA1 "管" */ + 0x1, 0xc0, 0x0, 0x1, 0xb0, 0x0, 0x0, 0x6e, + 0xbb, 0xb6, 0x6e, 0xbb, 0xba, 0x1d, 0x15, 0x80, + 0x1d, 0x15, 0xa0, 0x4, 0x60, 0x7, 0xb, 0x30, + 0x7, 0x0, 0x9, 0xcb, 0xbb, 0xdd, 0xbb, 0xbc, + 0x70, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x59, 0x7, + 0x5e, 0xbb, 0xbb, 0xbb, 0xe3, 0x60, 0x3, 0xb0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x3e, 0xbb, 0xbb, + 0xbb, 0xa0, 0x0, 0x3, 0xc1, 0x11, 0x11, 0x11, + 0x10, 0x0, 0x3e, 0x99, 0x99, 0x99, 0xb9, 0x0, + 0x3, 0xb0, 0x0, 0x0, 0x4, 0x90, 0x0, 0x3e, + 0xbb, 0xbb, 0xbb, 0xc9, 0x0, + + /* U+7BC0 "節" */ + 0x0, 0x67, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, + 0xdd, 0xbb, 0xb1, 0xed, 0xcc, 0xc6, 0x8, 0x82, + 0xc0, 0xb, 0x51, 0xd1, 0x0, 0xa, 0x0, 0xa1, + 0x38, 0x0, 0x67, 0x0, 0x2, 0xbb, 0xbb, 0xb0, + 0xab, 0xbb, 0xb0, 0x2, 0xa0, 0x0, 0xe0, 0xe1, + 0x11, 0xe0, 0x2, 0xeb, 0xbb, 0xf0, 0xe0, 0x0, + 0xe0, 0x2, 0xa0, 0x0, 0xe0, 0xe0, 0x0, 0xe0, + 0x2, 0xeb, 0xbb, 0xf0, 0xe0, 0x0, 0xe0, 0x2, + 0xa0, 0x17, 0x0, 0xe0, 0x0, 0xe0, 0x3, 0xa0, + 0x2c, 0x50, 0xe0, 0xaa, 0xd0, 0x7, 0xee, 0xb7, + 0xd1, 0xe0, 0x22, 0x0, 0x3, 0x40, 0x0, 0x41, + 0xe0, 0x0, 0x0, + + /* U+7BC4 "範" */ + 0x0, 0xc1, 0x0, 0x6, 0x80, 0x0, 0x0, 0x6, + 0xfc, 0xcc, 0x9e, 0xec, 0xcc, 0xc4, 0x3d, 0xc, + 0x21, 0xc5, 0xb, 0x50, 0x0, 0x33, 0x8, 0x20, + 0x40, 0x1, 0x50, 0x0, 0x4b, 0xbe, 0xcb, 0xa6, + 0xed, 0xdd, 0xb0, 0x3, 0x3b, 0x53, 0x17, 0x70, + 0x1, 0xc0, 0xd, 0x6c, 0x89, 0x87, 0x70, 0x1, + 0xc0, 0xe, 0xae, 0xbb, 0x87, 0x70, 0x1, 0xc0, + 0xc, 0xa, 0x23, 0x87, 0x70, 0x89, 0xb0, 0xc, + 0xae, 0xba, 0x77, 0x70, 0x55, 0x10, 0x1, 0x1a, + 0x31, 0x17, 0x70, 0x0, 0x32, 0x6a, 0xae, 0xba, + 0xa8, 0x70, 0x0, 0x86, 0x0, 0xa, 0x20, 0x3, + 0xee, 0xde, 0xd1, + + /* U+7C21 "簡" */ + 0x0, 0xb0, 0x0, 0x7, 0x50, 0x0, 0x0, 0x6, + 0xfb, 0xbb, 0x7f, 0xcb, 0xbb, 0xb2, 0x3d, 0x1c, + 0x11, 0xd3, 0xc, 0x50, 0x0, 0x25, 0x37, 0x54, + 0x33, 0x36, 0x83, 0x20, 0xb, 0x86, 0x6e, 0xd, + 0x76, 0x68, 0xa0, 0xb, 0xa9, 0x9e, 0xd, 0x99, + 0x9a, 0xa0, 0xb, 0x53, 0x3d, 0xd, 0x43, 0x36, + 0xa0, 0xb, 0x76, 0x66, 0x5, 0x66, 0x68, 0xa0, + 0xb, 0x20, 0xc9, 0x99, 0xc4, 0x3, 0xa0, 0xb, + 0x20, 0xd0, 0x0, 0xa5, 0x3, 0xa0, 0xb, 0x20, + 0xd8, 0x88, 0xd5, 0x3, 0xa0, 0xb, 0x20, 0xd9, + 0x99, 0xd5, 0x3, 0xa0, 0xb, 0x20, 0x60, 0x0, + 0x5, 0xdd, 0x60, + + /* U+7C73 "米" */ + 0x0, 0x0, 0x0, 0x87, 0x0, 0x1, 0x0, 0x1, + 0xd0, 0x0, 0x87, 0x0, 0xd, 0x30, 0x0, 0x98, + 0x0, 0x87, 0x0, 0x6b, 0x0, 0x0, 0x1e, 0x10, + 0x87, 0x0, 0xe2, 0x0, 0x0, 0x7, 0x40, 0x87, + 0x5, 0x80, 0x0, 0x1, 0x11, 0x11, 0x88, 0x11, + 0x11, 0x10, 0x2d, 0xdd, 0xde, 0xff, 0xed, 0xdd, + 0xd1, 0x0, 0x0, 0xb, 0xcb, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x96, 0x87, 0x69, 0x0, 0x0, 0x0, + 0x9, 0x90, 0x87, 0x9, 0xa0, 0x0, 0x1, 0xba, + 0x0, 0x87, 0x0, 0x8c, 0x20, 0x3e, 0x70, 0x0, + 0x87, 0x0, 0x5, 0xe3, 0x2, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x10, + + /* U+7CBE "精" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x67, 0x0, 0x0, 0xd, 0x0, 0x0, 0x19, 0x67, + 0x75, 0xab, 0xbf, 0xcb, 0xb2, 0xb, 0x67, 0xb0, + 0x0, 0xe, 0x10, 0x0, 0x9, 0x88, 0xa0, 0x5b, + 0xbf, 0xbb, 0xa0, 0x3, 0x89, 0x31, 0x44, 0x4e, + 0x44, 0x42, 0x4b, 0xed, 0xb3, 0x66, 0x66, 0x66, + 0x64, 0x0, 0xdc, 0x0, 0x3b, 0xbb, 0xbb, 0x70, + 0x2, 0xfd, 0x60, 0x58, 0x0, 0x3, 0xa0, 0x8, + 0xa7, 0xd1, 0x5d, 0xaa, 0xac, 0xa0, 0x1d, 0x67, + 0x30, 0x58, 0x0, 0x3, 0xa0, 0x65, 0x67, 0x0, + 0x5d, 0xbb, 0xbc, 0xa0, 0x0, 0x67, 0x0, 0x58, + 0x0, 0x3, 0xa0, 0x0, 0x67, 0x0, 0x58, 0x0, + 0x9c, 0x70, + + /* U+7CD6 "糖" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x0, 0x77, 0x0, 0x0, 0x15, 0x85, + 0x71, 0x0, 0x2e, 0x0, 0x0, 0xb, 0x85, 0xc5, + 0xec, 0xcf, 0xcc, 0xc3, 0xb, 0x88, 0x75, 0x83, + 0x4e, 0x44, 0x30, 0x4, 0x97, 0x25, 0x84, 0x5e, + 0x55, 0xc0, 0x4b, 0xed, 0xb5, 0xca, 0xaf, 0xaa, + 0xf6, 0x0, 0xe6, 0x5, 0x70, 0xd, 0x0, 0xc0, + 0x4, 0xfe, 0x27, 0x69, 0xbf, 0xbb, 0xc0, 0xa, + 0xa8, 0xb8, 0x40, 0xd, 0x0, 0x0, 0x3b, 0x85, + 0x3a, 0x2c, 0xce, 0xcc, 0xb0, 0x73, 0x85, 0xc, + 0xd, 0x0, 0x0, 0xd0, 0x0, 0x85, 0x39, 0xd, + 0x0, 0x0, 0xd0, 0x0, 0x85, 0x91, 0xe, 0xcc, + 0xcc, 0xd0, + + /* U+7CFB "系" */ + 0x0, 0x0, 0x0, 0x24, 0x69, 0x90, 0x1, 0xbc, + 0xde, 0xfc, 0x97, 0x41, 0x0, 0x2, 0x10, 0xa7, + 0x0, 0x11, 0x0, 0x0, 0x1, 0xb5, 0x0, 0x4d, + 0x50, 0x0, 0x3, 0xec, 0xaa, 0xcd, 0x20, 0x0, + 0x0, 0x14, 0x36, 0xe9, 0x2, 0x80, 0x0, 0x0, + 0x1a, 0xb2, 0x0, 0xa, 0x80, 0x1, 0x8f, 0xd9, + 0xab, 0xcc, 0xce, 0x50, 0x8, 0x64, 0x33, 0xd0, + 0x0, 0x1c, 0x0, 0x3, 0xd0, 0x1d, 0x7, 0xa0, + 0x0, 0x3, 0xe3, 0x1, 0xd0, 0x7, 0xc1, 0x5, + 0xe3, 0x0, 0x2d, 0x0, 0x6, 0xd1, 0x1, 0x1, + 0xee, 0x90, 0x0, 0x2, 0x0, + + /* U+7D00 "紀" */ + 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x0, 0xa5, + 0x22, 0x0, 0x0, 0x2, 0xc0, 0x4, 0xa0, 0xb6, + 0x0, 0x0, 0x2, 0xc0, 0x2e, 0x9a, 0xb0, 0x0, + 0x0, 0x2, 0xc0, 0x18, 0x7d, 0x21, 0x2, 0x22, + 0x25, 0xc0, 0x0, 0xc2, 0x59, 0x1f, 0xbb, 0xbc, + 0xc0, 0x1c, 0xcb, 0xce, 0x2e, 0x0, 0x0, 0x20, + 0x7, 0x41, 0x6, 0x2e, 0x0, 0x0, 0x0, 0x6, + 0x19, 0x2a, 0x1e, 0x0, 0x0, 0x0, 0xc, 0xc, + 0xd, 0x2e, 0x0, 0x0, 0x47, 0x1c, 0xb, 0x17, + 0x4e, 0x0, 0x0, 0x68, 0x37, 0x4, 0x0, 0xb, + 0xed, 0xde, 0xd2, + + /* U+7D04 "約" */ + 0x0, 0x5, 0x20, 0x1, 0x60, 0x0, 0x0, 0x2, + 0xd0, 0x0, 0x78, 0x0, 0x0, 0x0, 0xa5, 0x11, + 0xc, 0x30, 0x0, 0x0, 0x69, 0xa, 0x73, 0xfd, + 0xdd, 0xec, 0x4f, 0x9a, 0xb0, 0xc4, 0x0, 0x2, + 0xc2, 0x56, 0xd3, 0x49, 0x0, 0x0, 0x3b, 0x1, + 0xc2, 0x2b, 0x6, 0xa0, 0x4, 0xa2, 0xec, 0xbc, + 0xe1, 0x9, 0x80, 0x4a, 0x26, 0x31, 0x5, 0x10, + 0xc, 0x35, 0x90, 0x71, 0x91, 0xb0, 0x0, 0x10, + 0x78, 0xd, 0xc, 0xb, 0x10, 0x0, 0x9, 0x63, + 0xa0, 0xa2, 0x53, 0x0, 0x0, 0xc3, 0x44, 0x3, + 0x0, 0x0, 0x5e, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+7D19 "紙" */ + 0x0, 0x5, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, + 0x3c, 0x0, 0x36, 0x8a, 0xdc, 0x70, 0x0, 0xb4, + 0x20, 0xc7, 0x53, 0xd0, 0x0, 0x5, 0x90, 0xc2, + 0xc1, 0x0, 0xd0, 0x0, 0x2e, 0x8a, 0x80, 0xc1, + 0x0, 0xd0, 0x0, 0x27, 0x7d, 0x20, 0xc1, 0x0, + 0xd0, 0x0, 0x1, 0xc2, 0x92, 0xce, 0xdd, 0xfe, + 0xd0, 0x1c, 0xa9, 0xc8, 0xc1, 0x0, 0xc1, 0x0, + 0x29, 0x63, 0x17, 0xc1, 0x0, 0xa2, 0x0, 0x7, + 0x16, 0x82, 0xc1, 0x0, 0x85, 0x0, 0xd, 0xc, + 0x47, 0xc1, 0x0, 0x49, 0x9, 0x2a, 0xc, 0x5, + 0xd5, 0x8c, 0xd, 0x2a, 0x45, 0x3, 0x1, 0xfb, + 0x61, 0x5, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7D20 "素" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x6, + 0xcc, 0xcc, 0xee, 0xcc, 0xcc, 0x70, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x8b, 0xbb, + 0xdd, 0xbb, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x2b, 0xbb, 0xbd, 0xeb, 0xbb, + 0xbb, 0xb3, 0x0, 0x2, 0x99, 0x20, 0x5a, 0x0, + 0x0, 0x0, 0x5d, 0xbb, 0xfe, 0x71, 0x10, 0x0, + 0x0, 0x4, 0x9b, 0x50, 0x4, 0xd4, 0x0, 0x6, + 0xef, 0xdb, 0xce, 0xa9, 0x8c, 0x60, 0x0, 0x4, + 0x70, 0x3a, 0x7, 0x40, 0x20, 0x2, 0xab, 0x10, + 0x4a, 0x1, 0x9b, 0x20, 0xa, 0x40, 0x2d, 0xd6, + 0x0, 0x3, 0x90, + + /* U+7D30 "細" */ + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x80, 0xd, 0xfe, 0xfe, 0xef, 0x0, 0xc0, 0x60, + 0xd0, 0xd, 0x0, 0xe0, 0x76, 0x3a, 0xd, 0x0, + 0xd0, 0xe, 0x4f, 0xad, 0x20, 0xd0, 0xd, 0x0, + 0xe1, 0x48, 0x74, 0xd, 0x0, 0xd0, 0xe, 0x2, + 0xb0, 0xa1, 0xde, 0xdf, 0xdd, 0xf2, 0xea, 0xbd, + 0x5d, 0x0, 0xd0, 0xe, 0x16, 0x30, 0x22, 0xd0, + 0xd, 0x0, 0xe0, 0x93, 0x5a, 0xd, 0x0, 0xd0, + 0xe, 0xb, 0x29, 0x64, 0xd0, 0xd, 0x0, 0xe4, + 0x80, 0xb2, 0x5d, 0xed, 0xfd, 0xdf, 0x44, 0x3, + 0x0, 0xd0, 0x0, 0x0, 0xc0, + + /* U+7D39 "紹" */ + 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0xbd, 0xee, 0xdd, 0xf1, 0x0, 0xd2, + 0x41, 0x0, 0xa6, 0x0, 0xd0, 0x8, 0x61, 0xd1, + 0x0, 0xe2, 0x0, 0xe0, 0x4f, 0xbe, 0x40, 0x6, + 0xa0, 0x0, 0xd0, 0x12, 0x79, 0x50, 0x6c, 0x12, + 0xac, 0x80, 0x4, 0xb0, 0x75, 0x50, 0x0, 0x21, + 0x0, 0x3f, 0xdc, 0xba, 0x8b, 0xbb, 0xbb, 0x80, + 0x3, 0x0, 0x25, 0xa5, 0x11, 0x14, 0xb0, 0xa, + 0x28, 0x83, 0xa3, 0x0, 0x3, 0xb0, 0xc, 0xb, + 0x48, 0xa3, 0x0, 0x3, 0xb0, 0x2a, 0xc, 0x8, + 0xa5, 0x22, 0x25, 0xb0, 0x45, 0x6, 0x0, 0xac, + 0xaa, 0xab, 0xb0, + + /* U+7D42 "終" */ + 0x0, 0x6, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0xc2, + 0x20, 0xd, 0xcc, 0xcf, 0x40, 0x5, 0x91, 0xe1, + 0xae, 0x50, 0x4d, 0x0, 0x2e, 0x7b, 0x66, 0x91, + 0xd3, 0xd3, 0x0, 0x38, 0x9c, 0x10, 0x0, 0x4f, + 0x70, 0x0, 0x1, 0xc2, 0xc0, 0x4, 0xd8, 0xd4, + 0x0, 0x1c, 0x97, 0xd4, 0xbc, 0x30, 0x2c, 0xa2, + 0x2a, 0x74, 0x65, 0x40, 0xaa, 0x20, 0x51, 0x6, + 0x23, 0x90, 0x0, 0x4, 0xd1, 0x0, 0xc, 0x28, + 0x83, 0x15, 0x0, 0x0, 0x0, 0x2a, 0xa, 0x36, + 0x28, 0xda, 0x40, 0x0, 0x56, 0x6, 0x0, 0x0, + 0x3, 0xad, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, + + /* U+7D44 "組" */ + 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0xd, 0xdd, 0xde, 0xa0, 0x0, 0xc2, + 0x34, 0xd, 0x0, 0x3, 0xa0, 0x7, 0x60, 0xd5, + 0xd, 0x0, 0x3, 0xa0, 0x3f, 0xce, 0x90, 0xd, + 0xaa, 0xab, 0xa0, 0x1, 0x6c, 0x53, 0xd, 0x33, + 0x36, 0xa0, 0x3, 0xd1, 0x3b, 0xd, 0x0, 0x3, + 0xa0, 0x2e, 0xdc, 0xce, 0xd, 0x0, 0x3, 0xa0, + 0x5, 0x20, 0x6, 0x1d, 0xdd, 0xde, 0xa0, 0x9, + 0x9, 0x39, 0xd, 0x0, 0x3, 0xa0, 0xd, 0xc, + 0xd, 0xd, 0x0, 0x3, 0xa0, 0x1b, 0xc, 0x7, + 0xd, 0x0, 0x3, 0xa0, 0x47, 0x6, 0x2, 0xdf, + 0xdd, 0xde, 0xf8, + + /* U+7D4C "経" */ + 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0x1, 0xde, 0xdd, 0xde, 0xb0, 0x0, 0xd2, + 0x52, 0xd, 0x20, 0xc, 0x40, 0x7, 0x81, 0xe2, + 0x5, 0xb0, 0x6b, 0x0, 0x3f, 0x8c, 0x60, 0x0, + 0xab, 0xd1, 0x0, 0x38, 0x9b, 0x20, 0x1, 0xae, + 0xc2, 0x0, 0x2, 0xc1, 0xc3, 0x9b, 0x42, 0x4c, + 0xb4, 0x2e, 0xba, 0xc8, 0x20, 0xc, 0x10, 0x21, + 0x15, 0x20, 0x33, 0x5b, 0xbf, 0xbb, 0x90, 0xb, + 0x47, 0x84, 0x12, 0x2d, 0x42, 0x20, 0xc, 0x29, + 0x38, 0x0, 0xc, 0x10, 0x0, 0x39, 0xb, 0xb, + 0x0, 0xc, 0x10, 0x0, 0x76, 0x9, 0x1, 0xdd, + 0xdf, 0xdd, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7D50 "結" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x78, + 0x0, 0x0, 0xf, 0x0, 0x0, 0x1, 0xd1, 0x53, + 0xdd, 0xdf, 0xdd, 0xd3, 0xa, 0x52, 0xe1, 0x0, + 0xf, 0x0, 0x0, 0x4f, 0xbe, 0x50, 0x0, 0xf, + 0x0, 0x0, 0x1, 0x6b, 0x70, 0x9d, 0xdf, 0xdd, + 0xc0, 0x2, 0xd1, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xaa, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x29, + 0x64, 0x29, 0x6e, 0xdd, 0xde, 0x70, 0x6, 0x14, + 0x90, 0x67, 0x0, 0x6, 0x70, 0xc, 0x1a, 0x65, + 0x67, 0x0, 0x6, 0x70, 0x2a, 0xc, 0x29, 0x68, + 0x22, 0x28, 0x70, 0x55, 0x7, 0x0, 0x6d, 0xaa, + 0xac, 0x70, + + /* U+7D61 "絡" */ + 0x0, 0x5, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0xc3, + 0x20, 0x7, 0xec, 0xcd, 0xc0, 0x5, 0x90, 0xe2, + 0x6e, 0xb0, 0xb, 0x50, 0x3e, 0x8b, 0x72, 0xd2, + 0x88, 0x8a, 0x0, 0x26, 0x8c, 0x30, 0x0, 0xd, + 0xe0, 0x0, 0x2, 0xc1, 0xc0, 0x1, 0xaa, 0xaa, + 0x10, 0x2d, 0xaa, 0xe5, 0x8d, 0x50, 0x5, 0xe6, + 0x17, 0x41, 0x35, 0x5f, 0xdd, 0xdd, 0xe1, 0x8, + 0x26, 0x92, 0xd, 0x0, 0x0, 0xd0, 0xc, 0x1a, + 0x57, 0xd, 0x0, 0x0, 0xd0, 0x2a, 0xc, 0x19, + 0xd, 0x11, 0x12, 0xd0, 0x45, 0x6, 0x0, 0xf, + 0xbb, 0xbc, 0xd0, + + /* U+7D66 "給" */ + 0x0, 0x7, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, 0xc3, + 0x20, 0x0, 0xb6, 0xd2, 0x0, 0x6, 0x81, 0xe2, + 0x8, 0x90, 0x3d, 0x10, 0x3f, 0x8b, 0x60, 0x9d, + 0x0, 0x6, 0xc2, 0x27, 0x9a, 0x36, 0xc9, 0xdd, + 0xdd, 0x5a, 0x3, 0xb0, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xdc, 0xba, 0x2d, 0xdd, 0xdd, 0x90, + 0x3, 0x0, 0x25, 0x3b, 0x0, 0x3, 0xb0, 0xc, + 0x38, 0x84, 0x3a, 0x0, 0x3, 0xb0, 0xc, 0x1b, + 0x39, 0x3a, 0x0, 0x3, 0xb0, 0x49, 0xc, 0x4, + 0x3e, 0xbb, 0xbc, 0xb0, 0x33, 0x1, 0x0, 0x3b, + 0x22, 0x24, 0xb0, + + /* U+7D71 "統" */ + 0x0, 0x9, 0x0, 0x0, 0x72, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0xc2, + 0x44, 0xdd, 0xdf, 0xdd, 0xd2, 0x6, 0x81, 0xd1, + 0x1, 0xd2, 0x22, 0x0, 0x3f, 0x9c, 0x60, 0xa, + 0x60, 0x3c, 0x0, 0x27, 0x8c, 0x20, 0x7e, 0x56, + 0x8e, 0x70, 0x1, 0xc1, 0xc2, 0xca, 0x86, 0x53, + 0xd1, 0xb, 0x97, 0xc6, 0x7, 0x31, 0x80, 0x10, + 0x2a, 0x74, 0x48, 0xb, 0x31, 0xc0, 0x0, 0x5, + 0x23, 0x90, 0xd, 0x11, 0xc0, 0x0, 0xc, 0x38, + 0xa1, 0x1d, 0x1, 0xc0, 0x43, 0x1a, 0x1a, 0x43, + 0xa7, 0x1, 0xc0, 0x75, 0x46, 0x6, 0xc, 0xa0, + 0x0, 0xcd, 0xe2, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, + + /* U+7D75 "絵" */ + 0x0, 0x8, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x7f, 0x20, 0x0, 0x0, 0xc2, + 0x40, 0x2, 0xd4, 0xc0, 0x0, 0x6, 0x71, 0xd0, + 0x1d, 0x30, 0x5c, 0x10, 0x3f, 0xad, 0x42, 0xd6, + 0x0, 0x6, 0xd1, 0x15, 0x98, 0x36, 0x5d, 0xdd, + 0xdc, 0x63, 0x3, 0xa0, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xdc, 0xc7, 0xdd, 0xdd, 0xdd, 0xd0, + 0x3, 0x0, 0x43, 0x1, 0xd1, 0x0, 0x0, 0xb, + 0x47, 0xb0, 0x9, 0x60, 0x64, 0x0, 0xc, 0x29, + 0x84, 0x2c, 0x0, 0x1c, 0x10, 0x39, 0xb, 0x14, + 0xda, 0x89, 0xae, 0x90, 0x23, 0x1, 0x3, 0x75, + 0x43, 0x10, 0x90, + + /* U+7D93 "經" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x5, 0xdd, 0xdd, 0xdd, 0xd0, 0x0, 0xc1, + 0x50, 0x25, 0x7, 0x3, 0x40, 0x7, 0x63, 0xa0, + 0xb3, 0x4a, 0xc, 0x10, 0x3f, 0xad, 0x24, 0x90, + 0xc1, 0x87, 0x0, 0x14, 0x87, 0x42, 0xc0, 0xb4, + 0x4a, 0x0, 0x3, 0xb0, 0xb0, 0x77, 0x1d, 0x8, + 0x60, 0x2e, 0xcc, 0xe2, 0x6, 0x4, 0x10, 0x60, + 0x15, 0x20, 0x43, 0xdd, 0xdd, 0xdd, 0x70, 0x9, + 0x36, 0xb0, 0x0, 0x3a, 0x0, 0x0, 0xc, 0x29, + 0xa0, 0x0, 0x3a, 0x0, 0x0, 0x2a, 0x1b, 0x51, + 0x0, 0x3a, 0x0, 0x0, 0x56, 0x6, 0xc, 0xdd, + 0xef, 0xdd, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7D9A "続" */ + 0x0, 0x47, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, + 0xb3, 0x0, 0xaa, 0xae, 0xba, 0xa4, 0x2, 0xb0, + 0x81, 0x22, 0x2c, 0x42, 0x21, 0xb, 0x25, 0xb0, + 0x48, 0x8d, 0x98, 0x70, 0x5f, 0xcf, 0x20, 0x24, + 0x44, 0x44, 0x40, 0x0, 0x98, 0x50, 0xbb, 0xbb, + 0xbb, 0xb3, 0x4, 0xc0, 0xd0, 0xd0, 0x0, 0x0, + 0x84, 0x2e, 0xa9, 0xc5, 0x90, 0x60, 0x52, 0x63, + 0x14, 0x10, 0x32, 0x2, 0xb0, 0x93, 0x0, 0x9, + 0x35, 0xa1, 0x4, 0xa0, 0x93, 0x0, 0xc, 0x29, + 0x66, 0xa, 0x60, 0x93, 0x5, 0x2a, 0xa, 0x27, + 0x5d, 0x0, 0x94, 0x1a, 0x45, 0x4, 0x6, 0xd2, + 0x0, 0x5d, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7DAD "維" */ + 0x0, 0x5, 0x0, 0x0, 0x41, 0x20, 0x0, 0x0, + 0x4b, 0x0, 0x5, 0xb3, 0xc0, 0x0, 0x0, 0xc2, + 0x20, 0xc, 0x40, 0x91, 0x0, 0x7, 0x81, 0xd1, + 0x5f, 0xdd, 0xfd, 0xd4, 0x3f, 0x9c, 0x51, 0xed, + 0x0, 0xd0, 0x0, 0x2, 0x7a, 0x74, 0x5f, 0xaa, + 0xfa, 0xa0, 0x3, 0xb0, 0x67, 0xd, 0x22, 0xe2, + 0x20, 0x1e, 0xcc, 0xbc, 0xd, 0x0, 0xd0, 0x0, + 0x4, 0x10, 0x24, 0xf, 0xdd, 0xfd, 0xd1, 0xa, + 0x28, 0x65, 0xd, 0x0, 0xd0, 0x0, 0xc, 0xb, + 0x2b, 0xd, 0x0, 0xd0, 0x0, 0x29, 0xc, 0x8, + 0xf, 0xdd, 0xfd, 0xd7, 0x23, 0x2, 0x0, 0xd, + 0x0, 0x0, 0x0, + + /* U+7DB2 "網" */ + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb0, 0xf, 0xdd, 0xdd, 0xdf, 0x0, 0xc2, 0x51, + 0xd1, 0x50, 0x61, 0xd0, 0x76, 0x2d, 0xd, 0xa, + 0xb, 0xd, 0x3f, 0xce, 0x50, 0xd7, 0xba, 0xd7, + 0xd0, 0x16, 0xb6, 0xd, 0x13, 0x92, 0x1d, 0x1, + 0xd1, 0xa2, 0xd0, 0xb, 0x0, 0xd1, 0xcb, 0x9d, + 0x6d, 0x7e, 0xcc, 0x7d, 0x18, 0x53, 0x37, 0xd1, + 0xa0, 0x0, 0xd0, 0x62, 0x3a, 0xd, 0x1b, 0x22, + 0x1d, 0xc, 0x28, 0x92, 0xd0, 0x99, 0x95, 0xd2, + 0xa0, 0xa3, 0x3d, 0x0, 0x0, 0xe, 0x24, 0x2, + 0x0, 0xd0, 0x0, 0x3d, 0xa0, + + /* U+7DD1 "緑" */ + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x7c, 0xcc, 0xce, 0x60, 0x0, 0xc3, + 0x32, 0x0, 0x0, 0x7, 0x60, 0x6, 0x80, 0xd3, + 0x3c, 0xcc, 0xce, 0x60, 0x3f, 0xac, 0x80, 0x0, + 0x0, 0x7, 0x60, 0x14, 0x6c, 0x41, 0xdd, 0xdd, + 0xde, 0xe6, 0x2, 0xc1, 0x84, 0x20, 0xc, 0x10, + 0x20, 0x2e, 0xbb, 0xd9, 0x7a, 0xc, 0x13, 0xc2, + 0x16, 0x31, 0x18, 0x7, 0x4c, 0xbb, 0x10, 0x9, + 0x35, 0xb0, 0x1, 0xbf, 0xb6, 0x0, 0xc, 0x29, + 0x74, 0x6c, 0x3c, 0x2b, 0x70, 0x39, 0xb, 0x25, + 0x90, 0xc, 0x10, 0x86, 0x44, 0x3, 0x0, 0x3, + 0xcd, 0x0, 0x0, + + /* U+7DD2 "緒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, 0x78, + 0x0, 0x0, 0x3b, 0x0, 0xa3, 0x0, 0xd1, 0x41, + 0x5d, 0xef, 0xdb, 0xb0, 0x7, 0x71, 0xe1, 0x0, + 0x3b, 0xc, 0x20, 0x3f, 0x8b, 0x60, 0x11, 0x4b, + 0x8a, 0x11, 0x28, 0x9b, 0x21, 0xbb, 0xcf, 0xdb, + 0xb8, 0x1, 0xc0, 0xc1, 0x4, 0xc8, 0x0, 0x0, + 0x2d, 0xba, 0xe8, 0xaf, 0xec, 0xcc, 0xf0, 0x17, + 0x41, 0x37, 0x59, 0x50, 0x0, 0xe0, 0xa, 0x36, + 0xa2, 0x8, 0xdb, 0xbb, 0xf0, 0xc, 0x29, 0x67, + 0x8, 0x50, 0x0, 0xe0, 0x2a, 0x1b, 0x29, 0x8, + 0x71, 0x11, 0xf0, 0x45, 0x7, 0x0, 0x8, 0xca, + 0xaa, 0xe0, + + /* U+7DDA "線" */ + 0x0, 0x5, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0xb3, + 0x20, 0xbc, 0xbb, 0xbb, 0xe0, 0x4, 0xa1, 0xd0, + 0xb1, 0x0, 0x0, 0xe0, 0x2e, 0x8b, 0x60, 0xbc, + 0xbb, 0xbb, 0xe0, 0x17, 0x8c, 0x20, 0xb1, 0x0, + 0x0, 0xe0, 0x1, 0xc1, 0xb0, 0x9c, 0xcf, 0xcc, + 0xb0, 0x1c, 0xb9, 0xe1, 0x0, 0xe, 0x20, 0x61, + 0x9, 0x53, 0x66, 0xcd, 0x8e, 0xaa, 0x80, 0x7, + 0x35, 0xa0, 0xb, 0x1e, 0xc8, 0x0, 0xc, 0x29, + 0xa0, 0x79, 0xe, 0x1d, 0x30, 0x1b, 0xb, 0x29, + 0x90, 0xe, 0x3, 0xd5, 0x24, 0x1, 0x1, 0x6, + 0xdc, 0x0, 0x1, + + /* U+7DE0 "締" */ + 0x0, 0x1c, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, + 0x78, 0x0, 0xaa, 0xaf, 0xaa, 0xa3, 0x0, 0xd0, + 0x72, 0x2a, 0x32, 0x3c, 0x20, 0x8, 0x52, 0xd0, + 0x7, 0x40, 0x68, 0x0, 0x3f, 0xdf, 0x52, 0xbd, + 0xcb, 0xed, 0xb5, 0x2, 0x7a, 0x52, 0xa0, 0x5, + 0x0, 0x57, 0x2, 0xc0, 0xa4, 0x40, 0xd, 0x0, + 0x23, 0x1d, 0xbb, 0xd8, 0x6d, 0xcf, 0xcc, 0xb0, + 0x17, 0x41, 0x27, 0x84, 0xd, 0x0, 0xd0, 0x8, + 0x35, 0xb0, 0x84, 0xd, 0x0, 0xd0, 0xc, 0x28, + 0x75, 0x84, 0xd, 0x0, 0xd0, 0x2a, 0x1a, 0x37, + 0x63, 0xd, 0x3c, 0x70, 0x45, 0x5, 0x0, 0x0, + 0xd, 0x0, 0x0, + + /* U+7DE9 "緩" */ + 0x0, 0x8, 0x0, 0x1, 0x35, 0x7a, 0x30, 0x0, + 0x77, 0x5, 0xba, 0xa8, 0x56, 0x10, 0x0, 0xc0, + 0x60, 0xb1, 0x85, 0xd, 0x10, 0x8, 0x54, 0x90, + 0x65, 0x37, 0x77, 0x0, 0x4f, 0x9d, 0x12, 0xcc, + 0xcc, 0xed, 0x90, 0x14, 0x96, 0x40, 0x6, 0x70, + 0x0, 0x0, 0x3, 0xa0, 0xa7, 0xce, 0xec, 0xcc, + 0xc1, 0x2e, 0xab, 0xd4, 0xb, 0x30, 0x0, 0x0, + 0x16, 0x30, 0x22, 0xf, 0xdc, 0xce, 0x10, 0x8, + 0x35, 0xa0, 0x5c, 0xc0, 0x5b, 0x0, 0xb, 0x28, + 0x72, 0xc3, 0x7b, 0xd1, 0x0, 0x38, 0xa, 0x2b, + 0xa1, 0x9d, 0xd6, 0x0, 0x43, 0x3, 0xa, 0x6c, + 0x50, 0x2a, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7DF4 "練" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x78, + 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0xd1, 0x27, + 0xdd, 0xdf, 0xdd, 0xd1, 0x8, 0x72, 0xc0, 0x0, + 0x2b, 0x0, 0x0, 0x3f, 0x7c, 0x32, 0xec, 0xce, + 0xcd, 0xa0, 0x26, 0x97, 0x32, 0xa7, 0x2a, 0x38, + 0xa0, 0x3, 0xa0, 0xa2, 0xa5, 0x6a, 0x83, 0xa0, + 0x2f, 0xdb, 0xd5, 0xea, 0xbe, 0xab, 0xa0, 0x3, + 0x0, 0x52, 0x12, 0xee, 0xa1, 0x10, 0xb, 0x37, + 0xa0, 0xa, 0x8b, 0x94, 0x0, 0xc, 0x19, 0x90, + 0x8a, 0x2b, 0xc, 0x40, 0x39, 0xb, 0x38, 0xa0, + 0x2b, 0x1, 0xd0, 0x44, 0x3, 0x0, 0x0, 0x2b, + 0x0, 0x0, + + /* U+7E3D "總" */ + 0x0, 0x25, 0x0, 0x0, 0x37, 0x0, 0x0, 0x0, + 0x95, 0x0, 0x68, 0xca, 0x88, 0x60, 0x1, 0xd0, + 0x60, 0xc4, 0x77, 0x45, 0xb0, 0x8, 0x53, 0xa0, + 0xc0, 0xb9, 0xa6, 0xb0, 0x3f, 0x9d, 0x20, 0xc7, + 0x64, 0xa1, 0xb0, 0x14, 0x87, 0x20, 0xc0, 0x2d, + 0xa1, 0xb0, 0x2, 0xb0, 0xb0, 0xc4, 0x91, 0x43, + 0xb0, 0x1d, 0xbb, 0xd2, 0xcc, 0xcc, 0xcd, 0xb0, + 0x16, 0x20, 0x33, 0x0, 0x17, 0x0, 0x0, 0x5, + 0x23, 0x80, 0x75, 0x3a, 0x48, 0x40, 0xb, 0x38, + 0xa1, 0xb7, 0x51, 0x61, 0xc0, 0xb, 0x1a, 0x58, + 0x77, 0x50, 0xb, 0x84, 0x36, 0x5, 0x2, 0x4, + 0xdc, 0xc9, 0x0, + + /* U+7E3E "績" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x78, + 0x4, 0xbb, 0xbe, 0xbb, 0x90, 0x0, 0xd1, 0x61, + 0x66, 0x7d, 0x66, 0x30, 0x7, 0x72, 0xc0, 0x55, + 0x6d, 0x55, 0x20, 0x3f, 0xad, 0x3a, 0xbb, 0xce, + 0xbb, 0xb3, 0x15, 0x79, 0x30, 0x44, 0x44, 0x44, + 0x20, 0x1, 0xb0, 0xb0, 0xe5, 0x55, 0x59, 0x70, + 0x1d, 0xbb, 0xe2, 0xf9, 0x99, 0x9c, 0x70, 0x6, + 0x31, 0x53, 0xe5, 0x55, 0x59, 0x70, 0x8, 0x35, + 0xa0, 0xe4, 0x44, 0x49, 0x70, 0xb, 0x28, 0xa1, + 0xca, 0xaa, 0xab, 0x50, 0x1a, 0x1a, 0x31, 0x5c, + 0x40, 0x98, 0x0, 0x46, 0x5, 0xc, 0x81, 0x0, + 0x5, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7E54 "織" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2a, 0x0, 0x28, 0x0, 0xc0, 0x0, 0x0, 0x76, + 0x0, 0xd, 0x10, 0xc4, 0x50, 0x0, 0xd1, 0x29, + 0xdc, 0xda, 0xc0, 0xc0, 0x5, 0x81, 0xc0, 0xa0, + 0xa2, 0xc0, 0x75, 0x1e, 0x9c, 0x45, 0xd5, 0xd5, + 0xd6, 0x63, 0x5, 0x7b, 0x25, 0x55, 0x55, 0xc7, + 0x53, 0x0, 0xb1, 0xa3, 0xcb, 0xc6, 0x93, 0x91, + 0xa, 0xcb, 0xe4, 0x70, 0x47, 0x86, 0xa0, 0x6, + 0x30, 0x54, 0xdb, 0xc7, 0x5d, 0x30, 0x6, 0x44, + 0x93, 0x70, 0x47, 0x4c, 0x0, 0xb, 0x37, 0xa4, + 0xda, 0xc9, 0xcd, 0x9, 0xb, 0x19, 0x66, 0x80, + 0x4f, 0x49, 0x78, 0x17, 0x4, 0x0, 0x0, 0x84, + 0x2, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7E70 "繰" */ + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x2e, 0xbb, 0xca, 0x0, 0x0, 0xb2, + 0x20, 0x2b, 0x0, 0x3a, 0x0, 0x5, 0x82, 0xc0, + 0x1a, 0x99, 0xa7, 0x0, 0x2e, 0xad, 0x35, 0xbb, + 0x94, 0xbb, 0xc0, 0x4, 0x7a, 0x36, 0x40, 0xc5, + 0x60, 0xc0, 0x2, 0xc0, 0xa6, 0xcb, 0xc5, 0xdb, + 0xe0, 0x1d, 0xba, 0xd0, 0x0, 0x28, 0x0, 0x0, + 0x5, 0x20, 0x69, 0xcc, 0xde, 0xcc, 0xc1, 0x9, + 0x47, 0x90, 0x6, 0xcc, 0xb0, 0x0, 0xc, 0x29, + 0x90, 0x5b, 0x4a, 0x5b, 0x0, 0x1b, 0x1a, 0x3b, + 0xa0, 0x3a, 0x5, 0xd2, 0x37, 0x4, 0x3, 0x0, + 0x3a, 0x0, 0x20, + + /* U+7E7C "繼" */ + 0x0, 0x5, 0x0, 0x1, 0x20, 0x13, 0x0, 0x0, + 0x58, 0xa, 0x28, 0x30, 0x83, 0x0, 0x0, 0xb2, + 0x2a, 0x5c, 0xa4, 0xc8, 0x50, 0x3, 0x93, 0x9a, + 0x6a, 0x73, 0x89, 0x20, 0xc, 0x7b, 0x2a, 0x6d, + 0xa7, 0xd8, 0xa0, 0x8, 0x99, 0xa, 0x65, 0x28, + 0x53, 0x70, 0x0, 0xb4, 0x6a, 0xaa, 0xa9, 0xab, + 0x90, 0x9, 0x96, 0xaa, 0x27, 0x30, 0x64, 0x0, + 0xa, 0x75, 0xaa, 0x5c, 0x94, 0xc6, 0x60, 0x5, + 0x35, 0x6a, 0x68, 0x82, 0x7b, 0x20, 0xb, 0x37, + 0xaa, 0x5c, 0x96, 0xb7, 0xb0, 0xb, 0x19, 0x9a, + 0x55, 0x37, 0x63, 0x60, 0x29, 0x8, 0x7, 0xbb, + 0xbb, 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7E8C "續" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1a, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x77, + 0xa, 0xaa, 0xce, 0xaa, 0xa1, 0x0, 0xc1, 0x42, + 0x66, 0x9c, 0x66, 0x30, 0x5, 0x83, 0x91, 0x44, + 0x44, 0x44, 0x20, 0x1e, 0x8c, 0x1d, 0xac, 0xca, + 0xea, 0xe0, 0x18, 0x98, 0xd, 0x16, 0x71, 0xb1, + 0xd0, 0x1, 0xb1, 0x97, 0x88, 0x88, 0x88, 0x80, + 0xc, 0xa9, 0xd5, 0xb8, 0x88, 0x8a, 0x70, 0x7, + 0x41, 0x77, 0xb7, 0x77, 0x7a, 0x80, 0x8, 0x46, + 0x96, 0xb7, 0x77, 0x7a, 0x80, 0xc, 0x28, 0xa6, + 0xc9, 0x99, 0x9b, 0x80, 0x1b, 0x1a, 0x40, 0x5c, + 0x20, 0xa8, 0x10, 0x36, 0x4, 0xc, 0x71, 0x0, + 0x4, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7EDF "统" */ + 0x0, 0x1c, 0x0, 0x0, 0x84, 0x0, 0x0, 0x0, + 0x7a, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x0, 0xd2, + 0x6, 0xdd, 0xde, 0xdd, 0xd1, 0x6, 0x90, 0xb1, + 0x3, 0xd0, 0x0, 0x0, 0x2d, 0x37, 0xb0, 0xd, + 0x30, 0x87, 0x0, 0x8e, 0xcf, 0x20, 0x98, 0x2, + 0x4e, 0x20, 0x0, 0x97, 0x9, 0xff, 0xdb, 0xaa, + 0xb0, 0x5, 0xb0, 0x21, 0x1a, 0x4, 0x60, 0x60, + 0x4f, 0xdd, 0xa0, 0x1d, 0x5, 0x80, 0x0, 0x35, + 0x10, 0x0, 0x3b, 0x5, 0x80, 0x0, 0x0, 0x15, + 0xa0, 0x87, 0x5, 0x80, 0x51, 0x4c, 0xd8, 0x34, + 0xd1, 0x5, 0x90, 0xa2, 0x22, 0x0, 0x6d, 0x30, + 0x2, 0xdd, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+7F3A "缺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x60, 0x0, 0x0, 0xe, 0x0, 0x0, 0xa, 0x30, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0xff, 0xfd, + 0x1, 0x1e, 0x11, 0x0, 0x59, 0x1b, 0x0, 0x4c, + 0xcf, 0xcf, 0x0, 0x72, 0x1b, 0x0, 0x0, 0xe, + 0xe, 0x0, 0x46, 0x7d, 0x66, 0x0, 0xe, 0xe, + 0x0, 0x35, 0x6d, 0x55, 0x22, 0x3d, 0x2e, 0x20, + 0x17, 0x1b, 0x8, 0x6a, 0xbf, 0xca, 0x90, 0x1a, + 0x1b, 0xc, 0x0, 0x7c, 0xa0, 0x0, 0x1a, 0x1b, + 0xc, 0x0, 0xc3, 0xc1, 0x0, 0x1a, 0x4d, 0x6c, + 0x3, 0xd0, 0x68, 0x0, 0x1c, 0xa7, 0x5c, 0x1d, + 0x30, 0xd, 0x50, 0x0, 0x0, 0x0, 0xa5, 0x0, + 0x2, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7F6E "置" */ + 0x5, 0xdb, 0xbe, 0xbb, 0xeb, 0xbd, 0x70, 0x5, + 0x91, 0x3c, 0x11, 0xc3, 0x17, 0x70, 0x2, 0x77, + 0x77, 0xda, 0x77, 0x77, 0x30, 0xb, 0xbb, 0xbb, + 0xec, 0xbb, 0xbb, 0xa0, 0x0, 0x1, 0x11, 0xe1, + 0x11, 0x10, 0x0, 0x0, 0x4d, 0x88, 0x88, 0x88, + 0xd4, 0x0, 0x0, 0x4d, 0x99, 0x99, 0x99, 0xd4, + 0x0, 0x0, 0x4a, 0x11, 0x11, 0x11, 0xb4, 0x0, + 0x0, 0x4c, 0x88, 0x88, 0x88, 0xd4, 0x0, 0x0, + 0x4d, 0x99, 0x99, 0x99, 0xd4, 0x0, 0x0, 0x49, + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x1b, 0xce, 0xbb, + 0xbb, 0xbb, 0xec, 0xb2, + + /* U+7F8E "美" */ + 0x0, 0x7, 0x50, 0x0, 0x6, 0x60, 0x0, 0x0, + 0x2, 0xe1, 0x0, 0x1e, 0x10, 0x0, 0x8, 0xdd, + 0xfd, 0xdd, 0xef, 0xdd, 0x80, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0xcd, 0xdd, 0xee, + 0xdd, 0xdd, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x0, 0x2b, 0xbb, 0xbb, 0xdd, 0xbb, 0xbb, + 0xb3, 0x1, 0x11, 0x11, 0xb5, 0x11, 0x11, 0x10, + 0xb, 0xcc, 0xcc, 0xfd, 0xcc, 0xcc, 0xc1, 0x0, + 0x0, 0x6, 0xbc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0x22, 0xd6, 0x0, 0x0, 0x3, 0x6c, 0xc2, + 0x0, 0x1b, 0xd7, 0x30, 0x2b, 0x73, 0x0, 0x0, + 0x0, 0x27, 0xb1, + + /* U+7FA9 "義" */ + 0x0, 0x1, 0x30, 0x0, 0x5, 0x20, 0x0, 0x0, + 0x1, 0xd1, 0x0, 0x1d, 0x10, 0x0, 0x7, 0xbb, + 0xbb, 0xdd, 0xbb, 0xbb, 0x70, 0x0, 0x56, 0x66, + 0xba, 0x66, 0x65, 0x0, 0x0, 0x33, 0x33, 0x99, + 0x33, 0x33, 0x0, 0x2b, 0xbb, 0xbb, 0xdd, 0xbb, + 0xbb, 0xb2, 0x4, 0x57, 0x9a, 0x84, 0x81, 0xa3, + 0x0, 0x5, 0x46, 0xb0, 0x3, 0xb0, 0x2b, 0x20, + 0x2b, 0xbc, 0xeb, 0xbc, 0xfc, 0xbc, 0xb3, 0x0, + 0x3, 0xb1, 0x31, 0xa4, 0x29, 0x0, 0x2b, 0xbc, + 0xe9, 0x72, 0x3d, 0xc1, 0x0, 0x0, 0x3, 0xb0, + 0x17, 0xcc, 0xa0, 0x75, 0x0, 0xbc, 0x71, 0xc6, + 0x0, 0x7d, 0xc1, + + /* U+7FD2 "習" */ + 0x3c, 0xcc, 0xcd, 0xac, 0xcc, 0xcc, 0x6, 0x40, + 0xd, 0x7, 0x20, 0xc, 0x2, 0x97, 0x1d, 0x5, + 0xa9, 0x3c, 0x0, 0x3a, 0xbd, 0x0, 0x6c, 0x9c, + 0x2c, 0xa3, 0xd, 0x6d, 0x71, 0xc, 0x1, 0x0, + 0x9, 0x50, 0x0, 0x7, 0x1, 0xbb, 0xbe, 0xcb, + 0xbb, 0xa0, 0x2, 0xc0, 0x0, 0x0, 0x1, 0xe0, + 0x2, 0xea, 0xaa, 0xaa, 0xab, 0xe0, 0x2, 0xc1, + 0x11, 0x11, 0x12, 0xe0, 0x2, 0xc0, 0x0, 0x0, + 0x1, 0xe0, 0x2, 0xfc, 0xcc, 0xcc, 0xcc, 0xe0, + + /* U+8001 "老" */ + 0x0, 0x0, 0x3, 0xb0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x3, 0xb0, 0x0, 0xb, 0x70, 0x0, 0xbd, + 0xde, 0xfd, 0xdd, 0xba, 0x0, 0x0, 0x0, 0x3, + 0xb0, 0x7, 0xc0, 0x0, 0x0, 0x0, 0x3, 0xb0, + 0x9c, 0x0, 0x0, 0x1e, 0xee, 0xee, 0xfe, 0xfe, + 0xee, 0xe6, 0x0, 0x0, 0x5, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xbd, 0x20, 0x0, 0x51, 0x0, + 0x3, 0xbd, 0x9a, 0x3, 0x9d, 0x92, 0x0, 0x1c, + 0x60, 0x4e, 0xd9, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x4b, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x1c, 0xdd, + 0xdd, 0xde, 0x50, + + /* U+8003 "考" */ + 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xc0, 0x0, 0xc, 0x20, 0x0, 0x9c, + 0xcd, 0xfc, 0xcc, 0xb4, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0x2c, 0x30, 0x0, 0xc, 0xcc, 0xcc, 0xfc, + 0xfe, 0xcc, 0xc1, 0x0, 0x0, 0x2, 0xbc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xee, 0xbb, 0xbb, 0xb9, 0x0, + 0x2d, 0xb4, 0x96, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0xcc, 0xcc, 0xcc, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x0, 0x0, 0x0, 0x0, 0xad, + 0xdc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8005 "者" */ + 0x0, 0x0, 0x5, 0x90, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x5, 0x90, 0x0, 0x1d, 0x30, 0x0, 0xdd, + 0xde, 0xed, 0xdd, 0xc4, 0x0, 0x0, 0x0, 0x5, + 0x90, 0xb, 0x60, 0x0, 0x0, 0x0, 0x5, 0x91, + 0xc7, 0x0, 0x0, 0x3d, 0xdd, 0xdd, 0xff, 0xdd, + 0xdd, 0xd3, 0x0, 0x0, 0x3b, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xff, 0xcc, 0xcc, 0xc6, 0x0, + 0x3d, 0x97, 0xa0, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x4, 0xeb, 0xbb, 0xbb, 0xd7, 0x0, 0x0, 0x4, + 0xa0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x4, 0xa0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x4, 0xfd, 0xdd, + 0xdd, 0xe7, 0x0, + + /* U+800C "而" */ + 0x1e, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe6, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0x0, 0x4, 0xed, 0xee, + 0xfd, 0xee, 0xde, 0xa0, 0x5, 0x90, 0xd, 0x0, + 0xa3, 0x3, 0xb0, 0x5, 0x90, 0xd, 0x0, 0xa3, + 0x3, 0xb0, 0x5, 0x90, 0xd, 0x0, 0xa3, 0x3, + 0xb0, 0x5, 0x90, 0xd, 0x0, 0xa3, 0x3, 0xb0, + 0x5, 0x90, 0xd, 0x0, 0xa3, 0x3, 0xb0, 0x5, + 0x90, 0xd, 0x0, 0xa3, 0x3, 0xb0, 0x5, 0x90, + 0xd, 0x0, 0xa3, 0x4, 0xb0, 0x5, 0x90, 0x8, + 0x0, 0x64, 0xdd, 0x60, + + /* U+8033 "耳" */ + 0x1e, 0xef, 0xfe, 0xee, 0xef, 0xfe, 0xe1, 0x0, + 0xd, 0x10, 0x0, 0x1, 0xe0, 0x0, 0x0, 0xd, + 0x10, 0x0, 0x1, 0xe0, 0x0, 0x0, 0xd, 0xed, + 0xdd, 0xde, 0xe0, 0x0, 0x0, 0xd, 0x10, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0xd, 0x10, 0x0, 0x1, + 0xe0, 0x0, 0x0, 0xd, 0xed, 0xdd, 0xde, 0xe0, + 0x0, 0x0, 0xd, 0x10, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x13, 0xe4, 0x51, 0x2a, + 0xbf, 0xde, 0xee, 0xdc, 0xfa, 0x92, 0x15, 0x43, + 0x20, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x0, + + /* U+805E "聞" */ + 0xea, 0xaa, 0xf0, 0xbb, 0xaa, 0xbc, 0xe1, 0x11, + 0xe0, 0xb3, 0x11, 0x3c, 0xe9, 0x99, 0xf0, 0xba, + 0x99, 0xac, 0xe5, 0x55, 0xe0, 0xb7, 0x55, 0x6c, + 0xe4, 0x44, 0x40, 0x34, 0x44, 0x5c, 0xe0, 0xae, + 0xbb, 0xbe, 0xb1, 0x1c, 0xe0, 0xd, 0x55, 0x5d, + 0x0, 0x1c, 0xe0, 0xd, 0x44, 0x4d, 0x0, 0x1c, + 0xe0, 0xd, 0xa9, 0x9e, 0x0, 0x1c, 0xe0, 0x3d, + 0x56, 0x7e, 0x99, 0x1c, 0xe0, 0x98, 0x65, 0x4d, + 0x21, 0x2c, 0xe0, 0x0, 0x0, 0x7, 0x1e, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+806F "聯" */ + 0x0, 0x0, 0x0, 0x4, 0x0, 0x4, 0x0, 0x1e, + 0xed, 0xf7, 0x39, 0x0, 0x38, 0x0, 0x4, 0x80, + 0xd0, 0xa2, 0x90, 0xa1, 0x80, 0x4, 0x80, 0xd6, + 0xed, 0x47, 0xee, 0x40, 0x4, 0xec, 0xe1, 0x59, + 0x11, 0x49, 0x30, 0x4, 0x80, 0xd3, 0xc3, 0xb2, + 0xc4, 0xa3, 0x4, 0xb5, 0xd6, 0x97, 0x88, 0x86, + 0x47, 0x4, 0xda, 0xd0, 0xb0, 0xc0, 0xc0, 0x60, + 0x4, 0x80, 0xd0, 0xc0, 0xc0, 0xd0, 0xc0, 0x4, + 0x81, 0xe3, 0xd7, 0xd0, 0xe7, 0xd0, 0x1d, 0xec, + 0xe4, 0x56, 0xc0, 0xe5, 0xc0, 0x1, 0x0, 0xd0, + 0x8, 0x60, 0xd0, 0x0, 0x0, 0x0, 0xd0, 0x87, + 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8072 "聲" */ + 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, 0x19, + 0x9c, 0xb9, 0x90, 0xea, 0xc7, 0x0, 0x6, 0x9a, + 0xa9, 0x59, 0x70, 0x3c, 0x90, 0x5, 0x99, 0x99, + 0x58, 0xc9, 0x9c, 0x10, 0x8, 0x36, 0x43, 0x80, + 0x68, 0x98, 0x0, 0xc, 0x98, 0x88, 0x54, 0x8d, + 0xd7, 0x30, 0x1b, 0x33, 0x33, 0x4b, 0x64, 0x47, + 0xb0, 0x7, 0x8e, 0x77, 0x77, 0x77, 0xf7, 0x70, + 0x0, 0xf, 0xaa, 0xaa, 0xaa, 0xf0, 0x0, 0x0, + 0xe, 0x44, 0x44, 0x44, 0xf0, 0x0, 0x0, 0xe, + 0x55, 0x55, 0x55, 0xf0, 0x0, 0x1b, 0xbf, 0xcc, + 0xcb, 0xbb, 0xfb, 0xb1, 0x1, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, + + /* U+8077 "職" */ + 0x0, 0x0, 0x0, 0x53, 0x3, 0xb0, 0x0, 0x5f, + 0xde, 0xd0, 0x49, 0x2, 0xb7, 0x10, 0x9, 0x16, + 0x5a, 0xcc, 0xc6, 0xc5, 0x90, 0x9, 0x16, 0x54, + 0x61, 0xb1, 0xc0, 0xa0, 0x9, 0xde, 0x56, 0xb7, + 0x95, 0xd4, 0x40, 0x9, 0x16, 0x66, 0x66, 0x66, + 0xe6, 0x60, 0x9, 0x69, 0x56, 0xbb, 0xc0, 0xd0, + 0x80, 0x9, 0x8b, 0x57, 0x30, 0xb0, 0xc3, 0xa0, + 0x9, 0x16, 0x57, 0xcb, 0xe0, 0xac, 0x20, 0x9, + 0x6a, 0xd7, 0x30, 0xb0, 0x8a, 0x11, 0x6c, 0x89, + 0x57, 0xcb, 0xe0, 0xc9, 0x47, 0x0, 0x6, 0x57, + 0x30, 0x69, 0x2c, 0x84, 0x0, 0x6, 0x50, 0x0, + 0x91, 0x6, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+807D "聽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x6e, 0xdc, + 0xed, 0xba, 0xbe, 0xaa, 0xa0, 0x9, 0x96, 0xc4, + 0x11, 0x78, 0x11, 0x10, 0x9, 0x63, 0xb4, 0x9b, + 0xec, 0xdb, 0xa0, 0x9, 0xca, 0xd4, 0x90, 0xa0, + 0xa0, 0xc0, 0x9, 0x30, 0x94, 0xa2, 0xb2, 0xb2, + 0xc0, 0x3c, 0xba, 0xd4, 0x79, 0x99, 0x99, 0x70, + 0x25, 0x44, 0x96, 0xbb, 0xbb, 0xbb, 0xb3, 0x16, + 0xd6, 0x94, 0x11, 0x83, 0x11, 0x10, 0x8, 0xe7, + 0x94, 0x56, 0x4c, 0x8, 0x20, 0x1, 0xc1, 0x94, + 0xba, 0x26, 0x34, 0xb0, 0x26, 0xeb, 0xa9, 0x7a, + 0x20, 0xc, 0x93, 0x36, 0x41, 0x97, 0x16, 0xdc, + 0xc7, 0x10, + + /* U+8089 "肉" */ + 0x0, 0x0, 0x9, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x30, 0x0, 0x0, 0xbd, 0xdd, 0xdf, 0xed, + 0xdd, 0xd2, 0xd2, 0x0, 0x5e, 0x10, 0x0, 0xb2, + 0xd1, 0x0, 0xca, 0xd4, 0x0, 0xb2, 0xd1, 0xa, + 0x90, 0x2c, 0x90, 0xb2, 0xd2, 0xd6, 0xb, 0x20, + 0x93, 0xb2, 0xd1, 0x0, 0x1e, 0x0, 0x0, 0xb2, + 0xd1, 0x0, 0xab, 0xc2, 0x0, 0xb2, 0xd1, 0x9, + 0xa0, 0x4d, 0x40, 0xb2, 0xd3, 0xd7, 0x0, 0x2, + 0xd2, 0xb2, 0xd1, 0x0, 0x0, 0x0, 0x0, 0xc2, + 0xd1, 0x0, 0x0, 0x0, 0xee, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+80A9 "肩" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0x0, 0x9a, 0xaa, + 0xbf, 0xaa, 0xa9, 0x0, 0xe, 0x32, 0x22, 0x22, + 0x22, 0xe0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe, + 0x0, 0xe, 0xdc, 0xcc, 0xcc, 0xcc, 0xd0, 0x0, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x1f, + 0xbb, 0xbb, 0xbb, 0xe3, 0x1, 0xc1, 0xd0, 0x0, + 0x0, 0xb, 0x30, 0x3b, 0x1f, 0xaa, 0xaa, 0xaa, + 0xe3, 0x7, 0x71, 0xd0, 0x0, 0x0, 0xb, 0x30, + 0xc3, 0x1f, 0xbb, 0xbb, 0xbb, 0xe3, 0x4c, 0x1, + 0xd0, 0x0, 0x0, 0xb, 0x31, 0x20, 0x1d, 0x0, + 0x0, 0x8c, 0xc1, + + /* U+80AF "肯" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x78, 0x11, 0x11, 0x0, 0x0, 0xe, + 0x0, 0x7d, 0xbb, 0xb8, 0x0, 0x0, 0xe, 0x0, + 0x77, 0x0, 0x0, 0x0, 0xd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xcc, 0xcc, 0xcc, 0xe5, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x95, 0x0, + 0x0, 0x5e, 0xbb, 0xbb, 0xbb, 0xe5, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x5e, + 0xcc, 0xcc, 0xcc, 0xe5, 0x0, 0x0, 0x59, 0x0, + 0x0, 0x0, 0x95, 0x0, 0x0, 0x59, 0x0, 0x0, + 0x9c, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+80B2 "育" */ + 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x8a, 0x11, 0x11, 0x10, 0x1c, 0xcc, + 0xdf, 0xcc, 0xdd, 0xcc, 0xc2, 0x0, 0x5, 0xc3, + 0x0, 0x2b, 0x50, 0x0, 0x0, 0xbf, 0xbc, 0xcd, + 0xcc, 0xd9, 0x0, 0x0, 0x33, 0x21, 0x0, 0x0, + 0x8, 0x20, 0x0, 0x2e, 0xcc, 0xcc, 0xcc, 0xe3, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xa4, 0x0, + 0x0, 0x2e, 0xbb, 0xbb, 0xbb, 0xe4, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x2e, + 0xbb, 0xbb, 0xbb, 0xe4, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x0, 0x2c, 0x0, 0x3, + 0xcb, 0xd1, 0x0, + + /* U+80CC "背" */ + 0x0, 0x0, 0x3b, 0x1, 0xd0, 0x2, 0x0, 0x9, + 0xbb, 0xcb, 0x1, 0xe5, 0xbc, 0x20, 0x0, 0x0, + 0x4b, 0x1, 0xf7, 0x20, 0x0, 0x1, 0x36, 0xab, + 0x1, 0xe0, 0x0, 0xa0, 0x2b, 0x85, 0x5b, 0x0, + 0xdc, 0xcc, 0xb0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xbb, 0xbb, 0xbb, 0xf2, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0xc2, 0x0, + 0x0, 0x1f, 0xbb, 0xbb, 0xbb, 0xe2, 0x0, 0x0, + 0x1d, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x1f, + 0xbb, 0xbb, 0xbb, 0xe2, 0x0, 0x0, 0x1d, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x6c, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+80F8 "胸" */ + 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0xa, + 0xed, 0xd0, 0x5a, 0x0, 0x0, 0x0, 0xa, 0x20, + 0xd0, 0xce, 0xdd, 0xdd, 0xe4, 0xa, 0x20, 0xd7, + 0xa0, 0x0, 0x0, 0x85, 0xa, 0xed, 0xed, 0x27, + 0x8, 0x21, 0x85, 0xb, 0x20, 0xd4, 0x88, 0x5a, + 0x1a, 0x85, 0xb, 0x10, 0xd3, 0x80, 0xd5, 0x1a, + 0x85, 0xc, 0xcb, 0xd3, 0x83, 0xaa, 0x1a, 0x85, + 0xc, 0x21, 0xd3, 0x9c, 0x17, 0x6a, 0x85, 0xc, + 0x0, 0xd3, 0xa3, 0x0, 0x5a, 0x94, 0xc, 0x0, + 0xd3, 0xec, 0xcc, 0xca, 0xa4, 0x48, 0x0, 0xd0, + 0x0, 0x0, 0x0, 0xc2, 0x73, 0x7d, 0x90, 0x0, + 0x1, 0xdd, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+80FD "能" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x86, 0x0, 0xb, 0x30, 0x0, 0x0, 0x1, 0xd0, + 0xb3, 0xb, 0x30, 0x39, 0x10, 0xa, 0x60, 0x3c, + 0xb, 0x9c, 0xb4, 0x0, 0x3f, 0xcc, 0xce, 0x4b, + 0x70, 0x0, 0x0, 0x1, 0x0, 0x2, 0x2b, 0x30, + 0x0, 0xb0, 0xa, 0xcc, 0xcc, 0x9, 0xb8, 0x89, + 0xd0, 0xc, 0x10, 0xe, 0x3, 0x54, 0x44, 0x10, + 0xc, 0xcb, 0xbf, 0xb, 0x30, 0x5, 0x10, 0xc, + 0x10, 0xe, 0xb, 0x67, 0xda, 0x20, 0xc, 0xcb, + 0xbf, 0xb, 0xa4, 0x0, 0x0, 0xc, 0x10, 0xe, + 0xb, 0x30, 0x0, 0x81, 0xc, 0x10, 0xe, 0xb, + 0x40, 0x0, 0xc1, 0xc, 0x15, 0xdb, 0x5, 0xdd, + 0xdd, 0x90, + + /* U+8131 "脱" */ + 0x0, 0x0, 0x0, 0x4, 0x0, 0x5, 0x0, 0xa, + 0xed, 0xf0, 0xc, 0x30, 0x3c, 0x0, 0xa, 0x20, + 0xd0, 0x5, 0x90, 0xb4, 0x0, 0xa, 0x20, 0xd0, + 0xcc, 0xcc, 0xec, 0x40, 0xa, 0xdd, 0xf0, 0xe0, + 0x0, 0x6, 0x50, 0xa, 0x20, 0xd0, 0xe0, 0x0, + 0x6, 0x50, 0xb, 0x10, 0xd0, 0xe8, 0x88, 0x8b, + 0x50, 0xb, 0xcb, 0xf0, 0x37, 0xc4, 0xe4, 0x10, + 0xc, 0x21, 0xd0, 0x5, 0x90, 0xe0, 0x0, 0xc, + 0x0, 0xd0, 0x9, 0x60, 0xe0, 0x0, 0xc, 0x0, + 0xd0, 0x1e, 0x10, 0xe0, 0x61, 0x48, 0x0, 0xd0, + 0xb7, 0x0, 0xe0, 0xa2, 0x74, 0x4d, 0xbb, 0x80, + 0x0, 0xad, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+814A "腊" */ + 0x0, 0x0, 0x0, 0xe, 0x0, 0xe0, 0x0, 0xa, + 0xed, 0xe0, 0xe, 0x0, 0xe0, 0x0, 0xa, 0x20, + 0xd6, 0xdf, 0xdd, 0xfd, 0x80, 0xa, 0x20, 0xd0, + 0xe, 0x0, 0xe0, 0x0, 0xa, 0xed, 0xe0, 0xe, + 0x0, 0xe0, 0x0, 0xb, 0x30, 0xd9, 0xdd, 0xdd, + 0xdd, 0xd0, 0xb, 0x20, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x87, 0xd0, 0xcd, 0xcc, 0xce, 0x0, + 0xc, 0x65, 0xd0, 0xc1, 0x0, 0xe, 0x0, 0xc, + 0x0, 0xd0, 0xcc, 0xbb, 0xce, 0x0, 0xc, 0x0, + 0xd0, 0xc1, 0x0, 0xe, 0x0, 0x48, 0x0, 0xd0, + 0xc3, 0x22, 0x2e, 0x0, 0x92, 0x7d, 0x80, 0xcb, + 0xaa, 0xad, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8155 "腕" */ + 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0xa, + 0xed, 0xc0, 0x11, 0x79, 0x11, 0x10, 0xa, 0x10, + 0xc9, 0xcb, 0xbb, 0xbb, 0xe3, 0xa, 0x10, 0xc9, + 0x50, 0x0, 0x0, 0xa3, 0xa, 0xcb, 0xc2, 0xb3, + 0x3, 0x55, 0x60, 0xa, 0x31, 0xc0, 0xdb, 0xda, + 0x76, 0xc0, 0xb, 0x10, 0xc4, 0x80, 0xba, 0x20, + 0xc0, 0xb, 0x76, 0xdc, 0x74, 0x9a, 0x20, 0xc0, + 0xc, 0x76, 0xd5, 0x3e, 0x5a, 0x20, 0xc0, 0xc, + 0x0, 0xc0, 0xb, 0x1a, 0x7b, 0x60, 0x1c, 0x0, + 0xc0, 0x3a, 0xa, 0x20, 0x21, 0x58, 0x0, 0xc1, + 0xc2, 0x9, 0x30, 0x65, 0x73, 0x7d, 0x9a, 0x50, + 0x5, 0xcb, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8166 "腦" */ + 0x0, 0x0, 0x0, 0x14, 0x4, 0x0, 0x50, 0xa, + 0xed, 0xd0, 0xa4, 0x2b, 0x7, 0x60, 0xa, 0x20, + 0xd4, 0xb0, 0xb2, 0x3b, 0x0, 0xa, 0x20, 0xd3, + 0xb0, 0x94, 0x3c, 0x0, 0xa, 0xdd, 0xd0, 0x77, + 0xc, 0x14, 0xa0, 0xb, 0x20, 0xd0, 0x6, 0x59, + 0x20, 0x60, 0xb, 0x10, 0xd0, 0xaa, 0xec, 0xaa, + 0x90, 0xc, 0xcb, 0xd0, 0xe1, 0x20, 0x71, 0xd0, + 0xc, 0x21, 0xd0, 0xd2, 0xc7, 0xa0, 0xd0, 0xc, + 0x0, 0xd0, 0xd0, 0x5f, 0x50, 0xd0, 0xc, 0x0, + 0xd0, 0xd6, 0xb2, 0xc2, 0xd0, 0x38, 0x0, 0xd0, + 0xe4, 0x11, 0x21, 0xd0, 0x73, 0x7d, 0x90, 0xfb, + 0xbb, 0xbb, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8170 "腰" */ + 0xb, 0xdd, 0xc8, 0xdd, 0xfd, 0xfd, 0xd2, 0xb, + 0x10, 0xc0, 0x1, 0xb0, 0xc0, 0x0, 0xb, 0x10, + 0xc4, 0xed, 0xfc, 0xfd, 0xb0, 0xb, 0xdd, 0xc4, + 0x80, 0xa0, 0xc0, 0xc0, 0xb, 0x10, 0xc4, 0x80, + 0xa0, 0xc0, 0xc0, 0xb, 0x10, 0xc3, 0xcc, 0xcc, + 0xcc, 0x90, 0xc, 0x76, 0xc0, 0x1, 0xd0, 0x0, + 0x0, 0xc, 0x66, 0xc7, 0xcf, 0xdc, 0xdf, 0xd4, + 0xc, 0x0, 0xc0, 0x4c, 0x0, 0x4b, 0x0, 0xc, + 0x0, 0xc0, 0x8c, 0x74, 0xd3, 0x0, 0x48, 0x0, + 0xc0, 0x1, 0xbe, 0xd6, 0x0, 0x83, 0x7d, 0x96, + 0xcb, 0x60, 0x18, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+819D "膝" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0xa, + 0xed, 0xe1, 0x22, 0x2e, 0x22, 0x20, 0xa, 0x20, + 0xd5, 0xab, 0xff, 0xfb, 0xa3, 0xa, 0x20, 0xd0, + 0x1b, 0x7d, 0x6a, 0x0, 0xa, 0xdd, 0xe9, 0xd4, + 0x8, 0x4, 0xc1, 0xa, 0x20, 0xd2, 0x0, 0xad, + 0x50, 0x20, 0xb, 0x10, 0xd0, 0x3b, 0x60, 0x99, + 0x10, 0xb, 0xcb, 0xea, 0xc3, 0xa, 0x5, 0xc6, + 0xc, 0x21, 0xd1, 0x5a, 0xd, 0xb, 0x20, 0xc, + 0x0, 0xd0, 0x8, 0x6e, 0xb4, 0x0, 0xc, 0x0, + 0xd0, 0x19, 0xbe, 0xa8, 0x0, 0x48, 0x0, 0xd7, + 0xc4, 0xd, 0x6, 0xc0, 0x73, 0x6d, 0xa0, 0x4, + 0xba, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+81C9 "臉" */ + 0x0, 0x0, 0x0, 0x0, 0x35, 0x0, 0x0, 0xa, + 0xed, 0xd0, 0x2, 0xec, 0x20, 0x0, 0xa, 0x20, + 0xd0, 0x4b, 0x22, 0xc7, 0x10, 0xa, 0x31, 0xd7, + 0xbd, 0xcc, 0xc8, 0xd0, 0xa, 0xcc, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x20, 0xd4, 0xbb, 0x57, + 0xbb, 0x50, 0xb, 0x10, 0xd5, 0x43, 0x79, 0x14, + 0x60, 0xb, 0x98, 0xd5, 0x43, 0x79, 0x14, 0x60, + 0xc, 0x66, 0xd4, 0xbb, 0x57, 0xbb, 0x50, 0xc, + 0x0, 0xd0, 0x45, 0x0, 0x94, 0x0, 0xc, 0x0, + 0xd0, 0xb8, 0x0, 0xf5, 0x0, 0x49, 0x0, 0xd5, + 0x88, 0x7a, 0x7b, 0x70, 0x74, 0x9d, 0xab, 0x0, + 0x68, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+81EA "自" */ + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0xce, 0xee, 0xfe, 0xee, 0xec, 0xd1, + 0x0, 0x0, 0x0, 0x1e, 0xd1, 0x0, 0x0, 0x0, + 0x1e, 0xde, 0xdd, 0xdd, 0xdd, 0xee, 0xd1, 0x0, + 0x0, 0x0, 0x1e, 0xd1, 0x0, 0x0, 0x0, 0x1e, + 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xd1, 0x0, 0x0, + 0x0, 0x1e, 0xd1, 0x0, 0x0, 0x0, 0x1e, 0xdd, + 0xcc, 0xcc, 0xcc, 0xde, 0xd2, 0x11, 0x11, 0x11, + 0x2d, + + /* U+81F3 "至" */ + 0xd, 0xee, 0xef, 0xee, 0xee, 0xee, 0xb0, 0x0, + 0x0, 0x8b, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5, + 0xd0, 0x0, 0x4d, 0x20, 0x0, 0x0, 0x4d, 0x10, + 0x0, 0x15, 0xe3, 0x0, 0x1, 0xfe, 0xdd, 0xdd, + 0xcb, 0xae, 0x20, 0x0, 0x10, 0x0, 0x44, 0x0, + 0x4, 0x30, 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, + 0x0, 0x0, 0xee, 0xee, 0xff, 0xee, 0xee, 0x10, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x2, 0x22, + 0x22, 0x88, 0x22, 0x22, 0x20, 0x2b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+81FA "臺" */ + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x1a, + 0xaa, 0xaa, 0xdd, 0xaa, 0xaa, 0xa1, 0x1, 0xaa, + 0xaa, 0xdc, 0xaa, 0xaa, 0x10, 0x0, 0x24, 0x44, + 0x44, 0x44, 0x42, 0x0, 0x0, 0x79, 0x55, 0x55, + 0x55, 0xa7, 0x0, 0x0, 0x6b, 0x99, 0x99, 0x99, + 0xb6, 0x0, 0x5, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x50, 0xd, 0x54, 0x44, 0x44, 0x44, 0x45, 0xd0, + 0x9, 0x59, 0xce, 0xa9, 0xbf, 0xa4, 0x90, 0x0, + 0xb, 0xd8, 0xa9, 0x79, 0xb5, 0x0, 0x0, 0x79, + 0x99, 0xcc, 0x99, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x1b, 0xbb, 0xbb, 0xdd, + 0xbb, 0xbb, 0xb1, + + /* U+8207 "與" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x97, 0x50, 0x0, 0x0, 0x0, 0x0, 0xca, + 0x47, 0x50, 0xa, 0xde, 0x50, 0x0, 0xb0, 0x7, + 0xdc, 0x80, 0x9, 0x50, 0x0, 0xd4, 0x37, 0x50, + 0x2, 0x3b, 0x40, 0x0, 0xd6, 0x57, 0xdc, 0x75, + 0x7d, 0x40, 0x0, 0xc0, 0x1, 0x3, 0x90, 0xa, + 0x40, 0x0, 0xdc, 0xa7, 0x43, 0x99, 0xcf, 0x30, + 0x0, 0xc0, 0x7, 0x43, 0x90, 0xb, 0x30, 0x0, + 0xc0, 0x7, 0x43, 0x90, 0xc, 0x20, 0x1d, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xd7, 0x0, 0x0, 0x93, + 0x0, 0x49, 0x10, 0x0, 0x0, 0x4d, 0x70, 0x0, + 0x5, 0xd9, 0x10, 0x9, 0xa2, 0x0, 0x0, 0x0, + 0x7, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8208 "興" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xda, 0x8c, 0xbb, 0xc8, 0xce, 0x40, 0x8, 0x50, + 0x66, 0x22, 0x66, 0x7, 0x40, 0x8, 0xa6, 0x77, + 0x77, 0x66, 0x5a, 0x40, 0x7, 0xa5, 0x76, 0x99, + 0x67, 0x6b, 0x30, 0x7, 0x70, 0x66, 0x66, 0x66, + 0x8, 0x30, 0x6, 0xec, 0x96, 0x66, 0x68, 0xbd, + 0x20, 0x6, 0x80, 0x66, 0xaa, 0x66, 0x19, 0x20, + 0x5, 0x80, 0x65, 0x0, 0x56, 0x9, 0x10, 0x7d, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, 0x0, 0x1, + 0x92, 0x0, 0x59, 0x10, 0x0, 0x0, 0x6e, 0x60, + 0x0, 0x5, 0xd7, 0x0, 0x2d, 0x81, 0x0, 0x0, + 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8209 "舉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xc4, 0x80, 0x0, 0x0, 0x0, 0x0, 0xba, + 0x54, 0xc7, 0x4b, 0xbe, 0x20, 0x0, 0xda, 0x93, + 0x92, 0x9, 0xae, 0x10, 0x0, 0xc0, 0x2, 0x9c, + 0x40, 0xd, 0x10, 0x0, 0xbb, 0xa4, 0x37, 0x4a, + 0xaf, 0x0, 0x0, 0xb1, 0x6, 0x47, 0x40, 0xe, + 0x0, 0xc, 0xcc, 0xfc, 0xcc, 0xcf, 0xdc, 0xc7, + 0x0, 0xa, 0x60, 0x76, 0x4, 0xc2, 0x0, 0x3, + 0xc6, 0xcc, 0xee, 0xcc, 0x5c, 0x81, 0xa, 0x20, + 0x0, 0x77, 0x0, 0x0, 0x65, 0x0, 0xac, 0xcc, + 0xee, 0xcc, 0xcc, 0x40, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x0, + + /* U+822A "航" */ + 0x0, 0x8, 0x0, 0x0, 0x62, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x8, 0xde, + 0xca, 0x22, 0x3d, 0x32, 0x20, 0x9, 0x41, 0xc, + 0x9a, 0xaa, 0xaa, 0xa3, 0x9, 0x4b, 0x1c, 0x1, + 0x11, 0x10, 0x0, 0x9, 0x35, 0x2c, 0xe, 0xaa, + 0xbb, 0x0, 0x4e, 0xdc, 0xcc, 0xe, 0x0, 0x2b, + 0x0, 0xa, 0x42, 0xc, 0xe, 0x0, 0x2b, 0x0, + 0xa, 0x3b, 0x1c, 0xd, 0x0, 0x2b, 0x0, 0xb, + 0x18, 0x5c, 0xd, 0x0, 0x2b, 0x0, 0xd, 0x0, + 0x1c, 0x2b, 0x0, 0x2b, 0x15, 0x2c, 0x0, 0x1c, + 0x76, 0x0, 0x2b, 0x28, 0x57, 0x7, 0xd9, 0xc0, + 0x0, 0xd, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+822C "般" */ + 0x0, 0x4, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0x42, 0x0, 0xfc, 0xce, 0x0, 0x3, 0xd9, + 0x9e, 0x10, 0xd0, 0xd, 0x0, 0x3, 0xa5, 0xc, + 0x13, 0xb0, 0xd, 0x0, 0x3, 0xa6, 0x5c, 0x2c, + 0x60, 0xb, 0xc6, 0x3, 0xa0, 0x1c, 0x14, 0x0, + 0x0, 0x0, 0x6d, 0xfd, 0xdf, 0x1c, 0xdd, 0xdd, + 0xa0, 0x4, 0x91, 0xc, 0x16, 0x90, 0x5, 0x70, + 0x6, 0x7a, 0x1c, 0x10, 0xe1, 0xc, 0x20, 0x7, + 0x63, 0x8c, 0x10, 0x6b, 0x69, 0x0, 0xb, 0x30, + 0xc, 0x10, 0xb, 0xe1, 0x0, 0x1e, 0x0, 0xc, + 0x12, 0xad, 0x9d, 0x50, 0x59, 0x4, 0xdc, 0x2d, + 0x70, 0x2, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8239 "船" */ + 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x0, 0x4, 0xfd, 0xdd, 0x0, 0x9, 0xdc, + 0xce, 0x4, 0x90, 0xd, 0x0, 0x9, 0x45, 0xd, + 0x5, 0x80, 0xd, 0x0, 0x9, 0x3b, 0x1d, 0x8, + 0x50, 0xd, 0x0, 0x9, 0x33, 0x2d, 0x3d, 0x0, + 0xd, 0x72, 0x6e, 0xcb, 0xbe, 0x31, 0x0, 0x1, + 0x41, 0xa, 0x44, 0xd, 0xc, 0xdd, 0xdd, 0x70, + 0xa, 0x2c, 0x1d, 0xd, 0x0, 0x5, 0x80, 0xb, + 0x15, 0x5d, 0xd, 0x0, 0x5, 0x80, 0xd, 0x0, + 0xd, 0xd, 0x0, 0x5, 0x80, 0x2b, 0x0, 0xd, + 0xd, 0xaa, 0xac, 0x80, 0x74, 0x4, 0xda, 0xd, + 0x33, 0x37, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+826F "良" */ + 0x0, 0x0, 0x35, 0x0, 0x0, 0x0, 0x2, 0x22, + 0x5d, 0x22, 0x22, 0x0, 0x4e, 0xaa, 0xaa, 0xaa, + 0xbd, 0x0, 0x4b, 0x0, 0x0, 0x0, 0x1d, 0x0, + 0x4e, 0xcc, 0xcc, 0xcc, 0xcd, 0x0, 0x4b, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x4b, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0x4f, 0xcc, 0xfc, 0xcc, 0xca, 0x0, + 0x4b, 0x0, 0x98, 0x0, 0x9, 0x70, 0x4b, 0x0, + 0xd, 0x54, 0xc7, 0x0, 0x4b, 0x0, 0x2, 0xde, + 0x20, 0x0, 0x4b, 0x27, 0xb2, 0x1a, 0xc4, 0x0, + 0xaf, 0xc7, 0x30, 0x0, 0x4b, 0xe4, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+8272 "色" */ + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xfb, 0xbb, 0xb5, 0x0, 0x0, 0x0, 0x1e, + 0x42, 0x25, 0xe1, 0x0, 0x0, 0x2, 0xd6, 0x0, + 0x1d, 0x30, 0x0, 0x0, 0x3e, 0xfe, 0xee, 0xff, + 0xee, 0xed, 0x0, 0x45, 0xc1, 0x0, 0xc2, 0x0, + 0xe, 0x0, 0x0, 0xc1, 0x0, 0xc2, 0x0, 0xe, + 0x0, 0x0, 0xc4, 0x22, 0xc5, 0x22, 0x2e, 0x0, + 0x0, 0xcb, 0xbb, 0xbb, 0xbb, 0xbe, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0x1, 0xe1, 0x0, 0x4d, 0xdd, 0xdd, + 0xdd, 0xde, 0x70, + + /* U+8282 "节" */ + 0x0, 0x0, 0xd1, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x1e, 0x0, 0x0, 0x3e, 0xee, + 0xfe, 0xee, 0xef, 0xee, 0xe3, 0x0, 0x0, 0xd1, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x2, 0x0, 0x0, 0x9, 0xee, 0xee, 0xee, 0xee, + 0xec, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x2d, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x2d, 0x0, + 0x0, 0x0, 0xe, 0x10, 0x0, 0x2d, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x2d, 0x0, 0x0, 0x0, + 0xe, 0x10, 0x8c, 0xea, 0x0, 0x0, 0x0, 0xe, + 0x10, 0x12, 0x10, 0x0, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, + + /* U+82B1 "花" */ + 0x0, 0x0, 0xb3, 0x0, 0x2c, 0x0, 0x0, 0x2, + 0x22, 0xc5, 0x22, 0x4d, 0x22, 0x20, 0x1c, 0xcc, + 0xfd, 0xcc, 0xcf, 0xcc, 0xc1, 0x0, 0x0, 0xb3, + 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x90, 0x8, + 0x30, 0x0, 0x0, 0x0, 0x8, 0x90, 0xa, 0x40, + 0x4, 0x20, 0x0, 0x3f, 0x10, 0xa, 0x41, 0x9d, + 0x30, 0x3, 0xef, 0x0, 0xa, 0xad, 0x70, 0x0, + 0xd, 0x4e, 0x0, 0x7e, 0x91, 0x0, 0x0, 0x0, + 0xe, 0x8, 0x7b, 0x40, 0x0, 0x0, 0x0, 0xe, + 0x0, 0xa, 0x40, 0x0, 0x74, 0x0, 0xe, 0x0, + 0xa, 0x50, 0x0, 0xa4, 0x0, 0xe, 0x0, 0x5, + 0xee, 0xee, 0xc0, + + /* U+82E5 "若" */ + 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0x1, + 0x11, 0xe1, 0x11, 0x1f, 0x11, 0x10, 0x1b, 0xbb, + 0xfb, 0xbb, 0xbf, 0xbb, 0xb2, 0x0, 0x0, 0xa1, + 0x80, 0xa, 0x0, 0x0, 0x0, 0x0, 0x7, 0x90, + 0x0, 0x0, 0x0, 0x3d, 0xdd, 0xef, 0xed, 0xdd, + 0xdd, 0xd3, 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xed, 0xdd, 0xdd, 0xdf, 0x0, 0x8, + 0xe9, 0x80, 0x0, 0x0, 0xe, 0x0, 0x39, 0x15, + 0x80, 0x0, 0x0, 0xe, 0x0, 0x0, 0x5, 0xda, + 0xaa, 0xaa, 0xaf, 0x0, 0x0, 0x5, 0x92, 0x22, + 0x22, 0x2e, 0x0, + + /* U+82E6 "苦" */ + 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0x3, + 0x33, 0xf3, 0x33, 0x3f, 0x33, 0x30, 0xa, 0xaa, + 0xfa, 0xaa, 0xaf, 0xaa, 0xa1, 0x0, 0x0, 0xb0, + 0x32, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xdd, 0xfe, 0xdd, + 0xdd, 0xd1, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, + 0x0, 0x7e, 0xdd, 0xee, 0xdd, 0xea, 0x0, 0x0, + 0x76, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x76, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x7d, 0xaa, + 0xaa, 0xaa, 0xca, 0x0, 0x0, 0x78, 0x22, 0x22, + 0x22, 0x6a, 0x0, + + /* U+82F1 "英" */ + 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0x2, + 0x22, 0xe2, 0x22, 0x2e, 0x22, 0x20, 0xa, 0xaa, + 0xfa, 0xaa, 0xaf, 0xaa, 0xa0, 0x0, 0x0, 0xa0, + 0x75, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x86, + 0x0, 0x0, 0x0, 0x0, 0xbd, 0xdd, 0xee, 0xdd, + 0xdc, 0x0, 0x0, 0xb2, 0x0, 0x86, 0x0, 0x2c, + 0x0, 0x0, 0xb2, 0x0, 0x96, 0x0, 0x2c, 0x0, + 0x2d, 0xfe, 0xdd, 0xfe, 0xdd, 0xef, 0xd3, 0x0, + 0x0, 0x2, 0xdc, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x42, 0xd4, 0x0, 0x0, 0x0, 0x4a, 0xd3, + 0x0, 0x2d, 0xa3, 0x0, 0x2e, 0xa5, 0x0, 0x0, + 0x0, 0x5b, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8336 "茶" */ + 0x0, 0x1, 0xd0, 0x0, 0xe, 0x0, 0x0, 0x1, + 0x12, 0xd1, 0x11, 0x1f, 0x11, 0x10, 0x1c, 0xcc, + 0xfc, 0xcc, 0xcf, 0xcc, 0xc1, 0x0, 0x1, 0x90, + 0xab, 0xa, 0x0, 0x0, 0x0, 0x0, 0x9, 0x66, + 0xb1, 0x0, 0x0, 0x0, 0x2, 0xb5, 0x22, 0x4d, + 0x50, 0x0, 0x2, 0x9c, 0x40, 0x77, 0x2, 0xbc, + 0x50, 0x2d, 0x72, 0x22, 0x99, 0x22, 0x26, 0xd4, + 0x0, 0x6b, 0xbb, 0xdd, 0xbb, 0xb6, 0x0, 0x0, + 0x3, 0x50, 0x77, 0x8, 0x10, 0x0, 0x0, 0x2d, + 0x20, 0x77, 0x4, 0xd3, 0x0, 0x6, 0xd3, 0x0, + 0x77, 0x0, 0x2d, 0x40, 0x2, 0x10, 0xd, 0xe4, + 0x0, 0x1, 0x0, + + /* U+8377 "荷" */ + 0x0, 0x0, 0xe0, 0x0, 0xe, 0x0, 0x0, 0x1c, + 0xcc, 0xfc, 0xcc, 0xcf, 0xcc, 0xc2, 0x0, 0x0, + 0xe1, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x4, 0x90, + 0x0, 0x5, 0x0, 0x0, 0x0, 0xe, 0x4d, 0xdd, + 0xdd, 0xdd, 0xd4, 0x0, 0x99, 0x0, 0x0, 0x0, + 0xe, 0x0, 0x7, 0xf6, 0x9, 0xaa, 0xa5, 0xe, + 0x0, 0x5d, 0x96, 0xe, 0x11, 0x68, 0xe, 0x0, + 0x12, 0x76, 0xd, 0x0, 0x58, 0xe, 0x0, 0x0, + 0x76, 0xe, 0x11, 0x68, 0xe, 0x0, 0x0, 0x76, + 0xe, 0xaa, 0xa5, 0xe, 0x0, 0x0, 0x76, 0x1, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x76, 0x0, 0x0, + 0x4d, 0xd9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+83D3 "菓" */ + 0x0, 0x0, 0xe0, 0x0, 0x1d, 0x0, 0x0, 0x1d, + 0xdd, 0xfd, 0xdd, 0xdf, 0xdd, 0xd2, 0x0, 0x0, + 0xd0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x8b, 0xbb, + 0xbb, 0xbb, 0xb9, 0x0, 0x0, 0xb2, 0x0, 0x86, + 0x0, 0x1c, 0x0, 0x0, 0xbb, 0xaa, 0xdd, 0xaa, + 0xbc, 0x0, 0x0, 0xb2, 0x0, 0x86, 0x0, 0x1c, + 0x0, 0x0, 0xbc, 0xbb, 0xed, 0xbb, 0xcc, 0x0, + 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, 0x2d, + 0xdd, 0xdf, 0xff, 0xed, 0xdd, 0xd3, 0x0, 0x1, + 0xaa, 0x97, 0xb8, 0x0, 0x0, 0x4, 0xac, 0x50, + 0x86, 0x6, 0xc9, 0x30, 0x3a, 0x30, 0x0, 0x86, + 0x0, 0x4, 0xb3, + + /* U+83DC "菜" */ + 0x0, 0x0, 0xd1, 0x0, 0x2c, 0x0, 0x0, 0x1d, + 0xdd, 0xfd, 0xdd, 0xdf, 0xdd, 0xd2, 0x0, 0x0, + 0xd1, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x43, + 0x45, 0x79, 0xca, 0x0, 0x7, 0xcb, 0xba, 0x98, + 0x64, 0x12, 0x0, 0x0, 0x91, 0x0, 0xd0, 0x0, + 0x1e, 0x10, 0x0, 0x5b, 0x0, 0x85, 0x0, 0xb4, + 0x0, 0x0, 0x4, 0x0, 0x76, 0x0, 0x50, 0x0, + 0x2d, 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0xd3, 0x0, + 0x0, 0x3c, 0xbb, 0xc2, 0x0, 0x0, 0x0, 0x7, + 0xd2, 0x87, 0x2d, 0x60, 0x0, 0x18, 0xe9, 0x10, + 0x87, 0x1, 0x9e, 0x91, 0x18, 0x10, 0x0, 0x87, + 0x0, 0x1, 0x70, + + /* U+843D "落" */ + 0x0, 0x0, 0xe0, 0x0, 0x1d, 0x0, 0x0, 0x1d, + 0xdd, 0xfd, 0xdd, 0xdf, 0xdd, 0xd2, 0x0, 0x0, + 0xe0, 0x1, 0x1d, 0x0, 0x0, 0x2, 0xa1, 0x30, + 0x3e, 0x13, 0x0, 0x0, 0x0, 0x5d, 0x31, 0xdb, + 0xbb, 0xcf, 0x20, 0x0, 0x1, 0x2d, 0xbb, 0x10, + 0xb8, 0x0, 0x1d, 0x60, 0x74, 0x5, 0xdc, 0x70, + 0x0, 0x1, 0xa5, 0x0, 0x29, 0xcb, 0xb4, 0x0, + 0x0, 0x0, 0x5d, 0xb3, 0x0, 0x4b, 0xd4, 0x0, + 0xc, 0x36, 0xeb, 0xbb, 0xbf, 0x20, 0x0, 0x97, + 0x4, 0x90, 0x0, 0xd, 0x10, 0x7, 0xb0, 0x4, + 0xa1, 0x11, 0x1d, 0x10, 0xa, 0x10, 0x4, 0xea, + 0xaa, 0xaf, 0x10, + + /* U+8449 "葉" */ + 0x0, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0x2c, + 0xcc, 0xfc, 0xcc, 0xcf, 0xcc, 0xc3, 0x0, 0x1, + 0xd0, 0x30, 0x1d, 0x10, 0x0, 0x0, 0x4a, 0x10, + 0xe0, 0x2, 0xe0, 0x0, 0x2c, 0xde, 0xcc, 0xfc, + 0xcc, 0xfc, 0xc2, 0x0, 0x4a, 0x0, 0xe2, 0x22, + 0xf0, 0x0, 0x0, 0x4a, 0x0, 0x66, 0x66, 0x60, + 0x0, 0x0, 0x4e, 0xcc, 0xcc, 0xcc, 0xcc, 0x90, + 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, 0x2b, + 0xbb, 0xbc, 0xee, 0xcb, 0xbb, 0xb3, 0x0, 0x0, + 0x7b, 0xaa, 0xc6, 0x0, 0x0, 0x4, 0x9c, 0x60, + 0x76, 0x8, 0xc8, 0x30, 0x3a, 0x40, 0x0, 0x76, + 0x0, 0x5, 0xa3, + + /* U+8457 "著" */ + 0x0, 0x0, 0xe0, 0x0, 0x1d, 0x0, 0x0, 0x2d, + 0xdd, 0xfd, 0xdd, 0xdf, 0xdd, 0xd1, 0x0, 0x0, + 0xe1, 0x20, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x80, 0x1, 0xc, 0x10, 0x0, 0xcc, 0xce, 0xec, + 0xcd, 0xb3, 0x0, 0x0, 0x0, 0x5, 0x80, 0x5c, + 0x20, 0x0, 0x2d, 0xdd, 0xdd, 0xff, 0xdd, 0xdd, + 0xd2, 0x0, 0x0, 0x4b, 0xb3, 0x0, 0x0, 0x0, + 0x3, 0x9e, 0xeb, 0xbb, 0xbb, 0xbd, 0x0, 0x3b, + 0x67, 0x80, 0x0, 0x0, 0xd, 0x0, 0x0, 0x6, + 0xda, 0xaa, 0xaa, 0xad, 0x0, 0x0, 0x6, 0x80, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x6, 0xeb, 0xbb, + 0xbb, 0xcd, 0x0, + + /* U+8535 "蔵" */ + 0x0, 0x0, 0xe0, 0x0, 0x3b, 0x0, 0x0, 0x7d, + 0xdd, 0xfd, 0xdd, 0xdf, 0xdd, 0xd1, 0x0, 0x0, + 0xe0, 0x0, 0x27, 0x3a, 0x0, 0x3, 0x44, 0x44, + 0x44, 0x6b, 0x49, 0x60, 0xa, 0xa8, 0x88, 0x88, + 0x9e, 0x88, 0x70, 0xa, 0x39, 0x99, 0x99, 0x2d, + 0x5, 0x20, 0xa, 0x3c, 0x9, 0x30, 0xd, 0xe, + 0x10, 0xa, 0x3e, 0x9c, 0xaa, 0xc, 0x6b, 0x0, + 0xb, 0x2c, 0x0, 0xb, 0xa, 0xe3, 0x0, 0xc, + 0x1e, 0x9b, 0xac, 0x7, 0xb0, 0x0, 0xd, 0xc, + 0x9, 0x20, 0x2e, 0xc0, 0x0, 0x59, 0xa, 0xaa, + 0xad, 0xb2, 0xc5, 0x54, 0x62, 0x0, 0x0, 0x1a, + 0x10, 0x2d, 0xc1, + + /* U+8584 "薄" */ + 0x0, 0x0, 0xe0, 0x0, 0x1d, 0x0, 0x0, 0x2c, + 0xcc, 0xfc, 0xcc, 0xdf, 0xcc, 0xc3, 0x0, 0x0, + 0xd0, 0x0, 0x4c, 0x46, 0x0, 0x5, 0xd6, 0x69, + 0x99, 0xe9, 0x9d, 0xb1, 0x0, 0x18, 0x13, 0x33, + 0xc4, 0x33, 0x20, 0x3, 0x0, 0x1e, 0x88, 0xe9, + 0x8b, 0x80, 0x2c, 0xb1, 0x1e, 0x88, 0xe9, 0x8b, + 0x80, 0x0, 0x73, 0x1c, 0x0, 0xc1, 0x5, 0x80, + 0x0, 0x0, 0x1e, 0x88, 0xe9, 0xbb, 0x80, 0x0, + 0x48, 0x8b, 0x99, 0x99, 0xea, 0xa3, 0x0, 0xc1, + 0x15, 0xc2, 0x22, 0xd2, 0x20, 0x7, 0x70, 0x0, + 0x7a, 0x0, 0xd0, 0x0, 0xa, 0x0, 0x0, 0x1, + 0x4c, 0xd0, 0x0, + + /* U+85AC "薬" */ + 0x0, 0x0, 0xd0, 0x0, 0x1d, 0x0, 0x0, 0x2d, + 0xdd, 0xfd, 0xdd, 0xdf, 0xdd, 0xd2, 0x0, 0x0, + 0xd0, 0x53, 0x1d, 0x0, 0x0, 0x6, 0x80, 0x6a, + 0xeb, 0xa7, 0x8, 0x80, 0x0, 0x99, 0x75, 0x0, + 0x59, 0xa8, 0x0, 0x0, 0x2, 0x7c, 0xaa, 0xc9, + 0x20, 0x0, 0x0, 0x5c, 0x95, 0x0, 0x4a, 0xc8, + 0x0, 0x1d, 0xa2, 0x7c, 0xaa, 0xc9, 0x7, 0xd0, + 0x2, 0x0, 0x1, 0x87, 0x10, 0x0, 0x20, 0x2d, + 0xdd, 0xde, 0xff, 0xed, 0xdd, 0xd2, 0x0, 0x0, + 0x8a, 0x88, 0xc7, 0x0, 0x0, 0x2, 0x8c, 0x50, + 0x76, 0x6, 0xc8, 0x30, 0x2b, 0x40, 0x0, 0x76, + 0x0, 0x4, 0xa2, + + /* U+85DD "藝" */ + 0x0, 0x0, 0xc1, 0x0, 0x1c, 0x0, 0x0, 0x2b, + 0xbb, 0xfc, 0xbb, 0xcf, 0xbb, 0xb2, 0x0, 0x2, + 0xa0, 0x0, 0x1a, 0x0, 0x0, 0x2, 0x9b, 0xc9, + 0x32, 0x4d, 0x43, 0x0, 0x9, 0x9b, 0xb9, 0x94, + 0x8d, 0x7c, 0x0, 0x4, 0xa4, 0x29, 0x77, 0xb9, + 0xc, 0x0, 0xa, 0x9b, 0xc9, 0x90, 0xbd, 0x4c, + 0x12, 0x0, 0x6, 0x94, 0x56, 0xa0, 0x1b, 0x74, + 0xa, 0x98, 0x76, 0x58, 0x0, 0x2, 0x80, 0x0, + 0x49, 0x99, 0x99, 0x99, 0x95, 0x0, 0x29, 0x99, + 0xab, 0x99, 0x9a, 0x99, 0x92, 0x0, 0x5, 0xc3, + 0x0, 0xb, 0x70, 0x0, 0x2, 0xbf, 0x99, 0xaa, + 0xaa, 0xdc, 0x20, 0x0, 0x43, 0x21, 0x0, 0x0, + 0x2, 0x40, + + /* U+8607 "蘇" */ + 0x0, 0x0, 0xd1, 0x0, 0x2c, 0x0, 0x0, 0x2d, + 0xdd, 0xfd, 0xdd, 0xdf, 0xdd, 0xd2, 0x0, 0x14, + 0xc1, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x8c, 0x74, + 0x0, 0x26, 0xac, 0x50, 0x3, 0xc4, 0xb6, 0x9, + 0x99, 0x90, 0x0, 0x2f, 0xdb, 0xfb, 0x80, 0x5, + 0x80, 0x0, 0x1a, 0x44, 0x61, 0xbc, 0xcd, 0xec, + 0xc3, 0x7, 0xbb, 0xca, 0xb1, 0x1d, 0xf3, 0x10, + 0x7, 0x44, 0x61, 0xb0, 0x5d, 0xba, 0x0, 0x5, + 0xbb, 0xbb, 0x81, 0xc6, 0x89, 0x40, 0x5, 0x35, + 0x74, 0x5c, 0x55, 0x81, 0xd2, 0xb, 0x1a, 0x83, + 0xc5, 0x5, 0x80, 0x32, 0x47, 0x6, 0x22, 0x30, + 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8655 "處" */ + 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xbb, 0xbb, 0x70, 0x0, 0x0, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0xfc, 0xcc, + 0xce, 0xcc, 0xcc, 0xe6, 0x0, 0xd0, 0x1, 0x4c, + 0x45, 0x62, 0xd1, 0x0, 0xd2, 0xa9, 0x9d, 0x64, + 0x31, 0x81, 0x0, 0xd0, 0x15, 0xa, 0x98, 0x89, + 0x90, 0x1, 0xc0, 0x9c, 0x96, 0x3a, 0xa8, 0x0, + 0x2, 0xb4, 0xe1, 0x76, 0x67, 0x1d, 0x0, 0x3, + 0xcc, 0x96, 0xd1, 0x93, 0xd, 0x8, 0x7, 0x60, + 0xe, 0x73, 0xd0, 0xd, 0xa7, 0xb, 0x20, 0xaa, + 0xd5, 0x20, 0x0, 0x10, 0x1c, 0x4c, 0x60, 0x29, + 0xcd, 0xcc, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+884C "行" */ + 0x0, 0x4, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x20, 0x7e, 0xee, 0xee, 0xe5, 0x5, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x20, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0x21, 0xee, 0xee, + 0xef, 0xeb, 0x4, 0xed, 0x0, 0x0, 0x0, 0x4a, + 0x0, 0x2e, 0x4d, 0x0, 0x0, 0x0, 0x4a, 0x0, + 0x1, 0xd, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0xd, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0xd, 0x0, 0x0, + 0xad, 0xe5, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8853 "術" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x2, 0xd0, + 0x0, 0xb4, 0xa3, 0xdd, 0xd1, 0x1d, 0x40, 0x0, + 0xb1, 0x84, 0x0, 0x0, 0x35, 0xb, 0x33, 0xc5, + 0x42, 0x0, 0x0, 0x0, 0x88, 0xbc, 0xfc, 0xc7, + 0x11, 0x10, 0x3, 0xf1, 0x5, 0xf1, 0x7, 0xbf, + 0xb3, 0x2e, 0xf0, 0xa, 0xf9, 0x30, 0xe, 0x0, + 0x86, 0xd0, 0xc, 0xc3, 0xc0, 0xe, 0x0, 0x0, + 0xd0, 0x86, 0xb1, 0x76, 0xe, 0x0, 0x0, 0xd2, + 0xd0, 0xb1, 0xa, 0xe, 0x0, 0x0, 0xd8, 0x30, + 0xb1, 0x0, 0xe, 0x0, 0x0, 0xd0, 0x0, 0xb1, + 0x0, 0xe, 0x0, 0x0, 0xd0, 0x0, 0xb1, 0x9, + 0xeb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8868 "表" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x5, + 0xaa, 0xaa, 0xdc, 0xaa, 0xaa, 0x60, 0x1, 0x22, + 0x22, 0x98, 0x22, 0x22, 0x10, 0x0, 0x12, 0x22, + 0x98, 0x22, 0x22, 0x0, 0x0, 0x8a, 0xaa, 0xdc, + 0xaa, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, + 0x0, 0x0, 0xc, 0xcc, 0xce, 0xff, 0xcc, 0xcc, + 0xc0, 0x0, 0x0, 0x5d, 0x2b, 0x40, 0x4, 0x30, + 0x0, 0x2a, 0xd1, 0x4, 0xd0, 0x7b, 0x10, 0x2b, + 0xda, 0xa0, 0x0, 0x9d, 0x80, 0x0, 0x4, 0x5, + 0xa0, 0x0, 0xb, 0x90, 0x0, 0x0, 0x5, 0xb5, + 0xad, 0x20, 0x9d, 0x60, 0x0, 0xa, 0xe9, 0x40, + 0x0, 0x2, 0xa2, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+88AB "被" */ + 0x0, 0x82, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x9, + 0x0, 0x67, 0x7f, 0x77, 0x72, 0x3d, 0xdd, 0xf1, + 0xd7, 0x7f, 0x77, 0xd3, 0x0, 0x3, 0xa0, 0xd0, + 0xe, 0x0, 0xd0, 0x0, 0xc, 0x21, 0xd0, 0xe, + 0x1, 0x40, 0x0, 0x7d, 0x77, 0xef, 0xdd, 0xde, + 0xa0, 0x5, 0xfe, 0xb0, 0xe8, 0x50, 0x9, 0x50, + 0x2d, 0x5a, 0xa4, 0xd1, 0xc0, 0x1d, 0x0, 0x1, + 0x3a, 0x13, 0xb0, 0x79, 0xc4, 0x0, 0x0, 0x3a, + 0x7, 0x70, 0x1e, 0xc0, 0x0, 0x0, 0x3a, 0xd, + 0x14, 0xd6, 0x9c, 0x40, 0x0, 0x3a, 0x37, 0x7a, + 0x20, 0x3, 0xb5, + + /* U+88CF "裏" */ + 0x0, 0x0, 0x0, 0x74, 0x0, 0x0, 0x0, 0xa, + 0xbb, 0xbb, 0xde, 0xbb, 0xbb, 0xb2, 0x0, 0x13, + 0x33, 0x33, 0x33, 0x32, 0x0, 0x0, 0x6a, 0x66, + 0xaa, 0x66, 0x8b, 0x0, 0x0, 0x6c, 0x99, 0xcc, + 0x99, 0xab, 0x0, 0x0, 0x67, 0x0, 0x77, 0x0, + 0x4b, 0x0, 0x0, 0x39, 0x99, 0xcc, 0x99, 0x96, + 0x0, 0x1, 0x88, 0x88, 0xcc, 0x88, 0x88, 0x30, + 0xa, 0xaa, 0xaa, 0xcc, 0xaa, 0xaa, 0xa4, 0x1, + 0x11, 0x7c, 0x5a, 0x71, 0x28, 0x30, 0x5, 0x9b, + 0xd0, 0x0, 0xb9, 0xa4, 0x0, 0x6, 0x12, 0xd3, + 0x69, 0x47, 0xc6, 0x20, 0x0, 0x8, 0xb8, 0x52, + 0x0, 0x16, 0xb5, + + /* U+88DC "補" */ + 0x2, 0x90, 0x0, 0x0, 0x85, 0x86, 0x0, 0x0, + 0xc4, 0x0, 0x0, 0x85, 0xa, 0x70, 0x0, 0x34, + 0x19, 0x99, 0xdc, 0x9a, 0xc1, 0x1d, 0xde, 0x75, + 0x55, 0xb9, 0x55, 0x50, 0x0, 0xc, 0x11, 0x22, + 0xa7, 0x22, 0x10, 0x0, 0x58, 0x2a, 0xba, 0xdc, + 0xac, 0x90, 0x0, 0xd7, 0xab, 0x30, 0x85, 0x4, + 0x90, 0xb, 0xfd, 0x3a, 0xdc, 0xed, 0xcd, 0x90, + 0x68, 0xc3, 0x8a, 0x30, 0x85, 0x4, 0x90, 0x0, + 0xc1, 0xa, 0xdc, 0xed, 0xcd, 0x90, 0x0, 0xc1, + 0xa, 0x30, 0x85, 0x4, 0x90, 0x0, 0xc1, 0xa, + 0x30, 0x85, 0x4, 0x90, 0x0, 0xc1, 0xa, 0x30, + 0x85, 0x8d, 0x60, + + /* U+88E1 "裡" */ + 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x8e, 0xce, 0xdc, 0xf3, 0x0, 0x7, + 0x10, 0x85, 0x9, 0x30, 0xa3, 0x1d, 0xdd, 0xf5, + 0x86, 0x1a, 0x51, 0xb3, 0x0, 0x2, 0xb0, 0x8c, + 0xad, 0xba, 0xe3, 0x0, 0xa, 0x15, 0x85, 0x9, + 0x30, 0xa3, 0x0, 0x7e, 0xa6, 0x8d, 0xce, 0xdc, + 0xe3, 0x6, 0xbc, 0xd1, 0x0, 0xa, 0x40, 0x0, + 0x4b, 0x3a, 0x5b, 0x0, 0x9, 0x30, 0x0, 0x0, + 0x2a, 0x2, 0x7d, 0xdf, 0xed, 0xd4, 0x0, 0x2a, + 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, 0x2a, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x0, 0x2a, 0x1, 0xdd, + 0xde, 0xdd, 0xdb, + + /* U+88FD "製" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xc0, 0xd0, 0x0, 0x0, 0x0, 0xc0, 0x7, 0xea, + 0xfa, 0xa4, 0xd, 0x0, 0xc0, 0xa, 0x31, 0xd1, + 0x11, 0xd, 0x0, 0xc0, 0x18, 0x88, 0xe8, 0x88, + 0xd, 0x0, 0xc0, 0x4, 0xaa, 0xfa, 0xa5, 0xd, + 0x0, 0xc0, 0x6, 0x60, 0xd0, 0x38, 0x8, 0x0, + 0xc0, 0x6, 0x60, 0xc2, 0xb5, 0x0, 0x77, 0x80, + 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0xc, + 0xcc, 0xcd, 0xff, 0xcc, 0xcc, 0xc7, 0x0, 0x1, + 0x8b, 0x36, 0x90, 0x1a, 0x60, 0x18, 0xcd, 0xa0, + 0x0, 0xab, 0xa2, 0x0, 0x4, 0x5, 0x92, 0x69, + 0x7, 0xc6, 0x10, 0x0, 0xb, 0xd9, 0x51, 0x0, + 0x17, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8907 "複" */ + 0x0, 0x30, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x2e, 0x11, 0x11, 0x11, 0x0, 0x7, + 0x0, 0xbc, 0xbb, 0xbb, 0xb7, 0xd, 0xdd, 0xe7, + 0xe5, 0x55, 0x55, 0x40, 0x0, 0x3, 0x86, 0xd5, + 0x44, 0x44, 0xe0, 0x0, 0xc, 0x23, 0xba, 0xaa, + 0xaa, 0xe0, 0x0, 0x7e, 0xa3, 0xb5, 0x44, 0x44, + 0xe0, 0x6, 0xcd, 0xb0, 0x48, 0xe6, 0x55, 0x50, + 0x1c, 0x3a, 0x84, 0x1d, 0xeb, 0xbb, 0x90, 0x0, + 0x2a, 0x3, 0xcd, 0x40, 0x2d, 0x30, 0x0, 0x2a, + 0x9, 0x22, 0xd9, 0xd4, 0x0, 0x0, 0x2a, 0x0, + 0x27, 0xdb, 0xd8, 0x30, 0x0, 0x2a, 0x1d, 0xb6, + 0x10, 0x18, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+897F "西" */ + 0x2e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe1, 0x0, + 0x0, 0xd, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0xe0, 0x0, 0x0, 0x5, 0xdd, 0xdf, + 0xdd, 0xfd, 0xdd, 0x60, 0x5, 0x80, 0xc, 0x0, + 0xe0, 0x7, 0x70, 0x5, 0x80, 0x49, 0x0, 0xe0, + 0x7, 0x70, 0x5, 0x80, 0xc2, 0x0, 0xe0, 0x7, + 0x70, 0x5, 0xac, 0x50, 0x0, 0xad, 0xde, 0x70, + 0x5, 0x92, 0x0, 0x0, 0x0, 0x7, 0x70, 0x5, + 0x80, 0x0, 0x0, 0x0, 0x7, 0x70, 0x5, 0xfe, + 0xee, 0xee, 0xee, 0xef, 0x70, 0x5, 0x80, 0x0, + 0x0, 0x0, 0x7, 0x70, + + /* U+8981 "要" */ + 0xd, 0xdd, 0xdf, 0xdd, 0xfd, 0xdd, 0xd0, 0x0, + 0x0, 0x2b, 0x0, 0xd0, 0x0, 0x0, 0x4, 0xec, + 0xdf, 0xcc, 0xfc, 0xce, 0x60, 0x4, 0x90, 0x2b, + 0x0, 0xd0, 0x8, 0x60, 0x4, 0x90, 0x2b, 0x0, + 0xd0, 0x8, 0x60, 0x3, 0xcc, 0xce, 0xdc, 0xcc, + 0xcc, 0x40, 0x0, 0x0, 0x1d, 0x20, 0x0, 0x0, + 0x0, 0x3c, 0xcd, 0xfd, 0xcc, 0xce, 0xec, 0xc3, + 0x0, 0x6, 0xb0, 0x0, 0x1e, 0x20, 0x0, 0x0, + 0x1d, 0xc8, 0x54, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0xfd, 0xe9, 0x40, 0x0, 0xb, 0xcc, 0xb7, + 0x10, 0x15, 0xae, 0x70, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+898B "見" */ + 0x0, 0x2f, 0xdd, 0xdd, 0xdd, 0xdd, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x2f, + 0xcc, 0xcc, 0xcc, 0xdd, 0x0, 0x0, 0x2b, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x2e, 0xbb, 0xbb, + 0xbb, 0xcd, 0x0, 0x0, 0x2c, 0x11, 0x11, 0x11, + 0x2d, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x2d, 0xef, 0xdd, 0xfd, 0xdb, 0x0, + 0x0, 0x0, 0x69, 0x0, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0xd1, 0x0, 0x9, 0x0, 0x4d, + 0x80, 0x0, 0xd1, 0x0, 0x2c, 0xd, 0xb4, 0x0, + 0x0, 0x9f, 0xee, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+898F "規" */ + 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x0, 0x6e, 0xdd, 0xde, 0xb0, 0x4, 0x6d, + 0x44, 0x67, 0x0, 0x3, 0xb0, 0x17, 0x8e, 0x76, + 0x6e, 0xcc, 0xcd, 0xb0, 0x0, 0x1c, 0x0, 0x67, + 0x0, 0x3, 0xb0, 0x0, 0x1c, 0x0, 0x6b, 0x77, + 0x79, 0xb0, 0x6d, 0xef, 0xdd, 0x7a, 0x55, 0x57, + 0xb0, 0x0, 0x3b, 0x0, 0x68, 0x0, 0x4, 0xb0, + 0x0, 0x5f, 0x50, 0x4d, 0xec, 0xfc, 0x90, 0x0, + 0x95, 0xc4, 0x6, 0x80, 0xe0, 0x0, 0x1, 0xd0, + 0x2c, 0xb, 0x30, 0xe0, 0x24, 0xa, 0x70, 0x0, + 0x7b, 0x0, 0xe0, 0x48, 0x4a, 0x0, 0xc, 0x90, + 0x0, 0xbd, 0xe3, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, + + /* U+8996 "視" */ + 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x10, 0xf, 0xcc, 0xcd, 0xc0, 0x4, 0x48, + 0x63, 0xd, 0x0, 0x2, 0xc0, 0x8, 0x88, 0xbc, + 0xf, 0xbb, 0xbc, 0xc0, 0x0, 0x0, 0xd2, 0xd, + 0x0, 0x2, 0xc0, 0x0, 0x9, 0x60, 0xf, 0xbb, + 0xbc, 0xc0, 0x0, 0x6f, 0xa0, 0xd, 0x0, 0x2, + 0xc0, 0x8, 0xce, 0xa9, 0xd, 0x22, 0x24, 0xc0, + 0x4a, 0xe, 0xa, 0x1a, 0xea, 0xfa, 0x80, 0x0, + 0xe, 0x0, 0x0, 0xc0, 0xe0, 0x0, 0x0, 0xe, + 0x0, 0x4, 0x90, 0xe0, 0x12, 0x0, 0xe, 0x0, + 0x2d, 0x20, 0xe0, 0x39, 0x0, 0xe, 0x7, 0xc2, + 0x0, 0xad, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+899A "覚" */ + 0x0, 0x72, 0x1, 0xa0, 0x0, 0x57, 0x0, 0x0, + 0x4d, 0x0, 0xa5, 0x2, 0xe2, 0x0, 0xa, 0xbe, + 0xbb, 0xcb, 0xbd, 0xdb, 0xa0, 0xd, 0x11, 0x11, + 0x11, 0x11, 0x11, 0xe0, 0xd, 0x9, 0xaa, 0xaa, + 0xaa, 0x90, 0xe0, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xe, 0x99, 0x99, 0x99, 0xe0, + 0x0, 0x0, 0xe, 0x44, 0x44, 0x44, 0xe0, 0x0, + 0x0, 0xe, 0x44, 0x44, 0x44, 0xe0, 0x0, 0x0, + 0xe, 0xaa, 0xaa, 0xaa, 0xe0, 0x0, 0x0, 0x0, + 0x69, 0x1, 0xd0, 0x0, 0x31, 0x0, 0x17, 0xd1, + 0x1, 0xd0, 0x0, 0x85, 0x3d, 0xc7, 0x10, 0x0, + 0xbd, 0xdd, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+89AA "親" */ + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x2b, 0x62, 0x1a, 0xdc, 0xce, 0xa0, 0x9, 0xa8, + 0x8b, 0x6a, 0x20, 0x5, 0xa0, 0x0, 0xb0, 0xd, + 0xa, 0xdc, 0xcd, 0xa0, 0x1, 0xb2, 0x68, 0x1a, + 0x20, 0x5, 0xa0, 0x49, 0x9c, 0xc9, 0x9a, 0xb9, + 0x9c, 0xa0, 0x0, 0x6, 0x60, 0xa, 0x42, 0x27, + 0xa0, 0x2b, 0xbd, 0xdb, 0x9a, 0x20, 0x5, 0xa0, + 0x3, 0x58, 0x84, 0x28, 0xfd, 0xfd, 0x90, 0x3, + 0xa6, 0x6b, 0x10, 0xd0, 0xd0, 0x0, 0xb, 0x36, + 0x64, 0x92, 0xc0, 0xd0, 0x23, 0x17, 0x6, 0x60, + 0x19, 0x60, 0xd0, 0x48, 0x0, 0x8d, 0x40, 0xb9, + 0x0, 0xab, 0xd4, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x1, 0x10, + + /* U+89BA "覺" */ + 0x0, 0x0, 0x61, 0x14, 0x0, 0x0, 0x0, 0x0, + 0x79, 0x31, 0xcb, 0x2a, 0xac, 0x0, 0x0, 0xab, + 0x93, 0x46, 0x29, 0xab, 0x0, 0x0, 0x9a, 0x81, + 0xbc, 0x18, 0x9a, 0x0, 0x1, 0x97, 0x47, 0xa7, + 0x44, 0x7a, 0x10, 0xd, 0x99, 0x99, 0x99, 0x99, + 0x99, 0xe0, 0x9, 0xb, 0x88, 0x88, 0x88, 0xb0, + 0xa0, 0x0, 0xe, 0x99, 0x99, 0x99, 0xe0, 0x0, + 0x0, 0xe, 0x44, 0x44, 0x44, 0xe0, 0x0, 0x0, + 0xe, 0x44, 0x44, 0x44, 0xe0, 0x0, 0x0, 0x9, + 0xbd, 0x99, 0xe9, 0x90, 0x10, 0x0, 0x3, 0xc3, + 0x1, 0xd0, 0x0, 0x75, 0x2a, 0xca, 0x30, 0x0, + 0xcc, 0xbc, 0xc1, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+89C0 "觀" */ + 0x0, 0x65, 0x9, 0x20, 0x0, 0x0, 0x0, 0xb, + 0xdd, 0xbe, 0xc7, 0xbb, 0xbb, 0xd0, 0x0, 0x65, + 0x8, 0x20, 0xb0, 0x0, 0xb0, 0x9, 0x9c, 0x4b, + 0xb4, 0xba, 0xaa, 0xd0, 0xa, 0x1a, 0x46, 0x64, + 0xb0, 0x0, 0xb0, 0x5, 0xa8, 0x48, 0x72, 0xbb, + 0xaa, 0xd0, 0x0, 0xd5, 0xa8, 0x42, 0xb0, 0x0, + 0xb0, 0x7, 0xd6, 0xaa, 0x63, 0xb7, 0x66, 0xc0, + 0x2c, 0xea, 0xcc, 0xa1, 0x3d, 0x4c, 0x30, 0x1, + 0xc2, 0x88, 0x20, 0xb, 0xb, 0x0, 0x0, 0xd6, + 0xaa, 0x61, 0x38, 0xb, 0x5, 0x0, 0xe9, 0xcc, + 0x94, 0xb3, 0xb, 0x9, 0x0, 0xc1, 0x11, 0x18, + 0x70, 0xc, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+89D2 "角" */ + 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xec, 0xcc, 0xc1, 0x0, 0x0, 0xa8, 0x0, 0x6, + 0x80, 0x0, 0x1c, 0xfb, 0xbb, 0xbf, 0xbb, 0xb2, + 0xb9, 0xe2, 0x22, 0xf2, 0x22, 0xc3, 0x1, 0xd0, + 0x0, 0xe0, 0x0, 0xb3, 0x1, 0xfd, 0xdd, 0xfd, + 0xdd, 0xf3, 0x2, 0xd0, 0x0, 0xe0, 0x0, 0xb3, + 0x4, 0xc0, 0x0, 0xe0, 0x0, 0xb3, 0x5, 0xed, + 0xdd, 0xfd, 0xdd, 0xf3, 0xa, 0x50, 0x0, 0xe0, + 0x0, 0xb3, 0x1e, 0x0, 0x0, 0xe0, 0x0, 0xc3, + 0x95, 0x0, 0x0, 0xe0, 0xbe, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+89E3 "解" */ + 0x0, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xfb, 0xb3, 0xc, 0xdf, 0xcd, 0xc0, 0x7, 0x70, + 0xc2, 0x0, 0x68, 0x2, 0xb0, 0x1f, 0x77, 0xd6, + 0x0, 0xd2, 0x4, 0x90, 0x8f, 0x6c, 0x5c, 0x3c, + 0x90, 0xbd, 0x40, 0xa, 0x2a, 0xa, 0x25, 0x51, + 0x60, 0x0, 0xa, 0xae, 0x9e, 0x14, 0xa3, 0xb0, + 0x0, 0xa, 0x4b, 0x2b, 0x1b, 0xdd, 0xfd, 0xa0, + 0xb, 0x3b, 0x1b, 0x3b, 0x3, 0xb0, 0x0, 0xc, + 0x8d, 0x8d, 0x2b, 0xbc, 0xeb, 0xb2, 0xc, 0xa, + 0xa, 0x11, 0x14, 0xb1, 0x10, 0x39, 0xa, 0xb, + 0x10, 0x3, 0xb0, 0x0, 0x83, 0x4, 0xac, 0x0, + 0x3, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+89E6 "触" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc1, 0x0, 0x0, 0xd, 0x10, 0x0, 0x1, 0xfb, + 0xb3, 0x0, 0xd, 0x10, 0x0, 0x6, 0x80, 0xc1, + 0x0, 0xe, 0x20, 0x0, 0xe, 0x31, 0xb0, 0xf, + 0xff, 0xff, 0xc0, 0x8f, 0xce, 0xbf, 0xc, 0xc, + 0x0, 0xc0, 0x1c, 0x1b, 0xc, 0xc, 0xc, 0x0, + 0xc0, 0xa, 0xce, 0xbf, 0xc, 0xc, 0x0, 0xc0, + 0xb, 0x1b, 0xc, 0xe, 0x9e, 0xaa, 0xc0, 0xb, + 0x1b, 0xc, 0x4, 0x4e, 0x54, 0x30, 0xc, 0xce, + 0xbf, 0x0, 0xd, 0x19, 0x10, 0xc, 0xb, 0xc, + 0x0, 0xd, 0x15, 0x80, 0x3b, 0xb, 0xc, 0x37, + 0x8f, 0xcd, 0xe0, 0x85, 0xb, 0x7b, 0x59, 0x74, + 0x20, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8A00 "言" */ + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0x10, 0x0, 0x0, 0x1d, 0xdd, + 0xdd, 0xdf, 0xdd, 0xdd, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xcc, 0xcc, + 0xcc, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xaa, 0xaa, 0xaa, 0xa3, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x0, 0x1, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, + 0x2f, 0xbb, 0xbb, 0xbb, 0xd7, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x2c, 0x11, + 0x11, 0x11, 0x87, 0x0, 0x0, 0x2e, 0xaa, 0xaa, + 0xaa, 0xc7, 0x0, + + /* U+8A08 "計" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0xb, 0x30, 0x0, 0x0, 0xd, + 0x30, 0x0, 0xb, 0x30, 0x0, 0x2, 0x26, 0x32, + 0x10, 0xb, 0x30, 0x0, 0xa, 0xaa, 0xaa, 0x70, + 0xb, 0x30, 0x0, 0x2, 0x66, 0x66, 0x0, 0xb, + 0x30, 0x0, 0x2, 0x44, 0x44, 0x4c, 0xcf, 0xdc, + 0xc2, 0x5, 0xcc, 0xcc, 0x0, 0xb, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0x4, + 0xcc, 0xcd, 0x10, 0xb, 0x30, 0x0, 0x5, 0x70, + 0xb, 0x10, 0xb, 0x30, 0x0, 0x5, 0x70, 0xb, + 0x10, 0xb, 0x30, 0x0, 0x5, 0xec, 0xcf, 0x10, + 0xb, 0x30, 0x0, 0x5, 0x70, 0x0, 0x0, 0xb, + 0x30, 0x0, + + /* U+8A0A "訊" */ + 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0xde, 0xfe, 0xef, 0x20, 0x2, 0x26, + 0x22, 0x0, 0xd0, 0xc, 0x20, 0x1a, 0xaa, 0xa9, + 0x0, 0xd0, 0xc, 0x20, 0x3, 0x66, 0x62, 0x0, + 0xd0, 0xc, 0x20, 0x2, 0x44, 0x41, 0x0, 0xd0, + 0xc, 0x20, 0x6, 0xcc, 0xc5, 0xdd, 0xfd, 0xac, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xb, 0x20, + 0x7, 0xcc, 0xc5, 0x0, 0xd0, 0xa, 0x30, 0x8, + 0x20, 0x66, 0x0, 0xd0, 0x9, 0x30, 0x8, 0x20, + 0x66, 0x0, 0xd0, 0x8, 0x57, 0x8, 0xdc, 0xd6, + 0x0, 0xd0, 0x4, 0xb8, 0x8, 0x30, 0x0, 0x0, + 0xd0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, + + /* U+8A0E "討" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x85, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x29, 0x9a, 0x99, + 0x0, 0x0, 0x1d, 0x0, 0x13, 0x33, 0x33, 0x9a, + 0xaa, 0xbf, 0xa6, 0x8, 0xbb, 0xb5, 0x33, 0x33, + 0x4e, 0x32, 0x1, 0x11, 0x10, 0x1, 0x0, 0x1d, + 0x0, 0x8, 0xcc, 0xc5, 0xc, 0x20, 0x1d, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xc0, 0x1d, 0x0, 0x9, + 0xcc, 0xc6, 0x0, 0xc3, 0x1d, 0x0, 0xb, 0x10, + 0x67, 0x0, 0x31, 0x1d, 0x0, 0xb, 0x10, 0x67, + 0x0, 0x0, 0x1d, 0x0, 0xb, 0xcc, 0xd7, 0x0, + 0x0, 0x2d, 0x0, 0xb, 0x10, 0x0, 0x0, 0x7e, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8A13 "訓" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x70, 0x0, 0xb1, 0x0, 0xe, 0x0, 0x1e, 0x0, + 0xc, 0x11, 0xc0, 0xe0, 0x22, 0x62, 0x10, 0xc1, + 0x1c, 0xe, 0x2a, 0xaa, 0xa9, 0xc, 0x11, 0xc0, + 0xe0, 0x36, 0x66, 0x20, 0xc1, 0x1c, 0xe, 0x2, + 0x44, 0x41, 0xd, 0x1, 0xc0, 0xe0, 0x7c, 0xcc, + 0x40, 0xd0, 0x1c, 0xe, 0x0, 0x0, 0x0, 0xd, + 0x1, 0xc0, 0xe0, 0x8c, 0xcc, 0x60, 0xd0, 0x1c, + 0xe, 0x9, 0x30, 0x57, 0x3b, 0x1, 0xc0, 0xe0, + 0x93, 0x5, 0x77, 0x70, 0x1c, 0xe, 0x9, 0xdc, + 0xd8, 0xd1, 0x0, 0x50, 0xe0, 0x93, 0x0, 0x58, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8A18 "記" */ + 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0x7e, 0xee, 0xef, 0x30, 0x49, 0x9b, + 0x99, 0x0, 0x0, 0xb, 0x30, 0x12, 0x22, 0x22, + 0x0, 0x0, 0xb, 0x30, 0x9, 0xcc, 0xc4, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x0, 0x0, 0x27, 0x77, + 0x7d, 0x30, 0xb, 0xbb, 0xb7, 0x5c, 0x66, 0x6d, + 0x30, 0x0, 0x0, 0x0, 0x59, 0x0, 0x1, 0x0, + 0xb, 0xcc, 0xc5, 0x59, 0x0, 0x0, 0x0, 0xd, + 0x0, 0x66, 0x59, 0x0, 0x0, 0x40, 0xd, 0x0, + 0x66, 0x59, 0x0, 0x0, 0xd0, 0xe, 0xaa, 0xd6, + 0x4a, 0x0, 0x0, 0xd0, 0xd, 0x11, 0x10, 0x1d, + 0xee, 0xee, 0x70, + + /* U+8A2A "訪" */ + 0x0, 0x31, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x49, 0x0, 0x0, 0xc, 0x10, 0x0, 0x2, 0x28, + 0x21, 0x1, 0x18, 0x61, 0x10, 0x1a, 0xaa, 0xa9, + 0x9c, 0xfd, 0xcc, 0xc6, 0x3, 0x66, 0x61, 0x0, + 0xd0, 0x0, 0x0, 0x2, 0x44, 0x41, 0x0, 0xe3, + 0x33, 0x20, 0x6, 0xcc, 0xc3, 0x0, 0xe9, 0x9a, + 0xc0, 0x0, 0x0, 0x0, 0x2, 0xb0, 0x1, 0xc0, + 0x7, 0xcc, 0xc4, 0x5, 0x80, 0x2, 0xb0, 0x8, + 0x20, 0x74, 0xb, 0x30, 0x3, 0xa0, 0x8, 0x20, + 0x74, 0x2d, 0x0, 0x5, 0x80, 0x8, 0xdc, 0xe6, + 0xd4, 0x0, 0x8, 0x60, 0x8, 0x20, 0x8, 0x70, + 0xa, 0xec, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8A2D "設" */ + 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x69, 0x0, 0xd, 0xdd, 0xea, 0x0, 0x2, 0x29, + 0x22, 0xe, 0x0, 0x3a, 0x0, 0x3a, 0xaa, 0xaa, + 0x1c, 0x0, 0x3a, 0x0, 0x4, 0x66, 0x62, 0x87, + 0x0, 0x2c, 0x52, 0x3, 0x44, 0x45, 0xa0, 0x0, + 0x5, 0x62, 0x8, 0xcc, 0xc6, 0x99, 0x99, 0x99, + 0x60, 0x0, 0x0, 0x0, 0x99, 0x44, 0x4b, 0x60, + 0x9, 0xcc, 0xc5, 0x1d, 0x10, 0x2e, 0x0, 0xb, + 0x10, 0x76, 0x5, 0xc3, 0xd3, 0x0, 0xb, 0x10, + 0x76, 0x0, 0xbf, 0x80, 0x0, 0xb, 0xcc, 0xe6, + 0x5c, 0xc5, 0xdb, 0x51, 0xb, 0x10, 0x7, 0xe7, + 0x0, 0x7, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8A31 "許" */ + 0x0, 0x54, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, + 0x2a, 0x0, 0xc, 0x20, 0x0, 0x0, 0x49, 0xac, + 0x99, 0x2f, 0xdd, 0xdd, 0xd1, 0x12, 0x22, 0x22, + 0xa6, 0xe, 0x10, 0x0, 0x9, 0xbb, 0xb9, 0xd0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x20, 0xd, + 0x10, 0x0, 0x9, 0xbb, 0xb6, 0x88, 0x8f, 0x88, + 0x83, 0x0, 0x0, 0x0, 0x66, 0x6e, 0x76, 0x63, + 0xa, 0xcc, 0xc6, 0x0, 0xd, 0x10, 0x0, 0xc, + 0x0, 0x57, 0x0, 0xd, 0x10, 0x0, 0xc, 0x0, + 0x57, 0x0, 0xd, 0x10, 0x0, 0xc, 0xbb, 0xd7, + 0x0, 0xd, 0x10, 0x0, 0xb, 0x11, 0x10, 0x0, + 0xd, 0x10, 0x0, + + /* U+8A33 "訳" */ + 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x0, 0x9, 0x99, 0x99, 0x80, 0x2, 0x28, + 0x22, 0xd, 0x55, 0x55, 0xd0, 0x2a, 0xaa, 0xa9, + 0xc, 0x0, 0x0, 0xd0, 0x3, 0x66, 0x62, 0xc, + 0x0, 0x0, 0xd0, 0x2, 0x44, 0x41, 0xe, 0x55, + 0x55, 0xd0, 0x7, 0xcc, 0xc5, 0x1d, 0x78, 0xd7, + 0x60, 0x0, 0x0, 0x0, 0x2a, 0x0, 0xe0, 0x0, + 0x8, 0xcc, 0xc6, 0x48, 0x0, 0xa5, 0x0, 0x9, + 0x30, 0x57, 0x76, 0x0, 0x5b, 0x0, 0x9, 0x30, + 0x57, 0xb3, 0x0, 0xe, 0x40, 0x9, 0xdc, 0xda, + 0xd0, 0x0, 0x5, 0xe4, 0x9, 0x30, 0x7, 0x60, + 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8A34 "訴" */ + 0x0, 0x22, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, + 0x3c, 0x0, 0x1, 0x59, 0xdb, 0x40, 0x2, 0x28, + 0x32, 0xf, 0x84, 0x10, 0x0, 0x1a, 0xaa, 0xa9, + 0xe, 0x0, 0x0, 0x0, 0x3, 0x66, 0x62, 0xe, + 0x11, 0x11, 0x10, 0x2, 0x44, 0x41, 0xf, 0xaa, + 0xec, 0xa4, 0x7, 0xcc, 0xc4, 0x1d, 0x0, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xc8, 0xc4, 0x0, + 0x7, 0xcc, 0xc4, 0x3a, 0x7, 0xfa, 0x10, 0x8, + 0x30, 0x75, 0x78, 0x0, 0xba, 0xe3, 0x8, 0x30, + 0x75, 0xd3, 0x0, 0xb4, 0x10, 0x8, 0xdc, 0xeb, + 0xd0, 0x0, 0xb4, 0x0, 0x8, 0x40, 0x6, 0x40, + 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, + + /* U+8A55 "評" */ + 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0x8e, 0xef, 0xee, 0xe2, 0x2, 0x26, + 0x22, 0x0, 0xd, 0x10, 0x0, 0x1a, 0xaa, 0xa9, + 0x29, 0xd, 0x13, 0xb0, 0x3, 0x66, 0x62, 0xc, + 0xd, 0x17, 0x60, 0x2, 0x44, 0x41, 0xb, 0x1d, + 0x1c, 0x10, 0x6, 0xcc, 0xc4, 0x2, 0xd, 0x13, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xf6, + 0x7, 0xcc, 0xc4, 0x0, 0xd, 0x10, 0x0, 0x9, + 0x30, 0x75, 0x0, 0xd, 0x10, 0x0, 0x9, 0x30, + 0x75, 0x0, 0xd, 0x10, 0x0, 0x9, 0xdc, 0xe5, + 0x0, 0xd, 0x10, 0x0, 0x9, 0x30, 0x0, 0x0, + 0xd, 0x10, 0x0, + + /* U+8A66 "試" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x3, 0xb6, 0x0, 0x0, 0x96, + 0x0, 0x0, 0x3, 0xaa, 0x20, 0x36, 0x77, 0x60, + 0x0, 0x3, 0xb2, 0x40, 0x36, 0x66, 0x68, 0xee, + 0xee, 0xfe, 0xe0, 0x7, 0x88, 0x60, 0x0, 0x1, + 0xb0, 0x0, 0x2, 0x33, 0x20, 0x11, 0x11, 0xc0, + 0x0, 0xb, 0xcc, 0xa8, 0xcf, 0xc5, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, 0xc, + 0xcc, 0xa0, 0xd, 0x0, 0xc1, 0x0, 0xd, 0x0, + 0xd0, 0xd, 0x1, 0x93, 0x0, 0xd, 0x0, 0xd1, + 0x5f, 0xcb, 0x75, 0x91, 0xe, 0xcc, 0xd9, 0x94, + 0x0, 0x2a, 0xb0, 0xd, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xa0, + + /* U+8A71 "話" */ + 0x0, 0x32, 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, + 0x3c, 0x0, 0x25, 0x8b, 0xda, 0x50, 0x2, 0x28, + 0x32, 0x47, 0x4d, 0x10, 0x0, 0x2a, 0xaa, 0xa9, + 0x0, 0xc, 0x10, 0x0, 0x3, 0x66, 0x62, 0x34, + 0x4d, 0x54, 0x43, 0x2, 0x44, 0x42, 0x57, 0x7e, + 0x87, 0x75, 0x7, 0xcc, 0xc5, 0x0, 0xc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x1d, 0x31, 0x10, + 0x8, 0xcc, 0xc7, 0x2e, 0xcc, 0xcc, 0xe0, 0x9, + 0x30, 0x48, 0x29, 0x0, 0x0, 0xe0, 0x9, 0x30, + 0x48, 0x29, 0x0, 0x0, 0xe0, 0x9, 0x85, 0x98, + 0x2a, 0x22, 0x22, 0xe0, 0x9, 0x86, 0x63, 0x2e, + 0xbb, 0xbb, 0xd0, + + /* U+8A72 "該" */ + 0x0, 0x41, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0xb, 0x30, 0x0, 0x2, 0x29, + 0x22, 0x68, 0x8b, 0xb8, 0x84, 0x3a, 0xaa, 0xa9, + 0x34, 0xa9, 0x44, 0x42, 0x4, 0x66, 0x62, 0x1, + 0xc0, 0x6, 0x0, 0x3, 0x44, 0x41, 0x1c, 0x63, + 0x98, 0x0, 0x8, 0xcc, 0xc4, 0x6a, 0x8d, 0xb0, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8b, 0x5, 0xc0, + 0x9, 0xcc, 0xc5, 0x2a, 0x70, 0x2d, 0x20, 0xb, + 0x10, 0x66, 0x92, 0x2, 0xe4, 0x0, 0xb, 0x10, + 0x66, 0x0, 0x6d, 0xb8, 0x0, 0xb, 0xcc, 0xd6, + 0x5c, 0xb1, 0xb, 0x90, 0xb, 0x10, 0x9, 0xd5, + 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8A73 "詳" */ + 0x0, 0x44, 0x0, 0x6, 0x0, 0x5, 0x40, 0x0, + 0x1d, 0x0, 0xc, 0x20, 0xd, 0x20, 0x15, 0x59, + 0x55, 0x5, 0x70, 0x48, 0x0, 0x16, 0x66, 0x66, + 0x8d, 0xdf, 0xdd, 0xd2, 0x5, 0x88, 0x83, 0x0, + 0xd, 0x0, 0x0, 0x1, 0x33, 0x31, 0x1, 0x1e, + 0x11, 0x10, 0x7, 0xcc, 0xc4, 0x3c, 0xcf, 0xcc, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x8, 0xdc, 0xd7, 0x0, 0xd, 0x0, 0x0, 0x9, + 0x30, 0x58, 0xce, 0xef, 0xee, 0xe5, 0x9, 0x30, + 0x58, 0x0, 0xd, 0x0, 0x0, 0x9, 0xdc, 0xd8, + 0x0, 0xd, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, + 0xd, 0x0, 0x0, + + /* U+8A8C "誌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x95, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x95, 0x0, 0x0, 0x12, 0x37, 0x24, + 0x88, 0xca, 0x88, 0x70, 0x5a, 0xaa, 0xa4, 0x66, + 0xc9, 0x66, 0x50, 0x6, 0x66, 0x40, 0x0, 0x95, + 0x0, 0x0, 0x4, 0x44, 0x33, 0x88, 0xdb, 0x88, + 0x50, 0xc, 0xcc, 0x81, 0x33, 0xb3, 0x33, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0x10, 0x0, 0xc, + 0xcc, 0x92, 0x4d, 0x5, 0x38, 0x0, 0xc, 0x0, + 0xb5, 0x6d, 0x0, 0xa, 0x40, 0xc, 0x0, 0xb8, + 0x3d, 0x0, 0xa4, 0xb0, 0xd, 0x66, 0xba, 0xd, + 0x10, 0xc0, 0xb0, 0xd, 0x66, 0x50, 0x7, 0xcc, + 0x80, 0x0, + + /* U+8A8D "認" */ + 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0x0, 0x8c, 0xce, 0xdc, 0xf0, 0x2, 0x28, + 0x21, 0x7, 0xa, 0x20, 0xd0, 0x2a, 0xaa, 0xa8, + 0x3a, 0xc, 0x0, 0xd0, 0x3, 0x66, 0x62, 0x91, + 0x77, 0x0, 0xd0, 0x2, 0x44, 0x41, 0x6, 0xb0, + 0x46, 0xb0, 0x7, 0xcc, 0xc4, 0x99, 0x10, 0x56, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x0, 0x0, + 0x8, 0xcc, 0xc5, 0x53, 0xa8, 0x46, 0x40, 0x9, + 0x20, 0x66, 0xb2, 0xb1, 0x51, 0xc0, 0x9, 0x20, + 0x67, 0xb1, 0xb0, 0x7, 0x94, 0x9, 0xdc, 0xdb, + 0x51, 0xb0, 0xc, 0x23, 0x9, 0x30, 0x0, 0x0, + 0xce, 0xea, 0x0, + + /* U+8A95 "誕" */ + 0x3, 0x30, 0x0, 0x0, 0x0, 0x4, 0x30, 0x3, + 0xb0, 0x5d, 0xf6, 0x7a, 0xe9, 0x30, 0x35, 0xa5, + 0x10, 0xc0, 0x52, 0xc0, 0x0, 0x46, 0x66, 0x13, + 0x80, 0x0, 0xc0, 0x0, 0x1c, 0xca, 0xb, 0x31, + 0xb0, 0xc2, 0x20, 0x0, 0x0, 0x4b, 0xc7, 0xb0, + 0xcb, 0x90, 0x1c, 0xca, 0x0, 0x65, 0xb0, 0xc0, + 0x0, 0x0, 0x0, 0x36, 0x83, 0xb0, 0xc0, 0x0, + 0x2c, 0xcb, 0x1b, 0xb0, 0xb0, 0xc0, 0x0, 0x38, + 0xc, 0xa, 0xa0, 0xb6, 0xe6, 0x60, 0x38, 0xc, + 0x9, 0xc0, 0x45, 0x55, 0x50, 0x3d, 0xbd, 0x4c, + 0x4c, 0x30, 0x0, 0x0, 0x39, 0x1, 0xd2, 0x3, + 0xad, 0xdd, 0xc0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8A98 "誘" */ + 0x0, 0x70, 0x0, 0x1, 0x24, 0x6a, 0x40, 0x0, + 0x85, 0x1, 0xca, 0x9e, 0x52, 0x0, 0x58, 0x9b, + 0x82, 0x22, 0x2e, 0x22, 0x20, 0x23, 0x33, 0x35, + 0xaa, 0xff, 0xea, 0xa3, 0xb, 0xbb, 0x70, 0x9, + 0x7d, 0x97, 0x0, 0x0, 0x0, 0x1, 0xb9, 0xd, + 0xb, 0x90, 0xb, 0xbb, 0x8c, 0x60, 0xa, 0x0, + 0x94, 0x1, 0x11, 0x11, 0xdd, 0xdd, 0xd2, 0x0, + 0xb, 0xbb, 0x80, 0x8, 0x50, 0xe0, 0x0, 0x1c, + 0x12, 0xa0, 0xb, 0x21, 0xcc, 0xf0, 0x1b, 0x1, + 0xa0, 0x1d, 0x0, 0x0, 0xd0, 0x1e, 0xbb, 0xa1, + 0xc5, 0x0, 0x2, 0xc0, 0x1a, 0x0, 0xb, 0x60, + 0x4, 0xcd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8A9E "語" */ + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0xac, 0xee, 0xcc, 0xc1, 0x4, 0x49, + 0x54, 0x0, 0xa3, 0x0, 0x0, 0x16, 0x66, 0x66, + 0x6c, 0xfd, 0xcc, 0x0, 0x5, 0x88, 0x83, 0x0, + 0xd0, 0xd, 0x0, 0x1, 0x33, 0x31, 0x3, 0xa0, + 0xd, 0x0, 0x7, 0xcc, 0xc7, 0xcd, 0xdc, 0xce, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xcc, 0xc7, 0x6e, 0xdd, 0xde, 0x80, 0x9, + 0x30, 0x48, 0x66, 0x0, 0x5, 0x80, 0x9, 0x30, + 0x48, 0x66, 0x0, 0x5, 0x80, 0x9, 0x85, 0x88, + 0x68, 0x22, 0x27, 0x80, 0x9, 0x97, 0x74, 0x6d, + 0xaa, 0xac, 0x80, + + /* U+8AAA "說" */ + 0x0, 0x52, 0x0, 0x2, 0x40, 0x62, 0x0, 0x0, + 0x3b, 0x0, 0xa, 0x30, 0x3b, 0x0, 0x15, 0x59, + 0x53, 0x3b, 0x0, 0x9, 0x50, 0x17, 0x77, 0x77, + 0xd1, 0x0, 0x0, 0xc5, 0x5, 0x77, 0x74, 0x7e, + 0xdd, 0xdd, 0xa3, 0x2, 0x33, 0x30, 0x38, 0x0, + 0x5, 0x90, 0x7, 0xcc, 0xc2, 0x38, 0x0, 0x5, + 0x90, 0x0, 0x0, 0x0, 0x3e, 0xcc, 0xcd, 0x90, + 0x8, 0xcc, 0xc3, 0x3, 0xc1, 0xe1, 0x0, 0xa, + 0x20, 0x74, 0x4, 0xa0, 0xe0, 0x0, 0xa, 0x20, + 0x74, 0xa, 0x50, 0xe0, 0x25, 0xa, 0xcc, 0xe5, + 0x8c, 0x0, 0xe0, 0x48, 0x9, 0x20, 0x7, 0xa1, + 0x0, 0x9d, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8AAC "説" */ + 0x0, 0x44, 0x0, 0x7, 0x0, 0x5, 0x40, 0x0, + 0x2d, 0x0, 0x9, 0x60, 0xd, 0x30, 0x15, 0x59, + 0x54, 0x2, 0xb0, 0x4b, 0x0, 0x16, 0x66, 0x65, + 0x6d, 0xdd, 0xee, 0xc0, 0x5, 0x88, 0x82, 0x66, + 0x0, 0x1, 0xd0, 0x1, 0x33, 0x31, 0x66, 0x0, + 0x1, 0xd0, 0x7, 0xcc, 0xc4, 0x69, 0x44, 0x45, + 0xd0, 0x0, 0x0, 0x0, 0x49, 0xf9, 0xf9, 0x80, + 0x8, 0xcc, 0xc6, 0x2, 0xc0, 0xd0, 0x0, 0x9, + 0x30, 0x67, 0x6, 0x80, 0xd0, 0x0, 0x9, 0x30, + 0x67, 0xc, 0x30, 0xd0, 0x25, 0x9, 0xdc, 0xd7, + 0x9a, 0x0, 0xd0, 0x38, 0x9, 0x30, 0x8, 0xb1, + 0x0, 0x9d, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8AAD "読" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x86, + 0x4, 0xaa, 0xbe, 0xaa, 0xa0, 0x47, 0x88, 0x71, + 0x22, 0x4c, 0x22, 0x20, 0x59, 0x99, 0x90, 0x0, + 0x3c, 0x0, 0x0, 0x4, 0x44, 0x20, 0xbb, 0xbb, + 0xbb, 0x60, 0x5, 0x55, 0x32, 0x77, 0x77, 0x77, + 0x70, 0xc, 0xcc, 0x76, 0x82, 0x22, 0x22, 0xd0, + 0x0, 0x0, 0x6, 0x64, 0x30, 0x70, 0xc0, 0xd, + 0xcc, 0x90, 0x7, 0x60, 0xd0, 0x0, 0xc, 0x1, + 0xb0, 0xa, 0x40, 0xd0, 0x0, 0xc, 0x1, 0xb0, + 0x1e, 0x0, 0xd0, 0x42, 0xf, 0xcc, 0xb1, 0xc7, + 0x0, 0xd0, 0x83, 0xd, 0x0, 0xc, 0x90, 0x0, + 0xbd, 0xd0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, + + /* U+8AB0 "誰" */ + 0x0, 0x32, 0x0, 0x0, 0x51, 0x20, 0x0, 0x0, + 0x3c, 0x0, 0x5, 0xb3, 0xb0, 0x0, 0x2, 0x28, + 0x32, 0xb, 0x40, 0x90, 0x0, 0x2a, 0xaa, 0xa9, + 0x4f, 0xdd, 0xfd, 0xd3, 0x3, 0x66, 0x63, 0xdc, + 0x0, 0xd0, 0x0, 0x2, 0x44, 0x45, 0x9e, 0x77, + 0xe7, 0x50, 0x7, 0xcc, 0xc5, 0x1d, 0x44, 0xe4, + 0x30, 0x0, 0x0, 0x0, 0xc, 0x0, 0xd0, 0x0, + 0x9, 0xdc, 0xd8, 0xf, 0xdd, 0xfd, 0xb0, 0x9, + 0x30, 0x48, 0xc, 0x0, 0xd0, 0x0, 0x9, 0x30, + 0x48, 0xd, 0x0, 0xd0, 0x0, 0x9, 0xdc, 0xd8, + 0xf, 0xdd, 0xdd, 0xd3, 0x9, 0x30, 0x0, 0xc, + 0x0, 0x0, 0x0, + + /* U+8AB2 "課" */ + 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x9d, 0xcf, 0xcc, 0xf0, 0x4, 0x49, + 0x54, 0x93, 0xd, 0x0, 0xe0, 0x17, 0x77, 0x76, + 0x9d, 0xcf, 0xcc, 0xf0, 0x5, 0x88, 0x83, 0x93, + 0xd, 0x0, 0xe0, 0x1, 0x33, 0x31, 0x9a, 0x8e, + 0x88, 0xf0, 0x7, 0xcc, 0xc5, 0x12, 0x2e, 0x22, + 0x20, 0x0, 0x0, 0x0, 0x88, 0x8f, 0x88, 0x83, + 0x8, 0xcc, 0xc7, 0x55, 0xbf, 0xe5, 0x52, 0x9, + 0x30, 0x48, 0x4, 0xce, 0x88, 0x0, 0x9, 0x30, + 0x48, 0x4d, 0x1e, 0xb, 0x80, 0x9, 0xdc, 0xdc, + 0xd2, 0xe, 0x0, 0xa8, 0x9, 0x30, 0x0, 0x10, + 0xe, 0x0, 0x0, + + /* U+8ABF "調" */ + 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x40, 0xe, 0xdd, 0xdd, 0xdc, 0x46, 0x88, 0x60, + 0xc0, 0x8, 0x0, 0xc2, 0x44, 0x44, 0xc, 0x8b, + 0xeb, 0x2c, 0xa, 0xaa, 0x60, 0xc0, 0xb, 0x0, + 0xc0, 0x11, 0x11, 0xc, 0x56, 0xd6, 0x3c, 0x1c, + 0xcc, 0x70, 0xc4, 0x55, 0x52, 0xc0, 0x0, 0x0, + 0xb, 0x46, 0x66, 0xc, 0xd, 0xcc, 0x81, 0xaa, + 0x55, 0xc0, 0xc0, 0xb0, 0x1a, 0x38, 0xa0, 0xa, + 0xc, 0xb, 0x1, 0xa8, 0x4a, 0xaa, 0xa0, 0xc0, + 0xec, 0xcb, 0xd0, 0x50, 0x0, 0xc, 0xb, 0x0, + 0x86, 0x0, 0x0, 0x7c, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, + + /* U+8AC7 "談" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x83, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x9, 0x1c, 0x1, 0x90, 0x2, 0x27, 0x21, + 0x57, 0x3b, 0x9, 0x50, 0x2a, 0xaa, 0xa6, 0xc1, + 0x7a, 0x2a, 0x0, 0x4, 0x66, 0x60, 0x1, 0xe9, + 0xc4, 0x0, 0x2, 0x44, 0x40, 0x6d, 0x60, 0x2c, + 0x90, 0x7, 0xcc, 0xc2, 0x52, 0x2b, 0x0, 0x72, + 0x0, 0x0, 0x0, 0x8, 0x3a, 0x1, 0xa0, 0x8, + 0xcc, 0xc3, 0x67, 0x5a, 0x9, 0x60, 0xa, 0x20, + 0x75, 0xd0, 0x9f, 0x4a, 0x0, 0xa, 0x20, 0x74, + 0x3, 0xe4, 0xc0, 0x0, 0xa, 0xcc, 0xe5, 0x7e, + 0x60, 0x8e, 0x51, 0xa, 0x20, 0x7, 0xe5, 0x0, + 0x4, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8ACB "請" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x65, 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x8b, 0xbf, 0xbb, 0xb5, 0x4, 0x48, 0x43, + 0x0, 0xe, 0x0, 0x0, 0x18, 0x88, 0x87, 0x3b, + 0xbf, 0xbb, 0xb2, 0x4, 0x77, 0x72, 0x66, 0x6e, + 0x66, 0x64, 0x2, 0x33, 0x31, 0x44, 0x44, 0x44, + 0x43, 0x7, 0xcc, 0xc4, 0xd, 0xbb, 0xbb, 0xc0, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xe0, 0x8, + 0xcc, 0xc5, 0xf, 0xaa, 0xaa, 0xe0, 0x9, 0x20, + 0x66, 0xe, 0x44, 0x44, 0xe0, 0x9, 0x20, 0x66, + 0xe, 0x44, 0x44, 0xe0, 0x9, 0xdc, 0xd6, 0xd, + 0x0, 0x0, 0xe0, 0x8, 0x20, 0x0, 0xd, 0x0, + 0x9c, 0xa0, + + /* U+8AD6 "論" */ + 0x0, 0x80, 0x0, 0x0, 0x18, 0x0, 0x0, 0x0, + 0x96, 0x0, 0x0, 0xae, 0x20, 0x0, 0x15, 0x78, + 0x50, 0x9, 0xa3, 0xd2, 0x0, 0x27, 0x77, 0x61, + 0xbb, 0x0, 0x3e, 0x60, 0x6, 0x88, 0x7e, 0xad, + 0xdd, 0xdc, 0xd8, 0x3, 0x33, 0x23, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xcc, 0x64, 0xcc, 0xcc, 0xcc, + 0xc0, 0x0, 0x0, 0x5, 0x80, 0xa0, 0xb0, 0xc0, + 0xc, 0xdd, 0x85, 0x80, 0xa0, 0xb0, 0xc0, 0xc, + 0x2, 0xa5, 0xed, 0xec, 0xfc, 0xe0, 0xc, 0x2, + 0xa5, 0x80, 0xa0, 0xb0, 0xc0, 0xd, 0xcd, 0xa5, + 0x80, 0xa0, 0xb0, 0xc0, 0xc, 0x0, 0x5, 0x80, + 0xa0, 0xb8, 0x90, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8AF8 "諸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x74, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x3b, + 0x0, 0x0, 0x87, 0x0, 0xb3, 0x2, 0x27, 0x21, + 0xbf, 0xff, 0xfd, 0xa0, 0x2a, 0xaa, 0xa6, 0x0, + 0x87, 0x1d, 0x10, 0x2, 0x44, 0x41, 0x11, 0x98, + 0xb8, 0x11, 0x4, 0x77, 0x74, 0xbb, 0xcf, 0xcb, + 0xb8, 0x5, 0x99, 0x91, 0x5, 0xd5, 0x0, 0x0, + 0x0, 0x11, 0x12, 0xbf, 0xcc, 0xcc, 0xe0, 0x8, + 0xcb, 0xc7, 0x5e, 0x0, 0x0, 0xe0, 0x9, 0x20, + 0x83, 0xe, 0xbb, 0xbb, 0xe0, 0x9, 0x20, 0x83, + 0xe, 0x0, 0x0, 0xe0, 0x9, 0x76, 0xb3, 0xe, + 0x11, 0x11, 0xe0, 0x8, 0x87, 0x71, 0xe, 0xaa, + 0xaa, 0xe0, + + /* U+8B02 "謂" */ + 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3c, 0x0, 0xac, 0xbf, 0xbb, 0xd6, 0x2, 0x28, + 0x31, 0xa2, 0xd, 0x0, 0x86, 0x2a, 0xaa, 0xa8, + 0xab, 0xaf, 0xaa, 0xd6, 0x3, 0x66, 0x62, 0xa4, + 0x2d, 0x22, 0x96, 0x2, 0x44, 0x41, 0x57, 0x77, + 0x77, 0x73, 0x7, 0xcc, 0xc4, 0x2b, 0xbb, 0xbb, + 0xa0, 0x0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0xe0, + 0x8, 0xcc, 0xc5, 0x2e, 0xbb, 0xbb, 0xe0, 0x9, + 0x30, 0x66, 0x2b, 0x0, 0x0, 0xe0, 0x9, 0x30, + 0x66, 0x2e, 0xaa, 0xaa, 0xe0, 0x9, 0xdc, 0xd6, + 0x2a, 0x0, 0x0, 0xe0, 0x9, 0x30, 0x0, 0x2a, + 0x0, 0x9c, 0x90, + + /* U+8B1B "講" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0xc, 0x20, 0xa0, 0x0, 0x0, 0x78, + 0x6, 0xae, 0xba, 0xea, 0x70, 0x36, 0x68, 0x61, + 0x1c, 0x31, 0xb1, 0x10, 0x47, 0x77, 0x72, 0xbe, + 0xcb, 0xeb, 0x50, 0x8, 0x88, 0x52, 0x2c, 0x52, + 0xb2, 0x20, 0x3, 0x33, 0x27, 0x88, 0x9e, 0x88, + 0x80, 0xc, 0xcc, 0x70, 0xaa, 0xae, 0xaa, 0x10, + 0x0, 0x0, 0x0, 0xe1, 0x2c, 0x1c, 0x20, 0xd, + 0xcc, 0x90, 0xfa, 0xbe, 0xae, 0x20, 0xa, 0x0, + 0xb0, 0xe0, 0x2c, 0xc, 0x30, 0xa, 0x0, 0xb8, + 0xf9, 0x99, 0x9e, 0xa0, 0xe, 0xcc, 0xb0, 0xe0, + 0x0, 0xb, 0x20, 0xb, 0x0, 0x0, 0xe0, 0x1, + 0xbd, 0x10, + + /* U+8B1D "謝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa0, 0x0, 0x49, 0x0, 0x0, 0xd0, 0x0, 0x94, + 0x0, 0x75, 0x0, 0x0, 0xd0, 0x2, 0x66, 0x2a, + 0xdc, 0xc0, 0x0, 0xd0, 0x7, 0x77, 0x4a, 0x53, + 0xc7, 0x99, 0xf7, 0x6, 0xbb, 0x3a, 0x75, 0xc1, + 0x11, 0xe1, 0x0, 0x0, 0xa, 0x64, 0xc6, 0x20, + 0xd0, 0x6, 0xbb, 0x4a, 0x97, 0xc5, 0x80, 0xd0, + 0x0, 0x0, 0x1d, 0x87, 0xc0, 0xd0, 0xd0, 0x7, + 0xcc, 0x56, 0x6e, 0xc0, 0xa1, 0xd0, 0x9, 0x15, + 0x50, 0xa6, 0xc0, 0x0, 0xd0, 0x9, 0x15, 0x8c, + 0x60, 0xc0, 0x0, 0xd0, 0x9, 0xbd, 0x72, 0x0, + 0xc0, 0x0, 0xd0, 0x9, 0x20, 0x0, 0x6d, 0x90, + 0xad, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8B58 "識" */ + 0x0, 0xa0, 0x0, 0x54, 0x5, 0x80, 0x0, 0x0, + 0x85, 0x0, 0x3a, 0x4, 0x89, 0x10, 0x2, 0x46, + 0x2a, 0xcc, 0xd7, 0x95, 0x80, 0x7, 0x77, 0x62, + 0x82, 0x93, 0x90, 0x80, 0x7, 0xbb, 0x6b, 0xec, + 0xcc, 0xea, 0xa2, 0x0, 0x0, 0x2, 0x22, 0x23, + 0xb2, 0x20, 0x7, 0xbb, 0x57, 0xcb, 0xe0, 0xc0, + 0xa0, 0x0, 0x0, 0x8, 0x30, 0xc0, 0xd6, 0x70, + 0x7, 0xcc, 0x58, 0xcb, 0xf0, 0xcb, 0x0, 0x9, + 0x14, 0x78, 0x30, 0xc0, 0xb7, 0x0, 0x9, 0x13, + 0x78, 0xba, 0xe4, 0xf5, 0x42, 0x9, 0xbc, 0x78, + 0x40, 0xac, 0x4c, 0x92, 0x8, 0x20, 0x0, 0x0, + 0x91, 0x9, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8B70 "議" */ + 0x0, 0x30, 0x0, 0x13, 0x0, 0x6, 0x0, 0x0, + 0xc0, 0x0, 0x2c, 0x21, 0x78, 0x10, 0x12, 0x85, + 0x24, 0x99, 0xbd, 0x99, 0x90, 0x37, 0x77, 0x60, + 0x88, 0xad, 0x88, 0x50, 0xa, 0xbb, 0x72, 0x22, + 0x5b, 0x22, 0x20, 0x0, 0x0, 0xa, 0xbb, 0xbb, + 0xbb, 0xb3, 0xb, 0xbb, 0x74, 0x8a, 0xa5, 0x67, + 0x30, 0x0, 0x0, 0x2, 0x2d, 0x3, 0x80, 0xa0, + 0xb, 0xcc, 0x7b, 0xbf, 0xbc, 0xeb, 0xb3, 0xb, + 0x2, 0x90, 0xd, 0x32, 0xc3, 0x50, 0xb, 0x2, + 0x9a, 0xbe, 0x72, 0xbb, 0x0, 0xe, 0xbc, 0x90, + 0xd, 0x6, 0xc8, 0x25, 0x9, 0x0, 0x4, 0xbb, + 0x46, 0xa, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8B77 "護" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x66, 0x0, 0x0, 0xd0, 0xd, 0x0, 0x0, 0xd, + 0x3, 0xbb, 0xfb, 0xbf, 0xb4, 0x19, 0x9a, 0x97, + 0x8, 0x65, 0x15, 0x0, 0x18, 0x88, 0x86, 0x3e, + 0x15, 0x90, 0x0, 0x2, 0x44, 0x41, 0xcd, 0x99, + 0xe9, 0x80, 0x3, 0x55, 0x56, 0xbd, 0x77, 0xe7, + 0x40, 0x7, 0xcc, 0xc3, 0x2d, 0x99, 0xe9, 0x50, + 0x0, 0x0, 0x0, 0x2c, 0x44, 0xe4, 0x40, 0x8, + 0xdd, 0xd3, 0x1b, 0x66, 0x66, 0x61, 0x9, 0x30, + 0x83, 0xbd, 0xcb, 0xbc, 0x60, 0x9, 0x30, 0x83, + 0x2, 0xb5, 0x6a, 0x0, 0x9, 0xdc, 0xe3, 0x15, + 0x9e, 0xf8, 0x20, 0x9, 0x30, 0x4, 0xfc, 0x60, + 0x19, 0xf6, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, + + /* U+8B8A "變" */ + 0x0, 0x50, 0x0, 0x50, 0x0, 0x23, 0x0, 0x2, + 0x91, 0x25, 0xc6, 0x50, 0xa2, 0x20, 0x1b, 0x3b, + 0x35, 0x55, 0x57, 0x86, 0x70, 0x39, 0xd4, 0x8, + 0x88, 0x58, 0xb9, 0x30, 0x1a, 0x7a, 0x48, 0x88, + 0x56, 0xc5, 0xc0, 0x38, 0x54, 0x5a, 0x99, 0x57, + 0x53, 0x71, 0x37, 0x97, 0x39, 0x1, 0x8b, 0x37, + 0xa0, 0x64, 0xa3, 0x5c, 0x9a, 0x7b, 0x9, 0x71, + 0x30, 0x5, 0xd0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x6f, 0xcb, 0xbb, 0xbd, 0xfb, 0x90, 0x2c, 0xa5, + 0xb5, 0x0, 0x7d, 0x20, 0x0, 0x3, 0x0, 0x1b, + 0xee, 0xb2, 0x0, 0x0, 0x48, 0xac, 0xc7, 0x33, + 0x8c, 0xec, 0x91, 0x24, 0x20, 0x0, 0x0, 0x0, + 0x2, 0x40, + + /* U+8B93 "讓" */ + 0x0, 0x70, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, + 0xa3, 0x8, 0xbb, 0xcf, 0xbb, 0xb3, 0x37, 0x98, + 0x61, 0x66, 0x60, 0x66, 0x50, 0x24, 0x44, 0x42, + 0x92, 0xd1, 0xb2, 0xc0, 0x9, 0xbb, 0x62, 0xbb, + 0xd1, 0xda, 0xa0, 0x0, 0x0, 0x2, 0x5d, 0x65, + 0xa8, 0x50, 0xa, 0xbb, 0x63, 0x6d, 0x76, 0xa9, + 0x60, 0x1, 0x11, 0x2, 0xae, 0xba, 0xdc, 0x80, + 0xa, 0xaa, 0x60, 0xb, 0x30, 0x85, 0x0, 0xc, + 0x35, 0x8a, 0xac, 0xfd, 0xca, 0xb4, 0xb, 0x2, + 0x96, 0x9d, 0x11, 0xc8, 0x80, 0xd, 0xbc, 0x82, + 0x1d, 0x69, 0x5e, 0x60, 0xb, 0x0, 0x0, 0x5b, + 0x73, 0x3, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8BA1 "计" */ + 0x0, 0x71, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, + 0x6c, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x7, + 0x80, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x14, 0x44, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x3a, 0xad, 0xe, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x1d, 0x0, 0x0, 0x5a, 0x0, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x5a, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, + 0x1d, 0x3, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x1e, + 0xb7, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x7e, 0x40, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, + 0x5a, 0x0, 0x0, + + /* U+8BDE "诞" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0xb, + 0x70, 0xcd, 0xf5, 0x6a, 0xea, 0x40, 0x1, 0xe3, + 0x1, 0xc2, 0x63, 0xd0, 0x0, 0x0, 0x43, 0x7, + 0x60, 0x0, 0xd0, 0x0, 0x23, 0x30, 0xc, 0x0, + 0x80, 0xd0, 0x0, 0x59, 0xf0, 0x8d, 0xd4, 0xc0, + 0xed, 0xd0, 0x0, 0xd0, 0x0, 0x82, 0xc0, 0xd0, + 0x0, 0x0, 0xd0, 0x72, 0xb0, 0xc0, 0xd0, 0x0, + 0x0, 0xd0, 0x58, 0xc0, 0xc0, 0xd0, 0x0, 0x0, + 0xd0, 0x2d, 0x90, 0xc1, 0xd1, 0x10, 0x0, 0xda, + 0x7b, 0x80, 0xbb, 0xbb, 0xb2, 0x1, 0xf7, 0x4b, + 0xaa, 0x20, 0x0, 0x0, 0x4, 0x42, 0xd1, 0x5, + 0xbd, 0xdd, 0xd3, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, + + /* U+8C50 "豐" */ + 0x0, 0x0, 0x10, 0x66, 0x1, 0x0, 0x0, 0x5, + 0x77, 0xc7, 0x77, 0x7c, 0x77, 0x60, 0x5, 0x78, + 0xd8, 0x66, 0x8d, 0x87, 0x60, 0x5, 0x74, 0xb4, + 0x77, 0x4b, 0x48, 0x60, 0x5, 0x74, 0xb4, 0x77, + 0x4b, 0x48, 0x60, 0x4, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0x40, 0x7, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x70, 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + 0x0, 0x5d, 0xaa, 0xaa, 0xaa, 0xc7, 0x0, 0x0, + 0x58, 0x0, 0x0, 0x0, 0x67, 0x0, 0x0, 0x3a, + 0xfa, 0xaa, 0xae, 0xb5, 0x0, 0x0, 0x0, 0xc3, + 0x0, 0x2c, 0x0, 0x0, 0x2b, 0xbb, 0xdd, 0xbb, + 0xdd, 0xbb, 0xb2, + + /* U+8C61 "象" */ + 0x0, 0x0, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xfc, 0xcc, 0xb0, 0x0, 0x0, 0x0, 0x8b, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x1c, 0xfc, 0xbb, + 0xcf, 0xbb, 0xbc, 0x0, 0x3, 0xe0, 0x0, 0xa5, + 0x0, 0xe, 0x0, 0x0, 0xeb, 0xbc, 0xfb, 0xbb, + 0xbe, 0x0, 0x0, 0x6, 0xcd, 0x60, 0x0, 0x37, + 0x0, 0xa, 0xd7, 0x4, 0xf6, 0x19, 0xc2, 0x0, + 0x2, 0x3, 0xa9, 0x2e, 0xcc, 0x40, 0x0, 0x5, + 0xd9, 0x21, 0xac, 0x92, 0xd0, 0x0, 0x0, 0x3, + 0x9b, 0x23, 0xc0, 0x7c, 0x10, 0x6, 0xda, 0x40, + 0x7, 0xa0, 0x6, 0xe1, 0x2, 0x10, 0xc, 0xec, + 0x10, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8CA0 "負" */ + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xfc, 0xcc, 0xc1, 0x0, 0x0, 0x0, 0x8b, + 0x0, 0x7, 0xa0, 0x0, 0x0, 0x1b, 0xfc, 0xbb, + 0xcf, 0xcb, 0xb8, 0x0, 0x16, 0xb4, 0x0, 0x0, + 0x0, 0x4b, 0x0, 0x0, 0xba, 0x99, 0x99, 0x99, + 0xbb, 0x0, 0x0, 0xb5, 0x22, 0x22, 0x22, 0x5b, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x3b, 0x0, + 0x0, 0xbc, 0xbb, 0xbb, 0xbb, 0xcb, 0x0, 0x0, + 0xb3, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x9c, + 0xcc, 0xcc, 0xcc, 0xc9, 0x0, 0x0, 0x17, 0xc3, + 0x0, 0x4b, 0x61, 0x0, 0x1c, 0xc7, 0x0, 0x0, + 0x1, 0x6d, 0x90, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, + + /* U+8CA1 "財" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0x0, 0xe, + 0xcc, 0xcf, 0x0, 0x0, 0x3b, 0x0, 0xe, 0x0, + 0xe, 0x0, 0x0, 0x3b, 0x0, 0xe, 0x44, 0x4f, + 0x12, 0x22, 0x5c, 0x21, 0xe, 0x66, 0x6f, 0x5b, + 0xbb, 0xee, 0xb6, 0xe, 0x0, 0xe, 0x0, 0x1, + 0xeb, 0x0, 0xe, 0xbb, 0xbf, 0x0, 0x9, 0x8b, + 0x0, 0xe, 0x0, 0xe, 0x0, 0x3b, 0x3b, 0x0, + 0xe, 0x0, 0xe, 0x1, 0xc2, 0x3b, 0x0, 0xb, + 0xcc, 0xcc, 0x1c, 0x50, 0x3b, 0x0, 0x2, 0xb0, + 0x84, 0x85, 0x0, 0x3b, 0x0, 0xb, 0x50, 0x1d, + 0x10, 0x0, 0x3b, 0x0, 0x59, 0x0, 0x3, 0x10, + 0x2e, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8CA7 "貧" */ + 0x0, 0x5, 0x70, 0x2, 0x80, 0x0, 0x0, 0x7, + 0xb1, 0x0, 0x6, 0xc2, 0x0, 0x6d, 0xcc, 0xcc, + 0xcc, 0xcf, 0xda, 0x22, 0x10, 0x7, 0x80, 0x0, + 0xe0, 0x52, 0x3, 0x7c, 0x70, 0x5a, 0xb8, 0x0, + 0x5, 0xbf, 0xba, 0xaa, 0xaa, 0xa9, 0x0, 0x3, + 0xb0, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x3e, 0x99, + 0x99, 0x99, 0xad, 0x0, 0x3, 0xc3, 0x33, 0x33, + 0x34, 0xd0, 0x0, 0x3c, 0x55, 0x55, 0x55, 0x6d, + 0x0, 0x3, 0xea, 0xaa, 0xaa, 0xaa, 0xd0, 0x0, + 0x2, 0x87, 0x0, 0x2a, 0x62, 0x0, 0x7c, 0x93, + 0x0, 0x0, 0x15, 0xbb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+8CA9 "販" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x60, 0xd, + 0xcc, 0xf0, 0x8c, 0xcb, 0xa7, 0x40, 0xd, 0x0, + 0xd0, 0xb2, 0x0, 0x0, 0x0, 0xd, 0xbb, 0xf0, + 0xb2, 0x0, 0x0, 0x0, 0xd, 0x0, 0xd0, 0xba, + 0x99, 0x99, 0x60, 0xd, 0x0, 0xd0, 0xbe, 0x75, + 0x59, 0x80, 0xd, 0xbb, 0xf0, 0xb8, 0x70, 0xa, + 0x40, 0xd, 0x0, 0xd0, 0xd2, 0xc0, 0xe, 0x0, + 0xd, 0x11, 0xd0, 0xd0, 0x95, 0x68, 0x0, 0x8, + 0xaa, 0xa1, 0xd0, 0x1c, 0xd1, 0x0, 0x3, 0x64, + 0x45, 0x80, 0xc, 0xc0, 0x0, 0xc, 0x31, 0xcc, + 0x30, 0xaa, 0x9a, 0x0, 0x29, 0x0, 0x8a, 0x1d, + 0x80, 0x8, 0xd1, 0x0, 0x0, 0x1, 0x2, 0x0, + 0x0, 0x20, + + /* U+8CAC "責" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x4, + 0xbb, 0xbb, 0xdd, 0xbb, 0xbb, 0x50, 0x0, 0x56, + 0x66, 0xbb, 0x66, 0x66, 0x0, 0x0, 0x34, 0x44, + 0xa9, 0x44, 0x44, 0x0, 0x1b, 0xbb, 0xbb, 0xdd, + 0xbb, 0xbb, 0xb2, 0x0, 0x24, 0x44, 0x44, 0x44, + 0x42, 0x0, 0x0, 0x7a, 0x55, 0x55, 0x55, 0x8a, + 0x0, 0x0, 0x7c, 0x99, 0x99, 0x99, 0xba, 0x0, + 0x0, 0x78, 0x22, 0x22, 0x22, 0x6a, 0x0, 0x0, + 0x7b, 0x66, 0x66, 0x66, 0x9a, 0x0, 0x0, 0x7c, + 0xaa, 0xaa, 0xaa, 0xba, 0x0, 0x0, 0x15, 0xa4, + 0x0, 0x4a, 0x61, 0x0, 0xb, 0xb6, 0x10, 0x0, + 0x0, 0x5b, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8CB7 "買" */ + 0x1, 0xfc, 0xcf, 0xcc, 0xfc, 0xcd, 0xa0, 0x1, + 0xb0, 0xd, 0x0, 0xc0, 0x3, 0xa0, 0x1, 0xec, + 0xcf, 0xcc, 0xfc, 0xcd, 0xa0, 0x0, 0x13, 0x33, + 0x33, 0x33, 0x33, 0x0, 0x0, 0x4c, 0x66, 0x66, + 0x66, 0x7d, 0x0, 0x0, 0x4d, 0x99, 0x99, 0x99, + 0xad, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x4e, 0xaa, 0xaa, 0xaa, 0xad, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, + 0x4c, 0xaa, 0xaa, 0xaa, 0xbc, 0x0, 0x0, 0x5, + 0xb7, 0x0, 0x4b, 0x72, 0x0, 0x9, 0xd8, 0x10, + 0x0, 0x0, 0x4b, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+8CB8 "貸" */ + 0x0, 0x0, 0x96, 0xd, 0x6, 0xb5, 0x0, 0x0, + 0xa, 0xa0, 0x9, 0x61, 0x4a, 0x41, 0x5, 0xdd, + 0x5b, 0xcc, 0xfb, 0x98, 0x71, 0x9, 0x28, 0x50, + 0x0, 0x3d, 0x40, 0x44, 0x0, 0x7, 0x40, 0x0, + 0x2, 0xae, 0xd2, 0x0, 0x2b, 0xaa, 0xaa, 0xaa, + 0xaa, 0x0, 0x0, 0x3c, 0x22, 0x22, 0x22, 0x3d, + 0x0, 0x0, 0x3d, 0x66, 0x66, 0x66, 0x7d, 0x0, + 0x0, 0x3e, 0x99, 0x99, 0x99, 0xad, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x2c, + 0xaa, 0xaa, 0xaa, 0xab, 0x0, 0x0, 0x4, 0xa7, + 0x0, 0x2b, 0x72, 0x0, 0x8, 0xd8, 0x20, 0x0, + 0x0, 0x4b, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8CBB "費" */ + 0x0, 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0x5, + 0xaa, 0xaf, 0xaa, 0xfa, 0xac, 0x60, 0x0, 0x7a, + 0xaf, 0xaa, 0xfa, 0xac, 0x60, 0x0, 0xe1, 0x1e, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xab, 0xfc, 0xaa, + 0xfb, 0xaa, 0xe3, 0x1, 0x5c, 0xe4, 0x33, 0xd4, + 0x4a, 0xc0, 0xb, 0xbd, 0x66, 0x66, 0x66, 0x7d, + 0x0, 0x0, 0x3e, 0x99, 0x99, 0x99, 0xad, 0x0, + 0x0, 0x3c, 0x22, 0x22, 0x22, 0x3d, 0x0, 0x0, + 0x3d, 0x66, 0x66, 0x66, 0x7d, 0x0, 0x0, 0x3e, + 0x99, 0x99, 0x99, 0xad, 0x0, 0x0, 0x15, 0xb5, + 0x0, 0x4b, 0x84, 0x0, 0xb, 0xb7, 0x10, 0x0, + 0x0, 0x38, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8CBF "貿" */ + 0x0, 0x0, 0x37, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xdb, 0x95, 0x1c, 0xcf, 0xcd, 0xb0, 0x0, 0xe0, + 0x36, 0x0, 0x4a, 0x3, 0xa0, 0x0, 0xe2, 0x6f, + 0x40, 0xc3, 0x6, 0x80, 0x4, 0xfa, 0x63, 0xad, + 0x52, 0xbb, 0x20, 0x0, 0x5a, 0xaa, 0xba, 0xaa, + 0xa6, 0x0, 0x0, 0x68, 0x11, 0x11, 0x11, 0x59, + 0x0, 0x0, 0x6b, 0x77, 0x77, 0x77, 0xa9, 0x0, + 0x0, 0x6c, 0x99, 0x99, 0x99, 0xb9, 0x0, 0x0, + 0x68, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x6c, + 0xaa, 0xaa, 0xaa, 0xb9, 0x0, 0x0, 0x4, 0xa4, + 0x0, 0x3a, 0x61, 0x0, 0xb, 0xc8, 0x10, 0x0, + 0x0, 0x5b, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8CC3 "賃" */ + 0x0, 0x0, 0x91, 0x1, 0x23, 0x57, 0x20, 0x0, + 0x2d, 0x53, 0xa9, 0xbc, 0x53, 0x10, 0x19, 0xce, + 0x1b, 0xbb, 0xcd, 0xbb, 0xb6, 0x7, 0xe, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0xe, 0x5, 0xbb, + 0xce, 0xbb, 0xa0, 0x0, 0x6, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x0, 0x3d, 0x55, 0x55, 0x55, 0x5f, + 0x0, 0x0, 0x3e, 0x99, 0x99, 0x99, 0x9f, 0x0, + 0x0, 0x3c, 0x22, 0x22, 0x22, 0x2e, 0x0, 0x0, + 0x3d, 0x66, 0x66, 0x66, 0x6f, 0x0, 0x0, 0x3e, + 0x99, 0x99, 0x99, 0x9f, 0x0, 0x0, 0x2, 0x88, + 0x0, 0x19, 0x62, 0x0, 0x8, 0xc9, 0x40, 0x0, + 0x0, 0x5a, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8CC7 "資" */ + 0x0, 0x40, 0x0, 0x19, 0x0, 0x0, 0x0, 0x1, + 0x8d, 0x80, 0xae, 0xbb, 0xbb, 0xb0, 0x0, 0x0, + 0x3a, 0x70, 0x87, 0x6, 0x80, 0x0, 0x27, 0xa1, + 0x7, 0xa9, 0x74, 0x0, 0xc, 0xb5, 0x8, 0xc6, + 0x0, 0x6c, 0x90, 0x0, 0x2b, 0xab, 0xaa, 0xaa, + 0xaa, 0x30, 0x0, 0x3b, 0x22, 0x22, 0x22, 0x3d, + 0x0, 0x0, 0x3d, 0x66, 0x66, 0x66, 0x7d, 0x0, + 0x0, 0x3e, 0x99, 0x99, 0x99, 0xad, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x3c, + 0xaa, 0xaa, 0xaa, 0xab, 0x0, 0x0, 0x5, 0xb7, + 0x0, 0x1b, 0x94, 0x0, 0x9, 0xc7, 0x10, 0x0, + 0x0, 0x39, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8CEA "質" */ + 0x0, 0x1, 0x37, 0x30, 0x1, 0x36, 0x30, 0x0, + 0xe9, 0x74, 0x11, 0xe9, 0x74, 0x10, 0x0, 0xfb, + 0xbb, 0xb2, 0xeb, 0xbb, 0xb7, 0x4, 0x90, 0xa2, + 0x7, 0x70, 0xd0, 0x0, 0xc, 0x20, 0x72, 0x1b, + 0x0, 0xa0, 0x0, 0x0, 0x2c, 0xaa, 0xaa, 0xaa, + 0xc5, 0x0, 0x0, 0x3b, 0x33, 0x33, 0x33, 0xb6, + 0x0, 0x0, 0x3c, 0x55, 0x55, 0x55, 0xc6, 0x0, + 0x0, 0x3d, 0x99, 0x99, 0x99, 0xd6, 0x0, 0x0, + 0x39, 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, 0x2c, + 0xaa, 0xaa, 0xaa, 0xc5, 0x0, 0x0, 0x16, 0xb4, + 0x0, 0x1b, 0x94, 0x0, 0xa, 0xc7, 0x0, 0x0, + 0x0, 0x38, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8CFD "賽" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0xf, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf0, 0xd, 0x0, + 0x74, 0x0, 0x48, 0x0, 0xd0, 0x1, 0x79, 0xdb, + 0x99, 0xbd, 0x97, 0x10, 0x0, 0x47, 0xca, 0x77, + 0xac, 0x74, 0x0, 0x2b, 0xbb, 0xed, 0xbb, 0xde, + 0xbb, 0xb2, 0x0, 0x9, 0xc3, 0x33, 0x39, 0xb1, + 0x0, 0x6, 0xdf, 0x66, 0x66, 0x66, 0xfc, 0x92, + 0x27, 0x1d, 0x88, 0x88, 0x88, 0xe0, 0x51, 0x0, + 0xd, 0x77, 0x77, 0x78, 0xe0, 0x0, 0x0, 0xd, + 0x88, 0x88, 0x88, 0xe0, 0x0, 0x0, 0x27, 0xc6, + 0x0, 0x7b, 0x83, 0x0, 0xa, 0x95, 0x0, 0x0, + 0x0, 0x39, 0x60, + + /* U+8D39 "费" */ + 0x0, 0x0, 0xd, 0x0, 0xb2, 0x0, 0x0, 0x5, + 0xbb, 0xbf, 0xbb, 0xec, 0xbc, 0x90, 0x0, 0x0, + 0xd, 0x0, 0xc2, 0x4, 0x90, 0x0, 0xdb, 0xaf, + 0xaa, 0xeb, 0xaa, 0x60, 0x0, 0xf0, 0xd, 0x0, + 0xb2, 0x0, 0x0, 0x2, 0xab, 0xfc, 0xaa, 0xeb, + 0xaa, 0xd5, 0x3, 0x7c, 0x80, 0x0, 0x81, 0x6, + 0x81, 0x9, 0x8e, 0xcc, 0xcc, 0xcc, 0xcb, 0x0, + 0x0, 0x2c, 0x0, 0x23, 0x0, 0x1d, 0x0, 0x0, + 0x2c, 0x0, 0x95, 0x0, 0x1d, 0x0, 0x0, 0x2c, + 0x4, 0xc4, 0x62, 0x1d, 0x0, 0x0, 0x15, 0xab, + 0x11, 0x6b, 0xc8, 0x20, 0x2d, 0xc9, 0x30, 0x0, + 0x0, 0x6, 0xc4, + + /* U+8D64 "赤" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xee, 0xff, 0xee, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x77, + 0x0, 0x0, 0x0, 0xd, 0xee, 0xef, 0xee, 0xfe, + 0xee, 0xe0, 0x0, 0x0, 0xf, 0x0, 0xa4, 0x0, + 0x0, 0x0, 0x77, 0xf, 0x0, 0xa4, 0x68, 0x0, + 0x1, 0xe1, 0x2d, 0x0, 0xa4, 0xd, 0x30, 0xb, + 0x60, 0x69, 0x0, 0xa4, 0x4, 0xd0, 0x27, 0x0, + 0xe3, 0x0, 0xa4, 0x0, 0x92, 0x0, 0x1c, 0x80, + 0x0, 0xb4, 0x0, 0x0, 0x0, 0x87, 0x0, 0x8e, + 0xd2, 0x0, 0x0, + + /* U+8D70 "走" */ + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0xcd, + 0xdd, 0xee, 0xdd, 0xdd, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x1d, 0xdd, 0xdd, 0xee, 0xdd, + 0xdd, 0xd1, 0x0, 0x3, 0x0, 0x77, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x0, 0x77, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x7e, 0xdd, 0xdd, 0x20, 0x0, + 0x7f, 0x30, 0x77, 0x0, 0x0, 0x0, 0x0, 0xd4, + 0xc1, 0x77, 0x0, 0x0, 0x0, 0x8, 0x90, 0x5e, + 0xc8, 0x10, 0x0, 0x0, 0x3c, 0x0, 0x1, 0x7c, + 0xef, 0xee, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8D77 "起" */ + 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x50, 0x5, 0xdd, 0xdd, 0xe0, 0xc, 0xde, + 0xed, 0x90, 0x0, 0x0, 0xe0, 0x0, 0x8, 0x50, + 0x0, 0x0, 0x0, 0xe0, 0x14, 0x4a, 0x84, 0x40, + 0x0, 0x0, 0xe0, 0x28, 0x8a, 0xd8, 0x84, 0xfd, + 0xdd, 0xe0, 0x2, 0x14, 0x90, 0x3, 0xb0, 0x0, + 0x10, 0x8, 0x54, 0xa2, 0x23, 0xb0, 0x0, 0x0, + 0x9, 0x44, 0xda, 0x93, 0xb0, 0x0, 0x25, 0xa, + 0x94, 0x90, 0x3, 0xc0, 0x0, 0x59, 0xc, 0xc9, + 0x90, 0x0, 0xbd, 0xdd, 0xc3, 0xd, 0x1e, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x59, 0x0, 0x8c, 0xee, + 0xee, 0xee, 0xe9, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8D85 "超" */ + 0x0, 0x8, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x50, 0x2c, 0xdf, 0xcc, 0xf3, 0xa, 0xde, + 0xed, 0x70, 0x3c, 0x0, 0xc2, 0x0, 0x8, 0x50, + 0x0, 0x87, 0x0, 0xd1, 0x1, 0x19, 0x61, 0x13, + 0xd1, 0x12, 0xe0, 0xb, 0xbd, 0xdb, 0xbc, 0x20, + 0x9b, 0x50, 0x3, 0x25, 0x70, 0x7, 0xa9, 0x99, + 0x90, 0x7, 0x65, 0xda, 0x7a, 0x40, 0x0, 0xe0, + 0x8, 0x65, 0x93, 0x2a, 0x40, 0x0, 0xe0, 0x9, + 0xb5, 0x70, 0xa, 0x40, 0x0, 0xe0, 0xb, 0xda, + 0x70, 0x8, 0xcc, 0xcc, 0xb0, 0xd, 0x2e, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0x1, 0x8c, 0xee, + 0xee, 0xee, 0xe8, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8D8A "越" */ + 0x0, 0x6, 0x60, 0x0, 0x1, 0xc7, 0x10, 0x0, + 0x6, 0x60, 0x0, 0x0, 0xc3, 0xb0, 0x8, 0xde, + 0xed, 0x80, 0x1, 0xd0, 0x60, 0x0, 0x17, 0x71, + 0xc, 0xcc, 0xfc, 0xc5, 0x0, 0x7, 0x60, 0xc, + 0x10, 0xd0, 0x10, 0x2d, 0xdd, 0xfd, 0xbc, 0x10, + 0xc0, 0xc0, 0x0, 0x13, 0xa0, 0xc, 0x10, 0xb5, + 0x90, 0x5, 0x73, 0xb2, 0x1c, 0x12, 0x8d, 0x20, + 0x6, 0x73, 0xea, 0x7d, 0xba, 0x6b, 0x12, 0x7, + 0xd3, 0xa0, 0x3c, 0x34, 0xcc, 0x46, 0x9, 0x9c, + 0xa0, 0x0, 0x8d, 0x16, 0xe1, 0xc, 0xb, 0xd5, + 0x0, 0x30, 0x0, 0x0, 0x39, 0x0, 0x6b, 0xee, + 0xee, 0xee, 0xe5, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8DA3 "趣" */ + 0x0, 0xd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x3, 0xee, 0xdf, 0x50, 0x0, 0xa, 0xdf, + 0xd9, 0x84, 0xc, 0xac, 0xe4, 0x0, 0xd, 0x0, + 0x8c, 0xac, 0x20, 0xa2, 0x1a, 0xaf, 0xaa, 0x84, + 0xc, 0xb1, 0xd0, 0x2, 0x2a, 0x62, 0x86, 0x2c, + 0x4a, 0xc0, 0x3, 0x38, 0x40, 0x8b, 0x9c, 0xb, + 0x80, 0x7, 0x58, 0xec, 0x84, 0xc, 0x9, 0x90, + 0x7, 0x68, 0x40, 0x87, 0x8f, 0x5d, 0xc0, 0x8, + 0xc9, 0x45, 0xda, 0x5c, 0x87, 0x75, 0xb, 0xae, + 0x41, 0x0, 0xc, 0xb0, 0x23, 0xc, 0xc, 0xa3, + 0x0, 0x5, 0x0, 0x0, 0x58, 0x0, 0x7b, 0xee, + 0xee, 0xee, 0xe9, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8DB3 "足" */ + 0x0, 0xde, 0xee, 0xee, 0xee, 0xee, 0x0, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0xbe, 0xee, 0xfe, + 0xee, 0xec, 0x0, 0x0, 0x0, 0x0, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x0, 0xde, 0xee, 0xec, 0x0, + 0x0, 0xae, 0x10, 0xd1, 0x0, 0x0, 0x0, 0x1, + 0xe6, 0xa0, 0xd1, 0x0, 0x0, 0x0, 0x9, 0x80, + 0x8c, 0xe2, 0x0, 0x0, 0x0, 0x5b, 0x0, 0x3, + 0x9d, 0xee, 0xee, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+8DDF "跟" */ + 0xd, 0xcc, 0xd7, 0xdd, 0xdd, 0xde, 0xa0, 0xd, + 0x0, 0x47, 0xd0, 0x0, 0x3, 0xa0, 0xd, 0x0, + 0x47, 0xd8, 0x88, 0x89, 0xa0, 0xd, 0xcc, 0xd7, + 0xd4, 0x33, 0x36, 0xa0, 0x0, 0xd, 0x0, 0xd0, + 0x0, 0x3, 0xa0, 0x6, 0xd, 0x0, 0xde, 0xee, + 0xee, 0xa0, 0xc, 0xd, 0xd8, 0xd0, 0x58, 0x0, + 0x30, 0xc, 0xd, 0x0, 0xd0, 0xd, 0x19, 0xb1, + 0xc, 0xd, 0x0, 0xd0, 0x8, 0xe6, 0x0, 0xc, + 0xe, 0x78, 0xd0, 0x0, 0xd5, 0x0, 0x4e, 0xda, + 0x51, 0xe6, 0x98, 0x2e, 0x80, 0x23, 0x0, 0x1, + 0xe9, 0x40, 0x1, 0xa6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+8DEF "路" */ + 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0xd, + 0xdd, 0xdb, 0x3, 0xd1, 0x10, 0x0, 0xd, 0x0, + 0x2b, 0xb, 0xdb, 0xce, 0x0, 0xd, 0x0, 0x2b, + 0x7e, 0x80, 0x87, 0x0, 0xd, 0xdd, 0xdd, 0xe1, + 0xa7, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x1f, + 0x50, 0x0, 0x7, 0xd, 0x0, 0x1, 0xb7, 0xd3, + 0x0, 0xc, 0xd, 0xdb, 0x7d, 0x30, 0x2d, 0x90, + 0xc, 0xd, 0x3, 0x9f, 0xdd, 0xdf, 0x80, 0xc, + 0xd, 0x0, 0xd, 0x0, 0xb, 0x20, 0xc, 0xd, + 0x58, 0xd, 0x0, 0xb, 0x20, 0x3e, 0xdd, 0x95, + 0xd, 0x11, 0x1c, 0x20, 0x35, 0x10, 0x0, 0xf, + 0xbb, 0xbe, 0x20, + + /* U+8EAB "身" */ + 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x22, 0xe3, 0x22, 0x10, 0x0, 0x0, 0xf, + 0xbb, 0xbb, 0xbb, 0xd0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0xf, 0xbb, 0xbb, + 0xbc, 0xd0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1, + 0xd0, 0x60, 0x0, 0xf, 0xbb, 0xbb, 0xbc, 0xd9, + 0x70, 0x0, 0xe, 0x0, 0x0, 0x1, 0xf8, 0x0, + 0xb, 0xde, 0xdd, 0xdd, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xc5, 0xd0, 0x0, 0x0, 0x0, + 0x5, 0xd7, 0x1, 0xd0, 0x0, 0x0, 0x39, 0xd9, + 0x10, 0x1, 0xd0, 0x0, 0x1d, 0xb5, 0x0, 0xc, + 0xee, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8ECA "車" */ + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x6, + 0xaa, 0xaa, 0xce, 0xaa, 0xaa, 0xa0, 0x1, 0x22, + 0x22, 0x7a, 0x22, 0x22, 0x20, 0x0, 0x6b, 0xbb, + 0xce, 0xbb, 0xbb, 0x0, 0x0, 0x95, 0x11, 0x6a, + 0x11, 0x1f, 0x0, 0x0, 0x94, 0x0, 0x59, 0x0, + 0xe, 0x0, 0x0, 0x9d, 0xbb, 0xde, 0xbb, 0xbf, + 0x0, 0x0, 0x94, 0x0, 0x59, 0x0, 0xe, 0x0, + 0x0, 0x9d, 0xcc, 0xde, 0xcc, 0xce, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x1d, 0xdd, + 0xdd, 0xef, 0xdd, 0xdd, 0xd6, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, + 0x0, 0x0, 0x0, + + /* U+8EDF "軟" */ + 0x0, 0x8, 0x30, 0x0, 0xb2, 0x0, 0x0, 0x0, + 0x8, 0x30, 0x0, 0xe0, 0x0, 0x0, 0x3d, 0xde, + 0xed, 0xa1, 0xe0, 0x0, 0x0, 0x0, 0x9, 0x40, + 0x5, 0xfd, 0xdd, 0xe1, 0xc, 0xbd, 0xcc, 0x6a, + 0x40, 0x0, 0xd0, 0xb, 0x8, 0x35, 0x9d, 0xb, + 0x32, 0xb0, 0xc, 0xbd, 0xcc, 0x84, 0xc, 0x34, + 0x60, 0xb, 0x8, 0x35, 0x60, 0xe, 0x80, 0x0, + 0x9, 0xbd, 0xcb, 0x40, 0x1f, 0xd0, 0x0, 0x0, + 0x8, 0x30, 0x0, 0x88, 0xb2, 0x0, 0x5d, 0xde, + 0xed, 0xd3, 0xe1, 0x4b, 0x0, 0x0, 0x8, 0x30, + 0x2d, 0x40, 0xb, 0x80, 0x0, 0x8, 0x30, 0xb3, + 0x0, 0x0, 0xa4, + + /* U+8EE2 "転" */ + 0x0, 0x7, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x50, 0x2, 0x88, 0x88, 0x80, 0xd, 0xde, + 0xed, 0xc2, 0x77, 0x77, 0x70, 0x0, 0x8, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xbd, 0xcc, 0x90, + 0x0, 0x0, 0x0, 0xa, 0x16, 0x43, 0x95, 0x55, + 0x55, 0x53, 0xa, 0xbd, 0xcc, 0x97, 0x7d, 0xa7, + 0x74, 0xa, 0x16, 0x43, 0x90, 0x1e, 0x10, 0x0, + 0x7, 0xbd, 0xdb, 0x60, 0x6a, 0x5, 0x0, 0x0, + 0x7, 0x50, 0x0, 0xd3, 0xa, 0x50, 0x2d, 0xde, + 0xed, 0xc6, 0xa0, 0x3, 0xc0, 0x0, 0x7, 0x50, + 0x1e, 0x98, 0xab, 0xf3, 0x0, 0x7, 0x50, 0x7, + 0x53, 0x20, 0x67, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8EFD "軽" */ + 0x0, 0x8, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x84, 0x0, 0xce, 0xdd, 0xdf, 0x20, 0xd, + 0xde, 0xed, 0xa1, 0xd0, 0x2, 0xc0, 0x0, 0x0, + 0x95, 0x0, 0x8, 0x80, 0xb5, 0x0, 0xc, 0xad, + 0xcc, 0x80, 0xc, 0xb9, 0x0, 0x0, 0xb0, 0x73, + 0x38, 0x2, 0xbe, 0x90, 0x0, 0xc, 0xad, 0xcc, + 0xba, 0xd5, 0x17, 0xe8, 0x0, 0xb0, 0x73, 0x39, + 0x40, 0x1d, 0x0, 0x30, 0x8, 0xbd, 0xcb, 0x63, + 0x56, 0xe5, 0x51, 0x0, 0x0, 0x84, 0x0, 0x58, + 0x8e, 0x88, 0x20, 0x2d, 0xde, 0xed, 0xb0, 0x1, + 0xd0, 0x0, 0x0, 0x0, 0x84, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x0, 0x8, 0x40, 0x7d, 0xdd, 0xfd, + 0xdc, 0x0, + + /* U+8F03 "較" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x1c, + 0x0, 0x0, 0xd, 0x20, 0x0, 0x3d, 0xdf, 0xdd, + 0x67, 0x7a, 0x87, 0x71, 0x0, 0x2d, 0x0, 0x46, + 0x75, 0x67, 0x51, 0xe, 0xae, 0xac, 0x6, 0xa0, + 0x2c, 0x0, 0xc, 0xb, 0xc, 0x1d, 0x10, 0x6, + 0xa0, 0xe, 0xae, 0xac, 0xa7, 0x60, 0x46, 0xa2, + 0xc, 0xb, 0xc, 0x0, 0xd0, 0xb4, 0x0, 0xb, + 0xbf, 0xb8, 0x0, 0x79, 0xd0, 0x0, 0x0, 0x1c, + 0x0, 0x0, 0xf, 0x60, 0x0, 0x5d, 0xdf, 0xdd, + 0x10, 0x8d, 0xd1, 0x0, 0x0, 0x1c, 0x0, 0x1a, + 0xa0, 0x5d, 0x40, 0x0, 0x1c, 0x0, 0xc5, 0x0, + 0x2, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8F09 "載" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x86, 0x46, 0x0, 0x5, 0xcc, + 0xfc, 0xc7, 0x86, 0xb, 0x60, 0x0, 0x0, 0xd0, + 0x0, 0x86, 0x0, 0x80, 0xb, 0xbb, 0xfb, 0xbb, + 0xdd, 0xbb, 0xb5, 0x2, 0x22, 0xd2, 0x22, 0x89, + 0x23, 0x31, 0x7, 0xbb, 0xfb, 0xba, 0x49, 0x4, + 0x90, 0x1, 0x44, 0xe4, 0x42, 0x3b, 0xa, 0x40, + 0x5, 0x84, 0xc4, 0x69, 0x1d, 0x1d, 0x0, 0x5, + 0xb8, 0xe8, 0xa9, 0xd, 0xb5, 0x0, 0x5, 0xa6, + 0xd6, 0x89, 0xa, 0xc0, 0x0, 0x0, 0x22, 0xd2, + 0x21, 0x2e, 0xb0, 0x38, 0xa, 0xbb, 0xfb, 0xbd, + 0xc3, 0xd4, 0x67, 0x0, 0x0, 0xd0, 0x1b, 0x10, + 0x2d, 0xd2, + + /* U+8F15 "輕" */ + 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x0, 0x8d, 0xdd, 0xdd, 0xd2, 0x3d, 0xdf, + 0xdc, 0x5, 0x3, 0x20, 0x50, 0x0, 0x1c, 0x0, + 0x1c, 0xb, 0x17, 0x70, 0xe, 0xae, 0xac, 0x84, + 0x58, 0x1c, 0x0, 0xb, 0xa, 0xb, 0xa3, 0x67, + 0x2c, 0x0, 0xe, 0xbe, 0xbc, 0x1c, 0xb, 0x27, + 0x70, 0xb, 0xa, 0xb, 0x7, 0x23, 0x60, 0xa0, + 0xb, 0xbf, 0xb8, 0x49, 0x99, 0x99, 0x80, 0x0, + 0xc, 0x0, 0x13, 0x3e, 0x43, 0x30, 0x5d, 0xdf, + 0xdd, 0x10, 0xd, 0x10, 0x0, 0x0, 0xc, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0xc, 0x3, 0xcc, + 0xcf, 0xdc, 0xc4, + + /* U+8F2A "輪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0xd, + 0x0, 0x0, 0x7f, 0x80, 0x0, 0x2d, 0xdf, 0xdc, + 0x3, 0xe2, 0xb7, 0x0, 0x3, 0x3d, 0x32, 0x3e, + 0x30, 0xb, 0x80, 0xc, 0x6d, 0x7c, 0xeb, 0xcc, + 0xcc, 0xa7, 0xc, 0x2b, 0x3a, 0x10, 0x0, 0x0, + 0x0, 0xd, 0x8d, 0x9a, 0x8d, 0xdd, 0xdc, 0xc0, + 0xb, 0xb, 0x1a, 0xa2, 0x91, 0xb0, 0xc0, 0xa, + 0xbf, 0xb7, 0xa2, 0x91, 0xb0, 0xc0, 0x0, 0xd, + 0x0, 0xae, 0xfe, 0xfe, 0xe0, 0x4d, 0xdf, 0xdc, + 0xa2, 0x91, 0xb0, 0xc0, 0x0, 0xd, 0x0, 0xa2, + 0x91, 0xb0, 0xc0, 0x0, 0xd, 0x0, 0xa2, 0x91, + 0xb7, 0xa0, + + /* U+8F38 "輸" */ + 0x0, 0x1c, 0x0, 0x0, 0xb, 0x10, 0x0, 0x0, + 0x1c, 0x0, 0x0, 0x9d, 0xb0, 0x0, 0x2d, 0xdf, + 0xdb, 0x8, 0xb0, 0x7b, 0x10, 0x0, 0x2c, 0x1, + 0xc9, 0x0, 0x6, 0xd4, 0xd, 0xae, 0xba, 0x2b, + 0xbb, 0xbb, 0x31, 0xc, 0x1b, 0x39, 0x58, 0x85, + 0x20, 0x80, 0xd, 0x9e, 0xa9, 0x94, 0x49, 0x81, + 0xb0, 0xb, 0xb, 0x19, 0x9a, 0xa9, 0x81, 0xb0, + 0xb, 0xbe, 0xb7, 0x93, 0x39, 0x81, 0xb0, 0x1, + 0x2c, 0x11, 0x9a, 0xa9, 0x81, 0xb0, 0x3b, 0xbe, + 0xba, 0x93, 0x49, 0x81, 0xb0, 0x0, 0x1b, 0x0, + 0x91, 0x29, 0x0, 0xb0, 0x0, 0x1b, 0x0, 0x92, + 0xa6, 0x1b, 0xc0, 0x0, 0x1, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+8F9B "辛" */ + 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x3, 0xdd, + 0xdd, 0xee, 0xdd, 0xdd, 0x40, 0x0, 0x4, 0x80, + 0x0, 0x7, 0x60, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0xd, 0x20, 0x0, 0x1, 0x11, 0xb4, 0x11, 0x5c, + 0x11, 0x10, 0x2c, 0xcc, 0xcc, 0xee, 0xcc, 0xcc, + 0xc3, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x7, + 0xee, 0xee, 0xff, 0xee, 0xee, 0x90, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, + + /* U+8F9E "辞" */ + 0x0, 0x1, 0x55, 0x0, 0x17, 0x0, 0x0, 0x3a, + 0xdf, 0x84, 0x0, 0xb, 0x20, 0x0, 0x12, 0x1d, + 0x0, 0x8d, 0xdd, 0xdd, 0xd0, 0x0, 0x1d, 0x0, + 0x9, 0x10, 0xc, 0x0, 0x59, 0xae, 0x99, 0x6, + 0x70, 0x3b, 0x0, 0x24, 0x6e, 0x44, 0x2, 0x80, + 0x85, 0x0, 0x0, 0x1d, 0x0, 0xdd, 0xdf, 0xed, + 0xd3, 0x2, 0x3d, 0x21, 0x0, 0xd, 0x10, 0x0, + 0xf, 0xbb, 0xca, 0x0, 0xd, 0x10, 0x0, 0xd, + 0x0, 0x2a, 0xad, 0xdf, 0xdd, 0xd0, 0xd, 0x0, + 0x2a, 0x0, 0xd, 0x10, 0x0, 0xf, 0xdd, 0xda, + 0x0, 0xd, 0x10, 0x0, 0xd, 0x0, 0x15, 0x0, + 0xd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, + + /* U+8FA6 "辦" */ + 0x0, 0x90, 0x0, 0xc0, 0x0, 0x83, 0x0, 0x1, + 0xb4, 0x10, 0xc0, 0x1, 0x5a, 0x10, 0x2b, 0xbb, + 0x90, 0xc0, 0x9, 0xba, 0xb3, 0x9, 0x7, 0x4c, + 0xfc, 0x75, 0x50, 0xc0, 0x9, 0x3a, 0x11, 0xb3, + 0x93, 0x92, 0x90, 0x5, 0x3b, 0x1, 0xa3, 0x90, + 0x85, 0x60, 0x3c, 0xed, 0xb2, 0x93, 0x9b, 0xce, + 0xc5, 0x0, 0x93, 0x4, 0x73, 0x80, 0x1b, 0x0, + 0x1b, 0xec, 0x86, 0x53, 0x86, 0xae, 0x93, 0x0, + 0xb2, 0xa, 0x24, 0x81, 0x4c, 0x20, 0x0, 0xc0, + 0xc, 0x5, 0x70, 0x1b, 0x0, 0x3, 0x90, 0x57, + 0x7, 0x50, 0x1b, 0x0, 0xb, 0x10, 0xa0, 0xad, + 0x20, 0x1b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8FB2 "農" */ + 0x0, 0x0, 0xe, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0xaa, 0xaf, 0xaa, 0xfa, 0xab, 0x0, 0x0, 0xd0, + 0xe, 0x0, 0xe0, 0xe, 0x0, 0x0, 0xea, 0xaf, + 0xaa, 0xfa, 0xaf, 0x0, 0x0, 0xe6, 0x6f, 0x66, + 0xf6, 0x6f, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x0, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa0, 0x0, 0xd2, 0x77, 0x77, 0x77, 0x74, 0x0, + 0x1, 0xc1, 0x22, 0x22, 0x22, 0x21, 0x0, 0x3, + 0xeb, 0xfb, 0xce, 0xbb, 0xbd, 0xb2, 0x5, 0x80, + 0xe0, 0xb, 0x63, 0xaa, 0x0, 0xb, 0x40, 0xe1, + 0x46, 0xaf, 0x60, 0x0, 0x3c, 0x5, 0xfb, 0x72, + 0x3, 0xad, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, + + /* U+8FBA "辺" */ + 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xe3, 0xc, 0xdd, 0xdd, 0xdd, 0xa0, 0x0, 0x3e, + 0x10, 0x3, 0xc0, 0x3, 0xb0, 0x0, 0x1, 0x0, + 0x4, 0xa0, 0x3, 0xb0, 0x0, 0x0, 0x0, 0x6, + 0x80, 0x4, 0xa0, 0x0, 0x0, 0x0, 0xa, 0x40, + 0x4, 0xa0, 0x1d, 0xdd, 0x0, 0xe, 0x0, 0x5, + 0x90, 0x0, 0xd, 0x0, 0x79, 0x0, 0x6, 0x80, + 0x0, 0xd, 0x4, 0xe1, 0x0, 0x9, 0x60, 0x0, + 0xd, 0x1d, 0x20, 0x9, 0xce, 0x10, 0x0, 0x7f, + 0x20, 0x0, 0x0, 0x10, 0x0, 0x7, 0xc7, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, 0x18, 0xdd, + 0xcd, 0xdd, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8FBC "込" */ + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xc1, 0x0, 0x2d, 0x20, 0x0, 0x0, 0x0, 0x5c, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xec, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xba, + 0x30, 0x0, 0x1d, 0xdd, 0x0, 0x9, 0x64, 0xa0, + 0x0, 0x0, 0xd, 0x0, 0x2e, 0x0, 0xe1, 0x0, + 0x0, 0xd, 0x0, 0xc6, 0x0, 0x7b, 0x0, 0x0, + 0xd, 0x1b, 0x90, 0x0, 0xb, 0xb1, 0x0, 0x5e, + 0x37, 0x0, 0x0, 0x0, 0x62, 0x8, 0xa4, 0xb8, + 0x32, 0x11, 0x22, 0x32, 0x9, 0x0, 0x4, 0x9a, + 0xbb, 0xbb, 0xa5, + + /* U+8FCE "迎" */ + 0x0, 0x0, 0x0, 0x2a, 0x60, 0x0, 0x0, 0x7, + 0x80, 0xa, 0xb4, 0xd, 0xdd, 0xd0, 0x0, 0x7c, + 0xd, 0x0, 0xd, 0x0, 0xd0, 0x0, 0x3, 0xd, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, + 0xd, 0x0, 0xd0, 0x1d, 0xd9, 0xd, 0x0, 0xd, + 0x0, 0xd0, 0x0, 0x3a, 0xd, 0x0, 0xd, 0x0, + 0xd0, 0x0, 0x3a, 0xd, 0x0, 0x2d, 0x0, 0xd0, + 0x0, 0x3a, 0xf, 0xae, 0x5d, 0x0, 0xe0, 0x0, + 0x3a, 0x4b, 0x40, 0xd, 0x3c, 0x90, 0x0, 0x4c, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x5, 0xb6, 0xb4, + 0x0, 0x4, 0x0, 0x0, 0xd, 0x10, 0x18, 0xdd, + 0xcd, 0xde, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8FD1 "近" */ + 0x2, 0x20, 0x0, 0x1, 0x23, 0x69, 0x90, 0x2, + 0xd3, 0x0, 0xec, 0xa9, 0x74, 0x0, 0x0, 0x3d, + 0x10, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfb, + 0xbb, 0xbb, 0xb6, 0xd, 0xdb, 0x0, 0xf1, 0x11, + 0xe1, 0x10, 0x0, 0x1d, 0x1, 0xc0, 0x0, 0xe0, + 0x0, 0x0, 0xd, 0x3, 0xa0, 0x0, 0xe0, 0x0, + 0x0, 0xd, 0x8, 0x70, 0x0, 0xe0, 0x0, 0x0, + 0xd, 0xe, 0x20, 0x0, 0xe0, 0x0, 0x0, 0x9e, + 0x56, 0x0, 0x0, 0xa0, 0x0, 0xa, 0x80, 0xa9, + 0x31, 0x0, 0x1, 0x33, 0xa, 0x0, 0x4, 0xac, + 0xdd, 0xdd, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8FD4 "返" */ + 0x1, 0x0, 0x0, 0x0, 0x2, 0x47, 0x10, 0xc, + 0x50, 0xb, 0xdd, 0xdb, 0x97, 0x20, 0x1, 0xd3, + 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0xe, + 0x33, 0x33, 0x33, 0x0, 0x0, 0x0, 0xe, 0x99, + 0x99, 0xae, 0x0, 0x5b, 0xb2, 0xe, 0x23, 0x0, + 0x98, 0x0, 0x12, 0xc3, 0x1c, 0x2d, 0x53, 0xe1, + 0x0, 0x0, 0xb3, 0x4a, 0x1, 0xbe, 0x40, 0x0, + 0x0, 0xb3, 0x95, 0x3, 0xdb, 0xb0, 0x0, 0x0, + 0xb5, 0xd2, 0x9d, 0x30, 0x8c, 0x10, 0x2, 0xe7, + 0x21, 0x60, 0x0, 0x5, 0x0, 0x2d, 0x39, 0xa3, + 0x10, 0x0, 0x13, 0x50, 0x74, 0x0, 0x39, 0xcd, + 0xed, 0xdc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8FEB "迫" */ + 0x4, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, 0x8, + 0xb0, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0xa9, + 0xc, 0xde, 0xfd, 0xdd, 0x10, 0x0, 0x2, 0xe, + 0x10, 0x0, 0xe, 0x10, 0x0, 0x0, 0xe, 0x10, + 0x0, 0xe, 0x10, 0x7c, 0xc2, 0xe, 0x10, 0x0, + 0xe, 0x10, 0x12, 0xc3, 0xe, 0xdc, 0xcc, 0xcf, + 0x10, 0x0, 0xb3, 0xe, 0x10, 0x0, 0xe, 0x10, + 0x0, 0xb3, 0xe, 0x10, 0x0, 0xe, 0x10, 0x0, + 0xb3, 0xe, 0xdd, 0xdd, 0xdf, 0x10, 0x3, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x6b, 0xa3, + 0x0, 0x0, 0x0, 0x10, 0x96, 0x0, 0x5c, 0xee, + 0xee, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+8FFD "追" */ + 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, 0x0, 0x5, + 0xa0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x7a, + 0x0, 0xfb, 0xbb, 0xbf, 0x0, 0x0, 0x3, 0x0, + 0xd0, 0x0, 0xe, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0xaa, 0xaf, 0x0, 0x1f, 0xfd, 0x0, 0xd2, 0x22, + 0x22, 0x0, 0x0, 0x1d, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xfc, 0xcc, 0xce, 0x70, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x6, 0x70, 0x0, + 0xd, 0x0, 0xd0, 0x0, 0x6, 0x70, 0x0, 0x1d, + 0x0, 0xcc, 0xcc, 0xcc, 0x60, 0x3, 0xda, 0xa2, + 0x0, 0x0, 0x0, 0x1, 0xd, 0x20, 0x4b, 0xdd, + 0xcd, 0xde, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, + + /* U+9000 "退" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xb0, 0x1, 0xfc, 0xcc, 0xcf, 0x0, 0x0, 0x7b, + 0x1, 0xd0, 0x0, 0xe, 0x0, 0x0, 0x6, 0x1, + 0xfb, 0xbb, 0xbf, 0x0, 0x0, 0x0, 0x1, 0xd0, + 0x0, 0xe, 0x0, 0xd, 0xdb, 0x1, 0xfc, 0xcc, + 0xcf, 0x0, 0x0, 0x1c, 0x1, 0xd0, 0x31, 0x4, + 0xb0, 0x0, 0x1c, 0x1, 0xd0, 0x3c, 0x8a, 0x10, + 0x0, 0x1c, 0x1, 0xd0, 0x3, 0xc3, 0x0, 0x0, + 0x1c, 0x5, 0xfb, 0xc3, 0x1c, 0x30, 0x0, 0x5e, + 0x25, 0x61, 0x0, 0x2, 0x50, 0x7, 0xb3, 0xb7, + 0x20, 0x0, 0x1, 0x22, 0xb, 0x0, 0x5, 0xbc, + 0xdd, 0xdd, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9001 "送" */ + 0x4, 0x0, 0x2, 0x40, 0x0, 0x35, 0x0, 0x9, + 0x90, 0x1, 0xd1, 0x0, 0xb4, 0x0, 0x0, 0xb6, + 0x0, 0x64, 0x4, 0xb0, 0x0, 0x0, 0x12, 0x4d, + 0xdd, 0xfd, 0xdd, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0x7e, 0xe3, 0x0, 0x0, 0xf0, + 0x0, 0x0, 0x0, 0xb3, 0xae, 0xee, 0xfe, 0xee, + 0xe0, 0x0, 0xb3, 0x0, 0x4, 0xf7, 0x0, 0x0, + 0x0, 0xb3, 0x0, 0xd, 0x4b, 0x80, 0x0, 0x0, + 0xb3, 0x2, 0xc7, 0x0, 0xa8, 0x0, 0x1, 0xd5, + 0x5d, 0x50, 0x0, 0xb, 0x30, 0x2d, 0x6b, 0x82, + 0x0, 0x0, 0x0, 0x10, 0x96, 0x0, 0x6c, 0xee, + 0xde, 0xef, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9003 "逃" */ + 0x2, 0x0, 0x0, 0xd, 0xd, 0x0, 0x0, 0x7, + 0xb0, 0x43, 0xd, 0xd, 0x3, 0x60, 0x0, 0x8a, + 0x2c, 0xd, 0xd, 0xb, 0x40, 0x0, 0x4, 0x9, + 0x5d, 0xd, 0x4a, 0x0, 0x0, 0x0, 0x2, 0x2d, + 0xd, 0x41, 0x0, 0x1d, 0xd9, 0x0, 0x2d, 0xd, + 0x60, 0x0, 0x0, 0x3a, 0x8, 0xcd, 0xd, 0x8b, + 0x10, 0x0, 0x3a, 0x97, 0x4a, 0xd, 0x5, 0xb0, + 0x0, 0x3a, 0x0, 0x95, 0xd, 0x0, 0x20, 0x0, + 0x3a, 0x5, 0xc0, 0xd, 0x0, 0x84, 0x0, 0x3b, + 0x3b, 0x0, 0x6, 0xcd, 0xa0, 0x3, 0xb8, 0x82, + 0x0, 0x0, 0x0, 0x11, 0xd, 0x20, 0x3a, 0xdd, + 0xcd, 0xdf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, + + /* U+900F "透" */ + 0x2, 0x0, 0x0, 0x1, 0x24, 0x68, 0x50, 0x8, + 0xb0, 0x9, 0xa9, 0xad, 0x53, 0x0, 0x0, 0x99, + 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x7, 0x4b, + 0xbc, 0xff, 0xdb, 0xb6, 0x0, 0x0, 0x0, 0x1b, + 0x9c, 0xb2, 0x0, 0x2, 0x21, 0x5, 0xc4, 0x3a, + 0x1c, 0x70, 0xb, 0xca, 0x7a, 0x76, 0x78, 0x61, + 0x86, 0x0, 0x3a, 0x1, 0x5b, 0x95, 0xd1, 0x10, + 0x0, 0x3a, 0x0, 0xd, 0x20, 0xaa, 0xe0, 0x0, + 0x3a, 0x0, 0x99, 0x0, 0x0, 0xc0, 0x0, 0x3c, + 0x3e, 0x80, 0x1, 0xbc, 0x60, 0x3, 0xed, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x50, 0x3a, 0xed, + 0xdd, 0xde, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9010 "逐" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x30, 0xcc, 0xcd, 0xfc, 0xcc, 0xa0, 0x2, 0xd2, + 0x0, 0x3d, 0x40, 0x0, 0x0, 0x0, 0x31, 0x18, + 0xca, 0x60, 0xb, 0x40, 0x0, 0x0, 0xc5, 0x5, + 0xf3, 0xb5, 0x0, 0x7d, 0xd3, 0x0, 0x89, 0x4f, + 0x50, 0x0, 0x0, 0xb3, 0x6d, 0x50, 0x9f, 0xd2, + 0x0, 0x0, 0xb3, 0x20, 0x9, 0x7c, 0x3d, 0x20, + 0x0, 0xb3, 0x5, 0xd5, 0xc, 0x13, 0xc0, 0x0, + 0xb4, 0xca, 0x10, 0xe, 0x0, 0x10, 0x0, 0xc5, + 0x10, 0x29, 0xc8, 0x0, 0x0, 0x1c, 0x9b, 0x93, + 0x14, 0x30, 0x1, 0x20, 0x67, 0x0, 0x49, 0xcd, + 0xdd, 0xdd, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9019 "這" */ + 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x6, + 0x70, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x9c, + 0x5c, 0xcc, 0xcc, 0xcc, 0xc3, 0x0, 0x5, 0x0, + 0x23, 0x33, 0x33, 0x0, 0x0, 0x0, 0x0, 0x67, + 0x77, 0x77, 0x0, 0xd, 0xd9, 0x0, 0x56, 0x66, + 0x66, 0x0, 0x0, 0x3b, 0x0, 0x33, 0x33, 0x33, + 0x0, 0x0, 0x3b, 0x0, 0xbb, 0xbb, 0xbb, 0x10, + 0x0, 0x3b, 0x0, 0xe0, 0x0, 0xd, 0x10, 0x0, + 0x3b, 0x0, 0xe0, 0x0, 0xd, 0x10, 0x0, 0x5c, + 0x0, 0xcb, 0xbb, 0xbc, 0x10, 0x5, 0xb6, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x10, 0x18, 0xdd, + 0xcd, 0xde, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+901A "通" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x50, 0xb, 0xcc, 0xcc, 0xcf, 0xa0, 0x1, 0xc5, + 0x0, 0x2a, 0x41, 0xaa, 0x0, 0x0, 0x1b, 0x0, + 0x2, 0x8e, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xbb, + 0xcf, 0xbb, 0xf0, 0x5, 0x54, 0xe, 0x0, 0x1c, + 0x0, 0xe0, 0x18, 0x9c, 0xe, 0xbb, 0xbe, 0xbb, + 0xf0, 0x0, 0x2c, 0xe, 0x0, 0x1c, 0x0, 0xe0, + 0x0, 0x2c, 0xe, 0xbb, 0xcf, 0xbb, 0xf0, 0x0, + 0x2c, 0xe, 0x0, 0x1c, 0x0, 0xe0, 0x0, 0x4d, + 0xe, 0x0, 0x1c, 0x3b, 0xd0, 0x5, 0xb5, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x18, 0xcc, + 0xcc, 0xdd, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+901F "速" */ + 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x7, + 0x90, 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0xb7, + 0x5c, 0xcc, 0xfd, 0xcc, 0xc7, 0x0, 0x1b, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xcc, + 0xec, 0xcc, 0xe0, 0x1a, 0xaa, 0xd, 0x0, 0xb2, + 0x0, 0xe0, 0x0, 0xe, 0xd, 0xbb, 0xec, 0xbb, + 0xe0, 0x0, 0xe, 0x0, 0x8, 0xfe, 0x40, 0x0, + 0x0, 0xe, 0x0, 0x4b, 0xb5, 0xd7, 0x0, 0x0, + 0xe, 0x6, 0xd1, 0xb2, 0xb, 0x90, 0x0, 0xe, + 0x4b, 0x10, 0xb2, 0x0, 0x91, 0x3, 0xdb, 0xb4, + 0x0, 0x71, 0x0, 0x0, 0xd, 0x30, 0x29, 0xdd, + 0xcc, 0xdd, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, + + /* U+9020 "造" */ + 0x1, 0x0, 0x0, 0x63, 0x3b, 0x0, 0x0, 0x6, + 0xc0, 0x0, 0xe2, 0x3b, 0x0, 0x0, 0x0, 0x8a, + 0x6, 0xfd, 0xdf, 0xdd, 0x80, 0x0, 0x7, 0x2e, + 0x20, 0x3b, 0x0, 0x0, 0x0, 0x0, 0x14, 0x0, + 0x3b, 0x0, 0x0, 0x2, 0x21, 0x5c, 0xcc, 0xcc, + 0xcc, 0xc3, 0x1b, 0xca, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0x2, 0xfc, 0xcc, 0xcf, 0x20, + 0x0, 0x3a, 0x2, 0xb0, 0x0, 0xc, 0x20, 0x0, + 0x3a, 0x2, 0xb0, 0x0, 0xc, 0x20, 0x0, 0x3b, + 0x1, 0xcc, 0xcc, 0xcc, 0x10, 0x3, 0xda, 0x92, + 0x0, 0x0, 0x0, 0x1, 0xd, 0x20, 0x4b, 0xdd, + 0xcd, 0xde, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, + + /* U+9023 "連" */ + 0x9, 0x10, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x6, + 0xb0, 0x99, 0x9a, 0xe9, 0x99, 0x70, 0x0, 0xa7, + 0x22, 0x25, 0xc2, 0x22, 0x20, 0x0, 0x11, 0x3b, + 0xbc, 0xeb, 0xbb, 0x0, 0x0, 0x0, 0x48, 0x2, + 0xc0, 0xd, 0x0, 0x8e, 0xf3, 0x4d, 0xbb, 0xeb, + 0xbf, 0x0, 0x0, 0xb3, 0x48, 0x2, 0xc0, 0xd, + 0x0, 0x0, 0xb3, 0x4d, 0xbc, 0xeb, 0xbd, 0x0, + 0x0, 0xb3, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + 0xb6, 0xcc, 0xcd, 0xfc, 0xcc, 0xc0, 0x1, 0xd5, + 0x0, 0x2, 0xc0, 0x0, 0x0, 0x2d, 0x5c, 0x71, + 0x0, 0x10, 0x0, 0x21, 0x95, 0x0, 0x6d, 0xed, + 0xde, 0xef, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+902E "逮" */ + 0x8, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xa, + 0x80, 0x3b, 0xbb, 0xfb, 0xba, 0x0, 0x0, 0xd2, + 0x0, 0x0, 0xd0, 0xe, 0x0, 0x0, 0x13, 0xbb, + 0xbb, 0xfb, 0xbf, 0xb1, 0x0, 0x0, 0x0, 0x0, + 0xd0, 0xe, 0x0, 0x8d, 0xf2, 0x4b, 0xbc, 0xfb, + 0xbc, 0x0, 0x0, 0xb2, 0x36, 0x0, 0xd0, 0x9, + 0x10, 0x0, 0xb2, 0xa, 0x60, 0xe3, 0xa6, 0x0, + 0x0, 0xb2, 0x0, 0x7b, 0xec, 0xa0, 0x0, 0x0, + 0xb3, 0x4c, 0x92, 0xd0, 0x7c, 0x20, 0x0, 0xc3, + 0x92, 0x1, 0xd0, 0x4, 0x70, 0x1c, 0x5b, 0x61, + 0x4b, 0x60, 0x0, 0x0, 0x95, 0x0, 0x6c, 0xed, + 0xde, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9031 "週" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0x80, 0xd, 0xcc, 0xdc, 0xcc, 0xd0, 0x0, 0xa9, + 0xd, 0x0, 0xc0, 0x0, 0xd0, 0x0, 0x6, 0xd, + 0x4b, 0xeb, 0xb2, 0xd0, 0x0, 0x0, 0xd, 0x12, + 0xc3, 0x20, 0xd0, 0x7, 0x75, 0xd, 0x37, 0x77, + 0x72, 0xd0, 0x5, 0x7a, 0xd, 0x1b, 0xbb, 0x80, + 0xd0, 0x0, 0x3a, 0xd, 0x19, 0x1, 0xc0, 0xd0, + 0x0, 0x3a, 0x49, 0x1a, 0x34, 0xc0, 0xd0, 0x0, + 0x3a, 0xa5, 0x7, 0x77, 0x50, 0xd0, 0x0, 0x4d, + 0x80, 0x0, 0x0, 0xbc, 0x90, 0x4, 0xe8, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x30, 0x18, 0xdd, + 0xcc, 0xdd, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, + + /* U+9032 "進" */ + 0x5, 0x10, 0x0, 0x36, 0x26, 0x0, 0x0, 0x5, + 0xe2, 0x0, 0xb3, 0xe, 0x10, 0x0, 0x0, 0x5d, + 0x3, 0xfa, 0xad, 0xca, 0xa4, 0x0, 0x1, 0xd, + 0xc2, 0x2e, 0x22, 0x21, 0x0, 0x0, 0xbc, 0xb0, + 0xd, 0x0, 0x0, 0x3, 0x43, 0x83, 0xeb, 0xbf, + 0xbb, 0xb0, 0x8, 0xbb, 0x2, 0xb0, 0xd, 0x0, + 0x0, 0x0, 0x3b, 0x2, 0xec, 0xcf, 0xcc, 0xc0, + 0x0, 0x3b, 0x2, 0xb0, 0xd, 0x0, 0x0, 0x0, + 0x3b, 0x2, 0xea, 0xaf, 0xaa, 0xa7, 0x0, 0x6d, + 0x10, 0x22, 0x22, 0x22, 0x21, 0x6, 0xe9, 0xd7, + 0x10, 0x0, 0x0, 0x2, 0xd, 0x30, 0x18, 0xdf, + 0xee, 0xef, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, + + /* U+9045 "遅" */ + 0x5, 0x40, 0xc, 0xbb, 0xbb, 0xbb, 0xf0, 0x1, + 0xb9, 0xc, 0x10, 0x0, 0x0, 0xe0, 0x0, 0x7, + 0x1c, 0xbd, 0xbb, 0xbd, 0xb0, 0x0, 0x0, 0xc, + 0x17, 0x50, 0x3b, 0x0, 0xc, 0xc9, 0xd, 0x8c, + 0xdc, 0xdc, 0xb0, 0x0, 0x4b, 0xd, 0x0, 0xe, + 0x0, 0x0, 0x0, 0x3b, 0xd, 0x3b, 0xbf, 0xbb, + 0x80, 0x0, 0x3b, 0x3a, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x3b, 0x86, 0xbb, 0xbf, 0xbb, 0xb3, 0x0, + 0x4c, 0x90, 0x0, 0xe, 0x0, 0x0, 0x5, 0xc7, + 0xb4, 0x0, 0x4, 0x0, 0x0, 0xd, 0x10, 0x29, + 0xdd, 0xcd, 0xde, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+904A "遊" */ + 0x0, 0x0, 0x3, 0x40, 0x3, 0x80, 0x0, 0x9, + 0x40, 0x1, 0xc0, 0xa, 0x92, 0x22, 0x1, 0xc5, + 0xcc, 0xfd, 0xbe, 0x99, 0x96, 0x0, 0x14, 0xc, + 0x0, 0x87, 0x33, 0x30, 0x0, 0x0, 0xc, 0xaa, + 0x35, 0x78, 0xe2, 0x2f, 0xfa, 0xc, 0x29, 0x40, + 0xc, 0x30, 0x0, 0x3a, 0xc, 0x9, 0x30, 0xc, + 0x0, 0x0, 0x3a, 0xb, 0xa, 0x6c, 0xcf, 0xc9, + 0x0, 0x3a, 0x48, 0xb, 0x20, 0xc, 0x0, 0x0, + 0x3a, 0xb2, 0xc, 0x0, 0xc, 0x0, 0x0, 0x6d, + 0x72, 0xca, 0x6, 0xca, 0x0, 0x6, 0xb4, 0xb6, + 0x0, 0x0, 0x0, 0x1, 0xd, 0x10, 0x7, 0xcd, + 0xdd, 0xde, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+904B "運" */ + 0x6, 0x50, 0x8c, 0xbb, 0xbb, 0xbb, 0xd6, 0x1, + 0xd3, 0x83, 0x0, 0x91, 0x0, 0x76, 0x0, 0x29, + 0x48, 0xbb, 0xfb, 0xbb, 0x63, 0x0, 0x0, 0x5, + 0x66, 0xe7, 0x66, 0x40, 0x2, 0x22, 0xd, 0x33, + 0xd4, 0x35, 0xa0, 0x1a, 0xbb, 0xd, 0xaa, 0xfa, + 0xab, 0xa0, 0x0, 0x2b, 0xd, 0x33, 0xd4, 0x36, + 0xa0, 0x0, 0x2b, 0x5, 0x66, 0xe7, 0x66, 0x40, + 0x0, 0x2b, 0x6c, 0xcc, 0xfc, 0xcc, 0xc6, 0x0, + 0x9e, 0x30, 0x0, 0xd1, 0x0, 0x0, 0xa, 0x81, + 0xb9, 0x31, 0x50, 0x1, 0x23, 0xa, 0x0, 0x4, + 0xab, 0xcc, 0xcc, 0xb8, + + /* U+904E "過" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x90, 0x1, 0xeb, 0xbb, 0xe8, 0x0, 0x0, 0xb9, + 0x1, 0xc1, 0x10, 0x98, 0x0, 0x0, 0x4, 0x1, + 0xe9, 0xc0, 0x98, 0x0, 0x0, 0x0, 0x1, 0xb0, + 0x80, 0x98, 0x0, 0x8d, 0xf3, 0x2d, 0xdc, 0xdc, + 0xdd, 0xa0, 0x0, 0xb3, 0x3a, 0x0, 0x0, 0x2, + 0xb0, 0x0, 0xb3, 0x3a, 0x1e, 0xbe, 0x12, 0xb0, + 0x0, 0xb3, 0x3a, 0x1a, 0xa, 0x12, 0xb0, 0x0, + 0xb3, 0x3a, 0x1e, 0xad, 0x12, 0xb0, 0x3, 0xe6, + 0x3a, 0x5, 0x0, 0xbc, 0x80, 0x2d, 0x3a, 0x92, + 0x0, 0x0, 0x0, 0x11, 0x94, 0x0, 0x5c, 0xed, + 0xde, 0xef, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9053 "道" */ + 0x0, 0x0, 0x0, 0x63, 0x0, 0x54, 0x0, 0x8, + 0x90, 0x0, 0x2b, 0x0, 0xd1, 0x0, 0x0, 0xa7, + 0x4c, 0xcd, 0xdd, 0xec, 0xc3, 0x0, 0x5, 0x0, + 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcb, + 0xeb, 0xbd, 0x0, 0xb, 0xb9, 0x2, 0xb0, 0x0, + 0xd, 0x0, 0x2, 0x2d, 0x2, 0xea, 0xaa, 0xaf, + 0x0, 0x0, 0xd, 0x2, 0xb0, 0x0, 0xd, 0x0, + 0x0, 0xd, 0x2, 0xeb, 0xbb, 0xbf, 0x0, 0x0, + 0xd, 0x2, 0xb0, 0x0, 0xd, 0x0, 0x0, 0x2e, + 0x2, 0xbb, 0xbb, 0xbb, 0x0, 0x4, 0xc6, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x10, 0x19, 0xdc, + 0xcc, 0xde, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9054 "達" */ + 0x3, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xc, + 0x60, 0x1b, 0xbb, 0xfb, 0xbb, 0x20, 0x1, 0xd4, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x32, 0xbb, + 0xcb, 0xfb, 0xcb, 0xb1, 0x0, 0x0, 0x0, 0xc0, + 0x0, 0xd0, 0x0, 0x13, 0x30, 0x47, 0xd8, 0x79, + 0xc7, 0x60, 0x5a, 0xe2, 0x24, 0x44, 0xf4, 0x44, + 0x30, 0x0, 0xb2, 0x1b, 0xbb, 0xfb, 0xbb, 0x40, + 0x0, 0xb2, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x0, + 0xb2, 0x9b, 0xbb, 0xfb, 0xbb, 0xb0, 0x2, 0xe7, + 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1d, 0x27, 0xb4, + 0x10, 0x40, 0x1, 0x31, 0x55, 0x0, 0x28, 0xbc, + 0xdd, 0xcc, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9055 "違" */ + 0x1, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, 0x8, + 0xa0, 0xa, 0xad, 0xda, 0xa5, 0x0, 0x0, 0x99, + 0x0, 0x1e, 0x0, 0x48, 0x0, 0x0, 0x4, 0x9b, + 0xbb, 0xbb, 0xbb, 0xb2, 0x0, 0x0, 0x7, 0xaa, + 0xaa, 0xaa, 0x0, 0x6, 0x64, 0xb, 0x10, 0x0, + 0xe, 0x0, 0x7, 0x9a, 0x9, 0xa9, 0x9c, 0x9c, + 0x0, 0x0, 0x3a, 0x36, 0x66, 0x6e, 0x66, 0x60, + 0x0, 0x3a, 0x1d, 0x43, 0x3e, 0x33, 0x30, 0x0, + 0x3a, 0x1f, 0xaa, 0xaf, 0xaa, 0x90, 0x0, 0x5c, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x6, 0xd9, 0xc4, + 0x0, 0x7, 0x0, 0x0, 0x1d, 0x10, 0x29, 0xdd, + 0xcc, 0xde, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+9060 "遠" */ + 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0x7, + 0x90, 0xa, 0xbb, 0xec, 0xbb, 0x50, 0x0, 0x8d, + 0x10, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x4, 0x8b, + 0xbb, 0xdc, 0xbb, 0xb3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x96, 0x8, 0xca, 0xaa, + 0xae, 0x10, 0x3, 0x6b, 0x8, 0x50, 0x0, 0xc, + 0x10, 0x0, 0x3b, 0x5, 0xbc, 0xfb, 0xbb, 0x60, + 0x0, 0x3b, 0x0, 0x3d, 0xec, 0x5b, 0x40, 0x0, + 0x3b, 0x29, 0xc2, 0xc3, 0x9a, 0x0, 0x0, 0x4c, + 0x55, 0x0, 0xc2, 0x4, 0x80, 0x5, 0xc8, 0xb4, + 0x0, 0x51, 0x0, 0x0, 0xd, 0x10, 0x29, 0xdd, + 0xcd, 0xde, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9069 "適" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0xb, 0x80, + 0xbb, 0xbb, 0xfb, 0xbb, 0xb0, 0x0, 0xc5, 0x0, + 0xc1, 0x2, 0xd0, 0x0, 0x0, 0x10, 0x36, 0xc8, + 0x6b, 0xb6, 0x30, 0x0, 0x0, 0x79, 0x55, 0xd5, + 0x59, 0x70, 0x36, 0x61, 0x77, 0xaa, 0xea, 0xa6, + 0x70, 0x59, 0xe2, 0x76, 0x0, 0xb0, 0x6, 0x70, + 0x0, 0xb2, 0x76, 0x4a, 0xca, 0x46, 0x70, 0x0, + 0xb2, 0x76, 0x65, 0x5, 0x56, 0x70, 0x0, 0xb2, + 0x76, 0x6b, 0x99, 0x36, 0x70, 0x2, 0xe7, 0x65, + 0x0, 0x0, 0xac, 0x30, 0x1d, 0x17, 0xb4, 0x10, + 0x0, 0x1, 0x30, 0x55, 0x0, 0x28, 0xbc, 0xdd, + 0xcc, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+9078 "選" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x90, 0x3d, 0xab, 0x5c, 0xaa, 0xe0, 0x0, 0x9b, + 0x3d, 0xab, 0x5c, 0xaa, 0xf0, 0x0, 0x4, 0x39, + 0x0, 0x4c, 0x0, 0x23, 0x0, 0x0, 0x1c, 0xbb, + 0x78, 0xba, 0xb3, 0x6, 0x64, 0x0, 0xc, 0x0, + 0xc0, 0x0, 0x7, 0x9a, 0x1b, 0xbf, 0xbb, 0xfb, + 0xa0, 0x0, 0x3a, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0x0, 0x3a, 0x8b, 0xbf, 0xbb, 0xfb, 0xb5, 0x0, + 0x3a, 0x0, 0x3a, 0x2, 0xa2, 0x0, 0x0, 0x4c, + 0x19, 0xb1, 0x0, 0x2b, 0x80, 0x4, 0xd8, 0xc8, + 0x0, 0x0, 0x0, 0x40, 0xd, 0x20, 0x18, 0xdd, + 0xcc, 0xdd, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x11, + 0x0, 0x0, + + /* U+907F "避" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x60, 0x0, 0x1d, + 0x10, 0xcc, 0xcd, 0x0, 0xc0, 0x0, 0x5, 0xb0, + 0xc0, 0xd, 0x8c, 0xcc, 0xc0, 0x0, 0x81, 0xc0, + 0xd, 0x9, 0x7, 0x40, 0x0, 0x0, 0xdc, 0xcd, + 0xb, 0xc, 0x0, 0x1, 0x10, 0xd1, 0x11, 0x7a, + 0x9d, 0x80, 0x6b, 0xf0, 0xd4, 0x44, 0x44, 0xe4, + 0x40, 0x0, 0xd3, 0xea, 0x7d, 0x1, 0xd1, 0x10, + 0x0, 0xd8, 0xa6, 0xb, 0x7b, 0xfb, 0xa0, 0x0, + 0xd9, 0x56, 0xb, 0x0, 0xd0, 0x0, 0x1, 0xe3, + 0x4c, 0xbd, 0x0, 0xd0, 0x0, 0x2d, 0xad, 0x93, + 0x0, 0x0, 0x0, 0x10, 0x85, 0x0, 0x5a, 0xcd, + 0xdd, 0xdd, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9084 "還" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x60, 0xca, 0xcb, 0x9e, 0x9c, 0x50, 0x0, 0xc4, + 0xc2, 0x76, 0x1c, 0x18, 0x50, 0x0, 0x12, 0x68, + 0x88, 0x88, 0x88, 0x30, 0x0, 0x3, 0x99, 0x99, + 0x99, 0x99, 0x91, 0x7c, 0xe3, 0x39, 0x99, 0x99, + 0x99, 0x0, 0x0, 0xb3, 0x48, 0x0, 0x0, 0xe, + 0x0, 0x0, 0xb3, 0x4c, 0x9a, 0xa9, 0x9e, 0x0, + 0x0, 0xb3, 0x2, 0xa8, 0x55, 0x3b, 0x20, 0x0, + 0xb5, 0xb9, 0xe0, 0x7, 0xe3, 0x0, 0x1, 0xd4, + 0x0, 0xe9, 0xb1, 0x2c, 0x50, 0x1d, 0x6c, 0x74, + 0x83, 0x0, 0x0, 0x20, 0x96, 0x0, 0x7d, 0xed, + 0xdd, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+908A "邊" */ + 0x7, 0x10, 0x0, 0x2, 0xa0, 0x0, 0x0, 0x6, + 0xc0, 0xe, 0x88, 0x88, 0x8e, 0x0, 0x0, 0x7a, + 0xe, 0x88, 0x88, 0x8e, 0x0, 0x0, 0x1, 0xe, + 0x77, 0x77, 0x7e, 0x0, 0x11, 0x10, 0xc, 0x78, + 0x87, 0x7c, 0x0, 0x6a, 0xe3, 0x99, 0x9a, 0xf9, + 0x99, 0x90, 0x0, 0xb3, 0xb1, 0x92, 0x16, 0x70, + 0xb0, 0x0, 0xb3, 0x2c, 0x43, 0xd2, 0x78, 0x10, + 0x0, 0xb4, 0x88, 0xbd, 0x88, 0x88, 0x80, 0x0, + 0xb3, 0x0, 0xbb, 0x99, 0xa4, 0x0, 0x1, 0xd5, + 0x3b, 0x80, 0x0, 0x92, 0x0, 0x2d, 0x5c, 0xd4, + 0x0, 0x49, 0x60, 0x11, 0x95, 0x0, 0x6c, 0xed, + 0xde, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+90A3 "那" */ + 0x3d, 0xdf, 0xdd, 0xf0, 0xdd, 0xde, 0xe1, 0x0, + 0xe, 0x0, 0xe0, 0xe0, 0x4, 0xb0, 0x0, 0xe, + 0x0, 0xe0, 0xe0, 0xc, 0x20, 0xd, 0xdf, 0xdd, + 0xf0, 0xe0, 0x5a, 0x0, 0x0, 0x1d, 0x0, 0xe0, + 0xe0, 0xc4, 0x0, 0x0, 0x2b, 0x0, 0xe0, 0xe0, + 0x2c, 0x20, 0x3, 0x6b, 0x33, 0xe0, 0xe0, 0x4, + 0xa0, 0x1a, 0xdc, 0xaa, 0xe0, 0xe0, 0x0, 0xd0, + 0x0, 0xb3, 0x0, 0xe0, 0xe0, 0x0, 0xe0, 0x1, + 0xe0, 0x1, 0xd0, 0xe4, 0xde, 0x70, 0xa, 0x70, + 0x4, 0xc0, 0xe0, 0x0, 0x0, 0x2c, 0x3, 0xff, + 0x50, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x0, + + /* U+90AA "邪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xdd, 0xdf, 0xe8, 0xae, 0xee, 0xf3, 0x0, 0x30, + 0xe, 0x0, 0xa3, 0x2, 0xd0, 0x3, 0xb0, 0xe, + 0x0, 0xa3, 0x9, 0x50, 0x4, 0x80, 0xe, 0x0, + 0xa3, 0x1d, 0x0, 0x7, 0x82, 0x2e, 0x21, 0xa3, + 0x86, 0x0, 0x7, 0xbb, 0xdf, 0xc8, 0xa3, 0x4b, + 0x10, 0x0, 0x1, 0xdf, 0x0, 0xa3, 0x4, 0xb0, + 0x0, 0xc, 0x4e, 0x0, 0xa3, 0x0, 0xc1, 0x0, + 0xa7, 0xe, 0x0, 0xa3, 0x0, 0xc2, 0x1b, 0x70, + 0xe, 0x0, 0xa4, 0xcd, 0xb0, 0x36, 0x0, 0xe, + 0x0, 0xa3, 0x11, 0x0, 0x0, 0xb, 0xeb, 0x0, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+90E8 "部" */ + 0x0, 0x3, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xd0, 0x0, 0x2f, 0xdd, 0xf1, 0xb, 0xdd, + 0xdd, 0xd9, 0x2a, 0x2, 0xc0, 0x0, 0xc1, 0x0, + 0xd0, 0x2a, 0x8, 0x60, 0x0, 0x87, 0x6, 0x90, + 0x2a, 0xd, 0x0, 0x0, 0x38, 0xb, 0x30, 0x3a, + 0x49, 0x0, 0x3c, 0xcc, 0xcc, 0xcc, 0x3a, 0x1c, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x3, 0xb0, + 0x6, 0xed, 0xdd, 0xe5, 0x2a, 0x0, 0xd0, 0x6, + 0x70, 0x0, 0x85, 0x2a, 0x0, 0xe0, 0x6, 0x70, + 0x0, 0x85, 0x2a, 0x9c, 0x70, 0x6, 0xdb, 0xbb, + 0xe5, 0x2a, 0x0, 0x0, 0x6, 0x71, 0x11, 0x95, + 0x2a, 0x0, 0x0, + + /* U+90F5 "郵" */ + 0x0, 0x0, 0x3, 0x64, 0x0, 0x0, 0x0, 0x2b, + 0xcd, 0xea, 0x73, 0x7e, 0xdd, 0xf2, 0x0, 0x2, + 0xa0, 0x0, 0x76, 0x2, 0xd0, 0x2c, 0xcd, 0xfc, + 0xcb, 0x76, 0x8, 0x60, 0x4, 0x82, 0xa0, 0xb0, + 0x76, 0xd, 0x0, 0x4, 0x82, 0xa0, 0xb0, 0x76, + 0x4a, 0x0, 0x7d, 0xed, 0xfc, 0xfc, 0x86, 0xc, + 0x30, 0x4, 0x82, 0xa0, 0xb0, 0x76, 0x3, 0xc0, + 0x19, 0xb8, 0xd6, 0xd6, 0x76, 0x0, 0xd0, 0x14, + 0x46, 0xc4, 0x44, 0x76, 0x0, 0xd1, 0x0, 0x2, + 0xa0, 0x24, 0x76, 0xad, 0xb0, 0x38, 0xac, 0xfd, + 0xb8, 0x76, 0x11, 0x0, 0x35, 0x31, 0x0, 0x0, + 0x76, 0x0, 0x0, + + /* U+90FD "都" */ + 0x0, 0x7, 0x60, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x60, 0x2b, 0x7f, 0xee, 0xf3, 0x9, 0xde, + 0xed, 0xc2, 0x76, 0x2, 0xd0, 0x0, 0x7, 0x66, + 0x70, 0x76, 0x9, 0x50, 0x3a, 0xad, 0xdf, 0xba, + 0x76, 0x1d, 0x0, 0x2, 0x27, 0xe3, 0x22, 0x76, + 0x77, 0x0, 0x0, 0x5f, 0x30, 0x0, 0x76, 0x1c, + 0x30, 0x9, 0xfc, 0xcc, 0xe4, 0x76, 0x2, 0xd0, + 0x48, 0xd0, 0x0, 0xa4, 0x76, 0x0, 0xc1, 0x0, + 0xdc, 0xcc, 0xe4, 0x76, 0x0, 0xc2, 0x0, 0xd0, + 0x0, 0xa4, 0x76, 0x9c, 0xb0, 0x0, 0xdd, 0xcc, + 0xe4, 0x76, 0x10, 0x0, 0x0, 0xd0, 0x0, 0xa4, + 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+914D "配" */ + 0x1, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1c, + 0xce, 0xec, 0xc3, 0xee, 0xee, 0xf0, 0x0, 0x18, + 0x82, 0x0, 0x0, 0x0, 0xe0, 0xa, 0xde, 0xed, + 0x90, 0x0, 0x0, 0xe0, 0xc, 0x8, 0x90, 0xb0, + 0x0, 0x0, 0xe0, 0xc, 0x8, 0x90, 0xb1, 0xcc, + 0xcc, 0xf0, 0xc, 0x45, 0x90, 0xb2, 0xc2, 0x22, + 0xe0, 0xc, 0x90, 0x49, 0xb2, 0xc0, 0x0, 0x40, + 0xc, 0x0, 0x0, 0xb2, 0xc0, 0x0, 0x0, 0xc, + 0xbb, 0xbb, 0xb2, 0xc0, 0x0, 0x10, 0xc, 0x0, + 0x0, 0xb2, 0xc0, 0x0, 0x67, 0xc, 0xcc, 0xcc, + 0xb2, 0xc0, 0x0, 0x85, 0xc, 0x0, 0x0, 0xa0, + 0xce, 0xee, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9152 "酒" */ + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xe5, 0xdd, 0xdf, 0xdf, 0xed, 0xd5, 0x0, 0x25, + 0x0, 0xd, 0xb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xb, 0x20, 0x0, 0x26, 0x0, 0x6e, 0xdf, + 0xdf, 0xdd, 0xd0, 0x1a, 0xd2, 0x67, 0xb, 0xb, + 0x1, 0xd0, 0x0, 0x40, 0x67, 0x39, 0xb, 0x1, + 0xd0, 0x0, 0x0, 0x6a, 0xc1, 0x6, 0xcc, 0xd0, + 0x0, 0x2a, 0x69, 0x10, 0x0, 0x1, 0xd0, 0x0, + 0xa4, 0x6e, 0xdd, 0xdd, 0xdd, 0xd0, 0x3, 0xc0, + 0x67, 0x0, 0x0, 0x1, 0xd0, 0xc, 0x40, 0x6d, + 0xaa, 0xaa, 0xaa, 0xd0, 0x7, 0x0, 0x69, 0x22, + 0x22, 0x23, 0xc0, + + /* U+9154 "酔" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0x1c, + 0xde, 0xfc, 0xa0, 0x1d, 0x0, 0x0, 0x0, 0x46, + 0xa0, 0xa, 0xbe, 0xaf, 0x0, 0x8, 0xbc, 0xe9, + 0x60, 0x68, 0xd, 0x2, 0xc, 0x48, 0xa4, 0xa0, + 0xb3, 0xd, 0xa, 0xb, 0x26, 0x82, 0xa7, 0xd0, + 0xc, 0xa8, 0xb, 0x54, 0x92, 0xbc, 0x22, 0x90, + 0x20, 0xc, 0x90, 0x5a, 0xa0, 0x3, 0xa0, 0x0, + 0xc, 0x10, 0x2, 0xa9, 0x9a, 0xd9, 0x96, 0xd, + 0xcc, 0xcc, 0xa3, 0x36, 0xb3, 0x32, 0xb, 0x0, + 0x2, 0xa0, 0x3, 0xa0, 0x0, 0xd, 0xcc, 0xcc, + 0xa0, 0x3, 0xa0, 0x0, 0xb, 0x0, 0x2, 0xa0, + 0x3, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9178 "酸" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x1c, + 0xed, 0xfc, 0x70, 0x4c, 0x19, 0x0, 0x0, 0x64, + 0xa0, 0x3, 0xd2, 0x1a, 0x80, 0xb, 0xed, 0xfc, + 0x4a, 0xb9, 0x87, 0xc2, 0xb, 0x34, 0x85, 0x50, + 0x67, 0xc, 0x10, 0xb, 0x43, 0x85, 0x54, 0xd0, + 0x4, 0xc0, 0xb, 0x71, 0x95, 0x7e, 0x3b, 0x0, + 0x76, 0xc, 0x80, 0x7b, 0x61, 0x8d, 0x88, 0x70, + 0xb, 0x0, 0x5, 0x55, 0xf5, 0x39, 0x80, 0xd, + 0xbb, 0xbd, 0x7c, 0x5c, 0x2e, 0x10, 0xb, 0x0, + 0x5, 0x50, 0x9, 0xf3, 0x0, 0xd, 0xcc, 0xcd, + 0x50, 0x7c, 0x9c, 0x30, 0xb, 0x0, 0x5, 0x9d, + 0x70, 0x3, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+91AB "醫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xad, 0xaa, 0xa1, 0xca, 0xb9, 0x0, 0xb, 0x6b, + 0xa7, 0x56, 0xa0, 0x2c, 0x80, 0xb, 0x99, 0xd9, + 0x96, 0xaa, 0xab, 0x20, 0xb, 0x13, 0xc9, 0x1, + 0xa4, 0x67, 0x0, 0xb, 0x7a, 0x35, 0x80, 0x4e, + 0xe5, 0x0, 0x5, 0x77, 0x77, 0x78, 0x81, 0x7, + 0x50, 0x6a, 0xaa, 0xad, 0xcb, 0xea, 0xaa, 0xa1, + 0x0, 0x88, 0x8c, 0xb9, 0xd8, 0x88, 0x0, 0x1, + 0xc1, 0x4c, 0x22, 0xb2, 0x2d, 0x0, 0x1, 0xc9, + 0x82, 0x0, 0x68, 0x8e, 0x0, 0x1, 0xe7, 0x77, + 0x77, 0x77, 0x7e, 0x0, 0x1, 0xe9, 0x99, 0x99, + 0x99, 0x9e, 0x0, + + /* U+91CD "重" */ + 0x0, 0x0, 0x0, 0x1, 0x34, 0x66, 0x0, 0x0, + 0xac, 0xcc, 0xdd, 0x97, 0x53, 0x0, 0x4, 0x44, + 0x44, 0x8b, 0x44, 0x44, 0x41, 0x7, 0x77, 0x77, + 0xac, 0x77, 0x77, 0x72, 0x0, 0x6a, 0xaa, 0xcd, + 0xaa, 0xaa, 0x0, 0x0, 0x94, 0x0, 0x59, 0x0, + 0xe, 0x0, 0x0, 0x9c, 0xaa, 0xcd, 0xaa, 0xaf, + 0x0, 0x0, 0x94, 0x0, 0x59, 0x0, 0xe, 0x0, + 0x0, 0x7b, 0xbb, 0xcd, 0xbb, 0xbc, 0x0, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0xcc, + 0xcc, 0xde, 0xcc, 0xcc, 0x70, 0x0, 0x0, 0x0, + 0x59, 0x0, 0x0, 0x0, 0xc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc5, + + /* U+91CE "野" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xcd, 0xec, 0xf7, 0xdd, 0xdd, 0xf4, 0xc, 0x5, + 0x70, 0xc0, 0x10, 0x9, 0x90, 0xe, 0xbd, 0xdb, + 0xf0, 0x5e, 0xb9, 0x0, 0xc, 0x5, 0x70, 0xc0, + 0x2, 0xd8, 0x0, 0xc, 0x5, 0x70, 0xc4, 0x55, + 0x6f, 0x73, 0xb, 0xcd, 0xec, 0xc6, 0x9a, 0xe9, + 0xc8, 0x0, 0x6, 0x70, 0x0, 0x1, 0xd0, 0xc2, + 0xd, 0xde, 0xed, 0xd0, 0x1, 0xd1, 0x90, 0x0, + 0x6, 0x70, 0x0, 0x1, 0xd0, 0x0, 0x0, 0x6, + 0x81, 0x42, 0x1, 0xd0, 0x0, 0x39, 0xbe, 0xeb, + 0x93, 0x1, 0xd0, 0x0, 0x25, 0x20, 0x0, 0x3, + 0xee, 0x80, 0x0, + + /* U+91CF "量" */ + 0x0, 0x5d, 0x99, 0x99, 0x99, 0xba, 0x0, 0x0, + 0x5d, 0x99, 0x99, 0x99, 0xba, 0x0, 0x0, 0x5b, + 0x66, 0x66, 0x66, 0x8a, 0x0, 0x0, 0x24, 0x44, + 0x44, 0x44, 0x43, 0x0, 0xa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa4, 0x0, 0x79, 0x77, 0x9a, 0x77, + 0x7b, 0x10, 0x0, 0x9b, 0x99, 0xbd, 0x99, 0x9e, + 0x10, 0x0, 0x95, 0x11, 0x6a, 0x11, 0x1d, 0x10, + 0x0, 0x47, 0x77, 0xac, 0x77, 0x77, 0x0, 0x0, + 0xaa, 0xaa, 0xcd, 0xaa, 0xaa, 0x40, 0x0, 0x0, + 0x0, 0x49, 0x0, 0x0, 0x0, 0x2b, 0xbb, 0xbb, + 0xde, 0xbb, 0xbb, 0xb6, + + /* U+91D1 "金" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xdc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x10, 0xa8, 0x0, 0x0, 0x0, 0x4d, 0x90, 0x0, + 0x8, 0xd5, 0x0, 0x3d, 0xcb, 0xbb, 0xbb, 0xbb, + 0x9a, 0xd3, 0x3, 0x1, 0x22, 0x98, 0x22, 0x10, + 0x20, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, + 0x5, 0xdd, 0xdd, 0xee, 0xdd, 0xdd, 0x60, 0x0, + 0x5, 0x0, 0x87, 0x0, 0x50, 0x0, 0x0, 0xc, + 0x20, 0x87, 0x2, 0xd0, 0x0, 0x0, 0x5, 0x90, + 0x87, 0xa, 0x40, 0x0, 0x0, 0x0, 0x80, 0x87, + 0x8, 0x0, 0x0, 0xd, 0xdd, 0xdd, 0xfe, 0xdd, + 0xdd, 0xd0, + + /* U+91DD "針" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x90, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x2e, + 0xd5, 0x0, 0x3, 0xb0, 0x0, 0x1, 0xc5, 0x2d, + 0x60, 0x3, 0xb0, 0x0, 0xc, 0x90, 0x1, 0x90, + 0x3, 0xb0, 0x0, 0x8, 0xce, 0xec, 0x10, 0x3, + 0xb0, 0x0, 0x0, 0x6, 0x60, 0x4c, 0xcd, 0xec, + 0xc8, 0xb, 0xce, 0xec, 0x70, 0x3, 0xb0, 0x0, + 0x0, 0x6, 0x62, 0x10, 0x3, 0xb0, 0x0, 0x5, + 0x56, 0x6a, 0x20, 0x3, 0xb0, 0x0, 0x1, 0x96, + 0x6b, 0x0, 0x3, 0xb0, 0x0, 0x0, 0x66, 0x76, + 0x30, 0x3, 0xb0, 0x0, 0x6, 0x9d, 0xc9, 0x40, + 0x3, 0xb0, 0x0, 0x6, 0x30, 0x0, 0x0, 0x3, + 0xb0, 0x0, + + /* U+9244 "鉄" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x40, 0x3, 0x1e, 0x0, 0x0, 0x0, 0x4e, + 0xc1, 0xb, 0x2e, 0x0, 0x0, 0x2, 0xd2, 0x5d, + 0x1e, 0x2e, 0x32, 0x10, 0x2e, 0x50, 0x5, 0x5f, + 0xdf, 0xdd, 0x90, 0x17, 0xde, 0xd8, 0x77, 0xe, + 0x0, 0x0, 0x0, 0x9, 0x20, 0x51, 0xe, 0x0, + 0x0, 0xb, 0xce, 0xdc, 0x7a, 0xaf, 0xaa, 0xa0, + 0x1, 0x9, 0x24, 0x13, 0x4f, 0x63, 0x30, 0x5, + 0x59, 0x2b, 0x0, 0x5f, 0x80, 0x0, 0x2, 0x89, + 0x66, 0x0, 0xb3, 0xd0, 0x0, 0x0, 0x49, 0x78, + 0x27, 0xa0, 0x97, 0x0, 0x9, 0xcc, 0x95, 0x8c, + 0x10, 0x1c, 0x70, 0x4, 0x0, 0x2, 0x90, 0x0, + 0x0, 0x91, + + /* U+925B "鉛" */ + 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x90, 0x1, 0xfd, 0xde, 0x0, 0x2, 0xd2, + 0x8c, 0x11, 0xb0, 0xd, 0x0, 0x3e, 0x40, 0x5, + 0x64, 0xa0, 0xd, 0x0, 0x38, 0xcf, 0xd8, 0x7, + 0x60, 0xd, 0x0, 0x0, 0xc, 0x10, 0x2d, 0x0, + 0xc, 0x73, 0xa, 0xae, 0xba, 0xa3, 0x0, 0x1, + 0x41, 0x2, 0x1c, 0x23, 0xb, 0xdd, 0xdd, 0x80, + 0xa, 0xc, 0x1c, 0xc, 0x10, 0x4, 0x80, 0x7, + 0x4c, 0x57, 0xc, 0x10, 0x4, 0x80, 0x2, 0x2c, + 0x57, 0x2c, 0x10, 0x4, 0x80, 0x29, 0xcd, 0xa6, + 0x1c, 0xdc, 0xcd, 0x80, 0x14, 0x10, 0x0, 0xc, + 0x20, 0x5, 0x80, + + /* U+9280 "銀" */ + 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0x70, 0x2f, 0xdd, 0xdd, 0xe0, 0x2, 0xc2, + 0xa9, 0x2b, 0x0, 0x0, 0xe0, 0x2e, 0x40, 0x9, + 0x4d, 0x44, 0x44, 0xe0, 0x18, 0xcf, 0xc5, 0x2d, + 0x77, 0x77, 0xe0, 0x0, 0xd, 0x0, 0x2b, 0x0, + 0x0, 0xe0, 0x1b, 0xbf, 0xba, 0x2f, 0xdd, 0xdd, + 0xe0, 0x2, 0x1d, 0x14, 0x2b, 0xb, 0x0, 0x31, + 0x9, 0x2d, 0x2a, 0x2b, 0x5, 0x67, 0xc2, 0x5, + 0x5d, 0x64, 0x2b, 0x0, 0xe9, 0x0, 0x1, 0x5d, + 0x44, 0x2b, 0x0, 0x7b, 0x0, 0x6, 0xaf, 0xc9, + 0x3d, 0x8c, 0x2a, 0xb1, 0x7, 0x40, 0x0, 0x8b, + 0x61, 0x0, 0x86, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9322 "錢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x0, 0x0, 0xb2, 0x97, 0x0, 0x0, 0x8e, + 0x80, 0x0, 0x94, 0x7, 0x30, 0x4, 0xd1, 0xa9, + 0x4a, 0xde, 0xee, 0xc4, 0x2e, 0x30, 0x8, 0x24, + 0x3c, 0x9, 0x20, 0x29, 0xcf, 0xc4, 0x0, 0xa, + 0xc4, 0x11, 0x0, 0xb, 0x0, 0x39, 0xb7, 0xa8, + 0x85, 0x1c, 0xcf, 0xca, 0x22, 0x90, 0x77, 0x40, + 0x1, 0xb, 0x2, 0x0, 0xd0, 0x29, 0x30, 0xa, + 0xb, 0x46, 0x48, 0xec, 0xcc, 0xc5, 0x7, 0x3b, + 0x82, 0x23, 0x69, 0xa, 0x20, 0x2, 0x2c, 0x54, + 0x0, 0xc, 0xc4, 0x1, 0x17, 0xbe, 0xa5, 0x4, + 0xab, 0xd2, 0x29, 0x6, 0x20, 0x0, 0x99, 0x30, + 0x3c, 0xd3, + + /* U+932F "錯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x0, 0x2, 0xa0, 0xd, 0x0, 0x0, 0x7e, + 0x80, 0x2, 0xa0, 0xd, 0x0, 0x4, 0xd1, 0x9a, + 0x7d, 0xfd, 0xdf, 0xd1, 0x3f, 0x41, 0x27, 0x2, + 0xa0, 0xd, 0x0, 0x17, 0xbe, 0xb4, 0x2, 0xa0, + 0xd, 0x0, 0x0, 0xc, 0x0, 0xad, 0xdd, 0xdd, + 0xd6, 0xa, 0xae, 0xa8, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x2c, 0x23, 0xe, 0xcc, 0xcd, 0xa0, 0xa, + 0xc, 0x37, 0xd, 0x0, 0x3, 0xa0, 0x7, 0x2c, + 0x73, 0xe, 0xcc, 0xcd, 0xa0, 0x3, 0x3c, 0x42, + 0xd, 0x0, 0x3, 0xa0, 0x3, 0x7e, 0xd9, 0xd, + 0x22, 0x25, 0xa0, 0x19, 0x62, 0x0, 0xe, 0xaa, + 0xab, 0x90, + + /* U+9332 "録" */ + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0x40, 0x3c, 0xcc, 0xcd, 0xa0, 0x2, 0xd3, + 0xc8, 0x0, 0x0, 0x2, 0xa0, 0x2e, 0x40, 0xa, + 0x1c, 0xcc, 0xcc, 0xa0, 0x29, 0xcf, 0xc4, 0x0, + 0x0, 0x2, 0xa0, 0x0, 0xb, 0x0, 0xab, 0xbc, + 0xbb, 0xd7, 0x1c, 0xcf, 0xca, 0x21, 0xd, 0x0, + 0x22, 0x1, 0xb, 0x2, 0x2c, 0xd, 0x3, 0xc2, + 0xa, 0xb, 0x46, 0x4, 0x5e, 0xca, 0x0, 0x7, + 0x2b, 0x82, 0x2, 0xcf, 0x98, 0x0, 0x3, 0x2c, + 0x54, 0x7d, 0x2d, 0xa, 0xa1, 0x17, 0xae, 0xb7, + 0x91, 0xd, 0x0, 0x59, 0x6, 0x20, 0x0, 0x1, + 0xcc, 0x0, 0x0, + + /* U+9577 "長" */ + 0x0, 0xa, 0xdc, 0xcc, 0xcc, 0xcb, 0x0, 0x0, + 0xa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xdc, 0xcc, 0xcc, 0xc5, 0x0, 0x0, 0xa, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xdc, 0xcc, + 0xcc, 0xc5, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xdf, 0xdd, 0xee, 0xdd, 0xdd, + 0xd5, 0x0, 0xc, 0x10, 0x4b, 0x0, 0x1b, 0x40, + 0x0, 0xc, 0x10, 0xa, 0x87, 0xc4, 0x0, 0x0, + 0xc, 0x10, 0x1, 0xbd, 0x10, 0x0, 0x0, 0xe, + 0x68, 0xcb, 0x7, 0xe8, 0x30, 0x0, 0x4d, 0x94, + 0x0, 0x0, 0x17, 0xc7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9589 "閉" */ + 0xdc, 0xbb, 0xe0, 0xbc, 0xbb, 0xcd, 0xd1, 0x0, + 0xe0, 0xb2, 0x0, 0x1d, 0xdb, 0xbb, 0xe0, 0xbc, + 0xbb, 0xbd, 0xd1, 0x0, 0xe0, 0xb2, 0x0, 0x1d, + 0xdb, 0xbb, 0xa0, 0x8b, 0xbb, 0xbd, 0xd1, 0x0, + 0x0, 0x90, 0x0, 0x1d, 0xd1, 0xbc, 0xcc, 0xfc, + 0xc2, 0x1d, 0xd1, 0x0, 0xa, 0xf0, 0x0, 0x1d, + 0xd1, 0x0, 0x97, 0xd0, 0x0, 0x1d, 0xd1, 0x1b, + 0x80, 0xd0, 0x0, 0x1d, 0xd1, 0xd5, 0x0, 0xd0, + 0x0, 0x2d, 0xd1, 0x0, 0x3c, 0xb0, 0xce, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+958B "開" */ + 0xeb, 0xbb, 0xe1, 0x9d, 0xbb, 0xcc, 0xe0, 0x0, + 0xb1, 0x95, 0x0, 0x1c, 0xea, 0xaa, 0xe1, 0x9c, + 0xaa, 0xbc, 0xe3, 0x33, 0xc1, 0x97, 0x22, 0x4c, + 0xe6, 0x66, 0x60, 0x47, 0x77, 0x8c, 0xe0, 0x8c, + 0xcc, 0xcc, 0xc3, 0x1c, 0xe0, 0x2, 0xb0, 0x3a, + 0x0, 0x1c, 0xe0, 0x2, 0xb0, 0x3a, 0x0, 0x1c, + 0xe0, 0xcd, 0xec, 0xde, 0xc7, 0x1c, 0xe0, 0x6, + 0x70, 0x3a, 0x0, 0x1c, 0xe0, 0xc, 0x20, 0x3a, + 0x0, 0x2c, 0xe0, 0x85, 0x0, 0x3a, 0x3e, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9593 "間" */ + 0xdc, 0xbb, 0xf0, 0xbc, 0xbb, 0xcd, 0xd1, 0x0, + 0xc0, 0xb2, 0x0, 0x1d, 0xdb, 0xbb, 0xf0, 0xbc, + 0xbb, 0xbd, 0xd1, 0x0, 0xc0, 0xb2, 0x0, 0x1d, + 0xdb, 0xbb, 0xb0, 0x8b, 0xbb, 0xbd, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0xd, 0xbb, 0xbe, + 0x50, 0x1d, 0xd1, 0xd, 0x0, 0xa, 0x50, 0x1d, + 0xd1, 0xd, 0xbb, 0xbe, 0x50, 0x1d, 0xd1, 0xd, + 0x0, 0xa, 0x50, 0x1d, 0xd1, 0xd, 0xbb, 0xbc, + 0x40, 0x1d, 0xd1, 0x9, 0x0, 0x0, 0x7e, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+95A2 "関" */ + 0xeb, 0xbb, 0xf1, 0x9c, 0xbb, 0xbc, 0xe0, 0x0, + 0xc1, 0x94, 0x0, 0x1c, 0xea, 0xaa, 0xe1, 0x9c, + 0xaa, 0xbc, 0xe1, 0x11, 0xd1, 0x95, 0x11, 0x3c, + 0xe9, 0x9a, 0x90, 0x5b, 0x99, 0xac, 0xe0, 0x7, + 0x60, 0x1c, 0x0, 0x1c, 0xe0, 0x8b, 0xbe, 0xbb, + 0xb2, 0x1c, 0xe0, 0x0, 0xc, 0x10, 0x0, 0x1c, + 0xe0, 0xab, 0xcf, 0xdb, 0xb5, 0x1c, 0xe0, 0x0, + 0x99, 0xc5, 0x0, 0x1c, 0xe0, 0x6c, 0x70, 0xa, + 0x80, 0x1c, 0xe0, 0x30, 0x0, 0x0, 0x2c, 0xd8, + + /* U+95DC "關" */ + 0xeb, 0xbb, 0xf0, 0x8c, 0xbb, 0xbe, 0xe4, 0x44, + 0xe0, 0x88, 0x44, 0x4e, 0xe4, 0x44, 0xe0, 0x88, + 0x44, 0x4e, 0xeb, 0xbb, 0xf0, 0x8c, 0xbb, 0xbe, + 0xe0, 0x19, 0x10, 0x29, 0x10, 0xe, 0xe0, 0xd9, + 0xa1, 0xd9, 0xa0, 0xe, 0xe0, 0x4a, 0x70, 0x4a, + 0x70, 0xe, 0xe1, 0xfb, 0xb7, 0xfb, 0xc4, 0xe, + 0xe0, 0x60, 0x63, 0x80, 0x61, 0xe, 0xe0, 0xa4, + 0xb2, 0xb4, 0xc0, 0xe, 0xe0, 0x25, 0xe0, 0xb3, + 0x80, 0xe, 0xe0, 0x1b, 0x30, 0xb0, 0xc, 0xe9, + + /* U+95F0 "闰" */ + 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x60, + 0xdd, 0xdd, 0xdd, 0xde, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0xe, 0x90, 0x10, 0x0, 0x0, 0x0, 0xe, + 0xe0, 0x7c, 0xce, 0xec, 0xc6, 0xe, 0xe0, 0x0, + 0x5, 0x80, 0x0, 0xe, 0xe0, 0x0, 0x5, 0x80, + 0x0, 0xe, 0xe0, 0x1c, 0xcd, 0xec, 0xc0, 0xe, + 0xe0, 0x0, 0x5, 0x80, 0x0, 0xe, 0xe0, 0x0, + 0x5, 0x80, 0x0, 0xe, 0xe0, 0xbc, 0xcd, 0xec, + 0xc7, 0xe, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xe0, 0x0, 0x0, 0x0, 0x8e, 0xe9, + + /* U+9633 "阳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdd, 0xdf, + 0x2d, 0xed, 0xdd, 0xeb, 0xd0, 0x3a, 0xd, 0x0, + 0x0, 0x2b, 0xd0, 0xb2, 0xd, 0x0, 0x0, 0x2b, + 0xd3, 0xa0, 0xd, 0x0, 0x0, 0x2b, 0xd1, 0xc3, + 0xd, 0x0, 0x0, 0x2b, 0xd0, 0x1d, 0xd, 0xee, + 0xee, 0xeb, 0xd0, 0xb, 0x2d, 0x0, 0x0, 0x2b, + 0xd0, 0xe, 0x2d, 0x0, 0x0, 0x2b, 0xd8, 0xd8, + 0xd, 0x0, 0x0, 0x2b, 0xd0, 0x0, 0xd, 0x0, + 0x0, 0x2b, 0xd0, 0x0, 0xd, 0xee, 0xee, 0xeb, + 0xd0, 0x0, 0xd, 0x0, 0x0, 0x2a, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+9644 "附" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0xe, 0x0, 0xdd, 0xdb, 0x6, + 0x80, 0x0, 0xe0, 0xd, 0x6, 0x70, 0xc2, 0x0, + 0xe, 0x0, 0xd0, 0xb1, 0x4f, 0x4b, 0xbb, 0xfb, + 0x3d, 0x1b, 0xe, 0xe1, 0x22, 0x2e, 0x20, 0xd0, + 0xc7, 0x8d, 0x1, 0x0, 0xe0, 0xd, 0x5, 0x80, + 0xd0, 0xc1, 0xe, 0x0, 0xd0, 0x2b, 0xd, 0x5, + 0x80, 0xe0, 0xd, 0x2, 0xb0, 0xd0, 0xd, 0xe, + 0x0, 0xd5, 0xd5, 0xd, 0x0, 0x20, 0xe0, 0xd, + 0x0, 0x0, 0xd0, 0x0, 0xe, 0x0, 0xd0, 0x0, + 0xd, 0x0, 0x0, 0xe0, 0xd, 0x0, 0x0, 0xc0, + 0x9, 0xeb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+964D "降" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0xd, 0xdd, + 0xe0, 0xb, 0xeb, 0xbb, 0x10, 0xd0, 0x58, 0x1b, + 0xd2, 0x7, 0xd0, 0xd, 0xc, 0x19, 0x53, 0xd7, + 0xd2, 0x0, 0xd3, 0xb0, 0x0, 0x2c, 0xf8, 0x0, + 0xd, 0xb, 0x36, 0xbc, 0x41, 0x8d, 0xa2, 0xd0, + 0x2b, 0x62, 0x0, 0xe0, 0x4, 0xd, 0x0, 0xd3, + 0xdd, 0xdf, 0xdd, 0x90, 0xd1, 0x2d, 0x6, 0x0, + 0xe0, 0x0, 0xd, 0x5b, 0x43, 0xa0, 0xe, 0x0, + 0x0, 0xd0, 0x0, 0x7d, 0xdd, 0xfd, 0xdd, 0x2d, + 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x0, + + /* U+9650 "限" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xdd, + 0xf1, 0xed, 0xdd, 0xdf, 0x0, 0xd0, 0x1c, 0xe, + 0x0, 0x0, 0xe0, 0xd, 0x8, 0x50, 0xfa, 0xaa, + 0xaf, 0x0, 0xd0, 0xd0, 0xe, 0x11, 0x11, 0xe0, + 0xd, 0x7, 0x60, 0xe0, 0x0, 0xe, 0x0, 0xd0, + 0xd, 0xf, 0xdd, 0xdd, 0xf0, 0xd, 0x0, 0xc1, + 0xe0, 0x76, 0x0, 0x30, 0xd0, 0xd, 0x1e, 0x2, + 0xc2, 0xc6, 0xd, 0x2d, 0x70, 0xe0, 0xa, 0xc3, + 0x0, 0xd0, 0x0, 0xe, 0x0, 0x2d, 0x10, 0xd, + 0x0, 0x0, 0xf6, 0xa6, 0x5d, 0x40, 0xd0, 0x0, + 0x4d, 0x83, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9662 "院" */ + 0x0, 0x0, 0x0, 0x6, 0x20, 0x0, 0xd, 0xdd, + 0xe0, 0x0, 0x5a, 0x0, 0x0, 0xd0, 0x49, 0xad, + 0xdd, 0xdd, 0xdf, 0x3d, 0xb, 0x2a, 0x30, 0x0, + 0x0, 0xa3, 0xd1, 0xc0, 0x47, 0xbb, 0xbb, 0xb5, + 0x1d, 0xa, 0x40, 0x11, 0x11, 0x11, 0x0, 0xd0, + 0x2b, 0x0, 0x0, 0x0, 0x0, 0xd, 0x0, 0xd7, + 0xde, 0xed, 0xfd, 0xd4, 0xd0, 0x1d, 0x0, 0xb3, + 0x1c, 0x0, 0xd, 0x4c, 0x50, 0xe, 0x1, 0xc0, + 0x0, 0xd0, 0x0, 0x5, 0xb0, 0x1c, 0x3, 0x2d, + 0x0, 0x4, 0xe2, 0x1, 0xc0, 0x66, 0xd0, 0x7, + 0xc3, 0x0, 0xd, 0xde, 0x22, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9664 "除" */ + 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0xd, 0xde, + 0xd0, 0x0, 0x9e, 0x30, 0x0, 0xd0, 0x67, 0x0, + 0x9a, 0x2d, 0x40, 0xd, 0xc, 0x3, 0xd8, 0x0, + 0x1c, 0x91, 0xd3, 0xa0, 0xa8, 0xaa, 0xaa, 0xa7, + 0x3d, 0xb, 0x30, 0x12, 0x4d, 0x22, 0x0, 0xd0, + 0x3a, 0x0, 0x1, 0xd0, 0x0, 0xd, 0x0, 0xdb, + 0xdd, 0xdf, 0xdd, 0xd4, 0xd0, 0x2c, 0x11, 0x12, + 0xd1, 0x21, 0xd, 0x7c, 0x40, 0x94, 0x1d, 0x1c, + 0x10, 0xd0, 0x0, 0x4c, 0x1, 0xd0, 0x4b, 0xd, + 0x0, 0x1d, 0x10, 0x1d, 0x0, 0x94, 0xd0, 0x0, + 0x0, 0xcd, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9678 "陸" */ + 0x0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, 0xdd, + 0xe0, 0x11, 0xb4, 0x11, 0x0, 0xd0, 0x49, 0x5b, + 0xbe, 0xcb, 0xb4, 0xd, 0xa, 0x30, 0x0, 0xb3, + 0x0, 0x0, 0xd1, 0xc0, 0xdd, 0xdf, 0xed, 0xdd, + 0xd, 0xb, 0x30, 0x6, 0x2, 0x70, 0x0, 0xd0, + 0x3a, 0xa, 0x70, 0x8, 0xb0, 0xd, 0x0, 0xda, + 0x60, 0x61, 0x5, 0x80, 0xd0, 0x1d, 0x10, 0xb, + 0x30, 0x0, 0xd, 0x4c, 0x57, 0xdd, 0xfd, 0xdd, + 0x50, 0xd0, 0x0, 0x0, 0xb, 0x30, 0x0, 0xd, + 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, 0xd0, 0xb, + 0xdd, 0xdf, 0xed, 0xdd, 0x20, + + /* U+967D "陽" */ + 0xdd, 0xdd, 0xd, 0xbb, 0xbb, 0xf0, 0xd, 0x4, + 0x90, 0xd0, 0x0, 0xd, 0x0, 0xd0, 0x93, 0xd, + 0xaa, 0xaa, 0xf0, 0xd, 0xc, 0x0, 0xd4, 0x44, + 0x4e, 0x0, 0xd0, 0xc1, 0x5, 0x66, 0x66, 0x60, + 0xd, 0x4, 0xac, 0xcc, 0xcc, 0xcc, 0xc2, 0xd0, + 0xd, 0x8, 0x60, 0x0, 0x0, 0xd, 0x1, 0xe2, + 0xed, 0xed, 0xed, 0xa0, 0xd4, 0xc9, 0xc2, 0x94, + 0x57, 0x49, 0xd, 0x0, 0x22, 0x4a, 0xc, 0x15, + 0x80, 0xd0, 0x0, 0x5b, 0x9, 0x60, 0x85, 0xd, + 0x0, 0x7, 0x3, 0x80, 0xcd, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+968E "階" */ + 0x0, 0x0, 0x58, 0x0, 0xd0, 0x0, 0xd, 0xdd, + 0xd5, 0x80, 0xd, 0x0, 0x51, 0xc0, 0x48, 0x5e, + 0xdd, 0xd7, 0xb8, 0x1c, 0x9, 0x25, 0x80, 0xd, + 0x60, 0x0, 0xc0, 0xb0, 0x68, 0x2, 0xd1, 0x2, + 0x8c, 0x9, 0x2b, 0xec, 0x9b, 0xa9, 0xb6, 0xc0, + 0x2a, 0x31, 0xb, 0x22, 0x21, 0xc, 0x0, 0xc2, + 0xcc, 0xfc, 0xcc, 0x90, 0xc1, 0x5c, 0x2b, 0x0, + 0x0, 0x3b, 0xc, 0x18, 0x22, 0xea, 0xaa, 0xab, + 0xb0, 0xc0, 0x0, 0x2b, 0x11, 0x11, 0x4b, 0xc, + 0x0, 0x2, 0xb0, 0x0, 0x3, 0xb0, 0xc0, 0x0, + 0x2e, 0xcc, 0xcc, 0xcb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+969B "際" */ + 0x0, 0x0, 0x4, 0x20, 0x20, 0x0, 0xd, 0xde, + 0xc0, 0xdb, 0xac, 0x88, 0x92, 0xd0, 0x57, 0x68, + 0xb, 0x77, 0x2d, 0x2d, 0xb, 0x5c, 0x3b, 0x82, + 0xb6, 0x90, 0xd1, 0xb1, 0x66, 0xb1, 0xa, 0xc0, + 0xd, 0xc, 0x10, 0xb6, 0x0, 0x1c, 0x10, 0xd0, + 0x49, 0xa9, 0xcc, 0xcc, 0x9c, 0x2d, 0x0, 0xc3, + 0x0, 0x0, 0x0, 0x21, 0xd0, 0x2c, 0x5c, 0xcd, + 0xdc, 0xca, 0xd, 0x5c, 0x40, 0x20, 0x49, 0x2, + 0x0, 0xd0, 0x0, 0x3b, 0x4, 0x90, 0xa5, 0xd, + 0x0, 0xd, 0x20, 0x49, 0x0, 0xd1, 0xd0, 0x0, + 0x20, 0x9d, 0x60, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+969C "障" */ + 0x0, 0x0, 0x0, 0x3, 0x40, 0x0, 0xf, 0xdd, + 0xe5, 0xcc, 0xde, 0xcc, 0x60, 0xd0, 0x48, 0x0, + 0xc0, 0x8, 0x0, 0xd, 0x9, 0x38, 0x8d, 0x98, + 0xd8, 0x80, 0xd0, 0xb0, 0x55, 0x55, 0x55, 0x55, + 0xd, 0xa, 0x30, 0xca, 0xaa, 0xac, 0x0, 0xd0, + 0x2a, 0xe, 0x33, 0x33, 0xe0, 0xd, 0x0, 0xd0, + 0xe6, 0x66, 0x6f, 0x0, 0xd1, 0x4d, 0xf, 0xaa, + 0xaa, 0xf0, 0xd, 0x2a, 0x40, 0x0, 0x1d, 0x0, + 0x0, 0xd0, 0x1, 0xcc, 0xcd, 0xfc, 0xcc, 0x2d, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0xd0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, + + /* U+96A3 "隣" */ + 0x0, 0x0, 0x4, 0x2, 0xb0, 0x20, 0xd, 0xde, + 0xa0, 0xb5, 0x2b, 0xc, 0x10, 0xd0, 0x86, 0x3, + 0x92, 0xc5, 0x40, 0xd, 0xd, 0xa, 0xbc, 0xff, + 0xdb, 0xb0, 0xd4, 0x90, 0x1, 0xa9, 0xca, 0x50, + 0xd, 0x2c, 0x8, 0xb3, 0x2b, 0x7, 0xc1, 0xd0, + 0x76, 0x9, 0x40, 0x20, 0xb0, 0xd, 0x3, 0xa1, + 0xfc, 0xb7, 0xbf, 0xb2, 0xd0, 0x5a, 0xa4, 0xc, + 0x32, 0xd0, 0xd, 0x7a, 0x68, 0x97, 0x87, 0x2d, + 0x0, 0xd0, 0x0, 0x3, 0xe0, 0x9c, 0xfc, 0x4d, + 0x0, 0x1, 0xc3, 0x0, 0xd, 0x0, 0xd0, 0x0, + 0xc3, 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+96A8 "隨" */ + 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, 0xd, 0xde, + 0xb7, 0x5, 0x9a, 0x55, 0x51, 0xc0, 0x76, 0xa3, + 0x4e, 0x54, 0x44, 0x1c, 0xc, 0x2, 0x45, 0xaa, + 0xeb, 0x80, 0xc2, 0xa0, 0x2, 0xc6, 0x6d, 0x76, + 0x2c, 0xc, 0x6d, 0x71, 0x33, 0x33, 0x31, 0xc0, + 0x67, 0x48, 0x1d, 0xaa, 0xb9, 0xc, 0x2, 0xa4, + 0x81, 0xd6, 0x68, 0xa0, 0xc0, 0x3a, 0x48, 0x1c, + 0x33, 0x6a, 0xc, 0x6c, 0x34, 0x81, 0xea, 0xab, + 0xa0, 0xc0, 0x0, 0x48, 0x1b, 0x0, 0x49, 0xc, + 0x0, 0x1a, 0xa7, 0x80, 0x29, 0x30, 0xc0, 0x7, + 0x30, 0x5b, 0xdd, 0xdd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+96BB "隻" */ + 0x0, 0x7, 0x20, 0x24, 0x0, 0x0, 0x0, 0x4, + 0xd0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0xdc, 0xbb, + 0xce, 0xbb, 0xbb, 0x0, 0xbf, 0x64, 0x46, 0xc4, + 0x44, 0x20, 0x89, 0xb7, 0x55, 0x7d, 0x55, 0x53, + 0x0, 0xb, 0xba, 0xab, 0xea, 0xaa, 0x60, 0x0, + 0xb2, 0x0, 0x2b, 0x0, 0x0, 0x0, 0xb, 0xcb, + 0xbb, 0xcb, 0xbb, 0xb3, 0x1, 0x52, 0x11, 0x11, + 0x11, 0x10, 0x0, 0x9a, 0xed, 0xaa, 0xaa, 0xcd, + 0x10, 0x0, 0x2, 0xc8, 0x10, 0x6c, 0x20, 0x0, + 0x0, 0x1, 0xaf, 0xec, 0x30, 0x0, 0x3a, 0xbd, + 0xc8, 0x32, 0x7b, 0xed, 0x81, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x11, + + /* U+96C6 "集" */ + 0x0, 0x3, 0x40, 0x24, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0x30, 0x1d, 0x0, 0x0, 0x0, 0x0, 0xad, + 0xcc, 0xcf, 0xcc, 0xcc, 0x40, 0xa, 0xf9, 0x44, + 0x6d, 0x44, 0x44, 0x0, 0x38, 0x99, 0x55, 0x6d, + 0x55, 0x54, 0x0, 0x0, 0x8d, 0xbb, 0xbe, 0xbb, + 0xb9, 0x0, 0x0, 0x85, 0x0, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x8d, 0xcc, 0xdd, 0xcc, 0xcc, 0xa0, + 0x0, 0x11, 0x0, 0x76, 0x0, 0x0, 0x0, 0x2c, + 0xcc, 0xce, 0xff, 0xec, 0xcc, 0xc3, 0x0, 0x1, + 0x9b, 0x99, 0xb9, 0x10, 0x0, 0x3, 0x9d, 0x50, + 0x76, 0x5, 0xca, 0x40, 0x3b, 0x40, 0x0, 0x76, + 0x0, 0x3, 0x92, + + /* U+96D1 "雑" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0x0, 0x0, 0x94, 0xb0, 0x0, 0x6, 0x8b, + 0x62, 0x2, 0xc0, 0x86, 0x0, 0x7, 0xba, 0xa6, + 0xc, 0xda, 0xaa, 0xa3, 0x0, 0xb2, 0x66, 0x7e, + 0x83, 0xc5, 0x30, 0x3, 0xb0, 0x66, 0x37, 0x60, + 0xa2, 0x0, 0x2c, 0x20, 0x4c, 0xc7, 0xca, 0xeb, + 0xa1, 0x2, 0x8, 0x40, 0x6, 0x72, 0xb4, 0x20, + 0x1c, 0xce, 0xdc, 0x96, 0x60, 0xa2, 0x0, 0x0, + 0x38, 0x43, 0x6, 0xec, 0xfd, 0xc2, 0x4, 0x88, + 0x4d, 0x6, 0x60, 0xa2, 0x0, 0x1d, 0x18, 0x47, + 0x86, 0x60, 0xa2, 0x0, 0x15, 0x8, 0x40, 0x26, + 0xca, 0xeb, 0xa4, 0x0, 0xbe, 0x20, 0x6, 0x82, + 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+96D6 "雖" */ + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0xc, + 0xcc, 0xce, 0x1, 0xb4, 0x90, 0x0, 0xc, 0x10, + 0xd, 0x7, 0x72, 0xa4, 0x20, 0xc, 0xcb, 0xbe, + 0xd, 0x99, 0xf9, 0x90, 0x0, 0xe, 0x0, 0x8f, + 0x0, 0xe0, 0x0, 0x6, 0x6e, 0x66, 0xbd, 0x0, + 0xe0, 0x0, 0xd, 0x7e, 0x7c, 0x2d, 0xcc, 0xfc, + 0xb0, 0xb, 0xc, 0xa, 0x1d, 0x0, 0xe0, 0x0, + 0xd, 0x6d, 0x6c, 0x1d, 0x22, 0xe2, 0x20, 0x5, + 0x5e, 0x56, 0xd, 0xaa, 0xfa, 0x90, 0x0, 0xd, + 0xc, 0xd, 0x0, 0xe0, 0x0, 0x4b, 0xce, 0xcc, + 0x5d, 0xbb, 0xfb, 0xb2, 0x11, 0x0, 0x2, 0x5d, + 0x11, 0x11, 0x10, + + /* U+96D9 "雙" */ + 0x0, 0x33, 0x50, 0x0, 0x33, 0x40, 0x0, 0x0, + 0xb2, 0xb3, 0x0, 0xb2, 0xb2, 0x0, 0x4, 0xfa, + 0xeb, 0xa4, 0xfa, 0xeb, 0xa2, 0x1d, 0xe7, 0xd8, + 0x7d, 0xe7, 0xe7, 0x60, 0x2, 0xd2, 0xb3, 0x23, + 0xd2, 0xc2, 0x20, 0x0, 0xfa, 0xea, 0x70, 0xea, + 0xea, 0x90, 0x0, 0xe7, 0xd8, 0x71, 0xe7, 0xe7, + 0x73, 0x0, 0x22, 0x22, 0x20, 0x22, 0x33, 0x21, + 0x4, 0xce, 0xdc, 0xcc, 0xcc, 0xf8, 0x0, 0x0, + 0x2, 0xd4, 0x0, 0x9, 0xc0, 0x0, 0x0, 0x0, + 0x1b, 0xc6, 0xd9, 0x0, 0x0, 0x0, 0x2, 0x5a, + 0xec, 0xeb, 0x85, 0x10, 0xc, 0xeb, 0x84, 0x0, + 0x5, 0x9b, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+96E2 "離" */ + 0x0, 0x5, 0x10, 0x0, 0x23, 0x30, 0x0, 0x5, + 0x5a, 0x95, 0x51, 0x84, 0xd1, 0x0, 0x17, 0x76, + 0x77, 0x71, 0xc0, 0x65, 0x0, 0x8, 0x49, 0x86, + 0xa5, 0xfd, 0xed, 0xd3, 0x8, 0x39, 0xc4, 0xad, + 0xb0, 0xa2, 0x0, 0x8, 0x64, 0x6, 0xa5, 0xb1, + 0xa3, 0x10, 0x6, 0xbc, 0xdb, 0x70, 0xeb, 0xec, + 0xb0, 0x3, 0x38, 0x83, 0x31, 0xb0, 0xa2, 0x0, + 0xe, 0x8e, 0x88, 0xd2, 0xc2, 0xb5, 0x20, 0xc, + 0x29, 0x62, 0xa2, 0xea, 0xeb, 0xa0, 0xc, 0xaa, + 0x89, 0xa2, 0xb0, 0xa2, 0x0, 0xc, 0x0, 0x1, + 0xa2, 0xeb, 0xec, 0xb5, 0xc, 0x0, 0xb, 0xc1, + 0xc1, 0x11, 0x10, 0x1, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, + + /* U+96E3 "難" */ + 0x0, 0xc0, 0x1b, 0x0, 0x94, 0x70, 0x0, 0x3c, + 0xfb, 0xce, 0xb0, 0xd0, 0xe1, 0x0, 0x0, 0xd4, + 0x5b, 0x4, 0xa0, 0x74, 0x0, 0x0, 0x5b, 0x74, + 0xc, 0xec, 0xfd, 0xc3, 0xd, 0xad, 0xbc, 0xbf, + 0x60, 0xc1, 0x0, 0xc, 0x9, 0x24, 0xda, 0x83, + 0xd4, 0x30, 0x9, 0xae, 0xca, 0x56, 0xc9, 0xea, + 0x91, 0x6, 0x7c, 0x97, 0x46, 0x60, 0xc1, 0x0, + 0x3, 0x4b, 0x64, 0x26, 0xa6, 0xd7, 0x60, 0x4b, + 0xbe, 0xcb, 0xb6, 0xa6, 0xd7, 0x61, 0x0, 0x4e, + 0x91, 0x6, 0x60, 0xc1, 0x0, 0x3, 0xd2, 0x4c, + 0x26, 0xdb, 0xfc, 0xb4, 0x2b, 0x20, 0x2, 0x16, + 0x71, 0x11, 0x10, + + /* U+96E8 "雨" */ + 0x1e, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe6, 0x0, + 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x6, 0xfe, 0xee, + 0xff, 0xee, 0xee, 0xc0, 0x6, 0x70, 0x0, 0x59, + 0x0, 0x2, 0xc0, 0x6, 0x77, 0xa2, 0x59, 0x6b, + 0x32, 0xc0, 0x6, 0x70, 0x3a, 0x59, 0x2, 0xa3, + 0xc0, 0x6, 0x73, 0x0, 0x59, 0x40, 0x2, 0xc0, + 0x6, 0x76, 0xc3, 0x59, 0x5c, 0x42, 0xc0, 0x6, + 0x70, 0x19, 0x59, 0x1, 0x92, 0xc0, 0x6, 0x70, + 0x0, 0x59, 0x0, 0x2, 0xc0, 0x6, 0x70, 0x0, + 0x48, 0x4, 0xdd, 0x70, + + /* U+96EA "雪" */ + 0x1c, 0xcc, 0xce, 0xdc, 0xcc, 0xc1, 0x22, 0x22, + 0x2c, 0x52, 0x22, 0x22, 0xea, 0xaa, 0xae, 0xba, + 0xaa, 0xae, 0xd2, 0x66, 0x3b, 0x36, 0x66, 0x1d, + 0xc1, 0x44, 0x2b, 0x34, 0x44, 0x1c, 0x7, 0xbb, + 0x6b, 0x3b, 0xbb, 0x70, 0x0, 0x0, 0x3, 0x10, + 0x0, 0x0, 0x7, 0xbb, 0xbb, 0xbb, 0xbd, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x80, 0x4, 0xbb, + 0xbb, 0xbb, 0xbd, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x80, 0xb, 0xcc, 0xcc, 0xcc, 0xcd, 0x80, + + /* U+96F2 "雲" */ + 0x1, 0xbb, 0xbb, 0xed, 0xbb, 0xbb, 0x10, 0x3, + 0x33, 0x33, 0xa8, 0x33, 0x33, 0x30, 0xd, 0x77, + 0x77, 0xba, 0x77, 0x77, 0xe0, 0xd, 0x2a, 0xa7, + 0x86, 0x8a, 0xa2, 0xd0, 0x9, 0x0, 0x0, 0x86, + 0x0, 0x0, 0x90, 0x0, 0x6a, 0xa7, 0x86, 0x8a, + 0xa6, 0x0, 0x0, 0x35, 0x55, 0x66, 0x55, 0x53, + 0x0, 0x0, 0x34, 0x44, 0x44, 0x44, 0x42, 0x0, + 0x2c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc3, 0x0, + 0x1, 0xe3, 0x0, 0xd, 0x40, 0x0, 0x0, 0x1d, + 0x50, 0x0, 0x15, 0xf4, 0x0, 0x0, 0xbf, 0xcc, + 0xcc, 0xba, 0x9e, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, + + /* U+96FB "電" */ + 0x1b, 0xbb, 0xbe, 0xcb, 0xbb, 0xb0, 0x5, 0x66, + 0x66, 0xd8, 0x66, 0x66, 0x40, 0xd4, 0x44, 0x4c, + 0x64, 0x44, 0x5c, 0xd, 0x39, 0x95, 0xb3, 0x89, + 0x92, 0xc0, 0x34, 0x77, 0x4b, 0x36, 0x77, 0x43, + 0x0, 0x13, 0x31, 0x72, 0x23, 0x31, 0x0, 0xb, + 0xcb, 0xbe, 0xcb, 0xbc, 0xa0, 0x0, 0xb6, 0x44, + 0xd6, 0x44, 0x7a, 0x0, 0xb, 0x65, 0x5d, 0x65, + 0x57, 0xa0, 0x0, 0xbb, 0xbb, 0xeb, 0xbb, 0xca, + 0x41, 0xa, 0x10, 0xb, 0x20, 0x0, 0xa, 0x30, + 0x0, 0x0, 0x6d, 0xcc, 0xcc, 0xc0, + + /* U+9700 "需" */ + 0x1, 0xcc, 0xcc, 0xed, 0xcc, 0xcc, 0x10, 0x6, + 0x66, 0x66, 0xba, 0x66, 0x66, 0x60, 0xd, 0x33, + 0x33, 0x98, 0x33, 0x33, 0xe0, 0xd, 0x3a, 0xa7, + 0x76, 0x8a, 0xa3, 0xe0, 0x2, 0x47, 0x75, 0x76, + 0x67, 0x74, 0x20, 0x0, 0x23, 0x32, 0x54, 0x33, + 0x32, 0x0, 0xc, 0xcc, 0xcc, 0xed, 0xcc, 0xcc, + 0xc1, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0xfc, 0xcf, 0xcc, 0xfc, 0xce, 0x50, 0x0, + 0xe0, 0xd, 0x0, 0xc1, 0x9, 0x50, 0x0, 0xe0, + 0xd, 0x0, 0xc1, 0x9, 0x50, 0x0, 0xe0, 0xc, + 0x0, 0xb1, 0xad, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9707 "震" */ + 0x1, 0xbb, 0xbb, 0xdd, 0xbb, 0xbb, 0x10, 0x5, + 0x66, 0x66, 0xba, 0x66, 0x66, 0x50, 0xd, 0x33, + 0x33, 0x98, 0x33, 0x33, 0xd0, 0xa, 0x29, 0x96, + 0x76, 0x79, 0x93, 0xa0, 0x0, 0x6a, 0xa7, 0x76, + 0x8a, 0xa7, 0x0, 0x0, 0xbb, 0xbb, 0xdc, 0xbb, + 0xbb, 0x80, 0x0, 0xc2, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x1, 0xc2, 0x55, 0x55, 0x55, 0x55, 0x0, + 0x3, 0xeb, 0xda, 0xad, 0xba, 0xab, 0xa2, 0x5, + 0x80, 0xe0, 0x5, 0xc1, 0x5b, 0x10, 0xc, 0x31, + 0xe1, 0x35, 0x5d, 0xd5, 0x10, 0x49, 0x7, 0xeb, + 0x85, 0x10, 0x49, 0xc2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9752 "青" */ + 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x0, 0x2, + 0xbb, 0xbb, 0xdd, 0xbb, 0xbb, 0x40, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x8b, 0xbb, + 0xdd, 0xbb, 0xb9, 0x0, 0x4, 0x44, 0x44, 0xa9, + 0x44, 0x44, 0x40, 0x16, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x61, 0x0, 0x1b, 0xbb, 0xbb, 0xbb, 0xb3, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0xa4, 0x0, + 0x0, 0x2e, 0xaa, 0xaa, 0xaa, 0xe4, 0x0, 0x0, + 0x2c, 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x2e, + 0xaa, 0xaa, 0xaa, 0xe4, 0x0, 0x0, 0x2c, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x8b, 0xc1, 0x0, + + /* U+9759 "静" */ + 0x0, 0x9, 0x40, 0x0, 0x74, 0x0, 0x0, 0x9, + 0x9d, 0xb9, 0x70, 0xea, 0x97, 0x0, 0x2, 0x2a, + 0x62, 0x27, 0x94, 0xa9, 0x0, 0x8, 0xbe, 0xcb, + 0x8e, 0x1, 0xd0, 0x0, 0x0, 0x9, 0x40, 0xb, + 0xff, 0xff, 0xd0, 0x2b, 0xbb, 0xbb, 0xa0, 0xe, + 0x0, 0xd0, 0x2, 0x77, 0x77, 0x37, 0x7f, 0x77, + 0xe5, 0x6, 0x83, 0x3b, 0x44, 0x4e, 0x44, 0xe3, + 0x6, 0xdb, 0xbe, 0x31, 0x2e, 0x22, 0xd0, 0x6, + 0x60, 0x9, 0x36, 0xbf, 0xbb, 0xd0, 0x6, 0xda, + 0xae, 0x30, 0xe, 0x0, 0x30, 0x6, 0x60, 0x9, + 0x30, 0xe, 0x0, 0x0, 0x6, 0x60, 0xbd, 0x14, + 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+975E "非" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x0, 0xe1, 0x0, 0x0, 0xa, 0xcc, 0xcf, + 0x0, 0xec, 0xcc, 0xc1, 0x1, 0x22, 0x2f, 0x0, + 0xe3, 0x22, 0x20, 0x0, 0x0, 0xf, 0x0, 0xe1, + 0x0, 0x0, 0x2, 0x33, 0x3f, 0x0, 0xe4, 0x22, + 0x20, 0x7, 0xaa, 0xaf, 0x0, 0xeb, 0xbb, 0x90, + 0x0, 0x0, 0xf, 0x0, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0xe1, 0x0, 0x0, 0x2e, 0xee, + 0xef, 0x0, 0xee, 0xee, 0xe5, 0x0, 0x0, 0xf, + 0x0, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0xe1, + 0x0, 0x0, + + /* U+9762 "面" */ + 0x2e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe2, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0x8, 0xed, 0xee, + 0xdd, 0xfe, 0xde, 0x80, 0x8, 0x60, 0x75, 0x0, + 0x85, 0x6, 0x80, 0x8, 0x60, 0x7d, 0xbb, 0xd5, + 0x6, 0x80, 0x8, 0x60, 0x76, 0x0, 0x85, 0x6, + 0x80, 0x8, 0x60, 0x75, 0x0, 0x85, 0x6, 0x80, + 0x8, 0x60, 0x7d, 0xcc, 0xe5, 0x6, 0x80, 0x8, + 0x60, 0x75, 0x0, 0x85, 0x6, 0x80, 0x8, 0xdb, + 0xdd, 0xbb, 0xed, 0xbd, 0x80, 0x8, 0x71, 0x11, + 0x11, 0x11, 0x18, 0x80, + + /* U+9769 "革" */ + 0x0, 0x0, 0xe0, 0x0, 0xa, 0x40, 0x0, 0x9, + 0xbb, 0xfb, 0xbb, 0xbe, 0xcb, 0xb2, 0x1, 0x11, + 0xe2, 0x11, 0x1b, 0x51, 0x10, 0x0, 0x0, 0xe9, + 0x99, 0x9d, 0x40, 0x0, 0x0, 0x0, 0x22, 0x7b, + 0x22, 0x0, 0x0, 0x0, 0x6c, 0xcc, 0xde, 0xcc, + 0xcc, 0x0, 0x0, 0x86, 0x0, 0x5a, 0x0, 0xf, + 0x0, 0x0, 0x86, 0x0, 0x5a, 0x0, 0xf, 0x0, + 0x0, 0x6c, 0xcc, 0xde, 0xcc, 0xcc, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0x1d, 0xdd, + 0xdd, 0xef, 0xdd, 0xdd, 0xd6, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0x0, 0x0, 0x0, + + /* U+9774 "靴" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x70, 0xc0, 0x2, 0xb0, 0xd0, 0x0, 0x3b, 0xc9, + 0xe9, 0x7, 0x70, 0xd0, 0x0, 0x6, 0x82, 0xd2, + 0xc, 0x20, 0xd0, 0x10, 0x4, 0xc9, 0xd0, 0x3f, + 0x0, 0xd0, 0xc4, 0x0, 0x4c, 0x20, 0xcf, 0x0, + 0xd8, 0xa0, 0xb, 0xce, 0xb9, 0xbe, 0x0, 0xfd, + 0x10, 0xb, 0xa, 0x47, 0x1d, 0x4, 0xf2, 0x0, + 0xb, 0xa, 0x47, 0xd, 0x6d, 0xd0, 0x0, 0xb, + 0xce, 0xc5, 0xd, 0x41, 0xd0, 0x0, 0x0, 0x1a, + 0x0, 0xd, 0x0, 0xd0, 0x0, 0x4d, 0xdf, 0xdc, + 0xd, 0x0, 0xd0, 0x8, 0x0, 0x1a, 0x0, 0xd, + 0x0, 0xe0, 0x1a, 0x0, 0x1a, 0x0, 0xd, 0x0, + 0xbe, 0xe5, 0x0, 0x1, 0x0, 0x2, 0x0, 0x0, + 0x0, + + /* U+97F3 "音" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x4, 0xaa, + 0xaa, 0xce, 0xaa, 0xaa, 0x50, 0x1, 0x26, 0x82, + 0x22, 0x28, 0x82, 0x10, 0x0, 0x2, 0xe0, 0x0, + 0xc, 0x40, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x3d, + 0x0, 0x0, 0x3d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xcc, 0xcc, 0xcc, 0xe6, 0x0, 0x0, + 0x4a, 0x0, 0x0, 0x0, 0x86, 0x0, 0x0, 0x4e, + 0xcc, 0xcc, 0xcc, 0xe6, 0x0, 0x0, 0x4a, 0x0, + 0x0, 0x0, 0x86, 0x0, 0x0, 0x4a, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x0, 0x4e, 0xcc, 0xcc, 0xcc, + 0xe6, 0x0, + + /* U+97FF "響" */ + 0x0, 0x22, 0x0, 0x33, 0x0, 0x0, 0x0, 0x1, + 0xa3, 0x4b, 0x99, 0xd5, 0xeb, 0xe3, 0xa, 0xba, + 0xb, 0x99, 0xd5, 0xa2, 0x90, 0x5, 0xc5, 0xbc, + 0x33, 0xa5, 0xa2, 0xa1, 0x7, 0x6b, 0x7c, 0x68, + 0xd3, 0xa0, 0x57, 0x1, 0x99, 0x1f, 0xca, 0x88, + 0xa8, 0xb2, 0xb, 0x40, 0x14, 0x5a, 0x2, 0x90, + 0x0, 0x0, 0x57, 0xd9, 0x77, 0x7e, 0x87, 0x10, + 0xa, 0xaa, 0xcd, 0xaa, 0xce, 0xaa, 0xa4, 0x0, + 0x5, 0x55, 0x55, 0x55, 0x52, 0x0, 0x0, 0x1d, + 0x44, 0x44, 0x44, 0x88, 0x0, 0x0, 0x1e, 0x88, + 0x88, 0x88, 0xb8, 0x0, 0x0, 0x1e, 0x99, 0x99, + 0x99, 0xb7, 0x0, + + /* U+9803 "頃" */ + 0xd, 0x0, 0x1c, 0xcc, 0xfd, 0xcc, 0x80, 0xd, + 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd, 0x0, + 0x7, 0xcc, 0xeb, 0xbc, 0x20, 0xf, 0xcc, 0xa9, + 0x50, 0x0, 0xb, 0x30, 0xd, 0x0, 0x9, 0xdb, + 0xbb, 0xbe, 0x30, 0xd, 0x0, 0x9, 0x50, 0x0, + 0xb, 0x30, 0xd, 0x0, 0x9, 0xcb, 0xbb, 0xbe, + 0x30, 0xd, 0x5, 0xb9, 0x50, 0x0, 0xb, 0x30, + 0x2e, 0xda, 0x39, 0x61, 0x11, 0x1c, 0x30, 0x8b, + 0x20, 0x6, 0xaa, 0xaa, 0xaa, 0x20, 0x0, 0x0, + 0x2, 0xc6, 0x3, 0xc3, 0x0, 0x0, 0x1, 0xbc, + 0x40, 0x0, 0x2c, 0x90, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x20, + + /* U+9805 "項" */ + 0x0, 0x0, 0x4, 0xcc, 0xcf, 0xdc, 0xc7, 0x1c, + 0xdf, 0xc8, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x2b, + 0x0, 0x7c, 0xde, 0xcc, 0xc0, 0x0, 0x2b, 0x0, + 0x94, 0x0, 0x0, 0xe0, 0x0, 0x2b, 0x0, 0x9c, + 0xbb, 0xbb, 0xf0, 0x0, 0x2b, 0x0, 0x94, 0x0, + 0x0, 0xe0, 0x0, 0x2b, 0x3, 0x9b, 0xaa, 0xaa, + 0xf0, 0x0, 0x4e, 0xeb, 0x95, 0x11, 0x11, 0xe0, + 0x2c, 0xe9, 0x20, 0x95, 0x0, 0x0, 0xe0, 0x16, + 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xb0, 0x0, 0x0, + 0x0, 0x2c, 0x50, 0x5a, 0x20, 0x0, 0x0, 0x1b, + 0xc4, 0x0, 0x4, 0xd5, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x11, + + /* U+9808 "須" */ + 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3d, 0x39, 0xcc, 0xee, 0xcc, 0xc1, 0x8, 0xd2, + 0x0, 0x0, 0x97, 0x0, 0x0, 0x48, 0x0, 0x1, + 0xdb, 0xdc, 0xbc, 0x80, 0x0, 0x1, 0x61, 0xc0, + 0x0, 0x4, 0xa0, 0x0, 0x2d, 0x41, 0xfb, 0xbb, + 0xbc, 0xa0, 0x7, 0xd4, 0x1, 0xc0, 0x0, 0x4, + 0xa0, 0x29, 0x10, 0x1, 0xfb, 0xbb, 0xbc, 0xa0, + 0x0, 0x0, 0x83, 0xc0, 0x0, 0x4, 0xa0, 0x0, + 0x7, 0xa1, 0xd1, 0x11, 0x16, 0xa0, 0x0, 0x5d, + 0x0, 0x9a, 0x99, 0x99, 0x60, 0x9, 0xc2, 0x0, + 0x6c, 0x10, 0xa7, 0x0, 0x69, 0x0, 0x6d, 0x91, + 0x0, 0x7, 0xd2, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x20, + + /* U+9817 "頗" */ + 0x0, 0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x0, 0x2c, 0xce, 0xec, 0xc1, 0xb, 0xcf, + 0xcc, 0xa0, 0x9, 0x50, 0x0, 0xc, 0xb, 0x5, + 0x89, 0xce, 0xcc, 0xa0, 0xc, 0xb, 0x6, 0x3c, + 0x10, 0x0, 0xd0, 0xc, 0xcf, 0xdd, 0x2c, 0xcb, + 0xbb, 0xd0, 0xc, 0x20, 0xe, 0xc, 0x10, 0x0, + 0xd0, 0xc, 0x98, 0x4b, 0xc, 0xba, 0xab, 0xd0, + 0xc, 0xd, 0xe5, 0xc, 0x10, 0x0, 0xd0, 0xc, + 0x4, 0xf3, 0xc, 0x20, 0x1, 0xd0, 0x3a, 0xc, + 0x9d, 0x18, 0xba, 0xaa, 0x90, 0x77, 0x99, 0x6, + 0x33, 0xd1, 0x2b, 0x10, 0x75, 0x90, 0x0, 0xac, + 0x30, 0x4, 0xd2, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x20, + + /* U+9818 "領" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6e, 0x10, 0xbc, 0xcf, 0xdc, 0xc1, 0x1, 0xd4, + 0xd1, 0x0, 0x1d, 0x0, 0x0, 0x1d, 0x40, 0x3c, + 0x5c, 0xcd, 0xbc, 0x80, 0x95, 0x65, 0x4, 0x67, + 0x0, 0x3, 0xa0, 0x0, 0xd, 0x10, 0x5d, 0xbb, + 0xbc, 0xa0, 0x5, 0x57, 0x54, 0x57, 0x0, 0x3, + 0xa0, 0x6, 0x66, 0x9b, 0x5d, 0xbb, 0xbc, 0xa0, + 0x0, 0x0, 0x95, 0x58, 0x0, 0x3, 0xa0, 0x2, + 0x12, 0xd0, 0x58, 0x11, 0x14, 0xa0, 0x4, 0xdb, + 0x40, 0x3a, 0xaa, 0xaa, 0x70, 0x0, 0x3e, 0x10, + 0x9, 0x80, 0x69, 0x0, 0x0, 0x4, 0x66, 0xd7, + 0x0, 0x6, 0xd1, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x20, + + /* U+982D "頭" */ + 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x10, 0x1d, + 0xdd, 0xdd, 0x8b, 0xbe, 0xdb, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x40, 0x0, 0x8, 0xcc, 0xcc, + 0x1b, 0xcc, 0xcb, 0xe0, 0xa, 0x20, 0xc, 0x1b, + 0x10, 0x0, 0xe0, 0xa, 0x20, 0xc, 0x1b, 0xcb, + 0xbb, 0xf0, 0x9, 0xbb, 0xbd, 0x1b, 0x10, 0x0, + 0xe0, 0x2, 0x40, 0x35, 0xb, 0xba, 0xaa, 0xf0, + 0x1, 0xb0, 0x77, 0xb, 0x10, 0x0, 0xe0, 0x0, + 0xd0, 0xa3, 0xb, 0x20, 0x0, 0xe0, 0x0, 0x70, + 0xa5, 0x48, 0xaa, 0xaa, 0xa0, 0x18, 0xbd, 0xb8, + 0x33, 0xc1, 0x1b, 0x20, 0x6, 0x20, 0x1, 0xac, + 0x20, 0x2, 0xd5, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x11, + + /* U+983C "頼" */ + 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0x40, 0x3d, 0xde, 0xed, 0xd6, 0xc, 0xce, + 0xdc, 0x80, 0x8, 0x60, 0x0, 0x0, 0x9, 0x40, + 0x7, 0xce, 0xcc, 0xc0, 0xb, 0xbd, 0xcc, 0x79, + 0x40, 0x0, 0xe0, 0xb, 0x8, 0x33, 0x89, 0xcb, + 0xbb, 0xf0, 0xc, 0x4a, 0x77, 0x89, 0x40, 0x0, + 0xe0, 0x5, 0x7f, 0xa6, 0x39, 0xca, 0xaa, 0xf0, + 0x0, 0x6f, 0xe3, 0x9, 0x40, 0x0, 0xe0, 0x1, + 0xca, 0x5c, 0x29, 0x40, 0x0, 0xe0, 0xb, 0x59, + 0x43, 0x56, 0xba, 0xaa, 0xa0, 0x38, 0x9, 0x40, + 0x4, 0xd2, 0xb, 0x50, 0x0, 0x9, 0x40, 0xa8, + 0x10, 0x0, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+984C "題" */ + 0x7, 0xcb, 0xbe, 0x3b, 0xbc, 0xdb, 0xb5, 0x7, + 0x84, 0x4d, 0x11, 0x2a, 0x72, 0x20, 0x7, 0x84, + 0x4d, 0x18, 0xa7, 0x77, 0xd0, 0x7, 0xcb, 0xbe, + 0x18, 0xb8, 0x88, 0xd0, 0x0, 0x0, 0x0, 0x8, + 0x62, 0x22, 0xd0, 0x4b, 0xbc, 0xcb, 0xb8, 0xca, + 0xaa, 0xd0, 0x1, 0x28, 0x40, 0x8, 0x50, 0x0, + 0xd0, 0x6, 0x68, 0xb9, 0x76, 0xba, 0xaa, 0xa0, + 0x8, 0x78, 0x51, 0x10, 0xa2, 0xb, 0x20, 0xa, + 0xdb, 0x40, 0x2c, 0x60, 0x3, 0xd2, 0xc, 0x1d, + 0x92, 0x44, 0x0, 0x0, 0x33, 0x48, 0x0, 0x5a, + 0xcc, 0xcc, 0xcc, 0xc7, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9854 "顔" */ + 0x0, 0x6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x38, 0x93, 0x2c, 0xce, 0xec, 0xc3, 0x19, 0xd9, + 0x9d, 0x80, 0x7, 0x70, 0x0, 0x0, 0xd0, 0x1d, + 0x7, 0xcd, 0xcb, 0xd0, 0x4, 0xb7, 0x9a, 0x58, + 0x40, 0x0, 0xd0, 0xd, 0x76, 0x79, 0x68, 0xdb, + 0xbb, 0xf0, 0xd, 0x5, 0xb5, 0x8, 0x40, 0x0, + 0xd0, 0xd, 0x56, 0x5, 0x18, 0xcb, 0xbb, 0xf0, + 0xd, 0x0, 0x89, 0x8, 0x50, 0x0, 0xd0, 0xd, + 0x3c, 0x60, 0x8, 0x51, 0x11, 0xd0, 0x1c, 0x11, + 0x8, 0x75, 0xaa, 0xaa, 0xa0, 0x57, 0x3, 0xb7, + 0x1, 0xc3, 0x1c, 0x30, 0x52, 0xaa, 0x20, 0x7d, + 0x40, 0x2, 0xd4, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x10, + + /* U+9858 "願" */ + 0xc, 0xdd, 0xfd, 0xd8, 0xcd, 0xfc, 0xc3, 0xc, + 0x0, 0xd0, 0x0, 0x5, 0x90, 0x0, 0xc, 0x4b, + 0xeb, 0xb2, 0xcd, 0xdb, 0xb0, 0xc, 0x46, 0x0, + 0xc2, 0x90, 0x0, 0xd0, 0xc, 0x4d, 0xbb, 0xe2, + 0xeb, 0xbb, 0xe0, 0xc, 0x46, 0x0, 0xc2, 0x90, + 0x0, 0xd0, 0xd, 0x4c, 0x99, 0xe2, 0xea, 0xaa, + 0xe0, 0xc, 0x1, 0xc1, 0x12, 0xa0, 0x0, 0xd0, + 0xd, 0x37, 0xc1, 0xa2, 0xa0, 0x0, 0xd0, 0x39, + 0x74, 0xc0, 0xb3, 0xbb, 0xaa, 0x90, 0x75, 0x90, + 0xc0, 0x33, 0xb6, 0xa, 0x50, 0x51, 0x9, 0xc0, + 0x2c, 0x40, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+985E "類" */ + 0x4, 0x8, 0x41, 0x10, 0x0, 0x0, 0x0, 0x7, + 0x58, 0x48, 0x5d, 0xde, 0xed, 0xd6, 0x2, 0x79, + 0x68, 0x10, 0x9, 0x50, 0x0, 0xa, 0xbf, 0xca, + 0x87, 0xce, 0xcb, 0xc0, 0x0, 0x9c, 0xd6, 0x9, + 0x30, 0x0, 0xe0, 0x9, 0x48, 0x56, 0x89, 0xcb, + 0xbb, 0xf0, 0x0, 0x4, 0x39, 0x9, 0x30, 0x0, + 0xe0, 0x0, 0x8, 0x55, 0x69, 0xcb, 0xbb, 0xf0, + 0x1f, 0xff, 0xff, 0xd9, 0x30, 0x0, 0xe0, 0x0, + 0xb, 0x40, 0x9, 0x41, 0x11, 0xe0, 0x0, 0x1e, + 0xd4, 0x6, 0xaa, 0xaa, 0xa0, 0x2, 0xd5, 0x2c, + 0x52, 0xc2, 0x1b, 0x30, 0x1d, 0x50, 0x0, 0xac, + 0x30, 0x2, 0xc5, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x1, + + /* U+986F "顯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xaa, 0xaa, 0xf5, 0xcd, 0xfc, 0xc1, 0xd, 0x55, + 0x55, 0xe0, 0x4, 0xa0, 0x0, 0xd, 0x44, 0x44, + 0xe0, 0xdc, 0xdb, 0xb0, 0xd, 0xaa, 0xaa, 0xf0, + 0xc0, 0x0, 0xc0, 0x5, 0x60, 0xb, 0x0, 0xfb, + 0xbb, 0xd0, 0x1c, 0x58, 0x98, 0xb1, 0xc0, 0x0, + 0xc0, 0x17, 0xe2, 0x5b, 0x80, 0xfb, 0xbb, 0xd0, + 0x9, 0x48, 0x3a, 0x75, 0xc0, 0x0, 0xc0, 0x4f, + 0xdc, 0xdd, 0xaa, 0xc1, 0x11, 0xc0, 0x4, 0x13, + 0x40, 0x82, 0xaa, 0xaa, 0x90, 0xc, 0x29, 0x82, + 0xa2, 0x49, 0x9, 0x30, 0x58, 0xb, 0x34, 0x1a, + 0xb1, 0x1, 0xd2, 0x1, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x10, + + /* U+98A8 "風" */ + 0x0, 0xce, 0xee, 0xee, 0xee, 0xeb, 0x0, 0x0, + 0xc1, 0x0, 0x2, 0x55, 0x2c, 0x0, 0x0, 0xc5, + 0xbb, 0xfa, 0x74, 0x2c, 0x0, 0x0, 0xc1, 0x0, + 0xc1, 0x0, 0x1c, 0x0, 0x0, 0xc2, 0xdc, 0xfc, + 0xcb, 0x1c, 0x0, 0x0, 0xd1, 0xa0, 0xc1, 0xc, + 0x1c, 0x0, 0x0, 0xe1, 0xa0, 0xc1, 0xc, 0xd, + 0x0, 0x0, 0xd1, 0xec, 0xfc, 0xcc, 0xd, 0x0, + 0x3, 0xb0, 0x0, 0xc1, 0x34, 0xd, 0x0, 0x7, + 0x70, 0x0, 0xc2, 0x3d, 0x1c, 0x17, 0xd, 0x1c, + 0xdd, 0xdb, 0xab, 0x89, 0x78, 0x48, 0x0, 0x0, + 0x0, 0x0, 0x62, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+98DB "飛" */ + 0x6, 0xdd, 0xdd, 0xdd, 0xdf, 0x8, 0x50, 0x0, + 0x0, 0x62, 0x90, 0xb, 0xa9, 0x0, 0x5, 0x9d, + 0x92, 0xe0, 0x8, 0xbc, 0x80, 0x5, 0x6a, 0x0, + 0xe0, 0x2, 0xd0, 0x40, 0x0, 0x3a, 0x0, 0xe0, + 0x0, 0x9a, 0x93, 0x4d, 0xef, 0xdd, 0xfd, 0xdd, + 0x24, 0x70, 0x0, 0x59, 0x0, 0xe0, 0xb, 0x38, + 0x80, 0x0, 0x87, 0x0, 0xe0, 0x9, 0xca, 0x0, + 0x0, 0xb4, 0x0, 0xe0, 0x7, 0xab, 0xa0, 0x1, + 0xe0, 0x0, 0xe0, 0x3, 0xb0, 0x30, 0xb, 0x70, + 0x0, 0xe0, 0x0, 0xc4, 0x27, 0x4b, 0x0, 0x0, + 0xe0, 0x0, 0x2c, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+98DF "食" */ + 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xdd, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0x51, 0xc8, 0x0, 0x0, 0x0, 0x3c, 0x90, + 0x96, 0x8, 0xe8, 0x10, 0x2c, 0xcf, 0xcc, 0xcd, + 0xcc, 0xf9, 0xe4, 0x3, 0xe, 0x0, 0x0, 0x0, + 0xe0, 0x0, 0x0, 0xf, 0xbb, 0xbb, 0xbb, 0xe0, + 0x0, 0x0, 0xe, 0x0, 0x0, 0x0, 0xe0, 0x0, + 0x0, 0xf, 0xcc, 0xcc, 0xcc, 0xe4, 0x0, 0x0, + 0xe, 0x0, 0x66, 0x2, 0xb7, 0x0, 0x0, 0xe, + 0x0, 0x18, 0xde, 0x30, 0x0, 0x0, 0xf, 0x47, + 0xa5, 0x2a, 0xb2, 0x0, 0x0, 0x3e, 0xa6, 0x30, + 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+98EF "飯" */ + 0x0, 0x1a, 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, + 0xbb, 0xa0, 0x8, 0xab, 0xca, 0x60, 0x1b, 0x71, + 0x6c, 0x1d, 0x20, 0x0, 0x0, 0xa6, 0xc, 0x4, + 0x1d, 0x0, 0x0, 0x0, 0x8, 0xbe, 0xb8, 0xe, + 0xdd, 0xdd, 0xa0, 0xb, 0x10, 0xb, 0xd, 0xc0, + 0x3, 0x90, 0xb, 0xbb, 0xbb, 0xd, 0x93, 0x7, + 0x60, 0xb, 0x10, 0xb, 0xc, 0x48, 0xc, 0x20, + 0xb, 0xcb, 0xcb, 0x1b, 0xc, 0x4b, 0x0, 0xb, + 0x10, 0x70, 0x3a, 0x6, 0xe3, 0x0, 0xb, 0x11, + 0xc4, 0x66, 0x6, 0xf3, 0x0, 0xe, 0xcb, 0x5b, + 0xb2, 0x5c, 0x3d, 0x40, 0x29, 0x20, 0x3, 0xb4, + 0xb1, 0x2, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+98F2 "飲" */ + 0x0, 0x4, 0x90, 0x0, 0x29, 0x0, 0x0, 0x0, + 0x2, 0xdc, 0x80, 0x6, 0x90, 0x0, 0x0, 0x6, + 0xd3, 0x18, 0xc1, 0x98, 0x33, 0x32, 0x3, 0xc2, + 0x59, 0x5, 0x1d, 0xaa, 0xab, 0xb0, 0x2, 0xbc, + 0xfb, 0x75, 0xb0, 0x40, 0x67, 0x0, 0x3a, 0x0, + 0x3a, 0xc4, 0x1d, 0x9, 0x30, 0x3, 0xeb, 0xbc, + 0xa2, 0x2, 0xd0, 0x70, 0x0, 0x3a, 0x0, 0x3a, + 0x0, 0x5f, 0x20, 0x0, 0x3, 0xeb, 0xbc, 0x90, + 0x9, 0xe7, 0x0, 0x0, 0x3a, 0x1, 0x60, 0x1, + 0xe3, 0xc0, 0x0, 0x3, 0xa0, 0x3e, 0x20, 0xa8, + 0xa, 0x50, 0x0, 0x6e, 0xc9, 0x6a, 0xac, 0x0, + 0x2e, 0x30, 0x8, 0x60, 0x0, 0x9a, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+9928 "館" */ + 0x0, 0x7, 0x0, 0x0, 0x6, 0x0, 0x0, 0x9, + 0xd6, 0x0, 0x0, 0xc1, 0x0, 0x9, 0x90, 0x98, + 0xac, 0xcc, 0xcc, 0xc9, 0x81, 0xb0, 0x8b, 0x0, + 0x0, 0xb, 0x8, 0xbf, 0xb7, 0x2b, 0x99, 0x9a, + 0x20, 0xb0, 0x1, 0xa0, 0xc0, 0x0, 0xc0, 0xb, + 0xaa, 0xba, 0xc, 0x11, 0x1c, 0x0, 0xb2, 0x23, + 0xa0, 0xdb, 0xbb, 0x80, 0xb, 0x99, 0xaa, 0xc, + 0x0, 0x0, 0x0, 0xb2, 0x26, 0x10, 0xdb, 0xbb, + 0xd4, 0xb, 0x0, 0xc1, 0xc, 0x0, 0x7, 0x40, + 0xd8, 0xb8, 0x90, 0xc2, 0x22, 0x94, 0x2a, 0x30, + 0x6, 0xd, 0xaa, 0xac, 0x40, + + /* U+9996 "首" */ + 0x0, 0x4, 0x80, 0x0, 0x2, 0xa0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0xc, 0x40, 0x0, 0x1d, 0xdd, + 0xed, 0xdd, 0xef, 0xdd, 0xd5, 0x0, 0x0, 0x0, + 0x88, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xbb, 0xed, + 0xbb, 0xb9, 0x0, 0x0, 0x68, 0x11, 0x11, 0x11, + 0x4c, 0x0, 0x0, 0x67, 0x0, 0x0, 0x0, 0x2c, + 0x0, 0x0, 0x6e, 0xcc, 0xcc, 0xcc, 0xdc, 0x0, + 0x0, 0x67, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x6e, 0xcc, 0xcc, 0xcc, 0xcc, 0x0, 0x0, 0x67, + 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x6e, 0xcc, + 0xcc, 0xcc, 0xdc, 0x0, 0x0, 0x68, 0x0, 0x0, + 0x0, 0x3c, 0x0, + + /* U+9999 "香" */ + 0x0, 0x0, 0x0, 0x13, 0x58, 0xb4, 0x0, 0x0, + 0xbd, 0xdd, 0xec, 0x85, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x2b, 0xbb, 0xbb, + 0xdd, 0xbb, 0xbb, 0xb2, 0x1, 0x11, 0x4d, 0xaa, + 0xd4, 0x11, 0x10, 0x0, 0x4, 0xd2, 0x77, 0x2c, + 0x50, 0x0, 0x2, 0x9c, 0x20, 0x77, 0x1, 0xac, + 0x40, 0x2e, 0x8a, 0xaa, 0xaa, 0xaa, 0xa6, 0xb3, + 0x0, 0x1d, 0x11, 0x11, 0x11, 0xb4, 0x0, 0x0, + 0x1d, 0x11, 0x11, 0x11, 0xb4, 0x0, 0x0, 0x1e, + 0x99, 0x99, 0x99, 0xd4, 0x0, 0x0, 0x1c, 0x0, + 0x0, 0x0, 0xa4, 0x0, 0x0, 0x1f, 0xcc, 0xcc, + 0xcc, 0xe4, 0x0, + + /* U+99C4 "駄" */ + 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, 0x0, 0xd, + 0xce, 0xdc, 0x20, 0xe, 0x0, 0x0, 0xd, 0xa, + 0x20, 0x0, 0xe, 0x0, 0x0, 0xd, 0xbe, 0xcb, + 0x0, 0xe, 0x0, 0x0, 0xd, 0xa, 0x20, 0x7e, + 0xef, 0xee, 0xe1, 0xd, 0xbe, 0xcb, 0x0, 0xf, + 0x70, 0x0, 0xd, 0xa, 0x20, 0x0, 0x2e, 0xa0, + 0x0, 0xd, 0xce, 0xcc, 0x40, 0x67, 0xc0, 0x0, + 0x0, 0x1, 0x48, 0x40, 0xa3, 0xa2, 0x0, 0x9, + 0x88, 0x9a, 0x31, 0xd1, 0x58, 0x0, 0x37, 0x78, + 0x2d, 0x19, 0x9c, 0x2e, 0x0, 0x63, 0x40, 0xd, + 0x5c, 0x7, 0x98, 0x90, 0x0, 0x8, 0xc9, 0xa2, + 0x0, 0x20, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+99C5 "駅" */ + 0xb, 0xcf, 0xdc, 0x74, 0xed, 0xdd, 0xe0, 0xb, + 0xb, 0x10, 0x4, 0x80, 0x0, 0xd0, 0xb, 0xce, + 0xcb, 0x14, 0x80, 0x0, 0xd0, 0xb, 0xb, 0x10, + 0x4, 0x80, 0x0, 0xd0, 0xb, 0xce, 0xcc, 0x14, + 0xb5, 0x55, 0xe0, 0xb, 0xb, 0x10, 0x5, 0xc8, + 0xd7, 0x70, 0xb, 0xce, 0xcc, 0x86, 0x70, 0xd0, + 0x0, 0x1, 0x0, 0x42, 0xa7, 0x50, 0xb3, 0x0, + 0x9, 0x78, 0x77, 0x99, 0x40, 0x68, 0x0, 0x9, + 0x78, 0x9, 0x7d, 0x10, 0x1d, 0x10, 0x64, 0x40, + 0x9, 0xac, 0x0, 0x7, 0xa0, 0x0, 0x7, 0xcc, + 0xa4, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9A12 "騒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xce, 0xcc, 0x5e, 0xdc, 0xce, 0x80, 0xb, 0xb, + 0x0, 0x6, 0x90, 0x2d, 0x0, 0xb, 0xcf, 0xca, + 0x0, 0x9a, 0xc2, 0x0, 0xb, 0xb, 0x0, 0x5, + 0xcb, 0xd8, 0x20, 0xb, 0xcf, 0xca, 0xaa, 0x3a, + 0x6, 0xc5, 0xb, 0xb, 0x0, 0x16, 0x6e, 0x66, + 0x50, 0xb, 0xce, 0xcc, 0x6a, 0x5e, 0x65, 0xd0, + 0x1, 0x1, 0x2a, 0x67, 0xd, 0x0, 0xd0, 0x9, + 0x77, 0xab, 0x4c, 0xcf, 0xcc, 0xb0, 0x19, 0x78, + 0x3d, 0x0, 0xd, 0x9, 0x20, 0x64, 0x41, 0xd, + 0x2, 0x3e, 0x7a, 0xd0, 0x0, 0x8, 0xc8, 0x7a, + 0x97, 0x54, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9A13 "験" */ + 0x0, 0x0, 0x0, 0x0, 0x1e, 0x80, 0x0, 0xb, + 0xce, 0xdc, 0x20, 0x9b, 0xe3, 0x0, 0xb, 0xa, + 0x10, 0x5, 0xd0, 0x4d, 0x20, 0xb, 0xce, 0xdb, + 0x6d, 0x20, 0x5, 0xe4, 0xb, 0xa, 0x10, 0x85, + 0xce, 0xdc, 0x34, 0xb, 0xbe, 0xcb, 0x0, 0xa, + 0x40, 0x0, 0xb, 0x1b, 0x20, 0x3d, 0xbe, 0xcb, + 0xe0, 0xa, 0xac, 0xaa, 0x79, 0xa, 0x30, 0xd0, + 0x2, 0x2, 0x48, 0x8e, 0xbe, 0xcb, 0xe0, 0x9, + 0x78, 0x9a, 0x30, 0x1d, 0xc0, 0x0, 0x19, 0x78, + 0x2c, 0x10, 0xa6, 0x77, 0x0, 0x64, 0x40, 0xd, + 0x1a, 0xa0, 0xc, 0x80, 0x0, 0x7, 0xc9, 0xa7, + 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9A57 "驗" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0xc, + 0xcf, 0xcb, 0x0, 0x8c, 0xb1, 0x0, 0xc, 0xc, + 0x0, 0x9, 0xa0, 0x3c, 0x40, 0xc, 0xae, 0xa8, + 0xdb, 0xcc, 0xcc, 0xa6, 0xc, 0xc, 0x0, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xcf, 0xc7, 0x4a, 0xa4, + 0x9a, 0xa0, 0xc, 0xc, 0x0, 0x65, 0x46, 0xa0, + 0xb0, 0xc, 0x9e, 0x99, 0x65, 0x46, 0xa0, 0xb0, + 0x2, 0x35, 0x3c, 0x4a, 0xa4, 0x9a, 0xa0, 0x9, + 0x97, 0x6c, 0x7, 0x50, 0xc, 0x0, 0x27, 0x78, + 0x4c, 0xe, 0x80, 0x4c, 0x0, 0x63, 0x41, 0x1a, + 0x79, 0x89, 0xc9, 0xb0, 0x0, 0x6, 0xc7, 0xb0, + 0x7, 0x70, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9AD4 "體" */ + 0x0, 0x0, 0x0, 0xb, 0xc, 0x0, 0x4, 0xec, + 0xcc, 0x6, 0xd7, 0xd6, 0x60, 0x4d, 0xa1, 0xc1, + 0x8a, 0x2b, 0x1c, 0x4, 0x79, 0x1c, 0x1c, 0xda, + 0xd9, 0xe0, 0xcd, 0xdb, 0xe8, 0xab, 0x6c, 0x5d, + 0xc, 0x0, 0x2, 0xb5, 0x55, 0x55, 0x50, 0x6e, + 0xdd, 0xc5, 0xcc, 0xcc, 0xcc, 0x43, 0x80, 0x2c, + 0x3, 0x33, 0x33, 0x20, 0x3d, 0xbb, 0xc0, 0xb6, + 0x66, 0x9a, 0x3, 0x80, 0x2c, 0xa, 0x22, 0x26, + 0xa0, 0x3d, 0xbb, 0xc0, 0x7a, 0x78, 0xd5, 0x3, + 0x80, 0x2c, 0x1, 0xa0, 0x4a, 0x0, 0x38, 0x3d, + 0x76, 0xbf, 0xbe, 0xdb, 0x60, + + /* U+9AD8 "高" */ + 0x0, 0x0, 0x0, 0x83, 0x0, 0x0, 0x0, 0x5, + 0x55, 0x55, 0xab, 0x55, 0x55, 0x50, 0x17, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x70, 0x0, 0xb, 0xbb, + 0xbb, 0xbb, 0xb1, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0xf, 0x99, 0x99, 0x99, + 0xf1, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, 0x20, + 0x0, 0x9, 0xdc, 0xcc, 0xcc, 0xcc, 0xcd, 0xa0, + 0x9, 0x40, 0x11, 0x11, 0x11, 0x4, 0xa0, 0x9, + 0x40, 0xf9, 0x99, 0x9d, 0x4, 0xa0, 0x9, 0x40, + 0xd0, 0x0, 0xd, 0x4, 0xa0, 0x9, 0x40, 0xfb, + 0xbb, 0xb9, 0x4, 0xa0, 0x9, 0x40, 0x60, 0x0, + 0x0, 0x8c, 0x60, + + /* U+9AEA "髪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0xd9, 0x99, 0x93, 0x3, 0xaa, 0x10, 0x0, 0xd9, + 0x88, 0x80, 0x87, 0x22, 0x40, 0x0, 0xd8, 0x88, + 0x80, 0x4, 0xaa, 0x20, 0xa, 0xdc, 0xab, 0xa8, + 0x57, 0x20, 0x40, 0x1, 0xb5, 0x28, 0xa0, 0x1, + 0x5c, 0x80, 0x7, 0xb9, 0x88, 0x84, 0xaa, 0x61, + 0x0, 0x5, 0x55, 0x6f, 0x65, 0x55, 0x55, 0x51, + 0x5, 0x55, 0xc9, 0x55, 0x55, 0x55, 0x50, 0x0, + 0x4, 0xfb, 0xaa, 0xaa, 0xa0, 0x0, 0x0, 0x1d, + 0x4b, 0x50, 0x1b, 0x60, 0x0, 0x3, 0xd5, 0x2, + 0xcd, 0xf6, 0x0, 0x0, 0x3d, 0x3a, 0xdb, 0x72, + 0x48, 0xcc, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9B5A "魚" */ + 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xec, 0xcd, 0xf1, 0x0, 0x0, 0x0, 0x6c, + 0x0, 0xa, 0x70, 0x0, 0x0, 0x8, 0xfd, 0xbb, + 0xcf, 0xcb, 0xb9, 0x0, 0x5c, 0xe1, 0x0, 0xb5, + 0x0, 0x2d, 0x0, 0x0, 0xd0, 0x0, 0xa4, 0x0, + 0x1d, 0x0, 0x0, 0xdc, 0xcc, 0xed, 0xcc, 0xcd, + 0x0, 0x0, 0xd0, 0x0, 0xa4, 0x0, 0x1d, 0x0, + 0x0, 0xda, 0xaa, 0xec, 0xaa, 0xbd, 0x0, 0x0, + 0x42, 0x22, 0x22, 0x22, 0x34, 0x0, 0x1, 0xd0, + 0x3a, 0x3, 0xb0, 0x2d, 0x20, 0xb, 0x60, 0x2c, + 0x0, 0xd2, 0x5, 0xd0, 0x48, 0x0, 0x9, 0x0, + 0x63, 0x0, 0x93, + + /* U+9CE5 "鳥" */ + 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0xbc, 0xeb, 0xbb, 0xb0, 0x0, 0x0, 0xb3, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xbb, 0xaa, + 0xaa, 0xaa, 0xf0, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0xbc, 0xbb, 0xbb, 0xbb, + 0xb0, 0x0, 0x0, 0xb7, 0x55, 0x55, 0x55, 0x55, + 0x50, 0x0, 0xb7, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x0, 0xbc, 0xbb, 0xbb, 0xbb, 0xbb, 0x70, 0x1, + 0x30, 0x10, 0x20, 0x41, 0x6, 0x80, 0x6, 0x71, + 0xb0, 0xb2, 0x49, 0x7, 0x70, 0xd, 0x10, 0xd0, + 0x66, 0x5, 0xa, 0x40, 0x46, 0x0, 0x50, 0x0, + 0xa, 0xcc, 0x0, + + /* U+9E97 "麗" */ + 0xa, 0xaa, 0xaa, 0x75, 0xaa, 0xaa, 0xa2, 0x5, + 0xb9, 0x9b, 0x40, 0xc9, 0x99, 0xa0, 0x6, 0x69, + 0x27, 0x50, 0xc4, 0x80, 0xc0, 0x4, 0x41, 0x45, + 0xa8, 0x80, 0x50, 0x80, 0x6, 0xc9, 0xae, 0xaa, + 0xcc, 0x99, 0x91, 0x6, 0xc9, 0xae, 0x99, 0xcc, + 0x99, 0x80, 0x6, 0x70, 0x1c, 0x0, 0x76, 0x1, + 0xc0, 0x8, 0xda, 0xae, 0xaa, 0xcc, 0xaa, 0xc0, + 0x9, 0x47, 0x60, 0x0, 0xb2, 0x4, 0x60, 0xb, + 0x27, 0xda, 0xa6, 0xbb, 0xa6, 0x20, 0x1d, 0x7, + 0x60, 0x22, 0xb2, 0x0, 0x38, 0x66, 0xd, 0xcb, + 0x84, 0x7c, 0xbb, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9EBC "麼" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x1, + 0x77, 0x77, 0x7e, 0x87, 0x77, 0x72, 0x2, 0xd5, + 0x57, 0x55, 0x55, 0x75, 0x51, 0x2, 0xb2, 0x4d, + 0x43, 0x34, 0xd4, 0x40, 0x2, 0xb4, 0x9f, 0xa5, + 0x6c, 0xfb, 0x70, 0x2, 0xb0, 0xae, 0xb4, 0x3b, + 0xdb, 0x10, 0x3, 0xb9, 0x7c, 0x7, 0xc1, 0xc2, + 0xc3, 0x3, 0xa4, 0xa, 0x6, 0x10, 0x90, 0x11, + 0x4, 0x90, 0x4, 0xa3, 0x7, 0x50, 0x0, 0x6, + 0x70, 0xce, 0x9a, 0xd6, 0x41, 0x0, 0x9, 0x40, + 0x14, 0xb9, 0x10, 0x3b, 0x0, 0xe, 0x14, 0xbe, + 0x99, 0xab, 0xbe, 0x50, 0x2a, 0x5, 0x65, 0x32, + 0x10, 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9EC4 "黄" */ + 0x0, 0x0, 0x86, 0x0, 0xe, 0x0, 0x0, 0x0, + 0xaa, 0xdc, 0xaa, 0xaf, 0xaa, 0x50, 0x0, 0x22, + 0x97, 0x22, 0x2e, 0x22, 0x10, 0x0, 0x0, 0x86, + 0x0, 0xe, 0x0, 0x0, 0x1d, 0xdd, 0xdd, 0xef, + 0xdd, 0xdd, 0xd5, 0x0, 0x0, 0x0, 0x5a, 0x0, + 0x0, 0x0, 0x0, 0x8d, 0xbb, 0xce, 0xbb, 0xbe, + 0x0, 0x0, 0x85, 0x0, 0x59, 0x0, 0xe, 0x0, + 0x0, 0x8c, 0xaa, 0xce, 0xaa, 0xae, 0x0, 0x0, + 0x85, 0x0, 0x59, 0x0, 0xe, 0x0, 0x0, 0x5b, + 0xbb, 0xbb, 0xbb, 0xba, 0x0, 0x0, 0x3, 0xa8, + 0x0, 0x2c, 0x71, 0x0, 0x7, 0xdb, 0x40, 0x0, + 0x0, 0x5c, 0xb1, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, + + /* U+9ED2 "黒" */ + 0x0, 0xac, 0xbb, 0xdd, 0xbb, 0xcc, 0x0, 0x0, + 0xa3, 0x0, 0x76, 0x0, 0x2c, 0x0, 0x0, 0xac, + 0xbb, 0xdd, 0xbb, 0xcc, 0x0, 0x0, 0xa3, 0x0, + 0x76, 0x0, 0x2c, 0x0, 0x0, 0xac, 0xcc, 0xed, + 0xcc, 0xcb, 0x0, 0x0, 0x0, 0x0, 0x76, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0xcc, 0xee, 0xcc, 0xcc, + 0x20, 0x0, 0x0, 0x0, 0x76, 0x0, 0x0, 0x0, + 0x2c, 0xcc, 0xcc, 0xdd, 0xcc, 0xcc, 0xc3, 0x0, + 0x71, 0x3, 0x1, 0x30, 0x16, 0x0, 0x3, 0xd0, + 0xd, 0x1, 0xd0, 0xb, 0x60, 0xd, 0x20, 0xd, + 0x0, 0xb3, 0x1, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+9EDE "點" */ + 0x0, 0x0, 0x0, 0x0, 0xb, 0x20, 0x0, 0xd, + 0xbd, 0xbc, 0x80, 0xb, 0x20, 0x0, 0xb, 0x58, + 0x38, 0x80, 0xb, 0x20, 0x0, 0xb, 0x88, 0x76, + 0x80, 0xb, 0x98, 0x81, 0xb, 0x38, 0x53, 0x80, + 0xb, 0x64, 0x41, 0xa, 0xbe, 0xcb, 0x60, 0xb, + 0x20, 0x0, 0x4, 0x4b, 0x64, 0x20, 0xb, 0x20, + 0x0, 0x7, 0x7d, 0x97, 0x5a, 0xdd, 0xdd, 0xe0, + 0x1, 0x2b, 0x64, 0x5a, 0x20, 0x0, 0xe0, 0x3b, + 0xa9, 0x88, 0x5a, 0x20, 0x0, 0xe0, 0x8, 0x43, + 0x86, 0x6a, 0x20, 0x0, 0xe0, 0xb, 0x37, 0x91, + 0x8a, 0xba, 0xaa, 0xe0, 0x46, 0x3, 0x0, 0xa, + 0x52, 0x22, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9EE8 "黨" */ + 0x0, 0x9, 0x20, 0x77, 0x2, 0xb0, 0x0, 0x7, + 0x8b, 0xd8, 0xcb, 0x8c, 0xb8, 0x70, 0xd, 0x33, + 0x33, 0x33, 0x33, 0x34, 0xd0, 0xa, 0x9, 0xa8, + 0x88, 0x8a, 0x90, 0x90, 0x0, 0x7, 0x98, 0x88, + 0x89, 0x60, 0x0, 0x0, 0x79, 0x99, 0x99, 0x99, + 0x98, 0x0, 0x0, 0xb1, 0x91, 0x76, 0x27, 0xd, + 0x0, 0x0, 0xb9, 0xba, 0xcb, 0xb9, 0x9d, 0x0, + 0x0, 0x55, 0x55, 0xa9, 0x55, 0x55, 0x10, 0x0, + 0x44, 0x44, 0xa9, 0x44, 0x44, 0x10, 0x1a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa1, 0x0, 0xa3, 0x8, + 0x1, 0x80, 0x2b, 0x10, 0xa, 0x70, 0xd, 0x0, + 0xc1, 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9F13 "鼓" */ + 0x0, 0x9, 0x40, 0x0, 0x1, 0xc0, 0x0, 0x2a, + 0xad, 0xca, 0x90, 0x1, 0xc0, 0x0, 0x2, 0x2a, + 0x62, 0x2b, 0xbb, 0xfb, 0xb6, 0x7, 0x8c, 0xa8, + 0x52, 0x24, 0xd2, 0x21, 0x3, 0x44, 0x44, 0x20, + 0x1, 0xc0, 0x0, 0x7, 0xbb, 0xbb, 0x49, 0xab, + 0xea, 0xa2, 0xa, 0x30, 0x8, 0x57, 0xb2, 0x23, + 0xe0, 0xa, 0x30, 0x8, 0x50, 0xe0, 0x5, 0xa0, + 0x8, 0xcc, 0xcc, 0x40, 0x97, 0xc, 0x30, 0x1, + 0x90, 0x1a, 0x0, 0x1d, 0x99, 0x0, 0x0, 0xd0, + 0x67, 0x0, 0x9, 0xf2, 0x0, 0x3, 0x99, 0xdd, + 0xc2, 0xbb, 0x7d, 0x40, 0x39, 0x75, 0x20, 0x7d, + 0x60, 0x3, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+9F3B "鼻" */ + 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x99, 0xca, 0x99, 0xc0, 0x0, 0x0, 0x1e, + 0x88, 0x88, 0x88, 0xe0, 0x0, 0x0, 0x1d, 0x44, + 0x44, 0x44, 0xe0, 0x0, 0x0, 0x1d, 0x33, 0x33, + 0x33, 0xe0, 0x0, 0x0, 0x9, 0x99, 0x99, 0x99, + 0x90, 0x0, 0x3, 0xb9, 0x99, 0xba, 0x99, 0x9b, + 0x30, 0x4, 0xc7, 0x77, 0xbb, 0x77, 0x7d, 0x30, + 0x4, 0xb5, 0x55, 0xaa, 0x55, 0x5c, 0x30, 0x1, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x2c, 0xcc, + 0xfc, 0xcc, 0xdf, 0xcc, 0xc3, 0x0, 0x8, 0x90, + 0x0, 0x1d, 0x0, 0x0, 0xa, 0xb6, 0x0, 0x0, + 0x1d, 0x0, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, 0xfb, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xd0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xdf, 0xd0, 0x0, 0xa, + 0xff, 0xff, 0xb6, 0x10, 0xed, 0x0, 0x0, 0xaf, + 0x94, 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, + 0x0, 0x0, 0x0, 0xed, 0x0, 0x0, 0xaf, 0x10, + 0x0, 0x0, 0xe, 0xd0, 0x0, 0xa, 0xf1, 0x0, + 0x0, 0x45, 0xfd, 0x0, 0x0, 0xaf, 0x10, 0x1, + 0xef, 0xff, 0xd0, 0x17, 0x9d, 0xf1, 0x0, 0x5f, + 0xff, 0xfc, 0xe, 0xff, 0xff, 0x10, 0x0, 0xaf, + 0xfd, 0x31, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x1, + 0x0, 0x3, 0xbd, 0xa3, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x50, 0x18, 0x88, 0x88, 0x88, 0x84, 0x5, 0xfa, + 0xbf, 0xdd, 0xdd, 0xdd, 0xfd, 0xaf, 0xe4, 0x7f, + 0x10, 0x0, 0x0, 0xca, 0x4e, 0xe0, 0x4f, 0x10, + 0x0, 0x0, 0xc8, 0xe, 0xfe, 0xef, 0x10, 0x0, + 0x0, 0xcf, 0xef, 0xe0, 0x3f, 0xee, 0xee, 0xee, + 0xf8, 0xe, 0xf6, 0x8f, 0x76, 0x66, 0x66, 0xeb, + 0x6f, 0xf8, 0xaf, 0x10, 0x0, 0x0, 0xcc, 0x8f, + 0xe0, 0x3f, 0x10, 0x0, 0x0, 0xc8, 0xe, 0xfc, + 0xdf, 0x65, 0x55, 0x55, 0xee, 0xcf, 0xc2, 0x5f, + 0xff, 0xff, 0xff, 0xf9, 0x2c, + + /* U+F00B "" */ + 0x57, 0x75, 0x5, 0x77, 0x77, 0x77, 0x75, 0xff, + 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xe, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0x10, 0x0, 0x11, + 0x11, 0x11, 0x10, 0xef, 0xfe, 0xe, 0xff, 0xff, + 0xff, 0xfe, 0xff, 0xff, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0x68, 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0x68, + 0x87, 0x7, 0x88, 0x88, 0x88, 0x86, 0xff, 0xff, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0xe2, 0x2d, 0x60, 0x0, 0x1, + 0xdf, 0xfe, 0x20, 0xdf, 0xf7, 0x0, 0x1d, 0xff, + 0xe2, 0x0, 0x8f, 0xff, 0x71, 0xdf, 0xfe, 0x20, + 0x0, 0x8, 0xff, 0xfe, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0x20, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x60, 0x0, + 0xb, 0xe2, 0xef, 0xf6, 0x0, 0xbf, 0xf8, 0x4f, + 0xff, 0x6b, 0xff, 0xd1, 0x4, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, 0xbf, + 0xff, 0xf6, 0x0, 0xb, 0xff, 0xdf, 0xff, 0x60, + 0xbf, 0xfd, 0x14, 0xff, 0xf5, 0xcf, 0xd1, 0x0, + 0x4f, 0xf6, 0x17, 0x10, 0x0, 0x3, 0x60, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0x21, 0xff, 0x12, 0xf7, 0x0, 0x6, 0xff, 0x61, + 0xff, 0x16, 0xff, 0x60, 0x1f, 0xf9, 0x1, 0xff, + 0x10, 0x9f, 0xf1, 0x6f, 0xe0, 0x1, 0xff, 0x10, + 0xe, 0xf6, 0xaf, 0x80, 0x1, 0xff, 0x10, 0x8, + 0xfa, 0xcf, 0x60, 0x1, 0xff, 0x10, 0x6, 0xfc, + 0xaf, 0x80, 0x0, 0xaa, 0x0, 0x8, 0xfb, 0x7f, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0xf7, 0x1f, 0xf8, + 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x7, 0xff, 0x91, + 0x0, 0x2a, 0xff, 0x70, 0x0, 0x9f, 0xff, 0xee, + 0xff, 0xf9, 0x0, 0x0, 0x5, 0xcf, 0xff, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, + 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xd6, 0xdf, + 0xff, 0xfd, 0x6d, 0x30, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x5f, 0xff, 0xff, 0xaa, 0xff, + 0xff, 0xf5, 0x1a, 0xff, 0xf4, 0x0, 0x4f, 0xff, + 0xa1, 0x3, 0xff, 0xd0, 0x0, 0xd, 0xff, 0x30, + 0x4, 0xff, 0xf0, 0x0, 0xf, 0xff, 0x40, 0x4f, + 0xff, 0xfb, 0x22, 0xbf, 0xff, 0xf4, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x9, 0xfe, 0xff, + 0xff, 0xff, 0xef, 0x90, 0x0, 0x50, 0x5e, 0xff, + 0xe5, 0x5, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x77, 0x40, 0x0, + 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x3, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xf5, 0xd, 0xf5, 0x0, + 0x0, 0x0, 0x1b, 0xfd, 0xff, 0x8d, 0xf5, 0x0, + 0x0, 0x2, 0xdf, 0xb1, 0x2d, 0xff, 0xf5, 0x0, + 0x0, 0x4f, 0xf8, 0x3e, 0xc2, 0xbf, 0xf5, 0x0, + 0x7, 0xff, 0x55, 0xff, 0xfe, 0x39, 0xfe, 0x40, + 0x9f, 0xe3, 0x8f, 0xff, 0xff, 0xf5, 0x6f, 0xf6, + 0xac, 0x2a, 0xff, 0xff, 0xff, 0xff, 0x73, 0xe6, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x6f, 0xff, 0xd7, 0x7f, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0x90, 0xd, 0xff, 0xf2, 0x0, + 0x0, 0x4f, 0xff, 0x70, 0xb, 0xff, 0xe1, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x2d, 0xff, 0xe2, 0x0, 0x0, 0x79, 0x99, + 0x82, 0xde, 0x28, 0x99, 0x97, 0xff, 0xff, 0xfb, + 0x22, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, + + /* U+F01C "" */ + 0x0, 0x6, 0xbb, 0xbb, 0xbb, 0xba, 0x30, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x6, 0xfb, 0x0, + 0x9, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, + 0x4f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, + 0xdf, 0x84, 0x42, 0x0, 0x0, 0x34, 0x4b, 0xf9, + 0xff, 0xff, 0xfd, 0x0, 0x1, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0x98, 0x8b, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, + 0x1, 0x8d, 0xff, 0xc6, 0x0, 0xef, 0x0, 0x4e, + 0xff, 0xff, 0xff, 0xe4, 0xdf, 0x4, 0xff, 0xb3, + 0x0, 0x4c, 0xff, 0xff, 0xe, 0xf9, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x6f, 0xc0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x8e, 0x50, 0x0, 0x1, 0xde, 0xee, + 0xed, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x21, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x8, 0xf8, 0xff, 0xfb, + 0xbc, 0x10, 0x0, 0x1e, 0xf4, 0xff, 0xfc, 0x10, + 0x0, 0x1, 0xdf, 0xc0, 0xfe, 0xef, 0xe8, 0x44, + 0x8e, 0xfe, 0x10, 0xfe, 0x1a, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0xfd, 0x0, 0x28, 0xbb, 0x94, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x2, 0x70, 0x0, 0x2, 0xef, 0x0, + 0x2, 0xef, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x34, 0x47, 0xff, 0xf0, + 0x0, 0x5, 0xff, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0x2, 0x20, 0xff, 0xff, + 0xff, 0xf0, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0x0, + 0xe7, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x5f, 0xff, + 0xff, 0xff, 0x8, 0x90, 0x34, 0x47, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, 0x0, + 0x0, 0x0, 0x2, 0x70, 0x0, 0x5, 0xfa, 0x0, + 0x0, 0x0, 0x2e, 0xf0, 0x0, 0x81, 0x4f, 0x60, + 0x0, 0x2, 0xef, 0xf0, 0x1, 0xdd, 0x7, 0xf0, + 0xdf, 0xff, 0xff, 0xf0, 0x32, 0x1e, 0x80, 0xf6, + 0xff, 0xff, 0xff, 0xf0, 0x8e, 0x27, 0xe0, 0xb9, + 0xff, 0xff, 0xff, 0xf0, 0xe, 0x73, 0xf1, 0x9b, + 0xff, 0xff, 0xff, 0xf0, 0x3f, 0x54, 0xf0, 0x9a, + 0xff, 0xff, 0xff, 0xf0, 0x89, 0xa, 0xc0, 0xd8, + 0x34, 0x47, 0xff, 0xf0, 0x0, 0x7f, 0x43, 0xf3, + 0x0, 0x0, 0x5f, 0xf0, 0x2, 0xf6, 0xc, 0xb0, + 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0xbf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, + + /* U+F03E "" */ + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0x32, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x7f, + 0xff, 0xfd, 0xff, 0xff, 0xfd, 0x10, 0xcf, 0xff, + 0xa0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x7, 0xff, 0xff, 0xf3, 0x5f, 0xa0, 0x0, 0x0, + 0xcf, 0xff, 0x30, 0x3, 0x0, 0x0, 0x0, 0xcf, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F043 "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x1, 0xfa, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, 0x0, 0x0, + 0xd, 0xff, 0x70, 0x0, 0x0, 0x6f, 0xff, 0xf1, + 0x0, 0x1, 0xef, 0xff, 0xfa, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, 0xe0, + 0xcf, 0xff, 0xff, 0xff, 0xf6, 0xfe, 0xbf, 0xff, + 0xff, 0xf9, 0xfd, 0x4f, 0xff, 0xff, 0xf9, 0xbf, + 0x49, 0xff, 0xff, 0xf5, 0x3f, 0xe5, 0x2e, 0xff, + 0xd0, 0x6, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x28, + 0xba, 0x60, 0x0, + + /* U+F048 "" */ + 0x4, 0x30, 0x0, 0x0, 0x31, 0x1f, 0xe0, 0x0, + 0x6, 0xf9, 0x1f, 0xe0, 0x0, 0x7f, 0xfa, 0x1f, + 0xe0, 0x9, 0xff, 0xfa, 0x1f, 0xe0, 0xaf, 0xff, + 0xfa, 0x1f, 0xeb, 0xff, 0xff, 0xfa, 0x1f, 0xff, + 0xff, 0xff, 0xfa, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x1f, 0xe6, 0xff, 0xff, 0xfa, 0x1f, 0xe0, 0x5f, + 0xff, 0xfa, 0x1f, 0xe0, 0x4, 0xff, 0xfa, 0x1f, + 0xe0, 0x0, 0x3e, 0xfa, 0xf, 0xd0, 0x0, 0x2, + 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfb, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xe6, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x91, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xf, + 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0xf, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "" */ + 0x14, 0x44, 0x20, 0x1, 0x44, 0x42, 0xd, 0xff, + 0xff, 0x10, 0xdf, 0xff, 0xf1, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0x3f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0x30, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xc0, 0x9, 0xff, 0xfc, 0x0, + + /* U+F04D "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x42, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, + + /* U+F051 "" */ + 0x2, 0x10, 0x0, 0x0, 0x42, 0xf, 0xe2, 0x0, + 0x3, 0xfb, 0xf, 0xfe, 0x30, 0x4, 0xfb, 0xf, + 0xff, 0xf4, 0x4, 0xfb, 0xf, 0xff, 0xff, 0x54, + 0xfb, 0xf, 0xff, 0xff, 0xfa, 0xfb, 0xf, 0xff, + 0xff, 0xff, 0xfb, 0xf, 0xff, 0xff, 0xff, 0xfb, + 0xf, 0xff, 0xff, 0xd6, 0xfb, 0xf, 0xff, 0xfd, + 0x14, 0xfb, 0xf, 0xff, 0xc1, 0x4, 0xfb, 0xf, + 0xfb, 0x0, 0x4, 0xfb, 0xc, 0xa0, 0x0, 0x3, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x1, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x3, 0x99, 0x99, 0x99, 0x99, 0x99, 0x50, 0x5, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd1, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0x90, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x3f, + 0xfd, 0x10, 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, + 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xe0, 0x0, 0x0, + 0x0, 0xa4, 0x0, + + /* U+F054 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcd, 0x10, 0x0, + 0x0, 0x1f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, + 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x10, 0x0, 0x0, + 0x3f, 0xfd, 0x10, 0x0, 0x0, 0x3f, 0xfd, 0x0, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x8, 0xff, 0x90, 0x0, 0x8, 0xff, 0x90, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x0, 0x7, 0x80, + 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, + 0x6, 0x99, 0x9a, 0xff, 0xc9, 0x99, 0x80, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1, 0x11, 0x3f, 0xf7, + 0x11, 0x10, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xd3, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x69, 0x99, 0x99, 0x99, 0x99, 0x98, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x1, 0x56, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbf, 0xfe, 0xef, 0xf9, 0x10, 0x0, + 0x0, 0x7f, 0xfa, 0x10, 0x3, 0xdf, 0xe4, 0x0, + 0x8, 0xff, 0xa0, 0x9, 0xb4, 0x1e, 0xff, 0x50, + 0x4f, 0xff, 0x20, 0xb, 0xff, 0x26, 0xff, 0xe1, + 0xef, 0xff, 0x9, 0xcf, 0xff, 0x63, 0xff, 0xfa, + 0xbf, 0xff, 0x9, 0xff, 0xff, 0x54, 0xff, 0xf6, + 0x1e, 0xff, 0x51, 0xdf, 0xfb, 0x9, 0xff, 0xb0, + 0x3, 0xef, 0xe2, 0x4, 0x30, 0x5f, 0xfc, 0x10, + 0x0, 0x2c, 0xff, 0x95, 0x6a, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x49, 0xdf, 0xfd, 0x92, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf5, 0x0, 0x14, 0x66, 0x40, + 0x0, 0x0, 0x0, 0x4, 0xef, 0xac, 0xff, 0xef, + 0xff, 0x91, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xa1, + 0x0, 0x4d, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x9f, + 0xf5, 0xab, 0x31, 0xef, 0xf4, 0x0, 0x7, 0xb1, + 0x5, 0xff, 0xff, 0xe1, 0x7f, 0xfe, 0x10, 0xf, + 0xfe, 0x30, 0x2d, 0xff, 0xf5, 0x4f, 0xff, 0x90, + 0xc, 0xff, 0xe0, 0x0, 0xaf, 0xf6, 0x5f, 0xff, + 0x60, 0x2, 0xff, 0xf4, 0x0, 0x6, 0xff, 0xef, + 0xfb, 0x0, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x3e, + 0xff, 0xc0, 0x0, 0x0, 0x2, 0xdf, 0xe8, 0x54, + 0x1, 0xbf, 0xe3, 0x0, 0x0, 0x0, 0x5, 0xae, + 0xff, 0x60, 0x7, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa1, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfc, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfb, 0x0, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xc0, + 0xf, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xfd, + 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0xdf, 0xff, + 0xe0, 0x2f, 0xff, 0xfa, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0x9b, 0xff, 0xff, 0xf3, 0x0, 0x1f, 0xff, + 0xff, 0xb0, 0xe, 0xff, 0xff, 0xc0, 0xa, 0xff, + 0xff, 0xfe, 0x24, 0xff, 0xff, 0xff, 0x60, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x6, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x30, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x80, 0xdd, 0xdb, + 0x0, 0x0, 0x8d, 0xef, 0xf8, 0xff, 0xff, 0xb0, + 0x7, 0xff, 0xff, 0xfd, 0x55, 0x6f, 0xf4, 0x6f, + 0xf8, 0xaf, 0xe2, 0x0, 0x5, 0x74, 0xff, 0x90, + 0x7e, 0x20, 0x0, 0x0, 0x3f, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xb2, 0x50, 0x4a, 0x0, + 0x1, 0x2e, 0xfd, 0x1d, 0xf4, 0x8f, 0xb0, 0xff, + 0xff, 0xd1, 0xb, 0xff, 0xff, 0xfb, 0xff, 0xfe, + 0x20, 0x0, 0xcf, 0xff, 0xfb, 0x12, 0x21, 0x0, + 0x0, 0x2, 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x8, 0xff, 0x95, 0xff, + 0xb0, 0x0, 0x8, 0xff, 0x90, 0x5, 0xff, 0xb0, + 0x7, 0xff, 0x90, 0x0, 0x5, 0xff, 0xb0, 0x9f, + 0x90, 0x0, 0x0, 0x5, 0xfd, 0x0, 0x40, 0x0, + 0x0, 0x0, 0x3, 0x10, + + /* U+F078 "" */ + 0x4c, 0x20, 0x0, 0x0, 0x0, 0xb6, 0xb, 0xfe, + 0x20, 0x0, 0x0, 0xcf, 0xf0, 0x2e, 0xfe, 0x20, + 0x0, 0xcf, 0xf4, 0x0, 0x2e, 0xfe, 0x20, 0xcf, + 0xf4, 0x0, 0x0, 0x2e, 0xfe, 0xcf, 0xf4, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x13, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf3, 0x8, 0xbb, 0xbb, 0xbb, + 0x90, 0x0, 0xb, 0xff, 0xff, 0x39, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x8f, 0xcf, 0xcf, 0xf0, 0x0, + 0x0, 0xa, 0xf1, 0x0, 0x38, 0x2f, 0x94, 0x80, + 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, 0x90, + 0x0, 0x0, 0x0, 0xa, 0xf1, 0x0, 0x0, 0x2f, + 0x90, 0x0, 0x0, 0x3, 0xa, 0xf1, 0x30, 0x0, + 0x2f, 0x90, 0x0, 0x0, 0x1f, 0xcb, 0xf8, 0xf8, + 0x0, 0x2f, 0xeb, 0xbb, 0xbb, 0x39, 0xff, 0xff, + 0xe2, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xb0, 0x9f, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xd1, 0x0, + + /* U+F07B "" */ + 0x37, 0x88, 0x87, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0xcc, 0xcc, 0xb6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x1, 0x1c, 0xff, 0xc1, 0x10, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x79, 0x99, + 0x3b, 0xff, 0xb3, 0x99, 0x97, 0xff, 0xff, 0xb2, + 0x44, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xb3, 0xcf, 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xca, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xc7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xef, 0xf3, 0x0, 0x0, 0x4a, 0x30, 0x2, + 0xdf, 0xf8, 0x0, 0x5, 0xdf, 0xfe, 0x15, 0xef, + 0xfb, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x2, 0xba, 0x85, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x4, 0x86, 0x0, 0x0, 0x0, 0x10, 0x6, 0xff, + 0xfa, 0x0, 0x2, 0xdf, 0xd1, 0xef, 0x3c, 0xf1, + 0x1, 0xdf, 0xfa, 0xe, 0xe0, 0xaf, 0x21, 0xdf, + 0xfa, 0x0, 0x9f, 0xef, 0xf6, 0xdf, 0xfa, 0x0, + 0x0, 0x8d, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x48, 0xef, + 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xfb, 0xff, + 0xf6, 0x0, 0xe, 0xf3, 0xcf, 0x23, 0xff, 0xf6, + 0x0, 0xee, 0xa, 0xf2, 0x4, 0xff, 0xf6, 0x9, + 0xfe, 0xfc, 0x0, 0x4, 0xff, 0xf1, 0x8, 0xda, + 0x10, 0x0, 0x2, 0x62, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xf9, 0x87, 0x0, 0x0, 0x8, 0xff, + 0xff, 0x98, 0xf7, 0x8, 0xa6, 0x8f, 0xff, 0xf9, + 0x59, 0x90, 0xff, 0xa8, 0xff, 0xff, 0xfc, 0xcc, + 0xf, 0xfa, 0x8f, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfa, 0x8f, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xa8, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0xfa, 0x8f, 0xff, 0xff, 0xff, + 0xf1, 0xff, 0xa8, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0xfa, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xe3, + 0x12, 0x22, 0x22, 0x21, 0xf, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0xac, 0xcc, 0xcc, 0xcb, 0x50, + 0x0, 0x0, + + /* U+F0C7 "" */ + 0x49, 0x99, 0x99, 0x99, 0x95, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0xfd, 0x22, 0x22, + 0x22, 0x4f, 0xf6, 0xf, 0xc0, 0x0, 0x0, 0x1, + 0xff, 0xf3, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x6f, 0xc0, 0x0, 0x0, 0x2, 0xff, 0xf6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, + 0xdc, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xb0, 0x5, + 0xff, 0xff, 0x6f, 0xff, 0xf6, 0x0, 0xf, 0xff, + 0xf6, 0xff, 0xff, 0xc0, 0x6, 0xff, 0xff, 0x6f, + 0xff, 0xff, 0xed, 0xff, 0xff, 0xf6, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x10, + + /* U+F0C9 "" */ + 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xde, + 0xee, 0xee, 0xee, 0xee, 0xee, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0E0 "" */ + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc1, 0xd2, 0x8f, 0xff, 0xff, + 0xff, 0xf8, 0x2d, 0xff, 0x64, 0xef, 0xff, 0xfe, + 0x45, 0xff, 0xff, 0xfa, 0x2b, 0xff, 0xb2, 0xaf, + 0xff, 0xff, 0xff, 0xd3, 0x55, 0x3d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, + 0xf0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, 0x6, + 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0x30, + 0x0, 0xa, 0xff, 0xff, 0xaa, 0xa6, 0xc, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xe1, + 0xb, 0xdd, 0xdf, 0xff, 0x60, 0x0, 0x0, 0x4f, + 0xfd, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0xbf, 0xa0, 0x0, 0x0, 0x0, 0xff, 0x10, + 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x0, 0x3, + 0xc0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0x55, + 0xef, 0xb5, 0x52, 0x0, 0x0, 0xff, 0xfd, 0x1f, + 0xff, 0xb0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0xff, 0xff, 0x53, 0x33, 0x20, 0x0, + 0xf, 0xff, 0x97, 0xff, 0xfb, 0x57, 0x0, 0xff, + 0xf8, 0xaf, 0xff, 0xc6, 0xf8, 0xf, 0xff, 0x8a, + 0xff, 0xfc, 0x4a, 0xa1, 0xff, 0xf8, 0xaf, 0xff, + 0xe3, 0x22, 0xf, 0xff, 0x8a, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xf8, 0xaf, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0x8a, 0xff, 0xff, 0xff, 0xf4, 0x35, 0x52, + 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xfe, 0x20, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8f, + 0xfa, 0x30, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x2, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x8, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa2, 0x0, + 0x0, 0x0, + + /* U+F11C "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xfc, 0xc, 0x30, 0xe1, 0x1d, 0xd, 0x11, 0xfc, + 0xfc, 0xb, 0x30, 0xe0, 0x1d, 0xd, 0x10, 0xfc, + 0xff, 0xfe, 0xff, 0xef, 0xfe, 0xfe, 0xef, 0xfc, + 0xff, 0xf1, 0x5a, 0x8, 0x70, 0xa0, 0x5f, 0xfc, + 0xff, 0xf3, 0x7b, 0x29, 0x92, 0xc2, 0x7f, 0xfc, + 0xff, 0xbf, 0xcb, 0xbb, 0xbb, 0xbf, 0xcb, 0xfc, + 0xfc, 0xb, 0x20, 0x0, 0x0, 0xd, 0x0, 0xfc, + 0xff, 0xcf, 0xcc, 0xcc, 0xcc, 0xcf, 0xcc, 0xfb, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdf, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x18, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x29, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3b, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x4, 0x9a, 0xaa, 0xaf, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xb3, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x35, 0x55, 0x55, 0x2, 0x0, 0xf, 0xff, 0xff, + 0xf2, 0xf4, 0x0, 0xff, 0xff, 0xff, 0x2f, 0xf4, + 0xf, 0xff, 0xff, 0xf2, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0x32, 0x22, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8a, 0xaa, 0xaa, + 0xaa, 0xaa, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x24, 0x55, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xaf, 0xff, 0xff, 0xff, 0xc7, + 0x0, 0x0, 0x2, 0xbf, 0xff, 0xfe, 0xde, 0xff, + 0xff, 0xf6, 0x0, 0x5f, 0xff, 0xb5, 0x10, 0x0, + 0x3, 0x8e, 0xff, 0xb0, 0xdf, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf5, 0x18, 0x0, 0x5, + 0xae, 0xfe, 0xc8, 0x10, 0x4, 0x60, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x95, 0x34, 0x7d, 0xff, 0x40, 0x0, + 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x77, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x96, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xda, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x2c, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x21, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x27, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F241 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x22, 0x21, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x66, 0x63, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F242 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x22, 0x10, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x66, 0x50, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F243 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x12, 0x22, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x5f, 0xff, 0x30, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x5f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x5f, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x26, + 0x66, 0x10, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F244 "" */ + 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xba, + 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf7, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xfa, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xfa, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0xfe, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xb1, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa9, 0x3d, 0xf5, + 0x0, 0x0, 0x0, 0x4, 0x40, 0x2, 0xe0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0xb, 0x60, + 0x0, 0x0, 0x0, 0x6c, 0x30, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xaf, 0xf9, + 0x0, 0xc, 0x50, 0x0, 0x0, 0x6d, 0x40, 0x5, + 0x50, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc4, 0x3e, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xef, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x7, + 0xef, 0xff, 0xb3, 0x0, 0x0, 0xaf, 0xfd, 0x8f, + 0xff, 0x20, 0x4, 0xff, 0xfd, 0x9, 0xff, 0xb0, + 0xa, 0xfe, 0xfd, 0x12, 0xaf, 0xf0, 0xe, 0xf5, + 0x5d, 0x2c, 0xe, 0xf3, 0xf, 0xff, 0x33, 0x12, + 0x9f, 0xf5, 0xf, 0xff, 0xf3, 0x7, 0xff, 0xf6, + 0xf, 0xff, 0xe2, 0x6, 0xff, 0xf6, 0xf, 0xfe, + 0x24, 0x13, 0x7f, 0xf5, 0xd, 0xf5, 0x7d, 0x2c, + 0xd, 0xf3, 0xa, 0xff, 0xfd, 0x11, 0xbf, 0xf0, + 0x3, 0xff, 0xfe, 0xb, 0xff, 0xa0, 0x0, 0x7f, + 0xfe, 0xbf, 0xfe, 0x10, 0x0, 0x3, 0xac, 0xdc, + 0x81, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x34, 0x43, 0x0, 0x0, 0x5, 0x66, + 0x7f, 0xff, 0xf9, 0x66, 0x50, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x35, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x50, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc4, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x2f, + 0xf3, 0xfb, 0x7f, 0x6d, 0xf6, 0x2, 0xff, 0x2f, + 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf2, 0xfb, 0x7f, + 0x5d, 0xf6, 0x2, 0xff, 0x2f, 0xb7, 0xf5, 0xdf, + 0x60, 0x2f, 0xf2, 0xfb, 0x7f, 0x5d, 0xf6, 0x2, + 0xff, 0x2f, 0xb7, 0xf5, 0xdf, 0x60, 0x2f, 0xf3, + 0xfb, 0x7f, 0x6d, 0xf6, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x7, 0xbc, 0xcc, 0xcc, 0xcc, + 0x90, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x4, 0x39, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x39, 0xff, 0xa0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0x39, 0xb0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xa8, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, 0x87, + 0x40, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x3e, 0xff, 0xff, 0xcf, 0xff, + 0xcf, 0xff, 0xf7, 0x3, 0xef, 0xff, 0xf9, 0x8, + 0xf8, 0x9, 0xff, 0xf8, 0x3e, 0xff, 0xff, 0xfe, + 0x20, 0x40, 0x2e, 0xff, 0xf8, 0xdf, 0xff, 0xff, + 0xff, 0xe1, 0x1, 0xef, 0xff, 0xf8, 0x9f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8f, 0xff, 0xf8, 0x9, + 0xff, 0xff, 0xf9, 0x2, 0xc2, 0x9, 0xff, 0xf8, + 0x0, 0x9f, 0xff, 0xfe, 0x4e, 0xfe, 0x4e, 0xff, + 0xf8, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xff, 0xff, 0xe2, 0x3, 0xfb, 0xfb, 0xce, 0xbf, + 0xa4, 0xff, 0x1d, 0x3, 0xa1, 0xfa, 0xff, 0xf1, + 0xd0, 0x3a, 0x1f, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x29, 0xaa, 0xaa, + 0xaa, 0xa8, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xf1, 0x0, + 0x8, 0x20, 0x0, 0x0, 0x1, 0xff, 0x10, 0xb, + 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf1, 0xc, 0xff, + 0x94, 0x44, 0x44, 0x45, 0xff, 0x1b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf1, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0x7f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+FF08 "(" */ + 0x0, 0xb, 0x10, 0x9, 0x70, 0x2, 0xd0, 0x0, + 0x95, 0x0, 0xe, 0x0, 0x1, 0xd0, 0x0, 0x2b, + 0x0, 0x1, 0xc0, 0x0, 0xe, 0x0, 0x0, 0xb3, + 0x0, 0x5, 0xa0, 0x0, 0xc, 0x30, 0x0, 0x2d, + 0x10, 0x0, 0x20, + + /* U+FF09 ")" */ + 0x1b, 0x0, 0x0, 0x79, 0x0, 0x0, 0xd2, 0x0, + 0x5, 0x90, 0x0, 0xe, 0x0, 0x0, 0xd1, 0x0, + 0xb, 0x20, 0x0, 0xc1, 0x0, 0xe, 0x0, 0x3, + 0xb0, 0x0, 0xa5, 0x0, 0x3c, 0x0, 0x1d, 0x20, + 0x0, 0x20, 0x0, + + /* U+FF0C "," */ + 0x0, 0x4, 0xf6, 0x2c, 0xa0, 0x77, 0x6b, 0x4, + 0x0, + + /* U+FF11 "1" */ + 0x0, 0x1, 0x30, 0x0, 0x7, 0xcf, 0xe0, 0x0, + 0x1, 0x26, 0xe0, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x4, 0xe0, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x4, 0xe0, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x4, 0xe0, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x4f, 0xff, 0xff, 0xfe, + + /* U+FF12 "2" */ + 0x0, 0x2, 0x20, 0x0, 0x3, 0xde, 0xde, 0x50, + 0x3e, 0x30, 0x4, 0xf1, 0x1, 0x0, 0x0, 0xd5, + 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x5, 0xd0, + 0x0, 0x0, 0x2f, 0x40, 0x0, 0x2, 0xe6, 0x0, + 0x0, 0x3e, 0x60, 0x0, 0x5, 0xe4, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xfe +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 50, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 70, .box_w = 3, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 17, .adv_w = 102, .box_w = 5, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 27, .adv_w = 123, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 71, .adv_w = 123, .box_w = 7, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120, .adv_w = 205, .box_w = 13, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 192, .adv_w = 150, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 247, .adv_w = 60, .box_w = 2, .box_h = 4, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 251, .adv_w = 74, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 281, .adv_w = 74, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 311, .adv_w = 103, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 326, .adv_w = 123, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 358, .adv_w = 60, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 366, .adv_w = 77, .box_w = 5, .box_h = 1, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 369, .adv_w = 60, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 371, .adv_w = 88, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 413, .adv_w = 123, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 452, .adv_w = 123, .box_w = 6, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 485, .adv_w = 123, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 524, .adv_w = 123, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 563, .adv_w = 123, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 607, .adv_w = 123, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 646, .adv_w = 123, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 690, .adv_w = 123, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 734, .adv_w = 123, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 778, .adv_w = 123, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 817, .adv_w = 60, .box_w = 2, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 825, .adv_w = 60, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 842, .adv_w = 123, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 870, .adv_w = 123, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 886, .adv_w = 123, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 914, .adv_w = 105, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 947, .adv_w = 209, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1032, .adv_w = 135, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1082, .adv_w = 146, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1126, .adv_w = 142, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1176, .adv_w = 153, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1220, .adv_w = 131, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1259, .adv_w = 122, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1298, .adv_w = 153, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1348, .adv_w = 162, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1392, .adv_w = 64, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1403, .adv_w = 119, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1442, .adv_w = 143, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1486, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1525, .adv_w = 180, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1575, .adv_w = 161, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1619, .adv_w = 165, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1674, .adv_w = 140, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1718, .adv_w = 165, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1783, .adv_w = 140, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1827, .adv_w = 132, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1871, .adv_w = 133, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1915, .adv_w = 160, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1959, .adv_w = 127, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2003, .adv_w = 195, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2069, .adv_w = 126, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2113, .adv_w = 117, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2157, .adv_w = 135, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2201, .adv_w = 74, .box_w = 4, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2229, .adv_w = 88, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2271, .adv_w = 74, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2299, .adv_w = 123, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 2320, .adv_w = 125, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2324, .adv_w = 135, .box_w = 4, .box_h = 4, .ofs_x = 2, .ofs_y = 9}, + {.bitmap_index = 2332, .adv_w = 125, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2360, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2399, .adv_w = 113, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2427, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2471, .adv_w = 123, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2503, .adv_w = 71, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2533, .adv_w = 125, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2577, .adv_w = 135, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2616, .adv_w = 60, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2627, .adv_w = 60, .box_w = 4, .box_h = 14, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2655, .adv_w = 121, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2694, .adv_w = 62, .box_w = 3, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2711, .adv_w = 206, .box_w = 11, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2755, .adv_w = 136, .box_w = 7, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2783, .adv_w = 135, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2815, .adv_w = 138, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2854, .adv_w = 138, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2898, .adv_w = 85, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2918, .adv_w = 104, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2942, .adv_w = 83, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2967, .adv_w = 135, .box_w = 7, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2995, .adv_w = 114, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3023, .adv_w = 177, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3067, .adv_w = 109, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3095, .adv_w = 115, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3134, .adv_w = 105, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3162, .adv_w = 74, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3197, .adv_w = 59, .box_w = 2, .box_h = 16, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3213, .adv_w = 74, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3248, .adv_w = 123, .box_w = 8, .box_h = 2, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 3256, .adv_w = 224, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3269, .adv_w = 224, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3282, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3348, .adv_w = 224, .box_w = 5, .box_h = 10, .ofs_x = 9, .ofs_y = 2}, + {.bitmap_index = 3373, .adv_w = 224, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3398, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3453, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3531, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3581, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3647, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3712, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 3762, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3834, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3912, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4003, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4094, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4160, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4245, .adv_w = 224, .box_w = 9, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4304, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4369, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4447, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4532, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4587, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4665, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4737, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4815, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4875, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4935, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5013, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5098, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5176, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5267, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5339, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5411, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5489, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5574, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5646, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5691, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5751, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5842, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5914, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5986, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6051, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6129, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6214, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6286, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6364, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6449, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6521, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6599, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6684, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6769, .adv_w = 224, .box_w = 13, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6841, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6926, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7004, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7088, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7172, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7256, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7326, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7403, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7473, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7551, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7636, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7721, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7787, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7865, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7937, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8009, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8081, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8142, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8227, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8277, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8361, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8411, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8483, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 8548, .adv_w = 224, .box_w = 9, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 8607, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8673, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8764, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8836, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8921, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8993, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9077, .adv_w = 224, .box_w = 10, .box_h = 9, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 9122, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9194, .adv_w = 224, .box_w = 11, .box_h = 10, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9249, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9315, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9387, .adv_w = 224, .box_w = 11, .box_h = 9, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9437, .adv_w = 224, .box_w = 13, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9502, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9574, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9640, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9725, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9803, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9888, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9966, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10057, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10129, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10220, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10275, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10353, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10431, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10522, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10594, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10679, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10751, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10842, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10920, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11011, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11077, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11155, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11246, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11318, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11368, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11440, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11512, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11597, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 11645, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 11693, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11771, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 11831, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11909, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11969, .adv_w = 224, .box_w = 12, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12029, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12120, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12204, .adv_w = 224, .box_w = 9, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 12254, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 12332, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 12404, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 12464, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12555, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12640, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12717, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12787, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12865, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12956, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13041, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13107, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 13167, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13245, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13317, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13383, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 13444, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13529, .adv_w = 224, .box_w = 10, .box_h = 8, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13569, .adv_w = 224, .box_w = 8, .box_h = 9, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 13605, .adv_w = 224, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 13660, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13732, .adv_w = 224, .box_w = 8, .box_h = 12, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 13780, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13858, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 13924, .adv_w = 224, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13974, .adv_w = 224, .box_w = 12, .box_h = 11, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 14040, .adv_w = 224, .box_w = 11, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 14106, .adv_w = 224, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14167, .adv_w = 224, .box_w = 12, .box_h = 2, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 14179, .adv_w = 224, .box_w = 14, .box_h = 2, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 14193, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14284, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14375, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14473, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14550, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14641, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14725, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14809, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14900, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14984, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15068, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15152, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15243, .adv_w = 224, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 15315, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15406, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15504, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15602, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15693, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15791, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15882, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 15980, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16071, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 16143, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16234, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16325, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16416, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16486, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16570, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16661, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16752, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16850, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16948, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17039, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17130, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17235, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17333, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17424, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17515, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17613, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17711, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17809, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17914, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18012, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18103, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18201, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18299, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18390, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18488, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18579, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18677, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18775, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18866, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18957, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19048, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19139, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19230, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19321, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19419, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19510, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19601, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19699, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19804, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19895, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19986, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20084, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20175, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20266, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20371, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20469, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20560, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20658, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20756, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20847, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20945, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21036, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21127, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21212, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21303, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21401, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21499, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21597, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21702, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21800, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21898, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21989, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22080, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22178, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22269, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22367, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22458, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22563, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22661, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22759, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22857, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22955, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23046, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23137, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23235, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23333, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23431, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23529, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23627, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23725, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23823, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23921, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 23999, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24097, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24188, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24279, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24377, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24475, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24573, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24664, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24755, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24833, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 24905, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24989, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25073, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 25151, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25229, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25327, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25425, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25516, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25614, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25712, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 25790, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25888, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25973, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26058, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26149, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26240, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26331, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26422, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26513, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26604, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26702, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26800, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26898, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26989, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27080, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27185, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27269, .adv_w = 224, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27359, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27450, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27541, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 27625, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27723, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27814, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27912, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28003, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28101, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28199, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28304, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28409, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28507, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28605, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28703, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28801, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 28892, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 28990, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29081, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 29159, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 29231, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29322, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29413, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29504, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29595, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29686, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29784, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29882, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 29973, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30071, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 30143, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30234, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30325, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30409, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30507, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30598, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30696, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30794, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30878, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30962, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 31053, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31144, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31235, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31333, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 31405, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 31496, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31587, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31672, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31763, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 31841, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 31925, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32010, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32108, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32199, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32290, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32362, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32447, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32538, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32629, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32701, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32786, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32864, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32948, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 33026, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 33111, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 33202, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 33287, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33372, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 33457, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 33548, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 33639, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 33724, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 33815, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 33887, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33978, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34069, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34160, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 34245, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34323, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 34414, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34505, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 34596, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34687, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 34765, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 34849, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 34927, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 35012, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35090, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 35181, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35272, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35344, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35416, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35488, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35560, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35632, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35704, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35776, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35848, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35920, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 35992, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 36083, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 36174, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 36265, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 36356, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36454, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36559, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 36650, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 36741, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 36839, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36937, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37028, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37126, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37224, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37329, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37427, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37532, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37630, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37721, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37812, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 37903, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37994, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38085, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38183, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38288, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 38372, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 38450, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 38548, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 38633, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38731, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38829, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 38920, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39011, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39109, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 39200, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39298, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39396, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 39487, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39585, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 39676, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39774, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39879, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39984, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40075, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 40160, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40258, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 40349, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40447, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40552, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 40650, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40755, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40853, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40951, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41049, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41140, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41238, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 41343, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41441, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41539, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41623, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41708, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41799, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41890, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41981, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42079, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42177, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42268, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 42346, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42437, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 42522, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42613, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 42704, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42802, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 42880, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 42958, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43056, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 43141, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43232, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43330, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43428, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43519, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 43597, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43702, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43793, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43884, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43982, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44080, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 44158, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44256, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44347, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44438, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44529, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44627, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44718, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 44816, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44914, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45012, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45103, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45201, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45292, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45390, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45481, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 45559, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45657, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45762, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45846, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 45924, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46015, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46093, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46184, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46275, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46359, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46450, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 46535, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 46626, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46717, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46808, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46906, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 46983, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47074, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47165, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 47243, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 47321, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47419, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47510, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 47601, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47692, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 47777, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47875, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47973, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48071, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 48162, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48253, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 48331, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 48416, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48500, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48591, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48682, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48780, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48871, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48969, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49067, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49165, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49263, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 49354, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49445, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49543, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49648, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49753, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49858, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49956, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 50047, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 50138, .adv_w = 224, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 50215, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 50300, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50385, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50483, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50581, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 50659, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50757, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 50848, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50946, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51031, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51122, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51220, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51318, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51409, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51500, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51598, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51689, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51780, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51871, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51956, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52047, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52138, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52229, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52320, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52411, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52509, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52600, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 52685, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52776, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52867, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52951, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 53036, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53127, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53225, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53316, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53400, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53491, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53582, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53673, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53764, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53855, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53939, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54030, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54128, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54226, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54324, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54409, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54507, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54612, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54703, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54801, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54899, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54990, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55095, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55193, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55291, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55382, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55480, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55571, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55669, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55767, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55865, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55963, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56061, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56159, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56257, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56342, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56440, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56538, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56629, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56720, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56811, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56916, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 57014, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 57112, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57217, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 57308, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57406, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 57504, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57602, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57700, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57805, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57903, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 57994, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58092, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58190, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58288, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 58379, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58477, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58575, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 58666, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58764, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58869, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58967, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 59058, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59156, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59254, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59352, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 59443, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59541, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 59632, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 59723, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59821, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59919, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60017, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60115, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 60206, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 60297, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60395, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60500, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 60598, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 60689, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 60774, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60872, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60970, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61068, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61173, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61271, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61369, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61467, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 61527, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61611, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61695, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 61780, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61871, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 61949, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62034, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62125, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62209, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 62300, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62391, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 62476, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62567, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62651, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 62736, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 62827, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62918, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 63002, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 63087, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 63172, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 63257, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 63341, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 63426, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 63511, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63602, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 63680, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 63758, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63849, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 63940, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 64018, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64109, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64193, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64284, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64362, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64453, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64538, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64629, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64720, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64811, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64902, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64993, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65084, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65175, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65266, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65364, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65462, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65560, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65665, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65756, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65847, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65938, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66029, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66120, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66211, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66302, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66386, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66477, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66568, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66659, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66750, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66848, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66946, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67051, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67149, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67247, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67360, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67458, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67549, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67640, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67738, .adv_w = 224, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67836, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67934, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68039, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68144, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68235, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68326, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68417, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68515, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68606, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68697, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68788, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68879, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 68977, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 69068, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69173, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69278, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 69369, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69467, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69565, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69663, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69761, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 69846, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69951, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 70042, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 70126, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70224, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70322, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70420, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 70511, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70609, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 70700, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70791, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70882, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 70973, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71071, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71169, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71260, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71358, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71456, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71554, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 71639, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 71724, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 71809, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 71900, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71998, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72096, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72194, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72285, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72376, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72474, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72565, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72663, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72761, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72859, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72944, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73035, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73133, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73218, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73309, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73407, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73498, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73596, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73694, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73785, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73883, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73968, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74059, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74157, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74255, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74346, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74437, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74535, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74620, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74711, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74802, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74900, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74991, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75082, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75180, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75278, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75383, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75481, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75579, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 75670, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75761, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 75852, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 75950, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76048, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 76139, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76237, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 76328, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76426, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76531, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76629, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 76720, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76818, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76916, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77014, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77105, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77203, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77301, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77406, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77497, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77588, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77686, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77777, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77862, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77953, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 78044, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78149, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 78240, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 78331, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78429, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78534, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78639, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78737, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78835, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 78926, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79024, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79122, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79213, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79311, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79409, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79493, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79584, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79675, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79766, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79857, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79962, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80060, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80145, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 80217, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 80295, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 80373, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 80458, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80543, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 80621, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 80693, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 80784, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 80869, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80960, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 81051, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81142, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 81220, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81318, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 81409, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 81500, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81598, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81696, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 81761, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 81845, .adv_w = 224, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 81935, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 82013, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 82090, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82181, .adv_w = 224, .box_w = 10, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 82241, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82332, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82423, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82514, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82605, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 82690, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82768, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82859, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82950, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83048, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83132, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83223, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83314, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83412, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83503, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83587, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83685, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83776, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83867, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83965, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84056, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84147, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84238, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84336, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84427, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84518, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84609, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84700, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84798, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 84896, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84987, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85078, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85176, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85274, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 85352, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85443, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85534, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85625, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85716, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85814, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85912, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86010, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86108, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86199, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86297, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86388, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86479, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86577, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86662, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86753, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86844, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86935, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87026, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87124, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87222, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 87307, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87398, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87489, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87587, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87678, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87763, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87854, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87952, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 88043, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88141, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 88239, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 88330, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 88421, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88519, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 88610, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88708, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88806, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 88897, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 88982, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 89073, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 89171, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 89262, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 89353, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89451, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 89549, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 89640, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89745, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89850, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 89941, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90039, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90144, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90242, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90347, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90431, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90522, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90613, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 90685, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90776, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90874, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90965, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 91049, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 91133, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91211, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91309, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 91400, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91498, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 91596, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91680, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 91771, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91869, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 91960, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92058, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92156, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 92254, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92352, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92450, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92548, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92646, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92737, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92835, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92933, .adv_w = 224, .box_w = 10, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 92998, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93082, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93173, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93278, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93376, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93474, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93572, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93670, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93768, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 93852, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93943, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94034, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94125, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94216, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94307, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94405, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94496, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94594, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94685, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94776, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94867, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94958, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 95049, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 95140, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 95231, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 95322, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95420, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95518, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95616, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95714, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95819, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95917, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96008, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96099, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96190, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96281, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96386, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96484, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96568, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96659, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96750, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96848, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96946, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97044, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97142, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97240, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97338, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 97422, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97520, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97625, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 97716, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 97814, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97912, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98017, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98115, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 98206, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98304, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98402, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 98493, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98591, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98689, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 98780, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 98878, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 98969, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99067, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99158, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99256, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99347, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99445, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99543, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99634, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99732, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99830, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99935, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100026, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100117, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100208, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100313, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100411, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100509, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100607, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100698, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100796, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100901, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100999, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101097, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101202, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101300, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101398, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 101489, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101587, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 101678, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101776, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101874, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101972, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 102063, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102161, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102259, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102350, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102448, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102546, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102644, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102742, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102840, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102938, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 103029, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 103120, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 103211, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103309, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103407, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103505, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103603, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103701, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103792, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103883, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 103974, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104072, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104163, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104254, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104352, .adv_w = 224, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104450, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104555, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104653, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104744, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104842, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104940, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 105031, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105129, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105227, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105325, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105423, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 105514, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105612, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105710, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105808, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105906, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106004, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106102, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106200, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106298, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106396, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106494, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106592, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106690, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106788, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106886, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106984, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107082, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107180, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107278, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107369, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107467, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 107551, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107649, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107747, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107845, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107943, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108041, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108146, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108244, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108342, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108440, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108538, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108629, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108727, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 108818, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 108909, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109007, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109105, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109196, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109294, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109392, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109483, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109574, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109665, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109749, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109847, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109945, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110043, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110134, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110232, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110330, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110428, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110519, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110610, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 110688, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 110766, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 110844, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 110916, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 110988, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 111066, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111150, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111248, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 111333, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111424, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111515, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111606, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 111691, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111776, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111867, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 111958, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 112043, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 112134, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 112225, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112316, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112407, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112512, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112603, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112701, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112799, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112890, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112974, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 113046, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113137, .adv_w = 224, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 113215, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113306, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113397, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 113488, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113586, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 113684, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 113768, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 113859, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113964, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 114062, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 114153, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 114244, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114335, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114433, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114531, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114629, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114727, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114825, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114916, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115014, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115105, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115203, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115301, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115392, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115483, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115581, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115679, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115784, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 115869, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 115960, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 116051, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116149, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116240, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116338, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116436, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116534, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 116619, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 116710, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116808, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 116899, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 116990, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117081, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117179, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117277, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117368, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117466, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117564, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117662, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 117753, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 117866, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 117943, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 118034, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 118111, .adv_w = 154, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 118166, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118271, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118376, .adv_w = 252, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 118480, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118585, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 118673, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118778, .adv_w = 112, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 118820, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 118886, .adv_w = 252, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118998, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 119075, .adv_w = 154, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119150, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 119220, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119318, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119403, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119488, .adv_w = 196, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 119558, .adv_w = 196, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 119649, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119708, .adv_w = 140, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119767, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119852, .adv_w = 196, .box_w = 13, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 119878, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 119966, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120101, .adv_w = 252, .box_w = 17, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 120229, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 120320, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 120372, .adv_w = 196, .box_w = 13, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 120424, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 120523, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 120600, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120705, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 120818, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 120903, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121001, .adv_w = 196, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 121086, .adv_w = 196, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 121164, .adv_w = 224, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 121241, .adv_w = 140, .box_w = 10, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 121316, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121414, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121512, .adv_w = 252, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 121600, .adv_w = 224, .box_w = 16, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 121720, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121803, .adv_w = 280, .box_w = 18, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 121920, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 122010, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 122100, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 122190, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 122280, .adv_w = 280, .box_w = 18, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 122370, .adv_w = 280, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 122478, .adv_w = 196, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122568, .adv_w = 196, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122666, .adv_w = 224, .box_w = 15, .box_h = 15, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 122779, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 122878, .adv_w = 168, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122961, .adv_w = 225, .box_w = 15, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 123036, .adv_w = 224, .box_w = 5, .box_h = 14, .ofs_x = 9, .ofs_y = -2}, + {.bitmap_index = 123071, .adv_w = 224, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123106, .adv_w = 224, .box_w = 3, .box_h = 6, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 123115, .adv_w = 224, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 123159, .adv_w = 224, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1, 0x4, 0xb, 0xc, 0x40, 0x41, 0x42, + 0x43, 0x45, 0x46, 0x47 +}; + +static const uint8_t glyph_id_ofs_list_4[] = { + 0, 0, 0, 1, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 5, 6, 0, 7, + 8, 9, 0, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 0, + 30, 31, 32, 0, 33, 34, 0, 35, + 36, 37, 38, 39, 40, 0, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 0, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 0, + 65, 66, 67, 68, 69, 70, 71 +}; + +static const uint16_t unicode_list_5[] = { + 0x0, 0x4, 0x7, 0xd, 0x1d11, 0x1d14, 0x1d18, 0x1d19, + 0x1d1a, 0x1d1b, 0x1d1c, 0x1d1e, 0x1d24, 0x1d25, 0x1d27, 0x1d32, + 0x1d37, 0x1d3e, 0x1d4c, 0x1d56, 0x1d5c, 0x1d5f, 0x1d60, 0x1d68, + 0x1d6e, 0x1d70, 0x1d97, 0x1d99, 0x1d9a, 0x1d9c, 0x1d9d, 0x1da5, + 0x1dac, 0x1db2, 0x1db5, 0x1db7, 0x1dbd, 0x1dcb, 0x1dd1, 0x1ddb, + 0x1ddc, 0x1dde, 0x1de6, 0x1de7, 0x1de9, 0x1df4, 0x1df5, 0x1df6, + 0x1dff, 0x1e07, 0x1e0c, 0x1e0e, 0x1e12, 0x1e1b, 0x1e22, 0x1e2b, + 0x1e2e, 0x1e49, 0x1e4d, 0x1e57, 0x1e5e, 0x1e5f, 0x1e60, 0x1e64, + 0x1e66, 0x1e6a, 0x1e6d, 0x1e71, 0x1e90, 0x1e97, 0x1e9c, 0x1eac, + 0x1eae, 0x1eb2, 0x1ed0, 0x1ed3, 0x1eee, 0x1ef2, 0x1eff, 0x1f1c, + 0x1f22, 0x1f2a, 0x1f30, 0x1f35, 0x1f4d, 0x1f6b, 0x1f6d, 0x1f76, + 0x1f85, 0x1faa, 0x1fc4, 0x1fd6, 0x1fde, 0x1fe0, 0x1fe6, 0x200a, + 0x2015, 0x203b, 0x2050, 0x2054, 0x2055, 0x2056, 0x2059, 0x205a, + 0x205c, 0x205e, 0x2063, 0x206b, 0x2076, 0x2078, 0x2079, 0x207a, + 0x207c, 0x207d, 0x207e, 0x2082, 0x2087, 0x2088, 0x2096, 0x2097, + 0x209b, 0x209e, 0x20aa, 0x20ac, 0x20bd, 0x20c8, 0x20de, 0x20ee, + 0x20f7, 0x210b, 0x2117, 0x2118, 0x211b, 0x2128, 0x212e, 0x2135, + 0x2136, 0x213a, 0x2141, 0x2147, 0x2149, 0x214c, 0x2158, 0x215b, + 0x215e, 0x216c, 0x2183, 0x2186, 0x2194, 0x21ac, 0x21b0, 0x21b1, + 0x21b9, 0x21ba, 0x21bb, 0x21c4, 0x21da, 0x21e6, 0x21ea, 0x21ee, + 0x21f5, 0x2206, 0x2216, 0x2227, 0x2228, 0x224c, 0x2251, 0x2252, + 0x2254, 0x2259, 0x225b, 0x2263, 0x2265, 0x2268, 0x2269, 0x2282, + 0x2284, 0x228c, 0x22ab, 0x22b0, 0x22c4, 0x22cc, 0x22d3, 0x22d4, + 0x22d9, 0x22db, 0x22dc, 0x22de, 0x22e7, 0x22e8, 0x22f4, 0x22f5, + 0x22f6, 0x22f7, 0x22fb, 0x22fc, 0x2300, 0x2301, 0x2303, 0x2304, + 0x2308, 0x2309, 0x2314, 0x2315, 0x2319, 0x231d, 0x231e, 0x2322, + 0x2337, 0x2338, 0x2351, 0x235b, 0x2373, 0x2379, 0x2384, 0x238d, + 0x238e, 0x239d, 0x23c3, 0x23d2, 0x23f2, 0x23fb, 0x2457, 0x245b, + 0x2460, 0x2477, 0x2495, 0x249a, 0x24ad, 0x24ae, 0x24bf, 0x24c7, + 0x24df, 0x2500, 0x252c, 0x25c5, 0x25ec, 0x25ef, 0x25f1, 0x2601, + 0x2604, 0x260e, 0x261c, 0x261e, 0x2623, 0x2629, 0x2630, 0x2634, + 0x2639, 0x2641, 0x2658, 0x265b, 0x2661, 0x269c, 0x26f0, 0x2708, + 0x270b, 0x2742, 0x2745, 0x275b, 0x277a, 0x2794, 0x27a8, 0x27af, + 0x27db, 0x27e4, 0x27fc, 0x2801, 0x2803, 0x281a, 0x2820, 0x2826, + 0x2827, 0x282b, 0x282d, 0x2831, 0x2838, 0x283a, 0x283b, 0x283c, + 0x283f, 0x2842, 0x2858, 0x2862, 0x2868, 0x2884, 0x288a, 0x288e, + 0x2893, 0x2898, 0x28c4, 0x28ca, 0x28cc, 0x28da, 0x28dc, 0x28e1, + 0x28e5, 0x2929, 0x296b, 0x2977, 0x29a3, 0x29ce, 0x29dd, 0x2a1a, + 0x2a61, 0x2a68, 0x2a69, 0x2a74, 0x2a77, 0x2a7a, 0x2a7c, 0x2a89, + 0x2a94, 0x2a96, 0x2a98, 0x2a99, 0x2a9a, 0x2a9d, 0x2aa9, 0x2aaa, + 0x2aab, 0x2aaf, 0x2ab0, 0x2ab3, 0x2ab5, 0x2ac4, 0x2ac6, 0x2ac7, + 0x2aca, 0x2ad0, 0x2ad5, 0x2ad7, 0x2add, 0x2ae3, 0x2aee, 0x2af0, + 0x2af7, 0x2afc, 0x2b0b, 0x2b0f, 0x2b15, 0x2b18, 0x2b19, 0x2b1e, + 0x2b1f, 0x2b20, 0x2b22, 0x2b2b, 0x2b35, 0x2b42, 0x2b4b, 0x2b51, + 0x2b56, 0x2b5b, 0x2b5c, 0x2b66, 0x2b76, 0x2b7d, 0x2b82, 0x2c07, + 0x2c5d, 0x2cee, 0x2cef, 0x2cf6, 0x2cf7, 0x2cff, 0x2d02, 0x2d03, + 0x2d13, 0x2d14, 0x2d19, 0x2d1d, 0x2d3c, 0x2d3e, 0x2d40, 0x2d41, + 0x2d44, 0x2d47, 0x2d49, 0x2d56, 0x2d84, 0x2d85, 0x2d89, 0x2d8f, + 0x2d94, 0x2d97, 0x2da6, 0x2da8, 0x2dad, 0x2db7, 0x2db8, 0x2dbc, + 0x2dbe, 0x2dc8, 0x2df1, 0x2e0b, 0x2e10, 0x2e20, 0x2e26, 0x2e30, + 0x2e42, 0x2e46, 0x2e48, 0x2e64, 0x2e73, 0x2e82, 0x2e8a, 0x2e8d, + 0x2e91, 0x2e96, 0x2e99, 0x2e9c, 0x2e9d, 0x2ea3, 0x2ea4, 0x2ea8, + 0x2eaf, 0x2eb2, 0x2eba, 0x2ed4, 0x2ed6, 0x2ee9, 0x2eea, 0x2efc, + 0x2f06, 0x2f1f, 0x2f23, 0x2f26, 0x2f2e, 0x2f36, 0x2f38, 0x2f80, + 0x2fb9, 0x2fbb, 0x2fc3, 0x2fd6, 0x3004, 0x3019, 0x3020, 0x302b, + 0x302c, 0x3030, 0x305c, 0x3074, 0x3078, 0x307f, 0x30da, 0x3109, + 0x3121, 0x3122, 0x3127, 0x3137, 0x3141, 0x314c, 0x3150, 0x3151, + 0x315c, 0x315e, 0x3164, 0x3166, 0x318f, 0x3191, 0x319b, 0x31a6, + 0x31cd, 0x31d6, 0x31da, 0x31ec, 0x31f2, 0x31fd, 0x31fe, 0x3210, + 0x3212, 0x3218, 0x322a, 0x3266, 0x3279, 0x3299, 0x32a3, 0x32ac, + 0x32b2, 0x32b3, 0x32b6, 0x32b8, 0x32b9, 0x32e0, 0x32e1, 0x32ec, + 0x32ff, 0x330b, 0x334b, 0x33d2, 0x33d8, 0x33e5, 0x33eb, 0x3440, + 0x344a, 0x344f, 0x3450, 0x3456, 0x3459, 0x3468, 0x346a, 0x3473, + 0x3481, 0x3485, 0x3498, 0x34aa, 0x34be, 0x34c1, 0x34c8, 0x34ca, + 0x34cd, 0x34ce, 0x34d2, 0x34d6, 0x34e0, 0x34f3, 0x34f6, 0x34f7, + 0x34fa, 0x3507, 0x3518, 0x351f, 0x3524, 0x3525, 0x3530, 0x3531, + 0x3536, 0x3539, 0x3540, 0x354d, 0x3553, 0x357a, 0x357f, 0x3580, + 0x3585, 0x358b, 0x3598, 0x35a2, 0x35a7, 0x35a8, 0x35d8, 0x35ed, + 0x3603, 0x3605, 0x3609, 0x360f, 0x3610, 0x3611, 0x3614, 0x3619, + 0x361a, 0x361c, 0x361e, 0x362c, 0x362e, 0x3630, 0x3639, 0x363b, + 0x363c, 0x363d, 0x363e, 0x364b, 0x3661, 0x3662, 0x3670, 0x3672, + 0x3676, 0x3680, 0x3682, 0x36a1, 0x36a8, 0x36ad, 0x36e1, 0x36f6, + 0x3702, 0x370c, 0x3710, 0x3722, 0x3732, 0x373b, 0x374a, 0x374d, + 0x3754, 0x3759, 0x37ae, 0x37c1, 0x37ff, 0x381e, 0x382d, 0x386b, + 0x387e, 0x3886, 0x388e, 0x3893, 0x38dc, 0x38e9, 0x3913, 0x392a, + 0x3932, 0x3934, 0x393b, 0x394a, 0x395c, 0x3970, 0x3a32, 0x3a43, + 0x3a5d, 0x3a61, 0x3a72, 0x3a73, 0x3a74, 0x3a75, 0x3a76, 0x3a7a, + 0x3a80, 0x3a83, 0x3a84, 0x3a88, 0x3a8c, 0x3a9b, 0x3a9c, 0x3ac6, + 0x3ade, 0x3adf, 0x3ae0, 0x3ae5, 0x3aec, 0x3b20, 0x3b22, 0x3b25, + 0x3b28, 0x3b45, 0x3b48, 0x3b49, 0x3b53, 0x3b6b, 0x3b71, 0x3b8b, + 0x3b99, 0x3ba3, 0x3bca, 0x3bcc, 0x3bd2, 0x3bdb, 0x3be6, 0x3bf3, + 0x3bf4, 0x3bf9, 0x3c04, 0x3c1c, 0x3c28, 0x3c43, 0x3c4c, 0x3c4f, + 0x3c52, 0x3c56, 0x3c85, 0x3c88, 0x3c99, 0x3ccd, 0x3d02, 0x3d08, + 0x3d16, 0x3d18, 0x3d19, 0x3d1a, 0x3d2c, 0x3d32, 0x3d3a, 0x3d40, + 0x3d67, 0x3da1, 0x3da7, 0x3dae, 0x3e10, 0x3e33, 0x3e49, 0x3ed4, + 0x3ef0, 0x3f74, 0x3f7c, 0x3f8e, 0x3fca, 0x3fcb, 0x4032, 0x4047, + 0x406a, 0x40c2, 0x40f0, 0x413e, 0x4147, 0x4149, 0x4158, 0x416c, + 0x4171, 0x417a, 0x418a, 0x41bd, 0x41c0, 0x41c7, 0x41d1, 0x41fd, + 0x41fe, 0x423c, 0x4250, 0x4283, 0x42ba, 0x430f, 0x4314, 0x4317, + 0x43c1, 0x4429, 0x442b, 0x4430, 0x4433, 0x4434, 0x4439, 0x4441, + 0x4442, 0x4444, 0x4446, 0x4448, 0x444b, 0x444c, 0x445d, 0x446a, + 0x447b, 0x447c, 0x4481, 0x4487, 0x44c3, 0x44d6, 0x44ec, 0x458b, + 0x458d, 0x458e, 0x458f, 0x4595, 0x4597, 0x45d0, 0x45e8, 0x45ff, + 0x4605, 0x4609, 0x461c, 0x4630, 0x4631, 0x464f, 0x4651, 0x46f6, + 0x46fe, 0x4704, 0x4713, 0x4725, 0x4745, 0x47cb, 0x484b, 0x484d, + 0x484f, 0x4867, 0x486e, 0x486f, 0x487e, 0x4892, 0x48d1, 0x48d2, + 0x48dc, 0x48de, 0x48e2, 0x48e9, 0x490c, 0x491c, 0x493f, 0x495e, + 0x4987, 0x498b, 0x49a4, 0x49dc, 0x49ea, 0x49f6, 0x4a00, 0x4a22, + 0x4a37, 0x4a3d, 0x4a57, 0x4a5a, 0x4a65, 0x4a67, 0x4aa8, 0x4ab2, + 0x4ad1, 0x4ad5, 0x4b32, 0x4b84, 0x4bcf, 0x4be7, 0x4c0c, 0x4c11, + 0x4c15, 0x4c2a, 0x4c31, 0x4c41, 0x4c4a, 0x4c53, 0x4c55, 0x4c5d, + 0x4c61, 0x4c72, 0x4c77, 0x4c82, 0x4c86, 0x4ca4, 0x4cab, 0x4cbe, + 0x4cc3, 0x4ce2, 0x4ce3, 0x4ceb, 0x4cf1, 0x4cfa, 0x4d05, 0x4d4e, + 0x4d4f, 0x4d65, 0x4d81, 0x4d8d, 0x4d9d, 0x4df0, 0x4e4b, 0x4e7f, + 0x4e9f, 0x4eba, 0x4ee3, 0x4f12, 0x4f14, 0x4f16, 0x4f1d, 0x4f44, + 0x4f6f, 0x4f80, 0x4f83, 0x4f88, 0x4f8e, 0x4f9a, 0x4fba, 0x4fc0, + 0x4fc3, 0x4fdd, 0x5009, 0x500e, 0x5042, 0x505b, 0x5066, 0x5077, + 0x5081, 0x50ae, 0x50da, 0x50fb, 0x5104, 0x510b, 0x5118, 0x5119, + 0x511a, 0x513b, 0x513d, 0x514a, 0x5180, 0x5183, 0x5193, 0x51c2, + 0x51f6, 0x51f7, 0x5202, 0x5247, 0x5288, 0x52e4, 0x52ed, 0x534e, + 0x535a, 0x5368, 0x5446, 0x5495, 0x54bd, 0x54ee, 0x5518, 0x5566, + 0x575d, 0x5764, 0x5779, 0x57bc, 0x57e0, 0x57ed, 0x57f2, 0x580e, + 0x5818, 0x5890, 0x5892, 0x589c, 0x58a0, 0x58a7, 0x58ab, 0x58bb, + 0x58cb, 0x58d1, 0x58e3, 0x58f4, 0x58f7, 0x5911, 0x5919, 0x591b, + 0x591f, 0x5924, 0x5929, 0x593b, 0x593e, 0x5942, 0x5944, 0x5945, + 0x5966, 0x5977, 0x5982, 0x5983, 0x5984, 0x599d, 0x599e, 0x59a6, + 0x59a9, 0x59af, 0x59bb, 0x59bd, 0x59be, 0x59c1, 0x59c3, 0x59d0, + 0x59d8, 0x59dc, 0x59e7, 0x5a09, 0x5a13, 0x5a2c, 0x5a2e, 0x5a69, + 0x5a81, 0x5a88, 0x5a9b, 0x5aa4, 0x5ab2, 0x5aef, 0x5b61, 0x5b72, + 0x5bb1, 0x5bb2, 0x5bb8, 0x5bba, 0x5bbd, 0x5bc8, 0x5bc9, 0x5bcc, + 0x5bd0, 0x5bd4, 0x5bd8, 0x5bfb, 0x5c0e, 0x5c4a, 0x5c75, 0x5c81, + 0x5c88, 0x5c96, 0x5c9b, 0x5cb4, 0x5cc4, 0x5cf0, 0x5d00, 0x5dbc, + 0x5ddb, 0x5df0, 0x5df3, 0x5e0e, 0x5e14, 0x5e1a, 0x5e26, 0x5e3b, + 0x5e49, 0x5eac, 0x5eaf, 0x5eb7, 0x5ec3, 0x5ecb, 0x5ecd, 0x5edf, + 0x5ee2, 0x5ee5, 0x5efc, 0x5f0e, 0x5f11, 0x5f12, 0x5f14, 0x5f20, + 0x5f21, 0x5f2a, 0x5f2b, 0x5f30, 0x5f31, 0x5f34, 0x5f3f, 0x5f42, + 0x5f43, 0x5f56, 0x5f5b, 0x5f5c, 0x5f5f, 0x5f64, 0x5f65, 0x5f66, + 0x5f71, 0x5f7a, 0x5f89, 0x5f90, 0x5f95, 0x5f9b, 0x5fb4, 0x5fbb, + 0x5ff9, 0x6006, 0x600e, 0x605e, 0x6063, 0x6065, 0x6089, 0x60bc, + 0x60de, 0x60df, 0x60e0, 0x60e2, 0x60ee, 0x6155, 0x616c, 0x6191, + 0x6233, 0x6240, 0x6243, 0x6488, 0x649a, 0x649c, 0x64a4, 0x64b3, + 0x64ed, 0x6501, 0x6544, 0x6555, 0x655e, 0x6561, 0x6573, 0x6575, + 0x6589, 0x658e, 0x659f, 0x65ac, 0x65ad, 0x65b4, 0x65b9, 0x65cc, + 0x65d7, 0x65e2, 0x65e7, 0x65ea, 0x65f3, 0x65f4, 0x65f9, 0x65fb, + 0x6603, 0x660c, 0x6611, 0x6618, 0x6663, 0x666a, 0x666f, 0x6673, + 0x667a, 0x6685, 0x6704, 0x6710, 0x6714, 0x6716, 0x6719, 0x6728, + 0x6729, 0x673e, 0x674d, 0x675d, 0x6765, 0x6769, 0x676f, 0x6780, + 0x67b9, 0x67ec, 0x67f0, 0x6800, 0x6803, 0x6839, 0x68a7, 0x68aa, + 0x68d5, 0x68d6, 0x6923, 0x6924, 0x6968, 0x69e5, 0x69e9, 0x69fb, + 0x6a6b, 0x6bf6, 0x6da8, 0x6dcd, 0x6dd5, 0x6de3, 0x6def, 0x6df9, + 0x6e24, 0x6e4c, 0xbf12, 0xbf19, 0xbf1c, 0xbf1d, 0xbf1e, 0xbf22, + 0xbf24, 0xbf26, 0xbf2a, 0xbf2d, 0xbf32, 0xbf37, 0xbf38, 0xbf39, + 0xbf4f, 0xbf54, 0xbf59, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf62, 0xbf63, + 0xbf64, 0xbf65, 0xbf78, 0xbf79, 0xbf7f, 0xbf81, 0xbf82, 0xbf85, + 0xbf88, 0xbf89, 0xbf8a, 0xbf8c, 0xbfa4, 0xbfa6, 0xbfd5, 0xbfd6, + 0xbfd8, 0xbfda, 0xbff1, 0xbff8, 0xbffb, 0xc004, 0xc02d, 0xc035, + 0xc06c, 0xc0fc, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc198, + 0xc1a4, 0xc1fe, 0xc215, 0xc46b, 0xc6d3, 0xc7b3, 0xce19, 0xce1a, + 0xce1d, 0xce22, 0xce23 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12289, .range_length = 72, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 12, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 12362, .range_length = 24, .glyph_id_start = 108, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12387, .range_length = 43, .glyph_id_start = 132, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12431, .range_length = 95, .glyph_id_start = 175, + .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_4, .list_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL + }, + { + .range_start = 12527, .range_length = 52772, .glyph_id_start = 247, + .unicode_list = unicode_list_5, .glyph_id_ofs_list = NULL, .list_length = 1187, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 0, 1, 0, 0, 0, 0, + 1, 2, 0, 0, 0, 3, 4, 3, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 6, 0, 0, 0, + 0, 0, 7, 8, 9, 10, 11, 12, + 13, 0, 0, 14, 15, 16, 0, 0, + 10, 17, 10, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 2, 27, 0, 0, + 0, 0, 28, 29, 30, 0, 31, 32, + 33, 34, 0, 0, 35, 36, 34, 34, + 29, 29, 37, 38, 39, 40, 37, 41, + 42, 43, 44, 45, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 46, 47, 48, + 49, 50, 0, 51, 0, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 0, + 62, 63, 0, 64, 65, 0, 66, 67, + 67, 68, 69, 0, 70, 71, 72, 73, + 74, 75, 76, 0, 77, 78, 79, 80, + 81, 82, 82, 83, 0, 84, 85, 86, + 86, 87, 88, 89, 0, 0, 90, 91, + 79, 0, 67, 92, 93, 94, 0, 95, + 0, 96, 97, 98, 99, 100, 0, 101, + 0, 102, 58, 103, 0, 104, 105, 0, + 0, 106, 107, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 0, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 0, + 134, 135, 136, 137, 138, 0, 139, 0, + 140, 141, 142, 115, 0, 0, 0, 0, + 143, 0, 144, 145, 0, 46, 146, 147, + 0, 148, 149, 150, 151, 152, 0, 153, + 154, 0, 155, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 0, 0, 0, + 2, 0, 3, 4, 0, 5, 6, 7, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 10, 0, 0, 0, + 11, 0, 12, 0, 13, 0, 0, 0, + 13, 0, 0, 14, 0, 0, 0, 0, + 13, 0, 13, 0, 15, 16, 17, 18, + 19, 20, 21, 22, 0, 23, 3, 0, + 0, 0, 24, 0, 25, 25, 25, 26, + 27, 0, 28, 29, 0, 0, 30, 30, + 25, 30, 25, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 0, 0, 3, 0, + 39, 40, 0, 0, 0, 0, 41, 42, + 43, 44, 45, 0, 46, 47, 48, 49, + 50, 51, 52, 0, 0, 53, 53, 53, + 53, 0, 0, 54, 55, 56, 56, 57, + 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 0, 0, 0, 69, + 70, 71, 71, 72, 72, 72, 73, 74, + 75, 76, 76, 76, 0, 0, 0, 77, + 78, 0, 0, 79, 80, 81, 82, 0, + 83, 84, 0, 85, 86, 87, 88, 0, + 71, 0, 89, 90, 91, 92, 93, 94, + 95, 0, 96, 96, 0, 0, 97, 98, + 0, 99, 100, 100, 101, 102, 103, 103, + 104, 105, 106, 106, 107, 108, 109, 106, + 89, 110, 111, 112, 113, 114, 115, 106, + 116, 117, 118, 119, 120, 0, 0, 0, + 121, 122, 123, 124, 125, 0, 0, 0, + 126, 127, 128, 129, 0, 130, 131, 132, + 0, 0, 133, 0, 134, 135, 0, 0, + 136, 0, 137, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 138, + 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 0, 0, 0, -28, 0, -28, 0, + 0, 0, 0, -13, 0, -23, -2, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -23, 0, -33, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -25, -5, -16, -8, 0, + -22, 0, 0, 0, -3, 0, 0, 0, + 6, 0, 0, -11, 0, -8, -5, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -4, -11, 0, -5, + -2, -6, -16, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, -2, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, -2, -20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + -8, 0, -2, 7, 7, 0, 0, 3, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, -24, + 0, 0, 0, 0, 0, 0, -6, -2, + -2, 0, 0, -13, -4, -3, 0, 1, + -3, -2, -10, 6, 0, -2, 0, 0, + 0, 0, 6, -3, -2, -2, -1, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -3, -6, 0, -1, + -1, -1, -3, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, -3, + -2, -2, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, -7, -2, -6, -4, + -3, -1, -1, -1, -2, -2, 0, 0, + 0, 0, -5, 0, 0, 0, 0, -6, + -2, -3, -2, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, -4, 0, 0, 0, -2, 0, -9, + 0, -6, 0, -2, -2, -4, -5, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, -6, 0, -2, 0, -7, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -17, 0, -17, -18, 0, 0, + 0, -9, -2, -35, -5, 0, 0, 1, + 1, -6, 1, -8, 0, -8, -3, 0, + -6, 0, 0, -5, -5, -2, -4, -4, + -4, -6, -4, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + 0, 0, 0, -1, 0, 0, 0, -5, + 0, -3, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -6, 0, + -6, 0, 0, 0, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, -10, + 0, -6, 0, 0, 0, 0, -2, -2, + -5, 0, -2, -4, -3, -3, -2, 0, + -4, 0, 0, 0, -2, 0, 0, 0, + -2, 0, 0, -8, -4, -4, -4, -4, + -4, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -20, + 0, -37, 0, -14, 0, 0, 0, 0, + -7, 1, -6, 0, -5, -30, -7, -19, + -14, 0, -19, 0, -20, 0, -3, -3, + -1, 0, 0, 0, 0, -5, -2, -8, + -8, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -27, -9, -27, -20, + 0, 0, 0, -13, 0, -37, -2, -6, + 0, 0, 0, -6, -2, -20, 0, -11, + -6, 0, -8, 0, 0, 0, -2, 0, + 0, 0, 0, -3, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, -8, + 0, 0, 0, 0, 0, -1, 0, -4, + -3, -3, 0, 2, 2, -1, 0, -2, + 0, -1, -2, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, -3, -3, -5, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -26, -18, -26, -23, -5, -5, + 0, -10, -6, -32, -10, 0, 0, 0, + 0, -5, -3, -14, 0, -18, -16, -4, + -18, 0, 0, -12, -15, -4, -12, -9, + -9, -10, -9, -19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -4, -8, + 0, 0, 0, -4, 0, -11, -2, 0, + 0, -1, 0, -2, -3, 0, 0, -1, + 0, 0, -2, 0, 0, 0, -1, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -16, -5, + -16, -12, 0, 0, 0, -3, -2, -18, + -2, 0, -2, 2, 0, 0, 0, -5, + 0, -5, -4, 0, -5, 0, 0, -5, + -3, 0, -8, -2, -2, -4, -2, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, -2, -8, -8, 0, 0, 0, 0, + -2, -17, -2, 0, 0, 0, 0, 0, + 0, -2, 0, -4, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, -2, 0, -6, 0, 0, 0, 0, + 0, 1, -4, 0, -3, -5, -2, 0, + 0, 0, 0, 0, 0, -2, -2, -4, + 0, 0, 0, 0, 0, -4, -2, -4, + -3, -2, -4, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -22, -16, -22, -17, + -6, -6, -2, -3, -3, -25, -4, -3, + -2, 0, 0, 0, 0, -7, 0, -17, + -10, 0, -15, 0, 0, -10, -10, -6, + -8, -3, -6, -8, -3, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -9, + 0, 0, 0, 0, 0, -2, -5, -9, + -8, 0, -2, -2, -2, 0, -3, -4, + 0, -4, -6, -5, -4, 0, 0, 0, + 0, -3, -6, -4, -4, -6, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -22, -8, -13, -8, 0, + -18, 0, 0, 0, 0, 0, 9, 0, + 18, 0, 0, 0, 0, -5, -2, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -14, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -6, 0, -4, + -1, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, -7, -2, 2, -2, 0, + 0, 0, -2, 0, 0, 0, 0, -14, + 0, -5, 0, -1, -11, 0, -6, -4, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, -1, -1, -4, -1, -1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -3, 0, 0, -6, 0, + 0, -2, -5, 0, -2, 0, 0, 0, + 0, -2, 0, 2, 2, 2, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -9, + 0, 2, 0, 0, 0, 0, -2, 0, + 0, -5, -5, -6, 0, -4, -2, 0, + -6, 0, -4, -4, 0, 0, -2, 0, + 0, 0, 0, -2, 0, 2, 2, -2, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 10, + 13, 0, -12, -3, -12, -4, 0, 0, + 7, 0, 0, 0, 0, 12, 0, 17, + 12, 9, 15, 0, 17, -5, -2, 0, + -4, 0, -2, 0, -1, 0, 0, 4, + 0, -1, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, -9, 0, 0, 0, 13, + 0, 0, -9, 0, 0, 0, 0, -6, + 0, 0, 0, 0, -3, 0, 0, -4, + -3, 0, 0, 0, 9, 0, 0, 0, + 0, -1, -1, 0, 4, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, -6, 0, -2, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 4, -10, 4, 0, 4, 4, -2, 0, + 0, 0, 0, -8, 0, 0, 0, 0, + -3, 0, 0, -2, -4, 0, -2, 0, + -2, 0, 0, -5, -3, 0, 0, -2, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -3, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -13, -6, + -13, -9, 7, 7, 0, -3, 0, -13, + 0, 0, 0, 0, 0, 0, 0, -2, + 4, -6, -2, 0, -2, 0, 0, 0, + -1, 0, 0, 7, 5, 0, 7, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 2, 0, 0, 0, 0, -2, 0, + 0, 0, 0, -6, 0, -2, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, -6, 2, 3, 4, 4, + -6, 0, 0, 0, 0, -3, 0, 0, + 0, 0, -1, 0, 0, -5, -3, 0, + -2, 0, 0, 0, -2, -5, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -8, -2, -8, -5, + 0, 0, 0, -3, 0, -10, 0, -5, + 0, -2, 0, 0, -3, -2, 0, -5, + -1, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -9, 0, + -9, -2, 0, 0, 0, -1, 0, -8, + 0, -6, 0, -2, 0, -3, -6, 0, + 0, -2, -1, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, -6, + 2, -3, -2, 0, 0, 2, 0, 0, + -2, 0, -1, -9, 0, -4, 0, -2, + -8, 0, 0, -2, -4, 0, 0, 0, + 0, 0, 0, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, -8, -4, 0, 0, + 0, 0, 0, -10, 0, -5, 0, -1, + 0, -1, -2, 0, 0, -5, -1, 0, + 0, 0, -2, 0, 0, 0, 0, 0, + 0, -3, 0, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, 0, 0, 0, -8, 0, 0, -6, + -2, 0, -2, 0, 0, 0, 0, 0, + -2, -1, 0, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, -7, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, -7, -11, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, -4, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -16, -11, 0, -9, 0, -4, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -11, -11, 0, -4, 0, 0, + -4, 0, 0, 0, 0, 0, 4, 4, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, -7, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -16, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -4, 0, 0, 0, + 0, 0, -16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, -4, 0, 0, 0, 0, 0, + 0, -13, -13, -7, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, -22, 0, -4, + 0, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 0, 0, 2, 2, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + -4, -16, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 0, 0, 0, 0, 0, + 0, -16, -20, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -16, -22, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -16, 0, 0, 0, + 0, 0, 0, -16, -16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -11, -7, + -7, 0, 0, 0, 0, -7, 0, 0, + -7, -7, -7, -7, 0, 0, 0, 0, + -7, 0, 0, 0, -13, -4, -4, 0, + 0, 0, 0, 0, 0, -4, -4, 0, + 0, 0, 0, 0, -11, 0, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, -9, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, -7, -7, 0, -7, 0, 0, 0, + -7, -9, -9, -7, -7, 0, 0, -7, + -2, 0, 0, 0, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, -11, 0, 0, + 0, 0, 0, 0, 0, 0, -7, -7, + -7, -7, -7, 0, 0, 0, -7, 0, + 0, 0, 0, -7, -7, -4, -4, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, -11, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, -4, -4, -4, 2, 2, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -16, -16, -11, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, -9, 0, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -9, + -9, -9, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + -9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + -4, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, -9, 0, -9, -9, -4, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -9, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -7, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -4, -7, -7, 0, + 0, 0, 0, 0, 0, 0, 2, 2, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, -11, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -22, -22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -7, 0, + 0, 0, 0, 0, -7, -4, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -11, + 0, 0, 0, 0, -11, -11, 0, 0, + 0, 0, -9, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + -20, -9, -9, -4, 0, 0, 0, -4, + -4, 0, -4, -16, -11, 0, 0, 0, + 0, -2, 0, -9, -13, -22, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, -4, -4, + 0, 0, 0, 0, 0, -7, -7, 0, + 0, -9, -9, 0, -4, 0, 0, 0, + -4, 0, 0, -4, -4, -4, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -20, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, -9, -9, 0, 0, 0, 0, + 0, -7, -4, 0, 0, -9, -9, 0, + 0, 0, 0, 0, 0, 0, -13, -11, + -11, -11, 0, 0, 0, 0, 0, 0, + 0, -18, -9, 0, 0, 0, 0, -7, + 0, 0, 0, -20, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -16, -18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, -20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -4, 0, 0, + 0, 0, -13, -9, -9, -9, 0, 0, + 0, -7, -7, 0, -7, -16, -7, 0, + 0, 0, 0, 0, -4, -7, 0, -22, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -18, -18, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -4, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -4, -4, -4, + 0, 0, 0, 0, 0, 0, -2, -11, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, -16, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, -20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -9, -9, -9, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -18, -16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -4, 0, 0, 0, 0, 0, 0, 0, + -4, -13, -13, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, -16, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -16, -16, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -11, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, -2, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -11, -11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -9, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -9, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 4, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -11, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -13, -13, + -13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -18, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -18, -4, + -4, -4, 0, 0, 0, 0, 0, 0, + 0, -7, -4, 0, 0, 0, 0, 0, + 0, 0, 0, -16, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, -4, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, -2, -2, -2, + 0, 0, 0, 0, 0, 0, 0, -7, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -13, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -11, -2, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -11, 0, + 0, 0, -7, -7, -7, 0, 0, 0, + 0, -4, -7, 0, 0, 0, 0, 0, + 0, 0, 0, -11, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, -13, 0, 0, 0, + 0, 0, 0, 0, -9, -9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, -9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, -4, -4, -11, -11, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + -13, -4, -2, -2, -13, -13, -13, 0, + 0, 0, 0, -7, -9, 0, 0, 0, + 0, 0, 0, -11, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 155, + .right_class_cnt = 138, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 6, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_source_han_sans_sc_14_cjk = { +#else +lv_font_t lv_font_source_han_sans_sc_14_cjk = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 17, /*The maximum line height required by the font*/ + .base_line = 4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_SOURCE_HAN_SANS_SC_14_CJK*/ + diff --git a/inc/lvgl/src/font/lv_font_source_han_sans_sc_16_cjk.c b/inc/lvgl/src/font/lv_font_source_han_sans_sc_16_cjk.c new file mode 100644 index 0000000..b35aeef --- /dev/null +++ b/inc/lvgl/src/font/lv_font_source_han_sans_sc_16_cjk.c @@ -0,0 +1,27593 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font SourceHanSansSC-Normal.otf -r 0x20-0x7f --symbols (),盗提陽帯鼻画輕ッ冊ェル写父ぁフ結想正四O夫源庭場天續鳥れ講猿苦階給了製守8祝己妳薄泣塩帰ぺ吃変輪那着仍嗯爭熱創味保字宿捨準查達肯ァ薬得査障該降察ね網加昼料等図邪秋コ態品屬久原殊候路願楽確針上被怕悲風份重歡っ附ぷ既4黨價娘朝凍僅際洋止右航よ专角應酸師個比則響健昇豐筆歷適修據細忙跟管長令家ザ期般花越ミ域泳通些油乏ラ。營ス返調農叫樹刊愛間包知把ヤ貧橋拡普聞前ジ建当繰ネ送習渇用補ィ覺體法遊宙ョ酔余利壊語くつ払皆時辺追奇そ們只胸械勝住全沈力光ん深溝二類北面社值試9和五勵ゃ貿幾逐打課ゲて領3鼓辦発評1渉詳暇込计駄供嘛郵頃腦反構絵お容規借身妻国慮剛急乗静必議置克土オ乎荷更肉還混古渡授合主離條値決季晴東大尚央州が嗎験流先医亦林田星晩拿60旅婦量為痛テ孫う環友況玩務其ぼち揺坐一肩腰犯タょ希即果ぶ物練待み高九找やヶ都グ去」サ、气仮雑酒許終企笑録形リ銀切ギ快問滿役単黄集森毎實研喜蘇司鉛洲川条媽ノ才兩話言雖媒出客づ卻現異故り誌逮同訊已視本題ぞを横開音第席費持眾怎選元退限ー賽処喝就残無いガ多ケ沒義遠歌隣錢某雪析嬉採自透き側員予ゼ白婚电へ顯呀始均畫似懸格車騒度わ親店週維億締慣免帳電甚來園浴ゅ愈京と杯各海怒ぜ排敗挙老買7極模実紀ヒ携隻告シ並屋這孩讓質ワブ富賃争康由辞マ火於短樣削弟材注節另室ダ招擁ぃ若套底波行勤關著泊背疲狭作念推ぐ民貸祖介說ビ代温契你我レ入描變再札ソ派頭智遅私聽舉灣山伸放直安ト誕煙付符幅ふ絡她届耳飲忘参革團仕様載ど歩獲嫌息の汚交興魚指資雙與館初学年幸史位柱族走括び考青也共腕Lで販擔理病イ今逃當寺猫邊菓係ム秘示解池影ド文例斷曾事茶寫明科桃藝売便え導禁財飛替而亡到し具空寝辛業ウ府セ國何基菜厳市努張缺雲根外だ断万砂ゴ超使台实ぽ礼最慧算軟界段律像夕丈窓助刻月夏政呼ぴざ擇趣除動従涼方勉名線対存請子氏將5少否諸論美感或西者定食御表は參歳緑命進易性錯房も捕皿判中觀戦ニ緩町ピ番ず金千ろ?不た象治関ャ每看徒卒統じ手範訪押座步号ベ旁以母すほ密減成往歲件緒読歯效院种七謂凝濃嵌震喉繼クュ拭死円2積水欲如ポにさ寒道區精啦姐ア聯能足及停思壓2春且メ裏株官答概黒過氷柿戻厚ぱ党祭織引計け委暗複誘港バ失下村較続神ぇ尤強秀膝兒来績十書済化服破新廠1紹您情半式產系好教暑早め樂地休協良な哪常要揮周かエ麗境働避護ンツ香夜太見設非改広聲他検求危清彼經未在起葉控靴所差內造寄南望尺換向展備眠點完約ぎ裡分説申童優伝島机須塊日立拉,鉄軽單気信很転識支布数紙此迎受心輸坊モ處「訳三曇兄野顔戰增ナ伊列又髪両有取左毛至困吧昔赤狀相夠整別士経頼然簡ホ会發隨営需脱ヨば接永居冬迫圍甘醫誰部充消連弱宇會咲覚姉麼的増首统帶糖朋術商担移景功育庫曲總劃牛程駅犬報ロ學責因パ嚴八世後平負公げ曜陸專午之閉ぬ談ご災昨冷職悪謝對它近射敢意運船臉局難什産頗!球真記ま但蔵究制機案湖臺ひ害券男留内木驗雨施種特復句末濟キ色訴依せ百型る石牠討呢时任執飯歐宅組傳配小活ゆべ暖ズ漸站素らボ束価チ浅回女片独妹英目從認生違策僕楚ペ米こ掛む爸六状落漢プ投カ校做啊洗声探あ割体項履触々訓技ハ低工映是標速善点人デ口次可廿节宵植树端阳旦腊妇费愚劳动儿军师庆圣诞闰 --font FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o lv_font_source_han_sans_sc_16_cjk.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_SOURCE_HAN_SANS_SC_16_CJK + #define LV_FONT_SOURCE_HAN_SANS_SC_16_CJK 1 +#endif + +#if LV_FONT_SOURCE_HAN_SANS_SC_16_CJK + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x2f, 0x21, 0xf2, 0x1f, 0x11, 0xf1, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0x9, 0x0, 0x0, 0x4f, + 0x43, 0xe3, + + /* U+0022 "\"" */ + 0x8d, 0x8, 0xd8, 0xc0, 0x8c, 0x7b, 0x7, 0xb5, + 0xa0, 0x59, 0x24, 0x2, 0x40, + + /* U+0023 "#" */ + 0x0, 0xd, 0x0, 0xb2, 0x0, 0x2, 0xb0, 0xd, + 0x0, 0x0, 0x48, 0x0, 0xd0, 0x0, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x85, 0x3, 0xa0, 0x0, 0xa, + 0x30, 0x58, 0x0, 0x0, 0xc1, 0x7, 0x60, 0x5, + 0xef, 0xfe, 0xff, 0xd0, 0x0, 0xd0, 0xa, 0x20, + 0x0, 0x1c, 0x0, 0xc1, 0x0, 0x3, 0xa0, 0xd, + 0x0, 0x0, 0x58, 0x0, 0xd0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0xd0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x6e, 0xfe, 0x80, 0x3, 0xf5, 0x3, 0xc3, + 0x8, 0xc0, 0x0, 0x0, 0x7, 0xd0, 0x0, 0x0, + 0x2, 0xf9, 0x0, 0x0, 0x0, 0x4e, 0xe5, 0x0, + 0x0, 0x0, 0x9f, 0x90, 0x0, 0x0, 0x4, 0xf6, + 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, 0xaa, + 0xc, 0x71, 0x2, 0xf5, 0x3, 0xcf, 0xef, 0x80, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0xf0, 0x0, + + /* U+0025 "%" */ + 0x3, 0xcd, 0x90, 0x0, 0x3, 0xb0, 0x0, 0xe, + 0x20, 0xa7, 0x0, 0xb, 0x20, 0x0, 0x3c, 0x0, + 0x3c, 0x0, 0x4a, 0x0, 0x0, 0x5a, 0x0, 0x2d, + 0x0, 0xc2, 0x0, 0x0, 0x3c, 0x0, 0x4c, 0x5, + 0x81, 0xbd, 0x80, 0xd, 0x30, 0xb6, 0xd, 0x1b, + 0x60, 0xa6, 0x2, 0xbc, 0x80, 0x77, 0x1e, 0x0, + 0x3c, 0x0, 0x0, 0x1, 0xd0, 0x3c, 0x0, 0x1e, + 0x0, 0x0, 0x8, 0x60, 0x3c, 0x0, 0x1e, 0x0, + 0x0, 0x1c, 0x0, 0x1e, 0x0, 0x3c, 0x0, 0x0, + 0x95, 0x0, 0xb, 0x50, 0xa7, 0x0, 0x2, 0xc0, + 0x0, 0x1, 0xcd, 0x90, + + /* U+0026 "&" */ + 0x0, 0xa, 0xed, 0x30, 0x0, 0x0, 0x8, 0xb0, + 0x6d, 0x0, 0x0, 0x0, 0xc5, 0x2, 0xe0, 0x0, + 0x0, 0xb, 0x60, 0x89, 0x0, 0x0, 0x0, 0x7b, + 0x9b, 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, + 0x61, 0x5, 0xea, 0xe1, 0x0, 0x4e, 0x1, 0xf5, + 0xa, 0xb0, 0xa, 0x80, 0x5f, 0x0, 0xc, 0xb4, + 0xe1, 0x4, 0xf1, 0x0, 0xc, 0xf7, 0x0, 0xd, + 0xc3, 0x26, 0xec, 0xf8, 0x10, 0x1a, 0xee, 0xb4, + 0x4, 0xc4, + + /* U+0027 "'" */ + 0x8d, 0x8c, 0x7b, 0x5a, 0x24, + + /* U+0028 "(" */ + 0x0, 0x0, 0x0, 0x86, 0x1, 0xe0, 0x7, 0x80, + 0xd, 0x30, 0x1f, 0x0, 0x4c, 0x0, 0x6a, 0x0, + 0x79, 0x0, 0x79, 0x0, 0x6a, 0x0, 0x4c, 0x0, + 0x1f, 0x0, 0xd, 0x30, 0x7, 0x90, 0x1, 0xe0, + 0x0, 0x86, 0x0, 0x0, + + /* U+0029 ")" */ + 0x1, 0x0, 0x2d, 0x0, 0xa, 0x50, 0x4, 0xc0, + 0x0, 0xe2, 0x0, 0xa6, 0x0, 0x79, 0x0, 0x5b, + 0x0, 0x4c, 0x0, 0x5c, 0x0, 0x6b, 0x0, 0x89, + 0x0, 0xb5, 0x0, 0xe2, 0x4, 0xc0, 0xb, 0x50, + 0x2c, 0x0, 0x0, 0x0, + + /* U+002A "*" */ + 0x0, 0xc1, 0x0, 0x53, 0xd5, 0x60, 0x6d, 0xfe, + 0x81, 0x8, 0xdd, 0x0, 0xc, 0x19, 0x50, 0x0, + 0x0, 0x0, + + /* U+002B "+" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x2e, 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, + + /* U+002C "," */ + 0x7, 0xc1, 0x8, 0xf5, 0x0, 0xc4, 0x5, 0xc0, + 0xa, 0x0, + + /* U+002D "-" */ + 0x3e, 0xee, 0xb0, 0x11, 0x11, + + /* U+002E "." */ + 0x0, 0xa, 0xe0, 0x8d, 0x0, + + /* U+002F "/" */ + 0x0, 0x0, 0xe, 0x0, 0x0, 0x5, 0x90, 0x0, + 0x0, 0xa4, 0x0, 0x0, 0xe, 0x0, 0x0, 0x4, + 0xb0, 0x0, 0x0, 0x96, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x87, 0x0, 0x0, + 0xd, 0x20, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x68, + 0x0, 0x0, 0xb, 0x30, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0xa, 0x40, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x4c, 0xeb, 0x20, 0x3, 0xf6, 0x29, 0xe0, + 0x9, 0xa0, 0x0, 0xd6, 0xf, 0x50, 0x0, 0x8b, + 0xf, 0x20, 0x0, 0x6d, 0x2f, 0x10, 0x0, 0x5f, + 0x2f, 0x10, 0x0, 0x5e, 0xf, 0x20, 0x0, 0x6d, + 0xe, 0x50, 0x0, 0x8b, 0x9, 0xa0, 0x0, 0xd6, + 0x2, 0xf7, 0x29, 0xe0, 0x0, 0x4c, 0xeb, 0x20, + + /* U+0031 "1" */ + 0x5, 0x9f, 0x50, 0x0, 0xaa, 0xf5, 0x0, 0x0, + 0xe, 0x50, 0x0, 0x0, 0xe5, 0x0, 0x0, 0xe, + 0x50, 0x0, 0x0, 0xe5, 0x0, 0x0, 0xe, 0x50, + 0x0, 0x0, 0xe5, 0x0, 0x0, 0xe, 0x50, 0x0, + 0x0, 0xe5, 0x0, 0x11, 0x1f, 0x61, 0x18, 0xff, + 0xff, 0xfb, + + /* U+0032 "2" */ + 0x1, 0x9d, 0xea, 0x10, 0x1e, 0x93, 0x3b, 0xd0, + 0x3, 0x0, 0x1, 0xf3, 0x0, 0x0, 0x0, 0xe5, + 0x0, 0x0, 0x1, 0xf3, 0x0, 0x0, 0x6, 0xe0, + 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0xac, 0x0, + 0x0, 0x8, 0xe1, 0x0, 0x0, 0x7e, 0x30, 0x0, + 0x8, 0xf4, 0x11, 0x11, 0x4f, 0xff, 0xff, 0xff, + + /* U+0033 "3" */ + 0x1, 0x9d, 0xfc, 0x30, 0xc, 0x93, 0x3a, 0xf2, + 0x0, 0x0, 0x0, 0xe6, 0x0, 0x0, 0x0, 0xf5, + 0x0, 0x0, 0x2a, 0xb0, 0x0, 0x2f, 0xfb, 0x0, + 0x0, 0x2, 0x4b, 0xd1, 0x0, 0x0, 0x0, 0xba, + 0x0, 0x0, 0x0, 0x7d, 0x3, 0x0, 0x0, 0xab, + 0x3f, 0x84, 0x28, 0xf4, 0x3, 0xad, 0xfc, 0x40, + + /* U+0034 "4" */ + 0x0, 0x0, 0x1e, 0xa0, 0x0, 0x0, 0x9, 0xfa, + 0x0, 0x0, 0x3, 0xf9, 0xa0, 0x0, 0x0, 0xd8, + 0x8a, 0x0, 0x0, 0x6e, 0x8, 0xa0, 0x0, 0x1f, + 0x40, 0x8a, 0x0, 0xa, 0xa0, 0x8, 0xa0, 0x3, + 0xf1, 0x0, 0x8a, 0x0, 0xaf, 0xee, 0xef, 0xfe, + 0x31, 0x11, 0x11, 0x9b, 0x10, 0x0, 0x0, 0x8, + 0xa0, 0x0, 0x0, 0x0, 0x8a, 0x0, + + /* U+0035 "5" */ + 0x4, 0xff, 0xff, 0xf5, 0x5, 0xe1, 0x11, 0x10, + 0x6, 0xc0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, + 0x8, 0xca, 0xdb, 0x40, 0x5, 0x93, 0x39, 0xf3, + 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, 0x7d, + 0x0, 0x0, 0x0, 0x7d, 0x2, 0x0, 0x0, 0xc9, + 0x4f, 0x83, 0x3a, 0xe1, 0x3, 0xbe, 0xeb, 0x20, + + /* U+0036 "6" */ + 0x0, 0x8, 0xde, 0xb2, 0x0, 0xc, 0xb4, 0x27, + 0x70, 0x5, 0xd0, 0x0, 0x0, 0x0, 0xb6, 0x0, + 0x0, 0x0, 0xf, 0x49, 0xed, 0x70, 0x0, 0xfd, + 0x61, 0x3e, 0x70, 0xf, 0x50, 0x0, 0x6d, 0x0, + 0xf4, 0x0, 0x3, 0xf0, 0xd, 0x70, 0x0, 0x3f, + 0x0, 0x7d, 0x0, 0x7, 0xc0, 0x1, 0xe9, 0x24, + 0xf4, 0x0, 0x1, 0xbe, 0xd5, 0x0, + + /* U+0037 "7" */ + 0x3f, 0xff, 0xff, 0xff, 0x0, 0x11, 0x11, 0x1c, + 0x90, 0x0, 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, + 0xd5, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0xb, 0x80, 0x0, 0x0, 0x0, 0xf3, 0x0, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0x0, 0x7, 0xd0, 0x0, + 0x0, 0x0, 0x9b, 0x0, 0x0, 0x0, 0xa, 0xa0, + 0x0, 0x0, 0x0, 0xc9, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x5d, 0xfd, 0x50, 0x0, 0x4f, 0x40, 0x5f, + 0x30, 0x9, 0x90, 0x0, 0x98, 0x0, 0x8a, 0x0, + 0x9, 0x80, 0x2, 0xe4, 0x0, 0xd3, 0x0, 0x5, + 0xfb, 0xa6, 0x0, 0x3, 0xd4, 0x8f, 0xa0, 0x0, + 0xe5, 0x0, 0x1c, 0xa0, 0x3f, 0x0, 0x0, 0x5f, + 0x2, 0xf1, 0x0, 0x5, 0xe0, 0xb, 0xc3, 0x3, + 0xd8, 0x0, 0x8, 0xdf, 0xd7, 0x0, + + /* U+0039 "9" */ + 0x0, 0x8e, 0xe9, 0x0, 0xa, 0xc2, 0x2a, 0xc0, + 0x1f, 0x20, 0x0, 0xd5, 0x3f, 0x0, 0x0, 0x8a, + 0x2f, 0x10, 0x0, 0x7c, 0xc, 0xb1, 0x17, 0xee, + 0x1, 0xae, 0xd7, 0x7d, 0x0, 0x0, 0x0, 0x8b, + 0x0, 0x0, 0x0, 0xc8, 0x0, 0x0, 0x3, 0xf1, + 0xb, 0x72, 0x5e, 0x80, 0x3, 0xbf, 0xd6, 0x0, + + /* U+003A ":" */ + 0x8d, 0xa, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xe0, 0x8d, 0x0, + + /* U+003B ";" */ + 0x8, 0xd0, 0xa, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xc1, + 0x8, 0xf5, 0x0, 0xc4, 0x5, 0xc0, 0xa, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x2, 0x8e, + 0xd1, 0x0, 0x5b, 0xe9, 0x30, 0x4, 0xeb, 0x50, + 0x0, 0x0, 0x3d, 0xc6, 0x0, 0x0, 0x0, 0x4, + 0xaf, 0xa3, 0x0, 0x0, 0x0, 0x17, 0xed, 0x10, + 0x0, 0x0, 0x0, 0x41, + + /* U+003D "=" */ + 0x6f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x20, + + /* U+003E ">" */ + 0x33, 0x0, 0x0, 0x0, 0x3, 0xed, 0x61, 0x0, + 0x0, 0x0, 0x4a, 0xfa, 0x30, 0x0, 0x0, 0x1, + 0x6d, 0xd1, 0x0, 0x0, 0x17, 0xdc, 0x10, 0x5, + 0xbe, 0x93, 0x0, 0x4e, 0xc6, 0x0, 0x0, 0x3, + 0x30, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x3, 0xbe, 0xd6, 0x1, 0xd6, 0x26, 0xf4, 0x0, + 0x0, 0xc, 0x90, 0x0, 0x0, 0xe6, 0x0, 0x0, + 0x6e, 0x0, 0x0, 0x3f, 0x30, 0x0, 0xc, 0x70, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x40, 0x0, 0x3, + 0xe3, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x6, 0xce, 0xec, 0x81, 0x0, 0x0, + 0x0, 0x2c, 0x93, 0x0, 0x27, 0xe4, 0x0, 0x0, + 0x2e, 0x40, 0x0, 0x0, 0x3, 0xe1, 0x0, 0xc, + 0x50, 0x0, 0x0, 0x0, 0x8, 0x80, 0x7, 0xa0, + 0x0, 0x7c, 0xba, 0x40, 0x2c, 0x0, 0xc3, 0x0, + 0x99, 0x3, 0xf1, 0x0, 0xe0, 0xf, 0x0, 0x2e, + 0x0, 0x1e, 0x0, 0xe, 0x1, 0xe0, 0x7, 0x90, + 0x4, 0xb0, 0x1, 0xd0, 0xf, 0x0, 0x88, 0x0, + 0x79, 0x0, 0x68, 0x0, 0xc3, 0x5, 0xc0, 0x3c, + 0xb0, 0x3c, 0x0, 0x8, 0xa0, 0x8, 0xc9, 0x8, + 0xca, 0x10, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0xa3, 0x10, 0x15, 0x20, + 0x0, 0x0, 0x0, 0x6, 0xad, 0xec, 0x71, 0x0, + 0x0, + + /* U+0041 "A" */ + 0x0, 0x1, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xbf, + 0x0, 0x0, 0x0, 0xc, 0x5c, 0x50, 0x0, 0x0, + 0x1f, 0x7, 0xb0, 0x0, 0x0, 0x6b, 0x2, 0xf0, + 0x0, 0x0, 0xc6, 0x0, 0xd5, 0x0, 0x1, 0xf1, + 0x0, 0x8b, 0x0, 0x6, 0xfe, 0xee, 0xff, 0x10, + 0xc, 0x81, 0x11, 0x2e, 0x50, 0x1f, 0x20, 0x0, + 0x9, 0xb0, 0x6d, 0x0, 0x0, 0x5, 0xf1, 0xc8, + 0x0, 0x0, 0x0, 0xf6, + + /* U+0042 "B" */ + 0x5f, 0xff, 0xfd, 0x70, 0x5, 0xf0, 0x11, 0x5e, + 0x90, 0x5f, 0x0, 0x0, 0x6e, 0x5, 0xf0, 0x0, + 0x5, 0xd0, 0x5f, 0x0, 0x3, 0xd7, 0x5, 0xfe, + 0xef, 0xfa, 0x0, 0x5f, 0x11, 0x24, 0xbd, 0x15, + 0xf0, 0x0, 0x0, 0xd8, 0x5f, 0x0, 0x0, 0xa, + 0xa5, 0xf0, 0x0, 0x0, 0xd7, 0x5f, 0x11, 0x14, + 0xbe, 0x15, 0xff, 0xff, 0xd9, 0x10, + + /* U+0043 "C" */ + 0x0, 0x3, 0xae, 0xea, 0x20, 0x0, 0x6f, 0x95, + 0x49, 0xe1, 0x2, 0xf6, 0x0, 0x0, 0x10, 0xa, + 0xc0, 0x0, 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, + 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xf, 0x50, + 0x0, 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, + 0xa, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, + 0x0, 0x30, 0x0, 0x7f, 0x94, 0x49, 0xf3, 0x0, + 0x4, 0xbe, 0xea, 0x30, + + /* U+0044 "D" */ + 0x5f, 0xff, 0xda, 0x30, 0x5, 0xf1, 0x24, 0x9f, + 0x60, 0x5f, 0x0, 0x0, 0x6f, 0x25, 0xf0, 0x0, + 0x0, 0xd9, 0x5f, 0x0, 0x0, 0x8, 0xc5, 0xf0, + 0x0, 0x0, 0x6e, 0x5f, 0x0, 0x0, 0x7, 0xe5, + 0xf0, 0x0, 0x0, 0x9c, 0x5f, 0x0, 0x0, 0xd, + 0x95, 0xf0, 0x0, 0x7, 0xf1, 0x5f, 0x12, 0x5a, + 0xf6, 0x5, 0xff, 0xfd, 0xa3, 0x0, + + /* U+0045 "E" */ + 0x5f, 0xff, 0xff, 0xf4, 0x5f, 0x11, 0x11, 0x10, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x70, + 0x5f, 0x22, 0x22, 0x10, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x22, 0x22, 0x21, 0x5f, 0xff, 0xff, 0xf7, + + /* U+0046 "F" */ + 0x5f, 0xff, 0xff, 0xf4, 0x5f, 0x11, 0x11, 0x10, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x70, + 0x5f, 0x22, 0x22, 0x10, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x2, 0xad, 0xeb, 0x50, 0x0, 0x6f, 0xa5, + 0x47, 0xe5, 0x1, 0xf7, 0x0, 0x0, 0x10, 0x9, + 0xd0, 0x0, 0x0, 0x0, 0xd, 0x80, 0x0, 0x0, + 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0xf, 0x50, + 0x0, 0xff, 0xfb, 0xd, 0x70, 0x0, 0x22, 0x9b, + 0xa, 0xd0, 0x0, 0x0, 0x7b, 0x2, 0xf6, 0x0, + 0x0, 0x7b, 0x0, 0x6f, 0xa5, 0x36, 0xda, 0x0, + 0x3, 0xad, 0xec, 0x70, + + /* U+0048 "H" */ + 0x5f, 0x0, 0x0, 0x6, 0xe5, 0xf0, 0x0, 0x0, + 0x6e, 0x5f, 0x0, 0x0, 0x6, 0xe5, 0xf0, 0x0, + 0x0, 0x6e, 0x5f, 0x0, 0x0, 0x6, 0xe5, 0xff, + 0xff, 0xff, 0xfe, 0x5f, 0x22, 0x22, 0x27, 0xe5, + 0xf0, 0x0, 0x0, 0x6e, 0x5f, 0x0, 0x0, 0x6, + 0xe5, 0xf0, 0x0, 0x0, 0x6e, 0x5f, 0x0, 0x0, + 0x6, 0xe5, 0xf0, 0x0, 0x0, 0x6e, + + /* U+0049 "I" */ + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, + + /* U+004A "J" */ + 0x0, 0x0, 0x6, 0xe0, 0x0, 0x0, 0x6e, 0x0, + 0x0, 0x6, 0xe0, 0x0, 0x0, 0x6e, 0x0, 0x0, + 0x6, 0xe0, 0x0, 0x0, 0x6e, 0x0, 0x0, 0x6, + 0xe0, 0x0, 0x0, 0x6e, 0x0, 0x0, 0x7, 0xd0, + 0x40, 0x0, 0xab, 0x2e, 0x93, 0x6f, 0x50, 0x3a, + 0xed, 0x70, + + /* U+004B "K" */ + 0x5f, 0x0, 0x0, 0x5f, 0x30, 0x5f, 0x0, 0x3, + 0xf5, 0x0, 0x5f, 0x0, 0x1e, 0x80, 0x0, 0x5f, + 0x0, 0xcb, 0x0, 0x0, 0x5f, 0xa, 0xf1, 0x0, + 0x0, 0x5f, 0x7f, 0xe7, 0x0, 0x0, 0x5f, 0xf5, + 0x6e, 0x10, 0x0, 0x5f, 0x70, 0xd, 0x90, 0x0, + 0x5f, 0x0, 0x4, 0xf2, 0x0, 0x5f, 0x0, 0x0, + 0xbb, 0x0, 0x5f, 0x0, 0x0, 0x3f, 0x40, 0x5f, + 0x0, 0x0, 0x9, 0xd0, + + /* U+004C "L" */ + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5f, 0x22, 0x22, 0x20, 0x5f, 0xff, 0xff, 0xf2, + + /* U+004D "M" */ + 0x5f, 0x60, 0x0, 0x0, 0x9f, 0x35, 0xfc, 0x0, + 0x0, 0xe, 0xf3, 0x5b, 0xe2, 0x0, 0x4, 0xce, + 0x35, 0xc9, 0x70, 0x0, 0x97, 0xe3, 0x5c, 0x4d, + 0x0, 0xe, 0x1f, 0x35, 0xd0, 0xe2, 0x5, 0xb0, + 0xf3, 0x5d, 0x9, 0x80, 0xa6, 0xf, 0x35, 0xd0, + 0x3d, 0xe, 0x10, 0xf3, 0x5d, 0x0, 0xd8, 0xa0, + 0xf, 0x35, 0xd0, 0x7, 0xf5, 0x0, 0xf3, 0x5d, + 0x0, 0x2b, 0x0, 0xf, 0x35, 0xd0, 0x0, 0x0, + 0x0, 0xf3, + + /* U+004E "N" */ + 0x5f, 0x40, 0x0, 0x6, 0xd5, 0xfd, 0x0, 0x0, + 0x6d, 0x5c, 0xc6, 0x0, 0x6, 0xd5, 0xc4, 0xe0, + 0x0, 0x6d, 0x5d, 0xc, 0x80, 0x6, 0xd5, 0xe0, + 0x3f, 0x20, 0x6d, 0x5e, 0x0, 0xaa, 0x6, 0xd5, + 0xe0, 0x1, 0xf4, 0x5d, 0x5e, 0x0, 0x7, 0xc4, + 0xd5, 0xe0, 0x0, 0xe, 0x9d, 0x5e, 0x0, 0x0, + 0x5f, 0xd5, 0xe0, 0x0, 0x0, 0xcd, + + /* U+004F "O" */ + 0x0, 0x4, 0xbe, 0xda, 0x20, 0x0, 0x7, 0xf8, + 0x45, 0xaf, 0x40, 0x2, 0xf5, 0x0, 0x0, 0x8e, + 0x0, 0xac, 0x0, 0x0, 0x0, 0xf6, 0xd, 0x70, + 0x0, 0x0, 0xb, 0xa0, 0xf5, 0x0, 0x0, 0x0, + 0x9c, 0xf, 0x50, 0x0, 0x0, 0x9, 0xc0, 0xd7, + 0x0, 0x0, 0x0, 0xb9, 0xa, 0xc0, 0x0, 0x0, + 0x1f, 0x60, 0x2f, 0x60, 0x0, 0x9, 0xe0, 0x0, + 0x7f, 0x94, 0x5a, 0xf4, 0x0, 0x0, 0x4b, 0xed, + 0xa2, 0x0, + + /* U+0050 "P" */ + 0x5f, 0xff, 0xed, 0x70, 0x5, 0xf1, 0x12, 0x6e, + 0xa0, 0x5f, 0x0, 0x0, 0x4f, 0x5, 0xf0, 0x0, + 0x2, 0xf2, 0x5f, 0x0, 0x0, 0x4f, 0x5, 0xf0, + 0x0, 0x4d, 0x90, 0x5f, 0xff, 0xfe, 0x80, 0x5, + 0xf2, 0x21, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, + 0x0, 0x5, 0xf0, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x4, 0xbe, 0xda, 0x20, 0x0, 0x0, 0x7f, + 0x94, 0x5a, 0xf4, 0x0, 0x2, 0xf6, 0x0, 0x0, + 0x9e, 0x0, 0x9, 0xd0, 0x0, 0x0, 0x1f, 0x60, + 0xd, 0x80, 0x0, 0x0, 0xb, 0x90, 0xf, 0x50, + 0x0, 0x0, 0x9, 0xb0, 0xf, 0x50, 0x0, 0x0, + 0x8, 0xc0, 0xe, 0x70, 0x0, 0x0, 0xa, 0xa0, + 0xb, 0xa0, 0x0, 0x0, 0xd, 0x80, 0x5, 0xf1, + 0x0, 0x0, 0x5f, 0x10, 0x0, 0xcd, 0x10, 0x3, + 0xe9, 0x0, 0x0, 0xb, 0xfc, 0xdf, 0x80, 0x0, + 0x0, 0x0, 0x1b, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xeb, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2b, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+0052 "R" */ + 0x5f, 0xff, 0xfd, 0x80, 0x5, 0xf1, 0x12, 0x5d, + 0xa0, 0x5f, 0x0, 0x0, 0x4f, 0x15, 0xf0, 0x0, + 0x1, 0xf3, 0x5f, 0x0, 0x0, 0x4f, 0x15, 0xf0, + 0x0, 0x3d, 0xa0, 0x5f, 0xee, 0xff, 0x90, 0x5, + 0xf1, 0x1a, 0xd0, 0x0, 0x5f, 0x0, 0x1e, 0x70, + 0x5, 0xf0, 0x0, 0x6f, 0x10, 0x5f, 0x0, 0x0, + 0xca, 0x5, 0xf0, 0x0, 0x3, 0xf4, + + /* U+0053 "S" */ + 0x0, 0x3b, 0xee, 0xa2, 0x0, 0x2f, 0xa5, 0x49, + 0xf2, 0x8, 0xc0, 0x0, 0x1, 0x0, 0x8d, 0x0, + 0x0, 0x0, 0x3, 0xfa, 0x20, 0x0, 0x0, 0x3, + 0xcf, 0xa3, 0x0, 0x0, 0x0, 0x4b, 0xf9, 0x0, + 0x0, 0x0, 0x4, 0xf7, 0x0, 0x0, 0x0, 0xa, + 0xb0, 0x61, 0x0, 0x0, 0xc9, 0xc, 0xe7, 0x44, + 0xaf, 0x20, 0x7, 0xbe, 0xea, 0x20, + + /* U+0054 "T" */ + 0x7f, 0xff, 0xff, 0xff, 0xf0, 0x1, 0x11, 0xe7, + 0x11, 0x10, 0x0, 0x0, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0xe6, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0xe6, 0x0, 0x0, 0x0, 0x0, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0xe6, 0x0, 0x0, + + /* U+0055 "U" */ + 0x6e, 0x0, 0x0, 0x6, 0xd6, 0xe0, 0x0, 0x0, + 0x6d, 0x6e, 0x0, 0x0, 0x6, 0xd6, 0xe0, 0x0, + 0x0, 0x6d, 0x6e, 0x0, 0x0, 0x6, 0xd6, 0xe0, + 0x0, 0x0, 0x6d, 0x6e, 0x0, 0x0, 0x6, 0xd5, + 0xf0, 0x0, 0x0, 0x7c, 0x3f, 0x10, 0x0, 0x9, + 0xa0, 0xe7, 0x0, 0x0, 0xe7, 0x6, 0xf7, 0x35, + 0xcd, 0x0, 0x5, 0xcf, 0xe9, 0x10, + + /* U+0056 "V" */ + 0xc9, 0x0, 0x0, 0x6, 0xe0, 0x7d, 0x0, 0x0, + 0xb, 0x90, 0x2f, 0x20, 0x0, 0xf, 0x40, 0xd, + 0x70, 0x0, 0x4f, 0x0, 0x8, 0xb0, 0x0, 0x9a, + 0x0, 0x3, 0xf0, 0x0, 0xe5, 0x0, 0x0, 0xe5, + 0x2, 0xf0, 0x0, 0x0, 0x9a, 0x7, 0xb0, 0x0, + 0x0, 0x4e, 0xc, 0x60, 0x0, 0x0, 0xf, 0x4f, + 0x10, 0x0, 0x0, 0xa, 0xdc, 0x0, 0x0, 0x0, + 0x5, 0xf7, 0x0, 0x0, + + /* U+0057 "W" */ + 0x7e, 0x0, 0x0, 0xbb, 0x0, 0x0, 0xe6, 0x3f, + 0x10, 0x0, 0xff, 0x0, 0x1, 0xf2, 0xf, 0x40, + 0x3, 0xcd, 0x30, 0x4, 0xf0, 0xd, 0x70, 0x7, + 0x99, 0x70, 0x7, 0xc0, 0x9, 0xa0, 0xb, 0x56, + 0xb0, 0xa, 0x80, 0x6, 0xd0, 0xf, 0x12, 0xf0, + 0xd, 0x50, 0x3, 0xf0, 0x3d, 0x0, 0xe4, 0x1f, + 0x20, 0x0, 0xf3, 0x79, 0x0, 0xa7, 0x3f, 0x0, + 0x0, 0xc6, 0xa5, 0x0, 0x6b, 0x6b, 0x0, 0x0, + 0x99, 0xe1, 0x0, 0x2e, 0x98, 0x0, 0x0, 0x5e, + 0xe0, 0x0, 0xe, 0xe5, 0x0, 0x0, 0x2f, 0xa0, + 0x0, 0xa, 0xf2, 0x0, + + /* U+0058 "X" */ + 0x3f, 0x30, 0x0, 0x2f, 0x30, 0xab, 0x0, 0xa, + 0xb0, 0x2, 0xf4, 0x2, 0xf2, 0x0, 0x8, 0xc0, + 0xb9, 0x0, 0x0, 0x1e, 0x8f, 0x10, 0x0, 0x0, + 0x7f, 0x80, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x3, 0xe3, 0xf3, 0x0, 0x0, 0xc8, 0x9, 0xc0, + 0x0, 0x5e, 0x0, 0x1f, 0x50, 0xd, 0x70, 0x0, + 0x8d, 0x7, 0xe0, 0x0, 0x0, 0xe7, + + /* U+0059 "Y" */ + 0xca, 0x0, 0x0, 0x3f, 0x24, 0xf1, 0x0, 0xb, + 0xa0, 0xc, 0x80, 0x2, 0xf2, 0x0, 0x5e, 0x0, + 0x9a, 0x0, 0x0, 0xd6, 0x1f, 0x20, 0x0, 0x5, + 0xd8, 0xb0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x7, 0xd0, 0x0, + 0x0, 0x0, 0x7d, 0x0, 0x0, 0x0, 0x7, 0xd0, + 0x0, 0x0, 0x0, 0x7d, 0x0, 0x0, + + /* U+005A "Z" */ + 0x9, 0xff, 0xff, 0xff, 0xc0, 0x11, 0x11, 0x14, + 0xf5, 0x0, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x0, + 0x5f, 0x10, 0x0, 0x0, 0x1e, 0x70, 0x0, 0x0, + 0x9, 0xc0, 0x0, 0x0, 0x3, 0xf3, 0x0, 0x0, + 0x0, 0xd9, 0x0, 0x0, 0x0, 0x7e, 0x0, 0x0, + 0x0, 0x2f, 0x50, 0x0, 0x0, 0xc, 0xc2, 0x22, + 0x22, 0x12, 0xff, 0xff, 0xff, 0xfd, + + /* U+005B "[" */ + 0x4e, 0xc9, 0x4a, 0x0, 0x4a, 0x0, 0x4a, 0x0, + 0x4a, 0x0, 0x4a, 0x0, 0x4a, 0x0, 0x4a, 0x0, + 0x4a, 0x0, 0x4a, 0x0, 0x4a, 0x0, 0x4a, 0x0, + 0x4a, 0x0, 0x4a, 0x0, 0x4a, 0x0, 0x4d, 0xb9, + + /* U+005C "\\" */ + 0xa5, 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0xe, + 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x6, 0x80, + 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0xc2, 0x0, + 0x0, 0x7, 0x70, 0x0, 0x0, 0x2c, 0x0, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, + 0x3b, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xa, + 0x50, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x0, 0xe0, + + /* U+005D "]" */ + 0x6c, 0xd9, 0x0, 0x59, 0x0, 0x59, 0x0, 0x59, + 0x0, 0x59, 0x0, 0x59, 0x0, 0x59, 0x0, 0x59, + 0x0, 0x59, 0x0, 0x59, 0x0, 0x59, 0x0, 0x59, + 0x0, 0x59, 0x0, 0x59, 0x0, 0x59, 0x5b, 0xc8, + + /* U+005E "^" */ + 0x0, 0x6f, 0x20, 0x0, 0xc, 0xb8, 0x0, 0x2, + 0xe2, 0xe0, 0x0, 0x88, 0xc, 0x50, 0xe, 0x20, + 0x6b, 0x5, 0xc0, 0x0, 0xf1, 0xb6, 0x0, 0xa, + 0x70, + + /* U+005F "_" */ + 0xbe, 0xee, 0xee, 0xee, 0xa0, + + /* U+0060 "`" */ + 0x0, 0x0, 0x3b, 0x0, 0x1d, 0x90, 0x1, 0xd6, + 0x0, 0x14, + + /* U+0061 "a" */ + 0x0, 0x7c, 0xfd, 0x50, 0x6, 0xb4, 0x27, 0xf2, + 0x0, 0x0, 0x0, 0xe7, 0x0, 0x1, 0x47, 0xe9, + 0x0, 0xae, 0x96, 0xc9, 0xb, 0xa0, 0x0, 0xa9, + 0xf, 0x40, 0x0, 0xb9, 0xd, 0xb2, 0x3b, 0xe9, + 0x3, 0xcf, 0xc4, 0x79, + + /* U+0062 "b" */ + 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, + 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, + 0x7c, 0x4b, 0xfc, 0x40, 0x7f, 0xc4, 0x28, 0xf3, + 0x7d, 0x0, 0x0, 0xba, 0x7c, 0x0, 0x0, 0x7d, + 0x7c, 0x0, 0x0, 0x6e, 0x7c, 0x0, 0x0, 0x8c, + 0x7d, 0x0, 0x0, 0xe8, 0x7f, 0xa3, 0x3b, 0xe1, + 0x79, 0x6d, 0xea, 0x10, + + /* U+0063 "c" */ + 0x0, 0x2a, 0xee, 0x90, 0x2, 0xfa, 0x33, 0xa2, + 0xb, 0xb0, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, + 0x1f, 0x30, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, + 0xc, 0xb0, 0x0, 0x0, 0x3, 0xf9, 0x33, 0x96, + 0x0, 0x3b, 0xed, 0x91, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, + 0xf5, 0x0, 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, + 0x0, 0xf5, 0x0, 0x3b, 0xfd, 0x5e, 0x50, 0x2f, + 0x93, 0x3b, 0xf5, 0xb, 0xb0, 0x0, 0xf, 0x50, + 0xf5, 0x0, 0x0, 0xf5, 0x1f, 0x30, 0x0, 0xf, + 0x50, 0xf5, 0x0, 0x0, 0xf5, 0xd, 0xa0, 0x0, + 0xf, 0x50, 0x5f, 0x83, 0x5d, 0xf5, 0x0, 0x5d, + 0xfb, 0x3c, 0x50, + + /* U+0065 "e" */ + 0x0, 0x2b, 0xed, 0x60, 0x0, 0x2f, 0x72, 0x4d, + 0x60, 0xb, 0x90, 0x0, 0x5d, 0x0, 0xf3, 0x0, + 0x1, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0x10, 0xf3, + 0x0, 0x0, 0x0, 0xb, 0x90, 0x0, 0x0, 0x0, + 0x2f, 0x82, 0x25, 0x50, 0x0, 0x2b, 0xee, 0xb3, + 0x0, + + /* U+0066 "f" */ + 0x0, 0x5d, 0xd5, 0x1, 0xf8, 0x31, 0x4, 0xf1, + 0x0, 0x4, 0xf0, 0x0, 0x7f, 0xff, 0xe0, 0x5, + 0xf1, 0x10, 0x4, 0xf0, 0x0, 0x4, 0xf0, 0x0, + 0x4, 0xf0, 0x0, 0x4, 0xf0, 0x0, 0x4, 0xf0, + 0x0, 0x4, 0xf0, 0x0, 0x4, 0xf0, 0x0, + + /* U+0067 "g" */ + 0x0, 0x6d, 0xff, 0xff, 0x80, 0x5e, 0x30, 0x6f, + 0x20, 0xb, 0x80, 0x0, 0xc6, 0x0, 0xb8, 0x0, + 0xc, 0x50, 0x4, 0xe3, 0x6, 0xe1, 0x0, 0xd, + 0xce, 0xb2, 0x0, 0x7, 0x80, 0x0, 0x0, 0x0, + 0x8c, 0x21, 0x10, 0x0, 0x2, 0xff, 0xff, 0xfc, + 0x20, 0xb6, 0x0, 0x2, 0xe9, 0x1f, 0x10, 0x0, + 0xb, 0x80, 0xe9, 0x10, 0x7, 0xe2, 0x2, 0xae, + 0xed, 0x92, 0x0, + + /* U+0068 "h" */ + 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, + 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, + 0x7c, 0x2a, 0xed, 0x40, 0x7e, 0xd6, 0x3b, 0xe0, + 0x7e, 0x10, 0x2, 0xf3, 0x7c, 0x0, 0x0, 0xf4, + 0x7c, 0x0, 0x0, 0xf4, 0x7c, 0x0, 0x0, 0xf4, + 0x7c, 0x0, 0x0, 0xf4, 0x7c, 0x0, 0x0, 0xf4, + 0x7c, 0x0, 0x0, 0xf4, + + /* U+0069 "i" */ + 0x8d, 0x6, 0xa0, 0x0, 0x0, 0x0, 0x7c, 0x7, + 0xc0, 0x7c, 0x7, 0xc0, 0x7c, 0x7, 0xc0, 0x7c, + 0x7, 0xc0, 0x7c, 0x0, + + /* U+006A "j" */ + 0x0, 0x8d, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7d, 0x0, 0x7, 0xd0, 0x0, + 0x7d, 0x0, 0x7, 0xd0, 0x0, 0x7d, 0x0, 0x7, + 0xd0, 0x0, 0x7d, 0x0, 0x7, 0xd0, 0x0, 0x7d, + 0x0, 0x7, 0xd0, 0x0, 0x8c, 0x1, 0x2d, 0x90, + 0x7f, 0xc1, 0x0, + + /* U+006B "k" */ + 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, + 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, + 0x7c, 0x0, 0xb, 0xb0, 0x7c, 0x0, 0x8d, 0x10, + 0x7c, 0x4, 0xf2, 0x0, 0x7c, 0x2e, 0x70, 0x0, + 0x7d, 0xcd, 0xc0, 0x0, 0x7f, 0xa0, 0xe6, 0x0, + 0x7e, 0x0, 0x5e, 0x10, 0x7c, 0x0, 0xc, 0x90, + 0x7c, 0x0, 0x3, 0xf3, + + /* U+006C "l" */ + 0x7c, 0x7, 0xc0, 0x7c, 0x7, 0xc0, 0x7c, 0x7, + 0xc0, 0x7c, 0x7, 0xc0, 0x7c, 0x7, 0xc0, 0x7c, + 0x6, 0xe1, 0x2d, 0x90, + + /* U+006D "m" */ + 0x79, 0x2b, 0xea, 0x11, 0x9e, 0xd4, 0x7, 0xdc, + 0x53, 0xdb, 0xc7, 0x3a, 0xe0, 0x7e, 0x10, 0x6, + 0xf3, 0x0, 0x1f, 0x37, 0xc0, 0x0, 0x4f, 0x0, + 0x0, 0xf4, 0x7c, 0x0, 0x3, 0xf0, 0x0, 0xf, + 0x47, 0xc0, 0x0, 0x3f, 0x0, 0x0, 0xf4, 0x7c, + 0x0, 0x3, 0xf0, 0x0, 0xf, 0x47, 0xc0, 0x0, + 0x3f, 0x0, 0x0, 0xf4, 0x7c, 0x0, 0x3, 0xf0, + 0x0, 0xf, 0x40, + + /* U+006E "n" */ + 0x79, 0x2a, 0xed, 0x40, 0x7d, 0xd6, 0x3b, 0xe0, + 0x7e, 0x10, 0x2, 0xf3, 0x7c, 0x0, 0x0, 0xf4, + 0x7c, 0x0, 0x0, 0xf4, 0x7c, 0x0, 0x0, 0xf4, + 0x7c, 0x0, 0x0, 0xf4, 0x7c, 0x0, 0x0, 0xf4, + 0x7c, 0x0, 0x0, 0xf4, + + /* U+006F "o" */ + 0x0, 0x2b, 0xed, 0x80, 0x0, 0x2f, 0x93, 0x4d, + 0xc0, 0xb, 0xb0, 0x0, 0x1f, 0x50, 0xf5, 0x0, + 0x0, 0xb9, 0x1f, 0x30, 0x0, 0x9, 0xb0, 0xf5, + 0x0, 0x0, 0xa9, 0xb, 0xa0, 0x0, 0x1f, 0x50, + 0x2f, 0x93, 0x4c, 0xc0, 0x0, 0x2b, 0xed, 0x80, + 0x0, + + /* U+0070 "p" */ + 0x7a, 0x4b, 0xfc, 0x40, 0x7f, 0xc4, 0x28, 0xf3, + 0x7d, 0x0, 0x0, 0xba, 0x7c, 0x0, 0x0, 0x7d, + 0x7c, 0x0, 0x0, 0x6e, 0x7c, 0x0, 0x0, 0x8c, + 0x7d, 0x0, 0x0, 0xe8, 0x7f, 0xa3, 0x3b, 0xe1, + 0x7c, 0x6d, 0xeb, 0x10, 0x7c, 0x0, 0x0, 0x0, + 0x7c, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, + 0x7c, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x3b, 0xfd, 0x6c, 0x50, 0x2f, 0x93, 0x3b, + 0xf5, 0xb, 0xb0, 0x0, 0xf, 0x50, 0xf5, 0x0, + 0x0, 0xf5, 0x1f, 0x30, 0x0, 0xf, 0x50, 0xf5, + 0x0, 0x0, 0xf5, 0xd, 0xa0, 0x0, 0xf, 0x50, + 0x5f, 0x83, 0x5d, 0xf5, 0x0, 0x5d, 0xfb, 0x3e, + 0x50, 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, 0x0, + 0xf, 0x50, 0x0, 0x0, 0x0, 0xf5, 0x0, 0x0, + 0x0, 0xf, 0x50, + + /* U+0072 "r" */ + 0x79, 0x3d, 0xf0, 0x7c, 0xc5, 0x30, 0x7f, 0x30, + 0x0, 0x7d, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x7c, + 0x0, 0x0, 0x7c, 0x0, 0x0, 0x7c, 0x0, 0x0, + 0x7c, 0x0, 0x0, + + /* U+0073 "s" */ + 0x2, 0xbe, 0xe9, 0x10, 0xcb, 0x22, 0x82, 0xf, + 0x50, 0x0, 0x0, 0x9e, 0x60, 0x0, 0x0, 0x5d, + 0xe7, 0x0, 0x0, 0x4, 0xe8, 0x0, 0x0, 0x8, + 0xc3, 0xd5, 0x14, 0xd8, 0x5, 0xcf, 0xe8, 0x0, + + /* U+0074 "t" */ + 0x0, 0x70, 0x0, 0x1, 0xf0, 0x0, 0x2, 0xf0, + 0x0, 0x8f, 0xff, 0xf6, 0x4, 0xf2, 0x10, 0x3, + 0xf0, 0x0, 0x3, 0xf0, 0x0, 0x3, 0xf0, 0x0, + 0x3, 0xf0, 0x0, 0x3, 0xf2, 0x0, 0x0, 0xf9, + 0x22, 0x0, 0x5e, 0xe7, + + /* U+0075 "u" */ + 0x9a, 0x0, 0x2, 0xf1, 0x9a, 0x0, 0x2, 0xf1, + 0x9a, 0x0, 0x2, 0xf1, 0x9a, 0x0, 0x2, 0xf1, + 0x9a, 0x0, 0x2, 0xf1, 0x9b, 0x0, 0x2, 0xf1, + 0x8d, 0x0, 0x6, 0xf1, 0x4f, 0x73, 0x8b, 0xf1, + 0x8, 0xed, 0x80, 0xf1, + + /* U+0076 "v" */ + 0x9b, 0x0, 0x0, 0x7c, 0x4f, 0x10, 0x0, 0xc7, + 0xe, 0x50, 0x2, 0xf1, 0x9, 0xb0, 0x7, 0xc0, + 0x3, 0xf0, 0xc, 0x60, 0x0, 0xd5, 0x1f, 0x10, + 0x0, 0x8a, 0x6b, 0x0, 0x0, 0x2e, 0xb6, 0x0, + 0x0, 0xd, 0xf1, 0x0, + + /* U+0077 "w" */ + 0x6e, 0x0, 0x6, 0xf2, 0x0, 0x2f, 0x12, 0xf2, + 0x0, 0xad, 0x60, 0x6, 0xd0, 0xe, 0x60, 0xe, + 0x6a, 0x0, 0xa9, 0x0, 0x9a, 0x3, 0xc2, 0xf0, + 0xe, 0x50, 0x5, 0xe0, 0x78, 0xe, 0x32, 0xf1, + 0x0, 0x1f, 0x2b, 0x40, 0xa7, 0x6c, 0x0, 0x0, + 0xc5, 0xe0, 0x6, 0xb9, 0x80, 0x0, 0x8, 0xcc, + 0x0, 0x2f, 0xd4, 0x0, 0x0, 0x4f, 0x80, 0x0, + 0xdf, 0x0, 0x0, + + /* U+0078 "x" */ + 0x3f, 0x30, 0x5, 0xe1, 0x9, 0xc0, 0xd, 0x60, + 0x1, 0xe5, 0x6c, 0x0, 0x0, 0x6e, 0xe3, 0x0, + 0x0, 0x1f, 0xd0, 0x0, 0x0, 0xaa, 0xe5, 0x0, + 0x3, 0xf1, 0x6e, 0x0, 0xd, 0x70, 0xc, 0x90, + 0x7d, 0x0, 0x3, 0xf3, + + /* U+0079 "y" */ + 0x9b, 0x0, 0x0, 0x7d, 0x3f, 0x10, 0x0, 0xc7, + 0xd, 0x70, 0x1, 0xf2, 0x7, 0xc0, 0x6, 0xd0, + 0x1, 0xf2, 0xb, 0x70, 0x0, 0xb8, 0xf, 0x20, + 0x0, 0x4d, 0x4d, 0x0, 0x0, 0xe, 0xc7, 0x0, + 0x0, 0x8, 0xf2, 0x0, 0x0, 0x6, 0xd0, 0x0, + 0x0, 0xd, 0x50, 0x0, 0x2, 0x8d, 0x0, 0x0, + 0x4f, 0xc2, 0x0, 0x0, + + /* U+007A "z" */ + 0xe, 0xff, 0xff, 0xd0, 0x1, 0x11, 0x2f, 0x50, + 0x0, 0x0, 0xbb, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0x1e, 0x60, 0x0, 0x0, 0xac, 0x0, 0x0, + 0x4, 0xf2, 0x0, 0x0, 0xe, 0x81, 0x11, 0x10, + 0x6f, 0xff, 0xff, 0xf0, + + /* U+007B "{" */ + 0x0, 0x6e, 0xa0, 0xe, 0x40, 0x0, 0xf1, 0x0, + 0xf, 0x10, 0x0, 0xe1, 0x0, 0xe, 0x20, 0x3, + 0xf0, 0x5, 0xf6, 0x0, 0x3, 0xe0, 0x0, 0xe, + 0x10, 0x0, 0xe2, 0x0, 0xf, 0x10, 0x0, 0xf1, + 0x0, 0xf, 0x10, 0x0, 0xd5, 0x0, 0x4, 0xc9, + + /* U+007C "|" */ + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, + 0x59, 0x59, + + /* U+007D "}" */ + 0x6d, 0xa0, 0x0, 0xf, 0x30, 0x0, 0xc4, 0x0, + 0xc, 0x40, 0x0, 0xd3, 0x0, 0xd, 0x30, 0x0, + 0xa7, 0x0, 0x2, 0xfa, 0x0, 0xa8, 0x0, 0xd, + 0x30, 0x0, 0xd3, 0x0, 0xd, 0x30, 0x0, 0xc4, + 0x0, 0xc, 0x40, 0x1, 0xe2, 0x5, 0xc8, 0x0, + + /* U+007E "~" */ + 0x3, 0xca, 0x10, 0x3, 0x1, 0xd3, 0x7d, 0x34, + 0xd0, 0x4, 0x0, 0x4d, 0xc2, 0x0, + + /* U+3001 "、" */ + 0x4, 0x10, 0x0, 0xc, 0xd1, 0x0, 0x0, 0xbd, + 0x10, 0x0, 0xc, 0xd1, 0x0, 0x1, 0x91, + + /* U+3002 "。" */ + 0x1, 0xac, 0x80, 0xc, 0x30, 0x87, 0xc, 0x0, + 0x1b, 0xc, 0x20, 0x78, 0x2, 0xcc, 0xa0, + + /* U+3005 "々" */ + 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9a, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x6, 0xe2, 0x11, + 0x11, 0x10, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x6d, 0x0, 0x0, 0x7, 0xb0, 0x0, + 0x1e, 0x40, 0x0, 0x0, 0xe4, 0x0, 0xb, 0xa0, + 0x0, 0x0, 0x7c, 0x0, 0x9, 0xd0, 0x24, 0x0, + 0x2f, 0x30, 0x1, 0xb2, 0x5, 0xeb, 0x3c, 0x80, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, + + /* U+300C "「" */ + 0xcf, 0xff, 0xf3, 0xc4, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0xc4, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x41, 0x0, + 0x0, + + /* U+300D "」" */ + 0x0, 0x0, 0x14, 0x0, 0x0, 0x4c, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x4c, 0x0, + 0x0, 0x4c, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x4c, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x4c, 0x3f, 0xff, + 0xfc, + + /* U+3041 "ぁ" */ + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x69, 0x1, 0x35, 0x20, 0x8, 0xed, 0xef, 0xed, + 0xca, 0x30, 0x0, 0x0, 0xa5, 0x0, 0x71, 0x0, + 0x0, 0x0, 0xba, 0xad, 0xf8, 0x10, 0x0, 0xa, + 0xf7, 0x28, 0x99, 0xd1, 0x0, 0xc8, 0xb3, 0x1e, + 0x10, 0x88, 0x8, 0x80, 0xa5, 0xb7, 0x0, 0x4b, + 0xe, 0x0, 0x8d, 0x90, 0x0, 0x89, 0xe, 0x23, + 0xcd, 0x0, 0x4, 0xf2, 0x7, 0xec, 0x6b, 0x16, + 0xae, 0x40, 0x0, 0x0, 0x0, 0x9, 0x50, 0x0, + + /* U+3042 "あ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x20, 0x2, 0x55, 0x0, 0x9, 0xdc, 0xbf, + 0xde, 0xfe, 0xc6, 0x0, 0x1, 0x33, 0x4f, 0x21, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x0, 0xb, + 0x50, 0x0, 0x0, 0x0, 0x3e, 0xbd, 0xef, 0xb3, + 0x0, 0x0, 0x6, 0xed, 0x20, 0x79, 0x4e, 0x50, + 0x0, 0x8d, 0x5c, 0x0, 0xe1, 0x2, 0xe1, 0x5, + 0xc1, 0x1e, 0x9, 0x80, 0x0, 0xd4, 0xd, 0x30, + 0xf, 0x6d, 0x0, 0x0, 0xe3, 0x1f, 0x0, 0xe, + 0xe1, 0x0, 0x4, 0xf0, 0x1f, 0x55, 0xcf, 0x60, + 0x0, 0x3e, 0x60, 0x6, 0xcb, 0x67, 0x61, 0x6a, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x1, 0xa6, 0x10, + 0x0, + + /* U+3043 "ぃ" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, + 0x0, 0x0, 0x64, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x5e, 0x0, 0xe, 0x20, 0x0, 0x0, 0xc, 0x60, + 0xd, 0x20, 0x0, 0x0, 0x6, 0xc0, 0xc, 0x30, + 0x0, 0x0, 0x1, 0xf1, 0xa, 0x60, 0x3, 0x0, + 0x0, 0xd5, 0x7, 0xa0, 0xb, 0x60, 0x0, 0xa7, + 0x2, 0xf3, 0x3f, 0x10, 0x0, 0x20, 0x0, 0x8f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x0, 0x0, + + /* U+3044 "い" */ + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x60, + 0x0, 0x0, 0x0, 0x80, 0x0, 0xd5, 0x0, 0x0, + 0x0, 0xc, 0x90, 0xd, 0x50, 0x0, 0x0, 0x0, + 0x2f, 0x10, 0xc5, 0x0, 0x0, 0x0, 0x0, 0xb8, + 0xb, 0x60, 0x0, 0x0, 0x0, 0x5, 0xd0, 0xa8, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x27, 0xa0, 0x0, + 0x20, 0x0, 0x0, 0xd5, 0x4e, 0x0, 0xa, 0x70, + 0x0, 0xa, 0x80, 0xe4, 0x1, 0xf3, 0x0, 0x0, + 0x53, 0x8, 0xe5, 0xbb, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3046 "う" */ + 0x0, 0x16, 0x31, 0x0, 0x0, 0x0, 0x2, 0xad, + 0xff, 0xed, 0x60, 0x0, 0x0, 0x0, 0x2, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x9b, 0xcc, 0x91, 0x2, 0xff, 0xb7, 0x53, 0x4b, + 0xe1, 0x5, 0x0, 0x0, 0x0, 0xb, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x6, + 0xec, 0x10, 0x0, 0x8, 0xcf, 0xe5, 0x0, 0x0, + 0x0, 0x56, 0x20, 0x0, 0x0, + + /* U+3047 "ぇ" */ + 0x0, 0x7d, 0xa8, 0x64, 0x0, 0x0, 0x0, 0x14, + 0x57, 0x70, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0xdd, 0xef, 0xef, 0xc0, 0x0, 0x4, 0x21, + 0x7, 0xc1, 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, + 0x0, 0x0, 0x6, 0xf9, 0x0, 0x0, 0x0, 0x5, + 0xc3, 0xb6, 0x0, 0x0, 0x4, 0xd1, 0x5, 0xb0, + 0x0, 0x4, 0xe3, 0x0, 0x1e, 0x52, 0x43, 0x75, + 0x0, 0x0, 0x5c, 0xdc, 0x40, + + /* U+3048 "え" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xec, 0xa8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x68, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x34, + 0x68, 0x10, 0x0, 0x0, 0xff, 0xed, 0xcb, 0xed, + 0x20, 0x0, 0x0, 0x10, 0x0, 0x7, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xe8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x4d, 0x60, 0x0, 0x0, 0x0, 0x7, + 0xb0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x7c, 0x0, + 0x2, 0xf0, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x0, + 0xdb, 0x56, 0x84, 0x8, 0x40, 0x0, 0x0, 0x29, + 0xcc, 0xa4, + + /* U+304A "お" */ + 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x37, 0x50, 0xd8, 0x0, 0x3, 0xed, + 0xef, 0xfd, 0xa4, 0x1, 0xae, 0x40, 0x2, 0x22, + 0xf1, 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0xf, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf5, + 0x8b, 0xcb, 0x81, 0x0, 0x0, 0x0, 0x7f, 0xb7, + 0x43, 0x49, 0xe2, 0x0, 0x1, 0xca, 0xf1, 0x0, + 0x0, 0x9, 0xa0, 0x0, 0xc7, 0xe, 0x10, 0x0, + 0x0, 0x6c, 0x0, 0x2e, 0x0, 0xe2, 0x0, 0x0, + 0xb, 0x90, 0x0, 0xe5, 0xf, 0x20, 0x0, 0x4b, + 0xe1, 0x0, 0x3, 0xef, 0xe0, 0xd, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x41, 0x0, 0x32, 0x0, 0x0, + 0x0, + + /* U+304B "か" */ + 0x0, 0x0, 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa9, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, + 0xc, 0x72, 0x20, 0x2, 0xf3, 0x0, 0x8c, 0xde, + 0xfe, 0xdf, 0xe2, 0x7, 0xb0, 0x3, 0x42, 0x4e, + 0x0, 0x9, 0x90, 0xe, 0x40, 0x0, 0x7, 0xa0, + 0x0, 0x5b, 0x0, 0x7b, 0x0, 0x0, 0xd5, 0x0, + 0x6, 0xa0, 0x1, 0xf2, 0x0, 0x2f, 0x0, 0x0, + 0x79, 0x0, 0x4, 0x0, 0x9, 0x90, 0x0, 0x9, + 0x80, 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0xd5, + 0x0, 0x0, 0x0, 0x99, 0x1, 0x0, 0x5f, 0x0, + 0x0, 0x0, 0x3f, 0x10, 0x6f, 0xef, 0x70, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x13, 0x10, 0x0, 0x0, + 0x0, + + /* U+304C "が" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x6, 0x20, 0x0, 0x3, 0x66, 0x90, + 0x0, 0x0, 0xe, 0x50, 0x0, 0x0, 0xd1, 0xc2, + 0x0, 0x0, 0xf, 0x20, 0x0, 0x3, 0x64, 0x0, + 0x0, 0x0, 0x2f, 0x22, 0x10, 0xa, 0xa0, 0x0, + 0xc, 0xcd, 0xff, 0xed, 0xfa, 0x1, 0xe3, 0x0, + 0x5, 0x32, 0xa8, 0x0, 0x1f, 0x30, 0x7c, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0xc, 0x50, 0xe, 0x40, + 0x0, 0x3, 0xe0, 0x0, 0xd, 0x40, 0x8, 0xb0, + 0x0, 0x9, 0x90, 0x0, 0xe, 0x20, 0x2, 0x40, + 0x0, 0x1f, 0x20, 0x0, 0xf, 0x10, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x1, 0xe2, 0x1, 0x0, 0xb9, 0x0, 0x0, 0x0, + 0x9, 0xa0, 0xd, 0xef, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, + + /* U+304D "き" */ + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x47, 0x60, 0xf, 0xfe, 0xee, 0xff, + 0xc9, 0x40, 0x0, 0x1, 0x11, 0x6b, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x2, 0x26, 0x43, + 0x34, 0x4d, 0xab, 0xfa, 0x3b, 0xbc, 0xcb, 0xbb, + 0xf6, 0x30, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, + 0x1, 0x0, 0x0, 0x11, 0x4d, 0x0, 0xa, 0x80, + 0x0, 0x5c, 0xef, 0x40, 0xd, 0x30, 0x0, 0x0, + 0x1, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xe7, 0x31, 0x12, 0x44, 0x0, 0x0, 0x4b, + 0xef, 0xfd, 0xc7, 0x0, + + /* U+304E "ぎ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x93, 0xa4, 0x0, 0x0, + 0x0, 0xc5, 0x25, 0x7c, 0x1a, 0xe, 0xed, 0xdd, + 0xff, 0xeb, 0x55, 0x0, 0x0, 0x12, 0x22, 0x4d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, + 0x2, 0x0, 0x16, 0x54, 0x34, 0x4c, 0xbb, 0xed, + 0x0, 0x2b, 0xbc, 0xcc, 0xba, 0xf7, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x1, 0x2e, 0x10, 0x0, 0x7, 0xb0, + 0x0, 0x3c, 0xef, 0x70, 0x0, 0xb, 0x50, 0x0, + 0x0, 0x1, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf8, 0x31, 0x12, 0x34, + 0x0, 0x0, 0x0, 0x3a, 0xdf, 0xfe, 0xd9, 0x0, + 0x0, + + /* U+304F "く" */ + 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, + 0x2e, 0xb0, 0x0, 0x0, 0x3, 0xe9, 0x0, 0x0, + 0x0, 0x5f, 0x60, 0x0, 0x0, 0x8, 0xe3, 0x0, + 0x0, 0x0, 0xbc, 0x10, 0x0, 0x0, 0x7, 0xe0, + 0x0, 0x0, 0x0, 0x5, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0x50, 0x0, 0x0, 0x0, 0x5, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xdc, 0x10, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x1, 0xb2, + + /* U+3050 "ぐ" */ + 0x0, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x80, 0x0, 0x0, 0x0, 0x6, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x8e, 0x40, 0x6, 0x30, + 0x0, 0xb, 0xd2, 0x5, 0x82, 0xd0, 0x1, 0xda, + 0x0, 0x0, 0xd2, 0x73, 0xb, 0xb0, 0x0, 0x0, + 0x33, 0x0, 0x9, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xae, 0x30, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xb1, 0x0, + + /* U+3051 "け" */ + 0x4, 0xb0, 0x0, 0x0, 0x2, 0xf1, 0x0, 0x7, + 0xb0, 0x0, 0x0, 0x0, 0xf1, 0x0, 0x9, 0x80, + 0x0, 0x0, 0x0, 0xf1, 0x0, 0xb, 0x50, 0x0, + 0x0, 0x0, 0xf3, 0x45, 0xc, 0x30, 0x9, 0xfe, + 0xef, 0xff, 0xe9, 0xd, 0x20, 0x0, 0x12, 0x21, + 0xf2, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0xf1, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf1, 0x0, + 0xf, 0x2a, 0x0, 0x0, 0x1, 0xf0, 0x0, 0xd, + 0x87, 0x0, 0x0, 0x3, 0xd0, 0x0, 0xc, 0xf2, + 0x0, 0x0, 0x9, 0x90, 0x0, 0x9, 0xe0, 0x0, + 0x0, 0x4f, 0x20, 0x0, 0x5, 0xc0, 0x0, 0x6, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x50, + 0x0, 0x0, + + /* U+3052 "げ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x23, 0x0, 0x0, 0x0, 0x35, 0x53, 0xc1, 0x8, + 0xa0, 0x0, 0x0, 0x6, 0xc3, 0xa6, 0x60, 0xa7, + 0x0, 0x0, 0x0, 0x5c, 0x7, 0x0, 0xd, 0x40, + 0x0, 0x0, 0x4, 0xc1, 0x43, 0x0, 0xf2, 0x0, + 0xcf, 0xee, 0xff, 0xfd, 0x70, 0xf, 0x0, 0x1, + 0x12, 0x25, 0xd0, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0x0, 0x4c, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x2, 0xe2, 0x80, 0x0, 0x0, + 0x6b, 0x0, 0x0, 0xf, 0x84, 0x0, 0x0, 0x8, + 0x80, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0, 0xe5, + 0x0, 0x0, 0xc, 0xb0, 0x0, 0x0, 0x9c, 0x0, + 0x0, 0x0, 0x89, 0x0, 0x1, 0xaf, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0x20, 0x0, 0x0, + 0x0, + + /* U+3053 "こ" */ + 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, 0x2, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x1, 0x22, 0x22, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xc3, 0x0, 0x0, + 0x1, 0x42, 0x1, 0xaf, 0xfe, 0xef, 0xff, 0xe4, + 0x0, 0x0, 0x24, 0x43, 0x21, 0x0, + + /* U+3054 "ご" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x82, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb4, 0x95, 0x6, 0xfd, 0xdd, + 0xdd, 0xef, 0x36, 0x0, 0x1, 0x34, 0x45, 0x44, + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xa2, 0x0, 0x0, + 0x1, 0x40, 0x0, 0x3, 0xbf, 0xfd, 0xef, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0x34, 0x43, 0x20, 0x0, + 0x0, + + /* U+3055 "さ" */ + 0x0, 0x0, 0x0, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x99, 0x0, 0x0, 0x1, 0x0, 0x0, 0x3e, + 0x36, 0xa8, 0x6f, 0xff, 0xef, 0xff, 0xea, 0x73, + 0x0, 0x11, 0x21, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8a, 0x0, 0x0, 0x0, 0x0, 0x13, 0x2e, 0x40, + 0x7, 0xa0, 0x0, 0x5c, 0xef, 0xa0, 0xc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xeb, 0x64, 0x45, 0x69, 0x0, 0x0, 0x17, + 0xbc, 0xdc, 0xb9, 0x0, + + /* U+3056 "ざ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x50, 0x0, + 0x0, 0x0, 0xb2, 0x2, 0xc1, 0xd1, 0x0, 0x0, + 0x0, 0xb6, 0x0, 0x86, 0x42, 0x0, 0x0, 0x0, + 0x6b, 0x26, 0xa6, 0x0, 0x9f, 0xfe, 0xde, 0xff, + 0xeb, 0x83, 0x0, 0x1, 0x22, 0x32, 0x1a, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x2e, 0x10, 0x0, 0x9, + 0x80, 0x0, 0x8e, 0xff, 0x80, 0x0, 0xe, 0x30, + 0x0, 0x0, 0x2, 0x10, 0x0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xf8, 0x32, 0x12, 0x46, + 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xda, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3057 "し" */ + 0xf, 0x50, 0x0, 0x0, 0x0, 0x0, 0xf, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x0, + 0x0, 0x0, 0x0, 0x50, 0x1f, 0x10, 0x0, 0x0, + 0x6, 0xf1, 0xf, 0x40, 0x0, 0x0, 0x7f, 0x50, + 0x8, 0xe6, 0x34, 0x6d, 0xe4, 0x0, 0x0, 0x7d, + 0xfe, 0xb6, 0x0, 0x0, + + /* U+3058 "じ" */ + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, + 0x0, 0x0, 0x80, 0x0, 0x2f, 0x0, 0x0, 0xa0, + 0xa7, 0x0, 0x2f, 0x0, 0x0, 0x97, 0x1e, 0x10, + 0x3e, 0x0, 0x0, 0x1d, 0x1, 0x0, 0x3e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0x0, + 0x0, 0x0, 0x0, 0x20, 0x5d, 0x0, 0x0, 0x0, + 0x7, 0xe0, 0x2f, 0x10, 0x0, 0x0, 0x8f, 0x40, + 0xc, 0xc4, 0x24, 0x7e, 0xd3, 0x0, 0x1, 0x9e, + 0xfd, 0xb5, 0x0, 0x0, + + /* U+3059 "す" */ + 0x0, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x12, 0x33, + 0x34, 0x47, 0xf5, 0x55, 0x54, 0x6e, 0xdc, 0xcb, + 0xbb, 0xfa, 0xab, 0xba, 0x0, 0x0, 0x0, 0x2, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfe, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xc8, 0x4, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x0, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0xe7, 0x3, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xee, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x18, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9e, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, + 0x0, 0x0, + + /* U+305A "ず" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x25, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x22, 0xd1, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xf2, 0xb, 0x59, 0x50, 0x0, + 0x1, 0x11, 0x2f, 0x42, 0x67, 0x30, 0x2f, 0xff, + 0xfe, 0xed, 0xfd, 0xdd, 0xee, 0x10, 0x10, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xcc, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xd3, + 0x4f, 0x30, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, + 0x98, 0x0, 0x0, 0x0, 0x0, 0xa, 0x70, 0xb, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x66, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0x9f, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8e, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+305B "せ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0xc, 0x20, 0x0, 0xb, 0x60, 0x0, 0x0, + 0x0, 0xf2, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0xf, 0x20, 0x0, 0xb, 0x50, 0x0, 0x0, 0x2, + 0xf6, 0x68, 0x9b, 0xee, 0xef, 0x66, 0xff, 0xdf, + 0xa8, 0x76, 0x4c, 0x61, 0x10, 0x1, 0x0, 0xf1, + 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0xf, 0x10, + 0x0, 0xd, 0x20, 0x0, 0x0, 0x0, 0xf1, 0x1, + 0xed, 0xe0, 0x0, 0x0, 0x0, 0xf, 0x10, 0x1, + 0x31, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x90, 0x0, 0x0, + 0x12, 0x0, 0x0, 0x0, 0x3d, 0xfe, 0xef, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x2, 0x33, 0x22, 0x10, + 0x0, + + /* U+305C "ぜ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x21, 0x70, + 0x0, 0x1, 0xc1, 0x0, 0x0, 0xb6, 0xa3, 0xc1, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xb5, 0x3a, 0x42, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0x1, 0xf5, 0x57, 0x8a, 0xee, 0xdf, 0x60, + 0x7e, 0xff, 0xfc, 0xb9, 0x76, 0xd7, 0x22, 0x0, + 0x34, 0x21, 0xf0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x43, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x1, 0xbd, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd8, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x4e, 0xfe, 0xee, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x23, 0x33, 0x21, 0x0, 0x0, + + /* U+305D "そ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0xa, 0xdd, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x2, + 0x31, 0x11, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0x30, 0x1, + 0x23, 0x30, 0x15, 0x7b, 0xfe, 0xef, 0xfd, 0xcc, + 0xc0, 0x3b, 0x97, 0x54, 0xc7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfc, + 0x75, 0x40, 0x0, 0x0, 0x0, 0x0, 0x16, 0xab, + 0x90, 0x0, + + /* U+305E "ぞ" */ + 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, + 0x3e, 0xee, 0xff, 0xff, 0x30, 0x0, 0x0, 0x3, + 0x21, 0x5, 0xe5, 0x13, 0x80, 0x0, 0x0, 0x0, + 0x6e, 0x30, 0xd2, 0xc3, 0x0, 0x0, 0x9, 0xc1, + 0x0, 0x59, 0x22, 0x0, 0x1, 0xca, 0x0, 0x0, + 0x13, 0x10, 0x35, 0x7e, 0xfc, 0xde, 0xfe, 0xdd, + 0x70, 0xab, 0x97, 0x57, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, + 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, 0x49, 0xab, + 0x30, 0x0, + + /* U+305F "た" */ + 0x0, 0x0, 0x2b, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6c, 0x47, 0x80, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xda, 0x60, 0x0, 0x0, 0x1, 0x21, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf1, 0x2, 0xcd, + 0xed, 0xc3, 0x0, 0x5, 0xd0, 0x0, 0x43, 0x23, + 0x41, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0xa9, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x1, 0xf3, 0x0, + 0x1f, 0x40, 0x0, 0x11, 0x8, 0xd0, 0x0, 0x6, + 0xef, 0xef, 0xf7, 0x2, 0x30, 0x0, 0x0, 0x1, + 0x22, 0x0, + + /* U+3060 "だ" */ + 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x70, 0x0, + 0x0, 0xf, 0x30, 0x0, 0x8, 0x57, 0x80, 0x0, + 0x1, 0xf2, 0x47, 0x0, 0x1d, 0x1a, 0xc, 0xdd, + 0xef, 0xfc, 0xa0, 0x0, 0x41, 0x0, 0x23, 0x3a, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, + 0x0, 0xab, 0xcc, 0xb8, 0x0, 0x0, 0x1f, 0x10, + 0x5, 0x54, 0x45, 0x40, 0x0, 0x6, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x30, 0xb, 0x30, + 0x0, 0x0, 0x0, 0x6, 0xd0, 0x0, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0xc8, 0x0, 0xd, 0x70, 0x0, + 0x0, 0x0, 0x4f, 0x20, 0x0, 0x4e, 0xfd, 0xdf, + 0xf0, 0x2, 0x50, 0x0, 0x0, 0x2, 0x34, 0x31, + 0x0, + + /* U+3061 "ち" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x53, 0x2b, 0x73, 0x57, + 0xad, 0x90, 0xc, 0xdd, 0xfd, 0xcb, 0x97, 0x52, + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, + 0x28, 0xac, 0xb7, 0x10, 0x0, 0x1f, 0xbc, 0x85, + 0x24, 0xbd, 0x10, 0x7, 0xf8, 0x0, 0x0, 0x0, + 0xc7, 0x0, 0x66, 0x0, 0x0, 0x0, 0x9, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdd, 0x0, 0x0, 0x9, 0xcb, + 0xcf, 0xe9, 0x10, 0x0, 0x0, 0x35, 0x55, 0x20, + 0x0, 0x0, + + /* U+3063 "っ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8b, 0xef, 0xd8, 0x0, 0x39, 0xee, 0x95, 0x20, + 0x3c, 0xb0, 0x3a, 0x40, 0x0, 0x0, 0x1, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1b, 0xb0, 0x0, 0x0, 0x0, 0x27, 0xeb, 0x0, + 0x0, 0x1, 0xef, 0xea, 0x40, 0x0, 0x0, 0x0, + 0x31, 0x0, 0x0, 0x0, + + /* U+3064 "つ" */ + 0x0, 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, 0x0, + 0x1, 0x6a, 0xef, 0xef, 0xe7, 0x0, 0x27, 0xcf, + 0xb7, 0x20, 0x0, 0x4d, 0x80, 0x8d, 0x71, 0x0, + 0x0, 0x0, 0x3, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xed, 0x10, 0x0, + 0x0, 0x25, 0x7a, 0xee, 0x80, 0x0, 0x0, 0x0, + 0x6d, 0xb8, 0x50, 0x0, 0x0, + + /* U+3065 "づ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x1b, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0x3c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb2, 0x30, 0x0, 0x0, + 0x59, 0xce, 0xfe, 0xa2, 0x0, 0x1, 0x6b, 0xfd, + 0x84, 0x20, 0x28, 0xf3, 0x0, 0xcd, 0x82, 0x0, + 0x0, 0x0, 0x7, 0xe0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5e, + 0xc0, 0x0, 0x0, 0x0, 0x35, 0x6a, 0xee, 0x70, + 0x0, 0x0, 0x0, 0xa, 0xeb, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+3066 "て" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x34, 0x50, 0x36, + 0x79, 0xbc, 0xef, 0xff, 0xfd, 0xc1, 0x7b, 0x97, + 0x53, 0x28, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x32, 0x0, + + /* U+3067 "で" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x30, 0x25, + 0x68, 0x9b, 0xce, 0xff, 0xfe, 0xd0, 0x9c, 0xa8, + 0x65, 0x39, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x0, 0x11, 0x80, 0x0, 0x0, 0x3, 0xe0, + 0x0, 0xc2, 0xa5, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x3b, 0x15, 0x0, 0x0, 0xd, 0x30, 0x0, 0x1, + 0x0, 0x0, 0x0, 0xf, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xbf, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x31, 0x0, + + /* U+3068 "と" */ + 0x5, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0x35, + 0x0, 0x3f, 0x10, 0x2, 0xaf, 0x70, 0x0, 0xb9, + 0x18, 0xf9, 0x10, 0x0, 0x3, 0xfe, 0xa1, 0x0, + 0x0, 0x0, 0xad, 0x30, 0x0, 0x0, 0x0, 0xba, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x0, 0xa9, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x10, 0x0, + 0x0, 0x32, 0x5, 0xdf, 0xee, 0xef, 0xff, 0x50, + 0x0, 0x13, 0x43, 0x21, 0x0, + + /* U+3069 "ど" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x40, 0x6, + 0x90, 0x0, 0x0, 0x2, 0xc1, 0xd0, 0x3, 0xf1, + 0x0, 0x0, 0x0, 0x96, 0x63, 0x0, 0xc7, 0x0, + 0x0, 0x4b, 0x12, 0x0, 0x0, 0x5e, 0x0, 0x3c, + 0xd5, 0x0, 0x0, 0x0, 0xd, 0x8a, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9d, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xfb, 0x75, 0x56, + 0x79, 0xb0, 0x0, 0x0, 0x27, 0xac, 0xcb, 0xb9, + 0x70, 0x0, + + /* U+306A "な" */ + 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8b, 0x59, 0x10, 0x30, 0x0, 0x6f, 0xff, 0xfd, + 0xa7, 0x2, 0xeb, 0x20, 0x1, 0x13, 0xe0, 0x0, + 0x0, 0x8, 0xf7, 0x0, 0xa, 0x70, 0x0, 0x17, + 0x0, 0x34, 0x0, 0x2f, 0x10, 0x0, 0x2e, 0x0, + 0x0, 0x0, 0xa9, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x4, 0xf1, 0x0, 0x0, 0xf, 0x0, 0x0, 0x1e, + 0x70, 0x5, 0xbc, 0xbf, 0x20, 0x0, 0x18, 0x0, + 0x6d, 0x52, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0xb5, + 0x0, 0xf, 0x3c, 0xd1, 0x0, 0x0, 0x8b, 0x11, + 0x8e, 0x0, 0x80, 0x0, 0x0, 0x9, 0xef, 0xc3, + 0x0, 0x0, + + /* U+306B "に" */ + 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xd0, + 0x0, 0x36, 0x55, 0x56, 0x70, 0x6a, 0x0, 0x5, + 0xbc, 0xcc, 0xba, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x16, 0x0, + 0x30, 0x0, 0x0, 0x0, 0xe6, 0xa0, 0x2e, 0x0, + 0x0, 0x0, 0xd, 0xe4, 0x3, 0xd0, 0x0, 0x0, + 0x0, 0xbe, 0x0, 0x1e, 0xa5, 0x45, 0x78, 0x59, + 0xb0, 0x0, 0x29, 0xcd, 0xdc, 0xa4, 0x35, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+306C "ぬ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, 0x95, + 0x0, 0x1, 0xf2, 0x0, 0x0, 0x0, 0x7, 0xa0, + 0x4b, 0xff, 0xde, 0x91, 0x0, 0x0, 0x2e, 0x8d, + 0x65, 0xc0, 0x8, 0xe1, 0x0, 0x0, 0xeb, 0x0, + 0x88, 0x0, 0x9, 0xa0, 0x0, 0x7e, 0xb0, 0xc, + 0x40, 0x0, 0x2e, 0x0, 0x1e, 0x2e, 0x22, 0xf0, + 0x0, 0x0, 0xf0, 0x7, 0x90, 0x7b, 0x99, 0x0, + 0x0, 0x1f, 0x0, 0x95, 0x0, 0xdf, 0x13, 0xcd, + 0xb9, 0xc0, 0xb, 0x50, 0x1d, 0x60, 0xe3, 0x3, + 0xde, 0x10, 0x8d, 0x8e, 0x90, 0x1f, 0x10, 0x5e, + 0x8e, 0x10, 0x8a, 0x50, 0x0, 0x8f, 0xec, 0x30, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, + + /* U+306D "ね" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x78, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x6, 0x79, 0xdd, 0x2, 0xaf, 0xee, 0x40, 0x0, + 0x9, 0x97, 0xc7, 0x6d, 0x60, 0x4, 0xf1, 0x0, + 0x0, 0x0, 0xad, 0xc1, 0x0, 0x0, 0xa8, 0x0, + 0x0, 0x2, 0xf9, 0x0, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0xc, 0xf2, 0x0, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0x9a, 0xe2, 0x0, 0x1, 0x10, 0x6a, 0x0, + 0x5, 0xd0, 0xe2, 0x1, 0xcd, 0xde, 0xd9, 0x0, + 0x1f, 0x30, 0xe2, 0xa, 0x70, 0x2, 0xff, 0x40, + 0x4, 0x0, 0xe2, 0xa, 0x80, 0x19, 0xd4, 0xe2, + 0x0, 0x0, 0xf3, 0x2, 0xcf, 0xfd, 0x20, 0x10, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+306E "の" */ + 0x0, 0x0, 0x1, 0x45, 0x31, 0x0, 0x0, 0x0, + 0x1, 0x9f, 0xdf, 0xcf, 0xb2, 0x0, 0x0, 0x4e, + 0x81, 0x4f, 0x0, 0x7f, 0x30, 0x1, 0xe5, 0x0, + 0x7b, 0x0, 0x5, 0xd0, 0xb, 0x90, 0x0, 0xb8, + 0x0, 0x0, 0xc6, 0x1f, 0x10, 0x0, 0xe5, 0x0, + 0x0, 0x89, 0x4d, 0x0, 0x2, 0xf1, 0x0, 0x0, + 0x7b, 0x4d, 0x0, 0x8, 0xb0, 0x0, 0x0, 0x99, + 0x2f, 0x10, 0x1e, 0x50, 0x0, 0x0, 0xe5, 0xc, + 0xa2, 0xbc, 0x0, 0x0, 0x9, 0xc0, 0x2, 0xef, + 0xd1, 0x0, 0x2, 0xbe, 0x20, 0x0, 0x2, 0x0, + 0x8, 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x30, 0x0, 0x0, + + /* U+306F "は" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x5d, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x7, + 0xa0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x97, + 0x0, 0x12, 0x11, 0x3f, 0x35, 0x50, 0xb, 0x40, + 0x6, 0xef, 0xff, 0xfd, 0xb7, 0x0, 0xd2, 0x0, + 0x0, 0x0, 0x2f, 0x0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x1f, 0x4, 0x0, 0x0, + 0x10, 0xf1, 0x0, 0x0, 0xf7, 0x60, 0x2b, 0xec, + 0xef, 0x70, 0x0, 0xf, 0xd0, 0xc, 0x50, 0x0, + 0xfc, 0xe4, 0x0, 0xdb, 0x0, 0xd5, 0x0, 0x4f, + 0x5, 0xe1, 0xa, 0x70, 0x4, 0xee, 0xdf, 0x70, + 0x0, 0x0, 0x22, 0x0, 0x0, 0x23, 0x10, 0x0, + 0x0, + + /* U+3070 "ば" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x24, 0x93, 0x7, + 0xb0, 0x0, 0x0, 0x4, 0xe1, 0xc3, 0xa0, 0x97, + 0x0, 0x0, 0x0, 0x4d, 0x8, 0x23, 0xc, 0x40, + 0x1, 0x21, 0x15, 0xd3, 0x65, 0x0, 0xe2, 0x0, + 0x7e, 0xff, 0xff, 0xdb, 0x60, 0xf, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, + 0x2, 0xe0, 0x0, 0x3, 0xc1, 0x20, 0x0, 0x0, + 0x1f, 0x0, 0x0, 0x3d, 0x74, 0x1, 0x9d, 0xed, + 0xf2, 0x0, 0x2, 0xec, 0x0, 0xd6, 0x10, 0x3f, + 0xe9, 0x0, 0x1f, 0xa0, 0x1f, 0x0, 0x3, 0xf1, + 0xcc, 0x0, 0xf6, 0x0, 0xda, 0x54, 0xcb, 0x0, + 0x70, 0xb, 0x40, 0x1, 0x8c, 0xc9, 0x10, 0x0, + 0x0, + + /* U+3071 "ぱ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xaa, 0x40, + 0xab, 0x0, 0x0, 0x0, 0x4e, 0x37, 0xa, 0xc, + 0x70, 0x0, 0x0, 0x4, 0xd0, 0x9a, 0x30, 0xd4, + 0x0, 0x12, 0x11, 0x5d, 0x36, 0x50, 0xf, 0x20, + 0x7, 0xef, 0xff, 0xfd, 0xb6, 0x1, 0xf0, 0x0, + 0x0, 0x0, 0x3d, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x3, 0xd0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x3c, 0x12, 0x0, 0x0, + 0x1, 0xf0, 0x0, 0x3, 0xd7, 0x40, 0x19, 0xde, + 0xdf, 0x20, 0x0, 0x2e, 0xc0, 0xd, 0x61, 0x3, + 0xfe, 0x80, 0x2, 0xfa, 0x1, 0xf0, 0x0, 0x3f, + 0x1c, 0xb0, 0xf, 0x60, 0xd, 0xa5, 0x4c, 0xb0, + 0x6, 0x0, 0xc4, 0x0, 0x18, 0xcc, 0x91, 0x0, + 0x0, + + /* U+3072 "ひ" */ + 0x0, 0x0, 0x2, 0x50, 0x1, 0x50, 0x0, 0x0, + 0xab, 0xdf, 0xfc, 0x0, 0x1f, 0x0, 0x0, 0x7, + 0x53, 0xb9, 0x0, 0x0, 0xe5, 0x0, 0x0, 0x0, + 0x7b, 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x1e, + 0x10, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x8, 0x90, + 0x0, 0x0, 0xb, 0xab, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x0, 0xb3, 0xd8, 0x0, 0x2f, 0x0, 0x0, + 0x0, 0xc, 0x23, 0xe0, 0x4, 0xd0, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x6a, 0x0, 0x0, 0x1, 0xf4, 0x0, 0x0, 0x2e, + 0x50, 0x0, 0x0, 0x7, 0xe7, 0x33, 0x7e, 0x90, + 0x0, 0x0, 0x0, 0x5, 0xce, 0xec, 0x50, 0x0, + 0x0, 0x0, + + /* U+3073 "び" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, 0xa0, 0x0, + 0x0, 0x3, 0x20, 0x3, 0x3a, 0x4a, 0x35, 0xac, + 0xdf, 0xf6, 0x0, 0x89, 0x2b, 0x22, 0x36, 0x44, + 0xe3, 0x0, 0x5, 0xe0, 0x0, 0x0, 0x0, 0xd5, + 0x0, 0x0, 0x3f, 0x30, 0x0, 0x0, 0x7a, 0x0, + 0x0, 0x2, 0xfb, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x1c, 0xc4, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x1, 0xc2, 0xe2, 0x0, 0x98, 0x0, 0x0, 0x0, + 0x3b, 0x7, 0x80, 0xb, 0x60, 0x0, 0x0, 0x7, + 0x80, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0xd3, + 0x0, 0x0, 0x7, 0xc0, 0x0, 0x0, 0x7e, 0x0, + 0x0, 0x0, 0xd, 0xb4, 0x34, 0xaf, 0x30, 0x0, + 0x0, 0x0, 0x19, 0xdf, 0xea, 0x20, 0x0, 0x0, + 0x0, + + /* U+3074 "ぴ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xcb, 0x20, + 0x0, 0x0, 0x11, 0x0, 0x12, 0xb0, 0x2a, 0x37, + 0x8b, 0xdf, 0x80, 0x9, 0x9a, 0x35, 0x85, 0xa8, + 0x7f, 0x50, 0x0, 0x5d, 0x19, 0x80, 0x0, 0xb, + 0x70, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x6, 0xb0, + 0x0, 0x0, 0x2f, 0xa0, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0x1, 0xde, 0x30, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0x1b, 0x4e, 0x20, 0x8, 0x90, 0x0, 0x0, + 0x3, 0xb0, 0x89, 0x0, 0xb6, 0x0, 0x0, 0x0, + 0x79, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0xc, + 0x40, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x7, 0xd0, + 0x0, 0x0, 0x0, 0xdb, 0x43, 0x4a, 0xe2, 0x0, + 0x0, 0x0, 0x1, 0x9d, 0xfe, 0xa2, 0x0, 0x0, + 0x0, + + /* U+3075 "ふ" */ + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xae, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xcd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xb0, 0x2, 0xe1, 0x0, + 0x0, 0x0, 0x61, 0x0, 0xc7, 0x0, 0x8a, 0x0, + 0x0, 0x9, 0xd2, 0x0, 0x2f, 0x10, 0xe, 0x40, + 0x2, 0xcc, 0x10, 0x0, 0xd, 0x50, 0x7, 0xc0, + 0x1f, 0x80, 0x2, 0x0, 0x2f, 0x40, 0x1, 0xf2, + 0x2, 0x0, 0xe, 0xfe, 0xfa, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x23, 0x10, 0x0, 0x0, 0x0, + + /* U+3076 "ぶ" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xeb, 0x30, 0x0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf9, 0x4, 0x57, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x21, 0xd1, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x53, 0x0, + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0x40, 0x8, 0x90, 0x0, + 0x0, 0x0, 0x50, 0x4, 0xe2, 0x0, 0xe4, 0x0, + 0x0, 0x1b, 0xb0, 0x0, 0x8b, 0x0, 0x5e, 0x0, + 0x4, 0xea, 0x0, 0x0, 0x3f, 0x0, 0xd, 0x50, + 0x6f, 0x60, 0x0, 0x0, 0x5f, 0x0, 0x7, 0xc0, + 0x12, 0x0, 0x4e, 0xcd, 0xf7, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x2, 0x44, 0x10, 0x0, 0x0, 0x0, + + /* U+3077 "ぷ" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xeb, 0x30, 0x0, 0x29, 0x60, + 0x0, 0x0, 0x0, 0x7, 0xf9, 0x0, 0xc2, 0x86, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x20, 0xc0, 0x38, + 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x7c, 0xb1, + 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0x40, 0x5, 0xd0, 0x0, + 0x0, 0x0, 0x40, 0x4, 0xe2, 0x0, 0xb9, 0x0, + 0x0, 0xb, 0xb0, 0x0, 0x9a, 0x0, 0x2f, 0x30, + 0x4, 0xda, 0x0, 0x0, 0x3f, 0x0, 0x9, 0xa0, + 0x6f, 0x60, 0x0, 0x0, 0x5f, 0x0, 0x2, 0xf2, + 0x12, 0x0, 0x4e, 0xcd, 0xf7, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x2, 0x44, 0x20, 0x0, 0x0, 0x0, + + /* U+3078 "へ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x5c, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xf5, 0x1, 0xd9, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x80, 0x0, 0x2e, 0x70, 0x0, 0x0, + 0x0, 0xcb, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, + 0xc, 0xe1, 0x0, 0x0, 0x0, 0x5f, 0x50, 0x0, + 0x4, 0x30, 0x0, 0x0, 0x0, 0x7, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+3079 "べ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x63, 0x5c, 0x0, + 0x0, 0x0, 0x4, 0xb5, 0x0, 0x4c, 0xb, 0x60, + 0x0, 0x0, 0x3f, 0x9f, 0x50, 0xb, 0x51, 0x10, + 0x0, 0x1, 0xe6, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x90, 0x0, 0x7e, 0x20, 0x0, 0x0, + 0x0, 0xac, 0x0, 0x0, 0x9, 0xd1, 0x0, 0x0, + 0xa, 0xe1, 0x0, 0x0, 0x0, 0xbd, 0x10, 0x0, + 0xa, 0x40, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + + /* U+307A "ぺ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x85, 0xb0, 0x0, + 0x0, 0x3, 0x70, 0x0, 0xa1, 0xc, 0x0, 0x0, + 0x3, 0xfd, 0xd1, 0x7, 0x73, 0xb0, 0x0, 0x1, + 0xe6, 0xb, 0xb0, 0x8, 0xa1, 0x0, 0x0, 0xc9, + 0x0, 0xd, 0xa0, 0x0, 0x0, 0x0, 0xac, 0x0, + 0x0, 0x1e, 0x70, 0x0, 0x0, 0x9e, 0x10, 0x0, + 0x0, 0x3f, 0x60, 0x0, 0x1e, 0x40, 0x0, 0x0, + 0x0, 0x5f, 0x50, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x73, + + /* U+307B "ほ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5d, 0x0, 0x3, 0x33, 0x33, 0x45, 0x20, 0x7, + 0xa0, 0x0, 0xcc, 0xcd, 0xea, 0x93, 0x0, 0x97, + 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0xc, 0x40, + 0x0, 0x0, 0x4, 0xb0, 0x1, 0x0, 0xd2, 0x0, + 0x3e, 0xdd, 0xef, 0xff, 0xb0, 0xf, 0x0, 0x0, + 0x22, 0x26, 0xc1, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x4c, 0x0, 0x0, 0x1f, 0x15, 0x0, 0x0, + 0x3, 0xc0, 0x0, 0x0, 0xf7, 0x60, 0x1a, 0xdd, + 0xee, 0x40, 0x0, 0xf, 0xd0, 0xb, 0x70, 0x2, + 0xfb, 0xd3, 0x0, 0xdb, 0x0, 0xb6, 0x0, 0x6d, + 0x5, 0xe1, 0xa, 0x70, 0x2, 0xcf, 0xee, 0x50, + 0x1, 0x0, 0x22, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, + + /* U+307C "ぼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x41, 0xa0, 0xe, + 0x30, 0x2, 0x21, 0x12, 0x3a, 0x4b, 0x21, 0xf0, + 0x0, 0xcd, 0xde, 0xfc, 0xb9, 0x22, 0x3d, 0x0, + 0x0, 0x0, 0x2d, 0x0, 0x0, 0x6, 0xa0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x78, 0x0, 0x3, + 0x33, 0x4e, 0x45, 0x60, 0x9, 0x60, 0x0, 0xcc, + 0xdd, 0xfb, 0xa8, 0x0, 0xa5, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0xb, 0x42, 0x0, 0x0, 0x1, + 0xf0, 0x0, 0x0, 0xb6, 0xb0, 0x4, 0x9b, 0xaf, + 0x20, 0x0, 0xa, 0xc6, 0x6, 0xc5, 0x24, 0xfe, + 0x91, 0x0, 0x9f, 0x20, 0xa5, 0x0, 0x1f, 0x2b, + 0xd2, 0x7, 0xe0, 0x6, 0xc6, 0x39, 0xd0, 0x9, + 0x10, 0x4c, 0x0, 0x5, 0xbc, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+307D "ぽ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xaa, 0x30, + 0x92, 0x0, 0x11, 0x11, 0x12, 0xb4, 0x48, 0xf, + 0x10, 0xc, 0xdd, 0xef, 0xca, 0x77, 0x3, 0xd0, + 0x0, 0x0, 0x2, 0xd0, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0x2d, 0x0, 0x0, 0x7, 0x80, 0x0, + 0x33, 0x34, 0xe4, 0x56, 0x0, 0x97, 0x0, 0xc, + 0xcd, 0xdf, 0xba, 0x80, 0xa, 0x50, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x0, 0xb4, 0x20, 0x0, 0x0, + 0x1f, 0x0, 0x0, 0xb, 0x6b, 0x0, 0x49, 0xba, + 0xf2, 0x0, 0x0, 0xac, 0x60, 0x6c, 0x52, 0x4f, + 0xe9, 0x10, 0x9, 0xf2, 0xa, 0x50, 0x1, 0xf2, + 0xbd, 0x20, 0x7e, 0x0, 0x6c, 0x63, 0x9d, 0x0, + 0x91, 0x4, 0xc0, 0x0, 0x5b, 0xca, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+307E "ま" */ + 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x21, 0xe, 0xed, 0xcc, 0xfd, + 0xff, 0xe4, 0x0, 0x12, 0x34, 0xf2, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x5, 0x32, + 0x12, 0xf3, 0x46, 0x84, 0xb, 0xcd, 0xee, 0xfd, + 0xca, 0x94, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, 0x1, 0x9d, + 0xee, 0xf8, 0x10, 0x0, 0xb, 0x81, 0x0, 0xfb, + 0xf9, 0x10, 0xf, 0x10, 0x0, 0xf2, 0x2b, 0xe4, + 0xb, 0xa3, 0x38, 0xe0, 0x0, 0x77, 0x1, 0x8c, + 0xca, 0x30, 0x0, 0x0, + + /* U+307F "み" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xcd, 0xef, 0x80, 0x0, 0x0, 0x0, 0x24, + 0x32, 0x3f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x5, 0xd0, 0x0, + 0xc, 0x40, 0x0, 0x2a, 0xcf, 0xfb, 0x83, 0xd, + 0x20, 0x7, 0xd6, 0x5e, 0x25, 0x8e, 0xdf, 0x10, + 0x4d, 0x0, 0xa7, 0x0, 0x0, 0x7f, 0xc3, 0x95, + 0x2, 0xf1, 0x0, 0x0, 0x99, 0x9d, 0xb7, 0xc, + 0x80, 0x0, 0x3, 0xf2, 0x1, 0x5f, 0xec, 0x0, + 0x0, 0x2d, 0x70, 0x0, 0x1, 0x30, 0x0, 0x6, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x40, + 0x0, 0x0, + + /* U+3080 "む" */ + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x36, + 0xd6, 0xac, 0x0, 0xa2, 0x0, 0x3b, 0xce, 0xfa, + 0x74, 0x0, 0x6e, 0x50, 0x0, 0x4, 0xc0, 0x0, + 0x0, 0x3, 0xe5, 0x0, 0x8d, 0xc0, 0x0, 0x0, + 0x0, 0x32, 0xa, 0x85, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x0, 0xf0, 0x0, 0x0, 0x2, 0x0, 0xf, + 0x57, 0xb0, 0x0, 0x0, 0xf, 0x30, 0x5, 0xef, + 0x50, 0x0, 0x0, 0xf, 0x30, 0x0, 0xc, 0x50, + 0x0, 0x0, 0x2f, 0x10, 0x0, 0xa, 0xc5, 0x44, + 0x57, 0xeb, 0x0, 0x0, 0x1, 0x8b, 0xdc, 0xc9, + 0x50, 0x0, + + /* U+3081 "め" */ + 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, + 0x70, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0xf2, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, 0xa7, 0x4b, + 0xef, 0xfc, 0x70, 0x0, 0x0, 0x6f, 0xc5, 0x1a, + 0x74, 0xcc, 0x0, 0x1, 0xdf, 0x20, 0xf, 0x10, + 0xb, 0x80, 0xc, 0x78, 0x90, 0x6b, 0x0, 0x2, + 0xf0, 0x5c, 0x1, 0xf2, 0xe4, 0x0, 0x0, 0xf2, + 0xa8, 0x0, 0x8e, 0xb0, 0x0, 0x0, 0xf2, 0xb5, + 0x0, 0x4f, 0x70, 0x0, 0x3, 0xf0, 0x9a, 0x3, + 0xe8, 0xe1, 0x0, 0xd, 0x80, 0x2e, 0xfe, 0x40, + 0x0, 0x4, 0xdc, 0x0, 0x0, 0x30, 0x0, 0xa, + 0xef, 0x70, 0x0, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0x0, + + /* U+3082 "も" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0x0, 0x0, 0x0, 0x0, 0x6, 0x41, 0x3d, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xdf, 0xff, 0xef, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x20, 0xb5, 0x0, 0x0, 0x78, 0x0, + 0x3b, 0xef, 0xfd, 0xde, 0xe0, 0x1e, 0x40, 0x0, + 0x1, 0xf5, 0x32, 0x10, 0x7, 0xb0, 0x0, 0x0, + 0xf1, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0xf1, + 0x0, 0x0, 0x4, 0xe0, 0x0, 0x0, 0xc6, 0x0, + 0x0, 0xc, 0x90, 0x0, 0x0, 0x4f, 0x84, 0x57, + 0xec, 0x0, 0x0, 0x0, 0x3, 0xad, 0xca, 0x50, + 0x0, + + /* U+3083 "ゃ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x20, 0x0, 0x0, 0x0, 0x67, 0x0, + 0x5b, 0x0, 0x0, 0x0, 0x2, 0xf1, 0x5, 0xad, + 0xfc, 0x40, 0x0, 0xa, 0xce, 0xa5, 0x10, 0x5f, + 0x10, 0x5b, 0xef, 0x20, 0x0, 0x0, 0xd4, 0xb, + 0x60, 0xa7, 0x2, 0x0, 0x3f, 0x10, 0x0, 0x3, + 0xe0, 0xbf, 0xee, 0x50, 0x0, 0x0, 0xd, 0x40, + 0x11, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3084 "や" */ + 0x0, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x20, 0x1, 0xba, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x10, 0x0, 0xa4, 0x10, 0x0, 0x0, 0x0, + 0xb8, 0x0, 0x6b, 0xfe, 0xfd, 0x30, 0x0, 0x2, + 0xf9, 0xea, 0x51, 0x0, 0x6e, 0x10, 0x5, 0xbf, + 0xc1, 0x0, 0x0, 0x0, 0xd4, 0xe, 0xd6, 0x3f, + 0x10, 0x0, 0x0, 0xe, 0x30, 0x30, 0x0, 0xc6, + 0x6, 0x74, 0x5c, 0xc0, 0x0, 0x0, 0x6, 0xd0, + 0x4b, 0xdb, 0x80, 0x0, 0x0, 0x0, 0xf, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x94, 0x0, 0x0, + 0x0, + + /* U+3085 "ゅ" */ + 0x0, 0x0, 0x7, 0x60, 0x0, 0x6, 0xa0, 0x0, + 0x6a, 0x0, 0x0, 0x87, 0x2, 0xae, 0xfe, 0xc4, + 0xa, 0x55, 0xd4, 0x3c, 0x4, 0xe3, 0xb7, 0xc0, + 0x2, 0xd0, 0x6, 0x9c, 0xe1, 0x0, 0x2c, 0x0, + 0x4b, 0xba, 0x9, 0x4, 0xa0, 0x8, 0x9a, 0x70, + 0xba, 0x88, 0x6, 0xe2, 0x78, 0x0, 0x9f, 0xff, + 0xc3, 0x0, 0x0, 0x7, 0xc2, 0x0, 0x0, 0x0, + 0x7, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, + + /* U+3086 "ゆ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x25, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x6, 0x90, 0x0, 0x6, 0xb1, + 0x0, 0x0, 0x87, 0x0, 0x5c, 0xff, 0xde, 0x60, + 0xa, 0x50, 0xbb, 0x33, 0xd0, 0x2c, 0x80, 0xb4, + 0xb7, 0x0, 0x2e, 0x0, 0x1f, 0x1c, 0x89, 0x0, + 0x2, 0xe0, 0x0, 0xd4, 0xce, 0x0, 0x0, 0x3d, + 0x0, 0xe, 0x3b, 0x90, 0x97, 0x5, 0xc0, 0x3, + 0xf0, 0xa7, 0x1, 0xe8, 0x98, 0x5, 0xe6, 0x7, + 0x90, 0x1, 0xaf, 0xef, 0xd5, 0x0, 0x0, 0x0, + 0x7, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xa2, 0x0, 0x0, + 0x0, 0x0, + + /* U+3087 "ょ" */ + 0x0, 0x0, 0x57, 0x0, 0x0, 0x0, 0x0, 0x6a, + 0x0, 0x0, 0x0, 0x0, 0x6b, 0x34, 0x54, 0x0, + 0x0, 0x6e, 0xbb, 0x96, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0x0, 0x0, 0x2c, 0xec, 0xdf, 0x92, 0x0, + 0xc5, 0x0, 0x4d, 0x7e, 0x90, 0xb8, 0x11, 0xab, + 0x1, 0xba, 0x1a, 0xef, 0xc3, 0x0, 0x1, + + /* U+3088 "よ" */ + 0x0, 0x0, 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xb2, 0x34, 0x53, + 0x0, 0x0, 0x6, 0xfe, 0xdc, 0xb5, 0x0, 0x0, + 0x6, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, + 0x0, 0x1, 0x26, 0xc0, 0x0, 0x0, 0x9, 0xee, + 0xef, 0xf8, 0x20, 0x0, 0xaa, 0x10, 0x4, 0xe9, + 0xfb, 0x10, 0xd4, 0x0, 0x6, 0xe0, 0x1a, 0xe4, + 0x8d, 0x63, 0x6d, 0xa0, 0x0, 0x77, 0x6, 0xbd, + 0xc8, 0x10, 0x0, 0x0, + + /* U+3089 "ら" */ + 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xfe, 0xb8, 0x51, 0x0, 0x0, 0x0, 0x3, 0x69, + 0xb2, 0x0, 0x5, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x90, 0x0, 0x0, 0x0, 0x0, 0xa, 0x70, + 0x0, 0x0, 0x0, 0x0, 0xc, 0x50, 0x7c, 0xff, + 0xd8, 0x0, 0xe, 0x7e, 0x83, 0x0, 0x2b, 0xb0, + 0xf, 0xe4, 0x0, 0x0, 0x0, 0xe3, 0x2d, 0x20, + 0x0, 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xa0, + 0x0, 0x2a, 0x99, 0xbe, 0xf8, 0x0, 0x0, 0x8, + 0x98, 0x74, 0x0, 0x0, + + /* U+308A "り" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, + 0x0, 0x0, 0xe, 0x30, 0x5b, 0xc7, 0x0, 0xf, + 0x9, 0xc5, 0x5d, 0x90, 0x2e, 0x6a, 0x0, 0x1, + 0xf2, 0x3d, 0xc0, 0x0, 0x0, 0xb7, 0x4f, 0x50, + 0x0, 0x0, 0x8a, 0x5f, 0x10, 0x0, 0x0, 0x7b, + 0x5d, 0x0, 0x0, 0x0, 0x99, 0x4e, 0x0, 0x0, + 0x0, 0xc6, 0x13, 0x0, 0x0, 0x2, 0xf3, 0x0, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x5, 0xdc, + 0x0, 0x0, 0x39, 0xde, 0x60, 0x0, 0x0, 0x18, + 0x30, 0x0, 0x0, + + /* U+308B "る" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x1, + 0xee, 0xef, 0xff, 0xfd, 0x0, 0x0, 0x3, 0x21, + 0x0, 0x9d, 0x20, 0x0, 0x0, 0x0, 0x0, 0xbc, + 0x10, 0x0, 0x0, 0x0, 0x1, 0xda, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe9, 0x1, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xcc, 0xde, 0x91, 0x0, 0x7, 0xf8, + 0x20, 0x0, 0x8, 0xd1, 0xa, 0xd3, 0x0, 0x0, + 0x0, 0xa, 0x80, 0x61, 0x2, 0x9a, 0x60, 0x0, + 0x6b, 0x0, 0x0, 0xe6, 0x3b, 0xa0, 0x8, 0x90, + 0x0, 0x3e, 0x0, 0x1f, 0x34, 0xe3, 0x0, 0x0, + 0xd9, 0x43, 0xdd, 0xf6, 0x0, 0x0, 0x1, 0x8c, + 0xdb, 0x81, 0x0, + + /* U+308C "れ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x58, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x7, 0x9a, 0xdd, 0x2, 0xaf, 0xfd, 0x0, 0x0, + 0x7, 0x75, 0x96, 0x6d, 0x50, 0xe, 0x50, 0x0, + 0x0, 0x0, 0x8c, 0xc1, 0x0, 0xb, 0x60, 0x0, + 0x0, 0x1, 0xea, 0x0, 0x0, 0xc, 0x40, 0x0, + 0x0, 0xb, 0xf2, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x8a, 0xe2, 0x0, 0x0, 0xf, 0x0, 0x0, + 0x5, 0xd0, 0xe2, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x2f, 0x30, 0xe2, 0x0, 0x0, 0x3d, 0x0, 0x11, + 0x4, 0x0, 0xe2, 0x0, 0x0, 0x2f, 0x46, 0xe4, + 0x0, 0x0, 0xf3, 0x0, 0x0, 0xa, 0xfd, 0x50, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+308D "ろ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcc, 0xcd, 0xde, 0xf7, 0x0, 0x0, 0x24, 0x33, + 0x22, 0xcc, 0x10, 0x0, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xd9, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd7, 0x11, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xed, 0xee, 0x70, 0x0, 0x5, 0xfb, + 0x30, 0x0, 0x2b, 0xa0, 0x8, 0xf6, 0x0, 0x0, + 0x0, 0xf, 0x31, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xc0, 0x0, 0x0, + 0x66, 0x68, 0xbf, 0xb1, 0x0, 0x0, 0xa, 0xba, + 0xa6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+308F "わ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xef, + 0xfc, 0x1, 0x69, 0xa8, 0x30, 0x0, 0x32, 0xa, + 0x57, 0xea, 0x65, 0x8e, 0x80, 0x0, 0x0, 0xde, + 0xb1, 0x0, 0x0, 0x1e, 0x40, 0x0, 0x6f, 0x70, + 0x0, 0x0, 0x0, 0x89, 0x0, 0x2e, 0xf2, 0x0, + 0x0, 0x0, 0x7, 0xb0, 0xd, 0x6e, 0x20, 0x0, + 0x0, 0x0, 0xa8, 0xa, 0xb0, 0xe2, 0x0, 0x0, + 0x0, 0x4f, 0x32, 0xe1, 0xe, 0x20, 0x0, 0x0, + 0x7f, 0x60, 0x1, 0x0, 0xe2, 0x0, 0x4b, 0xfc, + 0x30, 0x0, 0x0, 0xf, 0x30, 0x2, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+3092 "を" */ + 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0x2, 0x20, 0x0, 0x1d, 0xcb, + 0xcf, 0xde, 0xfe, 0xa0, 0x0, 0x3, 0x34, 0xe6, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x1e, 0x8b, 0xb5, 0x0, + 0x4b, 0xd0, 0x0, 0xce, 0x73, 0x5f, 0x7c, 0xd6, + 0x10, 0xa, 0xd1, 0x0, 0x3e, 0xc4, 0x0, 0x0, + 0x2c, 0x10, 0x8, 0xcc, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xaa, 0xa, 0x60, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x9, 0x50, 0x0, 0x0, 0x0, 0x5, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf8, 0x43, + 0x34, 0x58, 0x0, 0x0, 0x0, 0x39, 0xde, 0xdd, + 0xca, 0x0, + + /* U+3093 "ん" */ + 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x7a, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xa4, 0x6f, 0x0, 0x0, 0x0, + 0x0, 0xea, 0x0, 0xe, 0x30, 0x0, 0x14, 0x7, + 0xd0, 0x0, 0xd, 0x30, 0x0, 0x7b, 0xe, 0x50, + 0x0, 0xd, 0x40, 0x1, 0xe4, 0x5e, 0x0, 0x0, + 0xc, 0x80, 0x1c, 0xa0, 0xc8, 0x0, 0x0, 0x6, + 0xfe, 0xfa, 0x0, 0x11, 0x0, 0x0, 0x0, 0x24, + 0x10, 0x0, + + /* U+30A1 "ァ" */ + 0x2e, 0xdd, 0xdd, 0xdd, 0xdd, 0xd7, 0x3, 0x33, + 0x33, 0x33, 0x35, 0xf3, 0x0, 0x0, 0x8, 0x40, + 0xd, 0x70, 0x0, 0x0, 0xc, 0x52, 0xd8, 0x0, + 0x0, 0x0, 0xd, 0x44, 0x70, 0x0, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6d, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0x90, 0x0, 0x0, 0x0, 0x1, 0xc7, + 0x0, 0x0, 0x0, 0x0, + + /* U+30A2 "ア" */ + 0x43, 0x22, 0x22, 0x22, 0x22, 0x23, 0x1f, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x63, 0x0, + 0x2e, 0x50, 0x0, 0x0, 0xc, 0x60, 0x4e, 0x60, + 0x0, 0x0, 0x0, 0xc6, 0x3f, 0x50, 0x0, 0x0, + 0x0, 0xd, 0x50, 0x20, 0x0, 0x0, 0x0, 0x1, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x5, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30A3 "ィ" */ + 0x0, 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, + 0x0, 0xb, 0xd1, 0x0, 0x0, 0x0, 0x3d, 0xb1, + 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x0, 0x17, + 0xed, 0xe0, 0x0, 0x5, 0xbf, 0xb3, 0x3e, 0x0, + 0x0, 0x67, 0x10, 0x3, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf0, 0x0, 0x0, + + /* U+30A4 "イ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xd2, 0x0, + 0x0, 0x0, 0x3, 0xbf, 0xf5, 0x0, 0x0, 0x1, + 0x7c, 0xf8, 0x1e, 0x50, 0x0, 0x6, 0xfd, 0x71, + 0x0, 0xe5, 0x0, 0x0, 0x13, 0x0, 0x0, 0xe, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x62, 0x0, 0x0, + + /* U+30A6 "ウ" */ + 0x0, 0x0, 0xf, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x40, 0x0, 0x0, 0x11, 0x11, 0x1e, 0x51, + 0x11, 0x10, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0xc8, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0xf4, 0xe3, 0x0, 0x0, 0x0, + 0x3, 0xf1, 0xc3, 0x0, 0x0, 0x0, 0xa, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x30, 0x0, 0x0, + 0x0, 0x1, 0xda, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x18, 0xfb, 0x10, 0x0, + 0x0, 0xa, 0xfe, 0x50, 0x0, 0x0, 0x0, 0x4, + 0x40, 0x0, 0x0, 0x0, + + /* U+30A7 "ェ" */ + 0x2, 0x11, 0x11, 0x11, 0x11, 0x10, 0xe, 0xfe, + 0xef, 0xfe, 0xef, 0x90, 0x0, 0x0, 0xd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xd, 0x40, 0x0, 0x0, 0x0, 0x0, 0xd, 0x40, + 0x0, 0x0, 0x11, 0x11, 0x1d, 0x51, 0x11, 0x10, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+30A8 "エ" */ + 0x4, 0x54, 0x44, 0x44, 0x44, 0x45, 0x30, 0xb, + 0xcc, 0xcc, 0xfd, 0xcc, 0xcc, 0x80, 0x0, 0x0, + 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x31, + + /* U+30AA "オ" */ + 0x0, 0x0, 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x0, 0x3d, 0xcc, 0xcc, + 0xcc, 0xfd, 0xcc, 0xd1, 0x15, 0x44, 0x44, 0x4b, + 0xf7, 0x44, 0x50, 0x0, 0x0, 0x0, 0x4e, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xf4, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x50, 0xd4, 0x0, 0x0, + 0x0, 0x7, 0xf5, 0x0, 0xd4, 0x0, 0x0, 0x2, + 0xbe, 0x30, 0x0, 0xd4, 0x0, 0x0, 0x6f, 0xa1, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x14, 0x0, 0x0, + 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, 0xa, 0xed, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x10, + 0x0, 0x0, + + /* U+30AB "カ" */ + 0x0, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x0, 0xdc, 0xcc, 0xdf, 0xcc, + 0xcc, 0xd5, 0x5, 0x44, 0x49, 0xc4, 0x44, 0x4c, + 0x70, 0x0, 0x0, 0x98, 0x0, 0x0, 0xb6, 0x0, + 0x0, 0xc, 0x40, 0x0, 0xb, 0x50, 0x0, 0x2, + 0xf1, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x8a, 0x0, + 0x0, 0xe, 0x30, 0x0, 0x2f, 0x30, 0x0, 0x0, + 0xf1, 0x0, 0xc, 0xa0, 0x0, 0x0, 0x3f, 0x0, + 0x1c, 0xd0, 0x0, 0x10, 0x8, 0xb0, 0xd, 0xc1, + 0x0, 0xb, 0xff, 0xf4, 0x0, 0x20, 0x0, 0x0, + 0x1, 0x20, 0x0, + + /* U+30AC "ガ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, + 0x0, 0x0, 0x5e, 0x0, 0x5, 0x85, 0xa0, 0x0, + 0x0, 0x4, 0xd0, 0x0, 0xe, 0x1d, 0x20, 0x0, + 0x0, 0x4d, 0x0, 0x0, 0x85, 0x10, 0x3, 0x32, + 0x27, 0xd2, 0x22, 0x23, 0x0, 0x0, 0xfe, 0xee, + 0xff, 0xee, 0xee, 0xf7, 0x0, 0x0, 0x0, 0x9, + 0x80, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0xc5, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x1f, 0x10, + 0x0, 0xd, 0x40, 0x0, 0x0, 0x7, 0xb0, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0x1, 0xe4, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0xbb, 0x0, 0x0, 0x3, + 0xf0, 0x0, 0x0, 0xae, 0x10, 0x0, 0x0, 0x8b, + 0x0, 0x0, 0xdd, 0x20, 0x0, 0xde, 0xef, 0x40, + 0x0, 0x3, 0x0, 0x0, 0x1, 0x33, 0x10, 0x0, + 0x0, + + /* U+30AD "キ" */ + 0x0, 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xa0, 0x3, 0x56, 0x0, 0x0, 0x13, 0x6a, + 0xfd, 0xff, 0xc9, 0x0, 0x1f, 0xfe, 0xc9, 0xf5, + 0x10, 0x0, 0x0, 0x4, 0x10, 0x0, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x30, 0x0, 0x0, 0x0, 0x9c, 0x7a, 0xdf, 0xf3, + 0x16, 0x8a, 0xdf, 0xff, 0xa7, 0x42, 0x0, 0x1d, + 0xa7, 0x41, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x70, + 0x0, 0x0, + + /* U+30AE "ギ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x8, 0x49, 0x60, 0x0, + 0x0, 0x1f, 0x20, 0x0, 0x2d, 0x1b, 0x0, 0x0, + 0x0, 0xd5, 0x0, 0x2, 0x71, 0x0, 0x0, 0x0, + 0x2c, 0xb9, 0xcf, 0xf8, 0x0, 0x4, 0xbd, 0xff, + 0xee, 0x75, 0x20, 0x0, 0x0, 0x27, 0x42, 0x4, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd6, + 0x46, 0x9c, 0xe0, 0x0, 0x24, 0x79, 0xcf, 0xfd, + 0xb8, 0x63, 0x0, 0x7f, 0xda, 0x85, 0x9b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, + 0x0, + + /* U+30AF "ク" */ + 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xb3, 0x33, 0x34, 0x10, 0x0, 0x8, 0xec, 0xcc, + 0xcc, 0xfb, 0x0, 0x5, 0xf2, 0x0, 0x0, 0xf, + 0x50, 0x5, 0xf4, 0x0, 0x0, 0x5, 0xe0, 0x9, + 0xe4, 0x0, 0x0, 0x0, 0xc8, 0x0, 0x82, 0x0, + 0x0, 0x0, 0x6e, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x28, + 0xed, 0x40, 0x0, 0x0, 0x0, 0x3, 0xb5, 0x0, + 0x0, 0x0, 0x0, + + /* U+30B0 "グ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x32, 0x0, 0x4, 0x47, 0x70, + 0x0, 0x0, 0x0, 0xd8, 0x0, 0x1, 0xd1, 0xd1, + 0x0, 0x0, 0x6, 0xe1, 0x0, 0x1, 0x73, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0xc9, 0x0, 0x0, 0x9, 0xb0, 0x0, + 0x0, 0xc, 0xb0, 0x0, 0x0, 0xe, 0x50, 0x0, + 0x3, 0xda, 0x0, 0x0, 0x0, 0x5e, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x0, 0x1, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xbe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x9f, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30B1 "ケ" */ + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xb5, + 0x55, 0x55, 0x55, 0x53, 0x0, 0x4f, 0xcc, 0xcc, + 0xfd, 0xcc, 0xc7, 0x1, 0xe7, 0x0, 0x0, 0xf4, + 0x0, 0x0, 0xc, 0xc0, 0x0, 0x1, 0xf1, 0x0, + 0x0, 0x8d, 0x10, 0x0, 0x4, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x2, 0xbe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x91, 0x0, 0x0, + 0x0, 0x0, + + /* U+30B2 "ゲ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, 0x2a, 0x40, + 0x0, 0x0, 0x4f, 0x10, 0x0, 0x4, 0xb2, 0xd0, + 0x0, 0x0, 0x9b, 0x0, 0x0, 0x0, 0xa3, 0x30, + 0x0, 0x0, 0xe7, 0x22, 0x22, 0x22, 0x23, 0x10, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x2f, 0x50, 0x0, 0x2f, 0x0, 0x0, 0x0, + 0x1, 0xda, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, + 0xc, 0xc0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, + 0x1, 0x10, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+30B3 "コ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfe, + 0xee, 0xee, 0xee, 0xf4, 0x13, 0x32, 0x22, 0x22, + 0x22, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe4, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x23, 0x33, 0x33, 0x33, 0x33, 0xe4, + + /* U+30B4 "ゴ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x1a, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xa1, 0xb0, 0x24, 0x33, 0x33, + 0x33, 0x33, 0x70, 0x0, 0x7f, 0xee, 0xee, 0xee, + 0xee, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf2, 0x0, 0x34, 0x44, 0x44, 0x44, + 0x44, 0xf2, 0x0, 0xae, 0xee, 0xee, 0xee, 0xee, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, + 0x0, + + /* U+30B5 "サ" */ + 0x0, 0x4, 0xc0, 0x0, 0x6, 0xc0, 0x0, 0x0, + 0x0, 0x4d, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, + 0x4, 0xd0, 0x0, 0x5, 0xc0, 0x0, 0x1, 0x10, + 0x5d, 0x0, 0x0, 0x6c, 0x1, 0x10, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x5d, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x4, 0xd0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x4d, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0x0, 0x5, 0xd0, 0x0, + 0xa, 0x80, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xdd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, + 0x0, + + /* U+30B6 "ザ" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x40, 0x24, 0x40, + 0x0, 0x0, 0xf3, 0x0, 0x1, 0xf1, 0xc2, 0xb0, + 0x0, 0x0, 0xe3, 0x0, 0x1, 0xf0, 0x66, 0x60, + 0x0, 0x0, 0xe3, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x2, 0x21, 0xe5, 0x11, 0x13, 0xf2, 0x22, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xf3, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x30, 0x0, 0xb, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, 0x0, + + /* U+30B7 "シ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xc0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x20, 0xc, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0xc6, 0x0, 0x5e, 0x90, 0x0, 0x0, 0x8, + 0xe1, 0x0, 0x1, 0x20, 0x0, 0x0, 0x7f, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xdd, 0x20, 0x0, 0x0, 0x0, + 0x1, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x4, 0x9f, + 0xd5, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30B8 "ジ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x60, 0x0, + 0x0, 0xc8, 0x0, 0x0, 0x29, 0xd, 0x40, 0x0, + 0x3, 0xcd, 0x30, 0x0, 0xc4, 0x3c, 0x0, 0x0, + 0x0, 0x8c, 0x0, 0x3, 0xa0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x3, 0xeb, 0x20, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x1, 0x9f, 0x50, + 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x8, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x38, 0xfd, 0x50, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+30B9 "ス" */ + 0x0, 0x22, 0x11, 0x11, 0x12, 0x20, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbd, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xc1, 0x4f, 0x70, 0x0, 0x0, + 0x3, 0xdb, 0x0, 0x4, 0xf8, 0x0, 0x1, 0x8f, + 0x80, 0x0, 0x0, 0x4f, 0x60, 0x1e, 0xb2, 0x0, + 0x0, 0x0, 0x6, 0xf1, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x20, + + /* U+30BA "ズ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x66, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1d, 0x1a, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x61, 0x0, 0x1, 0x32, + 0x22, 0x22, 0x29, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xed, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xa0, 0xad, + 0x20, 0x0, 0x0, 0x0, 0x4e, 0x90, 0x0, 0xae, + 0x20, 0x0, 0x1, 0x9f, 0x70, 0x0, 0x0, 0xbd, + 0x10, 0x5, 0xfb, 0x20, 0x0, 0x0, 0x0, 0xdb, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, + 0x0, + + /* U+30BB "セ" */ + 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf1, 0x0, 0x2, 0x69, 0xa0, 0x0, 0x0, + 0x1f, 0x79, 0xcf, 0xeb, 0xea, 0x0, 0x7a, 0xcf, + 0xfc, 0x85, 0x20, 0x3f, 0x10, 0xa, 0x85, 0x2f, + 0x10, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, 0xf1, + 0x0, 0xb, 0xa0, 0x0, 0x0, 0x0, 0xf, 0x10, + 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf6, 0x0, 0x0, + 0x2, 0x20, 0x0, 0x0, 0x7, 0xfe, 0xde, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x23, 0x32, 0x10, + 0x0, + + /* U+30BC "ゼ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x13, 0x0, 0x0, 0x5, 0x57, 0x80, + 0x0, 0x0, 0x4f, 0x0, 0x0, 0x1, 0xd1, 0xb1, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x25, 0x97, 0x0, + 0x0, 0x0, 0x4e, 0x59, 0xcf, 0xeb, 0xf7, 0x0, + 0x17, 0x9c, 0xff, 0xb8, 0x52, 0x6, 0xd0, 0x0, + 0xc, 0x85, 0x6e, 0x0, 0x0, 0x1e, 0x40, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0xd8, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x6, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x20, 0x0, 0x0, 0x21, 0x0, + 0x0, 0x0, 0xb, 0xfd, 0xdd, 0xef, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x23, 0x44, 0x32, 0x0, 0x0, + + /* U+30BD "ソ" */ + 0x11, 0x0, 0x0, 0x0, 0x0, 0x83, 0xac, 0x0, + 0x0, 0x0, 0x0, 0xf4, 0x1f, 0x50, 0x0, 0x0, + 0x4, 0xf0, 0x7, 0xe0, 0x0, 0x0, 0x8, 0xb0, + 0x0, 0xe8, 0x0, 0x0, 0xd, 0x70, 0x0, 0x54, + 0x0, 0x0, 0x5e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd8, 0x0, 0x0, 0x0, 0x0, 0x8, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, + 0x7, 0xf4, 0x0, 0x0, 0x0, 0x2, 0xbf, 0x50, + 0x0, 0x0, 0x0, 0x5f, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + + /* U+30BF "タ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xee, + 0xee, 0xf9, 0x0, 0x1, 0xe7, 0x11, 0x11, 0x2d, + 0x70, 0x0, 0xc9, 0x0, 0x0, 0x3, 0xf1, 0x2, + 0xca, 0x4, 0x0, 0x0, 0x9a, 0x2, 0xe8, 0x0, + 0xbe, 0x40, 0x3f, 0x20, 0x2, 0x0, 0x0, 0x6f, + 0xac, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xe9, 0xf6, 0x0, + 0x0, 0x0, 0x1c, 0xc1, 0x5, 0x40, 0x0, 0x2, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30C0 "ダ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x3, 0x38, 0x60, 0x0, + 0x0, 0xb, 0xb0, 0x0, 0x2d, 0x1d, 0x10, 0x0, + 0x3, 0xf3, 0x11, 0x11, 0xa4, 0x10, 0x0, 0x0, + 0xdf, 0xee, 0xee, 0xff, 0x20, 0x0, 0x0, 0xab, + 0x0, 0x0, 0x6, 0xd0, 0x0, 0x0, 0x9d, 0x10, + 0x0, 0x0, 0xc7, 0x0, 0x0, 0xad, 0x23, 0x60, + 0x0, 0x3f, 0x10, 0x0, 0xab, 0x0, 0x3d, 0xc2, + 0xd, 0x80, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfb, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf6, 0xce, + 0x10, 0x0, 0x0, 0x0, 0x1a, 0xe3, 0x0, 0x50, + 0x0, 0x0, 0x1, 0x9f, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xfd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30C1 "チ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x35, 0x8b, 0xfa, 0x0, 0x2, 0xff, + 0xed, 0xdf, 0x85, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x5e, 0x22, + 0x22, 0x21, 0x8f, 0xee, 0xee, 0xff, 0xee, 0xee, + 0xf9, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x20, 0x0, 0x0, + 0x0, 0x0, + + /* U+30C3 "ッ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x3e, 0x0, 0x0, 0x82, 0xe, 0x50, 0xd, 0x40, + 0x1, 0xf3, 0x7, 0xb0, 0x7, 0xa0, 0x5, 0xd0, + 0x1, 0xf2, 0x2, 0x60, 0xb, 0x80, 0x0, 0x61, + 0x0, 0x0, 0x4f, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xd7, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xb0, 0x0, + 0x0, 0x0, 0x2, 0xdb, 0x0, 0x0, 0x0, 0x2, + 0x9f, 0x90, 0x0, 0x0, 0x0, 0xc, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30C4 "ツ" */ + 0x0, 0x0, 0x8, 0x60, 0x0, 0x0, 0x30, 0x2d, + 0x0, 0x6, 0xd0, 0x0, 0x3, 0xf2, 0xd, 0x60, + 0x0, 0xf3, 0x0, 0x7, 0xd0, 0x6, 0xd0, 0x0, + 0xa9, 0x0, 0xb, 0x80, 0x1, 0xf3, 0x0, 0x34, + 0x0, 0x1f, 0x30, 0x0, 0x84, 0x0, 0x0, 0x0, + 0x8b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfd, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, + 0x0, 0x0, 0x0, + + /* U+30C6 "テ" */ + 0x0, 0x6e, 0xee, 0xee, 0xee, 0xee, 0x0, 0x0, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7e, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xeb, 0x13, 0x22, 0x22, 0x4f, 0x32, + 0x22, 0x22, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, 0x0, + + /* U+30C7 "デ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x65, 0x90, 0x0, + 0x55, 0x44, 0x44, 0x45, 0x3d, 0x2c, 0x20, 0xb, + 0xbb, 0xbb, 0xbb, 0xb6, 0x45, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc2, 0x4, 0x54, 0x44, 0x4b, + 0xa4, 0x44, 0x45, 0x10, 0x0, 0x0, 0x0, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8e, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xcd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+30C8 "ト" */ + 0x6e, 0x0, 0x0, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0x5d, 0x0, 0x0, 0x0, 0x5, 0xd0, 0x0, + 0x0, 0x0, 0x5f, 0x72, 0x0, 0x0, 0x5, 0xfc, + 0xfc, 0x61, 0x0, 0x5d, 0x1, 0x7e, 0xf9, 0x25, + 0xd0, 0x0, 0x5, 0xc7, 0x5d, 0x0, 0x0, 0x0, + 0x5, 0xd0, 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, + 0x0, 0x5, 0xe0, 0x0, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0x0, + + /* U+30C9 "ド" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, 0x0, + 0x23, 0xc0, 0x1f, 0x20, 0x2, 0xd1, 0xa6, 0xf, + 0x10, 0x0, 0x79, 0x15, 0xf, 0x10, 0x0, 0x3, + 0x0, 0xf, 0xa4, 0x0, 0x0, 0x0, 0xf, 0xae, + 0xe9, 0x30, 0x0, 0xf, 0x20, 0x5b, 0xfc, 0x50, + 0xf, 0x20, 0x0, 0x29, 0xb0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, 0x1f, + 0x20, 0x0, 0x0, 0x0, 0x1f, 0x20, 0x0, 0x0, + 0x0, 0x1b, 0x20, 0x0, 0x0, 0x0, + + /* U+30CA "ナ" */ + 0x0, 0x0, 0x0, 0x3f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0x0, 0x0, 0x0, 0x5c, 0xcc, 0xcc, 0xdf, + 0xcc, 0xcc, 0xc9, 0x25, 0x55, 0x55, 0x7f, 0x55, + 0x55, 0x53, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30CB "ニ" */ + 0x1, 0x43, 0x33, 0x33, 0x33, 0x33, 0x0, 0x3, + 0xfe, 0xee, 0xee, 0xee, 0xeb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x35, 0x44, 0x44, 0x44, 0x44, 0x44, 0x50, 0x9f, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xf1, + + /* U+30CD "ネ" */ + 0x0, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x1, 0x32, + 0x22, 0x7c, 0x22, 0x22, 0x0, 0x7, 0xee, 0xee, + 0xee, 0xee, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xce, 0x21, 0x10, 0x0, + 0x0, 0x5, 0xbe, 0xcb, 0x7, 0xf7, 0x0, 0x3a, + 0xed, 0x70, 0x6b, 0x0, 0x3d, 0xd3, 0x19, 0x30, + 0x0, 0x6b, 0x0, 0x0, 0x86, 0x0, 0x0, 0x0, + 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, + 0x0, 0x0, + + /* U+30CE "ノ" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x90, 0x0, 0x0, + 0x0, 0x3, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0x10, 0x0, 0x0, + 0x0, 0x4f, 0x60, 0x0, 0x0, 0x0, 0x5f, 0x90, + 0x0, 0x0, 0x0, 0x7f, 0x80, 0x0, 0x0, 0x5, + 0xde, 0x50, 0x0, 0x0, 0x5, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30CF "ハ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x0, + 0xf4, 0x0, 0x1f, 0x40, 0x0, 0x0, 0x2, 0xf0, + 0x0, 0x9, 0xb0, 0x0, 0x0, 0x6, 0xc0, 0x0, + 0x2, 0xf2, 0x0, 0x0, 0xc, 0x70, 0x0, 0x0, + 0xb9, 0x0, 0x0, 0x1f, 0x20, 0x0, 0x0, 0x5f, + 0x0, 0x0, 0x8c, 0x0, 0x0, 0x0, 0xe, 0x50, + 0x1, 0xf5, 0x0, 0x0, 0x0, 0x9, 0xb0, 0x9, + 0xd0, 0x0, 0x0, 0x0, 0x3, 0xf1, 0x3f, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xe6, 0x48, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x75, + + /* U+30D0 "バ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x29, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0x2d, 0x0, 0x0, + 0x9, 0x20, 0x7, 0x60, 0xa4, 0x40, 0x0, 0x1, + 0xf2, 0x0, 0x5e, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x0, 0x8, 0xa0, + 0x0, 0x7, 0xd0, 0x0, 0x0, 0x0, 0xd6, 0x0, + 0x0, 0x1f, 0x40, 0x0, 0x0, 0x3f, 0x10, 0x0, + 0x0, 0x9b, 0x0, 0x0, 0x9, 0xb0, 0x0, 0x0, + 0x3, 0xf1, 0x0, 0x1, 0xf4, 0x0, 0x0, 0x0, + 0xd, 0x70, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0x0, 0x3f, 0x40, 0x0, 0x0, 0x0, 0x3, + 0xf2, 0x9, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+30D1 "パ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcb, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0, 0x29, 0x0, + 0x0, 0x74, 0x0, 0x59, 0xc, 0x26, 0x80, 0x0, + 0xe, 0x60, 0x2, 0xf3, 0x29, 0x80, 0x0, 0x1, + 0xf2, 0x0, 0xa, 0xa0, 0x0, 0x0, 0x0, 0x5e, + 0x0, 0x0, 0x3f, 0x20, 0x0, 0x0, 0xa, 0x90, + 0x0, 0x0, 0xc9, 0x0, 0x0, 0x0, 0xf4, 0x0, + 0x0, 0x5, 0xf0, 0x0, 0x0, 0x5e, 0x0, 0x0, + 0x0, 0xe, 0x60, 0x0, 0xd, 0x70, 0x0, 0x0, + 0x0, 0x9c, 0x0, 0x5, 0xf1, 0x0, 0x0, 0x0, + 0x3, 0xf2, 0x1, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x70, 0x6d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+30D2 "ヒ" */ + 0x13, 0x0, 0x0, 0x0, 0x0, 0x3, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xe0, 0x0, 0x0, 0x17, 0xd0, 0x3e, 0x0, + 0x5, 0xaf, 0xc6, 0x3, 0xf7, 0xbf, 0xd8, 0x20, + 0x0, 0x3f, 0xb6, 0x20, 0x0, 0x0, 0x3, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf9, 0x42, 0x23, + 0x35, 0x76, 0x4, 0xbe, 0xff, 0xee, 0xdc, 0x70, + + /* U+30D3 "ビ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x43, 0xa0, 0xe4, 0x0, 0x0, 0x0, + 0xc2, 0xb4, 0xe3, 0x0, 0x0, 0x0, 0x4a, 0x12, + 0xe3, 0x0, 0x0, 0x0, 0x70, 0x0, 0xe3, 0x0, + 0x4, 0x9f, 0xc1, 0x0, 0xe5, 0x59, 0xee, 0x93, + 0x0, 0x0, 0xef, 0xc8, 0x30, 0x0, 0x0, 0x0, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd8, 0x0, 0x0, 0x0, 0x14, 0x0, 0x5e, 0xfe, + 0xde, 0xff, 0xff, 0x0, 0x0, 0x23, 0x43, 0x32, + 0x10, 0x0, + + /* U+30D4 "ピ" */ + 0x0, 0x0, 0x0, 0x0, 0x2c, 0xc4, 0xf4, 0x0, + 0x0, 0x0, 0x92, 0xb, 0xe3, 0x0, 0x0, 0x0, + 0x85, 0x3b, 0xe3, 0x0, 0x0, 0x0, 0x78, 0x91, + 0xe3, 0x0, 0x3, 0x9e, 0xd1, 0x0, 0xe4, 0x49, + 0xee, 0x93, 0x0, 0x0, 0xef, 0xd8, 0x40, 0x0, + 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd8, 0x0, 0x0, 0x0, 0x14, 0x0, + 0x5e, 0xfe, 0xde, 0xff, 0xff, 0x0, 0x0, 0x23, + 0x43, 0x32, 0x10, 0x0, + + /* U+30D5 "フ" */ + 0x12, 0x11, 0x11, 0x11, 0x11, 0x20, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x3, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x7d, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x2d, 0x90, 0x0, 0x0, 0x0, + 0x5, 0xe8, 0x0, 0x0, 0x0, 0x5, 0xcf, 0x70, + 0x0, 0x0, 0x0, 0xcf, 0x92, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+30D6 "ブ" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x5, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x92, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc2, 0x62, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x22, 0x22, 0x22, 0x22, + 0x23, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xe7, 0x0, 0x0, 0x0, 0x0, 0x4, 0xbf, 0x70, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+30D7 "プ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb0, 0x1a, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x16, 0xde, + 0x50, 0x0, 0x0, 0x0, 0x1, 0xee, 0x81, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30D9 "ベ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x35, 0xc0, 0x0, + 0x0, 0x4, 0xb5, 0x0, 0x4c, 0xb, 0x50, 0x0, + 0x3, 0xfb, 0xf6, 0x0, 0xb4, 0x10, 0x0, 0x1, + 0xe7, 0x4, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xca, + 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0xbd, 0x0, + 0x0, 0x5, 0xf5, 0x0, 0x0, 0xbe, 0x20, 0x0, + 0x0, 0x6, 0xf4, 0x0, 0x7, 0x40, 0x0, 0x0, + 0x0, 0x8, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, + + /* U+30DA "ペ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x92, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x63, 0xc0, 0x0, + 0x0, 0xa, 0xe5, 0x0, 0xa2, 0xc, 0x0, 0x0, + 0x9, 0xd8, 0xf5, 0x3, 0xcb, 0x60, 0x0, 0x6, + 0xe1, 0x5, 0xf5, 0x0, 0x10, 0x0, 0x4, 0xf3, + 0x0, 0x5, 0xf4, 0x0, 0x0, 0x3, 0xf7, 0x0, + 0x0, 0x7, 0xf3, 0x0, 0x1, 0xfa, 0x0, 0x0, + 0x0, 0x8, 0xe2, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, + + /* U+30DB "ホ" */ + 0x0, 0x0, 0x0, 0x4f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x0, 0xf, 0xee, 0xee, + 0xff, 0xee, 0xee, 0xf7, 0x3, 0x22, 0x22, 0x5e, + 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x30, 0x3e, 0x0, 0x55, + 0x0, 0x0, 0x4e, 0x10, 0x3e, 0x0, 0x3f, 0x20, + 0x0, 0xd6, 0x0, 0x3e, 0x0, 0x8, 0xc0, 0xb, + 0xb0, 0x0, 0x3e, 0x0, 0x0, 0xe6, 0x3c, 0x10, + 0x0, 0x3e, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0xae, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, + 0x0, 0x0, + + /* U+30DC "ボ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9, 0x0, + 0x0, 0x0, 0x0, 0xe4, 0x0, 0xb4, 0x87, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x2, 0xc0, 0x60, 0x34, + 0x33, 0x33, 0xe7, 0x33, 0x34, 0x40, 0xa, 0xdc, + 0xcc, 0xcf, 0xdc, 0xcc, 0xdb, 0x0, 0x0, 0x0, + 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x0, + 0xe4, 0x2, 0xe1, 0x0, 0x0, 0x2f, 0x20, 0xe, + 0x40, 0x9, 0xb0, 0x0, 0xd, 0x80, 0x0, 0xe4, + 0x0, 0xe, 0x50, 0xb, 0xc0, 0x0, 0xe, 0x40, + 0x0, 0x6e, 0x10, 0x71, 0x0, 0x0, 0xe4, 0x0, + 0x0, 0x60, 0x0, 0x0, 0x24, 0x4f, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xcd, 0xa0, 0x0, 0x0, + 0x0, + + /* U+30DD "ポ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaa, 0x30, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0xb0, 0x2a, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x8, 0x8a, 0x50, 0x34, + 0x33, 0x33, 0xe7, 0x33, 0x35, 0x50, 0xa, 0xdc, + 0xcc, 0xcf, 0xdc, 0xcc, 0xdc, 0x0, 0x0, 0x0, + 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x0, + 0xe4, 0x2, 0xe1, 0x0, 0x0, 0x2f, 0x20, 0xe, + 0x40, 0x9, 0xc0, 0x0, 0xd, 0x80, 0x0, 0xe4, + 0x0, 0xe, 0x70, 0xb, 0xc0, 0x0, 0xe, 0x40, + 0x0, 0x5f, 0x20, 0x71, 0x0, 0x0, 0xe4, 0x0, + 0x0, 0x60, 0x0, 0x0, 0x24, 0x4f, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xcd, 0xa0, 0x0, 0x0, + 0x0, + + /* U+30DE "マ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x2, 0x21, + 0x11, 0x11, 0x11, 0x17, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcb, 0x0, 0x0, 0x7, 0x10, 0x0, 0xb, + 0xd0, 0x0, 0x0, 0xa, 0xe3, 0x0, 0xad, 0x10, + 0x0, 0x0, 0x0, 0x8f, 0x6c, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, + + /* U+30DF "ミ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xeb, + 0x85, 0x10, 0x0, 0x0, 0x13, 0x69, 0xdf, 0xd9, + 0x40, 0x0, 0x0, 0x0, 0x14, 0x99, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0x85, 0x10, 0x0, + 0x0, 0x2, 0x69, 0xdf, 0xd9, 0x50, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xea, 0x73, 0x0, 0x0, 0x0, 0x14, 0x8b, 0xff, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x38, 0xdf, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+30E0 "ム" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc7, 0x0, 0x2, 0x30, + 0x0, 0x0, 0x2, 0xf1, 0x0, 0x6, 0xe1, 0x0, + 0x0, 0x7, 0xc0, 0x0, 0x0, 0xb9, 0x0, 0x0, + 0xd, 0x60, 0x0, 0x0, 0x3f, 0x20, 0x0, 0x3f, + 0x10, 0x23, 0x57, 0x9f, 0xa0, 0x7a, 0xdf, 0xef, + 0xfe, 0xca, 0x87, 0xf3, 0x68, 0x65, 0x31, 0x0, + 0x0, 0x0, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x32, + + /* U+30E1 "メ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe5, 0x0, 0x0, 0x71, 0x0, 0x0, + 0x5e, 0x0, 0x0, 0xb, 0xe5, 0x0, 0xd, 0x80, + 0x0, 0x0, 0x6, 0xf9, 0x6, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xdd, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xbd, + 0x8f, 0x40, 0x0, 0x0, 0x0, 0xbd, 0x10, 0x8f, + 0x50, 0x0, 0x1, 0xbd, 0x10, 0x0, 0x7f, 0x60, + 0x5, 0xeb, 0x10, 0x0, 0x0, 0x76, 0xb, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+30E2 "モ" */ + 0x0, 0x22, 0x11, 0x11, 0x11, 0x12, 0x0, 0x1, + 0xff, 0xef, 0xfe, 0xee, 0xff, 0x30, 0x0, 0x0, + 0x7, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb0, + 0x0, 0x0, 0x0, 0x1f, 0xee, 0xef, 0xfe, 0xee, + 0xee, 0xe7, 0x3, 0x32, 0x29, 0xc2, 0x22, 0x22, + 0x31, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xe2, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x11, 0x0, + + /* U+30E3 "ャ" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa0, 0x14, + 0x7b, 0xe9, 0x2, 0x5a, 0xfe, 0xeb, 0x76, 0xf2, + 0x6e, 0xb7, 0xe4, 0x0, 0xc, 0x70, 0x0, 0x0, + 0xa8, 0x0, 0xab, 0x0, 0x0, 0x0, 0x5c, 0x4, + 0xc1, 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, + + /* U+30E4 "ヤ" */ + 0x0, 0x6, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xd0, 0x0, 0x0, 0x14, 0x82, 0x0, 0x1, 0xf4, + 0x58, 0xbe, 0xfd, 0xf4, 0x46, 0x9c, 0xff, 0xb8, + 0x52, 0xa, 0xa0, 0xab, 0x85, 0x9b, 0x0, 0x0, + 0x6e, 0x0, 0x0, 0x0, 0x3f, 0x0, 0x5, 0xf3, + 0x0, 0x0, 0x0, 0xf, 0x40, 0x4f, 0x50, 0x0, + 0x0, 0x0, 0xb, 0x80, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, + 0x0, 0x0, + + /* U+30E5 "ュ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x22, 0x22, 0x22, + 0x8c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf3, 0x0, 0x12, 0x22, 0x22, 0x23, 0xf3, 0x22, + 0x5f, 0xee, 0xee, 0xee, 0xee, 0xfd, + + /* U+30E7 "ョ" */ + 0x7e, 0xee, 0xee, 0xee, 0xe2, 0x12, 0x21, 0x11, + 0x11, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x2f, 0xfe, 0xee, 0xee, + 0xf2, 0x1, 0x11, 0x11, 0x11, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xe2, + 0xbf, 0xee, 0xee, 0xee, 0xf2, 0x11, 0x11, 0x11, + 0x11, 0xe3, + + /* U+30E8 "ヨ" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x10, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x3, 0x33, + 0x33, 0x33, 0x33, 0xf3, 0xb, 0xed, 0xdd, 0xdd, + 0xdd, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf3, 0x35, 0x55, 0x55, 0x55, + 0x55, 0xf3, 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, + + /* U+30E9 "ラ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x22, 0x11, + 0x11, 0x12, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x11, 0x11, 0x11, 0x11, 0x21, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xe4, 0x0, 0x0, 0x0, 0x8, + 0xee, 0x81, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, + 0x0, 0x0, 0x0, + + /* U+30EA "リ" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0xf5, 0x4e, 0x0, 0x0, 0x0, 0xe4, 0x3e, + 0x0, 0x0, 0x0, 0xe4, 0x3e, 0x0, 0x0, 0x0, + 0xe4, 0x3e, 0x0, 0x0, 0x0, 0xf4, 0x3e, 0x0, + 0x0, 0x0, 0xf3, 0x4e, 0x0, 0x0, 0x1, 0xf2, + 0x3b, 0x0, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x0, + 0x9, 0xa0, 0x0, 0x0, 0x0, 0x5f, 0x30, 0x0, + 0x0, 0x7, 0xf6, 0x0, 0x0, 0x7, 0xee, 0x40, + 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, + + /* U+30EB "ル" */ + 0x0, 0x0, 0xc5, 0x0, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x50, 0xd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x50, 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xd4, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x30, 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, 0xf1, + 0x0, 0xd5, 0x0, 0x0, 0x10, 0x0, 0x3f, 0x0, + 0xd, 0x50, 0x0, 0xb9, 0x0, 0xa, 0xa0, 0x0, + 0xd5, 0x0, 0xbc, 0x0, 0x2, 0xf2, 0x0, 0xd, + 0x51, 0xcc, 0x0, 0x1, 0xda, 0x0, 0x0, 0xdb, + 0xf9, 0x0, 0x0, 0xbc, 0x0, 0x0, 0xd, 0xd3, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, + + /* U+30EC "レ" */ + 0x4d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x0, 0x0, 0x51, 0x3e, 0x0, 0x0, 0x0, + 0x6, 0xf3, 0x3e, 0x0, 0x0, 0x0, 0x8f, 0x40, + 0x3e, 0x0, 0x0, 0x2c, 0xd3, 0x0, 0x3e, 0x0, + 0x2a, 0xf9, 0x0, 0x0, 0x3f, 0x6c, 0xfa, 0x20, + 0x0, 0x0, 0x3f, 0xc7, 0x10, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30ED "ロ" */ + 0xcf, 0xee, 0xee, 0xee, 0xee, 0xf4, 0xc7, 0x22, + 0x22, 0x22, 0x22, 0xe4, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0xc5, 0x0, 0x0, 0x0, 0x0, 0xe3, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0xe3, 0xc5, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0xc5, 0x0, 0x0, 0x0, 0x0, 0xe3, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0xe3, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xd7, 0x22, 0x22, 0x22, + 0x22, 0xe4, + + /* U+30EF "ワ" */ + 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0xc8, 0xe4, 0x0, 0x0, 0x0, 0x0, 0xe5, + 0xe4, 0x0, 0x0, 0x0, 0x1, 0xf2, 0xe4, 0x0, + 0x0, 0x0, 0x6, 0xe0, 0x31, 0x0, 0x0, 0x0, + 0xd, 0x90, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0x0, 0x2, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xa0, 0x0, 0x0, 0x0, 0x19, 0xf8, + 0x0, 0x0, 0x0, 0xa, 0xfc, 0x30, 0x0, 0x0, + 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, + + /* U+30F3 "ン" */ + 0x6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x50, 0x0, + 0x0, 0x56, 0x0, 0x0, 0x40, 0x0, 0x0, 0xe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xa, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x2c, + 0xc1, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xa0, 0x0, + 0x0, 0x2, 0x6b, 0xfc, 0x30, 0x0, 0x0, 0x6, + 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+30F6 "ヶ" */ + 0x0, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x21, 0x11, + 0x11, 0x11, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf9, + 0x5, 0xe1, 0x0, 0x3e, 0x0, 0x0, 0x5f, 0x40, + 0x0, 0x5b, 0x0, 0x0, 0x55, 0x0, 0x0, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0x10, 0x0, 0x0, 0x0, 0xb, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + + /* U+30FC "ー" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xfe, 0xee, 0xee, 0xee, 0xef, 0xf1, 0x35, 0x54, + 0x44, 0x44, 0x44, 0x45, 0x50, + + /* U+4E00 "一" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, + + /* U+4E03 "七" */ + 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0x0, 0x35, 0x8b, 0xdf, 0x50, 0x3, 0x5a, + 0xfd, 0xfe, 0xc9, 0x64, 0x10, 0xcf, 0xeb, 0xbd, + 0x31, 0x0, 0x0, 0x0, 0x2, 0x0, 0x5, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x5, 0xc0, 0x0, 0x0, 0x3f, 0x42, 0x22, 0x23, + 0xb9, 0x0, 0x0, 0x0, 0x8d, 0xee, 0xee, 0xdb, + 0x10, + + /* U+4E07 "万" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0xf, 0x31, 0x11, 0x11, 0xa7, 0x0, + 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, 0xb6, 0x0, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0xc5, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, 0xf1, 0x0, + 0x0, 0x2e, 0x30, 0x0, 0x0, 0x2, 0xf0, 0x0, + 0x4, 0xe6, 0x0, 0x0, 0x0, 0x7, 0xc0, 0x0, + 0x2e, 0x40, 0x0, 0x0, 0xef, 0xfe, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E08 "丈" */ + 0x0, 0x0, 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x11, + 0x11, 0x11, 0x11, 0xd5, 0x11, 0x11, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x1, + 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, 0x7, 0xa0, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x1f, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, + 0x5c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe1, 0xa, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb2, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xdf, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xe6, 0x6, 0xec, 0x51, + 0x0, 0x8, 0xed, 0x81, 0x0, 0x0, 0x6c, 0xfd, + 0xa0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, + 0x0, + + /* U+4E09 "三" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdd, 0xdd, 0xdd, 0xdd, + 0xda, 0x0, 0x0, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+4E0A "上" */ + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x11, 0x11, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xcc, 0xcc, 0xdf, 0xcc, 0xcc, 0xcc, 0xc2, + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + + /* U+4E0B "下" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xde, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x44, 0xdd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x7, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x28, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + + /* U+4E0D "不" */ + 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x1, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xdb, 0x8a, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0xad, 0x1a, 0x80, 0x6e, 0x70, 0x0, + 0x0, 0x3d, 0xc1, 0xa, 0x80, 0x2, 0xdb, 0x10, + 0x9, 0xf7, 0x0, 0xa, 0x80, 0x0, 0xb, 0xd1, + 0x9, 0x20, 0x0, 0xa, 0x80, 0x0, 0x0, 0x40, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + + /* U+4E13 "专" */ + 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x9c, 0xcc, 0xee, 0xcc, 0xcc, 0xc8, 0x0, 0x2, + 0x33, 0x4f, 0x43, 0x33, 0x33, 0x20, 0x0, 0x0, + 0x5, 0xb0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0xcc, + 0xee, 0xcc, 0xcc, 0xcc, 0xca, 0x4, 0x44, 0x5f, + 0x44, 0x44, 0x44, 0x44, 0x30, 0x0, 0x6, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, 0xdd, + 0xdd, 0xdd, 0xd4, 0x0, 0x0, 0x2, 0x22, 0x22, + 0x23, 0xda, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xca, 0x0, 0x0, 0x0, 0x6, 0x72, 0x1, 0xc9, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xed, 0xda, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xf9, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xa9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E14 "且" */ + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x9, 0x80, 0x0, 0x0, 0x6, 0xb0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0x9, 0xdb, 0xbb, 0xbb, 0xbd, 0xb0, 0x0, + 0x0, 0x9, 0xa4, 0x44, 0x44, 0x48, 0xb0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0x9, 0xa4, 0x44, 0x44, 0x48, 0xb0, 0x0, + 0x0, 0x9, 0xdb, 0xbb, 0xbb, 0xbd, 0xb0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x4, 0x4b, 0xa4, 0x44, 0x44, 0x48, 0xd4, 0x40, + 0x1b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb1, + + /* U+4E16 "世" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0xc, 0x40, 0x9, 0x60, 0x5, 0xb0, 0x0, + 0x0, 0xc, 0x40, 0x9, 0x60, 0x5, 0xb0, 0x0, + 0x0, 0xc, 0x40, 0x9, 0x60, 0x5, 0xb0, 0x0, + 0x2, 0x2d, 0x62, 0x2a, 0x82, 0x27, 0xc2, 0x20, + 0x2d, 0xdf, 0xed, 0xdf, 0xed, 0xde, 0xfd, 0xd2, + 0x0, 0xc, 0x40, 0x9, 0x60, 0x5, 0xb0, 0x0, + 0x0, 0xc, 0x40, 0x9, 0x60, 0x5, 0xb0, 0x0, + 0x0, 0xc, 0x40, 0x9, 0x60, 0x5, 0xb0, 0x0, + 0x0, 0xc, 0x40, 0x9, 0x70, 0x6, 0xb0, 0x0, + 0x0, 0xc, 0x40, 0x9, 0xee, 0xee, 0xb0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + + /* U+4E21 "両" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x3, 0xc0, 0x0, 0xa, 0x70, 0x0, 0xc, 0x40, + 0x3, 0xc0, 0x73, 0xa, 0x60, 0x44, 0xb, 0x40, + 0x3, 0xc0, 0x95, 0xa, 0x60, 0x77, 0xb, 0x40, + 0x3, 0xc0, 0x95, 0xa, 0x60, 0x77, 0xb, 0x40, + 0x3, 0xc0, 0x95, 0xa, 0x60, 0x77, 0xb, 0x40, + 0x3, 0xc0, 0x9d, 0xce, 0xec, 0xe7, 0xb, 0x40, + 0x3, 0xc0, 0x12, 0x22, 0x22, 0x21, 0xb, 0x40, + 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x40, + 0x3, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x10, + + /* U+4E26 "並" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x10, 0x0, + 0x0, 0x4, 0xe1, 0x0, 0x0, 0xd, 0x60, 0x0, + 0x0, 0x0, 0xa9, 0x0, 0x0, 0x6c, 0x0, 0x0, + 0x1, 0x11, 0x3b, 0x11, 0x11, 0xd4, 0x11, 0x10, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x4, 0xc0, 0xd, 0x20, 0x0, 0x0, + 0x0, 0x51, 0x4, 0xc0, 0xd, 0x20, 0x27, 0x0, + 0x0, 0x97, 0x4, 0xc0, 0xd, 0x20, 0x7a, 0x0, + 0x0, 0x3d, 0x4, 0xc0, 0xd, 0x20, 0xc5, 0x0, + 0x0, 0xd, 0x34, 0xc0, 0xd, 0x22, 0xe0, 0x0, + 0x0, 0x9, 0x74, 0xc0, 0xd, 0x29, 0x80, 0x0, + 0x0, 0x4, 0x54, 0xc0, 0xd, 0x28, 0x10, 0x0, + 0x0, 0x0, 0x4, 0xc0, 0xd, 0x20, 0x0, 0x0, + 0x1c, 0xcc, 0xcd, 0xfc, 0xcf, 0xdc, 0xcc, 0xc1, + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + + /* U+4E2D "中" */ + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x2c, 0xcc, + 0xcc, 0xdf, 0xcc, 0xcc, 0xcb, 0x3e, 0x44, 0x44, + 0x7f, 0x44, 0x44, 0x6e, 0x3d, 0x0, 0x0, 0x3e, + 0x0, 0x0, 0x2e, 0x3d, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x2e, 0x3d, 0x0, 0x0, 0x3e, 0x0, 0x0, + 0x2e, 0x3d, 0x11, 0x11, 0x4e, 0x11, 0x11, 0x4e, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x2a, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x29, 0x0, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x0, + + /* U+4E3B "主" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9c, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x11, 0xa9, 0x11, 0x11, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x24, 0x44, 0x4b, 0xa4, 0x44, 0x42, 0x0, + 0x0, 0x7c, 0xcc, 0xce, 0xec, 0xcc, 0xc8, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x2, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x20, + 0x1e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe2, + + /* U+4E45 "久" */ + 0x0, 0x0, 0x5, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x6, 0xd1, 0x11, 0x1c, 0x60, 0x0, 0x0, + 0x0, 0x2e, 0x40, 0x0, 0x1f, 0x10, 0x0, 0x0, + 0x0, 0xca, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, + 0xb, 0xc0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0x2a, 0x10, 0x0, 0x9, 0xee, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x2c, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe6, 0x3, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x80, 0x0, 0x8d, 0x10, 0x0, + 0x0, 0x5, 0xf8, 0x0, 0x0, 0xb, 0xd1, 0x0, + 0x3, 0xcf, 0x50, 0x0, 0x0, 0x0, 0xae, 0x60, + 0xd, 0x91, 0x0, 0x0, 0x0, 0x0, 0x5, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E4B "之" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x11, 0xa3, 0x11, 0x10, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9d, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0xa1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xe4, 0xad, 0x73, 0x21, 0x12, 0x23, 0x41, + 0xc, 0x20, 0x3, 0x9d, 0xef, 0xff, 0xed, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E4E "乎" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x35, 0x68, 0xad, 0xf6, 0x0, + 0x0, 0xef, 0xed, 0xcd, 0xe8, 0x63, 0x0, 0x0, + 0x0, 0x4, 0x0, 0x6, 0xb0, 0x0, 0x64, 0x0, + 0x0, 0xe, 0x20, 0x6, 0xb0, 0x0, 0xe4, 0x0, + 0x0, 0x7, 0xa0, 0x6, 0xb0, 0x6, 0xc0, 0x0, + 0x0, 0x1, 0xf0, 0x6, 0xb0, 0xe, 0x30, 0x0, + 0x0, 0x0, 0x30, 0x6, 0xb0, 0x3, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x2, 0x22, 0x22, 0x28, 0xb2, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x18, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xfd, 0x40, 0x0, 0x0, 0x0, + + /* U+4E4F "乏" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x23, 0x57, 0x9b, 0xed, 0x0, + 0x0, 0xef, 0xfe, 0xdc, 0xa9, 0x75, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x11, 0x11, 0x11, 0x11, 0x19, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9d, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xb1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x4, 0xcc, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xdd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xc0, 0x8e, 0x71, 0x0, 0x0, 0x1, 0x31, + 0xd, 0x20, 0x3, 0xae, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+4E57 "乗" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x12, 0x34, 0x56, 0x89, 0xbe, 0xe5, 0x0, + 0x0, 0xcc, 0xba, 0x9d, 0xb5, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x3, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x50, + 0x0, 0x1, 0xf0, 0x9, 0x80, 0xf, 0x10, 0x0, + 0x0, 0x0, 0xf0, 0x9, 0x70, 0xf, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0xf0, 0x9, 0x70, 0xf, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x9, 0x70, 0xf, 0x0, 0x0, + 0x6, 0xee, 0xee, 0xff, 0xff, 0xee, 0xee, 0x80, + 0x0, 0x0, 0x5, 0xdc, 0xcd, 0x40, 0x0, 0x0, + 0x0, 0x4, 0xba, 0x19, 0x71, 0xba, 0x30, 0x0, + 0x18, 0xeb, 0x40, 0x9, 0x70, 0x6, 0xcd, 0x71, + 0x6, 0x20, 0x0, 0x9, 0x70, 0x0, 0x3, 0x80, + + /* U+4E5D "九" */ + 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x15, 0xe1, 0x11, 0x11, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x90, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x70, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0xa, 0xb0, 0x0, 0x0, 0x2e, 0x0, 0x3b, + 0x1, 0xbd, 0x10, 0x0, 0x0, 0x2f, 0x10, 0x6a, + 0xd, 0x90, 0x0, 0x0, 0x0, 0xc, 0xff, 0xf4, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4E5F "也" */ + 0x0, 0x2, 0x10, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x1, 0xe0, 0x2, 0x78, 0x0, + 0x0, 0xb, 0x40, 0x2, 0xf8, 0xdd, 0xbc, 0x0, + 0x0, 0xb, 0x55, 0xae, 0xf7, 0x20, 0x5b, 0x0, + 0x2, 0x7e, 0xfb, 0x63, 0xe0, 0x0, 0x5b, 0x0, + 0x8e, 0x9d, 0x50, 0x1, 0xe0, 0x0, 0x6a, 0x0, + 0x0, 0xb, 0x40, 0x1, 0xe0, 0x0, 0x88, 0x0, + 0x0, 0xb, 0x40, 0x1, 0xe0, 0x12, 0xd3, 0x0, + 0x0, 0xb, 0x40, 0x1, 0xe0, 0xcc, 0x80, 0x0, + 0x0, 0xb, 0x40, 0x1, 0xe0, 0x0, 0x0, 0x90, + 0x0, 0xb, 0x50, 0x0, 0x30, 0x0, 0x2, 0xe0, + 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, 0x9, 0xb0, + 0x0, 0x2, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x20, + + /* U+4E86 "了" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xe6, 0x0, + 0x0, 0x0, + + /* U+4E88 "予" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xda, 0x0, 0x0, 0x0, + 0x9, 0x30, 0x3, 0xe9, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xb7, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xfc, 0x10, 0x0, 0x0, 0x33, 0x33, 0x33, + 0x36, 0xef, 0x43, 0x33, 0xb, 0xcc, 0xcc, 0xcd, + 0xfc, 0xcc, 0xcd, 0xf2, 0x0, 0x0, 0x0, 0x3d, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x0, 0x3, 0xd0, + 0x0, 0xa9, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x18, 0x0, 0x0, 0x0, 0x0, 0x3, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xe8, 0x0, 0x0, 0x0, + 0x0, + + /* U+4E89 "争" */ + 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xee, 0xee, 0xf8, 0x0, 0x0, + 0x0, 0x8, 0xc1, 0x0, 0x5, 0xe1, 0x0, 0x0, + 0x0, 0xad, 0x20, 0x0, 0x3f, 0x40, 0x0, 0x0, + 0x4, 0xce, 0xee, 0xef, 0xfe, 0xee, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0xb5, 0x0, + 0x2, 0x22, 0x22, 0x2a, 0xa2, 0x22, 0xc7, 0x21, + 0x1c, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xfe, 0xc7, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0xb5, 0x0, + 0x0, 0x22, 0x22, 0x2a, 0xa2, 0x22, 0xc5, 0x0, + 0x0, 0x9c, 0xcc, 0xce, 0xec, 0xcc, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xfd, 0x40, 0x0, 0x0, 0x0, + + /* U+4E8B "事" */ + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xc, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xd0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xcc, 0xce, 0xec, 0xcc, 0xf5, 0x0, + 0x0, 0x3c, 0x0, 0x9, 0x70, 0x0, 0xb5, 0x0, + 0x0, 0x2c, 0xcc, 0xce, 0xec, 0xcc, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x9c, 0xcc, 0xce, 0xec, 0xcc, 0xe9, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x79, 0x0, + 0x2d, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xef, 0xd3, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x79, 0x0, + 0x0, 0xbd, 0xdd, 0xdf, 0xed, 0xdd, 0xe9, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x56, 0x0, + 0x0, 0x0, 0x1d, 0xee, 0x40, 0x0, 0x0, 0x0, + + /* U+4E8C "二" */ + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, + 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, + + /* U+4E94 "五" */ + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x11, 0x11, 0x8b, 0x11, 0x11, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x98, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x11, 0xe4, 0x11, 0x11, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0xd, 0x40, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0x0, 0x9, 0x80, 0x0, 0xf, 0x10, 0x0, + 0x0, 0x0, 0xc, 0x50, 0x0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0x3e, 0x0, 0x0, + 0x1e, 0xee, 0xef, 0xee, 0xee, 0xff, 0xee, 0xe2, + 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, + + /* U+4E9B "些" */ + 0x0, 0x0, 0xb5, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x2, 0xa0, 0xb5, 0x0, 0x2e, 0x0, 0x7d, 0x20, + 0x3, 0xc0, 0xbe, 0xdc, 0x2e, 0x9f, 0xa3, 0x0, + 0x3, 0xc0, 0xb7, 0x22, 0x2f, 0x61, 0x0, 0x0, + 0x3, 0xc0, 0xb5, 0x0, 0x2e, 0x0, 0x0, 0x40, + 0x3, 0xc0, 0xb5, 0x0, 0x2e, 0x0, 0x0, 0xc3, + 0x3, 0xc1, 0xb9, 0x79, 0x2f, 0x32, 0x23, 0xe0, + 0x2d, 0xfe, 0xca, 0x87, 0x9, 0xdd, 0xdd, 0x70, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + + /* U+4EA1 "亡" */ + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd2, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, + + /* U+4EA4 "交" */ + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x50, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x17, 0xb1, 0x11, 0x11, 0x10, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x5, 0x0, 0x0, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc9, 0x0, 0x0, 0x8d, 0x30, 0x0, + 0x0, 0x2c, 0x90, 0x0, 0x0, 0x5, 0xe6, 0x0, + 0x6, 0xf7, 0x27, 0x0, 0x0, 0x83, 0x3e, 0x70, + 0x3, 0x40, 0xe, 0x30, 0x2, 0xf1, 0x3, 0x50, + 0x0, 0x0, 0x6, 0xc0, 0xb, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaa, 0x9c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xea, 0xae, 0x60, 0x0, 0x0, + 0x0, 0x27, 0xcd, 0x40, 0x3, 0xdd, 0x84, 0x0, + 0xd, 0xfa, 0x50, 0x0, 0x0, 0x4, 0x9e, 0xe1, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+4EA6 "亦" */ + 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, + 0xc, 0xcc, 0xcc, 0xcc, 0xdc, 0xcc, 0xcc, 0xc0, + 0x3, 0x33, 0x36, 0xe3, 0x37, 0xd3, 0x33, 0x30, + 0x0, 0x0, 0x3, 0xd0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0xe, 0x13, 0xd0, 0x4, 0xc2, 0xc0, 0x0, + 0x0, 0x6b, 0x4, 0xc0, 0x4, 0xc0, 0xc6, 0x0, + 0x0, 0xc6, 0x6, 0xb0, 0x4, 0xc0, 0x3e, 0x0, + 0x5, 0xe0, 0xa, 0x70, 0x4, 0xc0, 0xb, 0x60, + 0xc, 0x50, 0xe, 0x30, 0x4, 0xc0, 0x5, 0xc0, + 0x0, 0x0, 0x7c, 0x0, 0x4, 0xc0, 0x0, 0x60, + 0x0, 0x2, 0xf3, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x2d, 0x80, 0x1, 0x16, 0xb0, 0x0, 0x0, + 0x0, 0xb8, 0x0, 0xd, 0xfe, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EAC "京" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xf2, 0x0, 0x0, 0x0, 0x2, + 0x22, 0x22, 0x29, 0xb2, 0x22, 0x22, 0x20, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xee, + 0xee, 0xee, 0xee, 0xee, 0x10, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0xf, 0x10, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xde, 0xee, 0xff, + 0xee, 0xee, 0x10, 0x0, 0x0, 0x0, 0x8, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xb8, 0x0, 0x89, 0x0, + 0xa9, 0x0, 0x0, 0x9b, 0x0, 0x8, 0x90, 0x0, + 0xc9, 0x0, 0xbb, 0x0, 0x0, 0x89, 0x0, 0x0, + 0xd8, 0x3, 0x0, 0x2f, 0xfe, 0x50, 0x0, 0x1, + 0x20, + + /* U+4EBA "人" */ + 0x0, 0x0, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x98, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf3, 0x7a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xd0, 0x1e, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x50, 0x8, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x9c, 0x0, 0x1, 0xe6, 0x0, 0x0, + 0x0, 0x8, 0xe1, 0x0, 0x0, 0x3f, 0x50, 0x0, + 0x0, 0x8f, 0x30, 0x0, 0x0, 0x5, 0xf7, 0x0, + 0x2d, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd0, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+4EC0 "什" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x3f, 0x20, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x1, 0xef, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0xc, 0x8e, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x2b, 0xe, 0x11, 0x11, 0x17, 0xb1, 0x11, 0x10, + 0x0, 0xe, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4ECA "今" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8d, 0xc8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xd1, 0xb, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xbc, 0x10, 0x0, 0xbc, 0x20, 0x0, + 0x0, 0x5e, 0xa0, 0x6a, 0x0, 0x9, 0xf6, 0x0, + 0x2c, 0xe4, 0x0, 0x9, 0xd1, 0x0, 0x4e, 0xd2, + 0x6, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x50, + 0x0, 0x14, 0x44, 0x44, 0x46, 0x44, 0x41, 0x0, + 0x0, 0x4c, 0xcc, 0xcc, 0xcc, 0xcd, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, + + /* U+4ECB "介" */ + 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8c, 0x5e, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xd1, 0x6, 0xe4, 0x0, 0x0, + 0x0, 0x2, 0xcb, 0x10, 0x0, 0x4e, 0x91, 0x0, + 0x2, 0x9f, 0x80, 0x0, 0x0, 0x2, 0xbe, 0x81, + 0x1e, 0xa2, 0x15, 0x0, 0x0, 0x16, 0x4, 0xb8, + 0x1, 0x0, 0x4d, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x8, 0xd0, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x9e, 0x30, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x4, 0xc2, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, + + /* U+4ECD "仍" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x1e, 0xff, 0xee, 0xef, 0x60, 0x0, 0x9, + 0x80, 0x1, 0xf0, 0x0, 0xd2, 0x0, 0x2, 0xf3, + 0x0, 0x2e, 0x0, 0xe, 0x0, 0x0, 0xcf, 0x30, + 0x3, 0xd0, 0x4, 0xb0, 0x0, 0x8c, 0xc3, 0x0, + 0x4c, 0x0, 0x8e, 0xdd, 0x56, 0x2c, 0x30, 0x6, + 0xa0, 0x1, 0x22, 0xb5, 0x0, 0xc3, 0x0, 0x88, + 0x0, 0x0, 0xb, 0x50, 0xc, 0x30, 0xb, 0x50, + 0x0, 0x0, 0xc4, 0x0, 0xc3, 0x1, 0xf1, 0x0, + 0x0, 0xd, 0x20, 0xc, 0x30, 0x6b, 0x0, 0x0, + 0x0, 0xf1, 0x0, 0xc3, 0xd, 0x60, 0x0, 0x0, + 0x2f, 0x0, 0xc, 0x39, 0xb0, 0x0, 0x0, 0x7, + 0xb0, 0x0, 0xc5, 0xd1, 0x0, 0x5, 0xff, 0xe4, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4ED5 "仕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x98, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x2, 0xf1, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xa, 0x90, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x3f, 0x20, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xdf, 0x11, 0x11, 0x17, 0xa1, 0x11, 0x10, + 0xb, 0xbf, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x6d, 0x1f, 0x10, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x1, 0xf, 0x10, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xf, 0x12, 0x44, 0x49, 0xb4, 0x44, 0x40, + 0x0, 0xf, 0x18, 0xcc, 0xcc, 0xcc, 0xcc, 0xc0, + + /* U+4ED6 "他" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x2c, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x2d, 0x0, 0xe1, 0x4, 0x70, + 0x0, 0x4e, 0x0, 0x2d, 0x0, 0xe9, 0xee, 0xd0, + 0x1, 0xed, 0x0, 0x2e, 0x4b, 0xf9, 0x32, 0xd0, + 0x1d, 0x9d, 0x1, 0x8f, 0xd6, 0xe1, 0x2, 0xd0, + 0x39, 0x2d, 0x3f, 0xbe, 0x0, 0xe1, 0x3, 0xd0, + 0x0, 0x2d, 0x0, 0x2d, 0x0, 0xe1, 0x3, 0xc0, + 0x0, 0x2d, 0x0, 0x2d, 0x0, 0xe1, 0x5, 0xb0, + 0x0, 0x2d, 0x0, 0x2d, 0x0, 0xe3, 0xfe, 0x40, + 0x0, 0x2d, 0x0, 0x2d, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x2e, 0x0, 0x10, 0x0, 0x65, + 0x0, 0x2d, 0x0, 0x1f, 0x10, 0x0, 0x1, 0xb6, + 0x0, 0x2d, 0x0, 0x9, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4ED8 "付" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0x2, 0xf1, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xa, 0x90, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0x3f, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xdf, 0x11, 0x22, 0x22, 0x23, 0xf2, 0x20, + 0xb, 0xbf, 0x10, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x2c, 0xf, 0x10, 0x5b, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xf, 0x10, 0xd, 0x60, 0x1, 0xf0, 0x0, + 0x0, 0xf, 0x10, 0x3, 0xf1, 0x1, 0xf0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0xa8, 0x1, 0xf0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x10, 0x1, 0xf0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x1, 0x13, 0xf0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x6f, 0xfe, 0x80, 0x0, + + /* U+4EE3 "代" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6a, 0x0, 0x4c, 0x5, 0x70, 0x0, + 0x0, 0x0, 0xe4, 0x0, 0x3d, 0x0, 0xb9, 0x0, + 0x0, 0x8, 0xb0, 0x0, 0x2e, 0x0, 0xb, 0x70, + 0x0, 0x2f, 0x30, 0x0, 0x1f, 0x0, 0x0, 0x0, + 0x1, 0xef, 0x20, 0x2, 0x4f, 0x8a, 0xce, 0xf0, + 0x1c, 0x9e, 0x2e, 0xfd, 0xbf, 0x95, 0x31, 0x0, + 0x9a, 0xe, 0x20, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x10, 0xe, 0x20, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x1, 0xf1, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0xc6, 0x0, 0x63, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x6e, 0x10, 0xa4, + 0x0, 0xe, 0x20, 0x0, 0x0, 0xb, 0xc5, 0xe1, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x1, 0xbf, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EE4 "令" */ + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9c, 0xba, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xa0, 0x9, 0xc2, 0x0, 0x0, + 0x0, 0x5, 0xe8, 0x25, 0x0, 0x6e, 0x70, 0x0, + 0x3, 0xbd, 0x40, 0x2d, 0x70, 0x3, 0xdd, 0x50, + 0x2e, 0x70, 0x0, 0x1, 0xd6, 0x0, 0x7, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x80, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x1, 0xd9, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb2, 0x1d, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xd9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xea, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + + /* U+4EE5 "以" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x0, 0x0, 0x0, 0x0, 0xa8, 0x0, 0x3, + 0xe0, 0x8, 0x90, 0x0, 0xb, 0x60, 0x0, 0x3e, + 0x0, 0xe, 0x50, 0x0, 0xc5, 0x0, 0x3, 0xe0, + 0x0, 0x4e, 0x0, 0xe, 0x30, 0x0, 0x3e, 0x0, + 0x0, 0xb5, 0x0, 0xf1, 0x0, 0x3, 0xe0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x3e, 0x0, 0x0, + 0x0, 0x7, 0xa0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0xc6, 0x0, 0x0, 0x3e, 0x0, 0x4, 0x0, + 0x2f, 0x0, 0x0, 0x3, 0xe0, 0x7e, 0xb0, 0xb, + 0xf3, 0x0, 0x0, 0x6f, 0xeb, 0x30, 0x6, 0xd5, + 0xe3, 0x0, 0xe, 0xb3, 0x0, 0x6, 0xe2, 0x5, + 0xf3, 0x0, 0x20, 0x0, 0x3b, 0xe3, 0x0, 0x7, + 0xe1, 0x0, 0x0, 0x1e, 0x91, 0x0, 0x0, 0xa, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EEE "仮" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x1, 0x25, 0x8c, 0x70, + 0x0, 0x6, 0xc0, 0xae, 0xec, 0xb9, 0x63, 0x0, + 0x0, 0xe, 0x50, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xfd, 0x0, 0xc6, 0x22, 0x22, 0x23, 0x0, + 0xd, 0xcd, 0x0, 0xde, 0xfd, 0xdd, 0xdf, 0x60, + 0x4c, 0x3d, 0x0, 0xe3, 0xe1, 0x0, 0xe, 0x10, + 0x0, 0x2d, 0x0, 0xf2, 0x87, 0x0, 0x5c, 0x0, + 0x0, 0x2d, 0x1, 0xf0, 0x2e, 0x10, 0xc5, 0x0, + 0x0, 0x2d, 0x3, 0xd0, 0x8, 0xa8, 0xb0, 0x0, + 0x0, 0x2d, 0x7, 0xa0, 0x0, 0xdf, 0x10, 0x0, + 0x0, 0x2d, 0xc, 0x50, 0x7, 0xee, 0x80, 0x0, + 0x0, 0x2d, 0x4d, 0x4, 0xcc, 0x11, 0xcc, 0x40, + 0x0, 0x2d, 0x85, 0x3d, 0x50, 0x0, 0x6, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4EF6 "件" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x5, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x4c, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0xc, 0x50, 0x89, 0x15, 0xc1, 0x11, 0x0, + 0x0, 0x4f, 0x0, 0xdf, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xde, 0x4, 0xd0, 0x4, 0xc0, 0x0, 0x0, + 0xa, 0xce, 0xb, 0x60, 0x4, 0xc0, 0x0, 0x0, + 0x2d, 0x2e, 0x5, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x1, 0x1e, 0x2, 0x22, 0x26, 0xd2, 0x22, 0x20, + 0x0, 0x1e, 0xc, 0xdd, 0xde, 0xfd, 0xdd, 0xd2, + 0x0, 0x1e, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + + /* U+4EFB "任" */ + 0x0, 0x0, 0x35, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0xc6, 0x0, 0x1, 0x58, 0xcf, 0x40, + 0x0, 0x5, 0xe5, 0xac, 0xff, 0xe8, 0x40, 0x0, + 0x0, 0xd, 0x62, 0x52, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x8f, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x4, 0xff, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x3f, 0x5f, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x47, 0xf, 0x3b, 0xbb, 0xbd, 0xeb, 0xbb, 0xb4, + 0x0, 0xf, 0x24, 0x44, 0x48, 0xc4, 0x44, 0x41, + 0x0, 0xf, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0x12, 0x33, 0x37, 0xc3, 0x33, 0x30, + 0x0, 0xf, 0x17, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, + + /* U+4EFD "份" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0x0, 0xb4, 0x7, 0x70, 0x0, + 0x0, 0x5, 0xd0, 0x2, 0xe0, 0x4, 0xc0, 0x0, + 0x0, 0xc, 0x50, 0x9, 0x80, 0x0, 0xe2, 0x0, + 0x0, 0x4f, 0x0, 0x1f, 0x20, 0x0, 0x7b, 0x0, + 0x0, 0xee, 0x0, 0xb9, 0x0, 0x0, 0xe, 0x60, + 0xa, 0xde, 0xa, 0xd1, 0x0, 0x0, 0x4, 0xf5, + 0x1c, 0x3e, 0xb, 0x7f, 0xff, 0xff, 0xfd, 0x45, + 0x0, 0x2e, 0x0, 0x0, 0x5b, 0x0, 0x3d, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x88, 0x0, 0x4c, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0xc4, 0x0, 0x5b, 0x0, + 0x0, 0x2e, 0x0, 0x3, 0xe0, 0x0, 0x79, 0x0, + 0x0, 0x2e, 0x0, 0xd, 0x60, 0x0, 0x97, 0x0, + 0x0, 0x2e, 0x1, 0xba, 0x0, 0x11, 0xd4, 0x0, + 0x0, 0x2e, 0x8, 0x80, 0x1, 0xee, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F01 "企" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7d, 0xc7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xc1, 0x1d, 0x70, 0x0, 0x0, + 0x0, 0x1, 0xbb, 0x0, 0x1, 0xba, 0x10, 0x0, + 0x0, 0x6e, 0x90, 0x5, 0x90, 0x8, 0xe8, 0x0, + 0x2d, 0xc2, 0x0, 0x6, 0xb0, 0x0, 0x2b, 0xe3, + 0x4, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x40, + 0x0, 0xa, 0x60, 0x6, 0xb1, 0x11, 0x10, 0x0, + 0x0, 0xa, 0x60, 0x6, 0xfd, 0xdd, 0xd5, 0x0, + 0x0, 0xa, 0x60, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + + /* U+4F0A "伊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x0, 0x5, 0xc3, 0xee, 0xff, 0xee, 0xef, 0x10, + 0x0, 0xe, 0x40, 0x0, 0x4c, 0x0, 0xe, 0x10, + 0x0, 0x8e, 0x0, 0x0, 0x4c, 0x0, 0xe, 0x10, + 0x6, 0xfe, 0x4b, 0xbb, 0xdf, 0xbb, 0xbf, 0xc3, + 0x4f, 0x5e, 0x14, 0x44, 0x7d, 0x44, 0x4f, 0x51, + 0x35, 0x1e, 0x0, 0x0, 0x4c, 0x0, 0xe, 0x10, + 0x0, 0x1e, 0x0, 0x0, 0x5b, 0x0, 0xe, 0x10, + 0x0, 0x1e, 0x7, 0xee, 0xff, 0xee, 0xef, 0x10, + 0x0, 0x1e, 0x0, 0x0, 0xc6, 0x0, 0xe, 0x10, + 0x0, 0x1e, 0x0, 0x2, 0xe1, 0x0, 0x5, 0x0, + 0x0, 0x1e, 0x0, 0x1d, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x3, 0xd8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x1d, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F11 "休" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x98, 0x0, 0xc, 0x40, 0x0, 0x0, + 0x0, 0x2, 0xf2, 0x0, 0xc, 0x40, 0x0, 0x0, + 0x0, 0xa, 0xa0, 0x0, 0xc, 0x40, 0x0, 0x0, + 0x0, 0x3f, 0x31, 0x11, 0x1c, 0x51, 0x11, 0x10, + 0x1, 0xef, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xbf, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, + 0x7c, 0xf, 0x0, 0x2, 0xed, 0x8d, 0x0, 0x0, + 0x1, 0xf, 0x0, 0xa, 0x6c, 0x4b, 0x60, 0x0, + 0x0, 0xf, 0x0, 0x3d, 0xc, 0x43, 0xe1, 0x0, + 0x0, 0xf, 0x1, 0xe5, 0xc, 0x40, 0x9b, 0x0, + 0x0, 0xf, 0x2c, 0x90, 0xc, 0x40, 0xc, 0xa0, + 0x0, 0xf, 0x7a, 0x0, 0xc, 0x40, 0x1, 0xc2, + 0x0, 0xf, 0x10, 0x0, 0xc, 0x40, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, + + /* U+4F1A "会" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0xd8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xf6, 0xc, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x9e, 0x50, 0x0, 0x9e, 0x50, 0x0, + 0x0, 0x6e, 0xe5, 0x33, 0x33, 0x38, 0xec, 0x40, + 0xc, 0xd5, 0x7c, 0xcc, 0xcc, 0xcc, 0x17, 0xe4, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x5, 0xee, 0xee, 0xff, 0xee, 0xee, 0xee, 0xd0, + 0x0, 0x0, 0x2, 0xf5, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x80, 0x0, 0x8b, 0x0, 0x0, + 0x0, 0x0, 0xc9, 0x0, 0x0, 0x9, 0xb0, 0x0, + 0x0, 0x1c, 0xd5, 0x67, 0x9a, 0xbd, 0xf9, 0x0, + 0x0, 0x7f, 0xdb, 0xa8, 0x76, 0x43, 0x2e, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+4F1D "伝" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xc0, 0xbf, 0xff, 0xff, 0xff, 0x30, + 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xde, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xee, 0x2, 0x33, 0x33, 0x33, 0x33, 0x30, + 0x1e, 0x3e, 0xa, 0xcc, 0xef, 0xcc, 0xcc, 0xc1, + 0x1, 0x1e, 0x0, 0x0, 0xc7, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x4, 0xe0, 0x1, 0x40, 0x0, + 0x0, 0x1e, 0x0, 0xc, 0x70, 0x1, 0xe1, 0x0, + 0x0, 0x1e, 0x0, 0x6d, 0x0, 0x0, 0x7a, 0x0, + 0x0, 0x1e, 0x2, 0xf6, 0x45, 0x78, 0xaf, 0x30, + 0x0, 0x1e, 0x9, 0xfd, 0xb9, 0x76, 0x47, 0xb0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, + + /* U+4F38 "伸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0xe, 0x3b, 0xee, 0xef, 0xfe, 0xee, 0xe2, + 0x0, 0x7e, 0xc, 0x40, 0x2, 0xe0, 0x0, 0xe2, + 0x3, 0xfd, 0xc, 0x30, 0x1, 0xe0, 0x0, 0xe2, + 0x1e, 0x7d, 0xc, 0xdc, 0xcc, 0xfc, 0xcc, 0xf2, + 0x38, 0x2d, 0xc, 0x63, 0x34, 0xf3, 0x33, 0xf2, + 0x0, 0x2d, 0xc, 0x30, 0x1, 0xe0, 0x0, 0xe2, + 0x0, 0x2d, 0xc, 0x40, 0x2, 0xe0, 0x0, 0xe2, + 0x0, 0x2d, 0xc, 0xfe, 0xef, 0xfe, 0xee, 0xf2, + 0x0, 0x2d, 0x7, 0x10, 0x1, 0xe0, 0x0, 0x61, + 0x0, 0x2d, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + + /* U+4F3C "似" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x50, 0x0, 0x0, 0xf, 0x0, + 0x0, 0xc, 0x50, 0xf1, 0xa3, 0x0, 0x1f, 0x0, + 0x0, 0x3e, 0x0, 0xf1, 0x6a, 0x0, 0x2e, 0x0, + 0x0, 0xab, 0x0, 0xf1, 0xe, 0x20, 0x3d, 0x0, + 0x4, 0xfb, 0x0, 0xf1, 0x8, 0x80, 0x5b, 0x0, + 0x1e, 0x9b, 0x0, 0xf1, 0x3, 0xe0, 0x79, 0x0, + 0x49, 0x4b, 0x0, 0xf1, 0x0, 0x10, 0xa6, 0x0, + 0x0, 0x4b, 0x0, 0xf1, 0x0, 0x0, 0xd4, 0x0, + 0x0, 0x4b, 0x0, 0xf1, 0x4, 0x22, 0xfa, 0x0, + 0x0, 0x4b, 0x0, 0xf2, 0x9d, 0x29, 0xae, 0x20, + 0x0, 0x4b, 0x0, 0xfe, 0x90, 0x1f, 0x28, 0xa0, + 0x0, 0x4b, 0x5, 0xe4, 0x0, 0xb9, 0x1, 0xf1, + 0x0, 0x4b, 0x0, 0x20, 0xa, 0xc0, 0x0, 0xb7, + 0x0, 0x4b, 0x0, 0x0, 0x1a, 0x10, 0x0, 0x21, + + /* U+4F46 "但" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xd0, 0xef, 0xff, 0xff, 0xff, 0x10, + 0x0, 0xd, 0x60, 0xe3, 0x0, 0x0, 0xf, 0x10, + 0x0, 0x7f, 0x0, 0xe3, 0x0, 0x0, 0xf, 0x10, + 0x2, 0xfe, 0x0, 0xe3, 0x0, 0x0, 0xf, 0x10, + 0x1e, 0x9e, 0x0, 0xef, 0xff, 0xff, 0xff, 0x10, + 0x3a, 0x2e, 0x0, 0xe4, 0x0, 0x0, 0x1f, 0x10, + 0x0, 0x2e, 0x0, 0xe3, 0x0, 0x0, 0xf, 0x10, + 0x0, 0x2e, 0x0, 0xe3, 0x0, 0x0, 0xf, 0x10, + 0x0, 0x2e, 0x0, 0xed, 0xcc, 0xcc, 0xcf, 0x10, + 0x0, 0x2e, 0x0, 0x23, 0x33, 0x33, 0x33, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x3, 0x33, 0x33, 0x33, 0x33, 0x31, + 0x0, 0x2e, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc6, + + /* U+4F4D "位" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0xc, 0x40, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x33, 0x36, 0x83, 0x33, 0x10, + 0x0, 0x3f, 0x12, 0xcc, 0xcc, 0xcc, 0xcc, 0x50, + 0x0, 0xdf, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0xa, 0xcf, 0x0, 0x1f, 0x0, 0x0, 0xd4, 0x0, + 0x3d, 0x2f, 0x0, 0xe, 0x20, 0x0, 0xf1, 0x0, + 0x1, 0xf, 0x0, 0xb, 0x50, 0x2, 0xe0, 0x0, + 0x0, 0xf, 0x0, 0x8, 0x90, 0x5, 0xb0, 0x0, + 0x0, 0xf, 0x0, 0x5, 0xb0, 0x8, 0x80, 0x0, + 0x0, 0xf, 0x0, 0x3, 0xe0, 0xb, 0x40, 0x0, + 0x0, 0xf, 0x0, 0x1, 0xc0, 0xf, 0x0, 0x0, + 0x0, 0xf, 0x3, 0x33, 0x33, 0x6d, 0x33, 0x30, + 0x0, 0xf, 0xb, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, + + /* U+4F4E "低" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x1, 0x58, 0xde, 0x20, + 0x0, 0x5, 0xc0, 0x8c, 0xfe, 0xdd, 0x30, 0x0, + 0x0, 0xd, 0x50, 0xe4, 0x10, 0x4c, 0x0, 0x0, + 0x0, 0x5f, 0x0, 0xe1, 0x0, 0x3d, 0x0, 0x0, + 0x1, 0xee, 0x0, 0xe1, 0x0, 0x2e, 0x0, 0x0, + 0xb, 0xce, 0x0, 0xe2, 0x0, 0x2f, 0x0, 0x0, + 0x4d, 0x2e, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf3, + 0x2, 0x1e, 0x0, 0xe1, 0x0, 0xd, 0x20, 0x0, + 0x0, 0x1e, 0x0, 0xe1, 0x0, 0xb, 0x40, 0x0, + 0x0, 0x1e, 0x0, 0xe1, 0x0, 0x8, 0x70, 0x0, + 0x0, 0x1e, 0x0, 0xe1, 0x2, 0x24, 0xb0, 0x21, + 0x0, 0x1e, 0x0, 0xe1, 0x3, 0xc0, 0xf2, 0x75, + 0x0, 0x1e, 0x0, 0xf8, 0xb6, 0xa5, 0x8c, 0xc2, + 0x0, 0x1e, 0x5, 0xd7, 0x30, 0x36, 0x9, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F4F "住" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x0, 0x1e, 0x20, 0x0, 0x0, + 0x0, 0x3, 0xf0, 0x0, 0x7, 0xb0, 0x0, 0x0, + 0x0, 0xc, 0x80, 0x0, 0x2, 0xa1, 0x0, 0x0, + 0x0, 0x5f, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x2, 0xef, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x1d, 0xaf, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x19, 0x1f, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0x1, 0xcc, 0xcd, 0xfc, 0xcc, 0x70, + 0x0, 0xf, 0x0, 0x33, 0x37, 0xc3, 0x33, 0x20, + 0x0, 0xf, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0x1, 0x11, 0x16, 0xc1, 0x11, 0x10, + 0x0, 0xf, 0xe, 0xee, 0xee, 0xee, 0xee, 0xe4, + + /* U+4F53 "体" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x6, 0xc0, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xd, 0x40, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x5e, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x2, 0xfd, 0x0, 0x0, 0x6f, 0xe9, 0x0, 0x0, + 0xc, 0xbd, 0x0, 0x0, 0xd8, 0x9d, 0x10, 0x0, + 0x1b, 0x2d, 0x0, 0x6, 0x97, 0x96, 0x90, 0x0, + 0x0, 0x2d, 0x0, 0xe, 0x17, 0x90, 0xe2, 0x0, + 0x0, 0x2d, 0x0, 0xa8, 0x7, 0x90, 0x7c, 0x0, + 0x0, 0x2d, 0x7, 0xd0, 0x7, 0x90, 0xc, 0x90, + 0x0, 0x2d, 0x5e, 0x5e, 0xef, 0xfe, 0xe5, 0xd7, + 0x0, 0x2d, 0x2, 0x0, 0x7, 0x90, 0x0, 0x10, + 0x0, 0x2d, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x6, 0x90, 0x0, 0x0, + + /* U+4F55 "何" */ + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x8b, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x1f, 0x20, 0x11, 0x11, 0x11, 0x2f, 0x10, + 0x0, 0x8e, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x2, 0xfe, 0x0, 0x33, 0x33, 0x20, 0xf, 0x0, + 0xd, 0xce, 0x3, 0xeb, 0xbc, 0xb0, 0xf, 0x0, + 0x1c, 0x2e, 0x3, 0xb0, 0x4, 0xb0, 0xf, 0x0, + 0x0, 0x2e, 0x3, 0xb0, 0x4, 0xb0, 0xf, 0x0, + 0x0, 0x2e, 0x3, 0xb0, 0x4, 0xb0, 0xf, 0x0, + 0x0, 0x2e, 0x3, 0xfe, 0xef, 0xb0, 0xf, 0x0, + 0x0, 0x2e, 0x3, 0xc0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x2e, 0x1, 0x40, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x11, 0x2f, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x2, 0xff, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F59 "余" */ + 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xd6, 0x1d, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0x40, 0x0, 0xbb, 0x10, 0x0, + 0x0, 0x1a, 0xe3, 0x0, 0x0, 0x9, 0xf8, 0x10, + 0x18, 0xf9, 0xcb, 0xbb, 0xbb, 0xbb, 0x7b, 0xf6, + 0xa, 0x30, 0x44, 0x47, 0xe4, 0x44, 0x10, 0x43, + 0x0, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x22, 0x22, 0x26, 0xe2, 0x22, 0x22, 0x20, + 0x3, 0xdd, 0xdd, 0xde, 0xfd, 0xdd, 0xdd, 0xb0, + 0x0, 0x0, 0x10, 0x4, 0xd0, 0x1, 0x0, 0x0, + 0x0, 0x2, 0xe4, 0x4, 0xd0, 0x1d, 0x70, 0x0, + 0x0, 0x3e, 0x50, 0x4, 0xd0, 0x1, 0xca, 0x0, + 0x7, 0xe4, 0x0, 0x5, 0xd0, 0x0, 0xb, 0xa0, + 0x1, 0x10, 0x9, 0xff, 0x80, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F5C "作" */ + 0x0, 0x0, 0x43, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0x1, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x50, 0xd, 0xfe, 0xee, 0xee, 0xe3, + 0x0, 0x5f, 0x0, 0x5b, 0x1e, 0x31, 0x11, 0x10, + 0x1, 0xef, 0x0, 0xd2, 0xe, 0x20, 0x0, 0x0, + 0xc, 0xbf, 0x9, 0x90, 0xe, 0x30, 0x0, 0x0, + 0x3d, 0x1f, 0xa, 0x0, 0xe, 0xff, 0xff, 0xc0, + 0x1, 0xf, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xe, 0xff, 0xff, 0xf0, + 0x0, 0xf, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + + /* U+4F60 "你" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xd0, 0xc, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x2f, 0x20, 0x0, 0x0, 0x10, + 0x0, 0x5e, 0x0, 0x7f, 0xee, 0xff, 0xee, 0xf6, + 0x1, 0xed, 0x0, 0xe3, 0x0, 0xe1, 0x0, 0xc3, + 0x1d, 0xbd, 0x9, 0x90, 0x0, 0xe1, 0x0, 0xe0, + 0x4b, 0x2d, 0x4, 0x14, 0x20, 0xe1, 0x34, 0x30, + 0x0, 0x2d, 0x0, 0xe, 0x30, 0xe1, 0x3e, 0x0, + 0x0, 0x2d, 0x0, 0x3d, 0x0, 0xe1, 0xc, 0x60, + 0x0, 0x2d, 0x0, 0xa8, 0x0, 0xe1, 0x5, 0xc0, + 0x0, 0x2d, 0x4, 0xe0, 0x0, 0xe1, 0x0, 0xf1, + 0x0, 0x2d, 0x6, 0x50, 0x0, 0xe1, 0x0, 0x83, + 0x0, 0x2d, 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0xaf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F7F "使" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x5, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xc4, + 0x0, 0xe, 0x42, 0x22, 0x28, 0xb2, 0x22, 0x20, + 0x0, 0x8e, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x4, 0xfe, 0x6, 0xee, 0xef, 0xfe, 0xee, 0xc0, + 0x3f, 0x6e, 0x6, 0x80, 0x6, 0xa0, 0x3, 0xc0, + 0x25, 0x1e, 0x6, 0x80, 0x6, 0xa0, 0x3, 0xc0, + 0x0, 0x1e, 0x6, 0xeb, 0xbd, 0xeb, 0xbc, 0xc0, + 0x0, 0x1e, 0x2, 0x73, 0x3a, 0x93, 0x33, 0x20, + 0x0, 0x1e, 0x1, 0xd3, 0xc, 0x40, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x2d, 0x9d, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x5, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0x1e, 0x3, 0x9e, 0x44, 0xbe, 0x95, 0x20, + 0x0, 0x1e, 0x2d, 0x71, 0x0, 0x2, 0x6a, 0xd2, + + /* U+4F86 "來" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x1a, 0x81, 0x11, 0x11, 0x10, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x1, 0x80, 0x9, 0x80, 0x4, 0x40, 0x0, + 0x0, 0x7, 0xb0, 0x9, 0x80, 0xc, 0x50, 0x0, + 0x0, 0xd, 0x90, 0x9, 0x80, 0x2f, 0x40, 0x0, + 0x0, 0x6d, 0xc8, 0x9, 0x80, 0xc9, 0xe6, 0x0, + 0x5, 0xf3, 0xa, 0x4f, 0xf9, 0xb0, 0x1d, 0x90, + 0x8, 0x40, 0x1, 0xdd, 0xdd, 0x10, 0x1, 0x50, + 0x0, 0x0, 0x1d, 0x59, 0x87, 0xc1, 0x0, 0x0, + 0x0, 0x4, 0xe5, 0x9, 0x80, 0x7d, 0x30, 0x0, + 0x1, 0x9e, 0x40, 0x9, 0x80, 0x6, 0xf8, 0x10, + 0x1f, 0xa1, 0x0, 0x9, 0x80, 0x0, 0x2b, 0xf2, + 0x1, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x20, + + /* U+4F8B "例" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe8, 0xff, 0xff, 0xf1, 0x0, 0x4b, 0x0, + 0x69, 0x0, 0xd3, 0x0, 0xa, 0x4, 0xb0, 0xd, + 0x30, 0x1f, 0x0, 0x1, 0xd0, 0x4b, 0x5, 0xf2, + 0x5, 0xe5, 0x53, 0x1d, 0x4, 0xb1, 0xef, 0x20, + 0x9c, 0xac, 0x91, 0xd0, 0x4b, 0x89, 0xd2, 0xe, + 0x10, 0x96, 0x1d, 0x4, 0xb2, 0x1d, 0x26, 0xb0, + 0xd, 0x31, 0xd0, 0x4b, 0x0, 0xd2, 0xe5, 0x61, + 0xf0, 0x1d, 0x4, 0xb0, 0xd, 0x23, 0x1d, 0xca, + 0x1, 0xd0, 0x4b, 0x0, 0xd2, 0x0, 0x1e, 0x50, + 0x1d, 0x4, 0xb0, 0xd, 0x20, 0x4, 0xe0, 0x0, + 0x20, 0x4b, 0x0, 0xd2, 0x0, 0xd5, 0x0, 0x0, + 0x4, 0xb0, 0xd, 0x20, 0xca, 0x0, 0x0, 0x0, + 0x5b, 0x0, 0xd2, 0x7a, 0x0, 0x0, 0xa, 0xfe, + 0x60, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F9B "供" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x6, 0xa0, 0x0, 0xf0, 0x0, + 0x0, 0x4, 0xd0, 0x6, 0xa0, 0x0, 0xf0, 0x0, + 0x0, 0xc, 0x50, 0x6, 0xa0, 0x0, 0xf0, 0x0, + 0x0, 0x6f, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x2, 0xfe, 0x0, 0x17, 0xb1, 0x12, 0xf1, 0x10, + 0x1d, 0x9e, 0x0, 0x6, 0xa0, 0x0, 0xf0, 0x0, + 0x29, 0x2e, 0x0, 0x6, 0xa0, 0x0, 0xf0, 0x0, + 0x0, 0x2e, 0x0, 0x6, 0xa0, 0x0, 0xf0, 0x0, + 0x0, 0x2e, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x2e, 0x1, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x0, 0x2e, 0x0, 0x6, 0x90, 0x2, 0xb0, 0x0, + 0x0, 0x2e, 0x0, 0x2e, 0x20, 0x0, 0x9b, 0x0, + 0x0, 0x2e, 0x2, 0xe5, 0x0, 0x0, 0xb, 0x90, + 0x0, 0x2e, 0x9, 0x60, 0x0, 0x0, 0x1, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4F9D "依" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb6, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0xb, 0x72, 0x22, 0x22, 0xb3, 0x22, 0x20, + 0x0, 0x3f, 0x1d, 0xdd, 0xdf, 0xed, 0xdd, 0xd4, + 0x0, 0xdd, 0x0, 0x0, 0x7f, 0x60, 0x0, 0x0, + 0xa, 0xdd, 0x0, 0x5, 0xe7, 0xc0, 0x0, 0x50, + 0x1c, 0x3d, 0x0, 0x4f, 0x30, 0xe2, 0x8, 0xd2, + 0x0, 0x2d, 0x8, 0xfe, 0x0, 0x99, 0xb9, 0x0, + 0x0, 0x2d, 0xbc, 0x4e, 0x0, 0x2f, 0x50, 0x0, + 0x0, 0x2d, 0x10, 0x1e, 0x0, 0xa, 0x90, 0x0, + 0x0, 0x2d, 0x0, 0x1e, 0x0, 0x1, 0xe5, 0x0, + 0x0, 0x2d, 0x0, 0x1e, 0x1, 0x60, 0x4f, 0x40, + 0x0, 0x2d, 0x0, 0x4f, 0xcd, 0x80, 0x5, 0xf6, + 0x0, 0x2d, 0x0, 0xaa, 0x30, 0x0, 0x0, 0x32, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4FA1 "価" */ + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x2f, 0x10, 0x0, 0xe2, 0xd, 0x20, 0x0, + 0x0, 0xac, 0x0, 0x0, 0xd2, 0xd, 0x20, 0x0, + 0x4, 0xfc, 0x0, 0x0, 0xd2, 0xd, 0x20, 0x0, + 0x2e, 0x9c, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x28, 0x3c, 0xb, 0x40, 0xc2, 0xd, 0x0, 0xe1, + 0x0, 0x3c, 0xb, 0x40, 0xc2, 0xd, 0x0, 0xe1, + 0x0, 0x3c, 0xb, 0x40, 0xc2, 0xd, 0x0, 0xe1, + 0x0, 0x3c, 0xb, 0x40, 0xc2, 0xd, 0x0, 0xe1, + 0x0, 0x3c, 0xb, 0x40, 0xc2, 0xd, 0x0, 0xe1, + 0x0, 0x3c, 0xb, 0x50, 0xc2, 0xd, 0x10, 0xe1, + 0x0, 0x3c, 0xb, 0xfe, 0xee, 0xee, 0xee, 0xf1, + 0x0, 0x3c, 0xb, 0x40, 0x0, 0x0, 0x0, 0xd1, + + /* U+4FBF "便" */ + 0x0, 0x0, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xdc, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0xb, 0x80, 0x0, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0x30, 0x0, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x9e, 0x4, 0xfd, 0xde, 0xfd, 0xde, 0x80, + 0x2, 0xfd, 0x4, 0xa0, 0x4, 0xb0, 0x7, 0x80, + 0xd, 0xbd, 0x4, 0xeb, 0xbc, 0xeb, 0xbd, 0x80, + 0xa, 0x2d, 0x4, 0xb1, 0x16, 0xb1, 0x18, 0x80, + 0x0, 0x2d, 0x4, 0xa0, 0x5, 0xb0, 0x7, 0x80, + 0x0, 0x2d, 0x4, 0xed, 0xde, 0xfd, 0xde, 0x80, + 0x0, 0x2d, 0x4, 0x40, 0x9, 0x70, 0x0, 0x0, + 0x0, 0x2d, 0x1, 0xe5, 0x1e, 0x20, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x1c, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x1, 0x7e, 0x9c, 0xe9, 0x64, 0x20, + 0x0, 0x2d, 0x5e, 0x81, 0x0, 0x16, 0x9b, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4FC2 "係" */ + 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf1, 0x2, 0x35, 0x79, 0xcf, 0x70, + 0x0, 0x8, 0x97, 0xec, 0xcf, 0x85, 0x30, 0x0, + 0x0, 0xe, 0x30, 0x0, 0xc5, 0x0, 0x62, 0x0, + 0x0, 0x7e, 0x0, 0xb, 0x60, 0x8, 0xd1, 0x0, + 0x2, 0xfe, 0x0, 0xdf, 0xee, 0xfb, 0x10, 0x0, + 0xc, 0xae, 0x0, 0x32, 0x2c, 0x90, 0x56, 0x0, + 0x1b, 0x2e, 0x0, 0x5, 0xd5, 0x0, 0x1e, 0x30, + 0x0, 0x2e, 0x2, 0xbf, 0xbb, 0xde, 0xec, 0xd0, + 0x0, 0x2e, 0x3, 0x96, 0x56, 0xd0, 0x0, 0xa5, + 0x0, 0x2e, 0x0, 0x17, 0x3, 0xd0, 0x55, 0x0, + 0x0, 0x2e, 0x0, 0xa8, 0x3, 0xd0, 0x1e, 0x40, + 0x0, 0x2e, 0x6, 0xd0, 0x3, 0xd0, 0x3, 0xe0, + 0x0, 0x2e, 0x2e, 0x10, 0x4, 0xd0, 0x0, 0x94, + 0x0, 0x2e, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4FDD "保" */ + 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf1, 0xef, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x8, 0xa0, 0xe1, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x1f, 0x20, 0xe1, 0x0, 0x0, 0xd, 0x30, + 0x0, 0xae, 0x0, 0xe1, 0x0, 0x0, 0xd, 0x30, + 0x6, 0xfe, 0x0, 0xed, 0xdd, 0xdd, 0xdf, 0x30, + 0x4f, 0x5e, 0x0, 0x22, 0x24, 0xe2, 0x22, 0x0, + 0x25, 0x1e, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x1e, 0x1b, 0xbb, 0xbc, 0xfb, 0xbb, 0xb1, + 0x0, 0x1e, 0x3, 0x33, 0x6f, 0xfd, 0x33, 0x30, + 0x0, 0x1e, 0x0, 0x1, 0xe7, 0xe9, 0x70, 0x0, + 0x0, 0x1e, 0x0, 0xc, 0x72, 0xe0, 0xd3, 0x0, + 0x0, 0x1e, 0x3, 0xd8, 0x2, 0xe0, 0x3e, 0x40, + 0x0, 0x1e, 0x3e, 0x40, 0x2, 0xe0, 0x2, 0xe3, + 0x0, 0x1e, 0x1, 0x0, 0x2, 0xe0, 0x0, 0x10, + + /* U+4FE1 "信" */ + 0x0, 0x0, 0x50, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x0, 0xd, 0x60, 0x0, 0x0, + 0x0, 0x8, 0x80, 0x0, 0x4, 0x90, 0x0, 0x0, + 0x0, 0xe, 0x2d, 0xee, 0xee, 0xee, 0xee, 0xe3, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xee, 0x0, 0x8a, 0xaa, 0xaa, 0xaa, 0x0, + 0xb, 0x8e, 0x0, 0x23, 0x33, 0x33, 0x33, 0x0, + 0x1c, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0xae, 0xee, 0xee, 0xed, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0xee, 0xee, 0xee, 0xee, 0x10, + 0x0, 0x1e, 0x0, 0xf0, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x1e, 0x0, 0xf0, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x1e, 0x0, 0xf1, 0x11, 0x11, 0x1d, 0x10, + 0x0, 0x1e, 0x0, 0xfc, 0xcc, 0xcc, 0xce, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+4FEE "修" */ + 0x0, 0x0, 0x60, 0x0, 0x7, 0x10, 0x0, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0x4d, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x50, 0x0, 0xcf, 0xdd, 0xdd, 0xb0, + 0x0, 0x2e, 0x0, 0x8, 0xf5, 0x0, 0xb, 0x60, + 0x0, 0xac, 0x0, 0x5e, 0x3d, 0x20, 0x7c, 0x0, + 0x3, 0xfb, 0xd, 0x63, 0x4, 0xe9, 0xc0, 0x0, + 0xd, 0xbb, 0xd, 0x0, 0x17, 0xdd, 0xb3, 0x0, + 0x4b, 0x4b, 0xd, 0x7c, 0xd7, 0x10, 0x5c, 0xe6, + 0x1, 0x4b, 0xd, 0x32, 0x0, 0x8b, 0x0, 0x10, + 0x0, 0x4b, 0xd, 0x1, 0x8c, 0x60, 0x34, 0x0, + 0x0, 0x4b, 0xd, 0x1, 0x50, 0x8, 0xc1, 0x0, + 0x0, 0x4b, 0xd, 0x0, 0x4a, 0xc6, 0x2, 0xb1, + 0x0, 0x4b, 0xa, 0x0, 0x83, 0x0, 0x7d, 0x50, + 0x0, 0x4b, 0x0, 0x0, 0x25, 0xad, 0x70, 0x0, + 0x0, 0x4b, 0x0, 0xc, 0xb8, 0x30, 0x0, 0x0, + + /* U+500B "個" */ + 0x0, 0x0, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xc, 0x61, 0xe0, 0x0, 0x0, 0x0, 0xf0, 0x3, + 0xf1, 0x1e, 0x0, 0x9, 0x0, 0xf, 0x0, 0xac, + 0x1, 0xe0, 0x0, 0xd0, 0x0, 0xf0, 0x4f, 0xc0, + 0x1e, 0x5d, 0xdf, 0xdd, 0x6f, 0x1e, 0xac, 0x1, + 0xe0, 0x0, 0xd0, 0x0, 0xf5, 0xb4, 0xc0, 0x1e, + 0x2, 0x2e, 0x22, 0xf, 0x1, 0x3c, 0x1, 0xe0, + 0xba, 0xab, 0xb0, 0xf0, 0x3, 0xc0, 0x1e, 0xb, + 0x10, 0x1b, 0xf, 0x0, 0x3c, 0x1, 0xe0, 0xb1, + 0x1, 0xb0, 0xf0, 0x3, 0xc0, 0x1e, 0xa, 0xdd, + 0xda, 0xf, 0x0, 0x3c, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0xf0, 0x3, 0xc0, 0x1f, 0xee, 0xee, 0xee, + 0xef, 0x0, 0x3c, 0x1, 0xe0, 0x0, 0x0, 0x1, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5011 "們" */ + 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x8e, 0xee, 0xec, 0x4f, 0xee, 0xf0, + 0x0, 0xf, 0x3e, 0x10, 0xc, 0x49, 0x0, 0xf0, + 0x0, 0x6e, 0xe, 0x10, 0xc, 0x49, 0x0, 0xf0, + 0x0, 0xdb, 0xe, 0xdd, 0xdc, 0x4e, 0xdd, 0xf0, + 0x7, 0xfb, 0xe, 0x10, 0xc, 0x49, 0x0, 0xf0, + 0x2f, 0x8b, 0xe, 0xcc, 0xcc, 0x4e, 0xcc, 0xf0, + 0x38, 0x4b, 0xe, 0x21, 0x10, 0x1, 0x11, 0xf0, + 0x0, 0x4b, 0xe, 0x10, 0x0, 0x0, 0x0, 0xf0, + 0x0, 0x4b, 0xe, 0x10, 0x0, 0x0, 0x0, 0xf0, + 0x0, 0x4b, 0xe, 0x10, 0x0, 0x0, 0x0, 0xf0, + 0x0, 0x4b, 0xe, 0x10, 0x0, 0x0, 0x0, 0xf0, + 0x0, 0x4b, 0xe, 0x10, 0x0, 0x0, 0x0, 0xf0, + 0x0, 0x4b, 0xe, 0x10, 0x0, 0x0, 0x1, 0xf0, + 0x0, 0x4b, 0xe, 0x10, 0x0, 0xa, 0xfe, 0x90, + + /* U+5019 "候" */ + 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x50, 0xb, 0xee, 0xee, 0xf9, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x97, 0x0, + 0x0, 0x89, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, + 0x0, 0xe3, 0x3a, 0x7b, 0xbb, 0xbb, 0xfc, 0xb2, + 0x8, 0xf2, 0x3b, 0x23, 0xb4, 0x33, 0x33, 0x30, + 0x3f, 0xf2, 0x3b, 0x3, 0xd1, 0x11, 0x11, 0x0, + 0x77, 0xd2, 0x3b, 0xa, 0xed, 0xfd, 0xdd, 0x80, + 0x0, 0xd2, 0x3b, 0x4d, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0xd2, 0x3b, 0x33, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0xd2, 0x3b, 0x8e, 0xee, 0xfe, 0xee, 0xe2, + 0x0, 0xd2, 0x3b, 0x0, 0x5, 0xf8, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x0, 0x1e, 0x5e, 0x50, 0x0, + 0x0, 0xd2, 0x0, 0x6, 0xe5, 0x2, 0xda, 0x30, + 0x0, 0xd2, 0x0, 0xa9, 0x20, 0x0, 0x6, 0xc2, + + /* U+501F "借" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0x6, 0x90, 0x4, 0xc0, 0x0, + 0x0, 0x5, 0xd1, 0x28, 0xa2, 0x26, 0xd2, 0x20, + 0x0, 0xd, 0x67, 0xce, 0xec, 0xcd, 0xfc, 0xc0, + 0x0, 0x6e, 0x0, 0x6, 0x90, 0x4, 0xc0, 0x0, + 0x2, 0xfd, 0x0, 0x7, 0xa0, 0x5, 0xc0, 0x0, + 0x2e, 0xad, 0x4e, 0xee, 0xee, 0xee, 0xee, 0xea, + 0x39, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x8e, 0xee, 0xee, 0xee, 0x30, + 0x0, 0x2d, 0x0, 0x87, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x2d, 0x0, 0x87, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x2d, 0x0, 0x8e, 0xdd, 0xdd, 0xdf, 0x30, + 0x0, 0x2d, 0x0, 0x87, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x2d, 0x0, 0x88, 0x22, 0x22, 0x2d, 0x30, + 0x0, 0x2c, 0x0, 0x8e, 0xcc, 0xcc, 0xce, 0x30, + + /* U+5024 "値" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa7, 0x0, 0x0, 0xa7, 0x0, 0x0, + 0x0, 0x2, 0xe1, 0xee, 0xee, 0xff, 0xee, 0xea, + 0x0, 0xa, 0x70, 0x0, 0x0, 0xe4, 0x0, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x22, 0xf3, 0x22, 0x10, + 0x1, 0xed, 0x1, 0xb0, 0xeb, 0xbb, 0xbc, 0xb0, + 0xc, 0xbd, 0x1, 0xe0, 0xe1, 0x0, 0x4, 0xb0, + 0x4b, 0x2d, 0x1, 0xe0, 0xed, 0xcc, 0xcd, 0xb0, + 0x0, 0x2d, 0x1, 0xe0, 0xe1, 0x0, 0x4, 0xb0, + 0x0, 0x2d, 0x1, 0xe0, 0xed, 0xcc, 0xcd, 0xb0, + 0x0, 0x2d, 0x1, 0xe0, 0xe1, 0x0, 0x4, 0xb0, + 0x0, 0x2d, 0x1, 0xe0, 0xed, 0xdd, 0xde, 0xb0, + 0x0, 0x2d, 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x1, 0xfb, 0xbb, 0xbb, 0xbb, 0xb9, + 0x0, 0x2d, 0x1, 0xe3, 0x33, 0x33, 0x33, 0x32, + + /* U+503C "值" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0x0, 0x4, 0xd0, 0x0, 0x0, + 0x0, 0x4, 0xd8, 0xee, 0xef, 0xfe, 0xee, 0xe0, + 0x0, 0xb, 0x60, 0x0, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x4e, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, + 0x1, 0xec, 0x0, 0xae, 0xdd, 0xdd, 0xdf, 0x0, + 0xc, 0xdc, 0x0, 0xa5, 0x0, 0x0, 0xf, 0x0, + 0x1b, 0x3c, 0x0, 0xad, 0xcc, 0xcc, 0xcf, 0x0, + 0x0, 0x2c, 0x0, 0xa5, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x2c, 0x0, 0xad, 0xcc, 0xcc, 0xcf, 0x0, + 0x0, 0x2c, 0x0, 0xa5, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x2c, 0x0, 0xa7, 0x22, 0x22, 0x2f, 0x0, + 0x0, 0x2c, 0x0, 0xac, 0xaa, 0xaa, 0xaf, 0x0, + 0x0, 0x2c, 0x0, 0xa5, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x2c, 0x2e, 0xff, 0xee, 0xee, 0xef, 0xe7, + + /* U+505A "做" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0xb, 0x50, 0xa6, 0x0, 0x3c, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0xa6, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x89, 0x0, 0xa6, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0xe4, 0xde, 0xff, 0xe8, 0xed, 0xdf, 0xe1, + 0x8, 0xf4, 0x0, 0xa6, 0x4, 0xf0, 0xb, 0x30, + 0x4e, 0xd4, 0x0, 0xa6, 0xa, 0xf1, 0xe, 0x0, + 0xc5, 0xb4, 0x0, 0xa6, 0x1d, 0x94, 0xd, 0x0, + 0x10, 0xb4, 0x7f, 0xee, 0xf4, 0x58, 0x4a, 0x0, + 0x0, 0xb4, 0x77, 0x0, 0xb3, 0x1d, 0x95, 0x0, + 0x0, 0xb4, 0x77, 0x0, 0xb3, 0xc, 0xe0, 0x0, + 0x0, 0xb4, 0x77, 0x0, 0xb3, 0x9, 0xb0, 0x0, + 0x0, 0xb4, 0x79, 0x33, 0xc3, 0x3e, 0xe3, 0x0, + 0x0, 0xb4, 0x7d, 0xbb, 0xb5, 0xd3, 0x3d, 0x20, + 0x0, 0xb4, 0x45, 0x0, 0x4b, 0x10, 0x3, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+505C "停" */ + 0x0, 0x0, 0x31, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x4, 0xd0, 0x0, 0x0, + 0x0, 0x6, 0xc9, 0xee, 0xee, 0xfe, 0xee, 0xe6, + 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0x0, 0x6e, 0xcc, 0xcc, 0xcf, 0x0, + 0x1, 0xec, 0x0, 0x69, 0x0, 0x0, 0xf, 0x0, + 0xb, 0xcc, 0x0, 0x6d, 0xcc, 0xcc, 0xce, 0x0, + 0x1b, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0xd, 0xee, 0xee, 0xee, 0xee, 0xf6, + 0x0, 0x2c, 0xd, 0x10, 0x0, 0x0, 0x0, 0x96, + 0x0, 0x2c, 0x7, 0x7e, 0xee, 0xee, 0xee, 0x53, + 0x0, 0x2c, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x2c, 0x0, 0x7, 0xee, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5065 "健" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x52, 0x21, 0x0, 0x76, 0x0, 0x0, + 0x0, 0x3d, 0x5c, 0xea, 0x6c, 0xee, 0xce, 0x0, + 0x0, 0x96, 0x0, 0xd3, 0x0, 0x76, 0xd, 0x0, + 0x2, 0xf2, 0x4, 0xb6, 0xdd, 0xee, 0xdf, 0xd1, + 0xc, 0xf2, 0xb, 0x20, 0x0, 0x76, 0xd, 0x0, + 0x6c, 0xd2, 0x8e, 0xb6, 0x6d, 0xee, 0xde, 0x0, + 0x32, 0xc2, 0x43, 0x87, 0x0, 0x76, 0x0, 0x0, + 0x0, 0xc2, 0x30, 0x85, 0xac, 0xed, 0xcc, 0x20, + 0x0, 0xc2, 0xb2, 0xa3, 0x11, 0x87, 0x11, 0x0, + 0x0, 0xc2, 0x67, 0xd1, 0x11, 0x87, 0x11, 0x10, + 0x0, 0xc2, 0xd, 0xb5, 0xbb, 0xdd, 0xbb, 0x80, + 0x0, 0xc2, 0xb, 0xb1, 0x0, 0x76, 0x0, 0x0, + 0x0, 0xc2, 0x7c, 0x9e, 0x95, 0xb8, 0x11, 0x10, + 0x0, 0xc6, 0xc0, 0x1, 0x69, 0xbc, 0xdd, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5074 "側" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xab, 0xee, 0xef, 0x10, 0x0, 0xe1, + 0x0, 0xd, 0x3b, 0x20, 0xe, 0x1c, 0x20, 0xe1, + 0x0, 0x4d, 0xb, 0x20, 0xe, 0x1c, 0x20, 0xe1, + 0x0, 0xbb, 0xb, 0xee, 0xef, 0x1c, 0x20, 0xe1, + 0x5, 0xfb, 0xb, 0x20, 0xe, 0x1c, 0x20, 0xe1, + 0x2e, 0x7b, 0xb, 0x20, 0xe, 0x1c, 0x20, 0xe1, + 0x37, 0x4b, 0xb, 0xdd, 0xdf, 0x1c, 0x20, 0xe1, + 0x0, 0x4b, 0xb, 0x30, 0xe, 0x1c, 0x20, 0xe1, + 0x0, 0x4b, 0xb, 0x20, 0xe, 0x1c, 0x20, 0xe1, + 0x0, 0x4b, 0xb, 0xcb, 0xbf, 0x1c, 0x20, 0xe1, + 0x0, 0x4b, 0x2, 0x63, 0x54, 0x5, 0x10, 0xe1, + 0x0, 0x4b, 0x4, 0xd0, 0x6a, 0x0, 0x0, 0xe1, + 0x0, 0x4b, 0x1d, 0x40, 0xc, 0x30, 0x0, 0xe1, + 0x0, 0x4b, 0x56, 0x0, 0x3, 0x11, 0xff, 0xb0, + + /* U+5099 "備" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x2, 0xd0, 0x5, 0xb0, 0x0, + 0x0, 0x9, 0x79, 0xef, 0xfe, 0xef, 0xfe, 0xd0, + 0x0, 0x1e, 0x0, 0x3, 0xd0, 0x5, 0xb0, 0x0, + 0x0, 0x7c, 0x0, 0x3, 0xd0, 0x5, 0xb0, 0x0, + 0x2, 0xfb, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xc, 0xcb, 0x0, 0x4d, 0x20, 0x0, 0x0, 0x0, + 0xb, 0x4b, 0x5, 0xff, 0xee, 0xee, 0xee, 0x80, + 0x0, 0x4b, 0xae, 0xe3, 0x0, 0xe0, 0x6, 0x90, + 0x0, 0x4b, 0x41, 0xc6, 0x23, 0xe2, 0x28, 0x90, + 0x0, 0x4b, 0x0, 0xcc, 0xab, 0xfa, 0xad, 0x90, + 0x0, 0x4b, 0x0, 0xc3, 0x0, 0xe0, 0x6, 0x90, + 0x0, 0x4b, 0x0, 0xce, 0xdd, 0xfd, 0xde, 0x90, + 0x0, 0x4b, 0x0, 0xc3, 0x0, 0xe0, 0x7, 0x90, + 0x0, 0x4b, 0x0, 0xc3, 0x0, 0xe0, 0x7e, 0x50, + + /* U+50B3 "傳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x6, 0xbc, 0xdd, 0xde, 0xed, 0xdd, 0xd2, + 0x0, 0xe, 0x41, 0x44, 0x49, 0xb4, 0x44, 0x20, + 0x0, 0x6e, 0x4, 0xd5, 0x5a, 0xb5, 0x5b, 0x80, + 0x2, 0xfd, 0x4, 0xea, 0xad, 0xda, 0xad, 0x80, + 0x1d, 0x8d, 0x4, 0xb0, 0x7, 0x90, 0x8, 0x80, + 0x49, 0x2d, 0x3, 0xdb, 0xbd, 0xeb, 0xcd, 0x70, + 0x0, 0x2d, 0x0, 0x0, 0x7, 0x91, 0x7c, 0x10, + 0x0, 0x2d, 0xd, 0xdd, 0xdc, 0xcb, 0xfa, 0xd2, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x30, + 0x0, 0x2d, 0x4e, 0xee, 0xee, 0xee, 0xfe, 0xe4, + 0x0, 0x2d, 0x0, 0x3c, 0x10, 0x0, 0xf0, 0x0, + 0x0, 0x2d, 0x0, 0x4, 0xd0, 0x0, 0xf0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x3, 0xee, 0xc0, 0x0, + + /* U+50C5 "僅" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd1, 0x9, 0x60, 0x0, 0xf0, 0x0, + 0x0, 0x6, 0xbb, 0xdf, 0xed, 0xdd, 0xfd, 0xd4, + 0x0, 0xd, 0x40, 0x9, 0x60, 0x0, 0xf0, 0x0, + 0x0, 0x6e, 0x0, 0x8, 0xdc, 0xdc, 0xe0, 0x0, + 0x2, 0xfd, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x1d, 0xbd, 0x0, 0xfc, 0xcd, 0xec, 0xce, 0x80, + 0x4a, 0x2d, 0x0, 0xe0, 0x5, 0xb0, 0x7, 0x80, + 0x0, 0x2d, 0x0, 0xec, 0xcd, 0xfc, 0xcd, 0x80, + 0x0, 0x2d, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x2d, 0x5, 0xdd, 0xde, 0xfd, 0xdd, 0xa0, + 0x0, 0x2d, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0xdd, 0xde, 0xfd, 0xdd, 0x60, + 0x0, 0x2d, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x2d, 0xd, 0xdd, 0xde, 0xfd, 0xdd, 0xd4, + + /* U+50CD "働" */ + 0x0, 0xd, 0x10, 0x13, 0x57, 0xb, 0x30, 0x0, + 0x4, 0xc9, 0xbb, 0xd6, 0x30, 0xb3, 0x0, 0x0, + 0xb5, 0x66, 0x9d, 0x66, 0x1b, 0x30, 0x0, 0x2f, + 0x24, 0x47, 0xc4, 0x4a, 0xed, 0xcb, 0xc, 0xf2, + 0x8b, 0xde, 0xbb, 0x3b, 0x41, 0xf7, 0xbc, 0x2b, + 0x12, 0x90, 0x93, 0xc3, 0xe, 0x92, 0xc2, 0xbb, + 0xce, 0xbe, 0x3d, 0x20, 0xe0, 0xc, 0x2b, 0x12, + 0x90, 0x93, 0xe1, 0x1d, 0x0, 0xc2, 0xbc, 0xce, + 0xbe, 0x3e, 0x2, 0xd0, 0xc, 0x20, 0x4, 0xa0, + 0x3, 0xd0, 0x2c, 0x0, 0xc2, 0xad, 0xef, 0xdd, + 0x98, 0x3, 0xb0, 0xc, 0x20, 0x4, 0xa0, 0xd, + 0x40, 0x5a, 0x0, 0xc3, 0x68, 0xbe, 0xcd, 0xc0, + 0x9, 0x80, 0xc, 0x37, 0x64, 0x20, 0xb3, 0x9f, + 0xe2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+50CF "像" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x5, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x1e, 0xcc, 0xdf, 0x40, 0x0, + 0x0, 0xc, 0x62, 0xd5, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x5e, 0x4e, 0xfd, 0xdd, 0xfd, 0xde, 0xc0, + 0x2, 0xfd, 0x24, 0xe0, 0x3, 0xc0, 0x3, 0xc0, + 0xd, 0xad, 0x0, 0xfa, 0xad, 0xda, 0xac, 0xc0, + 0x9, 0x2d, 0x0, 0x24, 0xeb, 0x22, 0x22, 0x20, + 0x0, 0x2d, 0x2, 0x9d, 0x5c, 0x50, 0x1a, 0x90, + 0x0, 0x2d, 0x9, 0x50, 0x4c, 0xe8, 0xf7, 0x0, + 0x0, 0x2d, 0x0, 0x4a, 0x90, 0xc9, 0x88, 0x0, + 0x0, 0x2d, 0xc, 0xa2, 0x1a, 0xc9, 0x1e, 0x10, + 0x0, 0x2d, 0x0, 0x17, 0xc3, 0x5a, 0x6, 0xd2, + 0x0, 0x2d, 0x1a, 0xd7, 0x0, 0xa8, 0x0, 0x6a, + 0x0, 0x2d, 0x4, 0x0, 0x7e, 0xc1, 0x0, 0x0, + + /* U+50D5 "僕" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x70, 0x67, 0xe, 0x3, 0x60, + 0x0, 0x4, 0xe0, 0xa5, 0x67, 0xe, 0xc, 0x40, + 0x0, 0xc, 0x61, 0x46, 0x78, 0x1e, 0x28, 0x10, + 0x0, 0x5e, 0xd, 0xdf, 0xdd, 0xdd, 0xfe, 0xd6, + 0x1, 0xed, 0x0, 0x9, 0x70, 0x1, 0xe1, 0x0, + 0x1d, 0x8d, 0x5, 0xab, 0xea, 0xac, 0xda, 0xa0, + 0x4a, 0x2d, 0x1, 0x22, 0x26, 0xc2, 0x22, 0x20, + 0x0, 0x2d, 0x0, 0x22, 0x26, 0xc2, 0x22, 0x10, + 0x0, 0x2d, 0x0, 0xbb, 0xbc, 0xeb, 0xbb, 0x50, + 0x0, 0x2d, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x2d, 0x1e, 0xee, 0xef, 0xfe, 0xee, 0xe8, + 0x0, 0x2d, 0x0, 0x0, 0x3e, 0x9a, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x29, 0xd3, 0x6, 0xd6, 0x20, + 0x0, 0x2d, 0xb, 0xc6, 0x0, 0x0, 0x28, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+50F9 "價" */ + 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x9c, 0xdd, 0xfd, 0xdf, 0xdd, 0xd4, + 0x0, 0xe, 0x40, 0x0, 0xb2, 0xe, 0x0, 0x0, + 0x0, 0x4e, 0x6, 0xbb, 0xec, 0xbf, 0xbb, 0xa0, + 0x0, 0xbb, 0x8, 0x60, 0xb2, 0xe, 0x1, 0xd0, + 0x4, 0xfb, 0x8, 0xa6, 0xd7, 0x6f, 0x67, 0xd0, + 0xd, 0xbb, 0x2, 0x55, 0x55, 0x55, 0x55, 0x40, + 0x5b, 0x4b, 0x2, 0xdb, 0xbb, 0xbb, 0xbc, 0x90, + 0x1, 0x4b, 0x2, 0xd0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x4b, 0x2, 0xfb, 0xbb, 0xbb, 0xbd, 0xa0, + 0x0, 0x4b, 0x2, 0xe6, 0x66, 0x66, 0x69, 0xa0, + 0x0, 0x4b, 0x2, 0xe4, 0x44, 0x44, 0x48, 0xa0, + 0x0, 0x4b, 0x2, 0xeb, 0xbb, 0xbb, 0xbc, 0x90, + 0x0, 0x4b, 0x0, 0x29, 0xa0, 0x7, 0xb5, 0x0, + 0x0, 0x4b, 0x1c, 0xa4, 0x0, 0x0, 0x17, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5104 "億" */ + 0x0, 0x0, 0x21, 0x0, 0x5, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0x5, 0xc5, 0xdd, 0xde, 0xfd, 0xdd, 0xd0, + 0x0, 0xc, 0x50, 0x8, 0x50, 0x1, 0xd0, 0x0, + 0x0, 0x5e, 0x16, 0x69, 0xb6, 0x6a, 0xc6, 0x64, + 0x1, 0xed, 0x6, 0x66, 0x66, 0x66, 0x66, 0x64, + 0xb, 0xbd, 0x0, 0x8b, 0xbb, 0xbb, 0xbb, 0x30, + 0xb, 0x2d, 0x0, 0xb4, 0x0, 0x0, 0xc, 0x40, + 0x0, 0x2d, 0x0, 0xbc, 0xaa, 0xaa, 0xae, 0x40, + 0x0, 0x2d, 0x0, 0xb4, 0x0, 0x0, 0xc, 0x40, + 0x0, 0x2d, 0x0, 0xac, 0xbc, 0xbb, 0xbd, 0x30, + 0x0, 0x2d, 0x0, 0x33, 0x4c, 0x80, 0x6, 0x0, + 0x0, 0x2d, 0x5, 0x98, 0x70, 0x85, 0xa, 0x80, + 0x0, 0x2d, 0xd, 0x28, 0x70, 0x0, 0x85, 0xe3, + 0x0, 0x2d, 0x6, 0x4, 0xee, 0xee, 0xd2, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+512A "優" */ + 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x8c, 0xdd, 0xdf, 0xed, 0xdd, 0xd1, + 0x0, 0xe, 0x30, 0x12, 0x2d, 0x62, 0x21, 0x0, + 0x0, 0x5e, 0x0, 0xbb, 0x99, 0x99, 0xac, 0x0, + 0x0, 0xcb, 0x0, 0xbb, 0x99, 0x99, 0xac, 0x0, + 0x5, 0xfb, 0x0, 0xb7, 0x44, 0x44, 0x6c, 0x0, + 0x1e, 0xab, 0x0, 0xb8, 0x55, 0x55, 0x7c, 0x0, + 0x4b, 0x4b, 0x3d, 0xcb, 0xbe, 0xbb, 0xbc, 0xd4, + 0x1, 0x4b, 0x49, 0x56, 0x65, 0xb0, 0x46, 0xa5, + 0x0, 0x4b, 0x8, 0xc4, 0xc5, 0x58, 0x7a, 0x91, + 0x0, 0x4b, 0x4, 0x2, 0xe7, 0x54, 0x0, 0x50, + 0x0, 0x4b, 0x0, 0x7f, 0xcb, 0xbb, 0xe7, 0x0, + 0x0, 0x4b, 0x2d, 0x78, 0xc2, 0x2a, 0x90, 0x0, + 0x0, 0x4b, 0x0, 0x3, 0xbf, 0xfb, 0x42, 0x0, + 0x0, 0x4b, 0x4d, 0xc9, 0x51, 0x16, 0xad, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+513F "儿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x4, 0xd0, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x8, 0xa0, 0x0, 0x0, 0xf1, 0x0, 0x30, + 0x0, 0x1e, 0x40, 0x0, 0x0, 0xf1, 0x0, 0xc3, + 0x0, 0x9b, 0x0, 0x0, 0x0, 0xf1, 0x0, 0xd2, + 0x7, 0xe2, 0x0, 0x0, 0x0, 0xe4, 0x1, 0xf0, + 0x4d, 0x20, 0x0, 0x0, 0x0, 0x9f, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5143 "元" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd0, + 0x2, 0x22, 0x2f, 0x52, 0x2a, 0x92, 0x22, 0x20, + 0x0, 0x0, 0x1f, 0x10, 0x9, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x9, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x9, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xe5, 0x0, 0x9, 0x70, 0x0, 0xa2, + 0x0, 0x9, 0xc0, 0x0, 0x9, 0x70, 0x0, 0xc3, + 0x1, 0x9e, 0x10, 0x0, 0x9, 0x90, 0x1, 0xe1, + 0xe, 0xb2, 0x0, 0x0, 0x4, 0xef, 0xff, 0x90, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5144 "兄" */ + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x1, 0x1b, 0x91, 0x15, 0xc1, 0x11, 0x0, + 0x0, 0x0, 0xc, 0x60, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x30, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0x0, 0x4, 0xc0, 0x0, 0x36, + 0x0, 0x3, 0xf5, 0x0, 0x4, 0xc0, 0x0, 0x5a, + 0x0, 0x7f, 0x70, 0x0, 0x4, 0xd0, 0x0, 0x98, + 0xd, 0xc4, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5145 "充" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xd1, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x1, 0x11, 0x1b, 0xc1, 0x11, 0x21, 0x11, 0x10, + 0x0, 0x0, 0x6e, 0x10, 0x2, 0xe3, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x0, 0x0, 0x5f, 0x50, 0x0, + 0x0, 0x3e, 0x71, 0x22, 0x34, 0x5a, 0xf5, 0x0, + 0x0, 0xdf, 0xff, 0xfd, 0xcf, 0xca, 0x9f, 0x30, + 0x0, 0x21, 0x8, 0x90, 0xc, 0x50, 0x5, 0x20, + 0x0, 0x0, 0xb, 0x60, 0xc, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x20, 0xc, 0x50, 0x0, 0x40, + 0x0, 0x0, 0xab, 0x0, 0xc, 0x50, 0x0, 0xc3, + 0x0, 0x2b, 0xd1, 0x0, 0xc, 0x60, 0x0, 0xf1, + 0xa, 0xfa, 0x10, 0x0, 0x7, 0xff, 0xff, 0xa0, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5148 "先" */ + 0x0, 0x0, 0x90, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x3d, 0x11, 0x19, 0x91, 0x11, 0x11, 0x0, + 0x0, 0xd4, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x80, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x4, 0x44, 0x44, 0x4a, 0xa4, 0x44, 0x44, 0x40, + 0xc, 0xcc, 0xcf, 0xdc, 0xce, 0xec, 0xcc, 0xc0, + 0x0, 0x0, 0xe, 0x30, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0x0, 0x7, 0x90, 0x0, 0x20, + 0x0, 0x2, 0xe4, 0x0, 0x7, 0x90, 0x0, 0xc3, + 0x0, 0x5e, 0x70, 0x0, 0x7, 0xa0, 0x0, 0xe1, + 0xd, 0xd5, 0x0, 0x0, 0x3, 0xef, 0xff, 0xa0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5149 "光" */ + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x12, 0x0, + 0x0, 0x8a, 0x0, 0x9, 0x70, 0x0, 0x9a, 0x0, + 0x0, 0xe, 0x40, 0x9, 0x70, 0x1, 0xf2, 0x0, + 0x0, 0x6, 0xc0, 0x9, 0x70, 0xa, 0x80, 0x0, + 0x0, 0x0, 0xc1, 0x9, 0x70, 0x1c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xd, 0x40, 0x8, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x10, 0x8, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xb7, 0x0, 0x8, 0x80, 0x0, 0x41, + 0x0, 0x8, 0xd1, 0x0, 0x8, 0x80, 0x0, 0xb4, + 0x2, 0xae, 0x20, 0x0, 0x8, 0x90, 0x0, 0xe2, + 0x2d, 0x80, 0x0, 0x0, 0x4, 0xef, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+514B "克" */ + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xee, 0xef, 0xfe, 0xee, 0xe2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x1e, 0xef, 0xfe, 0xef, 0xfe, 0xe2, 0x0, + 0x0, 0x0, 0xa, 0x70, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x30, 0xd, 0x30, 0x0, 0x10, + 0x0, 0x0, 0xab, 0x0, 0xd, 0x30, 0x0, 0xb4, + 0x0, 0x5d, 0xc1, 0x0, 0xd, 0x50, 0x1, 0xe2, + 0x1e, 0xc7, 0x0, 0x0, 0x8, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+514D "免" */ + 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xee, 0xef, 0xd0, 0x0, 0x0, + 0x0, 0x7, 0xd1, 0x0, 0xc, 0x50, 0x0, 0x0, + 0x0, 0x9f, 0x42, 0x22, 0x9c, 0x22, 0x22, 0x0, + 0xa, 0xff, 0xcc, 0xcd, 0xfc, 0xcc, 0xcf, 0x30, + 0x5, 0x5c, 0x0, 0x6, 0xc0, 0x0, 0xe, 0x30, + 0x0, 0x4c, 0x0, 0x8, 0xa0, 0x0, 0xe, 0x30, + 0x0, 0x4d, 0x33, 0x3b, 0xa3, 0x33, 0x3f, 0x30, + 0x0, 0x3b, 0xbb, 0xbf, 0xcf, 0xcb, 0xbb, 0x20, + 0x0, 0x0, 0x0, 0x5d, 0xf, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe5, 0xf, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x90, 0xf, 0x10, 0x0, 0x95, + 0x0, 0x39, 0xf7, 0x0, 0xf, 0x20, 0x0, 0xc4, + 0xa, 0xe8, 0x20, 0x0, 0xa, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5152 "兒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xe6, 0x1, 0x11, 0x11, 0x0, + 0x0, 0x2e, 0xa6, 0x10, 0xd, 0xee, 0xee, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3f, 0xee, 0xe5, 0xd, 0xee, 0xee, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x2, 0xf0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xd0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x80, 0xe, 0x20, 0x0, 0x21, + 0x0, 0x0, 0x5f, 0x10, 0xe, 0x20, 0x0, 0x87, + 0x0, 0x18, 0xe3, 0x0, 0xe, 0x30, 0x0, 0xa5, + 0xa, 0xe9, 0x10, 0x0, 0x9, 0xed, 0xdd, 0xc1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+515A "党" */ + 0x0, 0x9, 0x10, 0xe, 0x20, 0x0, 0xb2, 0x0, + 0x0, 0x7, 0xb0, 0xe, 0x20, 0x8, 0xb0, 0x0, + 0x2, 0x22, 0xc4, 0x2e, 0x52, 0x5e, 0x32, 0x20, + 0xe, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, 0xd0, + 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0xd0, + 0xe, 0x13, 0xfe, 0xee, 0xee, 0xef, 0x23, 0xd0, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x3, 0xfc, 0xcc, 0xcc, 0xcf, 0x20, 0x0, + 0x0, 0x0, 0x28, 0xa2, 0x7d, 0x22, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x40, 0x5c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8c, 0x0, 0x5c, 0x0, 0x0, 0xa3, + 0x1, 0x5c, 0xc1, 0x0, 0x5d, 0x0, 0x0, 0xd3, + 0x2f, 0xb6, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5165 "入" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7e, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0x8b, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8a, 0xe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe5, 0x7, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xd0, 0x0, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x40, 0x0, 0x6e, 0x0, 0x0, + 0x0, 0x1, 0xda, 0x0, 0x0, 0xc, 0xa0, 0x0, + 0x0, 0x1c, 0xc0, 0x0, 0x0, 0x1, 0xe9, 0x0, + 0x4, 0xec, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xc1, + 0x1e, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5167 "內" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe1, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x2e, 0x11, 0x11, 0xee, 0x21, + 0x11, 0xe2, 0x2e, 0x0, 0x3, 0xca, 0x60, 0x0, + 0xe2, 0x2e, 0x0, 0xb, 0x64, 0xd0, 0x0, 0xe2, + 0x2e, 0x0, 0x5d, 0x0, 0xd7, 0x0, 0xe2, 0x2e, + 0x5, 0xe3, 0x0, 0x3f, 0x70, 0xe2, 0x2e, 0x8e, + 0x30, 0x0, 0x4, 0xd8, 0xe2, 0x2e, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x2e, 0x0, 0x0, 0x0, 0x1, + 0x11, 0xf1, 0x2e, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xb0, + + /* U+5168 "全" */ + 0x0, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd6, 0x4e, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x60, 0x4, 0xe4, 0x0, 0x0, + 0x0, 0x4, 0xe6, 0x0, 0x0, 0x3e, 0x80, 0x0, + 0x1, 0x9d, 0x40, 0x0, 0x0, 0x2, 0xcd, 0x30, + 0x3f, 0x89, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0xf5, + 0x2, 0x3, 0x44, 0x4a, 0xb4, 0x44, 0x40, 0x20, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xee, 0xef, 0xfe, 0xee, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + + /* U+5169 "兩" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0x3, + 0x33, 0x33, 0xb8, 0x33, 0x33, 0x30, 0x2, 0xfc, + 0xcc, 0xce, 0xdc, 0xcc, 0xcf, 0x20, 0x2d, 0x0, + 0x0, 0x96, 0x0, 0x0, 0xe2, 0x2, 0xd0, 0xb2, + 0x9, 0x61, 0xc0, 0xe, 0x20, 0x2d, 0x6, 0xa0, + 0x96, 0xb, 0x40, 0xe2, 0x2, 0xd0, 0xae, 0x29, + 0x60, 0xec, 0xe, 0x20, 0x2d, 0xd, 0x68, 0x96, + 0x49, 0xb3, 0xe2, 0x2, 0xd7, 0x71, 0xe9, 0x6c, + 0x36, 0x8e, 0x20, 0x2d, 0x80, 0x6, 0xa7, 0x70, + 0x17, 0xe2, 0x2, 0xd0, 0x0, 0x9, 0x60, 0x0, + 0xe, 0x20, 0x2d, 0x0, 0x0, 0x11, 0x0, 0xee, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+516B "八" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x10, 0x7, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x89, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0xf2, 0x0, 0x0, 0x6b, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0xa, 0x80, 0x0, + 0x0, 0x2f, 0x0, 0x0, 0x0, 0x3, 0xf2, 0x0, + 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x9b, 0x0, + 0xa, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x90, + 0x2d, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+516C "公" */ + 0x0, 0x0, 0x9, 0x20, 0x3, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0x0, 0x0, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0xe5, 0x0, 0x0, 0x4e, 0x10, 0x0, + 0x0, 0x8, 0xc0, 0x0, 0x0, 0xa, 0xb0, 0x0, + 0x0, 0x4f, 0x30, 0x1, 0x0, 0x1, 0xe8, 0x0, + 0x3, 0xe7, 0x0, 0xe, 0x60, 0x0, 0x2f, 0x80, + 0xd, 0x80, 0x0, 0x8d, 0x0, 0x0, 0x4, 0xe2, + 0x0, 0x0, 0x2, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0x10, 0x0, 0xaa, 0x0, 0x0, + 0x0, 0x2, 0xe4, 0x0, 0x0, 0xd, 0x70, 0x0, + 0x0, 0x1d, 0x81, 0x23, 0x34, 0x59, 0xf3, 0x0, + 0x0, 0xaf, 0xff, 0xfe, 0xdc, 0xba, 0xbd, 0x0, + 0x0, 0x23, 0x10, 0x0, 0x0, 0x0, 0xd, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+516D "六" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xf0, 0x0, 0x0, 0x0, + 0x2, 0x22, 0x22, 0x22, 0x62, 0x22, 0x22, 0x20, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0xe4, 0x0, 0x0, + 0x0, 0x0, 0xd7, 0x0, 0x0, 0x6e, 0x10, 0x0, + 0x0, 0x7, 0xe0, 0x0, 0x0, 0xb, 0xa0, 0x0, + 0x0, 0x1e, 0x50, 0x0, 0x0, 0x1, 0xf5, 0x0, + 0x0, 0xbb, 0x0, 0x0, 0x0, 0x0, 0x6e, 0x10, + 0x7, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xc, 0xa0, + 0x1e, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5171 "共" */ + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x5c, 0x0, 0x0, 0x8a, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x0, 0x0, 0x5c, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0x30, 0x1, 0xc4, 0x0, 0x0, + 0x0, 0x2, 0xd8, 0x0, 0x0, 0x4e, 0x80, 0x0, + 0x0, 0x6e, 0x70, 0x0, 0x0, 0x2, 0xdb, 0x0, + 0x8, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xb, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5176 "其" */ + 0x0, 0x1, 0xe0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x2, 0x45, 0xf4, 0x44, 0x44, 0x4f, 0x54, 0x30, + 0x7, 0xbc, 0xfb, 0xbb, 0xbb, 0xbf, 0xcb, 0x80, + 0x0, 0x1, 0xe0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x1, 0xfe, 0xee, 0xee, 0xef, 0x10, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x1, 0xfe, 0xee, 0xee, 0xef, 0x10, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x2, 0xe0, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x8, 0x40, 0x4, 0x71, 0x0, 0x0, + 0x0, 0x28, 0xe9, 0x10, 0x2, 0x8e, 0xa3, 0x0, + 0xb, 0xe8, 0x20, 0x0, 0x0, 0x0, 0x6e, 0xa0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+5177 "具" */ + 0x0, 0x9, 0xfe, 0xee, 0xee, 0xee, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x4, 0xc0, 0x0, + 0x0, 0x9, 0xec, 0xcc, 0xcc, 0xcd, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x9, 0xed, 0xdd, 0xdd, 0xdd, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x9, 0xed, 0xdd, 0xdd, 0xdd, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x4, 0xd0, 0x0, + 0x2e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe2, + 0x0, 0x0, 0x4b, 0x10, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x2a, 0xe4, 0x0, 0x0, 0x3b, 0xe6, 0x0, + 0x1a, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x4d, 0xc1, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+5185 "内" */ + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x2e, 0xee, + 0xee, 0xef, 0xee, 0xee, 0xec, 0x2e, 0x22, 0x22, + 0x7c, 0x22, 0x22, 0x5d, 0x2e, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x3d, 0x2e, 0x0, 0x0, 0xbb, 0x0, + 0x0, 0x3d, 0x2e, 0x0, 0x2, 0xfa, 0xb0, 0x0, + 0x3d, 0x2e, 0x0, 0xc, 0x80, 0x9d, 0x10, 0x3d, + 0x2e, 0x0, 0x9c, 0x0, 0x8, 0xd1, 0x3d, 0x2e, + 0x2c, 0xc1, 0x0, 0x0, 0x8d, 0x4d, 0x2e, 0x27, + 0x0, 0x0, 0x0, 0x5, 0x3d, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x21, 0x5d, 0x2e, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xd6, + + /* U+5186 "円" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x4c, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x2e, 0x4c, 0x0, 0x0, + 0x2e, 0x0, 0x0, 0x2e, 0x4c, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0x2e, 0x4c, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x2e, 0x4d, 0x33, 0x33, 0x5f, 0x33, 0x33, + 0x5e, 0x4f, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xee, + 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x4c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x4c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0x4c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0x4c, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x5e, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xe8, + + /* U+518A "冊" */ + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x88, 0x1, 0xf0, 0x8, 0x80, 0xe, 0x20, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x80, 0xe, 0x20, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x80, 0xe, 0x20, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x80, 0xe, 0x20, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x80, 0xe, 0x20, + 0x1d, 0xee, 0xdd, 0xfd, 0xde, 0xed, 0xdf, 0xd7, + 0x3, 0xaa, 0x33, 0xf3, 0x39, 0x93, 0x3e, 0x52, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x80, 0xe, 0x20, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x80, 0xe, 0x20, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x80, 0xe, 0x20, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x80, 0xe, 0x20, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x80, 0x1e, 0x20, + 0x0, 0x88, 0x0, 0xf0, 0x7, 0x87, 0xfc, 0x0, + + /* U+518D "再" */ + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x3d, 0x0, 0x6, 0xb0, 0x0, 0x79, 0x0, + 0x0, 0x3d, 0x0, 0x6, 0xb0, 0x0, 0x69, 0x0, + 0x0, 0x3f, 0xee, 0xef, 0xfe, 0xee, 0xf9, 0x0, + 0x0, 0x3d, 0x0, 0x6, 0xb0, 0x0, 0x69, 0x0, + 0x0, 0x3d, 0x0, 0x6, 0xb0, 0x0, 0x69, 0x0, + 0x1d, 0xef, 0xdd, 0xde, 0xfd, 0xdd, 0xef, 0xd8, + 0x1, 0x4d, 0x11, 0x11, 0x11, 0x11, 0x8a, 0x11, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0x89, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0xef, 0xe4, 0x0, + + /* U+5199 "写" */ + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe2, + 0x4, 0x50, 0x0, 0x0, 0x0, 0xc4, 0xe2, 0x9, + 0x80, 0x0, 0x0, 0x0, 0xc4, 0x0, 0xc, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xee, 0xee, + 0xee, 0xe5, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9e, 0xee, 0xee, 0xee, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7a, 0x0, 0x11, + 0x11, 0x11, 0x11, 0x10, 0x99, 0x0, 0xad, 0xdd, + 0xdd, 0xdd, 0xd2, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+519B "军" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xb4, + 0x0, 0x5, 0x0, 0x0, 0x0, 0x4c, 0xb4, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x4c, 0x31, 0x0, 0x9a, + 0x0, 0x0, 0x0, 0x13, 0x1, 0xee, 0xfe, 0xee, + 0xee, 0xee, 0x10, 0x0, 0x7, 0x90, 0xa, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x0, 0xf, 0x10, 0x0, + 0x0, 0x0, 0xcd, 0xbb, 0xbf, 0xbb, 0xbb, 0x60, + 0x0, 0x44, 0x33, 0x3f, 0x43, 0x33, 0x20, 0x0, + 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, 0x23, 0x33, + 0x33, 0x3f, 0x43, 0x33, 0x33, 0x9c, 0xcc, 0xcc, + 0xcf, 0xcc, 0xcc, 0xcb, 0x0, 0x0, 0x0, 0xf, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x10, + 0x0, 0x0, + + /* U+51AC "冬" */ + 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x2, 0xe9, 0x0, 0x0, 0x5d, 0x10, 0x0, + 0x0, 0x4e, 0x6d, 0x50, 0x4, 0xe3, 0x0, 0x0, + 0x5, 0xe3, 0x1, 0xd7, 0x8e, 0x30, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x5f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0xd5, 0x5d, 0xc5, 0x0, 0x0, + 0x6, 0xbf, 0xc5, 0x0, 0x0, 0x6c, 0xfc, 0x81, + 0xa, 0x61, 0x2, 0xd8, 0x30, 0x0, 0x15, 0x80, + 0x0, 0x0, 0x0, 0x28, 0xdd, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x3, 0x91, 0x0, 0x0, + 0x0, 0x2, 0xec, 0x84, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8d, 0xfa, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xdb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+51B7 "冷" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, + 0x8, 0x0, 0x0, 0x0, 0x1f, 0x60, 0x0, 0x0, + 0xa, 0xa0, 0x0, 0x0, 0xbb, 0xe1, 0x0, 0x0, + 0x0, 0xe4, 0x0, 0x8, 0xc0, 0x5c, 0x0, 0x0, + 0x0, 0x6b, 0x0, 0x9d, 0x10, 0x8, 0xc1, 0x0, + 0x0, 0x0, 0x1c, 0xc1, 0x3a, 0x0, 0x9d, 0x30, + 0x0, 0x0, 0xba, 0x0, 0xa, 0x90, 0x7, 0xe0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x4, 0x4, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x5c, 0x0, 0x11, 0x11, 0x13, 0xe3, 0x0, + 0x0, 0xc6, 0x0, 0x0, 0x0, 0xc, 0x70, 0x0, + 0x3, 0xf0, 0x0, 0x7, 0x20, 0xba, 0x0, 0x0, + 0xa, 0x90, 0x0, 0x6, 0xec, 0xb0, 0x0, 0x0, + 0x2f, 0x20, 0x0, 0x0, 0x2c, 0xa0, 0x0, 0x0, + 0x4, 0x0, 0x0, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + + /* U+51CD "凍" */ + 0x1, 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0xe, 0x60, 0x7e, 0xee, 0xef, 0xfe, 0xee, 0xe1, + 0x3, 0xe6, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, + 0x0, 0x4b, 0x1, 0x22, 0x2c, 0x62, 0x22, 0x0, + 0x0, 0x0, 0xa, 0xca, 0xae, 0xca, 0xae, 0x40, + 0x0, 0x0, 0xa, 0x50, 0xb, 0x40, 0xb, 0x40, + 0x0, 0x0, 0xa, 0xec, 0xcf, 0xdc, 0xcf, 0x40, + 0x0, 0xd, 0x1a, 0x50, 0xb, 0x40, 0xb, 0x40, + 0x0, 0x8a, 0xa, 0xed, 0xdf, 0xed, 0xdf, 0x40, + 0x2, 0xf2, 0x0, 0x3, 0xee, 0xd7, 0x0, 0x0, + 0xb, 0x80, 0x0, 0x3e, 0x3b, 0x5c, 0x60, 0x0, + 0x3e, 0x0, 0x6, 0xe4, 0xb, 0x41, 0xd8, 0x0, + 0x0, 0x2, 0xdc, 0x20, 0xb, 0x40, 0x1b, 0xd2, + 0x0, 0x0, 0x50, 0x0, 0xb, 0x40, 0x0, 0x50, + + /* U+51DD "凝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x68, 0x6, 0x76, 0xee, 0xee, 0xf2, + 0xd, 0x90, 0x6d, 0xe9, 0x20, 0x0, 0xa, 0x80, + 0x1, 0xd8, 0x7a, 0x0, 0x31, 0xa9, 0x8b, 0x0, + 0x0, 0x29, 0x6a, 0x22, 0xa4, 0x8, 0xf4, 0x0, + 0x0, 0x0, 0x1c, 0xcc, 0x90, 0x0, 0x4c, 0x0, + 0x0, 0x0, 0xe, 0x0, 0x8, 0xcc, 0xcc, 0xc5, + 0x0, 0x0, 0x6f, 0xfe, 0xe0, 0x0, 0xe0, 0xa3, + 0x0, 0x24, 0xd2, 0xb3, 0x1, 0x80, 0xe0, 0x80, + 0x0, 0x98, 0x20, 0xb3, 0x4, 0xb0, 0xe2, 0x20, + 0x0, 0xe1, 0xee, 0xfe, 0xe9, 0xa0, 0xfb, 0xb3, + 0x7, 0xa0, 0x0, 0xe5, 0x7, 0xd0, 0xe0, 0x0, + 0xe, 0x30, 0x5, 0xbd, 0x4a, 0xd4, 0xe0, 0x0, + 0x29, 0x0, 0x2e, 0x22, 0x9d, 0x2d, 0xe0, 0x0, + 0x0, 0x2, 0xd3, 0x0, 0x86, 0x2, 0xbf, 0xf8, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+51E6 "処" */ + 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0x0, 0x0, 0x57, 0x77, 0x60, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0xb9, 0x78, 0xc0, 0x0, + 0x0, 0xbf, 0xdd, 0xb0, 0xb4, 0x2, 0xc0, 0x0, + 0x0, 0xe3, 0x5, 0xb0, 0xb4, 0x2, 0xc0, 0x0, + 0x2, 0xf0, 0x7, 0x90, 0xc3, 0x2, 0xc0, 0x0, + 0x8, 0xf3, 0xa, 0x60, 0xd1, 0x2, 0xc0, 0x0, + 0x1e, 0x97, 0xe, 0x20, 0xe0, 0x2, 0xc0, 0x0, + 0x8a, 0x2d, 0x3d, 0x1, 0xe0, 0x2, 0xc0, 0x0, + 0x11, 0xb, 0xd7, 0x5, 0xa0, 0x2, 0xc0, 0x0, + 0x0, 0x4, 0xf2, 0xc, 0x50, 0x2, 0xc2, 0xa0, + 0x0, 0xa, 0xea, 0x2d, 0x0, 0x1, 0xdd, 0x50, + 0x0, 0x5d, 0x1b, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xe3, 0x0, 0x9e, 0x94, 0x21, 0x0, 0x0, + 0x3e, 0x40, 0x0, 0x2, 0x8c, 0xef, 0xff, 0xf0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+51FA "出" */ + 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x6, + 0x60, 0x0, 0x5c, 0x0, 0x2, 0xa0, 0x8, 0x90, + 0x0, 0x5c, 0x0, 0x3, 0xe0, 0x8, 0x90, 0x0, + 0x5c, 0x0, 0x3, 0xe0, 0x8, 0x90, 0x0, 0x5c, + 0x0, 0x3, 0xe0, 0x8, 0xb4, 0x44, 0x8d, 0x44, + 0x47, 0xe0, 0x6, 0xbb, 0xbb, 0xdf, 0xbb, 0xbb, + 0xa0, 0x29, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x65, + 0x3e, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x98, 0x3e, + 0x0, 0x0, 0x5c, 0x0, 0x0, 0x98, 0x3e, 0x0, + 0x0, 0x5c, 0x0, 0x0, 0x98, 0x3e, 0x0, 0x0, + 0x5c, 0x0, 0x0, 0x98, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x1, 0x11, 0x11, 0x11, 0x11, + 0x11, 0xa8, + + /* U+5206 "分" */ + 0x0, 0x0, 0xb, 0x20, 0x1, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x8c, 0x0, 0x0, 0xa7, 0x0, 0x0, + 0x0, 0x1, 0xf3, 0x0, 0x0, 0x1e, 0x20, 0x0, + 0x0, 0xa, 0xa0, 0x0, 0x0, 0x7, 0xd0, 0x0, + 0x0, 0x6e, 0x10, 0x0, 0x0, 0x0, 0xbb, 0x0, + 0x6, 0xf5, 0x11, 0x11, 0x11, 0x11, 0x2d, 0xb0, + 0xc, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xa0, + 0x0, 0x0, 0x0, 0xf2, 0x0, 0x3, 0xd0, 0x0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x4, 0xd0, 0x0, + 0x0, 0x0, 0x8, 0xa0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0x0, 0x1f, 0x20, 0x0, 0x7, 0xa0, 0x0, + 0x0, 0x1, 0xd9, 0x0, 0x0, 0x9, 0x80, 0x0, + 0x0, 0x4d, 0xa0, 0x0, 0x10, 0x1e, 0x50, 0x0, + 0x9, 0xd6, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5207 "切" */ + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0xf, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x2d, 0x0, 0x0, 0x5, 0xc0, 0x0, 0xe2, + 0x0, 0x2d, 0x26, 0x90, 0x5, 0xb0, 0x0, 0xe2, + 0x18, 0xcf, 0xd9, 0x60, 0x5, 0xa0, 0x0, 0xf1, + 0x17, 0x6d, 0x0, 0x0, 0x6, 0xa0, 0x0, 0xf1, + 0x0, 0x2d, 0x0, 0x0, 0x9, 0x70, 0x0, 0xf0, + 0x0, 0x2d, 0x0, 0x0, 0xc, 0x40, 0x1, 0xf0, + 0x0, 0x2d, 0x0, 0x20, 0xf, 0x10, 0x2, 0xf0, + 0x0, 0x3d, 0x4b, 0xd2, 0x5d, 0x0, 0x3, 0xe0, + 0x0, 0x8f, 0xc5, 0x0, 0xd6, 0x0, 0x4, 0xc0, + 0x0, 0x64, 0x0, 0x8, 0xc0, 0x0, 0x7, 0xb0, + 0x0, 0x0, 0x0, 0x9e, 0x20, 0x1, 0x1c, 0x70, + 0x0, 0x0, 0x8, 0xc2, 0x0, 0x4f, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+520A "刊" */ + 0xc, 0xff, 0xff, 0xff, 0x60, 0x0, 0x3, 0xe0, + 0x0, 0xb, 0x60, 0x0, 0xb, 0x10, 0x3e, 0x0, + 0x0, 0xb6, 0x0, 0x0, 0xf1, 0x3, 0xe0, 0x0, + 0xb, 0x60, 0x0, 0xf, 0x10, 0x3e, 0x0, 0x0, + 0xb6, 0x0, 0x0, 0xf1, 0x3, 0xe1, 0x77, 0x7d, + 0xa7, 0x77, 0xf, 0x10, 0x3e, 0x29, 0x99, 0xec, + 0x99, 0x80, 0xf1, 0x3, 0xe0, 0x0, 0xb, 0x60, + 0x0, 0xf, 0x10, 0x3e, 0x0, 0x0, 0xb6, 0x0, + 0x0, 0xf1, 0x3, 0xe0, 0x0, 0xb, 0x60, 0x0, + 0xf, 0x10, 0x3e, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0x10, 0x3, 0xe0, 0x0, 0xb, 0x60, 0x0, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x1, + 0x15, 0xd0, 0x0, 0xa, 0x50, 0x0, 0x2, 0xff, + 0xe7, + + /* U+5217 "列" */ + 0xf, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x2, 0xe0, + 0x0, 0x7a, 0x0, 0x0, 0xa, 0x20, 0x2e, 0x0, + 0xc, 0x50, 0x0, 0x0, 0xd2, 0x2, 0xe0, 0x1, + 0xf7, 0x55, 0x52, 0xd, 0x20, 0x2e, 0x0, 0x6d, + 0xaa, 0xad, 0x70, 0xd2, 0x2, 0xe0, 0xd, 0x40, + 0x0, 0xc3, 0xd, 0x20, 0x2e, 0x6, 0xd0, 0x0, + 0xe, 0x0, 0xd2, 0x2, 0xe0, 0xd4, 0xb4, 0x5, + 0xb0, 0xd, 0x20, 0x2e, 0x1, 0x4, 0xe8, 0xc3, + 0x0, 0xd2, 0x2, 0xe0, 0x0, 0x1, 0xdb, 0x0, + 0xd, 0x20, 0x2e, 0x0, 0x0, 0x3e, 0x30, 0x0, + 0x20, 0x2, 0xe0, 0x0, 0x2e, 0x50, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x7e, 0x70, 0x0, 0x0, 0x0, + 0x4, 0xe0, 0x6c, 0x30, 0x0, 0x0, 0x0, 0xaf, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+521D "初" */ + 0x0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xe1, 0x2, 0x33, 0x33, 0x33, 0x31, 0x0, + 0x8, 0x60, 0x9c, 0xcf, 0xdc, 0xce, 0x63, 0xcc, + 0xcc, 0xa0, 0x0, 0xe3, 0x0, 0xb5, 0x13, 0x33, + 0x99, 0x0, 0xf, 0x10, 0xb, 0x50, 0x0, 0x1e, + 0x10, 0x0, 0xf0, 0x0, 0xc4, 0x0, 0xa, 0x93, + 0x40, 0x1f, 0x0, 0xc, 0x40, 0x5, 0xf8, 0xd3, + 0x4, 0xc0, 0x0, 0xd3, 0x3, 0xff, 0xe7, 0x0, + 0x79, 0x0, 0xd, 0x24, 0xf4, 0xe5, 0xe2, 0xb, + 0x50, 0x0, 0xe2, 0x25, 0xe, 0x25, 0x11, 0xf1, + 0x0, 0xf, 0x0, 0x0, 0xe2, 0x0, 0x8a, 0x0, + 0x1, 0xf0, 0x0, 0xe, 0x20, 0x2e, 0x30, 0x0, + 0x3d, 0x0, 0x0, 0xe2, 0x1d, 0x80, 0x0, 0x9, + 0xa0, 0x0, 0xe, 0x27, 0x90, 0x3, 0xff, 0xe2, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5224 "判" */ + 0x3, 0x10, 0x6a, 0x0, 0x70, 0x0, 0x4, 0xc0, + 0x6b, 0x6, 0xa0, 0x7a, 0xa, 0x10, 0x4c, 0x0, + 0xc5, 0x6a, 0x1e, 0x20, 0xe1, 0x4, 0xc0, 0x4, + 0x66, 0xa4, 0x80, 0xe, 0x10, 0x4c, 0x8, 0xcc, + 0xee, 0xcc, 0x90, 0xe1, 0x4, 0xc0, 0x23, 0x38, + 0xb3, 0x32, 0xe, 0x10, 0x4c, 0x0, 0x0, 0x79, + 0x0, 0x0, 0xe1, 0x4, 0xc0, 0x0, 0x8, 0x90, + 0x0, 0xe, 0x10, 0x4c, 0x3e, 0xee, 0xff, 0xee, + 0xe1, 0xe1, 0x4, 0xc0, 0x0, 0x1e, 0x40, 0x0, + 0xe, 0x10, 0x4c, 0x0, 0x5, 0xe0, 0x0, 0x0, + 0x10, 0x4, 0xc0, 0x0, 0xc7, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0x0, 0xbc, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xc0, 0x7b, 0x10, 0x0, 0x0, 0x3, 0xff, + 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5225 "別" */ + 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xe0, + 0x3c, 0x0, 0x0, 0xf0, 0x1a, 0x0, 0x2e, 0x3, + 0xc0, 0x0, 0xf, 0x1, 0xe0, 0x2, 0xe0, 0x3c, + 0x0, 0x0, 0xf0, 0x1e, 0x0, 0x2e, 0x3, 0xea, + 0xaa, 0xaf, 0x1, 0xe0, 0x2, 0xe0, 0x14, 0xab, + 0x44, 0x40, 0x1e, 0x0, 0x2e, 0x0, 0x8, 0x70, + 0x0, 0x1, 0xe0, 0x2, 0xe0, 0x0, 0xaf, 0xee, + 0xe1, 0x1e, 0x0, 0x2e, 0x0, 0xd, 0x30, 0xe, + 0x11, 0xe0, 0x2, 0xe0, 0x0, 0xe0, 0x0, 0xf0, + 0x1e, 0x0, 0x2e, 0x0, 0x6a, 0x0, 0xf, 0x0, + 0x10, 0x2, 0xe0, 0xc, 0x50, 0x2, 0xe0, 0x0, + 0x0, 0x2e, 0x8, 0xc0, 0x0, 0x6b, 0x0, 0x1, + 0x4, 0xe0, 0xc2, 0xb, 0xed, 0x40, 0x0, 0xdf, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5229 "利" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x57, 0xbd, 0xa1, 0x0, 0x0, 0x2e, 0xc, + 0xa7, 0xc7, 0x0, 0x1, 0xa0, 0x2, 0xe0, 0x0, + 0xa, 0x60, 0x0, 0x1e, 0x0, 0x2e, 0x0, 0x0, + 0xa6, 0x0, 0x1, 0xe0, 0x2, 0xe0, 0xcc, 0xce, + 0xec, 0xc6, 0x1e, 0x0, 0x2e, 0x3, 0x34, 0xf8, + 0x33, 0x11, 0xe0, 0x2, 0xe0, 0x0, 0x9f, 0x90, + 0x0, 0x1e, 0x0, 0x2e, 0x0, 0x1e, 0xbe, 0xa0, + 0x1, 0xe0, 0x2, 0xe0, 0xa, 0x6a, 0x69, 0xc1, + 0x1e, 0x0, 0x2e, 0x5, 0xd0, 0xa6, 0x8, 0x21, + 0xe0, 0x2, 0xe3, 0xe2, 0xa, 0x60, 0x0, 0x1, + 0x0, 0x2e, 0x15, 0x0, 0xa6, 0x0, 0x0, 0x0, + 0x2, 0xe0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x10, + 0x4d, 0x0, 0x0, 0xa5, 0x0, 0x0, 0xd, 0xfe, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5230 "到" */ + 0xe, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xc, 0x30, + 0x0, 0x89, 0x2, 0x0, 0xe, 0x10, 0xc3, 0x0, + 0x1e, 0x10, 0xa7, 0x0, 0xe1, 0xc, 0x30, 0xa, + 0x70, 0x1, 0xe3, 0xe, 0x10, 0xc3, 0x5, 0xfc, + 0xde, 0xed, 0xc0, 0xe1, 0xc, 0x30, 0x26, 0x32, + 0x20, 0x9, 0x1e, 0x10, 0xc3, 0x0, 0x0, 0x4b, + 0x0, 0x0, 0xe1, 0xc, 0x30, 0x13, 0x37, 0xc3, + 0x33, 0xe, 0x10, 0xc3, 0x6, 0xcc, 0xdf, 0xcc, + 0xc0, 0xe1, 0xc, 0x30, 0x0, 0x4, 0xb0, 0x0, + 0xe, 0x10, 0xc3, 0x0, 0x0, 0x4b, 0x0, 0x0, + 0x90, 0xc, 0x30, 0x0, 0x6, 0xd8, 0xcf, 0x20, + 0x0, 0xc3, 0x9, 0xcf, 0xda, 0x74, 0x10, 0x0, + 0xd, 0x30, 0x64, 0x10, 0x0, 0x0, 0x0, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5236 "制" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x51, 0xe0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xd4, 0x3e, 0x11, 0x10, 0xe, 0x10, 0xf0, 0x3f, + 0xee, 0xfe, 0xee, 0x30, 0xe1, 0xf, 0xb, 0x60, + 0x1e, 0x0, 0x0, 0xe, 0x10, 0xf0, 0xc6, 0x56, + 0xf5, 0x55, 0x50, 0xe1, 0xf, 0xa, 0xaa, 0xaf, + 0xaa, 0xa8, 0xe, 0x10, 0xf0, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0xe1, 0xf, 0x3, 0xaa, 0xbf, 0xaa, + 0xa2, 0xe, 0x10, 0xf0, 0x4c, 0x56, 0xf5, 0x5c, + 0x40, 0xe1, 0xf, 0x4, 0xa0, 0x1e, 0x0, 0xb4, + 0xc, 0x10, 0xf0, 0x4a, 0x1, 0xe0, 0xb, 0x40, + 0x0, 0xf, 0x4, 0xa0, 0x1e, 0x0, 0xb4, 0x0, + 0x0, 0xf0, 0x4a, 0x1, 0xe3, 0xed, 0x10, 0x11, + 0x3f, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x5, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5238 "券" */ + 0x0, 0x0, 0x10, 0x3, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x8, 0x90, 0xb, 0x70, 0x0, + 0x0, 0x0, 0xa6, 0xd, 0x50, 0x5b, 0x0, 0x0, + 0x0, 0xcc, 0xdc, 0xcf, 0xcc, 0xfd, 0xcb, 0x0, + 0x0, 0x33, 0x33, 0xc9, 0x33, 0x33, 0x32, 0x0, + 0x0, 0x0, 0x3, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2, 0xd8, 0x0, 0x1, 0xc8, 0x0, 0x0, + 0x0, 0x4e, 0x80, 0x0, 0x0, 0xc, 0xa1, 0x0, + 0x1a, 0xed, 0xfe, 0xee, 0xee, 0xef, 0xbe, 0x92, + 0x18, 0x10, 0x3, 0xe0, 0x0, 0xe, 0x21, 0x82, + 0x0, 0x0, 0x8, 0xa0, 0x0, 0xf, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0x20, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x28, 0xe5, 0x0, 0x0, 0x7c, 0x0, 0x0, + 0x3, 0xe9, 0x20, 0x0, 0xef, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+523B "刻" */ + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xc0, 0x0, 0x0, 0x0, 0x1e, 0x9, + 0x99, 0xaf, 0xa9, 0x96, 0x1b, 0x1, 0xe0, 0x55, + 0x6f, 0x75, 0x55, 0x31, 0xe0, 0x1e, 0x0, 0xa, + 0x80, 0x4, 0x10, 0x1e, 0x1, 0xe0, 0x7, 0xb0, + 0x2, 0xe1, 0x1, 0xe0, 0x1e, 0x6, 0xfc, 0xcc, + 0xe6, 0x0, 0x1e, 0x1, 0xe0, 0x24, 0x32, 0xc9, + 0x2, 0x1, 0xe0, 0x1e, 0x0, 0x1, 0xca, 0x2, + 0xe2, 0x1e, 0x1, 0xe0, 0x5, 0xe8, 0x0, 0xc5, + 0x1, 0xe0, 0x1e, 0x9, 0xe5, 0x0, 0xb9, 0x0, + 0x1e, 0x1, 0xe0, 0x10, 0x1, 0xbe, 0x90, 0x0, + 0x20, 0x1e, 0x0, 0x4, 0xe8, 0xb, 0xb0, 0x0, + 0x1, 0xe0, 0x2a, 0xe5, 0x0, 0xb, 0x80, 0x0, + 0x3e, 0xa, 0x90, 0x0, 0x0, 0x0, 0x9, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5247 "則" */ + 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x2, 0xe0, + 0x3c, 0x0, 0x1, 0xf0, 0x1a, 0x0, 0x2e, 0x3, + 0xc0, 0x0, 0x1f, 0x1, 0xe0, 0x2, 0xe0, 0x3f, + 0xee, 0xee, 0xf0, 0x1e, 0x0, 0x2e, 0x3, 0xc0, + 0x0, 0x1f, 0x1, 0xe0, 0x2, 0xe0, 0x3c, 0x0, + 0x1, 0xf0, 0x1e, 0x0, 0x2e, 0x3, 0xfe, 0xee, + 0xef, 0x1, 0xe0, 0x2, 0xe0, 0x3c, 0x0, 0x1, + 0xf0, 0x1e, 0x0, 0x2e, 0x3, 0xc0, 0x0, 0x1f, + 0x1, 0xe0, 0x2, 0xe0, 0x3f, 0xee, 0xee, 0xf0, + 0x1e, 0x0, 0x2e, 0x0, 0x25, 0x1, 0x40, 0x0, + 0x10, 0x2, 0xe0, 0xa, 0x90, 0xd, 0x60, 0x0, + 0x0, 0x2e, 0x6, 0xe1, 0x0, 0x3f, 0x10, 0x1, + 0x4, 0xe0, 0xc3, 0x0, 0x0, 0x73, 0x0, 0xdf, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+524A "削" */ + 0x7, 0x0, 0xf0, 0x7, 0x50, 0x0, 0xe, 0x20, + 0xd3, 0xf, 0x0, 0xe3, 0x6, 0x0, 0xe2, 0x6, + 0xa0, 0xf0, 0x6b, 0x1, 0xe0, 0xe, 0x20, 0x16, + 0xf, 0x5, 0x20, 0x1e, 0x0, 0xe2, 0xc, 0xff, + 0xff, 0xfe, 0x1, 0xe0, 0xe, 0x20, 0xc4, 0x0, + 0x1, 0xe0, 0x1e, 0x0, 0xe2, 0xc, 0x40, 0x0, + 0x2e, 0x1, 0xe0, 0xe, 0x20, 0xce, 0xee, 0xee, + 0xe0, 0x1e, 0x0, 0xe2, 0xc, 0x30, 0x0, 0x1e, + 0x1, 0xe0, 0xe, 0x20, 0xcd, 0xcc, 0xcd, 0xe0, + 0x1e, 0x0, 0xe2, 0xc, 0x52, 0x22, 0x3e, 0x0, + 0x10, 0xe, 0x20, 0xc3, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0xe2, 0xc, 0x30, 0x1, 0x4e, 0x0, 0x1, + 0x1f, 0x20, 0xb3, 0x2, 0xdd, 0x70, 0x2, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+524D "前" */ + 0x0, 0x2, 0x40, 0x0, 0x0, 0x4, 0x40, 0x0, + 0x0, 0x2, 0xe3, 0x0, 0x0, 0x1e, 0x50, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x9a, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x33, 0x32, 0x0, 0x0, 0x9, 0x0, + 0x1, 0xfb, 0xbb, 0xda, 0x4, 0xb0, 0xf, 0x0, + 0x1, 0xe0, 0x0, 0x5a, 0x4, 0xb0, 0xf, 0x0, + 0x1, 0xf9, 0x99, 0xba, 0x4, 0xb0, 0xf, 0x0, + 0x1, 0xe4, 0x44, 0x8a, 0x4, 0xb0, 0xf, 0x0, + 0x1, 0xe0, 0x0, 0x5a, 0x4, 0xb0, 0xf, 0x0, + 0x1, 0xfd, 0xdd, 0xea, 0x4, 0xb0, 0xf, 0x0, + 0x1, 0xe0, 0x0, 0x5a, 0x2, 0x60, 0xf, 0x0, + 0x1, 0xe0, 0x0, 0x6a, 0x0, 0x0, 0x1f, 0x0, + 0x1, 0xe0, 0x4e, 0xe6, 0x0, 0x4f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+525B "剛" */ + 0xcf, 0xff, 0xff, 0xff, 0x70, 0x0, 0xb4, 0xc2, + 0x50, 0x2, 0x56, 0x70, 0xd1, 0xb4, 0xc2, 0x84, + 0x7, 0x76, 0x70, 0xe1, 0xb4, 0xc2, 0x39, 0xc, + 0x26, 0x70, 0xe1, 0xb4, 0xc2, 0x27, 0x3d, 0x17, + 0x70, 0xe1, 0xb4, 0xc4, 0xbb, 0xeb, 0xb7, 0x70, + 0xe1, 0xb4, 0xc2, 0x60, 0xb0, 0x66, 0x70, 0xe1, + 0xb4, 0xc2, 0xa0, 0xb0, 0xa6, 0x70, 0xe1, 0xb4, + 0xc2, 0xa0, 0xb0, 0xa6, 0x70, 0xe1, 0xb4, 0xc2, + 0xa0, 0xb0, 0xa6, 0x70, 0xe1, 0xb4, 0xc2, 0xcc, + 0xfc, 0xa6, 0x70, 0x0, 0xb4, 0xc2, 0x0, 0x0, + 0x6, 0x70, 0x0, 0xb4, 0xc2, 0x0, 0x0, 0x8, + 0x70, 0x0, 0xc4, 0xc2, 0x0, 0xb, 0xfd, 0x20, + 0xcf, 0xc1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5272 "割" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xc0, 0x0, 0x0, 0x0, 0x1e, 0xcd, 0xdd, + 0xfd, 0xdd, 0xb0, 0x20, 0x1e, 0xe0, 0x0, 0xa0, + 0x2, 0xc1, 0xe0, 0x1e, 0x8c, 0xcc, 0xfc, 0xcb, + 0x51, 0xe0, 0x1e, 0x0, 0x1, 0xf0, 0x0, 0x1, + 0xe0, 0x1e, 0x9, 0xdd, 0xfd, 0xd6, 0x1, 0xe0, + 0x1e, 0x0, 0x0, 0xe0, 0x0, 0x1, 0xe0, 0x1e, + 0xbc, 0xcd, 0xfc, 0xcc, 0x91, 0xe0, 0x1e, 0x0, + 0x0, 0xe0, 0x0, 0x1, 0xe0, 0x1e, 0xb, 0xbb, + 0xfb, 0xba, 0x1, 0xe0, 0x1e, 0xf, 0x33, 0x33, + 0x4d, 0x0, 0x20, 0x1e, 0xe, 0x0, 0x0, 0x1d, + 0x0, 0x0, 0x1e, 0xf, 0xbb, 0xbb, 0xbd, 0x0, + 0x0, 0x2e, 0xf, 0x22, 0x22, 0x3c, 0x0, 0x7f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5275 "創" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x8, 0xbb, 0x91, 0x0, 0x70, 0xe, 0x10, 0x1a, + 0xa9, 0x25, 0xd6, 0xe, 0x10, 0xe1, 0x3e, 0x70, + 0x3a, 0x1, 0x50, 0xe1, 0xe, 0x10, 0x2a, 0xcc, + 0xcc, 0xc1, 0xe, 0x10, 0xe1, 0x0, 0xd0, 0x0, + 0xd, 0x10, 0xe1, 0xe, 0x10, 0xe, 0xcb, 0xbb, + 0xf1, 0xe, 0x10, 0xe1, 0x0, 0xf0, 0x0, 0xd, + 0x10, 0xe1, 0xe, 0x10, 0x1f, 0xcc, 0xcc, 0xf1, + 0xe, 0x10, 0xe1, 0x3, 0xb0, 0x0, 0x0, 0x0, + 0xe1, 0xe, 0x10, 0x87, 0xfd, 0xdd, 0xf3, 0x4, + 0x0, 0xe1, 0xe, 0x2d, 0x0, 0xc, 0x30, 0x0, + 0xe, 0x17, 0x90, 0xfb, 0xbb, 0xf3, 0x0, 0x1, + 0xf1, 0x1, 0xd, 0x22, 0x2b, 0x20, 0x1f, 0xfb, + 0x0, + + /* U+5283 "劃" */ + 0x2, 0xbb, 0xce, 0xbb, 0xe0, 0x0, 0x2, 0xd0, + 0x0, 0x3, 0xb0, 0xe, 0x5, 0xb0, 0x2d, 0x3c, + 0xcc, 0xdf, 0xcc, 0xfb, 0x5b, 0x2, 0xd0, 0x1, + 0x15, 0xc1, 0x2e, 0x5, 0xb0, 0x2d, 0x2, 0x88, + 0xae, 0x88, 0x80, 0x5b, 0x2, 0xd0, 0x5b, 0xbc, + 0xeb, 0xbb, 0x15, 0xb0, 0x2d, 0x3, 0x33, 0x6c, + 0x33, 0x32, 0x5b, 0x2, 0xd1, 0x99, 0x99, 0x99, + 0x99, 0x85, 0xb0, 0x2d, 0x1, 0xaa, 0xaa, 0xaa, + 0x90, 0x5b, 0x2, 0xd0, 0x2b, 0x24, 0xd2, 0x3e, + 0x5, 0xb0, 0x2d, 0x2, 0xd6, 0x7e, 0x66, 0xe0, + 0x23, 0x2, 0xd0, 0x2c, 0xaa, 0xda, 0xac, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x12, 0x23, 0x0, + 0x3, 0xd3, 0xdd, 0xdd, 0xdc, 0xba, 0x90, 0x7f, + 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+529B "力" */ + 0x0, 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1, 0x22, + 0x22, 0x6e, 0x22, 0x22, 0x2b, 0x70, 0x0, 0x0, + 0x6, 0xb0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, + 0x98, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0xf, + 0x30, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x6, 0xd0, + 0x0, 0x0, 0xe, 0x20, 0x0, 0x1, 0xe7, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0x0, 0x9e, 0x10, 0x0, 0x0, + 0x5, 0xc0, 0x1, 0xbd, 0x20, 0x0, 0x1, 0x1, + 0xb8, 0x0, 0xca, 0x10, 0x0, 0x0, 0xcf, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+529F "功" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xd0, 0x0, 0x0, + 0x8, 0x88, 0x88, 0x60, 0x3, 0xd0, 0x0, 0x0, + 0x6, 0x6c, 0xa6, 0x40, 0x3, 0xd0, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x1e, 0xef, 0xfe, 0xee, 0xe1, + 0x0, 0xa, 0x60, 0x1, 0x16, 0xc1, 0x11, 0xf1, + 0x0, 0xa, 0x60, 0x0, 0x7, 0x90, 0x0, 0xf0, + 0x0, 0xa, 0x60, 0x0, 0x9, 0x70, 0x1, 0xf0, + 0x0, 0xa, 0x60, 0x0, 0xc, 0x50, 0x2, 0xe0, + 0x0, 0xa, 0x63, 0x80, 0x1f, 0x0, 0x3, 0xd0, + 0x2, 0x7d, 0xfd, 0x80, 0x7b, 0x0, 0x4, 0xc0, + 0x2f, 0xb6, 0x20, 0x1, 0xf4, 0x0, 0x5, 0xb0, + 0x0, 0x0, 0x0, 0xb, 0x90, 0x0, 0x8, 0x90, + 0x0, 0x0, 0x2, 0xcc, 0x10, 0x10, 0x1d, 0x50, + 0x0, 0x0, 0xb, 0x90, 0x0, 0x9f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52A0 "加" */ + 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x0, 0x22, 0x22, 0x22, 0x2, + 0x2d, 0x52, 0x22, 0xe, 0xdd, 0xde, 0xc0, 0xee, + 0xfe, 0xee, 0xe0, 0xe1, 0x0, 0x4c, 0x0, 0xe, + 0x20, 0x2d, 0xe, 0x10, 0x4, 0xc0, 0x0, 0xf1, + 0x3, 0xd0, 0xe1, 0x0, 0x4c, 0x0, 0xf, 0x0, + 0x3d, 0xe, 0x10, 0x4, 0xc0, 0x2, 0xe0, 0x4, + 0xc0, 0xe1, 0x0, 0x4c, 0x0, 0x4b, 0x0, 0x4c, + 0xe, 0x10, 0x4, 0xc0, 0x7, 0x90, 0x5, 0xb0, + 0xe1, 0x0, 0x4c, 0x0, 0xc4, 0x0, 0x6a, 0xe, + 0x10, 0x4, 0xc0, 0x2e, 0x0, 0x8, 0x90, 0xe3, + 0x11, 0x5c, 0xb, 0x80, 0x11, 0xc6, 0xe, 0xff, + 0xff, 0xc3, 0xd0, 0xe, 0xfc, 0x10, 0xe1, 0x0, + 0x3b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+52A8 "动" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x96, 0x0, 0x0, + 0x8, 0xee, 0xee, 0xe9, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x78, 0xdb, 0x88, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x78, 0xda, 0x88, 0xf1, + 0x1e, 0xef, 0xfe, 0xed, 0x0, 0xc4, 0x0, 0xf0, + 0x0, 0xf, 0x10, 0x0, 0x0, 0xe2, 0x0, 0xf0, + 0x0, 0x4c, 0x2, 0x60, 0x0, 0xf0, 0x1, 0xf0, + 0x0, 0x97, 0x1, 0xe0, 0x3, 0xd0, 0x2, 0xe0, + 0x0, 0xe1, 0x0, 0xa6, 0x7, 0xa0, 0x3, 0xd0, + 0x5, 0xc5, 0x8b, 0xeb, 0xc, 0x50, 0x4, 0xc0, + 0xc, 0xea, 0x63, 0xc, 0x4e, 0x0, 0x7, 0xa0, + 0x1, 0x0, 0x0, 0x0, 0xd7, 0x10, 0x1c, 0x70, + 0x0, 0x0, 0x0, 0x5, 0xb0, 0x8f, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52A9 "助" */ + 0x1, 0xff, 0xff, 0xf1, 0x0, 0x96, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0xe1, 0x0, 0xa6, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0xe1, 0x0, 0xa6, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0xe5, 0xcc, 0xed, 0xcc, 0xc0, + 0x1, 0xfe, 0xee, 0xf3, 0x55, 0xd9, 0x56, 0xf0, + 0x1, 0xe0, 0x0, 0xe1, 0x0, 0xd3, 0x0, 0xf0, + 0x1, 0xe0, 0x0, 0xe1, 0x0, 0xe1, 0x1, 0xf0, + 0x1, 0xfe, 0xee, 0xf1, 0x1, 0xf0, 0x1, 0xe0, + 0x1, 0xe0, 0x0, 0xe1, 0x6, 0xa0, 0x2, 0xd0, + 0x1, 0xe0, 0x0, 0xe1, 0xb, 0x60, 0x3, 0xd0, + 0x1, 0xe2, 0x59, 0xff, 0x4e, 0x10, 0x4, 0xc0, + 0x1b, 0xfe, 0xb7, 0x31, 0xc6, 0x0, 0x6, 0xa0, + 0x6, 0x20, 0x0, 0x1c, 0xb0, 0x0, 0xa, 0x70, + 0x0, 0x0, 0x0, 0x99, 0x0, 0x4f, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52AA "努" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x9f, 0xff, 0xff, 0xa0, + 0x1c, 0xce, 0xec, 0xca, 0xe, 0x0, 0xa, 0x60, + 0x1, 0x6d, 0x21, 0x87, 0xa, 0x50, 0x1f, 0x10, + 0x0, 0xd5, 0x0, 0xd1, 0x3, 0xd0, 0xa8, 0x0, + 0x0, 0x8e, 0x89, 0x80, 0x0, 0x9c, 0xd0, 0x0, + 0x0, 0x2, 0xef, 0x70, 0x0, 0x9f, 0xb0, 0x0, + 0x0, 0x5d, 0x94, 0xd7, 0x7e, 0xa2, 0xae, 0x70, + 0x1e, 0xa4, 0x0, 0x4, 0x83, 0x0, 0x3, 0x90, + 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, + 0x1, 0xee, 0xee, 0xef, 0xee, 0xee, 0xef, 0x10, + 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x2f, 0x0, + 0x0, 0x0, 0x6, 0xe2, 0x0, 0x0, 0x5c, 0x0, + 0x0, 0x15, 0xcd, 0x30, 0x0, 0x0, 0xa9, 0x0, + 0xa, 0xeb, 0x50, 0x0, 0x7, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52B3 "劳" */ + 0x0, 0x0, 0x5b, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0x11, 0x6c, 0x11, 0x11, 0xc6, 0x11, 0x10, + 0x0, 0x0, 0x25, 0x0, 0x0, 0x52, 0x0, 0x0, + 0xa, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x90, + 0xb, 0x50, 0x0, 0x1, 0x0, 0x0, 0x7, 0xa0, + 0x9, 0x40, 0x0, 0x3e, 0x0, 0x0, 0x5, 0x70, + 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x97, 0x0, + 0x0, 0x0, 0x4, 0xf0, 0x0, 0x0, 0xb6, 0x0, + 0x0, 0x0, 0x4e, 0x50, 0x0, 0x0, 0xd4, 0x0, + 0x0, 0x4a, 0xe5, 0x0, 0x0, 0x2, 0xf1, 0x0, + 0xe, 0xc7, 0x10, 0x0, 0x5f, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52C9 "勉" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x0, 0x0, 0xf, 0x0, 0x0, + 0x0, 0xd, 0xee, 0xf4, 0x0, 0x1f, 0x0, 0x0, + 0x0, 0x88, 0x1, 0xe0, 0x0, 0x1f, 0x0, 0x0, + 0x6, 0xe1, 0x18, 0x91, 0x3f, 0xff, 0xff, 0xf1, + 0x1e, 0xfd, 0xdf, 0xdd, 0xe2, 0x4d, 0x22, 0xe1, + 0x3, 0xb0, 0xe, 0x1, 0xe0, 0x4b, 0x0, 0xf0, + 0x3, 0xb0, 0x1e, 0x1, 0xe0, 0x69, 0x0, 0xf0, + 0x3, 0xc2, 0x3e, 0x23, 0xe0, 0xa6, 0x1, 0xf0, + 0x2, 0xcc, 0xdf, 0xfc, 0xb0, 0xe2, 0x2, 0xe0, + 0x0, 0x0, 0x89, 0xd0, 0x6, 0xb0, 0x4, 0xc0, + 0x0, 0x0, 0xe4, 0xd0, 0x2e, 0x31, 0x29, 0x90, + 0x0, 0xa, 0x91, 0xd0, 0xc5, 0x3, 0xdc, 0x63, + 0x0, 0x9c, 0x1, 0xf0, 0x0, 0x0, 0x0, 0x97, + 0xd, 0x90, 0x0, 0xae, 0xee, 0xee, 0xee, 0xd1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52D5 "動" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xcc, 0xeb, 0x74, 0x10, 0x3c, 0x0, 0x0, + 0x0, 0x0, 0x86, 0x0, 0x0, 0x3c, 0x0, 0x0, + 0x1d, 0xdd, 0xee, 0xdd, 0xc0, 0x3c, 0x0, 0x0, + 0x0, 0x0, 0x86, 0x0, 0x2c, 0xdf, 0xcc, 0xc2, + 0x7, 0xbb, 0xed, 0xbb, 0x85, 0x8c, 0x55, 0xe2, + 0x9, 0x40, 0x86, 0x5, 0x90, 0x6a, 0x0, 0xe2, + 0x9, 0xdb, 0xed, 0xbd, 0x90, 0x88, 0x0, 0xe1, + 0x9, 0x40, 0x86, 0x5, 0x90, 0xa6, 0x0, 0xf1, + 0x9, 0xdc, 0xed, 0xcd, 0x90, 0xd3, 0x0, 0xf0, + 0x0, 0x0, 0x86, 0x0, 0x1, 0xf0, 0x1, 0xf0, + 0x8, 0xdd, 0xee, 0xdd, 0x88, 0x90, 0x2, 0xe0, + 0x0, 0x0, 0x86, 0x1, 0x3e, 0x20, 0x4, 0xc0, + 0x7, 0x9a, 0xee, 0xdd, 0xf7, 0x0, 0x8, 0xa0, + 0x6, 0x43, 0x10, 0x9, 0x80, 0xc, 0xfe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52D9 "務" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x90, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf4, 0xb, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xc0, 0x5f, 0xfe, 0xee, 0xc0, + 0x0, 0x31, 0x4e, 0x24, 0xfd, 0x10, 0x9, 0x50, + 0x0, 0x6d, 0xe3, 0xb, 0x45, 0xb0, 0x5b, 0x0, + 0x0, 0x6, 0xc0, 0x0, 0x0, 0x6d, 0xd0, 0x0, + 0xe, 0xee, 0xfe, 0xe8, 0x3, 0xcb, 0xe8, 0x10, + 0x0, 0xc, 0xd0, 0x9b, 0xde, 0x50, 0x1b, 0xf9, + 0x0, 0x2f, 0xd0, 0xd4, 0x50, 0x94, 0x0, 0x22, + 0x0, 0x9a, 0xd3, 0xb2, 0x33, 0xd6, 0x33, 0x30, + 0x3, 0xe3, 0xd1, 0x28, 0xbc, 0xfb, 0xbc, 0xf0, + 0xd, 0x42, 0xd0, 0x0, 0x7, 0xa0, 0x3, 0xd0, + 0x5, 0x2, 0xd0, 0x0, 0x3e, 0x20, 0x6, 0xa0, + 0x0, 0x3, 0xd0, 0x7, 0xe4, 0x0, 0xb, 0x60, + 0x0, 0xcf, 0x90, 0x9a, 0x20, 0xe, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52DD "勝" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x64, 0x3, 0x10, + 0x1, 0xff, 0xfe, 0xb, 0x70, 0xa5, 0x1e, 0x20, + 0x1, 0xc0, 0x1e, 0x1, 0xe1, 0xc3, 0x9a, 0x0, + 0x1, 0xc0, 0x1e, 0x2, 0x52, 0xe4, 0xb4, 0x20, + 0x1, 0xd0, 0x1e, 0x1b, 0xbc, 0xfb, 0xbb, 0x90, + 0x1, 0xfb, 0xce, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x2, 0xc0, 0x1e, 0xae, 0xef, 0xfe, 0xee, 0xe7, + 0x2, 0xc0, 0x1e, 0x0, 0xb7, 0x1, 0xd3, 0x0, + 0x3, 0xe9, 0xae, 0x9, 0xc1, 0xc0, 0x3e, 0x40, + 0x3, 0xd5, 0x6e, 0xcc, 0x13, 0xd0, 0x3, 0xd6, + 0x4, 0xa0, 0x1e, 0x49, 0xde, 0xed, 0xdf, 0x20, + 0x6, 0x90, 0x1e, 0x0, 0xa, 0x60, 0xf, 0x0, + 0x8, 0x60, 0x1e, 0x0, 0x3e, 0x0, 0x1e, 0x0, + 0xc, 0x20, 0x1e, 0x5, 0xe4, 0x0, 0x4c, 0x0, + 0xd, 0x9, 0xf9, 0x7c, 0x30, 0x6e, 0xd5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52E4 "勤" */ + 0x0, 0x68, 0x0, 0xc3, 0x0, 0x2c, 0x0, 0x0, + 0x1d, 0xee, 0xdd, 0xfd, 0xc0, 0x2d, 0x0, 0x0, + 0x0, 0x6a, 0x22, 0xc3, 0x0, 0x2d, 0x0, 0x0, + 0x0, 0x38, 0xdb, 0x82, 0x3b, 0xcf, 0xbb, 0xb3, + 0x6, 0xcc, 0xed, 0xcc, 0x52, 0x5c, 0x22, 0xc4, + 0x8, 0x60, 0xa6, 0x9, 0x60, 0x5a, 0x0, 0xc3, + 0x8, 0x60, 0xa5, 0x9, 0x60, 0x79, 0x0, 0xc3, + 0x6, 0xcc, 0xed, 0xcc, 0x40, 0x97, 0x0, 0xd2, + 0x4, 0x66, 0xca, 0x66, 0x40, 0xb4, 0x0, 0xe1, + 0x3, 0x44, 0xc9, 0x44, 0x30, 0xf1, 0x0, 0xf1, + 0x6, 0xcc, 0xed, 0xcc, 0x34, 0xc0, 0x0, 0xf0, + 0x0, 0x0, 0xa6, 0x0, 0xc, 0x50, 0x2, 0xe0, + 0x16, 0x89, 0xdd, 0xde, 0xec, 0x0, 0x6, 0xc0, + 0x18, 0x75, 0x42, 0x11, 0xd1, 0x9, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+52F5 "勵" */ + 0xc, 0xed, 0xdd, 0xdd, 0xd4, 0xf, 0x0, 0x0, + 0xc1, 0x8, 0x7, 0x50, 0x0, 0xe0, 0x0, 0xc, + 0x7b, 0xeb, 0xed, 0xb1, 0xe, 0x0, 0x0, 0xc1, + 0x8, 0x6, 0x50, 0xbd, 0xfd, 0xda, 0xc, 0x1e, + 0xce, 0xcc, 0xb2, 0x4d, 0x24, 0xc0, 0xc1, 0xc0, + 0xd0, 0xc, 0x3, 0xc0, 0x3c, 0xd, 0x1e, 0xaf, + 0xaa, 0xc0, 0x4b, 0x3, 0xb0, 0xd0, 0xd5, 0xe5, + 0x5c, 0x6, 0x90, 0x4b, 0xe, 0x5, 0x5e, 0x55, + 0x40, 0x87, 0x4, 0xa0, 0xe6, 0xcc, 0xfc, 0xcc, + 0x1a, 0x40, 0x5a, 0x1d, 0x77, 0xc, 0x23, 0xb1, + 0xe1, 0x6, 0x94, 0xa7, 0x75, 0xd9, 0x9b, 0x5b, + 0x0, 0x87, 0x86, 0x78, 0x75, 0x28, 0xbc, 0x50, + 0xb, 0x55, 0x27, 0x70, 0x0, 0xac, 0xc0, 0xcf, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5305 "包" */ + 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xf3, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0xac, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x0, + 0xa, 0xe5, 0x33, 0x33, 0x33, 0x0, 0x4c, 0x0, + 0x3d, 0x2e, 0xbb, 0xbb, 0xcc, 0x0, 0x5b, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x3c, 0x0, 0x6b, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x3c, 0x0, 0x7a, 0x0, + 0x0, 0xe, 0x98, 0x88, 0xac, 0x0, 0x88, 0x0, + 0x0, 0xe, 0x76, 0x66, 0x65, 0x22, 0xd5, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x9d, 0xb0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0xb2, + 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, 0x4, 0xf1, + 0x0, 0x4, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x60, + + /* U+5316 "化" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf2, 0x0, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xa0, 0x0, 0xe3, 0x0, 0x9, 0x50, + 0x0, 0x3f, 0x40, 0x0, 0xe3, 0x0, 0x7e, 0x20, + 0x1, 0xef, 0x40, 0x0, 0xe3, 0x4, 0xf3, 0x0, + 0x1d, 0xad, 0x40, 0x0, 0xe3, 0x5f, 0x50, 0x0, + 0x3b, 0xd, 0x40, 0x0, 0xea, 0xe3, 0x0, 0x0, + 0x0, 0xd, 0x40, 0x1, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0xd, 0x40, 0x7f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x4a, 0xd3, 0xe3, 0x0, 0x0, 0x40, + 0x0, 0xd, 0x41, 0x0, 0xe3, 0x0, 0x0, 0xf1, + 0x0, 0xd, 0x40, 0x0, 0xe3, 0x0, 0x1, 0xf0, + 0x0, 0xd, 0x40, 0x0, 0xd7, 0x10, 0x16, 0xc0, + 0x0, 0xd, 0x40, 0x0, 0x6f, 0xff, 0xfe, 0x40, + + /* U+5317 "北" */ + 0x0, 0x0, 0xe, 0x20, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0xf, 0x0, 0x1, 0x10, + 0x1, 0x11, 0x1e, 0x20, 0xf, 0x0, 0x3e, 0x90, + 0x1f, 0xff, 0xff, 0x20, 0xf, 0x7, 0xf7, 0x0, + 0x0, 0x0, 0xe, 0x20, 0xf, 0xcb, 0x20, 0x0, + 0x0, 0x0, 0xe, 0x20, 0xf, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0x20, 0xf, 0x0, 0x0, 0x20, + 0x1, 0x7d, 0xdf, 0x20, 0xf, 0x0, 0x0, 0xc4, + 0x5f, 0xa4, 0xe, 0x20, 0xf, 0x0, 0x0, 0xd3, + 0x1, 0x0, 0xe, 0x20, 0xf, 0x40, 0x2, 0xf0, + 0x0, 0x0, 0xe, 0x20, 0x9, 0xff, 0xff, 0x80, + + /* U+533B "医" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, + 0xd0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0x0, 0x2f, 0x20, 0x0, 0x0, 0x0, 0x3, 0xd0, + 0xa, 0xfb, 0xbb, 0xbb, 0xbb, 0x0, 0x3d, 0x8, + 0xd3, 0x34, 0xf3, 0x33, 0x30, 0x3, 0xd0, 0xa2, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x3d, 0x0, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0x3, 0xd2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x3d, 0x0, 0x0, 0x7, + 0xf5, 0x0, 0x0, 0x3, 0xd0, 0x0, 0x3, 0xf4, + 0xc8, 0x0, 0x0, 0x3d, 0x0, 0x7, 0xe5, 0x0, + 0xba, 0x0, 0x3, 0xd0, 0x8e, 0xb2, 0x0, 0x0, + 0xba, 0x0, 0x3d, 0x37, 0x53, 0x33, 0x33, 0x33, + 0x83, 0x13, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xc5, + + /* U+5340 "區" */ + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x4, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0x0, 0x2c, 0xcc, 0xcc, 0xc0, 0x0, 0x4, 0xc0, + 0x2, 0xc0, 0x0, 0xe, 0x0, 0x0, 0x4c, 0x0, + 0x2c, 0x0, 0x0, 0xe0, 0x0, 0x4, 0xc0, 0x2, + 0xec, 0xcc, 0xce, 0x0, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xc0, 0xdc, 0xce, + 0x23, 0xec, 0xdc, 0x0, 0x4c, 0xe, 0x0, 0xb2, + 0x3b, 0x1, 0xd0, 0x4, 0xc0, 0xe0, 0xb, 0x23, + 0xb0, 0x1d, 0x0, 0x4c, 0xe, 0xcc, 0xf2, 0x3f, + 0xcd, 0xd0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0x30, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x30, + + /* U+5341 "十" */ + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x2, 0x22, 0x22, 0x29, 0xa2, 0x22, 0x22, 0x20, + 0x1e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe3, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + + /* U+5343 "千" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x46, 0x9d, 0xf3, 0x0, + 0x1, 0x79, 0xbd, 0xff, 0xe9, 0x63, 0x0, 0x0, + 0x0, 0x86, 0x42, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x1a, 0x91, 0x11, 0x11, 0x10, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+5348 "午" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xb1, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xba, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x7, 0xe1, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x9, 0x40, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + + /* U+534A "半" */ + 0x0, 0x24, 0x0, 0x9, 0x80, 0x0, 0x53, 0x0, + 0x0, 0x2e, 0x10, 0x9, 0x80, 0x1, 0xf3, 0x0, + 0x0, 0x8, 0xa0, 0x9, 0x80, 0x9, 0xa0, 0x0, + 0x0, 0x1, 0xf1, 0x9, 0x80, 0x3e, 0x10, 0x0, + 0x0, 0x11, 0x21, 0x1a, 0x81, 0x12, 0x11, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x3, 0x33, 0x33, 0x3b, 0xa3, 0x33, 0x33, 0x30, + 0x1d, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0xd2, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+5352 "卒" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x2, 0x44, 0x44, 0x48, 0xe4, 0x44, 0x44, 0x20, + 0x8, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, + 0x0, 0x0, 0x78, 0x0, 0x0, 0x3b, 0x0, 0x0, + 0x0, 0x1, 0xf4, 0x0, 0x0, 0xc7, 0x0, 0x0, + 0x0, 0x9, 0xdd, 0x30, 0x7, 0xec, 0x20, 0x0, + 0x0, 0x8d, 0x13, 0xd3, 0x9c, 0x14, 0xe7, 0x0, + 0x9, 0xd2, 0x0, 0x4, 0xb0, 0x0, 0x1c, 0x70, + 0x1, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x1, 0x11, 0x11, 0x1a, 0x81, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + + /* U+5354 "協" */ + 0x0, 0x1e, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x6d, 0xde, 0xfd, 0xdd, 0x80, + 0x0, 0x1e, 0x0, 0x0, 0x1d, 0x40, 0x7, 0x80, + 0x3, 0x5f, 0x33, 0x0, 0x6c, 0x0, 0x8, 0x60, + 0x1d, 0xdf, 0xdb, 0x5, 0xd2, 0x0, 0xc, 0x30, + 0x0, 0x1e, 0x0, 0xbb, 0x10, 0xc, 0xea, 0x0, + 0x0, 0x1e, 0x0, 0x38, 0x0, 0x0, 0xa0, 0x0, + 0x0, 0x1e, 0x0, 0x3b, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x1e, 0xc, 0xef, 0xde, 0x9e, 0xfd, 0xf4, + 0x0, 0x1e, 0x0, 0x77, 0xe, 0x3, 0xb0, 0xa4, + 0x0, 0x1e, 0x0, 0xb3, 0x1d, 0x7, 0x70, 0xb3, + 0x0, 0x1e, 0x0, 0xe0, 0x2c, 0xc, 0x30, 0xc2, + 0x0, 0x1e, 0x9, 0x80, 0x4a, 0x6b, 0x0, 0xe0, + 0x0, 0x1e, 0x2b, 0xa, 0xd5, 0xb1, 0x5e, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5357 "南" */ + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0x11, 0x11, 0x1a, 0x91, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x1, 0xf0, 0x7, 0x10, 0x1, 0x80, 0xe, 0x20, + 0x1, 0xf0, 0x7, 0x90, 0x8, 0x80, 0xe, 0x20, + 0x1, 0xf0, 0x24, 0xb3, 0x3e, 0x42, 0xe, 0x20, + 0x1, 0xf0, 0x8a, 0xad, 0xda, 0xa9, 0xe, 0x20, + 0x1, 0xf0, 0x0, 0x8, 0x70, 0x0, 0xe, 0x20, + 0x1, 0xf1, 0xee, 0xef, 0xfe, 0xee, 0x2e, 0x20, + 0x1, 0xf0, 0x0, 0x8, 0x70, 0x0, 0xe, 0x20, + 0x1, 0xf0, 0x0, 0x8, 0x70, 0x0, 0xf, 0x20, + 0x1, 0xf0, 0x0, 0x8, 0x70, 0x6e, 0xec, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5358 "単" */ + 0x0, 0x13, 0x0, 0x25, 0x0, 0x0, 0x53, 0x0, + 0x0, 0x3e, 0x10, 0x2e, 0x10, 0x2, 0xf2, 0x0, + 0x0, 0x8, 0xa0, 0x9, 0x80, 0xb, 0x70, 0x0, + 0x0, 0x7d, 0xdc, 0xcd, 0xcc, 0xdf, 0xc9, 0x0, + 0x0, 0x98, 0x22, 0x2a, 0x92, 0x22, 0x6b, 0x0, + 0x0, 0x97, 0x0, 0x9, 0x80, 0x0, 0x5b, 0x0, + 0x0, 0x9f, 0xee, 0xef, 0xfe, 0xee, 0xeb, 0x0, + 0x0, 0x97, 0x0, 0x9, 0x80, 0x0, 0x5b, 0x0, + 0x0, 0x97, 0x0, 0x9, 0x80, 0x0, 0x5b, 0x0, + 0x0, 0x9e, 0xee, 0xef, 0xfe, 0xee, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1d, 0xdd, 0xdd, 0xdf, 0xfd, 0xdd, 0xdd, 0xd2, + 0x2, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+5371 "危" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x61, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbe, 0xdd, 0xde, 0xd0, 0x0, 0x0, + 0x0, 0x9, 0xb0, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0x9f, 0xdc, 0xcc, 0xdf, 0xcc, 0xcc, 0xc2, + 0xc, 0xce, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, + 0x5, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x2, 0xfe, 0xee, 0xef, 0xf0, 0x0, + 0x0, 0x3d, 0x2, 0xe0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0x4c, 0x2, 0xe0, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0x69, 0x2, 0xe0, 0x2, 0x28, 0xa0, 0x0, + 0x0, 0xb6, 0x2, 0xe0, 0x7, 0xca, 0x20, 0x10, + 0x1, 0xf1, 0x2, 0xe0, 0x0, 0x0, 0x0, 0xa5, + 0xa, 0xa0, 0x1, 0xf2, 0x0, 0x0, 0x1, 0xe3, + 0x1e, 0x10, 0x0, 0x9f, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5373 "即" */ + 0x2f, 0xff, 0xff, 0xe0, 0xbe, 0xee, 0xec, 0x2e, + 0x0, 0x2, 0xe0, 0xc5, 0x11, 0x4d, 0x2e, 0x0, + 0x2, 0xe0, 0xc4, 0x0, 0x2d, 0x2e, 0x22, 0x24, + 0xe0, 0xc4, 0x0, 0x2d, 0x2f, 0xcc, 0xcd, 0xe0, + 0xc4, 0x0, 0x2d, 0x2e, 0x0, 0x2, 0xe0, 0xc4, + 0x0, 0x2d, 0x2e, 0x0, 0x3, 0xe0, 0xc4, 0x0, + 0x2d, 0x2f, 0xee, 0xee, 0xd0, 0xc4, 0x0, 0x2d, + 0x2e, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x2d, 0x2e, + 0x0, 0x97, 0x0, 0xc4, 0x0, 0x3d, 0x2e, 0x0, + 0x2f, 0x20, 0xc4, 0x7e, 0xf9, 0x2e, 0x38, 0xde, + 0xa0, 0xc4, 0x0, 0x0, 0x9f, 0xc6, 0x11, 0xe1, + 0xc4, 0x0, 0x0, 0x32, 0x0, 0x0, 0x10, 0xc4, + 0x0, 0x0, + + /* U+537B "卻" */ + 0x0, 0x3, 0x10, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe2, 0xc, 0x70, 0x2f, 0xff, 0xf3, 0x0, + 0xb7, 0x0, 0x1e, 0x42, 0xd0, 0xd, 0x30, 0xbb, + 0x5, 0x40, 0x5e, 0x3d, 0x0, 0xd3, 0x2b, 0x0, + 0xd9, 0x0, 0x43, 0xd0, 0xd, 0x30, 0x0, 0x6b, + 0xc9, 0x0, 0x2d, 0x0, 0xd3, 0x0, 0x2e, 0x10, + 0xba, 0x2, 0xd0, 0xd, 0x30, 0x1d, 0x60, 0x0, + 0xc9, 0x3d, 0x0, 0xd3, 0x2d, 0x70, 0x0, 0x1, + 0xb3, 0xd0, 0xd, 0x35, 0x6d, 0xff, 0xff, 0xd0, + 0x2d, 0x0, 0xd3, 0x0, 0xd1, 0x0, 0x1e, 0x2, + 0xd0, 0xd, 0x30, 0xd, 0x10, 0x1, 0xe0, 0x2d, + 0x6b, 0xf2, 0x0, 0xd1, 0x0, 0x1e, 0x2, 0xd3, + 0x63, 0x0, 0xd, 0xee, 0xee, 0xe0, 0x2d, 0x0, + 0x0, 0x0, 0xd1, 0x0, 0x1d, 0x2, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+539A "厚" */ + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x1b, 0xbb, 0xbb, 0xbb, 0xb2, 0x0, + 0x0, 0xd3, 0x1e, 0x0, 0x0, 0x0, 0xc3, 0x0, + 0x0, 0xd3, 0x1f, 0xbb, 0xbb, 0xbb, 0xf3, 0x0, + 0x0, 0xe3, 0x1e, 0x0, 0x0, 0x0, 0xc3, 0x0, + 0x0, 0xf2, 0x1d, 0xcc, 0xcc, 0xcc, 0xd3, 0x0, + 0x0, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x1c, 0xcc, 0xcc, 0xdf, 0xe2, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0x9, 0xa6, 0x0, 0x0, + 0x5, 0xb7, 0xcc, 0xcc, 0xcf, 0xcc, 0xcc, 0xc3, + 0x9, 0x71, 0x11, 0x11, 0x3e, 0x11, 0x11, 0x10, + 0xf, 0x20, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0x7d, 0xe9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+539F "原" */ + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xd3, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x1d, 0xdd, 0xfe, 0xdd, 0xdc, 0x0, + 0x0, 0xd3, 0x2e, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0xe3, 0x2e, 0x11, 0x11, 0x11, 0x3e, 0x0, + 0x0, 0xf2, 0x2f, 0xbb, 0xbb, 0xbb, 0xce, 0x0, + 0x0, 0xf1, 0x2e, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x1, 0xf0, 0x2f, 0xdd, 0xdd, 0xdd, 0xee, 0x0, + 0x3, 0xd0, 0x0, 0x10, 0x1e, 0x0, 0x0, 0x0, + 0x6, 0xa0, 0x8, 0xc0, 0x1e, 0x4, 0xc0, 0x0, + 0xb, 0x60, 0x6e, 0x10, 0x1e, 0x0, 0x7c, 0x0, + 0x2f, 0x6, 0xe2, 0x0, 0x2e, 0x0, 0x9, 0xa0, + 0x15, 0x0, 0x10, 0x5f, 0xea, 0x0, 0x0, 0x20, + + /* U+53B3 "厳" */ + 0x0, 0x1, 0x0, 0x3, 0x0, 0x0, 0x13, 0x0, + 0x0, 0xe, 0x30, 0xa, 0x80, 0x0, 0xb8, 0x0, + 0x0, 0x6, 0xb0, 0x2, 0xb0, 0x5, 0xc0, 0x0, + 0x0, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe3, + 0x0, 0xf0, 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, + 0x0, 0xf3, 0xcc, 0xcd, 0xe0, 0x5b, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x8, 0x70, 0x9d, 0xaa, 0xa4, + 0x0, 0xf8, 0xfd, 0xdd, 0xf7, 0xe4, 0x27, 0x90, + 0x1, 0xe0, 0xe0, 0x1, 0xd6, 0xf7, 0xa, 0x50, + 0x2, 0xd0, 0xec, 0xcd, 0xdc, 0x5c, 0xe, 0x10, + 0x3, 0xc0, 0xe0, 0x1, 0xd0, 0xb, 0x7b, 0x0, + 0x5, 0xa0, 0xec, 0xcc, 0xd0, 0x5, 0xf3, 0x0, + 0x9, 0x60, 0xe0, 0x2, 0xe1, 0x9, 0xf5, 0x0, + 0xe, 0x2b, 0xfc, 0xcb, 0xf5, 0xab, 0x2d, 0x60, + 0x29, 0x1, 0x0, 0x1, 0xda, 0x70, 0x1, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53BB "去" */ + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x11, 0x11, 0x19, 0x91, 0x11, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x1d, 0xdd, 0xdd, 0xde, 0xed, 0xdd, 0xdd, 0xd2, + 0x3, 0x33, 0x36, 0xf5, 0x33, 0x33, 0x33, 0x30, + 0x0, 0x0, 0xc, 0x80, 0x0, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0x0, 0x0, 0x9b, 0x0, 0x0, + 0x0, 0x2, 0xe2, 0x0, 0x0, 0xc, 0x90, 0x0, + 0x0, 0x1d, 0x40, 0x12, 0x34, 0x58, 0xf4, 0x0, + 0x0, 0xdf, 0xff, 0xfe, 0xcb, 0xa9, 0x9e, 0x0, + 0x0, 0x43, 0x20, 0x0, 0x0, 0x0, 0x9, 0x20, + + /* U+53C2 "参" */ + 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xe5, 0x4, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x8c, 0x20, 0x0, 0x7e, 0x40, 0x0, + 0x0, 0x3e, 0xfb, 0xcc, 0xdd, 0xee, 0xf7, 0x0, + 0x0, 0x15, 0x43, 0xaa, 0x0, 0x0, 0x2c, 0x10, + 0x0, 0x0, 0x1, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xee, 0xef, 0xfe, 0xef, 0xfe, 0xee, 0xe2, + 0x0, 0x0, 0x8c, 0x0, 0x10, 0xb9, 0x0, 0x0, + 0x0, 0x9, 0xd1, 0x18, 0xd3, 0xb, 0xa0, 0x0, + 0x4, 0xdb, 0x7b, 0xd7, 0x0, 0x30, 0x9e, 0x70, + 0x1c, 0x50, 0x33, 0x0, 0x6d, 0x70, 0x3, 0xb1, + 0x0, 0x0, 0x26, 0xbd, 0x81, 0x2, 0x70, 0x0, + 0x0, 0x0, 0xa8, 0x30, 0x0, 0x7e, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x9e, 0x92, 0x0, 0x0, + 0x0, 0x8, 0xbd, 0xea, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53C3 "參" */ + 0x0, 0x0, 0x1, 0x81, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x60, 0x5, 0xd3, 0x0, 0x0, + 0x0, 0x1b, 0xfb, 0xaa, 0xbb, 0xef, 0x50, 0x0, + 0x0, 0x9, 0x54, 0x32, 0x21, 0x12, 0xb1, 0x0, + 0x0, 0x1e, 0x40, 0x2, 0x20, 0x89, 0x22, 0x0, + 0x1, 0xc7, 0x3a, 0xd, 0xa2, 0xe2, 0x5d, 0x10, + 0x7, 0xfd, 0xde, 0xca, 0xcf, 0xec, 0xbb, 0xa0, + 0x0, 0x0, 0x2c, 0xa0, 0xa, 0xc3, 0x0, 0x40, + 0x0, 0x18, 0xe6, 0x6, 0xb0, 0x4d, 0xa4, 0x0, + 0x1b, 0xe7, 0x37, 0xc6, 0x1, 0x40, 0x4b, 0xe3, + 0x4, 0x4, 0xb5, 0x0, 0x6d, 0x50, 0x0, 0x20, + 0x0, 0x0, 0x5, 0xad, 0x81, 0x5, 0x90, 0x0, + 0x0, 0x2, 0xe9, 0x40, 0x2, 0xac, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xbd, 0x50, 0x0, 0x0, + 0x0, 0x8, 0xad, 0xd8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53C8 "又" */ + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, 0xd4, 0x0, + 0x0, 0x8, 0x90, 0x0, 0x0, 0x5, 0xe0, 0x0, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0xc, 0x70, 0x0, + 0x0, 0x0, 0xa7, 0x0, 0x0, 0x3f, 0x10, 0x0, + 0x0, 0x0, 0x3e, 0x20, 0x0, 0xc7, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xd0, 0xa, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x7e, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbd, 0xeb, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0x90, 0x1a, 0xe5, 0x0, 0x0, + 0x1, 0x7d, 0xd4, 0x0, 0x0, 0x6e, 0xd7, 0x10, + 0x2f, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xf3, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+53CA "及" */ + 0xa, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x11, 0xd5, 0x11, 0x14, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xc7, 0x0, 0x7, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0xdc, 0x0, 0xb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x10, 0xf, 0xed, 0xdd, 0x30, + 0x0, 0x0, 0xfb, 0x80, 0x2, 0x22, 0x4f, 0x10, + 0x0, 0x2, 0xf2, 0xe0, 0x0, 0x0, 0x8b, 0x0, + 0x0, 0x5, 0xd0, 0x99, 0x0, 0x0, 0xf4, 0x0, + 0x0, 0xb, 0x80, 0x1e, 0x40, 0xa, 0xa0, 0x0, + 0x0, 0x2f, 0x30, 0x3, 0xe3, 0x8c, 0x0, 0x0, + 0x0, 0xab, 0x0, 0x0, 0x6f, 0xe1, 0x0, 0x0, + 0x4, 0xf2, 0x0, 0x3, 0xcd, 0xfa, 0x10, 0x0, + 0x3f, 0x60, 0x5, 0xbf, 0x70, 0x1b, 0xfa, 0x50, + 0x17, 0x0, 0x6c, 0x61, 0x0, 0x0, 0x28, 0xb0, + + /* U+53CB "友" */ + 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xee, 0xd0, + 0x1, 0x11, 0x2f, 0x31, 0x11, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0x33, 0x33, 0x33, 0x30, 0x0, + 0x0, 0x0, 0x9f, 0xdc, 0xcc, 0xcd, 0xe0, 0x0, + 0x0, 0x0, 0xed, 0x80, 0x0, 0x9, 0x80, 0x0, + 0x0, 0x3, 0xe1, 0xe2, 0x0, 0x2f, 0x10, 0x0, + 0x0, 0xb, 0x80, 0x6c, 0x0, 0xc8, 0x0, 0x0, + 0x0, 0x3f, 0x20, 0x9, 0xcb, 0xa0, 0x0, 0x0, + 0x0, 0xd9, 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, + 0xb, 0xd0, 0x1, 0x8f, 0x75, 0xdc, 0x40, 0x0, + 0x2b, 0x12, 0xcf, 0x91, 0x0, 0x7, 0xdf, 0xb1, + 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0x1, 0x50, + + /* U+53CD "反" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x12, 0x35, 0x67, 0xac, 0xfe, 0x50, 0x0, + 0x2f, 0xdb, 0xa9, 0x76, 0x31, 0x0, 0x0, 0x2, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf4, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x3f, 0xcf, + 0xcc, 0xcc, 0xcc, 0xf6, 0x0, 0x4, 0xd0, 0x97, + 0x0, 0x0, 0x2e, 0x0, 0x0, 0x5c, 0x2, 0xe0, + 0x0, 0xa, 0x80, 0x0, 0x6, 0xb0, 0xa, 0x80, + 0x4, 0xf1, 0x0, 0x0, 0x79, 0x0, 0x1e, 0x52, + 0xe4, 0x0, 0x0, 0xa, 0x70, 0x0, 0x3f, 0xe7, + 0x0, 0x0, 0x0, 0xe3, 0x0, 0x6, 0xff, 0x80, + 0x0, 0x0, 0x5e, 0x0, 0x5c, 0xd3, 0x1a, 0xe7, + 0x10, 0xd, 0x64, 0xed, 0x60, 0x0, 0x4, 0xaf, + 0xa0, 0x30, 0x3, 0x0, 0x0, 0x0, 0x0, 0x2, + + /* U+53D6 "取" */ + 0x3f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x3, 0xc0, 0xbc, 0xcc, 0xcc, 0x90, + 0x1, 0xe0, 0x3, 0xc0, 0x3f, 0x33, 0x38, 0x90, + 0x1, 0xe1, 0x15, 0xc0, 0xd, 0x20, 0x9, 0x50, + 0x1, 0xfd, 0xde, 0xc0, 0x9, 0x50, 0xd, 0x20, + 0x1, 0xe0, 0x3, 0xc0, 0x6, 0x80, 0x1e, 0x0, + 0x1, 0xe0, 0x3, 0xc0, 0x2, 0xd0, 0x7a, 0x0, + 0x1, 0xff, 0xff, 0xc0, 0x0, 0xc3, 0xd3, 0x0, + 0x1, 0xe0, 0x3, 0xc0, 0x0, 0x6c, 0xc0, 0x0, + 0x1, 0xe0, 0x3, 0xd3, 0x0, 0x1f, 0x60, 0x0, + 0x5, 0xf8, 0xbe, 0xfb, 0x20, 0x8f, 0xb0, 0x0, + 0x3c, 0x96, 0x34, 0xc0, 0x5, 0xe2, 0xc7, 0x0, + 0x0, 0x0, 0x3, 0xc0, 0x6e, 0x30, 0x2e, 0x90, + 0x0, 0x0, 0x3, 0xc1, 0xc2, 0x0, 0x1, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53D7 "受" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x45, 0x68, 0xac, 0xf8, 0x0, + 0x9, 0xfe, 0xdc, 0xbb, 0x86, 0x42, 0x10, 0x0, + 0x0, 0xb, 0x0, 0xd, 0x40, 0x0, 0xc6, 0x0, + 0x0, 0xb, 0x60, 0x7, 0x90, 0x3, 0xe0, 0x0, + 0x0, 0x5, 0xa0, 0x3, 0x90, 0xb, 0x60, 0x0, + 0xd, 0xef, 0xfe, 0xee, 0xee, 0xef, 0xfe, 0xd0, + 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0x4, 0xc, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x40, + 0x0, 0x1, 0xe5, 0x0, 0x0, 0x2e, 0x30, 0x0, + 0x0, 0x0, 0x3e, 0x30, 0x1, 0xd7, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe7, 0x4e, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x8e, 0xc6, 0x5b, 0xf9, 0x52, 0x0, + 0xd, 0xfb, 0x72, 0x0, 0x0, 0x27, 0xbe, 0xe0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+53E3 "口" */ + 0xde, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe4, 0x22, + 0x22, 0x22, 0x22, 0x5f, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xed, 0xdd, 0xdd, 0xdd, + 0xdd, 0xef, 0xe6, 0x33, 0x33, 0x33, 0x33, 0x6f, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x2d, + + /* U+53E4 "古" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x4, 0x44, 0x44, 0x4b, 0xa4, 0x44, 0x44, 0x40, + 0x1c, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0xc2, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x5b, 0x11, 0x11, 0x11, 0x11, 0xb6, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0xb6, 0x0, + 0x0, 0x5f, 0xdd, 0xdd, 0xdd, 0xdd, 0xf6, 0x0, + 0x0, 0x5c, 0x22, 0x22, 0x22, 0x22, 0xb6, 0x0, + + /* U+53E5 "句" */ + 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe, + 0x50, 0x0, 0x0, 0x0, 0x4, 0xd0, 0xa, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x4c, 0x6, 0xe3, 0xdd, + 0xdd, 0xdd, 0x10, 0x5, 0xc0, 0xd3, 0x1e, 0x11, + 0x11, 0xf1, 0x0, 0x5b, 0x0, 0x1, 0xe0, 0x0, + 0xf, 0x10, 0x6, 0xa0, 0x0, 0x1e, 0x0, 0x0, + 0xf1, 0x0, 0x79, 0x0, 0x1, 0xe0, 0x0, 0xf, + 0x10, 0x9, 0x80, 0x0, 0x1f, 0xee, 0xee, 0xf1, + 0x0, 0xa6, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0xd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x11, 0x15, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53E6 "另" */ + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x5, 0xb0, 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x5a, 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x5, + 0xa0, 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x5a, + 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0xd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf2, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x9, 0x90, + 0x0, 0x2, 0xf0, 0x0, 0x0, 0x3, 0xf2, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x5, 0xe5, 0x0, 0x0, + 0x6, 0xb0, 0x1, 0x6c, 0xd4, 0x0, 0x1, 0x0, + 0xa8, 0x0, 0xda, 0x50, 0x0, 0x0, 0xbf, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+53EA "只" */ + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x3, + 0xd0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x3d, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x3, 0xd0, + 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x3d, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x3, 0xd0, 0x0, + 0x0, 0x0, 0x4, 0xe0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, + 0x41, 0x0, 0x0, 0x0, 0x3, 0xe4, 0x0, 0x8, + 0xe3, 0x0, 0x0, 0x3, 0xe5, 0x0, 0x0, 0x5, + 0xe5, 0x0, 0x8, 0xe5, 0x0, 0x0, 0x0, 0x3, + 0xe6, 0xa, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xf3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+53EB "叫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x3e, + 0xee, 0xed, 0x2, 0xe0, 0x0, 0xe2, 0x3d, 0x0, + 0x2e, 0x2, 0xe0, 0x0, 0xe2, 0x3c, 0x0, 0x1e, + 0x2, 0xe0, 0x0, 0xe2, 0x3c, 0x0, 0x1e, 0x2, + 0xe0, 0x0, 0xe2, 0x3c, 0x0, 0x1e, 0x2, 0xe0, + 0x0, 0xe2, 0x3c, 0x0, 0x1e, 0x2, 0xe0, 0x0, + 0xe2, 0x3c, 0x0, 0x1e, 0x2, 0xe0, 0x0, 0xe2, + 0x3c, 0x0, 0x1e, 0x2, 0xe0, 0x3, 0xf2, 0x3f, + 0xff, 0xfe, 0x6, 0xfb, 0xfc, 0xf2, 0x3d, 0x0, + 0x0, 0xd, 0xa5, 0x10, 0xe2, 0x28, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, + + /* U+53EF "可" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf1, 0x0, 0xf2, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0xf1, 0x0, 0xf2, 0x0, + 0x0, 0x69, 0x0, 0x0, 0xf1, 0x0, 0xf2, 0x0, + 0x0, 0x69, 0x0, 0x0, 0xf1, 0x0, 0xf2, 0x0, + 0x0, 0x69, 0x0, 0x0, 0xf1, 0x0, 0xf2, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf1, 0x0, 0xf2, 0x0, + 0x0, 0x6a, 0x11, 0x11, 0x10, 0x0, 0xf2, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x12, 0xf2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfe, 0xa0, 0x0, + + /* U+53F0 "台" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9c, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0xe1, + 0x0, 0x1e, 0x50, 0x0, 0x0, 0x3e, 0x20, 0x0, + 0x3, 0xe5, 0x0, 0x4, 0xd2, 0x0, 0x12, 0x34, + 0x8f, 0x50, 0x3f, 0xff, 0xff, 0xed, 0xcb, 0xaa, + 0xf2, 0x4, 0x21, 0x0, 0x0, 0x0, 0x0, 0x86, + 0x0, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, 0x1, + 0xfc, 0xcc, 0xcc, 0xcc, 0xcf, 0x10, 0x1, 0xf0, + 0x0, 0x0, 0x0, 0xf, 0x10, 0x1, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0x10, 0x1, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x1, 0xfe, 0xee, 0xee, 0xee, + 0xef, 0x10, 0x1, 0xf2, 0x22, 0x22, 0x22, 0x3f, + 0x10, + + /* U+53F2 "史" */ + 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0xf2, 0x11, 0x15, 0xd1, 0x11, 0x1a, 0x70, + 0x0, 0xf0, 0x0, 0x4, 0xc0, 0x0, 0x9, 0x70, + 0x0, 0xf0, 0x0, 0x4, 0xc0, 0x0, 0x9, 0x70, + 0x0, 0xfe, 0xee, 0xee, 0xfe, 0xee, 0xef, 0x70, + 0x0, 0x13, 0x11, 0x17, 0xb1, 0x11, 0x11, 0x0, + 0x0, 0xe, 0x40, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xd1, 0xe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9d, 0xac, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xf9, 0x10, 0x0, 0x0, 0x0, + 0x1, 0x5a, 0xf8, 0x3a, 0xfc, 0x85, 0x31, 0x0, + 0x1e, 0xc7, 0x10, 0x0, 0x15, 0x9b, 0xef, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+53F3 "右" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x22, 0x23, 0xf4, 0x22, 0x22, 0x22, 0x20, + 0xd, 0xdd, 0xdf, 0xfd, 0xdd, 0xdd, 0xdd, 0xd0, + 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf6, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x8d, 0xb6, 0x0, 0x0, 0x0, 0x4d, 0x0, + 0x9, 0xd1, 0xa6, 0x0, 0x0, 0x0, 0x4d, 0x0, + 0x2a, 0x10, 0xa6, 0x0, 0x0, 0x0, 0x4d, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0x0, 0x0, 0x4d, 0x0, + 0x0, 0x0, 0xaf, 0xee, 0xee, 0xee, 0xed, 0x0, + 0x0, 0x0, 0xa7, 0x22, 0x22, 0x22, 0x5c, 0x0, + + /* U+53F7 "号" */ + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xf0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0xf0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0xfb, 0xbb, + 0xbb, 0xbb, 0xbf, 0x0, 0x0, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7e, 0xee, 0xee, 0xee, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+53F8 "司" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7c, 0xcc, 0xcc, + 0xcc, 0xcc, 0x0, 0xf0, 0x12, 0x22, 0x22, 0x22, + 0x22, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x8, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf0, 0x8, 0x70, 0x0, 0x1, 0xe0, 0x0, 0xf0, + 0x8, 0x70, 0x0, 0x1, 0xe0, 0x0, 0xf0, 0x8, + 0x70, 0x0, 0x1, 0xe0, 0x0, 0xf0, 0x8, 0xed, + 0xdd, 0xde, 0xe0, 0x0, 0xf0, 0x8, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x2, 0x20, 0x0, 0x0, + 0x2, 0x23, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xfe, 0x80, + + /* U+5403 "吃" */ + 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x0, 0xef, + 0xff, 0x10, 0x7c, 0x0, 0x0, 0x0, 0xe, 0x21, + 0xe1, 0xe, 0xff, 0xff, 0xff, 0xc0, 0xe1, 0xe, + 0x19, 0xc1, 0x0, 0x0, 0x0, 0xe, 0x10, 0xe5, + 0xf2, 0x0, 0x0, 0x0, 0x0, 0xe1, 0xe, 0x13, + 0xad, 0xdd, 0xdd, 0xb0, 0xe, 0x10, 0xe1, 0x1, + 0x22, 0x2c, 0xd2, 0x0, 0xe1, 0xe, 0x10, 0x0, + 0xb, 0xc1, 0x0, 0xe, 0x10, 0xe1, 0x0, 0x1c, + 0xa0, 0x0, 0x0, 0xef, 0xef, 0x10, 0x1d, 0x90, + 0x0, 0x0, 0xe, 0x21, 0x10, 0xc, 0x90, 0x0, + 0x0, 0x61, 0x80, 0x0, 0x7, 0xb0, 0x0, 0x0, + 0xc, 0x20, 0x0, 0x0, 0xb9, 0x10, 0x0, 0x2, + 0xf0, 0x0, 0x0, 0x4, 0xdf, 0xff, 0xff, 0xf8, + 0x0, + + /* U+5404 "各" */ + 0x0, 0x0, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xee, 0xee, 0xee, 0x50, 0x0, + 0x0, 0x2c, 0xf3, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x4, 0xe8, 0x4d, 0x20, 0x6, 0xe2, 0x0, 0x0, + 0xd, 0x50, 0x4, 0xe4, 0x9d, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xd6, 0xae, 0x81, 0x0, 0x0, + 0x2, 0x7d, 0xe6, 0x0, 0x2, 0xbf, 0xa5, 0x10, + 0x7f, 0xa7, 0x33, 0x33, 0x33, 0x35, 0x8d, 0xc0, + 0x0, 0xe, 0xdc, 0xcc, 0xcc, 0xcf, 0x40, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0xd, 0x40, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0xd, 0x40, 0x0, + 0x0, 0xe, 0x53, 0x33, 0x33, 0x3e, 0x40, 0x0, + 0x0, 0xe, 0xcc, 0xcc, 0xcc, 0xce, 0x40, 0x0, + + /* U+5408 "合" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xe3, 0x2d, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xae, 0x30, 0x1, 0xcb, 0x20, 0x0, + 0x0, 0x6e, 0xb1, 0x0, 0x0, 0x19, 0xf9, 0x10, + 0x2e, 0xd6, 0xee, 0xee, 0xee, 0xee, 0x2a, 0xf2, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfe, 0xee, 0xee, 0xef, 0xe0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xe, 0xfe, 0xee, 0xee, 0xef, 0xe0, 0x0, + 0x0, 0xe, 0x30, 0x0, 0x0, 0x3, 0xe0, 0x0, + + /* U+540C "同" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe2, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe2, 0xc4, 0x3f, 0xff, + 0xff, 0xff, 0xe0, 0xe2, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0xc4, 0x6, 0xfe, 0xee, 0xef, 0x0, + 0xe2, 0xc4, 0x6, 0x90, 0x0, 0xf, 0x0, 0xe2, + 0xc4, 0x6, 0x90, 0x0, 0xf, 0x0, 0xe2, 0xc4, + 0x6, 0x90, 0x0, 0xf, 0x0, 0xe2, 0xc4, 0x6, + 0xfe, 0xee, 0xef, 0x0, 0xe2, 0xc4, 0x6, 0x90, + 0x0, 0x0, 0x0, 0xe2, 0xc4, 0x1, 0x20, 0x0, + 0x0, 0x1, 0xf2, 0xc4, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xb0, + + /* U+540D "名" */ + 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x5, 0xe5, + 0x0, 0x0, 0x5, 0xe1, 0x1, 0xae, 0x40, 0x0, + 0x0, 0x2f, 0x50, 0x7, 0xa1, 0x6d, 0x20, 0x3, + 0xe7, 0x0, 0x0, 0x0, 0x7, 0xf5, 0x6e, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x4b, 0xfa, 0x22, 0x22, 0x21, 0x4, + 0x9e, 0xfd, 0xdd, 0xdd, 0xdd, 0xec, 0x9, 0x73, + 0xf2, 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0xe2, + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0xed, 0xdd, 0xdd, + 0xdd, 0xec, 0x0, 0x0, 0xe4, 0x22, 0x22, 0x22, + 0x6c, + + /* U+5411 "向" */ + 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x90, 0x0, 0x0, 0x0, 0x2d, 0xdd, 0xdf, + 0xed, 0xdd, 0xdd, 0xdc, 0x2e, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x5e, 0x2e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x2e, 0x0, 0x22, 0x22, 0x22, 0x0, + 0x2e, 0x2e, 0x0, 0xed, 0xdd, 0xdf, 0x20, 0x2e, + 0x2e, 0x0, 0xe1, 0x0, 0xd, 0x20, 0x2e, 0x2e, + 0x0, 0xe1, 0x0, 0xd, 0x20, 0x2e, 0x2e, 0x0, + 0xe1, 0x0, 0xd, 0x20, 0x2e, 0x2e, 0x0, 0xef, + 0xee, 0xee, 0x20, 0x2e, 0x2e, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x2e, 0x2e, 0x0, 0x40, 0x0, 0x1, + 0x11, 0x4e, 0x2e, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xe7, + + /* U+5426 "否" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0x90, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x2b, 0xcb, 0x85, 0xea, 0x20, 0x0, + 0x0, 0x3b, 0xf7, 0x8, 0x80, 0x7, 0xe9, 0x10, + 0x2c, 0xf9, 0x20, 0x8, 0x80, 0x0, 0x1a, 0xe1, + 0x6, 0x10, 0x0, 0x8, 0x80, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xee, 0xee, 0xee, 0xee, 0xe3, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, + 0x0, 0x1f, 0xbb, 0xbb, 0xbb, 0xbb, 0xf4, 0x0, + 0x0, 0x1f, 0x33, 0x33, 0x33, 0x33, 0xe4, 0x0, + + /* U+5427 "吧" */ + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xfd, 0xd, + 0xff, 0xf1, 0x2e, 0x0, 0xe1, 0x3, 0xd0, 0xe2, + 0xe, 0x12, 0xe0, 0xe, 0x10, 0x3d, 0xe, 0x10, + 0xe1, 0x2e, 0x0, 0xe1, 0x3, 0xd0, 0xe1, 0xe, + 0x12, 0xe0, 0xe, 0x10, 0x3d, 0xe, 0x10, 0xe1, + 0x2e, 0x0, 0xe1, 0x3, 0xd0, 0xe1, 0xe, 0x12, + 0xe0, 0xe, 0x10, 0x4d, 0xe, 0x10, 0xe1, 0x2f, + 0xee, 0xee, 0xef, 0xd0, 0xe1, 0xe, 0x12, 0xe0, + 0x0, 0x0, 0x14, 0xe, 0xff, 0xf1, 0x2e, 0x0, + 0x0, 0x0, 0x0, 0xe1, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0x2, 0x6, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x1, 0xf2, 0x0, 0x0, + 0x1d, 0x30, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xa0, + + /* U+5440 "呀" */ + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xfd, 0xef, + 0xff, 0x10, 0x0, 0x0, 0xf, 0x0, 0xe2, 0x1e, + 0x10, 0xd0, 0x0, 0xf, 0x0, 0xe1, 0xe, 0x12, + 0xd0, 0x0, 0xf, 0x0, 0xe1, 0xe, 0x14, 0xb0, + 0x0, 0xf, 0x0, 0xe1, 0xe, 0x17, 0x91, 0x11, + 0x1f, 0x11, 0xe1, 0xe, 0x1a, 0xff, 0xff, 0xff, + 0xff, 0xe1, 0xe, 0x10, 0x0, 0x5, 0xdf, 0x0, + 0xe1, 0xe, 0x10, 0x0, 0x5d, 0x2f, 0x0, 0xef, + 0xef, 0x10, 0x7, 0xd1, 0xf, 0x0, 0xe2, 0x11, + 0x1, 0xbd, 0x10, 0xf, 0x0, 0x80, 0x0, 0x6e, + 0x90, 0x0, 0xf, 0x0, 0x0, 0x1, 0xa4, 0x0, + 0x11, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+544A "告" */ + 0x0, 0x2, 0xb0, 0x3, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x80, 0x3, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0xc6, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, + 0x8, 0xb0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, + 0x3, 0x43, 0x33, 0x35, 0xe3, 0x33, 0x33, 0x30, + 0xc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xee, 0xee, 0xee, 0xee, 0xe2, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0xf, 0xcb, 0xbb, 0xbb, 0xbb, 0xf2, 0x0, + 0x0, 0xf, 0x44, 0x44, 0x44, 0x44, 0xf2, 0x0, + + /* U+5462 "呢" */ + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xf4, 0xdf, + 0xff, 0x1a, 0x40, 0x0, 0x0, 0xb4, 0xe2, 0x1e, + 0x1a, 0x40, 0x0, 0x0, 0xb4, 0xe1, 0xe, 0x1a, + 0x50, 0x0, 0x0, 0xb4, 0xe1, 0xe, 0x1a, 0xfe, + 0xee, 0xee, 0xe4, 0xe1, 0xe, 0x1b, 0x40, 0xa0, + 0x0, 0x0, 0xe1, 0xe, 0x1c, 0x40, 0xf0, 0x0, + 0x72, 0xe1, 0xe, 0x1d, 0x30, 0xf0, 0x3c, 0xb2, + 0xe1, 0xe, 0x1e, 0x20, 0xfb, 0xc4, 0x0, 0xef, + 0xef, 0x1f, 0x0, 0xf4, 0x0, 0x0, 0xe2, 0x11, + 0x3d, 0x0, 0xf0, 0x0, 0x1, 0x80, 0x0, 0x88, + 0x0, 0xf0, 0x0, 0x1d, 0x0, 0x1, 0xe2, 0x0, + 0xf1, 0x0, 0x4c, 0x0, 0x4, 0x90, 0x0, 0xbf, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5468 "周" */ + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xc4, 0x0, 0x1, 0x0, 0x0, 0x2e, 0x0, 0xc4, + 0x0, 0xb, 0x50, 0x0, 0x2e, 0x0, 0xc4, 0x8d, + 0xdf, 0xed, 0xd6, 0x2e, 0x0, 0xc4, 0x0, 0xb, + 0x50, 0x0, 0x2e, 0x0, 0xc4, 0x11, 0x1b, 0x61, + 0x11, 0x2e, 0x0, 0xe4, 0xcc, 0xcc, 0xcc, 0xca, + 0x2e, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0x0, 0xf0, 0x3f, 0xdd, 0xde, 0xf0, 0x2e, 0x2, + 0xe0, 0x3c, 0x0, 0x0, 0xf0, 0x2e, 0x6, 0xb0, + 0x3c, 0x0, 0x0, 0xf0, 0x2e, 0xb, 0x60, 0x3f, + 0xee, 0xee, 0xf0, 0x2e, 0x3f, 0x10, 0x3c, 0x0, + 0x0, 0x0, 0x3e, 0x68, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5473 "味" */ + 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, 0x0, 0xd, + 0xdd, 0xe1, 0x0, 0x7, 0x90, 0x0, 0x0, 0xe1, + 0xe, 0x1b, 0xff, 0xff, 0xff, 0xf2, 0xe, 0x10, + 0xe1, 0x1, 0x17, 0xa1, 0x11, 0x0, 0xe1, 0xe, + 0x10, 0x0, 0x79, 0x0, 0x0, 0xe, 0x10, 0xe1, + 0x0, 0x7, 0x90, 0x0, 0x0, 0xe1, 0xe, 0x6f, + 0xff, 0xff, 0xff, 0xfd, 0xe, 0x10, 0xe1, 0x0, + 0x4f, 0xf6, 0x0, 0x0, 0xe1, 0xe, 0x10, 0xc, + 0xbc, 0xd0, 0x0, 0xe, 0xfe, 0xf1, 0x6, 0xa7, + 0x98, 0x70, 0x0, 0xe2, 0x11, 0x3, 0xe1, 0x79, + 0x1e, 0x30, 0x8, 0x0, 0x3, 0xe4, 0x7, 0x90, + 0x4e, 0x20, 0x0, 0x1, 0xe4, 0x0, 0x79, 0x0, + 0x6b, 0x0, 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, + 0x0, + + /* U+547C "呼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0x0, 0x24, 0x67, 0xac, 0xfd, 0x40, 0xdf, + 0xfd, 0xb, 0xa9, 0x8f, 0x20, 0x0, 0xe, 0x11, + 0xe0, 0x32, 0x2, 0xe0, 0x6, 0x40, 0xe1, 0x1e, + 0x5, 0xa0, 0x2e, 0x0, 0xe3, 0xe, 0x11, 0xe0, + 0xe, 0x12, 0xe0, 0x3d, 0x0, 0xe1, 0x1e, 0x0, + 0xb5, 0x2e, 0x9, 0x70, 0xe, 0x11, 0xe0, 0x6, + 0x52, 0xe0, 0xb0, 0x0, 0xe1, 0x1e, 0x37, 0x77, + 0x8f, 0x77, 0x77, 0x2e, 0x11, 0xe3, 0x99, 0x9a, + 0xf9, 0x99, 0x92, 0xef, 0xfd, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x2, 0xe0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+547D "命" */ + 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbb, 0xba, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0x90, 0xa, 0xd3, 0x0, 0x0, + 0x0, 0x2a, 0xe6, 0x0, 0x0, 0x6e, 0xa2, 0x0, + 0x2b, 0xe8, 0x4f, 0xff, 0xff, 0xf2, 0x8f, 0xc2, + 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + 0x0, 0xef, 0xff, 0xd0, 0x5f, 0xff, 0xfe, 0x0, + 0x0, 0xe1, 0x2, 0xd0, 0x5b, 0x0, 0x1f, 0x0, + 0x0, 0xe1, 0x2, 0xd0, 0x5b, 0x0, 0x1f, 0x0, + 0x0, 0xe1, 0x2, 0xd0, 0x5b, 0x0, 0x1f, 0x0, + 0x0, 0xe6, 0x56, 0xd0, 0x5b, 0x0, 0x1f, 0x0, + 0x0, 0xea, 0xaa, 0x80, 0x5b, 0x2f, 0xfa, 0x0, + 0x0, 0xc1, 0x0, 0x0, 0x5b, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0x0, 0x0, 0x0, + + /* U+548C "和" */ + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x58, 0xce, 0x60, 0x0, 0x0, 0x0, 0xb, + 0xb9, 0xf3, 0x0, 0x7f, 0xff, 0xff, 0x30, 0x0, + 0xf, 0x10, 0x7, 0x81, 0x11, 0xe3, 0x0, 0x0, + 0xf1, 0x0, 0x77, 0x0, 0xe, 0x32, 0xee, 0xef, + 0xee, 0xe7, 0x70, 0x0, 0xe3, 0x1, 0x18, 0xf4, + 0x11, 0x77, 0x0, 0xe, 0x30, 0x0, 0xdf, 0xd1, + 0x7, 0x70, 0x0, 0xe3, 0x0, 0x69, 0xf7, 0xc0, + 0x77, 0x0, 0xe, 0x30, 0xd, 0x2f, 0x1a, 0x87, + 0x70, 0x0, 0xe3, 0x9, 0x90, 0xf1, 0x13, 0x77, + 0x0, 0xe, 0x35, 0xe1, 0xf, 0x10, 0x7, 0x70, + 0x0, 0xe3, 0x23, 0x0, 0xf1, 0x0, 0x7f, 0xff, + 0xff, 0x30, 0x0, 0xf, 0x10, 0x7, 0x81, 0x11, + 0xe3, 0x0, 0x0, 0xf1, 0x0, 0x44, 0x0, 0x5, + 0x10, + + /* U+54B2 "咲" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x40, 0x0, + 0x0, 0x0, 0xd, 0x40, 0x0, 0x3e, 0x10, 0xbc, + 0xcc, 0x90, 0x4d, 0x0, 0xb, 0x70, 0xe, 0x43, + 0x6c, 0x0, 0xb1, 0x1, 0xb0, 0x0, 0xe1, 0x3, + 0xc8, 0xff, 0xff, 0xff, 0xfd, 0xe, 0x10, 0x3c, + 0x1, 0x13, 0xe1, 0x11, 0x10, 0xe1, 0x3, 0xc0, + 0x0, 0x2e, 0x0, 0x0, 0xe, 0x10, 0x3c, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0xe1, 0x3, 0xcb, 0xcc, + 0xdf, 0xcc, 0xcc, 0x3e, 0x10, 0x4c, 0x33, 0x38, + 0xf7, 0x33, 0x31, 0xef, 0xff, 0xc0, 0x0, 0x9e, + 0x90, 0x0, 0xe, 0x10, 0x0, 0x0, 0x2f, 0x2d, + 0x20, 0x0, 0x40, 0x0, 0x0, 0x2e, 0x70, 0x5c, + 0x0, 0x0, 0x0, 0x0, 0x6e, 0x70, 0x0, 0xbc, + 0x20, 0x0, 0x0, 0xdc, 0x30, 0x0, 0x0, 0x9f, + 0x30, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+54C1 "品" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x4c, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x4c, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x4d, 0x44, 0x44, + 0x44, 0xf2, 0x0, 0x0, 0x3b, 0xbb, 0xbb, 0xbb, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xce, 0xee, 0xed, 0x2, 0xee, 0xee, 0xeb, + 0xd4, 0x11, 0x3e, 0x2, 0xd1, 0x11, 0x5c, 0xd2, + 0x0, 0x2e, 0x2, 0xd0, 0x0, 0x4c, 0xd2, 0x0, + 0x2e, 0x2, 0xd0, 0x0, 0x4c, 0xd2, 0x0, 0x2e, + 0x2, 0xd0, 0x0, 0x4c, 0xde, 0xee, 0xee, 0x2, + 0xfe, 0xee, 0xec, 0xd5, 0x22, 0x4c, 0x2, 0xd2, + 0x22, 0x6b, + + /* U+54E1 "員" */ + 0x0, 0x2f, 0xdd, 0xdd, 0xdd, 0xde, 0xe0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, + 0x0, 0x2e, 0xee, 0xee, 0xee, 0xee, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdd, 0xcc, 0xcc, 0xcc, 0xcc, 0xe8, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x0, 0xdd, 0xcc, 0xcc, 0xcc, 0xcc, 0xe8, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x0, 0xdd, 0xcc, 0xcc, 0xcc, 0xcc, 0xe8, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x0, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xd7, 0x0, + 0x0, 0x4, 0xcb, 0x0, 0x5, 0xea, 0x40, 0x0, + 0x2a, 0xeb, 0x50, 0x0, 0x0, 0x5, 0xbe, 0x80, + 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + + /* U+54EA "哪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xef, 0xf, 0xee, 0xe0, 0xdf, + 0xfa, 0x3, 0xa0, 0xe0, 0xe0, 0x2c, 0xd, 0x3, + 0xa0, 0x3a, 0xe, 0xe, 0x6, 0x80, 0xd0, 0x3a, + 0x3, 0xa0, 0xe0, 0xe0, 0xb3, 0xd, 0x3, 0xaa, + 0xff, 0xee, 0xe, 0xd, 0x0, 0xd0, 0x3a, 0x4, + 0xa0, 0xe0, 0xe3, 0xa0, 0xd, 0x3, 0xa0, 0x49, + 0xe, 0xe, 0xc, 0x20, 0xd0, 0x3a, 0x5, 0x80, + 0xe0, 0xe0, 0x58, 0xd, 0x3, 0xaa, 0xff, 0xfe, + 0xe, 0x1, 0xc0, 0xdf, 0xfa, 0xa, 0x20, 0xd0, + 0xe0, 0xe, 0xd, 0x0, 0x0, 0xd0, 0x1d, 0xe, + 0x2, 0xd0, 0x60, 0x0, 0x69, 0x2, 0xc0, 0xe6, + 0xe6, 0x0, 0x0, 0x1d, 0x10, 0x4b, 0xe, 0x0, + 0x0, 0x0, 0x5, 0x60, 0xee, 0x50, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5546 "商" */ + 0x0, 0x0, 0x0, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, 0xdd, + 0xdd, 0xdd, 0xef, 0xdd, 0xdd, 0xdd, 0x1, 0x11, + 0x58, 0x11, 0x11, 0x77, 0x11, 0x10, 0x0, 0x2, + 0xf1, 0x0, 0xe, 0x40, 0x0, 0x0, 0x11, 0x19, + 0x41, 0x17, 0xc1, 0x11, 0x0, 0xf, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xf1, 0x0, 0xf0, 0x5, 0xb0, + 0x9, 0x70, 0xd, 0x10, 0xf, 0x9, 0xc1, 0x0, + 0x8, 0xd3, 0xd1, 0x0, 0xf2, 0x7a, 0xaa, 0xaa, + 0x93, 0x5d, 0x10, 0xf, 0x0, 0xe2, 0x22, 0x3e, + 0x0, 0xd1, 0x0, 0xf0, 0xe, 0x0, 0x0, 0xe0, + 0xd, 0x10, 0xf, 0x0, 0xec, 0xcc, 0xde, 0x0, + 0xd1, 0x0, 0xf0, 0xa, 0x0, 0x0, 0x0, 0xe, + 0x10, 0xf, 0x0, 0x0, 0x0, 0x3, 0xdd, 0xb0, + 0x0, + + /* U+554A "啊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x6, 0xff, 0xcb, 0xff, 0xff, 0xf7, 0xdf, + 0xfa, 0x66, 0x4a, 0x0, 0x0, 0x4a, 0xd, 0x3, + 0xa6, 0x67, 0x50, 0x0, 0x3, 0xa0, 0xd0, 0x3a, + 0x66, 0xb1, 0x6e, 0xea, 0x3a, 0xd, 0x3, 0xa6, + 0x7c, 0x6, 0x72, 0xb3, 0xa0, 0xd0, 0x3a, 0x66, + 0xc0, 0x66, 0x1b, 0x3a, 0xd, 0x3, 0xa6, 0x66, + 0x76, 0x61, 0xb3, 0xa0, 0xd0, 0x3a, 0x66, 0x1c, + 0x66, 0x1b, 0x3a, 0xd, 0x25, 0xa6, 0x60, 0xe6, + 0x72, 0xb3, 0xa0, 0xde, 0xe9, 0x66, 0xe, 0x6f, + 0xea, 0x3a, 0xd, 0x0, 0x6, 0x8d, 0x76, 0x60, + 0x3, 0xa0, 0x70, 0x0, 0x66, 0x0, 0x0, 0x0, + 0x3a, 0x0, 0x0, 0x6, 0x60, 0x0, 0x1, 0x26, + 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x5e, 0xc4, + 0x0, + + /* U+554F "問" */ + 0x4f, 0xdd, 0xdf, 0x60, 0xfd, 0xdd, 0xee, 0x4c, + 0x0, 0xa, 0x60, 0xf0, 0x0, 0x2e, 0x4d, 0x22, + 0x2b, 0x60, 0xf2, 0x22, 0x5e, 0x4e, 0xaa, 0xad, + 0x60, 0xfa, 0xaa, 0xbe, 0x4c, 0x0, 0xa, 0x60, + 0xf0, 0x0, 0x2e, 0x4f, 0xdd, 0xdd, 0x50, 0xdd, + 0xdd, 0xee, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x4c, 0x0, 0xcd, 0xdd, 0xdd, 0x20, 0x2e, + 0x4c, 0x0, 0xe2, 0x0, 0xe, 0x20, 0x2e, 0x4c, + 0x0, 0xe1, 0x0, 0xd, 0x20, 0x2e, 0x4c, 0x0, + 0xe1, 0x0, 0xd, 0x20, 0x2e, 0x4c, 0x0, 0xee, + 0xee, 0xef, 0x20, 0x2e, 0x4c, 0x0, 0xb1, 0x0, + 0x0, 0x11, 0x4e, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5566 "啦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x0, 0xc, 0x20, 0x0, 0x89, + 0x97, 0x3, 0xb0, 0x0, 0x78, 0x0, 0xd, 0x45, + 0xb0, 0x4b, 0x3, 0x57, 0x95, 0x50, 0xd0, 0x1b, + 0xaf, 0xfd, 0x69, 0x99, 0x99, 0xd, 0x1, 0xb0, + 0x3b, 0x1, 0x40, 0x5, 0x40, 0xd0, 0x1b, 0x3, + 0xb0, 0x2b, 0x0, 0xa5, 0xd, 0x1, 0xb0, 0x3b, + 0x30, 0xe0, 0xc, 0x30, 0xd0, 0x1b, 0x18, 0xfb, + 0xd, 0x0, 0xe1, 0xd, 0x2, 0xbb, 0xbb, 0x0, + 0xb3, 0xe, 0x0, 0xdf, 0xfb, 0x3, 0xb0, 0xa, + 0x42, 0xc0, 0xd, 0x0, 0x0, 0x3b, 0x0, 0x86, + 0x59, 0x0, 0x70, 0x0, 0x3, 0xb0, 0x7, 0x78, + 0x60, 0x0, 0x0, 0x0, 0x3b, 0x0, 0x10, 0xb3, + 0x0, 0x0, 0x0, 0x8f, 0x74, 0xee, 0xee, 0xee, + 0x40, + + /* U+5584 "善" */ + 0x0, 0x0, 0x61, 0x0, 0x0, 0x37, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x0, 0xc6, 0x0, 0x0, + 0x3, 0xdd, 0xee, 0xdd, 0xdd, 0xfd, 0xdd, 0x30, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xdd, 0xde, 0xed, 0xdd, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0x90, + 0x0, 0x8, 0x70, 0x9, 0x80, 0x8, 0x70, 0x0, + 0x0, 0x3, 0xe0, 0x9, 0x80, 0x1e, 0x20, 0x0, + 0x1d, 0xdd, 0xee, 0xde, 0xed, 0xee, 0xdd, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xee, 0xee, 0xee, 0xee, 0xf1, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf1, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf1, 0x0, + 0x0, 0xf, 0xed, 0xdd, 0xdd, 0xdd, 0xf1, 0x0, + + /* U+5589 "喉" */ + 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x2d, 0xee, 0xec, 0x0, 0xde, + 0xed, 0x3, 0xc0, 0x0, 0x4, 0xb0, 0xd, 0x0, + 0xd0, 0x96, 0x0, 0x0, 0x69, 0x0, 0xd0, 0xd, + 0x2f, 0x3e, 0xee, 0xef, 0xfe, 0x3d, 0x0, 0xda, + 0xf1, 0xa, 0x20, 0x0, 0x0, 0xd0, 0xf, 0xdf, + 0x11, 0xe0, 0x0, 0x0, 0xd, 0x0, 0xe3, 0xe1, + 0x8f, 0xef, 0xee, 0xc0, 0xd0, 0xd, 0xe, 0x3e, + 0x11, 0xe0, 0x0, 0xd, 0x0, 0xd0, 0xe3, 0x51, + 0x2e, 0x11, 0x10, 0xdf, 0xfd, 0xe, 0x6c, 0xcd, + 0xfd, 0xcc, 0x3d, 0x0, 0x0, 0xe1, 0x0, 0x7f, + 0x80, 0x0, 0xc0, 0x0, 0xe, 0x10, 0x1e, 0x4e, + 0x10, 0x0, 0x0, 0x0, 0xe1, 0x3d, 0x50, 0x5d, + 0x40, 0x0, 0x0, 0xe, 0x5b, 0x30, 0x0, 0x2c, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+559C "喜" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x9, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0xa0, + 0x0, 0x12, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x0, + 0x0, 0x48, 0x88, 0x88, 0x88, 0x88, 0x85, 0x0, + 0x0, 0x9, 0xcc, 0xcc, 0xcc, 0xcc, 0xa0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x3, 0xd0, 0x0, + 0x0, 0xc, 0xba, 0xaa, 0xaa, 0xab, 0xd0, 0x0, + 0x0, 0x1, 0x8a, 0x11, 0x11, 0xc8, 0x10, 0x0, + 0x29, 0x99, 0xbf, 0xa9, 0x9a, 0xfa, 0x99, 0x92, + 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + 0x0, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x1f, 0xcc, 0xcc, 0xcc, 0xcc, 0xf2, 0x0, + + /* U+559D "喝" */ + 0x11, 0x11, 0x2, 0xfd, 0xdd, 0xdd, 0xf1, 0xee, + 0xef, 0x12, 0xc0, 0x0, 0x0, 0xe1, 0xe1, 0xe, + 0x12, 0xfc, 0xcc, 0xcc, 0xf1, 0xe1, 0xe, 0x12, + 0xd0, 0x0, 0x0, 0xe1, 0xe1, 0xe, 0x12, 0xd1, + 0x11, 0x11, 0xe1, 0xe1, 0xe, 0x12, 0xdd, 0xbb, + 0xbb, 0xb0, 0xe1, 0xe, 0x10, 0xd6, 0x0, 0x0, + 0x0, 0xe1, 0xe, 0x17, 0xfd, 0xdd, 0xdd, 0xde, + 0xe1, 0xe, 0x6e, 0x20, 0x8, 0x30, 0x2d, 0xef, + 0xff, 0x46, 0x90, 0x3e, 0x70, 0x3c, 0xe1, 0x0, + 0x3, 0xa5, 0xb1, 0x7a, 0x4b, 0x70, 0x0, 0x3, + 0xdb, 0xa9, 0x9b, 0x89, 0x0, 0x0, 0x0, 0x22, + 0x22, 0x22, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xd2, + + /* U+55AE "單" */ + 0x0, 0xdc, 0xbb, 0xe5, 0x4e, 0xbb, 0xcf, 0x0, + 0x0, 0xd1, 0x0, 0xa5, 0x4a, 0x0, 0xf, 0x0, + 0x0, 0xd9, 0x88, 0xd5, 0x4d, 0x88, 0x8f, 0x0, + 0x0, 0x33, 0x33, 0x31, 0x13, 0x33, 0x33, 0x0, + 0x0, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x80, 0x0, 0x79, 0x0, + 0x0, 0x6e, 0xbb, 0xbe, 0xdb, 0xbb, 0xd9, 0x0, + 0x0, 0x6a, 0x11, 0x1a, 0x91, 0x11, 0x89, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x80, 0x0, 0x79, 0x0, + 0x0, 0x6d, 0xdd, 0xdf, 0xfd, 0xdd, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+55B6 "営" */ + 0x0, 0x10, 0x1, 0x40, 0x0, 0x2, 0x0, 0x6, + 0xd1, 0x1, 0xe2, 0x0, 0x3e, 0x10, 0x0, 0xaa, + 0x0, 0x78, 0x0, 0xd4, 0x0, 0xae, 0xff, 0xee, + 0xff, 0xef, 0xfe, 0xe3, 0xb4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0xb4, 0x2d, 0xdd, 0xdd, 0xdd, + 0xd1, 0xc4, 0x0, 0x2d, 0x0, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0x2d, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x2f, 0xdd, 0xdd, 0xdd, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0x10, 0x6, 0xc1, 0x11, + 0x11, 0x11, 0x1c, 0x20, 0x6, 0xc0, 0x0, 0x0, + 0x0, 0xb, 0x20, 0x6, 0xc1, 0x11, 0x11, 0x11, + 0x1c, 0x20, 0x6, 0xfd, 0xdd, 0xdd, 0xdd, 0xdf, + 0x20, + + /* U+55CE "嗎" */ + 0x23, 0x33, 0x3, 0xfe, 0xef, 0xfe, 0xea, 0xdf, + 0xff, 0x13, 0xb0, 0xe, 0x10, 0x0, 0xd2, 0xe, + 0x13, 0xb0, 0xe, 0x10, 0x0, 0xd1, 0xd, 0x13, + 0xfe, 0xef, 0xee, 0xe5, 0xd1, 0xd, 0x13, 0xb0, + 0xe, 0x10, 0x0, 0xd1, 0xd, 0x13, 0xfd, 0xdf, + 0xdd, 0xd5, 0xd1, 0xd, 0x13, 0xc0, 0xe, 0x10, + 0x0, 0xd1, 0xd, 0x13, 0xc0, 0xe, 0x10, 0x0, + 0xd3, 0x1e, 0x13, 0xff, 0xff, 0xff, 0xfe, 0xde, + 0xdd, 0x11, 0x0, 0x1, 0x32, 0x2d, 0xd1, 0x0, + 0xd, 0x3b, 0x1b, 0x1b, 0x3c, 0x20, 0x0, 0x3e, + 0xa, 0x1a, 0x25, 0x6a, 0x0, 0x0, 0xc5, 0x7, + 0x12, 0x0, 0x97, 0x0, 0x0, 0x30, 0x0, 0x0, + 0xbe, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+55EF "嗯" */ + 0x11, 0x11, 0xf, 0xee, 0xee, 0xee, 0xf1, 0xe, + 0xff, 0xe0, 0xf0, 0x0, 0x10, 0xe, 0x10, 0xe4, + 0x4e, 0xf, 0x0, 0x48, 0x0, 0xe1, 0xe, 0x0, + 0xe0, 0xf4, 0xce, 0xdc, 0x5e, 0x10, 0xe0, 0xe, + 0xf, 0x0, 0xda, 0x0, 0xe1, 0xe, 0x0, 0xe0, + 0xf0, 0x97, 0x5c, 0x1e, 0x10, 0xe0, 0xe, 0xf, + 0x36, 0x0, 0x32, 0xe1, 0xe, 0x0, 0xe0, 0xfe, + 0xee, 0xee, 0xef, 0x10, 0xe0, 0xe, 0x0, 0x0, + 0x23, 0x0, 0x10, 0xe, 0xff, 0xe4, 0x68, 0x53, + 0xd0, 0x3c, 0x0, 0xe0, 0x0, 0x85, 0x95, 0x9, + 0x60, 0xb5, 0x7, 0x0, 0xd, 0x19, 0x50, 0x11, + 0xc4, 0xc0, 0x0, 0x5, 0xa0, 0x96, 0x0, 0xe, + 0xb, 0x0, 0x0, 0x2, 0x5, 0xee, 0xee, 0x80, + 0x0, + + /* U+561B "嘛" */ + 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, 0x4, + 0x55, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0xd9, + 0xe0, 0xce, 0xee, 0xef, 0xee, 0xee, 0x2d, 0xd, + 0xe, 0x0, 0x40, 0x0, 0x30, 0x0, 0xd0, 0xd0, + 0xe0, 0xd, 0x0, 0xc, 0x0, 0xd, 0xd, 0xe, + 0x0, 0xe0, 0x0, 0xd0, 0x0, 0xd0, 0xd0, 0xe8, + 0xdf, 0xd5, 0xdf, 0xdc, 0xd, 0xd, 0xe, 0x5, + 0xf4, 0x3, 0xf5, 0x0, 0xd0, 0xd0, 0xf0, 0xae, + 0xb2, 0x8f, 0xa0, 0xd, 0xd, 0xe, 0xa, 0xd2, + 0x6b, 0xda, 0x0, 0xde, 0xf1, 0xc6, 0x5d, 0x3, + 0x7c, 0x64, 0xd, 0x0, 0x4a, 0xc0, 0xd0, 0xb1, + 0xc1, 0xa0, 0xa0, 0x8, 0x76, 0xd, 0x48, 0xc, + 0x8, 0x20, 0x0, 0xe2, 0x0, 0xd0, 0x0, 0xc0, + 0x0, 0x0, 0x2a, 0x0, 0xd, 0x0, 0xc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+56B4 "嚴" */ + 0x0, 0xac, 0xaa, 0xf1, 0x1f, 0xaa, 0xaf, 0x0, + 0x0, 0xa4, 0x0, 0xe1, 0x1e, 0x0, 0xe, 0x0, + 0x0, 0x9b, 0xaa, 0xd1, 0x1d, 0xaa, 0xad, 0x0, + 0x0, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, + 0x0, 0xf6, 0x66, 0x66, 0x66, 0x78, 0x66, 0x60, + 0x0, 0xe0, 0xab, 0xbd, 0x60, 0x69, 0x0, 0x0, + 0x0, 0xe0, 0x0, 0x3e, 0x10, 0xbc, 0x99, 0x91, + 0x1, 0xe7, 0xfc, 0xce, 0xe9, 0xf5, 0x4b, 0x90, + 0x2, 0xc0, 0xd5, 0x4a, 0x9b, 0xe5, 0xd, 0x20, + 0x3, 0xb0, 0xd6, 0x5a, 0x96, 0x2c, 0x3c, 0x0, + 0x5, 0xa0, 0xdb, 0xad, 0x90, 0xa, 0xe4, 0x0, + 0x9, 0x60, 0xd1, 0x7, 0x90, 0x8, 0xf2, 0x0, + 0xe, 0x2a, 0xfc, 0xce, 0xd6, 0x99, 0x4e, 0x50, + 0x39, 0x1, 0x0, 0x7, 0x9a, 0x60, 0x3, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+56DB "四" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xc5, 0x0, + 0xc5, 0x1, 0xe0, 0x0, 0xe2, 0xc4, 0x0, 0xc4, + 0x1, 0xe0, 0x0, 0xe2, 0xc4, 0x0, 0xd3, 0x1, + 0xe0, 0x0, 0xe2, 0xc4, 0x0, 0xf1, 0x1, 0xe0, + 0x0, 0xe2, 0xc4, 0x2, 0xd0, 0x1, 0xe0, 0x0, + 0xe2, 0xc4, 0x9, 0x80, 0x0, 0xf0, 0x0, 0xe2, + 0xc4, 0x5e, 0x10, 0x0, 0xbe, 0xed, 0xe2, 0xc8, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0xe2, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe2, 0xcd, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xf2, 0xc7, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xf2, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x81, + + /* U+56DE "回" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xd4, + 0x11, 0x11, 0x11, 0x11, 0x11, 0xe3, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe3, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0xd3, 0x1, 0xfe, 0xee, + 0xee, 0x0, 0xe3, 0xd3, 0x1, 0xe0, 0x0, 0x2e, + 0x0, 0xe3, 0xd3, 0x1, 0xe0, 0x0, 0x2e, 0x0, + 0xe3, 0xd3, 0x1, 0xe0, 0x0, 0x2e, 0x0, 0xe3, + 0xd3, 0x1, 0xe0, 0x0, 0x2e, 0x0, 0xe3, 0xd3, + 0x1, 0xee, 0xee, 0xed, 0x0, 0xe3, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe3, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0xde, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xf3, 0xd5, 0x22, 0x22, 0x22, 0x22, + 0x22, 0xe3, + + /* U+56E0 "因" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc3, 0xd2, 0x0, + 0x0, 0x85, 0x0, 0x0, 0xc3, 0xd2, 0x0, 0x0, + 0xb5, 0x0, 0x0, 0xc3, 0xd2, 0x22, 0x22, 0xc6, + 0x22, 0x20, 0xc3, 0xd2, 0xcd, 0xdd, 0xfe, 0xdd, + 0xd5, 0xc3, 0xd2, 0x0, 0x1, 0xf1, 0x0, 0x0, + 0xc3, 0xd2, 0x0, 0x6, 0xdc, 0x10, 0x0, 0xc3, + 0xd2, 0x0, 0xd, 0x55, 0xd2, 0x0, 0xc3, 0xd2, + 0x0, 0xab, 0x0, 0x4e, 0x20, 0xc3, 0xd2, 0x3c, + 0xb0, 0x0, 0x5, 0xd1, 0xc3, 0xd2, 0x66, 0x0, + 0x0, 0x0, 0x51, 0xc3, 0xdc, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xf3, 0xd5, 0x33, 0x33, 0x33, 0x33, + 0x33, 0xd3, + + /* U+56F0 "困" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0xd3, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0xe3, 0xd3, 0x0, 0x0, + 0xe1, 0x0, 0x0, 0xe3, 0xd3, 0x89, 0x99, 0xfa, + 0x99, 0x92, 0xe3, 0xd3, 0x56, 0x6d, 0xfc, 0x66, + 0x62, 0xe3, 0xd3, 0x0, 0x5c, 0xed, 0x70, 0x0, + 0xe3, 0xd3, 0x2, 0xd1, 0xe2, 0xb8, 0x0, 0xe3, + 0xd3, 0x2d, 0x40, 0xe1, 0xc, 0x80, 0xe3, 0xd6, + 0xe3, 0x0, 0xe1, 0x1, 0xd3, 0xe3, 0xd3, 0x10, + 0x0, 0xe1, 0x0, 0x10, 0xe3, 0xd3, 0x0, 0x0, + 0x81, 0x0, 0x0, 0xe3, 0xd7, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xe3, 0xdc, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xf3, + + /* U+56F3 "図" */ + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xc5, + 0x0, 0x2, 0x80, 0x0, 0x0, 0xe2, 0xc4, 0x0, + 0x0, 0xaa, 0x0, 0x0, 0xe2, 0xc4, 0x68, 0x6, + 0xa, 0x55, 0xc0, 0xe2, 0xc4, 0x1e, 0x19, 0x90, + 0xc, 0x50, 0xe2, 0xc4, 0x9, 0x70, 0xb5, 0x3e, + 0x0, 0xe2, 0xc4, 0x2, 0xe3, 0x13, 0xd6, 0x0, + 0xe2, 0xc4, 0x0, 0x4e, 0x2c, 0x90, 0x0, 0xe2, + 0xc4, 0x0, 0x8, 0xfc, 0x0, 0x0, 0xe2, 0xc4, + 0x1, 0x8e, 0x9e, 0xa3, 0x0, 0xe2, 0xc7, 0xbf, + 0x91, 0x1, 0x8e, 0xe6, 0xe2, 0xc5, 0x50, 0x0, + 0x0, 0x0, 0x42, 0xe2, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0xc5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, + + /* U+56FD "国" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe3, 0xd4, 0x8f, 0xff, + 0xff, 0xff, 0xa0, 0xe3, 0xd4, 0x0, 0x0, 0xf0, + 0x0, 0x0, 0xe3, 0xd4, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xe3, 0xd4, 0x1e, 0xef, 0xfe, 0xee, 0x40, + 0xe3, 0xd4, 0x0, 0x0, 0xf0, 0x61, 0x0, 0xe3, + 0xd4, 0x0, 0x0, 0xf0, 0x4c, 0x0, 0xe3, 0xd4, + 0x0, 0x0, 0xf0, 0x5, 0x20, 0xe3, 0xd4, 0xce, + 0xee, 0xee, 0xee, 0xe1, 0xe3, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0xdd, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xf3, 0xd7, 0x33, 0x33, 0x33, 0x33, + 0x33, 0xf3, + + /* U+570B "國" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xd2, + 0x0, 0x0, 0x3, 0x5, 0x0, 0xd3, 0xd2, 0x0, + 0x0, 0xd, 0x7, 0xb0, 0xd3, 0xd2, 0x78, 0x88, + 0x8f, 0x88, 0x94, 0xd3, 0xd2, 0x34, 0x44, 0x4e, + 0x44, 0x42, 0xd3, 0xd2, 0x3a, 0xaa, 0x2b, 0x23, + 0x90, 0xd3, 0xd2, 0x57, 0x9, 0x39, 0x49, 0x60, + 0xd3, 0xd2, 0x57, 0x9, 0x36, 0x8e, 0x10, 0xd3, + 0xd2, 0x3a, 0xaa, 0x23, 0xf8, 0x0, 0xd3, 0xd2, + 0x0, 0x25, 0x63, 0xf2, 0x13, 0xd3, 0xd2, 0xcd, + 0xa7, 0x8e, 0xaa, 0x47, 0xd3, 0xd2, 0x0, 0x3, + 0xd2, 0x9, 0xe2, 0xd3, 0xd5, 0x33, 0x33, 0x43, + 0x33, 0x33, 0xe3, 0xdc, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xf3, + + /* U+570D "圍" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xd2, + 0x0, 0x6, 0x40, 0x0, 0x0, 0xd3, 0xd2, 0x9, + 0xad, 0xca, 0xa9, 0x0, 0xd3, 0xd2, 0x0, 0x1e, + 0x0, 0xd, 0x0, 0xd3, 0xd2, 0xaa, 0xbb, 0xaa, + 0xbb, 0xa4, 0xd3, 0xd2, 0x7, 0x99, 0x99, 0x99, + 0x20, 0xd3, 0xd2, 0xc, 0x20, 0x0, 0xb, 0x30, + 0xd3, 0xd2, 0x7, 0x99, 0x9f, 0x9a, 0x20, 0xd3, + 0xd2, 0x7a, 0xaa, 0xaf, 0xaa, 0xa3, 0xd3, 0xd2, + 0xd, 0x0, 0xf, 0x0, 0x0, 0xd3, 0xd2, 0x2f, + 0xbb, 0xbf, 0xbb, 0xb2, 0xd3, 0xd2, 0x0, 0x0, + 0xf, 0x0, 0x0, 0xd3, 0xd5, 0x33, 0x33, 0x38, + 0x33, 0x33, 0xe3, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xf3, + + /* U+5712 "園" */ + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xd2, + 0x0, 0x0, 0x41, 0x0, 0x0, 0xd3, 0xd2, 0xa, + 0xaa, 0xeb, 0xaa, 0x60, 0xd3, 0xd2, 0x0, 0x0, + 0xc4, 0x0, 0x0, 0xd3, 0xd2, 0xbb, 0xbb, 0xfc, + 0xbb, 0xb6, 0xd3, 0xd2, 0x11, 0x11, 0x11, 0x11, + 0x10, 0xd3, 0xd2, 0xf, 0xaa, 0xaa, 0xac, 0x80, + 0xd3, 0xd2, 0xe, 0x0, 0x0, 0x6, 0x80, 0xd3, + 0xd2, 0xa, 0xab, 0xfb, 0xaa, 0xa1, 0xd3, 0xd2, + 0x0, 0x4d, 0xfc, 0x79, 0x80, 0xd3, 0xd2, 0x4b, + 0x91, 0xf0, 0x7d, 0x60, 0xd3, 0xd3, 0x91, 0x0, + 0xf0, 0x0, 0x85, 0xd3, 0xd5, 0x33, 0x33, 0x73, + 0x33, 0x33, 0xe3, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xf3, + + /* U+5718 "團" */ + 0x3f, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xed, 0x3c, + 0x0, 0x0, 0x6, 0x0, 0x0, 0x2d, 0x3c, 0x4a, + 0xaa, 0xaf, 0xaa, 0xa8, 0x2d, 0x3c, 0x7, 0x88, + 0x9e, 0x88, 0x80, 0x2d, 0x3c, 0xd, 0x33, 0x4e, + 0x33, 0xe0, 0x2d, 0x3c, 0xd, 0x77, 0x8e, 0x77, + 0xe0, 0x2d, 0x3c, 0xc, 0x99, 0xaf, 0x99, 0xd0, + 0x2d, 0x3c, 0x13, 0x34, 0x5e, 0x4a, 0x80, 0x2d, + 0x3c, 0x37, 0x76, 0x65, 0x69, 0x94, 0x2d, 0x3c, + 0x7b, 0xbb, 0xbb, 0xce, 0xbb, 0x3d, 0x3c, 0x0, + 0x79, 0x0, 0x29, 0x0, 0x2d, 0x3c, 0x0, 0x6, + 0x25, 0xa8, 0x0, 0x2d, 0x3e, 0xaa, 0xaa, 0xab, + 0xba, 0xaa, 0xbd, 0x3d, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x5c, + + /* U+571F "土" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x1a, 0x91, 0x11, 0x11, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x4, 0x44, 0x44, 0x4b, 0xa4, 0x44, 0x44, 0x40, + 0x1b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb2, + + /* U+5723 "圣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x9, 0xb0, 0x0, 0x0, 0xa, 0xb0, 0x0, + 0x0, 0x0, 0xca, 0x0, 0x0, 0x9e, 0x10, 0x0, + 0x0, 0x0, 0x1b, 0xd2, 0x2c, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xfa, 0xbf, 0xb5, 0x10, 0x0, + 0x2c, 0xfe, 0xb6, 0x0, 0x1, 0x7d, 0xfd, 0xa2, + 0x5, 0x20, 0x0, 0x8, 0x80, 0x0, 0x4, 0x60, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0xee, 0xef, 0xfe, 0xee, 0xe3, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x19, 0x91, 0x11, 0x11, 0x10, + 0xe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe1, + + /* U+5728 "在" */ + 0x0, 0x0, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1, 0x11, + 0x5e, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0xd, + 0x50, 0x0, 0x59, 0x0, 0x0, 0x0, 0x8, 0xb0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0x6, 0xff, 0x30, 0xff, + 0xff, 0xff, 0xff, 0x52, 0xf4, 0xd3, 0x0, 0x0, + 0x7b, 0x0, 0x0, 0x2, 0xd, 0x30, 0x0, 0x6, + 0xa0, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x6a, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x6, 0xa0, + 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0x0, 0xd, 0x3a, 0xff, 0xff, 0xff, 0xff, + 0xf0, + + /* U+5730 "地" */ + 0x0, 0xc, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0xf, 0x0, 0xc, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0xf, 0x0, 0xf, 0x0, 0xc3, 0x16, 0x80, + 0x1b, 0xcf, 0xbb, 0xf, 0x0, 0xdc, 0xeb, 0xd0, + 0x4, 0x4f, 0x43, 0xf, 0x6d, 0xf8, 0x3, 0xd0, + 0x0, 0xf, 0x0, 0x7f, 0xc4, 0xd3, 0x3, 0xd0, + 0x0, 0xf, 0x7, 0xbf, 0x0, 0xc3, 0x3, 0xd0, + 0x0, 0xf, 0x0, 0xf, 0x0, 0xc3, 0x3, 0xc0, + 0x0, 0xf, 0x5, 0xf, 0x0, 0xc3, 0x5, 0xb0, + 0x0, 0x2f, 0xec, 0xf, 0x0, 0xc3, 0xde, 0x50, + 0x19, 0xfc, 0x40, 0xf, 0x0, 0xc3, 0x0, 0x0, + 0xb, 0x40, 0x0, 0xf, 0x0, 0x10, 0x0, 0x76, + 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0xb6, + 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, 0xff, 0xc0, + + /* U+5747 "均" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0x0, 0x1, 0xe1, 0x0, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, 0x1, + 0xe0, 0x0, 0x2f, 0xed, 0xdd, 0xdd, 0x2b, 0xcf, + 0xbb, 0x1d, 0x40, 0x0, 0x1, 0xe0, 0x45, 0xf4, + 0x4c, 0x81, 0x0, 0x0, 0x1e, 0x0, 0x1e, 0x0, + 0x60, 0xc8, 0x0, 0x2, 0xd0, 0x1, 0xe0, 0x0, + 0x0, 0xba, 0x0, 0x2d, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0xa3, 0x3, 0xc0, 0x1, 0xe0, 0x53, 0x0, + 0x1, 0x9c, 0x4b, 0x0, 0x1f, 0xdb, 0x20, 0x18, + 0xe7, 0x5, 0xa0, 0x7e, 0xc3, 0x1, 0x8e, 0x91, + 0x0, 0x79, 0x1b, 0x40, 0x0, 0x2a, 0x20, 0x0, + 0x9, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+574A "坊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x55, 0x55, 0x78, 0x55, 0x51, + 0x2, 0x2f, 0x23, 0xaa, 0xbf, 0xaa, 0xaa, 0xa3, + 0x1d, 0xef, 0xdd, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x60, + 0x0, 0xf, 0x0, 0x0, 0x4c, 0x0, 0xb, 0x50, + 0x0, 0xf, 0x1, 0x0, 0x8a, 0x0, 0xc, 0x50, + 0x0, 0x1f, 0xbe, 0x30, 0xd5, 0x0, 0xc, 0x40, + 0x2a, 0xfc, 0x60, 0x6, 0xe0, 0x0, 0xe, 0x20, + 0x28, 0x20, 0x0, 0x1e, 0x40, 0x0, 0xf, 0x10, + 0x0, 0x0, 0x2, 0xd8, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0xd, 0x60, 0x0, 0xcf, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5750 "坐" */ + 0x0, 0x0, 0x60, 0x9, 0x80, 0x1, 0x40, 0x0, + 0x0, 0x5, 0xc0, 0x9, 0x80, 0x8, 0x90, 0x0, + 0x0, 0xb, 0x80, 0x9, 0x80, 0xe, 0x40, 0x0, + 0x0, 0x1f, 0x90, 0x9, 0x80, 0x4f, 0x30, 0x0, + 0x0, 0x8a, 0xb9, 0x9, 0x80, 0xd9, 0xe3, 0x0, + 0x4, 0xf1, 0xc, 0x89, 0x8a, 0xb0, 0x4e, 0x30, + 0x2f, 0x40, 0x1, 0x49, 0xbb, 0x0, 0x5, 0xd0, + 0x2, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x10, + 0x0, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0x10, + 0x0, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x2, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x20, + 0x1d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd2, + + /* U+578B "型" */ + 0x5, 0xff, 0xff, 0xff, 0xc0, 0xc3, 0xc, 0x30, + 0x0, 0xc, 0x20, 0xb4, 0x0, 0xc3, 0xc, 0x30, + 0x0, 0xc, 0x20, 0xb4, 0x0, 0xc3, 0xc, 0x30, + 0xa, 0xbf, 0xcb, 0xec, 0xb2, 0xc3, 0xc, 0x30, + 0x3, 0x4f, 0x43, 0xc7, 0x30, 0xc3, 0xc, 0x30, + 0x0, 0x4b, 0x0, 0xb4, 0x0, 0x41, 0xc, 0x30, + 0x0, 0xb6, 0x0, 0xb4, 0x0, 0x0, 0xc, 0x30, + 0x9, 0xb0, 0x0, 0xa5, 0x10, 0xc, 0xde, 0x10, + 0x2, 0x0, 0x0, 0x6, 0xa0, 0x1, 0x10, 0x0, + 0x0, 0x23, 0x33, 0x39, 0xb3, 0x33, 0x32, 0x0, + 0x0, 0x6b, 0xbb, 0xbd, 0xeb, 0xbb, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x17, 0xa1, 0x11, 0x11, 0x10, + 0x3e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe3, + + /* U+57DF "域" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x0, 0x0, 0x2d, 0x2c, 0x30, + 0x0, 0x87, 0x0, 0x0, 0x0, 0x2e, 0x2, 0xb0, + 0x0, 0x87, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x26, 0xba, 0x60, 0x0, 0x0, 0xf, 0x0, 0x0, + 0x3b, 0xed, 0xb0, 0x33, 0x33, 0xf, 0x0, 0x20, + 0x0, 0x87, 0x3, 0xea, 0xae, 0xe, 0x13, 0xd0, + 0x0, 0x87, 0x3, 0xa0, 0xe, 0xd, 0x2a, 0x70, + 0x0, 0x87, 0x3, 0xa0, 0xe, 0xc, 0x5f, 0x10, + 0x0, 0x87, 0x4, 0xfe, 0xee, 0x9, 0xd9, 0x0, + 0x0, 0x8c, 0xe2, 0x0, 0x0, 0x17, 0xf1, 0x0, + 0x19, 0xf9, 0x20, 0x37, 0xbe, 0x8c, 0xc0, 0x10, + 0x29, 0x20, 0x2f, 0xd8, 0x41, 0xb9, 0xf1, 0x57, + 0x0, 0x0, 0x1, 0x0, 0x2c, 0x80, 0x99, 0x85, + 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, 0x1c, 0xd0, + + /* U+57F7 "執" */ + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x6, 0xee, 0xff, 0xe6, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x45, 0xf5, 0x54, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0xde, 0xfe, 0xec, 0x0, + 0x1f, 0xff, 0xff, 0xfd, 0x0, 0xf0, 0x3c, 0x0, + 0x0, 0xb2, 0x2, 0xb0, 0x1, 0xe0, 0x3c, 0x0, + 0x0, 0x67, 0x8, 0x60, 0xb5, 0xd0, 0x3c, 0x0, + 0x7, 0xee, 0xef, 0xe8, 0x4f, 0xc0, 0x3c, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x7, 0xe2, 0x2d, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0xc, 0xae, 0x3d, 0x0, + 0xe, 0xee, 0xfe, 0xee, 0x1f, 0x7, 0x4e, 0x0, + 0x0, 0x0, 0xe0, 0x0, 0x8a, 0x0, 0xe, 0x19, + 0x0, 0x0, 0xe0, 0x4, 0xd1, 0x0, 0xb, 0x79, + 0x0, 0x0, 0xe0, 0xc, 0x30, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+57FA "基" */ + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x7, 0xef, 0xff, 0xee, 0xee, 0xef, 0xfe, 0x80, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x0, 0x0, 0xfd, 0xdd, 0xdd, 0xdf, 0x10, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x0, 0x0, 0xfd, 0xdd, 0xdd, 0xdf, 0x10, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x3e, 0xee, 0xfe, 0xee, 0xee, 0xef, 0xee, 0xe3, + 0x0, 0x3, 0xe2, 0x0, 0x0, 0x1d, 0x50, 0x0, + 0x0, 0x3e, 0x40, 0x9, 0x80, 0x2, 0xe6, 0x0, + 0x19, 0xe5, 0xde, 0xef, 0xfe, 0xed, 0x2d, 0xc2, + 0x1a, 0x10, 0x0, 0x9, 0x80, 0x0, 0x0, 0x60, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x10, + + /* U+5831 "報" */ + 0x0, 0x0, 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xe0, + 0x8, 0xef, 0xfe, 0xe6, 0x78, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0xf0, 0x0, 0x78, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0xf0, 0x0, 0x78, 0x2, 0x35, 0xd0, + 0x1f, 0xff, 0xff, 0xfd, 0x78, 0x4, 0xba, 0x50, + 0x0, 0xb1, 0x3, 0xb0, 0x7a, 0x33, 0x33, 0x30, + 0x0, 0x67, 0xc, 0x30, 0x7e, 0xe9, 0x99, 0xf1, + 0xb, 0xff, 0xff, 0xf8, 0x79, 0xd1, 0x3, 0xd0, + 0x0, 0x0, 0xf0, 0x0, 0x78, 0x87, 0x9, 0x80, + 0x0, 0x0, 0xf0, 0x0, 0x78, 0x1e, 0x3e, 0x10, + 0x1f, 0xff, 0xff, 0xfd, 0x78, 0x7, 0xf9, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x78, 0x7, 0xf9, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x79, 0x8d, 0x3c, 0xb1, + 0x0, 0x0, 0xe0, 0x0, 0x7d, 0xb0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5834 "場" */ + 0x0, 0x2d, 0x0, 0xf, 0xdd, 0xdd, 0xdf, 0x10, + 0x0, 0x2d, 0x0, 0xe, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x2d, 0x0, 0xf, 0xcc, 0xcc, 0xcf, 0x10, + 0x1e, 0xef, 0xe9, 0xe, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x2d, 0x0, 0xf, 0xcc, 0xcc, 0xcf, 0x10, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x9, 0xef, 0xfe, 0xee, 0xee, 0xe5, + 0x0, 0x2d, 0x1, 0xc, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xba, 0x9f, 0xee, 0xee, 0xee, 0xc0, + 0x6, 0xdd, 0x6a, 0xb0, 0x69, 0xb, 0x24, 0xc0, + 0x2d, 0x50, 0x49, 0x3, 0xd0, 0x3b, 0x6, 0xb0, + 0x0, 0x0, 0x0, 0x3d, 0x30, 0xb4, 0x8, 0x80, + 0x0, 0x0, 0x4, 0xe4, 0x8, 0xa0, 0xc, 0x50, + 0x0, 0x0, 0x1, 0x20, 0x3c, 0x9, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+584A "塊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x9e, 0xef, 0xfe, 0xee, 0xd0, + 0x0, 0x3c, 0x0, 0xa4, 0x0, 0xe0, 0x1, 0xe0, + 0x8, 0x9e, 0x84, 0xa4, 0x1, 0xd0, 0x1, 0xe0, + 0x8, 0xae, 0x84, 0xae, 0xdd, 0xfd, 0xdd, 0xe0, + 0x0, 0x3c, 0x0, 0xa4, 0x4, 0xb0, 0x1, 0xe0, + 0x0, 0x3c, 0x0, 0xa4, 0x6, 0x80, 0x1, 0xe0, + 0x0, 0x3c, 0x0, 0x9e, 0xef, 0xfe, 0xee, 0xd0, + 0x0, 0x3c, 0x0, 0x0, 0xe, 0xf0, 0x34, 0x0, + 0x0, 0x3d, 0x58, 0x0, 0x4c, 0xe0, 0xa5, 0x60, + 0x4, 0xaf, 0xa4, 0x0, 0xd4, 0xe3, 0xb3, 0xd0, + 0x2d, 0x71, 0x0, 0x9, 0xb0, 0xe7, 0xa8, 0x82, + 0x0, 0x0, 0x0, 0x9c, 0x0, 0xe0, 0x0, 0x49, + 0x0, 0x0, 0x9, 0xa1, 0x0, 0xaf, 0xee, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5869 "塩" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0xf, 0xcb, 0xbb, 0xbb, 0xb2, + 0x0, 0x4a, 0x0, 0x79, 0x33, 0x33, 0x33, 0x30, + 0x4, 0x7c, 0x44, 0xf4, 0x11, 0x11, 0x11, 0x0, + 0x1b, 0xde, 0xbe, 0x8f, 0xbb, 0xbb, 0xd8, 0x0, + 0x0, 0x4a, 0x2, 0xf, 0x0, 0x0, 0x68, 0x0, + 0x0, 0x4a, 0x0, 0xf, 0x22, 0x22, 0x88, 0x0, + 0x0, 0x4a, 0x0, 0xa, 0xaa, 0xaa, 0xa6, 0x0, + 0x0, 0x4a, 0x1, 0x12, 0x22, 0x22, 0x22, 0x0, + 0x0, 0x5d, 0xd8, 0xdc, 0xde, 0xcf, 0xcf, 0x40, + 0x29, 0xfb, 0x40, 0xd1, 0x57, 0xc, 0xb, 0x40, + 0x29, 0x20, 0x0, 0xd1, 0x57, 0xc, 0xb, 0x40, + 0x0, 0x0, 0x0, 0xd1, 0x57, 0xc, 0xb, 0x40, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, + + /* U+5883 "境" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x5, 0xa0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, + 0x5a, 0x0, 0xce, 0xee, 0xee, 0xee, 0x20, 0x5, + 0xa0, 0x0, 0x56, 0x0, 0x57, 0x0, 0x4, 0x8b, + 0x41, 0x3, 0xc0, 0xc, 0x50, 0x2, 0xbd, 0xeb, + 0x6d, 0xdd, 0xdd, 0xdd, 0xd7, 0x0, 0x5a, 0x0, + 0x35, 0x55, 0x55, 0x54, 0x0, 0x5, 0xa0, 0x8, + 0x94, 0x44, 0x48, 0xb0, 0x0, 0x5a, 0x0, 0x8d, + 0xbb, 0xbb, 0xdb, 0x0, 0x5, 0xa0, 0x8, 0x70, + 0x0, 0x4, 0xb0, 0x0, 0x5b, 0x75, 0x8e, 0xcc, + 0xcc, 0xdb, 0x1, 0x6c, 0xf9, 0x20, 0xe, 0x14, + 0xb0, 0x0, 0x3c, 0x60, 0x0, 0x3, 0xd0, 0x4b, + 0x0, 0x60, 0x0, 0x0, 0x3, 0xd5, 0x4, 0xb0, + 0xd, 0x0, 0x0, 0xc, 0xd5, 0x0, 0x1d, 0xee, + 0x90, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+5897 "増" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xd0, 0x0, 0xa6, 0x0, 0xa, 0x70, 0x0, + 0x2d, 0x0, 0x2, 0xe0, 0x2, 0xd0, 0x0, 0x2, + 0xd0, 0xd, 0xed, 0xef, 0xdd, 0xea, 0x6, 0x8e, + 0x63, 0xd3, 0x0, 0xf0, 0x5, 0xa0, 0x89, 0xe8, + 0x5d, 0xdc, 0xcf, 0xcc, 0xda, 0x0, 0x2d, 0x0, + 0xd3, 0x0, 0xf0, 0x5, 0xa0, 0x2, 0xd0, 0xd, + 0xca, 0xbf, 0xaa, 0xca, 0x0, 0x2d, 0x0, 0x12, + 0x22, 0x22, 0x22, 0x10, 0x2, 0xd1, 0x41, 0xee, + 0xee, 0xee, 0xe1, 0x0, 0x6f, 0xfa, 0x1e, 0x0, + 0x0, 0xe, 0x12, 0xed, 0x71, 0x1, 0xfb, 0xbb, + 0xbb, 0xf1, 0x4, 0x0, 0x0, 0x1e, 0x11, 0x11, + 0x1e, 0x10, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0xe1, 0x0, 0x0, 0x0, 0x1f, 0xdd, 0xdd, 0xdf, + 0x10, + + /* U+589E "增" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xa0, 0x0, 0x89, 0x0, 0xc, 0x70, 0x0, + 0x5a, 0x0, 0x0, 0xc1, 0x6, 0xc0, 0x0, 0x5, + 0xa0, 0xf, 0xcc, 0xcf, 0xcc, 0xda, 0x4, 0x8b, + 0x41, 0xe2, 0x30, 0xd0, 0x45, 0xa1, 0xbd, 0xeb, + 0x3e, 0xb, 0xd, 0x1c, 0x4a, 0x0, 0x5a, 0x0, + 0xe0, 0x63, 0xd7, 0x23, 0xa0, 0x5, 0xa0, 0xf, + 0x88, 0x8e, 0x88, 0xaa, 0x0, 0x5a, 0x0, 0x22, + 0x22, 0x22, 0x22, 0x20, 0x5, 0xa0, 0x1, 0xdd, + 0xdd, 0xdd, 0xc0, 0x0, 0x5b, 0x84, 0x1e, 0x0, + 0x0, 0x1e, 0x1, 0x8d, 0xd7, 0x11, 0xfb, 0xbb, + 0xbb, 0xe0, 0x1a, 0x40, 0x0, 0x1e, 0x11, 0x11, + 0x3e, 0x0, 0x0, 0x0, 0x1, 0xfa, 0xaa, 0xab, + 0xe0, 0x0, 0x0, 0x0, 0x1f, 0x33, 0x33, 0x4e, + 0x0, + + /* U+58CA "壊" */ + 0x0, 0x77, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x77, 0xe, 0xee, 0xef, 0xee, 0xee, 0xc0, + 0x0, 0x77, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x4, 0xa9, 0x34, 0xbb, 0xbf, 0xcb, 0xbb, 0x20, + 0x1b, 0xdd, 0xa6, 0x91, 0xb1, 0x59, 0x1d, 0x30, + 0x0, 0x77, 0x6, 0x80, 0xb0, 0x49, 0xc, 0x30, + 0x0, 0x77, 0x4, 0xbb, 0xbd, 0xbb, 0xbb, 0x20, + 0x0, 0x77, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x77, 0x2e, 0xee, 0xff, 0xee, 0xee, 0xd0, + 0x0, 0x8d, 0xe1, 0x4, 0xda, 0x90, 0x29, 0x0, + 0x2b, 0xf8, 0x11, 0x9f, 0x30, 0xe7, 0xd4, 0x0, + 0x27, 0x10, 0x8e, 0x7e, 0x10, 0x3f, 0x60, 0x0, + 0x0, 0x0, 0x31, 0xe, 0x14, 0x84, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xe9, 0x40, 0x2a, 0xd0, + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + + /* U+58D3 "壓" */ + 0x0, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xc0, + 0x0, 0xe0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0xe1, 0xe8, 0x88, 0xd0, 0xb, 0x3b, 0x0, + 0x0, 0xe1, 0xd7, 0x77, 0xd0, 0xb, 0x14, 0x60, + 0x0, 0xe1, 0xa9, 0x99, 0x99, 0xdf, 0xed, 0xc0, + 0x0, 0xe4, 0xa9, 0x99, 0xb0, 0xe, 0x90, 0x0, + 0x1, 0xe6, 0xc8, 0x88, 0xe0, 0x2b, 0xd1, 0x0, + 0x1, 0xd6, 0xa5, 0x55, 0xd0, 0x95, 0x78, 0x0, + 0x2, 0xc6, 0xa4, 0x44, 0xe6, 0xb0, 0xd, 0x70, + 0x3, 0xb4, 0x60, 0x4a, 0x87, 0x0, 0x1, 0xa0, + 0x5, 0x90, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, + 0x8, 0x60, 0xcc, 0xcc, 0xdf, 0xcc, 0xcc, 0x0, + 0xd, 0x20, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x1b, 0x2c, 0xcc, 0xcc, 0xdf, 0xcc, 0xcc, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+58EB "士" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x1a, 0x91, 0x11, 0x11, 0x10, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + + /* U+58F0 "声" */ + 0x0, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, + 0xde, 0xee, 0xee, 0xff, 0xee, 0xee, 0xeb, 0x0, + 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, 0x0, 0x3, + 0x33, 0x33, 0xb8, 0x33, 0x33, 0x30, 0x0, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xee, + 0xef, 0xfe, 0xee, 0xfb, 0x0, 0x9, 0x70, 0x0, + 0xa6, 0x0, 0x5, 0xb0, 0x0, 0xa6, 0x0, 0xa, + 0x60, 0x0, 0x5b, 0x0, 0xc, 0xed, 0xdd, 0xfe, + 0xdd, 0xde, 0xb0, 0x0, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x30, 0xa, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+58F2 "売" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xee, 0xee, 0xee, 0xee, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x70, + 0x7, 0x90, 0x0, 0x0, 0x0, 0x0, 0x9, 0x70, + 0x7, 0x80, 0x9, 0x40, 0x9, 0x40, 0x9, 0x70, + 0x0, 0x0, 0xe, 0x30, 0xb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x0, 0xb, 0x50, 0x0, 0x10, + 0x0, 0x0, 0xb8, 0x0, 0xb, 0x50, 0x0, 0xe0, + 0x0, 0x2c, 0xc1, 0x0, 0xb, 0x60, 0x1, 0xe0, + 0xc, 0xf8, 0x0, 0x0, 0x6, 0xff, 0xff, 0x70, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5909 "変" */ + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x4, 0xc0, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x8, 0x74, 0xc0, 0xa, 0x68, 0x70, 0x0, + 0x0, 0x2e, 0x14, 0xc0, 0xa, 0x60, 0xc8, 0x0, + 0x2, 0xe4, 0x4, 0xc0, 0xa, 0x60, 0x1d, 0x60, + 0x4, 0x50, 0x3, 0xb0, 0x8, 0x40, 0x2, 0x40, + 0x0, 0x0, 0x4, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xee, 0xee, 0xef, 0x60, 0x0, + 0x0, 0x2b, 0xcd, 0x10, 0x0, 0x7d, 0x0, 0x0, + 0x6, 0xd5, 0x5, 0xd2, 0x9, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xea, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x5a, 0xea, 0x9e, 0xb6, 0x20, 0x0, + 0xb, 0xed, 0xa5, 0x0, 0x0, 0x5a, 0xdf, 0xd1, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + + /* U+590F "夏" */ + 0xd, 0xee, 0xee, 0xef, 0xee, 0xee, 0xee, 0x80, + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xbb, 0xbe, 0xbb, 0xbb, 0xc0, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x5e, 0xbb, 0xbb, 0xbb, 0xbb, 0xf0, 0x0, + 0x0, 0x5b, 0x22, 0x22, 0x22, 0x22, 0xf0, 0x0, + 0x0, 0x5e, 0x99, 0x99, 0x99, 0x99, 0xf0, 0x0, + 0x0, 0x5d, 0x77, 0x77, 0x77, 0x77, 0xf0, 0x0, + 0x0, 0x12, 0x4e, 0x82, 0x22, 0x23, 0x20, 0x0, + 0x0, 0x4, 0xee, 0xcc, 0xcc, 0xdf, 0x40, 0x0, + 0x6, 0xda, 0x5d, 0x30, 0x2, 0xd8, 0x0, 0x0, + 0x18, 0x20, 0x2, 0xd9, 0x9d, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x48, 0xdd, 0xec, 0x84, 0x0, 0x0, + 0x4c, 0xed, 0xa6, 0x10, 0x3, 0x8c, 0xee, 0xc1, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, + + /* U+5915 "夕" */ + 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x4, 0xf4, 0x11, + 0x11, 0x17, 0xd0, 0x0, 0x3f, 0x50, 0x0, 0x0, + 0xc, 0x80, 0x5, 0xf7, 0x21, 0x0, 0x0, 0x3f, + 0x10, 0x5f, 0x40, 0x7e, 0x50, 0x0, 0xc9, 0x0, + 0x2, 0x0, 0x3, 0xda, 0x7, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xdf, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xd7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5916 "外" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0xb, 0x60, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0x32, 0xe0, 0x0, 0x0, + 0x0, 0x6b, 0x0, 0x1f, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0x3d, 0x2, 0xf6, 0x0, 0x0, + 0x7, 0xb1, 0x0, 0x79, 0x2, 0xfc, 0xa0, 0x0, + 0x1e, 0x4e, 0x50, 0xd5, 0x2, 0xe0, 0xad, 0x10, + 0x1, 0x2, 0xcb, 0xd0, 0x2, 0xe0, 0x9, 0xd1, + 0x0, 0x0, 0xe, 0x60, 0x2, 0xe0, 0x0, 0x70, + 0x0, 0x0, 0x7e, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x4e, 0x70, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x8, 0xf7, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x1b, 0x30, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + + /* U+591A "多" */ + 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x3, + 0xca, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xa, 0xe5, + 0x82, 0x0, 0x7d, 0x10, 0x0, 0x0, 0x30, 0x5, + 0xe6, 0xbb, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xf7, 0x49, 0x0, 0x0, 0x0, 0x15, 0xae, 0x81, + 0x3f, 0x82, 0x22, 0x20, 0x7f, 0xb6, 0x0, 0x5e, + 0xcc, 0xcc, 0xed, 0x0, 0x0, 0x1, 0xbc, 0x20, + 0x0, 0x2f, 0x40, 0x0, 0x2a, 0xe7, 0x64, 0x0, + 0x2d, 0x70, 0x0, 0x4, 0x70, 0x3, 0xe7, 0x5e, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x14, 0x9e, 0xc6, 0x0, 0x0, + 0x0, 0x6b, 0xef, 0xc8, 0x20, 0x0, 0x0, 0x0, + 0x3, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+591C "夜" */ + 0x0, 0x0, 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0xc, 0xcc, 0xcc, 0xcd, 0xfd, 0xcc, 0xcc, 0xc0, + 0x3, 0x33, 0xa8, 0x33, 0x4d, 0x33, 0x33, 0x30, + 0x0, 0x1, 0xf2, 0x0, 0x8a, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xa0, 0x2, 0xfe, 0xee, 0xee, 0x60, + 0x0, 0x3f, 0x30, 0xb, 0x83, 0x10, 0x1e, 0x20, + 0x1, 0xef, 0x20, 0x8f, 0xa, 0x90, 0x5b, 0x0, + 0x1d, 0x8e, 0x27, 0xda, 0x70, 0xa5, 0xc5, 0x0, + 0x39, 0xe, 0x29, 0x10, 0xd2, 0x7, 0xb0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x4d, 0x5d, 0x10, 0x0, + 0x0, 0xe, 0x20, 0x0, 0xb, 0xf4, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x1, 0xad, 0x9e, 0x40, 0x0, + 0x0, 0xe, 0x22, 0x8e, 0x90, 0x4, 0xeb, 0x40, + 0x0, 0xe, 0x2c, 0x92, 0x0, 0x0, 0x7, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5920 "夠" */ + 0x0, 0x0, 0x50, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x7, 0xa0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x2f, 0xed, 0xd4, 0xc, 0x50, 0x0, 0x0, + 0x3, 0xe4, 0x2, 0xe0, 0x2f, 0xee, 0xee, 0xf3, + 0xc, 0x66, 0xb, 0x70, 0xb6, 0x0, 0x0, 0xc3, + 0x0, 0xb, 0xcb, 0x5, 0xd0, 0x0, 0x0, 0xc3, + 0x0, 0x7, 0xd3, 0x8, 0x4f, 0xee, 0xe0, 0xd2, + 0x5, 0xd8, 0xa7, 0x0, 0xd, 0x0, 0xe0, 0xd2, + 0x3, 0x28, 0xfe, 0xee, 0xd, 0x0, 0xe0, 0xe2, + 0x2, 0xcb, 0x0, 0x88, 0xd, 0x0, 0xe0, 0xe1, + 0xc, 0x78, 0x52, 0xf2, 0xf, 0xaa, 0xe0, 0xf0, + 0x0, 0x2, 0xee, 0x70, 0xe, 0x33, 0x20, 0xf0, + 0x0, 0x0, 0xab, 0x0, 0xc, 0x0, 0x2, 0xe0, + 0x0, 0x5d, 0x80, 0x0, 0x0, 0x0, 0x7, 0xb0, + 0xc, 0xb3, 0x0, 0x0, 0x0, 0xb, 0xfe, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5927 "大" */ + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0x11, 0x11, 0x3f, 0xf3, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x6c, 0xb7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb7, 0x4d, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf1, 0xd, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x80, 0x4, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0xad, 0x0, 0x0, 0x9d, 0x10, 0x0, + 0x0, 0x9, 0xe1, 0x0, 0x0, 0xb, 0xd1, 0x0, + 0x4, 0xdc, 0x20, 0x0, 0x0, 0x0, 0xbf, 0x60, + 0x1d, 0x70, 0x0, 0x0, 0x0, 0x0, 0x6, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5929 "天" */ + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x1c, 0x71, 0x11, 0x11, 0x10, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x2f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0x98, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf3, 0x1e, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x80, 0x6, 0xd1, 0x0, 0x0, + 0x0, 0x2, 0xda, 0x0, 0x0, 0xad, 0x20, 0x0, + 0x1, 0x8f, 0x80, 0x0, 0x0, 0x8, 0xf7, 0x10, + 0x1e, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xf2, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+592A "太" */ + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x1c, 0x71, 0x11, 0x11, 0x10, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x1f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x89, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf2, 0xc, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x90, 0x3, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xb1, 0x0, 0x9c, 0x10, 0x0, + 0x0, 0x6, 0xf4, 0xad, 0x10, 0xc, 0xc0, 0x0, + 0x2, 0xbe, 0x30, 0x9, 0xd1, 0x0, 0xcd, 0x40, + 0x1f, 0x91, 0x0, 0x0, 0xa6, 0x0, 0x8, 0xf3, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+592B "夫" */ + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x11, 0x11, 0x1a, 0x81, 0x11, 0x11, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, + 0x2, 0x33, 0x33, 0x3c, 0x83, 0x33, 0x33, 0x30, + 0xd, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xd0, + 0x0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xf2, 0x2f, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x40, 0x4, 0xf5, 0x0, 0x0, + 0x0, 0x4c, 0xd3, 0x0, 0x0, 0x4e, 0xb3, 0x0, + 0x1d, 0xe8, 0x0, 0x0, 0x0, 0x1, 0x9f, 0xe2, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+592E "央" */ + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x11, 0x1a, 0x81, 0x11, 0x10, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x5a, 0x0, 0x9, 0x70, 0x0, 0x97, 0x0, + 0x0, 0x5a, 0x0, 0xa, 0x70, 0x0, 0x97, 0x0, + 0x0, 0x5a, 0x0, 0xb, 0x60, 0x0, 0x97, 0x0, + 0x0, 0x5a, 0x0, 0xc, 0x50, 0x0, 0x97, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x1, 0x11, 0x11, 0x6e, 0xd5, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x0, 0xc7, 0x5c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xd0, 0xb, 0x90, 0x0, 0x0, + 0x0, 0x1, 0xae, 0x20, 0x1, 0xda, 0x10, 0x0, + 0x1, 0x7e, 0xb1, 0x0, 0x0, 0x1a, 0xe7, 0x20, + 0x1e, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5931 "失" */ + 0x0, 0x3, 0x90, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x70, 0xa, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xdc, 0xce, 0xec, 0xcc, 0xca, 0x0, + 0x0, 0x99, 0x44, 0x4b, 0xa4, 0x44, 0x43, 0x0, + 0x4, 0xe0, 0x0, 0xa, 0x70, 0x0, 0x0, 0x0, + 0xb, 0x60, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, + 0x2, 0x21, 0x11, 0x1c, 0x71, 0x11, 0x11, 0x10, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x4e, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc8, 0x5c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xd1, 0xc, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x9e, 0x30, 0x1, 0xe9, 0x0, 0x0, + 0x0, 0x5d, 0xc1, 0x0, 0x0, 0x2c, 0xd5, 0x0, + 0x1e, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xf3, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+5947 "奇" */ + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x4, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x60, + 0x0, 0x0, 0x0, 0x4f, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xe8, 0xae, 0x92, 0x0, 0x0, + 0x1, 0x47, 0xcd, 0x40, 0x1, 0x7e, 0xc5, 0x0, + 0x5, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x69, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0x6e, 0xee, 0xee, 0xc0, 0x2, 0xe0, 0x0, + 0x0, 0x78, 0x0, 0x2, 0xd0, 0x2, 0xe0, 0x0, + 0x0, 0x78, 0x0, 0x2, 0xd0, 0x2, 0xe0, 0x0, + 0x0, 0x7e, 0xbb, 0xbc, 0xd0, 0x2, 0xe0, 0x0, + 0x0, 0x7a, 0x22, 0x22, 0x20, 0x3, 0xe0, 0x0, + 0x0, 0x22, 0x0, 0x0, 0x1f, 0xfe, 0x90, 0x0, + + /* U+5951 "契" */ + 0x0, 0x2, 0xd0, 0x0, 0xff, 0xff, 0xff, 0xc0, + 0xc, 0xde, 0xfd, 0xd6, 0x0, 0xd2, 0x4, 0xb0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0xf0, 0x4, 0xb0, + 0x7, 0xde, 0xfd, 0xd3, 0x3, 0xd0, 0x5, 0xa0, + 0x0, 0x2, 0xd0, 0x0, 0xa, 0x70, 0x6, 0x90, + 0x6, 0x67, 0xe6, 0x63, 0x5e, 0x0, 0x7, 0x80, + 0x8, 0x8a, 0xe8, 0x9e, 0xe3, 0x1, 0x1b, 0x60, + 0x0, 0x2, 0xd0, 0xa, 0x40, 0x9, 0xdb, 0x10, + 0x0, 0x1, 0x50, 0xc, 0x50, 0x0, 0x0, 0x0, + 0xe, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe0, + 0x0, 0x0, 0x0, 0x9a, 0xa9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xe1, 0x1d, 0x70, 0x0, 0x0, + 0x0, 0x27, 0xdb, 0x10, 0x1, 0xbd, 0x83, 0x0, + 0x2e, 0xc8, 0x20, 0x0, 0x0, 0x3, 0x9d, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5957 "套" */ + 0x0, 0x0, 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x2e, 0x60, 0x3, 0xe3, 0x0, 0x0, + 0x0, 0x2, 0xe8, 0x0, 0x0, 0x4f, 0x50, 0x0, + 0x0, 0x7f, 0xfe, 0xee, 0xee, 0xed, 0xea, 0x10, + 0x1d, 0xc3, 0xd3, 0x0, 0x0, 0x0, 0x1a, 0xf2, + 0x4, 0x0, 0xdd, 0xcc, 0xcc, 0xcb, 0x0, 0x20, + 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdd, 0xcc, 0xcc, 0xcb, 0x0, 0x0, + 0x1, 0x11, 0xd4, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0xdd, 0xd0, + 0x0, 0x1, 0xa8, 0x0, 0x0, 0x6b, 0x0, 0x0, + 0x0, 0x5e, 0xc8, 0x9a, 0xbc, 0xcf, 0xd1, 0x0, + 0x0, 0x47, 0x65, 0x43, 0x21, 0x0, 0x5a, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5973 "女" */ + 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x44, 0x4a, 0xd4, 0x44, 0x44, 0x44, 0x40, + 0xc, 0xcc, 0xdf, 0xdc, 0xcc, 0xdf, 0xcc, 0xc1, + 0x0, 0x0, 0x6d, 0x0, 0x0, 0x7c, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0xc7, 0x0, 0x0, + 0x0, 0x5, 0xe0, 0x0, 0x2, 0xf1, 0x0, 0x0, + 0x0, 0xd, 0xc3, 0x0, 0xb, 0xa0, 0x0, 0x0, + 0x0, 0x2, 0x8e, 0xc5, 0x6e, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xbf, 0x8d, 0xe6, 0x0, 0x0, + 0x0, 0x15, 0xaf, 0xb2, 0x0, 0x6e, 0xd3, 0x0, + 0xd, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x9f, 0x60, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+5979 "她" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0x6a, 0x0, 0x1, 0xd0, 0x1e, 0x0, 0x0, + 0x0, 0x97, 0x0, 0x1, 0xe0, 0x1e, 0x0, 0x20, + 0x2f, 0xff, 0xff, 0x11, 0xe0, 0x1e, 0x8e, 0xc0, + 0x0, 0xe1, 0xf, 0x1, 0xe6, 0xcf, 0x74, 0xc0, + 0x2, 0xd0, 0x2d, 0x5b, 0xf9, 0x5e, 0x3, 0xc0, + 0x6, 0x90, 0x5b, 0x66, 0xe0, 0x1e, 0x3, 0xb0, + 0xa, 0x50, 0x87, 0x1, 0xe0, 0x1e, 0x4, 0xb0, + 0xd, 0xa0, 0xd3, 0x1, 0xe0, 0x1e, 0x5, 0xa0, + 0x1, 0xcd, 0xe0, 0x1, 0xe0, 0x1e, 0x7f, 0x50, + 0x0, 0xc, 0xf3, 0x1, 0xe0, 0x1d, 0x0, 0x0, + 0x0, 0x4f, 0x9f, 0x31, 0xe0, 0x0, 0x0, 0x93, + 0x3, 0xe6, 0x6, 0x20, 0xf2, 0x0, 0x1, 0xd2, + 0x1e, 0x60, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xa0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+597D "好" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0x0, 0x6, 0xee, 0xee, 0xef, 0x80, + 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x6d, 0x10, + 0x4f, 0xff, 0xff, 0xa0, 0x0, 0x4, 0xd2, 0x0, + 0x0, 0xe2, 0x7, 0x80, 0x0, 0x3d, 0x10, 0x0, + 0x2, 0xe0, 0xa, 0x50, 0x0, 0x5b, 0x0, 0x0, + 0x6, 0x90, 0xd, 0x4c, 0xcc, 0xdf, 0xcc, 0xc4, + 0xb, 0x60, 0x3e, 0x3, 0x33, 0x8c, 0x33, 0x31, + 0x7, 0xf6, 0x98, 0x0, 0x0, 0x5b, 0x0, 0x0, + 0x0, 0x3d, 0xf2, 0x0, 0x0, 0x5b, 0x0, 0x0, + 0x0, 0xa, 0xfc, 0x10, 0x0, 0x5b, 0x0, 0x0, + 0x0, 0x7d, 0x1c, 0xb0, 0x0, 0x5b, 0x0, 0x0, + 0x9, 0xe2, 0x0, 0x30, 0x0, 0x6b, 0x0, 0x0, + 0x4b, 0x10, 0x0, 0x0, 0x9f, 0xe6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5982 "如" */ + 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x29, 0x99, 0x99, 0x90, 0x0, + 0xb6, 0x0, 0x3, 0xd6, 0x66, 0x7f, 0xf, 0xff, + 0xff, 0xfc, 0x3c, 0x0, 0x1, 0xf0, 0x2, 0xe0, + 0x6, 0xa3, 0xc0, 0x0, 0x1f, 0x0, 0x5a, 0x0, + 0x98, 0x3c, 0x0, 0x1, 0xf0, 0x9, 0x70, 0xc, + 0x53, 0xc0, 0x0, 0x1f, 0x0, 0xe2, 0x0, 0xf1, + 0x3c, 0x0, 0x1, 0xf0, 0x1e, 0x80, 0x6b, 0x3, + 0xc0, 0x0, 0x1f, 0x0, 0x2c, 0xcc, 0x50, 0x3c, + 0x0, 0x1, 0xf0, 0x0, 0xb, 0xf3, 0x3, 0xc0, + 0x0, 0x1f, 0x0, 0x3, 0xfa, 0xf3, 0x3c, 0x22, + 0x23, 0xf0, 0x6, 0xf6, 0x7, 0x83, 0xfd, 0xdd, + 0xdf, 0xb, 0xe4, 0x0, 0x0, 0x3c, 0x0, 0x0, + 0x90, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5987 "妇" */ + 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6a, 0x0, 0xd, 0xdd, 0xdd, 0xdd, 0x20, 0x9, + 0x80, 0x0, 0x22, 0x22, 0x22, 0xe2, 0x5f, 0xff, + 0xff, 0x30, 0x0, 0x0, 0xd, 0x20, 0xf, 0x10, + 0xe1, 0x0, 0x0, 0x0, 0xd2, 0x3, 0xd0, 0xf, + 0x0, 0x0, 0x0, 0xd, 0x20, 0x79, 0x3, 0xc0, + 0x9f, 0xff, 0xff, 0xf2, 0xc, 0x50, 0x88, 0x0, + 0x11, 0x11, 0x1e, 0x20, 0xae, 0x4d, 0x30, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x5e, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0xde, 0x80, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x9a, 0x1d, 0x40, 0x0, 0x0, + 0xe, 0x20, 0xac, 0x0, 0x12, 0xff, 0xff, 0xff, + 0xf2, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x20, + + /* U+59B3 "妳" */ + 0x0, 0x4, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x89, 0x0, 0x0, 0xee, 0xcc, 0xcc, 0xd4, + 0x4f, 0xff, 0xff, 0x27, 0xc2, 0x4e, 0x23, 0xe2, + 0x0, 0xd2, 0xe, 0x1e, 0x30, 0x1e, 0x2, 0xd0, + 0x1, 0xe0, 0x1e, 0x28, 0x0, 0x1e, 0x3, 0x50, + 0x5, 0x90, 0x3c, 0x0, 0x69, 0x1e, 0xe, 0x10, + 0xa, 0x50, 0x78, 0x0, 0xb5, 0x1e, 0x8, 0x80, + 0x9, 0xc2, 0xc3, 0x0, 0xe1, 0x1e, 0x2, 0xe0, + 0x0, 0x7e, 0xe0, 0x7, 0xa0, 0x1e, 0x0, 0xd3, + 0x0, 0xb, 0xf3, 0xb, 0x30, 0x1e, 0x0, 0x97, + 0x0, 0x6d, 0x6e, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x6, 0xf3, 0x1, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x1d, 0x30, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+59B9 "妹" */ + 0x0, 0x3b, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x29, 0x99, 0xfa, 0x99, 0x60, + 0x2f, 0xff, 0xff, 0x15, 0x55, 0xf7, 0x55, 0x40, + 0x0, 0xe0, 0x1e, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x2, 0xd0, 0x3c, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x6, 0x90, 0x6a, 0xae, 0xee, 0xff, 0xee, 0xe2, + 0xa, 0x50, 0xa6, 0x0, 0x8, 0xfd, 0x0, 0x0, + 0x8, 0xe4, 0xe1, 0x0, 0x1e, 0xfc, 0x60, 0x0, + 0x0, 0x5e, 0xd0, 0x0, 0xa6, 0xe4, 0xd1, 0x0, + 0x0, 0xd, 0xf7, 0x5, 0xd0, 0xe2, 0x7b, 0x0, + 0x0, 0x8b, 0x1b, 0x4e, 0x20, 0xe2, 0xb, 0xa0, + 0x9, 0xe1, 0x0, 0xc4, 0x0, 0xe2, 0x0, 0x91, + 0x2b, 0x10, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, + + /* U+59BB "妻" */ + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xb, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0x90, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0xdd, 0xde, 0xed, 0xdd, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0xb5, 0x0, + 0x2d, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xfe, 0xd2, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0xb5, 0x0, + 0x0, 0x7d, 0xdd, 0xef, 0xdd, 0xdd, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xdd, 0xef, 0xed, 0xdd, 0xef, 0xed, 0xd1, + 0x0, 0x0, 0x9a, 0x0, 0x0, 0x9a, 0x0, 0x0, + 0x0, 0x3, 0xbd, 0xb7, 0x5c, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0xaf, 0xcd, 0xc8, 0x40, 0x0, + 0xd, 0xee, 0xca, 0x62, 0x0, 0x16, 0xbe, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+59C9 "姉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x6d, 0xdd, 0xfd, 0xdd, 0xd5, + 0x5f, 0xff, 0xff, 0x11, 0x11, 0xe2, 0x11, 0x10, + 0x0, 0xf0, 0xe, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x3, 0xc0, 0x3c, 0x2f, 0xff, 0xff, 0xff, 0xe0, + 0x6, 0x80, 0x5a, 0x2d, 0x11, 0xe2, 0x12, 0xe0, + 0xa, 0x50, 0x97, 0x2d, 0x0, 0xe1, 0x1, 0xe0, + 0xa, 0xb0, 0xd2, 0x2d, 0x0, 0xe1, 0x1, 0xe0, + 0x0, 0x9e, 0xd0, 0x2d, 0x0, 0xe1, 0x1, 0xe0, + 0x0, 0xc, 0xe1, 0x2d, 0x0, 0xe1, 0x1, 0xe0, + 0x0, 0x6d, 0x7d, 0x3d, 0x0, 0xe1, 0xbf, 0xb0, + 0x6, 0xe3, 0x5, 0x2, 0x0, 0xe1, 0x0, 0x0, + 0x1c, 0x20, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+59CB "始" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x6, 0xc0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0xe, 0x50, 0x0, 0x0, + 0x0, 0x88, 0x0, 0x0, 0x6c, 0x1, 0xb0, 0x0, + 0x4f, 0xff, 0xff, 0x21, 0xe3, 0x0, 0xa7, 0x0, + 0x0, 0xe1, 0xe, 0xa, 0x70, 0x0, 0x1e, 0x20, + 0x1, 0xd0, 0x1e, 0x7f, 0xcc, 0xde, 0xff, 0xa0, + 0x5, 0xa0, 0x3c, 0x46, 0x53, 0x21, 0x0, 0xc1, + 0x9, 0x60, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xa0, 0xb4, 0xc, 0xfe, 0xee, 0xef, 0x30, + 0x0, 0x9d, 0xe0, 0xc, 0x30, 0x0, 0xc, 0x30, + 0x0, 0xa, 0xf3, 0xc, 0x30, 0x0, 0xc, 0x30, + 0x0, 0x3e, 0x7e, 0x2c, 0x30, 0x0, 0xc, 0x30, + 0x2, 0xd3, 0x6, 0x2c, 0x63, 0x33, 0x3d, 0x30, + 0x1b, 0x20, 0x0, 0xc, 0xcb, 0xbb, 0xbe, 0x30, + + /* U+59D0 "姐" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0x0, 0xe, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x5a, 0x0, 0xe, 0x10, 0x0, 0x2e, 0x0, + 0x17, 0xbb, 0x77, 0xe, 0x10, 0x0, 0x2e, 0x0, + 0x1a, 0xeb, 0xaf, 0xe, 0x10, 0x0, 0x2e, 0x0, + 0x0, 0xe1, 0x1e, 0xe, 0xcc, 0xcc, 0xde, 0x0, + 0x1, 0xe0, 0x3c, 0xe, 0x43, 0x33, 0x5e, 0x0, + 0x4, 0xb0, 0x5a, 0xe, 0x10, 0x0, 0x2e, 0x0, + 0x8, 0x80, 0x87, 0xe, 0x10, 0x0, 0x2e, 0x0, + 0xb, 0x80, 0xc3, 0xe, 0x54, 0x44, 0x6e, 0x0, + 0x1, 0xd9, 0xe0, 0xe, 0xbb, 0xbb, 0xce, 0x0, + 0x0, 0xd, 0xc0, 0xe, 0x10, 0x0, 0x2e, 0x0, + 0x0, 0x2e, 0xd8, 0xe, 0x10, 0x0, 0x2e, 0x0, + 0x1, 0xc7, 0x18, 0x1e, 0x20, 0x0, 0x3e, 0x0, + 0xd, 0x90, 0x8, 0xee, 0xee, 0xee, 0xee, 0xe5, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+59D4 "委" */ + 0x0, 0x0, 0x12, 0x34, 0x57, 0x8b, 0xd2, 0x0, + 0x0, 0xbd, 0xcc, 0xbd, 0xc7, 0x53, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0xd, 0xee, 0xee, 0xff, 0xff, 0xfe, 0xee, 0xe3, + 0x0, 0x0, 0x1a, 0xc9, 0x9a, 0xb2, 0x0, 0x0, + 0x0, 0x16, 0xe7, 0x7, 0x90, 0x5e, 0x93, 0x0, + 0xa, 0xd7, 0x10, 0x4a, 0x80, 0x0, 0x5b, 0xe3, + 0x3, 0x0, 0x1, 0xe3, 0x0, 0x0, 0x0, 0x20, + 0x1e, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xee, 0xe6, + 0x0, 0x0, 0x9b, 0x0, 0x0, 0x9b, 0x0, 0x0, + 0x0, 0x6, 0xf7, 0x20, 0x6, 0xe2, 0x0, 0x0, + 0x0, 0x1, 0x58, 0xce, 0xcf, 0x60, 0x0, 0x0, + 0x0, 0x12, 0x48, 0xde, 0x88, 0xce, 0xa5, 0x0, + 0xa, 0xfd, 0xa7, 0x30, 0x0, 0x1, 0x6b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5A18 "娘" */ + 0x0, 0x18, 0x0, 0x0, 0x2, 0x70, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x6a, 0x0, 0xb, 0xcc, 0xfe, 0xcc, 0x10, + 0x4, 0xaa, 0x43, 0xe, 0x32, 0x22, 0x2e, 0x10, + 0xc, 0xfd, 0xdd, 0xe, 0x10, 0x0, 0xe, 0x10, + 0x0, 0xe1, 0x4b, 0xe, 0xee, 0xee, 0xef, 0x10, + 0x1, 0xe0, 0x6a, 0xe, 0x10, 0x0, 0xe, 0x10, + 0x5, 0xa0, 0x87, 0xe, 0x10, 0x0, 0xe, 0x10, + 0xa, 0x60, 0xb4, 0xe, 0xff, 0xff, 0xff, 0x10, + 0xb, 0x90, 0xe0, 0xe, 0x10, 0xe1, 0x1, 0x30, + 0x0, 0xbd, 0xb0, 0xe, 0x10, 0x98, 0x4d, 0x50, + 0x0, 0xe, 0xc0, 0xe, 0x10, 0x1e, 0xc2, 0x0, + 0x0, 0x6d, 0xb9, 0xe, 0x10, 0x6, 0xd1, 0x0, + 0x4, 0xe3, 0x18, 0xf, 0x8c, 0xb0, 0x7e, 0x50, + 0x1e, 0x40, 0x0, 0x5f, 0x93, 0x0, 0x4, 0xb1, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+5A5A "婚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x2e, 0x0, 0xd, 0xcb, 0xcc, 0x52, 0x0, + 0x0, 0x5b, 0x0, 0xe, 0x10, 0x5a, 0x0, 0x0, + 0x0, 0x88, 0x0, 0xe, 0x20, 0x3c, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xe, 0xdd, 0xdf, 0xdd, 0xd1, + 0x0, 0xe2, 0x1e, 0xe, 0x10, 0xa, 0x50, 0x0, + 0x2, 0xe0, 0x3c, 0xf, 0x23, 0x44, 0xd0, 0x53, + 0x6, 0xb0, 0x5a, 0x5f, 0xfb, 0x60, 0xac, 0xc3, + 0xa, 0x70, 0x96, 0x23, 0x0, 0x0, 0x6, 0x70, + 0x8, 0xc1, 0xd2, 0xb, 0xfe, 0xee, 0xef, 0x10, + 0x0, 0x4e, 0xe0, 0xb, 0x30, 0x0, 0xe, 0x10, + 0x0, 0xc, 0xf8, 0xb, 0xdd, 0xdd, 0xdf, 0x10, + 0x0, 0x6c, 0x2f, 0x4b, 0x30, 0x0, 0xe, 0x10, + 0x3, 0xd2, 0x3, 0xb, 0x41, 0x11, 0x1e, 0x10, + 0x1b, 0x10, 0x0, 0xb, 0xdc, 0xcc, 0xcf, 0x10, + + /* U+5A66 "婦" */ + 0x0, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0xc, 0xdd, 0xdd, 0xdf, 0x10, + 0x0, 0x77, 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, + 0x1, 0xa6, 0x11, 0x8, 0xcc, 0xcc, 0xcf, 0x10, + 0x1e, 0xfe, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x10, + 0x0, 0xe0, 0x49, 0xd, 0xdd, 0xdd, 0xdd, 0x10, + 0x1, 0xd0, 0x77, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x90, 0x95, 0xad, 0xdd, 0xfd, 0xdd, 0xf2, + 0xa, 0x50, 0xd2, 0xa3, 0x0, 0xe1, 0x0, 0xd2, + 0xa, 0x82, 0xd0, 0x4d, 0xdd, 0xfd, 0xdd, 0x91, + 0x0, 0x9e, 0x90, 0xe, 0x31, 0xe3, 0x1b, 0x40, + 0x0, 0xe, 0xd1, 0xe, 0x10, 0xe1, 0xa, 0x40, + 0x0, 0x8a, 0x8c, 0xe, 0x10, 0xe1, 0xb, 0x40, + 0x7, 0xe1, 0x8, 0xe, 0x10, 0xe2, 0xde, 0x20, + 0x1b, 0x10, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + + /* U+5A92 "媒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0x0, 0x1, 0xe0, 0x0, 0x1e, 0x0, + 0x0, 0x68, 0x0, 0x9d, 0xfd, 0xdd, 0xdf, 0xd5, + 0x2, 0xa7, 0x21, 0x2, 0xe1, 0x11, 0x2e, 0x10, + 0x1f, 0xff, 0xfd, 0x1, 0xe0, 0x0, 0x1e, 0x0, + 0x1, 0xe2, 0x4c, 0x1, 0xfd, 0xdd, 0xee, 0x0, + 0x1, 0xd0, 0x5a, 0x1, 0xe0, 0x0, 0x1e, 0x0, + 0x4, 0xa0, 0x78, 0x1, 0xfe, 0xee, 0xee, 0x0, + 0x8, 0x60, 0xa5, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0xc, 0x60, 0xe1, 0x12, 0x22, 0xe3, 0x22, 0x20, + 0x2, 0xda, 0xc0, 0x8c, 0xce, 0xff, 0xdc, 0xc5, + 0x0, 0x1e, 0xb0, 0x0, 0x2c, 0xfc, 0x90, 0x0, + 0x0, 0x6d, 0xaa, 0x3, 0xd2, 0xe2, 0xba, 0x0, + 0x6, 0xe2, 0x5, 0x9d, 0x30, 0xe1, 0x8, 0xe5, + 0x1b, 0x20, 0x0, 0x60, 0x0, 0xe1, 0x0, 0x32, + + /* U+5ABD "媽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x87, 0x0, 0x2e, 0x0, 0x69, 0x0, 0x0, + 0x0, 0xb5, 0x0, 0x2e, 0x33, 0x8a, 0x33, 0x10, + 0x1e, 0xff, 0xff, 0x2f, 0xaa, 0xdd, 0xaa, 0x40, + 0x0, 0xf0, 0x1e, 0x2e, 0x0, 0x69, 0x0, 0x0, + 0x3, 0xc0, 0x3c, 0x2f, 0xee, 0xff, 0xee, 0x50, + 0x6, 0x90, 0x59, 0x2e, 0x0, 0x69, 0x0, 0x0, + 0xa, 0x60, 0x96, 0x2e, 0x0, 0x69, 0x0, 0x0, + 0xa, 0x80, 0xd1, 0x2e, 0xee, 0xee, 0xee, 0xf0, + 0x0, 0xab, 0xd0, 0x2, 0x0, 0x10, 0x40, 0xf0, + 0x0, 0xd, 0xc0, 0x59, 0x65, 0xa2, 0xa3, 0xe0, + 0x0, 0x5d, 0xa9, 0xa5, 0x58, 0x58, 0x14, 0xd0, + 0x6, 0xe2, 0x3, 0xe0, 0x36, 0x1, 0x6, 0xa0, + 0x1c, 0x20, 0x0, 0x0, 0x0, 0x7, 0xee, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5ACC "嫌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, 0x0, 0xc1, 0x0, 0x2c, 0x0, 0x0, + 0xb4, 0x0, 0x5, 0xa0, 0xb, 0x50, 0x0, 0x2e, + 0x32, 0x4e, 0xee, 0xee, 0xfe, 0xe9, 0x3c, 0xfb, + 0xe4, 0x0, 0xf0, 0x1d, 0x0, 0x0, 0x3b, 0xb, + 0x4d, 0xdf, 0xde, 0xfd, 0xd0, 0x6, 0x80, 0xd1, + 0x0, 0xf0, 0x1d, 0xd, 0x0, 0x95, 0xe, 0x6c, + 0xcf, 0xcc, 0xfc, 0xfb, 0xd, 0x12, 0xc1, 0x11, + 0xf1, 0x3e, 0x1e, 0x11, 0xf2, 0x68, 0x0, 0xf, + 0x1, 0xe0, 0xe0, 0x4, 0xdc, 0x42, 0xde, 0xfd, + 0xdf, 0xed, 0x0, 0x4, 0xf5, 0x0, 0xcf, 0x1, + 0xfa, 0x0, 0x0, 0xb8, 0xd4, 0x98, 0xf0, 0x1d, + 0x96, 0x0, 0xaa, 0x2, 0xbb, 0xf, 0x1, 0xd0, + 0xc7, 0x48, 0x0, 0x6, 0x0, 0xf0, 0x1d, 0x0, + 0x40, + + /* U+5B09 "嬉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x78, 0x2, 0xcc, 0xcd, 0xfd, 0xcc, 0xc2, + 0x1, 0xa7, 0x11, 0x23, 0x33, 0xf4, 0x33, 0x20, + 0x1c, 0xfc, 0xda, 0x58, 0x88, 0x88, 0x88, 0x50, + 0x0, 0xe0, 0x58, 0xc, 0xcc, 0xcc, 0xcc, 0x10, + 0x3, 0xc0, 0x77, 0x1e, 0x0, 0x0, 0xe, 0x10, + 0x6, 0x90, 0xa5, 0x1f, 0xbb, 0xbb, 0xbf, 0x10, + 0xa, 0x50, 0xd1, 0x3, 0xa0, 0x0, 0xc2, 0x0, + 0xa, 0xb3, 0xd3, 0x56, 0xe6, 0x57, 0xd5, 0x52, + 0x0, 0x9f, 0x94, 0x77, 0x77, 0x77, 0x77, 0x73, + 0x0, 0xe, 0xc0, 0x2b, 0xbb, 0xbb, 0xbb, 0x40, + 0x0, 0x7a, 0xaa, 0x2d, 0x0, 0x0, 0xa, 0x60, + 0x3, 0xd1, 0x17, 0x2d, 0x0, 0x0, 0xa, 0x60, + 0xb, 0x20, 0x0, 0x2f, 0xcc, 0xcc, 0xce, 0x50, + + /* U+5B50 "子" */ + 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xe5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xe9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x18, 0xa1, 0x11, 0x11, 0x10, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x19, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfd, 0x40, 0x0, 0x0, 0x0, + + /* U+5B57 "字" */ + 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0xae, 0xee, + 0xee, 0xff, 0xee, 0xee, 0xe9, 0xb6, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x8a, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7a, 0x31, 0x4f, 0xff, 0xff, 0xff, + 0xe2, 0x23, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x98, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xd3, 0x0, 0x0, + 0x0, + + /* U+5B58 "存" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x16, 0xd1, 0x11, 0x11, 0x11, 0x10, + 0xe, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xee, 0xe0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd5, 0x2, 0x22, 0x22, 0x22, 0x0, + 0x0, 0x7, 0xc0, 0x3c, 0xcc, 0xcc, 0xfe, 0x0, + 0x0, 0x4f, 0x30, 0x0, 0x0, 0x9, 0xd1, 0x0, + 0x4, 0xff, 0x20, 0x0, 0x1, 0xd8, 0x0, 0x0, + 0x3f, 0x6e, 0x20, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x14, 0xe, 0x2a, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xe, 0x20, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0xa, 0xff, 0x90, 0x0, 0x0, + + /* U+5B63 "季" */ + 0x0, 0x0, 0x12, 0x34, 0x57, 0x9c, 0xc1, 0x0, + 0x0, 0xce, 0xdc, 0xbd, 0xc7, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xe, 0xee, 0xee, 0xff, 0xff, 0xee, 0xee, 0xe1, + 0x0, 0x0, 0x8, 0xda, 0x9c, 0x80, 0x0, 0x0, + 0x0, 0x2, 0xca, 0x19, 0x70, 0xac, 0x30, 0x0, + 0x4, 0xbd, 0x50, 0x5, 0x50, 0x5, 0xdc, 0x50, + 0x1b, 0x55, 0xee, 0xee, 0xee, 0xed, 0x4, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x6c, 0x91, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xb1, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xee, 0x50, 0x0, 0x0, 0x0, + + /* U+5B66 "学" */ + 0x0, 0x3, 0x0, 0x9, 0x0, 0x0, 0x32, 0x0, + 0x0, 0x1e, 0x30, 0xa, 0x80, 0x1, 0xe4, 0x0, + 0x0, 0x5, 0xc0, 0x2, 0xe0, 0xa, 0x80, 0x0, + 0x9, 0xee, 0xfe, 0xee, 0xfe, 0xef, 0xee, 0xc0, + 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xd0, + 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x3, 0xd0, + 0x2, 0x15, 0xee, 0xee, 0xee, 0xff, 0x30, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xe7, 0x0, 0x0, 0x0, + 0x2, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x20, + 0xd, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0xd1, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfd, 0x30, 0x0, 0x0, 0x0, + + /* U+5B69 "孩" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x2, 0x22, 0x22, 0x0, 0x2, 0xf1, 0x0, 0x0, + 0xc, 0xcc, 0xde, 0x10, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0x0, 0x96, 0xbf, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x2, 0xc0, 0x0, 0x1e, 0x20, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x98, 0x0, 0x81, 0x0, + 0x0, 0xe, 0x10, 0x5, 0xd1, 0x28, 0xb0, 0x0, + 0x0, 0xe, 0x13, 0x4f, 0xec, 0xee, 0x10, 0x0, + 0x0, 0x3f, 0xec, 0x0, 0x6, 0xe2, 0xb, 0x30, + 0x4f, 0xcf, 0x30, 0x1, 0x9c, 0x20, 0x8c, 0x0, + 0x12, 0xe, 0x10, 0x6e, 0x90, 0x6, 0xe1, 0x0, + 0x0, 0xe, 0x10, 0x42, 0x0, 0x8f, 0x40, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x3c, 0xb6, 0xe3, 0x0, + 0x0, 0xf, 0x10, 0x4a, 0xe5, 0x0, 0x4e, 0x50, + 0xe, 0xfc, 0x4, 0xd6, 0x0, 0x0, 0x4, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B6B "孫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x1, 0x11, 0x11, 0x0, 0x24, 0x69, 0xce, 0x40, + 0x9, 0xdd, 0xee, 0x3d, 0xbc, 0xd5, 0x20, 0x0, + 0x0, 0x0, 0xa6, 0x0, 0x1d, 0x40, 0x20, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0xc4, 0x3, 0xe2, 0x0, + 0x0, 0xd, 0x20, 0x2d, 0xc9, 0xad, 0x30, 0x0, + 0x0, 0xf, 0x0, 0x17, 0x59, 0xe2, 0x32, 0x0, + 0x0, 0xf, 0x4, 0x0, 0x7b, 0x10, 0x3d, 0x0, + 0x0, 0x4f, 0xe9, 0x3b, 0xe7, 0x8a, 0xbe, 0x90, + 0x2e, 0xbf, 0x0, 0x59, 0x76, 0xf2, 0x10, 0xc0, + 0x1, 0xf, 0x0, 0x6, 0x41, 0xe0, 0x56, 0x0, + 0x0, 0xf, 0x0, 0x1e, 0x11, 0xe0, 0x1e, 0x30, + 0x0, 0xf, 0x0, 0xa8, 0x1, 0xe0, 0x4, 0xc0, + 0x0, 0xf, 0x7, 0xb0, 0x1, 0xe0, 0x0, 0xb3, + 0x6, 0xdb, 0x0, 0x0, 0x7e, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B78 "學" */ + 0x0, 0x0, 0x33, 0x10, 0x32, 0x0, 0x0, 0x0, + 0x0, 0xac, 0x83, 0x5c, 0xd1, 0x9c, 0xce, 0x0, + 0x0, 0xb4, 0x0, 0x6c, 0xb6, 0x0, 0x2d, 0x0, + 0x0, 0xad, 0xc8, 0x70, 0x35, 0x8c, 0xdc, 0x0, + 0x0, 0x9a, 0x65, 0x4c, 0xd1, 0x56, 0x9b, 0x0, + 0x0, 0x8a, 0x43, 0xa8, 0x78, 0x34, 0x99, 0x0, + 0xa, 0xee, 0xdd, 0xdd, 0xdd, 0xdd, 0xee, 0xb0, + 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, 0xd0, + 0xc, 0x32, 0xdd, 0xdd, 0xdd, 0xdd, 0x13, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xd5, 0x0, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe2, + 0x0, 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xde, 0x60, 0x0, 0x0, 0x0, + + /* U+5B83 "它" */ + 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, 0x11, 0x11, + 0x11, 0xd7, 0x11, 0x11, 0x10, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0xd3, 0x52, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x20, 0xc5, 0x0, 0x0, 0x0, 0x10, + 0x20, 0x0, 0xc5, 0x0, 0x0, 0x6d, 0xc0, 0x0, + 0x0, 0xc5, 0x5, 0xaf, 0xb5, 0x0, 0x0, 0x0, + 0xcd, 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0xc7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, + 0x0, 0x0, 0x1, 0x50, 0x0, 0xc5, 0x0, 0x0, + 0x0, 0x4, 0xd0, 0x0, 0xb9, 0x10, 0x0, 0x0, + 0x1a, 0xa0, 0x0, 0x3d, 0xff, 0xff, 0xff, 0xfc, + 0x20, + + /* U+5B85 "宅" */ + 0x0, 0x0, 0x0, 0xa, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, + 0xd, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xb0, + 0xe, 0x41, 0x11, 0x11, 0x11, 0x11, 0x17, 0xb0, + 0xe, 0x20, 0x0, 0x0, 0x27, 0xcc, 0x6, 0xb0, + 0x5, 0x24, 0x69, 0xbe, 0xea, 0x61, 0x2, 0x40, + 0x0, 0xbc, 0x97, 0x8d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0x35, 0x68, 0xac, 0xd0, + 0x16, 0x89, 0xbd, 0xff, 0xdb, 0x97, 0x53, 0x20, + 0x3a, 0x86, 0x53, 0x6d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x1, 0x40, + 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x4, 0xc0, + 0x0, 0x0, 0x0, 0x4e, 0x10, 0x0, 0x19, 0xa0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfd, 0x20, + + /* U+5B87 "宇" */ + 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb8, 0x0, 0x0, 0x0, 0xbe, 0xee, + 0xee, 0xff, 0xee, 0xee, 0xec, 0xc5, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x5d, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3d, 0x62, 0x9e, 0xee, 0xee, 0xee, + 0xea, 0x27, 0x0, 0x1, 0x11, 0x7b, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x7a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xd5, 0x0, 0x0, + 0x0, + + /* U+5B88 "守" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, + 0x2, 0x33, 0x33, 0x38, 0xd3, 0x33, 0x33, 0x20, + 0xa, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x90, + 0xa, 0x60, 0x0, 0x0, 0x0, 0x40, 0x7, 0x90, + 0x9, 0x60, 0x0, 0x0, 0x2, 0xe0, 0x7, 0x80, + 0x1, 0x11, 0x11, 0x11, 0x13, 0xf1, 0x11, 0x10, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x1, 0xe5, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x20, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x10, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x14, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfe, 0x80, 0x0, 0x0, + + /* U+5B89 "安" */ + 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x5c, 0xcc, + 0xcc, 0xee, 0xcc, 0xcc, 0xc5, 0x7b, 0x33, 0x34, + 0x33, 0x33, 0x33, 0xb7, 0x79, 0x0, 0x7, 0xb0, + 0x0, 0x0, 0xa7, 0x34, 0x0, 0xd, 0x50, 0x0, + 0x0, 0x43, 0x11, 0x11, 0x5e, 0x11, 0x11, 0x11, + 0x11, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x8, 0xc0, 0x0, 0xb, 0x80, 0x0, 0x0, + 0x3f, 0x20, 0x0, 0x3f, 0x10, 0x0, 0x0, 0x7f, + 0xb6, 0x1, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xfd, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xea, + 0xfc, 0x50, 0x0, 0x0, 0x38, 0xeb, 0x20, 0x7, + 0xed, 0x50, 0x4f, 0xd8, 0x30, 0x0, 0x0, 0x8, + 0xf3, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B8C "完" */ + 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xcc, 0xcc, 0xcd, 0xfc, 0xcc, 0xcc, 0x70, + 0xa, 0x94, 0x44, 0x44, 0x44, 0x44, 0x49, 0x90, + 0xa, 0x60, 0x0, 0x0, 0x0, 0x0, 0x7, 0x90, + 0x7, 0x45, 0xee, 0xee, 0xee, 0xee, 0x55, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0xc, 0x50, 0xb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0xb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x0, 0xb, 0x50, 0x0, 0x10, + 0x0, 0x0, 0xb8, 0x0, 0xb, 0x50, 0x0, 0xb3, + 0x0, 0x2c, 0xc1, 0x0, 0xa, 0x70, 0x0, 0xd2, + 0x1c, 0xe8, 0x0, 0x0, 0x6, 0xff, 0xff, 0xb0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B98 "官" */ + 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe3, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x5d, 0xc2, 0x22, 0x22, 0x22, + 0x22, 0x20, 0x4b, 0x0, 0xed, 0xcc, 0xcc, 0xcc, + 0xf4, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0xee, 0xdd, 0xdd, 0xdd, 0xd4, 0x0, 0x0, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xee, 0xee, 0xee, 0xee, 0x20, 0x0, 0xe3, 0x0, + 0x0, 0x0, 0x3f, 0x20, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x3f, 0x20, 0x0, 0xe6, 0x44, 0x44, 0x44, + 0x6f, 0x20, 0x0, 0xec, 0xbb, 0xbb, 0xbb, 0xce, + 0x20, + + /* U+5B99 "宙" */ + 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf3, 0x0, 0x0, 0x0, 0xac, 0xcc, + 0xcc, 0xfe, 0xcc, 0xcc, 0xc4, 0xd6, 0x33, 0x33, + 0x54, 0x33, 0x33, 0xc5, 0xd3, 0x0, 0x0, 0xe2, + 0x0, 0x0, 0xb5, 0x61, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x52, 0x1, 0x22, 0x22, 0xe5, 0x22, 0x22, + 0x0, 0x8, 0xec, 0xcc, 0xfd, 0xcc, 0xcf, 0x20, + 0x8, 0x70, 0x0, 0xe2, 0x0, 0xe, 0x20, 0x8, + 0x70, 0x0, 0xe2, 0x0, 0xe, 0x20, 0x8, 0xfe, + 0xee, 0xfe, 0xee, 0xef, 0x20, 0x8, 0x70, 0x0, + 0xe2, 0x0, 0xe, 0x20, 0x8, 0x70, 0x0, 0xe2, + 0x0, 0xe, 0x20, 0x8, 0xec, 0xcc, 0xfd, 0xcc, + 0xcf, 0x20, 0x8, 0x93, 0x33, 0x33, 0x33, 0x3f, + 0x20, + + /* U+5B9A "定" */ + 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0xb, + 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0x20, 0xd6, + 0x33, 0x33, 0x33, 0x33, 0x33, 0xe3, 0xd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x30, 0x81, 0x34, + 0x44, 0x44, 0x44, 0x42, 0x82, 0x0, 0xb, 0xcc, + 0xcf, 0xdc, 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0xb, 0x50, 0xd, + 0x40, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, 0xde, + 0xee, 0xee, 0x50, 0x0, 0x2f, 0x30, 0xd, 0x51, + 0x11, 0x10, 0x0, 0x7, 0xcc, 0x0, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x9a, 0x1d, 0x40, 0x0, + 0x0, 0x0, 0x9a, 0x0, 0xae, 0xf7, 0x21, 0x0, + 0x1, 0x5d, 0x10, 0x0, 0x49, 0xde, 0xff, 0xff, + 0xa0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B9E "实" */ + 0x0, 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9a, 0x0, 0x0, 0x0, 0x6b, 0xbb, + 0xbb, 0xdf, 0xcb, 0xbb, 0xb6, 0x8a, 0x33, 0x33, + 0x33, 0x33, 0x33, 0xa8, 0x88, 0x6, 0x10, 0x9, + 0x20, 0x0, 0x88, 0x33, 0x7, 0xe5, 0xf, 0x20, + 0x0, 0x33, 0x1, 0x0, 0x36, 0xf, 0x10, 0x0, + 0x0, 0x6, 0xe3, 0x0, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x30, 0x4d, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x7a, 0x0, 0x0, 0x0, 0xce, 0xee, + 0xee, 0xfe, 0xee, 0xee, 0xed, 0x0, 0x0, 0x6, + 0xd1, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6e, 0x31, + 0x9e, 0x81, 0x0, 0x0, 0x5c, 0xd3, 0x0, 0x1, + 0x8e, 0x80, 0x6f, 0xc6, 0x0, 0x0, 0x0, 0x1, + 0xb9, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5B9F "実" */ + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0xb, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xa0, + 0xc, 0x50, 0x0, 0x4, 0x30, 0x0, 0x6, 0xb0, + 0xc, 0x40, 0x0, 0x9, 0x70, 0x0, 0x6, 0xb0, + 0x1, 0x6e, 0xee, 0xef, 0xfe, 0xee, 0xe7, 0x10, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x33, 0x3a, 0x93, 0x33, 0x30, 0x0, + 0x0, 0x1b, 0xbb, 0xbe, 0xdb, 0xbb, 0xb3, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xc7, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x90, 0x1d, 0x80, 0x0, 0x0, + 0x0, 0x29, 0xe6, 0x0, 0x1, 0xbd, 0x60, 0x0, + 0xc, 0xd7, 0x10, 0x0, 0x0, 0x4, 0xbf, 0xc0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+5BA2 "客" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xe, 0x20, 0x2, 0x71, 0x0, 0x0, 0x5, 0xc0, + 0xe, 0x10, 0x1d, 0xb2, 0x22, 0x22, 0x4, 0xc0, + 0x0, 0x2, 0xde, 0xaa, 0xaa, 0xeb, 0x0, 0x0, + 0x0, 0x7e, 0x8d, 0x60, 0x7, 0xc0, 0x0, 0x0, + 0x5, 0x91, 0x0, 0xbb, 0xca, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbb, 0xbb, 0x50, 0x0, 0x0, + 0x3, 0x7a, 0xe9, 0x20, 0x2, 0x9e, 0xc9, 0x61, + 0x4d, 0x98, 0xed, 0xdd, 0xdd, 0xde, 0x67, 0x90, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x3, 0xfe, 0xee, 0xee, 0xef, 0x20, 0x0, + + /* U+5BA4 "室" */ + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, 0xc0, + 0xb, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa7, 0xa0, + 0x0, 0x3, 0x37, 0xf5, 0x34, 0x73, 0x31, 0x0, + 0x0, 0x0, 0x2e, 0x30, 0x0, 0xd7, 0x0, 0x0, + 0x0, 0x4, 0xe4, 0x23, 0x46, 0x8f, 0x70, 0x0, + 0x0, 0x2f, 0xfe, 0xcb, 0xa8, 0x76, 0xe5, 0x0, + 0x0, 0x1, 0x0, 0x9, 0x70, 0x0, 0x21, 0x0, + 0x0, 0x12, 0x22, 0x2a, 0x92, 0x22, 0x21, 0x0, + 0x0, 0x7b, 0xbb, 0xbe, 0xdb, 0xbb, 0xb7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + + /* U+5BB3 "害" */ + 0x0, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x9e, 0xee, + 0xee, 0xff, 0xee, 0xee, 0xea, 0x97, 0x0, 0x0, + 0x33, 0x0, 0x0, 0x7a, 0x85, 0x22, 0x22, 0xaa, + 0x22, 0x22, 0x58, 0x0, 0x9a, 0xaa, 0xdd, 0xaa, + 0xaa, 0x0, 0x1, 0x22, 0x22, 0x9a, 0x22, 0x22, + 0x10, 0x4, 0xbb, 0xbb, 0xdd, 0xbb, 0xbb, 0x60, + 0x11, 0x11, 0x11, 0x99, 0x11, 0x11, 0x11, 0xbc, + 0xcc, 0xcc, 0xee, 0xcc, 0xcc, 0xcb, 0x0, 0x11, + 0x11, 0x99, 0x11, 0x11, 0x0, 0x0, 0xed, 0xcc, + 0xcc, 0xcc, 0xcf, 0x10, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0xe2, 0x0, 0x0, 0x0, + 0xf, 0x10, 0x0, 0xee, 0xdd, 0xdd, 0xdd, 0xdf, + 0x10, + + /* U+5BB5 "宵" */ + 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd5, 0x0, 0x0, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xe3, 0x22, 0x0, + 0xc2, 0x0, 0x41, 0x88, 0xe2, 0x4c, 0x0, 0xe2, + 0x4, 0xd0, 0x88, 0x0, 0xb, 0x40, 0xe2, 0x1d, + 0x30, 0x0, 0x1, 0xab, 0xba, 0xfb, 0xbd, 0xaa, + 0x0, 0x2, 0xe3, 0x33, 0x33, 0x33, 0x6e, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x2, + 0xfe, 0xee, 0xee, 0xee, 0xee, 0x0, 0x2, 0xe0, + 0x0, 0x0, 0x0, 0x2e, 0x0, 0x2, 0xfe, 0xee, + 0xee, 0xee, 0xee, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x9f, 0xe8, + 0x0, + + /* U+5BB6 "家" */ + 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xf3, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd4, 0xd, 0x31, + 0x11, 0x11, 0x11, 0x11, 0xc, 0x40, 0x41, 0xcd, + 0xde, 0xfd, 0xdd, 0xd5, 0x31, 0x0, 0x0, 0x7, + 0xe7, 0x0, 0x0, 0x40, 0x0, 0x4, 0x9d, 0x86, + 0xc0, 0x2, 0xda, 0x0, 0x9, 0xb6, 0x0, 0x7e, + 0x76, 0xe6, 0x0, 0x0, 0x0, 0x17, 0xd7, 0x2f, + 0xbe, 0x10, 0x0, 0x6, 0xcc, 0x60, 0xa, 0xf3, + 0x78, 0x0, 0x0, 0x32, 0x0, 0x6d, 0x7c, 0x50, + 0xd4, 0x0, 0x0, 0x17, 0xd9, 0x10, 0xc4, 0x3, + 0xe5, 0x0, 0xcd, 0x61, 0x0, 0x5f, 0x10, 0x3, + 0xe9, 0x1, 0x0, 0xb, 0xfe, 0x50, 0x0, 0x0, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5BB9 "容" */ + 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xd3, + 0x0, 0x10, 0x0, 0x10, 0x0, 0xe3, 0xb, 0x20, + 0xa9, 0x0, 0x8, 0xa1, 0xc, 0x30, 0x0, 0xab, + 0x0, 0x73, 0x7, 0xe4, 0x0, 0x3, 0xda, 0x0, + 0x5f, 0x90, 0x4, 0xe6, 0x0, 0x56, 0x0, 0x5e, + 0x2b, 0x90, 0x2, 0x70, 0x0, 0x0, 0x7e, 0x20, + 0xa, 0xc2, 0x0, 0x0, 0x2, 0xcb, 0x10, 0x0, + 0x6, 0xe9, 0x10, 0x2a, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0x72, 0x91, 0xe2, 0x0, 0x0, 0x0, + 0xe2, 0x33, 0x0, 0xe, 0x20, 0x0, 0x0, 0xe, + 0x20, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0xe2, + 0x0, 0x0, 0xe, 0xee, 0xee, 0xee, 0xee, 0x20, + 0x0, + + /* U+5BBF "宿" */ + 0x0, 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0x0, 0xd, + 0xfe, 0xee, 0xef, 0xfe, 0xee, 0xef, 0x40, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x8, 0x26, + 0xa1, 0x11, 0x11, 0x11, 0x16, 0x20, 0x0, 0xe3, + 0xde, 0xee, 0xfe, 0xee, 0xe7, 0x0, 0x8c, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x3d, + 0xde, 0xfd, 0xdd, 0x90, 0x5f, 0x8a, 0x3, 0xd1, + 0x11, 0x11, 0x7a, 0x3, 0x44, 0xa0, 0x3c, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x4a, 0x3, 0xfe, 0xee, + 0xee, 0xfa, 0x0, 0x4, 0xa0, 0x3c, 0x0, 0x0, + 0x6, 0xa0, 0x0, 0x4a, 0x3, 0xc0, 0x0, 0x0, + 0x6a, 0x0, 0x4, 0xa0, 0x3f, 0xdd, 0xdd, 0xde, + 0xa0, 0x0, 0x4a, 0x3, 0xd1, 0x11, 0x11, 0x79, + 0x0, + + /* U+5BC4 "寄" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0xc, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xef, 0xd0, + 0xc, 0x30, 0x0, 0x6, 0x70, 0x0, 0x3, 0xd0, + 0x9, 0x3e, 0xee, 0xef, 0xfe, 0xee, 0xe4, 0x90, + 0x0, 0x0, 0x0, 0x5f, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xd4, 0x7c, 0xd7, 0x0, 0x0, + 0x0, 0x6e, 0xc7, 0x0, 0x0, 0x29, 0xd0, 0x0, + 0x1e, 0xff, 0xee, 0xee, 0xee, 0xee, 0xfe, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x1e, 0xdd, 0xdd, 0xe4, 0x4, 0xc0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0xa5, 0x4, 0xc0, 0x0, + 0x0, 0x1e, 0x11, 0x11, 0xb5, 0x4, 0xc0, 0x0, + 0x0, 0x1f, 0xcc, 0xcc, 0xc4, 0x5, 0xc0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x9, 0xfe, 0x70, 0x0, + + /* U+5BC6 "密" */ + 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xe1, + 0x0, 0x18, 0x10, 0x1, 0x0, 0xa6, 0xe, 0x10, + 0x4, 0x7e, 0x32, 0xd3, 0xa, 0x60, 0x14, 0x61, + 0xd0, 0x36, 0xd4, 0x45, 0x10, 0x0, 0xd4, 0x1d, + 0x4, 0xd4, 0x2, 0xe5, 0x0, 0xb9, 0x1, 0xea, + 0xa1, 0x1, 0xc2, 0xe3, 0x29, 0x4, 0xaf, 0x83, + 0x33, 0x8a, 0x5, 0x92, 0xac, 0x96, 0x6a, 0xdb, + 0xa9, 0x20, 0x0, 0x0, 0x33, 0x0, 0xe, 0x20, + 0x0, 0x60, 0x0, 0x8, 0x90, 0x0, 0xe2, 0x0, + 0xe, 0x10, 0x0, 0x89, 0x0, 0xe, 0x20, 0x0, + 0xe1, 0x0, 0x8, 0xeb, 0xbb, 0xfc, 0xbb, 0xbf, + 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, 0x44, 0xf1, + 0x0, + + /* U+5BCC "富" */ + 0x0, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf3, 0x0, 0x0, 0x0, 0xef, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xf4, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0xd2, 0xbc, 0xcc, 0xcc, + 0xcc, 0xc4, 0xc4, 0x0, 0x12, 0x22, 0x22, 0x22, + 0x20, 0x0, 0x0, 0xcb, 0xaa, 0xaa, 0xaa, 0xf3, + 0x0, 0x0, 0xc6, 0x33, 0x33, 0x33, 0xe3, 0x0, + 0x0, 0x57, 0x77, 0x77, 0x77, 0x71, 0x0, 0x8, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x20, 0xc, 0x42, + 0x22, 0xe4, 0x22, 0x2a, 0x40, 0xc, 0x31, 0x11, + 0xe4, 0x11, 0x1a, 0x40, 0xc, 0xba, 0xaa, 0xfb, + 0xaa, 0xae, 0x40, 0xc, 0x20, 0x0, 0xd2, 0x0, + 0x9, 0x40, 0xc, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, + 0x30, + + /* U+5BD2 "寒" */ + 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, + 0xc, 0xfe, 0xef, 0xee, 0xee, 0xfe, 0xef, 0xc0, + 0xc, 0x40, 0xd, 0x30, 0x2, 0xd0, 0x4, 0xc0, + 0xa, 0xad, 0xdf, 0xdd, 0xdd, 0xfd, 0xd9, 0xa0, + 0x0, 0x0, 0xd, 0x30, 0x2, 0xd0, 0x0, 0x0, + 0x0, 0x2c, 0xcf, 0xdc, 0xcd, 0xfc, 0xc1, 0x0, + 0x0, 0x0, 0xd, 0x30, 0x2, 0xd0, 0x0, 0x0, + 0xb, 0xbb, 0xbf, 0xcb, 0xbc, 0xfb, 0xbb, 0xb1, + 0x2, 0x22, 0x9c, 0x22, 0x22, 0xc9, 0x22, 0x20, + 0x0, 0x8, 0xd1, 0x8d, 0x82, 0xb, 0xa1, 0x0, + 0x5, 0xda, 0x10, 0x0, 0x6c, 0x20, 0x8e, 0x81, + 0x1b, 0x40, 0x68, 0x41, 0x0, 0x0, 0x2, 0x80, + 0x0, 0x0, 0x26, 0xad, 0xd9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5BDD "寝" */ + 0x0, 0x0, 0x0, 0x7, 0x60, 0x0, 0x0, 0x0, + 0x6, 0x77, 0x77, 0x7b, 0xe7, 0x77, 0x77, 0x70, + 0xe, 0x76, 0x66, 0x66, 0x66, 0x66, 0x66, 0xf0, + 0xe, 0x1a, 0x20, 0x68, 0x88, 0x88, 0x87, 0xf0, + 0x1, 0xc, 0x30, 0x23, 0x33, 0x33, 0x5c, 0x10, + 0xc, 0x1c, 0x30, 0x3b, 0xbb, 0xbb, 0xcc, 0x0, + 0x8, 0x6c, 0x30, 0x0, 0x0, 0x0, 0x3c, 0x0, + 0x2, 0xbc, 0x30, 0xac, 0xcc, 0xcc, 0xc9, 0x0, + 0x0, 0x5c, 0x36, 0x66, 0x66, 0x66, 0x66, 0x60, + 0x0, 0xd, 0x3e, 0x55, 0x55, 0x55, 0x55, 0xe0, + 0x2, 0xbf, 0x3c, 0x3c, 0xcc, 0xcc, 0xc7, 0xc0, + 0x5e, 0x6d, 0x30, 0x5, 0xb0, 0x3, 0xd1, 0x0, + 0x1, 0xc, 0x30, 0x0, 0x5d, 0x8c, 0x20, 0x0, + 0x0, 0xc, 0x30, 0x15, 0x9d, 0xbd, 0x73, 0x0, + 0x0, 0xc, 0x3b, 0xc9, 0x40, 0x1, 0x6a, 0xc1, + + /* U+5BDF "察" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0xe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe0, + 0xe, 0x10, 0x92, 0x0, 0x80, 0x0, 0x1, 0xe0, + 0x5, 0x7, 0xfc, 0xc9, 0x9c, 0xcc, 0xcc, 0x60, + 0x0, 0x8b, 0x20, 0x97, 0x2e, 0x21, 0x99, 0x0, + 0x1c, 0x91, 0xba, 0xd0, 0x7, 0xb5, 0xd1, 0x0, + 0x2, 0x78, 0x4e, 0x20, 0x0, 0xaf, 0x30, 0x0, + 0x0, 0x1d, 0xca, 0xee, 0xee, 0xd7, 0xe7, 0x10, + 0x1a, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x18, 0xd2, + 0x4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x43, 0x4, 0xc0, 0x24, 0x0, 0x0, + 0x0, 0x7, 0xd1, 0x4, 0xc0, 0x2c, 0xb2, 0x0, + 0x4, 0xdb, 0x10, 0x4, 0xc0, 0x0, 0x6e, 0x60, + 0x8, 0x50, 0x4, 0xee, 0x80, 0x0, 0x2, 0x50, + + /* U+5BE6 "實" */ + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, + 0xe, 0xed, 0xdd, 0xde, 0xed, 0xdd, 0xde, 0x70, + 0xe, 0x10, 0x11, 0x11, 0x11, 0x11, 0x8, 0x70, + 0xa, 0x1a, 0xb9, 0x9c, 0xc9, 0x9b, 0x86, 0x50, + 0x4b, 0xbe, 0xa8, 0x8c, 0xb8, 0x8b, 0xdb, 0xb0, + 0x0, 0xf, 0x98, 0x8d, 0xb8, 0x8b, 0x50, 0x0, + 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x20, 0x0, + 0x0, 0x3e, 0x88, 0x88, 0x88, 0x8a, 0xe0, 0x0, + 0x0, 0x3f, 0xaa, 0xaa, 0xaa, 0xab, 0xe0, 0x0, + 0x0, 0x3d, 0x22, 0x22, 0x22, 0x25, 0xe0, 0x0, + 0x0, 0x3e, 0x77, 0x77, 0x77, 0x79, 0xe0, 0x0, + 0x0, 0x3f, 0xaa, 0xaa, 0xaa, 0xab, 0xe0, 0x0, + 0x0, 0x1, 0x6c, 0x50, 0x8, 0xb6, 0x20, 0x0, + 0x8, 0xdc, 0x82, 0x0, 0x0, 0x26, 0xcc, 0x20, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+5BEB "寫" */ + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe6, 0x0, 0x0, 0x0, 0xe, + 0xfe, 0xee, 0xee, 0xee, 0xee, 0xef, 0xd0, 0xe1, + 0x0, 0x26, 0x10, 0x0, 0x0, 0x2d, 0xa, 0x9, + 0xba, 0x61, 0x6c, 0xcc, 0xb2, 0x90, 0x0, 0xf0, + 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0xf, 0xcc, + 0xc2, 0x3c, 0xcd, 0xe0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0xf, 0xdd, 0xdd, + 0xdd, 0xdd, 0xe0, 0x0, 0x0, 0x9, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xfe, 0xee, 0xee, + 0xee, 0xee, 0x41, 0x8e, 0x76, 0x4, 0x5, 0x7, + 0x10, 0xc4, 0x18, 0x14, 0xb0, 0xd0, 0x86, 0x3c, + 0xe, 0x20, 0x0, 0xd3, 0xc, 0x21, 0xb0, 0x31, + 0xf0, 0x0, 0x16, 0x0, 0x30, 0x0, 0x7e, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5BFA "寺" */ + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x34, 0x44, 0x4b, 0xa4, 0x44, 0x44, 0x0, + 0x0, 0x9b, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x11, 0x11, 0xb7, 0x11, 0x10, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x3, 0x40, 0x0, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x2, 0xe6, 0x0, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0x40, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x20, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xd2, 0x0, 0x0, + + /* U+5BFE "対" */ + 0x0, 0x6, 0x60, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x1, 0xe3, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x6, 0x66, 0xa9, 0x65, 0x0, 0x0, 0x3d, 0x0, + 0x8, 0x88, 0x88, 0xc8, 0x44, 0x44, 0x7e, 0x43, + 0x0, 0x0, 0x2, 0xf0, 0xbb, 0xbb, 0xcf, 0xb8, + 0x1, 0x90, 0x6, 0xb0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0xb9, 0xa, 0x70, 0x45, 0x0, 0x3d, 0x0, + 0x0, 0xc, 0x8e, 0x20, 0x2e, 0x10, 0x3d, 0x0, + 0x0, 0x1, 0xdc, 0x0, 0x8, 0x90, 0x3d, 0x0, + 0x0, 0x0, 0xdf, 0x20, 0x1, 0xe0, 0x3d, 0x0, + 0x0, 0x9, 0xb7, 0xd0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x6e, 0x10, 0xc5, 0x0, 0x0, 0x3d, 0x0, + 0x9, 0xe3, 0x0, 0x10, 0x0, 0x11, 0x6c, 0x0, + 0x9, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C04 "射" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x4b, 0x0, + 0x0, 0xde, 0xed, 0xd1, 0x0, 0x0, 0x4b, 0x0, + 0x0, 0xf0, 0x0, 0xe1, 0x0, 0x0, 0x4b, 0x0, + 0x0, 0xf1, 0x11, 0xe3, 0x88, 0x88, 0xae, 0x84, + 0x0, 0xfa, 0xaa, 0xf3, 0x99, 0x99, 0xbe, 0x94, + 0x0, 0xf0, 0x0, 0xe1, 0x0, 0x0, 0x4b, 0x0, + 0x0, 0xfd, 0xdd, 0xf1, 0x3b, 0x0, 0x4b, 0x0, + 0x0, 0xf0, 0x0, 0xe1, 0xb, 0x70, 0x4b, 0x0, + 0x5f, 0xff, 0xff, 0xf1, 0x2, 0xf1, 0x4b, 0x0, + 0x0, 0x0, 0x99, 0xe1, 0x0, 0x83, 0x4b, 0x0, + 0x0, 0x9, 0xa0, 0xe1, 0x0, 0x0, 0x4b, 0x0, + 0x3, 0xc9, 0x0, 0xe1, 0x0, 0x0, 0x4b, 0x0, + 0x5e, 0x40, 0x0, 0xe1, 0x0, 0x0, 0x5b, 0x0, + 0x1, 0x0, 0xbe, 0xc0, 0x0, 0xcf, 0xe6, 0x0, + + /* U+5C07 "將" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0xd, 0x10, 0xe1, 0x0, 0x8, 0xb0, 0x0, 0x0, + 0xd, 0x10, 0xe1, 0x0, 0x9d, 0xcc, 0xcf, 0x40, + 0xd, 0x10, 0xe1, 0x5c, 0x66, 0x30, 0x6c, 0x0, + 0xd, 0x10, 0xe5, 0x94, 0x21, 0xaa, 0xf3, 0x0, + 0xd, 0xfe, 0xf1, 0x2, 0xc5, 0x8e, 0x30, 0x0, + 0x0, 0x0, 0xe1, 0x0, 0x6f, 0xc3, 0xa0, 0x0, + 0x0, 0x0, 0xe2, 0x8d, 0xe6, 0x1, 0xf0, 0x0, + 0x23, 0x33, 0xf1, 0x94, 0x0, 0x1, 0xf0, 0x0, + 0x7e, 0xdb, 0xf7, 0xee, 0xee, 0xef, 0xfe, 0xe1, + 0xb, 0x40, 0xe1, 0x7, 0x0, 0x1, 0xf0, 0x0, + 0xc, 0x30, 0xe1, 0x7, 0xc0, 0x1, 0xf0, 0x0, + 0xe, 0x10, 0xe1, 0x0, 0x99, 0x1, 0xf0, 0x0, + 0x3d, 0x0, 0xe1, 0x0, 0x1, 0x2, 0xf0, 0x0, + 0x86, 0x0, 0xe1, 0x0, 0x6, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C08 "專" */ + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x8, 0xdd, 0xdd, 0xde, 0xfd, 0xdd, 0xdd, 0xa0, + 0x0, 0x14, 0x44, 0x49, 0xc4, 0x44, 0x43, 0x0, + 0x0, 0x5c, 0x55, 0x59, 0xc5, 0x55, 0x8c, 0x0, + 0x0, 0x5e, 0xbb, 0xbd, 0xeb, 0xbb, 0xcc, 0x0, + 0x0, 0x5a, 0x0, 0x6, 0xa0, 0x0, 0x3c, 0x0, + 0x0, 0x5e, 0xcc, 0xce, 0xfc, 0xdd, 0xdc, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x3d, 0xa3, 0x0, + 0x5, 0xdd, 0xdd, 0xcc, 0xcb, 0xdd, 0xac, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x79, 0x1, 0x20, + 0x1d, 0xdd, 0xdd, 0xdd, 0xdd, 0xee, 0xdd, 0xd5, + 0x0, 0x2, 0xd6, 0x0, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0x90, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xce, 0xe5, 0x0, 0x0, + + /* U+5C0D "對" */ + 0x5, 0xa, 0x37, 0x61, 0x40, 0x0, 0x1e, 0x0, + 0x5, 0xaa, 0x37, 0x7c, 0x50, 0x0, 0x1e, 0x0, + 0x0, 0x8c, 0x37, 0xb6, 0x0, 0x0, 0x1e, 0x0, + 0x2d, 0xde, 0xee, 0xed, 0xc0, 0x0, 0x2e, 0x0, + 0x0, 0x66, 0x0, 0x75, 0x2f, 0xff, 0xff, 0xf8, + 0x0, 0xd, 0x11, 0xe1, 0x0, 0x0, 0x1e, 0x0, + 0x7, 0xbc, 0xbd, 0xeb, 0x45, 0x70, 0x1e, 0x0, + 0x1, 0x22, 0xb7, 0x22, 0x12, 0xe0, 0x1e, 0x0, + 0x0, 0x0, 0x96, 0x0, 0x0, 0xa6, 0x1e, 0x0, + 0x2, 0xee, 0xff, 0xee, 0x10, 0x5b, 0x1e, 0x0, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x0, 0xa8, 0x57, 0x80, 0x0, 0x1e, 0x0, + 0x1c, 0xef, 0xda, 0x86, 0x30, 0x0, 0x3e, 0x0, + 0x3, 0x10, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C0E "導" */ + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x40, 0x0, + 0x6, 0xb1, 0x0, 0xa, 0x60, 0x8, 0x90, 0x0, + 0x0, 0x8c, 0x1c, 0xcd, 0xde, 0xdd, 0xdc, 0xb0, + 0x0, 0x5, 0x0, 0x33, 0x4e, 0x43, 0x32, 0x0, + 0x17, 0x77, 0x0, 0xf6, 0x55, 0x55, 0x9a, 0x0, + 0x16, 0x6f, 0x0, 0xf9, 0x99, 0x99, 0xca, 0x0, + 0x0, 0xf, 0x0, 0xf7, 0x77, 0x77, 0xaa, 0x0, + 0x0, 0xf, 0x0, 0xf3, 0x22, 0x22, 0x8a, 0x0, + 0x1, 0xbc, 0xb2, 0x9a, 0xaa, 0xaa, 0xa6, 0x0, + 0xd, 0x50, 0x2a, 0xcb, 0xaa, 0xaa, 0xbb, 0xc2, + 0x1, 0x0, 0x0, 0x1, 0x22, 0x5d, 0x21, 0x0, + 0x1d, 0xdd, 0xdd, 0xdd, 0xdd, 0xef, 0xdd, 0xd0, + 0x0, 0x2, 0xc2, 0x0, 0x0, 0x3c, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x0, 0x9e, 0xe8, 0x0, 0x0, + + /* U+5C0F "小" */ + 0x0, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x20, 0x4, 0xd0, 0x1, 0x40, 0x0, + 0x0, 0xb, 0x80, 0x4, 0xd0, 0x2, 0xf2, 0x0, + 0x0, 0xf, 0x30, 0x4, 0xd0, 0x0, 0x9a, 0x0, + 0x0, 0x5e, 0x0, 0x4, 0xd0, 0x0, 0x1f, 0x30, + 0x0, 0xb8, 0x0, 0x4, 0xd0, 0x0, 0x8, 0xb0, + 0x3, 0xf1, 0x0, 0x4, 0xd0, 0x0, 0x2, 0xf2, + 0xd, 0x80, 0x0, 0x4, 0xd0, 0x0, 0x0, 0xb8, + 0x6, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x66, + 0x0, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x16, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xfe, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C11 "少" */ + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x10, 0xe, 0x10, 0x3, 0x10, 0x0, + 0x0, 0xe, 0x30, 0xe, 0x10, 0x8, 0xa0, 0x0, + 0x0, 0x6b, 0x0, 0xe, 0x10, 0x0, 0xd5, 0x0, + 0x0, 0xd3, 0x0, 0xe, 0x10, 0x0, 0x3e, 0x0, + 0x9, 0xa0, 0x0, 0xe, 0x10, 0x0, 0xa, 0x80, + 0x1d, 0x10, 0x0, 0xe, 0x10, 0x0, 0x2, 0xa0, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x2, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x10, 0x2e, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xe7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xae, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xce, 0x80, 0x0, 0x0, 0x0, + 0x39, 0xbe, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x28, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C1A "尚" */ + 0x5, 0x10, 0x0, 0xc4, 0x0, 0x2, 0x70, 0x5, + 0xd1, 0x0, 0xc4, 0x0, 0xc, 0x60, 0x0, 0x9a, + 0x0, 0xc4, 0x0, 0x9a, 0x0, 0x0, 0x7, 0x0, + 0xc4, 0x0, 0x70, 0x0, 0xe, 0xee, 0xee, 0xff, + 0xee, 0xee, 0xe1, 0xf, 0x11, 0x11, 0x11, 0x11, + 0x11, 0xf1, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf1, 0xf, 0x0, 0xee, 0xee, 0xee, 0x0, 0xf1, + 0xf, 0x0, 0xe0, 0x0, 0xe, 0x0, 0xf1, 0xf, + 0x0, 0xe0, 0x0, 0xe, 0x0, 0xf1, 0xf, 0x0, + 0xe3, 0x33, 0x4e, 0x0, 0xf1, 0xf, 0x0, 0xeb, + 0xbb, 0xbb, 0x0, 0xf1, 0xf, 0x0, 0x80, 0x0, + 0x0, 0x11, 0xf1, 0xf, 0x0, 0x0, 0x0, 0x4, + 0xfe, 0xa0, + + /* U+5C24 "尤" */ + 0x0, 0x0, 0x0, 0x2e, 0x1, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x3b, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x0, 0x0, 0x48, 0x0, + 0x1d, 0xdd, 0xdd, 0xef, 0xdd, 0xdd, 0xdd, 0xd1, + 0x2, 0x22, 0x22, 0x7c, 0x22, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x88, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb6, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf2, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xc0, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x60, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9d, 0x0, 0xc4, 0x0, 0x0, 0xc2, + 0x0, 0x6, 0xf2, 0x0, 0xc4, 0x0, 0x0, 0xe2, + 0x1, 0xaf, 0x40, 0x0, 0xc7, 0x0, 0x2, 0xf0, + 0x1f, 0xb2, 0x0, 0x0, 0x6e, 0xff, 0xff, 0x70, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C31 "就" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0x3c, 0x1, 0x0, + 0x2, 0x23, 0xd6, 0x22, 0x0, 0x3c, 0x3d, 0x0, + 0x1c, 0xcc, 0xcc, 0xcc, 0x20, 0x3c, 0x6, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x6c, 0x22, 0x40, + 0x3, 0xfe, 0xee, 0xf7, 0x8d, 0xee, 0xdd, 0xd4, + 0x3, 0xb0, 0x0, 0x87, 0x0, 0x78, 0x0, 0x0, + 0x3, 0xb0, 0x0, 0x87, 0x0, 0x99, 0x80, 0x0, + 0x3, 0xee, 0xfe, 0xe7, 0x0, 0xc7, 0xb0, 0x0, + 0x0, 0x10, 0xc2, 0x20, 0x0, 0xe3, 0xb0, 0x0, + 0x0, 0xd1, 0xc2, 0xd2, 0x4, 0xb3, 0xb0, 0x0, + 0x3, 0xc0, 0xc2, 0x68, 0xb, 0x43, 0xb0, 0x0, + 0xb, 0x50, 0xc2, 0x18, 0x3c, 0x3, 0xb0, 0x37, + 0x9, 0x0, 0xc2, 0x1, 0xd3, 0x3, 0xb0, 0x58, + 0x0, 0x1e, 0xd1, 0xb, 0x50, 0x1, 0xdd, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C3A "尺" */ + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x1f, 0x43, 0x33, 0x33, 0x33, 0x5e, 0x0, + 0x0, 0x2f, 0xcc, 0xcc, 0xee, 0xcc, 0xcb, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, + 0x0, 0x8a, 0x0, 0x0, 0x9, 0xa0, 0x0, 0x0, + 0x0, 0xd6, 0x0, 0x0, 0x1, 0xe5, 0x0, 0x0, + 0x2, 0xf1, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + 0xa, 0xb0, 0x0, 0x0, 0x0, 0x5, 0xf7, 0x0, + 0x3f, 0x20, 0x0, 0x0, 0x0, 0x0, 0x4c, 0xe3, + 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+5C40 "局" */ + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0xb, 0x40, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, 0xb, + 0x73, 0x33, 0x33, 0x33, 0x3f, 0x20, 0x0, 0xcc, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa1, 0x0, 0xc, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xee, + 0xee, 0xee, 0xee, 0xef, 0x30, 0xf, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x1, 0xe0, 0x1e, 0xee, + 0xee, 0xd0, 0xf, 0x20, 0x5c, 0x1, 0xe0, 0x0, + 0x1e, 0x0, 0xf1, 0x9, 0x80, 0x1e, 0x0, 0x1, + 0xe0, 0x1f, 0x0, 0xe2, 0x1, 0xfd, 0xdd, 0xde, + 0x3, 0xe0, 0x7b, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x7b, 0x3, 0x20, 0x0, 0x10, 0x0, 0xc, 0xfe, + 0x40, + + /* U+5C45 "居" */ + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, 0xd, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xf1, 0x0, 0xd4, + 0x0, 0x0, 0x5c, 0x0, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0xef, 0xee, + 0xee, 0xff, 0xee, 0xee, 0xc0, 0xf, 0x20, 0x0, + 0x5, 0xc0, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x4c, 0x0, 0x0, 0x0, 0x2d, 0x3, 0xee, 0xef, + 0xfe, 0xee, 0xc0, 0x5, 0xb0, 0x3c, 0x0, 0x0, + 0x0, 0x4d, 0x0, 0x96, 0x3, 0xc0, 0x0, 0x0, + 0x3, 0xd0, 0xe, 0x10, 0x3d, 0x11, 0x11, 0x11, + 0x4d, 0x6, 0x90, 0x3, 0xfd, 0xdd, 0xdd, 0xde, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5C4A "届" */ + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, 0xd, + 0x63, 0x33, 0x33, 0x33, 0x35, 0xe0, 0x0, 0xdd, + 0xcc, 0xcc, 0xcd, 0xcc, 0xcb, 0x0, 0xd, 0x30, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0xe3, 0x22, + 0x22, 0x5e, 0x22, 0x22, 0x0, 0xf, 0x2e, 0xcc, + 0xcd, 0xfc, 0xcc, 0xf1, 0x0, 0xf0, 0xe1, 0x0, + 0x2d, 0x0, 0xe, 0x10, 0x2e, 0xe, 0x42, 0x25, + 0xe2, 0x22, 0xf1, 0x5, 0xb0, 0xeb, 0xbb, 0xcf, + 0xbb, 0xbf, 0x10, 0x97, 0xe, 0x10, 0x2, 0xd0, + 0x0, 0xe1, 0xe, 0x10, 0xe3, 0x11, 0x4e, 0x11, + 0x1f, 0x15, 0x90, 0xe, 0xdd, 0xdd, 0xdd, 0xdd, + 0xf1, + + /* U+5C4B "屋" */ + 0x0, 0xde, 0xee, 0xee, 0xee, 0xee, 0xef, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0xdf, 0xee, 0xee, 0xee, 0xee, 0xee, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdc, 0xee, 0xee, 0xee, 0xee, 0xee, 0x70, + 0x0, 0xe3, 0x1, 0xd6, 0x0, 0x68, 0x0, 0x0, + 0x0, 0xf2, 0x1d, 0x70, 0x1, 0x3e, 0xb0, 0x0, + 0x0, 0xf0, 0xef, 0xee, 0xfd, 0xba, 0xbb, 0x0, + 0x2, 0xf0, 0x21, 0x0, 0xa5, 0x0, 0x5, 0x0, + 0x5, 0xb0, 0xde, 0xee, 0xfe, 0xee, 0xea, 0x0, + 0x9, 0x80, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, + 0xe, 0x30, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, + 0x5c, 0x2e, 0xee, 0xee, 0xfe, 0xee, 0xee, 0xe0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C55 "展" */ + 0x0, 0xdf, 0xee, 0xee, 0xee, 0xee, 0xef, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0xdf, 0xee, 0xff, 0xee, 0xff, 0xef, 0x0, + 0x0, 0xd3, 0x0, 0xd3, 0x0, 0x2d, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0xd4, 0x0, 0x3e, 0x0, 0x0, + 0x0, 0xe6, 0xdd, 0xfe, 0xdd, 0xef, 0xdd, 0x60, + 0x0, 0xf2, 0x0, 0xd3, 0x0, 0x2d, 0x0, 0x0, + 0x0, 0xf9, 0xcc, 0xfd, 0xcc, 0xdf, 0xcc, 0xc0, + 0x3, 0xe1, 0x2e, 0x32, 0x5e, 0x32, 0x4a, 0x20, + 0x6, 0xa0, 0xe, 0x10, 0xa, 0xa5, 0xd5, 0x0, + 0xb, 0x70, 0xe, 0x10, 0x2, 0xcf, 0x20, 0x0, + 0x2f, 0x10, 0x2f, 0x9b, 0xeb, 0xa, 0xe6, 0x10, + 0x59, 0x0, 0x7c, 0x84, 0x0, 0x0, 0x4a, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5C65 "履" */ + 0x0, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdf, 0x20, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, + 0x0, 0xdb, 0xaa, 0xaa, 0xaa, 0xaa, 0xaf, 0x20, + 0x0, 0xd6, 0x36, 0x83, 0x78, 0x33, 0x33, 0x0, + 0x0, 0xe3, 0x2d, 0x30, 0xcd, 0xbb, 0xbb, 0x70, + 0x0, 0xe6, 0xe4, 0x19, 0xb2, 0x22, 0x22, 0x0, + 0x0, 0xf2, 0x25, 0xdb, 0xf8, 0x88, 0x8f, 0x0, + 0x0, 0xf1, 0x3f, 0x30, 0xf9, 0x99, 0x9f, 0x0, + 0x1, 0xf6, 0xfd, 0x0, 0xe2, 0x22, 0x2e, 0x0, + 0x3, 0xd7, 0x6c, 0x0, 0x7d, 0xa7, 0x77, 0x0, + 0x6, 0xa0, 0x2c, 0x0, 0x8f, 0xbb, 0xbc, 0x0, + 0xb, 0x60, 0x2c, 0x2c, 0xab, 0x22, 0xc6, 0x0, + 0x1f, 0x10, 0x2c, 0x12, 0x16, 0xff, 0x92, 0x0, + 0x39, 0x0, 0x2c, 0xa, 0xb6, 0x21, 0x59, 0xc1, + + /* U+5C6C "屬" */ + 0x0, 0xdd, 0xcc, 0xcc, 0xcc, 0xcc, 0xcf, 0x20, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0xdd, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x20, 0xd, + 0x33, 0xa8, 0x25, 0x72, 0x8a, 0x30, 0x0, 0xd3, + 0x1, 0x88, 0x78, 0x47, 0x20, 0x0, 0xd, 0x27, + 0xa6, 0x25, 0x61, 0x59, 0x50, 0x0, 0xe2, 0xe9, + 0x9f, 0x99, 0xf9, 0x9f, 0x0, 0xf, 0x1c, 0x8a, + 0xc7, 0x7c, 0x77, 0xc0, 0x0, 0xf0, 0xa, 0xea, + 0xaa, 0xaa, 0xaa, 0x40, 0x1e, 0x2c, 0xc4, 0x6d, + 0x44, 0x40, 0xa5, 0x4, 0xb7, 0x7d, 0x68, 0xd6, + 0x6c, 0xa, 0x40, 0x88, 0x1, 0xc9, 0xae, 0x9a, + 0xb0, 0xc3, 0xd, 0x30, 0x0, 0x4, 0xd4, 0xd8, + 0xe, 0x12, 0xc0, 0x1c, 0xca, 0x97, 0x53, 0x8d, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5C71 "山" */ + 0x0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x4d, 0x0, 0x0, 0x23, 0x2e, 0x0, 0x0, + 0x4d, 0x0, 0x0, 0x6a, 0x2e, 0x0, 0x0, 0x4d, + 0x0, 0x0, 0x6a, 0x2e, 0x0, 0x0, 0x4d, 0x0, + 0x0, 0x6a, 0x2e, 0x0, 0x0, 0x4d, 0x0, 0x0, + 0x6a, 0x2e, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x6a, + 0x2e, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x6a, 0x2e, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0x6a, 0x2e, 0x0, + 0x0, 0x4d, 0x0, 0x0, 0x6a, 0x2e, 0x11, 0x11, + 0x5d, 0x11, 0x11, 0x7a, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6a, + + /* U+5CF6 "島" */ + 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xdd, 0xcc, 0xcc, 0xcc, 0xde, 0x0, 0x0, 0xd, + 0x40, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xdd, + 0xcc, 0xcc, 0xcc, 0xce, 0x0, 0x0, 0xd, 0x40, + 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xdd, 0xcc, + 0xcc, 0xcc, 0xcb, 0x0, 0x0, 0xd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xde, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0x10, 0xd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xce, 0xee, 0xee, 0xee, + 0xee, 0xe7, 0x0, 0x20, 0x1, 0xa0, 0x0, 0x20, + 0x8, 0x60, 0x3c, 0x0, 0x1d, 0x0, 0x3b, 0x0, + 0xa4, 0x3, 0xeb, 0xbb, 0xeb, 0xbc, 0xb0, 0xd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xde, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5D4C "嵌" */ + 0x0, 0xe2, 0x0, 0x5, 0xb0, 0x0, 0xb, 0x50, + 0x0, 0xe2, 0x0, 0x5, 0xb0, 0x0, 0xb, 0x50, + 0x0, 0xdf, 0xee, 0xef, 0xfe, 0xee, 0xef, 0x50, + 0x0, 0x62, 0x0, 0x31, 0x4, 0x70, 0x0, 0x0, + 0x0, 0xb4, 0x0, 0xb4, 0x8, 0x91, 0x11, 0x10, + 0xc, 0xfd, 0xcc, 0xed, 0x7c, 0xdc, 0xcc, 0xf5, + 0x3, 0xc7, 0x33, 0xc7, 0x3e, 0x3, 0x10, 0xe1, + 0x0, 0xb4, 0x0, 0xb4, 0x7a, 0xb, 0x41, 0xc0, + 0x0, 0xb6, 0x22, 0xc4, 0xc3, 0xc, 0x43, 0x70, + 0x0, 0xbd, 0xbb, 0xe4, 0x0, 0xf, 0x90, 0x0, + 0x0, 0xb4, 0x0, 0xb4, 0x0, 0x6e, 0xf1, 0x0, + 0x0, 0xb5, 0x0, 0xb4, 0x1, 0xe4, 0x98, 0x0, + 0x0, 0xbf, 0xee, 0xf4, 0x1c, 0x80, 0x1d, 0x50, + 0x0, 0xb4, 0x0, 0xb5, 0xb5, 0x0, 0x1, 0xb3, + + /* U+5DDD "川" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x3d, 0x0, 0x0, 0xc0, 0x0, 0xd, 0x30, 0x3, + 0xd0, 0x0, 0x1f, 0x0, 0x0, 0xd3, 0x0, 0x3d, + 0x0, 0x1, 0xf0, 0x0, 0xd, 0x30, 0x3, 0xd0, + 0x0, 0x1f, 0x0, 0x0, 0xd3, 0x0, 0x3d, 0x0, + 0x1, 0xf0, 0x0, 0xd, 0x30, 0x3, 0xd0, 0x0, + 0x1f, 0x0, 0x0, 0xd3, 0x0, 0x4d, 0x0, 0x1, + 0xf0, 0x0, 0xd, 0x30, 0x6, 0xb0, 0x0, 0x1f, + 0x0, 0x0, 0xd3, 0x0, 0x89, 0x0, 0x1, 0xf0, + 0x0, 0xd, 0x30, 0xc, 0x50, 0x0, 0x1f, 0x0, + 0x0, 0xd3, 0x1, 0xf0, 0x0, 0x1, 0xf0, 0x0, + 0xd, 0x30, 0xa9, 0x0, 0x0, 0x1f, 0x0, 0x0, + 0xd3, 0x1d, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5DDE "州" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0xc, 0x40, 0x0, 0xe1, 0x0, + 0x2, 0xe0, 0x0, 0xc4, 0x0, 0xe, 0x10, 0x0, + 0x2e, 0x0, 0xc, 0x40, 0x0, 0xe1, 0x0, 0x82, + 0xe2, 0x20, 0xc5, 0x50, 0xe, 0x10, 0x3c, 0x2e, + 0x69, 0xc, 0x4d, 0x30, 0xe1, 0x8, 0x72, 0xe1, + 0xe0, 0xc4, 0x5b, 0xe, 0x10, 0xe1, 0x3d, 0xc, + 0x3c, 0x40, 0xe2, 0xe1, 0x39, 0x4, 0xc0, 0x73, + 0xc4, 0x6, 0x3e, 0x10, 0x0, 0x79, 0x0, 0xc, + 0x40, 0x0, 0xe1, 0x0, 0xb, 0x70, 0x0, 0xc4, + 0x0, 0xe, 0x10, 0x2, 0xf1, 0x0, 0xc, 0x40, + 0x0, 0xe1, 0x0, 0xab, 0x0, 0x0, 0xc4, 0x0, + 0xe, 0x10, 0x6f, 0x20, 0x0, 0xb, 0x40, 0x0, + 0xe1, 0xc, 0x40, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5DE5 "工" */ + 0x4, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x50, + 0x1, 0x44, 0x44, 0x4b, 0xb4, 0x44, 0x44, 0x10, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x1a, 0x91, 0x11, 0x11, 0x10, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+5DE6 "左" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x44, 0x4a, 0xa4, 0x44, 0x44, 0x44, 0x30, + 0xb, 0xcc, 0xcf, 0xdc, 0xcc, 0xcc, 0xcc, 0x90, + 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x9, 0x90, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x20, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x0, 0xb8, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x8, 0xd0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x4e, 0x20, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, + 0x2, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + + /* U+5DEE "差" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0x0, 0x0, 0x3f, 0x10, 0x0, + 0x0, 0x0, 0x6d, 0x10, 0x1, 0xd7, 0x0, 0x0, + 0x4, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x60, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x12, 0xf3, 0x11, 0x11, 0x11, 0x10, + 0xe, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xee, 0xe0, + 0x0, 0x0, 0x2e, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcc, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x9, 0xa0, 0x0, 0x1f, 0x10, 0x0, 0x0, + 0x2, 0xcc, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x1f, 0x92, 0x44, 0x44, 0x5f, 0x54, 0x44, 0x40, + 0x2, 0x5, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb0, + + /* U+5DF1 "己" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x1, + 0x11, 0x11, 0x11, 0x11, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, + 0xe3, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x41, 0x0, + 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x4c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe3, 0x4c, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xf1, 0x3e, 0x31, 0x0, 0x0, + 0x0, 0x19, 0xc0, 0x9, 0xef, 0xff, 0xff, 0xff, + 0xfc, 0x30, + + /* U+5DF2 "已" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, + 0x11, 0x11, 0x11, 0x11, 0x3f, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x0, 0x6, 0x10, 0x0, + 0x0, 0x0, 0x2f, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x2f, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xd, 0x41, 0x11, 0x11, 0x11, 0x14, 0x0, + 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x27, 0xd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4d, 0xd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0xb, 0x91, 0x0, 0x0, + 0x0, 0x3, 0xd6, 0x2, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x80, + + /* U+5E02 "市" */ + 0x0, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xc0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x98, 0x11, 0x1a, 0x81, 0x11, 0x6b, 0x0, + 0x0, 0x97, 0x0, 0x9, 0x70, 0x0, 0x5b, 0x0, + 0x0, 0x97, 0x0, 0x9, 0x70, 0x0, 0x5b, 0x0, + 0x0, 0x97, 0x0, 0x9, 0x70, 0x0, 0x5b, 0x0, + 0x0, 0x97, 0x0, 0x9, 0x70, 0x0, 0x5b, 0x0, + 0x0, 0x97, 0x0, 0x9, 0x70, 0xef, 0xf7, 0x0, + 0x0, 0x11, 0x0, 0x9, 0x70, 0x11, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + + /* U+5E03 "布" */ + 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0x11, 0x4e, 0x21, 0x52, 0x11, 0x11, 0x10, + 0x0, 0x0, 0xc7, 0x0, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xd0, 0x0, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x4, 0xfb, 0xa1, 0x11, 0xd5, 0x11, 0x1f, 0x20, + 0x3f, 0x56, 0xa0, 0x0, 0xc4, 0x0, 0xe, 0x20, + 0x4, 0x6, 0xa0, 0x0, 0xc4, 0x0, 0xe, 0x20, + 0x0, 0x6, 0xa0, 0x0, 0xc4, 0x0, 0xe, 0x20, + 0x0, 0x6, 0xa0, 0x0, 0xc4, 0x12, 0x3f, 0x10, + 0x0, 0x6, 0x90, 0x0, 0xc4, 0x4c, 0xb8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, + + /* U+5E08 "师" */ + 0x0, 0xd, 0x1d, 0xff, 0xff, 0xff, 0xff, 0x22, + 0x80, 0xd1, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x3c, + 0xd, 0x10, 0x0, 0xf, 0x0, 0x0, 0x3, 0xc0, + 0xd1, 0x3d, 0xdd, 0xfd, 0xdd, 0x60, 0x3c, 0xd, + 0x14, 0xc2, 0x2f, 0x22, 0x97, 0x3, 0xc0, 0xd1, + 0x4b, 0x0, 0xf0, 0x8, 0x70, 0x3c, 0xe, 0x14, + 0xb0, 0xf, 0x0, 0x87, 0x3, 0xc0, 0xe1, 0x4b, + 0x0, 0xf0, 0x8, 0x70, 0x3c, 0xf, 0x4, 0xb0, + 0xf, 0x0, 0x87, 0x0, 0x2, 0xd0, 0x4b, 0x0, + 0xf0, 0x8, 0x70, 0x0, 0x6a, 0x4, 0xb0, 0xf, + 0x1, 0x97, 0x0, 0xd, 0x40, 0x3a, 0x0, 0xf0, + 0xcc, 0x30, 0x7, 0xc0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5E0C "希" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x1c, 0xa5, 0x0, 0x0, 0x3c, 0xb0, 0x0, + 0x0, 0x0, 0x49, 0xdb, 0x7c, 0xd5, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xbf, 0xbe, 0xa4, 0x0, 0x0, + 0x1, 0xbf, 0xd9, 0xd6, 0x0, 0x5c, 0xd5, 0x0, + 0x0, 0x41, 0x1, 0xf2, 0x0, 0x0, 0x41, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x5d, 0x10, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf4, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfe, 0xee, 0xfe, 0xee, 0xfc, 0x0, + 0x9, 0xe9, 0xb0, 0x0, 0xe1, 0x0, 0x4c, 0x0, + 0x18, 0x5, 0xb0, 0x0, 0xe1, 0x0, 0x4c, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0xe1, 0x0, 0x4c, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0xe1, 0x6e, 0xe8, 0x0, + 0x0, 0x0, 0x10, 0x0, 0xe1, 0x0, 0x0, 0x0, + + /* U+5E2B "師" */ + 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf4, 0x6, + 0x90, 0x0, 0x0, 0xe, 0x10, 0x0, 0xe, 0xff, + 0xfd, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xe1, 0x1, + 0xd0, 0x78, 0x8f, 0x98, 0x86, 0xe, 0x10, 0x1d, + 0xe, 0x65, 0xf6, 0x57, 0xc0, 0xed, 0xcd, 0xd0, + 0xe1, 0xe, 0x10, 0x3c, 0xe, 0x32, 0x22, 0xe, + 0x10, 0xe1, 0x3, 0xc0, 0xe1, 0x0, 0x0, 0xe1, + 0xe, 0x10, 0x3c, 0xe, 0xff, 0xff, 0xe, 0x10, + 0xe1, 0x3, 0xc0, 0xe1, 0x0, 0xf0, 0xe1, 0xe, + 0x10, 0x3c, 0xe, 0x10, 0xf, 0xe, 0x10, 0xe1, + 0x3, 0xc0, 0xe1, 0x0, 0xf0, 0xe1, 0xe, 0x1d, + 0xf8, 0xe, 0xee, 0xee, 0x1, 0x0, 0xe1, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x0, + + /* U+5E2D "席" */ + 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0xee, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe0, + 0x0, 0xf0, 0x0, 0x11, 0x0, 0x1, 0x10, 0x0, + 0x0, 0xf0, 0x0, 0xb3, 0x0, 0xd, 0x30, 0x0, + 0x0, 0xf4, 0xee, 0xfe, 0xee, 0xef, 0xee, 0xc0, + 0x0, 0xf0, 0x0, 0xb3, 0x0, 0xd, 0x30, 0x0, + 0x0, 0xf0, 0x0, 0xb3, 0x0, 0xd, 0x30, 0x0, + 0x1, 0xf0, 0x0, 0xae, 0xef, 0xee, 0x30, 0x0, + 0x2, 0xd0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x3, 0xc0, 0x4f, 0xee, 0xff, 0xee, 0xff, 0x0, + 0x6, 0x90, 0x4b, 0x0, 0x1e, 0x0, 0xf, 0x0, + 0x9, 0x50, 0x4b, 0x0, 0x1e, 0x0, 0xf, 0x0, + 0xd, 0x10, 0x4b, 0x0, 0x1e, 0x2, 0x4f, 0x0, + 0x4a, 0x0, 0x39, 0x0, 0x1e, 0xb, 0xb7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5E2F "帯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x80, 0x8, 0x70, 0x7, 0x80, 0x0, + 0x2e, 0xef, 0xfe, 0xef, 0xfe, 0xef, 0xfe, 0xe2, + 0x0, 0x8, 0x80, 0x9, 0x70, 0x8, 0x90, 0x0, + 0x0, 0x7, 0x80, 0x8, 0x70, 0x7, 0x80, 0x0, + 0x0, 0x7, 0xee, 0xee, 0xee, 0xee, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xb0, + 0xb, 0x40, 0x0, 0x9, 0x70, 0x0, 0x4, 0xb0, + 0xb, 0x4a, 0xbb, 0xbe, 0xdb, 0xbb, 0xb6, 0xb0, + 0x1, 0xe, 0x42, 0x2a, 0x92, 0x22, 0xf2, 0x10, + 0x0, 0xe, 0x10, 0x9, 0x70, 0x0, 0xe1, 0x0, + 0x0, 0xe, 0x10, 0x9, 0x70, 0x0, 0xf1, 0x0, + 0x0, 0xe, 0x10, 0x9, 0x70, 0xde, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + + /* U+5E30 "帰" */ + 0x0, 0x4, 0xb0, 0xbd, 0xdd, 0xdd, 0xdd, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0x0, 0x2d, 0x0, + 0x3, 0x14, 0xb0, 0x1d, 0xdd, 0xdd, 0xdd, 0x0, + 0x9, 0x44, 0xb0, 0x0, 0x0, 0x0, 0x2d, 0x0, + 0xa, 0x34, 0xb0, 0x9d, 0xdd, 0xdd, 0xdb, 0x0, + 0xc, 0x24, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0x4, 0xb8, 0xdd, 0xdf, 0xdd, 0xdd, 0xf1, + 0x29, 0x5, 0xa8, 0x30, 0xb, 0x40, 0x0, 0xe1, + 0x0, 0x6, 0x94, 0xee, 0xef, 0xee, 0xed, 0x80, + 0x0, 0x9, 0x60, 0xd2, 0xb, 0x40, 0x1e, 0x0, + 0x0, 0xd, 0x30, 0xd2, 0xb, 0x40, 0x1e, 0x0, + 0x0, 0x5b, 0x0, 0xd2, 0xb, 0x40, 0x1e, 0x0, + 0x2, 0xe3, 0x0, 0xd2, 0xb, 0x48, 0xea, 0x0, + 0xa, 0x40, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5E33 "帳" */ + 0x0, 0xe0, 0x0, 0x8f, 0xdd, 0xdd, 0xd9, 0x0, + 0xe, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, 0x12, + 0xe2, 0x20, 0x8a, 0x33, 0x33, 0x30, 0xd, 0xdf, + 0xdf, 0x8, 0xda, 0xaa, 0xaa, 0x0, 0xd0, 0xe0, + 0xd0, 0x88, 0x0, 0x0, 0x0, 0xd, 0xe, 0xd, + 0x8, 0xec, 0xcc, 0xcc, 0x20, 0xd0, 0xe0, 0xd0, + 0x88, 0x0, 0x0, 0x0, 0xd, 0xe, 0xd, 0x9f, + 0xff, 0xff, 0xff, 0xf1, 0xd0, 0xe0, 0xd0, 0xe1, + 0x69, 0x0, 0x42, 0xd, 0xe, 0x1d, 0xe, 0x10, + 0xd3, 0x6d, 0x30, 0xd0, 0xe8, 0x80, 0xe1, 0x3, + 0xeb, 0x10, 0x0, 0xe, 0x0, 0xe, 0x10, 0x5, + 0xd2, 0x0, 0x0, 0xe0, 0x0, 0xf8, 0xcb, 0x5, + 0xe7, 0x0, 0xe, 0x0, 0x3e, 0x82, 0x0, 0x2, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+5E36 "帶" */ + 0x0, 0x7, 0x80, 0xd0, 0xd, 0x16, 0x80, 0x0, + 0xa, 0xac, 0xda, 0xfa, 0xaf, 0xbc, 0xda, 0xa0, + 0x3, 0x3a, 0x84, 0xe3, 0x3e, 0x48, 0xa3, 0x40, + 0x0, 0x1e, 0x20, 0xe0, 0xe, 0x16, 0x90, 0xb1, + 0x4, 0xd7, 0x0, 0xfd, 0xdf, 0x15, 0xda, 0xe0, + 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x24, 0x20, + 0xb, 0xfe, 0xee, 0xef, 0xfe, 0xee, 0xef, 0xd0, + 0xb, 0x40, 0x0, 0x9, 0x70, 0x0, 0x3, 0xd0, + 0xb, 0x6b, 0xbb, 0xbe, 0xdb, 0xbb, 0xb6, 0xd0, + 0x0, 0x2e, 0x22, 0x2a, 0x92, 0x22, 0xc4, 0x0, + 0x0, 0x2e, 0x0, 0x9, 0x70, 0x0, 0xb4, 0x0, + 0x0, 0x2e, 0x0, 0x9, 0x70, 0x0, 0xc4, 0x0, + 0x0, 0x2e, 0x0, 0x9, 0x70, 0xcd, 0xe2, 0x0, + 0x0, 0x1, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + + /* U+5E38 "常" */ + 0x0, 0xb1, 0x0, 0xd3, 0x0, 0x69, 0x0, 0x0, + 0x5b, 0x0, 0xd3, 0x1, 0xd1, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0xc3, 0x1d, 0xdd, 0xdd, + 0xdd, 0xd0, 0xc4, 0x51, 0x1e, 0x0, 0x0, 0x0, + 0xf0, 0x51, 0x0, 0x1e, 0x0, 0x0, 0x0, 0xf0, + 0x0, 0x0, 0x1d, 0xdd, 0xfe, 0xdd, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xb, 0x70, + 0x0, 0xc4, 0x0, 0xa, 0x40, 0xb, 0x70, 0x0, + 0xc4, 0x0, 0xa, 0x40, 0xb, 0x70, 0x0, 0xc4, + 0x3, 0x2b, 0x30, 0x8, 0x50, 0x0, 0xc4, 0xa, + 0xca, 0x0, + + /* U+5E45 "幅" */ + 0x0, 0xe0, 0x2, 0xee, 0xee, 0xee, 0xee, 0x0, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89, 0xf9, + 0x90, 0xa, 0xaa, 0xaa, 0xa1, 0xd6, 0xf6, 0xd1, + 0x1e, 0x33, 0x33, 0xe1, 0xd0, 0xe0, 0xb1, 0x1d, + 0x0, 0x0, 0xd1, 0xd0, 0xe0, 0xb1, 0x1f, 0xdd, + 0xdd, 0xf1, 0xd0, 0xe0, 0xb1, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0xe0, 0xb1, 0xaa, 0xaa, 0xaa, 0xa8, + 0xd0, 0xe0, 0xb1, 0xf5, 0x3d, 0x43, 0x6c, 0xd0, + 0xe1, 0xc1, 0xf2, 0xc, 0x10, 0x3c, 0xc0, 0xe4, + 0x80, 0xfe, 0xdf, 0xed, 0xec, 0x0, 0xe0, 0x0, + 0xf2, 0xc, 0x10, 0x3c, 0x0, 0xe0, 0x0, 0xf2, + 0xc, 0x10, 0x3c, 0x0, 0xe0, 0x0, 0xfe, 0xdd, + 0xdd, 0xeb, + + /* U+5E73 "平" */ + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x1, 0x0, 0x9, 0x80, 0x0, 0x20, 0x0, + 0x0, 0xe, 0x20, 0x9, 0x80, 0x3, 0xf1, 0x0, + 0x0, 0x8, 0x90, 0x9, 0x80, 0x9, 0x90, 0x0, + 0x0, 0x2, 0xf0, 0x9, 0x80, 0x1e, 0x10, 0x0, + 0x0, 0x0, 0x92, 0x9, 0x80, 0x57, 0x0, 0x0, + 0x4, 0x44, 0x44, 0x4b, 0xa4, 0x44, 0x44, 0x40, + 0x1c, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0xc2, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+5E74 "年" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf4, 0x33, 0x33, 0x33, 0x33, 0x10, + 0x0, 0xe, 0xdc, 0xcc, 0xfd, 0xcc, 0xcc, 0x60, + 0x0, 0xbb, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0xa, 0xd1, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x7, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x8, 0x80, 0x0, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x80, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x80, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x2b, 0xbe, 0xdb, 0xbb, 0xed, 0xbb, 0xbb, 0xb2, + 0x4, 0x44, 0x44, 0x44, 0xd8, 0x44, 0x44, 0x41, + 0x0, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, + + /* U+5E78 "幸" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0xdd, 0xdf, 0xfd, 0xdd, 0xd7, 0x0, + 0x0, 0x1, 0x11, 0x1a, 0x81, 0x11, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0x1c, 0x10, 0x0, + 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7b, 0x0, 0x0, + 0x0, 0x23, 0x7c, 0x33, 0x33, 0xe6, 0x33, 0x0, + 0x0, 0xbb, 0xbb, 0xbe, 0xeb, 0xbb, 0xbb, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xbb, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0x80, + 0x3, 0x44, 0x44, 0x4b, 0xa4, 0x44, 0x44, 0x30, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+5E7E "幾" */ + 0x0, 0x7, 0x30, 0xd, 0x30, 0xa, 0x10, 0x0, + 0x0, 0x1c, 0x0, 0xc, 0x40, 0x4a, 0x4, 0x0, + 0x0, 0xa3, 0x2b, 0xa, 0x51, 0xc1, 0x6a, 0x0, + 0x9, 0xc8, 0xd2, 0x9, 0x6a, 0xdd, 0xc0, 0x0, + 0x5, 0x5d, 0x46, 0x7, 0x80, 0x2c, 0x2c, 0x0, + 0x0, 0xb5, 0x29, 0x84, 0xb4, 0xe9, 0x9d, 0x80, + 0x9, 0xdc, 0xb8, 0xd2, 0xf4, 0x8d, 0x41, 0x90, + 0x1, 0x16, 0xc1, 0x21, 0xe3, 0x17, 0xc1, 0x10, + 0x1d, 0xde, 0xed, 0xdd, 0xef, 0xdd, 0xdd, 0xd2, + 0x0, 0x9, 0x70, 0x0, 0x3d, 0x3, 0xb0, 0x0, + 0x0, 0xd, 0xd7, 0x0, 0xb, 0x8d, 0x30, 0x0, + 0x0, 0x5c, 0x9, 0xb0, 0x8, 0xf6, 0x0, 0x73, + 0x2, 0xe3, 0x0, 0x15, 0xc9, 0x7e, 0x52, 0xd2, + 0xd, 0x40, 0x0, 0xd9, 0x10, 0x4, 0xbf, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5E83 "広" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x11, 0xb8, 0x11, 0x11, 0x10, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xd3, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf2, 0x0, 0xa8, 0x0, 0x5c, 0x0, 0x0, + 0x0, 0xf0, 0x2, 0xe1, 0x0, 0xc, 0x80, 0x0, + 0x3, 0xe0, 0xa, 0x70, 0x0, 0x2, 0xf3, 0x0, + 0x7, 0xa0, 0x3e, 0x0, 0x0, 0x13, 0xad, 0x0, + 0xc, 0x61, 0xdd, 0xbc, 0xef, 0xdc, 0xae, 0x60, + 0x3e, 0x0, 0x97, 0x53, 0x10, 0x0, 0x6, 0xc0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5E86 "庆" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x22, 0x22, 0x23, 0xc9, 0x22, 0x22, 0x20, + 0x0, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3, + 0x0, 0xf0, 0x0, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x1, 0xf0, 0x0, 0x0, 0xce, 0x0, 0x0, 0x0, + 0x2, 0xe0, 0x0, 0x1, 0xfc, 0x70, 0x0, 0x0, + 0x3, 0xd0, 0x0, 0x7, 0xb1, 0xd2, 0x0, 0x0, + 0x5, 0xb0, 0x0, 0x1f, 0x30, 0x5c, 0x0, 0x0, + 0x9, 0x70, 0x1, 0xd9, 0x0, 0xa, 0xc1, 0x0, + 0xe, 0x30, 0x3d, 0xa0, 0x0, 0x0, 0xbd, 0x40, + 0x4d, 0x5, 0xe7, 0x0, 0x0, 0x0, 0x7, 0xf2, + 0x1, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+5E95 "底" */ + 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc7, 0x0, 0x0, 0x0, + 0x0, 0xee, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe3, + 0x0, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x12, 0x34, 0x68, 0xc9, 0x0, + 0x0, 0xf0, 0x1f, 0xed, 0xcc, 0xe7, 0x42, 0x0, + 0x0, 0xf0, 0x1e, 0x0, 0x3, 0xd0, 0x0, 0x0, + 0x0, 0xf0, 0x1e, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0x1, 0xf0, 0x1f, 0xcc, 0xcd, 0xfd, 0xcc, 0xa0, + 0x2, 0xe0, 0x1e, 0x22, 0x22, 0xb7, 0x22, 0x10, + 0x3, 0xc0, 0x1e, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x6, 0xa0, 0x1e, 0x0, 0x57, 0x2e, 0x0, 0x20, + 0xa, 0x60, 0x1e, 0x2, 0x4e, 0x1b, 0x60, 0x84, + 0xf, 0x20, 0x3f, 0xdc, 0x48, 0x83, 0xe3, 0xb1, + 0x4b, 0x0, 0x88, 0x20, 0x1, 0x90, 0x5d, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5E97 "店" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x33, 0x33, 0x33, 0xe6, 0x33, 0x33, 0x30, + 0x0, 0xfd, 0xcc, 0xcc, 0xdd, 0xcc, 0xcc, 0xc1, + 0x0, 0xf2, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0xf2, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0xf2, 0x0, 0x0, 0xef, 0xff, 0xff, 0x60, + 0x0, 0xf1, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x0, + 0x1, 0xf1, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, + 0x2, 0xf0, 0x1c, 0xcc, 0xfd, 0xcc, 0xcb, 0x0, + 0x3, 0xe0, 0x2e, 0x22, 0x22, 0x22, 0x5e, 0x0, + 0x6, 0xb0, 0x2e, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0xa, 0x80, 0x2e, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x1f, 0x30, 0x2f, 0xcc, 0xcc, 0xcc, 0xde, 0x0, + 0x4c, 0x0, 0x2e, 0x22, 0x22, 0x22, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5E9C "府" */ + 0x0, 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xdd, 0xdd, 0xdd, 0xfe, 0xdd, 0xdd, 0xd0, + 0x0, 0xf2, 0x22, 0x73, 0x22, 0x22, 0x73, 0x20, + 0x0, 0xf0, 0x2, 0xe0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0xf0, 0x8, 0x80, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0xf0, 0x1f, 0x2b, 0xdd, 0xdd, 0xfe, 0xd1, + 0x0, 0xf0, 0xcf, 0x11, 0x11, 0x11, 0xe4, 0x10, + 0x1, 0xf7, 0xce, 0x10, 0x80, 0x0, 0xd3, 0x0, + 0x2, 0xe3, 0x1e, 0x10, 0x98, 0x0, 0xd3, 0x0, + 0x3, 0xd0, 0xe, 0x10, 0x1e, 0x20, 0xd3, 0x0, + 0x4, 0xc0, 0xe, 0x10, 0x7, 0x50, 0xd3, 0x0, + 0x7, 0x90, 0xe, 0x10, 0x0, 0x0, 0xd3, 0x0, + 0xd, 0x50, 0xe, 0x10, 0x0, 0x1, 0xe3, 0x0, + 0x1c, 0x0, 0xe, 0x10, 0x1, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EA6 "度" */ + 0x0, 0x0, 0x0, 0x3, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0xe3, 0x11, 0x31, 0x11, 0x13, 0x11, 0x10, + 0x0, 0xe1, 0x0, 0xe1, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xe8, 0xee, 0xfe, 0xee, 0xef, 0xee, 0xa0, + 0x0, 0xf1, 0x0, 0xe1, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xf1, 0x0, 0xe1, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xf1, 0x0, 0xcd, 0xdd, 0xdd, 0x10, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xe3, 0xee, 0xee, 0xee, 0xee, 0xf4, 0x0, + 0x4, 0xc0, 0x5, 0xd1, 0x0, 0x9, 0xa0, 0x0, + 0x8, 0x80, 0x0, 0x6d, 0x53, 0xc9, 0x0, 0x0, + 0xc, 0x50, 0x0, 0x29, 0xff, 0xb2, 0x0, 0x0, + 0x3e, 0x8, 0xbe, 0xd8, 0x33, 0x8e, 0xdb, 0x80, + 0x3, 0x3, 0x30, 0x0, 0x0, 0x0, 0x14, 0x40, + + /* U+5EA7 "座" */ + 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0xee, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe3, + 0x0, 0xf2, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x0, 0xf0, 0x3, 0x40, 0x58, 0x0, 0x70, 0x0, + 0x0, 0xf0, 0xa, 0x60, 0x69, 0x3, 0xd0, 0x0, + 0x0, 0xf0, 0xf, 0x50, 0x69, 0x9, 0xc0, 0x0, + 0x0, 0xf0, 0x8a, 0xd5, 0x69, 0x4d, 0x8c, 0x10, + 0x1, 0xf6, 0xe1, 0x1c, 0x7b, 0xe2, 0x5, 0xd0, + 0x2, 0xe2, 0x20, 0x0, 0x69, 0x10, 0x0, 0x20, + 0x3, 0xc0, 0xcd, 0xdd, 0xee, 0xdd, 0xdd, 0x30, + 0x5, 0xa0, 0x11, 0x11, 0x7a, 0x11, 0x11, 0x0, + 0x9, 0x70, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, + 0xe, 0x30, 0x0, 0x0, 0x69, 0x0, 0x0, 0x0, + 0x3d, 0xd, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe3, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EAB "庫" */ + 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0xfe, 0xee, 0xee, 0xef, 0xee, 0xee, 0xe3, + 0x0, 0xf0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0xcd, 0xdd, 0xdf, 0xdd, 0xdd, 0xa0, + 0x0, 0xf0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x2b, 0xbb, 0xcf, 0xbb, 0xbb, 0x0, + 0x0, 0xf0, 0x3b, 0x0, 0x1e, 0x0, 0xf, 0x0, + 0x1, 0xf0, 0x3e, 0xbb, 0xbf, 0xbb, 0xbf, 0x0, + 0x2, 0xe0, 0x3b, 0x0, 0x1e, 0x0, 0xf, 0x0, + 0x3, 0xc0, 0x3e, 0xbb, 0xbf, 0xbb, 0xbf, 0x0, + 0x6, 0xa0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x9, 0x69, 0xdd, 0xdd, 0xdf, 0xdd, 0xdd, 0xd4, + 0xe, 0x20, 0x11, 0x11, 0x2e, 0x11, 0x11, 0x10, + 0x3a, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EAD "庭" */ + 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, 0x0, + 0x0, 0xee, 0xee, 0xee, 0xff, 0xee, 0xee, 0xe4, + 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x0, 0xf2, 0xdd, 0xd8, 0x25, 0x7a, 0xdc, 0x30, + 0x0, 0xf0, 0x1, 0xe2, 0x59, 0x7f, 0x20, 0x0, + 0x0, 0xf0, 0x8, 0x90, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xf0, 0x3d, 0x0, 0x1, 0x1e, 0x21, 0x10, + 0x1, 0xf0, 0xdd, 0xeb, 0x3d, 0xdf, 0xdd, 0x90, + 0x2, 0xe0, 0x30, 0x78, 0x0, 0xe, 0x10, 0x0, + 0x3, 0xd0, 0xd2, 0xe3, 0x0, 0xe, 0x10, 0x0, + 0x5, 0xb0, 0x6e, 0xb0, 0xbd, 0xdf, 0xdd, 0xd1, + 0x8, 0x80, 0x1f, 0x80, 0x11, 0x11, 0x11, 0x10, + 0xd, 0x40, 0xc8, 0xdb, 0x42, 0x0, 0x0, 0x0, + 0x1e, 0xd, 0x80, 0x6, 0xbc, 0xef, 0xff, 0xf4, + 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EB7 "康" */ + 0x0, 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xf0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x8c, 0xcc, 0xfd, 0xcc, 0xcb, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0xc4, 0x0, 0x1e, 0x0, + 0x0, 0xf5, 0xcc, 0xcc, 0xfd, 0xcc, 0xdf, 0xd7, + 0x0, 0xf0, 0x0, 0x0, 0xd4, 0x0, 0x1e, 0x10, + 0x1, 0xf0, 0x8a, 0xaa, 0xeb, 0xaa, 0xae, 0x0, + 0x2, 0xd0, 0x84, 0x22, 0xd8, 0x22, 0x27, 0x10, + 0x3, 0xc0, 0x5d, 0x30, 0xcf, 0x41, 0xab, 0x20, + 0x6, 0x90, 0x2, 0x9a, 0xf6, 0xce, 0x40, 0x0, + 0xa, 0x61, 0x6d, 0xb3, 0xc4, 0x1b, 0xc4, 0x0, + 0xf, 0x1a, 0x92, 0x0, 0xd4, 0x0, 0x4a, 0xe4, + 0x39, 0x0, 0x1, 0xee, 0xd1, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EE0 "廠" */ + 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0xfe, 0xee, 0xee, 0xfe, 0xee, 0xee, 0xe3, + 0x0, 0xe0, 0x0, 0x60, 0x0, 0x5, 0x0, 0x0, + 0x0, 0xe3, 0x90, 0xd1, 0x94, 0xe, 0x0, 0x0, + 0x0, 0xe0, 0xa3, 0xd3, 0xc0, 0x3c, 0x11, 0x10, + 0x1, 0xe0, 0x21, 0xd3, 0x20, 0x8d, 0xce, 0xe3, + 0x1, 0xe5, 0xed, 0xdd, 0xea, 0xf8, 0x8, 0x60, + 0x2, 0xe5, 0x70, 0x0, 0x2f, 0xab, 0xb, 0x30, + 0x3, 0xd5, 0x7a, 0xce, 0x2b, 0x1a, 0x1e, 0x0, + 0x3, 0xb5, 0x79, 0x9, 0x29, 0x6, 0xaa, 0x0, + 0x6, 0x95, 0x79, 0x9, 0x29, 0x1, 0xf3, 0x0, + 0x9, 0x65, 0x7a, 0xcb, 0x29, 0x6, 0xf6, 0x0, + 0xe, 0x25, 0x72, 0x0, 0x39, 0x5d, 0x2d, 0x50, + 0x1b, 0x5, 0x70, 0xb, 0xda, 0xc1, 0x2, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EFA "建" */ + 0xf, 0xff, 0xe2, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x0, 0x5, 0xe0, 0x9d, 0xdf, 0xed, 0xdf, 0x0, + 0x0, 0xd, 0x70, 0x0, 0xa, 0x50, 0xf, 0x0, + 0x0, 0x5d, 0xa, 0xdd, 0xdf, 0xed, 0xdf, 0xd1, + 0x0, 0xd4, 0x0, 0x0, 0xa, 0x50, 0xf, 0x0, + 0xa, 0xfe, 0xf3, 0xbe, 0xef, 0xee, 0xef, 0x0, + 0x1, 0x0, 0xe1, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x5, 0x21, 0xe0, 0xab, 0xbe, 0xdb, 0xbb, 0x40, + 0x6, 0x84, 0xb0, 0x11, 0x1a, 0x71, 0x11, 0x0, + 0x1, 0xd9, 0x60, 0x11, 0x1a, 0x61, 0x11, 0x10, + 0x0, 0x9f, 0x17, 0xcc, 0xce, 0xdc, 0xcc, 0xc0, + 0x0, 0x6f, 0x70, 0x0, 0xa, 0x50, 0x0, 0x0, + 0x2, 0xf6, 0xcd, 0x74, 0x27, 0x40, 0x0, 0x0, + 0x1e, 0x60, 0x4, 0x9b, 0xde, 0xff, 0xff, 0xf2, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5EFF "廿" */ + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x2, 0x22, 0xf3, 0x22, 0x22, 0x2f, 0x42, 0x20, + 0x2e, 0xef, 0xff, 0xee, 0xee, 0xff, 0xfe, 0xe2, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0xf3, 0x22, 0x22, 0x2f, 0x20, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0xe, 0x20, 0x0, + + /* U+5F0F "式" */ + 0x0, 0x0, 0x0, 0x0, 0xd, 0x35, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0x40, 0x8d, 0x10, + 0x2, 0x22, 0x22, 0x22, 0x2d, 0x62, 0x27, 0x30, + 0x1e, 0xee, 0xee, 0xee, 0xef, 0xee, 0xee, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x86, 0xa0, 0x0, 0x0, + 0x0, 0x11, 0xa8, 0x11, 0x4, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x97, 0x0, 0x1, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x97, 0x0, 0x0, 0xc5, 0x0, 0x0, + 0x0, 0x0, 0x97, 0x0, 0x10, 0x8a, 0x0, 0x84, + 0x0, 0x1, 0xbc, 0xbe, 0xd0, 0x2f, 0x10, 0xa5, + 0x9, 0xdf, 0xc8, 0x51, 0x0, 0x9, 0xc3, 0xd2, + 0x5, 0x30, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xa0, + + /* U+5F15 "引" */ + 0x1f, 0xff, 0xff, 0xfd, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x3d, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x3, 0xd0, + 0x0, 0x1e, 0x8, 0xff, 0xff, 0xfd, 0x0, 0x1, + 0xe0, 0xb5, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xe, + 0x20, 0x0, 0x0, 0x0, 0x1, 0xe1, 0xf3, 0x33, + 0x33, 0x30, 0x0, 0x1e, 0x3c, 0xcc, 0xcc, 0xdd, + 0x0, 0x1, 0xe0, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0x6a, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x9, 0x80, 0x0, 0x1e, 0x0, 0x1, + 0x1, 0xe4, 0x0, 0x1, 0xe0, 0x2, 0xff, 0xfb, + 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5F1F "弟" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, + 0xd, 0x60, 0x0, 0x0, 0xe5, 0x0, 0x0, 0x4, + 0xe0, 0x0, 0x7, 0xb0, 0x0, 0xe, 0xee, 0xfe, + 0xee, 0xef, 0xfe, 0xe2, 0x0, 0x0, 0x0, 0x5c, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x4c, 0x0, + 0x0, 0xe2, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0x4, 0xc0, 0x0, 0x5c, 0x0, 0x0, 0x0, + 0x8, 0x80, 0x0, 0x4c, 0x0, 0x0, 0x0, 0xc, + 0xee, 0xee, 0xef, 0xee, 0xee, 0xec, 0x1, 0x11, + 0x17, 0xfc, 0x11, 0x11, 0x5c, 0x0, 0x0, 0x8d, + 0x6c, 0x0, 0x0, 0x6b, 0x0, 0x5d, 0xa0, 0x4c, + 0x0, 0x0, 0xa8, 0x6e, 0xd5, 0x0, 0x4c, 0x4, + 0xee, 0xe2, 0x35, 0x0, 0x0, 0x4c, 0x0, 0x11, + 0x0, + + /* U+5F31 "弱" */ + 0x9, 0xff, 0xff, 0xf4, 0x2f, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x3, 0xd0, + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x3, 0xd0, + 0x0, 0xee, 0xee, 0xf4, 0xd, 0xee, 0xef, 0xd0, + 0x1, 0xf0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x3, 0xfc, 0xcc, 0xc4, 0xf, 0xcc, 0xcc, 0xc0, + 0x0, 0x52, 0x22, 0xc5, 0x4, 0x32, 0x23, 0xf0, + 0x1, 0xcc, 0x50, 0xc4, 0xa, 0xd8, 0x12, 0xf0, + 0x0, 0x3, 0xb4, 0xd3, 0x0, 0x18, 0x94, 0xe0, + 0x0, 0x4, 0x9d, 0xf1, 0x0, 0x27, 0xcd, 0xc0, + 0xa, 0xeb, 0x52, 0xf0, 0x3d, 0xd7, 0x16, 0xb0, + 0x5, 0x10, 0x6, 0xc0, 0x13, 0x0, 0xa, 0x80, + 0x0, 0x8, 0xff, 0x50, 0x0, 0x8c, 0xde, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + + /* U+5F35 "張" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf5, 0xb, 0xed, 0xdd, 0xdd, 0xb0, + 0x0, 0x0, 0xa5, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa5, 0xb, 0xca, 0xaa, 0xaa, 0x20, + 0x2, 0x22, 0xb5, 0xb, 0x73, 0x33, 0x33, 0x0, + 0xd, 0xff, 0xf5, 0xb, 0x50, 0x0, 0x0, 0x0, + 0xd, 0x31, 0x10, 0xb, 0xdc, 0xcc, 0xcc, 0x30, + 0xe, 0x10, 0x0, 0x1b, 0x61, 0x11, 0x11, 0x10, + 0xf, 0xbb, 0xb5, 0xbf, 0xbe, 0xdb, 0xbb, 0xb1, + 0x3, 0x33, 0xc4, 0x1e, 0x3, 0xc0, 0x6, 0x40, + 0x0, 0x0, 0xc3, 0x1e, 0x0, 0xb7, 0x8c, 0x10, + 0x0, 0x0, 0xd2, 0x1e, 0x0, 0x1e, 0xb0, 0x0, + 0x0, 0x0, 0xf1, 0x1e, 0x0, 0x23, 0xe5, 0x0, + 0x0, 0x3, 0xe0, 0x2f, 0x9e, 0x70, 0x3e, 0xa1, + 0x9, 0xff, 0x60, 0x5c, 0x50, 0x0, 0x1, 0x91, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F37 "強" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0x30, 0x0, 0x0, + 0xf, 0xff, 0xfc, 0x0, 0x4d, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0xd4, 0x1, 0xd1, 0x0, + 0x0, 0x0, 0x2c, 0x9, 0x80, 0x2, 0x9c, 0x0, + 0x0, 0x0, 0x2c, 0x5f, 0xef, 0xed, 0xbd, 0x60, + 0x9, 0xee, 0xfc, 0x13, 0x10, 0xc1, 0x2, 0x80, + 0xc, 0x52, 0x22, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0xe, 0x10, 0x0, 0x3f, 0xee, 0xfe, 0xef, 0x30, + 0xf, 0x54, 0x44, 0x3b, 0x0, 0xf1, 0xb, 0x30, + 0x19, 0x99, 0xae, 0x3b, 0x0, 0xf1, 0xb, 0x30, + 0x0, 0x0, 0x3d, 0x3f, 0xee, 0xfe, 0xef, 0x30, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0xf1, 0x32, 0x0, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0xf1, 0x5d, 0x0, + 0x0, 0x0, 0xa7, 0x0, 0x12, 0xf6, 0x6f, 0x70, + 0x0, 0xef, 0xc1, 0xdf, 0xdb, 0x98, 0x64, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+5F53 "当" */ + 0x3, 0x0, 0x0, 0xc5, 0x0, 0x2, 0x40, 0xa, + 0x80, 0x0, 0xc5, 0x0, 0xa, 0xa0, 0x0, 0xe3, + 0x0, 0xc5, 0x0, 0x3e, 0x10, 0x0, 0x6c, 0x0, + 0xc5, 0x0, 0xd5, 0x0, 0x0, 0x1, 0x0, 0xc5, + 0x0, 0x30, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x1, 0x11, 0x11, 0x11, 0x11, 0x15, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xd0, + 0x0, 0x11, 0x11, 0x11, 0x11, 0x15, 0xd0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xd0, 0x4, 0x44, 0x44, 0x44, + 0x44, 0x48, 0xd0, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcd, 0xd0, + + /* U+5F62 "形" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x50, + 0xd, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x6e, 0x20, + 0x0, 0xf, 0x10, 0x3d, 0x0, 0x7, 0xe3, 0x0, + 0x0, 0xf, 0x0, 0x3d, 0x2, 0xcd, 0x20, 0x0, + 0x0, 0xf, 0x0, 0x3d, 0x2, 0x90, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x3d, 0x0, 0x0, 0x2, 0xa0, + 0x0, 0xf, 0x10, 0x4d, 0x0, 0x0, 0x2e, 0x50, + 0x1f, 0xff, 0xff, 0xff, 0xf9, 0x4, 0xe6, 0x0, + 0x0, 0xf, 0x0, 0x3d, 0x0, 0x9d, 0x30, 0x0, + 0x0, 0x1f, 0x0, 0x3d, 0x1, 0x80, 0x0, 0x21, + 0x0, 0x3c, 0x0, 0x3d, 0x0, 0x0, 0x1, 0xe4, + 0x0, 0x79, 0x0, 0x3d, 0x0, 0x0, 0x2d, 0x70, + 0x0, 0xe3, 0x0, 0x3d, 0x0, 0x4, 0xe6, 0x0, + 0x7, 0xc0, 0x0, 0x3d, 0x2, 0xac, 0x30, 0x0, + 0xc, 0x20, 0x0, 0x3d, 0xc, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F71 "影" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x3, 0xfb, 0xbb, 0xbc, 0xe0, 0x0, 0x3e, 0x30, + 0x3, 0xc0, 0x0, 0x2, 0xe0, 0x2, 0xe6, 0x0, + 0x3, 0xfb, 0xbb, 0xbc, 0xe0, 0x4e, 0x70, 0x0, + 0x3, 0xc0, 0x0, 0x3, 0xe3, 0xf5, 0x0, 0x0, + 0x2, 0xaa, 0xcc, 0xaa, 0x90, 0x10, 0x1, 0x50, + 0x5, 0x55, 0xac, 0x55, 0x52, 0x0, 0x2d, 0x50, + 0x6, 0x66, 0x66, 0x66, 0x63, 0x6, 0xe4, 0x0, + 0x1, 0xcc, 0xcc, 0xcc, 0x92, 0xcb, 0x20, 0x0, + 0x1, 0xe0, 0x0, 0x5, 0xb0, 0x40, 0x0, 0x20, + 0x1, 0xfb, 0xbb, 0xbc, 0xb0, 0x0, 0x3, 0xe1, + 0x0, 0x52, 0x4c, 0x26, 0x0, 0x0, 0x2e, 0x40, + 0x1, 0xe1, 0x3c, 0xc, 0x30, 0x5, 0xe5, 0x0, + 0xc, 0x60, 0x4c, 0x3, 0xc2, 0xbe, 0x30, 0x0, + 0x3, 0xa, 0xe8, 0x0, 0x1a, 0x91, 0x0, 0x0, + + /* U+5F79 "役" */ + 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x70, 0xe, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xba, 0x0, 0xe, 0x10, 0xc, 0x40, 0x0, + 0x1d, 0x90, 0x0, 0xf, 0x0, 0xc, 0x40, 0x0, + 0x5, 0x2, 0xd0, 0x4e, 0x0, 0xc, 0x40, 0x0, + 0x0, 0xb, 0x82, 0xe7, 0x0, 0xa, 0xdb, 0xa0, + 0x0, 0x6f, 0x2f, 0xb0, 0x0, 0x0, 0x33, 0x30, + 0x4, 0xff, 0x6, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x3f, 0x8f, 0x9, 0xfe, 0xee, 0xee, 0xfb, 0x0, + 0x15, 0x1f, 0x0, 0xa8, 0x0, 0x1, 0xe2, 0x0, + 0x0, 0x1f, 0x0, 0x1e, 0x30, 0xb, 0x90, 0x0, + 0x0, 0x1f, 0x0, 0x3, 0xe5, 0xba, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x8f, 0xd1, 0x0, 0x0, + 0x0, 0x1f, 0x2, 0x7d, 0xb4, 0x9e, 0x83, 0x0, + 0x0, 0x1f, 0x7d, 0x83, 0x0, 0x2, 0x8d, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F7C "彼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x6e, 0x10, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x9, 0xd2, 0x0, 0xef, 0xff, 0xff, 0xff, 0xe0, + 0x9, 0x11, 0xb0, 0xe2, 0x1, 0xe0, 0x6, 0xa0, + 0x0, 0xa, 0x90, 0xe2, 0x1, 0xe0, 0xb, 0x50, + 0x0, 0x6f, 0x10, 0xe2, 0x2, 0xe0, 0x4, 0x0, + 0x5, 0xfe, 0x0, 0xef, 0xfe, 0xee, 0xef, 0x20, + 0x3f, 0x7e, 0x0, 0xf6, 0xb0, 0x0, 0x4c, 0x0, + 0x3, 0x2e, 0x1, 0xf0, 0xd3, 0x0, 0xc5, 0x0, + 0x0, 0x2e, 0x2, 0xd0, 0x4d, 0x16, 0xc0, 0x0, + 0x0, 0x2e, 0x6, 0xb0, 0x7, 0xce, 0x10, 0x0, + 0x0, 0x2e, 0xa, 0x60, 0x7, 0xfd, 0x30, 0x0, + 0x0, 0x2e, 0x2e, 0x15, 0xcb, 0x15, 0xe9, 0x30, + 0x0, 0x2e, 0x46, 0x6b, 0x40, 0x0, 0x17, 0xc1, + + /* U+5F80 "往" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xb0, 0x0, 0x1e, 0x20, 0x0, 0x0, + 0x0, 0x5e, 0x10, 0x0, 0x7, 0xb0, 0x0, 0x0, + 0x7, 0xe2, 0x1, 0x22, 0x23, 0xb2, 0x22, 0x10, + 0x1b, 0x10, 0x67, 0xee, 0xee, 0xfe, 0xee, 0xc0, + 0x0, 0x8, 0xc0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x5f, 0x10, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x4e, 0x4f, 0x0, 0xbc, 0xcd, 0xfc, 0xcc, 0x40, + 0x2, 0x1f, 0x0, 0x33, 0x37, 0xc3, 0x33, 0x10, + 0x0, 0x1f, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, + 0x0, 0x1f, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+5F85 "待" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x4e, 0x10, 0x11, 0x17, 0xa1, 0x11, 0x0, + 0x7, 0xe3, 0x0, 0xee, 0xef, 0xfe, 0xee, 0x50, + 0x1b, 0x10, 0x80, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x8, 0xb0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x4f, 0x2d, 0xee, 0xee, 0xee, 0xfe, 0xe3, + 0x3, 0xff, 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x3f, 0x6f, 0x0, 0x11, 0x11, 0x13, 0xe1, 0x10, + 0x16, 0xf, 0xa, 0xee, 0xee, 0xee, 0xfe, 0xe1, + 0x0, 0xf, 0x0, 0x16, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xf, 0x0, 0xd, 0x60, 0x2, 0xe0, 0x0, + 0x0, 0xf, 0x0, 0x2, 0xe2, 0x2, 0xe0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x20, 0x3, 0xe0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x6, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F88 "很" */ + 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x60, 0xcf, 0xee, 0xee, 0xfe, 0x0, + 0x1, 0xc9, 0x0, 0xc3, 0x0, 0x0, 0x2e, 0x0, + 0x1d, 0x90, 0x0, 0xc3, 0x0, 0x0, 0x2e, 0x0, + 0x5, 0x2, 0xd0, 0xce, 0xee, 0xee, 0xee, 0x0, + 0x0, 0xc, 0x80, 0xc3, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x9f, 0x0, 0xc3, 0x0, 0x0, 0x2e, 0x0, + 0x9, 0xef, 0x0, 0xce, 0xee, 0xee, 0xee, 0x0, + 0x5e, 0x2f, 0x0, 0xc4, 0xe, 0x20, 0x1, 0x10, + 0x1, 0xf, 0x0, 0xc3, 0x8, 0x90, 0x4e, 0x60, + 0x0, 0xf, 0x0, 0xc3, 0x1, 0xe9, 0xd3, 0x0, + 0x0, 0xf, 0x0, 0xc3, 0x0, 0x7e, 0x10, 0x0, + 0x0, 0xf, 0x0, 0xc3, 0x1, 0xb, 0xc1, 0x0, + 0x0, 0xf, 0x0, 0xeb, 0xde, 0x20, 0xae, 0x70, + 0x0, 0xf, 0x1, 0xd8, 0x30, 0x0, 0x4, 0xb1, + + /* U+5F8B "律" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xc0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0x6e, 0x20, 0xce, 0xef, 0xfe, 0xee, 0x10, + 0x9, 0xe3, 0x0, 0x0, 0x8, 0x80, 0xe, 0x10, + 0xc, 0x20, 0x82, 0x11, 0x18, 0x91, 0x1e, 0x30, + 0x0, 0x9, 0xb9, 0xdd, 0xde, 0xed, 0xdf, 0xd4, + 0x0, 0x5f, 0x10, 0x0, 0x8, 0x80, 0xe, 0x10, + 0x6, 0xef, 0x0, 0xee, 0xef, 0xfe, 0xef, 0x10, + 0x4e, 0x3f, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x1, 0xf, 0x2, 0xdd, 0xde, 0xed, 0xdd, 0x40, + 0x0, 0xf, 0x0, 0x11, 0x18, 0x91, 0x11, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0xf, 0xd, 0xee, 0xef, 0xfe, 0xee, 0xe2, + 0x0, 0xf, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, + + /* U+5F8C "後" */ + 0x0, 0x0, 0x30, 0x0, 0x3, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x0, 0x6d, 0x10, 0x0, 0x0, + 0x0, 0x8b, 0x0, 0x5, 0xd1, 0x1, 0xa2, 0x0, + 0xa, 0xb0, 0x0, 0x7c, 0x10, 0x2d, 0x60, 0x0, + 0x7, 0x1, 0xe5, 0xfe, 0xdf, 0xc2, 0x30, 0x0, + 0x0, 0xc, 0x60, 0x3, 0xb6, 0x0, 0xb6, 0x0, + 0x0, 0x8e, 0x4, 0xbf, 0x98, 0x9a, 0xcf, 0x30, + 0x9, 0xde, 0x5, 0x87, 0xcb, 0x32, 0x13, 0xe0, + 0x3e, 0x3e, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x50, + 0x1, 0x1e, 0x0, 0x4f, 0xed, 0xdd, 0xfa, 0x0, + 0x0, 0x1e, 0x7, 0xfb, 0x90, 0x2, 0xe2, 0x0, + 0x0, 0x1e, 0x1a, 0x20, 0x99, 0x4d, 0x40, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x2e, 0xf8, 0x0, 0x0, + 0x0, 0x1e, 0x1, 0x5b, 0xe7, 0x4b, 0xd7, 0x20, + 0x0, 0x1e, 0x2d, 0x94, 0x0, 0x0, 0x38, 0xd4, + + /* U+5F92 "徒" */ + 0x0, 0x8, 0x70, 0x0, 0x6, 0x90, 0x0, 0x0, + 0x0, 0x6c, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x8, 0xc1, 0x1, 0xee, 0xef, 0xfe, 0xee, 0x60, + 0x29, 0x2, 0xc0, 0x0, 0x6, 0x90, 0x0, 0x0, + 0x0, 0xd, 0x60, 0x0, 0x6, 0x90, 0x0, 0x0, + 0x0, 0xae, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1c, 0xce, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x69, 0x1e, 0x0, 0x84, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0xd3, 0x4, 0xeb, 0xbb, 0x60, + 0x0, 0x1e, 0x0, 0xf2, 0x4, 0xc3, 0x33, 0x10, + 0x0, 0x1e, 0x2, 0xf7, 0x4, 0xb0, 0x0, 0x0, + 0x0, 0x1e, 0x7, 0x8d, 0x44, 0xb0, 0x0, 0x0, + 0x0, 0x1e, 0x1d, 0x13, 0xec, 0xc1, 0x0, 0x0, + 0x0, 0x1e, 0x76, 0x0, 0x18, 0xde, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5F93 "従" */ + 0x0, 0x2, 0x60, 0x5, 0x0, 0x0, 0x7, 0x0, + 0x0, 0x1d, 0x50, 0xc, 0x50, 0x0, 0x5d, 0x0, + 0x1, 0xc7, 0x0, 0x4, 0xd0, 0x0, 0xc5, 0x0, + 0x2e, 0x60, 0x30, 0x0, 0xc3, 0x2, 0xc0, 0x0, + 0x3, 0x3, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xd, 0x50, 0x11, 0x12, 0xf1, 0x11, 0x10, + 0x0, 0xae, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x9, 0xee, 0x0, 0x25, 0x0, 0xf0, 0x0, 0x0, + 0x6d, 0x3e, 0x0, 0x6a, 0x0, 0xf3, 0x33, 0x20, + 0x11, 0x1e, 0x0, 0x87, 0x0, 0xfc, 0xcc, 0x80, + 0x0, 0x1e, 0x0, 0xb7, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0xec, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x1e, 0x5, 0xcb, 0x71, 0xf0, 0x0, 0x0, + 0x0, 0x1e, 0xc, 0x51, 0xdb, 0xf0, 0x0, 0x0, + 0x0, 0x1e, 0x59, 0x0, 0x8, 0xdf, 0xff, 0xf4, + + /* U+5F97 "得" */ + 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x80, 0x8e, 0xdd, 0xdd, 0xdf, 0x0, + 0x0, 0xaa, 0x0, 0x87, 0x0, 0x0, 0xf, 0x0, + 0x1c, 0x90, 0x0, 0x8e, 0xcc, 0xcc, 0xcf, 0x0, + 0x6, 0x2, 0xc0, 0x87, 0x0, 0x0, 0xf, 0x0, + 0x0, 0xc, 0x70, 0x8d, 0xaa, 0xaa, 0xaf, 0x0, + 0x0, 0x9f, 0x0, 0x12, 0x22, 0x22, 0x22, 0x0, + 0xa, 0xef, 0x6, 0xbb, 0xbb, 0xbb, 0xbb, 0xa0, + 0x7e, 0x3f, 0x1, 0x33, 0x33, 0x37, 0xc3, 0x20, + 0x12, 0x1f, 0x0, 0x0, 0x0, 0x5, 0xa0, 0x0, + 0x0, 0x1f, 0xd, 0xee, 0xee, 0xef, 0xfe, 0xe2, + 0x0, 0x1f, 0x0, 0x28, 0x0, 0x5, 0xa0, 0x0, + 0x0, 0x1f, 0x0, 0x9, 0xa0, 0x5, 0xa0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x81, 0x6, 0xa0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x7, 0xfe, 0x60, 0x0, + + /* U+5F9E "從" */ + 0x0, 0x1, 0x40, 0x1, 0x60, 0x0, 0x61, 0x0, + 0x0, 0xd, 0x60, 0x7, 0xa0, 0x1, 0xf0, 0x0, + 0x0, 0xb8, 0x0, 0xc, 0x60, 0x6, 0xc0, 0x0, + 0x2d, 0x80, 0x20, 0x1f, 0xa0, 0xb, 0xd1, 0x0, + 0x15, 0x3, 0xe1, 0x99, 0x9b, 0x3e, 0x8d, 0x10, + 0x0, 0xd, 0x55, 0xe1, 0x7, 0xe5, 0x7, 0xd1, + 0x0, 0xae, 0xc, 0x40, 0x4, 0xa0, 0x0, 0x82, + 0xa, 0xde, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x6c, 0x2e, 0x0, 0x4b, 0x1, 0xe0, 0x0, 0x0, + 0x11, 0x1e, 0x0, 0x5a, 0x1, 0xe2, 0x22, 0x10, + 0x0, 0x1e, 0x0, 0x89, 0x1, 0xfc, 0xcc, 0x70, + 0x0, 0x1e, 0x0, 0xce, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x1e, 0x2, 0xe9, 0x81, 0xe0, 0x0, 0x0, + 0x0, 0x1e, 0xc, 0x70, 0xdb, 0xe1, 0x0, 0x0, + 0x0, 0x1e, 0x4a, 0x0, 0x8, 0xdf, 0xff, 0xf3, + + /* U+5FA1 "御" */ + 0x0, 0x26, 0x4, 0x40, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x50, 0xa5, 0x0, 0x0, 0x66, 0x65, 0xa, + 0xa0, 0xf, 0xed, 0xdd, 0x1f, 0x99, 0xe8, 0xc0, + 0x36, 0xa1, 0xf1, 0x10, 0xe0, 0x1e, 0x20, 0x3e, + 0xd2, 0xe, 0x0, 0xe, 0x1, 0xe0, 0xc, 0x71, + 0x0, 0xf0, 0x0, 0xe0, 0x1e, 0x6, 0xf2, 0xbe, + 0xef, 0xfe, 0x2e, 0x1, 0xe3, 0xff, 0x20, 0x0, + 0xe0, 0x0, 0xe0, 0x1e, 0xb6, 0xc2, 0x37, 0xe, + 0x0, 0xe, 0x1, 0xe1, 0xc, 0x24, 0x90, 0xef, + 0xf1, 0xe0, 0x1e, 0x0, 0xc2, 0x49, 0xe, 0x0, + 0xe, 0x1, 0xe0, 0xc, 0x24, 0x90, 0xe0, 0x0, + 0xe1, 0x3d, 0x0, 0xc2, 0x49, 0xf, 0x46, 0x6e, + 0x4c, 0x60, 0xc, 0x3c, 0xfd, 0xb9, 0x73, 0xe0, + 0x0, 0x0, 0xc2, 0x20, 0x0, 0x0, 0xe, 0x0, + 0x0, + + /* U+5FA9 "復" */ + 0x0, 0x1, 0x50, 0x4, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x60, 0xd, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xb9, 0x0, 0x5f, 0xee, 0xee, 0xee, 0xe2, + 0x1d, 0x80, 0x11, 0xe5, 0x0, 0x0, 0x0, 0x0, + 0x16, 0x2, 0xed, 0xcc, 0xcc, 0xcc, 0xcc, 0x0, + 0x0, 0xd, 0x63, 0x2e, 0x0, 0x0, 0xe, 0x10, + 0x0, 0xae, 0x0, 0x1f, 0xbb, 0xbb, 0xbf, 0x10, + 0xb, 0xde, 0x0, 0x1e, 0x0, 0x0, 0xe, 0x10, + 0x6b, 0x2e, 0x0, 0x1d, 0xdd, 0xcc, 0xcd, 0x10, + 0x0, 0x1e, 0x0, 0x1, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x1c, 0xec, 0xcc, 0xed, 0x0, + 0x0, 0x1e, 0x4, 0xe8, 0xc3, 0x2, 0xd3, 0x0, + 0x0, 0x1e, 0x5, 0x30, 0x1c, 0xad, 0x30, 0x0, + 0x0, 0x1e, 0x0, 0x25, 0xad, 0xad, 0x94, 0x10, + 0x0, 0x1e, 0xb, 0xb8, 0x40, 0x0, 0x59, 0xd3, + + /* U+5FC3 "心" */ + 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9d, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x0, 0x2, 0x30, 0x0, 0x0, + 0x0, 0x72, 0x2e, 0x0, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0xe2, 0x2e, 0x0, 0x0, 0x0, 0xe, 0x30, + 0x1, 0xf0, 0x2e, 0x0, 0x0, 0x0, 0x8, 0xa0, + 0x4, 0xd0, 0x2e, 0x0, 0x0, 0x0, 0x2, 0xf0, + 0x9, 0x90, 0x2e, 0x0, 0x0, 0x1, 0x10, 0xd4, + 0xe, 0x50, 0x2e, 0x0, 0x0, 0x4, 0xc0, 0x99, + 0x9, 0x0, 0x2e, 0x0, 0x0, 0x5, 0xa0, 0x11, + 0x0, 0x0, 0x2f, 0x20, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xfc, 0x10, 0x0, + + /* U+5FC5 "必" */ + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xd3, 0x0, 0x0, 0x25, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0x80, 0x0, 0xb9, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xd9, 0x5, 0xe0, 0x0, + 0x0, 0x0, 0x9, 0x0, 0x1, 0x1e, 0x50, 0x0, + 0x0, 0x52, 0xf, 0x10, 0x0, 0xb9, 0x0, 0x0, + 0x0, 0xd3, 0xf, 0x10, 0x9, 0xc0, 0xb6, 0x0, + 0x2, 0xe0, 0xf, 0x10, 0x7d, 0x10, 0x3e, 0x10, + 0x7, 0xa0, 0xf, 0x17, 0xe2, 0x0, 0xa, 0x90, + 0xe, 0x30, 0xf, 0xad, 0x20, 0x0, 0x2, 0xf1, + 0x4c, 0x0, 0x1f, 0xc1, 0x0, 0x0, 0x0, 0xc7, + 0x0, 0x7, 0xff, 0x10, 0x0, 0x4, 0xb0, 0x31, + 0x4, 0xdd, 0x4f, 0x10, 0x0, 0x5, 0xb0, 0x0, + 0x2e, 0x60, 0xf, 0x41, 0x0, 0x1a, 0x80, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, 0x10, 0x0, + + /* U+5FD8 "忘" */ + 0x0, 0x0, 0x0, 0x8, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0xb, 0xcc, 0xcc, 0xcd, 0xfc, 0xcc, 0xcc, 0xa0, + 0x2, 0x3d, 0x63, 0x33, 0x33, 0x33, 0x33, 0x20, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x62, 0x76, 0x1, 0xe4, 0x0, 0x59, 0x0, + 0x0, 0xe1, 0x87, 0x0, 0x49, 0x0, 0xe, 0x30, + 0x7, 0xa0, 0x87, 0x0, 0x0, 0x6, 0x47, 0xb0, + 0x1e, 0x20, 0x89, 0x0, 0x0, 0xb, 0x61, 0xf1, + 0x2, 0x0, 0x3e, 0xff, 0xff, 0xfc, 0x10, 0x10, + + /* U+5FD9 "忙" */ + 0x0, 0x1e, 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0xd6, 0x0, 0x0, + 0x2, 0x1e, 0x70, 0x0, 0x0, 0x35, 0x0, 0x0, + 0xb, 0x3e, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0xd, 0x1e, 0x1d, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x1c, 0x1e, 0x4, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x48, 0x1e, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x6, 0xfe, 0xee, 0xee, 0xd0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5FEB "快" */ + 0x0, 0x2e, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x4, 0x3f, 0xb0, 0xdf, 0xff, 0xff, 0xfd, 0x0, + 0xb, 0x4e, 0x95, 0x0, 0xb, 0x50, 0x3d, 0x0, + 0xd, 0x2e, 0x4c, 0x0, 0xb, 0x50, 0x2d, 0x0, + 0x1c, 0x2e, 0x2, 0x0, 0xb, 0x40, 0x2d, 0x0, + 0x48, 0x2e, 0x0, 0x0, 0xc, 0x40, 0x2e, 0x0, + 0x0, 0x2e, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x2e, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x7a, 0xa7, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x1, 0xe3, 0x2e, 0x20, 0x0, + 0x0, 0x2e, 0x0, 0xc, 0x80, 0x8, 0xd1, 0x0, + 0x0, 0x2e, 0x3, 0xd9, 0x0, 0x0, 0x9e, 0x50, + 0x0, 0x2e, 0x1d, 0x50, 0x0, 0x0, 0x6, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+5FF5 "念" */ + 0x0, 0x0, 0x0, 0xa, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbc, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0x80, 0x5e, 0x60, 0x0, 0x0, + 0x0, 0x18, 0xe5, 0x46, 0x2, 0xcc, 0x40, 0x0, + 0x18, 0xfa, 0x20, 0x1a, 0xb0, 0x6, 0xec, 0x60, + 0x4a, 0x20, 0x0, 0x0, 0x50, 0x0, 0x6, 0x80, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x3, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xd7, 0x1e, 0x40, 0x0, 0x0, + 0x0, 0x90, 0xc2, 0x1d, 0x51, 0x0, 0xd1, 0x0, + 0x4, 0xc0, 0xd2, 0x3, 0xe0, 0x0, 0x7b, 0x0, + 0xa, 0x60, 0xd2, 0x0, 0x0, 0x9, 0x1d, 0x40, + 0x2e, 0x0, 0xd4, 0x0, 0x0, 0x2f, 0x5, 0xc0, + 0x25, 0x0, 0x7f, 0xff, 0xff, 0xf8, 0x0, 0x30, + + /* U+600E "怎" */ + 0x0, 0x0, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xa0, + 0x0, 0x1e, 0x31, 0x6c, 0x11, 0x11, 0x11, 0x10, + 0x0, 0xa8, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xc0, 0x0, 0x4f, 0xee, 0xee, 0xee, 0x0, + 0x9, 0x10, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xee, 0xee, 0xee, 0x50, + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x50, 0x61, 0x2d, 0xa0, 0x0, 0x84, 0x0, + 0x1, 0xe0, 0xd3, 0x0, 0xbb, 0x0, 0x6c, 0x0, + 0x6, 0xa0, 0xd3, 0x0, 0x4, 0x5, 0x3d, 0x50, + 0xe, 0x30, 0xc4, 0x0, 0x0, 0xb, 0x56, 0xd0, + 0x6, 0x0, 0x7e, 0xff, 0xff, 0xfc, 0x0, 0x60, + + /* U+6012 "怒" */ + 0x0, 0x1, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xa0, 0x0, 0xff, 0xff, 0xff, 0x60, + 0xb, 0xbe, 0xdb, 0xc7, 0x3b, 0x0, 0xd, 0x20, + 0x3, 0x8d, 0x33, 0xb5, 0xe, 0x20, 0x4d, 0x0, + 0x0, 0xd5, 0x0, 0xe0, 0x8, 0x90, 0xc6, 0x0, + 0x3, 0xf6, 0x9, 0x80, 0x0, 0xea, 0xb0, 0x0, + 0x0, 0x2a, 0xef, 0x10, 0x0, 0x9f, 0x40, 0x0, + 0x0, 0x7, 0xed, 0xb1, 0x1a, 0xc8, 0xe5, 0x0, + 0x6, 0xdb, 0x10, 0x82, 0xe7, 0x0, 0x4e, 0xc2, + 0x6, 0x30, 0x0, 0x78, 0x10, 0x0, 0x0, 0x50, + 0x0, 0x23, 0x19, 0x9, 0xe4, 0x0, 0x81, 0x0, + 0x0, 0x98, 0x2e, 0x0, 0x49, 0x0, 0x8b, 0x0, + 0x2, 0xf1, 0x2e, 0x0, 0x0, 0x39, 0xc, 0x70, + 0xc, 0x70, 0x2f, 0x0, 0x0, 0x6a, 0x3, 0xf1, + 0x7, 0x0, 0xb, 0xff, 0xff, 0xe4, 0x0, 0x61, + + /* U+6015 "怕" */ + 0x0, 0xf, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x1f, 0x10, 0x0, 0x0, + 0xf, 0x52, 0x4, 0x48, 0xd4, 0x44, 0x40, 0x93, + 0xf6, 0xa1, 0xfb, 0xbb, 0xbb, 0xce, 0xc, 0x1f, + 0x1d, 0x3f, 0x0, 0x0, 0x2, 0xe0, 0xd0, 0xf0, + 0x32, 0xf0, 0x0, 0x0, 0x2e, 0x28, 0xf, 0x0, + 0x1f, 0x0, 0x0, 0x2, 0xe0, 0x0, 0xf0, 0x1, + 0xfe, 0xee, 0xee, 0xee, 0x0, 0xf, 0x0, 0x1f, + 0x11, 0x11, 0x13, 0xe0, 0x0, 0xf0, 0x1, 0xf0, + 0x0, 0x0, 0x2e, 0x0, 0xf, 0x0, 0x1f, 0x0, + 0x0, 0x2, 0xe0, 0x0, 0xf0, 0x1, 0xf0, 0x0, + 0x0, 0x2e, 0x0, 0xf, 0x0, 0x1f, 0xdd, 0xdd, + 0xde, 0xe0, 0x0, 0xf0, 0x1, 0xf2, 0x22, 0x22, + 0x4d, + + /* U+601D "思" */ + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0xd, 0x20, 0x0, 0xe2, 0x0, 0xb, 0x50, 0x0, + 0xd2, 0x0, 0xe, 0x20, 0x0, 0xb5, 0x0, 0xd, + 0xdc, 0xcc, 0xfd, 0xcc, 0xcf, 0x50, 0x0, 0xd3, + 0x11, 0x1e, 0x31, 0x11, 0xb5, 0x0, 0xd, 0x20, + 0x0, 0xe2, 0x0, 0xb, 0x50, 0x0, 0xdc, 0xbb, + 0xbf, 0xcb, 0xbb, 0xe5, 0x0, 0x3, 0x33, 0x36, + 0x33, 0x33, 0x33, 0x10, 0x0, 0x0, 0x1, 0xda, + 0x10, 0x0, 0x0, 0x0, 0x9, 0x1a, 0x30, 0x9e, + 0x30, 0x1d, 0x10, 0x2, 0xe0, 0xc4, 0x0, 0x69, + 0x0, 0x8b, 0x0, 0x89, 0xc, 0x40, 0x0, 0x3, + 0xa0, 0xe4, 0x2f, 0x20, 0xc5, 0x0, 0x0, 0x7a, + 0x7, 0xb0, 0x40, 0x7, 0xef, 0xff, 0xfe, 0x30, + 0x2, + + /* U+6025 "急" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xfe, 0xee, 0xef, 0xc0, 0x0, 0x0, + 0x0, 0x8e, 0x30, 0x0, 0x2d, 0x20, 0x0, 0x0, + 0x1c, 0xfe, 0xdd, 0xdd, 0xef, 0xdd, 0xc0, 0x0, + 0x8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0x1, 0x11, 0x11, 0x11, 0x13, 0xe0, 0x0, + 0x0, 0x1b, 0xbb, 0xbb, 0xbb, 0xbc, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x9e, 0xee, 0xee, 0xee, 0xee, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa0, 0xd2, 0xa, 0xa0, 0x0, 0x99, 0x0, + 0x6, 0xb0, 0xe2, 0x0, 0xc6, 0x8, 0x1e, 0x30, + 0x1e, 0x30, 0xe3, 0x0, 0x10, 0x2f, 0x6, 0xb0, + 0x16, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x40, + + /* U+6027 "性" */ + 0x0, 0x2e, 0x0, 0x3, 0x10, 0xe0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0xd, 0x30, 0xf0, 0x0, 0x0, + 0x3, 0x3e, 0x80, 0x1f, 0x0, 0xf0, 0x0, 0x0, + 0xc, 0x3e, 0x86, 0x5f, 0xff, 0xff, 0xff, 0xc0, + 0xd, 0x2e, 0x1d, 0xc5, 0x1, 0xf1, 0x0, 0x0, + 0x1c, 0x2e, 0x6, 0xd0, 0x0, 0xf0, 0x0, 0x0, + 0x58, 0x2e, 0x3, 0x50, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x24, 0x44, 0xf5, 0x44, 0x10, + 0x0, 0x2e, 0x0, 0x5b, 0xbb, 0xfb, 0xbb, 0x50, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x2e, 0x1, 0x22, 0x22, 0xf2, 0x22, 0x20, + 0x0, 0x2e, 0xa, 0xee, 0xee, 0xee, 0xee, 0xe1, + + /* U+606F "息" */ + 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xed, 0xef, 0xed, 0xde, 0xd0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0xe, 0xdd, 0xdd, 0xdd, 0xdd, 0xe0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0xe, 0xba, 0xaa, 0xaa, 0xab, 0xe0, 0x0, + 0x0, 0xe, 0x32, 0x22, 0x22, 0x24, 0xe0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0xc, 0xdd, 0xde, 0xdd, 0xdd, 0xc0, 0x0, + 0x0, 0x0, 0x20, 0xd, 0x40, 0x0, 0x12, 0x0, + 0x0, 0xe1, 0xd3, 0x2, 0xe4, 0x0, 0x5d, 0x0, + 0x6, 0xb0, 0xd3, 0x0, 0x45, 0x7, 0x2b, 0x80, + 0xe, 0x30, 0xd5, 0x0, 0x0, 0x1d, 0x33, 0xe0, + 0x5, 0x0, 0x7e, 0xff, 0xff, 0xfb, 0x0, 0x0, + + /* U+60A8 "您" */ + 0x0, 0x0, 0x51, 0x3, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe1, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x6f, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x8f, 0x1, 0xe2, 0x0, 0x10, 0x8, 0x80, + 0x7, 0xff, 0xc, 0x60, 0x1, 0xf0, 0xe, 0x10, + 0x2e, 0x4f, 0x3, 0x8, 0x31, 0xf0, 0x92, 0x0, + 0x1, 0x1f, 0x0, 0x2e, 0x1, 0xf0, 0x7b, 0x0, + 0x0, 0x1f, 0x0, 0xd6, 0x1, 0xf0, 0xc, 0x50, + 0x0, 0x1f, 0x3, 0x80, 0x13, 0xf0, 0x4, 0x70, + 0x0, 0x1e, 0x0, 0x3, 0xac, 0x80, 0x0, 0x0, + 0x0, 0x10, 0x41, 0x1d, 0x60, 0x0, 0x23, 0x0, + 0x0, 0xd3, 0xc4, 0x1, 0xe4, 0x0, 0x4d, 0x0, + 0x4, 0xd0, 0xc4, 0x0, 0x36, 0x5, 0x5b, 0x60, + 0xd, 0x60, 0xc6, 0x0, 0x0, 0xa, 0x64, 0xd0, + 0x7, 0x0, 0x6e, 0xff, 0xff, 0xfd, 0x10, 0x40, + + /* U+60AA "悪" */ + 0xc, 0xee, 0xef, 0xfe, 0xef, 0xfe, 0xee, 0xd0, + 0x0, 0x0, 0x5, 0xa0, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x11, 0x16, 0xb1, 0x1d, 0x41, 0x11, 0x0, + 0x0, 0xbd, 0xcd, 0xec, 0xcf, 0xdc, 0xdb, 0x0, + 0x0, 0xb4, 0x5, 0xa0, 0xd, 0x30, 0x4b, 0x0, + 0x0, 0xb5, 0x17, 0xb1, 0x1d, 0x41, 0x6b, 0x0, + 0x0, 0x8b, 0xbd, 0xeb, 0xbf, 0xcb, 0xb8, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0xd, 0x30, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xab, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x57, 0x1c, 0x5, 0xe4, 0x3, 0xc1, 0x0, + 0x0, 0xc5, 0x1e, 0x0, 0x20, 0x23, 0x7e, 0x20, + 0xa, 0xc0, 0x1f, 0x0, 0x0, 0x79, 0x7, 0xd0, + 0x8, 0x0, 0xc, 0xff, 0xff, 0xe3, 0x0, 0x60, + + /* U+60B2 "悲" */ + 0x0, 0x0, 0x1, 0xd0, 0xe, 0x20, 0x0, 0x0, + 0xb, 0xee, 0xef, 0xe0, 0xe, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x1, 0xe0, 0xe, 0x20, 0x0, 0x0, + 0x3, 0xbb, 0xbb, 0xe0, 0xe, 0xcb, 0xbb, 0x30, + 0x0, 0x33, 0x34, 0xe0, 0xe, 0x53, 0x33, 0x0, + 0x0, 0x0, 0x1, 0xe0, 0xe, 0x20, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xe0, 0xe, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x1, 0xe0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xc0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x24, 0x2d, 0xa, 0x80, 0x2, 0xb0, 0x0, + 0x0, 0xa7, 0x2e, 0x0, 0xc7, 0x0, 0xa9, 0x0, + 0x3, 0xe0, 0x2e, 0x0, 0x17, 0xb, 0x1e, 0x40, + 0xd, 0x60, 0x2f, 0x0, 0x0, 0x3e, 0x5, 0xe0, + 0x5, 0x0, 0xb, 0xff, 0xff, 0xf7, 0x0, 0x30, + + /* U+60C5 "情" */ + 0x0, 0xc3, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x0, 0xc3, 0xb, 0xdd, 0xdf, 0xed, 0xdd, 0x80, + 0x1, 0xc9, 0x40, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x1b, 0xc6, 0xb6, 0xcc, 0xcf, 0xdc, 0xcc, 0x20, + 0x3a, 0xc3, 0x80, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x67, 0xc3, 0x5d, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, + 0xa4, 0xc3, 0x0, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x10, 0xc3, 0x3, 0xfb, 0xbb, 0xbb, 0xcc, 0x0, + 0x0, 0xc3, 0x3, 0xc0, 0x0, 0x0, 0x4c, 0x0, + 0x0, 0xc3, 0x3, 0xfc, 0xcc, 0xcc, 0xdc, 0x0, + 0x0, 0xc3, 0x3, 0xc0, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0xc3, 0x3, 0xfd, 0xdd, 0xdd, 0xdc, 0x0, + 0x0, 0xc3, 0x3, 0xc0, 0x0, 0x0, 0x4c, 0x0, + 0x0, 0xc3, 0x3, 0xc0, 0x0, 0x2e, 0xe8, 0x0, + + /* U+60F3 "想" */ + 0x0, 0x1, 0xe0, 0x0, 0xce, 0xee, 0xef, 0x30, + 0x33, 0x4f, 0x33, 0x1c, 0x20, 0x0, 0xc3, 0x1f, + 0xff, 0xff, 0xf8, 0xc2, 0x0, 0xc, 0x30, 0x0, + 0x9e, 0x0, 0xc, 0xed, 0xdd, 0xf3, 0x0, 0x2d, + 0xfa, 0x10, 0xc2, 0x0, 0xc, 0x30, 0xc, 0x5e, + 0x4e, 0x4c, 0xdd, 0xdd, 0xf3, 0xa, 0xa1, 0xe0, + 0x32, 0xc2, 0x0, 0xc, 0x32, 0xb0, 0x1e, 0x0, + 0xc, 0x20, 0x0, 0xc3, 0x0, 0x1, 0xe0, 0x0, + 0xbe, 0xee, 0xee, 0x30, 0x1, 0x4, 0x1, 0xd3, + 0x0, 0x2, 0x10, 0x0, 0xe1, 0x6a, 0x3, 0xe2, + 0x0, 0x8a, 0x0, 0x5c, 0x6, 0xa0, 0x5, 0x21, + 0x80, 0xd5, 0xd, 0x40, 0x6b, 0x0, 0x0, 0x5b, + 0x5, 0xc0, 0x40, 0x2, 0xdf, 0xff, 0xfe, 0x50, + 0x0, + + /* U+6108 "愈" */ + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xeb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0x80, 0x4d, 0x91, 0x0, 0x0, 0x39, + 0xeb, 0xc9, 0x99, 0x9a, 0xdb, 0x61, 0x5d, 0x71, + 0x3, 0x33, 0x33, 0x10, 0x39, 0x90, 0xb, 0xcb, + 0xbc, 0x60, 0x71, 0xc, 0x30, 0x0, 0xd4, 0x33, + 0x87, 0xd, 0x20, 0xc3, 0x0, 0xd, 0x76, 0x6a, + 0x70, 0xd2, 0xc, 0x30, 0x0, 0xdb, 0xaa, 0xc7, + 0xd, 0x20, 0xc3, 0x0, 0xd, 0x10, 0x6, 0x70, + 0x40, 0xd, 0x30, 0x0, 0xc1, 0x6, 0xb4, 0x0, + 0x3d, 0xb0, 0x0, 0x3, 0x21, 0x83, 0xd7, 0x0, + 0x26, 0x0, 0x0, 0xd3, 0x1e, 0x0, 0x94, 0x42, + 0xc6, 0x0, 0x9a, 0x1, 0xf0, 0x0, 0xb, 0x41, + 0xe2, 0x8, 0x0, 0xc, 0xff, 0xff, 0xd0, 0x5, + 0x30, + + /* U+610F "意" */ + 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x0, 0x0, 0x0, 0x1d, 0xde, + 0xed, 0xdd, 0xde, 0xed, 0xd1, 0x0, 0x7, 0xa0, + 0x0, 0x9, 0x80, 0x0, 0x68, 0x89, 0xf8, 0x88, + 0x8f, 0x98, 0x87, 0x34, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, + 0x0, 0x0, 0xe1, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0xec, 0xbb, 0xbb, 0xbb, 0xcf, 0x0, 0x0, + 0xe1, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0xbc, + 0xcc, 0xec, 0xcc, 0xcc, 0x0, 0x2, 0x51, 0x71, + 0xc9, 0x0, 0x8, 0x10, 0xa, 0x72, 0xd0, 0x7, + 0x73, 0x36, 0xc0, 0x6d, 0x2, 0xe0, 0x0, 0x8, + 0x80, 0x99, 0x62, 0x0, 0xcf, 0xee, 0xee, 0x20, + 0x12, + + /* U+611A "愚" */ + 0x0, 0xf, 0xcc, 0xcd, 0xfc, 0xcc, 0xf0, 0x0, + 0x0, 0xd, 0x0, 0x3, 0xd0, 0x0, 0xf0, 0x0, + 0x0, 0xf, 0xcc, 0xcd, 0xfc, 0xcc, 0xf0, 0x0, + 0x0, 0xe, 0x44, 0x47, 0xe4, 0x44, 0xf0, 0x0, + 0x0, 0x6, 0x66, 0x68, 0xe6, 0x66, 0x60, 0x0, + 0x1, 0xcc, 0xcc, 0xcd, 0xfc, 0xcc, 0xcc, 0x20, + 0x1, 0xe0, 0x0, 0x3, 0xd0, 0x81, 0xd, 0x20, + 0x1, 0xe2, 0x77, 0x8a, 0xe9, 0xcc, 0xd, 0x20, + 0x1, 0xe2, 0x76, 0x65, 0x54, 0x47, 0x4e, 0x20, + 0x1, 0xd0, 0x0, 0x4d, 0x40, 0x2, 0xdb, 0x0, + 0x0, 0x63, 0xa4, 0x3, 0xca, 0x10, 0x66, 0x0, + 0x0, 0xe2, 0xb4, 0x0, 0x7, 0x26, 0x2e, 0x30, + 0xa, 0x90, 0xb5, 0x0, 0x0, 0x2e, 0x6, 0xd0, + 0x7, 0x0, 0x6e, 0xff, 0xff, 0xf7, 0x0, 0x70, + + /* U+611B "愛" */ + 0x0, 0x0, 0x0, 0x1, 0x34, 0x68, 0xa1, 0x0, + 0x3d, 0xee, 0xee, 0xda, 0x97, 0x74, 0x0, 0x0, + 0xb, 0x50, 0x3c, 0x0, 0xc, 0x60, 0x0, 0x0, + 0x4e, 0x0, 0xc2, 0x6, 0xb0, 0x0, 0xd, 0xee, + 0xfe, 0xee, 0xee, 0xfe, 0xee, 0x40, 0xe1, 0x0, + 0x7, 0xa1, 0x0, 0x0, 0xc4, 0xd, 0x1a, 0x1c, + 0x4, 0xa0, 0x1c, 0x2c, 0x40, 0x5, 0xc0, 0xf0, + 0x0, 0x48, 0x4d, 0x20, 0x3, 0xd2, 0xa, 0xec, + 0xcd, 0x40, 0x5a, 0x0, 0x1, 0x1, 0xb8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xde, 0xcc, 0xcc, + 0xe9, 0x0, 0x0, 0x19, 0xd9, 0xb1, 0x0, 0x7d, + 0x10, 0x0, 0xb, 0x70, 0x4, 0xd7, 0xcb, 0x10, + 0x0, 0x0, 0x0, 0x4, 0x8d, 0xce, 0xa6, 0x20, + 0x0, 0x1b, 0xdd, 0xb6, 0x10, 0x4, 0xad, 0xfd, + 0x60, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x21, + + /* U+611F "感" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0x64, 0x95, 0x0, + 0x0, 0xde, 0xee, 0xee, 0xef, 0xfe, 0xef, 0xe2, + 0x0, 0xe1, 0x0, 0x0, 0x5, 0xa0, 0x0, 0x0, + 0x0, 0xe5, 0xcc, 0xcc, 0xc2, 0xd0, 0x1e, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x0, 0xe1, 0x99, 0x0, + 0x1, 0xe1, 0xec, 0xcd, 0xa0, 0xa7, 0xf2, 0x0, + 0x2, 0xc1, 0xb0, 0x2, 0xb0, 0x5f, 0x70, 0x10, + 0x6, 0x91, 0xc3, 0x35, 0xb0, 0xaf, 0x40, 0xa3, + 0xc, 0x31, 0xaa, 0xaa, 0x8b, 0xb5, 0xd4, 0xd1, + 0x19, 0x0, 0x10, 0x5, 0x7, 0x0, 0x4b, 0x80, + 0x0, 0x61, 0xe2, 0x8, 0xb0, 0x0, 0x69, 0x0, + 0x2, 0xe0, 0xe2, 0x0, 0x88, 0x6, 0x4e, 0x30, + 0xc, 0x60, 0xe3, 0x0, 0x0, 0xc, 0x46, 0xb0, + 0x7, 0x0, 0x8e, 0xee, 0xee, 0xeb, 0x0, 0x20, + + /* U+614B "態" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x81, 0x30, 0xe, 0x10, 0x38, 0x10, + 0x1, 0xb7, 0x3, 0xd4, 0xe, 0x9c, 0xa5, 0x0, + 0xc, 0xfd, 0xdc, 0xbd, 0x3e, 0x40, 0x0, 0x90, + 0x1, 0x0, 0x0, 0x3, 0x3e, 0x52, 0x25, 0xc0, + 0x1, 0xfb, 0xbb, 0xcd, 0x7, 0xbb, 0xbb, 0x40, + 0x1, 0xf8, 0x88, 0x9d, 0xe, 0x10, 0x6, 0x10, + 0x1, 0xe2, 0x22, 0x4d, 0xe, 0x6a, 0xd8, 0x20, + 0x1, 0xfb, 0xbb, 0xcd, 0xe, 0x83, 0x0, 0x40, + 0x1, 0xe0, 0x0, 0x2d, 0xe, 0x10, 0x1, 0xe0, + 0x1, 0xd0, 0x1c, 0xc8, 0x9, 0xee, 0xee, 0x80, + 0x0, 0x80, 0x62, 0x5, 0xb0, 0x0, 0xa, 0x0, + 0x4, 0xc0, 0xb4, 0x0, 0x93, 0x15, 0xb, 0x60, + 0xd, 0x40, 0xb5, 0x0, 0x0, 0x5b, 0x4, 0xd0, + 0x5, 0x0, 0x6e, 0xee, 0xee, 0xe4, 0x0, 0x50, + + /* U+6163 "慣" */ + 0x0, 0x69, 0x0, 0x6e, 0xcd, 0xec, 0xcf, 0x10, + 0x0, 0x69, 0x1, 0x87, 0x4, 0xa0, 0xf, 0x10, + 0x3, 0x69, 0x7b, 0xfd, 0xcd, 0xec, 0xcf, 0xd6, + 0xc, 0x69, 0xc0, 0xb7, 0x49, 0xa4, 0x5e, 0x0, + 0xc, 0x69, 0x92, 0x57, 0x77, 0x77, 0x76, 0x0, + 0x2a, 0x69, 0x21, 0xbc, 0xcc, 0xcc, 0xcc, 0x20, + 0x55, 0x69, 0x0, 0xe1, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x69, 0x0, 0xec, 0xbb, 0xbb, 0xbf, 0x30, + 0x0, 0x69, 0x0, 0xe1, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x69, 0x0, 0xec, 0xbb, 0xbb, 0xbf, 0x30, + 0x0, 0x69, 0x0, 0xe1, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x69, 0x0, 0xbc, 0xdc, 0xcd, 0xcc, 0x20, + 0x0, 0x69, 0x0, 0x4c, 0x80, 0x5, 0xc7, 0x10, + 0x0, 0x69, 0x1d, 0x92, 0x0, 0x0, 0x7, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6167 "慧" */ + 0x8b, 0xcf, 0xbb, 0x1b, 0xbd, 0xeb, 0xb4, 0x0, + 0x2d, 0x0, 0x0, 0x5, 0xa0, 0x0, 0x4b, 0xcf, + 0xbb, 0x7, 0xbd, 0xeb, 0xb0, 0x44, 0x6e, 0x44, + 0x13, 0x38, 0xb3, 0x32, 0x88, 0x9f, 0x88, 0x49, + 0x9b, 0xd9, 0x95, 0x7, 0xdf, 0xcc, 0xcc, 0xcf, + 0xfc, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x20, 0x1, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0x20, 0x9, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x20, 0x2, 0x4, + 0x40, 0xc5, 0x0, 0x4, 0x20, 0xd, 0x37, 0x90, + 0x1c, 0x30, 0x45, 0xd0, 0x5c, 0x7, 0x90, 0x0, + 0x3, 0xc0, 0xb7, 0x63, 0x3, 0xee, 0xee, 0xef, + 0x60, 0x37, + + /* U+616E "慮" */ + 0x0, 0x0, 0x0, 0xe, 0xdc, 0xcc, 0xc8, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xdd, 0xdd, 0xdf, 0xdd, 0xdd, 0xdd, 0x70, + 0x0, 0xf0, 0x0, 0xe, 0x33, 0x45, 0x1e, 0x30, + 0x0, 0xf2, 0xba, 0xaf, 0x87, 0x65, 0x17, 0x50, + 0x0, 0xf0, 0x0, 0x9, 0xba, 0xaa, 0xac, 0x60, + 0x0, 0xf0, 0x45, 0x55, 0x55, 0x55, 0x50, 0x0, + 0x1, 0xf0, 0xe5, 0x44, 0xf5, 0x44, 0xe2, 0x0, + 0x1, 0xe0, 0xea, 0xaa, 0xfa, 0xaa, 0xf2, 0x0, + 0x2, 0xd0, 0xe2, 0x11, 0xe2, 0x11, 0xd2, 0x0, + 0x4, 0xb0, 0x78, 0x8e, 0xb8, 0x88, 0x81, 0x0, + 0x8, 0x82, 0x85, 0x83, 0xc6, 0x0, 0xc4, 0x0, + 0xd, 0x4a, 0x55, 0x90, 0x0, 0x38, 0x2d, 0x50, + 0x2d, 0x58, 0x2, 0xed, 0xdd, 0xd5, 0x2, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+61C9 "應" */ + 0x0, 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, + 0x0, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe6, + 0x0, 0xf0, 0x4, 0xa0, 0x84, 0x49, 0x0, 0x0, + 0x0, 0xf0, 0xd, 0x33, 0xf9, 0x8e, 0x98, 0x70, + 0x0, 0xf0, 0xbd, 0x1d, 0xc2, 0x2e, 0x32, 0x20, + 0x0, 0xfb, 0xbd, 0xca, 0xea, 0xaf, 0xaa, 0x70, + 0x0, 0xf5, 0x1d, 0x12, 0xd5, 0x5e, 0x65, 0x40, + 0x1, 0xe0, 0x1d, 0x2, 0xd4, 0x4e, 0x54, 0x30, + 0x2, 0xc0, 0x1d, 0x2, 0xeb, 0xbf, 0xcb, 0xb4, + 0x3, 0xb0, 0x9, 0x1, 0xa4, 0x0, 0x0, 0x0, + 0x6, 0x90, 0x26, 0xa, 0x19, 0xc2, 0x46, 0x0, + 0x9, 0x60, 0xa6, 0xf, 0x0, 0x32, 0x2c, 0x40, + 0xe, 0x26, 0xd0, 0xf, 0x0, 0x4, 0xb1, 0xd1, + 0x1b, 0x7, 0x10, 0xc, 0xfe, 0xee, 0x50, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+61F8 "懸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0xdb, 0xbb, 0xe4, 0x48, 0xac, 0xca, 0x30, + 0x0, 0xd5, 0x55, 0xb4, 0x34, 0xa8, 0x0, 0x0, + 0x0, 0xd5, 0x55, 0xb4, 0x5, 0xa0, 0x6b, 0x0, + 0x0, 0xd9, 0x99, 0xd4, 0x2f, 0xce, 0xb0, 0x0, + 0x0, 0xd5, 0x55, 0xb4, 0x1, 0x98, 0x9, 0x10, + 0x0, 0xd5, 0x44, 0xb4, 0x4e, 0xc8, 0xad, 0xb0, + 0xa, 0xdb, 0xcb, 0xcc, 0x46, 0x4b, 0x41, 0x71, + 0x0, 0x73, 0x95, 0x91, 0xc, 0x3a, 0x3c, 0x30, + 0x5, 0xc0, 0x94, 0x5a, 0x99, 0xb, 0x31, 0xd0, + 0x7, 0x1c, 0xd2, 0x4, 0x31, 0xdc, 0x10, 0x10, + 0x0, 0x22, 0x26, 0xa, 0xc1, 0x0, 0x71, 0x0, + 0x0, 0xc4, 0x3c, 0x0, 0x68, 0x1, 0x6d, 0x10, + 0x7, 0xb0, 0x3c, 0x0, 0x0, 0x4a, 0x7, 0xc0, + 0x8, 0x10, 0x1d, 0xed, 0xde, 0xe5, 0x0, 0x71, + + /* U+6210 "成" */ + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xb, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x6c, 0x10, + 0x0, 0xcd, 0xdd, 0xdd, 0xef, 0xdd, 0xdd, 0xd2, + 0x0, 0xe5, 0x22, 0x22, 0x3f, 0x32, 0x22, 0x20, + 0x0, 0xe3, 0x0, 0x0, 0xe, 0x20, 0x1, 0x0, + 0x0, 0xe6, 0x33, 0x31, 0xc, 0x40, 0x2f, 0x0, + 0x0, 0xed, 0xcc, 0xf5, 0xa, 0x60, 0x89, 0x0, + 0x0, 0xf2, 0x0, 0xc4, 0x8, 0x91, 0xe2, 0x0, + 0x0, 0xf1, 0x0, 0xc4, 0x4, 0xc9, 0xa0, 0x0, + 0x1, 0xf0, 0x0, 0xd3, 0x1, 0xfe, 0x10, 0x0, + 0x3, 0xe0, 0x11, 0xf1, 0x3, 0xf7, 0x0, 0x72, + 0x7, 0xa2, 0xee, 0x90, 0x4e, 0xad, 0x0, 0xb3, + 0xe, 0x50, 0x0, 0x9, 0xe3, 0xc, 0xa2, 0xe0, + 0x3d, 0x0, 0x0, 0x5b, 0x10, 0x1, 0xbf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6211 "我" */ + 0x0, 0x0, 0x36, 0xab, 0xf, 0x25, 0x60, 0x0, + 0x9, 0xdd, 0xeb, 0x40, 0xe, 0x31, 0xc8, 0x0, + 0x1, 0x0, 0x97, 0x0, 0xd, 0x30, 0xc, 0x60, + 0x0, 0x0, 0x97, 0x0, 0xc, 0x40, 0x0, 0x0, + 0x1d, 0xdd, 0xfe, 0xdd, 0xdf, 0xed, 0xdd, 0xd1, + 0x2, 0x22, 0xa8, 0x22, 0x2a, 0x92, 0x22, 0x20, + 0x0, 0x0, 0x97, 0x0, 0x7, 0xa0, 0x1d, 0x10, + 0x0, 0x0, 0x99, 0x59, 0x54, 0xc0, 0xc8, 0x0, + 0x5, 0x8b, 0xfe, 0xa6, 0x11, 0xf8, 0xd0, 0x0, + 0x1c, 0x95, 0xa7, 0x0, 0x0, 0xde, 0x10, 0x0, + 0x0, 0x0, 0x97, 0x0, 0x8, 0xfa, 0x0, 0x63, + 0x0, 0x0, 0x97, 0x2, 0xbb, 0x3f, 0x10, 0xa4, + 0x0, 0x11, 0xb7, 0x4e, 0x60, 0x9, 0xc2, 0xd2, + 0x1, 0xff, 0xd2, 0x2, 0x0, 0x0, 0x9f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6216 "或" */ + 0x0, 0x0, 0x0, 0x1, 0xf0, 0x89, 0x20, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x10, 0x3c, 0x20, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1, 0x11, + 0x11, 0x11, 0x1e, 0x41, 0x11, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xd4, 0x0, 0x30, 0x0, 0xee, 0xee, + 0xf8, 0xb, 0x60, 0x2f, 0x10, 0xe, 0x10, 0x7, + 0x80, 0x97, 0x8, 0x90, 0x0, 0xe1, 0x0, 0x78, + 0x7, 0xa0, 0xe3, 0x0, 0xe, 0x32, 0x29, 0x80, + 0x3d, 0x8a, 0x0, 0x0, 0xbc, 0xcc, 0xc6, 0x0, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x30, 0x2f, + 0x80, 0x5, 0x12, 0x58, 0xbd, 0xda, 0x5e, 0x9e, + 0x0, 0xb4, 0xa9, 0x63, 0x1, 0x9d, 0x20, 0xbb, + 0x3e, 0x10, 0x0, 0x0, 0x69, 0x0, 0x1, 0xaf, + 0x90, + + /* U+6226 "戦" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x2, 0xd0, 0x5, 0xb0, 0xc3, 0x56, 0x0, + 0xb, 0x50, 0xd2, 0xd, 0x40, 0xb4, 0xc, 0x50, + 0x4, 0x70, 0x51, 0x48, 0x0, 0xa5, 0x2, 0xa0, + 0xa, 0xdd, 0xdd, 0xdd, 0x60, 0x97, 0x35, 0x72, + 0xc, 0x20, 0xa4, 0x7, 0xbd, 0xff, 0xfc, 0xa2, + 0xc, 0x30, 0xa5, 0x8, 0x97, 0x99, 0x0, 0x0, + 0xc, 0xcc, 0xed, 0xce, 0x70, 0x5b, 0x6, 0x90, + 0xc, 0x20, 0xa4, 0x7, 0x70, 0x3d, 0xd, 0x20, + 0xc, 0xdd, 0xfe, 0xde, 0x70, 0xf, 0x7a, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0xc, 0xe1, 0x0, + 0x4c, 0xcc, 0xed, 0xcc, 0xc0, 0x2e, 0x90, 0x23, + 0x12, 0x22, 0xc7, 0x22, 0x22, 0xe9, 0xe0, 0x58, + 0x0, 0x0, 0xb5, 0x0, 0x6e, 0x50, 0xca, 0xb4, + 0x0, 0x0, 0xb5, 0x2, 0xb2, 0x0, 0x2c, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6230 "戰" */ + 0xc, 0xcd, 0x7b, 0xcd, 0x80, 0xc3, 0x78, 0x0, + 0xc, 0x6, 0x7b, 0x14, 0x80, 0xb4, 0xc, 0x50, + 0xc, 0x9b, 0x7b, 0x9b, 0x80, 0xb5, 0x2, 0xb0, + 0x2, 0x33, 0x12, 0x33, 0x10, 0xa6, 0x13, 0x51, + 0x9, 0xdd, 0xdd, 0xdd, 0x9b, 0xef, 0xec, 0xa3, + 0xa, 0x30, 0xa4, 0x8, 0x84, 0x89, 0x2, 0x40, + 0xa, 0xdc, 0xed, 0xce, 0x60, 0x5a, 0x8, 0x70, + 0xa, 0x40, 0xa5, 0x8, 0x60, 0x3c, 0xd, 0x10, + 0xa, 0x41, 0xa5, 0x19, 0x60, 0x1f, 0x6a, 0x0, + 0x8, 0xcc, 0xed, 0xcc, 0x50, 0xe, 0xe2, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0xd, 0x90, 0x0, + 0x5e, 0xee, 0xff, 0xee, 0xe1, 0xbe, 0xc0, 0x57, + 0x0, 0x0, 0xb5, 0x0, 0x6e, 0x90, 0xd8, 0xb4, + 0x0, 0x0, 0xb5, 0x1, 0xa3, 0x0, 0x3d, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+623B "戻" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xee, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0x97, 0x0, 0x0, 0x0, + 0x0, 0xf1, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x2, 0xe0, 0x0, 0x5, 0xfc, 0x0, 0x0, 0x0, + 0x6, 0xa0, 0x0, 0x1d, 0x4b, 0x90, 0x0, 0x0, + 0xc, 0x50, 0x2, 0xc9, 0x1, 0xcb, 0x10, 0x0, + 0x4e, 0x4, 0x9e, 0x70, 0x0, 0x9, 0xf9, 0x40, + 0x24, 0x2c, 0x71, 0x0, 0x0, 0x0, 0x28, 0xb0, + + /* U+623F "房" */ + 0x0, 0x0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x0, + 0xce, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x0, 0xd, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0xd, 0xfe, + 0xee, 0xee, 0xee, 0xee, 0xe0, 0x0, 0xd3, 0x0, + 0x0, 0xb3, 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x4, 0xb0, 0x0, 0x0, 0x0, 0xf5, 0xee, 0xee, + 0xee, 0xee, 0xee, 0x80, 0xf, 0x0, 0x2, 0xe0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x5f, 0xbb, + 0xbb, 0xb6, 0x0, 0x6b, 0x0, 0xb, 0x72, 0x22, + 0x2a, 0x60, 0xa, 0x70, 0x4, 0xe0, 0x0, 0x0, + 0xb5, 0x1, 0xf2, 0x6, 0xe3, 0x0, 0x0, 0xe, + 0x20, 0x5a, 0xa, 0xb2, 0x0, 0xa, 0xde, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6240 "所" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x1, 0x47, 0xca, 0x0, 0x14, 0x8c, 0xe1, + 0x2, 0xee, 0xb8, 0x40, 0x1e, 0xeb, 0x83, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x2, 0xe6, 0x66, 0x60, 0x2e, 0x0, 0x0, 0x0, + 0x2, 0xf9, 0x99, 0xf1, 0x2e, 0x0, 0x0, 0x0, + 0x2, 0xd0, 0x0, 0xe1, 0x2f, 0xff, 0xff, 0xf9, + 0x3, 0xd0, 0x0, 0xe1, 0x2e, 0x0, 0x5c, 0x0, + 0x3, 0xfe, 0xee, 0xf1, 0x3e, 0x0, 0x4c, 0x0, + 0x4, 0xc0, 0x0, 0x0, 0x4d, 0x0, 0x4c, 0x0, + 0x5, 0xb0, 0x0, 0x0, 0x6a, 0x0, 0x4c, 0x0, + 0x7, 0x90, 0x0, 0x0, 0xa7, 0x0, 0x4c, 0x0, + 0xa, 0x60, 0x0, 0x1, 0xf1, 0x0, 0x4c, 0x0, + 0xe, 0x10, 0x0, 0xb, 0xa0, 0x0, 0x4c, 0x0, + 0x1a, 0x0, 0x0, 0x2c, 0x0, 0x0, 0x4c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+624B "手" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, + 0x0, 0x1, 0x34, 0x57, 0x8b, 0xdf, 0xb3, 0x0, + 0x0, 0xed, 0xcb, 0xac, 0xb4, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x19, 0x91, 0x11, 0x11, 0x10, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x19, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfd, 0x30, 0x0, 0x0, 0x0, + + /* U+624D "才" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x99, 0x0, 0x0, 0x2, + 0x22, 0x22, 0x22, 0x2a, 0xa2, 0x22, 0x20, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1, 0xed, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb9, 0x99, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8d, 0x9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7e, + 0x10, 0x99, 0x0, 0x0, 0x0, 0x0, 0x7e, 0x20, + 0x9, 0x90, 0x0, 0x0, 0x0, 0xae, 0x20, 0x0, + 0x99, 0x0, 0x0, 0x4, 0xdc, 0x10, 0x0, 0x9, + 0x90, 0x0, 0x2, 0xf8, 0x0, 0x0, 0x0, 0x99, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x11, 0x1a, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6253 "打" */ + 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x70, 0x2c, 0xcc, 0xcc, 0xcc, 0xc8, + 0x0, 0xa, 0x70, 0x12, 0x22, 0x27, 0xd2, 0x22, + 0x1f, 0xff, 0xff, 0xb0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x9, 0x72, 0x50, 0x0, 0x5, 0xc0, 0x0, + 0x1, 0x5c, 0xfd, 0x80, 0x0, 0x5, 0xc0, 0x0, + 0x1f, 0xcd, 0x80, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0xa, 0x70, 0x0, 0x0, 0x6, 0xc0, 0x0, + 0x7, 0xfe, 0x30, 0x0, 0x6f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+6255 "払" */ + 0x0, 0x9, 0x70, 0x0, 0x2, 0x50, 0x0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x7, 0xa0, 0x0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0xa, 0x60, 0x0, 0x0, + 0xe, 0xff, 0xff, 0x60, 0xe, 0x30, 0x0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x2f, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x6b, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x72, 0x30, 0xa7, 0x3, 0x30, 0x0, + 0x1, 0x5c, 0xfd, 0x50, 0xf3, 0x6, 0xb0, 0x0, + 0xe, 0xbc, 0x80, 0x4, 0xe0, 0x0, 0xf3, 0x0, + 0x0, 0x9, 0x70, 0x9, 0x90, 0x0, 0x8a, 0x0, + 0x0, 0x9, 0x70, 0xf, 0x30, 0x0, 0x2f, 0x10, + 0x0, 0x9, 0x70, 0x6d, 0x13, 0x68, 0xaf, 0x80, + 0x0, 0xa, 0x70, 0xdf, 0xeb, 0x96, 0x46, 0xd0, + 0x6, 0xfe, 0x30, 0x21, 0x0, 0x0, 0x0, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+627E "找" */ + 0x0, 0xe, 0x20, 0x0, 0x5a, 0x7, 0x10, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x4c, 0x6, 0xd1, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x3d, 0x0, 0x69, 0x0, + 0x3f, 0xff, 0xff, 0x20, 0x1f, 0x24, 0x68, 0x90, + 0x0, 0xe, 0x20, 0x7d, 0xff, 0xdb, 0x97, 0x60, + 0x0, 0xe, 0x20, 0x12, 0xd, 0x30, 0x2, 0x0, + 0x0, 0xe, 0x23, 0x10, 0xb, 0x60, 0x2e, 0x0, + 0x2, 0x6f, 0xfc, 0x20, 0x8, 0x90, 0xb7, 0x0, + 0x4e, 0xaf, 0x20, 0x0, 0x4, 0xd7, 0xc0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0xfe, 0x10, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x7, 0xf8, 0x0, 0x43, + 0x0, 0xe, 0x20, 0x1, 0xbd, 0x6e, 0x10, 0x86, + 0x0, 0xe, 0x20, 0x8f, 0x90, 0xa, 0xc3, 0xd3, + 0xb, 0xfc, 0x0, 0x42, 0x0, 0x0, 0x9f, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6280 "技" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x9a, 0xab, 0xfb, 0xaa, 0xa0, + 0x1f, 0xff, 0xfd, 0x33, 0x34, 0xf3, 0x33, 0x30, + 0x0, 0xf, 0x10, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x12, 0x22, 0xf2, 0x22, 0x0, + 0x0, 0xf, 0x10, 0x7f, 0xdd, 0xdd, 0xdf, 0x50, + 0x0, 0x3f, 0xce, 0xb, 0x60, 0x0, 0x3d, 0x0, + 0x2f, 0xcf, 0x40, 0x3, 0xe0, 0x0, 0xc6, 0x0, + 0x1, 0xf, 0x10, 0x0, 0x9a, 0x9, 0xa0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0xc, 0xdc, 0x0, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x4d, 0xeb, 0x20, 0x0, + 0x0, 0xf, 0x10, 0x5b, 0xe5, 0x7, 0xf9, 0x30, + 0xc, 0xfc, 0x8, 0xc6, 0x0, 0x0, 0x28, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+628A "把" */ + 0x0, 0x1e, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1e, 0x0, 0x6a, 0x0, 0xe1, 0x4, 0xd0, + 0x0, 0x2f, 0x0, 0x6a, 0x0, 0xe1, 0x3, 0xd0, + 0x1f, 0xff, 0xf9, 0x6a, 0x0, 0xe1, 0x3, 0xd0, + 0x0, 0x1e, 0x0, 0x6a, 0x0, 0xe1, 0x3, 0xd0, + 0x0, 0x1e, 0x0, 0x6a, 0x0, 0xe1, 0x3, 0xd0, + 0x0, 0x1e, 0x0, 0x6a, 0x0, 0xe2, 0x4, 0xd0, + 0x0, 0x4f, 0xcc, 0x6f, 0xff, 0xff, 0xff, 0xd0, + 0x1a, 0x7f, 0x10, 0x6a, 0x0, 0x0, 0x1, 0x50, + 0x0, 0x1e, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x35, + 0x0, 0x1e, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x6a, + 0x0, 0x2e, 0x0, 0x5d, 0x0, 0x0, 0x0, 0xa7, + 0x9, 0xfa, 0x0, 0xb, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6295 "投" */ + 0x0, 0xf, 0x0, 0x2, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0xf, 0x0, 0x3, 0xd0, 0x3, 0xc0, 0x0, + 0x15, 0x5f, 0x55, 0x4, 0xc0, 0x3, 0xc0, 0x0, + 0x2a, 0xaf, 0xaa, 0xa, 0x90, 0x3, 0xc0, 0x0, + 0x0, 0xf, 0x0, 0x7f, 0x20, 0x1, 0xfb, 0xb2, + 0x0, 0xf, 0x3, 0xf5, 0x0, 0x0, 0x23, 0x30, + 0x0, 0xf, 0x0, 0x21, 0x11, 0x11, 0x11, 0x0, + 0x0, 0x3f, 0xca, 0xef, 0xee, 0xee, 0xef, 0x20, + 0x4e, 0xdf, 0x40, 0x2e, 0x20, 0x0, 0x7a, 0x0, + 0x1, 0xf, 0x0, 0x7, 0xc0, 0x3, 0xe2, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x9c, 0x5e, 0x30, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x4a, 0xe8, 0x4d, 0xd6, 0x20, + 0xd, 0xfb, 0x1f, 0xc7, 0x10, 0x0, 0x5b, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62BC "押" */ + 0x0, 0x1f, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xe0, + 0x1, 0xf0, 0x6, 0x90, 0xe, 0x10, 0x2e, 0x6, + 0x7f, 0x65, 0x68, 0x0, 0xe1, 0x2, 0xe0, 0xcc, + 0xfc, 0x96, 0x80, 0xe, 0x10, 0x2e, 0x0, 0x1f, + 0x0, 0x6f, 0xee, 0xff, 0xef, 0xe0, 0x1, 0xf0, + 0x6, 0x90, 0xe, 0x20, 0x2e, 0x0, 0x1f, 0x0, + 0x68, 0x0, 0xe1, 0x2, 0xe0, 0x3, 0xfc, 0xc6, + 0x91, 0x1e, 0x31, 0x3e, 0x1c, 0xdf, 0x50, 0x6f, + 0xee, 0xfe, 0xee, 0xe0, 0x1, 0xf0, 0x0, 0x0, + 0xe, 0x10, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, + 0xe1, 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0xe, + 0x10, 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0xae, 0x90, 0x0, 0x0, 0xe, 0x10, + 0x0, + + /* U+62C5 "担" */ + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x3f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xe, 0x20, 0x3d, 0x0, 0x0, 0xf, 0x0, + 0x3f, 0xff, 0xff, 0x5d, 0x0, 0x0, 0xf, 0x0, + 0x0, 0xe, 0x10, 0x3d, 0x0, 0x0, 0xf, 0x0, + 0x0, 0xe, 0x10, 0x3f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xe, 0x35, 0x3d, 0x0, 0x0, 0x1f, 0x0, + 0x4, 0x8f, 0xea, 0x4d, 0x0, 0x0, 0xf, 0x0, + 0x4c, 0x7f, 0x20, 0x3d, 0x0, 0x0, 0xf, 0x0, + 0x0, 0xe, 0x10, 0x3f, 0xcc, 0xcc, 0xcf, 0x0, + 0x0, 0xe, 0x10, 0x3, 0x33, 0x33, 0x33, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x11, 0x33, 0x33, 0x33, 0x33, 0x30, + 0xb, 0xfc, 0x5, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62C9 "拉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x35, 0x55, 0xa6, 0x55, 0x50, + 0x1f, 0xff, 0xfa, 0x5a, 0xaa, 0xaa, 0xaa, 0xa0, + 0x0, 0xf, 0x0, 0x0, 0x10, 0x0, 0x23, 0x0, + 0x0, 0xf, 0x0, 0x5, 0xa0, 0x0, 0x7a, 0x0, + 0x0, 0xf, 0x0, 0x2, 0xd0, 0x0, 0x97, 0x0, + 0x0, 0x4f, 0xcc, 0x0, 0xf0, 0x0, 0xc4, 0x0, + 0x1e, 0xef, 0x40, 0x0, 0xc3, 0x0, 0xf1, 0x0, + 0x2, 0x1f, 0x0, 0x0, 0xa6, 0x2, 0xe0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x88, 0x5, 0xa0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x57, 0x9, 0x60, 0x0, + 0x0, 0x1f, 0x1, 0x33, 0x33, 0x3d, 0x63, 0x31, + 0x9, 0xfa, 0x4, 0xcc, 0xcc, 0xcc, 0xcc, 0xc5, + + /* U+62DB "招" */ + 0x0, 0x1f, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x1f, 0x0, 0x0, 0xa, 0x70, 0x0, 0xf0, + 0x0, 0x2f, 0x0, 0x0, 0xd, 0x40, 0x1, 0xf0, + 0x2f, 0xff, 0xfe, 0x0, 0x3e, 0x0, 0x2, 0xe0, + 0x0, 0x1f, 0x0, 0x0, 0xc8, 0x0, 0x4, 0xc0, + 0x0, 0x1f, 0x0, 0xa, 0xd0, 0x2, 0x29, 0x90, + 0x0, 0x1f, 0x1, 0xbb, 0x10, 0x7, 0xdb, 0x20, + 0x0, 0x4f, 0xdc, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x3e, 0xef, 0x30, 0xd, 0xee, 0xee, 0xee, 0xd0, + 0x3, 0x1f, 0x0, 0xd, 0x20, 0x0, 0x3, 0xd0, + 0x0, 0x1f, 0x0, 0xd, 0x20, 0x0, 0x3, 0xd0, + 0x0, 0x1f, 0x0, 0xd, 0x20, 0x0, 0x3, 0xd0, + 0x0, 0x2f, 0x0, 0xd, 0xcc, 0xcc, 0xcd, 0xd0, + 0xb, 0xf9, 0x0, 0xd, 0x53, 0x33, 0x36, 0xc0, + + /* U+62E1 "拡" */ + 0x0, 0xf, 0x0, 0x0, 0x4, 0x60, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x1, 0xe1, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x7c, 0xcc, 0xed, 0xcc, 0xc1, + 0x1f, 0xff, 0xfb, 0x88, 0x22, 0x22, 0x22, 0x20, + 0x0, 0xf, 0x0, 0x87, 0x0, 0x74, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x97, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0xf, 0x2, 0x96, 0x1, 0xf0, 0x0, 0x0, + 0x1, 0x6f, 0xe8, 0xb6, 0x6, 0xb0, 0x40, 0x0, + 0x2f, 0xaf, 0x0, 0xc4, 0xa, 0x60, 0xb4, 0x0, + 0x0, 0xf, 0x0, 0xd2, 0xf, 0x10, 0x4c, 0x0, + 0x0, 0xf, 0x1, 0xe0, 0x6b, 0x0, 0xd, 0x30, + 0x0, 0xf, 0x6, 0xa0, 0xd5, 0x2, 0x4a, 0xa0, + 0x0, 0x1f, 0xe, 0x35, 0xfe, 0xfd, 0xa8, 0xe0, + 0xa, 0xfa, 0x29, 0x1, 0x42, 0x0, 0x0, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62EC "括" */ + 0x0, 0xf, 0x0, 0x0, 0x0, 0x25, 0x7b, 0x80, + 0x0, 0xf, 0x0, 0x3c, 0xdc, 0xf8, 0x52, 0x0, + 0x2, 0x2f, 0x22, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0xb, 0xbf, 0xba, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x8c, 0xcc, 0xfc, 0xcc, 0xc9, + 0x0, 0xf, 0x0, 0x23, 0x33, 0xf5, 0x33, 0x32, + 0x0, 0xf, 0x27, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x4, 0x9f, 0xe9, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x1c, 0x8f, 0x0, 0x2e, 0xee, 0xfe, 0xee, 0xc0, + 0x0, 0xf, 0x0, 0x2d, 0x11, 0x11, 0x14, 0xd0, + 0x0, 0xf, 0x0, 0x2d, 0x0, 0x0, 0x3, 0xd0, + 0x0, 0xf, 0x0, 0x2d, 0x0, 0x0, 0x3, 0xd0, + 0x0, 0x1f, 0x0, 0x2d, 0x22, 0x22, 0x26, 0xd0, + 0xc, 0xea, 0x0, 0x2f, 0xcc, 0xcc, 0xcd, 0xc0, + + /* U+62ED "拭" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe, 0x3a, 0x10, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xd, 0x35, 0xc0, + 0x2, 0x2f, 0x21, 0x0, 0x0, 0xd, 0x30, 0x61, + 0x1d, 0xdf, 0xda, 0xdf, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xa, 0x50, 0x0, + 0x0, 0xf, 0x24, 0x8c, 0xcc, 0xa9, 0x60, 0x0, + 0x4, 0x9f, 0xe8, 0x23, 0xf4, 0x28, 0x80, 0x0, + 0x1c, 0x8f, 0x0, 0x0, 0xe1, 0x7, 0xa0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xe1, 0x5, 0xc0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xe1, 0x3, 0xe0, 0x52, + 0x0, 0xf, 0x0, 0x47, 0xfd, 0xf4, 0xe3, 0x94, + 0x1, 0x2f, 0x1, 0xc9, 0x62, 0x0, 0x9b, 0xd1, + 0xc, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x1d, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+62FF "拿" */ + 0x0, 0x0, 0x0, 0x4, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7d, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x7d, 0x70, 0x9, 0xd7, 0x10, 0x0, + 0x6, 0xbe, 0xdb, 0x99, 0x99, 0xbe, 0xec, 0x71, + 0x19, 0x40, 0x12, 0x22, 0x22, 0x21, 0x3, 0x80, + 0x0, 0xd, 0xcc, 0xcc, 0xcc, 0xcd, 0xd0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0x3, 0xd0, 0x0, + 0x0, 0xa, 0xbb, 0xbb, 0xbb, 0xbb, 0xa0, 0x0, + 0x0, 0x34, 0x55, 0x66, 0x79, 0xab, 0xb1, 0x0, + 0x0, 0x46, 0x55, 0x4a, 0xa2, 0x10, 0x0, 0x0, + 0x1, 0xdd, 0xdd, 0xde, 0xed, 0xdd, 0xdd, 0x20, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0xc, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0xc0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xdd, 0x40, 0x0, 0x0, 0x0, + + /* U+6301 "持" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x1, 0x11, 0xe3, 0x11, 0x0, + 0x0, 0xf, 0x0, 0x2c, 0xcc, 0xfd, 0xcc, 0x70, + 0x1f, 0xff, 0xfb, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xf, 0x0, 0xee, 0xee, 0xee, 0xff, 0xe4, + 0x0, 0xf, 0x1, 0x0, 0x0, 0x0, 0xc3, 0x0, + 0x0, 0x2f, 0xdb, 0x11, 0x11, 0x11, 0xd4, 0x10, + 0x2d, 0xef, 0x40, 0xbe, 0xee, 0xee, 0xff, 0xe3, + 0x3, 0xf, 0x0, 0x3, 0x30, 0x0, 0xc3, 0x0, + 0x0, 0xf, 0x0, 0x2, 0xd1, 0x0, 0xc3, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x6a, 0x0, 0xc3, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x2, 0x0, 0xd3, 0x0, + 0x9, 0xfa, 0x0, 0x0, 0x0, 0xef, 0xd1, 0x0, + + /* U+6307 "指" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0xe, 0x10, 0x0, 0x1, 0x0, + 0x0, 0xf, 0x0, 0xe, 0x10, 0x48, 0xdd, 0x20, + 0x0, 0xf, 0x10, 0xe, 0xdc, 0x96, 0x20, 0x0, + 0x4f, 0xff, 0xff, 0xe, 0x20, 0x0, 0x0, 0x85, + 0x0, 0xf, 0x0, 0xe, 0x40, 0x0, 0x2, 0xd4, + 0x0, 0xf, 0x0, 0x7, 0xde, 0xee, 0xee, 0xa0, + 0x0, 0xf, 0x36, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xaf, 0xd8, 0x1d, 0xee, 0xee, 0xee, 0xb0, + 0x5e, 0x8f, 0x0, 0xe, 0x10, 0x0, 0x4, 0xc0, + 0x0, 0xf, 0x0, 0xe, 0x10, 0x0, 0x4, 0xc0, + 0x0, 0xf, 0x0, 0xe, 0xee, 0xee, 0xee, 0xc0, + 0x0, 0xf, 0x0, 0xe, 0x10, 0x0, 0x4, 0xc0, + 0x0, 0xf, 0x0, 0xe, 0x43, 0x33, 0x36, 0xc0, + 0xb, 0xfb, 0x0, 0xe, 0xbb, 0xbb, 0xbc, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6319 "挙" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2b, 0x0, 0x6b, 0x0, 0x1, 0xe1, 0x0, + 0x0, 0xa, 0x90, 0xd, 0x50, 0xb, 0x80, 0x0, + 0x3, 0x34, 0xe4, 0x37, 0x83, 0x7d, 0x33, 0x30, + 0x1c, 0xcc, 0xdf, 0xcc, 0xcc, 0xfd, 0xcc, 0xc1, + 0x0, 0x0, 0xc7, 0x0, 0x0, 0x5c, 0x10, 0x0, + 0x0, 0x1c, 0xe6, 0x89, 0xcd, 0x96, 0xd2, 0x0, + 0x7, 0xe9, 0x46, 0x5b, 0x80, 0x0, 0x4d, 0x81, + 0x2a, 0x38, 0xaa, 0xad, 0xda, 0xaa, 0x70, 0x71, + 0x0, 0x2, 0x33, 0x3a, 0x93, 0x33, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xa, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xa0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0xee, 0x30, 0x0, 0x0, 0x0, + + /* U+6355 "捕" */ + 0x0, 0xf, 0x10, 0x0, 0x0, 0xe1, 0xa4, 0x0, + 0x0, 0xf, 0x10, 0x0, 0x0, 0xe0, 0x2a, 0xa0, + 0x0, 0xf, 0x10, 0xcc, 0xcc, 0xfd, 0xcc, 0xd3, + 0x3f, 0xff, 0xfe, 0x11, 0x11, 0xf2, 0x11, 0x10, + 0x0, 0xf, 0x10, 0x12, 0x22, 0xf3, 0x22, 0x20, + 0x0, 0xf, 0x10, 0x7e, 0xdd, 0xfd, 0xdd, 0xe0, + 0x0, 0xf, 0x35, 0x87, 0x0, 0xe0, 0x1, 0xe0, + 0x5, 0x9f, 0xd8, 0x8f, 0xee, 0xfe, 0xee, 0xe0, + 0x5e, 0x8f, 0x10, 0x77, 0x0, 0xe0, 0x1, 0xe0, + 0x0, 0xf, 0x10, 0x77, 0x0, 0xe0, 0x1, 0xe0, + 0x0, 0xf, 0x10, 0x7f, 0xee, 0xff, 0xef, 0xe0, + 0x0, 0xf, 0x10, 0x77, 0x0, 0xe0, 0x1, 0xe0, + 0x0, 0xf, 0x10, 0x77, 0x0, 0xe0, 0x1, 0xe0, + 0xa, 0xfb, 0x0, 0x77, 0x0, 0xd0, 0xbe, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6368 "捨" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x7, 0xc0, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x4d, 0xa9, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0x5, 0xd1, 0x7, 0xc2, 0x0, + 0xe, 0xff, 0xe7, 0xbc, 0x10, 0x0, 0x5e, 0x91, + 0x0, 0x2d, 0xb, 0x7c, 0xff, 0xff, 0xf2, 0x97, + 0x0, 0x2d, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0x2d, 0x36, 0xbb, 0xbc, 0xeb, 0xbb, 0xb0, + 0x3, 0x9f, 0xd3, 0x33, 0x36, 0xc3, 0x33, 0x30, + 0x2f, 0xbd, 0x0, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x1, 0x2d, 0x0, 0xbf, 0xee, 0xee, 0xee, 0x0, + 0x0, 0x2d, 0x0, 0xb3, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x2d, 0x0, 0xb3, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0x2d, 0x0, 0xb6, 0x33, 0x33, 0x4e, 0x0, + 0xc, 0xf8, 0x0, 0xbc, 0xbb, 0xbb, 0xbe, 0x0, + + /* U+6388 "授" */ + 0x0, 0x0, 0x0, 0x0, 0x12, 0x35, 0x7a, 0x30, + 0x0, 0x1e, 0x0, 0xbd, 0xcb, 0x97, 0x54, 0x0, + 0x0, 0x1e, 0x0, 0x25, 0x3, 0x90, 0x9, 0x70, + 0x19, 0xaf, 0x96, 0x1e, 0x0, 0xe0, 0x1e, 0x10, + 0x18, 0x9f, 0x85, 0xb, 0x30, 0x91, 0x87, 0x0, + 0x0, 0x1e, 0x0, 0xbb, 0xbb, 0xbb, 0xfb, 0xb1, + 0x0, 0x1e, 0x0, 0xe3, 0x33, 0x33, 0x33, 0xe1, + 0x0, 0x1e, 0x67, 0xc0, 0x0, 0x0, 0x0, 0xc1, + 0x16, 0xbf, 0xa4, 0x3c, 0xcc, 0xcc, 0xcb, 0x0, + 0x2a, 0x6e, 0x0, 0x7, 0x91, 0x11, 0x98, 0x0, + 0x0, 0x1e, 0x0, 0x1, 0xe2, 0x2, 0xe1, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x4d, 0x5d, 0x30, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x1b, 0xf9, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x49, 0xe9, 0x4c, 0xd6, 0x20, + 0xc, 0xf9, 0x7, 0xc7, 0x10, 0x0, 0x4a, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6392 "排" */ + 0x0, 0xf, 0x0, 0x0, 0x1d, 0x4, 0xb0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x1e, 0x4, 0xb0, 0x0, + 0x0, 0xf, 0x10, 0x47, 0x8e, 0x4, 0xd7, 0x73, + 0x1f, 0xff, 0xfc, 0x36, 0x7e, 0x4, 0xd6, 0x62, + 0x0, 0xf, 0x0, 0x0, 0x1e, 0x4, 0xb0, 0x0, + 0x0, 0xf, 0x0, 0x1, 0x3e, 0x4, 0xc1, 0x10, + 0x0, 0xf, 0x0, 0x6d, 0xde, 0x4, 0xfd, 0xd3, + 0x0, 0x3f, 0xcd, 0x0, 0x1e, 0x4, 0xb0, 0x0, + 0x2f, 0xbf, 0x30, 0x0, 0x1e, 0x4, 0xb0, 0x0, + 0x0, 0xf, 0x0, 0xdf, 0xfe, 0x4, 0xff, 0xf9, + 0x0, 0xf, 0x0, 0x0, 0x1e, 0x4, 0xc0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x1e, 0x4, 0xb0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x1e, 0x4, 0xb0, 0x0, + 0x9, 0xfb, 0x0, 0x0, 0x1e, 0x4, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+639B "掛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x0, 0xb, 0x30, 0xc, 0x30, 0x0, + 0x0, 0x68, 0x0, 0xb, 0x30, 0xc, 0x30, 0x0, + 0x0, 0x79, 0x7, 0xcf, 0xdc, 0x4c, 0x30, 0x0, + 0x6f, 0xff, 0xf1, 0xb, 0x30, 0xc, 0x30, 0x0, + 0x0, 0x68, 0x0, 0xb, 0x30, 0xc, 0x30, 0x0, + 0x0, 0x68, 0xe, 0xee, 0xee, 0xac, 0xd2, 0x0, + 0x0, 0x69, 0x51, 0x6, 0x20, 0xc, 0x7e, 0x30, + 0x4, 0xcf, 0xc2, 0xb, 0x30, 0xc, 0x33, 0xe1, + 0x8d, 0xc9, 0x1, 0x2c, 0x52, 0x1c, 0x30, 0x10, + 0x0, 0x68, 0x9, 0xcf, 0xdc, 0x6c, 0x30, 0x0, + 0x0, 0x68, 0x0, 0xb, 0x30, 0xc, 0x30, 0x0, + 0x0, 0x68, 0x0, 0xc, 0x76, 0x7c, 0x30, 0x0, + 0x0, 0x78, 0x4d, 0xdb, 0x86, 0x3c, 0x30, 0x0, + 0x1f, 0xe5, 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63A1 "採" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x2, 0x35, 0x69, 0xbf, 0x60, + 0x0, 0xf, 0x0, 0xbc, 0xa9, 0x85, 0x30, 0x0, + 0x0, 0x1f, 0x0, 0x30, 0x6, 0x50, 0x1, 0xd1, + 0x1f, 0xff, 0xfb, 0x78, 0x3, 0xc0, 0x7, 0x90, + 0x0, 0xf, 0x0, 0xe, 0x0, 0xf0, 0x1e, 0x10, + 0x0, 0xf, 0x0, 0x6, 0x10, 0x90, 0x96, 0x0, + 0x0, 0xf, 0x77, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x18, 0xdf, 0x93, 0xbb, 0xbb, 0xfc, 0xbb, 0xb2, + 0x19, 0x4f, 0x0, 0x33, 0x4e, 0xff, 0x43, 0x30, + 0x0, 0xf, 0x0, 0x0, 0xb8, 0xe7, 0xc0, 0x0, + 0x0, 0xf, 0x0, 0x9, 0xb0, 0xe1, 0x9a, 0x0, + 0x0, 0xf, 0x2, 0xcb, 0x10, 0xe1, 0xa, 0xc1, + 0x0, 0x1f, 0x8, 0x70, 0x0, 0xe1, 0x0, 0x76, + 0xb, 0xfa, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63A2 "探" */ + 0x0, 0x2d, 0x0, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x2d, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xe0, + 0x0, 0x2e, 0x0, 0xb0, 0x12, 0x5, 0x10, 0xb0, + 0x1f, 0xff, 0xf7, 0x0, 0xd5, 0x6, 0xd1, 0x0, + 0x0, 0x2d, 0x0, 0x1c, 0x80, 0x0, 0x6d, 0x10, + 0x0, 0x2d, 0x0, 0xd7, 0x0, 0x70, 0x8, 0x80, + 0x0, 0x2e, 0x64, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x5, 0xbf, 0xa5, 0xcc, 0xcd, 0xfc, 0xcc, 0xc1, + 0x1c, 0x8d, 0x0, 0x22, 0x4f, 0xfe, 0x32, 0x20, + 0x0, 0x2d, 0x0, 0x0, 0xc7, 0xe8, 0x90, 0x0, + 0x0, 0x2d, 0x0, 0x9, 0xa1, 0xe0, 0xc6, 0x0, + 0x0, 0x2d, 0x1, 0xab, 0x1, 0xe0, 0x2d, 0x90, + 0x0, 0x2d, 0xb, 0x70, 0x1, 0xe0, 0x1, 0xc4, + 0xa, 0xe9, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + + /* U+63A5 "接" */ + 0x0, 0x96, 0x0, 0x0, 0xb, 0x20, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x66, 0x6b, 0xc6, 0x66, 0x30, + 0x0, 0x96, 0x0, 0x69, 0x76, 0x66, 0xa7, 0x30, + 0x8f, 0xff, 0xf1, 0x8, 0x80, 0x5, 0xc0, 0x0, + 0x0, 0x96, 0x0, 0x0, 0xb0, 0xd, 0x20, 0x0, + 0x0, 0x96, 0x9, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x96, 0x10, 0x0, 0x2b, 0x0, 0x0, 0x0, + 0x1, 0xbe, 0xf0, 0x0, 0x98, 0x0, 0x0, 0x0, + 0x8f, 0xf9, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x21, 0x96, 0x0, 0xc, 0x50, 0x2, 0xe0, 0x0, + 0x0, 0x96, 0x0, 0x7f, 0x51, 0xb, 0x70, 0x0, + 0x0, 0x96, 0x0, 0x3, 0x8d, 0xdd, 0x0, 0x0, + 0x0, 0x96, 0x0, 0x25, 0xbd, 0x7b, 0xd6, 0x0, + 0x1f, 0xe3, 0xd, 0xc9, 0x40, 0x0, 0x3c, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63A7 "控" */ + 0x0, 0x1e, 0x0, 0x0, 0x1, 0xd0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x22, 0x22, 0xc8, 0x22, 0x21, + 0x0, 0x2e, 0x0, 0xdc, 0xbb, 0xbb, 0xbb, 0xd8, + 0x1f, 0xff, 0xf9, 0xd2, 0x2, 0x0, 0x10, 0x78, + 0x0, 0x1e, 0x0, 0x40, 0x7c, 0x4, 0xd2, 0x11, + 0x0, 0x1e, 0x0, 0x7, 0xe1, 0x0, 0x4e, 0x30, + 0x0, 0x1e, 0x0, 0x8d, 0x20, 0x0, 0x4, 0xd0, + 0x0, 0x1f, 0xb9, 0x23, 0x22, 0x22, 0x22, 0x20, + 0x1a, 0xff, 0x61, 0x1c, 0xcc, 0xfd, 0xcc, 0x70, + 0x7, 0x3e, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0xb, 0xf9, 0x6, 0xee, 0xee, 0xee, 0xee, 0xe9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63A8 "推" */ + 0x0, 0xf, 0x0, 0x0, 0xc1, 0x38, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x6, 0xb0, 0xd, 0x20, 0x0, + 0x0, 0xf, 0x0, 0xc, 0x95, 0x5a, 0x95, 0x50, + 0x1f, 0xff, 0xfd, 0x4f, 0xa9, 0x9f, 0x99, 0x80, + 0x0, 0xf, 0x0, 0xdf, 0x10, 0xf, 0x0, 0x0, + 0x0, 0xf, 0x9, 0xae, 0x31, 0x2f, 0x11, 0x10, + 0x0, 0xf, 0x9, 0x1e, 0xdd, 0xdf, 0xdd, 0xb0, + 0x0, 0x2f, 0xcc, 0xe, 0x10, 0xf, 0x0, 0x0, + 0x1d, 0xef, 0x40, 0xe, 0x10, 0xf, 0x0, 0x0, + 0x3, 0xf, 0x0, 0xe, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xf, 0x0, 0xe, 0x10, 0xf, 0x0, 0x0, + 0x0, 0xf, 0x0, 0xe, 0x10, 0xf, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0xe, 0xfe, 0xff, 0xee, 0xe6, + 0xa, 0xfb, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63CF "描" */ + 0x0, 0x1d, 0x0, 0x0, 0xe1, 0x0, 0xe1, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0xe1, 0x0, 0xe1, 0x0, + 0x0, 0x2e, 0x1, 0xdd, 0xfe, 0xdd, 0xfe, 0xd3, + 0x1f, 0xff, 0xfa, 0x0, 0xe2, 0x0, 0xe2, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0xe1, 0x0, 0xe1, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x71, 0x0, 0x71, 0x0, + 0x0, 0x1d, 0x1, 0x5f, 0xee, 0xfe, 0xef, 0xa0, + 0x0, 0x5f, 0xe8, 0x58, 0x0, 0xe0, 0x5, 0xa0, + 0x2f, 0xce, 0x10, 0x58, 0x0, 0xe0, 0x5, 0xa0, + 0x0, 0x1d, 0x0, 0x5f, 0xee, 0xfe, 0xef, 0xa0, + 0x0, 0x1d, 0x0, 0x58, 0x0, 0xf1, 0x6, 0xa0, + 0x0, 0x1d, 0x0, 0x58, 0x0, 0xe0, 0x5, 0xa0, + 0x0, 0x3d, 0x0, 0x5e, 0xcc, 0xfc, 0xcd, 0xa0, + 0xb, 0xe8, 0x0, 0x59, 0x22, 0x22, 0x27, 0x90, + + /* U+63D0 "提" */ + 0x0, 0x1e, 0x0, 0x3f, 0xdd, 0xdd, 0xdf, 0x10, + 0x0, 0x1e, 0x0, 0x3b, 0x0, 0x0, 0xe, 0x10, + 0x3, 0x5e, 0x32, 0x3f, 0xcc, 0xcc, 0xcf, 0x10, + 0x1a, 0xbf, 0xa7, 0x3b, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x1e, 0x0, 0x3f, 0xcc, 0xcc, 0xcf, 0x10, + 0x0, 0x1e, 0x0, 0x1, 0x11, 0x11, 0x11, 0x0, + 0x0, 0x1e, 0x34, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, + 0x4, 0x9f, 0xd5, 0x33, 0x33, 0xf3, 0x33, 0x30, + 0x2d, 0x8e, 0x0, 0xe, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x3e, 0x0, 0xfd, 0xcc, 0x20, + 0x0, 0x1e, 0x0, 0x7f, 0x10, 0xf1, 0x11, 0x0, + 0x0, 0x1e, 0x0, 0xc8, 0xa0, 0xf0, 0x0, 0x0, + 0x0, 0x1e, 0x5, 0xc0, 0xab, 0xf1, 0x0, 0x0, + 0xa, 0xeb, 0x1e, 0x20, 0x6, 0xce, 0xff, 0xf5, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63DB "換" */ + 0x0, 0x77, 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x3, 0xfe, 0xef, 0x10, 0x0, + 0x13, 0x99, 0x30, 0x2d, 0x40, 0x59, 0x0, 0x0, + 0x3a, 0xdc, 0xa2, 0xef, 0xdd, 0xfd, 0xdd, 0x0, + 0x0, 0x77, 0x1, 0x7c, 0x2, 0x12, 0xd, 0x0, + 0x0, 0x77, 0x0, 0x1c, 0xc, 0x1b, 0xd, 0x0, + 0x0, 0x79, 0x60, 0x1c, 0x66, 0x7, 0x5d, 0x0, + 0x16, 0xdf, 0x90, 0x1c, 0xb0, 0x51, 0x9d, 0x0, + 0x6b, 0xb7, 0x0, 0x1c, 0x2, 0xc0, 0xd, 0x0, + 0x0, 0x77, 0x9, 0xcf, 0xbc, 0xeb, 0xbf, 0xc1, + 0x0, 0x77, 0x1, 0x22, 0x2c, 0xe6, 0x22, 0x20, + 0x0, 0x77, 0x0, 0x0, 0x6c, 0x2d, 0x10, 0x0, + 0x0, 0x87, 0x0, 0x3a, 0xc1, 0x4, 0xd7, 0x10, + 0xf, 0xe3, 0xd, 0xb5, 0x0, 0x0, 0x18, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+63EE "揮" */ + 0x0, 0xf, 0x0, 0xde, 0xee, 0xee, 0xee, 0xf5, + 0x0, 0xf, 0x0, 0xd1, 0x0, 0x80, 0x0, 0x95, + 0x2, 0x2f, 0x21, 0x50, 0x0, 0xe1, 0x0, 0x32, + 0x1d, 0xdf, 0xda, 0x6d, 0xdd, 0xfe, 0xdd, 0xd0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x3e, 0xcc, 0xfd, 0xcd, 0xb0, + 0x0, 0xf, 0x45, 0x3b, 0x0, 0xe1, 0x3, 0xb0, + 0x5, 0xaf, 0xc5, 0x3e, 0xcc, 0xfc, 0xcd, 0xb0, + 0x2c, 0x7f, 0x0, 0x3b, 0x0, 0xe1, 0x3, 0xb0, + 0x0, 0xf, 0x0, 0x3e, 0xcc, 0xfc, 0xcd, 0xb0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xf, 0x6, 0xee, 0xee, 0xfe, 0xee, 0xea, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0xa, 0xfa, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + + /* U+63FA "揺" */ + 0x0, 0xf, 0x10, 0x1, 0x24, 0x57, 0xad, 0x90, + 0x0, 0xf, 0x11, 0xdc, 0xba, 0x87, 0x42, 0x10, + 0x0, 0xf, 0x10, 0x27, 0x6, 0x70, 0x6, 0xc0, + 0x3f, 0xff, 0xfe, 0xd, 0x12, 0xd0, 0xe, 0x20, + 0x0, 0xf, 0x10, 0x6, 0x30, 0x60, 0x98, 0x0, + 0x0, 0xf, 0x10, 0xde, 0xee, 0xee, 0xff, 0xe2, + 0x0, 0xf, 0x13, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x3f, 0xee, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x3e, 0xdf, 0x44, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xf, 0x10, 0x43, 0x0, 0xf0, 0x1, 0x60, + 0x0, 0xf, 0x10, 0x87, 0x0, 0xf0, 0x2, 0xd0, + 0x0, 0xf, 0x10, 0x87, 0x0, 0xf0, 0x2, 0xd0, + 0x0, 0xf, 0x10, 0x8e, 0xcc, 0xfc, 0xcd, 0xd0, + 0xa, 0xfc, 0x0, 0x88, 0x22, 0x22, 0x24, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+643A "携" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0xa, 0x33, 0xc1, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x2f, 0xdd, 0xfe, 0xdd, 0x90, + 0x3, 0x9b, 0x31, 0xdb, 0x0, 0xe1, 0x0, 0x0, + 0x3d, 0xee, 0xdc, 0xce, 0xbb, 0xfc, 0xbb, 0x50, + 0x0, 0x69, 0x5, 0x3b, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x2e, 0xbb, 0xfb, 0xbb, 0x50, + 0x0, 0x69, 0x30, 0x2b, 0x0, 0xe1, 0x0, 0x0, + 0x1, 0x9f, 0xd1, 0x2f, 0xdd, 0xdd, 0xdd, 0xd1, + 0x3f, 0xda, 0x1, 0x47, 0x44, 0x44, 0x10, 0x0, + 0x0, 0x69, 0x2, 0x99, 0xf9, 0xaf, 0x10, 0x0, + 0x0, 0x69, 0x0, 0x2, 0xc0, 0x4e, 0xdd, 0xe2, + 0x0, 0x69, 0x0, 0xa, 0x60, 0x0, 0x0, 0xf0, + 0x0, 0x79, 0x0, 0x9c, 0x0, 0x0, 0x4, 0xd0, + 0xe, 0xf5, 0xc, 0xa0, 0x0, 0x1e, 0xdd, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+64C1 "擁" */ + 0x0, 0x58, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, + 0x0, 0x58, 0xb, 0xcc, 0xce, 0xec, 0xcc, 0xc1, + 0x4, 0x8a, 0x41, 0x62, 0x22, 0x62, 0x42, 0x20, + 0x1e, 0xff, 0xd0, 0xd1, 0x2, 0xe0, 0xd0, 0x0, + 0x0, 0x58, 0x3, 0xa0, 0x8, 0xa3, 0xb6, 0x30, + 0x0, 0x58, 0xb, 0x48, 0x7e, 0xba, 0xfa, 0xa0, + 0x0, 0x59, 0x3e, 0xce, 0xaf, 0x30, 0xd0, 0x0, + 0x2, 0xaf, 0xc0, 0x76, 0x4b, 0xdc, 0xfc, 0x80, + 0x1f, 0xd9, 0x1, 0xc0, 0xba, 0x30, 0xd0, 0x0, + 0x1, 0x58, 0xa, 0xef, 0x8a, 0x52, 0xe2, 0x10, + 0x0, 0x58, 0x8, 0x4b, 0x2a, 0xb9, 0xf9, 0x60, + 0x0, 0x58, 0x0, 0x5a, 0xa, 0x30, 0xd0, 0x0, + 0x0, 0x68, 0x6, 0xd0, 0xa, 0xed, 0xfd, 0xd2, + 0xd, 0xe5, 0x2c, 0x10, 0xa, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+64C7 "擇" */ + 0x0, 0x1e, 0x0, 0xad, 0xcf, 0xcf, 0xdc, 0xf0, + 0x0, 0x1e, 0x0, 0xa4, 0xd, 0xc, 0x10, 0xe0, + 0x5, 0x6e, 0x53, 0xa9, 0x6e, 0x6d, 0x76, 0xe0, + 0x9, 0xaf, 0x95, 0x35, 0x55, 0xe5, 0x55, 0x50, + 0x0, 0x1e, 0x0, 0x4a, 0xaa, 0xfa, 0xaa, 0x60, + 0x0, 0x1e, 0x0, 0x13, 0x33, 0xd3, 0x33, 0x20, + 0x0, 0x1e, 0x23, 0x22, 0x22, 0xd2, 0x22, 0x20, + 0x2, 0x7f, 0xe7, 0xbb, 0xeb, 0xbb, 0xec, 0xb1, + 0x1d, 0x9e, 0x0, 0x0, 0xd2, 0x2, 0xe1, 0x0, + 0x0, 0x1e, 0x0, 0xbd, 0xed, 0xee, 0xed, 0xb0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x0, 0x1e, 0x5, 0xdd, 0xdd, 0xfd, 0xdd, 0xd5, + 0x1, 0x3e, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0xb, 0xe8, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + + /* U+64D4 "擔" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x4, 0xdc, 0xce, 0xa0, 0x0, + 0x0, 0x68, 0x0, 0x1b, 0x0, 0xe, 0x40, 0x0, + 0x0, 0x69, 0x1, 0xce, 0xbb, 0xcf, 0xcb, 0xb5, + 0x3f, 0xff, 0xf7, 0xf6, 0x47, 0x84, 0x95, 0x41, + 0x0, 0x68, 0x0, 0xc2, 0x5b, 0x10, 0x4c, 0x50, + 0x0, 0x68, 0x0, 0xc4, 0x70, 0x3a, 0x0, 0x80, + 0x0, 0x69, 0x40, 0xca, 0xbb, 0xbe, 0xbb, 0xb5, + 0x2, 0xaf, 0xc1, 0xd1, 0x33, 0x33, 0x33, 0x20, + 0x3e, 0xc9, 0x0, 0xe0, 0x67, 0x77, 0x77, 0x40, + 0x0, 0x68, 0x0, 0xe0, 0x9b, 0xbb, 0xbb, 0x50, + 0x0, 0x68, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x68, 0x3, 0xb0, 0xeb, 0xbb, 0xbc, 0xb0, + 0x0, 0x78, 0x7, 0x70, 0xe1, 0x0, 0x4, 0xb0, + 0xd, 0xd4, 0xb, 0x10, 0xeb, 0xbb, 0xbc, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+64DA "據" */ + 0x0, 0x68, 0x0, 0x0, 0x6, 0xed, 0xdd, 0x30, + 0x0, 0x68, 0x0, 0x0, 0x6, 0x90, 0x0, 0x0, + 0x0, 0x68, 0x0, 0xcc, 0xcd, 0xec, 0xcc, 0xb1, + 0x3f, 0xff, 0xe1, 0xf4, 0x4a, 0x84, 0x47, 0xd0, + 0x0, 0x68, 0x1, 0xe3, 0x7c, 0xca, 0xa4, 0x50, + 0x0, 0x68, 0x1, 0xe2, 0x38, 0x83, 0x36, 0x80, + 0x0, 0x68, 0x41, 0xe0, 0x1, 0x67, 0x77, 0x20, + 0x2, 0xaf, 0xc2, 0xd7, 0xcc, 0xfd, 0xcc, 0xb0, + 0x3e, 0xc8, 0x3, 0xc0, 0x3a, 0xd0, 0x2, 0x70, + 0x0, 0x68, 0x5, 0xa6, 0x73, 0xc8, 0x8a, 0x20, + 0x0, 0x68, 0x7, 0x82, 0x89, 0x3f, 0x79, 0x0, + 0x0, 0x68, 0xc, 0x48, 0x25, 0xab, 0x2a, 0x40, + 0x0, 0x68, 0x3d, 0x6, 0xb6, 0xb, 0x21, 0xb5, + 0xd, 0xe4, 0x84, 0x27, 0x4, 0xca, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+652F "支" */ + 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0x11, 0x11, 0x1c, 0x61, 0x11, 0x11, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x1c, 0x61, 0x11, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0x0, 0x8, 0xa0, 0x0, 0x0, 0xc, 0x70, 0x0, + 0x0, 0x0, 0xd6, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x50, 0x7, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe8, 0xad, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x9f, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x14, 0xaf, 0xa3, 0x6d, 0xe8, 0x30, 0x0, + 0x4d, 0xfc, 0x81, 0x0, 0x0, 0x49, 0xdf, 0xc0, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + + /* U+6539 "改" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x11, 0x11, 0x10, 0x6, 0xb0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0x10, 0xb6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf1, 0xf, 0x63, 0x33, 0x31, 0x0, 0x0, + 0xf, 0x15, 0xfc, 0xcc, 0xfd, 0x50, 0x0, 0x0, + 0xf1, 0xdd, 0x0, 0xf, 0x20, 0x4e, 0xee, 0xef, + 0x7c, 0xc2, 0x3, 0xd0, 0x4, 0xc2, 0x22, 0x2b, + 0x37, 0x70, 0x79, 0x0, 0x4c, 0x0, 0x0, 0x0, + 0x2d, 0xe, 0x40, 0x4, 0xc0, 0x0, 0x0, 0x0, + 0xca, 0xc0, 0x0, 0x4c, 0x0, 0x0, 0x0, 0x4, + 0xf5, 0x0, 0x4, 0xc0, 0x39, 0xe2, 0x0, 0xaf, + 0x90, 0x0, 0x6e, 0xde, 0x82, 0x0, 0xac, 0x2e, + 0x70, 0xa, 0xb4, 0x0, 0x4, 0xdc, 0x10, 0x2e, + 0xb1, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x1a, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+653E "放" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x4, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0x8, 0x90, 0x0, 0x0, + 0x19, 0x99, 0xb9, 0x98, 0xd, 0x83, 0x33, 0x31, + 0x16, 0x9e, 0x66, 0x66, 0x2f, 0xcc, 0xcf, 0xd4, + 0x0, 0x3c, 0x0, 0x0, 0x9f, 0x10, 0xf, 0x0, + 0x0, 0x3f, 0xcc, 0xc4, 0xeb, 0x50, 0x4c, 0x0, + 0x0, 0x4d, 0x33, 0xea, 0x85, 0x90, 0x88, 0x0, + 0x0, 0x4b, 0x0, 0xe2, 0x1, 0xe0, 0xe3, 0x0, + 0x0, 0x5a, 0x0, 0xf1, 0x0, 0xbb, 0xc0, 0x0, + 0x0, 0x88, 0x0, 0xf0, 0x0, 0x4f, 0x40, 0x0, + 0x0, 0xc4, 0x0, 0xf0, 0x0, 0xaf, 0x80, 0x0, + 0x2, 0xe0, 0x2, 0xe0, 0x8, 0xd3, 0xe5, 0x0, + 0xc, 0x70, 0x5, 0xc2, 0xbd, 0x10, 0x4f, 0x70, + 0x3b, 0x4, 0xfe, 0x5c, 0x90, 0x0, 0x3, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+653F "政" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x11, 0x5, 0xc0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0x2a, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0xe, 0x73, 0x33, 0x31, + 0x0, 0x0, 0xb4, 0x0, 0x4f, 0xcc, 0xcf, 0xd3, + 0x4, 0x50, 0xb4, 0x0, 0xce, 0x0, 0xf, 0x0, + 0x7, 0x80, 0xbd, 0xcb, 0xed, 0x20, 0x4c, 0x0, + 0x7, 0x80, 0xb7, 0x3b, 0x58, 0x60, 0x88, 0x0, + 0x7, 0x80, 0xb4, 0x0, 0x3, 0xc0, 0xe3, 0x0, + 0x7, 0x80, 0xb4, 0x0, 0x0, 0xd9, 0xc0, 0x0, + 0x7, 0x80, 0xb4, 0x0, 0x0, 0x6f, 0x40, 0x0, + 0x7, 0x82, 0xdc, 0xdf, 0x20, 0xaf, 0x70, 0x0, + 0x3d, 0xfe, 0xa7, 0x30, 0x9, 0xd4, 0xf4, 0x0, + 0x26, 0x20, 0x0, 0x2, 0xcd, 0x10, 0x5f, 0x80, + 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, 0x3, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6545 "故" */ + 0x0, 0x1, 0xf0, 0x0, 0x7, 0x80, 0x0, 0x0, + 0x0, 0x1, 0xf0, 0x0, 0xc, 0x50, 0x0, 0x0, + 0x0, 0x2, 0xf0, 0x0, 0x1f, 0x43, 0x33, 0x31, + 0x1f, 0xff, 0xff, 0xfd, 0x5e, 0xcc, 0xcf, 0xd4, + 0x0, 0x1, 0xf0, 0x0, 0xcc, 0x0, 0x1f, 0x0, + 0x0, 0x1, 0xf0, 0x4, 0xee, 0x0, 0x4b, 0x0, + 0x0, 0x2, 0xf0, 0xd, 0x5a, 0x40, 0x87, 0x0, + 0x6, 0xfe, 0xee, 0xf6, 0x5, 0xa0, 0xe2, 0x0, + 0x6, 0x90, 0x0, 0xc3, 0x0, 0xe7, 0xb0, 0x0, + 0x6, 0x90, 0x0, 0xc3, 0x0, 0x8f, 0x30, 0x0, + 0x6, 0x90, 0x0, 0xc3, 0x0, 0xaf, 0x40, 0x0, + 0x6, 0xec, 0xcc, 0xf3, 0x9, 0xb4, 0xe1, 0x0, + 0x6, 0xb2, 0x22, 0x23, 0xcc, 0x0, 0x8d, 0x30, + 0x4, 0x70, 0x0, 0x4f, 0x80, 0x0, 0x7, 0xf3, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x30, + + /* U+6548 "效" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x8, 0xa0, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0xd, 0xdd, 0xed, 0xdd, 0x24, 0xd4, 0x44, 0x41, + 0x2, 0x44, 0x23, 0x42, 0x8, 0xdb, 0xbf, 0xd2, + 0x0, 0xb5, 0x4, 0xd0, 0xe, 0x30, 0xe, 0x20, + 0x4, 0xd0, 0x0, 0x98, 0x4f, 0x30, 0x1e, 0x0, + 0x1e, 0x40, 0x6, 0x68, 0xdc, 0x80, 0x5b, 0x0, + 0x16, 0x7a, 0xd, 0x30, 0x92, 0xc0, 0xa7, 0x0, + 0x0, 0xb, 0xcc, 0x0, 0x0, 0xb4, 0xe1, 0x0, + 0x0, 0x0, 0xfa, 0x0, 0x0, 0x5e, 0x90, 0x0, + 0x0, 0x7, 0xce, 0x50, 0x0, 0x3f, 0x50, 0x0, + 0x0, 0x4e, 0x14, 0xe1, 0x1, 0xea, 0xe1, 0x0, + 0x6, 0xe4, 0x0, 0x72, 0x3d, 0x70, 0x8d, 0x20, + 0x1d, 0x20, 0x0, 0x8, 0xe6, 0x0, 0x8, 0xf2, + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x30, + + /* U+6557 "敗" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x30, 0x0, 0x0, + 0xc, 0xee, 0xee, 0xe0, 0xd, 0x40, 0x0, 0x0, + 0xc, 0x30, 0x2, 0xe0, 0x1f, 0x10, 0x0, 0x0, + 0xc, 0x30, 0x2, 0xe0, 0x6f, 0x88, 0x88, 0x82, + 0xc, 0xed, 0xde, 0xe0, 0xbc, 0x77, 0x9f, 0x71, + 0xc, 0x30, 0x2, 0xe2, 0xfb, 0x0, 0x5b, 0x0, + 0xc, 0x30, 0x2, 0xeb, 0xaf, 0x0, 0x98, 0x0, + 0xc, 0xed, 0xde, 0xfd, 0xc, 0x30, 0xd4, 0x0, + 0xc, 0x30, 0x2, 0xe0, 0x7, 0xa3, 0xe0, 0x0, + 0xc, 0x30, 0x2, 0xe0, 0x1, 0xfb, 0x80, 0x0, + 0xc, 0xfe, 0xee, 0xe0, 0x0, 0xaf, 0x10, 0x0, + 0x0, 0x72, 0x17, 0x0, 0x0, 0xcf, 0x40, 0x0, + 0x3, 0xe0, 0xb, 0x70, 0xb, 0xb6, 0xf2, 0x0, + 0xc, 0x70, 0x2, 0xe4, 0xdc, 0x0, 0x8f, 0x60, + 0x6b, 0x0, 0x0, 0x1d, 0x80, 0x0, 0x5, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6559 "教" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0x3, 0x80, 0xd3, 0x0, 0x0, + 0x6, 0xef, 0xfe, 0xcc, 0x51, 0xf0, 0x0, 0x0, + 0x0, 0x4, 0xc0, 0x5c, 0x5, 0xe9, 0x99, 0x93, + 0x0, 0x5, 0xc1, 0xe5, 0xa, 0xc8, 0x8e, 0xb3, + 0x1e, 0xee, 0xef, 0xfe, 0xaf, 0x90, 0xe, 0x20, + 0x0, 0x0, 0x8c, 0x0, 0x8d, 0xc0, 0x1e, 0x0, + 0x0, 0xbe, 0xfe, 0xda, 0xf2, 0xe1, 0x5b, 0x0, + 0x3, 0xca, 0x17, 0xb1, 0x10, 0xb6, 0xb6, 0x0, + 0xc, 0x50, 0x89, 0x0, 0x0, 0x5c, 0xe0, 0x0, + 0x1, 0x34, 0xca, 0x9b, 0x90, 0xe, 0x90, 0x0, + 0xd, 0xba, 0xd9, 0x43, 0x10, 0x5f, 0xc0, 0x0, + 0x0, 0x0, 0xa5, 0x0, 0x4, 0xf4, 0xc8, 0x0, + 0x0, 0x0, 0xb5, 0x1, 0x9f, 0x40, 0x2e, 0xa0, + 0x0, 0x7e, 0xd2, 0x4, 0xb2, 0x0, 0x1, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6562 "敢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb3, 0x0, 0x0, + 0x3, 0xee, 0xee, 0xf2, 0x1, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x4, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xc0, 0x8, 0xc5, 0x55, 0x51, + 0x1e, 0xee, 0xef, 0xfe, 0x9c, 0xdc, 0xdf, 0xd4, + 0x0, 0xd3, 0x0, 0xb5, 0x2f, 0x40, 0x1e, 0x0, + 0x0, 0xc2, 0x0, 0xb4, 0x9f, 0x70, 0x4b, 0x0, + 0x0, 0xce, 0xdd, 0xf5, 0xf7, 0xb0, 0x78, 0x0, + 0x0, 0xc2, 0x0, 0xb4, 0x40, 0xf0, 0xc4, 0x0, + 0x0, 0xce, 0xdd, 0xf4, 0x0, 0xb8, 0xe0, 0x0, + 0x0, 0xc2, 0x0, 0xb4, 0x0, 0x3f, 0x80, 0x0, + 0x0, 0xc4, 0x36, 0xdc, 0x70, 0x3f, 0x80, 0x0, + 0x3d, 0xfe, 0xb9, 0xd7, 0x11, 0xe7, 0xe5, 0x0, + 0x13, 0x0, 0x0, 0xb4, 0x3e, 0x80, 0x3f, 0x80, + 0x0, 0x0, 0x0, 0xb4, 0xc5, 0x0, 0x2, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6570 "数" */ + 0x2, 0x40, 0xb4, 0x8, 0x0, 0xb1, 0x0, 0x0, + 0x0, 0xd1, 0xb4, 0x78, 0x1, 0xf0, 0x0, 0x0, + 0x2, 0x85, 0xc6, 0x93, 0x14, 0xc0, 0x0, 0x0, + 0xb, 0xbc, 0xfe, 0xbb, 0x78, 0xfe, 0xef, 0xf3, + 0x0, 0xb, 0xfd, 0x90, 0xc, 0x80, 0xf, 0x0, + 0x1, 0xb8, 0xb4, 0x7d, 0x3f, 0xc0, 0x2d, 0x0, + 0xd, 0x70, 0xa4, 0x2, 0xb5, 0xd0, 0x69, 0x0, + 0x1, 0x4, 0x80, 0x0, 0x80, 0x85, 0xb5, 0x0, + 0xb, 0xff, 0xfe, 0xfc, 0x0, 0x3c, 0xe0, 0x0, + 0x0, 0x5b, 0x0, 0xa6, 0x0, 0xd, 0x80, 0x0, + 0x0, 0xcb, 0x25, 0xd0, 0x0, 0x3f, 0xb0, 0x0, + 0x0, 0x5, 0xef, 0x40, 0x1, 0xd5, 0xc7, 0x0, + 0x0, 0x2a, 0xc7, 0xe2, 0x3d, 0x70, 0x2e, 0x70, + 0xc, 0xd6, 0x0, 0x5, 0xe5, 0x0, 0x2, 0xd5, + 0x1, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x10, + + /* U+6574 "整" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0xc, 0xdd, 0xfe, 0xdd, 0x30, 0xe4, 0x33, 0x31, + 0x0, 0x0, 0xb3, 0x0, 0x6, 0xff, 0xff, 0xf5, + 0x5, 0xbb, 0xec, 0xb9, 0x2e, 0x93, 0x3f, 0x41, + 0x7, 0x60, 0xb3, 0x1d, 0xc8, 0xc0, 0x5b, 0x0, + 0x7, 0xdb, 0xec, 0xcd, 0x10, 0x79, 0xe3, 0x0, + 0x0, 0x8, 0xfb, 0x50, 0x0, 0x1f, 0xa0, 0x0, + 0x0, 0x8a, 0xc4, 0xb7, 0x2, 0xd9, 0xd8, 0x0, + 0xc, 0x90, 0xb3, 0x3, 0x9d, 0x40, 0x9, 0xd3, + 0x1, 0xdd, 0xfe, 0xdd, 0xfd, 0xdd, 0xdd, 0x50, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x60, 0x7, 0xa2, 0x22, 0x20, 0x0, + 0x0, 0x6, 0x90, 0x7, 0xdb, 0xbb, 0xb2, 0x0, + 0x0, 0x6, 0x90, 0x7, 0x90, 0x0, 0x0, 0x0, + 0x1e, 0xef, 0xfe, 0xef, 0xfe, 0xee, 0xee, 0xe6, + + /* U+6587 "文" */ + 0x0, 0x0, 0x0, 0x9, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, + 0x2c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc3, + 0x4, 0x4a, 0xb4, 0x44, 0x44, 0x4c, 0xa4, 0x41, + 0x0, 0x1, 0xe1, 0x0, 0x0, 0x2f, 0x20, 0x0, + 0x0, 0x0, 0x98, 0x0, 0x0, 0x9a, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x30, 0x2, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xe1, 0xd, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9c, 0xbb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xeb, 0xae, 0x50, 0x0, 0x0, + 0x0, 0x2, 0x9f, 0x60, 0x6, 0xfa, 0x20, 0x0, + 0x5, 0xcf, 0xa2, 0x0, 0x0, 0x2a, 0xfc, 0x60, + 0x1d, 0x71, 0x0, 0x0, 0x0, 0x0, 0x17, 0xc1, + + /* U+6599 "料" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0xd, 0x9, 0x61, 0xd0, 0x77, 0x0, 0xe1, 0x0, + 0xa, 0x49, 0x66, 0x80, 0xa, 0xb0, 0xe1, 0x0, + 0x5, 0x89, 0x6b, 0x10, 0x0, 0x60, 0xe1, 0x0, + 0x1, 0x39, 0x64, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x3f, 0xff, 0xff, 0xf6, 0xd3, 0x0, 0xe1, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0x3d, 0x40, 0xe1, 0x0, + 0x0, 0x8e, 0xe6, 0x0, 0x1, 0x0, 0xe1, 0x0, + 0x0, 0xda, 0x6d, 0x30, 0x0, 0x1, 0xf8, 0xa1, + 0x7, 0x89, 0x64, 0x95, 0x9c, 0xed, 0xf9, 0x50, + 0x2e, 0x19, 0x60, 0x8, 0x63, 0x10, 0xe1, 0x0, + 0x35, 0x9, 0x60, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65AD "断" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0x23, 0xe, 0x5, 0x0, 0x36, 0xaa, 0x50, 0xd2, + 0xc0, 0xe0, 0xd1, 0xf9, 0x51, 0x0, 0xd, 0x2a, + 0x2e, 0x56, 0x1e, 0x0, 0x0, 0x0, 0xd2, 0x42, + 0xe6, 0x1, 0xe0, 0x0, 0x0, 0xd, 0x69, 0x9f, + 0x99, 0x3e, 0x0, 0x0, 0x0, 0xd4, 0x58, 0xf6, + 0x52, 0xff, 0xff, 0xff, 0x2d, 0x20, 0xbf, 0xa0, + 0x1e, 0x0, 0xd2, 0x0, 0xd2, 0x3b, 0xe8, 0x72, + 0xd0, 0xd, 0x20, 0xd, 0x3d, 0x2e, 0xc, 0x4c, + 0x0, 0xd2, 0x0, 0xda, 0x80, 0xe0, 0x4, 0xb0, + 0xd, 0x20, 0xd, 0x40, 0xe, 0x0, 0x69, 0x0, + 0xd2, 0x0, 0xd4, 0x22, 0x92, 0x2a, 0x60, 0xd, + 0x20, 0xa, 0xcc, 0xcc, 0xcb, 0xe1, 0x0, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0x0, 0xd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65B0 "新" */ + 0x0, 0x3, 0x60, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x1, 0xe1, 0x0, 0x3, 0x69, 0xed, 0x40, + 0xe, 0xee, 0xff, 0xee, 0x3e, 0x85, 0x10, 0x0, + 0x0, 0xa1, 0x0, 0xb0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0xa6, 0x5, 0xb0, 0x2c, 0x0, 0x0, 0x0, + 0x0, 0x67, 0xa, 0x60, 0x2c, 0x0, 0x0, 0x0, + 0x3d, 0xdd, 0xfe, 0xdd, 0x6f, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0xe0, 0x0, 0x2c, 0x0, 0xc4, 0x0, + 0x2, 0x22, 0xe3, 0x22, 0x4b, 0x0, 0xb4, 0x0, + 0x2c, 0xcc, 0xfc, 0xcc, 0x69, 0x0, 0xb4, 0x0, + 0x0, 0x70, 0xe1, 0x60, 0x58, 0x0, 0xb4, 0x0, + 0x4, 0xb0, 0xe0, 0xc3, 0x87, 0x0, 0xb4, 0x0, + 0xd, 0x30, 0xe0, 0x4a, 0xc3, 0x0, 0xb4, 0x0, + 0x5, 0x0, 0xe0, 0x3, 0xd0, 0x0, 0xb4, 0x0, + 0x0, 0x2e, 0xc0, 0x6, 0x60, 0x0, 0xb4, 0x0, + + /* U+65B7 "斷" */ + 0x0, 0x2, 0x0, 0x40, 0x0, 0x0, 0x53, 0xd, + 0x17, 0x50, 0x38, 0x0, 0x38, 0xdb, 0x40, 0xd3, + 0xb8, 0x5c, 0x69, 0xe, 0x51, 0x0, 0xd, 0x6b, + 0x92, 0x9c, 0x10, 0xe0, 0x0, 0x0, 0xd2, 0xb8, + 0x3a, 0x6a, 0xe, 0x0, 0x0, 0xd, 0x68, 0x78, + 0x86, 0x90, 0xe6, 0x66, 0x61, 0xdd, 0xdd, 0xdd, + 0xdd, 0x1e, 0x78, 0xe7, 0x1d, 0x12, 0x30, 0x6, + 0x0, 0xe0, 0x1d, 0x0, 0xd1, 0x93, 0x16, 0x54, + 0xe, 0x1, 0xd0, 0xd, 0x5c, 0xa6, 0xd8, 0x71, + 0xd0, 0x1d, 0x0, 0xd6, 0x99, 0x27, 0xc1, 0x2c, + 0x1, 0xd0, 0xd, 0x3b, 0x92, 0xb7, 0x85, 0x90, + 0x1d, 0x0, 0xd7, 0x87, 0x88, 0x68, 0x86, 0x1, + 0xd0, 0xd, 0xed, 0xed, 0xdd, 0x8e, 0x10, 0x1d, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x1, 0xd0, + 0x0, + + /* U+65B9 "方" */ + 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe1, 0x0, 0x0, 0x0, 0xbd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x3, 0x33, + 0x39, 0xc3, 0x33, 0x33, 0x33, 0x30, 0x0, 0x0, + 0x89, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0xf, 0x41, + 0x11, 0x11, 0xe3, 0x0, 0x0, 0x4, 0xf0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x3f, 0x20, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x5, + 0xc0, 0x0, 0x2c, 0xb0, 0x0, 0x1, 0x1, 0xb8, + 0x0, 0xd, 0x80, 0x0, 0x2, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65BC "於" */ + 0x0, 0x18, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x2, 0xc0, 0x0, 0x0, 0xdd, 0x10, 0x0, + 0x3f, 0xff, 0xff, 0xf4, 0x7, 0x85, 0xa0, 0x0, + 0x0, 0x98, 0x0, 0x0, 0x3e, 0x0, 0xb6, 0x0, + 0x0, 0x97, 0x0, 0x3, 0xe4, 0x0, 0x1e, 0x70, + 0x0, 0x99, 0x33, 0x3e, 0x50, 0x0, 0x2, 0xe3, + 0x0, 0xad, 0xcd, 0xa1, 0x4, 0xb1, 0x0, 0x0, + 0x0, 0xb5, 0x7, 0x90, 0x0, 0x7e, 0x40, 0x0, + 0x0, 0xd2, 0x7, 0x80, 0x0, 0x4, 0x70, 0x0, + 0x0, 0xf0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xe0, 0xa, 0x60, 0x17, 0x0, 0x0, 0x0, + 0x7, 0xb0, 0xb, 0x40, 0x2b, 0xe5, 0x0, 0x0, + 0xe, 0x50, 0xe, 0x20, 0x0, 0x4e, 0xb1, 0x0, + 0x4c, 0xa, 0xfb, 0x0, 0x0, 0x0, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65BD "施" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x5c, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0xa6, 0x0, 0x0, 0x0, + 0x28, 0x89, 0xd8, 0x82, 0xff, 0xee, 0xee, 0xe5, + 0x27, 0xbb, 0x77, 0x7b, 0x81, 0x15, 0x11, 0x10, + 0x0, 0x97, 0x0, 0x3d, 0x60, 0x1d, 0x3, 0x50, + 0x0, 0xac, 0x99, 0x41, 0xe1, 0x1f, 0xce, 0xb0, + 0x0, 0xba, 0x6b, 0x70, 0xe7, 0xdf, 0x53, 0xb0, + 0x0, 0xc4, 0x9, 0x65, 0xfb, 0x5d, 0x3, 0xb0, + 0x0, 0xd1, 0x9, 0x6a, 0xf1, 0x1d, 0x4, 0xb0, + 0x0, 0xe0, 0xa, 0x50, 0xe1, 0x1d, 0x4, 0xa0, + 0x3, 0xd0, 0xb, 0x50, 0xe1, 0x1d, 0x6d, 0x40, + 0x8, 0x80, 0xc, 0x40, 0xe1, 0xb, 0x0, 0x21, + 0x1e, 0x30, 0xe, 0x20, 0xe2, 0x0, 0x0, 0x96, + 0x3a, 0xe, 0xfa, 0x0, 0x8f, 0xff, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65C1 "旁" */ + 0x0, 0x0, 0x0, 0x5, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xa0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x97, 0x0, 0x0, 0x79, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x10, 0x0, 0xe3, 0x0, 0x0, + 0xa, 0xee, 0xef, 0xee, 0xef, 0xfe, 0xee, 0x90, + 0xa, 0x50, 0x0, 0x5, 0x20, 0x0, 0x6, 0xa0, + 0x7, 0x30, 0x0, 0x8, 0xb0, 0x0, 0x4, 0x60, + 0x2e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe2, + 0x0, 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x51, 0x11, 0x11, 0x10, 0x0, + 0x0, 0x0, 0x7f, 0xcc, 0xcc, 0xcd, 0xf1, 0x0, + 0x0, 0x4, 0xf6, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x2, 0x8f, 0x80, 0x0, 0x0, 0x7, 0xb0, 0x0, + 0x3f, 0xa3, 0x0, 0x0, 0x8e, 0xed, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65C5 "旅" */ + 0x0, 0x6, 0x10, 0x0, 0x18, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x6a, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x90, 0x0, 0xca, 0x77, 0x77, 0x70, + 0x2e, 0xee, 0xee, 0xe4, 0xe8, 0x88, 0x88, 0x80, + 0x0, 0x69, 0x0, 0x1d, 0x40, 0x1, 0x6d, 0x60, + 0x0, 0x69, 0x0, 0x29, 0x49, 0xde, 0x94, 0x0, + 0x0, 0x6e, 0xcc, 0x60, 0xe6, 0x6a, 0x0, 0x0, + 0x0, 0x6a, 0x39, 0x80, 0xe1, 0x1e, 0x6, 0xc0, + 0x0, 0x78, 0x7, 0x70, 0xe1, 0xe, 0xac, 0x10, + 0x0, 0x96, 0x8, 0x70, 0xe1, 0x9, 0xb0, 0x0, + 0x0, 0xb3, 0x9, 0x60, 0xe1, 0x4, 0xd0, 0x0, + 0x0, 0xf0, 0xa, 0x50, 0xe1, 0x0, 0xe4, 0x0, + 0x5, 0xa0, 0xb, 0x40, 0xe1, 0x46, 0x6c, 0x0, + 0xd, 0x40, 0xe, 0x20, 0xfd, 0xc4, 0xc, 0xc0, + 0x4b, 0x9, 0xfa, 0x3, 0xc4, 0x0, 0x0, 0xa1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+65CF "族" */ + 0x0, 0x16, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x50, 0x0, 0x5c, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xc0, 0x0, 0xbb, 0x77, 0x77, 0x71, + 0x3f, 0xff, 0xff, 0xe3, 0xe7, 0x77, 0x77, 0x71, + 0x0, 0x6a, 0x0, 0x1d, 0x58, 0x50, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x3a, 0x1f, 0x20, 0x0, 0x0, + 0x0, 0x7a, 0x22, 0x10, 0x8f, 0xff, 0xff, 0x70, + 0x0, 0x7e, 0xce, 0x74, 0xe3, 0x3f, 0x11, 0x0, + 0x0, 0x97, 0x8, 0x73, 0x30, 0x1e, 0x0, 0x0, + 0x0, 0xa6, 0x8, 0x6a, 0xdd, 0xdf, 0xdd, 0xd2, + 0x0, 0xc4, 0x9, 0x61, 0x22, 0x7f, 0x72, 0x20, + 0x0, 0xf1, 0xa, 0x50, 0x0, 0xc9, 0xd0, 0x0, + 0x4, 0xd0, 0xb, 0x40, 0x7, 0xc0, 0xb5, 0x0, + 0xb, 0x70, 0xe, 0x20, 0x8d, 0x10, 0x2e, 0x30, + 0x2e, 0xa, 0xfb, 0xd, 0xa1, 0x0, 0x3, 0xe2, + 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+65E2 "既" */ + 0x3, 0x33, 0x33, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xfb, 0xbb, 0xf0, 0xbe, 0xef, 0xfe, 0xe0, 0x2d, + 0x0, 0xf, 0x0, 0x30, 0x95, 0x0, 0x2, 0xfb, + 0xbc, 0xf0, 0x3b, 0xa, 0x40, 0x0, 0x2e, 0x11, + 0x2f, 0x7, 0x80, 0xb3, 0x0, 0x2, 0xd0, 0x0, + 0xf0, 0xc5, 0x1e, 0x31, 0x10, 0x2f, 0xdd, 0xdf, + 0x1e, 0xdd, 0xfd, 0xdd, 0x42, 0xe1, 0x11, 0x10, + 0x0, 0x5c, 0x10, 0x0, 0x2d, 0x0, 0x70, 0x0, + 0xa, 0xd6, 0x0, 0x2, 0xd0, 0x9, 0x70, 0x1, + 0xe8, 0x60, 0x0, 0x2d, 0x0, 0x8e, 0x0, 0x88, + 0x76, 0x1, 0x2, 0xe8, 0xe9, 0xc4, 0x2f, 0x17, + 0x60, 0x47, 0x7f, 0x91, 0x2, 0x2d, 0x70, 0x77, + 0x6, 0x62, 0x20, 0x0, 0xb, 0xa0, 0x4, 0xef, + 0xd2, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, + + /* U+65E5 "日" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x10, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe3, + 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x1f, 0x11, 0x11, 0x11, 0x11, 0xe3, + 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0xe3, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0xe3, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe3, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0xd2, + + /* U+65E6 "旦" */ + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x97, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x96, + 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, 0x96, 0x0, + 0x0, 0x0, 0x5c, 0x0, 0x0, 0x97, 0x0, 0x0, + 0x0, 0x5c, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x5c, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x0, 0x5c, 0x0, + 0x0, 0x96, 0x0, 0x0, 0x0, 0x5c, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x1, + 0x11, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, + + /* U+65E9 "早" */ + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x5f, 0xee, 0xee, 0xee, 0xee, 0xf9, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x5e, 0xee, 0xef, 0xfe, 0xee, 0xe9, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x1d, 0xdd, 0xdd, 0xde, 0xfd, 0xdd, 0xdd, 0xd6, + 0x2, 0x22, 0x22, 0x28, 0xb2, 0x22, 0x22, 0x21, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + + /* U+65F6 "时" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0xb, + 0xdd, 0xdd, 0x0, 0x0, 0x0, 0xe2, 0x0, 0xd3, + 0x0, 0xf0, 0x11, 0x11, 0x1f, 0x31, 0xd, 0x20, + 0xf, 0x3f, 0xff, 0xff, 0xff, 0xf2, 0xd2, 0x0, + 0xf0, 0x0, 0x0, 0xe, 0x20, 0xd, 0x53, 0x3f, + 0x2, 0x40, 0x0, 0xe2, 0x0, 0xdc, 0xbb, 0xf0, + 0x2e, 0x20, 0xe, 0x20, 0xd, 0x20, 0xf, 0x0, + 0x6c, 0x0, 0xe2, 0x0, 0xd2, 0x0, 0xf0, 0x0, + 0xc7, 0xe, 0x20, 0xd, 0x20, 0xf, 0x0, 0x2, + 0x20, 0xe2, 0x0, 0xde, 0xee, 0xf0, 0x0, 0x0, + 0xe, 0x20, 0xd, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xe2, 0x0, 0x71, 0x0, 0x0, 0x0, 0x11, 0x1f, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0xa0, + 0x0, + + /* U+6607 "昇" */ + 0x0, 0x5f, 0xdd, 0xdd, 0xdd, 0xdd, 0xea, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0x5c, 0x33, 0x33, 0x33, 0x33, 0x8a, 0x0, + 0x0, 0x5e, 0xaa, 0xaa, 0xaa, 0xaa, 0xca, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x6a, 0x0, + 0x0, 0x4e, 0xee, 0xee, 0xee, 0xee, 0xe9, 0x0, + 0x0, 0x2, 0x57, 0xbe, 0x80, 0x2e, 0x0, 0x0, + 0x2, 0xdb, 0x9f, 0x50, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0x0, 0x2e, 0x0, 0x0, + 0x1e, 0xee, 0xef, 0xee, 0xee, 0xef, 0xee, 0xe6, + 0x0, 0x0, 0x2f, 0x10, 0x0, 0x3e, 0x0, 0x0, + 0x0, 0x0, 0xb9, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x3c, 0xc1, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x3, 0xd6, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+660E "明" */ + 0xef, 0xff, 0xf1, 0x2f, 0xff, 0xff, 0xfc, 0xe1, + 0x0, 0xe1, 0x2e, 0x0, 0x0, 0x3c, 0xe1, 0x0, + 0xe1, 0x2e, 0x0, 0x0, 0x3c, 0xe1, 0x0, 0xe1, + 0x2e, 0x0, 0x0, 0x3c, 0xe2, 0x0, 0xe1, 0x2f, + 0xcc, 0xcc, 0xdc, 0xee, 0xee, 0xf1, 0x2f, 0x55, + 0x55, 0x8c, 0xe1, 0x0, 0xe1, 0x2e, 0x0, 0x0, + 0x3c, 0xe1, 0x0, 0xe1, 0x3d, 0x0, 0x0, 0x3c, + 0xe1, 0x0, 0xe1, 0x6f, 0xdd, 0xdd, 0xdc, 0xef, + 0xff, 0xf1, 0x99, 0x11, 0x11, 0x4c, 0xe2, 0x0, + 0x1, 0xf3, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x8, + 0xc0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x7f, 0x20, + 0x0, 0x0, 0x5c, 0x0, 0x1, 0xe3, 0x0, 0x0, + 0xef, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6613 "易" */ + 0x0, 0xf, 0xee, 0xee, 0xee, 0xee, 0xf2, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0xf, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0xfe, 0xdd, 0xdd, 0xdd, 0xdf, 0x20, 0x0, 0xf, + 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0xfb, + 0xbb, 0xbb, 0xbb, 0xbf, 0x20, 0x0, 0x2, 0x9d, + 0x32, 0x22, 0x22, 0x20, 0x0, 0x0, 0x4f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xfe, 0xff, + 0xef, 0xff, 0xef, 0x20, 0x7f, 0x60, 0x1d, 0x30, + 0x6b, 0x0, 0xf0, 0x1b, 0x20, 0xd, 0x60, 0x1e, + 0x20, 0x1f, 0x0, 0x0, 0x2c, 0x80, 0xa, 0x90, + 0x4, 0xc0, 0x0, 0x6e, 0x60, 0x9, 0xc0, 0x0, + 0x99, 0x0, 0x5, 0x30, 0x3, 0xc0, 0x1e, 0xec, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6614 "昔" */ + 0x0, 0x0, 0x3d, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x22, 0x5e, 0x22, 0x22, 0xd6, 0x22, 0x0, + 0x2, 0xcc, 0xdf, 0xcc, 0xcc, 0xfd, 0xcc, 0x40, + 0x0, 0x0, 0x3d, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0xc5, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xee, 0xee, 0xee, 0xee, 0xb0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0xb, 0xee, 0xee, 0xee, 0xee, 0xc0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x5, 0xc0, 0x0, + 0x0, 0xb, 0x61, 0x11, 0x11, 0x16, 0xc0, 0x0, + 0x0, 0xb, 0xed, 0xdd, 0xdd, 0xde, 0xc0, 0x0, + + /* U+661F "星" */ + 0x0, 0x4f, 0xdd, 0xdd, 0xdd, 0xdd, 0xf5, 0x0, + 0x4, 0xc0, 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, + 0x4c, 0x22, 0x22, 0x22, 0x22, 0xc5, 0x0, 0x4, + 0xeb, 0xbb, 0xbb, 0xbb, 0xbe, 0x50, 0x0, 0x4c, + 0x0, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x3, 0xed, + 0xdd, 0xdd, 0xdd, 0xde, 0x40, 0x0, 0x7, 0x80, + 0x5, 0x50, 0x0, 0x0, 0x0, 0x2, 0xf6, 0x22, + 0xaa, 0x22, 0x22, 0x20, 0x1, 0xdd, 0xbb, 0xbe, + 0xeb, 0xbb, 0xbb, 0x0, 0xd9, 0x0, 0x0, 0x88, + 0x0, 0x0, 0x0, 0x2, 0x1e, 0xee, 0xef, 0xfe, + 0xee, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, + + /* U+6620 "映" */ + 0x11, 0x11, 0x0, 0x0, 0xf, 0x0, 0x0, 0xe, + 0xbb, 0xf1, 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe1, + 0xe, 0x11, 0xee, 0xff, 0xee, 0xe1, 0xe, 0x10, + 0xe1, 0x1e, 0x1, 0xf0, 0xe, 0x10, 0xe1, 0xe, + 0x11, 0xe0, 0xf, 0x0, 0xe1, 0xe, 0xbb, 0xf1, + 0x1e, 0x0, 0xf0, 0xe, 0x10, 0xe4, 0x3e, 0x11, + 0xe0, 0x1e, 0x0, 0xe1, 0xe, 0x10, 0xe5, 0xbf, + 0xbc, 0xfb, 0xbf, 0xb0, 0xe1, 0xe, 0x24, 0x44, + 0x9f, 0x84, 0x44, 0xe, 0x10, 0xe1, 0x0, 0xb, + 0xba, 0x0, 0x0, 0xee, 0xef, 0x10, 0x4, 0xe1, + 0xe2, 0x0, 0xe, 0x10, 0x0, 0x3, 0xe5, 0x6, + 0xc0, 0x0, 0x70, 0x0, 0x6, 0xe6, 0x0, 0xb, + 0xa0, 0x0, 0x0, 0xb, 0xc3, 0x0, 0x0, 0xb, + 0xc0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x1, + 0x0, + + /* U+6625 "春" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, + 0x3, 0xee, 0xee, 0xef, 0xee, 0xee, 0xee, 0x30, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xae, 0xee, 0xff, 0xee, 0xee, 0xeb, 0x0, + 0x0, 0x0, 0x3, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xdd, 0xdf, 0xfd, 0xdd, 0xdd, 0xdd, 0xd1, + 0x1, 0x11, 0xbc, 0x11, 0x11, 0xab, 0x11, 0x10, + 0x0, 0x8, 0xf5, 0x22, 0x22, 0x3f, 0x90, 0x0, + 0x0, 0x9f, 0xfc, 0xcc, 0xcc, 0xcf, 0xfa, 0x10, + 0x2d, 0xc4, 0xf0, 0x0, 0x0, 0xe, 0x5a, 0xe2, + 0x4, 0x1, 0xfd, 0xdd, 0xdd, 0xdf, 0x30, 0x20, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0x1, 0xf1, 0x11, 0x11, 0x1e, 0x30, 0x0, + 0x0, 0x1, 0xfc, 0xcc, 0xcc, 0xce, 0x30, 0x0, + + /* U+6628 "昨" */ + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, + 0x44, 0x44, 0x0, 0xe0, 0x0, 0x0, 0x0, 0xeb, + 0xab, 0xe0, 0x4b, 0x0, 0x0, 0x0, 0xe, 0x10, + 0x1e, 0x9, 0xff, 0xff, 0xff, 0xf6, 0xe1, 0x1, + 0xe0, 0xe1, 0xd3, 0x0, 0x0, 0xe, 0x10, 0x1e, + 0x7a, 0xd, 0x30, 0x0, 0x0, 0xe6, 0x56, 0xec, + 0x20, 0xd6, 0x44, 0x42, 0xe, 0xaa, 0xae, 0x10, + 0xd, 0xcb, 0xbb, 0x70, 0xe1, 0x1, 0xe0, 0x0, + 0xd3, 0x0, 0x0, 0xe, 0x10, 0x1e, 0x0, 0xd, + 0x30, 0x0, 0x0, 0xe1, 0x1, 0xe0, 0x0, 0xde, + 0xee, 0xeb, 0xe, 0xee, 0xee, 0x0, 0xd, 0x30, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, + + /* U+662F "是" */ + 0x0, 0x5f, 0xdd, 0xdd, 0xdd, 0xdd, 0xf4, 0x0, + 0x0, 0x5a, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0x5e, 0xbb, 0xbb, 0xbb, 0xbb, 0xf4, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0x5b, 0x11, 0x11, 0x11, 0x11, 0xd4, 0x0, + 0x0, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xd, 0xdd, 0xdd, 0xde, 0xfd, 0xdd, 0xdd, 0xd1, + 0x0, 0x3, 0x60, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x90, 0x6, 0xc3, 0x33, 0x33, 0x0, + 0x0, 0xf, 0xa0, 0x6, 0xeb, 0xbb, 0xbb, 0x0, + 0x0, 0x6c, 0xd5, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x3, 0xf3, 0x2e, 0xca, 0xb1, 0x0, 0x0, 0x0, + 0x2e, 0x50, 0x0, 0x6b, 0xef, 0xff, 0xff, 0xf2, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+663C "昼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xee, 0xee, 0xee, 0xee, 0xf8, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xa7, 0x0, 0x0, 0x0, 0xe5, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + 0x6, 0xd8, 0xed, 0xdd, 0xdd, 0xdf, 0xf8, 0x10, + 0x2f, 0x58, 0x60, 0x0, 0x0, 0xc, 0x7b, 0xe1, + 0x26, 0x8, 0xec, 0xcc, 0xcc, 0xcf, 0x40, 0x10, + 0x0, 0x8, 0x60, 0x0, 0x0, 0xc, 0x40, 0x0, + 0x0, 0x8, 0x82, 0x22, 0x22, 0x2c, 0x40, 0x0, + 0x0, 0x5, 0xaa, 0xaa, 0xaa, 0xaa, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+6642 "時" */ + 0xef, 0xff, 0xc0, 0x0, 0xf, 0x0, 0x0, 0xe, + 0x10, 0x3c, 0x13, 0x34, 0xf4, 0x33, 0x20, 0xe1, + 0x3, 0xc3, 0xbb, 0xbf, 0xbb, 0xb5, 0xe, 0x10, + 0x3c, 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe1, 0x3, + 0xc7, 0x77, 0x7f, 0x77, 0x77, 0x1e, 0xee, 0xec, + 0x56, 0x66, 0x66, 0xf7, 0x61, 0xe2, 0x14, 0xc0, + 0x0, 0x0, 0xe, 0x20, 0xe, 0x10, 0x3c, 0x9b, + 0xbb, 0xbb, 0xfb, 0xb0, 0xe1, 0x3, 0xc3, 0x43, + 0x33, 0x3f, 0x53, 0xe, 0x10, 0x3c, 0x9, 0x70, + 0x0, 0xe2, 0x0, 0xee, 0xef, 0xc0, 0xd, 0x40, + 0xe, 0x20, 0xa, 0x10, 0x0, 0x0, 0x28, 0x0, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, + + /* U+6669 "晩" */ + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x2, + 0x22, 0x20, 0x1, 0xf3, 0x0, 0x0, 0x0, 0xec, + 0xcf, 0x20, 0x9f, 0xee, 0xfb, 0x0, 0xe, 0x10, + 0xc2, 0x5e, 0x10, 0x1d, 0x30, 0x0, 0xe1, 0xc, + 0x7f, 0xa7, 0x7c, 0xc7, 0x76, 0xe, 0x10, 0xca, + 0xe8, 0x66, 0xf6, 0x68, 0xc0, 0xed, 0xdf, 0x2b, + 0x30, 0xe, 0x0, 0x2c, 0xe, 0x31, 0xc2, 0xb3, + 0x0, 0xe0, 0x2, 0xc0, 0xe1, 0xc, 0x2b, 0x63, + 0x4f, 0x33, 0x6c, 0xe, 0x10, 0xc2, 0x8b, 0xfc, + 0xbf, 0xbb, 0x90, 0xe1, 0xc, 0x20, 0xf, 0x20, + 0xf1, 0x0, 0xe, 0xee, 0xf2, 0x4, 0xe0, 0xf, + 0x10, 0x0, 0xe1, 0x0, 0x0, 0xc7, 0x0, 0xf1, + 0x6, 0x55, 0x0, 0x3, 0xca, 0x0, 0xf, 0x20, + 0x86, 0x0, 0x7, 0xd6, 0x0, 0x0, 0xbf, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+666E "普" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0xe4, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x33, 0x8b, 0x33, 0x33, 0xd8, 0x33, 0x10, + 0x2, 0xab, 0xab, 0xfa, 0xaf, 0xba, 0xba, 0x40, + 0x0, 0x3c, 0x1, 0xd0, 0xe, 0x10, 0xd3, 0x0, + 0x0, 0xc, 0x51, 0xd0, 0xe, 0x16, 0xb0, 0x0, + 0x1, 0x15, 0x63, 0xe1, 0x1f, 0x28, 0x31, 0x10, + 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd2, + 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x0, 0xe, 0xcb, 0xbb, 0xbb, 0xbc, 0xf0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xe, 0xed, 0xdd, 0xdd, 0xdd, 0xf0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xe, 0xed, 0xdd, 0xdd, 0xde, 0xe0, 0x0, + + /* U+666F "景" */ + 0x0, 0x3f, 0xbb, 0xbb, 0xbb, 0xbb, 0xf3, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, + 0x0, 0x3f, 0xbb, 0xbb, 0xbb, 0xbb, 0xf3, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x0, + 0x0, 0x3c, 0xcc, 0xce, 0xcc, 0xcc, 0xc3, 0x0, + 0x4, 0x44, 0x44, 0x4d, 0x84, 0x44, 0x44, 0x40, + 0x7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, + 0x0, 0xa, 0xbb, 0xbb, 0xbb, 0xbb, 0xb0, 0x0, + 0x0, 0xe, 0x30, 0x0, 0x0, 0x2, 0xf0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xb, 0xdd, 0xde, 0xed, 0xdd, 0xc0, 0x0, + 0x0, 0x2, 0xa3, 0x8, 0x80, 0x76, 0x10, 0x0, + 0x4, 0xad, 0x40, 0x8, 0x80, 0x16, 0xda, 0x20, + 0x8, 0x40, 0x6, 0xde, 0x50, 0x0, 0x5, 0x80, + + /* U+6674 "晴" */ + 0x22, 0x22, 0x0, 0x0, 0xe, 0x10, 0x0, 0xe, + 0xbb, 0xf0, 0x9d, 0xdd, 0xfd, 0xdd, 0xc0, 0xe0, + 0xe, 0x0, 0x0, 0xe, 0x10, 0x0, 0xe, 0x0, + 0xe0, 0x3c, 0xcc, 0xfd, 0xcc, 0x70, 0xe0, 0xe, + 0x0, 0x0, 0xf, 0x10, 0x0, 0xe, 0x66, 0xf2, + 0xdd, 0xdd, 0xdd, 0xdd, 0xd2, 0xe8, 0x8f, 0x0, + 0x22, 0x22, 0x22, 0x20, 0xe, 0x0, 0xe0, 0xf, + 0xba, 0xaa, 0xaf, 0x20, 0xe0, 0xe, 0x0, 0xf0, + 0x0, 0x0, 0xd2, 0xe, 0x0, 0xe0, 0xf, 0xcc, + 0xcc, 0xcf, 0x20, 0xea, 0xaf, 0x0, 0xf0, 0x0, + 0x0, 0xd2, 0xe, 0x33, 0x30, 0xf, 0xcc, 0xcc, + 0xcf, 0x20, 0x50, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0x0, 0xf, 0x0, 0x7, 0xdd, + 0x0, + + /* U+667A "智" */ + 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfe, 0xfe, 0xd8, 0x4f, 0xff, 0xff, 0x40, 0xd4, + 0xd, 0x30, 0x4, 0xb0, 0x0, 0xb4, 0x1b, 0x99, + 0xfb, 0x99, 0x4b, 0x0, 0xb, 0x40, 0x22, 0x5f, + 0x52, 0x24, 0xb0, 0x0, 0xb4, 0x0, 0xb, 0x7d, + 0x90, 0x4f, 0xcc, 0xcf, 0x40, 0x1b, 0x90, 0xb, + 0xa0, 0x22, 0x22, 0x20, 0x1e, 0x71, 0x11, 0x12, + 0x11, 0x11, 0x10, 0x0, 0x0, 0xcd, 0xcc, 0xcc, + 0xcc, 0xde, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0xce, 0xdd, 0xdd, 0xdd, + 0xde, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x2, + 0xe0, 0x0, 0x0, 0xc3, 0x0, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0xc, 0xed, 0xdd, 0xdd, 0xde, 0xe0, + 0x0, + + /* U+6687 "暇" */ + 0x11, 0x11, 0xf, 0xee, 0xf3, 0xee, 0xfd, 0xe, + 0xdd, 0xe0, 0xf0, 0xe, 0x0, 0x1, 0xd0, 0xe0, + 0xe, 0xf, 0x0, 0xe0, 0x0, 0x1d, 0xe, 0x0, + 0xe0, 0xf0, 0xe, 0x0, 0x1, 0xd0, 0xe0, 0xe, + 0xf, 0xee, 0xf3, 0xee, 0xed, 0xe, 0xcc, 0xe0, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x4e, 0xf, + 0x0, 0x6, 0x88, 0x87, 0xe, 0x0, 0xe0, 0xfe, + 0xea, 0x6c, 0x68, 0xd0, 0xe0, 0xe, 0xf, 0x0, + 0x0, 0xd0, 0x88, 0xe, 0x0, 0xe0, 0xf1, 0x11, + 0x9, 0x5e, 0x30, 0xee, 0xee, 0xf, 0xdd, 0xd0, + 0x3e, 0xa0, 0xe, 0x0, 0x0, 0xf0, 0x0, 0x4, + 0xf6, 0x0, 0x90, 0x0, 0xf, 0x0, 0x6, 0xe8, + 0xe4, 0x0, 0x0, 0x0, 0xf0, 0x8, 0xa2, 0x2, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6691 "暑" */ + 0x0, 0x6e, 0xcc, 0xcc, 0xcc, 0xcc, 0xf2, 0x0, + 0x6, 0x90, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x6e, 0xbb, 0xbb, 0xbb, 0xbb, 0xf2, 0x0, 0x6, + 0xa2, 0x22, 0x22, 0x22, 0x2e, 0x20, 0x0, 0x49, + 0x99, 0xbb, 0x99, 0x99, 0x98, 0x10, 0x9, 0xaa, + 0xad, 0xda, 0xaa, 0x7c, 0x90, 0x0, 0x22, 0x22, + 0x99, 0x24, 0xcd, 0x30, 0x0, 0xaa, 0xaa, 0xad, + 0xda, 0xff, 0xba, 0xaa, 0x3, 0x33, 0x49, 0xee, + 0x73, 0x33, 0x33, 0x30, 0x37, 0xbf, 0xff, 0xcb, + 0xbb, 0xbb, 0x50, 0x1d, 0x97, 0xc0, 0x0, 0x0, + 0x0, 0xa6, 0x0, 0x0, 0x3f, 0xbb, 0xbb, 0xbb, + 0xbe, 0x60, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, + 0xa6, 0x0, 0x0, 0x3f, 0xbb, 0xbb, 0xbb, 0xbe, + 0x60, + + /* U+6696 "暖" */ + 0x0, 0x0, 0x0, 0x12, 0x34, 0x68, 0xa1, 0x0, + 0x0, 0x2, 0xdc, 0xcb, 0xa8, 0x64, 0x10, 0xde, + 0xef, 0x12, 0x30, 0x95, 0x1, 0xd1, 0xd, 0x10, + 0xe1, 0x4a, 0x6, 0x80, 0x89, 0x0, 0xd1, 0xe, + 0x10, 0xc0, 0x37, 0x1e, 0x10, 0xd, 0x10, 0xe1, + 0xee, 0xfe, 0xee, 0xee, 0xa0, 0xd9, 0x8f, 0x10, + 0x1f, 0x0, 0x0, 0x0, 0xd, 0x54, 0xe9, 0xee, + 0xfe, 0xee, 0xee, 0xe1, 0xd1, 0xe, 0x10, 0x6a, + 0x0, 0x0, 0x0, 0xd, 0x10, 0xe1, 0x9, 0xed, + 0xdd, 0xda, 0x0, 0xd1, 0xe, 0x10, 0xee, 0x10, + 0x9, 0x70, 0xd, 0xee, 0xf1, 0x5b, 0x6b, 0x3, + 0xe1, 0x0, 0xd1, 0x0, 0xe, 0x30, 0x9c, 0xe4, + 0x0, 0x7, 0x0, 0xa, 0x90, 0x7, 0xfe, 0x60, + 0x0, 0x0, 0xb, 0xa1, 0x9e, 0xa1, 0x3b, 0xfb, + 0x10, 0x0, 0x20, 0x5, 0x10, 0x0, 0x1, 0x50, + + /* U+6697 "暗" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x6, + 0x77, 0x70, 0x0, 0x0, 0xd3, 0x0, 0x0, 0xd9, + 0x8e, 0x14, 0xbb, 0xbe, 0xdb, 0xba, 0xd, 0x10, + 0xd1, 0x15, 0xa3, 0x33, 0x6a, 0x30, 0xd1, 0xd, + 0x10, 0xf, 0x10, 0x9, 0x80, 0xd, 0x10, 0xd1, + 0x0, 0xa5, 0x0, 0xe1, 0x0, 0xda, 0xaf, 0x1e, + 0xef, 0xee, 0xff, 0xee, 0x6d, 0x54, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd1, 0xd, 0x10, 0x9c, + 0xcc, 0xcc, 0xc5, 0xd, 0x10, 0xd1, 0xc, 0x41, + 0x11, 0x1a, 0x60, 0xd1, 0xd, 0x10, 0xc5, 0x22, + 0x22, 0xb6, 0xd, 0xee, 0xf1, 0xc, 0xcb, 0xbb, + 0xbe, 0x60, 0xd1, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x96, 0x6, 0x0, 0x0, 0xc, 0x52, 0x22, 0x2b, + 0x60, 0x0, 0x0, 0x0, 0xcd, 0xcc, 0xcc, 0xe6, + 0x0, + + /* U+66C7 "曇" */ + 0x0, 0x6d, 0x99, 0x99, 0x99, 0x99, 0xe4, 0x0, + 0x0, 0x6c, 0x88, 0x88, 0x88, 0x88, 0xe4, 0x0, + 0x0, 0x6a, 0x22, 0x22, 0x22, 0x22, 0xc4, 0x0, + 0x0, 0x49, 0x99, 0x99, 0x99, 0x99, 0x93, 0x0, + 0x0, 0x99, 0x99, 0x9b, 0xb9, 0x99, 0x99, 0x10, + 0x8, 0x99, 0x99, 0x9d, 0xc9, 0x99, 0x99, 0x80, + 0xc, 0x35, 0x55, 0x39, 0x74, 0x55, 0x54, 0xc0, + 0x7, 0x14, 0x55, 0x29, 0x63, 0x55, 0x41, 0x70, + 0x0, 0x19, 0x99, 0x59, 0x66, 0x99, 0x92, 0x0, + 0x0, 0x37, 0x77, 0x77, 0x77, 0x77, 0x74, 0x0, + 0x0, 0x13, 0x33, 0x33, 0x33, 0x33, 0x32, 0x0, + 0x2c, 0xcc, 0xcf, 0xdc, 0xcc, 0xec, 0xcc, 0xc1, + 0x0, 0x1, 0xc9, 0x0, 0x0, 0x9d, 0x50, 0x0, + 0x0, 0x4f, 0xeb, 0xbc, 0xcc, 0xcd, 0xe9, 0x0, + 0x0, 0x13, 0x21, 0x0, 0x0, 0x0, 0x6, 0x0, + + /* U+66DC "曜" */ + 0x11, 0x11, 0x2c, 0xcc, 0xe5, 0xcc, 0xdc, 0xe, + 0xdd, 0xe0, 0x41, 0xe, 0x5, 0x2, 0xc0, 0xe0, + 0xe, 0x2, 0xc1, 0xe0, 0x5b, 0x2c, 0xe, 0x0, + 0xe0, 0x6, 0xbe, 0x0, 0x7b, 0xc0, 0xe0, 0xe, + 0x2c, 0x71, 0xe4, 0xc6, 0x3c, 0xe, 0xcc, 0xe0, + 0x5, 0x80, 0x91, 0x0, 0x0, 0xe6, 0x6e, 0x0, + 0xd6, 0x9, 0x80, 0x0, 0xe, 0x0, 0xe0, 0x7f, + 0xdd, 0xee, 0xdd, 0xc0, 0xe0, 0xe, 0x3f, 0xe0, + 0x6, 0x90, 0x0, 0xe, 0x0, 0xeb, 0x7f, 0xcc, + 0xde, 0xcc, 0x50, 0xea, 0xae, 0x1, 0xe0, 0x6, + 0x90, 0x0, 0xe, 0x44, 0x40, 0x1f, 0xbb, 0xde, + 0xbb, 0x50, 0x80, 0x0, 0x1, 0xe0, 0x6, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xcc, 0xcc, 0xcc, + 0xc3, + + /* U+66F2 "曲" */ + 0x0, 0x0, 0x1e, 0x0, 0x3d, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x3d, 0x0, 0x0, 0x1, 0x11, + 0x3e, 0x11, 0x4d, 0x11, 0x11, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x2d, 0x0, 0x1e, 0x0, + 0x3d, 0x0, 0x2e, 0x2d, 0x0, 0x1e, 0x0, 0x3d, + 0x0, 0x2e, 0x2d, 0x0, 0x1e, 0x0, 0x3d, 0x0, + 0x2e, 0x2f, 0xbb, 0xcf, 0xbb, 0xcf, 0xbb, 0xce, + 0x2e, 0x33, 0x5f, 0x33, 0x6e, 0x33, 0x5e, 0x2d, + 0x0, 0x1e, 0x0, 0x3d, 0x0, 0x2e, 0x2d, 0x0, + 0x1e, 0x0, 0x3d, 0x0, 0x2e, 0x2d, 0x0, 0x1e, + 0x0, 0x3d, 0x0, 0x2e, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x2d, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x3d, + + /* U+66F4 "更" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xee, 0xef, 0xfe, 0xee, 0xef, 0x0, + 0x0, 0x78, 0x0, 0x7, 0xa0, 0x0, 0x1f, 0x0, + 0x0, 0x7e, 0xbb, 0xbd, 0xeb, 0xbb, 0xcf, 0x0, + 0x0, 0x79, 0x22, 0x28, 0xb2, 0x22, 0x3f, 0x0, + 0x0, 0x78, 0x0, 0x7, 0x90, 0x0, 0x1f, 0x0, + 0x0, 0x7f, 0xee, 0xef, 0xfe, 0xee, 0xef, 0x0, + 0x0, 0x8, 0x40, 0xd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe3, 0x6d, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x48, 0xea, 0x8e, 0xc8, 0x53, 0x21, 0x0, + 0xe, 0xc8, 0x20, 0x0, 0x37, 0xac, 0xef, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+66F8 "書" */ + 0x0, 0x1, 0x11, 0x1a, 0x81, 0x11, 0x10, 0x0, + 0x0, 0x27, 0x77, 0x7c, 0xb7, 0x77, 0xf1, 0x0, + 0xc, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xfc, 0xc1, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0xf2, 0x0, + 0x0, 0x6c, 0xcc, 0xce, 0xec, 0xcc, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xbb, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0x0, + 0x4, 0x44, 0x44, 0x4b, 0xa4, 0x44, 0x44, 0x40, + 0x7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, + 0x0, 0xc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0xf, 0xbb, 0xbb, 0xbb, 0xbb, 0xf3, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xe3, 0x0, + 0x0, 0xf, 0xcc, 0xcc, 0xcc, 0xcc, 0xf3, 0x0, + + /* U+66FE "曾" */ + 0x0, 0x10, 0x0, 0x0, 0x11, 0x0, 0x0, 0xb6, + 0x0, 0x0, 0xd7, 0x0, 0x11, 0x3c, 0x21, 0x1a, + 0xb2, 0x11, 0xec, 0xbb, 0xbf, 0xcb, 0xbb, 0xcf, + 0xe3, 0xb1, 0xd, 0x20, 0x58, 0x2f, 0xe2, 0x3b, + 0xd, 0x22, 0xd1, 0x2f, 0xe2, 0x5, 0xd, 0x26, + 0x20, 0x2f, 0xcd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xdc, + 0xcc, 0xcc, 0xcd, 0xf0, 0xe, 0x20, 0x0, 0x0, + 0x2, 0xf0, 0xe, 0xdc, 0xcc, 0xcc, 0xcd, 0xf0, + 0xe, 0x20, 0x0, 0x0, 0x2, 0xf0, 0xe, 0xba, + 0xaa, 0xaa, 0xab, 0xf0, 0xe, 0x53, 0x33, 0x33, + 0x35, 0xe0, + + /* U+66FF "替" */ + 0x0, 0x0, 0xf0, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x7, 0xdd, 0xfd, 0xd2, 0x7d, 0xef, 0xdd, 0x70, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0x3d, 0x0, 0x0, + 0xc, 0xcd, 0xfc, 0xc5, 0xbc, 0xdf, 0xcc, 0xc0, + 0x1, 0x1a, 0xe4, 0x10, 0x11, 0xdb, 0xa1, 0x10, + 0x0, 0x4e, 0x4d, 0x70, 0xb, 0x90, 0xc6, 0x0, + 0x6, 0xe3, 0x1, 0x92, 0xe8, 0x0, 0x1c, 0xb1, + 0x9, 0x1a, 0xbb, 0xbb, 0xcb, 0xbb, 0xa0, 0x60, + 0x0, 0xe, 0x43, 0x33, 0x33, 0x35, 0xe0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0xe, 0xdd, 0xdd, 0xdd, 0xdd, 0xe0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0xe, 0x21, 0x11, 0x11, 0x13, 0xe0, 0x0, + 0x0, 0xe, 0xdd, 0xdd, 0xdd, 0xdd, 0xe0, 0x0, + + /* U+6700 "最" */ + 0x0, 0x2f, 0xcc, 0xcc, 0xcc, 0xcc, 0xf3, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0x2f, 0xbb, 0xbb, 0xbb, 0xbb, 0xf3, 0x0, + 0x0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0x2d, 0xcc, 0xcc, 0xcc, 0xcc, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xee, 0xff, 0xee, 0xee, 0xee, 0xe2, + 0x0, 0xa5, 0x0, 0x96, 0x11, 0x11, 0x11, 0x0, + 0x0, 0xae, 0xdd, 0xe6, 0xcf, 0xcc, 0xce, 0x70, + 0x0, 0xa5, 0x0, 0x96, 0xd, 0x10, 0x1e, 0x0, + 0x0, 0xae, 0xdd, 0xe6, 0x5, 0xb0, 0xb6, 0x0, + 0x0, 0xa5, 0x2, 0xba, 0x20, 0x8e, 0x90, 0x0, + 0x2b, 0xed, 0xca, 0xda, 0x38, 0xd9, 0xe9, 0x20, + 0x1, 0x0, 0x0, 0x97, 0xb6, 0x0, 0x18, 0xd1, + + /* U+6703 "會" */ + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xc6, 0x1b, 0xa1, 0x0, 0x0, + 0x0, 0x4, 0xbf, 0xb7, 0x77, 0xee, 0x94, 0x0, + 0x8, 0xeb, 0x42, 0x44, 0x44, 0x41, 0x7e, 0xe7, + 0x5, 0x4c, 0xbb, 0xbc, 0xcb, 0xbb, 0xca, 0x32, + 0x0, 0x2c, 0x9, 0x4, 0xa0, 0x75, 0x2c, 0x0, + 0x0, 0x2c, 0x8, 0x54, 0xa0, 0xd1, 0x2c, 0x0, + 0x0, 0x2e, 0x9a, 0xab, 0xd9, 0xb9, 0xac, 0x0, + 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, + 0x0, 0x2, 0xfc, 0xcc, 0xcc, 0xcd, 0xf0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x3, 0xf0, 0x0, + 0x0, 0x2, 0xfc, 0xcc, 0xcc, 0xcd, 0xf0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x3, 0xf0, 0x0, + 0x0, 0x2, 0xfc, 0xcc, 0xcc, 0xcd, 0xf0, 0x0, + + /* U+6708 "月" */ + 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, + 0xd4, 0x0, 0x0, 0x0, 0x3e, 0x0, 0xd, 0x30, + 0x0, 0x0, 0x3, 0xe0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x3e, 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, + 0xe0, 0x0, 0xd4, 0x11, 0x11, 0x11, 0x4e, 0x0, + 0xe, 0x20, 0x0, 0x0, 0x3, 0xe0, 0x0, 0xf1, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x6, 0xb1, 0x11, 0x11, 0x11, + 0x4e, 0x0, 0xd5, 0x0, 0x0, 0x0, 0x3, 0xe0, + 0x4f, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x2e, 0x60, + 0x0, 0x0, 0x11, 0x15, 0xe6, 0x90, 0x0, 0x0, + 0x7, 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+6709 "有" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x14, 0xe1, 0x11, 0x11, 0x11, 0x10, + 0xe, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xee, 0xe0, + 0x0, 0x0, 0x3e, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd9, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x0, 0x9, 0xfe, 0xdd, 0xdd, 0xdd, 0xf1, 0x0, + 0x0, 0x9d, 0xe2, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0xb, 0xc1, 0xdd, 0xcc, 0xcc, 0xcc, 0xf1, 0x0, + 0x9, 0x0, 0xd4, 0x11, 0x11, 0x11, 0xe1, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0xdf, 0xee, 0xee, 0xee, 0xf1, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x0, 0x11, 0xf1, 0x0, + 0x0, 0x0, 0xd2, 0x0, 0x7, 0xfe, 0xb0, 0x0, + + /* U+670B "朋" */ + 0x0, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0x30, + 0xf, 0x10, 0xe, 0x10, 0xf0, 0x0, 0xd3, 0x0, + 0xf0, 0x0, 0xe1, 0xf, 0x0, 0xd, 0x30, 0xf, + 0x0, 0xe, 0x10, 0xf0, 0x0, 0xd3, 0x0, 0xff, + 0xff, 0xf1, 0xf, 0xff, 0xff, 0x30, 0xf, 0x0, + 0xe, 0x11, 0xf0, 0x0, 0xd3, 0x0, 0xf0, 0x0, + 0xe1, 0x1f, 0x0, 0xd, 0x30, 0xf, 0x10, 0xe, + 0x13, 0xe0, 0x0, 0xd3, 0x1, 0xff, 0xff, 0xf1, + 0x4f, 0xff, 0xff, 0x30, 0x2d, 0x0, 0xe, 0x15, + 0xb0, 0x0, 0xd3, 0x5, 0xb0, 0x0, 0xe1, 0x88, + 0x0, 0xd, 0x30, 0x98, 0x0, 0xe, 0x1d, 0x50, + 0x0, 0xd3, 0xe, 0x20, 0x23, 0xf5, 0xd0, 0x0, + 0x1e, 0x34, 0xa0, 0x8, 0xc8, 0xa5, 0x0, 0xef, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+670D "服" */ + 0x0, 0xff, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xe0, + 0x0, 0xf0, 0x3, 0xc0, 0xe1, 0x0, 0x2, 0xe0, + 0x0, 0xf0, 0x3, 0xc0, 0xe1, 0x0, 0x1, 0xe0, + 0x0, 0xf0, 0x3, 0xc0, 0xe1, 0x1, 0x25, 0xe0, + 0x0, 0xfd, 0xde, 0xc0, 0xe1, 0x4, 0xba, 0x50, + 0x0, 0xf2, 0x25, 0xc0, 0xe3, 0x11, 0x11, 0x20, + 0x0, 0xf0, 0x3, 0xc0, 0xee, 0xfd, 0xdd, 0xf3, + 0x1, 0xf0, 0x4, 0xc0, 0xe3, 0xd0, 0x1, 0xd0, + 0x2, 0xff, 0xff, 0xc0, 0xe1, 0xb4, 0x7, 0x90, + 0x3, 0xc0, 0x3, 0xc0, 0xe1, 0x3d, 0x1e, 0x10, + 0x5, 0xa0, 0x3, 0xc0, 0xe1, 0x9, 0xe7, 0x0, + 0x8, 0x70, 0x3, 0xc0, 0xe1, 0x9, 0xf7, 0x0, + 0xd, 0x30, 0x4, 0xc0, 0xe3, 0xbb, 0x2d, 0x91, + 0x1b, 0x2, 0xff, 0x70, 0xe8, 0x70, 0x0, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+671B "望" */ + 0x0, 0x2, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x0, 0x2f, 0xcc, 0xcd, 0xc0, + 0x3d, 0xdd, 0xfd, 0xdd, 0x3e, 0x0, 0x4, 0xc0, + 0x3, 0xa9, 0x33, 0x33, 0x3f, 0xcc, 0xcd, 0xc0, + 0x0, 0x87, 0x0, 0x0, 0x4c, 0x0, 0x4, 0xc0, + 0x0, 0x87, 0x1, 0x43, 0x6f, 0xcc, 0xcd, 0xc0, + 0x0, 0xbd, 0xdd, 0x92, 0xc5, 0x0, 0x4, 0xc0, + 0x0, 0xb6, 0x20, 0x9, 0xd0, 0x2, 0x69, 0xb0, + 0x0, 0x0, 0x0, 0x6, 0x10, 0x2, 0x87, 0x20, + 0x0, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x40, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0xbb, 0xbd, 0xdb, 0xbb, 0xb5, 0x0, + 0x0, 0x3, 0x33, 0x3a, 0xa3, 0x33, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe4, + + /* U+671D "朝" */ + 0x0, 0x1, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xd1, + 0xcc, 0xdf, 0xcc, 0xc1, 0xf1, 0x0, 0x2d, 0x2, + 0x23, 0xe2, 0x22, 0xf, 0x10, 0x2, 0xd0, 0x0, + 0x2e, 0x0, 0x0, 0xf1, 0x0, 0x2d, 0xa, 0xdc, + 0xcc, 0xe9, 0xf, 0xa9, 0x9a, 0xd0, 0xa4, 0x0, + 0x6, 0x90, 0xf5, 0x44, 0x6d, 0xa, 0xed, 0xdd, + 0xe9, 0xf, 0x10, 0x2, 0xd0, 0xa4, 0x0, 0x6, + 0x90, 0xf1, 0x0, 0x3d, 0xa, 0xed, 0xdd, 0xe9, + 0x2f, 0xee, 0xee, 0xd0, 0x0, 0x1e, 0x0, 0x4, + 0xc0, 0x0, 0x2d, 0x4c, 0xcc, 0xfc, 0xcc, 0xa8, + 0x0, 0x2, 0xd1, 0x33, 0x4f, 0x33, 0x3f, 0x30, + 0x0, 0x2d, 0x0, 0x1, 0xe0, 0x9, 0xb0, 0x0, + 0x4, 0xd0, 0x0, 0x1e, 0x1, 0xc1, 0x0, 0x3f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+671F "期" */ + 0x0, 0x86, 0x0, 0x77, 0x7, 0xff, 0xff, 0xf0, + 0x0, 0x97, 0x0, 0x88, 0x7, 0x80, 0x0, 0xf0, + 0xd, 0xff, 0xee, 0xff, 0xa7, 0x80, 0x0, 0xf0, + 0x0, 0x86, 0x0, 0x77, 0x7, 0x80, 0x0, 0xf0, + 0x0, 0x8d, 0xcc, 0xe7, 0x7, 0xfe, 0xee, 0xf0, + 0x0, 0x87, 0x11, 0x87, 0x7, 0x90, 0x0, 0xf0, + 0x0, 0x86, 0x0, 0x77, 0x8, 0x80, 0x0, 0xf0, + 0x0, 0x8e, 0xdd, 0xe7, 0x9, 0x80, 0x0, 0xf0, + 0x0, 0x86, 0x0, 0x77, 0xa, 0xdb, 0xbb, 0xf0, + 0x1d, 0xee, 0xdd, 0xee, 0x9b, 0x50, 0x0, 0xf0, + 0x1, 0x27, 0x23, 0x41, 0x1d, 0x20, 0x0, 0xf0, + 0x0, 0x7b, 0x3, 0xe1, 0x1f, 0x0, 0x0, 0xf0, + 0x3, 0xe2, 0x0, 0x7a, 0x79, 0x0, 0x1, 0xf0, + 0xc, 0x40, 0x0, 0x2, 0xb2, 0x1, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6728 "木" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x3, 0x33, 0x33, 0x3a, 0xa3, 0x33, 0x33, 0x30, + 0xc, 0xdd, 0xdd, 0xdf, 0xfd, 0xdd, 0xdd, 0xc0, + 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xea, 0xad, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0x49, 0x83, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xb7, 0x9, 0x80, 0x7c, 0x0, 0x0, + 0x0, 0xb, 0xb0, 0x9, 0x80, 0xa, 0xc1, 0x0, + 0x2, 0xda, 0x0, 0x9, 0x80, 0x0, 0xad, 0x30, + 0x3f, 0x80, 0x0, 0x9, 0x80, 0x0, 0x7, 0xf3, + 0x2, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+672A "未" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x11, 0x11, 0x19, 0x91, 0x11, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0x11, 0x11, 0xaf, 0xf9, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x6, 0xca, 0x9c, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0x19, 0x81, 0xd6, 0x0, 0x0, + 0x0, 0x9, 0xd1, 0x9, 0x80, 0x1d, 0x90, 0x0, + 0x4, 0xdb, 0x10, 0x9, 0x80, 0x1, 0xbd, 0x40, + 0x2e, 0x60, 0x0, 0x9, 0x80, 0x0, 0x6, 0xe2, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+672B "末" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe1, + 0x2, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x2, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x30, + 0x0, 0x22, 0x22, 0xaf, 0xfa, 0x22, 0x22, 0x0, + 0x0, 0x0, 0x6, 0xca, 0x9b, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x6c, 0x19, 0x80, 0xc7, 0x0, 0x0, + 0x0, 0x9, 0xd1, 0x9, 0x80, 0x1d, 0xa0, 0x0, + 0x4, 0xdb, 0x10, 0x9, 0x80, 0x1, 0xbe, 0x50, + 0x2d, 0x60, 0x0, 0x9, 0x80, 0x0, 0x6, 0xd2, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+672C "本" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0x11, 0x14, 0xea, 0xae, 0x31, 0x11, 0x10, + 0x0, 0x0, 0xa, 0x79, 0x88, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x9, 0x81, 0xe3, 0x0, 0x0, + 0x0, 0x1, 0xe4, 0x9, 0x80, 0x5d, 0x0, 0x0, + 0x0, 0xc, 0x90, 0x9, 0x80, 0xa, 0xb0, 0x0, + 0x0, 0xbb, 0x0, 0x9, 0x80, 0x0, 0xcb, 0x10, + 0x1d, 0xb6, 0xff, 0xff, 0xff, 0xff, 0x6b, 0xe2, + 0x5, 0x0, 0x11, 0x1a, 0x91, 0x11, 0x0, 0x40, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+672D "札" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x4b, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x4b, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x4b, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xfd, 0x4b, 0x0, 0x0, 0x0, + 0x1, 0x17, 0xf2, 0x11, 0x4b, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xfb, 0x0, 0x4b, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xf9, 0xa0, 0x4b, 0x0, 0x0, 0x0, + 0x0, 0xa5, 0xf0, 0xd7, 0x4b, 0x0, 0x0, 0x0, + 0x3, 0xd1, 0xf0, 0x22, 0x4b, 0x0, 0x0, 0x0, + 0xd, 0x50, 0xf0, 0x0, 0x4b, 0x0, 0x0, 0x0, + 0x6b, 0x0, 0xf0, 0x0, 0x4b, 0x0, 0x0, 0x92, + 0x1, 0x0, 0xf0, 0x0, 0x4b, 0x0, 0x0, 0xc3, + 0x0, 0x0, 0xf0, 0x0, 0x4d, 0x0, 0x1, 0xe1, + 0x0, 0x0, 0xf0, 0x0, 0xc, 0xff, 0xff, 0x80, + + /* U+673A "机" */ + 0x0, 0x6, 0x90, 0x0, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0x6, 0x90, 0x0, 0xf0, 0x0, 0xe2, 0x0, + 0x0, 0x6, 0x90, 0x0, 0xf0, 0x0, 0xe2, 0x0, + 0x2f, 0xff, 0xff, 0xf0, 0xf0, 0x0, 0xe2, 0x0, + 0x1, 0x1c, 0xa1, 0x10, 0xf0, 0x0, 0xe2, 0x0, + 0x0, 0x1f, 0xa0, 0x0, 0xf0, 0x0, 0xe2, 0x0, + 0x0, 0x7d, 0xf7, 0x0, 0xe0, 0x0, 0xe2, 0x0, + 0x0, 0xd7, 0x9c, 0x61, 0xd0, 0x0, 0xe2, 0x0, + 0x6, 0x96, 0x91, 0xc4, 0xb0, 0x0, 0xe2, 0x0, + 0x1e, 0x16, 0x90, 0x6, 0x90, 0x0, 0xe2, 0x0, + 0x57, 0x6, 0x90, 0xb, 0x40, 0x0, 0xe2, 0x37, + 0x0, 0x6, 0x90, 0x2e, 0x0, 0x0, 0xe2, 0x39, + 0x0, 0x6, 0x90, 0xb6, 0x0, 0x0, 0xe3, 0x58, + 0x0, 0x6, 0x92, 0xb0, 0x0, 0x0, 0x8f, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6750 "材" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0xf, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0x1a, 0xe1, 0x10, 0x11, 0x11, 0xed, 0x10, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0x7, 0xed, 0x0, + 0x0, 0x6d, 0xca, 0x90, 0x0, 0x3e, 0x5d, 0x0, + 0x0, 0xd6, 0xc0, 0xd3, 0x0, 0xd5, 0x3d, 0x0, + 0x6, 0xa4, 0xc0, 0x10, 0xc, 0x90, 0x3d, 0x0, + 0x2e, 0x24, 0xc0, 0x1, 0xbb, 0x0, 0x3d, 0x0, + 0x47, 0x4, 0xc0, 0xd, 0xb0, 0x0, 0x3d, 0x0, + 0x0, 0x4, 0xc0, 0x3, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x11, 0x5d, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0xef, 0xe7, 0x0, + + /* U+6751 "村" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x2f, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf9, + 0x1, 0x19, 0xd1, 0x10, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0xe, 0xd0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x5d, 0xfb, 0x0, 0x99, 0x0, 0x2e, 0x0, + 0x0, 0xc6, 0xc9, 0xa0, 0x1e, 0x40, 0x2e, 0x0, + 0x5, 0xa3, 0xc0, 0xb1, 0x6, 0xc0, 0x2e, 0x0, + 0x2e, 0x23, 0xc0, 0x0, 0x0, 0xc1, 0x2e, 0x0, + 0x47, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x11, 0x4e, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x0, 0xef, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+675F "束" */ + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x9, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xd0, + 0x1, 0x11, 0x11, 0x18, 0xa1, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x8e, 0xee, 0xef, 0xfe, 0xee, 0xeb, 0x0, + 0x0, 0x88, 0x0, 0x7, 0xa0, 0x0, 0x5c, 0x0, + 0x0, 0x87, 0x0, 0x7, 0xa0, 0x0, 0x4c, 0x0, + 0x0, 0x88, 0x0, 0x8, 0xa0, 0x0, 0x5c, 0x0, + 0x0, 0x8e, 0xee, 0xef, 0xff, 0xee, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0xae, 0xec, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x77, 0xa4, 0xd4, 0x0, 0x0, + 0x0, 0x29, 0xe4, 0x7, 0xa0, 0x2d, 0xb3, 0x0, + 0xa, 0xe7, 0x0, 0x7, 0xa0, 0x0, 0x6d, 0xc3, + 0x4, 0x0, 0x0, 0x7, 0xa0, 0x0, 0x0, 0x50, + + /* U+6761 "条" */ + 0x0, 0x0, 0x2, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x2c, 0xea, 0x0, 0x1, 0xd5, 0x0, 0x0, + 0x7, 0xe6, 0x9, 0xb1, 0x4d, 0x60, 0x0, 0x0, + 0x4, 0x10, 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7d, 0xd6, 0x9e, 0xa5, 0x10, 0x0, + 0x4b, 0xed, 0x93, 0x6, 0x20, 0x6a, 0xee, 0xa0, + 0x14, 0x10, 0x0, 0xc, 0x40, 0x0, 0x1, 0x30, + 0x0, 0xac, 0xcc, 0xcf, 0xdc, 0xcc, 0xc4, 0x0, + 0x0, 0x22, 0x32, 0x2d, 0x72, 0x32, 0x21, 0x0, + 0x0, 0x1, 0xd3, 0xc, 0x40, 0xc6, 0x0, 0x0, + 0x0, 0x2d, 0x60, 0xc, 0x40, 0x1d, 0x70, 0x0, + 0x4, 0xe5, 0x0, 0xc, 0x40, 0x1, 0xe5, 0x0, + 0x0, 0x20, 0x3, 0xee, 0x20, 0x0, 0x22, 0x0, + + /* U+6765 "来" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x33, 0x33, 0x3a, 0xa3, 0x33, 0x33, 0x10, + 0x4, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0x50, + 0x0, 0x8, 0x20, 0x9, 0x80, 0x0, 0xb1, 0x0, + 0x0, 0x7, 0xb0, 0x9, 0x80, 0x7, 0xb0, 0x0, + 0x0, 0x0, 0xf3, 0x9, 0x80, 0x1e, 0x30, 0x0, + 0x0, 0x0, 0x73, 0x9, 0x90, 0x48, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0xcd, 0xdc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0x69, 0x86, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xd6, 0x9, 0x80, 0x6d, 0x20, 0x0, + 0x0, 0x7e, 0x50, 0x9, 0x80, 0x5, 0xe7, 0x0, + 0x2e, 0xb1, 0x0, 0x9, 0x80, 0x0, 0x2b, 0xe2, + 0x2, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x30, + + /* U+676F "杯" */ + 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x9f, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x8, 0x70, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xa0, 0x0, 0xc6, 0x0, 0x0, + 0x1, 0x1d, 0x91, 0x0, 0x7, 0xf5, 0x20, 0x0, + 0x0, 0x3f, 0xf5, 0x0, 0x3e, 0xf7, 0xe3, 0x0, + 0x0, 0x8e, 0x9d, 0x33, 0xe4, 0xe2, 0x4e, 0x30, + 0x0, 0xd9, 0x73, 0x8f, 0x50, 0xe2, 0x4, 0xe2, + 0x6, 0x88, 0x71, 0xc3, 0x0, 0xe2, 0x0, 0x61, + 0x1e, 0x18, 0x70, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x37, 0x8, 0x70, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x8, 0x70, 0x0, 0x0, 0xe2, 0x0, 0x0, + + /* U+6771 "東" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x0, + 0x0, 0x8d, 0xaa, 0xad, 0xda, 0xaa, 0xcb, 0x0, + 0x0, 0x88, 0x0, 0x9, 0x80, 0x0, 0x5b, 0x0, + 0x0, 0x8e, 0xdd, 0xde, 0xed, 0xdd, 0xeb, 0x0, + 0x0, 0x88, 0x0, 0x9, 0x80, 0x0, 0x5b, 0x0, + 0x0, 0x8d, 0xaa, 0xad, 0xda, 0xaa, 0xcb, 0x0, + 0x0, 0x13, 0x34, 0xee, 0xed, 0x43, 0x32, 0x0, + 0x0, 0x0, 0x3e, 0x69, 0x88, 0xc2, 0x0, 0x0, + 0x0, 0x18, 0xe4, 0x9, 0x80, 0x5e, 0x81, 0x0, + 0x8, 0xfa, 0x20, 0x9, 0x80, 0x2, 0xaf, 0x81, + 0x8, 0x30, 0x0, 0x9, 0x80, 0x0, 0x3, 0x90, + + /* U+6790 "析" */ + 0x0, 0x9, 0x70, 0x0, 0x0, 0x3, 0x8a, 0x10, + 0x0, 0x9, 0x70, 0x1, 0x8b, 0xec, 0x73, 0x0, + 0x0, 0x9, 0x70, 0x3, 0xd2, 0x0, 0x0, 0x0, + 0xc, 0xce, 0xec, 0xb3, 0xc0, 0x0, 0x0, 0x0, + 0x1, 0x2d, 0x81, 0x13, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xd0, 0x3, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x8e, 0xda, 0x4, 0xc1, 0x13, 0xe1, 0x10, + 0x0, 0xd9, 0x7b, 0x65, 0xa0, 0x1, 0xe0, 0x0, + 0x6, 0x89, 0x72, 0x36, 0x90, 0x1, 0xe0, 0x0, + 0x1e, 0x19, 0x70, 0x7, 0x80, 0x1, 0xe0, 0x0, + 0x37, 0x9, 0x70, 0xa, 0x50, 0x1, 0xe0, 0x0, + 0x0, 0x9, 0x70, 0xe, 0x10, 0x1, 0xe0, 0x0, + 0x0, 0x9, 0x70, 0x6c, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x9, 0x70, 0x93, 0x0, 0x1, 0xe0, 0x0, + + /* U+6797 "林" */ + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0x19, 0xf2, 0x10, 0x11, 0x9f, 0x61, 0x10, + 0x0, 0xe, 0xfc, 0x0, 0x0, 0xff, 0xb0, 0x0, + 0x0, 0x5c, 0xd7, 0xb0, 0x6, 0xce, 0xd2, 0x0, + 0x0, 0xc5, 0xd0, 0xb4, 0xd, 0x5e, 0x78, 0x0, + 0x5, 0xb2, 0xd0, 0x0, 0x6a, 0x2e, 0x1e, 0x10, + 0x1e, 0x32, 0xd0, 0x2, 0xe2, 0x2e, 0x9, 0xa0, + 0x48, 0x2, 0xd0, 0xe, 0x70, 0x2e, 0x1, 0xe4, + 0x0, 0x2, 0xd0, 0x5, 0x0, 0x2e, 0x0, 0x20, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x2e, 0x0, 0x0, + + /* U+679C "果" */ + 0x0, 0x6f, 0xee, 0xef, 0xfe, 0xee, 0xf8, 0x0, + 0x0, 0x6a, 0x0, 0x8, 0x80, 0x0, 0x98, 0x0, + 0x0, 0x6a, 0x0, 0x8, 0x80, 0x0, 0x98, 0x0, + 0x0, 0x6f, 0xee, 0xef, 0xfe, 0xee, 0xf8, 0x0, + 0x0, 0x6a, 0x0, 0x8, 0x80, 0x0, 0x98, 0x0, + 0x0, 0x6b, 0x0, 0x9, 0x90, 0x0, 0x98, 0x0, + 0x0, 0x6d, 0xdd, 0xdf, 0xfd, 0xdd, 0xd7, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe0, + 0x0, 0x0, 0x2, 0xdd, 0xcd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x58, 0x83, 0xd5, 0x0, 0x0, + 0x0, 0x3a, 0xd3, 0x8, 0x80, 0x1b, 0xc5, 0x0, + 0x1c, 0xe6, 0x0, 0x8, 0x80, 0x0, 0x4c, 0xd2, + 0x4, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x30, + + /* U+67D0 "某" */ + 0x0, 0x1, 0xf0, 0x0, 0x0, 0xf, 0x0, 0x0, + 0xe, 0xee, 0xfe, 0xee, 0xee, 0xef, 0xee, 0xe1, + 0x0, 0x2, 0xf0, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x0, 0x1, 0xf2, 0x22, 0x22, 0x2f, 0x0, 0x0, + 0x0, 0x1, 0xfb, 0xbb, 0xbb, 0xcf, 0x0, 0x0, + 0x0, 0x1, 0xf0, 0x0, 0x0, 0xf, 0x0, 0x0, + 0x0, 0x1, 0xfe, 0xee, 0xee, 0xef, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1b, 0xbb, 0xbb, 0xbe, 0xeb, 0xbb, 0xbb, 0xb1, + 0x3, 0x33, 0x35, 0xed, 0xde, 0x43, 0x33, 0x30, + 0x0, 0x0, 0x4e, 0x69, 0x87, 0xd3, 0x0, 0x0, + 0x0, 0x19, 0xe4, 0x9, 0x80, 0x4e, 0x92, 0x0, + 0x1a, 0xf8, 0x10, 0x9, 0x80, 0x1, 0x9f, 0xa1, + 0x7, 0x10, 0x0, 0x9, 0x80, 0x0, 0x1, 0x70, + + /* U+67E5 "查" */ + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x19, 0x81, 0x11, 0x11, 0x10, + 0x1d, 0xdd, 0xdd, 0xff, 0xff, 0xdd, 0xdd, 0xd1, + 0x0, 0x0, 0x9, 0xb9, 0x8b, 0x60, 0x0, 0x0, + 0x0, 0x1, 0xb9, 0x9, 0x70, 0x99, 0x0, 0x0, + 0x1, 0x8c, 0x40, 0x9, 0x70, 0x4, 0xb7, 0x0, + 0x1b, 0x54, 0xaa, 0xaf, 0xea, 0xaa, 0x45, 0x91, + 0x0, 0x6, 0xb2, 0x22, 0x22, 0x2b, 0x60, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xb, 0x60, 0x0, + 0x0, 0x6, 0xeb, 0xbb, 0xbb, 0xbe, 0x60, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xa, 0x60, 0x0, + 0x0, 0x5, 0xcc, 0xcc, 0xcc, 0xcc, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xc0, + + /* U+67F1 "柱" */ + 0x0, 0xb, 0x50, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0xd5, 0x0, 0x0, + 0x0, 0xb, 0x60, 0x12, 0x22, 0x77, 0x22, 0x20, + 0x1e, 0xef, 0xfe, 0x9d, 0xdd, 0xfe, 0xdd, 0xc0, + 0x0, 0xe, 0x50, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x4f, 0xe1, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x9e, 0x9c, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0xcb, 0x59, 0x4b, 0xcc, 0xfd, 0xcc, 0x50, + 0x7, 0x7b, 0x50, 0x2, 0x22, 0xd7, 0x22, 0x10, + 0x1e, 0x1b, 0x50, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x16, 0xb, 0x50, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0xb, 0x50, 0xcf, 0xff, 0xff, 0xff, 0xf3, + + /* U+67FB "査" */ + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x19, 0x81, 0x11, 0x11, 0x10, + 0x1d, 0xdd, 0xdd, 0xff, 0xff, 0xdd, 0xdd, 0xd1, + 0x0, 0x0, 0x8, 0xc9, 0x9c, 0x70, 0x0, 0x0, + 0x0, 0x0, 0xab, 0x19, 0x71, 0xc9, 0x0, 0x0, + 0x0, 0x5d, 0x90, 0x9, 0x70, 0x8, 0xd5, 0x0, + 0x1d, 0xc4, 0x22, 0x27, 0x62, 0x22, 0x4b, 0xd1, + 0x3, 0x6, 0xeb, 0xbb, 0xbb, 0xbe, 0x70, 0x10, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x6, 0xec, 0xcc, 0xcc, 0xce, 0x70, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x6, 0xec, 0xcc, 0xcc, 0xce, 0x70, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+67FF "柿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x1, 0xe4, 0x0, 0x0, + 0x0, 0xf, 0x10, 0xad, 0xdd, 0xfe, 0xdd, 0xd7, + 0x3e, 0xef, 0xee, 0x1, 0x11, 0xe2, 0x11, 0x10, + 0x0, 0x4f, 0x10, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x8f, 0xb0, 0x1f, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0xcf, 0xa5, 0x1e, 0x0, 0xe1, 0x1, 0xe0, + 0x2, 0xaf, 0x2d, 0x1e, 0x0, 0xe1, 0x1, 0xe0, + 0x8, 0x5f, 0x2, 0x1e, 0x0, 0xe1, 0x1, 0xe0, + 0x1e, 0xf, 0x0, 0x1e, 0x0, 0xe1, 0x1, 0xe0, + 0x28, 0xf, 0x0, 0x1e, 0x0, 0xe1, 0x23, 0xe0, + 0x0, 0xf, 0x0, 0x1c, 0x0, 0xe1, 0xcd, 0x70, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + + /* U+6811 "树" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x4a, 0x1, 0x55, 0x52, 0x0, 0xf, 0x0, + 0x0, 0x5b, 0x1, 0x77, 0xb7, 0x0, 0xf, 0x0, + 0x1e, 0xff, 0xe2, 0x0, 0x98, 0xee, 0xef, 0xf4, + 0x0, 0x8b, 0x3, 0x80, 0xc3, 0x0, 0xf, 0x0, + 0x0, 0xcf, 0x30, 0xd3, 0xf0, 0x20, 0xf, 0x0, + 0x0, 0xfc, 0xc0, 0x4d, 0xd0, 0x78, 0xf, 0x0, + 0x4, 0xda, 0x95, 0xb, 0x90, 0xd, 0x1f, 0x0, + 0xa, 0x8a, 0x21, 0xc, 0xe0, 0x7, 0x8f, 0x0, + 0x2d, 0x5a, 0x0, 0x2e, 0xa7, 0x1, 0x1f, 0x0, + 0x35, 0x4a, 0x0, 0x98, 0x2c, 0x0, 0xf, 0x0, + 0x0, 0x4a, 0x3, 0xe1, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x4a, 0xb, 0x50, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x4a, 0x1, 0x0, 0x0, 0x2f, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6821 "校" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x8d, 0xdd, 0xdd, 0xdd, 0xd2, + 0xf, 0xff, 0xff, 0x0, 0x41, 0x1, 0x50, 0x0, + 0x0, 0x3f, 0x30, 0x2, 0xe2, 0x1, 0xd5, 0x0, + 0x0, 0x7f, 0xa0, 0xc, 0x60, 0x0, 0x1e, 0x30, + 0x0, 0xce, 0xc4, 0xba, 0x80, 0x0, 0xa5, 0xd0, + 0x2, 0xbd, 0x4d, 0x20, 0xd3, 0x4, 0xd0, 0x10, + 0x9, 0x5d, 0x23, 0x0, 0x6b, 0xb, 0x70, 0x0, + 0x2d, 0xd, 0x20, 0x0, 0xc, 0xbd, 0x0, 0x0, + 0x36, 0xd, 0x20, 0x0, 0x5, 0xf8, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x5e, 0x7e, 0x80, 0x0, + 0x0, 0xd, 0x20, 0x2a, 0xe3, 0x1, 0xcd, 0x60, + 0x0, 0xd, 0x20, 0xc7, 0x0, 0x0, 0x5, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+682A "株" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x30, 0xc3, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x3, 0xc0, 0xc3, 0x0, 0x0, + 0x1, 0x1b, 0x61, 0x7, 0xa2, 0xd5, 0x22, 0x10, + 0x1e, 0xef, 0xfe, 0x6a, 0xed, 0xfe, 0xdd, 0x80, + 0x0, 0xf, 0x70, 0x1e, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x5f, 0xe1, 0x78, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0xbe, 0x9a, 0x14, 0x33, 0xd6, 0x33, 0x30, + 0x1, 0xcb, 0x5b, 0x8c, 0xce, 0xff, 0xcc, 0xc2, + 0x9, 0x7b, 0x51, 0x0, 0xd, 0xed, 0x60, 0x0, + 0x2e, 0xb, 0x50, 0x0, 0x88, 0xc5, 0xe1, 0x0, + 0x15, 0xb, 0x50, 0x3, 0xd0, 0xc3, 0x7b, 0x0, + 0x0, 0xb, 0x50, 0x3d, 0x30, 0xc3, 0xb, 0x90, + 0x0, 0xb, 0x51, 0xe3, 0x0, 0xc3, 0x1, 0xc5, + 0x0, 0xb, 0x50, 0x10, 0x0, 0xc3, 0x0, 0x0, + + /* U+6839 "根" */ + 0x0, 0xa, 0x40, 0x1f, 0xee, 0xee, 0xff, 0x0, + 0x0, 0xa, 0x40, 0x1e, 0x0, 0x0, 0xf, 0x0, + 0x18, 0x8d, 0xb8, 0x4e, 0x0, 0x0, 0xf, 0x0, + 0x17, 0x7e, 0xa7, 0x3f, 0xee, 0xee, 0xef, 0x0, + 0x0, 0x2f, 0x70, 0x1e, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x7f, 0xe2, 0x1e, 0x0, 0x0, 0xf, 0x0, + 0x0, 0xcc, 0x8c, 0x2f, 0xee, 0xee, 0xef, 0x0, + 0x3, 0xba, 0x48, 0x2e, 0x4, 0xc0, 0x1, 0x10, + 0xb, 0x5a, 0x40, 0x1e, 0x0, 0xe2, 0x1c, 0x90, + 0x3d, 0xa, 0x40, 0x1e, 0x0, 0x7c, 0xe5, 0x0, + 0x3, 0xa, 0x40, 0x1e, 0x0, 0xe, 0x60, 0x0, + 0x0, 0xa, 0x40, 0x1e, 0x0, 0x14, 0xf3, 0x0, + 0x0, 0xa, 0x40, 0x3f, 0x9d, 0xe0, 0x6f, 0x80, + 0x0, 0xa, 0x40, 0x5c, 0x72, 0x0, 0x3, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+683C "格" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x7e, 0x77, 0x77, 0x0, + 0x0, 0x9, 0x60, 0x3, 0xf6, 0x55, 0xac, 0x0, + 0x1f, 0xff, 0xff, 0xae, 0xb8, 0x1, 0xe4, 0x0, + 0x0, 0x1e, 0x71, 0xc6, 0xc, 0x5b, 0x90, 0x0, + 0x0, 0x3f, 0xe2, 0x0, 0x2, 0xfd, 0x0, 0x0, + 0x0, 0x9e, 0xad, 0x10, 0x3d, 0x9c, 0xa1, 0x0, + 0x0, 0xc9, 0x67, 0x6a, 0xd4, 0x0, 0x6e, 0x92, + 0x6, 0x89, 0x63, 0xec, 0xdc, 0xcc, 0xce, 0x92, + 0xd, 0x19, 0x60, 0x8, 0x81, 0x11, 0x1e, 0x10, + 0x48, 0x9, 0x60, 0x8, 0x70, 0x0, 0xe, 0x10, + 0x0, 0x9, 0x60, 0x8, 0x70, 0x0, 0xe, 0x10, + 0x0, 0x9, 0x60, 0x8, 0x93, 0x33, 0x3f, 0x10, + 0x0, 0x9, 0x60, 0x8, 0xdb, 0xbb, 0xbf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6843 "桃" */ + 0x0, 0xf, 0x0, 0x0, 0xe, 0xc, 0x20, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xe, 0xc, 0x20, 0x0, + 0x1, 0x1f, 0x20, 0x52, 0xe, 0xc, 0x20, 0xa2, + 0x1e, 0xef, 0xe9, 0x4b, 0x1e, 0xc, 0x25, 0xd0, + 0x0, 0x3f, 0x20, 0xc, 0x4e, 0xc, 0x3e, 0x30, + 0x0, 0x8f, 0xc0, 0x5, 0x6e, 0xc, 0x67, 0x0, + 0x0, 0xcf, 0x89, 0x0, 0x1e, 0xc, 0x30, 0x0, + 0x2, 0xbf, 0x19, 0x0, 0x6d, 0xc, 0xd5, 0x0, + 0x8, 0x6f, 0x0, 0x1b, 0xdc, 0xc, 0x4c, 0x70, + 0x1e, 0xf, 0x1, 0xe7, 0x58, 0xc, 0x20, 0xc6, + 0x16, 0xf, 0x0, 0x20, 0xb4, 0xc, 0x20, 0x0, + 0x0, 0xf, 0x0, 0x4, 0xb0, 0xc, 0x20, 0x37, + 0x0, 0xf, 0x0, 0x3d, 0x20, 0xc, 0x30, 0x69, + 0x0, 0xf, 0x4, 0xc2, 0x0, 0x8, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6848 "案" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x60, 0x0, 0x0, 0x0, + 0xa, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xc0, + 0xa, 0x40, 0x0, 0x84, 0x0, 0x0, 0x3, 0xc0, + 0xe, 0xcb, 0xbc, 0xfb, 0xbb, 0xbb, 0xbc, 0xe0, + 0x2, 0x22, 0xaa, 0x22, 0x22, 0xba, 0x22, 0x20, + 0x0, 0x7, 0xf8, 0x52, 0x2a, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xdf, 0xff, 0x84, 0x10, 0x0, + 0x9, 0xcd, 0xdb, 0x75, 0x22, 0x6a, 0xec, 0x30, + 0x2, 0x10, 0x0, 0x9, 0x70, 0x0, 0x3, 0x0, + 0x2e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe2, + 0x0, 0x0, 0x3, 0xdc, 0xbd, 0x40, 0x0, 0x0, + 0x0, 0x1, 0x9d, 0x29, 0x72, 0xd9, 0x20, 0x0, + 0x16, 0xcd, 0x70, 0x9, 0x70, 0x7, 0xdc, 0x61, + 0x1a, 0x40, 0x0, 0x9, 0x70, 0x0, 0x4, 0xa2, + + /* U+689D "條" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0xa, 0x60, 0x0, 0x2f, 0xdb, 0xbb, 0x60, + 0x0, 0x1f, 0x1e, 0x13, 0xed, 0x11, 0x2e, 0x20, + 0x0, 0x8c, 0xe, 0x2d, 0x48, 0x91, 0xc6, 0x0, + 0x3, 0xfb, 0xe, 0x10, 0x0, 0xbf, 0x70, 0x0, + 0xc, 0xbb, 0xe, 0x10, 0x5c, 0xb6, 0xe9, 0x30, + 0xb, 0x4b, 0xe, 0x5e, 0xa4, 0x39, 0x7, 0xd8, + 0x0, 0x4b, 0xe, 0x11, 0x0, 0x4b, 0x0, 0x0, + 0x0, 0x4b, 0xe, 0x1d, 0xdd, 0xef, 0xdd, 0xd4, + 0x0, 0x4b, 0xe, 0x13, 0x33, 0x6c, 0x33, 0x31, + 0x0, 0x4b, 0xe, 0x11, 0xd1, 0x4b, 0x1c, 0x20, + 0x0, 0x4b, 0xa, 0x1b, 0x70, 0x4b, 0x3, 0xd0, + 0x0, 0x4b, 0x0, 0xa8, 0x2, 0x6b, 0x0, 0x75, + 0x0, 0x4b, 0x0, 0x0, 0xd, 0xd6, 0x0, 0x0, + + /* U+68B0 "械" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x3c, 0x43, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x2c, 0x1c, 0x20, + 0x0, 0x1e, 0x0, 0x22, 0x22, 0x4d, 0x24, 0x30, + 0xb, 0xcf, 0xc5, 0xdd, 0xdd, 0xdf, 0xdd, 0xc0, + 0x3, 0x6f, 0x31, 0x3, 0x4, 0xe, 0x0, 0x0, + 0x0, 0x7f, 0x60, 0x2b, 0xe, 0xe, 0x2, 0x90, + 0x0, 0xbe, 0xd1, 0x2b, 0xe, 0xd, 0x17, 0x80, + 0x0, 0xde, 0x64, 0x9e, 0x8f, 0x6b, 0x3c, 0x30, + 0x6, 0x8e, 0x0, 0x8d, 0x6f, 0x59, 0x7e, 0x0, + 0xd, 0x3e, 0x0, 0x58, 0xe, 0x6, 0xe6, 0x0, + 0x49, 0x1e, 0x0, 0x76, 0xe, 0x4, 0xe0, 0x0, + 0x1, 0x1e, 0x0, 0xd1, 0xe, 0xc, 0xf0, 0x81, + 0x0, 0x1e, 0x7, 0x90, 0xc, 0xb7, 0xa7, 0xc0, + 0x0, 0x1e, 0x2, 0x0, 0x8, 0x50, 0x1d, 0xa0, + + /* U+68EE "森" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x3, 0xdd, 0xdd, 0xde, 0xed, 0xdd, 0xdd, 0x60, + 0x0, 0x22, 0x25, 0xed, 0xce, 0x52, 0x22, 0x10, + 0x0, 0x0, 0x5f, 0x59, 0x84, 0xe6, 0x0, 0x0, + 0x0, 0x4b, 0xf4, 0x9, 0x80, 0x3e, 0xd7, 0x10, + 0xa, 0xfb, 0x40, 0x9, 0x80, 0x3, 0x7e, 0xe0, + 0x3, 0x42, 0xc0, 0x9, 0x80, 0x1e, 0x1, 0x30, + 0x0, 0x2, 0xc0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x2e, 0xef, 0xfe, 0xe3, 0xee, 0xff, 0xfe, 0xe5, + 0x0, 0x1e, 0xe3, 0x0, 0x3, 0xef, 0xc0, 0x0, + 0x0, 0xb8, 0xec, 0x80, 0xd, 0x5e, 0x6a, 0x0, + 0xb, 0xa3, 0xc0, 0x82, 0xc7, 0x1e, 0xb, 0x90, + 0x5a, 0x2, 0xc0, 0x1e, 0x60, 0x1e, 0x0, 0xb8, + 0x0, 0x2, 0xc0, 0x1, 0x0, 0x1e, 0x0, 0x0, + + /* U+690D "植" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0xf, 0x0, 0xbc, 0xce, 0xec, 0xcc, 0xb0, + 0x6, 0x6f, 0x64, 0x11, 0x1c, 0x51, 0x11, 0x10, + 0x1e, 0xef, 0xea, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x4f, 0x10, 0x2f, 0xcc, 0xcc, 0xcf, 0x0, + 0x0, 0x9f, 0xa0, 0x2c, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0xdf, 0xa5, 0x2f, 0xcc, 0xcc, 0xdf, 0x0, + 0x3, 0x9f, 0x28, 0x2c, 0x0, 0x0, 0x1f, 0x0, + 0xb, 0x4f, 0x0, 0x2f, 0xcc, 0xcc, 0xdf, 0x0, + 0x4c, 0xf, 0x0, 0x2c, 0x0, 0x0, 0x1f, 0x0, + 0x13, 0xf, 0x0, 0x2f, 0xaa, 0xaa, 0xbf, 0x0, + 0x0, 0xf, 0x0, 0x2d, 0x22, 0x22, 0x3f, 0x0, + 0x0, 0xf, 0x0, 0x2c, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0xf, 0x9, 0xef, 0xee, 0xee, 0xef, 0xe6, + + /* U+691C "検" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x4, 0xaa, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x5b, 0x4, 0xc1, 0x0, + 0x1, 0x1d, 0x31, 0x2b, 0xa0, 0x0, 0x3d, 0x70, + 0x2d, 0xdf, 0xdd, 0xea, 0xdd, 0xdd, 0xdc, 0xa9, + 0x0, 0x2f, 0x20, 0x0, 0x11, 0xc4, 0x11, 0x0, + 0x0, 0x7f, 0x40, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0xcf, 0xe1, 0x6f, 0xee, 0xfe, 0xee, 0xd0, + 0x1, 0xdd, 0x8b, 0x7a, 0x0, 0xc3, 0x2, 0xd0, + 0x8, 0x7d, 0x29, 0x7a, 0x0, 0xc3, 0x2, 0xd0, + 0x2e, 0x1d, 0x20, 0x6e, 0xde, 0xfe, 0xde, 0xc0, + 0x46, 0xd, 0x20, 0x0, 0x4, 0xee, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x2e, 0x48, 0xb0, 0x0, + 0x0, 0xd, 0x20, 0x18, 0xe4, 0x0, 0xad, 0x50, + 0x0, 0xd, 0x25, 0xd8, 0x10, 0x0, 0x3, 0xc7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+695A "楚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0xe, 0xef, 0xfe, 0xe3, 0xee, 0xff, 0xee, 0xb0, + 0x0, 0xd, 0xf8, 0x0, 0x1, 0xef, 0x80, 0x0, + 0x0, 0xa9, 0xe9, 0xa0, 0xc, 0x7e, 0x99, 0x0, + 0xb, 0xa2, 0xe0, 0x72, 0xd8, 0x2e, 0xa, 0x90, + 0x29, 0x2, 0xe0, 0x5, 0x70, 0x2e, 0x0, 0x80, + 0x2, 0x23, 0x82, 0x22, 0x22, 0x38, 0x22, 0x10, + 0xb, 0xcc, 0xcc, 0xcf, 0xec, 0xcc, 0xce, 0xa0, + 0x0, 0x3, 0x40, 0xc, 0x50, 0x0, 0xe, 0x30, + 0x0, 0x9, 0x70, 0xc, 0x72, 0x22, 0x35, 0x0, + 0x0, 0xe, 0x90, 0xc, 0xed, 0xdd, 0xd1, 0x0, + 0x0, 0x6d, 0xe4, 0xc, 0x50, 0x0, 0x0, 0x0, + 0x4, 0xf3, 0x4f, 0xad, 0x60, 0x0, 0x0, 0x0, + 0x3e, 0x40, 0x1, 0x8c, 0xef, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+696D "業" */ + 0x0, 0x39, 0x0, 0xf0, 0xf, 0x0, 0x76, 0x0, + 0x0, 0xb, 0x60, 0xf0, 0xf, 0x2, 0xd1, 0x0, + 0xa, 0xbd, 0xdb, 0xfb, 0xbf, 0xbd, 0xdb, 0xb0, + 0x2, 0x22, 0x6c, 0x22, 0x22, 0xc9, 0x22, 0x20, + 0x0, 0x0, 0xe, 0x30, 0x2, 0xe0, 0x0, 0x0, + 0x3, 0xee, 0xef, 0xee, 0xee, 0xfe, 0xee, 0x50, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0xdd, 0xde, 0xed, 0xdd, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0xb, 0xbb, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0xb0, + 0x2, 0x22, 0x27, 0xed, 0xde, 0x62, 0x22, 0x20, + 0x0, 0x2, 0xbd, 0x48, 0x83, 0xda, 0x20, 0x0, + 0x17, 0xdd, 0x70, 0x8, 0x80, 0x7, 0xec, 0x71, + 0x8, 0x40, 0x0, 0x8, 0x80, 0x0, 0x4, 0x90, + + /* U+6975 "極" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x7, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x6, 0xe3, 0x0, + 0x16, 0x9c, 0x60, 0x0, 0x1, 0xac, 0x20, 0x0, + 0x2d, 0xef, 0xd1, 0x0, 0xd, 0x80, 0x0, 0x0, + 0x0, 0x8a, 0x8, 0xdd, 0x1d, 0x3d, 0xde, 0x70, + 0x0, 0xdf, 0x29, 0x1a, 0x1d, 0x10, 0x9, 0x40, + 0x1, 0xfc, 0xb9, 0x1a, 0x1d, 0x1d, 0x1e, 0x10, + 0x6, 0xc9, 0x9a, 0x1a, 0x1d, 0x14, 0xdb, 0x0, + 0xc, 0x79, 0x9, 0x1a, 0x1d, 0x10, 0xc8, 0x0, + 0x4b, 0x59, 0x9, 0xdc, 0x1d, 0x15, 0xbd, 0x10, + 0x44, 0x59, 0x8, 0x10, 0xe, 0x5d, 0x15, 0x90, + 0x0, 0x59, 0x0, 0x8, 0xaa, 0x11, 0x0, 0x10, + 0x0, 0x59, 0x3b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb1, + 0x0, 0x59, 0x13, 0x33, 0x33, 0x33, 0x33, 0x30, + + /* U+697D "楽" */ + 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x0, + 0x3, 0x10, 0x0, 0xb, 0x60, 0x0, 0x4, 0x50, + 0x6, 0xe3, 0xd, 0xef, 0xee, 0xe0, 0x3e, 0x40, + 0x0, 0x5e, 0x2e, 0x10, 0x0, 0xf3, 0xe5, 0x0, + 0x0, 0x7, 0x2e, 0x10, 0x0, 0xf5, 0x40, 0x0, + 0x0, 0x0, 0x1e, 0xdd, 0xdd, 0xf3, 0x10, 0x0, + 0x0, 0x5c, 0x6e, 0x10, 0x0, 0xf5, 0xd9, 0x10, + 0x2d, 0xa2, 0xe, 0xdd, 0xdd, 0xf0, 0x8, 0xe1, + 0x2, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x20, + 0x1, 0x11, 0x11, 0x19, 0x81, 0x11, 0x11, 0x10, + 0x1d, 0xdd, 0xdd, 0xff, 0xff, 0xdd, 0xdd, 0xd1, + 0x0, 0x0, 0x8, 0xdb, 0xbd, 0x50, 0x0, 0x0, + 0x0, 0x3, 0xda, 0x19, 0x81, 0xbb, 0x30, 0x0, + 0x6, 0xcc, 0x40, 0x9, 0x80, 0x5, 0xcd, 0x71, + 0x19, 0x30, 0x0, 0x9, 0x80, 0x0, 0x2, 0x80, + + /* U+6982 "概" */ + 0x0, 0x69, 0x9, 0xee, 0xf3, 0xff, 0xff, 0xb0, + 0x0, 0x69, 0x9, 0x30, 0xc0, 0x0, 0x85, 0x0, + 0x1, 0x7a, 0x19, 0x30, 0xc0, 0x53, 0x94, 0x0, + 0x1c, 0xee, 0xc9, 0xdc, 0xf0, 0xa3, 0x94, 0x0, + 0x0, 0x9a, 0x9, 0x30, 0xc0, 0xd0, 0xb2, 0x0, + 0x0, 0xdf, 0x29, 0x30, 0xc1, 0xd0, 0xd1, 0x0, + 0x1, 0xfd, 0xb9, 0xcb, 0xf6, 0xfe, 0xfe, 0xe0, + 0x5, 0xe9, 0xa9, 0x52, 0x20, 0x4, 0xc0, 0x0, + 0xb, 0x99, 0x9, 0x35, 0x50, 0x9, 0xf2, 0x0, + 0x2d, 0x69, 0x9, 0x31, 0xd0, 0xe, 0xc2, 0x0, + 0x45, 0x69, 0x9, 0x6c, 0xd4, 0x78, 0xb2, 0x0, + 0x0, 0x69, 0xd, 0xc2, 0x35, 0xd1, 0xb2, 0x90, + 0x0, 0x69, 0x7, 0x0, 0xc, 0x30, 0xb2, 0xa0, + 0x0, 0x69, 0x0, 0x0, 0x86, 0x0, 0x8e, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+69CB "構" */ + 0x0, 0xd, 0x20, 0x0, 0xe1, 0x0, 0xf0, 0x0, + 0x0, 0xd, 0x20, 0x8c, 0xfd, 0xcd, 0xfc, 0xc0, + 0x0, 0xd, 0x20, 0x0, 0xe1, 0x0, 0xf0, 0x0, + 0x1c, 0xcf, 0xdc, 0x5c, 0xfd, 0xcc, 0xfc, 0x90, + 0x3, 0x4f, 0x53, 0x0, 0xe1, 0x0, 0xf0, 0x0, + 0x0, 0x5f, 0x40, 0xdd, 0xdd, 0xfd, 0xdd, 0xd4, + 0x0, 0xaf, 0xd0, 0x1, 0x11, 0xf1, 0x11, 0x0, + 0x0, 0xcd, 0x98, 0x4e, 0xbb, 0xfb, 0xbe, 0x70, + 0x6, 0x7d, 0x2b, 0x4a, 0x1, 0xf0, 0x9, 0x70, + 0xd, 0x1d, 0x20, 0x4e, 0xbb, 0xfb, 0xbe, 0x70, + 0x58, 0xd, 0x20, 0x4a, 0x1, 0xf0, 0x8, 0x70, + 0x1, 0xd, 0x24, 0xdf, 0xdd, 0xdd, 0xde, 0xe6, + 0x0, 0xd, 0x20, 0x4a, 0x0, 0x0, 0x8, 0x70, + 0x0, 0xd, 0x20, 0x4a, 0x0, 0x5, 0xde, 0x40, + + /* U+69D8 "様" */ + 0x0, 0xd, 0x20, 0x3, 0x90, 0x0, 0x78, 0x0, + 0x0, 0xd, 0x20, 0x12, 0xd4, 0x12, 0xe3, 0x10, + 0x0, 0xd, 0x20, 0x8c, 0xcc, 0xfc, 0xcc, 0xc0, + 0x1b, 0xbf, 0xbb, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x4, 0x5f, 0x64, 0x2d, 0xdd, 0xfd, 0xdd, 0x80, + 0x0, 0x5f, 0x50, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xbf, 0xd1, 0xee, 0xee, 0xfe, 0xee, 0xe3, + 0x1, 0xbd, 0x6b, 0x2, 0x0, 0xe2, 0x0, 0x40, + 0x8, 0x6d, 0x26, 0x2d, 0x20, 0xe9, 0xa, 0x90, + 0x1d, 0xd, 0x20, 0x4, 0xb0, 0xee, 0xb8, 0x0, + 0x35, 0xd, 0x20, 0x0, 0x66, 0xe5, 0xd1, 0x0, + 0x0, 0xd, 0x20, 0x5d, 0xa2, 0xe1, 0x7c, 0x20, + 0x0, 0xd, 0x26, 0xb3, 0x0, 0xf1, 0x5, 0xe4, + 0x0, 0xd, 0x20, 0x0, 0xaf, 0xc0, 0x0, 0x10, + + /* U+6A02 "樂" */ + 0x0, 0x3, 0x0, 0x3, 0x30, 0x0, 0x30, 0x0, + 0x0, 0x3c, 0x0, 0x9, 0x50, 0x0, 0xe1, 0x0, + 0x0, 0x95, 0x32, 0xdf, 0xdd, 0x14, 0xa0, 0x20, + 0x1, 0xc0, 0xc2, 0xe0, 0xe, 0x1c, 0x25, 0xa0, + 0xb, 0xdd, 0x60, 0xe0, 0xe, 0x7d, 0x9d, 0x10, + 0x3, 0x4b, 0x1, 0xfc, 0xcf, 0x56, 0xb5, 0x0, + 0x0, 0xb1, 0x93, 0xe0, 0xe, 0x14, 0x83, 0x60, + 0xb, 0xdb, 0xc7, 0xfd, 0xdf, 0x4f, 0xbc, 0xc0, + 0x0, 0x0, 0x12, 0x5, 0x50, 0x12, 0x0, 0x50, + 0x2, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x20, + 0x1b, 0xbb, 0xbb, 0xdf, 0xfd, 0xbb, 0xbb, 0xb1, + 0x0, 0x0, 0x6, 0xdb, 0xac, 0x70, 0x0, 0x0, + 0x0, 0x5, 0xd9, 0x8, 0x80, 0x7d, 0x71, 0x0, + 0x1a, 0xe9, 0x20, 0x8, 0x80, 0x1, 0x7e, 0xb2, + 0x4, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x40, + + /* U+6A19 "標" */ + 0x0, 0xd, 0x20, 0xde, 0xef, 0xef, 0xfe, 0xe4, + 0x0, 0xd, 0x20, 0x0, 0xe, 0x8, 0x50, 0x0, + 0x0, 0xd, 0x20, 0x4b, 0xbf, 0xbd, 0xdb, 0xa0, + 0x2f, 0xff, 0xff, 0x6a, 0x3d, 0x39, 0x63, 0xe0, + 0x1, 0x3f, 0x31, 0x68, 0xc, 0x8, 0x40, 0xe0, + 0x0, 0x6f, 0x50, 0x6d, 0xbe, 0xbd, 0xcb, 0xe0, + 0x0, 0xbf, 0xd1, 0x1, 0x11, 0x11, 0x11, 0x10, + 0x1, 0xbd, 0x6b, 0xd, 0xdd, 0xdd, 0xdd, 0x70, + 0x8, 0x5d, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0xd, 0x20, 0xee, 0xee, 0xee, 0xee, 0xe5, + 0x35, 0xd, 0x20, 0x3, 0x40, 0xd2, 0x24, 0x0, + 0x0, 0xd, 0x20, 0x2e, 0x30, 0xd2, 0x2d, 0x40, + 0x0, 0xd, 0x23, 0xe4, 0x0, 0xd2, 0x2, 0xe2, + 0x0, 0xd, 0x20, 0x20, 0x8d, 0xd0, 0x0, 0x20, + + /* U+6A21 "模" */ + 0x0, 0xf, 0x0, 0x0, 0xe1, 0x1, 0xe0, 0x0, + 0x0, 0xf, 0x1, 0xaa, 0xfa, 0xaa, 0xfa, 0xa2, + 0x0, 0xf, 0x0, 0x44, 0xf5, 0x45, 0xf4, 0x41, + 0x5, 0x7f, 0x54, 0x6c, 0xfd, 0xcd, 0xfc, 0x40, + 0x0, 0x5f, 0x30, 0x86, 0x0, 0x0, 0xa, 0x60, + 0x0, 0x9f, 0xc0, 0x8d, 0xbb, 0xbb, 0xbe, 0x60, + 0x0, 0xdf, 0x86, 0x87, 0x0, 0x0, 0xa, 0x60, + 0x3, 0xaf, 0x19, 0x8d, 0xaa, 0xaa, 0xae, 0x60, + 0x9, 0x5f, 0x0, 0x11, 0x17, 0xc1, 0x11, 0x0, + 0x2e, 0x1f, 0x0, 0x0, 0x8, 0xa0, 0x0, 0x0, + 0x27, 0xf, 0x7, 0xdd, 0xef, 0xff, 0xdd, 0xd3, + 0x0, 0xf, 0x0, 0x0, 0x6e, 0x4e, 0x30, 0x0, + 0x0, 0xf, 0x0, 0x29, 0xe2, 0x5, 0xe7, 0x10, + 0x0, 0xf, 0x9, 0xc7, 0x0, 0x0, 0x17, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6A23 "樣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x3, 0xa0, 0x0, 0xa4, 0x0, + 0x0, 0xd, 0x20, 0x46, 0xd8, 0x67, 0xe6, 0x60, + 0x0, 0xd, 0x20, 0x35, 0x55, 0xf6, 0x55, 0x50, + 0x2f, 0xff, 0xff, 0xb, 0xbb, 0xfb, 0xbb, 0x50, + 0x1, 0x2f, 0x31, 0x1, 0x11, 0xf3, 0x11, 0x0, + 0x0, 0x6f, 0x70, 0xdd, 0xdd, 0xfe, 0xdd, 0xd2, + 0x0, 0xbe, 0xd2, 0x0, 0x1d, 0x93, 0x0, 0x0, + 0x0, 0xbd, 0x6b, 0x0, 0x0, 0x5d, 0x80, 0x0, + 0x7, 0x6d, 0x28, 0xc, 0xdd, 0xf1, 0x10, 0x30, + 0xd, 0x1d, 0x20, 0x11, 0x10, 0xe5, 0x1c, 0x70, + 0x47, 0xd, 0x21, 0xab, 0xf3, 0xed, 0xc4, 0x0, + 0x0, 0xd, 0x20, 0x7, 0xa0, 0xe4, 0xc3, 0x0, + 0x0, 0xd, 0x22, 0xa9, 0x0, 0xf1, 0x3c, 0xa2, + 0x0, 0xd, 0x22, 0x40, 0x9e, 0xc0, 0x0, 0x50, + + /* U+6A2A "横" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0xe1, 0x0, 0xf0, 0x0, + 0x0, 0xe, 0x10, 0x9e, 0xfe, 0xee, 0xfe, 0xe0, + 0x0, 0xe, 0x10, 0x0, 0xe1, 0x0, 0xf0, 0x0, + 0x2c, 0xcf, 0xdc, 0x21, 0xe3, 0x11, 0xf1, 0x10, + 0x4, 0x5f, 0x55, 0xdd, 0xdd, 0xfd, 0xdd, 0xd4, + 0x0, 0x6f, 0x30, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0xcf, 0xd0, 0x6e, 0xdd, 0xfd, 0xdd, 0xb0, + 0x2, 0xbe, 0x8a, 0x76, 0x0, 0xf0, 0x4, 0xb0, + 0x9, 0x5e, 0x28, 0x7e, 0xcc, 0xfc, 0xcd, 0xb0, + 0x3d, 0xe, 0x10, 0x66, 0x0, 0xf0, 0x4, 0xb0, + 0x44, 0xe, 0x10, 0x6e, 0xcd, 0xfd, 0xcd, 0xb0, + 0x0, 0xe, 0x10, 0x0, 0x61, 0x0, 0x60, 0x0, + 0x0, 0xe, 0x10, 0x3c, 0xb1, 0x1, 0x9d, 0x50, + 0x0, 0xe, 0x13, 0xd5, 0x0, 0x0, 0x3, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6A39 "樹" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0x3, 0xb0, 0x0, 0xa, 0x50, + 0x0, 0x3b, 0xb, 0xee, 0xfe, 0xc0, 0xa, 0x50, + 0x1, 0x4c, 0x10, 0x3, 0xb0, 0x0, 0xa, 0x50, + 0x2e, 0xef, 0xe7, 0x8a, 0xd8, 0x6e, 0xef, 0xe4, + 0x0, 0x7c, 0x2, 0x55, 0x55, 0x20, 0xa, 0x50, + 0x0, 0xbf, 0x13, 0xcc, 0xcc, 0x55, 0xa, 0x50, + 0x0, 0xee, 0x94, 0xb0, 0x7, 0x6d, 0x1a, 0x50, + 0x4, 0xbb, 0xb6, 0xb0, 0x6, 0x69, 0x5a, 0x50, + 0xa, 0x6b, 0x35, 0xfc, 0xce, 0x65, 0x9a, 0x50, + 0x2c, 0x3b, 0x0, 0x70, 0x7, 0x12, 0x8a, 0x50, + 0x34, 0x3b, 0x0, 0xa5, 0xd, 0x0, 0xa, 0x50, + 0x0, 0x3b, 0x0, 0x69, 0x49, 0x10, 0xa, 0x50, + 0x0, 0x3b, 0x5, 0x8a, 0xde, 0xc1, 0xb, 0x50, + 0x0, 0x3b, 0x9, 0x64, 0x10, 0x6, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6A4B "橋" */ + 0x0, 0x0, 0x0, 0x0, 0x12, 0x35, 0x79, 0x0, + 0x0, 0xd, 0x10, 0x6b, 0xbd, 0xd9, 0x73, 0x0, + 0x0, 0xd, 0x10, 0x0, 0xc, 0x50, 0x0, 0x0, + 0x1, 0x1e, 0x21, 0xdd, 0xdf, 0xed, 0xdd, 0xd3, + 0x1f, 0xff, 0xfe, 0x0, 0xd6, 0x1, 0xe2, 0x0, + 0x1, 0x3f, 0x31, 0xb, 0xfb, 0xbb, 0xee, 0x20, + 0x0, 0x6f, 0x31, 0xd9, 0xe0, 0x0, 0xa9, 0xe4, + 0x0, 0xbf, 0xc0, 0x40, 0xe8, 0x88, 0xd3, 0x20, + 0x0, 0xce, 0x88, 0x0, 0x33, 0x33, 0x30, 0x0, + 0x6, 0x7d, 0x2a, 0xbe, 0xdd, 0xdd, 0xde, 0xe0, + 0xd, 0x1d, 0x10, 0xb4, 0x1, 0x11, 0x10, 0xe0, + 0x49, 0xd, 0x10, 0xb4, 0x7c, 0xaa, 0xd0, 0xe0, + 0x0, 0xd, 0x10, 0xb4, 0x76, 0x0, 0xd0, 0xe0, + 0x0, 0xd, 0x10, 0xb4, 0x7d, 0xbb, 0x90, 0xe0, + 0x0, 0xd, 0x10, 0xb4, 0x43, 0x0, 0x9e, 0xb0, + + /* U+6A5F "機" */ + 0x0, 0x49, 0x0, 0x15, 0x9, 0x30, 0x52, 0x0, + 0x0, 0x49, 0x0, 0x83, 0xa, 0x40, 0xb0, 0x0, + 0x1, 0x59, 0x11, 0x91, 0x99, 0x58, 0x59, 0x50, + 0x1e, 0xff, 0xdb, 0xce, 0x48, 0x7d, 0xcc, 0x0, + 0x0, 0x99, 0x2, 0x6a, 0x47, 0x70, 0xb5, 0x50, + 0x0, 0xed, 0x2, 0xb3, 0xd5, 0x99, 0xa8, 0xc0, + 0x2, 0xee, 0x79, 0xb9, 0xb7, 0xb7, 0xc4, 0x80, + 0x7, 0xa9, 0xb0, 0xb3, 0x1, 0xd0, 0x6b, 0x0, + 0xc, 0x59, 0xb, 0xfe, 0xee, 0xfe, 0xee, 0xe0, + 0x49, 0x49, 0x0, 0xe5, 0x0, 0xb4, 0x1b, 0x0, + 0x12, 0x49, 0x1, 0xeb, 0x90, 0x6a, 0xb8, 0x0, + 0x0, 0x49, 0x7, 0x80, 0x85, 0x2f, 0x90, 0x21, + 0x0, 0x49, 0x3d, 0x10, 0x18, 0xd9, 0xc1, 0x85, + 0x0, 0x49, 0x93, 0x0, 0xa7, 0x0, 0x6d, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B21 "次" */ + 0x0, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, + 0x4, 0x10, 0x0, 0xf, 0x30, 0x0, 0x0, 0x0, + 0x9, 0xe5, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x60, 0x9f, 0xdd, 0xdd, 0xde, 0x90, + 0x0, 0x1, 0x10, 0xe6, 0x33, 0x33, 0x3b, 0x80, + 0x0, 0x0, 0x6, 0xd0, 0xd, 0x40, 0xe, 0x20, + 0x0, 0x0, 0x1e, 0x50, 0xd, 0x40, 0x5c, 0x0, + 0x0, 0x0, 0x5, 0x0, 0xe, 0x50, 0x54, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x2f, 0xa0, 0x0, 0x0, + 0x0, 0x1f, 0x30, 0x0, 0x7d, 0xe0, 0x0, 0x0, + 0x0, 0xb9, 0x0, 0x0, 0xd6, 0x98, 0x0, 0x0, + 0x7, 0xe1, 0x0, 0x8, 0xc0, 0x2e, 0x20, 0x0, + 0x1f, 0x40, 0x0, 0x8e, 0x20, 0x7, 0xe2, 0x0, + 0x2, 0x0, 0x2b, 0xd2, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x4, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B32 "欲" */ + 0x0, 0x1, 0x1, 0x0, 0x5, 0x40, 0x0, 0x0, + 0x0, 0x6c, 0xb, 0x70, 0xb, 0x60, 0x0, 0x0, + 0x1, 0xe3, 0x1, 0xd6, 0xf, 0x20, 0x0, 0x0, + 0xc, 0x80, 0x40, 0x2d, 0x3f, 0xed, 0xdd, 0xd3, + 0x18, 0x4, 0xf1, 0x0, 0x8a, 0x29, 0x22, 0xe1, + 0x0, 0xc, 0xbc, 0x0, 0xe3, 0xf, 0x1, 0xe0, + 0x0, 0x4e, 0x9, 0xa7, 0xb0, 0x1f, 0x4, 0xa0, + 0x1, 0xe5, 0x0, 0xc7, 0x20, 0x2f, 0x3, 0x40, + 0xc, 0xa0, 0x0, 0x3e, 0x10, 0x5f, 0x20, 0x0, + 0x4a, 0xff, 0xee, 0xf3, 0x0, 0x9f, 0x60, 0x0, + 0x0, 0xf0, 0x0, 0xe1, 0x0, 0xda, 0xc0, 0x0, + 0x0, 0xf0, 0x0, 0xe1, 0x4, 0xe0, 0xe2, 0x0, + 0x0, 0xf0, 0x0, 0xe1, 0xc, 0x70, 0x8b, 0x0, + 0x0, 0xfe, 0xee, 0xf1, 0xad, 0x0, 0xc, 0x80, + 0x0, 0xf1, 0x0, 0x4, 0xd2, 0x0, 0x1, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B4C "歌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xb2, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x78, 0x5, 0xc0, 0x0, 0x0, + 0x3, 0xcc, 0xc5, 0x78, 0x8, 0xfe, 0xee, 0xe2, + 0x4, 0x80, 0x66, 0x78, 0xd, 0x30, 0x0, 0xf0, + 0x4, 0x80, 0x66, 0x78, 0x3e, 0x9, 0x22, 0xd0, + 0x3, 0xcc, 0xc5, 0x78, 0xb7, 0xc, 0x36, 0x90, + 0x0, 0x0, 0x0, 0x78, 0x40, 0xd, 0x34, 0x30, + 0x4e, 0xee, 0xee, 0xff, 0xe1, 0xf, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x59, 0x0, 0x2f, 0xa0, 0x0, + 0x7, 0xec, 0xe7, 0x59, 0x0, 0x6d, 0xe0, 0x0, + 0x7, 0x70, 0x67, 0x59, 0x0, 0xe4, 0xa6, 0x0, + 0x7, 0xec, 0xe7, 0x59, 0x7, 0xd0, 0x3e, 0x10, + 0x7, 0x70, 0x0, 0x59, 0x5f, 0x30, 0x8, 0xc1, + 0x0, 0x0, 0x1c, 0xd7, 0xd5, 0x0, 0x0, 0x96, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B50 "歐" */ + 0x0, 0x0, 0x0, 0x0, 0x2c, 0x0, 0x0, 0xd, + 0xfe, 0xee, 0xee, 0x66, 0xc0, 0x0, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0xd, 0x19, + 0xbb, 0xb3, 0xc, 0xfe, 0xee, 0xd0, 0xd1, 0xd0, + 0x4, 0x41, 0xf2, 0x0, 0x5b, 0xd, 0x1d, 0x0, + 0x44, 0x7c, 0x6, 0x8, 0x60, 0xd1, 0xdb, 0xbd, + 0x4d, 0x50, 0xf0, 0xb1, 0xd, 0x10, 0x0, 0x0, + 0x10, 0x1f, 0x0, 0x0, 0xd5, 0xbc, 0x2b, 0xb0, + 0x2, 0xf3, 0x0, 0xd, 0x73, 0xa2, 0x8a, 0x0, + 0x5f, 0x80, 0x0, 0xd7, 0x3a, 0x28, 0xa0, 0x9, + 0xbd, 0x0, 0xd, 0x7a, 0xd2, 0xdd, 0x0, 0xe1, + 0xd3, 0x0, 0xd1, 0x11, 0x1, 0x10, 0x6c, 0x5, + 0xc0, 0xd, 0xcc, 0xcc, 0xcc, 0xaf, 0x30, 0xa, + 0x90, 0x22, 0x22, 0x22, 0x3c, 0x50, 0x0, 0xa, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B61 "歡" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3a, 0x0, 0xd1, 0x0, 0xc1, 0x0, 0x0, + 0x2d, 0xdf, 0xdd, 0xfd, 0xd1, 0xe0, 0x0, 0x0, + 0x0, 0x38, 0x0, 0xb1, 0x3, 0xd6, 0x66, 0x60, + 0xa, 0xbc, 0x6a, 0xbc, 0x67, 0xa6, 0x66, 0xf0, + 0xa, 0x15, 0x6a, 0x15, 0x7d, 0x18, 0x12, 0xb0, + 0x7, 0xbb, 0x47, 0xaa, 0x9b, 0xc, 0x17, 0x60, + 0x0, 0x86, 0x1c, 0x0, 0x1, 0xd, 0x14, 0x10, + 0x1, 0xfc, 0xcf, 0xdc, 0x70, 0xe, 0x30, 0x0, + 0xc, 0xe0, 0xd, 0x10, 0x0, 0x1f, 0x70, 0x0, + 0x39, 0xfc, 0xcf, 0xcc, 0x30, 0x4d, 0xc0, 0x0, + 0x0, 0xe5, 0x5e, 0x55, 0x20, 0xa5, 0xc2, 0x0, + 0x0, 0xe5, 0x5e, 0x55, 0x22, 0xe0, 0x5b, 0x0, + 0x0, 0xfa, 0xaf, 0xaa, 0x6c, 0x70, 0xb, 0x70, + 0x0, 0xe2, 0x22, 0x22, 0x5b, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B62 "止" */ + 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xff, 0xff, 0xff, 0x70, + 0x0, 0xf, 0x20, 0x0, 0xf3, 0x11, 0x11, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0x2d, 0xdf, 0xdd, 0xdd, 0xfd, 0xdd, 0xdd, 0xd2, + 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x30, + + /* U+6B63 "正" */ + 0x0, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x2, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xe, 0x20, 0x2, 0xf1, 0x11, 0x11, 0x0, + 0x0, 0xe, 0x20, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x1b, 0xbf, 0xcb, 0xbc, 0xfb, 0xbb, 0xbb, 0xb2, + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + + /* U+6B64 "此" */ + 0x0, 0x0, 0xf, 0x10, 0xe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x10, 0xe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0xf, 0x10, 0xe, 0x30, 0x0, 0x0, + 0x0, 0xd1, 0xf, 0x10, 0xe, 0x30, 0x5, 0x20, + 0x0, 0xe1, 0xf, 0x53, 0x1e, 0x31, 0xae, 0x40, + 0x0, 0xe1, 0xf, 0xdc, 0x6e, 0x9e, 0x91, 0x0, + 0x0, 0xe1, 0xf, 0x10, 0xe, 0xb2, 0x0, 0x0, + 0x0, 0xe1, 0xf, 0x10, 0xe, 0x30, 0x0, 0x0, + 0x0, 0xe1, 0xf, 0x10, 0xe, 0x30, 0x0, 0x0, + 0x0, 0xe1, 0xf, 0x10, 0xe, 0x30, 0x0, 0x0, + 0x0, 0xe1, 0xf, 0x10, 0xe, 0x30, 0x0, 0xa2, + 0x0, 0xe1, 0xf, 0x11, 0x1e, 0x30, 0x0, 0xd3, + 0x0, 0xf7, 0x9f, 0xff, 0x7d, 0x72, 0x23, 0xf0, + 0x2f, 0xeb, 0x85, 0x20, 0x6, 0xde, 0xee, 0x70, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B65 "步" */ + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x6f, 0xdd, 0xdd, 0x50, 0x0, + 0x9, 0x70, 0x6, 0xb2, 0x22, 0x21, 0x0, 0x0, + 0x97, 0x0, 0x6b, 0x0, 0x0, 0x0, 0x4, 0x4b, + 0xa4, 0x49, 0xc4, 0x44, 0x44, 0x40, 0xcc, 0xcc, + 0xcc, 0xee, 0xcc, 0xcc, 0xcb, 0x0, 0x0, 0x33, + 0x7, 0x90, 0x0, 0x20, 0x0, 0x0, 0x1e, 0x40, + 0x79, 0x0, 0x1e, 0x50, 0x0, 0xc, 0x80, 0x7, + 0x90, 0xa, 0xa0, 0x0, 0x1c, 0xa0, 0x0, 0x79, + 0x9, 0xe1, 0x0, 0x2, 0x90, 0x0, 0x7, 0xbc, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8f, 0x90, + 0x0, 0x0, 0x0, 0x3, 0x6b, 0xf9, 0x20, 0x0, + 0x0, 0x0, 0xcf, 0xea, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6B69 "歩" */ + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x50, 0x8, 0xa3, 0x33, 0x32, 0x0, + 0x0, 0xa, 0x50, 0x8, 0xdb, 0xbb, 0xb6, 0x0, + 0x0, 0xa, 0x50, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x1b, 0x61, 0x19, 0x91, 0x11, 0x11, 0x10, + 0x1e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe1, + 0x0, 0x0, 0x61, 0x8, 0x80, 0x4, 0x10, 0x0, + 0x0, 0x8, 0xc0, 0x8, 0x80, 0x8, 0xd1, 0x0, + 0x0, 0x7e, 0x20, 0x8, 0x80, 0x2, 0x7e, 0x10, + 0x8, 0xe2, 0x0, 0x9, 0x80, 0x2f, 0x39, 0xc0, + 0x2, 0x10, 0xa, 0xed, 0x30, 0xc9, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xdf, 0xd7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x36, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B6F "歯" */ + 0x0, 0x9, 0x50, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x50, 0x8, 0xfe, 0xee, 0xea, 0x0, + 0x0, 0x9, 0x50, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x2e, 0xef, 0xfe, 0xef, 0xfe, 0xee, 0xee, 0xe2, + 0x1, 0x50, 0x0, 0x4, 0x30, 0x0, 0x5, 0x20, + 0x1, 0xe0, 0x76, 0x8, 0x60, 0x76, 0xd, 0x30, + 0x1, 0xe0, 0x1d, 0x8, 0x60, 0xd1, 0xd, 0x30, + 0x1, 0xe0, 0x27, 0x39, 0x84, 0x72, 0x1d, 0x30, + 0x1, 0xe4, 0xaa, 0xbf, 0xdb, 0xaa, 0x6d, 0x30, + 0x1, 0xe0, 0x0, 0xbc, 0x8c, 0x30, 0xd, 0x30, + 0x1, 0xe0, 0x3c, 0x58, 0x62, 0xc5, 0xd, 0x30, + 0x1, 0xe3, 0xc3, 0x8, 0x60, 0x16, 0xd, 0x30, + 0x1, 0xe3, 0x33, 0x36, 0x63, 0x33, 0x3d, 0x30, + 0x1, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0x30, + + /* U+6B72 "歲" */ + 0x0, 0x6, 0x90, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x90, 0x6, 0xfd, 0xdd, 0xd7, 0x0, + 0x0, 0x6, 0x90, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0xe, 0xef, 0xfe, 0xef, 0xfe, 0xee, 0xee, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x56, 0xb3, 0x0, + 0x0, 0x88, 0x88, 0x88, 0x8c, 0xb8, 0xab, 0x70, + 0x1, 0xf5, 0x55, 0x55, 0x59, 0xb5, 0x55, 0x40, + 0x1, 0xe3, 0xaa, 0xaa, 0x94, 0xb0, 0x58, 0x0, + 0x2, 0xd0, 0x34, 0xc2, 0x11, 0xe0, 0xd4, 0x0, + 0x3, 0xc0, 0xd2, 0xb1, 0xc0, 0xd8, 0xc0, 0x0, + 0x4, 0xb7, 0x82, 0xb9, 0x60, 0x8f, 0x20, 0x0, + 0x7, 0x85, 0x1, 0xca, 0x2, 0xde, 0x10, 0xa1, + 0xd, 0x40, 0x2b, 0x90, 0x4d, 0x47, 0xb1, 0xd0, + 0x2c, 0x6, 0xa3, 0x2, 0xd2, 0x0, 0x9f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B73 "歳" */ + 0x0, 0x5, 0xa0, 0x5, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x5, 0xfc, 0xcc, 0xc5, 0x0, + 0x0, 0x5, 0xa0, 0x5, 0xb0, 0x0, 0x0, 0x0, + 0xe, 0xee, 0xee, 0xee, 0xef, 0xff, 0xee, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0x55, 0xb3, 0x0, + 0x0, 0xcc, 0xcc, 0xcc, 0xce, 0xdc, 0xdf, 0xc0, + 0x1, 0xe1, 0x11, 0x11, 0x16, 0xa1, 0x13, 0x10, + 0x1, 0xe3, 0xaa, 0xaa, 0xa2, 0xc0, 0x2e, 0x0, + 0x2, 0xd1, 0x34, 0xd3, 0x30, 0xe1, 0x98, 0x0, + 0x3, 0xc0, 0xc2, 0xc4, 0x70, 0x98, 0xf1, 0x0, + 0x4, 0xa4, 0xa1, 0xc0, 0xd0, 0x4f, 0x70, 0x0, + 0x8, 0x7c, 0x21, 0xc0, 0x73, 0x9f, 0x50, 0x74, + 0xe, 0x23, 0x1, 0xc0, 0x1b, 0xa3, 0xe2, 0xa3, + 0x39, 0x0, 0x4e, 0x90, 0xa6, 0x0, 0x4e, 0xc0, + + /* U+6B77 "歷" */ + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0xf0, 0x0, 0x15, 0x0, 0x0, 0x36, 0x0, + 0x0, 0xf3, 0xbd, 0xd6, 0x16, 0xcf, 0x84, 0x0, + 0x0, 0xf0, 0x4, 0xa0, 0x0, 0xe, 0x0, 0x0, + 0x0, 0xf6, 0xcd, 0xec, 0x99, 0xcf, 0xcc, 0xc1, + 0x0, 0xf0, 0x1e, 0xe4, 0x0, 0xaf, 0xd3, 0x0, + 0x0, 0xf0, 0xb8, 0xbc, 0x57, 0x7e, 0x3e, 0x30, + 0x0, 0xfa, 0x84, 0x91, 0x6c, 0xd, 0x4, 0xe4, + 0x2, 0xd2, 0x0, 0x0, 0x28, 0x0, 0x0, 0x10, + 0x3, 0xc0, 0x5, 0x0, 0x3d, 0x0, 0x0, 0x0, + 0x6, 0x90, 0xf, 0x0, 0x3f, 0xee, 0xeb, 0x0, + 0x9, 0x60, 0xf, 0x0, 0x3d, 0x0, 0x0, 0x0, + 0xe, 0x20, 0xf, 0x0, 0x3d, 0x0, 0x0, 0x0, + 0x4c, 0x1e, 0xef, 0xee, 0xff, 0xee, 0xee, 0xe5, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B7B "死" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x2, 0xf2, 0x0, 0xb, 0x60, 0x0, 0x0, + 0x0, 0x7, 0xc0, 0x0, 0xa, 0x60, 0x0, 0x0, + 0x0, 0xd, 0x60, 0x0, 0xa, 0x60, 0x1, 0x0, + 0x0, 0x3f, 0xdc, 0xcc, 0x2a, 0x60, 0x1d, 0x60, + 0x0, 0xc8, 0x33, 0x3f, 0xa, 0x63, 0xe8, 0x0, + 0x7, 0xd0, 0x0, 0x4b, 0xa, 0xce, 0x50, 0x0, + 0x2e, 0x3d, 0x20, 0xa6, 0xa, 0xb1, 0x0, 0x0, + 0x1, 0x7, 0xe4, 0xe1, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x70, 0xa, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0x0, 0xa, 0x60, 0x0, 0x51, + 0x0, 0x7, 0xe2, 0x0, 0xa, 0x60, 0x0, 0xb4, + 0x2, 0xbe, 0x20, 0x0, 0xa, 0x91, 0x1, 0xe2, + 0x1f, 0x90, 0x0, 0x0, 0x4, 0xde, 0xee, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6B8A "殊" */ + 0x1f, 0xff, 0xff, 0xf1, 0xc0, 0xc3, 0x0, 0x0, + 0x0, 0x3c, 0x0, 0x3, 0xc0, 0xc3, 0x0, 0x0, + 0x0, 0x79, 0x0, 0x7, 0xc6, 0xe8, 0x66, 0x20, + 0x0, 0xc8, 0x22, 0xc, 0xdc, 0xfd, 0xcc, 0x50, + 0x0, 0xfd, 0xce, 0xbd, 0x0, 0xc3, 0x0, 0x0, + 0x6, 0xc0, 0xb, 0xa4, 0x0, 0xc3, 0x0, 0x0, + 0xd, 0x71, 0xf, 0x6b, 0xbb, 0xfc, 0xbb, 0xb0, + 0x5b, 0x7e, 0x8d, 0x14, 0x4b, 0xff, 0x54, 0x40, + 0x1, 0x4, 0xe8, 0x0, 0x3d, 0xda, 0x90, 0x0, + 0x0, 0x1, 0xe1, 0x0, 0xd3, 0xc3, 0xc3, 0x0, + 0x0, 0xa, 0xa0, 0xc, 0x80, 0xc3, 0x3e, 0x20, + 0x0, 0x5e, 0x12, 0xd7, 0x0, 0xc3, 0x6, 0xe2, + 0x6, 0xf4, 0x1, 0x50, 0x0, 0xc3, 0x0, 0x40, + 0xa, 0x30, 0x0, 0x0, 0x0, 0xc3, 0x0, 0x0, + + /* U+6B8B "残" */ + 0x2f, 0xff, 0xff, 0xf0, 0x6, 0xa2, 0xc7, 0x10, + 0x0, 0x3d, 0x0, 0x0, 0x5, 0xb0, 0x8, 0x20, + 0x0, 0x7a, 0x0, 0x0, 0x5, 0xb2, 0x58, 0x90, + 0x0, 0xa9, 0x22, 0x17, 0xad, 0xff, 0xda, 0x70, + 0x0, 0xed, 0xcf, 0x59, 0x77, 0xd0, 0x0, 0x0, + 0x4, 0xd0, 0xd, 0x10, 0x1, 0xe0, 0x3, 0x51, + 0xa, 0x70, 0x1e, 0x2, 0x47, 0xfd, 0xec, 0x92, + 0x3e, 0x77, 0x5b, 0x5c, 0xa7, 0xe4, 0x0, 0x41, + 0x4, 0x1a, 0xf5, 0x0, 0x0, 0xa6, 0x5, 0xd0, + 0x0, 0x2, 0xe0, 0x0, 0x0, 0x6a, 0x6d, 0x10, + 0x0, 0xb, 0x80, 0x0, 0x0, 0x3f, 0xc1, 0x0, + 0x0, 0x6d, 0x0, 0x0, 0x18, 0xee, 0x60, 0x23, + 0x7, 0xe3, 0x0, 0x5b, 0xf9, 0x14, 0xe4, 0x77, + 0x1c, 0x20, 0x0, 0x86, 0x0, 0x0, 0x6e, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6BB5 "段" */ + 0x0, 0x0, 0x5, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xec, 0x60, 0x1f, 0xee, 0xf0, 0x0, + 0x0, 0xf5, 0x10, 0x0, 0x1d, 0x0, 0xf0, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x3d, 0x0, 0xf0, 0x0, + 0x0, 0xf6, 0x66, 0x50, 0x6b, 0x0, 0xf0, 0x0, + 0x0, 0xf9, 0x99, 0x70, 0xb6, 0x0, 0xf0, 0x0, + 0x0, 0xf0, 0x0, 0x8, 0xc0, 0x0, 0x9d, 0xd2, + 0x0, 0xf0, 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xfe, 0xee, 0xb5, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x86, 0x0, 0x69, 0x0, + 0x0, 0xf0, 0x1, 0x30, 0x1d, 0x0, 0xd3, 0x0, + 0x28, 0xfc, 0xed, 0xb0, 0x7, 0xb9, 0x80, 0x0, + 0x28, 0xf2, 0x0, 0x0, 0x0, 0xdf, 0x10, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x5d, 0x98, 0xe6, 0x0, + 0x0, 0xf0, 0x0, 0x4e, 0xb4, 0x0, 0x3b, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+6BCD "母" */ + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x97, 0x0, + 0x0, 0xa, 0x70, 0x5e, 0x60, 0x0, 0xa7, 0x0, + 0x0, 0xc, 0x40, 0x2, 0xca, 0x0, 0xa6, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x6, 0x0, 0xb5, 0x0, + 0xc, 0xcf, 0xdc, 0xcc, 0xcc, 0xcc, 0xfd, 0xc0, + 0x3, 0x6e, 0x33, 0x33, 0x33, 0x33, 0xe6, 0x30, + 0x0, 0x5c, 0x1, 0xd4, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x89, 0x0, 0x3d, 0x90, 0x0, 0xf1, 0x0, + 0x0, 0xa7, 0x0, 0x0, 0xb9, 0x1, 0xf0, 0x0, + 0x0, 0xd6, 0x22, 0x22, 0x34, 0x24, 0xf2, 0x10, + 0x0, 0xcd, 0xdd, 0xdd, 0xdd, 0xde, 0xfd, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6BCE "毎" */ + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xee, 0xee, 0xee, 0xee, 0xb0, + 0x0, 0x1d, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xb0, 0xfe, 0xee, 0xfe, 0xee, 0xf7, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0xf0, 0x0, 0xa6, 0x0, + 0x0, 0x5, 0xb0, 0x1, 0xe0, 0x0, 0xb5, 0x0, + 0x1e, 0xef, 0xfe, 0xee, 0xfe, 0xee, 0xfe, 0xe7, + 0x1, 0x1b, 0x61, 0x16, 0xa1, 0x11, 0xe3, 0x10, + 0x0, 0xd, 0x30, 0x7, 0x80, 0x0, 0xf1, 0x0, + 0x0, 0xf, 0x0, 0x9, 0x60, 0x1, 0xf0, 0x0, + 0x0, 0x3f, 0xee, 0xef, 0xfe, 0xee, 0xfe, 0xe1, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x8, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5d, 0xdd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6BCF "每" */ + 0x0, 0x0, 0x54, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xe0, + 0x0, 0x2e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xb4, 0xfe, 0xee, 0xee, 0xee, 0xf6, 0x0, + 0x6, 0x15, 0xb0, 0x3b, 0x20, 0x0, 0xa5, 0x0, + 0x0, 0x7, 0x90, 0x4, 0xd7, 0x0, 0xb5, 0x0, + 0x4, 0x4b, 0x93, 0x33, 0x5a, 0x43, 0xd7, 0x42, + 0xb, 0xbf, 0xba, 0xca, 0xaa, 0xaa, 0xfc, 0xb6, + 0x0, 0xe, 0x10, 0x7c, 0x40, 0x0, 0xd2, 0x0, + 0x0, 0x1f, 0x0, 0x1, 0xb7, 0x0, 0xf1, 0x0, + 0x0, 0x4f, 0xee, 0xee, 0xef, 0xee, 0xfe, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xde, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6BD4 "比" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0xe, + 0x30, 0x0, 0x3, 0xd0, 0x0, 0x0, 0xe, 0x30, + 0x0, 0x3, 0xd0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x3, 0xd0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x3, + 0xd0, 0x1, 0xc6, 0xe, 0x63, 0x33, 0x3, 0xd0, + 0x3d, 0xb1, 0xe, 0xed, 0xdd, 0x33, 0xe7, 0xe7, + 0x0, 0xe, 0x30, 0x0, 0x3, 0xfb, 0x20, 0x0, + 0xe, 0x30, 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, + 0x30, 0x0, 0x3, 0xd0, 0x0, 0x0, 0xe, 0x30, + 0x0, 0x3, 0xd0, 0x0, 0x7, 0xe, 0x30, 0x0, + 0x3, 0xd0, 0x0, 0x1f, 0xe, 0x30, 0x27, 0x23, + 0xe0, 0x0, 0x3d, 0xf, 0xad, 0xea, 0x12, 0xf1, + 0x0, 0x7a, 0x5f, 0xa4, 0x0, 0x0, 0xbf, 0xff, + 0xe3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6BDB "毛" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x9e, 0xd1, 0x0, 0x0, + 0x25, 0x8b, 0xdf, 0xb7, 0x20, 0x0, 0x6, 0xfd, + 0xa8, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xc0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5d, 0x58, 0xac, 0xef, 0x0, 0x28, 0xad, 0xff, + 0xfa, 0x86, 0x31, 0x0, 0x1, 0x85, 0x31, 0x5c, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xc0, + 0x0, 0x13, 0x57, 0x0, 0x1, 0x35, 0x9e, 0xbd, + 0xfe, 0xca, 0x81, 0x9e, 0xfd, 0xbb, 0xd5, 0x30, + 0x0, 0x0, 0x2, 0x10, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x9, 0x80, 0x0, 0x0, 0x3e, 0x10, 0x0, 0x1, + 0xd5, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, + 0x0, + + /* U+6C0F "氏" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x25, 0x7a, 0xe9, 0x0, 0x1a, 0xcd, + 0xff, 0xee, 0x86, 0x30, 0x0, 0x2f, 0x42, 0x0, + 0x5c, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x3d, + 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x0, 0x2e, 0x11, 0x11, 0x3f, 0x11, 0x11, + 0x10, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x2e, 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x5, 0xc0, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x20, 0x2e, 0x3, 0x7b, 0x90, + 0x8b, 0x0, 0x95, 0x6f, 0xed, 0x94, 0x0, 0xd, + 0x92, 0xd3, 0x57, 0x20, 0x0, 0x0, 0x1, 0xbf, + 0xb0, + + /* U+6C11 "民" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x1f, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x20, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x1f, 0x0, 0x0, 0xb6, 0x0, + 0x0, 0x0, 0x1f, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x0, 0x1f, 0x33, 0x33, 0x8b, 0x33, 0x33, 0x31, + 0x1f, 0xcc, 0xcc, 0xcf, 0xcc, 0xcc, 0xc5, 0x1f, + 0x0, 0x0, 0xd, 0x40, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x6, 0xc0, 0x0, 0x10, 0x1f, 0x0, 0x4, + 0x30, 0xc7, 0x0, 0x59, 0x4f, 0x8c, 0xea, 0x30, + 0x2e, 0x92, 0xa7, 0xae, 0x94, 0x0, 0x0, 0x1, + 0x9e, 0xd1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6C14 "气" */ + 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xec, 0xcc, 0xcc, 0xcc, 0xcc, 0xa0, + 0x0, 0x3e, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, + 0x0, 0xc6, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x7, 0xc0, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x0, + 0x3e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7e, 0xee, 0xee, 0xee, 0xef, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xf1, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb8, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd0, + + /* U+6C17 "気" */ + 0x0, 0x0, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xfe, 0xee, 0xee, 0xee, 0xee, 0x80, + 0x0, 0x3e, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc6, 0x22, 0x22, 0x22, 0x22, 0x20, 0x0, + 0x8, 0xc0, 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, + 0x1c, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x92, 0x7, 0x90, 0x0, + 0x0, 0x1d, 0x70, 0x8, 0xb0, 0x6, 0xa0, 0x0, + 0x0, 0x1, 0xad, 0x8e, 0x10, 0x6, 0xb0, 0x0, + 0x0, 0x0, 0x9, 0xfb, 0x0, 0x4, 0xc0, 0x0, + 0x0, 0x1, 0xac, 0x2a, 0xd2, 0x1, 0xf0, 0xa0, + 0x0, 0x7e, 0x90, 0x0, 0x7e, 0x10, 0xc6, 0xc0, + 0x9, 0xb2, 0x0, 0x0, 0x2, 0x0, 0x3e, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C34 "水" */ + 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x12, 0x5, 0xd0, 0x0, 0x3e, 0x10, + 0x9, 0xff, 0xff, 0x95, 0xf4, 0x2, 0xe5, 0x0, + 0x0, 0x0, 0xc, 0x55, 0xfc, 0x2e, 0x60, 0x0, + 0x0, 0x0, 0x1f, 0x5, 0xda, 0xe5, 0x0, 0x0, + 0x0, 0x0, 0x8a, 0x5, 0xc1, 0xd3, 0x0, 0x0, + 0x0, 0x2, 0xf2, 0x5, 0xc0, 0x4e, 0x20, 0x0, + 0x0, 0xc, 0x90, 0x5, 0xc0, 0x8, 0xd2, 0x0, + 0x0, 0xac, 0x0, 0x5, 0xc0, 0x0, 0x8e, 0x50, + 0xc, 0xc1, 0x0, 0x5, 0xc0, 0x0, 0x5, 0xe7, + 0x2, 0x0, 0x1, 0x27, 0xc0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x7, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C37 "氷" */ + 0x0, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0x30, 0x4, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xe8, 0x4, 0xd0, 0x0, 0x5, 0x80, + 0x0, 0x0, 0x1b, 0x44, 0xf3, 0x0, 0x4f, 0x50, + 0x0, 0x0, 0x0, 0x4, 0xfa, 0x5, 0xe4, 0x0, + 0xb, 0xee, 0xef, 0x74, 0xde, 0x7e, 0x30, 0x0, + 0x1, 0x11, 0x2d, 0x44, 0xc7, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x4, 0xc1, 0xe3, 0x0, 0x0, + 0x0, 0x0, 0xb7, 0x4, 0xc0, 0x6e, 0x10, 0x0, + 0x0, 0x6, 0xe0, 0x4, 0xc0, 0xb, 0xb0, 0x0, + 0x0, 0x5f, 0x30, 0x4, 0xc0, 0x0, 0xcb, 0x0, + 0x8, 0xf4, 0x0, 0x4, 0xc0, 0x0, 0x1b, 0xe4, + 0x7, 0x20, 0x2, 0x27, 0xc0, 0x0, 0x0, 0x62, + 0x0, 0x0, 0xe, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C38 "永" */ + 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xfa, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xcf, 0x90, 0x0, 0x0, + 0x0, 0x1, 0x11, 0x11, 0x13, 0x80, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x6, 0xa0, + 0x0, 0x0, 0x0, 0x4, 0xf6, 0x0, 0x7e, 0x30, + 0xd, 0xff, 0xff, 0x44, 0xfd, 0x9, 0xd2, 0x0, + 0x0, 0x0, 0x2e, 0x4, 0xdc, 0xda, 0x0, 0x0, + 0x0, 0x0, 0x99, 0x4, 0xd3, 0xf1, 0x0, 0x0, + 0x0, 0x4, 0xe1, 0x4, 0xd0, 0x8d, 0x10, 0x0, + 0x0, 0x2e, 0x50, 0x4, 0xd0, 0xa, 0xc2, 0x0, + 0x4, 0xe7, 0x0, 0x4, 0xd0, 0x0, 0x9f, 0x81, + 0xc, 0x50, 0x0, 0x6, 0xd0, 0x0, 0x3, 0xc4, + 0x0, 0x0, 0xa, 0xfe, 0x70, 0x0, 0x0, 0x0, + + /* U+6C42 "求" */ + 0x0, 0x0, 0x0, 0x8, 0x80, 0x79, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x4, 0xc5, 0x0, + 0xd, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe0, + 0x2, 0x22, 0x22, 0x29, 0xb2, 0x22, 0x22, 0x20, + 0x0, 0x93, 0x0, 0x8, 0xf1, 0x0, 0x3d, 0x10, + 0x0, 0x4e, 0x30, 0x8, 0xf8, 0x1, 0xe6, 0x0, + 0x0, 0x5, 0xe1, 0x8, 0xae, 0x3d, 0x70, 0x0, + 0x0, 0x0, 0x72, 0xa, 0x88, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xcf, 0x80, 0xd6, 0x0, 0x0, + 0x0, 0x1, 0xae, 0x59, 0x80, 0x3f, 0x50, 0x0, + 0x1, 0x8f, 0x80, 0x8, 0x80, 0x4, 0xf7, 0x0, + 0xe, 0xb2, 0x0, 0x8, 0x80, 0x0, 0x3e, 0xd2, + 0x2, 0x0, 0x1, 0x1b, 0x80, 0x0, 0x0, 0x70, + 0x0, 0x0, 0x3f, 0xfd, 0x30, 0x0, 0x0, 0x0, + + /* U+6C5A "汚" */ + 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xae, 0x43, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x5, 0x80, 0x0, 0x8a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, + 0x3f, 0x80, 0xd, 0xee, 0xff, 0xee, 0xee, 0xe3, + 0x2, 0xcd, 0x0, 0x5, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x40, 0xe, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x0, + 0x8, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xb8, 0x0, + 0x7, 0x20, 0x0, 0x0, 0xe, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C60 "池" */ + 0x5, 0xa4, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x4c, 0x90, 0xd3, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd3, 0x1, 0xe0, 0x18, 0x20, + 0x0, 0x0, 0x0, 0xd3, 0x1, 0xfa, 0xee, 0x40, + 0x4b, 0x30, 0x0, 0xd5, 0x7d, 0xf7, 0x1b, 0x40, + 0x6, 0xe8, 0x5, 0xef, 0xa6, 0xe0, 0xc, 0x40, + 0x0, 0x13, 0xac, 0xe3, 0x1, 0xe0, 0xc, 0x40, + 0x0, 0x0, 0x0, 0xd3, 0x1, 0xe0, 0xc, 0x30, + 0x0, 0x5, 0x60, 0xd3, 0x1, 0xe0, 0xe, 0x20, + 0x0, 0xd, 0x40, 0xd3, 0x1, 0xe6, 0xfb, 0x0, + 0x0, 0x6c, 0x0, 0xd3, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0xe4, 0x0, 0xd3, 0x0, 0x10, 0x0, 0xb0, + 0x9, 0xb0, 0x0, 0xc6, 0x0, 0x0, 0x5, 0xd0, + 0x9, 0x20, 0x0, 0x5e, 0xff, 0xff, 0xfe, 0x50, + + /* U+6C7A "決" */ + 0x3, 0xb4, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, + 0x0, 0x3b, 0x90, 0x0, 0xf, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0x20, 0x1f, 0x0, + 0x2d, 0x60, 0x0, 0x0, 0xf, 0x10, 0xf, 0x0, + 0x3, 0xcc, 0x0, 0x0, 0xf, 0x10, 0xf, 0x0, + 0x0, 0x4, 0x0, 0x0, 0x1f, 0x10, 0x1f, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x5, 0x40, 0x0, 0x5d, 0xe0, 0x0, 0x0, + 0x0, 0xd, 0x50, 0x0, 0xb7, 0xb6, 0x0, 0x0, + 0x0, 0x5d, 0x0, 0x3, 0xe1, 0x3e, 0x10, 0x0, + 0x0, 0xd5, 0x0, 0x2e, 0x60, 0x9, 0xb0, 0x0, + 0x6, 0xc0, 0x4, 0xe7, 0x0, 0x0, 0xbc, 0x20, + 0x9, 0x40, 0x7e, 0x50, 0x0, 0x0, 0x9, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+6C88 "沈" */ + 0x6, 0x81, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, + 0x1, 0x8e, 0x40, 0x0, 0xf, 0x10, 0x0, 0x0, + 0x0, 0x2, 0x11, 0x11, 0x1f, 0x21, 0x11, 0x10, + 0x0, 0x0, 0xc, 0xee, 0xef, 0xee, 0xee, 0xe0, + 0x27, 0x0, 0xc, 0x30, 0x1f, 0x0, 0x2, 0xe0, + 0x2b, 0xe6, 0xc, 0x30, 0x3e, 0x40, 0x2, 0xe0, + 0x0, 0x57, 0x2, 0x0, 0x5f, 0xd0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x9b, 0xd0, 0x0, 0x0, + 0x0, 0x3, 0x30, 0x0, 0xe8, 0xd0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x3, 0xe4, 0xd0, 0x0, 0x0, + 0x0, 0x4d, 0x0, 0xd, 0x73, 0xd0, 0x0, 0x30, + 0x0, 0xd4, 0x0, 0x8d, 0x3, 0xd0, 0x0, 0xa4, + 0x8, 0xb0, 0x9, 0xe2, 0x3, 0xe0, 0x0, 0xd2, + 0xb, 0x20, 0x8c, 0x20, 0x0, 0xdf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6C92 "沒" */ + 0x0, 0x10, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, + 0x3, 0xe8, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x1a, 0xb0, 0x8, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x10, 0xd, 0x50, 0x0, 0xe, 0x20, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0xf, 0x10, + 0x1c, 0x60, 0x0, 0xc7, 0x0, 0x0, 0x2f, 0x0, + 0x3, 0xcc, 0xa, 0xb0, 0x0, 0x8a, 0xda, 0x0, + 0x0, 0x4, 0x5, 0x10, 0x0, 0x24, 0x30, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x3, 0x70, 0xd, 0x30, 0x0, 0x7b, 0x0, + 0x0, 0xb, 0x70, 0x5, 0xd0, 0x2, 0xe2, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x8c, 0x4e, 0x40, 0x0, + 0x0, 0xc7, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, + 0x5, 0xd0, 0x0, 0x39, 0xe9, 0x6e, 0xb4, 0x0, + 0x7, 0x50, 0x1f, 0xd8, 0x10, 0x0, 0x7c, 0xf2, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+6CB9 "油" */ + 0x3, 0xa3, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x5, 0xcb, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x1a, 0x30, + 0x1, 0xe0, 0x1, 0xe0, 0x1, 0xe0, 0x7e, 0x90, + 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x0, 0x1a, 0x1, + 0xe0, 0x1, 0xe0, 0x1, 0xe0, 0x0, 0x0, 0x1f, + 0x44, 0x5f, 0x44, 0x5e, 0x0, 0x0, 0x1, 0xfc, + 0xcc, 0xfc, 0xcc, 0xe0, 0x0, 0x76, 0x1e, 0x0, + 0x1e, 0x0, 0x1e, 0x0, 0x1e, 0x21, 0xe0, 0x1, + 0xe0, 0x1, 0xe0, 0xa, 0x90, 0x1e, 0x0, 0x1e, + 0x0, 0x1e, 0x5, 0xe0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x54, 0x0, 0x1e, 0x11, 0x11, 0x11, + 0x2d, + + /* U+6CBB "治" */ + 0x0, 0x10, 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, + 0x1, 0xe9, 0x10, 0x0, 0x8b, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xe1, 0x2, 0xf2, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x20, 0xa, 0x80, 0xd, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x4d, 0x0, 0x2, 0xe3, 0x0, + 0x1a, 0x30, 0x1, 0xe3, 0x0, 0x1, 0x7e, 0x0, + 0x6, 0xea, 0xd, 0xfd, 0xef, 0xfe, 0xde, 0x90, + 0x0, 0x17, 0x5, 0x43, 0x21, 0x0, 0x1, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x61, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x9, 0x91, 0xf0, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x2f, 0x11, 0xf0, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0xc7, 0x1, 0xf0, 0x0, 0x0, 0x1f, 0x0, + 0x6, 0xd0, 0x1, 0xf3, 0x33, 0x33, 0x4f, 0x0, + 0x7, 0x40, 0x1, 0xfc, 0xcc, 0xcc, 0xce, 0x0, + + /* U+6CC1 "況" */ + 0x0, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xaf, 0x80, 0xef, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x2, 0xa0, 0xe2, 0x0, 0x0, 0xe, 0x20, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe, 0x20, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe, 0x20, + 0x1b, 0x50, 0x0, 0xe2, 0x0, 0x0, 0xe, 0x20, + 0x6, 0xdc, 0x20, 0xe3, 0x0, 0x0, 0xe, 0x20, + 0x0, 0x6, 0x0, 0xef, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3, 0xd0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0x91, 0x4, 0xb0, 0x1f, 0x0, 0x0, + 0x0, 0x5, 0xd0, 0x7, 0x90, 0x1f, 0x0, 0x0, + 0x0, 0xe, 0x40, 0xc, 0x40, 0x1f, 0x0, 0x10, + 0x0, 0x8a, 0x0, 0x5e, 0x0, 0x1f, 0x0, 0xd1, + 0x3, 0xe1, 0x7, 0xf3, 0x0, 0x1f, 0x0, 0xe0, + 0x6, 0x60, 0x8c, 0x30, 0x0, 0xd, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6CCA "泊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2d, 0x60, 0x0, 0x0, 0xf3, 0x0, 0x0, 0x0, + 0x3c, 0xc0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x4, 0x49, 0xb4, 0x44, 0x41, 0x0, 0x0, + 0x1, 0xfb, 0xbb, 0xbb, 0xbf, 0x40, 0x83, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0xd4, 0x5, 0xda, 0x1, + 0xe0, 0x0, 0x0, 0xd, 0x40, 0x0, 0x40, 0x1e, + 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x1, 0xfe, + 0xee, 0xee, 0xef, 0x40, 0x0, 0x49, 0x1e, 0x11, + 0x11, 0x11, 0xd4, 0x0, 0xc, 0x61, 0xe0, 0x0, + 0x0, 0xd, 0x40, 0x3, 0xe0, 0x1e, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0xc6, 0x1, 0xe0, 0x0, 0x0, + 0xd, 0x40, 0x5d, 0x0, 0x1f, 0xdd, 0xdd, 0xdd, + 0xf4, 0x3, 0x40, 0x1, 0xe2, 0x22, 0x22, 0x2c, + 0x30, + + /* U+6CD5 "法" */ + 0x2, 0xb5, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x2, 0x9c, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbc, 0xce, 0xfc, 0xcc, 0x40, 0x0, + 0x0, 0x3, 0x33, 0x8c, 0x33, 0x31, 0x1e, 0x80, + 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x1a, 0xe0, + 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x2, 0x7, + 0xcc, 0xce, 0xec, 0xcc, 0xc0, 0x0, 0x0, 0x23, + 0x35, 0xf5, 0x33, 0x33, 0x0, 0x1, 0xc0, 0x0, + 0x8b, 0x0, 0x0, 0x0, 0x0, 0x99, 0x0, 0x1f, + 0x20, 0x68, 0x0, 0x0, 0x2f, 0x10, 0xa, 0x80, + 0x0, 0xd3, 0x0, 0xb, 0x80, 0x5, 0xd0, 0x13, + 0x5a, 0xd0, 0x6, 0xd0, 0x1, 0xff, 0xfe, 0xb9, + 0x7b, 0x70, 0x44, 0x0, 0x5, 0x20, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+6CE2 "波" */ + 0x1, 0xb5, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0x0, 0x3b, 0xb0, 0x0, 0x2, 0xe0, 0x0, 0x10, + 0x0, 0x0, 0x21, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x1, 0xe0, 0x1, 0xe0, 0x1, 0xf0, + 0xb, 0x60, 0x1, 0xe0, 0x1, 0xe0, 0x8, 0x90, + 0x3, 0xcc, 0x11, 0xe0, 0x2, 0xe0, 0x3, 0x10, + 0x0, 0x6, 0x2, 0xff, 0xfe, 0xee, 0xef, 0x30, + 0x0, 0x0, 0x3, 0xd4, 0xc0, 0x0, 0x3d, 0x0, + 0x0, 0x3, 0x34, 0xb0, 0xc4, 0x0, 0xa7, 0x0, + 0x0, 0xb, 0x76, 0x90, 0x4d, 0x14, 0xd0, 0x0, + 0x0, 0x2e, 0x9, 0x70, 0x8, 0xce, 0x30, 0x0, + 0x0, 0xa8, 0xe, 0x30, 0x5, 0xfd, 0x20, 0x0, + 0x3, 0xf1, 0x5d, 0x2, 0xae, 0x47, 0xf7, 0x10, + 0x7, 0x80, 0xd4, 0x9f, 0x91, 0x0, 0x3b, 0xf6, + 0x0, 0x0, 0x10, 0x21, 0x0, 0x0, 0x0, 0x10, + + /* U+6CE3 "泣" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x6, 0xb4, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x0, 0x5e, 0x90, 0x0, 0xc, 0x40, 0x0, 0x0, + 0x0, 0x1, 0x43, 0x33, 0x38, 0x63, 0x33, 0x20, + 0x0, 0x0, 0xc, 0xcc, 0xcc, 0xcc, 0xcc, 0x80, + 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, + 0x2b, 0xe5, 0x0, 0xb5, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x49, 0x0, 0x88, 0x0, 0x3, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x0, 0x6, 0xb0, 0x0, + 0x0, 0x1, 0x40, 0x2e, 0x0, 0x9, 0x70, 0x0, + 0x0, 0x9, 0x90, 0xf, 0x10, 0xc, 0x40, 0x0, + 0x0, 0x2f, 0x10, 0xd, 0x30, 0xf, 0x0, 0x0, + 0x0, 0xb8, 0x0, 0xb, 0x50, 0x4b, 0x0, 0x0, + 0x5, 0xe0, 0x34, 0x45, 0x44, 0xaa, 0x44, 0x40, + 0xc, 0x50, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6CE8 "注" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x1, 0xd6, 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, + 0x0, 0x3c, 0xd1, 0x0, 0x4, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x51, 0x22, 0x22, 0xb3, 0x22, 0x20, + 0x0, 0x0, 0x8, 0xee, 0xee, 0xfe, 0xee, 0xe1, + 0x7, 0x30, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x5, 0xdb, 0x10, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x5, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0xcd, 0xfc, 0xcc, 0x60, + 0x0, 0x0, 0xb0, 0x33, 0x37, 0xd3, 0x33, 0x10, + 0x0, 0x7, 0xb0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0xe, 0x30, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0x7b, 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x1, 0xf3, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x0, + 0x7, 0xa0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6CF3 "泳" */ + 0x0, 0x10, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xe9, 0x10, 0x5, 0xdc, 0x72, 0x0, 0x0, + 0x0, 0x19, 0xe0, 0x0, 0x3, 0x9e, 0x70, 0x0, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xc0, 0x0, 0x0, + 0xb, 0x60, 0x0, 0x0, 0x4, 0xd0, 0x0, 0x50, + 0x4, 0xdc, 0x10, 0x0, 0x4, 0xf1, 0x8, 0xd1, + 0x0, 0x7, 0x3f, 0xff, 0xb4, 0xf6, 0x7c, 0x10, + 0x0, 0x0, 0x0, 0x9, 0x74, 0xee, 0xb0, 0x0, + 0x0, 0x1, 0x70, 0xf, 0x24, 0xc9, 0x50, 0x0, + 0x0, 0x9, 0x90, 0x7b, 0x4, 0xc1, 0xe1, 0x0, + 0x0, 0x2f, 0x11, 0xe3, 0x4, 0xc0, 0x8c, 0x10, + 0x0, 0xa8, 0x1c, 0x70, 0x4, 0xc0, 0xb, 0xd2, + 0x4, 0xe1, 0x77, 0x0, 0x5, 0xc0, 0x0, 0x84, + 0x3, 0x50, 0x0, 0x6, 0xfe, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6D0B "洋" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, + 0x3, 0x91, 0x0, 0x1e, 0x20, 0x0, 0x99, 0x0, + 0x0, 0x8e, 0x40, 0x7, 0xb0, 0x1, 0xe1, 0x0, + 0x0, 0x4, 0x91, 0x33, 0xd3, 0x3a, 0xa3, 0x20, + 0x0, 0x0, 0x5, 0xcc, 0xce, 0xfc, 0xcc, 0xb0, + 0x7, 0x10, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x7, 0xe8, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x19, 0x0, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, + 0x0, 0x8, 0x50, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x1f, 0x2a, 0xbb, 0xbd, 0xeb, 0xbb, 0xb3, + 0x0, 0x8a, 0x4, 0x44, 0x48, 0xc4, 0x44, 0x41, + 0x2, 0xf2, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0xb, 0x90, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x4, 0x10, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + + /* U+6D17 "洗" */ + 0x3, 0xa3, 0x0, 0x1b, 0x5, 0xa0, 0x0, 0x0, + 0x0, 0x4d, 0x60, 0x6b, 0x5, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x3, 0xe1, 0x6, 0xb0, 0x0, 0x0, + 0x1e, 0x70, 0xc, 0x60, 0x5, 0xa0, 0x0, 0x0, + 0x2, 0xbc, 0x3, 0x0, 0x5, 0xa0, 0x0, 0x0, + 0x0, 0x3, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x5, 0xc0, 0xf, 0x10, 0x0, + 0x0, 0x8, 0x30, 0x6, 0xa0, 0xf, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x9, 0x80, 0xf, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0xe, 0x30, 0xf, 0x0, 0x21, + 0x0, 0xe3, 0x0, 0x6d, 0x0, 0xf, 0x0, 0x77, + 0x7, 0xc0, 0x6, 0xf3, 0x0, 0xf, 0x10, 0x96, + 0x8, 0x40, 0x9c, 0x30, 0x0, 0xb, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6D32 "洲" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x70, 0x2, 0xd0, 0xe, 0x10, 0x1e, 0x0, + 0x1b, 0x80, 0x2d, 0x0, 0xe1, 0x1, 0xe0, 0x0, + 0x0, 0x2, 0xd0, 0xe, 0x10, 0x1e, 0x0, 0x0, + 0x0, 0x2d, 0x0, 0xe1, 0x1, 0xe0, 0xc7, 0x0, + 0x76, 0xe8, 0xe, 0xa4, 0x1e, 0x2, 0xbd, 0xb, + 0x4d, 0xb2, 0xe4, 0xd2, 0xe0, 0x0, 0x31, 0xd2, + 0xd6, 0x7e, 0x1b, 0x7e, 0x0, 0x0, 0x87, 0x3c, + 0x2a, 0xe1, 0x4d, 0xe0, 0x0, 0x52, 0x14, 0xb0, + 0xe, 0x10, 0x2e, 0x0, 0x1f, 0x10, 0x78, 0x0, + 0xe1, 0x1, 0xe0, 0x7, 0xa0, 0xb, 0x40, 0xe, + 0x10, 0x1e, 0x0, 0xd4, 0x1, 0xe0, 0x0, 0xe1, + 0x1, 0xe0, 0x5d, 0x0, 0x97, 0x0, 0xe, 0x10, + 0x1e, 0x7, 0x50, 0x2c, 0x0, 0x0, 0xe1, 0x1, + 0xe0, + + /* U+6D3B "活" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x37, 0x0, + 0x3, 0xea, 0x20, 0x35, 0x7a, 0xcf, 0xd9, 0x20, + 0x0, 0x8, 0xc0, 0xa9, 0x78, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x1d, 0x60, 0xd, 0xee, 0xef, 0xfe, 0xee, 0xe3, + 0x3, 0xdc, 0x1, 0x11, 0x14, 0xc1, 0x11, 0x10, + 0x0, 0x5, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0x1, 0x70, 0xbe, 0xef, 0xfe, 0xee, 0x20, + 0x0, 0xa, 0x80, 0xb4, 0x0, 0x0, 0xd, 0x20, + 0x0, 0x3e, 0x0, 0xb4, 0x0, 0x0, 0xd, 0x20, + 0x0, 0xc6, 0x0, 0xb4, 0x0, 0x0, 0xd, 0x20, + 0x7, 0xd0, 0x0, 0xb7, 0x33, 0x33, 0x3e, 0x20, + 0x8, 0x30, 0x0, 0xbd, 0xbb, 0xbb, 0xbe, 0x20, + + /* U+6D3E "派" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, + 0x2, 0xe7, 0x0, 0x0, 0x25, 0x7b, 0xfd, 0x50, + 0x0, 0x2b, 0xa0, 0xdf, 0xca, 0x74, 0x10, 0x0, + 0x0, 0x0, 0x20, 0xf0, 0x0, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x4, 0x8b, 0xeb, 0x20, + 0xa, 0x40, 0x0, 0xf0, 0x2e, 0x7e, 0x10, 0x0, + 0x5, 0xda, 0x0, 0xf0, 0x2d, 0xc, 0x30, 0x0, + 0x0, 0x4, 0x1, 0xf0, 0x2d, 0x9, 0x60, 0xb4, + 0x0, 0x0, 0x2, 0xe0, 0x2d, 0x6, 0xbc, 0x80, + 0x0, 0x6, 0x33, 0xc0, 0x2d, 0x1, 0xf5, 0x0, + 0x0, 0xe, 0x24, 0xa0, 0x2d, 0x0, 0xc4, 0x0, + 0x0, 0x6b, 0x8, 0x70, 0x2d, 0x0, 0x6c, 0x0, + 0x0, 0xe3, 0xc, 0x30, 0x2d, 0x4, 0x4e, 0x50, + 0x7, 0xb0, 0x3d, 0x0, 0x4e, 0xdb, 0x35, 0xf4, + 0x7, 0x30, 0xb6, 0x0, 0x99, 0x20, 0x0, 0x77, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6D41 "流" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x5, 0xa1, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x8e, 0x31, 0x11, 0x18, 0xa1, 0x11, 0x10, + 0x0, 0x5, 0x5d, 0xee, 0xff, 0xee, 0xee, 0xe1, + 0x0, 0x0, 0x0, 0x4, 0xe1, 0x3, 0x70, 0x0, + 0x19, 0x20, 0x0, 0x3e, 0x30, 0x0, 0xb8, 0x0, + 0x6, 0xd9, 0x6, 0xfd, 0xbc, 0xdd, 0xde, 0x60, + 0x0, 0x5, 0x3, 0x53, 0x21, 0x0, 0x2, 0xa0, + 0x0, 0x0, 0x0, 0x96, 0xb, 0x30, 0xd2, 0x0, + 0x0, 0x2, 0x90, 0x96, 0xb, 0x30, 0xd2, 0x0, + 0x0, 0xa, 0x70, 0xa5, 0xb, 0x30, 0xd2, 0x0, + 0x0, 0x3e, 0x0, 0xd3, 0xb, 0x30, 0xd2, 0x0, + 0x0, 0xc7, 0x3, 0xf0, 0xb, 0x30, 0xd2, 0x54, + 0x6, 0xd0, 0x1c, 0x80, 0xb, 0x30, 0xd2, 0x75, + 0x9, 0x50, 0x8b, 0x0, 0x4, 0x10, 0x9e, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6D45 "浅" */ + 0x3, 0xa2, 0x0, 0x0, 0xe3, 0x55, 0x0, 0x0, + 0x0, 0x6e, 0x50, 0x0, 0xd3, 0x1b, 0xa0, 0x0, + 0x0, 0x2, 0x40, 0x0, 0xc4, 0x0, 0x62, 0x10, + 0x0, 0x0, 0x4, 0x68, 0xec, 0xde, 0xec, 0x50, + 0x19, 0x20, 0x8, 0x97, 0xc9, 0x10, 0x0, 0x0, + 0x6, 0xe7, 0x0, 0x0, 0x79, 0x0, 0x0, 0x20, + 0x0, 0x16, 0x1, 0x35, 0xae, 0xac, 0xee, 0xc1, + 0x0, 0x0, 0x2e, 0xca, 0x8f, 0x42, 0x2, 0x70, + 0x0, 0x7, 0x30, 0x0, 0xd, 0x40, 0x2e, 0x50, + 0x0, 0x1e, 0x10, 0x0, 0x8, 0x94, 0xe6, 0x0, + 0x0, 0x8a, 0x0, 0x0, 0x4, 0xfd, 0x30, 0x71, + 0x1, 0xe2, 0x0, 0x2, 0x9e, 0xd9, 0x0, 0xc2, + 0x9, 0xa0, 0x8, 0xde, 0x81, 0x2f, 0x83, 0xe0, + 0x6, 0x20, 0x7, 0x40, 0x0, 0x3, 0xcf, 0x70, + + /* U+6D74 "浴" */ + 0x0, 0x20, 0x0, 0x0, 0x40, 0x2, 0x0, 0x0, + 0x3, 0xe9, 0x0, 0x8, 0xb0, 0xa, 0xb0, 0x0, + 0x0, 0x1a, 0xc0, 0x4e, 0x10, 0x0, 0xab, 0x0, + 0x0, 0x0, 0x24, 0xe4, 0x6, 0x40, 0xc, 0xa0, + 0x0, 0x0, 0xd, 0x40, 0x1f, 0xa0, 0x1, 0xa1, + 0x1c, 0x50, 0x0, 0x0, 0xc8, 0xc5, 0x0, 0x0, + 0x3, 0xdb, 0x0, 0x9, 0xb0, 0x1e, 0x40, 0x0, + 0x0, 0x3, 0x0, 0xac, 0x10, 0x3, 0xe7, 0x0, + 0x0, 0x0, 0x3d, 0xa0, 0x0, 0x0, 0x1c, 0xd3, + 0x0, 0x2, 0x76, 0xee, 0xee, 0xee, 0xec, 0x85, + 0x0, 0xd, 0x30, 0xf1, 0x0, 0x0, 0x4d, 0x0, + 0x0, 0x5c, 0x0, 0xf1, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0xd5, 0x0, 0xf1, 0x0, 0x0, 0x3d, 0x0, + 0x6, 0xd0, 0x0, 0xf4, 0x22, 0x22, 0x5d, 0x0, + 0x6, 0x50, 0x0, 0xfd, 0xcc, 0xcc, 0xdc, 0x0, + + /* U+6D77 "海" */ + 0x1, 0x20, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xe9, 0x0, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x60, 0xed, 0xcc, 0xcc, 0xcc, 0x90, + 0x0, 0x0, 0x7, 0xb3, 0x33, 0x33, 0x33, 0x20, + 0x0, 0x0, 0x2f, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x0, 0x98, 0xaf, 0xee, 0xee, 0xff, 0x0, + 0x2b, 0xc3, 0x0, 0xd3, 0x1a, 0x10, 0xf, 0x0, + 0x0, 0x44, 0x0, 0xf0, 0x2, 0xb0, 0x1e, 0x0, + 0x0, 0x0, 0x9d, 0xfd, 0xdd, 0xdd, 0xdf, 0xd2, + 0x0, 0x1b, 0x15, 0xd2, 0x75, 0x22, 0x5d, 0x20, + 0x0, 0x6a, 0x5, 0xa0, 0x1c, 0x20, 0x4b, 0x0, + 0x0, 0xd4, 0x8, 0x80, 0x2, 0x80, 0x5a, 0x0, + 0x3, 0xe0, 0xa, 0xee, 0xee, 0xee, 0xff, 0xa0, + 0xa, 0x70, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, + 0x9, 0x10, 0x0, 0x0, 0x4, 0xee, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6D88 "消" */ + 0x4, 0x91, 0x1, 0x50, 0x1, 0xe0, 0x3, 0x40, + 0x6, 0xe5, 0xd, 0x50, 0x1e, 0x0, 0xd4, 0x0, + 0x2, 0x30, 0x3e, 0x1, 0xe0, 0x79, 0x0, 0x0, + 0x0, 0x0, 0x50, 0x1e, 0x4, 0x0, 0x1d, 0x50, + 0x0, 0xef, 0xff, 0xff, 0xff, 0x10, 0x3d, 0xa0, + 0xe, 0x20, 0x0, 0x0, 0xe1, 0x0, 0x6, 0x0, + 0xe2, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0xe, + 0xfe, 0xee, 0xee, 0xf1, 0x0, 0x4, 0x30, 0xe2, + 0x0, 0x0, 0xe, 0x10, 0x0, 0xc6, 0xe, 0x20, + 0x0, 0x0, 0xe1, 0x0, 0x4d, 0x0, 0xee, 0xee, + 0xee, 0xef, 0x10, 0xd, 0x50, 0xe, 0x20, 0x0, + 0x0, 0xe1, 0x7, 0xc0, 0x0, 0xe2, 0x0, 0x1, + 0x1f, 0x10, 0x63, 0x0, 0xe, 0x20, 0x0, 0xce, + 0xa0, + + /* U+6DBC "涼" */ + 0x2, 0x20, 0x0, 0x0, 0x8, 0x10, 0x0, 0x0, + 0x5, 0xea, 0x10, 0x0, 0xc, 0x70, 0x0, 0x0, + 0x0, 0x9, 0x99, 0xbb, 0xbd, 0xfb, 0xbb, 0xb0, + 0x0, 0x0, 0x2, 0x33, 0x33, 0x33, 0x33, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0x10, 0x0, 0xfe, 0xee, 0xee, 0xef, 0x0, + 0x7, 0xe6, 0x0, 0xf1, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x14, 0x0, 0xf1, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0xfe, 0xee, 0xee, 0xef, 0x0, + 0x0, 0x6, 0x60, 0x0, 0x9, 0x90, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x79, 0x8, 0x80, 0xa3, 0x0, + 0x0, 0x6b, 0x1, 0xe2, 0x8, 0x80, 0x5d, 0x0, + 0x0, 0xe3, 0xc, 0x70, 0x8, 0x80, 0xb, 0x70, + 0x9, 0xa0, 0x5b, 0x0, 0x9, 0x80, 0x2, 0xc0, + 0x9, 0x20, 0x0, 0xa, 0xee, 0x40, 0x0, 0x0, + + /* U+6DF1 "深" */ + 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xcc, 0x2d, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x7, 0x2d, 0x20, 0x0, 0x0, 0x7, 0x80, + 0x0, 0x0, 0xa, 0x23, 0xa0, 0x3c, 0x5, 0x60, + 0x1, 0x0, 0x0, 0x1e, 0x40, 0x8, 0xb0, 0x0, + 0x3e, 0x70, 0x1, 0xc8, 0x0, 0x0, 0xa9, 0x0, + 0x2, 0xcb, 0xb, 0x80, 0x7, 0x30, 0xd, 0x20, + 0x0, 0x2, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xee, 0xef, 0xee, 0xee, 0x80, + 0x0, 0xb, 0x11, 0x11, 0xcf, 0xf6, 0x11, 0x0, + 0x0, 0x3d, 0x0, 0x8, 0xac, 0x7e, 0x20, 0x0, + 0x0, 0xb5, 0x0, 0x4d, 0xb, 0x56, 0xc0, 0x0, + 0x3, 0xd0, 0x7, 0xd2, 0xb, 0x50, 0x9c, 0x20, + 0xc, 0x60, 0x7b, 0x10, 0xb, 0x50, 0x8, 0xc0, + 0x7, 0x0, 0x0, 0x0, 0xb, 0x50, 0x0, 0x0, + + /* U+6DF7 "混" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xeb, 0x22, 0xfe, 0xee, 0xee, 0xef, 0x20, + 0x0, 0xa, 0xf3, 0xd0, 0x0, 0x0, 0xe, 0x20, + 0x0, 0x0, 0x32, 0xe0, 0x0, 0x0, 0xe, 0x20, + 0x0, 0x0, 0x2, 0xfd, 0xdd, 0xdd, 0xdf, 0x20, + 0x7, 0x30, 0x2, 0xd0, 0x0, 0x0, 0xe, 0x20, + 0x5, 0xeb, 0x12, 0xfe, 0xee, 0xee, 0xef, 0x20, + 0x0, 0x7, 0x0, 0x20, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x0, + 0x0, 0x0, 0x60, 0xf0, 0x0, 0x3c, 0x4, 0xc1, + 0x0, 0x5, 0xd0, 0xff, 0xfd, 0x3d, 0xae, 0x50, + 0x0, 0xd, 0x50, 0xf0, 0x0, 0x3e, 0x50, 0x0, + 0x0, 0x7c, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x45, + 0x2, 0xf3, 0x1, 0xf4, 0x7a, 0x3d, 0x0, 0x78, + 0x5, 0x90, 0x7, 0xfc, 0x73, 0x1d, 0xff, 0xe3, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+6E05 "清" */ + 0x6, 0x70, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x1, 0x9e, 0x2d, 0xdd, 0xdf, 0xdd, 0xdd, 0x60, + 0x0, 0x3, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xcc, 0xcf, 0xdc, 0xcc, 0x10, + 0x27, 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x1a, 0xd3, 0x8d, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, + 0x0, 0x66, 0x0, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x4, 0xeb, 0xbb, 0xbb, 0xca, 0x0, + 0x0, 0x4, 0x4, 0xb0, 0x0, 0x0, 0x5a, 0x0, + 0x0, 0x1f, 0x24, 0xec, 0xcc, 0xcc, 0xda, 0x0, + 0x0, 0x8a, 0x4, 0xa0, 0x0, 0x0, 0x5a, 0x0, + 0x1, 0xf2, 0x4, 0xfd, 0xdd, 0xdd, 0xea, 0x0, + 0x9, 0xa0, 0x4, 0xa0, 0x0, 0x0, 0x5a, 0x0, + 0x8, 0x20, 0x4, 0xa0, 0x0, 0x4e, 0xe6, 0x0, + + /* U+6E07 "渇" */ + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0x80, 0xe, 0xed, 0xdd, 0xde, 0xe0, 0x0, + 0x1b, 0x60, 0xe1, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0xe, 0xcc, 0xcc, 0xcc, 0xe0, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x0, 0x3e, 0x4, 0xb2, 0x0, + 0xe, 0x20, 0x0, 0x3, 0xe0, 0x7, 0xe6, 0x0, + 0xbe, 0xfc, 0xcc, 0xcb, 0x0, 0x2, 0x40, 0x1, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xee, 0xee, 0xef, 0xb0, 0x0, 0x72, 0xce, 0x10, + 0x2, 0x0, 0x5a, 0x0, 0x2e, 0x89, 0xd5, 0x8d, + 0xb2, 0x7, 0x90, 0xa, 0x80, 0xd, 0xa5, 0x10, + 0x10, 0x87, 0x2, 0xf1, 0x0, 0xd3, 0x0, 0x1c, + 0xb, 0x50, 0xb8, 0x0, 0x7, 0xee, 0xed, 0x60, + 0xe2, 0x8, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6E08 "済" */ + 0x0, 0x10, 0x0, 0x0, 0x16, 0x0, 0x0, 0x0, + 0x4, 0xe4, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x0, 0x3e, 0x3e, 0xee, 0xef, 0xfe, 0xee, 0xe3, + 0x0, 0x2, 0x0, 0x5c, 0x0, 0x2, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xc2, 0x3d, 0x50, 0x0, + 0x2b, 0x20, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, + 0x6, 0xe3, 0x6, 0xbe, 0xb5, 0x6b, 0xfc, 0x92, + 0x0, 0x41, 0x7, 0x73, 0x0, 0x0, 0x34, 0x50, + 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x5, 0x0, 0x9e, 0xdd, 0xdd, 0xf4, 0x0, + 0x0, 0x1e, 0x0, 0xa5, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x88, 0x0, 0xdd, 0xcc, 0xcc, 0xf4, 0x0, + 0x1, 0xe1, 0x3, 0xd1, 0x11, 0x11, 0xb4, 0x0, + 0x9, 0x80, 0xc, 0x60, 0x0, 0x0, 0xb4, 0x0, + 0x7, 0x0, 0x5a, 0x0, 0x0, 0x0, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6E09 "渉" */ + 0x1, 0xc7, 0x10, 0x13, 0x2, 0xd0, 0x0, 0x0, + 0x0, 0x18, 0xd0, 0x4b, 0x2, 0xfb, 0xbb, 0x60, + 0x0, 0x0, 0x0, 0x4b, 0x2, 0xe3, 0x33, 0x20, + 0x0, 0x0, 0x0, 0x4b, 0x2, 0xd0, 0x0, 0x0, + 0xd, 0xa2, 0x1c, 0xdf, 0xcd, 0xfc, 0xcc, 0xc6, + 0x1, 0x8f, 0x23, 0x33, 0x35, 0xe3, 0x33, 0x31, + 0x0, 0x3, 0x0, 0xb, 0x12, 0xd0, 0x78, 0x0, + 0x0, 0x0, 0x0, 0x6b, 0x2, 0xd0, 0x1e, 0x50, + 0x0, 0x2, 0x52, 0xe2, 0x2, 0xd0, 0x4, 0xf2, + 0x0, 0x9, 0x9a, 0x50, 0x25, 0xd0, 0x69, 0x83, + 0x0, 0x1f, 0x10, 0x0, 0xcc, 0x62, 0xe2, 0x0, + 0x0, 0x99, 0x0, 0x0, 0x0, 0x3e, 0x60, 0x0, + 0x2, 0xf1, 0x0, 0x0, 0x3a, 0xe4, 0x0, 0x0, + 0x8, 0x80, 0x3, 0xae, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x51, 0x0, 0x0, 0x0, 0x0, + + /* U+6E1B "減" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xc4, 0x0, 0x0, 0x0, 0xe, 0x4b, 0x20, + 0x0, 0x3c, 0x50, 0x0, 0x0, 0xf, 0x2, 0xa0, + 0x0, 0x0, 0xe, 0xee, 0xee, 0xef, 0xee, 0xe2, + 0x0, 0x0, 0xe, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x2e, 0x70, 0xe, 0x3b, 0xbb, 0x8c, 0x21, 0x60, + 0x4, 0xeb, 0xe, 0x2, 0x22, 0x1b, 0x34, 0x90, + 0x0, 0x13, 0x1e, 0x1, 0x11, 0xa, 0x48, 0x50, + 0x0, 0x0, 0x2d, 0x3e, 0xbc, 0xa8, 0x6d, 0x10, + 0x0, 0x8, 0x3b, 0x3a, 0x2, 0xa6, 0xca, 0x0, + 0x0, 0x5b, 0x4a, 0x3a, 0x2, 0xa4, 0xf3, 0x0, + 0x0, 0xc5, 0x78, 0x3f, 0xde, 0x97, 0xe0, 0x11, + 0x4, 0xe0, 0xb4, 0x3a, 0x0, 0x6e, 0xe4, 0x57, + 0xc, 0x62, 0xe0, 0x1, 0x9, 0xc1, 0x7c, 0xa4, + 0x7, 0x6, 0x60, 0x0, 0x39, 0x0, 0xb, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6E21 "渡" */ + 0x1, 0x10, 0x0, 0x0, 0x5, 0x40, 0x0, 0x0, + 0x5, 0xf7, 0x0, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x0, 0x2d, 0x5c, 0xee, 0xef, 0xfe, 0xee, 0xd0, + 0x0, 0x0, 0xc, 0x30, 0x50, 0x0, 0x50, 0x0, + 0x0, 0x0, 0xc, 0x30, 0xe0, 0x0, 0xe1, 0x0, + 0x3b, 0x30, 0xc, 0xce, 0xfe, 0xee, 0xfe, 0xa0, + 0x5, 0xd8, 0xd, 0x30, 0xe0, 0x0, 0xe1, 0x0, + 0x0, 0x2, 0xe, 0x20, 0xe9, 0x88, 0xf1, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x33, 0x33, 0x30, 0x0, + 0x0, 0xb, 0xf, 0x5d, 0xdd, 0xdd, 0xdc, 0x0, + 0x0, 0x7b, 0x2e, 0x2, 0xe1, 0x0, 0xa7, 0x0, + 0x0, 0xe4, 0x5a, 0x0, 0x6c, 0x7, 0xc0, 0x0, + 0x6, 0xc0, 0xa6, 0x0, 0x9, 0xec, 0x0, 0x0, + 0xe, 0x42, 0xf1, 0x4, 0xad, 0x8d, 0xb5, 0x10, + 0x19, 0x5, 0x80, 0xca, 0x50, 0x0, 0x5a, 0xb0, + + /* U+6E29 "温" */ + 0x0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdd, 0x40, 0xfe, 0xee, 0xee, 0xeb, 0x0, + 0x0, 0x7, 0xd0, 0xf0, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0x0, 0xfd, 0xdd, 0xdd, 0xeb, 0x0, + 0x1a, 0x50, 0x0, 0xf0, 0x0, 0x0, 0x5b, 0x0, + 0x5, 0xdc, 0x0, 0xfc, 0xcc, 0xcc, 0xdb, 0x0, + 0x0, 0x4, 0x0, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x48, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0xa, 0x88, 0x60, 0xd0, 0x58, 0xc, 0x30, + 0x0, 0x2e, 0x8, 0x60, 0xd0, 0x58, 0xc, 0x30, + 0x0, 0xb7, 0x8, 0x60, 0xd0, 0x58, 0xc, 0x30, + 0x4, 0xe0, 0x8, 0x60, 0xd0, 0x58, 0xc, 0x30, + 0xa, 0x50, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6E2F "港" */ + 0x7, 0x81, 0x0, 0xf, 0x0, 0xb, 0x50, 0x0, + 0x1, 0x8e, 0x43, 0x4f, 0x33, 0x3c, 0x73, 0x20, + 0x0, 0x4, 0x4b, 0xbf, 0xbb, 0xbe, 0xdb, 0x90, + 0x0, 0x0, 0x0, 0xf, 0x0, 0xb, 0x50, 0x0, + 0x38, 0x10, 0x44, 0x5f, 0x44, 0x4c, 0x84, 0x40, + 0x18, 0xe4, 0xab, 0xbf, 0xbb, 0xbe, 0xdb, 0xb2, + 0x0, 0x23, 0x0, 0x88, 0x0, 0x3, 0xd0, 0x0, + 0x0, 0x0, 0x5, 0xfe, 0xdd, 0xdd, 0xea, 0x0, + 0x0, 0x7, 0x7e, 0x88, 0x0, 0x7, 0x8b, 0xc2, + 0x0, 0x3f, 0xb3, 0x68, 0x0, 0x7, 0x80, 0x81, + 0x0, 0xa8, 0x0, 0x6f, 0xdd, 0xdd, 0x70, 0x0, + 0x3, 0xf1, 0x0, 0x68, 0x0, 0x0, 0x5, 0x10, + 0xb, 0x80, 0x0, 0x6a, 0x0, 0x0, 0x1d, 0x20, + 0xa, 0x10, 0x0, 0x2d, 0xff, 0xff, 0xfa, 0x0, + + /* U+6E56 "湖" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5e, 0x70, 0x6, 0x80, 0x8, 0xff, 0xfe, 0x0, + 0x2c, 0x40, 0x68, 0x0, 0x86, 0x1, 0xe0, 0x0, + 0x1, 0x17, 0x91, 0x18, 0x60, 0x1e, 0x0, 0x0, + 0xef, 0xff, 0xfb, 0x86, 0x1, 0xe1, 0xb4, 0x0, + 0x6, 0x80, 0x8, 0xff, 0xfe, 0x4, 0xd9, 0x0, + 0x68, 0x0, 0x86, 0x1, 0xe0, 0x0, 0x20, 0x7, + 0x80, 0x8, 0x60, 0x1e, 0x0, 0x0, 0x5f, 0xee, + 0xf4, 0xa6, 0x1, 0xe0, 0x0, 0x55, 0x90, 0xa, + 0x4b, 0xfe, 0xee, 0x0, 0x3d, 0x59, 0x0, 0xa4, + 0xc3, 0x1, 0xe0, 0xa, 0x75, 0x90, 0xa, 0x4e, + 0x0, 0x1e, 0x1, 0xf1, 0x5f, 0xff, 0xf9, 0xc0, + 0x1, 0xe0, 0x99, 0x5, 0x90, 0x0, 0xc6, 0x0, + 0x1e, 0xa, 0x20, 0x24, 0x0, 0x4c, 0x0, 0xde, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6E90 "源" */ + 0x3, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xe8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x2c, 0x4c, 0x40, 0x0, 0x91, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x40, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x4c, 0xde, 0xfd, 0xdd, 0x10, + 0x4c, 0x40, 0xc, 0x4e, 0x10, 0x0, 0xe, 0x10, + 0x5, 0xe7, 0xd, 0x3e, 0xa9, 0x99, 0x9f, 0x10, + 0x0, 0x1, 0xd, 0x3e, 0x42, 0x22, 0x2e, 0x10, + 0x0, 0x0, 0xf, 0x1e, 0x10, 0x0, 0xe, 0x10, + 0x0, 0x6, 0x1f, 0xc, 0xdd, 0xfd, 0xdd, 0x10, + 0x0, 0x5d, 0x4c, 0x1, 0x10, 0xe1, 0x21, 0x0, + 0x0, 0xc5, 0x88, 0xa, 0x60, 0xe1, 0x7c, 0x0, + 0x4, 0xe0, 0xd4, 0x4c, 0x0, 0xe1, 0xc, 0x80, + 0xd, 0x65, 0xd0, 0xb2, 0x0, 0xe1, 0x3, 0xb0, + 0x8, 0x7, 0x40, 0x0, 0xbe, 0xc0, 0x0, 0x0, + + /* U+6E96 "準" */ + 0x0, 0x51, 0x0, 0x28, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x8e, 0x80, 0xb8, 0x5, 0xd0, 0x0, 0x0, + 0x0, 0x1, 0x45, 0xfe, 0xde, 0xfe, 0xdd, 0x60, + 0x1a, 0x40, 0x3f, 0xc0, 0x2, 0xd0, 0x0, 0x0, + 0x5, 0xc8, 0xd9, 0xfb, 0xbc, 0xfb, 0xbb, 0x0, + 0x0, 0x0, 0x3, 0xc0, 0x2, 0xd0, 0x0, 0x0, + 0x0, 0x5, 0x93, 0xfb, 0xbc, 0xfb, 0xbb, 0x0, + 0x0, 0x4d, 0x13, 0xc0, 0x2, 0xd0, 0x0, 0x0, + 0x4, 0xe2, 0x3, 0xea, 0xab, 0xfa, 0xaa, 0x80, + 0x8, 0x40, 0x3, 0xc6, 0x63, 0x33, 0x33, 0x20, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x2e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe3, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+6E9D "溝" */ + 0x6, 0x91, 0x0, 0xb, 0x40, 0xe, 0x20, 0x0, + 0x0, 0x8e, 0x5d, 0xdf, 0xed, 0xdf, 0xdd, 0x70, + 0x0, 0x3, 0x10, 0xb, 0x40, 0xe, 0x20, 0x0, + 0x0, 0x0, 0x7, 0xcf, 0xdc, 0xcf, 0xdc, 0x30, + 0x39, 0x10, 0x0, 0xb, 0x40, 0xe, 0x20, 0x0, + 0x18, 0xf5, 0x8e, 0xee, 0xef, 0xee, 0xee, 0xe0, + 0x0, 0x34, 0x0, 0x11, 0x1d, 0x41, 0x11, 0x0, + 0x0, 0x0, 0x4, 0xeb, 0xbf, 0xcb, 0xcd, 0x0, + 0x0, 0x4, 0x4, 0xc1, 0x1d, 0x31, 0x4d, 0x0, + 0x0, 0x1f, 0x14, 0xeb, 0xbf, 0xcb, 0xcd, 0x0, + 0x0, 0x99, 0x4, 0xb0, 0xd, 0x20, 0x3d, 0x0, + 0x2, 0xf2, 0xbe, 0xfd, 0xdd, 0xdd, 0xef, 0xd2, + 0xb, 0x80, 0x4, 0xb0, 0x0, 0x0, 0x3d, 0x0, + 0x9, 0x10, 0x4, 0xb0, 0x0, 0x3d, 0xd9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6EFF "滿" */ + 0x9, 0x70, 0x0, 0x3c, 0x0, 0x9, 0x60, 0x0, + 0x1, 0x9c, 0xae, 0xff, 0xee, 0xef, 0xfe, 0xe1, + 0x0, 0x0, 0x0, 0x4c, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x3d, 0x33, 0x3b, 0x60, 0x0, + 0x44, 0x0, 0x0, 0x2b, 0xbf, 0xbb, 0x50, 0x0, + 0x3d, 0xb1, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, + 0x0, 0x71, 0x4f, 0xdd, 0xdf, 0xdd, 0xde, 0x80, + 0x0, 0x0, 0x4a, 0x32, 0xf, 0x6, 0x6, 0x80, + 0x0, 0x7, 0x4a, 0x2a, 0xf, 0x9, 0x26, 0x80, + 0x0, 0x5a, 0x4a, 0x2f, 0x2f, 0xc, 0xa6, 0x80, + 0x0, 0xd2, 0x4a, 0xa6, 0x8f, 0x57, 0xb8, 0x80, + 0x6, 0xa0, 0x4b, 0x70, 0x8f, 0x80, 0x4a, 0x80, + 0x1e, 0x20, 0x4a, 0x0, 0xf, 0x0, 0x6, 0x80, + 0x6, 0x0, 0x4a, 0x0, 0xc, 0x1, 0xcd, 0x50, + + /* U+6F22 "漢" */ + 0x3, 0xa2, 0x0, 0xc, 0x20, 0x8, 0x70, 0x0, + 0x0, 0x6e, 0x8d, 0xdf, 0xed, 0xdf, 0xed, 0xd2, + 0x0, 0x1, 0x20, 0xc, 0x41, 0x19, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x8d, 0xb8, 0x40, 0x0, + 0x2e, 0x70, 0x4, 0xcc, 0xce, 0xdc, 0xcc, 0x20, + 0x4, 0xeb, 0x5, 0xa0, 0xa, 0x50, 0xc, 0x30, + 0x0, 0x15, 0x5, 0xa1, 0x1b, 0x61, 0x1d, 0x30, + 0x0, 0x0, 0x3, 0xbb, 0xbe, 0xdb, 0xbb, 0x20, + 0x0, 0x4, 0x24, 0x77, 0x7d, 0xa7, 0x77, 0x30, + 0x0, 0xe, 0x32, 0x33, 0x3e, 0x63, 0x33, 0x10, + 0x0, 0x6b, 0x3c, 0xcc, 0xcf, 0xdc, 0xcc, 0xc2, + 0x0, 0xe4, 0x0, 0x3, 0xe6, 0xba, 0x10, 0x0, + 0x8, 0xb0, 0x1, 0x7e, 0x60, 0xb, 0xc5, 0x10, + 0x7, 0x30, 0x3e, 0x91, 0x0, 0x0, 0x39, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6F38 "漸" */ + 0x6, 0x80, 0x0, 0x68, 0x0, 0x0, 0x26, 0x90, + 0x0, 0x7b, 0x9d, 0xef, 0xdc, 0x4d, 0x85, 0x0, + 0x0, 0x0, 0x0, 0x68, 0x0, 0x49, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xcd, 0x95, 0x49, 0x0, 0x0, + 0x1b, 0x10, 0x76, 0x57, 0x59, 0x4b, 0x66, 0x62, + 0x7, 0xd1, 0x75, 0x36, 0x29, 0x4d, 0x9f, 0x93, + 0x0, 0x50, 0x7d, 0xcd, 0xc9, 0x49, 0xd, 0x0, + 0x0, 0x0, 0x75, 0x36, 0x29, 0x58, 0xd, 0x0, + 0x0, 0x7, 0x7d, 0xdd, 0xc9, 0x66, 0xd, 0x0, + 0x0, 0x59, 0x0, 0x68, 0x0, 0x75, 0xd, 0x0, + 0x0, 0xb3, 0x22, 0x8a, 0x22, 0xa4, 0xd, 0x0, + 0x2, 0xc0, 0x9b, 0xdd, 0xba, 0xd0, 0xd, 0x0, + 0x9, 0x50, 0x0, 0x68, 0x4, 0xb0, 0xd, 0x0, + 0x7, 0x0, 0x0, 0x68, 0x4, 0x40, 0xd, 0x0, + + /* U+6FC3 "濃" */ + 0x6, 0xc7, 0x19, 0xdc, 0xfb, 0xbf, 0xbc, 0xb0, + 0x0, 0x3c, 0x29, 0x41, 0xd0, 0xe, 0x3, 0xb0, + 0x0, 0x0, 0x9, 0xcb, 0xfa, 0xbf, 0xac, 0xb0, + 0x0, 0x0, 0x9, 0x52, 0xe0, 0xe, 0x4, 0xb0, + 0x5b, 0x20, 0x9, 0xca, 0xfa, 0xaf, 0xab, 0xb0, + 0x7, 0xe4, 0x1, 0x22, 0x22, 0x22, 0x22, 0x10, + 0x0, 0x31, 0xc, 0xdd, 0xdd, 0xdd, 0xdd, 0xd0, + 0x0, 0x0, 0xd, 0x24, 0x44, 0x44, 0x44, 0x10, + 0x0, 0x9, 0x1e, 0x36, 0x66, 0x66, 0x66, 0x10, + 0x0, 0x3d, 0xf, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, + 0x0, 0xb5, 0x1d, 0xd, 0x11, 0xd6, 0x5, 0x80, + 0x3, 0xd0, 0x69, 0xd, 0x10, 0x3e, 0xb7, 0x0, + 0xc, 0x40, 0xc3, 0xf, 0x68, 0xa3, 0xea, 0x30, + 0x6, 0x3, 0x90, 0x2e, 0xa5, 0x10, 0x8, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6FDF "濟" */ + 0x1, 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, + 0xa, 0x90, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, + 0x0, 0x8a, 0x7e, 0xee, 0xef, 0xee, 0xee, 0xe2, + 0x0, 0x2, 0x0, 0x0, 0x90, 0x93, 0x2, 0x0, + 0x0, 0x0, 0x4c, 0xcc, 0x69, 0x66, 0xbc, 0x20, + 0x2b, 0x20, 0x9, 0x3a, 0x2c, 0x1c, 0xb, 0x0, + 0x4, 0xd5, 0xc, 0xb, 0x1c, 0x1c, 0x8, 0x50, + 0x0, 0x11, 0xa3, 0x9c, 0xc, 0x1e, 0xa3, 0xa0, + 0x0, 0x0, 0x2, 0xb0, 0x1, 0x0, 0x57, 0x0, + 0x0, 0x35, 0x2, 0xfb, 0xbb, 0xbb, 0xd8, 0x0, + 0x0, 0xa5, 0x3, 0xd2, 0x22, 0x22, 0x88, 0x0, + 0x1, 0xe0, 0x5, 0xc0, 0x0, 0x0, 0x68, 0x0, + 0x7, 0x80, 0x9, 0xfe, 0xee, 0xee, 0xf8, 0x0, + 0xe, 0x20, 0x2f, 0x30, 0x0, 0x0, 0x68, 0x0, + 0x17, 0x0, 0xb5, 0x0, 0x0, 0x0, 0x68, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7063 "灣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x70, 0x19, 0x0, 0x76, 0x0, 0xa3, 0x0, + 0x0, 0xa9, 0xa4, 0x88, 0xbd, 0xa7, 0xa5, 0x50, + 0x0, 0x1, 0x6d, 0x33, 0xaa, 0x65, 0x7b, 0x0, + 0x0, 0x0, 0x78, 0xa2, 0x66, 0x42, 0xc5, 0xa0, + 0x2b, 0x22, 0xb8, 0x85, 0x55, 0x39, 0x96, 0x91, + 0x6, 0xe3, 0x55, 0x75, 0xca, 0xa5, 0x33, 0x70, + 0x0, 0x32, 0xaa, 0x69, 0x84, 0xac, 0x19, 0x90, + 0x0, 0x2, 0x44, 0x2, 0x66, 0x56, 0x6, 0x20, + 0x0, 0x12, 0xb, 0xbb, 0xbb, 0xbb, 0xcd, 0x0, + 0x0, 0x79, 0x4, 0x66, 0x66, 0x66, 0x8d, 0x0, + 0x0, 0xd3, 0xd, 0x44, 0x44, 0x44, 0x43, 0x0, + 0x4, 0xd0, 0xd, 0xbb, 0xbb, 0xbb, 0xbd, 0x60, + 0xb, 0x70, 0x0, 0x0, 0x0, 0x0, 0xe, 0x20, + 0x9, 0x10, 0x0, 0x0, 0x8, 0xcc, 0xd7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+706B "火" */ + 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x60, 0x7, 0xa0, 0x0, 0x8, 0x60, 0x0, 0xd4, + 0x0, 0x89, 0x0, 0x1, 0xf3, 0x0, 0x3f, 0x0, + 0xa, 0x70, 0x0, 0x7b, 0x0, 0xc, 0x70, 0x0, + 0xda, 0x0, 0x1e, 0x30, 0x3, 0xd0, 0x0, 0x1f, + 0xf0, 0x5, 0x90, 0x0, 0x0, 0x0, 0x6, 0xda, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd6, 0x3e, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0xab, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0x30, 0x0, 0xcb, + 0x0, 0x0, 0x1, 0x9e, 0x30, 0x0, 0x1, 0xbd, + 0x50, 0x8, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x6d, + 0xe3, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x0, + + /* U+707D "災" */ + 0x0, 0x2, 0x30, 0x0, 0x41, 0x0, 0x4, 0x0, + 0x0, 0xd, 0x60, 0x5, 0xd1, 0x0, 0xaa, 0x0, + 0x0, 0xb8, 0x0, 0x4e, 0x20, 0x8, 0xb0, 0x0, + 0x5, 0xe0, 0x0, 0xc8, 0x0, 0x4f, 0x10, 0x0, + 0x0, 0xaa, 0x0, 0x1d, 0x60, 0x8, 0xc1, 0x0, + 0x0, 0xc, 0x80, 0x2, 0xe4, 0x0, 0x8c, 0x0, + 0x0, 0x1, 0x60, 0x3, 0x51, 0x0, 0x7, 0x20, + 0x0, 0x2, 0x20, 0xc, 0x70, 0x0, 0x5, 0x0, + 0x0, 0xb, 0x60, 0xe, 0xb0, 0x0, 0x6d, 0x0, + 0x0, 0x5e, 0x0, 0x1f, 0xf0, 0x1, 0xe3, 0x0, + 0x4, 0xe2, 0x0, 0x8c, 0xc5, 0xb, 0x70, 0x0, + 0x0, 0x20, 0x1, 0xe5, 0x5e, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x90, 0xa, 0xb1, 0x0, 0x0, + 0x0, 0x28, 0xe8, 0x0, 0x0, 0xbe, 0x61, 0x0, + 0x1d, 0xe9, 0x20, 0x0, 0x0, 0x4, 0xbf, 0xd2, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, + + /* U+70B9 "点" */ + 0x0, 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xfd, 0xdd, 0xdd, 0x70, + 0x0, 0x0, 0x0, 0x7, 0x92, 0x22, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xbb, 0xbd, 0xeb, 0xbb, 0xb3, 0x0, + 0x0, 0x1f, 0x44, 0x44, 0x44, 0x44, 0xd5, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, + 0x0, 0x1f, 0x44, 0x44, 0x44, 0x44, 0xd5, 0x0, + 0x0, 0x1b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x4d, 0x3, 0xb0, 0xd, 0x10, 0x99, 0x0, + 0x0, 0xd5, 0x1, 0xf0, 0x8, 0x80, 0xd, 0x50, + 0xa, 0xa0, 0x0, 0xf1, 0x3, 0xd0, 0x4, 0xe0, + 0x4, 0x0, 0x0, 0x30, 0x0, 0x20, 0x0, 0x20, + + /* U+70BA "為" */ + 0x0, 0x2, 0x40, 0x0, 0x81, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x30, 0x3e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x9, 0x90, 0x0, 0x0, 0x0, 0x8d, + 0xde, 0xed, 0xfe, 0xdd, 0xd6, 0x0, 0x1, 0x11, + 0x11, 0xaa, 0x11, 0x1c, 0x40, 0x0, 0x0, 0x0, + 0x3f, 0x20, 0x0, 0xe1, 0x0, 0x0, 0x0, 0xd, + 0xfe, 0xee, 0xef, 0xea, 0x0, 0x0, 0x8, 0xd1, + 0x0, 0x0, 0x8, 0x70, 0x0, 0x6, 0xf2, 0x0, + 0x0, 0x0, 0xb4, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x1b, 0xd3, 0x0, 0x0, 0x0, + 0x31, 0x4, 0xc2, 0x90, 0xb3, 0x46, 0xd, 0x5, + 0xa0, 0x6a, 0x0, 0x2e, 0x3, 0xb0, 0x95, 0xa, + 0x19, 0x70, 0xb, 0x70, 0x1d, 0x3, 0x60, 0x0, + 0xe4, 0x1, 0x90, 0x0, 0x30, 0x0, 0x7e, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7121 "無" */ + 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, 0x70, + 0x3, 0xef, 0x43, 0xf3, 0x4e, 0x35, 0xe3, 0x10, + 0x1e, 0x6e, 0x10, 0xe0, 0x1d, 0x2, 0xd0, 0x0, + 0x2, 0xe, 0x10, 0xe0, 0x1d, 0x2, 0xd0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0xe, 0x20, 0xe0, 0x2d, 0x2, 0xd0, 0x0, + 0x0, 0xe, 0x10, 0xe0, 0x1d, 0x2, 0xd0, 0x0, + 0x0, 0xe, 0x10, 0xe0, 0x1d, 0x2, 0xd0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, + 0x0, 0x98, 0x5, 0x90, 0xe, 0x10, 0x8b, 0x0, + 0x3, 0xe1, 0x3, 0xc0, 0xa, 0x70, 0xc, 0x70, + 0xd, 0x50, 0x2, 0xe0, 0x5, 0xb0, 0x3, 0xf1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+7136 "然" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0x5b, 0x66, 0x0, + 0x0, 0xb, 0xee, 0xef, 0x0, 0x5b, 0x1d, 0x50, + 0x0, 0x3d, 0x0, 0x3c, 0x0, 0x5b, 0x2, 0x40, + 0x1, 0xe5, 0xc5, 0x87, 0xff, 0xff, 0xff, 0xf1, + 0xc, 0x80, 0x1a, 0xf2, 0x0, 0x8e, 0x10, 0x0, + 0x28, 0x69, 0x9, 0x80, 0x0, 0xcf, 0x40, 0x0, + 0x0, 0x7, 0xde, 0x0, 0x3, 0xe6, 0xb0, 0x0, + 0x0, 0x5, 0xe3, 0x0, 0x1d, 0x60, 0xd3, 0x0, + 0x1, 0x8e, 0x30, 0x2, 0xca, 0x0, 0x4e, 0x20, + 0xc, 0xa1, 0x0, 0x4f, 0x80, 0x0, 0x4, 0xe1, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x11, 0x10, + 0x0, 0x98, 0x5, 0x90, 0xe, 0x10, 0x7c, 0x0, + 0x4, 0xe0, 0x3, 0xc0, 0x9, 0x70, 0xb, 0x80, + 0x1e, 0x40, 0x2, 0xe0, 0x4, 0xc0, 0x2, 0xf1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+7159 "煙" */ + 0x0, 0xe, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0xe, 0x0, 0x0, 0x78, 0x9, 0x60, 0x0, + 0x0, 0xe, 0x13, 0x0, 0x78, 0x9, 0x60, 0x0, + 0x6, 0x5e, 0x57, 0xfe, 0xff, 0xef, 0xee, 0xf0, + 0x9, 0x3e, 0xa2, 0xe0, 0x68, 0x9, 0x40, 0xf0, + 0xc, 0xe, 0x80, 0xe0, 0x68, 0x9, 0x40, 0xf0, + 0x8, 0xd, 0x0, 0xfb, 0xdd, 0xbe, 0xcb, 0xf0, + 0x0, 0x1c, 0x0, 0x33, 0x33, 0x43, 0x33, 0x30, + 0x0, 0x2b, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x4e, 0x10, 0xab, 0xbc, 0xfc, 0xbb, 0x90, + 0x0, 0x88, 0x90, 0x22, 0x23, 0xf2, 0x22, 0x20, + 0x0, 0xd0, 0xb3, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x5, 0xa0, 0x42, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0xd, 0x10, 0xd, 0xee, 0xef, 0xff, 0xee, 0xe7, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+71B1 "熱" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0x4, 0xcc, 0xfc, 0xc5, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0xad, 0xfd, 0xd9, 0x0, + 0xd, 0xdd, 0xdd, 0xdc, 0x0, 0xf0, 0x4a, 0x0, + 0x0, 0x56, 0x5, 0x60, 0x42, 0xe0, 0x4a, 0x0, + 0xa, 0x91, 0x40, 0x8c, 0x6e, 0xc0, 0x3b, 0x0, + 0x2, 0x0, 0xf0, 0x2, 0x7, 0xf8, 0x3b, 0x0, + 0x7, 0xcc, 0xfc, 0xc6, 0xc, 0x5b, 0x5d, 0x3, + 0x0, 0x0, 0xf1, 0x23, 0x6d, 0x0, 0xe, 0x28, + 0x1c, 0xdd, 0xcb, 0x9b, 0xe2, 0x0, 0x8, 0xe5, + 0x2, 0x10, 0x0, 0x0, 0x20, 0x0, 0x1, 0x20, + 0x0, 0x99, 0x5, 0x80, 0xe, 0x0, 0x8b, 0x0, + 0x3, 0xe1, 0x4, 0xc0, 0xb, 0x60, 0xc, 0x90, + 0xc, 0x40, 0x2, 0xb0, 0x5, 0x70, 0x2, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+71DF "營" */ + 0x0, 0x24, 0xb0, 0x20, 0x11, 0x4a, 0x2, 0x0, + 0x87, 0x67, 0x3d, 0x2c, 0x37, 0x72, 0xc1, 0x7, + 0xd, 0xa5, 0x13, 0x52, 0xea, 0x61, 0x1, 0x6d, + 0x66, 0xd6, 0x39, 0xe4, 0x5d, 0x70, 0x1b, 0x64, + 0x46, 0x88, 0x95, 0x44, 0x5d, 0x30, 0xd9, 0x77, + 0x77, 0x77, 0x77, 0x77, 0xe3, 0xd, 0x27, 0xaa, + 0xaa, 0xaa, 0xaa, 0xd, 0x30, 0x81, 0xb5, 0x11, + 0x11, 0x11, 0xe1, 0x82, 0x0, 0xb, 0x84, 0x44, + 0x44, 0x4e, 0x10, 0x0, 0x0, 0x45, 0x55, 0x55, + 0x55, 0x50, 0x0, 0x0, 0x6a, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa2, 0x0, 0x9, 0x62, 0x22, 0x22, 0x22, + 0x2b, 0x30, 0x0, 0x94, 0x0, 0x0, 0x0, 0x0, + 0xa3, 0x0, 0x9, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, + 0x30, + + /* U+722D "爭" */ + 0x0, 0x0, 0x12, 0x34, 0x56, 0x8a, 0xcb, 0x0, + 0x2, 0xed, 0xcb, 0xba, 0x97, 0x64, 0x42, 0x0, + 0x0, 0x8, 0x40, 0xd, 0x30, 0x0, 0xd7, 0x0, + 0x0, 0x6, 0xc0, 0x9, 0x90, 0x7, 0xc0, 0x0, + 0x0, 0x0, 0x80, 0x3, 0x60, 0x1d, 0x10, 0x0, + 0x0, 0x7e, 0xee, 0xee, 0xee, 0xee, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x88, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x88, 0x0, + 0x1e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xff, 0xe8, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x88, 0x0, + 0x0, 0x11, 0x11, 0x18, 0xa1, 0x11, 0x98, 0x0, + 0x0, 0x9c, 0xcc, 0xce, 0xec, 0xcc, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfe, 0x40, 0x0, 0x0, 0x0, + + /* U+7236 "父" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0x10, 0x2, 0xe5, 0x0, 0x0, + 0x0, 0x2, 0xf5, 0x0, 0x0, 0x3f, 0x50, 0x0, + 0x0, 0x1c, 0x90, 0x0, 0x0, 0x3, 0xf5, 0x0, + 0x1, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x30, + 0xc, 0xb0, 0x74, 0x0, 0x0, 0x4b, 0x7, 0xd0, + 0x2, 0x0, 0x6c, 0x0, 0x0, 0xb8, 0x0, 0x10, + 0x0, 0x0, 0xe, 0x40, 0x2, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xd1, 0xc, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xba, 0x8c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xae, 0xec, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xb1, 0x1b, 0xf6, 0x0, 0x0, + 0x1, 0x7d, 0xf6, 0x0, 0x0, 0x6e, 0xe9, 0x30, + 0x2f, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xf2, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7238 "爸" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0x20, 0x0, 0xd9, 0x10, 0x0, + 0x0, 0x9, 0xf4, 0x0, 0x0, 0xd, 0xf6, 0x0, + 0x6, 0xe9, 0x5d, 0x50, 0x1, 0xca, 0x3d, 0xa0, + 0x5, 0x30, 0x1, 0xbc, 0x8e, 0x50, 0x0, 0x60, + 0x0, 0x0, 0x3, 0x9f, 0xdd, 0x60, 0x0, 0x0, + 0x0, 0x37, 0xdd, 0x71, 0x3, 0xae, 0xa6, 0x20, + 0x3f, 0xdb, 0x62, 0x22, 0x22, 0x23, 0x8b, 0xe6, + 0x1, 0xf, 0xcc, 0xcd, 0xfc, 0xcc, 0xd9, 0x0, + 0x0, 0xf, 0x0, 0x3, 0xd0, 0x0, 0x69, 0x0, + 0x0, 0xf, 0x22, 0x25, 0xd2, 0x22, 0x89, 0x0, + 0x0, 0xf, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32, + 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, 0x1, 0xc5, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+7247 "片" */ + 0x0, 0x1f, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, + 0x1, 0xf0, 0x0, 0x3, 0xe0, 0x0, 0x0, 0x0, + 0x1f, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x1, + 0xf2, 0x22, 0x25, 0xe2, 0x22, 0x21, 0x0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x1, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf4, 0x44, + 0x44, 0x44, 0x40, 0x0, 0x0, 0x4f, 0xcc, 0xcc, + 0xcc, 0xde, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0xc6, 0x0, 0x0, 0x0, + 0x2e, 0x0, 0x0, 0x3f, 0x20, 0x0, 0x0, 0x2, + 0xe0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x0, 0x2e, + 0x0, 0x1, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xe0, + 0x0, + + /* U+725B "牛" */ + 0x0, 0x2, 0x50, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x80, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x63, 0x38, 0xc3, 0x33, 0x33, 0x10, + 0x0, 0x7e, 0xcc, 0xce, 0xfc, 0xcc, 0xcc, 0x30, + 0x2, 0xf2, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0xc, 0x80, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x4, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x3, 0x33, 0x33, 0x38, 0xc3, 0x33, 0x33, 0x30, + 0x1c, 0xcc, 0xcc, 0xce, 0xfc, 0xcc, 0xcc, 0xc2, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, + + /* U+7260 "牠" */ + 0x4, 0x1c, 0x30, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0xc, 0x2c, 0x30, 0xd, 0x10, 0xd1, 0x0, 0x0, + 0xe, 0x1c, 0x40, 0xe, 0x10, 0xd1, 0x4, 0x50, + 0xf, 0xff, 0xfd, 0xe, 0x10, 0xd9, 0xee, 0xc0, + 0x59, 0xc, 0x30, 0xe, 0x7d, 0xf8, 0x23, 0xc0, + 0x95, 0xc, 0x33, 0xaf, 0xa3, 0xd1, 0x3, 0xc0, + 0x0, 0xc, 0x37, 0x6e, 0x10, 0xd1, 0x3, 0xb0, + 0x0, 0x4e, 0xed, 0xe, 0x10, 0xd1, 0x4, 0xb0, + 0x6f, 0xce, 0x50, 0xe, 0x10, 0xd1, 0x6, 0x90, + 0x11, 0xc, 0x30, 0xe, 0x10, 0xd1, 0xdd, 0x30, + 0x0, 0xc, 0x30, 0xe, 0x10, 0xd1, 0x0, 0x0, + 0x0, 0xc, 0x30, 0xe, 0x10, 0x10, 0x0, 0x52, + 0x0, 0xc, 0x30, 0xd, 0x30, 0x0, 0x0, 0xc4, + 0x0, 0xc, 0x30, 0x6, 0xee, 0xee, 0xef, 0xb0, + + /* U+7269 "物" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0xd0, 0x0, 0x5a, 0x0, 0x0, 0x0, + 0x4, 0xb2, 0xd0, 0x0, 0xb5, 0x0, 0x0, 0x0, + 0x6, 0x93, 0xd0, 0x1, 0xfa, 0x99, 0x99, 0x93, + 0x8, 0xff, 0xff, 0x87, 0xa5, 0xf5, 0xb9, 0xc5, + 0xd, 0x12, 0xd0, 0x1e, 0x15, 0xb0, 0xc2, 0xb4, + 0x2c, 0x2, 0xd0, 0xc6, 0xc, 0x51, 0xe0, 0xc3, + 0x2, 0x2, 0xd0, 0x40, 0x3e, 0x5, 0x90, 0xd2, + 0x0, 0x6, 0xfe, 0xb0, 0xb6, 0xc, 0x30, 0xf1, + 0x1b, 0xfc, 0xe1, 0x6, 0xc0, 0x2d, 0x0, 0xf0, + 0x5, 0x12, 0xd0, 0x5e, 0x20, 0xa6, 0x2, 0xe0, + 0x0, 0x2, 0xd0, 0x33, 0x4, 0xd0, 0x4, 0xc0, + 0x0, 0x2, 0xd0, 0x0, 0x1e, 0x40, 0x7, 0xa0, + 0x0, 0x2, 0xd0, 0x1, 0xd7, 0x1, 0x1d, 0x60, + 0x0, 0x2, 0xd0, 0x5, 0x80, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7279 "特" */ + 0x2, 0xc, 0x30, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0xb, 0x3c, 0x30, 0x1d, 0xdd, 0xfd, 0xdd, 0x40, + 0xc, 0x5d, 0x62, 0x2, 0x22, 0xe3, 0x22, 0x0, + 0xe, 0xff, 0xfc, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x1d, 0xc, 0x40, 0x44, 0x44, 0xf5, 0x44, 0x40, + 0x5a, 0xc, 0x30, 0xbb, 0xbb, 0xbb, 0xfc, 0xb0, + 0x55, 0xc, 0x30, 0x0, 0x0, 0x0, 0xf1, 0x0, + 0x0, 0xc, 0x67, 0x33, 0x33, 0x33, 0xf5, 0x30, + 0x5, 0xaf, 0xd7, 0x9b, 0xbb, 0xbb, 0xfc, 0xb0, + 0x4b, 0x6d, 0x30, 0x7, 0x30, 0x0, 0xf1, 0x0, + 0x0, 0xc, 0x30, 0x2, 0xe2, 0x0, 0xf1, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x4a, 0x0, 0xf1, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0x1, 0xf1, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x3, 0xff, 0xb0, 0x0, + + /* U+72AC "犬" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x70, 0x4d, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0xaa, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x60, 0x0, 0x1, 0x0, + 0x1e, 0xee, 0xee, 0xef, 0xee, 0xee, 0xee, 0xe2, + 0x2, 0x22, 0x22, 0x3f, 0xf3, 0x22, 0x22, 0x20, + 0x0, 0x0, 0x0, 0x5e, 0xc5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0x5c, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf3, 0xe, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xa0, 0x5, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x9e, 0x10, 0x0, 0xbc, 0x0, 0x0, + 0x0, 0x9, 0xe2, 0x0, 0x0, 0x1c, 0xc1, 0x0, + 0x5, 0xed, 0x30, 0x0, 0x0, 0x1, 0xcf, 0x70, + 0x1c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72AF "犯" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xa0, 0x1d, 0x50, 0x11, 0x11, 0x11, 0x0, + 0x0, 0xaa, 0xc9, 0x3, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x1f, 0xc0, 0x3, 0xd0, 0x0, 0xd, 0x30, + 0x2, 0xdb, 0xe0, 0x3, 0xd0, 0x0, 0xd, 0x30, + 0x1e, 0x60, 0xd4, 0x3, 0xd0, 0x0, 0xd, 0x30, + 0x1, 0x0, 0x98, 0x3, 0xd0, 0x0, 0xd, 0x30, + 0x0, 0x3, 0xfa, 0x3, 0xd0, 0x1, 0x1e, 0x30, + 0x0, 0x1e, 0xab, 0x3, 0xd0, 0x5f, 0xec, 0x0, + 0x3, 0xe7, 0x5b, 0x3, 0xd0, 0x0, 0x0, 0x0, + 0x2f, 0x60, 0x5a, 0x3, 0xd0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x69, 0x3, 0xd0, 0x0, 0x0, 0x71, + 0x0, 0x0, 0x88, 0x3, 0xd0, 0x0, 0x0, 0xd3, + 0x1, 0x2, 0xe3, 0x2, 0xf4, 0x22, 0x24, 0xf0, + 0x8, 0xfe, 0x80, 0x0, 0x9d, 0xee, 0xed, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72B6 "状" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0xb, 0x41, 0x40, 0x0, + 0x0, 0x0, 0xf1, 0x0, 0xb, 0x40, 0xc5, 0x0, + 0xd, 0x40, 0xf1, 0x0, 0xb, 0x40, 0x1e, 0x20, + 0x2, 0xe2, 0xf1, 0x0, 0xb, 0x40, 0x2, 0x0, + 0x0, 0x67, 0xf6, 0xdd, 0xdf, 0xed, 0xdd, 0xd0, + 0x0, 0x0, 0xf2, 0x33, 0x3e, 0xa3, 0x33, 0x30, + 0x0, 0x0, 0xf1, 0x0, 0xf, 0xd0, 0x0, 0x0, + 0x0, 0x1c, 0xf1, 0x0, 0x3d, 0xd1, 0x0, 0x0, + 0x2, 0xd7, 0xf1, 0x0, 0x89, 0x88, 0x0, 0x0, + 0x2e, 0x60, 0xf1, 0x0, 0xe3, 0x2e, 0x0, 0x0, + 0x15, 0x0, 0xf1, 0x7, 0xc0, 0xa, 0x90, 0x0, + 0x0, 0x0, 0xf1, 0x2e, 0x30, 0x1, 0xe5, 0x0, + 0x0, 0x0, 0xf3, 0xe7, 0x0, 0x0, 0x4f, 0x70, + 0x0, 0x0, 0xf8, 0x80, 0x0, 0x0, 0x3, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72C0 "狀" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x20, 0x3c, 0x0, 0x1, 0xe0, 0xc3, 0x0, + 0xc, 0x20, 0x3c, 0x0, 0x1, 0xe0, 0x3e, 0x10, + 0xc, 0x20, 0x3c, 0x0, 0x1, 0xe0, 0x7, 0xa0, + 0xc, 0x20, 0x3c, 0x0, 0x1, 0xe0, 0x0, 0x0, + 0xc, 0xff, 0xfc, 0x9d, 0xdd, 0xfd, 0xdd, 0xd3, + 0x0, 0x0, 0x4c, 0x23, 0x35, 0xf6, 0x33, 0x30, + 0x0, 0x0, 0x3c, 0x0, 0x4, 0xf6, 0x0, 0x0, + 0x2, 0x22, 0x6c, 0x0, 0x7, 0xf9, 0x0, 0x0, + 0x3d, 0xfc, 0xdc, 0x0, 0xc, 0xbe, 0x0, 0x0, + 0x3, 0xd0, 0x3c, 0x0, 0x2f, 0x2e, 0x50, 0x0, + 0x4, 0xb0, 0x3c, 0x0, 0xbb, 0x7, 0xd0, 0x0, + 0x7, 0x80, 0x3c, 0x5, 0xf2, 0x0, 0xd9, 0x0, + 0xd, 0x20, 0x3c, 0x6f, 0x40, 0x0, 0x2f, 0xb0, + 0x15, 0x0, 0x3d, 0xc3, 0x0, 0x0, 0x2, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72EC "独" */ + 0x8, 0x10, 0x64, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x5, 0xc3, 0xe2, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x0, 0x8f, 0x50, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x1, 0xdf, 0x20, 0xef, 0xff, 0xff, 0xff, 0x30, + 0x1e, 0x79, 0x70, 0xe2, 0x2, 0xe0, 0xd, 0x30, + 0x2, 0x5, 0xc0, 0xe2, 0x2, 0xe0, 0xd, 0x30, + 0x0, 0x6, 0xd0, 0xe2, 0x2, 0xe0, 0xd, 0x30, + 0x0, 0x2f, 0xe0, 0xe3, 0x13, 0xe1, 0x1e, 0x30, + 0x2, 0xd6, 0xf0, 0xcd, 0xdd, 0xfd, 0xdd, 0x20, + 0x2e, 0x61, 0xe0, 0x0, 0x2, 0xe0, 0x42, 0x0, + 0x3, 0x2, 0xd0, 0x0, 0x2, 0xe0, 0x5b, 0x0, + 0x0, 0x3, 0xc0, 0x0, 0x2, 0xe1, 0x3f, 0x30, + 0x0, 0x8, 0x95, 0xab, 0xde, 0xfd, 0xcc, 0xb0, + 0xb, 0xfc, 0x24, 0x64, 0x31, 0x0, 0x1, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+72ED "狭" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x30, 0x88, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0x2, 0xe8, 0xd1, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0x30, 0xaf, 0xff, 0xff, 0xff, 0xe0, + 0x7, 0xec, 0x60, 0x4, 0x1, 0xf0, 0x5, 0x10, + 0x2b, 0x15, 0xb0, 0xe, 0x11, 0xf0, 0xe, 0x10, + 0x0, 0x2, 0xf0, 0x8, 0x72, 0xf0, 0x79, 0x0, + 0x0, 0xb, 0xf0, 0x3, 0x63, 0xe0, 0x91, 0x0, + 0x0, 0x7b, 0xe4, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x8, 0xd0, 0xe2, 0x11, 0x19, 0xf5, 0x11, 0x10, + 0x3c, 0x10, 0xf1, 0x0, 0xe, 0x8b, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x8b, 0xc, 0x50, 0x0, + 0x0, 0x1, 0xe0, 0x7, 0xe1, 0x2, 0xe4, 0x0, + 0x0, 0x8, 0xb2, 0xbd, 0x20, 0x0, 0x4f, 0x81, + 0xb, 0xfc, 0x3b, 0x80, 0x0, 0x0, 0x2, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+732B "猫" */ + 0x6, 0x20, 0x72, 0x3, 0xe0, 0x2, 0xb0, 0x0, + 0x3e, 0x8d, 0x10, 0x4e, 0x0, 0x3b, 0x0, 0x0, + 0x7f, 0x38, 0xef, 0xfe, 0xef, 0xfe, 0xd0, 0x3f, + 0xe4, 0x0, 0x3e, 0x0, 0x2b, 0x0, 0x2e, 0x57, + 0xa0, 0x3, 0xe0, 0x2, 0xb0, 0x0, 0x30, 0x3e, + 0x0, 0x27, 0x0, 0x26, 0x0, 0x0, 0x9, 0xf0, + 0xee, 0xee, 0xfe, 0xef, 0x40, 0x4, 0xdf, 0xe, + 0x10, 0x1e, 0x0, 0xb4, 0x5, 0xe2, 0xe1, 0xe1, + 0x1, 0xe0, 0xb, 0x42, 0xe3, 0xf, 0xe, 0xee, + 0xef, 0xee, 0xf4, 0x1, 0x0, 0xf0, 0xe2, 0x1, + 0xe0, 0xb, 0x40, 0x0, 0x2d, 0xe, 0x10, 0x1e, + 0x0, 0xb4, 0x2, 0x39, 0xa0, 0xec, 0xcc, 0xfc, + 0xcf, 0x40, 0x6c, 0xa1, 0xe, 0x42, 0x22, 0x22, + 0xb4, + + /* U+733F "猿" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x20, 0xb4, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x3, 0xd9, 0xb0, 0xbe, 0xef, 0xfe, 0xee, 0x20, + 0x0, 0x9f, 0x10, 0x0, 0x7, 0x90, 0x0, 0x0, + 0x8, 0xdd, 0x28, 0xee, 0xef, 0xfe, 0xee, 0xd0, + 0x2b, 0x18, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xc0, 0x9d, 0xcc, 0xcc, 0xde, 0x0, + 0x0, 0xc, 0xd0, 0xa5, 0x0, 0x0, 0xf, 0x0, + 0x0, 0x7e, 0xe0, 0xa6, 0x11, 0x11, 0x1f, 0x0, + 0x6, 0xe3, 0xe0, 0x7b, 0xcf, 0xfb, 0xbb, 0x0, + 0x3e, 0x32, 0xd0, 0x4, 0xd7, 0xd2, 0x7, 0x80, + 0x1, 0x2, 0xd6, 0xde, 0x60, 0x5c, 0xc7, 0x0, + 0x0, 0x4, 0xb3, 0x19, 0x50, 0xb, 0xa0, 0x0, + 0x0, 0x9, 0x80, 0xb, 0x9a, 0x90, 0xbc, 0x30, + 0xc, 0xfc, 0x10, 0x1e, 0x94, 0x0, 0x6, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7372 "獲" */ + 0x5, 0x10, 0x52, 0x0, 0xb1, 0x9, 0x80, 0x0, + 0x7, 0xc3, 0xe4, 0xcc, 0xfc, 0xce, 0xec, 0xc3, + 0x0, 0x9f, 0x40, 0x2, 0xc3, 0x49, 0x90, 0x0, + 0x3, 0xde, 0x10, 0xd, 0x63, 0xe6, 0x32, 0x20, + 0x3e, 0x47, 0x61, 0xce, 0x77, 0xe8, 0x77, 0x60, + 0x1, 0x4, 0xb7, 0x9f, 0xaa, 0xeb, 0xaa, 0x40, + 0x0, 0xc, 0xd0, 0x1e, 0x55, 0xd6, 0x55, 0x20, + 0x0, 0x6b, 0xe0, 0x1e, 0x55, 0xd7, 0x55, 0x20, + 0x3, 0xe1, 0xf0, 0x1f, 0xbb, 0xec, 0xbb, 0xb0, + 0x2f, 0x40, 0xf0, 0x7, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x1, 0xe0, 0xbf, 0xdd, 0xdd, 0xdf, 0x80, + 0x0, 0x2, 0xd0, 0x8, 0xb2, 0x4, 0xc7, 0x0, + 0x0, 0x18, 0x90, 0x0, 0x7f, 0xee, 0x51, 0x0, + 0x9, 0xfc, 0x26, 0xdc, 0x84, 0x27, 0xbe, 0xe5, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, + + /* U+73A9 "玩" */ + 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x0, + 0x3f, 0xff, 0xff, 0x3e, 0xee, 0xee, 0xee, 0xa0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x5f, 0x43, 0x56, 0x66, 0x66, 0x66, 0x63, + 0xb, 0xcf, 0xba, 0x79, 0xeb, 0x9e, 0xb9, 0x95, + 0x0, 0x1f, 0x0, 0x0, 0xc4, 0xc, 0x30, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0xd2, 0xc, 0x30, 0x0, + 0x0, 0x1f, 0x0, 0x1, 0xf0, 0xc, 0x30, 0x0, + 0x0, 0x4f, 0xbe, 0x45, 0xb0, 0xc, 0x30, 0x0, + 0x4f, 0xc7, 0x30, 0x1e, 0x50, 0xc, 0x30, 0x39, + 0x0, 0x0, 0x3, 0xc9, 0x0, 0xc, 0x50, 0x69, + 0x0, 0x0, 0x3e, 0x60, 0x0, 0x8, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+73FE "現" */ + 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x10, + 0x2f, 0xff, 0xff, 0x4f, 0xcc, 0xcc, 0xcd, 0xb0, + 0x0, 0xe, 0x10, 0xf, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0xe, 0x10, 0xf, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0xe, 0x10, 0xf, 0xdd, 0xdd, 0xde, 0xb0, + 0x2, 0x2e, 0x42, 0xf, 0x0, 0x0, 0x4, 0xb0, + 0xb, 0xbf, 0xbb, 0x1f, 0xaa, 0xaa, 0xac, 0xb0, + 0x0, 0xe, 0x10, 0xf, 0x33, 0x33, 0x37, 0xb0, + 0x0, 0xe, 0x10, 0xf, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0xe, 0x10, 0xf, 0xee, 0xee, 0xef, 0xb0, + 0x0, 0xe, 0x9c, 0x60, 0xa5, 0xe, 0x10, 0x0, + 0x3b, 0xfc, 0x73, 0x0, 0xe2, 0xe, 0x10, 0x0, + 0x25, 0x10, 0x0, 0x7, 0xb0, 0xe, 0x10, 0x27, + 0x0, 0x0, 0x0, 0x8e, 0x20, 0xe, 0x10, 0x4a, + 0x0, 0x0, 0x1e, 0xa2, 0x0, 0x9, 0xfe, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7403 "球" */ + 0x2, 0x22, 0x21, 0x0, 0x0, 0xe2, 0x94, 0x0, + 0xa, 0xaf, 0xa8, 0x0, 0x0, 0xe1, 0xa, 0x30, + 0x0, 0x1e, 0x0, 0xac, 0xcc, 0xfd, 0xcc, 0xc4, + 0x0, 0x1e, 0x0, 0x22, 0x22, 0xe4, 0x22, 0x21, + 0x0, 0x1e, 0x0, 0x35, 0x0, 0xe4, 0x1, 0xa0, + 0xd, 0xef, 0xd7, 0x1e, 0x20, 0xe7, 0xb, 0x70, + 0x1, 0x3e, 0x11, 0x6, 0xa0, 0xeb, 0x7b, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x72, 0xff, 0xd0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x2d, 0xf9, 0x80, 0x0, + 0x0, 0x1e, 0x2, 0x3, 0xe3, 0xe2, 0xe2, 0x0, + 0x0, 0x5f, 0xed, 0x5e, 0x40, 0xe1, 0x6d, 0x10, + 0x2f, 0xc7, 0x23, 0xe3, 0x0, 0xe1, 0x9, 0xd2, + 0x2, 0x0, 0x0, 0x20, 0x0, 0xf1, 0x0, 0x74, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7406 "理" */ + 0x1, 0x11, 0x11, 0x5f, 0xee, 0xff, 0xef, 0xe0, + 0x1e, 0xef, 0xec, 0x59, 0x0, 0xd1, 0x1, 0xe0, + 0x0, 0xf, 0x0, 0x59, 0x0, 0xd1, 0x1, 0xe0, + 0x0, 0xf, 0x0, 0x5e, 0xcc, 0xfc, 0xcc, 0xe0, + 0x0, 0xf, 0x0, 0x5a, 0x11, 0xe2, 0x13, 0xe0, + 0xd, 0xef, 0xe9, 0x59, 0x0, 0xd1, 0x1, 0xe0, + 0x1, 0x2f, 0x11, 0x5e, 0xbb, 0xfb, 0xbb, 0xe0, + 0x0, 0xf, 0x0, 0x13, 0x33, 0xf5, 0x33, 0x30, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xf, 0x3, 0x6c, 0xcc, 0xfd, 0xcc, 0xc1, + 0x0, 0x3f, 0xed, 0x12, 0x22, 0xf5, 0x22, 0x20, + 0x1d, 0xfb, 0x50, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x8, 0x20, 0x0, 0x0, 0x0, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xee, 0xee, 0xee, 0xee, 0xea, + + /* U+74B0 "環" */ + 0x0, 0x0, 0x0, 0xdd, 0xde, 0xcf, 0xcd, 0x90, + 0x4e, 0xff, 0xe0, 0xd1, 0x1a, 0xc, 0x5, 0x90, + 0x0, 0x95, 0x0, 0xd2, 0x2b, 0xc, 0x6, 0x90, + 0x0, 0x95, 0x0, 0xab, 0xbb, 0xbb, 0xbb, 0x60, + 0x0, 0x95, 0x4, 0x77, 0x77, 0x77, 0x77, 0x70, + 0x19, 0xdb, 0x72, 0x55, 0x55, 0x55, 0x55, 0x50, + 0x4, 0xb8, 0x30, 0x5d, 0xdd, 0xdd, 0xdd, 0x10, + 0x0, 0x95, 0x0, 0x69, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x95, 0x0, 0x6a, 0x22, 0x22, 0x2e, 0x10, + 0x0, 0x95, 0x0, 0x4a, 0xbf, 0xec, 0xaa, 0x0, + 0x0, 0x98, 0x70, 0x5, 0xc5, 0x59, 0x9, 0x90, + 0x29, 0xed, 0x88, 0xde, 0x50, 0xb, 0xd6, 0x0, + 0x47, 0x20, 0x4, 0xb, 0x52, 0x51, 0xd7, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xea, 0x60, 0x1b, 0xe2, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x20, + + /* U+7518 "甘" */ + 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x1, 0x14, 0xe1, 0x11, 0x11, 0x1e, 0x51, 0x10, + 0x3e, 0xef, 0xfe, 0xee, 0xee, 0xef, 0xfe, 0xe3, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0x3, 0xfd, 0xdd, 0xdd, 0xdf, 0x30, 0x0, + 0x0, 0x3, 0xe2, 0x22, 0x22, 0x2e, 0x30, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0x3, 0xe0, 0x0, 0x0, 0xe, 0x30, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x3, 0xe1, 0x11, 0x11, 0x1d, 0x30, 0x0, + + /* U+751A "甚" */ + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0xc, 0xef, 0xff, 0xee, 0xee, 0xef, 0xfe, 0xb0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x0, 0xfb, 0xbb, 0xbb, 0xbf, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x11, 0x11, 0x1e, 0x20, 0x0, + 0x0, 0x0, 0xf1, 0x11, 0x11, 0x1e, 0x20, 0x0, + 0x0, 0x0, 0xfb, 0xbb, 0xbb, 0xbf, 0x20, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x3d, 0x0, 0x18, 0x3, 0x90, 0x0, 0x0, + 0x0, 0x3d, 0x0, 0xc6, 0x0, 0x9b, 0x0, 0x0, + 0x0, 0x3d, 0xa, 0x90, 0x0, 0xa, 0xb0, 0x0, + 0x0, 0x3d, 0x28, 0x11, 0x11, 0x12, 0x51, 0x0, + 0x0, 0x3c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x0, + + /* U+751F "生" */ + 0x0, 0x3, 0x90, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x90, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xf, 0x51, 0x19, 0xa1, 0x11, 0x11, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x3, 0xf3, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0xd, 0x70, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xcc, 0xce, 0xec, 0xcc, 0xca, 0x0, + 0x0, 0x13, 0x33, 0x3a, 0xb3, 0x33, 0x33, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + + /* U+7522 "產" */ + 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xde, 0xee, 0xee, 0xfe, 0xee, 0xee, 0x80, + 0x0, 0x0, 0x8c, 0x94, 0x1, 0x6c, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xff, 0xc2, 0x0, 0x0, + 0x0, 0x2, 0xbc, 0x84, 0x1, 0x6b, 0xc1, 0x0, + 0x0, 0xee, 0xfe, 0xee, 0xee, 0xee, 0xfe, 0xe1, + 0x0, 0xf0, 0x5, 0x0, 0x26, 0x0, 0x0, 0x0, + 0x0, 0xf0, 0x3e, 0x10, 0x4c, 0x0, 0x0, 0x0, + 0x0, 0xf1, 0xcd, 0xdd, 0xdf, 0xdd, 0xdd, 0x20, + 0x1, 0xf9, 0xa0, 0x0, 0x3c, 0x0, 0x0, 0x0, + 0x2, 0xd3, 0x1d, 0xdd, 0xef, 0xdd, 0xdc, 0x0, + 0x4, 0xc0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, + 0xa, 0x70, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, + 0x3e, 0x18, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe4, + 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7523 "産" */ + 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x2, 0xb0, 0x0, 0x3, 0xa0, 0x0, 0x0, 0x0, + 0xb, 0x70, 0x0, 0xb7, 0x0, 0x0, 0x9, 0xbb, + 0xcc, 0xbb, 0xbf, 0xbb, 0xba, 0x0, 0xd6, 0x34, + 0x33, 0x44, 0x33, 0x33, 0x30, 0xd, 0x20, 0xc3, + 0x7, 0x90, 0x0, 0x0, 0x0, 0xe2, 0x4f, 0xdc, + 0xee, 0xcc, 0xcb, 0x0, 0xf, 0x3e, 0x30, 0x7, + 0x90, 0x0, 0x0, 0x0, 0xf3, 0x60, 0x0, 0x79, + 0x0, 0x0, 0x0, 0x2e, 0x1, 0xdd, 0xde, 0xfd, + 0xdd, 0x60, 0x6, 0xa0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x0, 0xb6, 0x0, 0x0, 0x7, 0x90, 0x0, + 0x0, 0x2e, 0x7, 0xee, 0xee, 0xff, 0xee, 0xee, + 0xe0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7528 "用" */ + 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xb4, + 0x0, 0xe, 0x20, 0x0, 0x1e, 0x0, 0xb4, 0x0, + 0xe, 0x20, 0x0, 0x1e, 0x0, 0xbd, 0xcc, 0xcf, + 0xcc, 0xcc, 0xce, 0x0, 0xb7, 0x44, 0x4e, 0x64, + 0x44, 0x5e, 0x0, 0xb4, 0x0, 0xe, 0x20, 0x0, + 0x1e, 0x0, 0xd4, 0x0, 0xe, 0x20, 0x0, 0x1e, + 0x0, 0xef, 0xee, 0xef, 0xee, 0xee, 0xee, 0x0, + 0xf2, 0x11, 0x1e, 0x31, 0x11, 0x3e, 0x2, 0xd0, + 0x0, 0xe, 0x20, 0x0, 0x1e, 0x7, 0x90, 0x0, + 0xe, 0x20, 0x0, 0x1e, 0x1e, 0x20, 0x0, 0xe, + 0x20, 0x0, 0x2e, 0x78, 0x0, 0x0, 0xe, 0x21, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7530 "田" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3d, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x2e, 0x3d, 0x0, 0x0, + 0x2e, 0x0, 0x0, 0x2e, 0x3d, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0x2e, 0x3d, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x2e, 0x3f, 0xee, 0xee, 0xef, 0xee, 0xee, + 0xee, 0x3e, 0x22, 0x22, 0x5e, 0x22, 0x22, 0x5e, + 0x3d, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x2e, 0x3d, + 0x0, 0x0, 0x2e, 0x0, 0x0, 0x2e, 0x3d, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x2e, 0x3d, 0x0, 0x0, + 0x2e, 0x0, 0x0, 0x2e, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x3e, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x4e, + + /* U+7531 "由" */ + 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x1, 0x11, + 0x11, 0xd5, 0x11, 0x11, 0x10, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1e, 0x0, 0x0, 0xc4, + 0x0, 0x0, 0xe2, 0x1e, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0xe2, 0x1e, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0xe2, 0x1f, 0xcc, 0xcc, 0xfd, 0xcc, 0xcc, 0xf2, + 0x1f, 0x33, 0x33, 0xd7, 0x33, 0x33, 0xf2, 0x1e, + 0x0, 0x0, 0xc4, 0x0, 0x0, 0xe2, 0x1e, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0xe2, 0x1e, 0x0, 0x0, + 0xc4, 0x0, 0x0, 0xe2, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf2, 0x1e, 0x11, 0x11, 0x11, 0x11, + 0x11, 0xe2, + + /* U+7533 "申" */ + 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x11, 0xc6, 0x11, 0x11, 0x10, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, 0x0, 0x0, + 0xc5, 0x0, 0x0, 0xe2, 0x1e, 0x0, 0x0, 0xc5, + 0x0, 0x0, 0xe2, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x1e, 0x0, 0x0, 0xc5, 0x0, 0x0, + 0xe2, 0x1e, 0x0, 0x0, 0xc5, 0x0, 0x0, 0xe2, + 0x1e, 0x0, 0x0, 0xc6, 0x0, 0x0, 0xe2, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x1e, 0x0, + 0x0, 0xc5, 0x0, 0x0, 0xc2, 0x0, 0x0, 0x0, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, + 0x0, 0x0, + + /* U+7535 "电" */ + 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, 0x11, + 0x11, 0x1e, 0x41, 0x11, 0x11, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0xe2, 0x0, 0xe, + 0x30, 0x0, 0x2e, 0x0, 0xe2, 0x0, 0xe, 0x30, + 0x0, 0x2e, 0x0, 0xed, 0xdd, 0xdf, 0xdd, 0xdd, + 0xde, 0x0, 0xe5, 0x22, 0x2e, 0x52, 0x22, 0x5e, + 0x0, 0xe2, 0x0, 0xe, 0x30, 0x0, 0x2e, 0x0, + 0xe3, 0x11, 0x1e, 0x41, 0x11, 0x3e, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xd2, 0x0, + 0xe, 0x30, 0x0, 0x0, 0x62, 0x0, 0x0, 0xe, + 0x30, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xd, 0x71, + 0x11, 0x12, 0xf2, 0x0, 0x0, 0x6, 0xef, 0xff, + 0xff, 0x90, + + /* U+7537 "男" */ + 0x0, 0x8f, 0xee, 0xef, 0xfe, 0xee, 0xf8, 0x0, + 0x8, 0x80, 0x0, 0x97, 0x0, 0x8, 0x80, 0x0, + 0x88, 0x0, 0x9, 0x70, 0x0, 0x88, 0x0, 0x8, + 0xfd, 0xdd, 0xfe, 0xdd, 0xdf, 0x80, 0x0, 0x88, + 0x0, 0x9, 0x70, 0x0, 0x88, 0x0, 0x8, 0x80, + 0x0, 0x97, 0x0, 0x8, 0x80, 0x0, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xf2, 0x0, 0x0, 0x0, 0xa, 0xbb, 0xbb, 0xcf, + 0xcb, 0xbb, 0xbb, 0x0, 0x33, 0x33, 0x3c, 0x93, + 0x33, 0x36, 0xf0, 0x0, 0x0, 0x4, 0xf1, 0x0, + 0x0, 0x4d, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, + 0x7, 0xa0, 0x1, 0x6c, 0xd4, 0x0, 0x0, 0x0, + 0xc6, 0x1, 0xea, 0x50, 0x0, 0x0, 0xef, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+753A "町" */ + 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xcd, 0xfc, 0xf2, 0xff, 0xff, 0xff, 0xf4, 0xe0, + 0x1c, 0xe, 0x11, 0x11, 0x2f, 0x11, 0xe, 0x1, + 0xc0, 0xe1, 0x0, 0x1, 0xf0, 0x0, 0xe0, 0x1c, + 0xe, 0x10, 0x0, 0x1f, 0x0, 0xe, 0x1, 0xc0, + 0xe1, 0x0, 0x1, 0xf0, 0x0, 0xef, 0xff, 0xff, + 0x10, 0x0, 0x1f, 0x0, 0xe, 0x1, 0xc0, 0xe1, + 0x0, 0x1, 0xf0, 0x0, 0xe0, 0x1c, 0xe, 0x10, + 0x0, 0x1f, 0x0, 0xe, 0x1, 0xc0, 0xe1, 0x0, + 0x1, 0xf0, 0x0, 0xe0, 0x1c, 0xe, 0x10, 0x0, + 0x1f, 0x0, 0xe, 0xff, 0xff, 0xf1, 0x0, 0x1, + 0xf0, 0x0, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x80, + 0x0, + + /* U+753B "画" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xaa, + 0xaa, 0xaa, 0xa0, 0x0, 0x27, 0xd, 0x43, 0x5e, + 0x33, 0xe0, 0x1a, 0x4c, 0xd, 0x10, 0x1d, 0x0, + 0xe0, 0x2e, 0x4c, 0xd, 0x21, 0x3d, 0x11, 0xe0, + 0x2e, 0x4c, 0xd, 0xcc, 0xcf, 0xcc, 0xf0, 0x2e, + 0x4c, 0xd, 0x10, 0x1d, 0x0, 0xe0, 0x2e, 0x4c, + 0xd, 0x10, 0x1d, 0x0, 0xe0, 0x2e, 0x4c, 0xc, + 0xee, 0xee, 0xee, 0xe0, 0x2e, 0x4c, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0x4f, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xde, 0x13, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x5e, + + /* U+754C "界" */ + 0x0, 0x3f, 0xee, 0xee, 0xfe, 0xee, 0xee, 0x0, + 0x0, 0x3c, 0x0, 0x2, 0xe0, 0x0, 0x2e, 0x0, + 0x0, 0x3c, 0x0, 0x2, 0xe0, 0x0, 0x2e, 0x0, + 0x0, 0x3f, 0xdd, 0xde, 0xfd, 0xdd, 0xee, 0x0, + 0x0, 0x3c, 0x0, 0x2, 0xe0, 0x0, 0x2e, 0x0, + 0x0, 0x3f, 0xaa, 0xab, 0xfa, 0xaa, 0xbe, 0x0, + 0x0, 0x3, 0x39, 0xf6, 0x38, 0xc4, 0x33, 0x0, + 0x0, 0x0, 0x9f, 0x40, 0x0, 0x7d, 0x30, 0x0, + 0x1, 0x7e, 0xb9, 0x20, 0x0, 0x76, 0xdb, 0x50, + 0xb, 0xb3, 0xc, 0x40, 0x0, 0xd3, 0x4, 0xc7, + 0x0, 0x0, 0xe, 0x20, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x7, 0xf3, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x8c, 0x30, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7559 "留" */ + 0x0, 0x2, 0x7b, 0x10, 0x0, 0x0, 0x0, 0xa, + 0xec, 0x83, 0xf, 0xff, 0xff, 0xf7, 0x1e, 0x0, + 0x0, 0x0, 0xd, 0x0, 0xa6, 0x1e, 0x0, 0x93, + 0x0, 0x3b, 0x0, 0xb5, 0x1e, 0x0, 0x5c, 0x0, + 0x77, 0x0, 0xb4, 0x2e, 0x3, 0x7f, 0x40, 0xd2, + 0x0, 0xd3, 0x6f, 0xee, 0x99, 0xb9, 0x90, 0x23, + 0xf0, 0x48, 0x30, 0x0, 0xba, 0x0, 0xbc, 0x60, + 0x0, 0x22, 0x22, 0x33, 0x22, 0x22, 0x0, 0x3, + 0xfb, 0xbb, 0xce, 0xbb, 0xbf, 0x30, 0x3, 0xd0, + 0x0, 0x3c, 0x0, 0xd, 0x30, 0x3, 0xfd, 0xdd, + 0xef, 0xdd, 0xdf, 0x30, 0x3, 0xd0, 0x0, 0x3c, + 0x0, 0xd, 0x30, 0x3, 0xe0, 0x0, 0x4c, 0x0, + 0xe, 0x30, 0x3, 0xfd, 0xdd, 0xdd, 0xdd, 0xde, + 0x30, + + /* U+756A "番" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x34, 0x68, 0xac, 0xe2, 0x0, + 0x0, 0xdd, 0xcb, 0xad, 0xb6, 0x45, 0x30, 0x0, + 0x0, 0x6, 0xb0, 0x9, 0x70, 0xd, 0x60, 0x0, + 0x0, 0x0, 0xc5, 0x9, 0x70, 0x7b, 0x0, 0x0, + 0xe, 0xee, 0xfe, 0xef, 0xfe, 0xff, 0xee, 0xe0, + 0x0, 0x0, 0x7, 0xdb, 0xad, 0x70, 0x0, 0x0, + 0x0, 0x1, 0xbc, 0x19, 0x71, 0xcc, 0x20, 0x0, + 0x2, 0x9e, 0x60, 0x7, 0x60, 0x6, 0xeb, 0x50, + 0x2e, 0x8e, 0xdd, 0xde, 0xdd, 0xdd, 0xe9, 0xc2, + 0x0, 0xf, 0x10, 0x8, 0x70, 0x0, 0xd3, 0x0, + 0x0, 0xf, 0xcc, 0xce, 0xec, 0xcc, 0xf3, 0x0, + 0x0, 0xf, 0x10, 0x8, 0x80, 0x0, 0xe3, 0x0, + 0x0, 0xf, 0x10, 0x8, 0x70, 0x0, 0xd3, 0x0, + 0x0, 0xf, 0xdd, 0xdd, 0xdd, 0xdd, 0xe3, 0x0, + + /* U+756B "畫" */ + 0x0, 0x4b, 0xbb, 0xbe, 0xdb, 0xbb, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0xb5, 0x0, + 0x1b, 0xbb, 0xbb, 0xbe, 0xdb, 0xbb, 0xed, 0xb1, + 0x0, 0x13, 0x33, 0x3a, 0x93, 0x33, 0xc5, 0x0, + 0x0, 0x36, 0x66, 0x6c, 0xb6, 0x66, 0x62, 0x0, + 0x0, 0xab, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0x0, + 0x1, 0x11, 0x11, 0x1a, 0x81, 0x11, 0x11, 0x10, + 0x19, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x91, + 0x0, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa4, 0x0, + 0x0, 0x5b, 0x22, 0x2a, 0x82, 0x22, 0xb6, 0x0, + 0x0, 0x5d, 0x77, 0x7c, 0xb7, 0x77, 0xd6, 0x0, + 0x0, 0x5e, 0xaa, 0xad, 0xca, 0xaa, 0xe6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, + + /* U+7570 "異" */ + 0x0, 0x8e, 0xdd, 0xdf, 0xed, 0xdd, 0xe9, 0x0, + 0x0, 0x87, 0x0, 0x9, 0x70, 0x0, 0x79, 0x0, + 0x0, 0x88, 0x22, 0x2a, 0x92, 0x22, 0x89, 0x0, + 0x0, 0x8d, 0xaa, 0xad, 0xda, 0xaa, 0xc9, 0x0, + 0x0, 0x87, 0x0, 0x9, 0x70, 0x0, 0x79, 0x0, + 0x0, 0x7d, 0xef, 0xdd, 0xdd, 0xfe, 0xd8, 0x0, + 0x0, 0x0, 0x3d, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0x1, 0xcc, 0xdf, 0xcc, 0xcc, 0xfd, 0xcc, 0x20, + 0x0, 0x22, 0x6d, 0x22, 0x22, 0xd6, 0x22, 0x0, + 0x0, 0x0, 0x3d, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0x1d, 0xdd, 0xef, 0xdd, 0xdd, 0xfe, 0xdd, 0xd2, + 0x1, 0x11, 0x18, 0x41, 0x13, 0x93, 0x11, 0x10, + 0x0, 0x39, 0xe9, 0x20, 0x1, 0x7d, 0xc6, 0x0, + 0xa, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x4b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7576 "當" */ + 0x2, 0xb1, 0x0, 0xf1, 0x0, 0x3c, 0x10, 0x0, + 0x7b, 0x0, 0xf1, 0x1, 0xe4, 0x0, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0xd2, 0x1d, 0xdd, 0xdd, + 0xdd, 0xd0, 0x4c, 0x40, 0x1e, 0x0, 0x0, 0x0, + 0xf0, 0x13, 0x0, 0x1f, 0x66, 0x66, 0x66, 0xf0, + 0x0, 0x0, 0x6, 0x66, 0x66, 0x66, 0x60, 0x0, + 0x8, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x90, 0xb, + 0x82, 0x22, 0xe4, 0x22, 0x27, 0xd0, 0xb, 0x60, + 0x0, 0xe2, 0x0, 0x6, 0xd0, 0xb, 0xdc, 0xcc, + 0xfc, 0xcc, 0xcd, 0xd0, 0xb, 0x60, 0x0, 0xe1, + 0x0, 0x6, 0xd0, 0xb, 0xed, 0xdd, 0xfd, 0xdd, + 0xde, 0xc0, + + /* U+75B2 "疲" */ + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x5, 0xf, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, + 0xe, 0x1f, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0x9, 0x6f, 0x3, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x5, 0x7f, 0x3, 0xb0, 0xb, 0x40, 0xc, 0x40, + 0x0, 0xf, 0x4, 0xb0, 0xb, 0x40, 0x8, 0x0, + 0x0, 0x5e, 0x4, 0xfe, 0xef, 0xee, 0xe7, 0x0, + 0x2c, 0xcd, 0x5, 0xa8, 0x60, 0x0, 0xd2, 0x0, + 0x24, 0x5b, 0x7, 0x71, 0xd0, 0x8, 0xa0, 0x0, + 0x0, 0x98, 0xb, 0x40, 0x7a, 0x6d, 0x10, 0x0, + 0x0, 0xd2, 0x1f, 0x0, 0xe, 0xf3, 0x0, 0x0, + 0x6, 0xc0, 0xa9, 0x5, 0xda, 0x7e, 0x93, 0x0, + 0xc, 0x22, 0xd0, 0xcb, 0x40, 0x1, 0x7c, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+75C5 "病" */ + 0x0, 0x0, 0x0, 0x0, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xcc, 0xcc, 0xef, 0xcc, 0xcc, 0xc4, + 0x2, 0xe, 0x42, 0x22, 0x22, 0x22, 0x22, 0x21, + 0x1d, 0xe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x5e, 0x5e, 0xee, 0xef, 0xee, 0xee, 0xe3, + 0x5, 0xae, 0x10, 0x0, 0xd, 0x10, 0x0, 0x0, + 0x0, 0xe, 0x13, 0x33, 0x3e, 0x53, 0x33, 0x20, + 0x0, 0xe, 0xe, 0xcb, 0xbf, 0xcb, 0xbc, 0xb0, + 0x6, 0xdf, 0xe, 0x10, 0x1f, 0x10, 0x4, 0xb0, + 0x69, 0x5c, 0xe, 0x10, 0x8b, 0xd3, 0x4, 0xb0, + 0x0, 0x78, 0xe, 0x17, 0xd0, 0x2d, 0x54, 0xb0, + 0x0, 0xd2, 0xe, 0x69, 0x0, 0x1, 0x94, 0xb0, + 0x7, 0xa0, 0xe, 0x10, 0x0, 0x0, 0x5, 0xb0, + 0xb, 0x10, 0xe, 0x10, 0x0, 0x7, 0xee, 0x60, + + /* U+75DB "痛" */ + 0x0, 0x0, 0x0, 0x1, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xdd, 0xdd, 0xef, 0xdd, 0xdd, 0xd2, + 0x3, 0xf, 0x21, 0x11, 0x11, 0x11, 0x11, 0x10, + 0x1e, 0xf, 0x7, 0xcc, 0xcc, 0xcd, 0xf7, 0x0, + 0xa, 0x6f, 0x0, 0x18, 0x30, 0x6d, 0x70, 0x0, + 0x4, 0x6f, 0x0, 0x4, 0xae, 0xe2, 0x0, 0x0, + 0x0, 0xf, 0xc, 0xdd, 0xde, 0xff, 0xdd, 0x30, + 0x0, 0x6f, 0xe, 0x10, 0xe, 0x10, 0xc, 0x30, + 0x4e, 0xad, 0xe, 0xcb, 0xbf, 0xcb, 0xbf, 0x30, + 0x33, 0x5b, 0xe, 0x21, 0x1e, 0x21, 0x1c, 0x30, + 0x0, 0x97, 0xe, 0x10, 0xe, 0x10, 0xc, 0x30, + 0x0, 0xe1, 0xe, 0xcc, 0xcf, 0xcc, 0xcf, 0x30, + 0x8, 0xa0, 0xe, 0x10, 0xe, 0x10, 0xc, 0x30, + 0xa, 0x10, 0xe, 0x10, 0xc, 0x16, 0xcd, 0x10, + + /* U+767A "発" */ + 0x0, 0x0, 0x0, 0x0, 0x71, 0x1, 0x40, 0x0, + 0x3, 0xff, 0xff, 0xf2, 0x88, 0x1d, 0x60, 0x0, + 0x0, 0x30, 0x7, 0xb0, 0x1e, 0xd4, 0x4, 0x40, + 0x1, 0xd7, 0x2f, 0x20, 0x7, 0xc0, 0x5d, 0x20, + 0x0, 0x1c, 0xf6, 0x0, 0x0, 0xac, 0xc1, 0x0, + 0x0, 0x3e, 0x70, 0x0, 0x0, 0xc, 0xb1, 0x0, + 0x18, 0xed, 0xee, 0xee, 0xee, 0xee, 0xce, 0x60, + 0x7a, 0x11, 0x1e, 0x51, 0x1d, 0x51, 0x5, 0xc1, + 0x0, 0x0, 0xd, 0x30, 0xd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x40, 0xd, 0x40, 0x0, 0x0, + 0x9, 0xee, 0xef, 0xfe, 0xef, 0xfe, 0xee, 0x20, + 0x0, 0x0, 0x2f, 0x0, 0xd, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc8, 0x0, 0xd, 0x40, 0x6, 0x40, + 0x0, 0x3d, 0xb0, 0x0, 0xd, 0x50, 0xa, 0x60, + 0x9, 0xd6, 0x0, 0x0, 0x8, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+767C "發" */ + 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x51, 0x0, + 0x0, 0x7e, 0xee, 0xf5, 0x6a, 0x9, 0xb1, 0x0, + 0x0, 0x73, 0x4, 0xc0, 0xb, 0xe7, 0x1, 0xc1, + 0x0, 0x3e, 0x8e, 0x30, 0x1, 0xba, 0x4d, 0x40, + 0x0, 0x8, 0xe2, 0x0, 0x0, 0x8, 0xf7, 0x0, + 0x6, 0xdf, 0xdc, 0xa0, 0xad, 0xdd, 0xdc, 0xe6, + 0x8, 0x21, 0x13, 0xd0, 0xd2, 0x2, 0xc0, 0x32, + 0x0, 0x1, 0x13, 0xd0, 0xe0, 0x1, 0xd0, 0x0, + 0x0, 0x7d, 0xcc, 0xab, 0x90, 0x0, 0xcc, 0xc1, + 0x0, 0x94, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc3, 0x0, 0x7, 0xee, 0xee, 0xee, 0x0, + 0x0, 0xbc, 0xcd, 0xc3, 0x81, 0x0, 0xa7, 0x0, + 0x0, 0x0, 0x4, 0xa0, 0x4c, 0x8a, 0xa0, 0x0, + 0x0, 0x0, 0x8, 0x80, 0x39, 0xed, 0x91, 0x0, + 0x0, 0x4e, 0xed, 0x2c, 0xc7, 0x0, 0x6d, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+767D "白" */ + 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7c, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd5, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xd4, 0x11, 0x11, 0x11, 0x11, 0xe3, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0xd3, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xd3, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xd4, 0x11, + 0x11, 0x11, 0x11, 0xe3, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0xd3, 0x0, 0x0, 0x0, 0x0, 0xd3, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0xe3, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xd4, 0x0, 0x0, 0x0, + 0x0, 0xd3, + + /* U+767E "百" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xf0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x1, 0xf0, 0x0, 0x0, 0x0, + 0xc, 0x50, 0x1, 0xf0, 0x0, 0x0, 0x0, 0xc, + 0x50, 0x1, 0xf0, 0x0, 0x0, 0x0, 0xc, 0x50, + 0x1, 0xfe, 0xee, 0xee, 0xee, 0xef, 0x50, 0x1, + 0xf0, 0x0, 0x0, 0x0, 0xc, 0x50, 0x1, 0xf0, + 0x0, 0x0, 0x0, 0xc, 0x50, 0x1, 0xf0, 0x0, + 0x0, 0x0, 0xc, 0x50, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x1, 0xf0, 0x0, 0x0, 0x0, + 0xc, 0x50, + + /* U+7684 "的" */ + 0x0, 0x26, 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, + 0x8a, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xc4, + 0x0, 0x2, 0xe0, 0x0, 0x0, 0xcf, 0xff, 0xfd, + 0x7, 0xff, 0xff, 0xf5, 0xc3, 0x0, 0x1e, 0xe, + 0x30, 0x0, 0xa5, 0xc3, 0x0, 0x1e, 0x6c, 0x0, + 0x0, 0xb4, 0xc3, 0x0, 0x1e, 0xa4, 0x0, 0x0, + 0xb4, 0xc5, 0x22, 0x3e, 0x1, 0xe1, 0x0, 0xc3, + 0xcd, 0xcc, 0xde, 0x0, 0x8b, 0x0, 0xd2, 0xc3, + 0x0, 0x1e, 0x0, 0xd, 0x40, 0xe1, 0xc3, 0x0, + 0x1e, 0x0, 0x4, 0xb0, 0xf0, 0xc3, 0x0, 0x1e, + 0x0, 0x0, 0x0, 0xf0, 0xc5, 0x22, 0x4e, 0x0, + 0x0, 0x2, 0xd0, 0xcd, 0xcc, 0xcb, 0x0, 0x0, + 0x7, 0xa0, 0xc3, 0x0, 0x0, 0x0, 0x4e, 0xef, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, + + /* U+7686 "皆" */ + 0x3e, 0x0, 0x0, 0x1e, 0x0, 0x2, 0x0, 0x3f, + 0xbb, 0xb8, 0x1e, 0x27, 0xcb, 0x10, 0x3f, 0x33, + 0x32, 0x1f, 0xb7, 0x10, 0x0, 0x3e, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x40, 0x4e, 0x36, 0xac, 0x1f, + 0x0, 0x0, 0xe1, 0xbf, 0xc8, 0x54, 0x1d, 0xed, + 0xde, 0xb0, 0x20, 0x0, 0xf, 0x30, 0x1, 0x11, + 0x0, 0x9, 0xbb, 0xcf, 0xbb, 0xbb, 0xb2, 0x0, + 0xd, 0x53, 0x33, 0x33, 0x33, 0xf3, 0x0, 0xd, + 0x20, 0x0, 0x0, 0x0, 0xe3, 0x0, 0xd, 0xed, + 0xdd, 0xdd, 0xdd, 0xf3, 0x0, 0xd, 0x20, 0x0, + 0x0, 0x0, 0xe3, 0x0, 0xd, 0x30, 0x0, 0x0, + 0x0, 0xe3, 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, + 0xf3, 0x0, + + /* U+76BF "皿" */ + 0x0, 0x7e, 0xee, 0xee, 0xee, 0xee, 0xee, 0x10, + 0x0, 0x7a, 0x22, 0xf2, 0x29, 0x92, 0x2f, 0x10, + 0x0, 0x78, 0x0, 0xf0, 0x8, 0x70, 0xf, 0x10, + 0x0, 0x78, 0x0, 0xf0, 0x8, 0x70, 0xf, 0x10, + 0x0, 0x78, 0x0, 0xf0, 0x8, 0x70, 0xf, 0x10, + 0x0, 0x78, 0x0, 0xf0, 0x8, 0x70, 0xf, 0x10, + 0x0, 0x78, 0x0, 0xf0, 0x8, 0x70, 0xf, 0x10, + 0x0, 0x78, 0x0, 0xf0, 0x8, 0x70, 0xf, 0x10, + 0x0, 0x78, 0x0, 0xf0, 0x8, 0x70, 0xf, 0x10, + 0x0, 0x78, 0x0, 0xf0, 0x8, 0x70, 0xf, 0x10, + 0x0, 0x78, 0x0, 0xf0, 0x8, 0x70, 0xf, 0x10, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + + /* U+76D7 "盗" */ + 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, 0x0, + 0x5, 0xd6, 0x0, 0xd, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3c, 0xb0, 0x5f, 0xee, 0xee, 0xee, 0xd0, + 0x0, 0x0, 0x11, 0xe4, 0x6, 0xb0, 0x6, 0xb0, + 0x0, 0x0, 0x9, 0x80, 0xa, 0xd0, 0xc, 0x50, + 0x0, 0x0, 0x42, 0x0, 0x1f, 0xd4, 0x6, 0x0, + 0x0, 0x9, 0xe2, 0x0, 0xaa, 0x3d, 0x0, 0x0, + 0x4, 0xea, 0x10, 0x1b, 0xd1, 0x8, 0xd3, 0x0, + 0xd, 0x50, 0x1b, 0xf9, 0x0, 0x0, 0x6e, 0xd2, + 0x0, 0x3, 0x3a, 0x53, 0x33, 0x33, 0x32, 0x40, + 0x0, 0x2f, 0xaa, 0xfb, 0xae, 0xca, 0xca, 0x0, + 0x0, 0x2c, 0x0, 0xe0, 0xa, 0x40, 0x6a, 0x0, + 0x0, 0x2c, 0x0, 0xe0, 0xa, 0x40, 0x6a, 0x0, + 0x0, 0x2c, 0x0, 0xe0, 0xa, 0x40, 0x6a, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + + /* U+76EE "目" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3d, 0x0, + 0x0, 0x0, 0x0, 0xc5, 0x3d, 0x0, 0x0, 0x0, + 0x0, 0xc5, 0x3d, 0x0, 0x0, 0x0, 0x0, 0xc5, + 0x3f, 0xdd, 0xdd, 0xdd, 0xdd, 0xf5, 0x3e, 0x33, + 0x33, 0x33, 0x33, 0xd5, 0x3d, 0x0, 0x0, 0x0, + 0x0, 0xc5, 0x3d, 0x0, 0x0, 0x0, 0x0, 0xc5, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3d, 0x0, + 0x0, 0x0, 0x0, 0xc5, 0x3d, 0x0, 0x0, 0x0, + 0x0, 0xc5, 0x3d, 0x0, 0x0, 0x0, 0x0, 0xc5, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x3d, 0x0, + 0x0, 0x0, 0x0, 0xc5, + + /* U+76F4 "直" */ + 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xdd, 0xdf, 0xdd, 0xdd, 0xd3, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0xb, 0xdc, 0xcc, 0xcc, 0xcc, 0xf3, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0xb, 0xed, 0xdd, 0xdd, 0xdd, 0xf3, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0xb, 0xed, 0xdd, 0xdd, 0xdd, 0xf3, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x2, 0x2c, 0x62, 0x22, 0x22, 0x22, 0xe5, 0x21, + 0x1d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, + + /* U+76F8 "相" */ + 0x0, 0x7, 0x80, 0x5, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x78, 0x0, 0x5b, 0x0, 0x0, 0x2e, 0x4, + 0x49, 0xb4, 0x45, 0xb0, 0x0, 0x2, 0xe1, 0xcc, + 0xee, 0xcb, 0x5b, 0x0, 0x0, 0x2e, 0x0, 0xd, + 0x80, 0x5, 0xfd, 0xdd, 0xdd, 0xe0, 0x3, 0xfb, + 0x0, 0x5b, 0x22, 0x22, 0x4e, 0x0, 0x8d, 0xf9, + 0x5, 0xb0, 0x0, 0x2, 0xe0, 0xd, 0x79, 0xb7, + 0x5b, 0x0, 0x0, 0x2e, 0x7, 0x97, 0x81, 0x95, + 0xfe, 0xee, 0xee, 0xe1, 0xe1, 0x78, 0x0, 0x5b, + 0x0, 0x0, 0x2e, 0x38, 0x7, 0x80, 0x5, 0xb0, + 0x0, 0x2, 0xe0, 0x0, 0x78, 0x0, 0x5b, 0x0, + 0x0, 0x2e, 0x0, 0x7, 0x80, 0x5, 0xfe, 0xee, + 0xef, 0xe0, 0x0, 0x78, 0x0, 0x5b, 0x0, 0x0, + 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+770B "看" */ + 0x0, 0x0, 0x0, 0x1, 0x13, 0x46, 0x96, 0x0, + 0x0, 0xdd, 0xee, 0xef, 0xba, 0x97, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x99, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xac, 0xcc, 0xfd, 0xcc, 0xcc, 0xcc, 0x10, + 0x0, 0x11, 0x15, 0xe1, 0x11, 0x11, 0x11, 0x0, + 0x2, 0x22, 0x29, 0xb2, 0x22, 0x22, 0x22, 0x20, + 0xb, 0xbb, 0xcf, 0xbb, 0xbb, 0xbb, 0xbb, 0xb0, + 0x0, 0x0, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xfd, 0xcc, 0xcc, 0xcc, 0xe7, 0x0, + 0x0, 0x7d, 0xe3, 0x0, 0x0, 0x0, 0x97, 0x0, + 0x1b, 0xc1, 0xdc, 0xbb, 0xbb, 0xbb, 0xe7, 0x0, + 0x19, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x97, 0x0, + 0x0, 0x0, 0xdc, 0xbb, 0xbb, 0xbb, 0xe7, 0x0, + 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x97, 0x0, + 0x0, 0x0, 0xde, 0xdd, 0xdd, 0xdd, 0xf7, 0x0, + + /* U+771F "真" */ + 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x9, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xa0, + 0x0, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xdc, 0xcc, 0xcc, 0xcd, 0xc0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x0, 0x3, 0xc0, 0x0, + 0x0, 0xc, 0xcb, 0xbb, 0xbb, 0xbc, 0xc0, 0x0, + 0x0, 0xc, 0x85, 0x55, 0x55, 0x58, 0xc0, 0x0, + 0x0, 0xc, 0x85, 0x55, 0x55, 0x57, 0xc0, 0x0, + 0x0, 0xc, 0xcb, 0xbb, 0xbb, 0xbc, 0xc0, 0x0, + 0x0, 0xc, 0x40, 0x0, 0x0, 0x3, 0xc0, 0x0, + 0x1e, 0xef, 0xee, 0xee, 0xee, 0xee, 0xfe, 0xe1, + 0x0, 0x0, 0x17, 0x10, 0x1, 0x82, 0x0, 0x0, + 0x0, 0x39, 0xe8, 0x10, 0x0, 0x6c, 0xd6, 0x0, + 0xb, 0xc6, 0x10, 0x0, 0x0, 0x0, 0x3b, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7720 "眠" */ + 0xef, 0xff, 0x21, 0xff, 0xff, 0xff, 0xf2, 0xe, + 0x10, 0xd2, 0x1e, 0x0, 0x0, 0xe, 0x20, 0xe1, + 0xd, 0x21, 0xe0, 0x0, 0x0, 0xe2, 0xe, 0x10, + 0xd2, 0x1e, 0x44, 0x44, 0x4e, 0x20, 0xef, 0xff, + 0x21, 0xfc, 0xcf, 0xdc, 0xc2, 0xe, 0x10, 0xd2, + 0x1e, 0x0, 0xb4, 0x0, 0x0, 0xe1, 0xd, 0x21, + 0xe0, 0x9, 0x50, 0x0, 0xe, 0xff, 0xf2, 0x1f, + 0xff, 0xff, 0xff, 0xf5, 0xe1, 0xd, 0x21, 0xe0, + 0x3, 0x90, 0x0, 0xe, 0x10, 0xd2, 0x1e, 0x0, + 0xb, 0x0, 0x0, 0xe3, 0x2e, 0x21, 0xe0, 0x0, + 0xc0, 0x0, 0xe, 0xdc, 0xc1, 0x1e, 0x0, 0x7, + 0x50, 0xa5, 0x50, 0x0, 0x5, 0xfc, 0xd9, 0x1c, + 0x3e, 0x60, 0x0, 0x0, 0xeb, 0x50, 0x0, 0x3d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+773E "眾" */ + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x1, 0xe0, 0x1, 0xe0, 0x3, 0xb0, 0xc, 0x40, + 0x1, 0xe0, 0x1, 0xe0, 0x3, 0xb0, 0xc, 0x40, + 0x1, 0xfc, 0xcc, 0xfc, 0xcd, 0xfc, 0xcf, 0x40, + 0x0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x35, 0x78, 0x10, + 0x2, 0xef, 0xff, 0xfe, 0xfb, 0xa9, 0x74, 0x10, + 0x0, 0x0, 0x42, 0x1, 0xf0, 0x0, 0x80, 0x0, + 0x0, 0x0, 0xf2, 0x1, 0xf0, 0x4, 0xa0, 0x0, + 0x0, 0x7, 0xf2, 0x1, 0xf0, 0xa, 0xa0, 0x0, + 0x0, 0x2e, 0x6d, 0x51, 0xf0, 0x3d, 0xb5, 0x0, + 0x3, 0xd6, 0x1, 0xc3, 0xf2, 0xd4, 0x1d, 0x70, + 0x1d, 0x40, 0x0, 0x1, 0xfa, 0x50, 0x1, 0xa0, + 0x0, 0x0, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, + + /* U+7740 "着" */ + 0x0, 0x0, 0x72, 0x0, 0x0, 0x28, 0x0, 0x0, + 0x0, 0x6, 0xd0, 0x0, 0xb, 0x80, 0x0, 0x2, + 0xcc, 0xcf, 0xcc, 0xcc, 0xfc, 0xcc, 0x20, 0x1, + 0x11, 0x16, 0xd1, 0x11, 0x11, 0x10, 0x0, 0x5a, + 0xaa, 0xdd, 0xaa, 0xaa, 0xa5, 0x0, 0x1, 0x22, + 0x5e, 0x22, 0x22, 0x22, 0x10, 0x9, 0xaa, 0xad, + 0xea, 0xaa, 0xaa, 0xaa, 0x90, 0x33, 0x39, 0xd3, + 0x33, 0x33, 0x33, 0x33, 0x0, 0x2, 0xfd, 0xaa, + 0xaa, 0xaa, 0xa4, 0x0, 0x0, 0xdf, 0x72, 0x22, + 0x22, 0x2c, 0x60, 0x2, 0xd9, 0xad, 0xbb, 0xbb, + 0xbb, 0xe6, 0x2, 0xe8, 0xa, 0x50, 0x0, 0x0, + 0xb, 0x60, 0x5, 0x0, 0xad, 0xbb, 0xbb, 0xbb, + 0xe6, 0x0, 0x0, 0xa, 0x50, 0x0, 0x0, 0xb, + 0x60, 0x0, 0x0, 0xae, 0xdd, 0xdd, 0xdd, 0xe6, + 0x0, + + /* U+77E5 "知" */ + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xf2, 0x0, 0x0, 0x5d, 0xdd, 0xdd, 0x20, 0x6f, + 0xff, 0xff, 0x96, 0xa2, 0x22, 0xe2, 0xd, 0x40, + 0xf0, 0x0, 0x69, 0x0, 0xe, 0x26, 0xc0, 0xf, + 0x0, 0x6, 0x90, 0x0, 0xe2, 0x1, 0x1, 0xf0, + 0x0, 0x69, 0x0, 0xe, 0x26, 0xff, 0xff, 0xff, + 0xf7, 0x90, 0x0, 0xe2, 0x0, 0x4, 0xd0, 0x0, + 0x69, 0x0, 0xe, 0x20, 0x0, 0x5e, 0x20, 0x6, + 0x90, 0x0, 0xe2, 0x0, 0xa, 0xae, 0x20, 0x69, + 0x0, 0xe, 0x20, 0x1, 0xe0, 0x6e, 0x16, 0x90, + 0x0, 0xe2, 0x0, 0xa8, 0x0, 0x8c, 0x6e, 0xbb, + 0xbf, 0x20, 0x8e, 0x10, 0x0, 0x36, 0xb4, 0x44, + 0xf2, 0x5e, 0x30, 0x0, 0x0, 0x69, 0x0, 0xc, + 0x20, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+77ED "短" */ + 0x0, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0xb, 0xff, 0xff, 0xff, 0xf8, + 0x1, 0xf7, 0x77, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xec, 0xea, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x65, 0xa0, 0x2, 0xee, 0xee, 0xee, 0xd0, + 0xe, 0x5, 0xa0, 0x2, 0xe0, 0x0, 0x2, 0xe0, + 0x2, 0x6, 0xb0, 0x2, 0xd0, 0x0, 0x2, 0xe0, + 0x1e, 0xef, 0xfe, 0xd2, 0xd0, 0x0, 0x2, 0xe0, + 0x0, 0x7, 0x80, 0x2, 0xfe, 0xee, 0xef, 0xe0, + 0x0, 0x9, 0xa0, 0x0, 0x11, 0x0, 0x3, 0x10, + 0x0, 0xd, 0xd5, 0x0, 0x78, 0x0, 0xe, 0x40, + 0x0, 0x3d, 0x2e, 0x10, 0x1e, 0x0, 0x3e, 0x0, + 0x0, 0xb6, 0x8, 0x90, 0xd, 0x30, 0x97, 0x0, + 0x6, 0xd0, 0x0, 0x20, 0x5, 0x30, 0xe1, 0x0, + 0xd, 0x20, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+77F3 "石" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x5, 0xef, 0x11, + 0x11, 0x11, 0x13, 0xf0, 0x4, 0xe3, 0xf0, 0x0, + 0x0, 0x0, 0x2f, 0x4, 0xe3, 0xf, 0x0, 0x0, + 0x0, 0x2, 0xf0, 0x3, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, + 0x2, 0xf0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xf, 0x11, 0x11, 0x11, 0x13, + 0xf0, + + /* U+7802 "砂" */ + 0x1f, 0xff, 0xff, 0xb0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0xe1, 0x11, 0x0, + 0x0, 0x5a, 0x0, 0x2, 0xc0, 0xe1, 0x79, 0x0, + 0x0, 0x96, 0x0, 0x5, 0x90, 0xe1, 0x1e, 0x10, + 0x0, 0xd2, 0x0, 0x7, 0x70, 0xe1, 0x9, 0x70, + 0x3, 0xfd, 0xdd, 0x3c, 0x30, 0xe1, 0x4, 0xd0, + 0xa, 0xf3, 0x2b, 0x5e, 0x0, 0xe1, 0x0, 0x70, + 0x3e, 0xe1, 0xb, 0x45, 0x0, 0xe1, 0x5, 0x10, + 0x55, 0xd1, 0xb, 0x40, 0x0, 0xe1, 0x3e, 0x0, + 0x0, 0xd1, 0xb, 0x40, 0x0, 0xd1, 0xc6, 0x0, + 0x0, 0xd1, 0xb, 0x40, 0x0, 0xb, 0xa0, 0x0, + 0x0, 0xde, 0xef, 0x40, 0x3, 0xcb, 0x0, 0x0, + 0x0, 0xd2, 0x0, 0x16, 0xbe, 0x50, 0x0, 0x0, + 0x0, 0x40, 0x0, 0xab, 0x50, 0x0, 0x0, 0x0, + + /* U+7814 "研" */ + 0x1f, 0xff, 0xff, 0x89, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x2d, 0x0, 0x0, 0x3d, 0x0, 0x3d, 0x0, + 0x0, 0x69, 0x0, 0x0, 0x3c, 0x0, 0x3c, 0x0, + 0x0, 0xa5, 0x0, 0x0, 0x3c, 0x0, 0x3c, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0x3c, 0x0, 0x3c, 0x0, + 0x4, 0xfd, 0xdd, 0x30, 0x3c, 0x0, 0x3c, 0x0, + 0xb, 0xf2, 0x2c, 0x4f, 0xff, 0xff, 0xff, 0xfa, + 0x3e, 0xe0, 0xb, 0x40, 0x5c, 0x0, 0x4d, 0x0, + 0x4, 0xe0, 0xb, 0x30, 0x6b, 0x0, 0x3c, 0x0, + 0x0, 0xe0, 0xb, 0x30, 0x88, 0x0, 0x3c, 0x0, + 0x0, 0xe0, 0xb, 0x30, 0xb5, 0x0, 0x3c, 0x0, + 0x0, 0xfe, 0xef, 0x31, 0xf1, 0x0, 0x3c, 0x0, + 0x0, 0xe0, 0x0, 0x9, 0x90, 0x0, 0x3c, 0x0, + 0x0, 0x40, 0x0, 0x1c, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7834 "破" */ + 0x2f, 0xff, 0xff, 0x20, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x4c, 0x0, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x88, 0x0, 0xe, 0xee, 0xfe, 0xee, 0xb0, + 0x0, 0xc4, 0x0, 0xe, 0x0, 0xd2, 0x7, 0x80, + 0x0, 0xf1, 0x0, 0xe, 0x0, 0xd1, 0xb, 0x30, + 0x6, 0xf7, 0x76, 0xe, 0x0, 0xd1, 0x5, 0x0, + 0xd, 0xe8, 0x9c, 0xf, 0xff, 0xff, 0xff, 0x10, + 0x5f, 0xd0, 0x2c, 0x1d, 0xd1, 0x0, 0x3c, 0x0, + 0x36, 0xd0, 0x2c, 0x2b, 0x68, 0x0, 0xa5, 0x0, + 0x1, 0xd0, 0x2c, 0x4a, 0xd, 0x35, 0xc0, 0x0, + 0x1, 0xd0, 0x2c, 0x77, 0x2, 0xee, 0x10, 0x0, + 0x1, 0xfe, 0xec, 0xc3, 0x5, 0xee, 0x50, 0x0, + 0x1, 0xd0, 0x3, 0xd3, 0xad, 0x23, 0xdb, 0x50, + 0x0, 0x0, 0x3, 0x46, 0x60, 0x0, 0x5, 0x80, + + /* U+78BA "確" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x0, 0x0, + 0x17, 0x77, 0x77, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x18, 0xae, 0x88, 0x7e, 0xef, 0xfe, 0xee, 0xd0, + 0x0, 0x6a, 0x0, 0x79, 0xb, 0x62, 0x1, 0xe0, + 0x0, 0xa6, 0x0, 0x57, 0x6e, 0x3d, 0x0, 0xa0, + 0x0, 0xd3, 0x0, 0x2, 0xe9, 0x2e, 0x52, 0x10, + 0x1, 0xf7, 0x65, 0x2e, 0xfc, 0xcf, 0xdc, 0xa0, + 0x7, 0xf5, 0x7d, 0xec, 0xe0, 0xe, 0x10, 0x0, + 0xe, 0xf0, 0x2c, 0x12, 0xfd, 0xdf, 0xdd, 0xa0, + 0x6a, 0xe0, 0x2c, 0x2, 0xe0, 0xe, 0x10, 0x0, + 0x1, 0xe0, 0x2c, 0x2, 0xe0, 0xe, 0x10, 0x0, + 0x0, 0xe0, 0x2c, 0x2, 0xfd, 0xdf, 0xed, 0xb0, + 0x0, 0xfc, 0xcc, 0x2, 0xe0, 0xe, 0x10, 0x0, + 0x0, 0xf4, 0x43, 0x2, 0xe2, 0x2e, 0x42, 0x21, + 0x0, 0x90, 0x0, 0x2, 0xfb, 0xbb, 0xbb, 0xb5, + + /* U+793A "示" */ + 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x40, 0x8, 0x90, 0x4, 0x0, 0x0, + 0x0, 0xb, 0x80, 0x8, 0x90, 0x9, 0xa0, 0x0, + 0x0, 0x4e, 0x0, 0x8, 0x90, 0x0, 0xd6, 0x0, + 0x2, 0xe5, 0x0, 0x8, 0x90, 0x0, 0x3f, 0x10, + 0x1d, 0x80, 0x0, 0x8, 0x90, 0x0, 0xb, 0x80, + 0x6, 0x0, 0x1, 0x1a, 0x90, 0x0, 0x2, 0x40, + 0x0, 0x0, 0x3f, 0xfe, 0x40, 0x0, 0x0, 0x0, + + /* U+793C "礼" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x9, 0xdd, 0xed, 0xd0, 0xe, 0x20, 0x0, 0x0, + 0x1, 0x11, 0x18, 0xa0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0x20, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x0, 0xc7, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0xa, 0xf8, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0xbc, 0xfc, 0x70, 0xe, 0x20, 0x0, 0x0, + 0x1d, 0x91, 0xe1, 0xe6, 0xe, 0x20, 0x0, 0x0, + 0x6, 0x1, 0xe0, 0x33, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0xe, 0x20, 0x0, 0xa2, + 0x0, 0x1, 0xe0, 0x0, 0xe, 0x20, 0x0, 0xc3, + 0x0, 0x1, 0xe0, 0x0, 0xe, 0x40, 0x0, 0xe1, + 0x0, 0x1, 0xe0, 0x0, 0x8, 0xff, 0xff, 0x90, + + /* U+793E "社" */ + 0x0, 0x3a, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0x7, 0x70, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x1d, 0xde, 0xdd, 0x20, 0x0, 0xb5, 0x0, 0x0, + 0x1, 0x11, 0x4e, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0xb7, 0x2, 0x22, 0xc6, 0x22, 0x10, + 0x0, 0x6, 0xd0, 0x4e, 0xee, 0xfe, 0xee, 0xb0, + 0x0, 0x3f, 0x80, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x3, 0xff, 0xd7, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x4f, 0x5e, 0x3d, 0x50, 0x0, 0xb5, 0x0, 0x0, + 0x24, 0xe, 0x12, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x33, 0x33, 0xc7, 0x33, 0x30, + 0x0, 0xe, 0x11, 0xdd, 0xdd, 0xdd, 0xdd, 0xd2, + + /* U+7956 "祖" */ + 0x0, 0x48, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x50, 0xd, 0xff, 0xff, 0xfb, 0x0, + 0x1, 0x15, 0x71, 0xd, 0x20, 0x0, 0x5b, 0x0, + 0x4f, 0xff, 0xff, 0x1d, 0x20, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0x5b, 0xd, 0x20, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0xd3, 0xd, 0xdc, 0xcc, 0xdb, 0x0, + 0x0, 0x9, 0x90, 0xd, 0x53, 0x33, 0x7b, 0x0, + 0x0, 0x6f, 0xa0, 0xd, 0x20, 0x0, 0x5b, 0x0, + 0x6, 0xff, 0xc8, 0xd, 0x20, 0x0, 0x5b, 0x0, + 0x7e, 0x3e, 0x3e, 0x3d, 0x64, 0x44, 0x8b, 0x0, + 0x32, 0xe, 0x13, 0xd, 0xcb, 0xbb, 0xdb, 0x0, + 0x0, 0xe, 0x10, 0xd, 0x20, 0x0, 0x5b, 0x0, + 0x0, 0xe, 0x10, 0xd, 0x20, 0x0, 0x5b, 0x0, + 0x0, 0xe, 0x10, 0xe, 0x30, 0x0, 0x6b, 0x0, + 0x0, 0xe, 0x1c, 0xee, 0xee, 0xee, 0xee, 0xe1, + + /* U+795D "祝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x60, 0x1f, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x5, 0x40, 0x1e, 0x0, 0x0, 0xe, 0x20, + 0x1d, 0xdd, 0xdd, 0x3e, 0x0, 0x0, 0xe, 0x20, + 0x1, 0x11, 0x8c, 0x2e, 0x0, 0x0, 0xe, 0x20, + 0x0, 0x1, 0xe4, 0x1e, 0x0, 0x0, 0xe, 0x20, + 0x0, 0xa, 0xa0, 0x1e, 0x0, 0x0, 0xe, 0x20, + 0x0, 0x5f, 0x90, 0x1e, 0xff, 0xef, 0xfe, 0x20, + 0x5, 0xef, 0xca, 0x0, 0x87, 0xe, 0x10, 0x0, + 0x3e, 0x3e, 0x1b, 0x70, 0x95, 0xe, 0x10, 0x0, + 0x2, 0xe, 0x10, 0x0, 0xc3, 0xe, 0x10, 0x0, + 0x0, 0xe, 0x10, 0x1, 0xe0, 0xe, 0x10, 0x0, + 0x0, 0xe, 0x10, 0xa, 0x80, 0xe, 0x10, 0xc0, + 0x0, 0xe, 0x11, 0xad, 0x0, 0xe, 0x20, 0xe0, + 0x0, 0xe, 0x1b, 0xa1, 0x0, 0xa, 0xee, 0xa0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+795E "神" */ + 0x0, 0x2c, 0x10, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x69, 0x0, 0x0, 0xe, 0x20, 0x0, 0x2d, + 0xde, 0xed, 0x3f, 0xee, 0xfe, 0xee, 0xe0, 0x11, + 0x15, 0xd1, 0xe0, 0xe, 0x10, 0x1e, 0x0, 0x0, + 0xd5, 0x1e, 0x0, 0xe1, 0x1, 0xe0, 0x0, 0x8a, + 0x1, 0xfb, 0xbf, 0xcb, 0xce, 0x0, 0x4f, 0xb0, + 0x1f, 0x33, 0xf5, 0x34, 0xe0, 0x4e, 0xfa, 0xa1, + 0xe0, 0xe, 0x10, 0x1e, 0x4e, 0x3e, 0x1c, 0x6e, + 0x0, 0xe2, 0x2, 0xe1, 0x30, 0xe1, 0x11, 0xfe, + 0xef, 0xee, 0xee, 0x0, 0xe, 0x10, 0x8, 0x0, + 0xe1, 0x0, 0x60, 0x0, 0xe1, 0x0, 0x0, 0xe, + 0x10, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, 0xe1, + 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+796D "祭" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xd1, 0x0, 0xc3, 0x11, 0x12, 0x0, + 0x0, 0x1e, 0xdd, 0xde, 0x7e, 0xcc, 0xdf, 0x30, + 0x0, 0xc8, 0x0, 0x97, 0x1e, 0x0, 0xa9, 0x0, + 0xc, 0x92, 0xd8, 0xe1, 0xa, 0x86, 0xd0, 0x0, + 0x3, 0x60, 0x1f, 0x50, 0x1, 0xdd, 0x10, 0x0, + 0x0, 0x5d, 0xc8, 0x0, 0x0, 0x4e, 0x40, 0x0, + 0x0, 0x6d, 0x7f, 0xff, 0xff, 0xf6, 0xe8, 0x10, + 0x2d, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x18, 0xe2, + 0x2, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x0, + 0x0, 0x12, 0x22, 0x29, 0xa2, 0x22, 0x22, 0x0, + 0x0, 0x2, 0xd5, 0x7, 0x90, 0x7b, 0x10, 0x0, + 0x0, 0x4e, 0x50, 0x7, 0x90, 0x8, 0xd2, 0x0, + 0x7, 0xe3, 0x0, 0x8, 0x90, 0x0, 0x6e, 0x30, + 0x1, 0x10, 0x6, 0xfe, 0x50, 0x0, 0x3, 0x0, + + /* U+7981 "禁" */ + 0x0, 0x0, 0xf0, 0x0, 0x0, 0x2d, 0x0, 0x0, + 0xb, 0xee, 0xfe, 0xe3, 0xee, 0xef, 0xee, 0xb0, + 0x0, 0xb, 0xf5, 0x0, 0x0, 0xdf, 0x80, 0x0, + 0x0, 0x5c, 0xfb, 0x90, 0x9, 0xae, 0xc4, 0x0, + 0x3, 0xe2, 0xf0, 0xb3, 0x8c, 0x2d, 0x2e, 0x30, + 0x2e, 0x40, 0xf0, 0x7, 0xc1, 0x2d, 0x4, 0xe1, + 0x3, 0x0, 0xa0, 0x1, 0x0, 0x19, 0x0, 0x20, + 0x0, 0x1e, 0xee, 0xee, 0xee, 0xee, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe0, + 0x0, 0x0, 0x40, 0x7, 0x90, 0x3, 0x0, 0x0, + 0x0, 0x1c, 0x80, 0x7, 0x90, 0x1b, 0xa1, 0x0, + 0x4, 0xd7, 0x0, 0x8, 0x90, 0x0, 0x7d, 0x20, + 0x8, 0x40, 0xc, 0xee, 0x50, 0x0, 0x5, 0x50, + + /* U+79C0 "秀" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x12, 0x35, 0x67, 0x9b, 0xdf, 0xc1, 0x0, + 0x0, 0xcb, 0xa9, 0x8c, 0xa4, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x8, 0xca, 0x9d, 0x80, 0x0, 0x0, + 0x0, 0x1, 0xcb, 0x19, 0x71, 0xbc, 0x20, 0x0, + 0x2, 0x9e, 0x70, 0x9, 0x70, 0x5, 0xdb, 0x40, + 0x3e, 0x8a, 0x99, 0x99, 0x99, 0x70, 0x5, 0xb1, + 0x0, 0x4, 0x4b, 0xa4, 0x4a, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x40, 0xd, 0xdc, 0xc9, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x2, 0x22, 0x8a, 0x0, + 0x0, 0x1, 0xd6, 0x0, 0x0, 0x0, 0x98, 0x0, + 0x0, 0x4e, 0x80, 0x0, 0x0, 0x0, 0xd4, 0x0, + 0x9, 0xd5, 0x0, 0x0, 0xc, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+79C1 "私" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x8d, 0xe1, 0x0, 0xc4, 0x0, 0x0, + 0xd, 0xcb, 0xe2, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x7, 0xa0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf8, 0xb, 0x60, 0x0, 0x0, + 0x0, 0x9, 0xf4, 0x0, 0xf, 0x30, 0x0, 0x0, + 0x0, 0x1e, 0xed, 0x20, 0x3e, 0x4, 0x80, 0x0, + 0x0, 0x98, 0xd3, 0xd1, 0x8a, 0x1, 0xf1, 0x0, + 0x3, 0xc2, 0xd0, 0x72, 0xd5, 0x0, 0xa8, 0x0, + 0x1d, 0x32, 0xd0, 0x2, 0xf0, 0x0, 0x3e, 0x0, + 0x57, 0x2, 0xd0, 0x8, 0xa0, 0x0, 0xd, 0x60, + 0x0, 0x2, 0xd0, 0x1e, 0xa8, 0xac, 0xfe, 0xc0, + 0x0, 0x2, 0xd0, 0x3e, 0xa8, 0x53, 0x1, 0xf1, + 0x0, 0x2, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x50, + + /* U+79CB "秋" */ + 0x0, 0x3, 0x7c, 0x70, 0x0, 0xc3, 0x0, 0x0, + 0xb, 0xcc, 0xc3, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0xb0, 0xc2, 0x6, 0x70, + 0x3f, 0xff, 0xff, 0xf5, 0xb0, 0xd1, 0xd, 0x40, + 0x0, 0xc, 0xd1, 0x7, 0x80, 0xf1, 0x3d, 0x0, + 0x0, 0x3f, 0xf9, 0xd, 0x21, 0xf4, 0xb5, 0x0, + 0x0, 0xba, 0xab, 0x54, 0x3, 0xf7, 0x40, 0x0, + 0x4, 0xc6, 0xa2, 0x30, 0x6, 0xbc, 0x0, 0x0, + 0x1d, 0x35, 0xa0, 0x0, 0xb, 0x3d, 0x20, 0x0, + 0x58, 0x5, 0xa0, 0x0, 0x3d, 0x6, 0xa0, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0xd5, 0x0, 0xd5, 0x0, + 0x0, 0x5, 0xa0, 0x1c, 0x90, 0x0, 0x2e, 0x60, + 0x0, 0x5, 0xa0, 0x97, 0x0, 0x0, 0x2, 0xb1, + + /* U+79CD "种" */ + 0x0, 0x2, 0x6b, 0x50, 0x0, 0x2e, 0x0, 0x0, + 0xb, 0xde, 0xc4, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x7, 0x90, 0xb, 0xff, 0xff, 0xff, 0xf1, + 0x1f, 0xff, 0xff, 0xab, 0x50, 0x2e, 0x0, 0xe1, + 0x0, 0xd, 0xb0, 0xb, 0x50, 0x2e, 0x0, 0xe1, + 0x0, 0x4f, 0xf7, 0xb, 0x50, 0x2e, 0x0, 0xe1, + 0x0, 0xba, 0x9c, 0x3b, 0x50, 0x2e, 0x0, 0xe1, + 0x3, 0xb7, 0x93, 0x8b, 0xff, 0xff, 0xff, 0xf1, + 0xd, 0x37, 0x90, 0xb, 0x50, 0x2e, 0x0, 0xd1, + 0x48, 0x7, 0x90, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x0, 0x2e, 0x0, 0x0, + + /* U+79D1 "科" */ + 0x0, 0x2, 0x6b, 0x40, 0x0, 0x0, 0xe2, 0x0, + 0xb, 0xde, 0xc4, 0x0, 0x97, 0x0, 0xe2, 0x0, + 0x0, 0x8, 0x80, 0x0, 0xa, 0xb0, 0xe2, 0x0, + 0x0, 0x8, 0x80, 0x0, 0x0, 0x60, 0xe2, 0x0, + 0x4f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0xe, 0xb0, 0x4, 0xd3, 0x0, 0xe2, 0x0, + 0x0, 0x5f, 0xe7, 0x0, 0x3e, 0x50, 0xe2, 0x0, + 0x0, 0xca, 0x8c, 0x40, 0x2, 0x60, 0xe2, 0x0, + 0x5, 0xa8, 0x83, 0x70, 0x0, 0x0, 0xe5, 0x50, + 0x1e, 0x28, 0x80, 0x3, 0x69, 0xbe, 0xfd, 0xa1, + 0x47, 0x8, 0x80, 0x2c, 0x97, 0x41, 0xe2, 0x0, + 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, 0xe2, 0x0, + + /* U+79D8 "秘" */ + 0x0, 0x0, 0x13, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x3, 0x7b, 0xf9, 0x0, 0x2d, 0x90, 0x5, 0x10, + 0x7, 0x7e, 0x30, 0x0, 0x0, 0xac, 0xe, 0x10, + 0x0, 0xd, 0x20, 0x0, 0x1, 0x5, 0x4b, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x1e, 0x0, 0x96, 0x0, + 0x1f, 0xff, 0xff, 0x13, 0x1e, 0x0, 0xe1, 0x0, + 0x0, 0x2f, 0x50, 0x2b, 0x1e, 0x5, 0xbd, 0x0, + 0x0, 0x8f, 0xd0, 0x58, 0x1e, 0xd, 0x4a, 0x60, + 0x0, 0xde, 0x99, 0x95, 0x1e, 0x6b, 0x4, 0xc0, + 0x5, 0x9d, 0x39, 0xe1, 0x1f, 0xd2, 0x0, 0xf0, + 0xe, 0x2d, 0x22, 0x90, 0x1f, 0x90, 0x0, 0xb3, + 0x49, 0xd, 0x20, 0x0, 0x6f, 0x10, 0x2, 0x0, + 0x0, 0xd, 0x20, 0x8, 0xfe, 0x0, 0xe, 0x0, + 0x0, 0xd, 0x20, 0xae, 0x5f, 0x0, 0x1e, 0x0, + 0x0, 0xd, 0x21, 0xa2, 0xc, 0xff, 0xf8, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+79FB "移" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x61, 0x0, 0x0, + 0x2, 0x6a, 0xea, 0x0, 0x8, 0xb0, 0x0, 0x0, + 0xa, 0x8d, 0x40, 0x0, 0x8f, 0xfe, 0xee, 0x20, + 0x0, 0xb, 0x30, 0x3d, 0xa1, 0x0, 0x8a, 0x0, + 0x0, 0xb, 0x30, 0x64, 0x7b, 0x28, 0xd1, 0x0, + 0x3f, 0xff, 0xff, 0x30, 0x9, 0xfc, 0x10, 0x0, + 0x0, 0x2f, 0x60, 0x4, 0xbe, 0x79, 0x10, 0x0, + 0x0, 0x7f, 0xe1, 0xac, 0x71, 0x9c, 0x0, 0x0, + 0x0, 0xdd, 0x9b, 0x0, 0x8, 0xfe, 0xee, 0xf1, + 0x5, 0xab, 0x49, 0x1, 0xbc, 0x10, 0x7, 0x90, + 0xd, 0x3b, 0x30, 0x4e, 0x77, 0x20, 0x3e, 0x10, + 0x49, 0xb, 0x30, 0x1, 0x4, 0xe8, 0xd3, 0x0, + 0x0, 0xb, 0x30, 0x0, 0x1, 0xae, 0x30, 0x0, + 0x0, 0xb, 0x30, 0x4, 0x9e, 0x70, 0x0, 0x0, + 0x0, 0xb, 0x30, 0xdb, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7A0B "程" */ + 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x7a, 0xec, 0x46, 0xfe, 0xee, 0xef, 0xc0, + 0x9, 0x79, 0xa0, 0x6, 0xa0, 0x0, 0x3, 0xc0, + 0x0, 0x6, 0xa0, 0x6, 0xa0, 0x0, 0x3, 0xc0, + 0x1, 0x17, 0xb1, 0x16, 0xa0, 0x0, 0x3, 0xc0, + 0x1e, 0xef, 0xfe, 0xa6, 0xfe, 0xee, 0xef, 0xc0, + 0x0, 0xc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xac, 0xec, 0x1d, 0xdd, 0xef, 0xdd, 0xd5, + 0x2, 0xe7, 0xa8, 0xa0, 0x0, 0x4b, 0x0, 0x0, + 0xb, 0x76, 0xa0, 0x20, 0x11, 0x5c, 0x11, 0x10, + 0x4c, 0x6, 0xa0, 0x9, 0xdd, 0xef, 0xdd, 0xd0, + 0x2, 0x6, 0xa0, 0x0, 0x0, 0x4b, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0x4b, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0xcf, 0xff, 0xff, 0xff, 0xfb, + + /* U+7A2E "種" */ + 0x0, 0x0, 0x38, 0x30, 0x12, 0x34, 0x68, 0x90, + 0x8, 0xcf, 0xe7, 0x4d, 0xcb, 0xea, 0x75, 0x20, + 0x5, 0x37, 0xa0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0x9f, 0xff, 0xff, 0xff, 0xf3, + 0x2, 0x27, 0xb2, 0x10, 0x0, 0xc3, 0x0, 0x0, + 0x1e, 0xef, 0xfe, 0xab, 0xcc, 0xfd, 0xcc, 0xb0, + 0x0, 0xc, 0xa0, 0xe, 0x0, 0xc4, 0x1, 0xe0, + 0x0, 0x3f, 0xf3, 0xf, 0x99, 0xeb, 0x9a, 0xe0, + 0x0, 0xaa, 0xcd, 0x1e, 0x22, 0xd5, 0x23, 0xe0, + 0x2, 0xc6, 0xa6, 0xae, 0x0, 0xc4, 0x1, 0xe0, + 0xb, 0x56, 0xa0, 0x2b, 0xcc, 0xfd, 0xcc, 0xb0, + 0x4c, 0x6, 0xa0, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x2, 0x6, 0xa0, 0x1d, 0xdd, 0xfe, 0xdd, 0xd0, + 0x0, 0x6, 0xa0, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x6, 0xa0, 0xee, 0xee, 0xfe, 0xee, 0xe7, + + /* U+7A4D "積" */ + 0x18, 0x9b, 0x96, 0x5b, 0xbb, 0xfc, 0xbb, 0x80, + 0x9, 0x5b, 0x50, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xa, 0x50, 0xb, 0xbb, 0xfc, 0xbb, 0x30, + 0x0, 0xa, 0x60, 0x44, 0x44, 0xf6, 0x44, 0x40, + 0x2e, 0xef, 0xfe, 0x86, 0x66, 0x66, 0x66, 0x60, + 0x0, 0xf, 0x60, 0xa, 0xcc, 0xcc, 0xcc, 0x20, + 0x0, 0x6f, 0xd0, 0xe, 0x10, 0x0, 0xd, 0x20, + 0x0, 0xdb, 0xbc, 0xe, 0xcb, 0xbb, 0xbf, 0x20, + 0x5, 0x9a, 0x59, 0x4e, 0x10, 0x0, 0xd, 0x20, + 0x1e, 0x2a, 0x50, 0xe, 0xbb, 0xbb, 0xbf, 0x20, + 0x67, 0xa, 0x50, 0xe, 0x10, 0x0, 0xd, 0x20, + 0x0, 0xa, 0x50, 0xa, 0xcc, 0xcc, 0xcc, 0x20, + 0x0, 0xa, 0x50, 0x4, 0xd7, 0x2, 0xc6, 0x0, + 0x0, 0xa, 0x52, 0xd9, 0x20, 0x0, 0x8, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7A76 "究" */ + 0x0, 0x0, 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0x0, + 0xc, 0xdd, 0xdd, 0xdf, 0xfd, 0xdd, 0xdd, 0xa0, + 0xe, 0x31, 0x12, 0x21, 0x12, 0x11, 0x16, 0xc0, + 0xa, 0x10, 0x4d, 0x60, 0x6, 0xd6, 0x3, 0x80, + 0x0, 0x3b, 0xc2, 0x0, 0x0, 0x18, 0xd5, 0x0, + 0x2, 0xc4, 0x0, 0x60, 0x0, 0x0, 0x2b, 0x30, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xee, 0xee, 0xfe, 0xee, 0xeb, 0x0, 0x0, + 0x0, 0x11, 0x12, 0xf2, 0x11, 0x5c, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xe0, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x70, 0x0, 0x4c, 0x0, 0x41, + 0x0, 0x0, 0xbd, 0x0, 0x0, 0x4c, 0x0, 0xa5, + 0x0, 0x5d, 0xc1, 0x0, 0x0, 0x4d, 0x0, 0xc3, + 0xd, 0xe7, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xd0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7A7A "空" */ + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf1, 0x0, 0x0, 0x0, 0x33, 0x33, + 0x33, 0xe9, 0x33, 0x33, 0x32, 0xec, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xdd, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0xe2, 0x3, 0xd4, 0x0, 0xca, + 0x20, 0x3c, 0x41, 0x7e, 0x40, 0x0, 0x6, 0xea, + 0x10, 0x5e, 0xa2, 0x0, 0x0, 0x0, 0x8, 0xf5, + 0x35, 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0x3, + 0xbb, 0xbb, 0xfc, 0xbb, 0xbb, 0x20, 0x0, 0x0, + 0x0, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, + 0x0, 0x0, 0xde, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xec, + + /* U+7A93 "窓" */ + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xd0, + 0xe, 0x20, 0x5, 0x40, 0x4, 0x10, 0x4, 0xd0, + 0x8, 0x11, 0xab, 0x10, 0x5, 0xc9, 0x12, 0x60, + 0x1, 0x9d, 0x60, 0x88, 0x0, 0x5, 0xd7, 0x0, + 0x0, 0x60, 0x8, 0xb0, 0x6, 0x60, 0x2, 0x0, + 0x0, 0x0, 0x99, 0x0, 0x0, 0xab, 0x10, 0x0, + 0x0, 0x2e, 0xfb, 0xcd, 0xee, 0xdc, 0xd2, 0x0, + 0x0, 0x6, 0x42, 0x12, 0x0, 0x0, 0x64, 0x0, + 0x0, 0x10, 0x50, 0x1e, 0x40, 0x0, 0x80, 0x0, + 0x1, 0xe0, 0xf0, 0x3, 0xe2, 0x0, 0xaa, 0x0, + 0x8, 0x90, 0xf0, 0x0, 0x68, 0x7, 0x3d, 0x50, + 0x1e, 0x20, 0xf1, 0x0, 0x0, 0x1e, 0x34, 0xd0, + 0x15, 0x0, 0xae, 0xee, 0xee, 0xfa, 0x0, 0x10, + + /* U+7ACB "立" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x22, 0x22, 0x26, 0x72, 0x22, 0x22, 0x10, + 0x6, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xf, 0x30, 0x0, + 0x0, 0x0, 0xc5, 0x0, 0x0, 0x5e, 0x0, 0x0, + 0x0, 0x0, 0x89, 0x0, 0x0, 0x99, 0x0, 0x0, + 0x0, 0x0, 0x4d, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0x10, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0x40, 0x8, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x50, 0xd, 0x40, 0x0, 0x0, + 0x4, 0x44, 0x44, 0x44, 0x7f, 0x54, 0x44, 0x40, + 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, + + /* U+7AD9 "站" */ + 0x0, 0xc, 0x10, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x5, 0x56, 0x95, 0x50, 0x0, 0xe2, 0x0, 0x0, + 0xa, 0xaa, 0xaa, 0xa1, 0x0, 0xef, 0xff, 0xf4, + 0x2, 0x50, 0x8, 0x30, 0x0, 0xe2, 0x0, 0x0, + 0x3, 0xa0, 0xd, 0x20, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xd0, 0xe, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xe0, 0x2c, 0x7, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0xc2, 0x49, 0x8, 0x80, 0x0, 0x4, 0xd0, + 0x0, 0xa4, 0x75, 0x8, 0x80, 0x0, 0x3, 0xd0, + 0x0, 0x14, 0xcd, 0xf8, 0x80, 0x0, 0x3, 0xd0, + 0x1c, 0xfc, 0x84, 0x8, 0x80, 0x0, 0x3, 0xd0, + 0x4, 0x0, 0x0, 0x8, 0xec, 0xcc, 0xcd, 0xd0, + 0x0, 0x0, 0x0, 0x8, 0xa3, 0x33, 0x36, 0xc0, + + /* U+7AE5 "童" */ + 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0x2, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x20, + 0x0, 0x0, 0x98, 0x0, 0x0, 0xa8, 0x0, 0x0, + 0x17, 0x77, 0x8f, 0x77, 0x78, 0xf8, 0x77, 0x71, + 0x16, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x5b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb5, 0x0, + 0x0, 0x69, 0x0, 0x8, 0x80, 0x0, 0x96, 0x0, + 0x0, 0x6e, 0xbb, 0xbd, 0xdb, 0xbb, 0xe6, 0x0, + 0x0, 0x69, 0x0, 0x8, 0x80, 0x0, 0x96, 0x0, + 0x0, 0x6d, 0xbb, 0xbe, 0xeb, 0xbb, 0xd6, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x1, 0xdd, 0xdd, 0xde, 0xed, 0xdd, 0xdd, 0x10, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x3d, 0xdd, 0xdd, 0xdf, 0xfd, 0xdd, 0xdd, 0xd3, + + /* U+7AEF "端" */ + 0x0, 0x4a, 0x0, 0x4b, 0x0, 0xd0, 0x1, 0xe0, + 0x0, 0xd, 0x30, 0x4b, 0x0, 0xd0, 0x1, 0xe0, + 0x18, 0x8a, 0x98, 0x6b, 0x0, 0xd0, 0x1, 0xe0, + 0x17, 0x77, 0x77, 0x5f, 0xff, 0xff, 0xff, 0xe0, + 0x6, 0x20, 0x47, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x60, 0x77, 0xcd, 0xdd, 0xdd, 0xdd, 0xd6, + 0x5, 0x80, 0x95, 0x22, 0x23, 0xe2, 0x22, 0x21, + 0x2, 0xb0, 0xb2, 0x0, 0x3, 0xb0, 0x0, 0x0, + 0x1, 0xc0, 0xd0, 0x6f, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xd0, 0xc0, 0x68, 0xd, 0xb, 0x20, 0xd1, + 0x0, 0x56, 0xc9, 0x98, 0xd, 0xb, 0x20, 0xd1, + 0x2c, 0xfd, 0x95, 0x88, 0xd, 0xb, 0x20, 0xd1, + 0x5, 0x10, 0x0, 0x68, 0xd, 0xb, 0x20, 0xd1, + 0x0, 0x0, 0x0, 0x68, 0xb, 0x9, 0x3d, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7B11 "笑" */ + 0x0, 0x9, 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, + 0x0, 0x5c, 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xee, 0xee, 0x9f, 0xee, 0xee, 0xe1, + 0x6, 0xc0, 0xd3, 0x4, 0xe1, 0x3e, 0x10, 0x0, + 0x1f, 0x20, 0x79, 0xe, 0x50, 0xa, 0x60, 0x0, + 0x2, 0x0, 0x11, 0x3, 0x35, 0x7a, 0xd9, 0x0, + 0x0, 0xac, 0xef, 0xff, 0xea, 0x86, 0x20, 0x0, + 0x0, 0x22, 0x10, 0x8, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x7c, 0xb7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xf3, 0x1e, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0x50, 0x3, 0xe7, 0x0, 0x0, + 0x1, 0x6c, 0xd3, 0x0, 0x0, 0x2c, 0xd6, 0x10, + 0xc, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7B26 "符" */ + 0x0, 0x16, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xee, 0xe8, 0xbf, 0xee, 0xee, 0xd0, + 0x8, 0xb0, 0xc3, 0x5, 0xd0, 0x3d, 0x0, 0x0, + 0x2e, 0x10, 0x5a, 0xe, 0x30, 0x9, 0x40, 0x0, + 0x1, 0x1, 0xb1, 0x0, 0x0, 0x2, 0x90, 0x0, + 0x0, 0xa, 0x90, 0x0, 0x0, 0x3, 0xd0, 0x0, + 0x0, 0x4f, 0x2a, 0xee, 0xee, 0xef, 0xfe, 0xe1, + 0x3, 0xff, 0x10, 0x0, 0x0, 0x4, 0xd0, 0x0, + 0x1e, 0x7e, 0x10, 0x69, 0x0, 0x3, 0xd0, 0x0, + 0x5, 0xe, 0x10, 0xd, 0x40, 0x3, 0xd0, 0x0, + 0x0, 0xe, 0x10, 0x4, 0xe0, 0x3, 0xd0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x50, 0x3, 0xd0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x4, 0xd0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0xe, 0xfe, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7B2C "第" */ + 0x0, 0x5, 0x10, 0x0, 0x4, 0x20, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0x0, 0xf, 0x30, 0x0, 0x0, + 0x0, 0xae, 0xfe, 0xdb, 0x7e, 0xdf, 0xdd, 0xd1, + 0x6, 0xc0, 0x78, 0x3, 0xe2, 0xa, 0x80, 0x0, + 0xc, 0x20, 0x18, 0x6, 0x60, 0x1, 0x90, 0x0, + 0x0, 0xce, 0xee, 0xee, 0xee, 0xee, 0xed, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x30, 0x0, 0x2e, 0x0, + 0x0, 0x2, 0x22, 0x2d, 0x52, 0x22, 0x4e, 0x0, + 0x0, 0x6e, 0xcc, 0xcf, 0xdc, 0xcc, 0xcb, 0x0, + 0x0, 0x96, 0x0, 0xd, 0x30, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x50, + 0x0, 0x0, 0x4, 0xde, 0x30, 0x0, 0xd, 0x30, + 0x0, 0x0, 0x5c, 0x1d, 0x30, 0x0, 0xf, 0x10, + 0x0, 0x19, 0xa0, 0xd, 0x30, 0x32, 0x6e, 0x0, + 0x5, 0xa3, 0x0, 0xd, 0x30, 0x9c, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7B46 "筆" */ + 0x0, 0x4, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x0, 0x0, 0x5e, 0x0, 0x0, 0x0, + 0x1, 0xdd, 0xfd, 0xdd, 0xed, 0xfe, 0xdd, 0xd1, + 0xc, 0xa0, 0xb6, 0x3e, 0x50, 0x5d, 0x0, 0x0, + 0x7, 0x0, 0x12, 0xb, 0x70, 0x3, 0x0, 0x0, + 0x0, 0x3d, 0xdd, 0xde, 0xed, 0xdd, 0xe7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x97, 0x0, + 0x2d, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xfe, 0xd3, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x97, 0x0, + 0x0, 0x5d, 0xdd, 0xde, 0xed, 0xdd, 0xd6, 0x0, + 0x0, 0x11, 0x11, 0x1a, 0x81, 0x11, 0x11, 0x0, + 0x0, 0xab, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0x0, + 0x2, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x20, + 0xa, 0xbb, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0xb0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + + /* U+7B49 "等" */ + 0x0, 0x5, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, + 0x0, 0x5d, 0x0, 0x0, 0x1f, 0x20, 0x0, 0x0, + 0x0, 0xcf, 0xfe, 0xee, 0x9f, 0xff, 0xee, 0xe3, + 0x8, 0xa0, 0xe2, 0x6, 0xe1, 0x1e, 0x10, 0x0, + 0xa, 0x0, 0x64, 0x9, 0x90, 0x6, 0x50, 0x0, + 0x0, 0x6d, 0xdd, 0xde, 0xfd, 0xdd, 0xdc, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xa0, 0x0, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xee, 0xee, 0xff, 0xee, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x60, 0x0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xe1, 0x0, 0x2f, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf9, 0x0, 0x0, + + /* U+7B54 "答" */ + 0x0, 0x6, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x0, 0x0, 0x4d, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xee, 0xe8, 0xbf, 0xee, 0xee, 0x80, + 0xb, 0x90, 0xe2, 0x6, 0xc0, 0x6c, 0x0, 0x0, + 0x5c, 0x0, 0x78, 0x8, 0x40, 0xc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xc1, 0x9d, 0x40, 0x0, 0x0, + 0x0, 0x5, 0xea, 0x0, 0x4, 0xeb, 0x50, 0x0, + 0x6, 0xdc, 0xae, 0xee, 0xee, 0xe6, 0xde, 0x70, + 0x29, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3, 0x40, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0xd, 0x30, 0x0, + 0x0, 0xc, 0x30, 0x0, 0x0, 0xd, 0x30, 0x0, + 0x0, 0xc, 0x52, 0x22, 0x22, 0x2d, 0x30, 0x0, + 0x0, 0xc, 0xdc, 0xcc, 0xcc, 0xce, 0x30, 0x0, + + /* U+7B56 "策" */ + 0x0, 0x5, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, + 0x0, 0x7b, 0x0, 0x0, 0x5e, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfe, 0xec, 0xdf, 0xff, 0xee, 0xe0, + 0x1e, 0x70, 0xe3, 0x1d, 0xa0, 0x3d, 0x0, 0x0, + 0x16, 0x0, 0x43, 0xb, 0x90, 0x6, 0x10, 0x0, + 0xd, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xb0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x23, 0x33, 0x3a, 0xb3, 0x33, 0x33, 0x0, + 0x0, 0xbc, 0xbb, 0xbd, 0xeb, 0xbb, 0xcd, 0x0, + 0x0, 0xb5, 0x0, 0x8, 0x90, 0x0, 0x3d, 0x0, + 0x0, 0xb5, 0x0, 0x1d, 0xd1, 0x0, 0x3d, 0x0, + 0x0, 0xa4, 0x4, 0xdc, 0xdd, 0x49, 0xc7, 0x0, + 0x0, 0x3, 0xab, 0x28, 0x92, 0xcb, 0x40, 0x0, + 0x17, 0xcb, 0x50, 0x8, 0x90, 0x4, 0xad, 0x91, + 0x6, 0x20, 0x0, 0x8, 0x90, 0x0, 0x1, 0x50, + + /* U+7B97 "算" */ + 0x0, 0x2, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x8b, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, + 0x2, 0xfe, 0xfe, 0xec, 0xce, 0xef, 0xee, 0xe0, + 0x1e, 0x50, 0xc4, 0xa, 0x90, 0xd, 0x40, 0x0, + 0x3, 0x1c, 0xdc, 0xcd, 0xcc, 0xcd, 0xc5, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, + 0x0, 0x2f, 0xbb, 0xbb, 0xbb, 0xbb, 0xe6, 0x0, + 0x0, 0x2f, 0x55, 0x55, 0x55, 0x55, 0xc6, 0x0, + 0x0, 0x2f, 0x44, 0x44, 0x44, 0x44, 0xc6, 0x0, + 0x0, 0x2f, 0xbb, 0xbb, 0xbb, 0xbb, 0xe6, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0xa6, 0x0, 0x0, + 0x2, 0x22, 0x2f, 0x42, 0x22, 0xb8, 0x22, 0x20, + 0xb, 0xbb, 0xdf, 0xbb, 0xbb, 0xed, 0xbb, 0xb1, + 0x0, 0x6, 0xd4, 0x0, 0x0, 0xa6, 0x0, 0x0, + 0x6, 0xc8, 0x10, 0x0, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7BA1 "管" */ + 0x0, 0x13, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, + 0x0, 0xed, 0xee, 0xcc, 0x1e, 0xce, 0xdc, 0xc3, + 0x9, 0xa0, 0x5b, 0x0, 0xa7, 0x5, 0xb0, 0x0, + 0x8, 0x10, 0x6, 0x6, 0xa0, 0x0, 0x60, 0x0, + 0x1, 0xed, 0xdd, 0xde, 0xfd, 0xdd, 0xdd, 0xc0, + 0x1, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xd0, + 0x1, 0xa6, 0xfd, 0xdd, 0xdd, 0xde, 0xe2, 0xa0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x6, 0xfd, 0xdd, 0xdd, 0xdd, 0xe0, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfd, 0xdd, 0xdd, 0xdd, 0xda, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x4b, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0x0, 0x4b, 0x0, + 0x0, 0x6, 0xfd, 0xdd, 0xdd, 0xdd, 0xeb, 0x0, + + /* U+7BC0 "節" */ + 0x0, 0x5, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, + 0x0, 0x6c, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, + 0x0, 0xdd, 0xfd, 0xdd, 0x2e, 0xdf, 0xed, 0xd6, + 0xa, 0x90, 0x97, 0x1, 0xd4, 0x8, 0xa0, 0x0, + 0x19, 0x0, 0x19, 0x4, 0x60, 0x0, 0xb2, 0x0, + 0x1, 0xdd, 0xdd, 0xdc, 0xc, 0xdd, 0xdd, 0xc0, + 0x1, 0xe0, 0x0, 0x1e, 0xe, 0x31, 0x14, 0xe0, + 0x1, 0xfb, 0xbb, 0xbe, 0xe, 0x10, 0x2, 0xe0, + 0x1, 0xe1, 0x11, 0x3e, 0xe, 0x10, 0x2, 0xe0, + 0x1, 0xe0, 0x0, 0x2e, 0xe, 0x10, 0x2, 0xe0, + 0x1, 0xfd, 0xdd, 0xdc, 0xe, 0x10, 0x2, 0xe0, + 0x1, 0xe0, 0x7, 0x60, 0xe, 0x10, 0x2, 0xe0, + 0x1, 0xe0, 0x26, 0xf3, 0xe, 0x1a, 0xde, 0xa0, + 0x7, 0xfe, 0xd9, 0x6d, 0x1e, 0x11, 0x10, 0x0, + 0x3, 0x51, 0x0, 0x5, 0x1e, 0x10, 0x0, 0x0, + + /* U+7BC4 "範" */ + 0x0, 0x3, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x5d, 0x0, 0x0, 0x2f, 0x30, 0x0, 0x0, + 0x1, 0xee, 0xfe, 0xef, 0xcf, 0xff, 0xee, 0xe8, + 0xd, 0x70, 0xc3, 0xb, 0x80, 0xc, 0x60, 0x0, + 0x1, 0x0, 0xa2, 0x0, 0x0, 0x1, 0x0, 0x0, + 0xa, 0xcc, 0xfd, 0xcc, 0x4f, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0xb3, 0x0, 0xf, 0x10, 0x1, 0xe0, + 0x6, 0xdb, 0xec, 0xbe, 0xf, 0x10, 0x1, 0xe0, + 0x6, 0x82, 0xc5, 0x2e, 0xf, 0x10, 0x1, 0xe0, + 0x6, 0xc9, 0xea, 0x9e, 0xf, 0x10, 0x2, 0xe0, + 0x6, 0x94, 0xc6, 0x4e, 0xf, 0x12, 0xff, 0xa0, + 0x2, 0x66, 0xd8, 0x66, 0xf, 0x10, 0x0, 0x0, + 0xb, 0xbb, 0xec, 0xbb, 0x5f, 0x10, 0x0, 0x4a, + 0x2, 0x22, 0xc5, 0x22, 0x1e, 0x30, 0x0, 0x79, + 0x0, 0x0, 0xb3, 0x0, 0x8, 0xff, 0xff, 0xe2, + + /* U+7C21 "簡" */ + 0x0, 0x3, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, + 0x0, 0x5c, 0x0, 0x0, 0x1f, 0x30, 0x0, 0x0, + 0x1, 0xde, 0xfd, 0xdd, 0xbe, 0xef, 0xdd, 0xd7, + 0xb, 0x80, 0xe1, 0xb, 0xb0, 0xb, 0x60, 0x0, + 0x5, 0x44, 0x86, 0x45, 0x4, 0x46, 0x94, 0x40, + 0x1, 0xe6, 0x66, 0xc6, 0x1f, 0x66, 0x67, 0xd0, + 0x1, 0xfa, 0xaa, 0xe6, 0x1f, 0xaa, 0xab, 0xd0, + 0x1, 0xe1, 0x11, 0xb6, 0x1e, 0x11, 0x13, 0xd0, + 0x1, 0xf9, 0x99, 0x93, 0x9, 0x99, 0x9a, 0xd0, + 0x1, 0xe0, 0x9, 0xaa, 0xaa, 0xa2, 0x2, 0xd0, + 0x1, 0xe0, 0xe, 0x20, 0x0, 0xb4, 0x2, 0xd0, + 0x1, 0xe0, 0xe, 0xbb, 0xbb, 0xe4, 0x2, 0xd0, + 0x1, 0xe0, 0xe, 0x10, 0x0, 0xb4, 0x2, 0xd0, + 0x1, 0xe0, 0xe, 0xbb, 0xbb, 0xe4, 0x2, 0xd0, + 0x1, 0xe0, 0x4, 0x0, 0x0, 0x6, 0xfe, 0x80, + + /* U+7C73 "米" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x1, 0x0, + 0x0, 0xc5, 0x0, 0x9, 0x80, 0x0, 0x4e, 0x0, + 0x0, 0x3e, 0x20, 0x9, 0x80, 0x0, 0xd6, 0x0, + 0x0, 0x9, 0xa0, 0x9, 0x80, 0x8, 0xb0, 0x0, + 0x0, 0x1, 0xb0, 0x9, 0x80, 0x1c, 0x10, 0x0, + 0x1, 0x11, 0x11, 0x1a, 0x91, 0x11, 0x11, 0x10, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0xdd, 0xdd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x99, 0x89, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x9c, 0x9, 0x80, 0xba, 0x0, 0x0, + 0x0, 0xa, 0xc0, 0x9, 0x80, 0xb, 0xb1, 0x0, + 0x2, 0xcb, 0x0, 0x9, 0x80, 0x0, 0x9e, 0x40, + 0x2f, 0x80, 0x0, 0x9, 0x80, 0x0, 0x5, 0xe2, + 0x1, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+7CBE "精" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe, 0x12, 0x0, 0x0, 0x69, 0x0, 0x0, + 0xc, 0xe, 0x1c, 0x3b, 0xdd, 0xee, 0xdd, 0xd3, + 0x8, 0x4e, 0x2d, 0x0, 0x0, 0x69, 0x0, 0x0, + 0x4, 0x8e, 0x67, 0x5, 0xcc, 0xee, 0xcc, 0xb0, + 0x1, 0x4e, 0x51, 0x0, 0x0, 0x69, 0x0, 0x0, + 0x2c, 0xcf, 0xdb, 0x5d, 0xdd, 0xdd, 0xdd, 0xd9, + 0x2, 0x5f, 0x52, 0x0, 0x22, 0x22, 0x22, 0x10, + 0x0, 0x8f, 0xb0, 0x3, 0xea, 0xaa, 0xad, 0x90, + 0x0, 0xde, 0xa7, 0x3, 0xc0, 0x0, 0x6, 0x90, + 0x5, 0x9e, 0x2e, 0x3, 0xfc, 0xcc, 0xcd, 0x90, + 0xd, 0x3e, 0x12, 0x3, 0xc0, 0x0, 0x6, 0x90, + 0x2a, 0xe, 0x10, 0x3, 0xfc, 0xcc, 0xce, 0x90, + 0x0, 0xe, 0x10, 0x3, 0xc0, 0x0, 0x6, 0x90, + 0x0, 0xe, 0x10, 0x3, 0xc0, 0x1, 0xee, 0x60, + + /* U+7CD6 "糖" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xf, 0x5, 0x0, 0x0, 0x98, 0x0, 0x0, + 0xc, 0xf, 0xe, 0x6e, 0xee, 0xef, 0xee, 0xe2, + 0xa, 0x3f, 0x39, 0x68, 0x0, 0x4, 0x0, 0x0, + 0x7, 0x6f, 0x84, 0x68, 0x22, 0x3e, 0x22, 0x20, + 0x3, 0x3f, 0x40, 0x68, 0x7a, 0xaf, 0xaa, 0xd0, + 0x1a, 0xbf, 0xaa, 0x69, 0x22, 0x3e, 0x23, 0xe2, + 0x5, 0x8f, 0x54, 0x7a, 0xaa, 0xaf, 0xaa, 0xf8, + 0x0, 0x9f, 0x40, 0x85, 0x12, 0x3e, 0x23, 0xd0, + 0x0, 0xdf, 0xd1, 0x94, 0x8a, 0xbf, 0xaa, 0x90, + 0x6, 0x7f, 0x59, 0xa3, 0x0, 0x1e, 0x0, 0x0, + 0xd, 0x1f, 0x1, 0xd0, 0xdd, 0xdd, 0xdd, 0xe0, + 0x38, 0xf, 0x1, 0xc0, 0xd1, 0x0, 0x1, 0xe0, + 0x0, 0xf, 0x8, 0x60, 0xd1, 0x0, 0x1, 0xe0, + 0x0, 0xf, 0xc, 0x0, 0xdd, 0xdd, 0xdd, 0xe0, + + /* U+7CFB "系" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x1, 0x24, 0x56, 0x8a, 0xcf, 0xd6, 0x0, 0xd, + 0xdc, 0xbd, 0xf7, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xc2, 0x0, 0x6, 0x0, 0x0, 0x0, 0x7, + 0xb1, 0x0, 0x4e, 0x90, 0x0, 0x0, 0xd, 0xfa, + 0xbc, 0xde, 0x40, 0x0, 0x0, 0x0, 0x65, 0x38, + 0xfa, 0x10, 0x81, 0x0, 0x0, 0x0, 0x2b, 0xc3, + 0x0, 0x5, 0xd1, 0x0, 0x3, 0xaf, 0xa7, 0x89, + 0xab, 0xcf, 0xd0, 0x0, 0xcc, 0xa9, 0x78, 0xf4, + 0x32, 0x9, 0xa0, 0x0, 0x3, 0x60, 0x2e, 0x2, + 0x70, 0x3, 0x0, 0x3, 0xe4, 0x2, 0xe0, 0xb, + 0xb1, 0x0, 0x4, 0xe6, 0x0, 0x2e, 0x0, 0x9, + 0xd1, 0x3, 0xf4, 0x0, 0x3, 0xe0, 0x0, 0x8, + 0xd0, 0x1, 0x0, 0x5f, 0xf9, 0x0, 0x0, 0x1, + 0x0, + + /* U+7D00 "紀" */ + 0x0, 0x3, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x70, 0xa, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x2e, 0x0, 0x1, 0x11, 0x11, 0x1e, 0x20, + 0x0, 0xa6, 0xe, 0x10, 0x0, 0x0, 0xe, 0x20, + 0x4, 0xc0, 0x79, 0x0, 0x0, 0x0, 0xe, 0x20, + 0x1e, 0xdd, 0xd0, 0x0, 0x0, 0x0, 0xe, 0x20, + 0x8, 0x5c, 0x31, 0x0, 0x11, 0x11, 0x1e, 0x20, + 0x0, 0x95, 0xc, 0x22, 0xff, 0xff, 0xff, 0x20, + 0xa, 0xeb, 0xcd, 0x82, 0xf0, 0x0, 0x1, 0x0, + 0x9, 0x63, 0x0, 0x82, 0xf0, 0x0, 0x0, 0x0, + 0x2, 0x23, 0x29, 0x22, 0xf0, 0x0, 0x0, 0x0, + 0x8, 0x67, 0x77, 0x72, 0xf0, 0x0, 0x0, 0x40, + 0xb, 0x35, 0x93, 0xb2, 0xf0, 0x0, 0x0, 0xe1, + 0xe, 0x4, 0xb0, 0x71, 0xf2, 0x0, 0x2, 0xf0, + 0x28, 0x1, 0x40, 0x0, 0xbf, 0xff, 0xff, 0x70, + + /* U+7D04 "約" */ + 0x0, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x10, 0x0, 0xf2, 0x0, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x4d, 0x0, 0x0, 0x0, 0x5, + 0xc0, 0x33, 0xa, 0xa3, 0x33, 0x32, 0x2, 0xe2, + 0xe, 0x52, 0xfc, 0xcc, 0xcd, 0xd1, 0xdc, 0x9c, + 0x90, 0xb9, 0x0, 0x0, 0x3d, 0x8, 0x5a, 0xc2, + 0x3d, 0x0, 0x0, 0x4, 0xc0, 0x5, 0xd1, 0x5a, + 0x2, 0xc0, 0x0, 0x4c, 0x5, 0xe6, 0x69, 0xf0, + 0x7, 0xc0, 0x5, 0xb1, 0xfc, 0x97, 0x4b, 0x30, + 0x9, 0x90, 0x6a, 0x1, 0x0, 0x22, 0x50, 0x0, + 0xa, 0x7, 0x90, 0x79, 0x4a, 0x1d, 0x0, 0x0, + 0x0, 0x98, 0xa, 0x51, 0xd0, 0xb3, 0x0, 0x0, + 0xb, 0x60, 0xe0, 0xf, 0x4, 0x30, 0x1, 0x2, + 0xf3, 0x17, 0x0, 0x30, 0x0, 0x0, 0xef, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7D19 "紙" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xc0, 0x0, 0x1, 0x47, 0xbe, 0xa0, + 0x0, 0xe, 0x30, 0x3, 0xed, 0xaf, 0x50, 0x0, + 0x0, 0x89, 0x8, 0x54, 0xb0, 0xe, 0x10, 0x0, + 0x3, 0xd0, 0x3e, 0x14, 0xb0, 0xd, 0x20, 0x0, + 0x1e, 0xcb, 0xe5, 0x4, 0xb0, 0xd, 0x20, 0x0, + 0x6, 0x4b, 0x94, 0x4, 0xc0, 0xc, 0x30, 0x0, + 0x0, 0x6b, 0xb, 0x44, 0xff, 0xff, 0xff, 0xf8, + 0x5, 0xe5, 0x6b, 0xb4, 0xb0, 0x9, 0x50, 0x0, + 0xe, 0xc9, 0x74, 0xe5, 0xb0, 0x7, 0x70, 0x0, + 0x1, 0x1, 0x15, 0x24, 0xb0, 0x5, 0xa0, 0x0, + 0x9, 0x68, 0x66, 0x84, 0xb0, 0x2, 0xd0, 0x12, + 0xb, 0x35, 0x81, 0xd4, 0xb0, 0x0, 0xe2, 0x39, + 0xe, 0x4, 0xa0, 0x35, 0xd9, 0xe2, 0x7a, 0x67, + 0x18, 0x0, 0x10, 0xb, 0xc5, 0x0, 0xb, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7D20 "素" */ + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x3, 0xdd, 0xdd, 0xde, 0xed, 0xdd, 0xdd, 0x50, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0xcc, 0xce, 0xec, 0xcc, 0xc5, 0x0, + 0x1, 0x11, 0x11, 0x19, 0x91, 0x11, 0x11, 0x10, + 0x1c, 0xcc, 0xcc, 0xee, 0xcc, 0xcc, 0xcc, 0xc2, + 0x0, 0x0, 0x3a, 0xa3, 0x2, 0x94, 0x0, 0x0, + 0x0, 0xd, 0xfe, 0xcd, 0xec, 0x50, 0x0, 0x0, + 0x0, 0x2, 0x27, 0xc9, 0x30, 0xb, 0x60, 0x0, + 0x2, 0x7c, 0xfd, 0x9a, 0xab, 0xcd, 0xea, 0x0, + 0x2, 0x86, 0x65, 0x36, 0xc1, 0x0, 0x8, 0x50, + 0x0, 0x5, 0xe4, 0x4, 0xb0, 0x6d, 0x60, 0x0, + 0x3, 0xbc, 0x20, 0x5, 0xb0, 0x2, 0xad, 0x30, + 0x9, 0x50, 0x8, 0xfe, 0x70, 0x0, 0x5, 0x70, + + /* U+7D30 "細" */ + 0x0, 0x7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe1, 0x0, 0xef, 0xff, 0xff, 0xfe, 0x0, + 0x78, 0x1, 0xe, 0x21, 0xc4, 0x12, 0xe0, 0x1d, + 0x7, 0x90, 0xe1, 0xb, 0x30, 0x1e, 0xa, 0x51, + 0xe1, 0xe, 0x10, 0xb3, 0x1, 0xe5, 0xfe, 0xf7, + 0x0, 0xe1, 0xb, 0x30, 0x1e, 0x1, 0x3c, 0x34, + 0xe, 0x10, 0xb3, 0x1, 0xe0, 0xd, 0x21, 0xc0, + 0xef, 0xff, 0xff, 0xfe, 0xb, 0xb7, 0xaf, 0x1e, + 0x10, 0xb4, 0x2, 0xe2, 0xc8, 0x63, 0x62, 0xe1, + 0xb, 0x30, 0x1e, 0x2, 0x3, 0x16, 0xe, 0x10, + 0xb3, 0x1, 0xe0, 0xd1, 0xd0, 0xc0, 0xe1, 0xb, + 0x30, 0x1e, 0xe, 0xb, 0x1a, 0x2e, 0x10, 0xb4, + 0x2, 0xe3, 0xb0, 0xa3, 0x53, 0xef, 0xff, 0xff, + 0xfe, 0x45, 0x2, 0x0, 0xe, 0x10, 0x0, 0x1, + 0xc0, + + /* U+7D39 "紹" */ + 0x0, 0x3, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa7, 0x0, 0xef, 0xff, 0xff, 0xfb, 0x0, + 0x2e, 0x0, 0x0, 0x0, 0xf0, 0x5, 0xa0, 0xa, + 0x70, 0xe1, 0x0, 0x2d, 0x0, 0x6a, 0x3, 0xd0, + 0x79, 0x0, 0x8, 0x90, 0x7, 0x81, 0xed, 0xce, + 0x10, 0x1, 0xe3, 0x0, 0x97, 0x9, 0x6c, 0x60, + 0x1, 0xba, 0x3, 0x3d, 0x40, 0x5, 0xa0, 0xd0, + 0xbb, 0x0, 0x7b, 0x80, 0x3, 0xe3, 0x4c, 0x50, + 0x10, 0x0, 0x0, 0x0, 0xee, 0xb9, 0x9a, 0x1f, + 0xee, 0xee, 0xf4, 0x1, 0x0, 0x5, 0x21, 0xe0, + 0x0, 0xc, 0x40, 0x76, 0x85, 0xc2, 0x1e, 0x0, + 0x0, 0xc4, 0xa, 0x46, 0x77, 0x61, 0xe0, 0x0, + 0xc, 0x40, 0xd1, 0x49, 0x36, 0x1f, 0x33, 0x33, + 0xd4, 0x1a, 0x2, 0x60, 0x1, 0xfb, 0xbb, 0xbe, + 0x40, + + /* U+7D42 "終" */ + 0x0, 0x5, 0x30, 0x0, 0x7, 0x20, 0x0, 0x0, + 0x0, 0xe, 0x30, 0x0, 0x3e, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0xcf, 0xee, 0xee, 0x10, + 0x1, 0xe2, 0x4c, 0x8, 0xf4, 0x0, 0x7a, 0x0, + 0xa, 0x70, 0xd4, 0x7d, 0x5e, 0x12, 0xe2, 0x0, + 0x4f, 0xef, 0xa0, 0x52, 0x7, 0xbd, 0x50, 0x0, + 0x2, 0x3d, 0x52, 0x0, 0x3, 0xfd, 0x0, 0x0, + 0x0, 0xd3, 0x59, 0x0, 0x7e, 0x59, 0xd3, 0x0, + 0x1c, 0xc8, 0xbe, 0x4e, 0xb3, 0x0, 0x6e, 0xa1, + 0x2b, 0x85, 0x2b, 0x34, 0x9, 0xc4, 0x1, 0x60, + 0x3, 0x4, 0x26, 0x0, 0x0, 0x3c, 0x90, 0x0, + 0xc, 0x1d, 0xd, 0x0, 0x0, 0x0, 0x10, 0x0, + 0xe, 0xb, 0x1b, 0x25, 0xea, 0x50, 0x0, 0x0, + 0x3b, 0xa, 0x32, 0x10, 0x5, 0xae, 0x81, 0x0, + 0x24, 0x1, 0x0, 0x0, 0x0, 0x1, 0x9d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7D44 "組" */ + 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x60, 0x4, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x3d, 0x1, 0x4, 0xb0, 0x0, 0xf, 0x0, + 0x0, 0xc4, 0x1e, 0x4, 0xb0, 0x0, 0xf, 0x0, + 0x8, 0x90, 0xa7, 0x4, 0xb0, 0x0, 0xf, 0x0, + 0x2f, 0xff, 0xe0, 0x4, 0xeb, 0xbb, 0xbf, 0x0, + 0x2, 0xd, 0x46, 0x4, 0xc4, 0x44, 0x4f, 0x0, + 0x0, 0x99, 0xc, 0x14, 0xb0, 0x0, 0xf, 0x0, + 0x5, 0xe4, 0x6c, 0x54, 0xb0, 0x0, 0xf, 0x0, + 0x1f, 0xfc, 0x99, 0x94, 0xb1, 0x11, 0x1f, 0x0, + 0x2, 0x0, 0x5, 0x34, 0xfd, 0xdd, 0xdf, 0x0, + 0x8, 0x48, 0x5c, 0x14, 0xb0, 0x0, 0xf, 0x0, + 0xc, 0x26, 0x87, 0x64, 0xb0, 0x0, 0xf, 0x0, + 0xe, 0x4, 0x92, 0x34, 0xb0, 0x0, 0xf, 0x0, + 0x2a, 0x1, 0x40, 0xbf, 0xff, 0xff, 0xff, 0xf1, + + /* U+7D4C "経" */ + 0x0, 0x9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x10, 0x7f, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x89, 0x2, 0x3, 0xd0, 0x0, 0x4e, 0x0, + 0x1, 0xe1, 0x5d, 0x0, 0xc5, 0x0, 0xd6, 0x0, + 0xa, 0x70, 0xd4, 0x0, 0x3e, 0x2a, 0xb0, 0x0, + 0x5f, 0xdf, 0xb0, 0x0, 0x7, 0xfd, 0x10, 0x0, + 0x25, 0x5e, 0x31, 0x0, 0x3c, 0xde, 0x60, 0x0, + 0x0, 0xc5, 0x59, 0x4b, 0xe6, 0x3, 0xcd, 0x71, + 0xa, 0xb4, 0x7e, 0x56, 0x0, 0xc4, 0x3, 0x80, + 0x4f, 0xc9, 0x7c, 0x30, 0x0, 0xc4, 0x0, 0x0, + 0x1, 0x1, 0x15, 0xd, 0xff, 0xff, 0xff, 0x60, + 0xe, 0x1d, 0xd, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0xe, 0xd, 0xb, 0x20, 0x0, 0xc4, 0x0, 0x0, + 0x3b, 0xb, 0x27, 0x40, 0x0, 0xc4, 0x0, 0x0, + 0x77, 0x7, 0x20, 0x8f, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7D50 "結" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xa0, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0xd, 0x40, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x0, 0x7a, 0x7, 0x2f, 0xff, 0xff, 0xff, 0xf5, + 0x3, 0xd0, 0x6d, 0x0, 0x0, 0x89, 0x0, 0x0, + 0xe, 0xdc, 0xf3, 0x0, 0x0, 0x89, 0x0, 0x0, + 0x3, 0x1c, 0x76, 0x7, 0xcc, 0xee, 0xcc, 0xb0, + 0x0, 0x8a, 0xc, 0x21, 0x22, 0x22, 0x22, 0x20, + 0x7, 0xe7, 0x9d, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xb8, 0x65, 0xb4, 0xee, 0xee, 0xee, 0x70, + 0x1, 0x1, 0x7, 0x4, 0xb0, 0x0, 0x9, 0x70, + 0x8, 0x68, 0x4b, 0x24, 0xb0, 0x0, 0x8, 0x70, + 0xa, 0x36, 0x76, 0x74, 0xb0, 0x0, 0x8, 0x70, + 0xd, 0x4, 0x92, 0x94, 0xc3, 0x33, 0x3a, 0x70, + 0x1b, 0x2, 0x70, 0x4, 0xfc, 0xcc, 0xcd, 0x70, + + /* U+7D61 "絡" */ + 0x0, 0x5, 0x30, 0x0, 0x5, 0x50, 0x0, 0x0, + 0x0, 0xe, 0x30, 0x0, 0xe, 0x40, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0x8f, 0xee, 0xee, 0x10, + 0x1, 0xe1, 0x5c, 0x5, 0xf8, 0x0, 0x7b, 0x0, + 0xb, 0x50, 0xd4, 0x4f, 0x6d, 0x22, 0xf3, 0x0, + 0x6f, 0xef, 0xa0, 0x45, 0x4, 0xdc, 0x70, 0x0, + 0x12, 0x4d, 0x52, 0x0, 0x0, 0xde, 0x0, 0x0, + 0x1, 0xd2, 0x68, 0x0, 0x2d, 0x98, 0xd3, 0x0, + 0x1d, 0xb8, 0xbe, 0x19, 0xe5, 0x0, 0x4e, 0xa0, + 0x3b, 0x85, 0x3c, 0x4b, 0xec, 0xcc, 0xce, 0x70, + 0x2, 0x3, 0x26, 0x3, 0xd2, 0x22, 0x2e, 0x10, + 0xe, 0xd, 0x1d, 0x3, 0xc0, 0x0, 0xe, 0x10, + 0xd, 0xc, 0x1c, 0x23, 0xc0, 0x0, 0xe, 0x10, + 0x4a, 0xb, 0x27, 0x33, 0xc2, 0x22, 0x2e, 0x10, + 0x65, 0x6, 0x10, 0x3, 0xfd, 0xdd, 0xdf, 0x10, + + /* U+7D66 "給" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0xe, 0x40, 0x0, 0x1, 0xf4, 0x0, 0x0, + 0x0, 0x6c, 0x0, 0x0, 0x9, 0xdd, 0x0, 0x0, + 0x0, 0xd3, 0x46, 0x0, 0x3d, 0xb, 0x90, 0x0, + 0x8, 0x80, 0xd4, 0x3, 0xe3, 0x1, 0xe6, 0x0, + 0x4f, 0xab, 0xb0, 0x4f, 0x50, 0x0, 0x3e, 0x80, + 0x37, 0x7f, 0x32, 0xe8, 0xee, 0xee, 0xe6, 0xd3, + 0x0, 0xb5, 0x67, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xa2, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xec, 0x9d, 0x1e, 0xfe, 0xee, 0xef, 0x10, + 0x2, 0x0, 0x25, 0xe, 0x20, 0x0, 0xf, 0x10, + 0xe, 0x1d, 0x3a, 0xe, 0x20, 0x0, 0xf, 0x10, + 0x1e, 0xd, 0x1c, 0xe, 0x20, 0x0, 0xf, 0x10, + 0x5a, 0xb, 0x33, 0xe, 0xcc, 0xcc, 0xcf, 0x10, + 0x44, 0x2, 0x0, 0xe, 0x53, 0x33, 0x3e, 0x10, + + /* U+7D71 "統" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0xb, 0x60, 0x0, 0x6, 0xa0, 0x0, 0x0, + 0x0, 0x3e, 0x0, 0x0, 0x1, 0xe2, 0x0, 0x0, + 0x0, 0xb6, 0x7, 0x6e, 0xef, 0xfe, 0xee, 0xe0, + 0x5, 0xc0, 0x8a, 0x0, 0xd, 0x50, 0x50, 0x0, + 0x2e, 0xa9, 0xe1, 0x0, 0x99, 0x0, 0xa7, 0x0, + 0x18, 0x6e, 0x61, 0x7, 0xe4, 0x46, 0x8f, 0x30, + 0x0, 0x89, 0x4b, 0x3f, 0xcb, 0x97, 0x67, 0xc0, + 0x6, 0xc3, 0x5f, 0x10, 0x43, 0x5, 0x20, 0x30, + 0x2f, 0xeb, 0x8c, 0x50, 0xa5, 0xb, 0x40, 0x0, + 0x1, 0x0, 0x24, 0x10, 0xb4, 0xb, 0x40, 0x0, + 0xa, 0x2d, 0x39, 0x0, 0xe1, 0xb, 0x40, 0x0, + 0xd, 0xc, 0xd, 0x4, 0xd0, 0xb, 0x40, 0x93, + 0x1d, 0xb, 0x25, 0x2d, 0x50, 0xb, 0x50, 0xb3, + 0x48, 0x5, 0x13, 0xe8, 0x0, 0x7, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + + /* U+7D75 "絵" */ + 0x0, 0x2, 0x10, 0x0, 0x0, 0x31, 0x0, 0x0, + 0x0, 0xc, 0x60, 0x0, 0x1, 0xe5, 0x0, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x9, 0xcd, 0x10, 0x0, + 0x0, 0xc5, 0x2a, 0x0, 0x3e, 0x17, 0xb0, 0x0, + 0x6, 0xa0, 0xb8, 0x2, 0xe3, 0x0, 0xab, 0x0, + 0x3f, 0xbc, 0xe0, 0x3e, 0x50, 0x0, 0xa, 0xc1, + 0x16, 0x5f, 0x51, 0xa5, 0xff, 0xff, 0xf9, 0x92, + 0x0, 0xa8, 0x4a, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xc2, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfc, 0xac, 0x7e, 0xef, 0xfe, 0xee, 0xd0, + 0x2, 0x0, 0x14, 0x10, 0xd, 0x40, 0x0, 0x0, + 0xa, 0x2c, 0x3a, 0x0, 0x7b, 0x0, 0x90, 0x0, + 0xd, 0xd, 0xd, 0x1, 0xe2, 0x0, 0x98, 0x0, + 0x1d, 0xb, 0x26, 0x2b, 0x81, 0x24, 0x6f, 0x30, + 0x49, 0x6, 0x20, 0xaf, 0xec, 0xb9, 0x89, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, + + /* U+7D93 "經" */ + 0x0, 0x7, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x6f, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x7a, 0x1, 0x0, 0x40, 0x13, 0x2, 0x20, + 0x0, 0xd2, 0x6b, 0x5, 0xb0, 0x88, 0xc, 0x40, + 0x9, 0x70, 0xe4, 0xd, 0x31, 0xd0, 0x5b, 0x0, + 0x4f, 0xef, 0xa0, 0x6a, 0xa, 0x60, 0xe3, 0x0, + 0x15, 0x4e, 0x42, 0x2d, 0x6, 0xb0, 0xa8, 0x0, + 0x0, 0xb6, 0x59, 0x8, 0x80, 0xb5, 0xe, 0x30, + 0x7, 0xb2, 0x5e, 0x1, 0xe1, 0x3d, 0x6, 0xb0, + 0x2f, 0xfc, 0xad, 0x31, 0x21, 0x12, 0x11, 0x20, + 0x2, 0x0, 0x15, 0x2e, 0xee, 0xfe, 0xee, 0x80, + 0xa, 0x2c, 0x49, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0xe, 0xc, 0x1d, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x1d, 0xb, 0x25, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x49, 0x4, 0x10, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7D9A "続" */ + 0x0, 0xc, 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, + 0x0, 0x59, 0x0, 0x7e, 0xee, 0xff, 0xee, 0xe1, + 0x0, 0xb1, 0x57, 0x0, 0x0, 0xa5, 0x0, 0x0, + 0x5, 0x60, 0xd3, 0xa, 0xaa, 0xec, 0xaa, 0x50, + 0x2e, 0xef, 0x90, 0x3, 0x33, 0x33, 0x33, 0x10, + 0x28, 0x5e, 0x10, 0x13, 0x33, 0x33, 0x33, 0x30, + 0x0, 0xa4, 0x74, 0x6d, 0xaa, 0xaa, 0xab, 0xf0, + 0x6, 0xb4, 0x9a, 0x68, 0x14, 0x2, 0x30, 0xf0, + 0x2f, 0xea, 0x7d, 0x45, 0x4b, 0x5, 0x90, 0x90, + 0x2, 0x0, 0x14, 0x0, 0x5a, 0x5, 0x90, 0x0, + 0x9, 0x4c, 0x2a, 0x0, 0x97, 0x5, 0x90, 0x0, + 0xc, 0x1b, 0x1c, 0x1, 0xe2, 0x5, 0x90, 0x53, + 0x1d, 0xa, 0x36, 0x3c, 0x80, 0x5, 0x90, 0x95, + 0x37, 0x3, 0x10, 0xd8, 0x0, 0x3, 0xff, 0xe1, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+7DAD "維" */ + 0x0, 0x5, 0x20, 0x0, 0x16, 0x23, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x6b, 0x4d, 0x0, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0xc5, 0xc, 0x40, 0x0, + 0x0, 0xd2, 0x5c, 0x2, 0xfc, 0xbc, 0xbb, 0xb0, + 0x7, 0x70, 0xd4, 0xb, 0xd3, 0x3f, 0x33, 0x30, + 0x3f, 0xbd, 0xb0, 0x4f, 0xc0, 0xf, 0x0, 0x0, + 0x28, 0x6e, 0x21, 0xb9, 0xd2, 0x2f, 0x22, 0x20, + 0x0, 0xa5, 0x3c, 0x23, 0xfc, 0xcf, 0xcc, 0x90, + 0x7, 0xa1, 0x3e, 0x33, 0xc0, 0xf, 0x0, 0x0, + 0x3f, 0xec, 0x9a, 0x83, 0xc0, 0xf, 0x0, 0x0, + 0x2, 0x0, 0x4, 0x3, 0xfe, 0xef, 0xee, 0xb0, + 0xc, 0x1c, 0xd, 0x3, 0xc0, 0xf, 0x0, 0x0, + 0xd, 0xc, 0x9, 0x53, 0xc0, 0xf, 0x0, 0x0, + 0x3a, 0xa, 0x23, 0x53, 0xfe, 0xef, 0xee, 0xe4, + 0x34, 0x2, 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, + + /* U+7DB2 "網" */ + 0x0, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe4, 0x1, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6b, 0x1, 0x1e, 0x4, 0x0, 0x50, 0xf0, 0xd, + 0x23, 0xe1, 0xe0, 0xc0, 0x1b, 0xf, 0x9, 0x70, + 0xc6, 0x1e, 0x8, 0x46, 0x60, 0xf3, 0xff, 0xfc, + 0x1, 0xe7, 0xba, 0xdb, 0x6f, 0x2, 0x2e, 0x44, + 0x1e, 0x23, 0xc3, 0x32, 0xf0, 0xc, 0x52, 0xd1, + 0xe0, 0x8, 0x50, 0xf, 0x9, 0xc5, 0x7f, 0x3e, + 0x7e, 0xee, 0xe5, 0xf2, 0xeb, 0x86, 0xa7, 0xe0, + 0xe0, 0x0, 0xf, 0x2, 0x3, 0x35, 0x1e, 0xe, + 0x0, 0x0, 0xf0, 0xb2, 0xd2, 0xc1, 0xe0, 0xfd, + 0xdd, 0x4f, 0xd, 0xc, 0xc, 0x2e, 0x0, 0x0, + 0x0, 0xf2, 0xb0, 0xb2, 0x32, 0xe0, 0x0, 0x0, + 0x1f, 0x24, 0x1, 0x0, 0x1e, 0x0, 0x0, 0xae, + 0x90, + + /* U+7DD1 "緑" */ + 0x0, 0x4, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x50, 0xa, 0xee, 0xee, 0xee, 0x0, + 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x0, 0xd4, 0xa, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x8, 0xa0, 0x8a, 0x4, 0xdd, 0xdd, 0xde, 0x0, + 0x4f, 0xbb, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x0, + 0x14, 0x3e, 0x53, 0x8e, 0xee, 0xee, 0xef, 0xe1, + 0x0, 0xb6, 0x1c, 0x1, 0x0, 0x96, 0x0, 0x10, + 0xa, 0xd6, 0x8f, 0x1b, 0x70, 0x96, 0x7, 0xb0, + 0x2d, 0xa7, 0x5a, 0x40, 0xc6, 0x99, 0x8a, 0x0, + 0x2, 0x3, 0x35, 0x0, 0x14, 0xdf, 0xa0, 0x0, + 0xc, 0x1d, 0x2a, 0x0, 0x8d, 0xc7, 0xd4, 0x0, + 0xe, 0xb, 0x1d, 0x4e, 0x90, 0x96, 0x2d, 0x80, + 0x3b, 0xa, 0x33, 0x44, 0x0, 0x96, 0x1, 0x81, + 0x35, 0x2, 0x0, 0x0, 0x2e, 0xe3, 0x0, 0x0, + + /* U+7DD2 "緒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x40, 0x0, 0x7, 0x80, 0x0, 0x10, + 0x0, 0x3d, 0x0, 0x3, 0x39, 0xa3, 0x28, 0x90, + 0x0, 0xb5, 0x35, 0xb, 0xbd, 0xeb, 0xad, 0x0, + 0x4, 0xb0, 0xb5, 0x0, 0x7, 0x80, 0xc4, 0x0, + 0x2e, 0x9a, 0xb0, 0x22, 0x29, 0xaa, 0xb2, 0x20, + 0x29, 0x7e, 0x20, 0xad, 0xdd, 0xfe, 0xdd, 0xd1, + 0x0, 0xb4, 0x56, 0x0, 0x3c, 0x70, 0x0, 0x0, + 0xa, 0xc8, 0xbb, 0x3a, 0xff, 0xee, 0xee, 0x30, + 0x2c, 0x96, 0x4c, 0xb7, 0xf0, 0x0, 0xc, 0x40, + 0x0, 0x1, 0x35, 0x0, 0xf0, 0x0, 0xc, 0x40, + 0xc, 0x2d, 0x49, 0x0, 0xfe, 0xdd, 0xdf, 0x40, + 0xe, 0xc, 0x1c, 0x0, 0xf0, 0x0, 0xc, 0x40, + 0x1c, 0xb, 0x29, 0x0, 0xf3, 0x22, 0x2d, 0x40, + 0x47, 0x6, 0x20, 0x0, 0xfb, 0xbb, 0xbe, 0x40, + + /* U+7DDA "線" */ + 0x0, 0x4, 0x20, 0x0, 0x0, 0x71, 0x0, 0x0, + 0x0, 0xe, 0x30, 0x0, 0x4, 0xd0, 0x0, 0x0, + 0x0, 0x6b, 0x0, 0xc, 0xde, 0xfd, 0xdd, 0x30, + 0x0, 0xd4, 0x4a, 0xe, 0x10, 0x0, 0xc, 0x40, + 0x7, 0xb0, 0xc4, 0xe, 0x31, 0x11, 0x1c, 0x40, + 0x3f, 0xaa, 0xa0, 0xe, 0xbb, 0xbb, 0xbe, 0x40, + 0x17, 0x6e, 0x30, 0xe, 0x10, 0x0, 0xc, 0x40, + 0x0, 0xb4, 0x76, 0xd, 0xdd, 0xfe, 0xde, 0x40, + 0xa, 0xc6, 0xab, 0x0, 0x0, 0xb5, 0x3, 0x30, + 0x1c, 0x96, 0x3d, 0x6e, 0xea, 0xbc, 0x3d, 0x30, + 0x3, 0x14, 0x63, 0x0, 0x97, 0xbe, 0xd2, 0x0, + 0xc, 0x2d, 0x57, 0x3, 0xe0, 0xb6, 0xd1, 0x0, + 0xe, 0xd, 0x1b, 0x2d, 0x40, 0xb4, 0x6c, 0x10, + 0x2b, 0xc, 0x11, 0xe5, 0x0, 0xc4, 0x6, 0xd0, + 0x24, 0x0, 0x0, 0x0, 0x7f, 0xd1, 0x0, 0x10, + + /* U+7DE0 "締" */ + 0x0, 0x3, 0x10, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0xd3, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x0, + 0x5b, 0x0, 0x9e, 0xee, 0xff, 0xee, 0xb0, 0xd, + 0x24, 0x80, 0xc, 0x0, 0xc, 0x10, 0x8, 0x70, + 0xd3, 0x0, 0xb4, 0x2, 0xb0, 0x3, 0xfe, 0xf9, + 0xb, 0xde, 0xdd, 0xee, 0xdc, 0x2, 0x2d, 0x43, + 0xd1, 0x0, 0x70, 0x0, 0xf0, 0xc, 0x33, 0x99, + 0x0, 0xe, 0x10, 0xa, 0xb, 0xc8, 0xbd, 0x1b, + 0xbb, 0xfc, 0xbb, 0x21, 0xb8, 0x53, 0xc2, 0xe2, + 0x2e, 0x42, 0xc3, 0x2, 0x3, 0x43, 0x1d, 0x0, + 0xe1, 0xb, 0x30, 0xb2, 0xd4, 0x81, 0xd0, 0xe, + 0x10, 0xb3, 0xd, 0xc, 0x1b, 0x1d, 0x0, 0xe1, + 0x2c, 0x32, 0xc0, 0xb2, 0x91, 0xa0, 0xe, 0x1c, + 0xa0, 0x47, 0x4, 0x10, 0x0, 0x0, 0xe1, 0x0, + 0x0, + + /* U+7DE9 "緩" */ + 0x0, 0x8, 0x30, 0x0, 0x13, 0x47, 0x9c, 0x20, + 0x0, 0x1e, 0x0, 0x7d, 0xcb, 0xa7, 0x54, 0x0, + 0x0, 0x78, 0x1, 0x9, 0x4, 0xb0, 0x1e, 0x10, + 0x0, 0xe1, 0x78, 0x9, 0x60, 0xe0, 0x88, 0x0, + 0x9, 0x70, 0xd1, 0x3, 0x70, 0x71, 0xe1, 0x0, + 0x4f, 0xbd, 0x70, 0x3e, 0xee, 0xee, 0xfe, 0x90, + 0x15, 0x5c, 0x22, 0x0, 0x3c, 0x0, 0x0, 0x0, + 0x0, 0xb2, 0x2b, 0x7a, 0xce, 0xaa, 0xaa, 0xa0, + 0xa, 0xa7, 0x9f, 0x32, 0xa9, 0x22, 0x22, 0x20, + 0x2b, 0x85, 0x36, 0x20, 0xdd, 0xbb, 0xba, 0x0, + 0x3, 0x4, 0x27, 0x2, 0xfd, 0x32, 0x9b, 0x0, + 0xc, 0x1c, 0xc, 0x7, 0x99, 0xa3, 0xe2, 0x0, + 0xd, 0xb, 0x1a, 0x3e, 0x20, 0xcf, 0x50, 0x0, + 0x3a, 0xa, 0x33, 0xc7, 0x3b, 0xd9, 0xe7, 0x10, + 0x24, 0x0, 0x2, 0x95, 0xd7, 0x0, 0x29, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7DF4 "練" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x50, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x9e, 0xee, 0xfe, 0xee, 0xe1, + 0x0, 0xa6, 0x4b, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x4, 0xb0, 0xc4, 0x1, 0x11, 0xd5, 0x11, 0x10, + 0x2e, 0x99, 0xb0, 0x2e, 0xcc, 0xec, 0xcd, 0x90, + 0x28, 0x7e, 0x20, 0x2b, 0x61, 0xb2, 0x68, 0x90, + 0x0, 0x95, 0x49, 0x2b, 0x47, 0xb2, 0xb5, 0x90, + 0x7, 0xb3, 0x5e, 0x2b, 0x5, 0xb3, 0x45, 0x90, + 0x3f, 0xda, 0x8d, 0x4e, 0xef, 0xff, 0xee, 0x80, + 0x1, 0x1, 0x26, 0x0, 0xd, 0xfd, 0x50, 0x0, + 0xc, 0x2c, 0x3a, 0x0, 0x98, 0xc4, 0xc3, 0x0, + 0xe, 0xb, 0x1c, 0x9, 0xb0, 0xc3, 0x2d, 0x40, + 0x2b, 0xa, 0x25, 0x9a, 0x0, 0xc3, 0x2, 0xd1, + 0x45, 0x3, 0x10, 0x0, 0x0, 0xc3, 0x0, 0x0, + + /* U+7E3D "總" */ + 0x0, 0x3, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x3, 0xc0, 0x0, 0x0, + 0x0, 0x69, 0x0, 0xd, 0xee, 0xee, 0xee, 0x80, + 0x0, 0xd2, 0x48, 0xd, 0x2, 0x80, 0x6, 0x80, + 0x6, 0x90, 0xc4, 0xd, 0xb, 0xaa, 0xe6, 0x80, + 0x2f, 0x9a, 0xb0, 0xd, 0x77, 0x65, 0x66, 0x80, + 0x18, 0x6e, 0x20, 0xd, 0x0, 0xaf, 0x16, 0x80, + 0x0, 0x87, 0x66, 0xd, 0x2a, 0x95, 0xb6, 0x80, + 0x4, 0xb1, 0x6c, 0xd, 0x56, 0x33, 0x48, 0x80, + 0x2f, 0xeb, 0x8d, 0x19, 0xaa, 0xba, 0xaa, 0x60, + 0x3, 0x0, 0x23, 0x1, 0x12, 0xb4, 0x5, 0x0, + 0x8, 0x5c, 0x48, 0xd, 0x68, 0x1d, 0x1b, 0x40, + 0xb, 0x2b, 0x1c, 0x4a, 0x68, 0x2, 0x25, 0xd0, + 0xd, 0xa, 0x26, 0xb4, 0x68, 0x0, 0x49, 0x92, + 0x28, 0x4, 0x10, 0x10, 0x3e, 0xee, 0xe4, 0x0, + + /* U+7E3E "績" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x40, 0x7c, 0xcc, 0xfd, 0xcc, 0x80, + 0x0, 0x2c, 0x1, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0xb4, 0x4c, 0x2c, 0xcc, 0xfd, 0xcc, 0x30, + 0x5, 0x90, 0xc4, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x2f, 0xcc, 0xa2, 0xdd, 0xdd, 0xfd, 0xdd, 0xd3, + 0x15, 0x4d, 0x31, 0x4, 0x44, 0x44, 0x44, 0x10, + 0x0, 0xb4, 0x48, 0x1e, 0x66, 0x66, 0x6d, 0x40, + 0x9, 0xc7, 0xad, 0x1f, 0xaa, 0xaa, 0xae, 0x40, + 0x1c, 0x97, 0x4c, 0x3e, 0x0, 0x0, 0xc, 0x40, + 0x1, 0x2, 0x35, 0x2f, 0xaa, 0xaa, 0xae, 0x40, + 0xb, 0x2c, 0x38, 0x1e, 0x0, 0x0, 0xc, 0x40, + 0xd, 0xc, 0xc, 0x1b, 0xbb, 0xbb, 0xbb, 0x30, + 0x1c, 0xb, 0x16, 0x4, 0xd7, 0x3, 0xd5, 0x0, + 0x59, 0x6, 0x13, 0xdb, 0x30, 0x0, 0x2b, 0xb0, + 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x30, + + /* U+7E54 "織" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x0, 0x8, 0x60, 0xd, 0x12, 0x0, + 0x0, 0x68, 0x6, 0xdd, 0xfd, 0xad, 0x3d, 0x10, + 0x0, 0xc1, 0xa3, 0x82, 0xb, 0x1c, 0x26, 0x90, + 0x7, 0x72, 0xc0, 0x75, 0x1d, 0xc, 0x20, 0x70, + 0x2f, 0xdf, 0x48, 0xcd, 0xce, 0xbe, 0xcb, 0xb0, + 0x3, 0x3b, 0x32, 0x33, 0x33, 0x3b, 0x63, 0x30, + 0x0, 0xb2, 0xa0, 0xbc, 0xcc, 0x59, 0x54, 0x70, + 0x6, 0xa6, 0xd2, 0xd0, 0x7, 0x67, 0x6a, 0x40, + 0x1f, 0xda, 0xa4, 0xd0, 0x8, 0x66, 0x9d, 0x0, + 0x2, 0x0, 0x31, 0xeb, 0xbd, 0x63, 0xf6, 0x0, + 0xa, 0x48, 0xb0, 0xd0, 0x7, 0x63, 0xf0, 0x20, + 0xc, 0xb, 0x74, 0xec, 0xce, 0x9d, 0xd2, 0x92, + 0xc, 0xc, 0x26, 0xc0, 0x6, 0xf3, 0x79, 0xc0, + 0x38, 0x4, 0x0, 0x0, 0xd, 0x40, 0xc, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7E70 "繰" */ + 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x1, 0xfc, 0xcc, 0xe6, 0x0, + 0x0, 0x6a, 0x0, 0x1, 0xe0, 0x0, 0x96, 0x0, + 0x0, 0xd2, 0x59, 0x1, 0xf6, 0x66, 0xc6, 0x0, + 0x7, 0x90, 0xd4, 0x0, 0x66, 0x66, 0x62, 0x0, + 0x2f, 0xcc, 0xa0, 0x8d, 0xcd, 0x2c, 0xcc, 0xd0, + 0x17, 0x5e, 0x30, 0x84, 0xb, 0x2d, 0x0, 0xe0, + 0x0, 0xb4, 0x84, 0x85, 0xc, 0x2d, 0x0, 0xe0, + 0x7, 0xc6, 0xb9, 0x6b, 0xbb, 0xab, 0xbb, 0xb0, + 0x2f, 0xda, 0x7c, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x36, 0xce, 0xef, 0xff, 0xee, 0xe1, + 0xa, 0x3c, 0x74, 0x0, 0x5c, 0xea, 0x80, 0x0, + 0xd, 0xd, 0x29, 0x6, 0xd1, 0xe2, 0xa9, 0x0, + 0x1d, 0xc, 0x6, 0xda, 0x10, 0xe1, 0x8, 0xd2, + 0x48, 0x4, 0x0, 0x30, 0x0, 0xe1, 0x0, 0x20, + + /* U+7E7C "繼" */ + 0x0, 0x6, 0x0, 0x0, 0x4, 0x0, 0x41, 0x0, + 0x0, 0x2d, 0x0, 0xe1, 0x66, 0x0, 0xc0, 0x0, + 0x0, 0x87, 0x0, 0xe1, 0xb4, 0x66, 0x58, 0x20, + 0x0, 0xd1, 0x94, 0xe8, 0xed, 0x1f, 0xda, 0x0, + 0x7, 0x81, 0xe0, 0xe1, 0x75, 0x51, 0xb5, 0x40, + 0x2f, 0x9c, 0x70, 0xe6, 0xfb, 0xbb, 0xdb, 0x90, + 0x19, 0x7d, 0x0, 0xe3, 0x20, 0x64, 0x10, 0x70, + 0x0, 0xa4, 0xc0, 0xed, 0xcc, 0xcc, 0xdc, 0xb0, + 0x5, 0xa0, 0xb2, 0xe1, 0x48, 0x0, 0xb1, 0x0, + 0x1f, 0xed, 0xc6, 0xe1, 0xb2, 0x53, 0x84, 0x20, + 0x2, 0x0, 0x53, 0xe7, 0xed, 0x3d, 0xcc, 0x0, + 0x9, 0x49, 0xa1, 0xe2, 0x58, 0x31, 0x95, 0x40, + 0xd, 0xb, 0x65, 0xe5, 0xea, 0xb8, 0xda, 0x90, + 0xc, 0xc, 0x28, 0xe4, 0x41, 0x74, 0x31, 0x60, + 0x49, 0xa, 0x0, 0xcd, 0xdd, 0xdd, 0xdd, 0xd5, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7E8C "續" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x21, 0xcc, 0xcc, 0xfc, 0xcc, 0xc0, + 0x0, 0x4a, 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0xb3, 0x78, 0x6e, 0xee, 0xee, 0xee, 0x60, + 0x4, 0xa0, 0xd2, 0x22, 0x22, 0x22, 0x22, 0x20, + 0x1e, 0x9a, 0x80, 0xf9, 0xae, 0x9c, 0xb9, 0xe0, + 0x29, 0x8d, 0x0, 0xe0, 0x2b, 0x8, 0x50, 0xe0, + 0x0, 0xa3, 0x84, 0xbb, 0xbb, 0xbb, 0xbb, 0xb0, + 0x9, 0xb5, 0x9a, 0x59, 0x88, 0x88, 0x89, 0x40, + 0x1c, 0x96, 0x4d, 0x7c, 0x88, 0x88, 0x8d, 0x60, + 0x2, 0x13, 0x72, 0x79, 0x22, 0x22, 0x2a, 0x60, + 0xb, 0x3c, 0x67, 0x7b, 0x77, 0x77, 0x7c, 0x60, + 0xd, 0xd, 0x1b, 0x7d, 0xbb, 0xab, 0xbd, 0x60, + 0x1c, 0xc, 0x6, 0x4, 0xc6, 0x5, 0xc6, 0x0, + 0x59, 0x6, 0x3, 0xda, 0x30, 0x0, 0x29, 0xd1, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+7EDF "统" */ + 0x0, 0x2, 0x10, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0xa, 0xa0, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x0, 0x1f, 0x20, 0x0, 0x0, 0xb4, 0x0, 0x0, + 0x0, 0x9a, 0x0, 0x7e, 0xef, 0xfe, 0xee, 0xe1, + 0x2, 0xe1, 0x2c, 0x0, 0x1e, 0x40, 0x10, 0x0, + 0xc, 0x72, 0xb9, 0x0, 0xb8, 0x0, 0xd3, 0x0, + 0x5f, 0xfe, 0xe0, 0x7, 0xc0, 0x1, 0x6d, 0x0, + 0x2, 0x1e, 0x40, 0x9f, 0xee, 0xed, 0xcc, 0x80, + 0x0, 0xb7, 0x0, 0x34, 0x92, 0x7, 0x11, 0x90, + 0x9, 0xe9, 0xcc, 0x0, 0xf1, 0xd, 0x30, 0x0, + 0x3e, 0xa7, 0x30, 0x0, 0xf0, 0xd, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xd0, 0xd, 0x30, 0x0, + 0x0, 0x38, 0xcd, 0xa, 0x80, 0xd, 0x30, 0xa2, + 0x3e, 0xd8, 0x30, 0x7e, 0x10, 0xd, 0x30, 0xd2, + 0x2, 0x0, 0xb, 0xc2, 0x0, 0x9, 0xff, 0xc0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+7F3A "缺" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x7, 0xc8, 0x88, 0x60, 0x0, 0xe1, 0x0, 0x0, + 0xc, 0x4b, 0x83, 0x23, 0xee, 0xfe, 0xed, 0x0, + 0x5a, 0xa, 0x50, 0x0, 0x11, 0xe3, 0x3e, 0x0, + 0x33, 0xa, 0x50, 0x0, 0x0, 0xe1, 0x1e, 0x0, + 0x13, 0x3b, 0x73, 0x30, 0x0, 0xe1, 0x1e, 0x0, + 0x5b, 0xbe, 0xdb, 0xb0, 0x0, 0xf0, 0x1e, 0x0, + 0x4, 0xa, 0x51, 0x38, 0xdd, 0xfd, 0xdf, 0xc0, + 0xd, 0xa, 0x53, 0xa0, 0x3, 0xfe, 0x10, 0x0, + 0xd, 0xa, 0x53, 0xa0, 0x6, 0x9d, 0x50, 0x0, + 0xd, 0xa, 0x53, 0xa0, 0xc, 0x45, 0xc0, 0x0, + 0xe, 0x3c, 0xaa, 0xa0, 0x5e, 0x0, 0xe5, 0x0, + 0xc, 0xa8, 0x66, 0xa2, 0xe5, 0x0, 0x4f, 0x50, + 0x0, 0x0, 0x0, 0x1c, 0x80, 0x0, 0x5, 0xe1, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+7F6E "置" */ + 0x1, 0xfc, 0xce, 0xec, 0xce, 0xec, 0xcf, 0x40, + 0x1, 0xe0, 0x6, 0x90, 0x9, 0x60, 0xc, 0x40, + 0x1, 0xfa, 0xac, 0xda, 0xad, 0xca, 0xae, 0x40, + 0x0, 0x22, 0x22, 0x2c, 0x72, 0x22, 0x22, 0x0, + 0xc, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0xa0, + 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xcb, 0xce, 0xbb, 0xbc, 0xb0, 0x0, + 0x0, 0xe, 0x43, 0x33, 0x33, 0x35, 0xd0, 0x0, + 0x0, 0xe, 0x76, 0x66, 0x66, 0x68, 0xd0, 0x0, + 0x0, 0xe, 0xba, 0xaa, 0xaa, 0xab, 0xd0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x2, 0xd0, 0x0, + 0x0, 0xe, 0xba, 0xaa, 0xaa, 0xab, 0xd0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x2, 0xd0, 0x0, + 0xc, 0xcf, 0xdc, 0xcc, 0xcc, 0xcd, 0xfc, 0xc1, + + /* U+7F8E "美" */ + 0x0, 0x0, 0x30, 0x0, 0x0, 0x3, 0x0, 0x0, + 0x0, 0x1, 0xe4, 0x0, 0x0, 0x5e, 0x10, 0x0, + 0x0, 0x0, 0x5c, 0x0, 0x1, 0xe5, 0x0, 0x0, + 0x6, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x60, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x9e, 0xee, 0xef, 0xfe, 0xee, 0xea, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x2, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x20, + 0x1c, 0xcc, 0xcc, 0xcf, 0xec, 0xcc, 0xcc, 0xc2, + 0x0, 0x0, 0x0, 0xd, 0x50, 0x0, 0x0, 0x0, + 0xa, 0xee, 0xee, 0xff, 0xfe, 0xee, 0xee, 0xe0, + 0x0, 0x0, 0x0, 0x9a, 0xb7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xe2, 0x1e, 0x80, 0x0, 0x0, + 0x0, 0x15, 0xcd, 0x20, 0x1, 0xbd, 0x61, 0x0, + 0x1d, 0xfb, 0x50, 0x0, 0x0, 0x4, 0xbf, 0xd1, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+7FA9 "義" */ + 0x0, 0x0, 0x61, 0x0, 0x0, 0x26, 0x0, 0x0, + 0x0, 0x0, 0x7c, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x5, 0xdd, 0xef, 0xed, 0xde, 0xfe, 0xdd, 0x60, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x7d, 0xdd, 0xde, 0xed, 0xdd, 0xd7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1c, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0xc1, + 0x3, 0x45, 0x68, 0xaa, 0x59, 0x37, 0x53, 0x30, + 0x9, 0xba, 0xd9, 0x31, 0x2e, 0x5, 0xda, 0x0, + 0x1, 0x11, 0xb6, 0x11, 0x2f, 0x11, 0x27, 0x10, + 0x1c, 0xcc, 0xed, 0xcc, 0xce, 0xdc, 0xcc, 0xc1, + 0x0, 0x1, 0xb8, 0x45, 0x26, 0xa1, 0xb6, 0x0, + 0x1c, 0xba, 0xda, 0x65, 0x10, 0xed, 0x50, 0x20, + 0x0, 0x0, 0xa5, 0x3, 0x9d, 0xae, 0x61, 0xb4, + 0x0, 0xad, 0xd3, 0x2c, 0x60, 0x1, 0xae, 0xb0, + + /* U+7FD2 "習" */ + 0xae, 0xee, 0xef, 0x2b, 0xee, 0xee, 0xf2, 0x3, + 0x10, 0xd, 0x20, 0x30, 0x0, 0xc2, 0x7, 0xd9, + 0xd, 0x21, 0xae, 0x70, 0xc2, 0x0, 0x6, 0x9f, + 0x20, 0x1, 0x8b, 0xf2, 0x5, 0xcc, 0x5d, 0x20, + 0x6d, 0xa2, 0xc2, 0xaa, 0x30, 0xd, 0x37, 0x92, + 0x0, 0xc2, 0x0, 0x0, 0x3, 0xf5, 0x0, 0x0, + 0x41, 0x0, 0x11, 0x16, 0xe2, 0x11, 0x11, 0x0, + 0x0, 0xfc, 0xbb, 0xbb, 0xbb, 0xbf, 0x20, 0x0, + 0xf0, 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0xfe, + 0xdd, 0xdd, 0xdd, 0xdf, 0x20, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0x20, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0xf, 0x20, 0x0, 0xfd, 0xdd, 0xdd, 0xdd, + 0xdf, 0x20, + + /* U+8001 "老" */ + 0x0, 0x0, 0x0, 0x97, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x7d, 0x10, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x97, 0x0, 0x6e, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x97, 0x9, 0xd1, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x1, 0x7f, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3c, 0xd3, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x3b, 0xef, 0x40, 0x2, 0x8e, 0xa0, 0x0, + 0x2c, 0xe7, 0xc, 0x78, 0xdd, 0x82, 0x0, 0x0, + 0x5, 0x0, 0xc, 0xb6, 0x10, 0x0, 0x1, 0x0, + 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x7, 0x80, + 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0xc, 0x60, + 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xfb, 0x0, + + /* U+8003 "考" */ + 0x0, 0x0, 0x0, 0x4c, 0x0, 0x0, 0x7, 0x0, + 0x0, 0x4b, 0xbb, 0xcf, 0xbb, 0xb3, 0xa9, 0x0, + 0x0, 0x13, 0x33, 0x6d, 0x33, 0x4b, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x4c, 0x2, 0xd7, 0x0, 0x0, + 0xb, 0xdd, 0xdd, 0xef, 0xdf, 0xfd, 0xdd, 0xd0, + 0x1, 0x11, 0x11, 0x2b, 0xd3, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x6, 0xea, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xcf, 0xfe, 0xee, 0xee, 0xe7, 0x0, + 0x5, 0xce, 0x6c, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x60, 0x3f, 0x43, 0x33, 0x33, 0x20, 0x0, + 0x0, 0x0, 0x6a, 0xaa, 0xaa, 0xad, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfe, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8005 "者" */ + 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x5, 0x0, + 0x0, 0x11, 0x11, 0x99, 0x11, 0x11, 0x7d, 0x10, + 0x0, 0x9c, 0xcc, 0xee, 0xcc, 0xcd, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x88, 0x0, 0x8d, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x88, 0x1b, 0xc1, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe1, + 0x0, 0x0, 0x2, 0xab, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xaf, 0xeb, 0xbb, 0xbb, 0xb1, 0x0, + 0x17, 0xdc, 0xd7, 0x33, 0x33, 0x33, 0xf2, 0x0, + 0x1b, 0x40, 0xb5, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x0, 0xbe, 0xdd, 0xdd, 0xdd, 0xf2, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x0, 0xb5, 0x0, 0x0, 0x0, 0xf2, 0x0, + 0x0, 0x0, 0xbf, 0xee, 0xee, 0xee, 0xe2, 0x0, + + /* U+800C "而" */ + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x1, 0x11, 0x11, 0x1e, 0x61, 0x11, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x1f, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x4, 0xc0, 0x8, 0x80, 0xa, 0x60, 0xb, 0x50, + 0x4, 0xc0, 0x8, 0x80, 0xa, 0x60, 0xb, 0x50, + 0x4, 0xc0, 0x8, 0x80, 0xa, 0x60, 0xb, 0x50, + 0x4, 0xc0, 0x8, 0x80, 0xa, 0x60, 0xb, 0x50, + 0x4, 0xc0, 0x8, 0x80, 0xa, 0x60, 0xb, 0x50, + 0x4, 0xc0, 0x8, 0x80, 0xa, 0x60, 0xb, 0x50, + 0x4, 0xc0, 0x8, 0x80, 0xa, 0x60, 0xb, 0x50, + 0x4, 0xc0, 0x8, 0x80, 0xa, 0x61, 0x1c, 0x50, + 0x4, 0xc0, 0x8, 0x80, 0xa, 0x6c, 0xeb, 0x10, + + /* U+8033 "耳" */ + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0x17, 0xb1, 0x11, 0x11, 0x1b, 0x81, 0x10, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x6, 0xb2, 0x22, 0x22, 0x2b, 0x70, 0x0, + 0x0, 0x6, 0xfd, 0xdd, 0xdd, 0xdf, 0x70, 0x0, + 0x0, 0x6, 0xb0, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x6, 0xb1, 0x23, 0x45, 0x6c, 0xb8, 0x91, + 0x1d, 0xef, 0xff, 0xfd, 0xcb, 0xad, 0xb7, 0x50, + 0x4, 0x32, 0x10, 0x0, 0x0, 0xa, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x70, 0x0, + + /* U+805E "聞" */ + 0xcd, 0xcc, 0xcf, 0x25, 0xec, 0xcc, 0xf2, 0xc4, + 0x0, 0xd, 0x25, 0xa0, 0x0, 0xd2, 0xcd, 0xcc, + 0xcf, 0x25, 0xec, 0xcc, 0xf2, 0xc4, 0x0, 0xd, + 0x25, 0xa0, 0x0, 0xd2, 0xcc, 0xaa, 0xaf, 0x25, + 0xea, 0xaa, 0xf2, 0xc6, 0x22, 0x22, 0x0, 0x22, + 0x22, 0xe2, 0xc4, 0x1d, 0xdd, 0xdd, 0xdd, 0xc0, + 0xd2, 0xc4, 0x0, 0xe0, 0x0, 0x4a, 0x0, 0xd2, + 0xc4, 0x0, 0xeb, 0xbb, 0xca, 0x0, 0xd2, 0xc4, + 0x0, 0xe0, 0x0, 0x4a, 0x0, 0xd2, 0xc4, 0x0, + 0xeb, 0xbb, 0xca, 0x0, 0xd2, 0xc4, 0x28, 0xfb, + 0xbc, 0xef, 0xd5, 0xd2, 0xc4, 0x15, 0x43, 0x21, + 0x4a, 0x1, 0xe2, 0xc4, 0x0, 0x0, 0x0, 0x37, + 0x5f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+806F "聯" */ + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x32, 0x0, + 0x3f, 0xff, 0xff, 0x16, 0x80, 0x0, 0xd3, 0x0, + 0x4, 0x90, 0x95, 0xc, 0x16, 0x5, 0x92, 0x40, + 0x4, 0x90, 0x95, 0x77, 0x68, 0x1c, 0x2a, 0x40, + 0x4, 0xa2, 0xa5, 0xef, 0xe0, 0x6f, 0xfa, 0x0, + 0x4, 0xec, 0xe5, 0x19, 0x42, 0x0, 0xb1, 0x40, + 0x4, 0x90, 0x95, 0x78, 0x2c, 0x1b, 0x53, 0xd1, + 0x4, 0xb3, 0xb6, 0xdb, 0x8a, 0x8b, 0x97, 0x77, + 0x4, 0xff, 0xf5, 0x37, 0xc, 0xa, 0x0, 0x10, + 0x4, 0xa1, 0xa5, 0x39, 0xe, 0xd, 0x12, 0xc0, + 0x4, 0x90, 0x95, 0x39, 0xe, 0xd, 0x12, 0xc0, + 0x4, 0xb5, 0xcc, 0x4e, 0xbe, 0xd, 0xcc, 0xc0, + 0x4f, 0xda, 0xd8, 0x12, 0x5a, 0xd, 0x44, 0xa0, + 0x0, 0x0, 0x95, 0x0, 0xb3, 0xd, 0x10, 0x0, + 0x0, 0x0, 0x95, 0x1c, 0x40, 0xd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8072 "聲" */ + 0xa, 0xaa, 0xfa, 0xaa, 0xc, 0xcc, 0xe6, 0x0, + 0x3, 0x77, 0xf7, 0x73, 0x2e, 0x0, 0x78, 0x31, + 0x2, 0x55, 0x55, 0x53, 0xd6, 0x11, 0x3b, 0xa2, + 0x4, 0xda, 0xea, 0xc7, 0x5e, 0xb9, 0xaf, 0x20, + 0x5, 0x80, 0xd0, 0x67, 0x2, 0xd4, 0xc7, 0x0, + 0x9, 0xca, 0xaa, 0xa4, 0x15, 0xbe, 0xd6, 0x20, + 0xc, 0x0, 0x0, 0x0, 0xa7, 0x20, 0x16, 0xb2, + 0xd, 0xdf, 0xed, 0xdd, 0xdd, 0xdd, 0xfd, 0xd3, + 0x0, 0xa, 0x95, 0x55, 0x55, 0x57, 0xd0, 0x0, + 0x0, 0xa, 0xa6, 0x66, 0x66, 0x68, 0xd0, 0x0, + 0x0, 0xa, 0xdb, 0xbb, 0xbb, 0xbc, 0xd0, 0x0, + 0x0, 0xa, 0x60, 0x0, 0x0, 0x3, 0xe1, 0x20, + 0xc, 0xdf, 0xee, 0xed, 0xdd, 0xdd, 0xfc, 0xb3, + 0x1, 0x10, 0x0, 0x0, 0x0, 0x2, 0xd0, 0x0, + + /* U+8077 "職" */ + 0x1f, 0xff, 0xfe, 0x1, 0xd1, 0x5, 0xa7, 0x20, + 0x3, 0xa0, 0xa3, 0xcd, 0xfe, 0xd7, 0xa5, 0xa0, + 0x3, 0xa0, 0xa3, 0x27, 0x4, 0x74, 0xb0, 0xd2, + 0x3, 0xd9, 0xd3, 0xc, 0x8, 0x53, 0xb0, 0x20, + 0x3, 0xc5, 0xc4, 0xcf, 0xcf, 0xdd, 0xfc, 0xc5, + 0x3, 0xa0, 0xa3, 0x22, 0x22, 0x24, 0xe2, 0x21, + 0x3, 0xa0, 0xa3, 0x4b, 0xbb, 0x90, 0xe0, 0x52, + 0x3, 0xfe, 0xf3, 0x69, 0x33, 0xd0, 0xf0, 0xe2, + 0x3, 0xa0, 0xa3, 0x68, 0x0, 0xd0, 0xd6, 0xb0, + 0x3, 0xa0, 0xa3, 0x6d, 0xbb, 0xd0, 0xae, 0x30, + 0x5, 0xc9, 0xec, 0x67, 0x0, 0xd0, 0x9a, 0x5, + 0x1c, 0x84, 0xa3, 0x6e, 0xcc, 0xd4, 0xeb, 0xb, + 0x0, 0x0, 0xa3, 0x67, 0x0, 0x9a, 0x1e, 0x88, + 0x0, 0x0, 0xa3, 0x0, 0x3, 0xa0, 0x5, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+807D "聽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xfe, 0xef, 0xe1, 0x0, 0x5a, 0x0, 0x0, + 0x3, 0xb0, 0xc, 0x3d, 0xdd, 0xfe, 0xdd, 0xd3, + 0x3, 0xe8, 0x8e, 0x30, 0x0, 0xa4, 0x0, 0x0, + 0x3, 0xc3, 0x3d, 0x38, 0xdd, 0xfd, 0xdd, 0xc0, + 0x3, 0xe8, 0x8e, 0x39, 0x44, 0x61, 0x90, 0xe0, + 0x3, 0xc3, 0x3d, 0x39, 0x44, 0x61, 0x90, 0xe0, + 0x18, 0xd8, 0x9e, 0x38, 0xdd, 0xdd, 0xdd, 0xc0, + 0x28, 0x76, 0x5d, 0x33, 0x33, 0x33, 0x33, 0x31, + 0xc, 0xcc, 0x8c, 0x4a, 0xaa, 0xaa, 0xaa, 0xa4, + 0x0, 0x75, 0xc, 0x30, 0x0, 0xc2, 0x1, 0x0, + 0x9, 0xdd, 0x6c, 0x35, 0x5b, 0x3d, 0xa, 0x50, + 0x0, 0x75, 0xc, 0x3c, 0x3d, 0x7, 0x24, 0xd1, + 0x17, 0xcd, 0xac, 0x8a, 0x1d, 0x0, 0xc, 0x77, + 0x16, 0x41, 0xc, 0x51, 0xd, 0xdd, 0xe7, 0x0, + + /* U+8089 "肉" */ + 0x0, 0x0, 0x0, 0xf, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3d, 0x0, 0x0, + 0xba, 0x0, 0x0, 0x3d, 0x3d, 0x0, 0x4, 0xed, + 0xb2, 0x0, 0x2d, 0x3d, 0x0, 0x4e, 0x30, 0x7e, + 0x80, 0x2d, 0x3d, 0x1b, 0xe4, 0x19, 0x2, 0xca, + 0x2d, 0x3d, 0x4, 0x0, 0x6b, 0x0, 0x1, 0x2d, + 0x3d, 0x0, 0x0, 0xee, 0x30, 0x0, 0x2d, 0x3d, + 0x0, 0xa, 0xa4, 0xe8, 0x0, 0x2d, 0x3d, 0x4, + 0xcb, 0x0, 0x1b, 0xc1, 0x2d, 0x3d, 0x2c, 0x50, + 0x0, 0x0, 0x87, 0x2d, 0x3d, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x4d, 0x3d, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+80A9 "肩" */ + 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, 0xce, + 0xee, 0xef, 0xfe, 0xee, 0xe3, 0x0, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0x0, 0xdf, 0xee, 0xee, 0xee, + 0xee, 0xe3, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe3, 0xed, 0xdd, 0xdd, 0xdd, 0xe8, + 0x0, 0xf1, 0xe2, 0x0, 0x0, 0x0, 0x88, 0x1, + 0xf0, 0xec, 0xcc, 0xcc, 0xcc, 0xe8, 0x5, 0xc0, + 0xe2, 0x0, 0x0, 0x0, 0x88, 0x9, 0x80, 0xe3, + 0x0, 0x0, 0x0, 0x88, 0xe, 0x30, 0xec, 0xbb, + 0xbb, 0xbb, 0xe8, 0x7b, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0x98, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xae, + 0xc3, + + /* U+80AF "肯" */ + 0x0, 0x79, 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, + 0x79, 0x0, 0x8f, 0xee, 0xee, 0x50, 0x0, 0x79, + 0x0, 0x88, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x88, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xfe, 0xee, 0xee, 0xee, 0xef, + 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0xfd, 0xdd, 0xdd, 0xdd, 0xdf, 0x0, 0x0, + 0xf1, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0xfc, + 0xbb, 0xbb, 0xbb, 0xcf, 0x0, 0x0, 0xf3, 0x22, + 0x22, 0x22, 0x3f, 0x0, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0x0, 0xf1, 0x0, 0x0, 0x7f, + 0xea, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+80B2 "育" */ + 0x0, 0x0, 0x0, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xb0, 0x0, 0x0, 0x0, 0xee, + 0xee, 0xee, 0xff, 0xfe, 0xee, 0xee, 0x0, 0x0, + 0x3e, 0x70, 0x2, 0xe4, 0x0, 0x0, 0x0, 0x5e, + 0x50, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x8f, 0xed, + 0xde, 0xee, 0xdc, 0xe8, 0x0, 0x2, 0x43, 0x21, + 0x0, 0x0, 0x1, 0x91, 0x0, 0xb, 0xee, 0xee, + 0xee, 0xee, 0xd0, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0xc, 0xdb, 0xbb, 0xbb, + 0xbc, 0xe0, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, + 0x3e, 0x0, 0x0, 0xc, 0x62, 0x22, 0x22, 0x24, + 0xe0, 0x0, 0x0, 0xcc, 0xaa, 0xaa, 0xaa, 0xbe, + 0x0, 0x0, 0xc, 0x40, 0x0, 0x0, 0x3, 0xe0, + 0x0, 0x0, 0xc4, 0x0, 0x1, 0xed, 0xd8, 0x0, + 0x0, + + /* U+80CC "背" */ + 0x0, 0x0, 0xe, 0x20, 0x2e, 0x0, 0x15, 0x0, + 0xd, 0xdd, 0xdf, 0x20, 0x2f, 0x7c, 0xd7, 0x10, + 0x0, 0x0, 0xe, 0x20, 0x2f, 0x72, 0x0, 0x0, + 0x0, 0x1, 0x4f, 0x20, 0x2e, 0x0, 0x0, 0x90, + 0x3b, 0xee, 0xaf, 0x20, 0x2f, 0x65, 0x56, 0xe0, + 0x15, 0x10, 0xd, 0x20, 0x8, 0xbb, 0xbb, 0x50, + 0x0, 0xe, 0xdd, 0xdd, 0xdd, 0xdd, 0xe0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xe, 0xdc, 0xcc, 0xcc, 0xcd, 0xe0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xe, 0x31, 0x11, 0x11, 0x14, 0xe0, 0x0, + 0x0, 0xe, 0xbb, 0xbb, 0xbb, 0xbb, 0xe0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x6, 0xee, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+80F8 "胸" */ + 0x0, 0x0, 0x0, 0x0, 0x62, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xfd, 0x0, 0xf3, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x1d, 0x6, 0xe1, 0x11, 0x11, 0x10, + 0x2, 0xc0, 0x1d, 0xd, 0xee, 0xee, 0xee, 0xf9, + 0x2, 0xd0, 0x1d, 0x8d, 0x0, 0x0, 0x0, 0x69, + 0x2, 0xff, 0xfe, 0xe3, 0x90, 0xc, 0x11, 0x69, + 0x2, 0xc0, 0x1d, 0x2c, 0x4a, 0x49, 0x2a, 0x69, + 0x2, 0xc0, 0x1d, 0xc, 0x9, 0xe1, 0x2a, 0x69, + 0x3, 0xc0, 0x1d, 0xc, 0x5, 0xf1, 0x2a, 0x69, + 0x4, 0xff, 0xfd, 0xc, 0x2d, 0x5b, 0x3a, 0x78, + 0x4, 0xa0, 0x1d, 0xd, 0xc4, 0x9, 0x8a, 0x78, + 0x7, 0x80, 0x1d, 0xd, 0x30, 0x1, 0x4a, 0x78, + 0x9, 0x50, 0x1d, 0xd, 0xdd, 0xdd, 0xd9, 0x87, + 0xe, 0x10, 0x1d, 0x0, 0x0, 0x0, 0x0, 0xb5, + 0x1a, 0xc, 0xf9, 0x0, 0x0, 0x5, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+80FD "能" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x50, 0x0, 0xf, 0x10, 0x0, 0x0, 0x4, + 0xc0, 0xa6, 0x0, 0xf1, 0x5, 0xc3, 0x1, 0xd2, + 0x2, 0xe2, 0xf, 0xad, 0x94, 0x0, 0xaf, 0xed, + 0xcc, 0xb0, 0xf4, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x6, 0xf, 0x10, 0x0, 0xb3, 0x18, 0x88, 0x88, + 0x20, 0xe5, 0x22, 0x3e, 0x22, 0xe6, 0x66, 0xd4, + 0x9, 0xcc, 0xcc, 0x80, 0x2e, 0x11, 0x1c, 0x40, + 0xf1, 0x0, 0x0, 0x2, 0xfb, 0xbb, 0xf4, 0xf, + 0x10, 0x29, 0x50, 0x2d, 0x0, 0xc, 0x40, 0xf7, + 0xbd, 0x71, 0x2, 0xfd, 0xdd, 0xf4, 0xf, 0x72, + 0x0, 0x0, 0x2d, 0x0, 0xc, 0x40, 0xf1, 0x0, + 0x8, 0x42, 0xd0, 0x0, 0xd4, 0xe, 0x41, 0x12, + 0xc4, 0x2d, 0x7, 0xfd, 0x10, 0x7d, 0xdd, 0xda, + 0x0, + + /* U+8131 "脱" */ + 0x0, 0x0, 0x0, 0x0, 0x51, 0x0, 0x6, 0x10, + 0x1, 0xff, 0xff, 0x10, 0x9a, 0x0, 0x2e, 0x0, + 0x1, 0xc0, 0xe, 0x10, 0x1f, 0x20, 0xa8, 0x0, + 0x1, 0xc0, 0xe, 0x14, 0x4b, 0x75, 0xf5, 0x30, + 0x1, 0xd0, 0xe, 0x1e, 0xcb, 0xbb, 0xbd, 0xa0, + 0x1, 0xfe, 0xef, 0x1e, 0x20, 0x0, 0x4, 0xa0, + 0x2, 0xc0, 0xe, 0x1e, 0x20, 0x0, 0x4, 0xa0, + 0x2, 0xc0, 0xe, 0x1e, 0x20, 0x0, 0x5, 0xa0, + 0x3, 0xc0, 0xe, 0x1d, 0xff, 0xff, 0xff, 0xa0, + 0x3, 0xff, 0xff, 0x10, 0xb, 0x52, 0xd0, 0x0, + 0x4, 0xa0, 0xe, 0x10, 0xe, 0x22, 0xd0, 0x0, + 0x6, 0x80, 0xe, 0x10, 0x3e, 0x2, 0xd0, 0x0, + 0x9, 0x60, 0xe, 0x10, 0xa8, 0x2, 0xd0, 0x38, + 0xd, 0x10, 0xe, 0x19, 0xc0, 0x2, 0xe1, 0x6a, + 0x1c, 0x9, 0xfb, 0xa9, 0x10, 0x0, 0xce, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+814A "腊" */ + 0x0, 0xff, 0xff, 0x0, 0x3c, 0x0, 0xe1, 0x0, + 0x0, 0xe0, 0xe, 0x10, 0x3c, 0x0, 0xe2, 0x0, + 0x0, 0xe0, 0xe, 0x1e, 0xff, 0xee, 0xfe, 0xe0, + 0x0, 0xe0, 0xe, 0x0, 0x3c, 0x0, 0xe1, 0x0, + 0x0, 0xfe, 0xef, 0x10, 0x3c, 0x0, 0xe2, 0x0, + 0x0, 0xe0, 0xe, 0x6e, 0xee, 0xee, 0xee, 0xe5, + 0x0, 0xe0, 0xe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xe0, 0xe, 0x1, 0xbb, 0xbb, 0xbb, 0x10, + 0x2, 0xff, 0xff, 0x1, 0xf3, 0x33, 0x3e, 0x10, + 0x3, 0xb0, 0xe, 0x1, 0xe0, 0x0, 0xe, 0x10, + 0x5, 0x90, 0xe, 0x1, 0xfd, 0xdd, 0xdf, 0x10, + 0x8, 0x70, 0xe, 0x1, 0xe0, 0x0, 0xe, 0x10, + 0xc, 0x22, 0x2f, 0x1, 0xf3, 0x33, 0x3e, 0x10, + 0x1c, 0xa, 0xd9, 0x1, 0xfb, 0xbb, 0xbe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8155 "腕" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x60, 0x0, 0x0, + 0xaf, 0xff, 0x0, 0x0, 0xe, 0x20, 0x0, 0xa, + 0x40, 0xd0, 0xee, 0xee, 0xff, 0xee, 0xa0, 0xa4, + 0xd, 0xf, 0x0, 0x0, 0x0, 0x5a, 0xa, 0x63, + 0xe0, 0xb8, 0x30, 0x0, 0x3, 0x70, 0xaf, 0xff, + 0x0, 0xf3, 0x10, 0x88, 0x81, 0xa, 0x51, 0xe0, + 0x4f, 0xce, 0x5f, 0x6d, 0x30, 0xb4, 0xd, 0xb, + 0x70, 0xb3, 0xe0, 0xa3, 0xb, 0x63, 0xe6, 0xe4, + 0xe, 0xe, 0xa, 0x30, 0xcb, 0xaf, 0x85, 0x7d, + 0xd0, 0xe0, 0xa3, 0xd, 0x10, 0xd0, 0x0, 0x98, + 0xe, 0x9e, 0x10, 0xe0, 0xd, 0x0, 0x1f, 0x30, + 0xe0, 0x0, 0x1c, 0x0, 0xd0, 0x8, 0xa0, 0xe, + 0x0, 0xa6, 0x80, 0xe, 0x7, 0xe1, 0x0, 0xe0, + 0xc, 0x93, 0x6f, 0xc3, 0xe2, 0x0, 0xa, 0xdd, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8166 "腦" */ + 0x0, 0x0, 0x0, 0x0, 0x60, 0x6, 0x0, 0x70, + 0x2, 0xff, 0xfd, 0x6, 0x90, 0x88, 0x7, 0xa0, + 0x2, 0xc0, 0x1d, 0x1d, 0x12, 0xd0, 0x2d, 0x10, + 0x2, 0xc0, 0x1d, 0x6a, 0x8, 0x80, 0x98, 0x0, + 0x2, 0xd0, 0x1d, 0xd, 0x31, 0xd3, 0x1d, 0x30, + 0x2, 0xfe, 0xfd, 0x4, 0xc0, 0x4d, 0x3, 0xd0, + 0x2, 0xc0, 0x1d, 0x0, 0x91, 0x9a, 0x10, 0x83, + 0x2, 0xc0, 0x1d, 0x4, 0x45, 0xf4, 0x44, 0x40, + 0x3, 0xc0, 0x1d, 0xf, 0xba, 0xaa, 0xaa, 0xf1, + 0x4, 0xff, 0xfd, 0xf, 0x5, 0x1, 0xc0, 0xe1, + 0x4, 0xa0, 0x1d, 0xf, 0x8, 0xcc, 0x50, 0xe1, + 0x6, 0x80, 0x1d, 0xf, 0x1, 0xde, 0x30, 0xe1, + 0x9, 0x50, 0x1d, 0xf, 0x4d, 0x42, 0xd1, 0xe1, + 0xc, 0x10, 0x1d, 0xf, 0x33, 0x11, 0x21, 0xe1, + 0x1b, 0xc, 0xf9, 0xf, 0xdc, 0xcc, 0xcc, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8170 "腰" */ + 0xb, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xb3, 0xe, 0x0, 0x3, 0xb0, 0xe0, 0x0, 0xb, + 0x30, 0xe0, 0x66, 0x8d, 0x6f, 0x66, 0x0, 0xb3, + 0xe, 0xd, 0xab, 0xea, 0xfa, 0xf0, 0xb, 0xfe, + 0xf0, 0xd0, 0x2a, 0xd, 0xe, 0x0, 0xb3, 0xe, + 0xd, 0x2, 0xa0, 0xd0, 0xe0, 0xc, 0x30, 0xe0, + 0xce, 0xee, 0xee, 0xee, 0x0, 0xc6, 0x4f, 0x0, + 0x2, 0xc0, 0x0, 0x0, 0xd, 0x99, 0xf4, 0xee, + 0xff, 0xee, 0xee, 0x90, 0xd0, 0xe, 0x0, 0x6c, + 0x0, 0x1e, 0x10, 0xd, 0x0, 0xe0, 0x1f, 0x60, + 0x8, 0x90, 0x3, 0xb0, 0xe, 0x1, 0x6b, 0xda, + 0xe0, 0x0, 0x77, 0x0, 0xe0, 0x0, 0x5c, 0xbd, + 0xb4, 0xb, 0x27, 0xeb, 0x2d, 0xd9, 0x30, 0x5, + 0xd5, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, + + /* U+819D "膝" */ + 0x1, 0xff, 0xff, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0x1, 0xc0, 0xf, 0x6f, 0xff, 0xff, 0xff, 0xf1, + 0x1, 0xc0, 0xf, 0x0, 0x2d, 0xeb, 0xa0, 0x0, + 0x1, 0xd0, 0xf, 0x1, 0xd3, 0xd2, 0x7b, 0x0, + 0x1, 0xfe, 0xff, 0x5c, 0x30, 0xf2, 0x7, 0xb0, + 0x2, 0xc0, 0xf, 0x30, 0x3, 0xe7, 0x0, 0x30, + 0x2, 0xc0, 0xf, 0x0, 0x3b, 0x19, 0x90, 0x0, + 0x3, 0xc0, 0xf, 0x8, 0xc1, 0x81, 0x7d, 0x50, + 0x3, 0xff, 0xff, 0xb9, 0x10, 0xd1, 0x5, 0xc4, + 0x4, 0xa0, 0xf, 0x3, 0xc1, 0xd1, 0x7b, 0x0, + 0x7, 0x80, 0xf, 0x0, 0x48, 0xeb, 0x90, 0x0, + 0x9, 0x50, 0xf, 0x3, 0xaa, 0xe7, 0xc6, 0x0, + 0xe, 0x10, 0xf, 0x6b, 0x30, 0xd1, 0x9, 0xa0, + 0x1a, 0xb, 0xfa, 0x0, 0x3c, 0xd0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+81C9 "臉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x83, 0x0, 0x0, + 0x1, 0xff, 0xfd, 0x0, 0x5, 0xf9, 0x0, 0x0, + 0x1, 0xc0, 0x1d, 0x0, 0x3d, 0x2a, 0xa0, 0x0, + 0x1, 0xc0, 0x1d, 0x6, 0xd2, 0x0, 0x8e, 0x50, + 0x1, 0xd1, 0x3d, 0x7c, 0xce, 0xee, 0xe3, 0xc3, + 0x1, 0xfc, 0xcd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xc0, 0x1d, 0x2c, 0xcc, 0xb, 0xcc, 0x70, + 0x2, 0xc0, 0x1d, 0x39, 0xc, 0xd, 0x5, 0x80, + 0x3, 0xd5, 0x6d, 0x38, 0xc, 0xc, 0x4, 0x80, + 0x3, 0xe9, 0xad, 0x3e, 0xdf, 0xe, 0xde, 0x80, + 0x4, 0x90, 0x1d, 0x0, 0x60, 0x0, 0x63, 0x0, + 0x6, 0x70, 0x1d, 0x4, 0xb0, 0x0, 0xf2, 0x0, + 0x9, 0x50, 0x1d, 0xa, 0xe6, 0x6, 0xfa, 0x0, + 0xd, 0x10, 0x1d, 0x6c, 0x1b, 0x5e, 0x38, 0xd1, + 0x1b, 0xe, 0xfa, 0xd2, 0x0, 0xc5, 0x0, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+81EA "自" */ + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x90, 0x0, 0x0, 0x1, 0x11, 0x1e, 0x41, + 0x11, 0x11, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x2e, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x2e, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0x2f, 0xdd, 0xdd, 0xdd, + 0xdd, 0xee, 0x2e, 0x22, 0x22, 0x22, 0x22, 0x4e, + 0x2e, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x2e, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x2f, 0xee, 0xee, 0xee, + 0xee, 0xfe, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0x2e, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x2f, 0xdd, + 0xdd, 0xdd, 0xdd, 0xee, 0x2e, 0x22, 0x22, 0x22, + 0x22, 0x4d, + + /* U+81F3 "至" */ + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7e, 0x10, 0x2, 0xc1, 0x0, 0x0, + 0x0, 0x3, 0xf4, 0x0, 0x0, 0xad, 0x20, 0x0, + 0x0, 0x3e, 0x70, 0x0, 0x1, 0x2c, 0xe1, 0x0, + 0x0, 0xef, 0xde, 0xff, 0xed, 0xdc, 0xdd, 0x0, + 0x0, 0x33, 0x11, 0x4, 0x40, 0x0, 0x9, 0x20, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8b, 0xbb, 0xbe, 0xeb, 0xbb, 0xb9, 0x0, + 0x0, 0x34, 0x44, 0x4a, 0xa4, 0x44, 0x43, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x3, 0x33, 0x33, 0x3a, 0xa3, 0x33, 0x33, 0x30, + 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, + + /* U+81FA "臺" */ + 0xb, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0xc0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x9b, 0xbb, 0xbd, 0xdb, 0xbb, 0xba, 0x0, + 0x0, 0x4, 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, + 0x0, 0x1f, 0x55, 0x55, 0x55, 0x55, 0xf2, 0x0, + 0x0, 0x1f, 0xaa, 0xaa, 0xaa, 0xaa, 0xf2, 0x0, + 0x3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x30, + 0xa, 0xa7, 0x77, 0x77, 0x77, 0x77, 0x7a, 0xb0, + 0xa, 0x6b, 0xbb, 0xcb, 0xbb, 0xcb, 0xb6, 0xb0, + 0x0, 0x2, 0x7c, 0x63, 0x33, 0xad, 0x40, 0x0, + 0x0, 0x6, 0x88, 0x7c, 0xb6, 0x65, 0xb2, 0x0, + 0x0, 0x5b, 0xbb, 0xbe, 0xdb, 0xbb, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0xc, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0xc0, + + /* U+8207 "與" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x69, 0x72, 0xb3, 0x0, 0x7f, 0xfe, 0x0, + 0x0, 0xd2, 0x0, 0xbe, 0xdc, 0x0, 0x1e, 0x0, + 0x0, 0xd2, 0x0, 0xb4, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0xcb, 0x94, 0xb3, 0x0, 0x39, 0x9d, 0x0, + 0x0, 0xc8, 0x52, 0xbe, 0xdb, 0x26, 0x7d, 0x0, + 0x0, 0xb4, 0x0, 0x41, 0x1d, 0x0, 0x2d, 0x0, + 0x0, 0xad, 0xc5, 0xa3, 0x1d, 0x4b, 0xcc, 0x0, + 0x0, 0xa7, 0x21, 0xa3, 0x1d, 0x13, 0x6c, 0x0, + 0x0, 0x95, 0x0, 0xa3, 0x1d, 0x0, 0x4b, 0x0, + 0x2b, 0xed, 0xbb, 0xec, 0xcf, 0xbb, 0xde, 0xb2, + 0x3, 0x33, 0x47, 0x43, 0x34, 0x84, 0x33, 0x30, + 0x0, 0x1, 0xbc, 0x10, 0x2, 0xcc, 0x40, 0x0, + 0x1, 0x8e, 0x70, 0x0, 0x0, 0x4, 0xda, 0x10, + 0xa, 0x81, 0x0, 0x0, 0x0, 0x0, 0x8, 0x80, + + /* U+8208 "興" */ + 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xbe, 0x9a, 0xdd, 0xdd, 0xab, 0xef, 0x20, + 0x2, 0xd0, 0xb, 0x10, 0x1, 0xb0, 0xc, 0x20, + 0x1, 0xd0, 0xb, 0x7c, 0xc6, 0xb0, 0xc, 0x20, + 0x1, 0xfc, 0x8b, 0x10, 0x1, 0xb8, 0xbf, 0x10, + 0x0, 0xe3, 0x2b, 0x3b, 0xb4, 0xb3, 0x4e, 0x10, + 0x0, 0xe0, 0xb, 0x45, 0x55, 0xb0, 0xd, 0x10, + 0x0, 0xfa, 0x8b, 0x45, 0x55, 0xb7, 0x9f, 0x0, + 0x0, 0xf4, 0x3b, 0x4d, 0xd5, 0xb3, 0x4f, 0x0, + 0x0, 0xf0, 0xb, 0x10, 0x1, 0xb0, 0xf, 0x0, + 0x2c, 0xfc, 0xcf, 0xcc, 0xcc, 0xfc, 0xcf, 0xc2, + 0x3, 0x33, 0x37, 0x33, 0x33, 0x83, 0x33, 0x30, + 0x0, 0x2, 0xbc, 0x10, 0x1, 0xbd, 0x50, 0x0, + 0x1, 0x9e, 0x60, 0x0, 0x0, 0x3, 0xcb, 0x20, + 0xb, 0x81, 0x0, 0x0, 0x0, 0x0, 0x7, 0x70, + + /* U+8209 "舉" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x83, 0x6b, 0x65, 0x9c, 0xdb, 0x0, + 0x0, 0xa4, 0x0, 0x6b, 0x76, 0x0, 0x4a, 0x0, + 0x0, 0xad, 0xc7, 0x69, 0x31, 0x7c, 0xda, 0x0, + 0x0, 0x95, 0x0, 0x38, 0xb7, 0x0, 0x69, 0x0, + 0x0, 0x8d, 0xc8, 0x72, 0x67, 0x8c, 0xd8, 0x0, + 0x0, 0x87, 0x0, 0x93, 0x67, 0x0, 0x77, 0x0, + 0x2e, 0xff, 0xee, 0xfe, 0xff, 0xee, 0xff, 0xe3, + 0x0, 0x1, 0xc4, 0x6, 0x60, 0x4d, 0x20, 0x0, + 0x0, 0x1d, 0x60, 0x8, 0x80, 0x4, 0xd2, 0x0, + 0x7, 0xd5, 0x6d, 0xdf, 0xfd, 0xd6, 0x4d, 0x91, + 0x19, 0x10, 0x0, 0x8, 0x80, 0x0, 0x0, 0x61, + 0x0, 0xae, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + + /* U+822A "航" */ + 0x0, 0x3, 0x80, 0x0, 0x5, 0x50, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x0, 0x3, 0xe0, 0x0, 0x0, + 0x2, 0xae, 0xca, 0x80, 0x0, 0xb4, 0x0, 0x0, + 0x2, 0xd3, 0x35, 0xcc, 0xee, 0xee, 0xee, 0xe5, + 0x2, 0xc7, 0x32, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xc3, 0xa2, 0xc0, 0x11, 0x11, 0x10, 0x0, + 0x2, 0xc0, 0xb3, 0xc0, 0xbf, 0xff, 0xf2, 0x0, + 0x5, 0xd3, 0x35, 0xc0, 0xb3, 0x0, 0xd2, 0x0, + 0x1c, 0xeb, 0xbc, 0xc0, 0xb3, 0x0, 0xd2, 0x0, + 0x3, 0xb5, 0x12, 0xc0, 0xc3, 0x0, 0xd2, 0x0, + 0x4, 0xa4, 0xa2, 0xc0, 0xd2, 0x0, 0xd2, 0x0, + 0x5, 0x90, 0xa4, 0xc0, 0xe0, 0x0, 0xd2, 0x0, + 0x7, 0x70, 0x2, 0xc1, 0xe0, 0x0, 0xd2, 0x18, + 0xb, 0x30, 0x3, 0xc7, 0x80, 0x0, 0xd2, 0x29, + 0xd, 0x0, 0xde, 0x8d, 0x10, 0x0, 0x8f, 0xe4, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+822C "般" */ + 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x1f, 0xee, 0xfb, 0x0, + 0x0, 0xef, 0xfe, 0xe1, 0x1e, 0x0, 0x4b, 0x0, + 0x0, 0xe0, 0x0, 0xe1, 0x2d, 0x0, 0x4b, 0x0, + 0x0, 0xe3, 0x70, 0xe1, 0x5b, 0x0, 0x4b, 0x0, + 0x0, 0xe0, 0xc1, 0xe2, 0xd5, 0x0, 0x1e, 0xb7, + 0x0, 0xe0, 0x31, 0xe1, 0x60, 0x0, 0x0, 0x20, + 0x3b, 0xfb, 0xbb, 0xf1, 0xbc, 0xcc, 0xcc, 0x90, + 0x14, 0xe3, 0x33, 0xf1, 0x9a, 0x33, 0x39, 0x80, + 0x2, 0xc3, 0x80, 0xe1, 0x2e, 0x0, 0xe, 0x20, + 0x4, 0xa0, 0xd1, 0xe1, 0xa, 0x90, 0x6b, 0x0, + 0x6, 0x90, 0x63, 0xe1, 0x1, 0xd9, 0xe1, 0x0, + 0xa, 0x50, 0x0, 0xe1, 0x0, 0x7f, 0xb0, 0x0, + 0xe, 0x0, 0x0, 0xf1, 0x3a, 0xd5, 0xcd, 0x60, + 0x3b, 0x0, 0xcf, 0xb3, 0xe7, 0x0, 0x5, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8239 "船" */ + 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xb0, 0x0, 0xf, 0xff, 0xfc, 0x0, + 0x0, 0x39, 0x93, 0x30, 0xf, 0x0, 0x2c, 0x0, + 0x2, 0xea, 0xaa, 0xf0, 0x1f, 0x0, 0x2c, 0x0, + 0x2, 0xc2, 0x30, 0xf0, 0x2e, 0x0, 0x2c, 0x0, + 0x2, 0xc2, 0xc0, 0xf0, 0x5b, 0x0, 0x2c, 0x0, + 0x2, 0xc0, 0xb1, 0xf0, 0xc5, 0x0, 0x2d, 0x10, + 0x5, 0xd3, 0x33, 0xf6, 0x90, 0x0, 0xa, 0xc6, + 0x3c, 0xeb, 0xbb, 0xf0, 0x23, 0x33, 0x33, 0x10, + 0x3, 0xb3, 0x40, 0xf0, 0xbd, 0xcc, 0xce, 0x90, + 0x4, 0xa1, 0xc0, 0xf0, 0xb3, 0x0, 0x6, 0x90, + 0x5, 0x90, 0x63, 0xf0, 0xb3, 0x0, 0x6, 0x90, + 0x8, 0x60, 0x0, 0xf0, 0xb3, 0x0, 0x6, 0x90, + 0xd, 0x20, 0x0, 0xf0, 0xbc, 0xbb, 0xbd, 0x90, + 0x3a, 0x0, 0x9e, 0xa0, 0xb7, 0x44, 0x48, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+826F "良" */ + 0x0, 0x0, 0x5, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, 0x1e, 0xee, + 0xef, 0xfe, 0xee, 0xe2, 0x0, 0x1f, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x1f, 0xee, 0xee, 0xee, 0xee, + 0xf2, 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x1f, 0xee, 0xff, 0xee, 0xee, 0xe2, 0x0, 0x1f, + 0x0, 0x1e, 0x10, 0x0, 0x3a, 0x0, 0x1f, 0x0, + 0x7, 0xb0, 0x7, 0xe6, 0x0, 0x1f, 0x0, 0x0, + 0xab, 0xcb, 0x20, 0x0, 0x1f, 0x0, 0x1, 0xa, + 0xe4, 0x0, 0x0, 0x3f, 0x59, 0xde, 0x0, 0x5e, + 0xb5, 0x0, 0xaf, 0xb7, 0x20, 0x0, 0x1, 0x6c, + 0xd0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8272 "色" */ + 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x4, 0xe2, 0x0, 0x8, 0xa0, 0x0, 0x0, + 0x0, 0x7f, 0x30, 0x0, 0x6d, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xa, 0x4e, 0x0, 0x2, 0xe0, 0x0, 0x2e, 0x0, + 0x0, 0x2e, 0x0, 0x2, 0xe0, 0x0, 0x2e, 0x0, + 0x0, 0x2e, 0x0, 0x2, 0xe0, 0x0, 0x2e, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, + 0x0, 0xf, 0x30, 0x0, 0x0, 0x0, 0x2, 0xe3, + 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xfe, 0x70, + + /* U+8282 "节" */ + 0x0, 0x0, 0x4c, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x1c, 0xcc, 0xdf, 0xcc, 0xcc, 0xfd, 0xcc, 0xc1, + 0x3, 0x33, 0x7d, 0x33, 0x33, 0xd7, 0x33, 0x30, + 0x0, 0x0, 0x4c, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0x0, 0x0, 0x39, 0x0, 0x0, 0xa3, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x11, 0x13, 0xf1, 0x11, 0x11, 0x98, 0x0, + 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x98, 0x0, + 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x98, 0x0, + 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x98, 0x0, + 0x0, 0x0, 0x2, 0xf0, 0x0, 0x11, 0xa8, 0x0, + 0x0, 0x0, 0x2, 0xf0, 0x6, 0xff, 0xe3, 0x0, + 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, 0x0, 0x0, + + /* U+82B1 "花" */ + 0x0, 0x0, 0x1f, 0x0, 0x0, 0xe3, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x1, 0x11, 0x3f, 0x11, 0x11, 0xe4, 0x11, 0x10, + 0x0, 0x0, 0x17, 0x0, 0x0, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0xa6, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xf3, 0x0, 0xa6, 0x0, 0x8, 0x0, + 0x0, 0xb, 0xa0, 0x0, 0xa6, 0x3, 0xdc, 0x10, + 0x0, 0xbf, 0x90, 0x0, 0xa8, 0xae, 0x60, 0x0, + 0xb, 0xc9, 0x90, 0x2, 0xce, 0x70, 0x0, 0x0, + 0x5, 0x8, 0x90, 0xae, 0xd7, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x30, 0xa6, 0x0, 0x0, 0x40, + 0x0, 0x8, 0x90, 0x0, 0xa6, 0x0, 0x0, 0xb4, + 0x0, 0x8, 0x90, 0x0, 0x99, 0x0, 0x1, 0xe1, + 0x0, 0x8, 0x90, 0x0, 0x4e, 0xff, 0xff, 0x90, + + /* U+82E5 "若" */ + 0x0, 0x0, 0x5a, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x6b, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0x26, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x12, 0xa8, 0x0, 0x21, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x1c, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xfe, 0xee, 0xee, 0xee, 0xea, 0x0, + 0x0, 0x8e, 0xe4, 0x11, 0x11, 0x11, 0x6b, 0x0, + 0x2c, 0xc1, 0xd3, 0x0, 0x0, 0x0, 0x5b, 0x0, + 0x7, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0x0, 0xdc, 0xbb, 0xbb, 0xbb, 0xdb, 0x0, + 0x0, 0x0, 0xd6, 0x33, 0x33, 0x33, 0x7b, 0x0, + + /* U+82E6 "苦" */ + 0x0, 0x6, 0xa0, 0x0, 0xb, 0x50, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x6, + 0xa0, 0x0, 0xb, 0x50, 0x0, 0x0, 0x6, 0xa0, + 0x76, 0xb, 0x50, 0x0, 0x0, 0x1, 0x30, 0x98, + 0x3, 0x10, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x98, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x98, 0x0, 0x0, 0x0, + 0x1, 0xcc, 0xcc, 0xee, 0xcc, 0xcc, 0x40, 0x1, + 0xf3, 0x33, 0x33, 0x33, 0x3c, 0x50, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0xb, 0x50, 0x1, 0xe0, 0x0, + 0x0, 0x0, 0xb, 0x50, 0x1, 0xfc, 0xcc, 0xcc, + 0xcc, 0xcf, 0x50, 0x1, 0xf3, 0x33, 0x33, 0x33, + 0x3c, 0x50, + + /* U+82F1 "英" */ + 0x0, 0x0, 0x69, 0x0, 0x0, 0xa5, 0x0, 0x0, + 0xd, 0xee, 0xff, 0xee, 0xee, 0xff, 0xee, 0xc0, + 0x0, 0x0, 0x7a, 0x0, 0x0, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x69, 0x8, 0x60, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x9, 0x70, 0x21, 0x0, 0x0, + 0x0, 0x6f, 0xee, 0xef, 0xfe, 0xee, 0xf7, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x70, 0x0, 0x97, 0x0, + 0x0, 0x69, 0x0, 0xa, 0x70, 0x0, 0x97, 0x0, + 0x2, 0x8b, 0x22, 0x2b, 0x82, 0x22, 0xa9, 0x20, + 0x1d, 0xdd, 0xdd, 0xdf, 0xfd, 0xdd, 0xdd, 0xd1, + 0x0, 0x0, 0x0, 0x6d, 0xa8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xe3, 0x1e, 0x70, 0x0, 0x0, + 0x0, 0x4, 0xcd, 0x30, 0x1, 0xdb, 0x40, 0x0, + 0x1a, 0xec, 0x60, 0x0, 0x0, 0x6, 0xde, 0xb2, + 0x6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0x60, + + /* U+8336 "茶" */ + 0x0, 0x0, 0x88, 0x0, 0x0, 0x97, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x89, 0x2, 0x20, 0xa8, 0x0, 0x0, + 0x0, 0x0, 0x88, 0xc, 0xc0, 0x97, 0x0, 0x0, + 0x0, 0x0, 0x13, 0xcd, 0xbb, 0x31, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0xb4, 0x37, 0xe7, 0x0, 0x0, + 0x0, 0x5d, 0xe5, 0x8, 0x90, 0x2b, 0xe8, 0x20, + 0x1e, 0xc5, 0x0, 0x8, 0x90, 0x0, 0x4b, 0xf3, + 0x1, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x10, + 0x0, 0x0, 0x20, 0x8, 0x90, 0x11, 0x0, 0x0, + 0x0, 0x3, 0xe3, 0x8, 0x90, 0x7d, 0x20, 0x0, + 0x0, 0x3e, 0x50, 0x8, 0x90, 0x5, 0xe4, 0x0, + 0x4, 0xe4, 0x0, 0x9, 0x90, 0x0, 0x4e, 0x20, + 0x0, 0x10, 0x5, 0xfe, 0x50, 0x0, 0x1, 0x0, + + /* U+8377 "荷" */ + 0x0, 0x0, 0x5c, 0x0, 0x0, 0xc5, 0x0, 0x0, + 0xe, 0xee, 0xff, 0xee, 0xee, 0xff, 0xee, 0xe1, + 0x0, 0x0, 0x4b, 0x0, 0x0, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x96, 0x0, 0x0, 0x52, 0x0, 0x0, + 0x0, 0x6, 0xd6, 0xee, 0xee, 0xee, 0xee, 0xe3, + 0x0, 0x1f, 0x40, 0x0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0xbe, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, + 0xb, 0xee, 0x2, 0xfe, 0xee, 0xe0, 0x79, 0x0, + 0x4c, 0x3e, 0x2, 0xd0, 0x1, 0xe0, 0x79, 0x0, + 0x0, 0x1e, 0x2, 0xd0, 0x1, 0xe0, 0x79, 0x0, + 0x0, 0x1e, 0x2, 0xfd, 0xde, 0xe0, 0x79, 0x0, + 0x0, 0x1e, 0x2, 0xd0, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x1e, 0x1, 0x60, 0x0, 0x0, 0x79, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x1, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+83D3 "菓" */ + 0x0, 0x0, 0x5b, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x5b, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x5d, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x70, 0x0, 0x87, 0x0, + 0x0, 0x6e, 0xcc, 0xce, 0xec, 0xcc, 0xe7, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x70, 0x0, 0x87, 0x0, + 0x0, 0x6d, 0x99, 0x9d, 0xc9, 0x99, 0xd7, 0x0, + 0x0, 0x13, 0x33, 0x3a, 0x93, 0x33, 0x31, 0x0, + 0x1b, 0xbb, 0xbb, 0xbd, 0xdb, 0xbb, 0xbb, 0xb2, + 0x3, 0x33, 0x39, 0xec, 0xbe, 0x63, 0x33, 0x30, + 0x0, 0x3, 0xcc, 0x29, 0x73, 0xd9, 0x10, 0x0, + 0x17, 0xdd, 0x60, 0x9, 0x70, 0x7, 0xdb, 0x61, + 0x19, 0x40, 0x0, 0x9, 0x70, 0x0, 0x4, 0xa1, + + /* U+83DC "菜" */ + 0x0, 0x0, 0x4d, 0x0, 0x0, 0xe4, 0x0, 0x0, + 0xe, 0xee, 0xff, 0xee, 0xee, 0xff, 0xee, 0xe0, + 0x0, 0x0, 0x3d, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x1, 0x36, 0x45, 0x68, 0xbd, 0xf6, 0x0, + 0x5, 0xed, 0xcb, 0xa9, 0x86, 0x53, 0x1, 0x0, + 0x0, 0x54, 0x0, 0x2d, 0x0, 0x0, 0x7c, 0x0, + 0x0, 0x2e, 0x20, 0xa, 0x60, 0x2, 0xe2, 0x0, + 0x0, 0x7, 0x40, 0x7, 0x50, 0x9, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xff, 0xff, 0xee, 0xee, 0xe1, + 0x0, 0x0, 0x7, 0xdc, 0xbd, 0x50, 0x0, 0x0, + 0x0, 0x4, 0xdb, 0x19, 0x81, 0xbb, 0x30, 0x0, + 0x17, 0xdc, 0x40, 0x9, 0x80, 0x5, 0xce, 0x81, + 0x19, 0x30, 0x0, 0x9, 0x80, 0x0, 0x2, 0x70, + + /* U+843D "落" */ + 0x0, 0x0, 0x5b, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0xe, 0xee, 0xff, 0xee, 0xee, 0xff, 0xee, 0xe0, + 0x0, 0x0, 0x5b, 0x0, 0x10, 0xc3, 0x0, 0x0, + 0x0, 0xa3, 0x13, 0x2, 0xe2, 0x41, 0x0, 0x0, + 0x0, 0x4d, 0xa0, 0x1d, 0xdd, 0xdd, 0xee, 0x0, + 0x0, 0x0, 0x42, 0xdd, 0xa0, 0x2, 0xd4, 0x0, + 0x1b, 0x50, 0xd, 0x40, 0x7d, 0x7d, 0x40, 0x0, + 0x2, 0xbb, 0x0, 0x0, 0x5d, 0xdc, 0x40, 0x0, + 0x0, 0x1, 0x5, 0x9d, 0x81, 0x4, 0xcd, 0x92, + 0x0, 0x2, 0x88, 0xab, 0xbb, 0xbb, 0xbb, 0x71, + 0x0, 0xd, 0x50, 0x79, 0x22, 0x22, 0x5d, 0x0, + 0x0, 0x9a, 0x0, 0x78, 0x0, 0x0, 0x3d, 0x0, + 0x7, 0xd1, 0x0, 0x79, 0x11, 0x11, 0x4d, 0x0, + 0x9, 0x30, 0x0, 0x7e, 0xcc, 0xcc, 0xdd, 0x0, + + /* U+8449 "葉" */ + 0x1, 0x11, 0x5c, 0x11, 0x11, 0xd4, 0x11, 0x10, + 0x1c, 0xcc, 0xdf, 0xcc, 0xcc, 0xfd, 0xcc, 0xc1, + 0x0, 0x4, 0x5c, 0x7, 0x0, 0xd6, 0x30, 0x0, + 0x0, 0xe, 0x30, 0xf, 0x0, 0x19, 0x80, 0x0, + 0x1e, 0xef, 0xee, 0xef, 0xee, 0xef, 0xfe, 0xe1, + 0x0, 0xe, 0x20, 0xf, 0x0, 0x8, 0x80, 0x0, + 0x0, 0xe, 0x20, 0xb, 0xbb, 0xbb, 0x60, 0x0, + 0x0, 0xe, 0x42, 0x22, 0x22, 0x22, 0x22, 0x10, + 0x0, 0xa, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0x70, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x1d, 0xdd, 0xdd, 0xff, 0xff, 0xdd, 0xdd, 0xd2, + 0x0, 0x0, 0x3b, 0xba, 0x9b, 0x91, 0x0, 0x0, + 0x3, 0x8c, 0xb3, 0x9, 0x70, 0x5c, 0xb7, 0x30, + 0x2a, 0x51, 0x0, 0x9, 0x70, 0x0, 0x16, 0xb2, + + /* U+8457 "著" */ + 0x0, 0x0, 0x5b, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x5b, 0x65, 0x0, 0xd3, 0x0, 0x0, + 0x0, 0x11, 0x23, 0x98, 0x11, 0x41, 0x5c, 0x0, + 0x0, 0x9c, 0xcc, 0xee, 0xcc, 0xdb, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x87, 0x3, 0xb9, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x3, 0xad, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xcf, 0xfc, 0xcc, 0xcc, 0xc7, 0x0, + 0x2c, 0xfa, 0xf3, 0x0, 0x0, 0x0, 0x88, 0x0, + 0x8, 0x20, 0xe4, 0x11, 0x11, 0x11, 0x88, 0x0, + 0x0, 0x0, 0xeb, 0xaa, 0xaa, 0xaa, 0xd8, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x78, 0x0, + 0x0, 0x0, 0xee, 0xdd, 0xdd, 0xdd, 0xe8, 0x0, + + /* U+8535 "蔵" */ + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x3c, 0x0, 0x0, 0xb2, 0x93, 0x0, + 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, 0x6e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc3, 0x7, 0x0, + 0x3, 0xfd, 0xdd, 0xdd, 0xdd, 0xfe, 0xdd, 0xa0, + 0x3, 0xc1, 0x33, 0x33, 0x31, 0xb4, 0x2, 0x0, + 0x3, 0xc5, 0xb6, 0xc7, 0x62, 0x95, 0x2e, 0x0, + 0x3, 0xc5, 0xc9, 0xda, 0x92, 0x87, 0x89, 0x0, + 0x4, 0xb5, 0x92, 0x22, 0x93, 0x5a, 0xe3, 0x0, + 0x5, 0xa5, 0x80, 0x0, 0x83, 0x2f, 0xb0, 0x0, + 0x7, 0x85, 0xdb, 0xec, 0xb2, 0x1f, 0x40, 0x0, + 0xa, 0x55, 0x80, 0xa2, 0x0, 0xbf, 0x60, 0x10, + 0x1e, 0x14, 0xcc, 0xcc, 0xdd, 0x63, 0xe3, 0x96, + 0x27, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x5e, 0xd2, + + /* U+8584 "薄" */ + 0x1, 0x11, 0x5c, 0x11, 0x11, 0xd4, 0x11, 0x10, + 0x1d, 0xdd, 0xef, 0xdd, 0xdd, 0xfd, 0xdd, 0xd2, + 0x0, 0x10, 0x4a, 0x0, 0x2, 0xd3, 0xa4, 0x0, + 0x3, 0xd9, 0x16, 0x66, 0x6b, 0xa6, 0x8f, 0x80, + 0x0, 0x7, 0x64, 0x44, 0x4b, 0x94, 0x44, 0x40, + 0x1, 0x0, 0x6, 0xeb, 0xbe, 0xdb, 0xbe, 0x50, + 0x1d, 0xa1, 0x6, 0xc6, 0x6b, 0xa6, 0x6c, 0x50, + 0x0, 0x7b, 0x6, 0xb3, 0x3a, 0x83, 0x3c, 0x50, + 0x0, 0x0, 0x6, 0xda, 0xad, 0xca, 0xae, 0x50, + 0x0, 0x8, 0x14, 0x60, 0x5, 0x34, 0x76, 0x30, + 0x0, 0x3d, 0x3d, 0xdd, 0xdd, 0xde, 0xfd, 0xd3, + 0x0, 0xc5, 0x0, 0x6b, 0x10, 0x5, 0x90, 0x0, + 0x6, 0xc0, 0x0, 0x5, 0xc0, 0x6, 0x90, 0x0, + 0x9, 0x30, 0x0, 0x0, 0x2, 0xee, 0x60, 0x0, + + /* U+85AC "薬" */ + 0x0, 0x0, 0x5c, 0x0, 0x0, 0xd4, 0x0, 0x0, + 0xe, 0xee, 0xef, 0xee, 0xee, 0xfe, 0xee, 0xe1, + 0x0, 0x0, 0x4b, 0x6, 0x30, 0xc3, 0x1, 0x0, + 0x3, 0xa1, 0xc, 0xcf, 0xdc, 0xd0, 0x2d, 0x40, + 0x0, 0x5e, 0x2d, 0x10, 0x0, 0xf4, 0xc2, 0x0, + 0x0, 0x2, 0xd, 0xbb, 0xbb, 0xf1, 0x0, 0x0, + 0x0, 0x18, 0x9d, 0x20, 0x1, 0xf8, 0xc4, 0x0, + 0xa, 0xe7, 0xd, 0x99, 0x99, 0xf0, 0x3d, 0xa0, + 0x5, 0x0, 0x3, 0x3a, 0x93, 0x30, 0x0, 0x40, + 0xc, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0xc1, + 0x2, 0x22, 0x27, 0xec, 0xcd, 0x52, 0x22, 0x20, + 0x0, 0x1, 0xbc, 0x28, 0x73, 0xd8, 0x10, 0x0, + 0x5, 0xbd, 0x60, 0x8, 0x70, 0x7, 0xdb, 0x60, + 0x1a, 0x40, 0x0, 0x8, 0x70, 0x0, 0x4, 0x90, + + /* U+85DD "藝" */ + 0x1d, 0xdd, 0xef, 0xdd, 0xdd, 0xfe, 0xdd, 0xd1, + 0x0, 0x0, 0x28, 0x0, 0x0, 0x81, 0x0, 0x0, + 0x0, 0x22, 0x92, 0x20, 0x0, 0x61, 0x0, 0x0, + 0x0, 0x88, 0xe9, 0x81, 0x46, 0xd8, 0x63, 0x0, + 0x9, 0xab, 0xdb, 0xba, 0x36, 0xe6, 0xa7, 0x0, + 0x1, 0x98, 0x22, 0xb5, 0x7b, 0xd0, 0x67, 0x0, + 0xa, 0x85, 0xe6, 0x6a, 0x8, 0xf7, 0x58, 0x20, + 0x1, 0x44, 0xe5, 0x42, 0x3d, 0x27, 0x2c, 0x73, + 0xa, 0xbb, 0xc9, 0x99, 0xd3, 0x0, 0x9, 0xc0, + 0x0, 0x19, 0x99, 0x99, 0xa9, 0x99, 0x92, 0x0, + 0x0, 0x2, 0x22, 0x22, 0x22, 0x22, 0x20, 0x0, + 0x1b, 0xbb, 0xbe, 0xdb, 0xbb, 0xcb, 0xbb, 0xb1, + 0x0, 0x2, 0xb9, 0x0, 0x0, 0x7c, 0x40, 0x0, + 0x0, 0xaf, 0xda, 0xbb, 0xcb, 0xbc, 0xda, 0x10, + 0x0, 0x54, 0x22, 0x10, 0x0, 0x0, 0x6, 0x20, + + /* U+8607 "蘇" */ + 0x0, 0x0, 0x3c, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x3, 0x5c, 0x0, 0x0, 0xd2, 0x1, 0x0, + 0x0, 0x3f, 0x77, 0x30, 0x1, 0x58, 0xcc, 0x30, + 0x1, 0xd6, 0x4e, 0x30, 0x8a, 0x7f, 0x20, 0x0, + 0x1d, 0xec, 0xde, 0xc8, 0x0, 0xe, 0x0, 0x0, + 0x8, 0xa0, 0xc1, 0x4a, 0xbb, 0xbf, 0xcb, 0xb2, + 0x4, 0xd9, 0xea, 0xba, 0x33, 0x9f, 0xb3, 0x30, + 0x4, 0xa1, 0xc2, 0x5a, 0x0, 0xdf, 0xd1, 0x0, + 0x4, 0xa1, 0xc1, 0x5a, 0x6, 0x9e, 0x5a, 0x0, + 0x2, 0xbb, 0xbb, 0xb7, 0x1e, 0x1e, 0x1b, 0x40, + 0x3, 0x67, 0x27, 0x65, 0xc5, 0xe, 0x1, 0xd2, + 0x9, 0x49, 0x3c, 0x1d, 0x50, 0xe, 0x0, 0x31, + 0x3a, 0x4, 0x24, 0x13, 0x0, 0xe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8655 "處" */ + 0x0, 0x0, 0x0, 0xe, 0xdd, 0xdd, 0xd9, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0xaa, 0xaa, 0xaf, 0xba, 0xaa, 0xaa, 0x80, + 0x0, 0xf3, 0x33, 0x3f, 0x43, 0x33, 0x3a, 0x80, + 0x0, 0xf0, 0x1, 0x2f, 0x77, 0x89, 0x4c, 0x20, + 0x0, 0xf1, 0xba, 0x9f, 0x86, 0x54, 0x17, 0x20, + 0x0, 0xf0, 0x1, 0xc, 0xa8, 0x88, 0x8c, 0x70, + 0x0, 0xf0, 0x3c, 0x0, 0x23, 0x33, 0x32, 0x0, + 0x1, 0xf0, 0xbd, 0xdf, 0xd, 0xdd, 0xf1, 0x0, + 0x2, 0xd7, 0xf2, 0x4a, 0xe, 0x0, 0xd1, 0x10, + 0x5, 0xcb, 0x4a, 0xc3, 0x2d, 0x0, 0xd1, 0xb0, + 0x8, 0x70, 0xc, 0xb0, 0xc5, 0x0, 0xad, 0xb0, + 0xe, 0x30, 0x9b, 0xca, 0x61, 0x0, 0x0, 0x0, + 0x3c, 0x3d, 0x70, 0x6, 0xbd, 0xee, 0xee, 0xe1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+884C "行" */ + 0x0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xa0, + 0x2, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x80, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0x0, 0xb9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0x50, 0xef, 0xff, 0xff, 0xff, 0xf1, + 0x4, 0xff, 0x10, 0x0, 0x0, 0x6, 0xa0, 0x0, + 0x4f, 0x7e, 0x10, 0x0, 0x0, 0x6, 0xa0, 0x0, + 0x15, 0xe, 0x10, 0x0, 0x0, 0x6, 0xa0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x6, 0xa0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x6, 0xa0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x6, 0xa0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0x8, 0xa0, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x3f, 0xfe, 0x50, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8853 "術" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0x10, 0xb, 0x42, 0x0, 0x0, 0x0, + 0x1, 0xe4, 0x0, 0xb, 0x4c, 0x3a, 0xee, 0xe1, + 0x3e, 0x60, 0x0, 0xb, 0x33, 0xb0, 0x0, 0x0, + 0x45, 0x9, 0x95, 0x5d, 0x75, 0x50, 0x0, 0x0, + 0x0, 0x3e, 0x3b, 0xcf, 0xcb, 0xb2, 0x22, 0x20, + 0x1, 0xd5, 0x0, 0x6f, 0x30, 0x2c, 0xdf, 0xc4, + 0x1c, 0xf3, 0x0, 0xcf, 0x85, 0x0, 0x2d, 0x0, + 0xba, 0xc3, 0x2, 0xec, 0x5d, 0x10, 0x2d, 0x0, + 0x20, 0xc3, 0x9, 0x7b, 0x35, 0xa0, 0x2d, 0x0, + 0x0, 0xc3, 0x3e, 0xb, 0x30, 0xd3, 0x2d, 0x0, + 0x0, 0xc4, 0xd4, 0xb, 0x30, 0x32, 0x2d, 0x0, + 0x0, 0xc5, 0x70, 0xb, 0x30, 0x0, 0x2d, 0x0, + 0x0, 0xc3, 0x0, 0xb, 0x30, 0x0, 0x3d, 0x0, + 0x0, 0xc3, 0x0, 0xb, 0x30, 0x3f, 0xe8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8868 "表" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x4, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x50, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xcc, 0xce, 0xec, 0xcc, 0xc8, 0x0, + 0x0, 0x1, 0x11, 0x1a, 0x91, 0x11, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x5, 0xd4, 0xd4, 0x0, 0x2, 0x0, + 0x0, 0x0, 0xad, 0x20, 0x5d, 0x0, 0x7d, 0x20, + 0x1, 0x8e, 0xf4, 0x0, 0xc, 0x8a, 0xa0, 0x0, + 0x1e, 0x92, 0xc4, 0x0, 0x1, 0xea, 0x0, 0x0, + 0x0, 0x0, 0xc4, 0x0, 0x31, 0x3e, 0x90, 0x0, + 0x0, 0x0, 0xd8, 0x9e, 0xd3, 0x1, 0xce, 0x71, + 0x0, 0x3, 0xfc, 0x72, 0x0, 0x0, 0x4, 0xa1, + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+88AB "被" */ + 0x0, 0x66, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xd, 0x20, 0x1, 0x11, 0xe3, 0x11, 0x10, + 0x2c, 0xcc, 0xc8, 0xf, 0xcc, 0xfc, 0xcd, 0xe0, + 0x3, 0x33, 0xb6, 0xf, 0x0, 0xe1, 0x7, 0x90, + 0x0, 0x2, 0xd0, 0xf, 0x0, 0xe1, 0xb, 0x40, + 0x0, 0xb, 0x62, 0x1f, 0x0, 0xe2, 0x3, 0x0, + 0x0, 0x4f, 0x3d, 0x4f, 0xfe, 0xee, 0xef, 0x20, + 0x2, 0xef, 0xf3, 0x2e, 0xa3, 0x0, 0x3c, 0x0, + 0x1d, 0x7e, 0x79, 0x4c, 0x4a, 0x0, 0xa6, 0x0, + 0x17, 0x1e, 0x8, 0x59, 0xc, 0x45, 0xd0, 0x0, + 0x0, 0x1e, 0x0, 0x97, 0x3, 0xee, 0x20, 0x0, + 0x0, 0x1e, 0x0, 0xe2, 0x4, 0xee, 0x40, 0x0, + 0x0, 0x1e, 0x8, 0xb1, 0x9e, 0x34, 0xea, 0x30, + 0x0, 0x1e, 0x9, 0x2a, 0x81, 0x0, 0x7, 0xc0, + + /* U+88CF "裏" */ + 0x0, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, + 0x5, 0x55, 0x55, 0x5a, 0xb5, 0x55, 0x55, 0x50, + 0x7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x70, + 0x0, 0x2a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa2, 0x0, + 0x0, 0x3c, 0x0, 0x8, 0x70, 0x0, 0xc3, 0x0, + 0x0, 0x3e, 0xaa, 0xad, 0xda, 0xaa, 0xe3, 0x0, + 0x0, 0x3c, 0x0, 0x8, 0x70, 0x0, 0xc3, 0x0, + 0x0, 0x2b, 0xbb, 0xbd, 0xdb, 0xbb, 0xb2, 0x0, + 0x0, 0x77, 0x77, 0x7c, 0xb7, 0x77, 0x77, 0x0, + 0x0, 0x44, 0x44, 0x4a, 0x94, 0x44, 0x44, 0x0, + 0x1d, 0xdd, 0xdd, 0xef, 0xfd, 0xdd, 0xdd, 0xd2, + 0x0, 0x0, 0x3a, 0xa2, 0x99, 0x0, 0x48, 0x0, + 0x4, 0x8c, 0xe7, 0x0, 0xb, 0xab, 0x81, 0x0, + 0x19, 0x40, 0xa6, 0x13, 0x65, 0x7d, 0x71, 0x0, + 0x0, 0x3, 0xff, 0xc9, 0x62, 0x1, 0x8e, 0xc2, + 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+88DC "補" */ + 0x0, 0x68, 0x0, 0x0, 0x0, 0xf0, 0x88, 0x10, + 0x0, 0xb, 0x30, 0x33, 0x33, 0xf4, 0x37, 0xc1, + 0xc, 0xcc, 0xc6, 0xaa, 0xaa, 0xfa, 0xaa, 0xa4, + 0x3, 0x33, 0xd4, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0x4, 0xe0, 0x23, 0x33, 0xf4, 0x33, 0x20, + 0x0, 0xd, 0x62, 0x8d, 0xbb, 0xfb, 0xbc, 0xc0, + 0x0, 0x6f, 0x5c, 0x97, 0x0, 0xf0, 0x3, 0xc0, + 0x2, 0xef, 0xf1, 0x8f, 0xee, 0xfe, 0xee, 0xc0, + 0x1d, 0x6e, 0x7a, 0x87, 0x0, 0xf0, 0x3, 0xc0, + 0x57, 0x1e, 0x5, 0x87, 0x0, 0xf0, 0x3, 0xc0, + 0x0, 0x1e, 0x0, 0x8f, 0xee, 0xfe, 0xee, 0xc0, + 0x0, 0x1e, 0x0, 0x87, 0x0, 0xf0, 0x3, 0xc0, + 0x0, 0x1e, 0x0, 0x87, 0x0, 0xf0, 0x4, 0xc0, + 0x0, 0x1e, 0x0, 0x87, 0x0, 0xe0, 0xbf, 0x80, + + /* U+88E1 "裡" */ + 0x0, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x10, 0x3f, 0xee, 0xfe, 0xef, 0x80, + 0x0, 0x7, 0x30, 0x3c, 0x0, 0xe1, 0x8, 0x80, + 0x2c, 0xcc, 0xc8, 0x3c, 0x0, 0xe1, 0x8, 0x80, + 0x3, 0x33, 0xb6, 0x3f, 0xbb, 0xfc, 0xbe, 0x80, + 0x0, 0x3, 0xe0, 0x3c, 0x22, 0xe3, 0x29, 0x80, + 0x0, 0xc, 0x72, 0x3c, 0x0, 0xe1, 0x8, 0x80, + 0x0, 0x8f, 0x2d, 0x5d, 0x22, 0xe3, 0x29, 0x80, + 0x6, 0xff, 0xe4, 0x2c, 0xcc, 0xfc, 0xcc, 0x60, + 0x5f, 0x5f, 0x8a, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x23, 0xf, 0x6, 0x2c, 0xcc, 0xfc, 0xcc, 0x70, + 0x0, 0xf, 0x0, 0x2, 0x22, 0xe4, 0x22, 0x10, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xf, 0x0, 0xef, 0xff, 0xff, 0xff, 0xf3, + + /* U+88FD "製" */ + 0x0, 0x10, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd2, 0x88, 0x0, 0x0, 0xe1, 0xe, 0x10, + 0x6, 0xdb, 0xdd, 0xbb, 0x40, 0xe1, 0xe, 0x10, + 0xb, 0x64, 0xaa, 0x44, 0x40, 0xe1, 0xe, 0x10, + 0x16, 0x66, 0xbb, 0x66, 0x60, 0xe1, 0xe, 0x10, + 0x3, 0xbb, 0xdd, 0xbb, 0x50, 0xe1, 0xe, 0x10, + 0x4, 0x90, 0x77, 0x6, 0x70, 0x30, 0xe, 0x10, + 0x4, 0x90, 0x77, 0x6d, 0x60, 0x6, 0x6f, 0x10, + 0x1, 0x30, 0x77, 0x1a, 0x80, 0xb, 0xc9, 0x0, + 0x1d, 0xdd, 0xdd, 0xde, 0xfd, 0xdd, 0xdd, 0xd0, + 0x0, 0x0, 0x7, 0xd6, 0xb6, 0x0, 0x49, 0x0, + 0x0, 0x48, 0xe9, 0x10, 0x2e, 0x4a, 0xb2, 0x0, + 0x1d, 0xa5, 0xe1, 0x0, 0x3, 0xe9, 0x0, 0x0, + 0x0, 0x1, 0xf7, 0x9c, 0xb0, 0x2a, 0xd7, 0x30, + 0x0, 0x6, 0xc8, 0x40, 0x0, 0x0, 0x38, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8907 "複" */ + 0x0, 0x32, 0x0, 0x0, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0x20, 0xb, 0xfe, 0xee, 0xee, 0xe0, + 0x4a, 0xaa, 0xa6, 0x6e, 0x0, 0x0, 0x0, 0x0, + 0x36, 0x66, 0xc8, 0xfe, 0xcc, 0xcc, 0xcc, 0x10, + 0x0, 0x2, 0xd0, 0x3e, 0x10, 0x0, 0xe, 0x10, + 0x0, 0xb, 0x63, 0xe, 0xcb, 0xbb, 0xbf, 0x10, + 0x0, 0x5f, 0x4c, 0x1e, 0x10, 0x0, 0xe, 0x10, + 0x3, 0xef, 0xf2, 0xb, 0xcf, 0xcc, 0xcc, 0x10, + 0x3e, 0x5e, 0x79, 0x0, 0x9b, 0x0, 0x0, 0x0, + 0x65, 0xe, 0xb, 0x7, 0xfd, 0xdd, 0xed, 0x0, + 0x0, 0xe, 0x1, 0xad, 0xd5, 0x2, 0xd4, 0x0, + 0x0, 0xe, 0x2, 0x80, 0x1d, 0xad, 0x30, 0x0, + 0x0, 0xe, 0x0, 0x4, 0x9d, 0xae, 0xa5, 0x10, + 0x0, 0xe, 0x7, 0xda, 0x50, 0x1, 0x7b, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+897F "西" */ + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x4b, 0x0, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xb0, 0xd, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x0, 0xd2, 0x0, 0x0, 0x2, 0xee, + 0xef, 0xfe, 0xef, 0xfe, 0xee, 0x30, 0x2e, 0x0, + 0x5a, 0x0, 0xd3, 0x0, 0xd3, 0x2, 0xe0, 0x9, + 0x70, 0xd, 0x20, 0xd, 0x30, 0x2e, 0x3, 0xe1, + 0x0, 0xd3, 0x0, 0xd3, 0x2, 0xe6, 0xe4, 0x0, + 0xa, 0xfe, 0xff, 0x30, 0x2e, 0x72, 0x0, 0x0, + 0x0, 0x0, 0xd3, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x2e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd3, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc3, + + /* U+8981 "要" */ + 0xd, 0xee, 0xef, 0xfe, 0xef, 0xfe, 0xee, 0xd0, + 0x0, 0x0, 0x7, 0x80, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8, 0x90, 0xb, 0x50, 0x0, 0x0, + 0x0, 0xfd, 0xde, 0xed, 0xdf, 0xed, 0xdf, 0x20, + 0x0, 0xf0, 0x7, 0x80, 0xb, 0x40, 0xe, 0x20, + 0x0, 0xf0, 0x7, 0x80, 0xb, 0x40, 0xe, 0x20, + 0x0, 0xee, 0xee, 0xfe, 0xee, 0xee, 0xee, 0x20, + 0x0, 0x0, 0x3, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xee, 0xe1, + 0x0, 0x0, 0xa9, 0x0, 0x0, 0x8b, 0x0, 0x0, + 0x0, 0x7, 0xf5, 0x10, 0x6, 0xe2, 0x0, 0x0, + 0x0, 0x3, 0x7a, 0xed, 0xcf, 0x40, 0x0, 0x0, + 0x0, 0x13, 0x59, 0xdc, 0x7a, 0xed, 0x83, 0x0, + 0xc, 0xdb, 0x96, 0x10, 0x0, 0x3, 0x9e, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+898B "見" */ + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xf, 0xee, 0xee, 0xee, 0xee, 0xf0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xf, 0x33, 0x33, 0x33, 0x33, 0xf0, 0x0, + 0x0, 0xf, 0xbb, 0xbb, 0xbb, 0xbb, 0xf0, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0xf, 0xee, 0xee, 0xee, 0xee, 0xf0, 0x0, + 0x0, 0x0, 0xe, 0x40, 0xe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0x0, 0xe, 0x20, 0x0, 0x20, + 0x0, 0x1, 0xd7, 0x0, 0xe, 0x20, 0x0, 0xb3, + 0x1, 0x6e, 0xa0, 0x0, 0xe, 0x40, 0x1, 0xe2, + 0x1f, 0xb5, 0x0, 0x0, 0x9, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+898F "規" */ + 0x0, 0x9, 0x60, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x9, 0x60, 0x4, 0xb0, 0x0, 0x8, 0x40, + 0xb, 0xbe, 0xdb, 0x84, 0xb0, 0x0, 0x8, 0x40, + 0x5, 0x5b, 0xa5, 0x44, 0xfe, 0xee, 0xef, 0x40, + 0x0, 0x9, 0x60, 0x4, 0xb0, 0x0, 0x8, 0x40, + 0x0, 0x9, 0x70, 0x5, 0xd7, 0x77, 0x7c, 0x40, + 0x4f, 0xff, 0xff, 0xf5, 0xd5, 0x55, 0x5b, 0x40, + 0x0, 0xa, 0x50, 0x4, 0xb0, 0x0, 0x8, 0x40, + 0x0, 0xc, 0xb0, 0x4, 0xfe, 0xee, 0xef, 0x40, + 0x0, 0xe, 0x8a, 0x0, 0x1f, 0x14, 0xc0, 0x0, + 0x0, 0x5a, 0xb, 0x90, 0x4d, 0x4, 0xb0, 0x0, + 0x0, 0xd5, 0x1, 0x80, 0xb6, 0x4, 0xb0, 0xa3, + 0x9, 0xc0, 0x0, 0xa, 0xc0, 0x4, 0xc0, 0xb2, + 0x2d, 0x10, 0x2, 0xe9, 0x0, 0x1, 0xef, 0xd0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+8996 "視" */ + 0x0, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x20, 0xd, 0xee, 0xee, 0xef, 0x10, + 0x0, 0x7, 0x70, 0xd, 0x20, 0x0, 0xe, 0x10, + 0x3a, 0xab, 0xba, 0xd, 0x20, 0x0, 0xe, 0x10, + 0x27, 0x77, 0x9d, 0xd, 0xed, 0xdd, 0xdf, 0x10, + 0x0, 0x0, 0xb4, 0xd, 0x20, 0x0, 0xe, 0x10, + 0x0, 0x7, 0x90, 0xd, 0xcc, 0xcc, 0xcf, 0x10, + 0x0, 0x5f, 0xb0, 0xd, 0x31, 0x11, 0x1e, 0x10, + 0x6, 0xef, 0xb9, 0xd, 0x20, 0x0, 0xe, 0x10, + 0x7c, 0x1e, 0x2c, 0x3c, 0xef, 0xef, 0xee, 0x10, + 0x20, 0xe, 0x11, 0x0, 0x68, 0xe, 0x20, 0x0, + 0x0, 0xe, 0x10, 0x0, 0xa6, 0xe, 0x20, 0x0, + 0x0, 0xe, 0x10, 0x2, 0xe0, 0xe, 0x20, 0x90, + 0x0, 0xe, 0x10, 0x3d, 0x60, 0xe, 0x20, 0xe0, + 0x0, 0xe, 0x15, 0xd5, 0x0, 0xa, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+899A "覚" */ + 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x20, 0x0, + 0x9, 0x90, 0x5, 0xd0, 0x0, 0x7c, 0x0, 0x0, + 0xd, 0x40, 0xb, 0x40, 0x2e, 0x10, 0x0, 0xbe, + 0xfe, 0xee, 0xee, 0xef, 0xfe, 0xe4, 0xc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xb, 0x40, 0xc3, 0x9b, + 0xbb, 0xbb, 0xbb, 0xb1, 0xb4, 0x2, 0xc, 0x30, + 0x0, 0x0, 0xe, 0x12, 0x10, 0x0, 0xcc, 0xbb, + 0xbb, 0xbb, 0xf1, 0x0, 0x0, 0xc, 0x30, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x0, 0xcc, 0xbb, 0xbb, + 0xbb, 0xf1, 0x0, 0x0, 0xc, 0x30, 0x0, 0x0, + 0xe, 0x10, 0x0, 0x0, 0xac, 0xdd, 0xbc, 0xeb, + 0xd1, 0x0, 0x0, 0x0, 0x1f, 0x20, 0xf, 0x0, + 0x1, 0x60, 0x2, 0x7e, 0x70, 0x0, 0xf0, 0x0, + 0x4b, 0x3f, 0xd9, 0x20, 0x0, 0xb, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+89AA "親" */ + 0x0, 0x4, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xd1, 0x0, 0x8f, 0xee, 0xef, 0xa0, + 0xf, 0xff, 0xff, 0xfa, 0x87, 0x0, 0x6, 0xa0, + 0x0, 0x81, 0x2, 0x90, 0x87, 0x0, 0x6, 0xa0, + 0x0, 0xa4, 0x5, 0xa0, 0x8f, 0xee, 0xef, 0xa0, + 0x0, 0x67, 0xa, 0x40, 0x87, 0x0, 0x6, 0xa0, + 0x4d, 0xdd, 0xdf, 0xdc, 0x88, 0x11, 0x17, 0xa0, + 0x2, 0x22, 0xe3, 0x22, 0x8d, 0xcc, 0xcd, 0xa0, + 0x6, 0x66, 0xf7, 0x65, 0x87, 0x0, 0x6, 0xa0, + 0x5, 0x55, 0xf6, 0x54, 0x8e, 0xdd, 0xde, 0xa0, + 0x0, 0xc2, 0xe2, 0xb0, 0x8, 0x92, 0xe1, 0x0, + 0x3, 0xc0, 0xe1, 0xa4, 0xa, 0x51, 0xe0, 0x0, + 0xc, 0x50, 0xe1, 0x38, 0xe, 0x11, 0xe0, 0x39, + 0x5, 0x0, 0xe1, 0x0, 0xa9, 0x1, 0xe0, 0x49, + 0x0, 0x4e, 0xc0, 0x1d, 0xa0, 0x0, 0xed, 0xe5, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x10, + + /* U+89BA "覺" */ + 0x0, 0x0, 0x46, 0x11, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0x61, 0x2d, 0xa0, 0xab, 0xf6, 0x0, + 0x0, 0x99, 0x65, 0x86, 0x80, 0x46, 0xe5, 0x0, + 0x0, 0x88, 0x54, 0x27, 0xa2, 0x35, 0xf5, 0x0, + 0x0, 0x7d, 0xba, 0x1c, 0xc1, 0x9b, 0xf3, 0x0, + 0x5, 0xaa, 0x55, 0xc8, 0x97, 0x56, 0xf7, 0x40, + 0xe, 0x76, 0x66, 0x66, 0x66, 0x66, 0x68, 0xc0, + 0xc, 0x1a, 0xba, 0xaa, 0xaa, 0xac, 0x12, 0xb0, + 0x0, 0xd, 0x53, 0x33, 0x33, 0x3f, 0x20, 0x0, + 0x0, 0xd, 0x76, 0x66, 0x66, 0x6f, 0x20, 0x0, + 0x0, 0xd, 0xba, 0xaa, 0xaa, 0xaf, 0x20, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x9, 0xae, 0xca, 0xbf, 0xaa, 0x10, 0x10, + 0x0, 0x1, 0x8d, 0x10, 0x1e, 0x0, 0x0, 0xa4, + 0x3b, 0xdc, 0x70, 0x0, 0xc, 0xed, 0xde, 0xd0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+89C0 "觀" */ + 0x0, 0x3c, 0x0, 0xe0, 0xb, 0xdc, 0xce, 0xa0, + 0xc, 0xcf, 0xcc, 0xfc, 0x8b, 0x10, 0x6, 0xa0, + 0x0, 0x2, 0x0, 0x20, 0xb, 0x10, 0x6, 0xa0, + 0x9, 0xbc, 0x5b, 0xad, 0x3b, 0xcc, 0xcd, 0xa0, + 0x9, 0x16, 0x5b, 0x8, 0x3b, 0x10, 0x6, 0xa0, + 0x6, 0xbb, 0x38, 0xaa, 0x2b, 0x98, 0x8b, 0xa0, + 0x0, 0x76, 0xc, 0x0, 0xb, 0x43, 0x38, 0xa0, + 0x1, 0xec, 0xcf, 0xdc, 0x5b, 0x10, 0x6, 0xa0, + 0xb, 0xf0, 0xe, 0x0, 0xa, 0xff, 0xff, 0xa0, + 0x2a, 0xec, 0xcf, 0xcc, 0x0, 0xc0, 0xc0, 0x0, + 0x0, 0xe5, 0x5e, 0x55, 0x0, 0xc0, 0xc0, 0x0, + 0x0, 0xe5, 0x5e, 0x55, 0x3, 0xa0, 0xc0, 0x7, + 0x0, 0xea, 0xaf, 0xaa, 0x4c, 0x30, 0xc0, 0xa, + 0x0, 0xe2, 0x22, 0x22, 0x97, 0x0, 0x9e, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+89D2 "角" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xee, 0xee, 0xf6, 0x0, 0x0, 0x2, 0xf2, + 0x0, 0x3, 0xe1, 0x0, 0x0, 0x3e, 0x70, 0x0, + 0xd, 0x60, 0x0, 0x3, 0xef, 0xee, 0xee, 0xef, + 0xee, 0xee, 0xc, 0x8e, 0x30, 0x3, 0xe0, 0x0, + 0x3f, 0x0, 0xe, 0x20, 0x2, 0xe0, 0x0, 0x2f, + 0x0, 0xe, 0xdc, 0xcd, 0xfc, 0xcc, 0xdf, 0x0, + 0xf, 0x42, 0x24, 0xe2, 0x22, 0x4f, 0x0, 0xf, + 0x10, 0x2, 0xe0, 0x0, 0x2f, 0x0, 0x1f, 0x33, + 0x35, 0xf3, 0x33, 0x5f, 0x0, 0x4f, 0xbb, 0xbc, + 0xfb, 0xbb, 0xcf, 0x0, 0xa8, 0x0, 0x2, 0xe0, + 0x0, 0x2f, 0x3, 0xf2, 0x0, 0x2, 0xe0, 0x0, + 0x3f, 0xa, 0x60, 0x0, 0x2, 0xe0, 0x9f, 0xe9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+89E3 "解" */ + 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0x0, 0x0, 0x5e, 0xef, 0xee, 0xf4, + 0x0, 0x9e, 0xde, 0xe0, 0x0, 0x5b, 0x0, 0xb3, + 0x1, 0xf2, 0xa, 0x70, 0x0, 0xb6, 0x0, 0xd2, + 0xa, 0xe7, 0x8f, 0x86, 0x3, 0xe0, 0x0, 0xf0, + 0x1e, 0xe5, 0xd5, 0x5e, 0x4d, 0x30, 0xbd, 0xb0, + 0x0, 0xe0, 0xc0, 0xe, 0x24, 0x51, 0xb1, 0x0, + 0x0, 0xf9, 0xea, 0x9e, 0x7, 0x82, 0xe0, 0x0, + 0x0, 0xe3, 0xd4, 0x3e, 0xc, 0xff, 0xff, 0xf5, + 0x1, 0xe0, 0xc0, 0xe, 0x4c, 0x2, 0xe0, 0x0, + 0x2, 0xe8, 0xe8, 0x8e, 0x33, 0x2, 0xe0, 0x0, + 0x3, 0xc5, 0xd5, 0x5e, 0x6f, 0xff, 0xff, 0xfb, + 0x6, 0x80, 0xc0, 0xe, 0x0, 0x2, 0xe0, 0x0, + 0xa, 0x40, 0xc0, 0xe, 0x0, 0x2, 0xe0, 0x0, + 0x1c, 0x0, 0x59, 0xe9, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+89E6 "触" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x0, 0x6f, 0xde, 0xe0, 0x0, 0xf, 0x10, 0x0, + 0x0, 0xb4, 0xa, 0x90, 0x13, 0x3f, 0x43, 0x30, + 0x5, 0xe2, 0x3f, 0x31, 0x7e, 0xdf, 0xdd, 0xd0, + 0xe, 0xfb, 0xfb, 0xbc, 0x76, 0xe, 0x1, 0xd0, + 0x3, 0xd0, 0xd0, 0x1c, 0x76, 0xe, 0x1, 0xd0, + 0x0, 0xfb, 0xfb, 0xcc, 0x76, 0xe, 0x1, 0xd0, + 0x0, 0xe1, 0xd1, 0x2c, 0x7b, 0x8f, 0x89, 0xd0, + 0x0, 0xd0, 0xd0, 0x1c, 0x36, 0x6f, 0x76, 0x50, + 0x1, 0xfd, 0xfd, 0xdc, 0x0, 0xf, 0x17, 0x0, + 0x2, 0xb0, 0xd0, 0x1c, 0x0, 0xf, 0x19, 0x60, + 0x5, 0x80, 0xd0, 0x1c, 0x0, 0xf, 0x46, 0xd0, + 0x8, 0x40, 0xd0, 0x1c, 0x9c, 0xef, 0xfc, 0xd3, + 0xc, 0x0, 0xd5, 0xe8, 0x87, 0x41, 0x0, 0x68, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A00 "言" */ + 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xdd, 0xdd, 0xdd, 0xdd, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xdd, 0xdd, 0xdd, 0xdd, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, 0xe0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xe, 0x42, 0x22, 0x22, 0x24, 0xf0, 0x0, + 0x0, 0xe, 0xcb, 0xbb, 0xbb, 0xbc, 0xf0, 0x0, + + /* U+8A08 "計" */ + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0x50, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x2b, 0x0, 0x0, 0x2, 0xe0, 0x0, 0xb, 0xbb, + 0xcb, 0xb7, 0x0, 0x2e, 0x0, 0x0, 0x11, 0x11, + 0x11, 0x0, 0x2, 0xe0, 0x0, 0x2, 0xcc, 0xcc, + 0xc0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x42, 0xbb, 0xbb, 0xa0, + 0x0, 0x2e, 0x0, 0x0, 0x2, 0x22, 0x22, 0x0, + 0x2, 0xe0, 0x0, 0x0, 0x22, 0x22, 0x20, 0x0, + 0x2e, 0x0, 0x0, 0x1f, 0xcc, 0xce, 0x0, 0x2, + 0xe0, 0x0, 0x1, 0xc0, 0x0, 0xe0, 0x0, 0x2e, + 0x0, 0x0, 0x1c, 0x0, 0xe, 0x0, 0x2, 0xe0, + 0x0, 0x1, 0xfd, 0xdd, 0xe0, 0x0, 0x2e, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, + + /* U+8A0A "訊" */ + 0x0, 0x2a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x2f, 0xff, 0xff, 0xfd, 0x0, + 0x1, 0x15, 0x41, 0x10, 0x1f, 0x0, 0x3d, 0x0, + 0x1d, 0xdd, 0xdd, 0x90, 0x1e, 0x0, 0x3d, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x3c, 0x0, + 0x5, 0xcc, 0xcc, 0x0, 0x1e, 0x0, 0x3c, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x3c, 0x0, + 0x5, 0xbb, 0xbb, 0x5d, 0xdf, 0xdd, 0x6c, 0x0, + 0x1, 0x22, 0x22, 0x12, 0x4f, 0x22, 0x3d, 0x0, + 0x1, 0x22, 0x22, 0x0, 0x1e, 0x0, 0x2d, 0x0, + 0x6, 0xdc, 0xcf, 0x10, 0x1e, 0x0, 0x1e, 0x0, + 0x6, 0x60, 0xc, 0x10, 0x1e, 0x0, 0xf, 0x0, + 0x6, 0x60, 0xc, 0x10, 0x1e, 0x0, 0xe, 0x38, + 0x6, 0xed, 0xdf, 0x10, 0x1e, 0x0, 0xa, 0x97, + 0x6, 0x70, 0x0, 0x0, 0x1e, 0x0, 0x3, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + + /* U+8A0E "討" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x1a, 0xaa, 0xaa, 0x90, 0x0, 0x0, 0xe2, 0x0, + 0x2, 0x22, 0x22, 0x2b, 0xbb, 0xbb, 0xfc, 0xb1, + 0x6, 0xcc, 0xcc, 0x32, 0x22, 0x22, 0xe4, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x5, 0xbb, 0xbb, 0x30, 0xe2, 0x0, 0xe2, 0x0, + 0x1, 0x22, 0x22, 0x0, 0x7a, 0x0, 0xe2, 0x0, + 0x1, 0x22, 0x22, 0x0, 0xe, 0x10, 0xe2, 0x0, + 0x7, 0xdc, 0xce, 0x40, 0xa, 0x70, 0xe2, 0x0, + 0x7, 0x70, 0xa, 0x40, 0x1, 0x0, 0xe2, 0x0, + 0x7, 0x70, 0xa, 0x40, 0x0, 0x0, 0xe2, 0x0, + 0x7, 0xed, 0xdf, 0x40, 0x0, 0x11, 0xf2, 0x0, + 0x7, 0x70, 0x0, 0x0, 0x7, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A13 "訓" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x40, 0x0, 0xb2, 0xf, 0x0, 0xf0, + 0x2, 0x25, 0x52, 0x10, 0xd2, 0xf, 0x0, 0xf0, + 0x1d, 0xdd, 0xdd, 0x90, 0xd2, 0xf, 0x0, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xd2, 0xf, 0x0, 0xf0, + 0x5, 0xcc, 0xcc, 0x10, 0xd2, 0xf, 0x0, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xd2, 0xf, 0x0, 0xf0, + 0x5, 0xbb, 0xbb, 0x10, 0xe2, 0xf, 0x0, 0xf0, + 0x1, 0x22, 0x22, 0x0, 0xf2, 0xf, 0x0, 0xf0, + 0x1, 0x22, 0x22, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0x7, 0xec, 0xce, 0x31, 0xe0, 0xf, 0x0, 0xf0, + 0x7, 0x70, 0xb, 0x35, 0xb0, 0xf, 0x0, 0xf0, + 0x7, 0x70, 0xb, 0x3a, 0x60, 0xe, 0x0, 0xf0, + 0x7, 0xed, 0xdf, 0x6e, 0x10, 0x0, 0x0, 0xf0, + 0x7, 0x70, 0x0, 0x96, 0x0, 0x0, 0x0, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A18 "記" */ + 0x0, 0x2b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x80, 0x6, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x3, 0x40, 0x0, 0x0, 0x0, 0xe, 0x10, + 0x4e, 0xee, 0xee, 0xe1, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, + 0x7, 0xdd, 0xdd, 0x30, 0x0, 0x0, 0xe, 0x10, + 0x0, 0x0, 0x0, 0x1, 0x77, 0x77, 0x7f, 0x10, + 0x8, 0xaa, 0xaa, 0x62, 0xf8, 0x88, 0x8f, 0x10, + 0x2, 0x33, 0x33, 0x22, 0xe0, 0x0, 0x5, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x9, 0xed, 0xdf, 0x42, 0xe0, 0x0, 0x0, 0x0, + 0x9, 0x50, 0xa, 0x42, 0xe0, 0x0, 0x0, 0x70, + 0x9, 0x50, 0xa, 0x42, 0xe0, 0x0, 0x0, 0xe1, + 0x9, 0xdb, 0xbe, 0x42, 0xf1, 0x0, 0x3, 0xe0, + 0x9, 0x72, 0x22, 0x0, 0xbf, 0xff, 0xfe, 0x60, + + /* U+8A2A "訪" */ + 0x0, 0x25, 0x0, 0x0, 0x0, 0x51, 0x0, 0x0, + 0x0, 0x1e, 0x10, 0x0, 0x0, 0xa6, 0x0, 0x0, + 0x0, 0x7, 0x30, 0x0, 0x0, 0x5a, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0x8d, 0xdd, 0xde, 0xdd, 0xd1, + 0x0, 0x0, 0x0, 0x2, 0x2d, 0x52, 0x22, 0x20, + 0x5, 0xcc, 0xcc, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x64, 0x44, 0x10, + 0x5, 0xbb, 0xbb, 0x0, 0xf, 0xbb, 0xbe, 0x50, + 0x1, 0x22, 0x22, 0x0, 0x2e, 0x0, 0xb, 0x40, + 0x1, 0x22, 0x22, 0x0, 0x4b, 0x0, 0xc, 0x30, + 0x7, 0xdc, 0xcf, 0x0, 0x97, 0x0, 0xd, 0x20, + 0x7, 0x60, 0xe, 0x0, 0xf2, 0x0, 0xe, 0x10, + 0x7, 0x60, 0xe, 0x7, 0xb0, 0x0, 0xf, 0x0, + 0x7, 0xed, 0xdf, 0x5f, 0x20, 0x0, 0x4d, 0x0, + 0x6, 0x60, 0x0, 0xd4, 0x0, 0x8f, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A2D "設" */ + 0x0, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x30, 0x0, 0xdf, 0xff, 0xf1, 0x0, + 0x0, 0x5, 0x60, 0x0, 0xe1, 0x0, 0xe1, 0x0, + 0x2e, 0xee, 0xee, 0xd0, 0xf1, 0x0, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xe0, 0x0, 0xe1, 0x0, + 0x5, 0xcc, 0xcc, 0x3c, 0x80, 0x0, 0xdc, 0xb1, + 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x13, 0x30, + 0x2, 0x55, 0x55, 0x22, 0x11, 0x11, 0x11, 0x0, + 0x4, 0x99, 0x99, 0x5e, 0xee, 0xee, 0xef, 0x30, + 0x1, 0x22, 0x22, 0x5, 0x90, 0x0, 0x4c, 0x0, + 0x7, 0xec, 0xce, 0x30, 0xc4, 0x1, 0xd4, 0x0, + 0x7, 0x70, 0xb, 0x30, 0x2e, 0x5d, 0x60, 0x0, + 0x7, 0x70, 0xb, 0x30, 0x9, 0xfc, 0x10, 0x0, + 0x7, 0xed, 0xdf, 0x45, 0xcd, 0x3a, 0xf8, 0x30, + 0x7, 0x70, 0x0, 0x9e, 0x70, 0x0, 0x4b, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A31 "許" */ + 0x0, 0x4, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x6d, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x40, 0x0, 0xb9, 0x22, 0x22, 0x20, + 0x5e, 0xee, 0xee, 0xd2, 0xfd, 0xdf, 0xdd, 0xd0, + 0x0, 0x0, 0x0, 0xb, 0xa0, 0x2e, 0x0, 0x0, + 0x7, 0xcc, 0xcc, 0x9f, 0x20, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0x0, 0x2e, 0x0, 0x0, + 0x3, 0x66, 0x66, 0x21, 0x11, 0x3e, 0x11, 0x10, + 0x5, 0x88, 0x88, 0x5f, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x11, 0x11, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x9, 0xed, 0xdf, 0x40, 0x0, 0x2e, 0x0, 0x0, + 0x9, 0x50, 0xa, 0x40, 0x0, 0x2e, 0x0, 0x0, + 0x9, 0x50, 0xa, 0x40, 0x0, 0x2e, 0x0, 0x0, + 0x9, 0xdc, 0xce, 0x40, 0x0, 0x2e, 0x0, 0x0, + 0x8, 0x51, 0x11, 0x0, 0x0, 0x2e, 0x0, 0x0, + + /* U+8A33 "訳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x80, 0x0, 0xff, 0xff, 0xff, 0xe0, + 0x3, 0x35, 0x63, 0x30, 0xf0, 0x0, 0x1, 0xe0, + 0x1c, 0xcc, 0xcc, 0x90, 0xf0, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x1, 0xe0, + 0x5, 0xcc, 0xcc, 0x20, 0xf0, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xf7, 0x77, 0x78, 0xe0, + 0x5, 0xbb, 0xbb, 0x21, 0xf8, 0x8c, 0xb8, 0x70, + 0x1, 0x22, 0x22, 0x3, 0xd0, 0x6, 0x90, 0x0, + 0x1, 0x22, 0x22, 0x4, 0xb0, 0x2, 0xd0, 0x0, + 0x7, 0xec, 0xce, 0x46, 0x90, 0x0, 0xd3, 0x0, + 0x7, 0x70, 0xa, 0x4a, 0x70, 0x0, 0x7b, 0x0, + 0x7, 0x70, 0xa, 0x5e, 0x20, 0x0, 0x1e, 0x50, + 0x7, 0xed, 0xdf, 0xbc, 0x0, 0x0, 0x5, 0xf5, + 0x7, 0x80, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x6a, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A34 "訴" */ + 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x5, 0x10, + 0x0, 0xc, 0x40, 0x0, 0x3, 0x6a, 0xeb, 0x50, + 0x0, 0x4, 0x70, 0x0, 0xec, 0x85, 0x10, 0x0, + 0x1e, 0xee, 0xee, 0xa0, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf1, 0x0, 0x0, 0x0, + 0x5, 0xcc, 0xcc, 0x0, 0xf7, 0x66, 0x66, 0x63, + 0x0, 0x0, 0x0, 0x0, 0xf9, 0x99, 0xf9, 0x94, + 0x5, 0xbb, 0xbb, 0x10, 0xf1, 0x0, 0xf1, 0x0, + 0x1, 0x22, 0x22, 0x2, 0xf8, 0x71, 0xf1, 0x0, + 0x1, 0x22, 0x22, 0x3, 0xe6, 0xee, 0xf1, 0x0, + 0x6, 0xec, 0xcf, 0x15, 0xc0, 0x6, 0xfc, 0x50, + 0x6, 0x80, 0xd, 0x1a, 0x70, 0x0, 0xf6, 0xd5, + 0x6, 0x80, 0xd, 0x2f, 0x20, 0x0, 0xf1, 0x0, + 0x6, 0xed, 0xdf, 0xbb, 0x0, 0x0, 0xf1, 0x0, + 0x6, 0x90, 0x0, 0x92, 0x0, 0x0, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+8A55 "評" */ + 0x0, 0x29, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x40, 0xa, 0xff, 0xff, 0xff, 0xf6, + 0x1, 0x15, 0x41, 0x10, 0x0, 0x2e, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xa1, 0xb0, 0x1e, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0xe1, 0x1e, 0x4, 0xb0, + 0x5, 0xcc, 0xcc, 0x0, 0xa5, 0x1e, 0x8, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x78, 0x1e, 0xd, 0x10, + 0x5, 0xbb, 0xbb, 0x0, 0x22, 0x1e, 0x4, 0x0, + 0x1, 0x22, 0x22, 0x4c, 0xcc, 0xdf, 0xcc, 0xc9, + 0x1, 0x22, 0x22, 0x28, 0x88, 0x9f, 0x88, 0x86, + 0x7, 0xdc, 0xcf, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x7, 0x60, 0xd, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x7, 0x60, 0xd, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x7, 0xed, 0xdf, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x7, 0x70, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, + + /* U+8A66 "試" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x0, 0x0, 0x0, 0xf, 0x47, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0xe, 0x1b, 0x50, + 0x2a, 0xaa, 0xaa, 0x23, 0x33, 0x3e, 0x55, 0x60, + 0x2, 0x22, 0x22, 0x5a, 0xaa, 0xaf, 0xba, 0xa2, + 0x6, 0xcc, 0xc9, 0x0, 0x0, 0xc, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x11, 0x11, 0x1b, 0x40, 0x0, + 0x6, 0xbb, 0xb8, 0xae, 0xfe, 0xaa, 0x50, 0x0, + 0x1, 0x22, 0x21, 0x0, 0xf0, 0x8, 0x70, 0x0, + 0x1, 0x22, 0x21, 0x0, 0xf0, 0x6, 0x90, 0x0, + 0x8, 0xdc, 0xdb, 0x0, 0xf0, 0x4, 0xb0, 0x0, + 0x8, 0x50, 0x3b, 0x0, 0xf0, 0x23, 0xe0, 0x10, + 0x8, 0x50, 0x3b, 0x37, 0xfd, 0xa2, 0xd2, 0x94, + 0x8, 0xed, 0xeb, 0x87, 0x30, 0x0, 0x89, 0xb2, + 0x8, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xb0, + + /* U+8A71 "話" */ + 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x4, 0x30, + 0x0, 0xd, 0x40, 0x1, 0x47, 0x9c, 0xeb, 0x50, + 0x0, 0x4, 0x70, 0x6, 0xa8, 0x7e, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xa0, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x5, 0xcc, 0xcc, 0x28, 0xaa, 0xbf, 0xaa, 0xa8, + 0x0, 0x0, 0x0, 0x3, 0x55, 0x6f, 0x55, 0x53, + 0x5, 0xbb, 0xbb, 0x20, 0x0, 0x1e, 0x0, 0x0, + 0x1, 0x22, 0x22, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x1, 0x22, 0x22, 0x1, 0x99, 0x9f, 0x99, 0x80, + 0x7, 0xec, 0xce, 0x41, 0xf8, 0x88, 0x89, 0xe0, + 0x7, 0x70, 0xa, 0x41, 0xe0, 0x0, 0x2, 0xe0, + 0x7, 0x70, 0xa, 0x41, 0xe0, 0x0, 0x2, 0xe0, + 0x7, 0xb6, 0x6c, 0x41, 0xe2, 0x22, 0x25, 0xe0, + 0x7, 0xb7, 0x77, 0x21, 0xfc, 0xcc, 0xcd, 0xd0, + + /* U+8A72 "該" */ + 0x0, 0x2, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x1e, 0x10, 0x0, 0x0, 0x6a, 0x0, 0x0, + 0x0, 0x8, 0x80, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0x8, 0x89, 0x98, 0x7c, 0xff, 0xff, 0xff, 0xf7, + 0x4, 0x44, 0x44, 0x30, 0x5, 0xc0, 0x0, 0x0, + 0x5, 0xcc, 0xcc, 0x30, 0xd, 0x20, 0x58, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xba, 0x55, 0xe2, 0x0, + 0x4, 0xbb, 0xbb, 0x37, 0xca, 0xaf, 0x70, 0x0, + 0x1, 0x22, 0x22, 0x0, 0x0, 0xc9, 0x5, 0xc0, + 0x1, 0x22, 0x22, 0x0, 0x1c, 0x80, 0x1e, 0x40, + 0x6, 0xec, 0xce, 0x45, 0xe6, 0x1, 0xd9, 0x0, + 0x6, 0x80, 0x9, 0x47, 0x10, 0x2d, 0xc0, 0x0, + 0x6, 0x80, 0x9, 0x40, 0x7, 0xf8, 0xd7, 0x0, + 0x6, 0xed, 0xdf, 0x45, 0xdd, 0x30, 0x1d, 0x90, + 0x6, 0x80, 0x0, 0xbd, 0x50, 0x0, 0x1, 0xd4, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+8A73 "詳" */ + 0x0, 0x16, 0x0, 0x0, 0x50, 0x0, 0x3, 0x50, + 0x0, 0xd, 0x40, 0x0, 0xb7, 0x0, 0xb, 0x70, + 0x0, 0x4, 0x60, 0x0, 0x2e, 0x0, 0x3d, 0x0, + 0x1e, 0xee, 0xee, 0x95, 0x7d, 0x87, 0xab, 0x73, + 0x0, 0x0, 0x0, 0x5, 0x77, 0x8f, 0x77, 0x73, + 0x5, 0xcc, 0xcc, 0x10, 0x0, 0x1e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x3e, 0x11, 0x10, + 0x5, 0xbb, 0xbb, 0x13, 0xee, 0xef, 0xee, 0xe0, + 0x1, 0x22, 0x22, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x2, 0x55, 0x55, 0x10, 0x0, 0x1e, 0x0, 0x0, + 0x7, 0xdb, 0xbe, 0x40, 0x0, 0x2e, 0x0, 0x0, + 0x7, 0x70, 0xa, 0x4f, 0xff, 0xff, 0xff, 0xfb, + 0x7, 0x70, 0xa, 0x40, 0x0, 0x1e, 0x0, 0x0, + 0x7, 0xed, 0xdf, 0x40, 0x0, 0x1e, 0x0, 0x0, + 0x7, 0x70, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, + + /* U+8A8C "誌" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7a, 0x0, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0xd3, 0x0, 0x0, + 0x3a, 0xab, 0xaa, 0x7f, 0xff, 0xff, 0xff, 0xf1, + 0x2, 0x22, 0x22, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x9, 0xcc, 0xc6, 0x0, 0x0, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2b, 0xbb, 0xfc, 0xbb, 0x90, + 0x8, 0xbb, 0xb5, 0x3, 0x35, 0x93, 0x33, 0x30, + 0x1, 0x22, 0x21, 0x0, 0x2, 0xd5, 0x0, 0x0, + 0x1, 0x22, 0x21, 0x0, 0x27, 0x2e, 0x20, 0x0, + 0xa, 0xdc, 0xd8, 0x1d, 0x3c, 0x3, 0x1d, 0x10, + 0xa, 0x30, 0x48, 0x4c, 0x3c, 0x0, 0x17, 0x90, + 0xa, 0x30, 0x48, 0x98, 0x3c, 0x0, 0xd2, 0xe0, + 0xa, 0x86, 0x99, 0xc1, 0x3d, 0x0, 0xe0, 0xa2, + 0xa, 0x97, 0x74, 0x0, 0xc, 0xee, 0x90, 0x0, + + /* U+8A8D "認" */ + 0x0, 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0x20, 0xb, 0xee, 0xef, 0xee, 0xf0, + 0x0, 0x5, 0x50, 0x0, 0x50, 0x4a, 0x0, 0xf0, + 0x1e, 0xee, 0xee, 0x91, 0xd0, 0x87, 0x0, 0xf0, + 0x0, 0x0, 0x0, 0xb, 0x40, 0xe1, 0x1, 0xe0, + 0x5, 0xcc, 0xcc, 0x14, 0x8, 0xa0, 0x3, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0x13, 0x6a, 0x90, + 0x5, 0xbb, 0xbb, 0xb, 0xb2, 0x2, 0x87, 0x10, + 0x1, 0x22, 0x22, 0x1, 0x0, 0xb0, 0x0, 0x0, + 0x1, 0x22, 0x22, 0x0, 0x2, 0x88, 0x2, 0x0, + 0x7, 0xdc, 0xcf, 0x2a, 0x3d, 0xd, 0xa, 0x50, + 0x7, 0x70, 0xc, 0x2d, 0x1d, 0x4, 0x1, 0xe0, + 0x7, 0x70, 0xc, 0x7a, 0x1d, 0x0, 0xb, 0x96, + 0x7, 0xed, 0xdf, 0x92, 0x1e, 0x0, 0x2c, 0x22, + 0x7, 0x70, 0x0, 0x0, 0xc, 0xff, 0xf7, 0x0, + + /* U+8A95 "誕" */ + 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5, 0x50, + 0x0, 0xb4, 0x6, 0xff, 0xe2, 0x7a, 0xeb, 0x50, + 0x0, 0x55, 0x0, 0x6, 0x94, 0x84, 0xe0, 0x0, + 0x5f, 0xff, 0xf0, 0xd, 0x30, 0x0, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0x0, 0x10, 0xe0, 0x0, + 0xa, 0xdd, 0x90, 0xd6, 0x20, 0xd0, 0xe2, 0x20, + 0x0, 0x0, 0x5, 0xbb, 0xf0, 0xd0, 0xfc, 0xc0, + 0x8, 0xbb, 0x70, 0x0, 0xd0, 0xd0, 0xe0, 0x0, + 0x1, 0x22, 0x13, 0x52, 0xc0, 0xd0, 0xe0, 0x0, + 0x1, 0x22, 0x12, 0xa5, 0x90, 0xd0, 0xe0, 0x0, + 0xd, 0xcc, 0xb0, 0xda, 0x40, 0xd0, 0xe0, 0x0, + 0xd, 0x2, 0xb0, 0x6f, 0x0, 0xe9, 0xf9, 0x91, + 0xd, 0x2, 0xb0, 0x8f, 0x60, 0x33, 0x33, 0x30, + 0xd, 0xcd, 0xb5, 0xd1, 0xca, 0x30, 0x0, 0x0, + 0xd, 0x11, 0x2e, 0x30, 0x7, 0xce, 0xff, 0xf3, + 0x2, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A98 "誘" */ + 0x0, 0x63, 0x0, 0x0, 0x12, 0x46, 0x9b, 0x10, + 0x0, 0x2e, 0x0, 0x5d, 0xcb, 0xf8, 0x52, 0x0, + 0x0, 0x9, 0x30, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0x5e, 0xee, 0xee, 0x56, 0x66, 0xe7, 0x66, 0x61, + 0x0, 0x0, 0x0, 0x57, 0x8f, 0xff, 0xa7, 0x71, + 0x8, 0xcc, 0xc7, 0x0, 0xa8, 0xd5, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0x90, 0xd1, 0x4e, 0x60, + 0x7, 0xaa, 0xa6, 0xd6, 0x0, 0xb1, 0x2, 0xc3, + 0x2, 0x33, 0x31, 0x5b, 0xbb, 0xbb, 0x80, 0x0, + 0x5, 0x88, 0x85, 0x13, 0xb8, 0x3a, 0x80, 0x0, + 0xb, 0x85, 0x89, 0x0, 0xb4, 0xd, 0xdb, 0xa0, + 0xb, 0x30, 0x49, 0x0, 0xe1, 0x2, 0x25, 0xc0, + 0xb, 0x30, 0x49, 0x5, 0xb0, 0x0, 0x5, 0xb0, + 0xb, 0xdc, 0xd9, 0x3e, 0x20, 0x0, 0x8, 0x80, + 0x9, 0x41, 0x11, 0xc4, 0x0, 0x1d, 0xed, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8A9E "語" */ + 0x0, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x50, 0xe, 0xef, 0xfe, 0xee, 0xe3, + 0x0, 0x3, 0x60, 0x0, 0x4, 0xb0, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xb2, 0x4a, 0xb4, 0x44, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xae, 0xca, 0xaf, 0x0, + 0x5, 0xcc, 0xcc, 0x20, 0xd, 0x20, 0xf, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0xf, 0x0, + 0x4, 0xbb, 0xbb, 0x7d, 0xdf, 0xdd, 0xdf, 0xd7, + 0x1, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x22, 0x22, 0x2, 0x44, 0x44, 0x44, 0x20, + 0x6, 0xec, 0xce, 0x47, 0xda, 0xaa, 0xad, 0x80, + 0x6, 0x80, 0xa, 0x47, 0x80, 0x0, 0x7, 0x80, + 0x6, 0x80, 0xa, 0x47, 0x80, 0x0, 0x7, 0x80, + 0x6, 0xb6, 0x6c, 0x47, 0xa3, 0x33, 0x39, 0x80, + 0x6, 0xc7, 0x77, 0x27, 0xeb, 0xbb, 0xbd, 0x80, + + /* U+8AAA "說" */ + 0x0, 0x52, 0x0, 0x0, 0x31, 0x5, 0x20, 0x0, + 0x0, 0x5b, 0x0, 0x0, 0xd1, 0x4, 0xc0, 0x0, + 0x0, 0xa, 0x0, 0x7, 0x80, 0x0, 0xb5, 0x0, + 0x7e, 0xee, 0xee, 0x4d, 0x10, 0x0, 0x2e, 0x30, + 0x0, 0x0, 0x0, 0xe7, 0x44, 0x44, 0x48, 0xe1, + 0xa, 0xcc, 0xc6, 0x2e, 0xba, 0xaa, 0xbf, 0x10, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, 0xf, 0x0, + 0x9, 0xbb, 0xb6, 0xe, 0x10, 0x0, 0xf, 0x0, + 0x2, 0x22, 0x21, 0xe, 0x98, 0x88, 0x8f, 0x0, + 0x2, 0x22, 0x21, 0xa, 0xde, 0xbf, 0xcb, 0x0, + 0xd, 0xcc, 0xda, 0x0, 0x87, 0xe, 0x10, 0x0, + 0xd, 0x0, 0x4a, 0x0, 0xb5, 0xe, 0x10, 0x0, + 0xd, 0x0, 0x4a, 0x2, 0xf0, 0xe, 0x10, 0xa0, + 0xd, 0xdd, 0xea, 0x3e, 0x60, 0xe, 0x10, 0xe0, + 0xc, 0x10, 0x2, 0xd5, 0x0, 0xa, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8AAC "説" */ + 0x0, 0x16, 0x0, 0x0, 0x60, 0x0, 0x5, 0x30, + 0x0, 0xd, 0x30, 0x0, 0x99, 0x0, 0xe, 0x30, + 0x0, 0x4, 0x60, 0x0, 0x1f, 0x10, 0x4c, 0x0, + 0x1e, 0xee, 0xee, 0x92, 0x6b, 0x76, 0xca, 0x40, + 0x0, 0x0, 0x0, 0x7, 0xc8, 0x88, 0x8a, 0xc0, + 0x5, 0xcc, 0xcc, 0x17, 0x80, 0x0, 0x2, 0xc0, + 0x0, 0x0, 0x0, 0x7, 0x80, 0x0, 0x2, 0xc0, + 0x5, 0xbb, 0xbb, 0x17, 0xa2, 0x22, 0x25, 0xc0, + 0x1, 0x22, 0x22, 0x7, 0xff, 0xff, 0xff, 0xc0, + 0x1, 0x22, 0x22, 0x0, 0xc, 0x42, 0xd0, 0x0, + 0x7, 0xec, 0xcf, 0x30, 0xf, 0x12, 0xd0, 0x0, + 0x7, 0x70, 0xb, 0x30, 0x4d, 0x2, 0xd0, 0x0, + 0x7, 0x70, 0xb, 0x30, 0xc6, 0x2, 0xd0, 0x37, + 0x7, 0xed, 0xdf, 0x4b, 0xb0, 0x2, 0xe0, 0x59, + 0x7, 0x70, 0x0, 0xca, 0x10, 0x0, 0xdf, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8AAD "読" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x87, 0x0, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0xc, 0x10, 0x6e, 0xee, 0xff, 0xee, 0xe1, + 0x3b, 0xbb, 0xbb, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xaa, 0xec, 0xaa, 0x50, + 0x9, 0xcc, 0xc5, 0x3, 0x33, 0x33, 0x33, 0x10, + 0x0, 0x11, 0x10, 0x4a, 0xaa, 0xaa, 0xaa, 0xa0, + 0x8, 0xbb, 0xb5, 0x6a, 0x33, 0x33, 0x33, 0xe1, + 0x2, 0x33, 0x31, 0x68, 0x14, 0x2, 0x30, 0xd1, + 0x1, 0x22, 0x21, 0x23, 0x3c, 0x6, 0x90, 0x50, + 0xb, 0xdc, 0xd9, 0x0, 0x4b, 0x6, 0x90, 0x0, + 0xb, 0x30, 0x59, 0x0, 0x88, 0x6, 0x90, 0x0, + 0xb, 0x30, 0x59, 0x2, 0xf2, 0x6, 0x90, 0x63, + 0xb, 0xed, 0xe9, 0x2d, 0x80, 0x6, 0x90, 0x94, + 0xb, 0x40, 0x0, 0xe8, 0x0, 0x3, 0xef, 0xe1, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+8AB0 "誰" */ + 0x0, 0x17, 0x0, 0x0, 0x6, 0x14, 0x0, 0x0, + 0x0, 0xd, 0x40, 0x0, 0x5c, 0x2e, 0x0, 0x0, + 0x0, 0x4, 0x70, 0x0, 0xb5, 0xa, 0x50, 0x0, + 0x1e, 0xee, 0xee, 0xa1, 0xfc, 0xbb, 0xbb, 0xb1, + 0x0, 0x0, 0x0, 0xa, 0xd3, 0x3e, 0x53, 0x30, + 0x5, 0xcc, 0xcc, 0x7f, 0xc0, 0xd, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x67, 0xe9, 0x9f, 0xa9, 0x60, + 0x5, 0xbb, 0xbb, 0x22, 0xd5, 0x5e, 0x65, 0x30, + 0x1, 0x22, 0x22, 0x2, 0xc0, 0xd, 0x10, 0x0, + 0x1, 0x33, 0x33, 0x12, 0xc0, 0xe, 0x20, 0x0, + 0x7, 0xdb, 0xbe, 0x42, 0xfe, 0xef, 0xee, 0x90, + 0x7, 0x70, 0xa, 0x42, 0xc0, 0xd, 0x10, 0x0, + 0x7, 0x70, 0xa, 0x42, 0xc1, 0x1e, 0x21, 0x10, + 0x7, 0xed, 0xdf, 0x42, 0xfd, 0xdd, 0xdd, 0xd2, + 0x7, 0x80, 0x0, 0x2, 0xc0, 0x0, 0x0, 0x0, + + /* U+8AB2 "課" */ + 0x0, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x40, 0x9, 0xee, 0xef, 0xee, 0xe0, + 0x0, 0x3, 0x60, 0x9, 0x60, 0x3b, 0x1, 0xe0, + 0x1e, 0xee, 0xee, 0xa9, 0x95, 0x7d, 0x56, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0xb8, 0xae, 0x89, 0xe0, + 0x5, 0xcc, 0xcc, 0x29, 0x60, 0x3b, 0x1, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0xca, 0xbe, 0xab, 0xe0, + 0x5, 0xbb, 0xbb, 0x22, 0x33, 0x7d, 0x33, 0x30, + 0x1, 0x22, 0x22, 0x12, 0x22, 0x6d, 0x22, 0x21, + 0x1, 0x22, 0x22, 0x5f, 0xff, 0xff, 0xff, 0xf6, + 0x7, 0xec, 0xce, 0x40, 0x5, 0xff, 0xb0, 0x0, + 0x7, 0x70, 0xa, 0x40, 0x3e, 0x7c, 0x99, 0x0, + 0x7, 0x70, 0xa, 0x46, 0xe5, 0x4c, 0xc, 0xa0, + 0x7, 0xed, 0xdf, 0xce, 0x30, 0x4c, 0x0, 0xb8, + 0x7, 0x80, 0x0, 0x11, 0x0, 0x4c, 0x0, 0x0, + + /* U+8ABF "調" */ + 0x0, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xd0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xb, 0x20, 0xc, 0x0, 0x20, 0x3, 0xa3, 0xbb, + 0xbb, 0xb1, 0xc0, 0xb, 0x10, 0x3a, 0x1, 0x11, + 0x11, 0xc, 0x5b, 0xec, 0xa3, 0xa0, 0x9c, 0xcc, + 0x60, 0xc0, 0xb, 0x10, 0x3a, 0x0, 0x0, 0x0, + 0xc, 0x46, 0xd7, 0x64, 0xa0, 0x8b, 0xbb, 0x60, + 0xb4, 0x66, 0x66, 0x4a, 0x1, 0x22, 0x21, 0x2a, + 0x0, 0x0, 0x3, 0xa0, 0x12, 0x22, 0x13, 0x96, + 0xff, 0xfa, 0x3a, 0xa, 0xcc, 0xd9, 0x48, 0x66, + 0x2, 0xa3, 0xa0, 0xa2, 0x4, 0x97, 0x66, 0x71, + 0x4a, 0x3a, 0xa, 0x20, 0x49, 0xc1, 0x6c, 0x99, + 0x63, 0xa0, 0xae, 0xde, 0xcc, 0x2, 0x20, 0x0, + 0x4a, 0xa, 0x30, 0xa, 0x40, 0x0, 0x2, 0xde, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+8AC7 "談" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x86, 0x0, 0x0, 0x2, 0xd0, 0x1, 0x0, + 0x0, 0x1d, 0x0, 0x7, 0x73, 0xc0, 0xe, 0x20, + 0x4a, 0xaa, 0xaa, 0x2d, 0x15, 0xa0, 0x97, 0x0, + 0x12, 0x22, 0x22, 0x34, 0x9, 0xe5, 0x70, 0x0, + 0xa, 0xcc, 0xc6, 0x0, 0x4d, 0x2c, 0xb1, 0x0, + 0x0, 0x0, 0x0, 0x2a, 0xe2, 0x0, 0x7e, 0x50, + 0x9, 0xbb, 0xb6, 0x26, 0x3, 0xc0, 0x3, 0x80, + 0x2, 0x22, 0x21, 0x2, 0x34, 0xa0, 0x4, 0x20, + 0x2, 0x22, 0x21, 0x9, 0x56, 0xa0, 0xe, 0x30, + 0xc, 0xcc, 0xda, 0x1e, 0x9, 0xe0, 0x88, 0x0, + 0xc, 0x10, 0x3a, 0x87, 0xe, 0xe8, 0xb0, 0x0, + 0xc, 0x10, 0x3a, 0x0, 0xad, 0x2e, 0x40, 0x0, + 0xc, 0xdd, 0xea, 0x3b, 0xf3, 0x5, 0xf9, 0x30, + 0xc, 0x10, 0x2, 0xfb, 0x20, 0x0, 0x3c, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8ACB "請" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0x0, 0x1, 0x11, 0x3d, 0x11, 0x10, + 0x0, 0x9, 0x70, 0xa, 0xcc, 0xcf, 0xcc, 0xc4, + 0x19, 0x99, 0x99, 0x52, 0x55, 0x7e, 0x55, 0x50, + 0x2, 0x22, 0x22, 0x12, 0x55, 0x7e, 0x55, 0x50, + 0x5, 0xcc, 0xcc, 0x3b, 0xbb, 0xcf, 0xbb, 0xb8, + 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, 0x21, + 0x5, 0xbb, 0xbb, 0x0, 0xdd, 0xdd, 0xdd, 0xa0, + 0x1, 0x22, 0x22, 0x0, 0xf0, 0x0, 0x3, 0xb0, + 0x1, 0x22, 0x22, 0x0, 0xf7, 0x77, 0x79, 0xb0, + 0x7, 0xdc, 0xcf, 0x20, 0xf6, 0x66, 0x69, 0xb0, + 0x7, 0x60, 0xc, 0x20, 0xf7, 0x77, 0x79, 0xb0, + 0x7, 0x60, 0xc, 0x20, 0xf2, 0x22, 0x26, 0xb0, + 0x7, 0xed, 0xdf, 0x20, 0xf0, 0x0, 0x4, 0xb0, + 0x6, 0x60, 0x0, 0x0, 0xf0, 0x0, 0xde, 0x80, + + /* U+8AD6 "論" */ + 0x0, 0x53, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + 0x0, 0x4d, 0x0, 0x0, 0x3, 0xf6, 0x0, 0x0, + 0x0, 0x9, 0x10, 0x0, 0x2e, 0x7e, 0x40, 0x0, + 0x1e, 0xee, 0xea, 0x3, 0xe6, 0x3, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xa3, 0x33, 0x7f, 0x91, + 0x6, 0xcc, 0xca, 0xe5, 0xbb, 0xbb, 0xb7, 0xc7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xbb, 0xb3, 0x5c, 0xcc, 0xcc, 0xcc, 0xa0, + 0x1, 0x22, 0x20, 0x79, 0x2d, 0x29, 0x63, 0xd0, + 0x3, 0x55, 0x52, 0x78, 0xc, 0x8, 0x41, 0xd0, + 0x9, 0xdb, 0xd6, 0x79, 0x2d, 0x29, 0x63, 0xd0, + 0x9, 0x40, 0x76, 0x7e, 0xbf, 0xbe, 0xdc, 0xd0, + 0x9, 0x40, 0x76, 0x78, 0xc, 0x8, 0x41, 0xd0, + 0x9, 0xed, 0xe6, 0x78, 0xc, 0x8, 0x42, 0xd0, + 0x9, 0x40, 0x0, 0x78, 0xc, 0x8, 0x5d, 0x80, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8AF8 "諸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x77, 0x0, 0x0, 0x7, 0x70, 0x1, 0x20, + 0x0, 0xb, 0x0, 0x7, 0x7b, 0xb7, 0x4b, 0x60, + 0x6e, 0xee, 0xee, 0x14, 0x4a, 0xa4, 0x7b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x71, 0xd2, 0x0, + 0x5, 0x66, 0x63, 0x12, 0x29, 0x9b, 0x92, 0x20, + 0x6, 0x77, 0x74, 0xad, 0xdd, 0xfd, 0xdd, 0xd0, + 0x6, 0x77, 0x74, 0x0, 0x2c, 0x70, 0x0, 0x0, + 0x2, 0x22, 0x21, 0x18, 0xff, 0xee, 0xee, 0x20, + 0x6, 0x77, 0x76, 0xe9, 0xf0, 0x0, 0xe, 0x20, + 0xc, 0x98, 0xaa, 0x10, 0xf0, 0x0, 0xe, 0x20, + 0xc, 0x10, 0x3a, 0x0, 0xfe, 0xdd, 0xdf, 0x20, + 0xc, 0x10, 0x3a, 0x0, 0xf0, 0x0, 0xe, 0x20, + 0xc, 0x87, 0x9a, 0x0, 0xf3, 0x22, 0x2e, 0x20, + 0xa, 0x87, 0x74, 0x0, 0xfb, 0xbb, 0xbe, 0x20, + + /* U+8B02 "謂" */ + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0x40, 0xc, 0xed, 0xdf, 0xdd, 0xf5, + 0x0, 0x4, 0x70, 0xc, 0x40, 0x2c, 0x0, 0xa5, + 0x1d, 0xdd, 0xdd, 0x8c, 0xdb, 0xcf, 0xbb, 0xe5, + 0x0, 0x0, 0x0, 0xc, 0x40, 0x3c, 0x0, 0xa5, + 0x5, 0xcc, 0xcc, 0x1c, 0xa8, 0x9e, 0x88, 0xd5, + 0x0, 0x0, 0x0, 0x3, 0x44, 0x44, 0x44, 0x41, + 0x5, 0xbb, 0xbb, 0x11, 0xbb, 0xbb, 0xbb, 0x80, + 0x1, 0x22, 0x22, 0x1, 0xe2, 0x22, 0x26, 0xc0, + 0x1, 0x22, 0x22, 0x1, 0xe1, 0x11, 0x15, 0xc0, + 0x7, 0xec, 0xcf, 0x21, 0xfb, 0xbb, 0xbc, 0xc0, + 0x7, 0x70, 0xc, 0x21, 0xe2, 0x22, 0x25, 0xc0, + 0x7, 0x70, 0xc, 0x21, 0xf8, 0x88, 0x8a, 0xc0, + 0x7, 0xed, 0xdf, 0x21, 0xe0, 0x0, 0x4, 0xc0, + 0x7, 0x80, 0x0, 0x1, 0xe0, 0x0, 0xdd, 0x70, + + /* U+8B1B "講" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6a, 0x0, 0x0, 0x95, 0x2, 0xb0, 0x0, + 0x0, 0xb, 0x40, 0x7c, 0xee, 0xcd, 0xfc, 0x90, + 0x3b, 0xbb, 0xbb, 0x3, 0xb7, 0x36, 0xc3, 0x10, + 0x1, 0x11, 0x11, 0x17, 0xca, 0x79, 0xd7, 0x30, + 0x9, 0xcc, 0xc6, 0x66, 0xc9, 0x68, 0xd6, 0x60, + 0x0, 0x0, 0x0, 0x66, 0x66, 0xf7, 0x66, 0x60, + 0x8, 0xbb, 0xb5, 0x8, 0x99, 0xf9, 0x99, 0x10, + 0x1, 0x22, 0x21, 0xf, 0x43, 0xf4, 0x3e, 0x20, + 0x1, 0x22, 0x21, 0xf, 0x11, 0xe2, 0x1e, 0x20, + 0xb, 0xcc, 0xd9, 0xf, 0xbb, 0xfb, 0xbf, 0x20, + 0xb, 0x10, 0x39, 0x3f, 0x43, 0xf4, 0x3e, 0x50, + 0xb, 0x10, 0x39, 0x7f, 0x87, 0x77, 0x7e, 0x90, + 0xb, 0xed, 0xe9, 0xf, 0x0, 0x0, 0xe, 0x20, + 0xb, 0x20, 0x0, 0xf, 0x0, 0xa, 0xdd, 0x0, + + /* U+8B1D "謝" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x94, 0x0, 0x9, 0x60, 0x0, 0xd, 0x10, + 0x0, 0x38, 0x0, 0xdf, 0xdc, 0x0, 0xd, 0x10, + 0x1e, 0xee, 0xe4, 0xd0, 0x1e, 0x0, 0xe, 0x20, + 0x0, 0x0, 0x0, 0xe8, 0x8e, 0xae, 0xef, 0xf1, + 0x6, 0xcc, 0xa0, 0xe4, 0x5e, 0x0, 0xd, 0x10, + 0x0, 0x0, 0x0, 0xe3, 0x3e, 0x52, 0xd, 0x10, + 0x5, 0xaa, 0x80, 0xf9, 0xae, 0x68, 0xd, 0x10, + 0x1, 0x33, 0x21, 0xd0, 0x1e, 0x1d, 0xd, 0x10, + 0x0, 0x11, 0x1b, 0xff, 0xfe, 0xc, 0x1d, 0x10, + 0x8, 0xdc, 0xd1, 0x14, 0xee, 0x6, 0x2d, 0x10, + 0x8, 0x40, 0xd0, 0x4d, 0x3e, 0x0, 0xd, 0x10, + 0x8, 0x40, 0xd9, 0xc2, 0xe, 0x0, 0xd, 0x10, + 0x8, 0xdc, 0xd3, 0x0, 0xe, 0x0, 0xe, 0x10, + 0x8, 0x51, 0x10, 0xb, 0xe9, 0xa, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8B58 "識" */ + 0x0, 0xa3, 0x0, 0x8, 0x40, 0xe, 0x13, 0x0, + 0x0, 0x28, 0x4, 0xde, 0xfd, 0x6d, 0x2d, 0x10, + 0x2e, 0xee, 0xe4, 0x72, 0x19, 0xd, 0x17, 0x90, + 0x0, 0x0, 0x0, 0x75, 0x48, 0xc, 0x21, 0x20, + 0x7, 0xcc, 0xb7, 0xde, 0xdd, 0xbf, 0xcb, 0xb1, + 0x0, 0x0, 0x1, 0x33, 0x33, 0x3c, 0x63, 0x30, + 0x6, 0xaa, 0x90, 0xdc, 0xcd, 0x19, 0x52, 0x80, + 0x1, 0x33, 0x20, 0xd0, 0xc, 0x18, 0x68, 0x70, + 0x0, 0x11, 0x10, 0xe0, 0xd, 0x16, 0x8e, 0x10, + 0x9, 0xdc, 0xe0, 0xeb, 0xbf, 0x14, 0xe9, 0x0, + 0x9, 0x30, 0xd0, 0xd0, 0xc, 0x14, 0xf1, 0x0, + 0x9, 0x30, 0xd0, 0xeb, 0xbf, 0x4e, 0xf1, 0x82, + 0x9, 0xdc, 0xe0, 0xd0, 0x8, 0xe4, 0x8a, 0xd0, + 0x9, 0x41, 0x10, 0x0, 0xa, 0x20, 0x1d, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8B70 "議" */ + 0x0, 0x11, 0x0, 0x0, 0x30, 0x0, 0x13, 0x0, + 0x0, 0x69, 0x0, 0x0, 0xd3, 0x0, 0x97, 0x0, + 0x0, 0x1d, 0x0, 0x5c, 0xee, 0xcc, 0xfc, 0xc0, + 0x1b, 0xbb, 0xb9, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x1, 0x11, 0x11, 0xa, 0xbb, 0xfc, 0xbb, 0x70, + 0x6, 0xcc, 0xc6, 0x22, 0x22, 0xd5, 0x22, 0x20, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5, 0xaa, 0xa5, 0x24, 0x67, 0x35, 0x15, 0x0, + 0x1, 0x33, 0x31, 0x56, 0xc3, 0xa, 0x37, 0xd1, + 0x0, 0x11, 0x10, 0x22, 0xc5, 0x2a, 0x62, 0x61, + 0x9, 0xdc, 0xe7, 0xbb, 0xec, 0xbd, 0xdb, 0xb5, + 0x9, 0x30, 0x57, 0x1, 0xc7, 0x74, 0x98, 0x60, + 0x9, 0x30, 0x57, 0xca, 0xd8, 0x30, 0xea, 0x0, + 0x9, 0xdc, 0xd7, 0x0, 0xb3, 0x3b, 0xd7, 0x28, + 0x7, 0x41, 0x10, 0x4c, 0xd2, 0xa2, 0xc, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8B77 "護" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x78, 0x0, 0xef, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x1e, 0x20, 0x56, 0xca, 0x66, 0xe6, 0x50, + 0x25, 0x56, 0x55, 0x4, 0xa5, 0x51, 0x90, 0x0, + 0x35, 0x55, 0x55, 0xe, 0x96, 0x9c, 0x66, 0x20, + 0xb, 0xcc, 0xc6, 0x9f, 0x33, 0x3f, 0x33, 0x0, + 0x0, 0x0, 0x1, 0xae, 0x88, 0x8f, 0x88, 0x0, + 0xa, 0xbb, 0xb6, 0xe, 0xaa, 0xaf, 0xaa, 0x0, + 0x2, 0x22, 0x21, 0xe, 0x0, 0xe, 0x0, 0x0, + 0x4, 0x55, 0x53, 0xe, 0xee, 0xef, 0xee, 0x90, + 0xd, 0xcb, 0xd8, 0x1a, 0x22, 0x22, 0x21, 0x0, + 0xd, 0x0, 0x68, 0x6c, 0xfa, 0xaa, 0xdc, 0x0, + 0xd, 0x0, 0x68, 0x0, 0x7b, 0x58, 0xc1, 0x0, + 0xd, 0xdd, 0xe8, 0x3, 0x7c, 0xef, 0xa4, 0x0, + 0xd, 0x10, 0x0, 0xee, 0xa5, 0x1, 0x8e, 0xd0, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, + + /* U+8B8A "變" */ + 0x0, 0x5, 0x0, 0x3, 0x20, 0x0, 0x23, 0x0, + 0x0, 0x77, 0x0, 0x25, 0xb2, 0x10, 0xa3, 0x0, + 0x2, 0xb0, 0xc5, 0x88, 0x88, 0x75, 0x82, 0xc0, + 0xd, 0xcd, 0x80, 0x9a, 0xaa, 0x6f, 0xce, 0x30, + 0x1, 0x7a, 0x81, 0x33, 0x33, 0x10, 0xa5, 0x90, + 0x7, 0xe7, 0xc7, 0x67, 0x77, 0x3a, 0xc9, 0xe3, + 0x7, 0x63, 0x27, 0x8a, 0xaa, 0x37, 0x41, 0x54, + 0xa, 0x37, 0x93, 0xb0, 0x6, 0x5c, 0x47, 0xa0, + 0xc, 0x1a, 0x57, 0xc8, 0x8b, 0x6b, 0x29, 0x65, + 0x6, 0x3, 0x1c, 0x32, 0x22, 0x13, 0x2, 0x0, + 0x0, 0x2, 0xdf, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, + 0x2, 0x9d, 0xba, 0x10, 0x0, 0x3d, 0x50, 0x0, + 0xb, 0x70, 0x5, 0xd9, 0x5a, 0xc3, 0x0, 0x0, + 0x0, 0x0, 0x36, 0xaf, 0xcf, 0xa6, 0x20, 0x0, + 0x1c, 0xed, 0xb8, 0x30, 0x0, 0x48, 0xbe, 0xe5, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8B93 "讓" */ + 0x0, 0x11, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, + 0x0, 0x5a, 0x0, 0x23, 0x33, 0xe6, 0x33, 0x31, + 0x0, 0xd, 0x0, 0x79, 0x99, 0x99, 0x99, 0x93, + 0x1b, 0xbb, 0xba, 0x1b, 0xbb, 0x39, 0xbb, 0x90, + 0x2, 0x22, 0x22, 0x2a, 0x9, 0x4d, 0x0, 0xd0, + 0x6, 0xcc, 0xc5, 0x2c, 0xcd, 0x3b, 0xda, 0xb0, + 0x0, 0x0, 0x0, 0x24, 0xa9, 0x45, 0xf4, 0x40, + 0x5, 0xaa, 0xa4, 0x37, 0xca, 0x78, 0xf7, 0x71, + 0x1, 0x33, 0x31, 0x29, 0xdc, 0x9a, 0xf9, 0x80, + 0x3, 0x66, 0x62, 0x3, 0xa8, 0x34, 0xf3, 0x20, + 0x8, 0xa7, 0xb6, 0xdd, 0xee, 0xdd, 0xfd, 0xd7, + 0x8, 0x40, 0x66, 0x1, 0x9a, 0x2d, 0x12, 0x90, + 0x8, 0x40, 0x67, 0xbb, 0xe0, 0x7, 0xdb, 0x20, + 0x8, 0xdc, 0xe6, 0x10, 0xf5, 0x95, 0x8d, 0x50, + 0x8, 0x51, 0x10, 0x4, 0xd9, 0x51, 0x5, 0xd7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8BA1 "计" */ + 0x0, 0x72, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x4e, 0x40, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x3, 0xe1, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x25, 0x55, 0x10, 0x0, 0x3, 0xf0, 0x0, 0x0, + 0x4a, 0xaf, 0x33, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0xd, 0x30, 0x0, 0x3, 0xf0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0xd, 0x37, 0x50, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0xe, 0xdb, 0x10, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x6f, 0x60, 0x0, 0x2, 0xf0, 0x0, 0x0, + 0x0, 0x23, 0x0, 0x0, 0x2, 0xf0, 0x0, 0x0, + + /* U+8BDE "诞" */ + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, 0x60, + 0x2, 0xe3, 0xc, 0xff, 0xe2, 0x6a, 0xec, 0x70, + 0x0, 0x5e, 0x10, 0x7, 0x85, 0x85, 0xf0, 0x0, + 0x0, 0xa, 0x50, 0xd, 0x20, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0x0, 0x30, 0xf0, 0x0, + 0x7, 0x76, 0x0, 0xd3, 0x2, 0xb0, 0xf0, 0x0, + 0xa, 0xbd, 0x7, 0xfe, 0xe3, 0xb0, 0xff, 0xf4, + 0x0, 0x1d, 0x0, 0x0, 0xd2, 0xb0, 0xf0, 0x0, + 0x0, 0x1d, 0x4, 0x43, 0xb2, 0xb0, 0xf0, 0x0, + 0x0, 0x1d, 0x3, 0xb6, 0x82, 0xb0, 0xf0, 0x0, + 0x0, 0x1d, 0x0, 0xdd, 0x32, 0xb0, 0xf0, 0x0, + 0x0, 0x1d, 0x5a, 0x6e, 0x2, 0xfd, 0xfd, 0xd6, + 0x0, 0x2f, 0xe3, 0xae, 0x90, 0x11, 0x11, 0x10, + 0x0, 0x7d, 0x24, 0xd1, 0xcc, 0x41, 0x0, 0x0, + 0x0, 0x71, 0x2e, 0x30, 0x6, 0xbe, 0xff, 0xf8, + 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8C50 "豐" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x2, 0xc3, 0x7a, 0x47, 0x74, 0xa7, 0x3c, 0x20, + 0x2, 0xc3, 0x7a, 0x57, 0x75, 0xb7, 0x3c, 0x20, + 0x2, 0xc4, 0xbd, 0x87, 0x78, 0xdb, 0x5c, 0x20, + 0x2, 0xc5, 0x9b, 0x78, 0x87, 0xb9, 0x5c, 0x20, + 0x2, 0xc2, 0x59, 0x28, 0x82, 0x95, 0x2c, 0x20, + 0x2, 0xdc, 0xdd, 0xcd, 0xdc, 0xdd, 0xcd, 0x20, + 0x4, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x40, + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x60, + 0x0, 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb1, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0xf, 0xba, 0xaa, 0xaa, 0xaa, 0xf2, 0x0, + 0x0, 0x0, 0x6b, 0x0, 0x0, 0x98, 0x0, 0x0, + 0x0, 0x0, 0xe, 0x10, 0x1, 0xe1, 0x0, 0x0, + 0x1d, 0xdd, 0xdf, 0xdd, 0xdd, 0xfd, 0xdd, 0xd1, + + /* U+8C61 "象" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xee, 0xee, 0xf9, 0x0, 0x0, 0x0, 0x4, + 0xd1, 0x0, 0x1f, 0x40, 0x0, 0x0, 0x7, 0xf4, + 0x0, 0x8, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xdd, + 0xdd, 0xfd, 0xdd, 0xde, 0x0, 0x24, 0xc0, 0x0, + 0x6b, 0x0, 0x1, 0xe0, 0x0, 0x3f, 0xbb, 0xbf, + 0xcb, 0xbb, 0xbe, 0x0, 0x0, 0x26, 0xef, 0x82, + 0x22, 0x24, 0x70, 0x2, 0x7c, 0xc3, 0x1d, 0x80, + 0x6, 0xe7, 0x0, 0x48, 0x20, 0x3b, 0x9d, 0x8d, + 0xe1, 0x0, 0x0, 0x27, 0xcb, 0x21, 0xbf, 0x2c, + 0x60, 0x0, 0xa, 0x71, 0x6, 0xd6, 0xd4, 0x2e, + 0x20, 0x0, 0x2, 0x8d, 0x91, 0xb, 0x50, 0x6e, + 0x30, 0x2d, 0xd7, 0x10, 0x3, 0xf2, 0x0, 0x6f, + 0x40, 0x20, 0x0, 0xdf, 0xe6, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8CA0 "負" */ + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xed, 0xdd, 0xdf, 0x40, 0x0, 0x0, 0x5, + 0xe6, 0x0, 0x8, 0x90, 0x0, 0x0, 0x8, 0xff, + 0xee, 0xee, 0xfe, 0xee, 0xe2, 0x0, 0x95, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x2e, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x2, 0xfc, 0xcc, + 0xcc, 0xcc, 0xcf, 0x20, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x2, 0xfd, 0xdd, 0xdd, + 0xdd, 0xdf, 0x20, 0x0, 0x2e, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x2, 0xe2, 0x22, 0x22, 0x22, + 0x2e, 0x20, 0x0, 0x1b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb2, 0x0, 0x0, 0x29, 0xd2, 0x0, 0x4d, 0x72, + 0x0, 0x7, 0xce, 0x70, 0x0, 0x0, 0x17, 0xeb, + 0x30, 0x34, 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, + + /* U+8CA1 "財" */ + 0xd, 0xee, 0xee, 0xe0, 0x0, 0x0, 0xf0, 0x0, + 0xd, 0x30, 0x1, 0xe0, 0x0, 0x0, 0xf0, 0x0, + 0xd, 0x30, 0x1, 0xe0, 0x0, 0x0, 0xf0, 0x0, + 0xd, 0xed, 0xdd, 0xe7, 0xcc, 0xcd, 0xfd, 0xc1, + 0xd, 0x30, 0x1, 0xe1, 0x22, 0x2b, 0xf3, 0x20, + 0xd, 0x30, 0x1, 0xe0, 0x0, 0x2e, 0xf0, 0x0, + 0xd, 0xed, 0xdd, 0xe0, 0x0, 0xa7, 0xf0, 0x0, + 0xd, 0x30, 0x1, 0xe0, 0x2, 0xd0, 0xf0, 0x0, + 0xd, 0x30, 0x1, 0xe0, 0xc, 0x50, 0xf0, 0x0, + 0xd, 0xee, 0xee, 0xe0, 0xaa, 0x0, 0xf0, 0x0, + 0x0, 0x72, 0x6, 0x9, 0xc0, 0x0, 0xf0, 0x0, + 0x3, 0xe0, 0xb, 0x72, 0x0, 0x0, 0xf0, 0x0, + 0x1d, 0x60, 0x1, 0xe2, 0x0, 0x1, 0xf0, 0x0, + 0x59, 0x0, 0x0, 0x20, 0x2, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8CA7 "貧" */ + 0x0, 0x0, 0x2, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x5e, 0x20, 0x3, 0xd3, 0x0, 0x0, + 0x0, 0x2a, 0xd2, 0x0, 0x0, 0x2e, 0x91, 0x0, + 0x9, 0xe8, 0xee, 0xff, 0xee, 0xef, 0xbe, 0x90, + 0x1, 0x0, 0x3, 0xd2, 0x0, 0xf, 0x11, 0x40, + 0x0, 0x36, 0xbc, 0x20, 0x9c, 0xd9, 0x0, 0x0, + 0x6, 0xbf, 0xc9, 0x99, 0x99, 0x99, 0x91, 0x0, + 0x0, 0x1f, 0x22, 0x22, 0x22, 0x22, 0xe2, 0x0, + 0x0, 0x1f, 0xbb, 0xbb, 0xbb, 0xbb, 0xf2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x1f, 0xbb, 0xbb, 0xbb, 0xbb, 0xf2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x1e, 0xbb, 0xbb, 0xbb, 0xbb, 0xe2, 0x0, + 0x0, 0x1, 0x6a, 0x20, 0x4, 0xb6, 0x20, 0x0, + 0x8, 0xdc, 0x71, 0x0, 0x0, 0x26, 0xcd, 0x60, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + + /* U+8CA9 "販" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x47, 0x50, + 0xd, 0xee, 0xee, 0x9, 0xce, 0xed, 0xa7, 0x40, + 0xd, 0x10, 0x1e, 0xd, 0x40, 0x0, 0x0, 0x0, + 0xd, 0x10, 0x1e, 0xd, 0x20, 0x0, 0x0, 0x0, + 0xd, 0xed, 0xee, 0xd, 0x20, 0x0, 0x0, 0x0, + 0xd, 0x10, 0x1e, 0xd, 0xba, 0xaa, 0xaa, 0x40, + 0xd, 0x10, 0x1e, 0xd, 0xd9, 0x66, 0x6d, 0x40, + 0xd, 0xdd, 0xde, 0xe, 0x79, 0x0, 0xe, 0x0, + 0xd, 0x10, 0x1e, 0xf, 0x2e, 0x0, 0x5b, 0x0, + 0xd, 0x10, 0x1e, 0xf, 0x8, 0x70, 0xc5, 0x0, + 0xd, 0xee, 0xee, 0x2e, 0x1, 0xe7, 0xc0, 0x0, + 0x0, 0x50, 0x30, 0x5b, 0x0, 0x6f, 0x30, 0x0, + 0x7, 0xb0, 0xa6, 0xa6, 0x1, 0xde, 0xa0, 0x0, + 0x1e, 0x20, 0x1e, 0xe1, 0x3d, 0x80, 0xbb, 0x20, + 0x37, 0x0, 0x9, 0x62, 0xe6, 0x0, 0x8, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8CAC "責" */ + 0x2, 0xdd, 0xdd, 0xde, 0xed, 0xdd, 0xdd, 0x30, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xcc, 0xce, 0xec, 0xcc, 0xc7, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0xc, 0xcc, 0xcc, 0xcd, 0xdc, 0xcc, 0xcc, 0xc1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xbb, 0xbb, 0xbb, 0xbb, 0xe4, 0x0, + 0x0, 0x1f, 0x44, 0x44, 0x44, 0x44, 0xd4, 0x0, + 0x0, 0x1f, 0x55, 0x55, 0x55, 0x55, 0xd4, 0x0, + 0x0, 0x1f, 0xbb, 0xbb, 0xbb, 0xbb, 0xe4, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0x1f, 0xbb, 0xbb, 0xbb, 0xbb, 0xe4, 0x0, + 0x0, 0x2, 0x7b, 0x20, 0x2, 0xb7, 0x30, 0x0, + 0x9, 0xdb, 0x60, 0x0, 0x0, 0x5, 0xbd, 0x70, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+8CB7 "買" */ + 0x1, 0xfd, 0xde, 0xfd, 0xdf, 0xdd, 0xdf, 0x10, + 0x1, 0xe0, 0x2, 0xc0, 0xc, 0x10, 0xe, 0x10, + 0x1, 0xe0, 0x2, 0xc0, 0xc, 0x10, 0xe, 0x10, + 0x1, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xcc, 0xcc, 0xcc, 0xcc, 0xf2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x1f, 0xbb, 0xbb, 0xbb, 0xbb, 0xf2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x1f, 0xcb, 0xbb, 0xbb, 0xbb, 0xf2, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x0, + 0x0, 0x2, 0x7d, 0x50, 0x4, 0xd8, 0x30, 0x0, + 0x8, 0xdc, 0x71, 0x0, 0x0, 0x5, 0xbd, 0x70, + 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, + + /* U+8CB8 "貸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xc0, 0x2d, 0x6, 0xb7, 0x10, 0x0, + 0x9, 0xd1, 0x12, 0xe6, 0x45, 0xb8, 0x60, 0x7e, + 0xbb, 0x7c, 0xba, 0xfa, 0x76, 0x53, 0x18, 0x15, + 0xb0, 0x0, 0x5, 0xe6, 0x10, 0xb0, 0x0, 0x49, + 0x0, 0x0, 0x2, 0x9e, 0xe8, 0x0, 0xb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb1, 0x0, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0x0, 0xf, 0xbb, 0xbb, + 0xbb, 0xbb, 0xf2, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0xf, 0xbb, 0xbb, 0xbb, + 0xbb, 0xf2, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, + 0xe, 0x20, 0x0, 0xb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb1, 0x0, 0x0, 0x39, 0xc2, 0x0, 0x3d, 0x83, + 0x0, 0x9, 0xeb, 0x50, 0x0, 0x0, 0x5, 0xbd, + 0x50, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+8CBB "費" */ + 0x3, 0xbb, 0xbc, 0xfb, 0xbf, 0xcb, 0xcc, 0x0, + 0x0, 0x0, 0x1e, 0x0, 0xe1, 0x3, 0xc0, 0x0, + 0x7c, 0xbc, 0xfb, 0xbf, 0xcb, 0xcc, 0x0, 0xb, + 0x30, 0x4c, 0x0, 0xe1, 0x0, 0x0, 0x0, 0xac, + 0xdf, 0xdc, 0xcf, 0xcc, 0xcd, 0xb0, 0x0, 0x6e, + 0x90, 0x0, 0xe1, 0x7, 0xb8, 0xa, 0xef, 0xbb, + 0xbb, 0xbb, 0xbb, 0xf5, 0x0, 0x11, 0xf4, 0x44, + 0x44, 0x44, 0x4f, 0x20, 0x0, 0x1f, 0x55, 0x55, + 0x55, 0x55, 0xf2, 0x0, 0x1, 0xfb, 0xbb, 0xbb, + 0xbb, 0xbf, 0x20, 0x0, 0x1f, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x0, 0x1, 0xdb, 0xbb, 0xbb, 0xbc, + 0xbd, 0x20, 0x0, 0x3, 0x9d, 0x40, 0x5, 0xcb, + 0x61, 0x0, 0x9e, 0xa5, 0x0, 0x0, 0x0, 0x28, + 0xe7, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+8CBF "貿" */ + 0x0, 0x0, 0x25, 0x80, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xdb, 0x85, 0x1d, 0xdf, 0xed, 0xf8, 0x0, + 0xe1, 0x7, 0x0, 0x0, 0xe0, 0x9, 0x60, 0xe, + 0x10, 0x7b, 0x0, 0x6b, 0x0, 0xb5, 0x0, 0xf8, + 0xce, 0xd6, 0x5e, 0x34, 0x4e, 0x20, 0x3d, 0x83, + 0x2, 0xab, 0x30, 0x8a, 0x50, 0x0, 0x3b, 0xbb, + 0xbc, 0xbb, 0xbb, 0xb2, 0x0, 0x4, 0xc0, 0x0, + 0x0, 0x0, 0xd, 0x30, 0x0, 0x4f, 0xbb, 0xbb, + 0xbb, 0xbb, 0xf3, 0x0, 0x4, 0xc0, 0x0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x4f, 0xbb, 0xbb, 0xbb, + 0xbb, 0xf3, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, + 0xd, 0x30, 0x0, 0x3b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xb2, 0x0, 0x0, 0x39, 0xb1, 0x0, 0x1c, 0x94, + 0x0, 0xb, 0xea, 0x50, 0x0, 0x0, 0x3, 0x9e, + 0x70, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8CC3 "賃" */ + 0x0, 0x0, 0x85, 0x0, 0x12, 0x35, 0x86, 0x0, + 0x0, 0x8, 0xd0, 0xbb, 0xad, 0xb6, 0x42, 0x0, + 0x0, 0x9f, 0x30, 0x0, 0x8, 0x70, 0x0, 0x0, + 0x2d, 0xce, 0x3b, 0xdd, 0xde, 0xed, 0xdd, 0xd1, + 0x17, 0xc, 0x30, 0x0, 0x8, 0x70, 0x0, 0x0, + 0x0, 0xc, 0x31, 0xbb, 0xbe, 0xdb, 0xbb, 0x30, + 0x0, 0x4, 0x10, 0x11, 0x11, 0x11, 0x11, 0x0, + 0x0, 0xf, 0xbb, 0xbb, 0xbb, 0xbb, 0xf4, 0x0, + 0x0, 0xf, 0x44, 0x44, 0x44, 0x44, 0xd4, 0x0, + 0x0, 0xf, 0x55, 0x55, 0x55, 0x55, 0xd4, 0x0, + 0x0, 0xf, 0xbb, 0xbb, 0xbb, 0xbb, 0xe4, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, + 0x0, 0xd, 0xbb, 0xbb, 0xbb, 0xbb, 0xd3, 0x0, + 0x0, 0x2, 0x7b, 0x20, 0x3, 0xb7, 0x30, 0x0, + 0x9, 0xdb, 0x60, 0x0, 0x0, 0x15, 0xbd, 0x70, + 0x2, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+8CC7 "資" */ + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x2a, 0x50, 0x0, 0x98, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xe2, 0x5e, 0xdd, 0xdd, 0xdf, 0x70, 0x0, + 0x1, 0x3d, 0x10, 0xc8, 0x4, 0xc0, 0x0, 0x38, + 0xc4, 0x3, 0xb7, 0x99, 0x31, 0x0, 0xeb, 0x61, + 0x3d, 0xb4, 0x0, 0x4c, 0xb4, 0x0, 0x1b, 0xbc, + 0xcb, 0xbb, 0xbb, 0xb4, 0x10, 0x1, 0xf0, 0x0, + 0x0, 0x0, 0xe, 0x20, 0x0, 0x1f, 0xbb, 0xbb, + 0xbb, 0xbb, 0xf2, 0x0, 0x1, 0xf0, 0x0, 0x0, + 0x0, 0xe, 0x20, 0x0, 0x1f, 0xbb, 0xbb, 0xbb, + 0xbb, 0xf2, 0x0, 0x1, 0xf0, 0x0, 0x0, 0x0, + 0xe, 0x20, 0x0, 0x1b, 0xbc, 0xbb, 0xbb, 0xcb, + 0xb1, 0x0, 0x0, 0x4a, 0xc2, 0x0, 0x2d, 0xa5, + 0x0, 0x9, 0xea, 0x40, 0x0, 0x0, 0x3, 0x9e, + 0x60, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+8CEA "質" */ + 0x0, 0x1, 0x25, 0x81, 0x0, 0x13, 0x58, 0x20, + 0x0, 0xeb, 0x97, 0x40, 0x2e, 0xa9, 0x73, 0x0, + 0x0, 0xf0, 0x0, 0x0, 0x3b, 0x0, 0x0, 0x0, + 0x1, 0xfd, 0xdf, 0xda, 0x5f, 0xde, 0xfd, 0xd5, + 0x5, 0xb0, 0xf, 0x0, 0xb6, 0x2, 0xd0, 0x0, + 0xd, 0x30, 0xc, 0x3, 0xc0, 0x2, 0xc0, 0x0, + 0x1, 0xd, 0xcb, 0xbb, 0xcb, 0xbb, 0xd3, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0xf, 0xbb, 0xbb, 0xbb, 0xbb, 0xf3, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0xf, 0xbb, 0xbb, 0xbb, 0xbb, 0xf3, 0x0, + 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0xd3, 0x0, + 0x0, 0xc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x0, + 0x0, 0x4, 0xac, 0x10, 0x0, 0xcb, 0x61, 0x0, + 0xa, 0xea, 0x40, 0x0, 0x0, 0x2, 0x7d, 0xb0, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, + + /* U+8CFD "賽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0xd, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe0, + 0xd, 0x20, 0x6, 0x0, 0x0, 0x60, 0x1, 0xe0, + 0x5, 0x5a, 0xaf, 0xba, 0xab, 0xfa, 0xa5, 0x60, + 0x0, 0x3, 0x3f, 0x53, 0x34, 0xf3, 0x30, 0x0, + 0x0, 0x17, 0x7f, 0x87, 0x78, 0xf7, 0x71, 0x0, + 0xc, 0xcc, 0xcf, 0xcc, 0xcc, 0xfc, 0xcc, 0xc1, + 0x0, 0x3, 0xd7, 0x22, 0x22, 0x5e, 0x50, 0x0, + 0x2, 0x9f, 0xd9, 0x99, 0x99, 0x9d, 0xfb, 0x50, + 0x2d, 0x67, 0xd9, 0x99, 0x99, 0x9d, 0x74, 0xb2, + 0x0, 0x6, 0xa2, 0x22, 0x22, 0x2a, 0x70, 0x0, + 0x0, 0x6, 0xc7, 0x77, 0x77, 0x7c, 0x70, 0x0, + 0x0, 0x6, 0xda, 0xaa, 0xaa, 0xad, 0x70, 0x0, + 0x0, 0x3, 0x8d, 0x40, 0x6, 0xda, 0x50, 0x0, + 0x9, 0xd9, 0x50, 0x0, 0x0, 0x3, 0x8d, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D39 "费" */ + 0x3, 0xdd, 0xdd, 0xfd, 0xdf, 0xdd, 0xdf, 0x0, + 0x0, 0x0, 0x1, 0xe0, 0xc, 0x30, 0xf, 0x0, + 0x0, 0x1, 0x13, 0xe1, 0x1d, 0x51, 0x2f, 0x0, + 0x0, 0xac, 0xab, 0xfa, 0xae, 0xca, 0xaa, 0x0, + 0x0, 0xd2, 0x5, 0xb0, 0xc, 0x40, 0x0, 0x0, + 0x0, 0xbb, 0xcf, 0xcb, 0xbf, 0xcb, 0xbc, 0xd0, + 0x0, 0x3, 0xd9, 0x0, 0xc, 0x30, 0x37, 0xa0, + 0x6, 0xce, 0x62, 0x22, 0x2a, 0x42, 0x99, 0x20, + 0x4, 0x2f, 0xcb, 0xbb, 0xbb, 0xbb, 0xf1, 0x0, + 0x0, 0xf, 0x0, 0x3, 0x40, 0x0, 0xf1, 0x0, + 0x0, 0xf, 0x0, 0xb, 0x30, 0x0, 0xf1, 0x0, + 0x0, 0xf, 0x0, 0x5c, 0x34, 0x0, 0xf1, 0x0, + 0x0, 0x4, 0x28, 0xd1, 0x4a, 0xea, 0x81, 0x0, + 0x18, 0xad, 0xd7, 0x0, 0x0, 0x4, 0xae, 0x90, + 0x6, 0x41, 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, + + /* U+8D64 "赤" */ + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x33, 0x3a, 0xa3, 0x33, 0x31, 0x0, + 0x0, 0x4c, 0xcc, 0xce, 0xec, 0xcc, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x4, 0xd0, 0x8, 0xa0, 0x0, 0x0, + 0x0, 0xa, 0x14, 0xd0, 0x7, 0xa0, 0xa1, 0x0, + 0x0, 0x7b, 0x5, 0xc0, 0x7, 0xa0, 0x9a, 0x0, + 0x2, 0xe2, 0x9, 0x90, 0x7, 0xa0, 0xd, 0x50, + 0x1d, 0x50, 0xe, 0x40, 0x7, 0xa0, 0x5, 0xe0, + 0x4, 0x0, 0x9b, 0x0, 0x7, 0xa0, 0x0, 0x71, + 0x0, 0xa, 0xe2, 0x0, 0x19, 0xa0, 0x0, 0x0, + 0x0, 0x3c, 0x20, 0xa, 0xfe, 0x50, 0x0, 0x0, + + /* U+8D70 "走" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x24, 0x44, 0x4b, 0xa4, 0x44, 0x43, 0x0, + 0x0, 0x6b, 0xbb, 0xbe, 0xdb, 0xbb, 0xb8, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0xe, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe0, + 0x0, 0x1, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x90, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x60, 0x9, 0xeb, 0xbb, 0xba, 0x0, + 0x0, 0xf, 0x70, 0x9, 0xa3, 0x33, 0x33, 0x0, + 0x0, 0x4d, 0xd1, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xc5, 0x4d, 0x39, 0x80, 0x0, 0x0, 0x0, + 0x7, 0xd0, 0x5, 0xee, 0xa4, 0x21, 0x0, 0x0, + 0x2e, 0x10, 0x0, 0x17, 0xbe, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D77 "起" */ + 0x0, 0x0, 0xf0, 0x0, 0x4f, 0xff, 0xff, 0xb0, + 0x9, 0xcc, 0xfc, 0xc8, 0x0, 0x0, 0x4, 0xb0, + 0x2, 0x23, 0xf2, 0x22, 0x0, 0x0, 0x4, 0xb0, + 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x4, 0xb0, + 0x6, 0x66, 0xf6, 0x66, 0x0, 0x0, 0x4, 0xb0, + 0x1a, 0xaa, 0xeb, 0xaa, 0x2f, 0xff, 0xfe, 0xa0, + 0x1, 0x40, 0xb3, 0x0, 0x1f, 0x0, 0x0, 0x0, + 0x5, 0xb0, 0xb3, 0x0, 0x1f, 0x0, 0x0, 0x0, + 0x6, 0xa0, 0xbf, 0xfe, 0x1f, 0x0, 0x0, 0x22, + 0x7, 0xc0, 0xb3, 0x0, 0x1f, 0x0, 0x0, 0x69, + 0x8, 0xf2, 0xb3, 0x0, 0x1f, 0x20, 0x0, 0x97, + 0xb, 0xbc, 0xc3, 0x0, 0xa, 0xee, 0xee, 0xc1, + 0xe, 0x28, 0xf8, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x4d, 0x0, 0x39, 0xde, 0xff, 0xff, 0xff, 0xf8, + 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D85 "超" */ + 0x0, 0x2, 0xd0, 0x2, 0xee, 0xff, 0xee, 0xf1, + 0x2, 0x35, 0xd3, 0x31, 0x0, 0xd3, 0x0, 0xf0, + 0x8, 0xbc, 0xfb, 0xb4, 0x1, 0xf0, 0x0, 0xf0, + 0x0, 0x2, 0xd0, 0x0, 0x7, 0xa0, 0x2, 0xe0, + 0x2, 0x25, 0xd2, 0x22, 0x2e, 0x21, 0x27, 0xc0, + 0xc, 0xcc, 0xfc, 0xcc, 0xd4, 0x4, 0xcb, 0x30, + 0x0, 0x0, 0xf0, 0x0, 0x56, 0x66, 0x66, 0x40, + 0x5, 0xa0, 0xf0, 0x0, 0x9b, 0x66, 0x69, 0xc0, + 0x6, 0x90, 0xfe, 0xe8, 0x97, 0x0, 0x4, 0xc0, + 0x7, 0xb0, 0xf0, 0x0, 0x97, 0x0, 0x4, 0xc0, + 0x8, 0xf3, 0xf0, 0x0, 0x9d, 0xbb, 0xbc, 0xc0, + 0xb, 0x6d, 0xf0, 0x0, 0x13, 0x33, 0x33, 0x20, + 0xe, 0x16, 0xf9, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x4c, 0x0, 0x28, 0xce, 0xff, 0xff, 0xff, 0xf8, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8D8A "越" */ + 0x0, 0x0, 0xf0, 0x0, 0x0, 0xd, 0x3a, 0x10, + 0x3, 0x66, 0xf6, 0x63, 0x0, 0xd, 0x14, 0x90, + 0x2, 0x55, 0xf5, 0x52, 0xac, 0xcf, 0xdc, 0xc4, + 0x0, 0x0, 0xf0, 0x0, 0xc3, 0x1b, 0x51, 0x10, + 0x0, 0x0, 0xf0, 0x0, 0xc2, 0xa, 0x40, 0x40, + 0x1e, 0xee, 0xff, 0xeb, 0xc2, 0x8, 0x64, 0xb0, + 0x0, 0x0, 0xb3, 0x0, 0xc2, 0x7, 0x8b, 0x50, + 0x2, 0xc0, 0xb4, 0x0, 0xc2, 0x4, 0xcd, 0x0, + 0x3, 0xc0, 0xbf, 0xf8, 0xd7, 0xd2, 0xf5, 0x20, + 0x3, 0xe0, 0xb3, 0x3, 0xfa, 0x18, 0xf2, 0x75, + 0x5, 0xf7, 0xb3, 0x2, 0x40, 0x7d, 0x8a, 0x93, + 0x8, 0x7e, 0xe3, 0x0, 0x8, 0xd1, 0xa, 0xb0, + 0xc, 0x24, 0xeb, 0x52, 0x12, 0x0, 0x0, 0x0, + 0x2c, 0x0, 0x18, 0xce, 0xff, 0xff, 0xff, 0xf4, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DA3 "趣" */ + 0x0, 0x7, 0x80, 0x6f, 0xfe, 0xf9, 0x0, 0x0, + 0x7, 0xad, 0xda, 0x5b, 0x20, 0xd6, 0xaa, 0xa0, + 0x2, 0x49, 0xa4, 0x2b, 0x41, 0xe2, 0x34, 0xe0, + 0x0, 0x7, 0x80, 0xb, 0xdc, 0xe6, 0x2, 0xc0, + 0xb, 0xbd, 0xeb, 0x9b, 0x20, 0xd8, 0x75, 0x90, + 0x3, 0x35, 0xe3, 0x2b, 0x20, 0xd1, 0xe9, 0x60, + 0x0, 0x11, 0xd0, 0xb, 0xee, 0xe0, 0x9f, 0x30, + 0x4, 0xa1, 0xd2, 0x1b, 0x41, 0xe0, 0x2f, 0x0, + 0x5, 0xa1, 0xfd, 0x9b, 0x20, 0xe2, 0x6f, 0x50, + 0x5, 0xc2, 0xd0, 0xb, 0x9b, 0xf5, 0xd7, 0xc0, + 0x7, 0xf7, 0xd0, 0x99, 0x40, 0xd8, 0xa0, 0xc2, + 0xa, 0x6f, 0xd0, 0x0, 0x0, 0xd4, 0x10, 0x0, + 0xe, 0x5, 0xfd, 0x62, 0x10, 0x0, 0x0, 0x0, + 0x4a, 0x0, 0x28, 0xce, 0xff, 0xff, 0xff, 0xf4, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DB3 "足" */ + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x2e, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xb0, 0x2, 0xfd, 0xdd, 0xdd, 0x50, + 0x0, 0xa, 0xc0, 0x2, 0xe2, 0x22, 0x22, 0x0, + 0x0, 0xe, 0xc5, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x89, 0x1e, 0x63, 0xe0, 0x0, 0x0, 0x0, + 0x3, 0xe2, 0x3, 0xde, 0xf3, 0x21, 0x0, 0x0, + 0xd, 0x40, 0x0, 0x6, 0xad, 0xef, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DDF "跟" */ + 0xc, 0xfe, 0xef, 0x2e, 0xff, 0xff, 0xff, 0x10, + 0xc, 0x20, 0xd, 0x2e, 0x10, 0x0, 0xe, 0x10, + 0xc, 0x20, 0xd, 0x2e, 0x10, 0x0, 0xe, 0x10, + 0xc, 0x20, 0xd, 0x2e, 0xdd, 0xdd, 0xdf, 0x10, + 0xc, 0xee, 0xef, 0x2e, 0x31, 0x11, 0x1e, 0x10, + 0x0, 0xb, 0x30, 0xe, 0x10, 0x0, 0xe, 0x10, + 0x6, 0x1b, 0x30, 0xe, 0xdd, 0xdd, 0xdf, 0x10, + 0xc, 0x2b, 0xdc, 0x3e, 0x22, 0xd1, 0x11, 0x20, + 0xc, 0x2b, 0x52, 0xe, 0x10, 0xc3, 0x1b, 0xa0, + 0xc, 0x2b, 0x30, 0xe, 0x10, 0x6c, 0xd6, 0x0, + 0xc, 0x2b, 0x31, 0x1e, 0x10, 0xe, 0x60, 0x0, + 0xc, 0x6d, 0xee, 0x4e, 0x10, 0x14, 0xe3, 0x0, + 0x7f, 0xb7, 0x20, 0x1f, 0xad, 0xe1, 0x6f, 0x70, + 0x10, 0x0, 0x0, 0x5c, 0x72, 0x0, 0x3, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8DEF "路" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0x20, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x80, 0x1f, 0x10, 0x0, 0x0, + 0xc, 0x30, 0x6, 0x80, 0x7f, 0xff, 0xfb, 0x0, + 0xc, 0x30, 0x6, 0x81, 0xe8, 0x0, 0xa7, 0x0, + 0xc, 0x30, 0x6, 0x8b, 0xad, 0x13, 0xe1, 0x0, + 0xc, 0xfe, 0xef, 0xdc, 0x5, 0xbc, 0x60, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0x0, 0xdd, 0x0, 0x0, + 0x5, 0x14, 0xb0, 0x0, 0xb, 0xbb, 0xa0, 0x0, + 0xb, 0x24, 0xea, 0x75, 0xd7, 0x0, 0x8d, 0x60, + 0xb, 0x24, 0xc3, 0x9d, 0xeb, 0xbb, 0xbf, 0xc1, + 0xb, 0x24, 0xb0, 0x1, 0xf3, 0x33, 0x3f, 0x0, + 0xb, 0x24, 0xb0, 0x1, 0xe0, 0x0, 0xf, 0x0, + 0xb, 0x35, 0xda, 0xc1, 0xe0, 0x0, 0xf, 0x0, + 0x4e, 0xfe, 0xa6, 0x21, 0xe1, 0x11, 0x1f, 0x0, + 0x47, 0x20, 0x0, 0x1, 0xfd, 0xdd, 0xdf, 0x0, + + /* U+8EAB "身" */ + 0x0, 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xee, 0xff, 0xee, 0xee, 0x20, 0x0, 0x0, + 0xc4, 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0xc, + 0x62, 0x22, 0x22, 0x2e, 0x20, 0x0, 0x0, 0xcc, + 0xaa, 0xaa, 0xaa, 0xf2, 0x0, 0x0, 0xc, 0x30, + 0x0, 0x0, 0xe, 0x24, 0x30, 0x0, 0xce, 0xdd, + 0xdd, 0xdd, 0xf5, 0xd2, 0x0, 0xc, 0x30, 0x0, + 0x0, 0xe, 0xe2, 0x0, 0xbb, 0xfc, 0xbb, 0xbb, + 0xbb, 0xf3, 0x0, 0x3, 0x33, 0x33, 0x33, 0x6e, + 0xbf, 0x20, 0x0, 0x0, 0x0, 0x1, 0x9d, 0x40, + 0xe2, 0x0, 0x0, 0x0, 0x17, 0xe8, 0x0, 0xe, + 0x20, 0x0, 0x16, 0xbe, 0x82, 0x1, 0x1, 0xf1, + 0x0, 0x4f, 0xa4, 0x0, 0x1, 0xff, 0xea, 0x0, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8ECA "車" */ + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x9, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x90, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6e, 0xee, 0xef, 0xfe, 0xee, 0xe7, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x80, 0x0, 0x97, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x80, 0x0, 0x87, 0x0, + 0x0, 0x6f, 0xdd, 0xdf, 0xfd, 0xdd, 0xf7, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x80, 0x0, 0x87, 0x0, + 0x0, 0x6a, 0x22, 0x2a, 0x92, 0x22, 0xa7, 0x0, + 0x0, 0x5b, 0xbb, 0xbe, 0xdb, 0xbb, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+8EDF "軟" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x8, 0x70, 0x0, 0x0, + 0x1d, 0xde, 0xfd, 0xda, 0xc, 0x40, 0x0, 0x0, + 0x1, 0x12, 0xd1, 0x11, 0xf, 0xba, 0xaa, 0xa1, + 0x6, 0xaa, 0xfa, 0xa3, 0x3c, 0x44, 0x45, 0xf0, + 0xa, 0x53, 0xd2, 0x95, 0x96, 0x25, 0x3, 0xc0, + 0xa, 0x20, 0xc0, 0x78, 0xe1, 0x5c, 0x6, 0x80, + 0xa, 0xdd, 0xfc, 0xe7, 0x50, 0x6c, 0x9, 0x40, + 0xa, 0x20, 0xc0, 0x75, 0x0, 0x8f, 0x0, 0x0, + 0xa, 0xdd, 0xfc, 0xe5, 0x0, 0xbf, 0x40, 0x0, + 0x0, 0x0, 0xd0, 0x0, 0x2, 0xf8, 0xa0, 0x0, + 0x3b, 0xbc, 0xfb, 0xbb, 0xa, 0xb0, 0xe1, 0x0, + 0x13, 0x34, 0xe3, 0x33, 0x5f, 0x20, 0x7c, 0x0, + 0x0, 0x0, 0xd0, 0x6, 0xf4, 0x0, 0xc, 0xa0, + 0x0, 0x0, 0xd0, 0x1c, 0x30, 0x0, 0x1, 0xb3, + + /* U+8EE2 "転" */ + 0x0, 0x0, 0xf0, 0x0, 0x2, 0x22, 0x22, 0x20, + 0xc, 0xdd, 0xfd, 0xdc, 0x2b, 0xbb, 0xbb, 0xa0, + 0x1, 0x11, 0xf1, 0x11, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xaa, 0xfa, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x72, 0xd2, 0x78, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x50, 0xd0, 0x58, 0x78, 0x88, 0x88, 0x84, + 0x7, 0xdc, 0xfc, 0xd8, 0x89, 0xbf, 0x99, 0x94, + 0x7, 0x50, 0xd0, 0x58, 0x0, 0xa8, 0x0, 0x0, + 0x7, 0xed, 0xfd, 0xe8, 0x1, 0xf2, 0x1, 0x0, + 0x0, 0x0, 0xf0, 0x0, 0x7, 0xa0, 0x3d, 0x0, + 0x1b, 0xbc, 0xfb, 0xba, 0xe, 0x20, 0xc, 0x50, + 0x3, 0x33, 0xf3, 0x33, 0x89, 0x0, 0x28, 0xc0, + 0x0, 0x0, 0xf0, 0x3, 0xfe, 0xff, 0xdb, 0xe2, + 0x0, 0x0, 0xf0, 0x0, 0x52, 0x0, 0x0, 0x86, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8EFD "軽" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0xff, 0xff, 0xff, 0xd0, + 0xd, 0xde, 0xfd, 0xd9, 0x1d, 0x0, 0x9, 0x70, + 0x1, 0x13, 0xe1, 0x11, 0xa, 0x70, 0x2f, 0x10, + 0x6, 0xaa, 0xfa, 0xa4, 0x1, 0xe4, 0xd6, 0x0, + 0xa, 0x53, 0xd2, 0x87, 0x0, 0x6f, 0xa0, 0x0, + 0xa, 0x20, 0xc0, 0x67, 0x3, 0xdd, 0xe5, 0x0, + 0xa, 0xdc, 0xfc, 0xea, 0xae, 0x60, 0x4d, 0xc5, + 0xa, 0x20, 0xc0, 0x69, 0x60, 0xe, 0x20, 0x53, + 0xa, 0xdd, 0xfc, 0xe7, 0x11, 0x1e, 0x31, 0x10, + 0x0, 0x1, 0xd0, 0x0, 0x8c, 0xcf, 0xcc, 0xb0, + 0x1c, 0xcc, 0xfc, 0xca, 0x0, 0xe, 0x20, 0x0, + 0x3, 0x34, 0xe3, 0x32, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x0, 0xe, 0x20, 0x0, + 0x0, 0x1, 0xd0, 0xa, 0xff, 0xff, 0xff, 0xf9, + + /* U+8F03 "較" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0x1e, 0xef, 0xfe, 0xd3, 0x44, 0x7a, 0x44, 0x40, + 0x0, 0x9, 0x70, 0x8, 0xaa, 0xaa, 0xaa, 0xa1, + 0x8, 0xad, 0xca, 0x70, 0xa, 0x10, 0x74, 0x0, + 0xc, 0x39, 0x65, 0xa0, 0x7a, 0x0, 0x4e, 0x10, + 0xc, 0x18, 0x53, 0xa2, 0xe2, 0x0, 0x8, 0xa0, + 0xc, 0xde, 0xdd, 0xab, 0x77, 0x0, 0x73, 0xd2, + 0xc, 0x18, 0x53, 0xa1, 0xd, 0x31, 0xf2, 0x0, + 0xc, 0xde, 0xdd, 0xa0, 0x6, 0xb8, 0xc0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x0, 0xef, 0x40, 0x0, + 0x13, 0x3b, 0x83, 0x30, 0x0, 0xae, 0x0, 0x0, + 0x3b, 0xbe, 0xdb, 0xb0, 0x8, 0xeb, 0xc0, 0x0, + 0x0, 0x9, 0x60, 0x2, 0xbc, 0x10, 0x9d, 0x50, + 0x0, 0x9, 0x60, 0x1d, 0x60, 0x0, 0x4, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8F09 "載" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x69, 0x0, 0x8, 0x81, 0xa2, 0x0, + 0x5, 0xdd, 0xef, 0xdd, 0x78, 0x90, 0x4d, 0x30, + 0x0, 0x0, 0x69, 0x0, 0x7, 0x90, 0x3, 0x30, + 0x1e, 0xee, 0xff, 0xee, 0xef, 0xfe, 0xee, 0xe3, + 0x0, 0x0, 0x56, 0x0, 0x5, 0xb0, 0x0, 0x0, + 0x7, 0xbb, 0xde, 0xbb, 0x93, 0xc0, 0xa, 0x30, + 0x1, 0x11, 0x79, 0x11, 0x12, 0xe0, 0x1e, 0x0, + 0x4, 0xda, 0xcd, 0xac, 0x70, 0xf0, 0x89, 0x0, + 0x4, 0xb6, 0x9a, 0x6a, 0x70, 0xd5, 0xe2, 0x0, + 0x4, 0xa3, 0x89, 0x38, 0x70, 0x9e, 0x80, 0x0, + 0x4, 0xca, 0xcd, 0xab, 0x60, 0x8e, 0x0, 0x30, + 0x0, 0x0, 0x68, 0x0, 0x3, 0xff, 0x30, 0x95, + 0xc, 0xdd, 0xee, 0xdd, 0xed, 0x49, 0xc2, 0xc2, + 0x0, 0x0, 0x68, 0x3, 0xb1, 0x0, 0xae, 0xa0, + + /* U+8F15 "輕" */ + 0x0, 0x9, 0x40, 0xb, 0xff, 0xff, 0xff, 0xf5, + 0x2d, 0xdf, 0xed, 0xa0, 0x11, 0x2, 0x0, 0x30, + 0x1, 0x1a, 0x51, 0x10, 0xc4, 0x1e, 0x14, 0xb0, + 0x8, 0xad, 0xca, 0x64, 0xc0, 0x97, 0xd, 0x20, + 0xd, 0x29, 0x56, 0x9d, 0x32, 0xe0, 0x6a, 0x0, + 0xc, 0x8, 0x33, 0x99, 0x80, 0xc4, 0x2d, 0x10, + 0xd, 0xce, 0xdd, 0x90, 0xe2, 0x2d, 0x6, 0x90, + 0xc, 0x8, 0x33, 0x90, 0x68, 0xa, 0x40, 0xc1, + 0xd, 0xde, 0xdd, 0x92, 0x66, 0x56, 0x55, 0x60, + 0x0, 0x9, 0x40, 0x3, 0x77, 0xae, 0x77, 0x70, + 0x4c, 0xce, 0xdc, 0xb0, 0x0, 0x4c, 0x0, 0x0, + 0x13, 0x3b, 0x73, 0x30, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0x9, 0x40, 0x0, 0x0, 0x4c, 0x0, 0x0, + 0x0, 0x9, 0x40, 0x6e, 0xee, 0xff, 0xee, 0xe8, + + /* U+8F2A "輪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x70, 0x0, 0x0, 0x3d, 0x0, 0x0, + 0xd, 0xef, 0xfe, 0xd0, 0x1, 0xa6, 0xa0, 0x0, + 0x0, 0x7, 0x80, 0x0, 0x1b, 0x20, 0x89, 0x0, + 0x4, 0x7b, 0xb7, 0x43, 0xe5, 0x0, 0xa, 0xb0, + 0x9, 0x8a, 0xa9, 0xcf, 0xae, 0xee, 0xed, 0xaa, + 0x9, 0x35, 0x64, 0x92, 0x0, 0x0, 0x0, 0x1, + 0x9, 0xdd, 0xed, 0x95, 0xaa, 0xaa, 0xaa, 0xa0, + 0x9, 0x35, 0x64, 0x98, 0x85, 0xb3, 0xd3, 0xd0, + 0x9, 0xdd, 0xed, 0x98, 0x62, 0xa0, 0xc0, 0xd0, + 0x0, 0x7, 0x80, 0x8, 0xca, 0xd9, 0xe9, 0xe0, + 0x3, 0x39, 0x93, 0x38, 0xcb, 0xea, 0xea, 0xf0, + 0xb, 0xbd, 0xdb, 0xa8, 0x62, 0xa0, 0xc0, 0xd0, + 0x0, 0x7, 0x70, 0x8, 0x62, 0xa0, 0xc0, 0xd0, + 0x0, 0x7, 0x70, 0x8, 0x62, 0xa0, 0xca, 0xb0, + + /* U+8F38 "輸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0x70, 0x0, 0x0, 0x6d, 0x0, 0x0, + 0xd, 0xef, 0xfe, 0xc0, 0x5, 0x84, 0xb0, 0x0, + 0x0, 0x8, 0x70, 0x1, 0xa9, 0x0, 0x4d, 0x40, + 0x2, 0x39, 0x93, 0x3e, 0x83, 0x33, 0x35, 0xc7, + 0x9, 0xac, 0xbb, 0x90, 0x7a, 0xaa, 0xaa, 0x0, + 0x9, 0x36, 0x54, 0x94, 0x88, 0x81, 0x0, 0xb1, + 0x9, 0xde, 0xdd, 0x98, 0x96, 0xd2, 0xc0, 0xc1, + 0x9, 0x36, 0x54, 0x98, 0x62, 0xb2, 0xc0, 0xc1, + 0x9, 0x8a, 0xa9, 0x98, 0xb9, 0xe2, 0xc0, 0xc1, + 0x3, 0x6b, 0xa6, 0x38, 0x50, 0xb2, 0xc0, 0xc1, + 0x4, 0x4a, 0x94, 0x48, 0xed, 0xf2, 0xc0, 0xc1, + 0xa, 0xad, 0xca, 0x98, 0x50, 0xb2, 0xb0, 0xc1, + 0x0, 0x7, 0x60, 0x8, 0x50, 0xb2, 0x0, 0xc1, + 0x0, 0x7, 0x60, 0x8, 0x58, 0xc0, 0x4d, 0xc0, + 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + + /* U+8F9B "辛" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x18, 0xb1, 0x11, 0x11, 0x0, + 0x0, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xdd, 0x10, + 0x0, 0x0, 0xb3, 0x0, 0x0, 0x3d, 0x0, 0x0, + 0x0, 0x0, 0x7b, 0x0, 0x0, 0x98, 0x0, 0x0, + 0x1, 0x11, 0x2e, 0x11, 0x11, 0xf2, 0x11, 0x10, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x4, 0xdd, 0xdd, 0xde, 0xed, 0xdd, 0xdd, 0x60, + 0x0, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x10, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + + /* U+8F9E "辞" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x8c, 0x90, 0x0, 0x7a, 0x0, 0x0, + 0x2e, 0xde, 0xb3, 0x1, 0x33, 0x3e, 0x43, 0x30, + 0x0, 0x8, 0x70, 0x6, 0xcc, 0xcc, 0xcc, 0xc2, + 0x0, 0x8, 0x70, 0x0, 0x59, 0x0, 0xe, 0x20, + 0x3b, 0xbd, 0xdb, 0xb0, 0xe, 0x0, 0x5c, 0x0, + 0x13, 0x3a, 0x93, 0x31, 0xa, 0x30, 0xb6, 0x0, + 0x0, 0x8, 0x70, 0xe, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x19, 0x81, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0xb, 0xdc, 0xcd, 0x90, 0x0, 0x2e, 0x0, 0x0, + 0xb, 0x30, 0x5, 0x9a, 0xee, 0xff, 0xee, 0xe4, + 0xb, 0x30, 0x5, 0x90, 0x11, 0x3e, 0x11, 0x10, + 0xb, 0x30, 0x5, 0x90, 0x0, 0x2e, 0x0, 0x0, + 0xb, 0xff, 0xff, 0x90, 0x0, 0x2e, 0x0, 0x0, + 0xb, 0x30, 0x3, 0x50, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + + /* U+8FA6 "辦" */ + 0x0, 0x74, 0x0, 0xe, 0x0, 0x0, 0xb2, 0x0, + 0x2, 0x5d, 0x21, 0xe, 0x0, 0x13, 0x8b, 0x31, + 0x9, 0x99, 0xa6, 0xd, 0x0, 0x39, 0x98, 0xb4, + 0x6, 0x60, 0xd1, 0xef, 0xee, 0xa, 0x20, 0xd0, + 0x3, 0xa1, 0xc0, 0x1c, 0xe, 0x6, 0x61, 0xb0, + 0x1, 0x84, 0x70, 0x1b, 0xe, 0x3, 0x65, 0x70, + 0x1e, 0xef, 0xea, 0x2a, 0xe, 0x6e, 0xef, 0xe9, + 0x0, 0x2d, 0x0, 0x48, 0xe, 0x0, 0x4b, 0x0, + 0x1, 0x3d, 0x10, 0x76, 0xe, 0x0, 0x4b, 0x0, + 0xb, 0xdf, 0xc6, 0x93, 0xe, 0x1e, 0xef, 0xe7, + 0x0, 0x4a, 0x0, 0xd0, 0xd, 0x0, 0x4b, 0x0, + 0x0, 0x86, 0x2, 0xb0, 0x1c, 0x0, 0x4b, 0x0, + 0x0, 0xd1, 0xa, 0x40, 0x4b, 0x0, 0x4b, 0x0, + 0x9, 0x50, 0x1b, 0xb, 0xe5, 0x0, 0x4b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FB2 "農" */ + 0x0, 0x11, 0x17, 0xb1, 0x1c, 0x51, 0x11, 0x0, + 0x0, 0xd9, 0x7b, 0xd7, 0x7e, 0x97, 0xb9, 0x0, + 0x0, 0xdb, 0xac, 0xea, 0xae, 0xba, 0xc9, 0x0, + 0x0, 0xd3, 0x17, 0xb1, 0x1c, 0x51, 0x79, 0x0, + 0x0, 0xdb, 0xad, 0xea, 0xae, 0xca, 0xc9, 0x0, + 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0xfd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x70, + 0x0, 0xf0, 0x44, 0x44, 0x44, 0x44, 0x40, 0x0, + 0x0, 0xf0, 0x66, 0x66, 0x66, 0x66, 0x60, 0x0, + 0x2, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xa0, + 0x3, 0xc1, 0x89, 0x13, 0xe4, 0x12, 0x99, 0x10, + 0x8, 0x80, 0x79, 0x0, 0x5e, 0x9c, 0x50, 0x0, + 0xe, 0x30, 0xab, 0x6a, 0xb3, 0xdc, 0x63, 0x0, + 0x4a, 0x1, 0xeb, 0x73, 0x0, 0x4, 0x9d, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FBA "辺" */ + 0xa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xd8, 0x8, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x0, 0x1d, 0x50, 0x0, 0xb5, 0x0, 0xd, 0x30, + 0x0, 0x1, 0x0, 0x0, 0xd3, 0x0, 0xd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xe1, 0x0, 0xe, 0x20, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0x0, 0xf, 0x10, + 0x3f, 0xff, 0x10, 0x5, 0xb0, 0x0, 0xf, 0x10, + 0x0, 0xe, 0x10, 0xc, 0x60, 0x0, 0x1f, 0x0, + 0x0, 0xe, 0x10, 0x4e, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0xe, 0x12, 0xe5, 0x0, 0x0, 0x6c, 0x0, + 0x0, 0xe, 0x1a, 0x60, 0x1, 0xee, 0xf5, 0x0, + 0x0, 0x7f, 0x70, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x9, 0xb2, 0xab, 0x40, 0x0, 0x0, 0x0, 0x10, + 0x2d, 0x0, 0x4, 0xae, 0xfe, 0xef, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FBC "込" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xb0, 0x0, 0x6, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xab, 0x0, 0x1, 0xc7, 0x0, 0x0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x1e, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6a, 0x97, 0x0, 0x0, + 0x3f, 0xff, 0x10, 0x0, 0xd5, 0x3d, 0x0, 0x0, + 0x0, 0xe, 0x10, 0x4, 0xe0, 0xd, 0x50, 0x0, + 0x0, 0xe, 0x10, 0x1e, 0x60, 0x6, 0xd0, 0x0, + 0x0, 0xe, 0x11, 0xba, 0x0, 0x0, 0xbb, 0x10, + 0x0, 0xe, 0x1c, 0xb0, 0x0, 0x0, 0x1a, 0xe0, + 0x0, 0x9f, 0x92, 0x0, 0x0, 0x0, 0x0, 0x20, + 0xb, 0x90, 0x6d, 0x83, 0x21, 0x22, 0x34, 0x51, + 0x1a, 0x0, 0x1, 0x7b, 0xcd, 0xdc, 0xcb, 0xb1, + + /* U+8FCE "迎" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x5, 0xd8, 0x0, 0x0, 0x0, + 0x8, 0xc3, 0x0, 0xe9, 0x20, 0xfe, 0xef, 0xe0, + 0x0, 0x4e, 0x51, 0xe0, 0x0, 0xf0, 0x1, 0xe0, + 0x0, 0x1, 0x11, 0xe0, 0x0, 0xf0, 0x1, 0xe0, + 0x0, 0x0, 0x1, 0xe0, 0x0, 0xf0, 0x1, 0xe0, + 0x3f, 0xfe, 0x1, 0xe0, 0x0, 0xf0, 0x1, 0xe0, + 0x0, 0x2f, 0x1, 0xe0, 0x0, 0xf0, 0x1, 0xe0, + 0x0, 0x1f, 0x1, 0xe0, 0x1, 0xf0, 0x1, 0xe0, + 0x0, 0x1f, 0x2, 0xf7, 0xcb, 0xf0, 0x1, 0xe0, + 0x0, 0x1f, 0xa, 0xe8, 0x30, 0xf0, 0xbd, 0xc0, + 0x0, 0x1f, 0x2, 0x0, 0x0, 0xf0, 0x11, 0x0, + 0x0, 0x6f, 0x60, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0x9, 0xc2, 0x9c, 0x50, 0x0, 0x10, 0x1, 0x21, + 0x2d, 0x10, 0x3, 0xae, 0xfe, 0xef, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+8FD1 "近" */ + 0x2, 0x30, 0x0, 0x0, 0x12, 0x46, 0x8c, 0x70, + 0x3, 0xe3, 0x0, 0x1f, 0xdc, 0xa9, 0x64, 0x0, + 0x0, 0x5e, 0x20, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0x40, 0x1f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xee, 0xee, 0xee, 0xe6, + 0x2d, 0xdd, 0x10, 0x4e, 0x22, 0x2e, 0x32, 0x20, + 0x3, 0x3f, 0x10, 0x5c, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xe, 0x10, 0x79, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xe, 0x10, 0xb7, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xe, 0x11, 0xf2, 0x0, 0xe, 0x10, 0x0, + 0x0, 0xe, 0x19, 0xb0, 0x0, 0xe, 0x10, 0x0, + 0x1, 0xcc, 0xb4, 0x20, 0x0, 0x8, 0x10, 0x0, + 0xc, 0x80, 0x5e, 0x83, 0x21, 0x11, 0x23, 0x53, + 0x2c, 0x0, 0x1, 0x7c, 0xde, 0xfe, 0xed, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FD4 "返" */ + 0x4, 0x40, 0x0, 0x12, 0x45, 0x79, 0xbe, 0x40, + 0x3, 0xe3, 0x0, 0xed, 0xba, 0x87, 0x42, 0x0, + 0x0, 0x5e, 0x10, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x0, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xee, 0xee, 0xff, 0x0, + 0x2, 0x22, 0x0, 0xf1, 0x0, 0x0, 0x6a, 0x0, + 0x2d, 0xde, 0x1, 0xf2, 0xc2, 0x0, 0xe3, 0x0, + 0x0, 0x2e, 0x2, 0xd0, 0x5e, 0x4a, 0x90, 0x0, + 0x0, 0x2e, 0x6, 0xa0, 0x3, 0xfe, 0x0, 0x0, + 0x0, 0x2e, 0xb, 0x50, 0xa, 0xdd, 0x90, 0x0, + 0x0, 0x2e, 0x4e, 0x16, 0xda, 0x1, 0xca, 0x0, + 0x0, 0x5f, 0x34, 0x2b, 0x40, 0x0, 0xa, 0x10, + 0x9, 0xc8, 0xd8, 0x31, 0x0, 0x0, 0x12, 0x30, + 0x3c, 0x0, 0x16, 0xbe, 0xff, 0xff, 0xee, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FEB "迫" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x5, 0x90, 0x0, 0x0, 0xa, 0x80, 0x0, 0x0, + 0x0, 0xc9, 0x0, 0x0, 0xf, 0x30, 0x0, 0x0, + 0x0, 0xd, 0x60, 0xef, 0xee, 0xee, 0xff, 0x0, + 0x0, 0x1, 0x0, 0xe2, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x1f, 0x0, + 0x4c, 0xcb, 0x0, 0xe2, 0x0, 0x0, 0x1f, 0x0, + 0x13, 0x5e, 0x0, 0xef, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x2e, 0x0, 0xe2, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x2e, 0x0, 0xe2, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x2e, 0x0, 0xe3, 0x0, 0x0, 0x1f, 0x0, + 0x0, 0x2e, 0x0, 0xef, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x9f, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xa4, 0xcb, 0x52, 0x10, 0x1, 0x12, 0x42, + 0x4c, 0x0, 0x5, 0xbe, 0xff, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+8FFD "追" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0x50, 0x0, 0x0, + 0x7, 0x90, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, + 0x0, 0xb9, 0x0, 0xde, 0xef, 0xee, 0xed, 0x0, + 0x0, 0xb, 0x20, 0xe1, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x0, 0x0, 0xec, 0xbb, 0xbb, 0xce, 0x0, + 0x4f, 0xff, 0x10, 0xe4, 0x33, 0x33, 0x32, 0x0, + 0x1, 0x1e, 0x10, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x10, 0xee, 0xee, 0xee, 0xee, 0x60, + 0x0, 0xe, 0x10, 0xe1, 0x0, 0x0, 0x9, 0x70, + 0x0, 0xe, 0x10, 0xe1, 0x0, 0x0, 0x9, 0x70, + 0x0, 0xe, 0x10, 0xe2, 0x0, 0x0, 0x9, 0x70, + 0x0, 0xe, 0x10, 0xcd, 0xdd, 0xdd, 0xdd, 0x60, + 0x4, 0xd8, 0xb6, 0x20, 0x0, 0x0, 0x0, 0x22, + 0x1e, 0x30, 0x7, 0xcf, 0xfe, 0xef, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9000 "退" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xa0, 0x0, 0xee, 0xee, 0xee, 0xec, 0x0, + 0x0, 0xc7, 0x0, 0xe2, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0x1e, 0x30, 0xe2, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0x4, 0x10, 0xee, 0xdd, 0xdd, 0xec, 0x0, + 0x0, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x3c, 0x0, + 0x2e, 0xee, 0x10, 0xed, 0xdd, 0xdd, 0xec, 0x0, + 0x1, 0x1e, 0x10, 0xe3, 0x13, 0x10, 0x17, 0xa0, + 0x0, 0xe, 0x10, 0xe2, 0xb, 0xa2, 0xab, 0x20, + 0x0, 0xe, 0x10, 0xe2, 0x0, 0x7f, 0xa0, 0x0, + 0x0, 0xe, 0x10, 0xf4, 0x6a, 0x4, 0xe6, 0x0, + 0x0, 0xe, 0x14, 0xfe, 0x94, 0x0, 0x2e, 0x60, + 0x0, 0x7f, 0x91, 0x30, 0x0, 0x0, 0x1, 0x10, + 0x9, 0xb0, 0x6c, 0x61, 0x0, 0x0, 0x2, 0x33, + 0x1c, 0x0, 0x1, 0x8d, 0xef, 0xff, 0xfe, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9001 "送" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x90, 0x0, 0x3d, 0x0, 0x0, 0xb7, 0x0, + 0x0, 0xc8, 0x0, 0xb, 0x60, 0x3, 0xe0, 0x0, + 0x0, 0x1e, 0x41, 0x25, 0x82, 0x2c, 0x72, 0x10, + 0x0, 0x2, 0x5, 0xdd, 0xde, 0xed, 0xdd, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, + 0x2d, 0xdc, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, + 0x0, 0x2e, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x1e, 0x0, 0x0, 0xe, 0xb1, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x5d, 0xab, 0x0, 0x0, + 0x0, 0x1e, 0x0, 0x3, 0xe4, 0xa, 0xc0, 0x0, + 0x0, 0x1e, 0x0, 0x7e, 0x50, 0x0, 0xac, 0x0, + 0x0, 0x9f, 0x37, 0xb2, 0x0, 0x0, 0xa, 0x30, + 0xc, 0xa4, 0xda, 0x41, 0x0, 0x0, 0x1, 0x31, + 0x4c, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9003 "逃" */ + 0x3, 0x0, 0x0, 0x0, 0xe0, 0xd2, 0x0, 0x0, + 0x8, 0xc1, 0x8, 0x0, 0xe0, 0xd2, 0xa, 0x10, + 0x0, 0x6d, 0x1a, 0x70, 0xe0, 0xd2, 0x6b, 0x0, + 0x0, 0x4, 0x1, 0xe2, 0xe0, 0xd4, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x41, 0xe0, 0xd4, 0x30, 0x0, + 0x2e, 0xee, 0x0, 0x4, 0xd0, 0xd8, 0x0, 0x0, + 0x1, 0x2f, 0x1, 0x9e, 0xd0, 0xda, 0xd2, 0x0, + 0x0, 0x1f, 0x3e, 0x86, 0xb0, 0xd2, 0x5e, 0x30, + 0x0, 0x1f, 0x13, 0xa, 0x70, 0xd2, 0x5, 0x20, + 0x0, 0x1f, 0x0, 0x3e, 0x10, 0xd2, 0x0, 0x70, + 0x0, 0x1f, 0x2, 0xd5, 0x0, 0xc6, 0x34, 0xd0, + 0x0, 0x1f, 0xb, 0x40, 0x0, 0x5b, 0xbb, 0x50, + 0x4, 0xc5, 0xa6, 0x10, 0x0, 0x0, 0x2, 0x41, + 0xe, 0x20, 0x6, 0xcf, 0xee, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+900F "透" */ + 0x3, 0x0, 0x0, 0x1, 0x23, 0x46, 0x8a, 0x10, + 0xa, 0xb0, 0x6, 0xcb, 0xbd, 0xc6, 0x42, 0x0, + 0x0, 0xba, 0x0, 0x0, 0x7, 0x80, 0x0, 0x0, + 0x0, 0x1e, 0x2a, 0xaa, 0xad, 0xda, 0xaa, 0xa2, + 0x0, 0x0, 0x3, 0x33, 0xaf, 0xfb, 0x33, 0x30, + 0x0, 0x0, 0x0, 0x8, 0xb8, 0x9a, 0x80, 0x0, + 0x0, 0x0, 0x2, 0xbb, 0x7, 0x80, 0xab, 0x30, + 0x1f, 0xff, 0x2e, 0x73, 0x26, 0x62, 0x14, 0xd2, + 0x0, 0x1f, 0x0, 0x68, 0xf9, 0x8e, 0x30, 0x0, + 0x0, 0x1f, 0x0, 0x1, 0xe0, 0xe, 0xdd, 0x80, + 0x0, 0x1f, 0x0, 0x8, 0x90, 0x0, 0x8, 0x70, + 0x0, 0x1f, 0x0, 0x8d, 0x10, 0x0, 0xc, 0x40, + 0x0, 0x2f, 0x4c, 0xa1, 0x0, 0x2d, 0xda, 0x0, + 0x5, 0xec, 0xeb, 0x40, 0x0, 0x0, 0x0, 0x10, + 0x1e, 0x50, 0x6, 0xcf, 0xfe, 0xff, 0xff, 0xf3, + 0x1, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, 0x0, + + /* U+9010 "逐" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0x80, 0x1e, 0xee, 0xef, 0xfe, 0xee, 0xd0, + 0x1, 0xd7, 0x0, 0x0, 0x7d, 0x10, 0x0, 0x0, + 0x0, 0x2d, 0x10, 0xa, 0xf7, 0x0, 0x4, 0x20, + 0x0, 0x0, 0x7, 0xe8, 0x1d, 0x40, 0x4d, 0x20, + 0x0, 0x0, 0x2b, 0x20, 0x4d, 0xc5, 0xd1, 0x0, + 0x2e, 0xed, 0x0, 0x7, 0xc2, 0xcf, 0x10, 0x0, + 0x1, 0x3e, 0x5, 0xd9, 0x1, 0xef, 0xb0, 0x0, + 0x0, 0x1e, 0x5, 0x30, 0x2c, 0x8b, 0x9b, 0x0, + 0x0, 0x1e, 0x0, 0x5, 0xd3, 0x3b, 0xa, 0xa0, + 0x0, 0x1e, 0x4, 0xbb, 0x20, 0x3c, 0x0, 0x90, + 0x0, 0x1e, 0x2c, 0x40, 0x0, 0x99, 0x0, 0x0, + 0x0, 0x5f, 0x40, 0x0, 0xde, 0xd1, 0x0, 0x0, + 0x8, 0xd6, 0xca, 0x41, 0x22, 0x0, 0x1, 0x21, + 0x2d, 0x10, 0x4, 0xad, 0xef, 0xff, 0xee, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9019 "這" */ + 0x0, 0x0, 0x0, 0x0, 0x19, 0x10, 0x0, 0x0, + 0x5, 0x40, 0x0, 0x0, 0xb, 0xa0, 0x0, 0x0, + 0x5, 0xf8, 0xb, 0xbb, 0xbc, 0xdb, 0xbb, 0xb1, + 0x0, 0x2e, 0x82, 0x22, 0x22, 0x22, 0x22, 0x20, + 0x0, 0x2, 0x10, 0x12, 0x22, 0x22, 0x22, 0x0, + 0x0, 0x0, 0x0, 0x3a, 0xaa, 0xaa, 0xa6, 0x0, + 0x19, 0x99, 0x0, 0x1, 0x11, 0x11, 0x10, 0x0, + 0x6, 0x7f, 0x0, 0x4b, 0xbb, 0xbb, 0xb8, 0x0, + 0x0, 0x1f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0x8e, 0xdd, 0xdd, 0xdd, 0x0, + 0x0, 0x1f, 0x0, 0x87, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x1f, 0x0, 0x87, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0x2f, 0x20, 0x7d, 0xdd, 0xdd, 0xdb, 0x0, + 0x6, 0xc5, 0xb9, 0x30, 0x0, 0x0, 0x0, 0x20, + 0x2e, 0x10, 0x5, 0xbf, 0xfe, 0xef, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+901A "通" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x50, 0x1, 0xdd, 0xdd, 0xdd, 0xef, 0x80, + 0x3, 0xe5, 0x0, 0x1, 0x50, 0x2, 0xca, 0x0, + 0x0, 0x4f, 0x30, 0x2, 0xbe, 0x9e, 0x60, 0x0, + 0x0, 0x6, 0x30, 0x22, 0x26, 0xde, 0x52, 0x20, + 0x0, 0x0, 0x1, 0xfa, 0xab, 0xfa, 0xab, 0xd0, + 0x15, 0x55, 0x1, 0xe0, 0x1, 0xd0, 0x2, 0xd0, + 0x2a, 0xaf, 0x1, 0xfd, 0xdd, 0xfd, 0xdd, 0xd0, + 0x0, 0xf, 0x1, 0xe0, 0x1, 0xd0, 0x2, 0xd0, + 0x0, 0xf, 0x1, 0xfd, 0xdd, 0xfd, 0xdd, 0xd0, + 0x0, 0xf, 0x1, 0xe0, 0x1, 0xd0, 0x2, 0xd0, + 0x0, 0xf, 0x1, 0xe0, 0x1, 0xd0, 0x3, 0xd0, + 0x0, 0x5f, 0x61, 0xd0, 0x1, 0xb0, 0xdd, 0x80, + 0x8, 0xb2, 0x9b, 0x50, 0x0, 0x0, 0x0, 0x12, + 0x2d, 0x10, 0x3, 0x9d, 0xee, 0xef, 0xff, 0xe7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+901F "速" */ + 0x4, 0x10, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x7, 0xe2, 0xd, 0xee, 0xef, 0xee, 0xee, 0xc0, + 0x0, 0x8e, 0x10, 0x0, 0xe, 0x20, 0x0, 0x0, + 0x0, 0x8, 0x0, 0x22, 0x2e, 0x42, 0x22, 0x0, + 0x0, 0x0, 0x1, 0xfb, 0xbf, 0xcb, 0xbf, 0x10, + 0x27, 0x77, 0x1, 0xd0, 0xd, 0x20, 0xe, 0x10, + 0x28, 0x8f, 0x11, 0xd1, 0x1e, 0x31, 0x1e, 0x10, + 0x0, 0xe, 0x11, 0xcc, 0xdf, 0xec, 0xcc, 0x10, + 0x0, 0xe, 0x10, 0x1, 0xcf, 0xe8, 0x0, 0x0, + 0x0, 0xe, 0x10, 0xc, 0x5d, 0x39, 0xc1, 0x0, + 0x0, 0xe, 0x14, 0xe7, 0xd, 0x20, 0x6d, 0x20, + 0x0, 0x1f, 0x3a, 0x50, 0xd, 0x20, 0x5, 0x20, + 0x6, 0xd8, 0xd8, 0x30, 0x5, 0x10, 0x0, 0x10, + 0x2e, 0x10, 0x6, 0xcf, 0xee, 0xee, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9020 "造" */ + 0x2, 0x10, 0x0, 0x2a, 0x3, 0xd0, 0x0, 0x0, + 0x6, 0xd2, 0x0, 0x9a, 0x25, 0xd2, 0x22, 0x10, + 0x0, 0x6d, 0x12, 0xec, 0xcd, 0xfc, 0xcc, 0x60, + 0x0, 0x5, 0x1c, 0x60, 0x3, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x0, 0x3, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xee, 0xee, 0xee, 0xee, 0xe2, + 0x2c, 0xcf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0xde, 0xee, 0xee, 0xed, 0x0, + 0x0, 0x1f, 0x0, 0xe1, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x1f, 0x0, 0xe1, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x1f, 0x0, 0xe3, 0x22, 0x22, 0x4e, 0x0, + 0x0, 0x1f, 0x0, 0xbc, 0xcc, 0xcc, 0xcb, 0x0, + 0x4, 0xd8, 0xc6, 0x20, 0x0, 0x0, 0x0, 0x21, + 0xe, 0x30, 0x7, 0xcf, 0xee, 0xef, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9023 "連" */ + 0x4, 0x80, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x0, 0xc8, 0x1e, 0xee, 0xef, 0xee, 0xee, 0xc0, + 0x0, 0x1e, 0x40, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x0, 0x1, 0x2, 0xdc, 0xcf, 0xdc, 0xdd, 0x0, + 0x1, 0x11, 0x2, 0xd0, 0xe, 0x10, 0xf, 0x0, + 0x3e, 0xee, 0x2, 0xfc, 0xcf, 0xdc, 0xdf, 0x0, + 0x0, 0x1e, 0x2, 0xd0, 0xe, 0x10, 0xf, 0x0, + 0x0, 0x1e, 0x2, 0xfb, 0xbf, 0xcb, 0xbf, 0x0, + 0x0, 0x1e, 0x0, 0x11, 0x1e, 0x31, 0x11, 0x0, + 0x0, 0x1e, 0x3a, 0xaa, 0xaf, 0xba, 0xaa, 0xa1, + 0x0, 0x1e, 0x13, 0x33, 0x3f, 0x53, 0x33, 0x30, + 0x1, 0xaf, 0x40, 0x0, 0xe, 0x10, 0x0, 0x0, + 0xc, 0x94, 0xda, 0x40, 0xa, 0x10, 0x0, 0x10, + 0x4c, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+902E "逮" */ + 0x6, 0x50, 0x0, 0x0, 0xe, 0x10, 0x0, 0x0, + 0x2, 0xe4, 0x4, 0xdd, 0xdf, 0xdd, 0xde, 0x0, + 0x0, 0x3c, 0x0, 0x0, 0xe, 0x10, 0x1e, 0x0, + 0x0, 0x0, 0x5c, 0xcc, 0xcf, 0xdc, 0xdf, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0xe, 0x10, 0x1e, 0x0, + 0x3f, 0xfe, 0x5, 0xdd, 0xdf, 0xdd, 0xde, 0x0, + 0x0, 0x2e, 0x3, 0x40, 0xe, 0x10, 0x7, 0x10, + 0x0, 0x1e, 0x1, 0xd3, 0xe, 0x20, 0x99, 0x0, + 0x0, 0x1e, 0x0, 0x29, 0x4f, 0xec, 0x80, 0x0, + 0x0, 0x1e, 0x0, 0x3b, 0xbf, 0x3a, 0xc2, 0x0, + 0x0, 0x1e, 0x1a, 0xd4, 0xe, 0x10, 0x5e, 0x60, + 0x0, 0x6f, 0x16, 0x1, 0x3f, 0x10, 0x1, 0x60, + 0xa, 0xa4, 0xc8, 0x33, 0xa7, 0x0, 0x1, 0x11, + 0x3c, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9031 "週" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x60, 0x1, 0xfe, 0xee, 0xee, 0xef, 0x10, + 0x2, 0xe5, 0x1, 0xd0, 0x4, 0x0, 0xe, 0x10, + 0x0, 0x4f, 0x21, 0xd0, 0xd, 0x20, 0xe, 0x10, + 0x0, 0x5, 0x11, 0xd5, 0xbf, 0xcb, 0x4e, 0x10, + 0x0, 0x0, 0x2, 0xd0, 0xc, 0x10, 0xe, 0x10, + 0x2, 0x22, 0x3, 0xc8, 0xcc, 0xcc, 0x6e, 0x10, + 0x1e, 0xff, 0x4, 0xb0, 0x22, 0x22, 0xe, 0x10, + 0x0, 0x1f, 0x5, 0xa3, 0xda, 0xaf, 0xe, 0x10, + 0x0, 0x1f, 0x8, 0x73, 0x70, 0xe, 0xe, 0x10, + 0x0, 0x1f, 0xd, 0x43, 0xb6, 0x6e, 0xe, 0x10, + 0x0, 0x1f, 0x4e, 0x1, 0x55, 0x55, 0xe, 0x10, + 0x0, 0x2f, 0x75, 0x0, 0x0, 0x9, 0xdd, 0x0, + 0x5, 0xe7, 0xca, 0x40, 0x0, 0x0, 0x0, 0x20, + 0x1e, 0x30, 0x5, 0xbe, 0xfe, 0xee, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9032 "進" */ + 0x0, 0x0, 0x0, 0x3, 0x0, 0x10, 0x0, 0x0, + 0xc, 0x90, 0x0, 0x1e, 0x4, 0xd0, 0x0, 0x0, + 0x1, 0xd9, 0x0, 0x89, 0x0, 0xc6, 0x0, 0x0, + 0x0, 0x1d, 0x20, 0xef, 0xee, 0xff, 0xee, 0xb0, + 0x0, 0x0, 0xa, 0xf1, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x6d, 0xf1, 0x0, 0xd1, 0x0, 0x0, + 0x2, 0x22, 0x82, 0xee, 0xdd, 0xfd, 0xdd, 0x40, + 0xa, 0xbf, 0x0, 0xe1, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0xec, 0xbb, 0xfb, 0xbb, 0x30, + 0x0, 0x1f, 0x0, 0xe4, 0x22, 0xe3, 0x22, 0x0, + 0x0, 0x1f, 0x0, 0xe1, 0x0, 0xd1, 0x0, 0x0, + 0x0, 0x1f, 0x0, 0xee, 0xee, 0xfe, 0xee, 0xe1, + 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xe7, 0xdc, 0x62, 0x0, 0x0, 0x12, 0x31, + 0x1e, 0x30, 0x5, 0xbe, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9045 "遅" */ + 0x5, 0x30, 0x0, 0xfc, 0xcc, 0xcc, 0xcd, 0xe0, + 0x4, 0xd9, 0x0, 0xe0, 0x0, 0x0, 0x1, 0xe0, + 0x0, 0xb, 0x80, 0xfa, 0xaa, 0xaa, 0xab, 0xe0, + 0x0, 0x0, 0x0, 0xe2, 0xa3, 0x22, 0x99, 0x20, + 0x0, 0x0, 0x1, 0xd0, 0x67, 0x1, 0xe3, 0x0, + 0x1d, 0xdd, 0x2, 0xca, 0xdf, 0xde, 0xfd, 0xd0, + 0x2, 0x3f, 0x3, 0xb0, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x1f, 0x5, 0xa6, 0xdd, 0xfd, 0xdd, 0x70, + 0x0, 0x1f, 0x8, 0x70, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x1f, 0xd, 0x5d, 0xdd, 0xfd, 0xdd, 0xd3, + 0x0, 0x1f, 0x5d, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0x0, 0x6f, 0x73, 0x0, 0x0, 0xd2, 0x0, 0x0, + 0x8, 0xc3, 0xab, 0x50, 0x0, 0x10, 0x0, 0x21, + 0x2e, 0x10, 0x4, 0xae, 0xfe, 0xef, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+904A "遊" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x77, 0x0, 0x4c, 0x0, 0x0, + 0xb, 0x90, 0x0, 0x2c, 0x0, 0xbb, 0x66, 0x61, + 0x0, 0xab, 0x9e, 0xfe, 0xed, 0xe8, 0x77, 0x71, + 0x0, 0x4, 0x0, 0xe0, 0x8, 0x74, 0x44, 0x30, + 0x0, 0x0, 0x0, 0xfb, 0xb3, 0x46, 0x6e, 0x80, + 0x4f, 0xff, 0x0, 0xe3, 0xb4, 0x0, 0xa7, 0x0, + 0x0, 0x2f, 0x2, 0xc0, 0xb3, 0x0, 0xd0, 0x0, + 0x0, 0x1f, 0x3, 0xa0, 0xb6, 0xee, 0xfe, 0xe4, + 0x0, 0x1f, 0x6, 0x80, 0xc2, 0x0, 0xd0, 0x0, + 0x0, 0x1f, 0xc, 0x20, 0xd1, 0x0, 0xd0, 0x0, + 0x0, 0x1f, 0x5b, 0x0, 0xf0, 0x0, 0xe0, 0x0, + 0x0, 0x5f, 0xb2, 0x4d, 0xa0, 0x6d, 0xd0, 0x0, + 0x7, 0xd5, 0xba, 0x41, 0x0, 0x0, 0x0, 0x20, + 0x2e, 0x10, 0x5, 0xbf, 0xfe, 0xef, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+904B "運" */ + 0x7, 0x50, 0xf, 0xdd, 0xdd, 0xdd, 0xdd, 0xd0, + 0x2, 0xe4, 0xf, 0x0, 0x6, 0x10, 0x2, 0xd0, + 0x0, 0x4e, 0x1d, 0x79, 0x9f, 0xa9, 0x97, 0xb0, + 0x0, 0x3, 0x0, 0x23, 0x3e, 0x53, 0x31, 0x0, + 0x0, 0x0, 0x0, 0xbb, 0xbf, 0xcb, 0xbb, 0x0, + 0x3, 0x33, 0x1, 0xd0, 0xd, 0x20, 0xf, 0x0, + 0x3d, 0xdf, 0x1, 0xfb, 0xbf, 0xcb, 0xbf, 0x0, + 0x0, 0xf, 0x1, 0xd0, 0xd, 0x20, 0xf, 0x0, + 0x0, 0xf, 0x1, 0xfb, 0xbf, 0xcb, 0xbf, 0x0, + 0x0, 0xf, 0x0, 0x0, 0xd, 0x20, 0x0, 0x0, + 0x0, 0xf, 0xd, 0xdd, 0xdf, 0xed, 0xdd, 0xd0, + 0x0, 0xae, 0x90, 0x0, 0xd, 0x20, 0x0, 0x0, + 0xb, 0x80, 0x7d, 0x62, 0x15, 0x11, 0x12, 0x41, + 0x1b, 0x0, 0x1, 0x8c, 0xde, 0xed, 0xdd, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+904E "過" */ + 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xe2, 0x0, 0x6f, 0xdd, 0xdd, 0xf7, 0x0, + 0x0, 0x5d, 0x10, 0x6c, 0x0, 0x0, 0xb7, 0x0, + 0x0, 0x7, 0x40, 0x6f, 0xcc, 0x70, 0xb7, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0x3, 0x80, 0xb7, 0x0, + 0x0, 0x0, 0x0, 0x6c, 0x3, 0x80, 0xb7, 0x0, + 0x4f, 0xfe, 0xa, 0xef, 0xde, 0xed, 0xfe, 0xa0, + 0x0, 0x2e, 0xb, 0x30, 0x0, 0x0, 0x3, 0xc0, + 0x0, 0x1e, 0xb, 0x30, 0xec, 0xce, 0x3, 0xc0, + 0x0, 0x1e, 0xb, 0x30, 0xd0, 0xd, 0x3, 0xc0, + 0x0, 0x1e, 0xb, 0x30, 0xe4, 0x4e, 0x3, 0xc0, + 0x0, 0x1e, 0xb, 0x30, 0xe7, 0x77, 0x3, 0xc0, + 0x0, 0x9f, 0x3b, 0x30, 0x10, 0x1, 0xde, 0x80, + 0xc, 0x94, 0xda, 0x40, 0x0, 0x0, 0x11, 0x22, + 0x5c, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9053 "道" */ + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, + 0x5, 0x10, 0x0, 0x2e, 0x20, 0x1, 0xe2, 0x0, + 0x6, 0xd1, 0x0, 0x9, 0x70, 0xa, 0x80, 0x0, + 0x0, 0x7c, 0x1d, 0xdd, 0xdf, 0xed, 0xdd, 0xd4, + 0x0, 0x5, 0x0, 0x0, 0xe, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdd, 0xde, 0xdd, 0xdd, 0x0, + 0x2b, 0xbb, 0x10, 0xe1, 0x0, 0x0, 0x1e, 0x0, + 0x3, 0x3f, 0x10, 0xec, 0xcc, 0xcc, 0xce, 0x0, + 0x0, 0xe, 0x10, 0xe1, 0x0, 0x0, 0x1e, 0x0, + 0x0, 0xe, 0x10, 0xeb, 0xbb, 0xbb, 0xce, 0x0, + 0x0, 0xe, 0x10, 0xe2, 0x11, 0x11, 0x3e, 0x0, + 0x0, 0xe, 0x10, 0xe2, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x1f, 0x30, 0xbc, 0xcc, 0xcc, 0xcb, 0x0, + 0x5, 0xc4, 0xa8, 0x30, 0x0, 0x0, 0x0, 0x21, + 0x1d, 0x10, 0x4, 0xae, 0xed, 0xee, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9054 "達" */ + 0x3, 0x20, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x4, 0xe4, 0x2, 0xcc, 0xce, 0xec, 0xcc, 0x10, + 0x0, 0x4e, 0x20, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x3, 0x2d, 0xde, 0xdd, 0xdd, 0xed, 0xd2, + 0x0, 0x0, 0x0, 0xe, 0x10, 0x6, 0xb0, 0x0, + 0x2, 0x22, 0x6, 0x7c, 0xa7, 0x7d, 0x97, 0x60, + 0x2b, 0xce, 0x4, 0x44, 0x4b, 0x94, 0x44, 0x40, + 0x0, 0x1e, 0x3, 0x99, 0x9d, 0xc9, 0x99, 0x30, + 0x0, 0x1e, 0x0, 0x22, 0x2b, 0x82, 0x22, 0x0, + 0x0, 0x1e, 0x1, 0x11, 0x1a, 0x71, 0x11, 0x10, + 0x0, 0x1e, 0xb, 0xbb, 0xbe, 0xdb, 0xbb, 0xb0, + 0x0, 0x9e, 0x60, 0x0, 0x9, 0x60, 0x0, 0x0, + 0x9, 0x80, 0x8b, 0x51, 0x2, 0x10, 0x2, 0x32, + 0x1c, 0x0, 0x2, 0x9c, 0xee, 0xfe, 0xed, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9055 "違" */ + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x6, 0x20, 0x0, 0x0, 0x89, 0x0, 0x0, 0x0, + 0x5, 0xe3, 0x4, 0xcc, 0xfc, 0xcc, 0xf2, 0x0, + 0x0, 0x5e, 0x10, 0x2, 0xe0, 0x0, 0xd2, 0x0, + 0x0, 0x5, 0x5c, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, + 0x0, 0x0, 0x0, 0x77, 0x77, 0x77, 0x75, 0x0, + 0x0, 0x0, 0x0, 0xf4, 0x44, 0x44, 0x7b, 0x0, + 0x1f, 0xff, 0x0, 0xf6, 0x66, 0x66, 0x9b, 0x0, + 0x0, 0x1f, 0x0, 0x44, 0x44, 0xd7, 0x42, 0x0, + 0x0, 0x1f, 0xb, 0xec, 0xcc, 0xfd, 0xcc, 0xa0, + 0x0, 0x1f, 0x2, 0xd0, 0x0, 0xc3, 0x0, 0x0, + 0x0, 0x1f, 0x7, 0xec, 0xcc, 0xfd, 0xcc, 0x80, + 0x0, 0x3f, 0x30, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x8, 0xe7, 0xd9, 0x30, 0x0, 0x51, 0x0, 0x10, + 0x3e, 0x20, 0x6, 0xbf, 0xfe, 0xee, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9060 "遠" */ + 0x1, 0x0, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0x7, 0xd4, 0x5, 0xdd, 0xdf, 0xed, 0xdd, 0x0, + 0x0, 0x4e, 0x60, 0x0, 0xb, 0x40, 0x0, 0x0, + 0x0, 0x2, 0x5d, 0xdd, 0xdd, 0xdd, 0xdd, 0xd0, + 0x0, 0x0, 0x0, 0x11, 0x11, 0x11, 0x10, 0x0, + 0x18, 0x88, 0x0, 0xfb, 0xbb, 0xbb, 0xd9, 0x0, + 0x5, 0x6f, 0x0, 0xf0, 0x0, 0x0, 0x69, 0x0, + 0x0, 0x1f, 0x0, 0xfc, 0xcc, 0xcc, 0xea, 0x0, + 0x0, 0x1f, 0x0, 0x1, 0xbf, 0x91, 0x3d, 0x40, + 0x0, 0x1f, 0x0, 0x4d, 0x7c, 0x8d, 0xe2, 0x0, + 0x0, 0x1f, 0x1c, 0xc3, 0xc, 0x30, 0x9b, 0x10, + 0x0, 0x5f, 0x44, 0x0, 0xc, 0x30, 0x5, 0x20, + 0x8, 0xd5, 0xba, 0x40, 0x3, 0x0, 0x0, 0x20, + 0x2e, 0x10, 0x5, 0xbf, 0xfe, 0xef, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9069 "適" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0xb, 0x50, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0x3, 0xe5, 0x3d, 0xdf, 0xed, 0xde, 0xfe, 0xd5, + 0x0, 0x3f, 0x10, 0xc, 0x60, 0x8, 0xb0, 0x0, + 0x0, 0x2, 0x2, 0x27, 0xb2, 0x3e, 0x52, 0x20, + 0x0, 0x0, 0xb, 0xca, 0xad, 0xca, 0xac, 0xc0, + 0x1, 0x11, 0xb, 0x45, 0x59, 0x85, 0x43, 0xc0, + 0x2c, 0xde, 0xb, 0x44, 0x49, 0x84, 0x43, 0xc0, + 0x0, 0x1e, 0xb, 0x40, 0xac, 0xca, 0x3, 0xc0, + 0x0, 0x1e, 0xb, 0x40, 0xd0, 0xd, 0x3, 0xc0, + 0x0, 0x1e, 0xb, 0x40, 0xe8, 0x8e, 0x3, 0xc0, + 0x0, 0x1e, 0xb, 0x40, 0xd3, 0x34, 0x25, 0xc0, + 0x0, 0x9e, 0x78, 0x30, 0x0, 0x2, 0xcb, 0x50, + 0xa, 0x90, 0x8c, 0x51, 0x0, 0x0, 0x1, 0x22, + 0x1c, 0x0, 0x2, 0x9c, 0xee, 0xee, 0xed, 0xd6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9078 "選" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0x70, 0xe, 0xbb, 0xf2, 0xdc, 0xbc, 0xd0, + 0x2, 0xe6, 0xe, 0x0, 0xc2, 0xd0, 0x0, 0xd0, + 0x0, 0x3f, 0x2e, 0xcc, 0xe2, 0xdc, 0xcc, 0xc0, + 0x0, 0x2, 0xe, 0x0, 0x23, 0xd0, 0x0, 0x43, + 0x0, 0x0, 0xa, 0xcc, 0xd4, 0x9d, 0xcc, 0xc2, + 0x4, 0x44, 0x0, 0x7, 0x20, 0xa, 0x10, 0x0, + 0x7, 0x8f, 0x9, 0xcf, 0xdc, 0xcf, 0xdc, 0x90, + 0x0, 0x1f, 0x0, 0xb, 0x40, 0xf, 0x30, 0x0, + 0x0, 0x1f, 0x0, 0xb, 0x40, 0xf, 0x20, 0x0, + 0x0, 0x1f, 0x5d, 0xdd, 0xdd, 0xdd, 0xdd, 0xd5, + 0x0, 0x1f, 0x0, 0x1b, 0x70, 0x2c, 0x71, 0x0, + 0x0, 0x2f, 0x36, 0xd5, 0x0, 0x0, 0x6d, 0x70, + 0x5, 0xe7, 0xbc, 0x50, 0x0, 0x0, 0x1, 0x31, + 0x1e, 0x30, 0x4, 0xae, 0xfe, 0xee, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + + /* U+907F "避" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x60, 0x0, + 0x8, 0x80, 0xa, 0xed, 0xf3, 0x2, 0xc0, 0x0, + 0x1, 0xe4, 0xa, 0x30, 0xb4, 0x23, 0xe4, 0x21, + 0x0, 0x4d, 0xb, 0x30, 0xb6, 0xbb, 0xbb, 0xb4, + 0x0, 0x6, 0xb, 0x30, 0xb3, 0x49, 0x6, 0x90, + 0x0, 0x0, 0xc, 0xee, 0xe3, 0xe, 0xc, 0x20, + 0x0, 0x0, 0xd, 0x10, 0x3, 0x9a, 0x9e, 0x94, + 0xe, 0xfe, 0xf, 0x21, 0x13, 0x66, 0xe7, 0x63, + 0x0, 0x1e, 0x2f, 0xd9, 0xc6, 0x0, 0xd1, 0x0, + 0x0, 0x1e, 0x6b, 0xa0, 0x78, 0xee, 0xfe, 0xe4, + 0x0, 0x1e, 0xc5, 0xa0, 0x76, 0x0, 0xd1, 0x0, + 0x0, 0x1e, 0x62, 0xa0, 0x76, 0x0, 0xd1, 0x0, + 0x0, 0x4f, 0x41, 0xdd, 0xd5, 0x0, 0xd1, 0x0, + 0x7, 0xe6, 0xca, 0x40, 0x0, 0x0, 0x0, 0x11, + 0x1e, 0x20, 0x6, 0xbe, 0xed, 0xee, 0xef, 0xf7, + 0x1, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+9084 "還" */ + 0x1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xd1, 0xd, 0xbb, 0xfb, 0xbe, 0xbd, 0x60, + 0x0, 0x7b, 0xd, 0x10, 0xc0, 0x2b, 0x8, 0x60, + 0x0, 0xa, 0x3d, 0xbb, 0xfb, 0xce, 0xbd, 0x60, + 0x0, 0x0, 0x23, 0x33, 0x33, 0x33, 0x33, 0x31, + 0x2, 0x22, 0x58, 0x88, 0x88, 0x88, 0x88, 0x82, + 0x3d, 0xde, 0x3, 0xbb, 0xbb, 0xbb, 0xba, 0x0, + 0x0, 0x1e, 0x5, 0xd0, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x1e, 0x5, 0xd1, 0x11, 0x11, 0x3e, 0x0, + 0x0, 0x1e, 0x3, 0x99, 0xcf, 0x99, 0x9b, 0x10, + 0x0, 0x1e, 0x1, 0x5c, 0xd1, 0x89, 0x9a, 0x10, + 0x0, 0x1e, 0x3c, 0x75, 0xb0, 0x5, 0xd5, 0x0, + 0x0, 0x7f, 0x20, 0x8, 0xec, 0xc1, 0x1a, 0x80, + 0xb, 0xa5, 0xd8, 0x28, 0x40, 0x0, 0x1, 0x32, + 0x4d, 0x0, 0x17, 0xdf, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, 0x0, + + /* U+908A "邊" */ + 0x4, 0x60, 0x0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0x2, 0xe5, 0x0, 0xf9, 0x99, 0x99, 0xad, 0x0, + 0x0, 0x4f, 0x30, 0xf8, 0x88, 0x88, 0x9d, 0x0, + 0x0, 0x8, 0x50, 0xf3, 0x33, 0x33, 0x5d, 0x0, + 0x0, 0x0, 0x0, 0xf9, 0x99, 0x99, 0xad, 0x0, + 0x0, 0x0, 0x0, 0xf8, 0x77, 0x77, 0x9d, 0x0, + 0x3d, 0xdc, 0x0, 0x33, 0x3d, 0x83, 0x33, 0x0, + 0x13, 0x5e, 0x3e, 0x9a, 0xa9, 0x9b, 0x99, 0xf1, + 0x0, 0x1e, 0x27, 0x4b, 0x45, 0x19, 0xa1, 0x81, + 0x0, 0x1e, 0x16, 0xd6, 0x5c, 0x95, 0x9a, 0x51, + 0x0, 0x1e, 0x15, 0x56, 0xf5, 0x55, 0x55, 0x51, + 0x0, 0x1e, 0x0, 0x9, 0xca, 0xaa, 0xd4, 0x0, + 0x0, 0x7f, 0x15, 0xb9, 0x0, 0x0, 0xc0, 0x0, + 0xb, 0xa4, 0xcd, 0x50, 0x0, 0xaa, 0x51, 0x22, + 0x4c, 0x0, 0x6, 0xcf, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+90A3 "那" */ + 0x2f, 0xff, 0xff, 0xff, 0xd, 0xee, 0xee, 0xb0, + 0x0, 0xb5, 0x1, 0xf0, 0xe2, 0x11, 0xb7, 0x0, + 0xc, 0x40, 0x1f, 0xe, 0x10, 0x2e, 0x0, 0x0, + 0xc4, 0x1, 0xe0, 0xe1, 0x9, 0x80, 0xe, 0xff, + 0xff, 0xfe, 0xe, 0x11, 0xe1, 0x0, 0x0, 0xd2, + 0x2, 0xe0, 0xe1, 0x8a, 0x0, 0x0, 0xf, 0x10, + 0x2e, 0xe, 0x10, 0xc6, 0x0, 0x1, 0xf0, 0x3, + 0xe0, 0xe1, 0x1, 0xd2, 0x1e, 0xff, 0xee, 0xfe, + 0xe, 0x10, 0x7, 0x90, 0x6, 0x90, 0x3, 0xd0, + 0xe1, 0x0, 0x4b, 0x0, 0xb4, 0x0, 0x4d, 0xe, + 0x21, 0x19, 0x90, 0x2f, 0x0, 0x5, 0xc0, 0xe3, + 0xee, 0xa1, 0xb, 0x70, 0x21, 0xaa, 0xe, 0x10, + 0x0, 0x2, 0xd0, 0xd, 0xfe, 0x30, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, + + /* U+90AA "邪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0x89, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x4, 0xb0, 0x9, 0x60, 0x8, 0xa0, + 0x0, 0xf0, 0x4, 0xb0, 0x9, 0x60, 0xe, 0x40, + 0x2, 0xd0, 0x4, 0xb0, 0x9, 0x60, 0x5c, 0x0, + 0x4, 0xb0, 0x4, 0xb0, 0x9, 0x60, 0xc5, 0x0, + 0x6, 0xa1, 0x15, 0xb1, 0x9, 0x63, 0xd0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0x99, 0x62, 0xd4, 0x0, + 0x0, 0x0, 0x5f, 0xb0, 0x9, 0x60, 0x1e, 0x20, + 0x0, 0x2, 0xe7, 0xb0, 0x9, 0x60, 0x6, 0xa0, + 0x0, 0xd, 0x54, 0xb0, 0x9, 0x60, 0x2, 0xe0, + 0x0, 0xc7, 0x4, 0xb0, 0x9, 0x60, 0x5, 0xd0, + 0x2d, 0x60, 0x4, 0xb0, 0x9, 0x6a, 0xff, 0x50, + 0x35, 0x0, 0x6, 0xb0, 0x9, 0x61, 0x10, 0x0, + 0x0, 0x8, 0xfe, 0x60, 0x9, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+90E8 "部" */ + 0x0, 0x0, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x98, 0x0, 0x0, 0xef, 0xff, 0xe0, + 0x7, 0xbb, 0xde, 0xbb, 0x90, 0xe0, 0x6, 0xb0, + 0x2, 0x87, 0x44, 0x4b, 0x30, 0xe0, 0xb, 0x50, + 0x0, 0x6a, 0x0, 0x4c, 0x0, 0xe0, 0x1e, 0x0, + 0x0, 0xf, 0x0, 0xa6, 0x0, 0xe0, 0x69, 0x0, + 0x0, 0x9, 0x31, 0xe1, 0x0, 0xe0, 0xc3, 0x0, + 0x2e, 0xee, 0xee, 0xee, 0xe3, 0xe0, 0x7b, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0, 0xa, 0x60, + 0x2, 0xee, 0xee, 0xee, 0x60, 0xe0, 0x4, 0xb0, + 0x3, 0xd1, 0x11, 0x1a, 0x60, 0xe0, 0x1, 0xe0, + 0x3, 0xc0, 0x0, 0x9, 0x60, 0xe2, 0x49, 0xb0, + 0x3, 0xc0, 0x0, 0x9, 0x60, 0xe3, 0xb9, 0x20, + 0x3, 0xfd, 0xdd, 0xde, 0x60, 0xe0, 0x0, 0x0, + 0x2, 0xc2, 0x22, 0x2a, 0x60, 0xe0, 0x0, 0x0, + + /* U+90F5 "郵" */ + 0x0, 0x0, 0x0, 0x25, 0x80, 0x0, 0x0, 0x0, + 0x7, 0xbc, 0xef, 0xc9, 0x61, 0xef, 0xff, 0xf4, + 0x3, 0x42, 0x4b, 0x0, 0x0, 0xe1, 0x1, 0xf1, + 0x0, 0x0, 0x4b, 0x0, 0x0, 0xe1, 0x6, 0xa0, + 0xa, 0xfe, 0xff, 0xef, 0xe5, 0xe1, 0xc, 0x40, + 0x0, 0xa3, 0x4b, 0xb, 0x20, 0xe1, 0x2e, 0x0, + 0x0, 0xa3, 0x4b, 0xb, 0x20, 0xe1, 0x88, 0x0, + 0x1e, 0xff, 0xff, 0xef, 0xe8, 0xe1, 0x2d, 0x20, + 0x0, 0xa3, 0x4b, 0xb, 0x20, 0xe1, 0x6, 0xb0, + 0x0, 0xa3, 0x4b, 0xb, 0x20, 0xe1, 0x0, 0xf0, + 0xb, 0xee, 0xef, 0xee, 0xe5, 0xe1, 0x0, 0xd3, + 0x0, 0x0, 0x4b, 0x0, 0x0, 0xe1, 0x1, 0xe2, + 0x0, 0x0, 0x4b, 0x13, 0x53, 0xe2, 0xff, 0xa0, + 0x8, 0x9b, 0xdf, 0xdb, 0x94, 0xe1, 0x0, 0x0, + 0x6, 0x43, 0x10, 0x0, 0x0, 0xe1, 0x0, 0x0, + + /* U+90FD "都" */ + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf0, 0x2, 0xd5, 0xff, 0xff, 0xf2, + 0x6, 0xbb, 0xfb, 0xbb, 0x54, 0xc0, 0x4, 0xe0, + 0x1, 0x33, 0xf3, 0x7b, 0x4, 0xc0, 0xa, 0x70, + 0x0, 0x0, 0xf1, 0xd3, 0x4, 0xc0, 0x1e, 0x0, + 0x3b, 0xbc, 0xfd, 0xfb, 0xb4, 0xc0, 0x88, 0x0, + 0x13, 0x33, 0xda, 0x33, 0x34, 0xc0, 0xf2, 0x0, + 0x0, 0xb, 0xc0, 0x0, 0x4, 0xc0, 0x7c, 0x0, + 0x3, 0xdf, 0xee, 0xef, 0x34, 0xc0, 0x9, 0x90, + 0x5f, 0xe6, 0x0, 0xc, 0x34, 0xc0, 0x1, 0xf0, + 0x13, 0x88, 0x22, 0x2d, 0x34, 0xc0, 0x0, 0xe2, + 0x0, 0x8d, 0xbb, 0xbf, 0x34, 0xc0, 0x1, 0xf0, + 0x0, 0x86, 0x0, 0xc, 0x34, 0xc4, 0xcd, 0x60, + 0x0, 0x8f, 0xee, 0xef, 0x34, 0xc0, 0x0, 0x0, + 0x0, 0x86, 0x0, 0xc, 0x34, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+914D "配" */ + 0x1, 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xdf, 0xdf, 0xdd, 0x2f, 0xff, 0xff, 0xe0, + 0x0, 0xb, 0x1c, 0x0, 0x0, 0x0, 0x2, 0xe0, + 0x0, 0xb, 0x1c, 0x0, 0x0, 0x0, 0x1, 0xe0, + 0x9, 0xef, 0xff, 0xea, 0x0, 0x0, 0x1, 0xe0, + 0x9, 0x39, 0xa, 0x2b, 0x0, 0x0, 0x1, 0xe0, + 0x9, 0x39, 0xa, 0x2b, 0xb, 0xbb, 0xbb, 0xe0, + 0x9, 0x3a, 0xa, 0x2b, 0xf, 0x55, 0x56, 0xe0, + 0x9, 0x89, 0xc, 0xbb, 0xf, 0x0, 0x0, 0x20, + 0x9, 0x80, 0x0, 0x2b, 0xf, 0x0, 0x0, 0x0, + 0x9, 0x62, 0x22, 0x5b, 0xf, 0x0, 0x0, 0x0, + 0x9, 0xba, 0xaa, 0xbb, 0xf, 0x0, 0x0, 0x21, + 0x9, 0x30, 0x0, 0x2b, 0xf, 0x0, 0x0, 0x87, + 0x9, 0xed, 0xdd, 0xeb, 0xf, 0x20, 0x0, 0xc5, + 0x9, 0x30, 0x0, 0x2a, 0xa, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9152 "酒" */ + 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xf7, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x5d, 0x0, 0x2, 0xc0, 0x95, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xc0, 0x95, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xc0, 0x96, 0x0, 0x0, + 0x25, 0x0, 0xf, 0xee, 0xfe, 0xff, 0xef, 0x70, + 0x2b, 0xd4, 0xf, 0x1, 0xc0, 0x93, 0x9, 0x70, + 0x0, 0x43, 0xf, 0x5, 0xa0, 0x94, 0x9, 0x70, + 0x0, 0x0, 0xf, 0x4e, 0x30, 0x6e, 0xdf, 0x70, + 0x0, 0x8, 0xf, 0x93, 0x0, 0x0, 0x9, 0x70, + 0x0, 0x5d, 0xf, 0x32, 0x22, 0x22, 0x2a, 0x70, + 0x0, 0xd6, 0xf, 0xcc, 0xcc, 0xcc, 0xce, 0x70, + 0x5, 0xd0, 0xf, 0x0, 0x0, 0x0, 0x9, 0x70, + 0xe, 0x50, 0xf, 0xbb, 0xbb, 0xbb, 0xbe, 0x70, + 0x18, 0x0, 0xf, 0x43, 0x33, 0x33, 0x3a, 0x60, + + /* U+9154 "酔" */ + 0x1e, 0xef, 0xef, 0xe9, 0x0, 0xe1, 0x0, 0x0, + 0x0, 0xc, 0x29, 0x0, 0xdd, 0xfd, 0xdb, 0x0, + 0x0, 0xc, 0x29, 0x0, 0x25, 0xd2, 0x4d, 0x0, + 0xa, 0xcf, 0xde, 0xc6, 0x7, 0x90, 0x1d, 0x4, + 0xc, 0x3a, 0x48, 0x77, 0xc, 0x40, 0x1d, 0xc, + 0xc, 0x1a, 0x37, 0x68, 0x9d, 0x0, 0xe, 0xb9, + 0xc, 0x1a, 0x37, 0x6a, 0xd2, 0xe, 0x20, 0x20, + 0xc, 0x86, 0xa, 0xd7, 0x0, 0xf, 0x20, 0x0, + 0xc, 0x80, 0x0, 0x68, 0x0, 0xf, 0x30, 0x0, + 0xc, 0x43, 0x33, 0x8a, 0xff, 0xff, 0xff, 0xfb, + 0xc, 0xba, 0xaa, 0xc8, 0x0, 0xf, 0x30, 0x0, + 0xc, 0x10, 0x0, 0x67, 0x0, 0xf, 0x20, 0x0, + 0xc, 0xed, 0xdd, 0xe7, 0x0, 0xf, 0x20, 0x0, + 0xc, 0x10, 0x0, 0x67, 0x0, 0xf, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9178 "酸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, 0x0, + 0x1e, 0xef, 0xff, 0xe6, 0x0, 0xe5, 0x83, 0x0, + 0x0, 0x1a, 0x57, 0x0, 0x9, 0xa0, 0x5d, 0x0, + 0x0, 0x1a, 0x57, 0x0, 0x7f, 0x33, 0x4e, 0x80, + 0xb, 0xff, 0xff, 0xe3, 0xab, 0x97, 0x65, 0xe0, + 0xc, 0x9, 0x54, 0xa3, 0x3, 0xb0, 0x87, 0x0, + 0xc, 0x9, 0x54, 0xa3, 0x1d, 0x40, 0xc, 0x50, + 0xc, 0x28, 0x54, 0xa4, 0xc7, 0x53, 0x1, 0xe2, + 0xc, 0x94, 0x49, 0xc5, 0x81, 0xf2, 0x0, 0x42, + 0xc, 0x70, 0x3, 0xb3, 0xb, 0xed, 0xdf, 0x80, + 0xc, 0x32, 0x22, 0xb3, 0xaf, 0x80, 0x2e, 0x10, + 0xc, 0xaa, 0xaa, 0xd6, 0xb1, 0xd4, 0xc7, 0x0, + 0xc, 0x0, 0x0, 0xa3, 0x0, 0x4f, 0xb0, 0x0, + 0xc, 0xed, 0xdd, 0xf3, 0x17, 0xd7, 0xc9, 0x20, + 0xc, 0x0, 0x0, 0xa8, 0xd7, 0x10, 0x6, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+91AB "醫" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x7, 0xdc, 0xdb, 0xbb, 0x18, 0xdb, 0xe3, 0x0, + 0x7, 0x6a, 0xb7, 0x74, 0xc, 0x20, 0xa4, 0x10, + 0x7, 0x9a, 0x3d, 0x32, 0xa8, 0x0, 0x4b, 0x90, + 0x7, 0x9a, 0xbe, 0xaa, 0x3b, 0xbb, 0xdb, 0x0, + 0x7, 0x60, 0xaa, 0x90, 0xc, 0x83, 0xc1, 0x0, + 0x7, 0x7b, 0x61, 0x57, 0x2, 0xcf, 0xc2, 0x0, + 0x4, 0x99, 0x99, 0x99, 0x8b, 0x40, 0x4c, 0x20, + 0x6c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc0, + 0x0, 0x23, 0x33, 0xc6, 0x3e, 0x33, 0x32, 0x0, + 0x0, 0xc9, 0x78, 0xf8, 0x7f, 0x77, 0x9c, 0x0, + 0x0, 0xc6, 0x9c, 0x50, 0xc, 0xa9, 0xbc, 0x0, + 0x0, 0xc9, 0x96, 0x66, 0x66, 0x66, 0x8c, 0x0, + 0x0, 0xc7, 0x55, 0x55, 0x55, 0x55, 0x7c, 0x0, + 0x0, 0xcc, 0xaa, 0xaa, 0xaa, 0xaa, 0xcc, 0x0, + + /* U+91CD "重" */ + 0x0, 0x0, 0x0, 0x1, 0x23, 0x57, 0x91, 0x0, + 0x0, 0x9e, 0xee, 0xde, 0xda, 0x97, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xd, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0xd1, + 0x1, 0x11, 0x11, 0x1a, 0x81, 0x11, 0x11, 0x10, + 0x0, 0x5c, 0xcc, 0xce, 0xec, 0xcc, 0xc7, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x70, 0x0, 0x88, 0x0, + 0x0, 0x6e, 0xbb, 0xbe, 0xdb, 0xbb, 0xe8, 0x0, + 0x0, 0x69, 0x0, 0x9, 0x70, 0x0, 0x88, 0x0, + 0x0, 0x6e, 0xbb, 0xbe, 0xdb, 0xbb, 0xd8, 0x0, + 0x0, 0x1, 0x11, 0x1a, 0x81, 0x11, 0x10, 0x0, + 0x0, 0xbb, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0x10, + 0x0, 0x22, 0x22, 0x2a, 0x92, 0x22, 0x22, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x2e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe2, + + /* U+91CE "野" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xee, 0xfe, 0xef, 0x7f, 0xff, 0xff, 0xe0, + 0xc, 0x10, 0xd1, 0xd, 0x10, 0x0, 0xd, 0x70, + 0xc, 0x10, 0xd1, 0xd, 0x14, 0x50, 0xab, 0x0, + 0xc, 0xed, 0xfe, 0xdf, 0x12, 0xcc, 0xc0, 0x0, + 0xc, 0x10, 0xd1, 0xd, 0x10, 0x9, 0xd1, 0x0, + 0xc, 0x10, 0xd1, 0xd, 0x45, 0x55, 0xcc, 0x51, + 0xb, 0xee, 0xfe, 0xee, 0x7b, 0xbf, 0xcb, 0xf4, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe, 0x11, 0xe0, + 0x1, 0x11, 0xe3, 0x11, 0x0, 0xe, 0x16, 0x90, + 0xb, 0xdd, 0xfe, 0xdd, 0x10, 0xe, 0x16, 0x20, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x0, 0xe4, 0x46, 0x40, 0xe, 0x10, 0x0, + 0x3a, 0xce, 0xdb, 0x97, 0x30, 0x1f, 0x10, 0x0, + 0x14, 0x20, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + + /* U+91CF "量" */ + 0x0, 0x2f, 0xaa, 0xaa, 0xaa, 0xaa, 0xf2, 0x0, + 0x0, 0x2e, 0x55, 0x55, 0x55, 0x55, 0xf2, 0x0, + 0x0, 0x2e, 0x44, 0x44, 0x44, 0x44, 0xf2, 0x0, + 0x0, 0x2f, 0xaa, 0xaa, 0xaa, 0xaa, 0xf2, 0x0, + 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x18, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x81, + 0x0, 0x4b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x0, + 0x0, 0x68, 0x0, 0x8, 0x70, 0x0, 0x6a, 0x0, + 0x0, 0x6d, 0xaa, 0xad, 0xda, 0xaa, 0xca, 0x0, + 0x0, 0x6b, 0x55, 0x5b, 0xa5, 0x55, 0xaa, 0x0, + 0x0, 0x24, 0x44, 0x4a, 0xa4, 0x44, 0x43, 0x0, + 0x0, 0xbc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, + 0x3d, 0xdd, 0xdd, 0xde, 0xed, 0xdd, 0xdd, 0xd3, + + /* U+91D1 "金" */ + 0x0, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1e, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xe7, 0x7d, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0x60, 0x5, 0xe6, 0x0, 0x0, + 0x0, 0x4d, 0xd3, 0x0, 0x0, 0x2c, 0xd4, 0x0, + 0x3d, 0xe8, 0xdc, 0xcc, 0xcc, 0xcd, 0x8e, 0xd3, + 0x6, 0x0, 0x33, 0x3b, 0xa3, 0x33, 0x0, 0x50, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x1a, 0x91, 0x11, 0x11, 0x0, + 0x2, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x30, + 0x0, 0x5, 0x20, 0x9, 0x80, 0x4, 0x50, 0x0, + 0x0, 0x5, 0xc0, 0x9, 0x80, 0xc, 0x50, 0x0, + 0x0, 0x0, 0xc4, 0x9, 0x80, 0x6b, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x9, 0x80, 0x71, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + + /* U+91DD "針" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xf1, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0xd, 0xcc, 0x20, 0x0, 0x2e, 0x0, 0x0, + 0x1, 0xc9, 0x6, 0xe4, 0x0, 0x2e, 0x0, 0x0, + 0x1d, 0xc1, 0x11, 0x56, 0x0, 0x2e, 0x0, 0x0, + 0x8, 0xbd, 0xfc, 0xa0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x7, 0xcc, 0xdf, 0xcc, 0xc3, + 0xb, 0xcc, 0xfc, 0xc4, 0x0, 0x2e, 0x0, 0x0, + 0x2, 0x24, 0xe2, 0x31, 0x0, 0x2e, 0x0, 0x0, + 0x4, 0x61, 0xd0, 0xd0, 0x0, 0x2e, 0x0, 0x0, + 0x1, 0xb1, 0xd2, 0xa0, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0xd1, 0xd7, 0x50, 0x0, 0x2e, 0x0, 0x0, + 0x0, 0x21, 0xe6, 0x95, 0x0, 0x2e, 0x0, 0x0, + 0x9, 0xce, 0xc8, 0x51, 0x0, 0x2e, 0x0, 0x0, + 0x5, 0x20, 0x0, 0x0, 0x0, 0x2e, 0x0, 0x0, + + /* U+9244 "鉄" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xd0, 0x0, 0x23, 0x2e, 0x0, 0x0, + 0x0, 0xd, 0xd9, 0x0, 0x89, 0x2e, 0x0, 0x0, + 0x1, 0xc7, 0x8, 0xc1, 0xb9, 0x5f, 0x33, 0x30, + 0x1d, 0xa1, 0x11, 0x72, 0xfb, 0xcf, 0xbb, 0xb0, + 0x7, 0xad, 0xfc, 0x57, 0xb0, 0x2e, 0x0, 0x0, + 0x0, 0x1, 0xb0, 0x9, 0x40, 0x2e, 0x0, 0x0, + 0x4, 0x57, 0xd5, 0x50, 0x11, 0x3e, 0x11, 0x10, + 0x7, 0x9a, 0xe9, 0x88, 0xff, 0xff, 0xff, 0xf5, + 0x1, 0x31, 0xb1, 0x60, 0x0, 0x7f, 0x10, 0x0, + 0x1, 0xb1, 0xb4, 0x80, 0x0, 0xbe, 0x60, 0x0, + 0x0, 0xc2, 0xb8, 0x30, 0x3, 0xf4, 0xc0, 0x0, + 0x0, 0x62, 0xb5, 0x40, 0x1d, 0x60, 0xb5, 0x0, + 0x3, 0x6a, 0xfd, 0x93, 0xd9, 0x0, 0x3f, 0x40, + 0xb, 0x84, 0x10, 0x5f, 0x70, 0x0, 0x5, 0xf5, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x20, + + /* U+925B "鉛" */ + 0x0, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xe3, 0x0, 0x3f, 0xff, 0xfd, 0x0, + 0x0, 0x6b, 0x5e, 0x40, 0x3c, 0x0, 0x1d, 0x0, + 0x4, 0xe1, 0x3, 0xf4, 0x4b, 0x0, 0x1d, 0x0, + 0x3f, 0x71, 0x11, 0x52, 0x69, 0x0, 0x1d, 0x0, + 0x16, 0xcd, 0xec, 0x50, 0xb5, 0x0, 0x1d, 0x0, + 0x0, 0x4, 0xa0, 0x5, 0xd0, 0x0, 0xe, 0x74, + 0x8, 0x9b, 0xd9, 0x9b, 0x20, 0x0, 0x2, 0x52, + 0x2, 0x27, 0xb3, 0x30, 0xcd, 0xdd, 0xdd, 0x70, + 0x7, 0x34, 0xa2, 0xb0, 0xe2, 0x11, 0x17, 0x90, + 0x5, 0x84, 0xa6, 0x70, 0xe0, 0x0, 0x6, 0x90, + 0x2, 0xb4, 0xaa, 0x10, 0xe0, 0x0, 0x6, 0x90, + 0x0, 0x25, 0xc6, 0x91, 0xe0, 0x0, 0x6, 0x90, + 0x1a, 0xde, 0xb8, 0x40, 0xee, 0xee, 0xee, 0x90, + 0x5, 0x20, 0x0, 0x0, 0xe1, 0x0, 0x6, 0x80, + + /* U+9280 "銀" */ + 0x0, 0x2, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xd1, 0x1, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x6b, 0x7d, 0x11, 0xe0, 0x0, 0xb, 0x40, + 0x5, 0xe1, 0x8, 0xd2, 0xe0, 0x0, 0xb, 0x40, + 0x3f, 0x51, 0x11, 0x71, 0xf8, 0x88, 0x8e, 0x40, + 0x7, 0xde, 0xed, 0x11, 0xf7, 0x77, 0x7d, 0x40, + 0x0, 0x8, 0x60, 0x1, 0xe0, 0x0, 0xb, 0x40, + 0xc, 0xce, 0xdc, 0x81, 0xfe, 0xee, 0xef, 0x40, + 0x3, 0x3a, 0x83, 0x21, 0xe0, 0x87, 0x1, 0x20, + 0x6, 0x48, 0x67, 0x61, 0xe0, 0x3c, 0xa, 0xa0, + 0x4, 0x98, 0x6b, 0x11, 0xe0, 0xd, 0xd8, 0x0, + 0x1, 0xc8, 0x6b, 0x1, 0xe0, 0x6, 0xc0, 0x0, + 0x0, 0x28, 0x98, 0x91, 0xe0, 0x3, 0xc7, 0x0, + 0x1a, 0xee, 0xb7, 0x34, 0xfb, 0xe8, 0x2e, 0x90, + 0x6, 0x20, 0x0, 0xa, 0xa5, 0x0, 0x2, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9322 "錢" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x60, 0x0, 0xa, 0x44, 0xb3, 0x0, + 0x0, 0x4e, 0xd3, 0x0, 0x8, 0x70, 0x29, 0x20, + 0x3, 0xd2, 0x3d, 0x66, 0xbd, 0xfd, 0xdc, 0xb1, + 0x3e, 0x61, 0x13, 0x72, 0x21, 0xd2, 0x5a, 0x0, + 0x28, 0xce, 0xdc, 0x0, 0x0, 0x7d, 0xa0, 0x30, + 0x0, 0x9, 0x30, 0x5, 0x9b, 0x98, 0xb5, 0xc2, + 0xc, 0xce, 0xdc, 0x64, 0x3a, 0x3, 0x66, 0x40, + 0x2, 0x2a, 0x63, 0x10, 0xd, 0x13, 0x9c, 0x0, + 0x9, 0x9, 0x3a, 0x21, 0x2c, 0x87, 0x8a, 0xb3, + 0x7, 0x49, 0x4c, 0x9, 0xbb, 0xd6, 0x59, 0x30, + 0x4, 0x89, 0x59, 0x0, 0x0, 0xe2, 0xb9, 0x0, + 0x0, 0x19, 0x78, 0x50, 0x0, 0x9f, 0x70, 0x32, + 0x1a, 0xed, 0x95, 0x11, 0x7d, 0xab, 0x91, 0x85, + 0x4, 0x10, 0x0, 0xc, 0x81, 0x0, 0x8d, 0xd1, + + /* U+932F "錯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x70, 0x0, 0x2b, 0x0, 0xc3, 0x0, + 0x0, 0x4e, 0xd4, 0x0, 0x3c, 0x0, 0xc3, 0x0, + 0x3, 0xd2, 0x2d, 0x7a, 0xef, 0xee, 0xff, 0x80, + 0x3f, 0x72, 0x23, 0x60, 0x2b, 0x0, 0xc3, 0x0, + 0x16, 0xad, 0xca, 0x0, 0x3c, 0x0, 0xc3, 0x0, + 0x0, 0x9, 0x40, 0xe, 0xee, 0xee, 0xee, 0xe0, + 0x9, 0x9d, 0xb9, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x3a, 0x73, 0x10, 0xee, 0xee, 0xee, 0x10, + 0x8, 0x9, 0x48, 0x30, 0xe0, 0x0, 0xe, 0x10, + 0x7, 0x49, 0x4b, 0x0, 0xe0, 0x0, 0xe, 0x10, + 0x4, 0x79, 0x5b, 0x0, 0xfe, 0xee, 0xef, 0x10, + 0x1, 0x49, 0x55, 0x20, 0xe0, 0x0, 0xe, 0x10, + 0x3, 0x7d, 0xfd, 0x50, 0xf2, 0x22, 0x2e, 0x10, + 0x1b, 0x74, 0x0, 0x0, 0xfb, 0xbb, 0xbe, 0x10, + + /* U+9332 "録" */ + 0x0, 0x5, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x90, 0x9, 0xee, 0xee, 0xef, 0x10, + 0x0, 0x89, 0xba, 0x0, 0x0, 0x0, 0xd, 0x10, + 0x6, 0xd0, 0xb, 0x90, 0x22, 0x22, 0x2e, 0x10, + 0x4f, 0x51, 0x12, 0x64, 0xdd, 0xdd, 0xdf, 0x10, + 0x28, 0xce, 0xdc, 0x0, 0x0, 0x0, 0xd, 0x10, + 0x0, 0x9, 0x30, 0x2b, 0xbb, 0xcb, 0xbf, 0xc2, + 0xc, 0xce, 0xdc, 0x62, 0x0, 0xb3, 0x0, 0x20, + 0x2, 0x2a, 0x63, 0x1a, 0x70, 0xb3, 0x8, 0xc0, + 0x8, 0x9, 0x3a, 0x20, 0xc4, 0xb9, 0xa9, 0x0, + 0x7, 0x49, 0x4c, 0x0, 0x16, 0xfe, 0x90, 0x0, + 0x4, 0x79, 0x69, 0x0, 0xab, 0xd4, 0xd5, 0x0, + 0x0, 0x19, 0x78, 0x8d, 0x80, 0xb3, 0x2d, 0xa1, + 0x1a, 0xde, 0xa6, 0x44, 0x0, 0xc3, 0x0, 0x82, + 0x5, 0x20, 0x0, 0x0, 0x3e, 0xd1, 0x0, 0x0, + + /* U+9577 "長" */ + 0x0, 0x4, 0xfe, 0xee, 0xee, 0xee, 0xe8, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xd2, 0x22, 0x22, 0x22, 0x20, 0x0, + 0x0, 0x4, 0xfb, 0xbb, 0xbb, 0xbb, 0xb1, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xfe, 0xee, 0xee, 0xee, 0xe1, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xee, 0xfe, 0xee, 0xee, 0xee, 0xee, 0xe2, + 0x0, 0x8, 0x90, 0x8, 0xa1, 0x0, 0x2a, 0x20, + 0x0, 0x7, 0x90, 0x0, 0xe6, 0x6, 0xd6, 0x0, + 0x0, 0x7, 0x90, 0x0, 0x3e, 0xc9, 0x10, 0x0, + 0x0, 0x7, 0x90, 0x2, 0x64, 0xe9, 0x10, 0x0, + 0x0, 0xc, 0xca, 0xec, 0x80, 0x19, 0xfa, 0x51, + 0x0, 0x1d, 0x95, 0x0, 0x0, 0x0, 0x27, 0xc2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9589 "閉" */ + 0x4f, 0xdd, 0xdf, 0x51, 0xfd, 0xdd, 0xde, 0x4c, + 0x0, 0xa, 0x51, 0xe0, 0x0, 0x2e, 0x4e, 0xaa, + 0xae, 0x51, 0xfa, 0xaa, 0xbe, 0x4c, 0x22, 0x2b, + 0x51, 0xe2, 0x22, 0x4e, 0x4c, 0x0, 0xa, 0x51, + 0xe0, 0x0, 0x2e, 0x4f, 0xdd, 0xdd, 0x41, 0xdd, + 0xdd, 0xde, 0x4c, 0x0, 0x0, 0x3, 0x70, 0x0, + 0x2e, 0x4c, 0x2, 0x22, 0x26, 0xb2, 0x20, 0x2e, + 0x4c, 0xa, 0xbb, 0xbf, 0xeb, 0xb2, 0x2e, 0x4c, + 0x0, 0x0, 0x7e, 0xa0, 0x0, 0x2e, 0x4c, 0x0, + 0x8, 0xb5, 0xa0, 0x0, 0x2e, 0x4c, 0x3, 0xca, + 0x4, 0xa0, 0x0, 0x2e, 0x4c, 0x1d, 0x40, 0x4, + 0xa0, 0x11, 0x5e, 0x4c, 0x0, 0x0, 0xce, 0x70, + 0xef, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+958B "開" */ + 0xce, 0xdd, 0xdf, 0x8, 0xed, 0xdd, 0xf2, 0xc4, + 0x0, 0xf, 0x8, 0x70, 0x0, 0xd2, 0xcc, 0xbb, + 0xbf, 0x8, 0xdb, 0xbb, 0xf2, 0xc5, 0x11, 0x1f, + 0x8, 0x81, 0x11, 0xe2, 0xc4, 0x0, 0xf, 0x8, + 0x70, 0x0, 0xd2, 0xce, 0xdd, 0xdd, 0x7, 0xdd, + 0xdd, 0xf2, 0xc4, 0x1, 0x11, 0x11, 0x11, 0x10, + 0xd2, 0xc4, 0x3c, 0xee, 0xcc, 0xfc, 0x80, 0xd2, + 0xc4, 0x0, 0x77, 0x2, 0xd0, 0x0, 0xd2, 0xc4, + 0x7c, 0xee, 0xcd, 0xfc, 0xc1, 0xd2, 0xc4, 0x1, + 0xa6, 0x13, 0xd1, 0x10, 0xd2, 0xc4, 0x0, 0xe1, + 0x2, 0xd0, 0x0, 0xd2, 0xc4, 0x7, 0xa0, 0x2, + 0xd0, 0x11, 0xe2, 0xc4, 0x2b, 0x10, 0x2, 0xd0, + 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+9593 "間" */ + 0x4f, 0xdd, 0xdf, 0x50, 0xfd, 0xdd, 0xde, 0x4c, + 0x0, 0xa, 0x50, 0xf0, 0x0, 0x2e, 0x4e, 0xaa, + 0xae, 0x50, 0xfa, 0xaa, 0xbe, 0x4c, 0x22, 0x2b, + 0x50, 0xf2, 0x22, 0x4e, 0x4c, 0x0, 0xa, 0x50, + 0xf0, 0x0, 0x2e, 0x4f, 0xdd, 0xdd, 0x40, 0xdd, + 0xdd, 0xde, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0x4c, 0x0, 0xed, 0xdd, 0xdf, 0x20, 0x2e, + 0x4c, 0x0, 0xe1, 0x0, 0xd, 0x20, 0x2e, 0x4c, + 0x0, 0xed, 0xcc, 0xcf, 0x20, 0x2e, 0x4c, 0x0, + 0xe1, 0x0, 0xd, 0x20, 0x2e, 0x4c, 0x0, 0xe1, + 0x0, 0xd, 0x20, 0x2e, 0x4c, 0x0, 0xed, 0xdd, + 0xdd, 0x31, 0x4e, 0x4c, 0x0, 0x80, 0x0, 0x0, + 0xaf, 0xe8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+95A2 "関" */ + 0xce, 0xdd, 0xdf, 0x7, 0xed, 0xdd, 0xf2, 0xc4, + 0x0, 0xf, 0x7, 0x80, 0x0, 0xd2, 0xcd, 0xcc, + 0xcf, 0x7, 0xec, 0xcc, 0xf2, 0xc4, 0x0, 0xf, + 0x7, 0x80, 0x0, 0xd2, 0xc6, 0x22, 0x2f, 0x7, + 0x92, 0x22, 0xe2, 0xcc, 0xaa, 0xba, 0x5, 0xcb, + 0xaa, 0xf2, 0xc4, 0x0, 0xc3, 0x0, 0xc3, 0x0, + 0xd2, 0xc4, 0x2d, 0xee, 0xdd, 0xfd, 0x90, 0xd2, + 0xc4, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xd2, 0xc4, + 0x5b, 0xbb, 0xfc, 0xbb, 0xb0, 0xd2, 0xc4, 0x1, + 0x16, 0xfc, 0x21, 0x10, 0xd2, 0xc4, 0x0, 0x5e, + 0x36, 0xd3, 0x0, 0xd2, 0xc4, 0x3d, 0xa2, 0x0, + 0x3e, 0x10, 0xe2, 0xc4, 0x1, 0x0, 0x0, 0x0, + 0x8f, 0xc0, + + /* U+95DC "關" */ + 0xcd, 0xcc, 0xcf, 0x9, 0xec, 0xcc, 0xf3, 0xc3, + 0x0, 0xf, 0x9, 0x70, 0x0, 0xc3, 0xcc, 0xbb, + 0xbf, 0x9, 0xdb, 0xbb, 0xf3, 0xc3, 0x0, 0xf, + 0x9, 0x70, 0x0, 0xc3, 0xcd, 0xcc, 0xcf, 0x9, + 0xec, 0xcc, 0xf3, 0xc3, 0x3, 0x90, 0x0, 0xc1, + 0x0, 0xc3, 0xc3, 0x1b, 0x1a, 0x9, 0x54, 0x70, + 0xc3, 0xc3, 0x6b, 0xe4, 0x2b, 0xd9, 0x10, 0xc3, + 0xc3, 0x3c, 0x7c, 0x28, 0xa6, 0x90, 0xc3, 0xc3, + 0x47, 0x57, 0x7b, 0x64, 0x70, 0xc3, 0xc3, 0xb, + 0x9, 0x2d, 0x0, 0xb0, 0xc3, 0xc3, 0xe, 0xad, + 0x2d, 0xaa, 0xb0, 0xc3, 0xc3, 0x0, 0x4d, 0xd, + 0x0, 0x61, 0xd3, 0xc3, 0x5, 0xb2, 0xd, 0x0, + 0x1f, 0xc1, + + /* U+95F0 "闰" */ + 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0x80, 0xbf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xd4, + 0x0, 0x0, 0x0, 0x0, 0xc3, 0x10, 0x36, 0x0, + 0x0, 0x0, 0x0, 0xc3, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc3, 0xd3, 0x2e, 0xee, 0xfe, 0xee, + 0xc0, 0xc3, 0xd3, 0x0, 0x0, 0xc4, 0x0, 0x0, + 0xc3, 0xd3, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc3, + 0xd3, 0xb, 0xee, 0xfe, 0xee, 0x40, 0xc3, 0xd3, + 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc3, 0xd3, 0x0, + 0x0, 0xc4, 0x0, 0x0, 0xc3, 0xd3, 0x0, 0x0, + 0xc4, 0x0, 0x0, 0xc3, 0xd3, 0x7e, 0xee, 0xee, + 0xee, 0xe0, 0xc3, 0xd3, 0x0, 0x0, 0x0, 0x0, + 0x11, 0xd3, 0xd3, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xb0, + + /* U+9633 "阳" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0xf2, 0xc3, 0x6, + 0x90, 0xe1, 0x0, 0x0, 0xe2, 0xc3, 0xd, 0x10, + 0xe1, 0x0, 0x0, 0xe2, 0xc3, 0x69, 0x0, 0xe1, + 0x0, 0x0, 0xe2, 0xc3, 0xd4, 0x0, 0xe1, 0x0, + 0x0, 0xe2, 0xc3, 0x4d, 0x10, 0xe1, 0x0, 0x0, + 0xe2, 0xc3, 0x6, 0xa0, 0xef, 0xff, 0xff, 0xf2, + 0xc3, 0x0, 0xe0, 0xe2, 0x0, 0x0, 0xe2, 0xc3, + 0x0, 0xf0, 0xe1, 0x0, 0x0, 0xe2, 0xc7, 0xbe, + 0xa0, 0xe1, 0x0, 0x0, 0xe2, 0xc4, 0x32, 0x0, + 0xe1, 0x0, 0x0, 0xe2, 0xc3, 0x0, 0x0, 0xe2, + 0x0, 0x0, 0xe2, 0xc3, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xf2, 0xc3, 0x0, 0x0, 0xe1, 0x0, 0x0, + 0xc1, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9644 "附" */ + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xf3, 0x2, 0xe0, 0x0, 0x1e, 0x0, 0xd1, + 0xe, 0x0, 0x98, 0x0, 0x1, 0xe0, 0xd, 0x13, + 0xa0, 0x1f, 0x10, 0x0, 0x1e, 0x0, 0xd1, 0x85, + 0xa, 0xe4, 0xee, 0xee, 0xfe, 0x5d, 0x1c, 0x6, + 0xfe, 0x1, 0x11, 0x3e, 0x10, 0xd1, 0x96, 0xf6, + 0xe0, 0x0, 0x1, 0xe0, 0xd, 0x12, 0xd3, 0x1e, + 0xa, 0x40, 0x1e, 0x0, 0xd1, 0xd, 0x11, 0xe0, + 0x3c, 0x1, 0xe0, 0xd, 0x10, 0xc3, 0x1e, 0x0, + 0xc4, 0x1e, 0x0, 0xd2, 0x3e, 0x11, 0xe0, 0x6, + 0x81, 0xe0, 0xd, 0x2c, 0x70, 0x1e, 0x0, 0x0, + 0x1e, 0x0, 0xd1, 0x0, 0x1, 0xe0, 0x0, 0x1, + 0xe0, 0xd, 0x10, 0x0, 0x1e, 0x0, 0x0, 0x3e, + 0x0, 0xd1, 0x0, 0x1, 0xd0, 0x3, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+964D "降" */ + 0x0, 0x0, 0x0, 0x1, 0x90, 0x0, 0x0, 0xd, + 0xff, 0xfa, 0x0, 0x9a, 0x0, 0x0, 0x0, 0xd1, + 0xb, 0x60, 0x5f, 0xdd, 0xdf, 0x90, 0xd, 0x12, + 0xe0, 0x6e, 0xd2, 0x5, 0xd1, 0x0, 0xd1, 0xa8, + 0xb, 0x23, 0xd8, 0xd2, 0x0, 0xd, 0x2f, 0x20, + 0x0, 0x3c, 0xfa, 0x20, 0x0, 0xd1, 0x7b, 0x17, + 0xce, 0x50, 0x7e, 0xc8, 0xd, 0x10, 0xc6, 0xa5, + 0x0, 0xe1, 0x4, 0x70, 0xd1, 0x6, 0x91, 0x33, + 0x3f, 0x43, 0x31, 0xd, 0x10, 0x4b, 0x5b, 0xbb, + 0xfb, 0xbb, 0x40, 0xd3, 0x4a, 0x82, 0x80, 0xe, + 0x10, 0x0, 0xd, 0x4a, 0x80, 0x68, 0x0, 0xe1, + 0x0, 0x0, 0xd1, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xfe, 0xd, 0x10, 0x0, 0x0, 0x0, 0xe1, 0x0, + 0x0, 0xd1, 0x0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x0, + + /* U+9650 "限" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x3b, 0xee, 0xee, 0xee, 0x10, 0x4b, + 0x2, 0xe0, 0xc3, 0x0, 0x0, 0xe1, 0x4, 0xb0, + 0x88, 0xc, 0x30, 0x0, 0xe, 0x10, 0x4b, 0xe, + 0x20, 0xce, 0xee, 0xee, 0xf1, 0x4, 0xb4, 0xd0, + 0xc, 0x30, 0x0, 0xe, 0x10, 0x4b, 0xb, 0x60, + 0xc3, 0x0, 0x0, 0xe1, 0x4, 0xb0, 0x1e, 0xc, + 0xee, 0xee, 0xef, 0x10, 0x4b, 0x0, 0xd1, 0xc4, + 0x1e, 0x10, 0x2, 0x4, 0xb0, 0xd, 0x2c, 0x30, + 0xb5, 0xa, 0xb0, 0x4b, 0x6c, 0xd0, 0xc3, 0x5, + 0xcd, 0x70, 0x4, 0xb1, 0x30, 0xc, 0x30, 0xc, + 0x70, 0x0, 0x4b, 0x0, 0x0, 0xc3, 0x1, 0x3e, + 0x40, 0x4, 0xb0, 0x0, 0xe, 0xbd, 0xe1, 0x4f, + 0x91, 0x4b, 0x0, 0x2, 0xd8, 0x30, 0x0, 0x2b, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9662 "院" */ + 0x0, 0x0, 0x0, 0x0, 0x82, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0x0, 0x9, 0x90, 0x0, 0x0, 0xe1, + 0xe, 0x12, 0x22, 0x5e, 0x32, 0x22, 0xe, 0x13, + 0xa3, 0xfc, 0xcc, 0xcc, 0xcc, 0xf0, 0xe1, 0x74, + 0x3c, 0x0, 0x0, 0x0, 0x2f, 0xe, 0x1b, 0x2, + 0x7b, 0xcc, 0xcc, 0xc7, 0x90, 0xe1, 0x68, 0x0, + 0x22, 0x22, 0x22, 0x10, 0xe, 0x10, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe1, 0xc, 0x5e, 0xee, + 0xee, 0xee, 0xee, 0x1e, 0x10, 0xc3, 0x11, 0xf2, + 0x1f, 0x11, 0x10, 0xe2, 0xbe, 0x0, 0x1f, 0x0, + 0xf0, 0x0, 0xe, 0x13, 0x10, 0x6, 0xb0, 0xf, + 0x0, 0x0, 0xe1, 0x0, 0x1, 0xd4, 0x0, 0xf0, + 0xa, 0x2e, 0x10, 0x3, 0xc9, 0x0, 0xf, 0x0, + 0xc2, 0xe1, 0x4, 0xe6, 0x0, 0x0, 0xcf, 0xfc, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9664 "除" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0xd, + 0xff, 0xf3, 0x0, 0x9, 0xf2, 0x0, 0x0, 0xd1, + 0xe, 0x0, 0x7, 0xb5, 0xe2, 0x0, 0xd, 0x15, + 0x80, 0x7, 0xc0, 0x5, 0xe4, 0x0, 0xd1, 0xa2, + 0x1b, 0xb1, 0x0, 0x4, 0xe9, 0xd, 0x1d, 0x6, + 0x7a, 0xbb, 0xbb, 0xb6, 0x70, 0xd1, 0x77, 0x0, + 0x33, 0x6e, 0x33, 0x10, 0xd, 0x10, 0xe0, 0x0, + 0x2, 0xd0, 0x0, 0x0, 0xd1, 0xc, 0x6a, 0xaa, + 0xbf, 0xaa, 0xa9, 0xd, 0x10, 0xc5, 0x44, 0x47, + 0xe4, 0x44, 0x40, 0xd4, 0xcd, 0x0, 0x90, 0x2d, + 0xa, 0x10, 0xd, 0x13, 0x0, 0x7a, 0x2, 0xd0, + 0x6c, 0x0, 0xd1, 0x0, 0x3e, 0x20, 0x2d, 0x0, + 0xa7, 0xd, 0x10, 0xa, 0x50, 0x3, 0xd0, 0x1, + 0xa0, 0xd1, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9678 "陸" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xfa, 0x0, 0x3, 0xd0, 0x0, 0x0, 0xd1, + 0x9, 0x78, 0xff, 0xff, 0xff, 0xf6, 0xd, 0x10, + 0xe1, 0x0, 0x3, 0xd0, 0x0, 0x0, 0xd1, 0x4b, + 0x0, 0x0, 0x3d, 0x0, 0x0, 0xd, 0x1a, 0x53, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xd1, 0x4c, 0x0, + 0x5, 0x20, 0x55, 0x0, 0xd, 0x10, 0xa5, 0x6, + 0xc1, 0x1, 0xb9, 0x0, 0xd1, 0x5, 0xaa, 0xa0, + 0x15, 0x0, 0x8a, 0xd, 0x10, 0x5a, 0x40, 0x3, + 0xd0, 0x0, 0x0, 0xd1, 0xbe, 0x58, 0xbb, 0xcf, + 0xbb, 0xb6, 0xd, 0x12, 0x10, 0x23, 0x35, 0xd3, + 0x33, 0x10, 0xd1, 0x0, 0x0, 0x0, 0x3d, 0x0, + 0x0, 0xd, 0x10, 0x0, 0x0, 0x3, 0xd0, 0x0, + 0x0, 0xd1, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, + + /* U+967D "陽" */ + 0xdf, 0xff, 0x31, 0xfd, 0xdd, 0xdd, 0xe0, 0xe, + 0x10, 0xe0, 0x1e, 0x0, 0x0, 0x1e, 0x0, 0xe1, + 0x3a, 0x1, 0xfc, 0xcc, 0xcd, 0xe0, 0xe, 0x17, + 0x40, 0x1e, 0x0, 0x0, 0x1e, 0x0, 0xe1, 0xb0, + 0x1, 0xfa, 0xaa, 0xab, 0xe0, 0xe, 0x17, 0x60, + 0x2, 0x22, 0x22, 0x22, 0x0, 0xe1, 0x1d, 0x9c, + 0xcc, 0xcc, 0xcc, 0xcc, 0x3e, 0x10, 0xd2, 0xa, + 0x80, 0x0, 0x0, 0x0, 0xe1, 0xb, 0x33, 0xf9, + 0x77, 0x77, 0x75, 0xe, 0x14, 0xe3, 0xdb, 0xae, + 0x9d, 0xbb, 0x90, 0xe1, 0xa8, 0xe6, 0xc, 0x41, + 0xd0, 0x78, 0xe, 0x10, 0x3, 0xa, 0x80, 0xa6, + 0x8, 0x60, 0xe1, 0x0, 0x3d, 0x70, 0x8b, 0x0, + 0xc4, 0xe, 0x10, 0x4, 0x40, 0x2a, 0x8, 0xec, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+968E "階" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xf3, 0xe1, 0x0, 0x4b, 0x0, 0x0, 0xe0, + 0xe, 0xe, 0x10, 0x4, 0xb0, 0x7a, 0xe, 0x4, + 0xa0, 0xef, 0xed, 0x4d, 0xca, 0x10, 0xe0, 0x94, + 0xe, 0x10, 0x4, 0xe3, 0x0, 0xe, 0xc, 0x0, + 0xe1, 0x0, 0x4b, 0x0, 0x91, 0xe0, 0xb3, 0x2f, + 0x9b, 0xc4, 0xd3, 0x3e, 0xe, 0x2, 0xc4, 0xc7, + 0x37, 0x6a, 0xbb, 0x70, 0xe0, 0xd, 0x10, 0x11, + 0xf5, 0x11, 0x10, 0xe, 0x0, 0xb3, 0xbd, 0xcc, + 0xcc, 0xcf, 0x0, 0xe2, 0x7e, 0xb, 0x40, 0x0, + 0x0, 0xf0, 0xe, 0x15, 0x20, 0xbe, 0xdd, 0xdd, + 0xdf, 0x0, 0xe0, 0x0, 0xb, 0x40, 0x0, 0x0, + 0xf0, 0xe, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xf, + 0x0, 0xe0, 0x0, 0xb, 0xed, 0xdd, 0xdd, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+969B "際" */ + 0x0, 0x0, 0x0, 0x70, 0x3, 0x0, 0x0, 0xd, + 0xff, 0xf3, 0x2e, 0x0, 0xb0, 0x0, 0x0, 0xd1, + 0xe, 0x19, 0xdc, 0xf8, 0xdc, 0xcc, 0xd, 0x13, + 0xb4, 0xe6, 0x2b, 0x29, 0x8, 0x60, 0xd1, 0x77, + 0xe3, 0x3d, 0x50, 0xc3, 0xd0, 0xd, 0x1b, 0x2, + 0xa5, 0xb0, 0x4, 0xf3, 0x0, 0xd1, 0x85, 0x2, + 0xe2, 0x0, 0xb, 0x50, 0xd, 0x11, 0xd3, 0xd9, + 0xee, 0xee, 0xcc, 0x70, 0xd1, 0xc, 0x62, 0x0, + 0x0, 0x0, 0x7, 0xd, 0x10, 0xc3, 0x9a, 0xaa, + 0xaa, 0xaa, 0x30, 0xd2, 0xce, 0x2, 0x33, 0x7c, + 0x33, 0x31, 0xd, 0x12, 0x0, 0x59, 0x4, 0xb0, + 0x76, 0x0, 0xd1, 0x0, 0x1e, 0x30, 0x4b, 0x1, + 0xd2, 0xd, 0x10, 0xa, 0x80, 0x5, 0xb0, 0x5, + 0xc0, 0xd1, 0x0, 0x10, 0xe, 0xe7, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+969C "障" */ + 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, 0x0, 0xe, + 0xff, 0xfa, 0x0, 0x5, 0xb0, 0x0, 0x0, 0xe1, + 0x9, 0x78, 0xde, 0xdd, 0xee, 0xd7, 0xe, 0x11, + 0xe1, 0x0, 0xd0, 0x5, 0xb0, 0x0, 0xe1, 0x6a, + 0x28, 0x8d, 0xa8, 0xdc, 0x88, 0x1e, 0x1d, 0x31, + 0x44, 0x44, 0x44, 0x44, 0x40, 0xe1, 0x6b, 0x1, + 0xcc, 0xcc, 0xcc, 0xb0, 0xe, 0x10, 0xb4, 0x1e, + 0x0, 0x0, 0x1e, 0x0, 0xe1, 0x6, 0x91, 0xfb, + 0xbb, 0xbc, 0xe0, 0xe, 0x10, 0x4b, 0x1e, 0x0, + 0x0, 0x1e, 0x0, 0xe3, 0x7c, 0x71, 0xcc, 0xcf, + 0xcc, 0xb0, 0xe, 0x17, 0x50, 0x0, 0x1, 0xe0, + 0x0, 0x0, 0xe1, 0x0, 0x4e, 0xee, 0xef, 0xee, + 0xee, 0x4e, 0x10, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0xe1, 0x0, 0x0, 0x0, 0x1e, 0x0, 0x0, + 0x0, + + /* U+96A3 "隣" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0xe, + 0xff, 0xf3, 0x2b, 0x1, 0xe0, 0x4c, 0x0, 0xe1, + 0xe, 0x0, 0x87, 0x1e, 0xc, 0x10, 0xe, 0x15, + 0x94, 0xcd, 0xdd, 0xfc, 0xdc, 0xa0, 0xe1, 0xa3, + 0x1, 0x16, 0xef, 0xd4, 0x11, 0xe, 0x1d, 0x0, + 0x18, 0xd3, 0xe2, 0xd6, 0x0, 0xe1, 0x97, 0x3e, + 0xa1, 0x1e, 0x1, 0x9c, 0xe, 0x11, 0xe0, 0x38, + 0x11, 0xe0, 0x1b, 0x0, 0xe1, 0xd, 0x12, 0xf2, + 0x22, 0x23, 0xe2, 0xe, 0x10, 0xc2, 0xac, 0xbf, + 0x7b, 0xbf, 0xa0, 0xe3, 0x8f, 0x8c, 0x12, 0xd4, + 0x91, 0xd0, 0xe, 0x27, 0x37, 0x4d, 0xb6, 0x57, + 0x1d, 0x0, 0xe1, 0x0, 0x0, 0x6c, 0x7, 0xde, + 0xfd, 0x1e, 0x10, 0x0, 0x5c, 0x10, 0x0, 0x1d, + 0x0, 0xe1, 0x0, 0x7a, 0x10, 0x0, 0x1, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+96A8 "隨" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0xe, + 0xff, 0xf7, 0x0, 0x3, 0xd0, 0x0, 0x0, 0xe0, + 0x1e, 0x77, 0x5c, 0xfd, 0xcc, 0xcc, 0x2e, 0x6, + 0x90, 0xd0, 0x1e, 0x21, 0x11, 0x0, 0xe0, 0xc3, + 0x6, 0xa, 0x8a, 0xbe, 0xa6, 0xe, 0x2d, 0x0, + 0x8, 0xb5, 0x57, 0xd5, 0x51, 0xe0, 0xd5, 0xbb, + 0x41, 0x55, 0x55, 0x55, 0x1e, 0x3, 0xd2, 0xe0, + 0xc, 0xbb, 0xbc, 0x50, 0xe0, 0xd, 0x1d, 0x1, + 0xd0, 0x0, 0x77, 0xe, 0x0, 0xb2, 0xd0, 0x1f, + 0xbb, 0xbd, 0x70, 0xe4, 0x9d, 0xd, 0x1, 0xe7, + 0x77, 0xb7, 0xe, 0x24, 0x10, 0xd0, 0x1e, 0x22, + 0x29, 0x70, 0xe0, 0x0, 0x1e, 0x41, 0xd0, 0x8, + 0xd5, 0xe, 0x0, 0x1d, 0xbc, 0xa5, 0x21, 0x22, + 0x31, 0xe0, 0x2, 0xa0, 0x4, 0xac, 0xdd, 0xdc, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+96BB "隻" */ + 0x0, 0x0, 0x81, 0x2, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xc0, 0x1, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xdb, 0xbb, 0xed, 0xbb, 0xbb, 0x10, + 0x0, 0xbe, 0x11, 0x13, 0xe1, 0x11, 0x11, 0x0, + 0xa, 0xdf, 0xbb, 0xbb, 0xfb, 0xbb, 0xb5, 0x0, + 0x3c, 0x2e, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xcc, 0xcc, 0xfc, 0xcc, 0xc6, 0x0, + 0x0, 0x1e, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xcc, 0xcd, 0xfc, 0xcc, 0xcc, 0x40, + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xee, 0xee, 0xee, 0xee, 0xee, 0xc0, 0x0, + 0x0, 0x0, 0xaa, 0x10, 0x0, 0x5e, 0x30, 0x0, + 0x0, 0x0, 0x6, 0xd8, 0x5c, 0xb2, 0x0, 0x0, + 0x0, 0x1, 0x37, 0xbf, 0xdf, 0x97, 0x41, 0x0, + 0xc, 0xfd, 0xb8, 0x30, 0x1, 0x6a, 0xcf, 0xd0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+96C6 "集" */ + 0x0, 0x0, 0x81, 0x3, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xc0, 0x1, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfe, 0xee, 0xff, 0xee, 0xee, 0x20, + 0x2, 0xed, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x1d, 0xbf, 0xcc, 0xcc, 0xfc, 0xcc, 0xc6, 0x0, + 0x16, 0x3d, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xcc, 0xcd, 0xfc, 0xcc, 0xc7, 0x0, + 0x0, 0x3d, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xee, 0xee, 0xfe, 0xee, 0xee, 0x90, + 0x0, 0x15, 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, + 0x1c, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0xc1, + 0x1, 0x11, 0x17, 0xed, 0xce, 0x61, 0x11, 0x10, + 0x0, 0x3, 0xbc, 0x29, 0x73, 0xdb, 0x30, 0x0, + 0x16, 0xcd, 0x60, 0x9, 0x70, 0x6, 0xcd, 0x81, + 0x2a, 0x40, 0x0, 0x9, 0x70, 0x0, 0x3, 0x80, + + /* U+96D1 "雑" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0x0, 0x0, 0x6, 0x96, 0x90, 0x0, + 0x9, 0x9f, 0x99, 0x10, 0x1d, 0x10, 0xa2, 0x0, + 0x3, 0x5c, 0x3d, 0x11, 0xdf, 0xee, 0xee, 0xe2, + 0x0, 0x87, 0xc, 0x19, 0xc9, 0x1, 0xe0, 0x0, + 0x2, 0xe1, 0xc, 0x24, 0x69, 0x1, 0xe0, 0x0, + 0x2d, 0x50, 0x1a, 0xcd, 0x6d, 0xab, 0xfa, 0xa0, + 0x4, 0x1, 0xd0, 0x0, 0x6b, 0x34, 0xe3, 0x30, + 0x19, 0x9a, 0xe9, 0x95, 0x69, 0x1, 0xe0, 0x0, + 0x7, 0x78, 0xe7, 0x74, 0x69, 0x1, 0xe0, 0x0, + 0x0, 0x52, 0xd2, 0x30, 0x6f, 0xee, 0xfe, 0xe1, + 0x3, 0xc2, 0xd2, 0xd0, 0x69, 0x1, 0xe0, 0x0, + 0x1d, 0x31, 0xd0, 0x95, 0x69, 0x1, 0xe0, 0x0, + 0x5, 0x3, 0xd0, 0x10, 0x6e, 0xbc, 0xfb, 0xb3, + 0x0, 0x7f, 0x90, 0x0, 0x6b, 0x33, 0x33, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+96D6 "雖" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, + 0x9, 0xed, 0xde, 0xe0, 0xc, 0x3b, 0x50, 0x0, + 0x9, 0x60, 0x1, 0xe0, 0x1c, 0x2, 0xe1, 0x0, + 0x9, 0x60, 0x1, 0xe0, 0x7b, 0x88, 0xb8, 0x70, + 0x9, 0xee, 0xee, 0xe1, 0xe8, 0x78, 0xe7, 0x70, + 0x0, 0x4, 0xb0, 0x9, 0xf2, 0x2, 0xd0, 0x0, + 0x5, 0x69, 0xd6, 0x6c, 0xd2, 0x2, 0xd0, 0x0, + 0xd, 0x8a, 0xd8, 0xe1, 0xdf, 0xef, 0xfe, 0xb0, + 0xd, 0x3, 0xa0, 0xc1, 0xd2, 0x2, 0xd0, 0x0, + 0xd, 0x36, 0xc3, 0xd1, 0xd2, 0x2, 0xd0, 0x0, + 0x8, 0x9b, 0xe9, 0x90, 0xdf, 0xff, 0xff, 0xb0, + 0x0, 0x3, 0xb1, 0x80, 0xd2, 0x2, 0xd0, 0x0, + 0x0, 0x3, 0xc2, 0xe1, 0xd2, 0x2, 0xd0, 0x0, + 0x4c, 0xef, 0xdb, 0xc5, 0xdd, 0xcd, 0xfc, 0xc1, + 0x13, 0x10, 0x0, 0x35, 0xd4, 0x22, 0x22, 0x20, + + /* U+96D9 "雙" */ + 0x0, 0x4, 0x12, 0x0, 0x1, 0x30, 0x10, 0x0, + 0x0, 0x79, 0x3c, 0x0, 0x9, 0x74, 0xb0, 0x0, + 0x0, 0xea, 0x8e, 0x97, 0x1f, 0x98, 0xf9, 0x70, + 0x9, 0xf3, 0x3e, 0x32, 0xbe, 0x34, 0xe3, 0x30, + 0x3d, 0xfb, 0xbf, 0xbb, 0xcf, 0xbc, 0xfb, 0x60, + 0x1, 0xe0, 0xe, 0x1, 0x2d, 0x0, 0xd0, 0x0, + 0x0, 0xfb, 0xbf, 0xb5, 0xf, 0xbc, 0xfb, 0x60, + 0x0, 0xf5, 0x5f, 0x55, 0xe, 0x56, 0xe5, 0x50, + 0x0, 0x55, 0x55, 0x55, 0x5, 0x55, 0x55, 0x50, + 0x4, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc3, 0x0, + 0x0, 0x24, 0xe9, 0x22, 0x22, 0x2b, 0xb0, 0x0, + 0x0, 0x0, 0x2d, 0xa2, 0x3, 0xca, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xcf, 0x50, 0x0, 0x0, + 0x0, 0x24, 0x8c, 0xea, 0x8c, 0xfd, 0xa7, 0x40, + 0x1e, 0xda, 0x83, 0x0, 0x0, 0x16, 0x9b, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+96E2 "離" */ + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xd0, 0x0, 0x1, 0xe4, 0x90, 0x0, + 0xc, 0xcc, 0xfd, 0xcc, 0x26, 0x90, 0xe2, 0x0, + 0x3, 0x42, 0x14, 0x44, 0xc, 0x62, 0x74, 0x20, + 0x5, 0x87, 0x8b, 0x69, 0x4f, 0xdd, 0xfd, 0xd1, + 0x5, 0x83, 0xca, 0x69, 0xdf, 0x10, 0xe0, 0x0, + 0x5, 0x87, 0x2, 0x79, 0x4e, 0x21, 0xe1, 0x10, + 0x4, 0xdc, 0xfd, 0xd7, 0xe, 0xdd, 0xfd, 0xc0, + 0x1, 0x11, 0xe2, 0x11, 0xe, 0x10, 0xe0, 0x0, + 0xd, 0xcd, 0xeb, 0xbf, 0x1e, 0x10, 0xe0, 0x0, + 0xd, 0x9, 0x46, 0xc, 0x1e, 0xff, 0xff, 0xd0, + 0xd, 0x2d, 0x2b, 0x2c, 0x1e, 0x10, 0xe0, 0x0, + 0xd, 0x6c, 0x97, 0x9c, 0x1e, 0x10, 0xe0, 0x0, + 0xd, 0x0, 0x0, 0xc, 0x1e, 0xdc, 0xfd, 0xc4, + 0xd, 0x0, 0x4, 0xdd, 0xe, 0x42, 0x22, 0x21, + 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, + + /* U+96E3 "難" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, + 0x2d, 0xfe, 0xde, 0xfc, 0x6, 0x96, 0x90, 0x0, + 0x0, 0xb3, 0x6, 0x90, 0xc, 0x30, 0xe1, 0x0, + 0x0, 0xbf, 0xff, 0x90, 0x2f, 0xaa, 0xaa, 0xa2, + 0x0, 0x1, 0xc0, 0x0, 0xae, 0xaa, 0xfa, 0xa2, + 0xb, 0xcc, 0xfb, 0xda, 0xfb, 0x0, 0xe0, 0x0, + 0xb, 0x21, 0xc0, 0x7e, 0xac, 0x1, 0xe0, 0x0, + 0xa, 0xcc, 0xfb, 0xd6, 0x4f, 0xdd, 0xfd, 0xd0, + 0x0, 0x1, 0xd0, 0x0, 0x3b, 0x0, 0xe0, 0x0, + 0x9, 0xdd, 0xfd, 0xd7, 0x3b, 0x0, 0xe0, 0x0, + 0x0, 0x2, 0xd0, 0x0, 0x3e, 0xbb, 0xfb, 0xb0, + 0x3d, 0xde, 0xfd, 0xdd, 0x3c, 0x44, 0xf4, 0x40, + 0x0, 0xd, 0xc7, 0x0, 0x3b, 0x0, 0xe0, 0x0, + 0x1, 0xb7, 0x7, 0xc2, 0x3f, 0xcd, 0xfc, 0xc3, + 0x1c, 0x40, 0x0, 0x40, 0x3c, 0x22, 0x22, 0x20, + + /* U+96E8 "雨" */ + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x1a, 0x81, 0x11, 0x11, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x5, 0xa0, 0x0, 0x9, 0x70, 0x0, 0xa, 0x60, + 0x5, 0xa4, 0xc3, 0x9, 0x77, 0xa2, 0xa, 0x60, + 0x5, 0xa0, 0x3c, 0x79, 0x70, 0x4d, 0x5a, 0x60, + 0x5, 0xa0, 0x0, 0x19, 0x70, 0x0, 0x1a, 0x60, + 0x5, 0xa6, 0xa1, 0x9, 0x7b, 0x70, 0xa, 0x60, + 0x5, 0xa0, 0x5d, 0x59, 0x70, 0x8d, 0x3a, 0x60, + 0x5, 0xa0, 0x1, 0x39, 0x70, 0x3, 0x1a, 0x60, + 0x5, 0xa0, 0x0, 0x9, 0x70, 0x1, 0x1b, 0x60, + 0x5, 0xa0, 0x0, 0x8, 0x60, 0x1e, 0xec, 0x20, + + /* U+96EA "雪" */ + 0xd, 0xdd, 0xdd, 0xfe, 0xdd, 0xdd, 0x80, 0x0, + 0x0, 0x0, 0xe2, 0x0, 0x0, 0x0, 0xcd, 0xdd, + 0xdd, 0xfe, 0xdd, 0xdd, 0xd6, 0xe1, 0x0, 0x0, + 0xe2, 0x0, 0x0, 0x77, 0xe2, 0xcc, 0xc4, 0xe2, + 0xbc, 0xc8, 0x77, 0x80, 0x0, 0x0, 0xe2, 0x0, + 0x0, 0x44, 0x5, 0xcc, 0xc5, 0xe2, 0xbc, 0xcc, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x7, 0xee, 0xee, 0xee, 0xee, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x1, 0xcc, + 0xcc, 0xcc, 0xcc, 0xdf, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x0, 0xa, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdf, 0x0, + + /* U+96F2 "雲" */ + 0x0, 0xcd, 0xdd, 0xdf, 0xed, 0xdd, 0xdc, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xa, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0xa0, + 0xb, 0x30, 0x0, 0x9, 0x70, 0x0, 0x3, 0xb0, + 0xb, 0x3a, 0xbb, 0x69, 0x77, 0xbb, 0xa3, 0xb0, + 0x6, 0x20, 0x0, 0x9, 0x70, 0x0, 0x2, 0x60, + 0x0, 0x2c, 0xcc, 0x69, 0x77, 0xcc, 0xc3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4d, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xdd, 0xef, 0xed, 0xdd, 0xee, 0xdd, 0xd1, + 0x0, 0x0, 0x8c, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x0, 0x8, 0xd1, 0x0, 0x11, 0x3c, 0xc1, 0x0, + 0x0, 0x6f, 0xfe, 0xee, 0xdc, 0xba, 0xbc, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x5, 0x0, + + /* U+96FB "電" */ + 0xd, 0xdd, 0xdd, 0xfd, 0xdd, 0xdd, 0x80, 0x0, + 0x0, 0x0, 0xe, 0x20, 0x0, 0x0, 0x0, 0xbc, + 0xcc, 0xcc, 0xfd, 0xcc, 0xcc, 0xc7, 0xe, 0x10, + 0x0, 0xe, 0x20, 0x0, 0x6, 0x80, 0xe1, 0xbb, + 0xb4, 0xe2, 0x9b, 0xb7, 0x68, 0x4, 0x37, 0x77, + 0x3e, 0x26, 0x77, 0x72, 0x20, 0x0, 0x11, 0x10, + 0x61, 0x11, 0x11, 0x0, 0x0, 0x7d, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd3, 0x0, 0x8, 0x70, 0x0, 0xe1, + 0x0, 0xc, 0x40, 0x0, 0x8e, 0xcc, 0xcf, 0xcc, + 0xcc, 0xf4, 0x0, 0x8, 0x70, 0x0, 0xe1, 0x0, + 0xc, 0x40, 0x0, 0x8e, 0xcc, 0xcf, 0xdc, 0xcc, + 0xf4, 0x70, 0x6, 0x50, 0x0, 0xe2, 0x0, 0x0, + 0x1e, 0x0, 0x0, 0x0, 0x8, 0xee, 0xee, 0xee, + 0x80, + + /* U+9700 "需" */ + 0xb, 0xdd, 0xdd, 0xfe, 0xdd, 0xdd, 0xb0, 0x0, + 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0xad, 0xcc, + 0xcc, 0xee, 0xcc, 0xcc, 0xda, 0xb4, 0x0, 0x0, + 0x87, 0x0, 0x0, 0x4b, 0xb4, 0xab, 0xb6, 0x87, + 0x7b, 0xba, 0x4b, 0x22, 0x77, 0x74, 0x87, 0x57, + 0x77, 0x32, 0x0, 0x22, 0x21, 0x44, 0x12, 0x22, + 0x0, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x0, 0x0, 0x0, 0xd3, 0x0, 0x0, 0x0, 0x8, + 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xc0, 0xa, 0x61, + 0x3d, 0x11, 0xa7, 0x11, 0xf1, 0xa, 0x50, 0x2d, + 0x0, 0x96, 0x0, 0xf1, 0xa, 0x50, 0x2d, 0x0, + 0x96, 0x0, 0xf1, 0xa, 0x50, 0x2c, 0x0, 0x85, + 0x5e, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+9707 "震" */ + 0x0, 0xdd, 0xdd, 0xde, 0xed, 0xdd, 0xd9, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, 0x0, 0x0, + 0xe, 0xcb, 0xbb, 0xbe, 0xdb, 0xbb, 0xbd, 0xa0, + 0xe, 0x15, 0x55, 0x39, 0x64, 0x55, 0x47, 0xa0, + 0xa, 0x4, 0x44, 0x29, 0x63, 0x44, 0x35, 0x70, + 0x0, 0x3a, 0xaa, 0x69, 0x67, 0xaa, 0xa1, 0x0, + 0x0, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x40, + 0x0, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x55, 0x20, + 0x0, 0xf4, 0xbb, 0xbb, 0xbb, 0xbb, 0xb4, 0x0, + 0x1, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xfc, 0xee, 0xbb, 0xfc, 0xbb, 0xbc, 0xb2, + 0x5, 0xe0, 0x98, 0x0, 0x4d, 0x22, 0xb8, 0x0, + 0xb, 0x90, 0xa8, 0x0, 0x35, 0xcf, 0x60, 0x0, + 0x5d, 0x12, 0xfe, 0xdc, 0xa3, 0x5, 0xbe, 0xd1, + 0x12, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+9752 "青" */ + 0x0, 0x11, 0x11, 0x19, 0x81, 0x11, 0x11, 0x0, + 0x0, 0xcc, 0xcc, 0xce, 0xec, 0xcc, 0xcc, 0x20, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x5c, 0xcc, 0xce, 0xec, 0xcc, 0xc6, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0xd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xdc, 0xcc, 0xcc, 0xcc, 0xe0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xb, 0xdc, 0xcc, 0xcc, 0xcd, 0xe0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xb, 0xdc, 0xcc, 0xcc, 0xcd, 0xe0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xb, 0x40, 0x0, 0x7, 0xdd, 0x90, 0x0, + + /* U+9759 "静" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0x1, 0xe1, 0x0, 0x0, + 0xa, 0xcd, 0xfc, 0xc9, 0x9, 0xfd, 0xeb, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0x4d, 0x0, 0xb5, 0x0, + 0x7, 0xcd, 0xfc, 0xc8, 0xf4, 0x4, 0xc0, 0x0, + 0x0, 0x1, 0xe0, 0x0, 0x9f, 0xff, 0xff, 0xd0, + 0x1d, 0xdd, 0xdd, 0xdc, 0x0, 0x1e, 0x1, 0xd0, + 0x0, 0x22, 0x22, 0x21, 0x22, 0x4e, 0x24, 0xe2, + 0x2, 0xea, 0xaa, 0xf5, 0xbb, 0xcf, 0xbc, 0xfa, + 0x2, 0xc2, 0x22, 0xe1, 0x0, 0x1e, 0x1, 0xd0, + 0x2, 0xea, 0xaa, 0xf1, 0x25, 0x6f, 0x57, 0xd0, + 0x2, 0xc1, 0x11, 0xd1, 0x38, 0x9f, 0x89, 0xd0, + 0x2, 0xea, 0xaa, 0xf1, 0x0, 0x1e, 0x0, 0x0, + 0x2, 0xc0, 0x0, 0xd1, 0x0, 0x2e, 0x0, 0x0, + 0x2, 0xc0, 0x6d, 0xd0, 0x1f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+975E "非" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xe0, 0xc, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0x0, 0xc4, 0x0, 0x0, 0x9, 0xff, + 0xff, 0xe0, 0xc, 0xff, 0xff, 0xd0, 0x1, 0x11, + 0x3e, 0x0, 0xc5, 0x11, 0x11, 0x0, 0x0, 0x2, + 0xe0, 0xc, 0x40, 0x0, 0x0, 0x1, 0x11, 0x4e, + 0x0, 0xc5, 0x11, 0x11, 0x5, 0xee, 0xee, 0xe0, + 0xc, 0xfe, 0xee, 0x80, 0x0, 0x0, 0x2e, 0x0, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe0, 0xc, + 0x40, 0x0, 0x0, 0xee, 0xee, 0xfe, 0x0, 0xcf, + 0xee, 0xee, 0x21, 0x11, 0x14, 0xe0, 0xc, 0x62, + 0x22, 0x20, 0x0, 0x0, 0x2e, 0x0, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xe0, 0xc, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0x0, 0xc4, 0x0, 0x0, + 0x0, + + /* U+9762 "面" */ + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, + 0xe, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe1, + 0x0, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3e, 0x10, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x4, 0xb0, 0xd, 0x20, 0x4, 0xa0, 0xc, 0x40, + 0x4, 0xb0, 0xd, 0x30, 0x5, 0xa0, 0xc, 0x40, + 0x4, 0xb0, 0xd, 0xdd, 0xde, 0xa0, 0xc, 0x40, + 0x4, 0xb0, 0xd, 0x20, 0x4, 0xa0, 0xc, 0x40, + 0x4, 0xb0, 0xd, 0xbb, 0xbc, 0xa0, 0xc, 0x40, + 0x4, 0xb0, 0xd, 0x42, 0x26, 0xa0, 0xc, 0x40, + 0x4, 0xb0, 0xd, 0x20, 0x4, 0xa0, 0xc, 0x40, + 0x4, 0xfd, 0xdf, 0xdd, 0xde, 0xfd, 0xdf, 0x40, + 0x4, 0xc2, 0x22, 0x22, 0x22, 0x22, 0x2d, 0x40, + + /* U+9769 "革" */ + 0x0, 0x0, 0x78, 0x0, 0x0, 0x88, 0x0, 0x0, + 0xd, 0xee, 0xff, 0xee, 0xee, 0xff, 0xee, 0xd0, + 0x0, 0x0, 0x78, 0x0, 0x0, 0x88, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0xaa, 0xaa, 0xd8, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x19, 0x91, 0x10, 0x0, 0x0, + 0x0, 0x4c, 0xcc, 0xce, 0xec, 0xcc, 0xc6, 0x0, + 0x0, 0x5b, 0x11, 0x19, 0x91, 0x11, 0xa7, 0x0, + 0x0, 0x5b, 0x0, 0x8, 0x80, 0x0, 0x97, 0x0, + 0x0, 0x5f, 0xdd, 0xdf, 0xfd, 0xdd, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x19, 0x91, 0x11, 0x11, 0x10, + 0x2e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe2, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + + /* U+9774 "靴" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd0, 0x1c, 0x0, 0x1d, 0xd, 0x20, 0x0, + 0xe, 0xfe, 0xef, 0xe0, 0x68, 0xd, 0x20, 0x0, + 0x0, 0xd0, 0x1c, 0x0, 0xb3, 0xd, 0x20, 0x40, + 0x0, 0xeb, 0xcc, 0x3, 0xf1, 0xd, 0x23, 0xe1, + 0x0, 0x9, 0x60, 0xc, 0xf1, 0xd, 0x4e, 0x40, + 0x9, 0xdf, 0xed, 0x9a, 0xe1, 0xd, 0xf6, 0x0, + 0xa, 0x27, 0x47, 0x61, 0xe1, 0x2e, 0x60, 0x0, + 0xa, 0x27, 0x47, 0x50, 0xe5, 0xef, 0x20, 0x0, + 0xa, 0xee, 0xee, 0x50, 0xe7, 0x3d, 0x20, 0x0, + 0x0, 0x8, 0x50, 0x0, 0xe1, 0xd, 0x20, 0x0, + 0x1b, 0xbe, 0xdb, 0xa0, 0xe1, 0xd, 0x20, 0x23, + 0x3, 0x3a, 0x73, 0x30, 0xe1, 0xd, 0x20, 0x39, + 0x0, 0x8, 0x50, 0x0, 0xe1, 0xc, 0x40, 0x78, + 0x0, 0x8, 0x50, 0x0, 0xe1, 0x7, 0xef, 0xd2, + 0x0, 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + + /* U+97F3 "音" */ + 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x90, 0x0, 0x0, 0x0, + 0x2, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0x40, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x2c, 0x10, 0x0, + 0x0, 0x0, 0x7a, 0x0, 0x0, 0x8a, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0x10, 0x1, 0xe3, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xee, 0xee, 0xee, 0xee, 0xe0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xd, 0xee, 0xee, 0xee, 0xee, 0xf0, 0x0, + 0x0, 0xd, 0x20, 0x0, 0x0, 0x1, 0xf0, 0x0, + 0x0, 0xd, 0x30, 0x0, 0x0, 0x2, 0xf0, 0x0, + 0x0, 0xd, 0xed, 0xdd, 0xdd, 0xdd, 0xf0, 0x0, + + /* U+97FF "響" */ + 0x0, 0x5, 0x0, 0x7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x95, 0x53, 0xea, 0xad, 0x5e, 0xcd, 0xe0, + 0x7, 0xb4, 0x82, 0xb0, 0x8, 0x5e, 0x5, 0x70, + 0x7, 0xaa, 0x15, 0xea, 0xad, 0x5e, 0xd, 0x10, + 0x8, 0xe7, 0xb9, 0xd5, 0x5b, 0x5e, 0x4, 0xa0, + 0x6, 0x58, 0xc3, 0xc4, 0x8e, 0x2e, 0x0, 0xb2, + 0x1, 0x8b, 0x18, 0xfc, 0xa7, 0x9e, 0x5c, 0xb0, + 0xc, 0x50, 0x2, 0x18, 0x80, 0x8, 0x0, 0x0, + 0x0, 0x6c, 0xde, 0xcc, 0xcc, 0xed, 0xc9, 0x0, + 0x0, 0x0, 0x1d, 0x10, 0x1, 0xd2, 0x0, 0x0, + 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, + 0x0, 0x6, 0x88, 0x88, 0x88, 0x88, 0x80, 0x0, + 0x0, 0xd, 0x53, 0x33, 0x33, 0x33, 0xf0, 0x0, + 0x0, 0xd, 0xa9, 0x99, 0x99, 0x99, 0xf0, 0x0, + 0x0, 0xd, 0xba, 0xaa, 0xaa, 0xaa, 0xf0, 0x0, + + /* U+9803 "頃" */ + 0xf, 0x0, 0xc, 0xee, 0xef, 0xfe, 0xee, 0x10, + 0xf0, 0x0, 0x0, 0x0, 0xf2, 0x0, 0x0, 0xf, + 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, 0xf0, + 0x0, 0xe, 0xdd, 0xdd, 0xde, 0x80, 0xf, 0xcc, + 0xc4, 0xe1, 0x0, 0x0, 0x78, 0x0, 0xf0, 0x0, + 0xe, 0xdc, 0xcc, 0xce, 0x80, 0xf, 0x0, 0x0, + 0xe1, 0x0, 0x0, 0x88, 0x0, 0xf0, 0x0, 0xe, + 0x10, 0x0, 0x7, 0x80, 0xf, 0x0, 0x0, 0xed, + 0xdd, 0xdd, 0xe8, 0x1, 0xf4, 0x9d, 0x4e, 0x10, + 0x0, 0x7, 0x80, 0x7f, 0xb5, 0x0, 0xed, 0xdd, + 0xdd, 0xe8, 0x3, 0x20, 0x0, 0x0, 0x73, 0x2, + 0x60, 0x0, 0x0, 0x0, 0x6, 0xda, 0x10, 0x19, + 0xd4, 0x0, 0x0, 0xb, 0xa3, 0x0, 0x0, 0x4, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+9805 "項" */ + 0x0, 0x0, 0x0, 0x9e, 0xee, 0xff, 0xee, 0xe8, + 0x1d, 0xdd, 0xdd, 0x30, 0x0, 0xd6, 0x0, 0x0, + 0x6, 0x6f, 0x76, 0x10, 0x0, 0xf1, 0x0, 0x0, + 0x0, 0xf, 0x10, 0xd, 0xed, 0xdd, 0xde, 0xe0, + 0x0, 0xf, 0x10, 0xd, 0x30, 0x0, 0x1, 0xe0, + 0x0, 0xf, 0x10, 0xd, 0xcb, 0xbb, 0xbc, 0xe0, + 0x0, 0xf, 0x10, 0xd, 0x40, 0x0, 0x2, 0xe0, + 0x0, 0xf, 0x10, 0xd, 0x30, 0x0, 0x1, 0xe0, + 0x0, 0xf, 0x36, 0x6d, 0xdd, 0xdd, 0xdd, 0xe0, + 0x3, 0x8f, 0xd8, 0x2d, 0x30, 0x0, 0x1, 0xe0, + 0x3c, 0x72, 0x0, 0xd, 0xdc, 0xcc, 0xcd, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x55, 0x1, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xc3, 0x0, 0x7e, 0x70, + 0x0, 0x0, 0x9, 0xb5, 0x0, 0x0, 0x1, 0xb7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9808 "須" */ + 0x0, 0x0, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xe1, 0xde, 0xee, 0xfe, 0xee, 0xe1, + 0x0, 0x7e, 0x20, 0x0, 0x3, 0xf0, 0x0, 0x0, + 0x1b, 0xd2, 0x0, 0x0, 0x6, 0xb0, 0x0, 0x0, + 0x29, 0x0, 0x0, 0x2f, 0xdd, 0xdd, 0xde, 0x80, + 0x0, 0x0, 0x55, 0x2d, 0x0, 0x0, 0x8, 0x80, + 0x0, 0x5, 0xe2, 0x2f, 0xcc, 0xcc, 0xce, 0x80, + 0x0, 0x7e, 0x30, 0x2d, 0x0, 0x0, 0x8, 0x80, + 0x1c, 0xd2, 0x0, 0x2d, 0x0, 0x0, 0x8, 0x80, + 0x6, 0x0, 0x0, 0x2f, 0xcc, 0xcc, 0xce, 0x80, + 0x0, 0x0, 0x4d, 0x3d, 0x0, 0x0, 0x8, 0x80, + 0x0, 0x3, 0xe2, 0x2f, 0xdd, 0xdd, 0xde, 0x80, + 0x0, 0x6e, 0x40, 0x0, 0x61, 0x1, 0x50, 0x0, + 0x2c, 0xd2, 0x0, 0x5d, 0xa1, 0x2, 0xbc, 0x30, + 0x17, 0x0, 0xc, 0xa3, 0x0, 0x0, 0x5, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9817 "頗" */ + 0x0, 0x0, 0xe0, 0x3, 0xee, 0xef, 0xee, 0xe0, + 0x6, 0x99, 0xf9, 0x97, 0x0, 0x3d, 0x0, 0x0, + 0xb, 0xb9, 0xf9, 0xb9, 0x0, 0x6a, 0x0, 0x0, + 0xb, 0x30, 0xe0, 0x86, 0xcd, 0xdd, 0xde, 0x90, + 0xb, 0x30, 0xe0, 0x71, 0xc2, 0x0, 0x5, 0x90, + 0xb, 0xee, 0xfe, 0xe2, 0xcd, 0xcc, 0xcd, 0x90, + 0xb, 0x30, 0x0, 0xe0, 0xc3, 0x0, 0x6, 0x90, + 0xc, 0x5b, 0x4, 0xb0, 0xc2, 0x0, 0x5, 0x90, + 0xc, 0x18, 0xa9, 0x50, 0xcd, 0xdd, 0xde, 0x90, + 0xd, 0x0, 0x9f, 0x0, 0xc2, 0x0, 0x5, 0x90, + 0xe, 0x0, 0xcd, 0x80, 0xcd, 0xdd, 0xde, 0x90, + 0x3b, 0x9, 0xa0, 0xd3, 0x6, 0x30, 0x52, 0x0, + 0x98, 0xcb, 0x0, 0x11, 0xac, 0x20, 0x5e, 0x40, + 0x31, 0x60, 0x0, 0x1d, 0x70, 0x0, 0x3, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9818 "領" */ + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0x80, 0xd, 0xee, 0xff, 0xee, 0xe1, + 0x0, 0x2b, 0xb2, 0x0, 0x0, 0x98, 0x0, 0x0, + 0x0, 0xb1, 0x1c, 0x20, 0x0, 0xc4, 0x0, 0x0, + 0xa, 0x50, 0x2, 0xd5, 0xfd, 0xdd, 0xde, 0x90, + 0x67, 0xd, 0x10, 0x34, 0xb0, 0x0, 0x6, 0x90, + 0x0, 0x6, 0xb0, 0x4, 0xfc, 0xcc, 0xce, 0x90, + 0x0, 0x0, 0x40, 0x4, 0xb0, 0x0, 0x6, 0x90, + 0xd, 0xff, 0xff, 0xb4, 0xb0, 0x0, 0x6, 0x90, + 0x1, 0x11, 0x19, 0x64, 0xfd, 0xdd, 0xde, 0x90, + 0x0, 0x0, 0x2d, 0x4, 0xb0, 0x0, 0x6, 0x90, + 0x1, 0xd4, 0xc5, 0x4, 0xfd, 0xdd, 0xde, 0x90, + 0x0, 0x3e, 0xb0, 0x0, 0x17, 0x0, 0x61, 0x0, + 0x0, 0x2, 0xe3, 0x5, 0xe8, 0x0, 0x7e, 0x40, + 0x0, 0x0, 0x41, 0xab, 0x30, 0x0, 0x3, 0xd2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+982D "頭" */ + 0x0, 0x0, 0x0, 0x0, 0x11, 0x11, 0x11, 0x10, + 0x2f, 0xff, 0xff, 0xf7, 0xcc, 0xdf, 0xcc, 0xc5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5d, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x11, 0x8a, 0x11, 0x10, + 0xa, 0xee, 0xee, 0xb0, 0xdc, 0xcc, 0xcc, 0xe0, + 0xa, 0x30, 0x3, 0xc0, 0xd2, 0x0, 0x1, 0xe0, + 0xa, 0x30, 0x3, 0xc0, 0xdd, 0xcc, 0xcd, 0xe0, + 0xa, 0xcb, 0xbc, 0xc0, 0xd2, 0x0, 0x1, 0xe0, + 0x3, 0x55, 0x55, 0x40, 0xd2, 0x0, 0x1, 0xe0, + 0x2, 0xa0, 0xd, 0x10, 0xdd, 0xcc, 0xcd, 0xe0, + 0x0, 0xe1, 0x1e, 0x0, 0xd2, 0x0, 0x1, 0xe0, + 0x0, 0xb2, 0x58, 0x10, 0xdd, 0xdd, 0xdd, 0xe0, + 0x0, 0x37, 0xae, 0xd3, 0x6, 0x20, 0x33, 0x0, + 0x3f, 0xc8, 0x51, 0x3, 0xbb, 0x10, 0x3d, 0x80, + 0x0, 0x0, 0x0, 0x5d, 0x50, 0x0, 0x0, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+983C "頼" */ + 0x0, 0x3, 0xb0, 0x5, 0xee, 0xff, 0xfe, 0xe7, + 0x1d, 0xde, 0xfd, 0xd6, 0x0, 0x2f, 0x0, 0x0, + 0x5, 0x58, 0xd5, 0x52, 0x0, 0x5c, 0x0, 0x0, + 0x0, 0x4, 0xb0, 0x0, 0xae, 0xdd, 0xdd, 0xe0, + 0xc, 0xbc, 0xeb, 0xd5, 0xa5, 0x0, 0x1, 0xe0, + 0xc, 0x13, 0xa0, 0x85, 0xad, 0xcc, 0xcc, 0xe0, + 0xc, 0x13, 0xa0, 0x85, 0xa6, 0x0, 0x2, 0xe0, + 0xc, 0xee, 0xfe, 0xf5, 0xa5, 0x0, 0x1, 0xe0, + 0x1, 0x2d, 0xe4, 0x10, 0xae, 0xdd, 0xdd, 0xe0, + 0x0, 0x6d, 0xdd, 0x50, 0xa5, 0x0, 0x1, 0xe0, + 0x2, 0xd5, 0xb1, 0xd3, 0xae, 0xcc, 0xcd, 0xe0, + 0x2e, 0x43, 0xb0, 0x0, 0x6, 0x40, 0x35, 0x0, + 0x25, 0x3, 0xb0, 0x2, 0xad, 0x20, 0x2c, 0x90, + 0x0, 0x3, 0xb0, 0x2d, 0x60, 0x0, 0x0, 0x98, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+984C "題" */ + 0x4, 0xfc, 0xcd, 0xf1, 0xdd, 0xdd, 0xdd, 0xc0, + 0x4, 0xb0, 0x0, 0xf0, 0x0, 0x59, 0x0, 0x0, + 0x4, 0xec, 0xcc, 0xf0, 0x59, 0xdb, 0x99, 0x20, + 0x4, 0xb0, 0x0, 0xf0, 0x88, 0x22, 0x2c, 0x30, + 0x4, 0xfc, 0xcc, 0xf0, 0x8c, 0x99, 0x9e, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x88, 0x22, 0x2c, 0x30, + 0x15, 0x55, 0x55, 0x55, 0x87, 0x11, 0x1c, 0x30, + 0x28, 0x88, 0xf8, 0x88, 0x8c, 0xaa, 0xae, 0x30, + 0x1, 0x80, 0xe0, 0x0, 0x88, 0x22, 0x2c, 0x30, + 0x3, 0xc0, 0xfd, 0xd9, 0x49, 0x98, 0x98, 0x20, + 0x5, 0xe1, 0xe0, 0x0, 0x1c, 0x40, 0xb7, 0x0, + 0x7, 0xbb, 0xe0, 0x4, 0xd5, 0x0, 0xa, 0x90, + 0xc, 0x36, 0xe7, 0x34, 0x20, 0x0, 0x0, 0x50, + 0x3c, 0x0, 0x18, 0xbe, 0xee, 0xee, 0xee, 0xd0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9854 "顔" */ + 0x0, 0x3, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0xe3, 0x11, 0xee, 0xef, 0xee, 0xe2, + 0xf, 0xff, 0xff, 0xfd, 0x0, 0xf, 0x10, 0x0, + 0x1, 0xa4, 0x14, 0xa1, 0x0, 0x2d, 0x0, 0x0, + 0x0, 0x87, 0x8, 0x70, 0x7e, 0xdd, 0xdd, 0xe0, + 0x4, 0x9b, 0x6e, 0x86, 0x77, 0x0, 0x1, 0xe0, + 0xb, 0x85, 0x57, 0x75, 0x7e, 0xcc, 0xcd, 0xe0, + 0xb, 0x30, 0x4d, 0x40, 0x77, 0x0, 0x1, 0xe0, + 0xb, 0x6b, 0xb2, 0x0, 0x77, 0x0, 0x1, 0xe0, + 0xc, 0x33, 0x4, 0x90, 0x7e, 0xdd, 0xdd, 0xe0, + 0xd, 0x24, 0xaa, 0x10, 0x77, 0x0, 0x1, 0xe0, + 0xe, 0x28, 0x20, 0x77, 0x7e, 0xdd, 0xdd, 0xe0, + 0x2c, 0x0, 0x9, 0xc0, 0x4, 0x50, 0x44, 0x0, + 0x77, 0x18, 0xd8, 0x0, 0x8e, 0x30, 0x2d, 0x80, + 0x12, 0x67, 0x10, 0xc, 0x91, 0x0, 0x1, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9858 "願" */ + 0xb, 0xfe, 0xff, 0xfe, 0x9e, 0xef, 0xfe, 0xe3, + 0xb, 0x30, 0x2e, 0x0, 0x0, 0xd, 0x30, 0x0, + 0xb, 0x30, 0x4a, 0x0, 0x0, 0x1f, 0x10, 0x0, + 0xb, 0x3e, 0xcc, 0xce, 0x1f, 0xcc, 0xcc, 0xc0, + 0xb, 0x3d, 0x0, 0xe, 0x1d, 0x0, 0x2, 0xc0, + 0xb, 0x3e, 0xbb, 0xbe, 0x1f, 0xcc, 0xcd, 0xc0, + 0xc, 0x2d, 0x0, 0xe, 0x1d, 0x0, 0x2, 0xc0, + 0xc, 0x2d, 0x0, 0xe, 0x1d, 0x0, 0x2, 0xc0, + 0xd, 0x1c, 0xdf, 0xdb, 0x1f, 0xcc, 0xcc, 0xc0, + 0xe, 0x5, 0xe, 0x13, 0x1d, 0x0, 0x2, 0xc0, + 0xe, 0xd, 0xe, 0x1d, 0x1f, 0xcc, 0xcd, 0xc0, + 0x3b, 0x69, 0xe, 0xa, 0x31, 0x60, 0x25, 0x0, + 0x87, 0x62, 0xe, 0x1, 0x3d, 0x80, 0x1c, 0x80, + 0x52, 0x4, 0xdb, 0x3, 0xd4, 0x0, 0x0, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+985E "類" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x7, 0x62, 0xc0, 0xd6, 0xee, 0xff, 0xfe, 0xe6, + 0x2, 0xd2, 0xc3, 0xa0, 0x0, 0x3e, 0x0, 0x0, + 0x6, 0x78, 0xe7, 0x74, 0x0, 0x6a, 0x0, 0x0, + 0x8, 0x9e, 0xf9, 0x85, 0xae, 0xdd, 0xdd, 0xe0, + 0x0, 0x8c, 0xec, 0x40, 0xa4, 0x0, 0x1, 0xe0, + 0x1b, 0xd3, 0xc1, 0xc7, 0xad, 0xcc, 0xcd, 0xe0, + 0x1b, 0x12, 0xc0, 0x1, 0xa5, 0x0, 0x1, 0xe0, + 0x0, 0x1, 0x84, 0x90, 0xa4, 0x0, 0x1, 0xe0, + 0x3, 0x35, 0xd3, 0x95, 0xae, 0xdd, 0xdd, 0xe0, + 0x8, 0x8a, 0xd8, 0x86, 0xa4, 0x0, 0x1, 0xe0, + 0x0, 0x8, 0xf5, 0x0, 0xae, 0xdd, 0xdd, 0xe0, + 0x0, 0x3d, 0x3c, 0x90, 0x5, 0x30, 0x34, 0x0, + 0x7, 0xe4, 0x0, 0xa4, 0x9d, 0x20, 0x2d, 0x90, + 0x8, 0x10, 0x0, 0x1d, 0x70, 0x0, 0x0, 0xa7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+986F "顯" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xcb, 0xbb, 0xbe, 0x6e, 0xef, 0xfe, 0xe1, + 0xc, 0x20, 0x0, 0xe, 0x0, 0xd, 0x30, 0x0, + 0xc, 0xcb, 0xbb, 0xbe, 0x0, 0xf, 0x0, 0x0, + 0xc, 0x42, 0x22, 0x2e, 0xf, 0xdd, 0xdd, 0xc0, + 0xb, 0xb9, 0x9a, 0xad, 0xe, 0x0, 0x1, 0xc0, + 0x3, 0xa0, 0x3, 0xa0, 0xf, 0xdd, 0xdd, 0xc0, + 0xa, 0x2b, 0x1b, 0x2c, 0x1e, 0x0, 0x1, 0xc0, + 0x4f, 0xd9, 0x5f, 0xe8, 0xe, 0x0, 0x1, 0xc0, + 0x4, 0xb4, 0x4, 0xa4, 0xf, 0xdd, 0xdd, 0xc0, + 0x2e, 0x8d, 0x6e, 0x9c, 0x8e, 0x0, 0x1, 0xc0, + 0x15, 0x23, 0x44, 0x33, 0x6f, 0xdd, 0xdd, 0xc0, + 0xa, 0x3b, 0x2b, 0x1d, 0x0, 0x51, 0x4, 0x0, + 0x1d, 0xc, 0x1c, 0x7, 0x4a, 0xb1, 0x1c, 0x80, + 0x67, 0x8, 0x23, 0x0, 0xc7, 0x0, 0x0, 0xc3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+98A8 "風" */ + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0xb5, 0x0, 0x0, 0x1, 0x30, 0xc3, 0x0, + 0x0, 0xb6, 0x79, 0xac, 0xed, 0xa1, 0xc3, 0x0, + 0x0, 0xb5, 0x54, 0x3e, 0x10, 0x0, 0xc3, 0x0, + 0x0, 0xb4, 0x0, 0xe, 0x10, 0x0, 0xc3, 0x0, + 0x0, 0xb4, 0xce, 0xef, 0xee, 0xe0, 0xc3, 0x0, + 0x0, 0xc4, 0xe0, 0xe, 0x10, 0xe0, 0xb4, 0x0, + 0x0, 0xd3, 0xe0, 0xe, 0x10, 0xe0, 0xb4, 0x0, + 0x0, 0xf1, 0xe2, 0x2e, 0x32, 0xe0, 0xa5, 0x0, + 0x0, 0xf0, 0xab, 0xbf, 0xcb, 0xb0, 0x95, 0x0, + 0x4, 0xb0, 0x0, 0xe, 0x14, 0x70, 0x87, 0x0, + 0x9, 0x70, 0x0, 0x1e, 0x44, 0xe4, 0x59, 0x90, + 0x2e, 0x1a, 0xff, 0xed, 0xba, 0xad, 0x2d, 0xb0, + 0x58, 0x0, 0x0, 0x0, 0x0, 0x6, 0xa, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+98DB "飛" */ + 0x1, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x8, 0x60, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x4b, 0x6b, 0x0, + 0x0, 0x2, 0x8e, 0x4d, 0x20, 0x1f, 0xf6, 0x0, + 0x7, 0xdf, 0xa2, 0xd, 0x20, 0xd, 0x59, 0xc0, + 0x2, 0x1a, 0x50, 0xd, 0x20, 0x8, 0xa0, 0x21, + 0x0, 0xa, 0x50, 0xd, 0x20, 0x0, 0xc9, 0x95, + 0x2c, 0xce, 0xdc, 0xcf, 0xdc, 0xc9, 0x6, 0x90, + 0x3, 0x3c, 0x63, 0x3e, 0x53, 0x5d, 0x7, 0x80, + 0x0, 0xd, 0x30, 0xd, 0x20, 0x1e, 0x8b, 0x0, + 0x0, 0x1f, 0x0, 0xd, 0x20, 0xf, 0xea, 0x20, + 0x0, 0x5c, 0x0, 0xd, 0x20, 0xd, 0x36, 0xd0, + 0x0, 0xd5, 0x0, 0xd, 0x20, 0x8, 0x80, 0x2, + 0x9, 0xc0, 0x0, 0xd, 0x20, 0x1, 0xe4, 0x38, + 0x2d, 0x10, 0x0, 0xd, 0x20, 0x0, 0x4c, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+98DF "食" */ + 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8c, 0x6d, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x1b, 0xb7, 0x23, 0xd9, 0x10, 0x0, + 0x0, 0x18, 0xe7, 0x5, 0xc0, 0x8, 0xe8, 0x20, + 0xa, 0xfc, 0xfe, 0xee, 0xee, 0xee, 0xf9, 0xe9, + 0x3, 0x14, 0xc0, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0x4, 0xfd, 0xdd, 0xdd, 0xdd, 0xe0, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0x4, 0xd2, 0x22, 0x22, 0x24, 0xe0, 0x0, + 0x0, 0x4, 0xfb, 0xbb, 0xbb, 0xbb, 0xc9, 0x10, + 0x0, 0x4, 0xc0, 0x6, 0xa2, 0x5, 0xd6, 0x0, + 0x0, 0x4, 0xc0, 0x0, 0x6e, 0xdd, 0x20, 0x0, + 0x0, 0x5, 0xc1, 0x47, 0x70, 0x7e, 0x90, 0x0, + 0x0, 0xa, 0xfe, 0xb7, 0x30, 0x1, 0xae, 0x20, + 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, 0x3, 0x0, + + /* U+98EF "飯" */ + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xf3, 0x0, 0x1, 0x35, 0x8c, 0x90, + 0x0, 0x6c, 0x4d, 0x50, 0xdc, 0xa8, 0x63, 0x0, + 0xa, 0xd3, 0x41, 0xd4, 0xd1, 0x0, 0x0, 0x0, + 0x2b, 0x1, 0xd0, 0x11, 0xd1, 0x0, 0x0, 0x0, + 0x1, 0xcc, 0xfd, 0xb0, 0xdf, 0xff, 0xff, 0xa0, + 0x1, 0xd0, 0x0, 0xe0, 0xdb, 0x40, 0x6, 0x80, + 0x1, 0xfc, 0xcc, 0xe0, 0xd7, 0x80, 0xa, 0x40, + 0x1, 0xd0, 0x0, 0xe0, 0xe2, 0xd0, 0xe, 0x10, + 0x1, 0xd2, 0x22, 0xe0, 0xe0, 0xc3, 0x4c, 0x0, + 0x1, 0xfb, 0xbb, 0xa0, 0xe0, 0x5a, 0xb4, 0x0, + 0x1, 0xd0, 0xa, 0x1, 0xd0, 0xd, 0xd0, 0x0, + 0x1, 0xd0, 0x1c, 0x54, 0x90, 0x1d, 0xd1, 0x0, + 0x3, 0xea, 0xc7, 0xc8, 0x61, 0xc7, 0x8c, 0x10, + 0xa, 0xb4, 0x0, 0x4d, 0x2e, 0x80, 0x8, 0xe3, + 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x30, + + /* U+98F2 "飲" */ + 0x0, 0x0, 0x60, 0x0, 0x3, 0x40, 0x0, 0x0, + 0x0, 0x9, 0xf5, 0x0, 0x9, 0x80, 0x0, 0x0, + 0x0, 0x7d, 0x3d, 0x90, 0xc, 0x50, 0x0, 0x0, + 0x1b, 0xd2, 0x50, 0xba, 0xf, 0xa8, 0x88, 0x81, + 0x2a, 0x0, 0xe0, 0x3, 0x4e, 0x77, 0x77, 0xf1, + 0x1, 0xdd, 0xfd, 0xd1, 0xb7, 0x14, 0x2, 0xd0, + 0x1, 0xe0, 0x0, 0xe5, 0xe1, 0x3d, 0x5, 0x90, + 0x1, 0xfc, 0xcc, 0xf1, 0x20, 0x4d, 0x5, 0x40, + 0x1, 0xe0, 0x0, 0xe1, 0x0, 0x6f, 0x0, 0x0, + 0x1, 0xe2, 0x22, 0xe1, 0x0, 0x9f, 0x40, 0x0, + 0x1, 0xfb, 0xbb, 0xb0, 0x0, 0xec, 0x90, 0x0, + 0x1, 0xe0, 0xa, 0x0, 0x6, 0xe1, 0xe0, 0x0, + 0x1, 0xe0, 0x1b, 0x80, 0x1e, 0x60, 0x99, 0x0, + 0x3, 0xfa, 0xd7, 0xe2, 0xca, 0x0, 0x2f, 0x50, + 0xa, 0xb4, 0x0, 0x7f, 0xa0, 0x0, 0x4, 0xf5, + 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x20, + + /* U+9928 "館" */ + 0x0, 0x0, 0x80, 0x0, 0x0, 0x15, 0x0, 0x0, + 0x0, 0xb, 0xe5, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0x9a, 0x1c, 0x82, 0xcc, 0xce, 0xcc, 0xc0, + 0x1c, 0xb3, 0x60, 0xba, 0xa1, 0x11, 0x11, 0xc1, + 0x18, 0x1, 0xd0, 0x3, 0x85, 0x55, 0x55, 0x90, + 0x1, 0xdd, 0xfd, 0xb0, 0x2e, 0xbb, 0xbd, 0x0, + 0x1, 0xc0, 0x0, 0xe0, 0x2b, 0x0, 0xd, 0x0, + 0x1, 0xe9, 0x99, 0xe0, 0x2b, 0x0, 0xd, 0x0, + 0x1, 0xd4, 0x44, 0xe0, 0x2f, 0xee, 0xec, 0x0, + 0x1, 0xe6, 0x66, 0xe0, 0x2b, 0x0, 0x0, 0x0, + 0x1, 0xd5, 0x56, 0x40, 0x2f, 0xee, 0xee, 0x70, + 0x1, 0xc0, 0xd, 0x10, 0x2b, 0x0, 0x6, 0x70, + 0x1, 0xc0, 0x3d, 0x80, 0x2b, 0x0, 0x6, 0x70, + 0x4, 0xeb, 0xa5, 0xd0, 0x2c, 0x33, 0x38, 0x70, + 0x8, 0x71, 0x0, 0x61, 0x2e, 0xbb, 0xbc, 0x70, + + /* U+9996 "首" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x1, 0xe5, 0x0, 0x0, 0x3f, 0x20, 0x0, + 0x0, 0x0, 0x4d, 0x10, 0x1, 0xd6, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0xc, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x3d, 0xdd, 0xdf, 0xdd, 0xdd, 0xd3, 0x0, + 0x0, 0x3d, 0x22, 0x22, 0x22, 0x22, 0xd4, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, + 0x0, 0x3f, 0xee, 0xee, 0xee, 0xee, 0xf4, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, + 0x0, 0x3d, 0x11, 0x11, 0x11, 0x11, 0xd4, 0x0, + 0x0, 0x3f, 0xcc, 0xcc, 0xcc, 0xcc, 0xf4, 0x0, + 0x0, 0x3d, 0x0, 0x0, 0x0, 0x0, 0xd4, 0x0, + 0x0, 0x3f, 0xdd, 0xdd, 0xdd, 0xdd, 0xf4, 0x0, + 0x0, 0x3d, 0x11, 0x11, 0x11, 0x11, 0xd4, 0x0, + + /* U+9999 "香" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x20, 0x0, + 0x0, 0x2, 0x34, 0x67, 0x9b, 0xdf, 0xb1, 0x0, + 0x0, 0x8c, 0xba, 0x9c, 0xb4, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1e, 0xee, 0xee, 0xef, 0xfe, 0xee, 0xee, 0xe1, + 0x0, 0x0, 0x5, 0xeb, 0xae, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x6e, 0x39, 0x82, 0xe8, 0x0, 0x0, + 0x0, 0x9, 0xe2, 0x9, 0x80, 0x1c, 0xb3, 0x0, + 0x6, 0xea, 0x10, 0x4, 0x40, 0x0, 0x7f, 0xa1, + 0x1b, 0x4b, 0xee, 0xee, 0xee, 0xee, 0xe1, 0x80, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xb, 0xec, 0xcc, 0xcc, 0xcd, 0xe0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xb, 0x50, 0x0, 0x0, 0x2, 0xe0, 0x0, + 0x0, 0xb, 0xed, 0xdd, 0xdd, 0xde, 0xe0, 0x0, + + /* U+99C4 "駄" */ + 0xc, 0xee, 0xfe, 0xe1, 0x0, 0x4c, 0x0, 0x0, + 0xc, 0x30, 0xe0, 0x0, 0x0, 0x4c, 0x0, 0x0, + 0xc, 0x41, 0xe0, 0x0, 0x0, 0x4c, 0x0, 0x0, + 0xc, 0xdc, 0xfc, 0x90, 0x0, 0x4c, 0x0, 0x0, + 0xc, 0x30, 0xe0, 0x7, 0xcc, 0xdf, 0xdc, 0xc4, + 0xc, 0xee, 0xfd, 0xa0, 0x0, 0x6f, 0x50, 0x0, + 0xc, 0x30, 0xe0, 0x0, 0x0, 0x9f, 0x80, 0x0, + 0xc, 0x42, 0xe1, 0x10, 0x0, 0xd8, 0xb0, 0x0, + 0x9, 0xcc, 0xcc, 0xf3, 0x1, 0xf1, 0xf0, 0x0, + 0x3, 0x23, 0x33, 0xc2, 0x8, 0xa0, 0xb5, 0x0, + 0xa, 0xa5, 0x5a, 0xe0, 0x1f, 0x90, 0x6b, 0x0, + 0x38, 0x83, 0x92, 0xf0, 0xab, 0x9b, 0x1e, 0x30, + 0x74, 0x31, 0x3, 0xd8, 0xe1, 0xb, 0x87, 0xd0, + 0x0, 0x1, 0xde, 0x7c, 0x30, 0x1, 0x10, 0xb3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+99C5 "駅" */ + 0x9, 0xfe, 0xfe, 0xe3, 0x2f, 0xff, 0xff, 0xe0, + 0x9, 0x50, 0xe0, 0x0, 0x2c, 0x0, 0x1, 0xe0, + 0x9, 0x61, 0xe1, 0x10, 0x2c, 0x0, 0x1, 0xe0, + 0x9, 0xdc, 0xfc, 0xc0, 0x2c, 0x0, 0x1, 0xe0, + 0x9, 0x50, 0xe0, 0x0, 0x2c, 0x0, 0x1, 0xe0, + 0x9, 0xed, 0xfd, 0xd0, 0x2d, 0x44, 0x45, 0xe0, + 0x9, 0x50, 0xe0, 0x0, 0x3e, 0x9d, 0xb9, 0x80, + 0x9, 0xca, 0xfa, 0xa3, 0x4b, 0x7, 0x80, 0x0, + 0x1, 0x22, 0x33, 0xb4, 0x69, 0x3, 0xb0, 0x0, + 0x8, 0x43, 0x48, 0xa3, 0x78, 0x0, 0xe1, 0x0, + 0xb, 0x63, 0x88, 0xd2, 0xa6, 0x0, 0x97, 0x0, + 0xa, 0x54, 0x70, 0xd1, 0xf1, 0x0, 0x2e, 0x10, + 0x55, 0x11, 0x1, 0xe8, 0xb0, 0x0, 0x9, 0xc1, + 0x0, 0x0, 0xbe, 0x7c, 0x20, 0x0, 0x0, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9A12 "騒" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xee, 0xee, 0xd4, 0xef, 0xee, 0xef, 0x80, + 0x8, 0x60, 0xe0, 0x0, 0x5b, 0x0, 0x1e, 0x20, + 0x8, 0x71, 0xe1, 0x10, 0xc, 0x60, 0xc9, 0x0, + 0x8, 0xdc, 0xfc, 0x80, 0x1, 0xdb, 0xb0, 0x0, + 0x8, 0x60, 0xe0, 0x0, 0x39, 0xdb, 0xd8, 0x20, + 0x8, 0xed, 0xfd, 0x9c, 0xd7, 0x2a, 0x29, 0xe5, + 0x8, 0x60, 0xe0, 0x1, 0x44, 0x5f, 0x44, 0x40, + 0x8, 0xdb, 0xfb, 0xb4, 0xd7, 0x8f, 0x78, 0xd0, + 0x1, 0x22, 0x22, 0xe4, 0xb0, 0x1e, 0x1, 0xd0, + 0x3, 0x12, 0x44, 0xe3, 0xc3, 0x4f, 0x34, 0xd0, + 0xb, 0x75, 0x69, 0xe2, 0xaa, 0xbf, 0xaa, 0x90, + 0xb, 0x64, 0x94, 0xd0, 0x0, 0x1e, 0xb, 0x20, + 0x56, 0x22, 0x3, 0xb2, 0x35, 0x7f, 0x8c, 0xd0, + 0x0, 0x0, 0xcd, 0x58, 0xa8, 0x75, 0x42, 0x77, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9A13 "験" */ + 0x8, 0xfe, 0xfe, 0xe1, 0x0, 0x8f, 0x40, 0x0, + 0x8, 0x60, 0xe0, 0x0, 0x4, 0xb2, 0xe2, 0x0, + 0x8, 0x94, 0xe4, 0x30, 0x5d, 0x10, 0x4d, 0x30, + 0x8, 0xdb, 0xfb, 0x99, 0xd4, 0x22, 0x27, 0xe6, + 0x8, 0x60, 0xe0, 0x8, 0x1b, 0xbf, 0xba, 0x24, + 0x8, 0xdb, 0xfb, 0x90, 0x0, 0x1d, 0x0, 0x0, + 0x8, 0x71, 0xe1, 0x3, 0xfd, 0xdf, 0xdd, 0xf0, + 0x8, 0x95, 0xe5, 0x54, 0xc0, 0x1d, 0x0, 0xf0, + 0x4, 0x77, 0x77, 0xd6, 0xc0, 0x2c, 0x0, 0xf0, + 0x4, 0x22, 0x45, 0xc5, 0xdd, 0xef, 0xed, 0xc0, + 0xb, 0x74, 0x7a, 0xd1, 0x0, 0xbb, 0xb0, 0x0, + 0xb, 0x54, 0x91, 0xf0, 0x7, 0xc0, 0xb6, 0x0, + 0x56, 0x21, 0x1, 0xd1, 0xad, 0x10, 0x2d, 0x90, + 0x0, 0x0, 0xce, 0x7c, 0x80, 0x0, 0x1, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9A57 "驗" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb2, 0x0, 0x0, + 0xc, 0xee, 0xfe, 0xa0, 0x7, 0xea, 0x0, 0x0, + 0xc, 0x3, 0xa0, 0x0, 0x4c, 0x9, 0xa0, 0x0, + 0xc, 0x57, 0xc4, 0x16, 0xd1, 0x0, 0x9c, 0x20, + 0xc, 0xab, 0xd9, 0x8d, 0xce, 0xee, 0xe8, 0xc0, + 0xc, 0x3, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xde, 0xfd, 0x28, 0xcc, 0x3b, 0xcc, 0x30, + 0xc, 0x3, 0xa0, 0xa, 0x9, 0x3c, 0x8, 0x40, + 0xc, 0x89, 0xd7, 0x5a, 0x9, 0x3c, 0x8, 0x40, + 0x6, 0x77, 0x79, 0xbb, 0xce, 0x3e, 0xce, 0x40, + 0x6, 0x46, 0x83, 0xa0, 0x50, 0x0, 0x61, 0x0, + 0x28, 0xb8, 0x5a, 0x90, 0xe0, 0x1, 0xf0, 0x0, + 0x55, 0xb4, 0x46, 0x86, 0xe9, 0x7, 0xe3, 0x0, + 0x81, 0x40, 0x7, 0x9d, 0x18, 0x9e, 0x5e, 0x50, + 0x0, 0x0, 0xcd, 0xa6, 0x0, 0x95, 0x2, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9AD4 "體" */ + 0x2f, 0xdd, 0xf1, 0x0, 0x3a, 0xd, 0x0, 0x2, + 0xc0, 0x9, 0x18, 0xec, 0xfc, 0xfc, 0xd0, 0x2f, + 0xb7, 0x91, 0x87, 0xb, 0xb, 0xd, 0x2, 0xc0, + 0xa9, 0x18, 0xdc, 0xec, 0xeb, 0xd0, 0x7d, 0x5c, + 0xb6, 0x87, 0xb, 0xb, 0xd, 0xf, 0x77, 0x77, + 0xe8, 0xdc, 0xdc, 0xdc, 0xc0, 0xc6, 0x66, 0x6a, + 0x43, 0x33, 0x33, 0x33, 0x11, 0xe4, 0x4c, 0x16, + 0x66, 0x66, 0x66, 0x61, 0x1f, 0xbb, 0xe1, 0xf, + 0xba, 0xaa, 0xd7, 0x1, 0xe0, 0xa, 0x10, 0xf1, + 0x0, 0x7, 0x70, 0x1f, 0xaa, 0xe1, 0xe, 0xcb, + 0xbc, 0xd7, 0x1, 0xe2, 0x2b, 0x10, 0xb, 0x0, + 0x49, 0x0, 0x1e, 0x0, 0xb1, 0x0, 0x95, 0x9, + 0x50, 0x1, 0xe0, 0x9c, 0x1d, 0xde, 0xfd, 0xfd, + 0xd6, + + /* U+9AD8 "高" */ + 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0xb, + 0xbb, 0xbb, 0xbd, 0xeb, 0xbb, 0xbb, 0xb0, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0, 0x7, + 0xdc, 0xcc, 0xcc, 0xcd, 0x80, 0x0, 0x0, 0x87, + 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x8, 0xda, + 0xaa, 0xaa, 0xad, 0xa0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x21, 0x0, 0x6, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0x60, 0x6a, 0x11, 0x11, 0x11, + 0x11, 0x11, 0xa6, 0x6, 0x90, 0x6d, 0xdd, 0xdd, + 0xd3, 0x9, 0x60, 0x69, 0x7, 0x80, 0x0, 0xb, + 0x30, 0x96, 0x6, 0x90, 0x79, 0x11, 0x11, 0xb3, + 0x9, 0x60, 0x69, 0x7, 0xda, 0xaa, 0xaa, 0x20, + 0xa6, 0x6, 0x90, 0x11, 0x0, 0x0, 0x4, 0xcc, + 0x30, + + /* U+9AEA "髪" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, + 0x0, 0x8d, 0xaa, 0xaa, 0x40, 0x3, 0xba, 0x0, + 0x0, 0x8c, 0xaa, 0xaa, 0x6, 0xda, 0x40, 0x0, + 0x0, 0x89, 0x44, 0x44, 0x1, 0x10, 0x2b, 0x40, + 0x0, 0x8a, 0x66, 0x66, 0x1, 0x6b, 0xb3, 0x0, + 0xa, 0xce, 0xcb, 0xdb, 0xb2, 0x72, 0x0, 0x50, + 0x0, 0x6b, 0x0, 0xa8, 0x0, 0x1, 0x7d, 0x70, + 0x6, 0xfc, 0xbb, 0x9c, 0x58, 0xdb, 0x71, 0x0, + 0x0, 0x0, 0x5, 0xa0, 0x1, 0x0, 0x0, 0x0, + 0xd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0xdd, 0xd0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xdc, 0xcc, 0xcf, 0x90, 0x0, + 0x0, 0xa, 0xa2, 0xd6, 0x1, 0x9b, 0x0, 0x0, + 0x1, 0xcc, 0x0, 0x2c, 0xef, 0xa1, 0x0, 0x0, + 0x2e, 0x85, 0xbe, 0xd9, 0x45, 0x9d, 0xdb, 0x90, + 0x2, 0x1, 0x31, 0x0, 0x0, 0x0, 0x2, 0x30, + + /* U+9B5A "魚" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xee, 0xef, 0xc0, 0x0, 0x0, + 0x0, 0x3, 0xf3, 0x0, 0xd, 0x60, 0x0, 0x0, + 0x0, 0x3e, 0x70, 0x0, 0x8d, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0xee, 0xff, 0xee, 0xed, 0x0, + 0xc, 0xae, 0x0, 0x5, 0xb0, 0x0, 0x2e, 0x0, + 0x0, 0x1e, 0x0, 0x5, 0xb0, 0x0, 0x2e, 0x0, + 0x0, 0x1f, 0xdd, 0xde, 0xfd, 0xdd, 0xee, 0x0, + 0x0, 0x1e, 0x0, 0x5, 0xb0, 0x0, 0x2e, 0x0, + 0x0, 0x1e, 0x0, 0x5, 0xb0, 0x0, 0x2e, 0x0, + 0x0, 0x1f, 0xee, 0xef, 0xfe, 0xee, 0xfe, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + 0x0, 0x5d, 0x2, 0xe0, 0xb, 0x50, 0x3e, 0x30, + 0x1, 0xe4, 0x0, 0xf0, 0x4, 0xd0, 0x5, 0xe1, + 0xc, 0x80, 0x0, 0xf2, 0x0, 0xe2, 0x0, 0xb8, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, + + /* U+9CE5 "鳥" */ + 0x0, 0x0, 0x0, 0x3, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xcc, 0xcc, 0xcc, 0xcd, 0xe0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x1f, 0xcc, 0xcc, 0xcc, 0xcc, 0xe0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x1, 0xe0, 0x0, + 0x0, 0x1f, 0xcc, 0xcc, 0xcc, 0xcd, 0xc0, 0x0, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd2, + 0x0, 0x1e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1d, 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xa0, + 0x0, 0x51, 0x12, 0x4, 0x10, 0x80, 0x6, 0x90, + 0x0, 0xe1, 0x3b, 0x7, 0x70, 0x86, 0x8, 0x70, + 0x9, 0x90, 0x1e, 0x2, 0xc0, 0x13, 0xc, 0x40, + 0x1a, 0x0, 0x5, 0x0, 0x0, 0x3d, 0xeb, 0x0, + + /* U+9E97 "麗" */ + 0x5, 0xcc, 0xcc, 0xcb, 0x5c, 0xcc, 0xcc, 0xc4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xea, 0xaa, 0xc8, 0xd, 0xaa, 0xaa, 0xe0, + 0x0, 0xe1, 0xc2, 0x68, 0xd, 0x1b, 0x41, 0xe0, + 0x0, 0xc0, 0x35, 0x5b, 0x9b, 0x11, 0x71, 0xb0, + 0x0, 0xdc, 0xcc, 0xec, 0xdd, 0xec, 0xcc, 0xc4, + 0x0, 0xe1, 0x1, 0xe0, 0x2, 0xd0, 0x0, 0x0, + 0x0, 0xec, 0xbc, 0xfb, 0xbc, 0xfb, 0xbc, 0xe0, + 0x0, 0xf1, 0x1, 0xe0, 0x2, 0xd0, 0x1, 0xe0, + 0x0, 0xfc, 0xed, 0xbb, 0xbe, 0xeb, 0xbb, 0xa0, + 0x1, 0xe0, 0xa6, 0x0, 0x8, 0x80, 0x27, 0x80, + 0x5, 0xb0, 0xad, 0xbb, 0x78, 0xdb, 0x95, 0x10, + 0xb, 0x60, 0xb6, 0x13, 0x38, 0x80, 0x0, 0x2b, + 0x1d, 0x3, 0xec, 0x97, 0x34, 0xed, 0xdd, 0xe6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9EBC "麼" */ + 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x22, 0x22, 0x23, 0xf4, 0x22, 0x22, 0x20, + 0x0, 0xfa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, + 0x0, 0xf0, 0x0, 0xa0, 0x0, 0x9, 0x10, 0x0, + 0x0, 0xf1, 0xbb, 0xfb, 0x7a, 0xbf, 0xbb, 0x70, + 0x0, 0xf0, 0x2a, 0xf7, 0x22, 0x9f, 0xe3, 0x10, + 0x0, 0xf0, 0x3c, 0xeb, 0x53, 0xbc, 0x7b, 0x0, + 0x0, 0xf4, 0xd1, 0xd0, 0x7d, 0x1c, 0x18, 0xc1, + 0x0, 0xf4, 0x20, 0xd0, 0x51, 0xb, 0x10, 0x40, + 0x1, 0xe0, 0x0, 0xb, 0x70, 0x3, 0x0, 0x0, + 0x3, 0xc0, 0x3, 0xc4, 0x2, 0xd9, 0x0, 0x0, + 0x5, 0xa0, 0x5f, 0xcb, 0xde, 0x52, 0x50, 0x0, + 0x8, 0x70, 0x1, 0x3c, 0xa1, 0x0, 0xd2, 0x0, + 0xc, 0x40, 0x2a, 0xd6, 0x35, 0x67, 0xcb, 0x0, + 0x2e, 0x4, 0xff, 0xdc, 0xa9, 0x86, 0x5c, 0x40, + 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x30, + + /* U+9EC4 "黄" */ + 0x0, 0x0, 0x1f, 0x0, 0x0, 0xe2, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x1f, 0x0, 0x0, 0xf2, 0x0, 0x0, + 0x2, 0x22, 0x3f, 0x22, 0x22, 0xf4, 0x22, 0x20, + 0x1d, 0xdd, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0xd2, + 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xdd, 0xde, 0xed, 0xdd, 0xe7, 0x0, + 0x0, 0x5a, 0x0, 0x8, 0x80, 0x0, 0x97, 0x0, + 0x0, 0x5e, 0xcc, 0xce, 0xec, 0xcc, 0xe7, 0x0, + 0x0, 0x5a, 0x0, 0x8, 0x80, 0x0, 0x97, 0x0, + 0x0, 0x5e, 0xbb, 0xbe, 0xdb, 0xbb, 0xe7, 0x0, + 0x0, 0x1, 0x27, 0x31, 0x12, 0x83, 0x10, 0x0, + 0x0, 0x38, 0xe9, 0x20, 0x1, 0x7d, 0xb5, 0x0, + 0xa, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x4b, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9ED2 "黒" */ + 0x0, 0x5f, 0xdd, 0xdf, 0xed, 0xdd, 0xf6, 0x0, + 0x0, 0x5a, 0x0, 0x9, 0x70, 0x0, 0x96, 0x0, + 0x0, 0x5b, 0x11, 0x19, 0x81, 0x11, 0xa6, 0x0, + 0x0, 0x5e, 0xbb, 0xbe, 0xdb, 0xbb, 0xe6, 0x0, + 0x0, 0x5a, 0x0, 0x9, 0x70, 0x0, 0x96, 0x0, + 0x0, 0x5f, 0xee, 0xef, 0xfe, 0xee, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xad, 0xdd, 0xdf, 0xed, 0xdd, 0xdd, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x11, 0x19, 0x81, 0x11, 0x11, 0x10, + 0x1c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc1, + 0x0, 0x45, 0x1, 0x20, 0x4, 0x0, 0x63, 0x0, + 0x0, 0xd4, 0x5, 0xa0, 0xe, 0x20, 0x4e, 0x20, + 0xa, 0xa0, 0x3, 0xc0, 0x9, 0x80, 0x8, 0xc0, + 0x5, 0x0, 0x1, 0x40, 0x2, 0x20, 0x0, 0x50, + + /* U+9EDE "點" */ + 0xc, 0xdc, 0xec, 0xe6, 0x0, 0x1e, 0x0, 0x0, + 0xc, 0x51, 0xa2, 0x86, 0x0, 0x1e, 0x0, 0x0, + 0xc, 0x84, 0xa9, 0x86, 0x0, 0x1e, 0x0, 0x0, + 0xc, 0x57, 0xa9, 0x66, 0x0, 0x1f, 0xee, 0xe5, + 0xc, 0x22, 0xa2, 0x66, 0x0, 0x1e, 0x11, 0x10, + 0xa, 0xcd, 0xfc, 0xc5, 0x0, 0x1e, 0x0, 0x0, + 0x2, 0x35, 0xd3, 0x31, 0x0, 0x1e, 0x0, 0x0, + 0x9, 0xab, 0xea, 0xa5, 0x7e, 0xff, 0xee, 0xd0, + 0x0, 0x2, 0xc0, 0x1, 0x88, 0x0, 0x3, 0xd0, + 0x2c, 0xde, 0xfe, 0xdb, 0x87, 0x0, 0x2, 0xd0, + 0x3, 0x22, 0x21, 0x70, 0x87, 0x0, 0x2, 0xd0, + 0x9, 0x4b, 0x48, 0x68, 0x87, 0x0, 0x2, 0xd0, + 0xd, 0xc, 0xc, 0x9, 0x8d, 0xbb, 0xbc, 0xd0, + 0x48, 0x5, 0x1, 0x0, 0x89, 0x33, 0x35, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9EE8 "黨" */ + 0x0, 0x3, 0xb0, 0x9, 0x80, 0xb, 0x40, 0x0, + 0x9, 0xa9, 0xca, 0x9b, 0xb9, 0xac, 0x9a, 0x80, + 0xb, 0x41, 0x99, 0x99, 0x99, 0x99, 0x15, 0xa0, + 0x6, 0x21, 0xd0, 0x0, 0x0, 0xe, 0x13, 0x50, + 0x0, 0x1, 0xa9, 0x99, 0x99, 0x9a, 0x10, 0x0, + 0x0, 0x4a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa5, 0x0, + 0x0, 0x78, 0x27, 0x9, 0x70, 0x90, 0x78, 0x0, + 0x0, 0x7a, 0x3b, 0x4a, 0x96, 0x83, 0x98, 0x0, + 0x0, 0x36, 0x66, 0x6c, 0xb6, 0x66, 0x63, 0x0, + 0x0, 0x9b, 0xbb, 0xbe, 0xdb, 0xbb, 0xbb, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x70, 0x0, 0x0, 0x0, + 0xb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb0, + 0x0, 0x49, 0x3, 0x50, 0x8, 0x0, 0x86, 0x0, + 0x5, 0xd2, 0x3, 0xc0, 0xb, 0x50, 0x1d, 0x70, + 0x3, 0x10, 0x0, 0x40, 0x2, 0x10, 0x1, 0x40, + + /* U+9F13 "鼓" */ + 0x0, 0x1, 0xe0, 0x0, 0x0, 0xe, 0x10, 0x0, + 0x1b, 0xbb, 0xfb, 0xba, 0x0, 0xe, 0x10, 0x0, + 0x0, 0x1, 0xe0, 0x1, 0xee, 0xef, 0xfe, 0xe4, + 0x7, 0x9a, 0xf9, 0x96, 0x0, 0xe, 0x20, 0x0, + 0x2, 0x33, 0x33, 0x32, 0x0, 0xe, 0x10, 0x0, + 0x5, 0xaa, 0xaa, 0xa3, 0x89, 0x9f, 0xa9, 0x80, + 0x7, 0xa3, 0x33, 0xc4, 0x8c, 0x66, 0x6a, 0xb0, + 0x7, 0x80, 0x0, 0xb4, 0x1e, 0x0, 0xc, 0x50, + 0x7, 0xfd, 0xdd, 0xf4, 0x9, 0x70, 0x3e, 0x0, + 0x0, 0x80, 0x4, 0x60, 0x2, 0xe2, 0xd4, 0x0, + 0x0, 0xa6, 0x9, 0x60, 0x0, 0x7f, 0x90, 0x0, + 0x0, 0x58, 0xe, 0x56, 0x1, 0xce, 0xc1, 0x0, + 0x28, 0xbd, 0xfd, 0xb9, 0x7e, 0x80, 0x9e, 0x60, + 0x17, 0x42, 0x0, 0x9, 0xb3, 0x0, 0x5, 0xd3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+9F3B "鼻" */ + 0x0, 0x0, 0x0, 0x2, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xe, 0x50, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xcb, 0xbb, 0xbb, 0xbd, 0xa0, 0x0, + 0x0, 0xa, 0xa7, 0x77, 0x77, 0x7b, 0xa0, 0x0, + 0x0, 0xa, 0xb9, 0x99, 0x99, 0x9b, 0xa0, 0x0, + 0x0, 0xa, 0x72, 0x22, 0x22, 0x27, 0xa0, 0x0, + 0x0, 0x6, 0x99, 0x99, 0x99, 0x99, 0x50, 0x0, + 0x0, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0, + 0x0, 0xf3, 0x33, 0x3a, 0x93, 0x33, 0x4f, 0x0, + 0x0, 0xf5, 0x55, 0x5b, 0xa5, 0x55, 0x5f, 0x0, + 0x0, 0xca, 0xaa, 0xab, 0xba, 0xaa, 0xbc, 0x0, + 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x20, + 0x1b, 0xbb, 0xde, 0xbb, 0xbb, 0xfc, 0xbb, 0xb1, + 0x0, 0x3, 0xd4, 0x0, 0x0, 0xc3, 0x0, 0x0, + 0x9, 0xb8, 0x20, 0x0, 0x0, 0xc3, 0x0, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F043 "" */ + 0x0, 0x0, 0x4e, 0x40, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x1, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0x90, 0x0, 0x0, 0x2f, + 0xff, 0xff, 0x30, 0x0, 0xc, 0xff, 0xff, 0xfc, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x2, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x2f, 0xff, 0xff, 0xff, 0xfe, 0xf2, 0xbf, 0xff, + 0xff, 0xfe, 0x9f, 0xa1, 0xbf, 0xff, 0xff, 0x92, + 0xff, 0xa2, 0x2f, 0xff, 0xf2, 0x4, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x2, 0x9e, 0xfe, 0x92, 0x0, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0C9 "" */ + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x12, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x12, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, + + /* U+F0E0 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xd2, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2d, + 0xff, 0x62, 0xcf, 0xff, 0xff, 0xfc, 0x26, 0xff, + 0xff, 0xfa, 0x18, 0xff, 0xff, 0x81, 0xaf, 0xff, + 0xff, 0xff, 0xe3, 0x4d, 0xd4, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x81, 0x18, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+FF08 "(" */ + 0x0, 0x7, 0x0, 0x9, 0xa0, 0x3, 0xd0, 0x0, + 0xc5, 0x0, 0x2e, 0x0, 0x7, 0x90, 0x0, 0xa6, + 0x0, 0xb, 0x40, 0x0, 0xb4, 0x0, 0x9, 0x60, + 0x0, 0x79, 0x0, 0x1, 0xe0, 0x0, 0xb, 0x60, + 0x0, 0x2e, 0x10, 0x0, 0x6c, 0x0, 0x0, 0x50, + + /* U+FF09 ")" */ + 0x7, 0x0, 0x0, 0xa9, 0x0, 0x0, 0xd3, 0x0, + 0x5, 0xc0, 0x0, 0xe, 0x20, 0x0, 0x97, 0x0, + 0x6, 0xa0, 0x0, 0x4b, 0x0, 0x4, 0xb0, 0x0, + 0x69, 0x0, 0xa, 0x60, 0x0, 0xe1, 0x0, 0x6b, + 0x0, 0x1e, 0x20, 0xc, 0x60, 0x0, 0x50, 0x0, + + /* U+FF0C "," */ + 0x1b, 0x70, 0x3f, 0xf0, 0x4, 0xf0, 0x6, 0xb0, + 0x8d, 0x20, 0x40, 0x0, + + /* U+FF11 "1" */ + 0x0, 0x39, 0xa0, 0x0, 0x1, 0xee, 0xfe, 0x0, + 0x0, 0x0, 0x6, 0xe0, 0x0, 0x0, 0x0, 0x6e, + 0x0, 0x0, 0x0, 0x6, 0xe0, 0x0, 0x0, 0x0, + 0x6e, 0x0, 0x0, 0x0, 0x6, 0xe0, 0x0, 0x0, + 0x0, 0x6e, 0x0, 0x0, 0x0, 0x6, 0xe0, 0x0, + 0x0, 0x0, 0x6e, 0x0, 0x0, 0x11, 0x17, 0xe1, + 0x11, 0xf, 0xff, 0xff, 0xff, 0xf3, + + /* U+FF12 "2" */ + 0x0, 0x4b, 0xed, 0x91, 0x0, 0x7, 0xf8, 0x44, + 0xcd, 0x0, 0xb, 0x30, 0x0, 0xe, 0x60, 0x0, + 0x0, 0x0, 0xb, 0x90, 0x0, 0x0, 0x0, 0xe, + 0x60, 0x0, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, + 0x1, 0xe7, 0x0, 0x0, 0x0, 0x1c, 0xb0, 0x0, + 0x0, 0x1, 0xdc, 0x0, 0x0, 0x0, 0x2d, 0xb0, + 0x0, 0x0, 0x3, 0xea, 0x11, 0x11, 0x10, 0xf, + 0xff, 0xff, 0xff, 0xf3 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 57, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 80, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18, .adv_w = 117, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 31, .adv_w = 141, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 85, .adv_w = 141, .box_w = 8, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149, .adv_w = 234, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 233, .adv_w = 172, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 299, .adv_w = 69, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 304, .adv_w = 85, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 340, .adv_w = 85, .box_w = 4, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 376, .adv_w = 118, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 394, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 435, .adv_w = 69, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 445, .adv_w = 88, .box_w = 5, .box_h = 2, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 450, .adv_w = 69, .box_w = 3, .box_h = 3, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 455, .adv_w = 100, .box_w = 7, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 511, .adv_w = 141, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 559, .adv_w = 141, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 601, .adv_w = 141, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 649, .adv_w = 141, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 697, .adv_w = 141, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 751, .adv_w = 141, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 799, .adv_w = 141, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 853, .adv_w = 141, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 907, .adv_w = 141, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 961, .adv_w = 141, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1009, .adv_w = 69, .box_w = 3, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1023, .adv_w = 69, .box_w = 4, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1047, .adv_w = 141, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1083, .adv_w = 141, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 1106, .adv_w = 141, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1142, .adv_w = 120, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1184, .adv_w = 239, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1289, .adv_w = 154, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1349, .adv_w = 167, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1403, .adv_w = 162, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1463, .adv_w = 175, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1517, .adv_w = 150, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1565, .adv_w = 140, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1613, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1673, .adv_w = 185, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1727, .adv_w = 73, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1739, .adv_w = 136, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1781, .adv_w = 164, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1841, .adv_w = 137, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1889, .adv_w = 206, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1955, .adv_w = 184, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2009, .adv_w = 189, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2075, .adv_w = 160, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2129, .adv_w = 189, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 2225, .adv_w = 161, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2279, .adv_w = 151, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2333, .adv_w = 152, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2393, .adv_w = 183, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2447, .adv_w = 145, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2507, .adv_w = 223, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2591, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2645, .adv_w = 134, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2699, .adv_w = 154, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2753, .adv_w = 85, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2785, .adv_w = 100, .box_w = 7, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2841, .adv_w = 85, .box_w = 4, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2873, .adv_w = 141, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 2898, .adv_w = 143, .box_w = 9, .box_h = 1, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2903, .adv_w = 154, .box_w = 4, .box_h = 5, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 2913, .adv_w = 143, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2949, .adv_w = 157, .box_w = 8, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3001, .adv_w = 130, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3037, .adv_w = 157, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3096, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3137, .adv_w = 81, .box_w = 6, .box_h = 13, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3176, .adv_w = 143, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3235, .adv_w = 154, .box_w = 8, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3287, .adv_w = 69, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3307, .adv_w = 69, .box_w = 5, .box_h = 17, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 3350, .adv_w = 139, .box_w = 8, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3402, .adv_w = 71, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3422, .adv_w = 236, .box_w = 13, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3481, .adv_w = 155, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3517, .adv_w = 154, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3558, .adv_w = 157, .box_w = 8, .box_h = 13, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3610, .adv_w = 157, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3669, .adv_w = 97, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3696, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3728, .adv_w = 95, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3764, .adv_w = 154, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3800, .adv_w = 131, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3836, .adv_w = 203, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3895, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3931, .adv_w = 131, .box_w = 8, .box_h = 13, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3983, .adv_w = 120, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4019, .adv_w = 85, .box_w = 5, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4059, .adv_w = 68, .box_w = 2, .box_h = 18, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 4077, .adv_w = 85, .box_w = 5, .box_h = 16, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4117, .adv_w = 141, .box_w = 9, .box_h = 3, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 4131, .adv_w = 256, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4146, .adv_w = 256, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4161, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4252, .adv_w = 256, .box_w = 6, .box_h = 11, .ofs_x = 10, .ofs_y = 2}, + {.bitmap_index = 4285, .adv_w = 256, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4318, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4390, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4495, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4561, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4646, .adv_w = 256, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 4723, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 4784, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4882, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 4987, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5092, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5212, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5296, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5401, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5471, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5555, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5653, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 5766, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5844, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 5949, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 6033, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6145, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6229, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 6313, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6411, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6531, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6636, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6748, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6846, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 6944, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7042, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7147, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7245, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7305, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7382, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7495, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7586, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7677, .adv_w = 256, .box_w = 11, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 7754, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 7852, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 7950, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 8035, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8148, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8268, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8359, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8464, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8577, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8682, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8780, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8893, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 8998, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9110, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9222, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9334, .adv_w = 256, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9422, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9518, .adv_w = 256, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9608, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 9713, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9833, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9946, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10030, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10128, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10226, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10324, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 10429, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10514, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10619, .adv_w = 256, .box_w = 11, .box_h = 12, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 10685, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10783, .adv_w = 256, .box_w = 10, .box_h = 11, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 10838, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 10922, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11006, .adv_w = 256, .box_w = 10, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 11081, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11172, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11292, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11390, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11503, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11601, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11699, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11759, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11844, .adv_w = 256, .box_w = 11, .box_h = 11, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 11905, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 11996, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 12080, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 12140, .adv_w = 256, .box_w = 14, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12217, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12315, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12406, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12519, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12617, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12730, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 12821, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12949, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13047, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13167, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 13239, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 13344, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13449, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13561, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13659, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13764, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13855, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 13968, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14073, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 14193, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 14271, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 14369, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 14489, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 14587, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 14659, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 14750, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 14841, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 14954, .adv_w = 256, .box_w = 9, .box_h = 13, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 15013, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 4, .ofs_y = -1}, + {.bitmap_index = 15083, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 15181, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 15251, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 15349, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 15421, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 15505, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 15618, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 15723, .adv_w = 256, .box_w = 11, .box_h = 13, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 15795, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 15885, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 15969, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 16047, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 16152, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 16250, .adv_w = 256, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16340, .adv_w = 256, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16430, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 16528, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16633, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 16738, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 16829, .adv_w = 256, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 16906, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 17004, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 17095, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 17186, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 17258, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 17356, .adv_w = 256, .box_w = 12, .box_h = 9, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17410, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 17460, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 17538, .adv_w = 256, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 17629, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 17699, .adv_w = 256, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17797, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 17875, .adv_w = 256, .box_w = 12, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 17941, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 18019, .adv_w = 256, .box_w = 13, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 18104, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 18176, .adv_w = 256, .box_w = 14, .box_h = 3, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 18197, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 18213, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 18318, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18438, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18551, .adv_w = 256, .box_w = 14, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 18642, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18754, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18866, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 18978, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19098, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19210, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19330, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19442, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19562, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 19660, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 19780, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19908, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20036, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20156, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20284, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20404, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20524, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20636, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 20734, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 20847, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 20967, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21079, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21175, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21279, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21391, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21511, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21639, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 21767, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 21880, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22000, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22128, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22256, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22376, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22496, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22616, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22744, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 22864, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22992, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23120, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 23240, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23368, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 23488, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 23608, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23736, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 23856, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23984, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24104, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24232, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24352, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24472, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24592, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24712, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 24832, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 24960, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25080, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25200, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25328, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25456, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25576, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25704, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25824, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 25936, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26056, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26184, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26312, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26432, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26560, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26688, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 26808, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 26936, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27056, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27176, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27296, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27416, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27536, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27656, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27776, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 27904, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28032, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28160, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 28280, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 28400, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 28520, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 28640, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 28753, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 28873, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29001, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29129, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29257, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29385, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29513, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29633, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29753, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 29881, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30001, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30121, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30241, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30369, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30497, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30617, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 30745, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 30850, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 30970, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31083, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31203, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31323, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31451, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31571, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31691, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 31811, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 31909, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32007, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32119, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32231, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 32336, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 32434, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32562, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32690, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 32802, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 32930, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33058, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 33156, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33276, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33396, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 33501, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33614, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33734, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33847, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 33960, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34080, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34193, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34313, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34441, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34561, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34674, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34787, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 34915, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 35020, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 35132, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 35245, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35358, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35471, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35591, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35704, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35824, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 35944, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36080, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36200, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36328, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36456, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36584, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36712, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36832, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 36945, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37065, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37185, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37297, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 37402, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 37507, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37619, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37739, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37859, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 37971, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 38091, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38211, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38331, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 38451, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38579, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 38677, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38797, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 38917, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 39029, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39157, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 39269, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39397, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39525, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39645, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 39757, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39877, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 39997, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40117, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40253, .adv_w = 256, .box_w = 12, .box_h = 13, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 40331, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 40443, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40563, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 40676, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 40789, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 40887, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 40999, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 41104, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 41224, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41344, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 41449, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 41547, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 41660, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41780, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 41900, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 41998, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42103, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 42208, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42320, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 42425, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 42530, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 42642, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 42747, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 42852, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 42957, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 43077, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43197, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43310, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 43430, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 43528, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 43648, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 43768, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 43881, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 43994, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 44099, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 44212, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44332, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 44452, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44564, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 44662, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44774, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 44879, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 44984, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 45089, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 45209, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 45329, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 45427, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 45525, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 45623, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 45721, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 45819, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 45917, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 46015, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 46113, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 46211, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 46309, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46421, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46541, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46654, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 46766, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 46886, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47014, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47126, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47238, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47358, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47478, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 47590, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47710, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47830, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 47958, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48078, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48198, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48311, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48424, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48544, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48664, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 48776, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 48889, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49009, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49137, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49257, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 49369, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 49489, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 49609, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49737, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49865, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 49985, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50105, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50225, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50345, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50465, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50585, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 50697, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50817, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 50945, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51073, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51201, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51329, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51449, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51562, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51690, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 51802, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 51922, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52050, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52170, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52298, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52426, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 52554, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52674, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52794, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 52914, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53042, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53155, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53275, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53387, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 53492, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53612, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53732, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 53852, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 53980, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54108, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54228, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 54333, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54453, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 54558, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 54678, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 54790, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 54918, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 55023, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 55128, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55248, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 55360, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 55488, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55608, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 55728, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 55833, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 55938, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56058, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56171, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56284, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56404, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56517, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 56622, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 56750, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56870, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 56990, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57118, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57238, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 57350, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57470, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 57590, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57718, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 57830, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 57950, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 58070, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58190, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58310, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 58408, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58528, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58656, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58776, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 58881, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 58994, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 59099, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59219, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59339, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 59451, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 59564, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 59662, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 59782, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 59894, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60014, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 60134, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 60230, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 60350, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 60470, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 60568, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 60666, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 60786, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 60906, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 61019, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61139, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 61252, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61380, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61500, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 61620, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 61733, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 61845, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 61943, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 62041, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62153, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62273, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 62385, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62505, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62633, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62761, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 62889, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63017, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63145, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63273, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63401, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63529, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63657, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63785, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 63913, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64033, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64145, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 64257, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 64355, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 64460, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64580, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64708, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 64836, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 64934, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65062, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65182, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65310, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65430, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65550, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 65678, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65798, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 65918, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66038, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 66158, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66278, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66398, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66518, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66631, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66751, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66863, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 66983, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67103, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67215, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 67335, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67455, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67575, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67695, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67800, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 67905, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68025, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68137, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68257, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68377, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68489, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68601, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68713, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68818, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 68931, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 69036, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 69148, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69268, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 69388, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 69508, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69628, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 69726, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69846, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69974, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 70094, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70214, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70334, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 70439, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70567, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70687, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 70807, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 70927, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71055, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 71175, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71288, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71408, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71528, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71648, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71768, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 71888, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72008, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72113, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72233, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72353, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72465, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72585, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72697, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 72825, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 72945, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73065, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73193, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73313, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73433, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 73553, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73681, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73801, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 73929, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74057, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74169, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74289, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74409, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74529, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74641, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74761, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 74881, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 74993, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75113, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75241, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75361, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 75473, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75601, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75721, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 75841, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 75961, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76089, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76217, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76337, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76465, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76593, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76721, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76849, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 76969, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77089, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77209, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77337, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 77457, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 77577, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 77690, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77810, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 77938, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78066, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78194, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78322, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 78450, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 78563, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 78647, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 78745, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 78857, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 78962, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79082, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 79187, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79300, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79412, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79517, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 79630, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79750, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 79863, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 79983, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80103, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 80208, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 80328, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80448, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80560, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 80665, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80778, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 80891, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80996, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 81116, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 81229, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81349, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 81454, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 81552, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 81672, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 81784, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 81874, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 81986, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82098, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82218, .adv_w = 256, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82316, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82436, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82549, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82669, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 82789, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 82902, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83022, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83134, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83246, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83358, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83470, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83590, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83710, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 83830, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 83958, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84070, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84190, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84302, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84414, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84526, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84638, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84750, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84862, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 84974, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85086, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85198, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85310, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85430, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85558, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85686, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 85806, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 85926, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86054, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86174, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86294, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86414, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86534, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86646, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 86766, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 86894, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87022, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87134, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87254, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87374, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 87494, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87606, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87718, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87838, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 87950, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88070, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 88190, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88318, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88446, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 88566, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88686, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88814, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 88942, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89070, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 89190, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89318, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 89430, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 89542, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89662, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89775, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 89895, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90007, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90127, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90239, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90359, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90479, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 90591, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90711, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90839, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 90959, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91087, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91215, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91327, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 91440, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 91545, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 91650, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 91770, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 91898, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92018, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92138, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 92258, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 92370, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92498, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 92610, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92730, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92850, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 92978, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93083, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93203, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93331, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93444, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93557, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93677, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93805, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 93933, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94061, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94181, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94301, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94414, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94534, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94662, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 94790, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 94902, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 95022, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95150, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 95255, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 95375, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 95495, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95623, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 95735, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95855, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 95983, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96103, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96231, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96351, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96479, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96591, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 96711, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96831, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96951, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97071, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 97183, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97303, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 97415, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97535, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97663, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 97791, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 97904, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98032, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98152, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98272, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98400, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98528, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98648, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 98776, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 98881, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99001, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99129, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99249, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99354, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99466, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99578, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99706, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 99818, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 99938, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100066, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100194, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100322, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100442, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100570, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100675, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100803, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 100923, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101043, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101171, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101291, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 101403, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101523, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 101635, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 101747, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 101859, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 101987, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102107, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102212, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 102310, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 102408, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 102506, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 102604, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 102717, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 102822, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 102920, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103040, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 103145, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 103265, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 103377, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103497, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 103595, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 103723, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 103843, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 103963, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104091, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 104219, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 104309, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 104407, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 104519, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 104617, .adv_w = 256, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104721, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 104841, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 104925, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 105045, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105158, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 105278, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105406, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 105519, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 105631, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 105744, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105864, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 105992, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 106097, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 106209, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 106329, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 106441, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 106561, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 106673, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 106793, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 106905, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 107025, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107161, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107274, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 107394, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 107506, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 107634, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 107754, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 107866, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 107978, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 108090, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108218, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108346, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 108466, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 108586, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108706, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 108834, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 108939, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109059, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109179, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109291, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 109411, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109531, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109659, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109787, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109915, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110035, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110155, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110275, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110395, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 110523, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110643, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110763, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 110883, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 111003, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 111115, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 111235, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 111355, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 111468, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 111588, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111708, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 111836, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 111948, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112061, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112174, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112302, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112422, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 112550, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112670, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112790, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 112910, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113038, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113166, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113294, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 113414, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 113534, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 113647, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 113767, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 113887, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 114007, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 114120, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114248, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 114368, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 114488, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114616, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114744, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 114864, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 114992, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115120, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115248, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115376, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 115488, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 115616, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 115736, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 115834, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 115946, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116066, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 116178, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 116290, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 116402, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 116507, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116635, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 116747, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 116867, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 116987, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 117092, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 117197, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 117302, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 117415, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117535, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117663, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 117776, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 117904, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118024, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118144, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118272, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118385, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118505, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 118633, .adv_w = 256, .box_w = 12, .box_h = 15, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 118723, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 118835, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 118947, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119067, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119187, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119307, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119435, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119563, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 119691, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 119803, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119923, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 120035, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 120147, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 120259, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 120357, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120477, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 120589, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 120709, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 120821, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 120933, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 121045, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 121157, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 121269, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 121381, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 121493, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 121605, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121725, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121845, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 121965, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122093, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122221, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122341, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 122453, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122581, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 122693, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 122813, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 122941, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123069, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 123174, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123294, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123414, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123534, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123662, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123782, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 123910, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124038, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124158, .adv_w = 256, .box_w = 14, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124277, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124405, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124533, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 124653, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 124766, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 124894, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125022, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125150, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 125270, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125398, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125526, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 125646, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125782, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 125910, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 126030, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 126150, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 126270, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 126398, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 126518, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 126638, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 126758, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 126886, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127014, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 127134, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127262, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127390, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127518, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 127638, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 127758, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 127878, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128006, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 128126, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128254, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 128374, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 128494, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 128614, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128742, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128862, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 128990, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129118, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129246, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129374, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 129486, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129614, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 129734, .adv_w = 256, .box_w = 15, .box_h = 17, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 129862, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 129982, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130102, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130230, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130358, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130478, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130598, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130718, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130831, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 130951, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131079, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131199, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131327, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131463, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131583, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 131695, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131815, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 131935, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132055, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132175, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132295, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132415, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132535, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 132655, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 132775, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 132887, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 133007, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133127, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 133247, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133375, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 133495, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 133607, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 133727, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 133855, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 133975, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134103, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134223, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134343, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134463, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 134583, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134711, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134839, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 134959, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135087, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135215, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135343, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135471, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135591, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135719, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135847, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 135975, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136103, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136223, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136343, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136463, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136583, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136711, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136839, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 136959, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 137087, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 137207, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 137335, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 137463, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 137583, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 137711, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 137831, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 137959, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138087, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138215, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138343, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138471, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138584, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 138712, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 138832, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 138952, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139080, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139208, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 139328, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139448, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 139576, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 139696, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 139816, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 139936, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 140048, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 140168, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 140288, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140416, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 140536, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 140664, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 140784, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 140904, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 141024, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 141144, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 141249, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 141354, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 141459, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 141557, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 141655, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 141760, .adv_w = 256, .box_w = 14, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 141872, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 141992, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 142105, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 142225, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 142345, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 142465, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 142578, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 142691, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 142811, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 142931, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 143044, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 143164, .adv_w = 256, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 143284, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143412, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 143532, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143660, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 143780, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 143908, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144036, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 144156, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 144268, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 144366, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144486, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 144591, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 144696, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 144816, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 144928, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 145056, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 145169, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 145281, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 145393, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 145521, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 145641, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 145761, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 145874, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 145994, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146122, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146242, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146370, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146498, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146618, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146738, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146866, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 146986, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 147114, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 147242, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 147362, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 147482, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 147610, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 147738, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 147866, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 147986, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 148106, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 148226, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 148346, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 148466, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 148594, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 148714, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 148842, .adv_w = 256, .box_w = 15, .box_h = 14, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 148947, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 149060, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149188, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149324, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 149444, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149564, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149692, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149812, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 149932, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 150052, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 150172, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 150292, .adv_w = 256, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 150412, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 150548, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 150644, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 150756, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 150852, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 150918, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 151046, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 151174, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 151300, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 151428, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 151536, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 151664, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 151720, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 151804, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 151948, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 152044, .adv_w = 176, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 152132, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 152212, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 152338, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 152443, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 152541, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 152621, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 152733, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 152803, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 152873, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 152971, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 152999, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 153107, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 153267, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 153427, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 153555, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 153625, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 153695, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 153835, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 153931, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 154059, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 154204, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 154309, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 154421, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 154519, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 154617, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 154713, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 154809, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 154921, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 155033, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 155141, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 155303, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 155399, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 155549, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 155649, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 155749, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 155849, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 155949, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 156049, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 156196, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 156292, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 156404, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 156549, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 156669, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 156765, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 156859, .adv_w = 256, .box_w = 5, .box_h = 16, .ofs_x = 11, .ofs_y = -2}, + {.bitmap_index = 156899, .adv_w = 256, .box_w = 5, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 156939, .adv_w = 256, .box_w = 4, .box_h = 6, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 156951, .adv_w = 256, .box_w = 9, .box_h = 12, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 157005, .adv_w = 256, .box_w = 10, .box_h = 12, .ofs_x = 3, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1, 0x4, 0xb, 0xc, 0x40, 0x41, 0x42, + 0x43, 0x45, 0x46, 0x47 +}; + +static const uint8_t glyph_id_ofs_list_4[] = { + 0, 0, 0, 1, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 5, 6, 0, 7, + 8, 9, 0, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 0, + 30, 31, 32, 0, 33, 34, 0, 35, + 36, 37, 38, 39, 40, 0, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 0, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 0, + 65, 66, 67, 68, 69, 70, 71 +}; + +static const uint16_t unicode_list_5[] = { + 0x0, 0x4, 0x7, 0xd, 0x1d11, 0x1d14, 0x1d18, 0x1d19, + 0x1d1a, 0x1d1b, 0x1d1c, 0x1d1e, 0x1d24, 0x1d25, 0x1d27, 0x1d32, + 0x1d37, 0x1d3e, 0x1d4c, 0x1d56, 0x1d5c, 0x1d5f, 0x1d60, 0x1d68, + 0x1d6e, 0x1d70, 0x1d97, 0x1d99, 0x1d9a, 0x1d9c, 0x1d9d, 0x1da5, + 0x1dac, 0x1db2, 0x1db5, 0x1db7, 0x1dbd, 0x1dcb, 0x1dd1, 0x1ddb, + 0x1ddc, 0x1dde, 0x1de6, 0x1de7, 0x1de9, 0x1df4, 0x1df5, 0x1df6, + 0x1dff, 0x1e07, 0x1e0c, 0x1e0e, 0x1e12, 0x1e1b, 0x1e22, 0x1e2b, + 0x1e2e, 0x1e49, 0x1e4d, 0x1e57, 0x1e5e, 0x1e5f, 0x1e60, 0x1e64, + 0x1e66, 0x1e6a, 0x1e6d, 0x1e71, 0x1e90, 0x1e97, 0x1e9c, 0x1eac, + 0x1eae, 0x1eb2, 0x1ed0, 0x1ed3, 0x1eee, 0x1ef2, 0x1eff, 0x1f1c, + 0x1f22, 0x1f2a, 0x1f30, 0x1f35, 0x1f4d, 0x1f6b, 0x1f6d, 0x1f76, + 0x1f85, 0x1faa, 0x1fc4, 0x1fd6, 0x1fde, 0x1fe0, 0x1fe6, 0x200a, + 0x2015, 0x203b, 0x2050, 0x2054, 0x2055, 0x2056, 0x2059, 0x205a, + 0x205c, 0x205e, 0x2063, 0x206b, 0x2076, 0x2078, 0x2079, 0x207a, + 0x207c, 0x207d, 0x207e, 0x2082, 0x2087, 0x2088, 0x2096, 0x2097, + 0x209b, 0x209e, 0x20aa, 0x20ac, 0x20bd, 0x20c8, 0x20de, 0x20ee, + 0x20f7, 0x210b, 0x2117, 0x2118, 0x211b, 0x2128, 0x212e, 0x2135, + 0x2136, 0x213a, 0x2141, 0x2147, 0x2149, 0x214c, 0x2158, 0x215b, + 0x215e, 0x216c, 0x2183, 0x2186, 0x2194, 0x21ac, 0x21b0, 0x21b1, + 0x21b9, 0x21ba, 0x21bb, 0x21c4, 0x21da, 0x21e6, 0x21ea, 0x21ee, + 0x21f5, 0x2206, 0x2216, 0x2227, 0x2228, 0x224c, 0x2251, 0x2252, + 0x2254, 0x2259, 0x225b, 0x2263, 0x2265, 0x2268, 0x2269, 0x2282, + 0x2284, 0x228c, 0x22ab, 0x22b0, 0x22c4, 0x22cc, 0x22d3, 0x22d4, + 0x22d9, 0x22db, 0x22dc, 0x22de, 0x22e7, 0x22e8, 0x22f4, 0x22f5, + 0x22f6, 0x22f7, 0x22fb, 0x22fc, 0x2300, 0x2301, 0x2303, 0x2304, + 0x2308, 0x2309, 0x2314, 0x2315, 0x2319, 0x231d, 0x231e, 0x2322, + 0x2337, 0x2338, 0x2351, 0x235b, 0x2373, 0x2379, 0x2384, 0x238d, + 0x238e, 0x239d, 0x23c3, 0x23d2, 0x23f2, 0x23fb, 0x2457, 0x245b, + 0x2460, 0x2477, 0x2495, 0x249a, 0x24ad, 0x24ae, 0x24bf, 0x24c7, + 0x24df, 0x2500, 0x252c, 0x25c5, 0x25ec, 0x25ef, 0x25f1, 0x2601, + 0x2604, 0x260e, 0x261c, 0x261e, 0x2623, 0x2629, 0x2630, 0x2634, + 0x2639, 0x2641, 0x2658, 0x265b, 0x2661, 0x269c, 0x26f0, 0x2708, + 0x270b, 0x2742, 0x2745, 0x275b, 0x277a, 0x2794, 0x27a8, 0x27af, + 0x27db, 0x27e4, 0x27fc, 0x2801, 0x2803, 0x281a, 0x2820, 0x2826, + 0x2827, 0x282b, 0x282d, 0x2831, 0x2838, 0x283a, 0x283b, 0x283c, + 0x283f, 0x2842, 0x2858, 0x2862, 0x2868, 0x2884, 0x288a, 0x288e, + 0x2893, 0x2898, 0x28c4, 0x28ca, 0x28cc, 0x28da, 0x28dc, 0x28e1, + 0x28e5, 0x2929, 0x296b, 0x2977, 0x29a3, 0x29ce, 0x29dd, 0x2a1a, + 0x2a61, 0x2a68, 0x2a69, 0x2a74, 0x2a77, 0x2a7a, 0x2a7c, 0x2a89, + 0x2a94, 0x2a96, 0x2a98, 0x2a99, 0x2a9a, 0x2a9d, 0x2aa9, 0x2aaa, + 0x2aab, 0x2aaf, 0x2ab0, 0x2ab3, 0x2ab5, 0x2ac4, 0x2ac6, 0x2ac7, + 0x2aca, 0x2ad0, 0x2ad5, 0x2ad7, 0x2add, 0x2ae3, 0x2aee, 0x2af0, + 0x2af7, 0x2afc, 0x2b0b, 0x2b0f, 0x2b15, 0x2b18, 0x2b19, 0x2b1e, + 0x2b1f, 0x2b20, 0x2b22, 0x2b2b, 0x2b35, 0x2b42, 0x2b4b, 0x2b51, + 0x2b56, 0x2b5b, 0x2b5c, 0x2b66, 0x2b76, 0x2b7d, 0x2b82, 0x2c07, + 0x2c5d, 0x2cee, 0x2cef, 0x2cf6, 0x2cf7, 0x2cff, 0x2d02, 0x2d03, + 0x2d13, 0x2d14, 0x2d19, 0x2d1d, 0x2d3c, 0x2d3e, 0x2d40, 0x2d41, + 0x2d44, 0x2d47, 0x2d49, 0x2d56, 0x2d84, 0x2d85, 0x2d89, 0x2d8f, + 0x2d94, 0x2d97, 0x2da6, 0x2da8, 0x2dad, 0x2db7, 0x2db8, 0x2dbc, + 0x2dbe, 0x2dc8, 0x2df1, 0x2e0b, 0x2e10, 0x2e20, 0x2e26, 0x2e30, + 0x2e42, 0x2e46, 0x2e48, 0x2e64, 0x2e73, 0x2e82, 0x2e8a, 0x2e8d, + 0x2e91, 0x2e96, 0x2e99, 0x2e9c, 0x2e9d, 0x2ea3, 0x2ea4, 0x2ea8, + 0x2eaf, 0x2eb2, 0x2eba, 0x2ed4, 0x2ed6, 0x2ee9, 0x2eea, 0x2efc, + 0x2f06, 0x2f1f, 0x2f23, 0x2f26, 0x2f2e, 0x2f36, 0x2f38, 0x2f80, + 0x2fb9, 0x2fbb, 0x2fc3, 0x2fd6, 0x3004, 0x3019, 0x3020, 0x302b, + 0x302c, 0x3030, 0x305c, 0x3074, 0x3078, 0x307f, 0x30da, 0x3109, + 0x3121, 0x3122, 0x3127, 0x3137, 0x3141, 0x314c, 0x3150, 0x3151, + 0x315c, 0x315e, 0x3164, 0x3166, 0x318f, 0x3191, 0x319b, 0x31a6, + 0x31cd, 0x31d6, 0x31da, 0x31ec, 0x31f2, 0x31fd, 0x31fe, 0x3210, + 0x3212, 0x3218, 0x322a, 0x3266, 0x3279, 0x3299, 0x32a3, 0x32ac, + 0x32b2, 0x32b3, 0x32b6, 0x32b8, 0x32b9, 0x32e0, 0x32e1, 0x32ec, + 0x32ff, 0x330b, 0x334b, 0x33d2, 0x33d8, 0x33e5, 0x33eb, 0x3440, + 0x344a, 0x344f, 0x3450, 0x3456, 0x3459, 0x3468, 0x346a, 0x3473, + 0x3481, 0x3485, 0x3498, 0x34aa, 0x34be, 0x34c1, 0x34c8, 0x34ca, + 0x34cd, 0x34ce, 0x34d2, 0x34d6, 0x34e0, 0x34f3, 0x34f6, 0x34f7, + 0x34fa, 0x3507, 0x3518, 0x351f, 0x3524, 0x3525, 0x3530, 0x3531, + 0x3536, 0x3539, 0x3540, 0x354d, 0x3553, 0x357a, 0x357f, 0x3580, + 0x3585, 0x358b, 0x3598, 0x35a2, 0x35a7, 0x35a8, 0x35d8, 0x35ed, + 0x3603, 0x3605, 0x3609, 0x360f, 0x3610, 0x3611, 0x3614, 0x3619, + 0x361a, 0x361c, 0x361e, 0x362c, 0x362e, 0x3630, 0x3639, 0x363b, + 0x363c, 0x363d, 0x363e, 0x364b, 0x3661, 0x3662, 0x3670, 0x3672, + 0x3676, 0x3680, 0x3682, 0x36a1, 0x36a8, 0x36ad, 0x36e1, 0x36f6, + 0x3702, 0x370c, 0x3710, 0x3722, 0x3732, 0x373b, 0x374a, 0x374d, + 0x3754, 0x3759, 0x37ae, 0x37c1, 0x37ff, 0x381e, 0x382d, 0x386b, + 0x387e, 0x3886, 0x388e, 0x3893, 0x38dc, 0x38e9, 0x3913, 0x392a, + 0x3932, 0x3934, 0x393b, 0x394a, 0x395c, 0x3970, 0x3a32, 0x3a43, + 0x3a5d, 0x3a61, 0x3a72, 0x3a73, 0x3a74, 0x3a75, 0x3a76, 0x3a7a, + 0x3a80, 0x3a83, 0x3a84, 0x3a88, 0x3a8c, 0x3a9b, 0x3a9c, 0x3ac6, + 0x3ade, 0x3adf, 0x3ae0, 0x3ae5, 0x3aec, 0x3b20, 0x3b22, 0x3b25, + 0x3b28, 0x3b45, 0x3b48, 0x3b49, 0x3b53, 0x3b6b, 0x3b71, 0x3b8b, + 0x3b99, 0x3ba3, 0x3bca, 0x3bcc, 0x3bd2, 0x3bdb, 0x3be6, 0x3bf3, + 0x3bf4, 0x3bf9, 0x3c04, 0x3c1c, 0x3c28, 0x3c43, 0x3c4c, 0x3c4f, + 0x3c52, 0x3c56, 0x3c85, 0x3c88, 0x3c99, 0x3ccd, 0x3d02, 0x3d08, + 0x3d16, 0x3d18, 0x3d19, 0x3d1a, 0x3d2c, 0x3d32, 0x3d3a, 0x3d40, + 0x3d67, 0x3da1, 0x3da7, 0x3dae, 0x3e10, 0x3e33, 0x3e49, 0x3ed4, + 0x3ef0, 0x3f74, 0x3f7c, 0x3f8e, 0x3fca, 0x3fcb, 0x4032, 0x4047, + 0x406a, 0x40c2, 0x40f0, 0x413e, 0x4147, 0x4149, 0x4158, 0x416c, + 0x4171, 0x417a, 0x418a, 0x41bd, 0x41c0, 0x41c7, 0x41d1, 0x41fd, + 0x41fe, 0x423c, 0x4250, 0x4283, 0x42ba, 0x430f, 0x4314, 0x4317, + 0x43c1, 0x4429, 0x442b, 0x4430, 0x4433, 0x4434, 0x4439, 0x4441, + 0x4442, 0x4444, 0x4446, 0x4448, 0x444b, 0x444c, 0x445d, 0x446a, + 0x447b, 0x447c, 0x4481, 0x4487, 0x44c3, 0x44d6, 0x44ec, 0x458b, + 0x458d, 0x458e, 0x458f, 0x4595, 0x4597, 0x45d0, 0x45e8, 0x45ff, + 0x4605, 0x4609, 0x461c, 0x4630, 0x4631, 0x464f, 0x4651, 0x46f6, + 0x46fe, 0x4704, 0x4713, 0x4725, 0x4745, 0x47cb, 0x484b, 0x484d, + 0x484f, 0x4867, 0x486e, 0x486f, 0x487e, 0x4892, 0x48d1, 0x48d2, + 0x48dc, 0x48de, 0x48e2, 0x48e9, 0x490c, 0x491c, 0x493f, 0x495e, + 0x4987, 0x498b, 0x49a4, 0x49dc, 0x49ea, 0x49f6, 0x4a00, 0x4a22, + 0x4a37, 0x4a3d, 0x4a57, 0x4a5a, 0x4a65, 0x4a67, 0x4aa8, 0x4ab2, + 0x4ad1, 0x4ad5, 0x4b32, 0x4b84, 0x4bcf, 0x4be7, 0x4c0c, 0x4c11, + 0x4c15, 0x4c2a, 0x4c31, 0x4c41, 0x4c4a, 0x4c53, 0x4c55, 0x4c5d, + 0x4c61, 0x4c72, 0x4c77, 0x4c82, 0x4c86, 0x4ca4, 0x4cab, 0x4cbe, + 0x4cc3, 0x4ce2, 0x4ce3, 0x4ceb, 0x4cf1, 0x4cfa, 0x4d05, 0x4d4e, + 0x4d4f, 0x4d65, 0x4d81, 0x4d8d, 0x4d9d, 0x4df0, 0x4e4b, 0x4e7f, + 0x4e9f, 0x4eba, 0x4ee3, 0x4f12, 0x4f14, 0x4f16, 0x4f1d, 0x4f44, + 0x4f6f, 0x4f80, 0x4f83, 0x4f88, 0x4f8e, 0x4f9a, 0x4fba, 0x4fc0, + 0x4fc3, 0x4fdd, 0x5009, 0x500e, 0x5042, 0x505b, 0x5066, 0x5077, + 0x5081, 0x50ae, 0x50da, 0x50fb, 0x5104, 0x510b, 0x5118, 0x5119, + 0x511a, 0x513b, 0x513d, 0x514a, 0x5180, 0x5183, 0x5193, 0x51c2, + 0x51f6, 0x51f7, 0x5202, 0x5247, 0x5288, 0x52e4, 0x52ed, 0x534e, + 0x535a, 0x5368, 0x5446, 0x5495, 0x54bd, 0x54ee, 0x5518, 0x5566, + 0x575d, 0x5764, 0x5779, 0x57bc, 0x57e0, 0x57ed, 0x57f2, 0x580e, + 0x5818, 0x5890, 0x5892, 0x589c, 0x58a0, 0x58a7, 0x58ab, 0x58bb, + 0x58cb, 0x58d1, 0x58e3, 0x58f4, 0x58f7, 0x5911, 0x5919, 0x591b, + 0x591f, 0x5924, 0x5929, 0x593b, 0x593e, 0x5942, 0x5944, 0x5945, + 0x5966, 0x5977, 0x5982, 0x5983, 0x5984, 0x599d, 0x599e, 0x59a6, + 0x59a9, 0x59af, 0x59bb, 0x59bd, 0x59be, 0x59c1, 0x59c3, 0x59d0, + 0x59d8, 0x59dc, 0x59e7, 0x5a09, 0x5a13, 0x5a2c, 0x5a2e, 0x5a69, + 0x5a81, 0x5a88, 0x5a9b, 0x5aa4, 0x5ab2, 0x5aef, 0x5b61, 0x5b72, + 0x5bb1, 0x5bb2, 0x5bb8, 0x5bba, 0x5bbd, 0x5bc8, 0x5bc9, 0x5bcc, + 0x5bd0, 0x5bd4, 0x5bd8, 0x5bfb, 0x5c0e, 0x5c4a, 0x5c75, 0x5c81, + 0x5c88, 0x5c96, 0x5c9b, 0x5cb4, 0x5cc4, 0x5cf0, 0x5d00, 0x5dbc, + 0x5ddb, 0x5df0, 0x5df3, 0x5e0e, 0x5e14, 0x5e1a, 0x5e26, 0x5e3b, + 0x5e49, 0x5eac, 0x5eaf, 0x5eb7, 0x5ec3, 0x5ecb, 0x5ecd, 0x5edf, + 0x5ee2, 0x5ee5, 0x5efc, 0x5f0e, 0x5f11, 0x5f12, 0x5f14, 0x5f20, + 0x5f21, 0x5f2a, 0x5f2b, 0x5f30, 0x5f31, 0x5f34, 0x5f3f, 0x5f42, + 0x5f43, 0x5f56, 0x5f5b, 0x5f5c, 0x5f5f, 0x5f64, 0x5f65, 0x5f66, + 0x5f71, 0x5f7a, 0x5f89, 0x5f90, 0x5f95, 0x5f9b, 0x5fb4, 0x5fbb, + 0x5ff9, 0x6006, 0x600e, 0x605e, 0x6063, 0x6065, 0x6089, 0x60bc, + 0x60de, 0x60df, 0x60e0, 0x60e2, 0x60ee, 0x6155, 0x616c, 0x6191, + 0x6233, 0x6240, 0x6243, 0x6488, 0x649a, 0x649c, 0x64a4, 0x64b3, + 0x64ed, 0x6501, 0x6544, 0x6555, 0x655e, 0x6561, 0x6573, 0x6575, + 0x6589, 0x658e, 0x659f, 0x65ac, 0x65ad, 0x65b4, 0x65b9, 0x65cc, + 0x65d7, 0x65e2, 0x65e7, 0x65ea, 0x65f3, 0x65f4, 0x65f9, 0x65fb, + 0x6603, 0x660c, 0x6611, 0x6618, 0x6663, 0x666a, 0x666f, 0x6673, + 0x667a, 0x6685, 0x6704, 0x6710, 0x6714, 0x6716, 0x6719, 0x6728, + 0x6729, 0x673e, 0x674d, 0x675d, 0x6765, 0x6769, 0x676f, 0x6780, + 0x67b9, 0x67ec, 0x67f0, 0x6800, 0x6803, 0x6839, 0x68a7, 0x68aa, + 0x68d5, 0x68d6, 0x6923, 0x6924, 0x6968, 0x69e5, 0x69e9, 0x69fb, + 0x6a6b, 0x6bf6, 0x6da8, 0x6dcd, 0x6dd5, 0x6de3, 0x6def, 0x6df9, + 0x6e24, 0x6e4c, 0xbf12, 0xbf19, 0xbf1c, 0xbf1d, 0xbf1e, 0xbf22, + 0xbf24, 0xbf26, 0xbf2a, 0xbf2d, 0xbf32, 0xbf37, 0xbf38, 0xbf39, + 0xbf4f, 0xbf54, 0xbf59, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf62, 0xbf63, + 0xbf64, 0xbf65, 0xbf78, 0xbf79, 0xbf7f, 0xbf81, 0xbf82, 0xbf85, + 0xbf88, 0xbf89, 0xbf8a, 0xbf8c, 0xbfa4, 0xbfa6, 0xbfd5, 0xbfd6, + 0xbfd8, 0xbfda, 0xbff1, 0xbff8, 0xbffb, 0xc004, 0xc02d, 0xc035, + 0xc06c, 0xc0fc, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc198, + 0xc1a4, 0xc1fe, 0xc215, 0xc46b, 0xc6d3, 0xc7b3, 0xce19, 0xce1a, + 0xce1d, 0xce22, 0xce23 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12289, .range_length = 72, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 12, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + }, + { + .range_start = 12362, .range_length = 24, .glyph_id_start = 108, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12387, .range_length = 43, .glyph_id_start = 132, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 12431, .range_length = 95, .glyph_id_start = 175, + .unicode_list = NULL, .glyph_id_ofs_list = glyph_id_ofs_list_4, .list_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL + }, + { + .range_start = 12527, .range_length = 52772, .glyph_id_start = 247, + .unicode_list = unicode_list_5, .glyph_id_ofs_list = NULL, .list_length = 1187, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { + 0, 0, 0, 1, 0, 0, 0, 0, + 1, 2, 0, 0, 0, 3, 4, 3, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 6, 0, 0, 0, + 0, 0, 7, 8, 9, 10, 11, 12, + 13, 0, 0, 14, 15, 16, 0, 0, + 10, 17, 10, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 2, 27, 0, 0, + 0, 0, 28, 29, 30, 0, 31, 32, + 33, 34, 0, 0, 35, 36, 34, 34, + 29, 29, 37, 38, 39, 40, 37, 41, + 42, 43, 44, 45, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 46, 47, 48, + 49, 50, 0, 51, 0, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 0, + 62, 63, 0, 64, 65, 0, 66, 67, + 67, 68, 69, 0, 70, 71, 72, 73, + 74, 75, 76, 0, 77, 78, 79, 80, + 81, 82, 82, 83, 0, 84, 85, 86, + 86, 87, 88, 89, 0, 0, 90, 91, + 79, 0, 67, 92, 93, 94, 0, 95, + 0, 96, 97, 98, 99, 100, 0, 101, + 0, 102, 58, 103, 0, 104, 105, 0, + 0, 106, 107, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 0, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 0, + 134, 135, 136, 137, 138, 0, 139, 0, + 140, 141, 142, 115, 0, 0, 0, 0, + 143, 0, 144, 145, 0, 46, 146, 147, + 0, 148, 149, 150, 151, 152, 0, 153, + 154, 0, 155, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { + 0, 0, 1, 2, 0, 0, 0, 0, + 2, 0, 3, 4, 0, 5, 6, 7, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 10, 0, 0, 0, + 11, 0, 12, 0, 13, 0, 0, 0, + 13, 0, 0, 14, 0, 0, 0, 0, + 13, 0, 13, 0, 15, 16, 17, 18, + 19, 20, 21, 22, 0, 23, 3, 0, + 0, 0, 24, 0, 25, 25, 25, 26, + 27, 0, 28, 29, 0, 0, 30, 30, + 25, 30, 25, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 0, 0, 3, 0, + 39, 40, 0, 0, 0, 0, 41, 42, + 43, 44, 45, 0, 46, 47, 48, 49, + 50, 51, 52, 0, 0, 53, 53, 53, + 53, 0, 0, 54, 55, 56, 56, 57, + 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 0, 0, 0, 69, + 70, 71, 71, 72, 72, 72, 73, 74, + 75, 76, 76, 76, 0, 0, 0, 77, + 78, 0, 0, 79, 80, 81, 82, 0, + 83, 84, 0, 85, 86, 87, 88, 0, + 71, 0, 89, 90, 91, 92, 93, 94, + 95, 0, 96, 96, 0, 0, 97, 98, + 0, 99, 100, 100, 101, 102, 103, 103, + 104, 105, 106, 106, 107, 108, 109, 106, + 89, 110, 111, 112, 113, 114, 115, 106, + 116, 117, 118, 119, 120, 0, 0, 0, + 121, 122, 123, 124, 125, 0, 0, 0, + 126, 127, 128, 129, 0, 130, 131, 132, + 0, 0, 133, 0, 134, 135, 0, 0, + 136, 0, 137, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 138, + 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { + 0, 0, 0, 0, -32, 0, -32, 0, + 0, 0, 0, -15, 0, -26, -3, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -9, 0, 0, 0, 0, 0, -6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, 0, -38, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -28, -5, -18, -9, 0, + -26, 0, 0, 0, -3, 0, 0, 0, + 7, 0, 0, -12, 0, -9, -6, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -6, -5, -13, 0, -5, + -3, -7, -18, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, -2, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -12, -3, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -7, + -9, 0, -3, 8, 8, 0, 0, 3, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, 0, -27, + 0, 0, 0, 0, 0, 0, -7, -2, + -3, 0, 0, -15, -5, -4, 0, 2, + -4, -2, -12, 7, 0, -3, 0, 0, + 0, 0, 7, -4, -2, -2, -1, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, -4, -7, 0, -1, + -1, -1, -4, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, -4, + -3, -3, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, -8, -3, -7, -5, + -4, -1, -1, -1, -2, -3, 0, 0, + 0, 0, -6, 0, 0, 0, 0, -7, + -3, -4, -3, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, -5, 0, 0, 0, -3, 0, -11, + 0, -7, 0, -3, -2, -5, -6, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, -7, 0, -3, 0, -8, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -20, 0, -20, -21, 0, 0, + 0, -11, -3, -40, -5, 0, 0, 2, + 2, -7, 1, -9, 0, -9, -4, 0, + -7, 0, 0, -6, -5, -3, -4, -5, + -4, -7, -4, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, 0, 0, 0, 0, + 0, 0, 0, -1, 0, 0, 0, -6, + 0, -4, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + -7, 0, 0, 0, 0, 0, 0, -12, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, -12, + 0, -7, 0, 0, 0, 0, -2, -3, + -5, 0, -2, -5, -4, -3, -3, 0, + -4, 0, 0, 0, -2, 0, 0, 0, + -3, 0, 0, -9, -4, -5, -4, -4, + -5, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -23, + 0, -43, 0, -16, 0, 0, 0, 0, + -8, 1, -7, 0, -6, -34, -8, -22, + -16, 0, -21, 0, -23, 0, -3, -4, + -1, 0, 0, 0, 0, -5, -3, -9, + -9, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -31, -10, -31, -23, + 0, 0, 0, -14, 0, -42, -3, -7, + 0, 0, 0, -7, -3, -23, 0, -13, + -7, 0, -9, 0, 0, 0, -3, 0, + 0, 0, 0, -4, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, -9, + 0, 0, 0, 0, 0, -1, 0, -5, + -4, -4, 0, 2, 2, -1, 0, -3, + 0, -1, -3, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 4, 0, 0, 0, 0, 0, 0, + 0, -4, -4, -6, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -30, -21, -30, -26, -6, -6, + 0, -12, -7, -36, -12, 0, 0, 0, + 0, -6, -4, -16, 0, -21, -18, -5, + -21, 0, 0, -13, -17, -5, -13, -10, + -10, -12, -10, -22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, -4, -9, + 0, 0, 0, -5, 0, -13, -3, 0, + 0, -1, 0, -3, -4, 0, 0, -1, + 0, 0, -3, 0, 0, 0, -1, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -18, -5, + -18, -14, 0, 0, 0, -4, -3, -21, + -3, 0, -3, 3, 0, 0, 0, -5, + 0, -6, -4, 0, -6, 0, 0, -6, + -3, 0, -9, -3, -3, -4, -3, -7, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, -3, -9, -9, 0, 0, 0, 0, + -2, -19, -2, 0, 0, 0, 0, 0, + 0, -2, 0, -5, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -3, 0, -7, 0, 0, 0, 0, + 0, 1, -5, 0, -4, -6, -3, 0, + 0, 0, 0, 0, 0, -3, -2, -4, + 0, 0, 0, 0, 0, -4, -3, -4, + -4, -3, -4, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -25, -18, -25, -20, + -7, -7, -2, -4, -4, -28, -4, -4, + -3, 0, 0, 0, 0, -8, 0, -19, + -11, 0, -17, 0, 0, -12, -11, -7, + -9, -4, -7, -9, -4, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + 0, 0, 0, 0, 0, -2, -6, -10, + -9, 0, -3, -2, -2, 0, -4, -5, + 0, -5, -6, -6, -4, 0, 0, 0, + 0, -4, -7, -5, -5, -7, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -25, -9, -15, -9, 0, + -21, 0, 0, 0, 0, 0, 10, 0, + 21, 0, 0, 0, 0, -6, -3, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -16, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, -7, 0, -4, + -1, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, -8, -3, 2, -3, 0, + 0, 0, -3, 0, 0, 0, 0, -16, + 0, -5, 0, -1, -13, 0, -7, -4, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -1, -1, -5, -1, -1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, -4, 0, 0, -7, 0, + 0, -3, -6, 0, -3, 0, 0, 0, + 0, -3, 0, 2, 2, 3, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + 0, 3, 0, 0, 0, 0, -2, 0, + 0, -6, -6, -7, 0, -4, -3, 0, + -7, 0, -5, -4, 0, 0, -3, 0, + 0, 0, 0, -3, 0, 2, 2, -2, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 12, + 15, 0, -14, -4, -14, -4, 0, 0, + 8, 0, 0, 0, 0, 13, 0, 19, + 13, 10, 17, 0, 19, -6, -3, 0, + -4, 0, -3, 0, -1, 0, 0, 4, + 0, -1, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, -10, 0, 0, 0, 14, + 0, 0, -10, 0, 0, 0, 0, -7, + 0, 0, 0, 0, -4, 0, 0, -4, + -4, 0, 0, 0, 10, 0, 0, 0, + 0, -1, -1, 0, 5, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, -7, 0, -3, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 4, -11, 4, 0, 4, 4, -3, 0, + 0, 0, 0, -9, 0, 0, 0, 0, + -3, 0, 0, -3, -5, 0, -3, 0, + -3, 0, 0, -5, -4, 0, 0, -2, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -4, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -15, -7, + -15, -10, 8, 8, 0, -4, 0, -15, + 0, 0, 0, 0, 0, 0, 0, -3, + 4, -7, -3, 0, -3, 0, 0, 0, + -1, 0, 0, 8, 6, 0, 8, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -15, + 0, 3, 0, 0, 0, 0, -3, 0, + 0, 0, 0, -7, 0, -3, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, -7, 3, 3, 4, 4, + -7, 0, 0, 0, 0, -4, 0, 0, + 0, 0, -1, 0, 0, -6, -4, 0, + -3, 0, 0, 0, -3, -6, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -9, -2, -9, -6, + 0, 0, 0, -3, 0, -12, 0, -6, + 0, -3, 0, 0, -4, -3, 0, -6, + -1, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -10, 0, + -10, -2, 0, 0, 0, -1, 0, -9, + 0, -7, 0, -3, 0, -4, -7, 0, + 0, -3, -1, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -4, 0, 0, -6, + 2, -4, -2, 0, 0, 2, 0, 0, + -3, 0, -1, -10, 0, -4, 0, -3, + -9, 0, 0, -3, -5, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 0, -9, -4, 0, 0, + 0, 0, 0, -12, 0, -6, 0, -1, + 0, -1, -2, 0, 0, -6, -1, 0, + 0, 0, -3, 0, 0, 0, 0, 0, + 0, -4, 0, -7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, 0, 0, 0, -9, 0, 0, -7, + -3, 0, -2, 0, 0, 0, 0, 0, + -3, -1, 0, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -5, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, -8, -8, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, -8, -13, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -18, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, -5, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -18, -13, 0, -10, 0, -5, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, -13, 0, -5, 0, 0, + -5, 0, 0, 0, 0, 0, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, 0, -8, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -13, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -18, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -5, 0, 0, 0, + 0, 0, -18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, -5, 0, 0, 0, 0, 0, + 0, -15, -15, -8, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, -26, 0, -5, + 0, 0, -10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -10, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 0, -5, -5, + -5, -18, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, 0, 0, 0, 0, 0, + 0, -18, -23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -18, -26, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, -18, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -10, -10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -13, -8, + -8, 0, 0, 0, 0, -8, 0, 0, + -8, -8, -8, -8, 0, 0, 0, 0, + -8, 0, 0, 0, -15, -5, -5, 0, + 0, 0, 0, 0, 0, -5, -5, 0, + 0, 0, 0, 0, -13, 0, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, -10, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, 0, + 0, -8, -8, 0, -8, 0, 0, 0, + -8, -10, -10, -8, -8, 0, 0, -8, + -3, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, -13, 0, 0, + 0, 0, 0, 0, 0, 0, -8, -8, + -8, -8, -8, 0, 0, 0, -8, 0, + 0, 0, 0, -8, -8, -5, -5, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, -13, 0, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, -5, -5, -5, 3, 3, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -18, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -18, -18, -13, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, -10, 0, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + -10, -10, -10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -10, -10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, 0, 0, 0, 0, + -10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + -5, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, -10, 0, -10, -10, -5, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -8, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -5, -5, + 0, 0, 0, 0, 0, 0, 0, -8, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, -10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, -5, -8, -8, 0, + 0, 0, 0, 0, 0, 0, 3, 3, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, -13, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -26, -26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -8, 0, + 0, 0, 0, 0, -8, -5, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, 0, -13, -13, 0, 0, + 0, 0, -10, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + -23, -10, -10, -5, 0, 0, 0, -5, + -5, 0, -5, -18, -13, 0, 0, 0, + 0, -3, 0, -10, -15, -26, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -3, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, -5, -5, + 0, 0, 0, 0, 0, -8, -8, 0, + 0, -10, -10, 0, -5, 0, 0, 0, + -5, 0, 0, -5, -5, -5, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -23, -20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, -10, -10, 0, 0, 0, 0, + 0, -8, -5, 0, 0, -10, -10, 0, + 0, 0, 0, 0, 0, 0, -15, -13, + -13, -13, 0, 0, 0, 0, 0, 0, + 0, -20, -10, 0, 0, 0, 0, -8, + 0, 0, 0, -23, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -18, -20, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -5, 0, 0, + 0, 0, -15, -10, -10, -10, 0, 0, + 0, -8, -8, 0, -8, -18, -8, 0, + 0, 0, 0, 0, -5, -8, 0, -26, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -20, -20, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, -5, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, -5, -5, -5, + 0, 0, 0, 0, 0, 0, -3, -13, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, -18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -23, -23, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -10, -10, -10, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -18, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -20, -18, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + -8, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -5, 0, 0, 0, 0, 0, 0, 0, + -5, -15, -15, -15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, -18, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -18, -18, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, -15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -13, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, -3, 0, 0, 0, 0, + 0, 0, 0, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -20, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -13, -13, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, -10, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 5, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -8, -8, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -15, -15, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -20, -20, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -20, -5, + -5, -5, 0, 0, 0, 0, 0, 0, + 0, -8, -5, 0, 0, 0, 0, 0, + 0, 0, 0, -18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -5, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, -5, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, -3, -3, -3, + 0, 0, 0, 0, 0, 0, 0, -8, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -8, 0, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -15, -15, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -13, -3, -5, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, -5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, -13, 0, + 0, 0, -8, -8, -8, 0, 0, 0, + 0, -5, -8, 0, 0, 0, 0, 0, + 0, 0, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -15, -15, 0, 0, 0, + 0, 0, 0, 0, -10, -10, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, -5, -5, -13, -13, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + -15, -5, -3, -3, -15, -15, -15, 0, + 0, 0, 0, -8, -10, 0, 0, 0, + 0, 0, 0, -13, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 155, + .right_class_cnt = 138, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 6, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_source_han_sans_sc_16_cjk = { +#else +lv_font_t lv_font_source_han_sans_sc_16_cjk = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 20, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -2, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_SOURCE_HAN_SANS_SC_16_CJK*/ + diff --git a/inc/lvgl/src/font/lv_font_unscii_16.c b/inc/lvgl/src/font/lv_font_unscii_16.c new file mode 100644 index 0000000..b95d51a --- /dev/null +++ b/inc/lvgl/src/font/lv_font_unscii_16.c @@ -0,0 +1,641 @@ +/******************************************************************************* + * Size: 16 px + * Bpp: 1 + * Opts: --no-compress --no-prefilter --bpp 1 --size 16 --font unscii-8.ttf -r 0x20-0x7F --format lvgl -o lv_font_unscii_16.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_UNSCII_16 + #define LV_FONT_UNSCII_16 1 +#endif + +#if LV_FONT_UNSCII_16 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x0, + + /* U+0021 "!" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + + /* U+0022 "\"" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, + + /* U+0023 "#" */ + 0x3c, 0xf0, 0xf3, 0xc3, 0xcf, 0xf, 0x3c, 0xff, + 0xff, 0xff, 0xf3, 0xcf, 0xf, 0x3c, 0xff, 0xff, + 0xff, 0xf3, 0xcf, 0xf, 0x3c, 0x3c, 0xf0, 0xf3, + 0xc0, + + /* U+0024 "$" */ + 0xf, 0x0, 0xf0, 0x3f, 0xf3, 0xff, 0xf0, 0xf, + 0x0, 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0xff, + 0xcf, 0xfc, 0xf, 0x0, 0xf0, + + /* U+0025 "%" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xf, 0x3c, 0x3c, 0x3, + 0xc0, 0xf, 0x0, 0xf0, 0x3, 0xc0, 0x3c, 0x3c, + 0xf0, 0xff, 0x3, 0xfc, 0xf, + + /* U+0026 "&" */ + 0xf, 0xc0, 0x3f, 0x3, 0xcf, 0xf, 0x3c, 0xf, + 0xc0, 0x3f, 0x3, 0xf3, 0xcf, 0xcf, 0xf3, 0xf3, + 0xcf, 0xcf, 0xf, 0x3c, 0x3c, 0x3f, 0x3c, 0xfc, + 0xf0, + + /* U+0027 "'" */ + 0x3c, 0xf3, 0xcf, 0xf3, 0xc0, + + /* U+0028 "(" */ + 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, + + /* U+0029 ")" */ + 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, 0xf, 0xf, + 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0xf0, + + /* U+002A "*" */ + 0x3c, 0x3c, 0x3c, 0x3c, 0xf, 0xf0, 0xf, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xf0, 0xf, 0xf0, + 0x3c, 0x3c, 0x3c, 0x3c, + + /* U+002B "+" */ + 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xff, 0xff, + 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + + /* U+002C "," */ + 0x3c, 0xf3, 0xcf, 0xf3, 0xc0, + + /* U+002D "-" */ + 0xff, 0xff, 0xff, + + /* U+002E "." */ + 0xff, 0xff, + + /* U+002F "/" */ + 0x0, 0xf, 0x0, 0xf, 0x0, 0x3c, 0x0, 0x3c, + 0x0, 0xf0, 0x0, 0xf0, 0x3, 0xc0, 0x3, 0xc0, + 0xf, 0x0, 0xf, 0x0, 0x3c, 0x0, 0x3c, 0x0, + 0xf0, 0x0, 0xf0, 0x0, + + /* U+0030 "0" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf3, 0xff, + 0x3f, 0xfc, 0xff, 0xcf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0031 "1" */ + 0xf, 0x0, 0xf0, 0x3f, 0x3, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xff, 0xff, 0xff, + + /* U+0032 "2" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x3, 0xc0, + 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, 0xc0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+0033 "3" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x0, 0xf0, + 0xf, 0xf, 0xc0, 0xfc, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0034 "4" */ + 0x3, 0xf0, 0xf, 0xc0, 0xff, 0x3, 0xfc, 0x3c, + 0xf0, 0xf3, 0xcf, 0xf, 0x3c, 0x3c, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0x0, 0x3c, 0x0, 0xf0, 0x3, + 0xc0, + + /* U+0035 "5" */ + 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xff, 0xcf, + 0xfc, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0036 "6" */ + 0xf, 0xc0, 0xfc, 0x3c, 0x3, 0xc0, 0xf0, 0xf, + 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0037 "7" */ + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, + + /* U+0038 "8" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0039 "9" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x3, + 0xc0, 0x3c, 0x3f, 0x3, 0xf0, + + /* U+003A ":" */ + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, + + /* U+003B ";" */ + 0x3c, 0xf3, 0xcf, 0x0, 0x0, 0x0, 0x3c, 0xf3, + 0xcf, 0xf3, 0xc0, + + /* U+003C "<" */ + 0x3, 0xc0, 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, + 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, + 0xc0, 0xf0, + + /* U+003D "=" */ + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, + + /* U+003E ">" */ + 0xf0, 0x3c, 0x3, 0xc0, 0xf0, 0xf, 0x3, 0xc0, + 0x3c, 0xf, 0xf, 0x3, 0xc3, 0xc0, 0xf0, 0xf0, + 0x3c, 0x0, + + /* U+003F "?" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0x0, 0xf0, + 0xf, 0x3, 0xc0, 0x3c, 0xf, 0x0, 0xf0, 0x0, + 0x0, 0x0, 0xf, 0x0, 0xf0, + + /* U+0040 "@" */ + 0x3f, 0xf0, 0xff, 0xcf, 0x3, 0xfc, 0xf, 0xf3, + 0xff, 0xcf, 0xff, 0x3f, 0xfc, 0xff, 0xf3, 0xff, + 0xcf, 0xff, 0x0, 0x3c, 0x0, 0x3f, 0xf0, 0xff, + 0xc0, + + /* U+0041 "A" */ + 0xf, 0x0, 0xf0, 0x3f, 0xc3, 0xfc, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0042 "B" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xff, 0xcf, 0xfc, + + /* U+0043 "C" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0044 "D" */ + 0xff, 0xf, 0xf0, 0xf3, 0xcf, 0x3c, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf3, + 0xcf, 0x3c, 0xff, 0xf, 0xf0, + + /* U+0045 "E" */ + 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+0046 "F" */ + 0xff, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xf0, 0xf, 0x0, + + /* U+0047 "G" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0xf3, 0xff, 0x3f, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0048 "H" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0049 "I" */ + 0xff, 0xff, 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xff, 0xff, 0xff, + + /* U+004A "J" */ + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+004B "K" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xf, 0x3c, 0x3c, 0xf3, + 0xc3, 0xcf, 0xf, 0xf0, 0x3f, 0xc0, 0xf3, 0xc3, + 0xcf, 0xf, 0xf, 0x3c, 0x3c, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+004C "L" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+004D "M" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xcf, 0xff, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0x33, 0xfc, 0xcf, 0xf0, 0x3f, + 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+004E "N" */ + 0xf0, 0x3f, 0xc0, 0xff, 0xc3, 0xff, 0xf, 0xff, + 0x3f, 0xfc, 0xff, 0x3f, 0xfc, 0xff, 0xf0, 0xff, + 0xc3, 0xff, 0x3, 0xfc, 0xf, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+004F "O" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0050 "P" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xf0, 0xf, 0x0, + + /* U+0051 "Q" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf3, + 0xcf, 0x3c, 0x3c, 0xf3, 0xcf, + + /* U+0052 "R" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf3, 0xcf, 0x3c, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0053 "S" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, + + /* U+0055 "U" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0056 "V" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0x3f, + 0xc3, 0xfc, 0xf, 0x0, 0xf0, + + /* U+0057 "W" */ + 0xf0, 0x3f, 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf0, + 0x3f, 0xc0, 0xff, 0x33, 0xfc, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0x3f, 0xf0, 0x3f, 0xc0, + 0xf0, + + /* U+0058 "X" */ + 0xf0, 0xf, 0xf0, 0xf, 0x3c, 0x3c, 0x3c, 0x3c, + 0xf, 0xf0, 0xf, 0xf0, 0x3, 0xc0, 0x3, 0xc0, + 0xf, 0xf0, 0xf, 0xf0, 0x3c, 0x3c, 0x3c, 0x3c, + 0xf0, 0xf, 0xf0, 0xf, + + /* U+0059 "Y" */ + 0xf0, 0xf, 0xf0, 0xf, 0x3c, 0x3c, 0x3c, 0x3c, + 0xf, 0xf0, 0xf, 0xf0, 0x3, 0xc0, 0x3, 0xc0, + 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, 0x3, 0xc0, + 0x3, 0xc0, 0x3, 0xc0, + + /* U+005A "Z" */ + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x3, 0xc0, + 0x3c, 0xf, 0x0, 0xf0, 0x3c, 0x3, 0xc0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0xff, + + /* U+005B "[" */ + 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, + + /* U+005C "\\" */ + 0xf0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x3c, 0x0, + 0xf, 0x0, 0xf, 0x0, 0x3, 0xc0, 0x3, 0xc0, + 0x0, 0xf0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0x3c, + 0x0, 0xf, 0x0, 0xf, + + /* U+005D "]" */ + 0xff, 0xff, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, + 0xf, 0xf, 0xf, 0xf, 0xff, 0xff, + + /* U+005E "^" */ + 0x3, 0x0, 0xc, 0x0, 0xfc, 0x3, 0xf0, 0x3c, + 0xf0, 0xf3, 0xcf, 0x3, 0xfc, 0xf, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, + + /* U+0060 "`" */ + 0xf0, 0xf0, 0x3c, 0x3c, 0xf, 0xf, + + /* U+0061 "a" */ + 0x3f, 0xc3, 0xfc, 0x0, 0xf0, 0xf, 0x3f, 0xf3, + 0xff, 0xf0, 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0062 "b" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xff, 0xcf, + 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xff, 0xcf, 0xfc, + + /* U+0063 "c" */ + 0x3f, 0xcf, 0xff, 0x3, 0xc0, 0xf0, 0x3c, 0xf, + 0x3, 0xc0, 0x3f, 0xcf, 0xf0, + + /* U+0064 "d" */ + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x3f, 0xf3, + 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0065 "e" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0x0, 0x3f, 0xc3, 0xfc, + + /* U+0066 "f" */ + 0xf, 0xc3, 0xf3, 0xc0, 0xf0, 0xff, 0xff, 0xf3, + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c, + 0xf, 0x0, + + /* U+0067 "g" */ + 0x3f, 0xf3, 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0xff, + 0xcf, 0xfc, + + /* U+0068 "h" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xff, 0xcf, + 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, + 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+0069 "i" */ + 0x3c, 0xf, 0x0, 0x0, 0x0, 0xfc, 0x3f, 0x3, + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3f, + 0xcf, 0xf0, + + /* U+006A "j" */ + 0x3, 0xc0, 0xf0, 0x0, 0x0, 0x3, 0xc0, 0xf0, + 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3c, 0xf, 0x3, + 0xc0, 0xff, 0xf3, 0xfc, + + /* U+006B "k" */ + 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xff, + 0xf, 0xf3, 0xcf, 0x3c, 0xff, 0xf, 0xf0, 0xf3, + 0xcf, 0x3c, 0xf0, 0xff, 0xf, + + /* U+006C "l" */ + 0xfc, 0x3f, 0x3, 0xc0, 0xf0, 0x3c, 0xf, 0x3, + 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x3f, + 0xcf, 0xf0, + + /* U+006D "m" */ + 0xf0, 0xf3, 0xc3, 0xcf, 0xff, 0xff, 0xff, 0xf3, + 0x3f, 0xcc, 0xff, 0x33, 0xfc, 0xcf, 0xf0, 0x3f, + 0xc0, 0xf0, + + /* U+006E "n" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, + + /* U+006F "o" */ + 0x3f, 0xc3, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0x3f, 0xc3, 0xfc, + + /* U+0070 "p" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xff, 0xcf, 0xfc, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, + + /* U+0071 "q" */ + 0x3f, 0xf3, 0xff, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, + + /* U+0072 "r" */ + 0xff, 0xcf, 0xfc, 0xf0, 0xff, 0xf, 0xf0, 0xf, + 0x0, 0xf0, 0xf, 0x0, 0xf0, 0xf, 0x0, + + /* U+0073 "s" */ + 0x3f, 0xf3, 0xff, 0xf0, 0xf, 0x0, 0x3f, 0xc3, + 0xfc, 0x0, 0xf0, 0xf, 0xff, 0xcf, 0xfc, + + /* U+0074 "t" */ + 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0xff, 0xff, + 0xff, 0x3c, 0x3, 0xc0, 0x3c, 0x3, 0xc0, 0x3c, + 0x3, 0xc0, 0xf, 0xf0, 0xff, + + /* U+0075 "u" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0xf0, 0xff, 0xf, 0x3f, 0xf3, 0xff, + + /* U+0076 "v" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xc3, 0xfc, 0xf, 0x0, 0xf0, + + /* U+0077 "w" */ + 0xf0, 0x3f, 0xc0, 0xff, 0x3, 0xfc, 0xf, 0xf3, + 0x3f, 0xcc, 0xf3, 0xff, 0xf, 0xfc, 0x3c, 0xf0, + 0xf3, 0xc0, + + /* U+0078 "x" */ + 0xf0, 0x3f, 0xc0, 0xf3, 0xcf, 0xf, 0x3c, 0xf, + 0xc0, 0x3f, 0x3, 0xcf, 0xf, 0x3c, 0xf0, 0x3f, + 0xc0, 0xf0, + + /* U+0079 "y" */ + 0xf0, 0xff, 0xf, 0xf0, 0xff, 0xf, 0xf0, 0xff, + 0xf, 0x3f, 0xf3, 0xff, 0x0, 0xf0, 0xf, 0x3f, + 0xc3, 0xfc, + + /* U+007A "z" */ + 0xff, 0xff, 0xff, 0x3, 0xc0, 0x3c, 0xf, 0x0, + 0xf0, 0x3c, 0x3, 0xc0, 0xff, 0xff, 0xff, + + /* U+007B "{" */ + 0x3, 0xf0, 0x3f, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xfc, 0xf, 0xc0, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0x3, 0xf0, 0x3f, + + /* U+007C "|" */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+007D "}" */ + 0xfc, 0xf, 0xc0, 0xf, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0x3, 0xf0, 0x3f, 0xf, 0x0, 0xf0, 0xf, + 0x0, 0xf0, 0xfc, 0xf, 0xc0, + + /* U+007E "~" */ + 0x3f, 0x3c, 0xfc, 0xff, 0x3f, 0x3c, 0xfc, + + /* U+007F "" */ + 0xf0, 0x3, 0xc0, 0xc, 0xc0, 0x33, 0x0, 0xcc, + 0xff, 0x33, 0xfc, 0xc3, 0x33, 0xc, 0xf0, 0x33, + 0xc0, 0xc0, 0x3, 0x0, 0xc, 0x0, 0x30, 0x0, + 0xc0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 256, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 16}, + {.bitmap_index = 1, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 8, .adv_w = 256, .box_w = 12, .box_h = 6, .ofs_x = 2, .ofs_y = 10}, + {.bitmap_index = 17, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 42, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 63, .adv_w = 256, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 84, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 109, .adv_w = 256, .box_w = 6, .box_h = 6, .ofs_x = 4, .ofs_y = 10}, + {.bitmap_index = 114, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 128, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 142, .adv_w = 256, .box_w = 16, .box_h = 10, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 162, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 4}, + {.bitmap_index = 177, .adv_w = 256, .box_w = 6, .box_h = 6, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 182, .adv_w = 256, .box_w = 12, .box_h = 2, .ofs_x = 2, .ofs_y = 8}, + {.bitmap_index = 185, .adv_w = 256, .box_w = 4, .box_h = 4, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 187, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 215, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 236, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 257, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 278, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 299, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 324, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 345, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 366, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 387, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 408, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 429, .adv_w = 256, .box_w = 4, .box_h = 12, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 435, .adv_w = 256, .box_w = 6, .box_h = 14, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 446, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 464, .adv_w = 256, .box_w = 12, .box_h = 6, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 473, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 491, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 512, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 537, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 558, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 579, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 600, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 621, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 642, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 663, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 684, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 705, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 726, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 747, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 772, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 793, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 818, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 843, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 864, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 885, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 906, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 927, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 948, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 969, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 990, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1011, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1036, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1064, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1092, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1113, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1127, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1155, .adv_w = 256, .box_w = 8, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1169, .adv_w = 256, .box_w = 14, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 1183, .adv_w = 256, .box_w = 16, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1187, .adv_w = 256, .box_w = 8, .box_h = 6, .ofs_x = 6, .ofs_y = 10}, + {.bitmap_index = 1193, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1208, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1229, .adv_w = 256, .box_w = 10, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1242, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1263, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1278, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1296, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1314, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1335, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1353, .adv_w = 256, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1373, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1394, .adv_w = 256, .box_w = 10, .box_h = 14, .ofs_x = 4, .ofs_y = 2}, + {.bitmap_index = 1412, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1430, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1445, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1460, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1478, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1496, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1511, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1526, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1547, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1562, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1577, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1595, .adv_w = 256, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1613, .adv_w = 256, .box_w = 12, .box_h = 12, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1631, .adv_w = 256, .box_w = 12, .box_h = 10, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1646, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1667, .adv_w = 256, .box_w = 4, .box_h = 14, .ofs_x = 6, .ofs_y = 2}, + {.bitmap_index = 1674, .adv_w = 256, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 2}, + {.bitmap_index = 1695, .adv_w = 256, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 12}, + {.bitmap_index = 1702, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 96, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_unscii_16 = { +#else +lv_font_t lv_font_unscii_16 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 17, /*The maximum line height required by the font*/ + .base_line = 0, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = 0, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_UNSCII_16*/ diff --git a/inc/lvgl/src/font/lv_font_unscii_8.c b/inc/lvgl/src/font/lv_font_unscii_8.c new file mode 100644 index 0000000..26b92fb --- /dev/null +++ b/inc/lvgl/src/font/lv_font_unscii_8.c @@ -0,0 +1,477 @@ +/******************************************************************************* + * Size: 8 px + * Bpp: 1 + * Opts: --no-compress --no-prefilter --bpp 1 --size 8 --font unscii-8.ttf -r 0x20-0x7F --format lvgl -o lv_font_unscii_8.c --force-fast-kern-format + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE + #include "lvgl.h" +#else + #include "../../lvgl.h" +#endif + +#ifndef LV_FONT_UNSCII_8 + #define LV_FONT_UNSCII_8 1 +#endif + +#if LV_FONT_UNSCII_8 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + 0x0, + + /* U+0021 "!" */ + 0xff, 0xcc, + + /* U+0022 "\"" */ + 0xcf, 0x3c, 0xc0, + + /* U+0023 "#" */ + 0x6c, 0xdb, 0xfb, 0x6f, 0xed, 0x9b, 0x0, + + /* U+0024 "$" */ + 0x31, 0xfc, 0x1e, 0xf, 0xe3, 0x0, + + /* U+0025 "%" */ + 0xc7, 0x98, 0x61, 0x86, 0x78, 0xc0, + + /* U+0026 "&" */ + 0x38, 0xd8, 0xe3, 0xbd, 0xd9, 0x9d, 0x80, + + /* U+0027 "'" */ + 0x6f, 0x0, + + /* U+0028 "(" */ + 0x36, 0xcc, 0xc6, 0x30, + + /* U+0029 ")" */ + 0xc6, 0x33, 0x36, 0xc0, + + /* U+002A "*" */ + 0x66, 0x3c, 0xff, 0x3c, 0x66, + + /* U+002B "+" */ + 0x30, 0xcf, 0xcc, 0x30, + + /* U+002C "," */ + 0x6f, 0x0, + + /* U+002D "-" */ + 0xfc, + + /* U+002E "." */ + 0xf0, + + /* U+002F "/" */ + 0x3, 0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, + + /* U+0030 "0" */ + 0x7b, 0x3d, 0xfb, 0xcf, 0x37, 0x80, + + /* U+0031 "1" */ + 0x31, 0xc3, 0xc, 0x30, 0xcf, 0xc0, + + /* U+0032 "2" */ + 0x7b, 0x31, 0x8c, 0x63, 0xf, 0xc0, + + /* U+0033 "3" */ + 0x7b, 0x30, 0xce, 0xf, 0x37, 0x80, + + /* U+0034 "4" */ + 0x1c, 0x79, 0xb6, 0x6f, 0xe1, 0x83, 0x0, + + /* U+0035 "5" */ + 0xff, 0xf, 0x83, 0xf, 0x37, 0x80, + + /* U+0036 "6" */ + 0x39, 0x8c, 0x3e, 0xcf, 0x37, 0x80, + + /* U+0037 "7" */ + 0xfc, 0x30, 0xc6, 0x30, 0xc3, 0x0, + + /* U+0038 "8" */ + 0x7b, 0x3c, 0xde, 0xcf, 0x37, 0x80, + + /* U+0039 "9" */ + 0x7b, 0x3c, 0xdf, 0xc, 0x67, 0x0, + + /* U+003A ":" */ + 0xf0, 0xf0, + + /* U+003B ";" */ + 0x6c, 0x6, 0xf0, + + /* U+003C "<" */ + 0x19, 0x99, 0x86, 0x18, 0x60, + + /* U+003D "=" */ + 0xfc, 0xf, 0xc0, + + /* U+003E ">" */ + 0xc3, 0xc, 0x33, 0x33, 0x0, + + /* U+003F "?" */ + 0x7b, 0x30, 0xc6, 0x30, 0x3, 0x0, + + /* U+0040 "@" */ + 0x7d, 0x8f, 0x7e, 0xfd, 0xf8, 0x1f, 0x0, + + /* U+0041 "A" */ + 0x31, 0xec, 0xf3, 0xff, 0x3c, 0xc0, + + /* U+0042 "B" */ + 0xfb, 0x3c, 0xfe, 0xcf, 0x3f, 0x80, + + /* U+0043 "C" */ + 0x7b, 0x3c, 0x30, 0xc3, 0x37, 0x80, + + /* U+0044 "D" */ + 0xf3, 0x6c, 0xf3, 0xcf, 0x6f, 0x0, + + /* U+0045 "E" */ + 0xff, 0xc, 0x3e, 0xc3, 0xf, 0xc0, + + /* U+0046 "F" */ + 0xff, 0xc, 0x3e, 0xc3, 0xc, 0x0, + + /* U+0047 "G" */ + 0x7b, 0x3c, 0x37, 0xcf, 0x37, 0xc0, + + /* U+0048 "H" */ + 0xcf, 0x3c, 0xff, 0xcf, 0x3c, 0xc0, + + /* U+0049 "I" */ + 0xfc, 0xc3, 0xc, 0x30, 0xcf, 0xc0, + + /* U+004A "J" */ + 0xc, 0x30, 0xc3, 0xf, 0x37, 0x80, + + /* U+004B "K" */ + 0xc7, 0x9b, 0x67, 0x8d, 0x99, 0xb1, 0x80, + + /* U+004C "L" */ + 0xc3, 0xc, 0x30, 0xc3, 0xf, 0xc0, + + /* U+004D "M" */ + 0xc7, 0xdf, 0xfe, 0xbc, 0x78, 0xf1, 0x80, + + /* U+004E "N" */ + 0xc7, 0xcf, 0xde, 0xfc, 0xf8, 0xf1, 0x80, + + /* U+004F "O" */ + 0x7b, 0x3c, 0xf3, 0xcf, 0x37, 0x80, + + /* U+0050 "P" */ + 0xfb, 0x3c, 0xfe, 0xc3, 0xc, 0x0, + + /* U+0051 "Q" */ + 0x7b, 0x3c, 0xf3, 0xcf, 0x66, 0xc0, + + /* U+0052 "R" */ + 0xfb, 0x3c, 0xfe, 0xdb, 0x3c, 0xc0, + + /* U+0053 "S" */ + 0x7b, 0x3c, 0x1e, 0xf, 0x37, 0x80, + + /* U+0054 "T" */ + 0xfc, 0xc3, 0xc, 0x30, 0xc3, 0x0, + + /* U+0055 "U" */ + 0xcf, 0x3c, 0xf3, 0xcf, 0x37, 0x80, + + /* U+0056 "V" */ + 0xcf, 0x3c, 0xf3, 0xcd, 0xe3, 0x0, + + /* U+0057 "W" */ + 0xc7, 0x8f, 0x1e, 0xbf, 0xfd, 0xf1, 0x80, + + /* U+0058 "X" */ + 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, + + /* U+0059 "Y" */ + 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, + + /* U+005A "Z" */ + 0xfc, 0x31, 0x8c, 0x63, 0xf, 0xc0, + + /* U+005B "[" */ + 0xfc, 0xcc, 0xcc, 0xf0, + + /* U+005C "\\" */ + 0xc0, 0x60, 0x30, 0x18, 0xc, 0x6, 0x3, + + /* U+005D "]" */ + 0xf3, 0x33, 0x33, 0xf0, + + /* U+005E "^" */ + 0x10, 0x71, 0xb6, 0x30, + + /* U+005F "_" */ + 0xff, + + /* U+0060 "`" */ + 0xc6, 0x30, + + /* U+0061 "a" */ + 0x78, 0x37, 0xf3, 0x7c, + + /* U+0062 "b" */ + 0xc3, 0xf, 0xb3, 0xcf, 0x3f, 0x80, + + /* U+0063 "c" */ + 0x7e, 0x31, 0x87, 0x80, + + /* U+0064 "d" */ + 0xc, 0x37, 0xf3, 0xcf, 0x37, 0xc0, + + /* U+0065 "e" */ + 0x7b, 0x3f, 0xf0, 0x78, + + /* U+0066 "f" */ + 0x3b, 0x3e, 0xc6, 0x31, 0x80, + + /* U+0067 "g" */ + 0x7f, 0x3c, 0xdf, 0xf, 0xe0, + + /* U+0068 "h" */ + 0xc3, 0xf, 0xb3, 0xcf, 0x3c, 0xc0, + + /* U+0069 "i" */ + 0x60, 0x38, 0xc6, 0x31, 0xe0, + + /* U+006A "j" */ + 0x18, 0x6, 0x31, 0x8c, 0x7e, + + /* U+006B "k" */ + 0xc3, 0xc, 0xf6, 0xf3, 0x6c, 0xc0, + + /* U+006C "l" */ + 0xe3, 0x18, 0xc6, 0x31, 0xe0, + + /* U+006D "m" */ + 0xcd, 0xff, 0x5e, 0xbc, 0x60, + + /* U+006E "n" */ + 0xfb, 0x3c, 0xf3, 0xcc, + + /* U+006F "o" */ + 0x7b, 0x3c, 0xf3, 0x78, + + /* U+0070 "p" */ + 0xfb, 0x3c, 0xfe, 0xc3, 0x0, + + /* U+0071 "q" */ + 0x7f, 0x3c, 0xdf, 0xc, 0x30, + + /* U+0072 "r" */ + 0xfb, 0x3c, 0x30, 0xc0, + + /* U+0073 "s" */ + 0x7f, 0x7, 0x83, 0xf8, + + /* U+0074 "t" */ + 0x61, 0x8f, 0xd8, 0x61, 0x83, 0xc0, + + /* U+0075 "u" */ + 0xcf, 0x3c, 0xf3, 0x7c, + + /* U+0076 "v" */ + 0xcf, 0x3c, 0xde, 0x30, + + /* U+0077 "w" */ + 0xc7, 0x8f, 0x5b, 0xe6, 0xc0, + + /* U+0078 "x" */ + 0xc6, 0xd8, 0xe3, 0x6c, 0x60, + + /* U+0079 "y" */ + 0xcf, 0x3c, 0xdf, 0xd, 0xe0, + + /* U+007A "z" */ + 0xfc, 0x63, 0x18, 0xfc, + + /* U+007B "{" */ + 0x1c, 0xc3, 0x38, 0x30, 0xc1, 0xc0, + + /* U+007C "|" */ + 0xff, 0xfc, + + /* U+007D "}" */ + 0xe0, 0xc3, 0x7, 0x30, 0xce, 0x0, + + /* U+007E "~" */ + 0x77, 0xb8, + + /* U+007F "" */ + 0xc1, 0x42, 0xbd, 0x2c, 0x40, 0x81, 0x0 +}; + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 128, .box_w = 1, .box_h = 1, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 1, .adv_w = 128, .box_w = 2, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 3, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 6, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 13, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 19, .adv_w = 128, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 25, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 32, .adv_w = 128, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 34, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 38, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 42, .adv_w = 128, .box_w = 8, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 47, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 51, .adv_w = 128, .box_w = 3, .box_h = 3, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 53, .adv_w = 128, .box_w = 6, .box_h = 1, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 54, .adv_w = 128, .box_w = 2, .box_h = 2, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 55, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 62, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 68, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 74, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 80, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 86, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 93, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 99, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 105, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 111, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 117, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 123, .adv_w = 128, .box_w = 2, .box_h = 6, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 125, .adv_w = 128, .box_w = 3, .box_h = 7, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 128, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 133, .adv_w = 128, .box_w = 6, .box_h = 3, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 136, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 141, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 147, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 154, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 160, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 166, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 172, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 178, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 184, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 190, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 196, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 202, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 208, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 214, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 221, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 227, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 234, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 241, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 247, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 253, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 259, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 265, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 271, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 277, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 283, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 289, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 296, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 303, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 310, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 316, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 320, .adv_w = 128, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 327, .adv_w = 128, .box_w = 4, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 331, .adv_w = 128, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 335, .adv_w = 128, .box_w = 8, .box_h = 1, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 336, .adv_w = 128, .box_w = 4, .box_h = 3, .ofs_x = 3, .ofs_y = 5}, + {.bitmap_index = 338, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 342, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 348, .adv_w = 128, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 352, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 358, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 362, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 367, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 372, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 378, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 383, .adv_w = 128, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 388, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 394, .adv_w = 128, .box_w = 5, .box_h = 7, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 399, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 404, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 408, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 412, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 417, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 422, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 426, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 430, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 436, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 440, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 444, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 449, .adv_w = 128, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 454, .adv_w = 128, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 459, .adv_w = 128, .box_w = 6, .box_h = 5, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 463, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 469, .adv_w = 128, .box_w = 2, .box_h = 7, .ofs_x = 3, .ofs_y = 1}, + {.bitmap_index = 471, .adv_w = 128, .box_w = 6, .box_h = 7, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 477, .adv_w = 128, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 479, .adv_w = 128, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = { + { + .range_start = 32, .range_length = 96, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR >= 8 +/*Store all the custom data of the font*/ + +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 1, + .kern_classes = 0, + .bitmap_format = 0, + +}; + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t lv_font_unscii_8 = { +#else +lv_font_t lv_font_unscii_8 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 9, /*The maximum line height required by the font*/ + .base_line = 0, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = 0, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_UNSCII_8*/ diff --git a/inc/lvgl/src/font/lv_symbol_def.h b/inc/lvgl/src/font/lv_symbol_def.h new file mode 100644 index 0000000..a3114d1 --- /dev/null +++ b/inc/lvgl/src/font/lv_symbol_def.h @@ -0,0 +1,357 @@ +/** + * @file lv_symbol_def.h + * + */ + +#ifndef LV_SYMBOL_DEF_H +#define LV_SYMBOL_DEF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../lv_conf_internal.h" + +/*------------------------------- + * Symbols from "normal" font + *-----------------------------*/ +#if !defined LV_SYMBOL_BULLET +#define LV_SYMBOL_BULLET "\xE2\x80\xA2" /*20042, 0x2022*/ +#endif + +/*------------------------------- + * Symbols from FontAwesome font + *-----------------------------*/ + +/*In the font converter use this list as range: + 61441, 61448, 61451, 61452, 61453, 61457, 61459, 61461, 61465, 61468, + 61473, 61478, 61479, 61480, 61502, 61507, 61512, 61515, 61516, 61517, + 61521, 61522, 61523, 61524, 61543, 61544, 61550, 61552, 61553, 61556, + 61559, 61560, 61561, 61563, 61587, 61589, 61636, 61637, 61639, 61641, + 61664, 61671, 61674, 61683, 61724, 61732, 61787, 61931, 62016, 62017, + 62018, 62019, 62020, 62087, 62099, 62189, 62212, 62810, 63426, 63650 +*/ + +/* These symbols can be predefined in the lv_conf.h file. + * If they are not predefined, they will use the following values + */ + +#if !defined LV_SYMBOL_AUDIO +#define LV_SYMBOL_AUDIO "\xEF\x80\x81" /*61441, 0xF001*/ +#endif + +#if !defined LV_SYMBOL_VIDEO +#define LV_SYMBOL_VIDEO "\xEF\x80\x88" /*61448, 0xF008*/ +#endif + +#if !defined LV_SYMBOL_LIST +#define LV_SYMBOL_LIST "\xEF\x80\x8B" /*61451, 0xF00B*/ +#endif + +#if !defined LV_SYMBOL_OK +#define LV_SYMBOL_OK "\xEF\x80\x8C" /*61452, 0xF00C*/ +#endif + +#if !defined LV_SYMBOL_CLOSE +#define LV_SYMBOL_CLOSE "\xEF\x80\x8D" /*61453, 0xF00D*/ +#endif + +#if !defined LV_SYMBOL_POWER +#define LV_SYMBOL_POWER "\xEF\x80\x91" /*61457, 0xF011*/ +#endif + +#if !defined LV_SYMBOL_SETTINGS +#define LV_SYMBOL_SETTINGS "\xEF\x80\x93" /*61459, 0xF013*/ +#endif + +#if !defined LV_SYMBOL_HOME +#define LV_SYMBOL_HOME "\xEF\x80\x95" /*61461, 0xF015*/ +#endif + +#if !defined LV_SYMBOL_DOWNLOAD +#define LV_SYMBOL_DOWNLOAD "\xEF\x80\x99" /*61465, 0xF019*/ +#endif + +#if !defined LV_SYMBOL_DRIVE +#define LV_SYMBOL_DRIVE "\xEF\x80\x9C" /*61468, 0xF01C*/ +#endif + +#if !defined LV_SYMBOL_REFRESH +#define LV_SYMBOL_REFRESH "\xEF\x80\xA1" /*61473, 0xF021*/ +#endif + +#if !defined LV_SYMBOL_MUTE +#define LV_SYMBOL_MUTE "\xEF\x80\xA6" /*61478, 0xF026*/ +#endif + +#if !defined LV_SYMBOL_VOLUME_MID +#define LV_SYMBOL_VOLUME_MID "\xEF\x80\xA7" /*61479, 0xF027*/ +#endif + +#if !defined LV_SYMBOL_VOLUME_MAX +#define LV_SYMBOL_VOLUME_MAX "\xEF\x80\xA8" /*61480, 0xF028*/ +#endif + +#if !defined LV_SYMBOL_IMAGE +#define LV_SYMBOL_IMAGE "\xEF\x80\xBE" /*61502, 0xF03E*/ +#endif + +#if !defined LV_SYMBOL_TINT +#define LV_SYMBOL_TINT "\xEF\x81\x83" /*61507, 0xF043*/ +#endif + +#if !defined LV_SYMBOL_PREV +#define LV_SYMBOL_PREV "\xEF\x81\x88" /*61512, 0xF048*/ +#endif + +#if !defined LV_SYMBOL_PLAY +#define LV_SYMBOL_PLAY "\xEF\x81\x8B" /*61515, 0xF04B*/ +#endif + +#if !defined LV_SYMBOL_PAUSE +#define LV_SYMBOL_PAUSE "\xEF\x81\x8C" /*61516, 0xF04C*/ +#endif + +#if !defined LV_SYMBOL_STOP +#define LV_SYMBOL_STOP "\xEF\x81\x8D" /*61517, 0xF04D*/ +#endif + +#if !defined LV_SYMBOL_NEXT +#define LV_SYMBOL_NEXT "\xEF\x81\x91" /*61521, 0xF051*/ +#endif + +#if !defined LV_SYMBOL_EJECT +#define LV_SYMBOL_EJECT "\xEF\x81\x92" /*61522, 0xF052*/ +#endif + +#if !defined LV_SYMBOL_LEFT +#define LV_SYMBOL_LEFT "\xEF\x81\x93" /*61523, 0xF053*/ +#endif + +#if !defined LV_SYMBOL_RIGHT +#define LV_SYMBOL_RIGHT "\xEF\x81\x94" /*61524, 0xF054*/ +#endif + +#if !defined LV_SYMBOL_PLUS +#define LV_SYMBOL_PLUS "\xEF\x81\xA7" /*61543, 0xF067*/ +#endif + +#if !defined LV_SYMBOL_MINUS +#define LV_SYMBOL_MINUS "\xEF\x81\xA8" /*61544, 0xF068*/ +#endif + +#if !defined LV_SYMBOL_EYE_OPEN +#define LV_SYMBOL_EYE_OPEN "\xEF\x81\xAE" /*61550, 0xF06E*/ +#endif + +#if !defined LV_SYMBOL_EYE_CLOSE +#define LV_SYMBOL_EYE_CLOSE "\xEF\x81\xB0" /*61552, 0xF070*/ +#endif + +#if !defined LV_SYMBOL_WARNING +#define LV_SYMBOL_WARNING "\xEF\x81\xB1" /*61553, 0xF071*/ +#endif + +#if !defined LV_SYMBOL_SHUFFLE +#define LV_SYMBOL_SHUFFLE "\xEF\x81\xB4" /*61556, 0xF074*/ +#endif + +#if !defined LV_SYMBOL_UP +#define LV_SYMBOL_UP "\xEF\x81\xB7" /*61559, 0xF077*/ +#endif + +#if !defined LV_SYMBOL_DOWN +#define LV_SYMBOL_DOWN "\xEF\x81\xB8" /*61560, 0xF078*/ +#endif + +#if !defined LV_SYMBOL_LOOP +#define LV_SYMBOL_LOOP "\xEF\x81\xB9" /*61561, 0xF079*/ +#endif + +#if !defined LV_SYMBOL_DIRECTORY +#define LV_SYMBOL_DIRECTORY "\xEF\x81\xBB" /*61563, 0xF07B*/ +#endif + +#if !defined LV_SYMBOL_UPLOAD +#define LV_SYMBOL_UPLOAD "\xEF\x82\x93" /*61587, 0xF093*/ +#endif + +#if !defined LV_SYMBOL_CALL +#define LV_SYMBOL_CALL "\xEF\x82\x95" /*61589, 0xF095*/ +#endif + +#if !defined LV_SYMBOL_CUT +#define LV_SYMBOL_CUT "\xEF\x83\x84" /*61636, 0xF0C4*/ +#endif + +#if !defined LV_SYMBOL_COPY +#define LV_SYMBOL_COPY "\xEF\x83\x85" /*61637, 0xF0C5*/ +#endif + +#if !defined LV_SYMBOL_SAVE +#define LV_SYMBOL_SAVE "\xEF\x83\x87" /*61639, 0xF0C7*/ +#endif + +#if !defined LV_SYMBOL_BARS +#define LV_SYMBOL_BARS "\xEF\x83\x89" /*61641, 0xF0C9*/ +#endif + +#if !defined LV_SYMBOL_ENVELOPE +#define LV_SYMBOL_ENVELOPE "\xEF\x83\xA0" /*61664, 0xF0E0*/ +#endif + +#if !defined LV_SYMBOL_CHARGE +#define LV_SYMBOL_CHARGE "\xEF\x83\xA7" /*61671, 0xF0E7*/ +#endif + +#if !defined LV_SYMBOL_PASTE +#define LV_SYMBOL_PASTE "\xEF\x83\xAA" /*61674, 0xF0EA*/ +#endif + +#if !defined LV_SYMBOL_BELL +#define LV_SYMBOL_BELL "\xEF\x83\xB3" /*61683, 0xF0F3*/ +#endif + +#if !defined LV_SYMBOL_KEYBOARD +#define LV_SYMBOL_KEYBOARD "\xEF\x84\x9C" /*61724, 0xF11C*/ +#endif + +#if !defined LV_SYMBOL_GPS +#define LV_SYMBOL_GPS "\xEF\x84\xA4" /*61732, 0xF124*/ +#endif + +#if !defined LV_SYMBOL_FILE +#define LV_SYMBOL_FILE "\xEF\x85\x9B" /*61787, 0xF158*/ +#endif + +#if !defined LV_SYMBOL_WIFI +#define LV_SYMBOL_WIFI "\xEF\x87\xAB" /*61931, 0xF1EB*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_FULL +#define LV_SYMBOL_BATTERY_FULL "\xEF\x89\x80" /*62016, 0xF240*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_3 +#define LV_SYMBOL_BATTERY_3 "\xEF\x89\x81" /*62017, 0xF241*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_2 +#define LV_SYMBOL_BATTERY_2 "\xEF\x89\x82" /*62018, 0xF242*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_1 +#define LV_SYMBOL_BATTERY_1 "\xEF\x89\x83" /*62019, 0xF243*/ +#endif + +#if !defined LV_SYMBOL_BATTERY_EMPTY +#define LV_SYMBOL_BATTERY_EMPTY "\xEF\x89\x84" /*62020, 0xF244*/ +#endif + +#if !defined LV_SYMBOL_USB +#define LV_SYMBOL_USB "\xEF\x8a\x87" /*62087, 0xF287*/ +#endif + +#if !defined LV_SYMBOL_BLUETOOTH +#define LV_SYMBOL_BLUETOOTH "\xEF\x8a\x93" /*62099, 0xF293*/ +#endif + +#if !defined LV_SYMBOL_TRASH +#define LV_SYMBOL_TRASH "\xEF\x8B\xAD" /*62189, 0xF2ED*/ +#endif + +#if !defined LV_SYMBOL_EDIT +#define LV_SYMBOL_EDIT "\xEF\x8C\x84" /*62212, 0xF304*/ +#endif + +#if !defined LV_SYMBOL_BACKSPACE +#define LV_SYMBOL_BACKSPACE "\xEF\x95\x9A" /*62810, 0xF55A*/ +#endif + +#if !defined LV_SYMBOL_SD_CARD +#define LV_SYMBOL_SD_CARD "\xEF\x9F\x82" /*63426, 0xF7C2*/ +#endif + +#if !defined LV_SYMBOL_NEW_LINE +#define LV_SYMBOL_NEW_LINE "\xEF\xA2\xA2" /*63650, 0xF8A2*/ +#endif + +#if !defined LV_SYMBOL_DUMMY +/** Invalid symbol at (U+F8FF). If written before a string then `lv_img` will show it as a label*/ +#define LV_SYMBOL_DUMMY "\xEF\xA3\xBF" +#endif + +/* + * The following list is generated using + * cat src/font/lv_symbol_def.h | sed -E -n 's/^#define\s+LV_(SYMBOL_\w+).*".*$/ LV_STR_\1,/p' + */ +enum _lv_str_symbol_id_t { + LV_STR_SYMBOL_BULLET, + LV_STR_SYMBOL_AUDIO, + LV_STR_SYMBOL_VIDEO, + LV_STR_SYMBOL_LIST, + LV_STR_SYMBOL_OK, + LV_STR_SYMBOL_CLOSE, + LV_STR_SYMBOL_POWER, + LV_STR_SYMBOL_SETTINGS, + LV_STR_SYMBOL_HOME, + LV_STR_SYMBOL_DOWNLOAD, + LV_STR_SYMBOL_DRIVE, + LV_STR_SYMBOL_REFRESH, + LV_STR_SYMBOL_MUTE, + LV_STR_SYMBOL_VOLUME_MID, + LV_STR_SYMBOL_VOLUME_MAX, + LV_STR_SYMBOL_IMAGE, + LV_STR_SYMBOL_TINT, + LV_STR_SYMBOL_PREV, + LV_STR_SYMBOL_PLAY, + LV_STR_SYMBOL_PAUSE, + LV_STR_SYMBOL_STOP, + LV_STR_SYMBOL_NEXT, + LV_STR_SYMBOL_EJECT, + LV_STR_SYMBOL_LEFT, + LV_STR_SYMBOL_RIGHT, + LV_STR_SYMBOL_PLUS, + LV_STR_SYMBOL_MINUS, + LV_STR_SYMBOL_EYE_OPEN, + LV_STR_SYMBOL_EYE_CLOSE, + LV_STR_SYMBOL_WARNING, + LV_STR_SYMBOL_SHUFFLE, + LV_STR_SYMBOL_UP, + LV_STR_SYMBOL_DOWN, + LV_STR_SYMBOL_LOOP, + LV_STR_SYMBOL_DIRECTORY, + LV_STR_SYMBOL_UPLOAD, + LV_STR_SYMBOL_CALL, + LV_STR_SYMBOL_CUT, + LV_STR_SYMBOL_COPY, + LV_STR_SYMBOL_SAVE, + LV_STR_SYMBOL_BARS, + LV_STR_SYMBOL_ENVELOPE, + LV_STR_SYMBOL_CHARGE, + LV_STR_SYMBOL_PASTE, + LV_STR_SYMBOL_BELL, + LV_STR_SYMBOL_KEYBOARD, + LV_STR_SYMBOL_GPS, + LV_STR_SYMBOL_FILE, + LV_STR_SYMBOL_WIFI, + LV_STR_SYMBOL_BATTERY_FULL, + LV_STR_SYMBOL_BATTERY_3, + LV_STR_SYMBOL_BATTERY_2, + LV_STR_SYMBOL_BATTERY_1, + LV_STR_SYMBOL_BATTERY_EMPTY, + LV_STR_SYMBOL_USB, + LV_STR_SYMBOL_BLUETOOTH, + LV_STR_SYMBOL_TRASH, + LV_STR_SYMBOL_EDIT, + LV_STR_SYMBOL_BACKSPACE, + LV_STR_SYMBOL_SD_CARD, + LV_STR_SYMBOL_NEW_LINE, + LV_STR_SYMBOL_DUMMY, +}; + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SYMBOL_DEF_H*/ diff --git a/inc/lvgl/src/indev/lv_gridnav.c b/inc/lvgl/src/indev/lv_gridnav.c new file mode 100644 index 0000000..ddc5136 --- /dev/null +++ b/inc/lvgl/src/indev/lv_gridnav.c @@ -0,0 +1,400 @@ +/** + * @file lv_gridnav.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gridnav.h" +#if LV_USE_GRIDNAV + +#include "../misc/lv_assert.h" +#include "../misc/lv_math.h" +#include "../indev/lv_indev.h" +#include "../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_gridnav_ctrl_t ctrl; + lv_obj_t * focused_obj; +} lv_gridnav_dsc_t; + +typedef enum { + FIND_LEFT, + FIND_RIGHT, + FIND_TOP, + FIND_BOTTOM, + FIND_NEXT_ROW_FIRST_ITEM, + FIND_PREV_ROW_LAST_ITEM, + FIND_FIRST_ROW, + FIND_LAST_ROW, +} find_mode_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void gridnav_event_cb(lv_event_t * e); +static lv_obj_t * find_chid(lv_obj_t * obj, lv_obj_t * start_child, find_mode_t mode); +static lv_obj_t * find_first_focusable(lv_obj_t * obj); +static lv_obj_t * find_last_focusable(lv_obj_t * obj); +static bool obj_is_focusable(lv_obj_t * obj); +static int32_t get_x_center(lv_obj_t * obj); +static int32_t get_y_center(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_gridnav_add(lv_obj_t * obj, lv_gridnav_ctrl_t ctrl) +{ + lv_gridnav_remove(obj); /*Be sure to not add gridnav twice*/ + + lv_gridnav_dsc_t * dsc = lv_malloc(sizeof(lv_gridnav_dsc_t)); + LV_ASSERT_MALLOC(dsc); + dsc->ctrl = ctrl; + dsc->focused_obj = NULL; + lv_obj_add_event_cb(obj, gridnav_event_cb, LV_EVENT_ALL, dsc); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_WITH_ARROW); +} + +void lv_gridnav_remove(lv_obj_t * obj) +{ + lv_event_dsc_t * event_dsc = NULL; + uint32_t event_cnt = lv_obj_get_event_count(obj); + uint32_t i; + for(i = 0; i < event_cnt; i++) { + event_dsc = lv_obj_get_event_dsc(obj, i); + if(lv_event_dsc_get_cb(event_dsc) == gridnav_event_cb) { + lv_free(lv_event_dsc_get_user_data(event_dsc)); + lv_obj_remove_event(obj, i); + break; + } + } + +} + +void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en) +{ + LV_ASSERT_NULL(to_focus); + + uint32_t i; + uint32_t event_cnt = lv_obj_get_event_count(cont); + lv_gridnav_dsc_t * dsc = NULL; + for(i = 0; i < event_cnt; i++) { + lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(cont, i); + if(lv_event_dsc_get_cb(event_dsc) == gridnav_event_cb) { + dsc = lv_event_dsc_get_user_data(event_dsc); + break; + } + } + + if(dsc == NULL) { + LV_LOG_WARN("`cont` is not a gridnav container"); + return; + } + + if(obj_is_focusable(to_focus) == false) { + LV_LOG_WARN("The object to focus is not focusable"); + return; + } + + if(dsc->focused_obj) { + lv_obj_remove_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + } + + lv_obj_add_state(to_focus, (lv_state_t)(LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY)); + lv_obj_scroll_to_view(to_focus, anim_en); + dsc->focused_obj = to_focus; + +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void gridnav_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_gridnav_dsc_t * dsc = lv_event_get_user_data(e); + lv_event_code_t code = lv_event_get_code(e); + + if(code == LV_EVENT_KEY) { + uint32_t child_cnt = lv_obj_get_child_count(obj); + if(child_cnt == 0) return; + + if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); + if(dsc->focused_obj == NULL) return; + + uint32_t key = lv_event_get_key(e); + lv_obj_t * guess = NULL; + + if(key == LV_KEY_RIGHT && !(dsc->ctrl & LV_GRIDNAV_CTRL_VERTICAL_MOVE_ONLY)) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_right(dsc->focused_obj) > 0) { + int32_t d = lv_obj_get_width(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, -d, 0, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_RIGHT); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_NEXT_ROW_FIRST_ITEM); + if(guess == NULL) guess = find_first_focusable(obj); + } + else { + lv_group_focus_next(lv_obj_get_group(obj)); + } + } + } + } + else if(key == LV_KEY_LEFT && !(dsc->ctrl & LV_GRIDNAV_CTRL_VERTICAL_MOVE_ONLY)) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_left(dsc->focused_obj) > 0) { + int32_t d = lv_obj_get_width(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, d, 0, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_LEFT); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_PREV_ROW_LAST_ITEM); + if(guess == NULL) guess = find_last_focusable(obj); + } + else { + lv_group_focus_prev(lv_obj_get_group(obj)); + } + } + } + } + else if(key == LV_KEY_DOWN && !(dsc->ctrl & LV_GRIDNAV_CTRL_HORIZONTAL_MOVE_ONLY)) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_bottom(dsc->focused_obj) > 0) { + int32_t d = lv_obj_get_height(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, 0, -d, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_BOTTOM); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_FIRST_ROW); + } + else { + lv_group_focus_next(lv_obj_get_group(obj)); + } + } + } + } + else if(key == LV_KEY_UP && !(dsc->ctrl & LV_GRIDNAV_CTRL_HORIZONTAL_MOVE_ONLY)) { + if((dsc->ctrl & LV_GRIDNAV_CTRL_SCROLL_FIRST) && lv_obj_has_flag(dsc->focused_obj, LV_OBJ_FLAG_SCROLLABLE) && + lv_obj_get_scroll_top(dsc->focused_obj) > 0) { + int32_t d = lv_obj_get_height(dsc->focused_obj) / 4; + if(d <= 0) d = 1; + lv_obj_scroll_by_bounded(dsc->focused_obj, 0, d, LV_ANIM_ON); + } + else { + guess = find_chid(obj, dsc->focused_obj, FIND_TOP); + if(guess == NULL) { + if(dsc->ctrl & LV_GRIDNAV_CTRL_ROLLOVER) { + guess = find_chid(obj, dsc->focused_obj, FIND_LAST_ROW); + } + else { + lv_group_focus_prev(lv_obj_get_group(obj)); + } + } + } + } + else { + if(lv_group_get_focused(lv_obj_get_group(obj)) == obj) { + lv_obj_send_event(dsc->focused_obj, LV_EVENT_KEY, &key); + } + } + + if(guess && guess != dsc->focused_obj) { + lv_obj_remove_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + lv_obj_send_event(dsc->focused_obj, LV_EVENT_DEFOCUSED, lv_indev_active()); + lv_obj_add_state(guess, (lv_state_t)(LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY)); + lv_obj_send_event(guess, LV_EVENT_FOCUSED, lv_indev_active()); + lv_obj_scroll_to_view(guess, LV_ANIM_ON); + dsc->focused_obj = guess; + } + } + else if(code == LV_EVENT_FOCUSED) { + if(dsc->focused_obj == NULL) dsc->focused_obj = find_first_focusable(obj); + if(dsc->focused_obj) { + lv_obj_add_state(dsc->focused_obj, (lv_state_t)(LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY)); + lv_obj_remove_state(dsc->focused_obj, LV_STATE_PRESSED); /*Be sure the focuses obj is not stuck in pressed state*/ + lv_obj_scroll_to_view(dsc->focused_obj, LV_ANIM_OFF); + } + } + else if(code == LV_EVENT_DEFOCUSED) { + if(dsc->focused_obj) { + lv_obj_remove_state(dsc->focused_obj, LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY); + } + } + else if(code == LV_EVENT_CHILD_CREATED) { + lv_obj_t * child = lv_event_get_target(e); + if(lv_obj_get_parent(child) == obj) { + if(dsc->focused_obj == NULL) { + dsc->focused_obj = child; + if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) { + lv_obj_add_state(child, (lv_state_t)(LV_STATE_FOCUSED | LV_STATE_FOCUS_KEY)); + lv_obj_scroll_to_view(child, LV_ANIM_OFF); + } + } + } + } + else if(code == LV_EVENT_CHILD_DELETED) { + /*This event bubble, so be sure this object's child was deleted. + *As we don't know which object was deleted we can't make the next focused. + *So make the first object focused*/ + lv_obj_t * target = lv_event_get_target(e); + if(target == obj) { + dsc->focused_obj = find_first_focusable(obj); + } + } + else if(code == LV_EVENT_DELETE) { + lv_gridnav_remove(obj); + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING || code == LV_EVENT_PRESS_LOST || + code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED || code == LV_EVENT_LONG_PRESSED_REPEAT || + code == LV_EVENT_CLICKED || code == LV_EVENT_RELEASED) { + if(lv_group_get_focused(lv_obj_get_group(obj)) == obj) { + /*Forward press/release related event too*/ + lv_indev_type_t t = lv_indev_get_type(lv_indev_active()); + if(t == LV_INDEV_TYPE_ENCODER || t == LV_INDEV_TYPE_KEYPAD) { + lv_obj_send_event(dsc->focused_obj, code, lv_indev_active()); + } + } + } +} + +static lv_obj_t * find_chid(lv_obj_t * obj, lv_obj_t * start_child, find_mode_t mode) +{ + int32_t x_start = get_x_center(start_child); + int32_t y_start = get_y_center(start_child); + uint32_t child_cnt = lv_obj_get_child_count(obj); + lv_obj_t * guess = NULL; + int32_t x_err_guess = LV_COORD_MAX; + int32_t y_err_guess = LV_COORD_MAX; + int32_t h_half = lv_obj_get_height(start_child) / 2; + int32_t h_max = lv_obj_get_height(obj) + lv_obj_get_scroll_top(obj) + lv_obj_get_scroll_bottom(obj); + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(child == start_child) continue; + if(obj_is_focusable(child) == false) continue; + + int32_t x_err = 0; + int32_t y_err = 0; + switch(mode) { + case FIND_LEFT: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(x_err >= 0) continue; /*It's on the right*/ + if(LV_ABS(y_err) > h_half) continue; /*Too far*/ + break; + case FIND_RIGHT: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(x_err <= 0) continue; /*It's on the left*/ + if(LV_ABS(y_err) > h_half) continue; /*Too far*/ + break; + case FIND_TOP: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(y_err >= 0) continue; /*It's on the bottom*/ + break; + case FIND_BOTTOM: + x_err = get_x_center(child) - x_start; + y_err = get_y_center(child) - y_start; + if(y_err <= 0) continue; /*It's on the top*/ + break; + case FIND_NEXT_ROW_FIRST_ITEM: + y_err = get_y_center(child) - y_start; + if(y_err <= 0) continue; /*It's on the top*/ + x_err = lv_obj_get_x(child); + break; + case FIND_PREV_ROW_LAST_ITEM: + y_err = get_y_center(child) - y_start; + if(y_err >= 0) continue; /*It's on the bottom*/ + x_err = obj->coords.x2 - child->coords.x2; + break; + case FIND_FIRST_ROW: + x_err = get_x_center(child) - x_start; + y_err = lv_obj_get_y(child); + break; + case FIND_LAST_ROW: + x_err = get_x_center(child) - x_start; + y_err = h_max - lv_obj_get_y(child); + } + + if(guess == NULL || + (y_err * y_err + x_err * x_err < y_err_guess * y_err_guess + x_err_guess * x_err_guess)) { + guess = child; + x_err_guess = x_err; + y_err_guess = y_err; + } + } + return guess; +} + +static lv_obj_t * find_first_focusable(lv_obj_t * obj) +{ + uint32_t child_cnt = lv_obj_get_child_count(obj); + uint32_t i; + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(obj_is_focusable(child)) return child; + + } + return NULL; +} + +static lv_obj_t * find_last_focusable(lv_obj_t * obj) +{ + uint32_t child_cnt = lv_obj_get_child_count(obj); + int32_t i; + for(i = child_cnt - 1; i >= 0; i--) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(obj_is_focusable(child)) return child; + } + return NULL; +} + +static bool obj_is_focusable(lv_obj_t * obj) +{ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return false; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_CLICK_FOCUSABLE)) return true; + else return false; +} + +static int32_t get_x_center(lv_obj_t * obj) +{ + return obj->coords.x1 + lv_area_get_width(&obj->coords) / 2; +} + +static int32_t get_y_center(lv_obj_t * obj) +{ + return obj->coords.y1 + lv_area_get_height(&obj->coords) / 2; +} + +#endif /*LV_USE_GRIDNAV*/ diff --git a/inc/lvgl/src/indev/lv_gridnav.h b/inc/lvgl/src/indev/lv_gridnav.h new file mode 100644 index 0000000..59fb80d --- /dev/null +++ b/inc/lvgl/src/indev/lv_gridnav.h @@ -0,0 +1,95 @@ +/** + * @file lv_gridnav.h + * + */ + +#ifndef LV_GRIDNAV_H +#define LV_GRIDNAV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" + +#if LV_USE_GRIDNAV + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_GRIDNAV_CTRL_NONE = 0x0, + + /** + * If there is no next/previous object in a direction, + * the focus goes to the object in the next/previous row (on left/right keys) + * or first/last row (on up/down keys) + */ + LV_GRIDNAV_CTRL_ROLLOVER = 0x1, + + /** + * If an arrow is pressed and the focused object can be scrolled in that direction + * then it will be scrolled instead of going to the next/previous object. + * If there is no more room for scrolling the next/previous object will be focused normally */ + LV_GRIDNAV_CTRL_SCROLL_FIRST = 0x2, + + /** + * Only use left/right keys for grid navigation. Up/down key events will be sent to the + * focused object. + */ + LV_GRIDNAV_CTRL_HORIZONTAL_MOVE_ONLY = 0x4, + + /** + * Only use up/down keys for grid navigation. Left/right key events will be sent to the + * focused object. + */ + LV_GRIDNAV_CTRL_VERTICAL_MOVE_ONLY = 0x8 + +} lv_gridnav_ctrl_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Add grid navigation feature to an object. It expects the children to be arranged + * into a grid-like layout. Although it's not required to have pixel perfect alignment. + * This feature makes possible to use keys to navigate among the children and focus them. + * The keys other than arrows and press/release related events + * are forwarded to the focused child. + * @param obj pointer to an object on which navigation should be applied. + * @param ctrl control flags from `lv_gridnav_ctrl_t`. + */ +void lv_gridnav_add(lv_obj_t * obj, lv_gridnav_ctrl_t ctrl); + +/** + * Remove the grid navigation support from an object + * @param obj pointer to an object + */ +void lv_gridnav_remove(lv_obj_t * obj); + +/** + * Manually focus an object on gridnav container + * @param cont pointer to a gridnav container + * @param to_focus pointer to an object to focus + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_gridnav_set_focused(lv_obj_t * cont, lv_obj_t * to_focus, lv_anim_enable_t anim_en); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_GRIDNAV*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_GRIDNAV_H */ diff --git a/inc/lvgl/src/indev/lv_indev.c b/inc/lvgl/src/indev/lv_indev.c new file mode 100644 index 0000000..af2f8a8 --- /dev/null +++ b/inc/lvgl/src/indev/lv_indev.c @@ -0,0 +1,1954 @@ +#include "lv_indev_private.h" +#include "../misc/lv_event_private.h" +#include "../misc/lv_area_private.h" +#include "../misc/lv_anim_private.h" +#include "../core/lv_obj_draw_private.h" +/** + * @file lv_indev.c + * + */ + +/********************* + * INCLUDES + ********************/ +#include "lv_indev_scroll.h" +#include "lv_indev_gesture.h" +#include "../display/lv_display_private.h" +#include "../core/lv_global.h" +#include "../core/lv_obj_private.h" +#include "../core/lv_group.h" +#include "../core/lv_refr.h" + +#include "../tick/lv_tick.h" +#include "../misc/lv_timer_private.h" +#include "../misc/lv_math.h" +#include "../misc/lv_profiler.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +/*Drag threshold in pixels*/ +#define LV_INDEV_DEF_SCROLL_LIMIT 10 + +/*Drag throw slow-down in [%]. Greater value -> faster slow-down*/ +#define LV_INDEV_DEF_SCROLL_THROW 10 + +/*Long press time in milliseconds. + *Time to send `LV_EVENT_LONG_PRESSED`)*/ +#define LV_INDEV_DEF_LONG_PRESS_TIME 400 + +/*Repeated trigger period in long press [ms] + *Time between `LV_EVENT_LONG_PRESSED_REPEAT*/ +#define LV_INDEV_DEF_LONG_PRESS_REP_TIME 100 + +/*Gesture threshold in pixels*/ +#define LV_INDEV_DEF_GESTURE_LIMIT 50 + +/*Gesture min velocity at release before swipe (pixels)*/ +#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 3 + +/**< Rotary diff count will be multiplied by this and divided by 256 */ +#define LV_INDEV_DEF_ROTARY_SENSITIVITY 256 + +#if LV_INDEV_DEF_SCROLL_THROW <= 0 + #warning "LV_INDEV_DEF_SCROLL_THROW must be greater than 0" +#endif + +#define indev_act LV_GLOBAL_DEFAULT()->indev_active +#define indev_obj_act LV_GLOBAL_DEFAULT()->indev_obj_active +#define indev_ll_head &(LV_GLOBAL_DEFAULT()->indev_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data); +static void indev_proc_press(lv_indev_t * indev); +static void indev_proc_release(lv_indev_t * indev); +static lv_result_t indev_proc_short_click(lv_indev_t * indev); +static void indev_proc_pointer_diff(lv_indev_t * indev); +static lv_obj_t * pointer_search_obj(lv_display_t * disp, lv_point_t * p); +static void indev_proc_reset_query_handler(lv_indev_t * indev); +static void indev_click_focus(lv_indev_t * indev); +static void indev_gesture(lv_indev_t * indev); +static bool indev_reset_check(lv_indev_t * indev); +static void indev_read_core(lv_indev_t * indev, lv_indev_data_t * data); +static void indev_reset_core(lv_indev_t * indev, lv_obj_t * obj); +static lv_result_t send_event(lv_event_code_t code, void * param); + +static void indev_scroll_throw_anim_start(lv_indev_t * indev); +static void indev_scroll_throw_anim_cb(void * var, int32_t v); +static void indev_scroll_throw_anim_completed_cb(lv_anim_t * anim); +static inline void indev_scroll_throw_anim_reset(lv_indev_t * indev) +{ + if(indev) { + indev->pointer.scroll_throw_vect.x = 0; + indev->pointer.scroll_throw_vect.y = 0; + indev->scroll_throw_anim = NULL; + } +} + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_INDEV + #define LV_TRACE_INDEV(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_INDEV(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_indev_t * lv_indev_create(void) +{ + lv_display_t * disp = lv_display_get_default(); + if(disp == NULL) { + LV_LOG_WARN("no display was created so far"); + } + + lv_indev_t * indev = lv_ll_ins_head(indev_ll_head); + LV_ASSERT_MALLOC(indev); + if(indev == NULL) { + return NULL; + } + + lv_memzero(indev, sizeof(lv_indev_t)); + indev->reset_query = 1; + indev->enabled = 1; + + indev->read_timer = lv_timer_create(lv_indev_read_timer_cb, LV_DEF_REFR_PERIOD, indev); + + indev->disp = lv_display_get_default(); + indev->type = LV_INDEV_TYPE_NONE; + indev->mode = LV_INDEV_MODE_TIMER; + indev->scroll_limit = LV_INDEV_DEF_SCROLL_LIMIT; + indev->scroll_throw = LV_INDEV_DEF_SCROLL_THROW; + indev->long_press_time = LV_INDEV_DEF_LONG_PRESS_TIME; + indev->long_press_repeat_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME; + indev->gesture_min_distance = LV_INDEV_DEF_GESTURE_LIMIT; + indev->gesture_min_velocity = LV_INDEV_DEF_GESTURE_MIN_VELOCITY; + indev->rotary_sensitivity = LV_INDEV_DEF_ROTARY_SENSITIVITY; + indev->key_remap_cb = NULL; +#if LV_USE_EXT_DATA + indev->ext_data.free_cb = NULL; + indev->ext_data.data = NULL; +#endif + +#if LV_USE_GESTURE_RECOGNITION + lv_indev_gesture_init(indev); +#endif + + return indev; +} + +void lv_indev_delete(lv_indev_t * indev) +{ + LV_ASSERT_NULL(indev); + + lv_indev_send_event(indev, LV_EVENT_DELETE, NULL); + lv_event_mark_deleted(indev); + lv_event_remove_all(&(indev->event_list)); + + /*Clean up the read timer first*/ + if(indev->read_timer) lv_timer_delete(indev->read_timer); + + /*Remove the input device from the list*/ + lv_ll_remove(indev_ll_head, indev); + +#if LV_USE_EXT_DATA + if(indev->ext_data.free_cb) { + indev->ext_data.free_cb(indev->ext_data.data); + indev->ext_data.data = NULL; + } +#endif + + /*Free the memory of the input device*/ + lv_free(indev); +} + +lv_indev_t * lv_indev_get_next(lv_indev_t * indev) +{ + if(indev == NULL) + return lv_ll_get_head(indev_ll_head); + else + return lv_ll_get_next(indev_ll_head, indev); +} + +void indev_read_core(lv_indev_t * indev, lv_indev_data_t * data) +{ + LV_PROFILER_INDEV_BEGIN; + lv_memzero(data, sizeof(lv_indev_data_t)); + + /* For touchpad sometimes users don't set the last pressed coordinate on release. + * So be sure a coordinates are initialized to the last point */ + if(indev->type == LV_INDEV_TYPE_POINTER) { + data->point.x = indev->pointer.last_raw_point.x; + data->point.y = indev->pointer.last_raw_point.y; + } + /*Similarly set at least the last key in case of the user doesn't set it on release*/ + else if(indev->type == LV_INDEV_TYPE_KEYPAD) { + data->key = indev->keypad.last_key; + } + /*For compatibility assume that used button was enter (encoder push)*/ + else if(indev->type == LV_INDEV_TYPE_ENCODER) { + data->key = LV_KEY_ENTER; + } + + if(indev->read_cb) { + LV_TRACE_INDEV("calling indev_read_cb"); + indev->read_cb(indev, data); + + /*Set the time stamp to the current time is it was not set in the read_cb*/ + if(data->timestamp == 0) data->timestamp = lv_tick_get(); + } + else { + LV_LOG_WARN("indev_read_cb is not registered"); + } + + LV_PROFILER_INDEV_END; +} + +void lv_indev_read_timer_cb(lv_timer_t * timer) +{ + lv_indev_read(timer->user_data); +} + +void lv_indev_read(lv_indev_t * indev) +{ + if(indev == NULL) return; + + LV_TRACE_INDEV("begin"); + + indev_act = indev; + + /*Read and process all indevs*/ + if(indev->disp == NULL) return; /*Not assigned to any displays*/ + + /*Handle reset query before processing the point*/ + indev_proc_reset_query_handler(indev); + + if(indev->enabled == 0) return; + if(indev->disp->prev_scr != NULL) { + LV_TRACE_INDEV("input blocked while screen animation active"); + return; + } + + LV_PROFILER_INDEV_BEGIN; + + bool continue_reading; + lv_indev_data_t data; + + do { + /*Read the data*/ + indev_read_core(indev, &data); + continue_reading = indev->mode != LV_INDEV_MODE_EVENT && data.continue_reading; + + /*The active object might be deleted even in the read function*/ + indev_proc_reset_query_handler(indev); + indev_obj_act = NULL; + + indev->state = data.state; + + /*Save the last activity time*/ + indev->timestamp = data.timestamp; + if(indev->state == LV_INDEV_STATE_PRESSED) { + indev->disp->last_activity_time = data.timestamp; + } + else if(indev->type == LV_INDEV_TYPE_ENCODER && data.enc_diff) { + indev->disp->last_activity_time = data.timestamp; + } + + if(indev->type == LV_INDEV_TYPE_POINTER) { + indev_pointer_proc(indev, &data); + } + else if(indev->type == LV_INDEV_TYPE_KEYPAD) { + indev_keypad_proc(indev, &data); + } + else if(indev->type == LV_INDEV_TYPE_ENCODER) { + indev_encoder_proc(indev, &data); + } + else if(indev->type == LV_INDEV_TYPE_BUTTON) { + indev_button_proc(indev, &data); + } + /*Handle reset query if it happened in during processing*/ + indev_proc_reset_query_handler(indev); + } while(continue_reading); + + /*End of indev processing, so no act indev*/ + indev_act = NULL; + indev_obj_act = NULL; + + LV_TRACE_INDEV("finished"); + LV_PROFILER_INDEV_END; +} + +void lv_indev_enable(lv_indev_t * indev, bool enable) +{ + if(indev) { + indev->enabled = (uint8_t) enable; + } + else { + lv_indev_t * i = lv_indev_get_next(NULL); + while(i) { + i->enabled = (uint8_t) enable; + i = lv_indev_get_next(i); + } + } +} + +lv_indev_t * lv_indev_active(void) +{ + return indev_act; +} + +void lv_indev_set_type(lv_indev_t * indev, lv_indev_type_t indev_type) +{ + if(indev == NULL) return; + + indev->type = indev_type; + indev->reset_query = 1; +} + +void lv_indev_set_read_cb(lv_indev_t * indev, lv_indev_read_cb_t read_cb) +{ + if(indev == NULL) return; + + indev->read_cb = read_cb; +} + +void lv_indev_set_user_data(lv_indev_t * indev, void * user_data) +{ + if(indev == NULL) return; + indev->user_data = user_data; +} + +void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data) +{ + if(indev == NULL) return; + indev->driver_data = driver_data; +} + +lv_indev_read_cb_t lv_indev_get_read_cb(lv_indev_t * indev) +{ + if(indev == NULL) { + LV_LOG_WARN("lv_indev_get_read_cb: indev was NULL"); + return NULL; + } + + return indev->read_cb; +} + +lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev) +{ + if(indev == NULL) return LV_INDEV_TYPE_NONE; + + return indev->type; +} + +lv_indev_state_t lv_indev_get_state(const lv_indev_t * indev) +{ + if(indev == NULL) return LV_INDEV_STATE_RELEASED; + + return indev->state; +} + +lv_group_t * lv_indev_get_group(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + + return indev->group; +} + +lv_display_t * lv_indev_get_display(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + + return indev->disp; +} + +void lv_indev_set_display(lv_indev_t * indev, lv_display_t * disp) +{ + if(indev == NULL) return; + + indev->disp = disp; +} + +void lv_indev_set_long_press_time(lv_indev_t * indev, uint16_t long_press_time) +{ + if(indev == NULL) return; + + indev->long_press_time = long_press_time; +} + +void lv_indev_set_long_press_repeat_time(lv_indev_t * indev, uint16_t long_press_repeat_time) +{ + if(indev == NULL) return; + + indev->long_press_repeat_time = long_press_repeat_time; +} + +void lv_indev_set_scroll_limit(lv_indev_t * indev, uint8_t scroll_limit) +{ + if(indev == NULL) return; + + indev->scroll_limit = scroll_limit; +} + +void lv_indev_set_scroll_throw(lv_indev_t * indev, uint8_t scroll_throw) +{ + if(indev == NULL) return; + + indev->scroll_throw = scroll_throw; +} + +void lv_indev_set_gesture_min_distance(lv_indev_t * indev, uint8_t min_distance) +{ + + if(indev == NULL) return; + + indev->gesture_min_distance = min_distance; +} + +void lv_indev_set_gesture_min_velocity(lv_indev_t * indev, uint8_t gesture_min_velocity) +{ + if(indev == NULL) return; + + indev->gesture_min_velocity = gesture_min_velocity; +} + +void * lv_indev_get_user_data(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + return indev->user_data; +} + +void * lv_indev_get_driver_data(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + + return indev->driver_data; +} + +bool lv_indev_get_press_moved(const lv_indev_t * indev) +{ + if(indev == NULL) return false; + + return indev->pointer.press_moved; +} + +void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj) +{ + if(indev) { + indev_reset_core(indev, obj); + } + else { + lv_indev_t * i = lv_indev_get_next(NULL); + while(i) { + indev_reset_core(i, obj); + i = lv_indev_get_next(i); + } + indev_obj_act = NULL; + } +} + +void lv_indev_stop_processing(lv_indev_t * indev) +{ + if(indev == NULL) return; + indev->stop_processing_query = 1; +} + +void lv_indev_reset_long_press(lv_indev_t * indev) +{ + indev->long_pr_sent = 0; + indev->longpr_rep_timestamp = indev->pr_timestamp = lv_tick_get(); +} + +void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj) +{ + if(indev->type != LV_INDEV_TYPE_POINTER) return; + + indev->cursor = cur_obj; + lv_obj_set_parent(indev->cursor, lv_display_get_layer_sys(indev->disp)); + lv_obj_set_pos(indev->cursor, indev->pointer.act_point.x, indev->pointer.act_point.y); + lv_obj_remove_flag(indev->cursor, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(indev->cursor, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_FLOATING); +} + +void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group) +{ + if(indev && (indev->type == LV_INDEV_TYPE_KEYPAD || indev->type == LV_INDEV_TYPE_ENCODER)) { + indev->group = group; + } +} + +void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points[]) +{ + if(indev && indev->type == LV_INDEV_TYPE_BUTTON) { + indev->btn_points = points; + } +} + +void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point) +{ + if(indev == NULL) { + point->x = 0; + point->y = 0; + } + else if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) { + point->x = -1; + point->y = -1; + } + else { + point->x = indev->pointer.act_point.x; + point->y = indev->pointer.act_point.y; + } +} + +lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t * indev) +{ + return indev->pointer.gesture_dir; +} + +uint32_t lv_indev_get_key(const lv_indev_t * indev) +{ + uint32_t key = 0; + + if(indev && indev->type == LV_INDEV_TYPE_KEYPAD) + key = indev->keypad.last_key; + + return key; +} + +uint8_t lv_indev_get_short_click_streak(const lv_indev_t * indev) +{ + return indev->pointer.short_click_streak; +} + +lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t * indev) +{ + if(indev == NULL) return false; + if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) return false; + return indev->pointer.scroll_dir; +} + +lv_obj_t * lv_indev_get_scroll_obj(const lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) return NULL; + return indev->pointer.scroll_obj; +} + +void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point) +{ + point->x = 0; + point->y = 0; + + if(indev == NULL) return; + + if(indev->type == LV_INDEV_TYPE_POINTER || indev->type == LV_INDEV_TYPE_BUTTON) { + point->x = indev->pointer.vect.x; + point->y = indev->pointer.vect.y; + } +} + +lv_obj_t * lv_indev_get_cursor(lv_indev_t * indev) +{ + if(indev == NULL) return NULL; + return indev->cursor; +} + +void lv_indev_wait_release(lv_indev_t * indev) +{ + if(indev == NULL)return; + indev->wait_until_release = 1; +} + +lv_obj_t * lv_indev_get_active_obj(void) +{ + return indev_obj_act; +} + +lv_timer_t * lv_indev_get_read_timer(lv_indev_t * indev) +{ + if(indev == NULL) { + LV_LOG_WARN("lv_indev_get_read_timer: indev was NULL"); + return NULL; + } + + return indev->read_timer; +} + +lv_indev_mode_t lv_indev_get_mode(lv_indev_t * indev) +{ + if(indev) return indev->mode; + return LV_INDEV_MODE_NONE; +} + +void lv_indev_set_mode(lv_indev_t * indev, lv_indev_mode_t mode) +{ + if(indev == NULL || indev->mode == mode) + return; + + indev->mode = mode; + if(indev->read_timer) { + if(mode == LV_INDEV_MODE_EVENT) { + lv_timer_pause(indev->read_timer); + } + else if(mode == LV_INDEV_MODE_TIMER) { + /* use default timer mode*/ + lv_timer_set_cb(indev->read_timer, lv_indev_read_timer_cb); + lv_timer_resume(indev->read_timer); + } + } +} + +lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point) +{ + lv_obj_t * found_p = NULL; + + /*If this obj is hidden the children are hidden too so return immediately*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL; + + lv_point_t p_trans = *point; + lv_obj_transform_point(obj, &p_trans, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE); + + bool hit_test_ok = lv_obj_hit_test(obj, &p_trans); + + /*If the point is on this object check its children too*/ + lv_area_t obj_coords = obj->coords; + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_OVERFLOW_VISIBLE)) { + int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); + lv_area_increase(&obj_coords, ext_draw_size, ext_draw_size); + } + if(lv_area_is_point_on(&obj_coords, &p_trans, 0)) { + int32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + + /*If a child matches use it*/ + for(i = child_cnt - 1; i >= 0; i--) { + lv_obj_t * child = obj->spec_attr->children[i]; + found_p = lv_indev_search_obj(child, &p_trans); + if(found_p) return found_p; + } + } + + /*If not return earlier for a clicked child and this obj's hittest was ok use it + *else return NULL*/ + if(hit_test_ok) return obj; + else return NULL; +} + +void lv_indev_add_event_cb(lv_indev_t * indev, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) +{ + LV_ASSERT_NULL(indev); + + lv_event_add(&indev->event_list, event_cb, filter, user_data); +} + +uint32_t lv_indev_get_event_count(lv_indev_t * indev) +{ + LV_ASSERT_NULL(indev); + return lv_event_get_count(&indev->event_list); +} + +lv_event_dsc_t * lv_indev_get_event_dsc(lv_indev_t * indev, uint32_t index) +{ + LV_ASSERT_NULL(indev); + return lv_event_get_dsc(&indev->event_list, index); + +} + +bool lv_indev_remove_event(lv_indev_t * indev, uint32_t index) +{ + LV_ASSERT_NULL(indev); + + return lv_event_remove(&indev->event_list, index); +} + +uint32_t lv_indev_remove_event_cb_with_user_data(lv_indev_t * indev, lv_event_cb_t event_cb, void * user_data) +{ + LV_ASSERT_NULL(indev); + + uint32_t event_cnt = lv_indev_get_event_count(indev); + uint32_t removed_count = 0; + int32_t i; + + for(i = event_cnt - 1; i >= 0; i--) { + lv_event_dsc_t * dsc = lv_indev_get_event_dsc(indev, i); + if(dsc && dsc->cb == event_cb && dsc->user_data == user_data) { + lv_indev_remove_event(indev, i); + removed_count ++; + } + } + + return removed_count; +} + +lv_result_t lv_indev_send_event(lv_indev_t * indev, lv_event_code_t code, void * param) +{ + return lv_event_push_and_send(&indev->event_list, code, indev, param); +} + +void lv_indev_set_key_remap_cb(lv_indev_t * indev, lv_indev_key_remap_cb_t remap_cb) +{ + if(!indev) { + LV_LOG_WARN("Can't remap key on a NULL indev"); + return; + } + + indev->key_remap_cb = remap_cb; +} + +#if LV_USE_EXT_DATA +void lv_indev_set_external_data(lv_indev_t * indev, void * data, void (* free_cb)(void * data)) +{ + if(!indev) { + LV_LOG_WARN("Can't attach external user data and free_cb callback to a NULL indev"); + return; + } + + indev->ext_data.data = data; + indev->ext_data.free_cb = free_cb; +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Process a new point from LV_INDEV_TYPE_POINTER input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + */ +static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + /*Save the raw points so they can be used again in indev_read_core*/ + i->pointer.last_raw_point.x = data->point.x; + i->pointer.last_raw_point.y = data->point.y; + + lv_display_rotate_point(i->disp, &data->point); + + /*Simple sanity check*/ + if(data->point.x < 0) { + LV_LOG_WARN("X is %d which is smaller than zero", (int)data->point.x); + } + if(data->point.x >= lv_display_get_horizontal_resolution(i->disp)) { + LV_LOG_WARN("X is %d which is greater than hor. res", (int)data->point.x); + } + if(data->point.y < 0) { + LV_LOG_WARN("Y is %d which is smaller than zero", (int)data->point.y); + } + if(data->point.y >= lv_display_get_vertical_resolution(i->disp)) { + LV_LOG_WARN("Y is %d which is greater than ver. res", (int)data->point.y); + } + + /*Move the cursor if set and moved*/ + if(i->cursor != NULL && + (i->pointer.last_point.x != data->point.x || i->pointer.last_point.y != data->point.y)) { + lv_obj_set_pos(i->cursor, data->point.x, data->point.y); + } + + i->pointer.act_point.x = data->point.x; + i->pointer.act_point.y = data->point.y; + i->pointer.diff = data->enc_diff; + +#if LV_USE_GESTURE_RECOGNITION + for(int gest = 0; gest < LV_INDEV_GESTURE_CNT; gest++) { + i->gesture_type[gest] = data->gesture_type[gest]; + i->gesture_data[gest] = data->gesture_data[gest]; + } +#endif + + /*Process the diff first as scrolling will be processed in indev_proc_release*/ + indev_proc_pointer_diff(i); + + if(i->state == LV_INDEV_STATE_PRESSED) { + indev_proc_press(i); + } + else { + indev_proc_release(i); + } + + i->prev_state = i->state; + i->pointer.last_point.x = i->pointer.act_point.x; + i->pointer.last_point.y = i->pointer.act_point.y; +} + +/** + * Process a new point from LV_INDEV_TYPE_KEYPAD input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + */ +static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + if(data->state == LV_INDEV_STATE_PRESSED && i->wait_until_release) return; + + if(i->wait_until_release) { + i->wait_until_release = 0; + i->pr_timestamp = 0; + i->long_pr_sent = 0; + i->keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ + } + + /* Remap key using callback */ + if(i->key_remap_cb) { + data->key = i->key_remap_cb(i, data->key); + } + + /*Save the last key. *It must be done here else `lv_indev_get_key` will return the last key in events*/ + uint32_t prev_key = i->keypad.last_key; + i->keypad.last_key = data->key; + + lv_indev_send_event(indev_act, LV_EVENT_KEY, NULL); + + lv_group_t * g = i->group; + + if(g != NULL) { + indev_obj_act = lv_group_get_focused(g); + if(indev_obj_act == NULL) return; + } + else { + indev_obj_act = NULL; + } + + const bool is_enabled = (g == NULL) || !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + + /*Save the previous state so we can detect state changes below and also set the last state now + *so if any event handler on the way returns `LV_RESULT_INVALID` the last state is remembered + *for the next time*/ + uint32_t prev_state = i->keypad.last_state; + i->keypad.last_state = data->state; + + /*Key press happened*/ + if(data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_RELEASED) { + LV_LOG_INFO("%" LV_PRIu32 " key is pressed", data->key); + i->pr_timestamp = i->timestamp; + + if(g == NULL) { + if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + /*Move the focus on NEXT*/ + else if(data->key == LV_KEY_NEXT) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_next(g); + if(indev_reset_check(i)) return; + } + /*Move the focus on PREV*/ + else if(data->key == LV_KEY_PREV) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_prev(g); + if(indev_reset_check(i)) return; + } + else if(is_enabled) { + /*Simulate a press on the object if ENTER was pressed*/ + if(data->key == LV_KEY_ENTER) { + /*Send the ENTER as a normal KEY*/ + if(lv_group_send_data(g, LV_KEY_ENTER) == LV_RESULT_INVALID) return; + if(indev_reset_check(i)) return; + + if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; + + } + else if(data->key == LV_KEY_ESC) { + /*Send the ESC as a normal KEY*/ + if(lv_group_send_data(g, LV_KEY_ESC) == LV_RESULT_INVALID) return; + if(indev_reset_check(i)) return; + + if(send_event(LV_EVENT_CANCEL, indev_act) == LV_RESULT_INVALID) return; + } + /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/ + else { + if(lv_group_send_data(g, data->key) == LV_RESULT_INVALID) return; + if(indev_reset_check(i)) return; + } + } + } + /*Pressing*/ + else if(is_enabled && data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_PRESSED) { + + if(g == NULL || data->key == LV_KEY_ENTER) { + if(send_event(LV_EVENT_PRESSING, indev_act) == LV_RESULT_INVALID) return; + } + + /*Long press time has elapsed?*/ + if(i->long_pr_sent == 0 && lv_tick_diff(i->timestamp, i->pr_timestamp) >= i->long_press_time) { + i->long_pr_sent = 1; + if(g == NULL || data->key == LV_KEY_ENTER) { + i->longpr_rep_timestamp = i->timestamp; + + if(send_event(LV_EVENT_LONG_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + } + /*Long press repeated time has elapsed?*/ + else if(i->long_pr_sent != 0 && + lv_tick_diff(i->timestamp, i->longpr_rep_timestamp) >= i->long_press_repeat_time) { + + i->longpr_rep_timestamp = i->timestamp; + + /*Send LONG_PRESS_REP on ENTER*/ + if(g == NULL || data->key == LV_KEY_ENTER) { + if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return; + } + /*Move the focus on NEXT again*/ + else if(data->key == LV_KEY_NEXT) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_next(g); + if(indev_reset_check(i)) return; + } + /*Move the focus on PREV again*/ + else if(data->key == LV_KEY_PREV) { + lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ + lv_group_focus_prev(g); + if(indev_reset_check(i)) return; + } + /*Just send other keys again to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT)*/ + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(i)) return; + } + } + } + /*Release happened*/ + else if(is_enabled && data->state == LV_INDEV_STATE_RELEASED && prev_state == LV_INDEV_STATE_PRESSED) { + LV_LOG_INFO("%" LV_PRIu32 " key is released", data->key); + + /*The user might clear the key when it was released. Always release the pressed key*/ + data->key = prev_key; + if(g == NULL || data->key == LV_KEY_ENTER) { + + if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; + + if(i->long_pr_sent == 0) { + if(indev_proc_short_click(i) == LV_RESULT_INVALID) return; + } + + if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + + } + i->pr_timestamp = 0; + i->long_pr_sent = 0; + } + indev_obj_act = NULL; +} + + + +/** + * Process a new point from LV_INDEV_TYPE_ENCODER input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + */ +static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + if(data->state == LV_INDEV_STATE_PRESSED && i->wait_until_release) return; + + if(i->wait_until_release) { + i->wait_until_release = 0; + i->pr_timestamp = 0; + i->long_pr_sent = 0; + i->keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/ + } + + /*Save the last keys before anything else. + *They need to be already saved if the function returns for any reason*/ + lv_indev_state_t last_state = i->keypad.last_state; + i->keypad.last_state = data->state; + i->keypad.last_key = data->key; + + lv_group_t * g = i->group; + if(g == NULL) return; + + indev_obj_act = lv_group_get_focused(g); + if(indev_obj_act == NULL) return; + + /*Process the steps they are valid only with released button*/ + if(data->state != LV_INDEV_STATE_RELEASED) { + data->enc_diff = 0; + } + + const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + + /*Button press happened*/ + if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_RELEASED) { + LV_LOG_INFO("pressed"); + + i->pr_timestamp = i->timestamp; + + if(data->key == LV_KEY_ENTER) { + bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); + if(lv_group_get_editing(g) == true || editable_or_scrollable == false) { + + if(is_enabled) { + if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + } + } + else if(data->key == LV_KEY_LEFT) { + /*emulate encoder left*/ + data->enc_diff--; + } + else if(data->key == LV_KEY_RIGHT) { + /*emulate encoder right*/ + data->enc_diff++; + } + else if(data->key == LV_KEY_ESC) { + /*Send the ESC as a normal KEY*/ + lv_group_send_data(g, LV_KEY_ESC); + if(indev_reset_check(i)) return; + + if(is_enabled) { + if(send_event(LV_EVENT_CANCEL, indev_act) == LV_RESULT_INVALID) return; + } + } + /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/ + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(i)) return; + } + } + /*Pressing*/ + else if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_PRESSED) { + /*Long press*/ + if(i->long_pr_sent == 0 && lv_tick_diff(i->timestamp, i->pr_timestamp) >= i->long_press_time) { + + i->long_pr_sent = 1; + i->longpr_rep_timestamp = i->timestamp; + + if(data->key == LV_KEY_ENTER) { + /* Always send event to indev callbacks*/ + lv_indev_send_event(indev_act, LV_EVENT_LONG_PRESSED, indev_obj_act); + if(indev_reset_check(indev_act)) return; + + bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); + + /*On enter long press toggle edit mode.*/ + if(editable_or_scrollable) { + /*Don't leave edit mode if there is only one object (nowhere to navigate)*/ + if(lv_group_get_obj_count(g) > 1) { + LV_LOG_INFO("toggling edit mode"); + lv_group_set_editing(g, lv_group_get_editing(g) ? false : true); /*Toggle edit mode on long press*/ + lv_obj_remove_state(indev_obj_act, LV_STATE_PRESSED); /*Remove the pressed state manually*/ + } + } + /*If not editable then just send a long press event*/ + else { + if(is_enabled) { + lv_obj_send_event(indev_obj_act, LV_EVENT_LONG_PRESSED, indev_act); + if(indev_reset_check(indev_act)) return; + } + } + } + + i->long_pr_sent = 1; + } + /*Long press repeated time has elapsed?*/ + else if(i->long_pr_sent != 0 && lv_tick_diff(i->timestamp, i->longpr_rep_timestamp) >= i->long_press_repeat_time) { + + i->longpr_rep_timestamp = i->timestamp; + + if(data->key == LV_KEY_ENTER) { + if(is_enabled) { + if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return; + } + } + else if(data->key == LV_KEY_LEFT) { + /*emulate encoder left*/ + data->enc_diff--; + } + else if(data->key == LV_KEY_RIGHT) { + /*emulate encoder right*/ + data->enc_diff++; + } + else { + lv_group_send_data(g, data->key); + if(indev_reset_check(i)) return; + } + + } + + } + /*Release happened*/ + else if(data->state == LV_INDEV_STATE_RELEASED && last_state == LV_INDEV_STATE_PRESSED) { + LV_LOG_INFO("released"); + + if(data->key == LV_KEY_ENTER) { + bool editable_or_scrollable = lv_obj_is_editable(indev_obj_act) || + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE); + + /*The button was released on a non-editable object. Just send enter*/ + if(editable_or_scrollable == false) { + if(is_enabled) { + if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; + } + + if(i->long_pr_sent == 0 && is_enabled) { + if(indev_proc_short_click(i) == LV_RESULT_INVALID) return; + } + + if(is_enabled) { + if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + } + + } + /*An object is being edited and the button is released.*/ + else if(lv_group_get_editing(g)) { + /*Ignore long pressed enter release because it comes from mode switch*/ + if(!i->long_pr_sent || lv_group_get_obj_count(g) <= 1) { + if(is_enabled) { + if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; + if(indev_proc_short_click(i) == LV_RESULT_INVALID) return; + if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + } + + lv_group_send_data(g, LV_KEY_ENTER); + if(indev_reset_check(i)) return; + } + else { + lv_obj_remove_state(indev_obj_act, LV_STATE_PRESSED); /*Remove the pressed state manually*/ + } + } + /*If the focused object is editable and now in navigate mode then on enter switch edit + mode*/ + else if(!i->long_pr_sent) { + LV_LOG_INFO("entering edit mode"); + lv_group_set_editing(g, true); /*Set edit mode*/ + } + } + + i->pr_timestamp = 0; + i->long_pr_sent = 0; + } + indev_obj_act = NULL; + + /*if encoder steps or simulated steps via left/right keys*/ + if(data->enc_diff != 0) { + /*In edit mode send LEFT/RIGHT keys*/ + if(lv_group_get_editing(g)) { + LV_LOG_INFO("rotated by %+d (edit)", data->enc_diff); + int32_t s; + if(data->enc_diff < 0) { + for(s = 0; s < -data->enc_diff; s++) { + lv_group_send_data(g, LV_KEY_LEFT); + if(indev_reset_check(i)) return; + } + } + else if(data->enc_diff > 0) { + for(s = 0; s < data->enc_diff; s++) { + lv_group_send_data(g, LV_KEY_RIGHT); + if(indev_reset_check(i)) return; + } + } + } + /*In navigate mode focus on the next/prev objects*/ + else { + LV_LOG_INFO("rotated by %+d (nav)", data->enc_diff); + int32_t s; + if(data->enc_diff < 0) { + for(s = 0; s < -data->enc_diff; s++) { + lv_group_focus_prev(g); + if(indev_reset_check(i)) return; + } + } + else if(data->enc_diff > 0) { + for(s = 0; s < data->enc_diff; s++) { + lv_group_focus_next(g); + if(indev_reset_check(i)) return; + } + } + } + } +} + +/** + * Process new points from an input device. indev->state.pressed has to be set + * @param indev pointer to an input device state + * @param x x coordinate of the next point + * @param y y coordinate of the next point + */ +static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data) +{ + /*Die gracefully if i->btn_points is NULL*/ + if(i->btn_points == NULL) { + LV_LOG_WARN("btn_points is NULL"); + return; + } + + int32_t x = i->btn_points[data->btn_id].x; + int32_t y = i->btn_points[data->btn_id].y; + + if(LV_INDEV_STATE_RELEASED != data->state) { + if(data->state == LV_INDEV_STATE_PRESSED) { + LV_LOG_INFO("button %" LV_PRIu32 " is pressed (x:%d y:%d)", data->btn_id, (int)x, (int)y); + } + else { + LV_LOG_INFO("button %" LV_PRIu32 " is released (x:%d y:%d)", data->btn_id, (int)x, (int)y); + } + } + + /*If a new point comes always make a release*/ + if(data->state == LV_INDEV_STATE_PRESSED) { + if(i->pointer.last_point.x != x || + i->pointer.last_point.y != y) { + indev_proc_release(i); + } + } + + if(indev_reset_check(i)) return; + + /*Save the new points*/ + i->pointer.act_point.x = x; + i->pointer.act_point.y = y; + + if(data->state == LV_INDEV_STATE_PRESSED) { + indev_proc_press(i); + } + else { + indev_proc_release(i); + } + + i->prev_state = i->state; + + if(indev_reset_check(i)) return; + + i->pointer.last_point.x = i->pointer.act_point.x; + i->pointer.last_point.y = i->pointer.act_point.y; +} + +/** + * Apply time decay to a scroll throw vector, such that there is no decay + * initially and full decay after a short period of time. + * @param x scroll throw vector component + * @param t expired time in milliseconds + * @return decayed vector component + */ +static int32_t indev_scroll_throw_decay(int32_t x, int32_t t) +{ + if(t <= 0) return x; + if(t >= 99) return 0; + return x * (512 - (512 * t) / 99) / 512; +} + +/** + * Process the pressed state of LV_INDEV_TYPE_POINTER input devices + * @param indev pointer to an input device 'proc' + */ +static void indev_proc_press(lv_indev_t * indev) +{ + LV_LOG_INFO("pressed at x:%d y:%d", (int)indev->pointer.act_point.x, + (int)indev->pointer.act_point.y); + indev_obj_act = indev->pointer.act_obj; + + if(indev->wait_until_release != 0) return; + + lv_display_t * disp = indev_act->disp; + bool new_obj_searched = false; + + /*If there is no last object then search*/ + if(indev_obj_act == NULL) { + indev_obj_act = pointer_search_obj(disp, &indev->pointer.act_point); + new_obj_searched = true; + } + /*If there is an active object it's not scrolled and not press locked also search*/ + else if(indev->pointer.scroll_obj == NULL && + lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_PRESS_LOCK) == false) { + indev_obj_act = pointer_search_obj(disp, &indev->pointer.act_point); + new_obj_searched = true; + } + + /*The scroll object might have scroll throw. Stop it manually*/ + if(new_obj_searched && indev->pointer.scroll_obj) { + /*Attempt to stop scroll throw animation firstly*/ + if(indev->scroll_throw_anim) { + lv_anim_delete(indev, indev_scroll_throw_anim_cb); + indev->scroll_throw_anim = NULL; + } + + lv_indev_scroll_throw_handler(indev); + if(indev_reset_check(indev)) return; + } + + /*If a new object was found reset some variables and send a pressed event handler*/ + if(indev_obj_act != indev->pointer.act_obj) { + /*If no previous object was lost, overwrite the last point.*/ + if(indev->pointer.act_obj == NULL) { + indev->pointer.last_point.x = indev->pointer.act_point.x; + indev->pointer.last_point.y = indev->pointer.act_point.y; + } + indev->pointer.pressed = indev->prev_state == LV_INDEV_STATE_RELEASED; + + /*Without `LV_OBJ_FLAG_PRESS_LOCK` new widget can be found while pressing.*/ + if(indev->pointer.last_hovered && indev->pointer.last_hovered != indev_obj_act) { + lv_obj_send_event(indev->pointer.last_hovered, LV_EVENT_HOVER_LEAVE, indev); + if(indev_reset_check(indev)) return; + + lv_indev_send_event(indev, LV_EVENT_HOVER_LEAVE, indev->pointer.last_hovered); + if(indev_reset_check(indev)) return; + + indev->pointer.last_hovered = indev_obj_act; + } + + /*If a new object found the previous was lost, so send a PRESS_LOST event*/ + if(indev->pointer.act_obj != NULL) { + /*Save the obj because in special cases `act_obj` can change in the event */ + lv_obj_t * prev_act_obj = indev->pointer.act_obj; + lv_obj_send_event(prev_act_obj, LV_EVENT_PRESS_LOST, indev_act); + if(indev_reset_check(indev)) return; + } + + indev->pointer.act_obj = indev_obj_act; /*Save the pressed object*/ + + if(indev_obj_act != NULL) { + + /*Save the time when the obj pressed to count long press time.*/ + indev->pr_timestamp = indev->timestamp; + indev->long_pr_sent = 0; + indev->pointer.scroll_sum.x = 0; + indev->pointer.scroll_sum.y = 0; + indev->pointer.scroll_dir = LV_DIR_NONE; + indev->pointer.scroll_obj = NULL; + indev->pointer.gesture_dir = LV_DIR_NONE; + indev->pointer.gesture_sent = 0; + indev->pointer.gesture_sum.x = 0; + indev->pointer.gesture_sum.y = 0; + indev->pointer.press_moved = 0; + indev->pointer.vect.x = 0; + indev->pointer.vect.y = 0; + + + /* If the indev was already in a pressed state it means that we got dragged here + * so we shouldn't send any hover nor pressed events for a new object since the + * originally pressed object didn't get released + */ + if(indev->prev_state != LV_INDEV_STATE_PRESSED) { + const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + if(is_enabled) { + if(indev->pointer.last_hovered != indev_obj_act) { + if(send_event(LV_EVENT_HOVER_OVER, indev_act) == LV_RESULT_INVALID) return; + } + if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + } + + if(indev_act->wait_until_release) return; + + /*Handle focus*/ + indev_click_focus(indev_act); + if(indev_reset_check(indev)) return; + + } + } + + /*Update vector and scroll throw vector*/ + indev->pointer.vect.x = indev->pointer.act_point.x - indev->pointer.last_point.x; + indev->pointer.vect.y = indev->pointer.act_point.y - indev->pointer.last_point.y; + + indev->pointer.vect_hist[indev->pointer.vect_hist_index] = indev->pointer.vect; + indev->pointer.vect_hist_timestamp[indev->pointer.vect_hist_index] = indev->timestamp; + indev->pointer.vect_hist_index = (indev->pointer.vect_hist_index + 1) % LV_INDEV_VECT_HIST_SIZE; + + indev->pointer.scroll_throw_vect.x = 0; + indev->pointer.scroll_throw_vect.y = 0; + for(int i = 0; i < LV_INDEV_VECT_HIST_SIZE; i++) { + int32_t t = lv_tick_diff(indev->timestamp, indev->pointer.vect_hist_timestamp[i]); + indev->pointer.scroll_throw_vect.x += indev_scroll_throw_decay(indev->pointer.vect_hist[i].x, t); + indev->pointer.scroll_throw_vect.y += indev_scroll_throw_decay(indev->pointer.vect_hist[i].y, t); + } + + indev->pointer.scroll_throw_vect_ori = indev->pointer.scroll_throw_vect; + + if(LV_ABS(indev->pointer.vect.x) > indev->scroll_limit || LV_ABS(indev->pointer.vect.y) > indev->scroll_limit) { + indev->pointer.press_moved = 1; + } + +#if LV_USE_GESTURE_RECOGNITION + for(int i = 0; i < LV_INDEV_GESTURE_CNT; i++) { + /* Send a gesture event to a potential indev cb callback, even if no object was found */ + if(indev->gesture_type[i] != LV_INDEV_GESTURE_NONE) { + indev->cur_gesture = (lv_indev_gesture_type_t) i; + lv_indev_send_event(indev, LV_EVENT_GESTURE, indev_act); + break; + } + } +#endif + + if(indev_obj_act) { + const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + +#if LV_USE_GESTURE_RECOGNITION + for(int i = 0; i < LV_INDEV_GESTURE_CNT; i++) { + + if(indev->gesture_type[i] != LV_INDEV_GESTURE_NONE) { + indev->cur_gesture = (lv_indev_gesture_type_t) i; + if(send_event(LV_EVENT_GESTURE, indev_act) == LV_RESULT_INVALID) return; + break; + } + } +#endif + if(is_enabled) { + if(send_event(LV_EVENT_PRESSING, indev_act) == LV_RESULT_INVALID) return; + } + + + if(indev_act->wait_until_release) return; + + if(indev->pointer.scroll_obj) { + lv_obj_stop_scroll_anim(indev->pointer.scroll_obj); + } + + lv_indev_scroll_handler(indev); + if(indev_reset_check(indev)) return; + indev_gesture(indev); + if(indev_reset_check(indev)) return; + + /*In event driven mode resume the timer so that it can trigger long pressed and other time related events. + *As a side effect it will also call read_cb periodically in event driven mode. */ + if(indev->mode == LV_INDEV_MODE_EVENT && indev->read_timer && lv_timer_get_paused(indev->read_timer)) { + lv_timer_resume(indev->read_timer); + } + + /*If there is no scrolling then check for long press time*/ + if(indev->pointer.scroll_obj == NULL && indev->long_pr_sent == 0) { + /*Send a long press event if enough time elapsed*/ + if(lv_tick_diff(indev->timestamp, indev->pr_timestamp) >= indev_act->long_press_time) { + if(is_enabled) { + if(send_event(LV_EVENT_LONG_PRESSED, indev_act) == LV_RESULT_INVALID) return; + } + /*Mark it to do not send the event again*/ + indev->long_pr_sent = 1; + + /*Save the long press time stamp for the long press repeat handler*/ + indev->longpr_rep_timestamp = indev->timestamp; + } + } + + if(indev->pointer.scroll_obj == NULL && indev->long_pr_sent == 1) { + if(lv_tick_diff(indev->timestamp, indev->longpr_rep_timestamp) >= indev_act->long_press_repeat_time) { + if(is_enabled) { + if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return; + } + indev->longpr_rep_timestamp = indev->timestamp; + } + } + } +} + +/** + * Process the released state of LV_INDEV_TYPE_POINTER input devices + * @param proc pointer to an input device 'proc' + */ +static void indev_proc_release(lv_indev_t * indev) +{ + if(indev->wait_until_release || /*Hover the new widget even if the coordinates didn't changed*/ + (indev->pointer.last_point.x != indev->pointer.act_point.x || + indev->pointer.last_point.y != indev->pointer.act_point.y)) { + lv_obj_t ** last = &indev->pointer.last_hovered; + lv_obj_t * hovered = pointer_search_obj(lv_display_get_default(), &indev->pointer.act_point); + if(*last != hovered) { + lv_obj_send_event(hovered, LV_EVENT_HOVER_OVER, indev); + if(indev_reset_check(indev)) return; + lv_indev_send_event(indev, LV_EVENT_HOVER_OVER, hovered); + if(indev_reset_check(indev)) return; + + lv_obj_send_event(*last, LV_EVENT_HOVER_LEAVE, indev); + if(indev_reset_check(indev)) return; + lv_indev_send_event(indev, LV_EVENT_HOVER_LEAVE, *last); + if(indev_reset_check(indev)) return; + *last = hovered; + } + } + + if(indev->wait_until_release) { + lv_obj_send_event(indev->pointer.act_obj, LV_EVENT_PRESS_LOST, indev_act); + if(indev_reset_check(indev)) { + indev->wait_until_release = 0; + return; + } + + indev->pointer.act_obj = NULL; + indev->pr_timestamp = 0; + indev->longpr_rep_timestamp = 0; + indev->wait_until_release = 0; + } + indev_obj_act = indev->pointer.act_obj; + lv_obj_t * scroll_obj = indev->pointer.scroll_obj; + + if(indev->mode == LV_INDEV_MODE_EVENT && indev->read_timer && !lv_timer_get_paused(indev->read_timer)) { + lv_timer_pause(indev->read_timer); + } + +#if LV_USE_GESTURE_RECOGNITION + /* Send a gesture event to a potential indev cb callback, even if no object was found */ + for(int i = 0; i < LV_INDEV_GESTURE_CNT; i++) { + + if(indev->gesture_type[i] != LV_INDEV_GESTURE_NONE) { + indev_act->cur_gesture = (lv_indev_gesture_type_t) i; + lv_indev_send_event(indev, LV_EVENT_GESTURE, indev_act); + break; + } + } +#endif + + if(indev_obj_act) { + LV_LOG_INFO("released"); + + const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED); + +#if LV_USE_GESTURE_RECOGNITION + for(int i = 0; i < LV_INDEV_GESTURE_CNT; i++) { + if(is_enabled && indev->gesture_type[i] != LV_INDEV_GESTURE_NONE) { + indev_act->cur_gesture = (lv_indev_gesture_type_t) i; + if(send_event(LV_EVENT_GESTURE, indev_act) == LV_RESULT_INVALID) return; + break; + } + } +#endif + if(is_enabled) { + if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return; + } + + if(is_enabled) { + if(scroll_obj == NULL) { + if(indev->pointer.pressed) { + if(indev->long_pr_sent == 0) { + if(indev_proc_short_click(indev) == LV_RESULT_INVALID) return; + } + if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return; + } + } + else { + lv_obj_send_event(scroll_obj, LV_EVENT_SCROLL_THROW_BEGIN, indev_act); + if(indev_reset_check(indev)) return; + } + } + indev->pointer.act_obj = NULL; + indev->pr_timestamp = 0; + indev->longpr_rep_timestamp = 0; + + /*Get the transformed vector with this object*/ + if(scroll_obj) { + int16_t angle = 0; + int16_t scale_x = 256; + int16_t scale_y = 256; + lv_point_t pivot = { 0, 0 }; + lv_obj_t * parent = scroll_obj; + while(parent) { + angle += lv_obj_get_style_transform_rotation(parent, LV_PART_MAIN); + int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, LV_PART_MAIN); + int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, LV_PART_MAIN); + scale_x = (scale_x * zoom_act_x) >> 8; + scale_y = (scale_x * zoom_act_y) >> 8; + parent = lv_obj_get_parent(parent); + } + + if(scale_x == 0) { + scale_x = 1; + } + + if(scale_y == 0) { + scale_y = 1; + } + + if(angle != 0 || scale_y != LV_SCALE_NONE || scale_x != LV_SCALE_NONE) { + angle = -angle; + scale_x = (256 * 256) / scale_x; + scale_y = (256 * 256) / scale_y; + lv_point_transform(&indev->pointer.scroll_throw_vect, angle, scale_x, scale_y, &pivot, false); + lv_point_transform(&indev->pointer.scroll_throw_vect_ori, angle, scale_x, scale_y, &pivot, false); + } + } + } + + if(scroll_obj) { + if(!indev->scroll_throw_anim) { + indev_scroll_throw_anim_start(indev); + } + + if(indev_reset_check(indev)) return; + } +} + +static lv_result_t indev_proc_short_click(lv_indev_t * indev) +{ + /*Update streak for clicks within small distance and short time*/ + indev->pointer.short_click_streak++; + if(lv_tick_diff(indev->timestamp, indev->pointer.last_short_click_timestamp) > indev->long_press_time) { + indev->pointer.short_click_streak = 1; + } + else if(indev->type == LV_INDEV_TYPE_POINTER || indev->type == LV_INDEV_TYPE_BUTTON) { + int32_t dx = indev->pointer.last_short_click_point.x - indev->pointer.act_point.x; + int32_t dy = indev->pointer.last_short_click_point.y - indev->pointer.act_point.y; + if(dx * dx + dy * dy > indev->scroll_limit * indev->scroll_limit) indev->pointer.short_click_streak = 1; + } + + indev->pointer.last_short_click_timestamp = indev->timestamp; + lv_indev_get_point(indev, &indev->pointer.last_short_click_point); + + /*Simple short click*/ + lv_result_t res = send_event(LV_EVENT_SHORT_CLICKED, indev_act); + if(res == LV_RESULT_INVALID) { + return res; + } + + /*Cycle through single/double/triple click*/ + switch((indev->pointer.short_click_streak - 1) % 3) { + case 0: + return send_event(LV_EVENT_SINGLE_CLICKED, indev_act); + case 1: + return send_event(LV_EVENT_DOUBLE_CLICKED, indev_act); + case 2: + return send_event(LV_EVENT_TRIPLE_CLICKED, indev_act); + } + return res; +} + +static void indev_proc_pointer_diff(lv_indev_t * indev) +{ + lv_obj_t * obj = indev->pointer.last_pressed; + if(obj == NULL) return; + if(indev->pointer.diff == 0) return; + + indev_obj_act = obj; + + bool editable = lv_obj_is_editable(obj); + + if(editable) { + uint32_t indev_sensitivity = indev->rotary_sensitivity; + uint32_t obj_sensitivity = lv_obj_get_style_rotary_sensitivity(indev_obj_act, LV_PART_MAIN); + int32_t diff = (int32_t)((int32_t)indev->pointer.diff * indev_sensitivity * obj_sensitivity + 32768) >> 16; + send_event(LV_EVENT_ROTARY, &diff); + } + else { + + int32_t vect = indev->pointer.diff > 0 ? indev->scroll_limit : -indev->scroll_limit; + indev->pointer.vect.y = vect; + indev->pointer.act_obj = obj; + lv_obj_t * scroll_obj = lv_indev_find_scroll_obj(indev); + if(scroll_obj == NULL) return; + uint32_t indev_sensitivity = indev->rotary_sensitivity; + uint32_t obj_sensitivity = lv_obj_get_style_rotary_sensitivity(scroll_obj, LV_PART_MAIN); + int32_t diff = (int32_t)((int32_t)indev->pointer.diff * indev_sensitivity * obj_sensitivity + 32768) >> 16; + + indev->pointer.scroll_throw_vect.y = diff; + indev->pointer.scroll_throw_vect_ori.y = diff; + lv_indev_scroll_handler(indev); + } + +} + +static lv_obj_t * pointer_search_obj(lv_display_t * disp, lv_point_t * p) +{ + indev_obj_act = lv_indev_search_obj(lv_display_get_layer_sys(disp), p); + if(indev_obj_act) return indev_obj_act; + + indev_obj_act = lv_indev_search_obj(lv_display_get_layer_top(disp), p); + if(indev_obj_act) return indev_obj_act; + + /* Search the object in the active screen */ + indev_obj_act = lv_indev_search_obj(lv_display_get_screen_active(disp), p); + if(indev_obj_act) return indev_obj_act; + + indev_obj_act = lv_indev_search_obj(lv_display_get_layer_bottom(disp), p); + return indev_obj_act; +} + +/** + * Process a new point from LV_INDEV_TYPE_BUTTON input device + * @param i pointer to an input device + * @param data pointer to the data read from the input device + * Reset input device if a reset query has been sent to it + * @param indev pointer to an input device + */ +static void indev_proc_reset_query_handler(lv_indev_t * indev) +{ + if(indev->reset_query) { + indev->pointer.act_obj = NULL; + indev->pointer.scroll_obj = NULL; + indev->pointer.last_hovered = NULL; + indev->timestamp = lv_tick_get(); + indev->long_pr_sent = 0; + indev->pr_timestamp = 0; + indev->longpr_rep_timestamp = 0; + indev->pointer.scroll_sum.x = 0; + indev->pointer.scroll_sum.y = 0; + indev->pointer.scroll_dir = LV_DIR_NONE; + indev->pointer.scroll_obj = NULL; + indev->pointer.scroll_throw_vect.x = 0; + indev->pointer.scroll_throw_vect.y = 0; + indev->pointer.gesture_sum.x = 0; + indev->pointer.gesture_sum.y = 0; + indev->reset_query = 0; + indev->stop_processing_query = 0; + indev_obj_act = NULL; + } +} + +/** + * Handle focus/defocus on click for POINTER input devices + * @param proc pointer to the state of the indev + */ +static void indev_click_focus(lv_indev_t * indev) +{ + /*Handle click focus*/ + if(lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_CLICK_FOCUSABLE) == false) { + return; + } + + lv_group_t * g_act = lv_obj_get_group(indev_obj_act); + lv_group_t * g_prev = indev->pointer.last_pressed ? lv_obj_get_group(indev->pointer.last_pressed) : NULL; + + /*If both the last and act. obj. are in the same group (or have no group)*/ + if(g_act == g_prev) { + /*The objects are in a group*/ + if(g_act) { + lv_group_focus_obj(indev_obj_act); + if(indev_reset_check(indev)) return; + } + /*The object are not in group*/ + else { + if(indev->pointer.last_pressed != indev_obj_act) { + lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); + if(indev_reset_check(indev)) return; + + lv_obj_send_event(indev_obj_act, LV_EVENT_FOCUSED, indev_act); + if(indev_reset_check(indev)) return; + } + } + } + /*The object are not in the same group (in different groups or one has no group)*/ + else { + /*If the prev. obj. is not in a group then defocus it.*/ + if(g_prev == NULL && indev->pointer.last_pressed) { + lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); + if(indev_reset_check(indev)) return; + } + /*Focus on a non-group object*/ + else { + if(indev->pointer.last_pressed) { + /*If the prev. object also wasn't in a group defocus it*/ + if(g_prev == NULL) { + lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_DEFOCUSED, indev_act); + if(indev_reset_check(indev)) return; + } + /*If the prev. object also was in a group at least "LEAVE" it instead of defocus*/ + else { + lv_obj_send_event(indev->pointer.last_pressed, LV_EVENT_LEAVE, indev_act); + if(indev_reset_check(indev)) return; + } + } + } + + /*Focus to the act. in its group*/ + if(g_act) { + lv_group_focus_obj(indev_obj_act); + if(indev_reset_check(indev)) return; + } + else { + lv_obj_send_event(indev_obj_act, LV_EVENT_FOCUSED, indev_act); + if(indev_reset_check(indev)) return; + } + } + indev->pointer.last_pressed = indev_obj_act; +} + +/** +* Handle the gesture of indev_proc_p->pointer.act_obj +* @param indev pointer to an input device state +*/ +void indev_gesture(lv_indev_t * indev) +{ + if(indev->pointer.scroll_obj) return; + if(indev->pointer.gesture_sent) return; + + lv_obj_t * gesture_obj = indev->pointer.act_obj; + + /*If gesture parent is active check recursively the gesture attribute*/ + while(gesture_obj && lv_obj_has_flag(gesture_obj, LV_OBJ_FLAG_GESTURE_BUBBLE)) { + gesture_obj = lv_obj_get_parent(gesture_obj); + } + + if(gesture_obj == NULL) return; + + if((LV_ABS(indev->pointer.vect.x) < indev_act->gesture_min_velocity) && + (LV_ABS(indev->pointer.vect.y) < indev_act->gesture_min_velocity)) { + indev->pointer.gesture_sum.x = 0; + indev->pointer.gesture_sum.y = 0; + } + + /*Count the movement by gesture*/ + indev->pointer.gesture_sum.x += indev->pointer.vect.x; + indev->pointer.gesture_sum.y += indev->pointer.vect.y; + + if((LV_ABS(indev->pointer.gesture_sum.x) > indev_act->gesture_min_distance) || + (LV_ABS(indev->pointer.gesture_sum.y) > indev_act->gesture_min_distance)) { + + indev->pointer.gesture_sent = 1; + + if(LV_ABS(indev->pointer.gesture_sum.x) > LV_ABS(indev->pointer.gesture_sum.y)) { + if(indev->pointer.gesture_sum.x > 0) + indev->pointer.gesture_dir = LV_DIR_RIGHT; + else + indev->pointer.gesture_dir = LV_DIR_LEFT; + } + else { + if(indev->pointer.gesture_sum.y > 0) + indev->pointer.gesture_dir = LV_DIR_BOTTOM; + else + indev->pointer.gesture_dir = LV_DIR_TOP; + } + + lv_obj_send_event(gesture_obj, LV_EVENT_GESTURE, indev_act); + if(indev_reset_check(indev)) return; + + lv_indev_send_event(indev_act, LV_EVENT_GESTURE, gesture_obj); + if(indev_reset_check(indev_act)) return; + } +} + +/** + * Checks if the reset_query flag has been set. If so, perform necessary global indev cleanup actions + * @param proc pointer to an input device 'proc' + * @return true if indev query should be immediately truncated. + */ +static bool indev_reset_check(lv_indev_t * indev) +{ + if(indev->reset_query) { + indev_obj_act = NULL; + } + + return indev->reset_query; +} + +/** + * Checks if the stop_processing_query flag has been set. If so, do not send any events to the object + * @param indev pointer to an input device + * @return true if indev should stop processing the event. + */ +static bool indev_stop_processing_check(lv_indev_t * indev) +{ + return indev->stop_processing_query; +} + +/** + * Reset the indev and send event to active obj and scroll obj + * @param indev pointer to an input device + * @param obj pointer to obj +*/ +static void indev_reset_core(lv_indev_t * indev, lv_obj_t * obj) +{ + lv_obj_t * act_obj = NULL; + lv_obj_t * scroll_obj = NULL; + + indev->reset_query = 1; + if(indev_act == indev) indev_obj_act = NULL; + if(indev->type == LV_INDEV_TYPE_POINTER || indev->type == LV_INDEV_TYPE_KEYPAD) { + if(obj == NULL || indev->pointer.last_pressed == obj) { + indev->pointer.last_pressed = NULL; + } + + if(indev->pointer.act_obj) { + /* Avoid recursive calls */ + act_obj = indev->pointer.act_obj; + indev->pointer.act_obj = NULL; + lv_obj_send_event(act_obj, LV_EVENT_INDEV_RESET, indev); + lv_indev_send_event(indev, LV_EVENT_INDEV_RESET, act_obj); + act_obj = NULL; + } + + if(indev->pointer.scroll_obj) { + /* Avoid recursive calls */ + scroll_obj = indev->pointer.scroll_obj; + indev->pointer.scroll_obj = NULL; + lv_obj_send_event(scroll_obj, LV_EVENT_INDEV_RESET, indev); + lv_indev_send_event(indev, LV_EVENT_INDEV_RESET, scroll_obj); + scroll_obj = NULL; + } + + if(obj == NULL || indev->pointer.last_hovered == obj) { + indev->pointer.last_hovered = NULL; + } + } +} + +static lv_result_t send_event(lv_event_code_t code, void * param) +{ + lv_indev_t * indev = indev_act; + + if(code == LV_EVENT_PRESSED || + code == LV_EVENT_SHORT_CLICKED || + code == LV_EVENT_CLICKED || + code == LV_EVENT_RELEASED || + code == LV_EVENT_LONG_PRESSED || + code == LV_EVENT_LONG_PRESSED_REPEAT || + code == LV_EVENT_ROTARY || + code == LV_EVENT_KEY) { + lv_indev_send_event(indev, code, indev_obj_act); + if(indev_reset_check(indev)) return LV_RESULT_INVALID; + + if(indev_stop_processing_check(indev)) { + /* Not send event to the object if stop processing query is set */ + indev->stop_processing_query = 0; + return LV_RESULT_OK; + } + } + + lv_obj_send_event(indev_obj_act, code, param); + if(indev_reset_check(indev)) return LV_RESULT_INVALID; + + return LV_RESULT_OK; +} + +static void indev_scroll_throw_anim_cb(void * var, int32_t v) +{ + LV_ASSERT_NULL(var); + LV_UNUSED(v); + lv_indev_t * indev = (lv_indev_t *)var; + + lv_indev_scroll_throw_handler(indev); + + if(indev->pointer.scroll_dir == LV_DIR_NONE || indev->pointer.scroll_obj == NULL) { + if(indev->scroll_throw_anim) { + LV_LOG_INFO("stop animation"); + lv_anim_delete(indev, indev_scroll_throw_anim_cb); + } + } +} + +static void indev_scroll_throw_anim_completed_cb(lv_anim_t * anim) +{ + if(anim) { + indev_scroll_throw_anim_reset((lv_indev_t *)anim->var); + } +} + +static void indev_scroll_throw_anim_start(lv_indev_t * indev) +{ + LV_ASSERT_NULL(indev); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, indev); + lv_anim_set_duration(&a, 1024); + lv_anim_set_values(&a, 0, 1024); + lv_anim_set_exec_cb(&a, indev_scroll_throw_anim_cb); + lv_anim_set_completed_cb(&a, indev_scroll_throw_anim_completed_cb); + lv_anim_set_deleted_cb(&a, indev_scroll_throw_anim_completed_cb); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + + indev->scroll_throw_anim = lv_anim_start(&a); +} diff --git a/inc/lvgl/src/indev/lv_indev.h b/inc/lvgl/src/indev/lv_indev.h new file mode 100644 index 0000000..2ea9736 --- /dev/null +++ b/inc/lvgl/src/indev/lv_indev.h @@ -0,0 +1,500 @@ +/** + * @file lv_indev.h + * + */ + +#ifndef LV_INDEV_H +#define LV_INDEV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_group.h" +#include "../misc/lv_area.h" +#include "../misc/lv_timer.h" +#include "../misc/lv_event.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Possible input device types*/ +typedef enum { + LV_INDEV_TYPE_NONE, /**< Uninitialized state*/ + LV_INDEV_TYPE_POINTER, /**< Touch pad, mouse, external button*/ + LV_INDEV_TYPE_KEYPAD, /**< Keypad or keyboard*/ + LV_INDEV_TYPE_BUTTON, /**< External (hardware button) which is assigned to a specific point of the screen*/ + LV_INDEV_TYPE_ENCODER, /**< Encoder with only Left, Right turn and a Button*/ +} lv_indev_type_t; + +/** States for input devices*/ +typedef enum { + LV_INDEV_STATE_RELEASED = 0, + LV_INDEV_STATE_PRESSED +} lv_indev_state_t; + +typedef enum { + LV_INDEV_MODE_NONE = 0, + LV_INDEV_MODE_TIMER, + LV_INDEV_MODE_EVENT, +} lv_indev_mode_t; + + +/* Supported types of gestures */ +typedef enum { + LV_INDEV_GESTURE_NONE = 0, + LV_INDEV_GESTURE_PINCH, + LV_INDEV_GESTURE_SWIPE, + LV_INDEV_GESTURE_ROTATE, + LV_INDEV_GESTURE_TWO_FINGERS_SWIPE, + LV_INDEV_GESTURE_SCROLL, /* Used with scrollwheels */ + LV_INDEV_GESTURE_CNT, /* Total number of gestures types */ +} lv_indev_gesture_type_t; + +/** Data structure passed to an input driver to fill*/ +typedef struct { + lv_indev_gesture_type_t gesture_type[LV_INDEV_GESTURE_CNT]; /* Current gesture types, per gesture */ + void * gesture_data[LV_INDEV_GESTURE_CNT]; /* Used to store data per gesture */ + + lv_indev_state_t state; /**< LV_INDEV_STATE_RELEASED or LV_INDEV_STATE_PRESSED*/ + + lv_point_t point; /**< For LV_INDEV_TYPE_POINTER the currently pressed point*/ + uint32_t key; /**< For LV_INDEV_TYPE_KEYPAD the currently pressed key*/ + uint32_t btn_id; /**< For LV_INDEV_TYPE_BUTTON the currently pressed button*/ + int16_t enc_diff; /**< For LV_INDEV_TYPE_ENCODER number of steps since the previous read*/ + + uint32_t timestamp; /**< Initialized to lv_tick_get(). Driver may provide more accurate timestamp for buffered events*/ + bool continue_reading; /**< If set to true, the read callback is invoked again, unless the device is in event-driven mode*/ +} lv_indev_data_t; + +typedef void (*lv_indev_read_cb_t)(lv_indev_t * indev, lv_indev_data_t * data); + +/** Indev key remapping callback */ +typedef lv_key_t (*lv_indev_key_remap_cb_t)(lv_indev_t * indev, lv_key_t key); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an indev + * @return Pointer to the created indev or NULL when allocation failed + */ +lv_indev_t * lv_indev_create(void); + +/** + * Remove the provided input device. Make sure not to use the provided input device afterwards anymore. + * @param indev pointer to delete + */ +void lv_indev_delete(lv_indev_t * indev); + +/** + * Get the next input device. + * @param indev pointer to the current input device. NULL to initialize. + * @return the next input device or NULL if there are no more. Provide the first input device when + * the parameter is NULL + */ +lv_indev_t * lv_indev_get_next(lv_indev_t * indev); + +/** + * Read data from an input device. + * @param indev pointer to an input device + */ +void lv_indev_read(lv_indev_t * indev); + +/** + * Called periodically to read the input devices + * @param timer pointer to a timer to read + */ +void lv_indev_read_timer_cb(lv_timer_t * timer); + +/** + * Enable or disable one or all input devices (default enabled) + * @param indev pointer to an input device or NULL to enable/disable all of them + * @param enable true to enable, false to disable + */ +void lv_indev_enable(lv_indev_t * indev, bool enable); + +/** + * Get the currently processed input device. Can be used in action functions too. + * @return pointer to the currently processed input device or NULL if no input device processing + * right now + */ +lv_indev_t * lv_indev_active(void); + +/** + * Set the type of an input device + * @param indev pointer to an input device + * @param indev_type the type of the input device from `lv_indev_type_t` (`LV_INDEV_TYPE_...`) + */ +void lv_indev_set_type(lv_indev_t * indev, lv_indev_type_t indev_type); + +/** + * Set a callback function to read input device data to the indev + * @param indev pointer to an input device + * @param read_cb pointer to callback function to read input device data + */ +void lv_indev_set_read_cb(lv_indev_t * indev, lv_indev_read_cb_t read_cb); + +/** + * Set user data to the indev + * @param indev pointer to an input device + * @param user_data pointer to user data + */ +void lv_indev_set_user_data(lv_indev_t * indev, void * user_data); + +/** + * Set driver data to the indev + * @param indev pointer to an input device + * @param driver_data pointer to driver data + */ +void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data); + +/** + * Assign a display to the indev + * @param indev pointer to an input device + * @param disp pointer to an display + */ +void lv_indev_set_display(lv_indev_t * indev, struct _lv_display_t * disp); + +/** + * Set long press time to indev + * @param indev pointer to input device + * @param long_press_time time long press time in ms + */ +void lv_indev_set_long_press_time(lv_indev_t * indev, uint16_t long_press_time); + +/** + * Set long press repeat time to indev + * @param indev pointer to input device + * @param long_press_repeat_time long press repeat time in ms + */ +void lv_indev_set_long_press_repeat_time(lv_indev_t * indev, uint16_t long_press_repeat_time); + +/** + * Set scroll limit to the input device + * @param indev pointer to an input device + * @param scroll_limit the number of pixels to slide before actually drag the object + */ +void lv_indev_set_scroll_limit(lv_indev_t * indev, uint8_t scroll_limit); + +/** + * Set scroll throw slow-down to the indev. Greater value means faster slow-down + * @param indev pointer to an input device + * @param scroll_throw the slow-down in [%] + */ +void lv_indev_set_scroll_throw(lv_indev_t * indev, uint8_t scroll_throw); + +/** + * Set the minimum velocity threshold for gesture detection. + * The difference between consecutive points must exceed this value (in pixels) + * for the movement to be considered fast enough to trigger a gesture. + * + * @param indev pointer to an input device + * @param min_velocity minimum velocity threshold in pixels (default: 3) + */ +void lv_indev_set_gesture_min_velocity(lv_indev_t * indev, uint8_t min_velocity); + +/** + * Set the minimum distance threshold for gesture detection. + * The total distance from the first point to the current point must exceed + * this value (in pixels) for the movement to be considered large enough + * to trigger a gesture. + * + * @param indev pointer to an input device + * @param min_distance minimum distance threshold in pixels (default: 50) + */ +void lv_indev_set_gesture_min_distance(lv_indev_t * indev, uint8_t min_distance); + +/** + * Get the type of an input device + * @param indev pointer to an input device + * @return the type of the input device from `lv_hal_indev_type_t` (`LV_INDEV_TYPE_...`) + */ +lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev); + +/** + * Get the callback function to read input device data to the indev + * @param indev pointer to an input device + * @return Pointer to callback function to read input device data or NULL if indev is NULL + */ +lv_indev_read_cb_t lv_indev_get_read_cb(lv_indev_t * indev); + +/** + * Get the indev state + * @param indev pointer to an input device + * @return Indev state or LV_INDEV_STATE_RELEASED if indev is NULL + */ +lv_indev_state_t lv_indev_get_state(const lv_indev_t * indev); + +/** + * Get the indev assigned group + * @param indev pointer to an input device + * @return Pointer to indev assigned group or NULL if indev is NULL + */ +lv_group_t * lv_indev_get_group(const lv_indev_t * indev); + +/** + * Get a pointer to the assigned display of the indev + * @param indev pointer to an input device + * @return pointer to the assigned display or NULL if indev is NULL + */ +lv_display_t * lv_indev_get_display(const lv_indev_t * indev); + +/** + * Get a pointer to the user data of the indev + * @param indev pointer to an input device + * @return pointer to the user data or NULL if indev is NULL + */ +void * lv_indev_get_user_data(const lv_indev_t * indev); + +/** + * Get a pointer to the driver data of the indev + * @param indev pointer to an input device + * @return pointer to the driver data or NULL if indev is NULL + */ +void * lv_indev_get_driver_data(const lv_indev_t * indev); + +/** + * Get whether indev is moved while pressed + * @param indev pointer to an input device + * @return true: indev is moved while pressed; false: indev is not moved while pressed + */ +bool lv_indev_get_press_moved(const lv_indev_t * indev); + +/** + * Reset one or all input devices + * @param indev pointer to an input device to reset or NULL to reset all of them + * @param obj pointer to an object which triggers the reset. + */ +void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj); + +/** + * Touch and key related events are sent to the input device first and to the widget after that. + * If this functions called in an indev event, the event won't be sent to the widget. + * @param indev pointer to an input device + */ +void lv_indev_stop_processing(lv_indev_t * indev); + +/** + * Reset the long press state of an input device + * @param indev pointer to an input device + */ +void lv_indev_reset_long_press(lv_indev_t * indev); + +/** + * Set a cursor for a pointer input device (for LV_INPUT_TYPE_POINTER and LV_INPUT_TYPE_BUTTON) + * @param indev pointer to an input device + * @param cur_obj pointer to an object to be used as cursor + */ +void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj); + +/** + * Set a destination group for a keypad input device (for LV_INDEV_TYPE_KEYPAD) + * @param indev pointer to an input device + * @param group pointer to a group + */ +void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group); + +/** + * Set the an array of points for LV_INDEV_TYPE_BUTTON. + * These points will be assigned to the buttons to press a specific point on the screen + * @param indev pointer to an input device + * @param points array of points + */ +void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points[]); + +/** + * Get the last point of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @param point pointer to a point to store the result + */ +void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point); + +/** +* Get the current gesture direct +* @param indev pointer to an input device +* @return current gesture direct +*/ +lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t * indev); + +/** + * Get the last pressed key of an input device (for LV_INDEV_TYPE_KEYPAD) + * @param indev pointer to an input device + * @return the last pressed key (0 on error) + */ +uint32_t lv_indev_get_key(const lv_indev_t * indev); + + +/** + * Get the counter for consecutive clicks within a short distance and time. + * The counter is updated before LV_EVENT_SHORT_CLICKED is fired. + * @param indev pointer to an input device + * @return short click streak counter + */ +uint8_t lv_indev_get_short_click_streak(const lv_indev_t * indev); + +/** + * Check the current scroll direction of an input device (for LV_INDEV_TYPE_POINTER and + * LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @return LV_DIR_NONE: no scrolling now + * LV_DIR_HOR/VER + */ +lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t * indev); + +/** + * Get the currently scrolled object (for LV_INDEV_TYPE_POINTER and + * LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @return pointer to the currently scrolled object or NULL if no scrolling by this indev + */ +lv_obj_t * lv_indev_get_scroll_obj(const lv_indev_t * indev); + +/** + * Get the movement vector of an input device (for LV_INDEV_TYPE_POINTER and + * LV_INDEV_TYPE_BUTTON) + * @param indev pointer to an input device + * @param point pointer to a point to store the types.pointer.vector + */ +void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point); + +/** + * Get the cursor object of an input device (for LV_INDEV_TYPE_POINTER only) + * @param indev pointer to an input device + * @return pointer to the cursor object + */ +lv_obj_t * lv_indev_get_cursor(lv_indev_t * indev); + +/** + * Do nothing until the next release + * @param indev pointer to an input device + */ +void lv_indev_wait_release(lv_indev_t * indev); + +/** + * Gets a pointer to the currently active object in the currently processed input device. + * @return pointer to currently active object or NULL if no active object + */ +lv_obj_t * lv_indev_get_active_obj(void); + +/** + * Get a pointer to the indev read timer to + * modify its parameters with `lv_timer_...` functions. + * @param indev pointer to an input device + * @return pointer to the indev read refresher timer. (NULL on error) + */ +lv_timer_t * lv_indev_get_read_timer(lv_indev_t * indev); + +/** +* Set the input device's event model: event-driven mode or timer mode. +* @param indev pointer to an input device +* @param mode the mode of input device +*/ +void lv_indev_set_mode(lv_indev_t * indev, lv_indev_mode_t mode); + +/** + * Get the input device's running mode. + * @param indev pointer to an input device + * @return the running mode for the specified input device. + */ +lv_indev_mode_t lv_indev_get_mode(lv_indev_t * indev); + +/** + * Search the most top, clickable object by a point + * @param obj pointer to a start object, typically the screen + * @param point pointer to a point for searching the most top child + * @return pointer to the found object or NULL if there was no suitable object + */ +lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point); + +/** + * Add an event handler to the indev + * @param indev pointer to an indev + * @param event_cb an event callback + * @param filter event code to react or `LV_EVENT_ALL` + * @param user_data optional user_data + */ +void lv_indev_add_event_cb(lv_indev_t * indev, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); + +/** + * Get the number of event attached to an indev + * @param indev pointer to an indev + * @return number of events + */ +uint32_t lv_indev_get_event_count(lv_indev_t * indev); + +/** + * Get an event descriptor for an event + * @param indev pointer to an indev + * @param index the index of the event + * @return the event descriptor + */ +lv_event_dsc_t * lv_indev_get_event_dsc(lv_indev_t * indev, uint32_t index); + +/** + * Remove an event + * @param indev pointer to an indev + * @param index the index of the event to remove + * @return true: and event was removed; false: no event was removed + */ +bool lv_indev_remove_event(lv_indev_t * indev, uint32_t index); + +/** + * Remove an event_cb with user_data + * @param indev pointer to a indev + * @param event_cb the event_cb of the event to remove + * @param user_data user_data + * @return the count of the event removed + */ +uint32_t lv_indev_remove_event_cb_with_user_data(lv_indev_t * indev, lv_event_cb_t event_cb, void * user_data); + +/** + * Send an event to an indev + * @param indev pointer to an indev + * @param code an event code. LV_EVENT_... + * @param param optional param + * @return LV_RESULT_OK: indev wasn't deleted in the event. + */ +lv_result_t lv_indev_send_event(lv_indev_t * indev, lv_event_code_t code, void * param); + +/** + * Set key remapping callback (LV_INDEV_TYPE_KEYPAD) + * @param indev pointer to an indev + * @param remap_cb remapping function callback. Use NULL to disable callback. + */ +void lv_indev_set_key_remap_cb(lv_indev_t * indev, lv_indev_key_remap_cb_t remap_cb); + +#if LV_USE_EXT_DATA +/** + * @brief Attaches external user data and destructor callback to an indev + * + * Associates custom user data with an LVGL indev and specifies a destructor function + * that will be automatically invoked when the indev is deleted to properly clean up + * the associated resources. + * + * @param indev Pointer to an indev + * @param data User-defined data pointer to associate with the indev + * @param free_cb Callback function for cleaning up ext_data when indev is deleted. + * Receives ext_data as parameter. NULL means no cleanup required. + */ +void lv_indev_set_external_data(lv_indev_t * indev, void * data, void (* free_cb)(void * data)); +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INDEV_H*/ diff --git a/inc/lvgl/src/indev/lv_indev_gesture.c b/inc/lvgl/src/indev/lv_indev_gesture.c new file mode 100644 index 0000000..10e8140 --- /dev/null +++ b/inc/lvgl/src/indev/lv_indev_gesture.c @@ -0,0 +1,981 @@ +/****************************************************************** + * @file lv_indev_gesture.c + * + * Recognize gestures that consist of multiple touch events + * + * Copyright (c) 2024 EDGEMTech Ltd + * + * Author EDGEMTech Ltd. (erik.tagirov@edgemtech.ch) + * + ******************************************************************/ + +/******************** + * INCLUDES + ********************/ + +#include "lv_indev_private.h" +#include "../misc/lv_event_private.h" + +#if LV_USE_GESTURE_RECOGNITION + +#include +#include "lv_indev_gesture.h" +#include "lv_indev_gesture_private.h" + +/******************** + * DEFINES + ********************/ + +#define LV_GESTURE_PINCH_DOWN_THRESHOLD 0.75f /* Default value - start sending events when reached */ +#define LV_GESTURE_PINCH_UP_THRESHOLD 1.5f /* Default value - start sending events when reached */ +#define LV_GESTURE_PINCH_MAX_INITIAL_SCALE 2.5f /* Default value */ +#define LV_GESTURE_ROTATION_ANGLE_RAD_THRESHOLD 0.2f /* Default value - start sending events when reached */ + + +/******************** + * TYPEDEFS + ********************/ + +/******************** + * STATIC PROTOTYPES + ********************/ + +static lv_indev_gesture_t * init_gesture_info(void); +static lv_indev_gesture_motion_t * get_motion(uint8_t id, lv_indev_gesture_t * info); +static int8_t get_motion_idx(uint8_t id, lv_indev_gesture_t * info); +static void process_touch_event(lv_indev_touch_data_t * touch, lv_indev_gesture_t * info); +static void gesture_update_center_point(lv_indev_gesture_t * gesture, int touch_points_nb); +static void gesture_calculate_factors(lv_indev_gesture_t * gesture, int touch_points_nb); +static void reset_recognizer(lv_indev_gesture_recognizer_t * recognizer); +static lv_indev_gesture_recognizer_t * lv_indev_get_gesture_recognizer(lv_event_t * gesture_event, + lv_indev_gesture_type_t type); +static lv_dir_t calculate_swipe_dir(lv_indev_gesture_recognizer_t * recognizer); +static lv_indev_gesture_type_t get_first_recognized_or_ended_gesture(lv_indev_t * indev); +static void indev_delete_event_cb(lv_event_t * e); + +/******************** + * STATIC VARIABLES + ********************/ + +/******************** + * MACROS + ********************/ +#define SQUARE(x) ((x) * (x)) +#define SQUARE_SUM(x, y) (SQUARE(x) + SQUARE(y)) + +/******************** + * GLOBAL FUNCTIONS + ********************/ + +void lv_indev_gesture_init(lv_indev_t * indev) +{ + LV_ASSERT_NULL(indev); + indev->recognizers[LV_INDEV_GESTURE_NONE].recog_fn = NULL; + indev->recognizers[LV_INDEV_GESTURE_PINCH].recog_fn = lv_indev_gesture_detect_pinch; + indev->recognizers[LV_INDEV_GESTURE_ROTATE].recog_fn = lv_indev_gesture_detect_rotation; + indev->recognizers[LV_INDEV_GESTURE_TWO_FINGERS_SWIPE].recog_fn = lv_indev_gesture_detect_two_fingers_swipe; + indev->recognizers[LV_INDEV_GESTURE_SCROLL].recog_fn = NULL; + indev->recognizers[LV_INDEV_GESTURE_SWIPE].recog_fn = NULL; + + lv_indev_add_event_cb(indev, indev_delete_event_cb, LV_EVENT_DELETE, NULL); +} + +void lv_indev_set_pinch_up_threshold(lv_indev_t * indev, float threshold) +{ + /* A up threshold MUST always be bigger than 1 */ + LV_ASSERT(threshold > 1.0f); + + lv_indev_gesture_recognizer_t * recognizer = &indev->recognizers[LV_INDEV_GESTURE_PINCH]; + + if(recognizer->config == NULL) { + recognizer->config = lv_malloc_zeroed(sizeof(lv_indev_gesture_configuration_t)); + LV_ASSERT_MALLOC(recognizer->config); + recognizer->config->pinch_down_threshold = LV_GESTURE_PINCH_DOWN_THRESHOLD; + } + + recognizer->config->pinch_up_threshold = threshold; +} + +void lv_indev_set_pinch_down_threshold(lv_indev_t * indev, float threshold) +{ + /* A down threshold MUST always be smaller than 1 */ + LV_ASSERT(threshold < 1.0f); + + lv_indev_gesture_recognizer_t * recognizer = &indev->recognizers[LV_INDEV_GESTURE_PINCH]; + + if(recognizer->config == NULL) { + recognizer->config = lv_malloc_zeroed(sizeof(lv_indev_gesture_configuration_t)); + LV_ASSERT_MALLOC(recognizer->config); + recognizer->config->pinch_up_threshold = LV_GESTURE_PINCH_UP_THRESHOLD; + } + + recognizer->config->pinch_down_threshold = threshold; +} + +void lv_indev_set_rotation_rad_threshold(lv_indev_t * indev, float threshold) +{ + /* A rotation threshold MUST always be a positive number */ + LV_ASSERT(threshold > 0.0f); + + lv_indev_gesture_recognizer_t * recognizer = &indev->recognizers[LV_INDEV_GESTURE_ROTATE]; + + if(recognizer->config == NULL) { + + recognizer->config = lv_malloc_zeroed(sizeof(lv_indev_gesture_configuration_t)); + LV_ASSERT(recognizer->config != NULL); + recognizer->config->rotation_angle_rad_threshold = LV_GESTURE_ROTATION_ANGLE_RAD_THRESHOLD; + } + + recognizer->config->rotation_angle_rad_threshold = threshold; +} + +void lv_indev_get_gesture_primary_point(lv_indev_gesture_recognizer_t * recognizer, lv_point_t * point) +{ + if(recognizer->info->motions[0].finger != -1) { + point->x = recognizer->info->motions[0].point.x; + point->y = recognizer->info->motions[0].point.y; + return; + } + + /* There are currently no active contact points */ + point->x = 0; + point->y = 0; +} + +bool lv_indev_recognizer_is_active(lv_indev_gesture_recognizer_t * recognizer) +{ + if(recognizer->state == LV_INDEV_GESTURE_STATE_ENDED || + recognizer->info->finger_cnt == 0) { + return false; + } + + return true; +} + +float lv_event_get_pinch_scale(lv_event_t * gesture_event) +{ + lv_indev_gesture_recognizer_t * recognizer; + + if((recognizer = lv_indev_get_gesture_recognizer(gesture_event, LV_INDEV_GESTURE_PINCH)) == NULL) { + return 0.0f; + } + + return recognizer->scale; +} + +float lv_event_get_rotation(lv_event_t * gesture_event) +{ + lv_indev_gesture_recognizer_t * recognizer; + + if((recognizer = lv_indev_get_gesture_recognizer(gesture_event, LV_INDEV_GESTURE_ROTATE)) == NULL) { + return 0.0f; + } + + return recognizer->rotation; +} + +float lv_event_get_two_fingers_swipe_distance(lv_event_t * gesture_event) +{ + lv_indev_gesture_recognizer_t * recognizer; + + if((recognizer = lv_indev_get_gesture_recognizer(gesture_event, LV_INDEV_GESTURE_TWO_FINGERS_SWIPE)) == NULL) { + return 0.0f; + } + + return recognizer->distance; +} + +lv_dir_t lv_event_get_two_fingers_swipe_dir(lv_event_t * gesture_event) +{ + + lv_indev_gesture_recognizer_t * recognizer; + + if((recognizer = lv_indev_get_gesture_recognizer(gesture_event, LV_INDEV_GESTURE_TWO_FINGERS_SWIPE)) == NULL) { + return LV_DIR_NONE; + } + + return recognizer->two_fingers_swipe_dir; +} + +void lv_indev_get_gesture_center_point(lv_indev_gesture_recognizer_t * recognizer, lv_point_t * point) +{ + if(lv_indev_recognizer_is_active(recognizer) == false) { + point->x = 0; + point->y = 0; + return; + } + + point->x = recognizer->info->center.x; + point->y = recognizer->info->center.y; +} + +lv_indev_gesture_state_t lv_event_get_gesture_state(lv_event_t * gesture_event, lv_indev_gesture_type_t type) +{ + lv_indev_gesture_recognizer_t * recognizer; + + if((recognizer = lv_indev_get_gesture_recognizer(gesture_event, type)) == NULL) { + return LV_INDEV_GESTURE_STATE_NONE; + } + + return recognizer->state; +} + +lv_indev_gesture_type_t lv_event_get_gesture_type(lv_event_t * gesture_event) +{ + lv_indev_t * indev = (lv_indev_t *) gesture_event->param; + + if(indev == NULL) { + return LV_INDEV_GESTURE_NONE; + } + + return indev->cur_gesture; +} + +void lv_indev_set_gesture_data(lv_indev_data_t * data, lv_indev_gesture_recognizer_t * recognizer, + lv_indev_gesture_type_t type) +{ + bool is_active; + + if(recognizer == NULL) return; + + data->gesture_type[type] = LV_INDEV_GESTURE_NONE; + data->gesture_data[type] = NULL; + + /* The call below returns false if there are no active contact points */ + /* - OR when the gesture has ended, false is considered as a RELEASED state */ + is_active = lv_indev_recognizer_is_active(recognizer); + + if(is_active == false) { + data->state = LV_INDEV_STATE_RELEASED; + } + else { + data->state = LV_INDEV_STATE_PRESSED; + } + + switch(recognizer->state) { + case LV_INDEV_GESTURE_STATE_RECOGNIZED: + data->gesture_type[type] = type; + data->gesture_data[type] = (void *) recognizer; + break; + + case LV_INDEV_GESTURE_STATE_ENDED: + data->gesture_type[type] = type; + data->gesture_data[type] = (void *) recognizer; + break; + + default: + break; + } +} + + +void lv_indev_gesture_detect_pinch(lv_indev_gesture_recognizer_t * recognizer, lv_indev_touch_data_t * touches, + uint16_t touch_cnt) +{ + lv_indev_touch_data_t * touch; + lv_indev_gesture_recognizer_t * r = recognizer; + uint8_t i; + + if(r->info == NULL) { + LV_LOG_TRACE("init gesture info"); + r->info = init_gesture_info(); + } + + if(r->config == NULL) { + LV_LOG_TRACE("init gesture configuration - set defaults"); + r->config = lv_malloc_zeroed(sizeof(lv_indev_gesture_configuration_t)); + LV_ASSERT_MALLOC(r->config); + + r->config->pinch_up_threshold = LV_GESTURE_PINCH_UP_THRESHOLD; + r->config->pinch_down_threshold = LV_GESTURE_PINCH_DOWN_THRESHOLD; + } + + /* Process collected touch events */ + for(i = 0; i < touch_cnt; i++) { + touch = touches; + process_touch_event(touch, r->info); + touches++; + + LV_LOG_TRACE("processed touch ev: %d finger id: %d state: %d x: %" LV_PRId32 " y: %" LV_PRId32 " finger_cnt: %d", + i, touch->id, touch->state, touch->point.x, touch->point.y, r->info->finger_cnt); + } + + LV_LOG_TRACE("Current finger count: %d state: %d", r->info->finger_cnt, r->state); + + if(r->info->finger_cnt == 2) { + switch(r->state) { + case LV_INDEV_GESTURE_STATE_NONE: + + /* 2 fingers down - potential pinch or swipe */ + reset_recognizer(recognizer); + gesture_update_center_point(r->info, 2); + r->state = LV_INDEV_GESTURE_STATE_ONGOING; + break; + case LV_INDEV_GESTURE_STATE_ONGOING: + gesture_calculate_factors(r->info, 2); + if(r->info->scale > LV_GESTURE_PINCH_MAX_INITIAL_SCALE) { + r->state = LV_INDEV_GESTURE_STATE_CANCELED; + break; + } + if(r->info->scale > r->config->pinch_up_threshold || + r->info->scale < r->config->pinch_down_threshold) { + r->state = LV_INDEV_GESTURE_STATE_RECOGNIZED; + } + break; + case LV_INDEV_GESTURE_STATE_RECOGNIZED: + /* It's an ongoing pinch gesture - update the factors */ + gesture_calculate_factors(r->info, 2); + LV_ASSERT(r->info != NULL); + r->scale = r->info->scale; + r->type = LV_INDEV_GESTURE_PINCH; + break; + case LV_INDEV_GESTURE_STATE_ENDED: + case LV_INDEV_GESTURE_STATE_CANCELED: + reset_recognizer(r); + break; + default: + LV_ASSERT_MSG(true, "invalid gesture recognizer state"); + } + } + else { + switch(r->state) { + case LV_INDEV_GESTURE_STATE_RECOGNIZED: + /* Gesture has ended */ + r->state = LV_INDEV_GESTURE_STATE_ENDED; + break; + case LV_INDEV_GESTURE_STATE_ONGOING: + /* User lifted a finger before reaching threshold */ + r->state = LV_INDEV_GESTURE_STATE_CANCELED; + break; + case LV_INDEV_GESTURE_STATE_ENDED: + case LV_INDEV_GESTURE_STATE_CANCELED: + reset_recognizer(r); + break; + + default: + LV_ASSERT_MSG(true, "invalid gesture recognizer state"); + } + } +} + +void lv_indev_gesture_detect_rotation(lv_indev_gesture_recognizer_t * recognizer, lv_indev_touch_data_t * touches, + uint16_t touch_cnt) +{ + lv_indev_touch_data_t * touch; + lv_indev_gesture_recognizer_t * r = recognizer; + uint8_t i; + + if(r->info == NULL) { + LV_LOG_TRACE("init gesture info"); + r->info = init_gesture_info(); + } + + if(r->config == NULL) { + LV_LOG_TRACE("init gesture configuration - set defaults"); + r->config = lv_malloc_zeroed(sizeof(lv_indev_gesture_configuration_t)); + + LV_ASSERT(r->config != NULL); + } + + /* Process collected touch events */ + for(i = 0; i < touch_cnt; i++) { + + touch = touches; + process_touch_event(touch, r->info); + touches++; + + LV_LOG_TRACE("processed touch ev: %d finger id: %d state: %d x: %" LV_PRId32 " y: %" LV_PRId32 " finger_cnt: %d", + i, touch->id, touch->state, touch->point.x, touch->point.y, r->info->finger_cnt); + } + + LV_LOG_TRACE("Current finger count: %d state: %d", r->info->finger_cnt, r->state); + + if(r->info->finger_cnt == 2) { + switch(r->state) { + case LV_INDEV_GESTURE_STATE_NONE: + /* 2 fingers down - potential rotation or swipe */ + reset_recognizer(recognizer); + gesture_update_center_point(r->info, 2); + r->state = LV_INDEV_GESTURE_STATE_ONGOING; + break; + case LV_INDEV_GESTURE_STATE_ONGOING: + /* Update the rotation from the inputs */ + gesture_calculate_factors(r->info, 2); + if(fabs(r->info->rotation - r->info->p_rotation) > r->config->rotation_angle_rad_threshold) { + + gesture_update_center_point(r->info, 2); + r->state = LV_INDEV_GESTURE_STATE_RECOGNIZED; + } + break; + case LV_INDEV_GESTURE_STATE_RECOGNIZED: + /* It's a recognized rotation gesture - update the factors */ + gesture_calculate_factors(r->info, 2); + r->type = LV_INDEV_GESTURE_ROTATE; + r->rotation = r->info->rotation; + break; + case LV_INDEV_GESTURE_STATE_ENDED: + case LV_INDEV_GESTURE_STATE_CANCELED: + reset_recognizer(r); + r->type = LV_INDEV_GESTURE_NONE; + r->state = LV_INDEV_GESTURE_STATE_CANCELED; + break; + default: + LV_ASSERT_MSG(true, "invalid gesture recognizer state"); + } + } + else { + switch(r->state) { + case LV_INDEV_GESTURE_STATE_RECOGNIZED: + /* Gesture has ended */ + r->type = LV_INDEV_GESTURE_ROTATE; + r->state = LV_INDEV_GESTURE_STATE_ENDED; + break; + case LV_INDEV_GESTURE_STATE_ONGOING: + /* User lifted a finger before reaching threshold */ + reset_recognizer(r); + break; + case LV_INDEV_GESTURE_STATE_CANCELED: + case LV_INDEV_GESTURE_STATE_ENDED: + reset_recognizer(r); + break; + default: + LV_ASSERT_MSG(true, "invalid gesture recognizer state"); + } + } +} + +void lv_indev_gesture_detect_two_fingers_swipe(lv_indev_gesture_recognizer_t * recognizer, + lv_indev_touch_data_t * touches, + uint16_t touch_cnt) +{ + lv_indev_touch_data_t * touch; + lv_indev_gesture_recognizer_t * r = recognizer; + uint8_t i; + float dist; + + if(r->info == NULL) { + LV_LOG_TRACE("init gesture info"); + r->info = init_gesture_info(); + } + + if(r->config == NULL) { + LV_LOG_TRACE("init gesture configuration - set defaults"); + r->config = lv_malloc_zeroed(sizeof(lv_indev_gesture_configuration_t)); + + LV_ASSERT(r->config != NULL); + } + + /* Process collected touch events */ + for(i = 0; i < touch_cnt; i++) { + + touch = touches; + process_touch_event(touch, r->info); + touches++; + + LV_LOG_TRACE("processed touch ev: %d finger id: %d state: %d x: %" LV_PRId32 " y: %" LV_PRId32 " finger_cnt: %d", + i, touch->id, touch->state, touch->point.x, touch->point.y, r->info->finger_cnt); + } + + LV_LOG_TRACE("Current finger count: %d state: %d", r->info->finger_cnt, r->state); + + if(r->info->finger_cnt == 2) { + + switch(r->state) { + case LV_INDEV_GESTURE_STATE_NONE: + /* 2 fingers down - potential rotation or swipe */ + reset_recognizer(recognizer); + gesture_update_center_point(r->info, 2); + r->state = LV_INDEV_GESTURE_STATE_ONGOING; + break; + case LV_INDEV_GESTURE_STATE_ONGOING: + /* The gesture is ongoing, now wait for the distance from the center + to be higher than the threshold to pass it as recognized */ + gesture_calculate_factors(r->info, 2); + dist = SQUARE_SUM(r->info->delta_x, r->info->delta_y); + if(dist > SQUARE(lv_indev_active()->gesture_min_distance)) { + r->state = LV_INDEV_GESTURE_STATE_RECOGNIZED; + } + break; + case LV_INDEV_GESTURE_STATE_RECOGNIZED: + /* The gesture is now recognized, and will stay recognized + until a finger is lifted */ + gesture_calculate_factors(r->info, 2); + r->distance = (float) sqrt(SQUARE_SUM(r->info->delta_x, r->info->delta_y)); + r->two_fingers_swipe_dir = calculate_swipe_dir(r); + r->type = LV_INDEV_GESTURE_TWO_FINGERS_SWIPE; + break; + case LV_INDEV_GESTURE_STATE_ENDED: + case LV_INDEV_GESTURE_STATE_CANCELED: + reset_recognizer(r); + break; + default: + LV_ASSERT_MSG(true, "invalid gesture recognizer state"); + } + } + else { + + switch(r->state) { + case LV_INDEV_GESTURE_STATE_RECOGNIZED: + /* Gesture has ended */ + r->state = LV_INDEV_GESTURE_STATE_ENDED; + r->type = LV_INDEV_GESTURE_TWO_FINGERS_SWIPE; + break; + case LV_INDEV_GESTURE_STATE_ONGOING: + /* User lifted a finger before reaching threshold */ + reset_recognizer(r); + r->state = LV_INDEV_GESTURE_STATE_ENDED; + break; + case LV_INDEV_GESTURE_STATE_CANCELED: + case LV_INDEV_GESTURE_STATE_ENDED: + reset_recognizer(r); + r->state = LV_INDEV_GESTURE_STATE_NONE; + break; + default: + LV_ASSERT_MSG(true, "invalid gesture recognizer state"); + } + } +} + +void lv_indev_gesture_recognizers_update(lv_indev_t * indev, lv_indev_touch_data_t * touches, uint16_t touch_cnt) +{ + lv_indev_gesture_type_t type; + + /* First check if a recognizer state is RECOGNIZED or ENDED. * + * In that case, call its recongizer function and reset the other*/ + type = get_first_recognized_or_ended_gesture(indev); + if(type != LV_INDEV_GESTURE_NONE) { + + for(int i = 0; i < LV_INDEV_GESTURE_CNT; i++) { + + if(indev->recognizers[i].recog_fn != NULL) { + + /* Update all recognizers to let them process input */ + indev->recognizers[i].recog_fn(&indev->recognizers[i], &touches[0], touch_cnt); + + /* Then reset the recognizers which did not report RECOGNIZED or ENDED */ + if(((lv_indev_gesture_type_t)i) != type) { + reset_recognizer(&indev->recognizers[i]); + } + } + } + + } + else { + + /* Otherwise call all recognizer functions, and stop as soon as one recognizer * + * reports the state RECOGNIZED or ENDED */ + for(int i = 0; i < LV_INDEV_GESTURE_CNT; i++) { + if(indev->recognizers[i].recog_fn != NULL) { + indev->recognizers[i].recog_fn(&indev->recognizers[i], &touches[0], touch_cnt); + + /* If the new state is RECOGNIZED or ENDED */ + if(indev->recognizers[i].state == LV_INDEV_GESTURE_STATE_RECOGNIZED || + indev->recognizers[i].state == LV_INDEV_GESTURE_STATE_ENDED) { + + /* Reset the others registered recognizers */ + for(int j = 0; j < LV_INDEV_GESTURE_CNT; j++) { + if(j != i && indev->recognizers[j].recog_fn != NULL) { + reset_recognizer(&indev->recognizers[j]); + } + } + break; + } + } + } + } +} + +void lv_indev_gesture_recognizers_set_data(lv_indev_t * indev, lv_indev_data_t * data) +{ + lv_indev_gesture_type_t type; + type = get_first_recognized_or_ended_gesture(indev); + + /* If a gesture is RECOGNIZED or ENDED, set only its data */ + if(type != LV_INDEV_GESTURE_NONE) { + lv_indev_set_gesture_data(data, &indev->recognizers[type], type); + } + else { + /* Otherwise, set data from all initialized recognizer */ + for(int i = 0; i < LV_INDEV_GESTURE_CNT; i++) { + if(indev->recognizers[i].recog_fn != NULL) { + lv_indev_set_gesture_data(data, &indev->recognizers[i], i); + } + } + } +} + + +/******************** + * STATIC FUNCTIONS + ********************/ + +/** + * Calculate the direction from the starting center of a two fingers swipe gesture + * @param recognizer pointer to the recognizer handling the two fingers + * swipe gesture + * @return the direction of the swipe, from the starting center + */ +static lv_dir_t calculate_swipe_dir(lv_indev_gesture_recognizer_t * recognizer) +{ + float abs_x = LV_ABS(recognizer->info->delta_x); + float abs_y = LV_ABS(recognizer->info->delta_y); + + if(abs_x > abs_y) { + return recognizer->info->delta_x > 0 ? LV_DIR_RIGHT : LV_DIR_LEFT; + } + else { + return recognizer->info->delta_y > 0 ? LV_DIR_BOTTOM : LV_DIR_TOP; + } +} + +/** + * Get the gesture recognizer associated to the event + * @param gesture_event an LV_GESTURE_EVENT event + * @param type the type of the recognizer we want to get + * @return a pointer to the gesture recognizer that emitted the event + */ +lv_indev_gesture_recognizer_t * lv_indev_get_gesture_recognizer(lv_event_t * gesture_event, + lv_indev_gesture_type_t type) +{ + lv_indev_t * indev; + + if(gesture_event == NULL || gesture_event->param == NULL) return NULL; + + indev = (lv_indev_t *) gesture_event->param; + + if(indev == NULL || indev->gesture_data[type] == NULL) return NULL; + + return (lv_indev_gesture_recognizer_t *) indev->gesture_data[type]; +} + +/** + * Resets a gesture recognizer, motion descriptors are preserved + * @param recognizer a pointer to the recognizer to reset + */ +static void reset_recognizer(lv_indev_gesture_recognizer_t * recognizer) +{ + uint8_t finger_cnt; + lv_indev_gesture_t * info; + lv_indev_gesture_configuration_t * conf; + lv_recognizer_func_t recog_fn; + + if(recognizer == NULL) return; + + finger_cnt = recognizer->info->finger_cnt; + info = recognizer->info; + conf = recognizer->config; + recog_fn = recognizer->recog_fn; + + /* Set everything to zero but preserve the motion descriptors, + * which are located at the start of the lv_indev_gesture_t struct */ + lv_memzero((uint8_t *)info + sizeof(info->motions), sizeof(lv_indev_gesture_t) - sizeof(info->motions)); + lv_memzero(recognizer, sizeof(lv_indev_gesture_recognizer_t)); + + recognizer->info = info; + recognizer->config = conf; + recognizer->recog_fn = recog_fn; + + recognizer->scale = recognizer->info->scale = 1.0; + recognizer->info->finger_cnt = finger_cnt; + + recognizer->state = LV_INDEV_GESTURE_STATE_NONE; + recognizer->type = LV_INDEV_GESTURE_NONE; +} + +/** + * Initializes a motion descriptors used with the recognizer(s) + * @return a pointer to gesture descriptor + */ +static lv_indev_gesture_t * init_gesture_info(void) +{ + lv_indev_gesture_t * info; + uint8_t i; + + info = lv_malloc_zeroed(sizeof(lv_indev_gesture_t)); + LV_ASSERT_MALLOC(info); + + info->scale = 1; + info->rotation = 0.0; + + for(i = 0; i < LV_GESTURE_MAX_POINTS; i++) { + info->motions[i].finger = -1; + } + + return info; +} + +/** + * Obtains the contact point motion descriptor with id + * @param id the id of the contact point + * @param info a pointer to the gesture descriptor that stores the motion of each contact point + * @return a pointer to the motion descriptor or NULL if not found + */ +static lv_indev_gesture_motion_t * get_motion(uint8_t id, lv_indev_gesture_t * info) +{ + uint8_t i; + + for(i = 0; i < LV_GESTURE_MAX_POINTS; i++) { + if(info->motions[i].finger == id) { + return &info->motions[i]; + } + } + + return NULL; +} + +/** + * Obtains the index of the contact point motion descriptor + * @param id the id of the contact point + * @param info a pointer to the gesture descriptor that stores the motion of each contact point + * @return the index of the motion descriptor or -1 if not found + */ +static int8_t get_motion_idx(uint8_t id, lv_indev_gesture_t * info) +{ + uint8_t i; + + for(i = 0; i < LV_GESTURE_MAX_POINTS; i++) { + if(info->motions[i].finger == id) { + return i; + } + } + + return -1; +} + +/** + * Update the motion descriptors of a gesture + * @param touch a pointer to a touch data structure + * @param info a pointer to a gesture descriptor + */ +static void process_touch_event(lv_indev_touch_data_t * touch, lv_indev_gesture_t * info) +{ + lv_indev_gesture_t * g = info; + lv_indev_gesture_motion_t * motion; + int8_t motion_idx; + int8_t len; + + motion_idx = get_motion_idx(touch->id, g); + + if(motion_idx == -1 && touch->state == LV_INDEV_STATE_PRESSED) { + if(g->finger_cnt >= LV_GESTURE_MAX_POINTS) { + /* Skip touch */ + return; + } + + /* New touch point id */ + motion = &g->motions[g->finger_cnt]; + motion->start_point.x = touch->point.x; + motion->start_point.y = touch->point.y; + motion->point.x = touch->point.x; + motion->point.y = touch->point.y; + motion->finger = touch->id; + motion->state = touch->state; + + g->finger_cnt++; + } + else if(motion_idx >= 0 && touch->state == LV_INDEV_STATE_RELEASED) { + if(motion_idx == g->finger_cnt - 1) { + + /* Mark last item as un-used */ + motion = get_motion(touch->id, g); + + if(motion == NULL) { + LV_LOG_ERROR("Released touch not found (id=%d)", touch->id); + return; + } + + motion->finger = -1; + motion->state = touch->state; + } + else { + + /* Move back by one */ + len = (g->finger_cnt - 1) - motion_idx; + + if(len > 0) { + lv_memmove(g->motions + motion_idx, + g->motions + motion_idx + 1, + sizeof(lv_indev_gesture_motion_t) * len); + } + + if(g->finger_cnt > 0) { + g->motions[g->finger_cnt - 1].finger = -1; + } + + LV_ASSERT(g->motions[motion_idx + 1].finger == -1); + } + + if(g->finger_cnt > 0) { + g->finger_cnt--; + } + else { + g->finger_cnt = 0; + } + } + else if(motion_idx >= 0) { + motion = get_motion(touch->id, g); + + if(motion == NULL) { + LV_LOG_ERROR("Active touch missing (id=%d state=%d)", touch->id, touch->state); + return; + } + + motion->point.x = touch->point.x; + motion->point.y = touch->point.y; + motion->state = touch->state; + } + else { + LV_LOG_TRACE("Ignore extra touch id: %d", touch->id); + } +} + +/** + * Calculate the center point of a gesture, called when there + * is a probability for the gesture to occur + * @param touch a pointer to a touch data structure + * @param touch_points_nb The number of contact point to take into account + */ +static void gesture_update_center_point(lv_indev_gesture_t * gesture, int touch_points_nb) +{ + lv_indev_gesture_motion_t * motion; + lv_indev_gesture_t * g = gesture; + int32_t x = 0; + int32_t y = 0; + uint8_t i; + float scale_factor = 0.0f; + float delta_x[LV_GESTURE_MAX_POINTS] = {0.0f}; + float delta_y[LV_GESTURE_MAX_POINTS] = {0.0f}; + uint8_t touch_cnt = 0; + x = y = 0; + + g->p_scale = g->scale; + g->p_delta_x = g->delta_x; + g->p_delta_y = g->delta_y; + g->p_rotation = g->rotation; + + for(i = 0; i < touch_points_nb; i++) { + motion = &g->motions[i]; + + if(motion->finger >= 0) { + x += motion->point.x; + y += motion->point.y; + touch_cnt++; + } + else { + break; + } + } + + g->center.x = x / touch_cnt; + g->center.y = y / touch_cnt; + + for(i = 0; i < touch_points_nb; i++) { + motion = &g->motions[i]; + if(motion->finger >= 0) { + delta_x[i] = motion->point.x - g->center.x; + delta_y[i] = motion->point.y - g->center.y; + scale_factor += (delta_x[i] * delta_x[i]) + (delta_y[i] * delta_y[i]); + } + } + for(i = 0; i < touch_points_nb; i++) { + motion = &g->motions[i]; + if(motion->finger >= 0) { + g->scale_factors_x[i] = delta_x[i] / scale_factor; + g->scale_factors_y[i] = delta_y[i] / scale_factor; + } + } +} + +/** + * Calculate the scale, translation and rotation of a gesture, called when + * the gesture has been recognized + * @param gesture a pointer to the gesture descriptor + * @param touch_points_nb the number of contact points to take into account + */ +static void gesture_calculate_factors(lv_indev_gesture_t * gesture, int touch_points_nb) +{ + lv_indev_gesture_motion_t * motion; + lv_indev_gesture_t * g = gesture; + float center_x = 0; + float center_y = 0; + float a = 0; + float b = 0; + float d_x; + float d_y; + int8_t i; + int8_t touch_cnt = 0; + + for(i = 0; i < touch_points_nb; i++) { + motion = &g->motions[i]; + + if(motion->finger >= 0) { + center_x += motion->point.x; + center_y += motion->point.y; + touch_cnt++; + } + else { + break; + } + } + + center_x = center_x / touch_cnt; + center_y = center_y / touch_cnt; + + /* translation */ + g->delta_x = g->p_delta_x + (center_x - g->center.x); + g->delta_y = g->p_delta_y + (center_y - g->center.y); + + /* rotation & scaling */ + for(i = 0; i < touch_points_nb; i++) { + motion = &g->motions[i]; + + if(motion->finger >= 0) { + d_x = (motion->point.x - center_x); + d_y = (motion->point.y - center_y); + a += g->scale_factors_x[i] * d_x + g->scale_factors_y[i] * d_y; + b += g->scale_factors_x[i] * d_y - g->scale_factors_y[i] * d_x; + } + } + + g->rotation = g->p_rotation + atan2f(b, a); + g->scale = g->p_scale * sqrtf((a * a) + (b * b)); +} + +/** + * Get the type of the first gesture which reports either a LV_INDEV_GESTURE_STATE_RECOGNIZED + * or LV_INDEV_GESTURE_STATE_ENDED state + * @param indev pointer to the indev device from which we want to check the gestures states + * @return the type of the gesture having the state LV_INDEV_GESTURE_STATE_RECOGNIZED or + * LV_INDEV_GESTURE_STATE_ENDED, if found + * LV_INDEV_GESTURE_NONE otherwise + */ +static lv_indev_gesture_type_t get_first_recognized_or_ended_gesture(lv_indev_t * indev) +{ + for(int i = 0; i < LV_INDEV_GESTURE_CNT; i++) { + if(indev->recognizers[i].state == LV_INDEV_GESTURE_STATE_RECOGNIZED || + indev->recognizers[i].state == LV_INDEV_GESTURE_STATE_ENDED) + return (lv_indev_gesture_type_t) i; + } + + return LV_INDEV_GESTURE_NONE; +} + +static void indev_delete_event_cb(lv_event_t * e) +{ + lv_indev_t * indev = lv_event_get_current_target(e); + + for(uint8_t i = 0; i < LV_INDEV_GESTURE_CNT; i++) { + if(indev->recognizers[i].info) { + lv_free(indev->recognizers[i].info); + indev->recognizers[i].info = NULL; + } + + if(indev->recognizers[i].config) { + lv_free(indev->recognizers[i].config); + indev->recognizers[i].config = NULL; + } + } +} + + +#endif /* LV_USE_GESTURE_RECOGNITION */ diff --git a/inc/lvgl/src/indev/lv_indev_gesture.h b/inc/lvgl/src/indev/lv_indev_gesture.h new file mode 100644 index 0000000..111d7b2 --- /dev/null +++ b/inc/lvgl/src/indev/lv_indev_gesture.h @@ -0,0 +1,249 @@ +/******************************************************************* + * + * @file lv_indev_gesture.h + * + * Copyright (c) 2024 EDGEMTech Ltd. + * + * Author EDGEMTech Ltd, (erik.tagirov@edgemtech.ch) + * + ******************************************************************/ + +#ifndef LV_INDEV_GESTURE_H +#define LV_INDEV_GESTURE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" + +#if LV_USE_GESTURE_RECOGNITION + +#if LV_USE_FLOAT == 0 +#error "LV_USE_FLOAT is required for gesture detection." +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/* Opaque types defined in the private header */ +struct lv_indev_gesture; +struct lv_indev_gesture_configuration; + +typedef struct lv_indev_gesture_recognizer lv_indev_gesture_recognizer_t; +typedef struct lv_indev_touch_data lv_indev_touch_data_t; + +typedef struct lv_indev_gesture lv_indev_gesture_t; +typedef struct lv_indev_gesture_configuration lv_indev_gesture_configuration_t; + +typedef void (*lv_recognizer_func_t)(lv_indev_gesture_recognizer_t *, lv_indev_touch_data_t *, uint16_t); + +/* The states of a gesture recognizer */ +typedef enum { + LV_INDEV_GESTURE_STATE_NONE = 0, /* Beginning & end */ + LV_INDEV_GESTURE_STATE_ONGOING, /* Set when there is a probability */ + LV_INDEV_GESTURE_STATE_RECOGNIZED, /* Recognized, the event will contain touch info */ + LV_INDEV_GESTURE_STATE_ENDED, /* A recognized gesture has ended */ + LV_INDEV_GESTURE_STATE_CANCELED, /* Canceled - usually a finger is lifted */ +} lv_indev_gesture_state_t; + +/* Data structures for touch events - used to repsensent a libinput event */ +/* Emitted by devices capable of tracking identifiable contacts (type B) */ +struct lv_indev_touch_data { + lv_point_t point; /* Coordinates of the touch */ + lv_indev_state_t state; /* The state i.e PRESSED or RELEASED */ + uint8_t id; /* Identification/slot of the contact point */ + uint32_t timestamp; /* Timestamp in milliseconds */ +}; + +/* Gesture recognizer */ +struct lv_indev_gesture_recognizer { + lv_indev_gesture_type_t type; /* The detected gesture type */ + lv_indev_gesture_state_t state; /* The gesture state ongoing, recognized */ + lv_indev_gesture_t * info; /* Information on the motion of each touch point */ + float scale; /* Relevant for the pinch gesture */ + float rotation; /* Relevant for rotation */ + float distance; /* Relevant for swipes */ + float speed; + lv_dir_t two_fingers_swipe_dir; /* Relevant for swipes */ + + lv_indev_gesture_configuration_t * config; /* The recognizer config, containing the gestures + thresholds */ + lv_recognizer_func_t recog_fn; /* The recognizer function that this recongnizer must execute */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize this indev's recognizers. It specifies their recognizer functions + * @param indev pointer to the indev containing the recognizers to initialize + */ +void lv_indev_gesture_init(lv_indev_t * indev); + +/* PINCH Gesture */ + +/** + * Pinch gesture recognizer function + * Will update the recognizer data + * @param recognizer pointer to a gesture recognizer + * @param touches pointer to the first element of the collected touch events + * @param touch_cnt length of passed touch event array. + */ +void lv_indev_gesture_detect_pinch(lv_indev_gesture_recognizer_t * recognizer, lv_indev_touch_data_t * touches, + uint16_t touch_cnt); + +/** + * Rotation gesture recognizer function + * Will update the recognizer data + * @param recognizer pointer to a gesture recognizer + * @param touches pointer to the first element of the collected touch events + * @param touch_cnt length of passed touch event array. + */ +void lv_indev_gesture_detect_rotation(lv_indev_gesture_recognizer_t * recognizer, lv_indev_touch_data_t * touches, + uint16_t touch_cnt); + +/** + * Two finger swipe gesture recognizer function + * Will update the recognizer data + * @param recognizer pointer to a gesture recognizer + * @param touches pointer to the first element of the collected touch events + * @param touch_cnt length of passed touch event array. + */ +void lv_indev_gesture_detect_two_fingers_swipe(lv_indev_gesture_recognizer_t * recognizer, + lv_indev_touch_data_t * touches, + uint16_t touch_cnt); + +/** + * Set the threshold for the pinch gesture scale up, when the scale factor of gesture + * reaches the threshold events get sent + * @param indev pointer to the indev device containing the pinch recognizer + * @param threshold threshold for a pinch up gesture to be recognized + */ +void lv_indev_set_pinch_up_threshold(lv_indev_t * indev, float threshold); + +/** + * Set the threshold for the pinch gesture scale down, when the scale factor of gesture + * reaches the threshold events get sent + * @param indev pointer to the indev device containing the pinch recognizer + * @param threshold threshold for a pinch down gesture to be recognized + */ +void lv_indev_set_pinch_down_threshold(lv_indev_t * indev, float threshold); + +/** + * Set the rotation threshold in radian for the rotation gesture + * @param indev pointer to the indev device containing the rotation recognizer + * @param threshold threshold in radian for a rotation gesture to be recognized + */ +void lv_indev_set_rotation_rad_threshold(lv_indev_t * indev, float threshold); + +/** + * Obtains the current scale of a pinch gesture + * @param gesture_event pointer to a gesture event + * @return the scale of the current gesture + */ +float lv_event_get_pinch_scale(lv_event_t * gesture_event); + +/** + * Obtains the current angle in radian of a rotation gesture + * @param gesture_event pointer to a gesture event + * @return the rotation angle in radian of the current gesture + */ +float lv_event_get_rotation(lv_event_t * gesture_event); + +/** + * Obtains the current distance in pixels of a two fingers swipe gesture, from the starting center + * @param gesture_event pointer to a gesture event + * @return the distance from the center, in pixels, of the current gesture + */ +float lv_event_get_two_fingers_swipe_distance(lv_event_t * gesture_event); + +/** + * Obtains the current direction from the center of a two finger swipe + * @param gesture_event pointer to a gesture event + * @return the rotation angle in radian of the current gesture + */ +lv_dir_t lv_event_get_two_fingers_swipe_dir(lv_event_t * gesture_event); + +/** + * Sets the state of the recognizer to a indev data structure, + * it is usually called from the indev read callback + * @param data the indev data + * @param recognizer pointer to a gesture recognizer + */ +void lv_indev_set_gesture_data(lv_indev_data_t * data, lv_indev_gesture_recognizer_t * recognizer, + lv_indev_gesture_type_t type); + +/** + * Obtains the center point of a gesture + * @param gesture_event pointer to a gesture recognizer event + * @param point pointer to a point + */ +void lv_indev_get_gesture_center_point(lv_indev_gesture_recognizer_t * recognizer, lv_point_t * point); + +/** + * Obtains the current state of the gesture recognizer attached to an event + * @param gesture_event pointer to a gesture recognizer event + * @return current state of the gesture recognizer + */ +lv_indev_gesture_state_t lv_event_get_gesture_state(lv_event_t * gesture_event, lv_indev_gesture_type_t type); + +/** + * Obtains the current event type of the gesture recognizer attached to an event + * @param gesture_event pointer to a gesture recognizer event + * @return current event type of the gesture recognizer + */ +lv_indev_gesture_type_t lv_event_get_gesture_type(lv_event_t * gesture_event); + +/** + * Obtains the coordinates of the current primary point + * @param recognizer pointer to a gesture recognizer + * @param point pointer to a point + */ +void lv_indev_get_gesture_primary_point(lv_indev_gesture_recognizer_t * recognizer, lv_point_t * point); + +/** + * Allows to determine if there is an are ongoing gesture + * @param recognizer pointer to a gesture recognizer + * @return false if there are no contact points, or the gesture has ended - true otherwise + */ +bool lv_indev_recognizer_is_active(lv_indev_gesture_recognizer_t * recognizer); + +/** + * Update the recognizers. It execute the recognizers functions and checks for + * LV_GESTURE_STATE_RECOGNIZED or LV_GESTURE_STATE_ENDED gestures. + * To be called in the indev read_cb. + * @param indev pointer to the indev containing from which the reconizer need an update + * @param touches indev touch data array, containing the last touch data from indev + * since the last recognizers update + * @param touch_cnt number of indev touch data in touches + */ +void lv_indev_gesture_recognizers_update(lv_indev_t * indev, lv_indev_touch_data_t * touches, uint16_t touch_cnt); + +/** + * Set the lv_indev_data_t struct from the recognizer data. + * To be called in the indev read_cb. + */ +void lv_indev_gesture_recognizers_set_data(lv_indev_t * indev, lv_indev_data_t * data); + + +/********************** + * MACROS + **********************/ + +#endif /* END LV_USE_RECOGNITION */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_INDEV_GESTURE_H */ diff --git a/inc/lvgl/src/indev/lv_indev_gesture_private.h b/inc/lvgl/src/indev/lv_indev_gesture_private.h new file mode 100644 index 0000000..e927f42 --- /dev/null +++ b/inc/lvgl/src/indev/lv_indev_gesture_private.h @@ -0,0 +1,97 @@ +/******************************************************************* + * + * @file lv_indev_gesture_private.h + * + * Contains declarations and definition that are internal + * to the gesture detection logic + * + * Copyright (c) 2024 EDGEMTech Ltd. + * + * Author EDGEMTech Ltd, (erik.tagirov@edgemtech.ch) + * + ******************************************************************/ + +#ifndef LV_INDEV_GESTURE_PRIVATE_H +#define LV_INDEV_GESTURE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" + +#if LV_USE_GESTURE_RECOGNITION + +/********************* + * DEFINES + *********************/ + +#define LV_GESTURE_MAX_POINTS 2 + + +/********************** + * TYPEDEFS + **********************/ + +/* Represent the motion of a finger */ +struct lv_indev_gesture_motion { + int8_t finger; /* The ID of the tracked finger */ + lv_point_t start_point; /* The coordinates where the DOWN event occurred */ + lv_point_t point; /* The current coordinates */ + lv_indev_state_t state; /* DEBUG: The state i.e PRESSED or RELEASED */ +}; + +typedef struct lv_indev_gesture_motion lv_indev_gesture_motion_t; + +/* General descriptor for a gesture, used by recognizer state machines to track + * the scale, rotation, and translation NOTE: (this will likely become private) */ +struct lv_indev_gesture { + + /* Motion descriptor, stores the coordinates and velocity of a contact point */ + lv_indev_gesture_motion_t motions[LV_GESTURE_MAX_POINTS]; + + lv_point_t center; /* Center point */ + float scale; /* Scale factor & previous scale factor */ + float p_scale; + float scale_factors_x[LV_GESTURE_MAX_POINTS]; /* Scale factor relative to center for each point */ + float scale_factors_y[LV_GESTURE_MAX_POINTS]; + + float delta_x; /* Translation & previous translation */ + float delta_y; + float p_delta_x; + float p_delta_y; + float rotation; /* Rotation & previous rotation*/ + float p_rotation; + uint8_t finger_cnt; /* Current number of contact points */ + +}; + +/* Recognizer configuration. It stores the thresholds needed to detect the gestures and + * consider them as recognized. Once recognized, indev start sending LV_GESTURE event + */ +struct lv_indev_gesture_configuration { + + float pinch_up_threshold; /* Threshold for the pinch up gesture to be recognized - in pixels */ + float pinch_down_threshold; /* Threshold for the pinch down gesture to be recognized - in pixels */ + float rotation_angle_rad_threshold; /* Threshold for the rotation gesture to be recognized - in radians */ + +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* END LV_USE_RECOGNITION */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_INDEV_GESTURE_PRIVATE_H */ diff --git a/inc/lvgl/src/indev/lv_indev_private.h b/inc/lvgl/src/indev/lv_indev_private.h new file mode 100644 index 0000000..5ce0418 --- /dev/null +++ b/inc/lvgl/src/indev/lv_indev_private.h @@ -0,0 +1,161 @@ +/** + * @file lv_indev_private.h + * + */ + +#ifndef LV_INDEV_PRIVATE_H +#define LV_INDEV_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_ext_data.h" +#include "lv_indev.h" +#include "../misc/lv_anim.h" +#include "lv_indev_scroll.h" +#include "lv_indev_gesture.h" + +/********************* + * DEFINES + *********************/ +#define LV_INDEV_VECT_HIST_SIZE 8 + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_indev_t { +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif + /** Input device type*/ + lv_indev_type_t type; + + /** Function pointer to read input device data.*/ + lv_indev_read_cb_t read_cb; + + lv_indev_state_t state; /**< Current state of the input device.*/ + lv_indev_state_t prev_state; /**< Previous state of the input device.*/ + lv_indev_mode_t mode; + + /*Flags*/ + uint8_t long_pr_sent : 1; + uint8_t reset_query : 1; + uint8_t enabled : 1; + uint8_t wait_until_release : 1; + uint8_t stop_processing_query : 1; + + uint32_t timestamp; /**< Timestamp of last event */ + uint32_t pr_timestamp; /**< Pressed time stamp*/ + uint32_t longpr_rep_timestamp; /**< Long press repeat time stamp*/ + + void * driver_data; + void * user_data; + + /**< Pointer to the assigned display*/ + lv_display_t * disp; + + /**< Timer to periodically read the input device*/ + lv_timer_t * read_timer; + + /**< Number of pixels to slide before actually drag the object*/ + uint8_t scroll_limit; + + /**< Drag throw slow-down in [%]. Greater value means faster slow-down*/ + uint8_t scroll_throw; + + /**< Minimum velocity: difference between consecutive points must exceed this (in pixels) to detect gesture speed */ + uint8_t gesture_min_velocity; + + /**< Minimum distance: total travel from first to current point must exceed this (in pixels) to trigger gesture */ + uint8_t gesture_min_distance; + + /**< Long press time in milliseconds*/ + uint16_t long_press_time; + + /**< Repeated trigger period in long press [ms]*/ + uint16_t long_press_repeat_time; + + /**< Rotary diff count will be multiplied by this value and divided by 256*/ + int32_t rotary_sensitivity; + + struct { + /*Pointer and button data*/ + lv_point_t act_point; /**< Current point of input device.*/ + lv_point_t last_point; /**< Last point of input device.*/ + lv_point_t last_raw_point; /**< Last point read from read_cb. */ + lv_point_t vect; /**< Difference between `act_point` and `last_point`.*/ + lv_point_t vect_hist[LV_INDEV_VECT_HIST_SIZE]; + uint32_t vect_hist_timestamp[LV_INDEV_VECT_HIST_SIZE]; + uint8_t vect_hist_index; + lv_point_t scroll_sum; /*Count the dragged pixels to check LV_INDEV_DEF_SCROLL_LIMIT*/ + lv_point_t scroll_throw_vect; + lv_point_t scroll_throw_vect_ori; + lv_obj_t * act_obj; /*The object being pressed*/ + lv_obj_t * scroll_obj; /*The object being scrolled*/ + lv_obj_t * last_pressed; /*The lastly pressed object*/ + lv_obj_t * last_hovered; /*The lastly hovered object*/ + lv_area_t scroll_area; + lv_point_t gesture_sum; /*Count the gesture pixels to check LV_INDEV_DEF_GESTURE_LIMIT*/ + int32_t diff; + /*Short click streaks*/ + uint8_t short_click_streak; + lv_point_t last_short_click_point; + uint32_t last_short_click_timestamp; + /*Flags*/ + uint8_t scroll_dir : 4; + uint8_t gesture_dir : 4; + uint8_t gesture_sent : 1; + uint8_t press_moved : 1; + uint8_t pressed : 1; + } pointer; + struct { + /*Keypad data*/ + lv_indev_state_t last_state; + uint32_t last_key; + } keypad; + + lv_obj_t * cursor; /**< Cursor for LV_INPUT_TYPE_POINTER*/ + lv_group_t * group; /**< Keypad destination group*/ + const lv_point_t * btn_points; /**< Array points assigned to the button ()screen will be pressed + here by the buttons*/ + lv_event_list_t event_list; + lv_anim_t * scroll_throw_anim; + + /**< Key remapping callback */ + lv_indev_key_remap_cb_t key_remap_cb; + +#if LV_USE_GESTURE_RECOGNITION + lv_indev_gesture_recognizer_t recognizers[LV_INDEV_GESTURE_CNT]; + lv_indev_gesture_type_t cur_gesture; + void * gesture_data[LV_INDEV_GESTURE_CNT]; + lv_indev_gesture_type_t gesture_type[LV_INDEV_GESTURE_CNT]; +#endif +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Find a scrollable object based on the current scroll vector in the indev. + * In handles scroll propagation to the parent if needed, and scroll directions too. + * @param indev pointer to an indev + * @return the found scrollable object or NULL if not found. + */ +lv_obj_t * lv_indev_find_scroll_obj(lv_indev_t * indev); + + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INDEV_PRIVATE_H*/ diff --git a/inc/lvgl/src/indev/lv_indev_scroll.c b/inc/lvgl/src/indev/lv_indev_scroll.c new file mode 100644 index 0000000..ae7d275 --- /dev/null +++ b/inc/lvgl/src/indev/lv_indev_scroll.c @@ -0,0 +1,768 @@ +/** + * @file lv_indev_scroll.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj_scroll_private.h" +#include "../core/lv_obj_private.h" +#include "lv_indev.h" +#include "lv_indev_private.h" +#include "lv_indev_scroll.h" + +/********************* + * DEFINES + *********************/ +#define ELASTIC_SLOWNESS_FACTOR 4 /*Scrolling on elastic parts are slower by this factor*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void init_scroll_limits(lv_indev_t * indev); +static int32_t find_snap_point_x(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs); +static int32_t find_snap_point_y(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs); +static void scroll_limit_diff(lv_indev_t * indev, int32_t * diff_x, int32_t * diff_y); +static int32_t elastic_diff(lv_obj_t * scroll_obj, int32_t diff, int32_t scroll_start, int32_t scroll_end, + lv_dir_t dir); +static void has_more_snap_points(lv_obj_t * scroll_obj, lv_dir_t dir, bool * has_start_snap, bool * has_end_snap); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_indev_scroll_handler(lv_indev_t * indev) +{ + if(indev->pointer.vect.x == 0 && indev->pointer.vect.y == 0) { + return; + } + + lv_obj_t * scroll_obj = indev->pointer.scroll_obj; + /*If there is no scroll object yet try to find one*/ + if(scroll_obj == NULL) { + scroll_obj = lv_indev_find_scroll_obj(indev); + if(scroll_obj == NULL) return; + + init_scroll_limits(indev); + + lv_obj_remove_state(indev->pointer.act_obj, LV_STATE_PRESSED); + lv_obj_send_event(scroll_obj, LV_EVENT_SCROLL_BEGIN, NULL); + if(indev->reset_query) return; + } + + /*Set new position or scroll if the vector is not zero*/ + int16_t angle = 0; + int16_t scale_x = 256; + int16_t scale_y = 256; + lv_obj_t * parent = scroll_obj; + while(parent) { + angle += lv_obj_get_style_transform_rotation(parent, LV_PART_MAIN); + int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, LV_PART_MAIN); + int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, LV_PART_MAIN); + scale_x = (scale_x * zoom_act_x) >> 8; + scale_y = (scale_y * zoom_act_y) >> 8; + parent = lv_obj_get_parent(parent); + } + + if(scale_x == 0) { + scale_x = 1; + } + + if(scale_y == 0) { + scale_y = 1; + } + + if(angle != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + angle = -angle; + scale_x = (256 * 256) / scale_x; + scale_y = (256 * 256) / scale_y; + lv_point_t pivot = { 0, 0 }; + lv_point_transform(&indev->pointer.vect, angle, scale_x, scale_y, &pivot, false); + } + + int32_t diff_x = 0; + int32_t diff_y = 0; + if(indev->pointer.scroll_dir == LV_DIR_HOR) { + int32_t sr = lv_obj_get_scroll_right(scroll_obj); + int32_t sl = lv_obj_get_scroll_left(scroll_obj); + diff_x = elastic_diff(scroll_obj, indev->pointer.vect.x, sl, sr, LV_DIR_HOR); + } + else { + int32_t st = lv_obj_get_scroll_top(scroll_obj); + int32_t sb = lv_obj_get_scroll_bottom(scroll_obj); + diff_y = elastic_diff(scroll_obj, indev->pointer.vect.y, st, sb, LV_DIR_VER); + } + + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(scroll_obj); + if((scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0; + if((scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0; + if((scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0; + if((scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0; + + /*Respect the scroll limit area*/ + scroll_limit_diff(indev, &diff_x, &diff_y); + + lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y); + if(indev->reset_query) return; + indev->pointer.scroll_sum.x += diff_x; + indev->pointer.scroll_sum.y += diff_y; +} + +void lv_indev_scroll_throw_handler(lv_indev_t * indev) +{ + lv_obj_t * scroll_obj = indev->pointer.scroll_obj; + if(scroll_obj == NULL) return; + if(indev->pointer.scroll_dir == LV_DIR_NONE) return; + + int32_t scroll_throw = indev->scroll_throw; + + if(lv_obj_has_flag(scroll_obj, LV_OBJ_FLAG_SCROLL_MOMENTUM) == false) { + indev->pointer.scroll_throw_vect.y = 0; + indev->pointer.scroll_throw_vect.x = 0; + } + + lv_scroll_snap_t align_x = lv_obj_get_scroll_snap_x(scroll_obj); + lv_scroll_snap_t align_y = lv_obj_get_scroll_snap_y(scroll_obj); + + if(indev->pointer.scroll_dir == LV_DIR_VER) { + indev->pointer.scroll_throw_vect.x = 0; + /*If no snapping "throw"*/ + if(align_y == LV_SCROLL_SNAP_NONE) { + indev->pointer.scroll_throw_vect.y = + indev->pointer.scroll_throw_vect.y * (100 - scroll_throw) / 100; + + int32_t sb = lv_obj_get_scroll_bottom(scroll_obj); + int32_t st = lv_obj_get_scroll_top(scroll_obj); + + indev->pointer.scroll_throw_vect.y = elastic_diff(scroll_obj, indev->pointer.scroll_throw_vect.y, st, sb, + LV_DIR_VER); + + lv_obj_scroll_by_raw(scroll_obj, 0, indev->pointer.scroll_throw_vect.y); + if(indev->reset_query) return; + } + /*With snapping find the nearest snap point and scroll there*/ + else { + int32_t diff_y = lv_indev_scroll_throw_predict(indev, LV_DIR_VER); + indev->pointer.scroll_throw_vect.y = 0; + scroll_limit_diff(indev, NULL, &diff_y); + int32_t y = find_snap_point_y(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_y); + lv_obj_scroll_by(scroll_obj, 0, diff_y + y, LV_ANIM_ON); + if(indev->reset_query) return; + } + } + else if(indev->pointer.scroll_dir == LV_DIR_HOR) { + indev->pointer.scroll_throw_vect.y = 0; + /*If no snapping "throw"*/ + if(align_x == LV_SCROLL_SNAP_NONE) { + indev->pointer.scroll_throw_vect.x = + indev->pointer.scroll_throw_vect.x * (100 - scroll_throw) / 100; + + int32_t sl = lv_obj_get_scroll_left(scroll_obj); + int32_t sr = lv_obj_get_scroll_right(scroll_obj); + + indev->pointer.scroll_throw_vect.x = elastic_diff(scroll_obj, indev->pointer.scroll_throw_vect.x, sl, sr, + LV_DIR_HOR); + + lv_obj_scroll_by_raw(scroll_obj, indev->pointer.scroll_throw_vect.x, 0); + if(indev->reset_query) return; + } + /*With snapping find the nearest snap point and scroll there*/ + else { + int32_t diff_x = lv_indev_scroll_throw_predict(indev, LV_DIR_HOR); + indev->pointer.scroll_throw_vect.x = 0; + scroll_limit_diff(indev, &diff_x, NULL); + int32_t x = find_snap_point_x(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_x); + lv_obj_scroll_by(scroll_obj, x + diff_x, 0, LV_ANIM_ON); + if(indev->reset_query) return; + } + } + + /*Check if the scroll has finished*/ + if(indev->pointer.scroll_throw_vect.x == 0 && indev->pointer.scroll_throw_vect.y == 0) { + /*Revert if scrolled in*/ + /*If vertically scrollable and not controlled by snap*/ + if(align_y == LV_SCROLL_SNAP_NONE) { + int32_t st = lv_obj_get_scroll_top(scroll_obj); + int32_t sb = lv_obj_get_scroll_bottom(scroll_obj); + if(st > 0 || sb > 0) { + if(st < 0) { + lv_obj_scroll_by(scroll_obj, 0, st, LV_ANIM_ON); + if(indev->reset_query) return; + } + else if(sb < 0) { + lv_obj_scroll_by(scroll_obj, 0, -sb, LV_ANIM_ON); + if(indev->reset_query) return; + } + } + } + + /*If horizontally scrollable and not controlled by snap*/ + if(align_x == LV_SCROLL_SNAP_NONE) { + int32_t sl = lv_obj_get_scroll_left(scroll_obj); + int32_t sr = lv_obj_get_scroll_right(scroll_obj); + if(sl > 0 || sr > 0) { + if(sl < 0) { + lv_obj_scroll_by(scroll_obj, sl, 0, LV_ANIM_ON); + if(indev->reset_query) return; + } + else if(sr < 0) { + lv_obj_scroll_by(scroll_obj, -sr, 0, LV_ANIM_ON); + if(indev->reset_query) return; + } + } + } + + lv_obj_send_event(scroll_obj, LV_EVENT_SCROLL_END, indev); + if(indev->reset_query) return; + + indev->pointer.scroll_dir = LV_DIR_NONE; + indev->pointer.scroll_obj = NULL; + } +} + +int32_t lv_indev_scroll_throw_predict(lv_indev_t * indev, lv_dir_t dir) +{ + if(indev == NULL) return 0; + int32_t v; + switch(dir) { + case LV_DIR_VER: + v = indev->pointer.scroll_throw_vect_ori.y; + break; + case LV_DIR_HOR: + v = indev->pointer.scroll_throw_vect_ori.x; + break; + default: + return 0; + } + + int32_t scroll_throw = indev->scroll_throw; + int32_t sum = 0; + while(v) { + sum += v; + v = v * (100 - scroll_throw) / 100; + } + + return sum; +} + +void lv_indev_scroll_get_snap_dist(lv_obj_t * obj, lv_point_t * p) +{ + p->x = find_snap_point_x(obj, obj->coords.x1, obj->coords.x2, 0); + p->y = find_snap_point_y(obj, obj->coords.y1, obj->coords.y2, 0); +} + +lv_obj_t * lv_indev_find_scroll_obj(lv_indev_t * indev) +{ + lv_obj_t * obj_candidate = NULL; + lv_dir_t dir_candidate = LV_DIR_NONE; + int32_t scroll_limit = indev->scroll_limit; + + /*Go until find a scrollable object in the current direction + *More precisely: + * 1. Check the pressed object and all of its ancestors and try to find an object which is scrollable + * 2. Scrollable means it has some content out of its area + * 3. If an object can be scrolled into the current direction then use it ("real match"") + * 4. If can be scrolled on the current axis (hor/ver) save it as candidate (at least show an elastic scroll effect) + * 5. Use the last candidate. Always the "deepest" parent or the object from point 3*/ + lv_obj_t * obj_act = indev->pointer.act_obj; + + /*Decide if it's a horizontal or vertical scroll*/ + bool hor_en = false; + bool ver_en = false; + indev->pointer.scroll_sum.x += indev->pointer.vect.x; + indev->pointer.scroll_sum.y += indev->pointer.vect.y; + + while(obj_act) { + /*Get the transformed scroll_sum with this object*/ + int16_t angle = 0; + int32_t scale_x = 256; + int32_t scale_y = 256; + lv_point_t pivot = { 0, 0 }; + lv_obj_t * parent = obj_act; + while(parent) { + angle += lv_obj_get_style_transform_rotation(parent, LV_PART_MAIN); + int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, LV_PART_MAIN); + int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, LV_PART_MAIN); + scale_x = (scale_x * zoom_act_x) >> 8; + scale_y = (scale_y * zoom_act_y) >> 8; + parent = lv_obj_get_parent(parent); + } + + if(scale_x == 0) { + scale_x = 1; + } + + if(scale_y == 0) { + scale_y = 1; + } + + lv_point_t obj_scroll_sum = indev->pointer.scroll_sum; + if(angle != 0 || scale_x != LV_SCALE_NONE || scale_y != LV_SCALE_NONE) { + angle = -angle; + scale_x = (256 * 256) / scale_x; + scale_y = (256 * 256) / scale_y; + lv_point_transform(&obj_scroll_sum, angle, scale_x, scale_y, &pivot, false); + } + + if(LV_ABS(obj_scroll_sum.x) > LV_ABS(obj_scroll_sum.y)) { + hor_en = true; + } + else { + ver_en = true; + } + + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLLABLE) == false) { + /*If this object don't want to chain the scroll to the parent stop searching*/ + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_VER) == false && ver_en) break; + + obj_act = lv_obj_get_parent(obj_act); + continue; + } + + /*Consider both up-down or left/right scrollable according to the current direction*/ + bool up_en = ver_en; + bool down_en = ver_en; + bool left_en = hor_en; + bool right_en = hor_en; + + /*The object might have disabled some directions.*/ + lv_dir_t scroll_dir = lv_obj_get_scroll_dir(obj_act); + if((scroll_dir & LV_DIR_LEFT) == 0) left_en = false; + if((scroll_dir & LV_DIR_RIGHT) == 0) right_en = false; + if((scroll_dir & LV_DIR_TOP) == 0) up_en = false; + if((scroll_dir & LV_DIR_BOTTOM) == 0) down_en = false; + + /*Horizontal scroll*/ + int32_t sl = 0; + int32_t sr = 0; + lv_scroll_snap_t snap_x = lv_obj_get_scroll_snap_x(obj_act); + if(snap_x == LV_SCROLL_SNAP_NONE) { + sl = lv_obj_get_scroll_left(obj_act); + sr = lv_obj_get_scroll_right(obj_act); + } + else { + bool has_start_snap; + bool has_end_snap; + has_more_snap_points(obj_act, LV_DIR_HOR, &has_start_snap, &has_end_snap); + + /*Assume scrolling is there are more snap point + *Assumed scroll in if there are NO more nap points*/ + sl = has_start_snap ? 1 : -1; + sr = has_end_snap ? 1 : -1; + } + + /*Vertical scroll*/ + int32_t st = 0; + int32_t sb = 0; + lv_scroll_snap_t snap_y = lv_obj_get_scroll_snap_y(obj_act); + if(snap_y == LV_SCROLL_SNAP_NONE) { + st = lv_obj_get_scroll_top(obj_act); + sb = lv_obj_get_scroll_bottom(obj_act); + } + else { + bool has_start_snap; + bool has_end_snap; + has_more_snap_points(obj_act, LV_DIR_VER, &has_start_snap, &has_end_snap); + + /*Assume scrolling is there are more snap point + *Assumed scroll in if there are NO more nap points*/ + st = has_start_snap ? 1 : -1; + sb = has_end_snap ? 1 : -1; + } + + /*If this object is scrollable into the current scroll direction then save it as a candidate. + *It's important only to be scrollable on the current axis (hor/ver) because if the scroll + *is propagated to this object it can show at least elastic scroll effect. + *But if not hor/ver scrollable do not scroll it at all (so it's not a good candidate)*/ + if((st > 0 || sb > 0) && + ((up_en && obj_scroll_sum.y >= scroll_limit) || + (down_en && obj_scroll_sum.y <= - scroll_limit))) { + obj_candidate = obj_act; + dir_candidate = LV_DIR_VER; + } + + if((sl > 0 || sr > 0) && + ((left_en && obj_scroll_sum.x >= scroll_limit) || + (right_en && obj_scroll_sum.x <= - scroll_limit))) { + obj_candidate = obj_act; + dir_candidate = LV_DIR_HOR; + } + + if(st <= 0) up_en = false; + if(sb <= 0) down_en = false; + if(sl <= 0) left_en = false; + if(sr <= 0) right_en = false; + + /*If the object really can be scrolled into the current direction then use it.*/ + if((left_en && obj_scroll_sum.x >= scroll_limit) || + (right_en && obj_scroll_sum.x <= - scroll_limit) || + (up_en && obj_scroll_sum.y >= scroll_limit) || + (down_en && obj_scroll_sum.y <= - scroll_limit)) { + indev->pointer.scroll_dir = hor_en ? LV_DIR_HOR : LV_DIR_VER; + break; + } + + /*If this object don't want to chain the scroll to the parent stop searching*/ + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_HOR) == false && hor_en) break; + if(lv_obj_has_flag(obj_act, LV_OBJ_FLAG_SCROLL_CHAIN_VER) == false && ver_en) break; + + /*Try the parent*/ + obj_act = lv_obj_get_parent(obj_act); + } + + /*Use the last candidate*/ + if(obj_candidate) { + indev->pointer.scroll_dir = dir_candidate; + indev->pointer.scroll_obj = obj_candidate; + indev->pointer.scroll_sum.x = 0; + indev->pointer.scroll_sum.y = 0; + } + + return obj_candidate; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void init_scroll_limits(lv_indev_t * indev) +{ + lv_obj_t * obj = indev->pointer.scroll_obj; + /*If there no STOP allow scrolling anywhere*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_SCROLL_ONE) == false) { + lv_area_set(&indev->pointer.scroll_area, LV_COORD_MIN, LV_COORD_MIN, LV_COORD_MAX, LV_COORD_MAX); + } + /*With STOP limit the scrolling to the perv and next snap point*/ + else { + switch(lv_obj_get_scroll_snap_y(obj)) { + case LV_SCROLL_SNAP_START: + indev->pointer.scroll_area.y1 = find_snap_point_y(obj, obj->coords.y1 + 1, LV_COORD_MAX, 0); + indev->pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, obj->coords.y1 - 1, 0); + break; + case LV_SCROLL_SNAP_END: + indev->pointer.scroll_area.y1 = find_snap_point_y(obj, obj->coords.y2, LV_COORD_MAX, 0); + indev->pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, obj->coords.y2, 0); + break; + case LV_SCROLL_SNAP_CENTER: { + int32_t y_mid = obj->coords.y1 + lv_area_get_height(&obj->coords) / 2; + indev->pointer.scroll_area.y1 = find_snap_point_y(obj, y_mid + 1, LV_COORD_MAX, 0); + indev->pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, y_mid - 1, 0); + break; + } + default: + indev->pointer.scroll_area.y1 = LV_COORD_MIN; + indev->pointer.scroll_area.y2 = LV_COORD_MAX; + break; + } + + switch(lv_obj_get_scroll_snap_x(obj)) { + case LV_SCROLL_SNAP_START: + indev->pointer.scroll_area.x1 = find_snap_point_x(obj, obj->coords.x1, LV_COORD_MAX, 0); + indev->pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, obj->coords.x1, 0); + break; + case LV_SCROLL_SNAP_END: + indev->pointer.scroll_area.x1 = find_snap_point_x(obj, obj->coords.x2, LV_COORD_MAX, 0); + indev->pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, obj->coords.x2, 0); + break; + case LV_SCROLL_SNAP_CENTER: { + int32_t x_mid = obj->coords.x1 + lv_area_get_width(&obj->coords) / 2; + indev->pointer.scroll_area.x1 = find_snap_point_x(obj, x_mid + 1, LV_COORD_MAX, 0); + indev->pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, x_mid - 1, 0); + break; + } + default: + indev->pointer.scroll_area.x1 = LV_COORD_MIN; + indev->pointer.scroll_area.x2 = LV_COORD_MAX; + break; + } + } + + /*`find_snap_point_x/y()` return LV_COORD_MAX is not snap point was found, + *but x1/y1 should be small. */ + if(indev->pointer.scroll_area.x1 == LV_COORD_MAX) indev->pointer.scroll_area.x1 = LV_COORD_MIN; + if(indev->pointer.scroll_area.y1 == LV_COORD_MAX) indev->pointer.scroll_area.y1 = LV_COORD_MIN; + + /*Allow scrolling on the edges. It will be reverted to the edge due to snapping anyway*/ + if(indev->pointer.scroll_area.x1 == 0) indev->pointer.scroll_area.x1 = LV_COORD_MIN; + if(indev->pointer.scroll_area.x2 == 0) indev->pointer.scroll_area.x2 = LV_COORD_MAX; + if(indev->pointer.scroll_area.y1 == 0) indev->pointer.scroll_area.y1 = LV_COORD_MIN; + if(indev->pointer.scroll_area.y2 == 0) indev->pointer.scroll_area.y2 = LV_COORD_MAX; +} + +/** + * Search for snap point in the min..max range. + * @param obj the object on which snap point should be found + * @param min ignore snap points smaller than this. (Absolute coordinate) + * @param max ignore snap points greater than this. (Absolute coordinate) + * @param ofs offset to snap points. Useful the get a snap point in an imagined case + * what if children are already moved by this value + * @return the absolute x coordinate of the nearest snap point + * or `LV_COORD_MAX` if there is no snap point in the min..max range + */ +static int32_t find_snap_point_x(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs) +{ + lv_scroll_snap_t align = lv_obj_get_scroll_snap_x(obj); + if(align == LV_SCROLL_SNAP_NONE) return LV_COORD_MAX; + + int32_t dist = LV_COORD_MAX; + + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPPABLE)) { + int32_t x_child = 0; + int32_t x_parent = 0; + switch(align) { + case LV_SCROLL_SNAP_START: + x_child = child->coords.x1; + x_parent = obj->coords.x1 + pad_left; + break; + case LV_SCROLL_SNAP_END: + x_child = child->coords.x2; + x_parent = obj->coords.x2 - pad_right; + break; + case LV_SCROLL_SNAP_CENTER: + x_child = child->coords.x1 + lv_area_get_width(&child->coords) / 2; + x_parent = obj->coords.x1 + pad_left + (lv_area_get_width(&obj->coords) - pad_left - pad_right) / 2; + break; + default: + continue; + } + + x_child += ofs; + if(x_child >= min && x_child <= max) { + int32_t x = x_child - x_parent; + if(LV_ABS(x) < LV_ABS(dist)) dist = x; + } + } + } + + return dist == LV_COORD_MAX ? LV_COORD_MAX : -dist; +} + +/** + * Search for snap point in the min..max range. + * @param obj the object on which snap point should be found + * @param min ignore snap points smaller than this. (Absolute coordinate) + * @param max ignore snap points greater than this. (Absolute coordinate) + * @param ofs offset to snap points. Useful to get a snap point in an imagined case + * what if children are already moved by this value + * @return the absolute y coordinate of the nearest snap point + * or `LV_COORD_MAX` if there is no snap point in the min..max range + */ +static int32_t find_snap_point_y(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs) +{ + lv_scroll_snap_t align = lv_obj_get_scroll_snap_y(obj); + if(align == LV_SCROLL_SNAP_NONE) return LV_COORD_MAX; + + int32_t dist = LV_COORD_MAX; + + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = obj->spec_attr->children[i]; + if(lv_obj_has_flag_any(child, LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPPABLE)) { + int32_t y_child = 0; + int32_t y_parent = 0; + switch(align) { + case LV_SCROLL_SNAP_START: + y_child = child->coords.y1; + y_parent = obj->coords.y1 + pad_top; + break; + case LV_SCROLL_SNAP_END: + y_child = child->coords.y2; + y_parent = obj->coords.y2 - pad_bottom; + break; + case LV_SCROLL_SNAP_CENTER: + y_child = child->coords.y1 + lv_area_get_height(&child->coords) / 2; + y_parent = obj->coords.y1 + pad_top + (lv_area_get_height(&obj->coords) - pad_top - pad_bottom) / 2; + break; + default: + continue; + } + + y_child += ofs; + if(y_child >= min && y_child <= max) { + int32_t y = y_child - y_parent; + if(LV_ABS(y) < LV_ABS(dist)) dist = y; + } + } + } + + return dist == LV_COORD_MAX ? LV_COORD_MAX : -dist; +} + +static void scroll_limit_diff(lv_indev_t * indev, int32_t * diff_x, int32_t * diff_y) +{ + if(diff_y) { + if(indev->pointer.scroll_sum.y + *diff_y < indev->pointer.scroll_area.y1) { + *diff_y = indev->pointer.scroll_area.y1 - indev->pointer.scroll_sum.y; + } + + if(indev->pointer.scroll_sum.y + *diff_y > indev->pointer.scroll_area.y2) { + *diff_y = indev->pointer.scroll_area.y2 - indev->pointer.scroll_sum.y; + } + } + + if(diff_x) { + if(indev->pointer.scroll_sum.x + *diff_x < indev->pointer.scroll_area.x1) { + *diff_x = indev->pointer.scroll_area.x1 - indev->pointer.scroll_sum.x; + } + + if(indev->pointer.scroll_sum.x + *diff_x > indev->pointer.scroll_area.x2) { + *diff_x = indev->pointer.scroll_area.x2 - indev->pointer.scroll_sum.x; + } + } +} + +static int32_t elastic_diff(lv_obj_t * scroll_obj, int32_t diff, int32_t scroll_start, int32_t scroll_end, + lv_dir_t dir) +{ + if(diff == 0) return 0; + + /*Scroll back to the edge if required*/ + if(!lv_obj_has_flag(scroll_obj, LV_OBJ_FLAG_SCROLL_ELASTIC)) { + /* + * If the scrolling object does not set the `LV_OBJ_FLAG_SCROLL_ELASTIC` flag, + * make sure that `diff` will not cause the scroll to exceed the `start` or `end` boundary of the content. + * If the content has exceeded the boundary due to external factors like `LV_SCROLL_SNAP_CENTER`, + * then respect the current position instead of going straight back to 0. + */ + const int32_t scroll_ended = diff > 0 ? scroll_start : scroll_end; + if(scroll_ended <= 0) diff = 0; + else if(scroll_ended - diff < 0) diff = scroll_ended; + } + /*Handle elastic scrolling*/ + else { + + lv_scroll_snap_t snap; + snap = dir == LV_DIR_HOR ? lv_obj_get_scroll_snap_x(scroll_obj) : lv_obj_get_scroll_snap_y(scroll_obj); + + /*Without snapping just scale down the diff when scrolled out*/ + if(snap == LV_SCROLL_SNAP_NONE) { + if(scroll_end < 0 || scroll_start < 0) { + /*Rounding*/ + if(diff < 0) diff -= ELASTIC_SLOWNESS_FACTOR / 2; + if(diff > 0) diff += ELASTIC_SLOWNESS_FACTOR / 2; + return diff / ELASTIC_SLOWNESS_FACTOR; + } + else { + return diff; + } + } + + /*With snapping the widget is scrolled out if there are no more snap points + *at least in one direction (start or end)*/ + bool has_start_snap; + bool has_end_snap; + has_more_snap_points(scroll_obj, dir, &has_start_snap, &has_end_snap); + + if(!has_start_snap || !has_end_snap) { + /*Rounding*/ + if(diff < 0) diff -= ELASTIC_SLOWNESS_FACTOR / 2; + if(diff > 0) diff += ELASTIC_SLOWNESS_FACTOR / 2; + return diff / ELASTIC_SLOWNESS_FACTOR; + } + else { + return diff; + } + } + + return diff; +} + +/** + * Tell is there are more snap point in a given direction considering snap position. + * There is a snap point if there is a snapanble object in the given direction + * @param scroll_obj the object on which snap points should be found + * @param dir LV_DIR_HOR or LV_DIR_VER + * @param has_start_snap true: there is snap point in the start direction (top or left depending on dir) + * @param has_end_snap true: there is snap point in the end direction (bottom or right depending on dir) + * @note snap points will be searched relative to the + * center point in case of LV_SCROLL_SNAP_CENTER + * start point (top or left) in case of LV_SCROLL_SNAP_START + * end point (bottom or right) in case of LV_SCROLL_SNAP_END + */ +static void has_more_snap_points(lv_obj_t * scroll_obj, lv_dir_t dir, bool * has_start_snap, bool * has_end_snap) +{ + *has_start_snap = true; + *has_end_snap = true; + lv_scroll_snap_t snap; + snap = dir == LV_DIR_HOR ? lv_obj_get_scroll_snap_x(scroll_obj) : lv_obj_get_scroll_snap_y(scroll_obj); + + if(dir == LV_DIR_HOR) { + int32_t x = 0; + switch(snap) { + case LV_SCROLL_SNAP_CENTER: { + int32_t pad_left = lv_obj_get_style_pad_left(scroll_obj, LV_PART_MAIN); + int32_t pad_right = lv_obj_get_style_pad_right(scroll_obj, LV_PART_MAIN); + x = scroll_obj->coords.x1; + x += (lv_area_get_width(&scroll_obj->coords) - pad_left - pad_right) / 2; + x += pad_left; + } + break; + case LV_SCROLL_SNAP_START: + x = scroll_obj->coords.x1 + lv_obj_get_style_pad_left(scroll_obj, LV_PART_MAIN); + break; + case LV_SCROLL_SNAP_END: + x = scroll_obj->coords.x2 - lv_obj_get_style_pad_right(scroll_obj, LV_PART_MAIN); + break; + default: + break; + } + int32_t d; + d = find_snap_point_x(scroll_obj, x + 1, LV_COORD_MAX, 0); + if(d == LV_COORD_MAX) *has_end_snap = false; + d = find_snap_point_x(scroll_obj, LV_COORD_MIN, x - 1, 0); + if(d == LV_COORD_MAX) *has_start_snap = false; + } + else { + int32_t y = 0; + switch(snap) { + case LV_SCROLL_SNAP_CENTER: { + int32_t pad_top = lv_obj_get_style_pad_top(scroll_obj, LV_PART_MAIN); + int32_t pad_bottom = lv_obj_get_style_pad_bottom(scroll_obj, LV_PART_MAIN); + y = scroll_obj->coords.y1; + y += (lv_area_get_height(&scroll_obj->coords) - pad_top - pad_bottom) / 2; + y += pad_top; + } + break; + case LV_SCROLL_SNAP_START: + y = scroll_obj->coords.y1 + lv_obj_get_style_pad_top(scroll_obj, LV_PART_MAIN); + break; + case LV_SCROLL_SNAP_END: + y = scroll_obj->coords.y2 - lv_obj_get_style_pad_bottom(scroll_obj, LV_PART_MAIN); + break; + default: + break; + } + int32_t d; + d = find_snap_point_y(scroll_obj, y + 1, LV_COORD_MAX, 0); + if(d == LV_COORD_MAX) *has_end_snap = false; + d = find_snap_point_y(scroll_obj, LV_COORD_MIN, y - 1, 0); + if(d == LV_COORD_MAX) *has_start_snap = false; + } +} diff --git a/inc/lvgl/src/indev/lv_indev_scroll.h b/inc/lvgl/src/indev/lv_indev_scroll.h new file mode 100644 index 0000000..413376f --- /dev/null +++ b/inc/lvgl/src/indev/lv_indev_scroll.h @@ -0,0 +1,65 @@ +/** + * @file lv_indev_scroll.h + * + */ + +#ifndef LV_INDEV_SCROLL_H +#define LV_INDEV_SCROLL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Handle scrolling. Called by LVGL during input device processing + * @param indev pointer to an input device + */ +void lv_indev_scroll_handler(lv_indev_t * indev); + +/** + * Handle throwing after scrolling. Called by LVGL during input device processing + * @param indev pointer to an input device + */ +void lv_indev_scroll_throw_handler(lv_indev_t * indev); + +/** + * Predict where would a scroll throw end + * @param indev pointer to an input device + * @param dir ` LV_DIR_VER` or `LV_DIR_HOR` + * @return the difference compared to the current position when the throw would be finished + */ +int32_t lv_indev_scroll_throw_predict(lv_indev_t * indev, lv_dir_t dir); + +/** + * Get the distance of the nearest snap point + * @param obj the object on which snap points should be found + * @param p save the distance of the found snap point there + */ +void lv_indev_scroll_get_snap_dist(lv_obj_t * obj, lv_point_t * p); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INDEV_SCROLL_H*/ diff --git a/inc/lvgl/src/layouts/flex/lv_flex.c b/inc/lvgl/src/layouts/flex/lv_flex.c new file mode 100644 index 0000000..00ca47a --- /dev/null +++ b/inc/lvgl/src/layouts/flex/lv_flex.c @@ -0,0 +1,650 @@ +/** + * @file lv_flex.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_flex.h" +#include "../lv_layout.h" +#include "../../core/lv_obj_private.h" + +#if LV_USE_FLEX + +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ +#define layout_list_def LV_GLOBAL_DEFAULT()->layout_list + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_flex_align_t main_place; + lv_flex_align_t cross_place; + lv_flex_align_t track_place; + uint8_t row : 1; + uint8_t wrap : 1; + uint8_t rev : 1; +} flex_t; + +typedef struct { + lv_obj_t * item; + int32_t min_size; + int32_t max_size; + int32_t final_size; + uint32_t grow_value; + uint32_t clamped : 1; +} grow_dsc_t; + +typedef struct { + int32_t track_cross_size; + int32_t track_main_size; /*For all items*/ + int32_t track_fix_main_size; /*For non grow items*/ + int32_t track_grow_min_size; + uint32_t item_cnt; + grow_dsc_t * grow_dsc; + uint32_t grow_item_cnt; + uint32_t grow_dsc_calc : 1; +} track_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool calc_min_size(lv_obj_t * cont, int32_t * req_size, bool width, void * user_data); +static void flex_update(lv_obj_t * cont, void * user_data); +static int32_t find_track_end(lv_obj_t * cont, flex_t * f, int32_t item_start_id, int32_t max_main_size, + int32_t item_gap, track_t * t); +static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, int32_t item_last_id, int32_t abs_x, + int32_t abs_y, int32_t max_main_size, int32_t item_gap, track_t * t); +static void place_content(lv_flex_align_t place, int32_t max_size, int32_t content_size, int32_t item_cnt, + int32_t * start_pos, int32_t * gap); +static lv_obj_t * get_next_item(lv_obj_t * cont, bool rev, int32_t * item_id); +static int32_t lv_obj_get_width_with_margin(const lv_obj_t * obj); +static int32_t lv_obj_get_height_with_margin(const lv_obj_t * obj); + +static inline int32_t div_round_closest(int32_t dividend, int32_t divisor) +{ + return (dividend + divisor / 2) / divisor; +} + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_LAYOUT + #define LV_TRACE_LAYOUT(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_LAYOUT(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/*===================== + * Setter functions + *====================*/ + +void lv_flex_init(void) +{ + layout_list_def[LV_LAYOUT_FLEX].callbacks.layout_update_cb = flex_update; + layout_list_def[LV_LAYOUT_FLEX].callbacks.get_min_size_cb = calc_min_size; + layout_list_def[LV_LAYOUT_FLEX].user_data = NULL; +} + +void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow) +{ + lv_obj_set_style_flex_flow(obj, flow, 0); + lv_obj_set_style_layout(obj, LV_LAYOUT_FLEX, 0); +} + +void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place, + lv_flex_align_t track_place) +{ + lv_obj_set_style_flex_main_place(obj, main_place, 0); + lv_obj_set_style_flex_cross_place(obj, cross_place, 0); + lv_obj_set_style_flex_track_place(obj, track_place, 0); + lv_obj_set_style_layout(obj, LV_LAYOUT_FLEX, 0); +} + +void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow) +{ + lv_obj_set_style_flex_grow(obj, grow, 0); + lv_obj_t * parent = lv_obj_get_parent(obj); + if(parent) lv_obj_mark_layout_as_dirty(parent); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void get_flex_info(lv_obj_t * cont, flex_t * f) +{ + lv_flex_flow_t flow = lv_obj_get_style_flex_flow(cont, LV_PART_MAIN); + f->row = flow & LV_FLEX_COLUMN ? 0 : 1; + f->wrap = flow & LV_FLEX_WRAP ? 1 : 0; + f->rev = flow & LV_FLEX_REVERSE ? 1 : 0; + f->main_place = lv_obj_get_style_flex_main_place(cont, LV_PART_MAIN); + f->cross_place = lv_obj_get_style_flex_cross_place(cont, LV_PART_MAIN); + f->track_place = lv_obj_get_style_flex_track_place(cont, LV_PART_MAIN); +} + +static bool calc_min_size(lv_obj_t * cont, int32_t * req_size, bool width, void * user_data) +{ + LV_UNUSED(user_data); + + if(cont->spec_attr == NULL) + return false; + + flex_t f; + get_flex_info(cont, &f); + + if(f.row != width) { + return false; + } + + /* Can't wrap if size is LV_SIZE_CONTENT */ + f.wrap = false; + + *req_size = 0; + + int32_t item_gap = + f.row ? lv_obj_get_style_pad_column(cont, LV_PART_MAIN) : lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + + int32_t cont_space_start = + (f.row ? lv_obj_get_style_space_left(cont, LV_PART_MAIN) : lv_obj_get_style_space_top(cont, LV_PART_MAIN)); + int32_t cont_space_end = + (f.row ? lv_obj_get_style_space_right(cont, LV_PART_MAIN) : lv_obj_get_style_space_bottom(cont, LV_PART_MAIN)); + + int32_t track_first_item = f.rev ? cont->spec_attr->child_cnt - 1 : 0; + int32_t next_track_first_item; + + while(track_first_item < (int32_t)cont->spec_attr->child_cnt && track_first_item >= 0) { + /*Search the first item of the next row*/ + track_t t; + t.grow_dsc_calc = 0; + next_track_first_item = find_track_end(cont, &f, track_first_item, 0, item_gap, &t); + + int32_t req_track_size = t.track_fix_main_size + t.track_grow_min_size; + + track_first_item = next_track_first_item; + + *req_size = LV_MAX(*req_size, req_track_size); + } + + *req_size += (cont_space_start + cont_space_end); + + // (*req_size)++; + return true; +} + +static void flex_update(lv_obj_t * cont, void * user_data) +{ + LV_LOG_INFO("update %p container", (void *)cont); + LV_UNUSED(user_data); + + flex_t f; + get_flex_info(cont, &f); + + bool rtl = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL; + int32_t track_gap = + !f.row ? lv_obj_get_style_pad_column(cont, LV_PART_MAIN) : lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + int32_t item_gap = + f.row ? lv_obj_get_style_pad_column(cont, LV_PART_MAIN) : lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + int32_t max_main_size = (f.row ? lv_obj_get_content_width(cont) : lv_obj_get_content_height(cont)); + int32_t abs_y = cont->coords.y1 + lv_obj_get_style_space_top(cont, LV_PART_MAIN) - lv_obj_get_scroll_y(cont); + int32_t abs_x = cont->coords.x1 + lv_obj_get_style_space_left(cont, LV_PART_MAIN) - lv_obj_get_scroll_x(cont); + + lv_flex_align_t track_cross_place = f.track_place; + int32_t * cross_pos = (f.row ? &abs_y : &abs_x); + + int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + + /*Content sized objects should squeeze the gap between the children, therefore any alignment will look like + * `START`*/ + if((f.row && h_set == LV_SIZE_CONTENT && cont->h_layout == 0) || + (!f.row && w_set == LV_SIZE_CONTENT && cont->w_layout == 0)) { + track_cross_place = LV_FLEX_ALIGN_START; + } + + if(rtl && !f.row) { + if(track_cross_place == LV_FLEX_ALIGN_START) + track_cross_place = LV_FLEX_ALIGN_END; + else if(track_cross_place == LV_FLEX_ALIGN_END) + track_cross_place = LV_FLEX_ALIGN_START; + } + + int32_t total_track_cross_size = 0; + int32_t gap = 0; + uint32_t track_cnt = 0; + int32_t track_first_item; + int32_t next_track_first_item; + + if(track_cross_place != LV_FLEX_ALIGN_START) { + track_first_item = f.rev ? cont->spec_attr->child_cnt - 1 : 0; + track_t t; + while(track_first_item < (int32_t)cont->spec_attr->child_cnt && track_first_item >= 0) { + /*Search the first item of the next row*/ + t.grow_dsc_calc = 0; + next_track_first_item = find_track_end(cont, &f, track_first_item, max_main_size, item_gap, &t); + total_track_cross_size += t.track_cross_size + track_gap; + track_cnt++; + track_first_item = next_track_first_item; + } + + if(track_cnt) + total_track_cross_size -= track_gap; /*No gap after the last track*/ + + /*Place the tracks to get the start position*/ + int32_t max_cross_size = (f.row ? lv_obj_get_content_height(cont) : lv_obj_get_content_width(cont)); + place_content(track_cross_place, max_cross_size, total_track_cross_size, track_cnt, cross_pos, &gap); + } + + track_first_item = f.rev ? cont->spec_attr->child_cnt - 1 : 0; + + if(rtl && !f.row) { + *cross_pos += total_track_cross_size; + } + + while(track_first_item < (int32_t)cont->spec_attr->child_cnt && track_first_item >= 0) { + track_t t; + t.grow_dsc_calc = 1; + /*Search the first item of the next row*/ + next_track_first_item = find_track_end(cont, &f, track_first_item, max_main_size, item_gap, &t); + + if(rtl && !f.row) { + *cross_pos -= t.track_cross_size; + } + children_repos(cont, &f, track_first_item, next_track_first_item, abs_x, abs_y, max_main_size, item_gap, &t); + track_first_item = next_track_first_item; + lv_free(t.grow_dsc); + t.grow_dsc = NULL; + if(rtl && !f.row) { + *cross_pos -= gap + track_gap; + } + else { + *cross_pos += t.track_cross_size + gap + track_gap; + } + } + LV_ASSERT_MEM_INTEGRITY(); + + if(w_set == LV_SIZE_CONTENT || h_set == LV_SIZE_CONTENT) { + lv_obj_refr_size(cont); + } + + lv_obj_send_event(cont, LV_EVENT_LAYOUT_CHANGED, NULL); + + LV_TRACE_LAYOUT("finished"); +} + +/** + * Find the last item of a track + */ +static int32_t find_track_end(lv_obj_t * cont, flex_t * f, int32_t item_start_id, int32_t max_main_size, + int32_t item_gap, track_t * t) +{ + int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + + lv_obj_t * parent = lv_obj_get_parent(cont); + bool ignore_size_content = false; + if(parent != NULL) { + bool parent_is_flex = lv_obj_get_style_layout(parent, LV_PART_MAIN) == LV_LAYOUT_FLEX; + uint8_t grow_value = lv_obj_get_style_flex_grow(cont, LV_PART_MAIN); + + /* If the obj is grown then the size in that direction is known and overrides LV_SIZE_CONTENT if it is set. In + * the next `if` statement we no longer need to prevent wrapping if the width/height (depending on flow) is + * `LV_SIZE_CONTENT`, since it is not used. + */ + ignore_size_content = parent_is_flex && (grow_value > 0); + } + + /*Can't wrap if the size is auto (i.e. the size depends on the children)*/ + if(f->wrap && ((f->row && w_set == LV_SIZE_CONTENT) || (!f->row && h_set == LV_SIZE_CONTENT)) && + !ignore_size_content) { + f->wrap = false; + } + int32_t (*get_main_size)(const lv_obj_t *) = (f->row ? lv_obj_get_width_with_margin : lv_obj_get_height_with_margin); + int32_t (*get_cross_size)(const lv_obj_t *) = + (!f->row ? lv_obj_get_width_with_margin : lv_obj_get_height_with_margin); + + t->track_main_size = 0; + t->track_fix_main_size = 0; + t->track_grow_min_size = 0; + t->grow_item_cnt = 0; + t->track_cross_size = 0; + t->item_cnt = 0; + t->grow_dsc = NULL; + + int32_t item_id = item_start_id; + lv_obj_t * item = lv_obj_get_child(cont, item_id); + bool first_item = true; + while(item) { + if(item_id != item_start_id && lv_obj_has_flag(item, LV_OBJ_FLAG_FLEX_IN_NEW_TRACK)) + break; + + if(!lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) { + uint8_t grow_value = lv_obj_get_style_flex_grow(item, LV_PART_MAIN); + if(grow_value) { + int32_t min_size = f->row ? lv_obj_calc_dynamic_width(item, LV_STYLE_MIN_WIDTH) + : lv_obj_calc_dynamic_height(item, LV_STYLE_MIN_HEIGHT); + int32_t req_size = min_size; + if(item_id != item_start_id) { + req_size += item_gap; /*No gap before the first item*/ + } + + /*Wrap if can't fit*/ + if(f->wrap && t->track_fix_main_size + t->track_grow_min_size + req_size > max_main_size) + break; + + t->track_grow_min_size += min_size; + if(item_id != item_start_id) { + t->track_fix_main_size += item_gap; /*The gap is always taken from the space*/ + } + + t->grow_item_cnt++; + + if(t->grow_dsc_calc) { + grow_dsc_t * new_dsc = lv_realloc(t->grow_dsc, sizeof(grow_dsc_t) * (t->grow_item_cnt)); + LV_ASSERT_MALLOC(new_dsc); + if(new_dsc == NULL) + return item_id; + + int32_t max_size = f->row ? lv_obj_calc_dynamic_width(item, LV_STYLE_MAX_WIDTH) + : lv_obj_calc_dynamic_height(item, LV_STYLE_MAX_HEIGHT); + + new_dsc[t->grow_item_cnt - 1].item = item; + new_dsc[t->grow_item_cnt - 1].min_size = min_size; + new_dsc[t->grow_item_cnt - 1].max_size = max_size; + new_dsc[t->grow_item_cnt - 1].grow_value = grow_value; + new_dsc[t->grow_item_cnt - 1].clamped = 0; + + t->grow_dsc = new_dsc; + } + } + else { + int32_t item_size = get_main_size(item); + int32_t req_size = item_size; + if(!first_item) + req_size += item_gap; /*No gap before the first item*/ + if(f->wrap && t->track_fix_main_size + t->track_grow_min_size + req_size > max_main_size) + break; + t->track_fix_main_size += req_size; + } + + first_item = false; + t->track_cross_size = LV_MAX(get_cross_size(item), t->track_cross_size); + t->item_cnt++; + } + + item_id += f->rev ? -1 : +1; + if(item_id < 0) + break; + item = lv_obj_get_child(cont, item_id); + } + + /*If there is at least one "grow item" the track takes the full space*/ + t->track_main_size = t->grow_item_cnt ? max_main_size : t->track_fix_main_size; + + /*Have at least one item in a row*/ + if(item && item_id == item_start_id) { + item = cont->spec_attr->children[item_id]; + get_next_item(cont, f->rev, &item_id); + if(item) { + t->track_cross_size = get_cross_size(item); + t->track_main_size = get_main_size(item); + t->item_cnt = 1; + } + } + + return item_id; +} + +/** + * Position the children in the same track + */ +static void children_repos(lv_obj_t * cont, flex_t * f, int32_t item_first_id, int32_t item_last_id, int32_t abs_x, + int32_t abs_y, int32_t max_main_size, int32_t item_gap, track_t * t) +{ + void (*area_set_main_size)(lv_area_t *, int32_t) = (f->row ? lv_area_set_width : lv_area_set_height); + int32_t (*area_get_main_size)(const lv_area_t *) = (f->row ? lv_area_get_width : lv_area_get_height); + int32_t (*area_get_cross_size)(const lv_area_t *) = (!f->row ? lv_area_get_width : lv_area_get_height); + + typedef int32_t (*margin_func_t)(const lv_obj_t *, lv_part_t); + margin_func_t get_margin_main_start = (f->row ? lv_obj_get_style_margin_left : lv_obj_get_style_margin_top); + margin_func_t get_margin_main_end = (f->row ? lv_obj_get_style_margin_right : lv_obj_get_style_margin_bottom); + margin_func_t get_margin_cross_start = (!f->row ? lv_obj_get_style_margin_left : lv_obj_get_style_margin_top); + margin_func_t get_margin_cross_end = (!f->row ? lv_obj_get_style_margin_right : lv_obj_get_style_margin_bottom); + + /*Calculate the size of grow items first*/ + uint32_t i; + bool grow_reiterate = true; + while(grow_reiterate && t->grow_item_cnt) { + grow_reiterate = false; + int32_t grow_value_sum = 0; + int32_t grow_max_size = t->track_main_size - t->track_fix_main_size; + for(i = 0; i < t->grow_item_cnt; i++) { + if(t->grow_dsc[i].clamped == 0) { + grow_value_sum += t->grow_dsc[i].grow_value; + } + else { + grow_max_size -= t->grow_dsc[i].final_size; + } + } + + for(i = 0; i < t->grow_item_cnt; i++) { + if(t->grow_dsc[i].clamped == 0) { + LV_ASSERT(grow_value_sum != 0); + int32_t size = div_round_closest(grow_max_size * t->grow_dsc[i].grow_value, grow_value_sum); + int32_t size_clamp = LV_CLAMP(t->grow_dsc[i].min_size, size, t->grow_dsc[i].max_size); + + if(size_clamp != size) { + t->grow_dsc[i].clamped = 1; + grow_reiterate = true; + } + t->grow_dsc[i].final_size = size_clamp; + grow_value_sum -= t->grow_dsc[i].grow_value; + grow_max_size -= t->grow_dsc[i].final_size; + } + } + } + + bool rtl = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL; + + int32_t main_pos = 0; + + int32_t place_gap = 0; + place_content(f->main_place, max_main_size, t->track_main_size, t->item_cnt, &main_pos, &place_gap); + if(f->row && rtl) main_pos = max_main_size - main_pos; + + lv_obj_t * item = lv_obj_get_child(cont, item_first_id); + /*Reposition the children*/ + while(item && item_first_id != item_last_id) { + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) { + item = get_next_item(cont, f->rev, &item_first_id); + continue; + } + + uint16_t item_w_layout = item->w_layout; + uint16_t item_h_layout = item->h_layout; + + int32_t grow_size = lv_obj_get_style_flex_grow(item, LV_PART_MAIN); + if(grow_size) { + int32_t s = 0; + for(i = 0; i < t->grow_item_cnt; i++) { + if(t->grow_dsc[i].item == item) { + s = t->grow_dsc[i].final_size; + break; + } + } + + if(f->row) { + item->w_layout = 1; + item->h_layout = 0; + } + else { + item->h_layout = 1; + item->w_layout = 0; + } + + if(s != area_get_main_size(&item->coords)) { + lv_obj_invalidate(item); + + lv_area_t old_coords; + lv_area_copy(&old_coords, &item->coords); + area_set_main_size(&item->coords, s); + lv_obj_send_event(item, LV_EVENT_SIZE_CHANGED, &old_coords); + lv_obj_send_event(lv_obj_get_parent(item), LV_EVENT_CHILD_CHANGED, item); + lv_obj_invalidate(item); + } + } + else { + item->w_layout = 0; + item->h_layout = 0; + } + + if(item->w_layout != item_w_layout || item->h_layout != item_h_layout) { + lv_obj_mark_layout_as_dirty(item); + } + + int32_t cross_pos = 0; + switch(f->cross_place) { + case LV_FLEX_ALIGN_CENTER: + /*Round up the cross size to avoid rounding error when dividing by 2 + *The issue comes up e,g, with column direction with center cross direction if an element's width changes*/ + cross_pos = (((t->track_cross_size + 1) & (~1)) - area_get_cross_size(&item->coords)) / 2; + cross_pos += (get_margin_cross_start(item, LV_PART_MAIN) - get_margin_cross_end(item, LV_PART_MAIN)) / 2; + break; + case LV_FLEX_ALIGN_END: + cross_pos = t->track_cross_size - area_get_cross_size(&item->coords); + cross_pos -= get_margin_cross_end(item, LV_PART_MAIN); + break; + default: + cross_pos += get_margin_cross_start(item, LV_PART_MAIN); + break; + } + + if(f->row && rtl) + main_pos -= area_get_main_size(&item->coords); + + /*Handle percentage value of translate*/ + int32_t tr_x = lv_obj_get_style_translate_x(item, LV_PART_MAIN); + int32_t tr_y = lv_obj_get_style_translate_y(item, LV_PART_MAIN); + int32_t w = lv_obj_get_width(item); + int32_t h = lv_obj_get_height(item); + if(LV_COORD_IS_PCT(tr_x)) + tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; + if(LV_COORD_IS_PCT(tr_y)) + tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; + + int32_t diff_x = abs_x - item->coords.x1 + tr_x; + int32_t diff_y = abs_y - item->coords.y1 + tr_y; + diff_x += f->row ? main_pos + get_margin_main_start(item, LV_PART_MAIN) : cross_pos; + diff_y += f->row ? cross_pos : main_pos + get_margin_main_start(item, LV_PART_MAIN); + + if(diff_x || diff_y) { + lv_obj_invalidate(item); + item->coords.x1 += diff_x; + item->coords.x2 += diff_x; + item->coords.y1 += diff_y; + item->coords.y2 += diff_y; + lv_obj_invalidate(item); + lv_obj_move_children_by(item, diff_x, diff_y, false); + } + + if(!(f->row && rtl)) + main_pos += area_get_main_size(&item->coords) + item_gap + place_gap + + get_margin_main_start(item, LV_PART_MAIN) + get_margin_main_end(item, LV_PART_MAIN); + else + main_pos -= item_gap + place_gap; + + item = get_next_item(cont, f->rev, &item_first_id); + } +} + +/** + * Tell a start coordinate and gap for a placement type. + */ +static void place_content(lv_flex_align_t place, int32_t max_size, int32_t content_size, int32_t item_cnt, + int32_t * start_pos, int32_t * gap) +{ + if(item_cnt <= 1) { + switch(place) { + case LV_FLEX_ALIGN_SPACE_AROUND: + case LV_FLEX_ALIGN_SPACE_EVENLY: + place = LV_FLEX_ALIGN_CENTER; + break; + default: + break; + } + } + + switch(place) { + case LV_FLEX_ALIGN_CENTER: + *gap = 0; + *start_pos += (max_size - content_size) / 2; + break; + case LV_FLEX_ALIGN_END: + *gap = 0; + *start_pos += max_size - content_size; + break; + case LV_FLEX_ALIGN_SPACE_BETWEEN: + if(item_cnt > 1) *gap = (int32_t)(max_size - content_size) / (int32_t)(item_cnt - 1); + break; + case LV_FLEX_ALIGN_SPACE_AROUND: + *gap += (int32_t)(max_size - content_size) / (int32_t)(item_cnt); + *start_pos += *gap / 2; + break; + case LV_FLEX_ALIGN_SPACE_EVENLY: + *gap = (int32_t)(max_size - content_size) / (int32_t)(item_cnt + 1); + *start_pos += *gap; + break; + default: + *gap = 0; + } +} + +static lv_obj_t * get_next_item(lv_obj_t * cont, bool rev, int32_t * item_id) +{ + if(rev) { + (*item_id)--; + if(*item_id >= 0) return cont->spec_attr->children[*item_id]; + else return NULL; + } + else { + (*item_id)++; + if((*item_id) < (int32_t)cont->spec_attr->child_cnt) return cont->spec_attr->children[*item_id]; + else return NULL; + } +} + +static int32_t lv_obj_get_width_with_margin(const lv_obj_t * obj) +{ + return lv_obj_get_style_margin_left(obj, LV_PART_MAIN) + + lv_obj_get_width(obj) + + lv_obj_get_style_margin_right(obj, LV_PART_MAIN); +} + +static int32_t lv_obj_get_height_with_margin(const lv_obj_t * obj) +{ + return lv_obj_get_style_margin_top(obj, LV_PART_MAIN) + + lv_obj_get_height(obj) + + lv_obj_get_style_margin_bottom(obj, LV_PART_MAIN); +} + +#endif /*LV_USE_FLEX*/ diff --git a/inc/lvgl/src/layouts/flex/lv_flex.h b/inc/lvgl/src/layouts/flex/lv_flex.h new file mode 100644 index 0000000..9724f9b --- /dev/null +++ b/inc/lvgl/src/layouts/flex/lv_flex.h @@ -0,0 +1,102 @@ +/** + * @file lv_flex.h + * + */ + +#ifndef LV_FLEX_H +#define LV_FLEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../misc/lv_area.h" + +#if LV_USE_FLEX + +/********************* + * DEFINES + *********************/ + +#define LV_FLEX_COLUMN (1 << 0) +#define LV_FLEX_WRAP (1 << 2) +#define LV_FLEX_REVERSE (1 << 3) + +/********************** + * TYPEDEFS + **********************/ + +/*Can't include lv_obj.h because it includes this header file*/ + +typedef enum { + LV_FLEX_ALIGN_START, + LV_FLEX_ALIGN_END, + LV_FLEX_ALIGN_CENTER, + LV_FLEX_ALIGN_SPACE_EVENLY, + LV_FLEX_ALIGN_SPACE_AROUND, + LV_FLEX_ALIGN_SPACE_BETWEEN, +} lv_flex_align_t; + +typedef enum { + LV_FLEX_FLOW_ROW = 0x00, + LV_FLEX_FLOW_COLUMN = LV_FLEX_COLUMN, + LV_FLEX_FLOW_ROW_WRAP = LV_FLEX_FLOW_ROW | LV_FLEX_WRAP, + LV_FLEX_FLOW_ROW_REVERSE = LV_FLEX_FLOW_ROW | LV_FLEX_REVERSE, + LV_FLEX_FLOW_ROW_WRAP_REVERSE = LV_FLEX_FLOW_ROW | LV_FLEX_WRAP | LV_FLEX_REVERSE, + LV_FLEX_FLOW_COLUMN_WRAP = LV_FLEX_FLOW_COLUMN | LV_FLEX_WRAP, + LV_FLEX_FLOW_COLUMN_REVERSE = LV_FLEX_FLOW_COLUMN | LV_FLEX_REVERSE, + LV_FLEX_FLOW_COLUMN_WRAP_REVERSE = LV_FLEX_FLOW_COLUMN | LV_FLEX_WRAP | LV_FLEX_REVERSE, +} lv_flex_flow_t; + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a flex layout to default values + */ +void lv_flex_init(void); + +/** + * Set how the item should flow + * @param obj pointer to an object. The parent must have flex layout else nothing will happen. + * @param flow an element of `lv_flex_flow_t`. + */ +void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow); + +/** + * Set how to place (where to align) the items and tracks + * @param obj pointer to an object. The parent must have flex layout else nothing will happen. + * @param main_place where to place the items on main axis (in their track). Any value of `lv_flex_align_t`. + * @param cross_place where to place the item in their track on the cross axis. `LV_FLEX_ALIGN_START/END/CENTER` + * @param track_cross_place where to place the tracks in the cross direction. Any value of `lv_flex_align_t`. + */ +void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place, + lv_flex_align_t track_cross_place); + +/** + * Sets the width or height (on main axis) to grow the object in order fill the free space + * @param obj pointer to an object. The parent must have flex layout else nothing will happen. + * @param grow a value to set how much free space to take proportionally to other growing items. + */ +void lv_obj_set_flex_grow(lv_obj_t * obj, uint8_t grow); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FLEX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FLEX_H*/ diff --git a/inc/lvgl/src/layouts/grid/lv_grid.c b/inc/lvgl/src/layouts/grid/lv_grid.c new file mode 100644 index 0000000..e4115ca --- /dev/null +++ b/inc/lvgl/src/layouts/grid/lv_grid.c @@ -0,0 +1,687 @@ +/** + * @file lv_grid.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_grid.h" + +#if LV_USE_GRID + +#include "../../stdlib/lv_string.h" +#include "../lv_layout.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ +#define layout_list_def LV_GLOBAL_DEFAULT()->layout_list + +/** + * Some helper defines + */ +#define IS_FR(x) (x >= LV_COORD_MAX - 100) +#define IS_CONTENT(x) (x == LV_COORD_MAX - 101) +#define GET_FR(x) (x - (LV_COORD_MAX - 100)) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t col; + uint32_t row; + lv_point_t grid_abs; +} item_repos_hint_t; + +typedef struct { + int32_t * x; + int32_t * y; + int32_t * w; + int32_t * h; + uint32_t col_num; + uint32_t row_num; + int32_t grid_w; + int32_t grid_h; +} lv_grid_calc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void grid_update(lv_obj_t * cont, void * user_data); +static lv_result_t calc(lv_obj_t * obj, lv_grid_calc_t * calc); +static void calc_free(lv_grid_calc_t * calc); +static lv_result_t calc_cols(lv_obj_t * cont, lv_grid_calc_t * c); +static lv_result_t calc_rows(lv_obj_t * cont, lv_grid_calc_t * c); +static void item_repos(lv_obj_t * item, lv_grid_calc_t * c, item_repos_hint_t * hint); +static int32_t grid_align(int32_t cont_size, bool auto_size, lv_grid_align_t align, int32_t gap, + uint32_t track_num, + int32_t * size_array, int32_t * pos_array, bool reverse); +static uint32_t count_tracks(const int32_t * templ); + +static inline const int32_t * get_col_dsc(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_column_dsc_array(obj, LV_PART_MAIN); +} +static inline const int32_t * get_row_dsc(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_row_dsc_array(obj, LV_PART_MAIN); +} +static inline int32_t get_col_pos(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_column_pos(obj, LV_PART_MAIN); +} +static inline int32_t get_row_pos(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_row_pos(obj, LV_PART_MAIN); +} +static inline int32_t get_col_span(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_column_span(obj, LV_PART_MAIN); +} +static inline int32_t get_row_span(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_row_span(obj, LV_PART_MAIN); +} +static inline lv_grid_align_t get_cell_col_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_x_align(obj, LV_PART_MAIN); +} +static inline lv_grid_align_t get_cell_row_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_cell_y_align(obj, LV_PART_MAIN); +} +static inline lv_grid_align_t get_grid_col_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_column_align(obj, LV_PART_MAIN); +} +static inline lv_grid_align_t get_grid_row_align(lv_obj_t * obj) +{ + return lv_obj_get_style_grid_row_align(obj, LV_PART_MAIN); +} +static inline int32_t get_margin_hor(lv_obj_t * obj) +{ + return lv_obj_get_style_margin_left(obj, LV_PART_MAIN) + + lv_obj_get_style_margin_right(obj, LV_PART_MAIN); +} +static inline int32_t get_margin_ver(lv_obj_t * obj) +{ + return lv_obj_get_style_margin_top(obj, LV_PART_MAIN) + + lv_obj_get_style_margin_bottom(obj, LV_PART_MAIN); +} + +static inline int32_t lv_div_round_closest(int32_t dividend, int32_t divisor) +{ + return (dividend + divisor / 2) / divisor; +} + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_LAYOUT + #define LV_TRACE_LAYOUT(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_LAYOUT(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_grid_init(void) +{ + layout_list_def[LV_LAYOUT_GRID].callbacks.layout_update_cb = grid_update; + layout_list_def[LV_LAYOUT_GRID].callbacks.get_min_size_cb = NULL; + layout_list_def[LV_LAYOUT_GRID].user_data = NULL; +} + +void lv_obj_set_grid_dsc_array(lv_obj_t * obj, const int32_t col_dsc[], const int32_t row_dsc[]) +{ + lv_obj_set_style_grid_column_dsc_array(obj, col_dsc, 0); + lv_obj_set_style_grid_row_dsc_array(obj, row_dsc, 0); + lv_obj_set_style_layout(obj, LV_LAYOUT_GRID, 0); +} + +void lv_obj_set_grid_align(lv_obj_t * obj, lv_grid_align_t column_align, lv_grid_align_t row_align) +{ + lv_obj_set_style_grid_column_align(obj, column_align, 0); + lv_obj_set_style_grid_row_align(obj, row_align, 0); + +} + +void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t x_align, int32_t col_pos, int32_t col_span, + lv_grid_align_t y_align, int32_t row_pos, int32_t row_span) + +{ + lv_obj_set_style_grid_cell_column_pos(obj, col_pos, 0); + lv_obj_set_style_grid_cell_row_pos(obj, row_pos, 0); + lv_obj_set_style_grid_cell_x_align(obj, x_align, 0); + lv_obj_set_style_grid_cell_column_span(obj, col_span, 0); + lv_obj_set_style_grid_cell_row_span(obj, row_span, 0); + lv_obj_set_style_grid_cell_y_align(obj, y_align, 0); + + lv_obj_mark_layout_as_dirty(lv_obj_get_parent(obj)); +} + +int32_t lv_grid_fr(uint8_t x) +{ + return LV_GRID_FR(x); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void grid_update(lv_obj_t * cont, void * user_data) +{ + LV_LOG_INFO("update %p container", (void *)cont); + LV_UNUSED(user_data); + + lv_grid_calc_t c; + lv_result_t res = calc(cont, &c); + if(res != LV_RESULT_OK) return; + + item_repos_hint_t hint; + lv_memzero(&hint, sizeof(hint)); + + /*Calculate the grids absolute x and y coordinates. + *It will be used as helper during item repositioning to avoid calculating this value for every children*/ + int32_t pad_left = lv_obj_get_style_space_left(cont, LV_PART_MAIN); + int32_t pad_top = lv_obj_get_style_space_top(cont, LV_PART_MAIN); + hint.grid_abs.x = pad_left + cont->coords.x1 - lv_obj_get_scroll_x(cont); + hint.grid_abs.y = pad_top + cont->coords.y1 - lv_obj_get_scroll_y(cont); + + uint32_t i; + for(i = 0; i < cont->spec_attr->child_cnt; i++) { + lv_obj_t * item = cont->spec_attr->children[i]; + item_repos(item, &c, &hint); + } + calc_free(&c); + + int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + if(w_set == LV_SIZE_CONTENT || h_set == LV_SIZE_CONTENT) { + lv_obj_refr_size(cont); + } + + lv_obj_send_event(cont, LV_EVENT_LAYOUT_CHANGED, NULL); + + LV_TRACE_LAYOUT("finished"); +} + +/** + * Calculate the grid cells coordinates + * @param cont an object that has a grid + * @param calc store the calculated cells sizes here + * @note `lv_grid_calc_free(calc_out)` needs to be called when `calc_out` is not needed anymore + */ +static lv_result_t calc(lv_obj_t * cont, lv_grid_calc_t * calc_out) +{ + if(lv_obj_get_child(cont, 0) == NULL) { + lv_memzero(calc_out, sizeof(lv_grid_calc_t)); + return LV_RESULT_INVALID; + } + + if(calc_rows(cont, calc_out) == LV_RESULT_INVALID) { + /* Warning is already logged inside `calc_rows` */ + return LV_RESULT_INVALID; + } + if(calc_cols(cont, calc_out) == LV_RESULT_INVALID) { + /* Warning is already logged inside `calc_cols` */ + return LV_RESULT_INVALID; + } + + int32_t col_gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); + int32_t row_gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + + bool rev = lv_obj_get_style_base_dir(cont, LV_PART_MAIN) == LV_BASE_DIR_RTL; + + int32_t w_set = lv_obj_get_style_width(cont, LV_PART_MAIN); + int32_t h_set = lv_obj_get_style_height(cont, LV_PART_MAIN); + bool auto_w = w_set == LV_SIZE_CONTENT && !cont->w_layout; + int32_t cont_w = lv_obj_get_content_width(cont); + calc_out->grid_w = grid_align(cont_w, auto_w, get_grid_col_align(cont), col_gap, calc_out->col_num, calc_out->w, + calc_out->x, rev); + + bool auto_h = h_set == LV_SIZE_CONTENT && !cont->h_layout; + int32_t cont_h = lv_obj_get_content_height(cont); + calc_out->grid_h = grid_align(cont_h, auto_h, get_grid_row_align(cont), row_gap, calc_out->row_num, calc_out->h, + calc_out->y, false); + + LV_ASSERT_MEM_INTEGRITY(); + return LV_RESULT_OK; +} + +/** + * Free the a grid calculation's data + * @param calc pointer to the calculated grid cell coordinates + */ +static void calc_free(lv_grid_calc_t * calc) +{ + lv_free(calc->x); + lv_free(calc->y); + lv_free(calc->w); + lv_free(calc->h); +} + +static lv_result_t calc_cols(lv_obj_t * cont, lv_grid_calc_t * c) +{ + + const int32_t * col_templ; + col_templ = get_col_dsc(cont); + bool subgrid = false; + if(col_templ == NULL) { + lv_obj_t * parent = lv_obj_get_parent(cont); + col_templ = get_col_dsc(parent); + if(col_templ == NULL) { + LV_LOG_WARN("No col descriptor found even on the parent"); + return LV_RESULT_INVALID; + } + + int32_t pos = get_col_pos(cont); + int32_t span = get_col_span(cont); + + int32_t * col_templ_sub = lv_malloc(sizeof(int32_t) * (span + 1)); + lv_memcpy(col_templ_sub, &col_templ[pos], sizeof(int32_t) * span); + col_templ_sub[span] = LV_GRID_TEMPLATE_LAST; + col_templ = col_templ_sub; + subgrid = true; + } + + int32_t cont_w = lv_obj_get_content_width(cont); + + c->col_num = count_tracks(col_templ); + c->x = lv_malloc(sizeof(int32_t) * c->col_num); + c->w = lv_malloc(sizeof(int32_t) * c->col_num); + + /*Set sizes for CONTENT cells*/ + uint32_t i; + for(i = 0; i < c->col_num; i++) { + int32_t size = LV_COORD_MIN; + if(IS_CONTENT(col_templ[i])) { + /*Check the size of children of this cell*/ + uint32_t ci; + for(ci = 0; ci < lv_obj_get_child_count(cont); ci++) { + lv_obj_t * item = lv_obj_get_child(cont, ci); + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + uint32_t col_span = get_col_span(item); + if(col_span != 1) continue; + + uint32_t col_pos = get_col_pos(item); + if(col_pos != i) continue; + + size = LV_MAX(size, lv_obj_get_width(item)); + } + if(size >= 0) c->w[i] = size; + else c->w[i] = 0; + } + } + + uint32_t col_fr_cnt = 0; + int32_t grid_w = 0; + + for(i = 0; i < c->col_num; i++) { + int32_t x = col_templ[i]; + if(IS_FR(x)) { + col_fr_cnt += GET_FR(x); + } + else if(IS_CONTENT(x)) { + grid_w += c->w[i]; + } + else { + c->w[i] = x; + grid_w += x; + } + } + + int32_t col_gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); + cont_w -= col_gap * (c->col_num - 1); + int32_t free_w = cont_w - grid_w; + if(free_w < 0) free_w = 0; + + for(i = 0; i < c->col_num && col_fr_cnt; i++) { + int32_t x = col_templ[i]; + if(IS_FR(x)) { + int32_t f = GET_FR(x); + c->w[i] = lv_div_round_closest(free_w * f, col_fr_cnt); + /*By updating remaining fr and width, we ensure f == col_fr_cnt + *in the last loop iteration. That means the last iteration will + *not have rounding errors and use all remaining space.*/ + col_fr_cnt -= f; + free_w -= c->w[i]; + } + } + + if(subgrid) { + lv_free((void *)col_templ); + } + return LV_RESULT_OK; +} + +static lv_result_t calc_rows(lv_obj_t * cont, lv_grid_calc_t * c) +{ + const int32_t * row_templ; + row_templ = get_row_dsc(cont); + bool subgrid = false; + if(row_templ == NULL) { + lv_obj_t * parent = lv_obj_get_parent(cont); + row_templ = get_row_dsc(parent); + if(row_templ == NULL) { + LV_LOG_WARN("No row descriptor found even on the parent"); + return LV_RESULT_INVALID; + } + + int32_t pos = get_row_pos(cont); + int32_t span = get_row_span(cont); + + int32_t * row_templ_sub = lv_malloc(sizeof(int32_t) * (span + 1)); + lv_memcpy(row_templ_sub, &row_templ[pos], sizeof(int32_t) * span); + row_templ_sub[span] = LV_GRID_TEMPLATE_LAST; + row_templ = row_templ_sub; + subgrid = true; + } + + c->row_num = count_tracks(row_templ); + c->y = lv_malloc(sizeof(int32_t) * c->row_num); + c->h = lv_malloc(sizeof(int32_t) * c->row_num); + /*Set sizes for CONTENT cells*/ + uint32_t i; + for(i = 0; i < c->row_num; i++) { + int32_t size = LV_COORD_MIN; + if(IS_CONTENT(row_templ[i])) { + /*Check the size of children of this cell*/ + uint32_t ci; + for(ci = 0; ci < lv_obj_get_child_count(cont); ci++) { + lv_obj_t * item = lv_obj_get_child(cont, ci); + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) continue; + uint32_t row_span = get_row_span(item); + if(row_span != 1) continue; + + uint32_t row_pos = get_row_pos(item); + if(row_pos != i) continue; + + size = LV_MAX(size, lv_obj_get_height(item)); + } + if(size >= 0) c->h[i] = size; + else c->h[i] = 0; + } + } + + uint32_t row_fr_cnt = 0; + int32_t grid_h = 0; + + for(i = 0; i < c->row_num; i++) { + int32_t x = row_templ[i]; + if(IS_FR(x)) { + row_fr_cnt += GET_FR(x); + } + else if(IS_CONTENT(x)) { + grid_h += c->h[i]; + } + else { + c->h[i] = x; + grid_h += x; + } + } + + int32_t row_gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + int32_t cont_h = lv_obj_get_content_height(cont) - row_gap * (c->row_num - 1); + int32_t free_h = cont_h - grid_h; + if(free_h < 0) free_h = 0; + + for(i = 0; i < c->row_num && row_fr_cnt; i++) { + int32_t x = row_templ[i]; + if(IS_FR(x)) { + int32_t f = GET_FR(x); + c->h[i] = lv_div_round_closest(free_h * f, row_fr_cnt); + /*By updating remaining fr and height, we ensure f == row_fr_cnt + *in the last loop iteration. That means the last iteration will + *not have rounding errors and use all remaining space.*/ + row_fr_cnt -= f; + free_h -= c->h[i]; + } + } + + if(subgrid) { + lv_free((void *)row_templ); + } + return LV_RESULT_OK; +} + +/** + * Reposition a grid item in its cell + * @param item a grid item to reposition + * @param calc the calculated grid of `cont` + * @param child_id_ext helper value if the ID of the child is know (order from the oldest) else -1 + * @param grid_abs helper value, the absolute position of the grid, NULL if unknown + */ +static void item_repos(lv_obj_t * item, lv_grid_calc_t * c, item_repos_hint_t * hint) +{ + if(lv_obj_has_flag_any(item, LV_OBJ_FLAG_IGNORE_LAYOUT | LV_OBJ_FLAG_HIDDEN | LV_OBJ_FLAG_FLOATING)) return; + uint32_t col_span = get_col_span(item); + uint32_t row_span = get_row_span(item); + if(row_span == 0 || col_span == 0) return; + + bool rev = lv_obj_get_style_base_dir(lv_obj_get_parent(item), LV_PART_MAIN) == LV_BASE_DIR_RTL; + + uint32_t col_pos = get_col_pos(item); + uint32_t row_pos = get_row_pos(item); + lv_grid_align_t col_align = get_cell_col_align(item); + lv_grid_align_t row_align = get_cell_row_align(item); + + int32_t col_x1 = 0; + int32_t col_x2 = 0; + int32_t col_w = 0; + + if(rev && col_span > 1) { + col_x1 = c->x[col_pos + col_span - 1]; + col_x2 = c->x[col_pos] + c->w[col_pos]; + col_w = col_x2 - col_x1; + } + else { + col_x1 = c->x[col_pos]; + col_x2 = c->x[col_pos + col_span - 1] + c->w[col_pos + col_span - 1]; + col_w = col_x2 - col_x1; + } + + int32_t row_y1 = c->y[row_pos]; + int32_t row_y2 = c->y[row_pos + row_span - 1] + c->h[row_pos + row_span - 1]; + int32_t row_h = row_y2 - row_y1; + + /*If the item has RTL base dir switch start and end*/ + if(lv_obj_get_style_base_dir(item, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + if(col_align == LV_GRID_ALIGN_START) col_align = LV_GRID_ALIGN_END; + else if(col_align == LV_GRID_ALIGN_END) col_align = LV_GRID_ALIGN_START; + } + + int32_t x; + int32_t y; + int32_t item_w = lv_area_get_width(&item->coords); + int32_t item_h = lv_area_get_height(&item->coords); + + col_pos = rev && col_span > 1 ? col_pos + col_span - 1 : col_pos; + + switch(col_align) { + default: + case LV_GRID_ALIGN_START: + x = c->x[col_pos] + lv_obj_get_style_margin_left(item, LV_PART_MAIN); + item->w_layout = 0; + break; + case LV_GRID_ALIGN_STRETCH: + x = c->x[col_pos] + lv_obj_get_style_margin_left(item, LV_PART_MAIN); + item_w = col_w - get_margin_hor(item); + item->w_layout = 1; + break; + case LV_GRID_ALIGN_CENTER: + x = c->x[col_pos] + (col_w - item_w) / 2 + (lv_obj_get_style_margin_left(item, LV_PART_MAIN) - + lv_obj_get_style_margin_right(item, LV_PART_MAIN)) / 2; + item->w_layout = 0; + break; + case LV_GRID_ALIGN_END: + x = c->x[col_pos] + col_w - lv_obj_get_width(item) - lv_obj_get_style_margin_right(item, LV_PART_MAIN); + item->w_layout = 0; + break; + } + + switch(row_align) { + default: + case LV_GRID_ALIGN_START: + y = c->y[row_pos] + lv_obj_get_style_margin_top(item, LV_PART_MAIN); + item->h_layout = 0; + break; + case LV_GRID_ALIGN_STRETCH: + y = c->y[row_pos] + lv_obj_get_style_margin_top(item, LV_PART_MAIN); + item_h = row_h - get_margin_ver(item); + item->h_layout = 1; + break; + case LV_GRID_ALIGN_CENTER: + y = c->y[row_pos] + (row_h - item_h) / 2 + (lv_obj_get_style_margin_top(item, LV_PART_MAIN) - + lv_obj_get_style_margin_bottom(item, LV_PART_MAIN)) / 2; + item->h_layout = 0; + break; + case LV_GRID_ALIGN_END: + y = c->y[row_pos] + row_h - lv_obj_get_height(item) - lv_obj_get_style_margin_bottom(item, LV_PART_MAIN); + item->h_layout = 0; + break; + } + + /*Set a new size if required*/ + if(lv_obj_get_width(item) != item_w || lv_obj_get_height(item) != item_h) { + lv_area_t old_coords; + lv_area_copy(&old_coords, &item->coords); + lv_obj_invalidate(item); + lv_area_set_width(&item->coords, item_w); + lv_area_set_height(&item->coords, item_h); + lv_obj_invalidate(item); + lv_obj_send_event(item, LV_EVENT_SIZE_CHANGED, &old_coords); + lv_obj_send_event(lv_obj_get_parent(item), LV_EVENT_CHILD_CHANGED, item); + + } + + /*Handle percentage value of translate*/ + int32_t tr_x = lv_obj_get_style_translate_x(item, LV_PART_MAIN); + int32_t tr_y = lv_obj_get_style_translate_y(item, LV_PART_MAIN); + int32_t w = lv_obj_get_width(item); + int32_t h = lv_obj_get_height(item); + if(LV_COORD_IS_PCT(tr_x)) tr_x = (w * LV_COORD_GET_PCT(tr_x)) / 100; + if(LV_COORD_IS_PCT(tr_y)) tr_y = (h * LV_COORD_GET_PCT(tr_y)) / 100; + + x += tr_x; + y += tr_y; + + int32_t diff_x = hint->grid_abs.x + x - item->coords.x1; + int32_t diff_y = hint->grid_abs.y + y - item->coords.y1; + if(diff_x || diff_y) { + lv_obj_invalidate(item); + item->coords.x1 += diff_x; + item->coords.x2 += diff_x; + item->coords.y1 += diff_y; + item->coords.y2 += diff_y; + lv_obj_invalidate(item); + lv_obj_move_children_by(item, diff_x, diff_y, false); + } +} + +/** + * Place the grid track according to align methods. It keeps the track sizes but sets their position. + * It can process both columns or rows according to the passed parameters. + * @param cont_size size of the containers content area (width/height) + * @param auto_size true: the container has auto size in the current direction + * @param align align method + * @param gap grid gap + * @param track_num number of tracks + * @param size_array array with the track sizes + * @param pos_array write the positions of the tracks here + * @return the total size of the grid + */ +static int32_t grid_align(int32_t cont_size, bool auto_size, lv_grid_align_t align, int32_t gap, + uint32_t track_num, + int32_t * size_array, int32_t * pos_array, bool reverse) +{ + int32_t grid_size = 0; + uint32_t i; + + if(auto_size) { + pos_array[0] = 0; + } + else { + /*With spaced alignment gap will be calculated from the remaining space*/ + if(align == LV_GRID_ALIGN_SPACE_AROUND || align == LV_GRID_ALIGN_SPACE_BETWEEN || align == LV_GRID_ALIGN_SPACE_EVENLY) { + gap = 0; + if(track_num == 1) align = LV_GRID_ALIGN_CENTER; + } + + /*Get the full grid size with gap*/ + for(i = 0; i < track_num; i++) { + grid_size += size_array[i] + gap; + } + grid_size -= gap; + + /*Calculate the position of the first item and set gap is necessary*/ + switch(align) { + case LV_GRID_ALIGN_START: + pos_array[0] = 0; + break; + case LV_GRID_ALIGN_CENTER: + pos_array[0] = (cont_size - grid_size) / 2; + break; + case LV_GRID_ALIGN_END: + pos_array[0] = cont_size - grid_size; + break; + case LV_GRID_ALIGN_SPACE_BETWEEN: + pos_array[0] = 0; + gap = (int32_t)(cont_size - grid_size) / (int32_t)(track_num - 1); + break; + case LV_GRID_ALIGN_SPACE_AROUND: + gap = (int32_t)(cont_size - grid_size) / (int32_t)(track_num); + pos_array[0] = gap / 2; + break; + case LV_GRID_ALIGN_SPACE_EVENLY: + gap = (int32_t)(cont_size - grid_size) / (int32_t)(track_num + 1); + pos_array[0] = gap; + break; + default: + break; + } + } + + /*Set the position of all tracks from the start position, gaps and track sizes*/ + for(i = 0; i < track_num - 1; i++) { + pos_array[i + 1] = pos_array[i] + size_array[i] + gap; + } + + int32_t total_gird_size = pos_array[track_num - 1] + size_array[track_num - 1] - pos_array[0]; + + if(reverse) { + for(i = 0; i < track_num; i++) { + pos_array[i] = cont_size - pos_array[i] - size_array[i]; + } + + } + + /*Return the full size of the grid*/ + return total_gird_size; +} + +static uint32_t count_tracks(const int32_t * templ) +{ + uint32_t i; + for(i = 0; templ[i] != LV_GRID_TEMPLATE_LAST; i++); + + return i; +} + +#endif /*LV_USE_GRID*/ diff --git a/inc/lvgl/src/layouts/grid/lv_grid.h b/inc/lvgl/src/layouts/grid/lv_grid.h new file mode 100644 index 0000000..a7bf738 --- /dev/null +++ b/inc/lvgl/src/layouts/grid/lv_grid.h @@ -0,0 +1,99 @@ +/** + * @file lv_grid.h + * + */ + +#ifndef LV_GRID_H +#define LV_GRID_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../misc/lv_area.h" + +#if LV_USE_GRID + +/********************* + * DEFINES + *********************/ +/** + * Can be used track size to make the track fill the free space. + * @param x how much space to take proportionally to other FR tracks + * @return a special track size + */ +#define LV_GRID_FR(x) (LV_COORD_MAX - 100 + x) + +#define LV_GRID_CONTENT (LV_COORD_MAX - 101) +LV_EXPORT_CONST_INT(LV_GRID_CONTENT); + +#define LV_GRID_TEMPLATE_LAST (LV_COORD_MAX) +LV_EXPORT_CONST_INT(LV_GRID_TEMPLATE_LAST); + +/********************** + * TYPEDEFS + **********************/ + +/*Can't include lv_obj.h because it includes this header file*/ + +typedef enum { + LV_GRID_ALIGN_START, + LV_GRID_ALIGN_CENTER, + LV_GRID_ALIGN_END, + LV_GRID_ALIGN_STRETCH, + LV_GRID_ALIGN_SPACE_EVENLY, + LV_GRID_ALIGN_SPACE_AROUND, + LV_GRID_ALIGN_SPACE_BETWEEN, +} lv_grid_align_t; + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_grid_init(void); + +void lv_obj_set_grid_dsc_array(lv_obj_t * obj, const int32_t col_dsc[], const int32_t row_dsc[]); + +void lv_obj_set_grid_align(lv_obj_t * obj, lv_grid_align_t column_align, lv_grid_align_t row_align); + +/** + * Set the cell of an object. The object's parent needs to have grid layout, else nothing will happen + * @param obj pointer to an object + * @param column_align the vertical alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` + * @param col_pos column ID + * @param col_span number of columns to take (>= 1) + * @param row_align the horizontal alignment in the cell. `LV_GRID_START/END/CENTER/STRETCH` + * @param row_pos row ID + * @param row_span number of rows to take (>= 1) + */ +void lv_obj_set_grid_cell(lv_obj_t * obj, lv_grid_align_t column_align, int32_t col_pos, int32_t col_span, + lv_grid_align_t row_align, int32_t row_pos, int32_t row_span); + +/** + * Just a wrapper to `LV_GRID_FR` for bindings. + */ +int32_t lv_grid_fr(uint8_t x); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GRID*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GRID_H*/ diff --git a/inc/lvgl/src/layouts/lv_layout.c b/inc/lvgl/src/layouts/lv_layout.c new file mode 100644 index 0000000..cc6f382 --- /dev/null +++ b/inc/lvgl/src/layouts/lv_layout.c @@ -0,0 +1,103 @@ +/** + * @file lv_layout.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_layout.h" +#include "lv_layout_private.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define layout_cnt LV_GLOBAL_DEFAULT()->layout_count +#define layout_list_def LV_GLOBAL_DEFAULT()->layout_list + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_layout_init(void) +{ + /*Malloc a list for the built in layouts*/ + layout_list_def = lv_malloc(layout_cnt * sizeof(lv_layout_dsc_t)); + +#if LV_USE_FLEX + lv_flex_init(); +#endif + +#if LV_USE_GRID + lv_grid_init(); +#endif +} + +void lv_layout_deinit(void) +{ + lv_free(layout_list_def); +} + +uint32_t lv_layout_create(lv_layout_callbacks_t callbacks, void * user_data) +{ + + layout_list_def = lv_realloc(layout_list_def, (layout_cnt + 1) * sizeof(lv_layout_dsc_t)); + LV_ASSERT_MALLOC(layout_list_def); + + layout_list_def[layout_cnt].callbacks = callbacks; + layout_list_def[layout_cnt].user_data = user_data; + return layout_cnt++; +} + +uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data) +{ + static bool warned = false; + if(!warned) { + LV_LOG_WARN("`lv_layout_register` is deprecated and replaced by `lv_layout_create`."); + warned = true; + } + lv_layout_callbacks_t cbs = {.layout_update_cb = cb, . get_min_size_cb = NULL}; + return lv_layout_create(cbs, user_data); +} + +bool lv_layout_get_min_size(lv_obj_t * obj, int32_t * size, bool width) +{ + lv_layout_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout_id > 0 && layout_id < layout_cnt) { + void * user_data = layout_list_def[layout_id].user_data; + if(layout_list_def[layout_id].callbacks.get_min_size_cb) { + return layout_list_def[layout_id].callbacks.get_min_size_cb(obj, size, width, user_data); + } + } + return false; +} + +void lv_layout_apply(lv_obj_t * obj) +{ + lv_layout_t layout_id = lv_obj_get_style_layout(obj, LV_PART_MAIN); + if(layout_id > 0 && layout_id < layout_cnt) { + void * user_data = layout_list_def[layout_id].user_data; + layout_list_def[layout_id].callbacks.layout_update_cb(obj, user_data); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/layouts/lv_layout.h b/inc/lvgl/src/layouts/lv_layout.h new file mode 100644 index 0000000..56a04ce --- /dev/null +++ b/inc/lvgl/src/layouts/lv_layout.h @@ -0,0 +1,85 @@ +/** + * @file lv_layout.h + * + */ + +#ifndef LV_LAYOUT_H +#define LV_LAYOUT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef void (*lv_layout_update_cb_t)(lv_obj_t *, void * user_data); +typedef bool (*lv_layout_get_min_size_cb_t)(lv_obj_t *, int32_t * req_size, bool width, void * user_data); + +typedef struct { + lv_layout_update_cb_t layout_update_cb; + lv_layout_get_min_size_cb_t get_min_size_cb; +} lv_layout_callbacks_t; + + +typedef enum { + LV_LAYOUT_NONE = 0, + +#if LV_USE_FLEX + LV_LAYOUT_FLEX, +#endif + +#if LV_USE_GRID + LV_LAYOUT_GRID, +#endif + + LV_LAYOUT_LAST +} lv_layout_t; + + +/** + * Create a new layout + * @param callbacks the layout callbacks + * @param user_data custom data that will be passed when a callback is invoked + * @return the ID of the new layout + */ +uint32_t lv_layout_create(lv_layout_callbacks_t callbacks, void * user_data); + +/** + * DEPRECATED: `lv_layout_register` is deprecated. `lv_layout_create` should be used instead. + * + * Register a new layout + * @param cb the layout update callback + * @param user_data custom data that will be passed to `cb` + * @return the ID of the new layout + */ +uint32_t lv_layout_register(lv_layout_update_cb_t cb, void * user_data); + +/********************** + * MACROS + **********************/ + +#if LV_USE_FLEX +#include "flex/lv_flex.h" +#endif /* LV_USE_FLEX */ + +#if LV_USE_GRID +#include "grid/lv_grid.h" +#endif /* LV_USE_GRID */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LAYOUT_H*/ diff --git a/inc/lvgl/src/layouts/lv_layout_private.h b/inc/lvgl/src/layouts/lv_layout_private.h new file mode 100644 index 0000000..32cd5e0 --- /dev/null +++ b/inc/lvgl/src/layouts/lv_layout_private.h @@ -0,0 +1,60 @@ +/** + * @file lv_layout_private.h + * + */ + +#ifndef LV_LAYOUT_PRIVATE_H +#define LV_LAYOUT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_layout.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_layout_callbacks_t callbacks; + void * user_data; +} lv_layout_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_layout_init(void); + +void lv_layout_deinit(void); + +bool lv_layout_get_min_size(lv_obj_t * obj, int32_t * size, bool width); + +/** + * Update the layout of a widget + * @param obj pointer to a widget + */ +void lv_layout_apply(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LAYOUT_PRIVATE_H*/ diff --git a/inc/lvgl/src/libs/FT800-FT813/EVE.h b/inc/lvgl/src/libs/FT800-FT813/EVE.h new file mode 100644 index 0000000..ebce368 --- /dev/null +++ b/inc/lvgl/src/libs/FT800-FT813/EVE.h @@ -0,0 +1,1257 @@ +/* +@file EVE.h +@brief Contains FT80x/FT81x/BT81x API definitions +@version 5.0 +@date 2024-01-28 +@author Rudolph Riedel + +@section LICENSE + +MIT License + +Copyright (c) 2016-2024 Rudolph Riedel + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +@section History + +5.0 +- started to add BT817 / BT818 defines +- cleanup: removed FT80x defines +- replaced BT81X_ENABLE with "EVE_GEN > 2" +- removed FT81X_ENABLE as FT81x already is the lowest supported chip revision now +- added more BT817 / BT818 defines +- removed undocumented registers and commands +- merged FT80x and FT81x definitions as FT81x is baseline now +- removed the history from before 4.0 +- fixed typo: REG_AH_CYCLE_MAX -> REG_AH_HCYCLE_MAX +- re-arranged the host commands, removed EVE_CLKINT for BT817/BT818, + removed FT80x EVE_CLK36M and EVE_CLK48M +- added EVE_OPT_OVERLAY +- removed the 4.0 history +- fixed some MISRA-C issues +- removed macro BEGIN(prim) - use (DL_BEGIN | EVE_BITMAPS) for example +- removed macro END() - use define DL_END +- removed macro RESTORE_CONTEXT() - use define DL_RESTORE_CONTEXT +- removed macro RETURN() - use define DL_RETURN +- removed macro SAVE_CONTEXT() - use define DL_SAVE_CONTEXT +- basic maintenance: checked for violations of white space and indent rules +- more linter fixes +- changed EVE_COMPRESSED_RGBA_ASTC_nxn_KHR to EVE_ASTC_nXn to fix linter + warnings and used the opportunity to make these shorter +- added DL_COLOR_A as alternative to the COLOR_A macro +- added defines for all DL_ display list commands +- cleaned up the macros +- fix: changed DL_CLEAR_RGB to DL_CLEAR_COLOR_RGB + as this is what the programming guide uses +- fix: renamed EVE_ROM_FONT_ADDR to EVE_ROM_FONTROOT +- added #ifdef __cplusplus / extern "C" to allow + adding EVE_ functions to C++ code +- fix: typo REG_COPRO_PATCH_DTR -> REG_COPRO_PATCH_PTR +- started to convert the function-like macros to static inline functions to be + a little friendlier towards C++ in regards of type-safety +- added type-casts to all simple macros +- converted some more function-like macros to static inline functions +- converted the rest of the function-like macros to static inline functions +- fix: forgot to comment out the EVE2 BITMAP_TRANSFORM_E when converting it to an inline function + +*/ + +#ifndef EVE_H +#define EVE_H + +#include "EVE_target.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "EVE_config.h" +#include "EVE_commands.h" + +/* Memory */ +#define EVE_RAM_G ((uint32_t) 0x00000000UL) +#define EVE_ROM_CHIPID ((uint32_t) 0x000C0000UL) +#define EVE_ROM_FONT ((uint32_t) 0x001E0000UL) +#define EVE_ROM_FONTROOT ((uint32_t) 0x002FFFFCUL) +#define EVE_RAM_DL ((uint32_t) 0x00300000UL) +#define EVE_RAM_REG ((uint32_t) 0x00302000UL) +#define EVE_RAM_CMD ((uint32_t) 0x00308000UL) + +/* Memory buffer sizes */ +#define EVE_RAM_G_SIZE ((uint32_t) 1024U*1024UL) +#define EVE_CMDFIFO_SIZE ((uint32_t) 4U*1024UL) +#define EVE_RAM_DL_SIZE ((uint32_t) 8U*1024UL) + +/* diplay list list commands, most need OR's arguments */ +#define DL_DISPLAY ((uint32_t) 0x00000000UL) +#define DL_BITMAP_SOURCE ((uint32_t) 0x01000000UL) +#define DL_CLEAR_COLOR_RGB ((uint32_t) 0x02000000UL) +#define DL_TAG ((uint32_t) 0x03000000UL) +#define DL_COLOR_RGB ((uint32_t) 0x04000000UL) +#define DL_BITMAP_HANDLE ((uint32_t) 0x05000000UL) +#define DL_CELL ((uint32_t) 0x06000000UL) +#define DL_BITMAP_LAYOUT ((uint32_t) 0x07000000UL) +#define DL_BITMAP_SIZE ((uint32_t) 0x08000000UL) +#define DL_ALPHA_FUNC ((uint32_t) 0x09000000UL) +#define DL_STENCIL_FUNC ((uint32_t) 0x0A000000UL) +#define DL_BLEND_FUNC ((uint32_t) 0x0B000000UL) +#define DL_STENCIL_OP ((uint32_t) 0x0C000000UL) +#define DL_POINT_SIZE ((uint32_t) 0x0D000000UL) +#define DL_LINE_WIDTH ((uint32_t) 0x0E000000UL) +#define DL_CLEAR_COLOR_A ((uint32_t) 0x0F000000UL) +#define DL_COLOR_A ((uint32_t) 0x10000000UL) +#define DL_CLEAR_STENCIL ((uint32_t) 0x11000000UL) +#define DL_CLEAR_TAG ((uint32_t) 0x12000000UL) +#define DL_STENCIL_MASK ((uint32_t) 0x13000000UL) +#define DL_TAG_MASK ((uint32_t) 0x14000000UL) +#define DL_BITMAP_TRANSFORM_A ((uint32_t) 0x15000000UL) +#define DL_BITMAP_TRANSFORM_B ((uint32_t) 0x16000000UL) +#define DL_BITMAP_TRANSFORM_C ((uint32_t) 0x17000000UL) +#define DL_BITMAP_TRANSFORM_D ((uint32_t) 0x18000000UL) +#define DL_BITMAP_TRANSFORM_E ((uint32_t) 0x19000000UL) +#define DL_BITMAP_TRANSFORM_F ((uint32_t) 0x1A000000UL) +#define DL_SCISSOR_XY ((uint32_t) 0x1B000000UL) +#define DL_SCISSOR_SIZE ((uint32_t) 0x1C000000UL) +#define DL_CALL ((uint32_t) 0x1D000000UL) +#define DL_JUMP ((uint32_t) 0x1E000000UL) +#define DL_BEGIN ((uint32_t) 0x1F000000UL) +#define DL_COLOR_MASK ((uint32_t) 0x20000000UL) +#define DL_END ((uint32_t) 0x21000000UL) +#define DL_SAVE_CONTEXT ((uint32_t) 0x22000000UL) +#define DL_RESTORE_CONTEXT ((uint32_t) 0x23000000UL) +#define DL_RETURN ((uint32_t) 0x24000000UL) +#define DL_MACRO ((uint32_t) 0x25000000UL) +#define DL_CLEAR ((uint32_t) 0x26000000UL) +#define DL_VERTEX_FORMAT ((uint32_t) 0x27000000UL) +#define DL_BITMAP_LAYOUT_H ((uint32_t) 0x28000000UL) +#define DL_BITMAP_SIZE_H ((uint32_t) 0x29000000UL) +#define DL_PALETTE_SOURCE ((uint32_t) 0x2A000000UL) +#define DL_VERTEX_TRANSLATE_X ((uint32_t) 0x2B000000UL) +#define DL_VERTEX_TRANSLATE_Y ((uint32_t) 0x2C000000UL) +#define DL_NOP ((uint32_t) 0x2D000000UL) + +#define DL_VERTEX2F ((uint32_t) 0x40000000UL) +#define DL_VERTEX2II ((uint32_t) 0x80000000UL) + +#define CLR_COL ((uint8_t) 0x4U) +#define CLR_STN ((uint8_t) 0x2U) +#define CLR_TAG ((uint8_t) 0x1U) + +/* Host commands */ +#define EVE_ACTIVE ((uint8_t) 0x00U) /* place EVE in active state */ +#define EVE_STANDBY ((uint8_t) 0x41U) /* place EVE in Standby (clk running) */ +#define EVE_SLEEP ((uint8_t) 0x42U) /* place EVE in Sleep (clk off) */ +#define EVE_CLKEXT ((uint8_t) 0x44U) /* select external clock source */ +#define EVE_CLKINT ((uint8_t) 0x48U) /* select internal clock source, not a valid option for BT817 / BT818 */ +#define EVE_PWRDOWN ((uint8_t) 0x50U) /* place EVE in Power Down (core off) */ +#define EVE_CLKSEL ((uint8_t) 0x61U) /* configure system clock */ +#define EVE_RST_PULSE ((uint8_t) 0x68U) /* reset core - all registers default and processors reset */ +#define EVE_CORERST ((uint8_t) 0x68U) /* reset core - all registers default and processors reset */ +#define EVE_PINDRIVE ((uint8_t) 0x70U) /* setup drive strength for various pins */ +#define EVE_PIN_PD_STATE ((uint8_t) 0x71U) /* setup how pins behave during power down */ + +/* Graphic command defines */ +#define EVE_NEVER ((uint8_t) 0UL) +#define EVE_LESS ((uint8_t) 1UL) +#define EVE_LEQUAL ((uint8_t) 2UL) +#define EVE_GREATER ((uint8_t) 3UL) +#define EVE_GEQUAL ((uint8_t) 4UL) +#define EVE_EQUAL ((uint8_t) 5UL) +#define EVE_NOTEQUAL ((uint8_t) 6UL) +#define EVE_ALWAYS ((uint8_t) 7UL) + +/* Bitmap formats */ +#define EVE_ARGB1555 ((uint8_t) 0UL) +#define EVE_L1 ((uint8_t) 1UL) +#define EVE_L4 ((uint8_t) 2UL) +#define EVE_L8 ((uint8_t) 3UL) +#define EVE_RGB332 ((uint8_t) 4UL) +#define EVE_ARGB2 ((uint8_t) 5UL) +#define EVE_ARGB4 ((uint8_t) 6UL) +#define EVE_RGB565 ((uint8_t) 7UL) +#define EVE_PALETTED ((uint8_t) 8UL) +#define EVE_TEXT8X8 ((uint8_t) 9UL) +#define EVE_TEXTVGA ((uint8_t) 10UL) +#define EVE_BARGRAPH ((uint8_t) 11UL) + +/* Bitmap filter types */ +#define EVE_NEAREST ((uint8_t) 0UL) +#define EVE_BILINEAR ((uint8_t) 1UL) + +/* Bitmap wrap types */ +#define EVE_BORDER ((uint8_t) 0UL) +#define EVE_REPEAT ((uint8_t) 1UL) + +/* Stencil defines */ +#define EVE_KEEP ((uint8_t) 1UL) +#define EVE_REPLACE ((uint8_t) 2UL) +#define EVE_INCR ((uint8_t) 3UL) +#define EVE_DECR ((uint8_t) 4UL) +#define EVE_INVERT ((uint8_t) 5UL) + +/* Graphics display list swap defines */ +#define EVE_DLSWAP_DONE ((uint8_t) 0UL) +#define EVE_DLSWAP_LINE ((uint8_t) 1UL) +#define EVE_DLSWAP_FRAME ((uint8_t) 2UL) + +/* Interrupt bits */ +#define EVE_INT_SWAP ((uint8_t) 0x01) +#define EVE_INT_TOUCH ((uint8_t) 0x02) +#define EVE_INT_TAG ((uint8_t) 0x04) +#define EVE_INT_SOUND ((uint8_t) 0x08) +#define EVE_INT_PLAYBACK ((uint8_t) 0x10) +#define EVE_INT_CMDEMPTY ((uint8_t) 0x20) +#define EVE_INT_CMDFLAG ((uint8_t) 0x40) +#define EVE_INT_CONVCOMPLETE ((uint8_t) 0x80) + +/* Touch mode */ +#define EVE_TMODE_OFF ((uint8_t) 0U) +#define EVE_TMODE_ONESHOT ((uint8_t) 1U) +#define EVE_TMODE_FRAME ((uint8_t) 2U) +#define EVE_TMODE_CONTINUOUS ((uint8_t) 3U) + +/* Alpha blending */ +#define EVE_ZERO ((uint32_t) 0UL) +#define EVE_ONE ((uint32_t) 1UL) +#define EVE_SRC_ALPHA ((uint32_t) 2UL) +#define EVE_DST_ALPHA ((uint32_t) 3UL) +#define EVE_ONE_MINUS_SRC_ALPHA ((uint32_t) 4UL) +#define EVE_ONE_MINUS_DST_ALPHA ((uint32_t) 5UL) + +/* Graphics primitives */ +#define EVE_BITMAPS ((uint32_t) 1UL) +#define EVE_POINTS ((uint32_t) 2UL) +#define EVE_LINES ((uint32_t) 3UL) +#define EVE_LINE_STRIP ((uint32_t) 4UL) +#define EVE_EDGE_STRIP_R ((uint32_t) 5UL) +#define EVE_EDGE_STRIP_L ((uint32_t) 6UL) +#define EVE_EDGE_STRIP_A ((uint32_t) 7UL) +#define EVE_EDGE_STRIP_B ((uint32_t) 8UL) +#define EVE_RECTS ((uint32_t) 9UL) +#define EVE_INT_G8 ((uint32_t) 18UL) +#define EVE_INT_L8C ((uint32_t) 12UL) +#define EVE_INT_VGA ((uint32_t) 13UL) +#define EVE_PALETTED565 ((uint32_t) 14UL) +#define EVE_PALETTED4444 ((uint32_t) 15UL) +#define EVE_PALETTED8 ((uint32_t) 16UL) +#define EVE_L2 ((uint32_t) 17UL) + +/* Widget command options */ +#define EVE_OPT_MONO ((uint16_t) 1U) +#define EVE_OPT_NODL ((uint16_t) 2U) +#define EVE_OPT_FLAT ((uint16_t) 256U) +#define EVE_OPT_CENTERX ((uint16_t) 512U) +#define EVE_OPT_CENTERY ((uint16_t) 1024U) +#define EVE_OPT_CENTER (EVE_OPT_CENTERX | EVE_OPT_CENTERY) +#define EVE_OPT_NOBACK ((uint16_t) 4096U) +#define EVE_OPT_NOTICKS ((uint16_t) 8192U) +#define EVE_OPT_NOHM ((uint16_t) 16384U) +#define EVE_OPT_NOPOINTER ((uint16_t) 16384U) +#define EVE_OPT_NOSECS ((uint16_t) 32768U) +#define EVE_OPT_NOHANDS ((uint16_t) 49152U) +#define EVE_OPT_RIGHTX ((uint16_t) 2048U) +#define EVE_OPT_SIGNED ((uint16_t) 256U) + +#define EVE_OPT_MEDIAFIFO ((uint16_t) 16U) +#define EVE_OPT_FULLSCREEN ((uint16_t) 8U) +#define EVE_OPT_NOTEAR ((uint16_t) 4U) +#define EVE_OPT_SOUND ((uint16_t) 32U) + +/* ADC */ +#define EVE_ADC_DIFFERENTIAL ((uint32_t) 1UL) +#define EVE_ADC_SINGLE_ENDED ((uint32_t) 0UL) + +/* Fonts */ +#define EVE_NUMCHAR_PERFONT ((uint32_t) 128UL) /* number of font characters per bitmap handle */ +#define EVE_FONT_TABLE_SIZE ((uint32_t) 148UL) /* size of the font table - utilized for loopup by the graphics engine */ +#define EVE_FONT_TABLE_POINTER ((uint32_t) 0xFFFFCUL) /* pointer to the inbuilt font tables starting from bitmap handle 16 */ + +/* Audio sample type defines */ +#define EVE_LINEAR_SAMPLES ((uint32_t) 0UL) /* 8bit signed samples */ +#define EVE_ULAW_SAMPLES ((uint32_t) 1UL) /* 8bit ulaw samples */ +#define EVE_ADPCM_SAMPLES ((uint32_t) 2UL) /* 4bit ima adpcm samples */ + +/* Synthesized sound */ +#define EVE_SILENCE ((uint8_t) 0x00U) +#define EVE_SQUAREWAVE ((uint8_t) 0x01U) +#define EVE_SINEWAVE ((uint8_t) 0x02U) +#define EVE_SAWTOOTH ((uint8_t) 0x03U) +#define EVE_TRIANGLE ((uint8_t) 0x04U) +#define EVE_BEEPING ((uint8_t) 0x05U) +#define EVE_ALARM ((uint8_t) 0x06U) +#define EVE_WARBLE ((uint8_t) 0x07U) +#define EVE_CAROUSEL ((uint8_t) 0x08U) +#define EVE_PIPS(n) ((uint8_t) (0x0FU + (n))) +#define EVE_HARP ((uint8_t) 0x40U) +#define EVE_XYLOPHONE ((uint8_t) 0x41U) +#define EVE_TUBA ((uint8_t) 0x42U) +#define EVE_GLOCKENSPIEL ((uint8_t) 0x43U) +#define EVE_ORGAN ((uint8_t) 0x44U) +#define EVE_TRUMPET ((uint8_t) 0x45U) +#define EVE_PIANO ((uint8_t) 0x46U) +#define EVE_CHIMES ((uint8_t) 0x47U) +#define EVE_MUSICBOX ((uint8_t) 0x48U) +#define EVE_BELL ((uint8_t) 0x49U) +#define EVE_CLICK ((uint8_t) 0x50U) +#define EVE_SWITCH ((uint8_t) 0x51U) +#define EVE_COWBELL ((uint8_t) 0x52U) +#define EVE_NOTCH ((uint8_t) 0x53U) +#define EVE_HIHAT ((uint8_t) 0x54U) +#define EVE_KICKDRUM ((uint8_t) 0x55U) +#define EVE_POP ((uint8_t) 0x56U) +#define EVE_CLACK ((uint8_t) 0x57U) +#define EVE_CHACK ((uint8_t) 0x58U) +#define EVE_MUTE ((uint8_t) 0x60U) +#define EVE_UNMUTE ((uint8_t) 0x61U) + +/* Synthesized sound frequencies, midi note */ +#define EVE_MIDI_A0 ((uint8_t) 21U) +#define EVE_MIDI_A_0 ((uint8_t) 22U) +#define EVE_MIDI_B0 ((uint8_t) 23U) +#define EVE_MIDI_C1 ((uint8_t) 24U) +#define EVE_MIDI_C_1 ((uint8_t) 25U) +#define EVE_MIDI_D1 ((uint8_t) 26U) +#define EVE_MIDI_D_1 ((uint8_t) 27U) +#define EVE_MIDI_E1 ((uint8_t) 28U) +#define EVE_MIDI_F1 ((uint8_t) 29U) +#define EVE_MIDI_F_1 ((uint8_t) 30U) +#define EVE_MIDI_G1 ((uint8_t) 31U) +#define EVE_MIDI_G_1 ((uint8_t) 32U) +#define EVE_MIDI_A1 ((uint8_t) 33U) +#define EVE_MIDI_A_1 ((uint8_t) 34U) +#define EVE_MIDI_B1 ((uint8_t) 35U) +#define EVE_MIDI_C2 ((uint8_t) 36U) +#define EVE_MIDI_C_2 ((uint8_t) 37U) +#define EVE_MIDI_D2 ((uint8_t) 38U) +#define EVE_MIDI_D_2 ((uint8_t) 39U) +#define EVE_MIDI_E2 ((uint8_t) 40U) +#define EVE_MIDI_F2 ((uint8_t) 41U) +#define EVE_MIDI_F_2 ((uint8_t) 42U) +#define EVE_MIDI_G2 ((uint8_t) 43U) +#define EVE_MIDI_G_2 ((uint8_t) 44U) +#define EVE_MIDI_A2 ((uint8_t) 45U) +#define EVE_MIDI_A_2 ((uint8_t) 46U) +#define EVE_MIDI_B2 ((uint8_t) 47U) +#define EVE_MIDI_C3 ((uint8_t) 48U) +#define EVE_MIDI_C_3 ((uint8_t) 49U) +#define EVE_MIDI_D3 ((uint8_t) 50U) +#define EVE_MIDI_D_3 ((uint8_t) 51U) +#define EVE_MIDI_E3 ((uint8_t) 52U) +#define EVE_MIDI_F3 ((uint8_t) 53U) +#define EVE_MIDI_F_3 ((uint8_t) 54U) +#define EVE_MIDI_G3 ((uint8_t) 55U) +#define EVE_MIDI_G_3 ((uint8_t) 56U) +#define EVE_MIDI_A3 ((uint8_t) 57U) +#define EVE_MIDI_A_3 ((uint8_t) 58U) +#define EVE_MIDI_B3 ((uint8_t) 59U) +#define EVE_MIDI_C4 ((uint8_t) 60U) +#define EVE_MIDI_C_4 ((uint8_t) 61U) +#define EVE_MIDI_D4 ((uint8_t) 62U) +#define EVE_MIDI_D_4 ((uint8_t) 63U) +#define EVE_MIDI_E4 ((uint8_t) 64U) +#define EVE_MIDI_F4 ((uint8_t) 65U) +#define EVE_MIDI_F_4 ((uint8_t) 66U) +#define EVE_MIDI_G4 ((uint8_t) 67U) +#define EVE_MIDI_G_4 ((uint8_t) 68U) +#define EVE_MIDI_A4 ((uint8_t) 69U) +#define EVE_MIDI_A_4 ((uint8_t) 70U) +#define EVE_MIDI_B4 ((uint8_t) 71U) +#define EVE_MIDI_C5 ((uint8_t) 72U) +#define EVE_MIDI_C_5 ((uint8_t) 73U) +#define EVE_MIDI_D5 ((uint8_t) 74U) +#define EVE_MIDI_D_5 ((uint8_t) 75U) +#define EVE_MIDI_E5 ((uint8_t) 76U) +#define EVE_MIDI_F5 ((uint8_t) 77U) +#define EVE_MIDI_F_5 ((uint8_t) 78U) +#define EVE_MIDI_G5 ((uint8_t) 79U) +#define EVE_MIDI_G_5 ((uint8_t) 80U) +#define EVE_MIDI_A5 ((uint8_t) 81U) +#define EVE_MIDI_A_5 ((uint8_t) 82U) +#define EVE_MIDI_B5 ((uint8_t) 83U) +#define EVE_MIDI_C6 ((uint8_t) 84U) +#define EVE_MIDI_C_6 ((uint8_t) 85U) +#define EVE_MIDI_D6 ((uint8_t) 86U) +#define EVE_MIDI_D_6 ((uint8_t) 87U) +#define EVE_MIDI_E6 ((uint8_t) 88U) +#define EVE_MIDI_F6 ((uint8_t) 89U) +#define EVE_MIDI_F_6 ((uint8_t) 90U) +#define EVE_MIDI_G6 ((uint8_t) 91U) +#define EVE_MIDI_G_6 ((uint8_t) 92U) +#define EVE_MIDI_A6 ((uint8_t) 93U) +#define EVE_MIDI_A_6 ((uint8_t) 94U) +#define EVE_MIDI_B6 ((uint8_t) 95U) +#define EVE_MIDI_C7 ((uint8_t) 96U) +#define EVE_MIDI_C_7 ((uint8_t) 97U) +#define EVE_MIDI_D7 ((uint8_t) 98U) +#define EVE_MIDI_D_7 ((uint8_t) 99U) +#define EVE_MIDI_E7 ((uint8_t) 100U) +#define EVE_MIDI_F7 ((uint8_t) 101U) +#define EVE_MIDI_F_7 ((uint8_t) 102U) +#define EVE_MIDI_G7 ((uint8_t) 103U) +#define EVE_MIDI_G_7 ((uint8_t) 104U) +#define EVE_MIDI_A7 ((uint8_t) 105U) +#define EVE_MIDI_A_7 ((uint8_t) 106U) +#define EVE_MIDI_B7 ((uint8_t) 107U) +#define EVE_MIDI_C8 ((uint8_t) 108U) + +/* GPIO bits */ +#define EVE_GPIO0 ((uint8_t) 0U) +#define EVE_GPIO1 ((uint8_t) 1U) /* default gpio pin for audio shutdown, 1 - enable, 0 - disable */ +#define EVE_GPIO7 ((uint8_t) 7U) /* default gpio pin for display enable, 1 - enable, 0 - disable */ + +/* Display rotation */ +#define EVE_DISPLAY_0 ((uint8_t) 0U) /* 0 degrees rotation */ +#define EVE_DISPLAY_180 ((uint8_t) 1U) /* 180 degrees rotation */ + +/* Commands */ +#define CMD_APPEND ((uint32_t) 0xFFFFFF1EUL) +#define CMD_BGCOLOR ((uint32_t) 0xFFFFFF09UL) +#define CMD_BUTTON ((uint32_t) 0xFFFFFF0DUL) +#define CMD_CALIBRATE ((uint32_t) 0xFFFFFF15UL) +#define CMD_CLOCK ((uint32_t) 0xFFFFFF14UL) +#define CMD_COLDSTART ((uint32_t) 0xFFFFFF32UL) +#define CMD_DIAL ((uint32_t) 0xFFFFFF2DUL) +#define CMD_DLSTART ((uint32_t) 0xFFFFFF00UL) +#define CMD_FGCOLOR ((uint32_t) 0xFFFFFF0AUL) +#define CMD_GAUGE ((uint32_t) 0xFFFFFF13UL) +#define CMD_GETMATRIX ((uint32_t) 0xFFFFFF33UL) +#define CMD_GETPROPS ((uint32_t) 0xFFFFFF25UL) +#define CMD_GETPTR ((uint32_t) 0xFFFFFF23UL) +#define CMD_GRADCOLOR ((uint32_t) 0xFFFFFF34UL) +#define CMD_GRADIENT ((uint32_t) 0xFFFFFF0BUL) +#define CMD_INFLATE ((uint32_t) 0xFFFFFF22UL) +#define CMD_INTERRUPT ((uint32_t) 0xFFFFFF02UL) +#define CMD_KEYS ((uint32_t) 0xFFFFFF0EUL) +#define CMD_LOADIDENTITY ((uint32_t) 0xFFFFFF26UL) +#define CMD_LOADIMAGE ((uint32_t) 0xFFFFFF24UL) +#define CMD_LOGO ((uint32_t) 0xFFFFFF31UL) +#define CMD_MEDIAFIFO ((uint32_t) 0xFFFFFF39UL) +#define CMD_MEMCPY ((uint32_t) 0xFFFFFF1DUL) +#define CMD_MEMCRC ((uint32_t) 0xFFFFFF18UL) +#define CMD_MEMSET ((uint32_t) 0xFFFFFF1BUL) +#define CMD_MEMWRITE ((uint32_t) 0xFFFFFF1AUL) +#define CMD_MEMZERO ((uint32_t) 0xFFFFFF1CUL) +#define CMD_NUMBER ((uint32_t) 0xFFFFFF2EUL) +#define CMD_PLAYVIDEO ((uint32_t) 0xFFFFFF3AUL) +#define CMD_PROGRESS ((uint32_t) 0xFFFFFF0FUL) +#define CMD_REGREAD ((uint32_t) 0xFFFFFF19UL) +#define CMD_ROMFONT ((uint32_t) 0xFFFFFF3FUL) +#define CMD_ROTATE ((uint32_t) 0xFFFFFF29UL) +#define CMD_SCALE ((uint32_t) 0xFFFFFF28UL) +#define CMD_SCREENSAVER ((uint32_t) 0xFFFFFF2FUL) +#define CMD_SCROLLBAR ((uint32_t) 0xFFFFFF11UL) +#define CMD_SETBASE ((uint32_t) 0xFFFFFF38UL) +#define CMD_SETBITMAP ((uint32_t) 0xFFFFFF43UL) +#define CMD_SETFONT ((uint32_t) 0xFFFFFF2BUL) +#define CMD_SETFONT2 ((uint32_t) 0xFFFFFF3BUL) +#define CMD_SETMATRIX ((uint32_t) 0xFFFFFF2AUL) +#define CMD_SETROTATE ((uint32_t) 0xFFFFFF36UL) +#define CMD_SETSCRATCH ((uint32_t) 0xFFFFFF3CUL) +#define CMD_SKETCH ((uint32_t) 0xFFFFFF30UL) +#define CMD_SLIDER ((uint32_t) 0xFFFFFF10UL) +#define CMD_SNAPSHOT ((uint32_t) 0xFFFFFF1FUL) +#define CMD_SNAPSHOT2 ((uint32_t) 0xFFFFFF37UL) +#define CMD_SPINNER ((uint32_t) 0xFFFFFF16UL) +#define CMD_STOP ((uint32_t) 0xFFFFFF17UL) +#define CMD_SWAP ((uint32_t) 0xFFFFFF01UL) +#define CMD_TEXT ((uint32_t) 0xFFFFFF0CUL) +#define CMD_TOGGLE ((uint32_t) 0xFFFFFF12UL) +#define CMD_TRACK ((uint32_t) 0xFFFFFF2CUL) +#define CMD_TRANSLATE ((uint32_t) 0xFFFFFF27UL) +#define CMD_VIDEOFRAME ((uint32_t) 0xFFFFFF41UL) +#define CMD_VIDEOSTART ((uint32_t) 0xFFFFFF40UL) + +/* Registers */ +#define REG_ANA_COMP ((uint32_t) 0x00302184UL) /* only listed in datasheet */ +#define REG_BIST_EN ((uint32_t) 0x00302174UL) /* only listed in datasheet */ +#define REG_CLOCK ((uint32_t) 0x00302008UL) +#define REG_CMDB_SPACE ((uint32_t) 0x00302574UL) +#define REG_CMDB_WRITE ((uint32_t) 0x00302578UL) +#define REG_CMD_DL ((uint32_t) 0x00302100UL) +#define REG_CMD_READ ((uint32_t) 0x003020f8UL) +#define REG_CMD_WRITE ((uint32_t) 0x003020fcUL) +#define REG_CPURESET ((uint32_t) 0x00302020UL) +#define REG_CSPREAD ((uint32_t) 0x00302068UL) +#define REG_CTOUCH_EXTENDED ((uint32_t) 0x00302108UL) +#define REG_CTOUCH_TOUCH0_XY ((uint32_t) 0x00302124UL) /* only listed in datasheet */ +#define REG_CTOUCH_TOUCH4_X ((uint32_t) 0x0030216cUL) +#define REG_CTOUCH_TOUCH4_Y ((uint32_t) 0x00302120UL) +#define REG_CTOUCH_TOUCH1_XY ((uint32_t) 0x0030211cUL) +#define REG_CTOUCH_TOUCH2_XY ((uint32_t) 0x0030218cUL) +#define REG_CTOUCH_TOUCH3_XY ((uint32_t) 0x00302190UL) +#define REG_TOUCH_CONFIG ((uint32_t) 0x00302168UL) +#define REG_DATESTAMP ((uint32_t) 0x00302564UL) /* only listed in datasheet */ +#define REG_DITHER ((uint32_t) 0x00302060UL) +#define REG_DLSWAP ((uint32_t) 0x00302054UL) +#define REG_FRAMES ((uint32_t) 0x00302004UL) +#define REG_FREQUENCY ((uint32_t) 0x0030200cUL) +#define REG_GPIO ((uint32_t) 0x00302094UL) +#define REG_GPIOX ((uint32_t) 0x0030209cUL) +#define REG_GPIOX_DIR ((uint32_t) 0x00302098UL) +#define REG_GPIO_DIR ((uint32_t) 0x00302090UL) +#define REG_HCYCLE ((uint32_t) 0x0030202cUL) +#define REG_HOFFSET ((uint32_t) 0x00302030UL) +#define REG_HSIZE ((uint32_t) 0x00302034UL) +#define REG_HSYNC0 ((uint32_t) 0x00302038UL) +#define REG_HSYNC1 ((uint32_t) 0x0030203cUL) +#define REG_ID ((uint32_t) 0x00302000UL) +#define REG_INT_EN ((uint32_t) 0x003020acUL) +#define REG_INT_FLAGS ((uint32_t) 0x003020a8UL) +#define REG_INT_MASK ((uint32_t) 0x003020b0UL) +#define REG_MACRO_0 ((uint32_t) 0x003020d8UL) +#define REG_MACRO_1 ((uint32_t) 0x003020dcUL) +#define REG_MEDIAFIFO_READ ((uint32_t) 0x00309014UL) /* only listed in programmers guide */ +#define REG_MEDIAFIFO_WRITE ((uint32_t) 0x00309018UL) /* only listed in programmers guide */ +#define REG_OUTBITS ((uint32_t) 0x0030205cUL) +#define REG_PCLK ((uint32_t) 0x00302070UL) +#define REG_PCLK_POL ((uint32_t) 0x0030206cUL) +#define REG_PLAY ((uint32_t) 0x0030208cUL) +#define REG_PLAYBACK_FORMAT ((uint32_t) 0x003020c4UL) +#define REG_PLAYBACK_FREQ ((uint32_t) 0x003020c0UL) +#define REG_PLAYBACK_LENGTH ((uint32_t) 0x003020b8UL) +#define REG_PLAYBACK_LOOP ((uint32_t) 0x003020c8UL) +#define REG_PLAYBACK_PLAY ((uint32_t) 0x003020ccUL) +#define REG_PLAYBACK_READPTR ((uint32_t) 0x003020bcUL) +#define REG_PLAYBACK_START ((uint32_t) 0x003020b4UL) +#define REG_PWM_DUTY ((uint32_t) 0x003020d4UL) +#define REG_PWM_HZ ((uint32_t) 0x003020d0UL) +#define REG_RENDERMODE ((uint32_t) 0x00302010UL) /* only listed in datasheet */ +#define REG_ROTATE ((uint32_t) 0x00302058UL) +#define REG_SNAPFORMAT ((uint32_t) 0x0030201cUL) /* only listed in datasheet */ +#define REG_SNAPSHOT ((uint32_t) 0x00302018UL) /* only listed in datasheet */ +#define REG_SNAPY ((uint32_t) 0x00302014UL) /* only listed in datasheet */ +#define REG_SOUND ((uint32_t) 0x00302088UL) +#define REG_SPI_WIDTH ((uint32_t) 0x00302188UL) /* listed with false offset in programmers guide V1.1 */ +#define REG_SWIZZLE ((uint32_t) 0x00302064UL) +#define REG_TAG ((uint32_t) 0x0030207cUL) +#define REG_TAG_X ((uint32_t) 0x00302074UL) +#define REG_TAG_Y ((uint32_t) 0x00302078UL) +#define REG_TAP_CRC ((uint32_t) 0x00302024UL) /* only listed in datasheet */ +#define REG_TAP_MASK ((uint32_t) 0x00302028UL) /* only listed in datasheet */ +#define REG_TOUCH_ADC_MODE ((uint32_t) 0x00302108UL) +#define REG_TOUCH_CHARGE ((uint32_t) 0x0030210cUL) +#define REG_TOUCH_DIRECT_XY ((uint32_t) 0x0030218cUL) +#define REG_TOUCH_DIRECT_Z1Z2 ((uint32_t) 0x00302190UL) +#define REG_TOUCH_MODE ((uint32_t) 0x00302104UL) +#define REG_TOUCH_OVERSAMPLE ((uint32_t) 0x00302114UL) +#define REG_TOUCH_RAW_XY ((uint32_t) 0x0030211cUL) +#define REG_TOUCH_RZ ((uint32_t) 0x00302120UL) +#define REG_TOUCH_RZTHRESH ((uint32_t) 0x00302118UL) +#define REG_TOUCH_SCREEN_XY ((uint32_t) 0x00302124UL) +#define REG_TOUCH_SETTLE ((uint32_t) 0x00302110UL) +#define REG_TOUCH_TAG ((uint32_t) 0x0030212cUL) +#define REG_TOUCH_TAG1 ((uint32_t) 0x00302134UL) /* only listed in datasheet */ +#define REG_TOUCH_TAG1_XY ((uint32_t) 0x00302130UL) /* only listed in datasheet */ +#define REG_TOUCH_TAG2 ((uint32_t) 0x0030213cUL) /* only listed in datasheet */ +#define REG_TOUCH_TAG2_XY ((uint32_t) 0x00302138UL) /* only listed in datasheet */ +#define REG_TOUCH_TAG3 ((uint32_t) 0x00302144UL) /* only listed in datasheet */ +#define REG_TOUCH_TAG3_XY ((uint32_t) 0x00302140UL) /* only listed in datasheet */ +#define REG_TOUCH_TAG4 ((uint32_t) 0x0030214cUL)/* only listed in datasheet */ +#define REG_TOUCH_TAG4_XY ((uint32_t) 0x00302148UL) /* only listed in datasheet */ +#define REG_TOUCH_TAG_XY ((uint32_t) 0x00302128UL) +#define REG_TOUCH_TRANSFORM_A ((uint32_t) 0x00302150UL) +#define REG_TOUCH_TRANSFORM_B ((uint32_t) 0x00302154UL) +#define REG_TOUCH_TRANSFORM_C ((uint32_t) 0x00302158UL) +#define REG_TOUCH_TRANSFORM_D ((uint32_t) 0x0030215cUL) +#define REG_TOUCH_TRANSFORM_E ((uint32_t) 0x00302160UL) +#define REG_TOUCH_TRANSFORM_F ((uint32_t) 0x00302164UL) +#define REG_TRACKER ((uint32_t) 0x00309000UL) /* only listed in programmers guide */ +#define REG_TRACKER_1 ((uint32_t) 0x00309004UL) /* only listed in programmers guide */ +#define REG_TRACKER_2 ((uint32_t) 0x00309008UL) /* only listed in programmers guide */ +#define REG_TRACKER_3 ((uint32_t) 0x0030900cUL) /* only listed in programmers guide */ +#define REG_TRACKER_4 ((uint32_t) 0x00309010UL) /* only listed in programmers guide */ +#define REG_TRIM ((uint32_t) 0x00302180UL) +#define REG_VCYCLE ((uint32_t) 0x00302040UL) +#define REG_VOFFSET ((uint32_t) 0x00302044UL) +#define REG_VOL_PB ((uint32_t) 0x00302080UL) +#define REG_VOL_SOUND ((uint32_t) 0x00302084UL) +#define REG_VSIZE ((uint32_t) 0x00302048UL) +#define REG_VSYNC0 ((uint32_t) 0x0030204cUL) +#define REG_VSYNC1 ((uint32_t) 0x00302050UL) + + +/* Macros for static display list generation */ + +//#define ALPHA_FUNC(func,ref) ((DL_ALPHA_FUNC) | (((func) & 7UL) << 8U) | ((ref) & 0xFFUL)) +/** + * @brief Set the alpha test function. + * + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t ALPHA_FUNC(uint8_t func, uint8_t ref) +{ + uint32_t const funcv = ((uint32_t) func & 7U) << 8U; + return (DL_ALPHA_FUNC | funcv | ref); +} + +//#define BITMAP_HANDLE(handle) ((DL_BITMAP_HANDLE) | ((handle) & 0x1FUL)) +/** + * @brief Set the bitmap handle. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_HANDLE(uint8_t handle) +{ + return (DL_BITMAP_HANDLE | ((handle) & 0x1FUL)); +} + +//#define BITMAP_LAYOUT(format,linestride,height) ((DL_BITMAP_LAYOUT) | (((format) & 0x1FUL) << 19U) | (((linestride) & 0x3FFUL) << 9U) | ((height) & 0x1FFUL)) +/** + * @brief Set the source bitmap memory format and layout for the current handle. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_LAYOUT(uint8_t format, uint16_t linestride, uint16_t height) +{ + uint32_t const formatv = ((uint32_t) format & 0x1FUL) << 19U; + uint32_t const linestridev = ((uint32_t) linestride & 0x3FFUL) << 9U; + uint32_t const heightv = height & 0x1FFUL; + return (DL_BITMAP_LAYOUT | formatv | linestridev | heightv); +} + +//#define BITMAP_SIZE(filter,wrapx,wrapy,width,height) ((DL_BITMAP_SIZE) | (((filter) & 1UL) << 20U) | (((wrapx) & 1UL) << 19U) | (((wrapy) & 1UL) << 18U) | (((width) & 0x1FFUL) << 9U) | ((height) & 0x1FFUL)) +/** + * @brief Set the source bitmap memory format and layout for the current handle. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_SIZE(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height) +{ + uint32_t const filterv = (filter & 0x1UL) << 20U; + uint32_t const wrapxv = (wrapx & 0x1UL) << 19U; + uint32_t const wrapyv = (wrapy & 0x1UL) << 18U; + uint32_t const widthv = (width & 0x1FFUL) << 9U; + uint32_t const heightv = height & 0x1FFUL; + return (DL_BITMAP_SIZE | filterv | wrapxv | wrapyv | widthv | heightv); +} + +//#define BITMAP_LAYOUT_H(linestride,height) ((DL_BITMAP_LAYOUT_H) | (((((linestride) & 0xC00U) >> 10U)&3UL) << 2U) | ((((height) & 0x600U) >> 9U) & 3UL)) +/** + * @brief Set the 2 most significant bits of the source bitmap memory format and layout for the current handle. + * @param linestride 12-bit value specified to BITMAP_LAYOUT + * @param height 11-bit value specified to BITMAP_LAYOUT + * @note this is different to FTDIs implementation as this takes the original values as parameters and not only the upper bits + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_LAYOUT_H(uint16_t linestride, uint16_t height) +{ + uint32_t const linestridev = (uint32_t) ((((linestride & 0xC00U) >> 10U) &3UL) << 2U); + uint32_t const heightv = (uint32_t) (((height & 0x600U) >> 9U) & 3UL); + return (DL_BITMAP_LAYOUT_H | linestridev | heightv); +} + +//#define BITMAP_SIZE_H(width,height) ((DL_BITMAP_SIZE_H) | (((((width) & 0x600U) >> 9U) & 3UL) << 2U) | ((((height) & 0x600U) >> 9U) & 3UL)) +/** + * @brief Set the 2 most significant bits of bitmaps dimension for the current handle. + * @param linestride 11-bit value of bitmap width, the 2 most significant bits are used + * @param height 11-bit value of bitmap width, the 2 most significant bits are used + * @note this is different to FTDIs implementation as this takes the original values as parameters and not only the upper bits + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_SIZE_H(uint16_t width, uint16_t height) +{ + uint32_t const widthv = (uint32_t) ((((width & 0x600U) >> 9U) & 3UL) << 2U); + uint32_t const heightv = (uint32_t) (((height & 0x600U) >> 9U) & 3UL); + return ((DL_BITMAP_SIZE_H) | widthv | heightv); +} + +//#define BITMAP_SOURCE(addr) ((DL_BITMAP_SOURCE) | ((addr) & 0x3FFFFFUL)) +/** + * @brief Set the source address of bitmap data in RAM_G or flash memory. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_SOURCE(uint32_t addr) +{ + return (DL_BITMAP_SOURCE | (addr & 0x3FFFFFUL)); +} + +#if EVE_GEN < 3 /* only define these for FT81x */ +//#define BITMAP_TRANSFORM_A(a) ((DL_BITMAP_TRANSFORM_A) | ((a) & 0x1FFFFUL)) +/** + * @brief Set the A coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_A(uint32_t val) +{ + return (DL_BITMAP_TRANSFORM_A | (val & 0x1FFFFUL)); +} + +//#define BITMAP_TRANSFORM_B(b) ((DL_BITMAP_TRANSFORM_B) | ((b) & 0x1FFFFUL)) +/** + * @brief Set the B coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_B(uint32_t val) +{ + return (DL_BITMAP_TRANSFORM_B | (val & 0x1FFFFUL)); +} + +//#define BITMAP_TRANSFORM_D(d) ((DL_BITMAP_TRANSFORM_D) | ((d) & 0x1FFFFUL)) +/** + * @brief Set the D coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_D(uint32_t val) +{ + return (DL_BITMAP_TRANSFORM_D | (val & 0x1FFFFUL)); +} + +//#define BITMAP_TRANSFORM_E(e) ((DL_BITMAP_TRANSFORM_E) | ((e) & 0x1FFFFUL)) +/** + * @brief Set he E coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_E(uint32_t val) +{ + return (DL_BITMAP_TRANSFORM_E | (val & 0x1FFFFUL)); +} + +#endif + +//#define BITMAP_TRANSFORM_C(c) ((DL_BITMAP_TRANSFORM_C) | ((c) & 0x1FFFFUL)) +/** + * @brief Set the C coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_C(uint32_t val) +{ + return (DL_BITMAP_TRANSFORM_C | (val & 0x1FFFFUL)); +} + +//#define BITMAP_TRANSFORM_F(f) ((DL_BITMAP_TRANSFORM_F) | ((f) & 0x1FFFFUL)) +/** + * @brief Set the F coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_F(uint32_t val) +{ + return (DL_BITMAP_TRANSFORM_F | (val & 0x1FFFFUL)); +} + +//#define BLEND_FUNC(src,dst) ((DL_BLEND_FUNC) | (((src) & 7UL) << 3U) | ((dst) & 7UL)) +/** + * @brief Execute a sequence of commands at another location in the display list. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BLEND_FUNC(uint8_t src, uint8_t dst) +{ + uint32_t const srcv = (uint32_t) ((src & 7UL) << 3U); + uint32_t const dstv = (uint32_t) (dst & 7UL); + return (DL_BLEND_FUNC | srcv | dstv); +} + +//#define CALL(dest) ((DL_CALL) | ((dest) & 0xFFFFUL)) +/** + * @brief Execute a sequence of commands at another location in the display list. + * @note valid range for dest is from zero to 2047 + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t CALL(uint16_t dest) +{ + return (DL_CALL | (dest & 0x7FFUL)); +} + +//#define JUMP(dest) ((DL_JUMP) | ((dest) & 0xFFFFUL)) +/** + * @brief Execute commands at another location in the display list. + * @note valid range for dest is from zero to 2047 + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t JUMP(uint16_t dest) +{ + return (DL_JUMP | (dest & 0x7FFUL)); +} + +//#define CELL(cell) ((DL_CELL) | ((cell) & 0x7FUL)) +/** + * @brief Set the bitmap cell number for the VERTEX2F command. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t CELL(uint8_t cell) +{ + return (DL_CELL | (cell & 0x7FUL)); +} + +//#define CLEAR(c,s,t) ((DL_CLEAR) | (((c) & 1UL) << 2U) | (((s) & 1UL) << 1U) | ((t) & 1UL)) +/** + * @brief Clear buffers to preset values. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t CLEAR(uint8_t color, uint8_t stencil, uint8_t tag) +{ + uint32_t const colorv = (color & 1UL) << 2U; + uint32_t const stencilv = (stencil & 1UL) << 1U; + uint32_t const tagv = (tag & 1UL); + return (DL_CLEAR | colorv | stencilv | tagv); +} + +//#define CLEAR_COLOR_A(alpha) ((DL_CLEAR_COLOR_A) | ((alpha) & 0xFFUL)) +/** + * @brief Set clear value for the alpha channel. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t CLEAR_COLOR_A(uint8_t alpha) +{ + return (DL_CLEAR_COLOR_A | alpha); +} + +//#define CLEAR_COLOR_RGB(red,green,blue) ((DL_CLEAR_COLOR_RGB) | (((red) & 0xFFUL) << 16U) | (((green) & 0xFFUL) << 8U) | ((blue) & 0xFFUL)) +/** + * @brief Set clear values for red, green and blue channels. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t CLEAR_COLOR_RGB(uint8_t red, uint8_t green, uint8_t blue) +{ + uint32_t const redv = ((red & 0xFFUL) << 16U); + uint32_t const greenv = ((green & 0xFFUL) << 8U); + uint32_t const bluev = (blue & 0xFFUL); + return (DL_CLEAR_COLOR_RGB | redv | greenv | bluev); +} + +//#define CLEAR_STENCIL(s) ((DL_CLEAR_STENCIL) | ((s) & 0xFFUL)) +/** + * @brief Set clear value for the stencil buffer. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t CLEAR_STENCIL(uint8_t val) +{ + return (DL_CLEAR_STENCIL | val); +} + +//#define CLEAR_TAG(s) ((DL_CLEAR_TAG) | ((s) & 0xFFUL)) +/** + * @brief Set clear value for the tag buffer. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t CLEAR_TAG(uint8_t val) +{ + return (DL_CLEAR_TAG | val); +} + +//#define COLOR_A(alpha) ((DL_COLOR_A) | ((alpha) & 0xFFUL)) +/** + * @brief Set the current color alpha. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t COLOR_A(uint8_t alpha) +{ + return (DL_COLOR_A | alpha); +} + +//#define COLOR_MASK(r,g,b,a) ((DL_COLOR_MASK) | (((r) & 1UL) << 3U) | (((g) & 1UL) << 2U) | (((b) & 1UL) << 1U) | ((a) & 1UL)) +/** + * @brief Enable or disable writing of color components. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t COLOR_MASK(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) +{ + uint32_t const redv = ((red & 1UL) << 3U); + uint32_t const greenv = ((green & 1UL) << 2U); + uint32_t const bluev = ((blue & 1UL) << 1U); + uint32_t const alphav = (alpha & 1UL); + return (DL_COLOR_MASK | redv | greenv | bluev | alphav); +} + +//#define COLOR_RGB(red,green,blue) ((DL_COLOR_RGB) | (((red) & 0xFFUL) << 16U) | (((green) & 0xFFUL) << 8U) | ((blue) & 0xFFUL)) +/** + * @brief Set the current color red, green and blue. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t COLOR_RGB(uint8_t red, uint8_t green, uint8_t blue) +{ + uint32_t const redv = ((red & 0xFFUL) << 16U); + uint32_t const greenv = ((green & 0xFFUL) << 8U); + uint32_t const bluev = (blue & 0xFFUL); + return (DL_COLOR_RGB | redv | greenv | bluev); +} + +//#define LINE_WIDTH(width) ((DL_LINE_WIDTH) | (((uint32_t) (width)) & 0xFFFUL)) +/** + * @brief Set the width of lines to be drawn with primitive LINES in 1/16 pixel precision. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t LINE_WIDTH(uint16_t width) +{ + return (DL_LINE_WIDTH | (width & 0xFFFUL)); +} + +//#define MACRO(m) ((DL_MACRO) | ((m) & 1UL)) +/** + * @brief Execute a single command from a macro register. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t MACRO(uint8_t macro) +{ + return (DL_MACRO | (macro & 0x1UL)); +} + +//#define PALETTE_SOURCE(addr) ((DL_PALETTE_SOURCE) | ((addr) & 0x3FFFFF3UL)) +/** + * @brief Set the base address of the palette. + * @note 2-byte alignment is required if pixel format is PALETTE4444 or PALETTE565. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t PALETTE_SOURCE(uint32_t addr) +{ + return (DL_PALETTE_SOURCE | (addr & 0x3FFFFFUL)); +} + +//#define POINT_SIZE(size) ((DL_POINT_SIZE) | ((size) & 0x1FFFUL)) +/** + * @brief Set the radius of points to be drawn with primitive POINTS in 1/16 pixel precision. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t POINT_SIZE(uint16_t size) +{ + return (DL_POINT_SIZE | (size & 0x1FFFUL)); +} + +//#define SCISSOR_SIZE(width,height) ((DL_SCISSOR_SIZE) | (((width) & 0xFFFUL) << 12U) | ((height) & 0xFFFUL)) +/** + * @brief Set the size of the scissor clip rectangle. + * @note valid range for width and height is from zero to 2048 + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t SCISSOR_SIZE(uint16_t width, uint16_t height) +{ + uint32_t const widthv = (uint32_t) ((width & 0xFFFUL) << 12U); + uint32_t const heightv = (uint32_t) (height & 0xFFFUL); + return (DL_SCISSOR_SIZE | widthv | heightv); +} + +//#define SCISSOR_XY(x,y) ((DL_SCISSOR_XY) | (((x) & 0x7FFUL) << 11U) | ((y) & 0x7FFUL)) +/** + * @brief Set the top left corner of the scissor clip rectangle. + * @note valid range for width and height is from zero to 2047 + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t SCISSOR_XY(uint16_t xc0, uint16_t yc0) +{ + uint32_t const xc0v = (uint32_t) ((xc0 & 0x7FFUL) << 11U); + uint32_t const yc0v = (uint32_t) (yc0 & 0x7FFUL); + return (DL_SCISSOR_XY | xc0v | yc0v); +} + +//#define STENCIL_FUNC(func,ref,mask) ((DL_STENCIL_FUNC) | (((func) & 7UL) << 16U) | (((ref) & 0xFFUL) << 8U)|((mask) & 0xFFUL)) +/** + * @brief Set function and reference value for stencil testing. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t STENCIL_FUNC(uint8_t func, uint8_t ref, uint8_t mask) +{ + uint32_t const funcv = (uint32_t) ((func & 7UL) << 16U); + uint32_t const refv = (uint32_t) ((ref & 0xFFUL) << 8U); + uint32_t const maskv = (uint32_t) (mask & 0xFFUL); + return (DL_STENCIL_FUNC | funcv | refv | maskv); +} + +//#define STENCIL_MASK(mask) ((DL_STENCIL_MASK) | ((mask) & 0xFFUL)) +/** + * @brief Control the writing of individual bits in the stencil planes. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t STENCIL_MASK(uint8_t mask) +{ + return (DL_STENCIL_MASK | mask); +} + +//#define STENCIL_OP(sfail,spass) ((DL_STENCIL_OP) | (((sfail) & 7UL) << 3U) | ((spass) & 7UL)) +/** + * @brief Set stencil test actions. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t STENCIL_OP(uint8_t sfail, uint8_t spass) +{ + uint32_t const sfailv = (uint32_t) ((sfail & 0x07UL) << 3U); + uint32_t const spassv = (uint32_t) (spass & 0x07UL); + return (DL_STENCIL_OP | sfailv | spassv); +} + +//#define TAG(s) ((DL_TAG) | ((s) & 0xFFUL)) +/** + * @brief Attach the tag value for the following graphics objects drawn on the screen. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t TAG(uint8_t tagval) +{ + return (DL_TAG | tagval); +} + +//#define TAG_MASK(mask) ((DL_TAG_MASK) | ((mask) & 1UL)) +/** + * @brief Control the writing of the tag buffer. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t TAG_MASK(uint8_t mask) +{ + return (DL_TAG_MASK | ((mask) & 1UL)); +} + +//#define VERTEX2F(x,y) ((DL_VERTEX2F) | ((((uint32_t) (x)) & 0x7FFFUL) << 15U) | (((uint32_t) (y)) & 0x7FFFUL)) +/** + * @brief Set coordinates for graphics primitves. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t VERTEX2F(int16_t xc0, int16_t yc0) +{ + uint32_t const xc0v = ((((uint32_t) ((uint16_t) xc0)) & 0x7FFFUL) << 15U); + uint32_t const yc0v = (((uint32_t) ((uint16_t) yc0)) & 0x7FFFUL); + return (DL_VERTEX2F | xc0v | yc0v); +} + +//#define VERTEX2II(x,y,handle,cell) ((DL_VERTEX2II) | (((x) & 0x1FFUL) << 21U) | (((y) & 0x1FFUL) << 12U) | (((handle) & 0x1FUL) << 7U) | ((cell) & 0x7FUL)) +/** + * @brief Set coordinates, bitmap-handle and cell-number for graphics primitves. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t VERTEX2II(uint16_t xc0, uint16_t yc0, uint8_t handle, uint8_t cell) +{ + uint32_t const xc0v = ((((uint32_t) xc0) & 0x1FFUL) << 21U); + uint32_t const yc0v = ((((uint32_t) yc0) & 0x1FFUL) << 12U); + uint32_t const handlev = ((((uint32_t) handle) & 0x1FUL) << 7U); + uint32_t const cellv = (((uint32_t) cell) & 0x7FUL); + return (DL_VERTEX2II | xc0v | yc0v | handlev | cellv); +} + +//#define VERTEX_FORMAT(frac) ((DL_VERTEX_FORMAT) | ((frac) & 7UL)) +/** + * @brief Set the precision of VERTEX2F coordinates. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t VERTEX_FORMAT(uint8_t frac) +{ + return (DL_VERTEX_FORMAT | ((frac) & 7UL)); +} + +//#define VERTEX_TRANSLATE_X(x) ((DL_VERTEX_TRANSLATE_X) | ((x) & 0x1FFFFUL)) +/** + * @brief Set the vertex transformations X translation component. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t VERTEX_TRANSLATE_X(int32_t xco) +{ + return (DL_VERTEX_TRANSLATE_X | (((uint32_t) xco) & 0x1FFFFUL)); +} + +//#define VERTEX_TRANSLATE_Y(y) ((DL_VERTEX_TRANSLATE_Y) | ((y) & 0x1FFFFUL)) +/** + * @brief Set the vertex transformations Y translation component. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t VERTEX_TRANSLATE_Y(int32_t yco) +{ + return (DL_VERTEX_TRANSLATE_Y | (((uint32_t) yco) & 0x1FFFFUL)); +} + +/* #define BEGIN(prim) ((DL_BEGIN) | ((prim) & 15UL)) */ /* use define DL_BEGIN */ +/* #define DISPLAY() ((DL_DISPLAY)) */ /* use define DL_DISPLAY */ +/* #define END() ((DL_END)) */ /* use define DL_END */ +/* #define RESTORE_CONTEXT() ((DL_RESTORE_CONTEXT)) */ /* use define DL_RESTORE_CONTEXT */ +/* #define RETURN() ((DL_RETURN)) */ /* use define DL_RETURN */ +/* #define SAVE_CONTEXT() ((DL_SAVE_CONTEXT)) */ /* use define DL_SAVE_CONTEXT */ +/* #define NOP() ((DL_NOP)) */ + +/* ########## EVE Generation 3: BT815 / BT816 definitions ########## */ + +#if EVE_GEN > 2 + +#define EVE_GLFORMAT ((uint32_t) 31UL) /* used with BITMAP_LAYOUT to indicate bitmap-format is specified by BITMAP_EXT_FORMAT */ + +#define DL_BITMAP_EXT_FORMAT ((uint32_t) 0x2E000000UL) /* requires OR'd arguments */ +#define DL_BITMAP_SWIZZLE ((uint32_t) 0x2F000000UL) +/* #define DL_INT_FRR ((uint32_t) 0x30000000UL) */ /* ESE displays "Internal: flash read result" - undocumented display list command */ + +/* Extended Bitmap formats */ +#define EVE_ASTC_4X4 ((uint32_t) 37808UL) +#define EVE_ASTC_5X4 ((uint32_t) 37809UL) +#define EVE_ASTC_5X5 ((uint32_t) 37810UL) +#define EVE_ASTC_6X5 ((uint32_t) 37811UL) +#define EVE_ASTC_6X6 ((uint32_t) 37812UL) +#define EVE_ASTC_8X5 ((uint32_t) 37813UL) +#define EVE_ASTC_8X6 ((uint32_t) 37814UL) +#define EVE_ASTC_8X8 ((uint32_t) 37815UL) +#define EVE_ASTC_10X5 ((uint32_t) 37816UL) +#define EVE_ASTC_10X6 ((uint32_t) 37817UL) +#define EVE_ASTC_10X8 ((uint32_t) 37818UL) +#define EVE_ASTC_10X10 ((uint32_t) 37819UL) +#define EVE_ASTC_12X10 ((uint32_t) 37820UL) +#define EVE_ASTC_12X12 ((uint32_t) 37821UL) + +#define EVE_RAM_ERR_REPORT ((uint32_t) 0x309800UL) /* max 128 bytes null terminated string */ +#define EVE_RAM_FLASH ((uint32_t) 0x800000UL) +#define EVE_RAM_FLASH_POSTBLOB ((uint32_t) 0x801000UL) + +#define EVE_OPT_FLASH ((uint16_t) 64U) +#define EVE_OPT_OVERLAY ((uint16_t) 128U) +#define EVE_OPT_FORMAT ((uint16_t) 4096U) +#define EVE_OPT_FILL ((uint16_t) 8192U) + +/* Commands for BT815 / BT816 */ +#define CMD_BITMAP_TRANSFORM ((uint32_t) 0xFFFFFF21UL) +#define CMD_SYNC ((uint32_t) 0xFFFFFF42UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_SYNC) */ +#define CMD_FLASHERASE ((uint32_t) 0xFFFFFF44UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHERASE) */ +#define CMD_FLASHWRITE ((uint32_t) 0xFFFFFF45UL) +#define CMD_FLASHREAD ((uint32_t) 0xFFFFFF46UL) +#define CMD_FLASHUPDATE ((uint32_t) 0xFFFFFF47UL) +#define CMD_FLASHDETACH ((uint32_t) 0xFFFFFF48UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHDETACH) */ +#define CMD_FLASHATTACH ((uint32_t) 0xFFFFFF49UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHATTACH) */ +#define CMD_FLASHFAST ((uint32_t) 0xFFFFFF4AUL) +#define CMD_FLASHSPIDESEL ((uint32_t) 0xFFFFFF4BUL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHSPIDESEL) */ +#define CMD_FLASHSPITX ((uint32_t) 0xFFFFFF4CUL) +#define CMD_FLASHSPIRX ((uint32_t) 0xFFFFFF4DUL) +#define CMD_FLASHSOURCE ((uint32_t) 0xFFFFFF4EUL) +#define CMD_CLEARCACHE ((uint32_t) 0xFFFFFF4FUL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_CLEARCACHE) */ +#define CMD_INFLATE2 ((uint32_t) 0xFFFFFF50UL) +#define CMD_ROTATEAROUND ((uint32_t) 0xFFFFFF51UL) +#define CMD_RESETFONTS ((uint32_t) 0xFFFFFF52UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_RESETFONTS) */ +#define CMD_ANIMSTART ((uint32_t) 0xFFFFFF53UL) +#define CMD_ANIMSTOP ((uint32_t) 0xFFFFFF54UL) +#define CMD_ANIMXY ((uint32_t) 0xFFFFFF55UL) +#define CMD_ANIMDRAW ((uint32_t) 0xFFFFFF56UL) +#define CMD_GRADIENTA ((uint32_t) 0xFFFFFF57UL) +#define CMD_FILLWIDTH ((uint32_t) 0xFFFFFF58UL) +#define CMD_APPENDF ((uint32_t) 0xFFFFFF59UL) +#define CMD_ANIMFRAME ((uint32_t) 0xFFFFFF5AUL) +#define CMD_VIDEOSTARTF ((uint32_t) 0xFFFFFF5FUL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_VIDEOSTARTF) */ + +/* Registers for BT815 / BT816 */ +#define REG_ADAPTIVE_FRAMERATE ((uint32_t) 0x0030257cUL) +#define REG_PLAYBACK_PAUSE ((uint32_t) 0x003025ecUL) +#define REG_FLASH_STATUS ((uint32_t) 0x003025f0UL) +#define REG_FLASH_SIZE ((uint32_t) 0x00309024UL) +#define REG_PLAY_CONTROL ((uint32_t) 0x0030914eUL) +#define REG_COPRO_PATCH_PTR ((uint32_t) 0x00309162UL) + +/* Macros for BT815 / BT816 */ + +//#define BITMAP_EXT_FORMAT(format) ((DL_BITMAP_EXT_FORMAT) | ((format) & 0xFFFFUL)) +/** + * @brief Set the extended format of the bitmap. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_EXT_FORMAT(uint16_t format) +{ + return (DL_BITMAP_EXT_FORMAT | format); +} + +//#define BITMAP_SWIZZLE(r,g,b,a) ((DL_BITMAP_SWIZZLE) | (((r) & 7UL) << 9U) | (((g) & 7UL) << 6U) | (((b) & 7UL) << 3U) | ((a) & 7UL)) +/** + * @brief Set the source for the red, green, blue and alpha channels of a bitmap. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_SWIZZLE(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) +{ + uint32_t const redv = ((red & 7UL) << 9U); + uint32_t const greenv = ((green & 7UL) << 6U); + uint32_t const bluev = ((blue & 7UL) << 3U); + uint32_t const alphav = (alpha & 7UL); + return (DL_BITMAP_SWIZZLE | redv | greenv | bluev | alphav); +} + +//#define BITMAP_TRANSFORM_A_EXT(p,v) ((DL_BITMAP_TRANSFORM_A) | (((p) & 1UL) << 17U) | ((v) & 0x1FFFFUL)) +/** + * @brief Set the A coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_A(uint8_t prc, uint32_t val) +{ + uint32_t const prcv = ((prc & 1UL) << 17U); + uint32_t const valv = (val & 0x1FFFFUL); + return (DL_BITMAP_TRANSFORM_A | prcv | valv); +} + +//#define BITMAP_TRANSFORM_B_EXT(p,v) ((DL_BITMAP_TRANSFORM_B) | (((p) & 1UL) << 17U) | ((v) & 0x1FFFFUL)) +/** + * @brief Set the B coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_B(uint8_t prc, uint32_t val) +{ + uint32_t const prcv = ((prc & 1UL) << 17U); + uint32_t const valv = (val & 0x1FFFFUL); + return (DL_BITMAP_TRANSFORM_B | prcv | valv); +} + +//#define BITMAP_TRANSFORM_D_EXT(p,v) ((DL_BITMAP_TRANSFORM_D) | (((p) & 1UL) << 17U) | ((v) & 0x1FFFFUL)) +/** + * @brief Set the D coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_D(uint8_t prc, uint32_t val) +{ + uint32_t const prcv = ((prc & 1UL) << 17U); + uint32_t const valv = (val & 0x1FFFFUL); + return (DL_BITMAP_TRANSFORM_D | prcv | valv); +} + +//#define BITMAP_TRANSFORM_E_EXT(p,v) ((DL_BITMAP_TRANSFORM_E) | (((p) & 1UL) << 17U) | ((v) & 0x1FFFFUL)) +/** + * @brief Set the E coefficient of the bitmap transform matrix. + * @return a 32 bit word for use with EVE_cmd_dl() + */ +static inline uint32_t BITMAP_TRANSFORM_E(uint8_t prc, uint32_t val) +{ + uint32_t const prcv = ((prc & 1UL) << 17U); + uint32_t const valv = (val & 0x1FFFFUL); + return (DL_BITMAP_TRANSFORM_E | prcv | valv); +} + +//#define BITMAP_TRANSFORM_A(a) BITMAP_TRANSFORM_A_EXT(0UL,(a)) +//#define BITMAP_TRANSFORM_B(b) BITMAP_TRANSFORM_B_EXT(0UL,(b)) +//#define BITMAP_TRANSFORM_D(d) BITMAP_TRANSFORM_D_EXT(0UL,(d)) +//#define BITMAP_TRANSFORM_E(e) BITMAP_TRANSFORM_E_EXT(0UL,(e)) + +#endif /* EVE_GEN > 2 */ + +/* ########## EVE Generation 4: BT817 / BT818 definitions ########## */ + +#if EVE_GEN > 3 + +/* Commands for BT817 / BT818 */ +#define CMD_ANIMFRAMERAM ((uint32_t) 0xFFFFFF6DUL) +#define CMD_ANIMSTARTRAM ((uint32_t) 0xFFFFFF6EUL) +#define CMD_APILEVEL ((uint32_t) 0xFFFFFF63UL) +#define CMD_CALIBRATESUB ((uint32_t) 0xFFFFFF60UL) +#define CMD_CALLLIST ((uint32_t) 0xFFFFFF67UL) +#define CMD_ENDLIST ((uint32_t) 0xFFFFFF69UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_ENDLIST) */ +#define CMD_FLASHPROGRAM ((uint32_t) 0xFFFFFF70UL) +#define CMD_FONTCACHE ((uint32_t) 0xFFFFFF6BUL) +#define CMD_FONTCACHEQUERY ((uint32_t) 0xFFFFFF6CUL) +#define CMD_GETIMAGE ((uint32_t) 0xFFFFFF64UL) +#define CMD_HSF ((uint32_t) 0xFFFFFF62UL) +#define CMD_LINETIME ((uint32_t) 0xFFFFFF5EUL) +#define CMD_NEWLIST ((uint32_t) 0xFFFFFF68UL) +#define CMD_PCLKFREQ ((uint32_t) 0xFFFFFF6AUL) +#define CMD_RETURN ((uint32_t) 0xFFFFFF66UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_RETURN) */ +#define CMD_RUNANIM ((uint32_t) 0xFFFFFF6FUL) +#define CMD_TESTCARD ((uint32_t) 0xFFFFFF61UL) /* does not need a dedicated function, just use EVE_cmd_dl(CMD_TESTCARD) */ +#define CMD_WAIT ((uint32_t) 0xFFFFFF65UL) + +/* Registers for BT817 / BT818 */ +#define REG_UNDERRUN ((uint32_t) 0x0030260cUL) +#define REG_AH_HCYCLE_MAX ((uint32_t) 0x00302610UL) +#define REG_PCLK_FREQ ((uint32_t) 0x00302614UL) +#define REG_PCLK_2X ((uint32_t) 0x00302618UL) +#define REG_ANIM_ACTIVE ((uint32_t) 0x0030902CUL) + +#endif /* EVE_GEN > 3 */ + +#ifdef __cplusplus +} +#endif + +#endif /* EVE_H */ diff --git a/inc/lvgl/src/libs/FT800-FT813/EVE_commands.c b/inc/lvgl/src/libs/FT800-FT813/EVE_commands.c new file mode 100644 index 0000000..59e3d05 --- /dev/null +++ b/inc/lvgl/src/libs/FT800-FT813/EVE_commands.c @@ -0,0 +1,3926 @@ +#include "../../lv_conf_internal.h" +#if LV_USE_DRAW_EVE +/* +@file EVE_commands.c +@brief contains FT8xx / BT8xx functions +@version 5.0 +@date 2023-12-29 +@author Rudolph Riedel + +@section info + +At least for Arm Cortex-M0 and Cortex-M4 I have fastest execution with -O2. +The c-standard is C99. + + +@section LICENSE + +MIT License + +Copyright (c) 2016-2023 Rudolph Riedel + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +@section History + +5.0 +- added EVE_cmd_pclkfreq() +- put back writing of REG_CSSPREAD as it needs to be deactivated for higher frequencies +- added the configuration of the second PLL for the pixel clock in BT817/BT818 to EVE_init() in case the display config +has EVE_PCLK_FREQ defined +- replaced BT81X_ENABLE with "EVE_GEN > 2" +- removed FT81X_ENABLE as FT81x already is the lowest supported chip revision now +- removed the formerly as deprected marked EVE_get_touch_tag() +- changed EVE_color_rgb() to use a 32 bit value like the rest of the color commands +- removed the meta-commands EVE_cmd_point(), EVE_cmd_line() and EVE_cmd_rect() +- split all display-list commands into two functions: EVE_cmd_XXX() and EVE_cmd_XXX_burst() +- switched from using EVE_RAM_CMD + cmdOffset to REG_CMDB_WRITE +- as a side effect from switching to REG_CMDB_WRITE, every coprocessor command is automatically executed now +- renamed EVE_LIB_GetProps() back to EVE_cmd_getprops() since it does not do anything special to justify a special name +- added helper function EVE_memWrite_sram_buffer() +- added EVE_cmd_bitmap_transform() and EVE_cmd_bitmap_transform_burst() +- added zero-pointer protection to commands using block_transfer() +- added EVE_cmd_playvideo() +- changed EVE_cmd_setfont() to a display-list command and added EVE_cmd_setfont_burst() +- changed EVE_cmd_setfont2() to a display-list command and added EVE_cmd_setfont2_burst() +- added EVE_cmd_videoframe() +- restructured: functions are sorted by chip-generation and within their group in alphabetical order +- reimplementedEVE_cmd_getmatrix() again, it needs to read values, not write them +- added EVE_cmd_fontcache() and EVE_cmd_fontcachequery() +- added EVE_cmd_calibratesub() +- added EVE_cmd_animframeram(), EVE_cmd_animframeram_burst(), EVE_cmd_animstartram(), EVE_cmd_animstartram_burst() +- added EVE_cmd_apilevel(), EVE_cmd_apilevel_burst() +- added EVE_cmd_calllist(), EVE_cmd_calllist_burst() +- added EVE_cmd_hsf(), EVE_cmd_hsf_burst() +- added EVE_cmd_linetime() +- added EVE_cmd_newlist(), EVE_cmd_newlist_burst() +- added EVE_cmd_runanim(), EVE_cmd_runanim_burst() +- added a safeguard to EVE_start_cmd_burst() to protect it from overlapping transfers with DMA and segmented lists +- used spi_transmit_32() to shorten this file by around 600 lines with no functional change +- removed the history from before 4.0 +- removed a couple of spi_transmit_32() calls from EVE_cmd_getptr() to make it work again +- Bugfix: EVE_cmd_setfont2_burst() was using CMD_SETFONT instead of CMD_SETFONT2 +- removed a check for cmd_burst from EVE_cmd_getimage() as it is in the group of commands that are not used for display +lists +- moved EVE_cmd_newlist() to the group of commands that are not used for display lists +- removed EVE_cmd_newlist_burst() +- renamed spi_flash_write() to private_block_write() and made it static +- renamed EVE_write_string() to private_string_write() and made it static +- made EVE_start_command() static +- Bugfix: ESP8266 needs 32 bit alignment for 32 bit pointers, + changed private_string_write() for burst-mode to read 8-bit values +- Bugfix: somehow messed up private_string_write() for burst-mode + but only for 8-Bit controllers +- changed EVE_memRead8(), EVE_memRead16() and EVE_memRead32() to use + spi_transmit_32() for the initial address+zero byte transfer + This speeds up ESP32/ESP8266 by several us, has no measureable effect + for ATSAMD51 and is a little slower for AVR. +- Bugfix: not sure why but setting private_block_write() to static broke it, without "static" it works +- Bugfix: EVE_cmd_flashspirx() was using CMD_FLASHREAD +- fixed a warning in EVE_init() when compiling for EVE4 +- renamed internal function EVE_begin_cmd() to eve_begin_cmd() and made it static +- changed all the EVE_start_command() calls to eve_begin_cmd() calls following the report on Github from + Michael Wachs that these are identical - they weren't prior to V5 +- removed EVE_start_command() +- Bugfix: EVE_init() was only checking the first two bits of REG_CPURESET and ignored the bit for the audio-engine, not +an issue but not correct either. +- fixed a few clang-tidy warnings +- fixed a few cppcheck warnings +- fixed a few CERT warnings +- converted all TABs to SPACEs +- made EVE_TOUCH_RZTHRESH in EVE_init() optional to a) remove it from EVE_config.h and b) make it configureable +externally +- changed EVE_init() to write 1200U to REG_TOUCH_RZTHRESH if EVE_TOUCH_RZTHRESH is not defined +- changed EVE_init() to return E_OK = 0x00 in case of success and more meaningfull values in case of failure +- changed EVE_busy() to return EVE_IS_BUSY if EVE is busy and E_OK = 0x00 if EVE is not busy - no real change in +functionality +- finally removed EVE_cmd_start() after setting it to deprecatd with the first 5.0 release +- renamed EVE_cmd_execute() to EVE_execute_cmd() to be more consistent, this is is not an EVE command +- changed EVE_init_flash() to return E_OK in case of success and more meaningfull values in case of failure +- added the return-value of EVE_FIFO_HALF_EMPTY to EVE_busy() to indicate there is more than 2048 bytes available +- minor cleanup, less break and else statements +- added the burst code back into all the functions for which there is a _burst version, this allows to use the version +without the traling _burst in the name when exceution speed is not an issue - e.g. with all targets supporting DMA +- removed the 4.0 history +- added the optional parameter EVE_ROTATE as define to EVE_init() to allow for screen rotation during init + thanks for the idea to AndrejValand on Github! +- added the optional parameter EVE_BACKLIGHT_PWM to EVE_init() to allow setting the backlight during init +- modified EVE_calibrate_manual() to work better with bar type displays +- fixed a large number of MISRA-C issues - mostly more casts for explicit type conversion and more brackets +- changed the varargs versions of cmd_button, cmd_text and cmd_toggle to use an array of uint32_t values to comply with MISRA-C +- basic maintenance: checked for violations of white space and indent rules +- more linter fixes for minor issues like variables shorter than 3 characters +- added EVE_color_a() / EVE_color_a_burst() +- more minor tweaks and fixes to make the static analyzer happy +- changed the burst variant of private_string_write() back to the older and faster version +- refactoring of EVE_init() to single return +- added prototype for EVE_write_display_parameters() +- added EVE_memRead_sram_buffer() +- Bugfix issue #81: neither DISP or the pixel clock are enabled for EVE4 configurations not using EVE_PCLK_FREQ. + thanks for the report to grados73 on Github! +- added a few support lines for the Gameduino GD3X to EVE_init() +- switched from using CMD_PCLKFREQ to writing to REG_PCLK_FREQ directly +- added define EVE_SET_REG_PCLK_2X to set REG_PCLK_2X to 1 when necessary +- Bugfix: EVE_init() did not set the audio engine to "mute" as intended, but to "silent" +- Bugfix: EVE_busy() returns E_NOT_OK now on coprocessor faults. + thanks for the report to Z0ld3n on Github! +- Fix: reworked EVE_busy() to return EVE_FAULT_RECOVERED on deteced coprocessor faults, + removed the flash commands from the fault recovery sequence as these are project specific. +- added EVE_get_and_reset_fault_state() to check if EVE_busy() triggered a fault recovery +- added notes on how to use to EVE_cmd_setfont2() and EVE_cmd_romfont() +- new optional parameter in EVE_init(): EVE_BACKLIGHT_FREQ +- fixed a couple of minor issues from static code analysis +- reworked the burst part of private_string_write() to be less complex +- renamed chipid references to regid as suggested by #93 on github +- Bugfix: broke transfers of buffers larger than 3840 when fixing issues from static code analysis +- changed a number of function parameters from signed to unsigned following the + updated BT81x series programming guide V2.4 +- did another linter pass and fixed some things +- started to improve the embedded documentation +- added more documentation +- removed EVE_cmd_hsf_burst() + +*/ + +#include "EVE_commands.h" + +/* EVE Memory Commands - used with EVE_memWritexx and EVE_memReadxx */ +#define MEM_WRITE 0x80U /* EVE Host Memory Write */ +/* #define MEM_READ 0x00U */ /* EVE Host Memory Read */ + +/* define NULL if it not already is */ +#ifndef NULL +#include +#endif + +static volatile uint8_t cmd_burst = 0U; /* flag to indicate cmd-burst is active */ +static volatile uint8_t fault_recovered = E_OK; /* flag to indicate if EVE_busy triggered a fault recovery */ + +/* ################################################################## + helper functions +##################################################################### */ + +/** + * @brief Send a host command. + */ +void EVE_cmdWrite(uint8_t const command, uint8_t const parameter) +{ + EVE_cs_set(); + spi_transmit(command); + spi_transmit(parameter); + spi_transmit(0U); + EVE_cs_clear(); +} + +/** + * @brief Implementation of rd8() function, reads 8 bits. + */ +uint8_t EVE_memRead8(uint32_t const ft_address) +{ + uint8_t data; + EVE_cs_set(); + spi_transmit_32(((ft_address >> 16U) & 0x0000007fUL) + (ft_address & 0x0000ff00UL) + ((ft_address & 0x000000ffUL) << 16U)); + data = spi_receive(0U); /* read data byte by sending another dummy byte */ + EVE_cs_clear(); + return (data); +} + +/** + * @brief Implementation of rd16() function, reads 16 bits. + */ +uint16_t EVE_memRead16(uint32_t const ft_address) +{ + uint16_t data; + + EVE_cs_set(); + spi_transmit_32(((ft_address >> 16U) & 0x0000007fUL) + (ft_address & 0x0000ff00UL) + ((ft_address & 0x000000ffUL) << 16U)); + uint8_t const lowbyte = spi_receive(0U); /* read low byte */ + uint8_t const hibyte = spi_receive(0U); /* read high byte */ + data = ((uint16_t) hibyte * 256U) | lowbyte; + EVE_cs_clear(); + return (data); +} + +/** + * @brief Implementation of rd32() function, reads 32 bits. + */ +uint32_t EVE_memRead32(uint32_t const ft_address) +{ + uint32_t data; + EVE_cs_set(); + spi_transmit_32(((ft_address >> 16U) & 0x0000007fUL) + (ft_address & 0x0000ff00UL) + ((ft_address & 0x000000ffUL) << 16U)); + data = ((uint32_t) spi_receive(0U)); /* read low byte */ + data = ((uint32_t) spi_receive(0U) << 8U) | data; + data = ((uint32_t) spi_receive(0U) << 16U) | data; + data = ((uint32_t) spi_receive(0U) << 24U) | data; /* read high byte */ + EVE_cs_clear(); + return (data); +} + +/** + * @brief Implementation of wr8() function, writes 8 bits. + */ +void EVE_memWrite8(uint32_t const ft_address, uint8_t const ft_data) +{ + EVE_cs_set(); + spi_transmit((uint8_t) (ft_address >> 16U) | MEM_WRITE); + spi_transmit((uint8_t) (ft_address >> 8U)); + spi_transmit((uint8_t) (ft_address & 0x000000ffUL)); + spi_transmit(ft_data); + EVE_cs_clear(); +} + +/** + * @brief Implementation of wr16() function, writes 16 bits. + */ +void EVE_memWrite16(uint32_t const ft_address, uint16_t const ft_data) +{ + EVE_cs_set(); + spi_transmit((uint8_t) (ft_address >> 16U) | MEM_WRITE); /* send Memory Write plus high address byte */ + spi_transmit((uint8_t) (ft_address >> 8U)); /* send middle address byte */ + spi_transmit((uint8_t) (ft_address & 0x000000ffUL)); /* send low address byte */ + spi_transmit((uint8_t) (ft_data & 0x00ffU)); /* send data low byte */ + spi_transmit((uint8_t) (ft_data >> 8U)); /* send data high byte */ + EVE_cs_clear(); +} + +/** + * @brief Implementation of wr32() function, writes 32 bits. + */ +void EVE_memWrite32(uint32_t const ft_address, uint32_t const ft_data) +{ + EVE_cs_set(); + spi_transmit((uint8_t) (ft_address >> 16U) | MEM_WRITE); /* send Memory Write plus high address byte */ + spi_transmit((uint8_t) (ft_address >> 8U)); /* send middle address byte */ + spi_transmit((uint8_t) (ft_address & 0x000000ffUL)); /* send low address byte */ + spi_transmit_32(ft_data); + EVE_cs_clear(); +} + +/** + * @brief Helper function, write a block of memory from the FLASH of the host controller to EVE. + */ +void EVE_memWrite_flash_buffer(uint32_t const ft_address, const uint8_t *p_data, uint32_t const len) +{ + if (p_data != NULL) + { + EVE_cs_set(); + spi_transmit((uint8_t) (ft_address >> 16U) | MEM_WRITE); + spi_transmit((uint8_t) (ft_address >> 8U)); + spi_transmit((uint8_t) (ft_address & 0x000000ffUL)); + + lv_eve_target_spi_transmit_buf(p_data, len); + + EVE_cs_clear(); + } +} + +/** + * @brief Helper function, write a block of memory from the SRAM of the host controller to EVE. + */ +void EVE_memWrite_sram_buffer(uint32_t const ft_address, const uint8_t *p_data, uint32_t const len) +{ + if (p_data != NULL) + { + EVE_cs_set(); + spi_transmit((uint8_t) (ft_address >> 16U) | MEM_WRITE); + spi_transmit((uint8_t) (ft_address >> 8U)); + spi_transmit((uint8_t) (ft_address & 0x000000ffUL)); + + lv_eve_target_spi_transmit_buf(p_data, len); + + EVE_cs_clear(); + } +} + +/** + * @brief Helper function, read a block of memory from EVE to the SRAM of the host controller. + */ +void EVE_memRead_sram_buffer(uint32_t const ft_address, uint8_t *p_data, uint32_t const len) +{ + if (p_data != NULL) + { + EVE_cs_set(); + spi_transmit_32(((ft_address >> 16U) & 0x0000007fUL) + (ft_address & 0x0000ff00UL) + ((ft_address & 0x000000ffUL) << 16U)); + + for (uint32_t count = 0U; count < len; count++) + { + p_data[count] = spi_receive(0U); /* read data byte by sending another dummy byte */ + } + + EVE_cs_clear(); + } +} + +static void CoprocessorFaultRecover(void) +{ +#if EVE_GEN > 2 + uint16_t copro_patch_pointer; + copro_patch_pointer = EVE_memRead16(REG_COPRO_PATCH_PTR); +#endif + + EVE_memWrite8(REG_CPURESET, 1U); /* hold coprocessor engine in the reset condition */ + EVE_memWrite16(REG_CMD_READ, 0U); /* set REG_CMD_READ to 0 */ + EVE_memWrite16(REG_CMD_WRITE, 0U); /* set REG_CMD_WRITE to 0 */ + EVE_memWrite16(REG_CMD_DL, 0U); /* reset REG_CMD_DL to 0 as required by the BT81x programming guide, should not hurt FT8xx */ + +#if EVE_GEN > 2 + EVE_memWrite16(REG_COPRO_PATCH_PTR, copro_patch_pointer); + + /* restore REG_PCLK in case it was set to zero by an error */ +#if (EVE_GEN > 3) && (defined EVE_PCLK_FREQ) + EVE_memWrite16(REG_PCLK_FREQ, (uint16_t) EVE_PCLK_FREQ); + EVE_memWrite8(REG_PCLK, 1U); /* enable extsync mode */ +#else + EVE_memWrite8(REG_PCLK, EVE_PCLK); +#endif + +#endif + EVE_memWrite8(REG_CPURESET, 0U); /* set REG_CPURESET to 0 to restart the coprocessor engine*/ + DELAY_MS(10U); /* just to be safe */ +} + +/** + * @brief Check if the coprocessor completed executing the current command list. + * @return - E_OK - if EVE is not busy (no DMA transfer active and REG_CMDB_SPACE has the value 0xffc, meaning the CMD-FIFO is empty + * @return - EVE_IS_BUSY - if a DMA transfer is active or REG_CMDB_SPACE has a value smaller than 0xffc + * @return - EVE_FIFO_HALF_EMPTY - if no DMA transfer is active and REG_CMDB_SPACE shows more than 2048 bytes available + * @return - E_NOT_OK - if there was a coprocessor fault and the recovery sequence was executed + * @note - if there is a coprocessor fault the external flash is not reinitialized by EVE_busy() + */ +uint8_t EVE_busy(void) +{ + uint16_t space; + uint8_t ret = EVE_IS_BUSY; + +#if defined (EVE_DMA) + if (0 == EVE_dma_busy) + { +#endif + + space = EVE_memRead16(REG_CMDB_SPACE); + + /* (REG_CMDB_SPACE & 0x03) != 0 -> we have a coprocessor fault */ + if ((space & 3U) != 0U) /* we have a coprocessor fault, make EVE play with us again */ + { + ret = EVE_FAULT_RECOVERED; + fault_recovered = EVE_FAULT_RECOVERED; /* save fault recovery state */ + CoprocessorFaultRecover(); + } + else + { + if (0xffcU == space) + { + ret = E_OK; + } + else if (space > 0x800U) + { + ret = EVE_FIFO_HALF_EMPTY; + } + else + { + ret = EVE_IS_BUSY; + } + } + +#if defined (EVE_DMA) + } +#endif + + return (ret); +} + +/** + * @brief Helper function to check if EVE_busy() tried to recover from a coprocessor fault. + * The internal fault indicator is cleared so it could be set by EVE_busy() again. + * @return - EVE_FAULT_RECOVERED - if EVE_busy() detected a coprocessor fault + * @return - E_OK - if EVE_busy() did not detect a coprocessor fault + */ +uint8_t EVE_get_and_reset_fault_state(void) +{ + uint8_t ret = E_OK; + + if (EVE_FAULT_RECOVERED == fault_recovered) + { + ret = EVE_FAULT_RECOVERED; + fault_recovered = E_OK; + } + return (ret); +} + +/** + * @brief Helper function, wait for the coprocessor to complete the FIFO queue. + */ +void EVE_execute_cmd(void) +{ + while (EVE_busy() != E_OK) + { + } +} + +/* begin a coprocessor command, this is used for non-display-list and non-burst-mode commands.*/ +static void eve_begin_cmd(uint32_t command) +{ + EVE_cs_set(); + spi_transmit((uint8_t) 0xB0U); /* high-byte of REG_CMDB_WRITE + MEM_WRITE */ + spi_transmit((uint8_t) 0x25U); /* middle-byte of REG_CMDB_WRITE */ + spi_transmit((uint8_t) 0x78U); /* low-byte of REG_CMDB_WRITE */ + spi_transmit_32(command); +} + +static void private_block_write(const uint8_t *p_data, uint16_t len); /* prototype to comply with MISRA */ + +static void private_block_write(const uint8_t *p_data, uint16_t len) +{ + uint8_t padding; + + padding = (uint8_t) (len & 3U); /* 0, 1, 2 or 3 */ + padding = 4U - padding; /* 4, 3, 2 or 1 */ + padding &= 3U; /* 3, 2 or 1 */ + + for (uint16_t count = 0U; count < len; count++) + { + spi_transmit(fetch_flash_byte(&p_data[count])); + } + + while (padding > 0U) + { + spi_transmit(0U); + padding--; + } +} + +static void block_transfer(const uint8_t *p_data, uint32_t len); /* prototype to comply with MISRA */ + +static void block_transfer(const uint8_t *p_data, uint32_t len) +{ + uint32_t bytes_left; + uint32_t offset = 0U; + + bytes_left = len; + while (bytes_left > 0U) + { + uint32_t block_len; + + block_len = (bytes_left > 3840UL) ? 3840UL : bytes_left; + + EVE_cs_set(); + spi_transmit((uint8_t) 0xB0U); /* high-byte of REG_CMDB_WRITE + MEM_WRITE */ + spi_transmit((uint8_t) 0x25U); /* middle-byte of REG_CMDB_WRITE */ + spi_transmit((uint8_t) 0x78U); /* low-byte of REG_CMDB_WRITE */ + private_block_write(&p_data[offset], (uint16_t) block_len); + EVE_cs_clear(); + offset += block_len; + bytes_left -= block_len; + EVE_execute_cmd(); + } +} + +/* ################################################################## + coprocessor commands that are not used in displays lists, + these are not to be used with burst transfers +################################################################### */ + +/* BT817 / BT818 */ +#if EVE_GEN > 3 + +/** + * @brief Write "num" bytes from src in RAM_G to the previously erased external flash of a BT81x at address dest. + * @note - dest must be 4096-byte aligned, src must be 4-byte aligned, num must be a multiple of 4096 + * @note - EVE will not do anything if the alignment requirements are not met + * @note - the address ptr is relative to the flash so the first address is 0x000000 not 0x800000 + * @note - this looks exactly the same as EVE_cmd_flashupdate() but it needs the flash to be empty + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashprogram(uint32_t dest, uint32_t src, uint32_t num) +{ + eve_begin_cmd(CMD_FLASHPROGRAM); + spi_transmit_32(dest); + spi_transmit_32(src); + spi_transmit_32(num); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Enable the font cache. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_fontcache(uint32_t font, uint32_t ptr, uint32_t num) +{ + eve_begin_cmd(CMD_FONTCACHE); + spi_transmit_32(font); + spi_transmit_32(ptr); + spi_transmit_32(num); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Queries the capacity and utilization of the font cache. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_fontcachequery(uint32_t *p_total, uint32_t *p_used) +{ + uint16_t cmdoffset; + + eve_begin_cmd(CMD_FONTCACHEQUERY); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + EVE_cs_clear(); + EVE_execute_cmd(); + + cmdoffset = EVE_memRead16(REG_CMD_WRITE); /* read the coprocessor write pointer */ + + if (p_total != NULL) + { + *p_total = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 8UL) & 0xfffUL)); + } + if (p_used != NULL) + { + *p_used = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 4UL) & 0xfffUL)); + } +} + +/** + * @brief Returns all the attributes of the bitmap made by the previous CMD_LOADIMAGE, CMD_PLAYVIDEO, CMD_VIDEOSTART or CMD_VIDEOSTARTF. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_getimage(uint32_t *p_source, uint32_t *p_fmt, uint32_t *p_width, uint32_t *p_height, uint32_t *p_palette) +{ + uint16_t cmdoffset; + + eve_begin_cmd(CMD_GETIMAGE); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + EVE_cs_clear(); + EVE_execute_cmd(); + + cmdoffset = EVE_memRead16(REG_CMD_WRITE); /* read the coprocessor write pointer */ + + if (p_palette != NULL) + { + *p_palette = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 4UL) & 0xfffUL)); + } + if (p_height != NULL) + { + *p_height = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 8UL) & 0xfffUL)); + } + if (p_width != NULL) + { + *p_width = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 12UL) & 0xfffUL)); + } + if (p_fmt != NULL) + { + *p_fmt = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 16UL) & 0xfffUL)); + } + if (p_source != NULL) + { + *p_source = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 20UL) & 0xfffUL)); + } +} + +/** + * @brief Undocumented command. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_linetime(uint32_t dest) +{ + eve_begin_cmd(CMD_LINETIME); + spi_transmit_32(dest); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Starts the compilation of a command list into RAM_G. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_newlist(uint32_t adr) +{ + eve_begin_cmd(CMD_NEWLIST); + spi_transmit_32(adr); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Sets REG_PCLK_FREQ to generate the closest possible frequency to the one requested. + * @return - the frequency achieved or zero if no frequency was found + * @note - When using this command, the flash BLOB is required. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +uint32_t EVE_cmd_pclkfreq(uint32_t ftarget, int32_t rounding) +{ + uint16_t cmdoffset; + + eve_begin_cmd(CMD_PCLKFREQ); + spi_transmit_32(ftarget); + spi_transmit_32((uint32_t) rounding); + spi_transmit_32(0UL); + EVE_cs_clear(); + EVE_execute_cmd(); + cmdoffset = EVE_memRead16(REG_CMD_WRITE); /* read the coprocessor write pointer */ + cmdoffset -= 4U; + cmdoffset &= 0x0fffU; + return (EVE_memRead32(EVE_RAM_CMD + cmdoffset)); +} + +/** + * @brief Waits for a specified number of microseconds. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_wait(uint32_t usec) +{ + eve_begin_cmd(CMD_WAIT); + spi_transmit_32(usec); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +#endif /* EVE_GEN > 3 */ + +/* BT815 / BT816 */ +#if EVE_GEN > 2 + +/** + * @brief Clears the graphics engine’s internal flash cache. + * @note - This function includes clearing out the display list. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_clearcache(void) +{ + EVE_cmd_dl(CMD_DLSTART); + EVE_cmd_dl(CMD_SWAP); + EVE_execute_cmd(); + + EVE_cmd_dl(CMD_DLSTART); + EVE_cmd_dl(CMD_SWAP); + EVE_execute_cmd(); + + EVE_cmd_dl(CMD_CLEARCACHE); + EVE_execute_cmd(); +} + +/** + * @brief Re-connect to the attached SPI flash storage. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashattach(void) +{ + eve_begin_cmd(CMD_FLASHATTACH); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Dis-connect from the attached SPI flash storage. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashdetach(void) +{ + eve_begin_cmd(CMD_FLASHDETACH); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Erases the attached SPI flash storage. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flasherase(void) +{ + eve_begin_cmd(CMD_FLASHERASE); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Drive the attached SPI flash storage in full-speed mode, if possible. + * @return - Zero on success, error code on failure + * @note - When using this command, the flash BLOB is required. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +uint32_t EVE_cmd_flashfast(void) +{ + uint16_t cmdoffset; + + eve_begin_cmd(CMD_FLASHFAST); + spi_transmit_32(0UL); + EVE_cs_clear(); + EVE_execute_cmd(); + cmdoffset = EVE_memRead16(REG_CMD_WRITE); /* read the coprocessor write pointer */ + cmdoffset -= 4U; + cmdoffset &= 0x0fffU; + return (EVE_memRead32(EVE_RAM_CMD + cmdoffset)); +} + +/** + * @brief De-asserts the SPI CS signal of the attached SPI flash storage. + * @note - Only works when the attached SPI flash storage has been detached. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashspidesel(void) +{ + eve_begin_cmd(CMD_FLASHSPIDESEL); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Copies "num" bytes from "src" in attached SPI flash storage to "dest" in RAM_G. + * @note - src must be 64-byte aligned, dest must be 4-byte aligned, num must be a multiple of 4 + * @note - EVE will not do anything if the alignment requirements are not met + * @note - The src pointer is relative to the flash so the first address is 0x000000 not 0x800000. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashread(uint32_t dest, uint32_t src, uint32_t num) +{ + eve_begin_cmd(CMD_FLASHREAD); + spi_transmit_32(dest); + spi_transmit_32(src); + spi_transmit_32(num); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Set the source address for flash data loaded by the CMD_LOADIMAGE, CMD_PLAYVIDEO, CMD_VIDEOSTARTF and CMD_INFLATE2 commands with the OPT_FLASH option. + * @note - Address must be 64-byte aligned. + * @note - EVE will not do anything if the alignment requirements are not met. + * @note - The pointer is relative to the flash, so the first address is 0x000000 not 0x800000. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashsource(uint32_t ptr) +{ + eve_begin_cmd(CMD_FLASHSOURCE); + spi_transmit_32(ptr); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Receives bytes from the flash SPI interface and writes them to main memory. + * @note - Only works when the attached SPI flash storage has been detached. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashspirx(uint32_t dest, uint32_t num) +{ + eve_begin_cmd(CMD_FLASHSPIRX); + spi_transmit_32(dest); + spi_transmit_32(num); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Transmits bytes over the flash SPI interface. + * @note - Only works when the attached SPI flash storage has been detached. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashspitx(uint32_t num, const uint8_t *p_data) +{ + eve_begin_cmd(CMD_FLASHSPITX); + spi_transmit_32(num); + EVE_cs_clear(); + block_transfer(p_data, num); +} + +/** + * @brief Write "num" bytes from src in RAM_G to the attached SPI flash storage at address dest. + * @note - dest must be 4096-byte aligned, src must be 4-byte aligned, num must be a multiple of 4096 + * @note - EVE will not do anything if the alignment requirements are not met. + * @note - The address ptr is relative to the flash so the first address is 0x000000 not 0x800000. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashupdate(uint32_t dest, uint32_t src, uint32_t num) +{ + eve_begin_cmd(CMD_FLASHUPDATE); + spi_transmit_32(dest); + spi_transmit_32(src); + spi_transmit_32(num); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Write "num" bytes to the attached SPI flash storage at address dest. + * @note - dest must be 256-byte aligned, num must be a multiple of 256 + * @note - EVE will not do anything if the alignment requirements are not met. + * @note - The address ptr is relative to the flash so the first address is 0x000000 not 0x800000. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_flashwrite(uint32_t ptr, uint32_t num, const uint8_t *p_data) +{ + eve_begin_cmd(CMD_FLASHWRITE); + spi_transmit_32(ptr); + spi_transmit_32(num); + EVE_cs_clear(); + if (p_data != NULL) + { + block_transfer(p_data, num); + } +} + +/** + * @brief Decompress data into RAM_G. + * @note - The data must be correct and complete. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_inflate2(uint32_t ptr, uint32_t options, const uint8_t *p_data, uint32_t len) +{ + eve_begin_cmd(CMD_INFLATE2); + spi_transmit_32(ptr); + spi_transmit_32(options); + EVE_cs_clear(); + + if (0UL == options) /* direct data, not by Media-FIFO or Flash */ + { + if (p_data != NULL) + { + block_transfer(p_data, len); + } + } +} + +#endif /* EVE_GEN > 2 */ + +/** + * @brief Returns the source address and size of the bitmap loaded by the previous CMD_LOADIMAGE. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_getprops(uint32_t *p_pointer, uint32_t *p_width, uint32_t *p_height) +{ + uint16_t cmdoffset; + + eve_begin_cmd(CMD_GETPROPS); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + EVE_cs_clear(); + EVE_execute_cmd(); + cmdoffset = EVE_memRead16(REG_CMD_WRITE); /* read the coprocessor write pointer */ + + if (p_pointer != NULL) + { + *p_pointer = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 12UL) & 0xfffUL)); + } + if (p_width != NULL) + { + *p_width = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 8UL) & 0xfffUL)); + } + if (p_height != NULL) + { + *p_height = EVE_memRead32(EVE_RAM_CMD + ((cmdoffset - 4UL) & 0xfffUL)); + } +} + +/** + * @brief Returns the next address after a CMD_INFLATE and other commands. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +uint32_t EVE_cmd_getptr(void) +{ + uint16_t cmdoffset; + + eve_begin_cmd(CMD_GETPTR); + spi_transmit_32(0UL); + EVE_cs_clear(); + EVE_execute_cmd(); + cmdoffset = EVE_memRead16(REG_CMD_WRITE); /* read the coprocessor write pointer */ + cmdoffset -= 4U; + cmdoffset &= 0x0fffU; + return (EVE_memRead32(EVE_RAM_CMD + cmdoffset)); +} + +/** + * @brief Decompress data into RAM_G. + * @note - The data must be correct and complete. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_inflate(uint32_t ptr, const uint8_t *p_data, uint32_t len) +{ + eve_begin_cmd(CMD_INFLATE); + spi_transmit_32(ptr); + EVE_cs_clear(); + if (p_data != NULL) + { + block_transfer(p_data, len); + } +} + +/** + * @brief Trigger interrupt INT_CMDFLAG. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_interrupt(uint32_t msec) +{ + eve_begin_cmd(CMD_INTERRUPT); + spi_transmit_32(msec); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Loads and decodes a JPEG/PNG image into RAM_G. + * @note - Decoding PNG images takes significantly more time than decoding JPEG images. + * @note - In doubt use the EVE Asset Builder to check if PNG/JPEG files are compatible. + * @note - If the image is in PNG format, the top 42kiB of RAM_G will be overwritten. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_loadimage(uint32_t ptr, uint32_t options, const uint8_t *p_data, uint32_t len) +{ + eve_begin_cmd(CMD_LOADIMAGE); + spi_transmit_32(ptr); + spi_transmit_32(options); + EVE_cs_clear(); + +#if EVE_GEN > 2 + if ((0UL == (options & EVE_OPT_MEDIAFIFO)) && + (0UL == (options & EVE_OPT_FLASH))) /* direct data, neither by Media-FIFO or from Flash */ +#else + if (0UL == (options & EVE_OPT_MEDIAFIFO)) /* direct data, not by Media-FIFO */ +#endif + { + if (p_data != NULL) + { + block_transfer(p_data, len); + } + } +} + +/** + * @brief Set up a streaming media FIFO in RAM_G. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_mediafifo(uint32_t ptr, uint32_t size) +{ + eve_begin_cmd(CMD_MEDIAFIFO); + spi_transmit_32(ptr); + spi_transmit_32(size); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Copy a block of RAM_G. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_memcpy(uint32_t dest, uint32_t src, uint32_t num) +{ + eve_begin_cmd(CMD_MEMCPY); + spi_transmit_32(dest); + spi_transmit_32(src); + spi_transmit_32(num); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Compute a CRC-32 for RAM_G. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +uint32_t EVE_cmd_memcrc(uint32_t ptr, uint32_t num) +{ + uint16_t cmdoffset; + + eve_begin_cmd(CMD_MEMCRC); + spi_transmit_32(ptr); + spi_transmit_32(num); + spi_transmit_32(0UL); + EVE_cs_clear(); + EVE_execute_cmd(); + cmdoffset = EVE_memRead16(REG_CMD_WRITE); /* read the coprocessor write pointer */ + cmdoffset -= 4U; + cmdoffset &= 0x0fffU; + return (EVE_memRead32(EVE_RAM_CMD + cmdoffset)); +} + +/** + * @brief Fill RAM_G with a byte value. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_memset(uint32_t ptr, uint8_t value, uint32_t num) +{ + eve_begin_cmd(CMD_MEMSET); + spi_transmit_32(ptr); + spi_transmit_32((uint32_t)value); + spi_transmit_32(num); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Write bytes into RAM_G using the coprocessor. + * @note - Commented out, just use one of the EVE_memWrite* helper functions to directly write to EVEs memory. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +/* +void EVE_cmd_memwrite(uint32_t dest, uint32_t num, const uint8_t *p_data) +{ + eve_begin_cmd(CMD_MEMWRITE); + spi_transmit_32(dest); + spi_transmit_32(num); + + num = (num + 3U) & (~3U); + + for (uint32_t count = 0U; count 2 + if ((0UL == (options & EVE_OPT_MEDIAFIFO)) && + (0UL == (options & EVE_OPT_FLASH))) /* direct data, neither by Media-FIFO or from Flash */ +#else + if (0UL == (options & EVE_OPT_MEDIAFIFO)) /* direct data, not by Media-FIFO */ +#endif + { + if (p_data != NULL) + { + block_transfer(p_data, len); + } + } +} + +/** + * @brief Rotate the screen and set up transform matrix accordingly. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_setrotate(uint32_t rotation) +{ + eve_begin_cmd(CMD_SETROTATE); + spi_transmit_32(rotation); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Take a snapshot of the current screen. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_snapshot(uint32_t ptr) +{ + eve_begin_cmd(CMD_SNAPSHOT); + spi_transmit_32(ptr); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Take a snapshot of part of the current screen with format option. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_snapshot2(uint32_t fmt, uint32_t ptr, int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt) +{ + eve_begin_cmd(CMD_SNAPSHOT2); + spi_transmit_32(fmt); + spi_transmit_32(ptr); + + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (hgt)); + spi_transmit((uint8_t) (hgt >> 8U)); + + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Track touches for a graphics object. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_track(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t tag) +{ + eve_begin_cmd(CMD_TRACK); + + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (hgt)); + spi_transmit((uint8_t) (hgt >> 8U)); + + spi_transmit((uint8_t) (tag)); + spi_transmit((uint8_t) (tag >> 8U)); + spi_transmit(0U); + spi_transmit(0U); + + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/** + * @brief Load the next frame of a video. + * @note - Meant to be called outside display-list building. + * @note - Includes executing the command and waiting for completion. + * @note - Does not support burst-mode. + */ +void EVE_cmd_videoframe(uint32_t dest, uint32_t result_ptr) +{ + eve_begin_cmd(CMD_VIDEOFRAME); + spi_transmit_32(dest); + spi_transmit_32(result_ptr); + EVE_cs_clear(); + EVE_execute_cmd(); +} + +/* ################################################################## + patching and initialization +#################################################################### */ + +#if EVE_GEN > 2 + +/** + * @brief EVE flash initialization for BT81x, switches the FLASH attached to a BT81x to full-speed mode + * @return Returns E_OK in case of success, EVE_FAIL_FLASH_STATUS_INIT if the status remains init, + * EVE_FAIL_FLASH_STATUS_DETACHED if no flash chip was found, a number of different values for failures with + * cmd_flashfast and E_NOT_OK if a not supported status is returned in REG_FLASH_STATUS. + */ +uint8_t EVE_init_flash(void) +{ + uint8_t timeout = 0U; + uint8_t status; + uint8_t ret_val = E_NOT_OK; + + status = EVE_memRead8(REG_FLASH_STATUS); /* should be 0x02 - FLASH_STATUS_BASIC, power-up is done and the attached flash is detected */ + + /* we are somehow still in init, give it a litte more time, this should never happen */ + while (EVE_FLASH_STATUS_INIT == status) + { + status = EVE_memRead8(REG_FLASH_STATUS); + DELAY_MS(1U); + timeout++; + if (timeout > 100U) /* 100ms and still in init, lets call quits now and exit with an error */ + { + ret_val = EVE_FAIL_FLASH_STATUS_INIT; + break; + } + } + + /* no flash was found during init, no flash present or the detection failed, give it another try */ + if (EVE_FLASH_STATUS_DETACHED == status) + { + EVE_cmd_dl(CMD_FLASHATTACH); + EVE_execute_cmd(); + status = EVE_memRead8(REG_FLASH_STATUS); + if (status != 2U) /* still not in FLASH_STATUS_BASIC, time to give up */ + { + ret_val = EVE_FAIL_FLASH_STATUS_DETACHED; + } + } + + /* flash detected and ready for action, move it up to FLASH_STATUS_FULL */ + if (EVE_FLASH_STATUS_BASIC == status) + { + uint32_t result; + + result = EVE_cmd_flashfast(); + + switch (result) + { + case 0x0000UL: + ret_val = E_OK; + break; + + case 0xE001UL: + ret_val = EVE_FAIL_FLASHFAST_NOT_SUPPORTED; + break; + + case 0xE002UL: + ret_val = EVE_FAIL_FLASHFAST_NO_HEADER_DETECTED; + break; + + case 0xE003UL: + ret_val = EVE_FAIL_FLASHFAST_SECTOR0_FAILED; + break; + + case 0xE004UL: + ret_val = EVE_FAIL_FLASHFAST_BLOB_MISMATCH; + break; + + case 0xE005UL: + ret_val = EVE_FAIL_FLASHFAST_SPEED_TEST; + break; + + default: /* we have an unknown error, so just return failure */ + ret_val = E_NOT_OK; + break; + } + } + + if (EVE_FLASH_STATUS_FULL == status) /* we are already there, why has this function been called? */ + { + ret_val = E_OK; + } + + return (ret_val); +} + +#endif /* EVE_GEN > 2 */ + +#if EVE_GEN < 3 +#if defined (__AVR__) +#include +#else +#define PROGMEM +#endif +#endif + +static void use_gt911(void); + +static void use_gt911(void) +{ +#if EVE_GEN > 2 + EVE_memWrite16(REG_TOUCH_CONFIG, 0x05d0U); /* switch to Goodix touch controller */ +#else + +/* FT811 / FT813 binary-blob from FTDIs AN_336 to patch the touch-engine for Goodix GT911 / GT9271 touch controllers */ +const uint8_t eve_gt911_data[1184U] PROGMEM = +{ + 26, 255, 255, 255, 32, 32, 48, 0, 4, 0, 0, 0, 2, 0, 0, 0, 34, 255, 255, 255, 0, 176, 48, + 0, 120, 218, 237, 84, 221, 111, 84, 69, 20, 63, 51, 179, 93, 160, 148, 101, 111, 76, 5, 44, 141, 123, + 111, 161, 11, 219, 154, 16, 9, 16, 17, 229, 156, 75, 26, 11, 13, 21, 227, 3, 16, 252, 184, 179, 45, + 219, 143, 45, 41, 125, 144, 72, 67, 100, 150, 71, 189, 113, 18, 36, 17, 165, 100, 165, 198, 16, 32, 17, + 149, 196, 240, 128, 161, 16, 164, 38, 54, 240, 0, 209, 72, 130, 15, 38, 125, 48, 66, 82, 30, 76, 19, + 31, 172, 103, 46, 139, 24, 255, 4, 227, 157, 204, 156, 51, 115, 102, 206, 231, 239, 220, 5, 170, 94, 129, + 137, 75, 194, 216, 98, 94, 103, 117, 115, 121, 76, 131, 177, 125, 89, 125, 82, 123, 60, 243, 58, 142, 242, + 204, 185, 243, 188, 118, 156, 227, 155, 203, 238, 238, 195, 251, 205, 229, 71, 92, 28, 169, 190, 184, 84, 143, + 113, 137, 53, 244, 103, 181, 237, 87, 253, 113, 137, 233, 48, 12, 198, 165, 181, 104, 139, 25, 84, 253, 155, + 114, 74, 191, 0, 54, 138, 163, 12, 62, 131, 207, 129, 23, 217, 34, 91, 31, 128, 65, 246, 163, 175, 213, + 8, 147, 213, 107, 35, 203, 94, 108, 3, 111, 40, 171, 83, 24, 15, 165, 177, 222, 116, 97, 23, 188, 140, + 206, 150, 42, 102, 181, 87, 78, 86, 182, 170, 134, 215, 241, 121, 26, 243, 252, 2, 76, 115, 217, 139, 222, + 206, 173, 136, 132, 81, 61, 35, 185, 39, 113, 23, 46, 199, 76, 178, 54, 151, 183, 224, 0, 40, 189, 28, + 149, 182, 58, 131, 79, 152, 30, 76, 34, 98, 234, 162, 216, 133, 141, 102, 39, 170, 40, 192, 101, 53, 201, + 146, 191, 37, 77, 44, 177, 209, 74, 211, 5, 206, 187, 5, 6, 216, 47, 53, 96, 123, 22, 50, 103, 251, + 192, 84, 17, 74, 227, 185, 56, 106, 51, 91, 161, 96, 182, 163, 48, 171, 141, 139, 65, 152, 66, 66, 11, + 102, 43, 158, 75, 36, 80, 147, 184, 147, 139, 112, 17, 235, 216, 103, 111, 239, 245, 92, 10, 175, 194, 40, + 44, 58, 125, 5, 59, 112, 50, 103, 245, 4, 78, 192, 5, 156, 194, 51, 60, 191, 134, 75, 110, 173, 237, + 46, 192, 121, 156, 192, 115, 184, 218, 120, 67, 63, 115, 46, 11, 102, 10, 97, 232, 50, 235, 114, 182, 148, + 118, 178, 41, 188, 12, 135, 77, 202, 124, 12, 96, 238, 35, 161, 234, 189, 129, 23, 249, 212, 139, 230, 25, + 53, 48, 205, 52, 93, 163, 117, 53, 154, 170, 81, 85, 163, 178, 70, 69, 66, 167, 241, 14, 46, 241, 1, + 226, 136, 152, 179, 197, 59, 184, 148, 254, 49, 132, 48, 15, 176, 137, 192, 76, 131, 196, 105, 104, 162, 86, + 81, 160, 165, 255, 26, 173, 162, 137, 86, 145, 210, 183, 192, 55, 175, 194, 211, 60, 91, 120, 230, 184, 174, + 27, 41, 131, 155, 40, 224, 29, 87, 179, 232, 16, 55, 55, 7, 165, 147, 81, 23, 165, 49, 101, 54, 224, + 75, 180, 81, 108, 18, 29, 226, 69, 225, 110, 175, 224, 42, 212, 25, 47, 130, 193, 110, 234, 192, 215, 252, + 56, 74, 162, 24, 46, 251, 174, 54, 106, 68, 245, 14, 9, 155, 160, 22, 120, 207, 104, 240, 29, 90, 178, + 140, 28, 24, 220, 47, 166, 112, 61, 251, 208, 192, 111, 56, 239, 238, 93, 255, 251, 62, 99, 32, 193, 75, + 61, 190, 235, 123, 229, 110, 218, 194, 85, 79, 225, 59, 98, 20, 238, 227, 235, 220, 11, 221, 149, 25, 180, + 116, 194, 159, 111, 96, 192, 24, 213, 59, 139, 179, 156, 215, 69, 230, 19, 24, 35, 135, 117, 206, 171, 206, + 162, 67, 129, 234, 61, 235, 11, 104, 103, 84, 64, 223, 167, 254, 40, 163, 101, 92, 84, 43, 150, 46, 249, + 219, 205, 7, 116, 11, 91, 104, 61, 57, 75, 223, 8, 48, 25, 28, 119, 252, 222, 113, 49, 86, 249, 74, + 180, 211, 156, 181, 61, 215, 168, 157, 7, 251, 199, 150, 242, 250, 91, 58, 132, 94, 121, 7, 53, 151, 139, + 98, 6, 165, 153, 69, 214, 32, 110, 211, 100, 101, 31, 89, 45, 81, 98, 23, 205, 205, 197, 209, 109, 186, + 198, 35, 141, 191, 249, 25, 60, 132, 223, 153, 251, 98, 20, 239, 146, 139, 20, 217, 250, 41, 250, 137, 58, + 177, 90, 57, 79, 51, 108, 233, 20, 253, 194, 187, 49, 222, 205, 114, 141, 96, 48, 175, 219, 107, 54, 111, + 138, 22, 154, 103, 108, 79, 58, 252, 179, 178, 79, 164, 195, 2, 153, 36, 39, 170, 199, 201, 167, 197, 85, + 106, 8, 59, 177, 81, 46, 56, 2, 230, 75, 114, 17, 55, 112, 188, 65, 208, 137, 77, 114, 10, 115, 55, + 58, 208, 197, 173, 122, 87, 6, 140, 110, 42, 208, 124, 163, 70, 108, 241, 104, 18, 245, 98, 214, 187, 134, + 53, 42, 221, 22, 182, 133, 211, 116, 148, 177, 194, 209, 192, 85, 90, 199, 58, 55, 203, 2, 229, 19, 137, + 187, 161, 228, 154, 112, 203, 145, 125, 244, 188, 220, 118, 228, 41, 201, 181, 41, 195, 144, 215, 183, 51, 80, + 250, 21, 217, 16, 217, 200, 235, 109, 227, 188, 122, 218, 142, 60, 170, 224, 112, 240, 184, 130, 229, 224, 113, + 5, 223, 148, 163, 80, 165, 183, 130, 187, 132, 116, 64, 238, 161, 85, 220, 115, 139, 205, 98, 227, 244, 29, + 102, 125, 7, 37, 243, 123, 223, 11, 26, 92, 63, 243, 116, 61, 191, 138, 123, 244, 160, 84, 186, 74, 31, + 5, 174, 247, 119, 135, 199, 248, 253, 135, 242, 97, 102, 145, 190, 144, 14, 85, 238, 221, 231, 193, 158, 48, + 205, 25, 120, 248, 15, 220, 29, 158, 9, 70, 185, 30, 103, 229, 33, 254, 23, 237, 160, 172, 62, 193, 90, + 222, 224, 232, 14, 200, 56, 90, 104, 142, 227, 120, 110, 6, 21, 211, 203, 65, 150, 99, 151, 220, 247, 87, + 164, 50, 159, 49, 239, 234, 58, 142, 0, 109, 108, 123, 18, 79, 227, 36, 100, 248, 222, 205, 96, 127, 120, + 26, 171, 228, 69, 63, 36, 17, 252, 200, 17, 116, 242, 187, 227, 88, 143, 247, 2, 75, 191, 6, 130, 59, + 188, 11, 55, 240, 31, 243, 122, 152, 226, 183, 207, 154, 73, 188, 39, 219, 43, 105, 222, 87, 41, 143, 141, + 140, 175, 73, 112, 184, 252, 61, 184, 16, 90, 250, 35, 168, 82, 119, 176, 57, 116, 94, 200, 150, 22, 190, + 179, 44, 104, 12, 235, 84, 149, 102, 252, 89, 154, 193, 99, 228, 106, 242, 125, 248, 64, 194, 255, 223, 127, + 242, 83, 11, 255, 2, 70, 214, 226, 128, 0, 0 +}; + + EVE_cs_set(); + spi_transmit((uint8_t) 0xB0U); /* high-byte of REG_CMDB_WRITE + MEM_WRITE */ + spi_transmit((uint8_t) 0x25U); /* middle-byte of REG_CMDB_WRITE */ + spi_transmit((uint8_t) 0x78U); /* low-byte of REG_CMDB_WRITE */ + private_block_write(eve_gt911_data, sizeof(eve_gt911_data)); + EVE_cs_clear(); + EVE_execute_cmd(); + + EVE_memWrite8(REG_TOUCH_OVERSAMPLE, 0x0fU); /* setup oversample to 0x0f as "hidden" in binary-blob for AN_336 */ + EVE_memWrite16(REG_TOUCH_CONFIG, 0x05D0U); /* write magic cookie as requested by AN_336 */ + + /* specific to the EVE2 modules from Matrix-Orbital we have to use GPIO3 to reset GT911 */ + EVE_memWrite16(REG_GPIOX_DIR, 0x8008U); /* Reset-Value is 0x8000, adding 0x08 sets GPIO3 to output, default-value + for REG_GPIOX is 0x8000 -> Low output on GPIO3 */ + DELAY_MS(1U); /* wait more than 100us */ + EVE_memWrite8(REG_CPURESET, 0U); /* clear all resets */ + DELAY_MS(110U); /* wait more than 55ms - does not work with multitouch, for some reason a minimum delay of 108ms is + required */ + EVE_memWrite16(REG_GPIOX_DIR, 0x8000U); /* setting GPIO3 back to input */ +#endif +} + +/** + * @brief Waits for either reading REG_ID with a value of 0x7c, indicating that + * an EVE chip is present and ready to communicate, or untill a timeout of 400ms has passed. + * @return Returns E_OK in case of success, EVE_FAIL_REGID_TIMEOUT if the + * value of 0x7c could not be read. + */ +static uint8_t wait_regid(void) +{ + uint8_t ret = EVE_FAIL_REGID_TIMEOUT; + uint8_t regid = 0U; + + for (uint16_t timeout = 0U; timeout < 400U; timeout++) + { + DELAY_MS(1U); + + regid = EVE_memRead8(REG_ID); + if (0x7cU == regid) /* EVE is up and running */ + { + ret = E_OK; + break; + } + } + + return (ret); +} + +/** + * @brief Waits for either REG_CPURESET to indicate that the audio, touch and + * coprocessor units finished their respective reset cycles, + * or untill a timeout of 50ms has passed. + * @return Returns E_OK in case of success, EVE_FAIL_RESET_TIMEOUT if either the + * audio, touch or coprocessor unit indicate a fault by not returning from reset. + */ +static uint8_t wait_reset(void) +{ + uint8_t ret = EVE_FAIL_RESET_TIMEOUT; + uint8_t reset = 0U; + + for (uint16_t timeout = 0U; timeout < 50U; timeout++) + { + DELAY_MS(1U); + + reset = EVE_memRead8(REG_CPURESET) & 7U; + if (0U == reset) /* EVE reports all units running */ + { + ret = E_OK; + break; + } + } + + return (ret); +} + +/** + * @brief Writes all parameters defined for the display selected in EVE_config.h. + * to the corresponding registers. + * It is used by EVE_init() and can be used to refresh the register values if needed. + */ +void EVE_write_display_parameters(void) +{ + /* Initialize Display */ + EVE_memWrite16(REG_HSIZE, EVE_HSIZE); /* active display width */ + EVE_memWrite16(REG_HCYCLE, EVE_HCYCLE); /* total number of clocks per line, incl front/back porch */ + EVE_memWrite16(REG_HOFFSET, EVE_HOFFSET); /* start of active line */ + EVE_memWrite16(REG_HSYNC0, EVE_HSYNC0); /* start of horizontal sync pulse */ + EVE_memWrite16(REG_HSYNC1, EVE_HSYNC1); /* end of horizontal sync pulse */ + EVE_memWrite16(REG_VSIZE, EVE_VSIZE); /* active display height */ + EVE_memWrite16(REG_VCYCLE, EVE_VCYCLE); /* total number of lines per screen, including pre/post */ + EVE_memWrite16(REG_VOFFSET, EVE_VOFFSET); /* start of active screen */ + EVE_memWrite16(REG_VSYNC0, EVE_VSYNC0); /* start of vertical sync pulse */ + EVE_memWrite16(REG_VSYNC1, EVE_VSYNC1); /* end of vertical sync pulse */ + EVE_memWrite8(REG_SWIZZLE, EVE_SWIZZLE); /* FT8xx output to LCD - pin order */ + EVE_memWrite8(REG_PCLK_POL, EVE_PCLKPOL); /* LCD data is clocked in on this PCLK edge */ + EVE_memWrite8(REG_CSPREAD, EVE_CSPREAD); /* helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ + + /* configure Touch */ + EVE_memWrite8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS); /* enable touch */ +#if defined (EVE_TOUCH_RZTHRESH) + EVE_memWrite16(REG_TOUCH_RZTHRESH, EVE_TOUCH_RZTHRESH); /* configure the sensitivity of resistive touch */ +#else + EVE_memWrite16(REG_TOUCH_RZTHRESH, 1200U); /* set a reasonable default value if none is given */ +#endif + +#if defined (EVE_ROTATE) + EVE_memWrite8(REG_ROTATE, EVE_ROTATE & 7U); /* bit0 = invert, bit2 = portrait, bit3 = mirrored */ + /* reset default value is 0x0 - not inverted, landscape, not mirrored */ +#endif +} + +static void enable_pixel_clock(void) +{ + EVE_memWrite8(REG_GPIO, 0x80U); /* enable the DISP signal to the LCD panel, it is set to output in REG_GPIO_DIR by default */ + +#if (EVE_GEN > 3) && (defined EVE_PCLK_FREQ) + EVE_memWrite16(REG_PCLK_FREQ, (uint16_t) EVE_PCLK_FREQ); + +#if defined (EVE_SET_REG_PCLK_2X) + EVE_memWrite8(REG_PCLK_2X, 1U); +#endif + + EVE_memWrite8(REG_PCLK, 1U); /* enable extsync mode */ +#else + EVE_memWrite8(REG_PCLK, EVE_PCLK); /* start clocking data to the LCD panel */ +#endif +} + +/** + * @brief Initializes EVE according to the selected configuration from EVE_config.h. + * @return E_OK in case of success + * @note - Has to be executed with the SPI setup to 11 MHz or less as required by FT8xx / BT8xx! + * @note - Additional settings can be made through extra macros. + * @note - EVE_TOUCH_RZTHRESH - configure the sensitivity of resistive touch, defaults to 1200. + * @note - EVE_ROTATE - set the screen rotation: bit0 = invert, bit1 = portrait, bit2 = mirrored. + * @note - needs a set of calibration values for the selected rotation since this rotates before calibration! + * @note - EVE_BACKLIGHT_FREQ - configure the backlight frequency, default is not writing it which results in 250Hz. + * @note - EVE_BACKLIGHT_PWM - configure the backlight pwm, defaults to 0x20 / 25%. + */ +uint8_t EVE_init(void) +{ + uint8_t ret; + + EVE_pdn_set(); + DELAY_MS(6U); /* minimum time for power-down is 5ms */ + EVE_pdn_clear(); + DELAY_MS(21U); /* minimum time to allow from rising PD_N to first access is 20ms */ + +#if defined (EVE_GD3X) + EVE_cmdWrite(EVE_RST_PULSE,0U); /* reset, only required for warm-start if PowerDown line is not used */ +#endif + + if(EVE_HAS_CRYSTAL) { + EVE_cmdWrite(EVE_CLKEXT, 0U); /* setup EVE for external clock */ + } + else { + EVE_cmdWrite(EVE_CLKINT, 0U); /* setup EVE for internal clock */ + } + +#if EVE_GEN > 2 + EVE_cmdWrite(EVE_CLKSEL, 0x46U); /* set clock to 72 MHz */ +#endif + + EVE_cmdWrite(EVE_ACTIVE, 0U); /* start EVE */ + DELAY_MS(40U); /* give EVE a moment of silence to power up */ + + ret = wait_regid(); + if (E_OK == ret) + { + ret = wait_reset(); + if (E_OK == ret) + { +/* tell EVE that we changed the frequency from default to 72MHz for BT8xx */ +#if EVE_GEN > 2 + EVE_memWrite32(REG_FREQUENCY, 72000000UL); +#endif + +/* we have a display with a Goodix GT911 / GT9271 touch-controller on it, + so we patch our FT811 or FT813 according to AN_336 or setup a BT815 / BT817 accordingly */ + if(EVE_HAS_GT911) { + use_gt911(); + } + +#if defined (EVE_ADAM101) + EVE_memWrite8(REG_PWM_DUTY, 0x80U); /* turn off backlight for Glyn ADAM101 module, it uses inverted values */ +#else + EVE_memWrite8(REG_PWM_DUTY, 0U); /* turn off backlight for any other module */ +#endif + EVE_write_display_parameters(); + + /* disable Audio for now */ + EVE_memWrite8(REG_VOL_PB, 0U); /* turn recorded audio volume down, reset-default is 0xff */ + EVE_memWrite8(REG_VOL_SOUND, 0U); /* turn synthesizer volume down, reset-default is 0xff */ + EVE_memWrite16(REG_SOUND, EVE_MUTE); /* set synthesizer to mute */ + + /* write a basic display-list to get things started */ + EVE_memWrite32(EVE_RAM_DL, DL_CLEAR_COLOR_RGB); + EVE_memWrite32(EVE_RAM_DL + 4U, (DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG)); + EVE_memWrite32(EVE_RAM_DL + 8U, DL_DISPLAY); /* end of display list */ + EVE_memWrite32(REG_DLSWAP, EVE_DLSWAP_FRAME); + /* nothing is being displayed yet... the pixel clock is still 0x00 */ + +#if defined (EVE_GD3X) + EVE_memWrite16(REG_OUTBITS,0x01B6U); /* the GD3X is only using 6 bits per color */ +#endif + + enable_pixel_clock(); + + EVE_memWrite16(REG_PWM_HZ, EVE_BACKLIGHT_FREQ); /* set backlight frequency to configured value */ + + EVE_memWrite8(REG_PWM_DUTY, EVE_BACKLIGHT_PWM); /* set backlight pwm to user requested level */ + DELAY_MS(1U); + EVE_execute_cmd(); /* just to be safe, wait for EVE to not be busy */ + +#if defined (EVE_DMA) + EVE_init_dma(); /* prepare DMA */ +#endif + } + } + + return (ret); +} + +/* ################################################################## + functions for display lists +##################################################################### */ + +/** + * @brief Begin a sequence of commands or prepare a DMA transfer if applicable. + * @note - Needs to be used with EVE_end_cmd_burst(). + * @note - Do not use any functions in the sequence that do not address the command-fifo as for example any of EVE_mem...() functions. + * @note - Do not use any of the functions that do not support burst-mode. + */ +void EVE_start_cmd_burst(void) +{ +#if defined (EVE_DMA) + if (EVE_dma_busy) + { + EVE_execute_cmd(); /* this is a safe-guard to protect segmented display-list building with DMA from overlapping */ + } +#endif + + cmd_burst = 42U; + +#if defined (EVE_DMA) + EVE_dma_buffer[0U] = 0x7825B000UL; /* REG_CMDB_WRITE + MEM_WRITE low mid hi 00 */ +// ((uint8_t) (ft_address >> 16U) | MEM_WRITE) | (ft_address & 0x0000ff00UL) | ((uint8_t) (ft_address) << 16U); +// EVE_dma_buffer[0U] = EVE_dma_buffer[0U] << 8U; + EVE_dma_buffer_index = 1U; +#else + EVE_cs_set(); + spi_transmit((uint8_t) 0xB0U); /* high-byte of REG_CMDB_WRITE + MEM_WRITE */ + spi_transmit((uint8_t) 0x25U); /* middle-byte of REG_CMDB_WRITE */ + spi_transmit((uint8_t) 0x78U); /* low-byte of REG_CMDB_WRITE */ +#endif +} + +/** + * @brief End a sequence of commands or trigger a prepared DMA transfer if applicable. + * @note - Needs to be used with EVE_start_cmd_burst(). + */ +void EVE_end_cmd_burst(void) +{ + cmd_burst = 0U; + +#if defined (EVE_DMA) + EVE_start_dma_transfer(); /* begin DMA transfer */ +#else + EVE_cs_clear(); +#endif +} + +/* write a string to coprocessor memory in context of a command: */ +/* no chip-select, just plain SPI-transfers */ +static void private_string_write(const char *p_text) +{ + /* treat the array as bunch of bytes */ + const uint8_t *const p_bytes = (const uint8_t *)p_text; + + if (0U == cmd_burst) + { + uint8_t textindex = 0U; + uint8_t padding; + + /* either leave on Zero or when the string is too long */ + while ((textindex < 249U) && (p_bytes[textindex] != 0U)) + { + spi_transmit(p_bytes[textindex]); + textindex++; + } + + /* transmit at least one 0x00 byte */ + /* and up to four if the string happens to be 4-byte aligned already */ + padding = textindex & 3U; /* 0, 1, 2 or 3 */ + padding = 4U - padding; /* 4, 3, 2 or 1 */ + + while (padding > 0U) + { + spi_transmit(0U); + padding--; + } + } + else /* we are in burst mode, so every transfer is 32 bits */ + { + for (uint8_t textindex = 0U; textindex < 249U; textindex += 4U) + { + uint32_t calc = 0U; + + for (uint8_t index = 0U; index < 4U; index++) + { + uint8_t data; + + data = p_bytes[textindex + index]; + + if (0U == data) + { + spi_transmit_burst(calc); + return; /* MISRA 2012 rule 15.5 (advisory) violation */ + } + + calc += ((uint32_t)data) << (index * 8U); + } + + spi_transmit_burst(calc); + } + + spi_transmit_burst(0U); /* executed when the line is too long */ + } +} + +/* BT817 / BT818 */ +#if EVE_GEN > 3 + +/** + * @brief Render one frame in RAM_G of an animation. + */ +void EVE_cmd_animframeram(int16_t xc0, int16_t yc0, uint32_t aoptr, uint32_t frame) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ANIMFRAMERAM); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit_32(aoptr); + spi_transmit_32(frame); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ANIMFRAMERAM); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(aoptr); + spi_transmit_burst(frame); + } +} + +/** + * @brief Render one frame in RAM_G of an animation, only works in burst-mode. + */ +void EVE_cmd_animframeram_burst(int16_t xc0, int16_t yc0, uint32_t aoptr, + uint32_t frame) +{ + spi_transmit_burst(CMD_ANIMFRAMERAM); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(aoptr); + spi_transmit_burst(frame); +} + +/** + * @brief Start an animation in RAM_G. + */ +void EVE_cmd_animstartram(int32_t chnl, uint32_t aoptr, uint32_t loop) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ANIMSTARTRAM); + spi_transmit_32((uint32_t) chnl); + spi_transmit_32(aoptr); + spi_transmit_32(loop); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ANIMSTARTRAM); + spi_transmit_burst((uint32_t) chnl); + spi_transmit_burst(aoptr); + spi_transmit_burst(loop); + } +} + +/** + * @brief Start an animation in RAM_G, only works in burst-mode. + */ +void EVE_cmd_animstartram_burst(int32_t chnl, uint32_t aoptr, uint32_t loop) +{ + spi_transmit_burst(CMD_ANIMSTARTRAM); + spi_transmit_burst((uint32_t) chnl); + spi_transmit_burst(aoptr); + spi_transmit_burst(loop); +} + +/** + * @brief Sets the API level used by the coprocessor. + */ +void EVE_cmd_apilevel(uint32_t level) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_APILEVEL); + spi_transmit_32(level); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_APILEVEL); + spi_transmit_burst(level); + } +} + +/** + * @brief Sets the API level used by the coprocessor, only works in burst-mode. + */ +void EVE_cmd_apilevel_burst(uint32_t level) +{ + spi_transmit_burst(CMD_APILEVEL); + spi_transmit_burst(level); +} + +/** + * @brief Execute the touch screen calibration routine for a sub-window. + * @note - Does not support burst-mode. + */ +void EVE_cmd_calibratesub(uint16_t xc0, uint16_t yc0, uint16_t width, uint16_t height) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_CALIBRATESUB); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (width)); + spi_transmit((uint8_t) (width >> 8U)); + spi_transmit((uint8_t) (height)); + spi_transmit((uint8_t) (height >> 8U)); + EVE_cs_clear(); + } +} + +/** + * @brief Calls a command list in RAM_G. + */ +void EVE_cmd_calllist(uint32_t adr) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_CALLLIST); + spi_transmit_32(adr); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_CALLLIST); + spi_transmit_burst(adr); + } +} + +/** + * @brief Calls a command list in RAM_G, only works in burst-mode. + */ +void EVE_cmd_calllist_burst(uint32_t adr) +{ + spi_transmit_burst(CMD_CALLLIST); + spi_transmit_burst(adr); +} + +/** + * @brief Setup the Horizontal Scan out Filter for non-square pixel LCD support. + * @note - Does not support burst-mode. + */ +void EVE_cmd_hsf(uint32_t hsf) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_HSF); + spi_transmit_32(hsf); + EVE_cs_clear(); + } +} + +/** + * @brief Play/run animations until complete. + */ +void EVE_cmd_runanim(uint32_t waitmask, uint32_t play) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_RUNANIM); + spi_transmit_32(waitmask); + spi_transmit_32(play); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_RUNANIM); + spi_transmit_burst(waitmask); + spi_transmit_burst(play); + } +} + +/** + * @brief Play/run animations until complete, only works in burst-mode. + */ +void EVE_cmd_runanim_burst(uint32_t waitmask, uint32_t play) +{ + spi_transmit_burst(CMD_RUNANIM); + spi_transmit_burst(waitmask); + spi_transmit_burst(play); +} + +#endif /* EVE_GEN > 3 */ + +/* BT815 / BT816 */ +#if EVE_GEN > 2 + +/** + * @brief Draw one or more active animations. + */ +void EVE_cmd_animdraw(int32_t chnl) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ANIMDRAW); + spi_transmit_32((uint32_t) chnl); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ANIMDRAW); + spi_transmit_burst((uint32_t) chnl); + } +} + +/** + * @brief Draw one or more active animations, only works in burst-mode. + */ +void EVE_cmd_animdraw_burst(int32_t chnl) +{ + spi_transmit_burst(CMD_ANIMDRAW); + spi_transmit_burst((uint32_t) chnl); +} + +/** + * @brief Draw the specified frame of an animation. + */ +void EVE_cmd_animframe(int16_t xc0, int16_t yc0, uint32_t aoptr, uint32_t frame) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ANIMFRAME); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit_32(aoptr); + spi_transmit_32(frame); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ANIMFRAME); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(aoptr); + spi_transmit_burst(frame); + } +} + +/** + * @brief Draw the specified frame of an animation, only works in burst-mode. + */ +void EVE_cmd_animframe_burst(int16_t xc0, int16_t yc0, uint32_t aoptr, + uint32_t frame) +{ + spi_transmit_burst(CMD_ANIMFRAME); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(aoptr); + spi_transmit_burst(frame); +} + +/** + * @brief Start an animation. + */ +void EVE_cmd_animstart(int32_t chnl, uint32_t aoptr, uint32_t loop) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ANIMSTART); + spi_transmit_32((uint32_t) chnl); + spi_transmit_32(aoptr); + spi_transmit_32(loop); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ANIMSTART); + spi_transmit_burst((uint32_t) chnl); + spi_transmit_burst(aoptr); + spi_transmit_burst(loop); + } +} + +/** + * @brief Start an animation, only works in burst-mode. + */ +void EVE_cmd_animstart_burst(int32_t chnl, uint32_t aoptr, uint32_t loop) +{ + spi_transmit_burst(CMD_ANIMSTART); + spi_transmit_burst((uint32_t) chnl); + spi_transmit_burst(aoptr); + spi_transmit_burst(loop); +} + +/** + * @brief Stops one or more active animations. + */ +void EVE_cmd_animstop(int32_t chnl) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ANIMSTOP); + spi_transmit_32((uint32_t) chnl); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ANIMSTOP); + spi_transmit_burst((uint32_t) chnl); + } +} + +/** + * @brief Stops one or more active animations, only works in burst-mode. + */ +void EVE_cmd_animstop_burst(int32_t chnl) +{ + spi_transmit_burst(CMD_ANIMSTOP); + spi_transmit_burst((uint32_t) chnl); +} + +/** + * @brief Sets the coordinates of an animation. + */ +void EVE_cmd_animxy(int32_t chnl, int16_t xc0, int16_t yc0) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ANIMXY); + spi_transmit_32((uint32_t) chnl); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ANIMXY); + spi_transmit_burst((uint32_t) chnl); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + } +} + +/** + * @brief Sets the coordinates of an animation, only works in burst-mode. + */ +void EVE_cmd_animxy_burst(int32_t chnl, int16_t xc0, int16_t yc0) +{ + spi_transmit_burst(CMD_ANIMXY); + spi_transmit_burst((uint32_t) chnl); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); +} + +/** + * @brief Append flash data to the display list. + */ +void EVE_cmd_appendf(uint32_t ptr, uint32_t num) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_APPENDF); + spi_transmit_32(ptr); + spi_transmit_32(num); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_APPENDF); + spi_transmit_burst(ptr); + spi_transmit_burst(num); + } +} + +/** + * @brief Append flash data to the display list, only works in burst-mode. + */ +void EVE_cmd_appendf_burst(uint32_t ptr, uint32_t num) +{ + spi_transmit_burst(CMD_APPENDF); + spi_transmit_burst(ptr); + spi_transmit_burst(num); +} + +/** + * @brief Computes a bitmap transform and appends commands BITMAP_TRANSFORM_A...BITMAP_TRANSFORM_F to the display list. + */ +uint16_t EVE_cmd_bitmap_transform(int32_t xc0, int32_t yc0, int32_t xc1, + int32_t yc1, int32_t xc2, int32_t yc2, + int32_t tx0, int32_t ty0, int32_t tx1, + int32_t ty1, int32_t tx2, int32_t ty2) +{ + uint16_t ret_val = 0U; + + if (0U == cmd_burst) + { + uint16_t cmdoffset; + + eve_begin_cmd(CMD_BITMAP_TRANSFORM); + spi_transmit_32((uint32_t) xc0); + spi_transmit_32((uint32_t) yc0); + spi_transmit_32((uint32_t) xc1); + spi_transmit_32((uint32_t) yc1); + spi_transmit_32((uint32_t) xc2); + spi_transmit_32((uint32_t) yc2); + spi_transmit_32((uint32_t) tx0); + spi_transmit_32((uint32_t) ty0); + spi_transmit_32((uint32_t) tx1); + spi_transmit_32((uint32_t) ty1); + spi_transmit_32((uint32_t) tx2); + spi_transmit_32((uint32_t) ty2); + spi_transmit_32(0UL); + EVE_cs_clear(); + EVE_execute_cmd(); + cmdoffset = EVE_memRead16(REG_CMD_WRITE); + cmdoffset -= 4U; + cmdoffset &= 0x0fffU; + ret_val = (uint16_t) EVE_memRead32(EVE_RAM_CMD + cmdoffset); + } + else /* note: the result parameter is ignored in burst mode */ + { + spi_transmit_burst(CMD_BITMAP_TRANSFORM); + spi_transmit_burst((uint32_t) xc0); + spi_transmit_burst((uint32_t) yc0); + spi_transmit_burst((uint32_t) xc1); + spi_transmit_burst((uint32_t) yc1); + spi_transmit_burst((uint32_t) xc2); + spi_transmit_burst((uint32_t) yc2); + spi_transmit_burst((uint32_t) tx0); + spi_transmit_burst((uint32_t) ty0); + spi_transmit_burst((uint32_t) tx1); + spi_transmit_burst((uint32_t) ty1); + spi_transmit_burst((uint32_t) tx2); + spi_transmit_burst((uint32_t) ty2); + spi_transmit_burst(0UL); + } + return (ret_val); +} + +/** + * @brief Computes a bitmap transform and appends commands BITMAP_TRANSFORM_A...BITMAP_TRANSFORM_F to the display list. + * @note - Only works in burst-mode, the result parameter is ignored. + */ +void EVE_cmd_bitmap_transform_burst(int32_t xc0, int32_t yc0, int32_t xc1, + int32_t yc1, int32_t xc2, int32_t yc2, + int32_t tx0, int32_t ty0, int32_t tx1, + int32_t ty1, int32_t tx2, int32_t ty2) +{ + spi_transmit_burst(CMD_BITMAP_TRANSFORM); + spi_transmit_burst((uint32_t) xc0); + spi_transmit_burst((uint32_t) yc0); + spi_transmit_burst((uint32_t) xc1); + spi_transmit_burst((uint32_t) yc1); + spi_transmit_burst((uint32_t) xc2); + spi_transmit_burst((uint32_t) yc2); + spi_transmit_burst((uint32_t) tx0); + spi_transmit_burst((uint32_t) ty0); + spi_transmit_burst((uint32_t) tx1); + spi_transmit_burst((uint32_t) ty1); + spi_transmit_burst((uint32_t) tx2); + spi_transmit_burst((uint32_t) ty2); + spi_transmit_burst(0UL); +} + +/** + * @brief Sets the pixel fill width for CMD_TEXT,CMD_BUTTON,CMD_BUTTON with the OPT_FILL option. + */ +void EVE_cmd_fillwidth(uint32_t pixel) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_FILLWIDTH); + spi_transmit_32(pixel); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_FILLWIDTH); + spi_transmit_burst(pixel); + } +} + +/** + * @brief Sets the pixel fill width for CMD_TEXT,CMD_BUTTON,CMD_BUTTON with the OPT_FILL option. + * @note - Only works in burst-mode. + */ +void EVE_cmd_fillwidth_burst(uint32_t pixel) +{ + spi_transmit_burst(CMD_FILLWIDTH); + spi_transmit_burst(pixel); +} + +/** + * @brief Draw a smooth color gradient with transparency. + */ +void EVE_cmd_gradienta(int16_t xc0, int16_t yc0, uint32_t argb0, int16_t xc1, int16_t yc1, uint32_t argb1) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_GRADIENTA); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit_32(argb0); + spi_transmit((uint8_t) ((uint16_t) xc1)); + spi_transmit((uint8_t) (((uint16_t) xc1) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc1)); + spi_transmit((uint8_t) (((uint16_t) yc1) >> 8U)); + spi_transmit_32(argb1); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_GRADIENTA); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(argb0); + spi_transmit_burst(((uint32_t) ((uint16_t) xc1)) + (((uint32_t) ((uint16_t) yc1)) << 16U)); + spi_transmit_burst(argb1); + } +} + +/** + * @brief Draw a smooth color gradient with transparency, only works in burst-mode. + */ +void EVE_cmd_gradienta_burst(int16_t xc0, int16_t yc0, uint32_t argb0, int16_t xc1, int16_t yc1, uint32_t argb1) +{ + spi_transmit_burst(CMD_GRADIENTA); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(argb0); + spi_transmit_burst(((uint32_t) ((uint16_t) xc1)) + (((uint32_t) ((uint16_t) yc1)) << 16U)); + spi_transmit_burst(argb1); +} + +/** + * @brief Apply a rotation and scale around a specified coordinate. + */ +void EVE_cmd_rotatearound(int32_t xc0, int32_t yc0, uint32_t angle, int32_t scale) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ROTATEAROUND); + spi_transmit_32((uint32_t) xc0); + spi_transmit_32((uint32_t) yc0); + spi_transmit_32(angle & 0xFFFFUL); + spi_transmit_32((uint32_t) scale); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ROTATEAROUND); + spi_transmit_burst((uint32_t) xc0); + spi_transmit_burst((uint32_t) yc0); + spi_transmit_burst(angle & 0xFFFFUL); + spi_transmit_burst((uint32_t) scale); + } +} + +/** + * @brief Apply a rotation and scale around a specified coordinate, only works in burst-mode. + */ +void EVE_cmd_rotatearound_burst(int32_t xc0, int32_t yc0, uint32_t angle, + int32_t scale) +{ + spi_transmit_burst(CMD_ROTATEAROUND); + spi_transmit_burst((uint32_t) xc0); + spi_transmit_burst((uint32_t) yc0); + spi_transmit_burst(angle & 0xFFFFUL); + spi_transmit_burst((uint32_t) scale); +} + +/** + * @brief Draw a button with a label, varargs version. + * @param p_arguments[] pointer to an array of values converted to uint32_t to be used when using EVE_OPT_FORMAT + * @param num_args the number of elements provided in p_arguments[] + */ +void EVE_cmd_button_var(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t font, uint16_t options, const char *p_text, + uint8_t num_args, const uint32_t p_arguments[]) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_BUTTON); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (hgt)); + spi_transmit((uint8_t) (hgt >> 8U)); + spi_transmit((uint8_t) (font)); + spi_transmit((uint8_t) (font >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + private_string_write(p_text); + + if ((options & EVE_OPT_FORMAT) != 0U) + { + if (p_arguments != NULL) + { + for (uint8_t counter = 0U; counter < num_args; counter++) + { + spi_transmit_32(p_arguments[counter]); + } + } + } + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_BUTTON); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + ((uint32_t) hgt << 16U)); + spi_transmit_burst(((uint32_t) font) + ((uint32_t) options << 16U)); + private_string_write(p_text); + + if ((options & EVE_OPT_FORMAT) != 0U) + { + if (p_arguments != NULL) + { + for (uint8_t counter = 0U; counter < num_args; counter++) + { + spi_transmit_burst(p_arguments[counter]); + } + } + } + } +} + +/** + * @brief Draw a button with a label, varargs version, only works in burst-mode. + * @param p_arguments[] pointer to an array of values converted to uint32_t to be used when using EVE_OPT_FORMAT + * @param num_args the number of elements provided in p_arguments[] + */ +void EVE_cmd_button_var_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t font, uint16_t options, const char *p_text, + uint8_t num_args, const uint32_t p_arguments[]) +{ + spi_transmit_burst(CMD_BUTTON); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + ((uint32_t) hgt << 16U)); + spi_transmit_burst(((uint32_t) font) + ((uint32_t) options << 16U)); + private_string_write(p_text); + + if ((options & EVE_OPT_FORMAT) != 0U) + { + if (p_arguments != NULL) + { + for (uint8_t counter = 0U; counter < num_args; counter++) + { + spi_transmit_burst(p_arguments[counter]); + } + } + } +} + +/** + * @brief Draw a text string, varargs version. + * @param p_arguments[] pointer to an array of values converted to uint32_t to be used when using EVE_OPT_FORMAT + * @param num_args the number of elements provided in p_arguments[] + */ +void EVE_cmd_text_var(int16_t xc0, int16_t yc0, uint16_t font, + uint16_t options, const char *p_text, + uint8_t num_args, const uint32_t p_arguments[]) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_TEXT); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (font)); + spi_transmit((uint8_t) (font >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + private_string_write(p_text); + + if ((options & EVE_OPT_FORMAT) != 0U) + { + if (p_arguments != NULL) + { + for (uint8_t counter = 0U; counter < num_args; counter++) + { + spi_transmit_32(p_arguments[counter]); + } + } + } + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_TEXT); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + private_string_write(p_text); + + if ((options & EVE_OPT_FORMAT) != 0U) + { + if (p_arguments != NULL) + { + for (uint8_t counter = 0U; counter < num_args; counter++) + { + spi_transmit_burst(p_arguments[counter]); + } + } + } + } +} + +/** + * @brief Draw a text string, varargs version. + * @param p_arguments[] pointer to an array of values converted to uint32_t to be used when using EVE_OPT_FORMAT + * @param num_args the number of elements provided in p_arguments[] + */ +void EVE_cmd_text_var_burst(int16_t xc0, int16_t yc0, uint16_t font, + uint16_t options, const char *p_text, + uint8_t num_args, const uint32_t p_arguments[]) +{ + spi_transmit_burst(CMD_TEXT); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + private_string_write(p_text); + + if ((options & EVE_OPT_FORMAT) != 0U) + { + if (p_arguments != NULL) + { + for (uint8_t counter = 0U; counter < num_args; counter++) + { + spi_transmit_burst(p_arguments[counter]); + } + } + } +} + +/** + * @brief Draw a toggle switch with labels, varargs version. + * @param p_arguments[] pointer to an array of values converted to uint32_t to be used when using EVE_OPT_FORMAT + * @param num_args the number of elements provided in p_arguments[] + */ +void EVE_cmd_toggle_var(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t font, + uint16_t options, uint16_t state, const char *p_text, + uint8_t num_args, const uint32_t p_arguments[]) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_TOGGLE); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (font)); + spi_transmit((uint8_t) (font >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + spi_transmit((uint8_t) (state)); + spi_transmit((uint8_t) (state >> 8U)); + private_string_write(p_text); + + if ((options & EVE_OPT_FORMAT) != 0U) + { + if (p_arguments != NULL) + { + for (uint8_t counter = 0U; counter < num_args; counter++) + { + spi_transmit_32(p_arguments[counter]); + } + } + } + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_TOGGLE); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) font) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) state) << 16U)); + private_string_write(p_text); + + if ((options & EVE_OPT_FORMAT) != 0U) + { + if (p_arguments != NULL) + { + for (uint8_t counter = 0U; counter < num_args; counter++) + { + spi_transmit_burst(p_arguments[counter]); + } + } + } + } +} + +/** + * @brief Draw a toggle switch with labels, varargs version, only works in burst-mode. + * @param p_arguments[] pointer to an array of values converted to uint32_t to be used when using EVE_OPT_FORMAT + * @param num_args the number of elements provided in p_arguments[] + */ +void EVE_cmd_toggle_var_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t font, + uint16_t options, uint16_t state, const char *p_text, + uint8_t num_args, const uint32_t p_arguments[]) +{ + spi_transmit_burst(CMD_TOGGLE); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) font) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) state) << 16U)); + private_string_write(p_text); + + if ((options & EVE_OPT_FORMAT) != 0U) + { + if (p_arguments != NULL) + { + for (uint8_t counter = 0U; counter < num_args; counter++) + { + spi_transmit_burst(p_arguments[counter]); + } + } + } +} + +#endif /* EVE_GEN > 2 */ + +/** + * @brief Generic function for display-list and coprocessor commands with no arguments, only works in burst-mode. + * @note - EVE_cmd_dl(CMD_DLSTART); + * @note - EVE_cmd_dl(CMD_SWAP); + * @note - EVE_cmd_dl(CMD_SCREENSAVER); + * @note - EVE_cmd_dl(VERTEX2F(0,0)); + * @note - EVE_cmd_dl(DL_BEGIN | EVE_RECTS); + */ +void EVE_cmd_dl(uint32_t command) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(command); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(command); + } +} + +/** + * @brief Generic function for display-list and coprocessor commands with no arguments, only works in burst-mode. + */ +void EVE_cmd_dl_burst(uint32_t command) +{ + spi_transmit_burst(command); +} + +/** + * @brief Appends commands from RAM_G to the display list. + */ +void EVE_cmd_append(uint32_t ptr, uint32_t num) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_APPEND); + spi_transmit_32(ptr); + spi_transmit_32(num); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_APPEND); + spi_transmit_burst(ptr); + spi_transmit_burst(num); + } +} + +/** + * @brief Appends commands from RAM_G to the display list, only works in burst-mode. + */ +void EVE_cmd_append_burst(uint32_t ptr, uint32_t num) +{ + spi_transmit_burst(CMD_APPEND); + spi_transmit_burst(ptr); + spi_transmit_burst(num); +} + +/** + * @brief Set the background color. + */ +void EVE_cmd_bgcolor(uint32_t color) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_BGCOLOR); + spi_transmit((uint8_t) (color)); + spi_transmit((uint8_t) (color >> 8U)); + spi_transmit((uint8_t) (color >> 16U)); + spi_transmit(0U); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_BGCOLOR); + spi_transmit_burst(color); + } +} + +/** + * @brief Set the background color, only works in burst-mode. + */ +void EVE_cmd_bgcolor_burst(uint32_t color) +{ + spi_transmit_burst(CMD_BGCOLOR); + spi_transmit_burst(color); +} + +/** + * @brief Draw a button with a label. + */ +void EVE_cmd_button(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t font, uint16_t options, const char *p_text) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_BUTTON); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (hgt)); + spi_transmit((uint8_t) (hgt >> 8U)); + spi_transmit((uint8_t) (font)); + spi_transmit((uint8_t) (font >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + private_string_write(p_text); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_BUTTON); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + private_string_write(p_text); + } +} + +/** + * @brief Draw a button with a label, only works in burst-mode. + */ +void EVE_cmd_button_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t font, uint16_t options, const char *p_text) +{ + spi_transmit_burst(CMD_BUTTON); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + private_string_write(p_text); +} + +/** + * @brief Execute the touch screen calibration routine. + * @note - does not support burst-mode + */ +void EVE_cmd_calibrate(void) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_CALIBRATE); + spi_transmit_32(0UL); + EVE_cs_clear(); + } +} + +/** + * @brief Draw an analog clock. + */ +void EVE_cmd_clock(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, + uint16_t hours, uint16_t mins, uint16_t secs, uint16_t msecs) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_CLOCK); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (rad)); + spi_transmit((uint8_t) (rad >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + spi_transmit((uint8_t) (hours)); + spi_transmit((uint8_t) (hours >> 8U)); + spi_transmit((uint8_t) (mins)); + spi_transmit((uint8_t) (mins >> 8U)); + spi_transmit((uint8_t) (secs)); + spi_transmit((uint8_t) (secs >> 8U)); + spi_transmit((uint8_t) (msecs)); + spi_transmit((uint8_t) (msecs >> 8U)); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_CLOCK); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) rad) + (((uint32_t) options) << 16U)); + spi_transmit_burst(((uint32_t) hours) + (((uint32_t) mins) << 16U)); + spi_transmit_burst(((uint32_t) secs) + (((uint32_t) msecs) << 16U)); + } +} + +/** + * @brief Draw an analog clock, only works in burst-mode. + */ +void EVE_cmd_clock_burst(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, uint16_t hours, + uint16_t mins, uint16_t secs, uint16_t msecs) +{ + spi_transmit_burst(CMD_CLOCK); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) rad) + (((uint32_t) options) << 16U)); + spi_transmit_burst(((uint32_t) hours) + (((uint32_t) mins) << 16U)); + spi_transmit_burst(((uint32_t) secs) + (((uint32_t) msecs) << 16U)); +} + +/** + * @brief Draw a rotary dial control. + */ +void EVE_cmd_dial(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, uint16_t val) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_DIAL); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (rad)); + spi_transmit((uint8_t) (rad >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + spi_transmit((uint8_t) (val)); + spi_transmit((uint8_t) (val >> 8U)); + spi_transmit(0U); + spi_transmit(0U); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_DIAL); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) rad) + (((uint32_t) options) << 16U)); + spi_transmit_burst(val); + } +} + +/** + * @brief Draw a rotary dial control, only works in burst-mode. + */ +void EVE_cmd_dial_burst(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, + uint16_t val) +{ + spi_transmit_burst(CMD_DIAL); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) rad) + (((uint32_t) options) << 16U)); + spi_transmit_burst(val); +} + +/** + * @brief Set the foreground color. + */ +void EVE_cmd_fgcolor(uint32_t color) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_FGCOLOR); + spi_transmit((uint8_t) (color)); + spi_transmit((uint8_t) (color >> 8U)); + spi_transmit((uint8_t) (color >> 16U)); + spi_transmit(0U); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_FGCOLOR); + spi_transmit_burst(color); + } +} + +/** + * @brief Set the foreground color, only works in burst-mode. + */ +void EVE_cmd_fgcolor_burst(uint32_t color) +{ + spi_transmit_burst(CMD_FGCOLOR); + spi_transmit_burst(color); +} + +/** + * @brief Draw a gauge. + */ +void EVE_cmd_gauge(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, + uint16_t major, uint16_t minor, uint16_t val, uint16_t range) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_GAUGE); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (rad)); + spi_transmit((uint8_t) (rad >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + spi_transmit((uint8_t) (major)); + spi_transmit((uint8_t) (major >> 8U)); + spi_transmit((uint8_t) (minor)); + spi_transmit((uint8_t) (minor >> 8U)); + spi_transmit((uint8_t) (val)); + spi_transmit((uint8_t) (val >> 8U)); + spi_transmit((uint8_t) (range)); + spi_transmit((uint8_t) (range >> 8U)); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_GAUGE); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) rad) + (((uint32_t) options) << 16U)); + spi_transmit_burst(((uint32_t) major) + (((uint32_t) minor) << 16U)); + spi_transmit_burst(((uint32_t) val) + (((uint32_t) range) << 16U)); + } +} + +/** + * @brief Draw a gauge, only works in burst-mode. + */ +void EVE_cmd_gauge_burst(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, + uint16_t major, uint16_t minor, uint16_t val, uint16_t range) +{ + spi_transmit_burst(CMD_GAUGE); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) rad) + (((uint32_t) options) << 16U)); + spi_transmit_burst(((uint32_t) major) + (((uint32_t) minor) << 16U)); + spi_transmit_burst(((uint32_t) val) + (((uint32_t) range) << 16U)); +} + +/** + * @brief Retrieves the current matrix within the context of the coprocessor engine. + * @note - waits for completion and reads values from RAM_CMD after completion + * @note - can not be used with cmd-burst + */ +void EVE_cmd_getmatrix(int32_t *p_a, int32_t *p_b, int32_t *p_c, + int32_t *p_d, int32_t *p_e, int32_t *p_f) +{ + if (0U == cmd_burst) + { + uint16_t cmdoffset; + uint32_t address; + + eve_begin_cmd(CMD_GETMATRIX); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + spi_transmit_32(0UL); + EVE_cs_clear(); + EVE_execute_cmd(); + cmdoffset = EVE_memRead16(REG_CMD_WRITE); + + if (p_f != NULL) + { + address = EVE_RAM_CMD + ((cmdoffset - 4UL) & 0xfffUL); + *p_f = (int32_t) EVE_memRead32(address); + } + if (p_e != NULL) + { + address = EVE_RAM_CMD + ((cmdoffset - 8UL) & 0xfffUL); + *p_e = (int32_t) EVE_memRead32(address); + } + if (p_d != NULL) + { + address = EVE_RAM_CMD + ((cmdoffset - 12UL) & 0xfffUL); + *p_d = (int32_t) EVE_memRead32(address); + } + if (p_c != NULL) + { + address = EVE_RAM_CMD + ((cmdoffset - 16UL) & 0xfffUL); + *p_c = (int32_t) EVE_memRead32(address); + } + if (p_b != NULL) + { + address = EVE_RAM_CMD + ((cmdoffset - 20UL) & 0xfffUL); + *p_b = (int32_t) EVE_memRead32(address); + } + if (p_a != NULL) + { + address = EVE_RAM_CMD + ((cmdoffset - 24UL) & 0xfffUL); + *p_a = (int32_t) EVE_memRead32(address); + } + } +} + +/** + * @brief Set up the highlight color used in 3D effects for CMD_BUTTON and CMD_KEYS. + */ +void EVE_cmd_gradcolor(uint32_t color) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_GRADCOLOR); + spi_transmit((uint8_t) (color)); + spi_transmit((uint8_t) (color >> 8U)); + spi_transmit((uint8_t) (color >> 16U)); + spi_transmit(0U); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_GRADCOLOR); + spi_transmit_burst(color); + } +} + +/** + * @brief Set up the highlight color used in 3D effects for CMD_BUTTON and CMD_KEYS, only works in burst-mode. + */ +void EVE_cmd_gradcolor_burst(uint32_t color) +{ + spi_transmit_burst(CMD_GRADCOLOR); + spi_transmit_burst(color); +} + +/** + * @brief Draw a smooth color gradient. + */ +void EVE_cmd_gradient(int16_t xc0, int16_t yc0, uint32_t rgb0, int16_t xc1, + int16_t yc1, uint32_t rgb1) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_GRADIENT); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (rgb0)); + spi_transmit((uint8_t) (rgb0 >> 8U)); + spi_transmit((uint8_t) (rgb0 >> 16U)); + spi_transmit(0U); + spi_transmit((uint8_t) ((uint16_t) xc1)); + spi_transmit((uint8_t) (((uint16_t) xc1) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc1)); + spi_transmit((uint8_t) (((uint16_t) yc1) >> 8U)); + spi_transmit((uint8_t) (rgb1)); + spi_transmit((uint8_t) (rgb1 >> 8U)); + spi_transmit((uint8_t) (rgb1 >> 16U)); + spi_transmit(0U); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_GRADIENT); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(rgb0); + spi_transmit_burst(((uint32_t) ((uint16_t) xc1)) + (((uint32_t) ((uint16_t) yc1)) << 16U)); + spi_transmit_burst(rgb1); + } +} + +/** + * @brief Draw a smooth color gradient, only works in burst-mode. + */ +void EVE_cmd_gradient_burst(int16_t xc0, int16_t yc0, uint32_t rgb0, int16_t xc1, + int16_t yc1, uint32_t rgb1) +{ + spi_transmit_burst(CMD_GRADIENT); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(rgb0); + spi_transmit_burst(((uint32_t) ((uint16_t) xc1)) + (((uint32_t) ((uint16_t) yc1)) << 16U)); + spi_transmit_burst(rgb1); +} + +/** + * @brief Draw a row of key buttons with labels. + * @note - The tag value of each button is set to the ASCII value of its label. + * @note - Does not work with UTF-8. + */ +void EVE_cmd_keys(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t font, uint16_t options, const char *p_text) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_KEYS); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (hgt)); + spi_transmit((uint8_t) (hgt >> 8U)); + spi_transmit((uint8_t) (font)); + spi_transmit((uint8_t) (font >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + private_string_write(p_text); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_KEYS); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + private_string_write(p_text); + } +} + +/** + * @brief Draw a row of key buttons with labels, only works in burst-mode. + * @note - The tag value of each button is set to the ASCII value of its label. + * @note - Does not work with UTF-8. + */ +void EVE_cmd_keys_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t font, uint16_t options, const char *p_text) +{ + spi_transmit_burst(CMD_KEYS); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + private_string_write(p_text); +} + +/** + * @brief Draw a number. + */ +void EVE_cmd_number(int16_t xc0, int16_t yc0, uint16_t font, + uint16_t options, int32_t number) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_NUMBER); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (font)); + spi_transmit((uint8_t) (font >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + spi_transmit_32((uint32_t) number); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_NUMBER); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + spi_transmit_burst((uint32_t) number); + } +} + +/** + * @brief Draw a number, only works in burst-mode. + */ +void EVE_cmd_number_burst(int16_t xc0, int16_t yc0, uint16_t font, + uint16_t options, int32_t number) +{ + spi_transmit_burst(CMD_NUMBER); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + spi_transmit_burst((uint32_t) number); +} + +/** + * @brief Draw a progress bar. + */ +void EVE_cmd_progress(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t options, uint16_t val, uint16_t range) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_PROGRESS); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (hgt)); + spi_transmit((uint8_t) (hgt >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + spi_transmit((uint8_t) (val)); + spi_transmit((uint8_t) (val >> 8U)); + spi_transmit((uint8_t) (range)); + spi_transmit((uint8_t) (range >> 8U)); + spi_transmit(0U); /* dummy byte for 4-byte alignment */ + spi_transmit(0U); /* dummy byte for 4-byte alignment */ + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_PROGRESS); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) val) << 16U)); + spi_transmit_burst((uint32_t) range); + } +} + +/** + * @brief Draw a progress bar, only works in burst-mode. + */ +void EVE_cmd_progress_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t options, uint16_t val, uint16_t range) +{ + spi_transmit_burst(CMD_PROGRESS); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) val) << 16U)); + spi_transmit_burst((uint32_t) range); +} + +/** + * @brief Load a ROM font into bitmap handle. + * @note - generates display list commands, so it needs to be put in a display list + */ +void EVE_cmd_romfont(uint32_t font, uint32_t romslot) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ROMFONT); + spi_transmit_32(font); + spi_transmit_32(romslot); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ROMFONT); + spi_transmit_burst(font); + spi_transmit_burst(romslot); + } +} + +/** + * @brief Load a ROM font into bitmap handle, only works in burst-mode. + * @note - generates display list commands, so it needs to be put in a display list + */ +void EVE_cmd_romfont_burst(uint32_t font, uint32_t romslot) +{ + spi_transmit_burst(CMD_ROMFONT); + spi_transmit_burst(font); + spi_transmit_burst(romslot); +} + +/** + * @brief Apply a rotation to the current matrix. + */ +void EVE_cmd_rotate(uint32_t angle) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_ROTATE); + spi_transmit_32(angle & 0xFFFFUL); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_ROTATE); + spi_transmit_burst(angle & 0xFFFFUL); + } +} + +/** + * @brief Apply a rotation to the current matrix, only works in burst-mode. + */ +void EVE_cmd_rotate_burst(uint32_t angle) +{ + spi_transmit_burst(CMD_ROTATE); + spi_transmit_burst(angle & 0xFFFFUL); +} + +/** + * @brief Apply a scale to the current matrix. + */ +void EVE_cmd_scale(int32_t scx, int32_t scy) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SCALE); + spi_transmit_32((uint32_t) scx); + spi_transmit_32((uint32_t) scy); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SCALE); + spi_transmit_burst((uint32_t) scx); + spi_transmit_burst((uint32_t) scy); + } +} + +/** + * @brief Apply a scale to the current matrix, only works in burst-mode. + */ +void EVE_cmd_scale_burst(int32_t scx, int32_t scy) +{ + spi_transmit_burst(CMD_SCALE); + spi_transmit_burst((uint32_t) scx); + spi_transmit_burst((uint32_t) scy); +} + +/** + * @brief Draw a scroll bar. + */ +void EVE_cmd_scrollbar(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t options, uint16_t val, uint16_t size, uint16_t range) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SCROLLBAR); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (hgt)); + spi_transmit((uint8_t) (hgt >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + spi_transmit((uint8_t) (val)); + spi_transmit((uint8_t) (val >> 8U)); + spi_transmit((uint8_t) (size)); + spi_transmit((uint8_t) (size >> 8U)); + spi_transmit((uint8_t) (range)); + spi_transmit((uint8_t) (range >> 8U)); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SCROLLBAR); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) val) << 16U)); + spi_transmit_burst(((uint32_t) size) + (((uint32_t) range) << 16U)); + } +} + +/** + * @brief Draw a scroll bar, only works in burst-mode. + */ +void EVE_cmd_scrollbar_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t options, uint16_t val, uint16_t size, uint16_t range) +{ + spi_transmit_burst(CMD_SCROLLBAR); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) val) << 16U)); + spi_transmit_burst(((uint32_t) size) + (((uint32_t) range) << 16U)); +} + +/** + * @brief Set the base for number output. + */ +void EVE_cmd_setbase(uint32_t base) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SETBASE); + spi_transmit_32(base); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SETBASE); + spi_transmit_burst(base); + } +} + +/** + * @brief Set the base for number output, only works in burst-mode. + */ +void EVE_cmd_setbase_burst(uint32_t base) +{ + spi_transmit_burst(CMD_SETBASE); + spi_transmit_burst(base); +} + +/** + * @brief Generate the corresponding display list commands for given bitmap information. + */ +void EVE_cmd_setbitmap(uint32_t addr, uint16_t fmt, uint16_t width, + uint16_t height) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SETBITMAP); + spi_transmit_32(addr); + spi_transmit((uint8_t) (fmt)); + spi_transmit((uint8_t) (fmt >> 8U)); + spi_transmit((uint8_t) (width)); + spi_transmit((uint8_t) (width >> 8U)); + spi_transmit((uint8_t) (height)); + spi_transmit((uint8_t) (height >> 8U)); + spi_transmit(0U); + spi_transmit(0U); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SETBITMAP); + spi_transmit_burst(addr); + spi_transmit_burst(((uint32_t) fmt) + (((uint32_t) width) << 16U)); + spi_transmit_burst((uint32_t) height); + } +} + +/** + * @brief Generate the corresponding display list commands for given bitmap information, only works in burst-mode. + */ +void EVE_cmd_setbitmap_burst(uint32_t addr, uint16_t fmt, uint16_t width, + uint16_t height) +{ + spi_transmit_burst(CMD_SETBITMAP); + spi_transmit_burst(addr); + spi_transmit_burst(((uint32_t) fmt) + (((uint32_t) width) << 16U)); + spi_transmit_burst((uint32_t) height); +} + +/** + * @brief Register one custom font into the coprocessor engine. + * @note - does not set up the bitmap parameters of the font + */ +void EVE_cmd_setfont(uint32_t font, uint32_t ptr) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SETFONT); + spi_transmit_32(font); + spi_transmit_32(ptr); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SETFONT); + spi_transmit_burst(font); + spi_transmit_burst(ptr); + } +} + +/** + * @brief Register one custom font into the coprocessor engine, only works in burst-mode. + * @note - does not set up the bitmap parameters of the font + */ +void EVE_cmd_setfont_burst(uint32_t font, uint32_t ptr) +{ + spi_transmit_burst(CMD_SETFONT); + spi_transmit_burst(font); + spi_transmit_burst(ptr); +} + +/** + * @brief Set up a custom for use by the coprocessor engine. + * @note - generates display list commands, so it needs to be put in a display list + */ +void EVE_cmd_setfont2(uint32_t font, uint32_t ptr, uint32_t firstchar) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SETFONT2); + spi_transmit_32(font); + spi_transmit_32(ptr); + spi_transmit_32(firstchar); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SETFONT2); + spi_transmit_burst(font); + spi_transmit_burst(ptr); + spi_transmit_burst(firstchar); + } +} + +/** + * @brief Set up a custom for use by the coprocessor engine, only works in burst-mode. + * @note - generates display list commands, so it needs to be put in a display list + */ +void EVE_cmd_setfont2_burst(uint32_t font, uint32_t ptr, uint32_t firstchar) +{ + spi_transmit_burst(CMD_SETFONT2); + spi_transmit_burst(font); + spi_transmit_burst(ptr); + spi_transmit_burst(firstchar); +} + +/** + * @brief Set the scratch bitmap for widget use. + */ +void EVE_cmd_setscratch(uint32_t handle) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SETSCRATCH); + spi_transmit_32(handle); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SETSCRATCH); + spi_transmit_burst(handle); + } +} + +/** + * @brief Set the scratch bitmap for widget use, only works in burst-mode. + */ +void EVE_cmd_setscratch_burst(uint32_t handle) +{ + spi_transmit_burst(CMD_SETSCRATCH); + spi_transmit_burst(handle); +} + +/** + * @brief Start a continuous sketch update. + */ +void EVE_cmd_sketch(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint32_t ptr, uint16_t format) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SKETCH); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) wid)); + spi_transmit((uint8_t) (((uint16_t) wid) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) hgt)); + spi_transmit((uint8_t) (((uint16_t) hgt) >> 8U)); + spi_transmit_32(ptr); + spi_transmit((uint8_t) (format)); + spi_transmit((uint8_t) (format >> 8U)); + spi_transmit(0U); + spi_transmit(0U); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SKETCH); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) ((uint16_t) wid)) + (((uint32_t) ((uint16_t) hgt)) << 16U)); + spi_transmit_burst(ptr); + spi_transmit_burst((uint32_t) format); + } +} + +/** + * @brief Start a continuous sketch update, only works in burst-mode. + */ +void EVE_cmd_sketch_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint32_t ptr, uint16_t format) +{ + spi_transmit_burst(CMD_SKETCH); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) ((uint16_t) wid)) + (((uint32_t) ((uint16_t) hgt)) << 16U)); + spi_transmit_burst(ptr); + spi_transmit_burst((uint32_t) format); +} + +/** + * @brief Draw a slider. + */ +void EVE_cmd_slider(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t options, uint16_t val, uint16_t range) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SLIDER); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (hgt)); + spi_transmit((uint8_t) (hgt >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + spi_transmit((uint8_t) (val)); + spi_transmit((uint8_t) (val >> 8U)); + spi_transmit((uint8_t) (range)); + spi_transmit((uint8_t) (range >> 8U)); + spi_transmit(0U); /* dummy byte for 4-byte alignment */ + spi_transmit(0U); /* dummy byte for 4-byte alignment */ + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SLIDER); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) val) << 16U)); + spi_transmit_burst((uint32_t) range); + } +} + +/** + * @brief Draw a slider, only works in burst-mode. + */ +void EVE_cmd_slider_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, + uint16_t options, uint16_t val, uint16_t range) +{ + spi_transmit_burst(CMD_SLIDER); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) hgt) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) val) << 16U)); + spi_transmit_burst((uint32_t) range); +} + +/** + * @brief Start an animated spinner. + */ +void EVE_cmd_spinner(int16_t xc0, int16_t yc0, uint16_t style, uint16_t scale) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_SPINNER); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (style)); + spi_transmit((uint8_t) (style >> 8U)); + spi_transmit((uint8_t) (scale)); + spi_transmit((uint8_t) (scale >> 8U)); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_SPINNER); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) style) + (((uint32_t) scale) << 16U)); + } +} + +/** + * @brief Start an animated spinner, only works in burst-mode. + */ +void EVE_cmd_spinner_burst(int16_t xc0, int16_t yc0, uint16_t style, + uint16_t scale) +{ + spi_transmit_burst(CMD_SPINNER); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) style) + (((uint32_t) scale) << 16U)); +} + +/** + * @brief Draw a text string. + */ +void EVE_cmd_text(int16_t xc0, int16_t yc0, uint16_t font, uint16_t options, + const char *p_text) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_TEXT); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (font)); + spi_transmit((uint8_t) (font >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + private_string_write(p_text); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_TEXT); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + private_string_write(p_text); + } +} + +/** + * @brief Draw a text string, only works in burst-mode. + */ +void EVE_cmd_text_burst(int16_t xc0, int16_t yc0, uint16_t font, + uint16_t options, const char *p_text) +{ + spi_transmit_burst(CMD_TEXT); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) font) + (((uint32_t) options) << 16U)); + private_string_write(p_text); +} + +/** + * @brief Draw a toggle switch with labels. + */ +void EVE_cmd_toggle(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t font, + uint16_t options, uint16_t state, const char *p_text) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_TOGGLE); + spi_transmit((uint8_t) ((uint16_t) xc0)); + spi_transmit((uint8_t) (((uint16_t) xc0) >> 8U)); + spi_transmit((uint8_t) ((uint16_t) yc0)); + spi_transmit((uint8_t) (((uint16_t) yc0) >> 8U)); + spi_transmit((uint8_t) (wid)); + spi_transmit((uint8_t) (wid >> 8U)); + spi_transmit((uint8_t) (font)); + spi_transmit((uint8_t) (font >> 8U)); + spi_transmit((uint8_t) (options)); + spi_transmit((uint8_t) (options >> 8U)); + spi_transmit((uint8_t) (state)); + spi_transmit((uint8_t) (state >> 8U)); + private_string_write(p_text); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_TOGGLE); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) font) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) state) << 16U)); + private_string_write(p_text); + } +} + +/** + * @brief Draw a toggle switch with labels, only works in burst-mode. + */ +void EVE_cmd_toggle_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t font, + uint16_t options, uint16_t state, const char *p_text) +{ + spi_transmit_burst(CMD_TOGGLE); + spi_transmit_burst(((uint32_t) ((uint16_t) xc0)) + (((uint32_t) ((uint16_t) yc0)) << 16U)); + spi_transmit_burst(((uint32_t) wid) + (((uint32_t) font) << 16U)); + spi_transmit_burst(((uint32_t) options) + (((uint32_t) state) << 16U)); + private_string_write(p_text); +} + +/** + * @brief Apply a translation to the current matrix. + */ +void EVE_cmd_translate(int32_t tr_x, int32_t tr_y) +{ + if (0U == cmd_burst) + { + eve_begin_cmd(CMD_TRANSLATE); + spi_transmit_32((uint32_t) tr_x); + spi_transmit_32((uint32_t) tr_y); + EVE_cs_clear(); + } + else + { + spi_transmit_burst(CMD_TRANSLATE); + spi_transmit_burst((uint32_t) tr_x); + spi_transmit_burst((uint32_t) tr_y); + } +} + +/** + * @brief Apply a translation to the current matrix, only works in burst-mode. + */ +void EVE_cmd_translate_burst(int32_t tr_x, int32_t tr_y) +{ + spi_transmit_burst(CMD_TRANSLATE); + spi_transmit_burst((uint32_t) tr_x); + spi_transmit_burst((uint32_t) tr_y); +} + +/** + * @brief Set the current color red, green and blue. + */ +void EVE_color_rgb(uint32_t color) +{ + EVE_cmd_dl(DL_COLOR_RGB | (color & 0x00ffffffUL)); +} + +/** + * @brief Set the current color red, green and blue, only works in burst-mode. + */ +void EVE_color_rgb_burst(uint32_t color) +{ + spi_transmit_burst(DL_COLOR_RGB | (color & 0x00ffffffUL)); +} + +/** + * @brief Set the current color alpha, green and blue. + */ +void EVE_color_a(uint8_t alpha) +{ + EVE_cmd_dl(DL_COLOR_A | ((uint32_t) alpha)); +} + +/** + * @brief Set the current color alpha, green and blue, only works in burst-mode. + */ +void EVE_color_a_burst(uint8_t alpha) +{ + spi_transmit_burst(DL_COLOR_A | ((uint32_t) alpha)); +} + + +/* ################################################################## + special purpose functions +##################################################################### */ + +/* This is meant to be called outside display-list building. */ +/* This function displays an interactive calibration screen, calculates the calibration values */ +/* and writes the new values to the touch matrix registers of EVE.*/ +/* Unlike the built-in cmd_calibrate() of EVE this also works with displays that are cut down from larger ones like + * EVE2-38A / EVE2-38G. */ +/* The dimensions are needed as parameter as EVE_VSIZE for the EVE2-38 is 272 but the visible size is only 116. */ +/* So the call would be EVE_calibrate_manual(EVE_HSIZE, 116); for the EVE2-38A and EVE2-38G while for most other + * displays */ +/* using EVE_calibrate_manual(EVE_VSIZE, EVE_VSIZE) would work - but for normal displays the built-in cmd_calibrate + * would work as expected anyways */ +/* This code was taken from the MatrixOrbital EVE2-Library on Github, adapted and modified */ +void EVE_calibrate_manual(uint16_t width, uint16_t height) +{ + int32_t display_x[3U]; + int32_t display_y[3U]; + int32_t touch_x[3U]; + int32_t touch_y[3U]; + uint32_t touch_value; + int32_t tmp; + int32_t divi; + int32_t trans_matrix[6U]; + uint8_t count = 0U; + uint8_t calc = 0U; + uint32_t calc32 = 0U; + char num[4U]; + uint8_t touch_lock = 1U; + + /* these values determine where your calibration points will be drawn on your display */ + display_x[0U] = (int32_t) width / 6; + display_y[0U] = (int32_t) height / 6; + + display_x[1U] = (int32_t) width - ((int32_t) width / 8); + display_y[1U] = (int32_t) height / 2; + + display_x[2U] = (int32_t) width / 2; + display_y[2U] = (int32_t) height - ((int32_t) height / 8); + + while (count < 3U) + { + EVE_cmd_dl(CMD_DLSTART); + EVE_cmd_dl(DL_CLEAR_COLOR_RGB); + EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); + EVE_cmd_dl(DL_VERTEX_FORMAT); /* set to 0 - reduce precision for VERTEX2F to 1 pixel instead of 1/16 pixel default */ + + /* draw Calibration Point on screen */ + EVE_cmd_dl(DL_COLOR_RGB | 0x0000ffUL); + EVE_cmd_dl(POINT_SIZE(15U * 16U)); + EVE_cmd_dl((DL_BEGIN | EVE_POINTS)); + + int16_t xc0; + int16_t yc0; + + xc0 = (int16_t) display_x[count]; + yc0 = (int16_t) display_y[count]; + EVE_cmd_dl(VERTEX2F(xc0, yc0)); + EVE_cmd_dl(DL_END); + EVE_cmd_dl(DL_COLOR_RGB | 0xffffffUL); + EVE_cmd_text((int16_t) width / 2, 20, 26U, EVE_OPT_CENTER, "tap on the dot"); + calc = count + 0x31U; + num[0U] = (char) calc; + num[1U] = (char) 0U; /* null terminated string of one character */ + EVE_cmd_text((int16_t) display_x[count], (int16_t) display_y[count], 27U, EVE_OPT_CENTER, num); + + EVE_cmd_dl(DL_DISPLAY); + EVE_cmd_dl(CMD_SWAP); + EVE_execute_cmd(); + + for (;;) + { + touch_value = EVE_memRead32(REG_TOUCH_DIRECT_XY); /* read for any new touch tag inputs */ + + if (touch_lock != 0U) + { + if ((touch_value & 0x80000000UL) != 0UL) /* check if we have no touch */ + { + touch_lock = 0U; + } + } + else + { + if (0UL == (touch_value & 0x80000000UL)) /* check if a touch is detected */ + { + calc32 = ((touch_value >> 16U) & 0x03FFUL); + touch_x[count] = (int32_t) calc32; /* raw Touchscreen X coordinate */ + calc32 = touch_value & 0x03FFUL; + touch_y[count] = (int32_t) calc32; /* raw Touchscreen Y coordinate */ + touch_lock = 1U; + count++; + break; /* leave for (;;) */ + } + } + } + } + + divi = ((touch_x[0U] - touch_x[2U]) * (touch_y[1U] - touch_y[2U])) - ((touch_x[1U] - touch_x[2U]) * (touch_y[0U] - touch_y[2U])); + + tmp = (((display_x[0U] - display_x[2U]) * (touch_y[1U] - touch_y[2U])) - + ((display_x[1U] - display_x[2U]) * (touch_y[0U] - touch_y[2U]))); + trans_matrix[0U] = (int32_t) (((int64_t) tmp * 65536) / divi); + + tmp = (((touch_x[0U] - touch_x[2U]) * (display_x[1U] - display_x[2U])) - + ((display_x[0U] - display_x[2U]) * (touch_x[1U] - touch_x[2U]))); + trans_matrix[1U] = (int32_t) (((int64_t) tmp * 65536) / divi); + + tmp = ((touch_y[0U] * (((touch_x[2U] * display_x[1U]) - (touch_x[1U] * display_x[2U])))) + + (touch_y[1U] * (((touch_x[0U] * display_x[2U]) - (touch_x[2U] * display_x[0U])))) + + (touch_y[2U] * (((touch_x[1U] * display_x[0U]) - (touch_x[0U] * display_x[1U]))))); + trans_matrix[2U] = (int32_t) (((int64_t) tmp * 65536) / divi); + + tmp = (((display_y[0U] - display_y[2U]) * (touch_y[1U] - touch_y[2U])) - + ((display_y[1U] - display_y[2U]) * (touch_y[0U] - touch_y[2U]))); + trans_matrix[3U] = (int32_t) (((int64_t) tmp * 65536) / divi); + + tmp = (((touch_x[0U] - touch_x[2U]) * (display_y[1U] - display_y[2U])) - + ((display_y[0U] - display_y[2U]) * (touch_x[1U] - touch_x[2U]))); + trans_matrix[4U] = (int32_t) (((int64_t) tmp * 65536) / divi); + + tmp = ((touch_y[0U] * (((touch_x[2U] * display_y[1U]) - (touch_x[1U] * display_y[2U])))) + + (touch_y[1U] * (((touch_x[0U] * display_y[2U]) - (touch_x[2U] * display_y[0U])))) + + (touch_y[2U] * (((touch_x[1U] * display_y[0U]) - (touch_x[0U] * display_y[1U]))))); + trans_matrix[5U] = (int32_t) (((int64_t) tmp * 65536) / divi); + + EVE_memWrite32(REG_TOUCH_TRANSFORM_A, (uint32_t) trans_matrix[0U]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_B, (uint32_t) trans_matrix[1U]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_C, (uint32_t) trans_matrix[2U]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_D, (uint32_t) trans_matrix[3U]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_E, (uint32_t) trans_matrix[4U]); + EVE_memWrite32(REG_TOUCH_TRANSFORM_F, (uint32_t) trans_matrix[5U]); +} + +#endif /*LV_USE_DRAW_EVE*/ diff --git a/inc/lvgl/src/libs/FT800-FT813/EVE_commands.h b/inc/lvgl/src/libs/FT800-FT813/EVE_commands.h new file mode 100644 index 0000000..144d7ed --- /dev/null +++ b/inc/lvgl/src/libs/FT800-FT813/EVE_commands.h @@ -0,0 +1,339 @@ +/* +@file EVE_commands.h +@brief contains FT8xx / BT8xx function prototypes +@version 5.0 +@date 2023-12-29 +@author Rudolph Riedel + +@section LICENSE + +MIT License + +Copyright (c) 2016-2023 Rudolph Riedel + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +@section History + +5.0 +- added prototype for EVE_cmd_plkfreq() +- replaced BT81X_ENABLE with "EVE_GEN > 2" +- removed FT81X_ENABLE as FT81x already is the lowest supported chip revision now +- removed the formerly as deprected marked EVE_get_touch_tag() +- changed EVE_color_rgb() to use a 32 bit value like the rest of the color commands +- removed the meta-commands EVE_cmd_point(), EVE_cmd_line() and EVE_cmd_rect() +- removed obsolete functions EVE_get_cmdoffset(void) and EVE_report_cmdoffset(void) - cmdoffset is gone +- renamed EVE_LIB_GetProps() back to EVE_cmd_getprops() since it does not do anything special to justify a special name +- added prototype for helper function EVE_memWrite_sram_buffer() +- added prototypes for EVE_cmd_bitmap_transform() and EVE_cmd_bitmap_transform_burst() +- added prototype for EVE_cmd_playvideo() +- added prototypes for EVE_cmd_setfont_burst() and EVE_cmd_setfont2_burst() +- added prototype for EVE_cmd_videoframe() +- restructured: functions are sorted by chip-generation and within their group in alphabetical order +- reimplementedEVE_cmd_getmatrix() again, it needs to read values, not write them +- added prototypes for EVE_cmd_fontcache() and EVE_cmd_fontcachequery() +- added prototype for EVE_cmd_flashprogram() +- added prototype for EVE_cmd_calibratesub() +- added prototypes for EVE_cmd_animframeram(), EVE_cmd_animframeram_burst(), EVE_cmd_animstartram(), +EVE_cmd_animstartram_burst() +- added prototypes for EVE_cmd_apilevel(), EVE_cmd_apilevel_burst() +- added prototypes for EVE_cmd_calllist(), EVE_cmd_calllist_burst() +- added prototype for EVE_cmd_getimage() +- added prototypes for EVE_cmd_hsf(), EVE_cmd_hsf_burst() +- added prototype for EVE_cmd_linetime() +- added prototypes for EVE_cmd_newlist(), EVE_cmd_newlist_burst() +- added prototypes for EVE_cmd_runanim(), EVE_cmd_runanim_burst() +- added prototype for EVE_cmd_wait() +- removed the history from before 4.0 +- added an enum with return codes to have the functions return something more meaningfull +- finally removed EVE_cmd_start() after setting it to deprecatd with the first 5.0 release +- renamed EVE_cmd_execute() to EVE_execute_cmd() to be more consistent, this is is not an EVE command +- added the return-value of EVE_FIFO_HALF_EMPTY to EVE_busy() to indicate there is more than 2048 bytes available +- removed the 4.0 history +- added parameter width to EVE_calibrate_manual() +- changed the varargs versions of cmd_button, cmd_text and cmd_toggle to use an array of uint32_t values to comply with MISRA-C +- fixed some MISRA-C issues +- basic maintenance: checked for violations of white space and indent rules +- more linter fixes for minor issues like variables shorter than 3 characters +- added EVE_color_a() / EVE_color_a_burst() +- removed EVE_cmd_newlist_burst() prototype as the function got removed earlier +- added prototype for EVE_write_display_parameters() +- added EVE_memRead_sram_buffer() +- added EVE_FAULT_RECOVERED to the list of return codes +- added defines for the state of the external flash +- added protype for EVE_get_and_reset_fault_state() +- put E_OK and E_NOT_OK in #ifndef/#endif guards as these are usually defined + already in AUTOSAR projects +- renamed EVE_FAIL_CHIPID_TIMEOUT to EVE_FAIL_REGID_TIMEOUT as suggested by #93 on github +- changed a number of function parameters from signed to unsigned following the + updated BT81x series programming guide V2.4 +- commented out EVE_cmd_regread() prototype +- removed prototype for EVE_cmd_hsf_burst() + +*/ + +#ifndef EVE_COMMANDS_H +#define EVE_COMMANDS_H + +#include "EVE.h" + +#if !defined E_OK +#define E_OK 0U +#endif + +#if !defined E_NOT_OK +#define E_NOT_OK 1U +#endif + +#define EVE_FAIL_REGID_TIMEOUT 2U +#define EVE_FAIL_RESET_TIMEOUT 3U +#define EVE_FAIL_PCLK_FREQ 4U +#define EVE_FAIL_FLASH_STATUS_INIT 5U +#define EVE_FAIL_FLASH_STATUS_DETACHED 6U +#define EVE_FAIL_FLASHFAST_NOT_SUPPORTED 7U +#define EVE_FAIL_FLASHFAST_NO_HEADER_DETECTED 8U +#define EVE_FAIL_FLASHFAST_SECTOR0_FAILED 9U +#define EVE_FAIL_FLASHFAST_BLOB_MISMATCH 10U +#define EVE_FAIL_FLASHFAST_SPEED_TEST 11U +#define EVE_IS_BUSY 12U +#define EVE_FIFO_HALF_EMPTY 13U +#define EVE_FAULT_RECOVERED 14U + +#define EVE_FLASH_STATUS_INIT 0U +#define EVE_FLASH_STATUS_DETACHED 1U +#define EVE_FLASH_STATUS_BASIC 2U +#define EVE_FLASH_STATUS_FULL 3U + +/* ################################################################## + helper functions +##################################################################### */ + +void EVE_cmdWrite(uint8_t const command, uint8_t const parameter); + +uint8_t EVE_memRead8(uint32_t const ft_address); +uint16_t EVE_memRead16(uint32_t const ft_address); +uint32_t EVE_memRead32(uint32_t const ft_address); +void EVE_memWrite8(uint32_t const ft_address, uint8_t const ft_data); +void EVE_memWrite16(uint32_t const ft_address, uint16_t const ft_data); +void EVE_memWrite32(uint32_t const ft_address, uint32_t const ft_data); +void EVE_memWrite_flash_buffer(uint32_t const ft_address, const uint8_t *p_data, uint32_t const len); +void EVE_memWrite_sram_buffer(uint32_t const ft_address, const uint8_t *p_data, uint32_t const len); +void EVE_memRead_sram_buffer(uint32_t const ft_address, uint8_t *p_data, uint32_t const len); +uint8_t EVE_busy(void); +uint8_t EVE_get_and_reset_fault_state(void); +void EVE_execute_cmd(void); + +/* ################################################################## + commands and functions to be used outside of display-lists +##################################################################### */ + +/* EVE4: BT817 / BT818 */ +#if EVE_GEN > 3 + +void EVE_cmd_flashprogram(uint32_t dest, uint32_t src, uint32_t num); +void EVE_cmd_fontcache(uint32_t font, uint32_t ptr, uint32_t num); +void EVE_cmd_fontcachequery(uint32_t *p_total, uint32_t *p_used); +void EVE_cmd_getimage(uint32_t *p_source, uint32_t *p_fmt, uint32_t *p_width, uint32_t *p_height, uint32_t *p_palette); +void EVE_cmd_linetime(uint32_t dest); +void EVE_cmd_newlist(uint32_t adr); +uint32_t EVE_cmd_pclkfreq(uint32_t ftarget, int32_t rounding); +void EVE_cmd_wait(uint32_t usec); + +#endif /* EVE_GEN > 3 */ + +/* EVE3: BT815 / BT816 */ +#if EVE_GEN > 2 + +void EVE_cmd_clearcache(void); +void EVE_cmd_flashattach(void); +void EVE_cmd_flashdetach(void); +void EVE_cmd_flasherase(void); +uint32_t EVE_cmd_flashfast(void); +void EVE_cmd_flashspidesel(void); +void EVE_cmd_flashread(uint32_t dest, uint32_t src, uint32_t num); +void EVE_cmd_flashsource(uint32_t ptr); +void EVE_cmd_flashspirx(uint32_t dest, uint32_t num); +void EVE_cmd_flashspitx(uint32_t num, const uint8_t *p_data); +void EVE_cmd_flashupdate(uint32_t dest, uint32_t src, uint32_t num); +void EVE_cmd_flashwrite(uint32_t ptr, uint32_t num, const uint8_t *p_data); +void EVE_cmd_inflate2(uint32_t ptr, uint32_t options, const uint8_t *p_data, uint32_t len); + +#endif /* EVE_GEN > 2 */ + +void EVE_cmd_getprops(uint32_t *p_pointer, uint32_t *p_width, uint32_t *p_height); +uint32_t EVE_cmd_getptr(void); +void EVE_cmd_inflate(uint32_t ptr, const uint8_t *p_data, uint32_t len); +void EVE_cmd_interrupt(uint32_t msec); +void EVE_cmd_loadimage(uint32_t ptr, uint32_t options, const uint8_t *p_data, uint32_t len); +void EVE_cmd_mediafifo(uint32_t ptr, uint32_t size); +void EVE_cmd_memcpy(uint32_t dest, uint32_t src, uint32_t num); +uint32_t EVE_cmd_memcrc(uint32_t ptr, uint32_t num); +void EVE_cmd_memset(uint32_t ptr, uint8_t value, uint32_t num); +void EVE_cmd_memzero(uint32_t ptr, uint32_t num); +void EVE_cmd_playvideo(uint32_t options, const uint8_t *p_data, uint32_t len); +void EVE_cmd_setrotate(uint32_t rotation); +void EVE_cmd_snapshot(uint32_t ptr); +void EVE_cmd_snapshot2(uint32_t fmt, uint32_t ptr, int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt); +void EVE_cmd_track(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t tag); +void EVE_cmd_videoframe(uint32_t dest, uint32_t result_ptr); +/*void EVE_cmd_memwrite(uint32_t dest, uint32_t num, const uint8_t *p_data);*/ +/*uint32_t EVE_cmd_regread(uint32_t ptr);*/ + +/* ################################################################## + patching and initialization +##################################################################### */ + +#if EVE_GEN > 2 +uint8_t EVE_init_flash(void); +#endif /* EVE_GEN > 2 */ + +void EVE_write_display_parameters(void); +uint8_t EVE_init(void); + +/* ################################################################## + functions for display lists +##################################################################### */ + +void EVE_start_cmd_burst(void); +void EVE_end_cmd_burst(void); + +/* EVE4: BT817 / BT818 */ +#if EVE_GEN > 3 + +void EVE_cmd_animframeram(int16_t xc0, int16_t yc0, uint32_t aoptr, uint32_t frame); +void EVE_cmd_animframeram_burst(int16_t xc0, int16_t yc0, uint32_t aoptr, uint32_t frame); +void EVE_cmd_animstartram(int32_t chnl, uint32_t aoptr, uint32_t loop); +void EVE_cmd_animstartram_burst(int32_t chnl, uint32_t aoptr, uint32_t loop); +void EVE_cmd_apilevel(uint32_t level); +void EVE_cmd_apilevel_burst(uint32_t level); +void EVE_cmd_calibratesub(uint16_t xc0, uint16_t yc0, uint16_t width, uint16_t height); +void EVE_cmd_calllist(uint32_t adr); +void EVE_cmd_calllist_burst(uint32_t adr); +void EVE_cmd_hsf(uint32_t hsf); +void EVE_cmd_runanim(uint32_t waitmask, uint32_t play); +void EVE_cmd_runanim_burst(uint32_t waitmask, uint32_t play); + +#endif /* EVE_GEN > 3 */ + +/* EVE3: BT815 / BT816 */ +#if EVE_GEN > 2 + +void EVE_cmd_animdraw(int32_t chnl); +void EVE_cmd_animdraw_burst(int32_t chnl); +void EVE_cmd_animframe(int16_t xc0, int16_t yc0, uint32_t aoptr, uint32_t frame); +void EVE_cmd_animframe_burst(int16_t xc0, int16_t yc0, uint32_t aoptr, uint32_t frame); +void EVE_cmd_animstart(int32_t chnl, uint32_t aoptr, uint32_t loop); +void EVE_cmd_animstart_burst(int32_t chnl, uint32_t aoptr, uint32_t loop); +void EVE_cmd_animstop(int32_t chnl); +void EVE_cmd_animstop_burst(int32_t chnl); +void EVE_cmd_animxy(int32_t chnl, int16_t xc0, int16_t yc0); +void EVE_cmd_animxy_burst(int32_t chnl, int16_t xc0, int16_t yc0); +void EVE_cmd_appendf(uint32_t ptr, uint32_t num); +void EVE_cmd_appendf_burst(uint32_t ptr, uint32_t num); +uint16_t EVE_cmd_bitmap_transform(int32_t xc0, int32_t yc0, int32_t xc1, int32_t yc1, int32_t xc2, int32_t yc2, int32_t tx0, + int32_t ty0, int32_t tx1, int32_t ty1, int32_t tx2, int32_t ty2); +void EVE_cmd_bitmap_transform_burst(int32_t xc0, int32_t yc0, int32_t xc1, int32_t yc1, int32_t xc2, int32_t yc2, int32_t tx0, + int32_t ty0, int32_t tx1, int32_t ty1, int32_t tx2, int32_t ty2); +void EVE_cmd_fillwidth(uint32_t pixel); +void EVE_cmd_fillwidth_burst(uint32_t pixel); +void EVE_cmd_gradienta(int16_t xc0, int16_t yc0, uint32_t argb0, int16_t xc1, int16_t yc1, uint32_t argb1); +void EVE_cmd_gradienta_burst(int16_t xc0, int16_t yc0, uint32_t argb0, int16_t xc1, int16_t yc1, uint32_t argb1); +void EVE_cmd_rotatearound(int32_t xc0, int32_t yc0, uint32_t angle, int32_t scale); +void EVE_cmd_rotatearound_burst(int32_t xc0, int32_t yc0, uint32_t angle, int32_t scale); + +void EVE_cmd_button_var(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t font, uint16_t options, const char *p_text, uint8_t num_args, const uint32_t p_arguments[]); +void EVE_cmd_button_var_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t font, uint16_t options, const char *p_text, uint8_t num_args, const uint32_t p_arguments[]); +void EVE_cmd_text_var(int16_t xc0, int16_t yc0, uint16_t font, uint16_t options, const char *p_text, uint8_t num_args, const uint32_t p_arguments[]); +void EVE_cmd_text_var_burst(int16_t xc0, int16_t yc0, uint16_t font, uint16_t options, const char *p_text, uint8_t num_args, const uint32_t p_arguments[]); +void EVE_cmd_toggle_var(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t font, uint16_t options, uint16_t state, const char *p_text, uint8_t num_args, const uint32_t p_arguments[]); +void EVE_cmd_toggle_var_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t font, uint16_t options, uint16_t state, const char *p_text, uint8_t num_args, const uint32_t p_arguments[]); + +#endif /* EVE_GEN > 2 */ + +void EVE_cmd_dl(uint32_t command); +void EVE_cmd_dl_burst(uint32_t command); + +void EVE_cmd_append(uint32_t ptr, uint32_t num); +void EVE_cmd_append_burst(uint32_t ptr, uint32_t num); +void EVE_cmd_bgcolor(uint32_t color); +void EVE_cmd_bgcolor_burst(uint32_t color); +void EVE_cmd_button(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t font, uint16_t options, const char *p_text); +void EVE_cmd_button_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t font, uint16_t options, const char *p_text); +void EVE_cmd_calibrate(void); +void EVE_cmd_clock(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, uint16_t hours, uint16_t mins, uint16_t secs, uint16_t msecs); +void EVE_cmd_clock_burst(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, uint16_t hours, uint16_t mins, uint16_t secs, uint16_t msecs); +void EVE_cmd_dial(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, uint16_t val); +void EVE_cmd_dial_burst(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, uint16_t val); +void EVE_cmd_fgcolor(uint32_t color); +void EVE_cmd_fgcolor_burst(uint32_t color); +void EVE_cmd_gauge(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range); +void EVE_cmd_gauge_burst(int16_t xc0, int16_t yc0, uint16_t rad, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range); +void EVE_cmd_getmatrix(int32_t *p_a, int32_t *p_b, int32_t *p_c, int32_t *p_d, int32_t *p_e, int32_t *p_f); +void EVE_cmd_gradcolor(uint32_t color); +void EVE_cmd_gradcolor_burst(uint32_t color); +void EVE_cmd_gradient(int16_t xc0, int16_t yc0, uint32_t rgb0, int16_t xc1, int16_t yc1, uint32_t rgb1); +void EVE_cmd_gradient_burst(int16_t xc0, int16_t yc0, uint32_t rgb0, int16_t xc1, int16_t yc1, uint32_t rgb1); +void EVE_cmd_keys(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t font, uint16_t options, const char *p_text); +void EVE_cmd_keys_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t font, uint16_t options, const char *p_text); +void EVE_cmd_number(int16_t xc0, int16_t yc0, uint16_t font, uint16_t options, int32_t number); +void EVE_cmd_number_burst(int16_t xc0, int16_t yc0, uint16_t font, uint16_t options, int32_t number); +void EVE_cmd_progress(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t options, uint16_t val, uint16_t range); +void EVE_cmd_progress_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t options, uint16_t val, uint16_t range); +void EVE_cmd_romfont(uint32_t font, uint32_t romslot); +void EVE_cmd_romfont_burst(uint32_t font, uint32_t romslot); +void EVE_cmd_rotate(uint32_t angle); +void EVE_cmd_rotate_burst(uint32_t angle); +void EVE_cmd_scale(int32_t scx, int32_t scy); +void EVE_cmd_scale_burst(int32_t scx, int32_t scy); +void EVE_cmd_scrollbar(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t options, uint16_t val, uint16_t size, uint16_t range); +void EVE_cmd_scrollbar_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t options, uint16_t val, uint16_t size, uint16_t range); +void EVE_cmd_setbase(uint32_t base); +void EVE_cmd_setbase_burst(uint32_t base); +void EVE_cmd_setbitmap(uint32_t addr, uint16_t fmt, uint16_t width, uint16_t height); +void EVE_cmd_setbitmap_burst(uint32_t addr, uint16_t fmt, uint16_t width, uint16_t height); +void EVE_cmd_setfont(uint32_t font, uint32_t ptr); +void EVE_cmd_setfont_burst(uint32_t font, uint32_t ptr); +void EVE_cmd_setfont2(uint32_t font, uint32_t ptr, uint32_t firstchar); +void EVE_cmd_setfont2_burst(uint32_t font, uint32_t ptr, uint32_t firstchar); +void EVE_cmd_setscratch(uint32_t handle); +void EVE_cmd_setscratch_burst(uint32_t handle); +void EVE_cmd_sketch(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint32_t ptr, uint16_t format); +void EVE_cmd_sketch_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint32_t ptr, uint16_t format); +void EVE_cmd_slider(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t options, uint16_t val, uint16_t range); +void EVE_cmd_slider_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t hgt, uint16_t options, uint16_t val, uint16_t range); +void EVE_cmd_spinner(int16_t xc0, int16_t yc0, uint16_t style, uint16_t scale); +void EVE_cmd_spinner_burst(int16_t xc0, int16_t yc0, uint16_t style, uint16_t scale); +void EVE_cmd_text(int16_t xc0, int16_t yc0, uint16_t font, uint16_t options, const char *p_text); +void EVE_cmd_text_burst(int16_t xc0, int16_t yc0, uint16_t font, uint16_t options, const char *p_text); +void EVE_cmd_toggle(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t font, uint16_t options, uint16_t state, const char *p_text); +void EVE_cmd_toggle_burst(int16_t xc0, int16_t yc0, uint16_t wid, uint16_t font, uint16_t options, uint16_t state, const char *p_text); +void EVE_cmd_translate(int32_t tr_x, int32_t tr_y); +void EVE_cmd_translate_burst(int32_t tr_x, int32_t tr_y); + +void EVE_color_rgb(uint32_t color); +void EVE_color_rgb_burst(uint32_t color); +void EVE_color_a(uint8_t alpha); +void EVE_color_a_burst(uint8_t alpha); + +/* ################################################################## + special purpose functions +##################################################################### */ + +void EVE_calibrate_manual(uint16_t width, uint16_t height); + +#endif /* EVE_COMMANDS_H */ diff --git a/inc/lvgl/src/libs/FT800-FT813/EVE_config.h b/inc/lvgl/src/libs/FT800-FT813/EVE_config.h new file mode 100644 index 0000000..0d51e63 --- /dev/null +++ b/inc/lvgl/src/libs/FT800-FT813/EVE_config.h @@ -0,0 +1,26 @@ +#ifndef EVE_CONFIG_H +#define EVE_CONFIG_H + +#include "../../draw/eve/lv_draw_eve_private.h" + +#define EVE_HSIZE (lv_draw_eve_unit_g->params.hor_res) +#define EVE_VSIZE (lv_draw_eve_unit_g->params.ver_res) +#define EVE_VSYNC0 (lv_draw_eve_unit_g->params.vsync0) +#define EVE_VSYNC1 (lv_draw_eve_unit_g->params.vsync1) +#define EVE_VOFFSET (lv_draw_eve_unit_g->params.voffset) +#define EVE_VCYCLE (lv_draw_eve_unit_g->params.vcycle) +#define EVE_HSYNC0 (lv_draw_eve_unit_g->params.hsync0) +#define EVE_HSYNC1 (lv_draw_eve_unit_g->params.hsync1) +#define EVE_HOFFSET (lv_draw_eve_unit_g->params.hoffset) +#define EVE_HCYCLE (lv_draw_eve_unit_g->params.hcycle) +#define EVE_PCLK (lv_draw_eve_unit_g->params.pclk) +#define EVE_PCLKPOL (lv_draw_eve_unit_g->params.pclkpol) +#define EVE_SWIZZLE (lv_draw_eve_unit_g->params.swizzle) +#define EVE_CSPREAD (lv_draw_eve_unit_g->params.cspread) +#define EVE_HAS_CRYSTAL (lv_draw_eve_unit_g->params.has_crystal) +#define EVE_HAS_GT911 (lv_draw_eve_unit_g->params.has_gt911) +#define EVE_GEN LV_DRAW_EVE_EVE_GENERATION +#define EVE_BACKLIGHT_PWM (lv_draw_eve_unit_g->params.backlight_pwm) +#define EVE_BACKLIGHT_FREQ (lv_draw_eve_unit_g->params.backlight_freq) + +#endif /* EVE_CONFIG_H */ diff --git a/inc/lvgl/src/libs/FT800-FT813/EVE_supplemental.c b/inc/lvgl/src/libs/FT800-FT813/EVE_supplemental.c new file mode 100644 index 0000000..988b62c --- /dev/null +++ b/inc/lvgl/src/libs/FT800-FT813/EVE_supplemental.c @@ -0,0 +1,145 @@ +#include "../../lv_conf_internal.h" +#if LV_USE_DRAW_EVE +/* +@file EVE_supplemental.h +@brief supplemental functions +@version 5.0 +@date 2023-12-23 +@author Rudolph Riedel + +@section LICENSE + +MIT License + +Copyright (c) 2016-2023 Rudolph Riedel + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +@section History + +5.0 +- added EVE_polar_cartesian() + +*/ + +#include "EVE_suppplemental.h" + +/* define NULL if it not already is */ +#ifndef NULL +#include +#endif + +#if defined (__AVR__) +#include +#else +#define PROGMEM +#endif + +/* + * @brief widget function to draw a circle + */ +void EVE_widget_circle(int16_t xc0, int16_t yc0, uint16_t radius, uint16_t border, uint32_t bgcolor) +{ + EVE_cmd_dl_burst(DL_SAVE_CONTEXT); + EVE_cmd_dl(DL_BEGIN | EVE_POINTS); + EVE_cmd_dl(POINT_SIZE(radius)); + EVE_cmd_dl(VERTEX2F(xc0, yc0)); + EVE_color_rgb(bgcolor); + EVE_cmd_dl(POINT_SIZE(radius - border)); + EVE_cmd_dl(VERTEX2F(xc0, yc0)); + EVE_cmd_dl(DL_END); + EVE_cmd_dl_burst(DL_RESTORE_CONTEXT); +} + +/* + * @brief widget function to draw a rectangle + */ +void EVE_widget_rectangle(int16_t xc0, int16_t yc0, int16_t wid, int16_t hgt, int16_t border, uint16_t linewidth, uint32_t bgcolor) +{ + EVE_cmd_dl_burst(DL_SAVE_CONTEXT); + EVE_cmd_dl(DL_BEGIN | EVE_RECTS); + EVE_cmd_dl(LINE_WIDTH(linewidth)); + EVE_cmd_dl(VERTEX2F(xc0, yc0)); + EVE_cmd_dl(VERTEX2F(xc0 + wid, yc0 + hgt)); + EVE_color_rgb(bgcolor); + EVE_cmd_dl(VERTEX2F(xc0 + border, yc0 + border)); + EVE_cmd_dl(VERTEX2F(xc0 + wid - border, yc0 + hgt - border)); + EVE_cmd_dl(DL_END); + EVE_cmd_dl_burst(DL_RESTORE_CONTEXT); +} + +static const int8_t sine_table[360] PROGMEM = +{ + 0, 2, 4, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 29, 31, 33, 35, 37, 39, 41, + 43, 46, 48, 50, 52, 54, 56, 58, 60, 62, 63, 65, 67, 69, 71, 73, 75, 76, 78, + 80, 82, 83, 85, 87, 88, 90, 91, 93, 94, 96, 97, 99, 100, 101, 103, 104, 105, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 119, 120, + 121, 121, 122, 123, 123, 124, 124, 125, 125, 125, 126, 126, 126, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 125, 125, 125, + 124, 124, 123, 123, 122, 121, 121, 120, 119, 119, 118, 117, 116, 115, 114, + 113, 112, 111, 110, 109, 108, 107, 105, 104, 103, 101, 100, 99, 97, 96, 94, + 93, 91, 90, 88, 87, 85, 83, 82, 80, 78, 76, 75, 73, 71, 69, 67, 65, 63, 62, + 60, 58, 56, 54, 52, 50, 48, 46, 43, 41, 39, 37, 35, 33, 31, 29, 26, 24, 22, + 20, 18, 15, 13, 11, 9, 7, 4, 2, 0, -2, -4, -7, -9, -11, -13, -15, -18, -20, + -22, -24, -26, -29, -31, -33, -35, -37, -39, -41, -43, -46, -48, -50, -52, + -54, -56, -58, -60, -62, -63, -65, -67, -69, -71, -73, -75, -76, -78, -80, + -82, -83, -85, -87, -88, -90, -91, -93, -94, -96, -97, -99,-100,-101,-103, + -104, -105, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, + -117, -118, -119, -119, -120, -121, -121, -122, -123, -123, -124, -124, + -125, -125, -125, -126, -126, -126, -127, -127, -127, -127, -127, -127, + -127, -127, -127, -127, -127, -126, -126, -126, -125, -125, -125, -124, + -124, -123, -123, -122, -121, -121, -120, -119, -119, -118, -117, -116, + -115, -114, -113, -112, -111, -110, -109, -108, -107, -105, -104, -103, + -101, -100, -99, -97, -96, -94, -93, -91, -90, -88, -87, -85, -83, -82, + -80, -78, -76, -75, -73, -71, -69, -67, -65, -63, -62, -60, -58, -56, -54, + -52, -50, -48, -46, -43, -41, -39, -37, -35, -33, -31, -29, -26, -24, + -22, -20, -18, -15, -13, -11, -9, -7, -4, -2 +}; + +/** + * @brief Calculate coordinates from an angle and a length. + * @param length distance from coordinate origin (0,0) + * @param angle rotation in degrees + * @return signed X/Y coordinates for use with VERTEX2F + * @note - resolution for angle is 1° and rotation is clockwise + * @note - angle should be limited to a (n*360)-1 + */ +void EVE_polar_cartesian(uint16_t length, uint16_t angle, int16_t *p_xc0, int16_t *p_yc0) +{ + uint16_t anglev; + anglev = angle % 360U; + + if (p_xc0 != NULL) + { + int32_t calc = (int16_t) length; + calc = ((calc * (sine_table[anglev])) + 64) / 128; + *p_xc0 = (int16_t) calc; + } + + if (p_yc0 != NULL) + { + anglev = anglev + 270U; + anglev = anglev % 360U; + + int32_t calc = (int16_t) length; + calc = ((calc * (sine_table[anglev])) + 64) / 128; + *p_yc0 = (int16_t) calc; + } +} + +#endif /*LV_USE_DRAW_EVE*/ diff --git a/inc/lvgl/src/libs/FT800-FT813/EVE_suppplemental.h b/inc/lvgl/src/libs/FT800-FT813/EVE_suppplemental.h new file mode 100644 index 0000000..c55a8dc --- /dev/null +++ b/inc/lvgl/src/libs/FT800-FT813/EVE_suppplemental.h @@ -0,0 +1,53 @@ +/* +@file EVE_supplemental.h +@brief prototypes for supplemental functions +@version 5.0 +@date 2023-12-23 +@author Rudolph Riedel + +@section LICENSE + +MIT License + +Copyright (c) 2016-2023 Rudolph Riedel + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +@section History + +5.0 +- added EVE_polar_cartesian() + +*/ + +#ifndef EVE_SUPPLEMENTAL_H +#define EVE_SUPPLEMENTAL_H + +#include "EVE.h" +#include "EVE_commands.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +void EVE_widget_circle(int16_t xc0, int16_t yc0, uint16_t radius, uint16_t border, uint32_t bgcolor); +void EVE_widget_rectangle(int16_t xc0, int16_t yc0, int16_t wid, int16_t hgt, int16_t border, uint16_t linewidth, uint32_t bgcolor); +void EVE_polar_cartesian(uint16_t length, uint16_t angle, int16_t *p_xc0, int16_t *p_yc0); + +#endif /* EVE_SUPPLEMENTAL_H */ diff --git a/inc/lvgl/src/libs/FT800-FT813/EVE_target.h b/inc/lvgl/src/libs/FT800-FT813/EVE_target.h new file mode 100644 index 0000000..76a1f4a --- /dev/null +++ b/inc/lvgl/src/libs/FT800-FT813/EVE_target.h @@ -0,0 +1,111 @@ +#ifndef EVE_TARGET_H +#define EVE_TARGET_H + +#include "../../draw/eve/lv_draw_eve_private.h" +#include "../../tick/lv_tick.h" +#include "../../misc/lv_utils.h" +#include "../../core/lv_global.h" + +#define lv_eve_write_buf (LV_GLOBAL_DEFAULT()->draw_eve_unit->lv_eve_write_buf) +#define lv_eve_write_buf_len (LV_GLOBAL_DEFAULT()->draw_eve_unit->lv_eve_write_buf_len) + +static inline void lv_eve_target_flush_write_buf(void); + +static inline void DELAY_MS(uint16_t ms) +{ + lv_delay_ms(ms); +} + +static inline void EVE_cs_set(void) +{ + lv_draw_eve_unit_g->op_cb(lv_draw_eve_unit_g->disp, LV_DRAW_EVE_OPERATION_CS_ASSERT, NULL, 0); +} + +static inline void EVE_cs_clear(void) +{ + lv_eve_target_flush_write_buf(); + lv_draw_eve_unit_g->op_cb(lv_draw_eve_unit_g->disp, LV_DRAW_EVE_OPERATION_CS_DEASSERT, NULL, 0); +} + +static inline void EVE_pdn_set(void) +{ + lv_draw_eve_unit_g->op_cb(lv_draw_eve_unit_g->disp, LV_DRAW_EVE_OPERATION_POWERDOWN_SET, NULL, 0); +} + +static inline void EVE_pdn_clear(void) +{ + lv_draw_eve_unit_g->op_cb(lv_draw_eve_unit_g->disp, LV_DRAW_EVE_OPERATION_POWERDOWN_CLEAR, NULL, 0); +} + +static inline void spi_transmit(uint8_t data) +{ +#if LV_DRAW_EVE_WRITE_BUFFER_SIZE_INTERNAL + if(lv_eve_write_buf_len == sizeof(lv_eve_write_buf)) { + lv_eve_target_flush_write_buf(); + } + lv_eve_write_buf[lv_eve_write_buf_len++] = data; +#else + lv_draw_eve_unit_g->op_cb(lv_draw_eve_unit_g->disp, LV_DRAW_EVE_OPERATION_SPI_SEND, &data, sizeof(data)); +#endif +} + +static inline void spi_transmit_32(uint32_t data) +{ +#if LV_BIG_ENDIAN_SYSTEM + data = lv_swap_bytes_32(data); +#endif +#if LV_DRAW_EVE_WRITE_BUFFER_SIZE_INTERNAL + if(lv_eve_write_buf_len + 4 > sizeof(lv_eve_write_buf)) { + lv_eve_target_flush_write_buf(); + } + uint8_t * buf4 = (uint8_t *) &data; + lv_eve_write_buf[lv_eve_write_buf_len++] = buf4[0]; + lv_eve_write_buf[lv_eve_write_buf_len++] = buf4[1]; + lv_eve_write_buf[lv_eve_write_buf_len++] = buf4[2]; + lv_eve_write_buf[lv_eve_write_buf_len++] = buf4[3]; +#else + lv_draw_eve_unit_g->op_cb(lv_draw_eve_unit_g->disp, LV_DRAW_EVE_OPERATION_SPI_SEND, &data, sizeof(data)); +#endif +} + +static inline void lv_eve_target_spi_transmit_buf(const void * data, uint32_t size) +{ + lv_eve_target_flush_write_buf(); + lv_draw_eve_unit_g->op_cb(lv_draw_eve_unit_g->disp, LV_DRAW_EVE_OPERATION_SPI_SEND, (void *) data, size); +} + +static inline void lv_eve_target_flush_write_buf(void) +{ +#if LV_DRAW_EVE_WRITE_BUFFER_SIZE_INTERNAL + if(lv_eve_write_buf_len == 0) { + return; + } + lv_draw_eve_unit_g->op_cb(lv_draw_eve_unit_g->disp, LV_DRAW_EVE_OPERATION_SPI_SEND, lv_eve_write_buf, lv_eve_write_buf_len); + lv_eve_write_buf_len = 0; +#endif +} + +static inline void spi_transmit_burst(uint32_t data) +{ + spi_transmit_32(data); +} + +static inline uint8_t spi_receive(uint8_t data) +{ + /* `data` is 0 everywhere `spi_receive` is called in the FT800-FT813 library */ + LV_UNUSED(data); + + lv_eve_target_flush_write_buf(); + + uint8_t byte; + lv_draw_eve_unit_g->op_cb(lv_draw_eve_unit_g->disp, LV_DRAW_EVE_OPERATION_SPI_RECEIVE, &byte, 1); + + return byte; +} + +static inline uint8_t fetch_flash_byte(const uint8_t *p_data) +{ + return (*p_data); +} + +#endif /* EVE_TARGET_H_ */ diff --git a/inc/lvgl/src/libs/FT800-FT813/LICENSE b/inc/lvgl/src/libs/FT800-FT813/LICENSE new file mode 100644 index 0000000..a6ab28b --- /dev/null +++ b/inc/lvgl/src/libs/FT800-FT813/LICENSE @@ -0,0 +1,20 @@ +MIT License + +Copyright (c) 2016-2024 Rudolph Riedel + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/inc/lvgl/src/libs/FT800-FT813/README.md b/inc/lvgl/src/libs/FT800-FT813/README.md new file mode 100644 index 0000000..211acb1 --- /dev/null +++ b/inc/lvgl/src/libs/FT800-FT813/README.md @@ -0,0 +1,245 @@ +# EVE2 / EVE3 / EVE4 code library +This is a code library for EVE2/EVE3/EVE4 graphics controller ICs from FTDI/Bridgetek: + +http://www.ftdichip.com/EVE.htm +http://brtchip.com/eve/ +http://brtchip.com/ft81x/ +https://brtchip.com/bt81x/ + +It contains code for and has been used with various micro-controllers and displays. + +## Controllers + +I have used it so far with: + +- 8-Bit AVR, specifically the 90CAN series +- Arduino: Uno R3, mini-pro, ESP8266, ESP32, Metro-M4 (DMA), STM32 Nucleo_F446RE (DMA), XMC1100, Uno R4 +- Renesas F1L RH850 +- Infineon Aurix TC222 +- GD32VF103 +- ATSAMC21J18A (DMA) +- ATSAME51J19A (DMA) +- ESP32 (DMA) +- RP2040 Baremetal (DMA) + Arduino (DMA) - Raspberry Pi Pico +- S32K144 (DMA) +- GD32C103CBT6 (DMA) +- STM32G0B1CET6 + +I have reports of successfully using it with: + +- ATSAMV70 +- ATSAMD20 +- ATSAME4 +- MSP430 +- MSP432 +- some PICs +- ATxmega128A1 +- TMS320F28335 + +## Displays + +The TFTs tested so far: + +- FT810CB-HY50HD http://www.hotmcu.com/5-graphical-lcd-touchscreen-800x480-spi-ft810-p-286.html +- FT811CB-HY50HD http://www.hotmcu.com/5-graphical-lcd-capacitive-touch-screen-800x480-spi-ft811-p-301.html +- RVT70UQFNWC0x https://riverdi.com/product/rvt70uqfnwc0x/ +- RVT50 +- ADAM101-LCP-SWVGA-NEW from Glyn, 10.1" 1024x600 cap-touch +- EVE2-38A https://www.matrixorbital.com/eve2-38a +- EVE2-35G https://www.matrixorbital.com/eve2-35g +- EVE2-43G https://www.matrixorbital.com/eve2-43g +- EVE2-50G https://www.matrixorbital.com/eve2-50g +- EVE2-70G https://www.matrixorbital.com/eve2-70g +- NHD-3.5-320240FT-CSXV-CTP +- RVT43ULBNWC00 (RiTFT-43-CAP-UX) https://riverdi.com/product/ritft43capux/ +- RVT50AQBNWC00 (RiTFT-50-CAP) https://riverdi.com/product/ritft50cap/ +- EVE3-50G https://www.matrixorbital.com/eve3-50g +- PAF90B5WFNWC01 http://www.panadisplay.com/ftdi-intelligent-display/9-inch-lcd-with-touch-with-bt815-board.html +- EVE3-43G https://www.matrixorbital.com/eve3-43g +- EVE3-35G https://www.matrixorbital.com/eve3-35g +- CFAF240400C0-030SC https://www.crystalfontz.com/product/cfaf240400c0030sca11-240x400-eve-touchscreen-tft-ft813 +- CFAF320240F-035T https://www.crystalfontz.com/product/cfaf320240f035ttsa11-320x240-eve-tft-lcd-display-kit +- CFAF480128A0-039TC +- CFAF800480E0-050SC https://www.crystalfontz.com/product/cfaf800480e1050sca11-800x480-eve-accelerated-tft +- GEN4-FT813-50CTP-CLB https://4dsystems.com.au/gen4-ft813-50ctp-clb +- RVT101HVBNWC00-B https://riverdi.com/product/rvt101hvbnwc00-b/ +- RVT70HSBNWC00-B https://riverdi.com/product/rvt70hsbnwc00-b/ +- RVT50HQBNWC00-B https://riverdi.com/product/rvt50hqbnwc00-b/ +- CFAF1024600B0-070SC-A1 https://www.crystalfontz.com/product/cfaf1024600b0070sca1-1024x600-7-inch-eve-tft +- Sunflower shield from Cowfish Studios +- GD3X Gameduino shield + +## This is version 5 + +This is version 5 of this code library and there are a couple of changes from V4. + +First of all, support for FT80x is gone. The main reason is that this allowed a nice speed improvement modification that only works with FT81x and beyond. +Then there is a hard break from FT80x to FT81x with ony 256k of memory in FT80x but 1MB in FT81x. The memory map is different and all the registers are located elsewhere. +FT810, FT811, FT812, FT813, BT815, BT816, BT817 and BT818 can use the exact same code as long none of the new features of BT81x are used - and there are plenty of modules with these available to choose from + +As a side effect all commands are automatically started now. + +Second is that there are two sets of display-list building command functions now: EVE_cmd_xxx() and EVE_cmd_xxx_burst(). +The EVE_cmd_xxx_burst() functions are optimized for speed, these are pure data transfer functions and do not even check anymore if burst mode is active. + +## Structure + +This library currently has nine files that I hope are named to make clear what these do: + +- EVE.h - this has all defines for FT81x / BT81x itself, so here are options, registers, commands and macros defined +- EVE_commands.c - this has all the API functions that are to be called from an application +- EVE_commands.h - this contains the prototypes for the functions in EVE_commands.c +- EVE_config.h - this has all the parameters for the numerous supported display modules, here is definded which set of parameters is to be used +- EVE_target.c - this has non-portable specific code for a number of supported controllers, mostly to support DMA +- EVE_target.h - this has non-portable pin defines and code as "static inline" functions for all supported controllers +- EVE_target.cpp - this is for Arduino C++ targets +- EVE_cpp_wrapper.cpp - this is for Arduino C++ targets +- EVE_cpp_wrapper.h - this is for Arduino C++ targets + +Addtionally there are these two: +- EVE_supplemental.c +- EVE_suppplemental.h + +This has the prototype and implementation for extra functions, so far: +- EVE_widget_circle() - widget function to draw a circle +- EVE_widget_rectangle() - widget function to draw a rectangle +- EVE_polar_cartesian() - calculate coordinates from an angle and a length + +## Examples + +Generate a basic display list and tell EVE to use it: +```` +EVE_cmd_dl(CMD_DLSTART); // tells EVE to start a new display-list +EVE_cmd_dl(DL_CLEAR_COLOR_RGB | WHITE); // sets the background color +EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); +EVE_color_rgb(BLACK); +EVE_cmd_text(5, 15, 28, 0, "Hello there!"); +EVE_cmd_dl(DL_DISPLAY); // put in the display list to mark its end +EVE_cmd_dl(CMD_SWAP); // tell EVE to use the new display list +while (EVE_busy()); +```` + +Note, these commands are executed one by one, for each command chip-select is pulled low, a three byte address is send, the data for the command and its parameters is send and then chip-select is pulled high again which also makes EVE execute the command. + +But there is a way to speed things up, we can get away with only sending the address once: +```` +EVE_start_cmd_burst(); +EVE_cmd_dl_burst(CMD_DLSTART); +EVE_cmd_dl_burst(DL_CLEAR_COLOR_RGB | WHITE); +EVE_cmd_dl_burst(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); +EVE_color_rgb_burst(BLACK); +EVE_cmd_text_burst(5, 15, 28, 0, "Hello there!"); +EVE_cmd_dl_burst(DL_DISPLAY); +EVE_cmd_dl_burst(CMD_SWAP); +EVE_end_cmd_burst(); +while (EVE_busy()); +```` + +This does the same as the first example but faster. +The preceding EVE_start_cmd_burst() either sets chip-select to low and sends out the three byte address. +Or if DMA is available for the target you are compiling for with support code in EVE_target.c / EVE_target.cpp and EVE_target.h, it writes the address to EVE_dma_buffer and sets EVE_dma_buffer_index to 1. + +Note the trailing "_burst" in the following functions, these are special versions of these commands that can only be used within an EVE_start_cmd_burst()/EVE_end_cmd_bust() pair. +These functions are optimized to push out data and nothing else. + +The final EVE_end_cmd_burst() either pulls back the chip-select to high. +Or if we have DMA it calls EVE_start_dma_transfer() to start pushing out the buffer in the background. + +As we have 7 commands for EVE in these simple examples, the second one has the address overhead removed from six commands and therefore needs to transfer 18 bytes less over SPI. +So even with a small 8-bit controller that does not support DMA this is a usefull optimization for building display lists. + +Using DMA has one caveat: we need to limit the transfer to <4k as we are writing to the FIFO of EVEs command co-processor. This is usually not an issue though as we can shorten the display list generation with previously generated snippets that we attach to the current list with CMD_APPEND. And when we use widgets like CMD_BUTTON or CMD_CLOCK the generated display list grows by a larger amount than what we need to put into the command-FIFO so we likely reach the 8k limit of the display-list before we hit the 4k limit of the command-FIFO. +It is possible to use two or more DMA transfers to the FIFO to build a single display list, either to get around the 4k limit of the FIFO or in order to distribute the workload better of the time necessary between two display renewals. + +You could for example do this, spread over three consecutive calls: +```` +EVE_start_cmd_burst(); +EVE_cmd_dl_burst(CMD_DLSTART); +EVE_cmd_dl_burst(DL_CLEAR_COLOR_RGB | WHITE); +EVE_end_cmd_burst(); +```` + +```` +EVE_start_cmd_burst(); +EVE_cmd_dl_burst(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); +EVE_color_rgb_burst(BLACK); +EVE_end_cmd_burst(); +```` + +```` +EVE_start_cmd_burst(); +EVE_cmd_text_burst(5, 15, 28, 0, "Hello there!"); +EVE_cmd_dl_burst(DL_DISPLAY); +EVE_cmd_dl_burst(CMD_SWAP); +EVE_end_cmd_burst(); +```` + +But you need to check with EVE_busy() before each of these blocks. +Maybe similar like this never compiled pseudo-code: + +thread_1ms_update_display() +{ + static uint8_t state = 0; + static uint8_t count = 0; + + count++; + + if (E_OK == EVE_busy()) + { + switch (state) + { + case 0: + update_first(); + state = 1; + break; + case 1: + update_second(); + state = 2; + break; + case 2: + if (counter > 19) + { + update_last_swap_list(); + count = 0; + state = 0; + } + break; + } + } +} + + +## Remarks + +The examples in the "example_projects" drawer are for use with AtmelStudio7. +For Arduino I am using PlatformIO with Visual Studio Code. + +The platform the code is compiled for is automatically detected thru compiler flags in EVE_target.h. + +The desired TFT is selected by adding a define for it to the build-environment, e.g. -DEVE_EVE3_50G +There is a list of available options at the start of EVE_config.h sorted by chipset. + +The pins used for Chip-Select and Power-Down setup in the EVE_target/EVE_target_XXXXX.h file for your target with defines and these defines can be bypassed with defines in the build-environment. +Check the apropriate header file for your desired target. + +When compiling for AVR you need to provide the clock it is running at in order to make the _delay_ms() calls used to initialize the TFT work with the intended timing. +For other plattforms you need to provide a DELAY_MS(ms) function that works at least between 1ms and 56ms and is not performing these delays shorter than requested. +The DELAY_MS(ms) is only used during initialization of the FT8xx/BT8xx. + +In Addition you need to initialize the pins used for Chip-Select and Power-Down in your hardware correctly to output. +Plus setup the SPI accordingly, mode-0, 8-bit, MSB-first, not more than 11MHz for the initialization. +A couple of targets already have a function EVE_init_spi() in EVE_target.c. + +A word of "warning", you have to take care yourself to not send more than 4kiB at once to the command co-processor +or to not generate display lists that are longer than 8kiB. +My library does not check and re-check the command-FIFO on every step. +Also there are no checks for the validity of function arguments. +This is optimized for speed, so the training wheels are off. + +## Post questions here + +Originally the project went public in the German mikrocontroller.net forum, the thread contains some insight: https://www.mikrocontroller.net/topic/395608 + +Feel free to add to the discussion with questions or remarks. + +New: Github has a discussions feature as well: https://github.com/RudolphRiedel/FT800-FT813/discussions diff --git a/inc/lvgl/src/libs/barcode/LICENSE.txt b/inc/lvgl/src/libs/barcode/LICENSE.txt new file mode 100644 index 0000000..3455566 --- /dev/null +++ b/inc/lvgl/src/libs/barcode/LICENSE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2013-2015, LKC Technologies, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. Redistributions in binary form +must reproduce the above copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other materials provided with +the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + diff --git a/inc/lvgl/src/libs/barcode/code128.c b/inc/lvgl/src/libs/barcode/code128.c new file mode 100644 index 0000000..4fc00cb --- /dev/null +++ b/inc/lvgl/src/libs/barcode/code128.c @@ -0,0 +1,582 @@ +// Copyright (c) 2013, LKC Technologies, Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. Redistributions in binary +// form must reproduce the above copyright notice, this list of conditions and +// the following disclaimer in the documentation and/or other materials +// provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT +// HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "../../../lvgl.h" +#if LV_USE_BARCODE + +#include "code128.h" +#include + +#define CODE128_MALLOC lv_malloc +#define CODE128_REALLOC lv_realloc +#define CODE128_FREE lv_free +#define CODE128_MEMSET lv_memset +#define CODE128_STRLEN lv_strlen +#define CODE128_ASSERT LV_ASSERT + +#define CODE128_QUIET_ZONE_LEN 10 +#define CODE128_CHAR_LEN 11 +#define CODE128_STOP_CODE_LEN 13 + +#define CODE128_START_CODE_A 103 +#define CODE128_START_CODE_B 104 +#define CODE128_START_CODE_C 105 + +#define CODE128_MODE_A 'a' +#define CODE128_MODE_B 'b' +#define CODE128_MODE_C 'c' + +#define CODE128_MIN_ENCODE_LEN (CODE128_QUIET_ZONE_LEN * 2 + CODE128_CHAR_LEN * 2 + CODE128_STOP_CODE_LEN) + +static const int code128_pattern[] = { + // value: pattern, bar/space widths + 1740, // 0: 11011001100, 212222 + 1644, // 1: 11001101100, 222122 + 1638, // 2: 11001100110, 222221 + 1176, // 3: 10010011000, 121223 + 1164, // 4: 10010001100, 121322 + 1100, // 5: 10001001100, 131222 + 1224, // 6: 10011001000, 122213 + 1220, // 7: 10011000100, 122312 + 1124, // 8: 10001100100, 132212 + 1608, // 9: 11001001000, 221213 + 1604, // 10: 11001000100, 221312 + 1572, // 11: 11000100100, 231212 + 1436, // 12: 10110011100, 112232 + 1244, // 13: 10011011100, 122132 + 1230, // 14: 10011001110, 122231 + 1484, // 15: 10111001100, 113222 + 1260, // 16: 10011101100, 123122 + 1254, // 17: 10011100110, 123221 + 1650, // 18: 11001110010, 223211 + 1628, // 19: 11001011100, 221132 + 1614, // 20: 11001001110, 221231 + 1764, // 21: 11011100100, 213212 + 1652, // 22: 11001110100, 223112 + 1902, // 23: 11101101110, 312131 + 1868, // 24: 11101001100, 311222 + 1836, // 25: 11100101100, 321122 + 1830, // 26: 11100100110, 321221 + 1892, // 27: 11101100100, 312212 + 1844, // 28: 11100110100, 322112 + 1842, // 29: 11100110010, 322211 + 1752, // 30: 11011011000, 212123 + 1734, // 31: 11011000110, 212321 + 1590, // 32: 11000110110, 232121 + 1304, // 33: 10100011000, 111323 + 1112, // 34: 10001011000, 131123 + 1094, // 35: 10001000110, 131321 + 1416, // 36: 10110001000, 112313 + 1128, // 37: 10001101000, 132113 + 1122, // 38: 10001100010, 132311 + 1672, // 39: 11010001000, 211313 + 1576, // 40: 11000101000, 231113 + 1570, // 41: 11000100010, 231311 + 1464, // 42: 10110111000, 112133 + 1422, // 43: 10110001110 + 1134, // 44: 10001101110 + 1496, // 45: 10111011000, 113123 + 1478, // 46: 10111000110, 113321 + 1142, // 47: 10001110110, 133121 + 1910, // 48: 11101110110, 313121 + 1678, // 49: 11010001110, 211331 + 1582, // 50: 11000101110, 231131 + 1768, // 51: 11011101000, 213113 + 1762, // 52: 11011100010, 213311 + 1774, // 53: 11011101110, 213131 + 1880, // 54: 11101011000, 311123 + 1862, // 55: 11101000110, 311321 + 1814, // 56: 11100010110, 331121 + 1896, // 57: 11101101000, 312113 + 1890, // 58: 11101100010, 312311 + 1818, // 59: 11100011010, 332111 + 1914, // 60: 11101111010, 314111 + 1602, // 61: 11001000010, 221411 + 1930, // 62: 11110001010, 431111 + 1328, // 63: 10100110000, 111224 + 1292, // 64: 10100001100, 111422 + 1200, // 65: 10010110000, 121124 + 1158, // 66: 10010000110, 121421 + 1068, // 67: 10000101100, 141122 + 1062, // 68: 10000100110, 141221 + 1424, // 69: 10110010000, 112214 + 1412, // 70: 10110000100, 112412 + 1232, // 71: 10011010000, 122114 + 1218, // 72: 10011000010, 122411 + 1076, // 73: 10000110100, 142112 + 1074, // 74: 10000110010, 142211 + 1554, // 75: 11000010010, 241211 + 1616, // 76: 11001010000, 221114 + 1978, // 77: 11110111010, 413111 + 1556, // 78: 11000010100, 241112 + 1146, // 79: 10001111010, 134111 + 1340, // 80: 10100111100, 111242 + 1212, // 81: 10010111100, 121142 + 1182, // 82: 10010011110, 121241 + 1508, // 83: 10111100100, 114212 + 1268, // 84: 10011110100, 124112 + 1266, // 85: 10011110010, 124211 + 1956, // 86: 11110100100, 411212 + 1940, // 87: 11110010100, 421112 + 1938, // 88: 11110010010, 421211 + 1758, // 89: 11011011110, 212141 + 1782, // 90: 11011110110, 214121 + 1974, // 91: 11110110110, 412121 + 1400, // 92: 10101111000, 111143 + 1310, // 93: 10100011110, 111341 + 1118, // 94: 10001011110, 131141 + 1512, // 95: 10111101000, 114113 + 1506, // 96: 10111100010, 114311 + 1960, // 97: 11110101000, 411113 + 1954, // 98: 11110100010, 411311 + 1502, // 99: 10111011110, 113141 + 1518, // 100: 10111101110, 114131 + 1886, // 101: 11101011110, 311141 + 1966, // 102: 11110101110, 411131 + 1668, // 103: 11010000100, 211412 + 1680, // 104: 11010010000, 211214 + 1692 // 105: 11010011100, 211232 +}; + +static const int code128_stop_pattern = 6379; // 1100011101011, 2331112 + +struct code128_step { + int prev_ix; // Index of previous step, if any + const char * next_input; // Remaining input + unsigned short len; // The length of the pattern so far (includes this step) + char mode; // State for the current encoding + signed char code; // What code should be written for this step +}; + +struct code128_state { + struct code128_step * steps; + int allocated_steps; + int current_ix; + int todo_ix; + int best_ix; + + size_t maxlength; +}; + +size_t code128_estimate_len(const char * s) +{ + return CODE128_QUIET_ZONE_LEN + + CODE128_CHAR_LEN // start code + + CODE128_CHAR_LEN * (CODE128_STRLEN(s) * 11 / 10) // contents + 10% padding + + CODE128_CHAR_LEN // checksum + + CODE128_STOP_CODE_LEN + + CODE128_QUIET_ZONE_LEN; +} + +static void code128_append_pattern(int pattern, int pattern_length, char * out) +{ + // All patterns have their first bit set by design + CODE128_ASSERT(pattern & (1 << (pattern_length - 1))); + + int i; + for(i = pattern_length - 1; i >= 0; i--) { + // cast avoids warning: implicit conversion from 'int' to 'char' changes value from 255 to -1 [-Wconstant-conversion] + *out++ = (unsigned char)((pattern & (1 << i)) ? 255 : 0); + } +} + +static int code128_append_code(int code, char * out) +{ + CODE128_ASSERT(code >= 0 && code < (int)(sizeof(code128_pattern) / sizeof(code128_pattern[0]))); + code128_append_pattern(code128_pattern[code], CODE128_CHAR_LEN, out); + return CODE128_CHAR_LEN; +} + +static int code128_append_stop_code(char * out) +{ + code128_append_pattern(code128_stop_pattern, CODE128_STOP_CODE_LEN, out); + return CODE128_STOP_CODE_LEN; +} + +static signed char code128_switch_code(char from_mode, char to_mode) +{ + switch(from_mode) { + case CODE128_MODE_A: + switch(to_mode) { + case CODE128_MODE_B: + return 100; + case CODE128_MODE_C: + return 99; + } + break; + + case CODE128_MODE_B: + switch(to_mode) { + case CODE128_MODE_A: + return 101; + case CODE128_MODE_C: + return 99; + } + break; + + case CODE128_MODE_C: + switch(to_mode) { + case CODE128_MODE_B: + return 100; + case CODE128_MODE_A: + return 101; + } + break; + default: + break; + } + + CODE128_ASSERT(0); // Invalid mode switch + return -1; +} + +static signed char code128a_ascii_to_code(signed char value) +{ + if(value >= ' ' && value <= '_') + return (signed char)(value - ' '); + else if(value >= 0 && value < ' ') + return (signed char)(value + 64); + else if(value == (signed char)CODE128_FNC1) + return 102; + else if(value == (signed char)CODE128_FNC2) + return 97; + else if(value == (signed char)CODE128_FNC3) + return 96; + else if(value == (signed char)CODE128_FNC4) + return 101; + else + return -1; +} + +static signed char code128b_ascii_to_code(signed char value) +{ + if(value >= ' ') // value <= 127 is implied + return (signed char)(value - ' '); + else if(value == (signed char)CODE128_FNC1) + return 102; + else if(value == (signed char)CODE128_FNC2) + return 97; + else if(value == (signed char)CODE128_FNC3) + return 96; + else if(value == (signed char)CODE128_FNC4) + return 100; + else + return -1; +} + +static signed char code128c_ascii_to_code(const char * values) +{ + if(values[0] == CODE128_FNC1) + return 102; + + if(values[0] >= '0' && values[0] <= '9' && + values[1] >= '0' && values[1] <= '9') { + char code = 10 * (values[0] - '0') + (values[1] - '0'); + return code; + } + + return -1; +} + +static int code128_do_a_step(struct code128_step * base, int prev_ix, int ix) +{ + struct code128_step * previous_step = &base[prev_ix]; + struct code128_step * step = &base[ix]; + + char value = *previous_step->next_input; + // NOTE: Currently we can't encode NULL + if(value == 0) + return 0; + + step->code = code128a_ascii_to_code(value); + if(step->code < 0) + return 0; + + step->prev_ix = prev_ix; + step->next_input = previous_step->next_input + 1; + step->mode = CODE128_MODE_A; + step->len = previous_step->len + CODE128_CHAR_LEN; + if(step->mode != previous_step->mode) + step->len += CODE128_CHAR_LEN; // Need to switch modes + + return 1; +} + +static int code128_do_b_step(struct code128_step * base, int prev_ix, int ix) +{ + struct code128_step * previous_step = &base[prev_ix]; + struct code128_step * step = &base[ix]; + + char value = *previous_step->next_input; + // NOTE: Currently we can't encode NULL + if(value == 0) + return 0; + + step->code = code128b_ascii_to_code(value); + if(step->code < 0) + return 0; + + step->prev_ix = prev_ix; + step->next_input = previous_step->next_input + 1; + step->mode = CODE128_MODE_B; + step->len = previous_step->len + CODE128_CHAR_LEN; + if(step->mode != previous_step->mode) + step->len += CODE128_CHAR_LEN; // Need to switch modes + + return 1; +} + +static int code128_do_c_step(struct code128_step * base, int prev_ix, int ix) +{ + struct code128_step * previous_step = &base[prev_ix]; + struct code128_step * step = &base[ix]; + + char value = *previous_step->next_input; + // NOTE: Currently we can't encode NULL + if(value == 0) + return 0; + + step->code = code128c_ascii_to_code(previous_step->next_input); + if(step->code < 0) + return 0; + + step->prev_ix = prev_ix; + step->next_input = previous_step->next_input + 1; + + // Mode C consumes 2 characters for codes 0-99 + if(step->code < 100) + step->next_input++; + + step->mode = CODE128_MODE_C; + step->len = previous_step->len + CODE128_CHAR_LEN; + if(step->mode != previous_step->mode) + step->len += CODE128_CHAR_LEN; // Need to switch modes + + return 1; +} + +static struct code128_step * code128_alloc_step(struct code128_state * state) +{ + if(state->todo_ix >= state->allocated_steps) { + state->allocated_steps += 1024; + state->steps = (struct code128_step *) CODE128_REALLOC(state->steps, + state->allocated_steps * sizeof(struct code128_step)); + } + + struct code128_step * step = &state->steps[state->todo_ix]; + + CODE128_MEMSET(step, 0, sizeof(*step)); + return step; +} + +static void code128_do_step(struct code128_state * state) +{ + struct code128_step * step = &state->steps[state->current_ix]; + if(*step->next_input == 0) { + // Done, so see if we have a new shortest encoding. + if((step->len < state->maxlength) || + (state->best_ix < 0 && step->len == state->maxlength)) { + state->best_ix = state->current_ix; + + // Update maxlength to avoid considering anything longer + state->maxlength = step->len; + } + return; + } + + // Don't try if we're already at or beyond the max acceptable + // length; + if(step->len >= state->maxlength) + return; + char mode = step->mode; + + code128_alloc_step(state); + int mode_c_worked = 0; + + // Always try mode C + if(code128_do_c_step(state->steps, state->current_ix, state->todo_ix)) { + state->todo_ix++; + code128_alloc_step(state); + mode_c_worked = 1; + } + + if(mode == CODE128_MODE_A) { + // If A works, stick with A. There's no advantage to switching + // to B proactively if A still works. + if(code128_do_a_step(state->steps, state->current_ix, state->todo_ix) || + code128_do_b_step(state->steps, state->current_ix, state->todo_ix)) + state->todo_ix++; + } + else if(mode == CODE128_MODE_B) { + // The same logic applies here. There's no advantage to switching + // proactively to A if B still works. + if(code128_do_b_step(state->steps, state->current_ix, state->todo_ix) || + code128_do_a_step(state->steps, state->current_ix, state->todo_ix)) + state->todo_ix++; + } + else if(!mode_c_worked) { + // In mode C. If mode C worked and we're in mode C, trying anything + // else is pointless since the mode C encoding will be shorter and + // there won't be any mode switches. + + // If we're leaving mode C, though, try both in case one ends up + // better than the other. + if(code128_do_a_step(state->steps, state->current_ix, state->todo_ix)) { + state->todo_ix++; + code128_alloc_step(state); + } + if(code128_do_b_step(state->steps, state->current_ix, state->todo_ix)) + state->todo_ix++; + } +} + +size_t code128_encode_raw(const char * s, char * out, size_t maxlength) +{ + struct code128_state state; + + const size_t overhead = CODE128_QUIET_ZONE_LEN + + CODE128_CHAR_LEN // checksum + + CODE128_STOP_CODE_LEN + + CODE128_QUIET_ZONE_LEN; + if(maxlength < overhead + CODE128_CHAR_LEN + CODE128_CHAR_LEN) { + // Need space to encode the start character and one additional + // character. + return 0; + } + + state.allocated_steps = 256; + state.steps = (struct code128_step *) CODE128_MALLOC(state.allocated_steps * sizeof(struct code128_step)); + state.current_ix = 0; + state.todo_ix = 0; + state.maxlength = maxlength - overhead; + state.best_ix = -1; + + // Initialize the first 3 steps for the 3 encoding routes (A, B, C) + state.steps[0].prev_ix = -1; + state.steps[0].next_input = s; + state.steps[0].len = CODE128_CHAR_LEN; + state.steps[0].mode = CODE128_MODE_C; + state.steps[0].code = CODE128_START_CODE_C; + + state.steps[1].prev_ix = -1; + state.steps[1].next_input = s; + state.steps[1].len = CODE128_CHAR_LEN; + state.steps[1].mode = CODE128_MODE_A; + state.steps[1].code = CODE128_START_CODE_A; + + state.steps[2].prev_ix = -1; + state.steps[2].next_input = s; + state.steps[2].len = CODE128_CHAR_LEN; + state.steps[2].mode = CODE128_MODE_B; + state.steps[2].code = CODE128_START_CODE_B; + + state.todo_ix = 3; + + // Keep going until no more work + do { + code128_do_step(&state); + state.current_ix++; + } while(state.current_ix != state.todo_ix); + + // If no best_step, then fail. + if(state.best_ix < 0) { + CODE128_FREE(state.steps); + return 0; + } + + // Determine the list of codes + size_t num_codes = state.maxlength / CODE128_CHAR_LEN; + char * codes = CODE128_MALLOC(num_codes); + CODE128_ASSERT(codes); + + struct code128_step * step = &state.steps[state.best_ix]; + size_t i; + for(i = num_codes - 1; i > 0; --i) { + struct code128_step * prev_step = &state.steps[step->prev_ix]; + codes[i] = step->code; + if(step->mode != prev_step->mode) { + --i; + codes[i] = code128_switch_code(prev_step->mode, step->mode); + } + step = prev_step; + } + codes[0] = step->code; + + // Encode everything up to the checksum + size_t actual_length = state.maxlength + overhead; + CODE128_MEMSET(out, 0, CODE128_QUIET_ZONE_LEN); + out += CODE128_QUIET_ZONE_LEN; + for(i = 0; i < num_codes; i++) + out += code128_append_code(codes[i], out); + + // Compute the checksum + int sum = codes[0]; + for(i = 1; i < num_codes; i++) + sum += (int)(codes[i] * i); + out += code128_append_code(sum % 103, out); + + // Finalize the code. + out += code128_append_stop_code(out); + CODE128_MEMSET(out, 0, CODE128_QUIET_ZONE_LEN); + + CODE128_FREE(codes); + CODE128_FREE(state.steps); + return actual_length; +} + +/** + * @brief Encode the GS1 string + * + * This converts [FNC1] sequences to raw FNC1 characters and + * removes spaces before encoding the barcodes. + * + * @return the length of barcode data in bytes + */ +size_t code128_encode_gs1(const char * s, char * out, size_t maxlength) +{ + size_t raw_size = CODE128_STRLEN(s) + 1; + char * raw = CODE128_MALLOC(raw_size); + CODE128_ASSERT(raw); + if(!raw) { + return 0; + } + + char * p = raw; + for(; *s != '\0'; s++) { + if(strncmp(s, "[FNC1]", 6) == 0) { + *p++ = CODE128_FNC1; + s += 5; + } + else if(*s != ' ') { + *p++ = *s; + } + } + *p = '\0'; + + size_t length = code128_encode_raw(raw, out, maxlength); + + CODE128_FREE(raw); + + return length; +} + +#endif /*LV_USE_BARCODE*/ diff --git a/inc/lvgl/src/libs/barcode/code128.h b/inc/lvgl/src/libs/barcode/code128.h new file mode 100644 index 0000000..51d53d0 --- /dev/null +++ b/inc/lvgl/src/libs/barcode/code128.h @@ -0,0 +1,47 @@ +// Copyright (c) 2013-15, LKC Technologies, Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. Redistributions in binary +// form must reproduce the above copyright notice, this list of conditions and +// the following disclaimer in the documentation and/or other materials +// provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT +// HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef CODE128_H +#define CODE128_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Since the FNCn characters are not ASCII, define versions here to +// simplify encoding strings that include them. +#define CODE128_FNC1 '\xf1' +#define CODE128_FNC2 '\xf2' +#define CODE128_FNC3 '\xf3' +#define CODE128_FNC4 '\xf4' + +size_t code128_estimate_len(const char * s); +size_t code128_encode_gs1(const char * s, char * out, size_t maxlength); +size_t code128_encode_raw(const char * s, char * out, size_t maxlength); + +#ifdef __cplusplus +} +#endif + +#endif // CODE128_H diff --git a/inc/lvgl/src/libs/barcode/lv_barcode.c b/inc/lvgl/src/libs/barcode/lv_barcode.c new file mode 100644 index 0000000..524a175 --- /dev/null +++ b/inc/lvgl/src/libs/barcode/lv_barcode.c @@ -0,0 +1,327 @@ +/** + * @file lv_barcode.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj_class_private.h" +#include "lv_barcode_private.h" +#include "../../lvgl.h" + +#if LV_USE_BARCODE + +#include "code128.h" +#include "../../misc/cache/lv_cache.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_barcode_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_barcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static bool lv_barcode_change_buf_size(lv_obj_t * obj, int32_t w, int32_t h); +static void lv_barcode_clear(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_barcode_class = { + .constructor_cb = lv_barcode_constructor, + .destructor_cb = lv_barcode_destructor, + .width_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_barcode_t), + .base_class = &lv_canvas_class, + .name = "lv_barcode", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_barcode_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_barcode_set_dark_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->dark_color = color; +} + +void lv_barcode_set_light_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->light_color = color; +} + +void lv_barcode_set_scale(lv_obj_t * obj, uint16_t scale) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(scale == 0) { + scale = 1; + } + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->scale = scale; +} + +void lv_barcode_set_direction(lv_obj_t * obj, lv_dir_t direction) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->direction = direction; +} + +void lv_barcode_set_tiled(lv_obj_t * obj, bool tiled) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->tiled = tiled; + lv_image_set_inner_align(obj, tiled ? LV_IMAGE_ALIGN_TILE : LV_IMAGE_ALIGN_DEFAULT); +} + +void lv_barcode_set_encoding(lv_obj_t * obj, lv_barcode_encoding_t encoding) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->encoding = encoding; +} + +lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(data); + + if(data == NULL || lv_strlen(data) == 0) { + LV_LOG_WARN("data is empty"); + lv_barcode_clear(obj); + return LV_RESULT_INVALID; + } + + size_t len = code128_estimate_len(data); + LV_LOG_INFO("data: %s, len = %zu", data, len); + + char * out_buf = lv_malloc(len); + LV_ASSERT_MALLOC(out_buf); + if(!out_buf) { + LV_LOG_ERROR("malloc failed for out_buf"); + lv_barcode_clear(obj); + return LV_RESULT_INVALID; + } + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + + int32_t barcode_w = 0; + switch(barcode->encoding) { + case LV_BARCODE_ENCODING_CODE128_GS1: + barcode_w = (int32_t) code128_encode_gs1(data, out_buf, len); + break; + case LV_BARCODE_ENCODING_CODE128_RAW: + barcode_w = (int32_t) code128_encode_raw(data, out_buf, len); + break; + } + LV_LOG_INFO("barcode width = %" LV_PRId32, barcode_w); + + LV_ASSERT(barcode->scale > 0); + uint16_t scale = barcode->scale; + + int32_t buf_w; + int32_t buf_h; + + if(barcode->tiled) { + buf_w = (barcode->direction == LV_DIR_HOR) ? barcode_w * scale : 1; + buf_h = (barcode->direction == LV_DIR_VER) ? barcode_w * scale : 1; + } + else { + lv_obj_update_layout(obj); + buf_w = (barcode->direction == LV_DIR_HOR) ? barcode_w * scale : lv_obj_get_width(obj); + buf_h = (barcode->direction == LV_DIR_VER) ? barcode_w * scale : lv_obj_get_height(obj); + } + + if(!lv_barcode_change_buf_size(obj, buf_w, buf_h)) { + lv_barcode_clear(obj); + lv_free(out_buf); + return LV_RESULT_INVALID; + } + + /* Temporarily disable invalidation to improve the efficiency of lv_canvas_set_px */ + lv_display_enable_invalidation(lv_obj_get_display(obj), false); + + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + uint32_t stride = draw_buf->header.stride; + const lv_color_t color = lv_color_hex(1); + + /* Clear the canvas */ + lv_draw_buf_clear(draw_buf, NULL); + + /* Set the palette */ + lv_canvas_set_palette(obj, 0, lv_color_to_32(barcode->light_color, LV_OPA_COVER)); + lv_canvas_set_palette(obj, 1, lv_color_to_32(barcode->dark_color, LV_OPA_COVER)); + + for(int32_t x = 0; x < barcode_w; x++) { + /*skip empty data*/ + if(out_buf[x] == 0) { + continue; + } + + for(uint16_t i = 0; i < scale; i++) { + int32_t offset = x * scale + i; + if(barcode->direction == LV_DIR_HOR) { + lv_canvas_set_px(obj, offset, 0, color, LV_OPA_COVER); + } + else { /*LV_DIR_VER*/ + if(barcode->tiled) { + lv_canvas_set_px(obj, 0, offset, color, LV_OPA_COVER); + } + else { + uint8_t * dest = lv_draw_buf_goto_xy(draw_buf, 0, offset); + lv_memset(dest, 0xFF, stride); + } + } + } + } + + /* Copy pixels by row */ + if(!barcode->tiled && barcode->direction == LV_DIR_HOR && buf_h > 1) { + /* Skip the first row */ + int32_t h = buf_h - 1; + const uint8_t * src = lv_draw_buf_goto_xy(draw_buf, 0, 0); + uint8_t * dest = lv_draw_buf_goto_xy(draw_buf, 0, 1); + while(h--) { + lv_memcpy(dest, src, stride); + dest += stride; + } + } + + /* invalidate the canvas to refresh it */ + lv_display_enable_invalidation(lv_obj_get_display(obj), true); + lv_obj_invalidate(obj); + + lv_free(out_buf); + + return LV_RESULT_OK; +} + +lv_color_t lv_barcode_get_dark_color(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + return barcode->dark_color; +} + +lv_color_t lv_barcode_get_light_color(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + return barcode->light_color; +} + +uint16_t lv_barcode_get_scale(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + return barcode->scale; +} + +lv_barcode_encoding_t lv_barcode_get_encoding(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_barcode_t * barcode = (const lv_barcode_t *)obj; + return barcode->encoding; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_barcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_barcode_t * barcode = (lv_barcode_t *)obj; + barcode->dark_color = lv_color_black(); + barcode->light_color = lv_color_white(); + barcode->scale = 1; + barcode->direction = LV_DIR_HOR; + barcode->encoding = LV_BARCODE_ENCODING_CODE128_GS1; + lv_image_set_inner_align(obj, LV_IMAGE_ALIGN_DEFAULT); +} + +static void lv_barcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + if(draw_buf == NULL) return; + lv_image_cache_drop(draw_buf); + + /*@fixme destroy buffer in cache free_cb.*/ + lv_draw_buf_destroy(draw_buf); +} + +static bool lv_barcode_change_buf_size(lv_obj_t * obj, int32_t w, int32_t h) +{ + LV_ASSERT_NULL(obj); + if(w <= 0 || h <= 0) { + LV_LOG_WARN("invalid size: %" LV_PRId32 " x %" LV_PRId32, w, h); + return false; + } + + lv_draw_buf_t * old_buf = lv_canvas_get_draw_buf(obj); + lv_draw_buf_t * new_buf = lv_draw_buf_create(w, h, LV_COLOR_FORMAT_I1, LV_STRIDE_AUTO); + if(new_buf == NULL) { + LV_LOG_ERROR("malloc failed for canvas buffer"); + return false; + } + + lv_canvas_set_draw_buf(obj, new_buf); + LV_LOG_INFO("set canvas buffer: %p, width = %" LV_PRId32, (void *)new_buf, w); + + if(old_buf != NULL) lv_draw_buf_destroy(old_buf); + return true; +} + +static void lv_barcode_clear(lv_obj_t * obj) +{ + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + if(!draw_buf) { + return; + } + + lv_draw_buf_clear(draw_buf, NULL); + lv_image_cache_drop(draw_buf); + lv_obj_invalidate(obj); +} + +#endif /*LV_USE_BARCODE*/ diff --git a/inc/lvgl/src/libs/barcode/lv_barcode.h b/inc/lvgl/src/libs/barcode/lv_barcode.h new file mode 100644 index 0000000..79f2e51 --- /dev/null +++ b/inc/lvgl/src/libs/barcode/lv_barcode.h @@ -0,0 +1,143 @@ +/** + * @file lv_barcode.h + * + */ + +#ifndef LV_BARCODE_H +#define LV_BARCODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../misc/lv_types.h" +#include "../../misc/lv_color.h" +#include "../../widgets/canvas/lv_canvas.h" + +#if LV_USE_BARCODE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + /** + * Code 128 with GS1 encoding. Strips `[FCN1]` and spaces. + */ + LV_BARCODE_ENCODING_CODE128_GS1, + /** + * Code 128 with raw encoding. + */ + LV_BARCODE_ENCODING_CODE128_RAW, +} lv_barcode_encoding_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_barcode_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an empty barcode (an `lv_canvas`) object. + * @param parent point to an object where to create the barcode + * @return pointer to the created barcode object + */ +lv_obj_t * lv_barcode_create(lv_obj_t * parent); + +/** + * Set the dark color of a barcode object + * @param obj pointer to barcode object + * @param color dark color of the barcode + */ +void lv_barcode_set_dark_color(lv_obj_t * obj, lv_color_t color); + +/** + * Set the light color of a barcode object + * @param obj pointer to barcode object + * @param color light color of the barcode + */ +void lv_barcode_set_light_color(lv_obj_t * obj, lv_color_t color); + +/** + * Set the scale of a barcode object + * @param obj pointer to barcode object + * @param scale scale factor + */ +void lv_barcode_set_scale(lv_obj_t * obj, uint16_t scale); + +/** + * Set the direction of a barcode object + * @param obj pointer to barcode object + * @param direction draw direction (`LV_DIR_HOR` or `LB_DIR_VER`) + */ +void lv_barcode_set_direction(lv_obj_t * obj, lv_dir_t direction); + +/** + * Set the tiled mode of a barcode object + * @param obj pointer to barcode object + * @param tiled true: tiled mode, false: normal mode (default) + */ +void lv_barcode_set_tiled(lv_obj_t * obj, bool tiled); + +/** + * Set the encoding of a barcode object + * @param obj pointer to barcode object + * @param encoding encoding (default is `LV_BARCODE_CODE128_GS1`) + */ +void lv_barcode_set_encoding(lv_obj_t * obj, lv_barcode_encoding_t encoding); + +/** + * Set the data of a barcode object + * @param obj pointer to barcode object + * @param data data to display + * @return LV_RESULT_OK: if no error; LV_RESULT_INVALID: on error + */ +lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data); + +/** + * Get the dark color of a barcode object + * @param obj pointer to barcode object + * @return dark color of the barcode + */ +lv_color_t lv_barcode_get_dark_color(lv_obj_t * obj); + +/** + * Get the light color of a barcode object + * @param obj pointer to barcode object + * @return light color of the barcode + */ +lv_color_t lv_barcode_get_light_color(lv_obj_t * obj); + +/** + * Get the scale of a barcode object + * @param obj pointer to barcode object + * @return scale factor + */ +uint16_t lv_barcode_get_scale(lv_obj_t * obj); + +/** + * Get the encoding of a barcode object + * @param obj pointer to barcode object + * @return encoding + */ +lv_barcode_encoding_t lv_barcode_get_encoding(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BARCODE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_BARCODE_H*/ diff --git a/inc/lvgl/src/libs/barcode/lv_barcode_private.h b/inc/lvgl/src/libs/barcode/lv_barcode_private.h new file mode 100644 index 0000000..c4c28c5 --- /dev/null +++ b/inc/lvgl/src/libs/barcode/lv_barcode_private.h @@ -0,0 +1,56 @@ +/** + * @file lv_barcode_private.h + * + */ + +#ifndef LV_BARCODE_PRIVATE_H +#define LV_BARCODE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../widgets/canvas/lv_canvas_private.h" +#include "lv_barcode.h" + +#if LV_USE_BARCODE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of barcode*/ +struct _lv_barcode_t { + lv_canvas_t canvas; + lv_color_t dark_color; + lv_color_t light_color; + uint16_t scale; + lv_dir_t direction; + bool tiled; + lv_barcode_encoding_t encoding; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_BARCODE */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BARCODE_PRIVATE_H*/ diff --git a/inc/lvgl/src/libs/bin_decoder/lv_bin_decoder.c b/inc/lvgl/src/libs/bin_decoder/lv_bin_decoder.c new file mode 100644 index 0000000..9c31576 --- /dev/null +++ b/inc/lvgl/src/libs/bin_decoder/lv_bin_decoder.c @@ -0,0 +1,1203 @@ +/** + * @file lv_bin_decoder.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_image_decoder_private.h" +#include "lv_bin_decoder.h" +#include "../../draw/lv_draw_image.h" +#include "../../draw/lv_draw_buf.h" +#include "../../stdlib/lv_string.h" +#include "../../stdlib/lv_sprintf.h" +#include "../../libs/rle/lv_rle.h" +#include "../../core/lv_global.h" + +#if LV_USE_LZ4_EXTERNAL + #include +#endif + +#if LV_USE_LZ4_INTERNAL + #include "../../libs/lz4/lz4.h" +#endif + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "BIN" + +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +/********************** + * TYPEDEFS + **********************/ + +/** + * Data format for compressed image data. + */ + +typedef struct _lv_image_compressed_t { + uint32_t method: 4; /*Compression method, see `lv_image_compress_t`*/ + uint32_t reserved : 28; /*Reserved to be used later*/ + uint32_t compressed_size; /*Compressed data size in byte*/ + uint32_t decompressed_size; /*Decompressed data size in byte*/ + const uint8_t * data; /*Compressed data*/ +} lv_image_compressed_t; + +typedef struct { + lv_fs_file_t * f; + lv_color32_t * palette; + lv_opa_t * opa; + lv_image_compressed_t compressed; + lv_draw_buf_t * decoded; /*A draw buf to store decoded image*/ + lv_draw_buf_t * decompressed; /*Decompressed data could be used directly, thus must also be draw buf*/ + lv_draw_buf_t c_array; /*An C-array image that need to be converted to a draw buf*/ + lv_draw_buf_t * decoded_partial; /*A draw buf for decoded image via get_area_cb*/ +} decoder_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static decoder_data_t * get_decoder_data(lv_image_decoder_dsc_t * dsc); +static void free_decoder_data(lv_image_decoder_dsc_t * dsc); +static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +#if LV_BIN_DECODER_RAM_LOAD + static lv_result_t decode_rgb(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +#endif +static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static lv_result_t decode_indexed_line(lv_color_format_t color_format, const lv_color32_t * palette, int32_t x, + int32_t w_px, const uint8_t * in, lv_color32_t * out); +static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +static lv_fs_res_t fs_read_file_at(lv_fs_file_t * f, uint32_t pos, void * buff, uint32_t btr, uint32_t * br); + +static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image_compressed_t * compressed); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Initialize the lvgl binary image decoder module + */ +void lv_bin_decoder_init(void) +{ + lv_image_decoder_t * decoder; + + decoder = lv_image_decoder_create(); + LV_ASSERT_MALLOC(decoder); + if(decoder == NULL) { + LV_LOG_WARN("Out of memory"); + return; + } + + lv_image_decoder_set_info_cb(decoder, lv_bin_decoder_info); + lv_image_decoder_set_open_cb(decoder, lv_bin_decoder_open); + lv_image_decoder_set_get_area_cb(decoder, lv_bin_decoder_get_area); + lv_image_decoder_set_close_cb(decoder, lv_bin_decoder_close); + + decoder->name = DECODER_NAME; +} + +lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + LV_UNUSED(decoder); /*Unused*/ + + const void * src = dsc->src; + lv_image_src_t src_type = dsc->src_type; + + if(src_type == LV_IMAGE_SRC_VARIABLE) { + lv_image_dsc_t * image = (lv_image_dsc_t *)src; + lv_memcpy(header, &image->header, sizeof(lv_image_header_t)); + } + else if(src_type == LV_IMAGE_SRC_FILE) { + /*Support only "*.bin" files*/ + if(lv_strcmp(lv_fs_get_ext(src), "bin")) return LV_RESULT_INVALID; + + lv_fs_res_t res; + uint32_t rn; + res = lv_fs_read(&dsc->file, header, sizeof(lv_image_header_t), &rn); + + if(res != LV_FS_RES_OK || rn != sizeof(lv_image_header_t)) { + LV_LOG_WARN("Read file header failed: %d with len: %" LV_PRIu32 ", expected: %zu", res, rn, sizeof(lv_image_header_t)); + return LV_RESULT_INVALID; + } + + /** + * @todo + * This is a temp backward compatibility solution after adding + * magic in image header. + */ + if(header->magic != LV_IMAGE_HEADER_MAGIC) { + LV_LOG_WARN("Legacy bin image detected: %s", (char *)src); + header->cf = header->magic; + header->magic = LV_IMAGE_HEADER_MAGIC; + } + + /*File is always read to buf, thus data can be modified.*/ + header->flags |= LV_IMAGE_FLAGS_MODIFIABLE; + } + else if(src_type == LV_IMAGE_SRC_SYMBOL) { + /*The size depend on the font but it is unknown here. It should be handled outside of the + *function*/ + header->w = 1; + header->h = 1; + /*Symbols always have transparent parts. Important because of cover check in the draw + *function. The actual value doesn't matter because lv_draw_label will draw it*/ + header->cf = LV_COLOR_FORMAT_A8; + } + else { + LV_LOG_WARN("Image get info found unknown src type"); + return LV_RESULT_INVALID; + } + + if(header->cf == LV_COLOR_FORMAT_UNKNOWN) { + LV_LOG_WARN("Image color format is unknown"); + return LV_RESULT_INVALID; + } + + /*For backward compatibility, all images are not premultiplied for now.*/ + if(header->magic != LV_IMAGE_HEADER_MAGIC) { + header->flags &= ~LV_IMAGE_FLAGS_PREMULTIPLIED; + } + + return LV_RESULT_OK; +} + +/** + * Decode an image from a binary file + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + lv_result_t res = LV_RESULT_INVALID; + lv_fs_res_t fs_res = LV_FS_RES_UNKNOWN; + bool use_directly = false; /*If the image is already decoded and can be used directly*/ + + /*Open the file if it's a file*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + /*Support only "*.bin" files*/ + if(lv_strcmp(lv_fs_get_ext(dsc->src), "bin")) return LV_RESULT_INVALID; + + /*If the file was open successfully save the file descriptor*/ + decoder_data_t * decoder_data = get_decoder_data(dsc); + if(decoder_data == NULL) { + return LV_RESULT_INVALID; + } + + dsc->user_data = decoder_data; + lv_fs_file_t * f = lv_malloc(sizeof(*f)); + if(f == NULL) { + free_decoder_data(dsc); + return LV_RESULT_INVALID; + } + + fs_res = lv_fs_open(f, dsc->src, LV_FS_MODE_RD); + if(fs_res != LV_FS_RES_OK) { + LV_LOG_WARN("Open file failed: %d", fs_res); + lv_free(f); + free_decoder_data(dsc); + return LV_RESULT_INVALID; + } + + decoder_data->f = f; /*Now free_decoder_data will take care of the file*/ + + lv_color_format_t cf = dsc->header.cf; + + if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { + res = decode_compressed(decoder, dsc); + } + else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + if(dsc->args.use_indexed) { + /*Palette for indexed image and whole image of A8 image are always loaded to RAM for simplicity*/ + res = load_indexed(decoder, dsc); + } + else { + res = decode_indexed(decoder, dsc); + } + } + else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { + res = decode_alpha_only(decoder, dsc); + } +#if LV_BIN_DECODER_RAM_LOAD + else if(cf == LV_COLOR_FORMAT_ARGB8888 \ + || cf == LV_COLOR_FORMAT_XRGB8888 \ + || cf == LV_COLOR_FORMAT_RGB888 \ + || cf == LV_COLOR_FORMAT_RGB565 \ + || cf == LV_COLOR_FORMAT_RGB565_SWAPPED \ + || cf == LV_COLOR_FORMAT_RGB565A8 \ + || cf == LV_COLOR_FORMAT_ARGB8565) { + res = decode_rgb(decoder, dsc); + } +#else + else { + /* decode them in get_area_cb */ + res = LV_RESULT_OK; + } +#endif + } + + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + /*The variables should have valid data*/ + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + if(image->data == NULL) { + return LV_RESULT_INVALID; + } + + lv_color_format_t cf = image->header.cf; + if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { + res = decode_compressed(decoder, dsc); + } + else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + /*Need decoder data to store converted image*/ + decoder_data_t * decoder_data = get_decoder_data(dsc); + if(decoder_data == NULL) { + return LV_RESULT_INVALID; + } + + if(dsc->args.use_indexed) { + /*Palette for indexed image and whole image of A8 image are always loaded to RAM for simplicity*/ + res = load_indexed(decoder, dsc); + use_directly = true; /*If draw unit supports indexed image, it can be used directly.*/ + } + else { + res = decode_indexed(decoder, dsc); + } + } + else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf) && cf != LV_COLOR_FORMAT_A8) { + /*Alpha only image will need decoder data to store pointer to decoded image, to free it when decoder closes*/ + decoder_data_t * decoder_data = get_decoder_data(dsc); + if(decoder_data == NULL) { + return LV_RESULT_INVALID; + } + + res = decode_alpha_only(decoder, dsc); + } + else { + /*In case of uncompressed formats the image stored in the ROM/RAM. + *So simply give its pointer*/ + + decoder_data_t * decoder_data = get_decoder_data(dsc); + lv_draw_buf_t * decoded; + if(image->header.flags & LV_IMAGE_FLAGS_ALLOCATED) { + decoded = (lv_draw_buf_t *)image; + res = LV_RESULT_OK; + } + else { + decoded = &decoder_data->c_array; + if(image->header.stride == 0) { + /*If image doesn't have stride, treat it as lvgl v8 legacy image format*/ + lv_image_dsc_t tmp = *image; + tmp.header.stride = (tmp.header.w * lv_color_format_get_bpp(cf) + 7) >> 3; + res = lv_draw_buf_from_image(decoded, &tmp); + } + else + res = lv_draw_buf_from_image(decoded, image); + } + + if(res == LV_RESULT_OK) { + dsc->decoded = decoded; + + if(decoded->header.stride == 0) { + /*Use the auto calculated value from decoder_info callback*/ + decoded->header.stride = dsc->header.stride; + } + + use_directly = true; /*A variable image that can be used directly.*/ + } + } + } + + if(res != LV_RESULT_OK) { + free_decoder_data(dsc); + return res; + } + + if(dsc->decoded == NULL) return LV_RESULT_OK; /*Need to read via get_area_cb*/ + + lv_draw_buf_t * decoded = (lv_draw_buf_t *)dsc->decoded; + if(dsc->header.flags & LV_IMAGE_FLAGS_PREMULTIPLIED) { + lv_draw_buf_set_flag(decoded, LV_IMAGE_FLAGS_PREMULTIPLIED); + } + + lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); + if(adjusted == NULL) { + free_decoder_data(dsc); + return LV_RESULT_INVALID; + } + + /*The adjusted draw buffer is newly allocated.*/ + if(adjusted != decoded) { + use_directly = false; /*Cannot use original image directly*/ + free_decoder_data(dsc); + decoder_data_t * decoder_data = get_decoder_data(dsc); + decoder_data->decoded = adjusted; /*Now this new buffer need to be free'd on decoder close*/ + } + dsc->decoded = adjusted; + + /* Copy user flags to the decoded image */ + if(dsc->header.flags & LV_IMAGE_FLAGS_USER_MASK) { + lv_draw_buf_set_flag((lv_draw_buf_t *)dsc->decoded, dsc->header.flags & LV_IMAGE_FLAGS_USER_MASK); + } + + /*Do not put image to cache if it can be used directly.*/ + if(use_directly || dsc->args.no_cache) { + if(dsc->args.flush_cache && use_directly) { + dsc->args.flush_cache = false; + } + return LV_RESULT_OK; + } + + /*If the image cache is disabled, just return the decoded image*/ + if(!lv_image_cache_is_enabled()) return LV_RESULT_OK; + + /*Add it to cache*/ + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = dsc->decoded->data_size; + + lv_cache_entry_t * cache_entry = lv_image_decoder_add_to_cache(decoder, &search_key, dsc->decoded, dsc->user_data); + if(cache_entry == NULL) { + free_decoder_data(dsc); + return LV_RESULT_INVALID; + } + dsc->cache_entry = cache_entry; + decoder_data_t * decoder_data = get_decoder_data(dsc); + decoder_data->decoded = NULL; /*Cache will take care of it*/ + + return LV_RESULT_OK; +} + +void lv_bin_decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + decoder_data_t * decoder_data = dsc->user_data; + if(decoder_data && decoder_data->decoded_partial) { + lv_draw_buf_destroy(decoder_data->decoded_partial); + decoder_data->decoded_partial = NULL; + } + + free_decoder_data(dsc); +} + +lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_color_format_t cf = dsc->header.cf; + /*Check if cf is supported*/ + + bool supported = LV_COLOR_FORMAT_IS_INDEXED(cf) + || cf == LV_COLOR_FORMAT_ARGB8888 \ + || cf == LV_COLOR_FORMAT_XRGB8888 \ + || cf == LV_COLOR_FORMAT_RGB888 \ + || cf == LV_COLOR_FORMAT_RGB565 \ + || cf == LV_COLOR_FORMAT_RGB565_SWAPPED \ + || cf == LV_COLOR_FORMAT_ARGB8565 \ + || cf == LV_COLOR_FORMAT_RGB565A8; + if(!supported) { + LV_LOG_WARN("CF: %d is not supported", cf); + return LV_RESULT_INVALID; + } + + lv_fs_res_t res = LV_FS_RES_UNKNOWN; + decoder_data_t * decoder_data = dsc->user_data; + if(decoder_data == NULL) { + LV_LOG_ERROR("Unexpected null decoder data"); + return LV_RESULT_INVALID; + } + + lv_fs_file_t * f = decoder_data->f; + uint32_t bpp = lv_color_format_get_bpp(cf); + int32_t w_px = lv_area_get_width(full_area); + uint8_t * img_data = NULL; + lv_draw_buf_t * decoded = NULL; + uint32_t offset = dsc->src_type == LV_IMAGE_SRC_FILE ? sizeof(lv_image_header_t) : 0; /*Skip the image header*/ + + /*We only support read line by line for now*/ + if(decoded_area->y1 == LV_COORD_MIN) { + /*Indexed image is converted to ARGB888*/ + lv_color_format_t cf_decoded = LV_COLOR_FORMAT_IS_INDEXED(cf) ? LV_COLOR_FORMAT_ARGB8888 : cf; + + decoded = lv_draw_buf_reshape(decoder_data->decoded_partial, cf_decoded, w_px, 1, LV_STRIDE_AUTO); + if(decoded == NULL) { + if(decoder_data->decoded_partial != NULL) { + lv_draw_buf_destroy(decoder_data->decoded_partial); + decoder_data->decoded_partial = NULL; + } + decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, w_px, 1, cf_decoded, LV_STRIDE_AUTO); + if(decoded == NULL) return LV_RESULT_INVALID; + decoder_data->decoded_partial = decoded; /*Free on decoder close*/ + } + *decoded_area = *full_area; + decoded_area->y2 = decoded_area->y1; + } + else { + decoded_area->y1++; + decoded_area->y2++; + decoded = decoder_data->decoded_partial; /*Already allocated*/ + } + + img_data = decoded->data; /*Get the buffer to operate on*/ + + if(decoded_area->y1 > full_area->y2) { + return LV_RESULT_INVALID; + } + + if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + int32_t x_fraction = decoded_area->x1 % (8 / bpp); + uint32_t len = (w_px * bpp + 7) / 8 + 1; /*10px for 1bpp may across 3bytes*/ + uint8_t * buf = NULL; + + offset += dsc->palette_size * 4; /*Skip palette*/ + offset += decoded_area->y1 * dsc->header.stride; + offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + buf = lv_malloc(len); + LV_ASSERT_NULL(buf); + if(buf == NULL) + return LV_RESULT_INVALID; + + res = fs_read_file_at(f, offset, buf, len, NULL); + if(res != LV_FS_RES_OK) { + lv_free(buf); + return LV_RESULT_INVALID; + } + } + else { + const lv_image_dsc_t * image = dsc->src; + buf = (void *)(image->data + offset); + } + + decode_indexed_line(cf, dsc->palette, x_fraction, w_px, buf, (lv_color32_t *)img_data); + + if(dsc->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)buf); + + dsc->decoded = decoded; /*Return decoded image*/ + return LV_RESULT_OK; + } + + if(cf == LV_COLOR_FORMAT_ARGB8888 || cf == LV_COLOR_FORMAT_XRGB8888 || cf == LV_COLOR_FORMAT_RGB888 + || cf == LV_COLOR_FORMAT_RGB565 || cf == LV_COLOR_FORMAT_RGB565_SWAPPED || cf == LV_COLOR_FORMAT_ARGB8565) { + uint32_t len = (w_px * bpp) / 8; + offset += decoded_area->y1 * dsc->header.stride; + offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ + res = fs_read_file_at(f, offset, img_data, len, NULL); + if(res != LV_FS_RES_OK) { + return LV_RESULT_INVALID; + } + + dsc->decoded = decoded; /*Return decoded image*/ + return LV_RESULT_OK; + } + + if(cf == LV_COLOR_FORMAT_RGB565A8) { + bpp = 16; /* RGB565 + A8 mask*/ + uint32_t len = decoded->header.stride; + offset += decoded_area->y1 * dsc->header.stride; /*Move to y1*/ + offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ + res = fs_read_file_at(f, offset, img_data, len, NULL); + if(res != LV_FS_RES_OK) { + return LV_RESULT_INVALID; + } + + /*Now the A8 mask*/ + offset = sizeof(lv_image_header_t); + offset += dsc->header.h * dsc->header.stride; /*Move to A8 map*/ + offset += decoded_area->y1 * (dsc->header.stride / 2); /*Move to y1*/ + offset += decoded_area->x1 * 1; /*Move to x1*/ + res = fs_read_file_at(f, offset, img_data + len, w_px * 1, NULL); + if(res != LV_FS_RES_OK) { + return LV_RESULT_INVALID; + } + + dsc->decoded = decoded; /*Return decoded image*/ + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static decoder_data_t * get_decoder_data(lv_image_decoder_dsc_t * dsc) +{ + decoder_data_t * data = dsc->user_data; + if(data == NULL) { + data = lv_malloc_zeroed(sizeof(decoder_data_t)); + LV_ASSERT_MALLOC(data); + if(data == NULL) { + LV_LOG_ERROR("Out of memory"); + return NULL; + } + + dsc->user_data = data; + } + + return data; +} + +static void free_decoder_data(lv_image_decoder_dsc_t * dsc) +{ + decoder_data_t * decoder_data = dsc->user_data; + if(decoder_data == NULL) return; + + if(decoder_data->f) { + lv_fs_close(decoder_data->f); + lv_free(decoder_data->f); + } + + if(decoder_data->decoded) lv_draw_buf_destroy(decoder_data->decoded); + if(decoder_data->decompressed) lv_draw_buf_destroy(decoder_data->decompressed); + lv_free(decoder_data->palette); + lv_free(decoder_data); + dsc->user_data = NULL; +} + +static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + lv_fs_res_t res; + uint32_t rn; + decoder_data_t * decoder_data = dsc->user_data; + lv_fs_file_t * f = decoder_data->f; + lv_color_format_t cf = dsc->header.cf; + uint32_t palette_len = sizeof(lv_color32_t) * LV_COLOR_INDEXED_PALETTE_SIZE(cf); + const lv_color32_t * palette; + const uint8_t * indexed_data = NULL; + lv_draw_buf_t * draw_buf_indexed = NULL; + uint32_t stride = dsc->header.stride; + + bool is_compressed = dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED; + if(is_compressed) { + uint8_t * data = decoder_data->decompressed->data; + palette = (lv_color32_t *)data; + indexed_data = data + palette_len; + } + else if(dsc->src_type == LV_IMAGE_SRC_FILE) { + /*read palette for indexed image*/ + palette = lv_malloc(palette_len); + LV_ASSERT_MALLOC(palette); + if(palette == NULL) { + LV_LOG_ERROR("Out of memory"); + return LV_RESULT_INVALID; + } + + res = fs_read_file_at(f, sizeof(lv_image_header_t), (uint8_t *)palette, palette_len, &rn); + if(res != LV_FS_RES_OK || rn != palette_len) { + LV_LOG_WARN("Read palette failed: %d, with len: %" LV_PRIu32 ", expected: %" LV_PRIu32, res, rn, palette_len); + lv_free((void *)palette); + return LV_RESULT_INVALID; + } + + decoder_data->palette = (void *)palette; /*Need to free when decoder closes*/ + +#if LV_BIN_DECODER_RAM_LOAD + draw_buf_indexed = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, cf, + dsc->header.stride); + if(draw_buf_indexed == NULL) { + LV_LOG_ERROR("Draw buffer alloc failed"); + goto exit_with_buf; + } + + indexed_data = draw_buf_indexed->data; + + uint32_t data_len = 0; + if(lv_fs_seek(f, 0, LV_FS_SEEK_END) != LV_FS_RES_OK || + lv_fs_tell(f, &data_len) != LV_FS_RES_OK) { + LV_LOG_WARN("Failed to get file to size"); + goto exit_with_buf; + } + + uint32_t data_offset = sizeof(lv_image_header_t) + palette_len; + data_len -= data_offset; + res = fs_read_file_at(f, data_offset, (uint8_t *)indexed_data, data_len, &rn); + if(res != LV_FS_RES_OK || rn != data_len) { + LV_LOG_WARN("Read indexed image failed: %d, with len: %" LV_PRIu32 ", expected: %" LV_PRIu32, res, rn, data_len); + goto exit_with_buf; + } +#endif + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + palette = (lv_color32_t *)image->data; + indexed_data = image->data + palette_len; + } + else { + return LV_RESULT_INVALID; + } + + dsc->palette = palette; + dsc->palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(cf); + +#if LV_BIN_DECODER_RAM_LOAD + /*Convert to ARGB8888, since sw renderer cannot render it directly even it's in RAM*/ + lv_draw_buf_t * decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, + LV_COLOR_FORMAT_ARGB8888, + 0); + if(decoded == NULL) { + LV_LOG_ERROR("No memory for indexed image"); + goto exit_with_buf; + } + + stride = decoded->header.stride; + uint8_t * img_data = decoded->data; + + const uint8_t * in = indexed_data; + uint8_t * out = img_data; + for(uint32_t y = 0; y < dsc->header.h; y++) { + decode_indexed_line(cf, dsc->palette, 0, dsc->header.w, in, (lv_color32_t *)out); + in += dsc->header.stride; + out += stride; + } + + dsc->decoded = decoded; + decoder_data->decoded = decoded; /*Free when decoder closes*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE && !is_compressed) { + decoder_data->palette = (void *)palette; /*Free decoder data on close*/ + lv_draw_buf_destroy(draw_buf_indexed); + } + + return LV_RESULT_OK; +exit_with_buf: + if(dsc->src_type == LV_IMAGE_SRC_FILE && !is_compressed) { + lv_free((void *)palette); + decoder_data->palette = NULL; + } + + if(draw_buf_indexed) lv_draw_buf_destroy(draw_buf_indexed); + return LV_RESULT_INVALID; +#else + LV_UNUSED(stride); + LV_UNUSED(indexed_data); + LV_UNUSED(draw_buf_indexed); + /*It needs to be read by get_area_cb later*/ + return LV_RESULT_OK; +#endif +} + +static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ +#if LV_BIN_DECODER_RAM_LOAD == 0 + LV_UNUSED(decoder); /*Unused*/ + LV_UNUSED(dsc); /*Unused*/ + LV_LOG_ERROR("LV_BIN_DECODER_RAM_LOAD is disabled"); + return LV_RESULT_INVALID; +#else + + LV_UNUSED(decoder); /*Unused*/ + + lv_fs_res_t res; + uint32_t rn; + decoder_data_t * decoder_data = dsc->user_data; + + if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { + /*The decompressed image is already loaded to RAM*/ + dsc->decoded = decoder_data->decompressed; + + /*Transfer ownership to decoded pointer because it's the final data we use.*/ + decoder_data->decoded = decoder_data->decompressed; + decoder_data->decompressed = NULL; + return LV_RESULT_OK; + } + + if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + lv_draw_buf_t * decoded; + if(image->header.flags & LV_IMAGE_FLAGS_ALLOCATED) { + decoded = (lv_draw_buf_t *)image; + } + else { + decoded = &decoder_data->c_array; + lv_result_t result = lv_draw_buf_from_image(decoded, image); + if(result != LV_RESULT_OK) { + return result; + } + } + + dsc->decoded = decoded; + + if(decoded->header.stride == 0) { + /*Use the auto calculated value from decoder_info callback*/ + decoded->header.stride = dsc->header.stride; + } + + return LV_RESULT_OK; + } + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + lv_color_format_t cf = dsc->header.cf; + lv_fs_file_t * f = decoder_data->f; + lv_draw_buf_t * decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, cf, + dsc->header.stride); + if(decoded == NULL) { + LV_LOG_ERROR("Draw buffer alloc failed"); + return LV_RESULT_INVALID; + } + + uint8_t * data = decoded->data; + uint32_t palette_len = sizeof(lv_color32_t) * LV_COLOR_INDEXED_PALETTE_SIZE(cf); + res = fs_read_file_at(f, sizeof(lv_image_header_t), data, palette_len, &rn); + if(res != LV_FS_RES_OK || rn != palette_len) { + LV_LOG_WARN("Read palette failed: %d, with len: %" LV_PRIu32 ", expected: %" LV_PRIu32, res, rn, palette_len); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + uint32_t data_len = 0; + if(lv_fs_seek(f, 0, LV_FS_SEEK_END) != LV_FS_RES_OK || + lv_fs_tell(f, &data_len) != LV_FS_RES_OK) { + LV_LOG_WARN("Failed to get file to size"); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + uint32_t data_offset = sizeof(lv_image_header_t) + palette_len; + data_len -= data_offset; + data += palette_len; + res = fs_read_file_at(f, data_offset, data, data_len, &rn); + if(res != LV_FS_RES_OK || rn != data_len) { + LV_LOG_WARN("Read indexed image failed: %d, with len: %" LV_PRIu32 ", expected: %" LV_PRIu32, res, rn, data_len); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + decoder_data->decoded = decoded; + dsc->decoded = decoded; + return LV_RESULT_OK; + } + + LV_LOG_ERROR("Unknown src type: %d", dsc->src_type); + return LV_RESULT_INVALID; +#endif +} + +#if LV_BIN_DECODER_RAM_LOAD +static lv_result_t decode_rgb(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + lv_fs_res_t res; + decoder_data_t * decoder_data = dsc->user_data; + lv_fs_file_t * f = decoder_data->f; + lv_color_format_t cf = dsc->header.cf; + + uint32_t len = dsc->header.stride * dsc->header.h; + if(cf == LV_COLOR_FORMAT_RGB565A8) { + len += (dsc->header.stride / 2) * dsc->header.h; /*A8 mask*/ + } + + lv_draw_buf_t * decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, cf, + dsc->header.stride); + if(decoded == NULL) { + LV_LOG_ERROR("No memory for rgb file read"); + return LV_RESULT_INVALID; + } + + uint8_t * img_data = decoded->data; + + uint32_t rn; + res = fs_read_file_at(f, sizeof(lv_image_header_t), img_data, len, &rn); + if(res != LV_FS_RES_OK || rn != len) { + LV_LOG_WARN("Read rgb file failed: %d, with len: %" LV_PRIu32 ", expected: %" LV_PRIu32, res, rn, len); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + dsc->decoded = decoded; + decoder_data->decoded = decoded; /*Free when decoder closes*/ + return LV_RESULT_OK; +} +#endif + +/** + * Extend A1/2/4 to A8 with interpolation to reduce rounding error. + */ +static inline uint8_t bit_extend(uint8_t value, uint8_t bpp) +{ + if(value == 0) return 0; + + uint8_t res = value; + uint8_t bpp_now = bpp; + while(bpp_now < 8) { + res |= value << (8 - bpp_now); + bpp_now += bpp; + }; + + return res; +} + +static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + lv_fs_res_t res; + uint32_t rn; + decoder_data_t * decoder_data = dsc->user_data; + uint8_t bpp = lv_color_format_get_bpp(dsc->header.cf); + + if(bpp == 0) { + LV_LOG_ERROR("Error color format: %d", dsc->header.cf); + return LV_RESULT_INVALID; + } + + uint32_t w = (dsc->header.stride * 8) / bpp; + uint32_t buf_stride = (w * 8 + 7) >> 3; /*stride for img_data*/ + uint32_t buf_len = w * dsc->header.h; /*always decode to A8 format*/ + lv_draw_buf_t * decoded; + uint32_t file_len = (uint32_t)dsc->header.stride * dsc->header.h; + + decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, LV_COLOR_FORMAT_A8, + buf_stride); + if(decoded == NULL) { + LV_LOG_ERROR("Out of memory"); + return LV_RESULT_INVALID; + } + + uint8_t * img_data = decoded->data; + + if(dsc->header.flags & LV_IMAGE_FLAGS_COMPRESSED) { + /*Copy from image data*/ + lv_memcpy(img_data, decoder_data->decompressed->data, file_len); + } + else if(dsc->src_type == LV_IMAGE_SRC_FILE) { + res = fs_read_file_at(decoder_data->f, sizeof(lv_image_header_t), img_data, file_len, &rn); + if(res != LV_FS_RES_OK || rn != file_len) { + LV_LOG_WARN("Read header failed: %d, with len: %" LV_PRIu32 ", expected: %" LV_PRIu32, res, rn, file_len); + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + /*Copy from image data*/ + lv_memcpy(img_data, ((lv_image_dsc_t *)dsc->src)->data, file_len); + } + + if(dsc->header.cf != LV_COLOR_FORMAT_A8) { + /*Convert A1/2/4 to A8 from last pixel to first pixel*/ + uint8_t * in = img_data + file_len - 1; + uint8_t * out = img_data + buf_len - 1; + uint8_t mask = (1 << bpp) - 1; + uint8_t shift = 0; + for(uint32_t i = 0; i < buf_len; i++) { + /** + * Rounding error: + * Take bpp = 4 as example, alpha value of 0x0 to 0x0F should be + * mapped to 0x00 to 0xFF. Using below equation will give us 0x00 to 0xF0 + * thus causes error. We can simply interpolate the value to fix it. + * + * Equation: *out = ((*in >> shift) & mask) << (8 - bpp); + * Ideal: *out = ((*in >> shift) & mask) * 255 / ((1L << bpp) - 1) + */ + uint8_t value = ((*in >> shift) & mask); + *out = bit_extend(value, bpp); + shift += bpp; + if(shift >= 8) { + shift = 0; + in--; + } + out--; + } + } + + decoder_data->decoded = decoded; + dsc->decoded = decoded; + return LV_RESULT_OK; +} + +static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ +#if LV_BIN_DECODER_RAM_LOAD + uint32_t rn; + uint32_t len; + uint32_t compressed_len; + decoder_data_t * decoder_data = get_decoder_data(dsc); + lv_result_t res; + lv_fs_res_t fs_res; + uint8_t * file_buf = NULL; + lv_image_compressed_t * compressed = &decoder_data->compressed; + + lv_memzero(compressed, sizeof(lv_image_compressed_t)); + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + lv_fs_file_t * f = decoder_data->f; + + if(lv_fs_seek(f, 0, LV_FS_SEEK_END) != LV_FS_RES_OK || + lv_fs_tell(f, &compressed_len) != LV_FS_RES_OK) { + LV_LOG_WARN("Failed to get compressed file len"); + return LV_RESULT_INVALID; + } + + compressed_len -= sizeof(lv_image_header_t); + compressed_len -= 12; + + /*Read compress header*/ + len = 12; + fs_res = fs_read_file_at(f, sizeof(lv_image_header_t), compressed, len, &rn); + if(fs_res != LV_FS_RES_OK || rn != len) { + LV_LOG_WARN("Read compressed header failed: %d, with len: %" LV_PRIu32 ", expected: %" LV_PRIu32, fs_res, rn, len); + return LV_RESULT_INVALID; + } + + if(compressed->compressed_size != compressed_len) { + LV_LOG_WARN("Compressed size mismatch: %" LV_PRIu32" != %" LV_PRIu32, compressed->compressed_size, compressed_len); + return LV_RESULT_INVALID; + } + + file_buf = lv_malloc(compressed_len); + if(file_buf == NULL) { + LV_LOG_WARN("No memory for compressed file"); + return LV_RESULT_INVALID; + + } + + /*Continue to read the compressed data following compression header*/ + fs_res = lv_fs_read(f, file_buf, compressed_len, &rn); + if(fs_res != LV_FS_RES_OK || rn != compressed_len) { + LV_LOG_WARN("Read compressed file failed: %d, with len: %" LV_PRIu32 ", expected: %" LV_PRIu32, fs_res, rn, + compressed_len); + lv_free(file_buf); + return LV_RESULT_INVALID; + } + + /*Decompress the image*/ + compressed->data = file_buf; + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + compressed_len = image->data_size; + + /*Read compress header*/ + len = 12; + compressed_len -= len; + lv_memcpy(compressed, image->data, len); + compressed->data = image->data + len; + if(compressed->compressed_size != compressed_len) { + LV_LOG_WARN("Compressed size mismatch: %" LV_PRIu32" != %" LV_PRIu32, compressed->compressed_size, compressed_len); + return LV_RESULT_INVALID; + } + } + else { + LV_LOG_WARN("Compressed image only support file or variable"); + return LV_RESULT_INVALID; + } + + res = decompress_image(dsc, compressed); + compressed->data = NULL; /*No need to store the data any more*/ + lv_free(file_buf); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("Decompress failed"); + return LV_RESULT_INVALID; + } + + /*Depends on the cf, need to further decode image like an C-array image*/ + lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src; + if(dsc->src_type == LV_IMAGE_SRC_VARIABLE && image->data == NULL) { + return LV_RESULT_INVALID; + } + + lv_color_format_t cf = dsc->header.cf; + if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + if(dsc->args.use_indexed) res = load_indexed(decoder, dsc); + else res = decode_indexed(decoder, dsc); + } + else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) { + res = decode_alpha_only(decoder, dsc); + } + else { + /*The decompressed data is the original image data.*/ + dsc->decoded = decoder_data->decompressed; + + /*Transfer ownership of decompressed to `decoded` since it can be used directly*/ + decoder_data->decoded = decoder_data->decompressed; + decoder_data->decompressed = NULL; + res = LV_RESULT_OK; + } + + return res; +#else + LV_UNUSED(decompress_image); + LV_UNUSED(decoder); + LV_UNUSED(dsc); + LV_LOG_ERROR("Need LV_BIN_DECODER_RAM_LOAD to be enabled"); + return LV_RESULT_INVALID; +#endif +} + +static lv_result_t decode_indexed_line(lv_color_format_t color_format, const lv_color32_t * palette, int32_t x, + int32_t w_px, const uint8_t * in, lv_color32_t * out) +{ + uint8_t px_size; + uint16_t mask; + + int8_t shift = 0; + switch(color_format) { + case LV_COLOR_FORMAT_I1: + px_size = 1; + in += x / 8; /*8pixel per byte*/ + shift = 7 - (x & 0x7); + break; + case LV_COLOR_FORMAT_I2: + px_size = 2; + in += x / 4; /*4pixel per byte*/ + shift = 6 - 2 * (x & 0x3); + break; + case LV_COLOR_FORMAT_I4: + px_size = 4; + in += x / 2; /*2pixel per byte*/ + shift = 4 - 4 * (x & 0x1); + break; + case LV_COLOR_FORMAT_I8: + px_size = 8; + in += x; + shift = 0; + break; + default: + return LV_RESULT_INVALID; + } + + mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ + + int32_t i; + for(i = 0; i < w_px; i++) { + uint8_t val_act = (*in >> shift) & mask; + out[i] = palette[val_act]; + + shift -= px_size; + if(shift < 0) { + shift = 8 - px_size; + in++; + } + } + return LV_RESULT_OK; +} + +static lv_fs_res_t fs_read_file_at(lv_fs_file_t * f, uint32_t pos, void * buff, uint32_t btr, uint32_t * br) +{ + lv_fs_res_t res; + if(br) *br = 0; + + res = lv_fs_seek(f, pos, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + return res; + } + + res |= lv_fs_read(f, buff, btr, br); + if(res != LV_FS_RES_OK) { + return res; + } + + return LV_FS_RES_OK; +} + +static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image_compressed_t * compressed) +{ + /* At least one compression method must be enabled */ +#if (LV_USE_LZ4 || LV_USE_RLE) + /* Check if the decompression method is enabled and valid */ + if(compressed->method == LV_IMAGE_COMPRESS_RLE) { +#if !LV_USE_RLE + LV_LOG_WARN("RLE decompression is not enabled"); + return LV_RESULT_INVALID; +#endif + } + else if(compressed->method == LV_IMAGE_COMPRESS_LZ4) { +#if !LV_USE_LZ4 + LV_LOG_WARN("LZ4 decompression is not enabled"); + return LV_RESULT_INVALID; +#endif + } + else { + LV_LOG_WARN("Unknown compression method: %" LV_PRIu32, compressed->method); + return LV_RESULT_INVALID; + } + + /*Need to store decompressed data to decoder to free on close*/ + decoder_data_t * decoder_data = get_decoder_data(dsc); + if(decoder_data == NULL) { + return LV_RESULT_INVALID; + } + + uint8_t * img_data; + uint32_t out_len = compressed->decompressed_size; + uint32_t input_len = compressed->compressed_size; + uint32_t len = 0; + + lv_draw_buf_t * decompressed = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, + dsc->header.cf, + dsc->header.stride); + if(decompressed == NULL) { + LV_LOG_WARN("No memory for decompressed image, input: %" LV_PRIu32 ", output: %" LV_PRIu32, input_len, out_len); + return LV_RESULT_INVALID; + } + + if(out_len > decompressed->data_size) { + LV_LOG_ERROR("Decompressed size mismatch: %" LV_PRIu32 " > %" LV_PRIu32, out_len, decompressed->data_size); + lv_draw_buf_destroy(decompressed); + return LV_RESULT_INVALID; + } + + img_data = decompressed->data; + + if(compressed->method == LV_IMAGE_COMPRESS_RLE) { +#if LV_USE_RLE + /*Compress always happen on byte*/ + uint32_t pixel_byte; + if(dsc->header.cf == LV_COLOR_FORMAT_RGB565A8) + pixel_byte = 2; + else + pixel_byte = (lv_color_format_get_bpp(dsc->header.cf) + 7) >> 3; + + const uint8_t * input = compressed->data; + uint8_t * output = img_data; + + len = lv_rle_decompress(input, input_len, output, out_len, pixel_byte); +#endif /* LV_USE_RLE */ + } + else if(compressed->method == LV_IMAGE_COMPRESS_LZ4) { +#if LV_USE_LZ4 + const char * input = (const char *)compressed->data; + char * output = (char *)img_data; + + int ret = LZ4_decompress_safe(input, output, (int)input_len, (int)out_len); + if(ret >= 0) { + /* Cast is safe because of the above check */ + len = (uint32_t)ret; + } +#endif /* LV_USE_LZ4 */ + } + + if(len != compressed->decompressed_size) { + LV_LOG_WARN("Decompress failed: %" LV_PRIu32 ", got: %" LV_PRIu32, out_len, len); + lv_draw_buf_destroy(decompressed); + return LV_RESULT_INVALID; + } + + decoder_data->decompressed = decompressed; /*Free on decoder close*/ + return LV_RESULT_OK; +#else + LV_UNUSED(dsc); + LV_UNUSED(compressed); + LV_LOG_WARN("At least one compression method must be enabled"); + return LV_RESULT_INVALID; +#endif /* (LV_USE_LZ4 || LV_USE_RLE) */ +} diff --git a/inc/lvgl/src/libs/bin_decoder/lv_bin_decoder.h b/inc/lvgl/src/libs/bin_decoder/lv_bin_decoder.h new file mode 100644 index 0000000..d441230 --- /dev/null +++ b/inc/lvgl/src/libs/bin_decoder/lv_bin_decoder.h @@ -0,0 +1,70 @@ +/** + * @file lv_bin_decoder.h + * + */ + +#ifndef LV_BIN_DECODER_H +#define LV_BIN_DECODER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_image_decoder.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the binary image decoder module + */ +void lv_bin_decoder_init(void); + +/** + * Get info about a lvgl binary image + * @param decoder the decoder where this function belongs + * @param dsc image descriptor containing the source and type of the image and other info. + * @param header store the image data here + * @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error. + */ +lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); + +lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area); + +/** + * Open a lvgl binary image + * @param decoder the decoder where this function belongs + * @param dsc pointer to decoder descriptor. `src`, `style` are already initialized in it. + * @return LV_RESULT_OK: the info is successfully stored in `header`; LV_RESULT_INVALID: unknown format or other error. + */ +lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +/** + * Close the pending decoding. Free resources etc. + * @param decoder pointer to the decoder the function associated with + * @param dsc pointer to decoder descriptor + */ +void lv_bin_decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BIN_DECODER_H*/ diff --git a/inc/lvgl/src/libs/bmp/lv_bmp.c b/inc/lvgl/src/libs/bmp/lv_bmp.c new file mode 100644 index 0000000..aeb9dad --- /dev/null +++ b/inc/lvgl/src/libs/bmp/lv_bmp.c @@ -0,0 +1,253 @@ +/** + * @file lv_bmp.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_image_decoder_private.h" +#include "../../../lvgl.h" +#if LV_USE_BMP + +#include +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "BMP" + +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_fs_file_t f; + unsigned int px_offset; + int px_width; + int px_height; + unsigned int bpp; + int row_size_bytes; +} bmp_dsc_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area); + +static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_bmp_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_get_area_cb(dec, decoder_get_area); + lv_image_decoder_set_close_cb(dec, decoder_close); + + dec->name = DECODER_NAME; +} + +void lv_bmp_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a BMP image + * @param dsc image descriptor containing the source and type of the image and other info. + * @param header store the info here + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info + */ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + LV_UNUSED(decoder); + + const void * src = dsc->src; + lv_image_src_t src_type = dsc->src_type; /*Get the source type*/ + + /*If it's a BMP file...*/ + if(src_type == LV_IMAGE_SRC_FILE) { + const char * fn = src; + if(lv_strcmp(lv_fs_get_ext(fn), "bmp") == 0) { /*Check the extension*/ + /*Save the data in the header*/ + uint8_t headers[54]; + + lv_fs_read(&dsc->file, headers, 54, NULL); + uint32_t w; + uint32_t h; + lv_memcpy(&w, headers + 18, 4); + lv_memcpy(&h, headers + 22, 4); + header->w = w; + header->h = h; + + uint16_t bpp; + lv_memcpy(&bpp, headers + 28, 2); + switch(bpp) { + case 16: + header->cf = LV_COLOR_FORMAT_RGB565; + break; + case 24: + header->cf = LV_COLOR_FORMAT_RGB888; + break; + case 32: + header->cf = LV_COLOR_FORMAT_ARGB8888; + break; + default: + LV_LOG_WARN("Not supported bpp: %d", bpp); + return LV_RESULT_OK; + } + return LV_RESULT_OK; + } + } + /* BMP file as data not supported for simplicity. + * Convert them to LVGL compatible C arrays directly. */ + else if(src_type == LV_IMAGE_SRC_VARIABLE) { + return LV_RESULT_INVALID; + } + + return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ +} + +/** + * Open a BMP image and return the decided image + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + /*If it's a BMP file...*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + + if(lv_strcmp(lv_fs_get_ext(fn), "bmp") != 0) { + return LV_RESULT_INVALID; /*Check the extension*/ + } + + bmp_dsc_t b; + lv_memset(&b, 0x00, sizeof(b)); + + lv_fs_res_t res = lv_fs_open(&b.f, dsc->src, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return LV_RESULT_INVALID; + + uint8_t header[54]; + lv_fs_read(&b.f, header, 54, NULL); + + if(0x42 != header[0] || 0x4d != header[1]) { + lv_fs_close(&b.f); + return LV_RESULT_INVALID; + } + + lv_memcpy(&b.px_offset, header + 10, 4); + lv_memcpy(&b.px_width, header + 18, 4); + lv_memcpy(&b.px_height, header + 22, 4); + lv_memcpy(&b.bpp, header + 28, 2); + b.row_size_bytes = ((b.bpp * b.px_width + 31) / 32) * 4; + + dsc->user_data = lv_malloc(sizeof(bmp_dsc_t)); + LV_ASSERT_MALLOC(dsc->user_data); + if(dsc->user_data == NULL) return LV_RESULT_INVALID; + lv_memcpy(dsc->user_data, &b, sizeof(b)); + return LV_RESULT_OK; + } + /* BMP file as data not supported for simplicity. + * Convert them to LVGL compatible C arrays directly. */ + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + return LV_RESULT_INVALID; + } + + return LV_RESULT_INVALID; /*If not returned earlier then it failed*/ +} + +static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area) +{ + LV_UNUSED(decoder); + bmp_dsc_t * b = dsc->user_data; + lv_draw_buf_t * decoded = (void *)dsc->decoded; + + if(decoded_area->y1 == LV_COORD_MIN) { + *decoded_area = *full_area; + decoded_area->y2 = decoded_area->y1; + int32_t w_px = lv_area_get_width(full_area); + lv_draw_buf_t * reshaped = lv_draw_buf_reshape(decoded, dsc->header.cf, w_px, 1, LV_STRIDE_AUTO); + if(reshaped == NULL) { + if(decoded != NULL) { + lv_draw_buf_destroy(decoded); + decoded = NULL; + dsc->decoded = NULL; + } + decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, w_px, 1, dsc->header.cf, LV_STRIDE_AUTO); + if(decoded == NULL) return LV_RESULT_INVALID; + } + else { + decoded = reshaped; + } + dsc->decoded = decoded; + } + else { + decoded_area->y1++; + decoded_area->y2++; + } + + if(decoded_area->y1 > full_area->y2) { + return LV_RESULT_INVALID; + } + else { + int32_t y = (b->px_height - 1) - (decoded_area->y1); /*BMP images are stored upside down*/ + uint32_t p = b->px_offset + b->row_size_bytes * y; + p += (decoded_area->x1) * (b->bpp / 8); + lv_fs_seek(&b->f, p, LV_FS_SEEK_SET); + uint32_t line_width_byte = lv_area_get_width(full_area) * (b->bpp / 8); + lv_fs_read(&b->f, decoded->data, line_width_byte, NULL); + + return LV_RESULT_OK; + } +} + +/** + * Free the allocated resources + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + bmp_dsc_t * b = dsc->user_data; + lv_fs_close(&b->f); + lv_free(dsc->user_data); + if(dsc->decoded) lv_draw_buf_destroy((void *)dsc->decoded); + +} + +#endif /*LV_USE_BMP*/ diff --git a/inc/lvgl/src/libs/bmp/lv_bmp.h b/inc/lvgl/src/libs/bmp/lv_bmp.h new file mode 100644 index 0000000..a7dbe27 --- /dev/null +++ b/inc/lvgl/src/libs/bmp/lv_bmp.h @@ -0,0 +1,43 @@ +/** + * @file lv_bmp.h + * + */ + +#ifndef LV_BMP_H +#define LV_BMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_BMP + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_bmp_init(void); +void lv_bmp_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BMP*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_BMP_H*/ diff --git a/inc/lvgl/src/libs/ffmpeg/lv_ffmpeg.c b/inc/lvgl/src/libs/ffmpeg/lv_ffmpeg.c new file mode 100644 index 0000000..bd74fe0 --- /dev/null +++ b/inc/lvgl/src/libs/ffmpeg/lv_ffmpeg.c @@ -0,0 +1,1017 @@ +/** + * @file lv_ffmpeg.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ffmpeg_private.h" +#if LV_USE_FFMPEG != 0 +#include "../../draw/lv_image_decoder_private.h" +#include "../../draw/lv_draw_buf_private.h" +#include "../../core/lv_obj_class_private.h" + +#include +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "FFMPEG" + +#if LV_COLOR_DEPTH == 8 + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_RGB8 +#elif LV_COLOR_DEPTH == 16 + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_RGB565LE +#elif LV_COLOR_DEPTH == 32 + #define AV_PIX_FMT_TRUE_COLOR AV_PIX_FMT_BGR0 +#else + #error Unsupported LV_COLOR_DEPTH +#endif + +#define MY_CLASS (&lv_ffmpeg_player_class) + +#define FRAME_DEF_REFR_PERIOD 33 /*[ms]*/ + +#define DECODER_BUFFER_SIZE (8 * 1024) + +#define PLAYER_ALIGMENT 32 +#define DECODER_ALIGNMENT 4 + +/********************** + * TYPEDEFS + **********************/ +struct ffmpeg_context_s { + AVIOContext * io_ctx; + lv_fs_file_t lv_file; + AVFormatContext * fmt_ctx; + AVCodecContext * video_dec_ctx; + AVStream * video_stream; + uint8_t * video_dst_data[4]; + struct SwsContext * sws_ctx; + AVFrame * frame; + AVPacket * pkt; + int video_stream_idx; + int video_dst_linesize[4]; + enum AVPixelFormat video_dst_pix_fmt; + bool has_alpha; + lv_draw_buf_t draw_buf; + lv_draw_buf_handlers_t draw_buf_handlers; +}; + +#pragma pack(1) + +struct _lv_image_pixel_color_s { + lv_color_t c; + uint8_t alpha; +}; + +#pragma pack() + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc); + +static int ffmpeg_lvfs_read(void * ptr, uint8_t * buf, int buf_size); +static int64_t ffmpeg_lvfs_seek(void * ptr, int64_t pos, int whence); +static AVIOContext * ffmpeg_open_io_context(lv_fs_file_t * file); +static struct ffmpeg_context_s * ffmpeg_open_file(const char * path, bool is_lv_fs_path, const char * decoder_name); +static void ffmpeg_close(struct ffmpeg_context_s * ffmpeg_ctx); +static void ffmpeg_close_src_ctx(struct ffmpeg_context_s * ffmpeg_ctx); +static void ffmpeg_close_dst_ctx(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_image_allocate(struct ffmpeg_context_s * ffmpeg_ctx, int align); +static int ffmpeg_get_image_header(lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); +static int ffmpeg_get_frame_refr_period(struct ffmpeg_context_s * ffmpeg_ctx); +static uint8_t * ffmpeg_get_image_data(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_update_next_frame(struct ffmpeg_context_s * ffmpeg_ctx); +static int ffmpeg_output_video_frame(struct ffmpeg_context_s * ffmpeg_ctx); +static bool ffmpeg_pix_fmt_has_alpha(enum AVPixelFormat pix_fmt); +static bool ffmpeg_pix_fmt_is_yuv(enum AVPixelFormat pix_fmt); + +static void lv_ffmpeg_player_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_ffmpeg_player_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_ffmpeg_player_class = { + .constructor_cb = lv_ffmpeg_player_constructor, + .destructor_cb = lv_ffmpeg_player_destructor, + .instance_size = sizeof(lv_ffmpeg_player_t), + .base_class = &lv_image_class, + .name = "lv_ffmpeg_player", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_ffmpeg_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_close_cb(dec, decoder_close); + + dec->name = DECODER_NAME; + +#if LV_FFMPEG_DUMP_FORMAT == 0 + av_log_set_level(AV_LOG_QUIET); +#endif +} + +void lv_ffmpeg_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +int lv_ffmpeg_get_frame_num(const char * path) +{ + int ret = -1; + struct ffmpeg_context_s * ffmpeg_ctx = ffmpeg_open_file(path, LV_FFMPEG_PLAYER_USE_LV_FS, NULL); + + if(ffmpeg_ctx) { + ret = ffmpeg_ctx->video_stream->nb_frames; + ffmpeg_close(ffmpeg_ctx); + } + + return ret; +} + +lv_obj_t * lv_ffmpeg_player_create(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_result_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_result_t res = LV_RESULT_INVALID; + + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(player->ffmpeg_ctx) { + ffmpeg_close(player->ffmpeg_ctx); + player->ffmpeg_ctx = NULL; + } + + lv_timer_pause(player->timer); + + player->ffmpeg_ctx = ffmpeg_open_file(path, LV_FFMPEG_PLAYER_USE_LV_FS, player->decoder_name); + + if(!player->ffmpeg_ctx) { + goto failed; + } + + if(ffmpeg_image_allocate(player->ffmpeg_ctx, PLAYER_ALIGMENT) < 0) { + LV_LOG_ERROR("ffmpeg image allocate failed"); + ffmpeg_close(player->ffmpeg_ctx); + player->ffmpeg_ctx = NULL; + goto failed; + } + + bool has_alpha = player->ffmpeg_ctx->has_alpha; + int width = player->ffmpeg_ctx->video_dec_ctx->width; + int height = player->ffmpeg_ctx->video_dec_ctx->height; + + uint8_t * data = ffmpeg_get_image_data(player->ffmpeg_ctx); + lv_color_format_t cf = has_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE; + uint32_t stride = width * lv_color_format_get_size(cf); + uint32_t data_size = stride * height; + lv_memzero(data, data_size); + + player->imgdsc.header.w = width; + player->imgdsc.header.h = height; + player->imgdsc.data_size = data_size; + player->imgdsc.header.cf = cf; + player->imgdsc.header.stride = stride; + player->imgdsc.header.flags = LV_IMAGE_FLAGS_MODIFIABLE; + player->imgdsc.data = data; + + lv_image_set_src(&player->img.obj, &(player->imgdsc)); + + int period = ffmpeg_get_frame_refr_period(player->ffmpeg_ctx); + + if(period > 0) { + LV_LOG_INFO("frame refresh period = %d ms, rate = %d fps", + period, 1000 / period); + lv_timer_set_period(player->timer, period); + } + else { + LV_LOG_WARN("unable to get frame refresh period"); + } + + res = LV_RESULT_OK; + +failed: + return res; +} + +void lv_ffmpeg_player_set_cmd(lv_obj_t * obj, lv_ffmpeg_player_cmd_t cmd) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(!player->ffmpeg_ctx) { + LV_LOG_ERROR("ffmpeg_ctx is NULL"); + return; + } + + lv_timer_t * timer = player->timer; + + switch(cmd) { + case LV_FFMPEG_PLAYER_CMD_START: + av_seek_frame(player->ffmpeg_ctx->fmt_ctx, + 0, 0, AVSEEK_FLAG_BACKWARD); + lv_timer_resume(timer); + LV_LOG_INFO("ffmpeg player start"); + break; + case LV_FFMPEG_PLAYER_CMD_STOP: + av_seek_frame(player->ffmpeg_ctx->fmt_ctx, + 0, 0, AVSEEK_FLAG_BACKWARD); + lv_timer_pause(timer); + LV_LOG_INFO("ffmpeg player stop"); + break; + case LV_FFMPEG_PLAYER_CMD_PAUSE: + lv_timer_pause(timer); + LV_LOG_INFO("ffmpeg player pause"); + break; + case LV_FFMPEG_PLAYER_CMD_RESUME: + lv_timer_resume(timer); + LV_LOG_INFO("ffmpeg player resume"); + break; + default: + LV_LOG_ERROR("Error cmd: %d", cmd); + break; + } +} + +void lv_ffmpeg_player_set_auto_restart(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + player->auto_restart = en; +} + +void lv_ffmpeg_player_set_decoder(lv_obj_t * obj, const char * name) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + if(player->decoder_name) { + lv_free((void *)player->decoder_name); + } + player->decoder_name = name ? lv_strdup(name) : NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + LV_UNUSED(decoder); + + /* Get the source type */ + lv_image_src_t src_type = dsc->src_type; + + if(src_type == LV_IMAGE_SRC_FILE) { + if(ffmpeg_get_image_header(dsc, header) < 0) { + LV_LOG_ERROR("ffmpeg can't get image header"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; + } + + /* If didn't succeeded earlier then it's an error */ + return LV_RESULT_INVALID; +} + +/** + * Decode an image using ffmpeg library + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * path = dsc->src; + + struct ffmpeg_context_s * ffmpeg_ctx = ffmpeg_open_file(path, true, NULL); + + if(ffmpeg_ctx == NULL) { + return LV_RESULT_INVALID; + } + + if(ffmpeg_image_allocate(ffmpeg_ctx, DECODER_ALIGNMENT) < 0) { + LV_LOG_ERROR("ffmpeg image allocate failed"); + ffmpeg_close(ffmpeg_ctx); + return LV_RESULT_INVALID; + } + + if(ffmpeg_update_next_frame(ffmpeg_ctx) < 0) { + ffmpeg_close(ffmpeg_ctx); + LV_LOG_ERROR("ffmpeg update frame failed"); + return LV_RESULT_INVALID; + } + + ffmpeg_close_src_ctx(ffmpeg_ctx); + uint8_t * img_data = ffmpeg_get_image_data(ffmpeg_ctx); + + dsc->user_data = ffmpeg_ctx; + lv_draw_buf_t * decoded = &ffmpeg_ctx->draw_buf; + lv_draw_buf_init( + decoded, + dsc->header.w, + dsc->header.h, + dsc->header.cf, + dsc->header.stride, + img_data, + dsc->header.stride * dsc->header.h); + lv_draw_buf_set_flag(decoded, LV_IMAGE_FLAGS_MODIFIABLE); + + /* Empty handlers to avoid decoder asserts */ + lv_draw_buf_handlers_init(&ffmpeg_ctx->draw_buf_handlers, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + decoded->handlers = &ffmpeg_ctx->draw_buf_handlers; + + if(dsc->args.premultiply && ffmpeg_ctx->has_alpha) { + lv_draw_buf_premultiply(decoded); + } + + dsc->decoded = decoded; + + /* The image is fully decoded. Return with its pointer */ + return LV_RESULT_OK; + } + + /* If not returned earlier then it failed */ + return LV_RESULT_INVALID; +} + +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + struct ffmpeg_context_s * ffmpeg_ctx = dsc->user_data; + ffmpeg_close(ffmpeg_ctx); +} + +static uint8_t * ffmpeg_get_image_data(struct ffmpeg_context_s * ffmpeg_ctx) +{ + uint8_t * img_data = ffmpeg_ctx->video_dst_data[0]; + + if(img_data == NULL) { + LV_LOG_ERROR("ffmpeg video dst data is NULL"); + } + + return img_data; +} + +static bool ffmpeg_pix_fmt_has_alpha(enum AVPixelFormat pix_fmt) +{ + const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get(pix_fmt); + + if(desc == NULL) { + return false; + } + + if(pix_fmt == AV_PIX_FMT_PAL8) { + return true; + } + + return desc->flags & AV_PIX_FMT_FLAG_ALPHA; +} + +static bool ffmpeg_pix_fmt_is_yuv(enum AVPixelFormat pix_fmt) +{ + const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get(pix_fmt); + + if(desc == NULL) { + return false; + } + + return !(desc->flags & AV_PIX_FMT_FLAG_RGB) && desc->nb_components >= 2; +} + +static int ffmpeg_output_video_frame(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret = -1; + + int width = ffmpeg_ctx->video_dec_ctx->width; + int height = ffmpeg_ctx->video_dec_ctx->height; + AVFrame * frame = ffmpeg_ctx->frame; + + if(frame->width != width + || frame->height != height + || frame->format != ffmpeg_ctx->video_dec_ctx->pix_fmt) { + + /* To handle this change, one could call av_image_alloc again and + * decode the following frames into another rawvideo file. + */ + LV_LOG_ERROR("Width, height and pixel format have to be " + "constant in a rawvideo file, but the width, height or " + "pixel format of the input video changed:\n" + "old: width = %d, height = %d, format = %s\n" + "new: width = %d, height = %d, format = %s\n", + width, + height, + av_get_pix_fmt_name(ffmpeg_ctx->video_dec_ctx->pix_fmt), + frame->width, frame->height, + av_get_pix_fmt_name(frame->format)); + goto failed; + } + + if(ffmpeg_ctx->sws_ctx == NULL) { + int swsFlags = SWS_BILINEAR; + + if(ffmpeg_pix_fmt_is_yuv(ffmpeg_ctx->video_dec_ctx->pix_fmt)) { + + /* When the video width and height are not multiples of 8, + * and there is no size change in the conversion, + * a blurry screen will appear on the right side + * This problem was discovered in 2012 and + * continues to exist in version 4.1.3 in 2019 + * This problem can be avoided by increasing SWS_ACCURATE_RND + */ + if((width & 0x7) || (height & 0x7)) { + LV_LOG_WARN("The width(%d) and height(%d) the image " + "is not a multiple of 8, " + "the decoding speed may be reduced", + width, height); + swsFlags |= SWS_ACCURATE_RND; + } + } + + ffmpeg_ctx->sws_ctx = sws_getContext( + width, height, ffmpeg_ctx->video_dec_ctx->pix_fmt, + width, height, ffmpeg_ctx->video_dst_pix_fmt, + swsFlags, + NULL, NULL, NULL); + } + + if(!ffmpeg_ctx->has_alpha) { + int lv_linesize = lv_color_format_get_size(LV_COLOR_FORMAT_NATIVE) * width; + int dst_linesize = ffmpeg_ctx->video_dst_linesize[0]; + if(dst_linesize != lv_linesize) { + LV_LOG_WARN("ffmpeg linesize = %d, but lvgl image require %d", + dst_linesize, + lv_linesize); + ffmpeg_ctx->video_dst_linesize[0] = lv_linesize; + } + } + + ret = sws_scale( + ffmpeg_ctx->sws_ctx, + (const uint8_t * const *)(frame->data), + frame->linesize, + 0, + height, + ffmpeg_ctx->video_dst_data, + ffmpeg_ctx->video_dst_linesize); + +failed: + return ret; +} + +static int ffmpeg_decode_packet(AVCodecContext * dec, const AVPacket * pkt, + struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret = 0; + + /* submit the packet to the decoder */ + ret = avcodec_send_packet(dec, pkt); + if(ret < 0) { + LV_LOG_ERROR("Error submitting a packet for decoding (%s)", + av_err2str(ret)); + return ret; + } + + /* get all the available frames from the decoder */ + while(ret >= 0) { + ret = avcodec_receive_frame(dec, ffmpeg_ctx->frame); + if(ret < 0) { + + /* those two return values are special and mean there is + * no output frame available, + * but there were no errors during decoding + */ + if(ret == AVERROR_EOF || ret == AVERROR(EAGAIN)) { + return 0; + } + + LV_LOG_ERROR("Error during decoding (%s)", av_err2str(ret)); + return ret; + } + + /* write the frame data to output file */ + if(dec->codec->type == AVMEDIA_TYPE_VIDEO) { + ret = ffmpeg_output_video_frame(ffmpeg_ctx); + } + + av_frame_unref(ffmpeg_ctx->frame); + if(ret < 0) { + LV_LOG_WARN("ffmpeg_decode_packet ended %d", ret); + return ret; + } + } + + return 0; +} + +static int ffmpeg_init_codec_context(AVCodecContext ** dec_ctx, const AVCodec * dec, + enum AVMediaType type, AVStream * st) +{ + int ret = 0; + + /* Allocate a codec context for the decoder */ + *dec_ctx = avcodec_alloc_context3(dec); + if(*dec_ctx == NULL) { + return AVERROR(ENOMEM); + } + + /* Copy codec parameters from input stream to output codec context */ + if((ret = avcodec_parameters_to_context(*dec_ctx, st->codecpar)) < 0) { + LV_LOG_ERROR("Failed to allocate the %s codec context", + av_get_media_type_string(type)); + goto free_dec_ctx; + } + + /* Init the decoders */ + if((ret = avcodec_open2(*dec_ctx, dec, NULL)) < 0) { + LV_LOG_ERROR( + "Failed to copy %s codec parameters to decoder context", + av_get_media_type_string(type)); + goto free_dec_ctx; + } + + return 0; + +free_dec_ctx: + avcodec_free_context(dec_ctx); + *dec_ctx = NULL; + return ret; +} + +static int ffmpeg_open_codec_context(int * stream_idx, + AVCodecContext ** dec_ctx, AVFormatContext * fmt_ctx, + enum AVMediaType type, const char * decoder_name) +{ + int ret; + int stream_index; + AVStream * st; + const AVCodec * dec = NULL; + + ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0); + if(ret < 0) { + LV_LOG_ERROR("Could not find %s stream in input file", + av_get_media_type_string(type)); + return ret; + } + else { + stream_index = ret; + st = fmt_ctx->streams[stream_index]; + + /* find decoder for the stream */ + if(decoder_name) { + dec = avcodec_find_decoder_by_name(decoder_name); + if(dec) { + ret = ffmpeg_init_codec_context(dec_ctx, dec, type, st); + if(ret < 0) { + dec = NULL; + } + } + } + if(dec == NULL) { + dec = avcodec_find_decoder(st->codecpar->codec_id); + if(dec == NULL) { + LV_LOG_ERROR("Failed to find %s codec", + av_get_media_type_string(type)); + return AVERROR(EINVAL); + } + + ret = ffmpeg_init_codec_context(dec_ctx, dec, type, st); + if(ret < 0) { + LV_LOG_ERROR("Failed to initialize %s codec context", + av_get_media_type_string(type)); + return ret; + } + } + + *stream_idx = stream_index; + } + + return 0; +} + +static int ffmpeg_get_image_header(lv_image_decoder_dsc_t * dsc, + lv_image_header_t * header) +{ + int ret = -1; + + AVFormatContext * fmt_ctx = NULL; + AVCodecContext * video_dec_ctx = NULL; + AVIOContext * io_ctx = NULL; + int video_stream_idx; + + io_ctx = ffmpeg_open_io_context(&dsc->file); + if(io_ctx == NULL) { + LV_LOG_ERROR("io_ctx malloc failed"); + return ret; + } + + fmt_ctx = avformat_alloc_context(); + if(fmt_ctx == NULL) { + LV_LOG_ERROR("fmt_ctx malloc failed"); + goto failed; + } + fmt_ctx->pb = io_ctx; + fmt_ctx->flags |= AVFMT_FLAG_CUSTOM_IO; + + /* open input file, and allocate format context */ + if(avformat_open_input(&fmt_ctx, (const char *)dsc->src, NULL, NULL) < 0) { + LV_LOG_ERROR("Could not open source file %s", (const char *)dsc->src); + goto failed; + } + + /* retrieve stream information */ + if(avformat_find_stream_info(fmt_ctx, NULL) < 0) { + LV_LOG_ERROR("Could not find stream information"); + goto failed; + } + + if(ffmpeg_open_codec_context(&video_stream_idx, &video_dec_ctx, + fmt_ctx, AVMEDIA_TYPE_VIDEO, NULL) + >= 0) { + bool has_alpha = ffmpeg_pix_fmt_has_alpha(video_dec_ctx->pix_fmt); + + /* allocate image where the decoded image will be put */ + header->w = video_dec_ctx->width; + header->h = video_dec_ctx->height; + header->cf = has_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE; + header->stride = header->w * lv_color_format_get_size(header->cf); + header->flags = LV_IMAGE_FLAGS_MODIFIABLE; + + ret = 0; + } + +failed: + avcodec_free_context(&video_dec_ctx); + avformat_close_input(&fmt_ctx); + if(io_ctx != NULL) { + av_free(io_ctx->buffer); + av_free(io_ctx); + } + return ret; +} + +static int ffmpeg_get_frame_refr_period(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int avg_frame_rate_num = ffmpeg_ctx->video_stream->avg_frame_rate.num; + if(avg_frame_rate_num > 0) { + int period = 1000 * (int64_t)ffmpeg_ctx->video_stream->avg_frame_rate.den + / avg_frame_rate_num; + return period; + } + + return -1; +} + +static int ffmpeg_update_next_frame(struct ffmpeg_context_s * ffmpeg_ctx) +{ + int ret = 0; + + while(1) { + + /* read frames from the file */ + if(av_read_frame(ffmpeg_ctx->fmt_ctx, ffmpeg_ctx->pkt) >= 0) { + bool is_image = false; + + /* check if the packet belongs to a stream we are interested in, + * otherwise skip it + */ + if(ffmpeg_ctx->pkt->stream_index == ffmpeg_ctx->video_stream_idx) { + ret = ffmpeg_decode_packet(ffmpeg_ctx->video_dec_ctx, + ffmpeg_ctx->pkt, ffmpeg_ctx); + is_image = true; + } + + av_packet_unref(ffmpeg_ctx->pkt); + + if(ret < 0) { + LV_LOG_WARN("video frame is empty %d", ret); + break; + } + + /* Used to filter data that is not an image */ + if(is_image) { + break; + } + } + else { + ret = -1; + break; + } + } + + return ret; +} + +static int ffmpeg_lvfs_read(void * ptr, uint8_t * buf, int buf_size) +{ + lv_fs_file_t * file = ptr; + uint32_t bytesRead = 0; + lv_fs_res_t res = lv_fs_read(file, buf, buf_size, &bytesRead); + if(bytesRead == 0) + return AVERROR_EOF; /* Let FFmpeg know that we have reached eof */ + if(res != LV_FS_RES_OK) + return AVERROR_EOF; + return bytesRead; +} + +static int64_t ffmpeg_lvfs_seek(void * ptr, int64_t pos, int whence) +{ + lv_fs_file_t * file = ptr; + if(whence == SEEK_SET && lv_fs_seek(file, pos, SEEK_SET) == LV_FS_RES_OK) { + return pos; + } + return -1; +} + +static AVIOContext * ffmpeg_open_io_context(lv_fs_file_t * file) +{ + uint8_t * iBuffer = av_malloc(DECODER_BUFFER_SIZE); + if(iBuffer == NULL) { + LV_LOG_ERROR("iBuffer malloc failed"); + return NULL; + } + AVIOContext * pIOCtx = avio_alloc_context(iBuffer, DECODER_BUFFER_SIZE, /* internal Buffer and its size */ + 0, /* bWriteable (1=true,0=false) */ + file, /* user data ; will be passed to our callback functions */ + ffmpeg_lvfs_read, /* Read callback function */ + 0, /* Write callback function */ + ffmpeg_lvfs_seek); /* Seek callback function */ + if(pIOCtx == NULL) { + av_free(iBuffer); + return NULL; + } + return pIOCtx; +} + +static struct ffmpeg_context_s * ffmpeg_open_file(const char * path, bool is_lv_fs_path, const char * decoder_name) +{ + if(path == NULL || lv_strlen(path) == 0) { + LV_LOG_ERROR("file path is empty"); + return NULL; + } + + struct ffmpeg_context_s * ffmpeg_ctx = lv_malloc_zeroed(sizeof(struct ffmpeg_context_s)); + LV_ASSERT_MALLOC(ffmpeg_ctx); + if(ffmpeg_ctx == NULL) { + LV_LOG_ERROR("ffmpeg_ctx malloc failed"); + goto failed; + } + + if(is_lv_fs_path) { + const lv_fs_res_t fs_res = lv_fs_open(&(ffmpeg_ctx->lv_file), path, LV_FS_MODE_RD); + if(fs_res != LV_FS_RES_OK) { + LV_LOG_WARN("Could not open file: %s, res: %d", path, fs_res); + lv_free(ffmpeg_ctx); + return NULL; + } + + ffmpeg_ctx->io_ctx = ffmpeg_open_io_context(&(ffmpeg_ctx->lv_file)); /* Save the buffer pointer to free it later */ + + if(ffmpeg_ctx->io_ctx == NULL) { + LV_LOG_ERROR("io_ctx malloc failed"); + goto failed; + } + + ffmpeg_ctx->fmt_ctx = avformat_alloc_context(); + if(ffmpeg_ctx->fmt_ctx == NULL) { + LV_LOG_ERROR("fmt_ctx malloc failed"); + goto failed; + } + ffmpeg_ctx->fmt_ctx->pb = ffmpeg_ctx->io_ctx; + ffmpeg_ctx->fmt_ctx->flags |= AVFMT_FLAG_CUSTOM_IO; + } + + /* open input file, and allocate format context */ + + if(avformat_open_input(&(ffmpeg_ctx->fmt_ctx), path, NULL, NULL) < 0) { + LV_LOG_ERROR("Could not open source file %s", path); + goto failed; + } + + /* retrieve stream information */ + + if(avformat_find_stream_info(ffmpeg_ctx->fmt_ctx, NULL) < 0) { + LV_LOG_ERROR("Could not find stream information"); + goto failed; + } + + if(ffmpeg_open_codec_context( + &(ffmpeg_ctx->video_stream_idx), + &(ffmpeg_ctx->video_dec_ctx), + ffmpeg_ctx->fmt_ctx, AVMEDIA_TYPE_VIDEO, decoder_name) + >= 0) { + ffmpeg_ctx->video_stream = ffmpeg_ctx->fmt_ctx->streams[ffmpeg_ctx->video_stream_idx]; + + ffmpeg_ctx->has_alpha = ffmpeg_pix_fmt_has_alpha(ffmpeg_ctx->video_dec_ctx->pix_fmt); + + ffmpeg_ctx->video_dst_pix_fmt = (ffmpeg_ctx->has_alpha ? AV_PIX_FMT_BGRA : AV_PIX_FMT_TRUE_COLOR); + } + +#if LV_FFMPEG_DUMP_FORMAT + /* dump input information to stderr */ + av_dump_format(ffmpeg_ctx->fmt_ctx, 0, path, 0); +#endif + + if(ffmpeg_ctx->video_stream == NULL) { + LV_LOG_ERROR("Could not find video stream in the input, aborting"); + goto failed; + } + + return ffmpeg_ctx; + +failed: + ffmpeg_close(ffmpeg_ctx); + return NULL; +} + +static int ffmpeg_image_allocate(struct ffmpeg_context_s * ffmpeg_ctx, int align) +{ + int ret; + + /* Allocate video_dst_data as a separate buffer for the destination image. + * This is necessary because the destination may require a different pixel format + * or layout than the source (decoded) frame, so we cannot always use the source + * frame's data directly. Unlike video_src_data, which is no longer allocated, + * video_dst_data is still needed for format conversion or copying. */ + ret = av_image_alloc( + ffmpeg_ctx->video_dst_data, + ffmpeg_ctx->video_dst_linesize, + ffmpeg_ctx->video_dec_ctx->width, + ffmpeg_ctx->video_dec_ctx->height, + ffmpeg_ctx->video_dst_pix_fmt, + align); + + if(ret < 0) { + LV_LOG_ERROR("Could not allocate dst raw video buffer"); + return ret; + } + + LV_LOG_INFO("allocate video_dst_bufsize = %d", ret); + + ffmpeg_ctx->frame = av_frame_alloc(); + + if(ffmpeg_ctx->frame == NULL) { + LV_LOG_ERROR("Could not allocate frame"); + return -1; + } + + /* allocate packet, set data to NULL, let the demuxer fill it */ + + ffmpeg_ctx->pkt = av_packet_alloc(); + if(ffmpeg_ctx->pkt == NULL) { + LV_LOG_ERROR("av_packet_alloc failed"); + return -1; + } + ffmpeg_ctx->pkt->data = NULL; + ffmpeg_ctx->pkt->size = 0; + + return 0; +} + +static void ffmpeg_close_src_ctx(struct ffmpeg_context_s * ffmpeg_ctx) +{ + avcodec_free_context(&(ffmpeg_ctx->video_dec_ctx)); + avformat_close_input(&(ffmpeg_ctx->fmt_ctx)); + av_packet_free(&ffmpeg_ctx->pkt); + av_frame_free(&(ffmpeg_ctx->frame)); +} + +static void ffmpeg_close_dst_ctx(struct ffmpeg_context_s * ffmpeg_ctx) +{ + if(ffmpeg_ctx->video_dst_data[0] != NULL) { + av_free(ffmpeg_ctx->video_dst_data[0]); + ffmpeg_ctx->video_dst_data[0] = NULL; + } +} + +static void ffmpeg_close(struct ffmpeg_context_s * ffmpeg_ctx) +{ + if(ffmpeg_ctx == NULL) { + LV_LOG_WARN("ffmpeg_ctx is NULL"); + return; + } + + sws_freeContext(ffmpeg_ctx->sws_ctx); + ffmpeg_close_src_ctx(ffmpeg_ctx); + ffmpeg_close_dst_ctx(ffmpeg_ctx); + if(ffmpeg_ctx->io_ctx != NULL) { + av_free(ffmpeg_ctx->io_ctx->buffer); + av_free(ffmpeg_ctx->io_ctx); + lv_fs_close(&(ffmpeg_ctx->lv_file)); + } + lv_free(ffmpeg_ctx); + + LV_LOG_INFO("ffmpeg_ctx closed"); +} + +static void lv_ffmpeg_player_frame_update_cb(lv_timer_t * timer) +{ + lv_obj_t * obj = (lv_obj_t *)lv_timer_get_user_data(timer); + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(!player->ffmpeg_ctx) { + return; + } + + int has_next = ffmpeg_update_next_frame(player->ffmpeg_ctx); + + if(has_next < 0) { + lv_ffmpeg_player_set_cmd(obj, player->auto_restart ? LV_FFMPEG_PLAYER_CMD_START : LV_FFMPEG_PLAYER_CMD_STOP); + if(!player->auto_restart) { + lv_obj_send_event((lv_obj_t *)player, LV_EVENT_READY, NULL); + } + return; + } + + lv_image_cache_drop(lv_image_get_src(obj)); + + lv_obj_invalidate(obj); +} + +static void lv_ffmpeg_player_constructor(const lv_obj_class_t * class_p, + lv_obj_t * obj) +{ + + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + player->auto_restart = false; + player->ffmpeg_ctx = NULL; + player->timer = lv_timer_create(lv_ffmpeg_player_frame_update_cb, + FRAME_DEF_REFR_PERIOD, obj); + lv_timer_pause(player->timer); + + player->decoder_name = NULL; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_ffmpeg_player_destructor(const lv_obj_class_t * class_p, + lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + LV_TRACE_OBJ_CREATE("begin"); + + lv_ffmpeg_player_t * player = (lv_ffmpeg_player_t *)obj; + + if(player->timer) { + lv_timer_delete(player->timer); + player->timer = NULL; + } + + lv_image_cache_drop(lv_image_get_src(obj)); + + ffmpeg_close(player->ffmpeg_ctx); + player->ffmpeg_ctx = NULL; + + if(player->decoder_name) { + lv_free((void *)player->decoder_name); + player->decoder_name = NULL; + } + + LV_TRACE_OBJ_CREATE("finished"); +} + +#endif /*LV_USE_FFMPEG*/ diff --git a/inc/lvgl/src/libs/ffmpeg/lv_ffmpeg.h b/inc/lvgl/src/libs/ffmpeg/lv_ffmpeg.h new file mode 100644 index 0000000..edd384d --- /dev/null +++ b/inc/lvgl/src/libs/ffmpeg/lv_ffmpeg.h @@ -0,0 +1,108 @@ +/** + * @file lv_ffmpeg.h + * + */ +#ifndef LV_FFMPEG_H +#define LV_FFMPEG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_FFMPEG != 0 +#include "../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +struct ffmpeg_context_s; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_ffmpeg_player_class; + +typedef enum { + LV_FFMPEG_PLAYER_CMD_START, + LV_FFMPEG_PLAYER_CMD_STOP, + LV_FFMPEG_PLAYER_CMD_PAUSE, + LV_FFMPEG_PLAYER_CMD_RESUME, + LV_FFMPEG_PLAYER_CMD_LAST +} lv_ffmpeg_player_cmd_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register FFMPEG image decoder + */ +void lv_ffmpeg_init(void); + +/** + * De-initialize FFMPEG image decoder + */ +void lv_ffmpeg_deinit(void); + +/** + * Get the number of frames contained in the file + * @param path image or video file name + * @return Number of frames, less than 0 means failed + */ +int lv_ffmpeg_get_frame_num(const char * path); + +/** + * Create ffmpeg_player object + * @param parent pointer to an object, it will be the parent of the new player + * @return pointer to the created ffmpeg_player + */ +lv_obj_t * lv_ffmpeg_player_create(lv_obj_t * parent); + +/** + * Set the path of the file to be played. + * @param obj pointer to a ffmpeg_player object + * @param path video file path + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info. + */ +lv_result_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path); + +/** + * Set command control video player + * @param obj pointer to a ffmpeg_player object + * @param cmd control commands + */ +void lv_ffmpeg_player_set_cmd(lv_obj_t * obj, lv_ffmpeg_player_cmd_t cmd); + +/** + * Set the video to automatically replay + * @param obj pointer to a ffmpeg_player object + * @param en true: enable the auto restart + */ +void lv_ffmpeg_player_set_auto_restart(lv_obj_t * obj, bool en); + +/** + * Set the video decoder + * @param obj pointer to a ffmpeg_player object + * @param decoder_name decoder name + */ +void lv_ffmpeg_player_set_decoder(lv_obj_t * obj, const char * decoder_name); +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FFMPEG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FFMPEG_H*/ diff --git a/inc/lvgl/src/libs/ffmpeg/lv_ffmpeg_private.h b/inc/lvgl/src/libs/ffmpeg/lv_ffmpeg_private.h new file mode 100644 index 0000000..6f381a3 --- /dev/null +++ b/inc/lvgl/src/libs/ffmpeg/lv_ffmpeg_private.h @@ -0,0 +1,52 @@ +/** + * @file lv_ffmpeg_private.h + * + */ + +#ifndef LV_FFMPEG_PRIVATE_H +#define LV_FFMPEG_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_ffmpeg.h" +#if LV_USE_FFMPEG != 0 +#include "../../widgets/image/lv_image_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_ffmpeg_player_t { + lv_image_t img; + lv_timer_t * timer; + lv_image_dsc_t imgdsc; + bool auto_restart; + struct ffmpeg_context_s * ffmpeg_ctx; + const char * decoder_name; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FFMPEG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FFMPEG_PRIVATE_H*/ diff --git a/inc/lvgl/src/libs/freetype/LiberationSans-LICENSE.txt b/inc/lvgl/src/libs/freetype/LiberationSans-LICENSE.txt new file mode 100644 index 0000000..aba73e8 --- /dev/null +++ b/inc/lvgl/src/libs/freetype/LiberationSans-LICENSE.txt @@ -0,0 +1,102 @@ +Digitized data copyright (c) 2010 Google Corporation + with Reserved Font Arimo, Tinos and Cousine. +Copyright (c) 2012 Red Hat, Inc. + with Reserved Font Name Liberation. + +This Font Software is licensed under the SIL Open Font License, +Version 1.1. + +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 + +PREAMBLE The goals of the Open Font License (OFL) are to stimulate +worldwide development of collaborative font projects, to support the font +creation efforts of academic and linguistic communities, and to provide +a free and open framework in which fonts may be shared and improved in +partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. +The fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply to +any document created using the fonts or their derivatives. + + + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. +This may include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components +as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting ? in part or in whole ? +any of the components of the Original Version, by changing formats or +by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer +or other person who contributed to the Font Software. + + +PERMISSION & CONDITIONS + +Permission is hereby granted, free of charge, to any person obtaining a +copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components,in + Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the + corresponding Copyright Holder. This restriction only applies to the + primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + +5) The Font Software, modified or unmodified, in part or in whole, must + be distributed entirely under this license, and must not be distributed + under any other license. The requirement for fonts to remain under + this license does not apply to any document created using the Font + Software. + + + +TERMINATION +This license becomes null and void if any of the above conditions are not met. + + + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +DEALINGS IN THE FONT SOFTWARE. + diff --git a/inc/lvgl/src/libs/freetype/LiberationSans-Regular.ttf b/inc/lvgl/src/libs/freetype/LiberationSans-Regular.ttf new file mode 100644 index 0000000..8a67859 Binary files /dev/null and b/inc/lvgl/src/libs/freetype/LiberationSans-Regular.ttf differ diff --git a/inc/lvgl/src/libs/freetype/freetype-LICENSE.txt b/inc/lvgl/src/libs/freetype/freetype-LICENSE.txt new file mode 100644 index 0000000..b4e23f8 --- /dev/null +++ b/inc/lvgl/src/libs/freetype/freetype-LICENSE.txt @@ -0,0 +1,170 @@ + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + https://www.freetype.org + + +--- end of FTL.TXT --- + diff --git a/inc/lvgl/src/libs/freetype/ftmodule.h b/inc/lvgl/src/libs/freetype/ftmodule.h new file mode 100644 index 0000000..b804b6e --- /dev/null +++ b/inc/lvgl/src/libs/freetype/ftmodule.h @@ -0,0 +1,33 @@ +/* + * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `/objs/`) based on information + * from `/modules.cfg`. + * + * Please read `docs/INSTALL.ANY` and `docs/CUSTOMIZE` how to compile + * FreeType without GNU make. + * + */ + +/* FT_USE_MODULE( FT_Module_Class, autofit_module_class ) */ +FT_USE_MODULE(FT_Driver_ClassRec, tt_driver_class) +/* FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) */ +/* FT_USE_MODULE( FT_Module_Class, psaux_module_class ) */ +/* FT_USE_MODULE( FT_Module_Class, psnames_module_class ) */ +/* FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) */ +FT_USE_MODULE(FT_Module_Class, sfnt_module_class) +FT_USE_MODULE(FT_Renderer_Class, ft_smooth_renderer_class) +/* FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_sdf_renderer_class ) */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_bitmap_sdf_renderer_class ) */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_svg_renderer_class ) */ + +/* EOF */ diff --git a/inc/lvgl/src/libs/freetype/ftoption.h b/inc/lvgl/src/libs/freetype/ftoption.h new file mode 100644 index 0000000..1a762bb --- /dev/null +++ b/inc/lvgl/src/libs/freetype/ftoption.h @@ -0,0 +1,964 @@ +/**************************************************************************** + * + * ftoption.h + * + * User-selectable configuration macros (specification only). + * + * Copyright (C) 1996-2022 by + * David Turner, Robert Wilhelm, and Werner Lemberg. + * + * This file is part of the FreeType project, and may only be used, + * modified, and distributed under the terms of the FreeType project + * license, LICENSE.TXT. By continuing to use, modify, or distribute + * this file you indicate that you have read the license and + * understand and accept it fully. + * + */ + +#ifndef FTOPTION_H_ +#define FTOPTION_H_ + +#include + +FT_BEGIN_HEADER + +/************************************************************************** + * + * USER-SELECTABLE CONFIGURATION MACROS + * + * This file contains the default configuration macro definitions for a + * standard build of the FreeType library. There are three ways to use + * this file to build project-specific versions of the library: + * + * - You can modify this file by hand, but this is not recommended in + * cases where you would like to build several versions of the library + * from a single source directory. + * + * - You can put a copy of this file in your build directory, more + * precisely in `$BUILD/freetype/config/ftoption.h`, where `$BUILD` is + * the name of a directory that is included _before_ the FreeType include + * path during compilation. + * + * The default FreeType Makefiles use the build directory + * `builds/` by default, but you can easily change that for your + * own projects. + * + * - Copy the file to `$BUILD/ft2build.h` and modify it + * slightly to pre-define the macro `FT_CONFIG_OPTIONS_H` used to locate + * this file during the build. For example, + * + * ``` + * #define FT_CONFIG_OPTIONS_H + * #include + * ``` + * + * will use `$BUILD/myftoptions.h` instead of this file for macro + * definitions. + * + * Note also that you can similarly pre-define the macro + * `FT_CONFIG_MODULES_H` used to locate the file listing of the modules + * that are statically linked to the library at compile time. By + * default, this file is ``. + * + * We highly recommend using the third method whenever possible. + * + */ + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/*#************************************************************************ + * + * If you enable this configuration option, FreeType recognizes an + * environment variable called `FREETYPE_PROPERTIES`, which can be used to + * control the various font drivers and modules. The controllable + * properties are listed in the section @properties. + * + * You have to undefine this configuration option on platforms that lack + * the concept of environment variables (and thus don't have the `getenv` + * function), for example Windows CE. + * + * `FREETYPE_PROPERTIES` has the following syntax form (broken here into + * multiple lines for better readability). + * + * ``` + * + * ':' + * '=' + * + * ':' + * '=' + * ... + * ``` + * + * Example: + * + * ``` + * FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ + * cff:no-stem-darkening=1 + * ``` + * + */ +#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + +/************************************************************************** + * + * Uncomment the line below if you want to activate LCD rendering + * technology similar to ClearType in this build of the library. This + * technology triples the resolution in the direction color subpixels. To + * mitigate color fringes inherent to this technology, you also need to + * explicitly set up LCD filtering. + * + * When this macro is not defined, FreeType offers alternative LCD + * rendering technology that produces excellent output. + */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + +/************************************************************************** + * + * Many compilers provide a non-ANSI 64-bit data type that can be used by + * FreeType to speed up some computations. However, this will create some + * problems when compiling the library in strict ANSI mode. + * + * For this reason, the use of 64-bit integers is normally disabled when + * the `__STDC__` macro is defined. You can however disable this by + * defining the macro `FT_CONFIG_OPTION_FORCE_INT64` here. + * + * For most compilers, this will only create compilation warnings when + * building the library. + * + * ObNote: The compiler-specific 64-bit integers are detected in the + * file `ftconfig.h` either statically or through the `configure` + * script on supported platforms. + */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + +/************************************************************************** + * + * If this macro is defined, do not try to use an assembler version of + * performance-critical functions (e.g., @FT_MulFix). You should only do + * that to verify that the assembler function works properly, or to execute + * benchmark tests of the various implementations. + */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + +/************************************************************************** + * + * If this macro is defined, try to use an inlined assembler version of the + * @FT_MulFix function, which is a 'hotspot' when loading and hinting + * glyphs, and which should be executed as fast as possible. + * + * Note that if your compiler or CPU is not supported, this will default to + * the standard and portable implementation found in `ftcalc.c`. + */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + +/************************************************************************** + * + * LZW-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `compress` program. This is mostly used to parse many of the PCF + * files that come with various X11 distributions. The implementation + * uses NetBSD's `zopen` to partially uncompress the file on the fly (see + * `src/lzw/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. + */ +#define FT_CONFIG_OPTION_USE_LZW + +/************************************************************************** + * + * Gzip-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `gzip` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses 'zlib' to partially + * uncompress the file on the fly (see `src/gzip/ftgzip.c`). + * + * Define this macro if you want to enable this 'feature'. See also the + * macro `FT_CONFIG_OPTION_SYSTEM_ZLIB` below. + */ +#define FT_CONFIG_OPTION_USE_ZLIB + +/************************************************************************** + * + * ZLib library selection + * + * This macro is only used when `FT_CONFIG_OPTION_USE_ZLIB` is defined. + * It allows FreeType's 'ftgzip' component to link to the system's + * installation of the ZLib library. This is useful on systems like + * Unix or VMS where it generally is already available. + * + * If you let it undefined, the component will use its own copy of the + * zlib sources instead. These have been modified to be included + * directly within the component and **not** export external function + * names. This allows you to link any program with FreeType _and_ ZLib + * without linking conflicts. + * + * Do not `#undef` this macro here since the build system might define + * it for certain configurations only. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + * + * If you use the GNU make build system directly (that is, without the + * `configure` script) and you define this macro, you also have to pass + * `SYSTEM_ZLIB=yes` as an argument to make. + */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + +/************************************************************************** + * + * Bzip2-compressed file support. + * + * FreeType now handles font files that have been compressed with the + * `bzip2` program. This is mostly used to parse many of the PCF files + * that come with XFree86. The implementation uses `libbz2` to partially + * uncompress the file on the fly (see `src/bzip2/ftbzip2.c`). Contrary + * to gzip, bzip2 currently is not included and need to use the system + * available bzip2 implementation. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BZIP2 */ + +/************************************************************************** + * + * Define to disable the use of file stream functions and types, `FILE`, + * `fopen`, etc. Enables the use of smaller system libraries on embedded + * systems that have multiple system libraries, some with or without file + * stream support, in the cases where file stream support is not necessary + * such as memory loading of font files. + */ +/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + +/************************************************************************** + * + * PNG bitmap support. + * + * FreeType now handles loading color bitmap glyphs in the PNG format. + * This requires help from the external libpng library. Uncompressed + * color bitmaps do not need any external libraries and will be supported + * regardless of this configuration. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +#define FT_CONFIG_OPTION_USE_PNG + +/************************************************************************** + * + * HarfBuzz support. + * + * FreeType uses the HarfBuzz library to improve auto-hinting of OpenType + * fonts. If available, many glyphs not directly addressable by a font's + * character map will be hinted also. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */ + +/************************************************************************** + * + * Brotli support. + * + * FreeType uses the Brotli library to provide support for decompressing + * WOFF2 streams. + * + * Define this macro if you want to enable this 'feature'. + * + * If you use a build system like cmake or the `configure` script, + * options set by those programs have precedence, overwriting the value + * here with the configured one. + */ +/* #define FT_CONFIG_OPTION_USE_BROTLI */ + +/************************************************************************** + * + * Glyph Postscript Names handling + * + * By default, FreeType 2 is compiled with the 'psnames' module. This + * module is in charge of converting a glyph name string into a Unicode + * value, or return a Macintosh standard glyph name for the use with the + * TrueType 'post' table. + * + * Undefine this macro if you do not want 'psnames' compiled in your + * build of FreeType. This has the following effects: + * + * - The TrueType driver will provide its own set of glyph names, if you + * build it to support postscript names in the TrueType 'post' table, + * but will not synthesize a missing Unicode charmap. + * + * - The Type~1 driver will not be able to synthesize a Unicode charmap + * out of the glyphs found in the fonts. + * + * You would normally undefine this configuration macro when building a + * version of FreeType that doesn't contain a Type~1 or CFF driver. + */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + +/************************************************************************** + * + * Postscript Names to Unicode Values support + * + * By default, FreeType~2 is built with the 'psnames' module compiled in. + * Among other things, the module is used to convert a glyph name into a + * Unicode value. This is especially useful in order to synthesize on + * the fly a Unicode charmap from the CFF/Type~1 driver through a big + * table named the 'Adobe Glyph List' (AGL). + * + * Undefine this macro if you do not want the Adobe Glyph List compiled + * in your 'psnames' module. The Type~1 driver will not be able to + * synthesize a Unicode charmap out of the glyphs found in the fonts. + */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + +/************************************************************************** + * + * Support for Mac fonts + * + * Define this macro if you want support for outline fonts in Mac format + * (mac dfont, mac resource, macbinary containing a mac resource) on + * non-Mac platforms. + * + * Note that the 'FOND' resource isn't checked. + */ +/* #define FT_CONFIG_OPTION_MAC_FONTS */ + +/************************************************************************** + * + * Guessing methods to access embedded resource forks + * + * Enable extra Mac fonts support on non-Mac platforms (e.g., GNU/Linux). + * + * Resource forks which include fonts data are stored sometimes in + * locations which users or developers don't expected. In some cases, + * resource forks start with some offset from the head of a file. In + * other cases, the actual resource fork is stored in file different from + * what the user specifies. If this option is activated, FreeType tries + * to guess whether such offsets or different file names must be used. + * + * Note that normal, direct access of resource forks is controlled via + * the `FT_CONFIG_OPTION_MAC_FONTS` option. + */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS + #define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + +/************************************************************************** + * + * Allow the use of `FT_Incremental_Interface` to load typefaces that + * contain no glyph data, but supply it via a callback function. This is + * required by clients supporting document formats which supply font data + * incrementally as the document is parsed, such as the Ghostscript + * interpreter for the PostScript language. + */ +#define FT_CONFIG_OPTION_INCREMENTAL + +/************************************************************************** + * + * The size in bytes of the render pool used by the scan-line converter to + * do all of its work. + */ +#define FT_RENDER_POOL_SIZE 16384L + +/************************************************************************** + * + * FT_MAX_MODULES + * + * The maximum number of modules that can be registered in a single + * FreeType library object. 32~is the default. + */ +#define FT_MAX_MODULES 32 + +/************************************************************************** + * + * Debug level + * + * FreeType can be compiled in debug or trace mode. In debug mode, + * errors are reported through the 'ftdebug' component. In trace mode, + * additional messages are sent to the standard output during execution. + * + * Define `FT_DEBUG_LEVEL_ERROR` to build the library in debug mode. + * Define `FT_DEBUG_LEVEL_TRACE` to build it in trace mode. + * + * Don't define any of these macros to compile in 'release' mode! + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + +/************************************************************************** + * + * Logging + * + * Compiling FreeType in debug or trace mode makes FreeType write error + * and trace log messages to `stderr`. Enabling this macro + * automatically forces the `FT_DEBUG_LEVEL_ERROR` and + * `FT_DEBUG_LEVEL_TRACE` macros and allows FreeType to write error and + * trace log messages to a file instead of `stderr`. For writing logs + * to a file, FreeType uses an the external `dlg` library (the source + * code is in `src/dlg`). + * + * This option needs a C99 compiler. + */ +/* #define FT_DEBUG_LOGGING */ + +/************************************************************************** + * + * Autofitter debugging + * + * If `FT_DEBUG_AUTOFIT` is defined, FreeType provides some means to + * control the autofitter behaviour for debugging purposes with global + * boolean variables (consequently, you should **never** enable this + * while compiling in 'release' mode): + * + * ``` + * _af_debug_disable_horz_hints + * _af_debug_disable_vert_hints + * _af_debug_disable_blue_hints + * ``` + * + * Additionally, the following functions provide dumps of various + * internal autofit structures to stdout (using `printf`): + * + * ``` + * af_glyph_hints_dump_points + * af_glyph_hints_dump_segments + * af_glyph_hints_dump_edges + * af_glyph_hints_get_num_segments + * af_glyph_hints_get_segment_offset + * ``` + * + * As an argument, they use another global variable: + * + * ``` + * _af_debug_hints + * ``` + * + * Please have a look at the `ftgrid` demo program to see how those + * variables and macros should be used. + * + * Do not `#undef` these macros here since the build system might define + * them for certain configurations only. + */ +/* #define FT_DEBUG_AUTOFIT */ + +/************************************************************************** + * + * Memory Debugging + * + * FreeType now comes with an integrated memory debugger that is capable + * of detecting simple errors like memory leaks or double deletes. To + * compile it within your build of the library, you should define + * `FT_DEBUG_MEMORY` here. + * + * Note that the memory debugger is only activated at runtime when when + * the _environment_ variable `FT2_DEBUG_MEMORY` is defined also! + * + * Do not `#undef` this macro here since the build system might define it + * for certain configurations only. + */ +/* #define FT_DEBUG_MEMORY */ + +/************************************************************************** + * + * Module errors + * + * If this macro is set (which is _not_ the default), the higher byte of + * an error code gives the module in which the error has occurred, while + * the lower byte is the real error code. + * + * Setting this macro makes sense for debugging purposes only, since it + * would break source compatibility of certain programs that use + * FreeType~2. + * + * More details can be found in the files `ftmoderr.h` and `fterrors.h`. + */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +/************************************************************************** + * + * OpenType SVG Glyph Support + * + * Setting this macro enables support for OpenType SVG glyphs. By + * default, FreeType can only fetch SVG documents. However, it can also + * render them if external rendering hook functions are plugged in at + * runtime. + * + * More details on the hooks can be found in file `otsvg.h`. + */ +#define FT_CONFIG_OPTION_SVG + +/************************************************************************** + * + * Error Strings + * + * If this macro is set, `FT_Error_String` will return meaningful + * descriptions. This is not enabled by default to reduce the overall + * size of FreeType. + * + * More details can be found in the file `fterrors.h`. + */ +#define FT_CONFIG_OPTION_ERROR_STRINGS + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** S F N T D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_EMBEDDED_BITMAPS` if you want to support + * embedded bitmaps in all formats using the 'sfnt' module (namely + * TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_COLOR_LAYERS` if you want to support colored + * outlines (from the 'COLR'/'CPAL' tables) in all formats using the 'sfnt' + * module (namely TrueType~& OpenType). + */ +#define TT_CONFIG_OPTION_COLOR_LAYERS + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_POSTSCRIPT_NAMES` if you want to be able to + * load and enumerate the glyph Postscript names in a TrueType or OpenType + * file. + * + * Note that when you do not compile the 'psnames' module by undefining the + * above `FT_CONFIG_OPTION_POSTSCRIPT_NAMES`, the 'sfnt' module will + * contain additional code used to read the PS Names table from a font. + * + * (By default, the module uses 'psnames' to extract glyph names.) + */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_SFNT_NAMES` if your applications need to access + * the internal name table in a SFNT-based format like TrueType or + * OpenType. The name table contains various strings used to describe the + * font, like family name, copyright, version, etc. It does not contain + * any glyph name though. + * + * Accessing SFNT names is done through the functions declared in + * `ftsnames.h`. + */ +#define TT_CONFIG_OPTION_SFNT_NAMES + +/************************************************************************** + * + * TrueType CMap support + * + * Here you can fine-tune which TrueType CMap table format shall be + * supported. + */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` if you want to compile a + * bytecode interpreter in the TrueType driver. + * + * By undefining this, you will only compile the code necessary to load + * TrueType glyphs without hinting. + * + * Do not `#undef` this macro here, since the build system might define it + * for certain configurations only. + */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_SUBPIXEL_HINTING` if you want to compile + * subpixel hinting support into the TrueType driver. This modifies the + * TrueType hinting mechanism when anything but `FT_RENDER_MODE_MONO` is + * requested. + * + * In particular, it modifies the bytecode interpreter to interpret (or + * not) instructions in a certain way so that all TrueType fonts look like + * they do in a Windows ClearType (DirectWrite) environment. See [1] for a + * technical overview on what this means. See `ttinterp.h` for more + * details on the LEAN option. + * + * There are three possible values. + * + * Value 1: + * This value is associated with the 'Infinality' moniker, contributed by + * an individual nicknamed Infinality with the goal of making TrueType + * fonts render better than on Windows. A high amount of configurability + * and flexibility, down to rules for single glyphs in fonts, but also + * very slow. Its experimental and slow nature and the original + * developer losing interest meant that this option was never enabled in + * default builds. + * + * The corresponding interpreter version is v38. + * + * Value 2: + * The new default mode for the TrueType driver. The Infinality code + * base was stripped to the bare minimum and all configurability removed + * in the name of speed and simplicity. The configurability was mainly + * aimed at legacy fonts like 'Arial', 'Times New Roman', or 'Courier'. + * Legacy fonts are fonts that modify vertical stems to achieve clean + * black-and-white bitmaps. The new mode focuses on applying a minimal + * set of rules to all fonts indiscriminately so that modern and web + * fonts render well while legacy fonts render okay. + * + * The corresponding interpreter version is v40. + * + * Value 3: + * Compile both, making both v38 and v40 available (the latter is the + * default). + * + * By undefining these, you get rendering behavior like on Windows without + * ClearType, i.e., Windows XP without ClearType enabled and Win9x + * (interpreter version v35). Or not, depending on how much hinting blood + * and testing tears the font designer put into a given font. If you + * define one or both subpixel hinting options, you can switch between + * between v35 and the ones you define (using `FT_Property_Set`). + * + * This option requires `TT_CONFIG_OPTION_BYTECODE_INTERPRETER` to be + * defined. + * + * [1] + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx + */ +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED` to compile the + * TrueType glyph loader to use Apple's definition of how to handle + * component offsets in composite glyphs. + * + * Apple and MS disagree on the default behavior of component offsets in + * composites. Apple says that they should be scaled by the scaling + * factors in the transformation matrix (roughly, it's more complex) while + * MS says they should not. OpenType defines two bits in the composite + * flags array which can be used to disambiguate, but old fonts will not + * have them. + * + * https://www.microsoft.com/typography/otspec/glyf.htm + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html + */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_GX_VAR_SUPPORT` if you want to include support + * for Apple's distortable font technology ('fvar', 'gvar', 'cvar', and + * 'avar' tables). Tagged 'Font Variations', this is now part of OpenType + * also. This has many similarities to Type~1 Multiple Masters support. + */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + +/************************************************************************** + * + * Define `TT_CONFIG_OPTION_BDF` if you want to include support for an + * embedded 'BDF~' table within SFNT-based bitmap formats. + */ +#define TT_CONFIG_OPTION_BDF + +/************************************************************************** + * + * Option `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES` controls the maximum + * number of bytecode instructions executed for a single run of the + * bytecode interpreter, needed to prevent infinite loops. You don't want + * to change this except for very special situations (e.g., making a + * library fuzzer spend less time to handle broken fonts). + * + * It is not expected that this value is ever modified by a configuring + * script; instead, it gets surrounded with `#ifndef ... #endif` so that + * the value can be set as a preprocessor option on the compiler's command + * line. + */ +#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES + #define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES 1000000L +#endif + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * `T1_MAX_DICT_DEPTH` is the maximum depth of nest dictionaries and arrays + * in the Type~1 stream (see `t1load.c`). A minimum of~4 is required. + */ +#define T1_MAX_DICT_DEPTH 5 + +/************************************************************************** + * + * `T1_MAX_SUBRS_CALLS` details the maximum number of nested sub-routine + * calls during glyph loading. + */ +#define T1_MAX_SUBRS_CALLS 16 + +/************************************************************************** + * + * `T1_MAX_CHARSTRING_OPERANDS` is the charstring stack's capacity. A + * minimum of~16 is required. + * + * The Chinese font 'MingTiEG-Medium' (covering the CNS 11643 character + * set) needs 256. + */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + +/************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the 't1afm' module, which is in charge of reading Type~1 AFM files + * into an existing face. Note that if set, the Type~1 driver will be + * unable to produce kerning distances. + */ +#undef T1_CONFIG_OPTION_NO_AFM + +/************************************************************************** + * + * Define this configuration macro if you want to prevent the compilation + * of the Multiple Masters font support in the Type~1 driver. + */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + +/************************************************************************** + * + * `T1_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe Type~1 + * engine gets compiled into FreeType. If defined, it is possible to + * switch between the two engines using the `hinting-engine` property of + * the 'type1' driver module. + */ +/* #define T1_CONFIG_OPTION_OLD_ENGINE */ + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** C F F D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * Using `CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}` it is + * possible to set up the default values of the four control points that + * define the stem darkening behaviour of the (new) CFF engine. For more + * details please read the documentation of the `darkening-parameters` + * property (file `ftdriver.h`), which allows the control at run-time. + * + * Do **not** undefine these macros! + */ +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 + +/************************************************************************** + * + * `CFF_CONFIG_OPTION_OLD_ENGINE` controls whether the pre-Adobe CFF engine + * gets compiled into FreeType. If defined, it is possible to switch + * between the two engines using the `hinting-engine` property of the 'cff' + * driver module. + */ +/* #define CFF_CONFIG_OPTION_OLD_ENGINE */ + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** P C F D R I V E R C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * There are many PCF fonts just called 'Fixed' which look completely + * different, and which have nothing to do with each other. When selecting + * 'Fixed' in KDE or Gnome one gets results that appear rather random, the + * style changes often if one changes the size and one cannot select some + * fonts at all. This option makes the 'pcf' module prepend the foundry + * name (plus a space) to the family name. + * + * We also check whether we have 'wide' characters; all put together, we + * get family names like 'Sony Fixed' or 'Misc Fixed Wide'. + * + * If this option is activated, it can be controlled with the + * `no-long-family-names` property of the 'pcf' driver module. + */ +/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + +/*************************************************************************/ +/*************************************************************************/ +/**** ****/ +/**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ +/**** ****/ +/*************************************************************************/ +/*************************************************************************/ + +/************************************************************************** + * + * Compile 'autofit' module with CJK (Chinese, Japanese, Korean) script + * support. + */ +#define AF_CONFIG_OPTION_CJK + +/************************************************************************** + * + * Compile 'autofit' module with fallback Indic script support, covering + * some scripts that the 'latin' submodule of the 'autofit' module doesn't + * (yet) handle. Currently, this needs option `AF_CONFIG_OPTION_CJK`. + */ +#ifdef AF_CONFIG_OPTION_CJK + #define AF_CONFIG_OPTION_INDIC +#endif + +/************************************************************************** + * + * Use TrueType-like size metrics for 'light' auto-hinting. + * + * It is strongly recommended to avoid this option, which exists only to + * help some legacy applications retain its appearance and behaviour with + * respect to auto-hinted TrueType fonts. + * + * The very reason this option exists at all are GNU/Linux distributions + * like Fedora that did not un-patch the following change (which was + * present in FreeType between versions 2.4.6 and 2.7.1, inclusive). + * + * ``` + * 2011-07-16 Steven Chu + * + * [truetype] Fix metrics on size request for scalable fonts. + * ``` + * + * This problematic commit is now reverted (more or less). + */ +/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */ + +/* */ + +/* + * This macro is obsolete. Support has been removed in FreeType version + * 2.5. + */ +/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ + +/* + * The next three macros are defined if native TrueType hinting is + * requested by the definitions above. Don't change this. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + #define TT_USE_BYTECODE_INTERPRETER + + #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING + #if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1 + #define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + #endif + + #if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2 + #define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + #endif + #endif +#endif + +/* + * The TT_SUPPORT_COLRV1 macro is defined to indicate to clients that this + * version of FreeType has support for 'COLR' v1 API. This definition is + * useful to FreeType clients that want to build in support for 'COLR' v1 + * depending on a tip-of-tree checkout before it is officially released in + * FreeType, and while the feature cannot yet be tested against using + * version macros. Don't change this macro. This may be removed once the + * feature is in a FreeType release version and version macros can be used + * to test for availability. + */ +#ifdef TT_CONFIG_OPTION_COLOR_LAYERS + #define TT_SUPPORT_COLRV1 +#endif + +/* + * Check CFF darkening parameters. The checks are the same as in function + * `cff_property_set` in file `cffdrivr.c`. + */ +#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 + #error "Invalid CFF darkening parameters!" +#endif + +FT_END_HEADER + +#endif /* FTOPTION_H_ */ + +/* END */ diff --git a/inc/lvgl/src/libs/freetype/lv_freetype.c b/inc/lvgl/src/libs/freetype/lv_freetype.c new file mode 100755 index 0000000..ac348b0 --- /dev/null +++ b/inc/lvgl/src/libs/freetype/lv_freetype.c @@ -0,0 +1,496 @@ +/** + * @file lv_freetype.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_freetype_private.h" + +#if LV_USE_FREETYPE + +#include "../../misc/lv_fs_private.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#define ft_ctx LV_GLOBAL_DEFAULT()->ft_context +#define LV_FREETYPE_OUTLINE_REF_SIZE_DEF 128 + +/**< This value is from the FreeType's function `FT_GlyphSlot_Oblique` in `ftsynth.c` */ +#define LV_FREETYPE_OBLIQUE_SLANT_DEF 0x0366A + +#if LV_FREETYPE_CACHE_FT_GLYPH_CNT <= 0 + #error "LV_FREETYPE_CACHE_FT_GLYPH_CNT must be greater than 0" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/* Use the pointer storing pathname as the unique request ID of the face */ +typedef struct { + char * pathname; + int ref_cnt; +} face_id_node_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_freetype_cleanup(lv_freetype_context_t * ctx); +static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const char * pathname); +static void lv_freetype_drop_face_id(lv_freetype_context_t * ctx, FTC_FaceID face_id); +static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc, uint32_t max_glyph_cnt); +static void freetype_on_font_set_cbs(lv_freetype_font_dsc_t * dsc); + +static bool cache_node_cache_create_cb(lv_freetype_cache_node_t * node, void * user_data); +static void cache_node_cache_free_cb(lv_freetype_cache_node_t * node, void * user_data); +static lv_cache_compare_res_t cache_node_cache_compare_cb(const lv_freetype_cache_node_t * lhs, + const lv_freetype_cache_node_t * rhs); + +static lv_font_t * freetype_font_create_cb(const lv_font_info_t * info, const void * src); +static void freetype_font_delete_cb(lv_font_t * font); +static void * freetype_font_dup_src_cb(const void * src); +static void freetype_font_free_src_cb(void * src); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_font_class_t lv_freetype_font_class = { + .create_cb = freetype_font_create_cb, + .delete_cb = freetype_font_delete_cb, + .dup_src_cb = freetype_font_dup_src_cb, + .free_src_cb = freetype_font_free_src_cb, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_freetype_init(uint32_t max_glyph_cnt) +{ + if(ft_ctx) { + LV_LOG_WARN("freetype already initialized"); + return LV_RESULT_INVALID; + } + + ft_ctx = lv_malloc_zeroed(sizeof(lv_freetype_context_t)); + LV_ASSERT_MALLOC(ft_ctx); + if(!ft_ctx) { + LV_LOG_ERROR("malloc failed for lv_freetype_context_t"); + return LV_RESULT_INVALID; + } + + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + ctx->max_glyph_cnt = max_glyph_cnt; + + FT_Error error; + + error = FT_Init_FreeType(&ctx->library); + if(error) { + FT_ERROR_MSG("FT_Init_FreeType", error); + return LV_RESULT_INVALID; + } + + lv_ll_init(&ctx->face_id_ll, sizeof(face_id_node_t)); + + lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)cache_node_cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)cache_node_cache_create_cb, + .free_cb = (lv_cache_free_cb_t)cache_node_cache_free_cb, + }; + ctx->cache_node_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_cache_node_t), INT32_MAX, ops); + lv_cache_set_name(ctx->cache_node_cache, "FREETYPE_CACHE_NODE"); + + return LV_RESULT_OK; +} + +void lv_freetype_uninit(void) +{ + lv_freetype_context_t * ctx = lv_freetype_get_context(); + if(!ctx) { + return; + } + + lv_freetype_cleanup(ctx); + + lv_free(ft_ctx); + ft_ctx = NULL; +} + +void lv_freetype_init_font_info(lv_font_info_t * font_info) +{ + LV_ASSERT_NULL(font_info); + lv_memzero(font_info, sizeof(lv_font_info_t)); + font_info->class_p = &lv_freetype_font_class; + font_info->render_mode = LV_FREETYPE_FONT_RENDER_MODE_BITMAP; + font_info->style = LV_FREETYPE_FONT_STYLE_NORMAL; + font_info->kerning = LV_FONT_KERNING_NONE; +} + +lv_font_t * lv_freetype_font_create_with_info(const lv_font_info_t * font_info) +{ + LV_ASSERT_NULL(font_info); + if(font_info->size == 0) { + LV_LOG_ERROR("font size can't be zero"); + return NULL; + } + + const char * pathname = font_info->name; + + size_t pathname_len = pathname ? lv_strlen(pathname) : 0; + if(pathname_len == 0) { + LV_LOG_ERROR("font pathname can't be empty"); + return NULL; + } + + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + lv_freetype_cache_node_t search_key = { + .pathname = lv_freetype_req_face_id(ctx, pathname), + .style = font_info->style, + .render_mode = font_info->render_mode, + }; + + bool cache_hitting = true; + lv_cache_entry_t * cache_node_entry = lv_cache_acquire(ctx->cache_node_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + cache_hitting = false; + cache_node_entry = lv_cache_acquire_or_create(ctx->cache_node_cache, &search_key, NULL); + if(cache_node_entry == NULL) { + lv_freetype_drop_face_id(ctx, (FTC_FaceID)search_key.pathname); + LV_LOG_ERROR("cache node creating failed"); + return NULL; + } + } + + lv_freetype_font_dsc_t * dsc = lv_malloc_zeroed(sizeof(lv_freetype_font_dsc_t)); + LV_ASSERT_MALLOC(dsc); + + dsc->face_id = (FTC_FaceID)search_key.pathname; + dsc->render_mode = font_info->render_mode; + dsc->context = ctx; + dsc->size = font_info->size; + dsc->style = font_info->style; + dsc->kerning = font_info->kerning; + dsc->magic_num = LV_FREETYPE_FONT_DSC_MAGIC_NUM; + dsc->cache_node = lv_cache_entry_get_data(cache_node_entry); + dsc->cache_node_entry = cache_node_entry; + + if(cache_hitting == false && freetype_on_font_create(dsc, ctx->max_glyph_cnt) == false) { + lv_cache_release(ctx->cache_node_cache, dsc->cache_node_entry, NULL); + lv_freetype_drop_face_id(ctx, dsc->face_id); + lv_free(dsc); + return NULL; + } + freetype_on_font_set_cbs(dsc); + + FT_Face face = dsc->cache_node->face; + FT_Error error; + if(FT_IS_SCALABLE(face)) { + error = FT_Set_Pixel_Sizes(face, 0, font_info->size); + } + else { + LV_LOG_WARN("font is not scalable, selecting available size"); + error = FT_Select_Size(face, 0); + } + if(error) { + FT_ERROR_MSG("FT_Set_Pixel_Sizes", error); + return NULL; + } + + if(dsc->kerning != LV_FONT_KERNING_NONE && !dsc->cache_node->face_has_kerning) { + LV_LOG_WARN("font: '%s' doesn't have kerning info", pathname); + } + + lv_font_t * font = &dsc->font; + font->dsc = dsc; + font->subpx = LV_FONT_SUBPX_NONE; + font->line_height = FT_F26DOT6_TO_INT(face->size->metrics.height); + font->base_line = -FT_F26DOT6_TO_INT(face->size->metrics.descender); + + FT_Fixed scale = face->size->metrics.y_scale; + int8_t thickness = FT_F26DOT6_TO_INT(FT_MulFix(scale, face->underline_thickness)); + font->underline_position = FT_F26DOT6_TO_INT(FT_MulFix(scale, face->underline_position)); + font->underline_thickness = thickness < 1 ? 1 : thickness; + + return font; +} + +lv_font_t * lv_freetype_font_create(const char * pathname, lv_freetype_font_render_mode_t render_mode, uint32_t size, + lv_freetype_font_style_t style) +{ + lv_font_info_t font_info; + lv_freetype_init_font_info(&font_info); + font_info.name = pathname; + font_info.size = size; + font_info.render_mode = render_mode; + font_info.style = style; + return lv_freetype_font_create_with_info(&font_info); +} + +void lv_freetype_font_delete(lv_font_t * font) +{ + LV_ASSERT_NULL(font); + lv_freetype_context_t * ctx = lv_freetype_get_context(); + if(!ctx) { + /* Freetype already torn down (e.g. static destruction order). Nothing to release. */ + return; + } + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)(font->dsc); + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + + lv_cache_release(ctx->cache_node_cache, dsc->cache_node_entry, NULL); + if(lv_cache_entry_get_ref(dsc->cache_node_entry) == 0) { + lv_cache_drop(ctx->cache_node_cache, dsc->cache_node, NULL); + } + + lv_freetype_drop_face_id(dsc->context, dsc->face_id); + + /* invalidate magic number */ + lv_memzero(dsc, sizeof(lv_freetype_font_dsc_t)); + lv_free(dsc); +} + +lv_freetype_context_t * lv_freetype_get_context(void) +{ + return LV_GLOBAL_DEFAULT()->ft_context; +} + +void lv_freetype_italic_transform(FT_Face face) +{ + LV_ASSERT_NULL(face); + FT_Matrix matrix; + matrix.xx = FT_INT_TO_F16DOT16(1); + matrix.xy = LV_FREETYPE_OBLIQUE_SLANT_DEF; + matrix.yx = 0; + matrix.yy = FT_INT_TO_F16DOT16(1); + FT_Set_Transform(face, &matrix, NULL); +} + +int32_t lv_freetype_italic_transform_on_pos(lv_point_t point) +{ + return point.x + FT_F16DOT16_TO_INT(point.y * LV_FREETYPE_OBLIQUE_SLANT_DEF); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc, uint32_t max_glyph_cnt) +{ + /* + * Glyph info uses a small amount of memory, and uses glyph info more frequently, + * so it plans to use twice the maximum number of caches here to + * get a better info acquisition performance.*/ + lv_cache_t * glyph_cache = lv_freetype_create_glyph_cache(max_glyph_cnt * 2); + if(glyph_cache == NULL) { + LV_LOG_ERROR("glyph cache creating failed"); + return false; + } + dsc->cache_node->glyph_cache = glyph_cache; + + lv_cache_t * draw_data_cache = NULL; + if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { + draw_data_cache = lv_freetype_create_draw_data_image(max_glyph_cnt); + } + else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { + draw_data_cache = lv_freetype_create_draw_data_outline(max_glyph_cnt); + } + else { + LV_LOG_ERROR("unknown render mode"); + return false; + } + + if(draw_data_cache == NULL) { + LV_LOG_ERROR("draw data cache creating failed"); + return false; + } + + dsc->cache_node->draw_data_cache = draw_data_cache; + + return true; +} + +static void freetype_on_font_set_cbs(lv_freetype_font_dsc_t * dsc) +{ + lv_freetype_set_cbs_glyph(dsc); + if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { + lv_freetype_set_cbs_image_font(dsc); + } + else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { + lv_freetype_set_cbs_outline_font(dsc); + } +} + +static void lv_freetype_cleanup(lv_freetype_context_t * ctx) +{ + LV_ASSERT_NULL(ctx); + if(ctx->cache_node_cache) { + lv_cache_destroy(ctx->cache_node_cache, NULL); + ctx->cache_node_cache = NULL; + } + + if(ctx->library) { + FT_Done_FreeType(ctx->library); + ctx->library = NULL; + } +} + +static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const char * pathname) +{ + size_t len = lv_strlen(pathname); + LV_ASSERT(len > 0); + + lv_ll_t * ll_p = &ctx->face_id_ll; + face_id_node_t * node; + + /* search cache */ + LV_LL_READ(ll_p, node) { + if(strcmp(node->pathname, pathname) == 0) { + node->ref_cnt++; + LV_LOG_INFO("reuse face_id: %s, ref_cnt = %d", node->pathname, node->ref_cnt); + return node->pathname; + } + } + + /* insert new cache */ + node = lv_ll_ins_tail(ll_p); + LV_ASSERT_MALLOC(node); + +#if LV_USE_FS_MEMFS + if(pathname[0] == LV_FS_MEMFS_LETTER) { +#if !LV_FREETYPE_USE_LVGL_PORT + LV_LOG_WARN("LV_FREETYPE_USE_LVGL_PORT is not enabled"); +#endif + node->pathname = lv_malloc(sizeof(lv_fs_path_ex_t)); + LV_ASSERT_MALLOC(node->pathname); + lv_memcpy(node->pathname, pathname, sizeof(lv_fs_path_ex_t)); + } + else +#endif + { + node->pathname = lv_strdup(pathname); + LV_ASSERT_NULL(node->pathname); + } + + LV_LOG_INFO("add face_id: %s", node->pathname); + + node->ref_cnt = 1; + return node->pathname; +} + +static void lv_freetype_drop_face_id(lv_freetype_context_t * ctx, FTC_FaceID face_id) +{ + lv_ll_t * ll_p = &ctx->face_id_ll; + face_id_node_t * node; + LV_LL_READ(ll_p, node) { + if(face_id == node->pathname) { + LV_LOG_INFO("found face_id: %s, ref_cnt = %d", node->pathname, node->ref_cnt); + node->ref_cnt--; + if(node->ref_cnt == 0) { + LV_LOG_INFO("drop face_id: %s", node->pathname); + lv_ll_remove(ll_p, node); + lv_free(node->pathname); + lv_free(node); + } + return; + } + } + + LV_ASSERT_MSG(false, "face_id not found"); +} + +/*----------------- + * Cache Node Cache Callbacks + *----------------*/ + +static bool cache_node_cache_create_cb(lv_freetype_cache_node_t * node, void * user_data) +{ + LV_UNUSED(user_data); + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + /* Cache miss, load face */ + FT_Face face; + FT_Error error = FT_New_Face(ctx->library, node->pathname, 0, &face); + if(error) { + FT_ERROR_MSG("FT_New_Face", error); + return false; + } + + node->ref_size = LV_FREETYPE_OUTLINE_REF_SIZE_DEF; + + if(node->style & LV_FREETYPE_FONT_STYLE_ITALIC) { + lv_freetype_italic_transform(face); + } + + node->face = face; + node->face_has_kerning = FT_HAS_KERNING(face); + lv_mutex_init(&node->face_lock); + + return true; +} +static void cache_node_cache_free_cb(lv_freetype_cache_node_t * node, void * user_data) +{ + FT_Done_Face(node->face); + lv_mutex_delete(&node->face_lock); + + if(node->glyph_cache) { + lv_cache_destroy(node->glyph_cache, user_data); + node->glyph_cache = NULL; + } + if(node->draw_data_cache) { + lv_cache_destroy(node->draw_data_cache, user_data); + node->draw_data_cache = NULL; + } +} +static lv_cache_compare_res_t cache_node_cache_compare_cb(const lv_freetype_cache_node_t * lhs, + const lv_freetype_cache_node_t * rhs) +{ + if(lhs->render_mode != rhs->render_mode) { + return lhs->render_mode > rhs->render_mode ? 1 : -1; + } + if(lhs->style != rhs->style) { + return lhs->style > rhs->style ? 1 : -1; + } + + int32_t cmp_res = lv_strcmp(lhs->pathname, rhs->pathname); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + + return 0; +} + +static lv_font_t * freetype_font_create_cb(const lv_font_info_t * info, const void * src) +{ + lv_font_info_t font_info = *info; + font_info.name = src; + return lv_freetype_font_create_with_info(&font_info); +} + +static void freetype_font_delete_cb(lv_font_t * font) +{ + lv_freetype_font_delete(font); +} + +static void * freetype_font_dup_src_cb(const void * src) +{ + return lv_strdup(src); +} + +static void freetype_font_free_src_cb(void * src) +{ + lv_free(src); +} + +#endif /*LV_USE_FREETYPE*/ diff --git a/inc/lvgl/src/libs/freetype/lv_freetype.h b/inc/lvgl/src/libs/freetype/lv_freetype.h new file mode 100755 index 0000000..98837e5 --- /dev/null +++ b/inc/lvgl/src/libs/freetype/lv_freetype.h @@ -0,0 +1,149 @@ +/** + * @file lv_freetype.h + * + */ +#ifndef LV_FREETYPE_H +#define LV_FREETYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_FREETYPE + +#include "../../misc/lv_types.h" +#include "../../misc/lv_event.h" +#include "../../misc/lv_color.h" + +#include LV_STDBOOL_INCLUDE + +/********************* +* DEFINES +*********************/ + +#define LV_FREETYPE_F26DOT6_TO_INT(x) ((x) >> 6) +#define LV_FREETYPE_F26DOT6_TO_FLOAT(x) ((float)(x) / 64) + +#define FT_FONT_STYLE_NORMAL LV_FREETYPE_FONT_STYLE_NORMAL +#define FT_FONT_STYLE_ITALIC LV_FREETYPE_FONT_STYLE_ITALIC +#define FT_FONT_STYLE_BOLD LV_FREETYPE_FONT_STYLE_BOLD + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_FREETYPE_FONT_STYLE_NORMAL = 0, + LV_FREETYPE_FONT_STYLE_ITALIC = 1 << 0, + LV_FREETYPE_FONT_STYLE_BOLD = 1 << 1, +} lv_freetype_font_style_t; + +typedef lv_freetype_font_style_t LV_FT_FONT_STYLE; + +typedef enum { + LV_FREETYPE_FONT_RENDER_MODE_BITMAP = 0, + LV_FREETYPE_FONT_RENDER_MODE_OUTLINE = 1, +} lv_freetype_font_render_mode_t; + +typedef void * lv_freetype_outline_t; + +typedef enum { + LV_FREETYPE_OUTLINE_END, + LV_FREETYPE_OUTLINE_MOVE_TO, + LV_FREETYPE_OUTLINE_LINE_TO, + LV_FREETYPE_OUTLINE_CUBIC_TO, + LV_FREETYPE_OUTLINE_CONIC_TO, + LV_FREETYPE_OUTLINE_BORDER_START, /* When line width > 0 the border glyph is drawn after the regular glyph */ +} lv_freetype_outline_type_t; + +/* Only path string is required */ +typedef const char lv_freetype_font_src_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_font_class_t lv_freetype_font_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the freetype library. + * @return LV_RESULT_OK on success, otherwise LV_RESULT_INVALID. + */ +lv_result_t lv_freetype_init(uint32_t max_glyph_cnt); + +/** + * Uninitialize the freetype library + */ +void lv_freetype_uninit(void); + +/** + * Initialize a font info structure. + * @param font_info font info structure to be initialized. + */ +void lv_freetype_init_font_info(lv_font_info_t * font_info); + +/** + * Create a freetype font with a font info structure. + * @param font_info font info structure. + * @return Created font, or NULL on failure. + */ +lv_font_t * lv_freetype_font_create_with_info(const lv_font_info_t * font_info); + +/** + * Create a freetype font. + * @param pathname font file path. + * @param render_mode font render mode(see @lv_freetype_font_render_mode_t for details). + * @param size font size. + * @param style font style(see lv_freetype_font_style_t for details). + * @return Created font, or NULL on failure. + */ +lv_font_t * lv_freetype_font_create(const char * pathname, lv_freetype_font_render_mode_t render_mode, uint32_t size, + lv_freetype_font_style_t style); + +/** + * Delete a freetype font. + * @param font freetype font to be deleted. + */ +void lv_freetype_font_delete(lv_font_t * font); + +/** + * Register a callback function to generate outlines for FreeType fonts. + * + * @param cb The callback function to be registered. + * @param user_data User data to be passed to the callback function. + * @return The ID of the registered callback function, or a negative value on failure. + */ +void lv_freetype_outline_add_event(lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data); + +/** + * Get the scale of a FreeType font. + * + * @param font The FreeType font to get the scale of. + * @return The scale of the FreeType font. + */ +uint32_t lv_freetype_outline_get_scale(const lv_font_t * font); + +/** + * Check if the font is an outline font. + * + * @param font The FreeType font. + * @return Is outline font on success, otherwise false. + */ +bool lv_freetype_is_outline_font(const lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FREETYPE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_FREETYPE_H */ diff --git a/inc/lvgl/src/libs/freetype/lv_freetype_glyph.c b/inc/lvgl/src/libs/freetype/lv_freetype_glyph.c new file mode 100644 index 0000000..df789b9 --- /dev/null +++ b/inc/lvgl/src/libs/freetype/lv_freetype_glyph.c @@ -0,0 +1,248 @@ +/** + * @file lv_freetype_glyph.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" +#include "lv_freetype_private.h" + +#if LV_USE_FREETYPE + +/********************* + * DEFINES + *********************/ + +#define CACHE_NAME "FREETYPE_GLYPH" + +/********************** + * TYPEDEFS + **********************/ +typedef struct _lv_freetype_glyph_cache_data_t { + uint32_t unicode; + uint32_t size; + + lv_font_glyph_dsc_t glyph_dsc; +} lv_freetype_glyph_cache_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool freetype_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc, uint32_t unicode_letter, + uint32_t unicode_letter_next); + +static bool freetype_glyph_create_cb(lv_freetype_glyph_cache_data_t * data, void * user_data); +static void freetype_glyph_free_cb(lv_freetype_glyph_cache_data_t * data, void * user_data); +static lv_cache_compare_res_t freetype_glyph_compare_cb(const lv_freetype_glyph_cache_data_t * lhs, + const lv_freetype_glyph_cache_data_t * rhs); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_cache_t * lv_freetype_create_glyph_cache(uint32_t cache_size) +{ + lv_cache_ops_t ops = { + .create_cb = (lv_cache_create_cb_t)freetype_glyph_create_cb, + .free_cb = (lv_cache_free_cb_t)freetype_glyph_free_cb, + .compare_cb = (lv_cache_compare_cb_t)freetype_glyph_compare_cb, + }; + + lv_cache_t * glyph_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_glyph_cache_data_t), + cache_size, ops); + lv_cache_set_name(glyph_cache, CACHE_NAME); + + return glyph_cache; +} + +void lv_freetype_set_cbs_glyph(lv_freetype_font_dsc_t * dsc) +{ + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + dsc->font.get_glyph_dsc = freetype_get_glyph_dsc_cb; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool freetype_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc, uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + LV_ASSERT_NULL(font); + LV_ASSERT_NULL(g_dsc); + LV_PROFILER_FONT_BEGIN; + + if(unicode_letter < 0x20) { + g_dsc->adv_w = 0; + g_dsc->box_h = 0; + g_dsc->box_w = 0; + g_dsc->ofs_x = 0; + g_dsc->ofs_y = 0; + g_dsc->format = LV_FONT_GLYPH_FORMAT_NONE; + LV_PROFILER_FONT_END; + return true; + } + + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + + lv_freetype_glyph_cache_data_t search_key = { + .unicode = unicode_letter, + .size = dsc->size, + }; + + lv_cache_t * glyph_cache = dsc->cache_node->glyph_cache; + + lv_cache_entry_t * entry = lv_cache_acquire_or_create(glyph_cache, &search_key, dsc); + if(entry == NULL) { + LV_LOG_ERROR("glyph lookup failed for unicode = 0x%" LV_PRIx32, unicode_letter); + LV_PROFILER_FONT_END; + return false; + } + lv_freetype_glyph_cache_data_t * data = lv_cache_entry_get_data(entry); + *g_dsc = data->glyph_dsc; + + if((dsc->style & LV_FREETYPE_FONT_STYLE_ITALIC) && (unicode_letter_next == '\0')) { + g_dsc->adv_w = g_dsc->box_w + g_dsc->ofs_x; + } + + if(dsc->kerning == LV_FONT_KERNING_NORMAL && dsc->cache_node->face_has_kerning && unicode_letter_next != '\0') { + lv_mutex_lock(&dsc->cache_node->face_lock); + FT_Face face = dsc->cache_node->face; + if(FT_IS_SCALABLE(face)) { + FT_Error set_size_error = FT_Set_Pixel_Sizes(face, 0, dsc->size); + if(set_size_error) { + FT_ERROR_MSG("FT_Set_Pixel_Sizes", set_size_error); + } + } + FT_UInt glyph_index_next = FT_Get_Char_Index(face, unicode_letter_next); + FT_Vector kerning; + FT_Error error = FT_Get_Kerning(face, g_dsc->gid.index, glyph_index_next, FT_KERNING_DEFAULT, &kerning); + if(!error) { + g_dsc->adv_w += LV_FREETYPE_F26DOT6_TO_INT(kerning.x); + } + else { + FT_ERROR_MSG("FT_Get_Kerning", error); + } + lv_mutex_unlock(&dsc->cache_node->face_lock); + } + + g_dsc->entry = NULL; + + lv_cache_release(glyph_cache, entry, NULL); + LV_PROFILER_FONT_END; + return true; +} + +/*----------------- + * Cache Callbacks + *----------------*/ + +static bool freetype_glyph_create_cb(lv_freetype_glyph_cache_data_t * data, void * user_data) +{ + LV_PROFILER_FONT_BEGIN; + + FT_Error error; + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)user_data; + lv_font_glyph_dsc_t * dsc_out = &data->glyph_dsc; + + lv_mutex_lock(&dsc->cache_node->face_lock); + FT_Face face = dsc->cache_node->face; + FT_UInt glyph_index = FT_Get_Char_Index(face, data->unicode); + + if(FT_IS_SCALABLE(face)) { + error = FT_Set_Pixel_Sizes(face, 0, dsc->size); + } + else { + error = FT_Select_Size(face, 0); + } + if(error) { + FT_ERROR_MSG("FT_Set_Pixel_Sizes", error); + lv_mutex_unlock(&dsc->cache_node->face_lock); + return false; + } + + if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { + error = FT_Load_Glyph(face, glyph_index, FT_LOAD_COMPUTE_METRICS | FT_LOAD_NO_BITMAP | FT_LOAD_NO_AUTOHINT); + } + else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { + error = FT_Load_Glyph(face, glyph_index, FT_LOAD_COMPUTE_METRICS | FT_LOAD_NO_AUTOHINT); + } + if(error) { + FT_ERROR_MSG("FT_Load_Glyph", error); + lv_mutex_unlock(&dsc->cache_node->face_lock); + LV_PROFILER_FONT_END; + return false; + } + + FT_GlyphSlot glyph = face->glyph; + + if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) { + + dsc_out->adv_w = FT_F26DOT6_TO_INT(glyph->metrics.horiAdvance); + dsc_out->box_h = FT_F26DOT6_TO_INT(glyph->metrics.height); /*Height of the bitmap in [px]*/ + dsc_out->box_w = FT_F26DOT6_TO_INT(glyph->metrics.width); /*Width of the bitmap in [px]*/ + dsc_out->ofs_x = FT_F26DOT6_TO_INT(glyph->metrics.horiBearingX); /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = FT_F26DOT6_TO_INT(glyph->metrics.horiBearingY - + glyph->metrics.height); /*Y offset of the bitmap measured from the as line*/ + dsc_out->format = LV_FONT_GLYPH_FORMAT_VECTOR; + + /*Transform the glyph to italic if required */ + if(dsc->style & LV_FREETYPE_FONT_STYLE_ITALIC) { + dsc_out->box_w = lv_freetype_italic_transform_on_pos((lv_point_t) { + dsc_out->box_w, dsc_out->box_h + }); + } + } + else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) { + FT_Bitmap * glyph_bitmap = &face->glyph->bitmap; + + dsc_out->adv_w = FT_F26DOT6_TO_INT(glyph->advance.x); /*Width of the glyph in [pf]*/ + dsc_out->box_h = glyph_bitmap->rows; /*Height of the bitmap in [px]*/ + dsc_out->box_w = glyph_bitmap->width; /*Width of the bitmap in [px]*/ + dsc_out->ofs_x = glyph->bitmap_left; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = glyph->bitmap_top - + dsc_out->box_h; /*Y offset of the bitmap measured from the as line*/ + if(glyph->format == FT_GLYPH_FORMAT_BITMAP) + dsc_out->format = LV_FONT_GLYPH_FORMAT_IMAGE; + else + dsc_out->format = LV_FONT_GLYPH_FORMAT_A8; + } + + dsc_out->is_placeholder = glyph_index == 0; + dsc_out->gid.index = (uint32_t)glyph_index; + + lv_mutex_unlock(&dsc->cache_node->face_lock); + + LV_PROFILER_FONT_END; + return true; +} +static void freetype_glyph_free_cb(lv_freetype_glyph_cache_data_t * data, void * user_data) +{ + LV_UNUSED(data); + LV_UNUSED(user_data); +} +static lv_cache_compare_res_t freetype_glyph_compare_cb(const lv_freetype_glyph_cache_data_t * lhs, + const lv_freetype_glyph_cache_data_t * rhs) +{ + if(lhs->unicode != rhs->unicode) { + return lhs->unicode > rhs->unicode ? 1 : -1; + } + if(lhs->size != rhs->size) { + return lhs->size > rhs->size ? 1 : -1; + } + return 0; +} + +#endif /*LV_USE_FREETYPE*/ diff --git a/inc/lvgl/src/libs/freetype/lv_freetype_image.c b/inc/lvgl/src/libs/freetype/lv_freetype_image.c new file mode 100755 index 0000000..b51b21f --- /dev/null +++ b/inc/lvgl/src/libs/freetype/lv_freetype_image.c @@ -0,0 +1,226 @@ +/** + * @file lv_freetype_image.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../lvgl.h" +#include "lv_freetype_private.h" + +#if LV_USE_FREETYPE + +#include "../../core/lv_global.h" + +#define font_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->font_draw_buf_handlers) + +/********************* + * DEFINES + *********************/ + +#define CACHE_NAME "FREETYPE_IMAGE" + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_freetype_image_cache_data_t { + FT_UInt glyph_index; + uint32_t size; + + lv_draw_buf_t * draw_buf; +} lv_freetype_image_cache_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); + +static bool freetype_image_create_cb(lv_freetype_image_cache_data_t * data, void * user_data); +static void freetype_image_free_cb(lv_freetype_image_cache_data_t * node, void * user_data); +static lv_cache_compare_res_t freetype_image_compare_cb(const lv_freetype_image_cache_data_t * lhs, + const lv_freetype_image_cache_data_t * rhs); + +static void freetype_image_release_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_cache_t * lv_freetype_create_draw_data_image(uint32_t cache_size) +{ + lv_cache_ops_t ops = { + .compare_cb = (lv_cache_compare_cb_t)freetype_image_compare_cb, + .create_cb = (lv_cache_create_cb_t)freetype_image_create_cb, + .free_cb = (lv_cache_free_cb_t)freetype_image_free_cb, + }; + + lv_cache_t * draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_image_cache_data_t), + cache_size, ops); + lv_cache_set_name(draw_data_cache, CACHE_NAME); + + return draw_data_cache; +} + +void lv_freetype_set_cbs_image_font(lv_freetype_font_dsc_t * dsc) +{ + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + dsc->font.get_glyph_bitmap = freetype_get_glyph_bitmap_cb; + dsc->font.release_glyph = freetype_image_release_cb; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) +{ + LV_UNUSED(draw_buf); + LV_PROFILER_FONT_BEGIN; + const lv_font_t * font = g_dsc->resolved_font; + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + + FT_UInt glyph_index = (FT_UInt)g_dsc->gid.index; + + lv_cache_t * cache = dsc->cache_node->draw_data_cache; + + lv_freetype_image_cache_data_t search_key = { + .glyph_index = glyph_index, + .size = dsc->size, + }; + + lv_cache_entry_t * entry = lv_cache_acquire_or_create(cache, &search_key, dsc); + if(entry == NULL) { + LV_LOG_ERROR("glyph bitmap lookup failed for glyph_index = 0x%" LV_PRIx32, (uint32_t)glyph_index); + LV_PROFILER_FONT_END; + return NULL; + } + + g_dsc->entry = entry; + lv_freetype_image_cache_data_t * cache_node = lv_cache_entry_get_data(entry); + + LV_PROFILER_FONT_END; + return cache_node->draw_buf; +} + +static void freetype_image_release_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc) +{ + LV_ASSERT_NULL(font); + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + lv_cache_release(dsc->cache_node->draw_data_cache, g_dsc->entry, NULL); + g_dsc->entry = NULL; +} + +/*----------------- + * Cache Callbacks + *----------------*/ + +static bool freetype_image_create_cb(lv_freetype_image_cache_data_t * data, void * user_data) +{ + LV_PROFILER_FONT_BEGIN; + + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)user_data; + + FT_Error error; + + lv_mutex_lock(&dsc->cache_node->face_lock); + + FT_Face face = dsc->cache_node->face; + if(FT_IS_SCALABLE(face)) { + error = FT_Set_Pixel_Sizes(face, 0, dsc->size); + } + else { + error = FT_Select_Size(face, 0); + } + if(error) { + FT_ERROR_MSG("FT_Set_Pixel_Sizes", error); + lv_mutex_unlock(&dsc->cache_node->face_lock); + return false; + } + error = FT_Load_Glyph(face, data->glyph_index, + FT_LOAD_COLOR | FT_LOAD_RENDER | FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_AUTOHINT); + if(error) { + FT_ERROR_MSG("FT_Load_Glyph", error); + lv_mutex_unlock(&dsc->cache_node->face_lock); + LV_PROFILER_FONT_END; + return false; + } + error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); + if(error) { + FT_ERROR_MSG("FT_Render_Glyph", error); + lv_mutex_unlock(&dsc->cache_node->face_lock); + LV_PROFILER_FONT_END; + return false; + } + + FT_Glyph glyph; + error = FT_Get_Glyph(face->glyph, &glyph); + if(error) { + FT_ERROR_MSG("FT_Get_Glyph", error); + lv_mutex_unlock(&dsc->cache_node->face_lock); + LV_PROFILER_FONT_END; + return false; + } + + FT_BitmapGlyph glyph_bitmap = (FT_BitmapGlyph)glyph; + + uint16_t box_h = glyph_bitmap->bitmap.rows; /*Height of the bitmap in [px]*/ + uint16_t box_w = glyph_bitmap->bitmap.width; /*Width of the bitmap in [px]*/ + + lv_color_format_t col_format; + if(glyph_bitmap->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA) { + col_format = LV_COLOR_FORMAT_ARGB8888; + } + else { + col_format = LV_COLOR_FORMAT_A8; + } + uint32_t pitch = glyph_bitmap->bitmap.pitch; + uint32_t stride = lv_draw_buf_width_to_stride(box_w, col_format); + data->draw_buf = lv_draw_buf_create_ex(font_draw_buf_handlers, box_w, box_h, col_format, stride); + if(!data->draw_buf) { + LV_LOG_WARN("Could not create draw buffer"); + FT_Done_Glyph(glyph); + LV_PROFILER_FONT_END; + return false; + } + lv_draw_buf_clear(data->draw_buf, NULL); + + for(int y = 0; y < box_h; ++y) { + lv_memcpy((uint8_t *)(data->draw_buf->data) + y * stride, glyph_bitmap->bitmap.buffer + y * pitch, + pitch); + } + + lv_draw_buf_flush_cache(data->draw_buf, NULL); + FT_Done_Glyph(glyph); + lv_mutex_unlock(&dsc->cache_node->face_lock); + LV_PROFILER_FONT_END; + return true; +} +static void freetype_image_free_cb(lv_freetype_image_cache_data_t * data, void * user_data) +{ + LV_UNUSED(user_data); + lv_draw_buf_destroy(data->draw_buf); +} +static lv_cache_compare_res_t freetype_image_compare_cb(const lv_freetype_image_cache_data_t * lhs, + const lv_freetype_image_cache_data_t * rhs) +{ + if(lhs->glyph_index != rhs->glyph_index) { + return lhs->glyph_index > rhs->glyph_index ? 1 : -1; + } + if(lhs->size != rhs->size) { + return lhs->size > rhs->size ? 1 : -1; + } + return 0; +} + +#endif /*LV_USE_FREETYPE*/ diff --git a/inc/lvgl/src/libs/freetype/lv_freetype_outline.c b/inc/lvgl/src/libs/freetype/lv_freetype_outline.c new file mode 100755 index 0000000..f7d5edb --- /dev/null +++ b/inc/lvgl/src/libs/freetype/lv_freetype_outline.c @@ -0,0 +1,481 @@ +/** + * @file lv_freetype_outline.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../misc/lv_event_private.h" +#include "../../lvgl.h" +#include "lv_freetype_private.h" + +#if LV_USE_FREETYPE + +/********************* + * DEFINES + *********************/ + +#define CACHE_NAME "FREETYPE_OUTLINE" + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_freetype_outline_node_t { + FT_UInt glyph_index; + lv_freetype_outline_t outline; +} lv_freetype_outline_node_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_freetype_outline_t outline_create(lv_freetype_context_t * ctx, FT_Face face, FT_UInt glyph_index, + uint32_t size, uint32_t strength, uint32_t border_width); +static lv_result_t outline_delete(lv_freetype_context_t * ctx, lv_freetype_outline_t outline); +static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); +static void freetype_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc); + +static lv_cache_entry_t * lv_freetype_outline_lookup(lv_freetype_font_dsc_t * dsc, FT_UInt glyph_index); + +/*glyph dsc cache lru callbacks*/ +static bool freetype_glyph_outline_create_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc); +static void freetype_glyph_outline_free_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc); +static lv_cache_compare_res_t freetype_glyph_outline_cmp_cb(const lv_freetype_outline_node_t * node_a, + const lv_freetype_outline_node_t * node_b); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_cache_t * lv_freetype_create_draw_data_outline(uint32_t cache_size) +{ + lv_cache_ops_t glyph_outline_cache_ops = { + .create_cb = (lv_cache_create_cb_t)freetype_glyph_outline_create_cb, + .free_cb = (lv_cache_free_cb_t)freetype_glyph_outline_free_cb, + .compare_cb = (lv_cache_compare_cb_t)freetype_glyph_outline_cmp_cb, + }; + + lv_cache_t * draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_outline_node_t), + cache_size, + glyph_outline_cache_ops); + lv_cache_set_name(draw_data_cache, CACHE_NAME); + + return draw_data_cache; +} + +void lv_freetype_set_cbs_outline_font(lv_freetype_font_dsc_t * dsc) +{ + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + dsc->font.get_glyph_bitmap = freetype_get_glyph_bitmap_cb; + dsc->font.release_glyph = freetype_release_glyph_cb; +} + +void lv_freetype_outline_add_event(lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data) +{ + LV_UNUSED(user_data); + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + LV_UNUSED(filter); + ctx->event_cb = event_cb; +} + +uint32_t lv_freetype_outline_get_scale(const lv_font_t * font) +{ + LV_ASSERT_NULL(font); + const lv_freetype_font_dsc_t * dsc = font->dsc; + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + + return FT_INT_TO_F26DOT6(dsc->size) / dsc->cache_node->ref_size; +} + +bool lv_freetype_is_outline_font(const lv_font_t * font) +{ + LV_ASSERT_NULL(font); + const lv_freetype_font_dsc_t * dsc = font->dsc; + if(!LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc)) { + return false; + } + + return dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*------------------- + * OUTLINE CACHE + *------------------*/ + +static bool freetype_glyph_outline_create_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc) +{ + LV_PROFILER_FONT_BEGIN; + lv_freetype_outline_t outline; + + lv_mutex_lock(&dsc->cache_node->face_lock); + outline = outline_create(dsc->context, + dsc->cache_node->face, + node->glyph_index, + dsc->cache_node->ref_size, + dsc->style & LV_FREETYPE_FONT_STYLE_BOLD ? 1 : 0, + dsc->outline_stroke_width); + lv_mutex_unlock(&dsc->cache_node->face_lock); + + if(!outline) { + LV_PROFILER_FONT_END; + return false; + } + + LV_LOG_INFO("glyph_index = 0x%" LV_PRIx32, (uint32_t)node->glyph_index); + + node->outline = outline; + LV_PROFILER_FONT_END; + return true; +} + +static void freetype_glyph_outline_free_cb(lv_freetype_outline_node_t * node, lv_freetype_font_dsc_t * dsc) +{ + LV_UNUSED(dsc); + + lv_freetype_outline_t outline = node->outline; + lv_freetype_context_t * ctx = lv_freetype_get_context(); + outline_delete(ctx, outline); +} + +static lv_cache_compare_res_t freetype_glyph_outline_cmp_cb(const lv_freetype_outline_node_t * node_a, + const lv_freetype_outline_node_t * node_b) +{ + if(node_a->glyph_index == node_b->glyph_index) { + return 0; + } + return node_a->glyph_index > node_b->glyph_index ? 1 : -1; +} + +static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) +{ + LV_UNUSED(draw_buf); + + const lv_font_t * font = g_dsc->resolved_font; + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + LV_ASSERT_FREETYPE_FONT_DSC(dsc); + + dsc->outline_stroke_width = g_dsc->outline_stroke_width; + + lv_cache_entry_t * entry = lv_freetype_outline_lookup(dsc, (FT_UInt)g_dsc->gid.index); + + if(entry == NULL) { + return NULL; + } + lv_freetype_outline_node_t * node = lv_cache_entry_get_data(entry); + + g_dsc->entry = entry; + + return node ? node->outline : NULL; +} + +static void freetype_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc) +{ + LV_ASSERT_NULL(font); + lv_freetype_font_dsc_t * dsc = (lv_freetype_font_dsc_t *)font->dsc; + + if(g_dsc->entry == NULL) { + return; + } + lv_cache_release(dsc->cache_node->draw_data_cache, g_dsc->entry, NULL); + g_dsc->entry = NULL; +} + +static lv_cache_entry_t * lv_freetype_outline_lookup(lv_freetype_font_dsc_t * dsc, FT_UInt glyph_index) +{ + LV_PROFILER_FONT_BEGIN; + lv_freetype_cache_node_t * cache_node = dsc->cache_node; + + lv_freetype_outline_node_t tmp_node; + tmp_node.glyph_index = glyph_index; + + lv_cache_entry_t * entry = lv_cache_acquire_or_create(cache_node->draw_data_cache, &tmp_node, dsc); + if(!entry) { + LV_LOG_ERROR("glyph outline lookup failed for glyph_index = 0x%" LV_PRIx32, (uint32_t)glyph_index); + LV_PROFILER_FONT_END; + return NULL; + } + LV_PROFILER_FONT_END; + return entry; +} + +static void ft_vector_to_lv_vector(lv_freetype_outline_vector_t * dest, const FT_Vector * src) +{ + dest->x = src ? src->x : 0; + dest->y = src ? src->y : 0; +} + +static lv_result_t outline_send_event(lv_freetype_context_t * ctx, lv_event_code_t code, + lv_freetype_outline_event_param_t * param) +{ + if(!ctx->event_cb) { + LV_LOG_ERROR("event_cb is not set"); + return LV_RESULT_INVALID; + } + + lv_event_t e; + lv_memzero(&e, sizeof(e)); + e.code = code; + e.param = param; + e.user_data = NULL; + + ctx->event_cb(&e); + + return LV_RESULT_OK; +} + +static lv_result_t outline_push_point( + lv_freetype_outline_t outline, + lv_freetype_outline_type_t type, + const FT_Vector * control1, + const FT_Vector * control2, + const FT_Vector * to) +{ + LV_PROFILER_FONT_BEGIN; + lv_freetype_context_t * ctx = lv_freetype_get_context(); + + lv_freetype_outline_event_param_t param; + lv_memzero(¶m, sizeof(param)); + param.outline = outline; + param.type = type; + ft_vector_to_lv_vector(¶m.control1, control1); + ft_vector_to_lv_vector(¶m.control2, control2); + ft_vector_to_lv_vector(¶m.to, to); + + LV_PROFILER_FONT_END; + return outline_send_event(ctx, LV_EVENT_INSERT, ¶m); +} + +static int outline_move_to_cb( + const FT_Vector * to, + void * user) +{ + lv_freetype_outline_t outline = user; + outline_push_point(outline, LV_FREETYPE_OUTLINE_MOVE_TO, NULL, NULL, to); + return FT_Err_Ok; +} + +static int outline_line_to_cb( + const FT_Vector * to, + void * user) +{ + lv_freetype_outline_t outline = user; + outline_push_point(outline, LV_FREETYPE_OUTLINE_LINE_TO, NULL, NULL, to); + return FT_Err_Ok; +} + +static int outline_conic_to_cb( + const FT_Vector * control, + const FT_Vector * to, + void * user) +{ + lv_freetype_outline_t outline = user; + outline_push_point(outline, LV_FREETYPE_OUTLINE_CONIC_TO, control, NULL, to); + return FT_Err_Ok; +} + +static int outline_cubic_to_cb( + const FT_Vector * control1, + const FT_Vector * control2, + const FT_Vector * to, + void * user) +{ + lv_freetype_outline_t outline = user; + outline_push_point(outline, LV_FREETYPE_OUTLINE_CUBIC_TO, control1, control2, to); + return FT_Err_Ok; +} + +static lv_freetype_outline_t outline_create( + lv_freetype_context_t * ctx, + FT_Face face, + FT_UInt glyph_index, + uint32_t size, + uint32_t strength, + uint32_t border_width) +{ + LV_PROFILER_FONT_BEGIN; + LV_ASSERT_NULL(ctx); + FT_Error error; + FT_Glyph glyph; + FT_Stroker stroker; + + error = FT_Set_Pixel_Sizes(face, 0, size); + if(error) { + FT_ERROR_MSG("FT_Set_Char_Size", error); + LV_PROFILER_FONT_END; + return NULL; + } + + + /** + * Disable AUTOHINT(https://freetype.org/autohinting/hinter.html) to avoid display clipping + * caused by inconsistent glyph measurement and outline. + */ + error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP | FT_LOAD_NO_AUTOHINT); + if(error) { + FT_ERROR_MSG("FT_Load_Glyph", error); + LV_PROFILER_FONT_END; + return NULL; + } + + if(strength > 0) { + error = FT_Outline_Embolden(&face->glyph->outline, FT_INT_TO_F26DOT6(strength)); + if(error) { + FT_ERROR_MSG("FT_Outline_Embolden", error); + } + } + + + FT_Outline_Funcs outline_funcs = { + .move_to = outline_move_to_cb, + .line_to = outline_line_to_cb, + .conic_to = outline_conic_to_cb, + .cubic_to = outline_cubic_to_cb, + .shift = 0, + .delta = 0 + }; + + lv_result_t res; + lv_freetype_outline_event_param_t param; + lv_memzero(¶m, sizeof(param)); + + lv_freetype_outline_t outline; + + res = outline_send_event(ctx, LV_EVENT_CREATE, ¶m); + outline = param.outline; + + if(res != LV_RESULT_OK || !outline) { + LV_LOG_ERROR("Outline object create failed"); + LV_PROFILER_FONT_END; + return NULL; + } + + /* 1 iteration if there is no border */ + /* 2 iterations if there is a a border and the glyph itsef */ + for(int i = 0; i < (border_width > 0 ? 2 : 1); i++) { + + FT_Outline glyph_outline; + + if(i == 1) { + + /* decompose the border glyph */ + FT_Stroker_New(ctx->library, &stroker); + FT_Stroker_Set(stroker, border_width * 64, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINEJOIN_ROUND, + 0); + + FT_Get_Glyph(face->glyph, &glyph); + FT_Glyph_StrokeBorder(&glyph, stroker, 0, true); + FT_OutlineGlyph g = (FT_OutlineGlyph) glyph; + + FT_Stroker_Done(stroker); + + glyph_outline = g->outline; + + } + else { + + /* decompose glyph */ + glyph_outline = face->glyph->outline; + } + + /*Calculate Total Segments Before decompose */ + int32_t tag_size = glyph_outline.n_points; + int32_t segments = 0; + int32_t vectors = 0; + + for(int j = 0; j < tag_size; j++) { + +#if 0 + if(j == 0 && (glyph_outline.tags[j] & 0x1) == 0) { + /* TODO handle the case where the first point is 'off curve' */ +https://stackoverflow.com/questions/3465809/how-to-interpret-a-freetype-glyph-outline-when-the-first-point-on-the-contour-is + } +#endif + if((glyph_outline.tags[j] & 0x1) == 0x1) { + segments++; + vectors++; + } + else { + int jj = j + 1 < tag_size ? j + 1 : 0; + if(glyph_outline.tags[jj] & 0x1) { + vectors++; + } + else { + segments++; + vectors += 2; + } + } + } + + /*Also for every contour we may have a line for close*/ + segments += glyph_outline.n_contours; + vectors += glyph_outline.n_contours; + + param.sizes.data_size = vectors * 2; + param.sizes.segments_size = segments; + + /* Run outline decompose again to fill outline data */ + error = FT_Outline_Decompose(&glyph_outline, &outline_funcs, outline); + if(error) { + FT_ERROR_MSG("FT_Outline_Decompose", error); + outline_delete(ctx, outline); + LV_PROFILER_FONT_END; + return NULL; + } + + if(i == 0 && border_width > 0) { + + /* Close the border glyph before decomposing the inside glyph */ + res = outline_push_point(outline, LV_FREETYPE_OUTLINE_BORDER_START, NULL, NULL, NULL); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Outline object close failed"); + outline_delete(ctx, outline); + LV_PROFILER_FONT_END; + return NULL; + } + + } + else if(i == 0 || (i == 1 && border_width > 0)) { + + /* Close the border glyph or the regular glyph */ + res = outline_push_point(outline, LV_FREETYPE_OUTLINE_END, NULL, NULL, NULL); + if(res != LV_RESULT_OK) { + LV_LOG_ERROR("Outline object close failed"); + outline_delete(ctx, outline); + LV_PROFILER_FONT_END; + return NULL; + } + } + } + + LV_PROFILER_FONT_END; + return outline; +} + +static lv_result_t outline_delete(lv_freetype_context_t * ctx, lv_freetype_outline_t outline) +{ + lv_freetype_outline_event_param_t param; + lv_memzero(¶m, sizeof(param)); + param.outline = outline; + + return outline_send_event(ctx, LV_EVENT_DELETE, ¶m); +} + +#endif /*LV_USE_FREETYPE*/ diff --git a/inc/lvgl/src/libs/freetype/lv_freetype_private.h b/inc/lvgl/src/libs/freetype/lv_freetype_private.h new file mode 100755 index 0000000..86c314e --- /dev/null +++ b/inc/lvgl/src/libs/freetype/lv_freetype_private.h @@ -0,0 +1,161 @@ +/** + * @file lv_freetype_private.h + * + */ + +#ifndef LV_FREETYPE_PRIVATE_H +#define LV_FREETYPE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_freetype.h" + +#if LV_USE_FREETYPE + +#include "../../misc/cache/lv_cache.h" +#include "../../misc/lv_ll.h" +#include "../../font/lv_font.h" +#include "ft2build.h" +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include FT_CACHE_H +#include FT_SIZES_H +#include FT_IMAGE_H +#include FT_OUTLINE_H +#include FT_STROKER_H + +/********************* + * DEFINES + *********************/ + +#ifdef FT_CONFIG_OPTION_ERROR_STRINGS +#define FT_ERROR_MSG(msg, error_code) \ + LV_LOG_ERROR(msg " error(0x%x): %s", (int)error_code, FT_Error_String(error_code)) +#else +#define FT_ERROR_MSG(msg, error_code) \ + LV_LOG_ERROR(msg " error(0x%x)", (int)error_code) +#endif + +#define LV_FREETYPE_FONT_DSC_MAGIC_NUM 0x5F5F4654 /* '__FT' */ +#define LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc) ((dsc)->magic_num == LV_FREETYPE_FONT_DSC_MAGIC_NUM) +#define LV_ASSERT_FREETYPE_FONT_DSC(dsc) \ + do { \ + LV_ASSERT_NULL(dsc); \ + LV_ASSERT_FORMAT_MSG(LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc), \ + "Invalid font descriptor: 0x%" LV_PRIx32, (dsc)->magic_num); \ + } while (0) + +#define FT_INT_TO_F26DOT6(x) ((x) << 6) +#define FT_F26DOT6_TO_INT(x) ((x) >> 6) + +#define FT_INT_TO_F16DOT16(x) ((x) << 16) +#define FT_F16DOT16_TO_INT(x) ((x) >> 16) + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_freetype_outline_vector_t { + int32_t x; + int32_t y; +}; + +typedef struct { + int32_t segments_size; + int32_t data_size; +} lv_freetype_outline_sizes_t; + +struct _lv_freetype_outline_event_param_t { + lv_freetype_outline_t outline; + lv_freetype_outline_type_t type; + lv_freetype_outline_vector_t to; + lv_freetype_outline_vector_t control1; + lv_freetype_outline_vector_t control2; + lv_freetype_outline_sizes_t sizes; +}; + + +typedef struct _lv_freetype_cache_node_t lv_freetype_cache_node_t; + +struct _lv_freetype_cache_node_t { + const char * pathname; + lv_freetype_font_style_t style; + lv_freetype_font_render_mode_t render_mode; + + uint32_t ref_size; /**< Reference size for calculating outline glyph's real size.*/ + + FT_Face face; + lv_mutex_t face_lock; + bool face_has_kerning; + + /*glyph cache*/ + lv_cache_t * glyph_cache; + + /*draw data cache*/ + lv_cache_t * draw_data_cache; +}; + +typedef struct _lv_freetype_context_t { + FT_Library library; + lv_ll_t face_id_ll; + lv_event_cb_t event_cb; + + uint32_t max_glyph_cnt; + + lv_cache_t * cache_node_cache; +} lv_freetype_context_t; + +typedef struct _lv_freetype_font_dsc_t { + uint32_t magic_num; + lv_font_t font; + uint32_t size; + lv_freetype_font_style_t style; + lv_freetype_font_render_mode_t render_mode; + lv_freetype_context_t * context; + lv_freetype_cache_node_t * cache_node; + lv_cache_entry_t * cache_node_entry; + FTC_FaceID face_id; + uint32_t outline_stroke_width; + lv_font_kerning_t kerning; +} lv_freetype_font_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the FreeType context. + * + * @return A pointer to the FreeType context used by LittlevGL. + */ +lv_freetype_context_t * lv_freetype_get_context(void); + +void lv_freetype_italic_transform(FT_Face face); +int32_t lv_freetype_italic_transform_on_pos(lv_point_t point); + +lv_cache_t * lv_freetype_create_glyph_cache(uint32_t cache_size); +void lv_freetype_set_cbs_glyph(lv_freetype_font_dsc_t * dsc); + +lv_cache_t * lv_freetype_create_draw_data_image(uint32_t cache_size); +void lv_freetype_set_cbs_image_font(lv_freetype_font_dsc_t * dsc); + +lv_cache_t * lv_freetype_create_draw_data_outline(uint32_t cache_size); +void lv_freetype_set_cbs_outline_font(lv_freetype_font_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FREETYPE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FREETYPE_PRIVATE_H*/ diff --git a/inc/lvgl/src/libs/freetype/lv_ftsystem.c b/inc/lvgl/src/libs/freetype/lv_ftsystem.c new file mode 100644 index 0000000..ee0e836 --- /dev/null +++ b/inc/lvgl/src/libs/freetype/lv_ftsystem.c @@ -0,0 +1,291 @@ +/** + * @file lv_ftsystem.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl.h" +#if LV_USE_FREETYPE && LV_FREETYPE_USE_LVGL_PORT + +#include +#include FT_CONFIG_CONFIG_H +#include +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/* The macro FT_COMPONENT is used in trace mode. It is an implicit + * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log + * messages during execution. + */ +#undef FT_COMPONENT +#define FT_COMPONENT io + +/* We use the macro STREAM_FILE for convenience to extract the */ +/* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (lv_fs_file_t*)stream->descriptor.pointer ) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +FT_CALLBACK_DEF(unsigned long) +ft_lv_fs_stream_io(FT_Stream stream, + unsigned long offset, + unsigned char * buffer, + unsigned long count); +FT_CALLBACK_DEF(void) +ft_lv_fs_stream_close(FT_Stream stream); +FT_CALLBACK_DEF(void *) +ft_alloc(FT_Memory memory, + long size); +FT_CALLBACK_DEF(void *) +ft_realloc(FT_Memory memory, + long cur_size, + long new_size, + void * block); +FT_CALLBACK_DEF(void) +ft_free(FT_Memory memory, + void * block); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init(FT_Memory memory); + + extern void + ft_mem_debug_done(FT_Memory memory); + +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT + +/* documentation is in ftstream.h */ + +FT_BASE_DEF(FT_Error) +FT_Stream_Open(FT_Stream stream, + const char * filepathname) +{ + lv_fs_file_t file; + + if(!stream) + return FT_THROW(Invalid_Stream_Handle); + + stream->descriptor.pointer = NULL; + stream->pathname.pointer = (char *)filepathname; + stream->base = NULL; + stream->pos = 0; + stream->read = NULL; + stream->close = NULL; + + lv_fs_res_t res = lv_fs_open(&file, filepathname, LV_FS_MODE_RD); + + if(res != LV_FS_RES_OK) { + FT_ERROR(("FT_Stream_Open:" + " could not open `%s'\n", filepathname)); + + return FT_THROW(Cannot_Open_Resource); + } + + lv_fs_seek(&file, 0, LV_FS_SEEK_END); + + uint32_t pos; + res = lv_fs_tell(&file, &pos); + if(res != LV_FS_RES_OK) { + FT_ERROR(("FT_Stream_Open:")); + FT_ERROR((" opened `%s' but zero-sized\n", filepathname)); + lv_fs_close(&file); + return FT_THROW(Cannot_Open_Stream); + } + stream->size = pos; + lv_fs_seek(&file, 0, LV_FS_SEEK_SET); + + lv_fs_file_t * file_p = lv_malloc(sizeof(lv_fs_file_t)); + LV_ASSERT_MALLOC(file_p); + + if(!file_p) { + FT_ERROR(("FT_Stream_Open: malloc failed for file_p")); + lv_fs_close(&file); + return FT_THROW(Cannot_Open_Stream); + } + + *file_p = file; + + stream->descriptor.pointer = file_p; + stream->read = ft_lv_fs_stream_io; + stream->close = ft_lv_fs_stream_close; + + FT_TRACE1(("FT_Stream_Open:")); + FT_TRACE1((" opened `%s' (%ld bytes) successfully\n", + filepathname, stream->size)); + + return FT_Err_Ok; +} + +#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + +/* documentation is in ftobjs.h */ + +FT_BASE_DEF(FT_Memory) +FT_New_Memory(void) +{ + FT_Memory memory; + + memory = (FT_Memory)lv_malloc(sizeof(*memory)); + if(memory) { + memory->user = NULL; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init(memory); +#endif + } + + return memory; +} + +/* documentation is in ftobjs.h */ + +FT_BASE_DEF(void) +FT_Done_Memory(FT_Memory memory) +{ +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done(memory); +#endif + lv_free(memory); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * The memory allocation function. + * @param memory A pointer to the memory object. + * @param size The requested size in bytes. + * @return The address of newly allocated block. + */ +FT_CALLBACK_DEF(void *) +ft_alloc(FT_Memory memory, + long size) +{ + FT_UNUSED(memory); + + return lv_malloc((size_t)size); +} + +/** + * The memory reallocation function. + * @param memory A pointer to the memory object. + * @param cur_size The current size of the allocated memory block. + * @param new_size The newly requested size in bytes. + * @param block The current address of the block in memory. + * @return The address of the reallocated memory block. + */ +FT_CALLBACK_DEF(void *) +ft_realloc(FT_Memory memory, + long cur_size, + long new_size, + void * block) +{ + FT_UNUSED(memory); + FT_UNUSED(cur_size); + + return lv_realloc(block, (size_t)new_size); +} + +/** + * The memory release function. + * @param memory A pointer to the memory object. + * @param block The address of block in memory to be freed. + */ +FT_CALLBACK_DEF(void) +ft_free(FT_Memory memory, + void * block) +{ + FT_UNUSED(memory); + + lv_free(block); +} + +#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT + +/** + * The function to close a stream. + * @param stream A pointer to the stream object. + */ +FT_CALLBACK_DEF(void) +ft_lv_fs_stream_close(FT_Stream stream) +{ + lv_fs_file_t * file_p = STREAM_FILE(stream); + lv_fs_close(file_p); + lv_free(file_p); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = NULL; +} + +/** + * The function to open a stream. + * @param stream A pointer to the stream object. + * @param offset The position in the data stream to start reading. + * @param buffer The address of buffer to store the read data. + * @param count The number of bytes to read from the stream. + * @return The number of bytes actually read. If `count' is zero (this is, + * the function is used for seeking), a non-zero return value + * indicates an error. + */ +FT_CALLBACK_DEF(unsigned long) +ft_lv_fs_stream_io(FT_Stream stream, + unsigned long offset, + unsigned char * buffer, + unsigned long count) +{ + lv_fs_file_t * file_p; + + if(!count && offset > stream->size) + return 1; + + file_p = STREAM_FILE(stream); + + if(stream->pos != offset) + lv_fs_seek(file_p, (long)offset, LV_FS_SEEK_SET); + + if(count == 0) + return 0; + + uint32_t br; + lv_fs_res_t res = lv_fs_read(file_p, buffer, count, &br); + + return res == LV_FS_RES_OK ? br : 0; +} + +#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + +#endif/*LV_FREETYPE_USE_LV_FTSYSTEM*/ diff --git a/inc/lvgl/src/libs/frogfs/LICENSE.txt b/inc/lvgl/src/libs/frogfs/LICENSE.txt new file mode 100644 index 0000000..be2cc4d --- /dev/null +++ b/inc/lvgl/src/libs/frogfs/LICENSE.txt @@ -0,0 +1,362 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. diff --git a/inc/lvgl/src/libs/frogfs/include/frogfs/frogfs.h b/inc/lvgl/src/libs/frogfs/include/frogfs/frogfs.h new file mode 100644 index 0000000..fdc95ac --- /dev/null +++ b/inc/lvgl/src/libs/frogfs/include/frogfs/frogfs.h @@ -0,0 +1,260 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../../../lv_conf_internal.h" +#include LV_STDDEF_INCLUDE +#include LV_STDINT_INCLUDE +#include "frogfs_types.h" + +/** + * \brief Magic number used in the frogfs file header + */ +#define FROGFS_MAGIC 0x474F5246 /** FROG */ + +/** + * \brief Major version this source distribution supports + */ +#define FROGFS_VER_MAJOR 1 + +/** + * \brief Minor version this source distribution supports + */ +#define FROGFS_VER_MINOR 0 + +/** + * \brief Flag for \a frogfs_open to open any file as raw. Useful to + * pass compressed data over a transport such as HTTP. + */ +#define FROGFS_OPEN_RAW (1 << 0) + +/** + * \brief Enum of frogfs entry types + */ +typedef enum frogfs_entry_type_t { + FROGFS_ENTRY_TYPE_DIR, + FROGFS_ENTRY_TYPE_FILE, +} frogfs_entry_type_t; + +/** + * \brief Compression algorithm ids + */ +typedef enum frogfs_comp_algo_t { + FROGFS_COMP_ALGO_NONE, + FROGFS_COMP_ALGO_ZLIB, + FROGFS_COMP_ALGO_HEATSHRINK, + FROGFS_COMP_ALGO_GZIP, +} frogfs_comp_algo_t; + +/** + * \brief Configuration for the \a frogfs_init function + */ +typedef struct frogfs_config_t { + const void *addr; /**< address of an frogfs filesystem in memory */ +} frogfs_config_t; + +/** + * \brief A frogfs filesystem handle + */ +typedef struct frogfs_fs_t frogfs_fs_t; + +/** + * \brief Structure filled by the \a frogfs_stat function + */ +typedef struct frogfs_stat_t { + frogfs_entry_type_t type; /**< entry type */ + size_t size; /**< uncompressed file size */ + frogfs_comp_algo_t compression; /**< compression type */ + size_t compressed_sz; /**< compressed file size */ +} frogfs_stat_t; + +/** + * \brief Fiilesystem entry pointer +*/ +typedef struct frogfs_entry_t frogfs_entry_t; +typedef struct frogfs_dh_t frogfs_dh_t; +typedef struct frogfs_fh_t frogfs_fh_t; + +#if !defined(FROGFS_PRIVATE_STRUCTS) +/** + * \brief A frogfs directory handle + */ +struct frogfs_dh_t { + const frogfs_fs_t *fs; /**< filesystem handle */ + frogfs_entry_t *entry; /**< directory entry */ +}; + +/** + * \brief A frogfs file handle + */ +struct frogfs_fh_t { + const frogfs_fs_t *fs; /**< filesystem handle */ + frogfs_entry_t *entry; /**< file entry */ +}; +#endif + +/** + * \brief Initialize and return a \a frogfs_fs_t instance + * \param[in] config frogfs configuration + * \return \a frogfs_fs_t pointer or \a NULL on error + */ +frogfs_fs_t *frogfs_init(const frogfs_config_t *conf); + +/** + * \brief Tear down a \a frogfs_fs_t instance + * \param[in] fs \a frogfs_fs_t pointer + */ +void frogfs_deinit(frogfs_fs_t *fs); + +/** + * \brief Get frogfs entry for path + * \param[in] fs \a frogfs_fs_t pointer + * \param[in] path path string + * \return \a frogfs_entry_t pointer or \a NULL if path was not + * found + */ +const frogfs_entry_t *frogfs_get_entry(const frogfs_fs_t *fs, + const char *path); + +/** + * \brief Get name for frogfs entry + * \param[in] entry \a frogfs_entry_t pointer + * \return name string, caller is expected to free + */ +char *frogfs_get_name(const frogfs_entry_t *entry); + +/** + * \brief Get full path for frogfs entry + * \param[in] fs \a frogfs_fs_t pointer + * \param[in] entry \a frogfs_entry_t pointer + * \return full path string or \a NULL if entry is NULL, caller is + * expected to free + */ +char *frogfs_get_path(const frogfs_fs_t *fs, const frogfs_entry_t *entry); + +/** + * \brief Return if entry is a directory + * \param[in] entry \a frogfs_entry_t pointer + * \return 1 if directory, 0 otherwise + */ +int frogfs_is_dir(const frogfs_entry_t *entry); + +/** + * \brief Return if entry is a file + * \param[in] entry \a frogfs_entry_t pointer + * \return 1 if file, 0 otherwise + */ +int frogfs_is_file(const frogfs_entry_t *entry); + +/** + * \brief Get information about a frogfs entry + * \param[in] fs \a frogfs_fs_t pointer + * \param[in] entry \a frogfs_entry_t pointer + * \param[out] st \a frogfs_stat_t structure + */ +void frogfs_stat(const frogfs_fs_t *fs, const frogfs_entry_t *entry, + frogfs_stat_t *st); + +/** + * \brief Open a frogfs entry as a file from a \a frogfs_fs_t instance + * \param[in] fs \a frogfs_fs_t poitner + * \param[in] entry \a frogfs_entry_t pointer + * \param[in] flags open flags + * \return \a frogfs_fh_t or \a NULL if not found + */ +frogfs_fh_t *frogfs_open(const frogfs_fs_t *fs, const frogfs_entry_t *entry, + unsigned int flags); + +/** + * \brief Close an open file entry + * \param[in] f \a frogfs_fh_t pointer + */ +void frogfs_close(frogfs_fh_t *fh); + +/** + * \brief Determine if file handle is opened raw. + * \param[in] f \a frogfs_fh_t pointer + * \return 1 if file is open raw, 0 otherwise +*/ +int frogfs_is_raw(frogfs_fh_t *fh); + +/** + * \brief Read data from an open file entry + * \param[in] f \a frogfs_fh_t pointer + * \param[out] buf buffer to read into + * \param[in] len maximum number of bytes to read + * \return actual number of bytes read, zero if end of file + * reached + */ +ssize_t frogfs_read(frogfs_fh_t *fh, void *buf, size_t len); + +/** + * \brief Seek to a position within an open file entry + * \param[in] f \a frogfs_fh_t pointer + * \param[in] offset file position (relative or absolute) + * \param[in] mode \a SEEK_SET, \a SEEK_CUR, or \a SEEK_END + * \return current position in file or < 0 upon error + */ +ssize_t frogfs_seek(frogfs_fh_t *fh, long offset, int mode); + +/** + * \brief Get the current position in an open file entry + * \param[in] f \a frogfs_fh_t pointer + * \return current position in file or < 0 upon error + */ +size_t frogfs_tell(frogfs_fh_t *fh); + +/** + * \brief Get raw memory for raw file entry + * \param[in] f \a frogfs_fh_t pointer + * \param[out] buf pointer pointer to buf + * \return length of raw data + */ +size_t frogfs_access(frogfs_fh_t *fh, const void **buf); + +/** + * \brief Open a directory for reading child entrys + * \param[in] fs \a frogfs_fs_t pointer + * \param[in] entry \a frogfs_entry_t pointer to root director + * \return \a frogfs_dh_t pointer or \a NULL if invalid + */ +frogfs_dh_t *frogfs_opendir(frogfs_fs_t *fs, const frogfs_entry_t *entry); + +/** + * \brief Close a directory + * \param[in] d \a frogfs_dh_t pointer + */ +void frogfs_closedir(frogfs_dh_t *dh); + +/** + * \brief Get the next child entry in directory + * \param[in] d \a frogfs_dh_t pointer + * \return \a frogfs_entry_t pointer or \a NULL if end has been + * reached + */ +const frogfs_entry_t *frogfs_readdir(frogfs_dh_t *dh); + +/** + * \brief Set dir entry index to a value returned by \a frogfs_telldir + * for the current \a frogfs_dh_t pointer + * \param[in] d \a frogfs_dh_t pointer + * \param[in] loc entry index + */ +void frogfs_seekdir(frogfs_dh_t *dh, long loc); + +/** + * \brief Return the current entry index for a directory + * \param[in] d \a frogfs_dh_t pointer + * \return entry index + */ +long frogfs_telldir(frogfs_dh_t *dh); + +#ifdef __cplusplus +} /* extern "C" */ +#endif diff --git a/inc/lvgl/src/libs/frogfs/include/frogfs/frogfs_types.h b/inc/lvgl/src/libs/frogfs/include/frogfs/frogfs_types.h new file mode 100644 index 0000000..5ee1eed --- /dev/null +++ b/inc/lvgl/src/libs/frogfs/include/frogfs/frogfs_types.h @@ -0,0 +1,6 @@ +#pragma once + +#include "../../../../lv_conf_internal.h" +#include LV_STDINT_INCLUDE + +typedef intptr_t ssize_t; diff --git a/inc/lvgl/src/libs/frogfs/src/decomp_raw.c b/inc/lvgl/src/libs/frogfs/src/decomp_raw.c new file mode 100644 index 0000000..044c74e --- /dev/null +++ b/inc/lvgl/src/libs/frogfs/src/decomp_raw.c @@ -0,0 +1,77 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "../../../lv_conf_internal.h" +#include LV_STDDEF_INCLUDE +#include LV_STDINT_INCLUDE +#include "../../../stdlib/lv_string.h" +#include "../../../misc/lv_fs.h" + +#include "frogfs_priv.h" +#include "frogfs_format.h" +#include "../include/frogfs/frogfs.h" + + +static ssize_t read_raw(frogfs_fh_t *f, void *buf, size_t len) +{ + size_t remaining = f->data_sz - ((char *)f->data_ptr - (char *)f->data_start); + + if (len > remaining) { + len = remaining; + } + + if (buf) { + lv_memcpy(buf, f->data_ptr, len); + } + f->data_ptr = (char *)f->data_ptr + len; + + return len; +} + +static ssize_t seek_raw(frogfs_fh_t *f, long offset, int mode) +{ + ssize_t new_pos = (char *)f->data_ptr - (char *)f->data_start; + + if (mode == LV_FS_SEEK_SET) { + if (offset < 0) { + return -1; + } + if ((size_t)offset > f->data_sz) { + offset = f->data_sz; + } + new_pos = offset; + } else if (mode == LV_FS_SEEK_CUR) { + if (new_pos + offset < 0) { + new_pos = 0; + } else if ((size_t)new_pos > f->data_sz) { + new_pos = f->data_sz; + } else { + new_pos += offset; + } + } else if (mode == LV_FS_SEEK_END) { + if (offset > 0) { + return -1; + } + if (offset < -(ssize_t) f->data_sz) { + offset = 0; + } + new_pos = f->data_sz + offset; + } else { + return -1; + } + + f->data_ptr = (char *)f->data_start + new_pos; + return new_pos; +} + +static size_t tell_raw(frogfs_fh_t *f) +{ + return (char *)f->data_ptr - (char *)f->data_start; +} + +const frogfs_decomp_funcs_t frogfs_decomp_raw = { + .read = read_raw, + .seek = seek_raw, + .tell = tell_raw, +}; diff --git a/inc/lvgl/src/libs/frogfs/src/frogfs.c b/inc/lvgl/src/libs/frogfs/src/frogfs.c new file mode 100644 index 0000000..4c2ed1c --- /dev/null +++ b/inc/lvgl/src/libs/frogfs/src/frogfs.c @@ -0,0 +1,449 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * This is a read-only filesystem that uses a sorted hash table to locate + * entries in a monolithic binary. The binary is generated by the mkfrogfs + * tool that comes with this source distribution. + */ + +#include "../../../lv_conf_internal.h" +#if LV_USE_FS_FROGFS + +#include LV_INTTYPES_INCLUDE +#include LV_LIMITS_INCLUDE +#include LV_STDINT_INCLUDE +#include "../../../stdlib/lv_string.h" +#include "../../../stdlib/lv_mem.h" +#include "../../../misc/lv_log.h" +#include "../../../misc/lv_assert.h" +#include "../../../misc/lv_fs.h" + +#include "frogfs_priv.h" +#include "frogfs_format.h" +#include "../include/frogfs/frogfs.h" + + +typedef struct frogfs_fs_t { + const frogfs_head_t *head; /**< fs header pointer */ + const frogfs_hash_t *hash; /**< hash table pointer */ + const frogfs_dir_t *root; /**< root directory entry */ + int num_entries; /**< total number of file system entries */ +} frogfs_fs_t; + +// Returns the current or next highest multiple of 4. +static inline size_t align(size_t n) +{ + return ((n + 4 - 1) / 4) * 4; +} + +// String hashing function. +static inline uint32_t djb2_hash(const char *s) +{ + unsigned long hash = 5381; + + while (*s) { + /* hash = hash * 33 ^ c */ + hash = ((hash << 5) + hash) ^ *s++; + } + + return hash; +} + +static const char *get_name(const frogfs_entry_t *entry) +{ + if (FROGFS_IS_DIR(entry)) { + return (const void *) entry + 8 + (entry->u.child_count * 4); + } else if (FROGFS_IS_FILE(entry) && !FROGFS_IS_COMP(entry)) { + return (const void *) entry + 16; + } else { + return (const void *) entry + 20; + } +} + +frogfs_fs_t *frogfs_init(const frogfs_config_t *conf) +{ + frogfs_fs_t *fs = lv_calloc(1, sizeof(frogfs_fs_t)); + if (fs == NULL) { + LV_LOG_ERROR("calloc failed"); + return NULL; + } + + LV_LOG_TRACE("%p", fs); + + fs->head = (const void *) conf->addr; + if (fs->head == NULL) { + LV_LOG_ERROR("flash mmap not enabled and addr is NULL"); + goto err_out; + } + + if (fs->head->magic != FROGFS_MAGIC) { + LV_LOG_ERROR("frogfs magic not found"); + goto err_out; + } + + if (fs->head->ver_major != FROGFS_VER_MAJOR) { + LV_LOG_ERROR("frogfs major version mismatch. filesystem is v%d.%d and this " + "library is v%d.%d", fs->head->ver_major, fs->head->ver_minor, + FROGFS_VER_MAJOR, FROGFS_VER_MINOR); + goto err_out; + } + + fs->num_entries = fs->head->num_entries; + fs->hash = (const void *) fs->head + sizeof(frogfs_head_t); + fs->root = (const void *) fs->hash + (sizeof(frogfs_hash_t) * fs->num_entries); + + return fs; + +err_out: + frogfs_deinit(fs); + return NULL; +} + +void frogfs_deinit(frogfs_fs_t *fs) +{ + LV_LOG_TRACE("%p", fs); + + lv_free(fs); +} + +const frogfs_entry_t *frogfs_get_entry(const frogfs_fs_t *fs, const char *path) +{ + LV_ASSERT_NULL(fs); + LV_ASSERT_NULL(path); + + while (*path == '/') { + path++; + } + LV_LOG_TRACE("'%s'", path); + + uint32_t hash = djb2_hash(path); + LV_LOG_TRACE("hash %08"PRIx32, hash); + + int first = 0; + int last = fs->num_entries - 1; + int middle; + const frogfs_hash_t *e; + + while (first <= last) { + middle = first + (last - first) / 2; + e = &fs->hash[middle]; + if (e->hash == hash) { + break; + } else if (e->hash < hash) { + first = middle + 1; + } else { + last = middle - 1; + } + } + + if (first > last) { + LV_LOG_TRACE("no match"); + return NULL; + } + + /* move e to the first match */ + while (middle > 0) { + e = fs->hash + middle; + if ((e - 1)->hash != hash) { + break; + } + middle--; + } + + /* walk through canidates and look for a match */ + const frogfs_entry_t *entry; + do { + entry = (const void *) fs->head + e->offs; + char *match = frogfs_get_path(fs, entry); + if (lv_strcmp(path, match) == 0) { + lv_free(match); + LV_LOG_TRACE("entry %d", middle); + return entry; + } + lv_free(match); + entry++; + middle++; + } while ((middle < last) && (e->hash == hash)); + + LV_LOG_WARN("unable to find entry"); + return NULL; +} + +char *frogfs_get_name(const frogfs_entry_t *entry) +{ + char *name = lv_malloc(entry->seg_sz + 1); + lv_memcpy(name, get_name(entry), entry->seg_sz); + name[entry->seg_sz] = '\0'; + return name; +} + +char *frogfs_get_path(const frogfs_fs_t *fs, const frogfs_entry_t *entry) +{ + LV_ASSERT_NULL(entry); + + char *path = lv_calloc(LV_FS_MAX_PATH_LENGTH, 1); + size_t len = 0; + if (!path) { + return NULL; + } + + if (entry->parent == 0) { + return path; + } + + while (entry->parent != 0 && len + entry->seg_sz + 1 < LV_FS_MAX_PATH_LENGTH - 1) { + const frogfs_entry_t *parent = (const void *) fs->head + entry->parent; + if ((const void *) parent == (const void *) fs->root) { + lv_memmove(path + entry->seg_sz, path, len); + lv_memcpy(path, get_name(entry), entry->seg_sz); + len += entry->seg_sz; + break; + } else { + lv_memmove(path + entry->seg_sz + 1, path, len + 1); + path[0] = '/'; + lv_memcpy(path + 1, get_name(entry), entry->seg_sz); + len += entry->seg_sz + 1; + } + entry = parent; + } + + return path; +} + +int frogfs_is_dir(const frogfs_entry_t *entry) +{ + return FROGFS_IS_DIR(entry); +} + +int frogfs_is_file(const frogfs_entry_t *entry) +{ + return FROGFS_IS_FILE(entry); +} + +void frogfs_stat(const frogfs_fs_t *fs, const frogfs_entry_t *entry, + frogfs_stat_t *st) +{ + LV_ASSERT_NULL(fs); + LV_ASSERT_NULL(entry); + + lv_memset(st, 0, sizeof(*st)); + if (FROGFS_IS_DIR(entry)) { + st->type = FROGFS_ENTRY_TYPE_DIR; + } else { + st->type = FROGFS_ENTRY_TYPE_FILE; + const frogfs_file_t *file = (const void *) entry; + st->compression = entry->u.compression; + if (st->compression) { + const frogfs_comp_t *comp = (const void *) entry; + st->compressed_sz = comp->data_sz; + st->size = comp->real_sz; + } else { + st->compressed_sz = file->data_sz; + st->size = file->data_sz; + } + } +} + +frogfs_fh_t *frogfs_open(const frogfs_fs_t *fs, const frogfs_entry_t *entry, + unsigned int flags) +{ + LV_ASSERT_NULL(fs); + LV_ASSERT_NULL(entry); + + if (FROGFS_IS_DIR(entry)) { + return NULL; + } + + const frogfs_file_t *file = (const void *) entry; + + frogfs_fh_t *fh = lv_calloc(1, sizeof(frogfs_fh_t)); + if (fh == NULL) { + LV_LOG_ERROR("calloc failed"); + goto err_out; + } + + LV_LOG_TRACE("%p", fh); + + fh->fs = fs; + fh->file = file; + fh->data_start = (const void *) fs->head + file->data_offs; + fh->data_ptr = fh->data_start; + fh->data_sz = file->data_sz; + fh->flags = flags; + + if (entry->u.compression == 0 || flags & FROGFS_OPEN_RAW) { + fh->real_sz = file->data_sz; + fh->decomp_funcs = &frogfs_decomp_raw; + } +#if CONFIG_FROGFS_USE_MINIZ == 1 + else if ((entry->u.compression == FROGFS_COMP_ALGO_GZIP) || + (entry->u.compression == FROGFS_COMP_ALGO_ZLIB)) { + fh->real_sz = ((frogfs_comp_t *) file)->real_sz; + fh->decomp_funcs = &frogfs_decomp_miniz; + } +#endif +#if CONFIG_FROGFS_USE_ZLIB == 1 + else if ((entry->u.compression == FROGFS_COMP_ALGO_GZIP) || + (entry->u.compression == FROGFS_COMP_ALGO_ZLIB)) { + fh->real_sz = ((frogfs_comp_t *) file)->real_sz; + fh->decomp_funcs = &frogfs_decomp_zlib; + } +#endif +#if CONFIG_FROGFS_USE_HEATSHRINK == 1 + else if (entry->u.compression == FROGFS_COMP_ALGO_HEATSHRINK) { + fh->real_sz = ((frogfs_comp_t *) file)->real_sz; + fh->decomp_funcs = &frogfs_decomp_heatshrink; + } +#endif + else { + LV_LOG_ERROR("unsupported compression type %d", entry->u.compression); + goto err_out; + } + + if (fh->decomp_funcs->open) { + if (fh->decomp_funcs->open(fh, flags) < 0) { + LV_LOG_ERROR("decomp_funcs->fopen"); + goto err_out; + } + } + + return fh; + +err_out: + frogfs_close(fh); + return NULL; +} + +void frogfs_close(frogfs_fh_t *fh) +{ + if (fh == NULL) { + /* do nothing */ + return; + } + + if (fh->decomp_funcs && fh->decomp_funcs->close) { + fh->decomp_funcs->close(fh); + } + + LV_LOG_TRACE("%p", fh); + + lv_free(fh); +} + +int frogfs_is_raw(frogfs_fh_t *fh) +{ + return !!(fh->flags & FROGFS_OPEN_RAW); +} + +ssize_t frogfs_read(frogfs_fh_t *fh, void *buf, size_t len) +{ + LV_ASSERT_NULL(fh); + + if (fh->decomp_funcs->read) { + return fh->decomp_funcs->read(fh, buf, len); + } + + return -1; +} + +ssize_t frogfs_seek(frogfs_fh_t *fh, long offset, int mode) +{ + LV_ASSERT_NULL(fh); + + if (fh->decomp_funcs->seek) { + return fh->decomp_funcs->seek(fh, offset, mode); + } + + return -1; +} + +size_t frogfs_tell(frogfs_fh_t *fh) +{ + LV_ASSERT_NULL(fh); + + if (fh->decomp_funcs->tell) { + return fh->decomp_funcs->tell(fh); + } + + return -1; +} + +size_t frogfs_access(frogfs_fh_t *fh, const void **buf) +{ + LV_ASSERT_NULL(fh); + + *buf = fh->data_start; + return fh->data_sz; +} + +frogfs_dh_t *frogfs_opendir(frogfs_fs_t *fs, const frogfs_entry_t *entry) +{ + LV_ASSERT_NULL(fs); + + if (entry != NULL && FROGFS_IS_FILE(entry)) { + return NULL; + } + + frogfs_dh_t *dh = lv_calloc(1, sizeof(frogfs_dh_t)); + if (dh == NULL) { + LV_LOG_ERROR("calloc failed"); + return NULL; + } + + dh->fs = fs; + if (entry == NULL) { + dh->dir = fs->root; + } else { + dh->dir = (const void *) entry; + } + + return dh; +} + +void frogfs_closedir(frogfs_dh_t *dh) +{ + if (dh == NULL) { + return; + } + + lv_free(dh); +} + +const frogfs_entry_t *frogfs_readdir(frogfs_dh_t *dh) +{ + const frogfs_entry_t *entry = NULL; + + if (dh->dir == NULL) { + return NULL; + } + + if (dh->index < dh->dir->entry.u.child_count) { + entry = (const void *) dh->fs->head + dh->dir->children[dh->index]; + dh->index++; + } + + return entry; +} + +void frogfs_seekdir(frogfs_dh_t *dh, long loc) +{ + LV_ASSERT_NULL(dh); + LV_ASSERT(loc >= 0); + + if (loc < dh->dir->entry.u.child_count) { + dh->index = loc; + } else { + dh->index = dh->dir->entry.u.child_count; + } +} + +long frogfs_telldir(frogfs_dh_t *dh) +{ + LV_ASSERT_NULL(dh); + + return dh->index; +} + +#endif /*LV_USE_FS_FROGFS*/ diff --git a/inc/lvgl/src/libs/frogfs/src/frogfs_format.h b/inc/lvgl/src/libs/frogfs/src/frogfs_format.h new file mode 100644 index 0000000..1cdc1d7 --- /dev/null +++ b/inc/lvgl/src/libs/frogfs/src/frogfs_format.h @@ -0,0 +1,90 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#pragma once + +#include "../../../lv_conf_internal.h" +#include LV_STDINT_INCLUDE + + +/** + * \brief Is entry a directory? + */ +#define FROGFS_IS_DIR(e) (e->u.child_count < 0xFF00) + +/** + * \brief Is entry a file? + */ +#define FROGFS_IS_FILE(e) (e->u.child_count >= 0xFF00) + +/** + * \brief Is entry a compressed file? + */ +#define FROGFS_IS_COMP(e) (e->u.child_count > 0xFF00) + +/** + * \brief Filesystem header + */ +typedef struct frogfs_head_t { + uint32_t magic; /**< filesystem magic */ + uint8_t ver_major; /**< major version */ + uint8_t ver_minor; /**< minor version */ + uint16_t num_entries; /** entry count */ + uint32_t bin_sz; /**< binary length */ +} frogfs_head_t; + +/** + * \brief Hash table entry + */ +typedef struct frogfs_hash_t { + uint32_t hash; /**< path hash */ + uint32_t offs; /**< object offset */ +} frogfs_hash_t; + +/** + * \brief Entry header + */ +struct frogfs_entry_t { + uint32_t parent; /**< parent entry offset */ + union { + uint16_t child_count; /**< child entry count */ + uint8_t compression; /**< compression algorithm */ + } u; + uint8_t seg_sz; /**< path segment size (before alignment) */ + uint8_t opts; /**< compression opts */ +}; + +/** + * \brief Directory object header + */ +typedef struct frogfs_dir_t { + const frogfs_entry_t entry; + uint32_t children[]; +} frogfs_dir_t; + +/** + * \brief File object header + */ +typedef struct frogfs_file_t { + const frogfs_entry_t entry; + uint32_t data_offs; + uint32_t data_sz; +} frogfs_file_t; + +/** + * \brief Compressed file object header + */ +typedef struct frogfs_comp_t { + const frogfs_entry_t entry; + uint32_t data_offs; + uint32_t data_sz; /**< data size (before alignment) */ + uint32_t real_sz; /**< expanded size */ +} frogfs_comp_t; + +/** + * \brief Filesystem footer + */ +typedef struct frogfs_foot_t { + uint32_t crc32; /**< crc32 of entire file without this field */ +} frogfs_foot_t; diff --git a/inc/lvgl/src/libs/frogfs/src/frogfs_priv.h b/inc/lvgl/src/libs/frogfs/src/frogfs_priv.h new file mode 100644 index 0000000..9c84b9b --- /dev/null +++ b/inc/lvgl/src/libs/frogfs/src/frogfs_priv.h @@ -0,0 +1,71 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#pragma once + +#include "../include/frogfs/frogfs_types.h" + +#define FROGFS_PRIVATE_STRUCTS +#include "../include/frogfs/frogfs.h" +#include "frogfs_format.h" + + +typedef struct frogfs_decomp_funcs_t frogfs_decomp_funcs_t; + +/** + * \brief Structure describing a frogfs file entry + */ +struct frogfs_fh_t { + const frogfs_fs_t *fs; /**< frogfs fs pointer */ + const frogfs_file_t *file; /**< file header pointer */ + const void *data_start; /**< data start pointer */ + const void *data_ptr; /**< current data pointer */ + size_t data_sz; /**< data size */ + size_t real_sz; /**< real (expanded) size */ + unsigned int flags; /** open flags */ + const frogfs_decomp_funcs_t *decomp_funcs; /**< decompresor funcs */ + void *decomp_priv; /**< decompressor private data */ +}; + +/** + * \brief Structure describing a frogfs directory entry + */ +struct frogfs_dh_t { + const frogfs_fs_t *fs; /**< frogfs fs pointer */ + const frogfs_dir_t *dir; /**< frogfs entry */ + long index; /**< current index */ +}; + +/** + * \brief Structure of function pointers that describe a decompressor + */ +struct frogfs_decomp_funcs_t { + int (*open)(frogfs_fh_t *f, unsigned int flags); + void (*close)(frogfs_fh_t *f); + ssize_t (*read)(frogfs_fh_t *f, void *buf, size_t len); + ssize_t (*seek)(frogfs_fh_t *f, long offset, int mode); + size_t (*tell)(frogfs_fh_t *f); +}; + +/** + * \brief Raw decompressor functions + */ +extern const frogfs_decomp_funcs_t frogfs_decomp_raw; + +/** + * \brief Heatshrink decompressor functions + */ +extern const frogfs_decomp_funcs_t frogfs_decomp_heatshrink; + +/** + * \brief Miniz decompressor functions + */ +extern const frogfs_decomp_funcs_t frogfs_decomp_miniz; + +/** + * \brief Zlib decompressor functions + */ +extern const frogfs_decomp_funcs_t frogfs_decomp_zlib; + +#include "../include/frogfs/frogfs.h" diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_arduino_esp_littlefs.cpp b/inc/lvgl/src/libs/fsdrv/lv_fs_arduino_esp_littlefs.cpp new file mode 100644 index 0000000..4ce8840 --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_arduino_esp_littlefs.cpp @@ -0,0 +1,194 @@ +#include "../../../lvgl.h" +#if LV_USE_FS_ARDUINO_ESP_LITTLEFS + +#include "../../core/lv_global.h" +#include "LittleFS.h" + +#if !LV_FS_IS_VALID_LETTER(LV_FS_ARDUINO_ESP_LITTLEFS_LETTER) + #error "Invalid drive letter" +#endif + +typedef struct ArduinoEspLittleFile { + File file; +} ArduinoEspLittleFile; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void fs_init(void); +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +/** + * Register a driver for the LittleFS File System interface + */ +extern "C" void lv_fs_arduino_esp_littlefs_init(void) +{ + fs_init(); + + lv_fs_drv_t * fs_drv = &(LV_GLOBAL_DEFAULT()->arduino_esp_littlefs_fs_drv); + lv_fs_drv_init(fs_drv); + + fs_drv->letter = LV_FS_ARDUINO_ESP_LITTLEFS_LETTER; + fs_drv->open_cb = fs_open; + fs_drv->close_cb = fs_close; + fs_drv->read_cb = fs_read; + fs_drv->write_cb = fs_write; + fs_drv->seek_cb = fs_seek; + fs_drv->tell_cb = fs_tell; + + fs_drv->dir_close_cb = NULL; + fs_drv->dir_open_cb = NULL; + fs_drv->dir_read_cb = NULL; + + lv_fs_drv_register(fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*Initialize your Storage device and File system.*/ +static void fs_init(void) +{ + LittleFS.begin(); +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return a file descriptor or NULL on error + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + const char * flags; + if(mode == LV_FS_MODE_WR) + flags = FILE_WRITE; + else if(mode == LV_FS_MODE_RD) + flags = FILE_READ; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) + flags = FILE_WRITE; + + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_ARDUINO_ESP_LITTLEFS_PATH "%s", path); + + File file = LittleFS.open(buf, flags); + if(!file) { + return NULL; + } + + ArduinoEspLittleFile * lf = new ArduinoEspLittleFile{file}; + + return (void *)lf; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; + lf->file.close(); + delete lf; + + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; + *br = lf->file.read((uint8_t *)buf, btr); + + return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; + *bw = lf->file.write((uint8_t *)buf, btw); + + return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + SeekMode mode; + if(whence == LV_FS_SEEK_SET) + mode = SeekSet; + else if(whence == LV_FS_SEEK_CUR) + mode = SeekCur; + else if(whence == LV_FS_SEEK_END) + mode = SeekEnd; + + ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; + + int rc = lf->file.seek(pos, mode); + + return rc < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_p variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p; + + *pos_p = lf->file.position(); + + return (int32_t)(*pos_p) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +#else /*LV_USE_FS_ARDUINO_ESP_LITTLEFS == 0*/ + +#if defined(LV_FS_ARDUINO_ESP_LITTLEFS_LETTER) && LV_FS_ARDUINO_ESP_LITTLEFS_LETTER != '\0' + #warning "LV_USE_FS_ARDUINO_ESP_LITTLEFS is not enabled but LV_FS_ARDUINO_ESP_LITTLEFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_ARDUINO_ESP_LITTLEFS*/ diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_arduino_sd.cpp b/inc/lvgl/src/libs/fsdrv/lv_fs_arduino_sd.cpp new file mode 100644 index 0000000..fe7b5ec --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_arduino_sd.cpp @@ -0,0 +1,186 @@ +#include "../../../lvgl.h" +#if LV_USE_FS_ARDUINO_SD + +#include "../../core/lv_global.h" +#include +#include "SD.h" + +#if !LV_FS_IS_VALID_LETTER(LV_FS_ARDUINO_SD_LETTER) + #error "Invalid drive letter" +#endif + +typedef struct SdFile { + File file; +} SdFile; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +/** + * Register a driver for the SD File System interface + */ +extern "C" void lv_fs_arduino_sd_init(void) +{ + lv_fs_drv_t * fs_drv = &(LV_GLOBAL_DEFAULT()->arduino_sd_fs_drv); + lv_fs_drv_init(fs_drv); + + fs_drv->letter = LV_FS_ARDUINO_SD_LETTER; + fs_drv->open_cb = fs_open; + fs_drv->close_cb = fs_close; + fs_drv->read_cb = fs_read; + fs_drv->write_cb = fs_write; + fs_drv->seek_cb = fs_seek; + fs_drv->tell_cb = fs_tell; + + fs_drv->dir_close_cb = NULL; + fs_drv->dir_open_cb = NULL; + fs_drv->dir_read_cb = NULL; + + lv_fs_drv_register(fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return a file descriptor or NULL on error + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + const char * flags; + if(mode == LV_FS_MODE_WR) + flags = FILE_WRITE; + else if(mode == LV_FS_MODE_RD) + flags = FILE_READ; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) + flags = FILE_WRITE; + + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_ARDUINO_SD_PATH "%s", path); + + File file = SD.open(buf, flags); + if(!file) { + return NULL; + } + + SdFile * lf = new SdFile{file}; + + return (void *)lf; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + SdFile * lf = (SdFile *)file_p; + lf->file.close(); + delete lf; + + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + SdFile * lf = (SdFile *)file_p; + *br = lf->file.read((uint8_t *)buf, btr); + + return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + SdFile * lf = (SdFile *)file_p; + *bw = lf->file.write((uint8_t *)buf, btw); + + return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + SeekMode mode; + if(whence == LV_FS_SEEK_SET) + mode = SeekSet; + else if(whence == LV_FS_SEEK_CUR) + mode = SeekCur; + else if(whence == LV_FS_SEEK_END) + mode = SeekEnd; + + SdFile * lf = (SdFile *)file_p; + + int rc = lf->file.seek(pos, mode); + + return rc < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_p variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + SdFile * lf = (SdFile *)file_p; + + *pos_p = lf->file.position(); + + return (int32_t)(*pos_p) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +#else /*LV_USE_FS_ARDUINO_SD == 0*/ + +#if defined(LV_FS_ARDUINO_SD_LETTER) && LV_FS_ARDUINO_SD_LETTER != '\0' + #warning "LV_USE_FS_ARDUINO_SD is not enabled but LV_FS_ARDUINO_SD_LETTER is set" +#endif + +#endif /*LV_USE_FS_ARDUINO_SD*/ diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_cbfs.c b/inc/lvgl/src/libs/fsdrv/lv_fs_cbfs.c new file mode 100644 index 0000000..6f1245b --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_cbfs.c @@ -0,0 +1,10 @@ +// this file should not exist +#ifdef __GNUC__ + #define IS_NOT_USED __attribute__ ((unused)) +#else + #define IS_NOT_USED +#endif +IS_NOT_USED static void nothing(void) +{ + // do nothing +} diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_fatfs.c b/inc/lvgl/src/libs/fsdrv/lv_fs_fatfs.c new file mode 100644 index 0000000..5bc6f02 --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_fatfs.c @@ -0,0 +1,303 @@ +/** + * @file lv_fs_fatfs.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_FS_FATFS +#include "ff.h" + +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ + +#ifdef ESP_PLATFORM + #define DIR FF_DIR /* ESP IDF typedefs `DIR` as `FF_DIR` in its version of ff.h. Use `FF_DIR` in LVGL too */ +#endif + +#if !LV_FS_IS_VALID_LETTER(LV_FS_FATFS_LETTER) + #error "Invalid drive letter" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void fs_init(void); + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_fs_fatfs_init(void) +{ + /*---------------------------------------------------- + * Initialize your storage device and File System + * -------------------------------------------------*/ + fs_init(); + + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->fatfs_fs_drv); + lv_fs_drv_init(fs_drv_p); + + /*Set up fields...*/ + fs_drv_p->letter = LV_FS_FATFS_LETTER; + fs_drv_p->cache_size = LV_FS_FATFS_CACHE_SIZE; + + fs_drv_p->open_cb = fs_open; + fs_drv_p->close_cb = fs_close; + fs_drv_p->read_cb = fs_read; + fs_drv_p->write_cb = fs_write; + fs_drv_p->seek_cb = fs_seek; + fs_drv_p->tell_cb = fs_tell; + + fs_drv_p->dir_close_cb = fs_dir_close; + fs_drv_p->dir_open_cb = fs_dir_open; + fs_drv_p->dir_read_cb = fs_dir_read; + + lv_fs_drv_register(fs_drv_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/*Initialize your Storage device and File system.*/ +static void fs_init(void) +{ + /*Initialize the SD card and FatFS itself. + *Better to do it in your code to keep this library untouched for easy updating*/ +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + uint8_t flags = 0; + + if(mode == LV_FS_MODE_WR) flags = FA_WRITE | FA_OPEN_ALWAYS; + else if(mode == LV_FS_MODE_RD) flags = FA_READ; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = FA_READ | FA_WRITE | FA_OPEN_ALWAYS; + + FIL * f = lv_malloc(sizeof(FIL)); + if(f == NULL) return NULL; + + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_FATFS_PATH "%s", path); + + FRESULT res = f_open(f, buf, flags); + if(res == FR_OK) { + return f; + } + else { + lv_free(f); + return NULL; + } +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + f_close(file_p); + lv_free(file_p); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + FRESULT res = f_read(file_p, buf, btr, (UINT *)br); + if(res == FR_OK) return LV_FS_RES_OK; + else return LV_FS_RES_UNKNOWN; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + FRESULT res = f_write(file_p, buf, btw, (UINT *)bw); + if(res == FR_OK) return LV_FS_RES_OK; + else return LV_FS_RES_UNKNOWN; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @param whence only LV_SEEK_SET is supported + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + switch(whence) { + case LV_FS_SEEK_SET: + f_lseek(file_p, pos); + break; + case LV_FS_SEEK_CUR: + f_lseek(file_p, f_tell((FIL *)file_p) + pos); + break; + case LV_FS_SEEK_END: + f_lseek(file_p, f_size((FIL *)file_p) + pos); + break; + default: + break; + } + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FIL variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + *pos_p = f_tell((FIL *)file_p); + return LV_FS_RES_OK; +} + +/** + * Initialize a 'DIR' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + DIR * d = lv_malloc(sizeof(DIR)); + if(d == NULL) return NULL; + + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_FATFS_PATH "%s", path); + + FRESULT res = f_opendir(d, buf); + if(res != FR_OK) { + lv_free(d); + d = NULL; + } + return d; +} + +/** + * Read the next filename from a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + if(fn_len == 0) return LV_FS_RES_INV_PARAM; + + FRESULT res; + FILINFO fno; + fn[0] = '\0'; + + do { + res = f_readdir(dir_p, &fno); + if(res != FR_OK) return LV_FS_RES_UNKNOWN; + + if(fno.fname[0] == 0) break; /* End of the directory */ + + if(fno.fattrib & AM_DIR) { + lv_snprintf(fn, fn_len, "/%s", fno.fname); + } + else lv_strlcpy(fn, fno.fname, fn_len); + + } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); + + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + f_closedir(dir_p); + lv_free(dir_p); + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_FATFS == 0*/ + +#if defined(LV_FS_FATFS_LETTER) && LV_FS_FATFS_LETTER != '\0' + #warning "LV_USE_FS_FATFS is not enabled but LV_FS_FATFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_FATFS*/ diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_frogfs.c b/inc/lvgl/src/libs/fsdrv/lv_fs_frogfs.c new file mode 100644 index 0000000..11a7bde --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_frogfs.c @@ -0,0 +1,341 @@ +/** + * @file lv_fs_frogfs.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl.h" +#if LV_USE_FS_FROGFS + +#include "../frogfs/include/frogfs/frogfs.h" +#include "../../core/lv_global.h" +#include "../../misc/lv_ll.h" + +#if !LV_FS_IS_VALID_LETTER(LV_FS_FROGFS_LETTER) + #error "Invalid drive letter" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_ll_t blob_ll; +} fs_drv_data_t; + +typedef struct { + char * path_prefix; + frogfs_fs_t * blob_fs; +} blob_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool get_blob_and_entry(const char * path, blob_t ** blob_dst, const frogfs_entry_t ** entry_dst); +static void destroy_blob(blob_t * blob); +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#define frogfs_fs_drv (&(LV_GLOBAL_DEFAULT()->frogfs_fs_drv)) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_fs_frogfs_init(void) +{ + fs_drv_data_t * data = lv_malloc(sizeof(*data)); + LV_ASSERT_MALLOC(data); + lv_ll_init(&data->blob_ll, sizeof(blob_t)); + + lv_fs_drv_t * fs_drv_p = frogfs_fs_drv; + lv_fs_drv_init(fs_drv_p); + + fs_drv_p->letter = LV_FS_FROGFS_LETTER; + + fs_drv_p->open_cb = fs_open; + fs_drv_p->close_cb = fs_close; + fs_drv_p->read_cb = fs_read; + fs_drv_p->seek_cb = fs_seek; + fs_drv_p->tell_cb = fs_tell; + + fs_drv_p->dir_close_cb = fs_dir_close; + fs_drv_p->dir_open_cb = fs_dir_open; + fs_drv_p->dir_read_cb = fs_dir_read; + + fs_drv_p->user_data = data; + + lv_fs_drv_register(fs_drv_p); +} + +void lv_fs_frogfs_deinit(void) +{ + lv_fs_drv_t * fs_drv_p = frogfs_fs_drv; + fs_drv_data_t * data = fs_drv_p->user_data; + + lv_ll_clear_custom(&data->blob_ll, (void (*)(void *)) destroy_blob); + + lv_free(data); +} + +lv_result_t lv_fs_frogfs_register_blob(const void * blob, const char * path_prefix) +{ + if(path_prefix[0] == '\0') { + LV_LOG_WARN("path prefix should not be zero-length"); + return LV_RESULT_INVALID; + } + + lv_fs_drv_t * fs_drv_p = frogfs_fs_drv; + fs_drv_data_t * data = fs_drv_p->user_data; + + frogfs_config_t frogfs_config = { + .addr = blob, + }; + + frogfs_fs_t * blob_fs = frogfs_init(&frogfs_config); + if(blob_fs == NULL) { + LV_LOG_WARN("Could not register frogfs blob 0x%p", blob); + return LV_RESULT_INVALID; + } + + blob_t * hdl = lv_ll_ins_head(&data->blob_ll); + LV_ASSERT_MALLOC(hdl); + + hdl->path_prefix = lv_strdup(path_prefix); + LV_ASSERT_MALLOC(hdl->path_prefix); + + hdl->blob_fs = blob_fs; + + return LV_RESULT_OK; +} + +void lv_fs_frogfs_unregister_blob(const char * path_prefix) +{ + lv_fs_drv_t * fs_drv_p = frogfs_fs_drv; + fs_drv_data_t * data = fs_drv_p->user_data; + + blob_t * blob_handle; + LV_LL_READ(&data->blob_ll, blob_handle) { + if(lv_streq(path_prefix, blob_handle->path_prefix)) { + break; + } + } + if(blob_handle == NULL) { + LV_LOG_WARN("No frogfs blob with path prefix '%s' to unregister", path_prefix); + return; + } + + destroy_blob(blob_handle); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool get_blob_and_entry(const char * path, blob_t ** blob_dst, const frogfs_entry_t ** entry_dst) +{ + lv_fs_drv_t * fs_drv_p = frogfs_fs_drv; + fs_drv_data_t * data = fs_drv_p->user_data; + + blob_t * blob; + size_t path_prefix_length; + LV_LL_READ(&data->blob_ll, blob) { + path_prefix_length = lv_strlen(blob->path_prefix); + if(0 == lv_strncmp(path, blob->path_prefix, path_prefix_length) + && (blob->path_prefix[path_prefix_length - 1] == '/' + || blob->path_prefix[path_prefix_length - 1] == '\\' + || path[path_prefix_length] == '\0' + || path[path_prefix_length] == '/' + || path[path_prefix_length] == '\\')) { + break; + } + } + if(blob == NULL) { + LV_LOG_WARN("Path '%s' does not have a prefix that matches any of the registered frogfs blobs", path); + return false; + } + + path += path_prefix_length; + if(path[0] == '/' || path[0] == '\\') path++; + + const frogfs_entry_t * entry = frogfs_get_entry(blob->blob_fs, path); + if(entry == NULL) { + LV_LOG_WARN("No entry '%s' in frogfs blob registered under '%s'", path, blob->path_prefix); + return false; + } + + *blob_dst = blob; + *entry_dst = entry; + return true; +} + +static void destroy_blob(blob_t * blob) +{ + lv_fs_drv_t * fs_drv_p = frogfs_fs_drv; + fs_drv_data_t * data = fs_drv_p->user_data; + + lv_free(blob->path_prefix); + frogfs_deinit(blob->blob_fs); + + lv_ll_remove(&data->blob_ll, blob); + lv_free(blob); +} + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + if(mode & LV_FS_MODE_WR) { + LV_LOG_WARN("Cannot open files for writing with frogfs"); + return NULL; + } + + blob_t * blob; + const frogfs_entry_t * entry; + if(!get_blob_and_entry(path, &blob, &entry)) { + return NULL; + } + + if(frogfs_is_dir(entry)) { + LV_LOG_WARN("Cannot open directory as file with frogfs"); + return NULL; + } + + frogfs_fh_t * fh = frogfs_open(blob->blob_fs, entry, 0); + if(fh == NULL) { + LV_LOG_WARN("Could not open '%s' even though the entry exists in frogfs", path); + return NULL; + } + + return fh; +} + +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + frogfs_close(file_p); + return LV_FS_RES_OK; +} + +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + + ssize_t res = frogfs_read(file_p, buf, btr); + if(res < 0) { + LV_LOG_WARN("Error reading frogfs file"); + *br = 0; + return LV_FS_RES_UNKNOWN; + } + + *br = res; + return LV_FS_RES_OK; +} + +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + + ssize_t res = frogfs_seek(file_p, pos, whence); + + if(res < 0) { + LV_LOG_WARN("Error `seek`ing frogfs file"); + return LV_FS_RES_UNKNOWN; + } + + return LV_FS_RES_OK; +} + +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + + size_t res = frogfs_tell(file_p); + if(res == (size_t) -1) { + LV_LOG_WARN("Error `tell`ing frogfs file"); + return LV_FS_RES_UNKNOWN; + } + + *pos_p = res; + return LV_FS_RES_OK; +} + +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + + blob_t * blob; + const frogfs_entry_t * entry; + if(!get_blob_and_entry(path, &blob, &entry)) { + return NULL; + } + + if(!frogfs_is_dir(entry)) { + LV_LOG_WARN("Cannot open non-directory as directory with frogfs"); + return NULL; + } + + frogfs_dh_t * dh = frogfs_opendir(blob->blob_fs, entry); + if(dh == NULL) { + LV_LOG_WARN("Could not open directory '%s' even though the entry exists in frogfs", path); + return NULL; + } + + return dh; +} + +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + if(fn_len == 0) return LV_FS_RES_INV_PARAM; + + const frogfs_entry_t * entry = frogfs_readdir(dir_p); + if(entry == NULL) { + fn[0] = '\0'; + return LV_FS_RES_OK; + } + + char * name = frogfs_get_name(entry); + + if(frogfs_is_dir(entry)) { + lv_snprintf(fn, fn_len, "/%s", name); + } + else { + lv_strlcpy(fn, name, fn_len); + } + + lv_free(name); /* frogfs `malloc`d it */ + + return LV_FS_RES_OK; +} + +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + frogfs_closedir(dir_p); + return LV_FS_RES_OK; +} + +#endif /*LV_USE_FS_FROGFS*/ diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_littlefs.c b/inc/lvgl/src/libs/fsdrv/lv_fs_littlefs.c new file mode 100644 index 0000000..8f2fb92 --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_littlefs.c @@ -0,0 +1,332 @@ +#include "../../../lvgl.h" +#if LV_USE_FS_LITTLEFS + +#include "lfs.h" +#include "../../core/lv_global.h" + +#if !LV_FS_IS_VALID_LETTER(LV_FS_LITTLEFS_LETTER) + #error "Invalid drive letter" +#endif + +typedef struct LittleFile { + lfs_file_t file; +} LittleFile; + +typedef struct LittleDirectory { + lfs_dir_t dir; +} LittleDirectory; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void fs_remove(lv_fs_drv_t * drv); +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); + + + + +void lv_littlefs_set_handler(lfs_t * lfs) +{ + lv_fs_drv_t * drv = lv_fs_get_drv(LV_FS_LITTLEFS_LETTER); + drv->user_data = lfs; +} + +void lv_fs_littlefs_init(void) +{ + lv_fs_drv_t * fs_drv = &(LV_GLOBAL_DEFAULT()->littlefs_fs_drv); + lv_fs_drv_init(fs_drv); + + fs_drv->letter = LV_FS_LITTLEFS_LETTER; + fs_drv->open_cb = fs_open; + fs_drv->close_cb = fs_close; + fs_drv->read_cb = fs_read; + fs_drv->write_cb = fs_write; + fs_drv->seek_cb = fs_seek; + fs_drv->tell_cb = fs_tell; + + fs_drv->dir_open_cb = fs_dir_open; + fs_drv->dir_close_cb = fs_dir_close; + fs_drv->dir_read_cb = fs_dir_read; + + lv_fs_drv_register(fs_drv); +} + +lv_fs_res_t lv_fs_littlefs_register_drive(lfs_t * lfs, char letter) +{ + + if(lfs == NULL) { + return LV_FS_RES_INV_PARAM; /*Invalid LittleFS handle*/ + } + + if(LV_FS_IS_VALID_LETTER(letter) == false) { + return LV_FS_RES_INV_PARAM; /*Invalid letter*/ + } + + if(lv_fs_get_drv(letter) != NULL) { + return LV_FS_RES_DRIVE_LETTER_ALREADY_USED; /*Already registered*/ + } + + lv_fs_drv_t * fs_drv = lv_malloc(sizeof(lv_fs_drv_t)); + LV_ASSERT_MALLOC(fs_drv); + lv_fs_drv_init(fs_drv); + + fs_drv->letter = letter; + fs_drv->open_cb = fs_open; + fs_drv->close_cb = fs_close; + fs_drv->read_cb = fs_read; + fs_drv->write_cb = fs_write; + fs_drv->seek_cb = fs_seek; + fs_drv->tell_cb = fs_tell; + + fs_drv->dir_open_cb = fs_dir_open; + fs_drv->dir_close_cb = fs_dir_close; + fs_drv->dir_read_cb = fs_dir_read; + + fs_drv->remove_cb = fs_remove; /*Optional*/ + fs_drv->user_data = lfs; + + lv_fs_drv_register(fs_drv); + return LV_FS_RES_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * free the driver handle + * @param drv pointer to a driver where this function belongs + */ +static void fs_remove(lv_fs_drv_t * drv) +{ + lv_free(drv); +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return a file descriptor or NULL on error + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + int flags = 0; + if(mode == LV_FS_MODE_WR) + flags = LFS_O_WRONLY; + else if(mode == LV_FS_MODE_RD) + flags = LFS_O_RDONLY; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) + flags = LFS_O_RDWR; + + LittleFile * lf = lv_malloc(sizeof(LittleFile)); + LV_ASSERT_MALLOC(lf); + + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_LITTLEFS_PATH "%s", path); + + lfs_t * lfs = drv->user_data; + int err = lfs_file_open(lfs, &lf->file, buf, flags); + if(err) { + lv_free(lf); + return NULL; + } + + return (void *)lf; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LittleFile * lf = file_p; + + lfs_t * lfs = drv->user_data; + lfs_file_close(lfs, &lf->file); + lv_free(lf); + + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LittleFile * lf = file_p; + + lfs_t * lfs = drv->user_data; + *br = lfs_file_read(lfs, &lf->file, (uint8_t *)buf, btr); + + return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LittleFile * lf = file_p; + + lfs_t * lfs = drv->user_data; + *bw = lfs_file_write(lfs, &lf->file, (uint8_t *)buf, btw); + + return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_t variable. (opened with fs_open) + * @param pos the new position of read write pointer + * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + int mode = 0; + if(whence == LV_FS_SEEK_SET) + mode = LFS_SEEK_SET; + else if(whence == LV_FS_SEEK_CUR) + mode = LFS_SEEK_CUR; + else if(whence == LV_FS_SEEK_END) + mode = LFS_SEEK_END; + + LittleFile * lf = file_p; + + lfs_t * lfs = drv->user_data; + int rc = lfs_file_seek(lfs, &lf->file, pos, mode); + + return rc < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a file_p variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LittleFile * lf = file_p; + + lfs_t * lfs = drv->user_data; + *pos_p = lfs_file_tell(lfs, &lf->file); + + return (int32_t)(*pos_p) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Open a directory + * @param drv pointer to a driver where this function belongs + * @param path path to the directory beginning with the driver letter (e.g. S:/folder) + * @return a directory descriptor or NULL on error + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LittleDirectory * ld = lv_malloc(sizeof(LittleDirectory)); + LV_ASSERT_MALLOC(ld); + + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_LITTLEFS_PATH "%s", path); + + lfs_t * lfs = drv->user_data; + int err = lfs_dir_open(lfs, &ld->dir, buf); + if(err != LFS_ERR_OK) { + lv_free(ld); + return NULL; + } + + return (void *)ld; +} + +/** + * Close an opened directory + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to a dir_p variable. (opened with fs_dir_open) + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LittleDirectory * ld = dir_p; + + lfs_t * lfs = drv->user_data; + int rc = lfs_dir_close(lfs, &ld->dir); + + if(rc < 0) return LV_FS_RES_UNKNOWN; + lv_free(ld); + + return LV_FS_RES_OK; +} + +/** + * Read data from an opened directory + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to a file_t variable. + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + if(fn_len == 0) return LV_FS_RES_INV_PARAM; + + LittleDirectory * lf = dir_p; + + lfs_t * lfs = drv->user_data; + + fn[0] = '\0'; + do { + struct lfs_info info; + int res = lfs_dir_read(lfs, &lf->dir, &info); + + if(res < 0) return LV_FS_RES_UNKNOWN; + if(res == 0) { /* End of the directory */ + fn[0] = '\0'; + break; + } + + if(info.type != LFS_TYPE_DIR) { + lv_strlcpy(fn, info.name, fn_len); + } + else { + lv_snprintf(fn, fn_len, "/%s", info.name); + } + + } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); + + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_LITTLEFS == 0*/ + +#if defined(LV_FS_LITTLEFS_LETTER) && LV_FS_LITTLEFS_LETTER != '\0' + #warning "LV_USE_FS_LITTLEFS is not enabled but LV_FS_LITTLEFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_LITTLEFS*/ diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_memfs.c b/inc/lvgl/src/libs/fsdrv/lv_fs_memfs.c new file mode 100644 index 0000000..4e1b18a --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_memfs.c @@ -0,0 +1,219 @@ +/** + * @file lv_fs_memfs.c + * + * File System Interface driver for memory-mapped files + * + * This driver allows using a memory area as a file that can be read by normal file operations. It can + * be used, e.g., to store font files in slow flash memory, and load them into RAM on demand. + * + * You can enable it in lv_conf.h: + * + * #define LV_USE_FS_MEMFS 1 + * + * The actual implementation uses the built-in cache mechanism of the file system interface. + * + * Since this is not an actual file system, file write and directories are not supported. + * + * The default drive letter is 'M', but this can be changed in lv_conf.h: + * + * #define LV_FS_MEMFS_LETTER 'M' + * + * To use it seamlessly with the file system interface a new extended path object has been introduced: + * + * lv_fs_path_ex_t mempath; + * + * This structure can be initialized with the helper function: + * + * lv_fs_make_path_ex(&mempath, (const uint8_t *) & my_mem_buffer, sizeof(my_mem_buffer)); + * + * Then the "file" can be opened with: + * + * lv_fs_file_t file; + * lv_fs_res_t res = lv_fs_open(&file, (const char *) & mempath, LV_FS_MODE_RD); + * + * The path object can be used at any place where a file path is required, e.g.: + * + * lv_font_t* my_font = lv_binfont_create((const char *) & mempath); + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_fs_private.h" +#include "../../../lvgl.h" +#if LV_USE_FS_MEMFS + +/********************* + * DEFINES + *********************/ + +#if !LV_FS_IS_VALID_LETTER(LV_FS_MEMFS_LETTER) + #error "Invalid drive letter" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** +* STATIC PROTOTYPES +**********************/ + +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +/********************** + * STATIC VARIABLES + **********************/ + +static lv_fs_drv_t fs_drv; /*A driver descriptor*/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_memfs_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + lv_fs_drv_init(&fs_drv); + + /*Set up fields...*/ + fs_drv.letter = LV_FS_MEMFS_LETTER; + fs_drv.cache_size = LV_FS_CACHE_FROM_BUFFER; + + fs_drv.open_cb = fs_open; + fs_drv.close_cb = fs_close; + fs_drv.read_cb = fs_read; + fs_drv.write_cb = NULL; + fs_drv.seek_cb = fs_seek; + fs_drv.tell_cb = fs_tell; + + fs_drv.dir_close_cb = NULL; + fs_drv.dir_open_cb = NULL; + fs_drv.dir_read_cb = NULL; + + lv_fs_drv_register(&fs_drv); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path pointer to an extended path object containing the memory buffer address and size + * @param mode read: FS_MODE_RD (currently only reading from the buffer is supported) + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + LV_UNUSED(mode); + return (void *)path; +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + LV_UNUSED(file_p); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + LV_UNUSED(file_p); + LV_UNUSED(buf); + LV_UNUSED(btr); + *br = 0; + return LV_FS_RES_OK; +} + +/** + * Set the read pointer. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open ) + * @param pos the new position of read pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + /* NOTE: this function is only called to determine the end of the buffer when LV_FS_SEEK_END was given to lv_fs_seek() */ + LV_UNUSED(drv); + lv_fs_file_t * fp = (lv_fs_file_t *)file_p; + switch(whence) { + case LV_FS_SEEK_SET: { + fp->cache->file_position = pos; + break; + } + case LV_FS_SEEK_CUR: { + fp->cache->file_position += pos; + break; + } + case LV_FS_SEEK_END: { + fp->cache->file_position = fp->cache->end - pos; + break; + } + } + if(fp->cache->file_position < fp->cache->start) + fp->cache->file_position = fp->cache->start; + else if(fp->cache->file_position > fp->cache->end) + fp->cache->file_position = fp->cache->end; + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + *pos_p = ((lv_fs_file_t *)file_p)->cache->file_position; + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_MEMFS == 0*/ + +#if defined(LV_FS_MEMFS_LETTER) && LV_FS_MEMFS_LETTER != '\0' + #warning "LV_USE_FS_MEMFS is not enabled but LV_FS_MEMFS_LETTER is set" +#endif + +#endif /*LV_USE_FS_MEMFS*/ diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_posix.c b/inc/lvgl/src/libs/fsdrv/lv_fs_posix.c new file mode 100644 index 0000000..9d5af39 --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_posix.c @@ -0,0 +1,385 @@ +/** + * @file lv_fs_posix.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_FS_POSIX + +#include +#include +#include +#include +#include +#include +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#if !LV_FS_IS_VALID_LETTER(LV_FS_POSIX_LETTER) + #error "Invalid drive letter" +#endif + +/** The reason for 'fd + 1' is because open() may return a legal fd with a value of 0, + * preventing it from being judged as NULL when converted to a pointer type. + */ +#define FILEP2FD(file_p) ((lv_uintptr_t)file_p - 1) +#define FD2FILEP(fd) ((void *)(lv_uintptr_t)(fd + 1)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); +static lv_fs_res_t fs_errno_to_res(int errno_val); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_posix_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->posix_fs_drv); + lv_fs_drv_init(fs_drv_p); + + /*Set up fields...*/ + fs_drv_p->letter = LV_FS_POSIX_LETTER; + fs_drv_p->cache_size = LV_FS_POSIX_CACHE_SIZE; + + fs_drv_p->open_cb = fs_open; + fs_drv_p->close_cb = fs_close; + fs_drv_p->read_cb = fs_read; + fs_drv_p->write_cb = fs_write; + fs_drv_p->seek_cb = fs_seek; + fs_drv_p->tell_cb = fs_tell; + + fs_drv_p->dir_close_cb = fs_dir_close; + fs_drv_p->dir_open_cb = fs_dir_open; + fs_drv_p->dir_read_cb = fs_dir_read; + + lv_fs_drv_register(fs_drv_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return a file handle or -1 in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + int flags = 0; + if(mode == LV_FS_MODE_WR) flags = O_WRONLY | O_CREAT; + else if(mode == LV_FS_MODE_RD) flags = O_RDONLY; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = O_RDWR | O_CREAT; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); + + int fd = open(buf, flags, 0666); + if(fd < 0) { + LV_LOG_WARN("Could not open file: %s, flags: 0x%x, errno: %d", buf, flags, errno); + return NULL; + } + + return FD2FILEP(fd); +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + + int fd = FILEP2FD(file_p); + int ret = close(fd); + if(ret < 0) { + LV_LOG_WARN("Could not close file: %d, errno: %d", fd, errno); + return fs_errno_to_res(errno); + } + + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + + int fd = FILEP2FD(file_p); + ssize_t ret = read(fd, buf, btr); + if(ret < 0) { + LV_LOG_WARN("Could not read file: %d, errno: %d", fd, errno); + return fs_errno_to_res(errno); + } + + *br = (uint32_t)ret; + return LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + + int fd = FILEP2FD(file_p); + ssize_t ret = write(fd, buf, btw); + if(ret < 0) { + LV_LOG_WARN("Could not write file: %d, errno: %d", fd, errno); + return fs_errno_to_res(errno); + } + + *bw = (uint32_t)ret; + return LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + int w; + switch(whence) { + case LV_FS_SEEK_SET: + w = SEEK_SET; + break; + case LV_FS_SEEK_CUR: + w = SEEK_CUR; + break; + case LV_FS_SEEK_END: + w = SEEK_END; + break; + default: + return LV_FS_RES_INV_PARAM; + } + + int fd = FILEP2FD(file_p); + off_t offset = lseek(fd, pos, w); + if(offset < 0) { + LV_LOG_WARN("Could not seek file: %d, errno: %d", fd, errno); + return fs_errno_to_res(errno); + } + + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p a file handle variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + + int fd = FILEP2FD(file_p); + off_t offset = lseek(fd, 0, SEEK_CUR); + if(offset < 0) { + LV_LOG_WARN("Could not get position of file: %d, errno: %d", fd, errno); + return fs_errno_to_res(errno); + } + + *pos_p = (uint32_t)offset; + return LV_FS_RES_OK; +} + +/** + * Initialize a 'fs_read_dir_t' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' or 'HANDLE' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[256]; + lv_snprintf(buf, sizeof(buf), LV_FS_POSIX_PATH "%s", path); + + void * dir = opendir(buf); + if(!dir) { + LV_LOG_WARN("Could not open directory: %s, errno: %d", buf, errno); + return NULL; + } + + return dir; +} + +/** + * Read the next filename from a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + if(fn_len == 0) return LV_FS_RES_INV_PARAM; + + struct dirent * entry; + do { + entry = readdir(dir_p); + if(entry) { + if(entry->d_type == DT_DIR) lv_snprintf(fn, fn_len, "/%s", entry->d_name); + else lv_strlcpy(fn, entry->d_name, fn_len); + } + else { + lv_strlcpy(fn, "", fn_len); + } + } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); + + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + + int ret = closedir(dir_p); + if(ret < 0) { + LV_LOG_WARN("Could not close directory: errno: %d", errno); + return fs_errno_to_res(errno); + } + + return LV_FS_RES_OK; +} + +/** + * Convert an errno value to a lv_fs_res_t value + * @param errno_val an errno value + * @return a corresponding lv_fs_res_t value + */ +static lv_fs_res_t fs_errno_to_res(int errno_val) +{ + switch(errno_val) { + case 0: + return LV_FS_RES_OK; + + case EIO: /* I/O error */ + return LV_FS_RES_HW_ERR; + + case EFAULT: /* Bad address */ + return LV_FS_RES_FS_ERR; + + case ENOENT: /* No such file or directory */ + return LV_FS_RES_NOT_EX; + + case ENOSPC: /* No space left on device */ + return LV_FS_RES_FULL; + + case EALREADY: /* Operation already in progress */ + return LV_FS_RES_LOCKED; + + case EACCES: /* Permission denied */ + return LV_FS_RES_DENIED; + + case EBUSY: /* Device or resource busy */ + return LV_FS_RES_BUSY; + + case ETIMEDOUT: /* Connection timed out */ + return LV_FS_RES_TOUT; + + case ENOSYS: /* Invalid system call number */ + return LV_FS_RES_NOT_IMP; + + case ENOMEM: /* Out of memory */ + return LV_FS_RES_OUT_OF_MEM; + + case EINVAL: /* "Invalid argument" */ + return LV_FS_RES_INV_PARAM; + + default: + break; + } + + return LV_FS_RES_UNKNOWN; +} + +#else /*LV_USE_FS_POSIX == 0*/ + +#if defined(LV_FS_POSIX_LETTER) && LV_FS_POSIX_LETTER != '\0' + #warning "LV_USE_FS_POSIX is not enabled but LV_FS_POSIX_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_stdio.c b/inc/lvgl/src/libs/fsdrv/lv_fs_stdio.c new file mode 100644 index 0000000..0ceaae2 --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_stdio.c @@ -0,0 +1,349 @@ +/** + * @file lv_fs_stdio.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FS_STDIO + +#include +#ifndef WIN32 + #include + #include +#else + #include +#endif + +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ + +#if !LV_FS_IS_VALID_LETTER(LV_FS_STDIO_LETTER) + #error "Invalid drive letter" +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef struct { +#ifdef _WIN32 + HANDLE dir_p; + char next_fn[LV_FS_MAX_PATH_LEN]; +#else + DIR * dir_p; +#endif +} dir_handle_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_stdio_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->stdio_fs_drv); + lv_fs_drv_init(fs_drv_p); + + /*Set up fields...*/ + fs_drv_p->letter = LV_FS_STDIO_LETTER; + fs_drv_p->cache_size = LV_FS_STDIO_CACHE_SIZE; + + fs_drv_p->open_cb = fs_open; + fs_drv_p->close_cb = fs_close; + fs_drv_p->read_cb = fs_read; + fs_drv_p->write_cb = fs_write; + fs_drv_p->seek_cb = fs_seek; + fs_drv_p->tell_cb = fs_tell; + + fs_drv_p->dir_close_cb = fs_dir_close; + fs_drv_p->dir_open_cb = fs_dir_open; + fs_drv_p->dir_read_cb = fs_dir_read; + + lv_fs_drv_register(fs_drv_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + const char * flags = ""; + + if(mode == LV_FS_MODE_WR) flags = "wb"; + else if(mode == LV_FS_MODE_RD) flags = "rb"; + else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "rb+"; + + /*Make the path relative to the current directory (the projects root folder)*/ + + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path); + + return fopen(buf, flags); +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + fclose(file_p); + return LV_FS_RES_OK; +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + *br = fread(buf, 1, btr, file_p); + return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + *bw = fwrite(buf, 1, btw, file_p); + return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + int w; + switch(whence) { + case LV_FS_SEEK_SET: + w = SEEK_SET; + break; + case LV_FS_SEEK_CUR: + w = SEEK_CUR; + break; + case LV_FS_SEEK_END: + w = SEEK_END; + break; + default: + return LV_FS_RES_INV_PARAM; + } + + fseek(file_p, pos, w); + return LV_FS_RES_OK; +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + *pos_p = ftell(file_p); + return LV_FS_RES_OK; +} + +/** + * Initialize a 'DIR' or 'HANDLE' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' or 'HANDLE' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)lv_malloc(sizeof(dir_handle_t)); +#ifndef WIN32 + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s", path); + handle->dir_p = opendir(buf); + if(handle->dir_p == NULL) { + lv_free(handle); + return NULL; + } + return handle; +#else + handle->dir_p = INVALID_HANDLE_VALUE; + WIN32_FIND_DATAA fdata; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_STDIO_PATH "%s\\*", path); + + lv_strcpy(handle->next_fn, ""); + handle->dir_p = FindFirstFileA(buf, &fdata); + do { + if(lv_strcmp(fdata.cFileName, ".") == 0 || lv_strcmp(fdata.cFileName, "..") == 0) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(handle->dir_p, &fdata)); + + if(handle->dir_p == INVALID_HANDLE_VALUE) { + lv_free(handle); + return INVALID_HANDLE_VALUE; + } + return handle; +#endif +} + +/** + * Read the next filename form a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + if(fn_len == 0) return LV_FS_RES_INV_PARAM; + + dir_handle_t * handle = (dir_handle_t *)dir_p; +#ifndef WIN32 + struct dirent * entry; + do { + entry = readdir(handle->dir_p); + if(entry) { + /*Note, DT_DIR is not defined in C99*/ + if(entry->d_type == DT_DIR) lv_snprintf(fn, fn_len, "/%s", entry->d_name); + else lv_strlcpy(fn, entry->d_name, fn_len); + } + else { + lv_strlcpy(fn, "", fn_len); + } + } while(lv_strcmp(fn, "/.") == 0 || lv_strcmp(fn, "/..") == 0); +#else + lv_strlcpy(fn, handle->next_fn, fn_len); + + lv_strcpy(handle->next_fn, ""); + WIN32_FIND_DATAA fdata; + + if(FindNextFileA(handle->dir_p, &fdata) == false) return LV_FS_RES_OK; + do { + if(lv_strcmp(fdata.cFileName, ".") == 0 || lv_strcmp(fdata.cFileName, "..") == 0) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(handle->dir_p, &fdata)); + +#endif + return LV_FS_RES_OK; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; +#ifndef WIN32 + closedir(handle->dir_p); +#else + FindClose(handle->dir_p); +#endif + lv_free(handle); + return LV_FS_RES_OK; +} + +#else /*LV_USE_FS_STDIO == 0*/ + +#if defined(LV_FS_STDIO_LETTER) && LV_FS_STDIO_LETTER != '\0' + #warning "LV_USE_FS_STDIO is not enabled but LV_FS_STDIO_LETTER is set" +#endif + +#endif /*LV_USE_FS_POSIX*/ diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_uefi.c b/inc/lvgl/src/libs/fsdrv/lv_fs_uefi.c new file mode 100644 index 0000000..4e95078 --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_uefi.c @@ -0,0 +1,607 @@ +/** + * @file lv_fs_uefi.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" + +#if LV_USE_FS_UEFI && LV_USE_UEFI + +#include "../../drivers/uefi/lv_uefi_private.h" + +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#if LV_FS_UEFI_LETTER == '\0' + #error "LV_FS_UEFI_LETTER must be set to a valid value" +#else + #if (LV_FS_UEFI_LETTER < 'A') || (LV_FS_UEFI_LETTER > 'Z') + #if LV_FS_DEFAULT_DRIVE_LETTER != '\0' /* When using default driver-identifier letter, strict format (X:) is mandatory. */ + #error "LV_FS_UEFI_LETTER must be an upper case ASCII letter" + #else /*Lean rules for backward compatibility*/ + #warning LV_FS_UEFI_LETTER should be an upper case ASCII letter. \ + Using a slash symbol as driver - identifier letter should be replaced with LV_FS_DEFAULT_DRIVE_LETTER mechanism. + #endif + #endif +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_uefi_fs_file_context_t { + EFI_FILE_PROTOCOL * interface; +} lv_uefi_fs_file_context_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_fs_drv_uefi_init(lv_fs_drv_t * drv, char fs_drive_letter, EFI_HANDLE fs_handle); +static void lv_fs_drv_uefi_deinit(lv_fs_drv_t * drv); + +static void lv_fs_uefi_lvgl_path_to_uefi_path(CHAR16 * path); +static void lv_fs_uefi_uefi_path_to_lvgl_path(CHAR16 * path); +static bool lv_fs_uefi_is_dot_path(CONST CHAR16 * path); +static bool lv_fs_uefi_is_dir(EFI_FILE_PROTOCOL * dir); +static bool lv_fs_uefi_is_file(EFI_FILE_PROTOCOL * file); +static EFI_FILE_INFO * lv_fs_uefi_get_info(EFI_FILE_PROTOCOL * file); + +static bool lv_fs_uefi_ready_cb(lv_fs_drv_t * drv); + +static void * lv_fs_uefi_open_cb(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t lv_fs_uefi_close_cb(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t lv_fs_uefi_read_cb(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t lv_fs_uefi_write_cb(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t lv_fs_uefi_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t lv_fs_uefi_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + +static void * lv_fs_uefi_dir_open_cb(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t lv_fs_uefi_dir_read_cb(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t lv_fs_uefi_dir_close_cb(lv_fs_drv_t * drv, void * rddir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +static EFI_GUID _uefi_guid_simple_file_system = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; +static EFI_GUID _uefi_guid_loaded_image = EFI_LOADED_IMAGE_PROTOCOL_GUID; +static EFI_GUID _uefi_guid_file_info = EFI_FILE_INFO_ID; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_uefi_init(void) +{ + EFI_LOADED_IMAGE_PROTOCOL * interface_loaded_image = NULL; + EFI_HANDLE fs_handle = NULL; + + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + interface_loaded_image = lv_uefi_protocol_open(gLvEfiImageHandle, &_uefi_guid_loaded_image); + LV_ASSERT_NULL(interface_loaded_image); + + fs_handle = interface_loaded_image->DeviceHandle; + + if(fs_handle == NULL) return; + + lv_uefi_protocol_close(gLvEfiImageHandle, &_uefi_guid_loaded_image); + + /*Add a simple driver to open images*/ + lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->uefi_fs_drv); + lv_fs_drv_uefi_init(fs_drv_p, LV_FS_UEFI_LETTER, fs_handle); + + lv_fs_drv_register(fs_drv_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool lv_fs_uefi_ready_cb(lv_fs_drv_t * drv) +{ + EFI_HANDLE fs_handle = (EFI_HANDLE)drv->user_data; + + return fs_handle != NULL; +} + +static void * lv_fs_uefi_open_cb(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + EFI_STATUS status; + EFI_FILE_PROTOCOL * fs_root = NULL; + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * fs_interface = NULL; + CHAR16 path_ucs2[LV_FS_MAX_PATH_LENGTH + 1]; + lv_uefi_fs_file_context_t * file_ctx = NULL; + UINT64 uefi_mode = 0; + + EFI_HANDLE fs_handle = (EFI_HANDLE)drv->user_data; + + fs_interface = lv_uefi_protocol_open(fs_handle, &_uefi_guid_simple_file_system); + if(fs_interface == NULL) { + LV_LOG_WARN("[lv_uefi] Unable to open file system protocol."); + goto error; + } + + status = fs_interface->OpenVolume(fs_interface, &fs_root); + if(status != EFI_SUCCESS) { + LV_LOG_WARN("[lv_uefi] Unable to open file system root."); + goto error; + } + + if(lv_uefi_ascii_to_ucs2(path, path_ucs2, LV_FS_MAX_PATH_LENGTH + 1) == 0) { + LV_LOG_WARN("[lv_uefi] Unable to convert the ASCII path into an UCS-2 path."); + goto error; + } + + lv_fs_uefi_lvgl_path_to_uefi_path(path_ucs2); + + file_ctx = lv_calloc(1, sizeof(lv_uefi_fs_file_context_t)); + LV_ASSERT_MALLOC(file_ctx); + + if(mode == LV_FS_MODE_WR) { + uefi_mode = EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE; + } + else { + uefi_mode = EFI_FILE_MODE_READ; + } + + status = fs_root->Open( + fs_root, + &file_ctx->interface, + path_ucs2, + uefi_mode, + 0); + if(status != EFI_SUCCESS) { + LV_LOG_WARN("[lv_uefi] Unable to open file '%s'.", path); + goto error; + } + + if(!lv_fs_uefi_is_file(file_ctx->interface)) { + goto error; + } + + goto finish; + +error: + if(file_ctx != NULL) { + if(file_ctx->interface != NULL) file_ctx->interface->Close(file_ctx->interface); + lv_free(file_ctx); + file_ctx = NULL; + } + +finish: + if(fs_interface != NULL) lv_uefi_protocol_close(fs_handle, &_uefi_guid_simple_file_system); + if(fs_root != NULL) fs_root->Close(fs_root); + + return file_ctx; +} + +static lv_fs_res_t lv_fs_uefi_close_cb(lv_fs_drv_t * drv, void * file_p) +{ + EFI_STATUS status; + lv_uefi_fs_file_context_t * file_ctx = (lv_uefi_fs_file_context_t *)file_p; + + if(file_ctx == NULL || file_ctx->interface == NULL) return LV_FS_RES_INV_PARAM; + + status = file_ctx->interface->Close(file_ctx->interface); + if(status != EFI_SUCCESS) return LV_FS_RES_HW_ERR; + + lv_free(file_ctx); + + return LV_FS_RES_OK; +} + +static lv_fs_res_t lv_fs_uefi_read_cb(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + EFI_STATUS status; + lv_uefi_fs_file_context_t * file_ctx = (lv_uefi_fs_file_context_t *)file_p; + UINTN buf_size = btr; + + if(file_ctx == NULL || file_ctx->interface == NULL) return LV_FS_RES_INV_PARAM; + + status = file_ctx->interface->Read( + file_ctx->interface, + &buf_size, + buf); + if(status != EFI_SUCCESS) return LV_FS_RES_HW_ERR; + + *br = (uint32_t) buf_size; + + return LV_FS_RES_OK; +} + +static lv_fs_res_t lv_fs_uefi_write_cb(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + EFI_STATUS status; + lv_uefi_fs_file_context_t * file_ctx = (lv_uefi_fs_file_context_t *)file_p; + UINTN buf_size = btw; + + if(file_ctx == NULL || file_ctx->interface == NULL) return LV_FS_RES_INV_PARAM; + + status = file_ctx->interface->Write( + file_ctx->interface, + &buf_size, + (VOID *)buf); + if(status != EFI_SUCCESS) return LV_FS_RES_HW_ERR; + + file_ctx->interface->Flush(file_ctx->interface); + + *bw = (uint32_t) buf_size; + + return LV_FS_RES_OK; +} + +static lv_fs_res_t lv_fs_uefi_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + EFI_STATUS status; + lv_uefi_fs_file_context_t * file_ctx = (lv_uefi_fs_file_context_t *)file_p; + UINT64 new_pos; + + if(file_ctx == NULL || file_ctx->interface == NULL) return LV_FS_RES_INV_PARAM; + + if(whence == LV_FS_SEEK_END) { + status = file_ctx->interface->SetPosition( + file_ctx->interface, + UINT64_MAX); + if(status != EFI_SUCCESS) return LV_FS_RES_HW_ERR; + + status = file_ctx->interface->GetPosition( + file_ctx->interface, + &new_pos); + if(status != EFI_SUCCESS) return LV_FS_RES_HW_ERR; + + if(new_pos < pos) { + new_pos = 0; + } + else { + new_pos -= pos; + } + } + else if(whence == LV_FS_SEEK_SET) { + new_pos = pos; + } + else if(whence == LV_FS_SEEK_CUR) { + status = file_ctx->interface->GetPosition( + file_ctx->interface, + &new_pos); + if(status != EFI_SUCCESS) return LV_FS_RES_HW_ERR; + + new_pos += pos; + } + else { + return LV_FS_RES_INV_PARAM; + } + + status = file_ctx->interface->SetPosition( + file_ctx->interface, + new_pos); + if(status != EFI_SUCCESS) return LV_FS_RES_HW_ERR; + + return LV_FS_RES_OK; +} + +static lv_fs_res_t lv_fs_uefi_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + EFI_STATUS status; + lv_uefi_fs_file_context_t * file_ctx = (lv_uefi_fs_file_context_t *)file_p; + UINT64 pos; + + if(file_ctx == NULL || file_ctx->interface == NULL) return LV_FS_RES_INV_PARAM; + + status = file_ctx->interface->GetPosition( + file_ctx->interface, + &pos); + if(status != EFI_SUCCESS) return LV_FS_RES_HW_ERR; + + if(pos > UINT32_MAX) return LV_FS_RES_UNKNOWN; + + *pos_p = (uint32_t) pos; + + return LV_FS_RES_OK; +} + +static void * lv_fs_uefi_dir_open_cb(lv_fs_drv_t * drv, const char * path) +{ + EFI_STATUS status; + EFI_FILE_PROTOCOL * fs_root = NULL; + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * fs_interface = NULL; + CHAR16 path_ucs2[LV_FS_MAX_PATH_LENGTH + 1]; + lv_uefi_fs_file_context_t * file_ctx = NULL; + UINT64 mode = 0; + UINT64 attributes = 0; + + EFI_HANDLE fs_handle = (EFI_HANDLE)drv->user_data; + + fs_interface = lv_uefi_protocol_open(fs_handle, &_uefi_guid_simple_file_system); + if(fs_interface == NULL) { + LV_LOG_WARN("[lv_uefi] Unable to open file system protocol."); + goto error; + } + + status = fs_interface->OpenVolume(fs_interface, &fs_root); + if(status != EFI_SUCCESS) { + LV_LOG_WARN("[lv_uefi] Unable to open file system root."); + goto error; + } + + if(path != NULL && path[0] != '\0') { + if(lv_uefi_ascii_to_ucs2(path, path_ucs2, LV_FS_MAX_PATH_LENGTH + 1) == 0) { + LV_LOG_WARN("[lv_uefi] Unable to convert the ASCII path into an UCS-2 path."); + goto error; + } + } + else { + path_ucs2[0] = '\\'; + path_ucs2[1] = '\0'; + } + + lv_fs_uefi_lvgl_path_to_uefi_path(path_ucs2); + + file_ctx = lv_calloc(1, sizeof(lv_uefi_fs_file_context_t)); + LV_ASSERT_MALLOC(file_ctx); + + mode = EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE; + attributes = EFI_FILE_DIRECTORY; + + status = fs_root->Open( + fs_root, + &file_ctx->interface, + path_ucs2, + mode, + attributes); + if(status != EFI_SUCCESS) { + LV_LOG_WARN("[lv_uefi] Unable to open directory '%s'.", path); + goto error; + } + + if(!lv_fs_uefi_is_dir(file_ctx->interface)) { + goto error; + } + + goto finish; + +error: + if(file_ctx != NULL) { + if(file_ctx->interface != NULL) { + file_ctx->interface->Close(file_ctx->interface); + } + lv_free(file_ctx); + file_ctx = NULL; + } + +finish: + if(fs_interface != NULL) lv_uefi_protocol_close(fs_handle, &_uefi_guid_simple_file_system); + if(fs_root != NULL) fs_root->Close(fs_root); + + return file_ctx; +} + +static lv_fs_res_t lv_fs_uefi_dir_read_cb(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len) +{ + lv_fs_res_t return_code; + EFI_STATUS status; + lv_uefi_fs_file_context_t * file_ctx = (lv_uefi_fs_file_context_t *)rddir_p; + + EFI_FILE_INFO * info = NULL; + UINTN size; + + CONST CHAR16 * fn_ucs2; + + if(fn == NULL || fn_len == 0) return LV_FS_RES_INV_PARAM; + if(file_ctx == NULL || file_ctx->interface == NULL) return LV_FS_RES_INV_PARAM; + + // skip . and .. + do { + if(info != NULL) lv_free(info); + info = NULL; + size = 0; + status = file_ctx->interface->Read( + file_ctx->interface, + &size, + info); + if(status == EFI_SUCCESS && size == 0) { + return_code = LV_FS_RES_OK; + *fn = '\0'; + goto finish; + } + else if(status != EFI_BUFFER_TOO_SMALL) { + return_code = LV_FS_RES_NOT_EX; + goto error; + } + + info = lv_calloc(1, size); + LV_ASSERT_MALLOC(info); + + status = file_ctx->interface->Read( + file_ctx->interface, + &size, + info); + if(status != EFI_SUCCESS) { + return_code = LV_FS_RES_HW_ERR; + goto error; + } + } while(lv_fs_uefi_is_dot_path(info->FileName)); + + lv_fs_uefi_uefi_path_to_lvgl_path(info->FileName); + + // skip leading \ and / + for(fn_ucs2 = info->FileName; *fn_ucs2 != L'\0'; fn_ucs2++) { + if(*fn_ucs2 != L'\\' && *fn_ucs2 != L'/') { + break; + } + } + + if((info->Attribute & EFI_FILE_DIRECTORY) != 0) { + if(fn_len == 0) { + return_code = LV_FS_RES_UNKNOWN; + goto error; + } + fn[0] = '/'; + fn++; + fn_len--; + } + + if(lv_uefi_ucs2_to_ascii(fn_ucs2, fn, fn_len) == 0) { + LV_LOG_WARN("[lv_uefi] Unable to convert the UCS-2 path into an ascii path."); + return_code = LV_FS_RES_UNKNOWN; + goto error; + } + + return_code = LV_FS_RES_OK; + goto finish; + +error: + +finish: + if(info) lv_free(info); + + return return_code; +} + +static lv_fs_res_t lv_fs_uefi_dir_close_cb(lv_fs_drv_t * drv, void * rddir_p) +{ + EFI_STATUS status; + lv_uefi_fs_file_context_t * file_ctx = (lv_uefi_fs_file_context_t *)rddir_p; + + if(file_ctx == NULL || file_ctx->interface == NULL) return LV_FS_RES_INV_PARAM; + + status = file_ctx->interface->Close(file_ctx->interface); + if(status != EFI_SUCCESS) return LV_FS_RES_HW_ERR; + + lv_free(file_ctx); + + return LV_FS_RES_OK; +} + +static void lv_fs_drv_uefi_init(lv_fs_drv_t * drv, char fs_drive_letter, EFI_HANDLE fs_handle) +{ + LV_ASSERT_NULL(drv); + LV_ASSERT_NULL(fs_handle); + + lv_fs_drv_init(drv); + + drv->letter = fs_drive_letter; + drv->cache_size = 0; + + drv->ready_cb = lv_fs_uefi_ready_cb; + drv->open_cb = lv_fs_uefi_open_cb; + drv->close_cb = lv_fs_uefi_close_cb; + drv->read_cb = lv_fs_uefi_read_cb; + drv->write_cb = lv_fs_uefi_write_cb; + drv->seek_cb = lv_fs_uefi_seek_cb; + drv->tell_cb = lv_fs_uefi_tell_cb; + + drv->dir_open_cb = lv_fs_uefi_dir_open_cb; + drv->dir_read_cb = lv_fs_uefi_dir_read_cb; + drv->dir_close_cb = lv_fs_uefi_dir_close_cb; + + drv->user_data = (void *) fs_handle; +} + +static void lv_fs_drv_uefi_deinit(lv_fs_drv_t * drv) +{ + LV_ASSERT_NULL(drv); + drv->user_data = NULL; +} + +static void lv_fs_uefi_lvgl_path_to_uefi_path(CHAR16 * path) +{ + if(path == NULL) return; + + for(; *path != '\0'; path++) { + if(*path == L'/') *path = L'\\'; + } +} + +static void lv_fs_uefi_uefi_path_to_lvgl_path(CHAR16 * path) +{ + if(path == NULL) return; + + for(; *path != '\0'; path++) { + if(*path == L'\\') *path = L'/'; + } +} + +static bool lv_fs_uefi_is_dot_path(CONST CHAR16 * path) +{ + if(path == NULL) return FALSE; + + if(path[0] == L'.' && path[1] == L'\0') return TRUE; + if(path[0] == L'.' && path[1] == L'.' && path[2] == L'\0') return TRUE; + + return FALSE; +} + +static bool lv_fs_uefi_is_dir(EFI_FILE_PROTOCOL * dir) +{ + UINT64 attributes; + + if(dir == NULL) return FALSE; + + EFI_FILE_INFO * info = lv_fs_uefi_get_info(dir); + if(info == NULL) return FALSE; + + attributes = info->Attribute; + lv_free(info); + + return (attributes & EFI_FILE_DIRECTORY) != 0; +} + +static bool lv_fs_uefi_is_file(EFI_FILE_PROTOCOL * file) +{ + UINT64 attributes; + + if(file == NULL) return FALSE; + + EFI_FILE_INFO * info = lv_fs_uefi_get_info(file); + if(info == NULL) return FALSE; + + attributes = info->Attribute; + lv_free(info); + + return (attributes & EFI_FILE_DIRECTORY) == 0; +} + +static EFI_FILE_INFO * lv_fs_uefi_get_info(EFI_FILE_PROTOCOL * file) +{ + EFI_STATUS status; + EFI_FILE_INFO * info = NULL; + UINTN size = 0; + + status = file->GetInfo(file, &_uefi_guid_file_info, &size, info); + if(status != EFI_BUFFER_TOO_SMALL) return NULL; + + info = lv_calloc(1, size); + LV_ASSERT_MALLOC(info); + + status = file->GetInfo(file, &_uefi_guid_file_info, &size, info); + if(status != EFI_SUCCESS) { + lv_free(info); + return NULL; + } + + return info; +} + +#else /* LV_FS_UEFI_LETTER == 0*/ + +#if defined(LV_FS_UEFI_LETTER) && LV_FS_UEFI_LETTER != '\0' + #warning "LV_FS_UEFI is not enabled but LV_FS_UEFI_LETTER is set" +#endif + +#endif diff --git a/inc/lvgl/src/libs/fsdrv/lv_fs_win32.c b/inc/lvgl/src/libs/fsdrv/lv_fs_win32.c new file mode 100644 index 0000000..ddccf66 --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fs_win32.c @@ -0,0 +1,472 @@ +/** + * @file lv_fs_win32.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" +#if LV_USE_FS_WIN32 + +#include +#include +#include + +#include "../../core/lv_global.h" +/********************* + * DEFINES + *********************/ + +#if !LV_FS_IS_VALID_LETTER(LV_FS_WIN32_LETTER) + #error "Invalid drive letter" +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + HANDLE dir_p; + char next_fn[LV_FS_MAX_PATH_LEN]; + lv_fs_res_t next_error; +} dir_handle_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool is_dots_name(const char * name); +static lv_fs_res_t fs_error_from_win32(DWORD error); +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p); +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len); +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register a driver for the File system interface + */ +void lv_fs_win32_init(void) +{ + /*--------------------------------------------------- + * Register the file system interface in LVGL + *--------------------------------------------------*/ + + /*Add a simple driver to open images*/ + lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->win32_fs_drv); + lv_fs_drv_init(fs_drv_p); + + /*Set up fields...*/ + fs_drv_p->letter = LV_FS_WIN32_LETTER; + fs_drv_p->cache_size = LV_FS_WIN32_CACHE_SIZE; + + fs_drv_p->open_cb = fs_open; + fs_drv_p->close_cb = fs_close; + fs_drv_p->read_cb = fs_read; + fs_drv_p->write_cb = fs_write; + fs_drv_p->seek_cb = fs_seek; + fs_drv_p->tell_cb = fs_tell; + + fs_drv_p->dir_close_cb = fs_dir_close; + fs_drv_p->dir_open_cb = fs_dir_open; + fs_drv_p->dir_read_cb = fs_dir_read; + + lv_fs_drv_register(fs_drv_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Check the dots name + * @param name file or dir name + * @return true if the name is dots name + */ +static bool is_dots_name(const char * name) +{ + return name[0] == '.' && (!name[1] || (name[1] == '.' && !name[2])); +} + +/** + * Convert Win32 error code to error from lv_fs_res_t enum + * @param error Win32 error code + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_error_from_win32(DWORD error) +{ + lv_fs_res_t res; + + switch(error) { + case ERROR_SUCCESS: + res = LV_FS_RES_OK; + break; + case ERROR_BAD_UNIT: + case ERROR_NOT_READY: + case ERROR_CRC: + case ERROR_SEEK: + case ERROR_NOT_DOS_DISK: + case ERROR_WRITE_FAULT: + case ERROR_READ_FAULT: + case ERROR_GEN_FAILURE: + case ERROR_WRONG_DISK: + res = LV_FS_RES_HW_ERR; + break; + case ERROR_INVALID_HANDLE: + case ERROR_INVALID_TARGET_HANDLE: + res = LV_FS_RES_FS_ERR; + break; + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + case ERROR_INVALID_DRIVE: + case ERROR_NO_MORE_FILES: + case ERROR_SECTOR_NOT_FOUND: + case ERROR_BAD_NETPATH: + case ERROR_BAD_NET_NAME: + case ERROR_BAD_PATHNAME: + case ERROR_FILENAME_EXCED_RANGE: + res = LV_FS_RES_NOT_EX; + break; + case ERROR_DISK_FULL: + res = LV_FS_RES_FULL; + break; + case ERROR_SHARING_VIOLATION: + case ERROR_LOCK_VIOLATION: + case ERROR_DRIVE_LOCKED: + res = LV_FS_RES_LOCKED; + break; + case ERROR_ACCESS_DENIED: + case ERROR_CURRENT_DIRECTORY: + case ERROR_WRITE_PROTECT: + case ERROR_NETWORK_ACCESS_DENIED: + case ERROR_CANNOT_MAKE: + case ERROR_FAIL_I24: + case ERROR_SEEK_ON_DEVICE: + case ERROR_NOT_LOCKED: + case ERROR_LOCK_FAILED: + res = LV_FS_RES_DENIED; + break; + case ERROR_BUSY: + res = LV_FS_RES_BUSY; + break; + case ERROR_TIMEOUT: + res = LV_FS_RES_TOUT; + break; + case ERROR_NOT_SAME_DEVICE: + case ERROR_DIRECT_ACCESS_HANDLE: + res = LV_FS_RES_NOT_IMP; + break; + case ERROR_TOO_MANY_OPEN_FILES: + case ERROR_ARENA_TRASHED: + case ERROR_NOT_ENOUGH_MEMORY: + case ERROR_INVALID_BLOCK: + case ERROR_OUT_OF_PAPER: + case ERROR_SHARING_BUFFER_EXCEEDED: + case ERROR_NOT_ENOUGH_QUOTA: + res = LV_FS_RES_OUT_OF_MEM; + break; + case ERROR_INVALID_FUNCTION: + case ERROR_INVALID_ACCESS: + case ERROR_INVALID_DATA: + case ERROR_BAD_COMMAND: + case ERROR_BAD_LENGTH: + case ERROR_INVALID_PARAMETER: + case ERROR_NEGATIVE_SEEK: + res = LV_FS_RES_INV_PARAM; + break; + default: + res = LV_FS_RES_UNKNOWN; + break; + } + + return res; +} + +/** + * Open a file + * @param drv pointer to a driver where this function belongs + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return pointer to FIL struct or NULL in case of fail + */ +static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) +{ + LV_UNUSED(drv); + + DWORD desired_access = 0; + + if(mode & LV_FS_MODE_RD) { + desired_access |= GENERIC_READ; + } + + if(mode & LV_FS_MODE_WR) { + desired_access |= GENERIC_WRITE; + } + + /*Make the path relative to the current directory (the projects root folder)*/ + + char buf[MAX_PATH]; + lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s", path); + + return (void *)CreateFileA( + buf, + desired_access, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); +} + +/** + * Close an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p) +{ + LV_UNUSED(drv); + return CloseHandle((HANDLE)file_p) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Read data from an opened file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. + * @param buf pointer to a memory block where to store the read data + * @param btr number of Bytes To Read + * @param br the real number of read bytes (Byte Read) + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + LV_UNUSED(drv); + return ReadFile((HANDLE)file_p, buf, btr, (LPDWORD)br, NULL) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Write into a file + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + LV_UNUSED(drv); + return WriteFile((HANDLE)file_p, buf, btw, (LPDWORD)bw, NULL) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Set the read write pointer. Also expand the file size if necessary. + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable. (opened with fs_open ) + * @param pos the new position of read write pointer + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + LV_UNUSED(drv); + + DWORD move_method = (DWORD) -1; + if(whence == LV_FS_SEEK_SET) { + move_method = FILE_BEGIN; + } + else if(whence == LV_FS_SEEK_CUR) { + move_method = FILE_CURRENT; + } + else if(whence == LV_FS_SEEK_END) { + move_method = FILE_END; + } + + LARGE_INTEGER distance_to_move; + distance_to_move.QuadPart = pos; + return SetFilePointerEx((HANDLE)file_p, distance_to_move, NULL, move_method) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); +} + +/** + * Give the position of the read write pointer + * @param drv pointer to a driver where this function belongs + * @param file_p pointer to a FILE variable + * @param pos_p pointer to store the result + * @return LV_FS_RES_OK: no error, the file is read + * any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + LV_UNUSED(drv); + + if(!pos_p) { + return LV_FS_RES_INV_PARAM; + } + + LARGE_INTEGER file_pointer; + file_pointer.QuadPart = 0; + + LARGE_INTEGER distance_to_move; + distance_to_move.QuadPart = 0; + if(SetFilePointerEx( + (HANDLE)file_p, + distance_to_move, + &file_pointer, + FILE_CURRENT)) { + if(file_pointer.QuadPart > LONG_MAX) { + return LV_FS_RES_INV_PARAM; + } + else { + *pos_p = file_pointer.LowPart; + return LV_FS_RES_OK; + } + } + else { + return fs_error_from_win32(GetLastError()); + } +} + +/** + * Initialize a 'DIR' or 'HANDLE' variable for directory reading + * @param drv pointer to a driver where this function belongs + * @param path path to a directory + * @return pointer to an initialized 'DIR' or 'HANDLE' variable + */ +static void * fs_dir_open(lv_fs_drv_t * drv, const char * path) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)lv_malloc(sizeof(dir_handle_t)); + handle->dir_p = INVALID_HANDLE_VALUE; + handle->next_error = LV_FS_RES_OK; + WIN32_FIND_DATAA fdata; + + /*Make the path relative to the current directory (the projects root folder)*/ + char buf[LV_FS_MAX_PATH_LEN]; + lv_snprintf(buf, sizeof(buf), LV_FS_WIN32_PATH "%s\\*", path); + + lv_strcpy(handle->next_fn, ""); + handle->dir_p = FindFirstFileA(buf, &fdata); + + if(handle->dir_p != INVALID_HANDLE_VALUE) { + do { + if(is_dots_name(fdata.cFileName)) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } while(FindNextFileA(handle->dir_p, &fdata)); + } + + if(handle->dir_p == INVALID_HANDLE_VALUE) { + lv_free(handle); + handle->next_error = fs_error_from_win32(GetLastError()); + return INVALID_HANDLE_VALUE; + } + else { + handle->next_error = LV_FS_RES_OK; + return handle; + } +} + +/** + * Read the next filename from a directory. + * The name of the directories will begin with '/' + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint32_t fn_len) +{ + LV_UNUSED(drv); + if(fn_len == 0) return LV_FS_RES_INV_PARAM; + + dir_handle_t * handle = (dir_handle_t *)dir_p; + lv_strlcpy(fn, handle->next_fn, fn_len); + lv_fs_res_t current_error = handle->next_error; + lv_strcpy(handle->next_fn, ""); + + WIN32_FIND_DATAA fdata; + + while(FindNextFileA(handle->dir_p, &fdata)) { + if(is_dots_name(fdata.cFileName)) { + continue; + } + else { + if(fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "/%s", fdata.cFileName); + } + else { + lv_snprintf(handle->next_fn, sizeof(handle->next_fn), "%s", fdata.cFileName); + } + break; + } + } + + if(handle->next_fn[0] == '\0') { + handle->next_error = fs_error_from_win32(GetLastError()); + } + + return current_error; +} + +/** + * Close the directory reading + * @param drv pointer to a driver where this function belongs + * @param dir_p pointer to an initialized 'DIR' or 'HANDLE' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p) +{ + LV_UNUSED(drv); + dir_handle_t * handle = (dir_handle_t *)dir_p; + lv_fs_res_t res = FindClose(handle->dir_p) + ? LV_FS_RES_OK + : fs_error_from_win32(GetLastError()); + lv_free(handle); + return res; +} + +#else /*LV_USE_FS_WIN32 == 0*/ + +#if defined(LV_FS_WIN32_LETTER) && LV_FS_WIN32_LETTER != '\0' + #warning "LV_USE_FS_WIN32 is not enabled but LV_FS_WIN32_LETTER is set" +#endif + +#endif diff --git a/inc/lvgl/src/libs/fsdrv/lv_fsdrv.h b/inc/lvgl/src/libs/fsdrv/lv_fsdrv.h new file mode 100644 index 0000000..049a80f --- /dev/null +++ b/inc/lvgl/src/libs/fsdrv/lv_fsdrv.h @@ -0,0 +1,119 @@ +/** + * @file lv_fsdrv.h + * + */ + +#ifndef LV_FSDRV_H +#define LV_FSDRV_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +#define LV_FS_MAX_PATH_LEN 256 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_USE_FS_FATFS +void lv_fs_fatfs_init(void); +#endif + +#if LV_USE_FS_STDIO +void lv_fs_stdio_init(void); +#endif + +#if LV_USE_FS_POSIX +void lv_fs_posix_init(void); +#endif + +#if LV_USE_FS_WIN32 +void lv_fs_win32_init(void); +#endif + +#if LV_USE_FS_MEMFS +void lv_fs_memfs_init(void); +#endif + +#if LV_USE_FS_LITTLEFS +#include "lfs.h" +struct lfs; +/** + * Set the default LittleFS handler to be used by LVGL + * @param lfs pointer to an initialized LittleFS filesystem structure + */ +void lv_littlefs_set_handler(struct lfs * lfs); + +/** + * Initialize LittleFS file system driver + */ +void lv_fs_littlefs_init(void); + +/** + * Register a LittleFS drive with LVGL + * @param lfs pointer to an initialized LittleFS filesystem structure + * @param letter driver letter to register (e.g. 'A') + * @return LV_FS_RES_OK: success, LV_FS_RES_INV_PARAM: lfs is NULL or letter not in range A-Z, + * LV_FS_RES_DRIVE_LETTER_ALREADY_USED: A drive with this letter is already registered + */ +lv_fs_res_t lv_fs_littlefs_register_drive(lfs_t * lfs, char letter); +#endif + +#if LV_USE_FS_ARDUINO_ESP_LITTLEFS +void lv_fs_arduino_esp_littlefs_init(void); +#endif + +#if LV_USE_FS_ARDUINO_SD +void lv_fs_arduino_sd_init(void); +#endif + +#if LV_USE_FS_UEFI +void lv_fs_uefi_init(void); +#endif + +#if LV_USE_FS_FROGFS +void lv_fs_frogfs_init(void); +void lv_fs_frogfs_deinit(void); + +/** + * Mount a frogfs blob at the path prefix. If there is a file "foo.txt" + * in the blob and the blob is registered with `path_prefix` as "my_blob", + * it can be opened later at path "my_blob/foo.txt". + * @param blob a frogfs blob/image from mkfrogfs.py + * @param path_prefix a prefix that will be used to refer to this blob when accessing it. + * @return LV_RESULT_OK or LV_RESULT_INVALID if there was an issue with the blob + */ +lv_result_t lv_fs_frogfs_register_blob(const void * blob, const char * path_prefix); + +/** + * Unmount a frogfs blob that was previously mounted by `lv_fs_frogfs_register_blob`. + * All files and dirs should be closed before calling this. + * @param path_prefix the path prefix that the blob was registered with + */ +void lv_fs_frogfs_unregister_blob(const char * path_prefix); + +#endif /*LV_USE_FS_FROGFS*/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_FSDRV_H*/ diff --git a/inc/lvgl/src/libs/gif/AnimatedGIF.h b/inc/lvgl/src/libs/gif/AnimatedGIF.h new file mode 100644 index 0000000..0922520 --- /dev/null +++ b/inc/lvgl/src/libs/gif/AnimatedGIF.h @@ -0,0 +1,229 @@ +// Copyright 2020 BitBank Software, Inc. All Rights Reserved. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//=========================================================================== + +#ifndef __ANIMATEDGIF__ +#define __ANIMATEDGIF__ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GIF + +#include "../../misc/lv_fs.h" + +// +// GIF Animator +// Written by Larry Bank +// Copyright (c) 2020 BitBank Software, Inc. +// bitbank@pobox.com +// +// Designed to decode images up to 480x320 on MCUs +// using less than 22K of RAM +// ...and decode any sized image when more RAM is available +// +// ** NEW ** +// Turbo mode added Feb 18, 2024. This option decodes images +// up to 30x faster if there is enough RAM (48K + full framebuffer) +// + +/* GIF Defines and variables */ +#define MAX_CHUNK_SIZE 255 +// +// These 2 macros can be changed to limit the amount of RAM +// required by the decoder. For example, decoding 1-bit images to +// a 128x32 display will not need a max code size of 12 nor a palette +// with 256 entries +// +#define TURBO_BUFFER_SIZE 0x6100 + +// If you intend to decode generic GIFs, you want this value to be 12. If you are using GIFs solely for animations in +// your own project, and you control the GIFs you intend to play, then you can save additional RAM here: +// the decoder must reserve a minimum of 4 byte * (1<10kB RAM, but you will not be able to decode arbitrary +// images anymore. One application to craft such GIFs can be found here (use option -d) +// https://create.stephan-brumme.com/flexigif-lossless-gif-lzw-optimization/ +#define MAX_CODE_SIZE 12 + +#define MAX_COLORS 256 +#define MAX_WIDTH 480 +#define LZW_BUF_SIZE (6*MAX_CHUNK_SIZE) +#define LZW_HIGHWATER (4*MAX_CHUNK_SIZE) +// This buffer is used to store the pixel sequence in reverse order +// it needs to be large enough to hold the longest possible +// sequence (1<iError = GIF_SUCCESS; + pGIF->pfnRead = readMem; + pGIF->pfnSeek = seekMem; + pGIF->pfnDraw = pfnDraw; + pGIF->pfnOpen = NULL; + pGIF->pfnClose = NULL; + pGIF->GIFFile.iSize = iDataSize; + pGIF->GIFFile.pData = pData; + return GIFInit(pGIF); +} /* GIF_openRAM() */ + +int GIF_openFile(GIFIMAGE *pGIF, const char *szFilename, GIF_DRAW_CALLBACK *pfnDraw) +{ + pGIF->iError = GIF_SUCCESS; + pGIF->pfnRead = readFile; + pGIF->pfnSeek = seekFile; + pGIF->pfnDraw = pfnDraw; + pGIF->pfnOpen = NULL; + pGIF->pfnClose = closeFile; + + lv_fs_res_t res = lv_fs_open(&pGIF->GIFFile.fHandle, szFilename, LV_FS_MODE_RD); + + if (res != LV_FS_RES_OK) { + pGIF->iError = GIF_FILE_NOT_OPEN; + LV_LOG_WARN("Failed to open file: %s, res: %d", szFilename, res); + return 0; + } + + lv_fs_seek(&pGIF->GIFFile.fHandle, 0, LV_FS_SEEK_END); + uint32_t pos; + lv_fs_tell(&pGIF->GIFFile.fHandle, &pos); + pGIF->GIFFile.iSize = pos; + lv_fs_seek(&pGIF->GIFFile.fHandle, 0, LV_FS_SEEK_SET); + + int ret = GIFInit(pGIF); + if (!ret) { + LV_LOG_WARN("Failed to initialize GIF from file: %s, err: %d", szFilename, pGIF->iError); + lv_fs_close(&pGIF->GIFFile.fHandle); + } + + return ret; +} /* GIF_openFile() */ + +void GIF_close(GIFIMAGE *pGIF) +{ + if (pGIF->pfnClose) + (*pGIF->pfnClose)(&pGIF->GIFFile.fHandle); +} /* GIF_close() */ + +void GIF_begin(GIFIMAGE *pGIF, unsigned char ucPaletteType) +{ + lv_memset(pGIF, 0, sizeof(GIFIMAGE)); + pGIF->ucPaletteType = ucPaletteType; +} /* GIF_begin() */ + +void GIF_reset(GIFIMAGE *pGIF) +{ + (*pGIF->pfnSeek)(&pGIF->GIFFile, 0); +} /* GIF_reset() */ + +// +// Return value: +// 1 = good decode, more frames exist +// 0 = good decode, no more frames +// -1 = error +// +int GIF_playFrame(GIFIMAGE *pGIF, int *delayMilliseconds, void *pUser) +{ +int rc; + + if (delayMilliseconds) + *delayMilliseconds = 0; // clear any old valid + if (pGIF->GIFFile.iPos >= pGIF->GIFFile.iSize-1) // no more data exists + { + (*pGIF->pfnSeek)(&pGIF->GIFFile, 0); // seek to start + } + if (GIFParseInfo(pGIF, 0)) + { + pGIF->pUser = pUser; + if (pGIF->iError == GIF_EMPTY_FRAME) // don't try to decode it + return 0; + if (pGIF->pTurboBuffer) { // the presence of the Turbo buffer indicates Turbo mode + rc = DecodeLZWTurbo(pGIF, 0); + } else { + rc = DecodeLZW(pGIF, 0); + } + if (rc != 0) // problem + return 0; + } + else + { + return 0; // error parsing the frame info, we may be at the end of the file + } + // Return 1 for more frames or 0 if this was the last frame + if (delayMilliseconds) // if not NULL, return the frame delay time + *delayMilliseconds = pGIF->iFrameDelay; + return (pGIF->GIFFile.iPos < pGIF->GIFFile.iSize-1); +} /* GIF_playFrame() */ + +int GIF_getCanvasWidth(GIFIMAGE *pGIF) +{ + return pGIF->iCanvasWidth; +} /* GIF_getCanvasWidth() */ + +int GIF_getCanvasHeight(GIFIMAGE *pGIF) +{ + return pGIF->iCanvasHeight; +} /* GIF_getCanvasHeight() */ + +int GIF_getLoopCount(GIFIMAGE *pGIF) +{ + return pGIF->iRepeatCount; +} /* GIF_getLoopCount() */ + +int GIF_getComment(GIFIMAGE *pGIF, char *pDest) +{ +int32_t iOldPos; + + iOldPos = pGIF->GIFFile.iPos; // keep old position + (*pGIF->pfnSeek)(&pGIF->GIFFile, pGIF->iCommentPos); + (*pGIF->pfnRead)(&pGIF->GIFFile, (uint8_t *)pDest, pGIF->sCommentLen); + (*pGIF->pfnSeek)(&pGIF->GIFFile, iOldPos); + pDest[pGIF->sCommentLen] = 0; // zero terminate the string + return (int)pGIF->sCommentLen; + +} /* GIF_getComment() */ + +int GIF_getLastError(GIFIMAGE *pGIF) +{ + return pGIF->iError; +} /* GIF_getLastError() */ + +// +// Helper functions for memory based images +// +static int32_t readMem(GIFFILE *pFile, uint8_t *pBuf, int32_t iLen) +{ + int32_t iBytesRead; + + iBytesRead = iLen; + if ((pFile->iSize - pFile->iPos) < iLen) + iBytesRead = pFile->iSize - pFile->iPos; + if (iBytesRead <= 0) + return 0; + lv_memmove(pBuf, &pFile->pData[pFile->iPos], iBytesRead); + pFile->iPos += iBytesRead; + return iBytesRead; +} /* readMem() */ + +static int32_t seekMem(GIFFILE *pFile, int32_t iPosition) +{ + if (iPosition < 0) iPosition = 0; + else if (iPosition >= pFile->iSize) iPosition = pFile->iSize-1; + pFile->iPos = iPosition; + return iPosition; +} /* seekMem() */ + +static void closeFile(lv_fs_file_t *handle) +{ + lv_fs_close(handle); +} /* closeFile() */ + +static int32_t seekFile(GIFFILE *pFile, int32_t iPosition) +{ + if (iPosition < 0) iPosition = 0; + else if (iPosition >= pFile->iSize) iPosition = pFile->iSize-1; + pFile->iPos = iPosition; + lv_fs_seek(&pFile->fHandle, iPosition, LV_FS_SEEK_SET); + return iPosition; +} /* seekMem() */ + +static int32_t readFile(GIFFILE *pFile, uint8_t *pBuf, int32_t iLen) +{ + int32_t iBytesRead; + + iBytesRead = iLen; + if ((pFile->iSize - pFile->iPos) < iLen) + iBytesRead = pFile->iSize - pFile->iPos; + if (iBytesRead <= 0) + return 0; + uint32_t br; + lv_fs_read(&pFile->fHandle, pBuf, iBytesRead, &br); + iBytesRead = br; + pFile->iPos += iBytesRead; + return iBytesRead; +} /* readFile() */ + +// +// The following functions are written in plain C and have no +// 3rd party dependencies, not even the C runtime library +// +// +// Initialize a GIF file and callback access from a file on SD or memory +// returns 1 for success, 0 for failure +// Fills in the canvas size of the GIFIMAGE structure +// +static int GIFInit(GIFIMAGE *pGIF) +{ + pGIF->GIFFile.iPos = 0; // start at beginning of file + if (!GIFParseInfo(pGIF, 1)) // gather info for the first frame + return 0; // something went wrong; not a GIF file? + (*pGIF->pfnSeek)(&pGIF->GIFFile, 0); // seek back to start of the file + if (pGIF->iCanvasWidth > MAX_WIDTH || pGIF->iCanvasHeight > 32767) { // too big or corrupt + pGIF->iError = GIF_TOO_WIDE; + return 0; + } + return 1; +} /* GIFInit() */ + +// +// Parse the GIF header, gather the size and palette info +// If called with bInfoOnly set to true, it will test for a valid file +// and return the canvas size only +// Returns 1 for success, 0 for failure +// +static int GIFParseInfo(GIFIMAGE *pPage, int bInfoOnly) +{ + int i, j, iColorTableBits; + int iBytesRead; + unsigned char c, *p; + int32_t iOffset = 0; + int32_t iStartPos = pPage->GIFFile.iPos; // starting file position + int iReadSize; + + pPage->bUseLocalPalette = 0; // assume no local palette + pPage->bEndOfFrame = 0; // we're just getting started + pPage->iFrameDelay = 0; // may not have a gfx extension block + pPage->iRepeatCount = -1; // assume NETSCAPE loop count is not specified + iReadSize = MAX_CHUNK_SIZE; + // If you try to read past the EOF, the SD lib will return garbage data + if (iStartPos + iReadSize > pPage->GIFFile.iSize) + iReadSize = (pPage->GIFFile.iSize - iStartPos - 1); + p = pPage->ucFileBuf; + iBytesRead = (*pPage->pfnRead)(&pPage->GIFFile, pPage->ucFileBuf, iReadSize); // 255 is plenty for now + + if (iBytesRead != iReadSize) // we're at the end of the file + { + pPage->iError = GIF_EARLY_EOF; + return 0; + } + if (iStartPos == 0) // start of the file + { // canvas size + if (lv_memcmp(p, "GIF89", 5) != 0 && lv_memcmp(p, "GIF87", 5) != 0) // not a GIF file + { + pPage->iError = GIF_BAD_FILE; + return 0; + } + pPage->iCanvasWidth = pPage->iWidth = INTELSHORT(&p[6]); + pPage->iCanvasHeight = pPage->iHeight = INTELSHORT(&p[8]); + pPage->iBpp = ((p[10] & 0x70) >> 4) + 1; + iColorTableBits = (p[10] & 7) + 1; // Log2(size) of the color table + pPage->ucBackground = p[11]; // background color + pPage->ucGIFBits = 0; + iOffset = 13; + if (p[10] & 0x80) // global color table? + { // by default, convert to byte-reversed RGB565 for immediate use + // Read enough additional data for the color table + iBytesRead += (*pPage->pfnRead)(&pPage->GIFFile, &pPage->ucFileBuf[iBytesRead], 3*(1<ucPaletteType == GIF_PALETTE_RGB565_LE || pPage->ucPaletteType == GIF_PALETTE_RGB565_BE) { + for (i=0; i<(1<> 3) << 11); // R + usRGB565 |= ((p[iOffset+1] >> 2) << 5); // G + usRGB565 |= (p[iOffset+2] >> 3); // B + if (pPage->ucPaletteType == GIF_PALETTE_RGB565_LE) + pPage->pPalette[i] = usRGB565; + else + pPage->pPalette[i] = (usRGB565 << 8) | (usRGB565 >> 8); // SPI wants MSB first + iOffset += 3; + } + } else if (pPage->ucPaletteType == GIF_PALETTE_1BPP || pPage->ucPaletteType == GIF_PALETTE_1BPP_OLED) { + uint8_t *pPal1 = (uint8_t*)pPage->pPalette; + for (i=0; i<(1<= 512); // bright enough = 1 + iOffset += 3; + } + } else { // just copy it as-is (RGB888 & RGB8888 output) + lv_memcpy(pPage->pPalette, &p[iOffset], (1<ucGIFBits = p[iOffset+1]; // packed fields + pPage->iFrameDelay = (INTELSHORT(&p[iOffset+2]))*10; // delay in ms + if (pPage->iFrameDelay <= 1) // 0-1 is going to make it run at 60fps; use 100 (10fps) as a reasonable substitute + pPage->iFrameDelay = 100; + if (pPage->ucGIFBits & 1) // transparent color is used + pPage->ucTransparent = p[iOffset+4]; // transparent color index + iOffset += 6; + } + // else // error + break; + case 0xff: /* App extension */ + c = 1; + while (c) /* Skip all data sub-blocks */ + { + c = p[iOffset++]; /* Block length */ + if ((iBytesRead - iOffset) < (c+32)) // need to read more data first + { + lv_memmove(pPage->ucFileBuf, &pPage->ucFileBuf[iOffset], (iBytesRead-iOffset)); // move existing data down + iBytesRead -= iOffset; + iStartPos += iOffset; + iOffset = 0; + iBytesRead += (*pPage->pfnRead)(&pPage->GIFFile, &pPage->ucFileBuf[iBytesRead], c+32); + } + if (c == 11) // fixed block length + { // Netscape app block contains the repeat count + if (lv_memcmp(&p[iOffset], "NETSCAPE2.0", 11) == 0) + { + if (p[iOffset+11] == 3 && p[iOffset+12] == 1) // loop count + pPage->iRepeatCount = INTELSHORT(&p[iOffset+13]); + } + } + iOffset += (int)c; /* Skip to next sub-block */ + } + break; + case 0x01: /* Text extension */ + c = 1; + j = 0; + while (c) /* Skip all data sub-blocks */ + { + c = p[iOffset++]; /* Block length */ + if (j == 0) // use only first block + { + j = c; + if (j > 127) // max comment length = 127 + j = 127; + // memcpy(pPage->szInfo1, &p[iOffset], j); + // pPage->szInfo1[j] = '\0'; + j = 1; + } + iOffset += (int)c; /* Skip this sub-block */ + } + break; + case 0xfe: /* Comment */ + c = 1; + while (c) /* Skip all data sub-blocks */ + { + c = p[iOffset++]; /* Block length */ + if ((iBytesRead - iOffset) < (c+32)) // need to read more data first + { + lv_memmove(pPage->ucFileBuf, &pPage->ucFileBuf[iOffset], (iBytesRead-iOffset)); // move existing data down + iBytesRead -= iOffset; + iStartPos += iOffset; + iOffset = 0; + iBytesRead += (*pPage->pfnRead)(&pPage->GIFFile, &pPage->ucFileBuf[iBytesRead], c+32); + } + if (pPage->iCommentPos == 0) // Save first block info + { + pPage->iCommentPos = iStartPos + iOffset; + pPage->sCommentLen = c; + } + iOffset += (int)c; /* Skip this sub-block */ + } + break; + default: + /* Bad header info */ + pPage->iError = GIF_DECODE_ERROR; + return 0; + } /* switch */ + } + else // invalid byte, stop decoding + { + if (pPage->GIFFile.iSize - iStartPos < 32) // non-image bytes at end of file? + pPage->iError = GIF_EMPTY_FRAME; + else + /* Bad header info */ + pPage->iError = GIF_DECODE_ERROR; + return 0; + } + } /* while */ + if (bInfoOnly) + return 1; // we've got the info we needed, leave + if (p[iOffset] == ';') { // end of file, quit and return a correct error code + pPage->iError = GIF_EMPTY_FRAME; + return 1; + } + + if (p[iOffset] == ',') + iOffset++; + // This particular frame's size and position on the main frame (if animated) + pPage->iX = INTELSHORT(&p[iOffset]); + pPage->iY = INTELSHORT(&p[iOffset+2]); + pPage->iWidth = INTELSHORT(&p[iOffset+4]); + pPage->iHeight = INTELSHORT(&p[iOffset+6]); + if (pPage->iWidth > pPage->iCanvasWidth || pPage->iHeight > pPage->iCanvasHeight || + pPage->iWidth + pPage->iX > pPage->iCanvasWidth || pPage->iHeight + pPage->iY > pPage->iCanvasHeight) { + pPage->iError = GIF_DECODE_ERROR; // must be a corrupt file to encounter this error here + return 0; + } + iOffset += 8; + + /* Image descriptor + 7 6 5 4 3 2 1 0 M=0 - use global color map, ignore pixel + M I 0 0 0 pixel M=1 - local color map follows, use pixel + I=0 - Image in sequential order + I=1 - Image in interlaced order + pixel+1 = # bits per pixel for this image + */ + pPage->ucMap = p[iOffset++]; + if (pPage->ucMap & 0x80) // local color table? + {// by default, convert to byte-reversed RGB565 for immediate use + j = (1<<((pPage->ucMap & 7)+1)); + // Read enough additional data for the color table + iBytesRead += (*pPage->pfnRead)(&pPage->GIFFile, &pPage->ucFileBuf[iBytesRead], j*3); + if (pPage->ucPaletteType == GIF_PALETTE_RGB565_LE || pPage->ucPaletteType == GIF_PALETTE_RGB565_BE) + { + for (i=0; i> 3) << 11); // R + usRGB565 |= ((p[iOffset+1] >> 2) << 5); // G + usRGB565 |= (p[iOffset+2] >> 3); // B + if (pPage->ucPaletteType == GIF_PALETTE_RGB565_LE) + pPage->pLocalPalette[i] = usRGB565; + else + pPage->pLocalPalette[i] = (usRGB565 << 8) | (usRGB565 >> 8); // SPI wants MSB first + iOffset += 3; + } + } else if (pPage->ucPaletteType == GIF_PALETTE_1BPP || pPage->ucPaletteType == GIF_PALETTE_1BPP_OLED) { + uint8_t *pPal1 = (uint8_t*)pPage->pLocalPalette; + for (i=0; i= 512); // bright enough = 1 + iOffset += 3; + } + } else { // just copy it as-is + lv_memcpy(pPage->pLocalPalette, &p[iOffset], j * 3); + iOffset += j*3; + } + pPage->bUseLocalPalette = 1; + } + pPage->ucCodeStart = p[iOffset++]; /* initial code size */ + /* Since GIF can be 1-8 bpp, we only allow 1,4,8 */ + pPage->iBpp = cGIFBits[pPage->ucCodeStart]; + // we are re-using the same buffer turning GIF file data + // into "pure" LZW + pPage->iLZWSize = 0; // we're starting with no LZW data yet + c = 1; // get chunk length + while (c && iOffset < iBytesRead) + { +// Serial.printf("iOffset=%d, iBytesRead=%d\n", iOffset, iBytesRead); + c = p[iOffset++]; // get chunk length +// Serial.printf("Chunk size = %d\n", c); + if (c <= (iBytesRead - iOffset)) + { + lv_memcpy(&pPage->ucLZW[pPage->iLZWSize], &p[iOffset], c); + pPage->iLZWSize += c; + iOffset += c; + } + else // partial chunk in our buffer + { + int iPartialLen = (iBytesRead - iOffset); + lv_memcpy(&pPage->ucLZW[pPage->iLZWSize], &p[iOffset], iPartialLen); + pPage->iLZWSize += iPartialLen; + iOffset += iPartialLen; + (*pPage->pfnRead)(&pPage->GIFFile, &pPage->ucLZW[pPage->iLZWSize], c - iPartialLen); + pPage->iLZWSize += (c - iPartialLen); + } + if (c == 0) + pPage->bEndOfFrame = 1; // signal not to read beyond the end of the frame + } +// seeking on an SD card is VERY VERY SLOW, so use the data we've already read by de-chunking it +// in this case, there's too much data, so we have to seek backwards a bit + if (iOffset < iBytesRead) + { +// Serial.printf("Need to seek back %d bytes\n", iBytesRead - iOffset); + (*pPage->pfnSeek)(&pPage->GIFFile, iStartPos + iOffset); // position file to new spot + } + return 1; // we are now at the start of the chunk data +} /* GIFParseInfo() */ +// +// Gather info about an animated GIF file +// +int GIF_getInfo(GIFIMAGE *pPage, GIFINFO *pInfo) +{ + int iOff, iNumFrames; + int iDelay, iMaxDelay, iMinDelay, iTotalDelay; + int iReadAmount; + int iDataAvailable = 0; + int iDataRemaining = 0; + // uint32_t lFileOff = 0; + int bDone = 0; + int bExt; + uint8_t c, *cBuf; + + iMaxDelay = iTotalDelay = 0; + iMinDelay = 10000; + iNumFrames = 1; + iDataRemaining = pPage->GIFFile.iSize; + cBuf = (uint8_t *) pPage->ucFileBuf; + (*pPage->pfnSeek)(&pPage->GIFFile, 0); + iDataAvailable = (*pPage->pfnRead)(&pPage->GIFFile, cBuf, FILE_BUF_SIZE); + iDataRemaining -= iDataAvailable; + // lFileOff += iDataAvailable; + iOff = 10; + c = cBuf[iOff]; // get info bits + iOff += 3; /* Skip flags, background color & aspect ratio */ + if (c & 0x80) /* Deal with global color table */ + { + c &= 7; /* Get the number of colors defined */ + iOff += (2<pfnRead)(&pPage->GIFFile, &cBuf[iDataAvailable], FILE_BUF_SIZE-iDataAvailable); + iDataAvailable += iReadAmount; + iDataRemaining -= iReadAmount; + // lFileOff += iReadAmount; + } + switch(cBuf[iOff]) + { + case 0x3b: /* End of file */ + /* we were fooled into thinking there were more pages */ + iNumFrames--; + goto gifpagesz; + // F9 = Graphic Control Extension (fixed length of 4 bytes) + // FE = Comment Extension + // FF = Application Extension + // 01 = Plain Text Extension + case 0x21: /* Extension block */ + if (cBuf[iOff+1] == 0xf9 && cBuf[iOff+2] == 4) // Graphic Control Extension + { + //cBuf[iOff+3]; // page disposition flags + iDelay = cBuf[iOff+4]; // delay low byte + iDelay |= ((uint16_t)(cBuf[iOff+5]) << 8); // delay high byte + if (iDelay < 2) // too fast, provide a default + iDelay = 2; + iDelay *= 10; // turn JIFFIES into milliseconds + iTotalDelay += iDelay; + if (iDelay > iMaxDelay) iMaxDelay = iDelay; + else if (iDelay < iMinDelay) iMinDelay = iDelay; + // (cBuf[iOff+6]; // transparent color index + } + iOff += 2; /* skip to length */ + iOff += (int)cBuf[iOff]; /* Skip the data block */ + iOff++; + // block terminator or optional sub blocks + c = cBuf[iOff++]; /* Skip any sub-blocks */ + while (c) + { + iOff += (int)c; + c = cBuf[iOff++]; + if ((iDataAvailable - iOff) < (c+258)) // need to read more data first + { + lv_memmove(cBuf, &cBuf[iOff], (iDataAvailable-iOff)); // move existing data down + iDataAvailable -= iOff; + iOff = 0; + iReadAmount = (*pPage->pfnRead)(&pPage->GIFFile, &cBuf[iDataAvailable], FILE_BUF_SIZE-iDataAvailable); + iDataAvailable += iReadAmount; + iDataRemaining -= iReadAmount; + // lFileOff += iReadAmount; + } + } + if (c != 0) // problem, we went past the end + { + iNumFrames--; // possible corrupt data; stop + goto gifpagesz; + } + break; + case 0x2c: /* Start of image data */ + bExt = 0; /* Stop doing extension blocks */ + break; + default: + /* Corrupt data, stop here */ + iNumFrames--; + goto gifpagesz; + } // switch + } // while + if (iOff >= iDataAvailable) // problem + { + iNumFrames--; // possible corrupt data; stop + goto gifpagesz; + } + /* Start of image data */ + c = cBuf[iOff+9]; /* Get the flags byte */ + iOff += 10; /* Skip image position and size */ + if (c & 0x80) /* Local color table */ + { + c &= 7; + iOff += (2<pfnRead)(&pPage->GIFFile, &cBuf[iDataAvailable], FILE_BUF_SIZE-iDataAvailable); + iDataAvailable += iReadAmount; + iDataRemaining -= iReadAmount; + // lFileOff += iReadAmount; + } + c = cBuf[iOff++]; + while (c) /* While there are more data blocks */ + { + if (iOff > (3*FILE_BUF_SIZE/4) && iDataRemaining > 0) /* Near end of buffer, re-align */ + { + lv_memmove(cBuf, &cBuf[iOff], (iDataAvailable-iOff)); // move existing data down + iDataAvailable -= iOff; + iOff = 0; + iReadAmount = (FILE_BUF_SIZE - iDataAvailable); + if (iReadAmount > iDataRemaining) + iReadAmount = iDataRemaining; + iReadAmount = (*pPage->pfnRead)(&pPage->GIFFile, &cBuf[iDataAvailable], iReadAmount); + iDataAvailable += iReadAmount; + iDataRemaining -= iReadAmount; + // lFileOff += iReadAmount; + } + iOff += (int)c; /* Skip this data block */ +// if ((int)lFileOff + iOff > pPage->GIFFile.iSize) // past end of file, stop +// { +// iNumFrames--; // don't count this page +// break; // last page is corrupted, don't use it +// } + c = cBuf[iOff++]; /* Get length of next */ + } + /* End of image data, check for more pages... */ + if (cBuf[iOff] == 0x3b || (iDataRemaining == 0 && (iDataAvailable - iOff) < 32)) + { + bDone = 1; /* End of file has been reached */ + } + else /* More pages to scan */ + { + iNumFrames++; + // read new page data starting at this offset + if (pPage->GIFFile.iSize > FILE_BUF_SIZE && iDataRemaining > 0) // since we didn't read the whole file in one shot + { + lv_memmove(cBuf, &cBuf[iOff], (iDataAvailable-iOff)); // move existing data down + iDataAvailable -= iOff; + iOff = 0; + iReadAmount = (FILE_BUF_SIZE - iDataAvailable); + if (iReadAmount > iDataRemaining) + iReadAmount = iDataRemaining; + iReadAmount = (*pPage->pfnRead)(&pPage->GIFFile, &cBuf[iDataAvailable], iReadAmount); + iDataAvailable += iReadAmount; + iDataRemaining -= iReadAmount; + // lFileOff += iReadAmount; + } + } + } /* while !bDone */ +gifpagesz: + pInfo->iFrameCount = iNumFrames; + pInfo->iMaxDelay = iMaxDelay; + pInfo->iMinDelay = iMinDelay; + pInfo->iDuration = iTotalDelay; + return 1; +} /* GIF_getInfo() */ + +// +// Unpack more chunk data for decoding +// returns 1 to signify more data available for this image +// 0 indicates there is no more data +// +static int GIFGetMoreData(GIFIMAGE *pPage) +{ + int iDelta = (pPage->iLZWSize - pPage->iLZWOff); + int iLZWBufSize; + unsigned char c = 1; + + // Turbo mode uses combined buffers to read more compressed data + iLZWBufSize = (pPage->pTurboBuffer) ? LZW_BUF_SIZE_TURBO : LZW_BUF_SIZE; + // move any existing data down + if (pPage->bEndOfFrame || iDelta >= (iLZWBufSize - MAX_CHUNK_SIZE) || iDelta <= 0) + return 1; // frame is finished or buffer is already full; no need to read more data + if (pPage->iLZWOff != 0) + { +// NB: memcpy() fails on some systems because the src and dest ptrs overlap +// so copy the bytes in a simple loop to avoid problems + for (int i=0; iiLZWSize - pPage->iLZWOff; i++) { + pPage->ucLZW[i] = pPage->ucLZW[i + pPage->iLZWOff]; + } + pPage->iLZWSize -= pPage->iLZWOff; + pPage->iLZWOff = 0; + } + while (c && pPage->GIFFile.iPos < pPage->GIFFile.iSize && pPage->iLZWSize < (iLZWBufSize-MAX_CHUNK_SIZE)) + { + (*pPage->pfnRead)(&pPage->GIFFile, &c, 1); // current length + (*pPage->pfnRead)(&pPage->GIFFile, &pPage->ucLZW[pPage->iLZWSize], c); + pPage->iLZWSize += c; + } + if (c == 0) // end of frame + pPage->bEndOfFrame = 1; + return (c != 0 && pPage->GIFFile.iPos < pPage->GIFFile.iSize); // more data available? +} /* GIFGetMoreData() */ +// +// Draw and convert pixels when the user wants fully rendered output +// +static void DrawCooked(GIFIMAGE *pPage, GIFDRAW *pDraw, void *pDest) +{ + uint8_t c, *s, *d8, *pEnd; + uint8_t *pActivePalette; + + pActivePalette = (pPage->bUseLocalPalette) ? (uint8_t *)pPage->pLocalPalette : (uint8_t *)pPage->pPalette; + // d8 points to the line in the full sized canvas where the new opaque pixels will be merged + d8 = &pPage->pFrameBuffer[pDraw->iX + (pDraw->iY + pDraw->y) * pPage->iCanvasWidth]; + s = pDraw->pPixels; // s points to the newly decoded pixels of this line of the current frame + pEnd = s + pDraw->iWidth; // faster way to loop over the source pixels - eliminates a counter variable + + if (pPage->ucPaletteType == GIF_PALETTE_1BPP || pPage->ucPaletteType == GIF_PALETTE_1BPP_OLED) { // 1-bit mono + uint8_t *d = NULL; + uint8_t *pPal = pActivePalette; + uint8_t uc, ucMask; + int iPitch = 0; + if (pPage->ucPaletteType == GIF_PALETTE_1BPP) { // horizontal pixels + d = pPage->pFrameBuffer; + iPitch = (pPage->iCanvasWidth+7)/8; + d += (pPage->iCanvasWidth * pPage->iCanvasHeight); + d += pDraw->iX/8; // starting column + d += (pDraw->iY + pDraw->y) * iPitch; + // Apply the new pixels to the main image and generate 1-bpp output + if (pDraw->ucHasTransparency) { // if transparency used + uint8_t ucTransparent = pDraw->ucTransparent; + if (pDraw->ucDisposalMethod == 2) { // restore to background color + uint8_t u8BG = pPal[pDraw->ucBackground]; + if (u8BG == 1) u8BG = 0xff; // set all bits to use mask + uc = *d; ucMask = (0x80 >> (pDraw->iX & 7));; + while (s < pEnd) { + c = *s++; + if (c != ucTransparent) { + if (pPal[c]) + uc |= ucMask; + else + uc &= ~ucMask; + *d8++ = c; + } else { + uc |= (u8BG & ucMask); // transparent pixel is restored to background color + *d8++ = pDraw->ucBackground; + } + ucMask >>= 1; + if (ucMask == 0) { // write the completed byte + *d++ = uc; + uc = *d; + ucMask = 0x80; + } + } + *d = uc; // write last partial byte + } else { // no disposal, just write non-transparent pixels + uc = *d; ucMask = (0x80 >> (pDraw->iX & 7)); + while (s < pEnd) { + c = *s++; + if (c != ucTransparent) { + if (pPal[c]) + uc |= ucMask; + else + uc &= ~ucMask; + *d8 = c; + } + d8++; + ucMask >>= 1; + if (ucMask == 0) { + *d++ = uc; + uc = *d; + ucMask = 0x80; + } + } + *d = uc; + } + } else { // convert everything as opaque + uc = *d; ucMask = (0x80 >> (pDraw->iX & 7)); // left pixel is MSB + while (s < pEnd) { + c = *d8++ = *s++; // just write the new opaque pixels over the old + if (pPal[c]) // if non-zero, set white pixel + uc |= ucMask; + else + uc &= ~ucMask; + ucMask >>= 1; + if (ucMask == 0) { // time to write the current byte + *d++ = uc; + uc = *d; + ucMask = 0x80; + } + } + *d = uc; + } + } else { // vertical pixels + d = pPage->pFrameBuffer; + d += (pPage->iCanvasWidth * pPage->iCanvasHeight); + d += pDraw->iX; // starting column + d += ((pDraw->iY + pDraw->y)>>3) * pPage->iCanvasWidth; + ucMask = 1 << ((pDraw->iY + pDraw->y) & 7); + // Apply the new pixels to the main image and generate 1-bpp output + if (pDraw->ucHasTransparency) { // if transparency used + uint8_t ucTransparent = pDraw->ucTransparent; + if (pDraw->ucDisposalMethod == 2) { // restore to background color + uint8_t u8BG = pPal[pDraw->ucBackground]; + u8BG *= ucMask; // set the right bit + while (s < pEnd) { + c = *s++; + uc = *d & ~ucMask; // clear old pixel + if (c != ucTransparent) { + uc |= (pPal[c] * ucMask); + *d8++ = c; + } else { + uc |= u8BG; // transparent pixel is restored to background color + *d8++ = pDraw->ucBackground; + } + *d++ = uc; // write back the updated pixel + } + } else { // no disposal, just write non-transparent pixels + while (s < pEnd) { + c = *s++; + uc = *d & ~ucMask; + if (c != ucTransparent) { + *d = uc | (pPal[c] * ucMask); + *d8 = c; + } + d++; + d8++; + } + } + } else { // convert everything as opaque + while (s < pEnd) { + c = *d8++ = *s++; // just write the new opaque pixels over the old + uc = *d & ~ucMask; + *d++ = uc | (pPal[c] * ucMask); + } + } + } + } else if (pPage->ucPaletteType == GIF_PALETTE_RGB565_LE || pPage->ucPaletteType == GIF_PALETTE_RGB565_BE) { + uint16_t *d, *pPal = (uint16_t *)pActivePalette; + d = (uint16_t *)pDest; // dest pointer to the cooked pixels + // Apply the new pixels to the main image + if (pDraw->ucHasTransparency) { // if transparency used + uint8_t ucTransparent = pDraw->ucTransparent; + if (pDraw->ucDisposalMethod == 2) { // restore to background color + uint16_t u16BG = pPal[pDraw->ucBackground]; + while (s < pEnd) { + c = *s++; + if (c != ucTransparent) { + *d++ = pPal[c]; + *d8++ = c; + } else { + *d++ = u16BG; // transparent pixel is restored to background color + *d8++ = pDraw->ucBackground; + } + } + } else { // no disposal, just write non-transparent pixels + while (s < pEnd) { + c = *s++; + if (c != ucTransparent) { + *d = pPal[c]; + *d8 = c; + } + d++; + d8++; + } + } + } else { // convert all pixels through the palette without transparency +#if REGISTER_WIDTH == 64 + // parallelize the writes + // optimizing for the write buffer helps; reading 4 bytes at a time vs 1 doesn't on M1 + while (s < pEnd + 4) { // group 4 pixels + BIGUINT bu; + uint8_t s0, s1, s2, s3; + uint16_t d1, d2, d3; + *(uint32_t *)d8 = *(uint32_t *)s; // just copy new opaque pixels over the old + s0 = s[0]; s1 = s[1]; s2 = s[2]; s3 = s[3]; + bu = pPal[s0]; // not much difference on Apple M1 + d1 = pPal[s1]; // but other processors may gain + d2 = pPal[s2]; // from unrolling the reads + d3 = pPal[s3]; + bu |= (BIGUINT)d1 << 16; + bu |= (BIGUINT)d2 << 32; + bu |= (BIGUINT)d3 << 48; + s += 4; + d8 += 4; + *(BIGUINT *)d = bu; + d += 4; + } +#endif + while (s < pEnd) { + c = *d8++ = *s++; // just write the new opaque pixels over the old + *d++ = pPal[c]; // and create the cooked pixels through the palette + } + } + } else { // 24bpp or 32bpp + uint8_t pixel, *d, *pPal; + int x; + d = (uint8_t *)pDest; + pPal = pActivePalette; + if (pDraw->ucHasTransparency) { + uint8_t ucTransparent = pDraw->ucTransparent; + if (pDraw->ucDisposalMethod == 2) { // restore to background color + uint8_t * bg = &pPal[pDraw->ucBackground * 3]; + if (pPage->ucPaletteType == GIF_PALETTE_RGB888) { + while (s < pEnd) { + pixel = *s++; + if (pixel != ucTransparent) { + *d8++ = pixel; + d[0] = pPal[(pixel * 3) + 2]; + d[1] = pPal[(pixel * 3) + 1]; + d[2] = pPal[(pixel * 3) + 0]; + d += 3; + } else { + *d8++ = pDraw->ucBackground; + d[0] = bg[2]; + d[1] = bg[1]; + d[2] = bg[0]; + d += 3; + } + } + } else { /* GIF_PALETTE_RGB8888 */ + while (s < pEnd) { + pixel = *s++; + if (pixel != ucTransparent) { + *d8++ = pixel; + d[0] = pPal[(pixel * 3) + 2]; + d[1] = pPal[(pixel * 3) + 1]; + d[2] = pPal[(pixel * 3) + 0]; + d[3] = 0xFF; + d += 4; + } else { + *d8++ = pDraw->ucBackground; + d[3] = 0x00; + d += 4; + } + } + } + } else { // no disposal, just write non-transparent pixels + if (pPage->ucPaletteType == GIF_PALETTE_RGB888) { + for (x=0; xiWidth; x++) { + pixel = *s++; + if (pixel != ucTransparent) { + *d8 = pixel; + d[0] = pPal[(pixel * 3) + 2]; // convert to RGB888 pixels + d[1] = pPal[(pixel * 3) + 1]; + d[2] = pPal[(pixel * 3) + 0]; + } + d8++; + d += 3; + } + } else { // must be RGBA32 + for (x=0; xiWidth; x++) { + pixel = *s++; + if (pixel != ucTransparent) { + *d8 = pixel; + d[0] = pPal[(pixel * 3) + 2]; // convert to RGB8888 pixels + d[1] = pPal[(pixel * 3) + 1]; + d[2] = pPal[(pixel * 3) + 0]; + d[3] = 0xff; + } + d8++; + d += 4; + } + } + } + } else { // no transparency + if (pPage->ucPaletteType == GIF_PALETTE_RGB888) { + for (x=0; xiWidth; x++) { + pixel = *d8++ = *s++; + *d++ = pPal[(pixel * 3) + 2]; // convert to RGB888 pixels + *d++ = pPal[(pixel * 3) + 1]; + *d++ = pPal[(pixel * 3) + 0]; + } + } else { // must be RGBA32 + for (x=0; xiWidth; x++) { + pixel = *d8++ = *s++; + *d++ = pPal[(pixel * 3) + 2]; // convert to RGB8888 pixels + *d++ = pPal[(pixel * 3) + 1]; + *d++ = pPal[(pixel * 3) + 0]; + *d++ = 0xff; + } + } + } // opaque + } +} /* DrawCooked() */ + +// +// Handle transparent pixels and disposal method +// Used only when a frame buffer is allocated +// +static void DrawNewPixels(GIFIMAGE *pPage, GIFDRAW *pDraw) +{ + uint8_t *d, *s; + int x, iPitch = pPage->iCanvasWidth; + + s = pDraw->pPixels; + d = &pPage->pFrameBuffer[pDraw->iX + (pDraw->y + pDraw->iY) * iPitch]; // dest pointer in our complete canvas buffer + + // Apply the new pixels to the main image + if (pDraw->ucHasTransparency) { // if transparency used + uint8_t c, ucTransparent = pDraw->ucTransparent; + if (pDraw->ucDisposalMethod == 2) { + lv_memset(d, pDraw->ucBackground, pDraw->iWidth); // start with background color + } + for (x=0; xiWidth; x++) { + c = *s++; + if (c != ucTransparent) + *d = c; + d++; + } + } else { // disposal method doesn't matter when there aren't any transparent pixels + lv_memcpy(d, s, pDraw->iWidth); // just overwrite the old pixels + } +} /* DrawNewPixels() */ +// +// LZWCopyBytes +// +// Output the bytes for a single code (checks for buffer len) +// +static int LZWCopyBytes(unsigned char *buf, int iOffset, uint32_t *pSymbols, uint16_t *pLengths) +{ +int iLen; +uint8_t c, *s, *d, *pEnd; +uint32_t u32Offset; + + iLen = *pLengths; + u32Offset = *pSymbols; + // The string data frequently writes past the end of the framebuffer (past last pixel) + // ...but with the placement of our code tables AFTER the framebuffer, it doesn't matter + // Adding a check for buffer overrun here slows everything down about 10% + s = &buf[u32Offset & 0x7fffff]; + d = &buf[iOffset]; + pEnd = &d[iLen]; + while (d < pEnd) // most frequent are 1-8 bytes in length, copy 4 or 8 bytes in these cases too + { +#ifdef ALLOWS_UNALIGNED +// This is a significant perf improvement compared to copying 1 byte at a time +// even though it will often copy too many bytes + BIGUINT tmp = *(BIGUINT *) s; + s += sizeof(BIGUINT); + *(BIGUINT *)d = tmp; + d += sizeof(BIGUINT); +#else +// CPUs which enforce unaligned address exceptions must do it 1 byte at a time + *d++ = *s++; +#endif + } + if (u32Offset & 0x800000) // was a newly used code + { + d = pEnd; // in case we overshot + c = (uint8_t)(u32Offset >> 24); + iLen++; + // since the code with extension byte has now been written to the output, fix the code + *pSymbols = iOffset; +// pSymbols[SYM_EXTRAS] = 0xffffffff; + *d = c; + *pLengths = (uint16_t)iLen; + } + return iLen; +} /* LZWCopyBytes() */ +// +// Macro to extract a variable length code +// +#define GET_CODE_TURBO if (bitnum > (REGISTER_WIDTH - MAX_CODE_SIZE/*codesize*/)) { p += (bitnum >> 3); \ + bitnum &= 7; ulBits = INTELLONG(p); } \ + code = ((ulBits >> bitnum) & sMask); \ + bitnum += codesize; + +// +// DecodeLZWTurbo +// +// Theory of operation: +// +// The 'traditional' LZW decoder maintains a dictionary with a linked list of codes. +// These codes build into longer chains as more data is decoded. To output the pixels, +// the linked list is traversed backwards from the last node to the first, then these +// pixels are copied in reverse order to the output bitmap. +// +// My decoder takes a different approach. The output image becomes the dictionary and +// the tables keep track of where in the output image the 'run' begins and its length. +// ** NB ** +// These tables cannot be 16-bit values because a single dictionary's output can be +// bigger than 64K +// +// I also work with the compressed data differently. Most decoders wind their way through +// the chunked data by constantly checking if the current chunk has run out of data. I +// take a different approach since modern machines have plenty of memory - I 'de-chunk' +// the data first so that the inner loop can just decode as fast as possible. I also keep +// a set of codes in a 64-bit local variable to minimize memory reads. +// +// These 2 changes result in a much faster decoder. For poorly compressed images, the +// speed gain is about 2.5x compared to giflib. For well compressed images (long runs) +// the speed can be as much as 30x faster. This is because it doesn't have to walk +// backwards through the linked list of codes when outputting pixels. It also doesn't +// have to copy pixels in reverse order, then unwind them. +// +static int DecodeLZWTurbo(GIFIMAGE *pImage, int iOptions) +{ +int i, bitnum; +int iUncompressedLen; +uint32_t code, oldcode, codesize, nextcode, nextlim; +uint32_t cc, eoi; +uint32_t sMask; +uint8_t c, *p, *buf, codestart, *pHighWater; +BIGUINT ulBits; +int iLen, iColors; +int iErr = GIF_SUCCESS; +int iOffset; +uint32_t *pSymbols; +uint16_t *pLengths; + + (void)iOptions; + pImage->iYCount = pImage->iHeight; // count down the lines + pImage->iXCount = pImage->iWidth; + bitnum = 0; + pHighWater = pImage->ucLZW + LZW_HIGHWATER_TURBO; + pImage->iLZWOff = 0; // Offset into compressed data + GIFGetMoreData(pImage); // Read some data to start + codestart = pImage->ucCodeStart; + iColors = 1 << codestart; + sMask = UINT32_MAX << (codestart+1); + sMask = 0xffffffff - sMask; + cc = (sMask >> 1) + 1; /* Clear code */ + eoi = cc + 1; + iUncompressedLen = (pImage->iWidth * pImage->iHeight); + buf = (uint8_t *)pImage->pTurboBuffer; + pSymbols = (uint32_t *)&buf[iUncompressedLen+256]; // we need 32-bits (really 23) for the offsets + pLengths = (uint16_t *)&pSymbols[4096]; // but only 16-bits for the length of any single string + iOffset = 0; // output data offset + p = pImage->ucLZW; // un-chunked LZW data + ulBits = INTELLONG(p); // start by reading some LZW data + // set up the default symbols (0..iColors-1) + for (i = 0; i= nextlim && codesize < MAX_CODE_SIZE) { + codesize++; + nextlim <<= 1; + sMask = (sMask << 1) | 1; + } + if (p >= pHighWater) { + pImage->iLZWOff = (int)(p - pImage->ucLZW); // restore object member var + GIFGetMoreData(pImage); // We need to read more LZW data + p = &pImage->ucLZW[pImage->iLZWOff]; + } + oldcode = code; + GET_CODE_TURBO + } /* while not end of LZW code stream */ + } // while not end of frame + if (pImage->ucDrawType == GIF_DRAW_COOKED && pImage->pfnDraw && pImage->pFrameBuffer) { // convert each line through the palette + GIFDRAW gd; + gd.iX = pImage->iX; + gd.iY = pImage->iY; + gd.iWidth = pImage->iWidth; + gd.iHeight = pImage->iHeight; + gd.pPalette = (pImage->bUseLocalPalette) ? pImage->pLocalPalette : pImage->pPalette; + gd.pPalette24 = (uint8_t *)gd.pPalette; // just cast the pointer for RGB888 + gd.ucIsGlobalPalette = pImage->bUseLocalPalette==1?0:1; + gd.pUser = pImage->pUser; + gd.ucPaletteType = pImage->ucPaletteType; + for (int y=0; yiHeight; y++) { + gd.y = y; + gd.pPixels = &buf[(y * pImage->iWidth)]; // source pixels + // Ugly logic to handle the interlaced line position, but it + // saves having to have another set of state variables + if (pImage->ucMap & 0x40) { // interlaced? + int height = pImage->iHeight-1; + if (gd.y > height / 2) + gd.y = gd.y * 2 - (height | 1); + else if (gd.y > height / 4) + gd.y = gd.y * 4 - ((height & ~1) | 2); + else if (gd.y > height / 8) + gd.y = gd.y * 8 - ((height & ~3) | 4); + else + gd.y = gd.y * 8; + } + gd.ucDisposalMethod = (pImage->ucGIFBits & 0x1c)>>2; + gd.ucTransparent = pImage->ucTransparent; + gd.ucHasTransparency = pImage->ucGIFBits & 1; + gd.ucBackground = pImage->ucBackground; + gd.iCanvasWidth = pImage->iCanvasWidth; + DrawCooked(pImage, &gd, &buf[pImage->iCanvasHeight * pImage->iCanvasWidth]); // dest = past end of canvas + gd.pPixels = &buf[pImage->iCanvasHeight * pImage->iCanvasWidth]; // point to the line we just converted + (*pImage->pfnDraw)(&gd); // callback to handle this line + } + } + return iErr; +} /* DecodeLZWTurbo() */ + +// +// GIFMakePels +// +static void GIFMakePels(GIFIMAGE *pPage, unsigned int code) +{ + int iPixCount; + unsigned short *giftabs; + unsigned char *buf, *s, *pEnd, *gifpels; + /* Copy this string of sequential pixels to output buffer */ + // iPixCount = 0; + pEnd = pPage->ucFileBuf; + s = pEnd + FILE_BUF_SIZE; /* Pixels will come out in reversed order */ + buf = pPage->ucLineBuf + (pPage->iWidth - pPage->iXCount); + giftabs = pPage->usGIFTable; + gifpels = &pPage->ucGIFPixels[PIXEL_LAST]; + while (code < LINK_UNUSED) + { + if (s == pEnd) /* Houston, we have a problem */ + { + return; /* Exit with error */ + } + *(--s) = gifpels[code]; + code = giftabs[code]; + } + iPixCount = (int)(intptr_t)(pEnd + FILE_BUF_SIZE - s); + while (iPixCount && pPage->iYCount > 0) + { + if (pPage->iXCount > iPixCount) /* Pixels fit completely on the line */ + { + pEnd = buf + iPixCount; + while (buf < pEnd) { +#ifdef ALLOWS_UNALIGNED +// This is a significant perf improvement compared to copying 1 byte at a time +// even though it will often copy too many bytes. Since we're not at the end of +// the line, it's okay to copy a few extra pixels. + BIGUINT tmp = *(BIGUINT *) s; + s += sizeof(BIGUINT); + *(BIGUINT *)buf = tmp; + buf += sizeof(BIGUINT); +#else + *buf++ = *s++; +#endif + } + pPage->iXCount -= iPixCount; + // iPixCount = 0; + if (pPage->iLZWOff >= LZW_HIGHWATER) + GIFGetMoreData(pPage); // We need to read more LZW data + return; + } + else /* Pixels cross into next line */ + { + GIFDRAW gd; + pEnd = buf + pPage->iXCount; + while (buf < pEnd) + { + *buf++ = *s++; + } + iPixCount -= pPage->iXCount; + pPage->iXCount = pPage->iWidth; /* Reset pixel count */ + // Prepare GIDRAW structure for callback + gd.iX = pPage->iX; + gd.iY = pPage->iY; + gd.iWidth = pPage->iWidth; + gd.iHeight = pPage->iHeight; + gd.pPixels = pPage->ucLineBuf; + gd.pPalette = (pPage->bUseLocalPalette) ? pPage->pLocalPalette : pPage->pPalette; + gd.pPalette24 = (uint8_t *)gd.pPalette; // just cast the pointer for RGB888 + gd.ucIsGlobalPalette = pPage->bUseLocalPalette==1?0:1; + gd.y = pPage->iHeight - pPage->iYCount; + // Ugly logic to handle the interlaced line position, but it + // saves having to have another set of state variables + if (pPage->ucMap & 0x40) { // interlaced? + int height = pPage->iHeight-1; + if (gd.y > height / 2) + gd.y = gd.y * 2 - (height | 1); + else if (gd.y > height / 4) + gd.y = gd.y * 4 - ((height & ~1) | 2); + else if (gd.y > height / 8) + gd.y = gd.y * 8 - ((height & ~3) | 4); + else + gd.y = gd.y * 8; + } + gd.ucDisposalMethod = (pPage->ucGIFBits & 0x1c)>>2; + gd.ucTransparent = pPage->ucTransparent; + gd.ucHasTransparency = pPage->ucGIFBits & 1; + gd.ucBackground = pPage->ucBackground; + gd.iCanvasWidth = pPage->iCanvasWidth; + gd.pUser = pPage->pUser; + gd.ucPaletteType = pPage->ucPaletteType; + if (pPage->pFrameBuffer) // update the frame buffer + { + int iPitch = 0, iBpp = 1, iOffset = pPage->iCanvasWidth * pPage->iCanvasHeight; + if (pPage->ucDrawType == GIF_DRAW_COOKED) { + if (!pPage->pfnDraw) { // no draw callback, prepare the full frame + switch (pPage->ucPaletteType) { + case GIF_PALETTE_1BPP: + iPitch = (pPage->iCanvasWidth + 7) / 8; + break; + case GIF_PALETTE_RGB565_BE: + case GIF_PALETTE_RGB565_LE: + iPitch = (pPage->iCanvasWidth * 2); + iBpp = 2; + break; + case GIF_PALETTE_RGB888: + iPitch = pPage->iCanvasWidth * 3; + iBpp = 3; + break; + case GIF_PALETTE_RGB8888: + iPitch = pPage->iCanvasWidth * 4; + iBpp = 4; + break; + } + iOffset += (iBpp * pPage->iX) + ((gd.y + pPage->iY) * iPitch); + } + DrawCooked(pPage, &gd, &pPage->pFrameBuffer[iOffset]); + // pass the cooked pixel pointer to the GIFDraw callback + gd.pPixels = &pPage->pFrameBuffer[iOffset]; + } else { // the user will manage converting them through the palette + DrawNewPixels(pPage, &gd); // merge the new opaque pixels + } + } + if (pPage->pfnDraw) { + (*pPage->pfnDraw)(&gd); // callback to handle this line + } + pPage->iYCount--; + buf = pPage->ucLineBuf; + if (pPage->iLZWOff >= LZW_HIGHWATER) + GIFGetMoreData(pPage); // We need to read more LZW data + } + } /* while */ + if (pPage->iLZWOff >= LZW_HIGHWATER) + GIFGetMoreData(pPage); // We need to read more LZW data + return; +} /* GIFMakePels() */ +// +// Macro to extract a variable length code +// +#define GET_CODE if (bitnum > (REGISTER_WIDTH - codesize)) { pImage->iLZWOff += (bitnum >> 3); \ + bitnum &= 7; ulBits = INTELLONG(&p[pImage->iLZWOff]); } \ + code = (unsigned short) (ulBits >> bitnum); /* Read a REGISTER_WIDTH chunk */ \ + code &= sMask; bitnum += codesize; +// +// Decode LZW into an image +// +static int DecodeLZW(GIFIMAGE *pImage, int iOptions) +{ + int i, bitnum; + unsigned short oldcode, codesize, nextcode, nextlim; + unsigned short *giftabs, cc, eoi; + signed short sMask; + unsigned char c, *gifpels, *p; + // int iStripSize; + //unsigned char **index; + BIGUINT ulBits; + unsigned short code; + (void)iOptions; // not used for now + // if output can be used for string table, do it faster + // if (bGIF && (OutPage->cBitsperpixel == 8 && ((OutPage->iWidth & 3) == 0))) + // return PILFastLZW(InPage, OutPage, bGIF, iOptions); + if (pImage->ucDrawType == GIF_DRAW_COOKED && pImage->pFrameBuffer == NULL && pImage->pfnDraw == NULL) { // without a framebuffer and a GIFDRAW callback, we cannot continue + pImage->iError = GIF_INVALID_PARAMETER; + return 1; // indicate a problem + } + // If the user selected RAW output and there is no GIFDRAW callback, that won't work either + if (pImage->ucDrawType == GIF_DRAW_RAW && pImage->pfnDraw == NULL) { + pImage->iError = GIF_INVALID_PARAMETER; + return 1; // indicate a problem + } + p = pImage->ucLZW; // un-chunked LZW data + sMask = 0xffff << (pImage->ucCodeStart + 1); + sMask = 0xffff - sMask; + cc = (sMask >> 1) + 1; /* Clear code */ + eoi = cc + 1; + giftabs = pImage->usGIFTable; + gifpels = pImage->ucGIFPixels; + pImage->iYCount = pImage->iHeight; // count down the lines + pImage->iXCount = pImage->iWidth; + bitnum = 0; + pImage->iLZWOff = 0; // Offset into compressed data + GIFGetMoreData(pImage); // Read some data to start + + // Initialize code table + // this part only needs to be initialized once + for (i = 0; i < cc; i++) + { + gifpels[PIXEL_FIRST + i] = gifpels[PIXEL_LAST + i] = (unsigned short) i; + giftabs[i] = LINK_END; + } +init_codetable: + codesize = pImage->ucCodeStart + 1; + sMask = 0xffff << (pImage->ucCodeStart + 1); + sMask = 0xffff - sMask; + nextcode = cc + 2; + nextlim = (unsigned short) ((1 << codesize)); + // This part of the table needs to be reset multiple times + lv_memset(&giftabs[cc], (uint8_t) LINK_UNUSED, sizeof(pImage->usGIFTable) - sizeof(giftabs[0])*cc); + ulBits = INTELLONG(&p[pImage->iLZWOff]); // start by reading 4 bytes of LZW data + GET_CODE + if (code == cc) // we just reset the dictionary, so get another code + { + GET_CODE + } + c = oldcode = code; + GIFMakePels(pImage, code); // first code is output as the first pixel + // Main decode loop + while (code != eoi && pImage->iYCount > 0) // && y < pImage->iHeight+1) /* Loop through all lines of the image (or strip) */ + { + GET_CODE + if (code == cc) /* Clear code?, and not first code */ + goto init_codetable; + if (code != eoi) + { + if (nextcode < nextlim) // for deferred cc case, don't let it overwrite the last entry (fff) + { + giftabs[nextcode] = oldcode; + gifpels[PIXEL_FIRST + nextcode] = c; // oldcode pixel value + gifpels[PIXEL_LAST + nextcode] = c = gifpels[PIXEL_FIRST + code]; + } + nextcode++; + if (nextcode >= nextlim && codesize < MAX_CODE_SIZE) + { + codesize++; + nextlim <<= 1; + sMask = nextlim - 1; + } + GIFMakePels(pImage, code); + oldcode = code; + } + } /* while not end of LZW code stream */ + return 0; +//gif_forced_error: +// free(pImage->pPixels); +// pImage->pPixels = NULL; +// return -1; +} /* DecodeLZW() */ + +#endif // LV_USE_GIF diff --git a/inc/lvgl/src/libs/gltf/fastgltf/lv_fastgltf.hpp b/inc/lvgl/src/libs/gltf/fastgltf/lv_fastgltf.hpp new file mode 100644 index 0000000..1626e86 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/fastgltf/lv_fastgltf.hpp @@ -0,0 +1,189 @@ +/** + * @file lv_fastgltf.hpp + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GLTF + +#include +#include +#include +#include +#include +#include + +#include "../gltf_data/lv_gltf_data_internal.hpp" + +namespace fastgltf +{ + +/** + * Computes the transform matrix for a given node a different way with less total operations + */ +FASTGLTF_EXPORT inline auto getFastLocalTransformMatrix(const Node & node) +{ + return visit_exhaustive(visitor { + [&](const math::fmat4x4 & matrix) + { + return matrix; + }, + [&](const TRS & trs) + { + math::fmat4x4 matrix = math::fmat4x4(); + float sx = trs.scale[0], sy = trs.scale[1], sz = trs.scale[2]; + float qx = trs.rotation[0], qy = trs.rotation[1], qz = trs.rotation[2], qw = trs.rotation[3]; + float x2 = qx + qx, y2 = qy + qy, z2 = qz + qz; + float xx = qx * x2, xy = qx * y2, xz = qx * z2; + float yy = qy * y2, yz = qy * z2, zz = qz * z2; + float wx = qw * x2, wy = qw * y2, wz = qw * z2; + matrix[0][0] = (1 - (yy + zz)) * sx; + matrix[0][1] = (xy + wz) * sx; + matrix[0][2] = (xz - wy) * sx; + matrix[1][0] = (xy - wz) * sy; + matrix[1][1] = (1 - (xx + zz)) * sy; + matrix[1][2] = (yz + wx) * sy; + matrix[2][0] = (xz + wy) * sz; + matrix[2][1] = (yz - wx) * sz; + matrix[2][2] = (1 - (xx + yy)) * sz; + matrix[3][0] = trs.translation[0]; + matrix[3][1] = trs.translation[1]; + matrix[3][2] = trs.translation[2]; + matrix[0][3] = 0.f; + matrix[1][3] = 0.f; + matrix[2][3] = 0.f; + matrix[3][3] = 1.f; + return matrix; + } + }, node.transform); +} + +/** + * Attempts to remove the scale component of a 4x4 matrix transform. Will silently fail if + * any of the component scales is 0 or near zero (which they should never be). + */ +FASTGLTF_EXPORT inline void removeScale(fastgltf::math::fmat4x4 & matrix) +{ + auto scale = math::fvec3(length(matrix.col(0)), length(matrix.col(1)), length(matrix.col(2))); + if((fabs(scale.x()) > 0.00001f) && (fabs(scale.y()) > 0.00001f) && (fabs(scale.z()) > 0.00001f)) { + matrix.col(0) /= scale.x(); + matrix.col(1) /= scale.y(); + matrix.col(2) /= scale.z(); + } +} + +FASTGLTF_EXPORT template +#if FASTGLTF_HAS_CONCEPTS + requires std::same_as, Asset> && + std::is_invocable_v +#endif +void namegen_iterate_scene_nodes(AssetType &&asset, + std::size_t sceneIndex, + Callback callback) +{ + auto & scene = asset.scenes[sceneIndex]; + + std::string _id = std::string(""); + std::string _ip = std::string(""); + if(asset.scenes.size() > 1) { + _id = "scene_" + std::to_string(sceneIndex); + _ip = std::to_string(sceneIndex); + } + auto function = [&](std::size_t nodeIndex, std::string & parentId, + std::string & parentIp, std::size_t __child_index, + auto & self) -> void { + assert(asset.nodes.size() > nodeIndex); + auto & node = asset.nodes[nodeIndex]; + std::string _nodeId = + parentId + std::string("/") + std::string(node.name); + std::string _nodeIp = parentIp + std::string(".") + + std::to_string(__child_index); + std::invoke(callback, node, _nodeId, _nodeIp, nodeIndex, + __child_index); + std::size_t ____child_index = 0; + for(auto & child : node.children) { + self(child, _nodeId, _nodeIp, ____child_index, self); + ____child_index += 1; + } + }; + std::size_t child_index = 0; + for(auto & sceneNode : scene.nodeIndices) { + function(sceneNode, _id, _ip, child_index, function); + child_index += 1; + } +} +FASTGLTF_EXPORT template +#if FASTGLTF_HAS_CONCEPTS + requires std::same_as, Asset> && + std::is_invocable_v +#endif +void +findlight_iterate_scene_nodes(AssetType &&asset, std::size_t sceneIndex, + math::fmat4x4 * initial, Callback callback) +{ + auto & scene = asset.scenes[sceneIndex]; + auto function = [&](std::size_t nodeIndex, + math::fmat4x4 & parentWorldMatrix, + auto & self) -> void { + assert(asset.nodes.size() > nodeIndex); + auto & node = asset.nodes[nodeIndex]; + auto _localMat = getFastLocalTransformMatrix(node); + std::invoke(callback, node, parentWorldMatrix, _localMat); + for(auto & child : node.children) { + math::fmat4x4 _parentWorldTemp = + parentWorldMatrix * _localMat; + self(child, _parentWorldTemp, self); + } + }; + for(auto & sceneNode : scene.nodeIndices) { + auto tmat2 = fastgltf::math::fmat4x4(*initial); + function(sceneNode, tmat2, function); + } +} +FASTGLTF_EXPORT template +inline void custom_iterate_scene_nodes(lv_gltf_model_t * model, std::size_t sceneIndex, math::fmat4x4 * initial, + Callback callback) +{ + auto & scene = model->asset.scenes[sceneIndex]; + + auto invoke_cb = [&](std::size_t node_index, math::fmat4x4 & parent_world_matrix, + auto & self) -> void { + lv_gltf_model_node_t * node = (lv_gltf_model_node_t *)lv_array_at(&model->nodes, node_index); + fastgltf::Node & fastgltf_node = *node->fastgltf_node; + LV_ASSERT(node->fastgltf_node == &fastgltf_node); + + auto local_matrix = getFastLocalTransformMatrix(fastgltf_node); + std::invoke(callback, node, parent_world_matrix, local_matrix); + + uint32_t num_children = fastgltf_node.children.size(); + if(num_children == 0) { + return; + } + math::fmat4x4 new_parent_world_matrix = parent_world_matrix * local_matrix; + if(num_children == 1) + { + self(fastgltf_node.children[0], new_parent_world_matrix, self); + return; + } + math::fmat4x4 parent_world_matrix_tmp_copy = math::fmat4x4(new_parent_world_matrix); + for(auto & child : fastgltf_node.children) + { + self(child, parent_world_matrix_tmp_copy, self); + } + }; + + for(size_t i = 0 ; i < scene.nodeIndices.size(); ++i) { + invoke_cb(scene.nodeIndices[i], *initial, invoke_cb); + } +} + +} + + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data.cpp new file mode 100644 index 0000000..1c554be --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data.cpp @@ -0,0 +1,289 @@ +/** + * @file lv_gltf_data.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_data_internal.hpp" + +#if LV_USE_GLTF + +#include +#include "../../../misc/lv_assert.h" +#include "../../../core/lv_obj_pos.h" +#include "../../../misc/lv_timer.h" +#include "../gltf_view/lv_gltf_view_internal.h" + + +/********************* + * DEFINES + *********************/ + + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void update_animation_cb(lv_timer_t * timer); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +lv_gltf_model_t * lv_gltf_data_create_internal(const char * gltf_path, + fastgltf::Asset asset) +{ + lv_gltf_model_t * data = (lv_gltf_model_t *)lv_zalloc(sizeof(*data)); + LV_ASSERT_MALLOC(data); + new(data) lv_gltf_model_t; + new(&data->asset) fastgltf::Asset(std::move(asset)); + data->filename = gltf_path; + data->last_camera_index = -5; + data->last_anim_num = -5; + data->current_animation_max_time = 0; + data->local_timestamp = 0.0f; + data->last_material_index = 99999; + data->last_frame_was_antialiased = false; + data->last_frame_no_motion = false; + data->_last_frame_no_motion = false; + + data->animation_update_timer = lv_timer_create(update_animation_cb, LV_DEF_REFR_PERIOD, data); + lv_timer_pause(data->animation_update_timer); + LV_ASSERT_NULL(data->animation_update_timer); + + new(&data->node_transform_cache) NodeTransformMap(); + new(&data->opaque_nodes_by_material_index) MaterialIndexMap(); + new(&data->blended_nodes_by_material_index) MaterialIndexMap(); + new(&data->validated_skins) LongVector(); + new(&data->skin_tex) IntVector(); + new(&data->local_mesh_to_center_points_by_primitive) + NodePrimCenterMap(); + new(&data->node_by_light_index) NodeVector(); + new(&data->meshes) std::vector(); + new(&data->textures) std::vector(); + + lv_array_init(&data->compiled_shaders, 1, sizeof(lv_gltf_compiled_shader_t)); + return data; +} + +void lv_gltf_data_delete(lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + lv_timer_delete(data->animation_update_timer); + data->animation_update_timer = NULL; + + lv_gltf_data_delete_textures(data); + uint32_t node_count = lv_array_size(&data->nodes); + for(uint32_t i = 0; i < node_count; ++i) { + lv_gltf_model_node_t * node = (lv_gltf_model_node_t *) lv_array_at(&data->nodes, i); + lv_gltf_model_node_deinit(node); + } + lv_array_deinit(&data->nodes); + lv_array_deinit(&data->compiled_shaders); + + /* Explicitly call destructors for C++ objects initialized with placement new */ + data->textures.~vector(); + data->meshes.~vector(); + data->node_by_light_index.~vector(); + data->local_mesh_to_center_points_by_primitive.~map(); + data->skin_tex.~vector(); + data->validated_skins.~vector(); + data->blended_nodes_by_material_index.~map(); + data->opaque_nodes_by_material_index.~map(); + data->node_transform_cache.~map(); + data->channel_set_cache.~map(); + data->asset.~Asset(); + + lv_free(data); +} + +const char * lv_gltf_get_filename(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->filename; +} + +size_t lv_gltf_model_get_image_count(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->asset.images.size(); +} + +size_t lv_gltf_model_get_texture_count(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->asset.textures.size(); +} + +GLuint lv_gltf_data_get_texture(lv_gltf_model_t * data, size_t index) +{ + LV_ASSERT_NULL(data); + LV_ASSERT(index < data->textures.size()); + return data->textures[index]; +} + +size_t lv_gltf_model_get_material_count(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->asset.materials.size(); +} +size_t lv_gltf_model_get_camera_count(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->asset.cameras.size(); +} +size_t lv_gltf_model_get_node_count(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->asset.nodes.size(); +} +size_t lv_gltf_model_get_mesh_count(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->asset.meshes.size(); +} +size_t lv_gltf_model_get_scene_count(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->asset.scenes.size(); +} +size_t lv_gltf_model_get_animation_count(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->asset.animations.size(); +} + +lv_result_t lv_gltf_model_play_animation(lv_gltf_model_t * model, size_t index) +{ + LV_ASSERT_NULL(model); + if(index >= model->asset.animations.size()) { + return LV_RESULT_INVALID; + } + + if(lv_timer_get_paused(model->animation_update_timer)) { + model->last_tick = lv_tick_get(); + lv_timer_resume(model->animation_update_timer); + } + + model->current_animation_max_time = lv_gltf_data_get_animation_total_time(model, index); + model->current_animation = index; + model->is_animation_enabled = true; + return LV_RESULT_OK; +} + +void lv_gltf_model_pause_animation(lv_gltf_model_t * model) +{ + LV_ASSERT_NULL(model); + model->is_animation_enabled = false; + lv_timer_pause(model->animation_update_timer); +} + +bool lv_gltf_model_is_animation_paused(lv_gltf_model_t * model) +{ + + LV_ASSERT_NULL(model); + return !model->is_animation_enabled; +} + +size_t lv_gltf_model_get_animation(lv_gltf_model_t * model) +{ + + LV_ASSERT_NULL(model); + return model->current_animation; +} + +lv_gltf_model_t * +lv_gltf_data_load_from_file(const char * file_path, + lv_opengl_shader_manager_t * shader_manager) +{ + return lv_gltf_data_load_internal(file_path, 0, shader_manager); +} + +lv_gltf_model_t * +lv_gltf_data_load_from_bytes(const uint8_t * data, size_t data_size, + lv_opengl_shader_manager_t * shader_manager) +{ + return lv_gltf_data_load_internal(data, data_size, shader_manager); +} + +fastgltf::Asset * lv_gltf_data_get_asset(lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return &data->asset; +} +double lv_gltf_data_get_radius(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->bound_radius; +} +fastgltf::math::fvec3 lv_gltf_data_get_center(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->vertex_cen; +} +fastgltf::math::fvec3 lv_gltf_data_get_bounds_min(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->vertex_min; +} +fastgltf::math::fvec3 lv_gltf_data_get_bounds_max(const lv_gltf_model_t * data) +{ + LV_ASSERT_NULL(data); + return data->vertex_max; +} + +void lv_gltf_data_copy_bounds_info(lv_gltf_model_t * to, lv_gltf_model_t * from) +{ + { + to->vertex_min[0] = from->vertex_min[0]; + to->vertex_min[1] = from->vertex_min[1]; + to->vertex_min[2] = from->vertex_min[2]; + } + { + to->vertex_max[0] = from->vertex_max[0]; + to->vertex_max[1] = from->vertex_max[1]; + to->vertex_max[2] = from->vertex_max[2]; + } + { + to->vertex_cen[0] = from->vertex_cen[0]; + to->vertex_cen[1] = from->vertex_cen[1]; + to->vertex_cen[2] = from->vertex_cen[2]; + } + to->bound_radius = from->bound_radius; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void update_animation_cb(lv_timer_t * timer) +{ + lv_gltf_model_t * model = (lv_gltf_model_t *)lv_timer_get_user_data(timer); + + const uint32_t current_tick = lv_tick_get(); + const uint32_t delta = lv_tick_diff(current_tick, model->last_tick); + + model->last_tick = current_tick; + model->local_timestamp += (delta * model->viewer->desc.animation_speed_ratio) / 1000; + + if(model->local_timestamp >= model->current_animation_max_time) { + model->local_timestamp = 50; + } + lv_obj_invalidate((lv_obj_t *)model->viewer); +} + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_animations.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_animations.cpp new file mode 100644 index 0000000..c0d45ac --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_animations.cpp @@ -0,0 +1,278 @@ +/** + * @file lv_gltf_data_animations.cpp + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_data_internal.hpp" + +#if LV_USE_GLTF +#include + +/********************* + * DEFINES + *********************/ + +#define TIME_LOC_PREPASS_COUNT 16 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#include "fastgltf/math.hpp" +#include "lv_gltf_data_internal.hpp" +static fastgltf::math::fvec3 animation_get_vec3_at_timestamp(lv_gltf_model_t * data, + fastgltf::AnimationSampler * sampler, + float seconds); + +static fastgltf::math::fquat animation_get_quat_at_timestamp(lv_gltf_model_t * data, + fastgltf::AnimationSampler * sampler, + float _seconds); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +uint32_t lv_gltf_data_get_animation_total_time(lv_gltf_model_t * data, uint32_t index) +{ + LV_ASSERT(data->asset.animations.size() > index); + auto & animation = data->asset.animations[index]; + float max_time = -1.0f; + for(uint64_t i = 0; i < animation.channels.size(); i++) { + auto & accessor = data->asset.accessors[animation.samplers[i].inputAccessor]; + max_time = std::max(max_time, fastgltf::getAccessorElement(data->asset, accessor, accessor.count - 1)); + } + return (uint32_t)(max_time * 1000); +} + +std::vector * lv_gltf_data_animation_get_channel_set(std::size_t anim_num, lv_gltf_model_t * data, + fastgltf::Node * node) +{ + const auto & asset = lv_gltf_data_get_asset(data); + size_t animation_count = lv_gltf_model_get_animation_count(data); + if(data->channel_set_cache.find(node) == data->channel_set_cache.end()) { + std::vector new_cache = std::vector(); + if(animation_count > anim_num) { + auto & anim = asset->animations[anim_num]; + + for(uint64_t c = 0; c < anim.channels.size(); c++) { + auto & channel = anim.channels[c]; + if(&(asset->nodes[channel.nodeIndex.value()]) == node) { + new_cache.push_back(c); + } + } + } + data->channel_set_cache[node] = new_cache; + } + return &data->channel_set_cache[node]; +} + + +void lv_gltf_data_animation_matrix_apply(float timestamp, std::size_t anim_num, lv_gltf_model_t * gltf_data, + fastgltf::Node * node, + fastgltf::math::fmat4x4 & matrix) +{ + const auto & asset = lv_gltf_data_get_asset(gltf_data); + + size_t animation_count = lv_gltf_model_get_animation_count(gltf_data); + auto _channel_set = lv_gltf_data_animation_get_channel_set(anim_num, gltf_data, node); + if(_channel_set->size() == 0) { + return; + } + if(animation_count > anim_num) { + auto & anim = asset->animations[anim_num]; + bool need_rot_recalc = false; + int32_t translation_comp_index = -1; + int32_t rotation_comp_index = -1; + int32_t scale_comp_index = -1; + + for(const auto & c : (*_channel_set)) { + switch(anim.channels[c].path) { + case fastgltf::AnimationPath::Translation: + translation_comp_index = c; + break; + case fastgltf::AnimationPath::Rotation: + rotation_comp_index = c; + need_rot_recalc = true; + break; + case fastgltf::AnimationPath::Scale: + scale_comp_index = c; + need_rot_recalc = true; + break; + case fastgltf::AnimationPath::Weights: + LV_LOG_WARN("Unhandled weights animation"); + break; + } + } + + if(need_rot_recalc) { + fastgltf::math::fvec3 new_scale; + fastgltf::math::fquat new_quat; + if(!((scale_comp_index > -1) && (rotation_comp_index > -1))) { + fastgltf::math::fvec3 unused; + fastgltf::math::decomposeTransformMatrix(matrix, new_scale, new_quat, unused); + } + if(scale_comp_index > -1) new_scale = animation_get_vec3_at_timestamp(gltf_data, &anim.samplers[scale_comp_index], + timestamp); + if(rotation_comp_index > -1) new_quat = animation_get_quat_at_timestamp(gltf_data, &anim.samplers[rotation_comp_index], + timestamp); + + float sx = new_scale[0], sy = new_scale[1], sz = new_scale[2]; + float qx = new_quat[0], qy = new_quat[1], qz = new_quat[2], qw = new_quat[3]; + + float x2 = qx + qx, y2 = qy + qy, z2 = qz + qz; + float xx = qx * x2, xy = qx * y2, xz = qx * z2; + float yy = qy * y2, yz = qy * z2, zz = qz * z2; + float wx = qw * x2, wy = qw * y2, wz = qw * z2; + + matrix[0][0] = (1 - (yy + zz)) * sx; + matrix[0][1] = (xy + wz) * sx; + matrix[0][2] = (xz - wy) * sx; + + matrix[1][0] = (xy - wz) * sy; + matrix[1][1] = (1 - (xx + zz)) * sy; + matrix[1][2] = (yz + wx) * sy; + + matrix[2][0] = (xz + wy) * sz; + matrix[2][1] = (yz - wx) * sz; + matrix[2][2] = (1 - (xx + yy)) * sz; + + /* These entries should not be necessary */ + //matrix[0][3] = 0.f; + //matrix[1][3] = 0.f; + //matrix[2][3] = 0.f; + } + + if(translation_comp_index > -1) { + fastgltf::math::fvec3 new_translation = animation_get_vec3_at_timestamp(gltf_data, + &anim.samplers[translation_comp_index], timestamp); + matrix[3][0] = new_translation[0]; + matrix[3][1] = new_translation[1]; + matrix[3][2] = new_translation[2]; + } + matrix[3][3] = 1.f; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static fastgltf::math::fquat animation_get_quat_at_timestamp(lv_gltf_model_t * data, + fastgltf::AnimationSampler * sampler, + float _seconds) +{ + const auto & asset = lv_gltf_data_get_asset(data); + auto & _inAcc = asset->accessors[sampler->inputAccessor]; + auto & _outAcc = asset->accessors[sampler->outputAccessor]; + std::size_t _inAccCount = _inAcc.count; + float _maxTime = fastgltf::getAccessorElement(*asset, _inAcc, _inAccCount - 1); + std::size_t _lowerIndex = 0; + float _lowerTimestamp = 0.0f; + + if(_seconds < 0.001f) { + _lowerIndex = 0; + } + else { + std::size_t _firstCheckOffset = 0; + std::size_t _lastCheckOffset = _inAccCount; + std::size_t _prepassLeft = TIME_LOC_PREPASS_COUNT; + while(_prepassLeft > 0) { + _prepassLeft -= 1; + if(_seconds >= fastgltf::getAccessorElement(*asset, _inAcc, (_firstCheckOffset + _lastCheckOffset) >> 1)) { + _firstCheckOffset = (_firstCheckOffset + _lastCheckOffset) >> 1; + } + else { + _lastCheckOffset = (_firstCheckOffset + _lastCheckOffset) >> 1; + if(_lastCheckOffset <= _firstCheckOffset + 1) { + _prepassLeft = 0; + } + } + } + for(uint64_t ii = _firstCheckOffset; ii < _inAccCount; ii++) { + float _stampTime = fastgltf::getAccessorElement(*asset, _inAcc, ii); + if(_stampTime > _seconds) { + _lowerIndex = ii - 1; + break; + } + _lowerTimestamp = _stampTime; + } + } + + fastgltf::math::fquat _lowerValue = fastgltf::getAccessorElement(*asset, _outAcc, _lowerIndex); + if(_seconds >= _maxTime || _seconds <= 0.0f) { + return _lowerValue; + } + std::size_t _upperIndex = _lowerIndex + 1; + float _linDist = fastgltf::getAccessorElement(*asset, _inAcc, _upperIndex) - _lowerTimestamp; + return fastgltf::math::slerp(_lowerValue, fastgltf::getAccessorElement(*asset, _outAcc, + _upperIndex), (_seconds - _lowerTimestamp) / _linDist); +} + +fastgltf::math::fvec3 animation_get_vec3_at_timestamp(lv_gltf_model_t * data, fastgltf::AnimationSampler * sampler, + float _seconds) +{ + const auto & asset = lv_gltf_data_get_asset(data); + auto & _inAcc = asset->accessors[sampler->inputAccessor]; + auto & _outAcc = asset->accessors[sampler->outputAccessor]; + std::size_t _inAccCount = _inAcc.count; + float _maxTime = fastgltf::getAccessorElement(*asset, _inAcc, _inAccCount - 1); + std::size_t _lowerIndex = 0; + float _lowerTimestamp = 0.0f; + + if(_seconds < 0.001f) { + _lowerIndex = 0; + } + else { + std::size_t _firstCheckOffset = 0; + std::size_t _lastCheckOffset = _inAccCount; + std::size_t _prepassLeft = TIME_LOC_PREPASS_COUNT; + while(_prepassLeft > 0) { + _prepassLeft -= 1; + if(_seconds >= fastgltf::getAccessorElement(*asset, _inAcc, (_firstCheckOffset + _lastCheckOffset) >> 1)) { + _firstCheckOffset = (_firstCheckOffset + _lastCheckOffset) >> 1; + } + else { + _lastCheckOffset = (_firstCheckOffset + _lastCheckOffset) >> 1; + if(_lastCheckOffset <= _firstCheckOffset + 1) { + _prepassLeft = 0; + } + } + } + for(uint64_t ii = _firstCheckOffset; ii < _inAccCount; ii++) { + float _stampTime = fastgltf::getAccessorElement(*asset, _inAcc, ii); + if(_stampTime > _seconds) { + _lowerIndex = ii - 1; + break; + } + _lowerTimestamp = _stampTime; + } + } + + fastgltf::math::fvec3 _lowerValue = fastgltf::getAccessorElement(*asset, _outAcc, _lowerIndex); + if(_seconds >= _maxTime || _seconds <= 0.0f) { + return _lowerValue; + } + std::size_t _upperIndex = _lowerIndex + 1; + fastgltf::math::fvec3 _upperValue = fastgltf::getAccessorElement(*asset, _outAcc, _upperIndex); + float _upperTimestamp = fastgltf::getAccessorElement(*asset, _inAcc, _upperIndex); + return fastgltf::math::lerp(_lowerValue, _upperValue, + (_seconds - _lowerTimestamp) / (_upperTimestamp - _lowerTimestamp)); +} + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_cache.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_cache.cpp new file mode 100644 index 0000000..69bae4e --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_cache.cpp @@ -0,0 +1,103 @@ +/** + * @file lv_gltf_data_cache.cpp + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_data_internal.hpp" + +#if LV_USE_GLTF +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +fastgltf::math::fmat4x4 lv_gltf_data_get_cached_transform(lv_gltf_model_t * data, + fastgltf::Node * node) +{ + return data->node_transform_cache[node]; +} + +bool lv_gltf_data_has_cached_transform(lv_gltf_model_t * data, fastgltf::Node * node) +{ + return (data->node_transform_cache.find(node) != + data->node_transform_cache.end()); +} +void lv_gltf_data_set_cached_transform(lv_gltf_model_t * data, fastgltf::Node * node, + fastgltf::math::fmat4x4 M) +{ + data->node_transform_cache[node] = M; +} +void lv_gltf_data_clear_transform_cache(lv_gltf_model_t * data) +{ + data->node_transform_cache.clear(); +} +bool lv_gltf_data_transform_cache_is_empty(lv_gltf_model_t * data) +{ + return data->node_transform_cache.size() == 0; +} + +void recache_centerpoint(lv_gltf_model_t * data, size_t index_mesh, int32_t primitive) +{ + data->local_mesh_to_center_points_by_primitive[index_mesh][primitive] = + lv_gltf_get_primitive_centerpoint(data, data->asset.meshes[index_mesh], + primitive); +} + +fastgltf::math::fvec3 lv_gltf_data_get_centerpoint(lv_gltf_model_t * gltf_data, + fastgltf::math::fmat4x4 matrix, + size_t mesh_index, int32_t elem) +{ + if(!lv_gltf_data_centerpoint_cache_contains(gltf_data, mesh_index, elem)) { + recache_centerpoint(gltf_data, mesh_index, elem); + } + return get_cached_centerpoint(gltf_data, mesh_index, elem, matrix); +} +bool lv_gltf_data_centerpoint_cache_contains(lv_gltf_model_t * data, size_t index, int32_t element) +{ + return data->local_mesh_to_center_points_by_primitive.find(index) != + data->local_mesh_to_center_points_by_primitive.end() && + data->local_mesh_to_center_points_by_primitive[index].find(element) != + data->local_mesh_to_center_points_by_primitive[index].end(); +} + +fastgltf::math::fvec3 get_cached_centerpoint(lv_gltf_model_t * data, size_t index, + int32_t element, + fastgltf::math::fmat4x4 matrix) +{ + fastgltf::math::fvec4 tv = fastgltf::math::fvec4( + data->local_mesh_to_center_points_by_primitive[index][element]); + tv[3] = 1.f; + tv = matrix * tv; + return fastgltf::math::fvec3(tv[0], tv[1], tv[2]); +} + + + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_injest.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_injest.cpp new file mode 100644 index 0000000..dda7425 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_injest.cpp @@ -0,0 +1,875 @@ +/** + * @file lv_gltf_data_injest.cpp + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gltf_data_internal.hpp" + +#if LV_USE_GLTF + +#include +#include +#include +#include +#include "../fastgltf/lv_fastgltf.hpp" +#include "../../../misc/lv_assert.h" +#include "../../../misc/lv_log.h" +#include "../../../misc/lv_math.h" +#include "../../../stdlib/lv_sprintf.h" +#include "../../../misc/lv_fs.h" + +#include "../stb_image/stb_image.h" +#include + +/********************* + * DEFINES + *********************/ +constexpr auto SUPPORTED_EXTENSIONS = + //fastgltf::Extensions::KHR_draco_mesh_compression | + //fastgltf::Extensions::EXT_meshopt_compression | + fastgltf::Extensions::KHR_mesh_quantization | fastgltf::Extensions::KHR_texture_transform | + fastgltf::Extensions::KHR_lights_punctual | fastgltf::Extensions::KHR_materials_anisotropy | + fastgltf::Extensions::KHR_materials_clearcoat | fastgltf::Extensions::KHR_materials_dispersion | + fastgltf::Extensions::KHR_materials_emissive_strength | fastgltf::Extensions::KHR_materials_ior | + fastgltf::Extensions::KHR_materials_iridescence | fastgltf::Extensions::KHR_materials_sheen | + fastgltf::Extensions::KHR_materials_specular | + fastgltf::Extensions:: + KHR_materials_pbrSpecularGlossiness + | // Depreciated, to enable support make sure to define FASTGLTF_ENABLE_DEPRECATED_EXT + fastgltf::Extensions::KHR_materials_transmission | + fastgltf::Extensions::KHR_materials_volume | fastgltf::Extensions::KHR_materials_unlit | + fastgltf::Extensions::EXT_texture_webp | + //fastgltf::Extensions::KHR_materials_diffuse_transmission | + fastgltf::Extensions::KHR_materials_variants; + +constexpr auto GLTF_OPTIONS = fastgltf::Options::DontRequireValidAssetMember | fastgltf::Options::AllowDouble | + fastgltf::Options::LoadExternalBuffers | fastgltf::Options::LoadExternalImages | + fastgltf::Options::GenerateMeshIndices; + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + fastgltf::math::fvec3 position; + fastgltf::math::fvec3 normal; + fastgltf::math::fvec4 tangent; + fastgltf::math::fvec2 uv; + fastgltf::math::fvec2 uv2; + fastgltf::math::fvec4 joints; + fastgltf::math::fvec4 joints2; + fastgltf::math::fvec4 weights; + fastgltf::math::fvec4 weights2; +} vertex_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void set_bounds_info(lv_gltf_model_t * data, fastgltf::math::fvec3 v_min, fastgltf::math::fvec3 v_max, + fastgltf::math::fvec3 v_cen, float radius); +static lv_gltf_model_t * create_data_from_bytes(const uint8_t * bytes, size_t data_size); + +static lv_gltf_model_t * create_data_from_file(const char * path); + +static void injest_grow_bounds_to_include(lv_gltf_model_t * data, const fastgltf::math::fmat4x4 & matrix, + const fastgltf::Mesh & mesh); + +static void injest_set_initial_bounds(lv_gltf_model_t * data, const fastgltf::math::fmat4x4 & matrix, + const fastgltf::Mesh & mesh); + +static bool injest_image(lv_opengl_shader_manager_t * shader_manager, lv_gltf_model_t * data, fastgltf::Image & image, + uint32_t index); + +static bool injest_image_from_buffer_view(lv_gltf_model_t * data, fastgltf::sources::BufferView & view, + GLuint texture_id); +static void injest_light(lv_gltf_model_t * data, size_t light_index, fastgltf::Light & light, size_t scene_index); +static bool injest_mesh(lv_gltf_model_t * data, fastgltf::Mesh & mesh); + +static void make_small_magenta_texture(uint32_t new_magenta_tex); + +template +static size_t injest_vec_attribute(uint8_t vec_size, int32_t current_attrib_index, lv_gltf_model_t * data, + const fastgltf::Primitive * prim, const char * attrib_id, GLuint primitive_vertex_buffer, + size_t offset, Func &&functor); + +static int32_t injest_get_any_image_index(fastgltf::Optional tex); +static bool injest_check_any_image_index_valid(fastgltf::Optional tex); + +static inline GLsizei get_level_count(int32_t width, int32_t height) +{ + return static_cast(1 + floor(log2(width > height ? width : height))); +} + +/** + * @brief Allocate immutable texture storage with fallback for GLES2 + * + * glTexStorage2D (GL_EXT_texture_storage) may not be available on all GLES2 drivers. + * This function falls back to glTexImage2D when the extension is not available. + */ +static inline void tex_storage_2d_compat(GLenum target, GLsizei levels, GLenum internalformat, + GLsizei width, GLsizei height) +{ +#ifdef glTexStorage2D + if(glad_glTexStorage2DEXT) { + glTexStorage2D(target, levels, internalformat, width, height); + return; + } +#endif + /* Fallback: use glTexImage2D for each mipmap level */ + GLenum format = GL_RGBA; + if(internalformat == GL_RGB8) { + format = GL_RGB; + } + for(GLsizei level = 0; level < levels; level++) { + glTexImage2D(target, level, internalformat, width, height, 0, format, GL_UNSIGNED_BYTE, NULL); + width = (width > 1) ? (width / 2) : 1; + height = (height > 1) ? (height / 2) : 1; + } +} + +static void load_mesh_texture_impl(lv_gltf_model_t * data, const fastgltf::TextureInfo & material_prop, + GLuint * primitive_tex_prop, + GLint * primitive_tex_uv_id); +static void load_mesh_texture(lv_gltf_model_t * data, const fastgltf::Optional & material_prop, + GLuint * primitive_tex_prop, GLint * primitive_tex_uv_id); + +static void load_mesh_texture(lv_gltf_model_t * data, + const fastgltf::Optional & material_prop, + GLuint * primitive_tex_prop, GLint * primitive_tex_uv_id); + +static void load_mesh_texture(lv_gltf_model_t * data, + const fastgltf::Optional & material_prop, + GLuint * primitive_tex_prop, GLint * primitive_tex_uv_id); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_gltf_model_t * lv_gltf_data_load_internal(const void * data_source, size_t data_size, + lv_opengl_shader_manager_t * shaders) +{ + lv_gltf_model_t * model = NULL; + if(data_size > 0) { + model = create_data_from_bytes((const uint8_t *)data_source, data_size); + } + else { + model = create_data_from_file((const char *)data_source); + } + + LV_ASSERT_MSG(model, "Failed to create gltf data"); + if(!model) { + return NULL; + } + + // Parse the visible node structure to get a world transform matrix for each mesh component + // instance per node, and apply that matrix to the min/max of the untransformed mesh, then + // grow a bounding volume to include those transformed points + + int32_t scene_index = 0; + bool first_visible_mesh = true; + fastgltf::iterateSceneNodes( + model->asset, scene_index, fastgltf::math::fmat4x4(), [&](fastgltf::Node & node, fastgltf::math::fmat4x4 matrix) { + if(!node.meshIndex.has_value()) { + return; + } + if(first_visible_mesh) { + injest_set_initial_bounds(model, matrix, model->asset.meshes[node.meshIndex.value()]); + } + else { + injest_grow_bounds_to_include(model, matrix, model->asset.meshes[node.meshIndex.value()]); + } + first_visible_mesh = false; + }); + + /* Reserve enough space for model nodes */ + lv_array_init(&model->nodes, model->asset.nodes.size(), sizeof(lv_gltf_model_node_t)); + /*Virtually set size so that lv_array_assign will work*/ + model->nodes.size = model->asset.nodes.size(); + + fastgltf::namegen_iterate_scene_nodes(model->asset, scene_index, + [&](fastgltf::Node & node, const std::string & node_path, const std::string & node_num_path, + size_t node_index, std::size_t child_index) { + LV_UNUSED(child_index); + lv_gltf_model_node_t model_node; + lv_gltf_model_node_init(model, &model_node, &node, node_path.c_str(), node_num_path.c_str()); + + /* Store the nodes in the same order as fastgltf + * This is a workaround as we can't assign any type of user data to fastgltf's types*/ + lv_array_assign(&model->nodes, node_index, & model_node); + }); + + { + uint32_t i = 0; + for(auto & image : model->asset.images) { + injest_image(shaders, model, image, i); + i++; + } + } + uint16_t lightnum = 0; + for(auto & light : model->asset.lights) { + injest_light(model, lightnum, light, 0); + lightnum += 1; + } + for(auto & mesh : model->asset.meshes) { + injest_mesh(model, mesh); + } + + if(model->asset.defaultScene.has_value()) { + LV_LOG_INFO("Default scene = #%d", data->asset.defaultScene.value()); + } + + return model; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_gltf_model_t * create_data_from_file(const char * path) +{ + lv_fs_file_t file; + lv_fs_res_t res = lv_fs_open(&file, path, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + LV_LOG_ERROR("Failed to open file '%s': %d", path, res); + return NULL; + } + res = lv_fs_seek(&file, 0, LV_FS_SEEK_END); + if(res != LV_FS_RES_OK) { + LV_LOG_ERROR("Failed to seek end of file '%s': %d", path, res); + return NULL; + } + uint32_t file_size; + res = lv_fs_tell(&file, &file_size); + if(res != LV_FS_RES_OK) { + LV_LOG_ERROR("Failed to get file count size '%s': %d", path, res); + return NULL; + } + + res = lv_fs_seek(&file, 0, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + LV_LOG_ERROR("Failed to seek start of file '%s': %d", path, res); + return NULL; + } + + uint8_t * bytes = (uint8_t *) lv_malloc(file_size); + + uint32_t bytes_read; + res = lv_fs_read(&file, bytes, file_size, &bytes_read); + if(res != LV_FS_RES_OK) { + LV_LOG_ERROR("Failed to seek start of file '%s': %d", path, res); + return NULL; + } + if(bytes_read != file_size) { + LV_LOG_ERROR("Failed to read the entire gltf file '%s': %d", path, res); + return NULL; + } + lv_fs_close(&file); + + lv_gltf_model_t * model = create_data_from_bytes(bytes, file_size); + lv_free(bytes); + + model->filename = path; + return model; +} + +static lv_gltf_model_t * create_data_from_bytes(const uint8_t * bytes, size_t data_size) +{ + fastgltf::Parser parser(SUPPORTED_EXTENSIONS); + auto gltf_buffer = fastgltf::GltfDataBuffer::FromBytes(reinterpret_cast(bytes), data_size); + if(!gltf_buffer) { + LV_LOG_ERROR("Failed to create glTF buffer from bytes: %s", + std::string(fastgltf::getErrorMessage(gltf_buffer.error())).c_str()); + return NULL; + } + auto asset = parser.loadGltf(gltf_buffer.get(), ".", GLTF_OPTIONS); + if(!asset) { + LV_LOG_ERROR("Failed to decode glTF bytes: %s", std::string(fastgltf::getErrorMessage(asset.error())).c_str()); + return NULL; + } + return lv_gltf_data_create_internal("from_bytes", std::move(asset.get())); +} + +static void make_small_magenta_texture(uint32_t new_magenta_tex) +{ + GL_CALL(glBindTexture(GL_TEXTURE_2D, new_magenta_tex)); + unsigned char clearBytes[4] = { 255, 0, 255, 255 }; // RGBA format + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, clearBytes)); + // Set texture parameters (optional but recommended) + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + GL_CALL(glGenerateMipmap(GL_TEXTURE_2D)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, 0)); + return; +} + +static void load_mesh_texture_impl(lv_gltf_model_t * data, const fastgltf::TextureInfo & material_prop, + GLuint * primitive_tex_prop, + GLint * primitive_tex_uv_id) +{ + const auto & texture = data->asset.textures[material_prop.textureIndex]; + if(!injest_check_any_image_index_valid(texture)) { + return; + } + *primitive_tex_prop = data->textures[injest_get_any_image_index(texture)]; + if(material_prop.transform && material_prop.transform->texCoordIndex.has_value()) { + *primitive_tex_uv_id = material_prop.transform->texCoordIndex.value(); + } + else { + *primitive_tex_uv_id = material_prop.texCoordIndex; + } + LV_LOG_TRACE("Prim tex prop: %d Prim tex uv id %d", *primitive_tex_prop, *primitive_tex_uv_id); +} + +static void load_mesh_texture(lv_gltf_model_t * data, + const fastgltf::Optional & material_prop, + GLuint * primitive_tex_prop, GLint * primitive_tex_uv_id) +{ + if(!material_prop) { + return; + } + load_mesh_texture_impl(data, material_prop.value(), primitive_tex_prop, primitive_tex_uv_id); +} + +static void load_mesh_texture(lv_gltf_model_t * data, const fastgltf::Optional & material_prop, + GLuint * primitive_tex_prop, GLint * primitive_tex_uv_id) +{ + if(!material_prop) { + return; + } + load_mesh_texture_impl(data, material_prop.value(), primitive_tex_prop, primitive_tex_uv_id); +} + +static void load_mesh_texture(lv_gltf_model_t * data, + const fastgltf::Optional & material_prop, + GLuint * primitive_tex_prop, GLint * primitive_tex_uv_id) +{ + if(!material_prop) { + return; + } + load_mesh_texture_impl(data, material_prop.value(), primitive_tex_prop, primitive_tex_uv_id); +} + +static int32_t injest_get_any_image_index(fastgltf::Optional tex) +{ + if(tex->imageIndex.has_value()) { + return tex->imageIndex.value(); + } + + if(tex->webpImageIndex.has_value()) { + return tex->webpImageIndex.value(); + } + return 0; +} +static bool injest_check_any_image_index_valid(fastgltf::Optional tex) +{ + if(tex->imageIndex.has_value()) + return true; + if(tex->webpImageIndex.has_value()) + return true; + return false; +} + +static void injest_grow_bounds_to_include(lv_gltf_model_t * data, const fastgltf::math::fmat4x4 & matrix, + const fastgltf::Mesh & mesh) +{ + /* Grow the bounds to include the specified mesh. */ + fastgltf::math::fvec3 v_min{ data->vertex_min[0], data->vertex_min[1], data->vertex_min[2] }; + + fastgltf::math::fvec3 v_max{ + data->vertex_max[0], + data->vertex_max[1], + data->vertex_max[2], + }; + fastgltf::math::fvec3 v_cen{ data->vertex_cen[0], data->vertex_cen[1], data->vertex_cen[2] }; + + float new_bound_radius = data->bound_radius; + if(mesh.primitives.size() > 0) { + set_bounds_info(data, v_min, v_max, v_cen, new_bound_radius); + return; + } + size_t accessor_index = mesh.primitives[0].findAttribute("POSITION")->accessorIndex; + const auto & accessor = data->asset.accessors[accessor_index]; + + if(!accessor.bufferViewIndex.has_value() || !(accessor.min.has_value() && accessor.max.has_value())) { + set_bounds_info(data, v_min, v_max, v_cen, new_bound_radius); + return; + } + + fastgltf::math::fvec4 t_min{ (float)(accessor.min.value().get(0)), (float)(accessor.min.value().get(1)), + (float)(accessor.min.value().get(2)), 1.f }; + fastgltf::math::fvec4 t_max{ (float)(accessor.max.value().get(0)), (float)(accessor.max.value().get(1)), + (float)(accessor.max.value().get(2)), 1.f }; + + t_min = matrix * t_min; + t_max = matrix * t_max; + v_max[0] = LV_MAX(LV_MAX(v_max[0], t_min.x()), t_max.x()); + v_max[1] = LV_MAX(LV_MAX(v_max[1], t_min.y()), t_max.y()); + v_max[2] = LV_MAX(LV_MAX(v_max[2], t_min.z()), t_max.z()); + v_min[0] = LV_MIN(LV_MIN(v_min[0], t_min.x()), t_max.x()); + v_min[1] = LV_MIN(LV_MIN(v_min[1], t_min.y()), t_max.y()); + v_min[2] = LV_MIN(LV_MIN(v_min[2], t_min.z()), t_max.z()); + v_cen[0] = (v_max[0] + v_min[0]) / 2.0f; + v_cen[1] = (v_max[1] + v_min[1]) / 2.0f; + v_cen[2] = (v_max[2] + v_min[2]) / 2.0f; + + float size_x = v_max[0] - v_min[0]; + float size_y = v_max[1] - v_min[1]; + float size_z = v_max[2] - v_min[2]; + new_bound_radius = std::sqrt((size_x * size_x) + (size_y * size_y) + (size_z * size_z)) / 2.0f; + + set_bounds_info(data, v_min, v_max, v_cen, new_bound_radius); +} +static void injest_set_initial_bounds(lv_gltf_model_t * data, const fastgltf::math::fmat4x4 & matrix, + const fastgltf::Mesh & mesh) +{ + fastgltf::math::fvec3 v_min, v_max, v_cen; + float radius = 0.f; + if(mesh.primitives.size() == 0) { + set_bounds_info(data, v_min, v_max, v_cen, radius); + return; + } + + size_t accessor_index = mesh.primitives[0].findAttribute("POSITION")->accessorIndex; + const auto & accessor = data->asset.accessors[accessor_index]; + + if(!accessor.bufferViewIndex.has_value() || !(accessor.min.has_value() && accessor.max.has_value())) { + set_bounds_info(data, v_min, v_max, v_cen, radius); + return; + } + + fastgltf::math::fvec4 t_min{ (float)(accessor.min.value().get(0)), (float)(accessor.min.value().get(1)), + (float)(accessor.min.value().get(2)), 1.f }; + + fastgltf::math::fvec4 t_max{ (float)(accessor.max.value().get(0)), (float)(accessor.max.value().get(1)), + (float)(accessor.max.value().get(2)), 1.f }; + + t_min = matrix * t_min; + t_max = matrix * t_max; + + v_max[0] = LV_MAX(t_min.x(), t_max.x()); + v_max[1] = LV_MAX(t_min.y(), t_max.y()); + v_max[2] = LV_MAX(t_min.z(), t_max.z()); + v_min[0] = LV_MIN(t_min.x(), t_max.x()); + v_min[1] = LV_MIN(t_min.y(), t_max.y()); + v_min[2] = LV_MIN(t_min.z(), t_max.z()); + v_cen[0] = (v_max[0] + v_min[0]) / 2.0f; + v_cen[1] = (v_max[1] + v_min[1]) / 2.0f; + v_cen[2] = (v_max[2] + v_min[2]) / 2.0f; + const float size_x = v_max[0] - v_min[0]; + const float size_y = v_max[1] - v_min[1]; + const float size_z = v_max[2] - v_min[2]; + radius = std::sqrt((size_x * size_x) + (size_y * size_y) + (size_z * size_z)) / 2.0f; + + set_bounds_info(data, v_min, v_max, v_cen, radius); +} + +bool injest_image(lv_opengl_shader_manager_t * shader_manager, lv_gltf_model_t * data, fastgltf::Image & image, + uint32_t index) +{ + std::string _tex_id = std::string(lv_gltf_get_filename(data)) + "_IMG" + std::to_string(index); + + char tmp[512]; + lv_snprintf(tmp, sizeof(tmp), "%s_img_%u", data->filename, index); + const uint32_t hash = lv_opengl_shader_hash(tmp); + GLuint texture_id = lv_opengl_shader_manager_get_texture(shader_manager, hash); + + if(texture_id != GL_NONE) { + LV_LOG_TRACE("Emplacing back already cached texture from previous injest iteration %u", texture_id); + data->textures.emplace_back(texture_id); + return true; + } + + LV_LOG_TRACE("Image (%s) [%d] [%u]", image.name.c_str(), texture_id, hash); + glGenTextures(1, &texture_id); + glBindTexture(GL_TEXTURE_2D, texture_id); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 20)); + + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + bool image_invalidated = false; + std::visit(fastgltf::visitor{ + [](auto & arg) + { + LV_UNUSED(arg); + LV_LOG_ERROR("Unexpected image source"); + }, + [&](fastgltf::sources::URI & file_path) + { + LV_ASSERT_MSG(file_path.fileByteOffset == 0, "Offsets aren't supported with stbi"); + LV_ASSERT_MSG(file_path.uri.isLocalPath(), "We're only capable of loading local files."); + + int32_t width, height, nrChannels; + LV_LOG_TRACE("Loading image: %s", image.name.c_str()); + const std::string path(file_path.uri.path().begin(), file_path.uri.path().end()); + unsigned char * data = stbi_load(path.c_str(), &width, &height, &nrChannels, 4); + tex_storage_2d_compat(GL_TEXTURE_2D, get_level_count(width, height), GL_RGBA8, width, height); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); + stbi_image_free(data); + }, + [&](fastgltf::sources::Array & vector) + { + int32_t width, height, nrChannels; + LV_LOG_TRACE("Unpacking image data: %s", image.name.c_str()); + + unsigned char * data = stbi_load_from_memory( + reinterpret_cast(vector.bytes.data()), + static_cast(vector.bytes.size()), &width, &height, &nrChannels, 4); + tex_storage_2d_compat(GL_TEXTURE_2D, get_level_count(width, height), GL_RGBA8, width, height); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); + stbi_image_free(data); + }, + [&](fastgltf::sources::BufferView & view) + { + LV_LOG_TRACE("Injesting image from bufferview: %s", image.name.c_str()); + image_invalidated |= injest_image_from_buffer_view(data, view, texture_id); + }, + }, image.data); + + if(!image_invalidated) { + glGenerateMipmap(GL_TEXTURE_2D); + } + else { + LV_LOG_ERROR("Failed to load image %s", image.name.c_str()); + } + LV_LOG_TRACE("Storing texture with hash: %u %u", hash, texture_id); + lv_opengl_shader_manager_store_texture(shader_manager, hash, texture_id); + GL_CALL(glBindTexture(GL_TEXTURE_2D, 0)); + data->textures.emplace_back(texture_id); + return true; +} + +static bool injest_image_from_buffer_view(lv_gltf_model_t * data, fastgltf::sources::BufferView & view, + GLuint texture_id) +{ + /* Yes, we've already loaded every buffer into some GL buffer. However, with GL it's simpler + to just copy the buffer data again for the texture. Besides, this is just an example. */ + auto & buffer_view = data->asset.bufferViews[view.bufferViewIndex]; + auto & buffer = data->asset.buffers[buffer_view.bufferIndex]; + LV_LOG_INFO("Unpacking image bufferView: %s from %d bytes", image.name, bufferView.byteLenght); + return std::visit( + fastgltf::visitor{ + // We only care about VectorWithMime here, because we specify LoadExternalBuffers, meaning + // all buffers are already loaded into a vector. + [](auto & arg) + { + LV_UNUSED(arg); + LV_LOG_ERROR("Unexpected image source"); + return false; + }, + [&](fastgltf::sources::Array & vector) + { + LV_LOG_TRACE("[WEBP] width: %d height: %d", width, height); + int32_t width, height, nrChannels; + int32_t webpRes = WebPGetInfo( + reinterpret_cast(vector.bytes.data() + buffer_view.byteOffset), + static_cast(buffer_view.byteLength), &width, &height); + + if(!webpRes) { + unsigned char * data = stbi_load_from_memory( + reinterpret_cast(vector.bytes.data() + buffer_view.byteOffset), + static_cast(buffer_view.byteLength), &width, &height, &nrChannels, 4); + if((width <= 0) || (height <= 0)) { + LV_LOG_ERROR("Failed to load image from memory"); + make_small_magenta_texture(texture_id); + return true; + } + LV_LOG_TRACE("[WEBP] width: %d height: %d", width, height); + tex_storage_2d_compat(GL_TEXTURE_2D, get_level_count(width, height), GL_RGBA8, width, height); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); + stbi_image_free(data); + return false; + } + WebPBitstreamFeatures features = WebPBitstreamFeatures(); + auto status_code = WebPGetFeatures( + reinterpret_cast(vector.bytes.data() + buffer_view.byteOffset), + static_cast(buffer_view.byteLength), &features); + if(status_code != VP8_STATUS_OK) { + LV_LOG_ERROR("Failed to load webp image %d", status_code); + make_small_magenta_texture(texture_id); + return true; + } + if(features.has_alpha) { + uint8_t * unpacked = WebPDecodeRGBA( + reinterpret_cast(vector.bytes.data() + buffer_view.byteOffset), + static_cast(buffer_view.byteLength), &width, &height); + tex_storage_2d_compat(GL_TEXTURE_2D, get_level_count(width, height), GL_RGBA8, width, height); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, + unpacked); + WebPFree(unpacked); + } + else { + uint8_t * unpacked = WebPDecodeRGB( + reinterpret_cast(vector.bytes.data() + buffer_view.byteOffset), + static_cast(buffer_view.byteLength), &width, &height); + tex_storage_2d_compat(GL_TEXTURE_2D, get_level_count(width, height), GL_RGB8, width, height); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, + unpacked); + WebPFree(unpacked); + } + return false; + } }, + buffer.data); +} +static void injest_light(lv_gltf_model_t * data, size_t light_index, fastgltf::Light & light, size_t scene_index) +{ + fastgltf::math::fmat4x4 tmat; + // It would seem like we'd need this info but not really, just the index will do at the loading phase, the rest is pulled during frame updates. + LV_UNUSED(light); + + fastgltf::findlight_iterate_scene_nodes(data->asset, scene_index, &tmat, + [&](fastgltf::Node & node, const fastgltf::math::fmat4x4 & parentworldmatrix, + const fastgltf::math::fmat4x4 & localmatrix) { + LV_UNUSED(parentworldmatrix); + LV_UNUSED(localmatrix); + if(!node.lightIndex.has_value() || + node.lightIndex.value() != light_index) { + return; + } + LV_LOG_INFO("SCENE LIGHT BEING ADDED #%d\n", light_index); + data->node_by_light_index.push_back(&node); + }); +} + +static bool injest_mesh(lv_gltf_model_t * data, fastgltf::Mesh & mesh) +{ + /*const auto &asset = GET_ASSET(data);*/ + const auto & outMesh = lv_gltf_get_new_meshdata(data); + outMesh->primitives.resize(mesh.primitives.size()); + + for(auto it = mesh.primitives.begin(); it != mesh.primitives.end(); ++it) { + if(it->dracoCompression) { + LV_LOG_WARN("Unhandled draco compression"); + } + auto * positionIt = it->findAttribute("POSITION"); + // A mesh primitive is required to hold the POSITION attribute. + // + assert(positionIt != it->attributes.end()); + assert(it->indicesAccessor.has_value()); // We specify GenerateMeshIndices, so we should always have indices + + auto index = std::distance(mesh.primitives.begin(), it); + auto & primitive = outMesh->primitives[index]; + + // Generate the VAO + GLuint vao; + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + primitive.primitiveType = fastgltf::to_underlying(it->type); + primitive.vertexArray = vao; + + if(it->materialIndex.has_value()) { + // Adjust for default material + primitive.materialUniformsIndex = it->materialIndex.value() + 1; + auto & material = data->asset.materials[it->materialIndex.value()]; + load_mesh_texture(data, material.pbrData.baseColorTexture, &primitive.albedoTexture, + &primitive.baseColorTexcoordIndex); + + load_mesh_texture(data, material.pbrData.metallicRoughnessTexture, &primitive.metalRoughTexture, + &primitive.metallicRoughnessTexcoordIndex); + load_mesh_texture(data, material.normalTexture, &primitive.normalTexture, &primitive.normalTexcoordIndex); + load_mesh_texture(data, material.occlusionTexture, &primitive.occlusionTexture, + &primitive.occlusionTexcoordIndex); + load_mesh_texture(data, material.emissiveTexture, &primitive.emissiveTexture, + &primitive.emissiveTexcoordIndex); + if(material.volume) + load_mesh_texture(data, material.volume->thicknessTexture, &primitive.thicknessTexture, + &primitive.thicknessTexcoordIndex); + if(material.transmission) + load_mesh_texture(data, material.transmission->transmissionTexture, + &primitive.transmissionTexture, (GLint *)&primitive.transmissionTexcoordIndex); + if(material.clearcoat && material.clearcoat->clearcoatFactor > 0.0f) { + load_mesh_texture(data, material.clearcoat->clearcoatTexture, + (GLuint *)&primitive.clearcoatTexture, &primitive.clearcoatTexcoordIndex); + load_mesh_texture(data, material.clearcoat->clearcoatRoughnessTexture, + (GLuint *)&primitive.clearcoatRoughnessTexture, + &primitive.clearcoatRoughnessTexcoordIndex); + load_mesh_texture(data, material.clearcoat->clearcoatNormalTexture, + (GLuint *)&primitive.clearcoatNormalTexture, + &primitive.clearcoatNormalTexcoordIndex); + } + if(material.diffuseTransmission && material.diffuseTransmission->diffuseTransmissionFactor > 0.0f) { + load_mesh_texture(data, material.diffuseTransmission->diffuseTransmissionTexture, + &primitive.diffuseTransmissionTexture, + &primitive.diffuseTransmissionTexcoordIndex); + load_mesh_texture(data, material.diffuseTransmission->diffuseTransmissionColorTexture, + &primitive.diffuseTransmissionColorTexture, + &primitive.diffuseTransmissionColorTexcoordIndex); + } + } + else { + primitive.materialUniformsIndex = 0; + } + + auto & positionAccessor = data->asset.accessors[positionIt->accessorIndex]; + if(!positionAccessor.bufferViewIndex.has_value()) { + continue; + } + + // Create the vertex buffer for this primitive, and use the accessor tools to copy directly into the mapped buffer. + GL_CALL(glGenBuffers(1, &primitive.vertexBuffer)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, primitive.vertexBuffer)); + + std::vector vertices_vec(positionAccessor.count); + vertex_t * vertices = vertices_vec.data(); + glBufferData(GL_ARRAY_BUFFER, positionAccessor.count * sizeof(*vertices), nullptr, GL_STATIC_DRAW); + { + int32_t attr_index = 0; + attr_index = injest_vec_attribute( + 3, attr_index, data, &(*it), "POSITION", primitive.vertexBuffer, offsetof(vertex_t, position), + [&](fastgltf::math::fvec3 vec, size_t idx) { + vertices[idx].position = vec; + }); + attr_index = injest_vec_attribute( + 4, attr_index, data, &(*it), "JOINTS_0", primitive.vertexBuffer, offsetof(vertex_t, joints), + [&](fastgltf::math::fvec4 vec, size_t idx) { + vertices[idx].joints = vec; + }); + attr_index = injest_vec_attribute( + 4, attr_index, data, &(*it), "JOINTS_1", primitive.vertexBuffer, offsetof(vertex_t, joints2), + [&](fastgltf::math::fvec4 vec, std::size_t idx) { + vertices[idx].joints2 = vec; + }); + attr_index = injest_vec_attribute( + 4, attr_index, data, &(*it), "WEIGHTS_0", primitive.vertexBuffer, offsetof(vertex_t, weights), + [&](fastgltf::math::fvec4 vec, std::size_t idx) { + vertices[idx].weights = vec; + }); + attr_index = injest_vec_attribute( + 4, attr_index, data, &(*it), "WEIGHTS_1", primitive.vertexBuffer, offsetof(vertex_t, weights2), + [&](fastgltf::math::fvec4 vec, size_t idx) { + vertices[idx].weights2 = vec; + }); + attr_index = injest_vec_attribute( + 3, attr_index, data, &(*it), "NORMAL", primitive.vertexBuffer, offsetof(vertex_t, normal), + [&](fastgltf::math::fvec3 vec, std::size_t idx) { + vertices[idx].normal = vec; + }); + attr_index = injest_vec_attribute( + 4, attr_index, data, &(*it), "TANGENT", primitive.vertexBuffer, offsetof(vertex_t, tangent), + [&](fastgltf::math::fvec4 vec, size_t idx) { + vertices[idx].tangent = vec; + }); + attr_index = injest_vec_attribute( + 2, attr_index, data, &(*it), "TEXCOORD_0", primitive.vertexBuffer, offsetof(vertex_t, uv), + [&](fastgltf::math::fvec2 vec, size_t idx) { + vertices[idx].uv = vec; + }); + attr_index = injest_vec_attribute( + 2, attr_index, data, &(*it), "TEXCOORD_1", primitive.vertexBuffer, offsetof(vertex_t, uv2), + [&](fastgltf::math::fvec2 vec, size_t idx) { + vertices[idx].uv2 = vec; + }); + } + glBindVertexArray(vao); + glBindBuffer(GL_ARRAY_BUFFER, primitive.vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, positionAccessor.count * sizeof(vertex_t), vertices_vec.data(), GL_STATIC_DRAW); + + // Generate the indirect draw command + auto & draw = primitive.draw; + draw.instanceCount = 1; + draw.baseInstance = 0; + draw.baseVertex = 0; + draw.firstIndex = 0; + + auto & indexAccessor = data->asset.accessors[it->indicesAccessor.value()]; + if(!indexAccessor.bufferViewIndex.has_value()) + return false; + draw.count = static_cast(indexAccessor.count); + + // Create the index buffer and copy the indices into it. + glGenBuffers(1, &primitive.indexBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, primitive.indexBuffer); + if(indexAccessor.componentType == fastgltf::ComponentType::UnsignedByte || + indexAccessor.componentType == fastgltf::ComponentType::UnsignedShort) { + primitive.indexType = GL_UNSIGNED_SHORT; + std::uint16_t * tempIndices = new std::uint16_t[indexAccessor.count]; + fastgltf::copyFromAccessor(data->asset, indexAccessor, tempIndices); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, + static_cast(indexAccessor.count * sizeof(std::uint16_t)), tempIndices, + GL_STATIC_DRAW); + delete[] tempIndices; + } + else { + primitive.indexType = GL_UNSIGNED_INT; + //std::uint32_t tempIndices[indexAccessor.count]; + std::uint32_t * tempIndices = new std::uint32_t[indexAccessor.count]; + fastgltf::copyFromAccessor(data->asset, indexAccessor, tempIndices); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, + static_cast(indexAccessor.count * sizeof(std::uint32_t)), tempIndices, + GL_STATIC_DRAW); + delete[] tempIndices; + } + } + + glBindVertexArray(0); + return true; +} +template +static size_t injest_vec_attribute(uint8_t vec_size, int32_t current_attrib_index, lv_gltf_model_t * data, + const fastgltf::Primitive * prim, const char * attrib_id, GLuint primitive_vertex_buffer, + size_t offset, Func &&functor + + ) +{ + const auto & asset = data->asset; + if(const auto * _attrib = prim->findAttribute(std::string(attrib_id)); _attrib != prim->attributes.end()) { + auto & accessor = asset.accessors[_attrib->accessorIndex]; + if(accessor.bufferViewIndex.has_value()) { + glBindBuffer(GL_ARRAY_BUFFER, primitive_vertex_buffer); + fastgltf::iterateAccessorWithIndex(asset, accessor, functor); + // Specify the layout of the vertex data + glVertexAttribPointer(current_attrib_index, // Attribute index + vec_size, // Number of components per vertex + GL_FLOAT, // Data type + GL_FALSE, // Normalized + sizeof(vertex_t), // Stride (size of one vertex) + (void *)offset); // Offset in the buffer + glEnableVertexAttribArray(current_attrib_index); + } + else { + glDisableVertexAttribArray(current_attrib_index); + } + current_attrib_index++; + } + return current_attrib_index; +} + +static void set_bounds_info(lv_gltf_model_t * data, fastgltf::math::fvec3 v_min, fastgltf::math::fvec3 v_max, + fastgltf::math::fvec3 v_cen, float radius) +{ + { + auto _d = v_min.data(); + data->vertex_min[0] = _d[0]; + data->vertex_min[1] = _d[1]; + data->vertex_min[2] = _d[2]; + } + { + auto _d = v_max.data(); + data->vertex_max[0] = _d[0]; + data->vertex_max[1] = _d[1]; + data->vertex_max[2] = _d[2]; + } + { + auto _d = v_cen.data(); + data->vertex_cen[0] = _d[0]; + data->vertex_cen[1] = _d[1]; + data->vertex_cen[2] = _d[2]; + } + data->bound_radius = radius; +} + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_internal.h b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_internal.h new file mode 100644 index 0000000..2df78ad --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_internal.h @@ -0,0 +1,256 @@ +#ifndef LV_GLTFDATA_PRIVATE_H +#define LV_GLTFDATA_PRIVATE_H + +#include "../../../lv_conf_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LV_USE_GLTF +#include "../../../drivers/opengles/opengl_shader/lv_opengl_shader_internal.h" +#include "../../../draw/lv_image_dsc.h" +#include "../../../misc/lv_types.h" +#include "../../../misc/lv_array.h" + + +typedef struct { + GLuint count; + GLuint instanceCount; + GLuint firstIndex; + GLint baseVertex; + GLuint baseInstance; +} IndirectDrawCommand; + +typedef struct { + IndirectDrawCommand draw; + GLenum primitiveType; + GLenum indexType; + GLuint vertexArray; + + GLuint vertexBuffer; + GLuint indexBuffer; + + GLuint materialUniformsIndex; + GLuint albedoTexture; + GLuint emissiveTexture; + GLuint metalRoughTexture; + GLuint occlusionTexture; + GLuint normalTexture; + GLuint diffuseTransmissionTexture; + GLuint diffuseTransmissionColorTexture; + GLuint transmissionTexture; + GLuint transmissionTexcoordIndex; + + GLint baseColorTexcoordIndex; + GLint emissiveTexcoordIndex; + + GLint metallicRoughnessTexcoordIndex; + GLint occlusionTexcoordIndex; + GLint normalTexcoordIndex; + GLint diffuseTransmissionTexcoordIndex; + GLint diffuseTransmissionColorTexcoordIndex; + + GLint clearcoatTexture; + GLint clearcoatRoughnessTexture; + GLint clearcoatNormalTexture; + GLint clearcoatTexcoordIndex; + GLint clearcoatRoughnessTexcoordIndex; + GLint clearcoatNormalTexcoordIndex; + + GLuint thicknessTexture; + GLint thicknessTexcoordIndex; + + GLuint diffuseTexture; + GLint diffuseTexcoordIndex; + + GLuint specularGlossinessTexture; + GLint specularGlossinessTexcoordIndex; + +} lv_gltf_primitive_t; + +typedef struct { + GLint camera; + GLint view_projection_matrix; + GLint model_matrix; + GLint view_matrix; + GLint projection_matrix; + + GLint env_intensity; + GLint env_diffuse_sampler; + GLint env_specular_sampler; + GLint env_sheen_sampler; + GLint env_ggx_lut_sampler; + GLint env_charlie_lut_sampler; + GLint env_mip_count; + + GLint exposure; + GLint roughness_factor; + + GLint base_color_factor; + GLint base_color_sampler; + GLint base_color_uv_set; + GLint base_color_uv_transform; + + GLint emissive_factor; + GLint emissive_sampler; + GLint emissive_uv_set; + GLint emissive_uv_transform; + GLint emissive_strength; + + GLint metallic_factor; + GLint metallic_roughness_sampler; + GLint metallic_roughness_uv_set; + GLint metallic_roughness_uv_transform; + + GLint occlusion_strength; + GLint occlusion_sampler; + GLint occlusion_uv_set; + GLint occlusion_uv_transform; + + GLint normal_scale; + GLint normal_sampler; + GLint normal_uv_set; + GLint normal_uv_transform; + + GLint clearcoat_factor; + GLint clearcoat_roughness_factor; + GLint clearcoat_sampler; + GLint clearcoat_uv_set; + GLint clearcoat_uv_transform; + GLint clearcoat_roughness_sampler; + GLint clearcoat_roughness_uv_set; + GLint clearcoat_roughness_uv_transform; + GLint clearcoat_normal_scale; + GLint clearcoat_normal_sampler; + GLint clearcoat_normal_uv_set; + GLint clearcoat_normal_uv_transform; + + GLint thickness; + GLint thickness_sampler; + GLint thickness_uv_set; + GLint thickness_uv_transform; + + GLint diffuse_transmission_sampler; + GLint diffuse_transmission_uv_set; + GLint diffuse_transmission_uv_transform; + + GLint diffuse_transmission_color_sampler; + GLint diffuse_transmission_color_uv_set; + GLint diffuse_transmission_color_uv_transform; + + GLint sheen_color_factor; + GLint sheen_roughness_factor; + + GLint specular_color_factor; + GLint specular_factor; + + GLint diffuse_transmission_color_factor; + GLint diffuse_transmission_factor; + + GLint ior; + GLint alpha_cutoff; + + GLint dispersion; + GLint screen_size; + GLint transmission_factor; + GLint transmission_sampler; + GLint transmission_uv_set; + GLint transmission_uv_transform; + GLint transmission_framebuffer_sampler; + GLint transmission_framebuffer_size; + + GLint attenuation_distance; + GLint attenuation_color; + + GLint joints_sampler; + + GLint diffuse_factor; + GLint glossiness_factor; + + GLint diffuse_sampler; + GLint diffuse_uv_set; + GLint diffuse_uv_transform; + GLint specular_glossiness_sampler; + GLint specular_glossiness_uv_set; + GLint specular_glossiness_uv_transform; + +} lv_gltf_uniform_locations_t; + +lv_gltf_uniform_locations_t lv_gltf_uniform_locations_create(GLuint program); + +typedef struct { + lv_gltf_uniform_locations_t uniforms; + GLuint program; +} lv_gltf_compiled_shader_t; + +void lv_gltf_store_compiled_shader(lv_gltf_model_t * data, size_t identifier, lv_gltf_compiled_shader_t * shader); +lv_gltf_compiled_shader_t * lv_gltf_get_compiled_shader(lv_gltf_model_t * data, size_t identifier); + +/** + * @brief Load the gltf file at the specified filepath + * + * @param gltf_path The gltf filename + * @param ret_data Pointer to the data container that will be populated. + * @param shaders Pointer to the shader cache object this file uses. + */ +lv_gltf_model_t * +lv_gltf_data_load_from_file(const char * file_path, + lv_opengl_shader_manager_t * shader_manager); + +/** + * @brief Load the gltf file encoded within the supplied byte array + * + * @param gltf_path The gltf filename + * @param gltf_data_size if gltf_path is instead a byte array, pass the size of that array in through this variable (or 0 if it's a file path). + * @param ret_data Pointer to the data container that will be populated. + * @param shaders Pointer to the shader cache object this file uses. + */ + +lv_gltf_model_t * +lv_gltf_data_load_from_bytes(const uint8_t * data, size_t data_size, + lv_opengl_shader_manager_t * shader_manager); + + +/** + * @brief Retrieve the radius of the GLTF data object. + * + * @param D Pointer to the lv_gltf_data_t object from which to get the radius. + * @return The radius of the GLTF data object. + */ +double lv_gltf_data_get_radius(const lv_gltf_model_t * model); + + +/** + * @brief Destroy a GLTF data object and free associated resources. + * + * @param _data Pointer to the lv_gltf_data_t object to be destroyed. + */ +void lv_gltf_data_delete(lv_gltf_model_t * _data); + +/** + * @brief Copy the bounds information from one GLTF data object to another. + * + * @param to Pointer to the destination lv_gltf_data_t object. + * @param from Pointer to the source lv_gltf_data_t object. + */ +void lv_gltf_data_copy_bounds_info(lv_gltf_model_t * to, lv_gltf_model_t * from); + +/** + * @brief Swap the red and blue channels in a pixel buffer. + * + * @param pixel_buffer Pointer to the pixel buffer containing the image data. + * @param byte_total_count The total number of bytes in the pixel buffer. + * @param has_alpha Flag indicating whether the pixel buffer includes an alpha channel. + */ +void lv_gltf_data_rgb_to_bgr(uint8_t * pixel_buffer, + size_t byte_total_count, + bool has_alpha); + +#endif /*LV_USE_GLTF*/ + +#ifdef __cplusplus +} +#endif + +#endif /* LV_GLTFDATA_PRIVATE_H */ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_internal.hpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_internal.hpp new file mode 100644 index 0000000..648ca58 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_internal.hpp @@ -0,0 +1,412 @@ +#ifndef LV_GLTFDATA_HPP +#define LV_GLTFDATA_HPP + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GLTF + +#include "../gltf_view/lv_gltf.h" +#include "lv_gltf_data_internal.h" + +#include "../../../misc/lv_array.h" +#include "../../../drivers/opengles/lv_opengles_private.h" + +#include "../../../misc/lv_types.h" +#include "../../../misc/lv_ll.h" +#include "../../../misc/lv_event.h" + +#ifdef __cplusplus + +#include +#include +#include +#include +#include + +// Vector of int32_t's +using UintVector = std::vector; +// Vector of int32_t's +using IntVector = std::vector; +// Vector of int64_t's +using LongVector = std::vector; +// Pointer to fastgltf::Node +using NodePtr = fastgltf::Node *; +// A standard 4x4 transform matrix +using Transform = fastgltf::math::fmat4x4; +// Pair of Node pointer and int32_t +using NodeIndexPair = std::pair; +// Pair of float and Node/Index pair +using NodeIndexDistancePair = std::pair; +// Vector of NodeIndexPair +using NodePairVector = std::vector; +// Vector of NodeIndexDistancePair +using NodeDistanceVector = std::vector; +// Map of uint32_t to NodePairVector +using MaterialIndexMap = std::map; +// Map of Node Pointers to Transforms +using NodeTransformMap = std::map; +// Map of Nodes by string (name) +using StringNodeMap = std::map; +// Map of Nodes by string (name) +using NodeIntMap = std::map; +// Map of Nodes by string (name) +using NodeVector = std::vector; +// Map of Node Index to Map of Prim Index to CenterXYZ+RadiusW Vec4 +using NodePrimCenterMap = std::map >; + +#define LV_GLTF_NODE_CHANNEL_X 0 +#define LV_GLTF_NODE_CHANNEL_Y 1 +#define LV_GLTF_NODE_CHANNEL_Z 2 +#define LV_GLTF_NODE_CHANNEL_W 4 + +typedef enum { + LV_GLTF_NODE_PROP_POSITION, + LV_GLTF_NODE_PROP_ROTATION, + LV_GLTF_NODE_PROP_SCALE, +} lv_gltf_node_prop_t; + +typedef struct { + lv_3dpoint_t local_position; + lv_3dpoint_t world_position; + lv_3dpoint_t scale; + lv_3dpoint_t rotation; +} lv_gltf_model_node_data_t; + +typedef struct { + lv_gltf_node_prop_t prop; + uint8_t channel; + float value; +} lv_gltf_write_op_t; + +typedef struct { + GLuint drawsBuffer; + std::vector primitives; +} lv_gltf_mesh_data_t; + +typedef struct { + lv_event_list_t event_list; + lv_gltf_model_node_data_t node_data; + bool read_world_position; + bool value_changed; +} lv_gltf_model_node_attr_t; + + +struct _lv_gltf_model_node_t { + lv_gltf_model_t * model; + const char * numeric_path; + const char * path; + fastgltf::Node * fastgltf_node; + lv_gltf_model_node_attr_t * read_attrs; + lv_array_t write_ops; +}; + +struct _lv_gltf_model_t { + const char * filename; + fastgltf::Asset asset; + lv_array_t nodes; + NodeVector node_by_light_index; + NodeTransformMap node_transform_cache; + MaterialIndexMap opaque_nodes_by_material_index; + MaterialIndexMap blended_nodes_by_material_index; + std::vector validated_skins; + std::vector skin_tex; + NodePrimCenterMap local_mesh_to_center_points_by_primitive; + lv_gltf_t * viewer; + + std::vector meshes; + std::vector textures; + lv_array_t compiled_shaders; + std::map > channel_set_cache; + fastgltf::math::fmat4x4 view_mat; + fastgltf::math::fvec3 view_pos; + fastgltf::math::fvec3 vertex_max; + fastgltf::math::fvec3 vertex_min; + fastgltf::math::fvec3 vertex_cen; + + lv_timer_t * animation_update_timer; + + size_t current_animation; + size_t last_material_index; + + uint32_t last_camera_index; + int32_t last_anim_num; + + float bound_radius; + + uint32_t current_animation_max_time; + uint32_t local_timestamp; + uint32_t last_tick; + uint32_t camera; + + bool is_animation_enabled; + bool last_pass_was_transmission; + bool last_frame_was_antialiased; + bool last_frame_no_motion; + bool _last_frame_no_motion; + bool write_ops_pending; + bool write_ops_flushed; + struct _lv_gltf_model_t * linked_view_source; +}; + +/** + * @brief Retrieve a specific texture from the GLTF model data. + * + * @param data Pointer to the lv_gltf_data_t object containing the model data. + * @param index The index of the texture to retrieve. + * @return Pointer to the texture object. + */ +GLuint lv_gltf_data_get_texture(lv_gltf_model_t * data, size_t index); + + +/** + * @brief Retrieve the minimum bounds (X/Y/Z) of the model from the GLTF data. + * + * @param data Pointer to the lv_gltf_data_t object containing the model data. + * @return Pointer to a 3-element float array representing the minimum bounds. + */ +fastgltf::math::fvec3 lv_gltf_data_get_bounds_min(const lv_gltf_model_t * data); + +/** + * @brief Retrieve the maximum bounds (X/Y/Z) of the model from the GLTF data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @return Pointer to a 3-element float array representing the maximum bounds. + */ +fastgltf::math::fvec3 lv_gltf_data_get_bounds_max(const lv_gltf_model_t * data); + +/** + * @brief Retrieve the center coordinates of the GLTF data object. + * + * @param D Pointer to the lv_gltf_data_t object from which to get the center. + * @return Pointer to an array containing the center coordinates (x, y, z). + */ +fastgltf::math::fvec3 lv_gltf_data_get_center(const lv_gltf_model_t * data); + +/** + * @brief Retrieve the filename of the GLTF model. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @return Pointer to a constant character string representing the filename. + */ +const char * lv_gltf_get_filename(const lv_gltf_model_t * data); + +/** + * @brief Check if the centerpoint cache contains a specific entry. + * + * @param data Pointer to the lv_gltf_data_t object containing the model data. + * @param index The index of the entry to check. + * @param element The specific parameter to check within the cache. + * @return True if the cache contains the entry, false otherwise. + */ +bool lv_gltf_data_centerpoint_cache_contains(lv_gltf_model_t * data, size_t index, int32_t element); + +/** + * @brief Retrieve a specific primitive from a mesh. + * + * @param M Pointer to the MeshData structure containing the mesh data. + * @param I The index of the primitive to retrieve. + * @return Pointer to the primitive data. + */ +lv_gltf_primitive_t * lv_gltf_data_get_primitive_from_mesh(lv_gltf_mesh_data_t * M, size_t I); + +/** + * @brief Retrieve the asset associated with the GLTF model data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @return Pointer to the asset data. + */ +fastgltf::Asset * lv_gltf_data_get_asset(lv_gltf_model_t * data); + +/** + * @brief Retrieve mesh data for a specific index from the GLTF model data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @param I The index of the mesh data to retrieve. + * @return Pointer to the MeshData structure containing the mesh data. + */ +lv_gltf_mesh_data_t * lv_gltf_data_get_mesh(lv_gltf_model_t * data, size_t index); + +/** + * @brief Retrieve the skin texture index for a specific entry in the GLTF model data. + * + * @param data Pointer to the lv_gltf_data_t object containing the model data. + * @param index The index of the entry for which to retrieve the skin texture index. + * @return The skin texture index. + */ +GLuint lv_gltf_data_get_skin_texture_at(lv_gltf_model_t * data, size_t index); + +/** + * @brief Check if the validated skins contain a specific entry. + * + * @param data Pointer to the lv_gltf_data_t object containing the model data. + * @param index The index of the skin to check. + * @return True if the validated skins contain the entry, false otherwise. + */ +bool lv_gltf_data_validated_skins_contains(lv_gltf_model_t * data, size_t index); + +/** + * @brief Validate a specific skin in the GLTF model data. + * + * @param data Pointer to the lv_gltf_data_t object containing the model data. + * @param index The index of the skin to validate. + */ +void lv_gltf_data_validate_skin(lv_gltf_model_t * data, size_t index); + +/** + * @brief Add an opaque node primitive to the GLTF model data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @param I The index of the primitive to add. + * @param N Pointer to the NodePtr representing the node to add. + * @param P The specific parameter associated with the primitive. + */ +void lv_gltf_data_add_opaque_node_primitive(lv_gltf_model_t * data, size_t index, fastgltf::Node * node, + size_t primitive_index); + +/** + * @brief Add a blended node primitive to the GLTF model data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @param I The index of the primitive to add. + * @param N Pointer to the NodePtr representing the node to add. + * @param P The specific parameter associated with the primitive. + */ +void lv_gltf_data_add_blended_node_primitive(lv_gltf_model_t * data, size_t mesh_index, fastgltf::Node * node, + size_t primitive_index); + +/** + * @brief Set the cached transformation matrix for a specific node in the GLTF model data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @param N Pointer to the NodePtr representing the node for which to set the transformation. + * @param M The transformation matrix to cache. + */ +void lv_gltf_data_set_cached_transform(lv_gltf_model_t * data, fastgltf::Node * node, fastgltf::math::fmat4x4 M); + +/** + * @brief Clear the transformation cache for the GLTF model data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + */ +void lv_gltf_data_clear_transform_cache(lv_gltf_model_t * data); + +/** + * @brief Retrieve the cached transformation matrix for a specific node in the GLTF model data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @param N Pointer to the NodePtr representing the node for which to retrieve the transformation. + * @return The cached transformation matrix. + */ +fastgltf::math::fmat4x4 lv_gltf_data_get_cached_transform(lv_gltf_model_t * data, fastgltf::Node * node); + +/** + * @brief Check if a cached transformation matrix exists for a given node. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @param N Pointer to the NodePtr representing the node for which to retrieve the transformation. + * @return true if a cache item exists, false otherwise + int32_t*/ +bool lv_gltf_data_has_cached_transform(lv_gltf_model_t * data, fastgltf::Node * node); + +/** + * @brief Check if the transformation cache is empty. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @return True if the transformation cache is empty, false otherwise. + */ +bool lv_gltf_data_transform_cache_is_empty(lv_gltf_model_t * data); + +/** + * @brief Retrieve the size of the skins in the GLTF model data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @return The size of the skins. + */ +size_t lv_gltf_data_get_skins_size(lv_gltf_model_t * data); + +/** + * @brief Retrieve a specific skin from the GLTF model data. + * + * @param D Pointer to the lv_gltf_data_t object containing the model data. + * @param I The index of the skin to retrieve. + * @return The skin index. + */ +size_t lv_gltf_data_get_skin(lv_gltf_model_t * data, size_t index); + +/** + * @brief Ingest and discover defines for a specific node and primitive in the GLTF model data. + * + * @param data_obj Pointer to the lv_gltf_data_t object containing the model data. + * @param node Pointer to the node for which to ingest defines. + * @param prim Pointer to the primitive for which to ingest defines. + */ +void lv_gltf_data_injest_discover_defines(lv_gltf_model_t * data, fastgltf::Node * node, fastgltf::Primitive * prim); + +/** + * @brief Retrieve the center point of a specific mesh element from the GLTF model data. + * + * @param gltf_data Pointer to the lv_gltf_data_t object containing the model data. + * @param matrix The transformation matrix to apply when calculating the center point. + * @param meshIndex The index of the mesh from which to retrieve the center point. + * @param elem The specific element index within the mesh. + * @return The center point as a fastgltf::math::fvec3 structure. + */ +fastgltf::math::fvec3 lv_gltf_data_get_centerpoint(lv_gltf_model_t * gltf_data, fastgltf::math::fmat4x4 matrix, + size_t mesh_index, + int32_t elem); + + +lv_gltf_mesh_data_t * lv_gltf_get_new_meshdata(lv_gltf_model_t * _data); + +lv_gltf_model_t * lv_gltf_data_create_internal(const char * gltf_path, fastgltf::Asset); + +lv_gltf_model_t * lv_gltf_data_load_internal(const void * data_source, size_t data_size, + lv_opengl_shader_manager_t * shaders); + +fastgltf::math::fvec4 lv_gltf_get_primitive_centerpoint(lv_gltf_model_t * data, fastgltf::Mesh & mesh, + uint32_t prim_num); + +fastgltf::math::fvec3 get_cached_centerpoint(lv_gltf_model_t * data, size_t index, int32_t element, + fastgltf::math::fmat4x4 matrix); + +void lv_gltf_data_delete_textures(lv_gltf_model_t * data); +GLuint lv_gltf_data_create_texture(lv_gltf_model_t * data); +void lv_gltf_model_node_init(lv_gltf_model_t * model, lv_gltf_model_node_t * node, fastgltf::Node * fastgltf_node, + const char * path, + const char * num_path); + +void lv_gltf_model_node_deinit(lv_gltf_model_node_t * node); + +/** + * @brief Retrieve the pixel data for a specific texture in a GLTF model. + * + * @param pixels Pointer to the memory where the pixel data will be stored. + * @param data_obj Pointer to the lv_gltf_data_t object containing the model data. + * @param model_texture_index The index of the texture in the model. + * @param mipmapnum The mipmap level to retrieve pixel data for. + * @param width The width of the texture. + * @param height The height of the texture. + * @param has_alpha Flag indicating whether the texture includes an alpha channel. + * @return True if the pixel data was successfully retrieved, false otherwise. + */ +bool lv_gltf_data_get_texture_pixels(void * pixels, lv_gltf_model_t * data_obj, uint32_t model_texture_index, + uint32_t mipmapnum, + uint32_t width, uint32_t height, bool has_alpha); + +uint32_t lv_gltf_data_get_animation_total_time(lv_gltf_model_t * data, uint32_t index); +std::vector * lv_gltf_data_animation_get_channel_set(std::size_t anim_num, lv_gltf_model_t * data, + fastgltf::Node * node); +void lv_gltf_data_animation_matrix_apply(float timestamp, std::size_t anim_num, lv_gltf_model_t * gltf_data, + fastgltf::Node * node, + fastgltf::math::fmat4x4 & matrix); + +lv_gltf_model_node_t * lv_gltf_model_node_get_by_internal_node(lv_gltf_model_t * model, + const fastgltf::Node * fastgltf_node); + +void lv_gltf_model_send_new_values(lv_gltf_model_t * model); + +#endif + + +#endif /*LV_USE_GLTF*/ +#endif /*LV_GLTFVIEW_H*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_mesh.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_mesh.cpp new file mode 100644 index 0000000..623add4 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_mesh.cpp @@ -0,0 +1,52 @@ +/** + * @file lv_gltf_data_mesh.cpp + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gltf_data_internal.hpp" +#if LV_USE_GLTF + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_gltf_mesh_data_t * lv_gltf_get_new_meshdata(lv_gltf_model_t * data) +{ + data->meshes.emplace_back(lv_gltf_mesh_data_t {}); + return &(data->meshes[data->meshes.size() - 1]); +} + + +lv_gltf_mesh_data_t * lv_gltf_data_get_mesh(lv_gltf_model_t * data, size_t index) +{ + return &data->meshes[index]; +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_primitive.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_primitive.cpp new file mode 100644 index 0000000..4c20559 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_primitive.cpp @@ -0,0 +1,126 @@ +/** + * @file lv_gltf_data_primitive.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_data_internal.hpp" +#if LV_USE_GLTF +#include "../../../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_gltf_primitive_t * lv_gltf_data_get_primitive_from_mesh(lv_gltf_mesh_data_t * mesh, size_t index) +{ + return &(mesh->primitives[index]); +} + +void lv_gltf_data_add_opaque_node_primitive(lv_gltf_model_t * data, size_t index, + fastgltf::Node * node, size_t primitive_index) +{ + data->opaque_nodes_by_material_index[index].emplace_back( + std::make_pair(node, primitive_index)); +} + +void lv_gltf_data_add_blended_node_primitive(lv_gltf_model_t * data, size_t index, + fastgltf::Node * node, size_t primitive_index) +{ + data->blended_nodes_by_material_index[index].push_back( + std::make_pair(node, primitive_index)); +} + +fastgltf::math::fvec4 lv_gltf_get_primitive_centerpoint(lv_gltf_model_t * data, + fastgltf::Mesh & mesh, + uint32_t prim_num) +{ + fastgltf::math::fvec4 result{ 0.f }; + fastgltf::math::fvec3 v_min{ 999999999.f }; + fastgltf::math::fvec3 v_max{ -999999999.f }; + fastgltf::math::fvec3 v_cen{ 0.f }; + float radius = 0.f; + + if(mesh.primitives.size() <= prim_num) { + return result; + } + const auto & it = mesh.primitives[prim_num]; + const auto & asset = data->asset; + + const auto * positionIt = it.findAttribute("POSITION"); + const auto & positionAccessor = + asset.accessors[positionIt->accessorIndex]; + if(!positionAccessor.bufferViewIndex.has_value()) { + return result; + } + + if(!(positionAccessor.min.has_value() && + positionAccessor.max.has_value())) { + LV_LOG_ERROR( + "Could not get primitive center point. Missing min/max values"); + return result; + } + + fastgltf::math::fvec4 t_min{ + (float)(positionAccessor.min.value().get((size_t)0)), + (float)(positionAccessor.min.value().get((size_t)1)), + (float)(positionAccessor.min.value().get((size_t)2)), + 0.f + }; + fastgltf::math::fvec4 t_max{ + (float)(positionAccessor.max.value().get((size_t)0)), + (float)(positionAccessor.max.value().get((size_t)1)), + (float)(positionAccessor.max.value().get((size_t)2)), + 0.f + }; + + v_max[0] = LV_MAX(t_min.x(), t_max.x()); + v_max[1] = LV_MAX(t_min.y(), t_max.y()); + v_max[2] = LV_MAX(t_min.z(), t_max.z()); + v_min[0] = LV_MIN(t_min.x(), t_max.x()); + v_min[1] = LV_MIN(t_min.y(), t_max.y()); + v_min[2] = LV_MIN(t_min.z(), t_max.z()); + v_cen[0] = (v_max[0] + v_min[0]) / 2.0f; + v_cen[1] = (v_max[1] + v_min[1]) / 2.0f; + v_cen[2] = (v_max[2] + v_min[2]) / 2.0f; + float size_x = v_max[0] - v_min[0]; + float size_y = v_max[1] - v_min[1]; + float size_z = v_max[2] - v_min[2]; + radius = std::sqrt((size_x * size_x) + (size_y * size_y) + + (size_z * size_z)) / + 2.0f; + result[0] = v_cen[0]; + result[1] = v_cen[1]; + result[2] = v_cen[2]; + result[3] = radius; + return result; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_shader.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_shader.cpp new file mode 100644 index 0000000..3364d0a --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_shader.cpp @@ -0,0 +1,60 @@ +/** + * @file lv_gltf_data_shader.cpp + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_data_internal.hpp" + +#if LV_USE_GLTF +#include "../../../misc/lv_array.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_gltf_store_compiled_shader(lv_gltf_model_t * data, size_t identifier, lv_gltf_compiled_shader_t * shader) +{ + const size_t index = identifier - 1; + bool has_to_resize = index >= lv_array_size(&data->compiled_shaders); + if(!has_to_resize) { + lv_array_assign(&data->compiled_shaders, index, shader); + } + while(index >= lv_array_size(&data->compiled_shaders)) { + lv_array_push_back(&data->compiled_shaders, shader); + } +} + +lv_gltf_compiled_shader_t * lv_gltf_get_compiled_shader(lv_gltf_model_t * data, size_t identifier) +{ + const size_t index = identifier - 1; + LV_ASSERT(index < lv_array_size(&data->compiled_shaders)); + return (lv_gltf_compiled_shader_t *)lv_array_at(&data->compiled_shaders, index); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_skin.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_skin.cpp new file mode 100644 index 0000000..d67b53c --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_skin.cpp @@ -0,0 +1,68 @@ +/** + * @file lv_gltf_data_skin.cpp + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_data_internal.hpp" + +#if LV_USE_GLTF +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +GLuint lv_gltf_data_get_skin_texture_at(lv_gltf_model_t * data, size_t index) +{ + return data->skin_tex[index]; +} + +bool lv_gltf_data_validated_skins_contains(lv_gltf_model_t * data, size_t index) +{ + return ((std::find(data->validated_skins.begin(), + data->validated_skins.end(), + index) != data->validated_skins.end())); +} + +void lv_gltf_data_validate_skin(lv_gltf_model_t * data, size_t index) +{ + data->validated_skins.push_back(index); +} + +size_t lv_gltf_data_get_skins_size(lv_gltf_model_t * data) +{ + return data->validated_skins.size(); +} +size_t lv_gltf_data_get_skin(lv_gltf_model_t * data, size_t index) +{ + return data->validated_skins[index]; +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_texture.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_texture.cpp new file mode 100644 index 0000000..0448556 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_data_texture.cpp @@ -0,0 +1,87 @@ +/** + * @file lv_gltf_data_texture.cpp + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_data_internal.hpp" +#if LV_USE_GLTF + +#include +#include "../../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_gltf_data_delete_textures(lv_gltf_model_t * data) +{ + glDeleteTextures(data->skin_tex.size(), data->skin_tex.data()); + data->skin_tex.clear(); +} + +GLuint lv_gltf_data_create_texture(lv_gltf_model_t * data) +{ + GLuint texture; + GL_CALL(glGenTextures(1, &texture)); + data->skin_tex.push_back(texture); + return texture; +} + +void lv_gltf_data_rgb_to_bgr(uint8_t * pixels, size_t byte_total_count, bool has_alpha) +{ + size_t bytes_per_pixel = has_alpha ? 4 : 3; + size_t pixel_count = (byte_total_count / bytes_per_pixel); + if(bytes_per_pixel == 4) { + for(size_t p = 0; p < pixel_count; p++) { + size_t index = p << 2; + uint8_t r = pixels[index + 0]; + uint8_t g = pixels[index + 1]; + uint8_t b = pixels[index + 2]; + uint8_t a = pixels[index + 3]; + pixels[index + 0] = b; + pixels[index + 1] = g; + pixels[index + 2] = r; + pixels[index + 3] = a; + } + } + else { + for(size_t p = 0; p < pixel_count; p++) { + size_t index = p * 3; + uint8_t r = pixels[index + 0]; + uint8_t g = pixels[index + 1]; + uint8_t b = pixels[index + 2]; + pixels[index + 0] = b; + pixels[index + 1] = g; + pixels[index + 2] = r; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_model.h b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_model.h new file mode 100644 index 0000000..5c4608a --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_model.h @@ -0,0 +1,127 @@ +#ifndef LV_GLTF_MODEL_H +#define LV_GLTF_MODEL_H + +#include "../../../lv_conf_internal.h" +#if LV_USE_GLTF + +#include "lv_gltf_model_node.h" +#include "../../../misc/lv_types.h" +#include "../../../misc/lv_event.h" + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @brief Get the number of images in the glTF model + * + * Images in glTF are used as sources for textures and can be stored either as external files + * or embedded as base64-encoded model within the glTF file. + * + * @param model Pointer to the glTF model data structure + * @return Number of images in the model + */ +size_t lv_gltf_model_get_image_count(const lv_gltf_model_t * model); + +/** + * @brief Get the number of textures in the glTF model + * + * Textures define how images are sampled and applied to materials. Each texture references + * an image and may specify sampling parameters like filtering and wrapping modes. + * + * @param model Pointer to the glTF model data structure + * @return Number of textures in the model + */ +size_t lv_gltf_model_get_texture_count(const lv_gltf_model_t * model); + +/** + * @brief Get the number of materials in the glTF model + * + * Materials define the visual appearance of mesh primitives, including properties like + * base color, metallic/roughness values, normal maps, and other surface characteristics. + * + * @param model Pointer to the glTF model data structure + * @return Number of materials in the model + */ +size_t lv_gltf_model_get_material_count(const lv_gltf_model_t * model); + +/** + * @brief Get the number of cameras in the glTF model + * + * Cameras define viewpoints within the 3D scene and can be either perspective or + * orthographic. They are typically attached to nodes in the scene graph. + * + * @param model Pointer to the glTF model data structure + * @return Number of cameras in the model + */ +size_t lv_gltf_model_get_camera_count(const lv_gltf_model_t * model); + + +/** + * @brief Get the number of meshes in the glTF model + * + * Meshes contain the geometric model for 3D objects, including vertex positions, normals, + * texture coordinates, and indices. Each mesh can have multiple primitives with different materials. + * + * @param model Pointer to the glTF model data structure + * @return Number of meshes in the model + */ +size_t lv_gltf_model_get_mesh_count(const lv_gltf_model_t * model); + +/** + * @brief Get the number of scenes in the glTF model + * + * Scenes define the root nodes of the scene graph. A glTF file can contain multiple scenes, + * though typically only one is designated as the default scene to be displayed. + * + * @param model Pointer to the glTF model data structure + * @return Number of scenes in the model + */ +size_t lv_gltf_model_get_scene_count(const lv_gltf_model_t * model); + +/** + * @brief Get the number of animations in the glTF model + * + * Animations define keyframe-based motion for nodes in the scene, including transformations + * like translation, rotation, and scaling over time. + * + * @param model Pointer to the glTF model data structure + * @return Number of animations in the model + */ +size_t lv_gltf_model_get_animation_count(const lv_gltf_model_t * model); + +/** + * @brief Select and start playing an animation + * + * @param model Pointer to the glTF model structure + * @param index Animation number to start playing + * @return LV_RESULT_OK if the animation was started else LV_RESULT_INVALID + */ +lv_result_t lv_gltf_model_play_animation(lv_gltf_model_t * model, size_t index); + +/** + * @brief Pause the current animation + * + * @param model Pointer to the glTF model structure + */ +void lv_gltf_model_pause_animation(lv_gltf_model_t * model); + +/** + * @brief Check if an animation is currently being played + * + * @param model Pointer to the glTF model structure + */ +bool lv_gltf_model_is_animation_paused(lv_gltf_model_t * model); + +/** + * @brief Get the current selected animation. To see if it's playing see `lv_gltf_model_is_animation_paused` + * + * @param model Pointer to the glTF model structure + */ +size_t lv_gltf_model_get_animation(lv_gltf_model_t * model); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_GLTF*/ +#endif /*LV_GLTF_MODEL_H*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_model_node.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_model_node.cpp new file mode 100644 index 0000000..f2367d9 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_model_node.cpp @@ -0,0 +1,375 @@ +/** + * @file lv_gltf_model_node.cpp + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_data_internal.hpp" +#if LV_USE_GLTF + +#include +#include "fastgltf/types.hpp" +#include "lv_gltf_model.h" +#include "../../../misc/lv_array.h" +#include "../../../misc/lv_assert.h" +#include "../../../misc/lv_types.h" +#include "../../../misc/lv_event_private.h" +#include "../../../stdlib/lv_string.h" +#include "../../../stdlib/lv_sprintf.h" +#include "../../../core/lv_obj_pos.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +static lv_result_t add_write_op(lv_gltf_model_node_t * node, lv_gltf_node_prop_t prop, uint8_t channel, float value); +static void invalidate_model(lv_gltf_model_t * model); + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_gltf_model_node_init(lv_gltf_model_t * model, lv_gltf_model_node_t * node, fastgltf::Node * fastgltf_node, + const char * path, + const char * numeric_path) +{ + LV_ASSERT_NULL(node); + lv_memset(node, 0, sizeof(*node)); + node->model = model; + node->fastgltf_node = fastgltf_node; + node->path = lv_strdup(path); + node->numeric_path = lv_strdup(numeric_path); + LV_ASSERT_MALLOC(node->path); + LV_ASSERT_MALLOC(node->numeric_path); + + lv_array_init(&node->write_ops, 0, sizeof(lv_gltf_write_op_t)); +} + +void lv_gltf_model_node_deinit(lv_gltf_model_node_t * node) +{ + LV_ASSERT_NULL(node); + lv_free((void *)node->path); + lv_free((void *)node->numeric_path); + lv_array_deinit(&node->write_ops); + + if(node->read_attrs) { + lv_event_remove_all(&node->read_attrs->event_list); + lv_free((void *)node->read_attrs); + } +} + +lv_gltf_model_node_t * lv_gltf_model_node_get_by_index(lv_gltf_model_t * model, size_t index) +{ + if(!model) { + LV_LOG_WARN("Failed to get node from NULL model"); + return nullptr; + } + + const uint32_t count = lv_array_size(&model->nodes); + if(index >= count) { + LV_LOG_WARN("Invalid index %zu. Max should be %" LV_PRIu32, index, count - 1); + return nullptr; + } + return (lv_gltf_model_node_t *)lv_array_at(&model->nodes, index); +} + +lv_gltf_model_node_t * lv_gltf_model_node_get_by_numeric_path(lv_gltf_model_t * model, const char * num_path) +{ + + const uint32_t node_count = lv_array_size(&model->nodes); + for(uint32_t i = 0; i < node_count; ++i) { + lv_gltf_model_node_t * entry = (lv_gltf_model_node_t *) lv_array_at(&model->nodes, i); + if(lv_streq(entry->numeric_path, num_path)) { + return entry; + } + } + return nullptr; +} + +lv_gltf_model_node_t * lv_gltf_model_node_get_by_path(lv_gltf_model_t * model, const char * path) +{ + + if(!model) { + LV_LOG_WARN("Can't get node from NULL model"); + return nullptr; + } + + const uint32_t node_count = lv_array_size(&model->nodes); + for(uint32_t i = 0; i < node_count; ++i) { + lv_gltf_model_node_t * entry = (lv_gltf_model_node_t *) lv_array_at(&model->nodes, i); + if(lv_streq(entry->path, path)) { + return entry; + } + } + return nullptr; +} + +lv_gltf_model_node_t * lv_gltf_model_node_get_by_internal_node(lv_gltf_model_t * model, + const fastgltf::Node * fastgltf_node) +{ + LV_ASSERT_NULL(model); + const uint32_t node_count = lv_array_size(&model->nodes); + for(uint32_t i = 0; i < node_count; ++i) { + lv_gltf_model_node_t * entry = (lv_gltf_model_node_t *) lv_array_at(&model->nodes, i); + if(entry->fastgltf_node == fastgltf_node) { + return entry; + } + } + return nullptr; +} + +const char * lv_gltf_model_node_get_path(lv_gltf_model_node_t * node) +{ + if(!node) { + LV_LOG_WARN("Can't get the path of a null node"); + return nullptr; + } + return node->path; +} + +const char * lv_gltf_model_node_get_ip(lv_gltf_model_node_t * node) +{ + if(!node) { + LV_LOG_WARN("Can't get the ip of a null node"); + return nullptr; + } + return node->numeric_path; +} +void lv_gltf_model_send_new_values(lv_gltf_model_t * model) +{ + LV_ASSERT_NULL(model); + if(!model->write_ops_flushed) { + return; + } + const uint32_t node_count = lv_array_size(&model->nodes); + for(uint32_t i = 0; i < node_count; ++i) { + lv_gltf_model_node_t * node = (lv_gltf_model_node_t *) lv_array_at(&model->nodes, i); + if(!node->read_attrs || !node->read_attrs->value_changed) { + continue; + } + lv_event_push_and_send(&node->read_attrs->event_list, LV_EVENT_VALUE_CHANGED, node, &node->read_attrs->node_data); + node->read_attrs->value_changed = false; + } + model->write_ops_flushed = false; +} + +lv_event_dsc_t * lv_gltf_model_node_add_event_cb(lv_gltf_model_node_t * node, lv_event_cb_t cb, + lv_event_code_t filter_list, + void * user_data) +{ + if(!node->read_attrs) { + node->read_attrs = (lv_gltf_model_node_attr_t *) lv_zalloc(sizeof(*node->read_attrs)); + LV_ASSERT_MALLOC(node->read_attrs); + if(!node->read_attrs) { + LV_LOG_WARN("Failed to allocate memory for read attributes"); + return nullptr; + } + lv_array_init(&node->read_attrs->event_list.array, 1, sizeof(lv_event_dsc_t *)); + } + return lv_event_add(&node->read_attrs->event_list, cb, filter_list, user_data); +} + +lv_event_dsc_t * lv_gltf_model_node_add_event_cb_with_world_position(lv_gltf_model_node_t * node, lv_event_cb_t cb, + lv_event_code_t filter_list, + void * user_data) +{ + lv_event_dsc_t * dsc = lv_gltf_model_node_add_event_cb(node, cb, filter_list, user_data); + if(!dsc) { + return nullptr; + } + LV_ASSERT_NULL(node->read_attrs); + node->read_attrs->read_world_position = true; + return dsc; +} + +lv_result_t lv_gltf_model_node_set_position_x(lv_gltf_model_node_t * node, float x) +{ + return add_write_op(node, LV_GLTF_NODE_PROP_POSITION, LV_GLTF_NODE_CHANNEL_X, x); +} + +lv_result_t lv_gltf_model_node_set_position_y(lv_gltf_model_node_t * node, float y) +{ + return add_write_op(node, LV_GLTF_NODE_PROP_POSITION, LV_GLTF_NODE_CHANNEL_Y, y); +} + +lv_result_t lv_gltf_model_node_set_position_z(lv_gltf_model_node_t * node, float z) +{ + return add_write_op(node, LV_GLTF_NODE_PROP_POSITION, LV_GLTF_NODE_CHANNEL_Z, z); +} + +lv_result_t lv_gltf_model_node_set_rotation_x(lv_gltf_model_node_t * node, float x) +{ + return add_write_op(node, LV_GLTF_NODE_PROP_ROTATION, LV_GLTF_NODE_CHANNEL_X, x); +} + +lv_result_t lv_gltf_model_node_set_rotation_y(lv_gltf_model_node_t * node, float y) +{ + return add_write_op(node, LV_GLTF_NODE_PROP_ROTATION, LV_GLTF_NODE_CHANNEL_Y, y); +} + +lv_result_t lv_gltf_model_node_set_rotation_z(lv_gltf_model_node_t * node, float z) +{ + return add_write_op(node, LV_GLTF_NODE_PROP_ROTATION, LV_GLTF_NODE_CHANNEL_Z, z); +} + +lv_result_t lv_gltf_model_node_set_scale_x(lv_gltf_model_node_t * node, float x) +{ + return add_write_op(node, LV_GLTF_NODE_PROP_SCALE, LV_GLTF_NODE_CHANNEL_X, x); +} + +lv_result_t lv_gltf_model_node_set_scale_y(lv_gltf_model_node_t * node, float y) +{ + return add_write_op(node, LV_GLTF_NODE_PROP_SCALE, LV_GLTF_NODE_CHANNEL_Y, y); +} + +lv_result_t lv_gltf_model_node_set_scale_z(lv_gltf_model_node_t * node, float z) +{ + return add_write_op(node, LV_GLTF_NODE_PROP_SCALE, LV_GLTF_NODE_CHANNEL_Z, z); +} + +lv_result_t lv_gltf_model_node_get_local_position(lv_event_t * e, lv_3dpoint_t * result) +{ + if(!e || e->code != LV_EVENT_VALUE_CHANGED) { + LV_LOG_WARN("Invalid event"); + return LV_RESULT_INVALID; + } + lv_gltf_model_node_t * node = (lv_gltf_model_node_t *)lv_event_get_target(e); + + if(!node) { + LV_LOG_WARN("Cannot get property from a NULL node"); + return LV_RESULT_INVALID; + } + if(!node->read_attrs) { + LV_LOG_WARN("No read event set for this node"); + return LV_RESULT_INVALID; + } + *result = node->read_attrs->node_data.local_position; + return LV_RESULT_OK; +} + +lv_result_t lv_gltf_model_node_get_world_position(lv_event_t * e, lv_3dpoint_t * result) +{ + if(!e || e->code != LV_EVENT_VALUE_CHANGED) { + LV_LOG_WARN("Invalid event"); + return LV_RESULT_INVALID; + } + + lv_gltf_model_node_t * node = (lv_gltf_model_node_t *)lv_event_get_target(e); + + if(!node) { + LV_LOG_WARN("Cannot get property from a NULL node"); + return LV_RESULT_INVALID; + } + if(!node->read_attrs) { + LV_LOG_WARN("No read event set for this node"); + return LV_RESULT_INVALID; + } + if(!node->read_attrs->read_world_position) { + LV_LOG_WARN("World position is not read by this node"); + return LV_RESULT_INVALID; + } + *result = node->read_attrs->node_data.world_position; + return LV_RESULT_OK; +} + +lv_result_t lv_gltf_model_node_get_scale(lv_event_t * e, lv_3dpoint_t * result) +{ + if(!e || e->code != LV_EVENT_VALUE_CHANGED) { + LV_LOG_WARN("Invalid event"); + return LV_RESULT_INVALID; + } + lv_gltf_model_node_t * node = (lv_gltf_model_node_t *)lv_event_get_target(e); + if(!node) { + LV_LOG_WARN("Cannot get property from a NULL node"); + return LV_RESULT_INVALID; + } + if(!node->read_attrs) { + LV_LOG_WARN("No read event set for this node"); + return LV_RESULT_INVALID; + } + *result = node->read_attrs->node_data.scale; + return LV_RESULT_OK; +} + +lv_result_t lv_gltf_model_node_get_euler_rotation(lv_event_t * e, lv_3dpoint_t * result) +{ + if(!e || e->code != LV_EVENT_VALUE_CHANGED) { + LV_LOG_WARN("Invalid event"); + return LV_RESULT_INVALID; + } + lv_gltf_model_node_t * node = (lv_gltf_model_node_t *)lv_event_get_target(e); + if(!node) { + LV_LOG_WARN("Cannot get property from a NULL node"); + return LV_RESULT_INVALID; + } + if(!node->read_attrs) { + LV_LOG_WARN("No read event set for this node"); + return LV_RESULT_INVALID; + } + *result = node->read_attrs->node_data.rotation; + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void invalidate_model(lv_gltf_model_t * model) +{ + lv_obj_invalidate((lv_obj_t *)model->viewer); + model->write_ops_pending = true; +} + +static lv_result_t add_write_op(lv_gltf_model_node_t * node, lv_gltf_node_prop_t prop, uint8_t channel, float value) +{ + if(!node) { + LV_LOG_WARN("Can't queue queue write operation for NULL node"); + return LV_RESULT_INVALID; + } + + /* Try to find if a write operation for this property + channel combination exists*/ + /* Doing this is ok for now because the array will be of max size 9 (3 properties x 3 channels) + * In case we start adding more properties we need to look into other approaches*/ + const uint32_t write_ops_count = lv_array_size(&node->write_ops); + for(uint32_t i = 0; i < write_ops_count; ++i) { + lv_gltf_write_op_t * write_op = (lv_gltf_write_op_t *)lv_array_at(&node->write_ops, i); + if(write_op->prop != prop || write_op->channel != channel) { + continue; + } + if(LV_ABS(write_op->value - value) > FLT_EPSILON) { + write_op->value = value; + invalidate_model(node->model); + } + return LV_RESULT_OK; + } + /* Else create a new one */ + lv_gltf_write_op_t write_op {prop, channel, value}; + lv_result_t res = lv_array_push_back(&node->write_ops, &write_op); + if(res != LV_RESULT_OK) { + return res; + } + invalidate_model(node->model); + + return LV_RESULT_OK; +} + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_model_node.h b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_model_node.h new file mode 100644 index 0000000..8a60151 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_model_node.h @@ -0,0 +1,264 @@ +/** + * @file lv_gltf_model_node.h + * + */ + +#ifndef LV_GLTF_MODEL_NODE_H +#define LV_GLTF_MODEL_NODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GLTF + +#include "../../../misc/lv_types.h" +#include "../math/lv_3dmath.h" +#include "../../../misc/lv_event.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Get a glTF model node by its index + * + * @param data Pointer to the glTF model structure + * @param index The index of the node to retrieve + * @return Pointer to the glTF model node, or NULL if not found + */ +lv_gltf_model_node_t * lv_gltf_model_node_get_by_index(lv_gltf_model_t * data, size_t index); + +/** + * @brief Get a glTF model node by its numeric path + * + * @param data Pointer to the glTF model structure + * @param num_path The numeric path string of the node to retrieve (eg. ".0") + * @return Pointer to the glTF model node, or NULL if not found + */ +lv_gltf_model_node_t * lv_gltf_model_node_get_by_numeric_path(lv_gltf_model_t * data, const char * num_path); + +/** + * @brief Get a glTF model node by its path + * + * @param data Pointer to the glTF model structure + * @param path The path string of the node to retrieve + * @return Pointer to the glTF model node, or NULL if not found + */ +lv_gltf_model_node_t * lv_gltf_model_node_get_by_path(lv_gltf_model_t * data, const char * path); + +/** + * @brief Get the path of a glTF model node + * + * @param node Pointer to the glTF model node structure + * @return The path string of the node, or NULL if node is invalid + */ +const char * lv_gltf_model_node_get_path(lv_gltf_model_node_t * node); + +/** + * @brief Get the IP (internal pointer/identifier) of a glTF model node + * + * @param node Pointer to the glTF model node structure + * @return The IP string of the node, or NULL if node is invalid + */ +const char * lv_gltf_model_node_get_ip(lv_gltf_model_node_t * node); + +/** + * @brief Add an event callback to a glTF model node + * + * @param node Pointer to the glTF model node structure + * @param cb The event callback function to add. Use lv_event_get_param() to retrieve lv_gltf_node_data_t with the node's data. + * @param filter_list Event code filter for the callback + * @param user_data User data to pass to the callback + * @return Pointer to the event descriptor, or NULL if allocation failed + */ +lv_event_dsc_t * lv_gltf_model_node_add_event_cb(lv_gltf_model_node_t * node, lv_event_cb_t cb, + lv_event_code_t filter_list, + void * user_data); + +/** + * @brief Add an event callback to a glTF model node with world position computation enabled. Use this only when world position is needed, as computing it is an expensive operation. + * + * @param node Pointer to the glTF model node structure + * @param cb The event callback function to add. Use lv_event_get_param() to retrieve lv_gltf_node_data_t with the node's data. + * @param filter_list Event code filter for the callback + * @param user_data User data to pass to the callback + * @return Pointer to the event descriptor, or NULL if allocation failed + */ +lv_event_dsc_t * lv_gltf_model_node_add_event_cb_with_world_position(lv_gltf_model_node_t * node, lv_event_cb_t cb, + lv_event_code_t filter_list, + void * user_data); +/** + * @brief Get the number of nodes in the glTF model + * + * Nodes form the scene graph hierarchy and can contain transformations, meshes, cameras, + * or other nodes as children. They define the spatial relationships between objects in the scene. + * + * @param model Pointer to the glTF model data structure + * @return Number of nodes in the model + */ +size_t lv_gltf_model_get_node_count(const lv_gltf_model_t * model); + +/** + * @brief Set the X position of a glTF model node. The operation is queued and applied on the next rendering phase. + * + * @param node Pointer to the glTF model node structure + * @param x The X position value + * @return LV_RESULT_OK if the operation is queued successfully, LV_RESULT_INVALID if node is null or no more memory to queue the operation + */ +lv_result_t lv_gltf_model_node_set_position_x(lv_gltf_model_node_t * node, float x); + +/** + * @brief Set the Y position of a glTF model node. The operation is queued and applied on the next rendering phase. + * + * @param node Pointer to the glTF model node structure + * @param y The Y position value + * @return LV_RESULT_OK if the operation is queued successfully, LV_RESULT_INVALID if node is null or no more memory to queue the operation + */ +lv_result_t lv_gltf_model_node_set_position_y(lv_gltf_model_node_t * node, float y); + +/** + * @brief Set the Z position of a glTF model node. The operation is queued and applied on the next rendering phase. + * + * @param node Pointer to the glTF model node structure + * @param z The Z position value + * @return LV_RESULT_OK if the operation is queued successfully, LV_RESULT_INVALID if node is null or no more memory to queue the operation + */ +lv_result_t lv_gltf_model_node_set_position_z(lv_gltf_model_node_t * node, float z); + +/** + * @brief Set the X component of a glTF model node's rotation quaternion. The operation is queued and applied on the next rendering phase. + * + * @param node Pointer to the glTF model node structure + * @param x The X rotation component value + * @return LV_RESULT_OK if the operation is queued successfully, LV_RESULT_INVALID if node is null or no more memory to queue the operation + */ +lv_result_t lv_gltf_model_node_set_rotation_x(lv_gltf_model_node_t * node, float x); + +/** + * @brief Set the Y component of a glTF model node's rotation quaternion. The operation is queued and applied on the next rendering phase. + * + * @param node Pointer to the glTF model node structure + * @param y The Y rotation component value + * @return LV_RESULT_OK if the operation is queued successfully, LV_RESULT_INVALID if node is null or no more memory to queue the operation + */ +lv_result_t lv_gltf_model_node_set_rotation_y(lv_gltf_model_node_t * node, float y); + +/** + * @brief Set the Z component of a glTF model node's rotation quaternion. The operation is queued and applied on the next rendering phase. + * + * @param node Pointer to the glTF model node structure + * @param z The Z rotation component value + * @return LV_RESULT_OK if the operation is queued successfully, LV_RESULT_INVALID if node is null or no more memory to queue the operation + */ +lv_result_t lv_gltf_model_node_set_rotation_z(lv_gltf_model_node_t * node, float z); + +/** + * @brief Set the X scale of a glTF model node. The operation is queued and applied on the next rendering phase. + * + * @param node Pointer to the glTF model node structure + * @param x The X scale value + * @return LV_RESULT_OK if the operation is queued successfully, LV_RESULT_INVALID if node is null or no more memory to queue the operation + */ +lv_result_t lv_gltf_model_node_set_scale_x(lv_gltf_model_node_t * node, float x); + +/** + * @brief Set the Y scale of a glTF model node. The operation is queued and applied on the next rendering phase. + * + * @param node Pointer to the glTF model node structure + * @param y The Y scale value + * @return LV_RESULT_OK if the operation is queued successfully, LV_RESULT_INVALID if node is null or no more memory to queue the operation + */ +lv_result_t lv_gltf_model_node_set_scale_y(lv_gltf_model_node_t * node, float y); + +/** + * @brief Set the Z scale of a glTF model node. The operation is queued and applied on the next rendering phase. + * + * @param node Pointer to the glTF model node structure + * @param z The Z scale value + * @return LV_RESULT_OK if the operation is queued successfully, LV_RESULT_INVALID if node is null or no more memory to queue the operation + */ +lv_result_t lv_gltf_model_node_set_scale_z(lv_gltf_model_node_t * node, float z); + +/** + * @brief Get the local position of a glTF model node. Must be called from within an LV_EVENT_VALUE_CHANGED callback. + * + * Local position is relative to the node's parent. + * + * This function is only valid when called from an event callback registered. + * See `lv_gltf_model_node_add_event_cb()` and `lv_gltf_model_node_add_event_cb_with_world_position()` + * + * @param e Pointer to the event structure from the callback + * @param result Pointer to lv_3dpoint_t structure to store the position (x, y, z) + * @return LV_RESULT_OK if successful, LV_RESULT_INVALID if called outside event callback or if parameters are null + */ +lv_result_t lv_gltf_model_node_get_local_position(lv_event_t * e, lv_3dpoint_t * result); + +/** + * @brief Get the world position of a glTF model node. Must be called from within an LV_EVENT_VALUE_CHANGED callback + * registered with world position enabled. + * + * World position is the absolute position in global scene coordinates. + * + * This function requires the event callback to be registered with lv_gltf_model_node_add_event_cb_with_world_position() + * as it involves complex matrix calculations that are computed on-demand. + * + * @param e Pointer to the event structure from the callback + * @param result Pointer to lv_3dpoint_t structure to store the position (x, y, z) + * @return LV_RESULT_OK if successful, LV_RESULT_INVALID if called outside event callback, world position not enabled, or if parameters are null + */ +lv_result_t lv_gltf_model_node_get_world_position(lv_event_t * e, lv_3dpoint_t * result); + +/** + * @brief Get the scale of a glTF model node. Must be called from within an LV_EVENT_VALUE_CHANGED callback. + * + * Returns the scale factors for each axis. + * + * This function is only valid when called from an event callback registered. + * See `lv_gltf_model_node_add_event_cb()` and `lv_gltf_model_node_add_event_cb_with_world_position()` + * + * @param e Pointer to the event structure from the callback + * @param result Pointer to lv_3dpoint_t structure to store the scale (x, y, z) + * @return LV_RESULT_OK if successful, LV_RESULT_INVALID if called outside event callback or if parameters are null + */ +lv_result_t lv_gltf_model_node_get_scale(lv_event_t * e, lv_3dpoint_t * result); + +/** + * @brief Get the Euler rotation of a glTF model node. Must be called from within an LV_EVENT_VALUE_CHANGED callback. + * + * Returns rotation as Euler angles in radians (x, y, z). + * + * This function is only valid when called from an event callback registered. + * See `lv_gltf_model_node_add_event_cb()` and `lv_gltf_model_node_add_event_cb_with_world_position()` + * + * @param e Pointer to the event structure from the callback + * @param result Pointer to lv_3dpoint_t structure to store the rotation in radians (x, y, z) + * @return LV_RESULT_OK if successful, LV_RESULT_INVALID if called outside event callback or if parameters are null + */ +lv_result_t lv_gltf_model_node_get_euler_rotation(lv_event_t * e, lv_3dpoint_t * result); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GLTF*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GLTF_MODEL_NODE_H*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_uniform_locations.cpp b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_uniform_locations.cpp new file mode 100644 index 0000000..0a213d6 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_data/lv_gltf_uniform_locations.cpp @@ -0,0 +1,115 @@ + +#include "lv_gltf_data_internal.hpp" +#if LV_USE_GLTF + +lv_gltf_uniform_locations_t lv_gltf_uniform_locations_create(GLuint program) +{ + lv_gltf_uniform_locations_t uniforms; + lv_memset(&uniforms, 0, sizeof(uniforms)); + + // *** IMAGE QUALITY UNIFORMS *********************************************************************** + uniforms.exposure = glGetUniformLocation(program, "u_Exposure"); + // *** CAMERA/VIEW/PROJECTION/MODEL MATRIX UNIFORMS ************************************************* + uniforms.camera = glGetUniformLocation(program, "u_Camera"); + uniforms.model_matrix = glGetUniformLocation(program, "u_ModelMatrix"); + uniforms.view_projection_matrix = glGetUniformLocation(program, "u_ViewProjectionMatrix"); + uniforms.view_matrix = glGetUniformLocation(program, "u_ViewMatrix"); + uniforms.projection_matrix = glGetUniformLocation(program, "u_ProjectionMatrix"); + // *** IMAGE BASED LIGHTING (IBL) UNIFORMS ********************************************************** + uniforms.env_intensity = glGetUniformLocation(program, "u_EnvIntensity"); + uniforms.env_diffuse_sampler = glGetUniformLocation(program, "u_LambertianEnvSampler"); + uniforms.env_specular_sampler = glGetUniformLocation(program, "u_GGXEnvSampler"); + uniforms.env_sheen_sampler = glGetUniformLocation(program, "u_CharlieEnvSampler"); + uniforms.env_ggx_lut_sampler = glGetUniformLocation(program, "u_GGXLUT"); + uniforms.env_charlie_lut_sampler = glGetUniformLocation(program, "u_CharlieLUT"); + uniforms.env_mip_count = glGetUniformLocation(program, "u_MipCount"); + // *** BASE COLOR / TEXTURE UNIFORMS **************************************************************** + uniforms.base_color_factor = glGetUniformLocation(program, "u_BaseColorFactor"); + uniforms.base_color_sampler = glGetUniformLocation(program, "u_BaseColorSampler"); + uniforms.base_color_uv_set = glGetUniformLocation(program, "u_BaseColorUVSet"); + uniforms.base_color_uv_transform = glGetUniformLocation(program, "u_BaseColorUVTransform"); + // *** CUTOFF / IOR / DISPERSION UNIFORMS *********************************************************** + uniforms.alpha_cutoff = glGetUniformLocation(program, "u_AlphaCutoff"); + uniforms.ior = glGetUniformLocation(program, "u_Ior"); + uniforms.dispersion = glGetUniformLocation(program, "u_Dispersion"); + // *** METALLIC / ROUGHNESS UNIFORMS **************************************************************** + uniforms.metallic_factor = glGetUniformLocation(program, "u_MetallicFactor"); + uniforms.roughness_factor = glGetUniformLocation(program, "u_RoughnessFactor"); + uniforms.metallic_roughness_sampler = glGetUniformLocation(program, "u_MetallicRoughnessSampler"); + uniforms.metallic_roughness_uv_set = glGetUniformLocation(program, "u_MetallicRoughnessUVSet"); + uniforms.metallic_roughness_uv_transform = glGetUniformLocation(program, "u_MetallicRoughnessUVTransform"); + // *** EMISSION UNIFORMS **************************************************************************** + uniforms.emissive_factor = glGetUniformLocation(program, "u_EmissiveFactor"); + uniforms.emissive_sampler = glGetUniformLocation(program, "u_EmissiveSampler"); + uniforms.emissive_uv_set = glGetUniformLocation(program, "u_EmissiveUVSet"); + uniforms.emissive_uv_transform = glGetUniformLocation(program, "u_EmissiveUVTransform"); + uniforms.emissive_strength = glGetUniformLocation(program, "u_EmissiveStrength"); + // *** OCCLUSION UNIFORMS *************************************************************************** + uniforms.occlusion_strength = glGetUniformLocation(program, "u_OcclusionStrength"); + uniforms.occlusion_sampler = glGetUniformLocation(program, "u_OcclusionSampler"); + uniforms.occlusion_uv_set = glGetUniformLocation(program, "u_OcclusionUVSet"); + uniforms.occlusion_uv_transform = glGetUniformLocation(program, "u_OcclusionUVTransform"); + // *** NORMAL MAP UNIFORMS ************************************************************************** + uniforms.normal_sampler = glGetUniformLocation(program, "u_NormalSampler"); + uniforms.normal_scale = glGetUniformLocation(program, "u_NormalScale"); + uniforms.normal_uv_set = glGetUniformLocation(program, "u_NormalUVSet"); + uniforms.normal_uv_transform = glGetUniformLocation(program, "u_NormalUVTransform"); + // *** VOLUME / TRANSMISSION UNIFORMS *************************************************************** + uniforms.attenuation_distance = glGetUniformLocation(program, "u_AttenuationDistance"); + uniforms.attenuation_color = glGetUniformLocation(program, "u_AttenuationColor"); + uniforms.transmission_factor = glGetUniformLocation(program, "u_TransmissionFactor"); + uniforms.transmission_sampler = glGetUniformLocation(program, "u_TransmissionSampler"); + uniforms.transmission_uv_set = glGetUniformLocation(program, "u_TransmissionUVSet"); + uniforms.transmission_uv_transform = glGetUniformLocation(program, "u_TransmissionUVTransform"); + uniforms.transmission_framebuffer_sampler = glGetUniformLocation(program, "u_TransmissionFramebufferSampler"); + uniforms.transmission_framebuffer_size = glGetUniformLocation(program, "u_TransmissionFramebufferSize"); + uniforms.screen_size = glGetUniformLocation(program, "u_ScreenSize"); + uniforms.thickness = glGetUniformLocation(program, "u_ThicknessFactor"); + uniforms.thickness_sampler = glGetUniformLocation(program, "u_ThicknessSampler"); + uniforms.thickness_uv_set = glGetUniformLocation(program, "u_ThicknessUVSet"); + uniforms.thickness_uv_transform = glGetUniformLocation(program, "u_ThicknessUVTransform"); + // *** CLEARCOAT UNIFORMS *************************************************************************** + uniforms.clearcoat_factor = glGetUniformLocation(program, "u_ClearcoatFactor"); + uniforms.clearcoat_roughness_factor = glGetUniformLocation(program, "u_ClearcoatRoughnessFactor"); + uniforms.clearcoat_sampler = glGetUniformLocation(program, "u_ClearcoatSampler"); + uniforms.clearcoat_uv_set = glGetUniformLocation(program, "u_ClearcoatUVSet"); + uniforms.clearcoat_uv_transform = glGetUniformLocation(program, "u_ClearcoatUVTransform"); + uniforms.clearcoat_roughness_sampler = glGetUniformLocation(program, "u_ClearcoatRoughnessSampler"); + uniforms.clearcoat_roughness_uv_set = glGetUniformLocation(program, "u_ClearcoatRoughnessUVSet"); + uniforms.clearcoat_roughness_uv_transform = glGetUniformLocation(program, "u_ClearcoatRoughnessUVTransform"); + uniforms.clearcoat_normal_scale = glGetUniformLocation(program, "u_ClearcoatNormalScale"); + uniforms.clearcoat_normal_sampler = glGetUniformLocation(program, "u_ClearcoatNormalSampler"); + uniforms.clearcoat_normal_uv_set = glGetUniformLocation(program, "u_ClearcoatNormalUVSet"); + uniforms.clearcoat_normal_uv_transform = glGetUniformLocation(program, "u_ClearcoatNormalUVTransform"); + // *** DIFFUSE TRANSMISSION UNIFORMS **************************************************************** + uniforms.diffuse_transmission_factor = glGetUniformLocation(program, "u_DiffuseTransmissionFactor"); + uniforms.diffuse_transmission_sampler = glGetUniformLocation(program, "u_DiffuseTransmissionSampler"); + uniforms.diffuse_transmission_uv_set = glGetUniformLocation(program, "u_DiffuseTransmissionUVSet"); + uniforms.diffuse_transmission_uv_transform = glGetUniformLocation(program, "u_DiffuseTransmissionUVTransform"); + uniforms.diffuse_transmission_color_factor = glGetUniformLocation(program, "u_DiffuseTransmissionColorFactor"); + uniforms.diffuse_transmission_color_sampler = glGetUniformLocation(program, "u_DiffuseTransmissionColorSampler"); + uniforms.diffuse_transmission_color_uv_set = glGetUniformLocation(program, "u_DiffuseTransmissionColorUVSet"); + uniforms.diffuse_transmission_color_uv_transform = glGetUniformLocation(program, + "u_DiffuseTransmissionColorUVTransform"); + // *** LEGACY SUPPORT - PBR_SPECULARGLOSS *********************************************************** + uniforms.diffuse_factor = glGetUniformLocation(program, "u_DiffuseFactor"); + uniforms.specular_factor = glGetUniformLocation(program, "u_SpecularFactor"); + uniforms.glossiness_factor = glGetUniformLocation(program, "u_GlossinessFactor"); + uniforms.diffuse_sampler = glGetUniformLocation(program, "u_DiffuseSampler"); + uniforms.diffuse_uv_set = glGetUniformLocation(program, "u_DiffuseUVSet"); + uniforms.diffuse_uv_transform = glGetUniformLocation(program, "u_DiffuseUVTransform"); + uniforms.specular_glossiness_sampler = glGetUniformLocation(program, "u_SpecularGlossinessSampler"); + uniforms.specular_glossiness_uv_set = glGetUniformLocation(program, "u_SpecularGlossinessUVSet"); + uniforms.specular_glossiness_uv_transform = glGetUniformLocation(program, "u_SpecularGlossinessUVTransform"); + // *** [PARTIALLY SUPPORTED / IN DEVELOPMENT] UNIFORMS ********************************************** + uniforms.sheen_color_factor = glGetUniformLocation(program, "u_SheenColorFactor"); + uniforms.sheen_roughness_factor = glGetUniformLocation(program, "u_SheenRoughnessFactor"); + // + uniforms.specular_color_factor = glGetUniformLocation(program, "u_KHR_materials_specular_specularColorFactor"); + uniforms.specular_factor = glGetUniformLocation(program, "u_KHR_materials_specular_specularFactor"); + // + uniforms.joints_sampler = glGetUniformLocation(program, "u_jointsSampler"); + return uniforms; +} + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_environment/lv_gltf_environment.h b/inc/lvgl/src/libs/gltf/gltf_environment/lv_gltf_environment.h new file mode 100644 index 0000000..72977eb --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_environment/lv_gltf_environment.h @@ -0,0 +1,92 @@ +/** + * @file lv_gltf_environment.h + * + */ + +#ifndef LV_GLTF_ENVIRONMENT_H +#define LV_GLTF_ENVIRONMENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" + +#if LV_USE_GLTF + +#include "../../../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +#define LV_GLTF_DEFAULT_CUBE_MAP_RESOLUTION 128 + +/********************** + * TYPEDEFS + **********************/ + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an IBL sampler for processing environment images + * @return pointer to the created sampler, or NULL on failure + * @note Can be safely deleted after environments are created + */ +lv_gltf_ibl_sampler_t * lv_gltf_ibl_sampler_create(void); + +/** + * Set the resolution for each cubemap face + * @param pointer to a sampler + * @param resolution of each cube map face in pixels (recommended: 64-512 for embedded) + */ +void lv_gltf_ibl_sampler_set_cube_map_pixel_resolution(lv_gltf_ibl_sampler_t * sampler, uint32_t resolution); + +/** + * Delete an IBL sampler + * @param sampler pointer to the sampler to delete + */ +void lv_gltf_ibl_sampler_delete(lv_gltf_ibl_sampler_t * sampler); + +/** + * Create an environment from an HDR or JPEG panoramic image for IBL rendering + * @param sampler IBL sampler defining output resolution (can be deleted after this call) + * @param file_path path to equirectangular environment image, or NULL to use default embedded image + * @return pointer to the created environment, or NULL on failure + * + * @note The source image will be downsampled to the sampler's texture_size + * @note The environment can be shared across multiple glTF objects + */ +lv_gltf_environment_t * lv_gltf_environment_create(lv_gltf_ibl_sampler_t * sampler, const char * file_path); + +/** + * Set the rotation angle of the environment map + * @param env pointer to the environment + * @param angle rotation angle in degrees + */ +void lv_gltf_environment_set_angle(lv_gltf_environment_t * env, float angle); + +/** + * Delete an environment + * @param environment pointer to the environment to delete + */ +void lv_gltf_environment_delete(lv_gltf_environment_t * environment); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GLTF*/ +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GLTF_ENVIRONMENT_H*/ + + diff --git a/inc/lvgl/src/libs/gltf/gltf_environment/lv_gltf_environment_private.h b/inc/lvgl/src/libs/gltf/gltf_environment/lv_gltf_environment_private.h new file mode 100644 index 0000000..3740f29 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_environment/lv_gltf_environment_private.h @@ -0,0 +1,106 @@ +/** + * @file lv_gltf_environment_private.h + * + */ + +#ifndef LV_GLTF_ENVIRONMENT_PRIVATE_H +#define LV_GLTF_ENVIRONMENT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../lv_conf_internal.h" +#if LV_USE_GLTF + +#include "lv_gltf_environment.h" +#include "../../../misc/lv_types.h" +#include "../../../drivers/opengles/opengl_shader/lv_opengl_shader_internal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_gltf_ibl_sampler { + uint32_t cube_map_resolution; + float lod_bias; + uint32_t lowest_mip_level; + uint32_t input_texture_id; + uint32_t cube_map_texture_id; + uint32_t framebuffer; + uint32_t mipmap_count; + + uint32_t lambertian_texture_id; + uint32_t lambertian_sample_count; + + uint32_t ggx_sample_count; + uint32_t ggx_texture_id; + + uint32_t sheen_texture_id; + uint32_t sheen_sample_count; + + uint32_t ggxlut_texture_id; + + uint32_t lut_sample_count; + uint32_t lut_resolution; + + uint32_t charlielut_texture_id; + + float scale_value; + uint32_t mipmap_levels; + + lv_opengl_shader_manager_t shader_manager; + + uint32_t fullscreen_vertex_buffer; + uint32_t fullscreen_tex_coord_buffer; + +}; + +typedef struct { + uint8_t * data; + uint32_t internal_format; + uint32_t format; + uint32_t type; +} lv_gltf_ibl_texture_t; + +typedef struct { + float * data; + size_t data_len; + uint32_t width; + uint32_t height; +} lv_gltf_ibl_image_t; + +struct _lv_gltf_environment { + uint32_t diffuse; + uint32_t specular; + uint32_t sheen; + uint32_t ggxLut; + uint32_t charlie_lut; + uint32_t mip_count; + float ibl_intensity_scale; + float angle; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GLTF*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GLTF_ENVIRONMENT_PRIVATE_H*/ + diff --git a/inc/lvgl/src/libs/gltf/gltf_environment/lv_gltf_ibl_sampler.c b/inc/lvgl/src/libs/gltf/gltf_environment/lv_gltf_ibl_sampler.c new file mode 100644 index 0000000..2fd9321 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_environment/lv_gltf_ibl_sampler.c @@ -0,0 +1,655 @@ +/** + * @file lv_gltf_ibl_sampler.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_environment_private.h" + +#if LV_USE_GLTF + +#include "../../../misc/lv_math.h" +#include "../../../misc/lv_log.h" +#include "../../../stdlib/lv_string.h" +#include "../../../drivers/opengles/lv_opengles_private.h" +#include "../../../drivers/opengles/lv_opengles_debug.h" + +#include "../../../drivers/opengles/opengl_shader/lv_opengl_shader_internal.h" +#include "../gltf_view/assets/lv_gltf_view_shader.h" + +#define STB_IMAGE_IMPLEMENTATION +#include "../stb_image/stb_image.h" + +/********************* + * DEFINES + *********************/ + +#define INTERNAL_FORMAT GL_RGBA8 +#define TEXTURE_TARGET_TYPE GL_UNSIGNED_BYTE + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t ibl_sampler_load(lv_gltf_ibl_sampler_t * sampler, const char * path); +static void ibl_sampler_filter(lv_gltf_ibl_sampler_t * sampler); +static void ibl_sampler_destroy(lv_gltf_ibl_sampler_t * sampler); +static bool ibl_gl_has_extension(const char * extension); +static void ibl_texture_from_image(lv_gltf_ibl_sampler_t * sampler, lv_gltf_ibl_texture_t * texture, + const lv_gltf_ibl_image_t * image); +static GLuint ibl_load_texture_hdr(lv_gltf_ibl_sampler_t * sampler, const lv_gltf_ibl_image_t * image); +static GLuint ibl_create_cube_map_texture(const lv_gltf_ibl_sampler_t * sampler, bool with_mipmaps); +static uint32_t ibl_create_lut_texture(const lv_gltf_ibl_sampler_t * sampler); +static void ibl_panorama_to_cubemap(lv_gltf_ibl_sampler_t * sampler); +static void ibl_apply_filter(lv_gltf_ibl_sampler_t * sampler, uint32_t distribution, float roughness, + uint32_t target_mip_level, GLuint target_texture, uint32_t sample_count, float lod_bias); +static void ibl_cube_map_to_lambertian(lv_gltf_ibl_sampler_t * sampler); +static void ibl_cube_map_to_ggx(lv_gltf_ibl_sampler_t * sampler); +static void ibl_cube_map_to_sheen(lv_gltf_ibl_sampler_t * sampler); +static void ibl_sample_lut(lv_gltf_ibl_sampler_t * sampler, uint32_t distribution, uint32_t targetTexture, + uint32_t currentTextureSize); +static void ibl_sample_ggx_lut(lv_gltf_ibl_sampler_t * sampler); +static void ibl_sample_charlie_lut(lv_gltf_ibl_sampler_t * sampler); +static int ibl_count_bits(int value); + +static void init_fullscreen_quad(lv_gltf_ibl_sampler_t * sampler); +static void draw_fullscreen_quad(lv_gltf_ibl_sampler_t * sampler, GLuint program_id); + +/********************** + * STATIC VARIABLES + **********************/ + +static const lv_opengl_glsl_version_t GLSL_VERSIONS[] = { + LV_OPENGL_GLSL_VERSION_300ES, + LV_OPENGL_GLSL_VERSION_330, +}; +static const size_t GLSL_VERSION_COUNT = sizeof(GLSL_VERSIONS) / sizeof(GLSL_VERSIONS[0]); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_gltf_ibl_sampler_t * lv_gltf_ibl_sampler_create(void) +{ + lv_gltf_ibl_sampler_t * sampler = lv_zalloc(sizeof(*sampler)); + LV_ASSERT_MALLOC(sampler) + if(!sampler) { + LV_LOG_WARN("Failed to create sampler"); + return NULL; + } + + sampler->cube_map_resolution = LV_GLTF_DEFAULT_CUBE_MAP_RESOLUTION; + sampler->ggx_sample_count = 128; + sampler->lambertian_sample_count = 256; + sampler->sheen_sample_count = 32; + sampler->lod_bias = 0.0; + sampler->lowest_mip_level = 3; + sampler->lut_resolution = 1024; + sampler->lut_sample_count = 64; + sampler->scale_value = 1.0; + + lv_opengl_shader_portions_t env_shader_portions; + lv_gltf_view_shader_get_env(&env_shader_portions); + lv_opengl_shader_manager_init(&sampler->shader_manager, env_shader_portions.all, env_shader_portions.count, NULL, + NULL); + init_fullscreen_quad(sampler); + return sampler; +} + +void lv_gltf_ibl_sampler_set_cube_map_pixel_resolution(lv_gltf_ibl_sampler_t * sampler, uint32_t resolution) +{ + if(!sampler) { + LV_LOG_WARN("Can't set cube map resolution on a NULL sampler"); + return; + } + if(resolution == 0) { + LV_LOG_WARN("Cube map resolution should be > 0"); + return; + } + sampler->cube_map_resolution = resolution; +} + +void lv_gltf_ibl_sampler_delete(lv_gltf_ibl_sampler_t * sampler) +{ + if(!sampler) { + LV_LOG_WARN("Can't delete a NULL sampler"); + return; + } + + ibl_sampler_destroy(sampler); + lv_free(sampler); +} + +void lv_gltf_environment_set_angle(lv_gltf_environment_t * env, float angle) +{ + if(!env) { + LV_LOG_WARN("Can't set angle on a NULL environment"); + return; + } + env->angle = angle; +} + +lv_gltf_environment_t * lv_gltf_environment_create(lv_gltf_ibl_sampler_t * sampler, const char * file_path) +{ + if(!sampler) { + LV_LOG_WARN("Can't create an environment with a NULL sampler"); + return NULL; + } + + lv_gltf_environment_t * env = lv_zalloc(sizeof(*env)); + LV_ASSERT_MALLOC(env); + if(!env) { + LV_LOG_WARN("Failed to create environment"); + return NULL; + } + if(ibl_sampler_load(sampler, file_path) != LV_RESULT_OK) { + LV_LOG_WARN("Failed to initialize ibl sampler"); + lv_free(env); + return NULL; + } + ibl_sampler_filter(sampler); + + env->diffuse = sampler->lambertian_texture_id; + env->specular = sampler->ggx_texture_id; + env->sheen = sampler->sheen_texture_id; + env->ggxLut = sampler->ggxlut_texture_id; + env->charlie_lut = sampler->charlielut_texture_id; + env->mip_count = sampler->mipmap_levels; + env->ibl_intensity_scale = sampler->scale_value; + return env; +} + +void lv_gltf_environment_delete(lv_gltf_environment_t * env) +{ + const unsigned int d[3] = { env->diffuse, env->specular, env->sheen }; + GL_CALL(glDeleteTextures(3, d)); + lv_free(env); +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t ibl_sampler_load(lv_gltf_ibl_sampler_t * sampler, const char * path) +{ + // vv -- WebGL Naming + if(ibl_gl_has_extension("GL_NV_float") && ibl_gl_has_extension("GL_ARB_color_buffer_float")) { + LV_LOG_INFO("Device supports float format textures"); + } + // Native naming #2 + if(ibl_gl_has_extension("GL_ARB_color_buffer_float") || ibl_gl_has_extension("GL_NV_half_float")) { + LV_LOG_INFO("Device supports half_float format textures"); + } + + int32_t src_width, src_height, src_nrChannels; + + float * data = NULL; + if(path) { + data = stbi_loadf(path, &src_width, &src_height, &src_nrChannels, 3); + } + + if(!data) { + if(path) { + LV_LOG_WARN("Failed to load environment image. Falling back to default"); + } + extern unsigned char chromatic_jpg[]; + extern unsigned int chromatic_jpg_len; + data = stbi_loadf_from_memory(chromatic_jpg, chromatic_jpg_len, &src_width, &src_height, &src_nrChannels, 3); + if(!data) { + LV_LOG_ERROR("Failed to load fallback env image"); + return LV_RESULT_INVALID; + } + } + + { + lv_gltf_ibl_image_t panorama_image = { + .data = data, + .data_len = src_width * src_height * 3, + .width = src_width, + .height = src_height, + }; + + sampler->input_texture_id = ibl_load_texture_hdr(sampler, &panorama_image); + stbi_image_free(data); + } + + GL_CALL(glGenFramebuffers(1, &sampler->framebuffer)); + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, sampler->framebuffer)); + + sampler->cube_map_texture_id = ibl_create_cube_map_texture(sampler, true); + sampler->lambertian_texture_id = ibl_create_cube_map_texture(sampler, false); + sampler->ggx_texture_id = ibl_create_cube_map_texture(sampler, true); + sampler->sheen_texture_id = ibl_create_cube_map_texture(sampler, true); + + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, sampler->ggx_texture_id)); + GL_CALL(glGenerateMipmap(GL_TEXTURE_CUBE_MAP)); + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, sampler->sheen_texture_id)); + GL_CALL(glGenerateMipmap(GL_TEXTURE_CUBE_MAP)); + sampler->mipmap_levels = ibl_count_bits(sampler->cube_map_resolution) + 1 - sampler->lowest_mip_level; + return LV_RESULT_OK; +} + +static void ibl_sampler_filter(lv_gltf_ibl_sampler_t * sampler) +{ + GLint prev_framebuffer; + GLint prev_viewport[4]; + GLint prev_program; + GLint prev_texture_2d; + GLint prev_texture_cube; + GLint prev_active_texture; + + GL_CALL(glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prev_framebuffer)); + GL_CALL(glGetIntegerv(GL_VIEWPORT, prev_viewport)); + GL_CALL(glGetIntegerv(GL_CURRENT_PROGRAM, &prev_program)); + GL_CALL(glGetIntegerv(GL_ACTIVE_TEXTURE, &prev_active_texture)); + GL_CALL(glGetIntegerv(GL_TEXTURE_BINDING_2D, &prev_texture_2d)); + GL_CALL(glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &prev_texture_cube)); + + ibl_panorama_to_cubemap(sampler); + ibl_cube_map_to_lambertian(sampler); + ibl_cube_map_to_ggx(sampler); + ibl_cube_map_to_sheen(sampler); + ibl_sample_ggx_lut(sampler); + ibl_sample_charlie_lut(sampler); + + // Restore all GL state + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, prev_framebuffer)); + GL_CALL(glViewport(prev_viewport[0], prev_viewport[1], prev_viewport[2], prev_viewport[3])); + GL_CALL(glUseProgram(prev_program)); + GL_CALL(glActiveTexture(prev_active_texture)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, prev_texture_2d)); + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, prev_texture_cube)); +} +static void ibl_sampler_destroy(lv_gltf_ibl_sampler_t * sampler) +{ + if(sampler->framebuffer != 0) { + GL_CALL(glDeleteFramebuffers(1, &sampler->framebuffer)); + sampler->framebuffer = 0; + } + + if(sampler->input_texture_id != 0) { + GL_CALL(glDeleteTextures(1, &sampler->input_texture_id)); + sampler->input_texture_id = 0; + } + + if(sampler->cube_map_texture_id != 0) { + GL_CALL(glDeleteTextures(1, &sampler->cube_map_texture_id)); + sampler->cube_map_texture_id = 0; + } + + GL_CALL(glDeleteBuffers(1, &sampler->fullscreen_vertex_buffer)); + GL_CALL(glDeleteBuffers(1, &sampler->fullscreen_tex_coord_buffer)); + lv_opengl_shader_manager_deinit(&sampler->shader_manager); +} + +static void ibl_texture_from_image(lv_gltf_ibl_sampler_t * sampler, lv_gltf_ibl_texture_t * texture, + const lv_gltf_ibl_image_t * image) +{ + const size_t src_format_bpp = 3; + const size_t dst_format_bpp = 4; + + texture->internal_format = INTERNAL_FORMAT; + texture->format = GL_RGBA; + texture->type = TEXTURE_TARGET_TYPE; + size_t pixel_num = image->data_len / src_format_bpp; + texture->data = (uint8_t *)lv_malloc(pixel_num * 4); + LV_ASSERT_MALLOC(texture->data); + + float max_value = 0.0; + float clamped_sum = 0.0; + float diff_sum = 0.0; + size_t src = 0; + size_t dst = 0; + + for(size_t i = 0; i < pixel_num; i++) { + const float r = image->data[src + 0]; + const float g = image->data[src + 1]; + const float b = image->data[src + 2]; + const float max_component = LV_MAX(LV_MAX(r, g), b); + + if(max_component > 1.0) { + diff_sum += max_component - 1.0; + } + clamped_sum += LV_MIN(max_component, 1.0f); + max_value = LV_MAX(max_component, max_value); + + texture->data[dst + 0] = LV_MIN(r * 255, 255); + texture->data[dst + 1] = LV_MIN(g * 255, 255); + texture->data[dst + 2] = LV_MIN(b * 255, 255); + texture->data[dst + 3] = 0xFF; + + src += src_format_bpp; + dst += dst_format_bpp; + } + + float scale_factor = 1.0; + if(clamped_sum > 1.0) { + // Apply global scale factor to compensate for intensity lost when clamping + scale_factor = (clamped_sum + diff_sum) / clamped_sum; + LV_LOG_INFO("HDR Intensity Scale %f\n", scale_factor); + } + + sampler->scale_value = scale_factor; +} +static uint32_t ibl_load_texture_hdr(lv_gltf_ibl_sampler_t * sampler, const lv_gltf_ibl_image_t * image) +{ + lv_gltf_ibl_texture_t texture; + ibl_texture_from_image(sampler, &texture, image); + GLuint texture_id; + GL_CALL(glGenTextures(1, &texture_id)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, texture_id)); + GL_CALL(glTexImage2D(GL_TEXTURE_2D, // target + 0, // level + texture.internal_format, image->width, image->height, + 0, // border + texture.format, // format of the pixel data + texture.type, // type of the pixel data + texture.data)); + + lv_free(texture.data); + + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + return texture_id; +} + +static GLuint ibl_create_cube_map_texture(const lv_gltf_ibl_sampler_t * sampler, bool with_mipmaps) +{ + uint32_t targetTexture; + GL_CALL(glGenTextures(1, &targetTexture)); + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, targetTexture)); + for(int32_t i = 0; i < 6; ++i) { + GL_CALL(glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, INTERNAL_FORMAT, sampler->cube_map_resolution, + sampler->cube_map_resolution, 0, GL_RGBA, TEXTURE_TARGET_TYPE, NULL)); + } + if(with_mipmaps) { + GL_CALL(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)); + } + else { + GL_CALL(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + } + GL_CALL(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + return targetTexture; +} +static GLuint ibl_create_lut_texture(const lv_gltf_ibl_sampler_t * sampler) +{ + GLuint texture; + GL_CALL(glGenTextures(1, &texture)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, texture)); + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT, sampler->lut_resolution, sampler->lut_resolution, 0, GL_RGBA, + TEXTURE_TARGET_TYPE, NULL)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + return texture; +} +static void ibl_panorama_to_cubemap(lv_gltf_ibl_sampler_t * sampler) +{ + for(int32_t i = 0; i < 6; ++i) { + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, sampler->framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, + sampler->cube_map_texture_id, 0)); + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, sampler->cube_map_texture_id)); + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + while(status != GL_FRAMEBUFFER_COMPLETE) { + status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + LV_LOG_ERROR("Environnement render error not complete. Expected %d. Got %d", GL_FRAMEBUFFER_COMPLETE, + status); + } + GL_CALL(glViewport(0, 0, sampler->cube_map_resolution, sampler->cube_map_resolution)); + GL_CALL(glClearColor(1.0, 0.0, 0.0, 0.0)); + GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + + lv_opengl_shader_params_t frag_shader = {.name = "panorama_to_cubemap.frag"}; + lv_opengl_shader_params_t vert_shader = {.name = "fullscreen.vert"}; + lv_opengl_shader_program_t * program = lv_opengl_shader_manager_compile_program_best_version(&sampler->shader_manager, + &frag_shader, &vert_shader, + GLSL_VERSIONS, + GLSL_VERSION_COUNT); + + LV_ASSERT_MSG(program != NULL, + "Failed to link program. This probably means your platform doesn't support a required GLSL version"); + + GLuint program_id = lv_opengl_shader_program_get_id(program); + + GL_CALL(glUseProgram(program_id)); + GL_CALL(glActiveTexture(GL_TEXTURE0 + 0)); + // Bind texture ID to active texture + GL_CALL(glBindTexture(GL_TEXTURE_2D, sampler->input_texture_id)); + // map shader uniform to texture unit (TEXTURE0) + GLuint location; + GL_CALL(location = glGetUniformLocation(program_id, "u_panorama")); + GL_CALL(glUniform1i(location, 0)); + program->update_uniform_1i(program, "u_currentFace", i); + //fullscreen triangle + draw_fullscreen_quad(sampler, program_id); + } + + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, sampler->cube_map_texture_id)); + GL_CALL(glGenerateMipmap(GL_TEXTURE_CUBE_MAP)); +} +static void ibl_apply_filter(lv_gltf_ibl_sampler_t * sampler, uint32_t distribution, float roughness, + uint32_t target_mip_level, GLuint target_texture, uint32_t sample_count, float lod_bias) +{ + uint32_t current_texture_size = sampler->cube_map_resolution >> target_mip_level; + for(uint32_t i = 0; i < 6; ++i) { + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, sampler->framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, + target_texture, target_mip_level)); + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, target_texture)); + GL_CALL(glViewport(0, 0, current_texture_size, current_texture_size)); + GL_CALL(glClearColor(0.0, 1.0, 0.0, 0.0)); + GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + + lv_opengl_shader_params_t frag_shader = {.name = "ibl_filtering.frag"}; + lv_opengl_shader_params_t vert_shader = {.name = "fullscreen.vert"}; + lv_opengl_shader_program_t * program = + lv_opengl_shader_manager_compile_program_best_version(&sampler->shader_manager, &frag_shader, &vert_shader, + GLSL_VERSIONS, + GLSL_VERSION_COUNT); + LV_ASSERT_MSG(program != NULL, + "Failed to link program. This probably means your platform doesn't support a required GLSL version"); + + GLuint program_id = lv_opengl_shader_program_get_id(program); + + GL_CALL(glUseProgram(program_id)); + GL_CALL(glActiveTexture(GL_TEXTURE0)); + // Bind texture ID to active texture + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, sampler->cube_map_texture_id)); + // map shader uniform to texture unit (TEXTURE0) + uint32_t location = glGetUniformLocation(program_id, "u_cubemapTexture"); + GL_CALL(glUniform1i(location, 0)); // texture unit 0 + program->update_uniform_1f(program, "u_roughness", roughness); + program->update_uniform_1i(program, "u_sampleCount", sample_count); + /* Software rendered mode looks better with this and horrible with below */ + /*program->update_uniform_1i(program, "u_width", current_texture_size); */ + /* Standard mode looks best with this and somewhat worse with above */ + program->update_uniform_1i(program, "u_width", sampler->cube_map_resolution); + program->update_uniform_1f(program, "u_lodBias", lod_bias); + program->update_uniform_1i(program, "u_distribution", distribution); + program->update_uniform_1i(program, "u_currentFace", i); + program->update_uniform_1i(program, "u_isGeneratingLUT", 0); + program->update_uniform_1i(program, "u_floatTexture", 0); + program->update_uniform_1f(program, "u_intensityScale", sampler->scale_value); + //fullscreen triangle + draw_fullscreen_quad(sampler, program_id); + } +} +static void ibl_cube_map_to_lambertian(lv_gltf_ibl_sampler_t * sampler) +{ + ibl_apply_filter(sampler, 0, 0.0, 0, sampler->lambertian_texture_id, sampler->lambertian_sample_count, 0.0); +} +static void ibl_cube_map_to_ggx(lv_gltf_ibl_sampler_t * sampler) +{ + LV_ASSERT(sampler->mipmap_levels != 1); + for(uint32_t current_mip_level = 0; current_mip_level <= sampler->mipmap_levels; ++current_mip_level) { + float roughness = (current_mip_level) / (float)(sampler->mipmap_levels - 1); + ibl_apply_filter(sampler, 1, roughness, current_mip_level, sampler->ggx_texture_id, sampler->ggx_sample_count, + 0.0); + } +} +static void ibl_cube_map_to_sheen(lv_gltf_ibl_sampler_t * sampler) +{ + LV_ASSERT(sampler->mipmap_levels != 1); + for(uint32_t current_mip_level = 0; current_mip_level <= sampler->mipmap_levels; ++current_mip_level) { + float roughness = (current_mip_level) / (float)(sampler->mipmap_levels - 1); + ibl_apply_filter(sampler, 2, roughness, current_mip_level, sampler->sheen_texture_id, + sampler->sheen_sample_count, 0.0); + } +} +static void ibl_sample_lut(lv_gltf_ibl_sampler_t * sampler, uint32_t distribution, uint32_t targetTexture, + uint32_t currentTextureSize) +{ + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, sampler->framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTexture, 0)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, targetTexture)); + GL_CALL(glViewport(0, 0, currentTextureSize, currentTextureSize)); + GL_CALL(glClearColor(0.0, 1.0, 1.0, 0.0)); + GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + + lv_opengl_shader_params_t frag_shader = {.name = "ibl_filtering.frag"}; + lv_opengl_shader_params_t vert_shader = {.name = "fullscreen.vert"}; + lv_opengl_shader_program_t * program = + lv_opengl_shader_manager_compile_program_best_version(&sampler->shader_manager, &frag_shader, &vert_shader, + GLSL_VERSIONS, + GLSL_VERSION_COUNT); + LV_ASSERT_MSG(program != NULL, + "Failed to link program. This probably means your platform doesn't support a required GLSL version"); + + GLuint program_id = lv_opengl_shader_program_get_id(program); + + GL_CALL(glUseProgram(program_id)); + // TEXTURE0 = active. + GL_CALL(glActiveTexture(GL_TEXTURE0 + 0)); + // Bind texture ID to active texture + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, sampler->cube_map_texture_id)); + // map shader uniform to texture unit (TEXTURE0) + uint32_t location = glGetUniformLocation(program_id, "u_cubemapTexture"); + GL_CALL(glUniform1i(location, 0)); // texture unit 0 + program->update_uniform_1f(program, "u_roughness", 0.0); + program->update_uniform_1i(program, "u_sampleCount", sampler->lut_sample_count); + //shader->update_uniform_1i( shader, "u_sampleCount", 512); + program->update_uniform_1i(program, "u_width", 0.0); + program->update_uniform_1f(program, "u_lodBias", 0.0); + program->update_uniform_1i(program, "u_distribution", distribution); + program->update_uniform_1i(program, "u_currentFace", 0); + program->update_uniform_1i(program, "u_isGeneratingLUT", 1); + //fullscreen triangle + draw_fullscreen_quad(sampler, program_id); +} +static void ibl_sample_ggx_lut(lv_gltf_ibl_sampler_t * sampler) +{ + sampler->ggxlut_texture_id = ibl_create_lut_texture(sampler); + ibl_sample_lut(sampler, 1, sampler->ggxlut_texture_id, sampler->lut_resolution); +} +static void ibl_sample_charlie_lut(lv_gltf_ibl_sampler_t * sampler) +{ + sampler->charlielut_texture_id = ibl_create_lut_texture(sampler); + ibl_sample_lut(sampler, 2, sampler->charlielut_texture_id, sampler->lut_resolution); +} + +static bool ibl_gl_has_extension(const char * extension) +{ + const GLubyte * extensions = glGetString(GL_EXTENSIONS); + if(!extensions) { + return false; + } + + const char * ext_str = (const char *)extensions; + const char * current = ext_str; + const char * next; + + while(*current) { + /* Find the next space or end of string */ + next = strchr(current, ' '); + if(next) { + size_t length = next - current; + if(length == strlen(extension) && strncmp(current, extension, length) == 0) { + return true; + } + current = next + 1; + } + else { + /* Last extension (no space found) */ + if(strcmp(current, extension) == 0) { + return true; + } + break; + } + } + return false; +} + +static int ibl_count_bits(int value) +{ + int count = 0; + while(value > 1) { + value >>= 1; + count++; + } + return count; +} + +static void init_fullscreen_quad(lv_gltf_ibl_sampler_t * sampler) +{ + /* Vertices go from -1 -1 (left bottom) to 1 1 (right top)*/ + GLfloat vertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f + }; + + /* Texture coords go from 0 0 (left botton) to 1 1 (right top)*/ + GLfloat texCoords[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f + }; + + GL_CALL(glGenBuffers(1, &sampler->fullscreen_vertex_buffer)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, sampler->fullscreen_vertex_buffer)); + GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW)); + + GL_CALL(glGenBuffers(1, &sampler->fullscreen_tex_coord_buffer)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, sampler->fullscreen_tex_coord_buffer)); + GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW)); +} + +static void draw_fullscreen_quad(lv_gltf_ibl_sampler_t * sampler, GLuint program_id) +{ + GLuint positionAttrib = glGetAttribLocation(program_id, "aPosition"); + GL_CALL(glEnableVertexAttribArray(positionAttrib)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, sampler->fullscreen_vertex_buffer)); + GL_CALL(glVertexAttribPointer(positionAttrib, 2, GL_FLOAT, GL_FALSE, 0, (void *)0)); + + GLuint texCoordAttrib = glGetAttribLocation(program_id, "aTexCoord"); + GL_CALL(glEnableVertexAttribArray(texCoordAttrib)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, sampler->fullscreen_tex_coord_buffer)); + GL_CALL(glVertexAttribPointer(texCoordAttrib, 2, GL_FLOAT, GL_FALSE, 0, (void *)0)); + + GL_CALL(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); + + GL_CALL(glDisableVertexAttribArray(positionAttrib)); + GL_CALL(glDisableVertexAttribArray(texCoordAttrib)); +} + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_view/assets/chromatic.c b/inc/lvgl/src/libs/gltf/gltf_view/assets/chromatic.c new file mode 100644 index 0000000..34520f0 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_view/assets/chromatic.c @@ -0,0 +1,7545 @@ +#include "../../../../lv_conf_internal.h" + +#if LV_USE_GLTF +unsigned char chromatic_jpg[] = { + 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xff, 0xe2, 0x02, 0xd8, + 0x49, 0x43, 0x43, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x02, 0xc8, 0x6c, 0x63, 0x6d, 0x73, 0x04, 0x30, + 0x00, 0x00, 0x6d, 0x6e, 0x74, 0x72, 0x52, 0x47, 0x42, 0x20, 0x58, 0x59, + 0x5a, 0x20, 0x07, 0xe4, 0x00, 0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x12, + 0x00, 0x37, 0x61, 0x63, 0x73, 0x70, 0x4d, 0x53, 0x46, 0x54, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d, 0x6c, 0x63, + 0x6d, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0b, 0x77, 0x74, 0x70, 0x74, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, + 0x00, 0x14, 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x01, 0x1c, 0x00, 0x00, + 0x00, 0x6a, 0x72, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x01, 0x88, 0x00, 0x00, + 0x00, 0x14, 0x67, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x01, 0x9c, 0x00, 0x00, + 0x00, 0x14, 0x62, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x01, 0xb0, 0x00, 0x00, + 0x00, 0x14, 0x72, 0x54, 0x52, 0x43, 0x00, 0x00, 0x01, 0xc4, 0x00, 0x00, + 0x00, 0x20, 0x67, 0x54, 0x52, 0x43, 0x00, 0x00, 0x01, 0xe4, 0x00, 0x00, + 0x00, 0x20, 0x62, 0x54, 0x52, 0x43, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00, + 0x00, 0x20, 0x64, 0x6d, 0x6e, 0x64, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, + 0x00, 0x24, 0x64, 0x6d, 0x64, 0x64, 0x00, 0x00, 0x02, 0x48, 0x00, 0x00, + 0x00, 0x46, 0x63, 0x70, 0x72, 0x74, 0x00, 0x00, 0x02, 0x90, 0x00, 0x00, + 0x00, 0x36, 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d, 0x6d, 0x6c, + 0x75, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x0c, 0x65, 0x6e, 0x55, 0x53, 0x00, 0x00, 0x00, 0x4e, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x73, 0x00, 0x52, 0x00, 0x47, 0x00, 0x42, 0x00, 0x20, + 0x00, 0x54, 0x00, 0x52, 0x00, 0x43, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, + 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x47, 0x00, 0x49, 0x00, 0x4d, + 0x00, 0x50, 0x00, 0x20, 0x00, 0x62, 0x00, 0x75, 0x00, 0x69, 0x00, 0x6c, + 0x00, 0x74, 0x00, 0x2d, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x4c, + 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x20, + 0x00, 0x73, 0x00, 0x52, 0x00, 0x47, 0x00, 0x42, 0x00, 0x00, 0x58, 0x59, + 0x5a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xa0, 0x00, 0x00, + 0x38, 0xf5, 0x00, 0x00, 0x03, 0x90, 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x62, 0x97, 0x00, 0x00, 0xb7, 0x87, 0x00, 0x00, + 0x18, 0xd9, 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x9f, 0x00, 0x00, 0x0f, 0x84, 0x00, 0x00, 0xb6, 0xc4, 0x70, 0x61, + 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x66, 0x66, 0x00, 0x00, 0xf2, 0xa7, 0x00, 0x00, 0x0d, 0x59, 0x00, 0x00, + 0x13, 0xd0, 0x00, 0x00, 0x0a, 0x5b, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x66, 0x66, 0x00, 0x00, + 0xf2, 0xa7, 0x00, 0x00, 0x0d, 0x59, 0x00, 0x00, 0x13, 0xd0, 0x00, 0x00, + 0x0a, 0x5b, 0x70, 0x61, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x66, 0x66, 0x00, 0x00, 0xf2, 0xa7, 0x00, 0x00, + 0x0d, 0x59, 0x00, 0x00, 0x13, 0xd0, 0x00, 0x00, 0x0a, 0x5b, 0x6d, 0x6c, + 0x75, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x0c, 0x65, 0x6e, 0x55, 0x53, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x47, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x50, 0x6d, 0x6c, + 0x75, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x0c, 0x65, 0x6e, 0x55, 0x53, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x47, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x50, 0x00, 0x20, + 0x00, 0x66, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x4c, + 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x61, 0x00, 0x72, 0x00, 0x20, + 0x00, 0x73, 0x00, 0x52, 0x00, 0x47, 0x00, 0x42, 0x00, 0x00, 0x6d, 0x6c, + 0x75, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x0c, 0x65, 0x6e, 0x55, 0x53, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x50, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, + 0x00, 0x63, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x61, + 0x00, 0x69, 0x00, 0x6e, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, 0x00, 0x03, + 0x02, 0x02, 0x03, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, + 0x04, 0x05, 0x08, 0x05, 0x05, 0x04, 0x04, 0x05, 0x0a, 0x07, 0x07, 0x06, + 0x08, 0x0c, 0x0a, 0x0c, 0x0c, 0x0b, 0x0a, 0x0b, 0x0b, 0x0d, 0x0e, 0x12, + 0x10, 0x0d, 0x0e, 0x11, 0x0e, 0x0b, 0x0b, 0x10, 0x16, 0x10, 0x11, 0x13, + 0x14, 0x15, 0x15, 0x15, 0x0c, 0x0f, 0x17, 0x18, 0x16, 0x14, 0x18, 0x12, + 0x14, 0x15, 0x14, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x03, 0x04, 0x04, 0x05, + 0x04, 0x05, 0x09, 0x05, 0x05, 0x09, 0x14, 0x0d, 0x0b, 0x0d, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0xff, 0xc2, 0x00, 0x11, 0x08, 0x02, 0x00, 0x04, 0x00, 0x03, 0x01, 0x11, + 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xc4, 0x00, 0x1c, 0x00, + 0x00, 0x02, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0xff, 0xc4, 0x00, 0x1a, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x06, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, + 0x02, 0x10, 0x03, 0x10, 0x00, 0x00, 0x01, 0xf9, 0x8e, 0x7c, 0xed, 0x0a, + 0x40, 0x82, 0x80, 0x82, 0x80, 0x00, 0x00, 0x02, 0x40, 0x15, 0x88, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x10, 0x14, 0x3a, 0x40, + 0x3a, 0x50, 0x05, 0x00, 0x82, 0x80, 0x85, 0x01, 0x08, 0x6a, 0x81, 0x15, + 0x28, 0x53, 0x5a, 0xbc, 0xdd, 0xef, 0xf2, 0xec, 0x2c, 0xe1, 0xd2, 0xfe, + 0x3b, 0xb3, 0x1a, 0xb3, 0x9e, 0xe7, 0x9b, 0x2c, 0x69, 0xe4, 0xd6, 0x4a, + 0xf2, 0x74, 0xf3, 0x58, 0x29, 0x0e, 0x1c, 0xa5, 0x38, 0x25, 0x11, 0x85, + 0x39, 0x41, 0xc1, 0x04, 0xa5, 0x3b, 0x0a, 0x70, 0x50, 0x14, 0x40, 0x3a, + 0x59, 0x01, 0x45, 0x02, 0x80, 0x48, 0x41, 0x4a, 0x81, 0x6a, 0x14, 0xac, + 0x34, 0x8c, 0x46, 0xe5, 0x6a, 0x57, 0xb9, 0x5f, 0x5c, 0xe7, 0xed, 0xcf, + 0x0f, 0xbf, 0xcd, 0x97, 0xdb, 0xc2, 0x1a, 0x17, 0x28, 0x00, 0x00, 0x01, + 0x00, 0x82, 0x88, 0x00, 0x00, 0x10, 0x50, 0x00, 0x00, 0x48, 0x28, 0x00, + 0x82, 0x80, 0x31, 0x00, 0x20, 0x14, 0x08, 0x62, 0x42, 0x80, 0x00, 0x04, + 0x29, 0x41, 0x40, 0x00, 0x20, 0xa8, 0x04, 0x45, 0x63, 0x15, 0x94, 0xcd, + 0x5f, 0xe3, 0xf4, 0xfb, 0x2f, 0xcc, 0x7d, 0x49, 0x71, 0xae, 0x88, 0x21, + 0xaa, 0x87, 0xa3, 0x83, 0x42, 0x09, 0x5e, 0xa1, 0x2b, 0xa2, 0xc2, 0x1c, + 0xa0, 0xed, 0x70, 0x40, 0x11, 0x20, 0x86, 0xae, 0x9c, 0x4b, 0x71, 0xe6, + 0x99, 0xa1, 0x2a, 0x74, 0x0e, 0x00, 0x00, 0xb1, 0x2b, 0x10, 0xa0, 0x82, + 0x94, 0x3a, 0x40, 0x02, 0x0a, 0x79, 0x01, 0x61, 0x6a, 0x90, 0x53, 0x64, + 0x44, 0xe2, 0xfd, 0xdf, 0x17, 0x0f, 0xd1, 0xef, 0xe5, 0x7d, 0xbf, 0x87, + 0x2d, 0x65, 0x82, 0x00, 0x00, 0x30, 0x1a, 0x10, 0x0e, 0x25, 0x23, 0x1c, + 0x92, 0x92, 0x52, 0x4b, 0x32, 0x52, 0x31, 0x80, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x0b, 0x44, 0x00, 0x00, 0x07, 0x42, 0x12, 0x81, 0x40, 0xc0, + 0x02, 0x0a, 0x00, 0x42, 0x80, 0x8c, 0xb5, 0x99, 0xe6, 0xa5, 0xe5, 0xf4, + 0x7b, 0xdf, 0xcb, 0xfd, 0x5b, 0xa5, 0x79, 0xa4, 0x10, 0x04, 0x01, 0x69, + 0x11, 0x08, 0x42, 0xb0, 0xa2, 0x81, 0x58, 0xf5, 0x44, 0x28, 0x18, 0x0a, + 0x09, 0x4c, 0x98, 0xb2, 0x94, 0xaf, 0x47, 0x4e, 0x59, 0x0e, 0x0a, 0x20, + 0xc9, 0x2b, 0x1d, 0x85, 0x2c, 0x96, 0x44, 0xa6, 0xc8, 0x08, 0x5d, 0x57, + 0x7a, 0x43, 0x7a, 0xad, 0xb5, 0xad, 0x45, 0xa8, 0x6a, 0xc2, 0x6a, 0x3b, + 0xd4, 0x65, 0x8c, 0xab, 0x55, 0x42, 0x53, 0x45, 0x25, 0x67, 0x03, 0xf4, + 0xbf, 0x07, 0x2f, 0xd4, 0xf9, 0x4d, 0x1d, 0x10, 0x00, 0x00, 0x21, 0x4c, + 0x40, 0xad, 0x05, 0x01, 0x00, 0x02, 0x59, 0x93, 0xcc, 0xb7, 0x19, 0xb7, + 0x39, 0x68, 0x00, 0x00, 0x0c, 0x00, 0x02, 0x88, 0x60, 0x01, 0x40, 0x0c, + 0x00, 0x21, 0xd1, 0x0e, 0x9a, 0x88, 0x02, 0x88, 0xd6, 0x49, 0x33, 0x6a, + 0xef, 0xb7, 0x71, 0xb2, 0x6b, 0xbb, 0xf3, 0xfd, 0x9d, 0x8e, 0x1d, 0x2d, + 0xb2, 0xca, 0xb4, 0x74, 0xa5, 0x8c, 0x43, 0x36, 0xbc, 0x5a, 0xb1, 0x68, + 0xe7, 0xaa, 0x39, 0xeb, 0x37, 0x3d, 0x65, 0xe5, 0xaa, 0x31, 0xaa, 0x8a, + 0xc8, 0x10, 0xa8, 0xd9, 0x1b, 0x63, 0x08, 0x50, 0xb2, 0x50, 0x66, 0x99, + 0x10, 0xd5, 0x8c, 0x90, 0xf4, 0x61, 0x9a, 0x41, 0x29, 0x98, 0x5a, 0xa0, + 0xc9, 0xd4, 0x57, 0x3f, 0x4e, 0xb9, 0xba, 0x77, 0xcf, 0xae, 0xd4, 0xba, + 0x45, 0xa5, 0x83, 0xd1, 0x40, 0x2d, 0x14, 0x24, 0x50, 0x50, 0x10, 0xe8, + 0xa7, 0x4a, 0x0b, 0x28, 0xf4, 0xf1, 0xf3, 0xbf, 0xaf, 0xfc, 0xa4, 0xb5, + 0x80, 0x28, 0x80, 0x04, 0x31, 0x05, 0x84, 0x14, 0x00, 0x86, 0x20, 0x00, + 0x10, 0x54, 0xa4, 0xbb, 0x18, 0xd3, 0xcf, 0x0d, 0x18, 0x02, 0x03, 0x01, + 0x80, 0xd4, 0x00, 0x01, 0x80, 0x2b, 0x1c, 0x03, 0x1a, 0xb1, 0x96, 0x1d, + 0x5b, 0x7d, 0x32, 0xf7, 0xda, 0xee, 0xdb, 0xd9, 0x5e, 0x92, 0xe9, 0x56, + 0x00, 0x20, 0x82, 0x90, 0x4a, 0x91, 0x08, 0x42, 0x22, 0xb1, 0x44, 0xb1, + 0x84, 0x53, 0x9b, 0x97, 0x86, 0xf1, 0xf1, 0xde, 0x0e, 0x1d, 0x39, 0xbe, + 0x6e, 0x9c, 0xbf, 0x37, 0x5c, 0x5c, 0xf5, 0x4c, 0xb4, 0xe5, 0x08, 0x84, + 0x47, 0x24, 0x2c, 0xd3, 0x23, 0x35, 0xd4, 0x89, 0x0c, 0x70, 0x29, 0x00, + 0x42, 0xcd, 0x51, 0x1d, 0x6b, 0x0f, 0x7f, 0x56, 0x1d, 0x7a, 0xab, 0xc6, + 0x85, 0x54, 0x40, 0x20, 0x10, 0x0a, 0x0d, 0x43, 0x45, 0x93, 0xcd, 0x95, + 0x85, 0x2a, 0x00, 0x06, 0x8e, 0xde, 0x1f, 0xea, 0x3f, 0x3b, 0x8b, 0xe9, + 0x7c, 0xc0, 0x11, 0x00, 0x28, 0x80, 0x50, 0x02, 0x00, 0x40, 0x54, 0x00, + 0x58, 0x80, 0x60, 0x85, 0x59, 0x26, 0xfe, 0x3c, 0xad, 0x99, 0x9b, 0x56, + 0x4d, 0x4d, 0x5c, 0x3b, 0x1a, 0x21, 0x59, 0x14, 0x88, 0x80, 0x42, 0x00, + 0x1c, 0xa1, 0x25, 0xe8, 0x35, 0xea, 0xdb, 0xf5, 0xab, 0xeb, 0x9b, 0xec, + 0x2c, 0xea, 0x52, 0x48, 0x90, 0xd5, 0xa0, 0xac, 0x42, 0x44, 0x02, 0x55, + 0x08, 0x89, 0x1a, 0x51, 0x1a, 0x51, 0x18, 0x8d, 0xb1, 0x22, 0x42, 0x22, + 0x46, 0x20, 0xb1, 0x8a, 0xe5, 0xe7, 0xf9, 0xba, 0x71, 0x7c, 0x5d, 0xb8, + 0x3e, 0x0f, 0x46, 0x1e, 0x5b, 0xa2, 0x2b, 0x8a, 0xb2, 0x8c, 0x2c, 0xd5, + 0x91, 0x2c, 0xcb, 0x74, 0x78, 0x02, 0x95, 0x64, 0xb2, 0x8c, 0xab, 0x2c, + 0xfe, 0x8e, 0xfc, 0xbe, 0xbe, 0xfa, 0xf3, 0xb0, 0x50, 0x80, 0x04, 0x00, + 0x10, 0x05, 0x85, 0x03, 0x51, 0x0a, 0x11, 0x00, 0xe8, 0x8b, 0x36, 0x75, + 0xca, 0xfb, 0xbf, 0x1b, 0x97, 0xf6, 0xfe, 0x20, 0x88, 0x04, 0x02, 0x01, + 0x00, 0x90, 0xa0, 0x11, 0x50, 0x24, 0x74, 0xc6, 0x4c, 0xdd, 0x2f, 0x73, + 0x37, 0xb5, 0x9b, 0xd6, 0xcd, 0xeb, 0xe3, 0x5d, 0x1c, 0xdd, 0x35, 0x69, + 0x61, 0x2b, 0x12, 0xc4, 0x44, 0x48, 0x15, 0x99, 0xcc, 0xb2, 0x62, 0xb3, + 0x0a, 0x74, 0xb7, 0xcb, 0x2b, 0x36, 0x2f, 0x75, 0xaf, 0x4b, 0x37, 0xdc, + 0x5b, 0x49, 0x96, 0x12, 0x26, 0x48, 0x99, 0x22, 0x50, 0xc1, 0x5a, 0x21, + 0x01, 0x11, 0x11, 0x22, 0x44, 0x89, 0x05, 0x8a, 0x42, 0x58, 0x11, 0x20, + 0x41, 0x62, 0x42, 0x48, 0x2c, 0x25, 0x89, 0x02, 0x31, 0x02, 0x9c, 0xde, + 0x0f, 0x83, 0xd1, 0xe6, 0x7e, 0x57, 0xaf, 0x0f, 0x9f, 0x74, 0xc4, 0x22, + 0x04, 0x30, 0x8e, 0x6c, 0xe2, 0x7a, 0x10, 0xaa, 0x02, 0x8c, 0xb0, 0x73, + 0x57, 0xd3, 0xd5, 0xce, 0xe9, 0xef, 0x4a, 0x4a, 0x64, 0x50, 0x01, 0x0e, + 0x80, 0xa1, 0x0a, 0x20, 0xa2, 0x8d, 0x1e, 0xa1, 0x60, 0x10, 0x43, 0x1a, + 0xdf, 0xed, 0xe2, 0x8e, 0x6f, 0xd3, 0xf9, 0x9c, 0x8f, 0xaf, 0xf0, 0xd2, + 0x2a, 0x42, 0x10, 0x84, 0x02, 0xa4, 0x24, 0x29, 0x05, 0x8c, 0x91, 0xd0, + 0x97, 0xd6, 0xe2, 0xfa, 0x2c, 0xdf, 0x51, 0x8d, 0x74, 0xc9, 0x00, 0xd4, + 0x46, 0xa2, 0x32, 0x54, 0xc9, 0x8c, 0x95, 0x48, 0x9a, 0x4a, 0x26, 0x4e, + 0xd9, 0xc4, 0xea, 0xc8, 0xb1, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0xa9, 0xc5, + 0x89, 0x35, 0xb2, 0x27, 0x53, 0x89, 0x12, 0x24, 0x8e, 0x50, 0x48, 0x95, + 0x11, 0x11, 0x14, 0x85, 0x41, 0x60, 0x40, 0x81, 0x02, 0xb2, 0x12, 0xd6, + 0x56, 0x40, 0xac, 0x8a, 0xc0, 0x84, 0x41, 0x60, 0x42, 0x22, 0x40, 0xcb, + 0xcf, 0x5c, 0x6f, 0x9f, 0xe8, 0xaf, 0x35, 0xea, 0x4b, 0x59, 0x95, 0x1a, + 0x8f, 0x40, 0x8d, 0x53, 0x19, 0x39, 0x6b, 0xe2, 0xde, 0xb9, 0xe7, 0xfa, + 0xf3, 0xa3, 0x2d, 0x5e, 0x5f, 0x6f, 0xa7, 0xf8, 0x3f, 0x72, 0xfe, 0x5b, + 0x96, 0x6c, 0x95, 0xe6, 0xb4, 0x21, 0xda, 0xe8, 0x1e, 0xe3, 0xa3, 0x51, + 0xee, 0x3a, 0x34, 0x76, 0x3d, 0x49, 0x58, 0x05, 0x34, 0x74, 0x27, 0xec, + 0x4f, 0xd2, 0x7e, 0x61, 0x45, 0x36, 0x73, 0xba, 0x63, 0x31, 0x85, 0x38, + 0xd5, 0xc6, 0xb3, 0xcd, 0x6a, 0x79, 0x5d, 0x4f, 0x1c, 0x73, 0xf3, 0x22, + 0x91, 0xa8, 0xd8, 0x0d, 0x2d, 0x5f, 0x63, 0xce, 0xfb, 0xae, 0x7d, 0x3d, + 0x24, 0xb2, 0x82, 0x84, 0x60, 0x31, 0x8d, 0x5a, 0x0b, 0x22, 0x55, 0x22, + 0x43, 0xb2, 0x44, 0xc9, 0xc4, 0xea, 0xc2, 0x72, 0x59, 0x56, 0xcb, 0x61, + 0x6a, 0x5b, 0x56, 0x25, 0xa5, 0x85, 0xb1, 0x61, 0x6c, 0x59, 0x6d, 0x91, + 0x61, 0x32, 0x65, 0x91, 0x64, 0x4c, 0x48, 0xa5, 0x55, 0x12, 0x04, 0x48, + 0x24, 0x0a, 0xd6, 0xaa, 0xae, 0x48, 0x5b, 0x52, 0x57, 0x6d, 0x71, 0x51, + 0x59, 0x55, 0xb5, 0xc5, 0x64, 0x08, 0x4b, 0x12, 0xb2, 0x05, 0x64, 0x0a, + 0xe5, 0x84, 0x41, 0x63, 0x11, 0x48, 0xda, 0x51, 0x45, 0x02, 0x11, 0xf0, + 0xae, 0x7b, 0xcd, 0xe9, 0xe3, 0xed, 0xf1, 0xaf, 0x49, 0x8d, 0xcf, 0xcb, + 0xeb, 0xe4, 0xf9, 0x3d, 0x5c, 0x6f, 0x1f, 0xb3, 0x87, 0xe4, 0xf5, 0xe7, + 0xe3, 0xa2, 0x1c, 0xae, 0x9d, 0x14, 0xf7, 0x25, 0xb8, 0xf7, 0x99, 0x75, + 0xcd, 0xbd, 0x67, 0x7b, 0xd5, 0xc3, 0xd4, 0xf7, 0xf3, 0xfa, 0xbd, 0xf9, + 0xfb, 0xbd, 0x79, 0x75, 0x6f, 0x3b, 0xb7, 0x2c, 0xb9, 0xda, 0xcd, 0xfa, + 0xcf, 0x5b, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x2b, 0xd6, 0x78, 0xfe, 0x8c, + 0x78, 0x7e, 0x97, 0xc4, 0x49, 0xe1, 0x93, 0xc5, 0x59, 0x85, 0x9f, 0x71, + 0xcb, 0x7f, 0x46, 0xe5, 0xd3, 0xa2, 0x28, 0x40, 0x02, 0xa0, 0x63, 0x04, + 0x63, 0x56, 0x48, 0x91, 0x2a, 0x92, 0x4d, 0x67, 0x64, 0xcb, 0x22, 0xca, + 0xb0, 0xb4, 0xb4, 0xb5, 0x2d, 0x2c, 0x2d, 0x2e, 0x8b, 0x52, 0xe2, 0xe8, + 0xb5, 0x6e, 0x4b, 0x65, 0xb5, 0x2d, 0x5b, 0x22, 0x71, 0x25, 0x72, 0xb5, + 0x04, 0x80, 0x52, 0x48, 0xa4, 0x12, 0xb5, 0xaa, 0xaa, 0x2b, 0x2a, 0x2a, + 0x8a, 0xaa, 0xa2, 0xab, 0x69, 0x4a, 0x8a, 0x96, 0x9b, 0x2a, 0x58, 0x44, + 0x16, 0x11, 0x02, 0xa2, 0x16, 0xd7, 0x24, 0x25, 0xac, 0x81, 0x12, 0x22, + 0x55, 0x62, 0x50, 0x04, 0x7c, 0xbf, 0x9e, 0xfd, 0x57, 0xa7, 0x9f, 0xa7, + 0xe5, 0x58, 0xd6, 0x45, 0xb6, 0x5a, 0x72, 0xbc, 0xde, 0xcf, 0x2b, 0xf3, + 0xbe, 0x8f, 0x8f, 0xf9, 0xdf, 0x47, 0x37, 0x3d, 0x14, 0xfa, 0x66, 0x7d, + 0xb1, 0xea, 0x7d, 0xfe, 0x6f, 0xa0, 0x7a, 0x7c, 0x5e, 0xc3, 0xbf, 0x9f, + 0xd8, 0xf4, 0xf2, 0xf4, 0xb3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x9c, 0xcf, 0x4f, 0x3f, 0x3f, 0xb7, 0x27, 0x2e, 0x6e, + 0x6f, 0x08, 0xd7, 0x8b, 0x9a, 0x5a, 0xa1, 0x08, 0x4a, 0x02, 0x00, 0x3a, + 0x21, 0xd3, 0x89, 0x53, 0x26, 0x4a, 0xa4, 0x58, 0x93, 0x2c, 0xab, 0x4b, + 0x0b, 0x8b, 0x92, 0xd2, 0xd2, 0xd2, 0xf2, 0xe2, 0xe8, 0xb8, 0xbe, 0x2e, + 0x4b, 0xe5, 0xb8, 0xbc, 0xb6, 0x27, 0x34, 0xe5, 0x14, 0x00, 0x00, 0x00, + 0x00, 0x44, 0x89, 0x2b, 0xb2, 0xb2, 0xa2, 0xa2, 0xaa, 0xa6, 0x2a, 0xaa, + 0x4c, 0xeb, 0x41, 0x55, 0x53, 0x54, 0xc5, 0x55, 0x5c, 0x56, 0xb0, 0x20, + 0x56, 0x54, 0xb5, 0xc4, 0x0a, 0xe2, 0x35, 0x08, 0x56, 0xc5, 0x12, 0xa0, + 0x11, 0xf2, 0x19, 0xaf, 0xab, 0xeb, 0x1a, 0xa6, 0x98, 0xcb, 0x4b, 0xac, + 0xd1, 0x66, 0x9d, 0x35, 0xd5, 0xed, 0x79, 0x1f, 0x9d, 0xf5, 0x3c, 0x8f, + 0x9f, 0xd7, 0xf4, 0x4f, 0x67, 0x87, 0xe8, 0xfe, 0x8f, 0x17, 0x6b, 0x3c, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x27, 0x13, 0xd7, 0xcb, 0xcd, 0xaf, 0x2f, 0x37, 0x06, 0x59, 0x25, 0xcb, + 0x9b, 0x44, 0x40, 0x42, 0x05, 0x00, 0x11, 0x85, 0x38, 0x75, 0x22, 0x44, + 0xc9, 0x54, 0xcb, 0x12, 0xc2, 0xda, 0xb4, 0xb8, 0xb9, 0x2d, 0x2e, 0x2e, + 0x2e, 0x8b, 0xd7, 0x41, 0x7c, 0x9a, 0x0b, 0xe2, 0xf8, 0xbd, 0x2e, 0x5b, + 0x65, 0x94, 0xd0, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x24, 0x8d, + 0xcc, 0x22, 0xa2, 0x9a, 0xa4, 0xa4, 0xcf, 0x6e, 0x72, 0x82, 0x82, 0x9a, + 0xa8, 0xa2, 0xaa, 0x29, 0x96, 0xb4, 0x8a, 0xc2, 0x5a, 0xac, 0xaa, 0x5a, + 0xc8, 0x10, 0x20, 0x44, 0x8a, 0xc4, 0x42, 0x03, 0xe4, 0xd6, 0xfd, 0x6a, + 0x49, 0x82, 0xcd, 0x2e, 0xab, 0xeb, 0x45, 0x9a, 0xab, 0x7e, 0xa7, 0x77, + 0x6f, 0x47, 0xcb, 0x3a, 0xf8, 0xec, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xfd, 0x39, 0x79, 0x5f, + 0x4c, 0xe0, 0x62, 0xf3, 0x71, 0x71, 0x4b, 0x92, 0x5c, 0xf9, 0xb5, 0xc2, + 0xa5, 0x00, 0x0c, 0x04, 0x3b, 0x18, 0xc9, 0x2c, 0xd2, 0x75, 0x2a, 0xb1, + 0x2c, 0x5b, 0x6a, 0xe2, 0xe2, 0xe4, 0xb8, 0xb8, 0xb8, 0xbd, 0x2e, 0x97, + 0x44, 0x69, 0x34, 0xc6, 0x94, 0xd0, 0x5d, 0x17, 0x16, 0xc4, 0xa6, 0xc5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xca, 0xb1, 0x49, 0x0a, 0xac, + 0x81, 0x49, 0x9e, 0xdc, 0xf1, 0x49, 0x45, 0x50, 0x50, 0x51, 0x54, 0x94, + 0x94, 0x15, 0x15, 0xac, 0x22, 0x0b, 0x51, 0x59, 0x59, 0x59, 0x02, 0x04, + 0x48, 0xaa, 0x10, 0xa3, 0xe6, 0x3b, 0xbf, 0x52, 0xc9, 0x8c, 0xb2, 0xcb, + 0x8d, 0x15, 0xa6, 0xcd, 0x95, 0xd8, 0xe9, 0x3d, 0x2e, 0xb3, 0xd4, 0xf3, + 0xae, 0xc5, 0x73, 0x42, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x0a, 0xe6, 0x9d, 0xe3, 0x83, 0xea, 0x9e, 0x4f, + 0x9e, 0xb9, 0x58, 0xb8, 0x65, 0xc9, 0x2e, 0x78, 0xab, 0x35, 0x08, 0x00, + 0x60, 0x00, 0x3a, 0x91, 0x22, 0x45, 0x96, 0x4e, 0xac, 0x2d, 0x2d, 0x2e, + 0x4b, 0xcb, 0xaa, 0xe2, 0xf2, 0xf2, 0xf8, 0xd0, 0x68, 0x8d, 0x06, 0x94, + 0xd5, 0x1a, 0x0b, 0x89, 0xc9, 0x35, 0x70, 0xd5, 0xcd, 0x30, 0x05, 0x12, + 0x36, 0x08, 0x86, 0x4a, 0x68, 0x23, 0x73, 0x1b, 0x20, 0x8a, 0x55, 0x4a, + 0x20, 0x42, 0xa8, 0x29, 0x2a, 0x5a, 0x4a, 0x4a, 0x22, 0x9a, 0xa2, 0x5c, + 0xf6, 0x50, 0xb4, 0x94, 0xa5, 0x2b, 0x5d, 0x28, 0xa8, 0xa9, 0x6a, 0x2b, + 0x2b, 0x20, 0x45, 0x62, 0x44, 0x44, 0x72, 0xf9, 0xf7, 0x5b, 0xf4, 0x7c, + 0x02, 0x45, 0xb6, 0x5c, 0x68, 0xb3, 0x55, 0x74, 0xb7, 0x3d, 0x1f, 0x4c, + 0xf7, 0x13, 0x57, 0x15, 0xfc, 0xeb, 0x51, 0x1c, 0xae, 0x56, 0xa0, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0xb9, 0x8d, 0xc4, 0x68, + 0x48, 0xe9, 0x9b, 0xac, 0xe5, 0x74, 0x79, 0x5e, 0x7b, 0xe2, 0xe6, 0xe1, + 0xcd, 0xc9, 0x2e, 0x7c, 0xda, 0x61, 0x08, 0x04, 0x30, 0x56, 0x08, 0xc6, + 0x4a, 0xa6, 0x58, 0x59, 0x56, 0x59, 0x69, 0x7d, 0x5e, 0x5c, 0x97, 0x97, + 0x97, 0xc6, 0x83, 0x41, 0xa2, 0x5d, 0x09, 0xa0, 0xd0, 0x5f, 0x25, 0xd5, + 0x71, 0x64, 0x92, 0xb4, 0x48, 0x84, 0x03, 0xb4, 0x84, 0x99, 0x96, 0x02, + 0x24, 0x5d, 0x9a, 0x54, 0x6c, 0x07, 0x0e, 0x90, 0x11, 0x4a, 0x65, 0xac, + 0xae, 0xda, 0xa2, 0xa2, 0x92, 0xa8, 0xa6, 0xda, 0x22, 0x82, 0x92, 0x8a, + 0xa4, 0xa0, 0xa4, 0xa8, 0x52, 0xd2, 0x52, 0x56, 0x57, 0x50, 0x20, 0xb1, + 0x22, 0x06, 0x7c, 0x5f, 0x27, 0xd9, 0xed, 0xf0, 0x09, 0x96, 0x59, 0x79, + 0xa2, 0xcd, 0x9a, 0x76, 0x37, 0x3d, 0x2f, 0x4c, 0x74, 0x92, 0xfc, 0x54, + 0x32, 0x71, 0x2c, 0xa7, 0x17, 0x73, 0x4f, 0x3b, 0x6d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x26, 0x6b, 0xdf, 0x2c, 0xfd, 0x25, 0x5b, 0x57, + 0xa5, 0x7a, 0x53, 0x5c, 0xf3, 0xcd, 0xf3, 0xdf, 0x13, 0x1a, 0xc1, 0x96, + 0x49, 0x68, 0x8a, 0xa5, 0x84, 0x20, 0x10, 0x29, 0x0e, 0x9c, 0x3b, 0x24, + 0x48, 0xb0, 0x9d, 0x59, 0x56, 0xa5, 0xd5, 0x79, 0xa2, 0xae, 0x4d, 0x06, + 0x83, 0x44, 0x68, 0x34, 0x46, 0x85, 0xbd, 0x2e, 0x2e, 0x2e, 0x4b, 0x2a, + 0x43, 0x24, 0x22, 0x23, 0x04, 0x8c, 0xb5, 0x04, 0x50, 0xb9, 0xa5, 0x66, + 0xa4, 0xd1, 0x57, 0xd3, 0x47, 0x50, 0x10, 0xc2, 0x33, 0x91, 0x84, 0x41, + 0x6b, 0x2a, 0x8a, 0x8a, 0xa2, 0x9b, 0x6a, 0x8a, 0x56, 0x82, 0x83, 0x39, + 0x41, 0x49, 0x49, 0x02, 0xb5, 0xa4, 0xac, 0xad, 0x2b, 0x58, 0x10, 0xa8, + 0x8d, 0x79, 0xf8, 0xbc, 0x9e, 0xb3, 0xd3, 0xe4, 0x44, 0xaa, 0xc2, 0xeb, + 0x35, 0x59, 0xbf, 0x4e, 0xf7, 0x4c, 0xf7, 0x37, 0x9d, 0x56, 0x29, 0x6d, + 0xb2, 0xd5, 0x69, 0x64, 0x5f, 0x86, 0x9e, 0x4d, 0x1c, 0xf6, 0xe6, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x79, 0xe6, 0xeb, 0xcf, 0x1f, + 0x66, 0x5d, 0xb3, 0x15, 0x15, 0x99, 0xe5, 0xe1, 0x63, 0x5c, 0x1c, 0x5c, + 0x39, 0xb9, 0x33, 0x68, 0x8a, 0x96, 0xb8, 0x8c, 0x25, 0x10, 0x50, 0x64, + 0x86, 0x48, 0xb0, 0x99, 0x6d, 0x5b, 0x56, 0x97, 0x55, 0xf1, 0x76, 0xa6, + 0xb2, 0xf4, 0xbc, 0xd3, 0x1a, 0x0d, 0x05, 0xe5, 0xa9, 0x75, 0x58, 0x8c, + 0x44, 0x49, 0xad, 0xa6, 0xb1, 0xa4, 0x29, 0x45, 0x6b, 0x54, 0xb9, 0xb3, + 0x73, 0x15, 0x43, 0xb7, 0x53, 0x3a, 0xeb, 0x4a, 0x5b, 0x65, 0x8b, 0x3b, + 0x26, 0x48, 0xca, 0x65, 0x20, 0x54, 0x12, 0xd7, 0x10, 0x2a, 0x96, 0xa2, + 0xa2, 0x98, 0xa6, 0x5a, 0x0a, 0x17, 0x2c, 0xb9, 0x0c, 0x72, 0xe6, 0x33, + 0xd9, 0x1c, 0xd7, 0x6c, 0x08, 0x59, 0x14, 0x2a, 0x16, 0x40, 0x9a, 0xf1, + 0xb3, 0x5f, 0x59, 0xd8, 0xc9, 0x92, 0x2c, 0x2d, 0x4d, 0x3a, 0x9d, 0x3d, + 0xce, 0xee, 0xe7, 0x4b, 0x59, 0xb6, 0xad, 0x4b, 0xd6, 0x65, 0xb6, 0x69, + 0x35, 0x61, 0xaf, 0x8d, 0xd1, 0xcb, 0x6d, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x85, 0xe7, 0x97, 0xb7, 0x3c, 0x5d, 0x98, 0xf4, 0xc7, 0x2e, + 0x58, 0xa4, 0xac, 0xa8, 0xe6, 0x66, 0xf0, 0x71, 0xae, 0x7e, 0x6e, 0x4c, + 0xda, 0x65, 0xaa, 0x2b, 0x22, 0x29, 0x50, 0x08, 0x22, 0x0b, 0xce, 0x2c, + 0xe7, 0xbd, 0x55, 0x32, 0x75, 0x32, 0xd2, 0x64, 0x96, 0xcb, 0x37, 0x59, + 0xa4, 0xd6, 0x6b, 0x37, 0x46, 0xab, 0x3a, 0x56, 0x6d, 0xde, 0x15, 0x90, + 0x24, 0x4a, 0xad, 0x2f, 0x34, 0xa6, 0xba, 0xd9, 0x99, 0x12, 0xbd, 0x2a, + 0x96, 0x99, 0x72, 0xe6, 0xe0, 0x97, 0x24, 0xbc, 0xf9, 0x6f, 0x8e, 0xd6, + 0xb3, 0xbb, 0x52, 0xea, 0xb6, 0xcb, 0xac, 0x91, 0x55, 0x62, 0x88, 0x08, + 0x52, 0xe7, 0x28, 0x28, 0x85, 0x2e, 0x6c, 0x6f, 0x99, 0xc7, 0xb6, 0x2c, + 0xef, 0x06, 0xb9, 0xe7, 0xde, 0x39, 0xf2, 0xd4, 0x09, 0x0a, 0x85, 0x8c, + 0xca, 0x52, 0x46, 0x5a, 0x8a, 0x65, 0xcf, 0x2d, 0x2b, 0xc5, 0xb9, 0xdf, + 0xb8, 0xf1, 0xbe, 0xd7, 0x5c, 0xf4, 0x58, 0x91, 0x2b, 0x2c, 0x2d, 0x34, + 0xea, 0x74, 0xf5, 0x3a, 0xfb, 0x9a, 0xac, 0xaf, 0xc9, 0xd2, 0xbf, 0x9d, + 0xda, 0x1c, 0x35, 0x77, 0xa3, 0x1d, 0xff, 0x00, 0xad, 0xe7, 0xec, 0x7a, + 0xb1, 0xb3, 0x2d, 0xbc, 0x1a, 0x79, 0x74, 0x73, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x5e, 0xb9, 0x60, 0xf4, 0x63, 0x95, 0xd5, 0xcb, 0xc5, + 0xc3, 0x2e, 0x58, 0xa8, 0xae, 0xa0, 0x63, 0x97, 0x8b, 0x8d, 0x73, 0xb3, + 0x73, 0x66, 0xd2, 0x57, 0x10, 0x96, 0x04, 0x48, 0xc5, 0x33, 0x44, 0xb9, + 0xcc, 0x19, 0xa4, 0xbe, 0x82, 0x69, 0x75, 0xe5, 0x32, 0x75, 0x34, 0x95, + 0xba, 0x6c, 0xb9, 0x6d, 0x4b, 0xaa, 0xe2, 0x50, 0x2c, 0x86, 0x55, 0x73, + 0xd4, 0xcd, 0xe9, 0xaf, 0x46, 0xce, 0xb6, 0xf1, 0xaf, 0x59, 0xd1, 0x57, + 0x17, 0x1a, 0x52, 0x7c, 0xb5, 0x8b, 0x87, 0x6e, 0x6c, 0xdf, 0x1b, 0x3a, + 0xe4, 0xe7, 0x5c, 0xe9, 0x79, 0xb1, 0x52, 0x70, 0x71, 0x54, 0xbe, 0x93, + 0xa6, 0x6c, 0x5b, 0x26, 0xb4, 0xd9, 0xd9, 0xd4, 0xdf, 0xbc, 0x74, 0x75, + 0x35, 0xf4, 0xe7, 0xab, 0xaf, 0x12, 0xca, 0x25, 0xa4, 0xae, 0x5f, 0x25, + 0xe0, 0xfa, 0x5e, 0x0b, 0xe5, 0xfd, 0x7f, 0x3f, 0xe4, 0xf5, 0xd5, 0x8a, + 0x13, 0xde, 0x7a, 0xbe, 0xef, 0x9f, 0xe8, 0x7e, 0xaf, 0xc6, 0x9f, 0x4e, + 0x35, 0x54, 0x08, 0x11, 0x30, 0x92, 0x32, 0x90, 0x29, 0xa8, 0x26, 0x79, + 0xae, 0x07, 0x97, 0xbf, 0x88, 0xf5, 0x79, 0xe5, 0x9d, 0x3d, 0xba, 0xfc, + 0xba, 0x7a, 0xec, 0xde, 0x8d, 0x97, 0xeb, 0x3d, 0x2e, 0x98, 0xe8, 0x74, + 0xc7, 0x4b, 0x73, 0x7f, 0x1b, 0xcc, 0xfc, 0x77, 0xd2, 0xcd, 0xf2, 0xfb, + 0x91, 0x1d, 0x66, 0x5e, 0x9e, 0x7d, 0x2f, 0x67, 0x1f, 0x69, 0xfa, 0x1f, + 0x27, 0x7f, 0xed, 0xf9, 0xfa, 0x39, 0x74, 0x3c, 0xda, 0xb3, 0x3d, 0x00, + 0x00, 0x00, 0x00, 0x32, 0xe3, 0x5a, 0xb7, 0x90, 0x84, 0xd3, 0x48, 0xef, + 0x8f, 0x13, 0xd7, 0x8e, 0x42, 0xf3, 0xf3, 0x71, 0x46, 0x45, 0xcb, 0x19, + 0x8a, 0x25, 0xce, 0x73, 0xe5, 0xe6, 0xcc, 0xe5, 0xce, 0xa1, 0x9d, 0x57, + 0x2d, 0x59, 0xd6, 0x39, 0x79, 0xf9, 0xd6, 0x69, 0xaa, 0x8e, 0x5c, 0xb2, + 0xb2, 0x3b, 0xc6, 0xeb, 0x9f, 0x71, 0xcf, 0xa4, 0x3a, 0x73, 0x8d, 0x4c, + 0xba, 0xb4, 0x59, 0x71, 0x69, 0x60, 0xd6, 0x51, 0xa2, 0xb8, 0xbd, 0x79, + 0x79, 0x0f, 0x4f, 0x1e, 0x6e, 0xf1, 0x59, 0x29, 0x7d, 0x2f, 0x3e, 0x9f, + 0x48, 0xf2, 0xfa, 0x3a, 0xf8, 0xd6, 0xcb, 0x9e, 0xf6, 0xf1, 0xb3, 0x97, + 0x5e, 0x3f, 0x1e, 0xbe, 0x43, 0xcd, 0xdf, 0xcf, 0x4d, 0x67, 0xeb, 0xc3, + 0x16, 0xb3, 0x87, 0x53, 0x66, 0xb9, 0xca, 0xce, 0x55, 0x5e, 0x69, 0x8e, + 0x7d, 0x48, 0xb9, 0x39, 0xbe, 0x6f, 0x47, 0x33, 0xa6, 0x3b, 0x5d, 0x79, + 0x76, 0x57, 0x42, 0xe9, 0xce, 0xf7, 0x73, 0xe9, 0xe8, 0xab, 0xa6, 0x6d, + 0xef, 0xe7, 0xe3, 0xf3, 0xf4, 0x7c, 0xbf, 0xf3, 0x9f, 0xa8, 0xcb, 0x8b, + 0x46, 0x15, 0x64, 0xf4, 0x9e, 0xb2, 0xa5, 0xe9, 0xfd, 0x0f, 0x9d, 0xea, + 0xbe, 0xdf, 0xc1, 0xa6, 0x0b, 0x29, 0x15, 0x61, 0x2a, 0x89, 0x99, 0x6c, + 0x8d, 0x52, 0x07, 0x23, 0x8f, 0x5f, 0x9e, 0xf5, 0xe7, 0x9e, 0xc7, 0x0a, + 0x5b, 0x6b, 0x5c, 0x74, 0xe5, 0xdd, 0x9d, 0xfa, 0x05, 0xf4, 0x9a, 0x9d, + 0x2f, 0x97, 0xd5, 0x7e, 0x3b, 0xe8, 0x31, 0x5c, 0xc7, 0xae, 0x5f, 0x7e, + 0x7b, 0xfd, 0x3c, 0xbd, 0x87, 0xab, 0x9f, 0xac, 0xfd, 0xa7, 0xce, 0xe9, + 0x4b, 0xd2, 0xf2, 0xf4, 0x94, 0xd0, 0x00, 0x00, 0x00, 0x67, 0xcd, 0xd1, + 0xa8, 0x00, 0x26, 0x6b, 0x79, 0x55, 0xcf, 0xb3, 0x87, 0xbc, 0xf2, 0x65, + 0xa2, 0xb2, 0xeb, 0x38, 0x0c, 0x71, 0x52, 0xd6, 0xe5, 0xc9, 0xe9, 0xe0, + 0xe1, 0x65, 0x9b, 0x1a, 0x9c, 0xeb, 0x57, 0x3f, 0x5f, 0x9a, 0xcf, 0x6c, + 0x6b, 0x39, 0x76, 0xf3, 0xe9, 0x6e, 0x77, 0x54, 0x57, 0x65, 0xe7, 0x7f, + 0x19, 0xf4, 0x3d, 0xf3, 0x5e, 0xf1, 0x6d, 0x59, 0x4d, 0x2e, 0xb6, 0x69, + 0x25, 0xb4, 0xd3, 0x65, 0xd0, 0xcf, 0x95, 0x7b, 0xbc, 0x99, 0x3a, 0x62, + 0x4b, 0x08, 0x92, 0xeb, 0x8f, 0x59, 0xc7, 0xb7, 0xd3, 0x3c, 0x7e, 0x89, + 0xd9, 0xaf, 0x3a, 0xc1, 0x35, 0xe5, 0xf8, 0xf4, 0xf9, 0xdf, 0x87, 0xd5, + 0x9f, 0x78, 0xf4, 0x3e, 0xcf, 0x2e, 0xfd, 0xe3, 0x0d, 0xcd, 0x4a, 0x93, + 0x12, 0x74, 0xab, 0x2c, 0x54, 0x5c, 0x4e, 0xce, 0x3f, 0x0e, 0xf8, 0xfb, + 0x73, 0xf5, 0x1a, 0xc5, 0xf2, 0xe5, 0xaa, 0xcd, 0x6b, 0xf4, 0x49, 0x7b, + 0xb2, 0xc2, 0x5c, 0x39, 0xed, 0xf3, 0x3f, 0xcd, 0xfe, 0x9f, 0x34, 0x66, + 0xc2, 0x18, 0xb2, 0xdc, 0xb3, 0x72, 0x39, 0x6b, 0xf6, 0x78, 0xfd, 0x87, + 0xde, 0xfc, 0xec, 0x6c, 0xae, 0xa0, 0x91, 0x5a, 0x0a, 0x52, 0xa5, 0x69, + 0x4d, 0x56, 0x94, 0xda, 0xb9, 0x75, 0xf9, 0x96, 0xb9, 0xf2, 0xec, 0xbb, + 0x52, 0x51, 0x12, 0x42, 0x95, 0xcb, 0x0c, 0x6b, 0xb1, 0xac, 0xfb, 0x5f, + 0x8f, 0xe9, 0xf6, 0x5f, 0x93, 0xfa, 0x12, 0x92, 0x1b, 0x90, 0xde, 0x5f, + 0x7c, 0x6d, 0xf4, 0x72, 0xf6, 0x1e, 0xae, 0x5e, 0x97, 0xf6, 0x5e, 0x1e, + 0x87, 0x2d, 0xef, 0xe5, 0xbe, 0x84, 0xb7, 0x5c, 0xbb, 0x00, 0x00, 0x01, + 0x1e, 0x44, 0x8e, 0xa5, 0x57, 0x39, 0x56, 0x0c, 0xf2, 0xc6, 0x96, 0x6e, + 0x52, 0x72, 0xf3, 0x7e, 0x35, 0xcf, 0xae, 0x79, 0x77, 0x69, 0xaa, 0xce, + 0xc7, 0x5f, 0x25, 0x3d, 0x7c, 0x1c, 0x2e, 0x7b, 0xcf, 0x9d, 0x25, 0xc6, + 0xdf, 0x93, 0xe7, 0xef, 0x42, 0x97, 0x57, 0x0f, 0x45, 0xdc, 0xba, 0xb8, + 0x8a, 0xdb, 0xd3, 0x9f, 0xb5, 0xd6, 0x7a, 0xdd, 0x39, 0xc7, 0x51, 0x12, + 0xab, 0x6c, 0xd0, 0x3a, 0xd0, 0x58, 0x05, 0x85, 0xb1, 0xf2, 0x3f, 0xa1, + 0xe3, 0x8e, 0xb3, 0x29, 0x6b, 0x25, 0x2e, 0xa3, 0xd9, 0x71, 0xed, 0xf4, + 0x8f, 0x1f, 0xa2, 0x83, 0xa1, 0x35, 0xd2, 0xb3, 0xd2, 0x5c, 0xf3, 0xeb, + 0xe6, 0x3e, 0x7e, 0xff, 0x00, 0x26, 0xe3, 0xbe, 0xaf, 0x4e, 0x4a, 0x34, + 0x59, 0x9f, 0x59, 0x31, 0xb9, 0xa3, 0x33, 0x2d, 0xa9, 0x0a, 0xe1, 0xe3, + 0x7a, 0xfa, 0x63, 0xa2, 0x55, 0x63, 0xaf, 0xa4, 0x6f, 0x1f, 0x65, 0xaa, + 0xab, 0x8b, 0x9b, 0xcc, 0x9a, 0xe6, 0xe3, 0xb7, 0xcc, 0x3f, 0x37, 0xfa, + 0x7c, 0xd9, 0x51, 0x84, 0x33, 0x67, 0xa9, 0x66, 0xa2, 0x96, 0xdf, 0x47, + 0x97, 0xd5, 0x7e, 0x8f, 0xf3, 0x71, 0x04, 0x74, 0x92, 0xba, 0x49, 0x59, + 0x49, 0x5d, 0x55, 0x48, 0x97, 0x3e, 0x9f, 0x37, 0xb8, 0xe5, 0xea, 0x55, + 0x63, 0x4a, 0x65, 0x64, 0x86, 0x4c, 0xb2, 0x3d, 0x57, 0xc6, 0xf5, 0x7d, + 0x1f, 0xf2, 0x7f, 0x42, 0x44, 0x6c, 0x86, 0xf2, 0x76, 0xc6, 0xaf, 0x47, + 0x3f, 0x5b, 0xea, 0xe5, 0xec, 0x7f, 0x55, 0xe1, 0xe9, 0xee, 0xf4, 0x63, + 0x24, 0x67, 0xb6, 0xb3, 0x44, 0xd6, 0xa2, 0xf2, 0x64, 0x0e, 0x6c, 0x53, + 0xbc, 0xf2, 0xab, 0x92, 0x9c, 0xb3, 0x99, 0x1c, 0xd3, 0x04, 0xb8, 0xe3, + 0x19, 0x51, 0xe2, 0xeb, 0xce, 0x92, 0x26, 0x9e, 0xb3, 0x7e, 0x4f, 0x53, + 0xdb, 0xc5, 0xc2, 0xc6, 0xe8, 0xce, 0xa2, 0xb9, 0x5a, 0xf1, 0xdc, 0xbe, + 0x80, 0x0b, 0x67, 0x3e, 0xba, 0xf9, 0x75, 0xab, 0x59, 0x76, 0x69, 0xb9, + 0xfa, 0x5c, 0xd5, 0x9d, 0x39, 0xba, 0x9d, 0x8c, 0x2a, 0xfa, 0x99, 0x3a, + 0xb0, 0xb0, 0x9c, 0x33, 0xe4, 0x1f, 0x43, 0xc5, 0x75, 0x84, 0xb5, 0x2c, + 0xe5, 0xd3, 0x1e, 0xd3, 0x8f, 0x6f, 0x7b, 0xe4, 0xf4, 0x44, 0xea, 0x4b, + 0xd7, 0x4f, 0x57, 0xac, 0xec, 0x93, 0x3b, 0x58, 0x6c, 0xf8, 0x56, 0x37, + 0xf3, 0xec, 0xc6, 0x66, 0x15, 0x97, 0xa6, 0x49, 0x72, 0x2d, 0x84, 0x25, + 0xe7, 0xe7, 0x5b, 0x77, 0x8d, 0x16, 0x7a, 0x3b, 0x3f, 0x43, 0x57, 0xad, + 0x9a, 0xba, 0xce, 0x54, 0xbc, 0x63, 0x9b, 0x9b, 0xce, 0xcf, 0x5f, 0x95, + 0x7e, 0x6b, 0xf5, 0x19, 0xa2, 0x8e, 0x68, 0xe6, 0xd9, 0xb9, 0x3d, 0x43, + 0x36, 0x5d, 0x78, 0x7b, 0x0f, 0xd4, 0x7e, 0x62, 0x29, 0x1a, 0x48, 0x91, + 0x15, 0x54, 0x4a, 0xca, 0x52, 0x15, 0x05, 0x31, 0xbf, 0x9c, 0xc7, 0x93, + 0xdf, 0x3d, 0xe5, 0x53, 0xab, 0x73, 0x2c, 0x99, 0x22, 0x65, 0xc9, 0xeb, + 0xfe, 0x27, 0xaf, 0xe8, 0x1f, 0x95, 0xfa, 0x12, 0xca, 0xbb, 0x21, 0xbc, + 0x9d, 0x71, 0xa7, 0xd1, 0xcf, 0xd3, 0x7a, 0xb9, 0xf2, 0x7f, 0x55, 0xe2, + 0x86, 0xc2, 0xf4, 0xed, 0xec, 0x1d, 0x83, 0xaf, 0x5d, 0x25, 0xd8, 0x97, + 0x52, 0x8c, 0xe9, 0xcd, 0xde, 0x39, 0xc7, 0x34, 0xe6, 0x9c, 0xf8, 0xe7, + 0x46, 0x05, 0xc5, 0x18, 0xa3, 0x3a, 0xf9, 0x7a, 0xf9, 0xb4, 0x02, 0xaf, + 0x79, 0xbf, 0x17, 0xb0, 0xeb, 0xe4, 0xe1, 0x63, 0x54, 0x67, 0x68, 0xce, + 0xbe, 0x2b, 0x97, 0xd2, 0x60, 0x63, 0xac, 0xf6, 0x31, 0x9e, 0x97, 0x37, + 0xea, 0x5c, 0x7b, 0x4b, 0xaf, 0x39, 0x12, 0xa9, 0x54, 0xac, 0xb5, 0x65, + 0x53, 0x49, 0x92, 0x27, 0x15, 0xd9, 0xf2, 0x4f, 0x7f, 0x93, 0x41, 0x12, + 0xa5, 0x9c, 0xba, 0x63, 0xdc, 0x70, 0xef, 0xed, 0xfc, 0xbd, 0xc3, 0xab, + 0x2f, 0x48, 0xeb, 0xd9, 0xd2, 0x5e, 0xd9, 0x6c, 0xae, 0xe7, 0xe6, 0x56, + 0x7e, 0x72, 0xe5, 0xbe, 0x06, 0x29, 0x2d, 0xfa, 0x93, 0x4c, 0xd9, 0xd3, + 0x28, 0x9a, 0xa4, 0xd9, 0xac, 0xfd, 0x8f, 0xaf, 0x2f, 0xbb, 0xea, 0x5d, + 0x2c, 0x26, 0xb4, 0x67, 0x59, 0x93, 0x81, 0x58, 0x63, 0x99, 0x9d, 0xfc, + 0x9b, 0xf3, 0x7f, 0xa9, 0xc9, 0x85, 0x18, 0x2c, 0xdb, 0x77, 0x27, 0xa8, + 0xb3, 0x4d, 0x73, 0xf5, 0xff, 0x00, 0xab, 0xfc, 0xa4, 0x04, 0x8a, 0x92, + 0x15, 0x58, 0x92, 0x25, 0x74, 0xaa, 0x21, 0xcb, 0xaf, 0xcc, 0xae, 0x7c, + 0xa6, 0xf1, 0xa2, 0x58, 0xa4, 0x80, 0x64, 0x89, 0x97, 0x9e, 0xcb, 0xe2, + 0x7a, 0xfd, 0xff, 0x00, 0xe5, 0x7d, 0xf2, 0xca, 0xb4, 0xaf, 0x79, 0x3a, + 0xe2, 0xfe, 0xf8, 0xf4, 0x1e, 0xae, 0x5c, 0x6f, 0xd5, 0x79, 0x2c, 0xeb, + 0x3a, 0x95, 0xd3, 0xb3, 0xa9, 0x5d, 0x3a, 0xe9, 0x1b, 0x8d, 0x49, 0x65, + 0x05, 0x27, 0x1a, 0xe7, 0x14, 0x61, 0x30, 0x98, 0x8c, 0x11, 0x86, 0x5c, + 0x66, 0x39, 0x72, 0x9c, 0xe3, 0xe3, 0x52, 0xa1, 0x9e, 0xf3, 0xa7, 0x87, + 0xd6, 0x74, 0xf2, 0x70, 0xf1, 0xd2, 0x89, 0xa0, 0xa0, 0xf1, 0x7c, 0xfe, + 0x92, 0x95, 0x98, 0xac, 0xcf, 0x52, 0x25, 0x67, 0xb5, 0xc5, 0xfa, 0x37, + 0x2f, 0x42, 0xeb, 0xca, 0x51, 0x2a, 0x74, 0x59, 0x35, 0xb2, 0xac, 0x49, + 0x12, 0x26, 0x65, 0xb3, 0xe5, 0x5e, 0xff, 0x00, 0x26, 0x98, 0x81, 0x54, + 0xb3, 0x97, 0x49, 0xee, 0xbc, 0xfe, 0x8f, 0x63, 0xe6, 0xed, 0x74, 0xbd, + 0x45, 0xe9, 0x47, 0x5a, 0xce, 0xba, 0xf5, 0xe5, 0x9a, 0xd8, 0xcc, 0x0e, + 0x36, 0xb3, 0xf9, 0xf2, 0x6b, 0xe3, 0xdc, 0xe8, 0x9b, 0xc7, 0x2b, 0x31, + 0x1d, 0x4a, 0xfd, 0x0d, 0xd3, 0x1f, 0x47, 0xb2, 0xc8, 0x6a, 0xb3, 0xad, + 0xb2, 0x67, 0x9b, 0xe2, 0x59, 0xc6, 0x4e, 0x7c, 0xdf, 0xc7, 0xff, 0x00, + 0x35, 0xfa, 0x9c, 0x5c, 0xd4, 0x73, 0x32, 0xce, 0x92, 0x62, 0xcd, 0x8b, + 0x3e, 0xc7, 0xf5, 0x9f, 0x94, 0x86, 0xb3, 0x12, 0x36, 0x20, 0x4a, 0x6a, + 0x42, 0xb2, 0x01, 0x62, 0xb6, 0x7c, 0xba, 0xfc, 0xde, 0xe3, 0xc6, 0xeb, + 0x3d, 0x99, 0xba, 0x18, 0xc4, 0x00, 0x22, 0x44, 0xcf, 0x67, 0xf0, 0xfd, + 0x7f, 0x46, 0xfc, 0xaf, 0xbd, 0xe6, 0xd5, 0x73, 0x0d, 0x65, 0x75, 0xcd, + 0xdd, 0xb1, 0xdb, 0xf5, 0xf1, 0xcb, 0xfa, 0xaf, 0x25, 0xbe, 0x8c, 0xf4, + 0x0e, 0x8d, 0x9d, 0x03, 0x75, 0x6d, 0xad, 0x69, 0xa6, 0xac, 0x02, 0xa3, + 0x8d, 0x26, 0x73, 0x21, 0x90, 0xc6, 0x62, 0x8c, 0x72, 0xe4, 0x32, 0x2e, + 0x58, 0x92, 0x7c, 0x29, 0xaa, 0x61, 0x9e, 0xff, 0x00, 0xa7, 0x83, 0xd3, + 0xf4, 0xf2, 0xf0, 0xf1, 0xd2, 0x99, 0xa4, 0x56, 0x78, 0xbe, 0x7f, 0x4a, + 0x32, 0x86, 0x4d, 0x4c, 0xe3, 0x42, 0xdf, 0x4b, 0x9b, 0xf5, 0x0e, 0x1d, + 0xb5, 0xf6, 0xe5, 0x05, 0x42, 0xab, 0x6a, 0xfa, 0x92, 0x4c, 0x64, 0x89, + 0x18, 0x35, 0x9f, 0x98, 0xfb, 0xbc, 0x9a, 0x25, 0xaa, 0x5a, 0xd6, 0xc8, + 0xd2, 0xbe, 0xf3, 0xcd, 0xdf, 0xd5, 0xf9, 0xfb, 0x6d, 0xcd, 0xe9, 0x2f, + 0x40, 0xea, 0x57, 0x66, 0x5e, 0xdc, 0xb3, 0x25, 0x72, 0x89, 0x59, 0x9a, + 0xbe, 0x09, 0x27, 0xe7, 0x06, 0x2b, 0x2b, 0x52, 0x3a, 0xb9, 0xd7, 0xec, + 0x45, 0xef, 0x6f, 0x3d, 0x09, 0xa9, 0x8a, 0x54, 0x74, 0x33, 0x29, 0xce, + 0xb8, 0x5a, 0xbc, 0x6b, 0x30, 0x4d, 0x7c, 0x5b, 0xf3, 0x7f, 0xa9, 0xc1, + 0xc5, 0x4e, 0x12, 0x2c, 0xdc, 0x90, 0x66, 0xc2, 0x4f, 0x63, 0xfa, 0xdf, + 0xca, 0xc3, 0x78, 0x82, 0x44, 0xae, 0xc7, 0x65, 0x01, 0x05, 0x16, 0x2a, + 0x75, 0xa3, 0x97, 0x5f, 0x9d, 0x6f, 0x1e, 0x19, 0x9d, 0xa4, 0x52, 0xb9, + 0x40, 0x10, 0x80, 0xf6, 0x5f, 0x0f, 0xd7, 0xf4, 0xbf, 0xca, 0x7d, 0x02, + 0x2b, 0xd6, 0x6a, 0xb9, 0x3a, 0x66, 0xce, 0xd8, 0xec, 0x7a, 0xb9, 0x2f, + 0xd5, 0xf8, 0xec, 0xf4, 0xe7, 0x75, 0x6d, 0x4d, 0xd5, 0xac, 0xd5, 0x66, + 0x9a, 0xb8, 0x98, 0x10, 0x4e, 0x5c, 0x50, 0x67, 0x33, 0x19, 0x63, 0x19, + 0x91, 0x73, 0x46, 0x53, 0x2c, 0xa8, 0xf9, 0x1a, 0xf0, 0x92, 0x71, 0xf4, + 0x0e, 0xbe, 0x0f, 0x45, 0xbf, 0x37, 0x0f, 0x1d, 0x2a, 0xce, 0x95, 0x95, + 0x9e, 0x3b, 0x9f, 0xd2, 0xae, 0x50, 0xc9, 0x59, 0xb5, 0x09, 0x66, 0x7d, + 0x1f, 0x37, 0xd7, 0x71, 0xed, 0xa3, 0xb7, 0x29, 0x16, 0x11, 0xd0, 0x25, + 0x53, 0x59, 0x59, 0x32, 0x51, 0x23, 0x95, 0xbc, 0x7c, 0xe3, 0xdb, 0xe5, + 0xd1, 0x2d, 0x12, 0xc2, 0x5b, 0x17, 0x49, 0xef, 0x7c, 0xbe, 0x8f, 0x4b, + 0xe7, 0xed, 0xd3, 0x97, 0xa2, 0x6f, 0x3a, 0x6b, 0xde, 0xce, 0xbb, 0x89, + 0x15, 0x92, 0x4f, 0x59, 0x9d, 0xcd, 0x07, 0xc5, 0x57, 0xf2, 0x7e, 0xb9, + 0x40, 0x04, 0x74, 0xb1, 0xaf, 0xdb, 0x78, 0xed, 0xd7, 0xde, 0x37, 0xca, + 0xe1, 0xac, 0x0d, 0x59, 0x39, 0x39, 0xad, 0xf9, 0xcb, 0x32, 0x5b, 0xf0, + 0xef, 0xce, 0x7e, 0xa3, 0x9d, 0xe7, 0xb5, 0x65, 0x22, 0x7a, 0x92, 0x82, + 0x58, 0x49, 0xec, 0x3f, 0x59, 0xf9, 0x79, 0x74, 0xe7, 0x12, 0x9b, 0x95, + 0x51, 0x4a, 0xac, 0x10, 0xaa, 0xc2, 0xa6, 0x59, 0xcb, 0xaf, 0xca, 0x75, + 0x8f, 0x33, 0xac, 0xe9, 0x94, 0x46, 0x00, 0x22, 0x22, 0x3d, 0x87, 0xc3, + 0xf5, 0xfd, 0x37, 0xf2, 0x7f, 0x41, 0x65, 0x4e, 0xf3, 0x5e, 0xb2, 0x6b, + 0x33, 0xed, 0x8e, 0xa7, 0xaf, 0x95, 0xff, 0x00, 0xab, 0xf1, 0xcb, 0xd5, + 0x9d, 0x86, 0xdb, 0x35, 0xa6, 0x9a, 0xbc, 0xbe, 0xac, 0x26, 0x81, 0x13, + 0x9c, 0x54, 0x50, 0x67, 0x33, 0xc6, 0x63, 0x2a, 0xe6, 0x8c, 0xc6, 0x58, + 0xa5, 0x7e, 0x7a, 0x78, 0xd8, 0x99, 0xf4, 0x1e, 0xbf, 0x3f, 0xbf, 0xbf, + 0x3f, 0x0f, 0x9f, 0x4a, 0xa6, 0x82, 0x16, 0x78, 0xfe, 0x7f, 0x4a, 0xb9, + 0x51, 0x93, 0x4c, 0xc8, 0x5a, 0x47, 0xba, 0x97, 0xe9, 0x1c, 0x7d, 0x07, + 0x5e, 0x10, 0xa4, 0x59, 0x53, 0xa9, 0x12, 0xa9, 0x0c, 0x94, 0x48, 0xe3, + 0x74, 0xe7, 0xf3, 0xef, 0x67, 0x9a, 0xf9, 0x68, 0x96, 0x32, 0xcd, 0x74, + 0xc7, 0xb9, 0xf3, 0x7a, 0x3d, 0x07, 0x9f, 0xb7, 0x76, 0x6b, 0xa1, 0x1d, + 0x05, 0xea, 0xc7, 0xab, 0x3a, 0xba, 0xe5, 0x83, 0x1d, 0xed, 0x2e, 0xd7, + 0x39, 0x59, 0x96, 0x6b, 0xe0, 0x76, 0x7e, 0x65, 0xdf, 0x18, 0x80, 0x12, + 0x3f, 0x6d, 0xf9, 0xfd, 0x3e, 0xbb, 0xa6, 0x76, 0xe5, 0x73, 0x32, 0x21, + 0x35, 0x4c, 0xd5, 0xba, 0xe7, 0xa7, 0x78, 0xf2, 0x9c, 0x7d, 0x19, 0x6b, + 0xf3, 0xcf, 0xe7, 0xff, 0x00, 0x4d, 0xcc, 0xe1, 0xaa, 0xb9, 0x27, 0x52, + 0xd4, 0x79, 0x29, 0x60, 0x9e, 0xcb, 0xf5, 0x3f, 0x9a, 0xb7, 0xb7, 0x1a, + 0x6e, 0x62, 0x46, 0xa3, 0x66, 0x66, 0x65, 0x48, 0x80, 0xe8, 0xb2, 0xde, + 0x5d, 0xbe, 0x5d, 0x79, 0xf9, 0xbd, 0xe6, 0x72, 0xb4, 0x90, 0x01, 0x11, + 0x11, 0x3d, 0x7f, 0xc3, 0xf5, 0xfd, 0x37, 0xf2, 0x5f, 0x41, 0x45, 0x1a, + 0xcc, 0x35, 0x93, 0x59, 0x97, 0x6c, 0xf4, 0x7d, 0x7c, 0xb6, 0x7e, 0xab, + 0xc5, 0x2f, 0x66, 0x75, 0x26, 0xba, 0xd2, 0x5f, 0x65, 0xc5, 0xb5, 0x22, + 0x60, 0x88, 0xc5, 0x15, 0x55, 0x25, 0x26, 0x78, 0xce, 0x67, 0x96, 0x83, + 0x39, 0x9a, 0x32, 0xaf, 0x8f, 0x3e, 0x79, 0x16, 0x9f, 0x41, 0xeb, 0xf3, + 0xbb, 0x7b, 0xe1, 0xc3, 0xe7, 0xd2, 0x13, 0x45, 0x45, 0x3c, 0x87, 0x3f, + 0xa3, 0x54, 0xd2, 0x31, 0xe9, 0x4a, 0x4d, 0x6b, 0x3e, 0x89, 0x9d, 0x7d, + 0x5f, 0x97, 0xa7, 0x8b, 0xdb, 0xcd, 0x51, 0x02, 0xb3, 0x45, 0x4a, 0xdb, + 0xac, 0xb0, 0x71, 0x22, 0x47, 0x07, 0xa7, 0x3f, 0x09, 0xec, 0xf3, 0x5b, + 0x2d, 0x13, 0x4a, 0x59, 0xc6, 0x95, 0xf7, 0x7e, 0x5f, 0x47, 0x73, 0x87, + 0x5f, 0x45, 0x9d, 0xef, 0x3a, 0x32, 0xf5, 0x63, 0xd5, 0x1a, 0x35, 0x9e, + 0x4c, 0xde, 0xa3, 0x51, 0x7d, 0xcc, 0x0f, 0xcd, 0xec, 0xfe, 0x78, 0xe9, + 0xc6, 0x22, 0x12, 0x49, 0x7f, 0x67, 0x79, 0xfd, 0x3f, 0x43, 0xd4, 0xd8, + 0x4e, 0x64, 0x08, 0xa1, 0xab, 0xb7, 0xcf, 0x57, 0x4e, 0x7c, 0x3f, 0x37, + 0xaf, 0x9f, 0x6f, 0xe6, 0xdf, 0x83, 0xfa, 0x4e, 0x4f, 0x9a, 0xd7, 0xce, + 0xca, 0xc9, 0x04, 0x44, 0x82, 0x7b, 0x2f, 0xd3, 0xfe, 0x76, 0xef, 0x47, + 0x9e, 0x09, 0x1a, 0xa2, 0xc9, 0x98, 0x2e, 0x58, 0xd1, 0x54, 0xac, 0x76, + 0xdd, 0xcb, 0xa7, 0xce, 0x75, 0x8e, 0x26, 0xa7, 0x3e, 0x15, 0x92, 0x01, + 0x42, 0x22, 0x44, 0xf6, 0x1f, 0x13, 0xd7, 0xf4, 0xdf, 0xc8, 0xfd, 0x08, + 0xc5, 0x1b, 0xc4, 0x2e, 0x4d, 0x47, 0xd3, 0x3b, 0xbd, 0x9c, 0xba, 0x1f, + 0xaa, 0xf1, 0x4b, 0xdb, 0x9d, 0x26, 0x84, 0xd1, 0x57, 0x16, 0xd9, 0x61, + 0x32, 0x68, 0x11, 0xac, 0x71, 0x0a, 0xa8, 0xa6, 0x29, 0x28, 0x28, 0x8a, + 0x17, 0x39, 0x4c, 0x66, 0x38, 0xcb, 0xf2, 0x28, 0xb0, 0xfa, 0x27, 0x5f, + 0x9b, 0xdc, 0xdf, 0x0f, 0x39, 0xcf, 0xb2, 0x95, 0x91, 0xb3, 0xc8, 0xe3, + 0xe8, 0xd3, 0x9d, 0x06, 0x4d, 0x20, 0x94, 0x5b, 0x18, 0xf6, 0x58, 0xd7, + 0xd5, 0xb9, 0xf4, 0xab, 0xaf, 0x27, 0x6a, 0xa0, 0x2a, 0x6b, 0x62, 0x3a, + 0x71, 0x32, 0x47, 0x9e, 0xeb, 0xcb, 0xc4, 0xfa, 0xfc, 0xf2, 0xce, 0xaa, + 0x95, 0x2c, 0xa3, 0x52, 0xfb, 0xef, 0x2f, 0xa3, 0xb9, 0xc3, 0xaf, 0x7b, + 0x3a, 0xd8, 0xbd, 0x08, 0xe9, 0xaf, 0x72, 0x6a, 0x56, 0x63, 0xb9, 0xd6, + 0xba, 0xcb, 0x92, 0x35, 0xf9, 0xf2, 0x67, 0xf3, 0xdf, 0x4e, 0x30, 0x25, + 0x15, 0x16, 0x57, 0xec, 0x2f, 0x3f, 0xab, 0xe9, 0x1a, 0xce, 0xc5, 0x45, + 0x05, 0x11, 0x41, 0x09, 0x7b, 0xd3, 0x1e, 0x7f, 0x3d, 0xb9, 0x9d, 0x39, + 0xfc, 0x0b, 0xf3, 0xff, 0x00, 0xa6, 0xe3, 0xf9, 0x75, 0x0c, 0x59, 0x58, + 0xe9, 0x61, 0x56, 0x41, 0xeb, 0xff, 0x00, 0x4f, 0xf9, 0xed, 0x3e, 0xbf, + 0x2c, 0x6c, 0x81, 0x5a, 0x15, 0x4a, 0x53, 0x62, 0x1d, 0x8e, 0xc9, 0x2e, + 0xbe, 0x7d, 0x3e, 0x75, 0x73, 0xe1, 0xb7, 0x8b, 0xa5, 0x76, 0x48, 0x41, + 0x11, 0x22, 0x40, 0xf6, 0x1f, 0x17, 0xd7, 0xf4, 0xef, 0xc8, 0x7d, 0x08, + 0x66, 0x53, 0xd3, 0x30, 0xb9, 0x07, 0xd7, 0x1a, 0xfd, 0x7c, 0xfa, 0x7f, + 0xab, 0xf1, 0x3f, 0x6e, 0x2f, 0x4d, 0x15, 0x71, 0x6d, 0x5a, 0x96, 0x12, + 0x1d, 0x34, 0x46, 0x75, 0x82, 0x54, 0x56, 0x52, 0x52, 0x52, 0x53, 0x2d, + 0x05, 0x31, 0x9c, 0xa4, 0xf9, 0x42, 0xf1, 0xe3, 0xea, 0x3d, 0xbe, 0x66, + 0x9b, 0xcb, 0x81, 0xcf, 0xa8, 0xac, 0x56, 0x79, 0x1c, 0x7d, 0x1a, 0x33, + 0xa0, 0xc9, 0x5a, 0x17, 0x9d, 0x50, 0x4f, 0x6d, 0xcf, 0x7f, 0x44, 0xc6, + 0xf4, 0x75, 0xe7, 0x55, 0x21, 0x55, 0xf4, 0xd6, 0x49, 0x3a, 0x71, 0x32, + 0x67, 0x9c, 0xed, 0xcb, 0xc7, 0x7a, 0x7c, 0xee, 0x6a, 0xa9, 0x45, 0x72, + 0xea, 0x3d, 0xef, 0x97, 0xd1, 0xdd, 0xe1, 0xd7, 0xb9, 0x9d, 0x6b, 0x3a, + 0x2b, 0xd0, 0x97, 0xa9, 0x2c, 0xac, 0xcd, 0xac, 0xeb, 0x97, 0x49, 0x6d, + 0x95, 0x59, 0xf9, 0xea, 0x4f, 0x87, 0x6f, 0x94, 0x0b, 0x65, 0xba, 0x31, + 0xea, 0x7e, 0xb1, 0xe1, 0xe9, 0xfa, 0x4e, 0xf1, 0x7a, 0x91, 0x59, 0x02, + 0x99, 0x69, 0x97, 0xa9, 0xcf, 0x6a, 0x6b, 0xce, 0xf5, 0xe3, 0xf0, 0xff, + 0x00, 0x81, 0xfa, 0x6e, 0x2f, 0x8f, 0xa5, 0x79, 0x4e, 0xc5, 0x95, 0x1c, + 0xaa, 0xa9, 0x6e, 0x7a, 0xcf, 0xd1, 0xfc, 0x1d, 0xde, 0xef, 0x14, 0x48, + 0x58, 0x92, 0xab, 0x22, 0x56, 0x16, 0x42, 0xc8, 0xd4, 0xcb, 0x31, 0xd3, + 0xe6, 0x17, 0x1e, 0x5f, 0x59, 0xba, 0x59, 0x58, 0xe0, 0xa8, 0xc2, 0x20, + 0x44, 0xf5, 0xdf, 0x1b, 0xd5, 0xf5, 0x0f, 0xc7, 0x7d, 0x18, 0x49, 0x4f, + 0x4c, 0x41, 0x0d, 0x43, 0x73, 0x57, 0xaf, 0x97, 0x57, 0xf5, 0x5e, 0x23, + 0xdf, 0x8b, 0xcb, 0xec, 0xb4, 0xb4, 0xb2, 0xac, 0x49, 0x12, 0xa4, 0x06, + 0x62, 0x09, 0x02, 0xb2, 0xb2, 0x98, 0xa8, 0xa5, 0x69, 0x2a, 0x28, 0x8c, + 0xe7, 0x93, 0x5f, 0x9e, 0x47, 0xd3, 0x3b, 0x7c, 0xb6, 0xc7, 0x33, 0x1d, + 0x11, 0x25, 0x56, 0x79, 0x1c, 0x7d, 0x0a, 0x33, 0xb0, 0xc9, 0xa6, 0xc8, + 0x2a, 0x07, 0xab, 0xe7, 0xaf, 0x49, 0x9e, 0x9d, 0xdd, 0x60, 0xdc, 0x81, + 0x5d, 0x5a, 0x5b, 0x4e, 0xa4, 0x48, 0x94, 0x4c, 0xf3, 0x5d, 0xb8, 0xf9, + 0x2f, 0x4f, 0x05, 0x35, 0x09, 0x54, 0xb2, 0x5d, 0x27, 0xbd, 0xf2, 0xfa, + 0x3b, 0xbc, 0x3b, 0x76, 0xf3, 0x75, 0x1d, 0x09, 0x76, 0x9b, 0xd6, 0x76, + 0x53, 0xac, 0xe9, 0x96, 0xe4, 0x9a, 0xd0, 0x9f, 0x02, 0x8f, 0x8b, 0x74, + 0xe3, 0x10, 0xcd, 0xaf, 0x51, 0x9f, 0xa8, 0x38, 0x77, 0xfa, 0x67, 0x4c, + 0x6a, 0xcd, 0x9d, 0x45, 0xaa, 0xa2, 0xa3, 0x34, 0xbb, 0xb1, 0xab, 0xb3, + 0xbe, 0x1f, 0x4e, 0x7f, 0x15, 0xf8, 0x1f, 0xa4, 0xe1, 0xf8, 0xfa, 0xc7, + 0x26, 0x95, 0xf1, 0xa5, 0x5f, 0xdf, 0x36, 0x57, 0x7b, 0xef, 0xfc, 0x1d, + 0xbe, 0xdf, 0x24, 0x50, 0xb2, 0x08, 0xec, 0x46, 0x7a, 0xaa, 0x15, 0x8a, + 0xc5, 0x5a, 0x71, 0xd3, 0xe5, 0x17, 0x1e, 0x77, 0x59, 0xb6, 0x59, 0xa3, + 0x10, 0x88, 0x90, 0x22, 0x7a, 0xef, 0x8f, 0xea, 0xfa, 0x97, 0xe3, 0x3e, + 0x8d, 0x7a, 0xcd, 0x1a, 0xca, 0xb0, 0xb0, 0xd4, 0xbf, 0xd5, 0xcb, 0xad, + 0xfa, 0xbf, 0x19, 0xef, 0xe7, 0x75, 0x97, 0x16, 0x96, 0x54, 0xc9, 0xa4, + 0x89, 0x50, 0x05, 0x49, 0x0a, 0x81, 0x59, 0x08, 0xa8, 0xaa, 0xaa, 0x96, + 0xa4, 0xa5, 0x68, 0x28, 0x8c, 0x27, 0xc8, 0x57, 0xe8, 0x5d, 0x7e, 0x62, + 0x98, 0xc5, 0x9d, 0x83, 0x52, 0xcf, 0x23, 0x8f, 0xa1, 0x9f, 0x3b, 0x0c, + 0x9a, 0x69, 0x39, 0xca, 0xa4, 0xf5, 0xf8, 0xd6, 0xb9, 0xbf, 0xa4, 0x56, + 0x7d, 0x62, 0x34, 0xaa, 0xd1, 0xd5, 0x95, 0x22, 0x51, 0x32, 0x47, 0x98, + 0xef, 0xc7, 0xcb, 0xfa, 0x38, 0xc3, 0x36, 0x13, 0x40, 0xd7, 0x4c, 0xbe, + 0xef, 0xcd, 0xdf, 0xbf, 0xc3, 0xb7, 0x66, 0x5d, 0x11, 0xba, 0x5d, 0xb5, + 0xb0, 0xb2, 0xca, 0xac, 0xd1, 0x16, 0xd9, 0x22, 0xa3, 0xe0, 0x07, 0xc8, + 0x75, 0xca, 0x22, 0x96, 0x9b, 0x26, 0x7e, 0x97, 0xe1, 0xdf, 0xea, 0x7d, + 0x31, 0xa2, 0x50, 0x82, 0xd2, 0x55, 0x19, 0xe5, 0xd7, 0x34, 0xf3, 0xae, + 0x7d, 0x9f, 0x1c, 0xf8, 0x3f, 0xa3, 0xe0, 0xf8, 0xba, 0xa8, 0x5c, 0x8a, + 0x2c, 0xed, 0x25, 0xb1, 0x27, 0xa2, 0xfd, 0x1f, 0xe7, 0xf5, 0xfa, 0x7c, + 0xca, 0xc7, 0x65, 0x26, 0x8b, 0x12, 0x67, 0xb2, 0x04, 0x0a, 0xec, 0x55, + 0x3e, 0x7b, 0xf9, 0x56, 0xb1, 0xe7, 0xf5, 0x2d, 0x96, 0x48, 0xc4, 0x22, + 0x24, 0x08, 0x1e, 0xb7, 0xe4, 0xfa, 0x7e, 0xab, 0xf8, 0xcf, 0xa5, 0x4b, + 0x35, 0x6b, 0x11, 0xa3, 0x50, 0xb9, 0xbb, 0xd3, 0xcf, 0xad, 0xfa, 0xbf, + 0x1b, 0xfa, 0x1c, 0xef, 0x4b, 0x2a, 0xc2, 0xc2, 0x76, 0x4c, 0x91, 0x20, + 0xa1, 0x29, 0x22, 0x42, 0xa3, 0x15, 0x95, 0xd5, 0x51, 0x51, 0x59, 0x49, + 0x4a, 0xd0, 0x53, 0x1e, 0x21, 0x77, 0x74, 0xf9, 0x95, 0xcc, 0x53, 0x34, + 0x02, 0x95, 0xe4, 0x71, 0xf4, 0x33, 0xe7, 0x6c, 0xc7, 0xa6, 0xa2, 0x22, + 0x8f, 0x43, 0x9d, 0x71, 0xa6, 0xfe, 0xcf, 0x95, 0x3d, 0x70, 0x05, 0x5d, + 0x56, 0x0e, 0x91, 0x22, 0x51, 0x33, 0xcb, 0x77, 0xe3, 0xe6, 0xbd, 0x1c, + 0x6b, 0xce, 0x94, 0xa2, 0xb2, 0xf9, 0x7d, 0xdf, 0x97, 0xbf, 0xa1, 0xe1, + 0xd7, 0xaa, 0xba, 0x17, 0x64, 0x6c, 0x35, 0x16, 0xd9, 0x1b, 0x24, 0x5c, + 0x3b, 0x2b, 0x3f, 0x38, 0x49, 0xf3, 0xad, 0x62, 0x23, 0x96, 0x8b, 0x19, + 0xf7, 0xde, 0x5d, 0x7e, 0xc5, 0xbc, 0xe8, 0x57, 0x10, 0x5a, 0xe5, 0xa4, + 0xaa, 0x5b, 0x73, 0x63, 0x35, 0x49, 0xf2, 0x4f, 0x87, 0xfa, 0x2f, 0x3f, + 0xf3, 0xfb, 0x2c, 0x0c, 0xd7, 0x64, 0xfa, 0x43, 0x41, 0x3d, 0x27, 0xe9, + 0x3f, 0x3d, 0xa3, 0xd1, 0xe7, 0x56, 0x49, 0x29, 0xab, 0xec, 0x99, 0x95, + 0x02, 0x09, 0x87, 0x52, 0xf5, 0xe7, 0xe3, 0x5f, 0x39, 0xd6, 0x38, 0x1a, + 0x97, 0x4b, 0x24, 0x04, 0x22, 0x04, 0x08, 0x9e, 0xaf, 0xe5, 0x7a, 0x7e, + 0xaf, 0xf8, 0xaf, 0xa5, 0x4b, 0x15, 0x74, 0xca, 0x43, 0x50, 0xd4, 0xb3, + 0xbe, 0x3a, 0xdf, 0xaa, 0xf1, 0x4f, 0xe9, 0x73, 0xb4, 0xb5, 0x26, 0x59, + 0x64, 0x89, 0x92, 0xa6, 0x31, 0x59, 0x02, 0x2b, 0x14, 0x81, 0x0a, 0xac, + 0xae, 0x2a, 0x2b, 0x2a, 0x29, 0x29, 0x5a, 0x23, 0x2d, 0x70, 0x37, 0xf3, + 0xb2, 0x67, 0x11, 0x50, 0x61, 0x6f, 0x90, 0xc7, 0xd0, 0xcd, 0x9d, 0xb2, + 0xa5, 0xd2, 0x64, 0xaa, 0x8f, 0x4d, 0xcf, 0x58, 0x1a, 0xfa, 0xc4, 0xb6, + 0xf5, 0xe7, 0x15, 0x85, 0x96, 0x92, 0xa9, 0x54, 0x8b, 0x09, 0x0e, 0x3c, + 0xc7, 0xa3, 0x8f, 0x9a, 0xef, 0xc6, 0xbc, 0xe9, 0x4a, 0x0e, 0x5b, 0x97, + 0xdd, 0xf9, 0x7d, 0x1e, 0x8b, 0x8f, 0x5e, 0x9c, 0xba, 0x13, 0x5c, 0xba, + 0xcd, 0x15, 0x72, 0x16, 0x2b, 0x2d, 0x84, 0x46, 0xcf, 0xcb, 0xf7, 0x3e, + 0x41, 0x22, 0x39, 0x55, 0x95, 0x9f, 0x5d, 0xe7, 0xbf, 0xbf, 0x6d, 0x74, + 0x0b, 0x18, 0x82, 0xd3, 0x10, 0x9a, 0x9c, 0xb5, 0x4b, 0x5c, 0xbf, 0x2d, + 0xf8, 0x7f, 0xa0, 0xf3, 0x9f, 0x37, 0xd0, 0x64, 0xf3, 0x67, 0xd2, 0x3d, + 0x04, 0x8c, 0x9e, 0x9f, 0xf5, 0x3f, 0x9c, 0xb3, 0xb7, 0x17, 0x64, 0x0b, + 0x2c, 0x9d, 0x93, 0x8c, 0xc3, 0x4c, 0x35, 0x1d, 0x49, 0x9e, 0x57, 0x37, + 0xc8, 0xb3, 0xc2, 0xd4, 0xb9, 0x5a, 0x02, 0x22, 0x44, 0x81, 0x13, 0xd4, + 0x7c, 0xcf, 0x47, 0xd6, 0xbf, 0x11, 0xf4, 0xe9, 0xb8, 0xab, 0xa6, 0x00, + 0xb0, 0xd4, 0x97, 0x6c, 0x75, 0xff, 0x00, 0x55, 0xe2, 0x9f, 0xd3, 0xe7, + 0x69, 0x6a, 0x4c, 0x9d, 0x4d, 0x26, 0xad, 0x25, 0x40, 0x54, 0x08, 0x91, + 0x48, 0x10, 0xa8, 0x15, 0xc5, 0x75, 0x54, 0x56, 0x54, 0x52, 0x52, 0x50, + 0xbc, 0x1d, 0x7c, 0xfe, 0x5c, 0xe6, 0x84, 0x35, 0x75, 0xe4, 0x31, 0xf4, + 0x72, 0xe7, 0xa3, 0x2f, 0xc6, 0xb5, 0x96, 0x45, 0xa7, 0x46, 0xb9, 0x79, + 0xd7, 0xa8, 0xaf, 0x59, 0xd3, 0x35, 0xd9, 0x5d, 0x58, 0x5b, 0x45, 0x49, + 0x2c, 0x59, 0x0e, 0x3c, 0xc7, 0xa3, 0x87, 0x9a, 0xed, 0xca, 0xb9, 0xa2, + 0x51, 0x5c, 0x5c, 0xbe, 0xef, 0xcb, 0xe8, 0xf4, 0x5c, 0x7a, 0xf4, 0x63, + 0x41, 0xa9, 0x75, 0x9a, 0x12, 0xd2, 0x56, 0x16, 0x4c, 0x81, 0x0d, 0x67, + 0xe0, 0x9c, 0xda, 0x99, 0xc0, 0x64, 0xac, 0x1a, 0x9c, 0x69, 0xaf, 0xa0, + 0x66, 0xfd, 0xfb, 0x4b, 0x56, 0x12, 0xc4, 0xae, 0x5a, 0x65, 0x94, 0xb5, + 0xcb, 0x44, 0x42, 0x5f, 0x9c, 0x7c, 0x3f, 0xd0, 0x79, 0xaf, 0x9b, 0xe9, + 0x96, 0x53, 0xd2, 0x4a, 0xac, 0x2c, 0x86, 0x5e, 0xab, 0xf5, 0x9f, 0x99, + 0x7d, 0x39, 0x96, 0x56, 0x3b, 0x3a, 0x09, 0x5a, 0xd5, 0x66, 0x73, 0x32, + 0x46, 0xaf, 0x4f, 0x9e, 0xcb, 0xc9, 0x4e, 0x3d, 0x95, 0xd0, 0x80, 0x88, + 0x88, 0x89, 0x03, 0xd2, 0x7c, 0xee, 0xff, 0x00, 0x5d, 0xfc, 0x37, 0xd3, + 0xa7, 0x58, 0x8e, 0xf2, 0x58, 0xa9, 0x5c, 0xbe, 0xd9, 0xeb, 0x7e, 0xa7, + 0xc7, 0x77, 0xd4, 0xe5, 0x61, 0x62, 0x4c, 0x99, 0x3b, 0x24, 0xad, 0x25, + 0x4c, 0x55, 0x01, 0x11, 0x48, 0x90, 0x20, 0x41, 0x2b, 0x2b, 0x5a, 0xea, + 0xb8, 0xa8, 0xa4, 0xa4, 0xe0, 0xef, 0xe7, 0xe0, 0x9c, 0xa0, 0xb1, 0x22, + 0xa8, 0xf2, 0x9c, 0xfe, 0x96, 0x4c, 0xf4, 0x0d, 0xd9, 0xd7, 0x5a, 0xca, + 0x9a, 0xb7, 0x1a, 0xd1, 0xd7, 0x8f, 0x96, 0x9b, 0xd0, 0x7d, 0x6a, 0x69, + 0xf4, 0xe7, 0x09, 0xa7, 0x52, 0xb2, 0x55, 0x34, 0xb1, 0x64, 0x11, 0xe6, + 0x7d, 0x1c, 0x3c, 0xcf, 0x6e, 0x70, 0xcd, 0x6a, 0x95, 0xc5, 0xcb, 0xee, + 0xfc, 0xbe, 0x9f, 0x45, 0xc7, 0xa7, 0x42, 0x34, 0x1a, 0xcd, 0x45, 0xe5, + 0xa4, 0xac, 0x95, 0x93, 0xb2, 0x47, 0x25, 0x3e, 0x31, 0x87, 0xd0, 0xf5, + 0x80, 0x0f, 0x2f, 0xa7, 0xca, 0xb3, 0xaf, 0xa2, 0x65, 0xf7, 0x5d, 0x34, + 0x5b, 0x4c, 0xb5, 0xcb, 0x54, 0x55, 0x35, 0x19, 0x67, 0x2e, 0x32, 0x12, + 0xfc, 0xff, 0x00, 0xe2, 0x7d, 0xff, 0x00, 0x39, 0xf2, 0xbd, 0x76, 0x12, + 0xa4, 0x46, 0x48, 0xd9, 0x18, 0xf5, 0x7f, 0xae, 0xfc, 0xc3, 0xde, 0x20, + 0x08, 0x6a, 0x74, 0xa3, 0x29, 0x1d, 0x4c, 0x85, 0x28, 0x1b, 0x0f, 0x94, + 0xd5, 0x51, 0x9b, 0x3b, 0xe6, 0xef, 0x15, 0x5c, 0x02, 0x22, 0x22, 0x24, + 0xe3, 0xd1, 0x78, 0x3b, 0xfd, 0x5f, 0xf0, 0xdf, 0x4a, 0x9d, 0x60, 0xd4, + 0x96, 0xa4, 0x6c, 0x86, 0xb2, 0xfa, 0x67, 0xab, 0xfa, 0x8f, 0x26, 0x8f, + 0xab, 0xca, 0xc4, 0x99, 0x32, 0x64, 0xc9, 0x53, 0x49, 0x50, 0x15, 0x14, + 0x44, 0x48, 0xd4, 0x62, 0x05, 0x69, 0x0a, 0x84, 0x56, 0xb5, 0xd5, 0x71, + 0x51, 0x49, 0xe7, 0xb7, 0xf3, 0xb9, 0xee, 0x6e, 0x15, 0xa8, 0xa5, 0x71, + 0xf9, 0xfe, 0x9b, 0xce, 0xeb, 0xab, 0xec, 0xe1, 0xda, 0x65, 0x16, 0xba, + 0x5b, 0xc7, 0x12, 0x6f, 0x3d, 0x9f, 0x4f, 0xe7, 0xd3, 0xa3, 0xdb, 0x9d, + 0xa4, 0x26, 0xac, 0xd6, 0x65, 0x53, 0x4b, 0x16, 0x48, 0x4b, 0xe6, 0xfb, + 0xf0, 0xf2, 0xfd, 0xb1, 0x08, 0x14, 0x50, 0xba, 0x5f, 0x79, 0xe5, 0xf4, + 0xfa, 0x5e, 0x3b, 0xdc, 0xba, 0x4d, 0x71, 0xa5, 0x2f, 0xab, 0x49, 0x97, + 0x6b, 0x33, 0x49, 0xd9, 0xe6, 0x32, 0xcb, 0x73, 0xa9, 0x27, 0x05, 0x56, + 0x73, 0xcd, 0xd2, 0xec, 0xce, 0xbd, 0x1e, 0x90, 0x5a, 0x33, 0x69, 0x5a, + 0x16, 0x12, 0xcf, 0x37, 0x2c, 0xb5, 0x2f, 0x81, 0xf8, 0x7f, 0x77, 0xcc, + 0xfc, 0x9f, 0x6c, 0xc6, 0x29, 0x00, 0xd0, 0xb9, 0xf5, 0x9f, 0xaf, 0xfc, + 0xca, 0xd6, 0x60, 0x86, 0xa7, 0x42, 0x33, 0x91, 0xb2, 0x8b, 0x33, 0x96, + 0xa5, 0x2b, 0xe5, 0xf1, 0x7c, 0x96, 0xb3, 0x9e, 0xc7, 0xe2, 0xf5, 0x51, + 0xe9, 0xe3, 0xdc, 0xe1, 0xd3, 0x2f, 0xa3, 0x85, 0x98, 0x92, 0xd9, 0xd9, + 0xa4, 0xb2, 0x5d, 0x9e, 0x5e, 0x9e, 0xd7, 0xf1, 0x3f, 0x46, 0x37, 0x0a, + 0xa3, 0xa9, 0x1d, 0xe0, 0xd4, 0x76, 0x75, 0x3f, 0x4f, 0xe4, 0xd3, 0xf5, + 0x39, 0x58, 0x4e, 0xa6, 0x4c, 0x95, 0x92, 0x24, 0x3a, 0x02, 0xa8, 0xb9, + 0x94, 0xa1, 0x1a, 0x44, 0x52, 0x24, 0x08, 0x10, 0x20, 0x56, 0x52, 0x52, + 0x79, 0xcd, 0xfc, 0xee, 0x6c, 0xc4, 0x42, 0x12, 0xd5, 0x6d, 0x7e, 0x6f, + 0xa5, 0x65, 0xdc, 0x73, 0x69, 0x9a, 0xc5, 0x4e, 0x20, 0x15, 0xc5, 0xd4, + 0xbe, 0xbb, 0x76, 0xfa, 0x9c, 0xeb, 0x6f, 0x4c, 0x6c, 0x5a, 0xea, 0xfb, + 0x1a, 0x4d, 0x66, 0x28, 0xf2, 0x7e, 0x8f, 0x3f, 0x07, 0xb6, 0x14, 0xb0, + 0x52, 0x50, 0x9c, 0xbf, 0x40, 0xf2, 0xfa, 0x7d, 0x3f, 0x1d, 0xe9, 0x5d, + 0x89, 0xb4, 0xd2, 0x5f, 0x65, 0xc5, 0x85, 0xe8, 0xf5, 0x9c, 0x13, 0x30, + 0x4a, 0xc8, 0x90, 0x00, 0x89, 0x12, 0x26, 0x4a, 0x6b, 0x55, 0x59, 0x35, + 0x4a, 0xe6, 0x96, 0x13, 0x51, 0x96, 0x89, 0x68, 0x8f, 0x0d, 0xf1, 0x3e, + 0xef, 0x97, 0xf9, 0x1e, 0xe3, 0x26, 0x3b, 0x01, 0xd8, 0xac, 0xf5, 0xbf, + 0xaf, 0xfc, 0xc9, 0xbc, 0xab, 0x26, 0x6d, 0x67, 0x8c, 0xba, 0x75, 0x9c, + 0xc9, 0x32, 0x0b, 0xa2, 0x3c, 0x06, 0x66, 0x0b, 0x39, 0x5a, 0x9b, 0xf3, + 0x78, 0xf5, 0xdb, 0x8d, 0xde, 0x7d, 0x3f, 0x46, 0x34, 0x72, 0xd6, 0xec, + 0xab, 0x8c, 0x9d, 0xa5, 0xbe, 0x6e, 0x9e, 0xbb, 0xf1, 0x3f, 0x46, 0x1d, + 0x39, 0xd7, 0x64, 0x75, 0x1d, 0x8e, 0xc7, 0xa9, 0xd5, 0xfd, 0x2f, 0x93, + 0x4f, 0xd5, 0xe5, 0x32, 0x64, 0xaa, 0x64, 0x87, 0x42, 0x14, 0xac, 0x49, + 0xe7, 0x7b, 0xfc, 0x78, 0x4e, 0x9e, 0x93, 0x9f, 0xd1, 0xb2, 0x6d, 0x11, + 0x22, 0x40, 0x81, 0x02, 0xb2, 0xb2, 0x92, 0x93, 0xcd, 0x6f, 0xe6, 0xf3, + 0x26, 0x22, 0x0a, 0x8a, 0x95, 0xf9, 0xfe, 0x9e, 0x5c, 0x75, 0x16, 0xf4, + 0x63, 0x95, 0x54, 0x0a, 0x0c, 0x56, 0xee, 0xd4, 0xbb, 0xcf, 0xdb, 0xd1, + 0x7a, 0xf8, 0xdb, 0x67, 0x53, 0x4b, 0x33, 0x64, 0x3b, 0x10, 0xcf, 0x19, + 0xea, 0xf3, 0x71, 0xba, 0x64, 0x94, 0x05, 0x25, 0x72, 0xfd, 0x0f, 0xcb, + 0xe8, 0xf5, 0x1c, 0x7a, 0x5a, 0x9d, 0x03, 0x79, 0xba, 0xcd, 0x5a, 0x97, + 0xd9, 0x42, 0x62, 0x92, 0x99, 0x1c, 0xa8, 0x42, 0x10, 0x0c, 0x68, 0xd6, + 0x50, 0x52, 0x2b, 0x21, 0x2d, 0x13, 0x6e, 0x6a, 0xf9, 0x73, 0x95, 0xcb, + 0xe2, 0x3e, 0x27, 0xdd, 0xf2, 0xdf, 0x1b, 0xde, 0x64, 0x00, 0x23, 0xdc, + 0x67, 0xae, 0xfd, 0x87, 0xe6, 0x67, 0xd3, 0x9c, 0x23, 0x4d, 0x99, 0xac, + 0x76, 0x42, 0xc2, 0x58, 0x12, 0x8c, 0x7c, 0xfa, 0x78, 0xad, 0x72, 0xcb, + 0x4c, 0x9c, 0x79, 0xfa, 0xf4, 0xf2, 0x65, 0xe7, 0x75, 0x91, 0xe9, 0x33, + 0x57, 0x42, 0x4b, 0x57, 0x4f, 0x97, 0x7e, 0x8f, 0xf1, 0x3f, 0x4a, 0x3d, + 0xb9, 0x46, 0xc8, 0xd8, 0x0d, 0x1e, 0xa7, 0x5b, 0xf4, 0xde, 0x4d, 0x3f, + 0x5b, 0x94, 0xc9, 0x93, 0x49, 0x2c, 0xac, 0xad, 0x9f, 0x2b, 0xd7, 0xe6, + 0xcf, 0x5c, 0xef, 0xa9, 0x25, 0xd9, 0xeb, 0xb2, 0xcc, 0x9a, 0xe5, 0x39, + 0xd6, 0xf9, 0xdb, 0x46, 0x7d, 0x16, 0xce, 0x91, 0x96, 0x09, 0x05, 0xad, + 0x20, 0x55, 0x54, 0xaf, 0x97, 0xdf, 0xcc, 0xe5, 0x4c, 0x29, 0x52, 0xa2, + 0xaa, 0xf4, 0x7c, 0xfe, 0x8c, 0xf3, 0xd7, 0x04, 0xc6, 0x0e, 0x9e, 0x3a, + 0xb7, 0xcb, 0x4e, 0x7a, 0x0b, 0x9e, 0xe2, 0x89, 0xaa, 0xba, 0x7a, 0xcf, + 0x46, 0x2c, 0xf2, 0xf6, 0xd9, 0xe3, 0xf4, 0xe8, 0xf5, 0x71, 0xb7, 0x1a, + 0xd9, 0x2e, 0xf9, 0xad, 0xd6, 0x54, 0x85, 0x78, 0xaf, 0x67, 0x93, 0x9d, + 0xb9, 0x19, 0x40, 0x55, 0x2c, 0xcf, 0xa3, 0x79, 0x3d, 0x3e, 0x9f, 0x96, + 0xec, 0x37, 0x1d, 0x0b, 0x85, 0x61, 0xc3, 0xbe, 0x0f, 0x17, 0xbb, 0x4f, + 0xb3, 0xc3, 0x77, 0x6e, 0x0d, 0x31, 0xaf, 0x9c, 0xce, 0xf5, 0x4d, 0xfa, + 0x5d, 0xf0, 0xb4, 0xd9, 0xab, 0x87, 0x32, 0x2a, 0xe0, 0x44, 0xb1, 0x58, + 0xa5, 0x65, 0x45, 0x0b, 0x5c, 0xb2, 0x9a, 0x94, 0xbe, 0x4b, 0xe2, 0x7d, + 0xdf, 0x29, 0xf0, 0xfe, 0x91, 0x20, 0x03, 0xa3, 0x50, 0x4f, 0x5f, 0xfa, + 0xff, 0x00, 0xcd, 0x9d, 0x78, 0xce, 0xc9, 0x55, 0x89, 0x1b, 0x25, 0x2d, + 0x38, 0xdd, 0x56, 0x73, 0x8f, 0x3d, 0xce, 0xe7, 0xe9, 0xce, 0xd2, 0x51, + 0xab, 0xc5, 0xbf, 0x01, 0xef, 0xe7, 0xdf, 0x48, 0xe1, 0x23, 0xab, 0x57, + 0x69, 0xd4, 0xde, 0x77, 0xea, 0x69, 0xf3, 0xeb, 0x3f, 0xe0, 0x3e, 0xb4, + 0x3b, 0x72, 0x2c, 0x2c, 0x28, 0x45, 0xa9, 0xd7, 0xfd, 0x37, 0x93, 0x5f, + 0xd6, 0xe3, 0x62, 0xc9, 0x26, 0x4a, 0xa4, 0x71, 0xb5, 0xe6, 0xf3, 0xdb, + 0xf0, 0x4e, 0xd6, 0x96, 0x56, 0xc6, 0xb6, 0xeb, 0x14, 0xdc, 0xc4, 0x8a, + 0x65, 0x44, 0xd5, 0xf9, 0xed, 0x74, 0xed, 0x6c, 0xe9, 0x6c, 0xe9, 0x29, + 0xb4, 0x52, 0x79, 0x2d, 0xfc, 0xde, 0x54, 0xc2, 0x55, 0x2c, 0x16, 0xba, + 0xd3, 0x3a, 0x2b, 0x84, 0x91, 0x5e, 0x8e, 0x7b, 0x73, 0xb5, 0xca, 0x23, + 0x5b, 0x35, 0xdf, 0x9d, 0xe8, 0xe9, 0x22, 0x41, 0x63, 0x19, 0x29, 0x74, + 0x66, 0xe9, 0x96, 0xc9, 0x67, 0x9b, 0xe7, 0xfb, 0x71, 0xad, 0x54, 0xd2, + 0x05, 0x09, 0xcb, 0xdc, 0xcb, 0xbf, 0xc7, 0xa7, 0x77, 0x96, 0xe8, 0xe9, + 0x8a, 0xba, 0x63, 0xaf, 0xcb, 0xa7, 0x98, 0xfc, 0xa7, 0xeb, 0xb5, 0xfc, + 0xdf, 0x6f, 0x47, 0x3d, 0x37, 0x75, 0xe5, 0xaf, 0xd7, 0xe4, 0xe3, 0xfa, + 0x7c, 0xa7, 0x97, 0xb7, 0x3b, 0xec, 0xfc, 0x5f, 0x75, 0xea, 0xe3, 0x5f, + 0xcc, 0xfa, 0xb4, 0x7c, 0x9f, 0xa7, 0x3e, 0xbc, 0xf5, 0x7a, 0x7c, 0xd2, + 0xd4, 0xc5, 0xe3, 0xf6, 0xd5, 0xe6, 0xf4, 0xc3, 0x1d, 0x76, 0x7e, 0xaf, + 0xf2, 0x36, 0xfa, 0xfc, 0x54, 0xe7, 0x55, 0x73, 0xed, 0x4f, 0x2e, 0xc7, + 0xab, 0xc5, 0x55, 0x9e, 0x6f, 0xe1, 0xfd, 0xef, 0x39, 0xf0, 0x7e, 0xab, + 0xb0, 0x04, 0x05, 0x60, 0x9d, 0xdf, 0xd6, 0xfe, 0x73, 0x5f, 0xa7, 0x84, + 0xc9, 0x81, 0x13, 0x2e, 0x35, 0x95, 0x69, 0x5e, 0x13, 0x94, 0x39, 0xeb, + 0x57, 0x87, 0xdd, 0x74, 0xe9, 0x3e, 0x9f, 0x37, 0xd5, 0x7e, 0x57, 0xd3, + 0xf1, 0x8f, 0xdb, 0x79, 0x3a, 0xde, 0x77, 0xbb, 0xf8, 0x7d, 0xf5, 0x70, + 0xd6, 0xed, 0xe1, 0xfd, 0x3e, 0x4b, 0xdd, 0xcc, 0xf6, 0xf3, 0x8e, 0x35, + 0x8b, 0xf0, 0x3f, 0x56, 0x3d, 0xb9, 0x9a, 0xc9, 0x44, 0x8a, 0xc7, 0x67, + 0x67, 0xf4, 0x9e, 0x5d, 0x7f, 0x63, 0x8c, 0xc9, 0x96, 0x62, 0xe9, 0xf0, + 0x74, 0xd9, 0xf2, 0x7a, 0xd5, 0xe3, 0x78, 0x3f, 0xd5, 0xfc, 0x7e, 0x67, + 0xbb, 0xcc, 0x51, 0x51, 0x93, 0xa9, 0xb9, 0xa6, 0xc7, 0x64, 0x12, 0xa4, + 0xa0, 0x8d, 0x40, 0xae, 0x48, 0x15, 0xd2, 0x9a, 0x81, 0x86, 0x67, 0x1e, + 0x77, 0x19, 0xa4, 0xa9, 0x6b, 0x4c, 0xb3, 0xa4, 0xd6, 0xc4, 0xb2, 0xcd, + 0x12, 0xc2, 0xb3, 0x75, 0xeb, 0x56, 0xfa, 0x5a, 0xe9, 0x9f, 0x79, 0x99, + 0x22, 0x55, 0x24, 0x06, 0xa2, 0x0a, 0x04, 0x61, 0xb9, 0xb2, 0x6a, 0x32, + 0xa9, 0x41, 0x2c, 0xce, 0x9a, 0x5f, 0x64, 0xcb, 0xd7, 0xd6, 0x71, 0xdf, + 0x9a, 0xef, 0xcf, 0x0f, 0x1e, 0xf0, 0xf9, 0x9f, 0x4e, 0x5f, 0x23, 0xe9, + 0xf5, 0x3e, 0x67, 0xd0, 0xe8, 0x70, 0xeb, 0xbb, 0x3b, 0xd5, 0x9d, 0x5d, + 0x9b, 0x6c, 0xd4, 0xa5, 0x64, 0xa1, 0xd3, 0xa7, 0xa8, 0xec, 0x54, 0xba, + 0xf3, 0x8d, 0x43, 0x1a, 0xae, 0xca, 0xee, 0x7a, 0x1f, 0x63, 0xe3, 0xf1, + 0xf9, 0x74, 0xe5, 0xf8, 0xfd, 0x3c, 0x4f, 0x9f, 0xe8, 0x2c, 0x76, 0x10, + 0x6a, 0x08, 0x8f, 0x45, 0xfa, 0xdf, 0xcd, 0xe8, 0xf6, 0x79, 0x60, 0x57, + 0x2d, 0x7c, 0xfa, 0x55, 0xcb, 0xa4, 0x38, 0x77, 0xaf, 0x87, 0x78, 0x79, + 0x7d, 0x10, 0xf2, 0xfa, 0x7c, 0xe7, 0xb7, 0xc9, 0x76, 0x34, 0xab, 0x5f, + 0xa7, 0xe6, 0x63, 0xe5, 0x3c, 0x97, 0xd4, 0xf2, 0xfd, 0xa7, 0xf1, 0xbe, + 0xce, 0x17, 0xd0, 0xe7, 0xc7, 0xf6, 0xf3, 0xed, 0x79, 0x37, 0xeb, 0x3e, + 0x4f, 0x4d, 0x58, 0xb3, 0x8a, 0x36, 0xf3, 0xf8, 0xea, 0xbb, 0xf2, 0x37, + 0x04, 0x02, 0x49, 0x61, 0xe9, 0x3e, 0x9f, 0x1e, 0xb7, 0xa2, 0x4f, 0xc9, + 0xb7, 0xe2, 0xdd, 0xfe, 0x3e, 0x86, 0x68, 0x15, 0xcb, 0xfa, 0xde, 0x4f, + 0x07, 0xfb, 0xaf, 0xce, 0xc2, 0xb3, 0x4d, 0x79, 0xfc, 0xaf, 0xb3, 0xa7, + 0x67, 0x47, 0x53, 0x56, 0xa4, 0xec, 0xad, 0x9a, 0xec, 0x81, 0x51, 0x5a, + 0x40, 0x80, 0x33, 0x9a, 0x5e, 0x6e, 0x77, 0x44, 0xdc, 0x06, 0xb0, 0x23, + 0x35, 0x75, 0x5e, 0x97, 0x2b, 0x28, 0xde, 0xe8, 0xed, 0xdd, 0x6b, 0x51, + 0x58, 0x09, 0x44, 0x90, 0xc6, 0x03, 0x50, 0x44, 0x63, 0x25, 0xcd, 0xb3, + 0x4a, 0x58, 0xaa, 0x14, 0x49, 0x7a, 0x77, 0x37, 0x13, 0xab, 0x93, 0xaf, + 0xcf, 0x78, 0xf7, 0x88, 0x68, 0xe5, 0xcd, 0x35, 0xde, 0xf9, 0x7f, 0x43, + 0x3f, 0x97, 0xd5, 0x97, 0xc9, 0xea, 0x87, 0x8f, 0xd9, 0x7f, 0x8b, 0xd5, + 0xaf, 0xcd, 0xdf, 0x46, 0x77, 0x76, 0x6d, 0xd5, 0x39, 0x66, 0xae, 0x1c, + 0x14, 0xa2, 0x05, 0x65, 0x31, 0x8a, 0xcc, 0xb6, 0x5f, 0xa8, 0xd3, 0x97, + 0x9e, 0x65, 0x8e, 0xc0, 0x10, 0xd4, 0x51, 0xd2, 0xea, 0xbb, 0x76, 0xb8, + 0x58, 0xd2, 0x95, 0x42, 0xa4, 0x8a, 0x3c, 0xc7, 0xd6, 0xf9, 0xdd, 0xdf, + 0x9b, 0xed, 0x9f, 0x3e, 0x95, 0xd8, 0xb7, 0x9d, 0x38, 0xd5, 0x99, 0xf9, + 0xde, 0x83, 0xc9, 0xe2, 0xd5, 0x73, 0x2b, 0x9e, 0x37, 0xb7, 0x97, 0x91, + 0xfb, 0x1c, 0xbd, 0x7f, 0xca, 0xeb, 0xdf, 0xf9, 0xbd, 0x14, 0x79, 0xed, + 0xf4, 0x5d, 0xf9, 0xbb, 0x1a, 0x30, 0xca, 0x5c, 0x5e, 0xc3, 0x85, 0xed, + 0x6c, 0x44, 0x73, 0x5d, 0x4e, 0xc7, 0x4e, 0x9f, 0xa7, 0x3c, 0xbf, 0xdc, + 0x7c, 0x8f, 0x13, 0xef, 0xf9, 0x78, 0x56, 0x77, 0x1c, 0x89, 0xac, 0x91, + 0x54, 0x0d, 0x6f, 0xad, 0x76, 0x5d, 0x72, 0xec, 0x85, 0xcd, 0x44, 0x12, + 0xb2, 0xd4, 0x99, 0x52, 0x52, 0x54, 0x46, 0x69, 0x4d, 0xb9, 0xd2, 0xbb, + 0xcc, 0x69, 0x4a, 0x0a, 0x82, 0x17, 0x75, 0xef, 0xa4, 0x37, 0xd2, 0xbd, + 0x6e, 0xaa, 0x84, 0x0a, 0x80, 0x4a, 0x88, 0xc5, 0x4b, 0x0b, 0x8b, 0x66, + 0x94, 0xa8, 0x88, 0x81, 0x7a, 0x29, 0x7d, 0x97, 0x54, 0xc9, 0xc3, 0xb2, + 0x4b, 0x68, 0x4b, 0xeb, 0x3c, 0x3e, 0xae, 0xcf, 0x1d, 0xc0, 0xa8, 0xc6, + 0xd7, 0x37, 0xc3, 0xf4, 0x0f, 0xc6, 0x7e, 0xaa, 0x19, 0xd5, 0x09, 0x5d, + 0x16, 0x21, 0x54, 0x8d, 0x31, 0xa9, 0x68, 0xed, 0x8b, 0x71, 0x65, 0x8d, + 0x4b, 0x71, 0x6f, 0x38, 0x24, 0xe3, 0xe7, 0x9b, 0xd6, 0x4b, 0x0a, 0x10, + 0xb1, 0x1a, 0x9b, 0xb7, 0xa0, 0x87, 0x61, 0x0b, 0x34, 0x15, 0x95, 0xef, + 0x3c, 0xfe, 0xbc, 0xb7, 0x79, 0xfa, 0xc7, 0xa1, 0xe2, 0x68, 0xe5, 0xe6, + 0xe8, 0xf0, 0xf3, 0x6e, 0xbe, 0x49, 0xb3, 0x38, 0x3a, 0x48, 0x76, 0x5b, + 0xe6, 0xbf, 0x2d, 0xfd, 0x47, 0x93, 0xe8, 0xbf, 0x99, 0xf5, 0x3e, 0x1b, + 0xc7, 0xdc, 0xfb, 0xf3, 0x94, 0x8e, 0x25, 0x9a, 0xf8, 0xac, 0xf3, 0xeb, + 0xd7, 0x79, 0xef, 0x5b, 0xb6, 0x4d, 0x49, 0xe8, 0xd1, 0x8c, 0x74, 0x6a, + 0x2e, 0xb9, 0xf3, 0x1f, 0xa9, 0xf9, 0x3e, 0x77, 0xf4, 0x7f, 0x2d, 0xa2, + 0x11, 0x0b, 0x38, 0xd3, 0xa6, 0xee, 0x3f, 0x47, 0x2d, 0xc5, 0x37, 0x92, + 0xbc, 0xdd, 0xc3, 0xb9, 0x76, 0x2b, 0x9d, 0x8b, 0x64, 0xd4, 0xe6, 0xec, + 0x9b, 0xb2, 0x74, 0xb6, 0x75, 0x93, 0x7e, 0x77, 0xa7, 0xcd, 0xcc, 0xc4, + 0x15, 0x2a, 0x10, 0xc1, 0x45, 0x73, 0x45, 0xba, 0x27, 0xb7, 0x17, 0x69, + 0x8f, 0xa4, 0xae, 0xc8, 0x2c, 0x48, 0x45, 0x6b, 0x9a, 0x48, 0xd9, 0x74, + 0xd0, 0xa8, 0x89, 0x5c, 0x33, 0xa7, 0xac, 0xe8, 0x2e, 0x2c, 0x19, 0x22, + 0x64, 0x95, 0x9d, 0x3e, 0x1d, 0xbd, 0xaf, 0x8b, 0xb9, 0x00, 0x2f, 0x3f, + 0xe1, 0xfd, 0xea, 0xbf, 0x3b, 0xf7, 0x8c, 0x52, 0x90, 0x05, 0x10, 0x0c, + 0x35, 0x0a, 0xcc, 0x8f, 0xd9, 0xe6, 0x5e, 0x2f, 0x55, 0x26, 0x0c, 0xb9, + 0x5a, 0xe0, 0x6f, 0x26, 0xa0, 0x85, 0x86, 0xa2, 0x96, 0x53, 0x57, 0x68, + 0xf3, 0xab, 0x69, 0xd8, 0x44, 0x82, 0x08, 0x08, 0xf5, 0xe5, 0xbf, 0x5f, + 0x33, 0xa1, 0xe5, 0xf3, 0x3c, 0xc0, 0x51, 0x19, 0x0a, 0xab, 0xeb, 0xf0, + 0xc5, 0xfa, 0x7f, 0x29, 0xe2, 0xe9, 0xcd, 0xf3, 0x6b, 0xce, 0x79, 0xba, + 0x7b, 0x3f, 0xca, 0x7b, 0x27, 0xf4, 0x79, 0x4f, 0x79, 0x9c, 0x92, 0xe7, + 0x65, 0xe4, 0xd5, 0x9e, 0x4d, 0x5f, 0xe7, 0xd7, 0xac, 0x4e, 0x87, 0xab, + 0x12, 0xe9, 0x25, 0xd2, 0x4a, 0x9e, 0xe1, 0x51, 0xd3, 0x1f, 0x5c, 0x72, + 0xbd, 0x9c, 0x39, 0xfe, 0xef, 0x3f, 0x3b, 0xf5, 0x3f, 0x1e, 0xbe, 0xb8, + 0x00, 0x8d, 0x99, 0x13, 0xa3, 0x8f, 0x6f, 0x7f, 0x1e, 0xc8, 0x88, 0x44, + 0x44, 0x21, 0x11, 0x22, 0x44, 0x8a, 0xd3, 0x73, 0xe6, 0xba, 0xfc, 0xbc, + 0x8e, 0x70, 0x58, 0xca, 0x11, 0x05, 0x01, 0x5a, 0xb5, 0x6d, 0x75, 0x31, + 0xeb, 0xea, 0xe7, 0xd0, 0x2e, 0x5d, 0x4c, 0x9b, 0xce, 0x5d, 0x4c, 0x9a, + 0xce, 0x5d, 0x4c, 0xb6, 0x66, 0xaa, 0x86, 0x59, 0x17, 0xcb, 0xbb, 0x37, + 0xa3, 0x9b, 0xc8, 0xe9, 0x8a, 0xfa, 0x66, 0xf9, 0x64, 0x04, 0x86, 0x32, + 0x4b, 0xa7, 0x97, 0x4f, 0x7d, 0xe0, 0xf4, 0x0a, 0xc2, 0x5e, 0x3f, 0xe4, + 0xbf, 0x61, 0x2f, 0x07, 0xaa, 0x53, 0x4c, 0x52, 0x16, 0x96, 0x12, 0x90, + 0x58, 0x68, 0x11, 0xcd, 0x5e, 0xcf, 0x1e, 0xbf, 0xd2, 0x7e, 0x7e, 0x9f, + 0x27, 0xab, 0x93, 0xf3, 0xfd, 0xfc, 0x2f, 0x9d, 0xea, 0x37, 0x85, 0x60, + 0x1a, 0x8b, 0x35, 0x73, 0xdd, 0x99, 0xd5, 0xfb, 0x92, 0x95, 0xe7, 0x52, + 0x17, 0xab, 0x89, 0xdf, 0x83, 0xf4, 0xf9, 0xa7, 0xe9, 0xf3, 0x59, 0xea, + 0xf2, 0x6c, 0xd7, 0x9f, 0xa5, 0xf9, 0x6f, 0x5a, 0xe1, 0x4c, 0xd5, 0x94, + 0x51, 0x10, 0x4c, 0x9f, 0x73, 0x86, 0x6f, 0xd1, 0xf9, 0x91, 0x18, 0xf1, + 0xd1, 0xd6, 0xe3, 0xbe, 0xef, 0xc9, 0xed, 0x3e, 0x6b, 0x23, 0x4f, 0xcc, + 0xeb, 0xa7, 0xc5, 0xbd, 0xdc, 0x2f, 0x50, 0xdf, 0xe9, 0xc3, 0xed, 0x95, + 0xda, 0x57, 0xdb, 0x34, 0xf7, 0xcd, 0x1e, 0x9c, 0xf1, 0x3d, 0xde, 0x0a, + 0xbe, 0xa7, 0x82, 0x3e, 0x8e, 0x2a, 0xc5, 0x49, 0x22, 0xa0, 0x08, 0xa6, + 0xe7, 0x19, 0xea, 0x79, 0x7d, 0x5d, 0xb3, 0xaa, 0x11, 0x11, 0x08, 0x44, + 0x48, 0x88, 0xa6, 0xe7, 0xcf, 0x75, 0xf9, 0xb8, 0x6f, 0x18, 0x4b, 0x12, + 0x32, 0xa0, 0x12, 0xa1, 0xab, 0x59, 0x2c, 0x97, 0xa7, 0x8f, 0x5f, 0x4b, + 0x3e, 0x89, 0x4d, 0x30, 0xb4, 0x84, 0x02, 0xb1, 0x08, 0x63, 0x24, 0x59, + 0x2f, 0x03, 0xbf, 0x2f, 0x29, 0xea, 0xe3, 0xa6, 0x2c, 0x96, 0x54, 0x44, + 0x86, 0x31, 0xa9, 0x2f, 0xd0, 0x3e, 0x77, 0xae, 0xfc, 0x85, 0xa7, 0xcf, + 0xe9, 0xe6, 0x7e, 0x3f, 0xf5, 0xf6, 0xe3, 0x6f, 0x35, 0x80, 0x85, 0x0e, + 0xc6, 0xa5, 0x88, 0x52, 0xa1, 0x45, 0x7b, 0xe7, 0xb3, 0xf5, 0x1f, 0x9b, + 0x7e, 0xff, 0x00, 0x0f, 0x23, 0xcb, 0xea, 0xa2, 0x6a, 0x36, 0x47, 0x51, + 0x8f, 0x97, 0x49, 0x66, 0xca, 0xe5, 0xeb, 0x33, 0xb1, 0xef, 0x0b, 0xb7, + 0x23, 0xaf, 0x0b, 0x47, 0x0e, 0x27, 0xe6, 0xde, 0xef, 0xca, 0xfb, 0x67, + 0xe3, 0xb0, 0xdc, 0x21, 0x66, 0xa4, 0x8c, 0x54, 0x98, 0xff, 0x00, 0x49, + 0xe6, 0xcb, 0xf7, 0x78, 0x15, 0x28, 0x49, 0xf3, 0xea, 0xf7, 0xf9, 0xbd, + 0x09, 0x2e, 0x2e, 0xab, 0xcb, 0xec, 0xba, 0xcb, 0x34, 0x9a, 0x3a, 0x76, + 0x48, 0xa2, 0xe3, 0xcb, 0x75, 0xf9, 0x5a, 0x2c, 0x28, 0x12, 0x04, 0x40, + 0x00, 0x85, 0x66, 0x66, 0x33, 0xaf, 0xb0, 0xe5, 0xf5, 0x1a, 0xa1, 0x11, + 0x10, 0x88, 0x88, 0xaa, 0xe7, 0xcf, 0xf5, 0xf9, 0x98, 0x9c, 0xab, 0x20, + 0xa8, 0x44, 0x41, 0x62, 0x12, 0x8a, 0xd6, 0x65, 0x8d, 0x75, 0xf1, 0xec, + 0xd9, 0x9e, 0xf2, 0x56, 0xb2, 0x05, 0x21, 0x00, 0x00, 0x0c, 0x99, 0xc3, + 0xeb, 0xcf, 0xc6, 0x7b, 0x3c, 0xfa, 0x25, 0xb0, 0x9a, 0xb1, 0xc3, 0x18, + 0xc6, 0x39, 0xaf, 0x55, 0xe3, 0xf4, 0x77, 0x38, 0xec, 0x8e, 0x7f, 0xc9, + 0xfb, 0x39, 0xff, 0x00, 0x37, 0xfa, 0x1b, 0x33, 0xa7, 0x28, 0x30, 0x12, + 0x10, 0xa8, 0x01, 0x40, 0x21, 0x66, 0xd1, 0x8b, 0x3f, 0xb3, 0xf2, 0x35, + 0x7e, 0x93, 0xe0, 0xd7, 0xd3, 0x9d, 0x6b, 0x11, 0x09, 0x1d, 0x82, 0x3a, + 0x10, 0x04, 0x61, 0x04, 0x5b, 0xf3, 0xfb, 0x6b, 0xfc, 0xc7, 0xb2, 0xef, + 0x2d, 0x26, 0x61, 0xa0, 0x12, 0xac, 0x84, 0xab, 0x53, 0x9d, 0xfb, 0x7f, + 0x0d, 0x5e, 0xcc, 0x42, 0x14, 0x44, 0xe7, 0x1e, 0x6b, 0xa6, 0x7e, 0x97, + 0x9b, 0xa2, 0x2d, 0x2c, 0xab, 0x2c, 0xb1, 0x25, 0x52, 0x25, 0x4d, 0x1d, + 0x79, 0xbd, 0x7c, 0xfc, 0xfd, 0x3c, 0xd6, 0x85, 0x24, 0x01, 0x62, 0x00, + 0x20, 0xaa, 0x93, 0x23, 0x3d, 0x3c, 0x7b, 0x3d, 0x16, 0x3d, 0xd1, 0x10, + 0x84, 0x21, 0x19, 0xaf, 0x3e, 0x07, 0x5f, 0x9b, 0x9a, 0xf3, 0xae, 0x58, + 0x91, 0x10, 0x08, 0x4a, 0xa5, 0x01, 0x5a, 0xb5, 0xb1, 0xae, 0x84, 0xf4, + 0xf5, 0x39, 0xfa, 0x5a, 0xc8, 0x6a, 0xc2, 0x50, 0x62, 0x00, 0x24, 0x71, + 0x3a, 0xf3, 0xf1, 0x9e, 0xce, 0x16, 0x16, 0x44, 0x89, 0x2c, 0x82, 0x18, + 0xc0, 0x63, 0x97, 0xa1, 0xc7, 0xaf, 0xb6, 0xf1, 0xf7, 0x23, 0x8b, 0xf9, + 0x8f, 0xd5, 0xd9, 0xf3, 0x7d, 0xf2, 0xc6, 0x9e, 0x6b, 0xb0, 0xa0, 0x32, + 0x54, 0x41, 0x45, 0x28, 0x29, 0x42, 0x88, 0xe6, 0xd3, 0xce, 0xd3, 0xd7, + 0x96, 0x9f, 0xd1, 0xfc, 0x2d, 0x3f, 0x6b, 0xe4, 0x2b, 0x22, 0x88, 0x54, + 0xd0, 0x00, 0x46, 0x24, 0x78, 0xd5, 0xff, 0x00, 0x07, 0xd7, 0xa7, 0xe0, + 0x7a, 0x2e, 0xe5, 0x0c, 0xc3, 0x44, 0x28, 0x21, 0xc3, 0xb2, 0x9f, 0xa1, + 0xcb, 0x9d, 0xfb, 0x7f, 0x09, 0x40, 0xe9, 0x92, 0x4b, 0x0b, 0xa2, 0x64, + 0xc9, 0x54, 0xd2, 0x44, 0x89, 0x53, 0x1a, 0x73, 0xf5, 0xc3, 0xcf, 0x74, + 0xf9, 0xba, 0x6a, 0x54, 0x80, 0x06, 0x44, 0x04, 0x02, 0x15, 0x95, 0x26, + 0x34, 0xee, 0xf3, 0xfa, 0x1d, 0xac, 0xfa, 0x90, 0x11, 0x22, 0x72, 0xba, + 0x78, 0xf9, 0x3b, 0xf1, 0xd7, 0x24, 0x08, 0x91, 0x01, 0x09, 0x62, 0x0a, + 0x08, 0x15, 0xcb, 0x25, 0xb1, 0xab, 0x1b, 0xf4, 0x3c, 0xbd, 0xe0, 0xd5, + 0xab, 0x1c, 0x0a, 0x00, 0x08, 0xf2, 0xbe, 0x9e, 0x1e, 0x6f, 0xd1, 0xca, + 0xc2, 0xc5, 0x94, 0x31, 0x92, 0x52, 0x18, 0xc0, 0x07, 0x2c, 0xa6, 0xbd, + 0xcf, 0x83, 0xd3, 0x67, 0x9b, 0xd7, 0xc9, 0xfc, 0x7f, 0xeb, 0x74, 0x63, + 0x6f, 0x9e, 0x9d, 0x38, 0x54, 0xc0, 0x20, 0xa2, 0x10, 0x52, 0x14, 0x2d, + 0x16, 0x4b, 0x2a, 0xf3, 0x69, 0xe7, 0x61, 0xeb, 0xf3, 0x6a, 0xfb, 0xff, + 0x00, 0x13, 0x57, 0xd8, 0xf9, 0x6f, 0x7c, 0xd0, 0x20, 0x00, 0x11, 0x3f, + 0x97, 0xdf, 0x4f, 0xe7, 0xfd, 0x57, 0xf8, 0x75, 0x3c, 0x1c, 0x8e, 0x90, + 0x06, 0x4e, 0x25, 0x4f, 0x59, 0xc5, 0xfa, 0x1f, 0x36, 0x3f, 0xd3, 0x79, + 0x98, 0xea, 0x43, 0x24, 0x4d, 0x24, 0x48, 0x91, 0x24, 0x91, 0x2a, 0x64, + 0x81, 0x2b, 0xb9, 0xf2, 0x9b, 0xf9, 0x96, 0x6f, 0x9d, 0xaa, 0x59, 0x11, + 0x80, 0xc8, 0x80, 0x08, 0x04, 0x24, 0xaa, 0xcc, 0x89, 0xd1, 0xcf, 0xab, + 0xd1, 0xe3, 0xdf, 0x29, 0x71, 0x6b, 0x8f, 0x1f, 0xa7, 0x83, 0x2d, 0xe7, + 0x08, 0x89, 0x11, 0x2a, 0x01, 0x08, 0x40, 0x0a, 0x81, 0x65, 0x2c, 0x96, + 0x4b, 0x4a, 0x7a, 0x8e, 0x7f, 0x4a, 0xd9, 0xa1, 0x58, 0xd5, 0xc0, 0xac, + 0x0a, 0x2c, 0xf1, 0x5e, 0xbf, 0x3f, 0x37, 0xae, 0x6c, 0x18, 0xe1, 0x8c, + 0x60, 0xae, 0x18, 0x00, 0x4a, 0x0c, 0xe9, 0xf0, 0xed, 0xd9, 0xfc, 0x8f, + 0xea, 0xdf, 0xc8, 0xfa, 0x96, 0xab, 0xc6, 0x80, 0x82, 0x0a, 0x29, 0x80, + 0x00, 0x84, 0x12, 0x25, 0x29, 0x48, 0xa5, 0x8c, 0x57, 0x9b, 0x5e, 0x15, + 0xf5, 0xe7, 0x7f, 0xd6, 0xf9, 0xba, 0x3e, 0xb7, 0xcc, 0xd1, 0xf4, 0x3c, + 0x0f, 0x7c, 0xcf, 0x3e, 0xec, 0xf9, 0x1e, 0x8d, 0x1f, 0x13, 0xbd, 0xde, + 0x4d, 0x4e, 0x49, 0x48, 0x50, 0x3a, 0x32, 0x72, 0x89, 0x2c, 0xa7, 0xa8, + 0xba, 0x67, 0x9d, 0xfa, 0xff, 0x00, 0x1e, 0x7f, 0xad, 0xc9, 0x8e, 0xc6, + 0xb2, 0x46, 0x32, 0x54, 0xc9, 0x0c, 0x92, 0x32, 0x43, 0x12, 0x79, 0x6e, + 0x9f, 0x3a, 0xad, 0x70, 0xd1, 0x4e, 0xa2, 0x80, 0xc0, 0x64, 0x01, 0x44, + 0x04, 0x02, 0xa4, 0x95, 0x94, 0x20, 0xde, 0xe9, 0xd6, 0x9b, 0xc2, 0x04, + 0x08, 0x01, 0x10, 0x10, 0x80, 0x40, 0xa0, 0x02, 0x83, 0x56, 0xa4, 0x52, + 0xcf, 0x5a, 0x7a, 0xfb, 0x5c, 0xfd, 0x62, 0xb1, 0x8e, 0x50, 0x85, 0x79, + 0xde, 0xfc, 0xbc, 0xcf, 0xa3, 0x94, 0x6a, 0xd1, 0x88, 0x21, 0x8d, 0x40, + 0x1c, 0x00, 0x0a, 0x40, 0x0b, 0xaf, 0xe4, 0xfd, 0x6e, 0xef, 0xe2, 0xff, + 0x00, 0x59, 0xab, 0x3b, 0x96, 0x2b, 0x50, 0x21, 0x00, 0xa1, 0xd1, 0x4c, + 0x04, 0x10, 0xb2, 0x36, 0x04, 0x8a, 0x01, 0x66, 0xaa, 0x8e, 0x44, 0xc6, + 0x8c, 0x79, 0xb5, 0x6b, 0xc7, 0xb3, 0xa7, 0x86, 0xff, 0x00, 0x3a, 0x58, + 0x34, 0x2c, 0x03, 0x50, 0xa1, 0x1a, 0xbc, 0xa4, 0x3c, 0x25, 0xa3, 0x48, + 0x76, 0xcf, 0x27, 0xf7, 0xbf, 0x3e, 0x3d, 0x72, 0xe9, 0xd3, 0x18, 0xc0, + 0x95, 0x31, 0x8c, 0x92, 0x03, 0x1d, 0x9e, 0x67, 0x5e, 0x0c, 0x9b, 0xf3, + 0x5f, 0x56, 0x05, 0x89, 0x52, 0x35, 0x68, 0x10, 0x50, 0x10, 0x50, 0x48, + 0x52, 0x11, 0x04, 0x81, 0x5a, 0x44, 0x09, 0x2b, 0x22, 0x20, 0x05, 0x48, + 0x09, 0x58, 0x84, 0xa0, 0xd5, 0x8c, 0x22, 0xb6, 0x46, 0xbd, 0x57, 0x3f, + 0xa7, 0x7c, 0xd8, 0x11, 0x9b, 0x53, 0x81, 0xdf, 0x9f, 0x9e, 0xef, 0xce, + 0x9d, 0x4b, 0x25, 0x98, 0xe0, 0x10, 0xc1, 0x40, 0x86, 0x00, 0x12, 0x94, + 0xe0, 0x27, 0xcf, 0xb7, 0x6b, 0xf0, 0x7f, 0xb6, 0xdf, 0xe3, 0xf4, 0xdd, + 0x2b, 0xcd, 0x74, 0xb3, 0x41, 0x08, 0x06, 0x08, 0x68, 0x66, 0x90, 0x00, + 0x86, 0x20, 0x45, 0x48, 0xe8, 0xe3, 0xc3, 0xd6, 0xe3, 0xf3, 0xef, 0xe7, + 0xc5, 0xd8, 0x22, 0xa5, 0x08, 0x8e, 0xa2, 0x85, 0xa8, 0xa8, 0x46, 0x32, + 0x52, 0xcb, 0x16, 0x49, 0x21, 0x6a, 0x63, 0xfb, 0x5c, 0x39, 0xff, 0x00, + 0xab, 0xf2, 0x1a, 0x8e, 0xc7, 0x40, 0xc6, 0x3a, 0x63, 0x1a, 0x31, 0x8e, + 0xa2, 0x9e, 0x6b, 0x5e, 0x1c, 0x5a, 0xf3, 0x68, 0xd4, 0xb1, 0x5a, 0x2a, + 0x40, 0x8d, 0x58, 0x10, 0x00, 0x10, 0x00, 0x02, 0x2a, 0x42, 0x22, 0x56, + 0xcd, 0x65, 0x49, 0x35, 0xb1, 0x41, 0x88, 0x4b, 0x11, 0xa8, 0x21, 0x28, + 0x03, 0x18, 0xd0, 0x66, 0x12, 0x69, 0x9e, 0x8e, 0xe6, 0x7d, 0xfc, 0xce, + 0x99, 0xe3, 0x76, 0xc7, 0x2f, 0xa6, 0x15, 0x39, 0x66, 0xb2, 0x80, 0x04, + 0x00, 0xa0, 0x40, 0x00, 0x39, 0x40, 0x18, 0x2f, 0x4f, 0xf2, 0x9f, 0xa9, + 0xe9, 0xfe, 0x7b, 0xed, 0x69, 0x6a, 0x70, 0xe5, 0x20, 0x85, 0x29, 0x0a, + 0x80, 0xb1, 0xd2, 0x82, 0x90, 0xc0, 0x58, 0xa5, 0x10, 0x05, 0x11, 0xab, + 0x1e, 0x2f, 0x47, 0xc3, 0xe4, 0x58, 0xc9, 0x0a, 0xc3, 0x48, 0xd8, 0xa9, + 0x6a, 0x29, 0x01, 0x50, 0x39, 0x1d, 0x4b, 0x36, 0x59, 0xb3, 0xc8, 0xb2, + 0xbe, 0x93, 0x93, 0xfb, 0x7f, 0x0d, 0x5e, 0xbc, 0x14, 0xec, 0x76, 0x3b, + 0x44, 0x63, 0xa6, 0x30, 0x46, 0x62, 0x28, 0xb3, 0x8b, 0xbf, 0x9d, 0x55, + 0xe3, 0x75, 0x5b, 0x4d, 0x0b, 0x52, 0x21, 0x80, 0xc0, 0xe1, 0xe7, 0xd1, + 0xa5, 0x9d, 0xd7, 0x93, 0xb0, 0x00, 0x01, 0x08, 0x62, 0xb1, 0x11, 0x22, + 0x95, 0x15, 0xa2, 0x27, 0x6b, 0x89, 0x2a, 0x50, 0x6b, 0x11, 0x09, 0x50, + 0x88, 0xa6, 0xd9, 0x5d, 0xe6, 0xa4, 0xa5, 0x72, 0xf4, 0xe9, 0x8b, 0xbf, + 0xa0, 0x56, 0xa2, 0xb5, 0x21, 0x08, 0x8a, 0xa0, 0x80, 0x63, 0x05, 0x00, + 0x11, 0xca, 0x0d, 0x76, 0xfe, 0x7f, 0xef, 0xf5, 0xbf, 0x2b, 0xfa, 0x2d, + 0x58, 0xdd, 0xb6, 0x90, 0xe5, 0x50, 0x42, 0x94, 0x00, 0x1d, 0x20, 0xb0, + 0x15, 0x8a, 0x8b, 0x14, 0xa0, 0xb1, 0x48, 0x05, 0x06, 0xd6, 0x38, 0xf7, + 0x7c, 0xdf, 0x2b, 0xa5, 0x8f, 0x20, 0x3d, 0xc8, 0xc8, 0xa9, 0x58, 0xa9, + 0x22, 0xb5, 0x45, 0xb6, 0x4d, 0x1a, 0xcf, 0x27, 0x9b, 0x59, 0xcf, 0xfd, + 0x37, 0x9b, 0x1f, 0xdd, 0xf3, 0xab, 0x1d, 0x3b, 0x0a, 0x74, 0xd1, 0x8e, + 0x98, 0x01, 0x44, 0xcf, 0xca, 0x27, 0x4d, 0x16, 0x68, 0xbc, 0xf7, 0xef, + 0xcd, 0xd0, 0xdf, 0x9a, 0xeb, 0x82, 0xc1, 0x10, 0x28, 0x22, 0xa9, 0xac, + 0x33, 0xa4, 0x39, 0x7d, 0x0c, 0x57, 0x9f, 0x67, 0xaf, 0x82, 0xfb, 0x86, + 0x30, 0x00, 0x41, 0x44, 0x04, 0x21, 0x0a, 0xa2, 0x91, 0x20, 0x40, 0x88, + 0x95, 0xcb, 0x26, 0x85, 0x42, 0x20, 0x75, 0xf1, 0xe9, 0xef, 0x67, 0xd1, + 0x83, 0xb7, 0x2e, 0x56, 0xb1, 0x42, 0xcd, 0xab, 0xf3, 0xad, 0xd9, 0x42, + 0xdc, 0x87, 0x9c, 0xc6, 0xb8, 0x2d, 0x4f, 0x53, 0x67, 0x6e, 0x56, 0xea, + 0x3a, 0x99, 0x2b, 0x19, 0x21, 0x80, 0xc4, 0xa0, 0xe2, 0xdf, 0x2f, 0xaf, + 0xa5, 0xf9, 0x5f, 0xd2, 0xee, 0xf8, 0xff, 0x00, 0x4f, 0x46, 0x35, 0x6f, + 0x43, 0x83, 0x34, 0x0a, 0x58, 0xab, 0x34, 0x00, 0xa7, 0x63, 0xa4, 0x3a, + 0x52, 0x16, 0xab, 0x16, 0x4b, 0x44, 0x90, 0x88, 0x11, 0xb1, 0x59, 0x0b, + 0x0e, 0xb8, 0xd7, 0xf5, 0xbe, 0x17, 0x9a, 0xf6, 0x78, 0xaa, 0xf4, 0xf2, + 0x92, 0x6a, 0xe4, 0xf4, 0xff, 0x00, 0x23, 0xb7, 0x43, 0xc1, 0xd6, 0xff, + 0x00, 0x26, 0xec, 0xc2, 0xca, 0xba, 0xcb, 0x24, 0x96, 0x81, 0x1c, 0xdc, + 0x1f, 0xa4, 0xf3, 0xe4, 0xfb, 0x5c, 0x0a, 0x07, 0x63, 0x1d, 0x08, 0xec, + 0x29, 0x8c, 0xcb, 0x79, 0xf2, 0xaf, 0x9b, 0x95, 0xaf, 0x37, 0x0b, 0x8f, + 0xd0, 0xc9, 0x7b, 0xdb, 0x52, 0x24, 0x5f, 0xae, 0x7a, 0xb5, 0xc3, 0x4d, + 0xe3, 0x7d, 0xe5, 0x65, 0xc1, 0x5c, 0xfe, 0x7e, 0xc8, 0x67, 0xd3, 0x7a, + 0x74, 0x2d, 0xa2, 0x66, 0xcb, 0x23, 0x79, 0xf3, 0x6e, 0x2a, 0x99, 0xdf, + 0xbe, 0x3a, 0x6e, 0x1a, 0x31, 0x00, 0x08, 0x41, 0x4a, 0x11, 0x15, 0x49, + 0x15, 0x89, 0x12, 0x22, 0x54, 0x40, 0xad, 0x6a, 0x2f, 0xcf, 0x63, 0x3e, + 0x84, 0xb6, 0xd5, 0xab, 0x64, 0x4d, 0x6d, 0x1d, 0xae, 0x39, 0xb9, 0xbe, + 0x3a, 0xde, 0xaf, 0xaf, 0xcf, 0xa3, 0x52, 0x55, 0x21, 0x80, 0xc0, 0x62, + 0x52, 0x5b, 0xfe, 0x7f, 0xd0, 0xdb, 0xf0, 0xbe, 0xce, 0xef, 0x87, 0xf5, + 0xee, 0xe7, 0xbb, 0x65, 0x9e, 0x92, 0x00, 0x52, 0x14, 0x19, 0xa8, 0x20, + 0xa6, 0x30, 0xd0, 0xc8, 0xa6, 0x16, 0x0a, 0xa4, 0x02, 0x95, 0x2d, 0x48, + 0xe5, 0x12, 0x17, 0x2b, 0xdb, 0xe6, 0xc5, 0xf6, 0x3e, 0x5c, 0x7d, 0x1e, + 0x1d, 0xfd, 0xfc, 0xfa, 0x3a, 0x64, 0xa0, 0xae, 0x1e, 0x77, 0x3e, 0x76, + 0xcc, 0x4a, 0x31, 0x3c, 0xc7, 0x2d, 0x6d, 0xf1, 0xeb, 0xaf, 0xcf, 0x5a, + 0x3e, 0xaf, 0x3e, 0x1f, 0xb2, 0x60, 0x64, 0xa9, 0x44, 0xd7, 0x46, 0xb1, + 0xdd, 0xd6, 0x7a, 0xd1, 0x53, 0x39, 0x2f, 0x2c, 0x5a, 0xe5, 0x82, 0xf9, + 0xf3, 0xeb, 0x9d, 0x89, 0x3a, 0x59, 0xd7, 0x93, 0xe1, 0xf5, 0xa5, 0xab, + 0x65, 0x30, 0x10, 0x0c, 0x95, 0x9a, 0x2e, 0x6f, 0x3a, 0x55, 0xa5, 0x3c, + 0x7e, 0x3a, 0x00, 0x02, 0x44, 0xb1, 0x42, 0xe6, 0xcb, 0xce, 0x5a, 0xe5, + 0x6d, 0xe7, 0xd0, 0xd7, 0x2e, 0x95, 0xe7, 0x21, 0x00, 0x08, 0x4a, 0x84, + 0x44, 0x4b, 0x18, 0x81, 0x54, 0xd5, 0x2d, 0x67, 0x33, 0x2c, 0x17, 0x5e, + 0x3b, 0xd7, 0x37, 0x9e, 0x5c, 0x4b, 0x49, 0x54, 0xb0, 0x58, 0x10, 0x5a, + 0x22, 0x3a, 0xd7, 0x63, 0x59, 0xd7, 0xd7, 0x9e, 0xde, 0xdc, 0xf5, 0xef, + 0x2e, 0xc7, 0x02, 0xa2, 0x7e, 0x3f, 0x7e, 0xff, 0x00, 0x85, 0xf6, 0x36, + 0x7c, 0x7f, 0xab, 0x77, 0x8b, 0xbd, 0x96, 0xd9, 0x35, 0x2b, 0x25, 0x69, + 0x05, 0x18, 0x2b, 0x4a, 0x20, 0x82, 0x00, 0x56, 0x08, 0xe9, 0xe8, 0x0c, + 0x59, 0x14, 0x40, 0x3e, 0xfc, 0xe3, 0xcb, 0x72, 0xe9, 0x99, 0xfb, 0x7c, + 0x79, 0x7d, 0xde, 0x5e, 0x37, 0xaf, 0xcd, 0xe5, 0xbd, 0x5e, 0x3c, 0xae, + 0x7d, 0xad, 0xe2, 0x76, 0x46, 0xc8, 0x59, 0x1b, 0x9a, 0xac, 0xa6, 0xcc, + 0xa6, 0x38, 0xaa, 0x59, 0x44, 0xc8, 0x35, 0x9b, 0x1d, 0xb3, 0xd9, 0x34, + 0x96, 0x75, 0x12, 0xad, 0x61, 0xef, 0x9f, 0xa3, 0xe9, 0xe6, 0xf5, 0xcf, + 0x1a, 0xb9, 0x92, 0x4e, 0xa4, 0x92, 0xb6, 0x43, 0x0a, 0xcd, 0xcf, 0xa7, + 0x91, 0xe3, 0xf5, 0x2d, 0xd2, 0xda, 0x01, 0x01, 0x80, 0x0a, 0x98, 0x45, + 0x4a, 0x20, 0xad, 0x10, 0x2a, 0x02, 0x26, 0x58, 0xe4, 0x5c, 0xd1, 0x2d, + 0xd7, 0x3d, 0x6d, 0x71, 0xea, 0x6b, 0x97, 0x52, 0xf1, 0xe8, 0xeb, 0x9b, + 0x31, 0x4d, 0xf1, 0x71, 0xe9, 0xcb, 0x9e, 0x94, 0x5d, 0xac, 0xdd, 0x32, + 0xb5, 0xe7, 0xdd, 0x64, 0x95, 0xc9, 0x65, 0x97, 0x25, 0x9b, 0x9d, 0x6c, + 0xe6, 0xaa, 0xcd, 0x97, 0x2b, 0x56, 0xd2, 0xc8, 0x63, 0x05, 0x6b, 0x29, + 0x63, 0x0c, 0xd9, 0xd6, 0xf6, 0x7d, 0xbe, 0x27, 0xa8, 0x95, 0x45, 0x6b, + 0x56, 0x37, 0x2f, 0x3f, 0xaa, 0xdf, 0x17, 0xaa, 0xdf, 0x27, 0xae, 0xff, + 0x00, 0x37, 0xa6, 0xdf, 0x37, 0x6c, 0xdb, 0xe5, 0x8f, 0xd1, 0xe7, 0xa7, + 0xb7, 0x28, 0x6b, 0x0b, 0x50, 0x96, 0x59, 0xad, 0x4c, 0xe9, 0xc4, 0x86, + 0x6a, 0xf5, 0x79, 0xca, 0xb1, 0x34, 0xd9, 0xbe, 0xca, 0xfe, 0x5f, 0xd6, + 0xb7, 0xc3, 0xeb, 0xdf, 0xe8, 0xe3, 0xb7, 0xbf, 0x9a, 0xef, 0x4f, 0x9a, + 0x8f, 0x5f, 0x9b, 0xcc, 0x74, 0xcf, 0x03, 0x9f, 0x4c, 0x39, 0x95, 0xeb, + 0x9f, 0x2f, 0xa6, 0x29, 0x93, 0xa1, 0x34, 0xac, 0x8e, 0xb0, 0x90, 0x25, + 0x66, 0xa8, 0xeb, 0xa4, 0xb5, 0x04, 0xab, 0x57, 0x99, 0x9b, 0x54, 0xb5, + 0x4b, 0x4b, 0x51, 0x8b, 0xaa, 0xcc, 0x23, 0x73, 0xbf, 0xaf, 0x9f, 0xd4, + 0xf4, 0xf1, 0x68, 0x49, 0x28, 0x8c, 0x29, 0x94, 0x4d, 0x72, 0x71, 0xdb, + 0x8d, 0x9e, 0xdc, 0xde, 0x7e, 0x8d, 0x4d, 0xed, 0xd4, 0x95, 0x8c, 0x02, + 0x98, 0x00, 0x05, 0x81, 0x56, 0x74, 0x20, 0x00, 0xa9, 0x10, 0x8a, 0x0e, + 0x55, 0x65, 0xca, 0xc5, 0xb0, 0x68, 0x01, 0x65, 0x9a, 0xee, 0x68, 0x9d, + 0x2d, 0x4b, 0xe3, 0x5c, 0x8b, 0x4c, 0x96, 0xf3, 0xe5, 0xae, 0x18, 0xd2, + 0x76, 0x5d, 0x99, 0x0e, 0xae, 0xaf, 0x29, 0x4b, 0x59, 0x64, 0xe7, 0x56, + 0x4d, 0xb5, 0x59, 0xb0, 0xb2, 0x18, 0xcb, 0xd6, 0xec, 0x75, 0x26, 0xa1, + 0x13, 0xed, 0xcd, 0x74, 0xe2, 0x8a, 0xe2, 0x32, 0xc3, 0x36, 0xb9, 0xa8, + 0x42, 0x2b, 0x88, 0x2c, 0x8d, 0x46, 0x84, 0xbb, 0x16, 0xd8, 0xd7, 0x8c, + 0xac, 0xae, 0xcc, 0x9a, 0x38, 0xab, 0x4a, 0x75, 0x4b, 0x72, 0x74, 0xb4, + 0x5b, 0x55, 0x55, 0x57, 0x45, 0x36, 0x46, 0x6a, 0x65, 0xf6, 0x2a, 0xa6, + 0x09, 0x6d, 0xc6, 0xee, 0xc7, 0x56, 0xb5, 0x48, 0x75, 0xe3, 0x1e, 0x9c, + 0x92, 0x15, 0x12, 0x8a, 0xcb, 0x2d, 0xb9, 0x9a, 0x16, 0xe3, 0x76, 0x67, + 0x3f, 0xb1, 0xf3, 0x43, 0x4a, 0xe5, 0x8c, 0xd4, 0x17, 0x55, 0x9b, 0xe3, + 0x46, 0x25, 0x9a, 0xc5, 0xfa, 0xe4, 0xee, 0x69, 0xd5, 0xb2, 0x4c, 0x98, + 0xe9, 0xc5, 0xcf, 0x6c, 0x13, 0xa1, 0x56, 0x1b, 0xcd, 0xd6, 0x4e, 0xc6, + 0x3a, 0x43, 0x00, 0x00, 0x0a, 0x12, 0xbc, 0xd0, 0x28, 0x84, 0x44, 0xa6, + 0xcc, 0x46, 0x02, 0xa9, 0x67, 0x13, 0x5b, 0x0b, 0x4b, 0x25, 0xbd, 0x2e, + 0xa9, 0xa3, 0xb2, 0x15, 0x51, 0x9c, 0xa2, 0x55, 0x0e, 0xc9, 0x05, 0x8e, + 0xae, 0xcc, 0xa5, 0x74, 0xf5, 0x9b, 0xb8, 0x4c, 0x2d, 0x62, 0xb2, 0x8d, + 0x4a, 0xed, 0x65, 0xb6, 0x69, 0x2f, 0x4b, 0x61, 0x4b, 0x16, 0xa3, 0x0e, + 0x68, 0xce, 0xd4, 0xaa, 0xc8, 0x9d, 0x2f, 0x3b, 0x4f, 0x39, 0xcb, 0xf5, + 0xe3, 0x27, 0x49, 0x58, 0x4a, 0x1a, 0xac, 0xd2, 0x92, 0x9a, 0xdd, 0x96, + 0xdc, 0x4d, 0xfc, 0xa4, 0x52, 0xc8, 0x9c, 0x92, 0xc8, 0x2b, 0xd5, 0x55, + 0xcf, 0xef, 0x79, 0xfb, 0xd6, 0x1d, 0x48, 0xaf, 0x4f, 0xc3, 0xd7, 0xd9, + 0x7c, 0xde, 0x9c, 0x6f, 0x74, 0xf2, 0x1f, 0x43, 0x2b, 0x96, 0xae, 0x5b, + 0x09, 0x05, 0xcc, 0x37, 0x88, 0x6f, 0x9d, 0x77, 0x35, 0xd9, 0x51, 0x4d, + 0xb4, 0x94, 0x4b, 0x5c, 0xb7, 0xe7, 0x3b, 0xa5, 0xd4, 0x5e, 0xba, 0x19, + 0xc3, 0xde, 0x65, 0xe7, 0xab, 0xa6, 0x68, 0xdd, 0x86, 0x42, 0x92, 0xa5, + 0x9d, 0x68, 0x4b, 0xe5, 0xb6, 0x49, 0x4b, 0x54, 0xb4, 0x2e, 0x75, 0xcf, + 0x65, 0x44, 0x12, 0x55, 0xa8, 0xd3, 0x66, 0x82, 0xd2, 0x6b, 0x24, 0x90, + 0x0c, 0x05, 0x4e, 0x39, 0x20, 0x20, 0x12, 0x44, 0x4a, 0x13, 0x89, 0x13, + 0x26, 0xae, 0xc2, 0x15, 0x56, 0x44, 0x82, 0x25, 0x11, 0x00, 0x58, 0x00, + 0xd1, 0xc0, 0x55, 0xab, 0x67, 0x49, 0xd1, 0xe5, 0x9b, 0x39, 0xeb, 0x1a, + 0xe0, 0xac, 0xdd, 0x24, 0xb5, 0x2e, 0x2d, 0x8b, 0x09, 0xa4, 0x96, 0x70, + 0x42, 0x52, 0x51, 0x58, 0x41, 0x40, 0x0c, 0x62, 0x00, 0x04, 0x14, 0x00, + 0x41, 0x40, 0x18, 0x00, 0x90, 0x20, 0xb1, 0xa8, 0x11, 0x84, 0x21, 0x02, + 0x48, 0x92, 0x4e, 0xa4, 0x8c, 0x62, 0xa8, 0x15, 0xd4, 0x22, 0x05, 0x76, + 0xd6, 0x42, 0x22, 0x59, 0x9b, 0xab, 0x2d, 0x71, 0xb1, 0x98, 0x75, 0x9c, + 0xee, 0x9a, 0xaf, 0x9d, 0xb7, 0x31, 0x91, 0xa5, 0x48, 0x4a, 0x40, 0x25, + 0x06, 0x48, 0x99, 0x64, 0x31, 0x2a, 0x23, 0x11, 0xa2, 0x15, 0x00, 0x48, + 0x64, 0x80, 0x62, 0x31, 0x5c, 0x20, 0x05, 0x00, 0x00, 0x60, 0x34, 0x15, + 0x80, 0x05, 0x4c, 0xb1, 0x27, 0x12, 0x1c, 0x00, 0x21, 0x50, 0x15, 0x3a, + 0xb7, 0x32, 0xec, 0xa7, 0x94, 0x56, 0xb9, 0x6b, 0x2a, 0x5a, 0xac, 0xae, + 0xa1, 0x4a, 0x80, 0xa6, 0x80, 0xc6, 0x30, 0x18, 0xc0, 0x00, 0x60, 0x30, + 0x1a, 0x0a, 0x00, 0x00, 0x08, 0x00, 0x00, 0x60, 0x02, 0x00, 0x12, 0x0a, + 0xa9, 0x04, 0x02, 0x01, 0x08, 0x41, 0x08, 0x4a, 0x0e, 0x25, 0x13, 0x8b, + 0x62, 0xe2, 0xd2, 0xd4, 0x76, 0x43, 0x4a, 0xb4, 0xab, 0x56, 0xb8, 0x41, + 0x00, 0x08, 0x00, 0x40, 0x02, 0x00, 0x18, 0xc0, 0x06, 0x48, 0x02, 0x23, + 0x50, 0x22, 0x44, 0x88, 0x8f, 0xff, 0xc4, 0x00, 0x32, 0x10, 0x00, 0x02, + 0x02, 0x01, 0x03, 0x02, 0x05, 0x02, 0x06, 0x03, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x12, 0x10, 0x13, + 0x06, 0x14, 0x20, 0x21, 0x31, 0x22, 0x30, 0x15, 0x23, 0x32, 0x33, 0x34, + 0x40, 0x07, 0x24, 0x41, 0x16, 0x42, 0x50, 0x25, 0x26, 0xff, 0xda, 0x00, + 0x08, 0x01, 0x01, 0x00, 0x01, 0x05, 0x02, 0xff, 0x00, 0xf2, 0x32, 0x64, + 0xc9, 0x93, 0x26, 0x4c, 0x99, 0x32, 0x64, 0xc9, 0x93, 0x26, 0x4c, 0x9c, + 0x8e, 0x47, 0x23, 0x91, 0xc8, 0xe6, 0x77, 0x0e, 0xea, 0x2b, 0xae, 0x56, + 0x9e, 0x56, 0xc3, 0xca, 0xd8, 0x2d, 0x24, 0x85, 0xa3, 0x89, 0xe5, 0x2b, + 0x3c, 0xb5, 0x47, 0x97, 0xa8, 0xec, 0xd4, 0x76, 0x6b, 0x3b, 0x55, 0x9d, + 0xaa, 0xce, 0xdd, 0x67, 0x6e, 0x07, 0x6e, 0xb3, 0xb7, 0x03, 0x84, 0x0e, + 0x11, 0x38, 0x44, 0xe1, 0x13, 0x84, 0x4e, 0x11, 0x38, 0xc4, 0xe3, 0x13, + 0x8c, 0x4e, 0x31, 0x38, 0x44, 0xe1, 0x13, 0x84, 0x4e, 0x11, 0x38, 0x44, + 0xe1, 0x13, 0x84, 0x4e, 0x11, 0x3b, 0x71, 0x3b, 0x71, 0x3b, 0x71, 0x3b, + 0x71, 0x3b, 0x71, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x51, 0x3b, + 0x51, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x30, 0x3b, + 0x30, 0x3b, 0x30, 0x3b, 0x30, 0x3b, 0x15, 0x9d, 0x8a, 0xcf, 0x2f, 0x59, + 0xe5, 0xeb, 0x3c, 0xb5, 0x67, 0x96, 0xa8, 0xf2, 0xb5, 0x1e, 0x4e, 0xa1, + 0xe8, 0x6a, 0x1e, 0xdf, 0x02, 0x5b, 0x7b, 0x27, 0xa6, 0x9d, 0x7d, 0x32, + 0x8e, 0x48, 0xe4, 0x8e, 0x48, 0xe4, 0x8e, 0x48, 0xe4, 0x8e, 0x46, 0x4c, + 0x99, 0x32, 0x64, 0xc9, 0x93, 0x3d, 0x33, 0xff, 0x00, 0xe4, 0x63, 0xd0, + 0xc6, 0xcd, 0x3c, 0xa7, 0xdc, 0x8f, 0xc7, 0x5c, 0x18, 0x31, 0xd3, 0x06, + 0x0c, 0x18, 0xe9, 0x8f, 0xbd, 0x9f, 0xff, 0x00, 0x0d, 0xb4, 0x6a, 0xf4, + 0xe6, 0xab, 0x4e, 0x27, 0xf6, 0x72, 0x64, 0xcb, 0x32, 0xce, 0x4c, 0xe6, + 0xce, 0x6c, 0xe6, 0x73, 0x39, 0x9c, 0xcc, 0xff, 0x00, 0xf8, 0xd8, 0x38, + 0x8e, 0x24, 0xa2, 0x51, 0x5d, 0x8e, 0xca, 0xeb, 0x72, 0x87, 0x64, 0xed, + 0x1d, 0xa3, 0xb4, 0x76, 0x8e, 0xd1, 0xda, 0x3b, 0x67, 0x03, 0x81, 0xc0, + 0xe0, 0x71, 0x38, 0x9c, 0x4e, 0x27, 0x13, 0x06, 0x0c, 0x18, 0x30, 0x63, + 0xfb, 0x3c, 0x92, 0x3b, 0xb1, 0x47, 0x98, 0x89, 0xe6, 0x51, 0xe6, 0x8f, + 0x34, 0xcf, 0x34, 0xcf, 0x31, 0x23, 0xbf, 0x23, 0xbd, 0x23, 0xba, 0xce, + 0xeb, 0x3b, 0x87, 0x33, 0x99, 0xcb, 0xa6, 0xaa, 0xae, 0xdc, 0xff, 0x00, + 0xa5, 0x93, 0x27, 0x23, 0xb8, 0x2b, 0x11, 0x9c, 0xff, 0x00, 0x7b, 0x06, + 0x0e, 0x02, 0xa5, 0xb2, 0x1b, 0x76, 0xa2, 0xc2, 0x1b, 0x0e, 0xb6, 0x64, + 0x3c, 0x2d, 0xaf, 0x98, 0xbc, 0x1b, 0xac, 0x91, 0xa1, 0xf0, 0xad, 0xfa, + 0x58, 0x2f, 0x0f, 0xd8, 0x2f, 0x0f, 0xc8, 0x5b, 0x00, 0xb6, 0x08, 0x9f, + 0x80, 0xc0, 0xfc, 0x06, 0x07, 0xe0, 0x31, 0x3f, 0x01, 0x43, 0xd8, 0x47, + 0xb0, 0xc8, 0x7b, 0x1d, 0x83, 0xd9, 0xae, 0x44, 0xb6, 0xbb, 0x51, 0x2d, + 0x0c, 0xd0, 0xf4, 0xcc, 0x74, 0x1d, 0x93, 0xb6, 0x70, 0x38, 0x9c, 0x4c, + 0x7f, 0x59, 0x92, 0xbe, 0x28, 0x7a, 0xa1, 0xea, 0x24, 0xc7, 0x36, 0xff, + 0x00, 0xa5, 0x75, 0x7d, 0xda, 0xff, 0x00, 0xaf, 0x9c, 0x11, 0xb4, 0x4f, + 0x3f, 0xd8, 0xc0, 0xa0, 0xd9, 0xa7, 0xda, 0x35, 0x5a, 0x92, 0x8f, 0x07, + 0x6b, 0x2c, 0x29, 0xf0, 0x4c, 0x51, 0x57, 0x84, 0xb4, 0x35, 0x95, 0xec, + 0x7a, 0x2a, 0x88, 0x69, 0x6a, 0xac, 0xe0, 0x71, 0x38, 0x9c, 0x4c, 0x18, + 0x38, 0x9c, 0x4c, 0x18, 0x30, 0x60, 0xc1, 0x83, 0x06, 0x0c, 0x18, 0x30, + 0x3a, 0xe2, 0xc9, 0x68, 0xea, 0x91, 0x2d, 0xae, 0x96, 0x4f, 0x67, 0x45, + 0x9b, 0x55, 0x91, 0x2c, 0xd1, 0xca, 0x03, 0xa8, 0x70, 0x38, 0x9c, 0x4c, + 0x7f, 0x45, 0xc9, 0x45, 0x4f, 0x54, 0x4a, 0xc7, 0x2f, 0x46, 0x7f, 0xa7, + 0xaa, 0x87, 0x1b, 0x7f, 0xb1, 0x1c, 0xa2, 0x2b, 0x2b, 0x80, 0xa9, 0x93, + 0x16, 0x9a, 0x6c, 0xf2, 0x96, 0x1e, 0x4e, 0xc3, 0xca, 0x4c, 0xf2, 0xb2, + 0x3c, 0xb4, 0x8f, 0x2f, 0x23, 0xb2, 0xce, 0xd9, 0xdb, 0x38, 0x1c, 0x0e, + 0x27, 0x13, 0x89, 0xc4, 0xc1, 0xc4, 0xd3, 0xed, 0xda, 0x8d, 0x51, 0xa6, + 0xf0, 0x7e, 0xb2, 0xe3, 0x4b, 0xe0, 0xbd, 0x3d, 0x66, 0x9b, 0x67, 0xd2, + 0x69, 0x05, 0x03, 0x89, 0xc4, 0xe2, 0x71, 0x38, 0x9c, 0x4e, 0x27, 0x13, + 0x81, 0xc0, 0xe0, 0x71, 0x38, 0x9c, 0x4e, 0x27, 0x13, 0x06, 0x0c, 0x18, + 0x30, 0x60, 0xc1, 0x83, 0x1e, 0x97, 0x1c, 0x96, 0x68, 0x6a, 0xb0, 0xbb, + 0x6b, 0x68, 0xb3, 0x4e, 0xe0, 0xdc, 0x07, 0x11, 0xa3, 0x1e, 0x95, 0xea, + 0xc9, 0x9e, 0x96, 0x5d, 0xc0, 0x94, 0xdc, 0x9f, 0xf5, 0xb0, 0x60, 0xd6, + 0xaf, 0xe9, 0xe0, 0xc0, 0xa0, 0x53, 0xa0, 0xbe, 0xf2, 0xaf, 0x0d, 0x6b, + 0xac, 0x2a, 0xf0, 0x7d, 0xcc, 0xaf, 0xc1, 0xf5, 0x22, 0xaf, 0x0d, 0xe9, + 0x6b, 0x23, 0xb3, 0xe9, 0x60, 0x2d, 0xbb, 0x4e, 0x8f, 0x25, 0x42, 0x3c, + 0xad, 0x27, 0x95, 0xa8, 0xfc, 0x3f, 0x4e, 0xcf, 0xc3, 0x34, 0xc7, 0xe1, + 0x7a, 0x63, 0xf0, 0x9d, 0x31, 0xf8, 0x36, 0x99, 0x8f, 0x61, 0xd3, 0xb1, + 0xf8, 0x76, 0x96, 0x4b, 0xc3, 0x11, 0x27, 0xe1, 0x79, 0x92, 0xf0, 0xd5, + 0xd9, 0x8f, 0x83, 0xf3, 0x09, 0xf8, 0x3a, 0xe2, 0xbf, 0x05, 0xd8, 0xca, + 0x3c, 0x1d, 0xa5, 0x81, 0xa7, 0xd9, 0x34, 0x7a, 0x61, 0x43, 0x06, 0x0e, + 0x27, 0x13, 0x89, 0xc4, 0xe2, 0x71, 0x38, 0x9c, 0x4e, 0x07, 0x03, 0x81, + 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x4e, 0x27, 0x13, 0x89, 0xc4, 0xc1, 0xc4, + 0xc1, 0x83, 0x06, 0x0c, 0x18, 0xfb, 0x13, 0xae, 0x33, 0x5a, 0x8d, 0xb1, + 0x32, 0xda, 0x1d, 0x6d, 0xc4, 0xc1, 0x83, 0x06, 0x0c, 0x08, 0xc9, 0x93, + 0x27, 0x21, 0xcd, 0x22, 0x5a, 0x98, 0x21, 0x5d, 0x19, 0x16, 0x6a, 0x14, + 0x47, 0x3c, 0x99, 0xfe, 0x96, 0x0c, 0x18, 0x30, 0x60, 0xe2, 0x71, 0x35, + 0xb0, 0xfa, 0x78, 0x1c, 0x4e, 0x27, 0x13, 0x06, 0x0c, 0x7d, 0xac, 0x1a, + 0x7d, 0x0d, 0xfa, 0xa7, 0xa7, 0xf0, 0x96, 0xa2, 0xc5, 0xa6, 0xf0, 0x9e, + 0x9e, 0xb2, 0x8d, 0xb7, 0x4b, 0xa6, 0xfe, 0xb6, 0x04, 0x84, 0x8c, 0x18, + 0x38, 0x98, 0x38, 0x9c, 0x4e, 0x27, 0x13, 0x81, 0xc0, 0xe0, 0x70, 0x38, + 0x9c, 0x4e, 0x27, 0x13, 0x89, 0xc4, 0xe2, 0x71, 0x38, 0x9c, 0x4e, 0x27, + 0x13, 0x89, 0x83, 0x06, 0x06, 0x8c, 0x7d, 0xbb, 0x69, 0x8d, 0xaa, 0x7b, + 0x54, 0x1b, 0xfc, 0x22, 0xb3, 0xf0, 0x9a, 0x4f, 0xc3, 0x28, 0x3f, 0x0e, + 0xd3, 0x9f, 0x86, 0xe9, 0xcf, 0xc3, 0x34, 0xc7, 0xe1, 0x9a, 0x63, 0xf0, + 0xbd, 0x30, 0xf6, 0x8d, 0x3b, 0x2d, 0xd9, 0x6a, 0xe1, 0xad, 0x94, 0xe1, + 0x2c, 0x4a, 0x72, 0x79, 0x8b, 0xa3, 0x51, 0x64, 0x65, 0x09, 0x36, 0xb3, + 0xf7, 0x30, 0x60, 0xc1, 0x83, 0x07, 0x13, 0x89, 0xc0, 0xe2, 0x71, 0x38, + 0x9f, 0x84, 0x68, 0x4f, 0xc1, 0xf4, 0x04, 0xf6, 0x1d, 0xb6, 0xc2, 0x7e, + 0x11, 0xd9, 0xec, 0x3f, 0xf1, 0x3b, 0x21, 0x77, 0xf8, 0xff, 0x00, 0x65, + 0xb4, 0xb3, 0xfc, 0x63, 0xb6, 0x48, 0xbf, 0xfc, 0x57, 0x53, 0x2f, 0xff, + 0x00, 0x17, 0xeb, 0xe0, 0xf5, 0x7e, 0x07, 0xdd, 0xb4, 0xa6, 0xa3, 0x6f, + 0xd4, 0x69, 0x5f, 0x13, 0x1e, 0x8c, 0x10, 0xaa, 0x56, 0x3d, 0x17, 0x86, + 0x35, 0x3a, 0x83, 0x49, 0xe1, 0xdd, 0x1e, 0x98, 0x8a, 0x50, 0x5d, 0x72, + 0x64, 0xcf, 0xdf, 0x5d, 0x52, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x14, + 0x45, 0x11, 0x44, 0xe2, 0x71, 0x38, 0x0a, 0x07, 0x68, 0x55, 0x23, 0xb6, + 0x8e, 0x08, 0xe0, 0x70, 0x38, 0x1d, 0xb3, 0x81, 0xc0, 0xe0, 0x38, 0x1c, + 0x4e, 0x27, 0x13, 0x88, 0xe2, 0x34, 0x34, 0x34, 0x34, 0x3f, 0xe8, 0xe4, + 0xcf, 0x5f, 0x14, 0xcd, 0x4f, 0x5f, 0xb5, 0xe9, 0xe1, 0x64, 0xe9, 0xf0, + 0x8e, 0x96, 0xe3, 0x4f, 0xe1, 0xfd, 0xbf, 0x4c, 0xac, 0xd8, 0xb4, 0x76, + 0x16, 0xf8, 0x66, 0x05, 0xbe, 0x1f, 0xd5, 0x56, 0x5b, 0xa5, 0xb2, 0x97, + 0x8f, 0xb1, 0x83, 0x02, 0xad, 0xc8, 0xd3, 0x78, 0x7f, 0x70, 0xd5, 0x1a, + 0x6f, 0x01, 0x6e, 0x56, 0xba, 0x7f, 0xc7, 0x31, 0xc5, 0x5e, 0x02, 0xdb, + 0xa0, 0x47, 0xc1, 0xdb, 0x42, 0x17, 0x84, 0xf6, 0x94, 0x47, 0xc2, 0xdb, + 0x54, 0x48, 0x6c, 0x5b, 0x75, 0x67, 0xe1, 0x1a, 0x1f, 0xb5, 0x28, 0x29, + 0x1a, 0x8d, 0x24, 0x64, 0xb5, 0x7e, 0x19, 0xdb, 0xaf, 0x7a, 0xcf, 0x02, + 0xe8, 0xec, 0x35, 0x7e, 0x09, 0xd6, 0x52, 0x6a, 0xb6, 0xed, 0x46, 0x8d, + 0xc6, 0xb7, 0x27, 0xb7, 0x78, 0x5a, 0xeb, 0xcd, 0x26, 0xdd, 0xa7, 0xd0, + 0xc7, 0xa6, 0x4c, 0x99, 0xe9, 0x93, 0x26, 0x4c, 0x99, 0x32, 0x64, 0xc9, + 0x93, 0x3e, 0xb4, 0x21, 0x08, 0x42, 0x12, 0x12, 0x12, 0x14, 0x44, 0x85, + 0x11, 0x44, 0x51, 0x14, 0x05, 0x11, 0x44, 0xe2, 0x63, 0xd5, 0x83, 0x07, + 0x11, 0xc4, 0xe2, 0x38, 0x8e, 0x23, 0x88, 0xe2, 0x38, 0x8e, 0x23, 0x88, + 0xd0, 0xd0, 0xd0, 0xc6, 0x3f, 0xbb, 0x93, 0x26, 0x4c, 0x99, 0x32, 0x78, + 0xc6, 0xdc, 0xcb, 0xc3, 0xfa, 0x7f, 0x2f, 0xb6, 0xfa, 0x11, 0xc5, 0x49, + 0x5d, 0xb1, 0x69, 0x35, 0x06, 0xab, 0xc2, 0xb6, 0xc0, 0xbb, 0x49, 0x6e, + 0x9a, 0x58, 0x30, 0x60, 0x50, 0x6c, 0xd0, 0x78, 0x63, 0x70, 0xdc, 0x1e, + 0x93, 0xfc, 0x73, 0x36, 0x69, 0xbc, 0x0b, 0xb6, 0x50, 0x69, 0x36, 0xed, + 0x2e, 0x81, 0x7f, 0x4f, 0xe4, 0xbe, 0x82, 0xda, 0xf0, 0x4e, 0x25, 0xb5, + 0xc6, 0x6a, 0xbd, 0xaf, 0x4b, 0xa6, 0xba, 0x43, 0xe9, 0x93, 0x26, 0x4c, + 0x99, 0x32, 0x64, 0xc9, 0x93, 0x26, 0x4c, 0xf4, 0xcf, 0xa9, 0x08, 0x42, + 0x10, 0x84, 0x24, 0x24, 0x24, 0x24, 0x24, 0x28, 0x8a, 0x22, 0x88, 0xa2, + 0x24, 0x63, 0xee, 0xe0, 0x71, 0x1c, 0x47, 0x11, 0xa1, 0xc4, 0xe2, 0x34, + 0x34, 0x34, 0x34, 0x31, 0x8c, 0x7e, 0x96, 0x3f, 0xb3, 0x93, 0x26, 0x4f, + 0x12, 0x3e, 0xfe, 0xef, 0x44, 0x3b, 0x75, 0x75, 0x42, 0x11, 0x12, 0x28, + 0x96, 0x92, 0xbd, 0x54, 0x35, 0xde, 0x06, 0xee, 0xaa, 0x7c, 0x1d, 0xba, + 0x5d, 0x76, 0xdd, 0xfe, 0x3c, 0xaa, 0xb3, 0x45, 0xb3, 0x68, 0xb6, 0xef, + 0xec, 0xb5, 0x93, 0x53, 0x49, 0x6c, 0x49, 0xa2, 0x44, 0x89, 0x0c, 0xc9, + 0x93, 0x26, 0x4c, 0x99, 0x32, 0x64, 0xc9, 0x93, 0x26, 0x7a, 0x67, 0xa2, + 0xea, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x84, 0x84, 0x85, 0x11, 0x44, + 0x48, 0x48, 0xc7, 0xf4, 0x9a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x18, 0xd0, + 0xc6, 0x31, 0x8c, 0x7d, 0x58, 0xfe, 0xce, 0x4c, 0x99, 0x2c, 0x5e, 0x67, + 0xc5, 0x0b, 0xaa, 0x10, 0x88, 0x91, 0x2b, 0x46, 0x9e, 0xa2, 0xa8, 0xe3, + 0xfb, 0xb6, 0xc7, 0x31, 0xd4, 0xc3, 0x05, 0x84, 0xc9, 0x12, 0x19, 0x93, + 0x26, 0x4c, 0x99, 0x32, 0x64, 0xc9, 0x93, 0x26, 0x4c, 0xfa, 0x50, 0x84, + 0x21, 0x08, 0x42, 0x10, 0x84, 0x44, 0x48, 0x48, 0x48, 0x48, 0x4b, 0xfa, + 0x79, 0x1b, 0xea, 0xc9, 0x0c, 0x63, 0x18, 0xc6, 0x31, 0x8c, 0x7d, 0x58, + 0xc7, 0xd1, 0xfa, 0x72, 0x67, 0xa6, 0xcc, 0xbb, 0xde, 0x20, 0x33, 0xd1, + 0x08, 0x44, 0x48, 0x14, 0x43, 0x25, 0x30, 0xc2, 0x8f, 0xf7, 0x64, 0xcd, + 0x52, 0x2e, 0x26, 0x49, 0x92, 0x63, 0x66, 0x4c, 0x99, 0x32, 0x64, 0xc9, + 0x93, 0x26, 0x4c, 0x99, 0x32, 0x64, 0xcf, 0x54, 0x21, 0x08, 0x42, 0x10, + 0x84, 0x44, 0x42, 0x22, 0x44, 0x42, 0xfb, 0x59, 0x32, 0x72, 0x39, 0x75, + 0xc9, 0x93, 0x91, 0x93, 0x91, 0x9e, 0x8d, 0x8d, 0x8d, 0x8d, 0x8c, 0x63, + 0x18, 0xc6, 0x31, 0x8c, 0x7d, 0x58, 0xc6, 0xc6, 0xcc, 0x99, 0x32, 0x64, + 0xc9, 0x92, 0x4f, 0x11, 0xf0, 0xb4, 0x79, 0x5f, 0x93, 0x3d, 0x10, 0x99, + 0x12, 0x25, 0x46, 0x9e, 0x24, 0x48, 0x99, 0x39, 0x19, 0xfe, 0xb6, 0x4e, + 0x47, 0x23, 0x91, 0x29, 0x17, 0xbf, 0x6d, 0x47, 0xcc, 0xc9, 0x12, 0x63, + 0x66, 0x4c, 0x99, 0x32, 0x64, 0xc9, 0x93, 0x26, 0x4c, 0x99, 0x32, 0x64, + 0x46, 0x44, 0xc4, 0x21, 0x08, 0x42, 0x10, 0x84, 0x44, 0x42, 0x10, 0x98, + 0x98, 0x99, 0x93, 0x27, 0x23, 0x99, 0xdc, 0x39, 0x99, 0x32, 0x3b, 0x20, + 0x3b, 0xe2, 0x77, 0xd1, 0xdf, 0x47, 0x78, 0xef, 0x9d, 0xec, 0x8e, 0xd4, + 0x77, 0xa2, 0x72, 0xc9, 0x93, 0x3d, 0x1b, 0x1b, 0x32, 0x36, 0x31, 0x8c, + 0x63, 0x18, 0xc6, 0x31, 0x8c, 0x66, 0x46, 0x31, 0xfa, 0x32, 0x64, 0xc9, + 0x93, 0x53, 0x2e, 0x3a, 0x7f, 0x0a, 0xc7, 0x1a, 0x3c, 0x99, 0x32, 0x26, + 0x26, 0x45, 0x90, 0x28, 0x45, 0x24, 0x59, 0xcc, 0xee, 0x1c, 0xce, 0x67, + 0x31, 0x48, 0x4f, 0xfa, 0x4d, 0x8e, 0x47, 0x23, 0xb8, 0x3b, 0x07, 0x32, + 0xd9, 0x1a, 0x82, 0xc6, 0x49, 0x8d, 0x8c, 0x6c, 0xc9, 0x93, 0x26, 0x4c, + 0x99, 0x32, 0x64, 0xc9, 0x93, 0x3d, 0x50, 0x84, 0x44, 0x42, 0x10, 0x84, + 0x22, 0x22, 0x10, 0x98, 0x84, 0xce, 0x47, 0x70, 0xee, 0x9d, 0xc3, 0xb8, + 0x8e, 0x66, 0x64, 0x7b, 0x9e, 0xc7, 0xd2, 0x8e, 0xf6, 0x09, 0x5e, 0x3b, + 0xc5, 0x71, 0x1b, 0x0e, 0x67, 0x23, 0x97, 0x4e, 0x31, 0x3b, 0x67, 0x17, + 0x97, 0xc9, 0x0e, 0x6c, 0xe6, 0x99, 0x9e, 0x8c, 0x63, 0x18, 0xc6, 0x31, + 0x8d, 0x8c, 0x63, 0x19, 0x91, 0x8f, 0xae, 0x4c, 0x99, 0x33, 0xd3, 0x71, + 0x97, 0x1d, 0x07, 0x87, 0x57, 0x0d, 0xab, 0x26, 0x4c, 0x89, 0x8a, 0x44, + 0x64, 0x56, 0xcd, 0x39, 0x09, 0x1d, 0xc3, 0xb8, 0x29, 0x1c, 0x8e, 0x42, + 0x62, 0x23, 0xfd, 0x16, 0x49, 0x92, 0x91, 0x29, 0x8e, 0xc3, 0xb8, 0x3b, + 0x09, 0xcc, 0xd4, 0x32, 0xc6, 0x49, 0x92, 0x63, 0x63, 0x66, 0x4c, 0x99, + 0x32, 0x64, 0xc9, 0xc8, 0xe4, 0x72, 0x39, 0x0a, 0x47, 0x34, 0x29, 0x26, + 0x26, 0x21, 0x09, 0xe0, 0x83, 0xc8, 0x84, 0x21, 0x08, 0x42, 0x10, 0x99, + 0x93, 0x99, 0xcc, 0xee, 0x19, 0x6c, 0x58, 0x23, 0x8e, 0x8f, 0x23, 0xc9, + 0x86, 0x49, 0x32, 0x48, 0x6b, 0xa2, 0x91, 0x19, 0x91, 0x90, 0x98, 0xbd, + 0x1f, 0x04, 0xe4, 0x39, 0x75, 0x79, 0x43, 0x9f, 0x46, 0xc6, 0x36, 0x36, + 0x36, 0x31, 0x8e, 0xc8, 0x93, 0xd4, 0x56, 0x89, 0x6b, 0x2a, 0x1e, 0xb6, + 0xb2, 0x5a, 0xd8, 0x21, 0x6b, 0xab, 0x94, 0x7c, 0xdd, 0x6c, 0x7a, 0xaa, + 0xcf, 0x31, 0x59, 0xde, 0x83, 0x39, 0xa1, 0xc9, 0x1c, 0xb2, 0x72, 0x37, + 0x79, 0xe3, 0x6d, 0xda, 0x17, 0x0d, 0xb7, 0x26, 0x4c, 0x99, 0x13, 0x22, + 0xca, 0x8a, 0x99, 0x19, 0x9c, 0xc5, 0x21, 0x4c, 0xe6, 0x29, 0x11, 0x64, + 0x48, 0xff, 0x00, 0x41, 0xb2, 0x53, 0x25, 0x61, 0x2b, 0x09, 0x58, 0x39, + 0x8e, 0xc3, 0xb8, 0x39, 0x97, 0x32, 0xc6, 0x4a, 0x43, 0x90, 0xd8, 0xd9, + 0x93, 0x26, 0x4c, 0x9c, 0x8e, 0x47, 0x21, 0xdb, 0xc5, 0x4f, 0x74, 0xac, + 0xaa, 0x73, 0x91, 0x93, 0xe4, 0x47, 0x2c, 0x09, 0xb1, 0x36, 0x2c, 0xb2, + 0x11, 0x70, 0x71, 0xba, 0xc8, 0x91, 0xd5, 0x58, 0x88, 0xeb, 0xac, 0x44, + 0x77, 0x16, 0x43, 0x5e, 0x99, 0xe7, 0xeb, 0xc5, 0x16, 0xc2, 0xe3, 0x0d, + 0x1c, 0xce, 0xe1, 0x96, 0xc4, 0x93, 0x16, 0x53, 0x51, 0x23, 0x02, 0x08, + 0xe3, 0x91, 0xc0, 0x71, 0x38, 0x92, 0x89, 0x38, 0x92, 0x44, 0x8b, 0xb5, + 0x3d, 0x97, 0xa6, 0xd5, 0x2b, 0xa5, 0x01, 0x08, 0x42, 0x5d, 0x27, 0x21, + 0xf4, 0xc1, 0xf0, 0x49, 0x8c, 0xff, 0x00, 0xbe, 0xe5, 0x9a, 0x9a, 0xab, + 0x25, 0xba, 0xe9, 0x11, 0x66, 0xf5, 0xa3, 0x4b, 0xf1, 0xa5, 0x61, 0x2d, + 0x65, 0xd6, 0x13, 0x56, 0x58, 0x76, 0xfd, 0xbb, 0x49, 0x9d, 0xa4, 0x3a, + 0xd0, 0xeb, 0x58, 0x51, 0x49, 0xd9, 0x52, 0x89, 0xc5, 0x35, 0x28, 0x23, + 0x87, 0xb3, 0x8e, 0x4e, 0x53, 0x89, 0x76, 0xe5, 0x7e, 0x82, 0xcd, 0x1e, + 0xff, 0x00, 0x5e, 0xaa, 0x5b, 0xc6, 0xae, 0x33, 0xdb, 0x74, 0x76, 0x42, + 0x3a, 0x6e, 0x46, 0x4c, 0x99, 0x14, 0x88, 0xb2, 0xa9, 0x10, 0x98, 0xac, + 0x25, 0xac, 0x85, 0x67, 0xe2, 0xd0, 0x47, 0xe3, 0x44, 0x37, 0xa8, 0x9a, + 0x7d, 0x5d, 0x77, 0x91, 0x64, 0x64, 0x46, 0x5f, 0xd0, 0x64, 0xcb, 0x66, + 0x4e, 0x64, 0xa6, 0x3b, 0x19, 0xde, 0x3b, 0xc3, 0xb4, 0xb2, 0xc2, 0xd9, + 0x12, 0x63, 0x63, 0x66, 0x4c, 0x99, 0x39, 0x0e, 0x78, 0x1d, 0xf1, 0x3b, + 0xac, 0x96, 0xa7, 0x88, 0xf7, 0x05, 0x29, 0xc2, 0xfe, 0x37, 0x63, 0x0b, + 0x22, 0xf7, 0xe9, 0x94, 0x84, 0xdb, 0x12, 0xc2, 0x42, 0x12, 0xe9, 0xcd, + 0x23, 0xbc, 0xcc, 0x4e, 0x63, 0x85, 0x55, 0x9e, 0x77, 0x48, 0x9d, 0x1b, + 0xa8, 0xb7, 0x0b, 0x1b, 0xaf, 0x59, 0x54, 0x8a, 0xff, 0x00, 0x31, 0x46, + 0x22, 0x88, 0x90, 0x90, 0xbe, 0x3b, 0xb1, 0xac, 0xb7, 0x77, 0xd2, 0x56, + 0xec, 0xdf, 0x74, 0xe8, 0xbb, 0xc4, 0xb5, 0x56, 0x5b, 0xe2, 0x8c, 0xc2, + 0x5b, 0xf5, 0xb6, 0xc5, 0x6f, 0x56, 0x5f, 0x19, 0x6a, 0xef, 0x91, 0x7a, + 0xd5, 0x4a, 0x51, 0xd4, 0xea, 0x69, 0x9a, 0xd7, 0x58, 0x8f, 0xc5, 0x6d, + 0x8b, 0xff, 0x00, 0xd0, 0x59, 0x44, 0x69, 0xf1, 0x5f, 0x32, 0x1e, 0x26, + 0xc9, 0xff, 0x00, 0xa6, 0x51, 0x23, 0xbc, 0xd1, 0x61, 0x1d, 0x5d, 0x36, + 0x1e, 0xcc, 0x63, 0xe9, 0x83, 0x59, 0xe2, 0x1a, 0x28, 0x35, 0x7b, 0xc6, + 0xab, 0x52, 0xe5, 0x26, 0xde, 0x4c, 0x99, 0x28, 0xdc, 0x25, 0x59, 0x55, + 0xf1, 0xbe, 0x22, 0x3f, 0xeb, 0xf9, 0x7e, 0xe9, 0xfb, 0xc5, 0x3c, 0xa9, + 0x2e, 0x0c, 0xcf, 0x19, 0x4a, 0x25, 0x9f, 0x1a, 0xc6, 0xeb, 0xb2, 0x7a, + 0x87, 0x55, 0xfb, 0x8e, 0xe5, 0xe6, 0x21, 0x4e, 0xe3, 0x7f, 0x18, 0xef, + 0x52, 0x89, 0x56, 0xae, 0x52, 0x4b, 0x55, 0x74, 0x45, 0xaf, 0x81, 0x5d, + 0xd0, 0x99, 0x12, 0xa2, 0x56, 0xaa, 0xa1, 0x3d, 0x4c, 0xe6, 0x64, 0xc9, + 0x91, 0x32, 0x89, 0x61, 0xe9, 0x35, 0x32, 0x99, 0x06, 0x40, 0x8f, 0xda, + 0xd3, 0xea, 0x6b, 0xd5, 0x57, 0xd1, 0xce, 0x31, 0x14, 0x94, 0x89, 0x7b, + 0x2b, 0xac, 0x26, 0xc9, 0xb2, 0x4c, 0x93, 0x1b, 0x25, 0x34, 0x87, 0x71, + 0x3b, 0x89, 0xd8, 0x8b, 0x2e, 0x81, 0xdd, 0x8b, 0x39, 0x0e, 0x58, 0x15, + 0x9c, 0xcb, 0x35, 0x2a, 0xa7, 0x66, 0xba, 0x27, 0x9b, 0x91, 0x2d, 0x55, + 0xc4, 0x9b, 0xee, 0x43, 0xe9, 0x9d, 0x96, 0xa8, 0x3d, 0x62, 0xee, 0x6b, + 0x24, 0x65, 0x23, 0x93, 0x91, 0x86, 0x28, 0x91, 0xf7, 0x33, 0xee, 0x99, + 0xcf, 0x07, 0x31, 0x65, 0x91, 0xac, 0xd7, 0xee, 0xf0, 0xd0, 0xbb, 0xb7, + 0x5d, 0x4d, 0xe3, 0x93, 0x93, 0x22, 0xcd, 0x1e, 0xef, 0xa8, 0xd3, 0x1a, + 0x0d, 0x4d, 0x7b, 0x85, 0x6a, 0xa5, 0x02, 0x1b, 0x95, 0x95, 0x1a, 0x6d, + 0xce, 0xbb, 0x9c, 0xb5, 0xf5, 0x56, 0x6a, 0x3c, 0x41, 0x5d, 0x06, 0xab, + 0xc5, 0xf1, 0x47, 0xe3, 0x97, 0xea, 0xc7, 0x6d, 0xf3, 0x2c, 0x9c, 0x4c, + 0x14, 0x6a, 0x1d, 0x71, 0xb3, 0x5d, 0x74, 0xca, 0x6c, 0xd4, 0x57, 0x7a, + 0x9d, 0xf6, 0x42, 0x11, 0x94, 0xea, 0x95, 0x33, 0x84, 0xff, 0x00, 0x36, + 0xc9, 0x46, 0x36, 0x63, 0x5d, 0x2b, 0x21, 0x0e, 0xe6, 0x16, 0x83, 0x55, + 0xdb, 0x92, 0xd6, 0xc9, 0x0b, 0x71, 0x64, 0x77, 0x64, 0x8a, 0xf7, 0xce, + 0x0e, 0xad, 0xf6, 0xd4, 0x57, 0xbf, 0xd7, 0x32, 0x5b, 0x92, 0x6b, 0x5d, + 0xa9, 0xba, 0xcd, 0x23, 0x64, 0x86, 0xcc, 0x99, 0x32, 0x64, 0xdb, 0xac, + 0x71, 0xd4, 0x36, 0x61, 0xe5, 0xe0, 0x6d, 0x19, 0x3e, 0x25, 0xf0, 0x7e, + 0xa4, 0xd6, 0x1c, 0x97, 0x25, 0xcb, 0x03, 0x46, 0xbe, 0xbe, 0x5a, 0x5b, + 0xa9, 0x5e, 0x6b, 0x51, 0x05, 0xc2, 0xb5, 0xda, 0x73, 0x92, 0xee, 0x24, + 0xa4, 0xab, 0xba, 0x74, 0x91, 0xde, 0x35, 0x18, 0xab, 0x75, 0xd3, 0xc8, + 0xd3, 0x6b, 0x53, 0x2b, 0xdc, 0xae, 0xd3, 0xa9, 0x6e, 0x15, 0x6a, 0xab, + 0x4c, 0xc9, 0x93, 0x22, 0x65, 0x2f, 0xdf, 0x6f, 0x7f, 0x99, 0x02, 0xb1, + 0x7c, 0x7d, 0x8b, 0xf5, 0x10, 0xd3, 0x57, 0xe8, 0x95, 0x11, 0xb0, 0x7b, + 0x6f, 0xd5, 0x66, 0x8b, 0x55, 0x02, 0xe9, 0xea, 0x69, 0x3c, 0xfe, 0x5d, + 0x9a, 0xc4, 0x87, 0xa9, 0x84, 0x89, 0xde, 0xd8, 0xe6, 0x72, 0x33, 0xc8, + 0xd4, 0x32, 0x7d, 0x15, 0xb2, 0x4a, 0xed, 0x6b, 0xa2, 0xbb, 0xb7, 0x0b, + 0xf5, 0x07, 0x70, 0xf3, 0x32, 0xc5, 0x56, 0xe6, 0x39, 0xc9, 0x3f, 0xaa, + 0x39, 0xcc, 0x57, 0x19, 0x3d, 0x3a, 0x52, 0xdc, 0xe6, 0xfd, 0xf8, 0x89, + 0x09, 0x19, 0x48, 0x8b, 0x3e, 0x0c, 0x89, 0x11, 0x89, 0xc9, 0x23, 0x99, + 0xb8, 0x4b, 0x96, 0xb5, 0x75, 0x44, 0x4d, 0x82, 0x52, 0xf3, 0x91, 0xad, + 0xc8, 0x8b, 0x8c, 0x67, 0x27, 0xcd, 0x4b, 0x4d, 0x0b, 0x56, 0xe1, 0xe0, + 0xe9, 0xd9, 0x1d, 0x4e, 0x92, 0xdd, 0x24, 0xe9, 0xbe, 0x7a, 0x69, 0xc2, + 0xf8, 0x4d, 0xc6, 0xca, 0xd1, 0xac, 0xb6, 0xa8, 0xc1, 0xea, 0xd4, 0xe9, + 0xa7, 0x53, 0x64, 0xaa, 0xd5, 0x4a, 0x6a, 0x71, 0xba, 0xc8, 0xa8, 0xd9, + 0x6d, 0x52, 0xba, 0xf7, 0xca, 0xa7, 0x6a, 0x83, 0x9c, 0xe2, 0x6b, 0x2c, + 0xe7, 0x2a, 0xb9, 0x4e, 0xc8, 0xcb, 0xb6, 0x96, 0xae, 0xb3, 0xbd, 0x0b, + 0x2c, 0x76, 0x42, 0xa3, 0x47, 0xb7, 0x5f, 0xa9, 0xb3, 0x41, 0xe1, 0x49, + 0x8b, 0x47, 0x55, 0x50, 0x35, 0x6f, 0xfd, 0x66, 0x49, 0x8d, 0xf4, 0x5d, + 0x74, 0x4f, 0x1a, 0x9e, 0x63, 0x96, 0x7a, 0xe0, 0xb5, 0x62, 0x6d, 0x7b, + 0xbf, 0x61, 0xfb, 0x8f, 0xd8, 0x6b, 0x91, 0xef, 0x12, 0xda, 0xfb, 0xb4, + 0x5e, 0xdc, 0x35, 0x93, 0xfd, 0x2a, 0x2e, 0x45, 0x95, 0xba, 0xad, 0x32, + 0x3f, 0x73, 0xfe, 0x28, 0xb6, 0x69, 0x37, 0x3d, 0x4e, 0x81, 0xed, 0x7b, + 0xaf, 0x9f, 0xb9, 0x33, 0x26, 0x4c, 0x89, 0x95, 0x33, 0x6e, 0x97, 0xe6, + 0x47, 0x57, 0x5d, 0x64, 0x37, 0x1a, 0x51, 0x5e, 0xb9, 0xdc, 0x47, 0x9b, + 0x31, 0xeb, 0xcf, 0xbd, 0x57, 0x5b, 0xa5, 0x8d, 0x9b, 0x9d, 0x8c, 0x5b, + 0xdc, 0xab, 0x1e, 0xfb, 0x0e, 0x56, 0x78, 0x9a, 0x27, 0xfe, 0x9b, 0x04, + 0x7c, 0x4c, 0x8f, 0xfd, 0x17, 0x22, 0xcd, 0xce, 0x1a, 0x85, 0x3f, 0x2d, + 0x9d, 0x7e, 0xa5, 0xe9, 0xf5, 0xb1, 0xdd, 0xad, 0x44, 0x77, 0xcb, 0xe2, + 0xa1, 0xe2, 0x0a, 0x64, 0x69, 0x75, 0xd5, 0x6a, 0x67, 0xa9, 0x64, 0xcc, + 0xf4, 0xd4, 0xfe, 0xd6, 0x4c, 0x99, 0x21, 0x39, 0x71, 0xfa, 0xce, 0x03, + 0x8a, 0x28, 0x94, 0x63, 0x7e, 0x8a, 0xb5, 0xe7, 0xdf, 0xcf, 0xb4, 0x4f, + 0x79, 0x1c, 0x58, 0xa2, 0x63, 0xe9, 0x48, 0x4b, 0x07, 0x23, 0x39, 0x17, + 0x4d, 0x44, 0xb9, 0x6a, 0x17, 0x46, 0x22, 0x27, 0x87, 0x1f, 0xfb, 0x8e, + 0xcf, 0x6a, 0x9f, 0xd7, 0x93, 0x4d, 0x35, 0x07, 0x1d, 0xc3, 0x8c, 0x75, + 0x54, 0xad, 0xda, 0x1b, 0xa7, 0x80, 0xae, 0xc6, 0x2d, 0xd0, 0x6a, 0x73, + 0x08, 0x11, 0xd4, 0x42, 0x22, 0xd4, 0xcc, 0x8d, 0xcd, 0x59, 0x77, 0xd6, + 0xaa, 0xbb, 0x9d, 0x6e, 0xd8, 0xb2, 0x76, 0x7e, 0x67, 0x7e, 0x4c, 0x73, + 0x98, 0xee, 0x8c, 0xdd, 0x16, 0x61, 0xab, 0xe5, 0x02, 0x5a, 0xcc, 0x91, + 0x9c, 0x2e, 0x9e, 0xd1, 0xe0, 0x69, 0xea, 0x0d, 0x36, 0x97, 0x4f, 0xa3, + 0xd2, 0xdd, 0x28, 0xa8, 0x4d, 0x7d, 0x32, 0x35, 0x7f, 0xc6, 0x91, 0x21, + 0xf4, 0x5d, 0x19, 0xa7, 0xfd, 0xf3, 0xdc, 0xc1, 0x8e, 0x96, 0xaf, 0xcb, + 0x1a, 0x1a, 0x1f, 0x4c, 0xe4, 0x8f, 0xb1, 0xad, 0xaa, 0xb7, 0xaf, 0xbb, + 0x4f, 0x5c, 0x23, 0x0f, 0x8b, 0xbf, 0x77, 0x26, 0x7d, 0x1f, 0x26, 0xc1, + 0x05, 0x0d, 0x52, 0x7d, 0x32, 0x64, 0xc9, 0x5b, 0x36, 0xf9, 0x7d, 0x70, + 0xd8, 0xb4, 0xd5, 0x94, 0xdb, 0xb7, 0xd6, 0xfc, 0xe0, 0xf7, 0x6a, 0x62, + 0xbf, 0x1b, 0xd3, 0xa8, 0xfe, 0x35, 0x02, 0x1b, 0x97, 0xb4, 0x75, 0x73, + 0x91, 0xdf, 0x91, 0xdd, 0x91, 0x2b, 0x26, 0x5f, 0x29, 0xd9, 0x0b, 0x22, + 0x59, 0x12, 0xc8, 0x96, 0x40, 0xb2, 0x04, 0xe0, 0x4e, 0x04, 0xa2, 0x49, + 0x08, 0xdf, 0x33, 0x4e, 0xa7, 0xcc, 0x0a, 0xfc, 0x12, 0xd6, 0xcb, 0x1e, + 0x19, 0xbe, 0x73, 0xb3, 0x50, 0x4f, 0xad, 0xff, 0x00, 0xb7, 0x93, 0x26, + 0x45, 0x3c, 0x24, 0xf9, 0x0e, 0xda, 0x91, 0xe6, 0x69, 0x46, 0x92, 0xea, + 0xed, 0xd5, 0xe9, 0x6b, 0xe2, 0x60, 0x49, 0x23, 0x27, 0x23, 0x39, 0x18, + 0x9f, 0x55, 0xd1, 0xbf, 0x69, 0x3c, 0xcd, 0x0f, 0xa2, 0x22, 0x78, 0x77, + 0xf9, 0x13, 0x96, 0x16, 0x9e, 0x59, 0x68, 0xd3, 0xfb, 0x1a, 0x7b, 0xa8, + 0x44, 0xb5, 0xf5, 0x41, 0x47, 0x53, 0x7e, 0xa5, 0xeb, 0xf6, 0x2d, 0x36, + 0xe7, 0x5e, 0xf5, 0xe0, 0xdd, 0x5e, 0xd6, 0xe3, 0xab, 0xe3, 0x2b, 0x35, + 0xdf, 0x4c, 0xef, 0x6e, 0x11, 0xd4, 0xb7, 0x1d, 0x06, 0xaa, 0x5c, 0x5e, + 0xaa, 0x6a, 0x52, 0xba, 0x5c, 0x96, 0xa2, 0x6a, 0x32, 0xd4, 0x49, 0x47, + 0x96, 0x15, 0x57, 0x71, 0x5e, 0x6d, 0x9b, 0x36, 0xc5, 0xac, 0xdf, 0x25, + 0xb4, 0x78, 0x7b, 0x4d, 0xb3, 0xc2, 0x89, 0x28, 0xbb, 0x63, 0x05, 0x19, + 0x55, 0x93, 0x50, 0xfd, 0xe4, 0x8d, 0x57, 0xec, 0x48, 0x90, 0xfa, 0x2e, + 0xb4, 0xbf, 0xce, 0xc9, 0xc8, 0xc9, 0x93, 0x24, 0xbf, 0x6a, 0x2f, 0xe9, + 0x18, 0xcc, 0x0c, 0x53, 0xc1, 0xbf, 0xe9, 0x9d, 0xb7, 0xe9, 0xf2, 0x47, + 0xe1, 0x4e, 0x46, 0x4c, 0x99, 0x32, 0x21, 0x1b, 0x1f, 0xf2, 0x57, 0x46, + 0xcc, 0x99, 0x20, 0xcd, 0x0c, 0xbd, 0xf5, 0x5b, 0x95, 0x9d, 0xef, 0xc4, + 0xb5, 0x76, 0xa8, 0xa7, 0x22, 0xa8, 0x15, 0x40, 0xaa, 0x05, 0x71, 0x20, + 0x2e, 0x8c, 0x92, 0x27, 0x22, 0x6c, 0x99, 0x32, 0x68, 0x9a, 0x26, 0x89, + 0x22, 0x48, 0xc7, 0xbf, 0x89, 0x29, 0xe5, 0xa4, 0xeb, 0xe1, 0x5f, 0xdc, + 0xd4, 0x13, 0xeb, 0x6f, 0xe8, 0xeb, 0x77, 0xea, 0xeb, 0xb0, 0x52, 0xae, + 0xdc, 0x6a, 0xaf, 0x10, 0x32, 0x67, 0xab, 0xfd, 0x4b, 0xd3, 0x6b, 0xc5, + 0x5f, 0xf5, 0x0f, 0xa2, 0x22, 0x78, 0x77, 0xf7, 0x6c, 0x7f, 0x4e, 0x98, + 0x89, 0x51, 0x0e, 0x4c, 0xa6, 0x88, 0xe6, 0x2d, 0x61, 0x0f, 0xe3, 0xc4, + 0x1e, 0x09, 0xd2, 0xee, 0xc6, 0xeb, 0xb5, 0x6a, 0x76, 0x8d, 0x46, 0x54, + 0x5a, 0x94, 0x53, 0xa2, 0xc5, 0x0d, 0x45, 0x92, 0x82, 0x97, 0x76, 0x07, + 0x72, 0x24, 0xec, 0x47, 0x2f, 0x78, 0x29, 0x5b, 0x3f, 0x0e, 0x78, 0x25, + 0xea, 0x0a, 0xaa, 0x85, 0x35, 0x98, 0x22, 0xbd, 0xa5, 0x73, 0x55, 0x3a, + 0xa5, 0x22, 0x71, 0xc1, 0xa9, 0x5f, 0x93, 0x22, 0x5d, 0x57, 0x58, 0x7e, + 0xbe, 0xb9, 0x32, 0x3f, 0xd3, 0x1f, 0xd2, 0x3f, 0x44, 0x57, 0xbf, 0x89, + 0xfe, 0x9d, 0x6d, 0x0c, 0x93, 0x6a, 0x2b, 0xd2, 0xa4, 0x46, 0x49, 0x9b, + 0x1b, 0x5e, 0x65, 0x74, 0x7d, 0x32, 0x41, 0x9a, 0x39, 0x7b, 0xea, 0x23, + 0xfe, 0xc5, 0x71, 0x20, 0x8a, 0xca, 0xc8, 0x32, 0xb9, 0x11, 0x98, 0xa4, + 0x73, 0x39, 0x8e, 0x44, 0xa6, 0x4a, 0x44, 0xd9, 0x26, 0x4c, 0x99, 0x32, + 0x44, 0xba, 0x6e, 0x95, 0x77, 0xb6, 0xde, 0xbe, 0x16, 0xf9, 0xbc, 0x9f, + 0x59, 0xfc, 0x75, 0xbf, 0xf5, 0x75, 0xf0, 0xa4, 0x39, 0xee, 0x7a, 0x77, + 0xca, 0x8e, 0x58, 0x39, 0x23, 0xd8, 0xc0, 0x93, 0xcb, 0x6f, 0x92, 0x17, + 0xa3, 0x56, 0xf1, 0xa5, 0xff, 0x00, 0xa3, 0xe8, 0x88, 0x9e, 0x1d, 0xfd, + 0x56, 0xbf, 0x6d, 0x37, 0xc4, 0x4a, 0xca, 0xd9, 0x51, 0x1f, 0x8e, 0x8c, + 0xdc, 0xb6, 0x5d, 0x2e, 0xeb, 0x47, 0x88, 0x3f, 0xc7, 0xba, 0x9d, 0x19, + 0x2a, 0xed, 0x8c, 0xbc, 0xbe, 0xa3, 0x9b, 0xd1, 0x6a, 0xee, 0x16, 0xd3, + 0xae, 0x3f, 0x0d, 0xd6, 0xa2, 0x7a, 0x0d, 0x4b, 0x7b, 0x76, 0xc5, 0xac, + 0xdc, 0x2e, 0xd8, 0x3c, 0x27, 0xa6, 0xda, 0x54, 0x56, 0x3a, 0xf2, 0x84, + 0x48, 0x4e, 0x56, 0xc6, 0x09, 0x2a, 0xf5, 0x33, 0xf7, 0x92, 0x35, 0x11, + 0xfc, 0xa9, 0xfc, 0xcb, 0xd4, 0xbe, 0x7a, 0xe7, 0xa6, 0x7d, 0xa2, 0xfe, + 0x9f, 0x4c, 0x3e, 0x7c, 0x59, 0x1c, 0x6a, 0x34, 0x7d, 0xb7, 0x67, 0x63, + 0xcb, 0xea, 0xb5, 0xbc, 0x7c, 0xdf, 0xa3, 0x9e, 0x0e, 0x51, 0x67, 0x87, + 0xe4, 0x9e, 0xa5, 0x74, 0x6f, 0xac, 0x59, 0xa5, 0x7f, 0x55, 0xff, 0x00, + 0xc8, 0xac, 0x81, 0x06, 0x41, 0x91, 0x91, 0x19, 0x91, 0x98, 0xac, 0x3b, + 0x87, 0x70, 0x76, 0x0e, 0x64, 0xa4, 0x4a, 0x44, 0x99, 0x26, 0x49, 0x92, + 0x24, 0x48, 0x66, 0x39, 0x46, 0xd8, 0x76, 0xed, 0xe9, 0xe1, 0x8f, 0xd1, + 0x79, 0x3e, 0xb2, 0xf8, 0x7f, 0x3d, 0x2e, 0xf9, 0xeb, 0xb1, 0x5f, 0x6d, + 0x5a, 0xed, 0x1d, 0x9c, 0xaa, 0xc2, 0x38, 0x1c, 0x0e, 0x2c, 0x8e, 0x73, + 0xcb, 0xdf, 0xe7, 0xd3, 0xb8, 0x3c, 0x68, 0x97, 0xc8, 0xfa, 0x22, 0x27, + 0x87, 0x8b, 0x59, 0xa7, 0xfd, 0x31, 0x2b, 0x65, 0x6c, 0xa0, 0x8f, 0xc7, + 0x5f, 0x82, 0xdb, 0xe3, 0x08, 0xf8, 0xf3, 0x68, 0x9d, 0xba, 0x79, 0x6b, + 0x35, 0x18, 0x7a, 0xbb, 0xda, 0xf3, 0x16, 0xe3, 0xcc, 0xdb, 0x8d, 0xaa, + 0x2f, 0x5b, 0xb8, 0xe9, 0x34, 0xf0, 0xa6, 0x34, 0xac, 0xd9, 0x83, 0x8e, + 0x0c, 0x0b, 0x09, 0xc7, 0x36, 0x15, 0xc7, 0xdb, 0x54, 0x92, 0x72, 0x2f, + 0x5f, 0x97, 0x67, 0xcc, 0xba, 0x2f, 0x47, 0xfd, 0x5f, 0xa7, 0xd1, 0xff, + 0x00, 0x17, 0xb4, 0x7d, 0x19, 0x20, 0x78, 0xbe, 0xd8, 0xca, 0xfd, 0x33, + 0xc0, 0xa5, 0xf5, 0x58, 0xf9, 0x59, 0xea, 0xf0, 0xef, 0xf2, 0x57, 0x47, + 0xd6, 0x2c, 0xd3, 0x4b, 0xde, 0xff, 0x00, 0xdf, 0x81, 0x12, 0x04, 0x59, + 0x19, 0x11, 0x90, 0xa6, 0x29, 0x9d, 0xc3, 0xb8, 0x3b, 0x07, 0x21, 0xc8, + 0x6c, 0x93, 0x24, 0x48, 0x91, 0x22, 0x44, 0x88, 0xb3, 0x7a, 0xaf, 0xb5, + 0xb9, 0x74, 0xf0, 0xdf, 0xec, 0x5d, 0xf1, 0x3e, 0xb2, 0x27, 0xfa, 0xba, + 0x5d, 0xf3, 0xd1, 0x1b, 0x05, 0xda, 0x6b, 0xec, 0xdb, 0xd7, 0xe4, 0x3c, + 0xa1, 0x4b, 0xa3, 0x23, 0xcb, 0x97, 0x23, 0x97, 0xa7, 0x74, 0x78, 0xd0, + 0xaf, 0x91, 0xf4, 0x44, 0x4f, 0x0f, 0xfc, 0x5a, 0xfd, 0xe8, 0xfd, 0x30, + 0x20, 0x56, 0x69, 0xcf, 0xf9, 0x93, 0x3d, 0x38, 0xf2, 0x1e, 0x9e, 0x07, + 0xf9, 0x33, 0x51, 0xc7, 0x62, 0x7e, 0x8d, 0xba, 0xde, 0xc6, 0xb6, 0x8f, + 0x9d, 0x3a, 0xf6, 0xc0, 0x91, 0x8e, 0x90, 0x6c, 0xab, 0xe7, 0x59, 0x04, + 0x89, 0xa2, 0xd8, 0xfd, 0x16, 0xfe, 0xa9, 0x74, 0x5e, 0x98, 0x7b, 0xd7, + 0x8e, 0x8d, 0x98, 0x25, 0xfa, 0x56, 0x1c, 0x7d, 0x1f, 0xa4, 0x87, 0xcf, + 0x89, 0x3d, 0xf5, 0xfa, 0x72, 0x7f, 0xb5, 0xeb, 0xf0, 0xe7, 0xf2, 0x97, + 0x47, 0xd5, 0x1a, 0x77, 0xf5, 0x5d, 0xfb, 0xd1, 0x20, 0xc8, 0xb2, 0x32, + 0x14, 0x85, 0x21, 0x48, 0xe4, 0x72, 0x39, 0x9c, 0xc7, 0x21, 0xc8, 0x72, + 0x1b, 0x24, 0xc9, 0x31, 0x92, 0x19, 0x23, 0x3e, 0xfe, 0x26, 0xaf, 0x1a, + 0x9e, 0x9e, 0x1e, 0xfe, 0x25, 0xbf, 0x13, 0xf9, 0xe8, 0xcb, 0x3f, 0x5f, + 0x4b, 0xbe, 0x7a, 0x64, 0xf0, 0x8e, 0x9f, 0xcd, 0xee, 0xda, 0x7a, 0x7b, + 0x35, 0xe4, 0x67, 0x2c, 0x1d, 0xc2, 0x32, 0x6e, 0x5e, 0xad, 0xdd, 0xff, + 0x00, 0xa3, 0x1f, 0x96, 0x3e, 0x88, 0x81, 0xb2, 0x4f, 0x84, 0x1d, 0x9c, + 0xa5, 0x47, 0xe9, 0x81, 0x59, 0x52, 0x34, 0x55, 0x7b, 0x4d, 0x7b, 0x72, + 0x10, 0x8c, 0xe0, 0xb1, 0xca, 0xd3, 0xfc, 0xab, 0x66, 0x34, 0x3d, 0x7f, + 0xf9, 0x87, 0xce, 0xdb, 0x77, 0x98, 0xd0, 0xd4, 0xb0, 0x94, 0x05, 0x59, + 0xc0, 0xe0, 0x61, 0x9a, 0x78, 0x60, 0x94, 0x14, 0xd5, 0xfa, 0x6e, 0x32, + 0x95, 0x1f, 0x4d, 0xff, 0x00, 0xae, 0x5d, 0x17, 0xa6, 0x8f, 0xd9, 0x1f, + 0x46, 0xcf, 0xfe, 0x20, 0xbe, 0x9c, 0x75, 0x47, 0xc8, 0xbe, 0x3c, 0x49, + 0x0c, 0x6a, 0xb4, 0xff, 0x00, 0xa6, 0xdf, 0xda, 0x5f, 0x1e, 0xaf, 0x0e, + 0xff, 0x00, 0x29, 0x0c, 0x7d, 0x51, 0x43, 0xfa, 0xad, 0xfd, 0xd8, 0x91, + 0x64, 0x58, 0x98, 0xa4, 0x29, 0x0a, 0x47, 0x23, 0x91, 0xc8, 0xe4, 0x39, + 0x0e, 0x43, 0x63, 0x63, 0x64, 0x98, 0xc9, 0x0c, 0x91, 0x23, 0xc4, 0x71, + 0xe5, 0xa5, 0xe9, 0xb0, 0xfb, 0x68, 0xa6, 0xf3, 0x19, 0x3f, 0x7e, 0x8c, + 0xb7, 0xf7, 0x3a, 0x5d, 0xf3, 0x15, 0xc9, 0xcd, 0xc5, 0x0a, 0x5e, 0xfe, + 0x11, 0xba, 0x3a, 0x6d, 0xe3, 0x5b, 0x44, 0x74, 0xe3, 0x59, 0xe8, 0xd3, + 0x30, 0xca, 0xd6, 0x1a, 0x17, 0xa7, 0x7a, 0x7f, 0xe9, 0xc4, 0x7d, 0x51, + 0x03, 0x64, 0x8f, 0x2a, 0xb8, 0xfd, 0x54, 0xfb, 0x28, 0x15, 0xb2, 0xa6, + 0x69, 0x2d, 0xc2, 0xbe, 0xff, 0x00, 0xa5, 0x59, 0x92, 0x16, 0xe5, 0x46, + 0x67, 0x32, 0x53, 0xf6, 0xff, 0x00, 0x29, 0x4a, 0x32, 0xb3, 0xaf, 0xfc, + 0x89, 0xe1, 0x49, 0x29, 0xec, 0x75, 0x61, 0x0a, 0x46, 0x4c, 0x9c, 0xf0, + 0x3b, 0x3d, 0xe8, 0x92, 0x68, 0xd5, 0x5a, 0x94, 0xf9, 0xe6, 0x3a, 0x9f, + 0xdc, 0x97, 0xaf, 0x4b, 0xef, 0xa7, 0x7d, 0x1f, 0x48, 0xfd, 0x42, 0x52, + 0x4b, 0x9b, 0x66, 0x7a, 0x27, 0xd2, 0x1f, 0x3e, 0x27, 0xab, 0xf3, 0x76, + 0x8e, 0xd3, 0x2e, 0xfd, 0xa5, 0xf1, 0xea, 0xf0, 0xf7, 0xf2, 0x90, 0xc7, + 0xd5, 0x14, 0xbf, 0xaa, 0xdf, 0xdc, 0x89, 0x11, 0x09, 0x89, 0x89, 0x9c, + 0x8e, 0x47, 0x23, 0x91, 0xc8, 0xc9, 0x91, 0xb1, 0x8c, 0x63, 0x24, 0x31, + 0x8c, 0xdc, 0x74, 0xbe, 0x6b, 0x49, 0xd3, 0x66, 0x8e, 0x74, 0x36, 0xc3, + 0x85, 0x4d, 0xfb, 0xf4, 0x65, 0xdf, 0xbb, 0xd2, 0xef, 0x9a, 0x72, 0xed, + 0x97, 0xc9, 0xb0, 0xe5, 0x4b, 0xcc, 0xf7, 0x68, 0xee, 0xa3, 0xb8, 0x8e, + 0xe2, 0x33, 0x11, 0x38, 0xa1, 0x49, 0x19, 0x46, 0x4c, 0xf5, 0xde, 0xdf, + 0xfa, 0xd1, 0x1f, 0x54, 0x40, 0xd8, 0xff, 0x00, 0x65, 0x7e, 0xe5, 0x6f, + 0xda, 0x0f, 0xde, 0x0c, 0xad, 0x95, 0x4f, 0xda, 0x76, 0x7b, 0x46, 0x7e, + 0xf1, 0x9e, 0x24, 0xa6, 0x73, 0x1c, 0xcf, 0xf2, 0x8c, 0x72, 0x9f, 0x45, + 0xee, 0x3f, 0x62, 0xbf, 0xd5, 0xe0, 0xdb, 0x54, 0xb6, 0x1a, 0xd9, 0xdc, + 0x47, 0x74, 0x76, 0x8e, 0xd2, 0x56, 0x15, 0x5c, 0xe1, 0x28, 0xea, 0x39, + 0x47, 0x59, 0xf3, 0xcf, 0x11, 0xd5, 0xfe, 0xf4, 0xbd, 0x19, 0x39, 0x99, + 0x34, 0x72, 0xff, 0x00, 0x55, 0xbe, 0x92, 0xe9, 0x07, 0x89, 0x31, 0xaf, + 0x42, 0x28, 0x9f, 0x0b, 0xbc, 0x51, 0x6f, 0xfb, 0x34, 0x3c, 0x16, 0xfe, + 0xda, 0xf8, 0xf5, 0x78, 0x7b, 0xf9, 0x8b, 0xe1, 0x8f, 0xd1, 0x53, 0xf7, + 0xb3, 0xf5, 0xa1, 0x31, 0x31, 0x31, 0x33, 0x26, 0x4c, 0x99, 0x32, 0x64, + 0xc8, 0xd8, 0xd8, 0xc6, 0xc6, 0x31, 0x8c, 0x63, 0x3f, 0xee, 0xf1, 0xa5, + 0xf2, 0xba, 0xe3, 0x61, 0x7f, 0xff, 0x00, 0x3b, 0x5b, 0x3c, 0xae, 0xac, + 0xbf, 0xf7, 0x7a, 0x5d, 0xf3, 0xa0, 0x5c, 0xb5, 0x33, 0xfd, 0x46, 0xc6, + 0xdf, 0x63, 0x47, 0xc5, 0xd2, 0xf0, 0x65, 0x19, 0x46, 0x08, 0xfe, 0x9c, + 0x7a, 0xb7, 0xc7, 0xf9, 0x11, 0x1f, 0xa2, 0x06, 0xcb, 0xfb, 0x10, 0xfd, + 0x70, 0x20, 0xfd, 0xe0, 0x41, 0x90, 0x9f, 0xb3, 0x97, 0xb2, 0x97, 0xd4, + 0xa4, 0x46, 0x67, 0x32, 0x56, 0x1f, 0xe4, 0xab, 0x5b, 0xb7, 0xa4, 0x70, + 0xa3, 0x7c, 0xaa, 0xb1, 0x23, 0xc0, 0xf3, 0xff, 0x00, 0xfc, 0xf4, 0x2c, + 0x3b, 0x87, 0x31, 0xc8, 0x73, 0x1c, 0x8a, 0xad, 0xe3, 0x28, 0x5a, 0x5e, + 0xd4, 0x8b, 0x65, 0x87, 0xad, 0xfd, 0xf9, 0x75, 0x6c, 0x62, 0x8b, 0x67, + 0x06, 0x68, 0x7f, 0x8d, 0x8e, 0xac, 0x8f, 0xbc, 0xe6, 0xdc, 0x5e, 0x72, + 0x33, 0x3d, 0x33, 0x82, 0x9f, 0x79, 0xf8, 0x92, 0x5c, 0xb5, 0x94, 0xb2, + 0xdf, 0xd0, 0xbe, 0x3d, 0x5e, 0x1e, 0xfe, 0x6a, 0x18, 0xfd, 0x15, 0xfc, + 0xd9, 0xfa, 0x90, 0x84, 0x26, 0x26, 0x26, 0x64, 0xc9, 0x93, 0x27, 0x23, + 0x3d, 0x33, 0xd1, 0x8c, 0x63, 0x18, 0xc6, 0x33, 0xc4, 0x1a, 0x7e, 0xee, + 0x94, 0xd9, 0x5e, 0x36, 0xed, 0x44, 0xb3, 0xe8, 0x65, 0xff, 0x00, 0xbd, + 0xd2, 0xef, 0x9d, 0xbf, 0x3c, 0xa5, 0xb7, 0xcb, 0x3e, 0x41, 0x9b, 0x75, + 0x5e, 0x5e, 0x8d, 0x97, 0x50, 0x9e, 0xa7, 0x3c, 0x65, 0xf2, 0x38, 0xf4, + 0x5f, 0xa5, 0x19, 0xf4, 0xef, 0x8f, 0xf2, 0xe2, 0x3f, 0x44, 0x0d, 0x9f, + 0xf8, 0xf5, 0x7e, 0xa8, 0x91, 0x7e, 0xf0, 0x64, 0x64, 0x46, 0x5e, 0xdc, + 0x8e, 0x5e, 0xea, 0x42, 0x91, 0xcc, 0x94, 0xcf, 0xf2, 0x27, 0xd7, 0x77, + 0x47, 0xfa, 0x39, 0x7d, 0x28, 0xf0, 0x2c, 0xff, 0x00, 0xfe, 0x14, 0x64, + 0x27, 0xd3, 0x27, 0x21, 0xcc, 0x84, 0xdf, 0x75, 0x58, 0x73, 0xc9, 0xa8, + 0x7e, 0xfa, 0xff, 0x00, 0xe4, 0x4b, 0xd0, 0x90, 0x8c, 0x9a, 0x2f, 0xe3, + 0xf5, 0x9f, 0xd3, 0x1a, 0xa2, 0x4d, 0xfd, 0x58, 0x1f, 0xc8, 0x8f, 0x97, + 0x5a, 0xf7, 0xdf, 0xbf, 0x93, 0x4f, 0xcd, 0xbf, 0xa5, 0x7c, 0x7a, 0xbc, + 0x3f, 0xfc, 0xdf, 0xf8, 0xfd, 0x35, 0xfc, 0xcf, 0xe5, 0x08, 0x4c, 0xc8, + 0x99, 0x93, 0x26, 0x4c, 0x99, 0x33, 0xe8, 0xcf, 0x46, 0x31, 0x8c, 0x63, + 0x19, 0x7d, 0x6a, 0xda, 0xac, 0xad, 0xd5, 0x66, 0xd2, 0xf1, 0xb6, 0x5c, + 0xfd, 0x0c, 0xd4, 0x7e, 0xf7, 0x4b, 0xbe, 0x68, 0xf6, 0xa2, 0x6d, 0xe5, + 0x3c, 0x1b, 0x4d, 0xae, 0xd3, 0x6f, 0xd4, 0xf6, 0x37, 0xfb, 0xbe, 0xa6, + 0x99, 0x96, 0x77, 0x44, 0xf9, 0x47, 0x1e, 0xad, 0xf1, 0xfb, 0x2f, 0x87, + 0xe8, 0x81, 0xb4, 0x7f, 0x1e, 0x9f, 0xd5, 0x16, 0x44, 0x83, 0xf6, 0x8b, + 0x23, 0x2f, 0x6c, 0x8d, 0x91, 0x91, 0xc8, 0xe4, 0x72, 0xf7, 0xff, 0x00, + 0x21, 0x5f, 0xcf, 0x5b, 0xd3, 0xff, 0x00, 0x9f, 0xf8, 0x8f, 0x01, 0x4d, + 0x4f, 0x67, 0x8c, 0x8e, 0x67, 0x31, 0xcc, 0x72, 0x1c, 0x88, 0xcd, 0x2b, + 0xb9, 0xe4, 0xe6, 0x5e, 0xf2, 0x6e, 0x1f, 0xc9, 0x7e, 0x85, 0xd2, 0x5f, + 0x1a, 0x3f, 0xe3, 0xf4, 0x65, 0xac, 0x5f, 0x44, 0x66, 0x92, 0x94, 0x96, + 0x06, 0x8c, 0x12, 0x78, 0x12, 0x2d, 0x9f, 0x0a, 0x37, 0xdf, 0xe4, 0xd2, + 0x59, 0xf0, 0xbd, 0x7b, 0x03, 0xff, 0x00, 0x7b, 0xfe, 0x4b, 0xd3, 0x0f, + 0x99, 0x08, 0x42, 0x32, 0x64, 0xcf, 0xa3, 0x3d, 0x32, 0x67, 0xab, 0xe8, + 0xfa, 0x31, 0x8c, 0x63, 0x3c, 0x41, 0xa3, 0x36, 0xd7, 0x8d, 0xb2, 0xc7, + 0xef, 0xe8, 0xd4, 0x7e, 0xf7, 0x4b, 0xbe, 0x57, 0xd3, 0xa4, 0x7e, 0x5c, + 0xc6, 0x98, 0xda, 0xd5, 0x6a, 0x3a, 0xc9, 0xba, 0xb7, 0x19, 0x4d, 0x59, + 0x49, 0xf0, 0x7c, 0x10, 0x6b, 0x19, 0xe9, 0x9f, 0x46, 0xf7, 0xf0, 0xbe, + 0x3d, 0x10, 0x36, 0x9f, 0xe3, 0xd3, 0xf3, 0x12, 0x24, 0x5f, 0xb4, 0x18, + 0x9f, 0xb6, 0x47, 0xf3, 0x19, 0x19, 0x32, 0x72, 0xfa, 0xbc, 0x65, 0x6f, + 0x77, 0x5d, 0xd3, 0xff, 0x00, 0x8f, 0xf8, 0x8f, 0xf1, 0xdd, 0xd9, 0xd3, + 0xc6, 0x42, 0x97, 0xb7, 0x23, 0x90, 0xe4, 0x72, 0x22, 0xf3, 0x66, 0x70, + 0x72, 0x2c, 0x66, 0xe5, 0xfc, 0xa7, 0xea, 0x66, 0x9b, 0xda, 0x8e, 0x8d, + 0xfb, 0x41, 0x73, 0x9e, 0x79, 0x5d, 0x7e, 0x54, 0xf9, 0xe4, 0xf9, 0x25, + 0xec, 0x7e, 0xa6, 0xbd, 0x8d, 0xce, 0xce, 0xd6, 0x93, 0x7b, 0xfe, 0x4d, + 0x25, 0x9f, 0x1e, 0xbd, 0x89, 0xff, 0x00, 0xbd, 0xff, 0x00, 0x25, 0xe9, + 0x8f, 0xcb, 0x10, 0x84, 0x67, 0xd1, 0x93, 0x26, 0x4c, 0xfa, 0x98, 0xfa, + 0x31, 0x8c, 0x63, 0x2e, 0xae, 0x37, 0x55, 0x4d, 0x6f, 0x4d, 0xa4, 0x6f, + 0xd3, 0xa8, 0xfd, 0xee, 0x92, 0x83, 0x99, 0x3a, 0xdf, 0x66, 0x54, 0x4d, + 0xcb, 0xb1, 0x61, 0xb4, 0x45, 0xc2, 0xbd, 0x5e, 0x16, 0xe1, 0xb5, 0x5b, + 0xdd, 0xdb, 0xff, 0x00, 0x48, 0xd1, 0x91, 0x61, 0xa5, 0xea, 0xde, 0xbe, + 0x3f, 0xe7, 0xa2, 0x06, 0xd3, 0xfb, 0x14, 0x91, 0x22, 0x44, 0x83, 0x13, + 0x32, 0x37, 0xf5, 0x26, 0x64, 0xc8, 0x9f, 0xb6, 0xfb, 0x67, 0x76, 0x46, + 0x4c, 0xfd, 0x3c, 0x1b, 0xac, 0xff, 0x00, 0x1f, 0xde, 0xe1, 0xb9, 0x09, + 0xfd, 0x39, 0x33, 0xd1, 0xb1, 0x3f, 0xcd, 0x93, 0x39, 0x0d, 0xe4, 0xdd, + 0x7f, 0x97, 0xea, 0x65, 0x3f, 0xb5, 0xd1, 0xb2, 0x1f, 0x45, 0x7a, 0x55, + 0x99, 0xdb, 0x95, 0x64, 0xa3, 0xee, 0x59, 0x2c, 0x9f, 0xa5, 0x2f, 0x79, + 0x78, 0x82, 0xdc, 0x4f, 0x7a, 0xfe, 0x45, 0x44, 0xfe, 0x3d, 0x7b, 0x1b, + 0xff, 0x00, 0x7b, 0xfe, 0x3f, 0x4a, 0xf9, 0xff, 0x00, 0x88, 0x42, 0xfb, + 0x59, 0x33, 0xe8, 0x7d, 0x1f, 0x46, 0x31, 0x8d, 0x1a, 0xd7, 0xf5, 0xfa, + 0x75, 0x3f, 0xbf, 0xd2, 0x3f, 0x16, 0x91, 0xd4, 0xd9, 0x05, 0xe6, 0xed, + 0x34, 0xf7, 0x4a, 0x75, 0xea, 0x33, 0xde, 0xf0, 0xe6, 0xab, 0xbb, 0x64, + 0x96, 0x25, 0xff, 0x00, 0x1a, 0x21, 0xf1, 0xd5, 0x75, 0xde, 0x87, 0xe9, + 0x89, 0xb4, 0xff, 0x00, 0x1e, 0xa2, 0x22, 0xf9, 0x89, 0x12, 0x26, 0x46, + 0x7f, 0xd1, 0x97, 0x4b, 0x85, 0x76, 0x69, 0xa3, 0x99, 0x6d, 0x15, 0xf1, + 0xb3, 0x65, 0x9c, 0x93, 0xf0, 0xfd, 0xcc, 0xd4, 0xec, 0xb2, 0xd3, 0xc7, + 0x8d, 0x69, 0x78, 0x3e, 0xa7, 0x56, 0xe7, 0xff, 0x00, 0x17, 0xe9, 0xc9, + 0x93, 0x26, 0x7d, 0xe3, 0x86, 0xde, 0x50, 0xe4, 0x67, 0xea, 0xdd, 0xbf, + 0x96, 0x2f, 0x4b, 0x21, 0xfb, 0x7d, 0x17, 0xbb, 0xb2, 0x45, 0x11, 0xe3, + 0x19, 0x7b, 0xcd, 0xfd, 0x44, 0x99, 0x81, 0x7b, 0x95, 0xc4, 0xdf, 0x25, + 0xcf, 0x78, 0xdd, 0xa1, 0xcf, 0x57, 0xd8, 0xed, 0x29, 0x7d, 0x8d, 0x9b, + 0xf9, 0xff, 0x00, 0xfc, 0xbe, 0x98, 0xea, 0x88, 0xfe, 0x94, 0x2e, 0xb9, + 0x32, 0x64, 0xc9, 0x93, 0x3f, 0x61, 0x8f, 0xd0, 0xc6, 0x33, 0x57, 0xfb, + 0xb8, 0x30, 0x71, 0x38, 0x8e, 0x38, 0x5a, 0x8a, 0x66, 0xed, 0xed, 0x4c, + 0xed, 0xcc, 0xa3, 0x4b, 0x75, 0xa4, 0xb6, 0xeb, 0x27, 0x2f, 0xc3, 0xac, + 0x89, 0xe4, 0xed, 0xc7, 0x09, 0xc6, 0x8d, 0x5f, 0x3e, 0x7b, 0x5e, 0xa3, + 0xca, 0xeb, 0x67, 0x25, 0x29, 0x72, 0xc9, 0xf0, 0x2f, 0x5e, 0xf3, 0xf2, + 0xfd, 0x31, 0x36, 0x9f, 0xe3, 0x54, 0x21, 0x7c, 0xc4, 0x88, 0xba, 0x7f, + 0xce, 0x98, 0x37, 0x2b, 0x38, 0x69, 0xfb, 0x5d, 0xfd, 0xcb, 0xca, 0x9e, + 0x50, 0xf2, 0xc8, 0xde, 0x34, 0x96, 0x4b, 0x4c, 0xa8, 0x9f, 0x73, 0x60, + 0xd3, 0x4a, 0x92, 0xa9, 0x2b, 0x6b, 0x5f, 0x0c, 0x63, 0x19, 0x11, 0xcb, + 0x29, 0x99, 0xfa, 0xf7, 0x9f, 0x6d, 0x52, 0xc3, 0x38, 0x2e, 0xad, 0xf5, + 0x5f, 0x03, 0x3e, 0x14, 0x23, 0xca, 0x52, 0xf6, 0x1f, 0xea, 0xc9, 0x26, + 0x7c, 0x92, 0x78, 0x23, 0x25, 0x5c, 0x31, 0xe6, 0x35, 0x3b, 0x84, 0xa3, + 0x6e, 0xa6, 0x34, 0xbd, 0x4c, 0x2e, 0xae, 0x55, 0x4b, 0xd5, 0x1a, 0xa5, + 0x33, 0x6b, 0xaa, 0x75, 0xeb, 0xff, 0x00, 0xf9, 0xeb, 0x93, 0x22, 0x65, + 0x7f, 0xa1, 0x7f, 0x59, 0x8c, 0x66, 0xb3, 0xf7, 0x7a, 0xe4, 0x93, 0x38, + 0x9d, 0xb3, 0xb6, 0xdb, 0x9c, 0x9c, 0x61, 0x28, 0xde, 0xa5, 0xc7, 0x54, + 0x7f, 0xb4, 0x55, 0x98, 0xe9, 0xae, 0xad, 0xd8, 0xe3, 0x16, 0xa7, 0xb6, + 0xeb, 0x21, 0xaa, 0xa1, 0x49, 0x0d, 0x60, 0xfd, 0x3d, 0x57, 0x5f, 0xfb, + 0xbc, 0xb1, 0xaf, 0x4c, 0x4d, 0xab, 0xf8, 0xb0, 0x11, 0x1f, 0x98, 0x88, + 0x5d, 0x54, 0x3d, 0x94, 0x07, 0xf4, 0x2b, 0xea, 0x96, 0xaa, 0xf9, 0x68, + 0x22, 0x28, 0xbe, 0xae, 0x19, 0x35, 0xba, 0x77, 0x6e, 0x9e, 0x35, 0xbc, + 0x68, 0xec, 0x96, 0x9e, 0x50, 0x79, 0x24, 0x86, 0x32, 0x47, 0xc3, 0x90, + 0xc5, 0xfa, 0xb7, 0xcf, 0xe4, 0xe0, 0xc9, 0x93, 0x3e, 0xb6, 0x69, 0xe1, + 0xc5, 0x4a, 0xce, 0x2e, 0x43, 0x96, 0x0f, 0x91, 0x2c, 0x1f, 0x2f, 0x72, + 0xd7, 0x37, 0x65, 0x55, 0x4a, 0xbb, 0x35, 0x13, 0xee, 0xd9, 0x04, 0xa0, + 0xb5, 0x0f, 0x95, 0xb3, 0x50, 0xb4, 0xf2, 0x10, 0x63, 0xd9, 0x9f, 0x2f, + 0xc1, 0xdc, 0x45, 0xa1, 0xa9, 0x0a, 0x88, 0x44, 0xe2, 0x69, 0xd7, 0xfb, + 0x1f, 0xf3, 0x89, 0x8e, 0xb8, 0x38, 0x95, 0x7e, 0x85, 0xf6, 0xfb, 0x88, + 0xcf, 0xab, 0x1e, 0x86, 0x31, 0x9a, 0xcf, 0xdd, 0xf4, 0x48, 0x5f, 0x12, + 0xb7, 0x94, 0x73, 0x84, 0xce, 0xd7, 0xd5, 0xc4, 0xe2, 0xc6, 0xa5, 0xc6, + 0x7a, 0x59, 0x72, 0xd2, 0xea, 0x27, 0x45, 0xfa, 0x8e, 0xdd, 0x76, 0x57, + 0x72, 0xbe, 0xaa, 0x6f, 0x43, 0x88, 0xbe, 0x93, 0x1e, 0x9d, 0xe1, 0xfe, + 0x77, 0x4c, 0x74, 0xc1, 0x1f, 0x67, 0xb4, 0xff, 0x00, 0x1a, 0x3f, 0x0b, + 0xe6, 0x3f, 0x31, 0x42, 0x42, 0x42, 0x47, 0x12, 0x35, 0xb6, 0x4a, 0xe5, + 0x41, 0x29, 0x3b, 0x1b, 0xeb, 0x83, 0x08, 0xe2, 0x8c, 0x18, 0x30, 0x2c, + 0xc0, 0x5a, 0x94, 0x7b, 0x31, 0x8c, 0xff, 0x00, 0xeb, 0xf4, 0x93, 0xe9, + 0xbe, 0x7f, 0x23, 0xd6, 0xbe, 0x0c, 0x15, 0xc3, 0xb9, 0x2b, 0xec, 0x55, + 0x41, 0x27, 0x3b, 0x33, 0x84, 0xd6, 0x45, 0x11, 0xfd, 0x6f, 0x8a, 0x84, + 0x75, 0x3f, 0xca, 0x95, 0xbc, 0x4b, 0x20, 0xec, 0xb9, 0x51, 0x59, 0xa8, + 0x82, 0x8d, 0xfe, 0x55, 0x11, 0x8f, 0xd3, 0xc4, 0x8d, 0x93, 0x89, 0x0d, + 0x4f, 0x2a, 0xfb, 0x95, 0x48, 0x92, 0x5c, 0xa8, 0x5f, 0x9d, 0xff, 0x00, + 0x39, 0x19, 0xeb, 0x93, 0x25, 0x5f, 0xa3, 0xd7, 0x93, 0x91, 0xc8, 0xe6, + 0x87, 0xee, 0x57, 0x6c, 0xab, 0xb2, 0x33, 0x8c, 0x8c, 0x7d, 0x86, 0x31, + 0x9a, 0xdf, 0xdd, 0xf4, 0x32, 0x35, 0xf2, 0x8d, 0xb4, 0xd8, 0xda, 0xaa, + 0x79, 0xe0, 0x70, 0x47, 0x68, 0xec, 0x8e, 0xa6, 0x87, 0x56, 0x49, 0x69, + 0x92, 0x75, 0x41, 0x76, 0xb4, 0x33, 0x75, 0x49, 0xd4, 0x57, 0x7c, 0xaa, + 0x22, 0xe1, 0x72, 0xed, 0xb8, 0x9f, 0x26, 0x0c, 0xfb, 0xa3, 0x76, 0x7f, + 0xed, 0xfa, 0x51, 0xb4, 0x2f, 0xf5, 0x62, 0x8c, 0x10, 0x44, 0x23, 0x92, + 0x35, 0x32, 0x34, 0x8a, 0x0a, 0x24, 0xb5, 0x70, 0x89, 0x2b, 0xe7, 0x67, + 0x4c, 0x99, 0xfb, 0x39, 0xe9, 0xf0, 0x4a, 0x73, 0x3b, 0xf3, 0x89, 0xdf, + 0x8c, 0x9f, 0x2c, 0x92, 0x66, 0x4d, 0xef, 0xf7, 0xbd, 0x70, 0xfd, 0xbe, + 0x38, 0x23, 0x1e, 0xe3, 0xee, 0xf1, 0x5d, 0xbe, 0x4d, 0x63, 0x92, 0x59, + 0x1a, 0x31, 0x91, 0x25, 0x12, 0xcb, 0x94, 0xa5, 0x7f, 0xe6, 0xcd, 0xd7, + 0x93, 0xb4, 0x2a, 0xcd, 0x42, 0xff, 0x00, 0x6b, 0x8e, 0x0b, 0x6c, 0x87, + 0x28, 0xb7, 0x25, 0x29, 0x34, 0x46, 0xdf, 0xcc, 0x8a, 0x66, 0x0a, 0x63, + 0xf9, 0x9f, 0xf0, 0xc1, 0x83, 0x06, 0x3a, 0x53, 0xfb, 0x66, 0x0c, 0x74, + 0xc1, 0x82, 0xd9, 0x76, 0xeb, 0xf3, 0x16, 0x58, 0x29, 0xb3, 0x91, 0x93, + 0x47, 0xa6, 0x96, 0xb2, 0x57, 0x6d, 0xd3, 0xd1, 0xa1, 0x5d, 0x38, 0x8b, + 0x56, 0x2b, 0xe1, 0x2f, 0x56, 0x06, 0x86, 0x8d, 0x6f, 0xee, 0xfa, 0x19, + 0xa3, 0x4a, 0x5a, 0x59, 0xd1, 0x51, 0x28, 0x54, 0x4d, 0x62, 0x44, 0x35, + 0x16, 0xd7, 0x17, 0xaa, 0xb8, 0x94, 0x9c, 0xc9, 0x19, 0xcf, 0x48, 0x3e, + 0x12, 0x5a, 0xd9, 0xc0, 0x8e, 0xbd, 0x48, 0xf3, 0x55, 0x22, 0xbd, 0xdb, + 0x81, 0x0d, 0xcb, 0x4d, 0x68, 0xa7, 0x19, 0x1c, 0x94, 0x5f, 0x7e, 0x39, + 0xdc, 0x67, 0xcf, 0x5b, 0xe9, 0x46, 0xcd, 0x25, 0xe5, 0x22, 0xcc, 0x94, + 0x5f, 0x5c, 0x8f, 0x39, 0x5c, 0x4f, 0x3d, 0x36, 0x3d, 0x4f, 0xd3, 0xe6, + 0x62, 0xda, 0xb5, 0x33, 0x26, 0x48, 0x6a, 0xa2, 0xf5, 0x50, 0xde, 0xe6, + 0xec, 0x86, 0xf1, 0x27, 0x2c, 0x90, 0xe2, 0xdf, 0x6e, 0xa6, 0x4b, 0x09, + 0xe4, 0xc9, 0x93, 0x26, 0x4c, 0x8d, 0x8d, 0x8f, 0xdc, 0xcb, 0x47, 0x79, + 0x9d, 0xe8, 0x9b, 0xdf, 0xee, 0x7a, 0xea, 0x9a, 0x8d, 0x3c, 0x93, 0x6d, + 0xf2, 0x12, 0x38, 0xb6, 0x42, 0xa5, 0x01, 0x8c, 0x6f, 0x05, 0xf7, 0xa8, + 0x43, 0xcd, 0x2c, 0xf2, 0x47, 0x13, 0x81, 0x0d, 0x1c, 0xa7, 0x0b, 0x67, + 0xcf, 0x51, 0xa8, 0xba, 0x50, 0x7f, 0x85, 0x5d, 0x4d, 0x34, 0x53, 0x67, + 0x3e, 0x09, 0x90, 0xd1, 0x39, 0x38, 0x68, 0x19, 0x0d, 0x25, 0x50, 0x24, + 0x92, 0x87, 0xfc, 0xf5, 0x51, 0xfb, 0x7e, 0xad, 0xce, 0xce, 0x35, 0x23, + 0x27, 0x21, 0x58, 0x68, 0xe7, 0x65, 0x51, 0xb2, 0xd9, 0xdb, 0xd5, 0x92, + 0x14, 0xe5, 0x11, 0x6a, 0xec, 0x42, 0xd7, 0x0b, 0x59, 0x5b, 0x3b, 0xf5, + 0xb3, 0x29, 0x98, 0x1a, 0x35, 0xdf, 0xbd, 0xe8, 0x91, 0x55, 0xf2, 0x8d, + 0x6e, 0x79, 0x39, 0x19, 0x16, 0x82, 0xd7, 0x5f, 0x45, 0x17, 0x27, 0xa8, + 0xd3, 0x5b, 0x4c, 0x3d, 0x71, 0xbe, 0x70, 0x16, 0xbe, 0xd3, 0xf1, 0x0b, + 0x0f, 0xc4, 0x64, 0x5b, 0x3e, 0xe5, 0xde, 0x94, 0x51, 0x7c, 0xe1, 0x5e, + 0x97, 0x5b, 0x0e, 0x35, 0xdf, 0x44, 0x8d, 0x56, 0xe1, 0xe5, 0x67, 0x1d, + 0xe2, 0x64, 0x37, 0x8d, 0x37, 0x1b, 0x37, 0x2e, 0xed, 0xd5, 0xeb, 0x08, + 0x6a, 0xc8, 0x6a, 0x45, 0xaa, 0x65, 0xfa, 0x69, 0x5b, 0x75, 0xba, 0x5e, + 0xe9, 0x66, 0x8b, 0x85, 0x70, 0xb5, 0x38, 0xdb, 0x77, 0x17, 0xe6, 0x24, + 0x79, 0x99, 0x11, 0xd5, 0xc3, 0x1e, 0x72, 0x07, 0x98, 0x90, 0xed, 0x93, + 0x39, 0x64, 0xa5, 0xae, 0x0d, 0x8d, 0x8e, 0x68, 0xee, 0x21, 0x99, 0x37, + 0x5f, 0xb1, 0x4c, 0x92, 0xaf, 0xcc, 0x56, 0x8f, 0x39, 0x52, 0x16, 0xb6, + 0xb3, 0xcd, 0x23, 0xcc, 0xac, 0x4b, 0x52, 0x3d, 0x43, 0x27, 0xa8, 0x4a, + 0x37, 0xdf, 0xe6, 0x08, 0xd4, 0x2d, 0x3b, 0x63, 0xd3, 0xe2, 0x3a, 0x6d, + 0x37, 0x7a, 0x51, 0x8a, 0x8a, 0xd4, 0xe2, 0x1a, 0x9d, 0x04, 0xec, 0xda, + 0x6c, 0xa7, 0x77, 0xd3, 0xeb, 0x56, 0x86, 0x8f, 0x2b, 0x0e, 0xdc, 0x33, + 0xda, 0x3b, 0x4c, 0xe2, 0xc9, 0xaf, 0xa3, 0xd7, 0x47, 0xed, 0xe0, 0xc7, + 0x45, 0x16, 0xc8, 0xe9, 0xe4, 0xc8, 0xe9, 0xa2, 0x8d, 0x4e, 0x82, 0x8d, + 0x4a, 0xd7, 0xe9, 0x7c, 0x9d, 0xf9, 0x32, 0x64, 0xaf, 0x54, 0x43, 0x51, + 0x93, 0x9e, 0x4c, 0xf4, 0x7d, 0x5f, 0xa3, 0x9c, 0x90, 0xed, 0xb0, 0xb5, + 0xe7, 0xa6, 0x7a, 0xc8, 0xe6, 0xd1, 0xcd, 0x99, 0x11, 0x19, 0x4d, 0x2f, + 0x81, 0xcc, 0xee, 0x4d, 0x3b, 0x75, 0x37, 0x5c, 0x8c, 0xfd, 0xa5, 0xf3, + 0xe9, 0x45, 0x7f, 0xa4, 0xc9, 0x5f, 0xd7, 0x3b, 0x76, 0x3b, 0x2b, 0xa5, + 0x92, 0xab, 0x27, 0xe6, 0x40, 0xf3, 0xbd, 0xb2, 0xbd, 0x61, 0x0d, 0x61, + 0x1d, 0x60, 0xb5, 0x28, 0x57, 0x26, 0x73, 0x47, 0x23, 0x27, 0x23, 0x91, + 0xc8, 0xe4, 0x72, 0x39, 0x1c, 0xce, 0x67, 0x21, 0xb3, 0x96, 0x1f, 0x9d, + 0x8c, 0xa2, 0xf5, 0x7e, 0xfa, 0xeb, 0x7b, 0x8b, 0xd7, 0xa7, 0xfd, 0x8c, + 0x1c, 0x47, 0x08, 0x9d, 0xaa, 0x87, 0x55, 0x27, 0x1a, 0x86, 0xa0, 0x38, + 0xc5, 0x8d, 0x46, 0x2b, 0xbf, 0x76, 0xbe, 0xde, 0xc6, 0xb2, 0xa3, 0xb9, + 0xb8, 0x44, 0x86, 0xaf, 0x72, 0x84, 0x6c, 0xdd, 0x37, 0x1c, 0xb9, 0x4a, + 0x53, 0xa2, 0x1d, 0xcd, 0x36, 0xaf, 0xc3, 0xf4, 0xda, 0x67, 0x71, 0xda, + 0xcd, 0x27, 0x88, 0xa8, 0xb0, 0xaa, 0xd8, 0x5f, 0x1c, 0x18, 0x45, 0xd1, + 0xfc, 0xaf, 0x5e, 0x8a, 0x8e, 0xed, 0x4b, 0x46, 0x4b, 0x4d, 0x18, 0x0a, + 0x31, 0x46, 0x4c, 0xb3, 0xdf, 0xa6, 0xe3, 0xa5, 0xf3, 0x74, 0x76, 0x8e, + 0xd9, 0x6f, 0xe5, 0xc5, 0xf3, 0xa8, 0xaf, 0x52, 0x57, 0xaa, 0x21, 0xa9, + 0xc8, 0xad, 0x4c, 0xc8, 0xfa, 0xbf, 0x46, 0x0b, 0x6a, 0x6c, 0x94, 0x5a, + 0x1b, 0x39, 0xa3, 0x90, 0xd8, 0xaa, 0x6c, 0x54, 0x8a, 0xa1, 0x43, 0x1d, + 0x27, 0x06, 0xcc, 0x34, 0x61, 0x33, 0x81, 0xc4, 0xe3, 0xf6, 0x59, 0x1f, + 0x52, 0x2b, 0xfd, 0x39, 0x10, 0x8a, 0x37, 0x4d, 0x46, 0x9e, 0xbb, 0x2e, + 0x95, 0xb3, 0xe9, 0x6d, 0x4a, 0x71, 0x86, 0xd7, 0x0b, 0x69, 0x96, 0xd9, + 0x74, 0x07, 0x56, 0xa2, 0xb3, 0xbe, 0xe2, 0x47, 0x56, 0x85, 0xa9, 0x16, + 0xa8, 0x5a, 0xa1, 0x6a, 0x4f, 0x32, 0x79, 0x83, 0xcc, 0x23, 0xbe, 0x8e, + 0xf9, 0xde, 0x3b, 0xc3, 0xbc, 0x7a, 0x82, 0x7a, 0xa1, 0xdd, 0x39, 0x14, + 0xc6, 0x6d, 0xea, 0x56, 0x23, 0xeb, 0xa6, 0x4f, 0xb7, 0xc9, 0x99, 0x33, + 0xe9, 0xc9, 0xab, 0xd4, 0x4b, 0x59, 0x6d, 0x15, 0xc7, 0x4f, 0x53, 0x98, + 0xe4, 0x2f, 0x71, 0x7b, 0x15, 0x69, 0x6b, 0xb2, 0xd8, 0x72, 0x42, 0x66, + 0x0d, 0x56, 0xd1, 0xa7, 0xd5, 0x17, 0xed, 0xda, 0x8d, 0xa2, 0x5b, 0x66, + 0xe8, 0xb5, 0xd0, 0xe4, 0x5b, 0xfb, 0x3e, 0xbd, 0xb3, 0xf6, 0x3a, 0x70, + 0x47, 0x03, 0x89, 0xc0, 0xe0, 0x28, 0x23, 0x5d, 0xa2, 0xa1, 0xd5, 0xc4, + 0xd5, 0x55, 0xca, 0xa9, 0xe9, 0xe3, 0x32, 0xcd, 0xaa, 0x12, 0x6f, 0x6d, + 0xb6, 0x23, 0xa6, 0xea, 0x88, 0x6a, 0x48, 0xea, 0x88, 0xde, 0x77, 0x13, + 0xe8, 0xd7, 0x47, 0xd1, 0x2e, 0x8d, 0x0e, 0x27, 0x6c, 0xed, 0x1d, 0xa2, + 0x54, 0xca, 0x11, 0xc1, 0x83, 0x06, 0x0c, 0x18, 0x1d, 0x69, 0x9d, 0x93, + 0xb6, 0xc7, 0x11, 0xc4, 0xc1, 0x8f, 0x4e, 0x49, 0x4b, 0xda, 0x1e, 0xb8, + 0x3f, 0xa5, 0x0b, 0xae, 0x44, 0xfa, 0x33, 0x6b, 0xb3, 0x9e, 0x9f, 0x89, + 0xc0, 0x74, 0x45, 0x93, 0xd0, 0x55, 0x32, 0xdd, 0xaa, 0x98, 0xc6, 0x3a, + 0x28, 0x25, 0x2d, 0x10, 0xf4, 0x93, 0x3b, 0x17, 0x23, 0xb5, 0x71, 0xc2, + 0xe3, 0x17, 0x89, 0x5e, 0x42, 0x9b, 0x59, 0xe5, 0xc9, 0xe9, 0x39, 0x38, + 0xe9, 0x21, 0x15, 0xd8, 0x8a, 0x38, 0xe3, 0xa6, 0xab, 0xf4, 0x7a, 0xea, + 0x96, 0x23, 0x9f, 0x5c, 0xe1, 0xce, 0x34, 0xe8, 0xa3, 0xa7, 0x38, 0x0e, + 0x02, 0xad, 0xb2, 0x1a, 0x49, 0xb2, 0x1a, 0x58, 0xc4, 0x5e, 0xdd, 0x32, + 0x4e, 0x6e, 0x31, 0x86, 0xa6, 0x32, 0x24, 0xd3, 0x5a, 0xc8, 0x4f, 0x67, + 0xdc, 0x69, 0xd7, 0x46, 0xda, 0xa7, 0xac, 0x6e, 0x3e, 0xa4, 0x8d, 0xb5, + 0x7e, 0x47, 0xaf, 0x03, 0x8e, 0x56, 0xbf, 0x47, 0x1a, 0xd3, 0xeb, 0x81, + 0xa2, 0xed, 0x25, 0x53, 0xb1, 0xec, 0x0b, 0x0f, 0x67, 0xd4, 0xc0, 0x7a, + 0x2d, 0x54, 0x0e, 0x17, 0xc4, 0xe7, 0x24, 0x77, 0x51, 0xca, 0x2c, 0xc0, + 0xaa, 0x93, 0x3c, 0xb5, 0x8c, 0xf2, 0x56, 0x1f, 0x87, 0xc8, 0x5b, 0x7c, + 0x45, 0xa3, 0xae, 0x24, 0xf8, 0x51, 0x1b, 0xac, 0x76, 0xcb, 0xd7, 0x83, + 0x06, 0x09, 0x68, 0xfb, 0xd0, 0x96, 0x86, 0xd8, 0x92, 0xa9, 0xc4, 0xe2, + 0x71, 0x30, 0x60, 0x68, 0x9a, 0x22, 0xcc, 0x99, 0x32, 0x64, 0x72, 0x44, + 0x7e, 0xa2, 0x2b, 0x8a, 0x42, 0x5e, 0xbd, 0xb6, 0xc7, 0x1d, 0x57, 0xa3, + 0x50, 0xfe, 0xae, 0xb8, 0x30, 0x60, 0xc1, 0x8f, 0x44, 0xf2, 0x85, 0xcb, + 0x03, 0x2f, 0xfd, 0x3e, 0xb8, 0xf5, 0x5e, 0xac, 0x1c, 0xe3, 0x12, 0x88, + 0xc6, 0xc3, 0x1e, 0x9c, 0x96, 0xcb, 0xe9, 0xc8, 0xac, 0x94, 0x4d, 0xc6, + 0xbf, 0x3b, 0xa7, 0xd9, 0xb5, 0x7d, 0xab, 0x1a, 0xc7, 0xa9, 0x22, 0x31, + 0xc9, 0xa2, 0x8b, 0xae, 0xaf, 0x4f, 0x24, 0x77, 0x0b, 0x35, 0x91, 0x89, + 0x66, 0xe4, 0x89, 0x6b, 0x79, 0x12, 0xe3, 0x9f, 0x45, 0x8b, 0x26, 0xdf, + 0xa9, 0xc7, 0xa7, 0x06, 0x3d, 0x73, 0x92, 0x84, 0x6e, 0xb1, 0xdb, 0x2f, + 0xb7, 0xa5, 0xf8, 0x43, 0x59, 0x25, 0xa4, 0xaa, 0x44, 0xb6, 0xda, 0x99, + 0x2d, 0xa8, 0x96, 0xd7, 0x62, 0x25, 0xb6, 0xdc, 0x4b, 0x41, 0x72, 0x25, + 0xa0, 0xb0, 0xf2, 0x36, 0x9e, 0x42, 0xd1, 0x6d, 0x96, 0xb2, 0x3b, 0x3d, + 0x8c, 0x86, 0xcd, 0x32, 0x1b, 0x33, 0x35, 0x95, 0x46, 0x99, 0xc1, 0x7d, + 0x8d, 0x2c, 0xfb, 0x7a, 0x8f, 0x43, 0x97, 0x39, 0xfd, 0xb6, 0x46, 0x7d, + 0xb7, 0xf4, 0xd8, 0xa5, 0x42, 0x66, 0xa6, 0x9e, 0x30, 0xf5, 0xc5, 0x18, + 0xe9, 0x8e, 0x9c, 0xe2, 0x8e, 0x68, 0xcc, 0x98, 0xab, 0xb1, 0x8b, 0x4d, + 0x92, 0xad, 0x3c, 0x51, 0xc7, 0x0b, 0x06, 0x3d, 0x0c, 0xb3, 0xe0, 0xc1, + 0x83, 0x78, 0xd1, 0x38, 0x3d, 0xbb, 0x55, 0xe6, 0xe9, 0x59, 0xc7, 0xd4, + 0x25, 0x22, 0x35, 0x91, 0xa6, 0x24, 0x34, 0xf5, 0x95, 0x42, 0xb8, 0x0a, + 0xd8, 0xa3, 0xbf, 0x13, 0xcc, 0x0f, 0x52, 0xc7, 0xa8, 0xb0, 0x76, 0x5c, + 0xcb, 0xb5, 0x57, 0xc6, 0xde, 0xf4, 0xe4, 0x67, 0xec, 0x48, 0x97, 0xb1, + 0xa4, 0xd4, 0x79, 0x8a, 0xbe, 0xd4, 0xe6, 0xa0, 0xaf, 0xb9, 0xda, 0xfe, + 0xde, 0x0d, 0x3a, 0xf5, 0xe3, 0xa6, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xb8, + 0xee, 0x3d, 0xa2, 0x28, 0x5f, 0x66, 0x9b, 0x3b, 0x95, 0x74, 0xba, 0x5c, + 0x6b, 0x8f, 0xab, 0x26, 0x4c, 0xfa, 0xb2, 0xe0, 0xe1, 0x72, 0x99, 0x38, + 0xa9, 0xc6, 0x5a, 0x48, 0x1e, 0x52, 0x27, 0x95, 0x89, 0xe5, 0xa2, 0x79, + 0x78, 0x9d, 0x88, 0x9d, 0x98, 0x9d, 0xa8, 0x9d, 0x94, 0x76, 0xa2, 0x76, + 0xd1, 0x2a, 0xa3, 0x21, 0x55, 0x18, 0x9c, 0x4c, 0x74, 0x8c, 0x79, 0x11, + 0x8e, 0x06, 0x63, 0xa6, 0x0c, 0x18, 0x19, 0x6f, 0xa2, 0x75, 0xab, 0x23, + 0x65, 0x73, 0xda, 0x35, 0xba, 0x7b, 0x63, 0xa8, 0xad, 0x21, 0x44, 0x51, + 0x14, 0x44, 0x85, 0xea, 0xba, 0xde, 0xcd, 0x69, 0xf2, 0x7f, 0x65, 0x92, + 0x45, 0x17, 0x3d, 0x3d, 0xaa, 0x4a, 0x4b, 0xec, 0x4e, 0x6a, 0x0a, 0xfb, + 0x9d, 0xb2, 0x7f, 0x71, 0x14, 0x2f, 0xa7, 0xec, 0x63, 0xae, 0x3a, 0x6e, + 0x3a, 0xff, 0x00, 0x2f, 0x1f, 0x96, 0xbe, 0xd6, 0xd7, 0x77, 0x2a, 0xba, + 0x6a, 0xa4, 0x47, 0xef, 0xc9, 0x11, 0xd4, 0x38, 0x99, 0x52, 0x4d, 0x18, + 0x30, 0x60, 0xc1, 0x83, 0x06, 0x3d, 0x71, 0x86, 0x48, 0xc7, 0xd5, 0x83, + 0x04, 0x91, 0x35, 0xef, 0xc4, 0xe2, 0x60, 0xf7, 0x35, 0xb5, 0x2d, 0x4d, + 0x3b, 0x6d, 0xb6, 0xe8, 0x6f, 0x8a, 0xca, 0x48, 0xc7, 0x45, 0xeb, 0xd6, + 0x5f, 0xdd, 0xb2, 0x3f, 0x6d, 0x93, 0x46, 0xdf, 0xa9, 0xe2, 0xfd, 0x76, + 0xdf, 0x1a, 0x95, 0xb6, 0xbb, 0x5f, 0xdd, 0x46, 0x92, 0x5f, 0x57, 0xda, + 0xc7, 0x4d, 0x7e, 0xe0, 0xb4, 0xeb, 0xde, 0x72, 0x5f, 0x6f, 0x43, 0x67, + 0x0d, 0x4f, 0x4b, 0x25, 0xce, 0xd5, 0xfd, 0x06, 0x8f, 0x78, 0x38, 0xea, + 0x0f, 0x93, 0x06, 0x3e, 0xce, 0x08, 0xc0, 0x51, 0x31, 0xe8, 0xc1, 0x83, + 0x06, 0x09, 0xfb, 0x18, 0x30, 0x71, 0x38, 0x9c, 0x0e, 0x08, 0x50, 0x5f, + 0x6f, 0x5b, 0xa8, 0xed, 0x42, 0x22, 0xfb, 0x92, 0x44, 0x91, 0xa4, 0xd7, + 0x72, 0xf4, 0xb7, 0x82, 0xed, 0x58, 0xde, 0x7f, 0xa1, 0x44, 0xb8, 0xdf, + 0xf6, 0xa4, 0xd4, 0x56, 0xb3, 0x74, 0xe4, 0x7c, 0x89, 0x7d, 0xdd, 0x2d, + 0xea, 0xfa, 0xae, 0xb3, 0x84, 0x21, 0xfd, 0x26, 0x87, 0x11, 0x39, 0x56, + 0x47, 0x50, 0x84, 0xd4, 0x8c, 0x7a, 0xd4, 0x32, 0x46, 0xb1, 0x44, 0xc7, + 0xa7, 0x06, 0x0c, 0x18, 0x2e, 0xf8, 0xc1, 0x83, 0x06, 0x0c, 0x18, 0xfb, + 0x76, 0x5a, 0xaa, 0x84, 0xec, 0x76, 0xce, 0x3d, 0x73, 0xf6, 0xda, 0x25, + 0x13, 0x4d, 0xae, 0x75, 0x10, 0xb2, 0x36, 0x44, 0xb7, 0x53, 0x1a, 0xcb, + 0x2e, 0x95, 0x9f, 0xd2, 0x6f, 0x0e, 0xb9, 0xf7, 0x21, 0xf6, 0x2e, 0xba, + 0x14, 0x43, 0x59, 0xaf, 0x96, 0xa9, 0xa4, 0x63, 0xef, 0x68, 0x35, 0x1d, + 0x9b, 0xae, 0xb3, 0xbb, 0x35, 0xfd, 0x4c, 0x0e, 0x26, 0x30, 0x2b, 0xe4, + 0x85, 0xa8, 0x8b, 0x13, 0x4f, 0xa7, 0xc8, 0xab, 0x6c, 0x8d, 0x78, 0x14, + 0x0c, 0x7a, 0xf0, 0x60, 0xc0, 0xcb, 0x7e, 0x7e, 0xfb, 0x92, 0x8a, 0xd4, + 0xea, 0x1e, 0xa2, 0x71, 0x42, 0xfb, 0xec, 0x71, 0x21, 0x64, 0xe9, 0x94, + 0xb5, 0xd2, 0xb3, 0xd1, 0x9f, 0xe8, 0x33, 0x41, 0x6f, 0xae, 0x73, 0x8d, + 0x71, 0xd4, 0x6f, 0x09, 0x16, 0x5b, 0x3b, 0xe4, 0x97, 0xf4, 0x28, 0x87, + 0x29, 0x45, 0x7f, 0x5f, 0x02, 0xa9, 0xc8, 0x8e, 0x8a, 0x72, 0x23, 0xa0, + 0x8a, 0x23, 0x42, 0x89, 0xc0, 0xc1, 0x8f, 0xb1, 0x8f, 0x43, 0x25, 0xee, + 0xfe, 0xf6, 0x70, 0xb5, 0x7a, 0xae, 0xfb, 0x8a, 0xeb, 0x93, 0x3e, 0xac, + 0x99, 0x33, 0xea, 0x7d, 0x1a, 0x3d, 0xd1, 0xdc, 0x3e, 0x7f, 0xa2, 0xc8, + 0xc9, 0xc2, 0x55, 0x58, 0xad, 0x87, 0x5b, 0x75, 0x15, 0xd0, 0x5f, 0xbb, + 0x96, 0xdd, 0x3b, 0x98, 0x97, 0xf4, 0x22, 0xb9, 0x3a, 0xe1, 0xc5, 0x47, + 0xfa, 0xad, 0x95, 0x68, 0xe5, 0x32, 0xbd, 0x34, 0x2a, 0x38, 0xa4, 0x60, + 0xc7, 0x4c, 0x18, 0xe9, 0x8f, 0xb4, 0xcb, 0x65, 0x85, 0xf7, 0xa5, 0x25, + 0x15, 0xaa, 0xd5, 0xf7, 0x84, 0x85, 0xf7, 0xb3, 0xeb, 0xc0, 0xd1, 0xee, + 0x8e, 0xe1, 0x94, 0xff, 0x00, 0xa3, 0xa7, 0xb9, 0xd3, 0x27, 0xac, 0xa6, + 0x31, 0xb7, 0x77, 0xae, 0x25, 0xbb, 0x95, 0xf6, 0x8f, 0x2c, 0xc1, 0xc4, + 0xc7, 0xf4, 0x68, 0xaf, 0x04, 0x50, 0xbe, 0xf6, 0x4c, 0xfa, 0xf4, 0xfa, + 0x97, 0xa7, 0x21, 0x64, 0x6d, 0x8f, 0xdb, 0xc1, 0x8f, 0x4c, 0x89, 0xcb, + 0x93, 0xfb, 0x96, 0x6b, 0x68, 0xa5, 0xfe, 0x27, 0x47, 0x1b, 0xb5, 0x32, + 0xd4, 0x34, 0x85, 0xf6, 0x96, 0xeb, 0x41, 0x0d, 0x7d, 0x13, 0x14, 0xd4, + 0x8c, 0xfd, 0xbc, 0x0e, 0x23, 0x89, 0x96, 0x8e, 0xe1, 0xcd, 0x19, 0xf5, + 0x64, 0xc9, 0xc8, 0xe6, 0x46, 0xa9, 0xe3, 0x89, 0x81, 0xb8, 0xa2, 0x7d, + 0xb9, 0x1c, 0x4c, 0x18, 0x31, 0xd7, 0x26, 0x4c, 0x99, 0x33, 0xf6, 0xea, + 0xa0, 0x8c, 0x44, 0xbf, 0xa7, 0x93, 0x26, 0x4c, 0x9c, 0x8a, 0xed, 0x75, + 0x4a, 0x9d, 0x74, 0x66, 0x72, 0x32, 0x64, 0xcf, 0xa7, 0x26, 0x45, 0xe9, + 0x6c, 0xb6, 0xcc, 0xfd, 0xdb, 0xda, 0x55, 0x27, 0xc6, 0xcc, 0x91, 0xb9, + 0xc4, 0x86, 0xad, 0x11, 0xb6, 0x32, 0x32, 0x64, 0xcf, 0x4c, 0x99, 0x32, + 0x4e, 0xe8, 0xc0, 0x96, 0xe5, 0x44, 0x4b, 0x3c, 0x38, 0xe4, 0x79, 0x0d, + 0x4e, 0x9c, 0x82, 0xe2, 0x67, 0xef, 0xe0, 0xc1, 0x8e, 0x9c, 0x9a, 0x39, + 0x9c, 0xce, 0x68, 0xe6, 0x87, 0x24, 0x69, 0x76, 0xff, 0x00, 0x30, 0xab, + 0xd2, 0x55, 0xa7, 0x35, 0x15, 0xd9, 0x63, 0x7a, 0x39, 0x0f, 0x41, 0x91, + 0x68, 0x11, 0x1d, 0x15, 0x79, 0xf2, 0x5a, 0x61, 0xe8, 0x68, 0x2c, 0xdb, + 0x6b, 0x6a, 0xfd, 0x25, 0xf0, 0x27, 0xa9, 0xb2, 0x0e, 0x1a, 0xa9, 0xb1, + 0x5b, 0x26, 0x72, 0x33, 0xf6, 0xe1, 0x07, 0x32, 0xba, 0x54, 0x48, 0xc4, + 0x4b, 0xfa, 0xb8, 0xf4, 0x64, 0xc9, 0x2d, 0x57, 0x93, 0x8d, 0x9e, 0x23, + 0xd4, 0xda, 0xd6, 0xb3, 0x70, 0xb8, 0x9d, 0x5a, 0xeb, 0x23, 0xa6, 0xa7, + 0x71, 0x83, 0xd3, 0xbd, 0x4a, 0x5e, 0x64, 0x56, 0x9c, 0x84, 0xc4, 0x67, + 0xa6, 0x47, 0x32, 0xcb, 0xb2, 0x67, 0xed, 0xd9, 0xaa, 0xae, 0xa2, 0xdd, + 0xc9, 0xb2, 0x52, 0x95, 0x8f, 0x5d, 0x4f, 0x17, 0x09, 0xe5, 0x19, 0x14, + 0x88, 0xea, 0x25, 0x12, 0x3a, 0xd6, 0x2d, 0x5c, 0x58, 0xae, 0x8b, 0x39, + 0x74, 0xb6, 0x8d, 0x55, 0xa4, 0x7c, 0x3d, 0xc8, 0x5e, 0x1d, 0x8a, 0x3f, + 0x1a, 0xc9, 0xf8, 0x85, 0x47, 0x9f, 0xa8, 0xf3, 0x3a, 0x79, 0x1a, 0x9d, + 0x67, 0x60, 0xaf, 0x74, 0x84, 0x88, 0xea, 0xab, 0x99, 0x9c, 0xff, 0x00, + 0x51, 0xb3, 0x9b, 0x89, 0x1d, 0xd7, 0x51, 0x58, 0xf7, 0x3d, 0x42, 0x7f, + 0x8d, 0x5e, 0x85, 0xbe, 0xa1, 0x6f, 0x5a, 0x66, 0x7e, 0x2b, 0xa3, 0x62, + 0xdc, 0xb4, 0xac, 0xf3, 0xb4, 0xb1, 0xdd, 0x5c, 0x85, 0x24, 0x6b, 0x7c, + 0xb3, 0x8c, 0x65, 0x53, 0x94, 0x38, 0xc8, 0xe2, 0x63, 0xec, 0xc6, 0x99, + 0x32, 0x1a, 0x64, 0x85, 0x01, 0x21, 0x2f, 0xeb, 0xe0, 0xc1, 0xc4, 0xe0, + 0x76, 0x8b, 0x27, 0x3c, 0xd5, 0xa2, 0x8c, 0x08, 0xa9, 0xc1, 0xf7, 0xa4, + 0x77, 0x4e, 0xf1, 0xcf, 0xdf, 0x98, 0xac, 0x91, 0xdf, 0xb5, 0x16, 0x6e, + 0x4e, 0xb5, 0x6f, 0x8a, 0xaf, 0xa2, 0xca, 0xbc, 0x62, 0xd9, 0x5f, 0x89, + 0x6a, 0xb4, 0x96, 0xe9, 0x19, 0x46, 0xdf, 0x11, 0x69, 0xea, 0x1f, 0x8a, + 0x11, 0xff, 0x00, 0xa8, 0x3f, 0xf5, 0x02, 0xf1, 0x42, 0x2b, 0xf1, 0x24, + 0x66, 0x69, 0x37, 0x2a, 0xf5, 0x7d, 0x25, 0x74, 0x22, 0x4b, 0x5f, 0x54, + 0x49, 0xee, 0x52, 0x64, 0xf5, 0x16, 0x58, 0x60, 0xc1, 0x82, 0x51, 0x52, + 0x8d, 0xf5, 0x3d, 0x35, 0x8a, 0x59, 0xf4, 0xe4, 0xc9, 0xcd, 0x91, 0xd5, + 0x59, 0x11, 0x6b, 0xa6, 0x88, 0xef, 0x77, 0x24, 0xb7, 0xe9, 0xf5, 0xc9, + 0x93, 0x3d, 0x30, 0x8c, 0xca, 0x27, 0x9c, 0xba, 0xb3, 0xf1, 0x87, 0x02, + 0x3b, 0xed, 0x45, 0x7b, 0x9e, 0x9e, 0xd1, 0x4b, 0x3f, 0x73, 0x28, 0x95, + 0x91, 0x43, 0xbe, 0xb2, 0x5a, 0x9a, 0x91, 0x2d, 0x5d, 0x42, 0x97, 0x71, + 0xf9, 0x6b, 0xa6, 0x4b, 0x41, 0xa8, 0x25, 0xa1, 0xd4, 0x22, 0x55, 0xb8, + 0xb9, 0x57, 0x83, 0x89, 0xc0, 0xed, 0x8e, 0x94, 0xcb, 0x69, 0x84, 0x61, + 0xa7, 0x16, 0x51, 0x1d, 0x44, 0xa2, 0x43, 0x51, 0x19, 0x7a, 0xa3, 0xc5, + 0x90, 0xd3, 0xc1, 0x91, 0xa9, 0x21, 0x44, 0xe2, 0x63, 0xfb, 0x38, 0x38, + 0x32, 0xcb, 0xa9, 0xa8, 0xbb, 0x75, 0x48, 0xd5, 0xee, 0x36, 0xc8, 0xd1, + 0x6f, 0x77, 0x50, 0x7f, 0xe8, 0x20, 0x7e, 0x3f, 0x59, 0xf8, 0xf4, 0x4f, + 0xc7, 0xcf, 0xc7, 0xac, 0x1e, 0xfb, 0xa8, 0x25, 0xbd, 0x6a, 0xa4, 0x4b, + 0x71, 0xd4, 0xcc, 0x95, 0x93, 0x99, 0x81, 0x7b, 0x19, 0x7d, 0x2d, 0xb2, + 0xc9, 0x8b, 0xa6, 0x4e, 0xe2, 0x43, 0xd4, 0x60, 0x5a, 0xa9, 0x9b, 0x54, + 0xaf, 0x95, 0x8e, 0x72, 0x91, 0x83, 0x06, 0x3d, 0x57, 0xd6, 0xad, 0x84, + 0xd3, 0xa6, 0x51, 0x9e, 0x4c, 0x99, 0x33, 0xea, 0xc9, 0x93, 0x3d, 0x33, + 0xd3, 0x26, 0x4c, 0x99, 0x32, 0x59, 0xc7, 0x13, 0xe2, 0x60, 0xae, 0xdb, + 0x2a, 0x2b, 0xde, 0x2f, 0x81, 0x5e, 0xfb, 0x06, 0x57, 0xb9, 0xe9, 0xac, + 0x23, 0x35, 0x21, 0xb2, 0x7a, 0xba, 0xe0, 0x5b, 0xb9, 0x58, 0xdf, 0x9b, + 0xb9, 0x8f, 0x57, 0x60, 0xbb, 0xd3, 0x22, 0xb0, 0x39, 0x60, 0xb7, 0x52, + 0x73, 0x93, 0x39, 0x31, 0x4d, 0x8a, 0xc9, 0x15, 0xea, 0x25, 0xcb, 0xcd, + 0x4a, 0xa5, 0xf8, 0xdd, 0xd0, 0x2f, 0xde, 0x25, 0x7c, 0x7c, 0xc5, 0x68, + 0x8d, 0xb1, 0x97, 0xa1, 0xc6, 0x33, 0x23, 0x5c, 0x62, 0x63, 0xad, 0x36, + 0xb8, 0x34, 0xf2, 0xba, 0xb5, 0x93, 0x80, 0xa7, 0x6c, 0x05, 0xae, 0xbe, + 0x02, 0xdd, 0xe7, 0x11, 0x6f, 0x70, 0x3f, 0x1b, 0xa0, 0x9e, 0xfd, 0x04, + 0x4b, 0x7e, 0xb1, 0x8f, 0x79, 0xd4, 0x33, 0xf1, 0x4d, 0x4b, 0x3f, 0x13, + 0xd5, 0x1f, 0x89, 0xea, 0x8f, 0xc5, 0x75, 0x27, 0xe2, 0xfa, 0x84, 0x7e, + 0x33, 0x79, 0xf8, 0xcd, 0xe7, 0xe3, 0x17, 0x9f, 0x8c, 0x6a, 0x0f, 0xc7, + 0xf5, 0x27, 0xe3, 0xfa, 0x81, 0x78, 0x8e, 0xf4, 0x47, 0xc5, 0x16, 0x22, + 0xbf, 0x16, 0xd6, 0x89, 0xef, 0xfa, 0x5b, 0x67, 0x0d, 0xd3, 0x4d, 0x32, + 0x1a, 0x8a, 0x66, 0x46, 0x11, 0x91, 0xda, 0x45, 0xd6, 0xd3, 0xa6, 0x8d, + 0xfb, 0xfa, 0x45, 0xdb, 0x9d, 0x97, 0x0e, 0xfc, 0x9d, 0xcc, 0x9a, 0x86, + 0xcd, 0x2c, 0xce, 0xdb, 0x67, 0x69, 0x9c, 0x4c, 0x18, 0x30, 0x8a, 0x74, + 0xee, 0xe2, 0x3b, 0x36, 0x4f, 0xc3, 0x2a, 0x16, 0xd9, 0x5b, 0x76, 0xe8, + 0x21, 0x58, 0xe9, 0xc0, 0xe1, 0x11, 0xd3, 0x06, 0x76, 0x6b, 0x3b, 0x35, + 0x0b, 0x45, 0x54, 0x87, 0xb6, 0xc0, 0x8e, 0xd7, 0x02, 0xad, 0xab, 0x4f, + 0x9a, 0xa9, 0x85, 0x31, 0xc1, 0x8f, 0x46, 0x49, 0xdf, 0x0a, 0x8b, 0x37, + 0x8a, 0x20, 0x5b, 0xbd, 0xd9, 0x21, 0xd9, 0x76, 0xa0, 0xae, 0xbc, 0x0b, + 0xdb, 0xa6, 0x4c, 0x99, 0x32, 0x64, 0xc9, 0x93, 0x26, 0x7a, 0x67, 0xd3, + 0x93, 0x24, 0xac, 0xc1, 0x65, 0xd9, 0xe8, 0x9f, 0x4c, 0x23, 0x84, 0x4e, + 0xdc, 0x48, 0xfe, 0x58, 0xf5, 0x56, 0xc9, 0x2c, 0x9c, 0x24, 0xc8, 0xd0, + 0x88, 0xc3, 0x03, 0x9c, 0x62, 0x4f, 0x56, 0x91, 0x2b, 0x1c, 0xfa, 0xe4, + 0x47, 0xc2, 0xab, 0xde, 0x4d, 0xfb, 0x36, 0x4d, 0x93, 0x48, 0xcf, 0x17, + 0x1d, 0x4b, 0x15, 0xcd, 0x99, 0x93, 0x3e, 0xa1, 0x26, 0x47, 0xd8, 0xc9, + 0xc5, 0x33, 0xb6, 0xc8, 0x5b, 0x6d, 0x49, 0xea, 0xed, 0x3c, 0xdd, 0xa7, + 0x99, 0xb8, 0x77, 0xda, 0xc7, 0x6c, 0xce, 0x67, 0x24, 0x77, 0x22, 0x77, + 0xeb, 0x47, 0x99, 0x80, 0xae, 0x94, 0x88, 0x3b, 0x3a, 0x76, 0xe4, 0x47, + 0x4f, 0x29, 0x0b, 0x6e, 0x94, 0x8f, 0x25, 0x5a, 0x6b, 0x41, 0x03, 0xc8, + 0x44, 0xfc, 0x3a, 0x23, 0xdb, 0xa2, 0x79, 0x08, 0x36, 0xf6, 0xe9, 0xc4, + 0x95, 0x13, 0x89, 0x2a, 0xe5, 0x05, 0x91, 0xb9, 0x37, 0xe5, 0xee, 0xc6, + 0x30, 0x64, 0xe6, 0xd1, 0x1d, 0x4d, 0xd1, 0x25, 0x7d, 0xb3, 0x39, 0x48, + 0xe4, 0xc5, 0x19, 0x31, 0x53, 0x22, 0x50, 0x82, 0x4a, 0xca, 0xe0, 0x77, + 0x72, 0x67, 0xab, 0x25, 0x6f, 0x13, 0xcc, 0xb2, 0x36, 0x4e, 0x42, 0x52, + 0x62, 0x83, 0x23, 0xed, 0x1b, 0x66, 0xd4, 0x95, 0x8d, 0x8e, 0x46, 0x4c, + 0x9e, 0xe8, 0x86, 0xa9, 0xc4, 0x8e, 0xa2, 0x13, 0x32, 0x2b, 0xa7, 0x12, + 0x3a, 0xd9, 0xa1, 0xee, 0x72, 0x47, 0xe3, 0x0c, 0x5b, 0xba, 0x2d, 0xdd, + 0xac, 0x65, 0xba, 0xbd, 0x4d, 0xa7, 0x16, 0x60, 0x4d, 0x27, 0x09, 0x64, + 0x4c, 0xcf, 0x4c, 0x99, 0x32, 0x67, 0xd1, 0x93, 0x3d, 0x32, 0x64, 0xc9, + 0x93, 0x91, 0x2b, 0x52, 0x27, 0xa9, 0x25, 0x6f, 0x23, 0x3d, 0x56, 0x4e, + 0x2c, 0x55, 0xc8, 0x5a, 0x79, 0x1e, 0x5d, 0x9d, 0xb4, 0x8e, 0x55, 0xc4, + 0xf3, 0x35, 0xa1, 0xeb, 0x19, 0x2b, 0xa7, 0x23, 0xe4, 0xc7, 0xa3, 0x02, + 0xfa, 0x49, 0x4b, 0x25, 0x31, 0x25, 0xf1, 0x27, 0x82, 0x56, 0x21, 0xfd, + 0x47, 0x65, 0xb3, 0xcb, 0xc8, 0x5a, 0x79, 0xa2, 0x30, 0x9a, 0x12, 0x6b, + 0xa6, 0x4e, 0xe6, 0x0e, 0xf9, 0xe6, 0x0f, 0x35, 0x23, 0xcd, 0x48, 0xf3, + 0x19, 0x39, 0xc4, 0xab, 0x57, 0x4c, 0x09, 0x6e, 0x10, 0x65, 0xbc, 0xae, + 0x3c, 0xae, 0x4f, 0x26, 0x79, 0x33, 0xca, 0x15, 0xd7, 0xc0, 0xc9, 0x19, + 0x71, 0x6b, 0x55, 0x12, 0xad, 0x6c, 0x20, 0x2d, 0xc2, 0xb6, 0x3b, 0x74, + 0xb3, 0x6a, 0xca, 0x4e, 0xe5, 0x47, 0x76, 0xa4, 0x79, 0x8a, 0x8e, 0xfe, + 0x9a, 0x2e, 0x5b, 0x85, 0x45, 0xba, 0xc8, 0x4c, 0x9e, 0xa7, 0x28, 0x6c, + 0xdb, 0x75, 0xbe, 0x5a, 0xc7, 0xbe, 0x6d, 0xa8, 0xd6, 0xee, 0xba, 0x3d, + 0x44, 0x27, 0x05, 0x63, 0x54, 0x21, 0x42, 0x28, 0xf6, 0x47, 0x70, 0xee, + 0x9d, 0xd3, 0xb8, 0x33, 0x11, 0x1f, 0x04, 0x3b, 0x22, 0x87, 0x78, 0xee, + 0x91, 0x9c, 0x90, 0x23, 0x32, 0x36, 0x0a, 0x64, 0x5f, 0xb5, 0xc4, 0x64, + 0x7c, 0x8c, 0xc9, 0x9e, 0xaa, 0x72, 0x89, 0x1d, 0x54, 0xd0, 0xb5, 0x68, + 0x57, 0xd6, 0xcf, 0xa6, 0x43, 0xa7, 0x23, 0xd3, 0xc8, 0x74, 0xcd, 0x0e, + 0x32, 0x3d, 0xcc, 0x8a, 0xcc, 0x11, 0xd5, 0xe0, 0x5a, 0xc4, 0x2d, 0x54, + 0x59, 0xdf, 0x89, 0xdc, 0x89, 0xc9, 0x19, 0x33, 0xe9, 0xe4, 0x8e, 0x51, + 0x39, 0x44, 0xe5, 0x03, 0x35, 0x9f, 0x94, 0x62, 0x83, 0x14, 0x1f, 0x90, + 0x72, 0xa8, 0xee, 0x44, 0xef, 0x1d, 0xe9, 0x9d, 0xdb, 0x8e, 0x57, 0x33, + 0x16, 0xb3, 0xb7, 0x33, 0xb4, 0xce, 0xdb, 0x38, 0xb3, 0x8b, 0x38, 0xb3, + 0x8b, 0x38, 0xb3, 0x8b, 0x38, 0x98, 0xc1, 0xcd, 0x21, 0xc9, 0xb2, 0x10, + 0x21, 0x1c, 0x12, 0x24, 0x89, 0xc0, 0xf7, 0x42, 0x9e, 0x05, 0x68, 0xad, + 0x3b, 0x88, 0xe4, 0x8c, 0x9c, 0xcc, 0x9e, 0xc6, 0x22, 0x61, 0x18, 0x30, + 0x60, 0xc3, 0x30, 0xcf, 0x73, 0xdc, 0xcb, 0x39, 0x33, 0x2c, 0xe4, 0x72, + 0x39, 0x1c, 0x8e, 0x47, 0x23, 0x91, 0xc8, 0xe6, 0x73, 0x39, 0x1c, 0x8e, + 0x5d, 0x30, 0x70, 0x3b, 0x67, 0x68, 0xec, 0x1d, 0x83, 0xcb, 0x9d, 0x96, + 0x76, 0xe6, 0x71, 0x91, 0x87, 0xd7, 0xdb, 0xa3, 0x82, 0x3b, 0x31, 0x3c, + 0xbc, 0x07, 0x4c, 0x0e, 0xd4, 0x0e, 0x31, 0xe8, 0xa4, 0xc8, 0xc9, 0x91, + 0x22, 0x4d, 0x64, 0x94, 0x0e, 0x4d, 0x0a, 0x67, 0xb3, 0x38, 0x98, 0xfb, + 0x1c, 0x9a, 0x15, 0xb3, 0x47, 0x98, 0xb0, 0xf3, 0x12, 0x3b, 0xc7, 0x72, + 0x2c, 0xcd, 0x66, 0x29, 0x38, 0x52, 0x70, 0xa4, 0xe1, 0x51, 0xc6, 0xb3, + 0x10, 0x3e, 0x93, 0xe9, 0x32, 0x8c, 0xa3, 0x92, 0x3c, 0xb9, 0xe5, 0xcf, + 0x2e, 0x79, 0x73, 0xcb, 0x9e, 0x5c, 0xf2, 0xe7, 0x97, 0x3c, 0xb9, 0xd8, + 0x3b, 0x07, 0x60, 0xec, 0x1d, 0x86, 0x76, 0x19, 0xd9, 0x91, 0xda, 0x99, + 0xc6, 0x68, 0xfc, 0xc3, 0x36, 0x19, 0xb0, 0xfc, 0xc3, 0xf3, 0x0c, 0x58, + 0x70, 0xb0, 0xec, 0xcc, 0xf2, 0xec, 0x5a, 0x71, 0x55, 0x81, 0x2c, 0x75, + 0x68, 0x70, 0x1d, 0x43, 0xd3, 0x9e, 0x58, 0xf2, 0xec, 0xec, 0x48, 0xec, + 0xcc, 0xed, 0xd8, 0x70, 0xb0, 0xc5, 0x87, 0xe6, 0x19, 0xb0, 0xe5, 0x61, + 0xca, 0x67, 0x39, 0x9c, 0xe4, 0x73, 0x91, 0xdc, 0x91, 0xdc, 0x91, 0xdc, + 0x91, 0xdd, 0x91, 0xdd, 0x91, 0xdd, 0x67, 0x75, 0x9d, 0xd6, 0x77, 0x59, + 0xdd, 0x67, 0x75, 0x9d, 0xd6, 0x77, 0x59, 0xdd, 0x67, 0x75, 0x9d, 0xd6, + 0x77, 0x59, 0xdd, 0x67, 0x75, 0x9d, 0xd6, 0x77, 0x59, 0xdd, 0x67, 0x75, + 0x9d, 0xc6, 0x77, 0x24, 0x77, 0x24, 0x77, 0x24, 0x73, 0x99, 0xce, 0x67, + 0x39, 0x9c, 0xa6, 0x72, 0xb0, 0xcd, 0x87, 0xe6, 0x1f, 0x9a, 0x62, 0xd3, + 0x85, 0xa7, 0x6a, 0xc3, 0xb1, 0x33, 0xcb, 0x48, 0xf2, 0xcc, 0x5a, 0x61, + 0x50, 0x2a, 0xc5, 0x1e, 0xae, 0x39, 0x1d, 0x49, 0x8f, 0x4e, 0x79, 0x63, + 0xb1, 0x23, 0xb3, 0x33, 0xb7, 0x33, 0x84, 0xce, 0x12, 0x38, 0x48, 0xe0, + 0xce, 0x0c, 0xe0, 0xce, 0x0c, 0xe0, 0xce, 0x07, 0x06, 0x70, 0x38, 0x1c, + 0x0e, 0x07, 0x13, 0x06, 0x3a, 0x61, 0x9c, 0x59, 0xdb, 0x91, 0xda, 0x91, + 0xd9, 0x67, 0x61, 0x9f, 0xff, 0xc4, 0x00, 0x32, 0x11, 0x00, 0x01, 0x03, + 0x02, 0x03, 0x08, 0x01, 0x04, 0x02, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x02, 0x11, 0x03, 0x12, 0x20, 0x30, 0x31, 0x04, 0x10, + 0x13, 0x21, 0x32, 0x40, 0x41, 0x51, 0x14, 0x05, 0x22, 0x50, 0x61, 0x33, + 0x42, 0x52, 0x60, 0x15, 0x23, 0x81, 0x71, 0x24, 0xff, 0xda, 0x00, 0x08, + 0x01, 0x03, 0x01, 0x01, 0x3f, 0x01, 0xfc, 0x64, 0xe3, 0x95, 0x3b, 0xe5, + 0x4a, 0x95, 0x3b, 0xe7, 0x70, 0xa2, 0x4a, 0xf8, 0xee, 0x5f, 0x1d, 0xc8, + 0x6c, 0xde, 0xca, 0xf8, 0xcd, 0xf6, 0xbe, 0x3b, 0x17, 0x02, 0x9a, 0xe0, + 0xd3, 0xf4, 0xb8, 0x54, 0xfd, 0x2e, 0x13, 0x3d, 0x2e, 0x1d, 0x3f, 0x4b, + 0x86, 0xcf, 0x4b, 0x86, 0xcf, 0x4a, 0xc6, 0x7a, 0x56, 0x33, 0xd2, 0xb1, + 0xbe, 0x95, 0x8d, 0xf4, 0xac, 0x6f, 0xa5, 0x63, 0x7d, 0x2b, 0x1b, 0xe9, + 0x58, 0xdf, 0x4a, 0xd6, 0xfa, 0x56, 0x0f, 0x4a, 0xd1, 0xe9, 0x5a, 0xd5, + 0x68, 0x56, 0xb7, 0xd2, 0xb4, 0x7a, 0x56, 0xb7, 0xd2, 0xb5, 0xaa, 0xd6, + 0xab, 0x5a, 0xad, 0x6a, 0xb4, 0x2b, 0x42, 0xb4, 0x2b, 0x42, 0xb0, 0x2b, + 0x42, 0xb5, 0xbe, 0x95, 0x8d, 0xf4, 0xac, 0x6f, 0xa5, 0x63, 0x7d, 0x2b, + 0x07, 0xa5, 0x6b, 0x7d, 0x2b, 0x5b, 0xe9, 0x58, 0xdf, 0x4a, 0xc6, 0xfa, + 0x56, 0x37, 0xd2, 0xb1, 0xbe, 0x97, 0x0d, 0xbe, 0x97, 0x0d, 0x9e, 0x97, + 0x0d, 0x9e, 0x97, 0x0d, 0x9e, 0x97, 0x09, 0x9e, 0x97, 0x09, 0x9e, 0x97, + 0x09, 0x9e, 0x97, 0x05, 0x9e, 0x97, 0x02, 0x9f, 0xa5, 0xf1, 0xe9, 0xaf, + 0x8e, 0xc5, 0xf1, 0x9a, 0x8e, 0xcb, 0xe9, 0x3a, 0x8b, 0x9a, 0xa2, 0x11, + 0x04, 0x2e, 0x6b, 0x9e, 0xe8, 0xdd, 0x0a, 0x3f, 0x31, 0x4a, 0xe9, 0xe5, + 0x82, 0x37, 0xc7, 0xe5, 0xa1, 0x42, 0xb5, 0x56, 0xa0, 0x75, 0x01, 0x6d, + 0x3b, 0x34, 0xfd, 0xed, 0x44, 0x66, 0xc2, 0x85, 0x0a, 0xd5, 0x6a, 0x85, + 0x1f, 0x8b, 0xa7, 0x33, 0x23, 0xf2, 0x36, 0xb8, 0xf8, 0x5c, 0x27, 0xfa, + 0x5c, 0x07, 0x2f, 0x8e, 0x57, 0xc7, 0xfd, 0xae, 0x03, 0x57, 0x01, 0xab, + 0x82, 0xcf, 0x4b, 0x84, 0xc1, 0xe1, 0x58, 0xdf, 0x4a, 0xd1, 0xe9, 0x40, + 0x51, 0x87, 0x6c, 0xa3, 0x69, 0xb8, 0x76, 0xb0, 0xad, 0x51, 0xf8, 0x48, + 0x2a, 0xd2, 0xad, 0x2a, 0x9d, 0x5b, 0x04, 0x42, 0xe3, 0xfe, 0x97, 0x1c, + 0xfa, 0x5f, 0x20, 0xfa, 0x5c, 0x73, 0xe9, 0x7c, 0x83, 0xe9, 0x71, 0xcf, + 0xa5, 0xc7, 0xfd, 0x2f, 0x91, 0xfa, 0x5c, 0x7f, 0xd2, 0xe3, 0x85, 0xc7, + 0x6a, 0xe3, 0x35, 0x71, 0x1b, 0xed, 0x5e, 0x14, 0xa9, 0xef, 0x45, 0x27, + 0x14, 0x36, 0x7f, 0x68, 0x52, 0x68, 0x56, 0x81, 0xd9, 0x56, 0xa7, 0xc4, + 0x61, 0x6a, 0x70, 0xb4, 0xc1, 0xee, 0x21, 0x1e, 0x59, 0x13, 0xd9, 0x42, + 0xb5, 0x5a, 0xad, 0x0a, 0x07, 0x6b, 0x28, 0x3d, 0xde, 0xd7, 0x15, 0xc8, + 0x56, 0x42, 0xab, 0x4a, 0x0e, 0x07, 0xb6, 0x00, 0xbb, 0x44, 0xda, 0x1f, + 0xe4, 0x83, 0x43, 0x74, 0xed, 0xf6, 0xea, 0x76, 0xbe, 0x7d, 0xf7, 0x3a, + 0xa3, 0xba, 0x0a, 0xb1, 0xde, 0x97, 0x0d, 0xcb, 0x84, 0xe5, 0x63, 0x95, + 0xa7, 0xd2, 0xb4, 0xfa, 0x56, 0x95, 0x07, 0x2e, 0x0a, 0xb5, 0x5a, 0xa3, + 0xf0, 0x02, 0xa3, 0x82, 0x15, 0xbd, 0xa0, 0xe0, 0x74, 0xec, 0x99, 0x4a, + 0xe4, 0x1a, 0x06, 0x9d, 0xcf, 0xd4, 0x3f, 0xa9, 0xed, 0xa1, 0x42, 0xb5, + 0x40, 0x5c, 0xbd, 0x29, 0x57, 0x15, 0x25, 0x49, 0x52, 0xa4, 0xab, 0x8a, + 0xb8, 0xab, 0x8a, 0xb8, 0xab, 0x94, 0xfe, 0x97, 0xdb, 0xe9, 0x5a, 0xcf, + 0x4b, 0x86, 0xc4, 0x69, 0xfa, 0x5c, 0x32, 0xb8, 0x6a, 0xc0, 0xa0, 0x7e, + 0x18, 0x18, 0x4d, 0xac, 0x46, 0xa9, 0xae, 0x0e, 0xd3, 0x36, 0xe0, 0xa4, + 0x2a, 0x54, 0xee, 0xe6, 0x7b, 0x9b, 0x95, 0xcb, 0x6e, 0x32, 0xc1, 0xd9, + 0xda, 0xa3, 0xfd, 0x08, 0x12, 0x34, 0x42, 0xb1, 0x5c, 0x73, 0xe9, 0x71, + 0xdc, 0xb8, 0xce, 0x5c, 0x67, 0xae, 0x33, 0xd7, 0x1a, 0xa7, 0xb5, 0xc6, + 0x7f, 0xb5, 0xc6, 0x7a, 0xe3, 0x3d, 0x71, 0xdc, 0x9c, 0xe2, 0x4a, 0x95, + 0x2a, 0x8d, 0x67, 0x83, 0x08, 0x1c, 0xd9, 0x52, 0xa5, 0x4a, 0x95, 0x2a, + 0x54, 0xa9, 0x57, 0x2b, 0x95, 0xee, 0xf6, 0xb8, 0x8f, 0xf6, 0x8b, 0x9c, + 0x75, 0x3b, 0xa1, 0x42, 0x85, 0x6a, 0x8d, 0xd1, 0x91, 0x6a, 0x8f, 0xf5, + 0x22, 0x82, 0x0e, 0x2d, 0xe6, 0x13, 0x76, 0xba, 0xad, 0xf2, 0x9b, 0xb7, + 0x9f, 0xec, 0xd4, 0xdd, 0xb2, 0x8b, 0xbf, 0x49, 0xae, 0x6b, 0xba, 0x4c, + 0xe4, 0xca, 0x95, 0x28, 0xd6, 0x63, 0x75, 0x29, 0xdb, 0x65, 0x31, 0xa2, + 0x3b, 0x6f, 0xa0, 0x8e, 0xd7, 0x50, 0xaf, 0x93, 0x57, 0xda, 0xf9, 0x15, + 0x7d, 0xae, 0x3d, 0x4f, 0x6b, 0x8a, 0xf3, 0xe5, 0x5e, 0xef, 0x79, 0x51, + 0xba, 0x77, 0x42, 0x8d, 0xc0, 0x7e, 0x2a, 0x14, 0x28, 0x50, 0xa1, 0x42, + 0x85, 0x0a, 0x3f, 0x04, 0x31, 0x83, 0x09, 0x9b, 0x5d, 0x56, 0x79, 0x95, + 0x4f, 0x6f, 0x63, 0xba, 0xc4, 0x26, 0xb8, 0x3c, 0x4b, 0x4c, 0xef, 0x95, + 0x72, 0x7e, 0xd0, 0xc6, 0x6a, 0x53, 0xb6, 0xdf, 0xf1, 0x08, 0xed, 0x75, + 0x0e, 0x89, 0xcf, 0x73, 0xfa, 0x8f, 0xfa, 0x0c, 0x66, 0x47, 0xe0, 0x7c, + 0x65, 0x35, 0xee, 0x61, 0x96, 0x95, 0x4b, 0x6f, 0x3a, 0x54, 0x09, 0xdb, + 0x5d, 0x20, 0x24, 0x14, 0xfd, 0xb0, 0x9e, 0x90, 0x9d, 0x55, 0xef, 0xd4, + 0xff, 0x00, 0xa1, 0xc7, 0xe3, 0xce, 0x9f, 0x88, 0x3f, 0xeb, 0x07, 0x30, + 0x77, 0x64, 0xfe, 0x46, 0x54, 0xa9, 0x53, 0xbe, 0x54, 0xfe, 0x04, 0xe6, + 0xca, 0x95, 0x2a, 0x54, 0xf6, 0x44, 0xa9, 0x52, 0xa7, 0xfd, 0xf0, 0xfe, + 0x5a, 0x3f, 0x34, 0x3b, 0x03, 0xdf, 0x47, 0xe4, 0x61, 0x42, 0xb4, 0xab, + 0x4a, 0x85, 0x0a, 0xd5, 0x0a, 0x14, 0x77, 0x03, 0x3c, 0x9e, 0xe0, 0x35, + 0x72, 0x5c, 0x94, 0x8f, 0x2b, 0x92, 0x90, 0xae, 0x57, 0x2b, 0x8a, 0x95, + 0x21, 0x7d, 0xaa, 0x02, 0xb4, 0x2b, 0x51, 0x6f, 0x67, 0x1d, 0x80, 0x63, + 0x9d, 0xa0, 0x43, 0x66, 0xaa, 0x7f, 0xaa, 0xf8, 0xb5, 0xbf, 0xc5, 0x1a, + 0x4f, 0x67, 0x50, 0xdd, 0x72, 0x92, 0xa4, 0xa9, 0x38, 0xa4, 0xab, 0x95, + 0xcb, 0x92, 0x2d, 0x29, 0xad, 0xb9, 0x16, 0x10, 0xad, 0x76, 0x50, 0xa6, + 0xe7, 0x68, 0x10, 0xd9, 0x9c, 0xbe, 0x37, 0xed, 0x1a, 0x04, 0x79, 0x4e, + 0x69, 0x6e, 0xb8, 0x01, 0xcf, 0x3d, 0x9d, 0xa5, 0x5b, 0xfb, 0x50, 0xdf, + 0x68, 0xdb, 0xe1, 0x08, 0x84, 0x74, 0xce, 0x95, 0x70, 0x53, 0x2a, 0x14, + 0x23, 0x88, 0x34, 0x9d, 0x02, 0x14, 0x1e, 0x7c, 0x2f, 0x8e, 0x7c, 0x95, + 0xc1, 0x67, 0xb4, 0x19, 0x4f, 0xd2, 0xfb, 0x07, 0xf5, 0x57, 0x0f, 0xd2, + 0xbf, 0xf6, 0x8d, 0x40, 0x53, 0x6a, 0x80, 0xb8, 0xc7, 0xda, 0xe2, 0xff, + 0x00, 0xf1, 0x07, 0x83, 0xfd, 0x42, 0x3c, 0x3f, 0x2d, 0x56, 0xd1, 0x3e, + 0x0a, 0x34, 0xa9, 0xff, 0x00, 0x57, 0x2f, 0x8e, 0x7c, 0x14, 0x68, 0xd4, + 0x1e, 0x14, 0x61, 0xa5, 0xb0, 0xbd, 0xfc, 0xdf, 0xc9, 0x53, 0xd9, 0x69, + 0x53, 0xf0, 0xa3, 0x05, 0x5d, 0x8d, 0xaf, 0xe6, 0xde, 0x4a, 0xa5, 0x27, + 0x52, 0x30, 0xec, 0xd9, 0x53, 0xce, 0x51, 0x71, 0x2a, 0xe7, 0x04, 0x2a, + 0x18, 0xe6, 0xae, 0x61, 0xd4, 0x2b, 0x58, 0x74, 0x2b, 0x87, 0xe9, 0x16, + 0x11, 0xbd, 0xad, 0xbc, 0xc0, 0x4c, 0xa2, 0xd6, 0xe0, 0x28, 0xa7, 0xb3, + 0xc8, 0xde, 0x32, 0x8b, 0x4b, 0x75, 0xde, 0x1a, 0x5d, 0xa0, 0x44, 0x11, + 0xaa, 0x76, 0x5d, 0xc1, 0x5c, 0x0e, 0xfb, 0x7d, 0xae, 0x4b, 0xff, 0x00, + 0x17, 0x35, 0x6a, 0xb4, 0x20, 0x13, 0x94, 0x27, 0x66, 0x39, 0xf0, 0x8b, + 0x89, 0xc0, 0x1e, 0x42, 0x06, 0x77, 0x42, 0xb5, 0x0a, 0x0f, 0x28, 0x51, + 0x6f, 0x92, 0x83, 0x1a, 0x34, 0x6a, 0x73, 0xc8, 0xd4, 0xa2, 0xf5, 0x79, + 0x57, 0x1f, 0x7b, 0xf9, 0x61, 0x95, 0x46, 0x25, 0x3c, 0xc9, 0xdf, 0x28, + 0x3d, 0xc1, 0x71, 0x8f, 0x95, 0x34, 0x9d, 0xa8, 0x5c, 0x06, 0xbb, 0xa5, + 0xc8, 0xb2, 0x0c, 0x2a, 0x00, 0x71, 0x5b, 0x91, 0xb6, 0x36, 0x69, 0xce, + 0x6f, 0x8d, 0xf2, 0xa7, 0x00, 0x7b, 0x82, 0xbc, 0x1e, 0xa0, 0xac, 0x63, + 0xb4, 0x2a, 0x8d, 0x32, 0xd7, 0xf3, 0xc2, 0x51, 0x47, 0x78, 0xc9, 0x02, + 0x74, 0xc3, 0x2e, 0x1a, 0x15, 0x2e, 0xf6, 0xa7, 0xd8, 0x5f, 0x61, 0x56, + 0xb7, 0xda, 0xb0, 0xf8, 0x50, 0x46, 0x0a, 0x8f, 0xb0, 0x4a, 0x2e, 0x2e, + 0xd7, 0x7b, 0x5e, 0x5a, 0x99, 0x5a, 0xee, 0x45, 0x48, 0x57, 0x2b, 0xd0, + 0x33, 0xbb, 0x44, 0x5a, 0x88, 0xe4, 0x9b, 0xa2, 0x76, 0x63, 0xb5, 0xc5, + 0x4f, 0x5c, 0x12, 0x50, 0xaf, 0xe1, 0xc1, 0x02, 0xd7, 0x74, 0xa7, 0x09, + 0x47, 0x96, 0x5b, 0x3e, 0xd6, 0x93, 0x91, 0x3b, 0xa8, 0xff, 0x00, 0x23, + 0x72, 0x36, 0xaf, 0xe2, 0x39, 0xad, 0xd3, 0x26, 0x7d, 0x6e, 0xa1, 0x37, + 0x60, 0x28, 0xa2, 0x8a, 0xb4, 0x9d, 0x17, 0x0c, 0x8d, 0x79, 0x28, 0x60, + 0xf2, 0xa5, 0xbe, 0x02, 0x9c, 0x83, 0xba, 0x3d, 0x6e, 0x85, 0xcd, 0x41, + 0x56, 0xee, 0xe6, 0x83, 0x8a, 0xbb, 0xda, 0xfb, 0x55, 0xa3, 0xc1, 0x5b, + 0x40, 0x86, 0xe1, 0x66, 0xb8, 0x19, 0xa6, 0xe8, 0x51, 0x28, 0xc2, 0x1a, + 0x23, 0xae, 0x61, 0xc5, 0x4f, 0x5c, 0x30, 0xb4, 0xe6, 0x10, 0xad, 0xfe, + 0x48, 0xfd, 0xe3, 0x92, 0xb1, 0xca, 0xc2, 0xad, 0x1e, 0xd7, 0xda, 0xbe, + 0xc5, 0x2c, 0xf4, 0xa5, 0xbe, 0x94, 0xb7, 0xd2, 0x96, 0xfa, 0x52, 0xdf, + 0x48, 0xda, 0xbe, 0xd5, 0x0d, 0xf6, 0xac, 0xfd, 0xab, 0x08, 0xdc, 0x70, + 0x51, 0xfe, 0x46, 0xe4, 0x6d, 0x03, 0xfe, 0xb3, 0x9a, 0xc4, 0x72, 0xa8, + 0x6b, 0x84, 0xa2, 0x8a, 0x35, 0x0f, 0x9d, 0xd3, 0x86, 0x14, 0x28, 0x51, + 0xd8, 0x6d, 0x1a, 0x0c, 0x2d, 0xd7, 0x03, 0x4f, 0x25, 0x2a, 0xe4, 0x1d, + 0x1e, 0x53, 0x9c, 0x10, 0xec, 0xe9, 0x62, 0x85, 0x0b, 0x9b, 0x74, 0x57, + 0x93, 0xae, 0x48, 0x08, 0xe5, 0x52, 0xeb, 0x19, 0x15, 0xba, 0x0e, 0x6b, + 0x75, 0x4e, 0xdf, 0x7f, 0x28, 0x21, 0x1f, 0xd6, 0x2a, 0x1a, 0xe1, 0x28, + 0xa2, 0xa1, 0x40, 0xc7, 0x2a, 0x7b, 0x1d, 0xa3, 0xc6, 0x11, 0xae, 0x4f, + 0x8c, 0xc3, 0xa6, 0x3a, 0x58, 0xe3, 0x74, 0x28, 0x84, 0x21, 0x40, 0x50, + 0x11, 0x8d, 0xc3, 0xf5, 0xbb, 0x54, 0x74, 0x50, 0x89, 0xf5, 0x86, 0x37, + 0xd3, 0xeb, 0x19, 0x15, 0x3a, 0x4e, 0x6b, 0x35, 0x4e, 0xd7, 0x2b, 0x67, + 0xd7, 0x11, 0x47, 0xbb, 0xda, 0x3c, 0x6e, 0x1b, 0xc7, 0x6a, 0xed, 0x31, + 0xd2, 0xcd, 0x95, 0x2a, 0x42, 0x0e, 0x01, 0x5e, 0x15, 0xc1, 0x5c, 0x89, + 0x9c, 0x3c, 0xbc, 0xe0, 0x67, 0x50, 0xc8, 0x76, 0x88, 0xe6, 0x33, 0x54, + 0xed, 0x77, 0x47, 0x29, 0xc8, 0xa1, 0xae, 0x22, 0x8a, 0x3a, 0xf7, 0x5b, + 0x46, 0xa3, 0x70, 0xee, 0x1d, 0xa6, 0x3a, 0x79, 0x90, 0x8f, 0xb5, 0x2a, + 0x54, 0x95, 0x71, 0x4d, 0xe6, 0x61, 0x3b, 0x54, 0x30, 0xe8, 0xa7, 0x7b, + 0x75, 0xc8, 0x3a, 0x27, 0x6b, 0x98, 0xcd, 0x51, 0xd7, 0x78, 0xc7, 0x43, + 0x5c, 0x45, 0x14, 0x75, 0xee, 0xb6, 0x8e, 0xa1, 0xb8, 0x60, 0x1a, 0x76, + 0x8f, 0xd3, 0x1d, 0x2c, 0x98, 0xdd, 0x30, 0xae, 0x47, 0x90, 0xc2, 0xdd, + 0x55, 0x4e, 0xa2, 0x86, 0x22, 0xb5, 0xdc, 0x35, 0xc9, 0xa9, 0xd6, 0x73, + 0x18, 0x9d, 0xae, 0x55, 0x0d, 0x71, 0x14, 0x53, 0xb5, 0xee, 0xb6, 0x8e, + 0xac, 0x43, 0x4c, 0x87, 0x08, 0x24, 0x66, 0x3f, 0x4c, 0x74, 0xf1, 0x38, + 0xc0, 0x4d, 0x3c, 0xf7, 0x95, 0x12, 0xa2, 0x13, 0xba, 0x46, 0x2a, 0x9d, + 0x5b, 0xe5, 0x4a, 0x9d, 0xce, 0x28, 0x38, 0x85, 0xaa, 0x84, 0x32, 0x2a, + 0xf5, 0x9c, 0xc6, 0x27, 0x65, 0x50, 0xd7, 0x11, 0x45, 0x3b, 0x5e, 0xea, + 0xbf, 0x5e, 0x26, 0xe9, 0x8c, 0x6a, 0xaa, 0x7f, 0x97, 0xbc, 0xca, 0x9a, + 0x63, 0xa7, 0xa6, 0x27, 0x09, 0x41, 0xb1, 0x82, 0x37, 0x3f, 0x41, 0x88, + 0xf8, 0xdd, 0x0a, 0x14, 0x2b, 0x50, 0x09, 0xe3, 0x73, 0x74, 0xdc, 0x34, + 0xc8, 0xaf, 0xfc, 0x87, 0x31, 0x88, 0xe5, 0x50, 0xd7, 0x11, 0x45, 0x3b, + 0x5e, 0xea, 0xb7, 0x5e, 0x26, 0xe9, 0x8d, 0xba, 0xa2, 0x79, 0x66, 0x54, + 0xc7, 0x4f, 0x4c, 0xda, 0x9e, 0x31, 0x1d, 0x06, 0x29, 0xdd, 0xc3, 0xde, + 0xdd, 0x32, 0x36, 0x9f, 0xe5, 0x39, 0x8c, 0xd5, 0x3b, 0x2a, 0x86, 0xb8, + 0x8a, 0x29, 0xfa, 0xf7, 0x55, 0xba, 0xd0, 0xc2, 0xde, 0x9c, 0x03, 0x78, + 0x51, 0x39, 0x95, 0x31, 0xd3, 0xd3, 0x36, 0xa7, 0x8c, 0x07, 0x71, 0xe9, + 0x19, 0x03, 0x7b, 0x3a, 0x46, 0x46, 0xd5, 0xfc, 0xa7, 0x31, 0x9a, 0xa3, + 0x95, 0x43, 0xab, 0x19, 0x4f, 0xd7, 0xba, 0xad, 0xd6, 0x86, 0x16, 0x74, + 0xe3, 0x0b, 0xca, 0x3a, 0xe5, 0xd4, 0xc7, 0x4f, 0x4c, 0xda, 0x9b, 0xfc, + 0x6f, 0xfe, 0xa3, 0x28, 0xaa, 0x7d, 0x03, 0x23, 0x6a, 0xfe, 0x53, 0x98, + 0xd4, 0x72, 0xa8, 0x75, 0x6e, 0x38, 0x4a, 0x7e, 0xbd, 0xd5, 0x6e, 0xb4, + 0x30, 0xb3, 0xa7, 0x18, 0x47, 0x54, 0x72, 0xea, 0x63, 0xa7, 0xa6, 0x6d, + 0x4d, 0x77, 0xf8, 0xdf, 0xfd, 0x46, 0x51, 0x54, 0xba, 0x06, 0x46, 0xd1, + 0xfc, 0x87, 0x30, 0x68, 0x51, 0xca, 0xa3, 0xd5, 0xb8, 0xe1, 0x29, 0xfa, + 0xf7, 0x55, 0x7a, 0xce, 0x26, 0x74, 0xe3, 0x08, 0xea, 0x8e, 0x99, 0x75, + 0x31, 0xd3, 0xd3, 0x35, 0xfa, 0xef, 0xf1, 0xbc, 0x74, 0xe5, 0xd1, 0xfe, + 0x31, 0x8c, 0xaa, 0xff, 0x00, 0xc8, 0x73, 0x3c, 0x23, 0x95, 0x47, 0xab, + 0x19, 0x4f, 0xd7, 0xba, 0xab, 0xd6, 0x71, 0x33, 0xa4, 0x60, 0x8d, 0xe0, + 0x27, 0x6a, 0x86, 0x5d, 0x4c, 0x74, 0xf4, 0xcd, 0x38, 0x86, 0x87, 0x2e, + 0x87, 0xf1, 0x8c, 0x8a, 0xbd, 0x67, 0x33, 0xc2, 0x39, 0x54, 0x7a, 0xb1, + 0x94, 0xfd, 0x7b, 0xaa, 0x9d, 0x67, 0x13, 0x3a, 0x46, 0xf1, 0xbe, 0x14, + 0xc2, 0x26, 0x50, 0x47, 0x5c, 0xaa, 0x98, 0xd9, 0xa6, 0x7c, 0xa9, 0xde, + 0x32, 0xf6, 0x7f, 0xe2, 0x19, 0x0f, 0xea, 0x39, 0x87, 0x2e, 0x97, 0x56, + 0x45, 0x4d, 0x7b, 0xaa, 0x9d, 0x67, 0x13, 0x3a, 0x46, 0xfd, 0x37, 0x05, + 0xa2, 0xf3, 0xb8, 0x27, 0x65, 0x54, 0xc6, 0xcd, 0x3b, 0xed, 0x9b, 0xf8, + 0x86, 0x43, 0xb5, 0xcb, 0x89, 0x45, 0x6a, 0x9b, 0x4d, 0xcf, 0xe9, 0x44, + 0x16, 0xf2, 0x39, 0x14, 0xba, 0xb2, 0x2a, 0x6b, 0xdd, 0x54, 0xeb, 0x38, + 0x98, 0x7e, 0xd0, 0xa7, 0x70, 0xe7, 0xae, 0x0f, 0x3b, 0xf5, 0xca, 0xa9, + 0x8d, 0x9a, 0x66, 0x4a, 0x9e, 0xc7, 0x65, 0xfe, 0x21, 0x90, 0x73, 0x21, + 0x6a, 0x53, 0x45, 0x31, 0xfd, 0x95, 0x48, 0x9e, 0x48, 0xf0, 0xbc, 0x28, + 0x0a, 0xd5, 0x18, 0x29, 0xf5, 0x23, 0x8e, 0xa6, 0xb9, 0x92, 0x33, 0xaa, + 0xf5, 0x9c, 0x54, 0xfa, 0x42, 0x0b, 0x5c, 0x80, 0x88, 0xc9, 0xa9, 0xae, + 0x36, 0x69, 0xda, 0xce, 0x4e, 0xc7, 0xfc, 0x79, 0x0e, 0xd7, 0x3f, 0xc6, + 0xe8, 0xe5, 0x23, 0x74, 0x95, 0x7a, 0x91, 0xb9, 0x9d, 0x48, 0xe3, 0xa9, + 0xae, 0x54, 0xa9, 0x1b, 0x98, 0xf2, 0xc2, 0x83, 0xda, 0xed, 0x33, 0x2a, + 0xf5, 0x9c, 0x54, 0xba, 0x46, 0xf2, 0x40, 0xd5, 0x48, 0x38, 0x26, 0x77, + 0x83, 0x22, 0xdc, 0x31, 0x81, 0xfa, 0xe3, 0x6e, 0x98, 0xa5, 0x4f, 0x63, + 0x2a, 0x70, 0xec, 0x5f, 0xc7, 0x90, 0xfe, 0xa3, 0x94, 0x07, 0x9c, 0x61, + 0x11, 0xba, 0x37, 0xb3, 0xa9, 0x1c, 0x75, 0x35, 0xc6, 0x4c, 0x09, 0x46, + 0xa3, 0x9d, 0xe7, 0x03, 0x29, 0x97, 0xa7, 0xd3, 0x2c, 0xd7, 0x70, 0xaa, + 0xe6, 0xa1, 0xb4, 0x7b, 0x42, 0xa3, 0x4f, 0x9c, 0x9a, 0xbd, 0x67, 0x15, + 0x3e, 0x95, 0x2b, 0x8a, 0xd5, 0x55, 0xd7, 0x3b, 0x70, 0x7b, 0x82, 0xe2, + 0x3b, 0xda, 0x92, 0x75, 0x4d, 0x71, 0x6e, 0x88, 0xbe, 0xed, 0xcc, 0xaa, + 0x69, 0x99, 0x4f, 0xae, 0xca, 0x9e, 0x15, 0xc3, 0x7f, 0x3c, 0x0f, 0xd7, + 0x1b, 0x74, 0xc5, 0x4e, 0x8d, 0x4a, 0xbd, 0x01, 0x3b, 0xe9, 0xb5, 0x80, + 0x90, 0x9f, 0xb3, 0xd5, 0xa7, 0xd4, 0xdc, 0x14, 0xdb, 0x71, 0x87, 0x82, + 0x3f, 0xf1, 0x3a, 0x98, 0x1e, 0x73, 0xa5, 0x4a, 0x95, 0xb0, 0xf4, 0x1c, + 0x8a, 0xbd, 0x67, 0x1d, 0x8a, 0x37, 0x13, 0x82, 0xc3, 0xaa, 0x3b, 0x86, + 0x09, 0x52, 0xa9, 0xf5, 0x04, 0x71, 0xd4, 0xd7, 0x1d, 0x63, 0x0d, 0x8c, + 0x37, 0xb9, 0xbc, 0x82, 0x2e, 0x27, 0x5c, 0x21, 0xc4, 0x68, 0x85, 0x77, + 0x04, 0x36, 0x8f, 0x61, 0x0a, 0xec, 0x5c, 0x46, 0xfb, 0x53, 0xbe, 0xaf, + 0x59, 0xc5, 0x7b, 0x80, 0x80, 0xa4, 0x9d, 0xfc, 0x27, 0x44, 0xe0, 0x0c, + 0x23, 0x99, 0xc7, 0x25, 0x5c, 0x55, 0xe5, 0x5e, 0x55, 0xe8, 0xeb, 0x8e, + 0xe2, 0x10, 0x7f, 0xb5, 0x29, 0xce, 0x85, 0x7a, 0xbc, 0x2d, 0x98, 0xb5, + 0x94, 0xc3, 0x42, 0xb9, 0x4a, 0x75, 0x2a, 0x6f, 0xea, 0x09, 0xdb, 0x05, + 0x07, 0x78, 0x84, 0x7e, 0x96, 0xdf, 0xea, 0xe5, 0x57, 0x65, 0xaa, 0x7a, + 0x1c, 0xaa, 0x6c, 0x5b, 0x50, 0x7c, 0xdb, 0x3f, 0xb4, 0x76, 0x7a, 0xad, + 0xd5, 0xa5, 0x6c, 0x3b, 0x13, 0x2a, 0xb4, 0xba, 0xa8, 0x47, 0xe9, 0xbb, + 0x39, 0xf0, 0xbf, 0xe2, 0xe8, 0x7b, 0x29, 0xdf, 0x49, 0xe7, 0xc9, 0xc8, + 0x7d, 0x27, 0xdb, 0xd0, 0xfa, 0x76, 0xce, 0x3c, 0x26, 0xec, 0xd4, 0x59, + 0xa3, 0x55, 0x8d, 0xf4, 0xb6, 0xc6, 0xbd, 0xb5, 0x48, 0x76, 0xe0, 0xc7, + 0x1d, 0x02, 0x1b, 0x3d, 0x53, 0xfd, 0x50, 0xd8, 0xab, 0x7a, 0x44, 0x41, + 0x83, 0xbb, 0xe9, 0xfd, 0x07, 0x22, 0xbf, 0x2a, 0x8e, 0xc3, 0x08, 0x29, + 0x52, 0x89, 0x94, 0xd6, 0x39, 0xda, 0x04, 0xcd, 0x85, 0xee, 0xea, 0xe4, + 0xaa, 0xec, 0x36, 0x32, 0x5a, 0x53, 0x5b, 0x3b, 0x9c, 0x84, 0xb7, 0xc2, + 0x69, 0x05, 0x01, 0x08, 0xb0, 0x14, 0x69, 0x7a, 0x5c, 0x37, 0x2b, 0x48, + 0x4c, 0xea, 0x08, 0xe3, 0xa9, 0xae, 0x08, 0x42, 0x9b, 0x8a, 0x14, 0x7d, + 0xa7, 0xec, 0xec, 0x7e, 0xaa, 0xb5, 0x2e, 0x13, 0xa3, 0x04, 0x65, 0xca, + 0xbc, 0xae, 0x23, 0xbd, 0xa9, 0x9c, 0x43, 0x05, 0xc7, 0x70, 0x67, 0xb4, + 0x00, 0x1a, 0x29, 0x27, 0xb3, 0x3b, 0xf5, 0x45, 0x84, 0x6e, 0x65, 0x67, + 0xd3, 0xe9, 0x2a, 0x9f, 0xd4, 0x08, 0xeb, 0x0a, 0x9e, 0xdb, 0x4d, 0xfe, + 0x50, 0xa9, 0x2a, 0xf5, 0x72, 0x95, 0x2a, 0x54, 0xa9, 0xc6, 0xe6, 0x35, + 0xda, 0x85, 0x63, 0x46, 0x83, 0x79, 0x13, 0xc8, 0xaa, 0x9b, 0x04, 0xba, + 0x58, 0x86, 0xc1, 0x4c, 0x8e, 0x7a, 0xaa, 0x1b, 0x38, 0xa1, 0x30, 0x72, + 0x36, 0x91, 0xff, 0x00, 0x69, 0xdf, 0x69, 0x3e, 0x10, 0xa5, 0x50, 0xe8, + 0xd4, 0x36, 0x5a, 0xc7, 0xc2, 0x1b, 0x15, 0x62, 0x87, 0xd3, 0xcf, 0xf6, + 0x72, 0x6e, 0xc1, 0x4c, 0x6a, 0x85, 0x0a, 0x54, 0xf9, 0xc2, 0x9a, 0x95, + 0xcc, 0x33, 0x90, 0x5c, 0x1d, 0xa1, 0x9d, 0x0f, 0x5f, 0xfe, 0xc1, 0xe9, + 0x39, 0x95, 0x43, 0xba, 0x53, 0x99, 0x58, 0x78, 0x46, 0x54, 0x22, 0xc0, + 0x54, 0xb9, 0xa8, 0x3c, 0x79, 0xc1, 0x08, 0xe3, 0x75, 0x3b, 0x8a, 0xe0, + 0xa1, 0x49, 0xab, 0x86, 0xd0, 0xa3, 0x06, 0xd1, 0x4b, 0x88, 0xce, 0x5a, + 0xe0, 0xff, 0x00, 0xe6, 0xf8, 0xec, 0x6e, 0x57, 0x29, 0xde, 0xd7, 0x42, + 0x0e, 0x07, 0xb9, 0xbc, 0x8e, 0x58, 0x01, 0x4d, 0xa8, 0xe1, 0xa1, 0x4d, + 0xda, 0xea, 0x04, 0xdd, 0xbb, 0xd8, 0x4d, 0xdb, 0x29, 0x94, 0xda, 0xcd, + 0x76, 0x85, 0x07, 0x66, 0xc6, 0xe2, 0x32, 0x78, 0x6c, 0x3c, 0xc8, 0x5c, + 0x36, 0x0f, 0x0a, 0x00, 0xc7, 0x55, 0xe6, 0xb3, 0xb8, 0x6d, 0x4c, 0x01, + 0x82, 0x02, 0x95, 0x76, 0xfd, 0xa0, 0x53, 0x99, 0xf2, 0xa4, 0x28, 0x50, + 0x8b, 0x01, 0x44, 0x16, 0x73, 0x09, 0xae, 0xbb, 0x79, 0xca, 0x9c, 0x2e, + 0x98, 0xe4, 0xaa, 0xd1, 0x11, 0x38, 0x2e, 0x2a, 0xe5, 0x76, 0xe8, 0x50, + 0xa1, 0x46, 0x58, 0x05, 0x1a, 0x64, 0x09, 0x38, 0xc1, 0x21, 0x0a, 0x85, + 0x0a, 0x81, 0x4c, 0xf7, 0x4d, 0x32, 0x30, 0x4a, 0xd8, 0xcb, 0xdf, 0x54, + 0x09, 0x40, 0x46, 0x2f, 0xfc, 0x5f, 0xf9, 0xbd, 0xc0, 0x9d, 0x0a, 0x1c, + 0xbb, 0x47, 0x36, 0xe1, 0x09, 0x94, 0x43, 0x34, 0x51, 0xb8, 0x90, 0x35, + 0x4e, 0xda, 0x18, 0x34, 0x4e, 0xda, 0x1c, 0xed, 0x11, 0x3b, 0xcb, 0xa3, + 0x54, 0x1c, 0xd7, 0x68, 0xa1, 0x1f, 0xb1, 0xc8, 0x73, 0x50, 0x8e, 0x28, + 0x47, 0x26, 0x25, 0x6d, 0x3b, 0x35, 0xa2, 0xf6, 0x62, 0xa6, 0xfb, 0x0a, + 0xb1, 0xa5, 0x1a, 0x43, 0xc2, 0x34, 0x4a, 0x34, 0xdc, 0xad, 0x2a, 0xc5, + 0x61, 0x56, 0x3b, 0xd2, 0xe1, 0xbb, 0xd2, 0xe0, 0xbf, 0xd2, 0x14, 0x1c, + 0x86, 0xcc, 0x7d, 0xa1, 0xb3, 0x84, 0x28, 0xb0, 0x22, 0x43, 0x04, 0xa7, + 0xbc, 0xbc, 0xe5, 0xc5, 0xc2, 0x55, 0xa5, 0x47, 0x6e, 0xc3, 0x87, 0xe9, + 0xcc, 0xd5, 0xf9, 0xa3, 0x69, 0xa6, 0x4d, 0xa4, 0xc1, 0xde, 0x51, 0xec, + 0x5f, 0x51, 0xac, 0xea, 0x29, 0xfb, 0x4d, 0xdd, 0x05, 0x49, 0x38, 0xaa, + 0x69, 0xb8, 0x3d, 0xc1, 0x39, 0xf7, 0x0e, 0x6a, 0x93, 0xbf, 0xae, 0xe3, + 0x82, 0x14, 0x28, 0x47, 0x20, 0xb9, 0xad, 0xd4, 0xa3, 0xb4, 0xd2, 0x6f, + 0x94, 0x76, 0xda, 0x67, 0x94, 0x27, 0xdb, 0x3f, 0x6e, 0x98, 0xa8, 0xd4, + 0xfe, 0xa7, 0x34, 0x9b, 0x44, 0x94, 0xf7, 0x97, 0x9c, 0xca, 0x67, 0x96, + 0xf8, 0x0a, 0xc0, 0xac, 0x56, 0x15, 0x69, 0x56, 0x95, 0x05, 0x73, 0x5c, + 0xd4, 0x15, 0x6b, 0x95, 0x85, 0x70, 0xd3, 0xa0, 0x64, 0xb3, 0x5c, 0x3b, + 0x3d, 0x3e, 0x1d, 0x30, 0xdc, 0xdd, 0xa3, 0x66, 0x6d, 0x71, 0xfb, 0x45, + 0xd5, 0xb6, 0x63, 0x6c, 0xc2, 0x67, 0xd4, 0x2a, 0x0e, 0xae, 0x6a, 0x9e, + 0xda, 0x2b, 0x1b, 0x61, 0x4a, 0x95, 0x38, 0x00, 0x51, 0x84, 0xbd, 0x8d, + 0xd4, 0xa7, 0x6d, 0x54, 0x5b, 0xfd, 0x93, 0xb6, 0xfa, 0x63, 0x44, 0xef, + 0xa8, 0x3b, 0xfa, 0x84, 0xed, 0xaa, 0xab, 0xfc, 0xa0, 0x0b, 0xca, 0x02, + 0x31, 0xd4, 0xd3, 0x08, 0x71, 0xf0, 0xb8, 0x83, 0xca, 0xe2, 0x05, 0xc4, + 0x08, 0x55, 0x62, 0xe2, 0xb7, 0xda, 0xe2, 0x37, 0xda, 0xe2, 0x37, 0xda, + 0xbd, 0xbe, 0xd5, 0xed, 0xf6, 0xb8, 0x8d, 0xf6, 0xb8, 0xac, 0x5c, 0x66, + 0xae, 0x3f, 0xe9, 0x56, 0xda, 0xde, 0x0c, 0x35, 0x3a, 0xb5, 0x47, 0x6a, + 0x72, 0xb4, 0x54, 0xdf, 0x7b, 0x72, 0xc9, 0x0d, 0x12, 0x55, 0x4a, 0x97, + 0x9c, 0xda, 0x79, 0xee, 0x77, 0x8c, 0xa1, 0x83, 0x66, 0x65, 0xf5, 0x40, + 0x43, 0x3a, 0xa5, 0x26, 0x56, 0x10, 0xf5, 0xb4, 0x6c, 0x8f, 0xa3, 0xcc, + 0x73, 0x08, 0x38, 0xb4, 0xc8, 0x43, 0x6a, 0xab, 0xed, 0x7c, 0xaa, 0x9e, + 0xd7, 0xc9, 0xa9, 0xed, 0x7c, 0x8a, 0x9e, 0xd0, 0xda, 0x2a, 0x0f, 0x2b, + 0xe6, 0x55, 0xf6, 0xbe, 0x6d, 0x6f, 0x6b, 0xe7, 0x56, 0xf6, 0xbe, 0x6d, + 0x6f, 0x6b, 0xe6, 0xd6, 0xf6, 0xbe, 0x5d, 0x6f, 0xf2, 0x4e, 0xad, 0x51, + 0xfd, 0x47, 0x0b, 0x5a, 0x5c, 0x80, 0xb4, 0x64, 0x55, 0xec, 0x9e, 0xeb, + 0x44, 0xa2, 0x67, 0x32, 0x9b, 0xec, 0x39, 0x44, 0x86, 0x89, 0x2a, 0xa3, + 0xcb, 0xce, 0x75, 0x3d, 0x33, 0x9c, 0xe8, 0xcc, 0x69, 0xe5, 0xbf, 0xe9, + 0xf4, 0xf9, 0x97, 0xa1, 0x9f, 0xaa, 0xda, 0x36, 0x06, 0xbb, 0xee, 0xa7, + 0xc9, 0x3d, 0x8e, 0xa6, 0x61, 0xc3, 0x7c, 0xe6, 0x32, 0x9d, 0xc8, 0x00, + 0x34, 0xc9, 0x71, 0x93, 0x8a, 0x73, 0x2b, 0x3e, 0xe3, 0x03, 0x3a, 0x85, + 0x4f, 0xea, 0x72, 0x1e, 0xf0, 0xcd, 0x53, 0xde, 0x5e, 0x73, 0xe9, 0x1f, + 0x19, 0xae, 0x74, 0x66, 0xb3, 0x5d, 0xfb, 0x25, 0x3e, 0x1d, 0x20, 0x3b, + 0x2a, 0x94, 0x99, 0x54, 0x43, 0x82, 0xad, 0xb0, 0x39, 0xbc, 0xe9, 0xf3, + 0x44, 0x11, 0xc8, 0xe5, 0x81, 0x29, 0x94, 0xa3, 0x5c, 0xa7, 0x18, 0x1d, + 0x95, 0x57, 0xda, 0x3b, 0x0a, 0x55, 0xa7, 0x93, 0xb1, 0x3e, 0xbf, 0x86, + 0xa2, 0x67, 0x5e, 0xc2, 0x99, 0x87, 0x66, 0x39, 0xfe, 0xb3, 0x82, 0xd5, + 0x6c, 0xf4, 0xb8, 0xb5, 0x00, 0x40, 0x76, 0x95, 0x76, 0x7a, 0x75, 0x7a, + 0x82, 0xab, 0xf4, 0xf7, 0x37, 0x9b, 0x39, 0xa7, 0x31, 0xcc, 0xe4, 0xe1, + 0x90, 0xda, 0x44, 0xea, 0x83, 0x43, 0x74, 0xcb, 0xaa, 0x7b, 0x17, 0x1b, + 0x44, 0x94, 0xe7, 0x5c, 0x64, 0xf6, 0x34, 0xeb, 0xc7, 0x27, 0x20, 0x41, + 0xe6, 0x37, 0x3e, 0xa8, 0x62, 0x7d, 0x42, 0xfd, 0x7b, 0x29, 0x40, 0xc8, + 0xc9, 0x26, 0x11, 0x74, 0xf6, 0x0c, 0x3e, 0x16, 0xc5, 0x47, 0x86, 0xc9, + 0x3a, 0x9e, 0xdd, 0xcc, 0x6b, 0x84, 0x10, 0xaa, 0x7d, 0x3e, 0x9b, 0xba, + 0x79, 0x27, 0xec, 0x15, 0x5b, 0xa7, 0x34, 0xe6, 0x39, 0x9d, 0x43, 0x70, + 0x63, 0x8a, 0x14, 0x7d, 0xa0, 0xd0, 0xdd, 0x33, 0x6a, 0x1e, 0x7d, 0x8d, + 0x47, 0xdd, 0xd9, 0xb5, 0xe5, 0x9a, 0x27, 0x56, 0x2e, 0xed, 0x68, 0xbb, + 0xc6, 0x39, 0x45, 0xfe, 0x94, 0xcf, 0x63, 0xb0, 0x6c, 0xfc, 0x57, 0xde, + 0xed, 0x02, 0x1d, 0xc1, 0x7b, 0x5b, 0xa9, 0x4e, 0xda, 0x58, 0x34, 0x4f, + 0xda, 0x0b, 0xb9, 0x42, 0x81, 0xae, 0x79, 0x47, 0x5e, 0xc2, 0xa5, 0x4b, + 0xb9, 0x0f, 0xc5, 0x34, 0xda, 0x65, 0x34, 0xdc, 0x27, 0x04, 0x80, 0x8b, + 0xfd, 0x29, 0x9e, 0xca, 0x95, 0x33, 0x55, 0xc1, 0x8d, 0x54, 0x69, 0x0a, + 0x4c, 0x0d, 0x1d, 0xbb, 0xf6, 0xa6, 0xb7, 0xa5, 0x3e, 0xb3, 0xdf, 0xaa, + 0x9e, 0xca, 0xa1, 0x81, 0x9f, 0x30, 0xaa, 0x54, 0xbb, 0x90, 0xfc, 0x65, + 0x37, 0xda, 0xae, 0x08, 0xbd, 0x17, 0x13, 0xda, 0xec, 0x1b, 0x37, 0x09, + 0xb7, 0xbb, 0x53, 0xdc, 0x56, 0xd9, 0xc3, 0xf9, 0x8d, 0x53, 0x9a, 0x5a, + 0x60, 0xf6, 0x6e, 0x32, 0x73, 0x89, 0x84, 0xf7, 0x97, 0x66, 0x70, 0x1c, + 0x8d, 0x27, 0x0f, 0x0a, 0x3b, 0xcb, 0x08, 0xd7, 0x03, 0x6e, 0x1d, 0xac, + 0x4a, 0xd8, 0xf6, 0x13, 0xd7, 0x55, 0x01, 0xdb, 0xca, 0x95, 0x52, 0x9b, + 0x6a, 0x6a, 0xaa, 0x6c, 0xee, 0x66, 0x9d, 0x8b, 0xdf, 0xe0, 0x66, 0x92, + 0x06, 0xbb, 0xdc, 0xc6, 0xbb, 0x54, 0xed, 0x9f, 0xd2, 0x34, 0xdc, 0xdd, + 0x72, 0x03, 0x49, 0xd1, 0x70, 0x9c, 0x87, 0x24, 0xf6, 0x82, 0x88, 0x3d, + 0xa0, 0x2a, 0x7f, 0x4a, 0x47, 0xa5, 0x23, 0xd2, 0xe4, 0xb9, 0x26, 0xd1, + 0x9d, 0x50, 0x60, 0x6e, 0x89, 0xcd, 0x5c, 0x35, 0x62, 0xb1, 0x58, 0x15, + 0xa1, 0x5a, 0x15, 0xa1, 0x43, 0x55, 0xa1, 0x16, 0x85, 0x03, 0x36, 0x8e, + 0xcd, 0x52, 0xb7, 0x48, 0x5b, 0x3e, 0xc4, 0xca, 0x3c, 0xf5, 0x28, 0x0e, + 0xea, 0x51, 0x30, 0x15, 0x6a, 0xe0, 0x98, 0xb6, 0x0a, 0x2e, 0x71, 0x5f, + 0x72, 0xb8, 0xfb, 0x42, 0xa4, 0x6a, 0x50, 0xaa, 0x3d, 0xa0, 0xf0, 0x54, + 0xe4, 0x3d, 0xfe, 0x06, 0x61, 0x7b, 0x5b, 0xaa, 0x75, 0x7f, 0x48, 0xb8, + 0x9d, 0x55, 0x07, 0xdc, 0x2d, 0x38, 0x4b, 0x1a, 0x75, 0x46, 0x80, 0xf0, + 0x8d, 0x07, 0x78, 0x46, 0x9b, 0x87, 0x85, 0x0a, 0x15, 0x36, 0x0f, 0x2b, + 0xff, 0x00, 0x9b, 0xa0, 0xa8, 0x72, 0xb4, 0x94, 0x69, 0x2e, 0x0a, 0x34, + 0x0a, 0x34, 0xdc, 0x3b, 0x60, 0x48, 0xd1, 0x36, 0xb3, 0x94, 0xce, 0xe8, + 0x51, 0x86, 0x14, 0x23, 0x28, 0xce, 0x50, 0x04, 0xe8, 0xa9, 0xec, 0x35, + 0xaa, 0x78, 0x85, 0x47, 0xe9, 0xd4, 0xd9, 0xcd, 0xdc, 0xd0, 0x68, 0x1d, + 0xed, 0x4a, 0xd4, 0xe9, 0xea, 0x55, 0x5a, 0x8c, 0xab, 0xe1, 0x39, 0xde, + 0x95, 0x84, 0xea, 0xac, 0x56, 0x2b, 0x14, 0x20, 0x61, 0x71, 0x17, 0x11, + 0x71, 0x4f, 0x84, 0x2a, 0x9f, 0x2b, 0x88, 0x15, 0xe1, 0x17, 0x17, 0x72, + 0x0a, 0xc2, 0xa1, 0x42, 0xb5, 0x5b, 0x80, 0xb8, 0x04, 0x6a, 0xb4, 0x23, + 0x5f, 0xd0, 0x46, 0xa3, 0x8e, 0x06, 0x9b, 0x4c, 0xa6, 0xba, 0xf1, 0x39, + 0x10, 0xad, 0x0a, 0xd5, 0x0a, 0x31, 0xc2, 0x2d, 0x05, 0x1a, 0x4d, 0x46, + 0x80, 0x46, 0x81, 0xf0, 0x8d, 0x37, 0x05, 0x19, 0xb0, 0x55, 0x8e, 0xf4, + 0xb8, 0x6f, 0xf4, 0xb8, 0x2f, 0xf4, 0x85, 0x22, 0x35, 0x40, 0x65, 0xc2, + 0x2c, 0x45, 0x87, 0x15, 0x2d, 0x98, 0x54, 0xd5, 0xe0, 0x2a, 0x7f, 0x4e, + 0xa3, 0xe4, 0xca, 0xa7, 0x42, 0x9d, 0x3e, 0x90, 0xa3, 0xb9, 0xfb, 0xa7, + 0x5d, 0xc5, 0xed, 0x6e, 0xa5, 0x3b, 0x6d, 0xa2, 0xdf, 0x28, 0xed, 0xaf, + 0x77, 0x43, 0x53, 0x9f, 0x51, 0xfd, 0x6e, 0x4f, 0x20, 0x68, 0xaf, 0x2a, + 0x4a, 0x97, 0x29, 0x72, 0xfb, 0x97, 0x35, 0x0a, 0x02, 0x81, 0xbe, 0x77, + 0x04, 0x1e, 0xa7, 0x7c, 0x84, 0x5c, 0xa5, 0x55, 0xa9, 0x1c, 0x82, 0x2e, + 0x27, 0x26, 0x9b, 0xad, 0x28, 0x7d, 0xdd, 0xc1, 0x68, 0x28, 0xd0, 0x69, + 0x46, 0x81, 0xf0, 0x8d, 0x37, 0x0f, 0x0a, 0x23, 0x73, 0x69, 0xb9, 0xc8, + 0x51, 0x1e, 0x57, 0x09, 0xbe, 0x97, 0x0d, 0xbe, 0x95, 0xad, 0x1e, 0x14, + 0x63, 0x21, 0x44, 0xa8, 0x50, 0xa3, 0x1c, 0x6f, 0x2d, 0x0e, 0x08, 0x88, + 0xc2, 0x1e, 0xe6, 0xe8, 0x53, 0x76, 0xba, 0xcd, 0xd1, 0xc9, 0xbf, 0x51, + 0xae, 0x13, 0x7e, 0xa6, 0xff, 0x00, 0x2d, 0x43, 0xea, 0x4d, 0xf2, 0xd5, + 0xff, 0x00, 0x21, 0x49, 0x1f, 0xa9, 0x37, 0xc3, 0x51, 0xfa, 0x8b, 0xfc, + 0x04, 0x7e, 0xa1, 0x55, 0x7c, 0xea, 0xde, 0xd7, 0xcd, 0xad, 0xed, 0x7c, + 0xea, 0xde, 0xd7, 0xcf, 0xad, 0xed, 0x7c, 0xfa, 0xcb, 0xe7, 0xd6, 0x5f, + 0xf2, 0x15, 0x97, 0xfc, 0x85, 0x55, 0xff, 0x00, 0x21, 0x55, 0x7c, 0xaa, + 0xbe, 0xd7, 0xca, 0xab, 0xed, 0x7c, 0x9a, 0x9f, 0xe4, 0xbe, 0x43, 0xff, + 0x00, 0xc8, 0xae, 0x2b, 0x8f, 0xf6, 0x2a, 0x86, 0xda, 0xd6, 0xb6, 0x1e, + 0xbe, 0x6d, 0x1f, 0x68, 0xfd, 0x41, 0x83, 0x40, 0x9d, 0xf5, 0x23, 0xe1, + 0xa9, 0xdf, 0x50, 0xac, 0x74, 0x47, 0x68, 0xad, 0x53, 0xfb, 0x2f, 0xb7, + 0xfb, 0x19, 0x42, 0xab, 0x5b, 0xd2, 0x11, 0xae, 0x51, 0xa9, 0x2a, 0xe9, + 0x52, 0x54, 0x38, 0xa2, 0x08, 0xd5, 0x4a, 0x9c, 0x7c, 0xf2, 0x0f, 0xe9, + 0x3d, 0xee, 0x1e, 0x11, 0xc6, 0x1a, 0x4e, 0x88, 0x50, 0x71, 0xd5, 0x0a, + 0x0d, 0x1a, 0xa0, 0xc0, 0x34, 0xef, 0x21, 0x40, 0x5c, 0x36, 0xfa, 0x51, + 0x98, 0x50, 0xca, 0x94, 0x08, 0x56, 0x85, 0x6f, 0xa4, 0xe6, 0x17, 0x2e, + 0x1a, 0xb0, 0x2b, 0x42, 0xb4, 0x28, 0x19, 0x77, 0x2b, 0x94, 0xa9, 0x52, + 0xae, 0x52, 0x55, 0xca, 0x70, 0xce, 0xee, 0x6a, 0x54, 0xee, 0xd5, 0x0a, + 0x6e, 0x28, 0x50, 0x3e, 0x55, 0x8c, 0x6e, 0xa8, 0xd5, 0x03, 0x40, 0x9d, + 0x51, 0xc7, 0x14, 0x28, 0x50, 0xa1, 0x14, 0x32, 0x4d, 0x36, 0x9f, 0x08, + 0xd0, 0x0b, 0xe3, 0xfe, 0xd7, 0xc7, 0xfd, 0xaf, 0x8f, 0xfb, 0x42, 0x83, + 0x50, 0x63, 0x42, 0xe4, 0xb9, 0x7e, 0x02, 0x54, 0xef, 0x8c, 0x92, 0x86, + 0x09, 0x53, 0x8a, 0x0a, 0x82, 0xa4, 0xab, 0xd7, 0x11, 0x5c, 0x3d, 0x2b, + 0x9b, 0xe9, 0x5c, 0xdf, 0x4a, 0xec, 0x13, 0x83, 0x4d, 0xd0, 0xad, 0x56, + 0xa8, 0x2a, 0x0a, 0xb4, 0xab, 0x4a, 0xb4, 0xab, 0x55, 0xbb, 0xa1, 0x42, + 0x6c, 0x79, 0x5f, 0xf5, 0x28, 0xa6, 0xad, 0x6f, 0xb5, 0x0d, 0xf6, 0xbe, + 0xc5, 0x7b, 0x02, 0xe3, 0x00, 0xb8, 0xe5, 0x1a, 0xae, 0x57, 0x12, 0xa7, + 0x0c, 0x62, 0x28, 0x66, 0x72, 0x52, 0x17, 0x25, 0x0a, 0x3b, 0x89, 0x53, + 0xbb, 0xff, 0x00, 0x57, 0xfe, 0xee, 0x80, 0xa0, 0x76, 0x03, 0x32, 0x55, + 0xca, 0xe5, 0x21, 0x48, 0x5c, 0x97, 0x25, 0xc9, 0x40, 0x50, 0xa1, 0x42, + 0xb5, 0x42, 0xb5, 0x5a, 0xad, 0x2a, 0xd2, 0xa0, 0xab, 0x4a, 0xb4, 0xab, + 0x4a, 0xb4, 0xab, 0x4a, 0xb4, 0xab, 0x4a, 0xb4, 0xab, 0x4a, 0xb5, 0x5a, + 0xad, 0x50, 0xa1, 0x72, 0x5c, 0xb2, 0xe5, 0x4f, 0x65, 0x38, 0xa5, 0x73, + 0x52, 0x54, 0xa9, 0x53, 0xf8, 0x49, 0x53, 0x9b, 0x0a, 0x14, 0x28, 0x50, + 0xa1, 0x42, 0x85, 0x0a, 0x14, 0x6f, 0x85, 0x18, 0x23, 0x32, 0x37, 0x42, + 0x85, 0x1b, 0xa1, 0x42, 0x85, 0x0a, 0x14, 0x28, 0x50, 0xa1, 0x42, 0x8c, + 0xe9, 0xef, 0x3f, 0xff, 0xc4, 0x00, 0x38, 0x11, 0x00, 0x01, 0x03, 0x01, + 0x06, 0x04, 0x04, 0x05, 0x03, 0x04, 0x02, 0x03, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x11, 0x03, 0x04, 0x10, 0x12, 0x20, 0x21, 0x31, 0x13, + 0x30, 0x41, 0x51, 0x05, 0x32, 0x40, 0x52, 0x14, 0x22, 0x33, 0x42, 0x61, + 0x15, 0x50, 0x71, 0x23, 0x60, 0x81, 0xa1, 0x62, 0x91, 0x24, 0xb1, 0xf0, + 0xd1, 0xff, 0xda, 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, 0x3f, 0x01, 0xfd, + 0xd6, 0x14, 0x28, 0x50, 0xa1, 0x42, 0x85, 0x0a, 0x14, 0x2a, 0x95, 0xdb, + 0x4f, 0x75, 0xf1, 0xf4, 0x97, 0xc7, 0xd2, 0x4e, 0xf1, 0x11, 0xd0, 0x2f, + 0xd4, 0x5d, 0xd0, 0x23, 0x6f, 0xab, 0xd9, 0x7c, 0x75, 0x72, 0x8d, 0xb2, + 0xbf, 0x75, 0xf1, 0x76, 0x8e, 0xeb, 0xe2, 0xad, 0x1e, 0xe5, 0xf1, 0x36, + 0x8f, 0x72, 0xf8, 0x8a, 0xfe, 0xe5, 0xf1, 0x35, 0xbd, 0xcb, 0x8d, 0x5b, + 0xdc, 0xb8, 0xd5, 0x7d, 0xc5, 0x71, 0xaa, 0xfb, 0x8a, 0xe3, 0x55, 0xf7, + 0x7f, 0xb5, 0xc5, 0xab, 0xee, 0xff, 0x00, 0x6b, 0x8d, 0x57, 0xdd, 0xfe, + 0xd7, 0x1e, 0xa7, 0xb9, 0x71, 0x9f, 0xee, 0x5c, 0x7a, 0x9d, 0xd7, 0x1d, + 0xfd, 0xd7, 0x1d, 0xdd, 0xd7, 0x19, 0xfd, 0xca, 0xe2, 0xbf, 0xba, 0xe2, + 0xbf, 0xba, 0xe2, 0xd4, 0xee, 0xb8, 0xcf, 0xee, 0xb8, 0xb5, 0x3b, 0xae, + 0x35, 0x4e, 0xeb, 0x8d, 0x53, 0xba, 0xe2, 0xd4, 0xee, 0xb8, 0xaf, 0xef, + 0xff, 0x00, 0xb5, 0xc5, 0x7f, 0x75, 0xc5, 0x7f, 0x75, 0xc5, 0x7f, 0x75, + 0xc5, 0xa9, 0xdd, 0x71, 0xaa, 0x77, 0x5c, 0x5a, 0x9d, 0xd7, 0x16, 0xa7, + 0xbb, 0xfd, 0xae, 0x2d, 0x4f, 0x72, 0xe2, 0xd4, 0xf7, 0x2e, 0x2b, 0xfd, + 0xc5, 0x71, 0x2a, 0x7b, 0x8a, 0xe2, 0x54, 0xf7, 0x2e, 0x2d, 0x4f, 0x71, + 0x5c, 0x5a, 0x9e, 0xe2, 0xb8, 0xb5, 0x3d, 0xc5, 0x71, 0xaa, 0xfb, 0x8a, + 0xe3, 0xd5, 0xf7, 0x2f, 0x88, 0xab, 0xee, 0x5f, 0x11, 0x57, 0xdc, 0xbe, + 0x22, 0xaf, 0xb9, 0x7c, 0x45, 0x5f, 0x72, 0xf8, 0x8a, 0xde, 0xe2, 0xbe, + 0x26, 0xb7, 0xb8, 0xaf, 0x8b, 0xae, 0x3e, 0xe5, 0xf1, 0x95, 0xc7, 0xdc, + 0xbe, 0x3a, 0xba, 0x1e, 0x21, 0x59, 0x7e, 0xa3, 0x53, 0xa8, 0x4d, 0xf1, + 0x2e, 0xed, 0x54, 0xad, 0x74, 0xea, 0x6c, 0xa5, 0x05, 0x0a, 0x0a, 0x82, + 0xa0, 0xa8, 0x2a, 0x14, 0x7e, 0xef, 0x2a, 0xd0, 0x58, 0x1b, 0x2e, 0x4f, + 0xd4, 0xc8, 0x5a, 0xf5, 0xb8, 0x1b, 0xf1, 0x77, 0x40, 0xcd, 0xd2, 0x8c, + 0x9b, 0xa5, 0x69, 0x9a, 0x14, 0x2c, 0x2b, 0x0a, 0x85, 0x0a, 0x2e, 0xdf, + 0xad, 0xe5, 0x40, 0x51, 0x76, 0x1b, 0xe2, 0xf8, 0x52, 0x2e, 0x8b, 0xf5, + 0x5a, 0xe5, 0x9b, 0xbf, 0x0a, 0x0a, 0x95, 0xba, 0x85, 0x06, 0xec, 0x25, + 0x00, 0xe0, 0xac, 0xb5, 0xcc, 0xe1, 0x72, 0xb2, 0xda, 0xe7, 0xe4, 0x72, + 0x1c, 0xb8, 0x50, 0x16, 0x10, 0xb0, 0x85, 0x80, 0x2c, 0x0b, 0x02, 0xc0, + 0x56, 0x13, 0xfb, 0x5d, 0x62, 0xcc, 0x30, 0xe2, 0x9c, 0x35, 0xd1, 0x60, + 0x58, 0x54, 0x77, 0x51, 0x0b, 0x09, 0x0b, 0x0f, 0x75, 0x84, 0xa0, 0xd5, + 0x17, 0x42, 0x82, 0xb5, 0x17, 0x42, 0x85, 0x85, 0x61, 0x50, 0xa1, 0x61, + 0x58, 0x54, 0x28, 0x50, 0xa2, 0xe8, 0x51, 0x17, 0x7f, 0x2b, 0x45, 0x01, + 0x10, 0x6e, 0x2a, 0x32, 0x41, 0x46, 0x14, 0x29, 0xbe, 0x09, 0xe8, 0xb0, + 0x3d, 0x70, 0x9c, 0x17, 0x0f, 0xf2, 0x85, 0x20, 0x0e, 0xe8, 0xd3, 0x6f, + 0x75, 0x81, 0x9d, 0x02, 0x86, 0x76, 0x50, 0x06, 0xb0, 0x83, 0xa1, 0x62, + 0xd5, 0x12, 0x56, 0x22, 0x16, 0x22, 0xa4, 0xa9, 0xee, 0xb1, 0x2e, 0xaa, + 0xc5, 0x5f, 0x88, 0xdc, 0x27, 0x7f, 0x4b, 0x01, 0x60, 0x58, 0x4a, 0x8f, + 0xd8, 0x61, 0x45, 0xd0, 0xa1, 0x56, 0xb2, 0x71, 0x5d, 0x8a, 0x57, 0xe9, + 0xff, 0x00, 0xf2, 0x5f, 0xa7, 0x0f, 0x72, 0xfd, 0x3d, 0xbd, 0xd7, 0xe9, + 0xec, 0xee, 0xbf, 0x4e, 0x6f, 0x75, 0xfa, 0x7b, 0x7b, 0xaf, 0xd3, 0x87, + 0x74, 0x7c, 0x3f, 0xfe, 0x4b, 0xf4, 0xe3, 0xdd, 0x7e, 0x9c, 0xfe, 0x85, + 0x7c, 0x05, 0x41, 0xb2, 0x36, 0x1a, 0xbd, 0x91, 0xb2, 0xd4, 0x1d, 0x11, + 0xa2, 0xe1, 0xd1, 0x60, 0x58, 0x61, 0x45, 0xd0, 0xa1, 0x42, 0x8f, 0x40, + 0x56, 0x15, 0x0a, 0x02, 0x85, 0xb2, 0x82, 0x57, 0x0d, 0x06, 0x34, 0x2f, + 0x97, 0xb2, 0xc4, 0x51, 0x37, 0xca, 0xd7, 0x24, 0xdd, 0xaa, 0x9b, 0xbf, + 0x19, 0x28, 0x55, 0xe1, 0x3f, 0x12, 0x69, 0x91, 0x23, 0xd4, 0x16, 0x28, + 0x8c, 0xb1, 0xfb, 0x71, 0x68, 0x28, 0xd0, 0xa6, 0x7a, 0x23, 0x64, 0xa4, + 0x76, 0x4e, 0xb1, 0x0e, 0x85, 0x3a, 0xc9, 0x50, 0x6c, 0x9d, 0x4d, 0xcd, + 0xdc, 0x64, 0x84, 0x42, 0x85, 0x08, 0x85, 0x0a, 0x14, 0x0b, 0xe2, 0xfd, + 0xae, 0xd1, 0x13, 0x70, 0x61, 0x76, 0xc8, 0x35, 0xa3, 0x75, 0xbd, 0xd0, + 0xa6, 0x16, 0xab, 0x45, 0xb5, 0xdb, 0xaf, 0xc2, 0xda, 0xe3, 0x7c, 0xad, + 0xd6, 0xeb, 0xa6, 0x4d, 0x55, 0x86, 0xa6, 0x3a, 0x71, 0xdb, 0xd4, 0xc4, + 0xa8, 0x8b, 0xe4, 0x2c, 0x41, 0x62, 0x0a, 0x42, 0x95, 0x3c, 0xd8, 0xfd, + 0x8a, 0x13, 0xa8, 0x31, 0xdd, 0x13, 0xec, 0x87, 0xed, 0x4e, 0xa6, 0xe6, + 0xef, 0xc8, 0x82, 0x82, 0x8b, 0xb6, 0x44, 0xa9, 0x5b, 0xde, 0xd6, 0x69, + 0x25, 0x49, 0xbb, 0xf3, 0x98, 0xdd, 0x11, 0x70, 0x51, 0xc9, 0x2a, 0x14, + 0x2f, 0x0e, 0xd8, 0x8f, 0x4d, 0x20, 0x2c, 0x61, 0x63, 0x58, 0x9c, 0x8e, + 0xbb, 0x95, 0x85, 0x61, 0x0a, 0x02, 0x80, 0xa0, 0x28, 0x0a, 0x02, 0x80, + 0xb0, 0x85, 0x84, 0x2c, 0x2b, 0x0a, 0x8f, 0xca, 0xd5, 0x6b, 0x76, 0x97, + 0x4f, 0xec, 0xe5, 0xa1, 0xdb, 0xaa, 0x96, 0x40, 0x7c, 0xaa, 0xa5, 0x27, + 0x53, 0x3a, 0xdf, 0x17, 0x14, 0x77, 0xc9, 0x0b, 0x0a, 0xc3, 0x2b, 0x83, + 0x53, 0xa0, 0x46, 0x9b, 0xc6, 0xe1, 0x31, 0x9f, 0x71, 0x5b, 0xef, 0xc9, + 0xd6, 0xe2, 0x2f, 0x28, 0x0b, 0xa1, 0x42, 0xc3, 0xd9, 0x61, 0x50, 0xa1, + 0x47, 0x65, 0xc2, 0x2b, 0x86, 0x55, 0x89, 0xb8, 0x5c, 0x7d, 0x14, 0xc2, + 0xc6, 0xb1, 0x1f, 0xec, 0x27, 0x34, 0x3b, 0x42, 0x9d, 0x62, 0x69, 0x3a, + 0x15, 0xf0, 0x0d, 0xf7, 0x2f, 0x81, 0xa7, 0xdc, 0xaf, 0x82, 0xa4, 0xbe, + 0x0a, 0x8f, 0x65, 0xf0, 0x36, 0x7f, 0x6a, 0xf8, 0x0b, 0x3f, 0xb7, 0xff, + 0x00, 0x6b, 0xe0, 0x2c, 0xfe, 0xdf, 0xfd, 0xaf, 0x81, 0xa1, 0xdb, 0xfd, + 0xaf, 0x80, 0xa1, 0xd9, 0x3a, 0xc1, 0x4c, 0x6c, 0x99, 0x46, 0x9b, 0x07, + 0xca, 0x16, 0x15, 0x0a, 0xad, 0x0a, 0x6e, 0x09, 0xcd, 0x8c, 0xfa, 0x5d, + 0x08, 0x28, 0x40, 0x2c, 0x2b, 0x02, 0x0c, 0x58, 0x16, 0x05, 0x81, 0x60, + 0x58, 0x16, 0x05, 0xc3, 0x5c, 0x25, 0xc4, 0x7f, 0x75, 0x89, 0xdd, 0xd0, + 0x71, 0x6e, 0xcb, 0x8c, 0xff, 0x00, 0xfe, 0x01, 0x71, 0x9f, 0xff, 0x00, + 0xc0, 0x21, 0x57, 0xb8, 0x5c, 0x51, 0xd5, 0xab, 0x88, 0xce, 0xca, 0x58, + 0x7a, 0xac, 0x3d, 0x8a, 0xc2, 0x79, 0x05, 0xeb, 0x11, 0x3f, 0xda, 0x2d, + 0x40, 0x23, 0x01, 0x18, 0x76, 0x85, 0x3a, 0xcd, 0x49, 0xdd, 0x13, 0xac, + 0x0d, 0x3e, 0x52, 0x9d, 0x61, 0xaa, 0xdd, 0xb5, 0x4e, 0xa4, 0xe6, 0x79, + 0x82, 0x8c, 0x91, 0x2a, 0x10, 0x0a, 0x10, 0x6a, 0xc2, 0x9b, 0x49, 0xce, + 0x3a, 0x21, 0x64, 0xa9, 0xd4, 0x21, 0x65, 0x1f, 0x73, 0x90, 0xb3, 0xd3, + 0x1f, 0x95, 0xc3, 0xa6, 0x3e, 0xd5, 0x85, 0xbd, 0x02, 0xd3, 0xb0, 0xff, + 0x00, 0xa0, 0xb1, 0x7e, 0x07, 0xfd, 0x05, 0x88, 0xf4, 0x5c, 0x47, 0xf7, + 0xe5, 0x07, 0x10, 0x9a, 0xe9, 0x58, 0x8a, 0x9f, 0xc2, 0xd1, 0x45, 0xc5, + 0xdd, 0x91, 0xd7, 0xfb, 0x4c, 0x6e, 0x53, 0xf7, 0x8c, 0xef, 0xb2, 0xd2, + 0x7f, 0x45, 0x53, 0xc3, 0xdd, 0xf6, 0x14, 0xfa, 0x4e, 0x61, 0x87, 0x05, + 0x0b, 0x0a, 0x0d, 0x4d, 0xa4, 0x5d, 0xa0, 0x4d, 0xb1, 0x3c, 0xf9, 0xb4, + 0x42, 0xcd, 0x4c, 0x6f, 0xaa, 0x0c, 0xa6, 0xdd, 0x9a, 0xb1, 0x1d, 0xbd, + 0x2b, 0x5d, 0x39, 0x09, 0x27, 0x7f, 0xed, 0x5a, 0x5a, 0xb9, 0x1d, 0x4f, + 0x24, 0xb4, 0x3b, 0x42, 0xaa, 0xd8, 0x5b, 0xbb, 0x34, 0x4c, 0xb1, 0xbb, + 0xee, 0xd1, 0x36, 0x85, 0x26, 0x7e, 0x56, 0x23, 0xb0, 0xf5, 0x4d, 0x32, + 0x3f, 0xb6, 0x29, 0x77, 0xe5, 0xb8, 0xfa, 0xd6, 0x18, 0xfe, 0xd7, 0x29, + 0x9a, 0x33, 0x92, 0x11, 0x47, 0xd6, 0x81, 0x71, 0xfd, 0xc2, 0x3f, 0x65, + 0x76, 0xcb, 0xec, 0xe4, 0x84, 0x51, 0xba, 0x14, 0x7a, 0x68, 0x50, 0xa1, + 0x42, 0x02, 0xe3, 0xfb, 0x44, 0x28, 0x51, 0xc8, 0x85, 0x1f, 0xb1, 0x3b, + 0x64, 0x76, 0x1c, 0x81, 0x71, 0x50, 0xb0, 0xa8, 0x50, 0xb0, 0xa8, 0x47, + 0xd1, 0x04, 0x02, 0x85, 0x85, 0x45, 0xe7, 0xfb, 0x55, 0xc9, 0xdc, 0x81, + 0xc8, 0x28, 0xfa, 0x20, 0x10, 0x19, 0x8f, 0xa6, 0x95, 0x3f, 0xb8, 0x4a, + 0x90, 0xb1, 0x2c, 0x4a, 0x56, 0x25, 0x89, 0x4a, 0x95, 0x39, 0x4a, 0x76, + 0xfc, 0x81, 0xc8, 0x28, 0xfa, 0x00, 0x10, 0x6a, 0x8f, 0x4c, 0x5c, 0xb5, + 0x5a, 0xa8, 0x2b, 0x55, 0x05, 0x61, 0x58, 0x56, 0x10, 0xb0, 0xa8, 0x2b, + 0xe6, 0x5f, 0x32, 0x92, 0xb1, 0x20, 0xe1, 0xca, 0x9e, 0x44, 0xa9, 0xf4, + 0x05, 0xc0, 0x6e, 0x8d, 0x7a, 0x63, 0xaa, 0xf8, 0x8a, 0x5d, 0xd0, 0xa8, + 0xd7, 0x6c, 0x6e, 0x85, 0x01, 0x40, 0x51, 0x9a, 0x14, 0x28, 0x5a, 0x84, + 0xd7, 0x8d, 0x8a, 0x2e, 0x81, 0x2b, 0x18, 0x71, 0x45, 0xe0, 0x9e, 0x55, + 0x5b, 0x65, 0x0a, 0x3e, 0x67, 0x27, 0x78, 0xc5, 0x11, 0xb0, 0x95, 0xfa, + 0xc8, 0xf6, 0x26, 0x78, 0xb3, 0x1d, 0xe6, 0x6a, 0xa5, 0x68, 0xa5, 0x5b, + 0xc8, 0x6e, 0x21, 0x11, 0xe8, 0x02, 0x6e, 0x69, 0xe6, 0x62, 0x0b, 0x12, + 0x92, 0xb5, 0x46, 0x7a, 0x21, 0xbf, 0x3f, 0x09, 0xec, 0xb0, 0xc2, 0xd5, + 0x4a, 0x04, 0x1c, 0xce, 0x70, 0x1b, 0x95, 0xc5, 0x60, 0xea, 0xb8, 0xdd, + 0x82, 0x35, 0x9d, 0xd9, 0x1a, 0x8f, 0xde, 0x54, 0xb8, 0xf5, 0x5a, 0xfe, + 0x56, 0x1f, 0xc2, 0xc0, 0xfe, 0x88, 0xb1, 0xe5, 0x70, 0xff, 0x00, 0x0b, + 0x86, 0x8b, 0x4b, 0x75, 0x92, 0x81, 0x7f, 0x47, 0x2c, 0x55, 0x47, 0x54, + 0x2a, 0xbf, 0xa8, 0x42, 0xd0, 0x3a, 0x84, 0x2b, 0x53, 0x3d, 0x54, 0xce, + 0xd9, 0x6a, 0x5a, 0xd8, 0xcd, 0x06, 0xa9, 0xf6, 0x9a, 0x8f, 0xea, 0x8b, + 0x8d, 0xe0, 0xaa, 0x76, 0xa7, 0x37, 0x47, 0x26, 0x54, 0x15, 0x04, 0x8e, + 0x6b, 0x9a, 0x80, 0xd2, 0x13, 0x58, 0x1a, 0x56, 0x16, 0x94, 0x69, 0x89, + 0xd1, 0x43, 0xc6, 0xc5, 0x63, 0x70, 0xdc, 0x21, 0x54, 0x75, 0x41, 0xe0, + 0xdc, 0x15, 0x7a, 0xe2, 0xce, 0xcc, 0x6e, 0x56, 0x8f, 0x10, 0xad, 0x5b, + 0x49, 0x80, 0x89, 0x9b, 0x82, 0x6a, 0x61, 0x23, 0x50, 0xac, 0xb6, 0xd2, + 0x4e, 0x0a, 0x97, 0x14, 0x79, 0x4d, 0x70, 0x76, 0xd7, 0x93, 0x1b, 0xa9, + 0x07, 0x64, 0x10, 0x11, 0xc8, 0x9c, 0xd8, 0x96, 0xb7, 0x68, 0xb1, 0x2c, + 0x48, 0xa6, 0xa9, 0x01, 0x37, 0x98, 0xd6, 0x62, 0x41, 0x8d, 0x19, 0x0d, + 0x30, 0x53, 0x9a, 0x5b, 0xbd, 0xd2, 0x83, 0xbb, 0xa3, 0x5d, 0x83, 0x44, + 0xea, 0xee, 0xec, 0x9d, 0x54, 0x9d, 0xca, 0x68, 0xc5, 0xb0, 0x41, 0xa7, + 0xba, 0xe1, 0x8e, 0xab, 0x0b, 0x79, 0x10, 0xab, 0xcc, 0x2a, 0x6d, 0xc2, + 0xdb, 0xe1, 0x60, 0x05, 0x70, 0xc7, 0x45, 0xfd, 0x46, 0xec, 0x57, 0x1d, + 0xcd, 0xf3, 0x04, 0x1f, 0x21, 0x54, 0x3f, 0x29, 0x47, 0x20, 0xbe, 0xca, + 0xe8, 0x7c, 0x73, 0x48, 0xf9, 0x90, 0xba, 0x25, 0x61, 0x85, 0x17, 0x6e, + 0xb0, 0x34, 0xac, 0x24, 0x79, 0x4a, 0xe2, 0x39, 0xbb, 0x85, 0xe2, 0x75, + 0x5a, 0xea, 0x1a, 0x5e, 0x10, 0x4d, 0x41, 0x33, 0x74, 0x13, 0x91, 0xe4, + 0x93, 0x87, 0x7c, 0xa6, 0x0f, 0x45, 0xf2, 0xaf, 0xe0, 0xa9, 0x7a, 0xc6, + 0x7a, 0x85, 0xc4, 0x0b, 0x10, 0x39, 0x06, 0xaa, 0x22, 0xf8, 0x58, 0x14, + 0x15, 0x85, 0x61, 0x44, 0x45, 0xe0, 0xa0, 0x75, 0x85, 0x50, 0x4b, 0x9a, + 0x9b, 0xcc, 0x66, 0xd9, 0xaa, 0xf9, 0x72, 0x40, 0x29, 0xd6, 0x79, 0xd5, + 0xa9, 0xcc, 0x75, 0x3f, 0x32, 0x6b, 0xa1, 0x03, 0x37, 0x8e, 0x43, 0xfe, + 0x67, 0x01, 0xca, 0x7f, 0x94, 0xde, 0x6e, 0x9b, 0xa5, 0x59, 0xbc, 0xe3, + 0x9a, 0xed, 0xd7, 0x4b, 0x86, 0x68, 0xef, 0x77, 0x89, 0xfd, 0x1c, 0x81, + 0x35, 0x35, 0x35, 0x07, 0xb4, 0x0d, 0x4a, 0x75, 0x40, 0x76, 0x50, 0xe5, + 0x07, 0xba, 0x8e, 0x48, 0x91, 0x93, 0x45, 0xa2, 0xc4, 0xa5, 0x68, 0x8b, + 0x42, 0x8e, 0xca, 0x5c, 0xb1, 0x9e, 0xa1, 0x35, 0xd2, 0x79, 0x2f, 0xde, + 0xe9, 0x53, 0x08, 0x03, 0xba, 0x76, 0xe8, 0x6d, 0xcc, 0x6e, 0xd9, 0xaa, + 0xf9, 0x73, 0x7f, 0x28, 0xd9, 0xc1, 0xf2, 0xa8, 0x34, 0xce, 0xab, 0x1b, + 0x7b, 0xae, 0x20, 0xe8, 0xb1, 0x1e, 0xcb, 0xe6, 0x85, 0xfd, 0x4f, 0xc2, + 0x8a, 0x9d, 0xd6, 0x17, 0xfb, 0x96, 0x17, 0x7b, 0x96, 0x17, 0xfb, 0x96, + 0x17, 0xfb, 0x90, 0x0f, 0xee, 0xbe, 0x75, 0x2f, 0xec, 0xb1, 0x9e, 0xc8, + 0x3e, 0x6e, 0x1b, 0xe4, 0x77, 0x94, 0xde, 0x6e, 0x17, 0x15, 0x67, 0x3f, + 0x38, 0xe6, 0xbd, 0x0d, 0xae, 0x08, 0xe7, 0xf1, 0x4f, 0xa4, 0x3f, 0x9c, + 0x81, 0x35, 0x35, 0x35, 0x35, 0xa0, 0x0d, 0x96, 0xaa, 0x39, 0x50, 0xa3, + 0x9a, 0xcd, 0xf9, 0x2e, 0x0a, 0x21, 0x61, 0x28, 0xb4, 0x9e, 0x88, 0x34, + 0x84, 0x77, 0xf4, 0x75, 0x76, 0xcb, 0x37, 0xe8, 0x74, 0x2b, 0x86, 0x3e, + 0xdc, 0xbd, 0x72, 0x1d, 0x02, 0x6e, 0xdc, 0xa7, 0x6d, 0x94, 0x5c, 0x55, + 0x0f, 0x38, 0xe6, 0xbf, 0x64, 0xd3, 0x7c, 0x67, 0xf1, 0x4f, 0xa4, 0x3f, + 0x9c, 0xa1, 0x35, 0x35, 0x31, 0xdf, 0x28, 0xe4, 0x45, 0xd1, 0xe8, 0x1b, + 0xbf, 0x24, 0x64, 0x2b, 0xaf, 0x30, 0x6f, 0x9e, 0xae, 0xd7, 0x1e, 0x44, + 0xce, 0xe8, 0xc8, 0x5a, 0xaf, 0x99, 0x09, 0xea, 0x8c, 0xf7, 0x47, 0xf9, + 0x51, 0xf9, 0xb8, 0x4a, 0x92, 0x80, 0xef, 0x97, 0x6b, 0xce, 0xd7, 0x9c, + 0x85, 0x52, 0xd1, 0xdc, 0xd7, 0xec, 0x9b, 0xca, 0xf1, 0x4f, 0xa4, 0x3f, + 0x94, 0x72, 0x04, 0xd4, 0xd5, 0x4b, 0xc8, 0x3d, 0x53, 0x39, 0xa5, 0x75, + 0xe6, 0x37, 0x7c, 0xf5, 0x79, 0x61, 0x10, 0x3a, 0x28, 0x50, 0xb5, 0x45, + 0xa4, 0xac, 0x2a, 0x14, 0x20, 0x23, 0x37, 0x5b, 0xca, 0x28, 0xe6, 0xa6, + 0x7e, 0x64, 0x36, 0xe6, 0x54, 0xd9, 0x0b, 0x81, 0xd7, 0x91, 0xe2, 0x9f, + 0x4c, 0x7f, 0x28, 0xde, 0x10, 0x4d, 0x41, 0x51, 0xfa, 0x6d, 0xf5, 0x4c, + 0xcc, 0x6f, 0x1e, 0x85, 0xbb, 0xe7, 0xab, 0xcc, 0x95, 0xa2, 0xc2, 0x16, + 0x10, 0xb0, 0x85, 0x80, 0x14, 0xe1, 0x01, 0x37, 0x64, 0x73, 0x1c, 0x87, + 0x74, 0x6e, 0x19, 0x1b, 0xe6, 0x4d, 0xd8, 0x73, 0x2a, 0x5e, 0x37, 0x47, + 0x7c, 0xfe, 0x29, 0xf4, 0xc7, 0xf2, 0x8d, 0xc2, 0xe0, 0x9a, 0x9a, 0xa8, + 0x7d, 0x26, 0xfa, 0xa6, 0x66, 0x37, 0x8f, 0x42, 0xcf, 0x36, 0x7a, 0xbd, + 0x39, 0x90, 0x86, 0xf9, 0x5f, 0xe5, 0x29, 0x9e, 0x54, 0x79, 0x4e, 0xdd, + 0x1c, 0xc3, 0x75, 0x4f, 0xca, 0x39, 0x95, 0x13, 0x76, 0xe5, 0x78, 0xa7, + 0xd3, 0x1f, 0xca, 0x76, 0x56, 0xa6, 0xab, 0x37, 0xd2, 0x6f, 0xaa, 0x6e, + 0x63, 0x9c, 0xf3, 0x69, 0xf9, 0xb3, 0xd5, 0xcc, 0x35, 0x47, 0x2c, 0xca, + 0x1b, 0x9c, 0xd4, 0xfc, 0xb9, 0xc0, 0x95, 0x02, 0xf7, 0xf9, 0x8a, 0x28, + 0xe6, 0xa5, 0xe4, 0x1c, 0xca, 0x89, 0xbc, 0xaf, 0x14, 0xfa, 0x43, 0xf9, + 0x47, 0x20, 0x4d, 0x4d, 0x56, 0x5f, 0xa2, 0xdf, 0x54, 0xdc, 0xc7, 0x39, + 0xd1, 0x75, 0xe6, 0x53, 0xdf, 0x3d, 0x5c, 0xc0, 0xc2, 0x99, 0xcc, 0xdd, + 0xf3, 0x37, 0xae, 0x76, 0x9b, 0x8e, 0xf7, 0x54, 0xf3, 0x14, 0x73, 0xd0, + 0xfa, 0x63, 0x98, 0xf4, 0x36, 0xe5, 0x78, 0xa7, 0xd2, 0x1f, 0xca, 0x28, + 0x64, 0x6a, 0x6a, 0xb2, 0x7d, 0x11, 0xea, 0x9b, 0x98, 0xde, 0x32, 0x39, + 0x37, 0x99, 0x4f, 0x7c, 0xf5, 0x77, 0xe6, 0xb3, 0xae, 0x61, 0xb9, 0xcd, + 0x08, 0xac, 0x46, 0xfa, 0xbe, 0x62, 0x8d, 0xc2, 0xe2, 0x54, 0xdd, 0x66, + 0xfa, 0x43, 0x99, 0x53, 0x56, 0xa1, 0xdf, 0x95, 0xe2, 0x9f, 0x48, 0x7f, + 0x29, 0xc8, 0x64, 0x6a, 0x6a, 0xb1, 0xfd, 0x11, 0xea, 0x9b, 0xb2, 0x39, + 0x4d, 0xe1, 0x1b, 0xdc, 0xb6, 0xe6, 0x53, 0xdf, 0x3d, 0x5d, 0xf9, 0xac, + 0xeb, 0x90, 0x68, 0x22, 0xe1, 0xe6, 0x3c, 0x83, 0x7d, 0x6f, 0x31, 0x46, + 0xf2, 0x51, 0x28, 0x09, 0xd9, 0x61, 0x2a, 0xc9, 0xf4, 0x87, 0x31, 0xfb, + 0x21, 0xca, 0xf1, 0x3f, 0xa3, 0xfe, 0x51, 0x42, 0xe1, 0x70, 0x4c, 0x56, + 0x3f, 0xa2, 0x3d, 0x53, 0x76, 0x47, 0x29, 0xc8, 0x6f, 0x2a, 0x34, 0x43, + 0x97, 0x4f, 0x3d, 0x5d, 0xf9, 0xac, 0xbf, 0xad, 0xe3, 0xcc, 0x73, 0x9b, + 0xc2, 0xad, 0xe7, 0x28, 0xdc, 0x74, 0x44, 0xa0, 0x25, 0x0d, 0x14, 0xab, + 0x27, 0xd2, 0x1c, 0xc7, 0x21, 0xca, 0xf1, 0x3f, 0xa3, 0xfe, 0x51, 0x43, + 0x20, 0x4c, 0x56, 0x2f, 0xa5, 0xea, 0x9b, 0xb2, 0x39, 0x4e, 0x72, 0x86, + 0xc9, 0xbc, 0xba, 0x59, 0xea, 0xef, 0xcd, 0x6e, 0xd7, 0xf5, 0xbf, 0xee, + 0x39, 0xcd, 0xe1, 0x57, 0xf3, 0x9b, 0xcd, 0xc0, 0x5c, 0x55, 0x9f, 0xe9, + 0x8e, 0x63, 0x90, 0xe5, 0x78, 0x97, 0xd1, 0x4e, 0xd1, 0x04, 0x2f, 0x09, + 0x8a, 0xc3, 0xf4, 0xbd, 0x50, 0xdb, 0x31, 0xce, 0x50, 0xd9, 0x0d, 0xf9, + 0x74, 0xb3, 0xd5, 0xdf, 0x9a, 0xdb, 0xfa, 0xdf, 0xf7, 0xf2, 0xed, 0x1e, + 0x73, 0x79, 0x42, 0xfe, 0xaa, 0x87, 0xd3, 0x1c, 0xce, 0xa8, 0x72, 0xbc, + 0x47, 0xe8, 0x23, 0x99, 0x8a, 0xc3, 0xf4, 0xbd, 0x57, 0x4c, 0xc6, 0xf9, + 0x52, 0xa5, 0x4a, 0x71, 0x4d, 0xdb, 0x99, 0x4b, 0x3d, 0x5d, 0xfd, 0x19, + 0xdc, 0x1e, 0x5d, 0xa7, 0xce, 0x6e, 0x39, 0x7a, 0xaa, 0x5e, 0x41, 0xcc, + 0xea, 0x87, 0x2b, 0xc4, 0x3e, 0x81, 0x45, 0x0c, 0x81, 0x35, 0x58, 0x3e, + 0x97, 0xaa, 0xe9, 0x98, 0xde, 0x6e, 0x95, 0x2a, 0x25, 0x44, 0x22, 0x86, + 0xdc, 0xaa, 0x59, 0xea, 0xef, 0xcd, 0x85, 0x0a, 0x14, 0x0b, 0xcf, 0x2e, + 0xd7, 0xe7, 0x28, 0xe7, 0x67, 0x94, 0x73, 0x02, 0x0a, 0x79, 0x36, 0xff, + 0x00, 0xa0, 0xe4, 0x77, 0x43, 0x28, 0x56, 0x0f, 0xa5, 0xfb, 0x01, 0x3a, + 0xdf, 0xbd, 0xd0, 0x16, 0x85, 0x0b, 0x8a, 0x6f, 0x2a, 0x96, 0x7a, 0x9b, + 0xf3, 0x0a, 0xe9, 0x98, 0xa1, 0xca, 0xb5, 0xf9, 0xd6, 0x8a, 0x06, 0x66, + 0xec, 0x39, 0x64, 0xc5, 0xdb, 0x29, 0x0d, 0xdd, 0x6f, 0xc8, 0xb6, 0xeb, + 0x41, 0xc8, 0x8d, 0x72, 0x42, 0x08, 0x2f, 0x0f, 0xfa, 0x67, 0xf6, 0x07, + 0x6e, 0xa1, 0x68, 0xa6, 0x36, 0x44, 0xad, 0x16, 0x99, 0x36, 0xe5, 0x52, + 0xcf, 0x53, 0x7e, 0x66, 0xfc, 0x8d, 0xb9, 0x56, 0xdf, 0x3d, 0xd3, 0x74, + 0xde, 0x10, 0xdb, 0x99, 0x21, 0x7f, 0x09, 0xce, 0xac, 0x7e, 0xd5, 0x4f, + 0x16, 0x1f, 0x9b, 0x74, 0xd3, 0x5e, 0x75, 0x88, 0x58, 0x8f, 0x65, 0xc6, + 0x1d, 0x74, 0x42, 0xa0, 0x3b, 0x29, 0xbe, 0xd5, 0xf4, 0x5c, 0xba, 0xe7, + 0xf0, 0xff, 0x00, 0xa6, 0x7d, 0x57, 0x4c, 0xce, 0xdd, 0x1d, 0x96, 0xd9, + 0xa6, 0xe3, 0xa8, 0x4d, 0x77, 0x26, 0x96, 0xd9, 0xea, 0x6f, 0xeb, 0xad, + 0xde, 0x61, 0x9c, 0x14, 0xdd, 0x87, 0xa1, 0xc6, 0x5a, 0xfc, 0x2f, 0xeb, + 0xb5, 0xc6, 0x9b, 0x0e, 0xe1, 0x70, 0x1b, 0xf6, 0x92, 0x10, 0x65, 0x41, + 0xf7, 0x2f, 0xe5, 0x5a, 0x7e, 0x93, 0x97, 0x5c, 0xc1, 0x78, 0x7f, 0xd3, + 0x3c, 0xd2, 0x25, 0x47, 0x33, 0xa6, 0x67, 0x6f, 0xc9, 0xdd, 0x6b, 0xd5, + 0x3d, 0xbf, 0x30, 0x7c, 0xa1, 0x92, 0x72, 0x53, 0xdb, 0x3d, 0x4d, 0xf3, + 0x42, 0x8b, 0xa7, 0xd2, 0xdb, 0xc7, 0xcc, 0x11, 0x39, 0xd9, 0xe5, 0x1c, + 0xa7, 0x1e, 0x99, 0x45, 0xcf, 0x69, 0x23, 0xe5, 0xdd, 0x31, 0xf8, 0x86, + 0xfb, 0x5d, 0x37, 0xda, 0x7e, 0x8b, 0x97, 0x5c, 0xc1, 0x78, 0x77, 0xd3, + 0x3c, 0x88, 0xc8, 0x5d, 0x08, 0x19, 0xba, 0x16, 0x15, 0x1c, 0x9e, 0x99, + 0xf0, 0x85, 0x81, 0x34, 0x40, 0xba, 0x02, 0x81, 0x71, 0x12, 0xa9, 0xd3, + 0xc3, 0xad, 0xd5, 0xec, 0xed, 0xae, 0xdc, 0x0a, 0x8d, 0x96, 0xad, 0x0f, + 0x97, 0x14, 0x85, 0x85, 0xc8, 0xe8, 0xb1, 0x2d, 0x0e, 0x4a, 0x7e, 0x5c, + 0xf5, 0x37, 0xcb, 0x2a, 0xa5, 0x66, 0xd3, 0xf3, 0x14, 0x3c, 0x42, 0x91, + 0x30, 0x53, 0x6b, 0xd3, 0x7f, 0x95, 0xd7, 0x94, 0xe7, 0x48, 0x8a, 0x3a, + 0x9f, 0xce, 0x9f, 0xed, 0x02, 0xff, 0x00, 0xb8, 0x5f, 0xa7, 0x2e, 0x2f, + 0xf1, 0x0e, 0x9c, 0x8a, 0x5f, 0x4c, 0x67, 0x2f, 0x40, 0xdd, 0x19, 0x1f, + 0x6c, 0xa7, 0x4d, 0xd8, 0x0a, 0x0a, 0x13, 0xf6, 0x40, 0x83, 0x74, 0x15, + 0x81, 0x61, 0x0a, 0xd3, 0xf4, 0x5c, 0xb7, 0x39, 0xfc, 0x37, 0xe9, 0x9c, + 0xe3, 0x2c, 0x0e, 0xb9, 0xf0, 0xac, 0x2b, 0x0a, 0x8e, 0x76, 0x21, 0x91, + 0x90, 0x4e, 0x7c, 0x20, 0xac, 0x0d, 0xec, 0xb8, 0x6d, 0x5c, 0x20, 0xb8, + 0x41, 0x01, 0x03, 0x3e, 0x00, 0x75, 0x29, 0xd4, 0xbd, 0xab, 0x01, 0x09, + 0x94, 0xf1, 0x2e, 0x08, 0x5c, 0x27, 0x2b, 0x5b, 0x1c, 0xea, 0x84, 0x94, + 0x58, 0x6e, 0x6d, 0x7a, 0x8c, 0xf2, 0xb9, 0x37, 0xc4, 0x2b, 0x37, 0x7d, + 0x50, 0xf1, 0x33, 0xf7, 0x35, 0x36, 0xd0, 0xca, 0x12, 0xea, 0x44, 0x93, + 0xff, 0x00, 0x2d, 0x42, 0xa3, 0x6e, 0xa2, 0xea, 0x7f, 0xd4, 0x30, 0x53, + 0x6b, 0x53, 0x76, 0xce, 0x56, 0xeb, 0x63, 0xa8, 0x90, 0xda, 0x6b, 0xf5, + 0x3b, 0x40, 0xec, 0xbf, 0x55, 0xad, 0xd8, 0x26, 0xf8, 0xae, 0x9a, 0xb5, + 0x7e, 0xa9, 0xd9, 0xa9, 0xde, 0x23, 0x5c, 0xa7, 0xda, 0xab, 0x3f, 0x77, + 0x21, 0x55, 0xdd, 0xd5, 0x95, 0xcd, 0x75, 0x30, 0x5b, 0x71, 0x70, 0x08, + 0xd6, 0xa6, 0x37, 0x72, 0xf8, 0xba, 0x3b, 0x4a, 0x06, 0x75, 0xbb, 0xc4, + 0xbe, 0xdc, 0xe5, 0x59, 0xf5, 0xa4, 0xdb, 0xe5, 0x4a, 0x94, 0x54, 0x28, + 0x5b, 0x22, 0xf0, 0xdd, 0xca, 0x7d, 0xba, 0x9b, 0x36, 0xd5, 0x51, 0xb7, + 0x71, 0x1f, 0x85, 0xc2, 0x15, 0xae, 0xd3, 0xc1, 0x6c, 0x0d, 0xd1, 0x71, + 0x26, 0x55, 0x22, 0x70, 0x09, 0x55, 0x38, 0x76, 0xaf, 0x95, 0xaf, 0x88, + 0x55, 0xe8, 0xd7, 0xa2, 0x64, 0x99, 0x0a, 0xbd, 0x61, 0x54, 0x87, 0x34, + 0xaa, 0x56, 0xba, 0xd4, 0xb6, 0x29, 0x9e, 0x2b, 0xef, 0x6a, 0x6f, 0x88, + 0xd0, 0x76, 0xe6, 0x13, 0x6b, 0xd2, 0x7f, 0x95, 0xca, 0xd4, 0x7f, 0xa2, + 0xe4, 0x37, 0xcf, 0xe1, 0x9f, 0x48, 0xff, 0x00, 0x39, 0x1c, 0xf6, 0xb3, + 0x57, 0x15, 0x53, 0xc4, 0x28, 0x33, 0xac, 0xaa, 0xbe, 0x2a, 0xf3, 0xa5, + 0x31, 0x09, 0x9e, 0x23, 0x68, 0x61, 0x9c, 0x52, 0xac, 0x96, 0x9f, 0x89, + 0xa7, 0x8b, 0xae, 0x49, 0xe6, 0xc7, 0x2e, 0x2e, 0x0c, 0xee, 0xb0, 0x04, + 0x1a, 0x06, 0xde, 0x9b, 0x64, 0x2b, 0x02, 0x60, 0xdc, 0xfa, 0x2c, 0xa9, + 0xe6, 0x0a, 0xa7, 0x87, 0x35, 0xde, 0x55, 0x57, 0xc3, 0xde, 0xde, 0x89, + 0xd4, 0x4b, 0x56, 0x08, 0x50, 0xa1, 0x10, 0xa1, 0x42, 0x8b, 0xf4, 0x5a, + 0x2d, 0x16, 0x89, 0xb5, 0x1c, 0xdd, 0x8a, 0xe2, 0x38, 0xf5, 0x58, 0x94, + 0xa0, 0x60, 0xe8, 0xa9, 0xdb, 0x80, 0x10, 0xf4, 0xeb, 0x7b, 0x81, 0xf9, + 0x76, 0x56, 0x9b, 0x49, 0xae, 0x04, 0x8e, 0x45, 0x90, 0xcd, 0x16, 0xdf, + 0x21, 0x1a, 0xb4, 0xc6, 0xe5, 0x1b, 0x4d, 0x11, 0xf7, 0x23, 0x6e, 0xa2, + 0x13, 0xbc, 0x45, 0xbf, 0x6b, 0x53, 0xbc, 0x46, 0xa1, 0xd8, 0x23, 0x68, + 0xaf, 0x54, 0xc4, 0xa2, 0x29, 0xd9, 0x84, 0xd4, 0xf9, 0x9c, 0xb8, 0xf6, + 0x67, 0x7d, 0x46, 0x2c, 0x56, 0x2f, 0xca, 0x75, 0x0b, 0x3d, 0x51, 0x8c, + 0x94, 0xcb, 0x3d, 0x8b, 0xba, 0x11, 0x1a, 0x6c, 0x9e, 0x43, 0x6a, 0x1c, + 0x0a, 0x8f, 0x88, 0x54, 0x66, 0x8e, 0xd4, 0x2f, 0xfc, 0x4b, 0x57, 0xe0, + 0xaa, 0xbe, 0x1d, 0x55, 0xba, 0xb3, 0x54, 0xe6, 0xb9, 0x86, 0x1c, 0x2e, + 0x95, 0xc4, 0x7c, 0x40, 0x29, 0xa8, 0x65, 0x95, 0x64, 0xb7, 0xb6, 0xce, + 0xc2, 0xd8, 0x94, 0xef, 0x16, 0x77, 0x46, 0xaa, 0x9e, 0x29, 0x5f, 0xa4, + 0x27, 0x5b, 0xeb, 0xbf, 0x77, 0x27, 0x3c, 0xbb, 0x75, 0x25, 0x6a, 0xa5, + 0x78, 0x7d, 0xa7, 0x81, 0x57, 0x5d, 0x8e, 0x48, 0xba, 0x54, 0xfa, 0x18, + 0x51, 0x91, 0xba, 0x29, 0xf5, 0x26, 0x9b, 0x49, 0x94, 0x04, 0x5e, 0x53, + 0x98, 0x0e, 0x84, 0x27, 0x59, 0x69, 0x3b, 0xa2, 0x75, 0x81, 0xa7, 0xca, + 0x53, 0xac, 0x15, 0x06, 0xc9, 0xf6, 0x7a, 0x8d, 0xdc, 0x28, 0x85, 0xa2, + 0x9c, 0xbb, 0x29, 0xba, 0x54, 0x95, 0x2b, 0x12, 0x92, 0x9a, 0x51, 0x3c, + 0x86, 0xd5, 0xa8, 0xd1, 0x0d, 0x2b, 0x8d, 0x53, 0xa9, 0x58, 0x9c, 0x7a, + 0xa9, 0x2a, 0x54, 0xdf, 0x0a, 0x8b, 0x05, 0x9d, 0x9c, 0x47, 0xee, 0x9e, + 0xe7, 0x54, 0x76, 0x22, 0xb0, 0x92, 0xb0, 0x28, 0x46, 0x1b, 0xba, 0x75, + 0xa1, 0xe5, 0xb8, 0x01, 0xd2, 0xe9, 0x52, 0xa9, 0x5a, 0xea, 0xd2, 0xd8, + 0xaa, 0x76, 0x9a, 0x56, 0xbf, 0xe9, 0xd5, 0x1a, 0xab, 0x5d, 0x94, 0xd9, + 0x8e, 0x9b, 0x5d, 0x09, 0xa3, 0x33, 0x8a, 0x0e, 0x52, 0xa5, 0x10, 0x2e, + 0xd2, 0xfa, 0x06, 0x90, 0xa8, 0x38, 0xa3, 0x45, 0x4a, 0xbd, 0x32, 0x43, + 0x1a, 0xec, 0x90, 0xb0, 0xa8, 0xba, 0x54, 0xa9, 0xe6, 0xce, 0x79, 0x2b, + 0x1a, 0xc4, 0x14, 0xfa, 0xaa, 0x82, 0x1d, 0x96, 0xd8, 0x43, 0x68, 0xb8, + 0xc2, 0x74, 0x95, 0x28, 0x19, 0x5f, 0x2a, 0xd3, 0xba, 0x91, 0xdd, 0x48, + 0xee, 0x8c, 0x0e, 0xab, 0xf8, 0x52, 0x53, 0x1c, 0x1a, 0x7e, 0x61, 0x29, + 0xc3, 0x16, 0xaa, 0x22, 0xf7, 0x67, 0x21, 0x37, 0x90, 0xd7, 0xe0, 0x32, + 0xaa, 0x57, 0x75, 0x43, 0x25, 0x62, 0x40, 0xca, 0x2e, 0x84, 0x6a, 0x13, + 0xb2, 0x32, 0x75, 0x51, 0x7d, 0x2a, 0x26, 0xab, 0xf0, 0x35, 0x54, 0xb2, + 0xd6, 0xa3, 0xe6, 0x08, 0x15, 0x45, 0xed, 0xb6, 0xd0, 0xc0, 0xed, 0xd5, + 0x46, 0x9a, 0x4e, 0x2d, 0x72, 0x2e, 0x4d, 0xc8, 0x51, 0x74, 0x27, 0x39, + 0x35, 0xd2, 0xa7, 0x34, 0x20, 0x10, 0x96, 0x99, 0x0b, 0xc3, 0xed, 0xe5, + 0xee, 0xe1, 0x55, 0x3a, 0xe6, 0x22, 0x6f, 0x95, 0x2a, 0x54, 0xa9, 0x52, + 0xa4, 0x2c, 0x41, 0x62, 0x58, 0x96, 0x25, 0x2b, 0x75, 0x1c, 0xb6, 0xbf, + 0x0e, 0xeb, 0x88, 0x14, 0xcf, 0xa7, 0xaa, 0x34, 0xcb, 0xe2, 0x4f, 0xd9, + 0x88, 0x85, 0x0a, 0x14, 0x28, 0x5a, 0x28, 0x50, 0xa1, 0x45, 0xc3, 0x4d, + 0xd1, 0xb2, 0x54, 0x0d, 0xc4, 0xdd, 0x47, 0xe1, 0x19, 0x0a, 0x54, 0xcd, + 0xf0, 0xa2, 0x6f, 0x29, 0xb7, 0xce, 0x68, 0x29, 0xb4, 0x9c, 0xff, 0x00, + 0x28, 0x55, 0x29, 0x3e, 0x97, 0x9b, 0x34, 0x2f, 0x0e, 0x6c, 0xd5, 0x9b, + 0xaa, 0x59, 0x28, 0xd5, 0xf3, 0x35, 0x52, 0xb1, 0xfc, 0x3b, 0xf1, 0x53, + 0x3a, 0x2f, 0x12, 0xb3, 0x71, 0x1b, 0xc5, 0x66, 0xea, 0x08, 0x3a, 0xa0, + 0x2f, 0x26, 0x13, 0xaa, 0x00, 0x8d, 0x44, 0xe7, 0x2a, 0x68, 0x04, 0x2e, + 0x85, 0x0a, 0x2e, 0x6d, 0x2a, 0x8f, 0xf2, 0xb4, 0xa6, 0xf8, 0x75, 0xa5, + 0xff, 0x00, 0x6c, 0x26, 0xf8, 0x45, 0x66, 0xfc, 0xc1, 0xc2, 0x55, 0x3c, + 0x78, 0x7f, 0xa9, 0xbe, 0x62, 0x39, 0xa3, 0x55, 0xb7, 0x30, 0xdf, 0x88, + 0x85, 0xc4, 0x2b, 0x8a, 0xb8, 0xa1, 0x71, 0x1a, 0xb1, 0xb5, 0x4b, 0x54, + 0x8e, 0xea, 0x5b, 0xdd, 0x62, 0x6a, 0xc6, 0xd5, 0xc4, 0x6a, 0xe2, 0xa6, + 0x12, 0xed, 0x79, 0x2f, 0x12, 0xdc, 0xb6, 0xaa, 0x9c, 0x4a, 0x84, 0xa3, + 0x9b, 0xaa, 0x8b, 0xb6, 0xb8, 0xab, 0x35, 0xa9, 0xd6, 0x73, 0xf8, 0x43, + 0x83, 0x69, 0x6e, 0x28, 0x94, 0xff, 0x00, 0x0e, 0xa2, 0xed, 0xb4, 0x55, + 0x7c, 0x3f, 0x84, 0x0b, 0xc1, 0x58, 0x56, 0x15, 0x0a, 0x14, 0x5c, 0x5c, + 0x81, 0x53, 0x74, 0x42, 0x05, 0x36, 0x95, 0x47, 0x6c, 0x10, 0xb1, 0x56, + 0x77, 0x44, 0xdf, 0x0f, 0x7f, 0x52, 0x9b, 0xe1, 0xed, 0x1e, 0x62, 0x9b, + 0x66, 0xa4, 0xde, 0x8a, 0xad, 0x46, 0xd1, 0x6c, 0x95, 0x52, 0xab, 0xaa, + 0x3b, 0x11, 0x45, 0x12, 0x8d, 0xf2, 0xbc, 0x37, 0xce, 0x72, 0xbe, 0x8b, + 0x1f, 0xe6, 0x0a, 0xa5, 0x85, 0xd3, 0xf2, 0x21, 0x61, 0xa9, 0xd5, 0x3e, + 0xc1, 0x52, 0x3e, 0x52, 0x9f, 0xe1, 0xb6, 0xaf, 0xfe, 0x29, 0xde, 0x1f, + 0x6b, 0x1f, 0x62, 0x36, 0x2b, 0x5f, 0xb0, 0xa1, 0xe1, 0xd6, 0x87, 0x79, + 0x98, 0x53, 0x6c, 0x15, 0x87, 0xd8, 0x50, 0xb0, 0xd7, 0xf6, 0x14, 0x2c, + 0x16, 0x8f, 0x62, 0x1e, 0x1b, 0x69, 0x3d, 0x10, 0xf0, 0xaa, 0xdd, 0x48, + 0x4d, 0xf0, 0x8f, 0x73, 0xd5, 0x3f, 0x0a, 0xa0, 0xdd, 0xf5, 0x4c, 0xb3, + 0xd2, 0xa7, 0xe5, 0x6f, 0x2c, 0x88, 0xe5, 0xee, 0x80, 0x8e, 0x69, 0xe7, + 0xb1, 0x93, 0xa9, 0xe5, 0x14, 0x44, 0x5f, 0x5d, 0xfc, 0x3a, 0x65, 0xc8, + 0xf2, 0xc5, 0xdf, 0xc2, 0xa5, 0x59, 0xf4, 0x1d, 0x89, 0xaa, 0xcd, 0x6c, + 0x65, 0xa0, 0x76, 0x28, 0x80, 0x44, 0x14, 0x6c, 0xb4, 0xbb, 0x2f, 0x84, + 0xa5, 0xd9, 0x7c, 0x2d, 0x2e, 0xcb, 0xe1, 0xe9, 0x76, 0x46, 0xcf, 0x48, + 0xfd, 0xa8, 0xd8, 0xa8, 0x1e, 0x8b, 0xe0, 0x28, 0x76, 0x5f, 0x01, 0x43, + 0xb2, 0xf8, 0x1a, 0x1e, 0xd5, 0xf0, 0x54, 0x3d, 0xab, 0xe1, 0x68, 0xfb, + 0x53, 0x69, 0x53, 0x67, 0x94, 0x65, 0xad, 0x59, 0xb4, 0x5b, 0x2e, 0x56, + 0x8b, 0x43, 0xab, 0x3a, 0x4a, 0x95, 0x39, 0xbc, 0x2d, 0xba, 0x39, 0xd9, + 0xa1, 0x42, 0x85, 0x0a, 0x39, 0x23, 0x98, 0x44, 0xf2, 0xb7, 0x40, 0x47, + 0x38, 0xf3, 0x98, 0xcc, 0x5a, 0x9e, 0x65, 0x41, 0x06, 0x6f, 0xf1, 0x0a, + 0x90, 0xc0, 0xd4, 0x79, 0x73, 0x93, 0x65, 0x66, 0xf1, 0x22, 0xdf, 0x96, + 0xae, 0xa9, 0x95, 0x1b, 0x50, 0x4b, 0x4f, 0x3e, 0xd1, 0x6b, 0x6d, 0x2d, + 0x06, 0xea, 0xb5, 0x67, 0x55, 0x32, 0xec, 0x92, 0xa5, 0x4a, 0x94, 0x15, + 0x96, 0x9f, 0x0e, 0x90, 0x19, 0x80, 0x9e, 0x60, 0xe7, 0x11, 0xc8, 0x02, + 0x56, 0xdc, 0xf3, 0xcd, 0x63, 0x31, 0x2d, 0xb9, 0x95, 0x07, 0xcb, 0x7d, + 0xb1, 0xf8, 0xea, 0x94, 0x72, 0xce, 0x48, 0xce, 0x55, 0x3a, 0xd5, 0x28, + 0x3a, 0x58, 0x55, 0x9f, 0xc4, 0x98, 0xfd, 0x2a, 0x68, 0x81, 0x07, 0x51, + 0xcb, 0x73, 0x83, 0x44, 0x95, 0x69, 0xb7, 0xfd, 0xb4, 0xd3, 0x9f, 0x2a, + 0x56, 0xea, 0x51, 0x52, 0xa6, 0xfb, 0x2d, 0x3e, 0x25, 0x50, 0xd4, 0x3d, + 0x08, 0xf4, 0x04, 0x66, 0x0d, 0xf5, 0xad, 0xa5, 0xd5, 0xdc, 0xf7, 0x0c, + 0x26, 0x15, 0x6a, 0x9c, 0x36, 0x17, 0x22, 0x64, 0xa3, 0xe8, 0x61, 0x44, + 0x2a, 0x36, 0xaa, 0x94, 0x3c, 0xa5, 0x51, 0xf1, 0x3a, 0x6f, 0xd1, 0xfa, + 0x26, 0xbd, 0xaf, 0xd5, 0xa7, 0x39, 0x20, 0x6e, 0xab, 0xdb, 0xe9, 0xd3, + 0xd1, 0xba, 0x95, 0x5a, 0xd4, 0xfa, 0xdb, 0x94, 0x4c, 0xa3, 0x90, 0x9c, + 0xbe, 0x16, 0xcf, 0x98, 0xbb, 0xf6, 0x32, 0xdb, 0xc0, 0x95, 0x11, 0xe8, + 0xcf, 0x24, 0x02, 0x53, 0x19, 0x87, 0xd0, 0x55, 0x6c, 0x89, 0x56, 0xea, + 0xf8, 0xdd, 0x80, 0x6c, 0x39, 0xbb, 0xe6, 0x85, 0x08, 0x85, 0x10, 0x99, + 0x51, 0xf4, 0xcc, 0xb4, 0xaa, 0x5e, 0x27, 0x51, 0xba, 0x3f, 0x55, 0x4f, + 0xc4, 0x28, 0xbf, 0x7d, 0x13, 0x5e, 0xd7, 0xf9, 0x4d, 0xd5, 0x2d, 0x14, + 0xa9, 0x79, 0x9c, 0xaa, 0xf8, 0xa3, 0x46, 0x94, 0xc2, 0xab, 0x6b, 0xa9, + 0x54, 0xfc, 0xc5, 0x49, 0x39, 0x8d, 0xe2, 0xe0, 0xbc, 0x3a, 0x9e, 0x0a, + 0x53, 0xdf, 0xd0, 0x8f, 0x47, 0x12, 0xa3, 0xd2, 0x9c, 0xe0, 0x4a, 0x6d, + 0x2e, 0xe8, 0x08, 0xf4, 0x36, 0xfb, 0x4f, 0x01, 0x98, 0x46, 0xe5, 0x3b, + 0x7c, 0xda, 0x64, 0x8c, 0xba, 0xe4, 0xde, 0xed, 0xd4, 0x28, 0x47, 0x45, + 0x88, 0x26, 0xd5, 0x2d, 0xf2, 0xa7, 0x5a, 0xeb, 0x3b, 0x42, 0xe4, 0x5d, + 0x3b, 0xa9, 0x53, 0x70, 0xcd, 0xbe, 0x46, 0x37, 0x1b, 0x80, 0x0a, 0x9b, + 0x70, 0x34, 0x0f, 0x40, 0x07, 0xed, 0x67, 0x20, 0x69, 0x3b, 0x26, 0xd2, + 0xee, 0x80, 0x03, 0x6f, 0x45, 0x52, 0xa0, 0xa6, 0xd2, 0xe7, 0x2b, 0x4d, + 0x73, 0x5e, 0xa1, 0x71, 0xb8, 0xe6, 0x17, 0x42, 0x9c, 0xc2, 0xe9, 0x5b, + 0xdd, 0xba, 0x2f, 0x68, 0x4e, 0x79, 0x37, 0xc5, 0xd1, 0x7c, 0x5d, 0x0b, + 0x6d, 0xd4, 0x5e, 0x72, 0x78, 0x75, 0x1c, 0x4f, 0xc6, 0x7a, 0x7a, 0x08, + 0xfd, 0xb7, 0x09, 0x28, 0x52, 0x3d, 0x50, 0xa6, 0x07, 0xa5, 0xf1, 0x2b, + 0x56, 0x33, 0xc3, 0x6e, 0xc3, 0x29, 0xcd, 0x0b, 0xf3, 0x7e, 0xf7, 0x91, + 0x76, 0xe7, 0x23, 0x99, 0x8b, 0x65, 0xf8, 0xcd, 0xa5, 0xf0, 0xa3, 0x90, + 0xc6, 0xe2, 0x20, 0x05, 0x67, 0xa4, 0x28, 0xb3, 0x08, 0xf5, 0x78, 0x94, + 0xfa, 0xd9, 0xc8, 0xd9, 0x1e, 0x9a, 0xdb, 0xe2, 0x01, 0xa3, 0x05, 0x24, + 0x5d, 0x3e, 0x88, 0xa8, 0x50, 0xa1, 0x42, 0x85, 0x10, 0xb0, 0xce, 0x85, + 0x1a, 0x64, 0x6c, 0xb7, 0xba, 0x08, 0x42, 0xe1, 0x9c, 0xa8, 0xba, 0x25, + 0x58, 0x6c, 0x58, 0x3f, 0xa8, 0xfd, 0xf9, 0xa6, 0x50, 0xd6, 0xf9, 0x53, + 0xc9, 0x9b, 0xb6, 0xf5, 0x65, 0xca, 0x7b, 0xa1, 0x0b, 0x13, 0x7b, 0x2c, + 0x63, 0xb2, 0xe2, 0x2e, 0x29, 0x5c, 0x47, 0x2e, 0x23, 0x97, 0x11, 0xcb, + 0x1b, 0x96, 0x33, 0xdd, 0x07, 0x92, 0x81, 0x3c, 0xda, 0xd6, 0x9a, 0x74, + 0x04, 0xbc, 0xab, 0x57, 0x88, 0x3e, 0xbe, 0x8d, 0xd0, 0x29, 0x9c, 0x85, + 0x4c, 0xed, 0x76, 0xf7, 0x6d, 0x77, 0xe5, 0x4c, 0xdf, 0x39, 0x77, 0xb8, + 0x5d, 0x17, 0x04, 0xd6, 0x82, 0x75, 0x4d, 0xf0, 0xda, 0x6f, 0xf9, 0x89, + 0x4d, 0xb1, 0xd0, 0xa5, 0xd1, 0x7f, 0x4c, 0x88, 0x84, 0x28, 0x33, 0xd8, + 0x3f, 0xe9, 0x54, 0xb1, 0xb1, 0xde, 0x56, 0xb7, 0xfe, 0x95, 0x4f, 0x0e, + 0xa9, 0xf6, 0xb0, 0x7f, 0x83, 0xff, 0x00, 0xea, 0x7d, 0x8a, 0xbb, 0x37, + 0x6a, 0x34, 0xdc, 0xde, 0x8a, 0x2e, 0x37, 0x42, 0x2d, 0x28, 0x30, 0xb8, + 0xc0, 0x56, 0x4b, 0x0f, 0x0f, 0xe7, 0x7e, 0xea, 0x39, 0x91, 0x71, 0x18, + 0x4e, 0x59, 0x58, 0x96, 0x25, 0x37, 0x99, 0xe8, 0xa2, 0xe9, 0xbe, 0x54, + 0xac, 0x6a, 0x7d, 0x3e, 0x10, 0xa5, 0x4a, 0x90, 0xb4, 0xcd, 0x29, 0xb1, + 0x28, 0x41, 0xe5, 0x4c, 0x2a, 0xb6, 0xfa, 0x14, 0xba, 0xaa, 0xfe, 0x2a, + 0xf7, 0xe9, 0x4f, 0x44, 0xe7, 0xb9, 0xc6, 0x4e, 0x6d, 0x96, 0x9c, 0xad, + 0x54, 0x5c, 0x54, 0xa9, 0xcc, 0x27, 0xa2, 0xa7, 0x66, 0xab, 0x53, 0x60, + 0xa9, 0x52, 0x75, 0x0e, 0xab, 0xf9, 0x41, 0xed, 0x0b, 0x1a, 0xc4, 0xb1, + 0x14, 0x5c, 0xe5, 0x04, 0xa3, 0x41, 0xae, 0xdc, 0x2f, 0x82, 0xa2, 0x77, + 0x6a, 0xfd, 0x36, 0x81, 0xfb, 0x53, 0xfc, 0x2e, 0x84, 0x7c, 0xa5, 0x1f, + 0x0c, 0xf6, 0xb9, 0x7e, 0x9c, 0xfe, 0xea, 0x85, 0x89, 0xb6, 0x7d, 0x5d, + 0xba, 0xc4, 0xa6, 0xe9, 0x53, 0x74, 0x75, 0xbe, 0x14, 0x28, 0xc8, 0x44, + 0xf2, 0xa5, 0x4a, 0x95, 0x3c, 0x89, 0x58, 0x96, 0x25, 0x89, 0x4f, 0x3e, + 0x42, 0x90, 0xb1, 0x05, 0x39, 0x37, 0xe4, 0x62, 0x42, 0xa2, 0x0f, 0x07, + 0x35, 0x5a, 0xe6, 0x9e, 0xcc, 0x25, 0x56, 0xf1, 0x3a, 0xe3, 0x66, 0xc2, + 0xab, 0x6a, 0xad, 0x57, 0xcc, 0x51, 0x24, 0xdd, 0x0b, 0x7b, 0xf5, 0x28, + 0xa8, 0x85, 0xb5, 0xc5, 0x69, 0x7c, 0x14, 0x2e, 0xdd, 0x42, 0xd6, 0x14, + 0x2d, 0x45, 0xc3, 0x75, 0x2c, 0x23, 0x56, 0xa8, 0x4d, 0xa6, 0xf7, 0x79, + 0x42, 0x6d, 0x82, 0xab, 0xb7, 0x09, 0xbe, 0x1e, 0xc1, 0xab, 0xca, 0x6d, + 0x3a, 0x54, 0xfc, 0x8d, 0x42, 0x4e, 0xe8, 0xb4, 0x4c, 0xad, 0x14, 0x05, + 0xf2, 0xaf, 0x95, 0x48, 0x58, 0x96, 0x25, 0x88, 0xa9, 0x39, 0x70, 0xe5, + 0x8b, 0xa3, 0x4e, 0x53, 0x84, 0xa9, 0xf5, 0x12, 0xb1, 0x15, 0x89, 0x62, + 0x17, 0x92, 0xb1, 0x2c, 0x45, 0x4a, 0xc5, 0xc8, 0x1a, 0xac, 0x7d, 0x14, + 0xad, 0x39, 0x6c, 0x79, 0x08, 0x19, 0xca, 0x5a, 0x0e, 0xe9, 0xd6, 0x6a, + 0x2e, 0xdd, 0xa9, 0xde, 0x1b, 0x67, 0x3d, 0x13, 0xbc, 0x2a, 0x8f, 0x47, + 0x27, 0x78, 0x67, 0x67, 0xaf, 0xd3, 0x6a, 0x0d, 0x8a, 0x1e, 0x18, 0x7e, + 0xe7, 0x21, 0xe1, 0xd4, 0xc6, 0xe5, 0x0b, 0x0d, 0x1e, 0xcb, 0xe0, 0xa8, + 0x7b, 0x57, 0xc1, 0xd1, 0xf6, 0xaf, 0x82, 0xa1, 0xed, 0x5f, 0x03, 0x43, + 0xda, 0xbe, 0x06, 0x8f, 0x65, 0xf0, 0x14, 0x3b, 0x2f, 0x80, 0xa3, 0xd9, + 0x7e, 0x9f, 0x45, 0x7e, 0x9f, 0x43, 0xb2, 0xf8, 0x7a, 0x5e, 0xd5, 0xc0, + 0xa5, 0xed, 0x5c, 0x0a, 0x5e, 0xd5, 0xc1, 0xa7, 0xd9, 0x70, 0xdb, 0xd9, + 0x5a, 0x6c, 0x65, 0xe7, 0x13, 0x10, 0xb0, 0x55, 0x43, 0xc3, 0x9e, 0x77, + 0x28, 0x78, 0x6b, 0x7a, 0xb9, 0x36, 0xc1, 0x44, 0x26, 0xd9, 0xa9, 0xb7, + 0xca, 0xd5, 0xb6, 0xc8, 0x87, 0x1e, 0xab, 0x86, 0xb0, 0x20, 0x11, 0x52, + 0x16, 0x99, 0x64, 0x05, 0x37, 0x6c, 0x84, 0x66, 0xd5, 0x49, 0x52, 0x84, + 0x72, 0x24, 0x2c, 0x6b, 0x11, 0x44, 0xa8, 0xf5, 0xb2, 0xa5, 0x4a, 0x9b, + 0xa1, 0x68, 0xa7, 0x29, 0x43, 0x6c, 0xa0, 0xf2, 0x65, 0x36, 0xac, 0x2e, + 0x31, 0x5c, 0x57, 0x2e, 0x23, 0x96, 0x37, 0x2c, 0x4e, 0x52, 0x79, 0x18, + 0x94, 0xf7, 0x46, 0xa0, 0x58, 0xd6, 0x35, 0x8d, 0x71, 0x17, 0x11, 0x71, + 0x17, 0x10, 0x29, 0x53, 0x7e, 0xfb, 0x28, 0x39, 0x26, 0xfc, 0x6d, 0x08, + 0xd5, 0x1d, 0x10, 0x7b, 0x8e, 0xcb, 0x87, 0x3e, 0x62, 0x83, 0x00, 0xcb, + 0x17, 0x4a, 0x95, 0x37, 0x74, 0xcd, 0xa1, 0x58, 0x56, 0xa1, 0x62, 0x2b, + 0x88, 0xb1, 0xac, 0x4b, 0x12, 0xc4, 0xe5, 0xaf, 0xaf, 0x95, 0x2b, 0x55, + 0x05, 0x42, 0x85, 0xa2, 0x9c, 0xe4, 0xa0, 0x11, 0xbe, 0x14, 0x28, 0xcf, + 0x21, 0x68, 0xa0, 0x28, 0x58, 0x54, 0x28, 0x3d, 0xd3, 0xa8, 0x17, 0x7d, + 0xe5, 0x0b, 0x29, 0x1b, 0xbc, 0x9f, 0xf2, 0x9a, 0xc0, 0xdc, 0xe4, 0x4a, + 0x88, 0x4e, 0x64, 0xae, 0x11, 0x58, 0x1e, 0xb0, 0xbf, 0xb2, 0xc2, 0xfe, + 0xcb, 0x03, 0xbb, 0x2e, 0x1b, 0xbb, 0x2e, 0x1b, 0xca, 0x14, 0x4a, 0x6b, + 0x21, 0x45, 0xf6, 0x96, 0x54, 0x78, 0xfe, 0x91, 0x82, 0x85, 0x0f, 0x10, + 0xea, 0xf5, 0x41, 0x96, 0xaa, 0x67, 0xfa, 0x8f, 0x94, 0x5e, 0x4f, 0x45, + 0xaa, 0xf9, 0x96, 0x17, 0x2e, 0x19, 0x5c, 0x25, 0xc3, 0x6a, 0xc2, 0x2f, + 0x85, 0x1c, 0x90, 0x88, 0x84, 0x0e, 0x69, 0x5a, 0x28, 0x0b, 0x0a, 0xc2, + 0x54, 0x1b, 0xa5, 0x4a, 0x9f, 0x4f, 0x0b, 0x45, 0xa2, 0xd1, 0x68, 0xa4, + 0x76, 0x52, 0xa4, 0xa9, 0xe4, 0xca, 0x95, 0xa9, 0x41, 0xb7, 0x13, 0x78, + 0x2a, 0x79, 0x10, 0xa1, 0x42, 0x85, 0x05, 0x41, 0x5a, 0xad, 0x54, 0xa9, + 0x52, 0xa5, 0x4a, 0x95, 0x2a, 0x54, 0x85, 0x21, 0x48, 0x52, 0x14, 0x85, + 0x21, 0x48, 0x52, 0x14, 0x85, 0x21, 0x48, 0x52, 0xb1, 0x2c, 0x4b, 0x12, + 0x95, 0x2a, 0x54, 0xf3, 0x61, 0x42, 0x81, 0x94, 0x15, 0xba, 0x2d, 0x5a, + 0x85, 0x3c, 0xad, 0x6f, 0xd1, 0x68, 0xa0, 0x28, 0x0a, 0x2f, 0xff, 0x00, + 0x3e, 0xa2, 0x54, 0xe4, 0x85, 0x03, 0xba, 0x80, 0xbe, 0x55, 0xf2, 0xa9, + 0x6a, 0xc4, 0x16, 0x35, 0x8b, 0x34, 0xa9, 0x58, 0x96, 0x25, 0x89, 0x62, + 0x58, 0x96, 0x20, 0xb1, 0x05, 0x88, 0x29, 0x0a, 0x42, 0x90, 0xa4, 0x29, + 0x0a, 0x42, 0x90, 0xa4, 0x29, 0x0b, 0x45, 0xa2, 0xd1, 0x68, 0xb4, 0x5a, + 0x2d, 0x16, 0x8b, 0x45, 0xa2, 0xd1, 0x68, 0xb4, 0x5a, 0x2d, 0x16, 0x8b, + 0x45, 0x21, 0x48, 0x52, 0x14, 0x85, 0x21, 0x48, 0x52, 0x14, 0x85, 0x21, + 0x48, 0x52, 0x16, 0x20, 0xb1, 0x05, 0x88, 0x2c, 0x41, 0x62, 0x58, 0x96, + 0x25, 0x89, 0x4a, 0x9c, 0xd8, 0x96, 0x35, 0x88, 0x29, 0x0b, 0xe5, 0x5a, + 0x2d, 0x3b, 0xaf, 0xf2, 0xbf, 0xcf, 0xa7, 0xff, 0xc4, 0x00, 0x44, 0x10, + 0x00, 0x01, 0x02, 0x03, 0x03, 0x08, 0x07, 0x05, 0x06, 0x04, 0x07, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x03, 0x11, 0x21, 0x20, 0x31, + 0x32, 0x10, 0x12, 0x22, 0x30, 0x41, 0x51, 0x71, 0x91, 0x04, 0x13, 0x33, + 0x40, 0x61, 0x81, 0xa1, 0x23, 0x42, 0x52, 0x62, 0x72, 0x34, 0x50, 0x82, + 0x92, 0xb1, 0xd1, 0x60, 0xa2, 0xc1, 0xe1, 0x14, 0x24, 0x43, 0x53, 0x63, + 0x93, 0xf0, 0x70, 0x83, 0xc2, 0xff, 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, + 0x06, 0x3f, 0x02, 0xfb, 0xfe, 0x8b, 0x62, 0xbc, 0x2a, 0xba, 0x4b, 0x19, + 0x5e, 0xf2, 0xb9, 0x61, 0x58, 0x16, 0x10, 0xb0, 0x05, 0x80, 0x72, 0x58, + 0x1b, 0xc9, 0x60, 0x6f, 0x25, 0x81, 0xbc, 0x96, 0x06, 0xf2, 0x58, 0x1b, + 0xc9, 0x61, 0x6f, 0x25, 0x84, 0x72, 0x58, 0x47, 0x25, 0x84, 0x72, 0x58, + 0x47, 0x25, 0x84, 0x72, 0x58, 0x47, 0x25, 0x84, 0x72, 0x58, 0x42, 0xc2, + 0x16, 0x10, 0xb0, 0x85, 0x84, 0x2c, 0x21, 0x61, 0x0b, 0x08, 0x58, 0x42, + 0xc2, 0x16, 0x10, 0xb0, 0x85, 0x84, 0x2c, 0x21, 0x61, 0x0b, 0x08, 0x58, + 0x42, 0xc2, 0x16, 0x10, 0xb0, 0x85, 0x84, 0x2c, 0x23, 0x92, 0xc2, 0x39, + 0x2c, 0x23, 0x92, 0xc2, 0xde, 0x4b, 0x0b, 0x79, 0x2c, 0x0d, 0xe4, 0xb0, + 0x37, 0x92, 0xc0, 0xde, 0x4b, 0x03, 0x79, 0x2c, 0x03, 0x92, 0xc0, 0x16, + 0x00, 0xb0, 0x2c, 0x2a, 0xe2, 0xaf, 0x2a, 0x8e, 0x55, 0x19, 0x6f, 0x57, + 0xe5, 0xbd, 0x5f, 0xf7, 0xc8, 0x0d, 0x2a, 0xb7, 0xfd, 0xff, 0x00, 0x9c, + 0xd9, 0x2c, 0xf6, 0x72, 0xfb, 0xfe, 0x70, 0xda, 0x5c, 0x46, 0xe4, 0x09, + 0x12, 0x3f, 0x78, 0x5e, 0xaf, 0xcb, 0x76, 0x5b, 0xd5, 0xea, 0xf5, 0x7a, + 0xbe, 0xd6, 0x70, 0xb8, 0xfd, 0xf3, 0x72, 0xd1, 0x82, 0xf7, 0x70, 0x6a, + 0xa7, 0x46, 0x89, 0xe6, 0x17, 0x61, 0x2e, 0x24, 0x2a, 0xf5, 0x63, 0xf1, + 0x29, 0x4e, 0x1c, 0xce, 0xd9, 0xff, 0x00, 0x65, 0x89, 0x8b, 0x1b, 0x57, + 0x69, 0xe8, 0xbb, 0x4f, 0x45, 0x8c, 0xf2, 0x58, 0xfd, 0x16, 0x3f, 0x45, + 0x8f, 0xd1, 0x63, 0x0b, 0x13, 0x56, 0xc5, 0x85, 0x60, 0x2b, 0x09, 0x57, + 0x77, 0xed, 0xea, 0x81, 0x5f, 0xdc, 0xc8, 0xef, 0x35, 0xef, 0x7e, 0xce, + 0x03, 0xdd, 0xe3, 0x25, 0xa7, 0x99, 0x0f, 0x89, 0x5e, 0xd3, 0xa4, 0x13, + 0xf4, 0x85, 0x50, 0xf7, 0xf1, 0x2a, 0x9d, 0x19, 0x9e, 0x62, 0x6b, 0x46, + 0x1b, 0x5b, 0xc0, 0x77, 0x4a, 0xb4, 0x15, 0x80, 0x2b, 0x88, 0x5a, 0x2e, + 0xe6, 0xa8, 0x27, 0xc1, 0x55, 0xb2, 0xee, 0xd5, 0x5a, 0x2a, 0xbd, 0xdf, + 0x8f, 0x7c, 0xb9, 0x61, 0x2b, 0x0a, 0xc2, 0xb0, 0xac, 0x27, 0x92, 0xc2, + 0x79, 0x2b, 0x8a, 0xbb, 0x57, 0xec, 0xa0, 0xbd, 0xfc, 0x02, 0xd3, 0xcd, + 0x82, 0x3c, 0x4a, 0x9c, 0x68, 0xae, 0x89, 0xe0, 0x28, 0xbd, 0x9c, 0x06, + 0x83, 0xbe, 0xf3, 0xf7, 0x06, 0x19, 0x70, 0x5a, 0x35, 0x55, 0x12, 0xee, + 0x5e, 0x2a, 0xbd, 0xe5, 0xbd, 0xdb, 0xd9, 0xc2, 0x7b, 0xf8, 0x05, 0xd9, + 0x66, 0x7d, 0x45, 0x69, 0xc5, 0x63, 0x78, 0x55, 0x69, 0x47, 0x71, 0xe0, + 0x17, 0xbc, 0x57, 0x66, 0xbb, 0x20, 0xbb, 0x16, 0x72, 0x5d, 0x93, 0x3f, + 0x2a, 0xec, 0xdb, 0xc9, 0x76, 0x7e, 0xab, 0xb3, 0xf5, 0x2b, 0xb3, 0xf5, + 0x2b, 0x07, 0xaa, 0xb9, 0xdc, 0xd5, 0xef, 0x54, 0x7f, 0xa2, 0xa3, 0xdb, + 0xf9, 0x55, 0x33, 0x0f, 0x9a, 0xc0, 0x79, 0x85, 0xa5, 0x1f, 0x35, 0xdf, + 0x4a, 0xd1, 0x8b, 0x0c, 0xf1, 0xa2, 0xd3, 0x8e, 0xd1, 0xc0, 0x4d, 0x7b, + 0x47, 0xbe, 0x27, 0xa2, 0xd0, 0xe8, 0xec, 0x9e, 0xf3, 0x5f, 0xb9, 0xa4, + 0x44, 0xd4, 0xe1, 0xf2, 0x52, 0x22, 0x5a, 0xdc, 0x43, 0x9a, 0xa3, 0x82, + 0x90, 0xbf, 0xbd, 0xb7, 0xb9, 0x4a, 0x14, 0x27, 0x3f, 0x80, 0x53, 0x88, + 0xf6, 0x42, 0xf0, 0xbc, 0xa9, 0xc5, 0x88, 0xe8, 0xbe, 0x02, 0x8b, 0xd9, + 0xc0, 0x60, 0xf1, 0x95, 0x7f, 0x80, 0x74, 0x84, 0xd5, 0x1d, 0x25, 0x88, + 0xab, 0xdc, 0xb0, 0x9e, 0x6b, 0x07, 0xaa, 0xc1, 0xea, 0xbb, 0x3f, 0x55, + 0xd9, 0xfa, 0xac, 0x1e, 0xaa, 0xe3, 0xcd, 0x3b, 0x34, 0xbf, 0x3b, 0x8a, + 0x88, 0x22, 0x92, 0x1c, 0x0c, 0xb3, 0x54, 0xb2, 0x5e, 0x5d, 0xe1, 0xde, + 0x7e, 0xc5, 0xd1, 0xff, 0x00, 0xea, 0x0b, 0xec, 0x3d, 0x1b, 0xfe, 0xa6, + 0xad, 0x2e, 0x81, 0xd1, 0xff, 0x00, 0xea, 0x0a, 0xbd, 0x02, 0x17, 0x95, + 0x17, 0xd8, 0x5b, 0xf9, 0xdd, 0xfb, 0xaa, 0x40, 0x74, 0x2f, 0xa2, 0x21, + 0xfe, 0xab, 0x46, 0x37, 0x48, 0x6f, 0x98, 0x3f, 0xd1, 0x7b, 0x1e, 0x9c, + 0xe1, 0xe0, 0xf8, 0x6b, 0xd9, 0xc7, 0x81, 0x10, 0x79, 0x85, 0xf6, 0x6e, + 0xb0, 0x6f, 0x86, 0x66, 0xa5, 0x1a, 0x0b, 0xe1, 0xfd, 0x4d, 0x95, 0xb9, + 0x34, 0x12, 0x77, 0x05, 0x38, 0xbe, 0xc1, 0xbe, 0x37, 0xaa, 0xb3, 0xad, + 0x76, 0xf7, 0xa9, 0x01, 0x21, 0xe1, 0xf7, 0x4d, 0xdf, 0x73, 0x99, 0xf4, + 0x53, 0x0e, 0x5e, 0xf7, 0xc4, 0x9a, 0x03, 0xb3, 0x87, 0xfb, 0x6d, 0x0b, + 0xac, 0x8b, 0xd6, 0xb4, 0xfc, 0x33, 0x5a, 0x3d, 0x1d, 0xa7, 0xea, 0xaa, + 0xec, 0xf3, 0x3e, 0x92, 0xbd, 0x9c, 0x52, 0x3e, 0xa0, 0xa8, 0x04, 0x41, + 0xf2, 0x95, 0xa6, 0xc7, 0x37, 0x88, 0xd5, 0xd0, 0x21, 0xd5, 0xf4, 0x48, + 0xa4, 0x1d, 0xb9, 0xb2, 0x0b, 0xda, 0x08, 0x70, 0x07, 0xcc, 0xe9, 0xfe, + 0x8b, 0xda, 0x74, 0xca, 0xfc, 0xac, 0x5a, 0x46, 0x34, 0x4f, 0xc4, 0xbe, + 0xcb, 0x3e, 0x2f, 0x77, 0xee, 0xbe, 0xc6, 0xdf, 0xcc, 0xef, 0xdd, 0x7d, + 0x89, 0x9e, 0x73, 0x54, 0xe8, 0x50, 0x3f, 0x20, 0x5f, 0x62, 0xe8, 0xff, + 0x00, 0xf5, 0x0d, 0x5c, 0x9c, 0xd0, 0xe1, 0xe2, 0x89, 0x7f, 0x44, 0x87, + 0x3f, 0x94, 0x49, 0x1e, 0xa5, 0xef, 0x82, 0x79, 0x84, 0x7a, 0xa7, 0xb2, + 0x30, 0xe4, 0x54, 0xa3, 0x41, 0x74, 0x3e, 0x21, 0x48, 0x09, 0x94, 0x1f, + 0xd2, 0x3d, 0x8b, 0x37, 0x7b, 0xca, 0x50, 0xa1, 0x80, 0x7e, 0x2d, 0xbf, + 0xc2, 0x70, 0x61, 0xf9, 0xa8, 0x74, 0xab, 0xab, 0x6a, 0x44, 0x4c, 0x78, + 0xae, 0xcf, 0x30, 0xef, 0x65, 0x11, 0x30, 0x1c, 0x22, 0x0d, 0xc6, 0x85, + 0x66, 0xc4, 0x61, 0x61, 0xf1, 0x16, 0x47, 0x57, 0xd1, 0xdc, 0xd6, 0x9f, + 0x7d, 0xf4, 0x0b, 0xfc, 0xc7, 0x4b, 0x6b, 0x7c, 0x21, 0xb6, 0x6b, 0x49, + 0xb1, 0x23, 0xfd, 0x6e, 0xfd, 0x94, 0xba, 0x3c, 0x06, 0x42, 0xfa, 0x47, + 0x78, 0x93, 0x80, 0x23, 0x71, 0x46, 0x2c, 0x38, 0x0d, 0x6b, 0xf7, 0x8f, + 0xe1, 0x56, 0x43, 0xe0, 0x13, 0x1b, 0xb8, 0x6a, 0x73, 0x22, 0xc3, 0x0f, + 0x6f, 0x8a, 0x2f, 0xe8, 0x6f, 0xcd, 0x3f, 0xed, 0xbf, 0xf7, 0x46, 0x1f, + 0xf8, 0x62, 0xc9, 0x5e, 0xe7, 0x99, 0x04, 0x1d, 0xd3, 0x23, 0x98, 0x87, + 0xe0, 0x87, 0x41, 0xcd, 0x7f, 0x97, 0xe8, 0xcc, 0x61, 0xf8, 0xa5, 0x33, + 0xcf, 0xf8, 0xca, 0x5b, 0x9d, 0xff, 0x00, 0xc0, 0x1d, 0x21, 0xfb, 0xa7, + 0xfc, 0x7e, 0x57, 0x4b, 0x89, 0xe3, 0x2f, 0xe1, 0x5b, 0xd5, 0xeb, 0x18, + 0xe6, 0xaf, 0x5b, 0x79, 0x2d, 0xbc, 0x96, 0xde, 0x4b, 0x6f, 0x25, 0xb7, + 0x92, 0xbd, 0x62, 0x1c, 0xfe, 0xe0, 0x88, 0x77, 0x34, 0xa8, 0xae, 0xf8, + 0x9f, 0xfc, 0x23, 0x7a, 0xb8, 0x95, 0xb0, 0x2c, 0x5c, 0x95, 0xe7, 0x9a, + 0xb8, 0x6a, 0xb0, 0x85, 0xb6, 0x7c, 0x55, 0x1c, 0x56, 0xc2, 0xae, 0x57, + 0xf3, 0xef, 0x51, 0xcf, 0xc8, 0x54, 0x3f, 0x12, 0x4f, 0xdf, 0x77, 0xf7, + 0x3a, 0x55, 0x6c, 0x0a, 0xb3, 0x2a, 0x82, 0x5d, 0xce, 0x99, 0x29, 0x3f, + 0x25, 0x2b, 0xd6, 0xed, 0x4e, 0x20, 0xb1, 0x85, 0x8b, 0xd1, 0x6d, 0x5b, + 0x54, 0xea, 0x15, 0xea, 0xff, 0x00, 0x45, 0x89, 0x62, 0x1c, 0xd5, 0xf6, + 0x23, 0xfd, 0x2b, 0xa3, 0x8f, 0x97, 0xef, 0x79, 0xac, 0xd0, 0x4c, 0xd6, + 0xdc, 0xdd, 0xe6, 0xf5, 0x79, 0x57, 0x73, 0x54, 0xa7, 0x05, 0xb7, 0x9d, + 0x89, 0xb6, 0xf5, 0x89, 0x6d, 0x57, 0x2a, 0xb5, 0x61, 0x57, 0xc9, 0x49, + 0x8e, 0x0e, 0xb1, 0xb9, 0x56, 0xba, 0xd1, 0x34, 0x40, 0xd9, 0xad, 0xf0, + 0x5b, 0xb8, 0x2a, 0x85, 0xa4, 0xf6, 0xb7, 0xea, 0x2b, 0xb7, 0x62, 0xa4, + 0x6c, 0xee, 0x01, 0x68, 0x32, 0x67, 0x8a, 0xf8, 0x55, 0x5c, 0xaf, 0xcb, + 0x72, 0x0b, 0xc1, 0x53, 0x2d, 0x15, 0xea, 0xf5, 0x30, 0xde, 0xb1, 0xa6, + 0xf0, 0xb3, 0x4b, 0x1c, 0xd7, 0x28, 0xb2, 0x50, 0x9b, 0x9c, 0x28, 0xd1, + 0xaa, 0xab, 0x96, 0x12, 0x57, 0x67, 0xea, 0xb4, 0x98, 0x47, 0x05, 0xa2, + 0xea, 0xee, 0xfb, 0x9b, 0x14, 0xf8, 0x2a, 0x31, 0xca, 0xa5, 0x8d, 0xe2, + 0xf0, 0xb3, 0x36, 0x6d, 0x70, 0xb9, 0x66, 0x4f, 0x34, 0x1f, 0x95, 0x01, + 0x6a, 0xb6, 0xa8, 0x15, 0x4a, 0xf6, 0x8e, 0x03, 0x89, 0x54, 0x8f, 0x0c, + 0x7e, 0x25, 0x28, 0x7d, 0x2c, 0x3f, 0xc3, 0x3a, 0x6b, 0x4d, 0x81, 0xc3, + 0x92, 0xf7, 0xa1, 0xf1, 0x0a, 0x60, 0x87, 0x0f, 0x0b, 0x5a, 0x4e, 0x0d, + 0xe2, 0x54, 0x8c, 0x66, 0xe7, 0x6e, 0x0a, 0x93, 0x2b, 0xdd, 0x1c, 0x5c, + 0xb3, 0x83, 0x9b, 0x9b, 0x39, 0x4c, 0x04, 0xe7, 0x02, 0xf7, 0x4b, 0x73, + 0x64, 0xa6, 0xd1, 0x11, 0xdf, 0x89, 0x61, 0x03, 0x8b, 0x96, 0x73, 0xa3, + 0x01, 0x24, 0x06, 0x7b, 0x1f, 0x9c, 0x27, 0x72, 0xec, 0xd9, 0xe4, 0xe2, + 0xb0, 0x99, 0xf8, 0x44, 0x53, 0x7b, 0x9e, 0xc1, 0xf5, 0x4d, 0x4c, 0x47, + 0x98, 0x58, 0xda, 0xe4, 0x27, 0x0b, 0x3f, 0xe9, 0xa2, 0xf7, 0x82, 0xa3, + 0xc7, 0x9d, 0x15, 0xf3, 0xe1, 0x64, 0xb6, 0x10, 0xeb, 0x5d, 0xbf, 0x62, + 0xac, 0x52, 0xd1, 0xb9, 0xb4, 0x55, 0x33, 0xb1, 0x27, 0x69, 0x05, 0x9c, + 0xdb, 0x25, 0x4d, 0x55, 0x78, 0x58, 0x9a, 0x06, 0x92, 0x22, 0x93, 0x09, + 0xae, 0x68, 0x9d, 0x67, 0x9a, 0x83, 0x44, 0x23, 0x08, 0x6d, 0x19, 0xd7, + 0xa9, 0x67, 0x94, 0x05, 0xc7, 0x82, 0xd1, 0x8f, 0x0d, 0xe7, 0x76, 0x7f, + 0xee, 0xb4, 0xa1, 0x13, 0xc0, 0x21, 0x9c, 0x0b, 0x55, 0x1c, 0x0e, 0x59, + 0x95, 0x7c, 0x85, 0x91, 0x25, 0x23, 0x5d, 0x6e, 0x7c, 0x27, 0x67, 0x36, + 0xe9, 0xe5, 0xa9, 0x03, 0x8a, 0xa1, 0x9e, 0xb3, 0x10, 0x54, 0x23, 0x2e, + 0x80, 0x73, 0xfe, 0x90, 0xb4, 0xdf, 0x0d, 0x9e, 0x13, 0xce, 0x3e, 0x8a, + 0x9d, 0x63, 0xbf, 0x94, 0x2a, 0x31, 0x83, 0x8d, 0x55, 0x62, 0xba, 0x5f, + 0x2d, 0x14, 0x9e, 0x73, 0x81, 0xda, 0xe2, 0x88, 0xde, 0x83, 0x76, 0x94, + 0xc8, 0x72, 0xda, 0x2c, 0xd7, 0x51, 0xd5, 0xb5, 0xb9, 0xf1, 0x3d, 0x02, + 0xac, 0x52, 0xd1, 0xb9, 0xb4, 0x53, 0x26, 0x67, 0x28, 0xd3, 0xcf, 0x67, + 0xc2, 0xe5, 0x9c, 0xd3, 0x51, 0x7b, 0x77, 0x29, 0x87, 0x16, 0x9d, 0xe1, + 0x48, 0x9e, 0xb0, 0x78, 0xde, 0xa4, 0x41, 0x86, 0xef, 0x99, 0x54, 0xcf, + 0x82, 0xf7, 0x59, 0xf5, 0x94, 0x73, 0x62, 0x93, 0xf4, 0x22, 0x61, 0x30, + 0x01, 0xf1, 0x3d, 0xcb, 0x4e, 0x3b, 0x58, 0x7e, 0x50, 0xaa, 0xf8, 0x91, + 0x4f, 0x8b, 0x96, 0x06, 0xb7, 0x8a, 0x10, 0xc8, 0x6b, 0xe1, 0x3c, 0xd3, + 0xea, 0x59, 0xac, 0x90, 0x6e, 0xe0, 0x14, 0x56, 0x6f, 0xd3, 0x0b, 0x3a, + 0xa4, 0x78, 0x15, 0x3c, 0xea, 0x6c, 0xd2, 0x4d, 0xae, 0xc4, 0xe6, 0x89, + 0xd2, 0x93, 0xce, 0x54, 0x7c, 0xbc, 0xd6, 0x9b, 0xa6, 0x13, 0x5a, 0xa6, + 0xe6, 0x4e, 0x9b, 0x55, 0x05, 0x7c, 0x0a, 0xd2, 0x57, 0xcb, 0x81, 0x4d, + 0x02, 0x2e, 0x6b, 0x8e, 0xc9, 0x7e, 0xca, 0xba, 0x7c, 0x2a, 0xae, 0xaf, + 0x82, 0x19, 0x8c, 0x2e, 0xe3, 0x45, 0x1a, 0x6e, 0xcd, 0x12, 0xb9, 0xba, + 0x89, 0x6c, 0x39, 0x6f, 0x54, 0xc8, 0xe6, 0xdb, 0xce, 0xda, 0xda, 0xa7, + 0x09, 0xce, 0x4b, 0xcd, 0x4d, 0xa0, 0x79, 0x89, 0xa9, 0xe6, 0xca, 0x7b, + 0x1a, 0xa8, 0x56, 0x83, 0xdc, 0xce, 0x06, 0x4b, 0x4c, 0xb6, 0x2b, 0x7f, + 0xe4, 0x6c, 0xd6, 0x9c, 0x17, 0xc2, 0xf1, 0x84, 0xef, 0xe8, 0x57, 0xb0, + 0xe9, 0x6c, 0x27, 0xe0, 0x8b, 0xa0, 0x7d, 0x68, 0xbf, 0xcc, 0x74, 0x77, + 0x34, 0x7c, 0x52, 0xa7, 0x3b, 0x90, 0xcc, 0x35, 0x9d, 0xd6, 0xdb, 0xac, + 0xcf, 0x88, 0xec, 0xd6, 0xef, 0xb3, 0xa7, 0xa7, 0xf5, 0x00, 0x89, 0x05, + 0xbe, 0x53, 0x6f, 0xf5, 0x5a, 0x33, 0x3f, 0x4b, 0xe7, 0xfa, 0x85, 0xa7, + 0x0d, 0xfe, 0x70, 0xe7, 0xea, 0x15, 0xcd, 0x27, 0xc1, 0xdf, 0xba, 0xd2, + 0x0e, 0x60, 0xde, 0x45, 0x16, 0x8b, 0x83, 0xb8, 0x6a, 0x2f, 0x53, 0x64, + 0x26, 0x38, 0xed, 0x7b, 0xf4, 0x8f, 0x2b, 0x97, 0xb4, 0x8a, 0xe7, 0x37, + 0x76, 0xce, 0x4a, 0xe5, 0xb1, 0x57, 0x24, 0x95, 0xf5, 0x4d, 0x32, 0x05, + 0xca, 0x20, 0x35, 0xb8, 0xe4, 0xae, 0x5d, 0xe8, 0xdb, 0x8d, 0xf5, 0x5a, + 0xd1, 0xf8, 0x56, 0x91, 0xc9, 0x5b, 0xb7, 0x27, 0x0a, 0x89, 0xfc, 0x24, + 0xd1, 0x75, 0x9d, 0x1e, 0x29, 0x79, 0xf8, 0x22, 0x9d, 0x2e, 0x7f, 0xba, + 0xea, 0xa3, 0xc3, 0x74, 0x18, 0x83, 0x7e, 0xd4, 0x48, 0x34, 0x34, 0x73, + 0x77, 0xa9, 0xde, 0xd3, 0x75, 0x64, 0xb0, 0x80, 0xb4, 0x68, 0xe3, 0xb4, + 0x2c, 0xc6, 0x89, 0x52, 0x54, 0x08, 0x0c, 0xc3, 0x9c, 0x98, 0x48, 0x20, + 0xe1, 0xe6, 0xa4, 0xd0, 0x88, 0x34, 0x06, 0xa8, 0x2a, 0x35, 0x4c, 0xf9, + 0xa0, 0xd3, 0xb2, 0xb9, 0x2e, 0x98, 0xb9, 0x69, 0x5f, 0xe2, 0x10, 0x33, + 0x6c, 0xb6, 0x4d, 0x1a, 0xe7, 0x4e, 0xe0, 0x06, 0xd5, 0xec, 0xda, 0x62, + 0xc6, 0x3f, 0x0e, 0xc5, 0x9f, 0xd3, 0x22, 0x91, 0x2a, 0xf5, 0x6c, 0xfe, + 0xa5, 0x38, 0x31, 0x92, 0xae, 0x48, 0xdf, 0x49, 0xd4, 0x33, 0x25, 0xf6, + 0x1b, 0x6e, 0x23, 0x77, 0x84, 0xec, 0xca, 0xd3, 0xfa, 0x21, 0xc5, 0x5f, + 0x24, 0xe0, 0x5f, 0x9d, 0x2d, 0xa2, 0xc5, 0x14, 0xdd, 0xc9, 0x7b, 0x08, + 0xef, 0x87, 0xe0, 0x0d, 0x39, 0x22, 0x1f, 0xd1, 0xe1, 0x32, 0x28, 0x13, + 0xeb, 0x21, 0x8c, 0xd9, 0xf1, 0x17, 0x5b, 0x6a, 0xf6, 0x8f, 0x0c, 0xe2, + 0x55, 0x33, 0x9d, 0xc0, 0x2d, 0x08, 0x5a, 0x3b, 0xe7, 0x3f, 0xd1, 0x69, + 0x73, 0x03, 0x51, 0x2d, 0xab, 0x35, 0xb7, 0x6e, 0x21, 0x56, 0x1c, 0x33, + 0xc4, 0x2a, 0xc1, 0x6f, 0xe1, 0xa2, 0x99, 0x81, 0x13, 0xca, 0x39, 0x54, + 0x64, 0x56, 0xf0, 0x70, 0xfd, 0x91, 0xd2, 0xe9, 0x23, 0xcd, 0x87, 0xff, + 0x00, 0xca, 0xfb, 0x54, 0x51, 0xf5, 0xc1, 0x69, 0xfd, 0x17, 0xda, 0x3a, + 0x3b, 0xf8, 0xb5, 0xcc, 0xfd, 0xd4, 0xa2, 0x41, 0x85, 0x1b, 0xe9, 0x88, + 0xd7, 0x7e, 0xaa, 0x6d, 0x83, 0xd2, 0x20, 0x9f, 0xf8, 0xe6, 0xa3, 0x30, + 0x03, 0x20, 0xea, 0x19, 0xc8, 0xaa, 0x46, 0x70, 0xf0, 0x78, 0x5a, 0x4c, + 0x11, 0x1b, 0xbd, 0xab, 0x48, 0x16, 0xa9, 0x31, 0xd3, 0xa4, 0xec, 0xbb, + 0x85, 0x8a, 0x2a, 0x95, 0x7e, 0x46, 0xb7, 0x6c, 0xe9, 0x25, 0xd2, 0x1f, + 0xb4, 0x64, 0xde, 0x72, 0xef, 0xd4, 0x44, 0x3f, 0x31, 0xb4, 0xe3, 0xf2, + 0x58, 0xa8, 0x9a, 0xa4, 0x10, 0xba, 0xb8, 0xdd, 0x14, 0x45, 0x66, 0xe9, + 0x27, 0x3f, 0xa2, 0x6c, 0xaf, 0x56, 0xf3, 0xfd, 0x53, 0xa1, 0x47, 0x86, + 0xe6, 0xec, 0x73, 0x0d, 0xeb, 0x7b, 0x51, 0xd1, 0x0a, 0x6d, 0x61, 0x46, + 0x67, 0x31, 0xe4, 0xcd, 0xad, 0x4e, 0xce, 0x6f, 0xf3, 0x20, 0xe0, 0xca, + 0x71, 0x2a, 0xe6, 0x9e, 0x69, 0xba, 0x2c, 0xaf, 0xfe, 0xde, 0xbd, 0xd1, + 0xcd, 0x7b, 0x87, 0xcd, 0x4f, 0x34, 0x0d, 0x97, 0xaa, 0x37, 0xd5, 0x61, + 0x3e, 0x4a, 0x5b, 0x10, 0x0d, 0x87, 0xd6, 0x38, 0xd0, 0x34, 0x21, 0x1f, + 0xa7, 0x7b, 0x16, 0x9f, 0xf4, 0xd8, 0x6a, 0xba, 0xae, 0x8c, 0xc0, 0xc6, + 0x05, 0x26, 0x99, 0xef, 0xcb, 0x13, 0xe9, 0x3a, 0x86, 0x71, 0xb5, 0x3d, + 0xc6, 0xd5, 0x55, 0x14, 0x60, 0xf7, 0xf5, 0x6b, 0x39, 0xb1, 0x44, 0x4a, + 0xa2, 0x9d, 0xc6, 0xdb, 0xbe, 0x9b, 0x6d, 0x5d, 0x64, 0x58, 0xa4, 0xed, + 0xf8, 0x42, 0x1d, 0x48, 0x6c, 0x47, 0x0d, 0xb0, 0xda, 0x62, 0x1e, 0x6a, + 0x6e, 0x84, 0xe8, 0x6d, 0xf8, 0xa2, 0x10, 0x07, 0xea, 0x8e, 0x7c, 0x68, + 0x20, 0xec, 0xcc, 0x7e, 0x7a, 0xc6, 0x62, 0x1d, 0xec, 0x64, 0xbf, 0x55, + 0x26, 0xb1, 0xef, 0xf1, 0x75, 0x15, 0x21, 0xf3, 0x74, 0xd5, 0xc1, 0x6c, + 0x5b, 0x16, 0xe4, 0x5a, 0x5d, 0xa2, 0x75, 0x6d, 0x74, 0xe4, 0x1c, 0x37, + 0x2b, 0xc2, 0x9e, 0xdd, 0xe0, 0xad, 0x99, 0xdb, 0xc8, 0xaa, 0x8a, 0x0b, + 0xb4, 0x65, 0x86, 0xcb, 0xb8, 0x58, 0xbd, 0x56, 0x7e, 0x6e, 0x92, 0xa9, + 0x6f, 0xea, 0xaf, 0x1c, 0x94, 0x16, 0xb4, 0x19, 0x97, 0x85, 0x1d, 0xdb, + 0xde, 0x56, 0xed, 0x61, 0xb4, 0xff, 0x00, 0xa6, 0xc5, 0xc0, 0xaa, 0x89, + 0x79, 0x2a, 0x55, 0x4a, 0x18, 0x0c, 0x1f, 0x11, 0x45, 0xb1, 0x9b, 0xd6, + 0x3b, 0xe2, 0x75, 0xe9, 0xee, 0xe8, 0xe0, 0xf4, 0x88, 0x1c, 0x26, 0xe6, + 0xfe, 0xe8, 0xcc, 0x01, 0xe4, 0x8c, 0xa6, 0x4a, 0x1b, 0xc6, 0x48, 0xb0, + 0x83, 0xa9, 0x3b, 0x94, 0xe8, 0xb1, 0x29, 0x67, 0x51, 0x5e, 0x82, 0xa2, + 0xb9, 0x68, 0x34, 0xb6, 0x1c, 0xeb, 0x15, 0xd7, 0x20, 0x58, 0x33, 0xe3, + 0xca, 0xb1, 0x1c, 0x8b, 0x4d, 0xc8, 0x97, 0x0a, 0xc9, 0x53, 0x9a, 0xcd, + 0x19, 0x22, 0x7d, 0x27, 0x50, 0xce, 0x36, 0x9e, 0x85, 0xb7, 0x45, 0x67, + 0x2d, 0xa9, 0xd9, 0x26, 0x40, 0x1c, 0x2d, 0xbb, 0xe9, 0xb6, 0x13, 0xc3, + 0x61, 0xc2, 0x6c, 0x8e, 0x2c, 0xc9, 0x9f, 0x55, 0x27, 0x74, 0x88, 0x92, + 0xdc, 0x1d, 0x45, 0x5a, 0xf7, 0x48, 0x71, 0x3e, 0x17, 0x4a, 0xc7, 0x48, + 0xe0, 0x2c, 0x9d, 0x44, 0x29, 0xdc, 0x08, 0xbb, 0x8a, 0x27, 0x38, 0x9f, + 0x09, 0xab, 0xac, 0x9b, 0x4f, 0x3e, 0x16, 0xe2, 0x70, 0xb3, 0x7a, 0x9b, + 0x8a, 0x93, 0x68, 0xdc, 0xae, 0x8d, 0x03, 0xfc, 0xbf, 0x49, 0xdf, 0xb0, + 0xf1, 0x5d, 0x4f, 0x49, 0x69, 0x6b, 0xb6, 0x11, 0x71, 0x5b, 0x72, 0x48, + 0x09, 0x67, 0x04, 0x66, 0x15, 0x1b, 0x55, 0x70, 0x9a, 0xba, 0xf5, 0xfd, + 0xd6, 0x6b, 0x1a, 0x4b, 0x8e, 0xc0, 0x9b, 0x1f, 0xa7, 0x37, 0x35, 0xbb, + 0x21, 0xfe, 0xe9, 0xad, 0x86, 0xd0, 0xc6, 0x6e, 0x19, 0x04, 0xd5, 0xce, + 0x71, 0x54, 0x95, 0xc8, 0x92, 0x25, 0x3c, 0x91, 0x3e, 0x93, 0xa8, 0x6f, + 0x1b, 0x45, 0x0b, 0x74, 0xa5, 0x02, 0x76, 0xa5, 0xdf, 0x4d, 0xb0, 0xa2, + 0x7d, 0x47, 0xbb, 0x47, 0x1f, 0x2c, 0xec, 0x74, 0x8f, 0x2b, 0x27, 0x50, + 0xcd, 0xdf, 0xf8, 0xa9, 0xeb, 0x22, 0xfd, 0x26, 0xdc, 0x5e, 0x1a, 0xb3, + 0x0b, 0xa4, 0xc3, 0xeb, 0x06, 0xc3, 0xb9, 0x3a, 0x27, 0x42, 0x3f, 0xe2, + 0x21, 0x7c, 0x07, 0x10, 0xfd, 0xd6, 0x69, 0x86, 0xf0, 0xe1, 0x78, 0x92, + 0x6b, 0x84, 0x27, 0x99, 0x1d, 0xcb, 0x43, 0xa3, 0x45, 0x3f, 0x85, 0x4c, + 0xf4, 0x58, 0x9f, 0x95, 0x57, 0xa3, 0xbf, 0xf2, 0xaa, 0xc1, 0x7f, 0x24, + 0x59, 0x0e, 0x0b, 0xa7, 0xbd, 0xd4, 0x4d, 0xce, 0xf6, 0xb1, 0xce, 0x27, + 0x1b, 0x13, 0x7c, 0xd6, 0x80, 0xcc, 0x6a, 0xc3, 0x55, 0x2b, 0xf2, 0x3f, + 0x86, 0xb8, 0xa1, 0x6d, 0xa7, 0xe5, 0x1f, 0xd5, 0x66, 0xc4, 0x7f, 0x56, + 0x0f, 0xbd, 0x25, 0x0d, 0xae, 0x2d, 0x70, 0xeb, 0x07, 0x02, 0xa3, 0x66, + 0x48, 0x37, 0x3c, 0xca, 0x56, 0xaa, 0x13, 0xe4, 0x25, 0xa3, 0x6c, 0x28, + 0x9c, 0x7b, 0xb1, 0x69, 0xb8, 0xa7, 0x30, 0xde, 0xd3, 0x2c, 0xbd, 0x20, + 0xf0, 0xb4, 0x6d, 0xb0, 0xc3, 0xbc, 0x4e, 0x53, 0xe0, 0x9c, 0x33, 0x65, + 0x23, 0x62, 0xf4, 0x2a, 0x6d, 0xc5, 0xe1, 0x6e, 0x2f, 0x96, 0xb3, 0x48, + 0x4f, 0xc1, 0x7f, 0x8e, 0xe8, 0xce, 0x74, 0x27, 0x36, 0x40, 0xb2, 0x78, + 0x96, 0x6f, 0x5a, 0xf1, 0xe6, 0xa5, 0xd6, 0xbb, 0x9a, 0xed, 0x1c, 0xa5, + 0xd6, 0x3a, 0x4b, 0xa2, 0xc0, 0x89, 0x10, 0x86, 0x3e, 0x20, 0x69, 0xe6, + 0x9b, 0x0e, 0x1b, 0x43, 0x1b, 0x70, 0x01, 0x13, 0x92, 0xfc, 0x93, 0xcd, + 0x9a, 0xaf, 0x20, 0x9d, 0xc4, 0xe5, 0x77, 0x04, 0x75, 0x02, 0xc9, 0x42, + 0xdc, 0x36, 0x36, 0xf6, 0xb0, 0x67, 0x7a, 0xa7, 0x50, 0x1e, 0x22, 0x69, + 0xae, 0x3f, 0x12, 0x71, 0xf1, 0xb6, 0xff, 0x00, 0xa7, 0x50, 0xfe, 0x3d, + 0xde, 0x37, 0x89, 0xce, 0xcb, 0x1b, 0xea, 0xb4, 0x6d, 0xc7, 0xeb, 0x58, + 0xce, 0xb3, 0x36, 0x4d, 0x9d, 0xe5, 0x44, 0x95, 0xd9, 0xd6, 0x45, 0x15, + 0xd6, 0xa2, 0x5b, 0x8b, 0xe5, 0xac, 0x9b, 0x90, 0x95, 0x33, 0xe2, 0x86, + 0x8b, 0x30, 0x22, 0x7c, 0x2f, 0x05, 0x4f, 0xc2, 0xd5, 0x4c, 0xbc, 0x13, + 0xf8, 0xe5, 0x72, 0x3a, 0x86, 0xf0, 0xb2, 0xee, 0x08, 0x5a, 0x9a, 0x8d, + 0xe4, 0x9c, 0x8e, 0xa1, 0xff, 0x00, 0x4d, 0xb0, 0x9d, 0xdd, 0xe1, 0xbf, + 0xe2, 0x6c, 0xb2, 0xc4, 0xfa, 0xed, 0x3b, 0x8d, 0xb8, 0x50, 0xbe, 0x32, + 0x1b, 0xcc, 0xa8, 0xad, 0xdc, 0xeb, 0x21, 0x5f, 0x69, 0xdc, 0x45, 0xb8, + 0x9e, 0x59, 0x05, 0x89, 0xda, 0x96, 0xc5, 0xd1, 0x21, 0xff, 0x00, 0xc9, + 0x3f, 0x4b, 0x07, 0x8e, 0x4e, 0x8c, 0xe6, 0xff, 0x00, 0xa8, 0xc0, 0xeb, + 0x54, 0xa2, 0x71, 0xf1, 0x55, 0x08, 0xa2, 0x8e, 0xa1, 0x9c, 0x2c, 0xbb, + 0x82, 0x15, 0xb7, 0x9d, 0xb4, 0xa7, 0xa3, 0xa8, 0x7f, 0xd3, 0xa8, 0x3d, + 0xde, 0x1b, 0xbe, 0x17, 0x65, 0x77, 0xd7, 0x69, 0xdc, 0x6c, 0x00, 0xa4, + 0xd1, 0xe6, 0x55, 0xc0, 0xa8, 0x11, 0xfd, 0xd6, 0x90, 0xe2, 0x38, 0x10, + 0x99, 0x9b, 0x5e, 0xb2, 0x1b, 0x22, 0x73, 0x68, 0x36, 0x2f, 0x58, 0xad, + 0xfe, 0x2b, 0x71, 0x2d, 0xd1, 0x11, 0x67, 0xa2, 0x35, 0xce, 0x23, 0x35, + 0xae, 0x2d, 0x96, 0xdb, 0xac, 0x1e, 0x39, 0x3a, 0x1c, 0xbe, 0x09, 0x5b, + 0x3c, 0x72, 0x11, 0x91, 0xdc, 0x75, 0x10, 0xf8, 0x59, 0x96, 0xa0, 0x38, + 0x02, 0x69, 0x5a, 0x5d, 0x55, 0xd2, 0x1b, 0x18, 0xe6, 0xb4, 0xb2, 0xff, + 0x00, 0x14, 0x75, 0x0e, 0xfa, 0x6d, 0x8e, 0xf1, 0x11, 0x82, 0xf9, 0x4c, + 0x65, 0x6f, 0x12, 0x89, 0x36, 0x5f, 0xc6, 0xc3, 0x65, 0x7c, 0xf2, 0xbc, + 0xec, 0xcd, 0x3f, 0xd1, 0x43, 0xce, 0x7c, 0xdc, 0x1a, 0x07, 0xa5, 0x93, + 0x5b, 0x6d, 0xfa, 0xad, 0xc4, 0xe3, 0xa9, 0xe3, 0x63, 0xa1, 0x3f, 0x79, + 0x78, 0x9f, 0xe5, 0xcb, 0x29, 0x79, 0xa2, 0x3c, 0x50, 0x5d, 0x1a, 0x54, + 0x95, 0x35, 0x1e, 0x2a, 0x7b, 0x4e, 0x47, 0xf1, 0xd4, 0x32, 0xc8, 0xb6, + 0xd3, 0x20, 0x65, 0x59, 0x11, 0x42, 0x9e, 0xd9, 0x36, 0x47, 0x4a, 0x5b, + 0xb8, 0x27, 0x6a, 0x5d, 0xf4, 0xdb, 0x1d, 0xe5, 0xf2, 0xc2, 0xed, 0x21, + 0x91, 0xbc, 0x4d, 0xa7, 0x71, 0xca, 0x10, 0xf0, 0x04, 0xa3, 0x92, 0x2d, + 0x56, 0x70, 0xa9, 0xb9, 0xd6, 0x4d, 0xb6, 0x71, 0xb6, 0xfe, 0x3a, 0xde, + 0x88, 0xcd, 0x83, 0x38, 0xfe, 0x99, 0x4a, 0x06, 0x1b, 0x33, 0x25, 0x7d, + 0x67, 0x33, 0x92, 0x07, 0x9f, 0xeb, 0x6d, 0xfc, 0x55, 0x72, 0xc4, 0xe3, + 0xa8, 0x6d, 0xa3, 0x4a, 0x5b, 0xff, 0x00, 0xdb, 0xd3, 0xb5, 0x27, 0xe9, + 0xd4, 0x79, 0x77, 0x86, 0xc5, 0x17, 0xc3, 0x3e, 0x99, 0x1b, 0xc4, 0xda, + 0x7f, 0x1c, 0xa1, 0x44, 0x97, 0xc3, 0x24, 0x7d, 0xac, 0x3e, 0x6b, 0xb5, + 0x87, 0xcd, 0x39, 0xa6, 0x44, 0x9a, 0xcc, 0x2e, 0x93, 0x04, 0x9a, 0x51, + 0xc0, 0x22, 0x36, 0x58, 0xc4, 0xaf, 0xb5, 0x0e, 0xdb, 0xf8, 0xeb, 0x60, + 0x3b, 0x60, 0x98, 0xcb, 0xe6, 0xa5, 0x92, 0x1f, 0x81, 0x36, 0xe2, 0x79, + 0x58, 0x89, 0xf5, 0x1d, 0x43, 0x6c, 0x84, 0x77, 0x5b, 0xf2, 0xfe, 0xa8, + 0xa1, 0xa8, 0xfc, 0x3a, 0x81, 0xc3, 0xbc, 0x3d, 0x86, 0xe7, 0x09, 0x27, + 0x31, 0xd4, 0x20, 0xc9, 0x33, 0xce, 0xd3, 0xf8, 0xe5, 0x0a, 0x21, 0xde, + 0xe6, 0x84, 0x72, 0x44, 0x9e, 0xc0, 0x02, 0x1b, 0x9d, 0xa2, 0xbc, 0x75, + 0x70, 0xbc, 0xed, 0xbb, 0x8e, 0xb6, 0x1b, 0x7e, 0x1f, 0xd8, 0x7e, 0xf9, + 0x4f, 0x1c, 0xbf, 0x4b, 0xe5, 0x2b, 0x67, 0x85, 0x88, 0xbf, 0x51, 0xd4, + 0x36, 0xc8, 0xde, 0x51, 0x08, 0xd9, 0x7b, 0x97, 0x92, 0x28, 0x6a, 0x3f, + 0x0e, 0xa0, 0x70, 0xef, 0x23, 0xa4, 0x34, 0x78, 0x39, 0x43, 0xf3, 0xfd, + 0x6d, 0x3b, 0x8d, 0x86, 0xf8, 0xc4, 0x55, 0xcf, 0x9a, 0xbd, 0xea, 0x2f, + 0x56, 0x49, 0xba, 0xf5, 0x9c, 0x2f, 0x04, 0x14, 0xc8, 0x8d, 0x17, 0x89, + 0xac, 0xed, 0x87, 0x29, 0xb7, 0x0b, 0xce, 0xdb, 0xb8, 0xea, 0x0d, 0x97, + 0x1f, 0xf9, 0x1c, 0x3f, 0x4c, 0xbe, 0x79, 0x7a, 0x54, 0x3d, 0xd2, 0x75, + 0xba, 0xee, 0xb1, 0x17, 0xea, 0xd4, 0x32, 0xc4, 0xd3, 0x46, 0xe4, 0x65, + 0x6a, 0x5f, 0x13, 0xda, 0x3d, 0x57, 0x92, 0x28, 0x6a, 0x07, 0x0d, 0x43, + 0x78, 0x77, 0x97, 0x43, 0x76, 0x17, 0x09, 0x26, 0xc3, 0x75, 0xe2, 0x7f, + 0xad, 0xa7, 0xf1, 0xb1, 0x04, 0x71, 0x28, 0x99, 0x2c, 0x2a, 0x34, 0xc6, + 0xd6, 0xa7, 0x12, 0x09, 0xb9, 0x01, 0xb9, 0x78, 0x15, 0x2c, 0x86, 0xdc, + 0x2f, 0x3b, 0x67, 0x8e, 0x41, 0xaa, 0x2b, 0x3f, 0xe2, 0x8b, 0x14, 0xfa, + 0xe5, 0x28, 0xbb, 0x24, 0x48, 0x7b, 0x1d, 0x0a, 0x76, 0xfc, 0xb2, 0x95, + 0x17, 0x8e, 0xa1, 0x9c, 0x2c, 0x4d, 0x4d, 0x39, 0x0c, 0x92, 0xcb, 0xd1, + 0x61, 0xfc, 0xd3, 0x5e, 0x48, 0xa1, 0xa8, 0x67, 0x0d, 0x43, 0x78, 0x77, + 0xa9, 0x5a, 0x7d, 0x86, 0x8f, 0x05, 0x20, 0xea, 0x2c, 0x5e, 0x81, 0x3e, + 0x75, 0x33, 0x68, 0x4f, 0x73, 0x84, 0x93, 0xa0, 0x93, 0x29, 0x89, 0xa2, + 0xd5, 0x23, 0x78, 0xc8, 0x6d, 0xc2, 0xb7, 0xf8, 0xb5, 0x02, 0xc3, 0xbe, + 0x56, 0x92, 0xa0, 0xc3, 0xcf, 0xa1, 0x24, 0x67, 0x49, 0x68, 0x97, 0x17, + 0x6f, 0x21, 0x50, 0x81, 0xe4, 0xbb, 0x40, 0xa6, 0x5c, 0x0f, 0x92, 0x39, + 0xd3, 0xe2, 0x14, 0x38, 0x9e, 0xe9, 0xd1, 0x27, 0x54, 0x54, 0x4d, 0x43, + 0x78, 0x58, 0x96, 0x42, 0x72, 0xcf, 0x24, 0xd4, 0x36, 0xfc, 0x39, 0xa1, + 0x49, 0x12, 0x9b, 0xa8, 0x87, 0xff, 0x00, 0xb6, 0x6a, 0x1b, 0xf7, 0x03, + 0x88, 0x14, 0x57, 0x2c, 0x25, 0x68, 0xc3, 0x73, 0xa5, 0xb9, 0x76, 0x6f, + 0xe4, 0xbb, 0x18, 0xa4, 0x7d, 0x2b, 0xec, 0xee, 0x1f, 0x80, 0xa9, 0x3a, + 0x86, 0x63, 0xc1, 0x69, 0x28, 0x4f, 0x9d, 0x27, 0x54, 0x64, 0x43, 0xb7, + 0xc9, 0x78, 0x85, 0xe0, 0x8d, 0xb8, 0x56, 0xfc, 0xf2, 0x0d, 0x51, 0x1e, + 0xf3, 0xe8, 0xba, 0x34, 0x37, 0x35, 0xf2, 0x2f, 0x9e, 0x76, 0x6e, 0x13, + 0x35, 0x71, 0x55, 0x12, 0xc9, 0x1c, 0xb1, 0xb3, 0x71, 0x93, 0x5a, 0x3c, + 0x36, 0xa0, 0xd7, 0x33, 0x88, 0x2a, 0x71, 0x21, 0xc4, 0x6c, 0x4c, 0xfa, + 0x6c, 0x01, 0x07, 0x8b, 0x8d, 0xaf, 0x1b, 0x0f, 0xd4, 0x0b, 0x12, 0x41, + 0xa8, 0xd9, 0xce, 0x3b, 0x04, 0xd7, 0x5f, 0x14, 0xe9, 0x17, 0xe7, 0x06, + 0x84, 0xd3, 0x82, 0x95, 0x28, 0x86, 0x10, 0xe2, 0x10, 0x6b, 0x84, 0x8d, + 0xba, 0x34, 0x95, 0x0a, 0x6d, 0x96, 0xa0, 0x7d, 0xc1, 0x72, 0xdd, 0x93, + 0x31, 0x94, 0x6e, 0xdf, 0x14, 0x00, 0x88, 0xd7, 0x4c, 0x4e, 0x8b, 0x18, + 0x5d, 0xa7, 0xaa, 0x3d, 0x6e, 0x74, 0xe7, 0x88, 0x29, 0xb5, 0xf9, 0xf2, + 0xde, 0x9a, 0x08, 0x4e, 0x68, 0x97, 0x5a, 0xc3, 0x5f, 0x11, 0x93, 0xc1, + 0x56, 0xed, 0xf6, 0xe1, 0x79, 0xdb, 0xf3, 0xd5, 0xcc, 0xd1, 0x67, 0x9c, + 0x23, 0x08, 0x53, 0x0c, 0x68, 0x77, 0x05, 0x32, 0x24, 0xae, 0x57, 0x2c, + 0x21, 0x16, 0xb2, 0x13, 0x4b, 0x89, 0x1f, 0xaa, 0xc2, 0xde, 0x48, 0xb5, + 0xfd, 0x99, 0xb8, 0xee, 0x52, 0xe5, 0x66, 0x6a, 0x63, 0x21, 0xd6, 0xe7, + 0x15, 0x3f, 0x78, 0xda, 0x6c, 0x36, 0x9d, 0x16, 0x9d, 0x2f, 0x15, 0xd6, + 0x49, 0xce, 0x3c, 0x28, 0xb4, 0x84, 0x9c, 0xb1, 0x91, 0xc1, 0x03, 0x32, + 0xef, 0x12, 0xab, 0x03, 0x90, 0x92, 0x15, 0x2d, 0xfe, 0x88, 0x06, 0xc5, + 0x6b, 0xa7, 0xb9, 0x69, 0x67, 0xf9, 0x05, 0x74, 0xf8, 0xaa, 0x34, 0x0f, + 0x2c, 0x8c, 0xa4, 0xb5, 0x03, 0x59, 0x78, 0xd7, 0x1b, 0x6c, 0x6b, 0xaf, + 0x6d, 0xcb, 0xc4, 0xe4, 0x9e, 0x72, 0xbc, 0xe4, 0x94, 0xe8, 0xb3, 0x83, + 0xaa, 0x9b, 0x9c, 0xd6, 0xbc, 0x78, 0xa8, 0x1d, 0x37, 0xa1, 0xce, 0x10, + 0x7e, 0x26, 0x7c, 0x25, 0x75, 0x82, 0x87, 0x72, 0x91, 0xb9, 0x6f, 0x0b, + 0xc2, 0xd4, 0x31, 0xe1, 0x6c, 0x71, 0xc8, 0x2d, 0xd2, 0x6a, 0x53, 0xcf, + 0x7f, 0x82, 0x9b, 0xb9, 0x6a, 0xa9, 0x76, 0xe5, 0x27, 0xd3, 0xc4, 0xd8, + 0x97, 0x85, 0x81, 0xc3, 0x50, 0x32, 0xcf, 0x62, 0x92, 0x0e, 0x36, 0xbc, + 0xd1, 0x6a, 0x0e, 0x91, 0x58, 0x54, 0x85, 0xca, 0x8f, 0x70, 0xf3, 0x40, + 0x00, 0xe2, 0xe1, 0x89, 0xdb, 0x32, 0x51, 0xc5, 0x3b, 0x3c, 0x87, 0xbc, + 0x7b, 0xa5, 0xab, 0x4a, 0x00, 0xfc, 0x26, 0x48, 0xe6, 0x89, 0x35, 0x37, + 0x50, 0x35, 0x77, 0xe4, 0x12, 0xbb, 0x72, 0xa1, 0xd6, 0x1b, 0x7a, 0x26, + 0x8a, 0xb6, 0xe9, 0x44, 0xe8, 0x5b, 0x09, 0xa2, 0xcd, 0x71, 0xa1, 0x53, + 0x0a, 0x46, 0xe5, 0xa2, 0x6b, 0x6b, 0x80, 0xb6, 0x38, 0xdb, 0x99, 0x2b, + 0x40, 0x67, 0x15, 0x53, 0xe4, 0x35, 0xd4, 0xa7, 0x05, 0x8b, 0x9a, 0xd2, + 0x6e, 0x70, 0xde, 0xd5, 0xbb, 0x8e, 0x52, 0x9b, 0xf4, 0xea, 0x1b, 0xc1, + 0x4c, 0xad, 0xcd, 0x52, 0x65, 0x54, 0xdc, 0xbf, 0x65, 0x75, 0x89, 0x4d, + 0x17, 0x78, 0xd8, 0xf3, 0xc8, 0xd6, 0xb9, 0xd2, 0x3b, 0x82, 0x0e, 0xcd, + 0x90, 0x37, 0x02, 0xae, 0x54, 0x32, 0xca, 0x35, 0x02, 0xdb, 0x9d, 0xb9, + 0x55, 0xca, 0xfc, 0xa5, 0xad, 0x32, 0x96, 0xd4, 0x1c, 0xf2, 0xda, 0xee, + 0xc9, 0x7f, 0x35, 0xa4, 0xde, 0x4b, 0x16, 0xa4, 0xda, 0x6c, 0xda, 0x0a, + 0xf8, 0x7c, 0xd5, 0x22, 0x22, 0x2f, 0xc9, 0x26, 0xbc, 0x80, 0xbb, 0x47, + 0x2d, 0x22, 0x4f, 0x1b, 0x13, 0x54, 0xe4, 0xb4, 0xda, 0x5b, 0xea, 0xa8, + 0x48, 0xe0, 0x15, 0x6a, 0x38, 0x2a, 0x9c, 0xd2, 0xb4, 0x5e, 0x0e, 0x4d, + 0xa9, 0xe4, 0x5b, 0x1c, 0x72, 0x99, 0xb8, 0x51, 0x68, 0x82, 0x7c, 0x95, + 0x1b, 0x2e, 0x2b, 0x4e, 0x3e, 0x61, 0xdc, 0x15, 0x5c, 0x4f, 0x15, 0x7e, + 0x58, 0x90, 0xdc, 0x73, 0x5a, 0xd6, 0x83, 0x35, 0x27, 0x31, 0xb9, 0xbb, + 0x08, 0x4d, 0x9c, 0x36, 0x86, 0x17, 0x66, 0xcf, 0x3b, 0xfa, 0x64, 0xd2, + 0x32, 0x0a, 0x8f, 0x54, 0x33, 0xd5, 0x50, 0x90, 0xaa, 0x27, 0xc1, 0x6e, + 0xe2, 0x99, 0xc3, 0x50, 0xcd, 0xa6, 0x4a, 0xb5, 0xb0, 0x6c, 0x12, 0x4c, + 0x82, 0xd1, 0x21, 0xc8, 0xe8, 0xe5, 0xce, 0x12, 0x92, 0xce, 0x96, 0xd4, + 0xd8, 0x6c, 0x19, 0xd1, 0x5d, 0x70, 0x09, 0xf1, 0x22, 0x31, 0xd9, 0xfb, + 0x49, 0x08, 0x45, 0x18, 0x1c, 0x2b, 0x92, 0x62, 0x1f, 0x9a, 0xd2, 0x74, + 0xb8, 0x2b, 0xb3, 0xb8, 0xa3, 0x21, 0x2d, 0x78, 0x67, 0xc5, 0x64, 0xe6, + 0xbc, 0xb6, 0x7b, 0x02, 0xd2, 0x71, 0x77, 0x1b, 0x34, 0x32, 0x5b, 0xd5, + 0x5a, 0xb6, 0x85, 0x88, 0x2b, 0xf2, 0xba, 0xd6, 0x68, 0x74, 0x82, 0xa9, + 0x9e, 0x50, 0xf0, 0x04, 0xb8, 0xe5, 0x90, 0xaa, 0x0e, 0x73, 0x08, 0x69, + 0xdb, 0xa8, 0xa1, 0x57, 0xcf, 0xc9, 0x5c, 0xd5, 0x81, 0xa9, 0xce, 0xdf, + 0x6c, 0x00, 0xe2, 0x17, 0xb5, 0x26, 0x7b, 0xd5, 0x1c, 0xd4, 0x18, 0xc0, + 0x09, 0x55, 0x60, 0x43, 0x38, 0x44, 0x07, 0x6c, 0x82, 0x71, 0x9d, 0x26, + 0xaf, 0xc9, 0x42, 0xaf, 0x9a, 0x7c, 0x46, 0xc5, 0xcd, 0x2e, 0x4d, 0x14, + 0x86, 0x06, 0xd8, 0x74, 0x28, 0xe6, 0xe7, 0x39, 0xd3, 0x98, 0x42, 0xaa, + 0x43, 0x2d, 0x61, 0xcc, 0xf1, 0x5d, 0x97, 0xf3, 0x64, 0xbd, 0x5f, 0x62, + 0xfb, 0x0d, 0xd4, 0x36, 0x6c, 0x71, 0x58, 0x5d, 0xcb, 0x25, 0x08, 0xb3, + 0x37, 0x3a, 0x41, 0x48, 0x0d, 0x15, 0x72, 0xdd, 0x93, 0xe5, 0x52, 0x51, + 0x84, 0xbd, 0xea, 0x21, 0x16, 0x27, 0x46, 0x98, 0x76, 0xd2, 0xb3, 0x01, + 0x33, 0x3e, 0xe3, 0x93, 0x99, 0x52, 0xc9, 0xcd, 0xb3, 0xd8, 0xa7, 0x9a, + 0x01, 0xcb, 0x72, 0x3a, 0xdd, 0xca, 0xa6, 0x6b, 0x49, 0xb5, 0x1b, 0x42, + 0xcd, 0xbd, 0xa6, 0xa0, 0xf7, 0x0b, 0xca, 0xc4, 0x79, 0xaa, 0xea, 0xa4, + 0x1c, 0x65, 0xbb, 0x25, 0x14, 0xc1, 0x97, 0x05, 0x27, 0xc4, 0x73, 0x86, + 0xee, 0xe6, 0x32, 0x89, 0x99, 0x78, 0xae, 0xb1, 0x8f, 0x11, 0x7c, 0x00, + 0xcb, 0xbd, 0x69, 0x68, 0xf7, 0x3b, 0xd4, 0xa2, 0x09, 0x9d, 0xe1, 0x1a, + 0x4b, 0x8a, 0x6e, 0xa1, 0xb9, 0x6e, 0x0a, 0xe6, 0xab, 0x82, 0xb9, 0x61, + 0x58, 0x1b, 0xc9, 0x4e, 0x81, 0x16, 0xc0, 0x3d, 0x5c, 0x31, 0xef, 0x29, + 0x43, 0x8a, 0x1c, 0x3c, 0x55, 0xcd, 0x2a, 0x90, 0x61, 0xf3, 0xfe, 0xeb, + 0x0e, 0x67, 0xd2, 0xd5, 0x5b, 0xc9, 0xaa, 0x67, 0x58, 0xd1, 0x32, 0xda, + 0x85, 0x38, 0x7e, 0xc9, 0xde, 0x8b, 0xfd, 0xd8, 0x5c, 0xc2, 0x94, 0x56, + 0x98, 0x4e, 0xdf, 0x78, 0x59, 0xd0, 0xde, 0x1e, 0xdd, 0xe0, 0xe5, 0x77, + 0x0d, 0x45, 0xea, 0xf5, 0xbd, 0x5d, 0x67, 0xe7, 0x6d, 0x46, 0x59, 0xaa, + 0xeb, 0xa6, 0x2a, 0xb0, 0x9c, 0x97, 0xea, 0x28, 0xaa, 0x3b, 0xce, 0x63, + 0x22, 0x49, 0xa8, 0xb9, 0xc6, 0x6e, 0x36, 0x18, 0xe6, 0xe8, 0x92, 0x36, + 0x2d, 0x17, 0xcf, 0x8a, 0xab, 0x27, 0xc1, 0x69, 0x35, 0xcd, 0xf2, 0x58, + 0xb5, 0xf4, 0x05, 0x69, 0x04, 0x35, 0x02, 0xaa, 0xfd, 0x47, 0xf8, 0x78, + 0x57, 0x7b, 0xc5, 0x06, 0x36, 0xce, 0x7f, 0x56, 0x27, 0xbe, 0x4b, 0x7e, + 0x59, 0x96, 0x66, 0xbb, 0xe2, 0x6d, 0x17, 0x5d, 0x06, 0x21, 0x74, 0x3d, + 0xa4, 0x5e, 0x38, 0xa9, 0x1a, 0x45, 0x17, 0x8c, 0x8e, 0xe1, 0xa8, 0xf3, + 0xd4, 0x92, 0x24, 0xc7, 0x5f, 0x3c, 0x8e, 0xa2, 0xa8, 0x54, 0xd1, 0x2a, + 0x8e, 0x07, 0x8a, 0xab, 0x79, 0x6b, 0xee, 0xc9, 0x3c, 0xd3, 0x6e, 0xe5, + 0x42, 0xae, 0xef, 0x79, 0xbb, 0x5b, 0x96, 0xe5, 0x56, 0x05, 0x31, 0x31, + 0xc0, 0xad, 0xbc, 0xd5, 0x09, 0x54, 0x70, 0x5b, 0x39, 0xab, 0x87, 0x35, + 0x87, 0xd5, 0x60, 0xf5, 0x58, 0x3d, 0x55, 0x64, 0x15, 0xeb, 0xb4, 0x21, + 0x6d, 0x77, 0x15, 0x77, 0x73, 0x21, 0x1c, 0xdd, 0xb9, 0x68, 0x26, 0xab, + 0xa2, 0xab, 0x5b, 0x13, 0x02, 0x7e, 0x0b, 0x71, 0xdc, 0x54, 0x93, 0x62, + 0x43, 0xc1, 0x78, 0xfd, 0x93, 0x5e, 0xdb, 0x8a, 0x22, 0x5a, 0x8f, 0x3d, + 0x4d, 0x56, 0x7c, 0x3f, 0x31, 0x68, 0x17, 0xb6, 0x8a, 0x70, 0xe3, 0x11, + 0xc6, 0xaa, 0x8e, 0x63, 0xfd, 0x17, 0x64, 0x7c, 0x8a, 0xac, 0x37, 0xf2, + 0x55, 0x69, 0xe5, 0x92, 0xfc, 0x98, 0x4f, 0x25, 0x85, 0x5d, 0x25, 0x57, + 0x05, 0x57, 0x15, 0x74, 0xf8, 0xa9, 0xc8, 0x05, 0x33, 0xab, 0x69, 0x86, + 0x1a, 0xd2, 0xb0, 0x72, 0x55, 0x12, 0xd6, 0xd0, 0x6a, 0x80, 0xf8, 0xa9, + 0x64, 0x0d, 0x66, 0x8f, 0x25, 0x71, 0xee, 0xb5, 0x2a, 0x65, 0xbc, 0xf5, + 0x37, 0xa2, 0xc2, 0x34, 0x85, 0x41, 0x47, 0xa3, 0x44, 0xb8, 0xdd, 0xa9, + 0xae, 0xa2, 0xf5, 0x49, 0x95, 0xa4, 0xd2, 0x5b, 0xb8, 0x2d, 0x19, 0xcb, + 0xe6, 0xb5, 0xd5, 0x3b, 0xf0, 0xeb, 0x66, 0x54, 0xce, 0xb2, 0x59, 0x70, + 0x0f, 0x25, 0x49, 0x85, 0x47, 0xfa, 0x2a, 0x16, 0x95, 0x87, 0xd5, 0x76, + 0x65, 0x76, 0x6e, 0xe4, 0xb0, 0xbf, 0x92, 0xc2, 0xfe, 0x4b, 0x03, 0x97, + 0x67, 0xcd, 0x7b, 0xa1, 0x55, 0xe3, 0x92, 0x10, 0xda, 0xfc, 0xe2, 0x2f, + 0xd4, 0xb1, 0xde, 0x36, 0x49, 0xd6, 0xf8, 0x29, 0xeb, 0xf1, 0x05, 0xb4, + 0xf9, 0x2a, 0x43, 0x3e, 0x6b, 0x63, 0x56, 0x93, 0x89, 0x54, 0x1a, 0xce, + 0xbd, 0x9e, 0x6a, 0xfd, 0x31, 0x7e, 0x4b, 0xb2, 0x62, 0xf4, 0x58, 0xb2, + 0x6c, 0x57, 0xe5, 0xb9, 0x50, 0x2b, 0xda, 0x3d, 0x51, 0x6f, 0x5b, 0x76, + 0xe0, 0xaa, 0xe2, 0x75, 0x7f, 0x30, 0xbf, 0x57, 0x32, 0xbc, 0x3b, 0xe7, + 0x57, 0x0f, 0x1e, 0xd3, 0xbb, 0x56, 0xd7, 0x6f, 0x19, 0x4e, 0xbe, 0x61, + 0x6e, 0x2a, 0x46, 0xc5, 0xca, 0xe5, 0x72, 0xb9, 0x5d, 0x92, 0xe5, 0x72, + 0xa8, 0x57, 0x77, 0x12, 0xd3, 0x50, 0x56, 0x70, 0xc1, 0xfa, 0x84, 0x1e, + 0xda, 0x83, 0xac, 0x2e, 0x53, 0x37, 0xeb, 0x33, 0xb6, 0x6d, 0x40, 0x8b, + 0xb5, 0x33, 0x2b, 0xc3, 0xbe, 0x66, 0x33, 0xb4, 0x3e, 0x8a, 0x7a, 0xb2, + 0xcd, 0xad, 0xca, 0x1b, 0xdc, 0x64, 0xea, 0x85, 0x4e, 0xfc, 0x58, 0xe1, + 0xc0, 0xac, 0xc7, 0x0f, 0x67, 0xb7, 0x59, 0x9a, 0x30, 0xb7, 0x5d, 0xd5, + 0x3a, 0xed, 0x9a, 0x8a, 0xdf, 0xb9, 0x57, 0x5e, 0xe6, 0xeb, 0x73, 0x59, + 0x58, 0x9f, 0xa2, 0x24, 0xd4, 0xeb, 0x19, 0x5b, 0xe9, 0x94, 0xf7, 0x29, + 0x85, 0xa5, 0x4e, 0xfd, 0x76, 0xaf, 0x34, 0x62, 0x3d, 0xc3, 0x32, 0x25, + 0xfb, 0xed, 0x49, 0x9c, 0xd5, 0x7b, 0x80, 0xd5, 0xcc, 0xd0, 0x2c, 0xc8, + 0x34, 0x1f, 0x16, 0xbc, 0x1e, 0x68, 0xef, 0xee, 0xb4, 0x2b, 0x4a, 0x8a, + 0x9f, 0x72, 0x97, 0x14, 0x5c, 0x7b, 0x8e, 0x6b, 0xf4, 0x9a, 0xa6, 0xd3, + 0x31, 0x93, 0x79, 0x55, 0xe5, 0xdc, 0xa6, 0x81, 0xd4, 0xe7, 0x3c, 0xc8, + 0x29, 0x0d, 0x18, 0x7b, 0xbb, 0x80, 0x1e, 0xeb, 0x97, 0x80, 0xee, 0xf4, + 0x55, 0xaa, 0xad, 0x15, 0x0f, 0xdc, 0x33, 0x37, 0x2f, 0x94, 0x5d, 0xdc, + 0xe6, 0xd3, 0x25, 0x2c, 0x3d, 0xd4, 0xb0, 0xf9, 0x5b, 0x9b, 0x8e, 0x68, + 0xf1, 0x52, 0x84, 0x27, 0xe2, 0x56, 0x73, 0xdd, 0x9c, 0x7b, 0x8c, 0xf6, + 0x77, 0x9a, 0x09, 0xaa, 0xd1, 0x5e, 0x7e, 0xe0, 0xaa, 0xcd, 0x6e, 0x0f, + 0xd7, 0xee, 0xa0, 0x42, 0x98, 0xb1, 0xa6, 0xe0, 0x14, 0xa1, 0x37, 0xcc, + 0xa9, 0xbd, 0xc5, 0xdd, 0xca, 0x5d, 0xe2, 0x67, 0x44, 0x2a, 0x0a, 0xef, + 0x3f, 0x71, 0x4c, 0xd0, 0x2c, 0xd6, 0xd1, 0x9f, 0xaf, 0x79, 0xa2, 0xaf, + 0x72, 0xf0, 0x53, 0x31, 0x00, 0x5a, 0x0d, 0x2e, 0xf4, 0x57, 0xe6, 0x0f, + 0x97, 0xba, 0xcf, 0xbc, 0x4b, 0x14, 0x3d, 0xdb, 0x94, 0xda, 0x66, 0x3e, + 0xe0, 0x93, 0xa2, 0x00, 0x77, 0x29, 0x87, 0x4f, 0xc1, 0x57, 0x0e, 0xed, + 0x65, 0xe7, 0x92, 0xed, 0x07, 0x9a, 0xa7, 0x70, 0xbb, 0x59, 0x32, 0xd9, + 0x0c, 0xb7, 0x85, 0x88, 0x4f, 0xbb, 0x4c, 0xf7, 0xa9, 0xb0, 0xc9, 0x49, + 0xda, 0x2e, 0xee, 0x32, 0x1a, 0xd7, 0x4d, 0xd9, 0xb4, 0xbd, 0x39, 0xa7, + 0x2d, 0x55, 0xfa, 0x8d, 0x27, 0x01, 0xc5, 0x63, 0x9f, 0x05, 0x5e, 0x90, + 0xe3, 0xf5, 0x37, 0xfb, 0xa1, 0xd5, 0x3d, 0xb1, 0x58, 0x3d, 0xd5, 0x87, + 0x37, 0xcb, 0xba, 0xdc, 0x16, 0x15, 0x84, 0xf3, 0x57, 0x1e, 0x6a, 0xe5, + 0x33, 0x11, 0xb2, 0xdc, 0x2f, 0x5a, 0x2d, 0x99, 0xde, 0x55, 0x27, 0x25, + 0x8f, 0xd5, 0x54, 0xac, 0x5e, 0x8a, 0xae, 0x25, 0x7b, 0xcb, 0x6f, 0x35, + 0xa3, 0x1b, 0x37, 0x8a, 0x9b, 0x22, 0x75, 0x83, 0x84, 0x95, 0x67, 0x3f, + 0x15, 0x7f, 0x35, 0x51, 0xf7, 0x55, 0xea, 0xf7, 0xc5, 0xf9, 0x5a, 0xd5, + 0x28, 0x30, 0xc3, 0x3d, 0x55, 0x4b, 0xcf, 0xd2, 0x64, 0xb4, 0x1b, 0x15, + 0xae, 0xf1, 0x88, 0xb4, 0xdd, 0x17, 0xca, 0x2a, 0xd2, 0x73, 0x8f, 0x83, + 0xa5, 0xaa, 0x90, 0xd6, 0x55, 0xde, 0x4b, 0x40, 0x4b, 0xc4, 0xa9, 0xb8, + 0xcd, 0x75, 0x82, 0xcd, 0xea, 0xb9, 0x2f, 0xcb, 0x8d, 0x90, 0x5a, 0xb4, + 0xfa, 0x41, 0x3c, 0x1a, 0xa9, 0x1a, 0x20, 0xf2, 0x5e, 0xf4, 0xb8, 0xab, + 0x8e, 0x4c, 0x52, 0xf2, 0x53, 0x67, 0xb5, 0x1e, 0xaa, 0xad, 0x2d, 0x58, + 0x87, 0x76, 0xa1, 0x92, 0x96, 0x76, 0x70, 0xf9, 0x94, 0xdb, 0x15, 0xcd, + 0xf0, 0xd8, 0xb4, 0xb3, 0x1f, 0xc5, 0xab, 0x4b, 0xa3, 0xb7, 0xf0, 0xb8, + 0x85, 0x58, 0x51, 0x1b, 0xc0, 0x85, 0x8a, 0x23, 0x7f, 0x0a, 0xfb, 0x44, + 0xb8, 0x85, 0x4e, 0x93, 0x0f, 0x9a, 0xed, 0x58, 0x7f, 0x18, 0x58, 0x9b, + 0xf9, 0x82, 0xf6, 0xae, 0x60, 0xf3, 0x5a, 0x2e, 0x32, 0x0a, 0x9a, 0xbd, + 0xca, 0xb5, 0xef, 0xe6, 0x1c, 0x27, 0x4c, 0x6d, 0x55, 0xd2, 0x2a, 0x6d, + 0xa2, 0xa9, 0x57, 0xab, 0xf2, 0xd2, 0x6a, 0xf2, 0xb4, 0xba, 0x43, 0x19, + 0xe6, 0x14, 0x83, 0xe1, 0xc6, 0x6e, 0xf9, 0x2d, 0x38, 0x23, 0xc9, 0x60, + 0x97, 0x9a, 0x9c, 0xf3, 0x5b, 0xe2, 0xa4, 0x26, 0xfe, 0x0a, 0x90, 0x3f, + 0x99, 0x7d, 0x9f, 0xf9, 0x97, 0xd9, 0xff, 0x00, 0x99, 0x76, 0x1f, 0xcc, + 0xbb, 0x03, 0xcd, 0x48, 0x68, 0xbb, 0x71, 0xc9, 0x57, 0x85, 0x49, 0xbb, + 0x82, 0xd1, 0x6c, 0xb8, 0xaa, 0xba, 0xc4, 0x94, 0xb6, 0x6a, 0x2f, 0x54, + 0x71, 0x5b, 0xd4, 0x95, 0x67, 0xcf, 0x51, 0x47, 0x2b, 0xe6, 0xb4, 0x9a, + 0xaa, 0xd2, 0x15, 0x22, 0x01, 0xc5, 0x50, 0xcf, 0x5b, 0x57, 0x05, 0x8c, + 0x2c, 0x4b, 0x6f, 0x25, 0xa2, 0xd7, 0x15, 0x48, 0x7f, 0xcc, 0x16, 0x01, + 0xf9, 0x97, 0x62, 0xef, 0x25, 0x27, 0x68, 0x9f, 0x9a, 0x9a, 0x9d, 0xeb, + 0x75, 0xac, 0x60, 0x2b, 0xf3, 0x95, 0xdd, 0xfb, 0x4a, 0x20, 0xe0, 0x17, + 0xb3, 0x6f, 0x99, 0x58, 0xd6, 0x69, 0x67, 0x58, 0xd5, 0xf6, 0x77, 0x8f, + 0x35, 0xd8, 0xbf, 0x9a, 0xa7, 0x47, 0x3f, 0x99, 0x53, 0xa3, 0x8f, 0x37, + 0x2a, 0x42, 0x86, 0x15, 0x04, 0x31, 0xf8, 0x57, 0x69, 0x2e, 0x01, 0x56, + 0x33, 0xf9, 0xad, 0x27, 0x13, 0xc4, 0xab, 0xac, 0x55, 0xc6, 0x56, 0xa8, + 0xb3, 0xc1, 0xcd, 0x0a, 0xae, 0x27, 0x53, 0x22, 0xb7, 0x8e, 0xed, 0x4c, + 0x9a, 0x0f, 0x2d, 0xe0, 0xab, 0x27, 0xf1, 0x5a, 0x6c, 0x23, 0x82, 0xed, + 0x00, 0xe2, 0xa8, 0x41, 0xe1, 0x93, 0x14, 0xf8, 0x2d, 0x1a, 0x2a, 0xc4, + 0x92, 0xed, 0x1c, 0x55, 0x5e, 0xe1, 0xe6, 0xaf, 0x25, 0x54, 0xa9, 0x35, + 0x54, 0xab, 0xd5, 0xeb, 0x12, 0x95, 0xea, 0x60, 0x03, 0xc4, 0x4d, 0x5f, + 0x2f, 0xc2, 0xa4, 0xf2, 0x3f, 0x2a, 0xc4, 0xa8, 0x6c, 0x54, 0x2a, 0x09, + 0x58, 0xf0, 0xb5, 0xb9, 0x52, 0x23, 0xb9, 0xac, 0x60, 0xf1, 0x55, 0x6b, + 0x0a, 0xd2, 0x67, 0x22, 0xae, 0x7a, 0xd1, 0x86, 0x7c, 0xca, 0xd1, 0x63, + 0x56, 0xc1, 0xe4, 0xb1, 0x2c, 0x4b, 0x12, 0xbd, 0x5e, 0x15, 0xed, 0x57, + 0xb5, 0x7b, 0xab, 0x62, 0xc1, 0x0f, 0xf2, 0xae, 0xce, 0x1f, 0xe5, 0x5d, + 0x8c, 0x2f, 0xca, 0xab, 0xd1, 0xa1, 0x1f, 0xc2, 0xb4, 0xba, 0x23, 0x7c, + 0x8a, 0x98, 0x6b, 0xd8, 0xbb, 0x59, 0x71, 0x54, 0x8d, 0x0f, 0xf3, 0x2c, + 0x40, 0xf0, 0xc9, 0x37, 0x99, 0x29, 0x42, 0x67, 0x99, 0x5a, 0x4e, 0x36, + 0x33, 0x55, 0xd6, 0x6f, 0x5a, 0x25, 0xa3, 0xea, 0x74, 0x95, 0x7a, 0x44, + 0x31, 0xc1, 0x76, 0xe4, 0xf0, 0x6a, 0xed, 0x5f, 0xf9, 0x42, 0xa4, 0x69, + 0xfe, 0x15, 0x57, 0x05, 0x89, 0x6d, 0xe4, 0xbd, 0xe5, 0x7b, 0x96, 0x22, + 0xb1, 0x9e, 0x4b, 0xb4, 0xf4, 0x55, 0x88, 0xe3, 0xe4, 0xb3, 0x5b, 0x41, + 0x6f, 0x49, 0xe1, 0xbc, 0x55, 0x09, 0x79, 0xf0, 0x5a, 0x0d, 0x0c, 0x53, + 0x7c, 0x43, 0x2e, 0xf7, 0x72, 0xb9, 0x68, 0xd3, 0x82, 0x91, 0x79, 0x21, + 0x5d, 0x92, 0xb5, 0x54, 0x12, 0x55, 0x2b, 0x47, 0x59, 0x4c, 0x9b, 0x16, + 0xc5, 0x7a, 0xc6, 0x56, 0x29, 0xe5, 0xa1, 0x5b, 0xd7, 0xf6, 0x5f, 0xd9, + 0x5e, 0x56, 0x23, 0xcd, 0x62, 0xf5, 0x58, 0xc7, 0x35, 0x8c, 0x2c, 0x4b, + 0x69, 0x54, 0x6f, 0x32, 0xb4, 0x5a, 0xd5, 0x59, 0x64, 0xba, 0x5c, 0x55, + 0xe5, 0x57, 0xf5, 0x52, 0x9c, 0xcf, 0x80, 0x57, 0x2f, 0xee, 0xae, 0xf5, + 0x58, 0x4a, 0x90, 0x74, 0x8e, 0xeb, 0x95, 0x17, 0xee, 0xa6, 0x45, 0x32, + 0x4b, 0x34, 0x79, 0xa9, 0x98, 0x14, 0xde, 0xd2, 0xb0, 0xbd, 0xab, 0x17, + 0xa2, 0xc4, 0xa9, 0x10, 0xf9, 0x39, 0x69, 0x17, 0x3f, 0x89, 0x57, 0x15, + 0x71, 0xe4, 0xae, 0x57, 0xad, 0x2a, 0xad, 0x10, 0x02, 0xbe, 0xd5, 0x02, + 0xb8, 0x2d, 0x96, 0x2f, 0xb1, 0x43, 0x25, 0x55, 0xb9, 0x50, 0xac, 0x44, + 0x2d, 0x8e, 0x5d, 0x97, 0xaa, 0xac, 0x3f, 0x55, 0x87, 0xd5, 0x68, 0x06, + 0x8e, 0x2a, 0xb1, 0x39, 0x15, 0x5e, 0xf9, 0x76, 0x5b, 0x8a, 0xfe, 0xeb, + 0x13, 0x42, 0xc6, 0xa8, 0x26, 0xa8, 0x24, 0xaf, 0x55, 0x3a, 0xfb, 0xd5, + 0xf6, 0x36, 0xab, 0x8a, 0xc2, 0x56, 0x05, 0x81, 0x55, 0x8a, 0xb0, 0xd7, + 0xd8, 0xe1, 0x3b, 0x88, 0x5a, 0x1d, 0x0f, 0xa3, 0xb3, 0xff, 0x00, 0xae, + 0x6a, 0xa4, 0x0e, 0x0d, 0x92, 0xbd, 0x62, 0x57, 0xd8, 0x9a, 0xa8, 0xe4, + 0xaf, 0x55, 0x2a, 0x73, 0x91, 0xf0, 0x2a, 0x91, 0x8a, 0xed, 0x82, 0xed, + 0x42, 0xed, 0xbf, 0x45, 0x39, 0xcc, 0xef, 0x57, 0xad, 0xaa, 0x40, 0x48, + 0x65, 0xf6, 0x92, 0x2c, 0xdd, 0x7a, 0xec, 0x67, 0xf8, 0x42, 0x94, 0x28, + 0x39, 0x8e, 0xdf, 0x45, 0x3c, 0xee, 0x4b, 0x11, 0xc9, 0x76, 0xa6, 0x93, + 0x57, 0xeb, 0xe8, 0x72, 0x55, 0xaa, 0xf2, 0x15, 0x1e, 0xb6, 0x2b, 0x95, + 0xca, 0xe5, 0x75, 0xab, 0xd5, 0xfa, 0x8e, 0xd9, 0xdf, 0x95, 0x76, 0xce, + 0xe4, 0xbb, 0x57, 0x72, 0x5d, 0xab, 0xf9, 0x2e, 0xd1, 0xeb, 0x1b, 0xd7, + 0xbf, 0xcd, 0x61, 0x77, 0x35, 0xd9, 0x9e, 0x6b, 0xb2, 0xf5, 0x54, 0x82, + 0x39, 0xae, 0xc9, 0x8b, 0x03, 0x02, 0xd8, 0x16, 0x25, 0x89, 0x5e, 0x55, + 0xcb, 0x0a, 0xb9, 0x5c, 0xae, 0x57, 0x2b, 0xbb, 0x8d, 0xf9, 0x6e, 0xb1, + 0x7d, 0xab, 0x95, 0xca, 0xe5, 0x72, 0xb9, 0x5c, 0xae, 0x57, 0x15, 0xb5, + 0x5c, 0x56, 0xd5, 0x71, 0x57, 0x1c, 0x97, 0x2b, 0x95, 0xda, 0x8b, 0xca, + 0xc4, 0xb1, 0xac, 0x4a, 0xfd, 0x45, 0xea, 0xfe, 0xe9, 0x79, 0x58, 0x96, + 0x25, 0xee, 0x9f, 0x25, 0x81, 0x8b, 0xb2, 0x6a, 0xec, 0x7d, 0x57, 0x67, + 0xea, 0xb0, 0x3b, 0x9a, 0xb9, 0xfc, 0xd5, 0xef, 0x58, 0xa2, 0x2e, 0xd1, + 0xfc, 0x97, 0x6a, 0xfe, 0x4b, 0xb5, 0x7f, 0x25, 0xdb, 0x3b, 0xf2, 0xae, + 0xd9, 0xdf, 0x95, 0x76, 0xce, 0xfc, 0xab, 0x6a, 0xda, 0xb6, 0xe4, 0xb9, + 0x5c, 0xae, 0x2a, 0xe2, 0xae, 0x2a, 0xe2, 0xae, 0x58, 0x4a, 0xc2, 0x55, + 0xc5, 0x7b, 0xcb, 0xde, 0x5e, 0xf2, 0xf7, 0x96, 0xd5, 0x72, 0xc2, 0xae, + 0x57, 0x65, 0xbf, 0xb8, 0xdc, 0xae, 0x58, 0x56, 0x15, 0x85, 0x61, 0x58, + 0x0a, 0xc0, 0x56, 0x02, 0xb0, 0x95, 0x84, 0xac, 0x25, 0x61, 0x2b, 0x0b, + 0x96, 0x17, 0x2c, 0x2e, 0x58, 0x5c, 0xb0, 0x9e, 0x4b, 0x09, 0xe4, 0xb0, + 0x95, 0x84, 0xf2, 0x58, 0x4f, 0x25, 0x84, 0xf2, 0x58, 0x4f, 0x25, 0x84, + 0xac, 0x25, 0x61, 0x2b, 0x09, 0x58, 0x4a, 0xc2, 0xe5, 0x85, 0xcb, 0x09, + 0x58, 0x4a, 0xc0, 0x56, 0x02, 0xb0, 0x15, 0x84, 0xac, 0x0b, 0x02, 0xc2, + 0xb0, 0xab, 0x95, 0xca, 0xed, 0x7d, 0xea, 0xfc, 0xb7, 0x2c, 0x2b, 0x0a, + 0xc2, 0xb0, 0x95, 0x84, 0xab, 0x8a, 0xb8, 0xab, 0x8a, 0xda, 0xb6, 0xf2, + 0x5b, 0x79, 0x2d, 0xbc, 0x96, 0xde, 0x4b, 0x6f, 0x25, 0x71, 0xe4, 0xae, + 0x3c, 0x96, 0xde, 0x4a, 0xf3, 0xc9, 0x5e, 0xee, 0x4b, 0x13, 0xb9, 0x2c, + 0x45, 0x5e, 0x56, 0xd5, 0xff, 0xc4, 0x00, 0x29, 0x10, 0x00, 0x02, 0x01, + 0x02, 0x05, 0x03, 0x04, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x11, 0x21, 0x31, 0x10, 0x41, 0x51, 0x61, 0x71, 0x20, + 0x81, 0x91, 0xa1, 0xb1, 0xc1, 0xf0, 0x30, 0xd1, 0xf1, 0xe1, 0x40, 0xff, + 0xda, 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x3f, 0x21, 0xff, 0x00, 0x96, + 0x7a, 0x27, 0x09, 0xe9, 0x92, 0x49, 0x24, 0x92, 0x49, 0x27, 0xf0, 0x80, + 0x40, 0x81, 0x12, 0x24, 0x48, 0x91, 0x20, 0x40, 0x81, 0x12, 0x24, 0x48, + 0x1c, 0x82, 0x89, 0xb7, 0x73, 0x7b, 0xcc, 0xfe, 0xe8, 0xf5, 0xbe, 0x08, + 0xcc, 0x37, 0x84, 0x24, 0x5d, 0xb0, 0xb5, 0x9e, 0x44, 0x9f, 0xf6, 0xcd, + 0xa6, 0x0d, 0xfc, 0xde, 0x81, 0x43, 0x3f, 0xc0, 0x1f, 0xc4, 0x1f, 0xc8, + 0x61, 0xcf, 0xe6, 0x8f, 0xe2, 0xba, 0x94, 0xad, 0x6b, 0x5f, 0xcd, 0x3f, + 0x86, 0x7f, 0x00, 0xfe, 0x21, 0xfc, 0x43, 0xf9, 0x87, 0xf0, 0x0f, 0xe4, + 0x9f, 0xc9, 0x3f, 0x80, 0x7f, 0x00, 0xfe, 0x01, 0xfc, 0x83, 0xf9, 0x07, + 0xf0, 0x0f, 0xe0, 0x9f, 0xc1, 0x3f, 0x8a, 0x7f, 0x14, 0xfe, 0x29, 0xfc, + 0x5c, 0x4d, 0x6f, 0xe1, 0x8f, 0xe1, 0x0f, 0xe3, 0x0f, 0xe7, 0x4f, 0xe0, + 0x7a, 0x2a, 0x8f, 0x7f, 0x1f, 0x02, 0x9b, 0x27, 0xa9, 0x3f, 0xfb, 0x63, + 0x19, 0x1d, 0xc6, 0x2c, 0xb3, 0x25, 0xbe, 0x54, 0x19, 0xf2, 0xb5, 0x58, + 0x45, 0x9a, 0x36, 0x1e, 0x4d, 0xa1, 0xbc, 0x8d, 0xe4, 0x6d, 0x30, 0x10, + 0xd4, 0x8e, 0xa4, 0x75, 0x39, 0xf5, 0x62, 0x70, 0x49, 0x24, 0x92, 0x4f, + 0xe5, 0x9f, 0xc7, 0x04, 0x10, 0x41, 0x04, 0x10, 0x41, 0x04, 0x11, 0x82, + 0x06, 0x87, 0x24, 0xb0, 0x9d, 0x89, 0x39, 0x24, 0x96, 0x53, 0x9a, 0x31, + 0x82, 0x44, 0x89, 0x10, 0xc9, 0x12, 0x25, 0x82, 0x37, 0xc1, 0x0c, 0xae, + 0xa5, 0x4a, 0x95, 0x2b, 0xd5, 0x52, 0x77, 0x16, 0xe2, 0x45, 0xff, 0x00, + 0x24, 0x92, 0x49, 0x38, 0xd7, 0x18, 0x62, 0x19, 0x29, 0x66, 0x41, 0x87, + 0x02, 0xb2, 0xda, 0xa4, 0x5c, 0xee, 0x09, 0x49, 0xeb, 0x96, 0x4b, 0x52, + 0x7a, 0xb3, 0x70, 0xde, 0x66, 0xf0, 0xb5, 0x30, 0xa6, 0x23, 0x11, 0x26, + 0xa2, 0x47, 0xff, 0x00, 0x0c, 0x75, 0x41, 0x04, 0x10, 0x41, 0x04, 0x10, + 0x41, 0x04, 0x10, 0x41, 0x04, 0x60, 0x78, 0x18, 0xf2, 0x15, 0xb4, 0x70, + 0x1e, 0x25, 0x8a, 0xcc, 0x5b, 0x09, 0x93, 0xc3, 0x2d, 0x09, 0x68, 0x4b, + 0x43, 0x89, 0x3d, 0x06, 0xf8, 0x64, 0x4f, 0xf1, 0xa4, 0x10, 0x41, 0x1d, + 0x0b, 0xf0, 0x49, 0x3d, 0x33, 0xd0, 0xef, 0x13, 0xc8, 0xf2, 0xd1, 0xa7, + 0x52, 0x1c, 0x98, 0xc1, 0xe4, 0x24, 0x3d, 0x51, 0x93, 0x78, 0x3d, 0x67, + 0x91, 0xeb, 0xb0, 0x12, 0x27, 0xa9, 0x32, 0x63, 0xa9, 0x4e, 0x3f, 0x78, + 0xbf, 0x3c, 0x92, 0x4e, 0x22, 0x75, 0x98, 0x9f, 0x31, 0xab, 0xd0, 0x49, + 0x65, 0x7a, 0x27, 0x09, 0xff, 0x00, 0x8e, 0x30, 0x82, 0x08, 0xc5, 0x4c, + 0xf2, 0x2c, 0x4e, 0xcf, 0x58, 0xe1, 0x9f, 0x0e, 0x9f, 0x73, 0xe0, 0x95, + 0xf2, 0x2b, 0xa3, 0x94, 0x39, 0xbb, 0x59, 0x2e, 0x51, 0x99, 0x47, 0x77, + 0xfa, 0x33, 0x1e, 0x26, 0x6a, 0xaf, 0x6f, 0xf6, 0x23, 0x76, 0xed, 0x87, + 0x9b, 0xd0, 0xca, 0x65, 0x33, 0x26, 0x76, 0x32, 0x20, 0x9d, 0xa7, 0xdc, + 0xd7, 0x3c, 0x33, 0xf4, 0xf1, 0x75, 0x57, 0x28, 0x48, 0x35, 0x64, 0x36, + 0x59, 0x0d, 0xc6, 0xe3, 0x2f, 0x02, 0x08, 0xfc, 0x08, 0x5d, 0x51, 0x84, + 0x93, 0x83, 0x24, 0xa5, 0xb8, 0x46, 0x6f, 0xd8, 0x7f, 0xba, 0x69, 0x6e, + 0x0b, 0x9b, 0x6c, 0x96, 0x77, 0xc6, 0x70, 0x92, 0x49, 0x24, 0xaf, 0x5f, + 0xa0, 0x62, 0x4d, 0x4a, 0x77, 0x5d, 0x33, 0xd5, 0x24, 0xfe, 0x09, 0x24, + 0x91, 0x3d, 0x8c, 0x68, 0x4a, 0x51, 0x93, 0xff, 0x00, 0x2c, 0x11, 0x82, + 0xca, 0xa4, 0x66, 0xa0, 0x1e, 0xc2, 0xf2, 0x40, 0x36, 0x4f, 0x23, 0xf4, + 0x3c, 0x74, 0x42, 0x5f, 0x37, 0xef, 0x62, 0x2b, 0xed, 0x9a, 0x89, 0x57, + 0x6f, 0xd0, 0x93, 0x4e, 0x91, 0x7f, 0x8a, 0x7a, 0x65, 0x96, 0x1e, 0xd3, + 0xd7, 0x41, 0x17, 0xee, 0xd5, 0x0b, 0x4f, 0x05, 0x8e, 0xfb, 0x28, 0x59, + 0x0e, 0x61, 0x95, 0x6e, 0x48, 0x7a, 0xcb, 0x0d, 0x96, 0x18, 0x6b, 0xa5, + 0x0b, 0x08, 0x20, 0x8e, 0x86, 0xc9, 0x26, 0x0d, 0x04, 0x14, 0x4e, 0xec, + 0x67, 0x53, 0x78, 0x32, 0x63, 0x04, 0x92, 0x49, 0x24, 0xf4, 0xc1, 0x18, + 0x49, 0x24, 0xe1, 0x04, 0x12, 0xcd, 0x59, 0x67, 0xfe, 0x68, 0x20, 0x81, + 0x9b, 0x41, 0x93, 0x21, 0x39, 0x60, 0x67, 0xd8, 0xb3, 0x78, 0xcd, 0xe9, + 0xf4, 0x34, 0x6e, 0x3c, 0x10, 0xe0, 0x11, 0x0f, 0xea, 0x1a, 0xf3, 0x12, + 0x24, 0x4c, 0x96, 0x84, 0xf0, 0xf0, 0xc5, 0x4c, 0x36, 0x55, 0x4c, 0xdb, + 0x1e, 0x48, 0xe7, 0xdf, 0x27, 0xe8, 0x42, 0x31, 0xf0, 0x45, 0x0a, 0x2d, + 0x9d, 0x7a, 0x8c, 0x83, 0x21, 0x7e, 0x47, 0xf1, 0x61, 0x97, 0x80, 0xf0, + 0xd9, 0x61, 0xe0, 0x32, 0xc3, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x48, 0x69, + 0x35, 0xb9, 0xac, 0x3a, 0x89, 0xe6, 0xe9, 0x74, 0xcc, 0x8f, 0x3d, 0xb7, + 0x23, 0xc4, 0x58, 0x8e, 0x92, 0x44, 0x12, 0x36, 0x48, 0xf0, 0x64, 0x52, + 0x42, 0xa8, 0x99, 0x34, 0xe1, 0x24, 0x92, 0x4f, 0xfc, 0x31, 0x89, 0x77, + 0xc9, 0x18, 0x47, 0xe7, 0x8c, 0x56, 0x3c, 0x8f, 0x28, 0x8f, 0x64, 0x6c, + 0xc5, 0xaa, 0x51, 0x55, 0xdb, 0x24, 0x3c, 0x3c, 0xc2, 0x27, 0x8f, 0x2c, + 0x7e, 0x85, 0x94, 0x97, 0x72, 0xc7, 0xdc, 0x96, 0x2f, 0x94, 0x28, 0xb2, + 0xbc, 0x42, 0x4f, 0xd3, 0x33, 0x6b, 0xe5, 0xfb, 0x25, 0xfb, 0xbd, 0xc9, + 0xfe, 0xaf, 0x71, 0xbf, 0x32, 0xef, 0x1e, 0x40, 0xe0, 0xd8, 0x55, 0xdd, + 0x7e, 0x8b, 0xe0, 0xb9, 0x56, 0x31, 0x73, 0xcc, 0x0f, 0x84, 0x1d, 0x09, + 0xc3, 0xbc, 0x9c, 0x8a, 0xde, 0xc2, 0xa4, 0xbd, 0xc4, 0xdd, 0x37, 0x97, + 0xc0, 0xf5, 0x23, 0xbf, 0x41, 0xba, 0x6c, 0xf4, 0x94, 0x84, 0x55, 0x33, + 0x26, 0x5e, 0xa2, 0x96, 0x12, 0x49, 0x6c, 0x22, 0x82, 0x08, 0x22, 0x8a, + 0x2b, 0xab, 0x06, 0x18, 0x78, 0x2f, 0x1c, 0xc3, 0x2c, 0x32, 0xcb, 0x0c, + 0x30, 0xc3, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x44, 0x29, 0xa6, 0xe2, + 0x87, 0x41, 0xea, 0x19, 0x1a, 0x6d, 0xf0, 0xd9, 0x65, 0x97, 0x8c, 0xa3, + 0x03, 0xc2, 0x41, 0x2d, 0xc0, 0xc4, 0xd7, 0xe1, 0xc3, 0x14, 0x48, 0x24, + 0x60, 0x9e, 0xa8, 0xc6, 0x31, 0x82, 0x08, 0x20, 0x8e, 0xa0, 0x4f, 0x42, + 0x43, 0x1d, 0x0c, 0xc9, 0x13, 0x24, 0x4b, 0xa2, 0x41, 0x1d, 0x70, 0x29, + 0x93, 0x90, 0x76, 0x10, 0xa9, 0xf5, 0x02, 0xc3, 0x14, 0xd1, 0xa1, 0x11, + 0x02, 0x93, 0x59, 0xa5, 0xe4, 0xc5, 0x09, 0x52, 0x84, 0x92, 0x49, 0x24, + 0x92, 0x4e, 0x29, 0x92, 0x2c, 0x10, 0x84, 0x84, 0x84, 0x84, 0x84, 0x85, + 0x89, 0x11, 0x45, 0x04, 0x50, 0x41, 0x14, 0x50, 0x41, 0x75, 0x1e, 0xc3, + 0x0f, 0x60, 0xe6, 0x32, 0xcb, 0x0c, 0x30, 0xcb, 0x2f, 0x08, 0xc3, 0x43, + 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x18, 0xc8, 0x32, 0xc3, 0x53, 0x62, + 0x69, 0x06, 0xa7, 0x6e, 0x04, 0x8b, 0xb3, 0xba, 0xfd, 0x10, 0xe6, 0x72, + 0x3e, 0x96, 0x25, 0xbf, 0xac, 0x7d, 0x0e, 0x7d, 0x0c, 0x36, 0x66, 0x5d, + 0xc6, 0x44, 0xf0, 0x26, 0xd1, 0x0a, 0x8a, 0x17, 0xf0, 0x46, 0xda, 0x86, + 0x71, 0x02, 0x82, 0x39, 0x6f, 0x42, 0x77, 0x28, 0x13, 0x92, 0x53, 0x55, + 0x44, 0x09, 0x13, 0x09, 0x89, 0xfe, 0x08, 0x23, 0xa5, 0xd6, 0x1c, 0xf1, + 0x66, 0x4c, 0xfb, 0xaf, 0xc1, 0xf7, 0x2f, 0x81, 0x6c, 0x32, 0xb8, 0x7e, + 0x0b, 0x4e, 0xef, 0xf6, 0xb2, 0xf6, 0x71, 0x94, 0xf7, 0xff, 0x00, 0xd8, + 0x1e, 0xb1, 0xe6, 0x4c, 0x3d, 0x15, 0x07, 0xea, 0x98, 0xe9, 0xba, 0x5b, + 0x67, 0xb0, 0xc5, 0xcc, 0x2c, 0x8f, 0xa2, 0xe4, 0x80, 0xfb, 0xc1, 0xb0, + 0xc3, 0x44, 0x11, 0x81, 0x45, 0xd7, 0x64, 0x4b, 0x64, 0x24, 0x1d, 0xdf, + 0x81, 0x02, 0xe0, 0xb7, 0x57, 0x8b, 0x09, 0x89, 0x2a, 0xc9, 0x21, 0x22, + 0x49, 0x27, 0xa0, 0x49, 0x24, 0x92, 0x26, 0x26, 0x49, 0x24, 0x88, 0x42, + 0x10, 0xb0, 0x24, 0x25, 0xf8, 0xc0, 0x05, 0x15, 0x05, 0xb4, 0x41, 0xa2, + 0x19, 0x86, 0x6c, 0xbc, 0x23, 0x5d, 0x07, 0xb4, 0x67, 0x80, 0xcb, 0x2f, + 0x00, 0xcb, 0x0c, 0x3e, 0xa0, 0xa8, 0x83, 0x43, 0x1a, 0x1a, 0x18, 0xc6, + 0x31, 0x8c, 0x63, 0x1e, 0x12, 0x4e, 0x24, 0x92, 0x25, 0x5c, 0xd0, 0xe5, + 0xe4, 0x4c, 0xcc, 0xab, 0x61, 0xb5, 0xdf, 0x32, 0xfa, 0xc7, 0x94, 0x97, + 0xb1, 0x1a, 0x71, 0xac, 0xdf, 0xd4, 0x94, 0x87, 0x6d, 0x58, 0x86, 0xbc, + 0x64, 0x9e, 0xa8, 0xae, 0xfd, 0xc1, 0x72, 0x0c, 0xf7, 0x79, 0x13, 0x44, + 0x10, 0x41, 0x04, 0x10, 0x46, 0x04, 0x5d, 0x43, 0x1f, 0x08, 0x93, 0x5b, + 0xe7, 0x7f, 0x23, 0xa0, 0xb5, 0xb8, 0x17, 0xf2, 0x08, 0xa4, 0xef, 0x32, + 0xf9, 0xdb, 0x17, 0xa9, 0xcc, 0xe5, 0x12, 0xf4, 0x42, 0x1f, 0x5c, 0x4b, + 0x27, 0x71, 0xc1, 0xb4, 0xae, 0xe9, 0xbe, 0x47, 0x93, 0x3f, 0x77, 0x7b, + 0x9f, 0x75, 0xf8, 0xfc, 0x4b, 0x6a, 0x87, 0xb6, 0x06, 0x49, 0x28, 0x98, + 0x89, 0x9f, 0xc1, 0x27, 0x99, 0x11, 0x4f, 0xbd, 0x5f, 0x52, 0x50, 0x89, + 0x65, 0x3e, 0xf7, 0xec, 0xe5, 0xe2, 0xa0, 0xfb, 0x88, 0x0c, 0x32, 0x89, + 0x21, 0x0b, 0x92, 0xd7, 0x5b, 0xf4, 0x6b, 0x24, 0x9a, 0xad, 0xdc, 0x92, + 0x7a, 0x04, 0xfe, 0x00, 0x08, 0x20, 0x82, 0x62, 0x62, 0x62, 0x62, 0x16, + 0x04, 0x10, 0x41, 0x04, 0xfc, 0x80, 0x88, 0x22, 0xa0, 0x84, 0x10, 0x41, + 0x04, 0x62, 0xbc, 0x03, 0xfc, 0x60, 0x40, 0x14, 0x41, 0x30, 0x31, 0x8c, + 0x63, 0x18, 0xc6, 0x31, 0x8c, 0x6f, 0xac, 0x0a, 0x85, 0x93, 0x0b, 0xb1, + 0x2a, 0x64, 0x92, 0x48, 0x84, 0x29, 0x4b, 0x49, 0x24, 0x56, 0xee, 0xfe, + 0x85, 0x63, 0xef, 0x2a, 0x8d, 0x07, 0x14, 0xee, 0x51, 0x63, 0x20, 0xe6, + 0x12, 0x97, 0xb1, 0xa5, 0xcd, 0x3e, 0xbb, 0x13, 0x27, 0xbc, 0xef, 0x5b, + 0x8f, 0x62, 0xb6, 0xe3, 0x85, 0x7b, 0x0d, 0xf6, 0x37, 0x55, 0xf2, 0xef, + 0xff, 0x00, 0x23, 0x49, 0x21, 0x94, 0x9b, 0x45, 0x61, 0x10, 0xe2, 0xeb, + 0xba, 0x25, 0x31, 0xf0, 0xbe, 0x45, 0xb8, 0xd3, 0x15, 0xbf, 0xc8, 0x00, + 0x10, 0x4c, 0x41, 0x31, 0x31, 0x31, 0x31, 0x3e, 0x80, 0x98, 0x89, 0xf8, + 0x62, 0x70, 0xa1, 0xc1, 0x50, 0xfc, 0x90, 0x39, 0x75, 0x00, 0x8f, 0xa4, + 0xf4, 0x82, 0x08, 0x20, 0xc6, 0xc6, 0x3c, 0x46, 0x36, 0x36, 0x36, 0x36, + 0x49, 0x24, 0xf4, 0x06, 0xa0, 0xac, 0x20, 0x52, 0xdb, 0x29, 0x09, 0x92, + 0x27, 0xd4, 0xd4, 0xf8, 0x6c, 0x96, 0x45, 0x67, 0x03, 0x2d, 0x3b, 0x7e, + 0xc5, 0x76, 0x14, 0x24, 0xf2, 0xe7, 0xd8, 0xfa, 0xc4, 0x92, 0x55, 0x7e, + 0x82, 0xe5, 0x07, 0xfe, 0x8a, 0xbf, 0xf4, 0xa1, 0x21, 0x91, 0x4b, 0x44, + 0x6f, 0xa0, 0x98, 0x6f, 0xc8, 0x00, 0x10, 0x4c, 0x41, 0x31, 0x84, 0xc4, + 0xc6, 0xea, 0x02, 0x0a, 0x2f, 0xe0, 0xbc, 0xb5, 0x7f, 0xc2, 0x6b, 0xad, + 0x76, 0x97, 0x09, 0x44, 0x13, 0xa0, 0x36, 0x37, 0x88, 0xc6, 0x36, 0x31, + 0xb2, 0x46, 0xc9, 0xe8, 0x10, 0x57, 0x2f, 0x64, 0x62, 0x49, 0x1b, 0xa3, + 0x29, 0x29, 0x24, 0x0b, 0x55, 0xff, 0x00, 0x6a, 0x9c, 0x4e, 0x66, 0x71, + 0x87, 0x18, 0x71, 0xfe, 0x30, 0x00, 0x82, 0x64, 0x89, 0x89, 0x8c, 0x37, + 0x58, 0x28, 0x2e, 0x14, 0xea, 0xa9, 0x17, 0xfc, 0x33, 0x88, 0x6e, 0x47, + 0x88, 0xa2, 0x8a, 0x28, 0xa2, 0xf4, 0xf3, 0x63, 0x78, 0x8c, 0x36, 0x30, + 0xd9, 0x23, 0x63, 0x78, 0x93, 0x43, 0x36, 0x54, 0xfe, 0xa2, 0x78, 0x13, + 0x18, 0x71, 0xf0, 0x24, 0xb2, 0x42, 0x22, 0x86, 0xa0, 0x9f, 0xfd, 0x6d, + 0x94, 0xc9, 0x53, 0x65, 0x2d, 0x8f, 0xd1, 0x13, 0xfc, 0x60, 0x01, 0x04, + 0x10, 0x4c, 0x4c, 0x61, 0xba, 0xe5, 0x51, 0x05, 0x14, 0x4c, 0x56, 0x13, + 0x13, 0x24, 0x9e, 0xa8, 0x11, 0xc1, 0x02, 0xf8, 0x30, 0xcb, 0xc5, 0x32, + 0xdf, 0xe0, 0x00, 0x6b, 0xd7, 0xab, 0x70, 0x37, 0x81, 0xb1, 0x06, 0x18, + 0x61, 0xe2, 0x27, 0x1a, 0x22, 0x67, 0xcd, 0x3d, 0xd8, 0x89, 0x8d, 0x84, + 0xc3, 0x89, 0x2d, 0x16, 0xca, 0x50, 0xc2, 0x44, 0x44, 0xac, 0x4c, 0x92, + 0x7f, 0xe2, 0x6c, 0x78, 0x4c, 0xbc, 0x3c, 0xac, 0x35, 0x43, 0x8f, 0x89, + 0x3f, 0xc2, 0x04, 0x58, 0x08, 0x20, 0xc2, 0xc0, 0x30, 0xf8, 0x5b, 0xa3, + 0xa8, 0xa2, 0x0b, 0x85, 0xc8, 0x09, 0xc4, 0x08, 0x21, 0x12, 0x9c, 0x12, + 0x79, 0x93, 0x11, 0xcc, 0xa0, 0xac, 0xbd, 0xd0, 0x43, 0x5f, 0x15, 0x23, + 0x7f, 0xbc, 0xda, 0xf3, 0x11, 0x79, 0x79, 0x84, 0xa9, 0x46, 0x5d, 0xe2, + 0x5d, 0x9e, 0x64, 0xab, 0x97, 0x29, 0xa3, 0x97, 0x0b, 0x52, 0x56, 0xd8, + 0x58, 0x92, 0x0c, 0x17, 0x80, 0x61, 0x86, 0x1b, 0xa2, 0xa0, 0xb8, 0x5b, + 0x0d, 0x03, 0x0c, 0x30, 0xd8, 0xd8, 0xd8, 0xc3, 0xc0, 0x43, 0x76, 0xc7, + 0xa1, 0xbc, 0xaf, 0xb6, 0x22, 0xe8, 0x10, 0xc4, 0xcd, 0x14, 0x25, 0x85, + 0x15, 0x81, 0x48, 0x41, 0x61, 0x66, 0x17, 0xfc, 0x0c, 0x8b, 0x09, 0xc4, + 0x63, 0x70, 0x9d, 0x14, 0x98, 0xf5, 0x7d, 0x0f, 0x37, 0xe0, 0x3f, 0x5d, + 0x18, 0x82, 0x62, 0x63, 0x0c, 0x38, 0xc3, 0x7e, 0x0f, 0xaf, 0x80, 0xc4, + 0x02, 0x10, 0x58, 0x6a, 0x1a, 0x68, 0xd1, 0x3d, 0x0d, 0x9d, 0xb4, 0x7b, + 0x89, 0x8e, 0x23, 0x76, 0x64, 0xdc, 0xeb, 0x82, 0x1a, 0xce, 0xde, 0xf1, + 0xef, 0x5a, 0xc0, 0xe1, 0xa5, 0x38, 0x37, 0x0d, 0xd2, 0x4c, 0x05, 0x26, + 0x57, 0x44, 0x69, 0x42, 0xb5, 0x47, 0x7a, 0xa7, 0x02, 0x48, 0x49, 0x43, + 0x63, 0x50, 0x71, 0x13, 0x4f, 0x78, 0x83, 0xef, 0xd7, 0xec, 0xaa, 0x97, + 0x5b, 0xaa, 0xa2, 0x44, 0x51, 0xe0, 0xc6, 0x1b, 0x18, 0x61, 0xb0, 0x36, + 0x23, 0xf4, 0xd1, 0xb0, 0xb8, 0xc3, 0x63, 0x63, 0x0c, 0x30, 0xc2, 0x67, + 0xdc, 0x8a, 0x13, 0x9f, 0xec, 0x62, 0x2e, 0x83, 0x53, 0x0c, 0x94, 0x11, + 0x8a, 0x25, 0x59, 0xe1, 0xa2, 0xa7, 0x82, 0xe3, 0x0b, 0xfe, 0x06, 0xe9, + 0xce, 0x78, 0x19, 0x11, 0x78, 0xa9, 0xd3, 0xa2, 0xff, 0x00, 0x0f, 0xe1, + 0x20, 0x8d, 0x45, 0xa0, 0x2c, 0x8d, 0x60, 0x30, 0xe4, 0x2a, 0x8b, 0xb5, + 0xce, 0x15, 0xe8, 0xee, 0x30, 0xd8, 0x0a, 0x26, 0xd1, 0xf8, 0x89, 0x1e, + 0x6e, 0x3f, 0xb1, 0x42, 0x72, 0x8f, 0x22, 0xe6, 0x72, 0xb2, 0x85, 0x2e, + 0x03, 0x92, 0xa2, 0x10, 0x30, 0x84, 0x37, 0x01, 0xb4, 0x85, 0xac, 0x2c, + 0xe2, 0x96, 0x34, 0x84, 0xa1, 0x50, 0x4a, 0x13, 0x85, 0x95, 0xe4, 0x45, + 0x21, 0xd5, 0xbd, 0x46, 0x95, 0x9e, 0x5a, 0x06, 0x75, 0x9b, 0x15, 0x04, + 0x67, 0xe4, 0x37, 0x38, 0x0d, 0xd0, 0x13, 0x0e, 0x95, 0xc5, 0x3f, 0x61, + 0x77, 0xec, 0x39, 0x37, 0x4e, 0xe3, 0x59, 0xe0, 0x2f, 0x9f, 0x60, 0xb9, + 0x29, 0x35, 0x43, 0xff, 0x00, 0x00, 0xd4, 0x57, 0x70, 0xf4, 0x86, 0x40, + 0x52, 0x64, 0xf2, 0x6a, 0x8a, 0x98, 0x67, 0xfc, 0x0e, 0x0c, 0xbf, 0x38, + 0xe8, 0x2c, 0x74, 0xf5, 0x16, 0x92, 0xc1, 0x58, 0xf1, 0x09, 0xba, 0x05, + 0x7e, 0x78, 0x07, 0xac, 0x7d, 0x1a, 0xe3, 0x8c, 0x51, 0x27, 0x4c, 0xaf, + 0xd3, 0x4a, 0xfa, 0xbc, 0xa4, 0x5b, 0x1a, 0xc8, 0x45, 0x34, 0x4f, 0xa2, + 0x97, 0xe1, 0x49, 0x5a, 0x75, 0xf3, 0x2e, 0xe0, 0x4a, 0xb3, 0xbb, 0x89, + 0x8a, 0x8f, 0xf0, 0x89, 0xb3, 0x0c, 0x3b, 0xc7, 0x79, 0x2a, 0x5c, 0xc2, + 0x2c, 0xe6, 0x56, 0xac, 0x74, 0xb8, 0xbb, 0x3f, 0x45, 0x2a, 0x52, 0xdc, + 0xb2, 0xf5, 0x2e, 0xc2, 0xae, 0xef, 0x08, 0xbb, 0x38, 0x92, 0xd2, 0xcf, + 0x19, 0x8b, 0x93, 0x22, 0x56, 0x9a, 0x8e, 0xe1, 0x14, 0x0d, 0x27, 0x57, + 0xa2, 0x16, 0x8d, 0xbd, 0x46, 0x17, 0x36, 0xe3, 0xd0, 0xd5, 0x32, 0x6b, + 0x5b, 0x02, 0x01, 0x2a, 0x9b, 0x38, 0x2f, 0xa0, 0x15, 0x0c, 0x46, 0x40, + 0xf3, 0x3d, 0x48, 0x03, 0x16, 0xee, 0x28, 0x90, 0x8a, 0x13, 0x90, 0xb5, + 0x20, 0x1e, 0x48, 0xc3, 0x6d, 0x28, 0x40, 0x86, 0x6e, 0xf4, 0xd0, 0x55, + 0xb3, 0x49, 0xe8, 0x42, 0x57, 0x33, 0x8b, 0x92, 0x3e, 0x34, 0x1f, 0xd7, + 0xb4, 0xe4, 0x62, 0x68, 0x6d, 0x18, 0x24, 0xa1, 0x5b, 0xa5, 0x53, 0x8f, + 0x02, 0x51, 0xba, 0x77, 0x64, 0xe0, 0xe5, 0xb9, 0x5b, 0x32, 0x57, 0x6a, + 0x09, 0x3a, 0x89, 0x84, 0x58, 0x6f, 0x4d, 0x55, 0x90, 0xd6, 0x50, 0x7b, + 0xd9, 0x0a, 0x6b, 0x1a, 0x0d, 0x5b, 0xbc, 0x83, 0x61, 0x15, 0x0d, 0x88, + 0x4e, 0xbb, 0x8a, 0x4f, 0xcd, 0x69, 0x9a, 0x0c, 0x08, 0xa5, 0x2f, 0x34, + 0x2a, 0xdd, 0xcb, 0x4b, 0x2d, 0xc5, 0x1a, 0x92, 0x89, 0xd8, 0x52, 0xb3, + 0x11, 0x45, 0x63, 0x3a, 0xc4, 0x58, 0x0c, 0x29, 0x4e, 0x97, 0x1d, 0x9f, + 0xa3, 0x2e, 0xa7, 0xdf, 0xb0, 0xe3, 0xf2, 0x89, 0x2d, 0xb3, 0xd4, 0xa3, + 0x37, 0xc5, 0x0a, 0x13, 0x9f, 0xf8, 0x34, 0x90, 0x8f, 0x1f, 0xa9, 0xae, + 0x1b, 0x21, 0xe0, 0x26, 0x44, 0xb3, 0xd1, 0xeb, 0x2c, 0xbc, 0x38, 0x12, + 0xda, 0x5c, 0x89, 0xd2, 0xa6, 0x95, 0x12, 0x2a, 0xb5, 0xab, 0x50, 0x84, + 0xb1, 0x71, 0xe2, 0x87, 0x95, 0x36, 0x9d, 0xca, 0xf5, 0xab, 0x26, 0xa9, + 0x2e, 0xc6, 0xd6, 0xac, 0x82, 0xb1, 0x2b, 0x84, 0x93, 0xa2, 0x39, 0x2c, + 0xb2, 0x8b, 0x45, 0xcf, 0x05, 0x58, 0x6a, 0x15, 0xde, 0x19, 0x58, 0x88, + 0x57, 0x02, 0x45, 0x43, 0xb3, 0x45, 0x09, 0x92, 0xd1, 0x0a, 0xf3, 0x8d, + 0xaf, 0x49, 0xdb, 0x0a, 0x10, 0xd3, 0x27, 0x6b, 0xca, 0x11, 0x6e, 0x34, + 0xf2, 0x6a, 0xdf, 0x5c, 0x56, 0x05, 0x22, 0xaa, 0x86, 0x9c, 0xae, 0xd6, + 0x02, 0x4d, 0xd0, 0x99, 0xa5, 0xc0, 0xd6, 0x94, 0xef, 0x08, 0x79, 0x67, + 0x95, 0x12, 0xda, 0xe2, 0xae, 0x82, 0x48, 0xd1, 0x51, 0x98, 0xed, 0xb1, + 0x00, 0xe4, 0xb5, 0x58, 0xd5, 0x09, 0xfc, 0xc9, 0xbe, 0x4c, 0xe5, 0x3a, + 0x8b, 0x24, 0x2b, 0xf7, 0xc2, 0xcb, 0xaf, 0xd9, 0x17, 0x4f, 0x81, 0xf2, + 0x24, 0x49, 0x23, 0x41, 0x36, 0x1a, 0xe0, 0xc9, 0x08, 0xb7, 0x23, 0x8f, + 0x91, 0xe8, 0xae, 0xb6, 0xfd, 0x32, 0x44, 0xf9, 0x38, 0xaa, 0x8d, 0xea, + 0x44, 0xca, 0xe0, 0x86, 0x7a, 0x2b, 0x6f, 0x90, 0x95, 0x94, 0x04, 0x81, + 0xc6, 0x34, 0x49, 0xb7, 0xe4, 0x7b, 0x05, 0xf0, 0xf3, 0xcc, 0x79, 0x7a, + 0xcf, 0x80, 0xd4, 0xd8, 0xcf, 0x36, 0x30, 0x82, 0x65, 0x59, 0x86, 0x79, + 0xe6, 0xcc, 0x9a, 0x93, 0x93, 0x59, 0xa1, 0xab, 0xad, 0x47, 0x1d, 0xd8, + 0x4d, 0x03, 0x38, 0xa0, 0xcd, 0x48, 0x26, 0x21, 0x9f, 0xd4, 0x4a, 0xaa, + 0x2c, 0x32, 0x66, 0x64, 0x09, 0x61, 0x55, 0x5c, 0x9b, 0x8a, 0xcf, 0x02, + 0xe4, 0x04, 0xf5, 0x13, 0x3a, 0xd8, 0x66, 0xbd, 0xb0, 0xc3, 0x48, 0x8a, + 0x4b, 0xb9, 0x36, 0x37, 0x2c, 0x4b, 0xa7, 0xca, 0x17, 0x36, 0xa1, 0x67, + 0xc4, 0x08, 0x88, 0x07, 0x9b, 0x3d, 0xd4, 0x93, 0x91, 0xcb, 0xb4, 0xa2, + 0x3a, 0x73, 0x49, 0x18, 0x91, 0x74, 0x47, 0xa6, 0x85, 0x88, 0xf0, 0x8f, + 0x79, 0xa1, 0xa2, 0x31, 0xf2, 0xc9, 0x8f, 0x32, 0x96, 0xfe, 0x2b, 0xda, + 0xf6, 0x1a, 0xae, 0x3e, 0xb3, 0xa8, 0x14, 0x4a, 0x93, 0x66, 0x3a, 0xa8, + 0x39, 0xb6, 0x95, 0xba, 0xb2, 0xfc, 0xd0, 0x48, 0x96, 0x86, 0x26, 0xa2, + 0x0e, 0xbe, 0x71, 0xde, 0x2e, 0x18, 0xc2, 0xd2, 0x5b, 0x49, 0x6e, 0x3a, + 0x6a, 0x36, 0xf5, 0x12, 0xee, 0x47, 0x1a, 0xfd, 0xd4, 0x24, 0xc4, 0x9d, + 0x69, 0xf2, 0x32, 0x45, 0x3b, 0xda, 0x37, 0xf5, 0xfd, 0x0c, 0x51, 0x06, + 0xfa, 0xd2, 0x07, 0xe4, 0x58, 0xa4, 0x88, 0x17, 0x40, 0x15, 0x48, 0x9d, + 0x74, 0xc6, 0x4a, 0x5a, 0xbf, 0xcc, 0x0b, 0x65, 0x34, 0xc0, 0xe4, 0x04, + 0x8a, 0x21, 0x4a, 0xea, 0x92, 0x64, 0x92, 0x21, 0xbb, 0x02, 0x02, 0x4c, + 0x41, 0xd4, 0x37, 0xaa, 0xd7, 0xb8, 0x37, 0x7d, 0x89, 0x86, 0x06, 0x19, + 0x9b, 0x1b, 0x1e, 0x9d, 0x07, 0x28, 0x9b, 0x50, 0x9f, 0xe1, 0x2a, 0x2a, + 0xf5, 0x70, 0xea, 0x33, 0xcc, 0x86, 0x3f, 0xec, 0xa7, 0xb8, 0xd0, 0x9b, + 0x24, 0xa7, 0x91, 0x7d, 0x66, 0x59, 0xac, 0x8b, 0x6b, 0xcb, 0x0f, 0xa0, + 0xf9, 0x36, 0x25, 0x84, 0x3a, 0xf2, 0x91, 0xac, 0xec, 0x57, 0x36, 0xc7, + 0xee, 0xc7, 0x69, 0xa4, 0x9b, 0x03, 0xd0, 0xab, 0xd4, 0xa7, 0xd4, 0x89, + 0x00, 0xa1, 0x34, 0xc8, 0xe7, 0xd3, 0xc1, 0x09, 0x9a, 0xa4, 0x39, 0xe5, + 0xb2, 0x58, 0xc2, 0x6f, 0x25, 0xfd, 0x7d, 0xc6, 0x99, 0xd5, 0x52, 0xe8, + 0x9c, 0x8c, 0x9a, 0xe5, 0x71, 0x5a, 0x8e, 0xa5, 0x7d, 0xd0, 0xaa, 0x06, + 0xe2, 0x67, 0x27, 0x94, 0xb5, 0x74, 0xdb, 0xf4, 0x25, 0xa4, 0x3a, 0xd5, + 0x9a, 0x89, 0xa6, 0x9b, 0x71, 0x2c, 0x4c, 0xaa, 0x50, 0x4f, 0x21, 0x29, + 0x45, 0x2b, 0x20, 0xa4, 0x7b, 0x90, 0xe9, 0x24, 0xdc, 0x94, 0x21, 0xc6, + 0xcc, 0x26, 0xa9, 0xf7, 0x0a, 0xf2, 0x77, 0x2f, 0xd5, 0x89, 0x61, 0xa3, + 0x4b, 0xaa, 0x1f, 0x86, 0x48, 0x94, 0xee, 0xe9, 0xa1, 0x7d, 0x10, 0xf4, + 0x61, 0x3f, 0x9c, 0x26, 0xc1, 0x61, 0x15, 0x84, 0x87, 0x2a, 0x2e, 0x56, + 0x06, 0x41, 0x52, 0x44, 0xcd, 0xda, 0x8f, 0xde, 0x31, 0x45, 0xc9, 0x71, + 0xec, 0x4b, 0x32, 0xa3, 0x63, 0x8a, 0x32, 0x2e, 0x4a, 0xe2, 0x55, 0xb3, + 0xb9, 0x31, 0x99, 0xb3, 0xc0, 0x86, 0xc1, 0xb4, 0x3e, 0x8d, 0xd5, 0xc1, + 0x12, 0x3c, 0x4a, 0x11, 0x79, 0x26, 0x6b, 0xb2, 0x14, 0x42, 0x03, 0x76, + 0xe8, 0xa9, 0xbd, 0xdf, 0x0b, 0x32, 0xb7, 0x61, 0x1e, 0xab, 0x90, 0x89, + 0xa6, 0xf5, 0x7d, 0x37, 0x21, 0xf9, 0x61, 0xc1, 0x77, 0xa8, 0x9c, 0x26, + 0xd5, 0xfc, 0x44, 0xfa, 0x85, 0x76, 0x7d, 0x2b, 0x94, 0x31, 0x19, 0xaa, + 0x51, 0x13, 0x61, 0xd6, 0xa2, 0xc7, 0xe1, 0x3b, 0xc6, 0xe8, 0xe1, 0x3d, + 0x2f, 0x1b, 0x86, 0x84, 0xd4, 0x7a, 0x0f, 0x68, 0x25, 0x10, 0x97, 0xc6, + 0x8f, 0xa1, 0x34, 0xd9, 0x7a, 0x2d, 0xbe, 0xdb, 0x9e, 0xf4, 0x1f, 0x52, + 0x35, 0x62, 0x69, 0xae, 0xa3, 0x7e, 0x11, 0x08, 0xe7, 0x54, 0x2f, 0x55, + 0x84, 0x13, 0xc8, 0x0b, 0x55, 0x07, 0x3c, 0xc6, 0x64, 0xd0, 0x36, 0xaa, + 0x68, 0x3d, 0x46, 0xc8, 0x12, 0x68, 0x14, 0x11, 0x2a, 0xe7, 0xb4, 0xdf, + 0x02, 0x61, 0x64, 0x29, 0xc2, 0x76, 0x53, 0x0a, 0x04, 0x51, 0xdc, 0x4f, + 0xb8, 0x26, 0xe9, 0x04, 0x7f, 0x91, 0x14, 0x8b, 0xe4, 0x2a, 0xda, 0x11, + 0x46, 0xe3, 0xbb, 0xb4, 0xc9, 0xdc, 0xd3, 0x78, 0x6d, 0x1f, 0xc2, 0xd5, + 0x29, 0x62, 0xce, 0xe3, 0x9d, 0xa8, 0xb5, 0x34, 0x1d, 0x35, 0x32, 0xb5, + 0x0f, 0x72, 0xd8, 0x4f, 0xb8, 0x93, 0x27, 0x21, 0x10, 0x64, 0xc9, 0x16, + 0xf5, 0x89, 0xb1, 0xea, 0x30, 0x83, 0xa6, 0xbb, 0x49, 0x5e, 0x81, 0x11, + 0x04, 0xa6, 0x0c, 0x91, 0xe8, 0x10, 0xc6, 0x35, 0x1a, 0x0d, 0xb5, 0x50, + 0xc6, 0x57, 0x45, 0x6e, 0x1d, 0x9f, 0xa1, 0x90, 0x40, 0x42, 0x17, 0xed, + 0xc8, 0xf4, 0x57, 0x05, 0x90, 0xa1, 0xa9, 0xaa, 0xd5, 0x0d, 0x9e, 0xe2, + 0x48, 0x5d, 0xe4, 0x9d, 0xe2, 0xa6, 0x44, 0xc1, 0xbd, 0x0b, 0xcb, 0xb9, + 0x3a, 0x94, 0xbb, 0x82, 0x75, 0x02, 0x5c, 0x05, 0xd8, 0x28, 0x41, 0xd3, + 0xa0, 0x95, 0x60, 0x56, 0xfd, 0x9d, 0x7b, 0xa1, 0x7a, 0x94, 0xd5, 0xb6, + 0xc7, 0xd1, 0x28, 0xdc, 0x3c, 0x80, 0x96, 0x6a, 0xaf, 0xd0, 0xae, 0xba, + 0x49, 0x21, 0x85, 0x43, 0x56, 0x2d, 0x01, 0xbf, 0x23, 0xa6, 0x92, 0x1e, + 0x47, 0x34, 0x35, 0xaa, 0x74, 0x1a, 0xee, 0x14, 0xb3, 0x1d, 0x36, 0x44, + 0xe5, 0x7a, 0x0d, 0x98, 0xfa, 0x59, 0x79, 0x11, 0x9e, 0x72, 0x9c, 0xd9, + 0x69, 0xe0, 0x9f, 0x7b, 0xd8, 0x1f, 0xa0, 0x10, 0x48, 0x68, 0xaa, 0x35, + 0xf8, 0x12, 0xab, 0x28, 0x33, 0xd2, 0x1a, 0x43, 0x84, 0x42, 0x49, 0x14, + 0x5d, 0x41, 0xe6, 0x12, 0x2c, 0x96, 0xa2, 0xc8, 0x4a, 0x5a, 0x77, 0x14, + 0xb1, 0x91, 0xbd, 0x3a, 0x18, 0x6a, 0xe8, 0x2a, 0xa0, 0xf2, 0x86, 0xe5, + 0xb5, 0xa1, 0x22, 0x94, 0x7a, 0xc0, 0x83, 0x93, 0x44, 0x14, 0x64, 0x92, + 0x11, 0x46, 0x72, 0xc8, 0xb0, 0x3f, 0x91, 0x09, 0x56, 0xa1, 0x50, 0xe6, + 0xc6, 0x57, 0x96, 0x09, 0xee, 0x27, 0xaa, 0x0a, 0x18, 0x1e, 0x21, 0x55, + 0x60, 0x73, 0xb4, 0xbd, 0xa3, 0xe1, 0x0a, 0xbc, 0xb8, 0x42, 0xa4, 0xea, + 0x29, 0xfe, 0x43, 0xf7, 0x25, 0x34, 0xd1, 0xc2, 0xf9, 0x65, 0x89, 0x36, + 0xde, 0xfd, 0x70, 0x49, 0x25, 0x2b, 0x21, 0xc9, 0xaa, 0xb9, 0x07, 0xa9, + 0x1a, 0xfe, 0x45, 0xf1, 0x0f, 0x46, 0x2b, 0x7d, 0x11, 0xc8, 0x41, 0x79, + 0x41, 0xee, 0xc3, 0x9d, 0x22, 0x37, 0x32, 0xa0, 0x79, 0x0d, 0xab, 0xfd, + 0xb7, 0xd4, 0x8d, 0x0e, 0x65, 0x88, 0xf0, 0xb4, 0xf4, 0x88, 0x0b, 0x5a, + 0x0a, 0x36, 0xb4, 0x78, 0x94, 0x4e, 0x91, 0xae, 0x15, 0x93, 0x79, 0x4f, + 0x63, 0xd6, 0x75, 0x2f, 0x2b, 0xf4, 0x4c, 0x35, 0x65, 0x3e, 0xc5, 0x21, + 0xff, 0x00, 0x91, 0xee, 0x75, 0x65, 0x15, 0x18, 0xf5, 0x18, 0x92, 0xae, + 0x70, 0xf1, 0x0a, 0x46, 0xc9, 0xb8, 0xd4, 0xac, 0xf7, 0x1d, 0x32, 0xdd, + 0x8d, 0x42, 0x91, 0xc5, 0x6b, 0x30, 0xc9, 0xe6, 0x38, 0xb4, 0xba, 0x1e, + 0xbf, 0xe0, 0xcd, 0xbc, 0x55, 0x8d, 0xdc, 0xe2, 0x3b, 0x6b, 0x43, 0x2b, + 0x22, 0x31, 0x25, 0x7c, 0x4b, 0xc8, 0xd2, 0x15, 0x71, 0x15, 0x62, 0x78, + 0x09, 0xc1, 0xb8, 0xcc, 0xf5, 0xc2, 0xc6, 0x1c, 0x62, 0x2d, 0x03, 0x7b, + 0xa1, 0xcc, 0x48, 0xc5, 0x84, 0xc8, 0x6b, 0x83, 0xc5, 0x34, 0x9f, 0x36, + 0x13, 0xd6, 0x6f, 0xe0, 0xab, 0x4c, 0x8f, 0x40, 0xbf, 0x7f, 0x22, 0x71, + 0x9a, 0x70, 0xd0, 0x9b, 0x93, 0xea, 0xb4, 0x1b, 0x76, 0x2e, 0xd1, 0xb7, + 0xcc, 0x21, 0x96, 0xa1, 0x1f, 0x2a, 0x45, 0xac, 0x4d, 0x72, 0xdb, 0xb7, + 0x06, 0xe4, 0x6d, 0x4f, 0xb5, 0x09, 0x87, 0x9e, 0x72, 0x47, 0x30, 0x89, + 0xf6, 0x9d, 0x59, 0x3f, 0xf6, 0x36, 0x8b, 0xd2, 0x3d, 0x75, 0x41, 0xc8, + 0x96, 0xa9, 0x89, 0x8f, 0xd8, 0x88, 0xe1, 0x78, 0xdf, 0x23, 0xc3, 0xc4, + 0x75, 0xe7, 0x14, 0xc8, 0x9c, 0x67, 0xfc, 0x8f, 0x2f, 0xa5, 0x9c, 0x1a, + 0x10, 0x93, 0x6d, 0x3b, 0xaa, 0x68, 0x53, 0x9a, 0x60, 0xab, 0x7c, 0x1b, + 0x1a, 0xd4, 0x75, 0xa4, 0xd9, 0x11, 0x2a, 0xd9, 0x2b, 0xee, 0xdd, 0xd9, + 0x92, 0xe6, 0x58, 0x85, 0x59, 0x79, 0x5f, 0xd6, 0xa0, 0xc3, 0x0c, 0x48, + 0xc2, 0x78, 0x1e, 0x08, 0xdb, 0x2a, 0x25, 0x82, 0x07, 0x5d, 0x06, 0xa5, + 0x2c, 0x56, 0xeb, 0x8e, 0xe3, 0x4b, 0x12, 0x84, 0x4d, 0x55, 0x34, 0x23, + 0x5e, 0x51, 0x17, 0xa8, 0xa3, 0x44, 0x28, 0xb2, 0x1f, 0xd1, 0x32, 0xf5, + 0x52, 0xae, 0x24, 0x92, 0x26, 0x24, 0xa0, 0x9a, 0x5d, 0x90, 0xd0, 0x57, + 0xcf, 0xdd, 0x14, 0x89, 0x18, 0x61, 0x0a, 0xa8, 0x84, 0x1f, 0x55, 0xd5, + 0x55, 0x7e, 0xef, 0x53, 0x2e, 0x84, 0x54, 0x76, 0x26, 0xca, 0x16, 0x82, + 0xfc, 0xcc, 0xf4, 0x37, 0xb9, 0xc3, 0xcd, 0x24, 0x86, 0xb9, 0x4d, 0xe6, + 0xa1, 0xe4, 0x27, 0x2d, 0xd8, 0xd5, 0xed, 0x1e, 0xe2, 0xd5, 0xcb, 0xf0, + 0x32, 0x4c, 0x4d, 0xcb, 0xc0, 0xda, 0xf0, 0x32, 0x4f, 0xb1, 0x0e, 0xcc, + 0xee, 0x28, 0x42, 0x7a, 0x3c, 0x97, 0xa7, 0x45, 0x1a, 0x79, 0x95, 0x21, + 0xb9, 0x94, 0xaf, 0xa8, 0x96, 0xbf, 0x29, 0xa1, 0xad, 0x0a, 0x72, 0x62, + 0xec, 0xd3, 0xd0, 0xa7, 0x77, 0x26, 0xfc, 0xaa, 0xd2, 0x3a, 0x27, 0xa8, + 0xf5, 0x63, 0x54, 0x6c, 0x92, 0xae, 0x70, 0xf1, 0xc8, 0x42, 0x70, 0x5b, + 0x21, 0x68, 0x93, 0x35, 0x21, 0x31, 0x5d, 0x27, 0x32, 0x15, 0x65, 0x6d, + 0x9c, 0x8d, 0x20, 0x2a, 0xb7, 0x2d, 0x43, 0x36, 0x79, 0xc3, 0x4c, 0x1b, + 0x62, 0x13, 0x2c, 0xaa, 0x4a, 0xe6, 0xfb, 0x10, 0x4d, 0x28, 0x98, 0x43, + 0x38, 0x14, 0x89, 0x60, 0x4c, 0x81, 0x9e, 0xc4, 0x83, 0x57, 0x81, 0x86, + 0xc7, 0x18, 0xbf, 0xfb, 0xaa, 0x1c, 0x32, 0x23, 0x4b, 0x1d, 0x35, 0x50, + 0xdc, 0x44, 0xa2, 0x6d, 0x45, 0xf0, 0xe0, 0x87, 0x5d, 0x0f, 0x66, 0x05, + 0x48, 0x65, 0x3f, 0x71, 0x55, 0x76, 0x1c, 0xd8, 0xb9, 0xfa, 0x50, 0xf5, + 0xd8, 0x8b, 0xb4, 0x9a, 0xca, 0xd0, 0x44, 0x8d, 0x91, 0xd0, 0x47, 0x2a, + 0x66, 0x3d, 0x44, 0x88, 0xa6, 0xb5, 0x12, 0x71, 0x5a, 0xea, 0x54, 0x71, + 0xcc, 0xa3, 0x2a, 0xb0, 0x5a, 0x14, 0x85, 0xb0, 0xaa, 0x67, 0x03, 0x65, + 0xb3, 0xbc, 0x0c, 0x53, 0xee, 0x1c, 0x76, 0xce, 0xa4, 0xfa, 0xbb, 0x23, + 0x1d, 0x9a, 0x9b, 0xd5, 0x66, 0x7d, 0xb4, 0x1a, 0x44, 0x6e, 0xb3, 0x2b, + 0xcd, 0x33, 0x5f, 0xc2, 0xd5, 0xe6, 0x6a, 0xd0, 0x82, 0x64, 0xbd, 0x88, + 0x04, 0xfb, 0x99, 0x0c, 0x30, 0xc4, 0xe0, 0x4c, 0x64, 0x4e, 0xda, 0x38, + 0x0c, 0x3c, 0x36, 0x1e, 0x55, 0xb1, 0x27, 0x10, 0xf0, 0x23, 0x1b, 0x2c, + 0x86, 0x6b, 0x22, 0xe1, 0xe5, 0xb1, 0x03, 0xb0, 0xd2, 0x6d, 0xdc, 0x59, + 0xa7, 0x61, 0xa1, 0x26, 0xda, 0xa6, 0x63, 0x43, 0xee, 0x39, 0x32, 0x87, + 0x2a, 0x03, 0x98, 0x82, 0x08, 0x30, 0xe7, 0xd0, 0xdd, 0x0f, 0x42, 0x70, + 0x18, 0x42, 0x16, 0x42, 0x52, 0xd8, 0x35, 0x50, 0xb9, 0xc8, 0xee, 0x97, + 0x8b, 0xc1, 0x0f, 0x25, 0x9b, 0x6a, 0xf1, 0x48, 0x08, 0x05, 0x48, 0x88, + 0xa0, 0x80, 0xac, 0x59, 0xc5, 0xeb, 0xb7, 0xe8, 0x01, 0x56, 0x67, 0x0d, + 0x7f, 0x88, 0x78, 0x32, 0x86, 0x7d, 0xa5, 0x8c, 0x3d, 0x49, 0x24, 0xab, + 0x87, 0xa1, 0xe8, 0x53, 0x96, 0x08, 0x42, 0x6a, 0x72, 0x15, 0x43, 0xb1, + 0x7c, 0x8f, 0x5a, 0x9b, 0x6d, 0x4a, 0x8b, 0x95, 0x45, 0x6c, 0x10, 0xb8, + 0x93, 0x95, 0x41, 0x72, 0x33, 0x10, 0x42, 0x10, 0x8d, 0xbe, 0x77, 0xe8, + 0x4d, 0x65, 0x83, 0x8d, 0x8e, 0x31, 0x7b, 0xf7, 0x5c, 0x02, 0x66, 0x5c, + 0x49, 0x59, 0xc0, 0xf0, 0xaa, 0x06, 0xfb, 0x88, 0xa4, 0x52, 0x78, 0x19, + 0x4d, 0x35, 0x29, 0xe4, 0x2d, 0x80, 0xf5, 0x31, 0x5e, 0x37, 0xc9, 0x41, + 0xa5, 0x35, 0x49, 0xd9, 0x8d, 0x2c, 0xc9, 0x3c, 0xc8, 0x2c, 0x3e, 0xec, + 0x5e, 0x90, 0xd4, 0xd0, 0x41, 0xa2, 0x5b, 0x99, 0xa9, 0x93, 0x26, 0xa9, + 0xf8, 0x28, 0x26, 0x9b, 0x98, 0x96, 0x93, 0x57, 0x60, 0xaf, 0x43, 0xd4, + 0x27, 0x32, 0x8b, 0x35, 0xb6, 0xc7, 0x4c, 0x10, 0xef, 0xdf, 0xeb, 0x2f, + 0xe0, 0x83, 0xa1, 0x42, 0x4c, 0x21, 0x2b, 0xa1, 0xc9, 0x35, 0xcb, 0x36, + 0xe8, 0x89, 0x1a, 0x5c, 0xee, 0x21, 0xa4, 0x49, 0xb1, 0x54, 0x75, 0xba, + 0x0c, 0x55, 0x0a, 0xa7, 0xd0, 0x32, 0x2f, 0x63, 0x0d, 0x8a, 0xf8, 0x24, + 0x63, 0xc3, 0xb6, 0x0d, 0x8d, 0x8d, 0xe0, 0x62, 0xae, 0x31, 0xbc, 0x43, + 0x63, 0xd3, 0x06, 0xb0, 0x43, 0xd4, 0x5d, 0xd4, 0x50, 0x34, 0x31, 0xd6, + 0xea, 0xe0, 0xa3, 0x5a, 0x4b, 0x82, 0x89, 0xe6, 0x84, 0x92, 0x27, 0xb9, + 0x2f, 0x92, 0x1b, 0xa6, 0x59, 0x18, 0xd2, 0x53, 0xaf, 0xec, 0x35, 0x06, + 0xc6, 0x1b, 0x10, 0xa8, 0x40, 0x52, 0x7d, 0xca, 0x88, 0xc3, 0x52, 0x8c, + 0x65, 0x5a, 0xe0, 0xa0, 0xfa, 0x9f, 0xb3, 0x62, 0x20, 0xa3, 0x55, 0x33, + 0xe5, 0xa8, 0x7b, 0x57, 0xe0, 0x64, 0xe1, 0x43, 0x76, 0xf9, 0x8f, 0x41, + 0xea, 0x49, 0x25, 0x64, 0xee, 0x49, 0x25, 0x8e, 0x04, 0x2c, 0x1b, 0x96, + 0x92, 0xab, 0xd9, 0xfe, 0x83, 0x33, 0x55, 0x27, 0x90, 0x4e, 0x25, 0xf3, + 0x2b, 0xb3, 0x20, 0xad, 0x72, 0x7a, 0x84, 0xb3, 0x18, 0x4c, 0x4c, 0x4c, + 0x9f, 0xfd, 0xa0, 0x41, 0x58, 0x72, 0x47, 0xa8, 0xc5, 0xc6, 0xcc, 0x5b, + 0x78, 0xd8, 0x4a, 0xa5, 0x67, 0x80, 0xae, 0x56, 0x35, 0x12, 0x68, 0x25, + 0x9b, 0x2e, 0x5f, 0x8e, 0x82, 0xe6, 0x88, 0xda, 0xe2, 0xfa, 0x7c, 0x8f, + 0xad, 0x84, 0x31, 0xe5, 0x31, 0xc0, 0xff, 0x00, 0x21, 0xca, 0xb2, 0x1d, + 0x53, 0x9e, 0x1c, 0x4b, 0x0d, 0x49, 0x4c, 0x22, 0xb4, 0x23, 0x29, 0x0b, + 0x80, 0x92, 0x94, 0xb4, 0x5d, 0xc7, 0x1a, 0xc6, 0x94, 0xa9, 0xc2, 0xd8, + 0xae, 0x8c, 0x98, 0x95, 0x1a, 0x84, 0x45, 0x44, 0xfd, 0x92, 0xf0, 0x4a, + 0x9f, 0x92, 0xe2, 0x24, 0x58, 0x84, 0x69, 0x49, 0x6e, 0x49, 0x6e, 0x3f, + 0xa1, 0x31, 0xe4, 0x3e, 0xc5, 0xe1, 0x89, 0x10, 0x89, 0xc1, 0xa1, 0x79, + 0x32, 0x18, 0xc6, 0x24, 0x7e, 0x2e, 0x64, 0x94, 0x91, 0x23, 0xb0, 0xc7, + 0x61, 0x29, 0x63, 0x56, 0x91, 0xba, 0xbf, 0x47, 0x82, 0xa7, 0x19, 0x4a, + 0xe2, 0x5c, 0xd4, 0x71, 0xb9, 0x22, 0x55, 0x51, 0x47, 0x3c, 0x39, 0x19, + 0xa3, 0x50, 0xa4, 0xa4, 0x4f, 0x44, 0xc0, 0x9b, 0x70, 0x88, 0x24, 0x22, + 0x2f, 0x90, 0xf4, 0x1b, 0xc0, 0x6c, 0x4c, 0x81, 0x90, 0xf2, 0x09, 0xe4, + 0x89, 0xf8, 0x13, 0x49, 0xcc, 0x7b, 0xff, 0x00, 0x05, 0xb3, 0xcf, 0x85, + 0x0a, 0x44, 0x96, 0xc1, 0x0c, 0x7d, 0xe8, 0x5b, 0xb6, 0x29, 0x1a, 0x86, + 0xbe, 0xe3, 0x50, 0x6a, 0x92, 0x36, 0x3d, 0x45, 0x3c, 0xd8, 0xda, 0xe3, + 0x04, 0xc9, 0x19, 0xea, 0x6b, 0x74, 0xb6, 0x5c, 0x19, 0x31, 0xdb, 0x21, + 0x39, 0x8a, 0x22, 0x41, 0xab, 0xd4, 0xef, 0x20, 0xb3, 0x22, 0x29, 0x99, + 0x55, 0x48, 0x2e, 0x7e, 0x85, 0x3c, 0x31, 0x4c, 0x93, 0xc6, 0x78, 0x59, + 0x0f, 0x89, 0x8f, 0x6b, 0xe4, 0x52, 0xc2, 0x7a, 0xe2, 0x57, 0x2c, 0x05, + 0x71, 0x97, 0x28, 0xa3, 0x62, 0x42, 0x87, 0x7d, 0x25, 0x0b, 0x30, 0xa3, + 0x7a, 0x8b, 0xb3, 0xd4, 0x56, 0xa9, 0x92, 0x54, 0x7a, 0x13, 0x22, 0xa0, + 0xb7, 0x34, 0xc1, 0x65, 0x23, 0x48, 0x4b, 0x27, 0x54, 0x9d, 0x5e, 0xe2, + 0x92, 0x98, 0x41, 0x92, 0x34, 0xad, 0x51, 0x0a, 0xb6, 0x57, 0xcc, 0x9e, + 0x58, 0x16, 0x79, 0x5f, 0x71, 0x91, 0x30, 0x8e, 0xd1, 0x2a, 0x9b, 0x6e, + 0x3d, 0xe1, 0xef, 0xd9, 0x61, 0x93, 0x94, 0x52, 0x4c, 0x3c, 0x08, 0x92, + 0x49, 0x0f, 0x2c, 0xd8, 0x6c, 0xb9, 0x51, 0xb8, 0x3d, 0xb1, 0x50, 0x1e, + 0x0d, 0x3d, 0x4b, 0x0a, 0x54, 0x42, 0x25, 0x4c, 0xc4, 0xe0, 0xe3, 0x1a, + 0x55, 0xe5, 0xfd, 0x9a, 0x25, 0xb4, 0xaa, 0x5b, 0xf7, 0x11, 0xb1, 0x98, + 0x46, 0xfc, 0xa1, 0x48, 0xaa, 0x9b, 0xbf, 0x5e, 0xb7, 0xfa, 0xb5, 0x1a, + 0x83, 0x63, 0x0d, 0x93, 0x81, 0x43, 0xd0, 0x8b, 0x74, 0xeb, 0xee, 0x88, + 0xbe, 0xa1, 0xd8, 0xd3, 0x85, 0x86, 0x18, 0x62, 0x26, 0x46, 0xe2, 0x14, + 0x4e, 0xea, 0x71, 0x48, 0x76, 0xa9, 0xec, 0x38, 0x6a, 0x92, 0x36, 0x58, + 0xcf, 0x56, 0xf1, 0xb5, 0xc6, 0x09, 0x8e, 0x93, 0x52, 0x3a, 0x25, 0x28, + 0x0d, 0xd0, 0x82, 0x34, 0xc5, 0xa3, 0xa5, 0x1c, 0x2c, 0x14, 0xf7, 0x55, + 0x26, 0x4a, 0x06, 0x69, 0x68, 0x9d, 0x48, 0x27, 0x56, 0x20, 0xc4, 0xc9, + 0x13, 0x24, 0xf1, 0xb5, 0xea, 0xb0, 0xa6, 0x83, 0x60, 0xc3, 0x9f, 0x73, + 0x92, 0x44, 0x28, 0x42, 0xe1, 0xc7, 0x16, 0x5a, 0x12, 0x8c, 0x04, 0xe8, + 0x4d, 0x3c, 0x04, 0xf3, 0x92, 0xd4, 0xc8, 0x4a, 0xaa, 0xd1, 0x4b, 0xf8, + 0x2b, 0x6d, 0xbb, 0xe3, 0x19, 0xe4, 0x55, 0xf8, 0xf4, 0xf6, 0x22, 0xd5, + 0x4a, 0x82, 0x1e, 0x75, 0xc1, 0x0a, 0xbc, 0xe0, 0x6a, 0x1d, 0xa5, 0xee, + 0x29, 0x6d, 0x02, 0x4d, 0x7f, 0x31, 0x23, 0x76, 0x2e, 0x12, 0x71, 0x33, + 0xd6, 0x17, 0xe2, 0x4c, 0x92, 0x46, 0xea, 0x3c, 0xbd, 0xa3, 0x93, 0x28, + 0x89, 0xa8, 0xb0, 0x30, 0x1e, 0x01, 0x8c, 0x63, 0x65, 0xc4, 0xe0, 0x3d, + 0xcc, 0xc6, 0xa6, 0x7f, 0x68, 0xb3, 0xb0, 0xa4, 0x55, 0x57, 0x43, 0xc5, + 0xbe, 0xad, 0x4b, 0x06, 0xc6, 0x1b, 0x24, 0x72, 0x1f, 0xc2, 0x69, 0x14, + 0xad, 0xe7, 0x3c, 0x0f, 0xac, 0x16, 0x8f, 0xd0, 0xa8, 0x1a, 0x07, 0xe8, + 0x9f, 0xfa, 0x2c, 0x28, 0x6e, 0xbf, 0x04, 0x38, 0x61, 0x24, 0x96, 0x9e, + 0xa9, 0x8d, 0xac, 0x27, 0x05, 0x75, 0x8a, 0x8f, 0x0a, 0xf9, 0x19, 0x32, + 0xeb, 0xae, 0x6d, 0x85, 0x27, 0x31, 0x36, 0x61, 0x36, 0x88, 0xa4, 0x49, + 0x2d, 0x48, 0xe5, 0xd8, 0x4b, 0x19, 0x24, 0x8f, 0x77, 0x00, 0x6a, 0x0d, + 0x83, 0x0c, 0x4c, 0xf5, 0xfd, 0x88, 0x01, 0xa7, 0x03, 0x71, 0x23, 0x14, + 0xe4, 0x10, 0x8b, 0x4a, 0x3d, 0xe0, 0x68, 0x20, 0x37, 0x5a, 0x14, 0x0d, + 0x33, 0x89, 0x57, 0x66, 0xde, 0x1f, 0xe8, 0x78, 0xa7, 0xe2, 0x7c, 0x8d, + 0x0a, 0x5c, 0x83, 0x97, 0xe5, 0x09, 0x52, 0xbb, 0x18, 0xcd, 0x42, 0x28, + 0x68, 0x87, 0x3d, 0x29, 0x35, 0x62, 0xb3, 0x55, 0xd4, 0x7c, 0x48, 0x23, + 0xea, 0xc7, 0xaf, 0x14, 0x72, 0x97, 0xe2, 0x92, 0x49, 0x1b, 0x1a, 0x78, + 0xe3, 0x63, 0x4b, 0x68, 0x4a, 0x08, 0xc6, 0xbc, 0xa1, 0x0e, 0x29, 0x0c, + 0x32, 0x47, 0x1b, 0x97, 0x05, 0x48, 0xb7, 0x13, 0x63, 0x0d, 0x7b, 0x50, + 0x4f, 0x43, 0x01, 0x6b, 0xa1, 0x8f, 0x07, 0xfb, 0x75, 0x45, 0x83, 0x0d, + 0x84, 0x8d, 0x52, 0x80, 0x7f, 0x4f, 0xd8, 0x6e, 0xb1, 0xe0, 0x58, 0xf7, + 0xd6, 0x07, 0xe6, 0xe9, 0x4d, 0x5b, 0x83, 0xb3, 0x5f, 0xe0, 0x98, 0x8a, + 0xb6, 0xaf, 0xec, 0x89, 0xcc, 0x24, 0x92, 0x5a, 0x7a, 0xb1, 0x24, 0x96, + 0x48, 0x56, 0xed, 0xc0, 0xe6, 0xc1, 0x53, 0x50, 0x85, 0x25, 0x4d, 0x18, + 0xae, 0xaa, 0xf1, 0xca, 0x53, 0x2b, 0x13, 0x66, 0x95, 0xcd, 0xc7, 0xa9, + 0xc4, 0x63, 0x4e, 0xd8, 0x2e, 0x01, 0x51, 0xaa, 0x13, 0xb0, 0xd5, 0xbb, + 0x19, 0x6f, 0xd3, 0x04, 0x35, 0x4f, 0x92, 0xf1, 0xc6, 0xf1, 0x31, 0x2b, + 0xdd, 0x0a, 0x11, 0x16, 0x11, 0xc4, 0x49, 0x5d, 0x0a, 0x8d, 0x88, 0xa0, + 0x47, 0xd4, 0x22, 0xde, 0x79, 0x92, 0x88, 0x21, 0x30, 0xda, 0xc2, 0x02, + 0x4c, 0x9d, 0x53, 0xe8, 0x3b, 0xe3, 0x3e, 0x27, 0xc9, 0x71, 0x20, 0x25, + 0x24, 0x96, 0x70, 0xa8, 0x32, 0x30, 0x26, 0x52, 0x34, 0x13, 0xc1, 0x79, + 0x16, 0xf3, 0x2e, 0x78, 0x2b, 0x95, 0x63, 0x4f, 0x39, 0x47, 0x28, 0x6a, + 0x92, 0x22, 0x49, 0x1b, 0x1b, 0x19, 0x88, 0x8d, 0x91, 0x03, 0x41, 0x39, + 0x95, 0x9e, 0x46, 0xa0, 0x5b, 0x88, 0x62, 0xb8, 0x16, 0x56, 0x87, 0x83, + 0x33, 0x42, 0xc3, 0xa0, 0xda, 0x2a, 0x69, 0xd9, 0x52, 0x2a, 0x4f, 0x43, + 0x40, 0x65, 0x37, 0x52, 0x08, 0x28, 0x1c, 0xd4, 0xb5, 0x8c, 0x8d, 0x8c, + 0x9a, 0x8f, 0xf7, 0xea, 0x8b, 0x06, 0x18, 0x92, 0x46, 0x20, 0x06, 0xad, + 0xec, 0xbd, 0x86, 0x18, 0x7e, 0x80, 0x50, 0x46, 0x18, 0xac, 0x3c, 0x23, + 0x8d, 0x85, 0xc6, 0xc5, 0x51, 0xdf, 0x3c, 0x85, 0x52, 0xcc, 0x43, 0x90, + 0x59, 0xb8, 0x5b, 0xb5, 0x62, 0x88, 0x90, 0x49, 0x25, 0x87, 0xa8, 0x13, + 0x85, 0x81, 0x53, 0xa4, 0xc1, 0x41, 0xaa, 0xe4, 0x9a, 0x8f, 0x03, 0xa2, + 0xa0, 0xa9, 0xd0, 0x1e, 0x65, 0xa4, 0x91, 0x2f, 0x45, 0x81, 0x2f, 0xfa, + 0x3d, 0x29, 0x27, 0xce, 0x09, 0xca, 0xc9, 0xa0, 0xfe, 0x66, 0xe1, 0x11, + 0x09, 0x24, 0xa5, 0xfd, 0x51, 0x97, 0x8e, 0x3c, 0x18, 0x7a, 0x8f, 0x1c, + 0x41, 0xe4, 0x40, 0xa7, 0xa0, 0x2b, 0x10, 0x91, 0x89, 0x2f, 0x22, 0x7e, + 0x4e, 0x03, 0x04, 0xb0, 0xf4, 0x9d, 0x3b, 0xa2, 0xb4, 0x5f, 0xb6, 0x2d, + 0xe2, 0x7c, 0x05, 0x93, 0x32, 0xfd, 0x8a, 0xac, 0x3a, 0xe7, 0x62, 0x04, + 0x38, 0x5c, 0x5e, 0xa9, 0x91, 0xdc, 0x48, 0x43, 0x48, 0xc3, 0x94, 0x7c, + 0x42, 0x1a, 0x21, 0xd9, 0x8b, 0x50, 0x4b, 0x4e, 0x6a, 0x09, 0xaf, 0x14, + 0x72, 0x0b, 0xb0, 0x58, 0x38, 0x0d, 0x0a, 0x8f, 0x59, 0xf7, 0xc0, 0x91, + 0xa4, 0x6b, 0x0a, 0x22, 0x56, 0xa1, 0x54, 0x49, 0xce, 0x08, 0x41, 0x6e, + 0xe7, 0xd5, 0x5a, 0x0c, 0x9a, 0xd0, 0x9e, 0x28, 0xac, 0xc4, 0x99, 0xb0, + 0xda, 0x19, 0xc0, 0xde, 0xb2, 0xd1, 0x24, 0xe0, 0xd8, 0xd9, 0x23, 0x7d, + 0x3a, 0xac, 0x07, 0x18, 0x92, 0x44, 0xf0, 0x2f, 0x69, 0x0f, 0xd3, 0x62, + 0x8a, 0xc3, 0x5d, 0x5e, 0x0d, 0x84, 0xe3, 0x63, 0xae, 0x1b, 0x08, 0x92, + 0x47, 0xaf, 0xff, 0x00, 0xb2, 0x22, 0x8b, 0xf4, 0x92, 0x89, 0x90, 0xef, + 0x84, 0x96, 0x1e, 0xac, 0x49, 0x23, 0x78, 0x09, 0xc6, 0x5e, 0x90, 0xc6, + 0xf2, 0xb1, 0x5c, 0x5a, 0x36, 0x4a, 0xb1, 0x5d, 0x90, 0xcd, 0x26, 0x1e, + 0xe7, 0xd9, 0x16, 0xe4, 0xa8, 0x6c, 0x60, 0xcd, 0xd9, 0x88, 0xd4, 0xda, + 0xe1, 0x54, 0x24, 0x4c, 0x4c, 0x4c, 0xa0, 0xfd, 0xd3, 0x0b, 0x92, 0x48, + 0x87, 0x1a, 0x38, 0xc3, 0xc9, 0x6a, 0x23, 0xd0, 0x8e, 0x55, 0x78, 0x1a, + 0xe2, 0x07, 0x24, 0x44, 0x88, 0x42, 0xe3, 0xd1, 0x0d, 0xd7, 0xd2, 0xfc, + 0x0f, 0x07, 0x98, 0x75, 0x74, 0xb5, 0x87, 0x38, 0x8a, 0xbe, 0xf5, 0xb1, + 0x19, 0xb9, 0x9e, 0xef, 0xf3, 0x21, 0x39, 0x13, 0x25, 0x20, 0xe4, 0xa1, + 0x56, 0x39, 0x04, 0xe5, 0x2f, 0x8a, 0x16, 0xe1, 0xdc, 0x20, 0x4c, 0x91, + 0xd0, 0xa3, 0x93, 0xee, 0x5d, 0x82, 0xc0, 0x69, 0x2c, 0x28, 0x87, 0x22, + 0x4d, 0x0d, 0x56, 0x5f, 0xb8, 0xf8, 0x19, 0x8c, 0x49, 0x1e, 0x3d, 0x13, + 0x2f, 0x11, 0xd8, 0x89, 0x87, 0x51, 0x35, 0xc0, 0x68, 0x66, 0xc4, 0xb3, + 0xdb, 0xe4, 0x44, 0xd0, 0x6a, 0x39, 0x2c, 0x12, 0x49, 0x24, 0x8d, 0x93, + 0x51, 0xbc, 0xbf, 0x74, 0x58, 0x38, 0xd8, 0x48, 0x98, 0xf4, 0x0d, 0x47, + 0x0c, 0x2c, 0x37, 0x40, 0x08, 0x2e, 0x86, 0x61, 0xb1, 0x86, 0xc6, 0x1b, + 0xac, 0x78, 0x81, 0x9c, 0xe5, 0xfe, 0xc0, 0x8f, 0xb3, 0x2e, 0x4c, 0x1b, + 0x24, 0x4c, 0x6a, 0x61, 0x13, 0x83, 0x78, 0x08, 0x1e, 0x92, 0xfd, 0xe6, + 0x89, 0x04, 0x35, 0xd7, 0xfa, 0x16, 0x5b, 0x78, 0xff, 0x00, 0x24, 0xea, + 0x40, 0xe5, 0x53, 0x4f, 0x81, 0x96, 0xb3, 0x46, 0xd0, 0xfe, 0x07, 0xe0, + 0xa1, 0xf0, 0xc1, 0x86, 0xb5, 0x43, 0xa7, 0x7a, 0xfa, 0x0c, 0xf7, 0x15, + 0x09, 0x92, 0x26, 0x26, 0x50, 0x77, 0x65, 0xa3, 0xe2, 0x98, 0xf5, 0x1e, + 0x3e, 0x9b, 0x0f, 0x25, 0xec, 0x56, 0x71, 0x81, 0x5b, 0x0c, 0xe9, 0x1d, + 0x17, 0xd1, 0x48, 0xd4, 0x0c, 0xd5, 0xb5, 0x2b, 0xeb, 0x59, 0xa6, 0x5d, + 0x86, 0x32, 0xd6, 0xc2, 0x49, 0xb2, 0x4e, 0x17, 0x34, 0x4d, 0x97, 0xa9, + 0x3e, 0xe3, 0x20, 0x4d, 0x8c, 0x31, 0xc0, 0x2d, 0x16, 0x72, 0xb0, 0xd4, + 0x88, 0x22, 0xd4, 0xa9, 0x28, 0xfb, 0x95, 0x2e, 0xc1, 0xb8, 0x43, 0x72, + 0x48, 0x52, 0x38, 0x22, 0xe3, 0x56, 0xfd, 0xc6, 0x66, 0x3c, 0x86, 0x90, + 0x89, 0xa7, 0x91, 0xc9, 0x57, 0x66, 0xc7, 0x21, 0x1a, 0x0c, 0xb8, 0x56, + 0x09, 0x25, 0x6e, 0x47, 0x9f, 0xa6, 0x6c, 0x0b, 0x79, 0x86, 0xa0, 0x92, + 0x49, 0x1b, 0x1b, 0x1b, 0x1a, 0xbe, 0x7e, 0xe8, 0x4c, 0x38, 0xdf, 0x43, + 0x50, 0x34, 0xe0, 0x8d, 0x84, 0xb0, 0x08, 0xae, 0x9f, 0x36, 0x36, 0x36, + 0x30, 0xd8, 0xdd, 0x61, 0xdc, 0x4c, 0x30, 0xac, 0x2a, 0xc4, 0x72, 0x17, + 0xee, 0x2b, 0x5e, 0x49, 0xc1, 0x32, 0xce, 0x80, 0xf4, 0x03, 0xfd, 0xe1, + 0x6d, 0xfc, 0x10, 0x29, 0x77, 0x1b, 0x63, 0x62, 0xfb, 0x29, 0x5a, 0x5a, + 0x15, 0x93, 0x84, 0xcf, 0xba, 0xa7, 0xa9, 0x5b, 0x0a, 0x2e, 0x44, 0xa8, + 0x68, 0xaa, 0x66, 0xf4, 0x65, 0x39, 0xe8, 0x20, 0x93, 0x24, 0x4c, 0x91, + 0x1f, 0x49, 0xb6, 0x13, 0x62, 0x87, 0xa8, 0xdf, 0x7e, 0x98, 0x16, 0x07, + 0xab, 0x28, 0x8a, 0xf8, 0x4b, 0x4a, 0x2f, 0x66, 0x53, 0x16, 0xe1, 0x9c, + 0xc1, 0xb3, 0xb4, 0x92, 0x7c, 0xca, 0x1e, 0x0f, 0xd2, 0x7c, 0x93, 0x57, + 0x23, 0x0f, 0xca, 0xcd, 0x8d, 0x92, 0xc9, 0xcf, 0xa8, 0xb4, 0x2a, 0x7a, + 0x63, 0x55, 0x76, 0xa5, 0x7d, 0xd8, 0xd1, 0x77, 0x39, 0x92, 0xb5, 0x29, + 0xfa, 0x15, 0x2e, 0xc1, 0x90, 0x24, 0x0a, 0xe3, 0x8f, 0x77, 0xef, 0x84, + 0xd4, 0xb0, 0x91, 0xa4, 0xb5, 0x39, 0x06, 0x10, 0xe0, 0x2b, 0x3a, 0x16, + 0x42, 0x56, 0x3b, 0x88, 0x30, 0x65, 0x66, 0xee, 0x6c, 0x42, 0x82, 0xaf, + 0xa6, 0x6c, 0x6f, 0x69, 0xeb, 0xc6, 0xa2, 0x24, 0x9c, 0x1b, 0x24, 0x6c, + 0x83, 0xb9, 0xf0, 0x20, 0xc3, 0xe8, 0x6a, 0x0a, 0xba, 0x20, 0x82, 0x08, + 0x26, 0x26, 0x4e, 0x09, 0x18, 0x61, 0xb1, 0xb1, 0x86, 0xc6, 0x1e, 0x07, + 0xc5, 0x43, 0x73, 0xad, 0xfa, 0x33, 0xec, 0x59, 0x89, 0x71, 0x48, 0xec, + 0x31, 0xa4, 0x91, 0xa9, 0xe0, 0x78, 0x39, 0xcd, 0xe1, 0x7f, 0xa4, 0x8d, + 0xd2, 0xcf, 0x11, 0x71, 0x68, 0x44, 0x00, 0x57, 0xf7, 0x31, 0xad, 0xd0, + 0x91, 0xe1, 0x10, 0x28, 0x82, 0x5c, 0x8e, 0x2c, 0xdc, 0xd8, 0x99, 0x41, + 0xab, 0x21, 0x28, 0x9d, 0x26, 0xc2, 0x47, 0x64, 0x4d, 0x2f, 0x81, 0x32, + 0x49, 0x1b, 0xe8, 0xdb, 0x01, 0xbe, 0x86, 0xa8, 0xff, 0x00, 0x4e, 0x98, + 0x4d, 0x61, 0xca, 0x0c, 0x0a, 0xe3, 0xe4, 0x35, 0x1c, 0x4f, 0x32, 0xb4, + 0xd1, 0x54, 0xfb, 0x2a, 0x49, 0x7e, 0x09, 0xc3, 0x30, 0x77, 0x72, 0x31, + 0x54, 0x6f, 0x8b, 0x95, 0x1f, 0x18, 0x14, 0x38, 0x1e, 0x01, 0xd4, 0x23, + 0x4d, 0xfb, 0x8f, 0x5c, 0xb5, 0x12, 0x27, 0xc9, 0x4f, 0x28, 0xbb, 0x15, + 0x8d, 0x70, 0x8a, 0x46, 0xc3, 0x64, 0x95, 0x06, 0xd0, 0x1c, 0x32, 0xc3, + 0x3b, 0x94, 0x9e, 0x42, 0x24, 0x3a, 0x56, 0x4b, 0x3a, 0x73, 0x9b, 0x21, + 0xf3, 0x7a, 0x00, 0x79, 0x6f, 0xab, 0x8d, 0x53, 0xea, 0xc4, 0xe8, 0x49, + 0x23, 0x63, 0x63, 0x64, 0x91, 0x73, 0xc4, 0x18, 0x7d, 0x0e, 0x1a, 0x56, + 0x20, 0xc2, 0x09, 0x89, 0x89, 0x8b, 0xa6, 0x18, 0xc6, 0x3c, 0x47, 0xd4, + 0x14, 0x2b, 0x32, 0x05, 0xef, 0xb5, 0xf5, 0x13, 0x32, 0x49, 0x24, 0x76, + 0x1c, 0x92, 0x48, 0xf1, 0x34, 0xd0, 0xba, 0x31, 0x49, 0x3c, 0xff, 0x00, + 0x82, 0xf1, 0x34, 0xdc, 0x8d, 0x59, 0x8a, 0x37, 0x3f, 0x90, 0x82, 0x53, + 0x42, 0x1a, 0xee, 0x95, 0xaa, 0xe9, 0x90, 0xa1, 0xa0, 0xa0, 0x97, 0xba, + 0xb3, 0xd5, 0x0a, 0x34, 0xba, 0x1e, 0x09, 0x45, 0x4a, 0x09, 0x13, 0x16, + 0x0d, 0xc0, 0xff, 0x00, 0x46, 0xc5, 0x83, 0x78, 0xa1, 0xab, 0x87, 0xdc, + 0x30, 0x6b, 0xf2, 0x3d, 0x11, 0x40, 0xa6, 0xf0, 0xd0, 0x70, 0x40, 0xf0, + 0x33, 0x52, 0xd6, 0x83, 0xd7, 0x72, 0x02, 0xde, 0x0f, 0x90, 0x2a, 0x0d, + 0x09, 0xa5, 0x7a, 0x95, 0x57, 0x46, 0xa1, 0x53, 0x94, 0xd7, 0xed, 0x93, + 0x0c, 0xa0, 0x2f, 0x43, 0xa8, 0x6c, 0xca, 0x13, 0x1f, 0x5f, 0x72, 0x26, + 0x3b, 0x39, 0x33, 0x4c, 0xca, 0x00, 0xef, 0x82, 0x42, 0x58, 0xe5, 0x28, + 0xe2, 0x12, 0x6a, 0x4c, 0xe0, 0xa7, 0xcd, 0x04, 0xfb, 0x8d, 0x25, 0x66, + 0xc8, 0x0a, 0x62, 0x49, 0x90, 0x17, 0x70, 0x78, 0xb6, 0x1e, 0xb7, 0x77, + 0xc9, 0x77, 0xea, 0xe3, 0xd4, 0xfa, 0xd1, 0x3a, 0x12, 0x48, 0xd8, 0xc7, + 0x84, 0x1c, 0xcf, 0x61, 0x3a, 0x47, 0x1b, 0x24, 0x9c, 0x1c, 0x5f, 0x18, + 0x30, 0x98, 0x84, 0x27, 0xd3, 0x23, 0x0c, 0x36, 0x36, 0x3c, 0x0f, 0x03, + 0xc0, 0xa2, 0xe0, 0x36, 0xc6, 0x44, 0x32, 0x30, 0x91, 0xba, 0x0d, 0xe4, + 0x24, 0x9c, 0x2f, 0x01, 0x7f, 0x62, 0xfc, 0x74, 0xa2, 0x50, 0x85, 0xa6, + 0xfb, 0x6c, 0x51, 0xeb, 0x14, 0x84, 0x96, 0x65, 0xb0, 0x35, 0x12, 0xcb, + 0xa0, 0x76, 0x12, 0xe2, 0xd9, 0x31, 0xec, 0x2c, 0x32, 0xb5, 0x2c, 0x3f, + 0xa0, 0x26, 0x89, 0xa8, 0x9e, 0x26, 0xcb, 0xfb, 0x86, 0xe8, 0x45, 0xe5, + 0xd1, 0x7b, 0x1a, 0xc3, 0xd4, 0x35, 0x07, 0xa2, 0x1a, 0xa5, 0x83, 0xd5, + 0xb0, 0x4e, 0x09, 0x92, 0xff, 0x00, 0x00, 0x71, 0xee, 0xe8, 0x17, 0xb0, + 0xd4, 0x74, 0xcb, 0x4b, 0xc0, 0xc2, 0x9e, 0xea, 0x10, 0xc3, 0x7a, 0xdd, + 0x19, 0xbf, 0xee, 0x16, 0x44, 0xa6, 0x7e, 0xea, 0x78, 0xf7, 0x91, 0xdb, + 0x31, 0x18, 0x4e, 0x07, 0x13, 0x55, 0x4f, 0x82, 0xf2, 0x1a, 0x8c, 0x0c, + 0x30, 0xf3, 0x86, 0x69, 0x6c, 0x4d, 0xad, 0x56, 0xb8, 0xea, 0x9e, 0x51, + 0xe0, 0x48, 0x8c, 0x1e, 0x0a, 0x51, 0xb3, 0x09, 0x3d, 0x71, 0x23, 0x49, + 0x64, 0x77, 0x8a, 0xb1, 0xf9, 0xba, 0x95, 0xa4, 0xbc, 0x28, 0x54, 0x24, + 0xa5, 0x95, 0x82, 0xe4, 0x29, 0xe6, 0x4c, 0xfc, 0x95, 0x9e, 0x6b, 0xe4, + 0x84, 0xc3, 0x73, 0x42, 0xdc, 0x52, 0x3c, 0x1e, 0x0f, 0x1d, 0xff, 0x00, + 0x70, 0x9d, 0x05, 0x4c, 0x81, 0x88, 0xc2, 0xe1, 0xa7, 0x8b, 0x03, 0x08, + 0x4c, 0x41, 0x61, 0x2c, 0x5c, 0x8f, 0x16, 0x31, 0xe2, 0x31, 0x8f, 0x02, + 0x08, 0x50, 0xfc, 0x0d, 0x18, 0xcb, 0xc1, 0x63, 0xa5, 0x93, 0xbd, 0x67, + 0x71, 0xab, 0xfd, 0x0b, 0xfc, 0x81, 0x2c, 0x5f, 0x0e, 0x13, 0x03, 0xe3, + 0x7a, 0x34, 0x9f, 0xc9, 0x25, 0x25, 0xb5, 0x38, 0x98, 0xcb, 0x67, 0x57, + 0xc9, 0x34, 0xb9, 0x20, 0xa5, 0x85, 0x84, 0xb6, 0x63, 0x9e, 0xc1, 0x21, + 0xc1, 0x94, 0x61, 0x33, 0x2c, 0x24, 0x5a, 0xfe, 0xc1, 0xa5, 0xcb, 0x6d, + 0x8c, 0xa2, 0x44, 0xc4, 0xc4, 0x48, 0xee, 0x2f, 0xa9, 0x86, 0x71, 0x45, + 0xc7, 0xbb, 0xf8, 0x33, 0x8f, 0xd2, 0x8e, 0x43, 0xab, 0x19, 0x21, 0x21, + 0x22, 0x7a, 0xb2, 0x0d, 0x75, 0x7c, 0x33, 0x12, 0x26, 0xcd, 0xd5, 0x29, + 0xa5, 0x1b, 0xff, 0x00, 0x82, 0x60, 0x50, 0x40, 0x87, 0x6e, 0xc5, 0x1b, + 0xd9, 0x1a, 0xde, 0xdd, 0xfe, 0x11, 0x31, 0x14, 0x7c, 0x01, 0x05, 0xfd, + 0x41, 0xb4, 0x92, 0xbb, 0xa9, 0x6c, 0x56, 0x7b, 0x89, 0x8c, 0x71, 0x87, + 0x6d, 0xb8, 0xc9, 0x38, 0x1d, 0xc2, 0xab, 0xc1, 0x52, 0xd6, 0x3d, 0x85, + 0xcd, 0x86, 0x24, 0x10, 0x91, 0x61, 0x04, 0x8c, 0x8a, 0x56, 0xd8, 0x35, + 0xc4, 0xe6, 0x64, 0x0f, 0x73, 0x1a, 0x6a, 0xbc, 0xd4, 0x92, 0x8f, 0x51, + 0xc0, 0x81, 0x8e, 0xbd, 0x88, 0x30, 0x8b, 0xd4, 0x54, 0x85, 0x7d, 0xc6, + 0x09, 0x92, 0x5f, 0x34, 0x75, 0xba, 0xcb, 0x2f, 0xd3, 0xa5, 0x31, 0xee, + 0x46, 0x7b, 0xba, 0xea, 0x67, 0xa1, 0x42, 0x27, 0x59, 0x2b, 0x5e, 0xcc, + 0x9a, 0x46, 0xc9, 0x24, 0x61, 0xe0, 0x1a, 0x70, 0x08, 0x42, 0x62, 0x10, + 0x85, 0x8c, 0x92, 0x48, 0xd8, 0xd8, 0xc6, 0x31, 0x8c, 0x68, 0x62, 0x08, + 0x21, 0x70, 0x92, 0x49, 0xc1, 0x32, 0x1c, 0x9e, 0x61, 0x23, 0xbb, 0x41, + 0x44, 0x25, 0x2d, 0xd1, 0x0d, 0x0f, 0xd8, 0x59, 0xb5, 0x2f, 0x70, 0x03, + 0xd3, 0xd8, 0x68, 0xfd, 0x83, 0x44, 0x77, 0x8e, 0xcd, 0x05, 0x92, 0x20, + 0x41, 0x64, 0x78, 0x6b, 0xe0, 0x7a, 0x35, 0x2f, 0x41, 0x46, 0x24, 0x45, + 0xf0, 0x12, 0x8e, 0x43, 0x89, 0xcf, 0x33, 0x88, 0x12, 0x64, 0x85, 0x3a, + 0x0a, 0x74, 0x67, 0x06, 0x5a, 0xc5, 0x7f, 0xc1, 0x26, 0x64, 0x46, 0x32, + 0x3d, 0x4f, 0x76, 0x52, 0x24, 0xc0, 0x91, 0xd0, 0xca, 0xc4, 0x13, 0x50, + 0x6a, 0x0a, 0x9b, 0x02, 0x2d, 0x4b, 0x7a, 0xa4, 0xc1, 0x07, 0x18, 0x55, + 0x31, 0x9d, 0x27, 0x58, 0x9b, 0x15, 0x59, 0x07, 0x2e, 0xea, 0xc4, 0x38, + 0x65, 0xfe, 0x03, 0x28, 0x4f, 0xa0, 0x9b, 0x52, 0x6f, 0x34, 0x36, 0x2b, + 0x45, 0x70, 0x89, 0x4e, 0xf5, 0xdc, 0x46, 0xc9, 0x60, 0xb0, 0x4e, 0x93, + 0x2c, 0x03, 0xcb, 0x19, 0x49, 0xd8, 0x4a, 0xf7, 0x48, 0x92, 0xb0, 0x9c, + 0x9f, 0x4b, 0x25, 0x86, 0x63, 0x45, 0x7c, 0x12, 0xf9, 0x55, 0x22, 0x5a, + 0xad, 0xa2, 0xd0, 0x47, 0x2d, 0xaf, 0x23, 0x85, 0x58, 0x85, 0x36, 0x22, + 0xd2, 0xee, 0x3d, 0x32, 0x91, 0x0c, 0xda, 0x50, 0xba, 0xcf, 0x48, 0xb1, + 0xa5, 0x47, 0x22, 0x58, 0xaa, 0xa3, 0x22, 0x36, 0xaa, 0x26, 0x6f, 0x1a, + 0xf2, 0xdf, 0x54, 0x81, 0x85, 0x6e, 0x82, 0xf3, 0xad, 0x7c, 0xfc, 0x3f, + 0xd2, 0x0c, 0x7b, 0x73, 0x0e, 0xdc, 0xc0, 0xe6, 0xb3, 0x2d, 0x47, 0xa7, + 0xc0, 0x55, 0xd8, 0x5c, 0xc9, 0x2a, 0xb2, 0x22, 0x57, 0x05, 0x23, 0xa1, + 0x7c, 0x2b, 0x16, 0x26, 0x21, 0x31, 0x31, 0x12, 0x49, 0x24, 0x92, 0x7f, + 0x58, 0x52, 0xc1, 0x8c, 0x68, 0x68, 0x61, 0xa1, 0xa1, 0xa1, 0x30, 0x27, + 0x4c, 0x65, 0x82, 0x20, 0x9b, 0x6e, 0x86, 0xd8, 0x83, 0x7b, 0x0f, 0x61, + 0xd6, 0xa4, 0x93, 0xac, 0x3b, 0x0d, 0xb5, 0x87, 0xac, 0xcb, 0x81, 0x98, + 0x51, 0xbb, 0xb0, 0xa8, 0x90, 0x59, 0x65, 0x31, 0xa5, 0x8a, 0xb9, 0x3a, + 0xab, 0x81, 0x79, 0x5a, 0x89, 0xa9, 0xf4, 0x08, 0x29, 0xca, 0xa8, 0x3d, + 0xae, 0xbe, 0xd1, 0x49, 0x4a, 0xaa, 0xc1, 0x16, 0x57, 0x33, 0x38, 0x43, + 0x3c, 0x1a, 0x1b, 0x11, 0x82, 0x48, 0x25, 0xde, 0x8b, 0xea, 0x1c, 0x50, + 0x58, 0xe8, 0xa6, 0xb2, 0xcc, 0x41, 0x54, 0xf6, 0x59, 0x39, 0x24, 0x8c, + 0xe9, 0x91, 0x60, 0x63, 0x52, 0x34, 0xd0, 0xda, 0x36, 0x04, 0xba, 0x09, + 0x74, 0x22, 0xd5, 0x8b, 0x4f, 0xd2, 0xe0, 0x75, 0x49, 0xb0, 0x1b, 0xb0, + 0xc5, 0x2b, 0x62, 0x69, 0x69, 0x07, 0x54, 0x64, 0x53, 0x52, 0xc9, 0xf2, + 0x7a, 0x28, 0xc5, 0xd2, 0xc5, 0x4f, 0x88, 0x74, 0x28, 0xab, 0xb0, 0xf9, + 0x16, 0x09, 0x19, 0xf4, 0x35, 0xb0, 0xa0, 0xe5, 0x6f, 0x90, 0xd7, 0x10, + 0x97, 0xc9, 0x28, 0x55, 0x50, 0xd8, 0x89, 0x6c, 0x51, 0x97, 0xd0, 0x3a, + 0x50, 0x5f, 0xe2, 0xa4, 0xb9, 0x82, 0x17, 0xc5, 0x88, 0x0a, 0x8a, 0x05, + 0xec, 0x10, 0x5b, 0x54, 0xd9, 0x64, 0x04, 0x2d, 0x6f, 0x69, 0x34, 0xf8, + 0x2b, 0xb4, 0xd4, 0xeb, 0x3f, 0x07, 0xbe, 0x0c, 0x0e, 0x39, 0x99, 0x09, + 0xb3, 0xce, 0x8a, 0xd1, 0x86, 0xe4, 0x93, 0x85, 0x48, 0x52, 0x42, 0x10, + 0x84, 0x22, 0x71, 0x22, 0xb3, 0x22, 0xc8, 0x3c, 0x09, 0xbe, 0xdb, 0x3a, + 0xea, 0x2c, 0x23, 0x7a, 0x60, 0x81, 0xa1, 0xa1, 0xa1, 0x8c, 0x6b, 0x02, + 0x89, 0x80, 0x78, 0xbc, 0x28, 0x5b, 0x6c, 0xa2, 0x0a, 0x22, 0x5b, 0xa9, + 0x54, 0x74, 0xd9, 0x4a, 0xc0, 0x48, 0xf2, 0x63, 0x7c, 0x93, 0x2e, 0x8a, + 0x39, 0x2d, 0x9a, 0x91, 0x35, 0xd4, 0x91, 0xea, 0x39, 0x4f, 0x6b, 0xc8, + 0x62, 0x45, 0x14, 0xde, 0xea, 0x1d, 0xc3, 0x22, 0x60, 0x85, 0xa0, 0x52, + 0xe1, 0x72, 0xb2, 0x62, 0x4a, 0xcb, 0xe8, 0x5e, 0x41, 0xb2, 0x59, 0x08, + 0x4c, 0xab, 0x44, 0x78, 0x4e, 0x37, 0x93, 0xf3, 0x88, 0xc7, 0x52, 0x2a, + 0x60, 0x1e, 0xc8, 0x6a, 0xbd, 0x04, 0x50, 0x92, 0x45, 0x2f, 0x76, 0xc8, + 0xd2, 0x3e, 0x04, 0x26, 0x95, 0xb0, 0xb1, 0x3d, 0x49, 0x93, 0x85, 0xb4, + 0xc8, 0x55, 0xc9, 0xf7, 0x41, 0x90, 0xaf, 0x64, 0x93, 0xa8, 0xea, 0x1f, + 0x04, 0x1d, 0x65, 0x65, 0x61, 0x4e, 0xb7, 0x26, 0x65, 0x82, 0xb6, 0xec, + 0xe9, 0x92, 0x47, 0x63, 0xb8, 0x68, 0x50, 0xb2, 0x86, 0xcc, 0xe8, 0x8d, + 0x20, 0xa5, 0xae, 0x44, 0xa4, 0xa5, 0x99, 0x4a, 0xc6, 0x41, 0x85, 0x03, + 0xad, 0x46, 0xfb, 0x50, 0xb4, 0xb6, 0x24, 0xae, 0x4d, 0x36, 0x6d, 0x03, + 0x5a, 0x5c, 0xb6, 0x22, 0xd4, 0x5b, 0xec, 0x13, 0x20, 0xbb, 0x2c, 0x93, + 0x2c, 0x36, 0x20, 0x8d, 0x5a, 0xc5, 0x60, 0xba, 0x8b, 0xd6, 0x3b, 0xa3, + 0x5a, 0x8d, 0x55, 0xa2, 0x81, 0xed, 0xa9, 0x58, 0xcb, 0x83, 0xe8, 0x38, + 0x8c, 0x22, 0x42, 0x08, 0x24, 0x20, 0x82, 0x1c, 0xe4, 0x91, 0xb8, 0xdb, + 0x61, 0xe4, 0xa8, 0x3d, 0x76, 0x7c, 0x89, 0x5e, 0x64, 0x22, 0x82, 0x58, + 0x22, 0x4b, 0x61, 0xbd, 0x8d, 0xe1, 0x26, 0xae, 0x16, 0x99, 0xad, 0x2a, + 0x17, 0xa1, 0xb8, 0xb5, 0xa2, 0x7a, 0x3a, 0x13, 0x23, 0x18, 0xd0, 0xd0, + 0xfa, 0x05, 0xde, 0x2f, 0x0a, 0xe6, 0xf3, 0x75, 0xb9, 0x0a, 0x5a, 0xe4, + 0x83, 0xce, 0x3c, 0xc8, 0x44, 0xc2, 0x85, 0x25, 0x10, 0x42, 0x22, 0xc9, + 0x0d, 0x7e, 0xe1, 0xf4, 0xf2, 0xa9, 0x12, 0x2a, 0xae, 0x4a, 0xf1, 0x16, + 0x0c, 0xb2, 0xc5, 0x4d, 0x0b, 0xca, 0x78, 0x12, 0x25, 0x96, 0xac, 0x2c, + 0x1b, 0x99, 0x8b, 0x29, 0xcb, 0x02, 0x39, 0x42, 0x39, 0x9f, 0x6a, 0x91, + 0xc1, 0xc3, 0x78, 0x10, 0xe1, 0x2a, 0x8b, 0xd0, 0x78, 0xce, 0x17, 0x88, + 0x25, 0xde, 0x42, 0x46, 0x8e, 0x2a, 0x38, 0x6c, 0x85, 0xd4, 0x54, 0xbc, + 0x00, 0x76, 0x97, 0x31, 0x44, 0xf6, 0x80, 0x4e, 0xf9, 0x36, 0x6d, 0x16, + 0xb5, 0xc7, 0xa6, 0x5c, 0x82, 0xcd, 0xb7, 0xbe, 0xc4, 0x78, 0x5e, 0x6e, + 0x1f, 0x82, 0x00, 0x8f, 0x9b, 0xbc, 0x4e, 0x24, 0xb6, 0x9d, 0xe5, 0x93, + 0x2a, 0x26, 0xb1, 0xd4, 0x77, 0x8d, 0x63, 0x75, 0x4f, 0xf4, 0xe0, 0x97, + 0x6b, 0x70, 0x9e, 0xee, 0x5d, 0x85, 0x6c, 0xbe, 0xde, 0x7a, 0x63, 0x17, + 0xc2, 0xb7, 0xed, 0x41, 0xcd, 0x57, 0xd1, 0x58, 0xcc, 0xdb, 0x4c, 0x86, + 0x90, 0x34, 0x13, 0x31, 0x04, 0xb2, 0x42, 0x48, 0x92, 0x9c, 0xe8, 0xd4, + 0x97, 0x7c, 0xba, 0xfe, 0xca, 0xb6, 0xa5, 0xd2, 0x1d, 0x85, 0x35, 0x62, + 0x23, 0x1d, 0x21, 0x4d, 0x73, 0x2e, 0xfa, 0x4d, 0x69, 0x72, 0x22, 0xfd, + 0x46, 0x9b, 0xd8, 0x6c, 0x80, 0xca, 0x5a, 0x50, 0x89, 0xf1, 0x01, 0x75, + 0x63, 0xb9, 0x42, 0x95, 0x56, 0xa4, 0x3d, 0x69, 0x74, 0xa8, 0xcd, 0xad, + 0xab, 0x89, 0x64, 0x24, 0x59, 0x19, 0x07, 0xd4, 0x94, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x11, 0x93, 0xab, 0x57, 0x81, 0xa1, 0x61, 0x51, 0x10, + 0x3c, 0x92, 0xe7, 0x60, 0x60, 0x9b, 0xe5, 0x45, 0x29, 0xc6, 0x05, 0xdb, + 0x17, 0x57, 0x83, 0x2f, 0xad, 0x73, 0x47, 0xf8, 0xec, 0xbb, 0x77, 0x10, + 0xac, 0x7b, 0xce, 0x0c, 0xba, 0x3e, 0x18, 0xf1, 0x49, 0xe2, 0xcb, 0x04, + 0xd6, 0x11, 0xa0, 0xc7, 0x96, 0x36, 0xe4, 0x0a, 0x98, 0xee, 0x26, 0x53, + 0x17, 0x0d, 0x40, 0xc8, 0x92, 0xdb, 0x45, 0x88, 0x09, 0x0b, 0xa5, 0x33, + 0x2e, 0xfb, 0x21, 0x1b, 0xaf, 0x24, 0x16, 0x73, 0x3b, 0x0b, 0x31, 0x85, + 0x16, 0x89, 0x58, 0x7d, 0x37, 0x8a, 0x44, 0xec, 0x52, 0xab, 0xf9, 0x9c, + 0x10, 0x52, 0xf6, 0x6c, 0x7b, 0x2e, 0x29, 0x73, 0x90, 0xbd, 0xcf, 0x0d, + 0xa2, 0xd2, 0x9d, 0x83, 0x5e, 0xe5, 0x47, 0x4a, 0x89, 0xd0, 0x48, 0x43, + 0xcc, 0x86, 0xea, 0xee, 0x69, 0xc1, 0x83, 0x23, 0xca, 0x8a, 0x2a, 0x40, + 0x8a, 0x0d, 0xce, 0x87, 0xd0, 0x8d, 0x4b, 0x9a, 0xcc, 0xa2, 0x4c, 0x59, + 0x8b, 0x48, 0xf4, 0x35, 0x72, 0x2d, 0x74, 0xfb, 0x1c, 0x02, 0xea, 0x9d, + 0x98, 0xd4, 0x47, 0x97, 0xe6, 0x1b, 0x73, 0x48, 0x71, 0x78, 0xdd, 0x62, + 0x5e, 0x44, 0x16, 0x1b, 0x7a, 0xcb, 0xc0, 0x4e, 0xa2, 0x19, 0x07, 0x3c, + 0x27, 0x2f, 0x61, 0x86, 0x11, 0x56, 0xb7, 0x17, 0x5d, 0xb0, 0x2b, 0xa6, + 0x85, 0x7c, 0x9e, 0x46, 0xc9, 0x72, 0x31, 0xf2, 0x06, 0xec, 0xc7, 0x27, + 0x51, 0xce, 0xc4, 0xbb, 0x91, 0xa7, 0xb8, 0x51, 0x3d, 0x07, 0x77, 0x98, + 0xe7, 0x6c, 0x1c, 0x73, 0x1a, 0x72, 0xd0, 0xe9, 0x5a, 0xa2, 0xe2, 0x4a, + 0x28, 0x42, 0xaa, 0xd1, 0x34, 0x8a, 0xd7, 0x1f, 0xd9, 0x2a, 0x5c, 0x5c, + 0x32, 0x95, 0x0e, 0x1d, 0x06, 0x35, 0xca, 0xa0, 0x1e, 0x81, 0x23, 0x23, + 0x8c, 0xd2, 0xa9, 0x5d, 0x9b, 0xee, 0x43, 0x94, 0x91, 0x5d, 0x8f, 0x00, + 0x65, 0xd4, 0x85, 0xa0, 0x41, 0x04, 0x8b, 0x42, 0x6f, 0x83, 0x23, 0xee, + 0x3d, 0x32, 0x08, 0x93, 0xaa, 0x09, 0xf0, 0xd0, 0xe8, 0x2d, 0xa5, 0x2b, + 0x3c, 0x4a, 0x08, 0xb3, 0x13, 0x98, 0x49, 0x6b, 0xc0, 0xc5, 0x1a, 0x1a, + 0x10, 0x63, 0x1b, 0x32, 0xca, 0xef, 0x80, 0xcf, 0x69, 0x69, 0x7a, 0xb1, + 0xbc, 0x12, 0x36, 0x35, 0x09, 0x10, 0x26, 0x09, 0x9e, 0x06, 0x95, 0x2f, + 0x74, 0x74, 0x1a, 0x85, 0x58, 0xe5, 0x60, 0xa5, 0x8b, 0xeb, 0x40, 0x94, + 0x90, 0xcc, 0xe8, 0x26, 0x20, 0x9f, 0x5c, 0x92, 0x34, 0xbb, 0x1e, 0x33, + 0x89, 0x89, 0x08, 0x2a, 0x4e, 0x3b, 0x70, 0xdf, 0x22, 0xd1, 0x64, 0xe6, + 0x96, 0xda, 0x9a, 0x49, 0xf2, 0x9b, 0x4c, 0x4a, 0xc3, 0x80, 0x99, 0xa2, + 0x7c, 0xac, 0x39, 0xaa, 0x31, 0x9a, 0x93, 0x66, 0x3c, 0x66, 0x82, 0x71, + 0x0d, 0x4e, 0x67, 0x23, 0x97, 0x4e, 0x49, 0x59, 0xc0, 0xd9, 0xe6, 0x31, + 0xba, 0x53, 0x35, 0x06, 0xb4, 0x15, 0x15, 0x21, 0x2c, 0x51, 0x68, 0xd2, + 0xcb, 0x5a, 0x23, 0xf0, 0x57, 0xc3, 0x81, 0xa3, 0xc8, 0x6e, 0xfd, 0xc1, + 0xe6, 0x02, 0x15, 0xf0, 0xa1, 0xa2, 0xd2, 0x34, 0x77, 0xce, 0x0c, 0x1f, + 0x59, 0x21, 0x55, 0xb8, 0x35, 0x0d, 0x7a, 0xc7, 0xcd, 0x2e, 0xff, 0x00, + 0x93, 0xf7, 0x3a, 0x12, 0x5b, 0x2b, 0x56, 0x92, 0x1e, 0x65, 0x17, 0x8c, + 0x87, 0xef, 0x23, 0xec, 0xee, 0xe4, 0xb3, 0x1f, 0x4f, 0x24, 0xea, 0x84, + 0x8f, 0x1c, 0xab, 0xe2, 0x3b, 0xf9, 0x46, 0xbf, 0xd9, 0x11, 0x5f, 0x72, + 0x32, 0x2e, 0xb1, 0x35, 0x48, 0x4a, 0x52, 0x14, 0x6c, 0xba, 0x60, 0x48, + 0x74, 0xaa, 0x10, 0xe0, 0x5e, 0x7e, 0x22, 0x24, 0xeb, 0xc9, 0x99, 0x64, + 0x50, 0xb6, 0x14, 0x89, 0x62, 0xe1, 0x4b, 0xe8, 0xb4, 0x38, 0xe4, 0xc6, + 0x6e, 0x16, 0x1a, 0xcd, 0x9b, 0xa6, 0xe8, 0x94, 0xb9, 0x9c, 0x90, 0x62, + 0x0d, 0x0f, 0x0d, 0xc6, 0x86, 0x21, 0x4e, 0x78, 0x17, 0x24, 0x76, 0x12, + 0xaf, 0x43, 0x60, 0x41, 0xe6, 0x49, 0xb8, 0xfe, 0x60, 0x62, 0xc2, 0x46, + 0xe1, 0xad, 0x28, 0x7e, 0xd8, 0x3b, 0x9d, 0x6e, 0x65, 0x07, 0x8e, 0x88, + 0xc2, 0x49, 0x24, 0x92, 0x70, 0x68, 0x4f, 0xae, 0xc3, 0xd3, 0xd0, 0x36, + 0x3e, 0x13, 0x49, 0xc7, 0x92, 0xe2, 0x60, 0xdc, 0x41, 0x25, 0xc7, 0x04, + 0xd4, 0x93, 0xdc, 0x85, 0x8f, 0x48, 0x83, 0xd7, 0x18, 0x5e, 0xbc, 0x03, + 0x94, 0x49, 0x3c, 0x8f, 0xd4, 0xde, 0x37, 0x30, 0x52, 0x09, 0x71, 0x28, + 0x6a, 0x47, 0x51, 0xe1, 0x29, 0x0c, 0x59, 0x97, 0x71, 0xd8, 0x77, 0x91, + 0x2f, 0xc2, 0xa5, 0x90, 0x98, 0x7a, 0xc1, 0xbb, 0xcf, 0x04, 0x93, 0x84, + 0x8e, 0x22, 0x93, 0x76, 0xa2, 0x71, 0xa2, 0xcf, 0x5c, 0x29, 0x30, 0x15, + 0x5c, 0x58, 0x37, 0xa5, 0x71, 0xe8, 0xb8, 0x42, 0x4b, 0x8d, 0x59, 0x24, + 0x9b, 0x37, 0x44, 0x75, 0x0d, 0x07, 0x03, 0x34, 0x3e, 0x31, 0x58, 0xd9, + 0xee, 0x84, 0xe3, 0x3e, 0xe8, 0xcb, 0xa6, 0x04, 0x8a, 0x5c, 0x26, 0x5e, + 0xe4, 0x8e, 0x44, 0x82, 0x52, 0x04, 0x09, 0x35, 0x23, 0x6b, 0x38, 0x65, + 0x7c, 0x8d, 0x74, 0x12, 0x95, 0x4e, 0x28, 0x5a, 0xd6, 0x4e, 0x1d, 0xea, + 0x22, 0xcb, 0xbd, 0x85, 0xe9, 0x6b, 0x5a, 0x86, 0xa7, 0x13, 0x55, 0x91, + 0x36, 0x62, 0x58, 0x81, 0x29, 0xe0, 0x35, 0x1d, 0x4b, 0x97, 0x21, 0xa6, + 0x83, 0x4d, 0x05, 0x56, 0x44, 0x93, 0x06, 0xea, 0x0a, 0xd5, 0x7a, 0xa1, + 0x73, 0x41, 0xc2, 0xe7, 0x71, 0xaf, 0x57, 0x04, 0x37, 0x51, 0xd0, 0x51, + 0xd0, 0xc5, 0x67, 0x59, 0x32, 0x97, 0x0b, 0x09, 0x88, 0x8a, 0x18, 0xdd, + 0x84, 0x54, 0x85, 0xcd, 0xbb, 0x1d, 0x88, 0x31, 0xab, 0xc8, 0xbc, 0xa3, + 0x2e, 0xeb, 0xb0, 0xe4, 0x96, 0xf0, 0x09, 0x1f, 0x20, 0x8c, 0xb0, 0x8d, + 0xc7, 0x28, 0x76, 0x93, 0x11, 0xfd, 0x7e, 0xc4, 0x79, 0x03, 0x46, 0xb0, + 0xd6, 0x55, 0xc9, 0xf6, 0x0a, 0xe4, 0x4d, 0x15, 0xf1, 0x43, 0x53, 0x09, + 0xe7, 0x44, 0x44, 0xbb, 0x8e, 0x5f, 0xa5, 0x44, 0x72, 0x10, 0x2d, 0x1c, + 0xf5, 0xb2, 0x83, 0xb9, 0xcc, 0x9c, 0x27, 0x18, 0x25, 0x56, 0xd4, 0xa8, + 0xa1, 0x5c, 0x5a, 0xcd, 0x22, 0x72, 0x06, 0x5c, 0x46, 0xd8, 0x6f, 0x62, + 0x15, 0x2a, 0xbb, 0x8a, 0x92, 0x22, 0x04, 0xc4, 0x23, 0x5a, 0x17, 0x91, + 0x41, 0xaf, 0x10, 0x35, 0x32, 0x94, 0xe8, 0xd1, 0x48, 0xa7, 0x70, 0x6d, + 0x98, 0xaa, 0x9a, 0xe5, 0x19, 0xc9, 0x50, 0x4e, 0x98, 0xa2, 0x04, 0x8a, + 0x85, 0x60, 0x62, 0xe9, 0xa9, 0x21, 0x2c, 0x4d, 0x29, 0xdd, 0x11, 0xde, + 0x12, 0xfe, 0xe2, 0x4a, 0x20, 0x8c, 0x0b, 0x82, 0x67, 0xd2, 0xab, 0x57, + 0x81, 0xd4, 0x4a, 0x75, 0x56, 0x0f, 0x9c, 0x81, 0x76, 0x66, 0xea, 0x64, + 0x9a, 0x2e, 0xf3, 0x2e, 0x79, 0x09, 0xd7, 0x34, 0x01, 0x4d, 0xd2, 0xbc, + 0x0b, 0xa8, 0xd0, 0xb3, 0xde, 0xe2, 0x7d, 0xd3, 0x93, 0x16, 0x40, 0xe2, + 0xa6, 0x60, 0x70, 0xa0, 0xf9, 0xa8, 0x33, 0x30, 0x3a, 0x25, 0x72, 0xda, + 0x16, 0x4b, 0x41, 0xa2, 0x08, 0x20, 0x82, 0x08, 0xc4, 0x73, 0x50, 0xd4, + 0xa1, 0x50, 0xa8, 0xae, 0x52, 0x5e, 0x19, 0xae, 0xe1, 0x84, 0x31, 0xb7, + 0x43, 0x2d, 0x86, 0x5e, 0x01, 0xb1, 0xd3, 0x06, 0x82, 0x59, 0xa1, 0x9b, + 0x54, 0x7d, 0x88, 0x94, 0xca, 0xb0, 0x51, 0x13, 0x98, 0x92, 0x58, 0x26, + 0x48, 0xa7, 0x59, 0x1b, 0x13, 0xd1, 0x3e, 0x8e, 0xac, 0x58, 0x34, 0x43, + 0x04, 0x08, 0x10, 0x23, 0x07, 0x5b, 0x8a, 0xb9, 0xab, 0x70, 0xcd, 0x27, + 0x10, 0xdc, 0xe1, 0xac, 0xbe, 0xa6, 0x3c, 0x48, 0x84, 0xda, 0x1a, 0x70, + 0x58, 0xc6, 0x06, 0xc4, 0x22, 0x74, 0x12, 0x4d, 0xda, 0x22, 0x54, 0xa8, + 0xa1, 0x10, 0x40, 0xf0, 0x41, 0xaa, 0x03, 0x16, 0x46, 0x8d, 0x04, 0x26, + 0xed, 0x2d, 0x47, 0x3c, 0x43, 0x2f, 0xc9, 0xe8, 0x3c, 0x27, 0x41, 0x3c, + 0x10, 0xb0, 0x24, 0x46, 0x64, 0x65, 0x22, 0x5c, 0x92, 0x48, 0xb0, 0x95, + 0xa9, 0x08, 0xd1, 0x17, 0x35, 0x5d, 0xcb, 0x59, 0x3b, 0x23, 0xba, 0x73, + 0x14, 0x95, 0xae, 0x3c, 0xaa, 0xe4, 0x4e, 0x2c, 0x84, 0x48, 0x4f, 0xe4, + 0xfd, 0xb1, 0x78, 0x31, 0x0d, 0x08, 0xc1, 0x8c, 0x64, 0x0f, 0x4e, 0x84, + 0x86, 0x9b, 0x19, 0x2d, 0x06, 0x34, 0x41, 0x04, 0x11, 0xd1, 0x04, 0x0e, + 0xd3, 0x64, 0xc0, 0x95, 0x86, 0x93, 0x5b, 0x97, 0xff, 0x00, 0x48, 0x5f, + 0x5c, 0x6c, 0xff, 0x00, 0x5c, 0x7b, 0xb0, 0x08, 0xeb, 0xe1, 0x0f, 0x80, + 0x54, 0x8c, 0xdf, 0xce, 0x34, 0xbc, 0xc1, 0x34, 0xdf, 0x26, 0xc9, 0xfb, + 0x21, 0x1a, 0x7e, 0xe8, 0x95, 0x97, 0x12, 0x33, 0xb9, 0x6a, 0x54, 0x5b, + 0x10, 0x21, 0x62, 0xb0, 0x4f, 0x0d, 0x96, 0x42, 0x49, 0x24, 0x93, 0x9d, + 0xc9, 0x13, 0xc6, 0x49, 0xc6, 0x70, 0x9c, 0x0e, 0xa1, 0x5c, 0xc8, 0x8a, + 0x62, 0x65, 0xb9, 0xb4, 0x3d, 0xce, 0x65, 0x0d, 0x63, 0x38, 0x49, 0x71, + 0xe2, 0x09, 0x60, 0x4f, 0x53, 0x35, 0xe4, 0x34, 0x3b, 0x0c, 0x2f, 0x84, + 0x08, 0xfe, 0x9c, 0x7a, 0x23, 0x98, 0x18, 0x42, 0xd7, 0x62, 0x2a, 0x4b, + 0x03, 0x10, 0x41, 0x02, 0x1e, 0xf6, 0x0c, 0x32, 0x82, 0x98, 0xad, 0x99, + 0x3d, 0x48, 0xfb, 0x69, 0xac, 0xfa, 0x94, 0xc9, 0xa9, 0x7a, 0xa3, 0x63, + 0x8f, 0x5d, 0x24, 0x21, 0xde, 0x21, 0xeb, 0xbb, 0xf4, 0x33, 0x4d, 0x3e, + 0x5c, 0x88, 0x28, 0xd7, 0x81, 0x15, 0x84, 0x03, 0x55, 0x64, 0x64, 0xdc, + 0x73, 0x27, 0x96, 0x5a, 0xfc, 0xbf, 0xd0, 0x8c, 0xa6, 0xae, 0xa7, 0xfb, + 0x1a, 0x3e, 0x79, 0xe0, 0x92, 0x49, 0xc2, 0x49, 0xc1, 0x24, 0x56, 0xd2, + 0xa8, 0xd6, 0x62, 0x90, 0xde, 0x82, 0x62, 0xc9, 0xe8, 0x63, 0xc1, 0xcd, + 0xf0, 0x8d, 0x36, 0xb6, 0x43, 0x18, 0xc8, 0xea, 0x82, 0x04, 0x20, 0x42, + 0xc6, 0x08, 0x23, 0x04, 0x74, 0xba, 0x2a, 0x05, 0x4b, 0xe7, 0xed, 0x72, + 0x48, 0xe5, 0xd5, 0xbc, 0xca, 0x05, 0xd1, 0x38, 0xcc, 0x31, 0x5a, 0x50, + 0xc9, 0x24, 0x97, 0xed, 0x05, 0xb8, 0x49, 0x24, 0x93, 0xd0, 0x24, 0x92, + 0x49, 0x18, 0xa7, 0x18, 0x29, 0x0f, 0x84, 0x70, 0x44, 0xa6, 0x4e, 0xa2, + 0x6b, 0xb8, 0xf7, 0x7c, 0x9b, 0x0f, 0xc9, 0xf7, 0x3c, 0x3e, 0xdc, 0x58, + 0x08, 0x92, 0xf3, 0xc0, 0x43, 0x90, 0x4d, 0x09, 0x65, 0xb9, 0x57, 0x61, + 0x22, 0xcb, 0x04, 0x0d, 0x61, 0x2a, 0x20, 0xc4, 0x62, 0x30, 0xa2, 0xd9, + 0x11, 0x82, 0x11, 0x4c, 0x28, 0x68, 0x54, 0x95, 0xb5, 0x81, 0xf7, 0xc2, + 0xe9, 0xde, 0x8b, 0x02, 0x64, 0x92, 0x49, 0x22, 0xd9, 0xe5, 0x65, 0xab, + 0x1c, 0xda, 0xcc, 0xe5, 0x89, 0x92, 0x4e, 0x12, 0x49, 0x24, 0x93, 0x8a, + 0x5b, 0xcd, 0xa2, 0x6c, 0x38, 0xa9, 0x6a, 0xa7, 0x83, 0xeb, 0x63, 0x6c, + 0x24, 0x4a, 0xac, 0xb6, 0x58, 0x1e, 0x30, 0x46, 0x31, 0x82, 0x16, 0x09, + 0xe4, 0x2e, 0x88, 0x20, 0x82, 0x30, 0x41, 0x02, 0x09, 0x09, 0x73, 0xa4, + 0xa9, 0x37, 0x33, 0x96, 0xee, 0xd8, 0xb0, 0x21, 0x63, 0x38, 0x49, 0x38, + 0x4c, 0x2e, 0xa4, 0xae, 0x30, 0x92, 0x9e, 0xb5, 0x59, 0x61, 0x38, 0xcf, + 0x54, 0xf4, 0x3c, 0x1f, 0x32, 0x19, 0x8a, 0x59, 0xa5, 0x60, 0xb0, 0xfa, + 0x80, 0x82, 0x08, 0x20, 0x82, 0x0b, 0xa7, 0x62, 0x14, 0x24, 0x34, 0x34, + 0x41, 0x18, 0xb4, 0x49, 0x5c, 0x65, 0xb8, 0xdb, 0x42, 0x53, 0x21, 0xd8, + 0xe6, 0xf0, 0x59, 0x8f, 0x2e, 0xb6, 0x74, 0x69, 0xba, 0x22, 0x1e, 0xb8, + 0x28, 0x25, 0x81, 0x09, 0x92, 0x22, 0x49, 0x2a, 0x47, 0xcc, 0xca, 0x30, + 0x92, 0x49, 0x27, 0xa2, 0x70, 0x5c, 0x1a, 0xb3, 0x55, 0xef, 0x27, 0xa7, + 0x4c, 0x93, 0x85, 0x60, 0x9c, 0x82, 0x5a, 0xd4, 0xc9, 0x0d, 0x8c, 0x64, + 0x11, 0x84, 0x10, 0x47, 0x4a, 0x12, 0x77, 0x04, 0x10, 0x41, 0x04, 0x61, + 0x04, 0x10, 0x40, 0x82, 0x43, 0x73, 0x93, 0xfe, 0xa4, 0x6d, 0x86, 0xdb, + 0x56, 0xd8, 0x82, 0xc1, 0x62, 0xb1, 0x4c, 0x91, 0xd1, 0x91, 0x26, 0x94, + 0xe1, 0x24, 0x97, 0x25, 0x45, 0x82, 0x49, 0x24, 0x92, 0x7f, 0x03, 0x78, + 0x32, 0x62, 0xf1, 0x86, 0x2d, 0xd1, 0x65, 0xae, 0x45, 0x12, 0x55, 0x50, + 0xf0, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x14, 0x8d, 0x7c, 0x24, 0x20, + 0x82, 0x31, 0x16, 0x1a, 0x41, 0xbe, 0x94, 0x49, 0xa0, 0xb4, 0x91, 0x2e, + 0x63, 0x3c, 0x09, 0x09, 0x09, 0x08, 0x42, 0x10, 0x89, 0x24, 0xa8, 0xbf, + 0x1a, 0x13, 0x04, 0x92, 0x49, 0x24, 0x92, 0x4e, 0x12, 0x48, 0xc9, 0x06, + 0xa7, 0x28, 0xa2, 0x6c, 0x65, 0x7c, 0xc9, 0xc5, 0x88, 0x49, 0x6e, 0x11, + 0x77, 0xc8, 0x1e, 0xed, 0xb4, 0xb7, 0x9b, 0x1b, 0x1f, 0x5c, 0x10, 0x41, + 0x04, 0x08, 0x47, 0x3f, 0xa1, 0x1f, 0x86, 0x06, 0xa6, 0x24, 0x66, 0xc7, + 0xc9, 0x8f, 0x33, 0xf5, 0x2a, 0xd3, 0x77, 0xab, 0xc0, 0x4b, 0x15, 0xd1, + 0x38, 0x49, 0x22, 0x70, 0xe4, 0x41, 0xdd, 0x6c, 0x9b, 0x93, 0x6c, 0xd4, + 0x42, 0x08, 0x92, 0x49, 0x24, 0x4c, 0x92, 0x49, 0x27, 0x09, 0xc2, 0x49, + 0xc1, 0xe2, 0x6f, 0x3d, 0x2c, 0x86, 0xa8, 0x92, 0xd5, 0x08, 0x25, 0x93, + 0xc1, 0x04, 0x10, 0x41, 0x04, 0x0c, 0x08, 0x58, 0x88, 0x20, 0x82, 0x30, + 0x20, 0x83, 0x1e, 0xa7, 0x40, 0x41, 0x04, 0x12, 0x10, 0x85, 0x82, 0xe8, + 0x92, 0xd3, 0x6b, 0xd4, 0xb8, 0xdb, 0xcb, 0x41, 0x09, 0x27, 0x04, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x24, 0x8c, 0x9c, 0x81, 0x90, 0xd2, 0x6a, 0xe6, + 0x84, 0x05, 0x19, 0xa1, 0x25, 0x33, 0xb6, 0x87, 0xb5, 0x53, 0x45, 0x86, + 0xc6, 0xc6, 0xc7, 0xf8, 0xa0, 0x81, 0x08, 0x81, 0x4b, 0xaa, 0x88, 0x43, + 0x66, 0xba, 0xe0, 0x81, 0xa1, 0x1f, 0x78, 0xaf, 0x34, 0x79, 0x73, 0x82, + 0x8c, 0x74, 0xce, 0x32, 0x49, 0x24, 0x92, 0x31, 0x83, 0xc8, 0x65, 0x35, + 0x6d, 0x16, 0x8b, 0xa2, 0x70, 0x92, 0x49, 0x24, 0x9f, 0xc0, 0xd0, 0xf0, + 0x92, 0x79, 0x68, 0x7b, 0x1a, 0x5a, 0x67, 0x07, 0x2c, 0xa3, 0xe0, 0xb0, + 0x93, 0xb1, 0x49, 0x74, 0xa0, 0x9c, 0x02, 0x89, 0x04, 0x11, 0x84, 0x11, + 0x81, 0x04, 0x14, 0x79, 0x8e, 0x84, 0x10, 0x41, 0x04, 0x0b, 0xa5, 0x12, + 0x4e, 0x12, 0x3d, 0xb2, 0x12, 0xec, 0xa2, 0xa9, 0x69, 0xf3, 0x88, 0x9c, + 0x64, 0x92, 0x49, 0x24, 0x92, 0x49, 0x24, 0x91, 0x89, 0x38, 0x7c, 0xc9, + 0x16, 0x4c, 0x49, 0x2e, 0x71, 0x99, 0x32, 0x89, 0x1b, 0xc1, 0x3f, 0x95, + 0x0d, 0xe1, 0xf5, 0x16, 0x08, 0xe9, 0x68, 0x55, 0x19, 0xb1, 0x37, 0x3f, + 0xdb, 0xf0, 0x4c, 0x56, 0xe6, 0x0a, 0x51, 0xf9, 0xeb, 0x85, 0x41, 0x10, + 0xac, 0x2c, 0x24, 0x9c, 0x27, 0x09, 0x24, 0x92, 0x49, 0x24, 0x9e, 0xb6, + 0x86, 0x6e, 0x7f, 0x04, 0x64, 0x05, 0x2a, 0x0d, 0x9c, 0x50, 0xc8, 0xbc, + 0xd4, 0x48, 0xb1, 0xa3, 0xa2, 0x08, 0x23, 0x04, 0x10, 0x46, 0x17, 0x9d, + 0x90, 0x47, 0xe4, 0x91, 0xab, 0x9b, 0x42, 0x57, 0x63, 0x65, 0x21, 0x30, + 0x08, 0x4e, 0x31, 0x24, 0x92, 0x70, 0x9e, 0x81, 0x24, 0x92, 0x48, 0xc4, + 0x91, 0xa9, 0x44, 0xa4, 0xd9, 0x66, 0xea, 0x08, 0x58, 0x9f, 0xcc, 0xc4, + 0x2f, 0x34, 0x85, 0x8e, 0xf6, 0x11, 0x82, 0xe9, 0xd9, 0x73, 0xf0, 0x35, + 0xcc, 0x0f, 0xbd, 0x89, 0x0c, 0x37, 0x12, 0x9c, 0x18, 0xeb, 0x92, 0x7a, + 0xda, 0x94, 0x14, 0x84, 0x84, 0x17, 0x4c, 0x93, 0x8c, 0x92, 0x49, 0x38, + 0xc9, 0x24, 0x93, 0x84, 0x15, 0x62, 0x74, 0xc4, 0xde, 0xec, 0xac, 0x49, + 0xdc, 0x0a, 0xc1, 0x10, 0x20, 0x42, 0x21, 0x82, 0x30, 0x41, 0x18, 0x40, + 0x90, 0x91, 0x04, 0x09, 0x14, 0x1c, 0xdb, 0xfc, 0xec, 0x6d, 0x48, 0xbb, + 0x63, 0xde, 0xba, 0x30, 0x4a, 0x26, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0x4e, 0x12, 0x4e, 0x09, 0x24, 0x9c, 0x5a, 0x18, 0x94, 0x8b, 0xa8, 0x16, + 0x87, 0x74, 0x2b, 0x47, 0x84, 0x74, 0x4e, 0x33, 0x84, 0x92, 0x4e, 0x2d, + 0x12, 0xbc, 0xf7, 0x47, 0x12, 0x54, 0xd7, 0xc1, 0x44, 0x73, 0xab, 0xa0, + 0x99, 0x4b, 0x69, 0x47, 0xa9, 0x22, 0x5b, 0x96, 0xf5, 0x24, 0x20, 0x8c, + 0x74, 0xc9, 0x3d, 0x33, 0xd3, 0x0e, 0x57, 0x78, 0x0b, 0x1d, 0x33, 0xd5, + 0x24, 0x93, 0x89, 0x24, 0x93, 0x84, 0x97, 0x1b, 0xca, 0x7c, 0x8e, 0x02, + 0x82, 0x8e, 0xd3, 0x18, 0x23, 0xaa, 0x08, 0xc0, 0x84, 0x09, 0x09, 0x0c, + 0x68, 0x2b, 0xf9, 0x7e, 0x5d, 0xb0, 0xe1, 0xcb, 0x1c, 0xa9, 0x7d, 0x09, + 0xa2, 0xa6, 0x46, 0x45, 0xb6, 0x02, 0x08, 0x91, 0xb2, 0x49, 0x24, 0x4c, + 0x92, 0x46, 0xb2, 0x45, 0x95, 0x1e, 0x02, 0x89, 0x64, 0xd6, 0xab, 0x04, + 0x92, 0x49, 0x24, 0x92, 0x4e, 0x2c, 0x62, 0x4c, 0x15, 0x66, 0xfc, 0x92, + 0xcf, 0xc0, 0x4e, 0xce, 0x08, 0xbc, 0xc9, 0x11, 0x24, 0x93, 0xd0, 0xa9, + 0x1d, 0x9c, 0xca, 0x9c, 0xca, 0x06, 0x6f, 0x8a, 0xe5, 0x91, 0x6e, 0x6a, + 0x55, 0x2e, 0xd7, 0xa3, 0x46, 0x27, 0xd0, 0xd2, 0x49, 0x3d, 0x13, 0xd0, + 0xe6, 0xd7, 0x87, 0x0a, 0x90, 0xb0, 0x9c, 0x64, 0x92, 0x7f, 0x0c, 0x93, + 0x8b, 0x1c, 0x6a, 0xb2, 0xb3, 0x59, 0x32, 0x3f, 0xbb, 0x59, 0xf7, 0x22, + 0xf3, 0x23, 0x82, 0x04, 0x92, 0x49, 0x38, 0x8c, 0x2c, 0x11, 0x38, 0x17, + 0xd7, 0x2f, 0xf2, 0xac, 0x2a, 0x59, 0x06, 0x38, 0x4b, 0x4e, 0xfa, 0x8a, + 0x19, 0x8f, 0xae, 0x65, 0x25, 0xb9, 0x3b, 0xf4, 0x09, 0xc4, 0xa4, 0x47, + 0x28, 0x77, 0x41, 0xf0, 0xc1, 0xb2, 0xa3, 0x07, 0x6c, 0x90, 0xaa, 0xa9, + 0x55, 0x68, 0xda, 0xee, 0x41, 0xcf, 0x77, 0xb0, 0x42, 0x49, 0x24, 0x9c, + 0x27, 0xa2, 0x71, 0x63, 0x43, 0x2c, 0xb3, 0x0d, 0x59, 0x8b, 0x3c, 0x9f, + 0x28, 0x9e, 0xbf, 0x91, 0xff, 0x00, 0x26, 0x7d, 0x47, 0xe8, 0xfa, 0xcf, + 0xd0, 0xd5, 0x99, 0x72, 0xca, 0x25, 0x6a, 0x64, 0x26, 0x9e, 0xe3, 0xb1, + 0x8b, 0xbc, 0xb2, 0x1d, 0x99, 0x7e, 0x1b, 0x1a, 0xa3, 0xb4, 0x8a, 0xe8, + 0x11, 0xab, 0x82, 0x1e, 0x5a, 0xee, 0x63, 0x76, 0x68, 0x58, 0x1b, 0x7b, + 0x4c, 0x9a, 0x49, 0x7a, 0x48, 0x41, 0xa1, 0xd0, 0x90, 0x64, 0x3e, 0x06, + 0x50, 0x6e, 0x99, 0x26, 0x29, 0x0a, 0x48, 0xc5, 0x75, 0x59, 0x95, 0x35, + 0x2b, 0x97, 0x7a, 0xe2, 0x4b, 0x06, 0xc9, 0xc6, 0x7a, 0x26, 0x7f, 0x0b, + 0x43, 0x0d, 0x0e, 0x49, 0x1c, 0x44, 0xad, 0xa4, 0xe0, 0xb5, 0x2b, 0xe9, + 0x38, 0x94, 0xd3, 0x5e, 0x72, 0x1c, 0x51, 0x35, 0x75, 0x16, 0x0f, 0xd1, + 0xbe, 0xc1, 0x31, 0xea, 0xca, 0x1f, 0x07, 0xa2, 0x0d, 0xec, 0xe4, 0x4e, + 0x7c, 0xe9, 0x7e, 0x50, 0xaa, 0x87, 0x46, 0x4b, 0x98, 0xa7, 0x80, 0xc2, + 0x12, 0x53, 0x81, 0x7c, 0xd3, 0x37, 0x82, 0x49, 0x27, 0x19, 0xc2, 0x49, + 0x24, 0xb1, 0x73, 0xa2, 0xac, 0xa1, 0x7a, 0xf0, 0x9c, 0x97, 0xdc, 0x84, + 0x4a, 0x5a, 0xe2, 0x54, 0x0c, 0x56, 0x65, 0x8d, 0x84, 0x2c, 0x92, 0xfd, + 0x28, 0xb3, 0xaf, 0x71, 0x2b, 0xcd, 0x32, 0x5b, 0xb5, 0x47, 0xb0, 0x9d, + 0x3c, 0xdd, 0x60, 0x6b, 0x4b, 0x97, 0x7f, 0xf6, 0x67, 0xa1, 0x47, 0xfb, + 0x32, 0x9a, 0x4e, 0xe0, 0x9f, 0xf2, 0xa4, 0x4a, 0xaa, 0xdc, 0x70, 0x3c, + 0xd1, 0xf6, 0x61, 0x09, 0x22, 0xd1, 0x48, 0x7b, 0x0d, 0x16, 0xae, 0xf5, + 0x04, 0xb6, 0x34, 0xc9, 0x24, 0x92, 0x70, 0x92, 0x49, 0xe8, 0x63, 0x18, + 0xd0, 0xd6, 0x0c, 0x78, 0x0d, 0xc9, 0x73, 0x2c, 0xd3, 0x3c, 0x03, 0x54, + 0x55, 0xff, 0x00, 0xca, 0xe7, 0xc0, 0xcb, 0x3b, 0x7f, 0xb1, 0x9a, 0xe0, + 0x7a, 0xb6, 0x63, 0xe6, 0xa9, 0x7b, 0x16, 0x2e, 0xf6, 0x85, 0x7e, 0xf9, + 0x88, 0x96, 0xdf, 0x60, 0xcb, 0xbc, 0x25, 0x5b, 0xde, 0x32, 0x37, 0x48, + 0x75, 0x28, 0x40, 0xa8, 0x50, 0x10, 0x48, 0x82, 0x3a, 0x62, 0x6d, 0x73, + 0x25, 0x86, 0xe5, 0x42, 0xa1, 0x16, 0x58, 0xa2, 0xc2, 0x49, 0x24, 0x92, + 0x49, 0x27, 0xa2, 0x7f, 0x0c, 0x60, 0x65, 0x87, 0x32, 0xac, 0xa1, 0x6a, + 0xc6, 0xa4, 0x05, 0xd7, 0x42, 0xf9, 0x55, 0xa5, 0x90, 0x90, 0xda, 0x32, + 0xc8, 0xd0, 0x13, 0xd8, 0x9e, 0x92, 0x4b, 0x38, 0xe5, 0x29, 0x67, 0x70, + 0x8d, 0xc6, 0x1d, 0x8e, 0x46, 0x99, 0x1d, 0xe5, 0xf0, 0x30, 0x69, 0x82, + 0x24, 0x47, 0x92, 0x68, 0x4f, 0x12, 0x7e, 0xe2, 0x6c, 0x4c, 0xc6, 0xc3, + 0x86, 0x97, 0xf6, 0x22, 0x55, 0x56, 0xb7, 0xff, 0x00, 0x27, 0xdb, 0xf9, + 0x12, 0xfd, 0x7f, 0x46, 0xa3, 0xf7, 0xc0, 0xc2, 0xcf, 0x68, 0xed, 0xa5, + 0xa0, 0x24, 0xb3, 0xdd, 0xa4, 0xbe, 0x38, 0x05, 0x83, 0xdd, 0x51, 0x7f, + 0xe3, 0x45, 0x44, 0x20, 0x82, 0x0d, 0x4e, 0x94, 0x3d, 0x46, 0x39, 0x4b, + 0xd9, 0x91, 0x89, 0x24, 0x92, 0x70, 0x27, 0x59, 0x89, 0x4c, 0x5a, 0x47, + 0x72, 0xfc, 0xd7, 0x24, 0x2d, 0x33, 0x50, 0xb9, 0x32, 0x67, 0xe0, 0xc9, + 0x3d, 0x01, 0xc3, 0xba, 0x3b, 0x5c, 0x0a, 0xea, 0x42, 0xcf, 0x13, 0xc9, + 0xae, 0x46, 0x7d, 0x2a, 0xa3, 0xe8, 0x61, 0xa5, 0x22, 0x16, 0x50, 0x9b, + 0x3c, 0x24, 0x9c, 0x67, 0xa1, 0x92, 0x34, 0x5d, 0xa2, 0xc6, 0x3b, 0x9f, + 0xeb, 0x4d, 0x53, 0xc2, 0x6c, 0x62, 0xcd, 0xf8, 0x71, 0x7e, 0x96, 0x25, + 0xf2, 0x25, 0xbd, 0xc0, 0x42, 0xfe, 0x29, 0x73, 0x8b, 0x72, 0x64, 0x20, + 0x7a, 0x48, 0x19, 0x72, 0x18, 0x61, 0x86, 0x95, 0x52, 0x4c, 0xdd, 0x1e, + 0x45, 0x30, 0x35, 0x82, 0xfd, 0x46, 0xe5, 0x19, 0xd7, 0xb8, 0xa1, 0xda, + 0xa4, 0x11, 0x8a, 0x32, 0xbc, 0xb6, 0x20, 0x9f, 0x13, 0x2c, 0xb0, 0xc1, + 0x41, 0x18, 0x16, 0x12, 0x49, 0x38, 0xce, 0x33, 0xf8, 0xee, 0xad, 0x52, + 0x09, 0x64, 0x27, 0x5e, 0x8b, 0x73, 0x3d, 0x1c, 0x8c, 0x97, 0x42, 0xcf, + 0xcb, 0x46, 0x99, 0x12, 0xa8, 0xcd, 0xdc, 0x59, 0xcf, 0x6c, 0xbf, 0xa2, + 0x4f, 0x9d, 0x07, 0x9e, 0x79, 0x5f, 0xd0, 0xd8, 0x2b, 0xf7, 0x91, 0xb6, + 0x37, 0xe8, 0x3f, 0xe8, 0xb1, 0x76, 0x74, 0x7b, 0x4b, 0x89, 0xea, 0x86, + 0xb2, 0x2e, 0xe8, 0x68, 0x24, 0xb8, 0x46, 0xf3, 0x1b, 0x8a, 0xaa, 0x3d, + 0x8a, 0x23, 0x09, 0x94, 0x88, 0xc4, 0xcd, 0xc3, 0xcd, 0x88, 0xb0, 0x5a, + 0xe4, 0x89, 0x59, 0x46, 0x6b, 0x33, 0xd4, 0xed, 0x8b, 0x05, 0x14, 0x84, + 0xb0, 0x92, 0x46, 0x32, 0x7b, 0x53, 0xb8, 0x99, 0x07, 0xa0, 0x49, 0x24, + 0x92, 0x4f, 0x40, 0x9c, 0x13, 0xd2, 0x0c, 0xb5, 0xc4, 0x2b, 0x3a, 0x2a, + 0x32, 0xd6, 0x79, 0x21, 0x4f, 0x75, 0x6d, 0x28, 0x9b, 0xeb, 0xc9, 0x64, + 0x77, 0x4a, 0x44, 0xf2, 0xb7, 0x56, 0x92, 0x15, 0x2d, 0xc0, 0xb9, 0xd0, + 0xfa, 0x34, 0x8c, 0x14, 0xaf, 0x12, 0x3f, 0xd6, 0x08, 0x7a, 0x89, 0xbd, + 0x99, 0x22, 0x56, 0x72, 0x19, 0x9c, 0x6a, 0xdc, 0x91, 0x7d, 0x02, 0xac, + 0x12, 0xf6, 0x33, 0x8c, 0xec, 0x2d, 0x4f, 0x91, 0x3c, 0xc3, 0x19, 0x84, + 0xa6, 0x84, 0xe0, 0x45, 0xb9, 0x26, 0xbd, 0x29, 0x41, 0x26, 0xf4, 0x55, + 0x24, 0xa3, 0x02, 0x53, 0x4c, 0x82, 0x9a, 0x09, 0xe9, 0xbe, 0x70, 0x58, + 0xdf, 0x26, 0x43, 0xd5, 0x95, 0xd5, 0x89, 0x49, 0xb9, 0x0b, 0x53, 0x56, + 0xc5, 0x89, 0x0d, 0x66, 0x55, 0x5b, 0x16, 0x0c, 0x3d, 0x81, 0x91, 0xe8, + 0x50, 0xe0, 0x5a, 0xea, 0xee, 0x14, 0xb3, 0xb4, 0x85, 0xfb, 0x2e, 0x8b, + 0xb4, 0x58, 0x57, 0x96, 0x58, 0xd0, 0x34, 0xc5, 0xd9, 0x1b, 0x1f, 0x4f, + 0xd0, 0xb4, 0x9e, 0x11, 0x0e, 0x5f, 0x08, 0xcf, 0x78, 0xd1, 0xf4, 0x90, + 0xbf, 0x90, 0x2f, 0xe6, 0x46, 0xc7, 0x89, 0x07, 0xeb, 0x11, 0xfe, 0x91, + 0x7a, 0x67, 0xde, 0xe5, 0xa7, 0xb9, 0x21, 0xb2, 0x8d, 0xf7, 0xd0, 0x71, + 0x55, 0x79, 0x34, 0x99, 0x91, 0x38, 0xda, 0x2e, 0x7b, 0xb0, 0xb0, 0x73, + 0x02, 0x18, 0xce, 0x41, 0x8b, 0x08, 0xce, 0xcb, 0x4c, 0x8d, 0x43, 0x1e, + 0xe1, 0x58, 0x5c, 0x6c, 0xcc, 0xa3, 0x10, 0x65, 0xea, 0x53, 0x96, 0x18, + 0x14, 0x2a, 0x1a, 0xf7, 0x15, 0x07, 0x2c, 0xed, 0xd5, 0x7c, 0x89, 0x6e, + 0x1b, 0xc3, 0x16, 0x83, 0x76, 0x17, 0xf1, 0xf4, 0x7f, 0xec, 0x47, 0xc4, + 0x0d, 0xfe, 0x88, 0xbe, 0x37, 0xe1, 0x86, 0x83, 0x25, 0xd5, 0xcb, 0x2d, + 0x0b, 0xee, 0x34, 0xbe, 0x21, 0x2a, 0xae, 0x97, 0xde, 0xa4, 0x54, 0xee, + 0x94, 0x0b, 0x29, 0x08, 0xeb, 0x86, 0x30, 0x9c, 0x0b, 0xa7, 0x9a, 0x14, + 0xfd, 0xa5, 0x29, 0x6a, 0x35, 0x75, 0x63, 0x39, 0x5d, 0x12, 0x2d, 0x69, + 0x31, 0xc8, 0xa9, 0x68, 0x4f, 0xe2, 0x00, 0x4e, 0x09, 0x24, 0x92, 0x70, + 0x32, 0xb5, 0xab, 0x1c, 0xf0, 0x84, 0xe5, 0xe0, 0x4c, 0x92, 0x64, 0x49, + 0x90, 0xd8, 0x95, 0xa6, 0x4f, 0xab, 0x41, 0xb5, 0x6c, 0x6c, 0x96, 0xde, + 0x81, 0x5f, 0xb8, 0x33, 0x26, 0x12, 0xb4, 0x10, 0xce, 0xce, 0x0a, 0x02, + 0x78, 0x2f, 0xce, 0x10, 0xa1, 0x12, 0x84, 0x1a, 0x49, 0x36, 0xaa, 0x46, + 0xa2, 0x44, 0x0f, 0xe4, 0x27, 0xac, 0x14, 0xba, 0x5e, 0x4b, 0x4f, 0xa8, + 0x4a, 0x5c, 0x43, 0x65, 0xec, 0x8c, 0xd0, 0x26, 0xa7, 0x21, 0x26, 0x63, + 0xce, 0x78, 0x1f, 0xee, 0x48, 0x22, 0x84, 0x34, 0x70, 0x79, 0x43, 0x63, + 0xfd, 0x06, 0x40, 0x76, 0x0c, 0xdf, 0xcc, 0xcb, 0x3e, 0xe4, 0x87, 0x9f, + 0xd8, 0x43, 0x5d, 0xdf, 0xb2, 0x1e, 0x63, 0xbc, 0x6f, 0x21, 0x6c, 0x5e, + 0xa3, 0x2e, 0x98, 0x15, 0xd6, 0xba, 0x2b, 0x93, 0xaa, 0xa7, 0xa8, 0x3e, + 0xa3, 0x38, 0x50, 0x7e, 0xea, 0x2b, 0x35, 0xd1, 0x90, 0x73, 0x37, 0xa1, + 0xb6, 0xbe, 0xb8, 0x24, 0xfa, 0x7c, 0x1f, 0xa5, 0x43, 0x17, 0x27, 0x92, + 0x91, 0x7a, 0x37, 0xc3, 0xfd, 0x8d, 0xbf, 0x42, 0x68, 0x16, 0xa5, 0x52, + 0x5b, 0x32, 0x18, 0x76, 0xec, 0x45, 0x30, 0xf4, 0x07, 0xec, 0x36, 0xbb, + 0x98, 0x88, 0xcd, 0x1b, 0xb8, 0x56, 0x09, 0xec, 0x59, 0x37, 0x28, 0xe6, + 0x5e, 0x72, 0x8f, 0x48, 0x26, 0xb7, 0x90, 0x67, 0x2e, 0xf4, 0x33, 0x08, + 0x8a, 0xb0, 0xcf, 0x93, 0xe8, 0x19, 0xdc, 0xf3, 0x22, 0x48, 0x63, 0x40, + 0x90, 0xe6, 0x84, 0xb3, 0x22, 0xbb, 0xe0, 0x5c, 0xfb, 0x5e, 0x31, 0x80, + 0x51, 0x90, 0x76, 0xa3, 0x0c, 0x26, 0xd9, 0xc2, 0x5a, 0xf9, 0x56, 0xc2, + 0x95, 0xb6, 0x59, 0x7b, 0xa2, 0xef, 0xdc, 0xa1, 0xa9, 0xf8, 0xff, 0x00, + 0x24, 0x36, 0x57, 0x38, 0x1d, 0xe6, 0xbd, 0xa4, 0xb9, 0x71, 0xa4, 0x43, + 0x6b, 0x96, 0x97, 0xbb, 0x22, 0xb3, 0x45, 0x69, 0x51, 0x78, 0xb4, 0xf4, + 0x84, 0x92, 0x4e, 0x24, 0xf4, 0x83, 0x45, 0x99, 0x9b, 0x89, 0xc8, 0x73, + 0x5f, 0x02, 0x62, 0x7b, 0x08, 0xd9, 0x84, 0xdc, 0x86, 0xb2, 0x7e, 0x07, + 0x7f, 0x50, 0x95, 0x74, 0x97, 0x21, 0x5d, 0x91, 0xdd, 0x4b, 0x84, 0x3b, + 0x83, 0x96, 0x03, 0x5d, 0xa0, 0x34, 0xef, 0x18, 0x94, 0x84, 0x42, 0x47, + 0x08, 0x52, 0x11, 0x24, 0x93, 0xa0, 0x89, 0xce, 0x16, 0xb9, 0x9b, 0xa1, + 0x9d, 0x86, 0xc8, 0x5a, 0xeb, 0xc9, 0x94, 0x0c, 0x80, 0x5c, 0x9a, 0x64, + 0x32, 0x83, 0xec, 0x45, 0xdf, 0x11, 0x35, 0x61, 0xdc, 0x60, 0x9b, 0x58, + 0x09, 0xae, 0x64, 0xee, 0x5c, 0x79, 0x73, 0xf9, 0x11, 0xc6, 0xe7, 0x5b, + 0xd5, 0x8c, 0xda, 0x16, 0x8b, 0x5f, 0x41, 0xff, 0x00, 0x28, 0xdb, 0xf8, + 0xc3, 0x9a, 0xd0, 0x63, 0xe5, 0x82, 0x15, 0x2e, 0x86, 0x32, 0xde, 0xa3, + 0x40, 0x72, 0x85, 0xd4, 0x09, 0x02, 0x56, 0x70, 0x09, 0xd9, 0x2d, 0xda, + 0x37, 0xce, 0x60, 0x56, 0xdd, 0x98, 0x1e, 0x7b, 0x76, 0x63, 0xc8, 0xc9, + 0xc8, 0x8d, 0x90, 0x6d, 0x9b, 0x84, 0x29, 0xf3, 0xcd, 0x49, 0x44, 0x2a, + 0x91, 0xe4, 0x4d, 0x1b, 0x77, 0x80, 0x41, 0x7b, 0x7d, 0x33, 0x22, 0x07, + 0x50, 0x85, 0x02, 0x2e, 0x09, 0x08, 0xe6, 0xf7, 0x37, 0x0e, 0x44, 0xed, + 0x8a, 0x06, 0xc3, 0x6d, 0x46, 0xcf, 0x31, 0x93, 0xba, 0x43, 0xd0, 0x43, + 0x06, 0x74, 0xfc, 0x9a, 0x8f, 0x21, 0x8c, 0xe4, 0xee, 0x6c, 0x82, 0x10, + 0x84, 0x12, 0x92, 0x05, 0x21, 0xa0, 0xe8, 0x26, 0xb2, 0x64, 0x89, 0x12, + 0xc8, 0xd8, 0xb9, 0x05, 0xde, 0xa3, 0x58, 0x4e, 0x1b, 0xb4, 0x3e, 0x51, + 0x93, 0x6f, 0xc3, 0x32, 0xed, 0xd8, 0xce, 0x3e, 0x04, 0xb3, 0x0e, 0x17, + 0x61, 0xb6, 0x83, 0xed, 0x63, 0x2e, 0xa8, 0xfd, 0xcc, 0xe8, 0x4d, 0xc8, + 0x27, 0x64, 0x26, 0xcc, 0x8e, 0xb8, 0x24, 0x92, 0x49, 0x3e, 0xa3, 0xf7, + 0xd1, 0x1f, 0xb1, 0xea, 0xfd, 0x91, 0x3a, 0xdf, 0x04, 0x97, 0x6f, 0xd8, + 0x2d, 0x77, 0xb0, 0x50, 0xb3, 0x79, 0x29, 0x16, 0xf3, 0x29, 0x3e, 0xe4, + 0x26, 0x56, 0x41, 0xa3, 0xd8, 0x22, 0x4b, 0x76, 0x90, 0xcd, 0x77, 0x8e, + 0x37, 0x5d, 0x9d, 0xc7, 0x9a, 0xcf, 0xb9, 0x06, 0x63, 0x7a, 0x6e, 0x4d, + 0xc1, 0xb8, 0xf0, 0x6e, 0x0d, 0x88, 0x13, 0x90, 0xb8, 0x76, 0x18, 0x0b, + 0x1b, 0xa9, 0x00, 0xb0, 0x9b, 0x05, 0xa1, 0x60, 0x8c, 0x48, 0x98, 0x4d, + 0x98, 0x94, 0x72, 0x44, 0x5e, 0x49, 0x95, 0x0d, 0x8c, 0x38, 0xe4, 0xfd, + 0x4f, 0xa4, 0x9c, 0xcd, 0xe3, 0x77, 0xd0, 0xed, 0xf0, 0x4e, 0x94, 0x6d, + 0x8d, 0x87, 0x93, 0xec, 0x64, 0xbf, 0xb3, 0x93, 0xc9, 0x2d, 0x47, 0x26, + 0x03, 0x88, 0x80, 0x71, 0xc4, 0x07, 0x16, 0x73, 0x15, 0x66, 0x1b, 0x9c, + 0xc3, 0x9e, 0x4c, 0x6a, 0xf2, 0x78, 0x7b, 0xfc, 0x9d, 0xde, 0x4e, 0xff, + 0x00, 0x24, 0xb7, 0xf2, 0x47, 0x64, 0x77, 0x12, 0x33, 0xf9, 0x16, 0x68, + 0x82, 0xe9, 0xe0, 0x4b, 0xe9, 0x14, 0xd4, 0x61, 0xa4, 0xf3, 0x19, 0xd7, + 0xc8, 0xdb, 0xaf, 0x91, 0xee, 0x79, 0x12, 0xcd, 0xf9, 0x1a, 0x73, 0x0d, + 0x36, 0x62, 0x62, 0xd8, 0x27, 0x72, 0x24, 0xc6, 0xa6, 0x09, 0xe9, 0xd0, + 0x57, 0x22, 0x1d, 0xce, 0x01, 0xee, 0x26, 0x43, 0x5d, 0x30, 0x8b, 0x66, + 0xfc, 0x8a, 0xdb, 0xcc, 0x59, 0x1c, 0x4a, 0xd7, 0xca, 0x25, 0xba, 0xe4, + 0x1b, 0x9d, 0xd8, 0xcd, 0x13, 0x6d, 0xd3, 0xb3, 0x12, 0x67, 0x5c, 0x0d, + 0xb3, 0x83, 0xb6, 0x8d, 0x94, 0xdb, 0xbb, 0x1a, 0x69, 0x11, 0x84, 0xaf, + 0xd5, 0x7e, 0xcf, 0xb0, 0xfd, 0x9f, 0x41, 0xfb, 0x25, 0xfc, 0x32, 0x5f, + 0xc3, 0x27, 0xa7, 0x83, 0x38, 0xbf, 0x0c, 0xe6, 0xf0, 0xce, 0x4f, 0x0c, + 0xfa, 0x13, 0x3e, 0xa4, 0xcf, 0xa9, 0x32, 0x7f, 0xe4, 0xc9, 0xeb, 0xf0, + 0xc9, 0x7f, 0x83, 0x25, 0xfd, 0x0f, 0xa6, 0xcd, 0x9f, 0x23, 0x7f, 0xcc, + 0x48, 0xcf, 0xcc, 0x46, 0x28, 0x64, 0x77, 0x38, 0x09, 0xc3, 0xa7, 0xc9, + 0x13, 0x66, 0x89, 0x2e, 0x35, 0x19, 0x06, 0x62, 0x02, 0x44, 0x8d, 0xc9, + 0x29, 0x29, 0x29, 0x26, 0x43, 0x0f, 0x2f, 0x0e, 0x12, 0x22, 0x1c, 0x88, + 0xcd, 0x27, 0x74, 0x6e, 0x8d, 0xf9, 0xb9, 0xeb, 0xc8, 0x13, 0xb1, 0xfe, + 0x49, 0xfc, 0xc3, 0xf9, 0x87, 0xf2, 0x0f, 0xe0, 0x62, 0x29, 0x7f, 0x37, + 0xa6, 0x42, 0x10, 0xbf, 0x82, 0x7f, 0x14, 0xfe, 0x69, 0xfc, 0xd3, 0xf9, + 0xa7, 0xf1, 0x0f, 0xe2, 0x1f, 0xcf, 0x3f, 0x97, 0xd3, 0x09, 0x1d, 0xba, + 0x37, 0xc6, 0xf4, 0x97, 0x36, 0x1c, 0x0c, 0xc2, 0x62, 0x62, 0x6c, 0x04, + 0x50, 0x10, 0x64, 0x40, 0x40, 0x2c, 0x11, 0x81, 0x12, 0xf3, 0x1b, 0x64, + 0x22, 0xb0, 0x87, 0x34, 0x6d, 0xae, 0x8e, 0xae, 0xef, 0x1e, 0x8f, 0xe5, + 0x9f, 0xcb, 0x27, 0xfe, 0x26, 0xd7, 0x89, 0x3d, 0x0a, 0x5a, 0x14, 0x8b, + 0x81, 0x71, 0x28, 0xe0, 0x02, 0x01, 0xb8, 0x4d, 0xe4, 0x6c, 0x07, 0xf0, + 0x59, 0xfc, 0x76, 0x6e, 0x78, 0xb3, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, + 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, 0xcc, 0x4b, 0x27, 0x92, + 0x48, 0x48, 0xfe, 0x09, 0x24, 0x83, 0x6d, 0x26, 0x02, 0x4d, 0x09, 0xe6, + 0xf1, 0xb4, 0x9f, 0x6e, 0x4b, 0xe9, 0x3b, 0x74, 0xf7, 0x0f, 0xba, 0x74, + 0x36, 0x9c, 0x9d, 0x42, 0x3a, 0xba, 0x3b, 0x27, 0xad, 0x2b, 0xb9, 0xff, + 0x00, 0xa1, 0x07, 0x6a, 0x2e, 0x39, 0x1d, 0xc1, 0x29, 0x87, 0xf5, 0x92, + 0x25, 0x96, 0x5a, 0x4d, 0x90, 0x09, 0xb2, 0x6f, 0x26, 0x13, 0x3a, 0x04, + 0x5e, 0x9e, 0x93, 0x1e, 0x4a, 0x9a, 0x6c, 0x87, 0x67, 0x1c, 0xf2, 0xa4, + 0x73, 0xeb, 0x95, 0xea, 0xc4, 0x86, 0x2d, 0x0c, 0xda, 0x8b, 0x44, 0xa7, + 0xf0, 0xd9, 0xbe, 0x40, 0x29, 0x20, 0xeb, 0xc0, 0xa8, 0x8a, 0x02, 0xdb, + 0xec, 0x15, 0x33, 0x16, 0x97, 0xe0, 0x91, 0x90, 0x64, 0xda, 0x6f, 0x2d, + 0xfb, 0x60, 0x56, 0x90, 0x01, 0xa9, 0x37, 0x3d, 0x66, 0xf4, 0x5d, 0x7f, + 0xca, 0x29, 0xed, 0x54, 0x79, 0x9b, 0xb3, 0x3e, 0xcd, 0x89, 0x15, 0xe6, + 0x4a, 0xf4, 0xa3, 0x68, 0xe4, 0x9b, 0x97, 0x43, 0x31, 0x30, 0xf0, 0xb6, + 0xdb, 0xd3, 0x61, 0x08, 0x93, 0x3c, 0x40, 0x93, 0x6f, 0x6d, 0xe9, 0xdf, + 0x40, 0xd3, 0x6f, 0xbc, 0x82, 0x45, 0x07, 0xf8, 0x45, 0xef, 0xbb, 0x49, + 0x6e, 0xbb, 0xd2, 0xcf, 0x10, 0x11, 0xf7, 0x5e, 0x15, 0x64, 0x82, 0x1e, + 0xd0, 0x66, 0x03, 0x24, 0x52, 0x35, 0xed, 0xff, 0x00, 0x46, 0x38, 0xac, + 0x12, 0x59, 0x6b, 0xe9, 0x39, 0x5d, 0xd6, 0x87, 0xe8, 0x03, 0x6f, 0xbe, + 0x92, 0x51, 0x98, 0x1f, 0x69, 0x45, 0x1e, 0x0e, 0x0b, 0x4d, 0xc4, 0xc7, + 0xeb, 0x7a, 0xcc, 0x6e, 0x2b, 0x8c, 0xb3, 0xac, 0xc2, 0x91, 0x67, 0xed, + 0x2a, 0x00, 0xda, 0x69, 0x3e, 0xc3, 0x98, 0xc9, 0xba, 0x80, 0xa9, 0x64, + 0xff, 0x00, 0xdf, 0xd2, 0x24, 0xee, 0xe4, 0x6e, 0x4e, 0xc8, 0xca, 0x0a, + 0x34, 0x4a, 0xc9, 0x69, 0x57, 0x1a, 0x35, 0xa7, 0xd6, 0x38, 0x31, 0xa4, + 0x65, 0xa7, 0xa7, 0xd0, 0x79, 0x75, 0xcc, 0xde, 0xe7, 0x90, 0x06, 0x2f, + 0xca, 0x43, 0xb7, 0x5f, 0x82, 0xda, 0x40, 0xdf, 0x97, 0x1b, 0xed, 0xcf, + 0x43, 0x04, 0x10, 0x65, 0xe8, 0x75, 0x72, 0x12, 0x92, 0x3b, 0xca, 0x5c, + 0xe7, 0xb3, 0x9c, 0x2b, 0xfd, 0xf7, 0xd7, 0x04, 0xb5, 0x3c, 0x24, 0x40, + 0x1e, 0x9c, 0x3b, 0x3b, 0x83, 0xd8, 0x4d, 0x0e, 0x28, 0xa0, 0x63, 0xa4, + 0xe6, 0xab, 0xa4, 0x22, 0xa7, 0x2d, 0x32, 0xdf, 0x80, 0x95, 0x7c, 0x7a, + 0x7f, 0x4f, 0xbb, 0xb1, 0x38, 0xd3, 0x60, 0x4e, 0xae, 0xaa, 0x3f, 0x31, + 0xfb, 0x0f, 0x61, 0x4c, 0xca, 0x48, 0x67, 0xb0, 0x58, 0x14, 0x2e, 0x58, + 0xbb, 0x05, 0x02, 0xa6, 0xcd, 0x05, 0x89, 0x81, 0x49, 0x0e, 0x20, 0x42, + 0xd4, 0x3f, 0x9b, 0x6c, 0x68, 0x1a, 0x0e, 0xd0, 0x5c, 0xe8, 0x4f, 0xfe, + 0xf0, 0xe1, 0x8e, 0x46, 0x2a, 0x71, 0xab, 0xa5, 0x3f, 0x90, 0x72, 0x81, + 0x09, 0x34, 0x3e, 0xaf, 0xc5, 0x35, 0xf7, 0x27, 0x16, 0x63, 0x74, 0x5b, + 0x52, 0xaf, 0x16, 0x3e, 0xe6, 0xff, 0x00, 0x1e, 0x91, 0xde, 0x27, 0x92, + 0x0a, 0x45, 0xcd, 0x94, 0x42, 0xd9, 0x7a, 0x87, 0xd3, 0xae, 0x48, 0x91, + 0x92, 0x49, 0x24, 0x8e, 0xcb, 0xf5, 0xc8, 0xbe, 0x9d, 0x90, 0x5b, 0x3f, + 0xc3, 0xeb, 0x10, 0x24, 0x13, 0xa2, 0xd7, 0xe3, 0xb8, 0xde, 0xe4, 0xbf, + 0x05, 0x34, 0x69, 0x2e, 0xf1, 0x5e, 0xb7, 0xcc, 0xf8, 0xef, 0x56, 0x71, + 0xdd, 0x64, 0x69, 0x08, 0x30, 0x70, 0x41, 0xff, 0x00, 0x2c, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x93, 0x91, 0x6d, 0x7b, 0xbd, 0xa5, 0x68, 0xeb, + 0xc5, 0x43, 0x3f, 0x4c, 0x14, 0x8c, 0x82, 0x0a, 0xa4, 0x20, 0x32, 0x49, + 0x24, 0x90, 0xf7, 0x49, 0x67, 0x97, 0xf0, 0x9a, 0xb9, 0x29, 0x91, 0x73, + 0xc5, 0x99, 0x67, 0xc0, 0x8b, 0x30, 0x06, 0x2b, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x69, 0x87, 0x19, 0xb3, 0x64, 0x84, 0xde, + 0x49, 0x26, 0x3e, 0x6c, 0xbd, 0xaf, 0xb7, 0xb9, 0x3c, 0x14, 0x92, 0x49, + 0x24, 0x92, 0x43, 0xeb, 0x45, 0xb1, 0x26, 0x0e, 0x9c, 0xca, 0x3a, 0x34, + 0x9a, 0xcb, 0x83, 0xcc, 0xf5, 0x71, 0x41, 0x32, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x92, 0x4f, 0x0f, 0x51, 0x31, 0xbf, 0x4b, 0x5f, + 0xf3, 0x33, 0xe8, 0x05, 0x6b, 0x18, 0x0e, 0xc7, 0xe6, 0xa4, 0x92, 0x49, + 0x24, 0x92, 0x4c, 0x1d, 0x97, 0x4c, 0x8d, 0xd4, 0x9f, 0xc7, 0xd1, 0x0c, + 0x37, 0xc9, 0xb2, 0xc4, 0xbd, 0x1c, 0x28, 0x36, 0x49, 0x24, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x24, 0x85, 0x94, 0x3b, 0x02, 0xe5, 0x3f, 0x24, 0x78, + 0x86, 0x75, 0x2d, 0xfa, 0xd8, 0x02, 0xe5, 0xd8, 0x31, 0xee, 0x26, 0x18, + 0x51, 0x26, 0x4b, 0xa2, 0xc0, 0x10, 0x2f, 0x2a, 0xcd, 0xf0, 0x3c, 0x49, + 0x2c, 0x5b, 0xfa, 0x66, 0x3d, 0xf2, 0xcb, 0xc0, 0xde, 0x8c, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x0c, 0xf9, 0x01, 0xd5, 0x51, 0x73, 0xdf, 0x78, 0x15, + 0xad, 0x6a, 0xe1, 0x1a, 0x99, 0x1d, 0x6c, 0x60, 0x30, 0x63, 0xe3, 0x05, + 0x68, 0x6e, 0x96, 0x70, 0xbb, 0x84, 0x63, 0x0f, 0xb8, 0x78, 0xa9, 0xf6, + 0x0c, 0x30, 0xfa, 0x52, 0xaf, 0x8c, 0x92, 0x4c, 0xa0, 0xfc, 0x92, 0x49, + 0x24, 0x92, 0x49, 0x3d, 0xe9, 0x0c, 0x20, 0x22, 0xcf, 0x41, 0x0a, 0x6a, + 0x6b, 0xa5, 0x9c, 0x7d, 0x2c, 0xb0, 0x4e, 0x60, 0x08, 0xb2, 0xff, 0x00, + 0xb3, 0xd7, 0x01, 0x05, 0x2e, 0xaa, 0x82, 0xeb, 0x8d, 0x41, 0x34, 0x46, + 0x40, 0x62, 0x06, 0x2c, 0x7f, 0xd5, 0xac, 0x8e, 0x22, 0xf7, 0x4c, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x2d, 0xd8, 0x4b, 0xb5, 0x39, 0x8f, 0xf3, 0xda, + 0x9a, 0x85, 0x13, 0x4d, 0x11, 0xaf, 0x65, 0xcb, 0xcd, 0xc1, 0xbd, 0x60, + 0x28, 0xe1, 0x1d, 0xa2, 0xda, 0xca, 0x87, 0x52, 0x15, 0x73, 0xae, 0xd7, + 0x85, 0x2a, 0xfd, 0xe7, 0x4c, 0x0e, 0x94, 0xeb, 0x4a, 0xa5, 0x3c, 0x92, + 0x49, 0x24, 0x92, 0x49, 0x9c, 0x93, 0x7e, 0x9d, 0x34, 0x6a, 0x56, 0xd1, + 0xc0, 0x43, 0x01, 0x75, 0xaa, 0x25, 0xe5, 0xbe, 0x59, 0x87, 0x0b, 0x36, + 0xba, 0x6b, 0xc2, 0x43, 0x22, 0x09, 0x63, 0xe0, 0x31, 0x43, 0x78, 0x81, + 0xd4, 0x5b, 0x4e, 0xe9, 0x51, 0x2e, 0x92, 0xe9, 0x70, 0x08, 0x44, 0x92, + 0x49, 0x24, 0x92, 0x49, 0xb5, 0xe1, 0xba, 0xf6, 0x0a, 0xd5, 0x93, 0xa2, + 0xfb, 0x4b, 0xcc, 0x15, 0xe8, 0x6a, 0x0f, 0xee, 0x0e, 0x48, 0x6c, 0xfc, + 0xdb, 0xd6, 0xc2, 0x58, 0x12, 0xc5, 0xbd, 0xf8, 0x63, 0x89, 0xea, 0x47, + 0xd3, 0x07, 0x90, 0x89, 0x95, 0x7f, 0x27, 0x78, 0xee, 0x04, 0x14, 0x92, + 0x49, 0x24, 0xd0, 0x48, 0xd2, 0x4c, 0x6e, 0xac, 0xb3, 0x25, 0x94, 0x90, + 0x40, 0xbd, 0xa2, 0xf6, 0xc6, 0x1c, 0x17, 0xa4, 0x88, 0xfe, 0x42, 0x43, + 0xf5, 0x0e, 0x06, 0x9e, 0x44, 0x50, 0xa4, 0x73, 0x23, 0xe6, 0x15, 0xc3, + 0x2d, 0xc6, 0x6f, 0x53, 0xa5, 0xc0, 0xbe, 0xb1, 0x27, 0x87, 0x24, 0x92, + 0x49, 0x21, 0x12, 0x13, 0x35, 0x54, 0xe2, 0x3e, 0x1f, 0x5e, 0x93, 0xcd, + 0x4f, 0x94, 0x5c, 0x3c, 0xaa, 0xe8, 0xcb, 0x1e, 0x65, 0x0b, 0x08, 0x54, + 0x4e, 0x7f, 0xb6, 0x55, 0xa2, 0x8b, 0xdb, 0xdf, 0x54, 0xb1, 0xb8, 0xf9, + 0x74, 0xd7, 0x01, 0xfa, 0x81, 0x51, 0xf2, 0x1d, 0xf2, 0xd8, 0xde, 0x12, + 0x49, 0x20, 0x5c, 0x9f, 0xf8, 0x1f, 0xf0, 0xa5, 0xd9, 0x3b, 0x70, 0x4d, + 0x89, 0x62, 0x1f, 0xdd, 0xa9, 0x72, 0xe3, 0xdd, 0x6e, 0x15, 0x82, 0xb9, + 0xf0, 0xe8, 0x45, 0x54, 0x27, 0xb1, 0xcd, 0x43, 0x17, 0xda, 0x73, 0x1d, + 0x76, 0xe4, 0x92, 0x87, 0xc4, 0x10, 0x3b, 0xfb, 0x2a, 0x4e, 0x6b, 0xb5, + 0x2e, 0xd7, 0xeb, 0x9f, 0x73, 0xa7, 0x00, 0x57, 0x8e, 0x7f, 0xc4, 0xa4, + 0xb3, 0xa5, 0xf4, 0xb8, 0x06, 0x58, 0xe0, 0x91, 0x40, 0x31, 0x6f, 0x6f, + 0x33, 0x7a, 0xc3, 0x6d, 0xd8, 0x26, 0xf5, 0xd3, 0x4b, 0xbc, 0x1c, 0x8f, + 0x8d, 0xad, 0xb6, 0x7e, 0x1d, 0x02, 0x16, 0xdf, 0x2c, 0xc0, 0x78, 0x58, + 0xef, 0x7f, 0x6c, 0x54, 0xe5, 0xf9, 0x7d, 0x00, 0xa2, 0x3d, 0x28, 0x07, + 0x6f, 0xbf, 0x87, 0x2e, 0xef, 0xf9, 0x59, 0xb1, 0xb6, 0xc3, 0xa2, 0xbe, + 0x3d, 0x0c, 0xb0, 0x1e, 0x1c, 0x0a, 0x2e, 0x01, 0x80, 0xcc, 0x53, 0x0e, + 0xae, 0xc4, 0x7a, 0x59, 0x6c, 0xb2, 0x01, 0x4b, 0xed, 0xfb, 0xd1, 0xa1, + 0x67, 0x6c, 0x3f, 0xc2, 0xf5, 0x43, 0xec, 0x9f, 0x50, 0x73, 0x8f, 0x90, + 0xb0, 0x14, 0x5f, 0x0f, 0x6d, 0xd3, 0x16, 0xec, 0xba, 0x64, 0xfe, 0x5d, + 0xc3, 0x36, 0xd2, 0x4b, 0xce, 0x20, 0x72, 0x57, 0x34, 0x4c, 0x8a, 0x29, + 0xa5, 0x53, 0x09, 0x5d, 0x8d, 0xb0, 0x06, 0x46, 0x71, 0x7c, 0x51, 0x79, + 0x73, 0xd7, 0xc0, 0x09, 0x75, 0x90, 0xed, 0x9e, 0x52, 0x3d, 0xb1, 0x0e, + 0x67, 0x63, 0xda, 0x7f, 0xbd, 0xd7, 0x68, 0xc7, 0x2c, 0xe1, 0x4a, 0x3c, + 0x83, 0x44, 0xef, 0x35, 0x75, 0x7a, 0xd8, 0x37, 0x34, 0x87, 0x23, 0xd6, + 0xd7, 0xad, 0xca, 0x1f, 0xef, 0x90, 0x0a, 0x22, 0xe7, 0x35, 0x67, 0x9a, + 0x91, 0x21, 0x49, 0x0f, 0x61, 0x20, 0x6a, 0xca, 0x08, 0xf3, 0xfe, 0xba, + 0x56, 0x4f, 0xae, 0xaa, 0x1b, 0x40, 0xfc, 0x87, 0xde, 0xf8, 0xad, 0x64, + 0x48, 0xa2, 0x88, 0x5b, 0xe6, 0x6e, 0x6c, 0x73, 0x5d, 0xa7, 0x04, 0xa2, + 0xbe, 0x66, 0xb7, 0x50, 0x86, 0x42, 0x0a, 0xb6, 0xc7, 0xdb, 0x32, 0x67, + 0xad, 0xfa, 0x09, 0x4c, 0xc0, 0x3c, 0x7f, 0xf0, 0x6b, 0x7c, 0xf8, 0xe3, + 0x0b, 0xab, 0x73, 0xdb, 0x69, 0x20, 0xb6, 0x3e, 0xd3, 0xe5, 0x2b, 0xce, + 0x15, 0xb2, 0x04, 0xc9, 0xca, 0x60, 0x63, 0xe5, 0x14, 0x8a, 0xc7, 0x70, + 0x72, 0x96, 0xb0, 0x98, 0x92, 0x58, 0x4f, 0xc6, 0x4d, 0x07, 0x38, 0x45, + 0x88, 0x21, 0xf2, 0x8a, 0x74, 0x2e, 0x7e, 0xfc, 0x6a, 0x36, 0xf9, 0x7a, + 0x8f, 0x0b, 0xee, 0x53, 0xf9, 0xf4, 0xc8, 0xf6, 0xda, 0x87, 0x28, 0xb0, + 0xea, 0x92, 0x33, 0x51, 0xe0, 0x26, 0x60, 0xb9, 0xac, 0xfe, 0x27, 0x10, + 0x13, 0xe3, 0x96, 0xcb, 0x04, 0xcb, 0x06, 0x14, 0xef, 0x9e, 0x06, 0x8a, + 0xcd, 0xdc, 0x60, 0x6b, 0x5a, 0x8b, 0xaf, 0xff, 0x00, 0x1b, 0x70, 0xd8, + 0xf4, 0xb6, 0xf1, 0x56, 0x23, 0x99, 0x67, 0x30, 0xc5, 0x06, 0x30, 0x05, + 0x03, 0x84, 0x93, 0xf1, 0x20, 0x26, 0x81, 0xe9, 0xb8, 0xf3, 0xf5, 0x69, + 0xa8, 0x2b, 0x33, 0xd9, 0xd1, 0x04, 0x49, 0x41, 0x78, 0x28, 0xe8, 0xb9, + 0xd1, 0xb5, 0x2b, 0x0f, 0x23, 0x4a, 0x8b, 0xf7, 0xf2, 0x4b, 0x20, 0xdb, + 0x40, 0xe3, 0x83, 0x54, 0x31, 0xb3, 0x8c, 0x93, 0x05, 0x3f, 0x94, 0x94, + 0x48, 0xda, 0x94, 0xd0, 0x60, 0x99, 0x4b, 0xa6, 0x94, 0xe4, 0xe8, 0xaa, + 0x88, 0x9d, 0x0c, 0x50, 0x00, 0x10, 0xcb, 0x0b, 0xd3, 0xfe, 0x57, 0x31, + 0x8a, 0x3e, 0x60, 0x96, 0x91, 0xde, 0xc1, 0xbc, 0xdb, 0x5d, 0x6a, 0xd9, + 0x66, 0xa8, 0xe6, 0x9c, 0xc0, 0x79, 0x7e, 0x9e, 0x09, 0x9c, 0xb7, 0xc1, + 0xdf, 0x5d, 0x93, 0x4b, 0xfe, 0xc6, 0xa1, 0x93, 0xc0, 0xa4, 0x7b, 0xe6, + 0x9f, 0xf1, 0x86, 0x52, 0x09, 0xb6, 0xdb, 0x09, 0xce, 0x09, 0x75, 0xad, + 0xc3, 0x7f, 0x72, 0xb6, 0xd7, 0xe8, 0x32, 0xbe, 0x44, 0x48, 0x33, 0xfd, + 0xb1, 0xb5, 0x16, 0x1e, 0xc9, 0xd5, 0xe9, 0xef, 0x55, 0x83, 0x61, 0x8c, + 0x44, 0xc9, 0xb5, 0xcb, 0x93, 0x7d, 0x66, 0x1a, 0x80, 0xf4, 0x0b, 0x54, + 0x2a, 0x7b, 0x73, 0x3f, 0xc9, 0xb6, 0xca, 0x4a, 0x21, 0x9b, 0x91, 0x9d, + 0x8a, 0xdf, 0xe7, 0xbe, 0xbe, 0x3f, 0x16, 0x4c, 0x9d, 0x2d, 0xfb, 0xdc, + 0x05, 0xc9, 0xee, 0xc5, 0xc9, 0x73, 0xc3, 0x2c, 0x77, 0x76, 0x3f, 0xcd, + 0xc9, 0xde, 0x91, 0xc8, 0x57, 0x62, 0x31, 0xc8, 0x02, 0x9d, 0xd4, 0xdc, + 0x68, 0x0b, 0xbb, 0xac, 0xc0, 0xb6, 0xc2, 0x04, 0x3e, 0xfe, 0xac, 0x13, + 0xc5, 0xb3, 0xf5, 0xbb, 0xf0, 0x17, 0x46, 0x8c, 0x03, 0x59, 0x8b, 0xdd, + 0x12, 0x3c, 0x10, 0x09, 0x08, 0x43, 0x04, 0xab, 0xee, 0x08, 0xa7, 0x1e, + 0xb5, 0xbb, 0xb2, 0xcb, 0xcf, 0x38, 0x60, 0x0c, 0x7e, 0x5b, 0x76, 0xff, + 0x00, 0x00, 0x5c, 0xf0, 0x9f, 0xa0, 0x96, 0xca, 0x4b, 0x15, 0x47, 0x67, + 0x23, 0x52, 0xae, 0xf4, 0x1b, 0xfb, 0x30, 0xcc, 0x93, 0x32, 0x5d, 0x5b, + 0x96, 0x3d, 0xdc, 0xe7, 0x38, 0x8b, 0x03, 0x3e, 0xf9, 0xc9, 0x0e, 0xc0, + 0xd3, 0x6f, 0xd9, 0x6a, 0xa0, 0x33, 0x2c, 0xd8, 0x76, 0xe9, 0x2a, 0x94, + 0x7d, 0xb1, 0x49, 0x14, 0xfa, 0x48, 0x34, 0x80, 0x4b, 0x54, 0x27, 0xcc, + 0x21, 0xe8, 0x8e, 0x5d, 0x89, 0xbf, 0x9b, 0xd1, 0x2b, 0xc7, 0xde, 0x3b, + 0xde, 0x31, 0x91, 0xf3, 0x20, 0xaf, 0x03, 0xb3, 0xb9, 0xc8, 0x9f, 0x03, + 0xf7, 0x75, 0x55, 0x66, 0x1b, 0x33, 0x67, 0x18, 0x5a, 0x02, 0xb3, 0x99, + 0xce, 0x67, 0xf3, 0x3b, 0xb2, 0x48, 0x00, 0x82, 0x6d, 0xbd, 0x10, 0x94, + 0x0d, 0xb1, 0x0e, 0x64, 0x2f, 0x94, 0xb9, 0x7a, 0x25, 0x94, 0x72, 0xc0, + 0x8e, 0x5d, 0x45, 0x79, 0xf1, 0xa6, 0x0e, 0x73, 0xe1, 0x6c, 0x60, 0x4f, + 0x4a, 0x3f, 0x8b, 0x79, 0x26, 0xfd, 0x5f, 0x86, 0xf9, 0xdd, 0x1f, 0xef, + 0x23, 0x28, 0x22, 0x98, 0xef, 0xf2, 0xc3, 0x9d, 0xe0, 0x3d, 0x8f, 0xbb, + 0xfd, 0x92, 0xd6, 0x74, 0x19, 0x40, 0x49, 0x94, 0x92, 0x40, 0x8d, 0x0f, + 0x78, 0x0f, 0xae, 0xcd, 0x28, 0x03, 0x22, 0xe5, 0xc4, 0x14, 0x70, 0xfc, + 0x56, 0x7a, 0x1a, 0x69, 0xef, 0xd5, 0xc9, 0x52, 0x8f, 0xa2, 0x47, 0x3e, + 0xe0, 0x17, 0x6c, 0xc7, 0xce, 0xa6, 0x25, 0x43, 0xac, 0x1f, 0x87, 0x44, + 0xda, 0x89, 0x0e, 0xa4, 0x0a, 0x73, 0x2d, 0x8a, 0xaf, 0xf8, 0xb4, 0x90, + 0xf2, 0xde, 0x94, 0xbd, 0xbf, 0x6e, 0x69, 0xa1, 0xfc, 0x91, 0x4d, 0x3c, + 0x04, 0x37, 0x64, 0x96, 0x06, 0x28, 0x1b, 0x23, 0x3f, 0x8a, 0x13, 0x50, + 0x07, 0x94, 0xa8, 0x78, 0xf2, 0x6d, 0x59, 0x23, 0xdb, 0x00, 0xb0, 0xf5, + 0x24, 0x78, 0xbd, 0x41, 0x9d, 0x6b, 0x6a, 0xeb, 0xbb, 0x0c, 0xf1, 0x91, + 0x4f, 0x8a, 0x26, 0xed, 0x1f, 0x1b, 0x7c, 0x4b, 0x53, 0xac, 0x12, 0x7b, + 0x0d, 0x4c, 0x50, 0x58, 0x61, 0x37, 0xbb, 0x72, 0xee, 0xf3, 0xf8, 0x0b, + 0x29, 0x9a, 0xa0, 0x96, 0x11, 0x12, 0xbf, 0xf0, 0xe6, 0xbe, 0xf0, 0xe8, + 0xd7, 0x64, 0x4e, 0x38, 0x34, 0x43, 0xcb, 0x1c, 0x63, 0xd0, 0x2f, 0x0f, + 0xd9, 0x92, 0x41, 0xb7, 0xaf, 0xb6, 0x4e, 0x7d, 0x70, 0x4f, 0xb2, 0x55, + 0xbc, 0xf5, 0xe3, 0x4e, 0x1a, 0xef, 0xba, 0xea, 0x3e, 0x04, 0x9c, 0x5e, + 0x60, 0x02, 0xbe, 0xb8, 0xf3, 0x19, 0x68, 0x6f, 0xfb, 0x63, 0x0f, 0x9f, + 0xff, 0x00, 0xd3, 0xf9, 0xfd, 0x61, 0x5a, 0xf4, 0x8d, 0xd4, 0xfd, 0xd2, + 0x3f, 0x9d, 0x6b, 0x50, 0x5e, 0x86, 0x82, 0x02, 0xa6, 0xe7, 0x8a, 0xda, + 0x09, 0x5f, 0x38, 0x9e, 0x05, 0x2f, 0x76, 0xac, 0x02, 0x9e, 0x56, 0x28, + 0x3d, 0x04, 0x83, 0xe8, 0xdd, 0xe0, 0xf6, 0x01, 0x15, 0x68, 0x18, 0x7a, + 0xba, 0x95, 0x43, 0xe8, 0xee, 0x51, 0xb0, 0x3d, 0x20, 0xd8, 0x55, 0x16, + 0x55, 0x1a, 0xc1, 0x37, 0xe5, 0x49, 0xf0, 0x06, 0xf5, 0xc9, 0xf1, 0xd1, + 0x97, 0x17, 0xf1, 0x87, 0xe6, 0x3c, 0x66, 0x15, 0x8f, 0xd2, 0x1d, 0x29, + 0x9a, 0xd7, 0xb2, 0x40, 0xa3, 0xc2, 0xb9, 0x34, 0xbe, 0xaa, 0x22, 0x62, + 0x5e, 0x32, 0x87, 0xac, 0x38, 0xf0, 0x62, 0x24, 0xc4, 0x1a, 0xd3, 0x35, + 0x65, 0xe6, 0x54, 0xe9, 0x39, 0xeb, 0xf9, 0x08, 0x73, 0x3f, 0xe5, 0x32, + 0x6a, 0x06, 0xca, 0xb9, 0x54, 0x29, 0xda, 0xad, 0x16, 0x03, 0x69, 0x69, + 0x3c, 0xee, 0x27, 0x6e, 0x91, 0xed, 0xb3, 0xc5, 0xad, 0x91, 0xa3, 0x62, + 0x84, 0x6c, 0xb4, 0x0f, 0xcc, 0x7f, 0x75, 0xe5, 0x2b, 0x9a, 0x3e, 0x6f, + 0xcc, 0xe8, 0x10, 0x92, 0x8f, 0x60, 0xc3, 0xc7, 0x68, 0x09, 0xb5, 0x75, + 0x5a, 0x45, 0x03, 0xf1, 0x47, 0xd3, 0xd3, 0x95, 0x5e, 0x4e, 0x3c, 0xdb, + 0x95, 0xce, 0x12, 0x16, 0xf4, 0xfa, 0x59, 0xe2, 0x27, 0xa5, 0x63, 0x1b, + 0xbf, 0x99, 0x54, 0x4e, 0xc0, 0x89, 0x14, 0x9f, 0xe6, 0xb7, 0xff, 0x00, + 0x62, 0x0f, 0x79, 0xfb, 0xc0, 0x24, 0x26, 0xf4, 0xdf, 0x96, 0x11, 0x9f, + 0x29, 0x52, 0x6c, 0x4f, 0x05, 0xbc, 0x1e, 0x59, 0xbc, 0x32, 0xcc, 0xe3, + 0xe8, 0xf8, 0x56, 0x82, 0x46, 0x33, 0x2d, 0x2a, 0x5b, 0x4d, 0xaf, 0x50, + 0x18, 0x83, 0xc1, 0xba, 0x66, 0xcb, 0x50, 0x6b, 0xb6, 0x8b, 0x64, 0x34, + 0x56, 0x40, 0x76, 0x6a, 0xc8, 0x0f, 0x3b, 0xcd, 0x95, 0x34, 0x92, 0x40, + 0xb8, 0x62, 0x4c, 0xb1, 0xe6, 0x4d, 0x6c, 0x66, 0x8d, 0xd0, 0x81, 0xd8, + 0x32, 0xc1, 0x42, 0xe3, 0xc4, 0x3d, 0xbb, 0xcb, 0xeb, 0xd1, 0x3d, 0x9a, + 0x03, 0x38, 0x95, 0x20, 0xa8, 0x2b, 0xf9, 0xb1, 0xf7, 0xad, 0xfa, 0x6a, + 0xa5, 0x30, 0x0d, 0x15, 0x49, 0x6b, 0xfe, 0x10, 0xb6, 0xd9, 0x63, 0xaa, + 0xf2, 0x7e, 0x0d, 0x04, 0x12, 0xc8, 0x88, 0x37, 0xeb, 0xb7, 0x31, 0xa5, + 0x92, 0x53, 0x41, 0x94, 0xbf, 0x60, 0x74, 0x8c, 0x62, 0x1d, 0xb3, 0xe2, + 0x5a, 0x3b, 0xc7, 0x2a, 0x20, 0xc8, 0xd1, 0x61, 0x1b, 0x5b, 0xda, 0x6a, + 0xe7, 0x6c, 0x0b, 0x3b, 0x65, 0x81, 0xd8, 0x93, 0xaa, 0xc9, 0x1e, 0x02, + 0xf0, 0x64, 0x2d, 0xec, 0x32, 0xb2, 0x76, 0xbb, 0xe8, 0xf3, 0x25, 0x89, + 0xa0, 0xe8, 0x76, 0xea, 0x85, 0x07, 0x08, 0x24, 0x89, 0x5e, 0x4b, 0x7f, + 0x72, 0xcc, 0x37, 0x16, 0xdb, 0x36, 0x0b, 0x6d, 0x5f, 0x5b, 0xba, 0x88, + 0x4d, 0x58, 0x45, 0x00, 0x95, 0xc3, 0x5e, 0xc2, 0xe2, 0x5b, 0x7f, 0xe7, + 0xf6, 0x66, 0x4d, 0xc0, 0xc7, 0x75, 0x50, 0xcf, 0x87, 0x5b, 0xc8, 0xe0, + 0x9e, 0x3c, 0xdb, 0xf7, 0xb3, 0xbb, 0x85, 0xb8, 0x6c, 0x50, 0x6c, 0x4a, + 0xcd, 0x94, 0xb9, 0x55, 0x1e, 0x26, 0xeb, 0x65, 0xbd, 0xf4, 0xb4, 0x67, + 0xfc, 0x43, 0x29, 0xaa, 0x44, 0xdf, 0xe6, 0x59, 0xf0, 0x89, 0x21, 0x37, + 0x66, 0x61, 0x2e, 0xc5, 0x1a, 0x76, 0x9e, 0x84, 0x92, 0x91, 0xe4, 0xd1, + 0x8b, 0xa2, 0x89, 0x96, 0x43, 0x74, 0xc2, 0xd6, 0x5c, 0x4e, 0x37, 0xc4, + 0x19, 0xf4, 0x94, 0x48, 0x7a, 0xe3, 0x69, 0xbe, 0xe1, 0x8a, 0x44, 0x84, + 0x19, 0x0c, 0xfa, 0xdc, 0x5b, 0x36, 0x36, 0x52, 0x88, 0xb7, 0x02, 0x33, + 0x12, 0x22, 0x66, 0xb3, 0x51, 0x40, 0x59, 0x65, 0x00, 0xdb, 0xc1, 0x6b, + 0x40, 0x40, 0xa9, 0xdb, 0x24, 0x08, 0x27, 0x8c, 0x2f, 0x65, 0xb5, 0x8a, + 0x59, 0xfe, 0x71, 0x8a, 0xab, 0x1f, 0x89, 0xa5, 0xad, 0x0f, 0x14, 0x40, + 0x94, 0x8e, 0xf2, 0x5a, 0x02, 0x16, 0x28, 0x07, 0x56, 0x0a, 0xb7, 0xd8, + 0x99, 0x1b, 0xa2, 0xe3, 0x17, 0x9e, 0x1e, 0x41, 0xe8, 0xd9, 0xe3, 0x1d, + 0x96, 0x50, 0x88, 0x11, 0x19, 0xdb, 0x0a, 0xe9, 0x94, 0x26, 0xfd, 0x42, + 0x6d, 0x93, 0xb5, 0xcc, 0x6b, 0x16, 0x00, 0x49, 0xb3, 0x24, 0x8b, 0xf9, + 0x35, 0xf1, 0x44, 0xd0, 0x43, 0x21, 0xec, 0x68, 0xce, 0x9b, 0xbe, 0xc0, + 0xd6, 0xd5, 0xb2, 0x16, 0x49, 0x1b, 0x8e, 0x4a, 0x68, 0x80, 0xe1, 0xd6, + 0x5a, 0xed, 0x05, 0x13, 0xb9, 0xbd, 0x30, 0xf6, 0x6c, 0xcc, 0x7f, 0x42, + 0xa5, 0x8a, 0xb2, 0xe0, 0xc0, 0x11, 0xa9, 0xfa, 0x5b, 0x59, 0x13, 0x0c, + 0xfc, 0x77, 0x28, 0xb6, 0x91, 0xc4, 0x48, 0x56, 0xe4, 0x5c, 0x80, 0x91, + 0x22, 0x4b, 0xb9, 0xd4, 0x8e, 0xb6, 0x9c, 0x61, 0x12, 0x60, 0xa1, 0x89, + 0x5a, 0xa3, 0x07, 0x4d, 0x79, 0xc3, 0x05, 0x08, 0x3e, 0x7a, 0x16, 0x00, + 0xc4, 0x27, 0x8e, 0x86, 0xe9, 0x36, 0xc8, 0x98, 0x20, 0x23, 0xb6, 0xfc, + 0xa6, 0xf6, 0xbe, 0xdd, 0xfa, 0x8d, 0xe1, 0x75, 0x94, 0x15, 0x44, 0x69, + 0x34, 0xc0, 0xfb, 0x4c, 0x96, 0xcb, 0x9b, 0x6a, 0x69, 0xe3, 0xf8, 0xfc, + 0x8e, 0x6b, 0x9a, 0xd8, 0x07, 0x13, 0x76, 0xda, 0x31, 0x43, 0xbb, 0x55, + 0xfc, 0x58, 0xb0, 0x3f, 0xb1, 0x75, 0x5c, 0x4c, 0xa4, 0xc3, 0xf7, 0xf0, + 0x4b, 0x35, 0xb5, 0x86, 0xc2, 0x72, 0x31, 0xf6, 0x36, 0x7d, 0x00, 0xb2, + 0xc6, 0x5c, 0x04, 0xd0, 0x90, 0x9a, 0x9e, 0x93, 0x2c, 0xdc, 0x56, 0xf1, + 0x21, 0xe1, 0x13, 0xf9, 0x37, 0x77, 0x7e, 0xce, 0x18, 0x54, 0xa4, 0x1c, + 0x67, 0xae, 0x7a, 0x81, 0x02, 0xe7, 0x49, 0x26, 0x30, 0x01, 0xda, 0xbf, + 0x36, 0x41, 0x44, 0xb8, 0xd2, 0xdc, 0x2c, 0xf9, 0x47, 0x11, 0xfd, 0x5a, + 0x8b, 0x87, 0xc5, 0x1a, 0x39, 0x26, 0x27, 0x0f, 0xc4, 0x5e, 0x12, 0x78, + 0x13, 0x55, 0x1f, 0xcf, 0x40, 0xf7, 0xe0, 0xaa, 0xb0, 0x10, 0x06, 0x5c, + 0x48, 0x23, 0xc4, 0xfd, 0x97, 0x03, 0xdf, 0x3e, 0xb0, 0x98, 0xa0, 0x03, + 0x3b, 0xbf, 0x58, 0xea, 0x7a, 0x87, 0xc4, 0x2c, 0x08, 0x37, 0xb6, 0xe4, + 0xd1, 0x87, 0xa4, 0xde, 0x23, 0x59, 0x0c, 0xc1, 0x0f, 0xdf, 0xcd, 0xac, + 0x81, 0x2a, 0x61, 0x3a, 0x74, 0xa9, 0xa1, 0xce, 0x5b, 0xd6, 0x8e, 0xa0, + 0x9b, 0xf8, 0xbb, 0xd0, 0x28, 0x89, 0x5d, 0xf5, 0xfb, 0x65, 0xe1, 0xff, + 0x00, 0x3a, 0x50, 0x84, 0xc7, 0x6e, 0xdf, 0x8d, 0x7e, 0x10, 0xe5, 0x0d, + 0xe8, 0xb5, 0x89, 0x3a, 0x02, 0xf4, 0x73, 0xae, 0xd0, 0xa2, 0x39, 0x89, + 0x4c, 0xde, 0x17, 0x53, 0x38, 0x6f, 0x2f, 0x00, 0xd4, 0x94, 0xf7, 0x38, + 0x8a, 0xf4, 0xd5, 0xd9, 0x8b, 0x6c, 0xa1, 0xfe, 0xbe, 0x8d, 0xb1, 0xca, + 0x77, 0x1e, 0x9a, 0x46, 0xa0, 0xc5, 0x85, 0xfe, 0x9d, 0x55, 0x2e, 0x73, + 0xfb, 0xc7, 0x93, 0x66, 0x6e, 0x37, 0x6d, 0xee, 0x8c, 0x34, 0x1c, 0x64, + 0x82, 0x46, 0x44, 0x7c, 0x3b, 0x55, 0x54, 0x21, 0xcf, 0x56, 0x16, 0x32, + 0xcc, 0xb3, 0xd4, 0x4d, 0x9d, 0xf6, 0xeb, 0xeb, 0x67, 0xd5, 0x7d, 0xa2, + 0xc2, 0x5d, 0x1d, 0xad, 0xdf, 0x1d, 0x7b, 0x2a, 0x99, 0xb1, 0x01, 0xdf, + 0x86, 0x36, 0x01, 0x02, 0xab, 0x0b, 0xa4, 0x0a, 0x77, 0xa4, 0xc9, 0x2e, + 0x98, 0x7b, 0x2d, 0x17, 0x45, 0x54, 0x35, 0x36, 0x15, 0x81, 0x08, 0xc0, + 0x16, 0x4e, 0x0f, 0x58, 0x14, 0xd7, 0x5f, 0x35, 0xa4, 0x14, 0x40, 0xc1, + 0x34, 0x47, 0x4d, 0xdf, 0xaf, 0x8e, 0x0d, 0xef, 0x77, 0xea, 0x06, 0xd6, + 0xb6, 0x4b, 0x65, 0x96, 0x69, 0x24, 0x94, 0x92, 0x60, 0x96, 0x4b, 0xe1, + 0x11, 0xa1, 0xba, 0xde, 0x05, 0xfe, 0x72, 0xd9, 0x8f, 0x76, 0x59, 0xac, + 0x9f, 0xbd, 0x92, 0xf9, 0xbe, 0xf6, 0xfd, 0xff, 0xc4, 0x00, 0x2a, 0x11, + 0x00, 0x03, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x05, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x10, 0x20, 0x21, 0x31, 0x41, + 0x51, 0x61, 0x30, 0x71, 0x91, 0x40, 0x81, 0xa1, 0xb1, 0xc1, 0xd1, 0xe1, + 0xf0, 0xf1, 0x50, 0xff, 0xda, 0x00, 0x08, 0x01, 0x03, 0x01, 0x01, 0x3f, + 0x10, 0x78, 0x84, 0x36, 0x26, 0x36, 0xfa, 0x4d, 0x8d, 0xb4, 0xec, 0x54, + 0x5c, 0x54, 0x52, 0x94, 0xa8, 0xa8, 0xb8, 0x52, 0x94, 0xa5, 0x2a, 0x20, + 0x82, 0x97, 0x08, 0x20, 0x82, 0xa2, 0xa2, 0x04, 0xd3, 0x15, 0xd4, 0xcf, + 0x3a, 0x17, 0x79, 0x60, 0x17, 0x51, 0x84, 0xae, 0x68, 0x91, 0xd0, 0x40, + 0x80, 0xf0, 0xcf, 0x17, 0xe0, 0xf0, 0xcf, 0x0f, 0xe0, 0xf1, 0x3e, 0x0f, + 0x13, 0xe0, 0xf1, 0xbe, 0x0f, 0x0b, 0xe0, 0xf0, 0xbe, 0x0f, 0x0b, 0xe0, + 0xf0, 0x0f, 0x00, 0xf1, 0x0f, 0x08, 0xf1, 0x8f, 0x12, 0xf8, 0x3c, 0x68, + 0xf1, 0x0f, 0x18, 0xf1, 0x0f, 0x12, 0x3c, 0x4b, 0xe0, 0xf1, 0x2f, 0x83, + 0xc4, 0xbe, 0x11, 0xe3, 0x47, 0x8d, 0x7c, 0x1e, 0x35, 0xf0, 0x78, 0xd7, + 0xc1, 0xe1, 0x5f, 0x07, 0x8d, 0x7c, 0x1e, 0x27, 0xc1, 0xfe, 0x08, 0xf0, + 0x0f, 0x00, 0xf0, 0xbe, 0x0f, 0x13, 0xe0, 0xf1, 0x3e, 0x0f, 0x03, 0xe0, + 0xf1, 0x3e, 0x0f, 0x03, 0xe0, 0xf1, 0xbe, 0x0f, 0x0b, 0xe1, 0x1e, 0x27, + 0xc2, 0x3c, 0x4f, 0x83, 0xc5, 0xf8, 0x3c, 0x0f, 0x84, 0x78, 0x9f, 0x07, + 0x8e, 0x36, 0xf4, 0x14, 0x0f, 0xb0, 0x3e, 0xd8, 0xdf, 0xc6, 0xc7, 0x70, + 0x74, 0x61, 0xb7, 0x23, 0xa0, 0x13, 0xb0, 0x82, 0x31, 0xb1, 0x3c, 0x14, + 0x51, 0x34, 0x6f, 0x9b, 0x8b, 0x8a, 0x52, 0x97, 0x14, 0xba, 0xa9, 0x4a, + 0x52, 0x94, 0xac, 0xf7, 0xcd, 0x29, 0x74, 0x3f, 0x1a, 0xe0, 0x89, 0x99, + 0x84, 0x84, 0x8b, 0x22, 0x6d, 0x85, 0x56, 0xcf, 0x34, 0x42, 0x61, 0x18, + 0x88, 0x42, 0x10, 0x8c, 0x8f, 0x42, 0x29, 0x4a, 0x73, 0xaf, 0xee, 0x5c, + 0x5c, 0x55, 0xaf, 0x72, 0x8f, 0xce, 0x62, 0xd1, 0x45, 0x95, 0x9b, 0x84, + 0x9b, 0x29, 0x09, 0x9f, 0x41, 0xb3, 0x52, 0x0d, 0xa3, 0x2d, 0x5f, 0x29, + 0x07, 0xbe, 0x9a, 0x5c, 0xc2, 0x22, 0x2e, 0xc4, 0x44, 0x10, 0x49, 0x18, + 0x59, 0x44, 0xd3, 0xce, 0x9b, 0xab, 0x7c, 0xef, 0xa6, 0x7a, 0x70, 0x84, + 0xd0, 0x85, 0x92, 0x68, 0x96, 0xc5, 0xc7, 0x8c, 0x55, 0x8d, 0x8f, 0x63, + 0x62, 0x62, 0x1b, 0x6a, 0xb8, 0x4c, 0xb8, 0xa5, 0x2e, 0x2e, 0x3d, 0x8a, + 0xf1, 0x58, 0x9f, 0xa3, 0x71, 0x71, 0x2f, 0x02, 0xe2, 0x04, 0xc0, 0x9b, + 0xcc, 0x42, 0xea, 0x31, 0x27, 0x50, 0xba, 0xcd, 0x89, 0x22, 0x07, 0x60, + 0x36, 0xf6, 0x41, 0x2f, 0xa0, 0xf0, 0x10, 0x44, 0x31, 0xaa, 0x3d, 0xd6, + 0xe2, 0xe7, 0xec, 0xc7, 0xf4, 0x8d, 0x19, 0x03, 0x74, 0x34, 0xd6, 0x6e, + 0x6e, 0x2e, 0x85, 0xa6, 0x7a, 0x53, 0x5c, 0x7d, 0x8f, 0x00, 0x99, 0xd3, + 0x21, 0xd7, 0xff, 0x00, 0x47, 0xfa, 0x3f, 0xeb, 0x40, 0xc1, 0x12, 0xc2, + 0xee, 0xfc, 0x84, 0xa3, 0xbe, 0x98, 0x99, 0xdc, 0xf2, 0x89, 0xe1, 0x37, + 0x86, 0x45, 0xc2, 0x97, 0x32, 0xbd, 0x11, 0xfa, 0x73, 0x1c, 0x62, 0xf6, + 0xd0, 0x93, 0x6e, 0x23, 0x9f, 0x50, 0x47, 0x51, 0xd3, 0x85, 0xc0, 0x5a, + 0x5e, 0x9b, 0x89, 0xa2, 0x14, 0x43, 0x0e, 0xa3, 0xd9, 0xc8, 0xbe, 0x81, + 0xea, 0xa6, 0xdd, 0x46, 0xbd, 0x0e, 0x83, 0x29, 0x4a, 0x52, 0x94, 0xb8, + 0x52, 0x94, 0xa5, 0x29, 0x4b, 0x8a, 0x5c, 0x5d, 0x29, 0xdf, 0x08, 0x4d, + 0x8c, 0x04, 0x51, 0x63, 0x63, 0x91, 0x6e, 0x31, 0xb2, 0xe2, 0xe6, 0x96, + 0x13, 0xb1, 0x71, 0x31, 0x7b, 0x89, 0x97, 0x0c, 0x41, 0x6c, 0xc2, 0x47, + 0x91, 0xbd, 0x51, 0xca, 0x6c, 0x70, 0x0c, 0x4f, 0x09, 0xdc, 0x71, 0x8b, + 0x9b, 0x4a, 0xcf, 0x7f, 0x46, 0x0f, 0x22, 0x0a, 0xe5, 0x85, 0xd1, 0x34, + 0xef, 0xea, 0x52, 0xe2, 0xe5, 0x13, 0xfa, 0x2b, 0xae, 0xe2, 0x94, 0xa5, + 0x29, 0x4a, 0x35, 0xd4, 0x23, 0x4e, 0x1b, 0x89, 0xfc, 0x21, 0x3b, 0x81, + 0xe3, 0x23, 0xd0, 0x6a, 0xe5, 0x1e, 0x71, 0xe7, 0x1e, 0x16, 0x34, 0x74, + 0x23, 0x37, 0xc5, 0x29, 0x4a, 0x52, 0x94, 0x4c, 0xe8, 0x27, 0x12, 0x2e, + 0x44, 0x8b, 0x82, 0x69, 0xb7, 0x2c, 0x4c, 0xba, 0x28, 0xf7, 0x29, 0xbb, + 0x25, 0x2c, 0x29, 0x44, 0x58, 0x72, 0x42, 0xc4, 0x5c, 0xde, 0xa8, 0xea, + 0x22, 0x9f, 0x13, 0x71, 0x0b, 0x3b, 0xea, 0xb8, 0xe7, 0x44, 0x20, 0xed, + 0xef, 0x81, 0x6c, 0x41, 0x7a, 0x34, 0xf2, 0x31, 0x66, 0x94, 0xa8, 0xba, + 0x2c, 0x28, 0xbb, 0x7b, 0x9a, 0x2f, 0xa3, 0x71, 0x4b, 0x8b, 0xa1, 0x33, + 0xe0, 0xbe, 0xa4, 0x77, 0x17, 0x68, 0x4f, 0xb0, 0x27, 0x5c, 0x1e, 0x43, + 0xc8, 0x79, 0x8a, 0xee, 0x76, 0x99, 0xe5, 0x3c, 0xa7, 0x97, 0x15, 0x92, + 0xf9, 0x43, 0x77, 0x2a, 0x36, 0x72, 0x1b, 0x3a, 0xb4, 0x23, 0xa8, 0x60, + 0x9b, 0xab, 0x12, 0xb9, 0x12, 0x38, 0x58, 0xe7, 0x34, 0xdb, 0xa6, 0x2e, + 0x89, 0xab, 0x7e, 0x98, 0xde, 0x17, 0x1c, 0x14, 0xa5, 0xc7, 0x25, 0xd1, + 0xc6, 0x96, 0x6e, 0x46, 0xd1, 0xbc, 0x41, 0x5b, 0x4c, 0xc7, 0x1a, 0x2e, + 0x21, 0xc8, 0x9d, 0xc3, 0x11, 0xd9, 0x09, 0x25, 0xc6, 0x6e, 0xae, 0x34, + 0x72, 0x22, 0x94, 0xa5, 0x29, 0x4a, 0x52, 0x92, 0x49, 0x41, 0xe4, 0x7e, + 0x9d, 0xcd, 0xca, 0x4d, 0xf0, 0x26, 0x6a, 0xb1, 0x29, 0x27, 0x18, 0x9d, + 0xf4, 0x23, 0x6d, 0x5b, 0x7a, 0x54, 0xa3, 0xd0, 0xd8, 0xb3, 0xb9, 0xc1, + 0x30, 0xbb, 0x63, 0x9d, 0x16, 0x0f, 0xd1, 0xa7, 0x41, 0x3f, 0x46, 0x8d, + 0x6b, 0x09, 0x28, 0xd0, 0xfa, 0x48, 0x3e, 0x82, 0x47, 0x94, 0xf2, 0x7e, + 0x83, 0xef, 0x9f, 0xe9, 0x07, 0xff, 0x00, 0x12, 0x3b, 0xaf, 0xf1, 0x89, + 0x5b, 0x74, 0x8e, 0x59, 0xb0, 0xd9, 0x15, 0xd0, 0x5f, 0x57, 0x50, 0xe6, + 0xa8, 0x9b, 0x29, 0x4b, 0x8a, 0x5c, 0xdc, 0x37, 0x91, 0xa6, 0xa2, 0x48, + 0xd1, 0x12, 0x79, 0xff, 0x00, 0x2c, 0xf2, 0x7e, 0x58, 0xb6, 0x39, 0xaf, + 0x72, 0x22, 0x3b, 0x12, 0x35, 0x20, 0x72, 0x42, 0x96, 0x8b, 0x9e, 0x44, + 0xcc, 0x4a, 0xbd, 0x1d, 0xf1, 0x3d, 0x09, 0xab, 0x63, 0xd8, 0xf7, 0xc7, + 0x07, 0x3a, 0x79, 0xd1, 0x71, 0x51, 0xd4, 0x90, 0xea, 0x72, 0x4c, 0xa3, + 0x86, 0x3c, 0x3c, 0xf2, 0x7b, 0xe8, 0x5e, 0xb6, 0xd8, 0x6f, 0x43, 0xd9, + 0x4c, 0x59, 0xc1, 0xd5, 0x1a, 0x66, 0xd5, 0xb9, 0x79, 0x5f, 0xe6, 0x2d, + 0xc4, 0xfd, 0xb6, 0x39, 0x96, 0xfd, 0xcb, 0xf8, 0x10, 0xd5, 0x7b, 0x19, + 0xc7, 0x3a, 0x28, 0xd8, 0xd8, 0xd8, 0xc3, 0x0d, 0x4e, 0x39, 0x3a, 0x81, + 0xfd, 0xbf, 0x91, 0xff, 0x00, 0xda, 0x70, 0x89, 0x21, 0xbb, 0xfa, 0x2f, + 0xe0, 0x6e, 0xfe, 0xab, 0xf8, 0x1b, 0x7a, 0xc7, 0xca, 0x7f, 0x93, 0xcf, + 0xf9, 0x7e, 0x93, 0x57, 0xc0, 0xea, 0x3c, 0x88, 0x98, 0xfc, 0xc6, 0xcb, + 0x15, 0xe4, 0x49, 0x2e, 0x33, 0x3e, 0x87, 0x9d, 0x14, 0x5e, 0x92, 0x3a, + 0x0d, 0x97, 0x09, 0x5c, 0x89, 0x11, 0x04, 0x13, 0x91, 0xb6, 0x10, 0xd6, + 0x21, 0x33, 0x34, 0x6d, 0x8b, 0xa3, 0x93, 0x8d, 0x89, 0xea, 0xec, 0x4c, + 0xea, 0xde, 0xa6, 0x35, 0x4e, 0x1b, 0x7e, 0xc7, 0x9d, 0xff, 0x00, 0xb2, + 0x12, 0xb3, 0xba, 0xdd, 0x7f, 0x24, 0xa2, 0x4f, 0x05, 0x1b, 0x18, 0x63, + 0xb9, 0x1f, 0x22, 0x7b, 0xbe, 0xe7, 0x4b, 0x2f, 0xb7, 0xf2, 0x3e, 0xac, + 0x7f, 0x48, 0xd5, 0x1a, 0x98, 0x42, 0x27, 0xd0, 0x75, 0xf5, 0xd6, 0x66, + 0x3c, 0x0b, 0x12, 0x88, 0x25, 0xea, 0x26, 0x79, 0x2e, 0x51, 0xce, 0x8e, + 0x34, 0x2c, 0xed, 0xae, 0x0b, 0x4f, 0x08, 0x2d, 0x4c, 0x45, 0x28, 0x22, + 0x7e, 0x0e, 0xa9, 0x79, 0x5c, 0xfc, 0x1b, 0x80, 0xfe, 0xa6, 0xdd, 0x2f, + 0x73, 0x98, 0x9f, 0xd4, 0xb5, 0x50, 0xf9, 0x82, 0x11, 0x71, 0xc6, 0xb7, + 0xf4, 0xd2, 0xe3, 0x92, 0x13, 0x2a, 0x84, 0xbd, 0x66, 0x35, 0x95, 0x8e, + 0x07, 0x95, 0x98, 0x72, 0x71, 0xaa, 0x97, 0x7f, 0x4b, 0x67, 0xa4, 0xa5, + 0xee, 0x2f, 0xac, 0xda, 0xc4, 0xf0, 0xb5, 0x4f, 0xa3, 0xf1, 0x98, 0x4c, + 0xbc, 0x53, 0xa6, 0x10, 0xb8, 0xf5, 0xdb, 0x29, 0x71, 0xc9, 0xd7, 0xd3, + 0xdb, 0x1c, 0x17, 0x13, 0x47, 0x18, 0x5a, 0x7b, 0x7d, 0x16, 0xf2, 0xc2, + 0xfa, 0x8a, 0x8a, 0x8e, 0xc0, 0xdd, 0x16, 0x39, 0x10, 0x85, 0xf4, 0x1c, + 0xeb, 0xe7, 0x53, 0x39, 0xcd, 0xc5, 0x28, 0x9f, 0x62, 0x9c, 0xe2, 0xa5, + 0x9a, 0xb1, 0x4e, 0xee, 0x36, 0x31, 0x4f, 0x4f, 0x39, 0x73, 0x47, 0x1e, + 0xb6, 0xfa, 0x66, 0x37, 0x3d, 0x0f, 0x43, 0x1b, 0xb9, 0x4e, 0x14, 0x50, + 0x84, 0x61, 0xcf, 0xd0, 0x3c, 0x1b, 0x86, 0xcc, 0xa3, 0x71, 0x88, 0x42, + 0xc2, 0xfa, 0x1e, 0x7d, 0x19, 0x87, 0xad, 0x6b, 0x64, 0x21, 0x08, 0x27, + 0x8d, 0x88, 0x4f, 0x5d, 0xad, 0x5b, 0x7a, 0x4b, 0x91, 0xee, 0xf5, 0xb1, + 0x8c, 0xa5, 0xcd, 0x1b, 0xc2, 0x17, 0xd0, 0x9e, 0x68, 0xb0, 0x85, 0xa9, + 0x13, 0x47, 0x22, 0xfa, 0xb8, 0x75, 0x16, 0x21, 0x08, 0x20, 0x90, 0xd1, + 0x09, 0x48, 0xf3, 0xed, 0xa2, 0x2d, 0x0b, 0x0b, 0x0b, 0x33, 0x44, 0x26, + 0x66, 0xb8, 0x2e, 0x7d, 0x17, 0xb6, 0x78, 0x29, 0x72, 0xbe, 0x8a, 0xfa, + 0x66, 0x50, 0xbd, 0x79, 0x8d, 0x88, 0x42, 0x61, 0x08, 0x42, 0x13, 0xd0, + 0x84, 0x20, 0xb3, 0x35, 0x21, 0xac, 0xbd, 0x17, 0x4e, 0xe5, 0xca, 0xee, + 0x5d, 0x10, 0x94, 0xa2, 0xdf, 0x4c, 0x85, 0xc2, 0xd9, 0x45, 0x97, 0xd8, + 0xa2, 0x4d, 0x08, 0xeb, 0xa9, 0xe1, 0x8f, 0x6c, 0x32, 0x6a, 0x4f, 0x5d, + 0xfc, 0x21, 0xf7, 0x18, 0x91, 0x31, 0x32, 0x85, 0x85, 0xe9, 0xb5, 0x39, + 0x36, 0x2b, 0x21, 0xbd, 0x85, 0x38, 0x15, 0x7a, 0x1e, 0x23, 0xd8, 0x57, + 0x6c, 0x1b, 0xf9, 0x47, 0x71, 0x1e, 0xc2, 0xbd, 0x4a, 0x75, 0x1b, 0x74, + 0x63, 0x17, 0x41, 0xac, 0x4d, 0x14, 0xb8, 0xa5, 0xca, 0xd0, 0x95, 0x1b, + 0x24, 0x34, 0x35, 0x8a, 0x4c, 0x4d, 0x33, 0x2b, 0xc9, 0xcc, 0x4f, 0xd8, + 0xe0, 0x9b, 0xe0, 0xf3, 0x0d, 0xf1, 0xeb, 0xec, 0x29, 0xd8, 0xd9, 0xd3, + 0x35, 0xe4, 0x2b, 0xd1, 0x5f, 0x46, 0x79, 0x0a, 0x47, 0xb0, 0xad, 0xd0, + 0xe5, 0x24, 0x31, 0xa2, 0x37, 0x76, 0x35, 0x6f, 0x06, 0x9a, 0x2e, 0xa7, + 0x8d, 0xf8, 0x19, 0xe5, 0xa4, 0x26, 0x5f, 0xd0, 0xe3, 0x07, 0x0c, 0xd0, + 0x87, 0xb7, 0xaf, 0xb5, 0x94, 0xdc, 0x4b, 0x30, 0x98, 0x48, 0x5e, 0x82, + 0x57, 0x81, 0x3f, 0xa1, 0xb3, 0x94, 0x20, 0x11, 0x17, 0x71, 0x0a, 0x7b, + 0x8e, 0x67, 0xa7, 0x09, 0x06, 0x88, 0xdc, 0xe4, 0x48, 0x21, 0x8f, 0xb5, + 0x88, 0xd7, 0x38, 0xa5, 0xc7, 0x03, 0xb8, 0xe7, 0xec, 0x32, 0x9b, 0x3d, + 0xf6, 0x12, 0x38, 0xd7, 0xe4, 0x49, 0xe5, 0xdf, 0xb2, 0x12, 0x71, 0x33, + 0x7e, 0x5c, 0x1d, 0x22, 0x45, 0xee, 0xc8, 0x70, 0xbe, 0x03, 0x9e, 0x11, + 0x7b, 0x22, 0x06, 0xff, 0x00, 0x81, 0x87, 0x27, 0xf8, 0x21, 0x5f, 0x29, + 0xbe, 0xc3, 0x79, 0x4f, 0xc0, 0xce, 0xe4, 0xfe, 0xe3, 0xe4, 0x20, 0x7b, + 0x76, 0x7d, 0xd0, 0xdf, 0xc6, 0xfe, 0xe7, 0x3a, 0xff, 0x00, 0x6d, 0xff, + 0x00, 0x41, 0xb2, 0x7b, 0xe2, 0x61, 0x2b, 0xb2, 0x25, 0x6c, 0x3f, 0x22, + 0x0d, 0xad, 0xf7, 0x7b, 0x89, 0x12, 0x8b, 0x0c, 0x69, 0x35, 0x18, 0xfb, + 0x95, 0xf8, 0x24, 0x6f, 0x42, 0x94, 0xe4, 0xa2, 0x62, 0x92, 0x97, 0x70, + 0xe5, 0xd9, 0xb4, 0x49, 0x8d, 0x6c, 0x5c, 0x03, 0xb5, 0x06, 0xfd, 0x54, + 0xe4, 0xd0, 0xf0, 0xf4, 0x96, 0xe7, 0x2b, 0x21, 0x07, 0x82, 0xde, 0x44, + 0xa5, 0x85, 0x1c, 0xfd, 0x29, 0x0b, 0xab, 0x3c, 0xd4, 0xfd, 0x8d, 0x95, + 0x21, 0xc8, 0x42, 0xd5, 0x09, 0x89, 0xf2, 0xd0, 0xb8, 0x4f, 0x09, 0x37, + 0xc1, 0x4b, 0x94, 0x12, 0x5f, 0x22, 0x4f, 0xa4, 0x11, 0xf9, 0x64, 0x2d, + 0xd9, 0x45, 0xb2, 0x10, 0x9c, 0x25, 0x34, 0x8a, 0x69, 0x43, 0x62, 0x59, + 0x7a, 0x61, 0x31, 0x44, 0x6c, 0x47, 0x56, 0x2b, 0xcf, 0x31, 0xb8, 0xb5, + 0xa8, 0xdc, 0x6a, 0xfa, 0x0d, 0x97, 0x02, 0xbb, 0x22, 0xf3, 0xb0, 0xaf, + 0x5f, 0xc2, 0x5f, 0xb9, 0xc1, 0xdf, 0x7d, 0xc4, 0x32, 0x1e, 0xca, 0x08, + 0x6e, 0xcb, 0xee, 0xce, 0xca, 0x48, 0x6d, 0xe4, 0x37, 0x5d, 0x22, 0xeb, + 0x85, 0x4b, 0xa1, 0x54, 0xdc, 0xa9, 0x95, 0x10, 0xc4, 0x66, 0x68, 0xae, + 0xd0, 0xf7, 0x5b, 0x0a, 0xae, 0xa5, 0x7b, 0x9c, 0x2b, 0x68, 0xae, 0xca, + 0x9f, 0xba, 0x3b, 0x07, 0xd8, 0xe8, 0xaf, 0xbe, 0xc3, 0x19, 0x54, 0x52, + 0x9d, 0xd0, 0xb3, 0x46, 0xcb, 0x85, 0x31, 0xb9, 0x5e, 0xa5, 0x13, 0xb6, + 0x3c, 0x96, 0xd8, 0x5c, 0x26, 0xd7, 0x1b, 0x1d, 0x5a, 0x8c, 0x6f, 0x61, + 0x7b, 0x94, 0xdc, 0x21, 0x30, 0xc7, 0x91, 0x30, 0x85, 0xdb, 0xd1, 0x6b, + 0xcd, 0x04, 0xa0, 0xb9, 0x1a, 0xf6, 0x1d, 0xee, 0xef, 0x74, 0x98, 0xfb, + 0x1f, 0xd3, 0xf4, 0x2f, 0x41, 0xaf, 0xbf, 0xf2, 0x53, 0x88, 0xf7, 0x5f, + 0xc5, 0x2d, 0xd0, 0xfd, 0x98, 0xf6, 0x8d, 0x09, 0x67, 0x61, 0x72, 0x6f, + 0xcc, 0x2c, 0x70, 0xcc, 0xec, 0x0f, 0x63, 0xb2, 0x85, 0xe2, 0x5f, 0x44, + 0x39, 0x29, 0x28, 0x93, 0x6e, 0x06, 0x72, 0x5e, 0xc7, 0x49, 0xce, 0x49, + 0x66, 0xfa, 0x2d, 0xbb, 0x57, 0x36, 0x39, 0x20, 0x90, 0x92, 0xa2, 0x94, + 0xfb, 0xa4, 0x25, 0xac, 0x25, 0x63, 0x11, 0xb4, 0x63, 0xa2, 0x6d, 0xb8, + 0x35, 0xb8, 0xd0, 0xb9, 0x39, 0x1a, 0x42, 0x54, 0x69, 0x0d, 0x2e, 0x83, + 0x7c, 0x08, 0xf6, 0x54, 0x7d, 0xcd, 0xc5, 0x4a, 0xf1, 0xc0, 0xb7, 0x63, + 0xf3, 0x96, 0x2e, 0x21, 0x31, 0x04, 0xa9, 0xf5, 0x20, 0xfb, 0xd0, 0xc7, + 0xa2, 0x94, 0x4d, 0x75, 0x1a, 0xc8, 0x1a, 0xa6, 0xe3, 0x7d, 0xbd, 0x00, + 0x5c, 0x75, 0x17, 0x32, 0xbd, 0xcf, 0xf8, 0xdc, 0x48, 0x4a, 0x7e, 0xcb, + 0xf7, 0x6d, 0x7e, 0x83, 0xea, 0x1f, 0x77, 0xfc, 0x4f, 0xd4, 0xe5, 0x52, + 0xff, 0x00, 0x7d, 0xfd, 0x04, 0x6f, 0xa8, 0xf7, 0xd9, 0x9b, 0x37, 0x8f, + 0x81, 0xee, 0x26, 0x5f, 0xf5, 0x91, 0x38, 0xfd, 0xc6, 0xde, 0x4f, 0xb8, + 0x49, 0xae, 0xa2, 0x61, 0x35, 0xb3, 0x37, 0x70, 0x4f, 0xfd, 0xe0, 0x8d, + 0xd2, 0x0d, 0x81, 0x02, 0xf7, 0x10, 0x85, 0x8d, 0x8b, 0xa1, 0xd9, 0x8c, + 0xf7, 0x09, 0x12, 0x0e, 0x89, 0xa6, 0x4c, 0x8f, 0x5b, 0x5e, 0xe2, 0xd1, + 0xb9, 0xe8, 0x58, 0xe6, 0x20, 0xb0, 0xc6, 0x12, 0x6f, 0x48, 0xc6, 0xad, + 0x93, 0xee, 0x84, 0x54, 0x62, 0x9d, 0x0e, 0xfb, 0x48, 0x6a, 0xe5, 0x08, + 0x8e, 0x36, 0xcd, 0xbd, 0xd8, 0xfb, 0x81, 0x7f, 0xde, 0x2b, 0x7f, 0x73, + 0xfd, 0xd9, 0x5e, 0x43, 0x2e, 0xcd, 0x31, 0xb7, 0xdb, 0x72, 0xfc, 0x08, + 0x7c, 0x20, 0xd0, 0xb4, 0x49, 0x14, 0x25, 0x5e, 0x7f, 0x29, 0x7e, 0xba, + 0xd1, 0x6f, 0x6c, 0x86, 0xc5, 0x45, 0x43, 0x7e, 0x87, 0x26, 0x8b, 0x4f, + 0x61, 0xb3, 0xa0, 0xb8, 0xd5, 0x58, 0xfb, 0xf2, 0xc7, 0xa0, 0x3a, 0xe3, + 0x6c, 0x26, 0xb9, 0x48, 0x70, 0x57, 0xc0, 0xef, 0x04, 0x7d, 0x49, 0xa4, + 0x21, 0x46, 0xca, 0x52, 0xe2, 0xfa, 0x0e, 0xc1, 0x08, 0x58, 0x6d, 0xba, + 0x25, 0x02, 0x66, 0xb8, 0xfc, 0xc1, 0xa7, 0x56, 0xbf, 0x2c, 0x4f, 0x0f, + 0xc0, 0x61, 0x38, 0xef, 0xd8, 0x7d, 0x90, 0xde, 0xfa, 0xe9, 0x72, 0xde, + 0xc3, 0xd5, 0xc9, 0x8c, 0x58, 0x63, 0x4c, 0x4c, 0xc9, 0x5c, 0x93, 0x71, + 0xe0, 0xd0, 0xe9, 0xc4, 0x64, 0x83, 0x44, 0xd8, 0x8a, 0x6c, 0x42, 0x21, + 0x0d, 0xc1, 0x6b, 0xac, 0x68, 0x87, 0x02, 0x11, 0x1c, 0xd8, 0x91, 0x09, + 0x61, 0xa3, 0xfc, 0xaf, 0xd7, 0x4b, 0xca, 0xdf, 0x6d, 0xfe, 0x83, 0xd0, + 0xde, 0x8a, 0x52, 0xe3, 0x8c, 0x4d, 0xea, 0xc2, 0x1a, 0x38, 0x0e, 0x75, + 0xe1, 0xfe, 0x06, 0x4d, 0xec, 0x9a, 0xb9, 0xfd, 0xb2, 0xc7, 0x91, 0x0e, + 0x74, 0xf1, 0x1c, 0x62, 0x94, 0xa5, 0xc9, 0x46, 0xe9, 0x4b, 0x9a, 0x5c, + 0x22, 0xe1, 0x68, 0xe3, 0xf7, 0x61, 0x67, 0x8b, 0x43, 0xd1, 0xd1, 0x8d, + 0x46, 0xf5, 0x1f, 0x70, 0xc5, 0xa7, 0xa8, 0x62, 0xc3, 0x44, 0xc7, 0x73, + 0x1a, 0x37, 0x31, 0xb7, 0x01, 0x1b, 0x96, 0x6e, 0xf2, 0x3f, 0x28, 0x9d, + 0x02, 0xdb, 0xa1, 0x49, 0xec, 0x2b, 0xb6, 0x1d, 0xcc, 0x85, 0x0c, 0x4a, + 0x95, 0xe8, 0x29, 0xec, 0x21, 0x04, 0x3d, 0xd0, 0xa8, 0x84, 0x36, 0x7b, + 0xab, 0xf5, 0xca, 0xc3, 0xc2, 0x16, 0xab, 0xc3, 0xc3, 0xc4, 0xf4, 0xb7, + 0xc1, 0x7a, 0x1c, 0xa2, 0xcb, 0x1e, 0x47, 0xc9, 0x71, 0x4a, 0x52, 0x96, + 0x14, 0xb0, 0xa5, 0x2e, 0xb5, 0x95, 0xce, 0x87, 0xdd, 0x3d, 0xff, 0x00, + 0x61, 0x68, 0x72, 0x16, 0x5e, 0x8e, 0x8c, 0xe8, 0xf4, 0x3f, 0x43, 0x90, + 0x7c, 0xea, 0xea, 0x18, 0xb4, 0x2c, 0x33, 0x6c, 0x3d, 0xdd, 0x42, 0x6d, + 0xbe, 0x4d, 0x83, 0x56, 0x74, 0x5e, 0x39, 0x53, 0xa0, 0xb8, 0xa8, 0xd1, + 0xba, 0x31, 0xe7, 0x42, 0x10, 0x84, 0x22, 0x72, 0xac, 0x49, 0xc1, 0xe3, + 0x91, 0xe5, 0x0b, 0x43, 0xca, 0xd6, 0x42, 0x6f, 0xa6, 0x7a, 0x30, 0x8d, + 0xb6, 0xf6, 0x16, 0xbe, 0x61, 0x61, 0x8c, 0x79, 0x39, 0x32, 0xf4, 0x3d, + 0x0f, 0xd7, 0x70, 0x59, 0x31, 0x0b, 0x8c, 0xbd, 0x1e, 0x05, 0x66, 0x2f, + 0xa4, 0xfb, 0xc7, 0x84, 0x2c, 0xf1, 0x63, 0x16, 0x52, 0x12, 0xc3, 0xe0, + 0x43, 0x39, 0x1b, 0xb2, 0xed, 0x6e, 0x3a, 0xe8, 0x50, 0x95, 0xc0, 0x97, + 0x63, 0x1d, 0xa5, 0x8e, 0x74, 0x26, 0xf4, 0x99, 0xe4, 0xd8, 0xa8, 0x83, + 0xc6, 0xc5, 0xf7, 0x17, 0x19, 0x79, 0x42, 0x84, 0x8e, 0xb1, 0xc9, 0x20, + 0xf3, 0x73, 0x46, 0xce, 0x63, 0x9b, 0x1d, 0x0e, 0x0b, 0x5f, 0x30, 0x86, + 0x31, 0x8f, 0x27, 0x37, 0xd5, 0x7e, 0x00, 0xb2, 0x62, 0xe4, 0xe0, 0xcb, + 0xd0, 0xba, 0x21, 0x75, 0xfa, 0x37, 0x83, 0x18, 0xb4, 0x24, 0x37, 0x5e, + 0xc4, 0x21, 0x8d, 0x35, 0x81, 0xbb, 0xd9, 0x21, 0x63, 0xef, 0xfb, 0x69, + 0x78, 0xac, 0x48, 0x48, 0x43, 0x62, 0x09, 0x0d, 0x76, 0x46, 0xc4, 0x84, + 0xe2, 0x90, 0xe0, 0x17, 0x19, 0x7a, 0x1f, 0x02, 0x44, 0xf9, 0x64, 0x38, + 0x1b, 0x12, 0x1e, 0x98, 0x48, 0x6f, 0x6f, 0x22, 0xe3, 0xd0, 0xe7, 0x10, + 0xc6, 0x31, 0xe4, 0xe4, 0xfa, 0x3f, 0x7d, 0x1d, 0x33, 0xc1, 0xec, 0x21, + 0x65, 0x72, 0x71, 0x65, 0xe8, 0x45, 0x3b, 0xa5, 0xd4, 0xb5, 0x3e, 0xb7, + 0x17, 0x85, 0x88, 0x24, 0x71, 0x5d, 0x46, 0x3c, 0x1a, 0x29, 0x09, 0x39, + 0x09, 0x54, 0xb5, 0xe4, 0x6f, 0xf6, 0xd2, 0x8d, 0xd5, 0xde, 0x09, 0x41, + 0xec, 0x35, 0x11, 0x54, 0x6c, 0x6d, 0x24, 0x70, 0x02, 0x50, 0x9a, 0x14, + 0x33, 0x82, 0x16, 0x1e, 0x87, 0xc0, 0xb3, 0xdf, 0x78, 0x64, 0x83, 0x21, + 0x74, 0x2c, 0x73, 0x67, 0x2a, 0x74, 0x17, 0x1e, 0x87, 0x38, 0x86, 0x31, + 0x8f, 0x27, 0x3e, 0x99, 0xf4, 0x4b, 0x2f, 0x7e, 0xc1, 0x72, 0x2c, 0x31, + 0x1c, 0x3e, 0xd9, 0x7a, 0x12, 0xa7, 0xfb, 0xa1, 0xba, 0xf9, 0x1f, 0xe5, + 0xaf, 0x5c, 0x5a, 0x17, 0x71, 0x04, 0x2c, 0x22, 0x38, 0x8e, 0x7b, 0x39, + 0x42, 0xdd, 0x0f, 0x7c, 0x20, 0xea, 0x1f, 0xee, 0x7f, 0xad, 0x56, 0xd3, + 0x78, 0x14, 0x1a, 0x31, 0xa1, 0xb8, 0xdc, 0x40, 0x62, 0x8f, 0x1b, 0x56, + 0x8c, 0xde, 0x82, 0xd4, 0xc4, 0x9e, 0xee, 0x26, 0x20, 0x8d, 0x89, 0x8b, + 0x97, 0xdd, 0xac, 0x7a, 0x31, 0x71, 0xe8, 0x72, 0x88, 0x63, 0x18, 0xf2, + 0x73, 0xfd, 0x3a, 0xcb, 0xee, 0x16, 0xec, 0x58, 0x78, 0xe3, 0xf6, 0xcb, + 0xc7, 0x5c, 0x70, 0x8e, 0x7b, 0xbd, 0x4e, 0x08, 0xeb, 0xab, 0x9c, 0x5c, + 0xe1, 0x68, 0x62, 0x65, 0x8c, 0xa5, 0x29, 0xb1, 0x7b, 0x7f, 0x7c, 0xa5, + 0x5c, 0x1a, 0x8e, 0x3c, 0x35, 0x78, 0x8d, 0x8d, 0x8a, 0x53, 0xc0, 0x5b, + 0xf2, 0x45, 0xab, 0x81, 0xa8, 0x37, 0xb9, 0xc3, 0xed, 0xe8, 0x24, 0xff, + 0x00, 0x3d, 0x34, 0xf5, 0x1e, 0x1e, 0x84, 0x0d, 0xb9, 0xd0, 0x5e, 0x87, + 0x28, 0x86, 0x3d, 0x27, 0x2f, 0xa5, 0x3e, 0x83, 0x9f, 0xec, 0x28, 0xb4, + 0x71, 0x65, 0x91, 0x77, 0x1e, 0x39, 0x9b, 0x13, 0x1e, 0x7d, 0x2e, 0x08, + 0x5a, 0xb9, 0xc5, 0xa5, 0x0c, 0x4c, 0xe4, 0xa3, 0x78, 0xe6, 0xde, 0x32, + 0x9c, 0x1a, 0xb6, 0xf0, 0xd3, 0xef, 0x96, 0x14, 0xb9, 0x42, 0x18, 0x63, + 0x37, 0x3b, 0xc2, 0xd4, 0xf0, 0xb3, 0xec, 0x6a, 0x84, 0x21, 0x34, 0x1c, + 0xde, 0x17, 0x1e, 0x87, 0x27, 0xb0, 0x86, 0x75, 0xc3, 0x1e, 0x1c, 0xbe, + 0x9b, 0xf5, 0x56, 0x39, 0xc5, 0xd3, 0xc1, 0x96, 0x27, 0x0a, 0x53, 0x91, + 0x64, 0x0b, 0x1b, 0x17, 0xd1, 0xe8, 0x16, 0xb5, 0x61, 0x68, 0x78, 0xa5, + 0xcf, 0x25, 0x3b, 0x2c, 0xfe, 0xfc, 0xb7, 0xf9, 0xcb, 0x72, 0xb2, 0x98, + 0x98, 0x9d, 0x42, 0x6e, 0x7e, 0x0a, 0xd2, 0xce, 0x70, 0xd7, 0xec, 0x7e, + 0x83, 0xd2, 0xf2, 0xf3, 0xb1, 0xb3, 0x9e, 0x17, 0xa1, 0xfa, 0x02, 0xc1, + 0xe1, 0x8f, 0x1e, 0x5d, 0x57, 0xe8, 0x96, 0x39, 0x7e, 0xda, 0x9c, 0x1a, + 0x16, 0x79, 0x7d, 0x8d, 0xa3, 0x6b, 0x4d, 0x8d, 0x65, 0x6b, 0xe8, 0x10, + 0xb5, 0x2b, 0x4d, 0x1b, 0x1b, 0x16, 0x6b, 0x1a, 0xa6, 0x57, 0x2c, 0xf5, + 0xb0, 0x99, 0x4b, 0x94, 0x21, 0x3c, 0x37, 0x7b, 0x6b, 0xf4, 0xca, 0xc3, + 0x79, 0x7b, 0xf6, 0xbf, 0x4d, 0x4f, 0x4a, 0x43, 0x46, 0x1c, 0xde, 0x17, + 0xa1, 0xfa, 0x42, 0xe3, 0x07, 0x97, 0xf5, 0x7d, 0x1f, 0xed, 0xec, 0x2c, + 0xac, 0x70, 0x65, 0x9d, 0x33, 0xc9, 0xfb, 0x3c, 0x7b, 0xa8, 0x5b, 0xeb, + 0x59, 0xe9, 0x10, 0xb2, 0xb2, 0xac, 0x23, 0xa6, 0x95, 0x8b, 0x8f, 0xf1, + 0xf7, 0xd5, 0x6e, 0x3e, 0x71, 0x73, 0x70, 0x84, 0x26, 0x3e, 0xe3, 0x5f, + 0x65, 0x1c, 0x61, 0x0f, 0x3c, 0x18, 0xf7, 0x46, 0xc6, 0x6c, 0xc9, 0xa3, + 0x84, 0x2d, 0x9c, 0xe5, 0x85, 0xc7, 0xa3, 0xae, 0x06, 0x3c, 0x31, 0xbf, + 0xac, 0x7f, 0xe5, 0xed, 0xe8, 0x89, 0x70, 0x84, 0x2d, 0x7c, 0x21, 0x63, + 0xa1, 0xea, 0x87, 0x0c, 0x7b, 0xab, 0xe8, 0xf4, 0x8b, 0x42, 0xca, 0xb5, + 0xf5, 0xd2, 0xd6, 0x3c, 0xae, 0x1a, 0xcb, 0xec, 0x09, 0xdc, 0xac, 0xad, + 0x0d, 0x7d, 0xbd, 0x6f, 0x81, 0xeb, 0xfc, 0xb1, 0xe5, 0x8c, 0x6a, 0xe7, + 0x9c, 0x35, 0x47, 0xb7, 0xb8, 0xe5, 0x8e, 0x9e, 0x8b, 0xd0, 0x79, 0x63, + 0xf4, 0xdb, 0xf4, 0xd6, 0xae, 0x66, 0x2e, 0x2e, 0x99, 0xc0, 0x42, 0x48, + 0x81, 0x23, 0x35, 0xdd, 0x14, 0x51, 0xd2, 0x50, 0x58, 0x13, 0x27, 0xa1, + 0xcd, 0x0b, 0x42, 0xce, 0xb5, 0xbe, 0x47, 0x97, 0xc3, 0x2f, 0x48, 0x53, + 0xc0, 0x6c, 0xf1, 0x3b, 0x8d, 0x36, 0x16, 0xda, 0x50, 0xb6, 0x16, 0x11, + 0xbf, 0x5a, 0xf8, 0x1e, 0xbf, 0xcb, 0xd0, 0xf0, 0xf6, 0xd8, 0xb8, 0x62, + 0x47, 0x1b, 0x9c, 0x12, 0x1a, 0xdc, 0x6a, 0x1d, 0x3d, 0x0e, 0x31, 0xf0, + 0x3c, 0xd1, 0x8f, 0xd1, 0x66, 0x6f, 0xae, 0xf8, 0x2e, 0x50, 0xa1, 0x30, + 0x9c, 0x6e, 0x27, 0xb1, 0x4d, 0xec, 0x8d, 0xdb, 0x85, 0xf2, 0x37, 0x6c, + 0x6b, 0x64, 0xce, 0x42, 0x71, 0x85, 0xba, 0xf4, 0x39, 0x21, 0x6b, 0xd6, + 0x3a, 0xe8, 0x63, 0xe0, 0x78, 0xac, 0xea, 0x25, 0xbe, 0x8a, 0x84, 0x26, + 0x3d, 0x8b, 0xa1, 0x0b, 0x28, 0xdf, 0xf7, 0x7f, 0x5c, 0x43, 0x8d, 0x0c, + 0xdc, 0xcc, 0x78, 0x78, 0x83, 0xd2, 0x99, 0xa0, 0x8d, 0xee, 0x6e, 0xdb, + 0xec, 0x24, 0x6d, 0x2c, 0x36, 0xc2, 0x3f, 0x43, 0x62, 0x8d, 0xec, 0x36, + 0x31, 0xec, 0x51, 0xb1, 0xbf, 0xfc, 0x06, 0x21, 0x4a, 0xcc, 0xdf, 0xc2, + 0x2b, 0x95, 0x89, 0xc8, 0x25, 0xe0, 0x48, 0xdc, 0x90, 0x37, 0xb4, 0x10, + 0xa2, 0x41, 0xa8, 0x79, 0x39, 0x1e, 0x94, 0x73, 0x42, 0xc2, 0xf4, 0xd7, + 0x8b, 0x39, 0x1b, 0x29, 0xb7, 0x64, 0x52, 0x29, 0x4b, 0x8b, 0x0a, 0x26, + 0x9f, 0xbe, 0x13, 0xb8, 0x53, 0x0b, 0x28, 0x7b, 0xf7, 0x35, 0xbe, 0x04, + 0xdd, 0xe8, 0x62, 0x1b, 0xdc, 0x6f, 0x44, 0xdb, 0x64, 0xfe, 0x06, 0xd6, + 0xc1, 0xdd, 0xc1, 0xb5, 0xa5, 0xed, 0xff, 0x00, 0x06, 0x6b, 0x6a, 0x8d, + 0xbe, 0x54, 0x7d, 0x26, 0x36, 0xe9, 0xb8, 0xdd, 0x72, 0x45, 0x9e, 0x03, + 0x82, 0x29, 0x46, 0xca, 0xfd, 0x77, 0xce, 0x5f, 0x55, 0xb5, 0x0a, 0xac, + 0x27, 0x51, 0xaa, 0x9d, 0x31, 0x33, 0x37, 0xa3, 0x44, 0x63, 0xb4, 0xf7, + 0x25, 0xbf, 0x46, 0x71, 0x8b, 0x4e, 0x34, 0xb6, 0xc1, 0x69, 0x5a, 0x5b, + 0x8a, 0x52, 0x8d, 0xae, 0xa3, 0x65, 0xd5, 0x34, 0x26, 0x45, 0x57, 0x61, + 0x32, 0x8b, 0x71, 0x61, 0x3c, 0x35, 0xfb, 0xde, 0xb6, 0x8d, 0x8f, 0xef, + 0x87, 0xb8, 0xf6, 0xc5, 0x1b, 0xd3, 0xbd, 0x1a, 0xdc, 0xdf, 0x0f, 0x86, + 0x1a, 0x3f, 0x91, 0x84, 0xae, 0xa3, 0x6a, 0x93, 0x54, 0x6c, 0xe9, 0x8e, + 0x23, 0x80, 0xd8, 0xde, 0x1e, 0x1f, 0xa4, 0x52, 0x3b, 0x8d, 0x5c, 0xb1, + 0x8b, 0x1b, 0xec, 0x73, 0x82, 0xe8, 0x7a, 0xdb, 0x50, 0xc4, 0x8e, 0x0e, + 0x55, 0x05, 0xc4, 0x65, 0xc5, 0x12, 0x70, 0x65, 0x4b, 0x91, 0x35, 0x6a, + 0x1c, 0xc8, 0xa3, 0x4d, 0x38, 0xf2, 0xb7, 0x1c, 0x10, 0x99, 0xd6, 0x94, + 0x71, 0xe2, 0xe2, 0x94, 0x78, 0x2b, 0xf5, 0xa1, 0xb8, 0x99, 0x09, 0x44, + 0xee, 0x28, 0x86, 0xdd, 0xef, 0xfc, 0x13, 0x43, 0xc3, 0xe0, 0xe0, 0x79, + 0x67, 0x27, 0x03, 0x78, 0x6f, 0x0b, 0x08, 0x4a, 0x54, 0x3c, 0x4c, 0x3e, + 0x16, 0x19, 0x27, 0xbf, 0x04, 0x19, 0x08, 0xeb, 0x97, 0xd8, 0x70, 0x1e, + 0x96, 0x70, 0x6b, 0xbc, 0xc3, 0x8d, 0xc3, 0x6d, 0xf3, 0x97, 0x2d, 0x2d, + 0x84, 0xb5, 0x96, 0x38, 0xa7, 0x7d, 0xc5, 0x74, 0x9c, 0x58, 0xb7, 0xd1, + 0x0b, 0x4b, 0xed, 0x36, 0xf2, 0xc9, 0xb8, 0xd9, 0xc4, 0x70, 0xb0, 0x92, + 0x26, 0x37, 0x87, 0xcc, 0x0e, 0x2b, 0x0e, 0x44, 0x26, 0x28, 0xf3, 0x37, + 0x26, 0xc9, 0x89, 0xfc, 0x31, 0x34, 0xf8, 0x20, 0x9a, 0x0d, 0xae, 0xa5, + 0x45, 0x43, 0x6f, 0x16, 0x94, 0x71, 0xe5, 0xf7, 0x1b, 0x1b, 0x47, 0x5d, + 0x7f, 0x4f, 0x92, 0x81, 0x4f, 0xc7, 0x0f, 0xf8, 0xfc, 0x9c, 0x90, 0xbe, + 0xdb, 0x7c, 0x8d, 0x61, 0x25, 0x1b, 0x65, 0xf4, 0x19, 0xcd, 0x3f, 0xd8, + 0xe2, 0xff, 0x00, 0x63, 0xf8, 0xe7, 0x10, 0x8f, 0x4a, 0x26, 0x94, 0xe8, + 0x45, 0x23, 0x1e, 0xfb, 0xdf, 0xb2, 0xf4, 0x12, 0x2f, 0xcb, 0xc3, 0xc5, + 0xc4, 0xbc, 0x09, 0x9a, 0xa3, 0x92, 0x4e, 0x4e, 0x8e, 0x26, 0x13, 0x10, + 0xd9, 0x28, 0xdf, 0x63, 0x63, 0x1a, 0x6b, 0x15, 0x0f, 0xb4, 0x6d, 0x85, + 0xc0, 0x7a, 0x28, 0xce, 0x2d, 0x7b, 0x63, 0xa9, 0x09, 0x88, 0x24, 0x1b, + 0x65, 0x39, 0xb5, 0xc5, 0xcf, 0x2e, 0x87, 0x35, 0xb8, 0x9e, 0x01, 0x8e, + 0x5c, 0x13, 0x78, 0x41, 0x23, 0xe1, 0x94, 0xa3, 0x02, 0x62, 0x79, 0x6c, + 0x48, 0x19, 0xb0, 0xf9, 0x0c, 0x84, 0x13, 0x60, 0x89, 0x36, 0xc2, 0x4d, + 0xec, 0x8d, 0xb8, 0xd6, 0x95, 0xc3, 0x27, 0xd4, 0x58, 0x2b, 0xec, 0x35, + 0xa1, 0x6a, 0xe3, 0x26, 0x5d, 0x6e, 0xdc, 0x4a, 0xfa, 0x95, 0x44, 0x5f, + 0x61, 0x34, 0xec, 0xbb, 0xf9, 0x12, 0xb1, 0x59, 0xc4, 0xef, 0xec, 0x6f, + 0xe9, 0xbd, 0x8f, 0xf9, 0xa7, 0x11, 0xbf, 0x75, 0xfc, 0x41, 0x12, 0x52, + 0x9e, 0x59, 0xc0, 0x55, 0xde, 0x97, 0xe9, 0xc9, 0xfb, 0x52, 0x63, 0x52, + 0x73, 0x12, 0xe3, 0xfb, 0x38, 0x46, 0x5f, 0x76, 0x37, 0x71, 0xf2, 0x2f, + 0xe0, 0x43, 0x7d, 0xb5, 0xd2, 0xaa, 0xff, 0x00, 0x61, 0x1f, 0xd1, 0xfd, + 0x9c, 0xe3, 0x3f, 0x76, 0xff, 0x00, 0x68, 0x71, 0xdf, 0xc5, 0xfd, 0x47, + 0x38, 0x93, 0xe0, 0xdd, 0x07, 0xb6, 0xcb, 0x8f, 0xb1, 0x0e, 0x54, 0x7f, + 0x63, 0x8b, 0x7f, 0x81, 0x95, 0x5c, 0xfb, 0xb4, 0x3d, 0xdc, 0x88, 0x87, + 0x17, 0xce, 0x66, 0x96, 0x49, 0x79, 0x2a, 0x7d, 0x4d, 0xbb, 0x91, 0x13, + 0x04, 0x48, 0x81, 0xaa, 0x5b, 0x16, 0x0d, 0x63, 0x9f, 0xd8, 0xde, 0xda, + 0x3f, 0x27, 0x39, 0x9a, 0xff, 0x00, 0x6c, 0x5d, 0xbf, 0x04, 0x21, 0xb8, + 0x2e, 0xeb, 0x08, 0xe2, 0xe4, 0x82, 0x33, 0x9b, 0x47, 0x74, 0x35, 0x79, + 0x1f, 0x29, 0x1f, 0x9c, 0x70, 0x18, 0xf4, 0x33, 0x8b, 0x42, 0x67, 0xb2, + 0x47, 0x44, 0x82, 0xba, 0x85, 0x71, 0x07, 0xcd, 0xc7, 0x4c, 0xc1, 0x89, + 0x32, 0xf4, 0xd2, 0x94, 0x84, 0x9e, 0x19, 0x0e, 0xa2, 0xda, 0xb1, 0x31, + 0x31, 0x3c, 0x33, 0x81, 0xb6, 0x28, 0x90, 0xa2, 0x62, 0xdc, 0xb6, 0xe1, + 0xed, 0x0f, 0x68, 0xdf, 0xa9, 0xd4, 0x5a, 0x2e, 0x39, 0x65, 0x2a, 0x8d, + 0x8b, 0x6a, 0xdc, 0x4c, 0x79, 0xc0, 0x6c, 0xd4, 0xf6, 0x36, 0x85, 0x0f, + 0xc8, 0xbd, 0xd4, 0x48, 0x24, 0x11, 0x46, 0x44, 0x84, 0x14, 0xac, 0xdf, + 0xb9, 0xb9, 0xb9, 0xbf, 0x71, 0xa2, 0x6a, 0x7e, 0xe8, 0x5c, 0x01, 0x7d, + 0x88, 0x86, 0x84, 0xab, 0x45, 0x4c, 0x7d, 0x84, 0x97, 0x66, 0x24, 0xef, + 0x5e, 0x0f, 0x6f, 0xcd, 0x10, 0xa5, 0x13, 0x1a, 0xd7, 0x23, 0x84, 0x17, + 0x19, 0x8e, 0x58, 0xf8, 0x67, 0x16, 0xff, 0x00, 0xa1, 0xce, 0x45, 0xf7, + 0xfe, 0x0f, 0xe2, 0x88, 0xe4, 0xad, 0xfd, 0xc4, 0xd0, 0xbb, 0x77, 0xdf, + 0xf5, 0x2d, 0xb6, 0x7d, 0x47, 0xb4, 0xb2, 0xf3, 0xfe, 0x63, 0x5b, 0x1b, + 0xbe, 0x3f, 0xa1, 0x91, 0x72, 0xf0, 0xb6, 0x39, 0x37, 0xf8, 0xa2, 0x56, + 0xfc, 0x89, 0x9a, 0x54, 0xdf, 0x11, 0xee, 0x90, 0xdf, 0x60, 0x9a, 0x7b, + 0xac, 0x41, 0x2d, 0x4e, 0x1c, 0x07, 0xa6, 0x0e, 0x53, 0xa2, 0x4e, 0xac, + 0xea, 0x85, 0xd0, 0x09, 0x57, 0x04, 0x58, 0x85, 0x8e, 0x86, 0xe8, 0x6c, + 0xa2, 0x74, 0xe7, 0x91, 0xee, 0x35, 0x70, 0x68, 0x84, 0xf4, 0x14, 0xea, + 0x26, 0x23, 0x71, 0x3c, 0x42, 0x53, 0x0d, 0xc5, 0x28, 0x86, 0xac, 0xe1, + 0x9e, 0x6e, 0x1b, 0xf4, 0x96, 0xa7, 0xa1, 0x24, 0x1b, 0xae, 0xe1, 0x31, + 0x89, 0x9b, 0xab, 0x91, 0xca, 0xbb, 0x8e, 0xe6, 0x5c, 0x38, 0x20, 0x43, + 0x13, 0x29, 0x4a, 0xca, 0x52, 0xe8, 0x84, 0x18, 0x88, 0xec, 0x0d, 0x6c, + 0x31, 0xea, 0xe3, 0x96, 0xfd, 0x8e, 0x91, 0x7e, 0x10, 0xb8, 0x09, 0x15, + 0x69, 0x6e, 0x72, 0x74, 0x03, 0xd5, 0x89, 0xa6, 0x95, 0x0c, 0x54, 0xf7, + 0x13, 0x6f, 0x64, 0x2f, 0x15, 0x7f, 0xde, 0x7c, 0x8d, 0x83, 0xec, 0x1e, + 0x40, 0xc2, 0x92, 0xe1, 0x3d, 0xc7, 0x1e, 0x98, 0x4d, 0x89, 0x84, 0xc5, + 0x29, 0x4a, 0x33, 0x03, 0x8f, 0x31, 0xf7, 0xc2, 0x73, 0x92, 0xb4, 0x4b, + 0x67, 0xb9, 0x1d, 0x88, 0xea, 0x73, 0x83, 0x0f, 0x03, 0x47, 0x1a, 0x21, + 0x08, 0x6e, 0x2a, 0x34, 0xf6, 0x47, 0x04, 0xd0, 0x84, 0x52, 0x97, 0x1c, + 0x23, 0x10, 0xe5, 0x0c, 0xf2, 0x24, 0xe0, 0xc6, 0xe1, 0x75, 0x41, 0x8b, + 0x55, 0x18, 0xde, 0xb4, 0x40, 0x13, 0x29, 0x44, 0xeb, 0x86, 0x51, 0x29, + 0xcb, 0x10, 0x90, 0x84, 0x66, 0xfd, 0x8d, 0xfb, 0x11, 0xf6, 0x37, 0x1b, + 0xb1, 0xbf, 0x62, 0x09, 0x38, 0x8d, 0xb9, 0x68, 0xda, 0x18, 0xc7, 0xc0, + 0xc7, 0x96, 0x31, 0x09, 0xec, 0x51, 0xea, 0x43, 0x1b, 0xa8, 0x8e, 0x1d, + 0xa2, 0x42, 0xfa, 0xd0, 0xee, 0x21, 0x74, 0xd8, 0x86, 0x3c, 0x58, 0x21, + 0x68, 0xe4, 0x03, 0xad, 0x98, 0x8e, 0xc8, 0xd8, 0xa8, 0x5d, 0x78, 0xbd, + 0x10, 0x41, 0x08, 0x4d, 0x14, 0xa3, 0xdc, 0x68, 0x91, 0xf0, 0x22, 0x06, + 0xdd, 0x56, 0x88, 0x34, 0x73, 0x3c, 0x3e, 0x47, 0xbb, 0x83, 0x5c, 0x8e, + 0x81, 0x88, 0x72, 0x87, 0xda, 0x1b, 0x3e, 0x83, 0xe9, 0xa1, 0xf7, 0x1f, + 0x02, 0x6f, 0x50, 0x99, 0x83, 0x63, 0x90, 0x9f, 0x2c, 0xe9, 0x05, 0xb3, + 0x64, 0x5d, 0x3e, 0x05, 0xa5, 0x17, 0x2b, 0x92, 0x14, 0x84, 0x8a, 0x5c, + 0xe8, 0xa5, 0x29, 0x26, 0x2e, 0x2e, 0x28, 0xde, 0xfe, 0x8b, 0xac, 0xd3, + 0x34, 0xfe, 0xbb, 0x2f, 0xdc, 0x4c, 0xa5, 0x29, 0x4a, 0x58, 0x51, 0xb2, + 0xe1, 0xde, 0x50, 0xe3, 0x31, 0xd1, 0xed, 0xfd, 0x7c, 0x09, 0xa6, 0x41, + 0x62, 0x18, 0x65, 0x2e, 0x28, 0xb0, 0xb1, 0x34, 0x42, 0x0d, 0xa1, 0x15, + 0x42, 0x14, 0xf1, 0xd0, 0x7b, 0x86, 0xca, 0x5d, 0x0f, 0x27, 0x1c, 0x6b, + 0x36, 0x64, 0xdc, 0x9b, 0xa1, 0x48, 0x36, 0x52, 0x13, 0x31, 0x14, 0x14, + 0x6f, 0x46, 0xf9, 0xe3, 0xa5, 0xee, 0xce, 0xfd, 0xf6, 0xdc, 0xb0, 0xcc, + 0xd3, 0xf6, 0xfe, 0x44, 0x47, 0xbb, 0xa4, 0xd1, 0x6f, 0xc4, 0x4c, 0xc2, + 0x13, 0x5a, 0xd8, 0x16, 0x4f, 0x8d, 0x29, 0xe5, 0x0b, 0x08, 0x73, 0x86, + 0x2c, 0x37, 0x74, 0x18, 0x3f, 0x3c, 0x0f, 0xb4, 0x3e, 0xc1, 0x1e, 0x84, + 0xec, 0x27, 0x69, 0x5e, 0x98, 0x3b, 0x82, 0xee, 0x62, 0x32, 0x2f, 0x45, + 0xa2, 0x68, 0x5b, 0x9d, 0xee, 0x4b, 0xf2, 0x2c, 0xd2, 0xe5, 0x94, 0xb8, + 0x47, 0x69, 0xaf, 0x0f, 0xf6, 0x7e, 0x0a, 0x73, 0x7e, 0x8f, 0xe0, 0xd9, + 0xd1, 0x7e, 0x1f, 0xef, 0x81, 0x53, 0x69, 0x8e, 0x86, 0x18, 0xa5, 0x39, + 0xe0, 0x68, 0xc4, 0x10, 0x9a, 0x63, 0x4a, 0x53, 0x8c, 0x17, 0xdd, 0x1c, + 0xa2, 0x7d, 0xb7, 0xfd, 0x0e, 0x18, 0xd8, 0xc7, 0x47, 0xdd, 0xd3, 0x6a, + 0x72, 0xbc, 0x6c, 0x6f, 0x67, 0x44, 0xac, 0x5a, 0x99, 0xc5, 0x9a, 0x51, + 0x2d, 0xd8, 0x4e, 0x5d, 0xc3, 0x47, 0x02, 0xbe, 0xeb, 0x01, 0x09, 0x76, + 0x43, 0xe8, 0x20, 0xdd, 0xd0, 0x78, 0x03, 0x4f, 0x21, 0xa3, 0xa8, 0xd7, + 0xc2, 0x63, 0x4e, 0x81, 0xa2, 0x48, 0xe4, 0x77, 0xf7, 0x1b, 0x18, 0xf5, + 0x31, 0x36, 0xd5, 0x0a, 0x43, 0xeb, 0xd7, 0xd3, 0xb8, 0x36, 0x1d, 0xb5, + 0xc2, 0xd5, 0x75, 0x21, 0x20, 0xb2, 0xbd, 0x38, 0xec, 0x17, 0xa2, 0xd1, + 0xd2, 0xdd, 0xf1, 0x4e, 0xc5, 0xdb, 0xf1, 0xbe, 0x0b, 0x4d, 0x2e, 0xaa, + 0x48, 0xd7, 0xf6, 0xf6, 0x1c, 0xbf, 0x71, 0xfe, 0x45, 0x46, 0xc6, 0x21, + 0xfd, 0x57, 0xf0, 0x57, 0xfa, 0x22, 0xbf, 0xd5, 0x7f, 0x03, 0x6f, 0xfc, + 0x8c, 0xb6, 0xfd, 0x22, 0x4f, 0xf4, 0x5f, 0xc1, 0x2e, 0x8f, 0x84, 0x3e, + 0xc3, 0xe0, 0x7f, 0xf1, 0x21, 0xff, 0x00, 0xc6, 0x86, 0xff, 0x00, 0xf8, + 0xfe, 0x05, 0x91, 0xaf, 0xee, 0x5c, 0xd1, 0x84, 0x42, 0xe0, 0x86, 0x4d, + 0x4d, 0xba, 0x59, 0x83, 0x13, 0x83, 0xd8, 0xa5, 0x29, 0x7d, 0x04, 0x3d, + 0x86, 0x33, 0x6f, 0xd0, 0x84, 0x20, 0xc7, 0xd7, 0xa7, 0x51, 0x34, 0xd5, + 0x5a, 0xe6, 0x70, 0x78, 0x51, 0x3d, 0x15, 0x84, 0x21, 0x39, 0x0b, 0xd5, + 0xe2, 0x2e, 0x7d, 0x34, 0x5b, 0xd9, 0x9b, 0x3d, 0xd3, 0x65, 0x82, 0xf5, + 0x68, 0xe2, 0x46, 0x55, 0xdd, 0x76, 0xe9, 0xfd, 0x1b, 0x37, 0x32, 0x97, + 0x0a, 0x52, 0x97, 0x14, 0x6f, 0x4b, 0x37, 0x3d, 0x90, 0xa6, 0x06, 0x3d, + 0x4d, 0x97, 0x59, 0x4a, 0x5c, 0x34, 0x98, 0xd5, 0x6c, 0xf1, 0x71, 0x4b, + 0xaf, 0xb0, 0x0b, 0x5c, 0xd1, 0xc8, 0xc6, 0xa1, 0xfb, 0x07, 0xa0, 0x9b, + 0xb8, 0xac, 0x7c, 0x7a, 0x13, 0x52, 0x37, 0x5f, 0xaa, 0x4e, 0xc5, 0xc8, + 0xdd, 0xc2, 0xf4, 0x50, 0xdc, 0x30, 0x8a, 0x17, 0x2f, 0x77, 0xf7, 0x16, + 0xd8, 0x45, 0xc4, 0x9a, 0xd6, 0x50, 0x99, 0xb8, 0x72, 0x2e, 0x6d, 0xbb, + 0x75, 0xfe, 0xc7, 0x30, 0x8c, 0xa5, 0xcd, 0x2e, 0x96, 0x34, 0x42, 0x37, + 0x1e, 0x07, 0x89, 0x98, 0x31, 0x96, 0x18, 0xf7, 0xfa, 0x06, 0x6c, 0x4b, + 0x96, 0x3f, 0x55, 0x8a, 0xae, 0x04, 0x2f, 0x5b, 0x4b, 0x69, 0x2a, 0xc9, + 0x7e, 0xa8, 0xc6, 0xad, 0xbe, 0x95, 0x95, 0xa5, 0x08, 0x47, 0xdd, 0x7d, + 0x36, 0xd2, 0xdd, 0x94, 0xdb, 0xd6, 0x34, 0x62, 0x69, 0x2a, 0x19, 0x07, + 0x6e, 0x5f, 0xb1, 0x25, 0x05, 0xf4, 0x14, 0xa7, 0x22, 0x19, 0xb9, 0xdf, + 0xa9, 0x79, 0xb1, 0xdb, 0xa8, 0xe2, 0x84, 0xfc, 0xeb, 0x49, 0xb7, 0x11, + 0xba, 0x6c, 0x17, 0x06, 0xca, 0x5c, 0xa2, 0x65, 0x9b, 0x09, 0x7d, 0x0a, + 0x58, 0x0e, 0xf5, 0xa1, 0x8d, 0x1c, 0x0c, 0xeb, 0x10, 0x86, 0x9b, 0x63, + 0x66, 0xe5, 0x8c, 0xb7, 0x6d, 0xd8, 0x98, 0x98, 0x84, 0x26, 0xab, 0x94, + 0x27, 0xb6, 0xe2, 0x86, 0x98, 0xb5, 0x35, 0xe8, 0xa5, 0x77, 0x1d, 0xf4, + 0x19, 0x3a, 0x36, 0xeb, 0xfc, 0x6c, 0x21, 0x7d, 0x15, 0x13, 0x39, 0x26, + 0x93, 0x46, 0xf2, 0xf5, 0xf8, 0x37, 0x99, 0x41, 0xf4, 0x62, 0x21, 0xc4, + 0xa3, 0xae, 0xe2, 0xed, 0x85, 0x1e, 0x66, 0x97, 0x86, 0x5a, 0x7e, 0x81, + 0xb4, 0x95, 0x63, 0xde, 0x2e, 0x07, 0xeb, 0xef, 0x88, 0x3a, 0xae, 0x2e, + 0x8b, 0x63, 0x91, 0x62, 0x0f, 0x54, 0xca, 0x44, 0xd1, 0x46, 0xca, 0xab, + 0xd6, 0xd1, 0x2a, 0xf0, 0x9b, 0x36, 0xff, 0x00, 0x43, 0xb6, 0x1f, 0xb8, + 0xc4, 0x8b, 0x61, 0x7d, 0x12, 0xdb, 0x14, 0xa5, 0xee, 0x71, 0x92, 0x36, + 0xed, 0xc2, 0x56, 0x88, 0x97, 0xc8, 0xde, 0xf6, 0x2b, 0x86, 0x3c, 0x3c, + 0x3c, 0xad, 0x0c, 0x68, 0xa8, 0xd5, 0x99, 0x3d, 0x0e, 0x35, 0x36, 0x92, + 0xac, 0xf1, 0x8d, 0x1d, 0x7d, 0x46, 0x4c, 0x34, 0x42, 0x12, 0x15, 0x17, + 0xd2, 0x58, 0x5a, 0x18, 0xc6, 0xa1, 0x04, 0xc0, 0x2c, 0xbe, 0x63, 0x1a, + 0x1b, 0x35, 0x7f, 0x44, 0x9a, 0x37, 0x67, 0x1e, 0x68, 0x5a, 0xde, 0x5f, + 0xa3, 0xc6, 0x1b, 0x85, 0x84, 0x95, 0x8c, 0x77, 0x6d, 0xd8, 0x6c, 0xc6, + 0xd9, 0x71, 0x4f, 0x7d, 0x17, 0x14, 0xba, 0x69, 0xb2, 0x2e, 0xbe, 0xbb, + 0x44, 0xac, 0xf1, 0x8d, 0x7e, 0x7d, 0x29, 0xa2, 0x10, 0x83, 0x47, 0x05, + 0x16, 0x3d, 0xf0, 0x84, 0xb2, 0x84, 0x42, 0x65, 0xe1, 0x38, 0x5d, 0x1f, + 0x02, 0x9d, 0xa2, 0x57, 0x1a, 0x12, 0x7a, 0x7c, 0x6a, 0x48, 0x64, 0x0f, + 0xda, 0x42, 0x50, 0x9a, 0xd8, 0xf1, 0xc6, 0x8a, 0x52, 0xea, 0xe9, 0x38, + 0x60, 0x4c, 0x7e, 0x83, 0x29, 0x74, 0xa4, 0x3c, 0x3d, 0x95, 0x1f, 0x6f, + 0x57, 0x92, 0x5b, 0x28, 0xfe, 0x3d, 0xbc, 0x0f, 0x5c, 0x26, 0x21, 0xec, + 0x9c, 0x90, 0x6c, 0xb6, 0x68, 0x98, 0x9e, 0x84, 0xa4, 0x21, 0x0d, 0xd3, + 0x29, 0x4e, 0x48, 0x22, 0x10, 0x4b, 0x13, 0x1c, 0xec, 0x86, 0x95, 0xd8, + 0x34, 0x7b, 0x09, 0x37, 0xc2, 0x29, 0xd9, 0x0a, 0xe8, 0x9a, 0xe7, 0xa2, + 0x99, 0xa2, 0x12, 0x69, 0x5e, 0xcb, 0xf9, 0xfe, 0x08, 0x69, 0x5e, 0xaa, + 0x29, 0x4a, 0x5c, 0x88, 0xe2, 0x8e, 0xae, 0xe4, 0x70, 0x5c, 0x5c, 0x32, + 0xe2, 0x10, 0x65, 0x13, 0x2e, 0x29, 0x6c, 0x0f, 0x53, 0xd3, 0xb8, 0xb0, + 0xe3, 0xdd, 0x61, 0x0e, 0xc3, 0xb9, 0x38, 0x86, 0xb8, 0x70, 0x2a, 0x27, + 0xf4, 0x82, 0x2e, 0x08, 0x4c, 0xdb, 0x5b, 0xf7, 0x14, 0xe7, 0x2c, 0x99, + 0xdb, 0x44, 0x21, 0x29, 0x08, 0x42, 0x10, 0x9d, 0x46, 0x22, 0x3b, 0x3f, + 0x3f, 0xc9, 0x4f, 0xec, 0x79, 0x5f, 0x3f, 0xd1, 0x7b, 0x5f, 0xcf, 0xf4, + 0x3a, 0x71, 0x21, 0x69, 0x5b, 0xe0, 0xd9, 0x90, 0x43, 0xd8, 0x49, 0xd9, + 0x0a, 0x78, 0x17, 0x90, 0xba, 0x8f, 0x3c, 0x95, 0xc8, 0xbb, 0x02, 0x67, + 0x41, 0x2d, 0xe0, 0xfa, 0x0c, 0x83, 0xf4, 0xa0, 0xf7, 0xa1, 0xdd, 0xf0, + 0x6f, 0x65, 0xe5, 0x7f, 0xb6, 0x0d, 0xb2, 0xb5, 0x72, 0x78, 0xd7, 0x09, + 0xa3, 0x72, 0x8d, 0xb1, 0x87, 0xd1, 0x2a, 0x3c, 0x37, 0xde, 0x7e, 0xc7, + 0x08, 0x38, 0x76, 0xc1, 0xab, 0x97, 0xf9, 0x1b, 0xc8, 0x3a, 0xff, 0x00, + 0xc3, 0xf8, 0x38, 0x26, 0x24, 0x65, 0x29, 0xc8, 0xca, 0x26, 0x59, 0xbb, + 0x2b, 0xa4, 0x99, 0x7a, 0x39, 0xc0, 0xce, 0x14, 0x73, 0x58, 0xee, 0x82, + 0x26, 0x61, 0xc6, 0x87, 0xf9, 0x41, 0x2e, 0x54, 0xe5, 0x83, 0x65, 0xc8, + 0xab, 0x82, 0x3a, 0x97, 0xfd, 0xd8, 0xe3, 0x61, 0x2f, 0x38, 0x9f, 0x48, + 0x7c, 0xa4, 0x25, 0xef, 0x07, 0x6f, 0x61, 0x15, 0xb3, 0x39, 0x04, 0x34, + 0xd1, 0x3d, 0x08, 0x4c, 0x42, 0x11, 0x10, 0x9d, 0x48, 0x88, 0x42, 0x76, + 0x37, 0x46, 0x82, 0x0e, 0x3d, 0xc9, 0xe8, 0x26, 0x14, 0x42, 0x32, 0x32, + 0x14, 0xd8, 0x99, 0x6e, 0x3c, 0x41, 0x13, 0x92, 0x97, 0x4c, 0xc4, 0x1a, + 0xc4, 0xac, 0xdf, 0x9c, 0x3c, 0xff, 0x00, 0x1c, 0x93, 0x77, 0x7f, 0x8f, + 0x81, 0x4a, 0x49, 0x6c, 0x25, 0x16, 0x19, 0x4f, 0x6c, 0xf1, 0x8e, 0x37, + 0x19, 0x74, 0x37, 0xa1, 0x66, 0x1c, 0x66, 0x21, 0xa4, 0x77, 0x7b, 0xb1, + 0xbe, 0x2e, 0x3d, 0x5f, 0x22, 0x16, 0xc1, 0xbf, 0x46, 0xdc, 0x36, 0x09, + 0x50, 0x91, 0x08, 0x9e, 0xe3, 0x4f, 0x70, 0xc2, 0xd8, 0x27, 0x72, 0x84, + 0x0f, 0x06, 0x1c, 0xb1, 0xcf, 0x52, 0xc4, 0xdd, 0xcb, 0xee, 0x34, 0xd3, + 0x1b, 0x8e, 0x31, 0x9c, 0x93, 0x38, 0xed, 0xc7, 0x87, 0x32, 0xc7, 0xbe, + 0x5a, 0x84, 0xe8, 0x2e, 0x63, 0x8d, 0x6d, 0x1f, 0x27, 0x5e, 0x10, 0x33, + 0x78, 0x9a, 0x20, 0xd0, 0xe5, 0x10, 0xd7, 0x43, 0xa1, 0x62, 0x1c, 0x8e, + 0x79, 0x14, 0x89, 0x8f, 0x62, 0x75, 0x26, 0x52, 0x20, 0xd6, 0x20, 0x9d, + 0xb2, 0x47, 0x9c, 0x2e, 0x93, 0x14, 0x0d, 0xa8, 0x80, 0x8d, 0x8d, 0xc4, + 0xee, 0x95, 0xc8, 0xd5, 0x18, 0x43, 0x10, 0xe0, 0x6a, 0x6d, 0xa3, 0x93, + 0xf5, 0xb0, 0xdc, 0x59, 0x26, 0xff, 0x00, 0xbe, 0x2f, 0xf7, 0xdc, 0x43, + 0x16, 0x84, 0x84, 0x82, 0x3c, 0x2c, 0xec, 0xb1, 0x6e, 0x36, 0x2e, 0x38, + 0x19, 0x73, 0x61, 0x4a, 0x5e, 0xb8, 0xa3, 0x22, 0xec, 0x49, 0xed, 0xfd, + 0xfe, 0xc5, 0xee, 0x28, 0xaa, 0x46, 0xd3, 0xbd, 0xf8, 0xdc, 0xda, 0x36, + 0xfb, 0xbd, 0x8f, 0xd3, 0x15, 0xb7, 0xf6, 0x6c, 0x8b, 0x05, 0x39, 0xc8, + 0xfb, 0x27, 0x88, 0x6c, 0x1b, 0xee, 0x1a, 0xeb, 0x63, 0xf3, 0x3b, 0xcc, + 0x91, 0x11, 0xb2, 0xc2, 0xb1, 0x84, 0x25, 0x10, 0xeb, 0x1b, 0x12, 0x13, + 0xd0, 0x74, 0x72, 0x0d, 0xce, 0x49, 0x9b, 0x8d, 0x10, 0x64, 0xc2, 0xc3, + 0x56, 0xd0, 0xc9, 0x2a, 0x1a, 0xfa, 0x59, 0xd8, 0xd8, 0xe5, 0xd1, 0xc5, + 0x6c, 0x25, 0xc8, 0xe5, 0xc3, 0x66, 0xdf, 0x1c, 0x02, 0x16, 0x5b, 0xc4, + 0x90, 0x89, 0xdb, 0x08, 0xe8, 0x84, 0x90, 0xab, 0xe3, 0x2c, 0x68, 0xea, + 0x0b, 0x05, 0x32, 0xe0, 0xa7, 0xb9, 0x26, 0x85, 0xb0, 0xb7, 0x28, 0x8f, + 0x10, 0x4d, 0x6e, 0x3d, 0xe3, 0xd0, 0x9f, 0x61, 0xe5, 0x72, 0x39, 0x23, + 0xf5, 0x39, 0xd8, 0xfe, 0xc7, 0x77, 0x8f, 0xf3, 0x2f, 0x81, 0x2d, 0x70, + 0xff, 0x00, 0xdf, 0x71, 0x6e, 0x67, 0xee, 0xc7, 0xb8, 0x50, 0xcf, 0x11, + 0x7d, 0x86, 0xdf, 0xea, 0x8f, 0xf7, 0x48, 0x49, 0xfe, 0xa8, 0x49, 0xfe, + 0x88, 0xf2, 0x2f, 0x81, 0x78, 0xbe, 0x0f, 0x63, 0xe0, 0xf6, 0x7e, 0x07, + 0xe1, 0xf8, 0x1b, 0x1d, 0xbf, 0x96, 0x79, 0xbf, 0x27, 0x9d, 0xf2, 0xc6, + 0xde, 0x7e, 0x41, 0xf2, 0xbe, 0x46, 0x2e, 0xbd, 0xd5, 0xd4, 0x6a, 0x55, + 0x57, 0xd8, 0xe7, 0x96, 0x25, 0xfb, 0xef, 0xfa, 0x3a, 0x29, 0x7d, 0x86, + 0xd1, 0xb7, 0xe8, 0x4a, 0xae, 0x63, 0xa2, 0x23, 0x03, 0x43, 0x06, 0x8e, + 0x05, 0xc2, 0x4f, 0x00, 0xf7, 0x61, 0x4a, 0xfa, 0x11, 0x8d, 0xc1, 0xb6, + 0x56, 0x25, 0xc9, 0x94, 0xa2, 0x62, 0x65, 0x2a, 0x66, 0xc6, 0xd5, 0x52, + 0x88, 0xe8, 0x6a, 0xeb, 0x12, 0xf3, 0x9a, 0xf1, 0xc9, 0xc3, 0x8e, 0xd4, + 0x3b, 0xe0, 0xe2, 0xd0, 0xe3, 0x81, 0xe2, 0x66, 0x66, 0x66, 0x13, 0x44, + 0xd3, 0x08, 0x44, 0x44, 0x42, 0x06, 0xee, 0x51, 0xbf, 0x46, 0xc3, 0x64, + 0x5e, 0xc8, 0x69, 0xbe, 0x58, 0x92, 0x12, 0x64, 0xef, 0xa1, 0x9c, 0xbc, + 0x90, 0x98, 0xe4, 0x9a, 0x54, 0x0c, 0x14, 0x2d, 0x72, 0x39, 0xc4, 0x35, + 0x5c, 0xa3, 0xc2, 0x2e, 0xd9, 0xe1, 0x3c, 0x04, 0x98, 0xa6, 0xe4, 0x67, + 0xb9, 0xb1, 0xec, 0x49, 0xc9, 0x52, 0x1a, 0x2e, 0x85, 0x3e, 0x06, 0xe3, + 0x72, 0xca, 0x13, 0x8f, 0x34, 0x4b, 0x2f, 0x72, 0x9b, 0x0d, 0xa4, 0x47, + 0x46, 0x6e, 0xca, 0x85, 0x15, 0x21, 0x68, 0x93, 0xe0, 0x8e, 0x84, 0x31, + 0xca, 0x1d, 0x6a, 0x9b, 0x09, 0x72, 0xec, 0x7b, 0xfa, 0x01, 0x61, 0x4d, + 0x09, 0xc3, 0x66, 0x46, 0x57, 0xd4, 0x69, 0x33, 0x90, 0x0c, 0xf0, 0xda, + 0x17, 0xf9, 0x47, 0xfa, 0x85, 0x7f, 0xc0, 0xbf, 0x35, 0x9c, 0x7a, 0x44, + 0x4c, 0x36, 0x1e, 0xfa, 0x27, 0xaf, 0x74, 0xc6, 0x46, 0x42, 0x11, 0x22, + 0xae, 0xe4, 0x11, 0xd8, 0xdf, 0xb1, 0x1f, 0x56, 0x42, 0x38, 0x29, 0x4a, + 0x32, 0x9c, 0x88, 0x6c, 0x2e, 0x2e, 0x10, 0x55, 0xa2, 0x36, 0x78, 0x88, + 0x09, 0x7d, 0x44, 0xeb, 0x94, 0x7b, 0x06, 0xee, 0x70, 0x09, 0x41, 0xa3, + 0xe1, 0x41, 0xb4, 0xfa, 0x9f, 0x72, 0xe1, 0x4d, 0xc8, 0xc4, 0xdb, 0x0e, + 0x31, 0xd1, 0x45, 0x74, 0x3c, 0x45, 0xba, 0x1e, 0x03, 0xc1, 0x82, 0xba, + 0x89, 0x11, 0xc2, 0x85, 0x09, 0x88, 0xed, 0x24, 0xec, 0x43, 0x7f, 0x61, + 0x70, 0x20, 0x95, 0xc8, 0xab, 0xcb, 0x3a, 0x24, 0x74, 0xc8, 0x7d, 0x24, + 0x37, 0xd4, 0x7c, 0xe6, 0x57, 0x72, 0x94, 0xdc, 0x57, 0x09, 0x34, 0x5c, + 0x58, 0x68, 0xe3, 0x34, 0xa5, 0xa6, 0xc4, 0x9c, 0x1b, 0x96, 0x72, 0x84, + 0xc7, 0x90, 0xad, 0xd7, 0x0a, 0x23, 0x1a, 0x65, 0x65, 0x29, 0x7d, 0x2d, + 0xbb, 0x1b, 0x76, 0x2a, 0xec, 0x55, 0xdb, 0xf2, 0x55, 0xdb, 0xf2, 0x55, + 0xdb, 0xf2, 0x5f, 0x1f, 0x92, 0xf8, 0x45, 0x78, 0x2b, 0xc1, 0x5f, 0x72, + 0xb1, 0x18, 0x9e, 0x4f, 0x26, 0x0d, 0xbb, 0x14, 0xa5, 0x65, 0x29, 0x4a, + 0x52, 0x9b, 0x90, 0x90, 0x6f, 0x27, 0x88, 0x42, 0x6a, 0x4d, 0xae, 0xa5, + 0xf7, 0x28, 0xf6, 0x1e, 0x23, 0xc2, 0x53, 0xef, 0x27, 0x71, 0xe4, 0x27, + 0xb9, 0x3d, 0xcf, 0x79, 0xee, 0x2c, 0xa2, 0xbd, 0x50, 0x80, 0x00, 0x0a, + 0xee, 0x57, 0x73, 0xdc, 0x7b, 0xc8, 0xee, 0x4e, 0xe2, 0x77, 0x1b, 0x77, + 0x36, 0xd7, 0x4a, 0x51, 0x45, 0x7a, 0x28, 0xf7, 0x38, 0x13, 0x21, 0x33, + 0x4a, 0x52, 0x97, 0x0a, 0x54, 0x54, 0x44, 0x71, 0xd4, 0xae, 0xe5, 0xee, + 0x3c, 0x85, 0x15, 0xe0, 0xf6, 0x17, 0xc1, 0x7c, 0x7e, 0x4f, 0xb1, 0xf6, + 0x3e, 0xc7, 0xd8, 0xfb, 0x1f, 0x66, 0x6d, 0xd9, 0xe8, 0xa5, 0x2e, 0x29, + 0x4a, 0x52, 0x94, 0xa5, 0x2e, 0x7e, 0xe7, 0xdc, 0xfb, 0xe3, 0x62, 0xa2, + 0xa2, 0xad, 0x04, 0x20, 0x8b, 0xa6, 0x11, 0x13, 0x58, 0x14, 0x51, 0x45, + 0x14, 0x46, 0x4c, 0x91, 0x90, 0x8c, 0xa2, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x88, 0xca, 0x28, 0xa2, 0x32, 0x8a, + 0xf4, 0x00, 0x41, 0x04, 0x44, 0x44, 0x5a, 0x36, 0xc3, 0x23, 0x23, 0x37, + 0x2b, 0xc2, 0xa2, 0xa2, 0xa3, 0x63, 0x63, 0x63, 0x63, 0xee, 0x7d, 0xf5, + 0x52, 0x94, 0xa5, 0x65, 0x65, 0x66, 0xfa, 0xbf, 0xff, 0xc4, 0x00, 0x2a, + 0x11, 0x00, 0x03, 0x00, 0x01, 0x03, 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x21, 0x10, 0x31, 0x41, + 0x20, 0x51, 0x61, 0x30, 0x71, 0x91, 0x81, 0xa1, 0xb1, 0xd1, 0x40, 0xc1, + 0xf0, 0xe1, 0xf1, 0x50, 0xff, 0xda, 0x00, 0x08, 0x01, 0x02, 0x01, 0x01, + 0x3f, 0x10, 0xe9, 0xbd, 0x19, 0xe8, 0xa5, 0x2b, 0x2b, 0x2b, 0x29, 0x4a, + 0x56, 0x56, 0x56, 0x52, 0x94, 0xac, 0xac, 0xa5, 0x29, 0x4a, 0xca, 0xca, + 0xf4, 0xce, 0xb9, 0xd3, 0x24, 0x64, 0x66, 0x48, 0xc8, 0xc8, 0xc8, 0xc8, + 0xc8, 0xc8, 0xca, 0x28, 0xa2, 0x8a, 0x28, 0xb2, 0xca, 0x1b, 0x21, 0x3d, + 0x2d, 0x4e, 0x47, 0xf1, 0xff, 0x00, 0x46, 0xae, 0x1f, 0xdb, 0xf6, 0x27, + 0xbe, 0x37, 0xec, 0xfc, 0x8d, 0xaa, 0x90, 0x7b, 0x06, 0xbe, 0x0e, 0xcc, + 0x36, 0xf1, 0xff, 0x00, 0x7d, 0x06, 0x4a, 0x86, 0xbd, 0xdb, 0xee, 0x57, + 0x9f, 0xdf, 0xf6, 0x5f, 0x9f, 0xcb, 0x1f, 0xfd, 0xe3, 0xbf, 0xf2, 0x0f, + 0xbe, 0x1d, 0xf7, 0xf9, 0x1e, 0x6f, 0xc8, 0xee, 0x37, 0xcb, 0x3c, 0xef, + 0x97, 0xfb, 0x3b, 0x2e, 0xfe, 0xac, 0xef, 0xb7, 0xcb, 0x2f, 0xcf, 0xe5, + 0x89, 0xdf, 0xb9, 0x9e, 0x6f, 0xcb, 0xfd, 0x9d, 0xb7, 0xf9, 0x7f, 0xb3, + 0xbc, 0xff, 0x00, 0x27, 0x65, 0xfe, 0x5f, 0xec, 0x6a, 0xe7, 0xf2, 0xff, + 0x00, 0x67, 0x9b, 0xf2, 0xff, 0x00, 0x62, 0xee, 0x3e, 0x5f, 0xec, 0x5d, + 0xc7, 0xcb, 0xfd, 0x9e, 0x57, 0xcf, 0xec, 0x2e, 0xf3, 0xe5, 0x9e, 0x5f, + 0xcb, 0x3c, 0xbf, 0x96, 0x79, 0x1f, 0x2c, 0xf2, 0x3e, 0x59, 0xe4, 0xfc, + 0xb1, 0xff, 0x00, 0xe8, 0x15, 0xd9, 0xbe, 0x5f, 0xec, 0xee, 0xb7, 0xcb, + 0xfd, 0x8b, 0xfe, 0xa3, 0x3f, 0xf6, 0x1f, 0xec, 0x6a, 0xe5, 0xf2, 0xcf, + 0xfd, 0x86, 0x7f, 0xeb, 0x33, 0xff, 0x00, 0x58, 0x97, 0xee, 0x62, 0x57, + 0x3f, 0x96, 0x79, 0x5f, 0x2f, 0xf6, 0x79, 0xff, 0x00, 0x2f, 0xf6, 0x26, + 0xf3, 0xf9, 0x66, 0x5c, 0x3f, 0xcb, 0x17, 0xfd, 0xa2, 0x1f, 0xb8, 0x7c, + 0x89, 0xff, 0x00, 0x90, 0x25, 0x73, 0xf6, 0x2b, 0x8d, 0x7d, 0x84, 0xad, + 0x86, 0x55, 0x96, 0x05, 0xa3, 0xec, 0xc5, 0x42, 0x36, 0x8b, 0xec, 0x78, + 0x0f, 0x01, 0xe0, 0x3c, 0x05, 0x14, 0x46, 0x46, 0x4d, 0x67, 0xa3, 0x35, + 0x9d, 0x13, 0x48, 0x4d, 0x26, 0x90, 0x84, 0x21, 0x08, 0x42, 0x13, 0xa6, + 0xf4, 0x5d, 0x29, 0x59, 0x4a, 0x52, 0x8d, 0x94, 0x40, 0xb4, 0x96, 0x61, + 0xf7, 0x23, 0x6e, 0x31, 0xde, 0x89, 0xd8, 0x95, 0x5a, 0x26, 0xf8, 0x63, + 0x6a, 0x37, 0x08, 0x69, 0xa7, 0x5b, 0x14, 0xec, 0x36, 0xe1, 0x51, 0x09, + 0x0a, 0x8b, 0x08, 0xf9, 0x1c, 0xda, 0x11, 0xf2, 0x35, 0xe0, 0xa3, 0x3d, + 0x8f, 0x21, 0xa1, 0xe2, 0x61, 0xb9, 0x6f, 0x29, 0x19, 0x5c, 0xa1, 0x5f, + 0xfc, 0x04, 0x9a, 0x72, 0x89, 0x3e, 0xd4, 0x4a, 0xe7, 0xec, 0x7c, 0xdf, + 0x82, 0x44, 0x96, 0xc9, 0x94, 0x44, 0xb1, 0x09, 0x78, 0xd2, 0xea, 0xdc, + 0x49, 0x70, 0x86, 0x9b, 0xbc, 0x0d, 0x18, 0x68, 0x4a, 0xed, 0xa3, 0x3b, + 0x19, 0x5c, 0x8a, 0xde, 0x10, 0xe1, 0xe4, 0xae, 0x8d, 0xe7, 0x22, 0x9c, + 0x26, 0x37, 0xce, 0x7e, 0x04, 0x9d, 0xc8, 0xf8, 0x83, 0x6e, 0xd0, 0x90, + 0xfc, 0x11, 0xfe, 0x44, 0x82, 0x96, 0x13, 0x12, 0x1c, 0x86, 0xf8, 0x68, + 0x86, 0x50, 0xd2, 0xaa, 0x86, 0xd1, 0x2c, 0x53, 0x26, 0xfb, 0x31, 0xaa, + 0xe8, 0x84, 0xe8, 0x84, 0x44, 0xf6, 0x3c, 0x47, 0x80, 0xf1, 0x68, 0x3f, + 0x21, 0xb7, 0x71, 0x83, 0x47, 0x04, 0x6b, 0xd6, 0x9f, 0xcb, 0x82, 0x4c, + 0x92, 0xa3, 0x13, 0x6e, 0xec, 0x53, 0xcb, 0x1e, 0x71, 0x0d, 0xd2, 0x0d, + 0x52, 0x64, 0x5b, 0x41, 0xd2, 0xc2, 0x8e, 0x18, 0x12, 0x96, 0x50, 0xfb, + 0x10, 0xd7, 0x63, 0x66, 0x51, 0xc0, 0x25, 0xb0, 0x34, 0xee, 0x49, 0x7c, + 0x9d, 0x88, 0x4d, 0xdf, 0x07, 0x83, 0xd2, 0xb8, 0xe8, 0x51, 0x9a, 0x36, + 0x7a, 0x5c, 0xec, 0x36, 0x7b, 0x8d, 0x39, 0x82, 0x9e, 0x11, 0x59, 0x19, + 0x69, 0x33, 0x1c, 0x49, 0x58, 0x43, 0x73, 0xec, 0xc4, 0x1f, 0x71, 0x2b, + 0xb8, 0x8b, 0x9c, 0x11, 0xb8, 0xa2, 0xec, 0x38, 0xf3, 0x05, 0x95, 0x13, + 0x3b, 0x8c, 0x44, 0x74, 0x8d, 0xca, 0x58, 0x82, 0x57, 0x74, 0x87, 0x38, + 0x42, 0x60, 0x5b, 0x64, 0xc4, 0x83, 0x6e, 0x21, 0x77, 0xa7, 0xc1, 0xfa, + 0x04, 0x6f, 0x2d, 0x84, 0x8c, 0xb3, 0xe4, 0x86, 0x7f, 0xb1, 0x15, 0x27, + 0xc0, 0x88, 0xc2, 0xf8, 0x1b, 0x70, 0xff, 0x00, 0x7c, 0x18, 0x0d, 0x31, + 0x25, 0x86, 0x4b, 0x7a, 0x27, 0xf2, 0x3d, 0xb4, 0x27, 0x59, 0x15, 0x4a, + 0xd3, 0x19, 0xc2, 0x85, 0xfc, 0x19, 0xa4, 0x1b, 0xb8, 0x1a, 0x3d, 0x86, + 0xad, 0x8a, 0x5b, 0xe9, 0x08, 0x42, 0x13, 0x49, 0xac, 0x27, 0xf1, 0x53, + 0x3d, 0x91, 0xe4, 0x42, 0x06, 0x19, 0x74, 0xaf, 0x6f, 0xfa, 0x24, 0xe7, + 0xec, 0xff, 0x00, 0xa2, 0xe5, 0x6f, 0x83, 0x25, 0xb1, 0x28, 0xbd, 0x9b, + 0xfb, 0x1e, 0x68, 0xdb, 0xff, 0x00, 0x22, 0x66, 0x3e, 0xc1, 0xf0, 0x2f, + 0xc0, 0xd1, 0xb2, 0x37, 0xb6, 0x0a, 0xff, 0x00, 0xd0, 0x9b, 0x2e, 0x27, + 0xcb, 0xaf, 0xa1, 0x49, 0x6c, 0x20, 0x66, 0x34, 0x64, 0x24, 0x24, 0x85, + 0xa3, 0x1b, 0x1b, 0xc9, 0xee, 0x3a, 0x61, 0xac, 0x22, 0x25, 0x89, 0x4c, + 0xbc, 0x7e, 0x89, 0x9c, 0x9e, 0x1a, 0xff, 0x00, 0x7c, 0x11, 0x70, 0x2c, + 0xf0, 0x36, 0xbb, 0x8d, 0xf6, 0x19, 0xbc, 0x0a, 0x32, 0x98, 0x93, 0x9f, + 0xe8, 0x6c, 0xd8, 0x69, 0xc1, 0xe0, 0x2d, 0x9e, 0x44, 0xcf, 0x78, 0x8c, + 0x9e, 0x5f, 0xd8, 0xa8, 0xb6, 0x14, 0x71, 0x0c, 0x6f, 0x24, 0x69, 0x65, + 0x8f, 0x13, 0x8f, 0xf7, 0xb1, 0x0b, 0x72, 0xfb, 0x08, 0xe5, 0x2d, 0x46, + 0x12, 0x9b, 0x95, 0x62, 0x13, 0xef, 0xf0, 0x34, 0x9b, 0x0d, 0x9e, 0x3e, + 0x4c, 0x36, 0x38, 0xf0, 0x7b, 0x1b, 0xac, 0x21, 0x3d, 0x89, 0xf5, 0x26, + 0xa6, 0xdc, 0x89, 0x56, 0xc3, 0xfe, 0x3c, 0x4f, 0x71, 0x0f, 0x61, 0xb0, + 0x84, 0x21, 0x34, 0x42, 0x10, 0x84, 0x21, 0x08, 0x42, 0x10, 0x84, 0x27, + 0x52, 0x57, 0x62, 0x4d, 0xc8, 0x4f, 0x06, 0xc5, 0x22, 0xe7, 0x45, 0xa5, + 0xbb, 0xf4, 0x3d, 0xb4, 0x9d, 0x19, 0xd3, 0x07, 0xb1, 0x06, 0x91, 0xbb, + 0x21, 0xce, 0x54, 0xdb, 0x10, 0xfd, 0xac, 0xee, 0xad, 0x1a, 0x6a, 0x0d, + 0x10, 0xdd, 0x81, 0x8c, 0x61, 0xb1, 0x41, 0x9c, 0x15, 0x23, 0x96, 0x8a, + 0xb8, 0x50, 0x75, 0x3c, 0x0d, 0x9b, 0xa2, 0x4b, 0x91, 0xdd, 0xa1, 0x1f, + 0x90, 0xeb, 0x1c, 0x6f, 0x82, 0x89, 0x24, 0xc6, 0xdf, 0x61, 0x7e, 0x06, + 0x5f, 0x36, 0x58, 0x8b, 0x06, 0x6f, 0x71, 0xb6, 0xe8, 0x6d, 0xb9, 0x15, + 0x9c, 0x1e, 0x51, 0x8b, 0x70, 0xb1, 0x4f, 0x01, 0xb4, 0x12, 0xa1, 0x54, + 0xa9, 0xb1, 0x52, 0xcd, 0xde, 0x46, 0xeb, 0xc1, 0x55, 0x51, 0xe5, 0x52, + 0x3b, 0x99, 0x97, 0x0c, 0xcf, 0x62, 0x37, 0x9a, 0x35, 0xd8, 0x4d, 0x10, + 0xdb, 0xb7, 0xc3, 0xf8, 0x30, 0x84, 0x21, 0x08, 0x42, 0x0d, 0x13, 0x23, + 0xa4, 0x21, 0x52, 0x25, 0xc9, 0xe4, 0x3c, 0x85, 0x08, 0x20, 0xa8, 0xc6, + 0xb0, 0x9a, 0x42, 0x10, 0x84, 0xa3, 0x8d, 0xc8, 0x8c, 0x70, 0x89, 0x77, + 0x17, 0x63, 0x6d, 0x61, 0x34, 0xc6, 0xb3, 0x5d, 0x88, 0x43, 0x72, 0x76, + 0x1e, 0x90, 0xdb, 0xa3, 0x7d, 0x25, 0x22, 0xd1, 0xa3, 0xc3, 0x46, 0xfe, + 0x12, 0xcb, 0x51, 0x8c, 0x58, 0x35, 0x07, 0x83, 0xdc, 0xa8, 0xdf, 0x28, + 0x6a, 0x8d, 0x43, 0x05, 0x30, 0xdc, 0x6d, 0x98, 0xc9, 0x46, 0xeb, 0x23, + 0x1e, 0x20, 0x93, 0x61, 0xe5, 0x92, 0xf3, 0xc0, 0xb2, 0xc7, 0xe0, 0x96, + 0x73, 0x8e, 0xc3, 0x69, 0x36, 0xd7, 0xe4, 0x89, 0x8a, 0xd3, 0xa2, 0xce, + 0x78, 0x1e, 0x5d, 0x12, 0xb8, 0x4c, 0x71, 0x0c, 0xdb, 0x89, 0x0c, 0x74, + 0x13, 0xe1, 0x32, 0xb9, 0x1d, 0x64, 0xb4, 0x5d, 0xc8, 0xf6, 0xc8, 0x93, + 0x98, 0x2c, 0x25, 0x54, 0xcb, 0xdf, 0x91, 0x34, 0xb1, 0x60, 0xd1, 0x5e, + 0x04, 0xed, 0x41, 0xbb, 0xc1, 0x87, 0xb2, 0xd6, 0x7a, 0x50, 0x9a, 0x42, + 0x13, 0xa1, 0xef, 0x18, 0xf8, 0x32, 0x37, 0xe1, 0x0d, 0xdd, 0x84, 0x6d, + 0x42, 0x39, 0x10, 0x78, 0x88, 0x70, 0x78, 0x8b, 0x70, 0x78, 0x8f, 0x11, + 0xe0, 0xd0, 0x93, 0xdc, 0x5f, 0x02, 0x2e, 0xcc, 0x4c, 0xd5, 0xc9, 0x79, + 0x15, 0x1e, 0x08, 0xaf, 0xb9, 0x26, 0xb3, 0xa1, 0xf4, 0x5d, 0x36, 0xe9, + 0x85, 0xe9, 0xbd, 0x70, 0x9a, 0x35, 0xa3, 0x42, 0xa8, 0x94, 0xc9, 0xe0, + 0xc8, 0x45, 0x1a, 0x20, 0xc3, 0xd1, 0x41, 0xc6, 0xf7, 0x32, 0xb6, 0x37, + 0x64, 0x3c, 0x0d, 0x8a, 0x0d, 0x8e, 0xb3, 0xe0, 0x73, 0x5c, 0x89, 0xe1, + 0x1d, 0xad, 0xc7, 0x16, 0x15, 0x4d, 0x88, 0x93, 0x92, 0x8f, 0xc1, 0x1e, + 0xcb, 0x63, 0x0a, 0x0a, 0x25, 0x78, 0x25, 0x75, 0x19, 0x19, 0xab, 0x02, + 0x13, 0x22, 0x5b, 0x11, 0x25, 0x91, 0x1c, 0xf7, 0x18, 0xb7, 0x42, 0x4d, + 0xec, 0xa8, 0x9d, 0x17, 0xb9, 0x86, 0x45, 0x5c, 0x21, 0xbb, 0xdb, 0x93, + 0xbe, 0x18, 0xa8, 0x3c, 0x02, 0x26, 0x79, 0x2b, 0xd6, 0x84, 0xd5, 0xa6, + 0xe6, 0x35, 0xe1, 0x0d, 0xdb, 0x60, 0x6d, 0xbd, 0xd9, 0xed, 0xd3, 0x9e, + 0x89, 0xae, 0x7a, 0x61, 0x9e, 0x98, 0x3d, 0x67, 0x53, 0x7a, 0x5d, 0x69, + 0x4b, 0xa2, 0x7d, 0x57, 0xaf, 0xd8, 0xdf, 0x46, 0xb4, 0x7e, 0x08, 0x42, + 0x09, 0x21, 0x4b, 0xa6, 0xa4, 0x2e, 0x56, 0xfb, 0x0b, 0x91, 0x9f, 0x5f, + 0xf8, 0x24, 0x70, 0xfe, 0x59, 0xfe, 0x2d, 0xfe, 0xc4, 0xcd, 0xfe, 0xe7, + 0xfb, 0x17, 0xfe, 0xaf, 0xd8, 0x49, 0xdb, 0xee, 0xfd, 0x8e, 0xdf, 0xde, + 0xfd, 0x8f, 0x81, 0xbe, 0x58, 0x8a, 0xbb, 0xf9, 0x5f, 0xa1, 0x01, 0x7d, + 0x42, 0x56, 0xc8, 0x6b, 0x23, 0xc8, 0xe4, 0xda, 0x8f, 0xb8, 0x86, 0x69, + 0x11, 0x23, 0x29, 0xe4, 0xc7, 0x24, 0x4d, 0xe0, 0x91, 0xb3, 0x65, 0xb0, + 0xd2, 0x1e, 0x4c, 0x84, 0x76, 0xa3, 0x73, 0x85, 0x44, 0xb5, 0x10, 0x40, + 0x4a, 0x64, 0xea, 0x13, 0xf2, 0x3b, 0x45, 0x33, 0x68, 0x99, 0xa9, 0x0a, + 0xec, 0x70, 0x5f, 0xcb, 0x1b, 0xb7, 0x6f, 0x91, 0xf5, 0xdd, 0xec, 0x9f, + 0xe4, 0x4a, 0xed, 0xfe, 0x3c, 0x1e, 0xc7, 0xf8, 0xf0, 0x35, 0x6c, 0xbf, + 0x95, 0xf8, 0x68, 0xaf, 0xf4, 0x37, 0xfd, 0xd1, 0x33, 0x76, 0x5f, 0x54, + 0xfe, 0xd1, 0x7e, 0x44, 0xb6, 0x1b, 0xea, 0xbf, 0xe9, 0x0f, 0x28, 0x7f, + 0xef, 0x30, 0x6b, 0xcc, 0xe8, 0x9a, 0xb7, 0x04, 0x2d, 0xb2, 0x3d, 0xc3, + 0x27, 0xa4, 0xb4, 0x5a, 0xdf, 0x4d, 0x6b, 0x8d, 0x5f, 0x4d, 0x2b, 0x65, + 0x39, 0x2f, 0xa1, 0x4d, 0xca, 0x52, 0x94, 0x5d, 0x2f, 0xae, 0x77, 0x37, + 0x1e, 0x90, 0x84, 0x12, 0x11, 0x74, 0xa3, 0xd8, 0xef, 0x7f, 0xf8, 0x21, + 0xa7, 0xc8, 0x8e, 0xc2, 0xa2, 0xa2, 0x0a, 0x7b, 0x18, 0x67, 0x3e, 0xc6, + 0xf8, 0xaf, 0xb8, 0xe3, 0x14, 0x9e, 0xf1, 0x99, 0xa6, 0x2f, 0xa0, 0xdf, + 0x76, 0x48, 0x4e, 0x04, 0xbe, 0xda, 0x14, 0xf7, 0x19, 0xc8, 0xaf, 0x23, + 0x05, 0xcd, 0x08, 0x49, 0x5b, 0x7e, 0x07, 0x78, 0x3d, 0xda, 0x5f, 0x96, + 0x99, 0xba, 0x47, 0xd1, 0x36, 0xfe, 0xf1, 0x7d, 0xc6, 0x79, 0xa9, 0xf1, + 0xfb, 0x16, 0xda, 0xbd, 0xdb, 0xfe, 0x9a, 0x12, 0xdd, 0x4a, 0xfa, 0x5f, + 0xcd, 0x2f, 0xf9, 0x1f, 0x83, 0xfc, 0xbf, 0x50, 0x94, 0xec, 0x27, 0xe1, + 0x25, 0xf8, 0x48, 0x6c, 0xdd, 0xfe, 0x5f, 0xa5, 0xb4, 0x88, 0xc9, 0x6e, + 0x3e, 0x57, 0x7d, 0xf2, 0x4f, 0x3f, 0x0c, 0x7e, 0xca, 0xfc, 0xcf, 0xf7, + 0x82, 0xb7, 0x59, 0x1f, 0x76, 0x25, 0x06, 0x6d, 0x9d, 0x6f, 0xf1, 0x27, + 0x56, 0xda, 0x3d, 0x18, 0xd9, 0x4a, 0x5d, 0x29, 0x4a, 0x52, 0x94, 0xa5, + 0x29, 0x4b, 0xaa, 0xd3, 0x3a, 0xd8, 0x67, 0x55, 0xab, 0xd2, 0x0f, 0x4d, + 0xf4, 0x9a, 0xcd, 0x39, 0xd6, 0xe9, 0x74, 0xcb, 0xe9, 0x1c, 0x4e, 0x31, + 0xd1, 0xbe, 0x8d, 0x27, 0x83, 0x22, 0xe5, 0xf7, 0x58, 0x32, 0x9d, 0x17, + 0x67, 0xbf, 0xc9, 0x54, 0x10, 0xb9, 0x8a, 0x87, 0xac, 0x21, 0xd4, 0x2b, + 0x7d, 0x8b, 0x0e, 0x7d, 0xfb, 0xfc, 0x6f, 0xf6, 0x37, 0xf3, 0xf8, 0x2f, + 0xdf, 0xe1, 0x0a, 0x31, 0x7b, 0xba, 0xff, 0x00, 0xb9, 0xf6, 0x1b, 0x17, + 0x05, 0xd9, 0x61, 0x7c, 0x2c, 0x7f, 0x11, 0x36, 0xb2, 0x8d, 0xab, 0x1a, + 0x1a, 0x32, 0xb2, 0x8d, 0xe5, 0xa3, 0xf4, 0xe7, 0xa7, 0x34, 0x84, 0xe8, + 0x7a, 0xde, 0x9a, 0x37, 0xea, 0x5d, 0x29, 0x74, 0x43, 0x77, 0xa5, 0x69, + 0x69, 0x75, 0x67, 0x3a, 0x4b, 0xa4, 0x21, 0x09, 0xe8, 0x27, 0xc8, 0x35, + 0x1f, 0x4c, 0x10, 0x84, 0x26, 0x8d, 0x43, 0x49, 0xb7, 0xd9, 0xc0, 0xd3, + 0x6d, 0x92, 0x7b, 0xdf, 0xb2, 0xac, 0xe2, 0xaf, 0xce, 0x17, 0xc2, 0x7f, + 0xdf, 0xd0, 0x48, 0x5b, 0x0b, 0xb2, 0xc7, 0xe3, 0x7f, 0xaf, 0xf2, 0x53, + 0x69, 0xd4, 0x24, 0x98, 0xff, 0x00, 0x85, 0x7a, 0xf6, 0x3c, 0x93, 0x4e, + 0x7a, 0x68, 0xd9, 0x4a, 0x6c, 0x52, 0xff, 0x00, 0x13, 0xc7, 0x5d, 0x38, + 0xf4, 0x56, 0x93, 0xab, 0x63, 0x14, 0xfc, 0x1f, 0xdf, 0xa9, 0x68, 0xbb, + 0x89, 0x09, 0x16, 0xc2, 0xfe, 0x6d, 0x03, 0x43, 0x18, 0xf4, 0x7e, 0xa3, + 0x62, 0xd2, 0x74, 0xde, 0xa6, 0xfd, 0x07, 0xfc, 0x29, 0xe8, 0x5e, 0xb7, + 0xeb, 0x34, 0x4c, 0xcd, 0x7e, 0xcb, 0x55, 0xa2, 0xd5, 0x21, 0x06, 0x88, + 0x41, 0xff, 0x00, 0x2a, 0x09, 0x19, 0x85, 0xb0, 0x83, 0x18, 0xd8, 0xfd, + 0x54, 0x21, 0x6b, 0x3a, 0x5b, 0x39, 0xf4, 0xa6, 0x93, 0xaa, 0x13, 0x44, + 0xd5, 0x22, 0x10, 0x84, 0xd1, 0x22, 0x69, 0x0f, 0x1e, 0xaa, 0xf4, 0x9b, + 0x31, 0x28, 0xab, 0xce, 0x93, 0xa9, 0x08, 0x66, 0x20, 0xd3, 0x65, 0x98, + 0x0d, 0x10, 0x9f, 0xc2, 0x48, 0x5a, 0xb5, 0xa7, 0x98, 0xd0, 0xc6, 0x3f, + 0x5a, 0x97, 0x55, 0xe9, 0x2d, 0x61, 0x35, 0x84, 0xd4, 0x82, 0x23, 0x08, + 0x59, 0x23, 0xed, 0xa6, 0x48, 0x57, 0xfa, 0x14, 0x84, 0x99, 0x1f, 0x28, + 0xe4, 0xc6, 0x90, 0x6b, 0x49, 0xe9, 0xdd, 0x5e, 0xb7, 0xd0, 0xdd, 0x31, + 0x5f, 0x8f, 0xef, 0xa1, 0x68, 0x84, 0x20, 0xb0, 0x21, 0x99, 0x03, 0xd7, + 0x32, 0x90, 0x7f, 0xc0, 0x42, 0x5d, 0x05, 0x62, 0x09, 0x44, 0x92, 0x1e, + 0x86, 0x36, 0x31, 0xf5, 0x52, 0xf5, 0xdd, 0x2f, 0x4d, 0xeb, 0x9a, 0x4d, + 0x66, 0x9e, 0xc4, 0x66, 0xc3, 0x4b, 0x4b, 0x06, 0xe9, 0x4b, 0xd0, 0xa6, + 0x88, 0xac, 0xc7, 0x62, 0x22, 0x11, 0x8f, 0xcf, 0xa5, 0x4b, 0xa5, 0x29, + 0x7d, 0x3d, 0x9f, 0x06, 0xe4, 0xbc, 0x2e, 0x94, 0xc4, 0xc5, 0xaa, 0xf6, + 0xd2, 0x13, 0x48, 0x20, 0x83, 0xfe, 0x02, 0x5a, 0xc4, 0x85, 0xc1, 0x4b, + 0xa9, 0x8f, 0xd5, 0x65, 0xd3, 0x62, 0x94, 0xa4, 0x21, 0x23, 0x29, 0x4a, + 0x5e, 0x88, 0x4e, 0xbc, 0xbd, 0x61, 0x06, 0x87, 0xe8, 0xcd, 0x26, 0xa8, + 0x88, 0x84, 0x7a, 0xce, 0x8a, 0x58, 0x41, 0x22, 0x08, 0x24, 0x82, 0x09, + 0x25, 0x89, 0x04, 0xfa, 0x38, 0x9b, 0xeb, 0xa5, 0x68, 0x86, 0x11, 0xbe, + 0x94, 0xbd, 0x07, 0x1f, 0xaf, 0x41, 0x4c, 0x4a, 0x8a, 0x52, 0x94, 0xa5, + 0x18, 0xc6, 0x3f, 0x4d, 0x3a, 0x64, 0xc6, 0x99, 0xdc, 0x43, 0x66, 0x47, + 0xe4, 0xef, 0x33, 0xdc, 0x47, 0x7d, 0x2f, 0x06, 0x76, 0x19, 0x3b, 0x8a, + 0x9c, 0x12, 0xdd, 0x1e, 0x68, 0x63, 0x92, 0x94, 0xdf, 0x6d, 0x17, 0x82, + 0x10, 0x48, 0x90, 0x70, 0xf2, 0x26, 0x9e, 0xac, 0x7a, 0xb4, 0x44, 0xd8, + 0x26, 0x84, 0x41, 0x7a, 0x52, 0xee, 0x35, 0xd8, 0xdc, 0xd0, 0xdd, 0x94, + 0xa3, 0xda, 0x6d, 0xb3, 0x23, 0x7c, 0x9e, 0x6f, 0x58, 0x8e, 0xc4, 0x42, + 0xd6, 0x26, 0x47, 0x62, 0x4f, 0x16, 0x60, 0xdc, 0xdd, 0x02, 0xbb, 0x41, + 0x24, 0x48, 0x75, 0x77, 0x91, 0x34, 0xf6, 0xe9, 0x4c, 0x42, 0x28, 0xd2, + 0x2e, 0xf6, 0xdd, 0xfd, 0x8d, 0xe7, 0xf8, 0x22, 0xcf, 0x1f, 0x77, 0xfc, + 0x37, 0x81, 0x7b, 0x3b, 0xfa, 0x16, 0xf2, 0xf6, 0xd9, 0xe9, 0x41, 0xe3, + 0x53, 0xf8, 0x26, 0xc3, 0x63, 0x65, 0x62, 0x78, 0xd1, 0x46, 0xc6, 0xc6, + 0x3e, 0xa6, 0xd2, 0xdc, 0x61, 0xe0, 0x8a, 0xec, 0x84, 0xef, 0x26, 0x60, + 0xba, 0x92, 0x2f, 0x5d, 0xd3, 0x22, 0x54, 0xb6, 0xed, 0xf0, 0x36, 0xdc, + 0x9a, 0x30, 0xe4, 0x4e, 0xb7, 0x46, 0x01, 0x3d, 0x21, 0xb6, 0xbb, 0x58, + 0x87, 0x99, 0x97, 0xb1, 0xb7, 0x2b, 0xfb, 0x0d, 0xad, 0x8b, 0xdd, 0x90, + 0x52, 0xa5, 0xe1, 0x51, 0x23, 0x5b, 0xfc, 0x42, 0x3f, 0x1f, 0x2f, 0xfa, + 0x26, 0x7b, 0xbf, 0xc9, 0x0b, 0x02, 0x6a, 0xd9, 0x1f, 0xfa, 0x3c, 0x2a, + 0xff, 0x00, 0x7b, 0x88, 0x30, 0x97, 0xb9, 0x05, 0x67, 0xc0, 0xb6, 0xc8, + 0xfe, 0x82, 0xfb, 0x7f, 0x3f, 0xfa, 0x25, 0xbe, 0x8f, 0xda, 0x04, 0x99, + 0x37, 0x43, 0x63, 0x87, 0x95, 0xf6, 0x3b, 0x61, 0x78, 0x18, 0x79, 0xc9, + 0x5f, 0x22, 0x63, 0x16, 0x51, 0xce, 0x88, 0xb4, 0x7a, 0xe1, 0x04, 0x89, + 0x08, 0x34, 0x56, 0xcd, 0xcd, 0xcf, 0x28, 0xa4, 0x48, 0x59, 0xad, 0x1b, + 0x8a, 0x69, 0x05, 0xfe, 0x47, 0xe0, 0xe0, 0x21, 0xb1, 0xb1, 0x64, 0x41, + 0xd7, 0x8b, 0xee, 0xc6, 0xaf, 0xd8, 0x16, 0x0e, 0x43, 0x13, 0xc1, 0x5c, + 0x0e, 0x35, 0x4c, 0x8c, 0x56, 0x7e, 0xfb, 0x3f, 0xd9, 0x74, 0xef, 0xf4, + 0x92, 0xb7, 0xc3, 0x54, 0x25, 0x68, 0x2d, 0xc2, 0x8a, 0xdb, 0xc1, 0x00, + 0xc6, 0x32, 0x17, 0x4a, 0x30, 0xdd, 0x1a, 0x1e, 0x8d, 0xa5, 0xb9, 0x1c, + 0x64, 0x6f, 0xda, 0x37, 0xdd, 0x95, 0x38, 0x32, 0xd8, 0x6c, 0xb3, 0x46, + 0x6d, 0x51, 0x5b, 0x4d, 0x89, 0x5c, 0xbc, 0xc1, 0x32, 0xfa, 0x17, 0x45, + 0xd6, 0x0f, 0xcb, 0x83, 0x84, 0x22, 0x5b, 0x6b, 0xb5, 0xa8, 0xc6, 0x10, + 0x63, 0x91, 0x32, 0xd8, 0xec, 0x20, 0xee, 0x1d, 0x7e, 0x0e, 0x02, 0x2f, + 0x77, 0xfd, 0x18, 0x56, 0xbf, 0x6c, 0x1b, 0x84, 0x7d, 0x72, 0x45, 0x1c, + 0x7b, 0x60, 0x5d, 0xd3, 0xfa, 0x89, 0x5b, 0x24, 0x25, 0x36, 0x12, 0x63, + 0xad, 0xef, 0xb9, 0x1b, 0x12, 0xce, 0x08, 0x4d, 0x12, 0x59, 0xb1, 0x01, + 0x32, 0x41, 0x90, 0x3d, 0xd2, 0x1e, 0xfe, 0x1e, 0xc2, 0x5c, 0x8f, 0xb9, + 0xdd, 0x3e, 0xc4, 0x26, 0x94, 0xf7, 0x1f, 0x74, 0xf8, 0x7f, 0x81, 0x86, + 0xc6, 0xcb, 0x4c, 0x87, 0x45, 0xe4, 0x72, 0x13, 0x67, 0xd3, 0x2f, 0x5b, + 0x5a, 0x0d, 0x82, 0x59, 0x1e, 0xd3, 0x6f, 0xe9, 0x83, 0x26, 0xf4, 0x63, + 0x23, 0x49, 0x23, 0x54, 0x7c, 0x28, 0x26, 0x05, 0x72, 0xaf, 0x62, 0x6d, + 0xb3, 0x50, 0xdb, 0x59, 0x7a, 0x24, 0xc8, 0x8b, 0x43, 0x8d, 0x12, 0x1b, + 0x13, 0x1b, 0x03, 0x67, 0xd1, 0x5a, 0x5e, 0x93, 0x60, 0x61, 0x70, 0x4a, + 0x7f, 0xbc, 0x41, 0x3e, 0xea, 0xfb, 0xfe, 0x69, 0x0d, 0x9d, 0xfa, 0x7e, + 0x89, 0x87, 0x71, 0x4f, 0xf7, 0x81, 0x6c, 0x18, 0xde, 0xa9, 0x51, 0x91, + 0xb0, 0x7a, 0x34, 0x63, 0x8c, 0xee, 0x64, 0xdc, 0xf7, 0x0d, 0x7b, 0x96, + 0x44, 0x54, 0x86, 0xd3, 0xe4, 0x4e, 0xcc, 0x9f, 0x60, 0x7b, 0x6b, 0x8b, + 0xf8, 0xff, 0x00, 0xa6, 0xcd, 0x67, 0x54, 0xd5, 0x22, 0xfa, 0x15, 0x83, + 0x2c, 0xca, 0x13, 0x4d, 0x8f, 0xb3, 0xdb, 0xfd, 0xf2, 0x32, 0x89, 0x81, + 0xcf, 0x50, 0x84, 0xa8, 0x43, 0xd8, 0x6e, 0x05, 0xd8, 0x7b, 0x69, 0x94, + 0xe8, 0xcf, 0x26, 0x4f, 0x01, 0xdf, 0x44, 0x67, 0x59, 0x49, 0x76, 0x22, + 0x57, 0x45, 0xbe, 0xd3, 0x1b, 0x18, 0xc8, 0xb0, 0x5c, 0x34, 0x79, 0x3a, + 0x61, 0xa4, 0xba, 0x27, 0x52, 0x16, 0x23, 0x16, 0xe1, 0x6e, 0x64, 0xc6, + 0xee, 0xb0, 0x69, 0xcc, 0x0b, 0x3a, 0x2b, 0x43, 0xa6, 0x8e, 0x66, 0xff, + 0x00, 0x4c, 0x79, 0x63, 0x4e, 0x2d, 0x6c, 0x31, 0xc4, 0x48, 0x92, 0x36, + 0x5b, 0x7f, 0xef, 0x30, 0xab, 0xd9, 0x2f, 0x77, 0xfe, 0xfc, 0x98, 0x33, + 0xf0, 0x5f, 0xba, 0x34, 0x71, 0xf6, 0xf4, 0x12, 0x83, 0x60, 0x4d, 0x8f, + 0x3b, 0x8d, 0xb7, 0xff, 0x00, 0x88, 0xaa, 0x6c, 0xbf, 0xdf, 0x52, 0xf2, + 0x45, 0x29, 0x16, 0xcf, 0x43, 0x4d, 0xc0, 0xeb, 0xd8, 0x51, 0xb9, 0xaf, + 0xa8, 0x91, 0xcd, 0x12, 0x01, 0x58, 0x10, 0xc7, 0xd6, 0xa2, 0xad, 0x0d, + 0x9a, 0x8c, 0x44, 0x2a, 0x2e, 0xd0, 0x58, 0x9a, 0xc2, 0x69, 0x3a, 0x92, + 0x27, 0x57, 0xe6, 0xd1, 0xe8, 0x8c, 0xb1, 0xe5, 0x4c, 0x97, 0x91, 0xd5, + 0x79, 0xe3, 0xfd, 0xff, 0x00, 0x4c, 0x32, 0x93, 0x14, 0xca, 0x37, 0xf4, + 0x13, 0xf6, 0x7f, 0xac, 0x1d, 0xd2, 0x49, 0x19, 0xf3, 0xf7, 0x09, 0xdc, + 0x3e, 0x3f, 0xe9, 0x7f, 0xf8, 0x43, 0x9f, 0xe8, 0x8f, 0xf4, 0x48, 0x48, + 0xdb, 0xec, 0x43, 0x0d, 0xb8, 0xf8, 0x12, 0x4e, 0xc4, 0x1e, 0xc7, 0xf5, + 0x21, 0x96, 0xe2, 0x1a, 0x47, 0xf0, 0x6f, 0xb0, 0xa9, 0x50, 0xf0, 0x31, + 0xa3, 0x3f, 0x61, 0x8d, 0xb1, 0xef, 0xa1, 0xe7, 0x46, 0xe2, 0x48, 0xc6, + 0x2f, 0x7b, 0x4c, 0x90, 0x84, 0x17, 0x5a, 0x61, 0x12, 0xe9, 0x9b, 0x3c, + 0x1b, 0x91, 0xba, 0xf5, 0x44, 0x26, 0xd7, 0xf9, 0x18, 0xd4, 0x30, 0x24, + 0x86, 0x98, 0x1b, 0x43, 0x8a, 0xad, 0x09, 0x38, 0xc2, 0xf8, 0x3c, 0xd9, + 0x11, 0x16, 0xe8, 0x71, 0xe5, 0x60, 0x79, 0xcb, 0x22, 0x22, 0x21, 0x06, + 0xae, 0xa4, 0x21, 0x06, 0x88, 0x42, 0x69, 0x30, 0x42, 0x09, 0x08, 0xb6, + 0x0c, 0x7d, 0x74, 0x75, 0x0d, 0x39, 0x7d, 0xa8, 0xb8, 0x2f, 0xd9, 0x1f, + 0xf5, 0x02, 0x2c, 0xa1, 0x68, 0x4a, 0x10, 0x42, 0x37, 0xd6, 0x13, 0xa1, + 0x6d, 0xd4, 0xf8, 0xfb, 0xe8, 0xf4, 0x45, 0x0d, 0x88, 0x6d, 0x11, 0xa8, + 0x9e, 0x7e, 0x03, 0x4d, 0x61, 0x94, 0xdf, 0x71, 0x33, 0x19, 0x19, 0xd3, + 0x3c, 0x0c, 0xd8, 0xcc, 0x23, 0x54, 0x98, 0xd0, 0xf0, 0x26, 0xaa, 0xa3, + 0x75, 0x8f, 0x1a, 0x6e, 0x8e, 0x51, 0x8d, 0xb1, 0x55, 0xb8, 0x9a, 0x42, + 0x43, 0x4a, 0x77, 0x5d, 0x30, 0xe7, 0x49, 0xa4, 0x21, 0x91, 0xb3, 0x10, + 0x94, 0x63, 0x4b, 0x4a, 0x4e, 0xa6, 0x2b, 0xcf, 0x57, 0xf8, 0x3c, 0x31, + 0xba, 0xdd, 0x2f, 0x02, 0xc8, 0x98, 0xe9, 0x8c, 0x30, 0xec, 0x5d, 0x97, + 0xe0, 0xad, 0xf3, 0xa4, 0x21, 0x08, 0x41, 0x09, 0xa2, 0x13, 0xa2, 0x6b, + 0x34, 0x82, 0xdb, 0xa6, 0x63, 0x1e, 0xaf, 0x54, 0x26, 0xae, 0xf6, 0x45, + 0xfb, 0xfa, 0x56, 0xe2, 0xea, 0xd8, 0x16, 0xdd, 0x5b, 0x5d, 0x05, 0xa6, + 0x0a, 0x52, 0xc2, 0x31, 0xf9, 0x8b, 0xb0, 0xa9, 0x66, 0xcf, 0xb9, 0x7c, + 0x08, 0xe6, 0x0a, 0x3c, 0x7d, 0x82, 0x36, 0xa3, 0x15, 0x27, 0xe0, 0x34, + 0xd6, 0x28, 0x8c, 0xf0, 0xfe, 0xc5, 0x1c, 0xaa, 0x8f, 0x5a, 0xd9, 0xc8, + 0xdd, 0x17, 0xbe, 0x9b, 0xc3, 0xdc, 0x7b, 0x10, 0x61, 0x3c, 0x8b, 0x2a, + 0xd2, 0x8d, 0xc0, 0xf1, 0xf7, 0x16, 0xda, 0xde, 0xa9, 0xd1, 0xae, 0x07, + 0xa4, 0x9d, 0x6f, 0xb3, 0xfe, 0x46, 0x6e, 0x9d, 0xcb, 0x0b, 0x10, 0xb2, + 0xc8, 0xc0, 0xfc, 0x8d, 0xb1, 0x93, 0xfc, 0x2f, 0xc1, 0x09, 0xa4, 0x11, + 0x08, 0x4d, 0x21, 0x3d, 0x35, 0xbf, 0x46, 0xe1, 0x8f, 0xa1, 0xef, 0xaa, + 0xdb, 0xa3, 0x7a, 0x43, 0xfc, 0xfa, 0x16, 0x99, 0xea, 0xd9, 0x10, 0xfa, + 0x76, 0xad, 0x1e, 0xb4, 0x65, 0xe8, 0x68, 0x78, 0x4f, 0xf7, 0xfb, 0xf6, + 0x39, 0xdc, 0x4c, 0x41, 0xcc, 0x0d, 0xa6, 0xff, 0x00, 0x82, 0xf7, 0x13, + 0xec, 0x21, 0x29, 0x7a, 0x1b, 0x6f, 0x61, 0x85, 0xa6, 0xc6, 0x62, 0xd9, + 0xe5, 0xa2, 0xc8, 0xa2, 0xc0, 0xf0, 0xab, 0x1f, 0x26, 0x0e, 0x06, 0xc3, + 0xa6, 0xf4, 0xad, 0x36, 0x05, 0x8b, 0x4d, 0xa8, 0xfa, 0xdd, 0xff, 0x00, + 0xb7, 0x0c, 0xf2, 0x28, 0xdf, 0x91, 0x39, 0x30, 0xdc, 0x6c, 0xd1, 0xc7, + 0xbe, 0xd2, 0xd1, 0x13, 0xd6, 0x7d, 0x29, 0x8f, 0x0f, 0x5d, 0xcc, 0x63, + 0xe8, 0xdc, 0xfa, 0xcf, 0xb8, 0xf7, 0xe8, 0x4b, 0xd0, 0xdb, 0xd1, 0xe8, + 0xf5, 0xe3, 0xa3, 0xd6, 0x8f, 0x62, 0xf4, 0x27, 0x08, 0x32, 0x51, 0xe0, + 0x81, 0xc1, 0x0e, 0x08, 0x3d, 0xd2, 0x14, 0xf6, 0x91, 0xb6, 0xce, 0xc2, + 0x94, 0xa3, 0x1e, 0x4c, 0x98, 0x9e, 0x34, 0x7b, 0x18, 0xb0, 0xd0, 0x6b, + 0x86, 0x39, 0x46, 0xf0, 0x73, 0x47, 0x8a, 0x3d, 0x77, 0x8d, 0x68, 0xb3, + 0xa4, 0xe9, 0x43, 0x61, 0x7b, 0x89, 0xa6, 0xb1, 0xfe, 0xc2, 0xd3, 0x60, + 0xc1, 0xba, 0xf6, 0xbf, 0xe6, 0x19, 0x83, 0x15, 0x68, 0x84, 0x2c, 0x3c, + 0x0d, 0xa5, 0x8f, 0xb4, 0x5f, 0xc7, 0x7a, 0xf2, 0x18, 0xfa, 0x37, 0x3e, + 0xb3, 0xa8, 0x7b, 0xf4, 0x2f, 0x43, 0x6b, 0xd0, 0x90, 0xf5, 0x63, 0x7a, + 0x52, 0xc1, 0x1b, 0x89, 0x10, 0xd5, 0xbd, 0xbf, 0xb5, 0xd2, 0x97, 0xd8, + 0x1e, 0xa0, 0xc5, 0xd2, 0x94, 0x63, 0xdc, 0x4e, 0x63, 0x4e, 0x0c, 0x5c, + 0xa5, 0x93, 0x3c, 0x89, 0xdc, 0x9c, 0x97, 0x35, 0x8f, 0x3b, 0x90, 0x90, + 0x6a, 0xef, 0x08, 0xa6, 0xe2, 0x45, 0xd7, 0x1a, 0xd3, 0x71, 0xb0, 0xbd, + 0xf5, 0x18, 0xfa, 0xff, 0x00, 0xdd, 0xe1, 0xe8, 0x5b, 0xd1, 0x60, 0x4f, + 0x91, 0x3c, 0xc8, 0x36, 0x46, 0x1a, 0xfb, 0x5d, 0x4b, 0xf8, 0x2f, 0x6d, + 0x79, 0x8c, 0x7d, 0x1b, 0x9e, 0xab, 0xa3, 0x61, 0xca, 0xf5, 0x13, 0x0e, + 0xbd, 0xeb, 0x47, 0xa5, 0x1b, 0x12, 0xa0, 0x98, 0xd1, 0x0b, 0x25, 0x85, + 0x60, 0x67, 0x0e, 0x27, 0xf7, 0xd1, 0xc8, 0xf6, 0x1a, 0x40, 0xc6, 0xca, + 0x32, 0x8d, 0x96, 0x56, 0x37, 0x0d, 0xc7, 0x04, 0xc5, 0x80, 0xae, 0xe8, + 0x53, 0x93, 0xd8, 0xf7, 0x36, 0xc8, 0xb2, 0xd0, 0xf5, 0xfe, 0x08, 0x6c, + 0x6e, 0x2d, 0x37, 0x26, 0xbb, 0x88, 0xe0, 0x35, 0xc1, 0xc8, 0xfd, 0x0f, + 0xf5, 0x78, 0x66, 0xfd, 0x85, 0x1b, 0x15, 0x6f, 0x2c, 0x46, 0xcc, 0x0c, + 0x39, 0x97, 0xf8, 0xe5, 0xfa, 0x94, 0xbe, 0x92, 0xd9, 0xeb, 0xb7, 0x47, + 0xd1, 0xbb, 0x55, 0xd0, 0xd1, 0x45, 0x9e, 0x84, 0xf4, 0xd7, 0xd0, 0xf9, + 0x5a, 0x31, 0xeb, 0x40, 0xc3, 0x62, 0x4c, 0x6b, 0xc1, 0x49, 0xa6, 0xdf, + 0xef, 0xdf, 0x56, 0x39, 0x77, 0x1b, 0x62, 0x1e, 0x94, 0x7d, 0xd8, 0x8a, + 0xd6, 0x93, 0x50, 0x46, 0x3e, 0xe1, 0xe2, 0x3d, 0xc8, 0x98, 0xe2, 0x37, + 0x32, 0xf6, 0x2a, 0x50, 0x6b, 0xed, 0x97, 0xa1, 0x8e, 0xf4, 0x2d, 0x17, + 0x09, 0x8f, 0xb0, 0x63, 0xdf, 0xd0, 0xff, 0x00, 0x07, 0x86, 0x2e, 0x48, + 0x3d, 0x84, 0xe8, 0xae, 0xc6, 0x19, 0x63, 0xd6, 0x87, 0xfb, 0xbf, 0x97, + 0xfc, 0x75, 0xaa, 0xe0, 0x6a, 0x0f, 0xa3, 0x77, 0x41, 0xed, 0xa3, 0x36, + 0x09, 0x9e, 0x9b, 0xd0, 0xf5, 0xde, 0xeb, 0xda, 0x38, 0xd1, 0xac, 0x74, + 0x2c, 0x0d, 0x1b, 0xad, 0x61, 0x93, 0x7f, 0x2b, 0x56, 0xe6, 0x44, 0xea, + 0x4d, 0x0f, 0x5f, 0x08, 0x42, 0x0a, 0xb7, 0x13, 0xb1, 0x8a, 0x31, 0x3a, + 0x25, 0x83, 0xef, 0x9e, 0x86, 0xe6, 0x86, 0xdb, 0x21, 0x96, 0x4b, 0x73, + 0x71, 0xbb, 0xb0, 0xf7, 0xa7, 0xd9, 0x09, 0xe8, 0xb5, 0xa2, 0x51, 0x31, + 0x6b, 0xd0, 0xfd, 0x0d, 0xd7, 0xf9, 0x86, 0x40, 0xd7, 0x63, 0x2b, 0x0c, + 0x48, 0x4c, 0x61, 0xf6, 0x1b, 0xee, 0xfe, 0x7f, 0x90, 0xfb, 0xeb, 0x3f, + 0x4e, 0xfe, 0x83, 0xc5, 0xac, 0x72, 0x27, 0x83, 0xf5, 0x37, 0x86, 0x3e, + 0x9d, 0xa1, 0xe9, 0xc7, 0x42, 0x38, 0x36, 0x1a, 0xd5, 0x22, 0xf7, 0x6a, + 0xd5, 0x15, 0xa1, 0xb8, 0xd1, 0x7e, 0xd9, 0xbe, 0x98, 0xd5, 0x8d, 0x08, + 0x21, 0x6c, 0x61, 0xef, 0xb2, 0xe9, 0x81, 0x65, 0x10, 0x28, 0xc6, 0xb6, + 0x02, 0x0b, 0x93, 0xf3, 0xd3, 0xb1, 0x59, 0x4a, 0x53, 0x7d, 0x32, 0x83, + 0x6e, 0x8f, 0xd0, 0xda, 0xf6, 0x7e, 0x19, 0x9e, 0x4a, 0x90, 0xcc, 0xd0, + 0x87, 0x1b, 0x23, 0xfc, 0x8f, 0xd4, 0xbe, 0xbc, 0xdd, 0x3b, 0xf5, 0x42, + 0x5d, 0x5c, 0x78, 0x18, 0xf5, 0x0b, 0xd2, 0xde, 0xc6, 0x3e, 0x9d, 0xa1, + 0xfa, 0x8d, 0x86, 0x9f, 0x7d, 0x7f, 0xae, 0xa9, 0x7e, 0x99, 0xb7, 0x59, + 0xa2, 0x43, 0x61, 0xb5, 0xf2, 0xcb, 0x79, 0xd1, 0xb9, 0x08, 0x7a, 0x44, + 0x81, 0xc2, 0xc0, 0x91, 0x9d, 0x4b, 0xab, 0x34, 0x85, 0x88, 0x63, 0xe7, + 0xd0, 0x4a, 0xbe, 0xcf, 0xc3, 0x26, 0xc3, 0xb8, 0x59, 0x44, 0x6c, 0x4a, + 0xe0, 0xb4, 0x37, 0x61, 0xb1, 0xf7, 0x7a, 0x5e, 0x8b, 0xa5, 0xd2, 0xfa, + 0xdb, 0x0f, 0x1d, 0x41, 0x1b, 0xf5, 0x43, 0xd5, 0x50, 0x94, 0xec, 0x68, + 0x5a, 0x5f, 0x43, 0x73, 0x18, 0xfa, 0x76, 0x47, 0xac, 0xd2, 0x74, 0xc2, + 0x72, 0x2c, 0xad, 0x5e, 0xdf, 0x67, 0xfd, 0x6a, 0xac, 0x99, 0x30, 0x4d, + 0x27, 0x41, 0x8d, 0x68, 0x59, 0xef, 0x8c, 0xaa, 0x60, 0xb1, 0x2b, 0x92, + 0x79, 0x39, 0xc9, 0xc1, 0x21, 0x67, 0x44, 0xb4, 0x5b, 0x74, 0x21, 0x8b, + 0x5a, 0x5a, 0x9f, 0x3e, 0x87, 0xe5, 0x5f, 0xd9, 0x0d, 0x46, 0x54, 0xa2, + 0xdd, 0x3b, 0x44, 0x1b, 0xef, 0x7f, 0xc9, 0xdd, 0x69, 0x3e, 0x84, 0x6f, + 0xd5, 0x69, 0x93, 0x26, 0xdd, 0x27, 0x90, 0x31, 0x7a, 0x3c, 0x87, 0xd5, + 0xb0, 0x3d, 0x1f, 0x42, 0x17, 0x46, 0xf8, 0x36, 0x7f, 0xbb, 0x75, 0x5a, + 0xdd, 0xe0, 0x5a, 0x34, 0x2d, 0x5a, 0x83, 0x43, 0x42, 0x30, 0x37, 0xbe, + 0xe6, 0xc3, 0x70, 0x2a, 0x4f, 0x61, 0x3e, 0x45, 0x97, 0x91, 0x35, 0x14, + 0x56, 0xa9, 0xd5, 0x5c, 0xc1, 0x4b, 0xa2, 0x2d, 0x1a, 0xab, 0xa1, 0x8f, + 0x9f, 0x43, 0x73, 0xdd, 0x18, 0xb8, 0x24, 0xf4, 0xdf, 0x08, 0x5e, 0x44, + 0xa6, 0xc6, 0xe1, 0xef, 0xd6, 0xff, 0x00, 0xaf, 0xe5, 0x2c, 0x74, 0x91, + 0xbf, 0x58, 0x44, 0x68, 0x83, 0x60, 0x6a, 0xa3, 0xc3, 0x37, 0x46, 0xcf, + 0xd1, 0xe4, 0x3e, 0xad, 0x9d, 0x5e, 0xb3, 0x4e, 0x3a, 0x12, 0xc0, 0x94, + 0x6d, 0x6a, 0xf7, 0x4c, 0xe7, 0x45, 0xf9, 0x83, 0x50, 0xe0, 0x7a, 0x3d, + 0x1c, 0xd1, 0xe8, 0xa4, 0xe6, 0xef, 0x72, 0xb6, 0x23, 0xbb, 0x89, 0x41, + 0x89, 0xe4, 0xaa, 0x28, 0xb1, 0x7e, 0x3a, 0x78, 0x16, 0x07, 0xa2, 0xd1, + 0x0b, 0x2f, 0xe3, 0x43, 0x1f, 0xa0, 0x97, 0xdd, 0x5f, 0x91, 0x5d, 0x1c, + 0x9b, 0x0a, 0xec, 0xc5, 0x20, 0x86, 0xe1, 0xb2, 0xf7, 0x7f, 0x85, 0xfc, + 0x0b, 0xe9, 0x70, 0xe9, 0x46, 0xfd, 0x77, 0x8f, 0x82, 0x93, 0x28, 0xa9, + 0x6f, 0x81, 0x4a, 0x21, 0x1d, 0xa3, 0xd0, 0xc5, 0xe8, 0x72, 0x18, 0xfa, + 0x76, 0x7d, 0xba, 0x66, 0xa8, 0x44, 0xba, 0x6d, 0x0c, 0x95, 0xba, 0x56, + 0x79, 0x12, 0x36, 0x5a, 0xe4, 0xd3, 0xec, 0x6e, 0x85, 0xb6, 0xaf, 0x47, + 0xd1, 0x87, 0xfa, 0xe0, 0xdd, 0x91, 0xc6, 0x24, 0xb7, 0x47, 0x38, 0x2e, + 0x07, 0xb9, 0x15, 0x31, 0x57, 0x8e, 0x84, 0x51, 0x65, 0x13, 0x56, 0x23, + 0x93, 0x1b, 0x14, 0x54, 0x3f, 0x41, 0x3e, 0xd7, 0xe5, 0x19, 0x04, 0x4b, + 0x7d, 0x52, 0x13, 0xce, 0x46, 0xd8, 0xde, 0xf7, 0xfe, 0x97, 0x4d, 0xf5, + 0xaf, 0x5f, 0x0b, 0xa2, 0x09, 0x0a, 0x15, 0x15, 0x0f, 0x2c, 0x0d, 0x23, + 0x91, 0xb1, 0xa4, 0x44, 0xdd, 0x12, 0x28, 0x27, 0x96, 0x25, 0x4c, 0x7d, + 0x36, 0xd1, 0x75, 0x72, 0x1f, 0xad, 0xad, 0xc5, 0xab, 0x44, 0x3b, 0xd0, + 0x4b, 0x23, 0xc0, 0x9b, 0x8d, 0x7a, 0x58, 0xd6, 0xac, 0xc5, 0xa8, 0xeb, + 0x9d, 0x26, 0xd3, 0xd8, 0xbb, 0x0d, 0xc2, 0xe4, 0xb9, 0x46, 0x2a, 0xf1, + 0xd4, 0xaf, 0x4c, 0x0d, 0x89, 0xa5, 0x82, 0x24, 0xc0, 0xdc, 0xf2, 0x13, + 0x49, 0x57, 0x5d, 0x86, 0x0d, 0x78, 0xfc, 0xa3, 0x72, 0x84, 0xa2, 0xa2, + 0x49, 0x09, 0x36, 0x84, 0x9b, 0x08, 0x2e, 0x4f, 0xba, 0xfe, 0x97, 0xf2, + 0xb8, 0x5d, 0x28, 0x46, 0xd8, 0xf2, 0x17, 0x60, 0xed, 0x02, 0x39, 0x28, + 0xa1, 0x34, 0xd5, 0x12, 0x5b, 0xe8, 0xab, 0x89, 0xd3, 0xc3, 0x36, 0x17, + 0x57, 0x21, 0xf5, 0xef, 0xd0, 0x97, 0x61, 0x22, 0x41, 0xaa, 0x22, 0x63, + 0x44, 0x26, 0x9b, 0xa6, 0x8d, 0xf7, 0x37, 0x5e, 0x04, 0x35, 0xa3, 0xd1, + 0xea, 0xc5, 0xc3, 0xd8, 0x6b, 0xb1, 0x5c, 0x95, 0x8b, 0x91, 0x5e, 0xc2, + 0xd9, 0x0f, 0x94, 0x6d, 0x6a, 0xb4, 0x64, 0x26, 0xac, 0xbd, 0xda, 0xf9, + 0x14, 0xa5, 0x30, 0x95, 0xc8, 0x6d, 0x85, 0xfa, 0xff, 0x00, 0xe8, 0xd0, + 0x89, 0xd8, 0x86, 0x17, 0x17, 0xd5, 0x46, 0xb4, 0xef, 0xdc, 0x28, 0xb6, + 0xae, 0x3b, 0xa1, 0x1d, 0x64, 0xca, 0x2b, 0x7a, 0x2d, 0x47, 0x83, 0x91, + 0xb9, 0x10, 0x90, 0x92, 0xd9, 0x09, 0x0a, 0x5c, 0x1f, 0x7d, 0xfd, 0x2f, + 0x52, 0x3f, 0x5b, 0x87, 0x4a, 0x1d, 0xd1, 0xc0, 0x27, 0x17, 0x9d, 0x1b, + 0xa5, 0x29, 0x78, 0x12, 0x72, 0x55, 0x05, 0x5e, 0xc0, 0x87, 0x53, 0xdd, + 0x09, 0xdd, 0x24, 0x2f, 0x43, 0x13, 0x26, 0x3d, 0x61, 0x0d, 0xba, 0x78, + 0x4d, 0x60, 0x93, 0xe0, 0xb0, 0x6e, 0xef, 0xd5, 0x7a, 0x21, 0xc6, 0x46, + 0x41, 0xe0, 0x7a, 0x35, 0xa6, 0x3e, 0xd0, 0xeb, 0x13, 0x4c, 0xca, 0x74, + 0x6d, 0x32, 0xd1, 0x52, 0x0e, 0x19, 0xbb, 0xc6, 0x90, 0xa2, 0x21, 0x3a, + 0x19, 0xba, 0x16, 0x50, 0xa2, 0x45, 0x62, 0xce, 0xe5, 0x13, 0x96, 0x24, + 0xbe, 0xa3, 0xee, 0x43, 0x69, 0x04, 0xa5, 0x7d, 0x81, 0xfe, 0xcd, 0x86, + 0xd7, 0x94, 0x85, 0x67, 0x71, 0xf6, 0x43, 0x94, 0x90, 0x95, 0xc9, 0x32, + 0x6c, 0x4e, 0xe2, 0x88, 0xdc, 0x7d, 0xf7, 0xf5, 0xe8, 0x21, 0x22, 0x11, + 0xe8, 0x84, 0x1b, 0x2d, 0xfd, 0x4e, 0x1d, 0x28, 0xdd, 0x2a, 0x1b, 0xa2, + 0x4d, 0xec, 0x86, 0x9a, 0xe0, 0xc9, 0x9d, 0x32, 0xb7, 0x15, 0xc1, 0x11, + 0x36, 0x10, 0x42, 0x26, 0x1f, 0x94, 0x43, 0x55, 0x09, 0xf7, 0xd1, 0xa9, + 0xb1, 0xd8, 0x52, 0xf1, 0xa2, 0x97, 0xd2, 0xf5, 0x56, 0xb0, 0x41, 0x77, + 0x15, 0x22, 0x9f, 0xae, 0xd0, 0xd3, 0x3d, 0xf4, 0x9a, 0x7c, 0x4f, 0xf6, + 0x76, 0x06, 0xd7, 0x22, 0x63, 0x78, 0x29, 0x57, 0x61, 0x38, 0x3d, 0x77, + 0x84, 0x42, 0xd1, 0x2e, 0xfa, 0x25, 0xa3, 0x10, 0xcc, 0xa9, 0x0d, 0xb6, + 0x36, 0x29, 0x46, 0xd1, 0x8d, 0xa2, 0x8d, 0x9b, 0x56, 0x31, 0x4c, 0x59, + 0x3c, 0x1f, 0xbf, 0x25, 0x13, 0x2d, 0xb5, 0xac, 0x1d, 0x8e, 0x66, 0xf9, + 0x14, 0xba, 0x52, 0xec, 0x51, 0xf7, 0x5f, 0xd2, 0xeb, 0x4a, 0xb8, 0x24, + 0x48, 0x58, 0x2e, 0x88, 0xde, 0x2f, 0x6e, 0x8d, 0x18, 0xfb, 0x46, 0xeb, + 0x82, 0x7a, 0x1c, 0x3a, 0x50, 0xd2, 0x6d, 0x8d, 0x9c, 0x0d, 0xf8, 0x31, + 0xda, 0x37, 0x70, 0x78, 0x84, 0x92, 0xd8, 0x42, 0x46, 0x2b, 0x26, 0xe3, + 0x48, 0x61, 0x6c, 0x5e, 0x50, 0x92, 0x13, 0xcd, 0x89, 0xf9, 0x25, 0xba, + 0x2b, 0x72, 0x9a, 0x1b, 0x04, 0xbb, 0x33, 0x25, 0x13, 0x01, 0xfa, 0x2a, + 0x69, 0x89, 0xe8, 0xd9, 0xe4, 0x67, 0x82, 0xf3, 0xc7, 0xef, 0xec, 0x6d, + 0x63, 0xfa, 0xff, 0x00, 0x42, 0x7a, 0x60, 0xd4, 0x38, 0xa1, 0xdd, 0x34, + 0x7e, 0x46, 0xc2, 0x2d, 0x6f, 0x32, 0xbe, 0x76, 0x7e, 0xfa, 0x2d, 0xf3, + 0xa1, 0xf8, 0xf4, 0x9a, 0x32, 0x33, 0xdc, 0x94, 0xfe, 0xb1, 0xe4, 0xbe, + 0x04, 0x9b, 0xca, 0x37, 0x23, 0x16, 0x06, 0xb3, 0x81, 0xd3, 0x6f, 0x84, + 0x5b, 0xa4, 0xd5, 0xb4, 0x84, 0x27, 0x20, 0x97, 0x91, 0xbb, 0xb0, 0xb9, + 0x3d, 0xca, 0x52, 0x96, 0xa3, 0x6f, 0xc0, 0x8f, 0x81, 0x35, 0xc9, 0x6f, + 0xb2, 0x18, 0xe4, 0xf2, 0x51, 0x3b, 0x61, 0x37, 0x2c, 0x48, 0x16, 0x7b, + 0x66, 0x05, 0x58, 0x43, 0x73, 0x66, 0x25, 0x0d, 0xb0, 0x7d, 0xd7, 0xf4, + 0xba, 0xf7, 0xd2, 0x94, 0xa5, 0x13, 0x9d, 0x09, 0x25, 0xb7, 0x4b, 0x49, + 0x8d, 0x19, 0xe2, 0x36, 0x29, 0x70, 0x47, 0xaf, 0x1d, 0x28, 0x8b, 0x73, + 0xdb, 0x5c, 0x93, 0x5d, 0x8e, 0x4b, 0x49, 0xd1, 0x07, 0xba, 0x45, 0x83, + 0x2f, 0x29, 0xda, 0x64, 0xa5, 0xd6, 0xdb, 0x80, 0xeb, 0x53, 0x03, 0xdd, + 0x21, 0x49, 0x58, 0xf8, 0x18, 0xd4, 0xf1, 0x04, 0x7d, 0xe3, 0xe8, 0x21, + 0x86, 0x3a, 0x99, 0x98, 0x62, 0xfa, 0x98, 0x26, 0x5e, 0xe4, 0x7e, 0xb0, + 0xc5, 0x4d, 0x3e, 0xe9, 0x97, 0xd0, 0xdb, 0x3f, 0xd0, 0xbf, 0x95, 0x59, + 0x59, 0x49, 0x7d, 0x36, 0x36, 0x61, 0xfd, 0x50, 0xcc, 0x15, 0x79, 0xbb, + 0x89, 0xc5, 0x6b, 0xe8, 0x24, 0x6f, 0xf0, 0x3f, 0xd8, 0x99, 0xde, 0xf0, + 0xc7, 0x6b, 0xfb, 0x7f, 0xe1, 0xb2, 0xb4, 0xbe, 0x9f, 0xba, 0x6e, 0x4f, + 0xcc, 0xfc, 0x0f, 0xba, 0xdd, 0xfd, 0x4f, 0xaa, 0xc7, 0xb9, 0x4d, 0xc9, + 0x9b, 0x39, 0xf2, 0x87, 0x48, 0xb7, 0xe1, 0x36, 0x21, 0x12, 0x6d, 0xa2, + 0x25, 0x4f, 0xc8, 0x99, 0x7b, 0xe9, 0x57, 0x27, 0xb9, 0xce, 0x0d, 0x82, + 0xd5, 0xe1, 0x19, 0x5c, 0x15, 0xf6, 0xe8, 0x0d, 0x45, 0x3b, 0x14, 0xf7, + 0x2a, 0x48, 0x85, 0x55, 0x49, 0x79, 0x31, 0x0b, 0x5e, 0x36, 0x11, 0x80, + 0x1e, 0xd9, 0x13, 0x67, 0x3f, 0xb7, 0x91, 0xc9, 0x84, 0x9f, 0xd8, 0xbf, + 0x03, 0x26, 0xf6, 0xec, 0x73, 0x22, 0x73, 0x48, 0x76, 0xe5, 0xaf, 0xae, + 0xf0, 0xcd, 0x09, 0x28, 0xf7, 0x13, 0x25, 0x74, 0xbb, 0xe4, 0x7a, 0xc7, + 0xd6, 0x5f, 0xa7, 0xfb, 0x37, 0xe3, 0xdc, 0xbf, 0x54, 0xda, 0x07, 0xf5, + 0x42, 0x2f, 0xe1, 0x99, 0x40, 0x84, 0xb0, 0x48, 0x4b, 0xb6, 0x94, 0xdc, + 0xff, 0x00, 0x98, 0x5d, 0x08, 0x20, 0x4b, 0xcb, 0x82, 0x77, 0x2d, 0xe3, + 0xf7, 0xb1, 0x85, 0x29, 0xdd, 0xe5, 0xfe, 0x8d, 0xa2, 0x1f, 0x0f, 0x6f, + 0xf9, 0xf4, 0x14, 0xa7, 0xc2, 0x61, 0xae, 0x84, 0x53, 0x45, 0xeb, 0x5a, + 0x42, 0x22, 0x06, 0x87, 0xd0, 0x87, 0xbf, 0x44, 0x6e, 0x41, 0xaf, 0x22, + 0x1b, 0xa3, 0x67, 0x7f, 0x09, 0x8b, 0x57, 0x51, 0xb4, 0x89, 0x22, 0x10, + 0x41, 0x28, 0x66, 0x9e, 0x7b, 0x8b, 0xee, 0x5e, 0xc6, 0x02, 0x0d, 0x85, + 0x72, 0x8c, 0xb7, 0x32, 0x8d, 0xf8, 0x29, 0xbd, 0xc6, 0xcd, 0xac, 0x8d, + 0x67, 0x24, 0x5d, 0x84, 0xe2, 0x41, 0x3e, 0x48, 0x4f, 0xb0, 0xa9, 0xc0, + 0x92, 0x49, 0x78, 0x70, 0x7b, 0xc6, 0x65, 0x3e, 0x45, 0x4e, 0x93, 0x9b, + 0x46, 0x4c, 0x95, 0xf7, 0x43, 0x7e, 0xef, 0x2d, 0xfe, 0xc2, 0xd2, 0x30, + 0x42, 0x94, 0xe0, 0xdc, 0x5b, 0x12, 0xec, 0x5c, 0x14, 0x1e, 0x34, 0xa3, + 0x56, 0xec, 0xd8, 0x1f, 0x94, 0x6f, 0x29, 0xf9, 0x36, 0xb6, 0xdf, 0xb2, + 0xfd, 0x89, 0xf2, 0x7b, 0xb3, 0x68, 0x97, 0xdc, 0x58, 0x57, 0xcf, 0x6c, + 0x7e, 0x04, 0xf4, 0x53, 0x81, 0x66, 0xcd, 0xf8, 0xff, 0x00, 0x21, 0x39, + 0xdc, 0x1f, 0xd4, 0xbe, 0x6e, 0xf3, 0x57, 0xf7, 0xfa, 0x2e, 0xcd, 0x35, + 0xdd, 0xcf, 0xc4, 0x36, 0x4f, 0xb0, 0xba, 0xb0, 0x9b, 0x8c, 0x8f, 0xfd, + 0xb7, 0xcf, 0xec, 0x4b, 0x6b, 0x3f, 0xd3, 0xfe, 0x31, 0x0b, 0x6a, 0x5f, + 0x87, 0xfa, 0xfb, 0x96, 0x51, 0x3f, 0x25, 0x6f, 0x08, 0xc0, 0x83, 0x33, + 0x3d, 0xd8, 0x99, 0xac, 0xdc, 0x5a, 0x88, 0x35, 0xa3, 0xec, 0x18, 0xd7, + 0x66, 0xee, 0xf3, 0x81, 0xad, 0xb5, 0xee, 0xef, 0xe8, 0xec, 0xcf, 0xa7, + 0xee, 0x98, 0xe6, 0xfd, 0x31, 0xf8, 0x83, 0x6a, 0xf5, 0xf9, 0x13, 0x9d, + 0x62, 0x61, 0x19, 0xe9, 0xf8, 0x9f, 0xf4, 0xfe, 0x9f, 0x8a, 0x24, 0x41, + 0xe1, 0x53, 0x01, 0x54, 0x20, 0x85, 0x2f, 0xa2, 0xd0, 0xd3, 0x27, 0x45, + 0x68, 0x84, 0x21, 0x0d, 0x58, 0x95, 0xec, 0xf5, 0x9f, 0xc6, 0xb2, 0x21, + 0x09, 0x16, 0xa8, 0x98, 0xe9, 0xd4, 0x76, 0x07, 0xb1, 0xc6, 0x1e, 0xe6, + 0x6e, 0x59, 0xba, 0xa3, 0x7d, 0xe3, 0x7d, 0xc6, 0x19, 0xa2, 0x69, 0x98, + 0x2c, 0xd8, 0xd8, 0xac, 0x53, 0xdc, 0xad, 0x32, 0x8c, 0x86, 0xd1, 0x3b, + 0xd8, 0x7b, 0xcf, 0x06, 0xea, 0x6c, 0xb4, 0x14, 0x39, 0xc1, 0x5d, 0x16, + 0xc2, 0xc8, 0x94, 0xc8, 0xd5, 0x2f, 0x2a, 0x5e, 0xec, 0xa6, 0xef, 0xcb, + 0x1e, 0x6b, 0x67, 0xf5, 0x1f, 0x70, 0xa5, 0x84, 0x52, 0x16, 0x0d, 0x90, + 0xbc, 0x08, 0x2b, 0x2d, 0x90, 0xc1, 0xba, 0x3c, 0xd4, 0x5d, 0xac, 0x4e, + 0x94, 0x37, 0xcc, 0x60, 0xab, 0xfc, 0xc7, 0xb1, 0x95, 0x9d, 0x0b, 0xb0, + 0xc2, 0xdd, 0x76, 0x79, 0x15, 0xc2, 0xb8, 0x7f, 0xc7, 0xc1, 0x53, 0x93, + 0xec, 0xff, 0x00, 0x63, 0x9b, 0x8e, 0x11, 0xb4, 0x24, 0x43, 0x91, 0x8e, + 0x22, 0x26, 0xe0, 0xd6, 0x60, 0x75, 0x86, 0x34, 0xe9, 0x17, 0x22, 0x4c, + 0x28, 0x24, 0x96, 0x0c, 0xd0, 0x7f, 0x99, 0x16, 0x01, 0xb9, 0x85, 0x78, + 0xd1, 0xaa, 0x8c, 0x0d, 0x5e, 0x8b, 0x46, 0xc2, 0xd0, 0x42, 0xfa, 0x33, + 0x46, 0xd2, 0x12, 0x37, 0x17, 0x5a, 0x56, 0xcc, 0x4c, 0xb7, 0x13, 0x84, + 0x8f, 0x61, 0xfa, 0x2c, 0x7d, 0x33, 0x49, 0xd3, 0x35, 0xb8, 0xfb, 0xf4, + 0xb3, 0x28, 0xdc, 0x8b, 0xdd, 0x8d, 0x91, 0xfe, 0x3f, 0x46, 0x2f, 0x39, + 0x13, 0xb9, 0x31, 0x3e, 0xe6, 0xbe, 0x9f, 0xf4, 0xdf, 0xbb, 0xe3, 0xfe, + 0x8e, 0xdf, 0xa8, 0x99, 0xff, 0x00, 0x23, 0x66, 0x7f, 0x69, 0x57, 0x2f, + 0xf7, 0xc9, 0x4d, 0x8b, 0x4f, 0xbe, 0x5f, 0x82, 0xd8, 0x49, 0x2f, 0x1f, + 0xea, 0x27, 0xc9, 0xb2, 0x47, 0x81, 0x6e, 0xf0, 0x54, 0xa2, 0x62, 0xf2, + 0x25, 0x9a, 0x41, 0x78, 0x12, 0xc8, 0xcd, 0xc4, 0x5b, 0x92, 0xa2, 0xe2, + 0x23, 0x28, 0x7d, 0x8b, 0x0e, 0x49, 0x72, 0x3d, 0x6a, 0xf2, 0xbb, 0xe9, + 0x25, 0x96, 0xa4, 0x14, 0xd9, 0x79, 0x2c, 0x04, 0xc8, 0x64, 0x0d, 0x2e, + 0x06, 0xa8, 0x8b, 0x81, 0xb3, 0xb6, 0x6b, 0x95, 0x95, 0xff, 0x00, 0x3e, + 0xa4, 0x1a, 0x6b, 0x74, 0x30, 0x78, 0x4f, 0xdf, 0xb9, 0xba, 0x52, 0xc0, + 0x89, 0x10, 0xad, 0x10, 0x7d, 0xca, 0x34, 0x38, 0x02, 0xf7, 0x65, 0x8c, + 0x9d, 0x90, 0x9d, 0x32, 0x8d, 0xf7, 0x1a, 0xde, 0x09, 0x65, 0x16, 0xcc, + 0xa3, 0xa1, 0x81, 0xa1, 0x3a, 0xe6, 0xd9, 0xff, 0x00, 0x4f, 0xfa, 0xe9, + 0x44, 0xa4, 0x6b, 0x66, 0x56, 0x20, 0xb5, 0x10, 0x47, 0x73, 0xc8, 0x79, + 0x06, 0x83, 0x14, 0x36, 0x62, 0x4c, 0x28, 0x58, 0xf4, 0xdb, 0x86, 0x42, + 0x6f, 0x22, 0x4d, 0x8f, 0x58, 0x42, 0x10, 0xb7, 0xa6, 0x9b, 0xec, 0x25, + 0xe8, 0xa9, 0xdf, 0x6d, 0x66, 0x96, 0x4b, 0x7e, 0x5f, 0xf5, 0xfd, 0x89, + 0xa3, 0x4e, 0x07, 0x03, 0xb7, 0x38, 0x17, 0x8e, 0x46, 0xa8, 0x9b, 0x91, + 0x67, 0x91, 0x53, 0xa6, 0x19, 0x1c, 0xd8, 0x88, 0x4f, 0x81, 0x51, 0x56, + 0xd9, 0xe5, 0xff, 0x00, 0x7e, 0xc2, 0x61, 0x6a, 0x19, 0xec, 0x36, 0x68, + 0x24, 0xe0, 0xa4, 0x17, 0x2d, 0x09, 0x88, 0x2a, 0x2a, 0x39, 0xb4, 0x6d, + 0x94, 0x5e, 0xe8, 0x58, 0x8f, 0x6a, 0x2a, 0xd6, 0x0e, 0x06, 0xd1, 0x56, + 0xc5, 0x10, 0xfb, 0x2b, 0xfc, 0x11, 0xb6, 0x51, 0xa5, 0x4c, 0x6e, 0x6c, + 0x35, 0x36, 0x12, 0x17, 0x01, 0x6c, 0x7e, 0x10, 0xd5, 0x2f, 0x42, 0xbe, + 0x56, 0x1f, 0xd8, 0xfa, 0xe1, 0x27, 0xfb, 0xff, 0x00, 0x83, 0x54, 0xac, + 0x37, 0x5d, 0xd7, 0xfc, 0x1c, 0x04, 0x86, 0xc0, 0xd7, 0x0c, 0x78, 0x42, + 0xf2, 0x62, 0xc8, 0x87, 0xc8, 0x31, 0xa2, 0xdd, 0x24, 0x24, 0x12, 0xba, + 0x52, 0xc1, 0x41, 0x0d, 0xdf, 0x7b, 0x26, 0x3b, 0xe0, 0xf2, 0xd2, 0xfb, + 0x6f, 0xf6, 0x1d, 0x25, 0x48, 0xea, 0xdf, 0xf3, 0xff, 0x00, 0x07, 0x65, + 0x84, 0xb9, 0x4d, 0xba, 0xb9, 0x97, 0x4e, 0x3d, 0x04, 0x6d, 0x10, 0x92, + 0xc1, 0x7a, 0x8b, 0x9b, 0xaa, 0xdb, 0x31, 0x73, 0x8b, 0xb9, 0x0b, 0x94, + 0x4c, 0xe4, 0x4c, 0xe4, 0xb7, 0x28, 0xff, 0x00, 0x27, 0xa0, 0x8f, 0x23, + 0x4f, 0x24, 0xb6, 0x43, 0x5e, 0x10, 0x9a, 0x94, 0x5e, 0x8d, 0x85, 0xd0, + 0xce, 0xd2, 0xf1, 0xf4, 0x21, 0xba, 0xc5, 0x91, 0xc6, 0x34, 0x93, 0xa4, + 0xd3, 0x0f, 0x21, 0x60, 0xc8, 0xb2, 0x34, 0x82, 0xce, 0x37, 0x3c, 0x11, + 0x99, 0xba, 0xfb, 0xaf, 0xd7, 0x91, 0x52, 0x44, 0x47, 0xf3, 0xfb, 0x33, + 0x17, 0xf5, 0x5f, 0xc8, 0xcb, 0x8c, 0xf1, 0xff, 0x00, 0xa2, 0x65, 0xb0, + 0x9b, 0x91, 0x3c, 0xc6, 0x85, 0x1b, 0xa2, 0xcc, 0x36, 0x2a, 0x11, 0xb0, + 0x56, 0x4b, 0x96, 0x53, 0x51, 0xd6, 0x1b, 0x82, 0xfe, 0x8c, 0xcc, 0x63, + 0xef, 0x83, 0x87, 0x2f, 0xf7, 0xb1, 0xbb, 0x2f, 0xdb, 0x1f, 0xb3, 0x3e, + 0xaf, 0xdf, 0x23, 0x79, 0x3d, 0xbf, 0xfe, 0x10, 0xdd, 0xd0, 0x6b, 0xb0, + 0xfb, 0x97, 0x18, 0x16, 0xca, 0x2e, 0x7f, 0x1f, 0xde, 0x90, 0x94, 0x4a, + 0x33, 0x18, 0x97, 0xee, 0x8a, 0xed, 0x94, 0x1a, 0xdc, 0x97, 0xfb, 0xd8, + 0x7f, 0x0e, 0xf9, 0xa3, 0x99, 0x49, 0x3f, 0xf3, 0xc2, 0x1a, 0x7f, 0x56, + 0x9f, 0xf6, 0x21, 0xfd, 0x0b, 0xf4, 0x64, 0xa8, 0xf6, 0x62, 0x3c, 0x7c, + 0x0c, 0x63, 0x1f, 0x60, 0x77, 0x66, 0xfb, 0x7e, 0xce, 0x30, 0xbe, 0xab, + 0xfa, 0xa3, 0xfb, 0x2f, 0x9f, 0xd0, 0x9f, 0xd0, 0xbf, 0xe9, 0x92, 0xbf, + 0x73, 0xfd, 0x43, 0x6f, 0xd7, 0xd1, 0x11, 0x13, 0xd1, 0xa2, 0x7a, 0x69, + 0x3c, 0x11, 0x07, 0xf3, 0x1e, 0x38, 0x6d, 0xe8, 0xe4, 0x50, 0xd6, 0xbe, + 0x06, 0x43, 0xbb, 0x91, 0xe5, 0xa4, 0x3f, 0x03, 0xbb, 0x09, 0x94, 0xc6, + 0xc3, 0x46, 0x44, 0xfb, 0x8d, 0xe0, 0xd8, 0x58, 0x34, 0xed, 0x17, 0x6c, + 0x4f, 0xe1, 0xfb, 0x8a, 0x09, 0xfb, 0x3f, 0xa2, 0x08, 0xa8, 0x6d, 0xdf, + 0xee, 0x47, 0xfe, 0xd9, 0x1f, 0xfd, 0x89, 0x1c, 0x4c, 0x03, 0x43, 0x70, + 0xfb, 0xdf, 0xec, 0xaf, 0xfd, 0xbf, 0xd9, 0xfe, 0x6d, 0x89, 0x3b, 0x7d, + 0xcf, 0xf6, 0x7f, 0x83, 0x62, 0x5f, 0x11, 0xed, 0x4a, 0xf6, 0x5d, 0x0c, + 0x64, 0x71, 0x40, 0x63, 0x84, 0x2b, 0x78, 0x1b, 0xe2, 0x0d, 0x96, 0x32, + 0xf6, 0x36, 0xc9, 0x48, 0xc9, 0xbe, 0x3a, 0x21, 0xba, 0x83, 0xe9, 0x02, + 0x42, 0x44, 0x27, 0x42, 0x54, 0x4f, 0x52, 0x0f, 0x49, 0x27, 0x82, 0x20, + 0x9e, 0xb6, 0xef, 0x5a, 0xee, 0x01, 0x29, 0x8f, 0x49, 0x9e, 0xfa, 0xd6, + 0x12, 0xf7, 0xcf, 0xc1, 0x4b, 0x45, 0xb9, 0xe5, 0x0f, 0x6c, 0x0e, 0xd2, + 0x64, 0x6b, 0x06, 0x36, 0x36, 0x3c, 0x1d, 0xc8, 0x59, 0xd8, 0x6e, 0x8d, + 0x26, 0x87, 0x5a, 0xac, 0x3e, 0xe4, 0xec, 0x6e, 0xfc, 0xfd, 0x7b, 0xfe, + 0x4c, 0xdf, 0x2d, 0x21, 0x34, 0x9a, 0xce, 0xa6, 0x21, 0x79, 0xbf, 0x0f, + 0x72, 0xa6, 0xa3, 0x76, 0x8b, 0x2c, 0xad, 0xd1, 0xa6, 0xcc, 0xd9, 0x91, + 0xc3, 0xac, 0x8e, 0x0c, 0xda, 0x3b, 0x8f, 0x2b, 0xfa, 0x90, 0x84, 0x64, + 0x65, 0x68, 0x62, 0x90, 0x84, 0x21, 0x3a, 0xd3, 0xd6, 0xe6, 0xf4, 0x18, + 0x12, 0x5b, 0x3d, 0x75, 0xab, 0xd5, 0x6b, 0x57, 0xb0, 0x92, 0x48, 0xbd, + 0x4b, 0x36, 0xb8, 0xe6, 0xcb, 0x1f, 0xef, 0xa9, 0x43, 0x7d, 0xc7, 0x85, + 0x4c, 0xda, 0x2c, 0x3c, 0x19, 0x21, 0x6f, 0x58, 0xdb, 0x43, 0xdc, 0xf3, + 0x37, 0x1a, 0x6f, 0x62, 0x41, 0xb6, 0x9e, 0x05, 0x77, 0x1a, 0x52, 0xb1, + 0x33, 0x4c, 0x40, 0x3f, 0xc9, 0x13, 0x3b, 0xbf, 0x1f, 0xf0, 0x42, 0x99, + 0x56, 0x90, 0x9a, 0x4e, 0xa6, 0x66, 0xc4, 0x52, 0xe0, 0x5d, 0xff, 0x00, + 0x43, 0xf7, 0x32, 0x5e, 0x06, 0xd3, 0x65, 0x0b, 0x80, 0xce, 0xec, 0x6c, + 0x1b, 0x76, 0x13, 0x12, 0xdc, 0xfb, 0x94, 0x24, 0x53, 0xa9, 0x93, 0xd2, + 0x4a, 0x25, 0xeb, 0x6e, 0x47, 0x2b, 0xa5, 0x23, 0xb9, 0xfc, 0x19, 0x53, + 0x5a, 0x4f, 0x45, 0x57, 0x85, 0xa4, 0x6d, 0xea, 0xb5, 0x50, 0xd6, 0x30, + 0xa7, 0x1f, 0x4f, 0x72, 0xfb, 0x1a, 0x9e, 0x46, 0x61, 0xb1, 0x21, 0x67, + 0x03, 0x8d, 0x15, 0x3c, 0x0a, 0xca, 0xc8, 0x98, 0x94, 0xc1, 0xbb, 0x8c, + 0x6b, 0xb9, 0xb6, 0xe6, 0x4a, 0x44, 0xda, 0x1c, 0x0d, 0x9a, 0xa1, 0x9f, + 0x17, 0x67, 0xb1, 0x01, 0x35, 0xdf, 0x81, 0x5c, 0x0d, 0x75, 0xa4, 0xad, + 0x10, 0x91, 0xff, 0x00, 0x48, 0x3a, 0xe2, 0xec, 0x54, 0xd9, 0x4b, 0x63, + 0x67, 0x93, 0xd9, 0x18, 0xdc, 0xae, 0x4b, 0x98, 0xd0, 0xfb, 0x21, 0x5b, + 0x96, 0x28, 0xf8, 0x2e, 0xda, 0xd8, 0x5e, 0x84, 0xf4, 0x12, 0xa2, 0x42, + 0xfe, 0x07, 0x22, 0x24, 0xc6, 0x8d, 0xdc, 0x24, 0xd9, 0xfc, 0x25, 0x86, + 0x24, 0x73, 0xd1, 0x6b, 0x10, 0x94, 0xaf, 0x7d, 0x2f, 0xad, 0x81, 0x6e, + 0x8f, 0xfd, 0x94, 0x62, 0x7b, 0x8d, 0xdc, 0x9b, 0x3c, 0x64, 0xa3, 0x9b, + 0x8b, 0x3a, 0x63, 0x24, 0x2f, 0x61, 0x6c, 0x55, 0x0c, 0xec, 0x46, 0xd1, + 0x18, 0xdc, 0x95, 0xee, 0x4a, 0x4a, 0xb0, 0x64, 0xa6, 0x94, 0xee, 0x52, + 0x15, 0x81, 0x7d, 0x48, 0x28, 0xfc, 0x08, 0x89, 0xeb, 0xc8, 0x9a, 0xa1, + 0xfb, 0x68, 0x82, 0xa9, 0x17, 0x28, 0x7d, 0xd9, 0x96, 0x13, 0xb0, 0xd8, + 0xa2, 0x6a, 0x4e, 0xc3, 0xcb, 0x12, 0x68, 0xab, 0x82, 0x67, 0x61, 0x22, + 0xc9, 0x8e, 0xc3, 0x5c, 0x08, 0xf7, 0x15, 0x32, 0xc1, 0x91, 0x79, 0x0b, + 0xd2, 0x9d, 0x49, 0x04, 0xbf, 0x83, 0x46, 0x9b, 0x84, 0xab, 0xf8, 0xab, + 0x55, 0xeb, 0x63, 0x44, 0x31, 0xe4, 0xa5, 0x62, 0x5f, 0xc1, 0xce, 0xbf, + 0xd4, 0xbb, 0x8c, 0xdd, 0x31, 0xc5, 0x91, 0xe5, 0xe1, 0x19, 0x4a, 0x98, + 0x45, 0x43, 0x48, 0xf4, 0x4a, 0xba, 0x2c, 0xb3, 0x75, 0x16, 0x39, 0x3c, + 0x32, 0xa6, 0xf6, 0x1b, 0xb8, 0xec, 0x55, 0x62, 0x77, 0x66, 0x6d, 0x69, + 0x7c, 0x8f, 0x0f, 0x25, 0x5c, 0x8e, 0x88, 0xb9, 0x26, 0x6c, 0x2b, 0xc9, + 0xe0, 0x68, 0xca, 0x64, 0x67, 0x5f, 0x22, 0x0b, 0xa7, 0xb8, 0xcd, 0xc3, + 0x2c, 0x8b, 0xb8, 0xb5, 0x76, 0x37, 0x46, 0x65, 0xe5, 0x12, 0x64, 0xdf, + 0x81, 0xf6, 0x1c, 0x5b, 0x0f, 0x0c, 0x8e, 0x52, 0x64, 0xc2, 0x59, 0x67, + 0x79, 0x42, 0x92, 0xf0, 0x84, 0x5f, 0x5a, 0x02, 0x5f, 0xfc, 0xa4, 0x8f, + 0xa3, 0x61, 0x1c, 0x8e, 0x61, 0x53, 0xd1, 0xbe, 0x8b, 0x3a, 0xc2, 0x39, + 0x23, 0xff, 0x00, 0x41, 0xef, 0x82, 0x96, 0xe2, 0xbc, 0x13, 0xb9, 0xbe, + 0xc2, 0x86, 0x53, 0xa4, 0x33, 0x1c, 0x18, 0x7b, 0x11, 0x09, 0xc0, 0xed, + 0x83, 0xc1, 0x99, 0x11, 0x73, 0x46, 0xc6, 0x59, 0x63, 0xc2, 0x2c, 0xaf, + 0x2a, 0x5c, 0x93, 0xbc, 0x61, 0x16, 0x4c, 0x32, 0x73, 0xd8, 0x6a, 0xef, + 0x92, 0x55, 0xb0, 0xd1, 0x64, 0x8d, 0xe0, 0xcb, 0x0c, 0x4a, 0xbc, 0x09, + 0x32, 0xd6, 0x50, 0xb7, 0xc8, 0xd0, 0x75, 0x03, 0x49, 0x5b, 0x12, 0x99, + 0x43, 0x49, 0x88, 0x9c, 0x64, 0xab, 0x22, 0x46, 0xf9, 0x83, 0xe5, 0x63, + 0xf2, 0x17, 0x4c, 0xf4, 0x90, 0x42, 0xfe, 0x5c, 0xf5, 0xda, 0xa2, 0x6a, + 0x24, 0x31, 0xba, 0x1b, 0xd2, 0xa4, 0x9f, 0xc3, 0x62, 0x6f, 0xf7, 0x3c, + 0xb1, 0xf7, 0x13, 0x7c, 0x8d, 0x3d, 0x98, 0xd6, 0x86, 0xd2, 0x70, 0x7d, + 0xc8, 0xec, 0x12, 0x84, 0x58, 0x63, 0x4a, 0x2c, 0x84, 0xdb, 0x5b, 0x0d, + 0xdd, 0x85, 0x97, 0x92, 0x36, 0x46, 0xf6, 0x47, 0x60, 0x49, 0xac, 0x0e, + 0x82, 0x4d, 0xec, 0x38, 0xf9, 0x12, 0x6c, 0x4d, 0x3d, 0xdf, 0x92, 0x34, + 0xeb, 0x73, 0x88, 0x8c, 0xb6, 0x27, 0x72, 0x2c, 0x9b, 0x6e, 0x46, 0x12, + 0x5c, 0x8b, 0x39, 0x23, 0x83, 0x2c, 0x89, 0x3e, 0xd8, 0x26, 0x72, 0x24, + 0x86, 0xb7, 0x68, 0x73, 0xb1, 0xec, 0x3a, 0x3b, 0x3a, 0xa2, 0x42, 0x3d, + 0xc5, 0xeb, 0x24, 0x90, 0xbd, 0x38, 0x5b, 0x92, 0xcb, 0x7d, 0x6b, 0xeb, + 0x43, 0xc2, 0xe8, 0x67, 0x61, 0x16, 0xf4, 0xd2, 0x94, 0xba, 0xdf, 0x45, + 0xb4, 0xb2, 0x34, 0x3a, 0xbe, 0x5f, 0x6f, 0x61, 0x6d, 0x58, 0x9d, 0x46, + 0x12, 0xb4, 0x5e, 0x4d, 0xc7, 0x6e, 0x4d, 0xb6, 0x1f, 0xd8, 0x6c, 0x69, + 0xc1, 0x61, 0x51, 0x3c, 0x26, 0x4b, 0x21, 0xba, 0xc8, 0x9a, 0x5b, 0x8d, + 0xb6, 0xb7, 0x1e, 0x30, 0xb7, 0x25, 0xf7, 0x36, 0x54, 0x35, 0x83, 0x73, + 0x2d, 0x88, 0x1f, 0x70, 0xe9, 0x06, 0x8b, 0x0a, 0x2f, 0x6f, 0x22, 0x3d, + 0xc3, 0x4e, 0xc2, 0x0a, 0xd6, 0x0c, 0x96, 0x30, 0x43, 0x70, 0x94, 0x42, + 0xb4, 0x71, 0x70, 0x5c, 0x54, 0xfe, 0xc2, 0x58, 0x12, 0x49, 0xe4, 0x4c, + 0xc1, 0xb4, 0xcb, 0x30, 0x26, 0x7c, 0x2a, 0x21, 0x52, 0x7c, 0x3c, 0x09, + 0x0b, 0xd3, 0x56, 0x58, 0x1a, 0x2e, 0x89, 0xb4, 0x2e, 0xf1, 0x23, 0xe8, + 0x5d, 0x0d, 0xc2, 0x09, 0x45, 0x5a, 0x09, 0xdf, 0xe0, 0x52, 0x97, 0x5f, + 0xa9, 0xf5, 0x32, 0x67, 0x48, 0xb8, 0x8a, 0x7b, 0x87, 0x55, 0x92, 0x42, + 0x5b, 0x07, 0x3b, 0x22, 0xbc, 0x1e, 0x41, 0x77, 0x07, 0xdd, 0x43, 0xe5, + 0x63, 0x58, 0xc7, 0x53, 0x94, 0x8a, 0x5f, 0x4f, 0x7b, 0x0e, 0xdc, 0x95, + 0x3f, 0x73, 0xee, 0xc6, 0xcf, 0x08, 0xd0, 0xae, 0x0f, 0x72, 0x78, 0x30, + 0x06, 0xa6, 0xc3, 0xce, 0x4d, 0x89, 0x30, 0x8c, 0x26, 0x48, 0x88, 0x92, + 0x0b, 0x63, 0x81, 0x65, 0x11, 0xdc, 0x99, 0x32, 0x99, 0x4a, 0x19, 0xde, + 0x8d, 0xa6, 0xa5, 0x31, 0xb0, 0x79, 0xd8, 0x48, 0x86, 0x92, 0x1c, 0x09, + 0x26, 0x84, 0xce, 0x1d, 0x26, 0x9a, 0x5f, 0xa8, 0xaf, 0x27, 0xda, 0x23, + 0xbd, 0x5f, 0x91, 0x2c, 0x2d, 0xae, 0xd2, 0xa1, 0x97, 0x14, 0x3d, 0x82, + 0xdc, 0x67, 0xe7, 0xf4, 0x83, 0xb8, 0xf7, 0x0c, 0x5f, 0x6a, 0x37, 0x3f, + 0xe9, 0x9f, 0xc1, 0xbf, 0x32, 0xfa, 0x17, 0x44, 0xb2, 0x79, 0x09, 0x77, + 0x38, 0x9b, 0xc4, 0x20, 0x2a, 0xb6, 0x26, 0x13, 0xec, 0xec, 0x21, 0x04, + 0xba, 0x17, 0x4a, 0x54, 0x5d, 0xe4, 0x3d, 0x81, 0xf4, 0xa6, 0x45, 0xf2, + 0x24, 0x23, 0xb9, 0x46, 0xc6, 0x6c, 0x0a, 0xe4, 0x68, 0x83, 0x1c, 0x98, + 0xe1, 0x89, 0xbb, 0x98, 0x89, 0x39, 0x12, 0x31, 0x3b, 0xfc, 0x0a, 0x52, + 0x97, 0x46, 0x93, 0xdc, 0x7b, 0xcb, 0x05, 0xac, 0x32, 0x7b, 0x68, 0x5e, + 0xe2, 0xae, 0xe7, 0xc7, 0xc9, 0x08, 0xfb, 0x0c, 0x69, 0xb0, 0x89, 0x4c, + 0xe0, 0x10, 0x9e, 0x83, 0x44, 0xad, 0x88, 0x1d, 0xb7, 0xd9, 0x67, 0xfe, + 0x18, 0x6e, 0x3b, 0xf2, 0x5d, 0xad, 0xb6, 0x27, 0x98, 0x57, 0xc0, 0x96, + 0x3b, 0x93, 0x94, 0x55, 0xb3, 0x14, 0xa9, 0x93, 0x15, 0x45, 0x96, 0x99, + 0x6b, 0xfe, 0xcd, 0xd4, 0x36, 0xc0, 0xb2, 0x99, 0x87, 0x87, 0xb8, 0xd5, + 0xdf, 0xfd, 0xfb, 0x1e, 0x52, 0x84, 0xca, 0x9c, 0x0a, 0xb3, 0x70, 0x2e, + 0xe1, 0xda, 0x8a, 0x13, 0x36, 0x53, 0xcd, 0x2a, 0x46, 0x37, 0x64, 0x6d, + 0xd1, 0xc7, 0x85, 0xb9, 0x5c, 0x11, 0xe0, 0x9b, 0x81, 0x7c, 0x1b, 0xf5, + 0xbe, 0xc6, 0x5b, 0xa5, 0x24, 0x42, 0x76, 0x59, 0x41, 0x8e, 0x07, 0xbf, + 0x86, 0xc9, 0xbf, 0xa0, 0xf6, 0xaf, 0xc4, 0x1f, 0x60, 0xfa, 0xbf, 0xd8, + 0xa5, 0x35, 0x78, 0x4f, 0xfe, 0x32, 0x6e, 0xfc, 0xab, 0xf5, 0x07, 0xb6, + 0x91, 0x8a, 0xed, 0x44, 0x70, 0x8c, 0x8a, 0x88, 0x24, 0x5b, 0x0e, 0x14, + 0x6d, 0xa2, 0x4c, 0x4c, 0xc4, 0x52, 0x10, 0x84, 0x27, 0x82, 0xa9, 0xc7, + 0xe8, 0x56, 0x8a, 0xd3, 0x1d, 0x84, 0xbe, 0x82, 0x61, 0x30, 0x9b, 0x91, + 0x28, 0x95, 0x95, 0x3f, 0x52, 0x95, 0x12, 0xe4, 0xf3, 0x68, 0x67, 0xb0, + 0xd3, 0x32, 0xf6, 0x2c, 0xdc, 0x4b, 0x86, 0x7a, 0x2e, 0x97, 0x25, 0x82, + 0x8d, 0x99, 0x3d, 0xf4, 0x0d, 0xfa, 0x57, 0xfc, 0x01, 0x84, 0xfa, 0xf4, + 0xdb, 0xfd, 0x0c, 0x33, 0xbf, 0xc7, 0xc6, 0xc6, 0x68, 0x43, 0xa7, 0x48, + 0x1b, 0x49, 0xce, 0x4b, 0x36, 0x26, 0x44, 0x53, 0x70, 0xc9, 0x58, 0xea, + 0x64, 0x59, 0x68, 0x45, 0x5a, 0x1c, 0x3a, 0xf7, 0x3c, 0xc1, 0x72, 0x9e, + 0xe2, 0x84, 0x66, 0x56, 0x9b, 0x2d, 0xc4, 0x92, 0x0e, 0xf7, 0x22, 0x0c, + 0xaa, 0x42, 0xdc, 0xe0, 0x59, 0xe0, 0xa5, 0x02, 0x88, 0xc4, 0xfc, 0x3f, + 0xdf, 0xec, 0x71, 0x60, 0xf6, 0x31, 0xfd, 0x0e, 0x26, 0x5e, 0x4f, 0xc2, + 0xb3, 0x98, 0x1f, 0x71, 0x44, 0xb4, 0x30, 0x24, 0xdb, 0x9e, 0x51, 0x2e, + 0xe2, 0xf6, 0x1e, 0x12, 0x38, 0x45, 0xf6, 0xd3, 0xbf, 0x25, 0x6f, 0x92, + 0x22, 0x21, 0x90, 0xdd, 0x64, 0x4b, 0x58, 0xd8, 0xb4, 0xa8, 0x87, 0xc8, + 0x92, 0x26, 0xb3, 0xa6, 0x61, 0x43, 0x8c, 0xbf, 0xc4, 0x9a, 0xa6, 0x42, + 0x05, 0xde, 0x26, 0x15, 0x3d, 0xb4, 0x86, 0xe3, 0x8d, 0x8a, 0x6c, 0x36, + 0xe5, 0x8d, 0xb8, 0x2b, 0x7b, 0xb1, 0x57, 0xb1, 0x12, 0x59, 0x2d, 0xd1, + 0x0d, 0xc5, 0x4c, 0x54, 0xa4, 0x33, 0x25, 0x54, 0x5a, 0x34, 0xfa, 0x24, + 0x2a, 0x63, 0x29, 0x60, 0xd6, 0x37, 0x81, 0x09, 0x7a, 0x1a, 0x30, 0x08, + 0x6d, 0xaf, 0xc1, 0xb5, 0xcf, 0xb3, 0x1c, 0xde, 0x5f, 0x71, 0x2b, 0x6b, + 0xe0, 0x6c, 0x61, 0x9f, 0x5f, 0xd0, 0xe2, 0x9f, 0x02, 0x37, 0xe1, 0xfc, + 0x21, 0x3d, 0xd9, 0xfd, 0x58, 0x93, 0xff, 0x00, 0xaf, 0xd9, 0xfe, 0x57, + 0xf6, 0x36, 0x3b, 0xfd, 0xbf, 0x63, 0x67, 0xfd, 0x3f, 0xd8, 0x93, 0xb7, + 0xde, 0xc6, 0xe7, 0x6b, 0xe5, 0x89, 0x3c, 0xbe, 0x59, 0xcb, 0x1f, 0xcb, + 0x12, 0x39, 0x7c, 0xb1, 0x25, 0x48, 0xf8, 0x3c, 0x4f, 0x82, 0x5b, 0x27, + 0xc0, 0x91, 0xb2, 0xfc, 0x2f, 0xd1, 0x0d, 0x93, 0xe0, 0x8b, 0x57, 0x9e, + 0x06, 0x5e, 0x52, 0x5f, 0x53, 0x38, 0x94, 0x7e, 0xac, 0x6e, 0x0a, 0xfb, + 0xb3, 0x6a, 0x06, 0x96, 0x2a, 0x6e, 0xb1, 0xec, 0x25, 0x5b, 0x89, 0x11, + 0x01, 0x52, 0x75, 0x8d, 0x3b, 0xb1, 0x36, 0xd8, 0x4b, 0xc1, 0x08, 0x24, + 0x3d, 0xc0, 0x91, 0x8d, 0x4d, 0xff, 0x00, 0x23, 0x81, 0x1d, 0x56, 0x35, + 0x9c, 0x1e, 0xfa, 0x32, 0x5d, 0x99, 0x38, 0x0d, 0x1c, 0x0a, 0xf7, 0x2d, + 0x94, 0x6f, 0x9e, 0xb6, 0xad, 0xd8, 0xd3, 0x81, 0xb8, 0x6b, 0xc6, 0xe2, + 0xad, 0xfd, 0x7a, 0x5e, 0x9d, 0xb5, 0xa5, 0x29, 0x4a, 0x27, 0x5b, 0x31, + 0xd3, 0xaf, 0x45, 0x1b, 0x94, 0x44, 0xdc, 0x7d, 0xa7, 0xbe, 0xa9, 0x0d, + 0x70, 0x60, 0x1e, 0x5e, 0x9b, 0x88, 0x61, 0xb8, 0xd7, 0x43, 0xf6, 0x19, + 0x61, 0x3c, 0x8d, 0xda, 0x2f, 0x09, 0x61, 0xf7, 0x8b, 0x72, 0x5b, 0x96, + 0x36, 0x6e, 0xcc, 0x91, 0x90, 0xc1, 0x8d, 0x1b, 0x9b, 0x99, 0x6c, 0xa8, + 0xdd, 0x2b, 0x80, 0x87, 0x23, 0x69, 0x66, 0x3d, 0xcf, 0x6f, 0xe4, 0xbe, + 0xdf, 0x62, 0x7b, 0x09, 0x48, 0x4a, 0xb4, 0xc4, 0xde, 0x45, 0x4b, 0x02, + 0xa7, 0x0d, 0xc7, 0x10, 0xbd, 0xc1, 0xab, 0x74, 0xc7, 0x16, 0xe2, 0x6b, + 0x87, 0xa5, 0x49, 0x74, 0xa9, 0x6e, 0x3d, 0xe3, 0x38, 0x4a, 0x6c, 0x68, + 0x5b, 0xda, 0x1b, 0x5a, 0x14, 0x5b, 0x74, 0x20, 0xe2, 0x25, 0x69, 0x61, + 0x6e, 0x35, 0x42, 0xc6, 0xad, 0x26, 0x26, 0xd6, 0xf9, 0x2e, 0x06, 0x35, + 0x7b, 0x10, 0x12, 0x8f, 0x24, 0x48, 0x95, 0x8d, 0xe6, 0x10, 0xdf, 0xe0, + 0x6d, 0xb7, 0xa6, 0x4a, 0xc7, 0x58, 0x94, 0xd6, 0x97, 0xa2, 0x97, 0xd3, + 0x85, 0x29, 0x74, 0xa8, 0xba, 0x8a, 0xb6, 0x3c, 0x02, 0x72, 0x16, 0xec, + 0xc0, 0xf1, 0x1b, 0x64, 0x21, 0x08, 0x4e, 0x4e, 0x04, 0x5d, 0xe4, 0x68, + 0xa1, 0xc9, 0x44, 0xcc, 0xb1, 0x32, 0xd1, 0x36, 0x8a, 0x6e, 0x6c, 0x54, + 0x86, 0x14, 0x36, 0x0d, 0x5e, 0xcc, 0xf7, 0x17, 0xdc, 0x6e, 0x50, 0x6d, + 0xcb, 0xf6, 0x6b, 0xf4, 0x38, 0xbf, 0xee, 0x76, 0x10, 0xe1, 0x7c, 0xb6, + 0xff, 0x00, 0x26, 0x4c, 0x91, 0x88, 0x70, 0xc0, 0x84, 0x8c, 0x4f, 0xb1, + 0x9c, 0x91, 0xf1, 0x31, 0x23, 0x1b, 0xe9, 0x9b, 0x43, 0x7e, 0xfa, 0x34, + 0x11, 0xec, 0x72, 0x19, 0xc1, 0x62, 0x54, 0xeb, 0x65, 0x46, 0x0c, 0xb6, + 0xee, 0x58, 0x3a, 0xbf, 0xb5, 0xfe, 0x8b, 0xa6, 0x2f, 0x6c, 0xbf, 0xd6, + 0x94, 0x6d, 0xf8, 0x23, 0x15, 0xe4, 0xb6, 0xec, 0x4b, 0xcb, 0x12, 0x84, + 0x8e, 0x04, 0xb4, 0xc8, 0x82, 0x2d, 0x1b, 0x63, 0xc9, 0x08, 0x64, 0xb9, + 0x33, 0x45, 0x87, 0x01, 0x2e, 0xc3, 0x21, 0x3b, 0x9b, 0x6c, 0x51, 0x5b, + 0x74, 0x57, 0x61, 0xf6, 0xbd, 0x28, 0xf0, 0x56, 0xb7, 0xd1, 0x04, 0x17, + 0x48, 0x4d, 0x33, 0xa5, 0x29, 0x4a, 0x52, 0x94, 0xf8, 0x33, 0xdd, 0x19, + 0xee, 0x8c, 0xf7, 0x46, 0x7b, 0x99, 0xee, 0x47, 0xdf, 0xec, 0x4f, 0x3f, + 0x62, 0x3b, 0x93, 0xb9, 0x93, 0xc8, 0xf6, 0xb2, 0xa7, 0x1a, 0x0f, 0x05, + 0xa5, 0x4c, 0xcf, 0x72, 0x11, 0x2e, 0x8c, 0x18, 0x21, 0x13, 0xc1, 0x03, + 0xba, 0x44, 0x91, 0x6d, 0x60, 0x24, 0x2a, 0x30, 0x42, 0x11, 0x99, 0x27, + 0x82, 0x09, 0xd3, 0x5c, 0x33, 0xc9, 0xa1, 0x05, 0xec, 0x2b, 0xb1, 0xec, + 0x3d, 0x87, 0xb0, 0x9e, 0xc4, 0x90, 0x47, 0xa9, 0x40, 0x00, 0x14, 0x90, + 0x41, 0x1a, 0x7d, 0xa7, 0xb4, 0xae, 0xc5, 0x7d, 0x8a, 0xfb, 0x19, 0xec, + 0x64, 0xcf, 0x45, 0x63, 0x65, 0x26, 0x88, 0xe4, 0x60, 0xd2, 0x1b, 0x48, + 0xba, 0x48, 0x70, 0x76, 0x74, 0x3c, 0xca, 0x99, 0xb9, 0x08, 0x42, 0x10, + 0xc9, 0x9e, 0xe5, 0xee, 0x1b, 0x7c, 0x91, 0x3e, 0x11, 0x3b, 0x09, 0xdb, + 0xa1, 0xee, 0x11, 0xdc, 0x9e, 0x49, 0xe7, 0xec, 0x41, 0x9e, 0xe7, 0xd4, + 0xfa, 0xa3, 0x3d, 0xd1, 0xf5, 0x47, 0xd5, 0x1f, 0x54, 0x56, 0x64, 0xc9, + 0x93, 0x26, 0x48, 0xc8, 0xcc, 0x91, 0x91, 0x91, 0x99, 0xee, 0x67, 0xb9, + 0x92, 0x9f, 0x41, 0xf4, 0x17, 0xd8, 0xfa, 0xa2, 0x79, 0x23, 0xbe, 0x83, + 0xca, 0x4e, 0xe3, 0x12, 0x5b, 0x12, 0xd8, 0x61, 0xb3, 0x29, 0x75, 0xa5, + 0x22, 0xca, 0xd7, 0x92, 0x3a, 0xc0, 0xfb, 0xc8, 0x79, 0x0f, 0x21, 0xe4, + 0x3c, 0x87, 0x90, 0xbd, 0xc5, 0xee, 0x2f, 0x71, 0x7b, 0x8b, 0xdc, 0x5e, + 0xe2, 0xf7, 0x17, 0xb8, 0xbd, 0xc5, 0xee, 0x2f, 0x71, 0x7b, 0x8b, 0xdc, + 0x5e, 0xe2, 0xf7, 0x17, 0xb8, 0xba, 0x0f, 0x21, 0xe4, 0x3c, 0x87, 0x90, + 0xf3, 0x9e, 0x6d, 0x2f, 0x31, 0xe6, 0xea, 0x80, 0x27, 0xb1, 0xed, 0xd3, + 0x65, 0x94, 0x56, 0xfa, 0x13, 0x14, 0x08, 0x5b, 0x72, 0xe6, 0x44, 0xef, + 0x20, 0x45, 0xa1, 0x9e, 0xe8, 0xcf, 0x74, 0x67, 0xc1, 0x5f, 0x83, 0x3e, + 0x0a, 0xca, 0xff, 0x00, 0xcc, 0xac, 0xac, 0xfa, 0x1f, 0x42, 0xf8, 0x3e, + 0x86, 0x7b, 0x69, 0xf4, 0x3e, 0x87, 0xd0, 0xfa, 0x7e, 0x0b, 0xe3, 0xf0, + 0x7f, 0xb8, 0xd3, 0xff, 0xc4, 0x00, 0x29, 0x10, 0x01, 0x00, 0x02, 0x01, + 0x03, 0x03, 0x04, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x10, 0x91, + 0xa1, 0xb1, 0xc1, 0xd1, 0xf0, 0xf1, 0xe1, 0x20, 0x30, 0x40, 0xff, 0xda, + 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x3f, 0x10, 0x85, 0x71, 0xf3, 0x1a, + 0xf4, 0x12, 0x58, 0xe9, 0x3c, 0xcb, 0xa9, 0x7f, 0xd5, 0x2c, 0x97, 0xe9, + 0x71, 0x4e, 0x25, 0xf4, 0x8f, 0x69, 0x64, 0xb2, 0x5a, 0x4b, 0xeb, 0x2f, + 0xac, 0xa7, 0xf3, 0x2c, 0x98, 0x98, 0xe6, 0x52, 0x59, 0xc4, 0xa7, 0x12, + 0xce, 0x22, 0x92, 0xce, 0x65, 0x9c, 0xca, 0xf3, 0x2b, 0xfc, 0x4a, 0xca, + 0xca, 0x74, 0x95, 0x95, 0x89, 0xe9, 0x29, 0xd2, 0x52, 0x23, 0xa4, 0xf0, + 0x94, 0xe0, 0x94, 0x38, 0x95, 0xe9, 0x29, 0x1f, 0xfc, 0xdb, 0xbc, 0x12, + 0xae, 0x93, 0x04, 0x2e, 0x9d, 0x26, 0x30, 0xab, 0x78, 0x87, 0x31, 0x0d, + 0x46, 0x21, 0xff, 0x00, 0x13, 0x03, 0x4e, 0x56, 0x3f, 0x11, 0xb3, 0x1e, + 0xf3, 0xf5, 0x3f, 0xd9, 0x7e, 0xa7, 0xdc, 0x15, 0xfa, 0x82, 0xf8, 0x84, + 0x86, 0x5f, 0x75, 0x4f, 0xd4, 0x3e, 0xab, 0xdd, 0xcd, 0xd8, 0xf7, 0xfd, + 0x90, 0xdb, 0xf2, 0xaf, 0xee, 0x07, 0xfa, 0xe0, 0x11, 0xd7, 0xfa, 0x52, + 0x8f, 0xca, 0x61, 0xff, 0x00, 0x1d, 0x02, 0xe5, 0xfe, 0xb6, 0x81, 0x7f, + 0x17, 0xc4, 0xa7, 0xf9, 0x3e, 0x27, 0xf8, 0xcf, 0xd4, 0xfe, 0x73, 0xf1, + 0x2b, 0x3f, 0xa3, 0xda, 0x1f, 0xf1, 0x93, 0xfc, 0x77, 0xea, 0x57, 0xfa, + 0x93, 0xfc, 0xe7, 0xea, 0x1f, 0xf2, 0x90, 0x6f, 0xd5, 0x86, 0xdf, 0xb1, + 0x9f, 0xe7, 0xe7, 0xf9, 0x79, 0xfe, 0x4e, 0x7f, 0x83, 0x9f, 0xe7, 0xe1, + 0xff, 0x00, 0x3b, 0x3f, 0xce, 0xcb, 0x63, 0xff, 0x00, 0x37, 0x0f, 0xf9, + 0xf9, 0xfe, 0x1e, 0x7f, 0x9f, 0xfd, 0x4f, 0xf2, 0xf2, 0x93, 0x3e, 0xce, + 0x5b, 0xfa, 0x32, 0xad, 0x7d, 0x8c, 0x7f, 0xe2, 0x7f, 0x52, 0x9f, 0xd5, + 0xfd, 0x4f, 0xf1, 0xf2, 0xef, 0xd0, 0xfd, 0x45, 0xbf, 0x43, 0xf5, 0x1f, + 0xd8, 0xfe, 0x89, 0xfc, 0x87, 0xe2, 0x75, 0xff, 0x00, 0xeb, 0x89, 0x6e, + 0xe4, 0x16, 0x32, 0x7f, 0xc7, 0x12, 0xdf, 0xd2, 0xfd, 0x4b, 0x1a, 0xf6, + 0xcc, 0x45, 0xcf, 0xb2, 0x8a, 0xca, 0xb6, 0xbe, 0x11, 0x23, 0xf8, 0xdb, + 0xfb, 0x44, 0x5a, 0x87, 0xa7, 0xee, 0x9a, 0x17, 0x67, 0x39, 0xee, 0xfa, + 0x0c, 0x30, 0xbd, 0x2e, 0x4b, 0xb6, 0x83, 0x76, 0xc8, 0x94, 0xd6, 0x91, + 0xd4, 0x5d, 0xde, 0x27, 0x07, 0xfa, 0x33, 0xfd, 0xf9, 0xfe, 0xb4, 0xff, + 0x00, 0x42, 0x2d, 0xb3, 0xde, 0x65, 0xd1, 0xef, 0x2f, 0xd9, 0x3a, 0x49, + 0x5f, 0xf5, 0x29, 0xc9, 0x29, 0xcc, 0xaf, 0x32, 0x9c, 0xca, 0xca, 0xb2, + 0x90, 0xf4, 0xde, 0xaf, 0x4e, 0x52, 0xd6, 0x5c, 0xbb, 0x97, 0x2e, 0x5c, + 0xcc, 0xb9, 0x6c, 0xb6, 0x5b, 0x2f, 0xd1, 0x6c, 0xb7, 0x78, 0x36, 0xea, + 0x12, 0xfa, 0xcb, 0x79, 0x8d, 0xcc, 0xfa, 0x52, 0xe9, 0x2a, 0x1d, 0x53, + 0xba, 0x5b, 0xff, 0x00, 0x02, 0xcb, 0xbc, 0xbf, 0x30, 0xef, 0x97, 0xeb, + 0x2f, 0xd6, 0x30, 0xa8, 0xa4, 0xa2, 0x21, 0xcc, 0x52, 0xe3, 0xbe, 0x6e, + 0x58, 0xf3, 0x31, 0xba, 0x9c, 0x86, 0x22, 0xdf, 0x59, 0x4e, 0x10, 0xb9, + 0x6d, 0x28, 0xae, 0x92, 0xad, 0xdf, 0x68, 0x59, 0xac, 0xa1, 0xce, 0x20, + 0xdb, 0x44, 0xb7, 0xc4, 0xb1, 0xc6, 0x25, 0xba, 0xac, 0x5d, 0xea, 0x90, + 0x51, 0x6d, 0x6f, 0xe2, 0x01, 0xbc, 0xae, 0xe4, 0xee, 0xb9, 0x7d, 0xf0, + 0x74, 0x54, 0x1e, 0x8f, 0x4c, 0xde, 0x92, 0xae, 0x38, 0x4a, 0x6a, 0x64, + 0xca, 0xc1, 0x50, 0x77, 0x08, 0xf2, 0xf1, 0x0b, 0xb4, 0xb2, 0x97, 0xcc, + 0xbb, 0xff, 0x00, 0x26, 0x1d, 0x6e, 0x07, 0x56, 0x15, 0xcb, 0xe6, 0x54, + 0x1a, 0x97, 0xcf, 0xee, 0x51, 0x17, 0x68, 0x1f, 0xd5, 0x12, 0xf2, 0xe6, + 0x59, 0xc4, 0x5e, 0x91, 0x0e, 0xd2, 0xbb, 0xcd, 0xe2, 0x5e, 0x84, 0x70, + 0xe6, 0x59, 0x1c, 0xba, 0x4f, 0x29, 0xab, 0x56, 0xa6, 0xf8, 0x5e, 0xd0, + 0xb3, 0x69, 0x56, 0x94, 0xc4, 0x6b, 0xfe, 0xc4, 0x31, 0xf9, 0x81, 0xac, + 0xfc, 0xc5, 0x9e, 0x25, 0x47, 0x0f, 0x78, 0x84, 0xa8, 0xe1, 0x9b, 0x3c, + 0x0b, 0xfb, 0xd1, 0x9a, 0x94, 0x99, 0x3d, 0xfa, 0x91, 0x77, 0x41, 0xf3, + 0x2e, 0x2c, 0x56, 0x66, 0x5b, 0x33, 0xcc, 0x39, 0x18, 0x72, 0x2b, 0xbc, + 0xa7, 0xf6, 0x4e, 0xb7, 0xde, 0x55, 0xfb, 0xa1, 0xc9, 0x81, 0x83, 0x92, + 0x07, 0x17, 0x88, 0x26, 0xb8, 0x89, 0x8d, 0x11, 0x20, 0xd9, 0xa9, 0x06, + 0x5c, 0xb9, 0x72, 0xfa, 0xcb, 0x97, 0xe9, 0x6b, 0x2e, 0xf7, 0xf5, 0xb9, + 0x51, 0x33, 0x0f, 0x45, 0x4f, 0x12, 0xba, 0x4a, 0x26, 0x88, 0x7a, 0x35, + 0x9d, 0x9e, 0x82, 0xe4, 0xaf, 0xa4, 0xc6, 0x76, 0xc7, 0x2f, 0x42, 0x65, + 0x53, 0x48, 0xdf, 0x69, 0x66, 0xd1, 0x53, 0x03, 0x12, 0xd9, 0x46, 0xdb, + 0xa2, 0xde, 0xd7, 0x78, 0x34, 0xd0, 0xa5, 0x48, 0xf1, 0x10, 0xfc, 0x23, + 0xc5, 0x30, 0x16, 0x37, 0x2c, 0x6c, 0xcf, 0xec, 0x45, 0x61, 0xbe, 0x85, + 0x15, 0x54, 0xb8, 0xe2, 0xca, 0x52, 0xd1, 0x8a, 0x0d, 0x3e, 0x25, 0x43, + 0x88, 0x16, 0xdf, 0x12, 0xe3, 0x93, 0xcc, 0xcb, 0x68, 0xa9, 0x71, 0x9a, + 0xf4, 0x95, 0xe2, 0x32, 0x63, 0xac, 0xa0, 0xf5, 0x8e, 0x17, 0x73, 0xca, + 0x61, 0x39, 0x3f, 0x04, 0xda, 0x02, 0xc0, 0xa8, 0xae, 0x1d, 0x60, 0xdf, + 0xfb, 0x0f, 0xeb, 0x94, 0xf7, 0xf4, 0x7f, 0xb1, 0x2f, 0x7b, 0x87, 0x61, + 0x32, 0x9b, 0x6b, 0xef, 0x01, 0x67, 0x5c, 0x4d, 0x38, 0x99, 0xcb, 0xe9, + 0x14, 0xbe, 0xb1, 0x73, 0xa6, 0x26, 0x94, 0xfa, 0x22, 0x19, 0x9b, 0x3a, + 0x0c, 0x22, 0x85, 0x3d, 0x08, 0xa3, 0x0d, 0xe6, 0xa1, 0x1a, 0x1f, 0x2c, + 0xa5, 0x85, 0x1b, 0xa0, 0x3c, 0x44, 0xba, 0xbc, 0x04, 0xbb, 0x5f, 0x1b, + 0x14, 0xe6, 0xbe, 0xe8, 0x8f, 0xdd, 0x15, 0xdc, 0xf7, 0x67, 0x32, 0xbe, + 0x66, 0x1f, 0xda, 0x34, 0xea, 0xcb, 0x8c, 0xb6, 0x70, 0xc1, 0xbb, 0xd9, + 0x86, 0x34, 0x9b, 0x21, 0xa1, 0x19, 0xfa, 0xd4, 0x25, 0x4f, 0x3e, 0x97, + 0xa7, 0xa5, 0xcb, 0x97, 0x2e, 0x5f, 0x9f, 0xfc, 0x3e, 0x89, 0x73, 0x7a, + 0x9a, 0x52, 0x87, 0xd0, 0x33, 0x5a, 0x3d, 0xd0, 0x8b, 0x54, 0xe9, 0x16, + 0x5e, 0x65, 0xcd, 0x12, 0xfd, 0x03, 0xd6, 0x5f, 0xa6, 0x7d, 0x2a, 0x7c, + 0x4c, 0x74, 0x98, 0xb9, 0x7d, 0x26, 0x67, 0x8a, 0xf4, 0xcc, 0xae, 0x92, + 0xba, 0x4a, 0x20, 0x7a, 0x2b, 0xd1, 0x79, 0x79, 0x77, 0x68, 0x37, 0x15, + 0x17, 0xd4, 0xf8, 0x89, 0x83, 0x4f, 0x04, 0x14, 0x40, 0x74, 0x7e, 0xa8, + 0x85, 0x14, 0x07, 0x74, 0xfc, 0x51, 0x43, 0x41, 0xde, 0x63, 0xe5, 0x19, + 0x57, 0xb0, 0xc5, 0x98, 0x53, 0x78, 0xc8, 0xfa, 0xbc, 0x9f, 0x84, 0x4e, + 0x45, 0xd9, 0xa6, 0x1d, 0x6f, 0x56, 0x0a, 0x2e, 0x78, 0x3f, 0x31, 0xff, + 0x00, 0x88, 0xfd, 0xc6, 0x9c, 0x7b, 0x3f, 0xdc, 0x1e, 0x8f, 0xfb, 0xde, + 0x6d, 0x8f, 0x9f, 0xfa, 0x87, 0xbf, 0x3c, 0xc8, 0x7d, 0x47, 0x94, 0xfc, + 0x4f, 0xab, 0x33, 0x98, 0x07, 0x62, 0xfe, 0x60, 0xad, 0xbf, 0x6b, 0x7d, + 0x40, 0xdf, 0x3e, 0x93, 0x0e, 0xa3, 0xc7, 0xa1, 0x77, 0xa1, 0x0d, 0xb4, + 0x26, 0x2b, 0xda, 0x21, 0x8a, 0x89, 0xde, 0x35, 0x8d, 0x7a, 0x46, 0x13, + 0xa4, 0x1b, 0x82, 0x5f, 0x13, 0x99, 0x8a, 0xda, 0xe6, 0x07, 0x98, 0x56, + 0xed, 0x4c, 0x9b, 0x9a, 0xb2, 0x4a, 0x21, 0x7e, 0x27, 0xf6, 0x25, 0xaf, + 0x49, 0x7e, 0x61, 0x48, 0x95, 0xda, 0x30, 0x45, 0xd9, 0x15, 0x03, 0x91, + 0x66, 0x2f, 0x37, 0x06, 0x31, 0x75, 0x07, 0x2a, 0xe0, 0xdb, 0x1d, 0x15, + 0x16, 0xca, 0x75, 0x65, 0xef, 0x12, 0xdd, 0xe1, 0xc6, 0xf1, 0x75, 0xde, + 0x5a, 0xb3, 0x88, 0xbd, 0xa7, 0x8d, 0x4f, 0x94, 0x7d, 0xb2, 0xff, 0x00, + 0xf2, 0x2c, 0x03, 0xda, 0x01, 0x9c, 0x62, 0x51, 0x28, 0xe3, 0x32, 0xcc, + 0x4b, 0xbe, 0xf0, 0xd1, 0x32, 0x96, 0x9d, 0x9d, 0xa3, 0xa2, 0x44, 0xa4, + 0xe1, 0x81, 0x8f, 0x5b, 0x8f, 0x44, 0xbf, 0x42, 0x5c, 0xba, 0xf5, 0x2d, + 0x97, 0x2e, 0x0f, 0xa5, 0xcb, 0x8f, 0xa8, 0x6a, 0xd0, 0x7a, 0x30, 0x18, + 0x16, 0x72, 0x40, 0x4d, 0x84, 0xb4, 0xb9, 0x72, 0xe5, 0xcb, 0xeb, 0x7e, + 0x94, 0xc0, 0x65, 0x32, 0xa5, 0x30, 0x25, 0x4a, 0x95, 0x98, 0x10, 0x2e, + 0x55, 0xca, 0x95, 0x70, 0xb4, 0x24, 0xbe, 0xd1, 0x80, 0x5f, 0x09, 0xb0, + 0x18, 0x5b, 0xee, 0xa8, 0xf9, 0x97, 0x55, 0xb5, 0x2b, 0xbc, 0x04, 0xf9, + 0x89, 0x0f, 0x30, 0x3f, 0x92, 0xbf, 0x52, 0xbd, 0x35, 0xbd, 0x67, 0xc0, + 0x84, 0x84, 0xa6, 0xf6, 0xbd, 0xed, 0x09, 0x0e, 0x34, 0x3e, 0x90, 0x80, + 0xd8, 0x76, 0x20, 0x2f, 0x04, 0xed, 0x9d, 0x91, 0xe9, 0x9d, 0x0d, 0xa6, + 0x5b, 0x62, 0x22, 0xf4, 0xc4, 0xed, 0xcc, 0x6c, 0xc4, 0xd4, 0x7a, 0x71, + 0x13, 0xa1, 0x18, 0x76, 0x6b, 0x2c, 0xb9, 0xd4, 0xb9, 0xe0, 0xa8, 0x0e, + 0xa1, 0x87, 0xa7, 0x62, 0x58, 0x1e, 0x3b, 0xd1, 0xf8, 0x4b, 0xb5, 0x8e, + 0xf7, 0xdc, 0xb4, 0x44, 0xe3, 0xf2, 0x48, 0x72, 0x86, 0x6f, 0xf8, 0x18, + 0x98, 0xee, 0x51, 0x2f, 0xe1, 0x4d, 0xa3, 0x8c, 0x52, 0xe2, 0x9b, 0x4a, + 0x63, 0x88, 0xc5, 0xf2, 0xfa, 0x72, 0x48, 0xae, 0xaa, 0x6f, 0x89, 0x93, + 0x09, 0xc3, 0x99, 0x52, 0xa2, 0x85, 0x6d, 0x01, 0xd1, 0x8f, 0x94, 0xae, + 0x13, 0xd5, 0x86, 0x9a, 0x12, 0xb8, 0x79, 0x49, 0x6b, 0x57, 0xe8, 0xa6, + 0xa2, 0x5a, 0xe3, 0x94, 0xc4, 0x66, 0xbf, 0xc4, 0x6d, 0x18, 0xbc, 0xc7, + 0xae, 0x23, 0xde, 0x53, 0x50, 0x5a, 0x90, 0x11, 0x73, 0x1b, 0x4c, 0x0e, + 0x93, 0x2b, 0xdb, 0xa4, 0xce, 0xba, 0x4c, 0xf4, 0xf4, 0x10, 0x3a, 0xf7, + 0x1d, 0x18, 0x8c, 0xa4, 0x95, 0x29, 0x8e, 0x9e, 0x9b, 0x4a, 0xff, 0x00, + 0xd3, 0x16, 0x66, 0xe5, 0xc5, 0x8b, 0x2f, 0x12, 0x9b, 0x96, 0x49, 0x68, + 0x3d, 0x86, 0x09, 0x53, 0x5b, 0x90, 0x50, 0x61, 0x89, 0xda, 0xa6, 0x53, + 0xb3, 0x26, 0x6a, 0x03, 0xbb, 0x83, 0xec, 0xf7, 0xa2, 0x01, 0xaa, 0x3b, + 0xfe, 0xc8, 0x1e, 0xbe, 0x1b, 0x47, 0xf6, 0xb4, 0x4f, 0xf7, 0xa3, 0xac, + 0x2e, 0xee, 0x6a, 0x21, 0xdc, 0x89, 0x62, 0x27, 0xb4, 0x4f, 0x68, 0x94, + 0x55, 0xb4, 0xb1, 0xb4, 0xbc, 0x5b, 0x88, 0x3e, 0x25, 0xad, 0x2e, 0x17, + 0x16, 0xaa, 0xf0, 0xfd, 0x0f, 0x79, 0x65, 0x5b, 0xa9, 0x47, 0xe2, 0xc7, + 0xcc, 0x5c, 0x8f, 0x94, 0x45, 0xfb, 0x7e, 0x66, 0xce, 0xb1, 0xf6, 0xc1, + 0x80, 0x68, 0xa0, 0x6c, 0x4e, 0x9c, 0x3a, 0x21, 0x25, 0x5d, 0x2e, 0x5d, + 0xda, 0x76, 0xe3, 0xb4, 0xd3, 0xd2, 0x3d, 0x31, 0xc3, 0x98, 0xad, 0xc8, + 0xd2, 0x63, 0x78, 0xf7, 0x8b, 0xc4, 0x47, 0x15, 0x3a, 0x31, 0x7c, 0x45, + 0xe2, 0xe3, 0x5d, 0x09, 0xc8, 0x41, 0xe2, 0x61, 0x71, 0x19, 0xe8, 0x4a, + 0x25, 0x12, 0xfd, 0xa5, 0xac, 0x1f, 0x45, 0x32, 0xd6, 0xc2, 0xe1, 0xea, + 0x85, 0xe8, 0xfc, 0x69, 0x3a, 0xa9, 0xa6, 0x21, 0xa1, 0x16, 0xc2, 0xa3, + 0x6c, 0x95, 0xed, 0xe8, 0xb9, 0x1f, 0x09, 0x75, 0xac, 0x59, 0x69, 0xbd, + 0xcc, 0xa6, 0x28, 0x03, 0xb7, 0x59, 0x83, 0x3e, 0x59, 0x5a, 0xd6, 0x6a, + 0x66, 0x2a, 0x6f, 0xcd, 0xc4, 0x74, 0x71, 0xec, 0x44, 0xa9, 0x52, 0x8d, + 0xdf, 0x68, 0x8d, 0xa2, 0xee, 0x5d, 0x96, 0x97, 0x2e, 0x5d, 0xe2, 0x75, + 0x9a, 0x32, 0xfc, 0x4a, 0x89, 0x98, 0x16, 0xeb, 0x0c, 0x4b, 0x34, 0x8b, + 0xd2, 0x2c, 0x33, 0x99, 0x57, 0x50, 0x31, 0x3f, 0x8c, 0xb3, 0x2c, 0xca, + 0x9d, 0xdc, 0x2f, 0xda, 0x52, 0x24, 0xa4, 0xa2, 0x21, 0x10, 0x89, 0xea, + 0xfa, 0xbe, 0xba, 0xca, 0x84, 0x0a, 0x0d, 0xda, 0x68, 0x69, 0x94, 0xf4, + 0xce, 0x29, 0x9e, 0xe1, 0x2d, 0x80, 0xbc, 0x2f, 0xc5, 0xdf, 0xc4, 0x38, + 0x0f, 0xb8, 0xa7, 0xd1, 0x28, 0x16, 0x37, 0x08, 0xfb, 0x61, 0x75, 0x51, + 0xcf, 0xf6, 0x42, 0x82, 0x03, 0x96, 0x7d, 0x54, 0xa8, 0xb3, 0xdd, 0xf6, + 0x31, 0xcc, 0x5b, 0xd4, 0x43, 0xe8, 0x7f, 0x9e, 0x25, 0x7a, 0x40, 0xe0, + 0x0f, 0xc4, 0x59, 0x7d, 0x45, 0x1f, 0xd4, 0x70, 0x10, 0x3d, 0x47, 0xa4, + 0x1f, 0x43, 0xbf, 0x6c, 0x13, 0x1f, 0xd4, 0xdc, 0x84, 0x7b, 0xa3, 0x90, + 0x6b, 0x92, 0xfe, 0xec, 0x43, 0xdb, 0x9f, 0xef, 0x85, 0x83, 0xb4, 0x9e, + 0xd7, 0x5e, 0xc9, 0x50, 0x69, 0xad, 0x6a, 0xb0, 0xf9, 0xb8, 0x64, 0x05, + 0xce, 0x25, 0xd2, 0xe9, 0x0e, 0xdc, 0xdd, 0x6f, 0x7b, 0x0a, 0x22, 0x53, + 0xef, 0xf9, 0xc8, 0x28, 0x23, 0x50, 0x9f, 0x80, 0xbf, 0x98, 0x9a, 0x06, + 0x85, 0x5f, 0xcd, 0x98, 0x70, 0x6b, 0x00, 0x28, 0x97, 0x9a, 0x4e, 0x84, + 0xbf, 0x69, 0xd1, 0x99, 0x34, 0x9b, 0x95, 0x30, 0x69, 0x34, 0x31, 0x0b, + 0xed, 0x0e, 0x88, 0x5f, 0x6b, 0x8f, 0x45, 0x4d, 0x15, 0x51, 0x0d, 0xbc, + 0x45, 0xc5, 0x15, 0x10, 0xda, 0x2e, 0xac, 0x26, 0xed, 0x46, 0x19, 0xe8, + 0xca, 0x71, 0x3a, 0x1e, 0x8d, 0x5c, 0xcc, 0x35, 0x59, 0xeb, 0x35, 0x71, + 0xe8, 0x70, 0x7a, 0x2b, 0x53, 0x5b, 0xd1, 0xd5, 0xc4, 0xe4, 0x81, 0x9b, + 0x23, 0xb5, 0x2d, 0x84, 0x7d, 0xb7, 0x2f, 0xc3, 0xd9, 0x85, 0x4c, 0xec, + 0x23, 0x1b, 0x4a, 0x9c, 0x92, 0xfd, 0x08, 0xbc, 0x46, 0x33, 0x4c, 0x50, + 0xdd, 0x31, 0x66, 0x08, 0x60, 0x8b, 0x7d, 0x04, 0x09, 0x9c, 0x4a, 0xe1, + 0x1d, 0x65, 0x31, 0x2e, 0xe0, 0x9a, 0xab, 0xf4, 0x18, 0xb2, 0xd3, 0xd5, + 0xe2, 0x33, 0x2b, 0x6b, 0x32, 0x0b, 0x88, 0x83, 0x73, 0x12, 0xae, 0x04, + 0xab, 0x8c, 0x26, 0x92, 0xbd, 0x14, 0x0c, 0xae, 0x63, 0xe8, 0x9c, 0x26, + 0x52, 0xe9, 0x15, 0xb1, 0x89, 0x6f, 0x3d, 0x60, 0xa1, 0xd1, 0x30, 0x31, + 0x32, 0xea, 0x95, 0x6c, 0xc4, 0xa1, 0x61, 0x9a, 0x74, 0x8f, 0x0b, 0x1e, + 0x36, 0x3c, 0x51, 0x0d, 0xa5, 0x89, 0x73, 0x69, 0xd9, 0x19, 0x7a, 0x25, + 0x47, 0xd1, 0x95, 0x72, 0x96, 0x0d, 0x8f, 0xb2, 0xe0, 0xab, 0x5a, 0x95, + 0x9e, 0xe3, 0xa1, 0xe6, 0x05, 0x15, 0x2e, 0xca, 0x5d, 0xcc, 0x3e, 0x61, + 0xc0, 0xfc, 0x87, 0xbd, 0x2b, 0xf2, 0x42, 0x81, 0x0c, 0x07, 0xe6, 0x1f, + 0x98, 0xa9, 0x00, 0x1a, 0x07, 0xa4, 0x3c, 0xc2, 0x43, 0x01, 0x00, 0xc2, + 0xdb, 0x42, 0xaa, 0x0d, 0x4c, 0x10, 0xdc, 0xb1, 0x41, 0xe2, 0x29, 0x93, + 0xeb, 0x59, 0x71, 0xe9, 0xdb, 0x2f, 0x9d, 0x0c, 0x4c, 0xb2, 0xfe, 0xb3, + 0x1e, 0x93, 0xfa, 0x7d, 0x1c, 0x7a, 0x4b, 0xf6, 0xc4, 0xc5, 0x82, 0x59, + 0xb4, 0x6e, 0xd3, 0x06, 0x93, 0xa1, 0x50, 0x30, 0x27, 0xfc, 0x95, 0xe9, + 0xe2, 0x27, 0x8c, 0x44, 0xd1, 0x8a, 0x9a, 0xb8, 0xc4, 0xb7, 0x68, 0xb5, + 0x1c, 0x08, 0x78, 0xa8, 0x19, 0xc4, 0xe9, 0xfa, 0x36, 0xe5, 0x82, 0x4d, + 0x6e, 0x26, 0x3a, 0x71, 0x29, 0xd2, 0x7b, 0x13, 0xdb, 0xf4, 0xeb, 0xff, + 0x00, 0xc8, 0xf0, 0xe9, 0x04, 0x72, 0xab, 0x5d, 0x97, 0x53, 0xcc, 0x4a, + 0x3f, 0x4a, 0x5a, 0xf3, 0x71, 0xdc, 0xfd, 0x82, 0x2f, 0xf4, 0x74, 0x09, + 0xcf, 0x78, 0x7e, 0x21, 0xc5, 0x7b, 0xfe, 0xd8, 0x73, 0x1e, 0x87, 0xf9, + 0x94, 0x72, 0xfe, 0x79, 0x8a, 0x16, 0x53, 0xfb, 0xe6, 0x09, 0xf1, 0x3f, + 0x74, 0xd3, 0x3b, 0xf7, 0xf3, 0x0a, 0x9c, 0x95, 0xe8, 0x69, 0x82, 0x2d, + 0x84, 0xc7, 0x3f, 0x08, 0x4f, 0x87, 0x00, 0xd4, 0x59, 0x05, 0xba, 0x13, + 0x0d, 0xc4, 0x90, 0x5a, 0x55, 0xf6, 0x31, 0x82, 0xc2, 0xec, 0xcd, 0xe4, + 0x58, 0x8c, 0x1b, 0xd6, 0x5d, 0x5c, 0x1c, 0x4b, 0xd6, 0x5c, 0xab, 0xda, + 0x02, 0xb0, 0xd5, 0x0e, 0x98, 0x5b, 0xd0, 0x74, 0x43, 0xa2, 0x2a, 0x62, + 0x09, 0xda, 0x62, 0xd1, 0x96, 0xce, 0x20, 0xf8, 0x87, 0x17, 0xc4, 0xe9, + 0x31, 0x52, 0xb1, 0x71, 0x3a, 0xda, 0xa4, 0x3b, 0xdc, 0xea, 0x3e, 0x80, + 0x97, 0x59, 0x0e, 0x3f, 0x55, 0x31, 0x77, 0x0f, 0xe3, 0x51, 0xd0, 0xf5, + 0x6a, 0xaf, 0xca, 0x43, 0x2e, 0xfa, 0x67, 0xd6, 0x7f, 0xa8, 0x21, 0x21, + 0xfa, 0x9c, 0x0d, 0x4f, 0x67, 0xaf, 0xf7, 0x12, 0x7a, 0x88, 0xfd, 0xac, + 0x7c, 0x23, 0x3d, 0x27, 0xaf, 0xbe, 0x21, 0x36, 0xa8, 0xbd, 0xa5, 0x11, + 0xf4, 0x06, 0xc5, 0x7c, 0xb4, 0x82, 0x3a, 0x04, 0x72, 0xf5, 0x2e, 0xcd, + 0xa7, 0x42, 0xe3, 0xca, 0x41, 0xdf, 0xdf, 0x59, 0x3a, 0x1f, 0xb0, 0xc1, + 0x6f, 0xf4, 0x27, 0x60, 0x13, 0x46, 0x23, 0xd7, 0x33, 0x84, 0x72, 0x84, + 0x12, 0x3a, 0x85, 0x61, 0x39, 0x60, 0x79, 0x85, 0x9d, 0x61, 0x02, 0x97, + 0x9a, 0x89, 0xe7, 0xe9, 0x37, 0x07, 0xaf, 0x85, 0x4b, 0x39, 0x83, 0xc4, + 0xd0, 0xc7, 0xa3, 0xa1, 0x7e, 0x8d, 0x89, 0x88, 0x18, 0xc4, 0x0e, 0x25, + 0x75, 0x88, 0xaf, 0x44, 0x4b, 0x31, 0xef, 0x15, 0x64, 0xbb, 0x56, 0xa5, + 0x02, 0xcf, 0x04, 0xac, 0xd5, 0x7a, 0xd4, 0xe3, 0x5e, 0x59, 0x6b, 0x19, + 0xc1, 0x78, 0x77, 0x81, 0x7a, 0x11, 0x17, 0x02, 0xba, 0x4a, 0xcd, 0x26, + 0x47, 0x04, 0xc8, 0xd1, 0x0b, 0x8a, 0xf4, 0xeb, 0x95, 0x4a, 0x36, 0xf4, + 0x35, 0x31, 0x3a, 0x12, 0x99, 0xd1, 0xf4, 0x84, 0xe9, 0x7a, 0x46, 0xbd, + 0x7d, 0x71, 0x4c, 0xfa, 0xcb, 0xef, 0x11, 0xe8, 0x4c, 0xfa, 0x30, 0x8e, + 0x1e, 0x86, 0x5a, 0xc6, 0x00, 0x1c, 0x17, 0xb4, 0xa8, 0xb5, 0x00, 0xb1, + 0x1d, 0x86, 0x99, 0x47, 0xf2, 0x29, 0xad, 0x67, 0x84, 0xfc, 0xc7, 0x4d, + 0x5a, 0xba, 0x3d, 0xcd, 0x78, 0x97, 0x46, 0x1c, 0x33, 0xc3, 0x67, 0xc4, + 0xb0, 0x78, 0x03, 0xdb, 0xd8, 0xfa, 0x97, 0x83, 0x9b, 0x9d, 0xfb, 0x51, + 0xf6, 0x9b, 0x2a, 0x3a, 0xb1, 0xf7, 0xd6, 0x28, 0xa4, 0x4e, 0xf0, 0x82, + 0x08, 0xd1, 0x33, 0x85, 0x75, 0x84, 0x9d, 0x12, 0xcd, 0x08, 0x65, 0x3b, + 0xa1, 0x64, 0x17, 0x59, 0x46, 0x3e, 0x23, 0xe5, 0x37, 0x7a, 0xca, 0xca, + 0xe8, 0x7e, 0xb8, 0xff, 0x00, 0xb5, 0x90, 0x3c, 0x7e, 0x0c, 0x79, 0x33, + 0xbb, 0xfe, 0x05, 0x3d, 0xe0, 0xb1, 0xb8, 0xe4, 0xfe, 0x04, 0x3e, 0x95, + 0xfc, 0x19, 0x8b, 0x12, 0x3d, 0x1f, 0xe5, 0x40, 0xc3, 0x0d, 0x17, 0x7e, + 0x0c, 0x57, 0x56, 0xef, 0xff, 0x00, 0xcb, 0xac, 0x02, 0xf9, 0x98, 0x54, + 0x12, 0x14, 0x3b, 0x30, 0x42, 0xc9, 0xbb, 0x0c, 0xef, 0x99, 0x9e, 0xb2, + 0xd1, 0x79, 0xa2, 0x0f, 0x10, 0x38, 0x33, 0x58, 0x34, 0xf1, 0x84, 0x21, + 0x75, 0x74, 0x2c, 0xed, 0x68, 0x7c, 0x31, 0xff, 0x00, 0x0d, 0x15, 0xab, + 0xc0, 0x45, 0x89, 0x52, 0xc2, 0xc7, 0xb6, 0x9e, 0x59, 0xe9, 0x05, 0x52, + 0x15, 0xef, 0x5a, 0xcf, 0x83, 0x11, 0xf4, 0xda, 0x46, 0x29, 0x19, 0x3d, + 0x02, 0x7a, 0xe9, 0x85, 0xe1, 0x06, 0x7f, 0xf8, 0x02, 0xd9, 0x9f, 0xd7, + 0x9c, 0x76, 0xe6, 0x0c, 0xf3, 0x19, 0xf4, 0x69, 0xaf, 0x4e, 0xd9, 0x62, + 0x4d, 0xda, 0x9d, 0x29, 0x8a, 0x0f, 0x13, 0x37, 0x33, 0xa7, 0x05, 0x9c, + 0x47, 0xc4, 0xf0, 0xc1, 0x0c, 0x90, 0x83, 0x48, 0x07, 0xa4, 0x07, 0xa2, + 0x92, 0xb1, 0x2c, 0xa4, 0x0d, 0x65, 0x97, 0x89, 0x5e, 0xd3, 0x2e, 0x09, + 0xd1, 0x80, 0x3a, 0x66, 0x74, 0xe5, 0x3b, 0x45, 0x73, 0x2a, 0xda, 0x74, + 0xe6, 0xa4, 0xa9, 0x7d, 0x1a, 0xee, 0x0a, 0x9a, 0x65, 0x38, 0xf4, 0x9d, + 0x6e, 0x1a, 0x86, 0x38, 0xe2, 0x8e, 0xa2, 0xa9, 0xa9, 0xbf, 0xa1, 0x8a, + 0x46, 0x1f, 0x46, 0xb0, 0xd0, 0x83, 0xbb, 0x5f, 0x89, 0x76, 0x8b, 0x02, + 0xb2, 0xde, 0x9f, 0x10, 0x93, 0xc2, 0x18, 0xcd, 0x7e, 0x92, 0xea, 0x66, + 0xa0, 0x0f, 0x86, 0x30, 0x27, 0x78, 0xe1, 0xfc, 0x71, 0x06, 0x03, 0xda, + 0x7b, 0x1e, 0x72, 0xf7, 0x3b, 0x4d, 0xf2, 0x99, 0x13, 0xd4, 0xbd, 0x4e, + 0xa4, 0xb6, 0x6c, 0x98, 0x46, 0x60, 0x05, 0xa6, 0x80, 0x87, 0xa7, 0x16, + 0x36, 0xbe, 0x6a, 0xcf, 0x62, 0xd8, 0xb1, 0xab, 0x16, 0xc0, 0x71, 0x7d, + 0x5f, 0x28, 0xb1, 0x4e, 0xe4, 0x7b, 0x3a, 0x05, 0xfb, 0xac, 0x72, 0x71, + 0xc0, 0x87, 0x79, 0xcb, 0xcb, 0xff, 0x00, 0xe4, 0x70, 0x16, 0x30, 0x50, + 0xec, 0x62, 0xab, 0x10, 0xad, 0x8c, 0xc1, 0x50, 0xb4, 0x10, 0x3a, 0x8c, + 0x03, 0x1b, 0x5f, 0x54, 0xd3, 0xc0, 0x25, 0x33, 0x37, 0x4a, 0x5c, 0xc6, + 0x1e, 0xab, 0xf5, 0x32, 0x96, 0x21, 0x39, 0x57, 0xa0, 0xbc, 0x3a, 0xa7, + 0x56, 0x65, 0x9d, 0x49, 0x96, 0x5f, 0xd7, 0xff, 0x00, 0x1d, 0x2d, 0x3d, + 0x19, 0xcc, 0x50, 0x5c, 0x3b, 0xc7, 0x99, 0x2e, 0x5f, 0x52, 0x9c, 0x54, + 0xe2, 0xd6, 0x64, 0xd2, 0x5d, 0x9a, 0x8e, 0xd6, 0x25, 0x3b, 0x4a, 0x86, + 0x20, 0x40, 0x80, 0xff, 0x00, 0xe6, 0xc1, 0x0d, 0x27, 0x42, 0x74, 0x66, + 0xc4, 0xe9, 0xcd, 0x49, 0x9a, 0x55, 0x77, 0xa4, 0xc1, 0x29, 0xda, 0x6a, + 0x35, 0x2b, 0xf4, 0x57, 0xd2, 0xc7, 0xd0, 0x56, 0x4c, 0xc8, 0xaa, 0x28, + 0xea, 0xfd, 0x2a, 0xb4, 0x98, 0x35, 0xf4, 0x58, 0x65, 0xf5, 0x8f, 0x54, + 0x71, 0xac, 0x18, 0x72, 0xe7, 0xf3, 0x09, 0x9a, 0x0a, 0x1d, 0x0a, 0xf4, + 0x49, 0xbb, 0xd3, 0x4a, 0x83, 0x48, 0x32, 0x46, 0x52, 0x30, 0xd9, 0x65, + 0xa7, 0x53, 0x87, 0xa9, 0x03, 0x9b, 0xea, 0x0b, 0xe9, 0xa8, 0x76, 0xb7, + 0x72, 0x62, 0xab, 0x80, 0x1e, 0xa5, 0xd0, 0xf9, 0xca, 0xa0, 0xb4, 0xa7, + 0x9f, 0x71, 0x0a, 0x3b, 0x1d, 0xd3, 0x62, 0xdd, 0xfc, 0xeb, 0xf2, 0xff, + 0x00, 0xf4, 0xa3, 0x0b, 0x19, 0x80, 0x25, 0x91, 0x52, 0xa5, 0x86, 0xae, + 0x6f, 0xbd, 0x26, 0xa4, 0xae, 0xf7, 0x8f, 0x84, 0xef, 0x8c, 0x65, 0xbf, + 0xa1, 0xea, 0x9d, 0xd0, 0xf4, 0x4a, 0x43, 0xaa, 0x68, 0x47, 0xf5, 0x3b, + 0x77, 0xf4, 0xbd, 0xef, 0x52, 0x6e, 0x18, 0xb4, 0x9a, 0xfd, 0x6b, 0x43, + 0x12, 0xed, 0x33, 0x2c, 0x97, 0x15, 0x50, 0xf9, 0x9a, 0x58, 0xcc, 0xc9, + 0x2f, 0x95, 0x15, 0x03, 0xff, 0x00, 0xb3, 0x12, 0x07, 0x10, 0x1d, 0xa0, + 0x5e, 0x92, 0xc7, 0x49, 0x45, 0xe1, 0xf4, 0x42, 0x51, 0xb6, 0x92, 0xdd, + 0x67, 0x09, 0x3a, 0x9e, 0x99, 0xa9, 0xd9, 0x07, 0xa1, 0xb1, 0x14, 0x51, + 0xc7, 0xe9, 0x3a, 0xe2, 0x6a, 0x47, 0xcb, 0xd0, 0x71, 0x8c, 0x6a, 0x8c, + 0x5d, 0x38, 0xf5, 0xec, 0x4f, 0xd4, 0xa0, 0x21, 0x9c, 0x3d, 0x22, 0x8a, + 0xe2, 0xa7, 0x99, 0x62, 0x45, 0x41, 0x58, 0x88, 0xec, 0x63, 0xac, 0xc2, + 0x50, 0xff, 0x00, 0xf6, 0x02, 0x24, 0xd0, 0xd0, 0xd3, 0x69, 0x4d, 0xc3, + 0xb6, 0x6a, 0xcd, 0x49, 0x43, 0xaf, 0x9f, 0x43, 0xe8, 0x67, 0x09, 0x60, + 0xf6, 0xc2, 0x4b, 0x43, 0xaa, 0x75, 0x3d, 0x32, 0xfe, 0xbf, 0xd4, 0xf4, + 0x19, 0x33, 0x8f, 0xac, 0x77, 0xd2, 0x18, 0x34, 0xf4, 0xba, 0x19, 0x9d, + 0xb3, 0x2f, 0x48, 0x4d, 0x62, 0x79, 0xe6, 0x8c, 0xd0, 0xe6, 0x11, 0xed, + 0x30, 0x38, 0x83, 0x8f, 0xfe, 0xeb, 0x1f, 0x28, 0xd2, 0xfd, 0x5c, 0x4b, + 0x95, 0x08, 0xb5, 0xcc, 0xb1, 0xb8, 0x46, 0xb1, 0x5b, 0xda, 0x61, 0x97, + 0x5e, 0xd3, 0x23, 0x07, 0x8f, 0x40, 0xf4, 0xd5, 0xbc, 0xb4, 0x8b, 0x99, + 0xba, 0x6a, 0x7f, 0xe2, 0x27, 0xaa, 0x75, 0x65, 0x11, 0xe5, 0x1c, 0xa3, + 0x9a, 0x59, 0xe5, 0x93, 0x7a, 0xb5, 0x3e, 0xfd, 0x55, 0xac, 0xf3, 0x4e, + 0x49, 0x9a, 0x2d, 0xf5, 0x95, 0x1f, 0x51, 0xb6, 0x50, 0xb4, 0x12, 0x9c, + 0x3e, 0x25, 0xc6, 0x3f, 0xfd, 0x36, 0x4b, 0x39, 0x94, 0xc3, 0xb9, 0xbc, + 0x2d, 0x52, 0x0e, 0x14, 0xa5, 0x63, 0x66, 0x64, 0x65, 0x13, 0x36, 0xb1, + 0xbf, 0xfe, 0x1f, 0x7c, 0x2d, 0x1e, 0xaf, 0x41, 0x07, 0x54, 0xcb, 0xe9, + 0x59, 0x0f, 0x99, 0x7f, 0xa5, 0xa1, 0x14, 0x7a, 0x47, 0x72, 0xd3, 0x3a, + 0x82, 0xfd, 0x0c, 0xb3, 0x34, 0xe3, 0xd2, 0x69, 0x40, 0x62, 0x50, 0x20, + 0x79, 0x9c, 0x3e, 0xd1, 0xea, 0xf0, 0x77, 0x87, 0x54, 0x04, 0x12, 0x5f, + 0xaa, 0x84, 0x4a, 0xb3, 0x3a, 0xd7, 0x2b, 0x61, 0xb7, 0x33, 0xa9, 0x04, + 0x02, 0x69, 0x16, 0x00, 0x2d, 0xc1, 0x3d, 0x0c, 0xef, 0x31, 0xc1, 0x9d, + 0x08, 0x2e, 0x65, 0x46, 0xb1, 0xf9, 0x9c, 0x9b, 0xcb, 0x2e, 0x0b, 0x57, + 0xc5, 0xcc, 0xbf, 0x53, 0x7c, 0xb2, 0xe0, 0xa9, 0xba, 0x1e, 0xb5, 0xe8, + 0xc7, 0x31, 0x12, 0xd4, 0xb4, 0xc4, 0x7a, 0xcc, 0xb0, 0x3d, 0x0e, 0xbc, + 0x1d, 0xee, 0x0f, 0xa2, 0xd2, 0x65, 0x2c, 0xfd, 0x15, 0xf8, 0x89, 0x9d, + 0x53, 0x2f, 0x55, 0x3f, 0x89, 0x50, 0xd6, 0x77, 0xfa, 0x79, 0xfd, 0x0d, + 0x1a, 0x73, 0x2c, 0x4c, 0xfb, 0xca, 0xc1, 0x08, 0x15, 0x5c, 0x61, 0x57, + 0xb4, 0xb5, 0x1d, 0x21, 0x19, 0x62, 0x1b, 0xc0, 0xee, 0x82, 0xef, 0x2b, + 0xff, 0x00, 0xe2, 0x32, 0x98, 0x06, 0xf1, 0x29, 0xae, 0x60, 0x10, 0xeb, + 0x59, 0xad, 0x98, 0x79, 0xdb, 0x4a, 0xa1, 0x95, 0x87, 0x98, 0x05, 0xc0, + 0x6f, 0xd6, 0x30, 0xcf, 0x7c, 0x24, 0xa6, 0xf1, 0xb7, 0xa9, 0x2b, 0x32, + 0xcb, 0xb7, 0xf4, 0x7a, 0xd2, 0xcf, 0x4e, 0xc8, 0xf7, 0xf4, 0xba, 0xa2, + 0x83, 0x4c, 0xce, 0x94, 0x6d, 0xa0, 0x62, 0xa6, 0x02, 0x6b, 0x20, 0x00, + 0xcf, 0xf1, 0x44, 0xe8, 0x9b, 0x86, 0xe6, 0x9d, 0x63, 0xa4, 0xc3, 0x96, + 0x21, 0xbc, 0x4c, 0x5c, 0xd2, 0x57, 0xc0, 0x09, 0x69, 0xb6, 0x06, 0x5a, + 0x4a, 0xb3, 0xd3, 0x13, 0xf7, 0x10, 0x43, 0xc3, 0x7e, 0x92, 0xe1, 0xcb, + 0xb7, 0xeb, 0x96, 0xb8, 0x6f, 0xeb, 0x88, 0x0a, 0x8b, 0x9d, 0x2a, 0x45, + 0x28, 0x4d, 0x54, 0x9f, 0x88, 0x86, 0x3c, 0xdf, 0xae, 0x5a, 0x5d, 0x0e, + 0x99, 0xee, 0x47, 0x01, 0x77, 0x0a, 0x40, 0xcc, 0x1d, 0x45, 0xc6, 0x81, + 0xb1, 0xc4, 0xa0, 0xcb, 0x0d, 0xfa, 0x0c, 0xa5, 0xac, 0xbd, 0xab, 0x9d, + 0x79, 0x74, 0xb3, 0x48, 0xc7, 0x5e, 0xd2, 0xcb, 0x97, 0x69, 0x16, 0x21, + 0xcd, 0xc3, 0xad, 0x4b, 0xa6, 0x48, 0xb5, 0xcc, 0xaa, 0x29, 0x9a, 0x58, + 0x4a, 0xfd, 0x5d, 0x3d, 0x0a, 0x3d, 0x06, 0x2c, 0x75, 0x99, 0x1a, 0xbe, + 0x11, 0x4b, 0x64, 0xce, 0x5f, 0x20, 0x0f, 0xdf, 0xa4, 0xea, 0x9d, 0x79, + 0x6f, 0xa7, 0x67, 0x79, 0x75, 0x4e, 0x82, 0x94, 0x98, 0x68, 0xcc, 0x03, + 0xa9, 0x1b, 0xe8, 0xc4, 0xd4, 0xca, 0x0d, 0x66, 0x5d, 0x62, 0x3b, 0xdf, + 0xff, 0x00, 0x8d, 0x94, 0x3a, 0xca, 0xb7, 0xf4, 0xdd, 0x68, 0x23, 0xc2, + 0x1a, 0x66, 0x5a, 0x56, 0xcb, 0x5a, 0x50, 0xb9, 0x97, 0x5c, 0xcc, 0xdb, + 0x07, 0x98, 0x37, 0x88, 0xda, 0x77, 0xc6, 0x1b, 0xfa, 0x4e, 0xa9, 0x64, + 0x20, 0x93, 0x29, 0xd4, 0x8e, 0xfa, 0x7d, 0x5f, 0x4e, 0xd9, 0x65, 0x4c, + 0xa5, 0x47, 0x71, 0xc7, 0x33, 0xaf, 0x4a, 0xc1, 0x00, 0x54, 0xa2, 0x7f, + 0xbc, 0xe7, 0x71, 0x04, 0x42, 0x1b, 0x61, 0xa0, 0x61, 0xc2, 0x1b, 0x6c, + 0x73, 0xab, 0x47, 0x2f, 0x89, 0x77, 0x04, 0x73, 0x80, 0xf8, 0x4d, 0x4c, + 0x5b, 0x93, 0xf6, 0xc7, 0xdc, 0xeb, 0x5e, 0x04, 0x7c, 0xdb, 0xf3, 0x15, + 0xac, 0xf2, 0xfd, 0x03, 0x51, 0xa3, 0x6e, 0x32, 0x22, 0xbe, 0xf0, 0x68, + 0x60, 0xe8, 0xa8, 0x0d, 0xb9, 0x75, 0x88, 0x38, 0x87, 0x7a, 0xcb, 0xab, + 0x33, 0x14, 0x3a, 0xeb, 0x30, 0x5d, 0x55, 0xab, 0x1a, 0x03, 0x5b, 0x29, + 0x8d, 0x1e, 0x6f, 0x31, 0xe2, 0x9e, 0x98, 0xb3, 0x6c, 0xba, 0x14, 0x34, + 0x30, 0x3b, 0x5d, 0x43, 0x24, 0x4d, 0xa1, 0x43, 0xe0, 0x7e, 0x61, 0x3b, + 0xbe, 0x85, 0x32, 0xbf, 0x4e, 0x1a, 0x68, 0x0f, 0x6c, 0xbe, 0xd0, 0x0c, + 0x05, 0x57, 0x59, 0x1e, 0x1c, 0xcb, 0x34, 0xb7, 0xac, 0xd4, 0xdd, 0x35, + 0x96, 0x69, 0x29, 0x96, 0xc5, 0x46, 0xb3, 0x50, 0x8e, 0xe7, 0xb6, 0x01, + 0x35, 0xa2, 0x5f, 0x4b, 0x9d, 0x68, 0x6d, 0x67, 0x57, 0xd1, 0xe3, 0x95, + 0xff, 0x00, 0xe2, 0x8a, 0x77, 0x98, 0xe2, 0xdd, 0x52, 0x67, 0xf2, 0x26, + 0x30, 0xa5, 0x3f, 0x2c, 0xfc, 0x7a, 0x08, 0xaf, 0xd1, 0xd2, 0x99, 0x0c, + 0xc0, 0x44, 0x01, 0x6b, 0x0c, 0x19, 0x94, 0x8a, 0x65, 0x9e, 0x61, 0x37, + 0x61, 0x86, 0xb7, 0x15, 0x73, 0xd2, 0x33, 0x52, 0xf4, 0xbf, 0x72, 0x69, + 0x31, 0xd8, 0x7f, 0xf8, 0x00, 0x20, 0x97, 0x99, 0x5b, 0x96, 0x51, 0x79, + 0x8b, 0x75, 0x73, 0xad, 0x3a, 0x9f, 0x30, 0x9f, 0x32, 0xd7, 0x84, 0xc8, + 0xcc, 0xa1, 0x66, 0x59, 0xd7, 0x99, 0x25, 0x04, 0x7a, 0xe3, 0xe9, 0x53, + 0x98, 0x63, 0x09, 0x04, 0x2c, 0x76, 0x98, 0x99, 0x83, 0xd9, 0xef, 0x31, + 0x6c, 0x3c, 0xcc, 0x52, 0x9e, 0x06, 0x01, 0x59, 0xf9, 0x86, 0xcc, 0x90, + 0x2f, 0x41, 0xde, 0x50, 0xa0, 0x3a, 0x40, 0xe2, 0x21, 0x2f, 0xac, 0x71, + 0xd5, 0x4d, 0x08, 0xfb, 0x4e, 0x69, 0xa1, 0xb4, 0xad, 0x29, 0x54, 0xb3, + 0xc4, 0x54, 0x5b, 0xad, 0xd7, 0xb4, 0x15, 0x47, 0x58, 0xe3, 0xf0, 0xf9, + 0x85, 0xa2, 0x7a, 0x26, 0x7f, 0x80, 0xf9, 0x87, 0x72, 0x3b, 0x98, 0xbd, + 0x8a, 0x3e, 0x25, 0x44, 0x23, 0x83, 0x43, 0x38, 0xca, 0x97, 0x36, 0x74, + 0xa8, 0xde, 0x95, 0x1d, 0xaa, 0xc5, 0x5a, 0xd8, 0x45, 0x16, 0x55, 0x76, + 0xcd, 0x68, 0xb8, 0x99, 0x88, 0x18, 0x6e, 0x66, 0xcb, 0x33, 0x4d, 0xbb, + 0x99, 0x93, 0x7f, 0x30, 0x6d, 0xe7, 0x89, 0x72, 0xf3, 0xcc, 0xc2, 0x68, + 0xe6, 0x0b, 0xad, 0x7a, 0xcb, 0x54, 0x1a, 0x5f, 0x82, 0x29, 0x46, 0x5f, + 0x2d, 0xa2, 0x15, 0xcd, 0x1c, 0xfe, 0xe0, 0x10, 0x8d, 0x03, 0xe3, 0xd9, + 0xc4, 0x02, 0x97, 0x32, 0xe8, 0x3b, 0xa6, 0xaf, 0x82, 0x6c, 0xcd, 0x77, + 0xd1, 0xee, 0x63, 0xe6, 0x56, 0xb3, 0x23, 0x9b, 0x95, 0x4b, 0x59, 0xb4, + 0xce, 0x29, 0x6d, 0xcb, 0xa1, 0xaa, 0x80, 0xe5, 0x97, 0x56, 0x3d, 0xcc, + 0xfe, 0x1e, 0x3b, 0x41, 0xa8, 0x25, 0xd3, 0xf4, 0x45, 0x98, 0x4f, 0x6c, + 0x41, 0xb6, 0x5d, 0x01, 0x5f, 0x98, 0xea, 0xa0, 0xd2, 0xb4, 0x99, 0x21, + 0xb1, 0xbb, 0xee, 0x3f, 0x44, 0x75, 0xb5, 0x1d, 0x44, 0x9a, 0xd7, 0x78, + 0x7e, 0xe2, 0x7c, 0x3f, 0x61, 0x04, 0xb4, 0x1e, 0xd3, 0x14, 0xb9, 0x46, + 0x56, 0x4e, 0xab, 0xdc, 0x84, 0x2a, 0x2a, 0xd3, 0xf6, 0x5f, 0xe7, 0xd0, + 0x47, 0x56, 0x75, 0xa6, 0x59, 0x9c, 0x97, 0x09, 0x9d, 0xb3, 0x08, 0x0c, + 0xc1, 0x77, 0xf6, 0x96, 0xd6, 0x65, 0x05, 0x5d, 0x4b, 0xf7, 0xcc, 0xee, + 0x25, 0x9d, 0x66, 0x61, 0x0b, 0x88, 0x28, 0xff, 0x00, 0xee, 0xe1, 0x97, + 0xd8, 0x8d, 0x9b, 0xb8, 0x19, 0xb6, 0x31, 0x6a, 0x3a, 0xf0, 0x0d, 0xf1, + 0x3a, 0xd2, 0xf5, 0x98, 0x48, 0xbb, 0x99, 0x93, 0x33, 0x98, 0x79, 0xcc, + 0xb6, 0x59, 0x72, 0xa8, 0xe5, 0x1e, 0xb2, 0x77, 0xc6, 0x9b, 0xc5, 0x73, + 0x1e, 0x42, 0x37, 0xad, 0x76, 0xd4, 0x2f, 0x05, 0x82, 0xaf, 0xa8, 0x0a, + 0x52, 0xa5, 0x17, 0x2c, 0xa1, 0xad, 0x45, 0x56, 0xbf, 0x13, 0x5b, 0xf6, + 0x6f, 0xa0, 0x94, 0x32, 0x13, 0x94, 0xbf, 0x72, 0x98, 0xdb, 0x95, 0x7e, + 0x4c, 0x2a, 0xaf, 0x7a, 0xa5, 0xf8, 0x95, 0xca, 0x87, 0x54, 0xa2, 0x86, + 0x64, 0x50, 0xac, 0xd0, 0x39, 0x1a, 0x3e, 0xd2, 0xd7, 0x0c, 0xa8, 0xe1, + 0x7b, 0x42, 0x8b, 0xc3, 0x84, 0xdf, 0xdc, 0x4c, 0x1e, 0x61, 0xf7, 0x29, + 0x2b, 0x3c, 0x22, 0x54, 0x04, 0x72, 0x9f, 0x86, 0x39, 0x47, 0x39, 0x17, + 0xf2, 0x4c, 0x87, 0x15, 0x35, 0xa1, 0xf7, 0x86, 0x1c, 0xaa, 0x2f, 0xa3, + 0xae, 0x59, 0xaa, 0x84, 0x46, 0x17, 0xe2, 0x2a, 0x82, 0xf7, 0x16, 0x2a, + 0x79, 0x4b, 0x6b, 0xf1, 0xf7, 0x19, 0x50, 0x45, 0xb7, 0xc8, 0xf6, 0xd2, + 0x50, 0x85, 0x2a, 0xa8, 0xf9, 0x58, 0x59, 0xae, 0x25, 0x95, 0x7a, 0x90, + 0xd8, 0x87, 0x79, 0x74, 0x02, 0xf7, 0x21, 0x11, 0x49, 0xa4, 0x07, 0x15, + 0x28, 0x1c, 0x4a, 0x4d, 0x33, 0x1c, 0x5c, 0x40, 0xa1, 0xd2, 0xf3, 0x0b, + 0x48, 0x2d, 0x59, 0x00, 0x9a, 0x9d, 0xd1, 0x70, 0x65, 0xb5, 0x90, 0x22, + 0xa1, 0x59, 0x5a, 0x46, 0x70, 0x16, 0xfc, 0x13, 0x23, 0x7b, 0xd5, 0xed, + 0x3a, 0x07, 0x27, 0x56, 0x0a, 0x2d, 0xa6, 0x87, 0x59, 0x5d, 0x2e, 0x2b, + 0x55, 0xc4, 0xbe, 0xcd, 0x5e, 0xf1, 0x0e, 0xba, 0x75, 0x8a, 0x20, 0x3a, + 0xab, 0x56, 0x0a, 0x1a, 0x0e, 0xb5, 0xbc, 0xca, 0x14, 0x34, 0x1a, 0xb1, + 0x3c, 0x0a, 0x47, 0x74, 0xd1, 0xf3, 0x1c, 0xea, 0x9b, 0x5a, 0xbf, 0x4f, + 0x98, 0x65, 0x84, 0x32, 0x0b, 0x3d, 0xd2, 0x28, 0x31, 0xff, 0x00, 0xbd, + 0x5c, 0xad, 0x81, 0xc5, 0xfb, 0xe5, 0x02, 0x07, 0x64, 0xe2, 0x43, 0xc1, + 0x98, 0x7c, 0xc6, 0xed, 0xb3, 0xce, 0xb3, 0x00, 0x1e, 0xb6, 0x37, 0x02, + 0xc1, 0x36, 0x66, 0x56, 0xc8, 0x75, 0xb1, 0xa8, 0xbe, 0x6b, 0xbb, 0x0d, + 0x40, 0x61, 0xa5, 0x46, 0xd0, 0x6d, 0x71, 0xed, 0x08, 0x0e, 0xea, 0xd2, + 0xe0, 0x53, 0x06, 0x95, 0xcc, 0xb2, 0x00, 0x0c, 0x39, 0x80, 0xa2, 0xcf, + 0x5b, 0x69, 0x1c, 0x0a, 0x76, 0x05, 0x4a, 0x40, 0x5b, 0x41, 0xe7, 0x88, + 0xd5, 0x25, 0x68, 0x2a, 0xf6, 0x95, 0x50, 0xc0, 0x53, 0x3d, 0x44, 0x1a, + 0xbc, 0xcd, 0xb8, 0x91, 0xcb, 0x34, 0x9b, 0x3f, 0x11, 0xe6, 0xcd, 0xa5, + 0xe9, 0x59, 0x78, 0x7e, 0x2d, 0x1c, 0x08, 0x42, 0xc1, 0x39, 0x1f, 0x46, + 0x99, 0xd7, 0x99, 0x89, 0x98, 0xcc, 0xc0, 0x8c, 0x0c, 0xf8, 0x94, 0x9a, + 0xca, 0x10, 0x86, 0xcc, 0xbd, 0x88, 0x6d, 0x35, 0xe0, 0x7d, 0xcc, 0x32, + 0x53, 0xad, 0x60, 0xa8, 0x3b, 0xaa, 0x3f, 0x06, 0xa5, 0x39, 0x5a, 0xb4, + 0xe9, 0xf0, 0xfe, 0x21, 0x15, 0x63, 0xb4, 0xc0, 0x6e, 0xa1, 0xf5, 0x61, + 0x8c, 0x7f, 0xf7, 0x38, 0x63, 0x2c, 0xc3, 0x48, 0x31, 0x4b, 0x98, 0x0b, + 0xa4, 0x43, 0x5d, 0x46, 0xb1, 0x01, 0xde, 0x1f, 0x30, 0x16, 0x22, 0xa4, + 0x5b, 0x99, 0x75, 0x9a, 0xb9, 0xf4, 0xd1, 0xde, 0x55, 0xb9, 0x7c, 0x46, + 0x8c, 0x0a, 0x9b, 0xca, 0xa8, 0xbd, 0x07, 0x1a, 0xfd, 0x2e, 0x5f, 0x21, + 0xbf, 0xe9, 0x96, 0x32, 0x10, 0xe0, 0xcb, 0xe0, 0x61, 0x84, 0x70, 0x9d, + 0xc8, 0xf6, 0x7d, 0x42, 0x57, 0xf5, 0x8e, 0xc0, 0xdd, 0xa3, 0xae, 0xb1, + 0xc5, 0x88, 0x0a, 0x29, 0x7a, 0xea, 0xc3, 0x0c, 0x0b, 0x05, 0x4a, 0xa2, + 0x66, 0x5d, 0x35, 0x61, 0xa5, 0xee, 0x44, 0xb0, 0x4b, 0xde, 0x6a, 0x30, + 0xcd, 0x4c, 0xc1, 0x4a, 0x38, 0x81, 0xdc, 0xcd, 0xd8, 0x4e, 0xfe, 0x49, + 0xbf, 0xcf, 0x42, 0x23, 0x0f, 0xa9, 0xcc, 0xf1, 0x68, 0xba, 0x3d, 0xa1, + 0x46, 0xf0, 0xc6, 0x3e, 0x58, 0x0f, 0xa4, 0x6a, 0x95, 0xec, 0xc1, 0xa1, + 0x86, 0x2b, 0xf2, 0x57, 0x2f, 0x1d, 0x53, 0x5b, 0xed, 0x64, 0x2c, 0x2d, + 0x1d, 0x33, 0xf3, 0x3e, 0x42, 0x74, 0x2b, 0xbc, 0x9e, 0x4d, 0x3c, 0xc0, + 0x53, 0x50, 0xd3, 0x74, 0x24, 0x28, 0x2c, 0x99, 0x86, 0xbc, 0x4e, 0x84, + 0xdd, 0xe2, 0x20, 0x1d, 0x39, 0x36, 0x86, 0x6a, 0x2b, 0x08, 0x1f, 0x76, + 0x01, 0x65, 0xa6, 0xe3, 0xb9, 0x2a, 0x2a, 0xeb, 0xc6, 0x1f, 0x77, 0x14, + 0x56, 0xa8, 0x7e, 0xaa, 0x3e, 0xe5, 0x53, 0x18, 0x6b, 0xea, 0x5b, 0x6b, + 0x73, 0x93, 0xde, 0x31, 0x22, 0x65, 0x27, 0x2a, 0xa7, 0x5e, 0xad, 0xf8, + 0x85, 0xad, 0x12, 0xa8, 0xb1, 0x12, 0xb1, 0x91, 0x13, 0xc4, 0xb0, 0x16, + 0x39, 0x08, 0xb5, 0x51, 0xa2, 0x2f, 0x20, 0x4a, 0xac, 0xea, 0x7b, 0x4b, + 0x3a, 0xe8, 0x75, 0x00, 0x1b, 0x06, 0xb4, 0xf6, 0x82, 0x51, 0x11, 0x1a, + 0xbd, 0x36, 0x0f, 0xbe, 0x25, 0xe0, 0xe8, 0x59, 0x37, 0xda, 0x11, 0x45, + 0xd0, 0x59, 0xf0, 0x87, 0xbb, 0x11, 0x8b, 0x70, 0xd1, 0x20, 0x5c, 0xe9, + 0xdd, 0x0f, 0x3e, 0xf1, 0x14, 0x6a, 0x59, 0x83, 0xf0, 0xfe, 0x23, 0x40, + 0x6e, 0x3f, 0x50, 0xb9, 0x50, 0x99, 0xe6, 0x7b, 0xc3, 0x36, 0xed, 0xb6, + 0xf2, 0x92, 0x11, 0x62, 0x55, 0x40, 0x5a, 0x9c, 0x07, 0x31, 0x55, 0xb9, + 0x28, 0xd0, 0xfc, 0xbc, 0x31, 0xd6, 0x3f, 0x9b, 0xa3, 0x8c, 0xe3, 0x19, + 0x7c, 0xac, 0x44, 0x85, 0x6a, 0x5a, 0xcc, 0xfa, 0xe6, 0x59, 0x31, 0x24, + 0x19, 0x13, 0x68, 0x98, 0x29, 0xe2, 0xcd, 0x13, 0xbe, 0xfe, 0x66, 0x3c, + 0xc6, 0x46, 0x13, 0x86, 0x01, 0x56, 0xc9, 0xf2, 0xca, 0x0c, 0xe9, 0x10, + 0xa4, 0x73, 0x52, 0xa0, 0x05, 0xd8, 0x75, 0x34, 0x82, 0x83, 0x75, 0x6d, + 0xcb, 0x40, 0x69, 0x57, 0x11, 0x6a, 0xd9, 0x09, 0x71, 0x62, 0x90, 0xce, + 0x17, 0x8f, 0x58, 0x45, 0x8b, 0x06, 0x95, 0x0d, 0x04, 0xb2, 0x00, 0xac, + 0x04, 0x8d, 0x39, 0x5a, 0x93, 0x6a, 0xaf, 0x31, 0x3e, 0x5b, 0x19, 0x2f, + 0x65, 0xc3, 0x3e, 0xd1, 0x28, 0x52, 0xd0, 0x4a, 0xca, 0xd7, 0x8a, 0xf9, + 0x94, 0x39, 0x90, 0xb4, 0xfb, 0x4a, 0xc6, 0x29, 0x34, 0x41, 0x8b, 0xb6, + 0xef, 0xc4, 0xb0, 0x42, 0x0e, 0x75, 0xd8, 0x54, 0x0b, 0x6b, 0xc9, 0x0f, + 0xb0, 0x81, 0xd6, 0x9a, 0x74, 0xeb, 0xfd, 0x51, 0x50, 0xc7, 0xa0, 0xfb, + 0x6b, 0x1b, 0x1b, 0xc7, 0x61, 0xb4, 0xef, 0x11, 0x36, 0x18, 0x03, 0x77, + 0x89, 0x6a, 0x65, 0x6e, 0xd7, 0xcc, 0xcb, 0x57, 0x31, 0x1c, 0xfa, 0x06, + 0xb1, 0x42, 0xba, 0xc4, 0x69, 0x26, 0x6b, 0x83, 0xab, 0xe6, 0x29, 0x33, + 0x12, 0xf2, 0x21, 0xc5, 0xff, 0x00, 0xe5, 0x4b, 0x57, 0x68, 0xc0, 0x6a, + 0x52, 0x0f, 0xa5, 0xca, 0x8c, 0xe6, 0x94, 0xdb, 0xde, 0x75, 0x71, 0xc4, + 0x9f, 0x11, 0xc2, 0xa8, 0x96, 0xe0, 0x08, 0xd9, 0xfc, 0xc5, 0x56, 0x6b, + 0xca, 0x2e, 0xe7, 0x5e, 0x6b, 0xa7, 0x10, 0x37, 0xf9, 0x89, 0x09, 0x92, + 0x50, 0xeb, 0x17, 0x00, 0x78, 0x4c, 0x4e, 0x95, 0xe8, 0xb2, 0xfd, 0xe2, + 0xa1, 0xad, 0xd5, 0x11, 0x14, 0x5d, 0xcb, 0xb8, 0xd0, 0x7b, 0xc7, 0x85, + 0x2d, 0x38, 0x2f, 0x7a, 0xbc, 0xb3, 0x48, 0x16, 0x6d, 0x6b, 0xdb, 0x07, + 0xb4, 0x5a, 0xe4, 0x9e, 0xed, 0xba, 0x8c, 0x14, 0x6b, 0x04, 0x14, 0xf1, + 0x82, 0x21, 0xd2, 0x86, 0xa7, 0x2c, 0x76, 0x1a, 0x31, 0x01, 0xb2, 0xff, + 0x00, 0xca, 0x22, 0x15, 0x34, 0x0a, 0xb3, 0x3d, 0xe1, 0xfe, 0x92, 0x49, + 0x80, 0x03, 0x3e, 0x61, 0x18, 0x60, 0xc6, 0xb2, 0x9f, 0x2f, 0x59, 0x6e, + 0x85, 0x11, 0x71, 0x2d, 0x75, 0x99, 0xfb, 0x38, 0x41, 0x40, 0x85, 0xab, + 0x88, 0x37, 0x56, 0x81, 0xc1, 0x0a, 0xad, 0x21, 0xa0, 0xa1, 0xf7, 0x9b, + 0x76, 0x53, 0x5d, 0xc3, 0x73, 0x66, 0x35, 0x10, 0x96, 0x8d, 0x5b, 0xa5, + 0xb5, 0x5e, 0x87, 0xb9, 0x16, 0x98, 0xb8, 0x5a, 0x8e, 0x31, 0x97, 0xca, + 0xcc, 0xe0, 0x81, 0x55, 0x5f, 0x33, 0x3e, 0xb0, 0x1a, 0x91, 0xe4, 0x81, + 0xf6, 0x6b, 0x5b, 0x5d, 0x17, 0x3e, 0x1e, 0xd3, 0x46, 0xd4, 0x5e, 0x6f, + 0xc8, 0xec, 0xc0, 0xfa, 0x00, 0x58, 0x79, 0x21, 0x90, 0x16, 0xdf, 0x40, + 0x1f, 0x37, 0x09, 0x30, 0x62, 0x89, 0x3f, 0x0f, 0x7a, 0x8e, 0x55, 0x0a, + 0x12, 0x1f, 0x3a, 0x7c, 0xc6, 0xb4, 0x4a, 0xc1, 0x2c, 0x7f, 0x39, 0x82, + 0xb1, 0xff, 0x00, 0x79, 0x8f, 0xb6, 0x09, 0x9d, 0xa2, 0x9a, 0xd8, 0x26, + 0x42, 0xed, 0x70, 0xda, 0x91, 0xb7, 0x3b, 0xc5, 0x8c, 0x15, 0x6f, 0xd1, + 0x0f, 0x61, 0x51, 0x2d, 0xe7, 0xa6, 0x0f, 0x29, 0x65, 0x6d, 0x8e, 0x24, + 0x69, 0x11, 0x28, 0xba, 0x5f, 0x7e, 0x11, 0x92, 0x68, 0xca, 0x11, 0x8b, + 0x43, 0x69, 0xa6, 0x30, 0x5b, 0x82, 0xe0, 0x00, 0x1d, 0x75, 0x06, 0xda, + 0xd1, 0xc1, 0x62, 0xa9, 0x05, 0x8c, 0xc0, 0x3a, 0x80, 0x7b, 0x41, 0xe8, + 0x26, 0x41, 0x15, 0x95, 0xba, 0xff, 0x00, 0x65, 0x2d, 0x85, 0x29, 0xf4, + 0xf3, 0x7c, 0xb2, 0xc8, 0x8b, 0x29, 0xc0, 0x8d, 0x33, 0xad, 0x62, 0x09, + 0x2b, 0x28, 0x73, 0x7d, 0x69, 0x7d, 0xc4, 0x57, 0x8e, 0x2c, 0x61, 0x57, + 0x90, 0xd9, 0x65, 0xab, 0x5d, 0x90, 0x06, 0x85, 0xfb, 0x7c, 0xcc, 0x9d, + 0x03, 0x98, 0x79, 0x07, 0xaf, 0xc4, 0xd2, 0x81, 0x68, 0x43, 0x88, 0x36, + 0x7a, 0x34, 0x0d, 0x3d, 0xcc, 0xcb, 0x68, 0xf8, 0xc4, 0x7b, 0x36, 0x4b, + 0x7a, 0x4e, 0xf6, 0x1b, 0xea, 0x57, 0x5a, 0xa8, 0x7e, 0xc8, 0x9f, 0xbf, + 0x30, 0xc6, 0x98, 0x40, 0x94, 0x3e, 0x6f, 0x96, 0x6c, 0x4b, 0xe7, 0xa2, + 0xe5, 0x7c, 0x1e, 0x61, 0x47, 0xb9, 0x54, 0x95, 0xa2, 0xe5, 0x79, 0x62, + 0xdb, 0x2f, 0x94, 0x0c, 0xb6, 0x66, 0xd6, 0x61, 0xd6, 0x3b, 0xae, 0x18, + 0xea, 0x27, 0x35, 0x0a, 0x4d, 0x04, 0xcd, 0x37, 0x37, 0xc7, 0x26, 0x85, + 0x77, 0x95, 0x30, 0x3e, 0x58, 0x4b, 0x05, 0xba, 0x29, 0x1e, 0x85, 0x0d, + 0xed, 0x11, 0xd3, 0x05, 0xaa, 0xf6, 0x65, 0xcc, 0x69, 0x03, 0x1b, 0x27, + 0x32, 0x97, 0x54, 0xd5, 0x77, 0x96, 0x8d, 0x0e, 0x21, 0x50, 0xf3, 0x97, + 0x69, 0x90, 0xa1, 0xf4, 0xc3, 0xad, 0x50, 0x07, 0x04, 0xdd, 0xf7, 0x2c, + 0x45, 0xb1, 0xc7, 0xbc, 0x5e, 0xd0, 0x0e, 0x2a, 0xc3, 0xd5, 0x2e, 0x30, + 0x42, 0xca, 0x0a, 0x57, 0xb0, 0x12, 0xf9, 0x6a, 0x1a, 0xd1, 0x0e, 0xee, + 0xdd, 0x0b, 0xc5, 0xfb, 0x6b, 0x19, 0x09, 0xde, 0xd4, 0xf1, 0x16, 0xe4, + 0x45, 0x8f, 0x86, 0x52, 0x61, 0x0a, 0xe0, 0xf6, 0x55, 0xbc, 0xcb, 0xd2, + 0xb9, 0x6d, 0x4f, 0x9e, 0x8e, 0xc2, 0x2e, 0x2d, 0xf8, 0x4c, 0xad, 0x06, + 0x43, 0xb6, 0x0c, 0x32, 0x56, 0x03, 0xa3, 0xc9, 0x61, 0x17, 0x7f, 0x01, + 0x82, 0x02, 0x9f, 0x1e, 0xcf, 0xa2, 0xc2, 0x34, 0x96, 0x4d, 0x65, 0xca, + 0x61, 0x4e, 0x73, 0x69, 0x2a, 0xa1, 0x2c, 0x04, 0xa0, 0xed, 0xff, 0x00, + 0xc4, 0x27, 0x2c, 0x42, 0xa2, 0xb4, 0x60, 0x16, 0x62, 0xfa, 0xfa, 0x85, + 0x43, 0xa0, 0x76, 0x3f, 0xb7, 0x5f, 0xcc, 0x6b, 0xa0, 0x86, 0xe5, 0x06, + 0xfd, 0x63, 0x7c, 0xa1, 0x7b, 0x17, 0xf3, 0x65, 0x51, 0x62, 0x88, 0xde, + 0xb0, 0xee, 0x93, 0xe2, 0x3e, 0xc0, 0xa1, 0xcb, 0xf9, 0x6a, 0xe7, 0xf3, + 0x4a, 0x61, 0xbf, 0x94, 0x56, 0x57, 0x92, 0x4f, 0x89, 0x6a, 0x61, 0x8e, + 0x5a, 0x98, 0xfc, 0xcc, 0xc9, 0x4c, 0x5b, 0x08, 0xdc, 0xe8, 0xda, 0x67, + 0x7a, 0x4f, 0xb6, 0xa7, 0x35, 0xda, 0x54, 0x06, 0x85, 0xb1, 0xca, 0x00, + 0x77, 0x51, 0x45, 0xb6, 0xaf, 0x8c, 0xa0, 0x78, 0x23, 0x5c, 0x55, 0x2a, + 0xa9, 0x65, 0x2a, 0xd4, 0x55, 0x85, 0x7e, 0xe1, 0xba, 0xdc, 0x8e, 0xa4, + 0xc8, 0xa1, 0x5d, 0xb2, 0x8c, 0xb0, 0x16, 0xd3, 0xb3, 0x29, 0x59, 0x5a, + 0xaa, 0x1b, 0x29, 0x8f, 0x90, 0x0b, 0x01, 0x0e, 0x9f, 0x70, 0x0a, 0xb1, + 0x42, 0xb0, 0xf3, 0xcf, 0x91, 0x1a, 0xf4, 0xd2, 0xb1, 0xa1, 0x17, 0xea, + 0x40, 0x31, 0xeb, 0xa2, 0x64, 0x2e, 0x4a, 0x18, 0x5d, 0xc3, 0xa4, 0xcc, + 0xab, 0x54, 0x28, 0xc6, 0x61, 0x40, 0xc4, 0xba, 0x8f, 0xd7, 0x02, 0xaa, + 0xd4, 0x03, 0x19, 0x65, 0x1a, 0xd0, 0xe9, 0x16, 0xfe, 0xfe, 0x93, 0x5f, + 0x89, 0xa6, 0x2d, 0x1e, 0xb4, 0xd3, 0x88, 0x80, 0x46, 0x0d, 0x12, 0xcf, + 0xcd, 0x40, 0x2c, 0xf0, 0x5c, 0x28, 0x2f, 0xb2, 0x3d, 0x05, 0x0d, 0x29, + 0xf4, 0x8f, 0x51, 0xd3, 0x6e, 0x8b, 0xb0, 0x11, 0xec, 0xcc, 0x1a, 0xc8, + 0x46, 0xcc, 0xb5, 0x81, 0x2e, 0xb0, 0x3b, 0xa3, 0xbe, 0x21, 0xa1, 0xc8, + 0xe8, 0x1d, 0x86, 0x25, 0x7d, 0x85, 0x82, 0x70, 0xde, 0xbc, 0x3b, 0x47, + 0x55, 0xa0, 0x4a, 0x8a, 0x30, 0xb7, 0x5b, 0x35, 0xa7, 0xc9, 0x19, 0x10, + 0x75, 0xbf, 0xb2, 0x0f, 0x08, 0xa3, 0x22, 0x81, 0xaa, 0x66, 0xaf, 0x6e, + 0xe9, 0x1b, 0x08, 0xde, 0xad, 0x6b, 0x6d, 0x44, 0xaf, 0x86, 0x40, 0xd4, + 0x8d, 0x2f, 0x3a, 0xff, 0x00, 0x64, 0x8c, 0x10, 0xd8, 0x36, 0x60, 0x47, + 0xc8, 0x54, 0x00, 0x00, 0x00, 0x38, 0x25, 0xec, 0xd9, 0x8a, 0x25, 0xcd, + 0x56, 0x82, 0xfd, 0x92, 0xf1, 0x6f, 0xe3, 0x65, 0xbf, 0x88, 0x58, 0x57, + 0x50, 0xca, 0xbc, 0xb8, 0x5b, 0xe2, 0x52, 0x68, 0x14, 0x80, 0xe3, 0x9c, + 0x71, 0xf5, 0x70, 0xbe, 0x2f, 0x21, 0x7a, 0x7f, 0x60, 0xf3, 0x2b, 0x89, + 0x54, 0x5a, 0xdd, 0x0c, 0x04, 0x1a, 0x60, 0xd1, 0x96, 0x21, 0xbf, 0x49, + 0x65, 0x50, 0x59, 0x75, 0x6a, 0x72, 0xf6, 0x20, 0x44, 0x00, 0x6a, 0xf4, + 0xca, 0xfe, 0x3a, 0x77, 0x97, 0xf1, 0xf3, 0x0a, 0xe3, 0x8c, 0xb4, 0xe8, + 0xba, 0x67, 0x88, 0xf1, 0x1c, 0xb6, 0x47, 0x03, 0x00, 0x1c, 0xa9, 0xcb, + 0x18, 0x33, 0x00, 0x5a, 0x6a, 0xf0, 0xe0, 0x76, 0xc9, 0x03, 0x63, 0xa4, + 0xc5, 0xa8, 0xc5, 0xae, 0x70, 0x63, 0x2c, 0x4a, 0xe3, 0x48, 0x1c, 0x74, + 0x61, 0x34, 0x6c, 0x07, 0xb4, 0x65, 0x66, 0xbc, 0x66, 0x39, 0x81, 0x05, + 0x25, 0x7a, 0x30, 0xdd, 0x7a, 0xb1, 0x8e, 0xe8, 0xb9, 0x42, 0xe5, 0xcc, + 0xbb, 0xa1, 0xea, 0xcc, 0x9a, 0x68, 0x73, 0x01, 0x20, 0x90, 0x51, 0x50, + 0x8f, 0xc1, 0xdc, 0x33, 0x0c, 0x02, 0xce, 0xf0, 0x22, 0x8c, 0x24, 0x60, + 0xea, 0x45, 0xb0, 0xc9, 0x75, 0x88, 0x82, 0xc5, 0xb4, 0x11, 0xda, 0x64, + 0x69, 0x70, 0x0e, 0x36, 0xae, 0x14, 0xc4, 0xab, 0xb9, 0x53, 0x48, 0xa5, + 0xeb, 0xa4, 0x2b, 0x65, 0xe7, 0x00, 0x58, 0x48, 0x41, 0x97, 0x23, 0xac, + 0x33, 0x9d, 0x3a, 0x14, 0x6f, 0x0e, 0xa9, 0x70, 0x5b, 0x67, 0x0c, 0x47, + 0x25, 0x68, 0x18, 0x0e, 0xb1, 0x34, 0x99, 0x34, 0x20, 0x10, 0x2b, 0x25, + 0xac, 0x3b, 0xf5, 0x95, 0xe6, 0xde, 0xa9, 0xdf, 0x2f, 0xc8, 0x31, 0xd1, + 0xb2, 0xd8, 0x96, 0x08, 0xab, 0x2a, 0x8d, 0x03, 0x87, 0x99, 0x89, 0x1a, + 0x57, 0xa6, 0xf1, 0x99, 0x66, 0x7a, 0xe9, 0x97, 0xa6, 0x99, 0x20, 0x4a, + 0xc9, 0x56, 0x41, 0xf7, 0x83, 0x89, 0xa8, 0xbb, 0x7a, 0x7f, 0x93, 0x31, + 0xa2, 0x2d, 0x44, 0x88, 0xf5, 0xab, 0xf0, 0x80, 0x1a, 0x6b, 0x00, 0xa3, + 0xe6, 0xcf, 0x62, 0x19, 0xc4, 0x39, 0x52, 0xf7, 0xaa, 0xff, 0x00, 0xda, + 0xe0, 0x40, 0xa8, 0xe5, 0x0d, 0x68, 0x8a, 0x0f, 0x75, 0x52, 0x2b, 0xd4, + 0xa7, 0xe6, 0x15, 0xa5, 0xcc, 0xbe, 0x6f, 0x98, 0xfd, 0xa5, 0x6f, 0x1b, + 0xe0, 0xfc, 0x02, 0x55, 0xcc, 0xea, 0xd2, 0x5d, 0x09, 0x16, 0x3d, 0xb5, + 0xc6, 0x8f, 0x4b, 0x94, 0x86, 0xcf, 0x8e, 0xf9, 0xf2, 0xc3, 0x2f, 0xc3, + 0x8f, 0x28, 0x25, 0xa0, 0x8d, 0x7d, 0x8f, 0x6f, 0xe2, 0x0a, 0xbc, 0x50, + 0xaa, 0x72, 0x0a, 0x29, 0x81, 0x57, 0xb6, 0x73, 0xa8, 0xb0, 0x45, 0x8a, + 0x52, 0xb1, 0xc7, 0xd8, 0x83, 0xdc, 0x4a, 0x26, 0xda, 0x88, 0x7b, 0xaa, + 0x3c, 0x91, 0xb1, 0x2b, 0x54, 0xc0, 0xfa, 0x96, 0x9e, 0xc5, 0x48, 0x02, + 0xc3, 0x7e, 0xfe, 0x87, 0x9f, 0xe8, 0x32, 0xbf, 0x99, 0xa7, 0xa0, 0xe5, + 0x1b, 0x6f, 0x05, 0xd4, 0x1d, 0x4e, 0x58, 0xba, 0x76, 0x38, 0x7d, 0x45, + 0x42, 0x47, 0xa2, 0xc4, 0x1d, 0xa8, 0xdd, 0xe8, 0xc7, 0xa3, 0x64, 0x00, + 0xbc, 0x29, 0xee, 0x4d, 0xd1, 0x12, 0xb8, 0x2d, 0x7e, 0xd0, 0x10, 0xd8, + 0xf8, 0x23, 0xd6, 0xfa, 0x6d, 0x08, 0xaf, 0x9b, 0xe2, 0x62, 0x56, 0x85, + 0x4e, 0x10, 0xf6, 0x2b, 0xe2, 0x01, 0x15, 0xcc, 0xec, 0x21, 0xad, 0x05, + 0x79, 0x60, 0xd6, 0x8b, 0x86, 0x95, 0x39, 0xcd, 0x43, 0x9c, 0xc2, 0x13, + 0x7b, 0x73, 0x9d, 0xd4, 0x58, 0x8b, 0x13, 0x2c, 0xcd, 0x34, 0x60, 0x3c, + 0x5c, 0x22, 0x2a, 0x68, 0xa9, 0x74, 0x73, 0x9d, 0xe6, 0x54, 0x82, 0x42, + 0x38, 0x81, 0x50, 0xc6, 0xbb, 0xbb, 0xc4, 0x39, 0x13, 0x1c, 0x77, 0x80, + 0xf5, 0x43, 0xd6, 0x22, 0xac, 0x06, 0xd7, 0x8e, 0x50, 0x5e, 0xc0, 0x13, + 0xba, 0x58, 0x6f, 0xfb, 0xe8, 0x03, 0xef, 0xc2, 0x77, 0x18, 0x60, 0x74, + 0xa5, 0x5b, 0xff, 0x00, 0x8e, 0xfa, 0x7d, 0x39, 0x5a, 0xd8, 0x6f, 0xa0, + 0x0a, 0x1e, 0xfd, 0xe0, 0xe4, 0x18, 0x50, 0x02, 0xdb, 0x50, 0x81, 0xdc, + 0x20, 0xb5, 0xf2, 0xc8, 0x20, 0x6b, 0x77, 0x66, 0x24, 0x4c, 0x96, 0x1b, + 0xb2, 0x1d, 0x47, 0x50, 0x7b, 0x10, 0xea, 0x10, 0x2b, 0xd2, 0x74, 0xc0, + 0x19, 0x9e, 0x17, 0xcd, 0x63, 0x19, 0x1c, 0x36, 0x65, 0x44, 0xee, 0xa5, + 0xaa, 0x58, 0x2c, 0x61, 0x1c, 0xd5, 0xe5, 0xf8, 0xad, 0x67, 0xb4, 0xb0, + 0x08, 0xf5, 0xfd, 0x9c, 0xc2, 0x09, 0x05, 0x5d, 0x78, 0xd7, 0x1a, 0x1e, + 0x22, 0x2b, 0x21, 0x2f, 0x88, 0xfb, 0x27, 0x2a, 0x32, 0xe2, 0xbe, 0xb7, + 0x1e, 0xe6, 0x50, 0x74, 0xe3, 0x16, 0x66, 0x2e, 0xeb, 0xca, 0xdd, 0xb1, + 0x0e, 0xd1, 0xa6, 0x94, 0xe1, 0x36, 0xb5, 0x8e, 0x15, 0xcf, 0x4d, 0x08, + 0x1f, 0x3d, 0x36, 0x5b, 0xac, 0xa0, 0x57, 0x95, 0xff, 0x00, 0x28, 0x14, + 0x1b, 0xa0, 0xde, 0x9d, 0xe3, 0x92, 0x5a, 0xb6, 0xac, 0xa9, 0xa0, 0x04, + 0x4f, 0x88, 0x29, 0xe9, 0xfb, 0x13, 0x56, 0x64, 0x99, 0x59, 0x93, 0x30, + 0x4c, 0x13, 0x29, 0x7d, 0xe8, 0x3d, 0xe5, 0x92, 0xa5, 0x26, 0xb3, 0x5f, + 0x68, 0x3a, 0xcc, 0x59, 0xbe, 0x25, 0x78, 0xb5, 0x4e, 0x4d, 0x07, 0xf8, + 0x82, 0xe2, 0xa9, 0xc9, 0x01, 0x13, 0x6b, 0x84, 0x22, 0x3a, 0x47, 0x5f, + 0x92, 0x1a, 0xb0, 0x37, 0xd2, 0x60, 0x13, 0xa9, 0x14, 0x89, 0xc9, 0x6d, + 0x2c, 0x6f, 0xc5, 0x6c, 0x0a, 0x35, 0xa1, 0xe9, 0x12, 0x28, 0xe0, 0x73, + 0x83, 0x4f, 0xf1, 0x2b, 0x7b, 0xfe, 0x32, 0xe2, 0xe0, 0x62, 0x69, 0xac, + 0x24, 0x90, 0x30, 0x8c, 0xd0, 0x10, 0x40, 0x50, 0x80, 0xf3, 0xe7, 0xcc, + 0x29, 0xdb, 0xa1, 0x4d, 0xe2, 0x18, 0x11, 0xc7, 0x5d, 0x3d, 0x2a, 0x26, + 0x69, 0x56, 0xd4, 0xb9, 0x5d, 0x66, 0x35, 0x37, 0x70, 0x29, 0xdc, 0xe5, + 0x0e, 0x53, 0xf8, 0x72, 0x72, 0xa5, 0x79, 0x66, 0x12, 0x77, 0xda, 0x61, + 0xa7, 0xcd, 0xba, 0x44, 0xed, 0x34, 0xbd, 0xe0, 0x84, 0xce, 0x86, 0x58, + 0x9e, 0x18, 0xfc, 0xcc, 0x07, 0x6a, 0xd4, 0x63, 0xb5, 0x59, 0xa2, 0xa9, + 0x85, 0x0f, 0x76, 0xcf, 0xbc, 0xfc, 0x49, 0x5f, 0xcc, 0xd6, 0x2d, 0xe8, + 0xff, 0x00, 0x70, 0x53, 0xf2, 0x3f, 0x71, 0x59, 0x1e, 0xc3, 0xf3, 0x72, + 0xaf, 0x81, 0x82, 0xba, 0x6c, 0xc8, 0x5e, 0xa1, 0x1a, 0x2d, 0x42, 0xcd, + 0x10, 0xf3, 0x09, 0xbc, 0x4c, 0x8b, 0x3b, 0x43, 0x16, 0x01, 0x68, 0x47, + 0x2f, 0x12, 0xab, 0xc4, 0xc0, 0x50, 0x71, 0x71, 0x87, 0x3b, 0x68, 0x08, + 0x94, 0xef, 0xc4, 0x0c, 0xfc, 0x84, 0xfc, 0xc3, 0x78, 0x6d, 0x00, 0x0e, + 0xce, 0x18, 0xa4, 0x9f, 0xae, 0x03, 0xed, 0xb9, 0x6f, 0xb7, 0x48, 0xba, + 0x18, 0x50, 0x0a, 0x01, 0x67, 0x99, 0x72, 0x5c, 0xce, 0x89, 0x18, 0x74, + 0xb9, 0xfa, 0xa6, 0x49, 0x69, 0x78, 0xe1, 0xd9, 0xb4, 0x05, 0x7d, 0xee, + 0x55, 0x17, 0x54, 0xa1, 0x5d, 0xab, 0x63, 0x48, 0x8d, 0x74, 0x67, 0xfb, + 0x63, 0x38, 0x1c, 0xae, 0x3e, 0x6a, 0x35, 0x81, 0x84, 0x43, 0x46, 0x75, + 0x96, 0x51, 0x5b, 0x0d, 0xf0, 0x34, 0x71, 0xd7, 0x99, 0x8d, 0x6e, 0xea, + 0x1c, 0xbd, 0xd9, 0xa0, 0xe5, 0xe6, 0x0c, 0xc5, 0x5d, 0x60, 0x15, 0x97, + 0x26, 0x71, 0x97, 0x18, 0x41, 0x6b, 0xd2, 0x33, 0xce, 0xf2, 0x9d, 0x00, + 0x25, 0xda, 0xb0, 0xb9, 0x94, 0x3d, 0x1b, 0xf9, 0xc0, 0x99, 0x61, 0xb9, + 0x55, 0xf7, 0x9a, 0x49, 0x40, 0xcc, 0xbe, 0x96, 0x84, 0x17, 0xc6, 0x52, + 0x5c, 0x84, 0x7b, 0x12, 0xa0, 0x86, 0x1d, 0xe4, 0x7e, 0xe4, 0x66, 0x1a, + 0x65, 0x24, 0xf7, 0x98, 0x34, 0xb6, 0x08, 0x19, 0xba, 0x08, 0xd8, 0x0e, + 0x6b, 0x4b, 0xf8, 0x80, 0x5c, 0xf1, 0xed, 0xbc, 0x95, 0x65, 0xe4, 0x15, + 0xb4, 0x59, 0x95, 0xba, 0x00, 0x75, 0x0c, 0x9a, 0x60, 0x3c, 0x0b, 0x00, + 0x3a, 0x86, 0xc1, 0x54, 0x1b, 0x9d, 0x26, 0x22, 0x2d, 0x51, 0x68, 0xf6, + 0xe9, 0x50, 0x57, 0xa9, 0x66, 0x77, 0x75, 0xbd, 0xdb, 0xbe, 0xec, 0xa3, + 0xe0, 0x0a, 0xb0, 0xc7, 0x4e, 0x60, 0xd1, 0xa9, 0x4a, 0xb1, 0x64, 0xf1, + 0x78, 0x8e, 0xe4, 0x56, 0x91, 0xc2, 0x9a, 0x3d, 0xe0, 0x0b, 0xa0, 0x36, + 0xbb, 0xac, 0x8c, 0xa0, 0x55, 0x88, 0xa3, 0x78, 0x8c, 0x54, 0x29, 0x5d, + 0x62, 0xcd, 0x41, 0x69, 0x1b, 0xae, 0x66, 0xac, 0x85, 0x97, 0xaa, 0x66, + 0x42, 0x81, 0xc2, 0xd3, 0xf5, 0x2d, 0xa1, 0xe1, 0xa2, 0x93, 0xb9, 0x18, + 0xe9, 0x8a, 0xb8, 0x1c, 0x5a, 0xa3, 0x2d, 0xac, 0x9c, 0x57, 0xb1, 0x09, + 0x35, 0xc2, 0x07, 0x63, 0x43, 0x19, 0x97, 0xa0, 0x51, 0xb1, 0x2e, 0x9e, + 0x88, 0xb5, 0xa3, 0xb3, 0x1a, 0x9d, 0xf8, 0xa8, 0x5d, 0x61, 0x23, 0x15, + 0xc4, 0x2a, 0x6b, 0x8d, 0x6e, 0x5c, 0x47, 0xf0, 0xa5, 0x4b, 0x33, 0xbe, + 0x81, 0x94, 0x56, 0x4f, 0x04, 0x78, 0x97, 0x46, 0xcb, 0xf2, 0x40, 0xd9, + 0x28, 0xe9, 0xe2, 0x2c, 0x61, 0x5d, 0xe5, 0xe3, 0x59, 0xdf, 0xdc, 0x65, + 0xa7, 0xa2, 0x3b, 0xb8, 0x71, 0x2d, 0x31, 0x8b, 0xa4, 0xdd, 0x90, 0x71, + 0x15, 0x1a, 0x6a, 0x8f, 0xb1, 0xbb, 0xb2, 0xe0, 0xa6, 0xea, 0x2d, 0x14, + 0x02, 0x30, 0x14, 0x86, 0xb1, 0x12, 0x25, 0x2a, 0x47, 0x78, 0x7b, 0x3b, + 0x05, 0x14, 0x75, 0xda, 0x58, 0xba, 0xae, 0xd3, 0xa9, 0xea, 0x16, 0x32, + 0x84, 0x98, 0xaf, 0x57, 0xa0, 0x1c, 0x65, 0x9e, 0xb5, 0x53, 0x30, 0xf7, + 0x78, 0x02, 0xcd, 0xec, 0x60, 0x8b, 0xbc, 0x0f, 0x6a, 0x89, 0xa9, 0x56, + 0xa8, 0x23, 0x8b, 0x03, 0xe2, 0x04, 0x7d, 0xca, 0xaa, 0xc4, 0xc6, 0x25, + 0xa1, 0x88, 0x74, 0x2a, 0x18, 0x25, 0x44, 0xb9, 0x82, 0x90, 0xa3, 0x35, + 0x16, 0x40, 0x6e, 0xd8, 0x6d, 0xe6, 0x12, 0xac, 0x06, 0xe0, 0x66, 0x58, + 0xac, 0x0c, 0xc0, 0xa7, 0x10, 0xf3, 0x00, 0x46, 0x72, 0x2c, 0x86, 0xdf, + 0xb5, 0xee, 0x7a, 0x16, 0xcf, 0x47, 0x60, 0x0f, 0xf1, 0xda, 0x5e, 0x33, + 0x2a, 0x30, 0xc6, 0x27, 0x96, 0x7c, 0x45, 0xcc, 0x3d, 0x17, 0x29, 0x5b, + 0x2f, 0xac, 0xbb, 0xeb, 0xde, 0x3b, 0x99, 0x43, 0x65, 0xdb, 0x54, 0x14, + 0x08, 0x9d, 0x62, 0xef, 0x6c, 0x35, 0x29, 0xe7, 0x95, 0xe6, 0xd8, 0x70, + 0x7c, 0x33, 0x96, 0xb0, 0x38, 0xa8, 0x56, 0xc1, 0x9a, 0x40, 0xe7, 0x66, + 0x23, 0xd4, 0x22, 0x1a, 0xfa, 0x69, 0x1f, 0x58, 0xba, 0xcc, 0xd9, 0x5f, + 0x1c, 0xa1, 0x64, 0xeb, 0x1f, 0xa1, 0xc9, 0x33, 0x12, 0x8a, 0x83, 0xc2, + 0x9f, 0x09, 0x52, 0xb8, 0x0a, 0xc6, 0x66, 0x5c, 0x16, 0x5d, 0x19, 0x50, + 0x51, 0xe0, 0xfc, 0x41, 0xd8, 0x26, 0x68, 0xe2, 0x15, 0x29, 0x19, 0x43, + 0x2c, 0xbd, 0x8c, 0x67, 0x48, 0x00, 0x00, 0xa5, 0x17, 0x64, 0x6e, 0x77, + 0x30, 0xba, 0xd0, 0x7f, 0xd6, 0x9a, 0xd5, 0x4f, 0x9d, 0x88, 0x54, 0xc5, + 0x7f, 0x64, 0x65, 0x6d, 0xd2, 0xaa, 0xc7, 0x6d, 0xe2, 0x63, 0x4e, 0xba, + 0x07, 0x8a, 0x22, 0xa2, 0x6c, 0xba, 0xa2, 0xab, 0x36, 0x33, 0xac, 0x74, + 0x54, 0x05, 0x96, 0xb7, 0x5a, 0xc4, 0x93, 0x13, 0x68, 0xb0, 0x34, 0xe1, + 0x9d, 0x1d, 0xcd, 0x7d, 0xef, 0x43, 0x37, 0x2a, 0x8f, 0xbc, 0xbc, 0x8d, + 0xab, 0x2d, 0x51, 0x9e, 0x60, 0x82, 0xbd, 0x35, 0xab, 0xfe, 0x26, 0x5a, + 0xb8, 0x1b, 0x50, 0x0a, 0xb5, 0xe9, 0x2f, 0x01, 0x05, 0x0d, 0xcc, 0x8a, + 0x35, 0xec, 0xc7, 0x37, 0x98, 0x24, 0x98, 0x3c, 0x00, 0x56, 0x84, 0xd4, + 0xcc, 0x3b, 0x5c, 0x5a, 0x4b, 0x88, 0xa8, 0x9f, 0xd7, 0x2d, 0xe1, 0x54, + 0x27, 0xe9, 0x1f, 0x1c, 0x35, 0x94, 0xb5, 0x9b, 0x6f, 0xe3, 0x32, 0xaa, + 0x55, 0x7a, 0x56, 0x74, 0x21, 0x6a, 0xd8, 0xd5, 0x97, 0x75, 0x28, 0xf7, + 0x47, 0x52, 0xd5, 0x9d, 0x68, 0xa1, 0x62, 0x10, 0xf1, 0x3a, 0x38, 0x9f, + 0x33, 0x14, 0x48, 0x26, 0xe4, 0x44, 0xa6, 0xaf, 0x58, 0xa9, 0xab, 0xae, + 0x81, 0x83, 0x85, 0xd0, 0x6f, 0x29, 0xb7, 0x69, 0x63, 0xa7, 0x5a, 0x89, + 0x68, 0x59, 0x03, 0x03, 0x2b, 0x35, 0xac, 0xa5, 0xa5, 0xab, 0x49, 0x71, + 0x77, 0x4a, 0x14, 0x69, 0x70, 0xc2, 0x12, 0x28, 0x95, 0xdf, 0x58, 0xed, + 0xb4, 0x38, 0xc9, 0x5e, 0xf1, 0x24, 0x2e, 0x05, 0x42, 0xe8, 0x3c, 0xac, + 0x26, 0xbc, 0x41, 0xe4, 0x40, 0xf4, 0x48, 0xd9, 0xee, 0xa6, 0x63, 0x00, + 0x2b, 0xc4, 0x11, 0x88, 0xc8, 0x1d, 0x30, 0x98, 0xd2, 0x82, 0x61, 0xf4, + 0xe8, 0x66, 0x24, 0xd5, 0x3b, 0xc0, 0x57, 0x5b, 0xe5, 0x2f, 0x18, 0x86, + 0x54, 0x12, 0xb1, 0x19, 0x4c, 0x4a, 0x42, 0x52, 0x16, 0xca, 0x05, 0x46, + 0x3d, 0x48, 0x21, 0xac, 0xbb, 0x79, 0x79, 0xac, 0x4c, 0xe6, 0xa5, 0xd7, + 0x99, 0x6a, 0xcb, 0xf8, 0x97, 0xdc, 0x5a, 0xca, 0x66, 0x1e, 0x61, 0x66, + 0x55, 0x26, 0x39, 0x65, 0x56, 0xb6, 0xc9, 0x2c, 0xcd, 0x15, 0x16, 0xe7, + 0x61, 0x0c, 0xda, 0x9d, 0xa6, 0x4c, 0x61, 0xc2, 0x60, 0xb9, 0x19, 0x82, + 0x82, 0xf4, 0xea, 0x7f, 0xb9, 0x83, 0x4f, 0x4d, 0xc0, 0x05, 0x32, 0x9b, + 0x88, 0x53, 0xbd, 0x37, 0xc4, 0x76, 0x4a, 0x29, 0xd7, 0x19, 0xcf, 0xe6, + 0x2c, 0xcd, 0x09, 0xae, 0x81, 0xde, 0x1b, 0x41, 0x1d, 0x72, 0xa8, 0x2d, + 0x51, 0x4c, 0x3d, 0xe2, 0xe9, 0x21, 0x6e, 0x92, 0xff, 0x00, 0xfa, 0x96, + 0x17, 0x5a, 0xca, 0x39, 0xf4, 0x6c, 0x99, 0xdf, 0x4f, 0xbd, 0x1e, 0x5d, + 0xe3, 0xa8, 0xd7, 0x8e, 0x7e, 0x83, 0x46, 0x1f, 0x11, 0xf9, 0x65, 0x54, + 0xb9, 0x8a, 0x63, 0xb8, 0xa9, 0x21, 0x59, 0x6d, 0x75, 0x88, 0xb0, 0xf2, + 0x6e, 0x1a, 0x20, 0x55, 0xe5, 0xcc, 0xcb, 0xa3, 0xa4, 0xc3, 0x83, 0xa3, + 0x93, 0xc4, 0x53, 0xc1, 0x99, 0xfb, 0x42, 0x29, 0xab, 0x55, 0xaa, 0xce, + 0xd2, 0xd2, 0x0a, 0x80, 0x03, 0xab, 0x4a, 0x71, 0x8d, 0x81, 0xaa, 0x57, + 0x41, 0xf1, 0x0b, 0x08, 0x89, 0x86, 0x55, 0xb8, 0x96, 0xf6, 0x37, 0xdb, + 0x88, 0xd0, 0xc3, 0x5c, 0x98, 0x73, 0x50, 0x68, 0xba, 0x99, 0xd2, 0x34, + 0x78, 0xcc, 0xa1, 0x15, 0x32, 0x2c, 0x07, 0x72, 0x55, 0x00, 0xa0, 0x2e, + 0xb5, 0xed, 0x07, 0x08, 0xa3, 0x49, 0x42, 0xd4, 0x56, 0x35, 0xad, 0x78, + 0x81, 0x23, 0x4b, 0xb3, 0x4b, 0x0d, 0xb6, 0x75, 0xde, 0xe2, 0xa3, 0x8b, + 0x61, 0x46, 0x85, 0xc6, 0x2b, 0x80, 0xae, 0xb7, 0x14, 0xa7, 0x19, 0x82, + 0x81, 0x23, 0x46, 0x2d, 0xe3, 0x78, 0xb8, 0x0c, 0xd2, 0x27, 0xe7, 0x48, + 0x06, 0x13, 0x7c, 0xea, 0x61, 0xce, 0x9b, 0x47, 0x52, 0x86, 0xc5, 0xb4, + 0x1d, 0x2e, 0x22, 0x5d, 0x5e, 0x03, 0x11, 0x5b, 0xcf, 0xf5, 0x45, 0x5d, + 0xd6, 0x66, 0x8e, 0x5a, 0xc7, 0x98, 0xe1, 0x87, 0x48, 0xb8, 0x97, 0xbe, + 0x03, 0x1c, 0x8c, 0xed, 0x03, 0x15, 0x06, 0x76, 0x9c, 0x17, 0x02, 0x36, + 0xe6, 0x0a, 0x58, 0x73, 0xb1, 0x63, 0x48, 0xf8, 0x86, 0x2b, 0x0e, 0x25, + 0xc0, 0x2e, 0x3b, 0x17, 0x98, 0xc1, 0xd5, 0x88, 0xcb, 0x99, 0xb9, 0x79, + 0x20, 0x55, 0x58, 0x19, 0x79, 0xcc, 0x5a, 0x4a, 0x1b, 0xf2, 0x20, 0x0c, + 0x22, 0x6b, 0x7d, 0xd5, 0xe0, 0xa3, 0x3a, 0x97, 0xda, 0x3b, 0x90, 0xcd, + 0x4d, 0x2e, 0xa0, 0x11, 0x23, 0x08, 0xb8, 0x36, 0xd0, 0x06, 0x85, 0x45, + 0x9a, 0xfa, 0x59, 0x61, 0x9c, 0x50, 0xeb, 0x36, 0x5d, 0xe4, 0x82, 0xf6, + 0xd2, 0xf7, 0x70, 0x9b, 0x89, 0x97, 0x12, 0xaf, 0x43, 0x2c, 0xa9, 0x62, + 0x64, 0xe2, 0x2e, 0xeb, 0x3f, 0xba, 0xca, 0x2a, 0x2a, 0xa9, 0x55, 0x42, + 0x03, 0x33, 0x10, 0x8c, 0x2a, 0x22, 0x81, 0xfb, 0x8f, 0xbc, 0x30, 0x21, + 0x88, 0xb4, 0x73, 0x72, 0xed, 0xe6, 0xae, 0x49, 0xa9, 0x99, 0x7d, 0xcd, + 0x49, 0x75, 0xc0, 0x6e, 0x21, 0xb9, 0xad, 0x33, 0x4a, 0x34, 0x56, 0x5c, + 0x89, 0x4c, 0xc5, 0xa7, 0x71, 0x92, 0x3f, 0x5e, 0x89, 0x73, 0xfc, 0x39, + 0x8f, 0xde, 0x5a, 0xe6, 0x7c, 0xd7, 0xe8, 0x59, 0xd8, 0x86, 0x87, 0x0a, + 0x2d, 0x45, 0xf4, 0x61, 0xa2, 0x61, 0x85, 0xa6, 0x90, 0x0b, 0xfe, 0x84, + 0xae, 0x53, 0x1e, 0xd1, 0xf4, 0x87, 0xde, 0x29, 0x8a, 0xdd, 0x65, 0x43, + 0x09, 0xd1, 0x8f, 0x6a, 0x3b, 0x44, 0x9a, 0x3e, 0xe8, 0x3b, 0x11, 0xc1, + 0x0a, 0xbb, 0x8c, 0xeb, 0x88, 0xa3, 0x26, 0x77, 0x8d, 0xc3, 0x5d, 0x90, + 0x43, 0x46, 0x09, 0x30, 0x43, 0x09, 0x6f, 0xeb, 0xf7, 0x21, 0xf9, 0x8a, + 0x06, 0xa6, 0xf6, 0x5e, 0x63, 0xc9, 0x2e, 0xa9, 0x80, 0xe0, 0xc6, 0x26, + 0x06, 0x34, 0x02, 0x93, 0x40, 0xb8, 0x97, 0x6e, 0x0c, 0x21, 0xb8, 0x08, + 0x59, 0xb6, 0xe4, 0x2b, 0x04, 0x6b, 0xe4, 0x86, 0x86, 0xd3, 0xac, 0x4b, + 0x24, 0x45, 0x02, 0x3d, 0x22, 0x32, 0xc1, 0xaf, 0x71, 0x4d, 0x08, 0x39, + 0xaa, 0x85, 0x6c, 0x40, 0x16, 0x17, 0x15, 0x01, 0x66, 0xb7, 0x7b, 0xb8, + 0x94, 0xc5, 0x5b, 0xa5, 0xeb, 0xa4, 0x56, 0x59, 0x94, 0x1c, 0x45, 0xab, + 0x7e, 0x0f, 0x68, 0x01, 0xc6, 0x13, 0x61, 0x6d, 0xb5, 0xe6, 0x62, 0xab, + 0x7f, 0x0c, 0x53, 0x8d, 0x5e, 0x58, 0x5f, 0xac, 0x68, 0x02, 0xfd, 0x9e, + 0x63, 0xea, 0x05, 0x42, 0x7f, 0x74, 0xf6, 0x95, 0xdc, 0xd5, 0xbf, 0x11, + 0xc9, 0xc2, 0x59, 0xc1, 0x88, 0xa4, 0x0a, 0x9c, 0x46, 0x78, 0xba, 0x28, + 0x69, 0x84, 0x77, 0x77, 0xf1, 0x05, 0xc0, 0x2d, 0x5e, 0x0c, 0xd3, 0xe1, + 0x20, 0x21, 0x42, 0xba, 0x19, 0x60, 0x4b, 0x5c, 0x74, 0x95, 0xba, 0xff, + 0x00, 0x36, 0x2f, 0x21, 0x99, 0xe2, 0xb6, 0x3c, 0xc7, 0x08, 0x63, 0x46, + 0x0f, 0x30, 0x5f, 0x89, 0x44, 0x54, 0x18, 0x8e, 0x1c, 0x4b, 0x9c, 0xb0, + 0x01, 0xb4, 0x6f, 0x9a, 0xe9, 0x04, 0x07, 0x15, 0xa9, 0x05, 0x2d, 0x6b, + 0x0d, 0xb2, 0x4b, 0x18, 0xb4, 0xa7, 0x74, 0x62, 0xe1, 0x37, 0x63, 0x75, + 0x73, 0xde, 0xeb, 0x17, 0x2c, 0x91, 0xb8, 0x83, 0x59, 0x54, 0xd9, 0xca, + 0xa7, 0x1d, 0xa5, 0x6d, 0x59, 0x46, 0x8b, 0x2e, 0x94, 0x6a, 0x03, 0x70, + 0x6f, 0x56, 0xd1, 0x05, 0x3e, 0x8a, 0x6a, 0xac, 0x54, 0xac, 0xfa, 0x31, + 0x3d, 0x0a, 0x9e, 0xd7, 0xfa, 0x4a, 0x84, 0xc1, 0xac, 0xa6, 0xe6, 0x68, + 0x4e, 0x49, 0x57, 0x74, 0x82, 0xd3, 0x75, 0x33, 0x0a, 0x97, 0x69, 0xb9, + 0x4d, 0x66, 0x68, 0xe2, 0x55, 0x53, 0x47, 0x31, 0x8a, 0xcc, 0x5c, 0x46, + 0x0a, 0xb9, 0x85, 0xcc, 0xc1, 0xac, 0x1a, 0xd6, 0x07, 0x33, 0xaf, 0xe8, + 0xd4, 0x73, 0x1d, 0x2e, 0x66, 0xb7, 0xa0, 0xdb, 0xcc, 0x8c, 0xc2, 0x4a, + 0x66, 0x89, 0xd4, 0xa9, 0x7c, 0xac, 0xbc, 0xca, 0x94, 0x7e, 0xa1, 0xf6, + 0xff, 0x00, 0xa9, 0x92, 0xcc, 0xf9, 0xaf, 0xd0, 0x52, 0xc4, 0xfa, 0x5f, + 0x3e, 0x97, 0x16, 0x5f, 0xe6, 0x65, 0xe2, 0x60, 0x88, 0x5a, 0x07, 0x35, + 0x13, 0xb5, 0x34, 0xe0, 0xad, 0x0a, 0x98, 0xc6, 0x9d, 0x61, 0x68, 0x23, + 0x0d, 0x26, 0x34, 0xe9, 0x12, 0x5d, 0x5c, 0x2c, 0x28, 0x82, 0x8a, 0xa9, + 0x61, 0x60, 0xdc, 0xd8, 0x63, 0xb7, 0x0d, 0xe0, 0xee, 0x57, 0x7b, 0x82, + 0x71, 0x66, 0xd9, 0x84, 0x9c, 0xf9, 0x85, 0x3d, 0x03, 0xaa, 0x6b, 0x3c, + 0xa4, 0xa7, 0x6b, 0xbc, 0x69, 0x37, 0x2c, 0xbc, 0xcc, 0xd3, 0x21, 0x15, + 0x2c, 0x14, 0x11, 0xf7, 0x71, 0xde, 0x1c, 0xca, 0x1c, 0xcc, 0x84, 0x7a, + 0x53, 0x5a, 0x81, 0x14, 0x5a, 0x62, 0x1c, 0x9e, 0x90, 0x80, 0x8a, 0x9d, + 0x46, 0x20, 0xee, 0x06, 0xd8, 0x8c, 0x1d, 0xa8, 0x0c, 0x5f, 0x6d, 0xe5, + 0xdc, 0x2a, 0x6d, 0x5d, 0x56, 0x56, 0x65, 0x62, 0x2e, 0xb0, 0x5b, 0x02, + 0xf1, 0x7f, 0xe4, 0x43, 0xac, 0xbb, 0xec, 0xbf, 0x88, 0x43, 0x6c, 0xdf, + 0x73, 0x83, 0xe0, 0xf9, 0x8c, 0x0a, 0xea, 0x55, 0x41, 0xb7, 0xad, 0x33, + 0x52, 0xa2, 0xf0, 0xef, 0x34, 0x38, 0x9e, 0xc1, 0x08, 0x12, 0xc8, 0xe8, + 0x36, 0xf1, 0xb4, 0xba, 0x61, 0x6b, 0x1a, 0xb4, 0x3a, 0x41, 0x0e, 0x4f, + 0x1a, 0xb2, 0x9c, 0x8a, 0xe9, 0x2a, 0xb5, 0xaf, 0xd5, 0x31, 0x1e, 0xa8, + 0xb2, 0x8b, 0x6c, 0x5b, 0xca, 0x18, 0x52, 0x61, 0x30, 0x3b, 0xca, 0x83, + 0x75, 0xf8, 0x26, 0xad, 0xa4, 0xab, 0x31, 0x5d, 0xe3, 0xee, 0x61, 0x57, + 0x3a, 0xca, 0x73, 0x60, 0x4c, 0x74, 0xa0, 0xa0, 0xa6, 0x50, 0x4c, 0xc4, + 0x04, 0xb1, 0xb2, 0x5a, 0x03, 0x78, 0x56, 0xba, 0xb1, 0x01, 0x46, 0x47, + 0x8c, 0xcb, 0xc5, 0x81, 0x90, 0x1d, 0x32, 0xc7, 0x0e, 0xaf, 0x98, 0xed, + 0xda, 0x26, 0x89, 0xdc, 0x8d, 0xb1, 0x6d, 0x72, 0xac, 0xa9, 0x5e, 0x63, + 0xe8, 0x61, 0xac, 0xa8, 0x7f, 0xb8, 0x45, 0xae, 0x6b, 0x4a, 0x9f, 0x40, + 0x9c, 0xb3, 0xcc, 0x21, 0xcb, 0xca, 0x3f, 0x04, 0x55, 0x10, 0x42, 0xa5, + 0x33, 0x4a, 0x69, 0x54, 0x6c, 0x66, 0x75, 0xa6, 0x96, 0xc8, 0x56, 0x1c, + 0x35, 0x26, 0xb6, 0x62, 0xc6, 0x6f, 0x42, 0x3d, 0x74, 0x97, 0x8f, 0xa1, + 0x8d, 0x65, 0xf7, 0x16, 0xb1, 0xde, 0xf3, 0x77, 0xa6, 0xab, 0xf5, 0x4b, + 0xbb, 0x7e, 0x04, 0x56, 0xc2, 0x78, 0xe1, 0xfd, 0x77, 0x97, 0x3c, 0xd1, + 0x2f, 0x70, 0xb4, 0x61, 0xe7, 0xda, 0x62, 0x7c, 0x7d, 0x92, 0xe3, 0x17, + 0xb3, 0xaf, 0x99, 0x78, 0x86, 0x0f, 0xa1, 0x4c, 0x19, 0x73, 0x6c, 0x9c, + 0x16, 0x48, 0xaf, 0xda, 0x80, 0xdb, 0xb4, 0xab, 0x85, 0x44, 0xd9, 0x96, + 0xaf, 0x0e, 0xe4, 0x4c, 0x3d, 0xf3, 0x94, 0x3c, 0xb0, 0xf5, 0xb2, 0xba, + 0x3d, 0x25, 0xad, 0x53, 0x0a, 0xf3, 0x88, 0x28, 0x18, 0xf9, 0x82, 0xf1, + 0xf1, 0x05, 0x8b, 0xbf, 0x68, 0x5a, 0xe5, 0x13, 0x81, 0xf3, 0x7f, 0x88, + 0xe2, 0x88, 0xcc, 0xc1, 0xf4, 0x2c, 0xa8, 0x68, 0x6e, 0x11, 0x8a, 0x69, + 0x73, 0xc0, 0xa5, 0x95, 0xef, 0xfa, 0x96, 0x96, 0x01, 0x26, 0xa2, 0x83, + 0xe6, 0x29, 0x42, 0x82, 0x05, 0x64, 0xa6, 0xdf, 0xc4, 0x25, 0xae, 0x38, + 0x96, 0x98, 0xa9, 0x62, 0x16, 0x71, 0x1d, 0x02, 0xed, 0x46, 0xfd, 0x23, + 0x02, 0x02, 0x8e, 0x6e, 0x19, 0xd7, 0x2b, 0x2c, 0x5a, 0x88, 0x09, 0xbf, + 0xd3, 0x36, 0xce, 0xb0, 0x13, 0x5c, 0x01, 0xd8, 0x50, 0x83, 0xd4, 0x5a, + 0xba, 0xd2, 0x37, 0xa6, 0xb0, 0x6b, 0x26, 0x22, 0xc1, 0x70, 0xe7, 0x07, + 0x83, 0xf3, 0x30, 0x16, 0xad, 0x2b, 0x4e, 0xc4, 0xca, 0x82, 0x4f, 0x25, + 0x58, 0xf5, 0x16, 0x55, 0xd6, 0x63, 0xe6, 0xd6, 0x41, 0x25, 0xb6, 0xe8, + 0x80, 0x86, 0xaf, 0x0e, 0x2c, 0xa2, 0xd3, 0xde, 0x2c, 0x10, 0x8d, 0x31, + 0x91, 0x11, 0x8e, 0xee, 0x76, 0x7a, 0x4a, 0xdd, 0x6e, 0xe3, 0x81, 0x8c, + 0xeb, 0x33, 0x29, 0x7a, 0x4c, 0x82, 0x33, 0x72, 0xdd, 0xd6, 0x76, 0x8e, + 0x8c, 0x38, 0x75, 0x81, 0x6b, 0x79, 0x8e, 0x87, 0xac, 0x48, 0x39, 0x97, + 0xb6, 0x93, 0x55, 0xd2, 0x15, 0x32, 0xda, 0x19, 0x4f, 0x2a, 0x95, 0x43, + 0x73, 0xf8, 0x4d, 0x87, 0xbf, 0x8d, 0x62, 0xae, 0xa3, 0xf9, 0x27, 0xc2, + 0xf4, 0xb9, 0x71, 0x11, 0x62, 0x2d, 0x4a, 0x46, 0x07, 0x8c, 0xf1, 0x46, + 0x74, 0x8a, 0xdc, 0x01, 0x30, 0xab, 0x12, 0xbc, 0xbb, 0xcb, 0x9b, 0x91, + 0x7c, 0x26, 0x22, 0x31, 0x53, 0x39, 0xe8, 0xa1, 0x53, 0xad, 0x14, 0x89, + 0xbe, 0x60, 0xaa, 0xe5, 0xdd, 0x5a, 0x8f, 0xcd, 0xc1, 0xac, 0xe2, 0x5f, + 0x71, 0xea, 0x58, 0x33, 0x52, 0x5a, 0x54, 0xb3, 0x56, 0x22, 0x98, 0xae, + 0x0b, 0xb2, 0x0a, 0xff, 0x00, 0x90, 0xc5, 0x2d, 0xad, 0xe1, 0x1f, 0x91, + 0x32, 0x45, 0x71, 0xdf, 0x6f, 0x66, 0x5d, 0x09, 0x2e, 0x70, 0x86, 0x15, + 0xb8, 0xe8, 0xbf, 0xab, 0x7d, 0x0c, 0x27, 0xc3, 0xf9, 0x89, 0xa4, 0x10, + 0xbe, 0x56, 0xa6, 0xad, 0xea, 0x9a, 0xd7, 0xcd, 0x68, 0x1d, 0x21, 0xb8, + 0x93, 0x92, 0xa1, 0xf6, 0xa6, 0x3e, 0xa1, 0x98, 0xb6, 0x8c, 0x1e, 0x2a, + 0x37, 0xfd, 0x51, 0xd0, 0xd9, 0x94, 0x6e, 0x9e, 0xa4, 0x2b, 0xa9, 0x94, + 0x5a, 0x35, 0x83, 0x35, 0x1c, 0xa9, 0xe8, 0x41, 0xe3, 0xb4, 0x0d, 0xd9, + 0xab, 0x89, 0xb6, 0xb4, 0xbd, 0x20, 0xe9, 0x06, 0x0b, 0x58, 0x94, 0xdb, + 0x03, 0xf0, 0xbd, 0x1c, 0x13, 0x34, 0x18, 0xb2, 0x4b, 0x98, 0x6c, 0x6d, + 0xf5, 0xb2, 0xac, 0x67, 0x30, 0x46, 0xc2, 0xb4, 0xec, 0xc1, 0x6d, 0x82, + 0x50, 0xdf, 0x79, 0x7f, 0xa6, 0xda, 0x0a, 0x1f, 0x72, 0xeb, 0x7a, 0x1e, + 0xb1, 0x10, 0x68, 0x60, 0x75, 0x98, 0x19, 0xcc, 0x04, 0xd9, 0x94, 0x26, + 0x1a, 0x94, 0x47, 0x6c, 0x6c, 0x23, 0x45, 0x55, 0x72, 0xd5, 0xe2, 0x99, + 0x2e, 0x58, 0xb0, 0xa8, 0x7f, 0x35, 0x2f, 0x18, 0xe3, 0x48, 0x34, 0xcc, + 0x41, 0x6f, 0x18, 0x80, 0x40, 0xa6, 0x3d, 0x60, 0x85, 0x19, 0x62, 0x35, + 0x39, 0x9a, 0x80, 0x42, 0x20, 0x17, 0x74, 0xd0, 0x43, 0x40, 0x05, 0x5e, + 0x73, 0xe8, 0x53, 0x00, 0x53, 0xdd, 0x33, 0x1e, 0x76, 0xf0, 0xbb, 0x86, + 0x97, 0x1f, 0x64, 0xcc, 0xcc, 0x72, 0x8f, 0x1c, 0xc2, 0x91, 0xf4, 0xb7, + 0xb1, 0x18, 0xe2, 0x7b, 0x2c, 0x42, 0xee, 0xbc, 0xff, 0x00, 0x71, 0x12, + 0x9f, 0x78, 0xc5, 0xc4, 0xc9, 0xb3, 0x89, 0x4c, 0xfd, 0x8f, 0x71, 0x30, + 0x7a, 0x4b, 0xb1, 0xd2, 0x15, 0x4c, 0xb3, 0x98, 0x8a, 0x82, 0x58, 0xa6, + 0xf1, 0xd4, 0x88, 0x59, 0xac, 0xcf, 0x43, 0x2e, 0xb0, 0x03, 0x14, 0x1d, + 0x6e, 0xbc, 0x40, 0x1c, 0x1d, 0x72, 0xc6, 0xa3, 0xd4, 0x24, 0x66, 0xf5, + 0x8c, 0x22, 0x9c, 0x01, 0xac, 0x20, 0x50, 0xc4, 0x4d, 0xf2, 0x47, 0xed, + 0xcb, 0xa9, 0x71, 0xf4, 0x0b, 0xd2, 0xc5, 0xf5, 0x49, 0xe1, 0x2a, 0x99, + 0xa3, 0x1d, 0xd2, 0x87, 0xa4, 0xf3, 0x09, 0xdc, 0xdf, 0x4a, 0x51, 0x4c, + 0xc8, 0x41, 0xb2, 0xe5, 0x55, 0x99, 0x9f, 0x58, 0x37, 0xad, 0xca, 0xf7, + 0x97, 0x6b, 0xe9, 0x35, 0x8c, 0x5d, 0x18, 0x8a, 0xdc, 0x54, 0x8c, 0x0e, + 0xf1, 0x58, 0xe2, 0x6a, 0x4c, 0x0c, 0x53, 0x7c, 0xba, 0xe5, 0x81, 0xe9, + 0x66, 0xf8, 0x87, 0x9a, 0xaf, 0x32, 0x9a, 0x34, 0x48, 0xb1, 0x02, 0x75, + 0x1f, 0x43, 0xa8, 0x7e, 0x23, 0x60, 0xbd, 0x01, 0xde, 0x5a, 0x5c, 0x23, + 0x32, 0x3c, 0xb8, 0x8e, 0x8b, 0xfa, 0xbf, 0x42, 0xc7, 0xbb, 0x8a, 0xd2, + 0x67, 0x15, 0x45, 0xaa, 0xe9, 0xb8, 0xb9, 0xca, 0x6d, 0x8e, 0x21, 0x73, + 0x32, 0x7d, 0xae, 0xb7, 0xca, 0xbe, 0x20, 0x49, 0x1f, 0xcd, 0x0a, 0x2e, + 0xe6, 0x0c, 0x30, 0x7a, 0xb1, 0xb8, 0x6b, 0xb0, 0xc1, 0xf1, 0x8b, 0xa3, + 0x2a, 0xdb, 0x73, 0xb3, 0x0c, 0x55, 0x0a, 0x60, 0x6e, 0xff, 0x00, 0xc8, + 0x16, 0xbb, 0x72, 0xe2, 0x1b, 0x42, 0x64, 0xa1, 0x99, 0xb4, 0x66, 0x7b, + 0x40, 0xca, 0xee, 0x6a, 0x5a, 0xed, 0xfb, 0x23, 0xcb, 0xd3, 0x57, 0xe9, + 0x92, 0x60, 0x4d, 0x5b, 0xaf, 0xd0, 0xca, 0xa6, 0xc7, 0x33, 0x58, 0x18, + 0x26, 0x9f, 0xa2, 0x62, 0x3b, 0xcb, 0x87, 0x42, 0x3d, 0x63, 0x58, 0xaf, + 0x88, 0x86, 0x3a, 0x11, 0x8d, 0x9f, 0xa4, 0x6f, 0x7f, 0xb2, 0x39, 0x59, + 0xf9, 0x98, 0xcc, 0xcb, 0xa8, 0xb8, 0x38, 0x59, 0xf6, 0x52, 0xd2, 0x56, + 0x80, 0xd7, 0xdb, 0x6d, 0xd6, 0x6e, 0x2e, 0x61, 0x5a, 0x37, 0x94, 0x16, + 0xa6, 0xaf, 0x15, 0xa6, 0xb1, 0x1a, 0x16, 0x03, 0x5d, 0x21, 0x53, 0xab, + 0x01, 0x4e, 0xbc, 0xa1, 0xb1, 0x0c, 0xd1, 0x62, 0x44, 0xf7, 0x17, 0xcc, + 0x20, 0x5c, 0x26, 0x04, 0xd5, 0x41, 0x6a, 0xb8, 0x59, 0xa7, 0xcc, 0x7b, + 0x0b, 0x1a, 0xb0, 0xae, 0xd7, 0xf7, 0x0e, 0x57, 0x28, 0xaf, 0x3a, 0xcc, + 0xc4, 0x0a, 0x0e, 0x43, 0x50, 0x65, 0x01, 0xca, 0x99, 0x81, 0xe3, 0xee, + 0x62, 0xca, 0x5e, 0x75, 0x8e, 0xcc, 0x4b, 0xa8, 0x66, 0xd6, 0x5d, 0xe6, + 0x57, 0x4b, 0x09, 0xb1, 0x6c, 0x06, 0x3b, 0xa6, 0xad, 0x7f, 0xd9, 0xa9, + 0xcd, 0xbd, 0xe5, 0x29, 0x66, 0xb0, 0x71, 0x87, 0x39, 0xb2, 0x30, 0xd6, + 0x96, 0xe3, 0x68, 0xcd, 0x88, 0x64, 0xa5, 0xed, 0x1b, 0x4c, 0x61, 0xeb, + 0x2c, 0x6a, 0x90, 0x75, 0xdd, 0x87, 0x67, 0x54, 0x57, 0x17, 0xca, 0x55, + 0x49, 0xb9, 0x17, 0x0f, 0xac, 0x1a, 0x01, 0x03, 0x40, 0x18, 0x0e, 0x25, + 0x46, 0xc2, 0x28, 0x9b, 0x66, 0x57, 0x4b, 0xd4, 0x7d, 0xc5, 0xed, 0x46, + 0xd1, 0x85, 0xf4, 0x31, 0xc3, 0x29, 0xe7, 0x5c, 0x96, 0x1e, 0x86, 0x47, + 0xd4, 0xcd, 0x2a, 0xef, 0x45, 0x61, 0xbd, 0x7e, 0xa9, 0xd5, 0x95, 0x6f, + 0x3c, 0x92, 0xb9, 0xd4, 0xa8, 0x6c, 0xe3, 0x83, 0xe7, 0x31, 0x7c, 0xc5, + 0xc5, 0x84, 0x43, 0xab, 0x06, 0x6a, 0x4a, 0xe7, 0x52, 0x61, 0xd6, 0x5c, + 0xf4, 0x88, 0xb7, 0x12, 0x8e, 0xd0, 0x33, 0x09, 0x2f, 0x34, 0xcc, 0x70, + 0xc1, 0xa0, 0x6a, 0x3c, 0x51, 0xed, 0x16, 0x25, 0x0e, 0x71, 0x7f, 0xca, + 0x2a, 0x97, 0x08, 0xf2, 0x83, 0xc4, 0x30, 0x8b, 0x38, 0xa8, 0xff, 0x00, + 0xab, 0x87, 0xa9, 0x0b, 0xc2, 0xec, 0xf5, 0xb5, 0x7e, 0x6a, 0x9f, 0xc5, + 0x6f, 0x1e, 0xa9, 0x66, 0x8b, 0x49, 0x14, 0xea, 0x7d, 0x45, 0x42, 0x8b, + 0xaa, 0xf0, 0x04, 0xbd, 0xf0, 0x09, 0x5a, 0x8d, 0xb4, 0x88, 0xad, 0xa9, + 0x76, 0x97, 0x04, 0x5a, 0x37, 0xc3, 0x06, 0x93, 0x92, 0x64, 0x38, 0x60, + 0x06, 0xc0, 0xf6, 0x95, 0xd4, 0x1e, 0xd0, 0x7b, 0x7c, 0x4a, 0x5d, 0x52, + 0x75, 0x67, 0x52, 0x77, 0x12, 0x7f, 0x9e, 0x7d, 0x63, 0x94, 0xd5, 0x1e, + 0x66, 0x42, 0x5c, 0x7f, 0xaa, 0x95, 0x1d, 0xe6, 0x1a, 0x7f, 0x57, 0x59, + 0x5a, 0x76, 0x9e, 0xd9, 0x18, 0xb0, 0xe6, 0xe5, 0xb9, 0xb7, 0x09, 0x4a, + 0xd9, 0xcc, 0xa3, 0xce, 0x4c, 0x92, 0x8d, 0xbc, 0xcc, 0x1a, 0xd4, 0xa1, + 0x27, 0x73, 0xcc, 0x6a, 0xb1, 0x09, 0xd5, 0x03, 0xfc, 0xe6, 0x38, 0xb9, + 0x8b, 0x4e, 0x1e, 0x46, 0x43, 0x83, 0x25, 0xdd, 0xe7, 0x1b, 0x11, 0xba, + 0xa0, 0x32, 0x76, 0x37, 0x95, 0x6e, 0xd0, 0x94, 0x0a, 0x5e, 0xd2, 0xd1, + 0xc9, 0xbb, 0x37, 0x58, 0xa0, 0x2d, 0x86, 0x3c, 0x22, 0xc6, 0xac, 0x5d, + 0xcc, 0x33, 0x82, 0xe1, 0xdb, 0x09, 0xd2, 0x1d, 0xfd, 0x25, 0xcb, 0x96, + 0xfc, 0xca, 0x01, 0xc0, 0xc4, 0xa8, 0x97, 0x14, 0xfa, 0x26, 0x0a, 0xfc, + 0x1f, 0xca, 0x2c, 0xbd, 0x1e, 0x25, 0x64, 0x77, 0xac, 0x5b, 0xe6, 0x83, + 0xf1, 0x6e, 0xd1, 0xa0, 0x00, 0x09, 0x08, 0x39, 0x69, 0xde, 0x35, 0xa2, + 0x8c, 0x71, 0x1d, 0xcd, 0x84, 0x21, 0x9a, 0x6b, 0x79, 0x88, 0x54, 0x62, + 0x90, 0xa4, 0xcc, 0x12, 0x15, 0x67, 0x58, 0x15, 0x88, 0xc5, 0xb0, 0x30, + 0xbe, 0xab, 0xa8, 0x91, 0x7b, 0xed, 0x13, 0x80, 0x2d, 0xcc, 0xc3, 0x79, + 0x87, 0x60, 0x3f, 0x11, 0xb0, 0x14, 0x86, 0xd3, 0x07, 0xc8, 0xfb, 0x8f, + 0xd8, 0xf4, 0x30, 0xc3, 0x17, 0x31, 0xa4, 0x50, 0x1c, 0xc9, 0x53, 0x45, + 0xfa, 0x17, 0x4f, 0xa3, 0x24, 0xcb, 0x75, 0x96, 0x2f, 0x3f, 0x44, 0x5e, + 0x99, 0xf3, 0x00, 0x75, 0x81, 0x88, 0x30, 0xf7, 0x67, 0x52, 0x70, 0x5a, + 0x98, 0x6f, 0x13, 0xbb, 0x01, 0x23, 0x73, 0x64, 0x6a, 0xf4, 0xec, 0x8c, + 0xe6, 0xa3, 0x58, 0xe3, 0x89, 0xf4, 0x26, 0xd8, 0x57, 0xa5, 0x46, 0x6b, + 0x84, 0x7d, 0xbe, 0x46, 0x29, 0x7d, 0x5f, 0xf5, 0xcb, 0xfc, 0xcc, 0x90, + 0xf4, 0x19, 0x11, 0xd7, 0x79, 0xe8, 0xbf, 0x48, 0x25, 0xaa, 0x2c, 0x4d, + 0x2b, 0x2e, 0x9c, 0x5c, 0x5b, 0x04, 0xa7, 0x3c, 0xd0, 0xfb, 0xf2, 0xcc, + 0x3a, 0x02, 0xb5, 0x28, 0x70, 0x06, 0x89, 0x57, 0xea, 0x8d, 0x4d, 0xb8, + 0x21, 0x5b, 0xd4, 0xad, 0xf6, 0x38, 0x80, 0xdc, 0xba, 0xd1, 0x1d, 0xd0, + 0x17, 0x92, 0x0d, 0x6d, 0xa3, 0x70, 0x8b, 0x04, 0x1d, 0x2b, 0xd1, 0x00, + 0x69, 0x3d, 0x4a, 0x87, 0x14, 0xe0, 0x21, 0x59, 0x8c, 0x94, 0x53, 0x35, + 0xa5, 0xdb, 0xfc, 0x11, 0x54, 0xe4, 0x8b, 0x2e, 0x64, 0x98, 0x12, 0xf7, + 0xc8, 0x8c, 0x86, 0x75, 0x94, 0x82, 0x7b, 0x52, 0x61, 0x7b, 0xcd, 0xa4, + 0xaa, 0x97, 0xfd, 0x89, 0x63, 0xce, 0xe4, 0xaa, 0xd6, 0xe9, 0x2f, 0x35, + 0x94, 0xe2, 0xe2, 0x83, 0x54, 0x94, 0x85, 0x72, 0xdb, 0x13, 0x67, 0x19, + 0xe8, 0xcc, 0x77, 0x56, 0x59, 0xd2, 0x3c, 0xc4, 0xc4, 0xe1, 0x72, 0x97, + 0xe4, 0x2b, 0xe9, 0x86, 0x02, 0x10, 0xbc, 0x74, 0x7f, 0x51, 0x64, 0x94, + 0x28, 0x57, 0x0f, 0x7b, 0xf9, 0x8a, 0xb0, 0xf8, 0x44, 0xd8, 0x94, 0xb5, + 0xa9, 0x52, 0xe5, 0x95, 0x65, 0x71, 0x04, 0x70, 0x2e, 0xab, 0x2e, 0x1e, + 0x05, 0x26, 0x1a, 0x27, 0xe2, 0x05, 0x1b, 0xb1, 0xd1, 0x95, 0x5b, 0xc3, + 0x32, 0xa1, 0x18, 0x28, 0xff, 0x00, 0x16, 0x8a, 0xd4, 0x26, 0xa8, 0xfa, + 0x6b, 0x70, 0x8c, 0xac, 0x54, 0xbf, 0x77, 0x96, 0x59, 0xb9, 0xd7, 0xaa, + 0x6a, 0x6a, 0xbd, 0xe2, 0xe1, 0x6e, 0xdb, 0x47, 0x47, 0x0b, 0x96, 0x93, + 0x57, 0x07, 0x98, 0x4b, 0x6b, 0x63, 0xdd, 0x04, 0xc8, 0xd8, 0x53, 0xac, + 0x02, 0xa1, 0xa0, 0xe9, 0x29, 0x94, 0xa3, 0xcc, 0x17, 0xd2, 0x0b, 0xb3, + 0xa1, 0x13, 0x95, 0x5d, 0x78, 0x23, 0x55, 0xa1, 0x58, 0x56, 0x03, 0x69, + 0x48, 0xdd, 0xe5, 0xa4, 0x1b, 0x88, 0xc5, 0x19, 0x98, 0x0e, 0x4f, 0xdc, + 0xab, 0xb1, 0x18, 0x61, 0xf4, 0x79, 0x25, 0xac, 0xaf, 0xab, 0x12, 0xa1, + 0xe8, 0x5d, 0x2f, 0xac, 0xbb, 0xde, 0x0c, 0xa7, 0xbd, 0x3c, 0x21, 0xf9, + 0x8e, 0xbd, 0x2c, 0x3c, 0xc6, 0xda, 0x78, 0x23, 0x10, 0x13, 0x88, 0x23, + 0xac, 0x14, 0xb3, 0xac, 0x69, 0x06, 0xb8, 0xff, 0x00, 0xcb, 0xd7, 0x42, + 0x2c, 0x66, 0x23, 0xd2, 0xfa, 0x4d, 0x5a, 0x42, 0xd3, 0x05, 0x8b, 0xf3, + 0xd1, 0x57, 0x10, 0x1a, 0xca, 0xd9, 0x18, 0x80, 0x1a, 0x72, 0xfc, 0xe0, + 0xe2, 0x60, 0xde, 0x39, 0x4b, 0xaf, 0x49, 0x65, 0x17, 0xbc, 0x83, 0x16, + 0x2b, 0xfe, 0x9a, 0xcc, 0xda, 0x88, 0xc9, 0xdc, 0x7d, 0x20, 0x16, 0xc0, + 0xb1, 0x7d, 0x60, 0x54, 0x2e, 0xcc, 0xb6, 0x00, 0x3f, 0xa0, 0x17, 0xf2, + 0xb6, 0xbd, 0x56, 0x55, 0xd0, 0x6c, 0x95, 0x74, 0xfd, 0x04, 0xa0, 0x90, + 0xcb, 0x56, 0x66, 0xf4, 0x74, 0x4e, 0x1e, 0x23, 0x36, 0x2a, 0x5d, 0x68, + 0x5e, 0xd2, 0xcd, 0xa2, 0x57, 0x18, 0x26, 0x22, 0x9a, 0x3e, 0x20, 0x8b, + 0x4f, 0x13, 0x0a, 0x0c, 0x32, 0xc7, 0xa1, 0x0c, 0xb8, 0x22, 0xd3, 0xb4, + 0x0a, 0xba, 0xa8, 0x75, 0x19, 0xa5, 0xc2, 0x2a, 0x66, 0x04, 0xab, 0xa9, + 0xf8, 0x23, 0x15, 0xd1, 0x84, 0x70, 0x99, 0x4b, 0xd8, 0x94, 0x75, 0x2e, + 0x54, 0x26, 0x13, 0x75, 0x99, 0xd6, 0xdc, 0x9b, 0x8e, 0x6d, 0x98, 0x19, + 0xcc, 0xae, 0x28, 0x35, 0x8d, 0x42, 0x6e, 0x9d, 0x26, 0x0c, 0x94, 0xf5, + 0xad, 0x03, 0xf2, 0x8a, 0xe2, 0xe6, 0x3f, 0xe8, 0xda, 0x15, 0xe1, 0x7e, + 0x63, 0xd9, 0x89, 0x4d, 0x2b, 0x31, 0xbb, 0x6e, 0x1b, 0xba, 0xb6, 0xed, + 0x00, 0xc0, 0x1d, 0xa5, 0x47, 0xac, 0x47, 0x33, 0x16, 0xa4, 0xb2, 0xe9, + 0x95, 0xd1, 0xcc, 0xb9, 0xc7, 0x92, 0x1a, 0xd7, 0xec, 0x98, 0x1b, 0x86, + 0xec, 0xd2, 0x39, 0x0b, 0xbf, 0x69, 0x72, 0xdd, 0x8d, 0x59, 0x8b, 0xfe, + 0x2d, 0x1e, 0x5b, 0xc1, 0x82, 0xf5, 0x81, 0xbb, 0xa9, 0xaa, 0xf4, 0x93, + 0xce, 0x50, 0x3f, 0xe6, 0x51, 0x68, 0x73, 0x51, 0xb8, 0xe2, 0x6b, 0xbc, + 0x33, 0x52, 0xcd, 0x1a, 0x8e, 0xee, 0xd3, 0xf3, 0x31, 0x8a, 0x0b, 0x58, + 0x71, 0x29, 0x65, 0x10, 0xad, 0x21, 0x5e, 0x29, 0x83, 0x10, 0x50, 0x67, + 0xa4, 0x2a, 0x19, 0x5d, 0x63, 0xd8, 0xf9, 0x7a, 0x0e, 0x21, 0x18, 0xd6, + 0x23, 0xd5, 0x40, 0xf9, 0x62, 0xc9, 0x8a, 0x9a, 0xb4, 0xf4, 0xfc, 0xa2, + 0xf6, 0xbf, 0x73, 0xd8, 0xa3, 0x0c, 0x2e, 0x3d, 0x26, 0xb7, 0xe8, 0x54, + 0x75, 0x3f, 0x98, 0x74, 0x73, 0xe8, 0x2b, 0x96, 0x4b, 0x83, 0x2b, 0xee, + 0x45, 0x97, 0xa3, 0xed, 0x8f, 0x49, 0x5e, 0x62, 0xa0, 0xf4, 0x8a, 0x62, + 0x33, 0x30, 0xeb, 0xe8, 0x85, 0x26, 0xad, 0x65, 0x62, 0xcb, 0x67, 0x5f, + 0x1e, 0x8f, 0x56, 0x75, 0xdf, 0x41, 0xf4, 0x89, 0x4f, 0x41, 0xd9, 0x07, + 0xbc, 0xa9, 0x82, 0x38, 0xca, 0x08, 0xdf, 0xfb, 0x1f, 0x13, 0x88, 0x5b, + 0x25, 0xd5, 0x37, 0xe9, 0x70, 0xca, 0x3c, 0xe7, 0xb8, 0xbd, 0x0f, 0x54, + 0xb2, 0x9f, 0xe5, 0xcf, 0xde, 0x04, 0x19, 0x01, 0xa7, 0x71, 0xda, 0x72, + 0xa8, 0xbd, 0x7c, 0x63, 0xf5, 0x1a, 0x6f, 0x16, 0x9a, 0xad, 0x0a, 0xc4, + 0xbd, 0x53, 0x43, 0x64, 0x42, 0x51, 0x5b, 0xd4, 0xd4, 0x18, 0xd5, 0x70, + 0x04, 0xdd, 0xcc, 0x5d, 0x8d, 0x25, 0x99, 0xc1, 0x87, 0x2d, 0x22, 0xd7, + 0x67, 0xd0, 0x44, 0x19, 0x7b, 0x19, 0x92, 0x03, 0x33, 0x5d, 0xe3, 0xa4, + 0x33, 0xde, 0x63, 0xed, 0x2c, 0x80, 0xaa, 0x73, 0x4b, 0xf4, 0x35, 0x95, + 0x19, 0xfc, 0x5e, 0x13, 0x55, 0xdd, 0x6e, 0x5b, 0x37, 0xdf, 0x54, 0x25, + 0x76, 0x72, 0xfd, 0xc5, 0x13, 0xa1, 0x28, 0xef, 0x44, 0x86, 0xba, 0xc5, + 0xbc, 0x82, 0xe3, 0x51, 0x07, 0xad, 0xcd, 0x39, 0x01, 0x02, 0x73, 0x39, + 0xdd, 0x6a, 0x59, 0x8d, 0xa4, 0x3e, 0xa3, 0x17, 0x31, 0x6f, 0xa4, 0x3e, + 0x98, 0xbd, 0x97, 0xd3, 0x2a, 0xc4, 0xb4, 0x55, 0x89, 0x6c, 0x37, 0x2f, + 0xac, 0x43, 0x0c, 0xb5, 0xae, 0x16, 0xa9, 0x8d, 0xce, 0x9b, 0x47, 0xd4, + 0x69, 0x8d, 0x66, 0xee, 0xbc, 0x47, 0x00, 0x6d, 0xac, 0x60, 0xa9, 0x55, + 0xcd, 0x41, 0xa2, 0x34, 0x2f, 0xb4, 0x17, 0xdb, 0x7c, 0x9e, 0x90, 0xd6, + 0xfe, 0x6d, 0x8f, 0x28, 0x4e, 0xd0, 0x67, 0x48, 0x1b, 0xc0, 0xcc, 0x74, + 0xb2, 0xb3, 0x03, 0xd7, 0x0f, 0xcb, 0x2e, 0x80, 0xc3, 0xad, 0x40, 0x34, + 0x71, 0x18, 0x91, 0x81, 0x88, 0x39, 0xf3, 0x90, 0x2f, 0xc8, 0x74, 0x62, + 0x85, 0x38, 0x45, 0x59, 0x31, 0x39, 0x99, 0x03, 0x24, 0xd0, 0x62, 0x55, + 0x37, 0x2b, 0x55, 0x2b, 0x37, 0xcd, 0x8d, 0x7b, 0x33, 0x9d, 0x63, 0xf7, + 0x95, 0x07, 0x42, 0x2f, 0x65, 0xf6, 0xcc, 0x5e, 0xde, 0x96, 0x28, 0xf5, + 0x87, 0x29, 0x50, 0xe4, 0x7e, 0xa3, 0xc6, 0x64, 0xd6, 0x2f, 0x12, 0xfb, + 0xcb, 0x97, 0x99, 0x40, 0x7a, 0xcd, 0x45, 0xb3, 0xed, 0x8a, 0xb7, 0xb8, + 0x8d, 0x9f, 0x42, 0xad, 0xa5, 0x87, 0x58, 0xe4, 0x52, 0x6c, 0x4d, 0x73, + 0x03, 0x0c, 0xbc, 0x53, 0x89, 0x48, 0xbd, 0x26, 0x53, 0xff, 0x00, 0x0b, + 0x36, 0x76, 0xc3, 0xac, 0x1a, 0xe6, 0x5a, 0x32, 0x83, 0x8b, 0xdc, 0xea, + 0x39, 0xf1, 0x30, 0x1c, 0xb5, 0xd9, 0xd2, 0x4e, 0x89, 0x4f, 0x99, 0x6a, + 0xdc, 0x2b, 0x33, 0xde, 0x6c, 0x8f, 0x3e, 0xd2, 0x8e, 0xf3, 0xd7, 0x31, + 0x40, 0x29, 0xb9, 0xd4, 0x53, 0x5c, 0xd7, 0xea, 0x1c, 0x53, 0xa1, 0x37, + 0x2e, 0x7e, 0xc2, 0x3f, 0x71, 0x59, 0x18, 0x0c, 0x8e, 0xe8, 0x81, 0xe8, + 0x06, 0x40, 0x68, 0x2d, 0xc3, 0xa7, 0x49, 0x98, 0x45, 0x52, 0xb6, 0xea, + 0xf0, 0xa7, 0xe2, 0x16, 0xac, 0xe3, 0x4e, 0x22, 0x58, 0x58, 0xdc, 0x8d, + 0x70, 0xe8, 0x4c, 0x8c, 0x41, 0xf4, 0xc4, 0xaa, 0xab, 0x8d, 0x99, 0x55, + 0xb1, 0xad, 0x07, 0xc4, 0xbc, 0xfe, 0xe0, 0xdb, 0x30, 0xa9, 0xde, 0x0b, + 0x47, 0x6f, 0x42, 0xee, 0x0b, 0x16, 0x65, 0x06, 0x2f, 0x32, 0xfa, 0x23, + 0xa7, 0xd2, 0x64, 0x8c, 0xbd, 0x22, 0x61, 0x3c, 0xfc, 0xb3, 0x06, 0x62, + 0x77, 0xc4, 0x6c, 0x39, 0x75, 0x19, 0x57, 0x13, 0x17, 0x45, 0xe8, 0xc2, + 0xe1, 0x2b, 0x35, 0xb6, 0x30, 0x9d, 0x58, 0x3b, 0x4c, 0xa9, 0x25, 0x5e, + 0x13, 0x5f, 0x15, 0x28, 0x6f, 0x68, 0xe5, 0x8d, 0x22, 0x69, 0x5a, 0xd3, + 0xf0, 0xfc, 0xc0, 0x1a, 0x5e, 0x0e, 0x4b, 0x1d, 0x0f, 0x10, 0x2a, 0xb4, + 0xc5, 0x98, 0x8c, 0x2c, 0x3e, 0xce, 0x8d, 0xf1, 0x23, 0xb4, 0x65, 0xdd, + 0x88, 0x56, 0xce, 0x19, 0x7a, 0xd2, 0xe5, 0xf7, 0x99, 0x6a, 0x5f, 0x5d, + 0x58, 0xd0, 0xc8, 0x60, 0x5b, 0x4f, 0xd2, 0x0d, 0x18, 0xb3, 0x59, 0x8f, + 0x2d, 0x6d, 0x51, 0xe8, 0x2d, 0x97, 0xd0, 0x41, 0x57, 0xad, 0x8f, 0xbb, + 0xd1, 0x17, 0x59, 0x54, 0x08, 0xe2, 0x2c, 0xc1, 0x4d, 0x75, 0x9b, 0xe2, + 0x60, 0x3f, 0x98, 0x25, 0x6c, 0x94, 0x21, 0xc3, 0xaf, 0xb4, 0x42, 0x1a, + 0xa3, 0x69, 0x23, 0x6b, 0x15, 0x4a, 0xaf, 0xc7, 0xf6, 0x20, 0x82, 0xa8, + 0xcb, 0x32, 0xe1, 0x92, 0xe3, 0x5d, 0xe5, 0xd5, 0x82, 0xaa, 0xd7, 0x1c, + 0x3a, 0x99, 0x79, 0x8c, 0x76, 0xa3, 0x9a, 0xc0, 0x1f, 0x6c, 0x6b, 0xd3, + 0x27, 0xce, 0x19, 0xd8, 0x23, 0xbe, 0xdb, 0xf3, 0x30, 0x3b, 0x7a, 0x1f, + 0x40, 0xa2, 0x8b, 0x73, 0xb9, 0x87, 0xed, 0xf8, 0x9e, 0xd5, 0x33, 0xb3, + 0xc9, 0x2d, 0x34, 0x4b, 0x94, 0x08, 0x36, 0xef, 0x87, 0xcb, 0xe8, 0x55, + 0x34, 0x33, 0x2c, 0x8e, 0xe2, 0xa9, 0x44, 0x2a, 0xf3, 0x00, 0x5c, 0x4a, + 0xad, 0x62, 0x87, 0x58, 0xcd, 0x0e, 0xb0, 0xa5, 0xb1, 0xd7, 0xd2, 0xf8, + 0x8e, 0xa2, 0xd6, 0x1e, 0x61, 0xb8, 0xb2, 0xd8, 0xd2, 0xbc, 0x24, 0x06, + 0x84, 0x57, 0x29, 0x15, 0xc4, 0xc9, 0x0a, 0xcc, 0x9e, 0xd2, 0xaf, 0x43, + 0xca, 0x31, 0x36, 0x9a, 0xb1, 0x02, 0x49, 0xf9, 0xe7, 0xed, 0x1a, 0x49, + 0xf2, 0x0a, 0x3c, 0x90, 0xfb, 0xf7, 0xcc, 0x0f, 0xbb, 0x58, 0x22, 0xcb, + 0xa0, 0x46, 0xae, 0x13, 0x56, 0xaa, 0xc6, 0x9e, 0xf8, 0x88, 0x34, 0xca, + 0x75, 0x25, 0x7b, 0x27, 0xb4, 0x62, 0xb3, 0x74, 0x2a, 0x98, 0xee, 0xce, + 0xa7, 0xa3, 0xc4, 0xa0, 0x2a, 0xd6, 0x46, 0x58, 0x4b, 0x68, 0xd3, 0xe6, + 0x23, 0xa3, 0x10, 0xe1, 0xa4, 0xcd, 0x71, 0x59, 0x77, 0x07, 0x39, 0xd6, + 0x10, 0xbc, 0xeb, 0x16, 0x1e, 0x9f, 0x8c, 0xc4, 0x45, 0xf4, 0x18, 0xa2, + 0xc6, 0x6a, 0xf9, 0x5f, 0x44, 0x5e, 0xeb, 0x31, 0x73, 0xa9, 0xe6, 0x02, + 0x60, 0x57, 0x12, 0x9e, 0xe4, 0xca, 0xf7, 0x86, 0x4c, 0xf0, 0x7c, 0xce, + 0xd8, 0x6a, 0x2d, 0x0e, 0xb0, 0xc2, 0x25, 0x40, 0xd5, 0x8b, 0xaf, 0xfc, + 0x88, 0xaa, 0x17, 0x3b, 0x72, 0x0e, 0x62, 0x69, 0x25, 0xdd, 0x56, 0xb1, + 0x36, 0xb4, 0x59, 0x7d, 0x28, 0xad, 0xf5, 0xbf, 0x11, 0x5b, 0xfa, 0xd6, + 0xb2, 0x38, 0x4a, 0xd9, 0x3f, 0x70, 0x3e, 0x04, 0xf9, 0xc2, 0x95, 0xaf, + 0x4d, 0x0e, 0xe2, 0x0d, 0xa8, 0x54, 0xc1, 0x69, 0xbe, 0x75, 0xf2, 0x22, + 0x06, 0xb3, 0x00, 0x17, 0xd0, 0xca, 0xeb, 0xf4, 0x82, 0x9e, 0xe3, 0x5e, + 0xf1, 0x9e, 0xc4, 0x6a, 0x93, 0x3c, 0xad, 0x79, 0x94, 0x5b, 0x95, 0xc5, + 0x10, 0xdd, 0x69, 0xe3, 0x2c, 0x49, 0xd0, 0x14, 0x09, 0x71, 0xd4, 0xb6, + 0xa1, 0x8b, 0x97, 0x19, 0x2f, 0x7b, 0x87, 0x33, 0x83, 0xf0, 0x47, 0x96, + 0x21, 0x25, 0xda, 0x69, 0x3a, 0x26, 0x91, 0x4d, 0x91, 0x8d, 0xba, 0x15, + 0x78, 0x26, 0x11, 0x8d, 0x0c, 0x42, 0xff, 0x00, 0x2c, 0x4d, 0x01, 0x1e, + 0x65, 0x1d, 0xe1, 0x16, 0x40, 0x21, 0x56, 0xf4, 0x78, 0xbf, 0xf2, 0x2c, + 0x1c, 0x53, 0x55, 0x28, 0xa0, 0xe6, 0xa0, 0x27, 0xc3, 0x19, 0xfc, 0x44, + 0xb1, 0x52, 0xeb, 0x43, 0x96, 0x5a, 0x62, 0x8b, 0x4e, 0x0a, 0x11, 0x00, + 0x88, 0x81, 0xe4, 0xee, 0x65, 0x68, 0xd4, 0x51, 0xda, 0x55, 0xbf, 0x9f, + 0xdc, 0x1b, 0x09, 0x7d, 0x63, 0x84, 0x51, 0x6d, 0xa9, 0x8a, 0xc5, 0x4b, + 0x9d, 0xf2, 0x18, 0x76, 0x0a, 0x8a, 0xcc, 0xcc, 0x49, 0xc1, 0x16, 0x45, + 0x4d, 0x71, 0x16, 0x0c, 0xb5, 0x7f, 0x32, 0xc5, 0x8f, 0x41, 0xf5, 0x94, + 0x4a, 0x1f, 0x48, 0xa4, 0xb6, 0xae, 0x00, 0x99, 0x95, 0xaf, 0xa5, 0x5c, + 0x4f, 0x68, 0x87, 0x68, 0x89, 0x5f, 0x48, 0xc4, 0x10, 0xc3, 0xac, 0x30, + 0xeb, 0xe8, 0x66, 0x9d, 0x86, 0x9f, 0x53, 0x68, 0x83, 0x2d, 0x8b, 0x74, + 0x88, 0x81, 0x5c, 0x46, 0x83, 0x70, 0x04, 0x7e, 0x20, 0x96, 0xfc, 0x5f, + 0xb8, 0xa2, 0xc6, 0xed, 0x0c, 0x9e, 0x8c, 0xad, 0x0b, 0xab, 0x8c, 0x19, + 0xde, 0x10, 0x16, 0x0c, 0x01, 0x41, 0x5a, 0x9d, 0x10, 0x18, 0xd6, 0xc1, + 0xb3, 0xba, 0x35, 0xec, 0xc5, 0x93, 0x2f, 0x45, 0x53, 0xa9, 0x33, 0xf0, + 0x4d, 0x26, 0x07, 0xd2, 0x2e, 0x68, 0xf2, 0xc3, 0x90, 0xa8, 0xb7, 0x26, + 0x4b, 0x8c, 0xb4, 0x74, 0x5c, 0x69, 0x37, 0xe1, 0x8c, 0xce, 0xd0, 0xa4, + 0xda, 0xac, 0x1d, 0xee, 0x91, 0x81, 0x5a, 0xeb, 0x5b, 0xb2, 0x62, 0x0d, + 0x6c, 0xb9, 0xf1, 0x1d, 0x2c, 0x03, 0x43, 0x77, 0xae, 0x60, 0x87, 0x58, + 0x26, 0xb9, 0x8c, 0xbd, 0x5e, 0x23, 0x85, 0x36, 0xb8, 0x71, 0x0e, 0x26, + 0x6f, 0x9a, 0xfd, 0x45, 0x52, 0x8f, 0xa5, 0xc5, 0x98, 0xec, 0x4d, 0x47, + 0xa9, 0xf1, 0x06, 0xa8, 0xef, 0x2a, 0x3d, 0x93, 0x05, 0xd2, 0x69, 0x08, + 0x94, 0xa8, 0xdd, 0x6a, 0x0b, 0x7e, 0x95, 0xf7, 0x2f, 0x85, 0x9d, 0x65, + 0x5a, 0x47, 0x4c, 0x24, 0xb8, 0x10, 0x63, 0xc2, 0x80, 0xdc, 0xff, 0x00, + 0x97, 0xdc, 0x75, 0x5e, 0xad, 0x99, 0x2b, 0x00, 0x2a, 0xac, 0xbc, 0x0b, + 0x24, 0x6b, 0x45, 0xc7, 0xf7, 0x31, 0x4d, 0xb9, 0xc6, 0xbf, 0x53, 0x7d, + 0x5d, 0xd4, 0x95, 0xb9, 0x05, 0x64, 0x29, 0x98, 0xea, 0xb0, 0x9c, 0x41, + 0xb6, 0x29, 0xb8, 0x16, 0x12, 0xcf, 0x6e, 0x20, 0x16, 0xa2, 0xc6, 0xb1, + 0x08, 0x03, 0x92, 0xaa, 0x9d, 0xbb, 0xc5, 0x90, 0x41, 0x83, 0xa6, 0xe3, + 0xde, 0x18, 0x7c, 0xc0, 0xdd, 0x56, 0x8c, 0x55, 0xd3, 0xa4, 0x72, 0x51, + 0x99, 0x78, 0xea, 0xa0, 0x3c, 0x5b, 0x89, 0x9e, 0xaa, 0x6b, 0x35, 0x1b, + 0x6e, 0x1f, 0xfb, 0x02, 0x97, 0x3a, 0xeb, 0xcc, 0x58, 0x6a, 0xa3, 0xaf, + 0x09, 0xab, 0xa8, 0x67, 0x2e, 0xe5, 0x4c, 0x45, 0x23, 0x61, 0x1b, 0x33, + 0x22, 0x74, 0x80, 0x90, 0x72, 0xd1, 0x59, 0x95, 0xd3, 0x99, 0xcd, 0x0e, + 0x08, 0xba, 0xf6, 0x6d, 0xfc, 0x4b, 0xa5, 0x48, 0x35, 0xd7, 0xa1, 0x12, + 0xa2, 0x85, 0x15, 0xc4, 0x11, 0xa5, 0x57, 0x10, 0x15, 0xd3, 0x78, 0x50, + 0x20, 0xcf, 0x59, 0x8c, 0x4e, 0xc1, 0xf2, 0xad, 0x0f, 0x2d, 0x46, 0xef, + 0x1b, 0x65, 0x8d, 0x82, 0x19, 0x0b, 0x03, 0x5b, 0x38, 0x89, 0xea, 0xe1, + 0x18, 0x05, 0x09, 0x8d, 0x2f, 0x11, 0x71, 0x31, 0x6d, 0xae, 0xbd, 0x06, + 0x7b, 0xc5, 0x87, 0xa9, 0x69, 0xe7, 0x88, 0x69, 0x16, 0x2f, 0xa5, 0x54, + 0x0b, 0x18, 0x28, 0x1d, 0xd1, 0x22, 0x0d, 0xd3, 0x90, 0xce, 0xf1, 0x31, + 0x7b, 0xda, 0x6e, 0x40, 0x93, 0x4f, 0x30, 0x09, 0x63, 0x02, 0xe7, 0x68, + 0xd9, 0x31, 0x25, 0xfd, 0x56, 0x52, 0x97, 0x14, 0x43, 0x0a, 0x96, 0x76, + 0xf4, 0x37, 0x8c, 0xd9, 0xe8, 0x2b, 0x8d, 0xa9, 0xbe, 0x7c, 0xe1, 0xe9, + 0x2e, 0x87, 0xd1, 0xd7, 0xf4, 0x0d, 0x76, 0xcf, 0xa9, 0x8c, 0xd7, 0x13, + 0xc4, 0x41, 0xa4, 0xb0, 0x88, 0xcd, 0x93, 0xa6, 0x35, 0xf2, 0xcf, 0x6d, + 0x7b, 0xb4, 0xf0, 0x7e, 0xe2, 0x2b, 0x80, 0xb5, 0xc6, 0xbe, 0x3e, 0xe5, + 0xa2, 0x74, 0x72, 0x53, 0xba, 0x46, 0xf5, 0x6d, 0x5f, 0xe5, 0x89, 0x6b, + 0x33, 0x70, 0x0e, 0xa3, 0x63, 0x23, 0x86, 0x05, 0x82, 0xed, 0xff, 0x00, + 0x10, 0x36, 0x04, 0xec, 0xbf, 0x51, 0x2b, 0xa9, 0x21, 0xb7, 0x64, 0x87, + 0x94, 0xd4, 0x83, 0x91, 0xa1, 0x4f, 0x7b, 0x94, 0xd0, 0xf0, 0x1d, 0x59, + 0xdb, 0x98, 0xc4, 0xad, 0xa0, 0x49, 0x46, 0x1b, 0x81, 0x47, 0x4a, 0x8d, + 0x2a, 0xe0, 0x74, 0xdc, 0x82, 0x1c, 0x55, 0xd2, 0x56, 0x89, 0xc0, 0x16, + 0xdd, 0x19, 0x7b, 0xd7, 0x10, 0x5a, 0x57, 0xbc, 0xaa, 0xec, 0x7c, 0x31, + 0x83, 0x54, 0xed, 0x11, 0xef, 0x20, 0x5e, 0x05, 0x97, 0x88, 0xb8, 0xaf, + 0x85, 0x45, 0x28, 0x45, 0xa8, 0x46, 0x04, 0x55, 0xdd, 0xf8, 0x21, 0x69, + 0xd4, 0xc4, 0x7a, 0x8c, 0x4b, 0x0b, 0xd6, 0x0c, 0x18, 0xcc, 0x38, 0x97, + 0x02, 0x05, 0xca, 0x14, 0xd7, 0x31, 0x0a, 0xb8, 0x08, 0xee, 0x86, 0x2f, + 0x61, 0x5a, 0xc5, 0x2b, 0xa3, 0x54, 0x5d, 0x72, 0x8e, 0x97, 0xfa, 0x9c, + 0x18, 0x11, 0x37, 0xd5, 0x21, 0x6c, 0x0a, 0x55, 0xfb, 0xba, 0x30, 0x74, + 0xbd, 0xf7, 0xf7, 0x16, 0x98, 0x70, 0xac, 0xd3, 0x97, 0x35, 0xbc, 0xa9, + 0x0a, 0x36, 0x04, 0x09, 0x93, 0xd0, 0xcb, 0xc3, 0x51, 0xc0, 0x9a, 0x8b, + 0x0d, 0x01, 0xd4, 0xe8, 0xc4, 0x28, 0x5e, 0x75, 0xf9, 0x11, 0xec, 0xaa, + 0x74, 0x60, 0x10, 0xaa, 0xd8, 0x3f, 0x12, 0xe5, 0x03, 0xe6, 0x30, 0x96, + 0x08, 0x29, 0xbe, 0x5b, 0x95, 0x7a, 0x99, 0xa3, 0x79, 0x94, 0xad, 0x36, + 0x96, 0x2e, 0x73, 0xf1, 0x0f, 0xdc, 0xc1, 0xec, 0xac, 0x76, 0xa9, 0x76, + 0xf4, 0x4a, 0x5a, 0xb3, 0xad, 0x2c, 0x9a, 0xcb, 0x97, 0x52, 0xea, 0x5d, + 0xbd, 0x6c, 0x4d, 0x14, 0x63, 0x9b, 0x62, 0x08, 0xbd, 0xae, 0xc2, 0x18, + 0xdd, 0x16, 0xbd, 0xdd, 0x88, 0x0f, 0xe9, 0x3b, 0xa7, 0x2c, 0x43, 0xcb, + 0x7a, 0xa6, 0xee, 0x61, 0x6d, 0x6f, 0x2d, 0xed, 0x11, 0x16, 0xeb, 0xd6, + 0x64, 0xd4, 0x0d, 0xd8, 0xd8, 0x6e, 0xad, 0xd0, 0x3c, 0x90, 0xae, 0xa5, + 0xa5, 0x36, 0x1a, 0xe7, 0x5f, 0x12, 0xa5, 0x12, 0xc9, 0x81, 0x6d, 0x58, + 0x63, 0x48, 0x2a, 0x4a, 0x94, 0xa8, 0xb5, 0x9b, 0xf5, 0x79, 0x83, 0x02, + 0xe0, 0x6c, 0x5f, 0x19, 0x8a, 0xec, 0xa1, 0x4b, 0x6e, 0xf7, 0x98, 0xad, + 0xcb, 0xf7, 0x45, 0x12, 0xe3, 0x2c, 0x06, 0xb8, 0x16, 0x79, 0x64, 0xf7, + 0x4c, 0xd7, 0xa6, 0x27, 0x23, 0x34, 0x8b, 0x47, 0xbc, 0xf2, 0xea, 0x92, + 0x1e, 0x4b, 0x8f, 0xc5, 0xc0, 0x45, 0x53, 0xb9, 0x1c, 0xbe, 0xac, 0x17, + 0xef, 0x06, 0x8d, 0x10, 0xd9, 0xdf, 0xda, 0x10, 0xa6, 0x6f, 0x2b, 0x47, + 0x95, 0x85, 0x3a, 0xa6, 0x26, 0x8c, 0x37, 0x11, 0xba, 0x33, 0x0b, 0xb8, + 0x8c, 0x09, 0x89, 0x77, 0x75, 0x13, 0xef, 0x91, 0x42, 0xb8, 0xbd, 0x2b, + 0xa2, 0x84, 0x11, 0x5f, 0x5f, 0x21, 0xa8, 0xed, 0x48, 0x23, 0x08, 0x8f, + 0x11, 0x62, 0x81, 0x88, 0xc5, 0x7a, 0x40, 0x9d, 0x3f, 0x5f, 0x03, 0x68, + 0x66, 0x4e, 0x90, 0xd7, 0x60, 0xfa, 0x8b, 0x2d, 0x96, 0x91, 0x45, 0x94, + 0xa0, 0x51, 0x80, 0x86, 0xd9, 0x53, 0x88, 0x06, 0x99, 0x2a, 0xb7, 0x89, + 0x83, 0x01, 0x48, 0xd7, 0x5a, 0x77, 0xd3, 0xb5, 0xf3, 0x29, 0x50, 0x0e, + 0xd1, 0xae, 0xb3, 0xa0, 0x66, 0x4c, 0x9b, 0x44, 0x4d, 0xd3, 0xf9, 0x96, + 0x6d, 0x2d, 0x82, 0xe8, 0xc6, 0x62, 0x36, 0xee, 0xe3, 0xee, 0x47, 0x86, + 0x8d, 0x8d, 0x3b, 0x0a, 0x73, 0xd6, 0x04, 0x14, 0x5c, 0x56, 0xc0, 0xea, + 0xbc, 0xe1, 0xe2, 0x18, 0x84, 0xd6, 0x69, 0xb8, 0xed, 0x18, 0x5d, 0x6b, + 0x98, 0xd9, 0xa2, 0xd3, 0x52, 0xa5, 0x26, 0xcd, 0x93, 0x57, 0xf7, 0x20, + 0x83, 0x8f, 0x91, 0x37, 0x80, 0x9c, 0xfb, 0x4c, 0x03, 0x35, 0x2d, 0x0b, + 0x8b, 0xbd, 0x6d, 0xcb, 0xae, 0xfe, 0x51, 0xff, 0x00, 0x91, 0x73, 0x01, + 0x80, 0xd2, 0x5e, 0x5d, 0x86, 0xc3, 0x48, 0x30, 0x5d, 0xef, 0x82, 0x3b, + 0xad, 0x12, 0x29, 0xbb, 0x9c, 0xc6, 0x4d, 0x47, 0x4c, 0x25, 0xf4, 0x57, + 0x59, 0xa3, 0x88, 0x8e, 0xd0, 0x40, 0xa2, 0xfa, 0x4c, 0x5f, 0x50, 0xd0, + 0x25, 0x1e, 0xa6, 0x42, 0xb7, 0xb9, 0xa1, 0x08, 0x85, 0x19, 0x0f, 0xe1, + 0x7a, 0xc2, 0x6d, 0x44, 0xb4, 0xdc, 0x03, 0xde, 0x2f, 0x53, 0xe2, 0x74, + 0xb0, 0xb3, 0x67, 0x98, 0x17, 0x57, 0xbc, 0x1b, 0xfb, 0x41, 0x01, 0x09, + 0xc3, 0x98, 0xa8, 0x4b, 0x0d, 0x8b, 0x45, 0xd5, 0xb4, 0xce, 0x8b, 0x40, + 0x57, 0xbb, 0xa4, 0x32, 0xec, 0x1d, 0x11, 0xb1, 0xf3, 0x08, 0xb9, 0x6a, + 0x8c, 0x1c, 0xc2, 0x28, 0xa4, 0x0e, 0xf9, 0x61, 0x72, 0x2f, 0x6c, 0x7a, + 0x5a, 0xb3, 0x57, 0x59, 0x02, 0xff, 0x00, 0x78, 0x87, 0x35, 0x55, 0xa7, + 0xdc, 0x5b, 0x7a, 0x2f, 0x79, 0x72, 0xfd, 0x16, 0x23, 0x3e, 0xb6, 0x1f, + 0x89, 0x40, 0x42, 0xa7, 0x18, 0xe7, 0x78, 0x48, 0x29, 0xb1, 0x8d, 0x61, + 0xcb, 0x65, 0xd7, 0xe2, 0x28, 0x88, 0x02, 0x9d, 0x3a, 0x10, 0x16, 0x5f, + 0x15, 0xb1, 0x12, 0xbb, 0x72, 0xb8, 0x96, 0x2d, 0x7a, 0xb0, 0x44, 0x46, + 0x41, 0xd6, 0x01, 0x38, 0xc6, 0x58, 0x8b, 0x36, 0x10, 0x8e, 0x88, 0xb1, + 0x3a, 0x4b, 0xa0, 0xed, 0x29, 0x30, 0xd0, 0x06, 0x03, 0xde, 0xf4, 0x8a, + 0xad, 0x43, 0xa8, 0x3f, 0x0c, 0x42, 0xc4, 0x80, 0x55, 0x4f, 0x2c, 0x25, + 0x28, 0xf4, 0x3f, 0x51, 0x4b, 0x96, 0xe0, 0x8b, 0xc2, 0x6f, 0x7d, 0x33, + 0x17, 0x5c, 0xca, 0x5a, 0xd3, 0x91, 0x3d, 0x98, 0x97, 0xd8, 0xd2, 0xca, + 0x1b, 0xe8, 0x5b, 0xd5, 0x89, 0x5b, 0x19, 0xe8, 0x0f, 0x05, 0x11, 0xe5, + 0xb4, 0xcd, 0x3a, 0x17, 0x7e, 0x6e, 0x30, 0x94, 0xe3, 0xf0, 0x8b, 0xd9, + 0x8d, 0xa0, 0x46, 0x45, 0x30, 0x64, 0x11, 0x19, 0x4b, 0xbb, 0x8c, 0x3e, + 0x8b, 0x32, 0xd2, 0xd5, 0x12, 0x42, 0x6a, 0x6f, 0x11, 0xc9, 0x1d, 0xb0, + 0xf3, 0x1d, 0x70, 0x77, 0x66, 0x37, 0x62, 0x54, 0xac, 0x43, 0x70, 0x37, + 0xc4, 0x27, 0xce, 0x14, 0xfb, 0x4d, 0x31, 0xac, 0xb7, 0xd4, 0x8c, 0x3d, + 0x3d, 0x21, 0x32, 0x7a, 0x58, 0xf8, 0xbe, 0xa2, 0xcc, 0xb8, 0xc5, 0x88, + 0xf0, 0xc5, 0x80, 0x2d, 0xe8, 0xca, 0xa1, 0xc5, 0x0c, 0xfc, 0x25, 0x56, + 0x34, 0x10, 0x30, 0x74, 0x20, 0x32, 0x01, 0xd8, 0x8b, 0xd5, 0xa9, 0x07, + 0x11, 0x0e, 0x69, 0x8e, 0xd5, 0x3d, 0xa6, 0x51, 0x4b, 0xc2, 0xa1, 0x04, + 0x1d, 0x92, 0xc7, 0xa9, 0xd2, 0xe9, 0x77, 0x16, 0x89, 0xb4, 0x74, 0x14, + 0x7e, 0x57, 0x1b, 0x81, 0x66, 0xb4, 0x1e, 0xd1, 0xea, 0xf9, 0x74, 0xd1, + 0x65, 0x8d, 0xee, 0x9b, 0x42, 0xc9, 0x5b, 0x98, 0x6a, 0x72, 0x9b, 0xd8, + 0x39, 0xe8, 0xf5, 0x9a, 0xaa, 0x86, 0xab, 0x59, 0x6a, 0x77, 0x89, 0x52, + 0xf4, 0x4d, 0x55, 0xe7, 0x59, 0xd1, 0x35, 0xf6, 0xfe, 0x7d, 0x03, 0xe8, + 0xc4, 0x58, 0xac, 0xcb, 0xa6, 0xdf, 0xaa, 0x54, 0x71, 0x86, 0x21, 0x7c, + 0x3a, 0x63, 0x31, 0x58, 0x04, 0x06, 0x87, 0x28, 0x2e, 0x74, 0x2c, 0x5c, + 0x10, 0xd5, 0xc1, 0x05, 0x7d, 0xb1, 0x3e, 0x7f, 0x51, 0xe6, 0xf3, 0x6e, + 0x13, 0xf2, 0xf9, 0x82, 0xd0, 0x03, 0x80, 0x8f, 0x54, 0xb6, 0x32, 0xb7, + 0xbc, 0xf3, 0x2b, 0xac, 0xc7, 0x30, 0xae, 0x60, 0x10, 0x24, 0x72, 0x9a, + 0xe0, 0x32, 0xd2, 0xbc, 0x86, 0xfa, 0x45, 0x19, 0xcd, 0x94, 0x0f, 0xc4, + 0x6b, 0xba, 0x70, 0x3e, 0xef, 0xdc, 0xa3, 0x0d, 0xca, 0x0a, 0xd7, 0x50, + 0xcc, 0x08, 0x98, 0x53, 0x46, 0x02, 0x2b, 0x75, 0x35, 0xb5, 0xbd, 0x8c, + 0xe2, 0x4b, 0x67, 0xbb, 0x1c, 0xb0, 0x65, 0xcb, 0x98, 0x43, 0xd0, 0x52, + 0xdd, 0x52, 0xaf, 0x04, 0x45, 0xd0, 0x19, 0x07, 0x56, 0x77, 0x76, 0x1c, + 0x5c, 0x1d, 0x4c, 0x28, 0xa5, 0x08, 0xab, 0x67, 0xca, 0xae, 0x91, 0xd2, + 0xa4, 0x85, 0x34, 0x3c, 0xb2, 0xa9, 0x41, 0xd1, 0x6e, 0x5e, 0x3e, 0x46, + 0x63, 0x6f, 0x93, 0xac, 0x46, 0xe0, 0xeb, 0x14, 0x51, 0xca, 0x43, 0x6c, + 0xa2, 0x11, 0xc6, 0xd1, 0x51, 0xa5, 0xb5, 0x5b, 0x59, 0x8b, 0x44, 0x9c, + 0x84, 0x6b, 0x2d, 0x41, 0xf8, 0x21, 0x8b, 0x06, 0xa3, 0x30, 0xc6, 0xdc, + 0x26, 0xce, 0xd9, 0xeb, 0x07, 0x87, 0x24, 0x11, 0x64, 0x2e, 0xb7, 0x82, + 0xb8, 0x6a, 0x53, 0x83, 0x10, 0x03, 0xd9, 0x93, 0xea, 0x04, 0x04, 0xee, + 0xc1, 0xd1, 0xa0, 0xed, 0x12, 0x82, 0x2b, 0x50, 0xd2, 0x0f, 0xb5, 0x12, + 0xf5, 0x80, 0xc7, 0xd0, 0x01, 0xac, 0xa5, 0x02, 0x0b, 0xee, 0x3e, 0xbc, + 0x93, 0x2e, 0xbe, 0xa3, 0x90, 0xd1, 0xeb, 0xcb, 0xb1, 0x39, 0xa9, 0x42, + 0x9f, 0x12, 0x83, 0x88, 0xb5, 0x70, 0xc9, 0xae, 0x8a, 0xfa, 0xca, 0x9d, + 0x26, 0x14, 0x1d, 0x03, 0xcf, 0xe2, 0x33, 0x1e, 0x3b, 0x69, 0xaa, 0xd2, + 0x1f, 0xd5, 0x1a, 0x5b, 0x75, 0xe9, 0x30, 0x2e, 0x5d, 0x04, 0x16, 0x1b, + 0xa8, 0xbf, 0x86, 0x7c, 0xe5, 0x17, 0xcc, 0x40, 0xb2, 0x99, 0xa6, 0x1b, + 0xed, 0x32, 0xcb, 0xfd, 0x2c, 0x51, 0x0d, 0xa0, 0xf8, 0x3e, 0xbd, 0x0c, + 0x5f, 0x46, 0x23, 0x29, 0xd1, 0x27, 0x13, 0xba, 0x5d, 0x53, 0xf4, 0x07, + 0xce, 0x21, 0xd2, 0x8e, 0x9a, 0xa7, 0xb9, 0x88, 0x20, 0x23, 0xe0, 0xb1, + 0x10, 0x9d, 0xe2, 0x4a, 0x28, 0xb9, 0x47, 0x7e, 0x36, 0x7d, 0x41, 0xc9, + 0x39, 0x5f, 0xb4, 0xad, 0x65, 0x0d, 0xc8, 0x90, 0xa6, 0x90, 0x64, 0x4c, + 0x24, 0x10, 0x24, 0xb5, 0xbd, 0xe6, 0x7c, 0xc6, 0xe7, 0x11, 0x5c, 0xbf, + 0x54, 0x05, 0xf6, 0x6f, 0xe2, 0x1d, 0xa2, 0x30, 0xfa, 0x87, 0x54, 0x97, + 0x01, 0xaf, 0x24, 0x60, 0x2d, 0x5a, 0x3f, 0x00, 0xd4, 0xc7, 0x5d, 0xdd, + 0xb7, 0xdc, 0x9a, 0x6f, 0xd6, 0xf0, 0x0c, 0x23, 0xd4, 0x48, 0x52, 0x0e, + 0x84, 0xe8, 0x26, 0xa8, 0xb2, 0xe2, 0xa5, 0xdc, 0x78, 0x47, 0x88, 0xc9, + 0xa7, 0xbc, 0x21, 0xae, 0x3a, 0xcb, 0x90, 0x31, 0xd6, 0x71, 0x68, 0x01, + 0x97, 0xa4, 0x22, 0xcf, 0xd8, 0x1f, 0x2c, 0x7a, 0x8e, 0xe6, 0xc7, 0xd8, + 0xfd, 0xc3, 0xa8, 0xb5, 0xe0, 0xdb, 0xd4, 0x32, 0xca, 0xb2, 0x47, 0x0d, + 0x1d, 0x41, 0xd3, 0xda, 0x57, 0x5d, 0x78, 0xbc, 0xc2, 0x4e, 0xa8, 0xbd, + 0xaa, 0x60, 0xae, 0x35, 0xb0, 0x50, 0x17, 0xcc, 0x59, 0x61, 0x8a, 0x50, + 0x34, 0xb0, 0xe3, 0x11, 0x3e, 0x98, 0x12, 0x91, 0xaf, 0x05, 0xeb, 0x58, + 0x85, 0x8b, 0xb8, 0x73, 0xa0, 0xd6, 0x85, 0x58, 0x96, 0xee, 0xf4, 0x3f, + 0x32, 0xdd, 0x4f, 0xa1, 0x70, 0x8a, 0xfa, 0x58, 0x4f, 0x33, 0xaf, 0x13, + 0x31, 0x26, 0x68, 0x01, 0xc2, 0x4c, 0x36, 0x97, 0x6b, 0xa7, 0xb3, 0xf8, + 0x80, 0x20, 0x7b, 0xe0, 0x5f, 0x0f, 0xee, 0x02, 0xab, 0x76, 0xe8, 0xd3, + 0xdf, 0x4f, 0x99, 0x42, 0xd0, 0x38, 0xbd, 0xc8, 0x8b, 0xa1, 0x89, 0x4f, + 0x10, 0x33, 0x2a, 0xe3, 0x69, 0x55, 0x1c, 0x10, 0x64, 0xb3, 0x5f, 0x4c, + 0x13, 0x20, 0xf6, 0x34, 0x9d, 0xdd, 0xe2, 0xd2, 0x96, 0x34, 0x25, 0x0f, + 0x13, 0xa1, 0x0e, 0x08, 0x52, 0xe0, 0x40, 0x80, 0x2b, 0xb2, 0xe2, 0xdd, + 0x60, 0x41, 0x83, 0xa4, 0xd5, 0x09, 0x50, 0x96, 0xd0, 0x83, 0x39, 0xf5, + 0x54, 0x5e, 0xc4, 0x45, 0x14, 0x72, 0x80, 0xb3, 0xa2, 0x8b, 0xf7, 0x8e, + 0x55, 0xe4, 0x01, 0x45, 0x7d, 0xb4, 0x80, 0x4b, 0x4b, 0x34, 0x60, 0x7c, + 0x40, 0x94, 0x20, 0x0d, 0x1a, 0x71, 0x89, 0x71, 0x73, 0x08, 0xd0, 0x07, + 0x35, 0xd2, 0x37, 0xb4, 0x96, 0x80, 0x16, 0x90, 0xdd, 0x1d, 0x25, 0x59, + 0x29, 0xd1, 0xcc, 0x14, 0x8c, 0x04, 0x1a, 0x16, 0x83, 0x16, 0x63, 0x9f, + 0xcf, 0x31, 0xdc, 0x4b, 0x2c, 0x00, 0x34, 0x09, 0x5d, 0x96, 0x52, 0x3c, + 0x30, 0xb7, 0xe2, 0x08, 0x34, 0x1c, 0x8f, 0x83, 0x10, 0xeb, 0x1c, 0x06, + 0x88, 0x77, 0xb1, 0xea, 0xc7, 0xa2, 0xed, 0x2a, 0xd9, 0xef, 0x2f, 0xa5, + 0x8e, 0x70, 0xff, 0x00, 0xe0, 0x04, 0xac, 0xac, 0x8e, 0x8c, 0xfd, 0xd4, + 0x22, 0x81, 0xe6, 0x06, 0xe9, 0x6b, 0x2c, 0x40, 0x96, 0x2d, 0x83, 0x5a, + 0x2b, 0xaf, 0x88, 0x23, 0x96, 0xc7, 0x41, 0xe6, 0x2d, 0x62, 0x35, 0xc4, + 0xc1, 0x4c, 0xa0, 0xea, 0x18, 0xf7, 0xa0, 0x94, 0x20, 0x9f, 0xd6, 0x93, + 0x3d, 0x51, 0xd7, 0xf1, 0x30, 0x1c, 0xd7, 0xb9, 0xf5, 0x73, 0x4e, 0xff, + 0x00, 0xc3, 0x58, 0x12, 0xfb, 0x78, 0xfa, 0xce, 0x01, 0xc2, 0x7d, 0x45, + 0x16, 0x2c, 0x51, 0x65, 0x1b, 0x40, 0x34, 0x50, 0x72, 0xde, 0xba, 0xce, + 0xb8, 0x01, 0x5b, 0x19, 0x27, 0x01, 0x4c, 0xa3, 0x20, 0xb5, 0x00, 0xe5, + 0xbc, 0x7c, 0xc6, 0x54, 0xea, 0x7a, 0x0a, 0xa5, 0xe8, 0x36, 0xb3, 0x0d, + 0xd1, 0x11, 0x81, 0xe1, 0xe1, 0xef, 0x06, 0x2a, 0x86, 0x92, 0xa0, 0x40, + 0xa8, 0x86, 0x8b, 0x29, 0x34, 0x5c, 0xa7, 0xd9, 0x3f, 0xbc, 0x87, 0x42, + 0x1b, 0xe5, 0xdf, 0xee, 0x20, 0xf6, 0xcb, 0x3f, 0x31, 0x99, 0x17, 0x5a, + 0x68, 0x74, 0x9a, 0xa3, 0xe8, 0xcb, 0x9a, 0x10, 0x2d, 0x9b, 0x41, 0xd6, + 0xf1, 0xb8, 0x77, 0x04, 0xa8, 0xeb, 0x4e, 0xbe, 0x20, 0x61, 0xa7, 0x41, + 0x0b, 0xe1, 0x97, 0x97, 0x8f, 0x6a, 0x0e, 0x85, 0x15, 0x00, 0x3a, 0xff, + 0x00, 0xfd, 0x08, 0x84, 0xd2, 0xa0, 0x57, 0xa3, 0x92, 0x78, 0x82, 0x5d, + 0x80, 0x3a, 0x82, 0xe0, 0xf6, 0x8a, 0x0f, 0xca, 0x06, 0x59, 0x7c, 0xc5, + 0xa7, 0x65, 0x30, 0x87, 0x34, 0x1c, 0x24, 0xb2, 0x50, 0xb2, 0xe8, 0x00, + 0x29, 0x1d, 0xaf, 0xcb, 0x11, 0x31, 0x0d, 0xe4, 0x54, 0x00, 0xb4, 0xe3, + 0x57, 0xbd, 0x4b, 0xee, 0xe3, 0x2b, 0x45, 0xc5, 0x6a, 0x38, 0x05, 0x8b, + 0xa2, 0xee, 0x64, 0xd4, 0x2d, 0xd5, 0x02, 0xfc, 0x88, 0x03, 0x51, 0xf8, + 0x7f, 0x70, 0x5d, 0xf3, 0x44, 0x2f, 0x42, 0xa5, 0x5a, 0x67, 0xaa, 0x7e, + 0xa6, 0x93, 0xd8, 0x92, 0xd8, 0xd3, 0xc0, 0xd4, 0x6a, 0xac, 0x4d, 0x4a, + 0x30, 0x8d, 0x83, 0x0a, 0xe6, 0xe5, 0xa6, 0xb0, 0xda, 0x83, 0xcc, 0xd5, + 0xbd, 0xf9, 0x5d, 0x64, 0xd8, 0x2c, 0x5a, 0xb4, 0x4b, 0xe4, 0xaf, 0x48, + 0x09, 0x02, 0xcd, 0x04, 0x4c, 0xc3, 0x28, 0xef, 0x31, 0x1f, 0x47, 0x46, + 0x3a, 0x8a, 0x1c, 0xe1, 0xf7, 0x70, 0x80, 0x77, 0xab, 0xf6, 0x13, 0x99, + 0xdd, 0xd3, 0xf3, 0x00, 0xc9, 0x7a, 0x09, 0xa1, 0x97, 0xb3, 0x0f, 0x52, + 0x59, 0xd0, 0x60, 0x15, 0x84, 0x4a, 0x06, 0x1d, 0x22, 0xa2, 0x0d, 0xd5, + 0x67, 0x88, 0xd5, 0x0d, 0xca, 0x6b, 0xd9, 0x02, 0x2c, 0x5e, 0x84, 0x22, + 0x9d, 0x47, 0x98, 0xa1, 0x8d, 0x93, 0x92, 0x07, 0x50, 0xb9, 0x73, 0xd2, + 0x13, 0x00, 0x28, 0x08, 0xcb, 0xec, 0xfe, 0x50, 0xbe, 0x1f, 0x15, 0x06, + 0x52, 0xc1, 0x50, 0xbb, 0xe7, 0x05, 0xe1, 0xcf, 0x68, 0xf1, 0x06, 0x10, + 0x3d, 0x94, 0x80, 0xb4, 0xf8, 0x58, 0xa6, 0x8d, 0x0c, 0xb0, 0xe5, 0x5c, + 0xd3, 0xbf, 0x58, 0xa6, 0xf1, 0x6d, 0x45, 0xe6, 0x28, 0xdd, 0x0e, 0x04, + 0x76, 0xae, 0xc6, 0x1a, 0x51, 0xe2, 0x55, 0x10, 0xd9, 0x22, 0xfa, 0x5c, + 0xbb, 0x89, 0x05, 0xb2, 0xfe, 0xfb, 0xeb, 0x49, 0x15, 0xa7, 0x7a, 0x2e, + 0x3c, 0x59, 0x1c, 0xb9, 0x50, 0xb3, 0xe1, 0x82, 0x06, 0x80, 0x5a, 0x7f, + 0x01, 0xf2, 0x31, 0xd0, 0x21, 0xab, 0x8d, 0xc6, 0xb1, 0x63, 0xf8, 0xf4, + 0x35, 0x8d, 0x17, 0x1a, 0x90, 0x79, 0x70, 0x56, 0x08, 0xda, 0x3b, 0x97, + 0x0b, 0x32, 0x37, 0x30, 0x40, 0x97, 0x8e, 0x39, 0xbd, 0x47, 0x03, 0xb6, + 0x22, 0x2a, 0xc3, 0xdf, 0x4b, 0x3a, 0x73, 0x29, 0x6b, 0x2a, 0x7a, 0x44, + 0x11, 0x2c, 0xc1, 0x32, 0x25, 0xd8, 0x70, 0x4e, 0x66, 0x31, 0xac, 0xb2, + 0xc0, 0x80, 0xb4, 0x88, 0x8e, 0xa4, 0xdb, 0x0e, 0xf3, 0x1d, 0x67, 0x56, + 0x00, 0x1d, 0x6c, 0x5b, 0x1e, 0x49, 0xa3, 0x01, 0xbe, 0x9b, 0x48, 0xe6, + 0xbe, 0xb0, 0x43, 0xd2, 0xfd, 0x2e, 0x77, 0x4c, 0x73, 0x3a, 0xd4, 0xc1, + 0x18, 0xc6, 0x2e, 0x3c, 0xc6, 0x4a, 0xf1, 0x1d, 0x4a, 0x77, 0x83, 0x7c, + 0xe2, 0x54, 0x3a, 0x5b, 0xd0, 0x88, 0x69, 0xba, 0x31, 0xe4, 0x56, 0xf8, + 0x7b, 0x5c, 0x0d, 0x28, 0x44, 0xd6, 0x32, 0xec, 0x02, 0x4d, 0x3d, 0xf6, + 0x98, 0x5d, 0x3a, 0x98, 0xfb, 0xb4, 0x82, 0x95, 0x47, 0x86, 0x12, 0xad, + 0x79, 0x87, 0x4b, 0x8d, 0x6d, 0x3d, 0xe6, 0xa4, 0x26, 0x9a, 0x9e, 0xf0, + 0x47, 0x10, 0x66, 0x65, 0x2d, 0xfe, 0xa5, 0xe0, 0xe4, 0xc3, 0xaa, 0x02, + 0x54, 0xe2, 0x05, 0x6d, 0xb6, 0xb4, 0xd4, 0xd6, 0x1b, 0xdd, 0x97, 0x6f, + 0x01, 0xe0, 0x42, 0xc3, 0x3a, 0xc5, 0x64, 0x9b, 0x14, 0xc1, 0x29, 0x7b, + 0xe9, 0x51, 0xc6, 0x82, 0xd0, 0x0a, 0x3b, 0x98, 0x96, 0x6a, 0x2b, 0x9a, + 0xc0, 0xf4, 0x3d, 0xa6, 0xbe, 0xac, 0x63, 0x7b, 0x7e, 0x58, 0x86, 0x6b, + 0x41, 0xf1, 0x35, 0x7f, 0xd8, 0x46, 0x63, 0xd9, 0x11, 0x7c, 0x27, 0x98, + 0x7d, 0x6a, 0x22, 0xec, 0x3b, 0x64, 0x5a, 0xf2, 0x9a, 0x28, 0x53, 0xde, + 0x10, 0xfb, 0xc0, 0x80, 0x44, 0xc6, 0x75, 0x56, 0xdf, 0x67, 0xea, 0x53, + 0x8e, 0x65, 0x10, 0x4e, 0xfa, 0x9f, 0x68, 0xea, 0x6a, 0xef, 0xfe, 0x71, + 0x38, 0x9b, 0x7e, 0xbd, 0x4f, 0xa9, 0x42, 0x11, 0xb6, 0x4b, 0x5d, 0x68, + 0xb8, 0x96, 0xbb, 0x7a, 0xbb, 0x5e, 0x6b, 0xab, 0xb4, 0x04, 0xa0, 0x36, + 0x09, 0xa2, 0xca, 0x7f, 0x32, 0xfe, 0xab, 0x9a, 0x6c, 0x7e, 0x9e, 0x1f, + 0x11, 0x1f, 0x7e, 0xc8, 0xef, 0xff, 0x00, 0x28, 0x9b, 0x7b, 0x0e, 0xeb, + 0xb0, 0xb3, 0xc9, 0xe6, 0x68, 0x24, 0x81, 0x7c, 0x51, 0x9a, 0xb0, 0xd8, + 0x5c, 0xbf, 0xd1, 0x62, 0xa8, 0x38, 0x4b, 0xf4, 0xac, 0xca, 0x84, 0x66, + 0x83, 0x48, 0x57, 0x22, 0xf8, 0x8f, 0xab, 0xfc, 0x2a, 0x12, 0x0d, 0x97, + 0xfe, 0x11, 0x70, 0x2f, 0xea, 0x5f, 0xdc, 0xa3, 0x40, 0x3a, 0x04, 0xb9, + 0xde, 0x5d, 0xcc, 0x0a, 0xe3, 0xbb, 0x6e, 0xb9, 0xab, 0xfb, 0x0f, 0x90, + 0x8b, 0x83, 0x64, 0xa3, 0x66, 0xe6, 0x66, 0x92, 0x88, 0xd6, 0xc3, 0x0e, + 0x3e, 0x62, 0xa0, 0x97, 0xec, 0xc7, 0x02, 0x44, 0x08, 0x80, 0x68, 0xf7, + 0x89, 0x70, 0xc0, 0x73, 0x33, 0x41, 0x35, 0x63, 0x59, 0x56, 0x84, 0x2c, + 0x30, 0xd7, 0x48, 0x93, 0x41, 0x5a, 0x1a, 0x7e, 0x62, 0xef, 0xbd, 0x6b, + 0xde, 0x6a, 0xac, 0x39, 0x9f, 0xee, 0x40, 0x18, 0x0f, 0x99, 0x51, 0x0c, + 0xb8, 0x32, 0xb2, 0xd8, 0x65, 0xe6, 0x6a, 0x44, 0x5c, 0x5e, 0x3b, 0xcd, + 0x99, 0x84, 0xaa, 0x10, 0x28, 0xb1, 0x6f, 0x22, 0x98, 0xc1, 0x38, 0x16, + 0x7b, 0xcd, 0xe8, 0x63, 0x71, 0x71, 0xa6, 0xd1, 0xa6, 0xd0, 0x50, 0x2c, + 0x20, 0xff, 0x00, 0xc0, 0x2c, 0x35, 0x70, 0x33, 0x5b, 0x18, 0xc4, 0x8c, + 0xd2, 0x64, 0xf4, 0x33, 0x29, 0x94, 0x74, 0x4b, 0xaf, 0x36, 0xd1, 0x7a, + 0x44, 0x34, 0x74, 0x96, 0xb6, 0xb4, 0xc5, 0x9e, 0x68, 0x02, 0x05, 0x94, + 0x08, 0x47, 0x02, 0x71, 0x18, 0xa5, 0x72, 0xab, 0x34, 0x5c, 0x61, 0x68, + 0x9a, 0x00, 0xc5, 0xf4, 0xc6, 0xea, 0x44, 0xa9, 0x23, 0x99, 0x3e, 0x22, + 0x1d, 0x8c, 0xd1, 0xf6, 0x61, 0x6a, 0xec, 0x72, 0x31, 0x49, 0x7e, 0x3e, + 0xf0, 0x5a, 0xcc, 0x76, 0xac, 0xe5, 0xc3, 0x9a, 0x17, 0x65, 0x97, 0xe9, + 0x0f, 0x02, 0x57, 0xd7, 0xb4, 0xa7, 0x7a, 0x95, 0xac, 0x92, 0xf6, 0xa3, + 0x49, 0xfe, 0x45, 0x5e, 0xf1, 0xe5, 0x99, 0x85, 0x63, 0xdc, 0xdd, 0x66, + 0xfe, 0x86, 0xbe, 0x8e, 0x66, 0xd1, 0xd2, 0x15, 0x00, 0x2e, 0x05, 0xe6, + 0x50, 0xcf, 0xb9, 0x16, 0xca, 0x7a, 0x5c, 0x7a, 0xe2, 0xd8, 0xa7, 0x78, + 0xbd, 0x63, 0x5c, 0xca, 0x0a, 0xca, 0x6b, 0x97, 0x8d, 0x46, 0xa5, 0xf0, + 0x7c, 0xc2, 0x98, 0x1e, 0x77, 0x2d, 0xd6, 0x51, 0xa4, 0x4e, 0x55, 0x08, + 0xa9, 0x65, 0x5e, 0x1d, 0xa1, 0x6e, 0x01, 0x69, 0x39, 0x5a, 0x6b, 0x29, + 0x53, 0x90, 0x61, 0xf6, 0xff, 0x00, 0xb0, 0x8f, 0x28, 0x1e, 0x84, 0xe4, + 0xa9, 0xac, 0xbd, 0x6b, 0x0f, 0x92, 0x3d, 0x74, 0x61, 0xd1, 0xf6, 0x3a, + 0x9f, 0x50, 0x3a, 0x69, 0x6b, 0x03, 0xf8, 0xb3, 0x6f, 0x66, 0x31, 0xc3, + 0x19, 0x6b, 0xfe, 0x50, 0x6c, 0x42, 0x05, 0xc2, 0xe0, 0x66, 0x11, 0x9e, + 0x60, 0x7a, 0xfe, 0x89, 0x87, 0x11, 0x03, 0x40, 0x48, 0xd6, 0x0a, 0x7a, + 0x4c, 0x0f, 0x44, 0x40, 0x98, 0x8e, 0xcd, 0xea, 0x3c, 0x8e, 0x02, 0x52, + 0x39, 0x4a, 0xec, 0xfc, 0x46, 0xdc, 0x1f, 0x6d, 0xe0, 0xeb, 0xb3, 0x08, + 0x4b, 0x0e, 0x91, 0x33, 0x26, 0xed, 0x45, 0xef, 0x8d, 0x0b, 0x7b, 0x9f, + 0xa8, 0x1d, 0x96, 0xd5, 0x69, 0xfb, 0x8e, 0xdd, 0x71, 0x2b, 0x53, 0xbc, + 0xc4, 0x18, 0xa7, 0xb7, 0xe6, 0x1f, 0xa9, 0x1d, 0x3b, 0x2e, 0x8a, 0xef, + 0x69, 0x94, 0x72, 0xe9, 0x30, 0x18, 0x89, 0x88, 0x4e, 0xd0, 0x76, 0x23, + 0x76, 0xfb, 0x4b, 0x3f, 0x82, 0x18, 0x00, 0xbd, 0x80, 0x95, 0x82, 0xbd, + 0x1a, 0xc7, 0xcd, 0x5f, 0x89, 0x7c, 0x0a, 0xe4, 0x26, 0x06, 0x0a, 0x23, + 0x2f, 0xb6, 0x33, 0x7a, 0xd2, 0x35, 0x77, 0xb9, 0x30, 0xfb, 0xcd, 0x92, + 0xe8, 0x6e, 0x6b, 0x00, 0xf2, 0xa6, 0xfc, 0xef, 0x2a, 0x64, 0x6b, 0xe2, + 0x2a, 0x58, 0x8a, 0x94, 0xc5, 0x62, 0xb2, 0xa8, 0xa0, 0x5e, 0xa5, 0x45, + 0x64, 0x7d, 0x12, 0x31, 0x95, 0x32, 0xa3, 0x35, 0x89, 0x1b, 0x73, 0x05, + 0x31, 0x2c, 0x96, 0x08, 0xea, 0x60, 0xaa, 0xa1, 0xd6, 0x2a, 0xa8, 0x2d, + 0x9a, 0xa6, 0x73, 0x3a, 0x95, 0x1f, 0xb3, 0xc4, 0x6f, 0x62, 0x1d, 0x04, + 0x51, 0xdd, 0x49, 0x7d, 0xde, 0xa1, 0xc2, 0xa4, 0x01, 0x2c, 0xc3, 0xe0, + 0x4d, 0x6a, 0xa7, 0xdb, 0x2e, 0x2f, 0x45, 0x69, 0x27, 0xc9, 0xa2, 0x7e, + 0x62, 0xd4, 0x3a, 0xf6, 0x3f, 0x13, 0x9f, 0x79, 0x45, 0xad, 0x7e, 0xdf, + 0xf3, 0x14, 0xc7, 0xb1, 0x8b, 0xfb, 0xbf, 0xd0, 0x4a, 0x1b, 0x77, 0x8f, + 0xc0, 0x8d, 0xcb, 0x60, 0x69, 0xb2, 0x82, 0x2f, 0x6c, 0x4c, 0x84, 0x8e, + 0xb7, 0x17, 0xf1, 0xec, 0x41, 0xd6, 0xae, 0x40, 0xb8, 0xe8, 0x04, 0x6b, + 0xa6, 0x26, 0xf3, 0x70, 0xc2, 0x6f, 0x2a, 0xe6, 0x9e, 0x98, 0x4d, 0x71, + 0x9b, 0x46, 0xf0, 0x96, 0x5f, 0xa2, 0xfa, 0xfa, 0x2b, 0x68, 0x04, 0x85, + 0xc5, 0x53, 0x2b, 0x77, 0x4b, 0x4a, 0xd7, 0xcc, 0x76, 0xaa, 0xf9, 0x98, + 0xaa, 0xa8, 0xbd, 0x70, 0x22, 0xb0, 0x0b, 0xdc, 0x1b, 0x7d, 0x89, 0x50, + 0x09, 0xf8, 0xfb, 0x40, 0x40, 0x03, 0x40, 0x2a, 0x0c, 0x28, 0xbf, 0x70, + 0x8a, 0x29, 0xd1, 0xe6, 0x51, 0xa5, 0x5b, 0x36, 0xbe, 0x9b, 0x3e, 0x20, + 0x3a, 0x32, 0x82, 0xc4, 0x75, 0x19, 0x62, 0x7c, 0x4e, 0x5e, 0xa7, 0x6d, + 0x3b, 0x54, 0xae, 0xe2, 0xda, 0xf2, 0x72, 0x3d, 0x48, 0x69, 0x14, 0x54, + 0xcc, 0x7f, 0x42, 0x08, 0x7a, 0x1b, 0x86, 0x20, 0xf9, 0x7f, 0x44, 0xc3, + 0x46, 0x18, 0x15, 0x50, 0xc6, 0x20, 0xe2, 0xe0, 0xb0, 0x15, 0x41, 0xde, + 0x21, 0x42, 0x12, 0x26, 0x89, 0x38, 0xee, 0xc3, 0x80, 0xe1, 0xf9, 0x26, + 0xdd, 0x71, 0xb4, 0x4c, 0x43, 0xb4, 0x73, 0x25, 0x00, 0x6a, 0x63, 0x95, + 0xad, 0x24, 0x3c, 0xf5, 0x48, 0x10, 0x74, 0xcb, 0x99, 0x7d, 0x41, 0xdd, + 0x3f, 0x31, 0x1a, 0x04, 0xd8, 0x5f, 0x77, 0xf1, 0x3e, 0x63, 0xaa, 0xf7, + 0xa8, 0x7c, 0xad, 0x09, 0x84, 0xc7, 0xbc, 0x74, 0xa4, 0xf7, 0x22, 0x1d, + 0xcb, 0xbd, 0x50, 0x61, 0xdb, 0x53, 0x34, 0x73, 0xf0, 0x3e, 0xe7, 0xc4, + 0x93, 0xf8, 0x8c, 0xcf, 0x63, 0x3f, 0xa4, 0x06, 0x55, 0xe9, 0x7e, 0xd1, + 0x2b, 0x5b, 0xe5, 0x18, 0xb1, 0x07, 0x41, 0x0a, 0xe0, 0x8b, 0xda, 0x9c, + 0x1e, 0x82, 0x51, 0x1e, 0x31, 0xac, 0xce, 0x32, 0x45, 0x7d, 0x15, 0x86, + 0xe0, 0x4d, 0x93, 0x11, 0x62, 0x1a, 0x1d, 0x08, 0xed, 0x2c, 0x91, 0xdb, + 0xb3, 0xe2, 0x66, 0x74, 0x33, 0xcc, 0x3f, 0x31, 0x48, 0x0d, 0x49, 0xd0, + 0x8f, 0xc4, 0x48, 0xd5, 0x45, 0xd4, 0x30, 0xfd, 0xc0, 0xb1, 0x11, 0x1c, + 0xc1, 0x6e, 0x45, 0x29, 0x2f, 0x30, 0x41, 0xd4, 0xf0, 0x3d, 0xd8, 0xd9, + 0xaa, 0xee, 0x43, 0x84, 0xc5, 0x98, 0x13, 0x6a, 0xef, 0x2f, 0xa9, 0x78, + 0x80, 0x60, 0x82, 0x7a, 0x1a, 0x22, 0x6f, 0x88, 0x57, 0x15, 0x4a, 0x3f, + 0x10, 0xea, 0x97, 0xe8, 0xc1, 0x37, 0x41, 0xf8, 0x8f, 0xcc, 0x54, 0x4c, + 0x3b, 0x40, 0xe2, 0x28, 0xe9, 0x89, 0x4e, 0x23, 0xc1, 0x3a, 0x10, 0xb3, + 0x42, 0x02, 0xe1, 0x88, 0x43, 0x42, 0xc9, 0x87, 0x55, 0xd5, 0x2a, 0xfb, + 0x30, 0x99, 0x48, 0xbb, 0xab, 0x3d, 0xc8, 0x63, 0x88, 0xd2, 0xf3, 0x1e, + 0x0d, 0x73, 0x04, 0x25, 0x54, 0xab, 0x8e, 0x9e, 0x9a, 0x22, 0x80, 0x73, + 0x12, 0xf7, 0x88, 0x69, 0x29, 0x75, 0x88, 0x99, 0x81, 0x65, 0x54, 0xab, + 0x9a, 0xa1, 0x84, 0x2c, 0x17, 0x06, 0x57, 0xc6, 0xb3, 0x46, 0x9e, 0x15, + 0x03, 0xe3, 0xf6, 0x43, 0x41, 0x06, 0xc1, 0x53, 0xb6, 0x61, 0x01, 0x15, + 0x22, 0x9a, 0xca, 0x41, 0xc2, 0x84, 0x74, 0xa7, 0x24, 0x02, 0x8d, 0xc9, + 0x93, 0xda, 0x31, 0x16, 0xc3, 0x27, 0x0f, 0x31, 0xfe, 0xb0, 0xb7, 0x5f, + 0xf5, 0x7d, 0xcc, 0xa2, 0x4a, 0x44, 0x26, 0x09, 0x11, 0x33, 0xd2, 0x5d, + 0x50, 0x84, 0xe5, 0x68, 0x1a, 0xc4, 0x17, 0x34, 0x87, 0x5d, 0x20, 0x18, + 0x61, 0x8c, 0xc4, 0xc0, 0xd2, 0xe5, 0x3a, 0x88, 0xeb, 0x52, 0x17, 0x76, + 0x57, 0x78, 0x4b, 0x82, 0xe4, 0x41, 0xa8, 0xf5, 0x17, 0xdb, 0x44, 0xb8, + 0xdb, 0x30, 0x29, 0x9e, 0x71, 0xf3, 0x1a, 0x01, 0x39, 0xa0, 0x74, 0x9a, + 0x53, 0xc9, 0xe8, 0xb9, 0x78, 0x99, 0x92, 0xc2, 0x68, 0xc9, 0xfc, 0xbf, + 0x88, 0x98, 0x89, 0x06, 0x34, 0x89, 0xb4, 0x07, 0x62, 0x3b, 0x60, 0xf1, + 0x12, 0x38, 0x08, 0x83, 0x05, 0x41, 0x04, 0x6d, 0x28, 0x94, 0xbc, 0xbd, + 0x23, 0xf4, 0x9a, 0x2f, 0xc0, 0xf5, 0xcc, 0x30, 0xf8, 0x41, 0x4a, 0xde, + 0x54, 0x21, 0xa2, 0x17, 0xda, 0x21, 0x9c, 0x1b, 0x20, 0xc1, 0x3a, 0x31, + 0xa1, 0x72, 0xc6, 0xaa, 0xee, 0x2f, 0xf1, 0x52, 0xc3, 0xc1, 0x29, 0xf2, + 0x42, 0x6d, 0xf0, 0x7e, 0x61, 0x8f, 0x35, 0xbd, 0xc3, 0xf2, 0x4b, 0x3a, + 0x3d, 0x68, 0xfc, 0xc4, 0x91, 0x6f, 0xe1, 0xa4, 0x4b, 0x01, 0xe4, 0x27, + 0xe0, 0x89, 0xe8, 0xfc, 0x9f, 0x64, 0xdd, 0xcf, 0x3f, 0xd4, 0x63, 0xf1, + 0x91, 0x21, 0x7c, 0xbf, 0x29, 0x8f, 0xab, 0x07, 0x5f, 0xd0, 0x61, 0x87, + 0x93, 0x3f, 0x22, 0x3b, 0x37, 0x58, 0x27, 0xba, 0x73, 0xf5, 0x28, 0x2f, + 0x58, 0xf1, 0x07, 0x10, 0x62, 0xa8, 0x3e, 0x80, 0xe2, 0x5b, 0x55, 0x42, + 0x6f, 0x87, 0x0f, 0xc3, 0x09, 0x24, 0x86, 0xb9, 0x9c, 0x00, 0xd0, 0xec, + 0x60, 0x9e, 0xc9, 0x63, 0x16, 0x5d, 0x7a, 0xd7, 0x72, 0xf5, 0x98, 0x4b, + 0xeb, 0xe9, 0xca, 0x24, 0x72, 0x7f, 0xd4, 0x81, 0x80, 0x2e, 0xf5, 0x49, + 0x00, 0x6c, 0x7b, 0xdc, 0xab, 0xe0, 0x78, 0x99, 0x25, 0x4b, 0xc4, 0xa7, + 0x32, 0xcb, 0xa9, 0xab, 0x59, 0x7b, 0x33, 0xda, 0x59, 0x54, 0xa2, 0x54, + 0x17, 0x05, 0xda, 0x08, 0xc9, 0x31, 0xd6, 0x35, 0xbb, 0x34, 0x01, 0xe8, + 0x99, 0x7e, 0x97, 0xda, 0xe7, 0xcd, 0x54, 0xc0, 0xf7, 0xa8, 0x3e, 0xd7, + 0xe2, 0x6a, 0xe9, 0x70, 0x5b, 0xfc, 0x4b, 0x3e, 0x31, 0x47, 0xc5, 0x4a, + 0x71, 0xf7, 0x48, 0x09, 0x14, 0x10, 0xf4, 0x2b, 0x36, 0x8d, 0xf3, 0x1b, + 0xca, 0x23, 0x4a, 0x45, 0x5c, 0xb2, 0x5b, 0x11, 0xe6, 0x07, 0xdb, 0x3c, + 0xbe, 0xfb, 0xcd, 0x74, 0x2d, 0x5a, 0x5f, 0xfd, 0x44, 0x19, 0x91, 0xa8, + 0x66, 0x00, 0x0b, 0x5d, 0xd0, 0x3e, 0xe3, 0x58, 0x9e, 0x45, 0x7f, 0x12, + 0x93, 0xda, 0x3f, 0xdb, 0x13, 0x29, 0xb8, 0x7f, 0xe0, 0x98, 0x9f, 0xc7, + 0xb7, 0x61, 0xab, 0x5e, 0xa2, 0x10, 0x06, 0xed, 0x36, 0x4d, 0xf6, 0x9a, + 0xf0, 0xf6, 0x26, 0xe2, 0x79, 0x0f, 0xcc, 0x05, 0x07, 0xb3, 0x3e, 0xae, + 0x1d, 0xe6, 0x57, 0xe0, 0x8a, 0xd2, 0x80, 0xa4, 0x6f, 0x8c, 0xab, 0x8d, + 0xe5, 0x10, 0x4e, 0x16, 0xa3, 0x8e, 0xb1, 0xc6, 0x32, 0xda, 0x0c, 0x69, + 0xe8, 0x5b, 0x95, 0xb3, 0x0d, 0xba, 0xab, 0x06, 0x11, 0x8a, 0x59, 0x8f, + 0xae, 0xe7, 0xcc, 0x58, 0xc5, 0x18, 0x5f, 0x11, 0x62, 0xc5, 0xe8, 0x48, + 0x3c, 0x4f, 0x77, 0x79, 0x7b, 0xcf, 0xfb, 0xb7, 0xac, 0x77, 0xe8, 0x19, + 0x8d, 0x22, 0x11, 0x23, 0x2d, 0x60, 0x5e, 0xd7, 0x01, 0x50, 0x9b, 0x99, + 0x78, 0xd5, 0x43, 0x44, 0x25, 0x7b, 0xfa, 0x18, 0x65, 0x86, 0x5e, 0x99, + 0xdb, 0x03, 0xc4, 0x3a, 0x25, 0xfb, 0x4a, 0xd3, 0x07, 0xd0, 0xa0, 0xc9, + 0xd2, 0x7f, 0x2a, 0x33, 0xba, 0xab, 0x56, 0x55, 0x82, 0x84, 0x57, 0x16, + 0x1f, 0x30, 0x7d, 0x03, 0x06, 0x14, 0x13, 0x58, 0x2f, 0x6e, 0xf3, 0xbd, + 0x67, 0xe7, 0xd0, 0x4d, 0x36, 0xe7, 0x07, 0x77, 0x13, 0x13, 0x06, 0x1a, + 0x9b, 0xf5, 0x9c, 0xa6, 0xc8, 0x41, 0x6d, 0xe5, 0x22, 0x1d, 0xea, 0x27, + 0x98, 0x9e, 0x66, 0x5d, 0xa6, 0x42, 0x1b, 0x9b, 0x3d, 0xe0, 0x7e, 0x61, + 0xbf, 0x68, 0x63, 0x8d, 0x91, 0x86, 0x48, 0x9d, 0x14, 0xe0, 0x79, 0xc3, + 0xff, 0x00, 0x71, 0x3a, 0xe7, 0xca, 0x03, 0xb1, 0xee, 0xb3, 0xfb, 0x98, + 0x3d, 0x3e, 0x6c, 0x3a, 0x4e, 0xcb, 0x2d, 0x0a, 0x8e, 0x16, 0x1f, 0xe8, + 0x61, 0xa6, 0xf3, 0x4a, 0x71, 0xb8, 0x4c, 0x42, 0x3d, 0xae, 0x90, 0x0c, + 0x0f, 0x04, 0xa9, 0xa1, 0x0a, 0x4a, 0x80, 0x51, 0xbb, 0x2b, 0x01, 0x2d, + 0xc7, 0xa1, 0x8c, 0x61, 0x9a, 0x62, 0x97, 0x70, 0x1a, 0xbb, 0xb1, 0xac, + 0x2c, 0x94, 0x82, 0xfd, 0x26, 0x68, 0x8c, 0xbb, 0x25, 0xb5, 0xb2, 0x39, + 0x1e, 0xa7, 0xfd, 0x80, 0x6e, 0xc8, 0xe4, 0x77, 0x1e, 0xa4, 0xb6, 0xa5, + 0xd0, 0x71, 0x0c, 0xdb, 0xd4, 0x2a, 0x84, 0x16, 0x84, 0x11, 0x45, 0x0a, + 0x2b, 0xda, 0x08, 0x92, 0x29, 0x27, 0x2b, 0xac, 0xa8, 0xd6, 0x77, 0x7a, + 0x56, 0xf3, 0x1c, 0x21, 0x0d, 0x3b, 0xcc, 0x99, 0xdd, 0x0d, 0xdf, 0x12, + 0xc1, 0x82, 0xeb, 0x70, 0x3d, 0xff, 0x00, 0x63, 0x58, 0x08, 0x8a, 0x03, + 0x44, 0x62, 0xdc, 0x51, 0x6e, 0x2c, 0x63, 0x12, 0x30, 0xa2, 0xf2, 0xb7, + 0x96, 0x07, 0xf4, 0xef, 0xbc, 0x5e, 0x94, 0x62, 0x47, 0x75, 0x4a, 0x5c, + 0x48, 0x97, 0x15, 0x01, 0x25, 0x8d, 0xa3, 0xb9, 0x5b, 0x20, 0x51, 0xe6, + 0xa1, 0xa2, 0x04, 0x08, 0x12, 0x95, 0xff, 0x00, 0x9e, 0xc6, 0x76, 0x4b, + 0x99, 0x49, 0x08, 0x18, 0x35, 0x33, 0x47, 0x77, 0xaf, 0x07, 0x9e, 0xed, + 0x09, 0xd7, 0x90, 0xac, 0xa4, 0x45, 0x1c, 0xbb, 0x83, 0x98, 0x40, 0xc2, + 0x0c, 0x22, 0xe6, 0x16, 0x9c, 0x03, 0xab, 0xfe, 0xdf, 0xbc, 0xbf, 0x46, + 0x34, 0xea, 0xfd, 0x53, 0x13, 0x08, 0x1c, 0xf4, 0x97, 0xe8, 0x63, 0xac, + 0x65, 0x84, 0xbe, 0xb1, 0x8b, 0x97, 0x88, 0xb0, 0x89, 0x2c, 0x6c, 0xc2, + 0x6f, 0x1a, 0x05, 0xd2, 0x0e, 0x8f, 0xdc, 0xa5, 0x76, 0xdc, 0x85, 0xc4, + 0xd5, 0x83, 0xc7, 0xa7, 0xb6, 0xa1, 0x5f, 0xfe, 0x04, 0x3a, 0x62, 0xd2, + 0xd3, 0x86, 0xec, 0x22, 0x02, 0x89, 0x49, 0x2c, 0x22, 0xcc, 0x36, 0x9d, + 0x93, 0x26, 0x36, 0x87, 0x6c, 0x46, 0xa5, 0x90, 0x6a, 0x23, 0xb4, 0x0e, + 0xd7, 0x05, 0xba, 0x3a, 0x15, 0x29, 0x72, 0xe1, 0xd9, 0xe6, 0xed, 0xcc, + 0xcb, 0xaa, 0xce, 0xff, 0x00, 0x92, 0x56, 0x83, 0x42, 0xcb, 0x27, 0x4b, + 0xd2, 0xaa, 0x08, 0xa8, 0xf4, 0x48, 0x50, 0x82, 0x35, 0xf4, 0x88, 0x56, + 0x9b, 0x8f, 0xe2, 0x1a, 0x41, 0x89, 0x8c, 0x35, 0xed, 0x0e, 0x70, 0x6e, + 0x2d, 0x4b, 0xf4, 0x2a, 0xcb, 0xc6, 0x63, 0x68, 0x9a, 0x69, 0x5f, 0x98, + 0x79, 0x45, 0x8b, 0x71, 0x63, 0xde, 0x30, 0xc2, 0xcb, 0x15, 0x81, 0x83, + 0x56, 0x63, 0xd8, 0x68, 0xb8, 0x25, 0xd1, 0x4c, 0xa3, 0x58, 0xad, 0xa5, + 0x46, 0x58, 0xa4, 0x4f, 0x43, 0xa4, 0x05, 0xda, 0x66, 0xb8, 0xaa, 0x38, + 0xa0, 0x1f, 0x10, 0x92, 0x49, 0xc2, 0x10, 0x03, 0xb7, 0xfe, 0x03, 0xe8, + 0x28, 0x82, 0x70, 0x2a, 0x8c, 0x9d, 0x7d, 0x5d, 0x23, 0x47, 0x5b, 0x2b, + 0x56, 0x10, 0x43, 0x44, 0x22, 0x83, 0x2e, 0x98, 0xb9, 0x97, 0x06, 0xbd, + 0x06, 0xd1, 0xb3, 0x81, 0x89, 0x1d, 0xbd, 0xea, 0x0c, 0x69, 0x33, 0xad, + 0xb5, 0xdd, 0x08, 0xe8, 0x3a, 0x42, 0x0a, 0x4d, 0x53, 0x54, 0x2d, 0x2e, + 0xe5, 0xd3, 0x16, 0x6b, 0x16, 0x2c, 0xbf, 0x31, 0x18, 0xb6, 0x41, 0x8c, + 0xc3, 0xbe, 0x20, 0x58, 0x7d, 0x2d, 0xe3, 0x67, 0x49, 0x75, 0x7e, 0xa5, + 0x05, 0x44, 0xc8, 0x99, 0xbf, 0x45, 0xff, 0x00, 0xe0, 0xd2, 0xd6, 0x26, + 0x01, 0x71, 0x6c, 0x45, 0xbc, 0x32, 0x9a, 0x5c, 0xb3, 0x14, 0xce, 0x3e, + 0x71, 0xab, 0xe8, 0xbf, 0x12, 0xc8, 0xe2, 0xce, 0x92, 0x17, 0x1b, 0xb6, + 0xc3, 0xa2, 0x53, 0x89, 0x56, 0xb1, 0x11, 0xb3, 0xda, 0x2b, 0x7b, 0xc4, + 0x10, 0xb2, 0x34, 0x69, 0x64, 0x13, 0x69, 0x49, 0xa4, 0xab, 0xd0, 0xa2, + 0xa8, 0xa2, 0xa8, 0x61, 0x08, 0xd1, 0xc0, 0xa0, 0x9a, 0xee, 0x3f, 0xdf, + 0x89, 0x57, 0x78, 0xe8, 0x3d, 0x2d, 0xfd, 0x24, 0x10, 0x43, 0x2b, 0x73, + 0x08, 0xd2, 0x2b, 0x25, 0x09, 0x9c, 0x02, 0x64, 0x4d, 0xa1, 0x83, 0x4b, + 0x18, 0xc7, 0x4b, 0xc3, 0xd7, 0x79, 0x94, 0x5c, 0x45, 0x8b, 0x68, 0xac, + 0xc1, 0x95, 0x5a, 0xa9, 0x5d, 0x3b, 0x74, 0x4b, 0xe8, 0x8e, 0x55, 0xd6, + 0xa5, 0xbe, 0x8a, 0x8b, 0x9f, 0x56, 0x88, 0xe6, 0x2d, 0x7a, 0x8e, 0x78, + 0x80, 0xde, 0x03, 0x10, 0xa4, 0x3b, 0xd4, 0xb1, 0xad, 0x0e, 0xfe, 0x7d, + 0x21, 0x50, 0x20, 0x40, 0xb9, 0x55, 0x2b, 0xd1, 0x2e, 0x10, 0x25, 0xc2, + 0xd4, 0xa0, 0x20, 0xda, 0x50, 0xa3, 0x2f, 0xe1, 0xde, 0x36, 0x55, 0xb3, + 0x6e, 0x45, 0x63, 0xef, 0x08, 0x84, 0x18, 0xae, 0x13, 0x68, 0x30, 0x81, + 0xf4, 0x10, 0xe4, 0x1a, 0x46, 0xc4, 0xd4, 0x98, 0x2b, 0x4c, 0x8c, 0x83, + 0x58, 0x06, 0xb4, 0x14, 0xf5, 0x94, 0x84, 0x78, 0x96, 0xda, 0x6a, 0x94, + 0x9a, 0xbd, 0x02, 0xd1, 0x8b, 0x1e, 0x8b, 0xda, 0xe3, 0x97, 0x11, 0x6a, + 0xf7, 0x23, 0xfe, 0x3d, 0x0b, 0x05, 0xc0, 0x65, 0xd9, 0x96, 0x04, 0x0d, + 0xd6, 0x57, 0x88, 0xe0, 0x9e, 0xf0, 0x4a, 0xe1, 0x79, 0x18, 0xff, 0x00, + 0xe1, 0xf0, 0xdb, 0xd1, 0xaa, 0x57, 0xa9, 0x44, 0xd0, 0x35, 0xde, 0x57, + 0xb4, 0x29, 0x58, 0x84, 0xe8, 0x8c, 0x37, 0x87, 0xb6, 0x74, 0x65, 0xb0, + 0xeb, 0x49, 0x80, 0x39, 0x7a, 0x0f, 0xfd, 0x20, 0x02, 0x0a, 0x82, 0x06, + 0x26, 0x10, 0xef, 0x06, 0x0c, 0xf7, 0x46, 0x86, 0x8f, 0x06, 0xeb, 0x60, + 0x8f, 0xce, 0x5c, 0x6c, 0x1b, 0x04, 0x1d, 0xf4, 0x9a, 0x0c, 0xce, 0xf8, + 0xda, 0x1c, 0xa1, 0x26, 0x3a, 0xc3, 0xdf, 0x3f, 0xa4, 0xee, 0x8f, 0xac, + 0x56, 0x42, 0x0c, 0x7b, 0x2b, 0x12, 0xbf, 0x83, 0x06, 0xaf, 0xde, 0x4d, + 0x14, 0x28, 0xa8, 0xd6, 0x58, 0x96, 0x8d, 0xec, 0x1d, 0xd9, 0x76, 0xaf, + 0x6e, 0x01, 0x35, 0xe5, 0xcf, 0xa0, 0xba, 0xc5, 0xcf, 0x31, 0x6e, 0x5d, + 0x4d, 0x63, 0x88, 0x99, 0xe9, 0x2a, 0x78, 0x97, 0x7b, 0x4b, 0x3b, 0x42, + 0xd0, 0x45, 0x46, 0x63, 0x63, 0x89, 0x46, 0x35, 0xf7, 0x6b, 0xb3, 0xbc, + 0xa8, 0x10, 0x99, 0x67, 0xb4, 0xab, 0x99, 0x40, 0x10, 0x72, 0x0d, 0x2f, + 0x55, 0xc0, 0x6e, 0xc4, 0x64, 0x86, 0x2d, 0x9e, 0xbf, 0xd2, 0x23, 0x50, + 0x08, 0x02, 0x6b, 0x34, 0xc4, 0x21, 0x08, 0x19, 0x77, 0xff, 0x00, 0xa0, + 0xd3, 0x41, 0xb3, 0xb8, 0x1d, 0x98, 0x96, 0xb7, 0x87, 0xa9, 0xdd, 0x86, + 0x84, 0x50, 0x7d, 0xe5, 0xcb, 0x35, 0x99, 0xb2, 0xea, 0x22, 0x13, 0xab, + 0xd0, 0x88, 0xb7, 0xb4, 0x68, 0x97, 0xd6, 0x31, 0x6e, 0x39, 0x89, 0x89, + 0x6e, 0xb0, 0x91, 0x67, 0x47, 0x10, 0xbd, 0x05, 0xba, 0xa9, 0x52, 0x03, + 0xa9, 0x87, 0xde, 0x55, 0x83, 0xa8, 0x2c, 0x85, 0xd8, 0x3d, 0x57, 0x14, + 0xd4, 0x84, 0x5f, 0x3f, 0x58, 0x63, 0xde, 0x67, 0x9d, 0x38, 0x26, 0xc9, + 0xe7, 0x78, 0x06, 0xc4, 0x0d, 0x04, 0x2b, 0x3e, 0xde, 0x80, 0x8e, 0x13, + 0x38, 0x61, 0x2a, 0xcf, 0xa0, 0x01, 0x2a, 0x46, 0xc8, 0x49, 0x04, 0x10, + 0x40, 0x84, 0x20, 0xc1, 0x8b, 0x10, 0x82, 0x06, 0x10, 0x47, 0xcb, 0x69, + 0xa0, 0x43, 0x19, 0x3b, 0xbb, 0xd5, 0xd6, 0x72, 0x13, 0x03, 0x49, 0x8c, + 0x55, 0xd2, 0x5d, 0x46, 0x30, 0x82, 0x9a, 0x3a, 0xc2, 0x59, 0xd9, 0x19, + 0x3d, 0x05, 0x70, 0xc3, 0x01, 0x71, 0x2e, 0x9d, 0x77, 0x3b, 0x84, 0x27, + 0x8d, 0x55, 0x6e, 0x3c, 0xa3, 0x98, 0x22, 0x73, 0xcc, 0x6f, 0x7b, 0x43, + 0x37, 0x96, 0xbd, 0x23, 0xe1, 0x2e, 0x33, 0x15, 0xe8, 0xc4, 0xb6, 0x54, + 0x31, 0xe9, 0x89, 0x88, 0x1e, 0x7d, 0x15, 0x1d, 0x62, 0x59, 0x5a, 0x80, + 0xe4, 0xf9, 0x25, 0x4c, 0x20, 0x66, 0x05, 0xc0, 0x84, 0xd7, 0xcf, 0x55, + 0x09, 0xc3, 0xd7, 0x55, 0x1e, 0xda, 0x9f, 0x35, 0x1f, 0x22, 0x69, 0x6c, + 0x1d, 0x03, 0x43, 0xd2, 0x11, 0xe9, 0xbc, 0xd2, 0x10, 0xd2, 0x32, 0xe5, + 0xf1, 0x2e, 0x5c, 0xba, 0x97, 0x52, 0xee, 0x66, 0x55, 0xda, 0x5c, 0x75, + 0x65, 0x02, 0x1a, 0x11, 0x4b, 0xa8, 0x50, 0x99, 0x4b, 0x23, 0x17, 0xd6, + 0x16, 0x77, 0x84, 0x19, 0x6b, 0x1c, 0xa3, 0xd3, 0x1f, 0x84, 0xb7, 0x31, + 0x78, 0x62, 0xe6, 0x2c, 0x58, 0xe6, 0x25, 0xcb, 0x60, 0xae, 0x99, 0x8f, + 0xd7, 0x25, 0x92, 0xa2, 0x96, 0x3a, 0x8c, 0xbf, 0x11, 0x81, 0x49, 0x01, + 0x80, 0xd3, 0xa3, 0x65, 0xee, 0xc1, 0xb0, 0x66, 0x04, 0xda, 0xa6, 0x12, + 0xcf, 0x42, 0x57, 0x3a, 0x44, 0xc4, 0xa7, 0x73, 0xd0, 0x65, 0x8c, 0x42, + 0x4b, 0x43, 0xbd, 0x86, 0x7a, 0x62, 0x69, 0x95, 0x06, 0xda, 0x27, 0x55, + 0x98, 0x40, 0x2e, 0xeb, 0x30, 0x20, 0x62, 0x10, 0x21, 0x0d, 0x61, 0x0c, + 0x41, 0xf4, 0x18, 0x56, 0x14, 0x53, 0x5a, 0x34, 0x04, 0xb4, 0x25, 0xf6, + 0x57, 0x2f, 0x4e, 0x90, 0x84, 0xb2, 0xe1, 0xb9, 0x4a, 0x34, 0x8d, 0x9f, + 0x41, 0x7f, 0x45, 0xf5, 0x86, 0xb8, 0xd3, 0xd1, 0x46, 0x68, 0x8e, 0x53, + 0x44, 0x61, 0xdc, 0xa1, 0x0b, 0x26, 0xb0, 0x36, 0x43, 0x52, 0x07, 0x1b, + 0x40, 0x68, 0x6d, 0xc9, 0x12, 0x2c, 0x71, 0xc9, 0x30, 0x2a, 0x30, 0xb5, + 0x16, 0xf6, 0x85, 0xd4, 0x62, 0x95, 0x36, 0x95, 0xd6, 0x69, 0xe9, 0x79, + 0xd2, 0x0d, 0x6d, 0x2e, 0xfa, 0x41, 0xb9, 0x91, 0x2d, 0x8c, 0x95, 0x3d, + 0x91, 0x9e, 0xd4, 0xc3, 0x87, 0x89, 0x55, 0xe8, 0xa8, 0xa5, 0x65, 0x5d, + 0xdb, 0x5d, 0x86, 0x61, 0x94, 0x6d, 0x0c, 0xef, 0x81, 0xf9, 0xf6, 0x8f, + 0xf6, 0x66, 0xf8, 0x3b, 0x1a, 0x11, 0xd7, 0x49, 0x45, 0x40, 0x04, 0xd1, + 0x97, 0x2b, 0x99, 0x55, 0x0e, 0xb2, 0xe6, 0xa9, 0x49, 0x75, 0x2e, 0x0d, + 0xfa, 0x5d, 0xc1, 0x9a, 0x88, 0xaf, 0xb4, 0x29, 0xb0, 0x1e, 0xf2, 0x82, + 0x68, 0x83, 0x5d, 0xe5, 0xcb, 0xeb, 0x2e, 0x77, 0x4c, 0xb7, 0x97, 0x34, + 0x98, 0x4c, 0x3d, 0x4b, 0x97, 0xbc, 0x36, 0x5f, 0xa1, 0x8e, 0x51, 0x73, + 0x00, 0xd9, 0x89, 0x97, 0x7c, 0x0d, 0xd8, 0x74, 0xac, 0x4a, 0xf0, 0xef, + 0xe6, 0xff, 0x00, 0x88, 0x25, 0x00, 0x70, 0x12, 0xed, 0xa3, 0x46, 0x95, + 0x1b, 0x2a, 0x88, 0xa3, 0x18, 0x5f, 0x9e, 0xd1, 0x47, 0x78, 0xd1, 0xff, + 0x00, 0x91, 0xe8, 0x95, 0x8c, 0xe2, 0x1b, 0xa2, 0x4d, 0x1c, 0x43, 0x4e, + 0x33, 0x0b, 0xcc, 0x30, 0xd2, 0x58, 0x87, 0x09, 0xda, 0x56, 0x60, 0x42, + 0x12, 0xa1, 0xac, 0x31, 0x02, 0x10, 0xc4, 0x21, 0x2e, 0x5d, 0x41, 0x1a, + 0x36, 0x8a, 0x08, 0xba, 0xc0, 0xca, 0xe1, 0xea, 0x7a, 0x74, 0x9c, 0xf2, + 0x8a, 0x94, 0x46, 0x5b, 0xcb, 0xc3, 0x7c, 0x23, 0x5c, 0xc6, 0x67, 0xdf, + 0xd0, 0xb9, 0xd2, 0x61, 0xb4, 0xed, 0xcf, 0xaa, 0xf3, 0x8e, 0x1d, 0x22, + 0xae, 0xf8, 0x8d, 0x56, 0x60, 0x37, 0x2b, 0x95, 0xb3, 0x2e, 0xaa, 0x74, + 0x6d, 0x1c, 0xc5, 0x6c, 0x34, 0x95, 0xe9, 0x70, 0x2e, 0x61, 0x16, 0x2e, + 0x22, 0xd4, 0x25, 0x96, 0x46, 0x2f, 0xaf, 0xa2, 0xb7, 0x98, 0x09, 0x62, + 0x44, 0xb2, 0xab, 0xd1, 0x15, 0x93, 0x83, 0xf3, 0xc0, 0x84, 0x12, 0xf5, + 0x3d, 0x8c, 0xcb, 0x4d, 0x8f, 0xff, 0x00, 0x53, 0xe2, 0x54, 0x0b, 0xe2, + 0xab, 0x7e, 0x51, 0x2d, 0xec, 0xb5, 0x56, 0xb2, 0xed, 0xe2, 0xb5, 0x72, + 0xad, 0xa1, 0x09, 0x51, 0x48, 0xb1, 0x69, 0xf4, 0x16, 0x97, 0x72, 0xe5, + 0xd4, 0x19, 0xaa, 0x0e, 0x22, 0xf6, 0x83, 0x2e, 0xa3, 0x52, 0xd7, 0xc6, + 0x71, 0x2b, 0x0c, 0x4a, 0x10, 0x9a, 0x17, 0x16, 0x5d, 0x31, 0xca, 0x2e, + 0x65, 0xd7, 0x58, 0xb0, 0x8b, 0xbc, 0xb1, 0xaf, 0xa3, 0xe7, 0xe8, 0xc9, + 0x8c, 0x8e, 0xf5, 0xb9, 0xae, 0xb6, 0x97, 0x7b, 0xca, 0x35, 0x14, 0x14, + 0x96, 0x4a, 0xee, 0xa7, 0x3f, 0x23, 0xf4, 0x9b, 0xc5, 0xc9, 0x7c, 0x3c, + 0x31, 0xde, 0x50, 0xfa, 0x1c, 0x22, 0x54, 0x62, 0x9e, 0x98, 0x88, 0x60, + 0x5e, 0x12, 0x19, 0x69, 0xe8, 0x12, 0x5c, 0x5c, 0xe8, 0x54, 0xc0, 0xeb, + 0x28, 0x74, 0xdd, 0x8c, 0x96, 0xc3, 0x07, 0xa1, 0x08, 0x42, 0x10, 0xe9, + 0x09, 0xa4, 0x25, 0xe2, 0x0f, 0x58, 0x84, 0xb7, 0x5a, 0x07, 0x70, 0xb6, + 0x5f, 0x49, 0xe8, 0x91, 0xf7, 0x08, 0x75, 0xa0, 0x6d, 0x38, 0x7e, 0xdf, + 0x4e, 0xa8, 0xea, 0x53, 0xd1, 0x6b, 0x36, 0xcd, 0x5c, 0x7a, 0x1a, 0x61, + 0x28, 0x53, 0xd6, 0x2e, 0x20, 0x0c, 0x3b, 0x5f, 0xef, 0x00, 0xbd, 0xe8, + 0xb6, 0x32, 0x9c, 0xfa, 0x7b, 0xa6, 0x7a, 0x32, 0xdc, 0xc7, 0xc6, 0x79, + 0xfa, 0x16, 0x2d, 0xc0, 0x27, 0x0c, 0x36, 0x78, 0x13, 0x2d, 0xee, 0x4d, + 0x59, 0x4e, 0x32, 0x80, 0x6f, 0x75, 0x8d, 0x49, 0x77, 0x10, 0xd1, 0x87, + 0xb3, 0x1b, 0x33, 0x06, 0xe3, 0xab, 0x88, 0xf5, 0x4c, 0x5c, 0x47, 0xae, + 0x34, 0x8d, 0x6f, 0x33, 0x40, 0x32, 0xbb, 0x10, 0x62, 0x8e, 0xac, 0x5f, + 0x08, 0xbd, 0x52, 0x98, 0xab, 0xe3, 0x52, 0x6d, 0x61, 0xa2, 0xfe, 0x11, + 0x02, 0xa6, 0x9c, 0xf3, 0x0f, 0x19, 0x58, 0x02, 0x50, 0x8a, 0x1a, 0xc4, + 0x41, 0x37, 0x89, 0x99, 0x98, 0x99, 0x4a, 0x3e, 0xa5, 0xc1, 0x97, 0x50, + 0x81, 0xf4, 0x05, 0xd0, 0xb7, 0xa4, 0x2e, 0xea, 0xb2, 0x7e, 0xf2, 0x80, + 0x94, 0x09, 0x8f, 0x88, 0x3e, 0x8b, 0x97, 0xc7, 0xa1, 0x86, 0xd5, 0x0d, + 0x26, 0xa6, 0xb3, 0x68, 0x5c, 0xef, 0x16, 0x38, 0x84, 0x5e, 0xb1, 0xc3, + 0x58, 0xd2, 0x53, 0x88, 0xf2, 0x44, 0xf3, 0x2a, 0x33, 0x36, 0x9e, 0xa6, + 0x7b, 0xe6, 0xf2, 0xdc, 0x17, 0xd5, 0x2f, 0x6b, 0xf0, 0x65, 0x2b, 0xa3, + 0x06, 0xdc, 0x89, 0xad, 0x71, 0x14, 0x30, 0xc4, 0xbb, 0xca, 0x6e, 0xc4, + 0xe7, 0x27, 0xa5, 0x04, 0x2d, 0xa3, 0x31, 0x04, 0xa5, 0xf3, 0x04, 0xbd, + 0x25, 0x79, 0xc4, 0x41, 0x2b, 0x31, 0x33, 0xb0, 0xb4, 0x07, 0x5e, 0x91, + 0xf8, 0x9a, 0xfa, 0x10, 0x65, 0xc1, 0x83, 0x06, 0x10, 0x97, 0x06, 0xd9, + 0x21, 0xb4, 0x8a, 0x6d, 0xd6, 0x5c, 0x99, 0x4b, 0x75, 0x6b, 0x15, 0x59, + 0x46, 0x16, 0x46, 0xc6, 0x51, 0xe5, 0x31, 0x29, 0x01, 0x2e, 0xd8, 0x4e, + 0x86, 0xfd, 0x14, 0xe7, 0xd3, 0x84, 0x6b, 0x1e, 0x48, 0x83, 0xa3, 0xcc, + 0x32, 0x95, 0x66, 0xdf, 0x30, 0x12, 0xa4, 0xc1, 0xd4, 0xb4, 0xef, 0x0c, + 0x6b, 0x54, 0x32, 0x19, 0x28, 0xe3, 0x7d, 0x18, 0x0d, 0xb7, 0xa1, 0xb1, + 0xef, 0x2d, 0x0c, 0x90, 0xc6, 0x5b, 0xa4, 0xc3, 0x59, 0x83, 0x2e, 0xf7, + 0x9a, 0xa5, 0xcb, 0xc6, 0xb2, 0xc2, 0x39, 0x45, 0xe6, 0x39, 0x84, 0x7a, + 0xc1, 0xe2, 0x03, 0xd6, 0x1e, 0xda, 0x7a, 0x37, 0x32, 0x9e, 0x66, 0x21, + 0x27, 0x01, 0x29, 0x74, 0x1f, 0xce, 0x60, 0xba, 0x93, 0xbb, 0xf9, 0xb8, + 0xe6, 0xbb, 0x3b, 0x61, 0xff, 0x00, 0x95, 0x84, 0x3d, 0xa1, 0x7f, 0x12, + 0xa9, 0xdb, 0x28, 0xbc, 0xc6, 0xd0, 0x50, 0x03, 0xfe, 0x07, 0x1e, 0x26, + 0x06, 0xc6, 0xa5, 0x7d, 0xc8, 0x98, 0x23, 0xc8, 0xc0, 0x56, 0x3d, 0x6f, + 0xe6, 0x63, 0xc5, 0xd3, 0xd2, 0xbf, 0x98, 0x20, 0x0e, 0xe6, 0x3f, 0x88, + 0x3a, 0x10, 0xf2, 0xa7, 0xe2, 0x15, 0xe4, 0xc1, 0xf9, 0x94, 0x92, 0xcb, + 0xb0, 0x67, 0xd4, 0xcb, 0x40, 0x59, 0x72, 0x74, 0x1c, 0x3e, 0xf1, 0x83, + 0x11, 0xa7, 0x01, 0xef, 0x35, 0x4b, 0x6e, 0xa8, 0x73, 0xe4, 0x23, 0x81, + 0xe5, 0x02, 0x12, 0x27, 0xa0, 0x17, 0x58, 0x15, 0x0e, 0xd2, 0xd0, 0x97, + 0x18, 0x4b, 0x8a, 0x97, 0x1c, 0x98, 0x25, 0x2a, 0x3a, 0xed, 0xa5, 0x15, + 0x29, 0x38, 0x26, 0x35, 0xf7, 0x2e, 0x07, 0xfc, 0x8d, 0xcc, 0x45, 0x97, + 0x6c, 0x7d, 0x91, 0x71, 0x2f, 0x2d, 0x4b, 0x2a, 0xf8, 0x85, 0x12, 0xf9, + 0x2e, 0x5e, 0x75, 0x97, 0x9b, 0xf4, 0xd0, 0x94, 0xc4, 0xf7, 0x89, 0x7d, + 0x65, 0xba, 0x44, 0xa8, 0x87, 0xfb, 0x2a, 0x8b, 0x8a, 0xb5, 0x59, 0x7a, + 0x2b, 0x0d, 0x2c, 0x23, 0x1b, 0x45, 0x06, 0x8f, 0x8f, 0xba, 0x19, 0xd0, + 0xd5, 0x29, 0xf9, 0xd3, 0xe2, 0x59, 0xa8, 0xbf, 0xe5, 0x44, 0xb4, 0x00, + 0xd4, 0xfc, 0x1b, 0x7c, 0xcb, 0x91, 0x0d, 0xb0, 0xcf, 0x64, 0xc1, 0x53, + 0xee, 0x60, 0x3b, 0x24, 0xba, 0xcf, 0x41, 0x61, 0x1c, 0x4e, 0xcd, 0x58, + 0xee, 0x6e, 0x6e, 0xce, 0x68, 0x4e, 0x2c, 0xc0, 0x06, 0xeb, 0xac, 0xcf, + 0xa9, 0xa0, 0x37, 0xed, 0x32, 0xf5, 0x0c, 0xa0, 0xc1, 0xb8, 0x40, 0xc0, + 0x4d, 0x13, 0x03, 0x89, 0x72, 0x24, 0xff, 0x00, 0x88, 0x69, 0x2c, 0x4e, + 0x1e, 0xbf, 0xb3, 0x43, 0xe6, 0x2e, 0x55, 0xdd, 0xe9, 0xdb, 0x88, 0xc5, + 0x86, 0x84, 0xd5, 0xeb, 0x00, 0xd1, 0x83, 0x0b, 0x35, 0x9a, 0xb8, 0x4d, + 0xa5, 0x71, 0x72, 0x82, 0x83, 0xd7, 0x0f, 0xb9, 0xfa, 0x95, 0x34, 0x4e, + 0x8d, 0x90, 0x0f, 0xc0, 0x40, 0x6c, 0x0f, 0x23, 0x06, 0xd0, 0x57, 0x06, + 0x66, 0x17, 0xc1, 0x91, 0x5b, 0x1b, 0x05, 0xbe, 0x94, 0x77, 0x88, 0xb5, + 0xac, 0x46, 0xfc, 0xd9, 0x3e, 0x81, 0x98, 0x41, 0x5d, 0x0a, 0x4f, 0xf2, + 0x8a, 0x68, 0xbd, 0x47, 0xe6, 0x15, 0x5d, 0x09, 0xb7, 0xe6, 0x64, 0x3a, + 0xd0, 0x3f, 0x15, 0x03, 0x34, 0xb4, 0xb8, 0x1d, 0x7a, 0xc1, 0x8e, 0xa1, + 0x7a, 0x3c, 0x35, 0x0e, 0x2b, 0x3c, 0x3f, 0xca, 0x1f, 0x64, 0xf2, 0x37, + 0x07, 0x1e, 0x33, 0x17, 0xd0, 0xa6, 0x63, 0x87, 0xa3, 0x44, 0x58, 0xbe, + 0x22, 0xcc, 0xa0, 0x17, 0x88, 0x07, 0x62, 0x51, 0x03, 0x58, 0x87, 0x2f, + 0xbc, 0xf2, 0xa8, 0xa8, 0x95, 0x1a, 0x5c, 0x1f, 0x98, 0xc5, 0x24, 0xf3, + 0x2b, 0xd0, 0x2d, 0x8b, 0x7b, 0xeb, 0x19, 0x01, 0xc9, 0x07, 0xb8, 0xc4, + 0x13, 0x7c, 0x82, 0x49, 0xf2, 0xc9, 0x54, 0x19, 0xdd, 0xf8, 0x04, 0x65, + 0x2d, 0xc6, 0xf4, 0x3f, 0x29, 0x0d, 0xd4, 0xf1, 0x3e, 0x53, 0xe2, 0x3f, + 0xdf, 0x93, 0x7a, 0x7e, 0xa3, 0xe4, 0x94, 0xa3, 0x6c, 0xff, 0x00, 0xb2, + 0x2c, 0x29, 0x76, 0xff, 0x00, 0x68, 0x28, 0x5c, 0xc2, 0x2f, 0xc1, 0x8e, + 0x95, 0x14, 0xee, 0x2f, 0x68, 0xcd, 0x52, 0xf0, 0xe1, 0x83, 0xb2, 0x09, + 0xb4, 0x11, 0xd3, 0xd0, 0x45, 0x65, 0x9a, 0x4e, 0x93, 0x10, 0x4c, 0x02, + 0xad, 0x89, 0x97, 0xef, 0x3f, 0x58, 0xd1, 0xe4, 0xb4, 0xf6, 0x84, 0x4a, + 0x8a, 0xd0, 0xac, 0x4a, 0x2a, 0x61, 0x07, 0xc4, 0x6b, 0x53, 0x0e, 0xbd, + 0xa0, 0x5e, 0xfe, 0x8f, 0xbf, 0xa3, 0x09, 0x72, 0xfd, 0xfd, 0x0b, 0x1d, + 0x65, 0xde, 0x90, 0x5f, 0x10, 0x9a, 0xc5, 0xe6, 0x5c, 0xbc, 0xcc, 0x44, + 0x3a, 0xc4, 0x3b, 0x41, 0x6f, 0x19, 0xe2, 0x0b, 0x78, 0x85, 0xb2, 0x0f, + 0x24, 0x06, 0xe5, 0x04, 0x2c, 0xc3, 0xa2, 0xa1, 0x81, 0xf6, 0xc2, 0x94, + 0x7c, 0x6f, 0x38, 0x70, 0x56, 0x0a, 0x76, 0x97, 0x81, 0xc5, 0x04, 0x47, + 0xf0, 0x54, 0x0b, 0x63, 0x3c, 0x18, 0x80, 0xa4, 0x57, 0x5b, 0xcf, 0xe2, + 0x19, 0xd8, 0x77, 0x81, 0x16, 0xf8, 0xab, 0x33, 0x60, 0xcd, 0xcd, 0xfd, + 0x91, 0x08, 0xc7, 0xfb, 0x0b, 0x58, 0x5c, 0x93, 0x84, 0xfe, 0x90, 0x81, + 0xde, 0x7d, 0x8d, 0xc2, 0x16, 0xcd, 0xc2, 0x3e, 0x88, 0xe4, 0x27, 0x22, + 0x17, 0x08, 0x97, 0xdc, 0x9e, 0xe3, 0xfa, 0x9e, 0x43, 0x14, 0x48, 0xb7, + 0x33, 0xd1, 0x31, 0xa5, 0xc8, 0x76, 0x8e, 0x40, 0x03, 0x71, 0xbf, 0x04, + 0x04, 0x11, 0x6d, 0x77, 0x5d, 0x29, 0x9c, 0xee, 0x6a, 0xe3, 0xc8, 0xdf, + 0xb4, 0xb6, 0xb0, 0x3a, 0x27, 0xcd, 0x4b, 0x40, 0xee, 0x4b, 0x7b, 0x15, + 0x2c, 0xcb, 0x7d, 0xff, 0x00, 0x80, 0x96, 0xe7, 0xd3, 0x28, 0xea, 0x81, + 0x4d, 0x2e, 0x25, 0x13, 0xae, 0x8a, 0x21, 0x58, 0x30, 0x92, 0xb1, 0xcf, + 0x98, 0xcf, 0x74, 0x52, 0xc4, 0x76, 0x65, 0xb8, 0x57, 0x00, 0xa1, 0x38, + 0x15, 0x4a, 0x2f, 0x04, 0xfe, 0xa2, 0xd4, 0x15, 0x00, 0x8f, 0xcc, 0x62, + 0x54, 0x68, 0xde, 0x3f, 0x4c, 0x4f, 0x3e, 0x9b, 0x1a, 0x35, 0x16, 0xea, + 0xcb, 0xf2, 0xcd, 0x88, 0xf7, 0x22, 0xc6, 0x2d, 0x72, 0xa3, 0xb6, 0xc7, + 0x7a, 0xfa, 0x80, 0x64, 0x4e, 0x5f, 0xca, 0x1a, 0x6c, 0x9a, 0xb4, 0x91, + 0x80, 0xeb, 0x15, 0xfd, 0x21, 0x24, 0xbf, 0xe6, 0xb8, 0x85, 0xd8, 0x34, + 0x6c, 0x25, 0xbb, 0xb1, 0xfe, 0x13, 0x09, 0x79, 0x8b, 0xcb, 0x88, 0x8d, + 0x98, 0xb5, 0x18, 0xce, 0xa8, 0x83, 0x59, 0x79, 0x4b, 0xbb, 0x01, 0xb1, + 0xfa, 0x98, 0x43, 0xea, 0x83, 0xb3, 0xfc, 0x66, 0x84, 0x43, 0x2b, 0xfc, + 0x32, 0x41, 0xe2, 0x7c, 0x3f, 0x62, 0x31, 0x28, 0xed, 0xbe, 0x96, 0x20, + 0x51, 0x5d, 0x0c, 0xaf, 0xc4, 0xbc, 0x58, 0x37, 0xfa, 0x56, 0xe3, 0x0e, + 0x48, 0xab, 0xe6, 0x68, 0x3d, 0x72, 0x69, 0x38, 0x14, 0xec, 0xc2, 0x75, + 0x57, 0xbe, 0x60, 0xff, 0x00, 0x04, 0xb1, 0x02, 0x37, 0xcf, 0xee, 0x33, + 0xe9, 0xa1, 0x5f, 0xb8, 0xd0, 0x01, 0xcb, 0xa4, 0xac, 0x6c, 0x26, 0xe4, + 0xad, 0x0f, 0xcc, 0xf7, 0x95, 0xaa, 0xaf, 0x84, 0x62, 0x2a, 0x8e, 0xe4, + 0xec, 0x84, 0x24, 0xc1, 0xab, 0x2b, 0xce, 0x71, 0x57, 0xdc, 0x14, 0x05, + 0xb8, 0x2b, 0xe2, 0x12, 0x05, 0xd8, 0x4a, 0x6b, 0x10, 0x87, 0x4c, 0xcd, + 0x38, 0x12, 0x0a, 0x65, 0x83, 0xac, 0xb3, 0x9b, 0x8d, 0x38, 0xa8, 0xd9, + 0x97, 0xd6, 0x5e, 0x75, 0xf4, 0x5e, 0x7a, 0xc1, 0xa7, 0x26, 0x7d, 0x16, + 0xff, 0x00, 0xb0, 0x57, 0x78, 0x69, 0x35, 0x7a, 0x74, 0x9c, 0xca, 0x6b, + 0x49, 0xa2, 0xfe, 0x66, 0x60, 0xe3, 0xf1, 0x0d, 0x63, 0x54, 0x5f, 0xaa, + 0xf1, 0x2d, 0xbd, 0x1e, 0x6e, 0x09, 0xa1, 0x60, 0xf6, 0x0e, 0x4c, 0x08, + 0x2b, 0x74, 0xee, 0xfd, 0x13, 0x3c, 0x4e, 0xcb, 0xf8, 0x23, 0x8d, 0xa0, + 0xd2, 0xd7, 0xb3, 0x48, 0x6a, 0x0a, 0xce, 0xa0, 0xf3, 0x4c, 0x16, 0x78, + 0xe7, 0xe4, 0x40, 0x0b, 0x2a, 0xe3, 0xf4, 0xa7, 0xd0, 0x09, 0x1b, 0x15, + 0xd5, 0x5f, 0xa2, 0x3f, 0xfb, 0x07, 0xa4, 0xf9, 0x44, 0xdf, 0xb8, 0xfe, + 0x24, 0xdd, 0x6e, 0x1c, 0xdd, 0x1d, 0xbf, 0x04, 0x23, 0xb7, 0x6f, 0xfd, + 0x17, 0x1d, 0x53, 0xee, 0x5f, 0xdc, 0x37, 0xf6, 0x90, 0x8b, 0x6a, 0xde, + 0x61, 0x2c, 0x83, 0xba, 0xa6, 0x34, 0x62, 0x70, 0x94, 0x06, 0xb6, 0xc5, + 0x36, 0x85, 0x32, 0xab, 0xbc, 0xd6, 0x0a, 0xf4, 0x9b, 0x75, 0xef, 0x34, + 0x98, 0xed, 0x2b, 0xb4, 0xe9, 0x2a, 0x7a, 0x27, 0xcd, 0xc6, 0xfd, 0xc5, + 0x61, 0x00, 0x66, 0x08, 0x41, 0x80, 0x10, 0x06, 0xd3, 0x1d, 0xa5, 0x57, + 0x82, 0x61, 0x76, 0x65, 0x29, 0x9b, 0x40, 0x1a, 0x86, 0x09, 0x0c, 0x66, + 0x73, 0x08, 0xb6, 0x1d, 0x32, 0xf0, 0xac, 0xb8, 0x6f, 0x34, 0x43, 0xab, + 0x32, 0x93, 0xa5, 0x87, 0x54, 0x4c, 0x45, 0xc4, 0x44, 0x44, 0x6d, 0x2a, + 0x33, 0x1c, 0x92, 0xb9, 0x8d, 0x27, 0x44, 0xa1, 0xfd, 0xc0, 0x6c, 0x7a, + 0xa0, 0xf8, 0x95, 0x63, 0x7d, 0x17, 0xdc, 0xa8, 0x30, 0x9f, 0x82, 0x7d, + 0x9a, 0x94, 0xa3, 0x9e, 0x57, 0xee, 0xe2, 0x5b, 0xf9, 0xd0, 0x03, 0xe2, + 0x03, 0x00, 0x1b, 0xba, 0x47, 0x6a, 0xdd, 0xb2, 0xf8, 0x80, 0x47, 0x63, + 0x76, 0x7c, 0xc3, 0xad, 0x0f, 0x6f, 0xc1, 0x19, 0xb5, 0xf6, 0x60, 0x8e, + 0xd0, 0x7b, 0x2c, 0xfd, 0xc1, 0x28, 0xe5, 0x12, 0xf9, 0x81, 0x73, 0x09, + 0xcb, 0x32, 0xb4, 0x0e, 0x0d, 0x9d, 0xd8, 0x9e, 0xc0, 0xb6, 0xc0, 0x21, + 0x29, 0x17, 0xa5, 0xa2, 0x9c, 0x7d, 0x66, 0x9c, 0x35, 0x06, 0x37, 0x29, + 0x81, 0x4e, 0xeb, 0x42, 0x8c, 0x36, 0x83, 0x45, 0x43, 0xc3, 0x19, 0xbd, + 0xf4, 0x09, 0xe6, 0xa0, 0x08, 0xb5, 0xb5, 0x35, 0x05, 0xc8, 0xf4, 0xb8, + 0x0e, 0xaf, 0xbc, 0xa2, 0xe8, 0xf6, 0xb8, 0x53, 0x34, 0x4e, 0xb0, 0x01, + 0xc7, 0xd2, 0xe3, 0xf7, 0x90, 0x6c, 0xdc, 0xa1, 0x95, 0xf3, 0x10, 0xd4, + 0x18, 0x1a, 0xa4, 0x8c, 0x17, 0x51, 0x88, 0x9d, 0xa3, 0x52, 0x5c, 0xba, + 0x66, 0x52, 0xe2, 0xc1, 0xb8, 0x3b, 0x2f, 0x22, 0xa8, 0xa5, 0x83, 0xc2, + 0x93, 0xd9, 0x9a, 0xd9, 0x0d, 0xbf, 0x1a, 0xa7, 0xce, 0x4e, 0xbe, 0xd9, + 0x59, 0xe1, 0xbf, 0xc0, 0x95, 0xdf, 0xb4, 0x7d, 0xd0, 0x63, 0xdd, 0x07, + 0xe9, 0x71, 0x66, 0xb7, 0xcb, 0xf1, 0x53, 0xe0, 0xb0, 0x1f, 0x6c, 0x7f, + 0xb1, 0xfd, 0xa1, 0x6e, 0x1b, 0xc4, 0x02, 0x9f, 0xd3, 0xe2, 0x5b, 0xa7, + 0xcb, 0xfa, 0xe7, 0xe6, 0x08, 0x9b, 0xe9, 0xe3, 0xf7, 0x8b, 0xdd, 0xf1, + 0xfb, 0x44, 0x5d, 0x5b, 0xf8, 0xe6, 0x03, 0x92, 0xbe, 0xdf, 0xdc, 0x00, + 0x1a, 0x7c, 0xfe, 0xe9, 0xac, 0xb5, 0xe3, 0xfe, 0xd1, 0x1f, 0x77, 0xfd, + 0x23, 0x32, 0x7b, 0x5a, 0x57, 0xdb, 0x0c, 0x0c, 0xdd, 0x21, 0xf6, 0x7f, + 0x39, 0x99, 0x1b, 0xa5, 0x07, 0x7d, 0x1d, 0x22, 0xd4, 0x29, 0xe8, 0x9e, + 0xe4, 0xaa, 0x14, 0x76, 0xc9, 0xed, 0x70, 0x21, 0x39, 0xe0, 0x7e, 0xa1, + 0xf5, 0x56, 0x22, 0x2e, 0xd0, 0x5b, 0x5e, 0xc4, 0x38, 0x40, 0x60, 0x3b, + 0x7d, 0xa2, 0xcb, 0xab, 0x6e, 0x3d, 0x84, 0xbc, 0xda, 0x78, 0x83, 0xb8, + 0x78, 0x88, 0x2a, 0x28, 0xef, 0x14, 0xa9, 0x8d, 0x12, 0xf5, 0xa8, 0xed, + 0x14, 0x64, 0x0f, 0x64, 0x77, 0x7d, 0x84, 0xa7, 0x0f, 0xb3, 0x0f, 0xf4, + 0x20, 0x76, 0x23, 0xa0, 0x5b, 0x29, 0x41, 0x7f, 0x86, 0x95, 0x58, 0x74, + 0x5c, 0x2a, 0x3d, 0xd8, 0xff, 0x00, 0x51, 0xe0, 0x11, 0xc3, 0x7c, 0x66, + 0x1c, 0x9f, 0xc1, 0x37, 0x48, 0xd3, 0x83, 0xc8, 0x8f, 0xcb, 0x2c, 0x8c, + 0xde, 0x11, 0x99, 0x0e, 0xcc, 0x26, 0xb4, 0x78, 0xdc, 0x15, 0x56, 0x7c, + 0xc4, 0xa5, 0x7a, 0x8d, 0x13, 0xe4, 0x9b, 0x2d, 0xe4, 0x43, 0xe2, 0x05, + 0xda, 0x3a, 0x56, 0x04, 0x6f, 0x1d, 0x00, 0xbf, 0x71, 0x5c, 0x8e, 0x98, + 0x87, 0x12, 0x0b, 0x83, 0xc4, 0x08, 0x7a, 0x00, 0xef, 0x3b, 0xa3, 0xc0, + 0xc7, 0x08, 0xcb, 0xd1, 0x0d, 0xb0, 0x7b, 0xb2, 0xeb, 0x67, 0x3f, 0xca, + 0xf8, 0x97, 0x13, 0x37, 0x20, 0xf0, 0x69, 0x1d, 0x08, 0xad, 0x56, 0xcb, + 0x0e, 0x00, 0x3d, 0x25, 0x66, 0x67, 0xa3, 0xba, 0xa5, 0x79, 0xf4, 0xf7, + 0xc0, 0x71, 0x11, 0x33, 0x84, 0x39, 0xeb, 0x33, 0x3d, 0x2c, 0xe1, 0x79, + 0x82, 0x46, 0x88, 0x1e, 0x63, 0xa5, 0xc4, 0x5b, 0x1d, 0x62, 0x9b, 0xb0, + 0x1a, 0x81, 0xee, 0x40, 0xd9, 0x0c, 0x75, 0x12, 0xbe, 0x08, 0x17, 0x1e, + 0x88, 0x5f, 0x0c, 0xb5, 0xa2, 0x53, 0x62, 0xe0, 0x5b, 0x6b, 0x77, 0x29, + 0x0f, 0x0a, 0x7d, 0xe0, 0x9b, 0x77, 0x8b, 0xa2, 0x77, 0x32, 0x92, 0xa0, + 0x96, 0x34, 0xd9, 0x43, 0x1a, 0x0f, 0xbb, 0xde, 0x26, 0xbd, 0x38, 0x62, + 0x2c, 0x27, 0x79, 0x57, 0x2f, 0xe6, 0x0f, 0x0a, 0xfd, 0x40, 0xa0, 0x13, + 0x29, 0x70, 0xb1, 0x29, 0x73, 0x32, 0x08, 0xd3, 0x35, 0x1a, 0x25, 0x09, + 0xd6, 0x3c, 0xa0, 0x25, 0x8e, 0x88, 0xc0, 0x2b, 0xd9, 0x00, 0xb0, 0x7b, + 0xa6, 0x53, 0x81, 0xf1, 0x72, 0x9e, 0x91, 0x05, 0xe9, 0x0e, 0x85, 0x4a, + 0x18, 0xee, 0x99, 0x89, 0x29, 0x7b, 0xc0, 0x70, 0x8e, 0xe9, 0x55, 0xd4, + 0xd8, 0x11, 0x07, 0x8a, 0xdc, 0x35, 0x99, 0xbb, 0xa5, 0xc6, 0xa1, 0xe8, + 0x0f, 0xb9, 0x68, 0xc5, 0xc5, 0x18, 0x95, 0xfb, 0x22, 0x03, 0xf7, 0x27, + 0xd4, 0x69, 0xa6, 0xf7, 0x60, 0x4d, 0xd8, 0xea, 0x3f, 0x98, 0x4e, 0x4f, + 0x87, 0xee, 0x6b, 0x88, 0xec, 0x3e, 0xa2, 0x0d, 0x27, 0x71, 0x15, 0xae, + 0xb0, 0x7e, 0x93, 0x06, 0x3d, 0x06, 0x7e, 0xe0, 0x63, 0x64, 0x5a, 0x05, + 0xae, 0xd0, 0xa1, 0xb1, 0xdd, 0x5f, 0xb0, 0xfd, 0xc0, 0xc3, 0x7c, 0x10, + 0xfe, 0xf3, 0x32, 0x49, 0x0e, 0xb3, 0xf1, 0x15, 0xc5, 0xf5, 0xbe, 0x3b, + 0xf1, 0xe6, 0x68, 0x3e, 0x64, 0xfd, 0x2c, 0x04, 0xc8, 0xf7, 0x92, 0x0c, + 0x17, 0xb5, 0xe0, 0xb7, 0x68, 0x72, 0x3f, 0x31, 0x1a, 0x04, 0x77, 0xf0, + 0x21, 0x41, 0xee, 0xfe, 0x51, 0xf8, 0xd1, 0x5b, 0x65, 0xf8, 0x81, 0x7b, + 0x61, 0x26, 0x3b, 0x0e, 0xcb, 0x50, 0xc8, 0x47, 0x05, 0x13, 0xdd, 0xc4, + 0xd3, 0x25, 0xba, 0x6f, 0xca, 0x6b, 0xb4, 0x72, 0xd7, 0xc9, 0x03, 0xa0, + 0x9e, 0x2c, 0xfa, 0x99, 0xab, 0xe6, 0xf9, 0x8c, 0x31, 0x67, 0x12, 0x55, + 0xd4, 0xc0, 0xdd, 0xf9, 0x63, 0x1b, 0xf6, 0x83, 0x13, 0x05, 0xbe, 0xbf, + 0xa2, 0x0e, 0x50, 0x76, 0x7e, 0x51, 0x99, 0x3f, 0xdd, 0x88, 0x82, 0x37, + 0x34, 0x98, 0xc4, 0x7c, 0x90, 0xf5, 0x84, 0x76, 0x1a, 0x96, 0x30, 0x6b, + 0xa3, 0x05, 0xba, 0xe1, 0xbc, 0xdd, 0x6d, 0x72, 0x8d, 0xb5, 0x50, 0xb7, + 0x23, 0x1b, 0x00, 0xdb, 0xf7, 0x2a, 0x9a, 0xd5, 0x3b, 0x5b, 0x1c, 0xdf, + 0x86, 0xbf, 0x71, 0x2c, 0x5d, 0xe2, 0x02, 0x76, 0xeb, 0x35, 0x3b, 0xb3, + 0x11, 0x2e, 0x52, 0xf5, 0x62, 0xbf, 0xf2, 0x61, 0xa7, 0x47, 0x6d, 0xa5, + 0x88, 0x2e, 0x2f, 0x11, 0xa0, 0x2d, 0x72, 0x64, 0x95, 0xc2, 0x39, 0x3f, + 0x48, 0x59, 0x76, 0x16, 0x98, 0xb5, 0x79, 0x42, 0x7b, 0x38, 0x83, 0xd1, + 0xed, 0x2d, 0xee, 0x43, 0x38, 0x77, 0x8a, 0xc5, 0x77, 0x53, 0xf5, 0x16, + 0x64, 0xf6, 0x3f, 0xe2, 0x10, 0x9d, 0xf0, 0x22, 0x48, 0x07, 0xc0, 0xfc, + 0x54, 0x54, 0x26, 0xd5, 0xb1, 0x86, 0xa2, 0x07, 0x95, 0x86, 0xd5, 0x1b, + 0x1c, 0x76, 0x85, 0x50, 0xb4, 0x27, 0x19, 0xab, 0xff, 0x00, 0x2e, 0xcd, + 0x82, 0x59, 0x89, 0xe6, 0x52, 0xf5, 0x27, 0xba, 0x39, 0xf1, 0x13, 0xcc, + 0xd7, 0x84, 0xb6, 0xc7, 0xde, 0x1c, 0x4d, 0x7d, 0xe2, 0xeb, 0xf9, 0x40, + 0x2d, 0xac, 0x1b, 0x8c, 0xe8, 0x9f, 0x13, 0x42, 0xf6, 0x26, 0xf1, 0x9a, + 0x4b, 0x76, 0x80, 0xf5, 0xfb, 0xd2, 0x67, 0xfa, 0xf9, 0x1f, 0x99, 0xf1, + 0xb8, 0xdf, 0xd1, 0x07, 0xb6, 0x7c, 0x57, 0xf7, 0x31, 0x6f, 0xf2, 0xaf, + 0xea, 0x55, 0xa2, 0xea, 0x00, 0x63, 0x2c, 0x0d, 0x5f, 0x71, 0xd2, 0x03, + 0xfe, 0x66, 0x66, 0xcf, 0xcc, 0xe3, 0x1e, 0x66, 0x3f, 0x24, 0x75, 0x55, + 0xe2, 0x5f, 0x06, 0x63, 0xd4, 0x82, 0x0a, 0x55, 0x20, 0xc2, 0x0a, 0xc2, + 0xe2, 0x5a, 0x7b, 0x4b, 0xc0, 0x7b, 0xc7, 0x24, 0x4b, 0xde, 0x28, 0xfb, + 0x63, 0x28, 0x1f, 0x95, 0x8d, 0x02, 0xf1, 0x4f, 0x62, 0x65, 0xf9, 0xaa, + 0xec, 0xc5, 0x3c, 0x8d, 0xf2, 0x11, 0xa7, 0x45, 0x14, 0x35, 0x1e, 0xc8, + 0xeb, 0xaf, 0x74, 0x94, 0x98, 0x6e, 0xac, 0x57, 0x50, 0x7b, 0xc0, 0xf2, + 0x3b, 0xc3, 0x60, 0xe9, 0xb8, 0x7c, 0x41, 0x02, 0xa7, 0x76, 0x99, 0xbc, + 0x96, 0xb4, 0x80, 0xf7, 0x0f, 0x89, 0xd3, 0x40, 0x34, 0xf0, 0x42, 0x17, + 0xf2, 0xfc, 0xcb, 0x58, 0x1f, 0xce, 0xf2, 0xdc, 0x1f, 0x88, 0x37, 0x2b, + 0x3a, 0xaf, 0xea, 0x63, 0xcd, 0x38, 0x06, 0x61, 0xad, 0xfb, 0x47, 0xe9, + 0xba, 0xc8, 0x8d, 0xbe, 0xea, 0x7e, 0x18, 0xb8, 0x9e, 0x4f, 0xf1, 0x72, + 0xad, 0xe0, 0xa9, 0xf6, 0x46, 0x25, 0xd5, 0x11, 0x3d, 0xf3, 0x98, 0x40, + 0x70, 0x05, 0xc1, 0xb5, 0xf2, 0x0f, 0xcc, 0x76, 0xc0, 0xf4, 0x45, 0x5f, + 0x60, 0x0f, 0xc4, 0x29, 0xe7, 0x8d, 0xaf, 0xb8, 0x0d, 0x31, 0xf2, 0xfd, + 0x11, 0x62, 0xf6, 0x6b, 0xf9, 0x66, 0xf3, 0x50, 0xab, 0x59, 0x56, 0x94, + 0x4b, 0xcb, 0x27, 0xac, 0x5c, 0xf5, 0xa8, 0x1f, 0x06, 0x0f, 0x0d, 0xea, + 0x8b, 0xee, 0x2a, 0x23, 0x68, 0x57, 0xb8, 0x6b, 0x1d, 0xab, 0xfb, 0x7d, + 0x44, 0x56, 0xde, 0xf2, 0x71, 0xc8, 0xfb, 0xd3, 0x4a, 0x0f, 0x15, 0x00, + 0x70, 0x7c, 0x92, 0x96, 0xa1, 0xf3, 0x12, 0x6b, 0xf1, 0x89, 0x89, 0xb3, + 0xdd, 0x9a, 0xfc, 0xee, 0x47, 0x5a, 0x9f, 0x89, 0xbc, 0x57, 0x66, 0x09, + 0x8b, 0xba, 0x29, 0x56, 0x8a, 0x2f, 0x74, 0x7a, 0xb2, 0xfd, 0xa2, 0x26, + 0x1a, 0x84, 0x10, 0x01, 0xa4, 0x11, 0x57, 0x2f, 0xa5, 0xaa, 0xd4, 0xbb, + 0x6c, 0x4a, 0xdd, 0x7e, 0xd1, 0x6a, 0xa7, 0x5b, 0x86, 0x7a, 0x26, 0x7d, + 0x02, 0x5d, 0xc4, 0x6c, 0xde, 0x0f, 0x26, 0x23, 0x17, 0x4b, 0x85, 0xb9, + 0x80, 0x15, 0xe2, 0xe0, 0x5a, 0x7d, 0x42, 0xbe, 0xa6, 0x0e, 0xef, 0x86, + 0x0d, 0xab, 0x6d, 0x57, 0xee, 0x16, 0x5d, 0xad, 0x25, 0x6b, 0x77, 0xba, + 0x5f, 0x59, 0xf7, 0x86, 0xdb, 0x91, 0x80, 0x16, 0xe3, 0xc4, 0x4a, 0xe9, + 0x95, 0x65, 0x04, 0xde, 0x07, 0x66, 0x6a, 0xd5, 0xef, 0x3f, 0x77, 0x4d, + 0x07, 0xde, 0x86, 0x90, 0xb0, 0x4d, 0x90, 0x1c, 0x9e, 0xf2, 0x9c, 0x93, + 0x4e, 0xa4, 0xa7, 0x33, 0xbb, 0xd0, 0x8e, 0x4f, 0xe7, 0xde, 0x3b, 0xad, + 0xd8, 0x7e, 0xe5, 0xba, 0xaf, 0x63, 0xfb, 0x8b, 0xd7, 0xc2, 0x22, 0xba, + 0xf9, 0x43, 0xf1, 0x1f, 0x90, 0x21, 0xf8, 0x83, 0xcd, 0xfe, 0xbf, 0xaa, + 0x0f, 0x85, 0x09, 0xa1, 0xef, 0xf1, 0xcc, 0xd1, 0x9f, 0x71, 0xfc, 0xcf, + 0x90, 0xc6, 0xe5, 0xdf, 0x15, 0xfa, 0xa6, 0xf1, 0xda, 0x8f, 0xa2, 0x1f, + 0x9a, 0xf6, 0x8b, 0x66, 0x7a, 0xa2, 0x30, 0x3f, 0x30, 0xa8, 0x8f, 0xe8, + 0xff, 0x00, 0x91, 0xff, 0x00, 0x9b, 0x01, 0xdb, 0xf1, 0x3b, 0x9c, 0x5f, + 0xf9, 0x89, 0xd7, 0xf8, 0x4d, 0x52, 0x7b, 0xc3, 0x54, 0x86, 0x54, 0x29, + 0x45, 0x84, 0x16, 0x8b, 0x86, 0x18, 0x8a, 0xe8, 0x13, 0x3c, 0xa9, 0x7a, + 0xa4, 0x53, 0x7a, 0x88, 0x6b, 0x29, 0x45, 0xea, 0xfa, 0x61, 0xbe, 0x10, + 0xfa, 0x7b, 0xe1, 0xd5, 0x77, 0x25, 0x8c, 0xf8, 0x51, 0xde, 0x12, 0xcd, + 0x41, 0xed, 0x2f, 0xd2, 0x88, 0x0e, 0xcf, 0x65, 0x33, 0xdd, 0x17, 0x74, + 0xf9, 0x90, 0xdb, 0xf8, 0x92, 0x9f, 0xf8, 0x41, 0x3c, 0xa2, 0xad, 0xef, + 0x78, 0x87, 0xed, 0x7d, 0x08, 0x16, 0xbe, 0xd8, 0xea, 0x3f, 0x9d, 0xa5, + 0xff, 0x00, 0xe4, 0x9d, 0x37, 0xcc, 0xbd, 0xfe, 0x52, 0x5b, 0xfc, 0x27, + 0xf2, 0xa8, 0xff, 0x00, 0x91, 0x01, 0xff, 0x00, 0x23, 0xf7, 0x29, 0xfe, + 0x10, 0xb7, 0xfc, 0x23, 0xff, 0x00, 0x54, 0xeb, 0x8b, 0xff, 0x00, 0x4c, + 0x85, 0xb4, 0xf3, 0x07, 0xf6, 0x89, 0xfb, 0x80, 0x89, 0x76, 0x7d, 0xe2, + 0x5d, 0xa0, 0xdb, 0x6f, 0xe3, 0xb4, 0xe9, 0x3f, 0x8e, 0xd0, 0x1d, 0x13, + 0xdb, 0xfe, 0x21, 0x3a, 0x74, 0x13, 0xf0, 0x83, 0xe0, 0xeb, 0x4c, 0x35, + 0xcb, 0xc2, 0x0e, 0xe5, 0x84, 0xdc, 0x9e, 0xc4, 0x54, 0xd5, 0xf2, 0xc2, + 0xa9, 0x55, 0xde, 0x6a, 0xf6, 0xf2, 0x9a, 0x9c, 0x39, 0xa7, 0xd0, 0xd3, + 0xf7, 0x09, 0x3f, 0x5a, 0x20, 0x1e, 0x50, 0xee, 0x01, 0x25, 0x44, 0x3a, + 0xae, 0xc8, 0xc5, 0x2e, 0x57, 0x71, 0x71, 0xb2, 0x2a, 0x35, 0x5a, 0x20, + 0xd9, 0x17, 0xd6, 0x3b, 0x14, 0xed, 0x2c, 0xd0, 0x79, 0x22, 0x5a, 0x24, + 0x76, 0x9e, 0xd1, 0xbf, 0xf6, 0x6b, 0x3d, 0xe3, 0x5d, 0x1e, 0xf3, 0x80, + 0x3c, 0x7f, 0xc8, 0x2e, 0x81, 0xec, 0x89, 0xa2, 0x2f, 0x74, 0xd1, 0x9c, + 0xd8, 0x1e, 0x67, 0xe6, 0x7d, 0x7c, 0x3f, 0x51, 0xbf, 0xd6, 0xff, 0x00, + 0x51, 0xd7, 0x6e, 0xca, 0x7e, 0x66, 0x88, 0x7f, 0x86, 0xf1, 0xd6, 0xcc, + 0xa9, 0xf5, 0x8f, 0xd4, 0x43, 0xe8, 0x8f, 0xd4, 0xa7, 0x4f, 0x28, 0x7f, + 0x10, 0x1d, 0x3c, 0x03, 0xf8, 0x80, 0x7c, 0x90, 0x60, 0x5a, 0x0f, 0x87, + 0xee, 0x09, 0xd0, 0xbf, 0xbd, 0x60, 0x3a, 0x40, 0x23, 0xcc, 0x41, 0x5d, + 0xdf, 0xf1, 0xc4, 0xe9, 0x7f, 0x0e, 0x93, 0xf8, 0x0f, 0xc4, 0xb7, 0xf7, + 0x7d, 0x4b, 0x7f, 0x37, 0xd4, 0xbf, 0xf6, 0x7d, 0x4f, 0xe5, 0xfa, 0x25, + 0xbf, 0x83, 0xea, 0x5b, 0xf8, 0x3e, 0xbd, 0x20, 0x27, 0x81, 0xc0, 0x3f, + 0xe2, 0x47, 0x08, 0x76, 0x8e, 0x11, 0xec, 0xa0, 0x5a, 0x0c, 0x69, 0xd3, + 0x69, 0x4b, 0xee, 0xce, 0x75, 0xde, 0xa0, 0x3b, 0xbd, 0xea, 0x75, 0x5e, + 0x52, 0x59, 0xff, 0x00, 0x72, 0x9e, 0xd3, 0xcc, 0x76, 0xc7, 0x98, 0xea, + 0x82, 0x3a, 0x52, 0x0b, 0x10, 0xd4, 0x19, 0xc7, 0x4d, 0x12, 0x63, 0xa4, + 0xa9, 0xe8, 0x78, 0x13, 0x85, 0xf1, 0x03, 0xfe, 0x11, 0xf6, 0x18, 0x2d, + 0xd1, 0x1d, 0x16, 0x6d, 0x2e, 0x6d, 0x07, 0xde, 0x1b, 0x8b, 0xe6, 0x1c, + 0x84, 0x39, 0x32, 0x98, 0x01, 0xbd, 0xe0, 0x9c, 0xfe, 0xd1, 0x03, 0xd7, + 0xdb, 0x9c, 0xad, 0xe2, 0x57, 0xfa, 0xe7, 0xf9, 0x93, 0xfc, 0xa9, 0x57, + 0xe9, 0x9f, 0xe5, 0xcf, 0xf4, 0xd0, 0xff, 0x00, 0xac, 0x87, 0xfe, 0x00, + 0x9c, 0xe8, 0xf5, 0x50, 0xdc, 0xfa, 0x7b, 0xdf, 0xee, 0xa7, 0xfb, 0xbf, + 0x49, 0xff, 0x00, 0xa3, 0x9f, 0xe8, 0xfd, 0x47, 0x85, 0x7d, 0x66, 0xa9, + 0xfe, 0x6c, 0x5b, 0x4f, 0x66, 0x71, 0x7b, 0x11, 0xff, 0x00, 0x95, 0x2e, + 0xfd, 0x33, 0x8e, 0x2a, 0xed, 0x47, 0x69, 0x4c, 0xf7, 0xce, 0xd2, 0x3c, + 0x64, 0x76, 0xb5, 0x1d, 0x7a, 0xfb, 0xc3, 0x5c, 0xb0, 0x6d, 0x56, 0x6e, + 0x96, 0x6e, 0x86, 0x14, 0xb8, 0x7e, 0x95, 0xd4, 0x51, 0x3d, 0x0b, 0x8c, + 0x9a, 0x00, 0x20, 0x74, 0x09, 0xb2, 0x27, 0x20, 0x94, 0x6e, 0x79, 0x88, + 0x6c, 0x7c, 0xc7, 0x7e, 0xde, 0x67, 0x53, 0xef, 0x1f, 0xd7, 0xb1, 0xdc, + 0x8f, 0xf9, 0x73, 0xa3, 0x43, 0x21, 0xd1, 0x7d, 0x27, 0x06, 0x20, 0x48, + 0xfa, 0x1e, 0xfc, 0x3f, 0xdb, 0x80, 0x35, 0xf7, 0x90, 0x2f, 0xca, 0xe5, + 0x0d, 0x03, 0xcf, 0xf5, 0x17, 0xb5, 0x7b, 0x3f, 0xd4, 0xd0, 0x07, 0xfb, + 0xd2, 0x69, 0xde, 0xf7, 0xf5, 0x3f, 0x60, 0x22, 0xdb, 0xb2, 0x5b, 0x55, + 0x92, 0xfb, 0xd2, 0xff, 0xd9 +}; +unsigned int chromatic_jpg_len = 90437; + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_view/assets/lv_gltf_view_shader.c b/inc/lvgl/src/libs/gltf/gltf_view/assets/lv_gltf_view_shader.c new file mode 100644 index 0000000..d5d7ef8 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_view/assets/lv_gltf_view_shader.c @@ -0,0 +1,3522 @@ +#include "lv_gltf_view_shader.h" +#include "../lv_gltf_view_internal.h" + +#if LV_USE_GLTF + +#include "../../../../stdlib/lv_sprintf.h" +#include + +static const lv_opengl_shader_t src_includes[] = { + { + "tonemapping.glsl", R"( + + uniform float u_Exposure; + + + // const float STANDARD_GAMMA = 2.2; // Retained for reference - unused + + const float GAMMA = )" LV_GLTF_TONEMAP_GAMMA R"(; + const float INV_GAMMA = 1.0 / GAMMA; + + + // sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT + const mat3 ACESInputMat = mat3 + ( + 0.59719, 0.07600, 0.02840, + 0.35458, 0.90834, 0.13383, + 0.04823, 0.01566, 0.83777 + ); + + + // ODT_SAT => XYZ => D60_2_D65 => sRGB + const mat3 ACESOutputMat = mat3 + ( + 1.60475, -0.10208, -0.00327, + -0.53108, 1.10813, -0.07276, + -0.07367, -0.00605, 1.07602 + ); + + + // linear to sRGB approximation + // see http://chilliant.blogspot.com/2012/08/srgb-approximations-for-hlsl.html + vec3 linearTosRGB(vec3 color) + { + return pow(color, vec3(INV_GAMMA)); + } + + + // sRGB to linear approximation + // see http://chilliant.blogspot.com/2012/08/srgb-approximations-for-hlsl.html + vec3 sRGBToLinear(vec3 srgbIn) + { + return vec3(pow(srgbIn.xyz, vec3(GAMMA))); + } + + + vec4 sRGBToLinear(vec4 srgbIn) + { + return vec4(sRGBToLinear(srgbIn.xyz), srgbIn.w); + } + + + // ACES tone map (faster approximation) + // see: https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/ + vec3 toneMapACES_Narkowicz(vec3 color) + { + const float A = 2.51; + const float B = 0.03; + const float C = 2.43; + const float D = 0.59; + const float E = 0.14; + return clamp((color * (A * color + B)) / (color * (C * color + D) + E), 0.0, 1.0); + } + + + // ACES filmic tone map approximation + // see https://github.com/TheRealMJP/BakingLab/blob/master/BakingLab/ACES.hlsl + vec3 RRTAndODTFit(vec3 color) + { + vec3 a = color * (color + 0.0245786) - 0.000090537; + vec3 b = color * (0.983729 * color + 0.4329510) + 0.238081; + return a / b; + } + + + // tone mapping + vec3 toneMapACES_Hill(vec3 color) + { + color = ACESInputMat * color; + + // Apply RRT and ODT + color = RRTAndODTFit(color); + + color = ACESOutputMat * color; + + // Clamp to [0, 1] + color = clamp(color, 0.0, 1.0); + + return color; + } + + // Khronos PBR neutral tone mapping + #ifdef TONEMAP_KHR_PBR_NEUTRAL + vec3 toneMap_KhronosPbrNeutral( vec3 color ) + { + const float startCompression = 0.8 - 0.04; + const float desaturation = 0.15; + + float x = min(color.r, min(color.g, color.b)); + float offset = x < 0.08 ? x - 6.25 * x * x : 0.04; + color -= offset; + + float peak = max(color.r, max(color.g, color.b)); + if (peak < startCompression) return color; + + const float d = 1. - startCompression; + float newPeak = 1. - d * d / (peak + d - startCompression); + color *= newPeak / peak; + + float g = 1. - 1. / (desaturation * (peak - newPeak) + 1.); + return mix(color, newPeak * vec3(1, 1, 1), g); + } + #endif + + vec3 toneMap(vec3 color) + { + color *= u_Exposure; + + #ifdef TONEMAP_ACES_NARKOWICZ + color = toneMapACES_Narkowicz(color); + #endif + + #ifdef TONEMAP_ACES_HILL + color = toneMapACES_Hill(color); + #endif + + #ifdef TONEMAP_ACES_HILL_EXPOSURE_BOOST + // boost exposure as discussed in https://github.com/mrdoob/three.js/pull/19621 + // this factor is based on the exposure correction of Krzysztof Narkowicz in his + // implemetation of ACES tone mapping + color /= 0.6; + color = toneMapACES_Hill(color); + #endif + + #ifdef TONEMAP_KHR_PBR_NEUTRAL + color = toneMap_KhronosPbrNeutral(color); + #endif + + return linearTosRGB(color); + } + + )" + }, + { + "textures1.glsl", R"( + + // IBL + + uniform int u_MipCount; + uniform samplerCube u_LambertianEnvSampler; + uniform samplerCube u_GGXEnvSampler; + uniform sampler2D u_GGXLUT; + uniform samplerCube u_CharlieEnvSampler; + uniform sampler2D u_CharlieLUT; + uniform sampler2D u_SheenELUT; + uniform mat3 u_EnvRotation; + + + // General Material + + + uniform sampler2D u_NormalSampler; + uniform float u_NormalScale; + uniform int u_NormalUVSet; + uniform mat3 u_NormalUVTransform; + + uniform vec3 u_EmissiveFactor; + uniform sampler2D u_EmissiveSampler; + uniform int u_EmissiveUVSet; + uniform mat3 u_EmissiveUVTransform; + + uniform sampler2D u_OcclusionSampler; + uniform int u_OcclusionUVSet; + uniform float u_OcclusionStrength; + uniform mat3 u_OcclusionUVTransform; + + + in vec2 v_texcoord_0; + in vec2 v_texcoord_1; + + + vec2 getNormalUV() + { + vec3 uv = vec3(u_NormalUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + + #ifdef HAS_NORMAL_UV_TRANSFORM + uv = u_NormalUVTransform * uv; + #endif + + return uv.xy; + } + + + vec2 getEmissiveUV() + { + vec3 uv = vec3(u_EmissiveUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + + #ifdef HAS_EMISSIVE_UV_TRANSFORM + uv = u_EmissiveUVTransform * uv; + #endif + + return uv.xy; + } + + + vec2 getOcclusionUV() + { + vec3 uv = vec3(u_OcclusionUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + + #ifdef HAS_OCCLUSION_UV_TRANSFORM + uv = u_OcclusionUVTransform * uv; + #endif + + return uv.xy; + } + + + // MK TEMP - Added special optimized handling for unlit materials + #ifdef MATERIAL_UNLIT + uniform sampler2D u_BaseColorSampler; + uniform int u_BaseColorUVSet; + uniform mat3 u_BaseColorUVTransform; + + vec2 getBaseColorUV() + { + vec3 uv = vec3(u_BaseColorUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + + #ifdef HAS_BASECOLOR_UV_TRANSFORM + uv = u_BaseColorUVTransform * uv; + #endif + + return uv.xy; + } + #else + // Metallic Roughness Material + #ifdef MATERIAL_METALLICROUGHNESS + + uniform sampler2D u_BaseColorSampler; + uniform int u_BaseColorUVSet; + uniform mat3 u_BaseColorUVTransform; + + uniform sampler2D u_MetallicRoughnessSampler; + uniform int u_MetallicRoughnessUVSet; + uniform mat3 u_MetallicRoughnessUVTransform; + + vec2 getBaseColorUV() + { + vec3 uv = vec3(u_BaseColorUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + + #ifdef HAS_BASECOLOR_UV_TRANSFORM + uv = u_BaseColorUVTransform * uv; + #endif + + return uv.xy; + } + + vec2 getMetallicRoughnessUV() + { + vec3 uv = vec3(u_MetallicRoughnessUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + + #ifdef HAS_METALLICROUGHNESS_UV_TRANSFORM + uv = u_MetallicRoughnessUVTransform * uv; + #endif + + return uv.xy; + } + + #endif + #endif + + )" + }, + { + "textures2.glsl", R"( + // Specular Glossiness Material + + + #ifdef MATERIAL_SPECULARGLOSSINESS + + uniform sampler2D u_DiffuseSampler; + uniform int u_DiffuseUVSet; + uniform mat3 u_DiffuseUVTransform; + + uniform sampler2D u_SpecularGlossinessSampler; + uniform int u_SpecularGlossinessUVSet; + uniform mat3 u_SpecularGlossinessUVTransform; + + + vec2 getSpecularGlossinessUV() + { + vec3 uv = vec3(u_SpecularGlossinessUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + + #ifdef HAS_SPECULARGLOSSINESS_UV_TRANSFORM + uv = u_SpecularGlossinessUVTransform * uv; + #endif + + return uv.xy; + } + + vec2 getDiffuseUV() + { + vec3 uv = vec3(u_DiffuseUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + + #ifdef HAS_DIFFUSE_UV_TRANSFORM + uv = u_DiffuseUVTransform * uv; + #endif + + return uv.xy; + } + + #endif + + + // Clearcoat Material + + + #ifdef MATERIAL_CLEARCOAT + + uniform sampler2D u_ClearcoatSampler; + uniform int u_ClearcoatUVSet; + uniform mat3 u_ClearcoatUVTransform; + + uniform sampler2D u_ClearcoatRoughnessSampler; + uniform int u_ClearcoatRoughnessUVSet; + uniform mat3 u_ClearcoatRoughnessUVTransform; + + uniform sampler2D u_ClearcoatNormalSampler; + uniform int u_ClearcoatNormalUVSet; + uniform mat3 u_ClearcoatNormalUVTransform; + uniform float u_ClearcoatNormalScale; + + + vec2 getClearcoatUV() + { + vec3 uv = vec3(u_ClearcoatUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_CLEARCOAT_UV_TRANSFORM + uv = u_ClearcoatUVTransform * uv; + #endif + return uv.xy; + } + + vec2 getClearcoatRoughnessUV() + { + vec3 uv = vec3(u_ClearcoatRoughnessUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_CLEARCOATROUGHNESS_UV_TRANSFORM + uv = u_ClearcoatRoughnessUVTransform * uv; + #endif + return uv.xy; + } + + vec2 getClearcoatNormalUV() + { + vec3 uv = vec3(u_ClearcoatNormalUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_CLEARCOATNORMAL_UV_TRANSFORM + uv = u_ClearcoatNormalUVTransform * uv; + #endif + return uv.xy; + } + + #endif + + + // Sheen Material + + + #ifdef MATERIAL_SHEEN + + uniform sampler2D u_SheenColorSampler; + uniform int u_SheenColorUVSet; + uniform mat3 u_SheenColorUVTransform; + uniform sampler2D u_SheenRoughnessSampler; + uniform int u_SheenRoughnessUVSet; + uniform mat3 u_SheenRoughnessUVTransform; + + )" + }, + { + "textures3.glsl", R"( + vec2 getSheenColorUV() + { + vec3 uv = vec3(u_SheenColorUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_SHEENCOLOR_UV_TRANSFORM + uv = u_SheenColorUVTransform * uv; + #endif + return uv.xy; + } + + vec2 getSheenRoughnessUV() + { + vec3 uv = vec3(u_SheenRoughnessUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_SHEENROUGHNESS_UV_TRANSFORM + uv = u_SheenRoughnessUVTransform * uv; + #endif + return uv.xy; + } + + #endif + + + // Specular Material + + + #ifdef MATERIAL_SPECULAR + + uniform sampler2D u_SpecularSampler; + uniform int u_SpecularUVSet; + uniform mat3 u_SpecularUVTransform; + uniform sampler2D u_SpecularColorSampler; + uniform int u_SpecularColorUVSet; + uniform mat3 u_SpecularColorUVTransform; + + + vec2 getSpecularUV() + { + vec3 uv = vec3(u_SpecularUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_SPECULAR_UV_TRANSFORM + uv = u_SpecularUVTransform * uv; + #endif + return uv.xy; + } + + vec2 getSpecularColorUV() + { + vec3 uv = vec3(u_SpecularColorUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_SPECULARCOLOR_UV_TRANSFORM + uv = u_SpecularColorUVTransform * uv; + #endif + return uv.xy; + } + + #endif + + + // Transmission Material + + + #ifdef MATERIAL_TRANSMISSION + + uniform sampler2D u_TransmissionSampler; + uniform int u_TransmissionUVSet; + uniform mat3 u_TransmissionUVTransform; + uniform sampler2D u_TransmissionFramebufferSampler; + uniform ivec2 u_TransmissionFramebufferSize; + + + vec2 getTransmissionUV() + { + vec3 uv = vec3(u_TransmissionUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_TRANSMISSION_UV_TRANSFORM + uv = u_TransmissionUVTransform * uv; + #endif + return uv.xy; + } + + #endif + + + // Volume Material + + + #ifdef MATERIAL_VOLUME + + uniform sampler2D u_ThicknessSampler; + uniform int u_ThicknessUVSet; + uniform mat3 u_ThicknessUVTransform; + + + )" + }, + { + "textures4.glsl", R"( + vec2 getThicknessUV() + { + vec3 uv = vec3(u_ThicknessUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_THICKNESS_UV_TRANSFORM + uv = u_ThicknessUVTransform * uv; + #endif + return uv.xy; + } + + #endif + + + // Iridescence + + + #ifdef MATERIAL_IRIDESCENCE + + uniform sampler2D u_IridescenceSampler; + uniform int u_IridescenceUVSet; + uniform mat3 u_IridescenceUVTransform; + + uniform sampler2D u_IridescenceThicknessSampler; + uniform int u_IridescenceThicknessUVSet; + uniform mat3 u_IridescenceThicknessUVTransform; + + + vec2 getIridescenceUV() + { + vec3 uv = vec3(u_IridescenceUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_IRIDESCENCE_UV_TRANSFORM + uv = u_IridescenceUVTransform * uv; + #endif + return uv.xy; + } + + vec2 getIridescenceThicknessUV() + { + vec3 uv = vec3(u_IridescenceThicknessUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_IRIDESCENCETHICKNESS_UV_TRANSFORM + uv = u_IridescenceThicknessUVTransform * uv; + #endif + return uv.xy; + } + + #endif + + + // Diffuse Transmission + + #ifdef MATERIAL_DIFFUSE_TRANSMISSION + + uniform sampler2D u_DiffuseTransmissionSampler; + uniform int u_DiffuseTransmissionUVSet; + uniform mat3 u_DiffuseTransmissionUVTransform; + + uniform sampler2D u_DiffuseTransmissionColorSampler; + uniform int u_DiffuseTransmissionColorUVSet; + uniform mat3 u_DiffuseTransmissionColorUVTransform; + + + vec2 getDiffuseTransmissionUV() + { + vec3 uv = vec3(u_DiffuseTransmissionUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_DIFFUSETRANSMISSION_UV_TRANSFORM + uv = u_DiffuseTransmissionUVTransform * uv; + #endif + return uv.xy; + } + + vec2 getDiffuseTransmissionColorUV() + { + vec3 uv = vec3(u_DiffuseTransmissionColorUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_DIFFUSETRANSMISSIONCOLOR_UV_TRANSFORM + uv = u_DiffuseTransmissionColorUVTransform * uv; + #endif + return uv.xy; + } + + #endif + + // Anisotropy + + #ifdef MATERIAL_ANISOTROPY + + uniform sampler2D u_AnisotropySampler; + uniform int u_AnisotropyUVSet; + uniform mat3 u_AnisotropyUVTransform; + + vec2 getAnisotropyUV() + { + vec3 uv = vec3(u_AnisotropyUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); + #ifdef HAS_ANISOTROPY_UV_TRANSFORM + uv = u_AnisotropyUVTransform * uv; + #endif + return uv.xy; + } + + #endif + + )" + }, + { + "functions.glsl", R"( + + const float M_PI = 3.141592653589793; + + + in vec3 v_Position; + + + #ifdef HAS_NORMAL_VEC3 + #ifdef HAS_TANGENT_VEC4 + in mat3 v_TBN; + #else + in vec3 v_Normal; + #endif + #endif + + + #ifdef HAS_COLOR_0_VEC3 + in vec3 v_Color; + #endif + #ifdef HAS_COLOR_0_VEC4 + in vec4 v_Color; + #endif + + + vec4 getVertexColor() + { + vec4 color = vec4(1.0); + + #ifdef HAS_COLOR_0_VEC3 + color.rgb = v_Color.rgb; + #endif + #ifdef HAS_COLOR_0_VEC4 + color = v_Color; + #endif + + return color; + } + + + struct NormalInfo { + vec3 ng; // Geometry normal + vec3 t; // Geometry tangent + vec3 b; // Geometry bitangent + vec3 n; // Shading normal + vec3 ntex; // Normal from texture, scaling is accounted for. + }; + + + float clampedDot(vec3 x, vec3 y) + { + return clamp(dot(x, y), 0.0, 1.0); + } + + + float max3(vec3 v) + { + return max(max(v.x, v.y), v.z); + } + + + float sq(float t) + { + return t * t; + } + + vec2 sq(vec2 t) + { + return t * t; + } + + vec3 sq(vec3 t) + { + return t * t; + } + + vec4 sq(vec4 t) + { + return t * t; + } + + + float applyIorToRoughness(float roughness, float ior) + { + // Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and + // an IOR of 1.5 results in the default amount of microfacet refraction. + return roughness * clamp(ior * 2.0 - 2.0, 0.0, 1.0); + } + + vec3 rgb_mix(vec3 base, vec3 layer, vec3 rgb_alpha) + { + float rgb_alpha_max = max(rgb_alpha.r, max(rgb_alpha.g, rgb_alpha.b)); + return (1.0 - rgb_alpha_max) * base + rgb_alpha * layer; + } + + + )" + }, + { + "brdf1.glsl", R"( + // + // Fresnel + // + // http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html + // https://github.com/wdas/brdf/tree/master/src/brdfs + // https://google.github.io/filament/Filament.md.html + // + + // The following equation models the Fresnel reflectance term of the spec equation (aka F()) + // Implementation of fresnel from [4], Equation 15 + vec3 F_Schlick(vec3 f0, vec3 f90, float VdotH) + { + return f0 + (f90 - f0) * pow(clamp(1.0 - VdotH, 0.0, 1.0), 5.0); + } + + float F_Schlick(float f0, float f90, float VdotH) + { + float x = clamp(1.0 - VdotH, 0.0, 1.0); + float x2 = x * x; + float x5 = x * x2 * x2; + return f0 + (f90 - f0) * x5; + } + + float F_Schlick(float f0, float VdotH) + { + float f90 = 1.0; //clamp(50.0 * f0, 0.0, 1.0); + return F_Schlick(f0, f90, VdotH); + } + + vec3 F_Schlick(vec3 f0, float f90, float VdotH) + { + float x = clamp(1.0 - VdotH, 0.0, 1.0); + float x2 = x * x; + float x5 = x * x2 * x2; + return f0 + (f90 - f0) * x5; + } + + vec3 F_Schlick(vec3 f0, float VdotH) + { + float f90 = 1.0; //clamp(dot(f0, vec3(50.0 * 0.33)), 0.0, 1.0); + return F_Schlick(f0, f90, VdotH); + } + + vec3 Schlick_to_F0(vec3 f, vec3 f90, float VdotH) { + float x = clamp(1.0 - VdotH, 0.0, 1.0); + float x2 = x * x; + float x5 = clamp(x * x2 * x2, 0.0, 0.9999); + + return (f - f90 * x5) / (1.0 - x5); + } + + float Schlick_to_F0(float f, float f90, float VdotH) { + float x = clamp(1.0 - VdotH, 0.0, 1.0); + float x2 = x * x; + float x5 = clamp(x * x2 * x2, 0.0, 0.9999); + + return (f - f90 * x5) / (1.0 - x5); + } + + vec3 Schlick_to_F0(vec3 f, float VdotH) { + return Schlick_to_F0(f, vec3(1.0), VdotH); + } + + float Schlick_to_F0(float f, float VdotH) { + return Schlick_to_F0(f, 1.0, VdotH); + } + + )" + }, + { + "brdf2.glsl", R"( + // Smith Joint GGX + // Note: Vis = G / (4 * NdotL * NdotV) + // see Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs. Journal of Computer Graphics Techniques, 3 + // see Real-Time Rendering. Page 331 to 336. + // see https://google.github.io/filament/Filament.md.html#materialsystem/specularbrdf/geometricshadowing(specularg) + float V_GGX(float NdotL, float NdotV, float alphaRoughness) + { + float alphaRoughnessSq = alphaRoughness * alphaRoughness; + + float GGXV = NdotL * sqrt(NdotV * NdotV * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); + float GGXL = NdotV * sqrt(NdotL * NdotL * (1.0 - alphaRoughnessSq) + alphaRoughnessSq); + + float GGX = GGXV + GGXL; + if (GGX > 0.0) + { + return 0.5 / GGX; + } + return 0.0; + } + + + // The following equation(s) model the distribution of microfacet normals across the area being drawn (aka D()) + // Implementation from "Average Irregularity Representation of a Roughened Surface for Ray Reflection" by T. S. Trowbridge, and K. P. Reitz + // Follows the distribution function recommended in the SIGGRAPH 2013 course notes from EPIC Games [1], Equation 3. + float D_GGX(float NdotH, float alphaRoughness) + { + float alphaRoughnessSq = alphaRoughness * alphaRoughness; + float f = (NdotH * NdotH) * (alphaRoughnessSq - 1.0) + 1.0; + return alphaRoughnessSq / (M_PI * f * f); + } + + + float lambdaSheenNumericHelper(float x, float alphaG) + { + float oneMinusAlphaSq = (1.0 - alphaG) * (1.0 - alphaG); + float a = mix(21.5473, 25.3245, oneMinusAlphaSq); + float b = mix(3.82987, 3.32435, oneMinusAlphaSq); + float c = mix(0.19823, 0.16801, oneMinusAlphaSq); + float d = mix(-1.97760, -1.27393, oneMinusAlphaSq); + float e = mix(-4.32054, -4.85967, oneMinusAlphaSq); + return a / (1.0 + b * pow(x, c)) + d * x + e; + } + + + float lambdaSheen(float cosTheta, float alphaG) + { + if (abs(cosTheta) < 0.5) + { + return exp(lambdaSheenNumericHelper(cosTheta, alphaG)); + } + else + { + return exp(2.0 * lambdaSheenNumericHelper(0.5, alphaG) - lambdaSheenNumericHelper(1.0 - cosTheta, alphaG)); + } + } + + + float V_Sheen(float NdotL, float NdotV, float sheenRoughness) + { + sheenRoughness = max(sheenRoughness, 0.000001); //clamp (0,1] + float alphaG = sheenRoughness * sheenRoughness; + + return clamp(1.0 / ((1.0 + lambdaSheen(NdotV, alphaG) + lambdaSheen(NdotL, alphaG)) * + (4.0 * NdotV * NdotL)), 0.0, 1.0); + } + + + //Sheen implementation------------------------------------------------------------------------------------- + // See https://github.com/sebavan/glTF/tree/KHR_materials_sheen/extensions/2.0/Khronos/KHR_materials_sheen + + // Estevez and Kulla http://www.aconty.com/pdf/s2017_pbs_imageworks_sheen.pdf + float D_Charlie(float sheenRoughness, float NdotH) + { + sheenRoughness = max(sheenRoughness, 0.000001); //clamp (0,1] + float alphaG = sheenRoughness * sheenRoughness; + float invR = 1.0 / alphaG; + float cos2h = NdotH * NdotH; + float sin2h = 1.0 - cos2h; + return (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * M_PI); + } + )" + }, + { + "brdf3.glsl", R"( + + //https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#acknowledgments AppendixB + vec3 BRDF_lambertian(vec3 diffuseColor) + { + // see https://seblagarde.wordpress.com/2012/01/08/pi-or-not-to-pi-in-game-lighting-equation/ + return (diffuseColor / M_PI); + } + + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#acknowledgments AppendixB + vec3 BRDF_specularGGX(float alphaRoughness, float NdotL, float NdotV, float NdotH) + { + float Vis = V_GGX(NdotL, NdotV, alphaRoughness); + float D = D_GGX(NdotH, alphaRoughness); + + return vec3(Vis * D); + } + + + #ifdef MATERIAL_ANISOTROPY + // GGX Distribution Anisotropic (Same as Babylon.js) + // https://blog.selfshadow.com/publications/s2012-shading-course/burley/s2012_pbs_disney_brdf_notes_v3.pdf Addenda + float D_GGX_anisotropic(float NdotH, float TdotH, float BdotH, float anisotropy, float at, float ab) + { + float a2 = at * ab; + vec3 f = vec3(ab * TdotH, at * BdotH, a2 * NdotH); + float w2 = a2 / dot(f, f); + return a2 * w2 * w2 / M_PI; + } + + // GGX Mask/Shadowing Anisotropic (Same as Babylon.js - smithVisibility_GGXCorrelated_Anisotropic) + // Heitz http://jcgt.org/published/0003/02/03/paper.pdf + float V_GGX_anisotropic(float NdotL, float NdotV, float BdotV, float TdotV, float TdotL, float BdotL, float at, float ab) + { + float GGXV = NdotL * length(vec3(at * TdotV, ab * BdotV, NdotV)); + float GGXL = NdotV * length(vec3(at * TdotL, ab * BdotL, NdotL)); + float v = 0.5 / (GGXV + GGXL); + return clamp(v, 0.0, 1.0); + } + + vec3 BRDF_specularGGXAnisotropy(float alphaRoughness, float anisotropy, vec3 n, vec3 v, vec3 l, vec3 h, vec3 t, vec3 b) + { + // Roughness along the anisotropy bitangent is the material roughness, while the tangent roughness increases with anisotropy. + float at = mix(alphaRoughness, 1.0, anisotropy * anisotropy); + float ab = clamp(alphaRoughness, 0.001, 1.0); + + float NdotL = clamp(dot(n, l), 0.0, 1.0); + float NdotH = clamp(dot(n, h), 0.001, 1.0); + float NdotV = dot(n, v); + + float V = V_GGX_anisotropic(NdotL, NdotV, dot(b, v), dot(t, v), dot(t, l), dot(b, l), at, ab); + float D = D_GGX_anisotropic(NdotH, dot(t, h), dot(b, h), anisotropy, at, ab); + + return vec3(V * D); + } + #endif + + + // f_sheen + vec3 BRDF_specularSheen(vec3 sheenColor, float sheenRoughness, float NdotL, float NdotV, float NdotH) + { + float sheenDistribution = D_Charlie(sheenRoughness, NdotH); + float sheenVisibility = V_Sheen(NdotL, NdotV, sheenRoughness); + return sheenColor * sheenDistribution * sheenVisibility; + } + )" + }, + { + "punctual1.glsl", R"( + struct Light + { + vec3 direction; + float range; + + vec3 color; + float intensity; + + vec3 position; + float innerConeCos; + + float outerConeCos; + int type; + }; + + const int LightType_Directional = 0; + const int LightType_Point = 1; + const int LightType_Spot = 2; + + + #ifdef USE_PUNCTUAL + //Light u_Lights[LIGHT_COUNT + 1]; //Array [0] is not allowed + uniform Light u_Lights[LIGHT_COUNT + 1]; //Array [0] is not allowed + #endif + + float getRangeAttenuation(float range, float distance) + { + if (range <= 0.0) + { + // negative range means unlimited + return 1.0 / pow(distance, 2.0); + } + return max(min(1.0 - pow(distance / range, 4.0), 1.0), 0.0) / pow(distance, 2.0); + } + float getSpotAttenuation(vec3 pointToLight, vec3 spotDirection, float outerConeCos, float innerConeCos) + { + float actualCos = dot(normalize(spotDirection), normalize(-pointToLight)); + if (actualCos > outerConeCos) + { + if (actualCos < innerConeCos) + { + float angularAttenuation = (actualCos - outerConeCos) / (innerConeCos - outerConeCos); + return angularAttenuation * angularAttenuation; + } + return 1.0; + } + return 0.0; + } + vec3 getLighIntensity(Light light, vec3 pointToLight) + { + float rangeAttenuation = 1.0; + float spotAttenuation = 1.0; + + if (light.type != LightType_Directional) + { + rangeAttenuation = getRangeAttenuation(light.range, length(pointToLight)); + } + if (light.type == LightType_Spot) + { + spotAttenuation = getSpotAttenuation(pointToLight, light.direction, light.outerConeCos, light.innerConeCos); + } + + return rangeAttenuation * spotAttenuation * light.intensity * light.color; + } + + )" + }, + { + "punctual2.glsl", R"( + vec3 getPunctualRadianceTransmission(vec3 normal, vec3 view, vec3 pointToLight, float alphaRoughness, + vec3 baseColor, float ior) + { + float transmissionRougness = applyIorToRoughness(alphaRoughness, ior); + + vec3 n = normalize(normal); + vec3 v = normalize(view); + vec3 l = normalize(pointToLight); + vec3 l_mirror = normalize(l + 2.0*n*dot(-l, n)); + vec3 h = normalize(l_mirror + v); + + float D = D_GGX(clamp(dot(n, h), 0.0, 1.0), transmissionRougness); + float Vis = V_GGX(clamp(dot(n, l_mirror), 0.0, 1.0), clamp(dot(n, v), 0.0, 1.0), transmissionRougness); + + // Transmission BTDF + return baseColor * D * Vis; + } + + + vec3 getPunctualRadianceClearCoat(vec3 clearcoatNormal, vec3 v, vec3 l, vec3 h, float VdotH, vec3 f0, vec3 f90, float clearcoatRoughness) + { + float NdotL = clampedDot(clearcoatNormal, l); + float NdotV = clampedDot(clearcoatNormal, v); + float NdotH = clampedDot(clearcoatNormal, h); + return NdotL * BRDF_specularGGX(clearcoatRoughness * clearcoatRoughness, NdotL, NdotV, NdotH); + } + + + vec3 getPunctualRadianceSheen(vec3 sheenColor, float sheenRoughness, float NdotL, float NdotV, float NdotH) + { + return NdotL * BRDF_specularSheen(sheenColor, sheenRoughness, NdotL, NdotV, NdotH); + } + + + vec3 applyVolumeAttenuation(vec3 radiance, float transmissionDistance, vec3 attenuationColor, float attenuationDistance) + { + if (attenuationDistance == 0.0) + { + // Attenuation distance is +∞ (which we indicate by zero), i.e. the transmitted color is not attenuated at all. + return radiance; + } + else + { + vec3 transmittance = pow(attenuationColor, vec3(transmissionDistance / attenuationDistance)); + return transmittance * radiance; + } + } + + + vec3 getVolumeTransmissionRay(vec3 n, vec3 v, float thickness, float ior, mat4 modelMatrix) + { + vec3 refractionVector = refract(-v, normalize(n), 1.0 / ior); + vec3 modelScale; + modelScale.x = length(vec3(modelMatrix[0].xyz)); + modelScale.y = length(vec3(modelMatrix[1].xyz)); + modelScale.z = length(vec3(modelMatrix[2].xyz)); + return normalize(refractionVector) * thickness * modelScale; + } + + )" + }, + { + "ibl1.glsl", R"( + + uniform float u_EnvIntensity; + + vec3 getDiffuseLight(vec3 n) + { + // MK TEMP (for some reason, this one still seems to have positive effect - check for inverted Y at IBL diffuse generation phase) + // n.y *= -1.0; + vec4 textureSample = texture(u_LambertianEnvSampler, u_EnvRotation * n); + textureSample.rgb *= u_EnvIntensity; + return textureSample.rgb; + } + + vec4 getSpecularSample(vec3 reflection, float lod) + { + vec4 textureSample = textureLod(u_GGXEnvSampler, u_EnvRotation * reflection, lod); + textureSample.rgb *= u_EnvIntensity; + return textureSample; + } + + vec4 getSheenSample(vec3 reflection, float lod) + { + vec4 textureSample = textureLod(u_CharlieEnvSampler, u_EnvRotation * reflection, lod); + textureSample.rgb *= u_EnvIntensity; + return textureSample; + } + + vec3 getIBLGGXFresnel(vec3 n, vec3 v, float roughness, vec3 F0, float specularWeight) + { + // see https://bruop.github.io/ibl/#single_scattering_results at Single Scattering Results + // Roughness dependent fresnel, from Fdez-Aguera + float NdotV = clampedDot(n, v); + vec2 brdfSamplePoint = clamp(vec2(NdotV, roughness), vec2(0.0, 0.0), vec2(1.0, 1.0)); + vec2 f_ab = texture(u_GGXLUT, brdfSamplePoint).rg; + vec3 Fr = max(vec3(1.0 - roughness), F0) - F0; + vec3 k_S = F0 + Fr * pow(1.0 - NdotV, 5.0); + vec3 FssEss = specularWeight * (k_S * f_ab.x + f_ab.y); + + // Multiple scattering, from Fdez-Aguera + float Ems = (1.0 - (f_ab.x + f_ab.y)); + vec3 F_avg = specularWeight * (F0 + (1.0 - F0) / 21.0); + vec3 FmsEms = Ems * FssEss * F_avg / (1.0 - F_avg * Ems); + + return FssEss + FmsEms; + } + + vec3 getIBLRadianceGGX(vec3 n, vec3 v, float roughness) + { + float NdotV = clampedDot(n, v); + float lod = roughness * float(u_MipCount - 1); + + vec3 reflection = normalize(reflect(-v, n)); + vec4 specularSample = getSpecularSample(reflection, lod); + + vec3 specularLight = specularSample.rgb; + + return specularLight; + } + + + #ifdef MATERIAL_TRANSMISSION + vec3 getTransmissionSample(vec2 fragCoord, float roughness, float ior) + { + float framebufferLod = log2(float(u_TransmissionFramebufferSize.x)) * applyIorToRoughness(roughness, ior); + vec3 transmittedLight = textureLod(u_TransmissionFramebufferSampler, fragCoord.xy, framebufferLod).bgr; // r/b switched intentionally; + + return transmittedLight; + } + #endif + + #ifdef MATERIAL_TRANSMISSION + vec3 getIBLVolumeRefraction(vec3 n, vec3 v, float perceptualRoughness, vec3 baseColor, vec3 position, mat4 modelMatrix, + mat4 viewMatrix, mat4 projMatrix, float ior, float thickness, vec3 attenuationColor, float attenuationDistance, float dispersion) + { + )" + }, + { + "ibl2.glsl", R"( + + #ifdef MATERIAL_DISPERSION + // Dispersion will spread out the ior values for each r,g,b channel + float halfSpread = (ior - 1.0) * 0.025 * dispersion; + vec3 iors = vec3(ior - halfSpread, ior, ior + halfSpread); + + vec3 transmittedLight; + float transmissionRayLength; + for (int i = 0; i < 3; i++) + { + vec3 transmissionRay = getVolumeTransmissionRay(n, v, thickness, iors[i], modelMatrix); + // TODO: taking length of blue ray, ideally we would take the length of the green ray. For now overwriting seems ok + transmissionRayLength = length(transmissionRay); + vec3 refractedRayExit = position + transmissionRay; + + // Project refracted vector on the framebuffer, while mapping to normalized device coordinates. + vec4 ndcPos = projMatrix * viewMatrix * vec4(refractedRayExit, 1.0); + vec2 refractionCoords = ndcPos.xy / ndcPos.w; + refractionCoords += 1.0; + refractionCoords /= 2.0; + + // Sample framebuffer to get pixel the refracted ray hits for this color channel. + transmittedLight[i] = getTransmissionSample(refractionCoords, perceptualRoughness, iors[i])[i]; + } + #else + vec3 transmissionRay = getVolumeTransmissionRay(n, v, thickness, ior, modelMatrix); + float transmissionRayLength = length(transmissionRay); + vec3 refractedRayExit = position + transmissionRay; + + // Project refracted vector on the framebuffer, while mapping to normalized device coordinates. + vec4 ndcPos = projMatrix * viewMatrix * vec4(refractedRayExit, 1.0); + vec2 refractionCoords = ndcPos.xy / ndcPos.w; + refractionCoords += 1.0; + refractionCoords /= 2.0; + + // Sample framebuffer to get pixel the refracted ray hits. + vec3 transmittedLight = getTransmissionSample(refractionCoords, perceptualRoughness, ior); + + #endif // MATERIAL_DISPERSION + vec3 attenuatedColor = applyVolumeAttenuation(transmittedLight, transmissionRayLength, attenuationColor, attenuationDistance); + + return attenuatedColor * baseColor; + } + #endif + + + #ifdef MATERIAL_ANISOTROPY + vec3 getIBLRadianceAnisotropy(vec3 n, vec3 v, float roughness, float anisotropy, vec3 anisotropyDirection) + { + float NdotV = clampedDot(n, v); + + float tangentRoughness = mix(roughness, 1.0, anisotropy * anisotropy); + vec3 anisotropicTangent = cross(anisotropyDirection, v); + vec3 anisotropicNormal = cross(anisotropicTangent, anisotropyDirection); + float bendFactor = 1.0 - anisotropy * (1.0 - roughness); + float bendFactorPow4 = bendFactor * bendFactor * bendFactor * bendFactor; + vec3 bentNormal = normalize(mix(anisotropicNormal, n, bendFactorPow4)); + + float lod = roughness * float(u_MipCount - 1); + vec3 reflection = normalize(reflect(-v, bentNormal)); + + vec4 specularSample = getSpecularSample(reflection, lod); + + vec3 specularLight = specularSample.rgb; + + return specularLight; + } + #endif + + + vec3 getIBLRadianceCharlie(vec3 n, vec3 v, float sheenRoughness, vec3 sheenColor) + { + float NdotV = clampedDot(n, v); + float lod = sheenRoughness * float(u_MipCount - 1); + vec3 reflection = normalize(reflect(-v, n)); + + vec2 brdfSamplePoint = clamp(vec2(NdotV, sheenRoughness), vec2(0.0, 0.0), vec2(1.0, 1.0)); + float brdf = texture(u_CharlieLUT, brdfSamplePoint).b; + vec4 sheenSample = getSheenSample(reflection, lod); + + vec3 sheenLight = sheenSample.rgb; + return sheenLight * sheenColor * brdf; + } + + )" + }, + { + "material_info1.glsl", R"( + + // Metallic Roughness + uniform float u_MetallicFactor; + uniform float u_RoughnessFactor; + uniform vec4 u_BaseColorFactor; + + // Sheen + uniform float u_SheenRoughnessFactor; + uniform vec3 u_SheenColorFactor; + + // Clearcoat + uniform float u_ClearcoatFactor; + uniform float u_ClearcoatRoughnessFactor; + + // Specular + uniform vec3 u_KHR_materials_specular_specularColorFactor; + uniform float u_KHR_materials_specular_specularFactor; + + // Transmission + uniform float u_TransmissionFactor; + + // Volume + uniform float u_ThicknessFactor; + uniform vec3 u_AttenuationColor; + uniform float u_AttenuationDistance; + + // Iridescence + uniform float u_IridescenceFactor; + uniform float u_IridescenceIor; + uniform float u_IridescenceThicknessMinimum; + uniform float u_IridescenceThicknessMaximum; + + // Diffuse Transmission + uniform float u_DiffuseTransmissionFactor; + uniform vec3 u_DiffuseTransmissionColorFactor; + + // Emissive Strength + uniform float u_EmissiveStrength; + + // IOR + uniform float u_Ior; + + // Anisotropy + uniform vec3 u_Anisotropy; + + // Dispersion + uniform float u_Dispersion; + + // Alpha mode + uniform float u_AlphaCutoff; + + uniform vec3 u_Camera; + + #ifdef MATERIAL_TRANSMISSION + uniform ivec2 u_ScreenSize; + #endif + + uniform highp mat4 u_ModelMatrix; + uniform mat4 u_ViewMatrix; + uniform mat4 u_ProjectionMatrix; + + + struct MaterialInfo + { + vec4 baseColorFactor; + float alphaCutoff; + int flags; + vec2 padding; // Above props temporary from earlier shader version -mk + + float occlusionStrength; + float normalScale; + + float ior; + float perceptualRoughness; // roughness value, as authored by the model creator (input to shader) + vec3 f0_dielectric; + + float alphaRoughness; // roughness mapped to a more linear change in the roughness (proposed by [2]) + + float fresnel_w; + + vec3 f90; // reflectance color at grazing angle + vec3 f90_dielectric; + float metallic; + + vec3 baseColor; + + float sheenRoughnessFactor; + vec3 sheenColorFactor; + + vec3 clearcoatF0; + vec3 clearcoatF90; + float clearcoatFactor; + vec3 clearcoatNormal; + float clearcoatRoughness; + + // KHR_materials_specular + float specularWeight; // product of specularFactor and specularTexture.a + + float transmissionFactor; + )" + }, + { + "material_info2.glsl", R"( + float thickness; + vec3 attenuationColor; + float attenuationDistance; + + // KHR_materials_iridescence + float iridescenceFactor; + float iridescenceIor; + float iridescenceThickness; + + float diffuseTransmissionFactor; + vec3 diffuseTransmissionColorFactor; + + // KHR_materials_anisotropy + vec3 anisotropicT; + vec3 anisotropicB; + float anisotropyStrength; + + // KHR_materials_dispersion + float dispersion; + }; + + + // Get normal, tangent and bitangent vectors. + NormalInfo getNormalInfo(vec3 v) + { + vec2 UV = getNormalUV(); + vec2 uv_dx = dFdx(UV); + vec2 uv_dy = dFdy(UV); + + if (length(uv_dx) <= 1e-2) { + uv_dx = vec2(1.0, 0.0); + } + + if (length(uv_dy) <= 1e-2) { + uv_dy = vec2(0.0, 1.0); + } + + vec3 t_ = (uv_dy.t * dFdx(v_Position) - uv_dx.t * dFdy(v_Position)) / + (uv_dx.s * uv_dy.t - uv_dy.s * uv_dx.t); + + vec3 n, t, b, ng; + + // Compute geometrical TBN: + #ifdef HAS_NORMAL_VEC3 + #ifdef HAS_TANGENT_VEC4 + // Trivial TBN computation, present as vertex attribute. + // Normalize eigenvectors as matrix is linearly interpolated. + t = normalize(v_TBN[0]); + b = normalize(v_TBN[1]); + ng = normalize(v_TBN[2]); + #else + // Normals are either present as vertex attributes or approximated. + ng = normalize(v_Normal); + t = normalize(t_ - ng * dot(ng, t_)); + b = cross(ng, t); + #endif + #else + ng = normalize(cross(dFdx(v_Position), dFdy(v_Position))); + t = normalize(t_ - ng * dot(ng, t_)); + b = cross(ng, t); + #endif + + #ifndef NOT_TRIANGLE + // For a back-facing surface, the tangential basis vectors are negated. + if (gl_FrontFacing == false) + { + t *= -1.0; + b *= -1.0; + ng *= -1.0; + } + #endif + + // Compute normals: + NormalInfo info; + info.ng = ng; + #ifdef HAS_NORMAL_MAP + info.ntex = texture(u_NormalSampler, UV).rgb * 2.0 - vec3(1.0); + info.ntex *= vec3(u_NormalScale, u_NormalScale, 1.0); + info.ntex = normalize(info.ntex); + info.n = normalize(mat3(t, b, ng) * info.ntex); + #else + info.n = ng; + #endif + info.t = t; + info.b = b; + return info; + } + + + #ifdef MATERIAL_CLEARCOAT + vec3 getClearcoatNormal(NormalInfo normalInfo) + { + #ifdef HAS_CLEARCOAT_NORMAL_MAP + vec3 n = texture(u_ClearcoatNormalSampler, getClearcoatNormalUV()).rgb * 2.0 - vec3(1.0); + n *= vec3(u_ClearcoatNormalScale, u_ClearcoatNormalScale, 1.0); + n = mat3(normalInfo.t, normalInfo.b, normalInfo.ng) * normalize(n); + return n; + #else + return normalInfo.ng; + #endif + } + #endif + + )" + }, + { + "material_info3.glsl", R"( + vec4 getBaseColor() + { + vec4 baseColor = u_BaseColorFactor; + + #ifdef MATERIAL_UNLIT + #if defined(HAS_BASE_COLOR_MAP) + baseColor *= texture(u_BaseColorSampler, getBaseColorUV()); + #endif + return baseColor; + #else + #ifdef MATERIAL_METALLICROUGHNESS + #if defined(HAS_BASE_COLOR_MAP) + baseColor *= texture(u_BaseColorSampler, getBaseColorUV()); + #endif + #endif + return baseColor * getVertexColor(); + #endif + + } + + + #ifdef MATERIAL_METALLICROUGHNESS + MaterialInfo getMetallicRoughnessInfo(MaterialInfo info) + { + info.metallic = u_MetallicFactor; + info.perceptualRoughness = u_RoughnessFactor; + + #ifdef HAS_METALLIC_ROUGHNESS_MAP + // Roughness is stored in the 'g' channel, metallic is stored in the 'b' channel. + // This layout intentionally reserves the 'r' channel for (optional) occlusion map data + vec4 mrSample = texture(u_MetallicRoughnessSampler, getMetallicRoughnessUV()); + info.perceptualRoughness *= mrSample.g; + info.metallic *= mrSample.b; + #endif + + return info; + } + #endif + + + #ifdef MATERIAL_SHEEN + MaterialInfo getSheenInfo(MaterialInfo info) + { + info.sheenColorFactor = u_SheenColorFactor; + info.sheenRoughnessFactor = u_SheenRoughnessFactor; + + #ifdef HAS_SHEEN_COLOR_MAP + vec4 sheenColorSample = texture(u_SheenColorSampler, getSheenColorUV()); + info.sheenColorFactor *= sheenColorSample.rgb; + #endif + + #ifdef HAS_SHEEN_ROUGHNESS_MAP + vec4 sheenRoughnessSample = texture(u_SheenRoughnessSampler, getSheenRoughnessUV()); + info.sheenRoughnessFactor *= sheenRoughnessSample.a; + #endif + return info; + } + #endif + + + #ifdef MATERIAL_SPECULAR + MaterialInfo getSpecularInfo(MaterialInfo info) + { + vec4 specularTexture = vec4(1.0); + #ifdef HAS_SPECULAR_MAP + specularTexture.a = texture(u_SpecularSampler, getSpecularUV()).a; + #endif + #ifdef HAS_SPECULAR_COLOR_MAP + specularTexture.rgb = texture(u_SpecularColorSampler, getSpecularColorUV()).rgb; + #endif + + info.f0_dielectric = min(info.f0_dielectric * u_KHR_materials_specular_specularColorFactor * specularTexture.rgb, vec3(1.0)); + info.specularWeight = u_KHR_materials_specular_specularFactor * specularTexture.a; + info.f90_dielectric = vec3(info.specularWeight); + return info; + } + #endif + + + #ifdef MATERIAL_TRANSMISSION + MaterialInfo getTransmissionInfo(MaterialInfo info) + { + info.transmissionFactor = u_TransmissionFactor; + + #ifdef HAS_TRANSMISSION_MAP + vec4 transmissionSample = texture(u_TransmissionSampler, getTransmissionUV()); + info.transmissionFactor *= transmissionSample.r; + #endif + + #ifdef MATERIAL_DISPERSION + info.dispersion = u_Dispersion; + #else + info.dispersion = 0.0; + #endif + return info; + } + #endif + )" + }, + { + "material_info4.glsl", R"( + #ifdef MATERIAL_VOLUME + MaterialInfo getVolumeInfo(MaterialInfo info) + { + info.thickness = u_ThicknessFactor; + info.attenuationColor = u_AttenuationColor; + info.attenuationDistance = u_AttenuationDistance; + + #ifdef HAS_THICKNESS_MAP + vec4 thicknessSample = texture(u_ThicknessSampler, getThicknessUV()); + info.thickness *= thicknessSample.g; + #endif + return info; + } + #endif + + + #ifdef MATERIAL_IRIDESCENCE + MaterialInfo getIridescenceInfo(MaterialInfo info) + { + info.iridescenceFactor = u_IridescenceFactor; + info.iridescenceIor = u_IridescenceIor; + info.iridescenceThickness = u_IridescenceThicknessMaximum; + + #ifdef HAS_IRIDESCENCE_MAP + info.iridescenceFactor *= texture(u_IridescenceSampler, getIridescenceUV()).r; + #endif + + #ifdef HAS_IRIDESCENCE_THICKNESS_MAP + float thicknessSampled = texture(u_IridescenceThicknessSampler, getIridescenceThicknessUV()).g; + float thickness = mix(u_IridescenceThicknessMinimum, u_IridescenceThicknessMaximum, thicknessSampled); + info.iridescenceThickness = thickness; + #endif + + return info; + } + #endif + + + #ifdef MATERIAL_DIFFUSE_TRANSMISSION + MaterialInfo getDiffuseTransmissionInfo(MaterialInfo info) + { + info.diffuseTransmissionFactor = u_DiffuseTransmissionFactor; + info.diffuseTransmissionColorFactor = u_DiffuseTransmissionColorFactor; + + #ifdef HAS_DIFFUSE_TRANSMISSION_MAP + info.diffuseTransmissionFactor *= texture(u_DiffuseTransmissionSampler, getDiffuseTransmissionUV()).a; + #endif + + #ifdef HAS_DIFFUSE_TRANSMISSION_COLOR_MAP + info.diffuseTransmissionColorFactor *= texture(u_DiffuseTransmissionColorSampler, getDiffuseTransmissionColorUV()).rgb; + #endif + + return info; + } + #endif + )" + }, + { + "material_info5.glsl", R"( + + #ifdef MATERIAL_CLEARCOAT + MaterialInfo getClearCoatInfo(MaterialInfo info, NormalInfo normalInfo) + { + info.clearcoatFactor = u_ClearcoatFactor; + info.clearcoatRoughness = u_ClearcoatRoughnessFactor; + info.clearcoatF0 = vec3(pow((info.ior - 1.0) / (info.ior + 1.0), 2.0)); + info.clearcoatF90 = vec3(1.0); + + #ifdef HAS_CLEARCOAT_MAP + vec4 clearcoatSample = texture(u_ClearcoatSampler, getClearcoatUV()); + info.clearcoatFactor *= clearcoatSample.r; + #endif + + #ifdef HAS_CLEARCOAT_ROUGHNESS_MAP + vec4 clearcoatSampleRoughness = texture(u_ClearcoatRoughnessSampler, getClearcoatRoughnessUV()); + info.clearcoatRoughness *= clearcoatSampleRoughness.g; + #endif + + info.clearcoatNormal = getClearcoatNormal(normalInfo); + info.clearcoatRoughness = clamp(info.clearcoatRoughness, 0.0, 1.0); + return info; + } + #endif + + + #ifdef MATERIAL_IOR + MaterialInfo getIorInfo(MaterialInfo info) + { + info.f0_dielectric = vec3(pow(( u_Ior - 1.0) / (u_Ior + 1.0), 2.0)); + info.ior = u_Ior; + return info; + } + #endif + + #ifdef MATERIAL_ANISOTROPY + MaterialInfo getAnisotropyInfo(MaterialInfo info, NormalInfo normalInfo) + { + vec2 direction = vec2(1.0, 0.0); + float strengthFactor = 1.0; + #ifdef HAS_ANISOTROPY_MAP + vec3 anisotropySample = texture(u_AnisotropySampler, getAnisotropyUV()).xyz; + direction = anisotropySample.xy * 2.0 - vec2(1.0); + strengthFactor = anisotropySample.z; + #endif + vec2 directionRotation = u_Anisotropy.xy; // cos(theta), sin(theta) + mat2 rotationMatrix = mat2(directionRotation.x, directionRotation.y, -directionRotation.y, directionRotation.x); + direction = rotationMatrix * direction.xy; + + info.anisotropicT = mat3(normalInfo.t, normalInfo.b, normalInfo.n) * normalize(vec3(direction, 0.0)); + info.anisotropicB = cross(normalInfo.ng, info.anisotropicT); + info.anisotropyStrength = clamp(u_Anisotropy.z * strengthFactor, 0.0, 1.0); + return info; + } + #endif + + + float albedoSheenScalingLUT(float NdotV, float sheenRoughnessFactor) + { + //return NdotV; + return texture(u_SheenELUT, vec2(NdotV, sheenRoughnessFactor)).r; + } + + )" + }, + { + "iridescence.glsl", R"( + const mat3 XYZ_TO_REC709 = mat3( + 3.2404542, -0.9692660, 0.0556434, + -1.5371385, 1.8760108, -0.2040259, + -0.4985314, 0.0415560, 1.0572252 + ); + + vec3 Fresnel0ToIor(vec3 fresnel0) { + vec3 sqrtF0 = sqrt(fresnel0); + return (vec3(1.0) + sqrtF0) / (vec3(1.0) - sqrtF0); + } + + vec3 IorToFresnel0(vec3 transmittedIor, float incidentIor) { + return sq((transmittedIor - vec3(incidentIor)) / (transmittedIor + vec3(incidentIor))); + } + + float IorToFresnel0(float transmittedIor, float incidentIor) { + return sq((transmittedIor - incidentIor) / (transmittedIor + incidentIor)); + } + + vec3 evalSensitivity(float OPD, vec3 shift) { + float phase = 2.0 * M_PI * OPD * 1.0e-9; + vec3 val = vec3(5.4856e-13, 4.4201e-13, 5.2481e-13); + vec3 pos = vec3(1.6810e+06, 1.7953e+06, 2.2084e+06); + vec3 var = vec3(4.3278e+09, 9.3046e+09, 6.6121e+09); + + vec3 xyz = val * sqrt(2.0 * M_PI * var) * cos(pos * phase + shift) * exp(-sq(phase) * var); + xyz.x += 9.7470e-14 * sqrt(2.0 * M_PI * 4.5282e+09) * cos(2.2399e+06 * phase + shift[0]) * exp(-4.5282e+09 * sq(phase)); + xyz /= 1.0685e-7; + + vec3 srgb = XYZ_TO_REC709 * xyz; + return srgb; + } + + vec3 evalIridescence(float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0) { + vec3 I; + + // Force iridescenceIor -> outsideIOR when thinFilmThickness -> 0.0 + float iridescenceIor = mix(outsideIOR, eta2, smoothstep(0.0, 0.03, thinFilmThickness)); + // Evaluate the cosTheta on the base layer (Snell law) + float sinTheta2Sq = sq(outsideIOR / iridescenceIor) * (1.0 - sq(cosTheta1)); + + // Handle TIR: + float cosTheta2Sq = 1.0 - sinTheta2Sq; + if (cosTheta2Sq < 0.0) { + return vec3(1.0); + } + + float cosTheta2 = sqrt(cosTheta2Sq); + + // First interface + float R0 = IorToFresnel0(iridescenceIor, outsideIOR); + float R12 = F_Schlick(R0, cosTheta1); + float R21 = R12; + float T121 = 1.0 - R12; + float phi12 = 0.0; + if (iridescenceIor < outsideIOR) phi12 = M_PI; + float phi21 = M_PI - phi12; + + // Second interface + vec3 baseIOR = Fresnel0ToIor(clamp(baseF0, 0.0, 0.9999)); // guard against 1.0 + vec3 R1 = IorToFresnel0(baseIOR, iridescenceIor); + vec3 R23 = F_Schlick(R1, cosTheta2); + vec3 phi23 = vec3(0.0); + if (baseIOR[0] < iridescenceIor) phi23[0] = M_PI; + if (baseIOR[1] < iridescenceIor) phi23[1] = M_PI; + if (baseIOR[2] < iridescenceIor) phi23[2] = M_PI; + + // Phase shift + float OPD = 2.0 * iridescenceIor * thinFilmThickness * cosTheta2; + vec3 phi = vec3(phi21) + phi23; + + // Compound terms + vec3 R123 = clamp(R12 * R23, 1e-5, 0.9999); + vec3 r123 = sqrt(R123); + vec3 Rs = sq(T121) * R23 / (vec3(1.0) - R123); + + // Reflectance term for m = 0 (DC term amplitude) + vec3 C0 = R12 + Rs; + I = C0; + + // Reflectance term for m > 0 (pairs of diracs) + vec3 Cm = Rs - T121; + for (int m = 1; m <= 2; ++m) + { + Cm *= r123; + vec3 Sm = 2.0 * evalSensitivity(float(m) * OPD, float(m) * phi); + I += Cm * Sm; + } + + // Since out of gamut colors might be produced, negative color values are clamped to 0. + return max(I, vec3(0.0)); + } + )" + }, + { + "animation1.glsl", R"( + + #ifdef HAS_MORPH_TARGETS + uniform highp sampler2DArray u_MorphTargetsSampler; + #endif + + #ifdef USE_MORPHING + uniform float u_morphWeights[WEIGHT_COUNT]; + #endif + + #ifdef HAS_JOINTS_0_VEC4 + in vec4 a_joints_0; + #endif + + #ifdef HAS_JOINTS_1_VEC4 + in vec4 a_joints_1; + #endif + + #ifdef HAS_WEIGHTS_0_VEC4 + in vec4 a_weights_0; + #endif + + #ifdef HAS_WEIGHTS_1_VEC4 + in vec4 a_weights_1; + #endif + + #ifdef USE_SKINNING + uniform sampler2D u_jointsSampler; + #endif + + #ifdef USE_SKINNING + + mat4 getMatrixFromTexture(sampler2D s, int index) + { + mat4 result = mat4(1); + int texSize = textureSize(s, 0)[0]; + int pixelIndex = index * 4; + for (int i = 0; i < 4; ++i) + { + int x = (pixelIndex + i) % texSize; + //Rounding mode of integers is undefined: + //https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf (section 12.33) + int y = (pixelIndex + i - x) / texSize; + result[i] = texelFetch(s, ivec2(x,y), 0); + } + return result; + } + + mat4 getSkinningMatrix() + { + mat4 skin = mat4(0); + + #if defined(HAS_WEIGHTS_0_VEC4) && defined(HAS_JOINTS_0_VEC4) + skin += + a_weights_0.x * getMatrixFromTexture(u_jointsSampler, int(a_joints_0.x) * 2) + + a_weights_0.y * getMatrixFromTexture(u_jointsSampler, int(a_joints_0.y) * 2) + + a_weights_0.z * getMatrixFromTexture(u_jointsSampler, int(a_joints_0.z) * 2) + + a_weights_0.w * getMatrixFromTexture(u_jointsSampler, int(a_joints_0.w) * 2); + #endif + + #if defined(HAS_WEIGHTS_1_VEC4) && defined(HAS_JOINTS_1_VEC4) + skin += + a_weights_1.x * getMatrixFromTexture(u_jointsSampler, int(a_joints_1.x) * 2) + + a_weights_1.y * getMatrixFromTexture(u_jointsSampler, int(a_joints_1.y) * 2) + + a_weights_1.z * getMatrixFromTexture(u_jointsSampler, int(a_joints_1.z) * 2) + + a_weights_1.w * getMatrixFromTexture(u_jointsSampler, int(a_joints_1.w) * 2); + #endif + if (skin == mat4(0)) { + return mat4(1); + } + return skin; + } + + + mat4 getSkinningNormalMatrix() + { + mat4 skin = mat4(0); + + #if defined(HAS_WEIGHTS_0_VEC4) && defined(HAS_JOINTS_0_VEC4) + skin += + a_weights_0.x * getMatrixFromTexture(u_jointsSampler, int(a_joints_0.x) * 2 + 1) + + a_weights_0.y * getMatrixFromTexture(u_jointsSampler, int(a_joints_0.y) * 2 + 1) + + a_weights_0.z * getMatrixFromTexture(u_jointsSampler, int(a_joints_0.z) * 2 + 1) + + a_weights_0.w * getMatrixFromTexture(u_jointsSampler, int(a_joints_0.w) * 2 + 1); + #endif + + #if defined(HAS_WEIGHTS_1_VEC4) && defined(HAS_JOINTS_1_VEC4) + skin += + a_weights_1.x * getMatrixFromTexture(u_jointsSampler, int(a_joints_1.x) * 2 + 1) + + a_weights_1.y * getMatrixFromTexture(u_jointsSampler, int(a_joints_1.y) * 2 + 1) + + a_weights_1.z * getMatrixFromTexture(u_jointsSampler, int(a_joints_1.z) * 2 + 1) + + a_weights_1.w * getMatrixFromTexture(u_jointsSampler, int(a_joints_1.w) * 2 + 1); + #endif + if (skin == mat4(0)) { + return mat4(1); + } + return skin; + } + + #endif // !USE_SKINNING + + )" + }, + { + "animation2.glsl", R"( + #ifdef USE_MORPHING + + #ifdef HAS_MORPH_TARGETS + vec4 getDisplacement(int vertexID, int targetIndex, int texSize) + { + int x = vertexID % texSize; + //Rounding mode of integers is undefined: + //https://www.khronos.org/registry/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf (section 12.33) + int y = (vertexID - x) / texSize; + return texelFetch(u_MorphTargetsSampler, ivec3(x, y, targetIndex), 0); + } + #endif + + + vec4 getTargetPosition(int vertexID) + { + vec4 pos = vec4(0); + #ifdef HAS_MORPH_TARGET_POSITION + int texSize = textureSize(u_MorphTargetsSampler, 0)[0]; + for(int i = 0; i < WEIGHT_COUNT; i++) + { + vec4 displacement = getDisplacement(vertexID, MORPH_TARGET_POSITION_OFFSET + i, texSize); + pos += u_morphWeights[i] * displacement; + } + #endif + + return pos; + } + + vec3 getTargetNormal(int vertexID) + { + vec3 normal = vec3(0); + + #ifdef HAS_MORPH_TARGET_NORMAL + int texSize = textureSize(u_MorphTargetsSampler, 0)[0]; + for(int i = 0; i < WEIGHT_COUNT; i++) + { + vec3 displacement = getDisplacement(vertexID, MORPH_TARGET_NORMAL_OFFSET + i, texSize).xyz; + normal += u_morphWeights[i] * displacement; + } + #endif + + return normal; + } + + + vec3 getTargetTangent(int vertexID) + { + vec3 tangent = vec3(0); + + #ifdef HAS_MORPH_TARGET_TANGENT + int texSize = textureSize(u_MorphTargetsSampler, 0)[0]; + for(int i = 0; i < WEIGHT_COUNT; i++) + { + vec3 displacement = getDisplacement(vertexID, MORPH_TARGET_TANGENT_OFFSET + i, texSize).xyz; + tangent += u_morphWeights[i] * displacement; + } + #endif + + return tangent; + } + + vec2 getTargetTexCoord0(int vertexID) + { + vec2 uv = vec2(0); + + #ifdef HAS_MORPH_TARGET_TEXCOORD_0 + int texSize = textureSize(u_MorphTargetsSampler, 0)[0]; + for(int i = 0; i < WEIGHT_COUNT; i++) + { + vec2 displacement = getDisplacement(vertexID, MORPH_TARGET_TEXCOORD_0_OFFSET + i, texSize).xy; + uv += u_morphWeights[i] * displacement; + } + #endif + + return uv; + } + + vec2 getTargetTexCoord1(int vertexID) + { + vec2 uv = vec2(0); + + #ifdef HAS_MORPH_TARGET_TEXCOORD_1 + int texSize = textureSize(u_MorphTargetsSampler, 0)[0]; + for(int i = 0; i < WEIGHT_COUNT; i++) + { + vec2 displacement = getDisplacement(vertexID, MORPH_TARGET_TEXCOORD_1_OFFSET + i, texSize).xy; + uv += u_morphWeights[i] * displacement; + } + #endif + + return uv; + } + + vec4 getTargetColor0(int vertexID) + { + vec4 color = vec4(0); + + #ifdef HAS_MORPH_TARGET_COLOR_0 + int texSize = textureSize(u_MorphTargetsSampler, 0)[0]; + for(int i = 0; i < WEIGHT_COUNT; i++) + { + vec4 displacement = getDisplacement(vertexID, MORPH_TARGET_COLOR_0_OFFSET + i, texSize); + color += u_morphWeights[i] * displacement; + } + #endif + + return color; + } + + #endif // !USE_MORPHING + )" + }, + { + "vert_v1_chunk_00.glsl", R"( + + #ifdef HAS_NORMAL_VEC3 + in vec3 a_normal; + #endif + + #ifdef HAS_NORMAL_VEC3 + #ifdef HAS_TANGENT_VEC4 + in vec4 a_tangent; + out mat3 v_TBN; + #else + out vec3 v_Normal; + #endif + #endif + + #ifdef HAS_TEXCOORD_0_VEC2 + in vec2 a_texcoord_0; + #endif + + #ifdef HAS_TEXCOORD_1_VEC2 + in vec2 a_texcoord_1; + #endif + + out vec2 v_texcoord_0; + out vec2 v_texcoord_1; + + #ifdef HAS_COLOR_0_VEC3 + in vec3 a_color_0; + out vec3 v_Color; + #endif + + #ifdef HAS_COLOR_0_VEC4 + in vec4 a_color_0; + out vec4 v_Color; + #endif + + #ifdef USE_INSTANCING + in mat4 a_instance_model_matrix; + #endif + + #ifdef HAS_VERT_NORMAL_UV_TRANSFORM + uniform mat3 u_vertNormalUVTransform; + #endif + + vec4 getPosition() + { + vec4 pos = vec4(a_position, 1.0); + + #ifdef USE_MORPHING + pos += getTargetPosition(gl_VertexID); + #endif + + #ifdef USE_SKINNING + pos = getSkinningMatrix() * pos; + #endif + + return pos; + } + + + #ifdef HAS_NORMAL_VEC3 + vec3 getNormal() + { + vec3 normal = a_normal; + + #ifdef USE_MORPHING + normal += getTargetNormal(gl_VertexID); + #endif + + #ifdef USE_SKINNING + normal = mat3(getSkinningNormalMatrix()) * normal; + #endif + + return normalize(normal); + } + #endif + + #ifdef HAS_NORMAL_VEC3 + #ifdef HAS_TANGENT_VEC4 + vec3 getTangent() + { + vec3 tangent = a_tangent.xyz; + + #ifdef USE_MORPHING + tangent += getTargetTangent(gl_VertexID); + #endif + + )" + }, + { + "vert_v1_chunk_01.glsl", R"( + #ifdef USE_SKINNING + tangent = mat3(getSkinningMatrix()) * tangent; + #endif + + return normalize(tangent); + } + #endif + #endif + + mat4 temp_makeNormalMatrixFromViewProj(mat4 _viewProjModelMatrix) { + mat4 normMat = _viewProjModelMatrix ; + normMat[0][0] = 1.0; + normMat[0][1] = 0.0; + normMat[0][2] = 0.0; + normMat[0][3] = 0.0; + normMat[1][0] = 0.0; + normMat[1][3] = 0.0; + normMat[2][0] = 0.0; + normMat[2][3] = 0.0; + normMat[3][0] = 0.0; + normMat[3][1] = 0.0; + normMat[3][2] = 0.0; + normMat[3][3] = 1.0; + return normMat; + } + + void main() + { + gl_PointSize = 1.0f; + #ifdef USE_INSTANCING + mat4 modelMatrix = a_instance_model_matrix; + mat4 normalMatrix = transpose(inverse(modelMatrix)); + #else + mat4 modelMatrix = u_ModelMatrix; + //mat4 normalMatrix = u_NormalMatrix; + mat4 normalMatrix = transpose(inverse(modelMatrix)); + + #endif + vec4 pos = modelMatrix * getPosition(); + v_Position = vec3(pos.xyz) / pos.w; + + #ifdef HAS_NORMAL_VEC3 + #ifdef HAS_TANGENT_VEC4 + vec3 tangent = getTangent(); + vec3 normalW = normalize(vec3(normalMatrix * vec4(getNormal(), 0.0))); + vec3 tangentW = vec3(modelMatrix * vec4(tangent, 0.0)); + vec3 bitangentW = cross(normalW, tangentW) * a_tangent.w; + + #ifdef HAS_VERT_NORMAL_UV_TRANSFORM + tangentW = u_vertNormalUVTransform * tangentW; + bitangentW = u_vertNormalUVTransform * bitangentW; + #endif + + bitangentW = normalize(bitangentW); + tangentW = normalize(tangentW); + + v_TBN = mat3(tangentW, bitangentW, normalW); + #else + v_Normal = normalize(vec3(normalMatrix * vec4(getNormal(), 0.0))); + #endif + #endif + + v_texcoord_0 = vec2(0.0, 0.0); + v_texcoord_1 = vec2(0.0, 0.0); + + #ifdef HAS_TEXCOORD_0_VEC2 + v_texcoord_0 = a_texcoord_0; + #endif + + #ifdef HAS_TEXCOORD_1_VEC2 + v_texcoord_1 = a_texcoord_1; + #endif + + #ifdef USE_MORPHING + v_texcoord_0 += getTargetTexCoord0(gl_VertexID); + v_texcoord_1 += getTargetTexCoord1(gl_VertexID); + #endif + + + #if defined(HAS_COLOR_0_VEC3) + v_Color = a_color_0; + #if defined(USE_MORPHING) + v_Color = clamp(v_Color + getTargetColor0(gl_VertexID).xyz, 0.0f, 1.0f); + #endif + #endif + + #if defined(HAS_COLOR_0_VEC4) + v_Color = a_color_0; + #if defined(USE_MORPHING) + v_Color = clamp(v_Color + getTargetColor0(gl_VertexID), 0.0f, 1.0f); + #endif + #endif + + gl_Position = u_ViewProjectionMatrix * pos; + } + )" + }, + { + "frag_v1_chunk_00.glsl", R"( + out vec4 g_finalColor; + void main() + { + + vec4 baseColor = getBaseColor(); + + #if ALPHAMODE == _OPAQUE + baseColor.a = 1.0; + #endif + + vec4 temp_origBaseColor = baseColor; + + vec3 color = vec3(0); + + vec3 v = normalize(u_Camera - v_Position); + + NormalInfo normalInfo = getNormalInfo(v); + vec3 n = normalInfo.n; + vec3 t = normalInfo.t; + vec3 b = normalInfo.b; + + float NdotV = clampedDot(n, v); + float TdotV = clampedDot(t, v); + float BdotV = clampedDot(b, v); + + MaterialInfo materialInfo; + materialInfo.baseColor = baseColor.rgb; + + // The default index of refraction of 1.5 yields a dielectric normal incidence reflectance of 0.04. + materialInfo.ior = 1.5; + materialInfo.f0_dielectric = vec3(0.04); + materialInfo.specularWeight = 1.0; + + // Anything less than 2% is physically impossible and is instead considered to be shadowing. Compare to "Real-Time-Rendering" 4th editon on page 325. + materialInfo.f90 = vec3(1.0); + materialInfo.f90_dielectric = materialInfo.f90; + + #ifdef MATERIAL_IOR + materialInfo = getIorInfo(materialInfo); + #endif + + #ifdef MATERIAL_METALLICROUGHNESS + materialInfo = getMetallicRoughnessInfo(materialInfo); + #endif + + #ifdef MATERIAL_SHEEN + materialInfo = getSheenInfo(materialInfo); + #endif + )" + }, + { + "frag_v1_chunk_01a.glsl", R"( + + #ifdef MATERIAL_CLEARCOAT + materialInfo = getClearCoatInfo(materialInfo, normalInfo); + #endif + + #ifdef MATERIAL_SPECULAR + materialInfo = getSpecularInfo(materialInfo); + #endif + + #ifdef MATERIAL_TRANSMISSION + materialInfo = getTransmissionInfo(materialInfo); + #endif + + #ifdef MATERIAL_VOLUME + materialInfo = getVolumeInfo(materialInfo); + #endif + + #ifdef MATERIAL_IRIDESCENCE + materialInfo = getIridescenceInfo(materialInfo); + #endif + + #ifdef MATERIAL_DIFFUSE_TRANSMISSION + materialInfo = getDiffuseTransmissionInfo(materialInfo); + #endif + + #ifdef MATERIAL_ANISOTROPY + materialInfo = getAnisotropyInfo(materialInfo, normalInfo); + #endif + + materialInfo.perceptualRoughness = clamp(materialInfo.perceptualRoughness, 0.0, 1.0); + materialInfo.metallic = clamp(materialInfo.metallic, 0.0, 1.0); + + // Roughness is authored as perceptual roughness; as is convention, + // convert to material roughness by squaring the perceptual roughness. + materialInfo.alphaRoughness = materialInfo.perceptualRoughness * materialInfo.perceptualRoughness; + + + // LIGHTING + vec3 f_specular_dielectric = vec3(0.0); + vec3 f_specular_metal = vec3(0.0); + vec3 f_diffuse = vec3(0.0); + vec3 f_dielectric_brdf_ibl = vec3(0.0); + vec3 f_metal_brdf_ibl = vec3(0.0); + vec3 f_emissive = vec3(0.0); + vec3 clearcoat_brdf = vec3(0.0); + vec3 f_sheen = vec3(0.0); + vec3 f_specular_transmission = vec3(0.0); + vec3 f_diffuse_transmission = vec3(0.0); + + float clearcoatFactor = 0.0; + vec3 clearcoatFresnel = vec3(0); + )" + }, + { + "frag_v1_chunk_01b.glsl", R"( + float albedoSheenScaling = 1.0; + float diffuseTransmissionThickness = 1.0; + + #ifdef MATERIAL_IRIDESCENCE + vec3 iridescenceFresnel_dielectric = evalIridescence(1.0, materialInfo.iridescenceIor, NdotV, materialInfo.iridescenceThickness, materialInfo.f0_dielectric); + vec3 iridescenceFresnel_metallic = evalIridescence(1.0, materialInfo.iridescenceIor, NdotV, materialInfo.iridescenceThickness, baseColor.rgb); + + if (materialInfo.iridescenceThickness == 0.0) { + materialInfo.iridescenceFactor = 0.0; + } + #endif + + #ifdef MATERIAL_DIFFUSE_TRANSMISSION + #ifdef MATERIAL_VOLUME + diffuseTransmissionThickness = materialInfo.thickness * + (length(vec3(u_ModelMatrix[0].xyz)) + length(vec3(u_ModelMatrix[1].xyz)) + length(vec3(u_ModelMatrix[2].xyz))) / 3.0; + #endif + #endif + + #ifdef MATERIAL_CLEARCOAT + clearcoatFactor = materialInfo.clearcoatFactor; + clearcoatFresnel = F_Schlick(materialInfo.clearcoatF0, materialInfo.clearcoatF90, clampedDot(materialInfo.clearcoatNormal, v)); + #endif + + // Calculate lighting contribution from image based lighting source (IBL) + + #if defined(USE_IBL) || defined(MATERIAL_TRANSMISSION) + + f_diffuse = getDiffuseLight(n) * baseColor.rgb ; + + #ifdef MATERIAL_DIFFUSE_TRANSMISSION + vec3 diffuseTransmissionIBL = getDiffuseLight(-n) * materialInfo.diffuseTransmissionColorFactor; + #ifdef MATERIAL_VOLUME + diffuseTransmissionIBL = applyVolumeAttenuation(diffuseTransmissionIBL, diffuseTransmissionThickness, materialInfo.attenuationColor, materialInfo.attenuationDistance); + #endif + f_diffuse = mix(f_diffuse, diffuseTransmissionIBL, materialInfo.diffuseTransmissionFactor); + #endif + + + #if defined(MATERIAL_TRANSMISSION) + f_specular_transmission = getIBLVolumeRefraction( + n, v, + materialInfo.perceptualRoughness, + baseColor.rgb, v_Position, u_ModelMatrix, u_ViewMatrix, u_ProjectionMatrix, + materialInfo.ior, materialInfo.thickness, materialInfo.attenuationColor, materialInfo.attenuationDistance, materialInfo.dispersion); + f_diffuse = mix(f_diffuse, f_specular_transmission, materialInfo.transmissionFactor); + #endif + )" + }, + { + "frag_v1_chunk_02a.glsl", R"( + + #ifdef MATERIAL_ANISOTROPY + f_specular_metal = getIBLRadianceAnisotropy(n, v, materialInfo.perceptualRoughness, materialInfo.anisotropyStrength, materialInfo.anisotropicB); + f_specular_dielectric = f_specular_metal; + #else + f_specular_metal = getIBLRadianceGGX(n, v, materialInfo.perceptualRoughness); + f_specular_dielectric = f_specular_metal; + #endif + + // Calculate fresnel mix for IBL + + vec3 f_metal_fresnel_ibl = getIBLGGXFresnel(n, v, materialInfo.perceptualRoughness, baseColor.rgb, 1.0); + f_metal_brdf_ibl = f_metal_fresnel_ibl * f_specular_metal; + + vec3 f_dielectric_fresnel_ibl = getIBLGGXFresnel(n, v, materialInfo.perceptualRoughness, materialInfo.f0_dielectric, materialInfo.specularWeight); + f_dielectric_brdf_ibl = mix(f_diffuse, f_specular_dielectric, f_dielectric_fresnel_ibl); + + #ifdef MATERIAL_IRIDESCENCE + f_metal_brdf_ibl = mix(f_metal_brdf_ibl, f_specular_metal * iridescenceFresnel_metallic, materialInfo.iridescenceFactor); + f_dielectric_brdf_ibl = mix(f_dielectric_brdf_ibl, rgb_mix(f_diffuse, f_specular_dielectric, iridescenceFresnel_dielectric), materialInfo.iridescenceFactor); + #endif + + #ifdef MATERIAL_CLEARCOAT + clearcoat_brdf = getIBLRadianceGGX(materialInfo.clearcoatNormal, v, materialInfo.clearcoatRoughness); + #endif + + #ifdef MATERIAL_SHEEN + f_sheen = getIBLRadianceCharlie(n, v, materialInfo.sheenRoughnessFactor, materialInfo.sheenColorFactor); + albedoSheenScaling = 1.0 - max3(materialInfo.sheenColorFactor) * albedoSheenScalingLUT(NdotV, materialInfo.sheenRoughnessFactor); + #endif + + color = mix(f_dielectric_brdf_ibl, f_metal_brdf_ibl, materialInfo.metallic); + color = f_sheen + color * albedoSheenScaling; + color = mix(color, clearcoat_brdf, clearcoatFactor * clearcoatFresnel); + + #ifdef HAS_OCCLUSION_MAP + float ao = 1.0; + ao = texture(u_OcclusionSampler, getOcclusionUV()).r; + color = color * (1.0 + u_OcclusionStrength * (ao - 1.0)); + //temp_origBaseColor.rgb *= (1.0 + u_OcclusionStrength * (ao - 1.0)); + + //color = vec4(1.0, 0.0, 0.5, 1.0); + #endif + + //#else // Temporary addition to enable occlusion maps in non-IBL mode, which isn't physically accurate and should eventually be removed. + //#ifdef HAS_OCCLUSION_MAP + // float ao = 1.0; + // ao = texture(u_OcclusionSampler, getOcclusionUV()).r; + // //color = vec3(1.0, 0.0, 0.5); + // color = color * (1.0 + u_OcclusionStrength * (ao - 1.0)); + //#endif + #endif //end USE_IBL + + + f_diffuse = vec3(0.0); + + )" + }, + { + "frag_v1_chunk_02b.glsl", R"( + + f_specular_dielectric = vec3(0.0); + f_specular_metal = vec3(0.0); + vec3 f_dielectric_brdf = vec3(0.0); + vec3 f_metal_brdf = vec3(0.0); + + #ifdef USE_PUNCTUAL + /* + Light temp_keylight = Light( + normalize(vec3(-0.1, -0.75, -0.45)), //vec3 direction + -1.0, //float range + vec3(1.0, 1.0, 1.0), //vec3 color + 1.0, //float intensity + vec3(0.0, 0.0, 0.0), //vec3 position + 0.0, //float innerConeCos + 0.0, //float outerConeCos + 0 //int type; + // const Type_Directional = 0; + // const Type_Point = 1; + // const Type_Spot = 2; + ); + Light temp_filllight = Light( + normalize(-vec3(-0.2, -0.65, -0.35)), //vec3 direction + -1.0, //float range + vec3(1.0, 1.0, 1.0), //vec3 color + 0.5, //float intensity + vec3(0.0, 0.0, 0.0), //vec3 position + 0.0, //float innerConeCos + 0.0, //float outerConeCos + 0 //int type; + // const Type_Directional = 0; + // const Type_Point = 1; + // const Type_Spot = 2; + ); + )" + }, + { + "frag_v1_chunk_03a.glsl", R"( + + u_Lights[1] = temp_keylight; + u_Lights[2] = temp_filllight; + */ + for (int i = 0; i < LIGHT_COUNT; ++i) + { + Light light = u_Lights[i+1]; + + vec3 pointToLight; + if (light.type != LightType_Directional) + { + pointToLight = light.position - v_Position; + } + else + { + pointToLight = -light.direction; + } + + // BSTF + + vec3 l = normalize(pointToLight); // Direction from surface point to light + vec3 h = normalize(l + v); // Direction of the vector between l and v, called halfway vector + float NdotL = clampedDot(n, l); + float NdotV = clampedDot(n, v); + float NdotH = clampedDot(n, h); + float LdotH = clampedDot(l, h); + float VdotH = clampedDot(v, h); + + vec3 dielectric_fresnel = F_Schlick(materialInfo.f0_dielectric * materialInfo.specularWeight, materialInfo.f90_dielectric, abs(VdotH)); + vec3 metal_fresnel = F_Schlick(baseColor.rgb, vec3(1.0), abs(VdotH)); + + vec3 lightIntensity = getLighIntensity(light, pointToLight); + + vec3 l_diffuse = lightIntensity * NdotL * BRDF_lambertian(baseColor.rgb); + vec3 l_specular_dielectric = vec3(0.0); + vec3 l_specular_metal = vec3(0.0); + vec3 l_dielectric_brdf = vec3(0.0); + vec3 l_metal_brdf = vec3(0.0); + vec3 l_clearcoat_brdf = vec3(0.0); + vec3 l_sheen = vec3(0.0); + float l_albedoSheenScaling = 1.0; + + #ifdef MATERIAL_DIFFUSE_TRANSMISSION + l_diffuse = l_diffuse * (1.0 - materialInfo.diffuseTransmissionFactor); + if (dot(n, l) < 0.0) { + float diffuseNdotL = clampedDot(-n, l); + vec3 diffuse_btdf = lightIntensity * diffuseNdotL * BRDF_lambertian(materialInfo.diffuseTransmissionColorFactor); + + vec3 l_mirror = normalize(l + 2.0 * n * dot(-l, n)); // Mirror light reflection vector on surface + float diffuseVdotH = clampedDot(v, normalize(l_mirror + v)); + dielectric_fresnel = F_Schlick(materialInfo.f0_dielectric * materialInfo.specularWeight, materialInfo.f90_dielectric, abs(diffuseVdotH)); + + #ifdef MATERIAL_VOLUME + diffuse_btdf = applyVolumeAttenuation(diffuse_btdf, diffuseTransmissionThickness, materialInfo.attenuationColor, materialInfo.attenuationDistance); + #endif + l_diffuse += diffuse_btdf * materialInfo.diffuseTransmissionFactor; + } + #endif // MATERIAL_DIFFUSE_TRANSMISSION + + //temp_origBaseColor.rgb = vec3(l_diffuse); + )" + }, + { + "frag_v1_chunk_03b.glsl", R"( + // BTDF (Bidirectional Transmittance Distribution Function) + #ifdef MATERIAL_TRANSMISSION + // If the light ray travels through the geometry, use the point it exits the geometry again. + // That will change the angle to the light source, if the material refracts the light ray. + vec3 transmissionRay = getVolumeTransmissionRay(n, v, materialInfo.thickness, materialInfo.ior, u_ModelMatrix); + pointToLight -= transmissionRay; + l = normalize(pointToLight); + + vec3 transmittedLight = lightIntensity * getPunctualRadianceTransmission(n, v, l, materialInfo.alphaRoughness, baseColor.rgb, materialInfo.ior); + + #ifdef MATERIAL_VOLUME + transmittedLight = applyVolumeAttenuation(transmittedLight, length(transmissionRay), materialInfo.attenuationColor, materialInfo.attenuationDistance); + #endif + l_diffuse = mix(l_diffuse, transmittedLight, materialInfo.transmissionFactor); + #endif + // Calculation of analytical light + // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#acknowledgments AppendixB + vec3 intensity = getLighIntensity(light, pointToLight); + + #ifdef MATERIAL_ANISOTROPY + l_specular_metal = intensity * NdotL * BRDF_specularGGXAnisotropy(materialInfo.alphaRoughness, materialInfo.anisotropyStrength, n, v, l, h, materialInfo.anisotropicT, materialInfo.anisotropicB); + l_specular_dielectric = l_specular_metal; + #else + l_specular_metal = intensity * NdotL * BRDF_specularGGX(materialInfo.alphaRoughness, NdotL, NdotV, NdotH); + l_specular_dielectric = l_specular_metal; + #endif + + l_metal_brdf = metal_fresnel * l_specular_metal; + l_dielectric_brdf = mix(l_diffuse, l_specular_dielectric, dielectric_fresnel); // Do we need to handle vec3 fresnel here? + + + #ifdef MATERIAL_IRIDESCENCE + l_metal_brdf = mix(l_metal_brdf, l_specular_metal * iridescenceFresnel_metallic, materialInfo.iridescenceFactor); + l_dielectric_brdf = mix(l_dielectric_brdf, rgb_mix(l_diffuse, l_specular_dielectric, iridescenceFresnel_dielectric), materialInfo.iridescenceFactor); + #endif + + #ifdef MATERIAL_CLEARCOAT + l_clearcoat_brdf = intensity * getPunctualRadianceClearCoat(materialInfo.clearcoatNormal, v, l, h, VdotH, + materialInfo.clearcoatF0, materialInfo.clearcoatF90, materialInfo.clearcoatRoughness); + #endif + + #ifdef MATERIAL_SHEEN + l_sheen = intensity * getPunctualRadianceSheen(materialInfo.sheenColorFactor, materialInfo.sheenRoughnessFactor, NdotL, NdotV, NdotH); + l_albedoSheenScaling = min(1.0 - max3(materialInfo.sheenColorFactor) * albedoSheenScalingLUT(NdotV, materialInfo.sheenRoughnessFactor), + 1.0 - max3(materialInfo.sheenColorFactor) * albedoSheenScalingLUT(NdotL, materialInfo.sheenRoughnessFactor)); + #endif + + //temp_origBaseColor.rgb = (l_metal_brdf + l_dielectric_brdf).xyz; + + vec3 l_color = mix(l_dielectric_brdf, l_metal_brdf, materialInfo.metallic); + l_color = l_sheen + l_color * l_albedoSheenScaling; + l_color = mix(l_color, l_clearcoat_brdf, clearcoatFactor * clearcoatFresnel); + color += l_color; + } + #endif // USE_PUNCTUAL + )" + }, + { + "frag_v1_chunk_04.glsl", R"( + f_emissive = u_EmissiveFactor; + #ifdef MATERIAL_EMISSIVE_STRENGTH + f_emissive *= u_EmissiveStrength; + #endif + #ifdef HAS_EMISSIVE_MAP + f_emissive *= texture(u_EmissiveSampler, getEmissiveUV()).rgb; + #endif + + + #ifdef MATERIAL_UNLIT + #ifdef HAS_EMISSIVE_MAP + color = f_emissive; + #else + color = baseColor.rgb; + #endif + #elif defined(NOT_TRIANGLE) && !defined(HAS_NORMAL_VEC3) + //Points or Lines with no NORMAL attribute SHOULD be rendered without lighting and instead use the sum of the base color value and the emissive value. + color = f_emissive + baseColor.rgb; + #else + color = f_emissive * (1.0 - clearcoatFactor * clearcoatFresnel) + color; + #endif + + //#if DEBUG == DEBUG_NONE + + #if ALPHAMODE == _MASK + // Late discard to avoid sampling artifacts. See https://github.com/KhronosGroup/glTF-Sample-Viewer/issues/267 + if (baseColor.a < u_AlphaCutoff) + { + discard; + } + baseColor.a = 1.0; + #endif + + // The red and blue channels are switched after any tonemapping + // They will be switched back the correct way by the 2D shader + #ifdef LINEAR_OUTPUT + g_finalColor = vec4(color.bgr, baseColor.a); + #else + g_finalColor = vec4(toneMap(color).bgr, baseColor.a); + #endif + + /* + #else + // In case of missing data for a debug view, render a checkerboard. + g_finalColor = vec4(1.0); + { + float frequency = 0.02; + float gray = 0.9; + + vec2 v1 = step(0.5, fract(frequency * gl_FragCoord.xy)); + vec2 v2 = step(0.5, vec2(1.0) - fract(frequency * gl_FragCoord.xy)); + g_finalColor.rgb *= gray + v1.x * v1.y + v2.x * v2.y; + } + #endif + + + + // Debug views: + + // Generic: + + #if DEBUG == DEBUG_UV_0 && defined(HAS_TEXCOORD_0_VEC2) + g_finalColor.rgb = vec3(v_texcoord_0, 0); + #endif + #if DEBUG == DEBUG_UV_1 && defined(HAS_TEXCOORD_1_VEC2) + g_finalColor.rgb = vec3(v_texcoord_1, 0); + #endif + #if DEBUG == DEBUG_NORMAL_TEXTURE && defined(HAS_NORMAL_MAP) + g_finalColor.rgb = (normalInfo.ntex + 1.0) / 2.0; + #endif + #if DEBUG == DEBUG_NORMAL_SHADING + g_finalColor.rgb = (n + 1.0) / 2.0; + #endif + #if DEBUG == DEBUG_NORMAL_GEOMETRY + g_finalColor.rgb = (normalInfo.ng + 1.0) / 2.0; + #endif + #if DEBUG == DEBUG_TANGENT + g_finalColor.rgb = (normalInfo.t + 1.0) / 2.0; + #endif + #if DEBUG == DEBUG_BITANGENT + g_finalColor.rgb = (normalInfo.b + 1.0) / 2.0; + #endif + #if DEBUG == DEBUG_ALPHA + g_finalColor.rgb = vec3(baseColor.a); + #endif + #if DEBUG == DEBUG_OCCLUSION && defined(HAS_OCCLUSION_MAP) + g_finalColor.rgb = vec3(ao); + #endif + #if DEBUG == DEBUG_EMISSIVE + g_finalColor.rgb = linearTosRGB(f_emissive); + #endif + + + #if DEBUG == DEBUG_METALLIC + g_finalColor.rgb = vec3(materialInfo.metallic); + #endif + #if DEBUG == DEBUG_ROUGHNESS + g_finalColor.rgb = vec3(materialInfo.perceptualRoughness); + #endif + #if DEBUG == DEBUG_BASE_COLOR + g_finalColor.rgb = linearTosRGB(materialInfo.baseColor); + #endif + )" + }, + { + "frag_v1_chunk_05.glsl", R"( + // Clearcoat: + #ifdef MATERIAL_CLEARCOAT + #if DEBUG == DEBUG_CLEARCOAT_FACTOR + g_finalColor.rgb = vec3(materialInfo.clearcoatFactor); + #endif + #if DEBUG == DEBUG_CLEARCOAT_ROUGHNESS + g_finalColor.rgb = vec3(materialInfo.clearcoatRoughness); + #endif + #if DEBUG == DEBUG_CLEARCOAT_NORMAL + g_finalColor.rgb = (materialInfo.clearcoatNormal + vec3(1)) / 2.0; + #endif + #endif + + // Sheen: + #ifdef MATERIAL_SHEEN + #if DEBUG == DEBUG_SHEEN_COLOR + g_finalColor.rgb = materialInfo.sheenColorFactor; + #endif + #if DEBUG == DEBUG_SHEEN_ROUGHNESS + g_finalColor.rgb = vec3(materialInfo.sheenRoughnessFactor); + #endif + #endif + + // Specular: + #ifdef MATERIAL_SPECULAR + #if DEBUG == DEBUG_SPECULAR_FACTOR + g_finalColor.rgb = vec3(materialInfo.specularWeight); + #endif + + #if DEBUG == DEBUG_SPECULAR_COLOR + vec3 specularTexture = vec3(1.0); + #ifdef HAS_SPECULAR_COLOR_MAP + specularTexture.rgb = texture(u_SpecularColorSampler, getSpecularColorUV()).rgb; + #endif + g_finalColor.rgb = u_KHR_materials_specular_specularColorFactor * specularTexture.rgb; + #endif + #endif + + // Transmission, Volume: + #ifdef MATERIAL_TRANSMISSION + #if DEBUG == DEBUG_TRANSMISSION_FACTOR + g_finalColor.rgb = vec3(materialInfo.transmissionFactor); + #endif + #endif + #ifdef MATERIAL_VOLUME + #if DEBUG == DEBUG_VOLUME_THICKNESS + g_finalColor.rgb = vec3(materialInfo.thickness / u_ThicknessFactor); + #endif + #endif + + // Iridescence: + #ifdef MATERIAL_IRIDESCENCE + #if DEBUG == DEBUG_IRIDESCENCE_FACTOR + g_finalColor.rgb = vec3(materialInfo.iridescenceFactor); + #endif + #if DEBUG == DEBUG_IRIDESCENCE_THICKNESS + g_finalColor.rgb = vec3(materialInfo.iridescenceThickness / 1200.0); + #endif + #endif + + // Anisotropy: + #ifdef MATERIAL_ANISOTROPY + #if DEBUG == DEBUG_ANISOTROPIC_STRENGTH + g_finalColor.rgb = vec3(materialInfo.anisotropyStrength); + #endif + #if DEBUG == DEBUG_ANISOTROPIC_DIRECTION + vec2 direction = vec2(1.0, 0.0); + #ifdef HAS_ANISOTROPY_MAP + direction = texture(u_AnisotropySampler, getAnisotropyUV()).xy; + direction = direction * 2.0 - vec2(1.0); // [0, 1] -> [-1, 1] + #endif + vec2 directionRotation = u_Anisotropy.xy; // cos(theta), sin(theta) + mat2 rotationMatrix = mat2(directionRotation.x, directionRotation.y, -directionRotation.y, directionRotation.x); + direction = (direction + vec2(1.0)) * 0.5; // [-1, 1] -> [0, 1] + + g_finalColor.rgb = vec3(direction, 0.0); + #endif + #endif + + // Diffuse Transmission: + #ifdef MATERIAL_DIFFUSE_TRANSMISSION + #if DEBUG == DEBUG_DIFFUSE_TRANSMISSION_FACTOR + g_finalColor.rgb = linearTosRGB(vec3(materialInfo.diffuseTransmissionFactor)); + #endif + #if DEBUG == DEBUG_DIFFUSE_TRANSMISSION_COLOR_FACTOR + g_finalColor.rgb = linearTosRGB(materialInfo.diffuseTransmissionColorFactor); + #endif + #endif + */ + } + )" + }, + + { + "cubemap.vert", R"( + uniform mat4 u_ViewProjectionMatrix; + uniform mat3 u_EnvRotation; + + in vec3 a_position; + out vec3 v_TexCoords; + + void main() + { + v_TexCoords = u_EnvRotation * a_position; + mat4 mat = u_ViewProjectionMatrix; + mat[3] = vec4(0.0, 0.0, 0.0, 0.1); + vec4 pos = mat * vec4(a_position, 1.0); + gl_Position = pos.xyww; + } + )" + }, + { + "cubemap.frag", R"( + precision highp float; +#include + uniform float u_EnvIntensity; + uniform float u_EnvBlurNormalized; + uniform int u_MipCount; + uniform samplerCube u_GGXEnvSampler; + + out vec4 FragColor; + in vec3 v_TexCoords; + + + void main() + { + vec4 color = textureLod(u_GGXEnvSampler, v_TexCoords, u_EnvBlurNormalized * float(u_MipCount - 1)); + color.rgb *= u_EnvIntensity; + color.a = 1.0; + + #ifdef LINEAR_OUTPUT + FragColor = color.rgba; + #else + FragColor = vec4(toneMap(color.rgb), color.a); + #endif + } + + )" + }, +}; + +static const lv_opengl_shader_t env_src_includes[] = { + { + "fullscreen.vert", R"( + precision lowp float; + // The vertex positions being supplied to this shader are + // always exactly 0 or 1, so low precision is fine here. + + in vec2 aPosition; + in vec2 aTexCoord; + + out vec2 texCoord; + + void main(void) + { + texCoord = aTexCoord; + gl_Position = vec4(aPosition, 0.0, 1.0); + } + )" + }, + { + "panorama_to_cubemap.frag", R"( + #define MATH_PI 3.1415926535897932384626433832795 + #define MATH_INV_PI (1.0 / MATH_PI) + + precision highp float; + + in vec2 texCoord; + out vec4 fragmentColor; + + uniform int u_currentFace; + uniform sampler2D u_panorama; + + vec3 uvToXYZ(int face, vec2 uv) + { + if(face == 0) + return vec3( 1.f, uv.y, -uv.x); + + else if(face == 1) + return vec3( -1.f, uv.y, uv.x); + + else if(face == 2) + return vec3( +uv.x, -1.f, +uv.y); + + else if(face == 3) + return vec3( +uv.x, 1.f, -uv.y); + + else if(face == 4) + return vec3( +uv.x, uv.y, 1.f); + + else //if(face == 5) + { return vec3( -uv.x, +uv.y, -1.f);} + } + + vec2 dirToUV(vec3 dir) + { + return vec2( + 0.5f + 0.5f * atan(dir.z, dir.x) / MATH_PI, + 1.f - acos(dir.y) / MATH_PI); + } + + vec3 panoramaToCubeMap(int face, vec2 texCoord) + { + vec2 texCoordNew = texCoord*2.0-1.0; + vec3 scan = uvToXYZ(face, texCoordNew); + vec3 direction = normalize(scan); + vec2 src = dirToUV(direction); + + return texture(u_panorama, src).rgb; + } + + void main(void) + { + fragmentColor = vec4(0.0, 0.0, 0.0, 1.0); + + fragmentColor.rgb = panoramaToCubeMap(u_currentFace, texCoord); + } + + )" + }, + { + "ibl_filtering.frag", R"( +#include +#include +#include +#include +#include +#include + )" + }, + { + "ibl_filtering1.glsl", R"( + + //#extension GL_ARB_separate_shader_objects : enable + + precision highp float; + #define MATH_PI 3.1415926535897932384626433832795 + //#define MATH_INV_PI (1.0 / MATH_PI) + + uniform samplerCube u_cubemapTexture; + + // enum + const int cLambertian = 0; + const int cGGX = 1; + const int cCharlie = 2; + + + //layout(push_constant) uniform FilterParameters { + uniform float u_roughness; + uniform int u_sampleCount; + uniform int u_width; + uniform float u_lodBias; + uniform int u_distribution; // enum + uniform int u_currentFace; + uniform int u_isGeneratingLUT; + + // 0: Byte Target Texture (normalized) + // 1: Float Target Texture + uniform int u_floatTexture; + + uniform float u_intensityScale; + + //layout (location = 0) in vec2 inUV; + in vec2 texCoord; + + + out vec4 fragmentColor; + + //layout(location = 6) out vec3 outLUT; + + + vec3 uvToXYZ(int face, vec2 uv) + { + if(face == 0) + return vec3( 1.f, uv.y, -uv.x); + + else if(face == 1) + return vec3( -1.f, uv.y, uv.x); + + else if(face == 2) + return vec3( +uv.x, -1.f, +uv.y); + + else if(face == 3) + return vec3( +uv.x, 1.f, -uv.y); + + else if(face == 4) + return vec3( +uv.x, uv.y, 1.f); + + else {//if(face == 5) + return vec3( -uv.x, +uv.y, -1.f);} + } + + vec2 dirToUV(vec3 dir) + { + return vec2( + 0.5f + 0.5f * atan(dir.z, dir.x) / MATH_PI, + 1.f - acos(dir.y) / MATH_PI); + } + + float saturate(float v) + { + return clamp(v, 0.0f, 1.0f); + } + + // Hammersley Points on the Hemisphere + // CC BY 3.0 (Holger Dammertz) + // http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html + // with adapted interface + float radicalInverse_VdC(uint bits) + { + bits = (bits << 16u) | (bits >> 16u); + bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); + bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); + bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); + bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); + return float(bits) * 2.3283064365386963e-10; // / 0x100000000 + } + )" + }, + { + "ibl_filtering2.glsl", R"( + // hammersley2d describes a sequence of points in the 2d unit square [0,1)^2 + // that can be used for quasi Monte Carlo integration + vec2 hammersley2d(int i, int N) { + return vec2(float(i)/float(N), radicalInverse_VdC(uint(i))); + } + + // Hemisphere Sample + + // TBN generates a tangent bitangent normal coordinate frame from the normal + // (the normal must be normalized) + mat3 generateTBN(vec3 normal) + { + vec3 bitangent = vec3(0.0, 1.0, 0.0); + + float NdotUp = dot(normal, vec3(0.0, 1.0, 0.0)); + float epsilon = 0.0000001; + if (1.0 - abs(NdotUp) <= epsilon) + { + // Sampling +Y or -Y, so we need a more robust bitangent. + if (NdotUp > 0.0) + { + bitangent = vec3(0.0, 0.0, 1.0); + } + else + { + bitangent = vec3(0.0, 0.0, -1.0); + } + } + + vec3 tangent = normalize(cross(bitangent, normal)); + bitangent = cross(normal, tangent); + + return mat3(tangent, bitangent, normal); + } + + struct MicrofacetDistributionSample + { + float pdf; + float cosTheta; + float sinTheta; + float phi; + }; + + float D_GGX(float NdotH, float roughness) { + float a = NdotH * roughness; + float k = roughness / (1.0 - NdotH * NdotH + a * a); + return k * k * (1.0 / MATH_PI); + } + + // GGX microfacet distribution + // https://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.html + // This implementation is based on https://bruop.github.io/ibl/, + // https://www.tobias-franke.eu/log/2014/03/30/notes_on_importance_sampling.html + // and https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch20.html + MicrofacetDistributionSample GGX(vec2 xi, float roughness) + { + MicrofacetDistributionSample ggx; + + // evaluate sampling equations + float alpha = roughness * roughness; + ggx.cosTheta = saturate(sqrt((1.0 - xi.y) / (1.0 + (alpha * alpha - 1.0) * xi.y))); + ggx.sinTheta = sqrt(1.0 - ggx.cosTheta * ggx.cosTheta); + ggx.phi = 2.0 * MATH_PI * xi.x; + + // evaluate GGX pdf (for half vector) + ggx.pdf = D_GGX(ggx.cosTheta, alpha); + + // Apply the Jacobian to obtain a pdf that is parameterized by l + // see https://bruop.github.io/ibl/ + // Typically you'd have the following: + // float pdf = D_GGX(NoH, roughness) * NoH / (4.0 * VoH); + // but since V = N => VoH == NoH + ggx.pdf /= 4.0; + + return ggx; + } + + // NDF + float D_Ashikhmin(float NdotH, float roughness) + { + float alpha = roughness * roughness; + // Ashikhmin 2007, "Distribution-based BRDFs" + float a2 = alpha * alpha; + float cos2h = NdotH * NdotH; + float sin2h = 1.0 - cos2h; + float sin4h = sin2h * sin2h; + float cot2 = -cos2h / (a2 * sin2h); + return 1.0 / (MATH_PI * (4.0 * a2 + 1.0) * sin4h) * (4.0 * exp(cot2) + sin4h); + } + )" + }, + { + "ibl_filtering3.glsl", R"( + // NDF + float D_Charlie(float sheenRoughness, float NdotH) + { + sheenRoughness = max(sheenRoughness, 0.000001); //clamp (0,1] + float invR = 1.0 / sheenRoughness; + float cos2h = NdotH * NdotH; + float sin2h = 1.0 - cos2h; + return (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * MATH_PI); + } + + + MicrofacetDistributionSample Charlie(vec2 xi, float roughness) + { + MicrofacetDistributionSample charlie; + + float alpha = roughness * roughness; + charlie.sinTheta = pow(xi.y, alpha / (2.0*alpha + 1.0)); + charlie.cosTheta = sqrt(1.0 - charlie.sinTheta * charlie.sinTheta); + charlie.phi = 2.0 * MATH_PI * xi.x; + + // evaluate Charlie pdf (for half vector) + charlie.pdf = D_Charlie(alpha, charlie.cosTheta); + + // Apply the Jacobian to obtain a pdf that is parameterized by l + charlie.pdf /= 4.0; + + return charlie; + } + + MicrofacetDistributionSample Lambertian(vec2 xi, float roughness) + { + MicrofacetDistributionSample lambertian; + + // Cosine weighted hemisphere sampling + // http://www.pbr-book.org/3ed-2018/Monte_Carlo_Integration/2D_Sampling_with_Multidimensional_Transformations.html#Cosine-WeightedHemisphereSampling + lambertian.cosTheta = sqrt(1.0 - xi.y); + lambertian.sinTheta = sqrt(xi.y); // equivalent to `sqrt(1.0 - cosTheta*cosTheta)`; + lambertian.phi = 2.0 * MATH_PI * xi.x; + + lambertian.pdf = lambertian.cosTheta / MATH_PI; // evaluation for solid angle, therefore drop the sinTheta + + return lambertian; + } + + + // getImportanceSample returns an importance sample direction with pdf in the .w component + vec4 getImportanceSample(int sampleIndex, vec3 N, float roughness) + { + // generate a quasi monte carlo point in the unit square [0.1)^2 + vec2 xi = hammersley2d(sampleIndex, u_sampleCount); + + MicrofacetDistributionSample importanceSample; + + // generate the points on the hemisphere with a fitting mapping for + // the distribution (e.g. lambertian uses a cosine importance) + if(u_distribution == cLambertian) + { + importanceSample = Lambertian(xi, roughness); + } + else if(u_distribution == cGGX) + { + // Trowbridge-Reitz / GGX microfacet model (Walter et al) + // https://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.html + importanceSample = GGX(xi, roughness); + } + else if(u_distribution == cCharlie) + { + importanceSample = Charlie(xi, roughness); + } + + // transform the hemisphere sample to the normal coordinate frame + // i.e. rotate the hemisphere to the normal direction + vec3 localSpaceDirection = normalize(vec3( + importanceSample.sinTheta * cos(importanceSample.phi), + importanceSample.sinTheta * sin(importanceSample.phi), + importanceSample.cosTheta + )); + mat3 TBN = generateTBN(N); + vec3 direction = TBN * localSpaceDirection; + + return vec4(direction, importanceSample.pdf); + } + )" + }, + { + "ibl_filtering4.glsl", R"( + // Mipmap Filtered Samples (GPU Gems 3, 20.4) + // https://developer.nvidia.com/gpugems/gpugems3/part-iii-rendering/chapter-20-gpu-based-importance-sampling + // https://cgg.mff.cuni.cz/~jaroslav/papers/2007-sketch-fis/Final_sap_0073.pdf + float computeLod(float pdf) + { + // // Solid angle of current sample -- bigger for less likely samples + //float omegaS = 1.0 / (float(u_sampleCount) * pdf); + // // Solid angle of texel + // // note: the factor of 4.0 * MATH_PI + //float omegaP = 4.0 * MATH_PI / (6.0 * float(u_width) * float(u_width)); + // // Mip level is determined by the ratio of our sample's solid angle to a texel's solid angle + // // note that 0.5 * log2 is equivalent to log4 + //float lod = 0.5 * log2(omegaS / omegaP); + + // babylon introduces a factor of K (=4) to the solid angle ratio + // this helps to avoid undersampling the environment map + // this does not appear in the original formulation by Jaroslav Krivanek and Mark Colbert + // log4(4) == 1 + // lod += 1.0; + + // We achieved good results by using the original formulation from Krivanek & Colbert adapted to cubemaps + + // https://cgg.mff.cuni.cz/~jaroslav/papers/2007-sketch-fis/Final_sap_0073.pdf + float lod = 0.5 * log2( 6.0 * float(u_width) * float(u_width) / (float(u_sampleCount) * pdf)); + //float lod = 0.5 * log2( 3.0 * float(u_width) * float(u_width) / (float(u_sampleCount) * pdf)); + + + return lod; + } + + vec3 filterColor(vec3 N) + { + //return textureLod(u_cubemapTexture, N, 3.0).rgb; + vec3 color = vec3(0.f); + float weight = 0.0f; + + for(int i = 0; i < u_sampleCount; ++i) + { + vec4 importanceSample = getImportanceSample(i, N, u_roughness); + + vec3 H = vec3(importanceSample.xyz); + float pdf = importanceSample.w; + + // mipmap filtered samples (GPU Gems 3, 20.4) + float lod = computeLod(pdf); + + // apply the bias to the lod + lod += u_lodBias; + + if(u_distribution == cLambertian) + { + // sample lambertian at a lower resolution to avoid fireflies + vec3 lambertian = textureLod(u_cubemapTexture, H, lod).rgb * u_intensityScale; + + //// the below operations cancel each other out + // lambertian *= NdotH; // lamberts law + // lambertian /= pdf; // invert bias from importance sampling + // lambertian /= MATH_PI; // convert irradiance to radiance https://seblagarde.wordpress.com/2012/01/08/pi-or-not-to-pi-in-game-lighting-equation/ + + color += lambertian; + } + else if(u_distribution == cGGX || u_distribution == cCharlie) + { + // Note: reflect takes incident vector. + vec3 V = N; + vec3 L = normalize(reflect(-V, H)); + + float NdotL = dot(N, L); + + if (NdotL > 0.0) + { + if(u_roughness == 0.0) + { + // without this the roughness=0 lod is too high + lod = u_lodBias; + } + vec3 sampleColor = textureLod(u_cubemapTexture, L, lod).rgb * u_intensityScale; + color += sampleColor * NdotL; + weight += NdotL; + } + } + } + + if(weight != 0.0f) + { + color /= weight; + } + else + { + color /= float(u_sampleCount); + } + + return color.rgb ; + } + )" + }, + { + "ibl_filtering5.glsl", R"( + // From the filament docs. Geometric Shadowing function + // https://google.github.io/filament/Filament.html#toc4.4.2 + float V_SmithGGXCorrelated(float NoV, float NoL, float roughness) { + float a2 = pow(roughness, 4.0); + float GGXV = NoL * sqrt(NoV * NoV * (1.0 - a2) + a2); + float GGXL = NoV * sqrt(NoL * NoL * (1.0 - a2) + a2); + return 0.5 / (GGXV + GGXL); + } + + // https://github.com/google/filament/blob/master/shaders/src/brdf.fs#L136 + float V_Ashikhmin(float NdotL, float NdotV) + { + return clamp(1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV)), 0.0, 1.0); + } + + // Compute LUT for GGX distribution. + // See https://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf + vec3 LUT(float NdotV, float roughness) + { + // Compute spherical view vector: (sin(phi), 0, cos(phi)) + vec3 V = vec3(sqrt(1.0 - NdotV * NdotV), 0.0, NdotV); + + // The macro surface normal just points up. + vec3 N = vec3(0.0, 0.0, 1.0); + + // To make the LUT independant from the material's F0, which is part of the Fresnel term + // when substituted by Schlick's approximation, we factor it out of the integral, + // yielding to the form: F0 * I1 + I2 + // I1 and I2 are slighlty different in the Fresnel term, but both only depend on + // NoL and roughness, so they are both numerically integrated and written into two channels. + float A = 0.0; + float B = 0.0; + float C = 0.0; + + for(int i = 0; i < u_sampleCount; ++i) + { + // Importance sampling, depending on the distribution. + vec4 importanceSample = getImportanceSample(i, N, roughness); + vec3 H = importanceSample.xyz; + // float pdf = importanceSample.w; + vec3 L = normalize(reflect(-V, H)); + + float NdotL = saturate(L.z); + float NdotH = saturate(H.z); + float VdotH = saturate(dot(V, H)); + if (NdotL > 0.0) + { + if (u_distribution == cGGX) + { + // LUT for GGX distribution. + + // Taken from: https://bruop.github.io/ibl + // Shadertoy: https://www.shadertoy.com/view/3lXXDB + // Terms besides V are from the GGX PDF we're dividing by. + float V_pdf = V_SmithGGXCorrelated(NdotV, NdotL, roughness) * VdotH * NdotL / NdotH; + float Fc = pow(1.0 - VdotH, 5.0); + A += (1.0 - Fc) * V_pdf; + B += Fc * V_pdf; + C += 0.0; + } + + if (u_distribution == cCharlie) + { + // LUT for Charlie distribution. + float sheenDistribution = D_Charlie(roughness, NdotH); + float sheenVisibility = V_Ashikhmin(NdotL, NdotV); + + A += 0.0; + B += 0.0; + C += sheenVisibility * sheenDistribution * NdotL * VdotH; + } + } + } + + // The PDF is simply pdf(v, h) -> NDF * . + // To parametrize the PDF over l, use the Jacobian transform, yielding to: pdf(v, l) -> NDF * / 4 + // Since the BRDF divide through the PDF to be normalized, the 4 can be pulled out of the integral. + return vec3(4.0 * A, 4.0 * B, 4.0 * 2.0 * MATH_PI * C) / float(u_sampleCount); + } + )" + }, + { + "ibl_filtering6.glsl", R"( + + + // entry point + void main() + { + vec3 color = vec3(0); + + if(u_isGeneratingLUT == 0) + { + vec2 newUV = texCoord ; + + newUV = newUV*2.0-1.0; + + vec3 scan = uvToXYZ(u_currentFace, newUV); + + vec3 direction = normalize(scan); + + color = filterColor(direction); + } + else + { + color = LUT(texCoord.x, texCoord.y); + fragmentColor.rgb = color; + fragmentColor.a = 1.0; + return; + } + + fragmentColor.a = 1.0; + + if(u_floatTexture == 0) + { + float maxV = max(max(color.r,color.g),color.b); + color /= u_intensityScale; + color = clamp(color, 0.0f, 1.0f); + } + + fragmentColor.rgb = color; + } + )" + }, + { + "debug.frag", R"( + + precision highp float; + + in vec2 texCoord; + out vec4 fragmentColor; + + uniform int u_currentFace; + uniform samplerCube u_inputTexture; + + vec3 uvToXYZ(int face, vec2 uv) + { + if(face == 0) + return vec3( 1.f, uv.y, -uv.x); + + else if(face == 1) + return vec3( -1.f, uv.y, uv.x); + + else if(face == 2) + return vec3( +uv.x, -1.f, +uv.y); + + else if(face == 3) + return vec3( +uv.x, 1.f, -uv.y); + + else if(face == 4) + return vec3( +uv.x, uv.y, 1.f); + + else //if(face == 5) + { return vec3( -uv.x, +uv.y, -1.f);} + } + + + void main(void) + { + fragmentColor = vec4(texCoord.x*10.0, 0.0, texCoord.y*10.0, 1.0); + vec2 newUV =texCoord; + newUV = newUV*2.0-1.0; + + vec4 textureColor = vec4(0.0, 0.0, 0.0, 1.0); + + vec3 direction = normalize(uvToXYZ(u_currentFace, newUV.xy)); + + textureColor = textureLod(u_inputTexture, direction,1.0); + //textureColor = texture(u_inputTexture, texCoord); + + if(texCoord.x>0.1) + { + fragmentColor = textureColor; + } + + if(texCoord.y>0.1) + { + fragmentColor = textureColor; + } + + } + )" + }, +}; + +static const char * src_vertex_shader = R"( + uniform mat4 u_ViewProjectionMatrix; + uniform highp mat4 u_ModelMatrix; + uniform mat4 u_NormalMatrix; + + in vec3 a_position; + out vec3 v_Position; +#include +#include +#include +// CHUNK 00 -> 01 +#include +)"; + +static const char *src_fragment_shader = R"( + + //#define LIGHT_COUNT 0 + + // + // This fragment shader defines a reference implementation for Physically Based Shading of + // a microfacet surface material defined by a glTF model. + // + // References: + // [1] Real Shading in Unreal Engine 4 + // http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf + // [2] Physically Based Shading at Disney + // http://blog.selfshadow.com/publications/s2012-shading-course/burley/s2012_pbs_disney_brdf_notes_v3.pdf + // [3] README.md - Environment Maps + // https://github.com/KhronosGroup/glTF-WebGL-PBR/#environment-maps + // [4] "An Inexpensive BRDF Model for Physically based Rendering" by Christophe Schlick + // https://www.cs.virginia.edu/~jdl/bib/appearance/analytic%20models/schlick94b.pdf + // [5] "KHR_materials_clearcoat" + // https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat + + precision mediump float; + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + #ifdef MATERIAL_IRIDESCENCE +#include + #endif + +#include + +// CHUNK 00 -> 01 + +#include +#include + +// CHUNK 01 -> 02 + +#include +#include + +// CHUNK 02 -> 03 + +#include +#include + +// CHUNK 03 -> 04 + +#include + +// CHUNK 04 -> 05 + +#include + +)"; + +static const size_t src_includes_count = sizeof src_includes / sizeof src_includes[0]; + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +char* lv_gltf_view_shader_get_vertex(void) { + return lv_opengl_shader_manager_process_includes(src_vertex_shader, src_includes, src_includes_count); +} + +char* lv_gltf_view_shader_get_fragment(void) { + return lv_opengl_shader_manager_process_includes(src_fragment_shader, src_includes, src_includes_count); +} + +void lv_gltf_view_shader_get_src(lv_opengl_shader_portions_t *portions) +{ + portions->all = src_includes; + portions->count = sizeof(src_includes) / sizeof(src_includes[0]); +} +void lv_gltf_view_shader_get_env(lv_opengl_shader_portions_t *portions) +{ + portions->all = env_src_includes; + portions->count = sizeof(env_src_includes) / sizeof(env_src_includes[0]); +} + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_view/assets/lv_gltf_view_shader.h b/inc/lvgl/src/libs/gltf/gltf_view/assets/lv_gltf_view_shader.h new file mode 100644 index 0000000..026a245 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_view/assets/lv_gltf_view_shader.h @@ -0,0 +1,39 @@ +/** + * @file lv_gltf_view_shader.h + * + */ + +#ifndef LV_GLTF_VIEW_SHADER_H +#define LV_GLTF_VIEW_SHADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../../../drivers/opengles/opengl_shader/lv_opengl_shader_internal.h" + +#if LV_USE_GLTF + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +char *lv_gltf_view_shader_get_vertex(void); +char *lv_gltf_view_shader_get_fragment(void); +void lv_gltf_view_shader_get_src(lv_opengl_shader_portions_t *shaders); +void lv_gltf_view_shader_get_env(lv_opengl_shader_portions_t *shaders); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GLTF*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GLTF_VIEW_SHADER_H*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf.h b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf.h new file mode 100644 index 0000000..b9cc2b3 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf.h @@ -0,0 +1,421 @@ +/** + * @file lv_gltf.h + * + */ + +#ifndef LV_GLTF_H +#define LV_GLTF_H + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GLTF + +#include "../math/lv_3dmath.h" +#include "../../../misc/lv_types.h" +#include "../../../misc/lv_area.h" +#include "../gltf_data/lv_gltf_model.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * DEFINES + *********************/ + +#define LV_GLTF_ANIM_SPEED_TENTH 100 +#define LV_GLTF_ANIM_SPEED_QUARTER 250 +#define LV_GLTF_ANIM_SPEED_HALF 500 +#define LV_GLTF_ANIM_SPEED_NORMAL 1000 +#define LV_GLTF_ANIM_SPEED_2X 2000 +#define LV_GLTF_ANIM_SPEED_3X 3000 +#define LV_GLTF_ANIM_SPEED_4X 4000 +#define LV_GLTF_DEFAULT_CAMERA 0 + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_GLTF_AA_MODE_OFF = 0, /** Anti aliasing off*/ + LV_GLTF_AA_MODE_ON = 1, /** Anti aliasing on*/ + LV_GLTF_AA_MODE_DYNAMIC = 2, /** Anti aliasing on only when frame has no movement*/ +} lv_gltf_aa_mode_t; + +typedef enum { + LV_GLTF_BG_MODE_SOLID = 0, /** Solid background. Use `lv_obj_set_style_bg_color` to set the background color*/ + LV_GLTF_BG_MODE_ENVIRONMENT = 1, /** Environnement background*/ +} lv_gltf_bg_mode_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a glTF object + * @param parent pointer to the parent object + * @return pointer to the created glTF object + */ +lv_obj_t * lv_gltf_create(lv_obj_t * parent); + +/** + * Assign an environment to a glTF object for IBL rendering + * @param obj pointer to a glTF viewer object + * @param environment pointer to the environment to use + * @note The environment can be shared across multiple glTF objects + * @note If no environment is set before attempting to load a file, + * a default one will be created for you + */ +void lv_gltf_set_environment(lv_obj_t * obj, lv_gltf_environment_t * environment); + +/** + * Load a glTF model from a file into the viewer + * @param obj pointer to a glTF viewer object + * @param path file path to the glTF model to load + * @return pointer to the loaded glTF model, or NULL on failure + */ +lv_gltf_model_t * lv_gltf_load_model_from_file(lv_obj_t * obj, const char * path); + +/** + * Load a glTF model from a byte array into the viewer + * @param obj pointer to a glTF viewer object + * @param bytes glTF raw data + * @param len glTF raw data length in bytes + * @return pointer to the loaded glTF model, or NULL on failure + */ +lv_gltf_model_t * lv_gltf_load_model_from_bytes(lv_obj_t * obj, const uint8_t * bytes, size_t len); + +/** + * Get the number of models loaded in the glTF viewer + * @param obj pointer to a glTF viewer object + * @return the total number of models in the viewer + */ +size_t lv_gltf_get_model_count(lv_obj_t * obj); + +/** + * Get a specific model by its index + * @param obj pointer to a glTF viewer object + * @param id index of the model to retrieve (0-based) + * @return pointer to the model at the specified index, or NULL if index is invalid + */ +lv_gltf_model_t * lv_gltf_get_model_by_index(lv_obj_t * obj, size_t id); + +/** + * Get the primary model from the glTF viewer + * The primary model is the first model added to the viewer and can be used + * for camera selection and other primary operations + * @param obj pointer to a glTF viewer object + * @return pointer to the primary model, or NULL if no models are loaded + */ +lv_gltf_model_t * lv_gltf_get_primary_model(lv_obj_t * obj); + +/** + * Set the yaw (horizontal rotation) of the camera + * @param obj pointer to a glTF viewer object + * @param yaw yaw angle in degrees + */ +void lv_gltf_set_yaw(lv_obj_t * obj, float yaw); + +/** + * Get the yaw (horizontal rotation) of the camera + * @param obj pointer to a glTF viewer object + * @return yaw angle in degrees + */ +float lv_gltf_get_yaw(const lv_obj_t * obj); + +/** + * Set the pitch (vertical rotation) of the camera + * @param obj pointer to a glTF viewer object + * @param pitch pitch angle in degrees + */ +void lv_gltf_set_pitch(lv_obj_t * obj, float pitch); + +/** + * Get the pitch (vertical rotation) of the camera + * @param obj pointer to a glTF viewer object + * @return pitch angle in degrees + */ +float lv_gltf_get_pitch(const lv_obj_t * obj); + +/** + * Set the camera distance from the focal point + * @param obj pointer to a glTF viewer object + * @param value distance value + */ +void lv_gltf_set_distance(lv_obj_t * obj, float value); + +/** + * Get the camera distance scale factor from the focal point + * @param obj pointer to a glTF viewer object + * @return distance scaling factor value + */ +float lv_gltf_get_distance(const lv_obj_t * obj); + +/** + * Get the camera distance from the focal point in world units + * @param obj pointer to a GLTF viewer object + * @return world unit distance value + */ +float lv_gltf_get_world_distance(const lv_obj_t * obj); + +/********************** + * Viewport Functions + **********************/ + +/** + * Set the field of view + * @param obj pointer to a glTF viewer object + * @param value vertical FOV in degrees. If zero, the view will be orthographic (non-perspective) + */ +void lv_gltf_set_fov(lv_obj_t * obj, float value); + +/** + * Get the field of view + * @param obj pointer to a glTF viewer object + * @return vertical FOV in degrees + */ +float lv_gltf_get_fov(const lv_obj_t * obj); + +/********************** + * Focal Point Functions + **********************/ + +/** + * Set the X coordinate of the camera focal point + * @param obj pointer to a glTF viewer object + * @param value X coordinate + */ +void lv_gltf_set_focal_x(lv_obj_t * obj, float value); + +/** + * Get the X coordinate of the camera focal point + * @param obj pointer to a glTF viewer object + * @return X coordinate + */ +float lv_gltf_get_focal_x(const lv_obj_t * obj); + +/** + * Set the Y coordinate of the camera focal point + * @param obj pointer to a glTF viewer object + * @param value Y coordinate + */ +void lv_gltf_set_focal_y(lv_obj_t * obj, float value); + +/** + * Get the Y coordinate of the camera focal point + * @param obj pointer to a glTF viewer object + * @return Y coordinate + */ +float lv_gltf_get_focal_y(const lv_obj_t * obj); + +/** + * Set the Z coordinate of the camera focal point + * @param obj pointer to a glTF viewer object + * @param value Z coordinate + */ +void lv_gltf_set_focal_z(lv_obj_t * obj, float value); + +/** + * Get the Z coordinate of the camera focal point + * @param obj pointer to a glTF viewer object + * @return Z coordinate + */ +float lv_gltf_get_focal_z(const lv_obj_t * obj); + +/** + * Set the focal coordinates to the center point of the model object + * @param obj pointer to a glTF viewer object + * @param model a model attached to this viewer or NULL for the first model + */ +void lv_gltf_recenter(lv_obj_t * obj, lv_gltf_model_t * model); + +/********************** + * Scene Control Functions + **********************/ + +/** + * Set the active camera index + * The camera is selected from the first glTF model added to the viewer + * + * @param obj pointer to a glTF viewer object + * @param value camera index (0 for default camera, 1+ for scene camera index) + * @note Values higher than the scene's camera count will be clamped to the maximum available camera index + */ +void lv_gltf_set_camera(lv_obj_t * obj, uint32_t value); + +/** + * Get the active camera index + * @param obj pointer to a glTF viewer object + * @return active camera index + */ +uint32_t lv_gltf_get_camera(const lv_obj_t * obj); + +/** + * Get the number of cameras in the first glTF model added to the viewer + * This count represents the valid range for the camera index parameter + * used with lv_gltf_set_camera() + * + * To get the camera count of other models, call + * lv_gltf_model_get_camera_count(model) directly with the specific model + * + * @param obj pointer to a glTF viewer object + * @return number of available cameras + */ +uint32_t lv_gltf_get_camera_count(const lv_obj_t * obj); + +/** + * Set the animation speed ratio + * + * The actual ratio is the value parameter / LV_GLTF_ANIM_SPEED_NORMAL + * Values greater than LV_GLTF_ANIM_SPEED_NORMAL will speed-up the animation + * Values less than LV_GLTF_ANIM_SPEED_NORMAL will slow down the animation + * + * @param obj pointer to a glTF viewer object + * @param value speed-up ratio of the animation + */ +void lv_gltf_set_animation_speed(lv_obj_t * obj, uint32_t value); + +/** + * Get the animation speed ratio + * + * The actual ratio is the return value / LV_GLTF_ANIM_SPEED_NORMAL + * + * @param obj pointer to a glTF viewer object + */ +uint32_t lv_gltf_get_animation_speed(const lv_obj_t * obj); + +/********************** + * Visual Settings Functions + **********************/ + +/** + * Set the background mode + * @param obj pointer to a glTF viewer object + * @param value background mode + */ +void lv_gltf_set_background_mode(lv_obj_t * obj, lv_gltf_bg_mode_t value); + +/** + * Get the background mode + * @param obj pointer to a glTF viewer object + * @return background mode + */ +lv_gltf_bg_mode_t lv_gltf_get_background_mode(const lv_obj_t * obj); + +/** + * Set the background blur amount + * @param obj pointer to a glTF viewer object + * @param value blur amount between 0 and 100 + */ +void lv_gltf_set_background_blur(lv_obj_t * obj, uint32_t value); + +/** + * Get the background blur amount + * @param obj pointer to a glTF viewer object + * @return blur amount between 0 and 100 + */ +uint32_t lv_gltf_get_background_blur(const lv_obj_t * obj); + +/** + * Set the environmental brightness/power + * @param obj pointer to a glTF viewer object + * @param value brightness multiplier + */ +void lv_gltf_set_env_brightness(lv_obj_t * obj, uint32_t value); + +/** + * Get the environmental brightness/power + * @param obj pointer to a glTF viewer object + * @return brightness multiplier + */ +uint32_t lv_gltf_get_env_brightness(const lv_obj_t * obj); + +/** + * Set the image exposure level + * @param obj pointer to a glTF viewer object + * @param value exposure level (1.0 is default) + */ +void lv_gltf_set_image_exposure(lv_obj_t * obj, float value); + +/** + * Get the image exposure level + * @param obj pointer to a glTF viewer object + * @return exposure level + */ +float lv_gltf_get_image_exposure(const lv_obj_t * obj); + +/********************** + * Rendering Functions + **********************/ + +/** + * Set the anti-aliasing mode + * @param obj pointer to a glTF viewer object + * @param value anti-aliasing mode + */ +void lv_gltf_set_antialiasing_mode(lv_obj_t * obj, lv_gltf_aa_mode_t value); + +/** + * Get the anti-aliasing mode + * @param obj pointer to a glTF viewer object + * @return anti-aliasing mode + */ +lv_gltf_aa_mode_t lv_gltf_get_antialiasing_mode(const lv_obj_t * obj); + +/*********************** + * Raycasting Functions + ***********************/ + +/** + * Get the point that a given ray intersects with a specified plane at, if any + * @param ray the intersection test ray + * @param screen_y the plane to test ray intersection with + * @param collision_point output lv_3dpoint_t holder, values are only valid if true is the return value + * @return LV_RESULT_OK if intersection, LV_RESULT_INVALID if no intersection + */ +lv_result_t lv_intersect_ray_with_plane(const lv_3dray_t * ray, const lv_3dplane_t * plane, + lv_3dpoint_t * collision_point); + +/** + * Get a plane that faces the current view camera, centered some units in front of it + * @param obj pointer to a GLTF viewer object + * @param distance distance in front of the camera to set the plane, in world units. see lv_gltf_get_world_distance to get the auto-distance + * @return camera facing plane + */ +lv_3dplane_t lv_gltf_get_current_view_plane(lv_obj_t * obj, float distance); + +/** + * Calculates a ray originating from the camera and passing through the specified mouse position on the screen. + * @param obj pointer to a GLTF viewer object + * @param screen_pos screen co-ordinate, in pixels + * @return mouse point ray + */ +lv_3dray_t lv_gltf_get_ray_from_2d_coordinate(lv_obj_t * obj, const lv_point_t * screen_pos); + + +/** + * Get the screen position of a 3d point + * @param obj pointer to a GLTF viewer object + * @param world_pos world position to convert + * @param lv_point_t the resulting point, in pixels. only valid if return value is true + * @return LV_RESULT_OK if conversion valid, LV_RESULT_INVALID if no valid conversion + */ +lv_result_t lv_gltf_world_to_screen(lv_obj_t * obj, const lv_3dpoint_t world_pos, lv_point_t * screen_pos); + + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} +#endif + +#endif /*LV_USE_GLTF*/ + +#endif /*LV_GLTF_H*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view.cpp b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view.cpp new file mode 100644 index 0000000..71d0f9c --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view.cpp @@ -0,0 +1,863 @@ +/** + * @file lv_gltf_view.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_view_internal.h" + +#if LV_USE_GLTF + +#include "../gltf_data/lv_gltf_model.h" +#include "../gltf_data/lv_gltf_data_internal.hpp" +#include "../../../draw/lv_draw_3d.h" +#include "../fastgltf/lv_fastgltf.hpp" +#include "../../../core/lv_obj_class_private.h" +#include "../../../misc/lv_types.h" +#include "../../../widgets/3dtexture/lv_3dtexture.h" +#include "../gltf_environment/lv_gltf_environment.h" +#include "assets/lv_gltf_view_shader.h" +#include +#include + +/********************* + * DEFINES + *********************/ + + +#define MY_CLASS (&lv_gltf_class) + +#ifndef LV_GLTF_INITIAL_MODEL_CAPACITY + #define LV_GLTF_INITIAL_MODEL_CAPACITY 1 +#endif /*LV_GLTF_INITIAL_MODEL_CAPACITY*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_gltf_model_t * lv_gltf_add_model(lv_gltf_t * viewer, lv_gltf_model_t * model); +static void lv_gltf_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_gltf_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_gltf_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_gltf_view_state_init(lv_gltf_t * state); +static void lv_gltf_view_desc_init(lv_gltf_view_desc_t * state); +static void lv_gltf_parse_model(lv_gltf_t * viewer, lv_gltf_model_t * model); +static void setup_compile_and_load_bg_shader(lv_opengl_shader_manager_t * manager); +static void setup_background_environment(GLuint program, GLuint * vao, GLuint * indexBuffer, GLuint * vertexBuffer); + +static lv_result_t create_default_environment(lv_gltf_t * gltf); + +static void display_refr_end_event_cb(lv_event_t * e); + +const lv_obj_class_t lv_gltf_class { + &lv_3dtexture_class, + lv_gltf_constructor, + lv_gltf_destructor, + lv_gltf_event, +#if LV_USE_OBJ_PROPERTY + 0, + 0, + NULL, + 0, + NULL, + 0, +#endif + NULL, + "lv_gltf", + LV_DPI_DEF * 2, + LV_DPI_DEF / 10, + LV_OBJ_CLASS_EDITABLE_INHERIT, + LV_OBJ_CLASS_GROUP_DEF_INHERIT, + sizeof(lv_gltf_t), + LV_OBJ_CLASS_THEME_INHERITABLE_FALSE +}; + +/********************** + * STATIC VARIABLES + **********************/ + +static const lv_opengl_glsl_version_t GLSL_VERSIONS[] { + LV_OPENGL_GLSL_VERSION_300ES, + LV_OPENGL_GLSL_VERSION_330, +}; +static const size_t GLSL_VERSION_COUNT = sizeof(GLSL_VERSIONS) / sizeof(GLSL_VERSIONS[0]); + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_gltf_create(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + lv_display_t * disp = lv_obj_get_display(obj); + LV_ASSERT_NULL(disp); + lv_display_add_event_cb(disp, display_refr_end_event_cb, LV_EVENT_REFR_READY, obj); + return obj; +} + +lv_gltf_model_t * lv_gltf_load_model_from_file(lv_obj_t * obj, const char * path) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + + if(!viewer->environment) { + lv_result_t res = create_default_environment(viewer); + if(res != LV_RESULT_OK) { + return NULL; + } + } + + lv_gltf_model_t * model = lv_gltf_data_load_from_file(path, &viewer->shader_manager); + return lv_gltf_add_model(viewer, model); +} + +lv_gltf_model_t * lv_gltf_load_model_from_bytes(lv_obj_t * obj, const uint8_t * bytes, size_t len) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + + if(!viewer->environment) { + lv_result_t res = create_default_environment(viewer); + if(res != LV_RESULT_OK) { + return NULL; + } + } + + lv_gltf_model_t * model = lv_gltf_data_load_from_bytes(bytes, len, &viewer->shader_manager); + return lv_gltf_add_model(viewer, model); +} +void lv_gltf_set_environment(lv_obj_t * obj, lv_gltf_environment_t * env) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * gltf = (lv_gltf_t *)obj; + if(env == NULL) { + LV_LOG_WARN("Refusing to assign a NULL environment to the glTF object"); + return; + } + + if(gltf->environment && gltf->owns_environment) { + lv_gltf_environment_delete(gltf->environment); + gltf->environment = NULL; + } + gltf->environment = env; + gltf->owns_environment = false; +} + +size_t lv_gltf_get_model_count(lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_array_size(&((lv_gltf_t *)obj)->models); +} + +lv_gltf_model_t * lv_gltf_get_model_by_index(lv_obj_t * obj, size_t id) +{ + + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *) obj; + + if(id >= lv_array_size(&viewer->models)) { + return NULL; + } + return *(lv_gltf_model_t **)lv_array_at(&((lv_gltf_t *)obj)->models, id); + +} +lv_gltf_model_t * lv_gltf_get_primary_model(lv_obj_t * obj) +{ + + return lv_gltf_get_model_by_index(obj, 0); +} + +void lv_gltf_set_yaw(lv_obj_t * obj, float yaw) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.yaw = yaw; + lv_obj_invalidate(obj); +} + +float lv_gltf_get_yaw(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.yaw; +} + +void lv_gltf_set_pitch(lv_obj_t * obj, float pitch) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.pitch = pitch; + lv_obj_invalidate(obj); +} + +float lv_gltf_get_pitch(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.pitch; +} + +void lv_gltf_set_fov(lv_obj_t * obj, float value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.fov = value; + lv_obj_invalidate(obj); +} + +float lv_gltf_get_fov(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.fov; +} + +void lv_gltf_set_distance(lv_obj_t * obj, float value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.distance = value; + lv_obj_invalidate(obj); +} + +float lv_gltf_get_distance(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.distance; +} + +float lv_gltf_get_world_distance(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + lv_gltf_view_desc_t * view_desc = &viewer->desc; + if(viewer->models.size == 0) { + return 0.0f; + } + lv_gltf_model_t * model = *(lv_gltf_model_t **)lv_array_at(&viewer->models, 0); + return (lv_gltf_data_get_radius(model) * LV_GLTF_DISTANCE_SCALE_FACTOR) * view_desc->distance; +} + +void lv_gltf_set_animation_speed(lv_obj_t * obj, uint32_t value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.animation_speed_ratio = value; + lv_obj_invalidate(obj); +} + +uint32_t lv_gltf_get_animation_speed(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.animation_speed_ratio; +} + +void lv_gltf_set_focal_x(lv_obj_t * obj, float value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.focal_x = value; + lv_obj_invalidate(obj); +} + +float lv_gltf_get_focal_x(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.focal_x; +} + +void lv_gltf_set_focal_y(lv_obj_t * obj, float value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.focal_y = value; + lv_obj_invalidate(obj); +} + +float lv_gltf_get_focal_y(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.focal_y; +} + +void lv_gltf_set_focal_z(lv_obj_t * obj, float value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.focal_z = value; + lv_obj_invalidate(obj); +} + +float lv_gltf_get_focal_z(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.focal_z; +} + +void lv_gltf_set_camera(lv_obj_t * obj, uint32_t value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + + if(lv_array_is_empty(&viewer->models)) { + return; + } + + lv_gltf_model_t * model = *(lv_gltf_model_t **) lv_array_at(&viewer->models, 0); + + if(value > model->asset.cameras.size()) { + return; + } + + model->camera = value; + lv_obj_invalidate(obj); +} + +uint32_t lv_gltf_get_camera(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + + if(lv_array_is_empty(&viewer->models)) { + return 0; + } + const lv_gltf_model_t * model = *(const lv_gltf_model_t **)lv_array_at(&viewer->models, 0); + return model->camera; +} + +uint32_t lv_gltf_get_camera_count(const lv_obj_t * obj) +{ + + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + + if(lv_array_is_empty(&viewer->models)) { + return 0; + } + const lv_gltf_model_t * model = *(const lv_gltf_model_t **) lv_array_at(&viewer->models, 0); + return lv_gltf_model_get_camera_count(model); +} + +void lv_gltf_set_antialiasing_mode(lv_obj_t * obj, lv_gltf_aa_mode_t value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.aa_mode = value; + lv_obj_invalidate(obj); +} + +lv_gltf_aa_mode_t lv_gltf_get_antialiasing_mode(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.aa_mode; +} + +void lv_gltf_set_background_mode(lv_obj_t * obj, lv_gltf_bg_mode_t value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.bg_mode = value; + lv_obj_invalidate(obj); +} + +lv_gltf_bg_mode_t lv_gltf_get_background_mode(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.bg_mode; +} + +void lv_gltf_set_background_blur(lv_obj_t * obj, uint32_t value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + if(value > 100) { + value = 100; + } + viewer->desc.blur_bg = value / 100.f; + lv_obj_invalidate(obj); +} + +uint32_t lv_gltf_get_background_blur(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.blur_bg * 100; +} + +void lv_gltf_set_env_brightness(lv_obj_t * obj, uint32_t value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.env_pow = value / 100.; + lv_obj_invalidate(obj); +} + +uint32_t lv_gltf_get_env_brightness(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.env_pow * 100; +} + +void lv_gltf_set_image_exposure(lv_obj_t * obj, float value) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + viewer->desc.exposure = value; + lv_obj_invalidate(obj); +} + +float lv_gltf_get_image_exposure(const lv_obj_t * obj) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + return viewer->desc.exposure; +} +void lv_gltf_recenter(lv_obj_t * obj, lv_gltf_model_t * model) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + if(model == NULL) { + LV_ASSERT(lv_array_size(&viewer->models) > 0); + model = *(lv_gltf_model_t **)lv_array_at(&viewer->models, 0); + } + + const auto & center_position = lv_gltf_data_get_center(model); + viewer->desc.focal_x = center_position[0]; + viewer->desc.focal_y = center_position[1]; + viewer->desc.focal_z = center_position[2]; +} + +lv_3dray_t lv_gltf_get_ray_from_2d_coordinate(lv_obj_t * obj, const lv_point_t * screen_pos) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + + float norm_mouse_x = (float)screen_pos->x / (float)(lv_obj_get_width(obj)); + float norm_mouse_y = (float)screen_pos->y / (float)(lv_obj_get_height(obj)); + + lv_3dray_t outray {{0, 0, 0}, {0, 0, 0}}; + + fastgltf::math::fmat4x4 proj_mat = fastgltf::math::inverse(fastgltf::math::fmat4x4(viewer->projection_matrix)); + + /* Convert mouse coordinates to NDC */ + float x = norm_mouse_x * 2.0f - 1.0f; + float y = 1.0f - (norm_mouse_y * 2.0f); + float z = -1.0f; /* Clip space z */ + + fastgltf::math::fvec4 clip_space_pos = fastgltf::math::fvec4(x, y, z, 1.f); + auto ray_eye = (proj_mat) * clip_space_pos; + ray_eye[2] = -1.0f; + ray_eye[3] = 0.0f; + + /* Calculate ray world direction */ + fastgltf::math::fvec4 ray_world = fastgltf::math::inverse(viewer->view_matrix) * ray_eye; + auto ray_direction = fastgltf::math::normalize(fastgltf::math::fvec3(ray_world[0], ray_world[1], ray_world[2])); + + outray.direction = {ray_direction[0], ray_direction[1], ray_direction[2]}; + outray.origin = {viewer->camera_pos[0], viewer->camera_pos[1], viewer->camera_pos[2]}; + + return outray; +} + +lv_result_t lv_intersect_ray_with_plane(const lv_3dray_t * ray, const lv_3dplane_t * plane, + lv_3dpoint_t * collision_point) +{ + fastgltf::math::fvec3 plane_center = fastgltf::math::fvec3(plane->origin.x, plane->origin.y, plane->origin.z); + fastgltf::math::fvec3 plane_normal = fastgltf::math::fvec3(plane->direction.x, plane->direction.y, plane->direction.z); + fastgltf::math::fvec3 ray_start = fastgltf::math::fvec3(ray->origin.x, ray->origin.y, ray->origin.z); + fastgltf::math::fvec3 ray_direction = fastgltf::math::fvec3(ray->direction.x, ray->direction.y, ray->direction.z); + + float denom = fastgltf::math::dot(plane_normal, ray_direction); + if(fabs(denom) > 1e-6) { /* Check if the ray is not parallel to the plane */ + fastgltf::math::fvec3 diff = plane_center - ray_start; + float t = fastgltf::math::dot(diff, plane_normal) / denom; + + if(t >= 0) { /* Intersection occurs ahead of the ray origin */ + /* Calculate the collision point */ + (*collision_point).x = ray_start[0] + t * ray_direction[0]; + (*collision_point).y = ray_start[1] + t * ray_direction[1]; + (*collision_point).z = ray_start[2] + t * ray_direction[2]; + return LV_RESULT_OK; /* Collision point found */ + } + } + return LV_RESULT_INVALID; /* No intersection */ +} + +lv_3dplane_t lv_gltf_get_current_view_plane(lv_obj_t * obj, float distance) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + lv_3dplane_t outplane = {{0, 0, 0}, {0, 0, 0}}; + + /* Forward vector is the third column of the matrix */ + auto forward = fastgltf::math::fvec3(viewer->view_matrix[0][2], viewer->view_matrix[1][2], viewer->view_matrix[2][2]); + forward = fastgltf::math::normalize(forward); + + /* Calculate the plane center */ + const auto & camera_pos = viewer->camera_pos; + auto plane_pos = fastgltf::math::fvec3(camera_pos[0], camera_pos[1], camera_pos[2]) - forward * distance; + outplane.origin = {plane_pos[0], plane_pos[1], plane_pos[2]}; + outplane.direction = {-forward[0], -forward[1], -forward[2]}; + return outplane; +} + +lv_result_t lv_gltf_world_to_screen(lv_obj_t * obj, const lv_3dpoint_t world_pos, lv_point_t * screen_pos) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + + fastgltf::math::fvec4 world_position_h = fastgltf::math::fvec4(world_pos.x, world_pos.y, world_pos.z, 1.0f); + fastgltf::math::fvec4 clip_space_pos = viewer->projection_matrix * viewer->view_matrix * world_position_h; + + /* Check for perspective division (w must not be zero) */ + if(clip_space_pos[3] == 0.0f) { + screen_pos->x = -1; + screen_pos->y = -1; + return LV_RESULT_INVALID; /* Position is not valid for screen mapping */ + } + + clip_space_pos /= clip_space_pos[3]; + float norm_screen_x = clip_space_pos[0] * 0.5f + 0.5f; + float norm_screen_y = 0.5f - (clip_space_pos[1] * 0.5f); + int32_t win_width = lv_obj_get_width(obj); + int32_t win_height = lv_obj_get_height(obj); + screen_pos->x = norm_screen_x * win_width; + screen_pos->y = norm_screen_y * win_height; + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_gltf_model_t * lv_gltf_add_model(lv_gltf_t * viewer, lv_gltf_model_t * model) +{ + if(!model) { + return NULL; + } + if(lv_array_push_back(&viewer->models, &model) == LV_RESULT_INVALID) { + lv_gltf_data_delete(model); + return NULL; + } + model->viewer = viewer; + lv_gltf_parse_model(viewer, model); + + + if(lv_array_size(&viewer->models) == 1) { + lv_gltf_recenter((lv_obj_t *)viewer, model); + } + + return model; +} + +static lv_result_t create_default_environment(lv_gltf_t * gltf) +{ + lv_gltf_ibl_sampler_t * sampler = lv_gltf_ibl_sampler_create(); + gltf->environment = lv_gltf_environment_create(sampler, NULL); + lv_gltf_ibl_sampler_delete(sampler); + if(!gltf->environment) { + LV_LOG_WARN("Failed to create default gltf environment"); + return LV_RESULT_INVALID; + } + gltf->owns_environment = true; + return LV_RESULT_OK; +} + +static void lv_gltf_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + lv_gltf_t * view = (lv_gltf_t *)obj; + lv_gltf_view_state_init(view); + lv_gltf_view_desc_init(&view->desc); + view->view_matrix = fastgltf::math::fmat4x4(1.0f); + view->projection_matrix = fastgltf::math::fmat4x4(1.0f); + view->view_projection_matrix = fastgltf::math::fmat4x4(1.0f); + view->camera_pos = fastgltf::math::fvec3(0.0f); + view->texture.h_flip = false; + view->texture.v_flip = true; + new(&view->ibm_by_skin_then_node) std::map>; + + lv_opengl_shader_portions_t portions; + lv_gltf_view_shader_get_src(&portions); + char * vertex_shader = lv_gltf_view_shader_get_vertex(); + char * frag_shader = lv_gltf_view_shader_get_fragment(); + lv_opengl_shader_manager_init(&view->shader_manager, portions.all, portions.count, vertex_shader, frag_shader); + lv_free(vertex_shader); + lv_free(frag_shader); + + lv_array_init(&view->models, LV_GLTF_INITIAL_MODEL_CAPACITY, sizeof(lv_gltf_model_t *)); + + LV_TRACE_OBJ_CREATE("end"); +} + +static void lv_gltf_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = (lv_obj_t *)lv_event_get_current_target(e); + lv_gltf_t * viewer = (lv_gltf_t *)obj; + + if(code == LV_EVENT_DRAW_MAIN) { + GLuint texture_id = lv_gltf_view_render(viewer); + lv_3dtexture_set_src((lv_obj_t *)&viewer->texture, (lv_3dtexture_id_t)texture_id); + } + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) { + return; + } +} +static void lv_gltf_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_gltf_t * view = (lv_gltf_t *)obj; + lv_opengl_shader_manager_deinit(&view->shader_manager); + using IbmBySkinThenNodeMap = std::map>; + + view->ibm_by_skin_then_node.~IbmBySkinThenNodeMap(); + const size_t n = lv_array_size(&view->models); + for(size_t i = 0; i < n; ++i) { + lv_gltf_data_delete(*(lv_gltf_model_t **)lv_array_at(&view->models, i)); + } + lv_array_deinit(&view->models); + if(view->environment && view->owns_environment) { + lv_gltf_environment_delete(view->environment); + } + lv_display_t * disp = lv_obj_get_display(obj); + LV_ASSERT_NULL(disp); + lv_display_remove_event_cb_with_user_data(disp, display_refr_end_event_cb, obj); +} + +static void lv_gltf_view_state_init(lv_gltf_t * view) +{ + lv_memset(&view->state, 0, sizeof(view->state)); + view->state.opaque_frame_buffer_width = LV_GLTF_TRANSMISSION_PASS_SIZE; + view->state.opaque_frame_buffer_height = LV_GLTF_TRANSMISSION_PASS_SIZE; + view->state.material_variant = 0; + view->state.render_state_ready = false; + view->state.render_opaque_buffer = false; +} +static void lv_gltf_view_desc_init(lv_gltf_view_desc_t * desc) +{ + lv_memset(desc, 0, sizeof(*desc)); + desc->distance = 2.f; + desc->exposure = 1.0f; + desc->env_pow = 1.8f; + desc->blur_bg = 0.5f; + desc->bg_mode = LV_GLTF_BG_MODE_ENVIRONMENT; + desc->aa_mode = LV_GLTF_AA_MODE_OFF; + desc->fov = 45.f; + desc->animation_speed_ratio = LV_GLTF_ANIM_SPEED_NORMAL; + desc->frame_was_antialiased = false; +} +static void lv_gltf_parse_model(lv_gltf_t * viewer, lv_gltf_model_t * model) +{ + const auto & iterate_callback = [&](fastgltf::Node & node, const fastgltf::math::fmat4x4 & matrix) { + LV_UNUSED(matrix); + if(!node.meshIndex) { + return; + } + auto & mesh_index = node.meshIndex.value(); + if(node.skinIndex) { + auto skin_index = node.skinIndex.value(); + if(!lv_gltf_data_validated_skins_contains(model, skin_index)) { + lv_gltf_data_validate_skin(model, skin_index); + auto skin = model->asset.skins[skin_index]; + if(skin.inverseBindMatrices) { + auto & ibm_value = skin.inverseBindMatrices.value(); + auto & ibm_accessor = model->asset.accessors[ibm_value]; + if(ibm_accessor.bufferViewIndex) { + fastgltf::iterateAccessorWithIndex( + model->asset, ibm_accessor, + [&](fastgltf::math::fmat4x4 _matrix, std::size_t idx) { + auto & joint_node = model->asset.nodes[skin.joints[idx]]; + viewer->ibm_by_skin_then_node[skin_index][&joint_node] = _matrix; + }); + } + } + } + } + for(size_t mp = 0; mp < model->asset.meshes[mesh_index].primitives.size(); mp++) { + auto & model_primitive = model->asset.meshes[mesh_index].primitives[mp]; + const auto & mappings = model_primitive.mappings; + ssize_t material_index = + (!mappings.empty() && mappings[viewer->state.material_variant]) ? + mappings[viewer->state.material_variant].value() + 1 : + ((model_primitive.materialIndex) ? (model_primitive.materialIndex.value() + 1) : 0); + if(material_index < 0) { + lv_gltf_data_add_opaque_node_primitive(model, 0, &node, mp); + continue; + } + const fastgltf::Material & material = model->asset.materials[material_index - 1]; + + viewer->state.render_opaque_buffer |= material.transmission != NULL; + + if(material.alphaMode == fastgltf::AlphaMode::Blend || material.transmission != NULL) { + lv_gltf_data_add_blended_node_primitive(model, material_index + 1, &node, mp); + } + else { + lv_gltf_data_add_opaque_node_primitive(model, material_index + 1, &node, mp); + } + + lv_array_t defines; + lv_array_init(&defines, 64, sizeof(lv_opengl_shader_define_t)); + lv_result_t result = + lv_gltf_view_shader_injest_discover_defines(&defines, model, &node, &model_primitive); + + LV_ASSERT_MSG(result == LV_RESULT_OK, "Couldn't injest shader defines"); + + lv_opengl_shader_params_t frag_shader {"__MAIN__.frag", (lv_opengl_shader_define_t *) defines.data, lv_array_size(&defines) }; + lv_opengl_shader_params_t vert_shader {"__MAIN__.vert", (lv_opengl_shader_define_t *) defines.data, lv_array_size(&defines) }; + + lv_opengl_shader_program_t * program = lv_opengl_shader_manager_compile_program_best_version(&viewer->shader_manager, + &frag_shader, + &vert_shader, GLSL_VERSIONS, GLSL_VERSION_COUNT); + LV_ASSERT_MSG(program != NULL, + "Failed to link program. This probably means your platform doesn't support a required GLSL version"); + GLuint program_id = lv_opengl_shader_program_get_id(program); + GL_CALL(glUseProgram(program_id)); + + lv_gltf_compiled_shader_t compiled_shader { lv_gltf_uniform_locations_create(program_id), program_id, }; + + lv_gltf_store_compiled_shader(model, material_index, &compiled_shader); + const size_t n = lv_array_size(&defines); + for(size_t i = 0; i < n; ++i) { + lv_opengl_shader_define_t * define = (lv_opengl_shader_define_t *) lv_array_at(&defines, i); + if(define->value_allocated) { + lv_free((void *)define->value); + } + } + lv_array_deinit(&defines); + } + }; + + setup_compile_and_load_bg_shader(&viewer->shader_manager); + fastgltf::iterateSceneNodes(model->asset, 0, fastgltf::math::fmat4x4(), iterate_callback); +} + +static void setup_compile_and_load_bg_shader(lv_opengl_shader_manager_t * manager) +{ + lv_opengl_shader_define_t frag_defs[1] { { "TONEMAP_KHR_PBR_NEUTRAL", NULL, false} }; + uint32_t frag_shader_hash ; + uint32_t vert_shader_hash; + lv_result_t res = lv_opengl_shader_manager_select_shader(manager, "cubemap.frag", frag_defs, 1, + LV_OPENGL_GLSL_VERSION_300ES, + &frag_shader_hash); + + LV_ASSERT(res == LV_RESULT_OK); + res = lv_opengl_shader_manager_select_shader(manager, "cubemap.vert", nullptr, 0, LV_OPENGL_GLSL_VERSION_300ES, + &vert_shader_hash); + LV_ASSERT(res == LV_RESULT_OK); + + lv_opengl_shader_program_t * program = lv_opengl_shader_manager_get_program(manager, frag_shader_hash, + vert_shader_hash); + + manager->bg_program = lv_opengl_shader_program_get_id(program); + setup_background_environment(manager->bg_program, &manager->bg_vao, &manager->bg_index_buf, &manager->bg_vertex_buf); +} + + +static void setup_background_environment(GLuint program, GLuint * vao, GLuint * indexBuffer, GLuint * vertexBuffer) +{ + int32_t indices[] { 1, 2, 0, 2, 3, 0, 6, 2, 1, 1, 5, 6, 6, 5, 4, 4, 7, 6, + 6, 3, 2, 7, 3, 6, 3, 7, 0, 7, 4, 0, 5, 1, 0, 4, 5, 0 + }; + float verts[] { -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, + -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f + }; + + GL_CALL(glUseProgram(program)); + GL_CALL(glGenVertexArrays(1, vao)); + GL_CALL(glBindVertexArray(*vao)); + GL_CALL(glGenBuffers(1, indexBuffer)); + GL_CALL(glGenBuffers(1, vertexBuffer)); + + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, *vertexBuffer)); + GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW)); + GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *indexBuffer)); + GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW)); + + GLint positionAttributeLocation = glGetAttribLocation(program, "a_position"); + + // Specify the layout of the vertex data + glVertexAttribPointer(positionAttributeLocation, 3, GL_FLOAT, GL_FALSE, 0, (void *)0); + glEnableVertexAttribArray(positionAttributeLocation); + + GL_CALL(glBindVertexArray(0)); + GL_CALL(glUseProgram(0)); +} + + +static void display_refr_end_event_cb(lv_event_t * e) +{ + lv_gltf_t * viewer = (lv_gltf_t *) lv_event_get_user_data(e); + uint32_t model_count = lv_array_size(&viewer->models); + for(uint32_t i = 0; i < model_count; ++i) { + lv_gltf_model_t * model = *(lv_gltf_model_t **)lv_array_at(&viewer->models, i); + lv_gltf_model_send_new_values(model); + } +} +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view_internal.h b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view_internal.h new file mode 100644 index 0000000..559a4a7 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view_internal.h @@ -0,0 +1,192 @@ +/** + * @file lv_gltf_view_internal.h + * + */ + +#ifndef LV_GLTF_VIEW_INTERNAL_H +#define LV_GLTF_VIEW_INTERNAL_H + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GLTF + +#include "lv_gltf.h" +#include "../../../misc/lv_types.h" +#include "../../../drivers/opengles/opengl_shader/lv_opengl_shader_internal.h" +#include "../../../widgets/3dtexture/lv_3dtexture_private.h" +#include "../gltf_data/lv_gltf_data_internal.h" + + +/********************* + * DEFINES + *********************/ + +/* ::Gamma Presets:: + * Standard Gamma value is 2.2 + * Values range from 0.5 to 3.5, roughly speaking, with + * reasonable results between the 1.5 and 2.8 levels. + * The value must be enclosed with quotes, as a string literal. + */ +#define LV_GLTF_GAMMA_BRIGHTEST "3.5" +#define LV_GLTF_GAMMA_BRIGHTER "3.0" +#define LV_GLTF_GAMMA_BRIGHT "2.6" +#define LV_GLTF_GAMMA_STANDARD "2.2" +#define LV_GLTF_GAMMA_DARK "1.8" +#define LV_GLTF_GAMMA_DARKER "1.3" +#define LV_GLTF_GAMMA_DARKEST "0.8" + +#define LV_GLTF_DISTANCE_SCALE_FACTOR 2.5f +#define LV_GLTF_TRANSMISSION_PASS_SIZE 256 + +/* Apply defaults below if not set explicitly */ + +/* Tone-mapping is not applied if linear output is enabled. + * Linear output is the default. + */ +#ifndef LV_GLTF_LINEAR_OUTPUT + #define LV_GLTF_LINEAR_OUTPUT 1 +#endif + +/* If tone-mapping is applied, this adjusts the brightness + * and color range of the output. Use stringified values. + */ +#ifndef LV_GLTF_TONEMAP_GAMMA + #define LV_GLTF_TONEMAP_GAMMA LV_GLTF_GAMMA_STANDARD +#endif + +/********************** + * TYPEDEFS + **********************/ + +#ifdef __cplusplus +extern "C" { +#endif/* __cplusplus*/ + + +typedef struct { + uint32_t texture; + uint32_t renderbuffer; + unsigned framebuffer; +} lv_gltf_renwin_state_t; + +typedef struct { + lv_gltf_renwin_state_t render_state; + lv_gltf_renwin_state_t opaque_render_state; + + uint64_t opaque_frame_buffer_width; + uint64_t opaque_frame_buffer_height; + uint32_t material_variant; + bool render_state_ready; + bool render_opaque_buffer; +} lv_gltf_view_state_t; + +typedef struct { + float pitch; + float yaw; + float distance; + float fov; // The vertical FOV, in degrees. If this is zero, the view will be orthographic (non-perspective) + int32_t render_width; // If anti-aliasing is not applied this frame, these are the same as width/height, if antialiasing + int32_t render_height; // is enabled, these are width/height * antialias upscale power (currently 2.0) + float focal_x; + float focal_y; + float focal_z; + bool frame_was_antialiased; + int32_t animation_speed_ratio; + lv_gltf_aa_mode_t aa_mode; + lv_gltf_bg_mode_t bg_mode; + float blur_bg; /** How much to blur the environment background, between 0.0 and 1.0 */ + float env_pow; /** Environmental brightness, 1.8 by default */ + float exposure; /** Image exposure level, 1.0 default */ +} lv_gltf_view_desc_t; + +typedef struct { + /* Blend state */ + GLboolean blend_enabled; + GLint blend_src; + GLint blend_dst; + GLint blend_equation; + + /* Depth state */ + GLboolean depth_test_enabled; + GLboolean depth_mask; + GLint depth_func; + + /* Face culling state */ + GLboolean cull_face_enabled; + GLint cull_face_mode; + GLint front_face; + + /* Stencil state */ + GLboolean stencil_test_enabled; + GLuint stencil_mask; + GLint stencil_func; + GLint stencil_ref; + GLuint stencil_value_mask; + + /* Buffer bindings */ + GLuint current_vao; + GLuint current_vbo; + GLuint current_ibo; + GLuint current_program; + + /* Texture state */ + GLint active_texture; + GLuint bound_texture_2d; + + /* Viewport and scissor */ + GLint viewport[4]; + GLboolean scissor_test_enabled; + GLint scissor_box[4]; + + /* Clear values */ + GLfloat clear_depth; + GLfloat clear_color[4]; +} lv_opengl_state_t; + + +#ifdef __cplusplus +} + + +#include +#include +#include + +struct _lv_gltf_t { + lv_3dtexture_t texture; + lv_array_t models; + lv_gltf_view_state_t state; + lv_gltf_view_desc_t desc; + lv_gltf_view_desc_t last_desc; + lv_opengl_shader_manager_t shader_manager; + lv_gltf_environment_t * environment; + fastgltf::math::fmat4x4 view_matrix; + fastgltf::math::fmat4x4 projection_matrix; + fastgltf::math::fmat4x4 view_projection_matrix; + fastgltf::math::fvec3 camera_pos; + + std::map> ibm_by_skin_then_node; + bool owns_environment; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +GLuint lv_gltf_view_render(lv_gltf_t * viewer); +lv_result_t lv_gltf_view_shader_injest_discover_defines(lv_array_t * result, lv_gltf_model_t * data, + fastgltf::Node * node, + fastgltf::Primitive * prim); + +/********************** + * MACROS + **********************/ + +#endif/* __cplusplus*/ +#endif /*LV_USE_GLTF*/ + +#endif /*LV_GLTF_VIEW_INTERNAL_H*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view_render.cpp b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view_render.cpp new file mode 100644 index 0000000..28cc95c --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view_render.cpp @@ -0,0 +1,1442 @@ +/** + * @file lv_gltf_view_render.cpp + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_view_internal.h" + +#if LV_USE_GLTF + +#include "../gltf_data/lv_gltf_data_internal.hpp" + +#include "../fastgltf/lv_fastgltf.hpp" +#include "../../../misc/lv_types.h" +#include "../../../misc/lv_array.h" +#include "../../../stdlib/lv_sprintf.h" +#include "../../../drivers/opengles/lv_opengles_private.h" +#include "../../../drivers/opengles/lv_opengles_debug.h" +#include "../math/lv_gltf_math.hpp" +#include "../gltf_environment/lv_gltf_environment_private.h" + +#include + +#include +#include + +/********************* + * DEFINES + *********************/ + +#ifndef LV_GLTF_CONVERT_BASE_COLOR_TO_SRGB + #define LV_GLTF_CONVERT_BASE_COLOR_TO_SRGB 1 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/* This is used to push and pop the viewer matrix during the rendering phase*/ +struct lv_gltf_matrices_saver_t { + lv_gltf_t * viewer; + fastgltf::math::fmat4x4 saved_view_matrix; + fastgltf::math::fmat4x4 saved_projection_matrix; + fastgltf::math::fmat4x4 saved_view_projection_matrix; + fastgltf::math::fvec3 saved_camera_pos; + + lv_gltf_matrices_saver_t(lv_gltf_t * viewer) + : viewer(viewer) + , saved_view_matrix(viewer->view_matrix) + , saved_projection_matrix(viewer->projection_matrix) + , saved_view_projection_matrix(viewer->view_projection_matrix) + , saved_camera_pos(viewer->camera_pos) + { + } + + ~lv_gltf_matrices_saver_t() + { + viewer->view_matrix = saved_view_matrix; + viewer->projection_matrix = saved_projection_matrix; + viewer->view_projection_matrix = saved_view_projection_matrix; + viewer->camera_pos = saved_camera_pos; + } + + lv_gltf_matrices_saver_t(const lv_gltf_matrices_saver_t &) = delete; + lv_gltf_matrices_saver_t & operator=(const lv_gltf_matrices_saver_t &) = delete; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static GLuint lv_gltf_view_render_model(lv_gltf_t * viewer, lv_gltf_model_t * model, bool prepare_bg, bool dirty); +static void lv_gltf_view_push_opengl_state(lv_opengl_state_t * state); +static void lv_gltf_view_pop_opengl_state(const lv_opengl_state_t * state); +static void setup_finish_frame(void); +static void render_materials(lv_gltf_t * viewer, lv_gltf_model_t * gltf_data, const MaterialIndexMap & map, + bool is_transmission_pass); +static void render_skins(lv_gltf_t * viewer, lv_gltf_model_t * gltf_data); +static lv_result_t render_primary_output(lv_gltf_t * viewer, const lv_gltf_renwin_state_t * state, + int32_t texture_w, + int32_t texture_h, bool prepare_bg); + +static void lv_gltf_view_recache_all_transforms(lv_gltf_model_t * gltf_data); +static fastgltf::math::fmat3x3 create_texture_transform_matrix(std::unique_ptr & transform); +static fastgltf::math::nvec4 color_convert_to_srgb(fastgltf::math::nvec4 color); +static void render_uniform_color_alpha(GLint uniform_loc, fastgltf::math::nvec4 color); +static void render_uniform_color(GLint uniform_loc, fastgltf::math::nvec3 color); +static uint32_t render_texture(uint32_t tex_unit, uint32_t tex_name, int32_t tex_coord_index, + std::unique_ptr & tex_transform, GLint sampler, GLint uv_set, + GLint uv_transform); +static void draw_primitive(int32_t prim_num, lv_gltf_t * viewer, lv_gltf_model_t * gltf_data, fastgltf::Node & node, + std::size_t mesh_index, const fastgltf::math::fmat4x4 & matrix, + const lv_gltf_environment_t * env_tex, bool is_transmission_pass); + +static bool setup_primitive(int32_t prim_num, lv_gltf_t * viewer, lv_gltf_model_t * gltf_data, + fastgltf::Node & node, + std::size_t mesh_index, const fastgltf::math::fmat4x4 & matrix, + const lv_gltf_environment_t * env_tex, bool is_transmission_pass); + +static bool draw_material(lv_gltf_t * viewer, const lv_gltf_uniform_locations_t * uniforms, lv_gltf_model_t * model, + lv_gltf_primitive_t * _prim_data, size_t materialIndex, bool is_transmission_pass, GLuint program, + uint32_t * tex_num); + +static void draw_lights(lv_gltf_model_t * model, GLuint program); + +static lv_gltf_renwin_state_t setup_opaque_output(uint32_t texture_width, uint32_t texture_height); +static void setup_cleanup_opengl_output(lv_gltf_renwin_state_t * state); +static lv_gltf_renwin_state_t setup_primary_output(int32_t texture_width, int32_t texture_height, bool mipmaps_enabled); + +static void setup_view_proj_matrix_from_camera(lv_gltf_t * viewer, uint32_t camera, lv_gltf_view_desc_t * view_desc, + lv_gltf_model_t * gltf_data, bool transmission_pass); + +static void setup_view_proj_matrix(lv_gltf_t * viewer, lv_gltf_view_desc_t * view_desc, lv_gltf_model_t * gltf_data, + bool transmission_pass); +static lv_result_t setup_restore_opaque_output(lv_gltf_t * viewer, const lv_gltf_renwin_state_t * _ret, + uint32_t texture_w, + uint32_t texture_h, bool prepare_bg); +static void setup_draw_environment_background(lv_opengl_shader_manager_t * manager, lv_gltf_t * viewer, float blur); +static void setup_draw_solid_background(lv_gltf_t * viewer, lv_color_t bg_color, lv_opa_t bg_opa); +static void setup_environment_rotation_matrix(float env_rotation_angle, uint32_t shader_program); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +GLuint lv_gltf_view_render(lv_gltf_t * viewer) +{ + const size_t n = lv_array_size(&viewer->models); + + if(n == 0) { + return GL_NONE; + } + lv_gltf_model_t * model = *(lv_gltf_model_t **)lv_array_at(&viewer->models, 0); + + bool dirty = lv_memcmp(&viewer->last_desc, &viewer->desc, sizeof(viewer->desc)) != 0; + + for(size_t i = 0; i < n; ++i) { + lv_gltf_model_t * model = *(lv_gltf_model_t **)lv_array_at(&viewer->models, i); + dirty |= model->is_animation_enabled || model->write_ops_pending; + } + + GLuint texture_id = GL_NONE; + texture_id = lv_gltf_view_render_model(viewer, model, true, dirty); + for(size_t i = 1; i < n; ++i) { + lv_gltf_model_t * model = *(lv_gltf_model_t **)lv_array_at(&viewer->models, i); + lv_gltf_view_render_model(viewer, model, false, dirty); + } + + lv_memcpy(&(viewer->last_desc), &viewer->desc, sizeof(viewer->desc)); + + return texture_id; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_gltf_view_push_opengl_state(lv_opengl_state_t * state) +{ + /* Blend state */ + GL_CALL(glGetBooleanv(GL_BLEND, &state->blend_enabled)); + GL_CALL(glGetIntegerv(GL_BLEND_SRC_ALPHA, &state->blend_src)); + GL_CALL(glGetIntegerv(GL_BLEND_DST_ALPHA, &state->blend_dst)); + GL_CALL(glGetIntegerv(GL_BLEND_EQUATION, &state->blend_equation)); + + /* Depth state */ + GL_CALL(glGetBooleanv(GL_DEPTH_TEST, &state->depth_test_enabled)); + GL_CALL(glGetBooleanv(GL_DEPTH_WRITEMASK, &state->depth_mask)); + GL_CALL(glGetIntegerv(GL_DEPTH_FUNC, &state->depth_func)); + + /* Face culling state */ + GL_CALL(glGetBooleanv(GL_CULL_FACE, &state->cull_face_enabled)); + GL_CALL(glGetIntegerv(GL_CULL_FACE_MODE, &state->cull_face_mode)); + GL_CALL(glGetIntegerv(GL_FRONT_FACE, &state->front_face)); + + /* Stencil state */ + GL_CALL(glGetBooleanv(GL_STENCIL_TEST, &state->stencil_test_enabled)); + GL_CALL(glGetIntegerv(GL_STENCIL_WRITEMASK, (GLint *)&state->stencil_mask)); + GL_CALL(glGetIntegerv(GL_STENCIL_FUNC, &state->stencil_func)); + GL_CALL(glGetIntegerv(GL_STENCIL_REF, &state->stencil_ref)); + GL_CALL(glGetIntegerv(GL_STENCIL_VALUE_MASK, (GLint *)&state->stencil_value_mask)); + + /* Buffer bindings */ +#ifndef GL_VERTEX_ARRAY_BINDING +#ifdef GL_VERTEX_ARRAY_BINDING_OES +#define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES +#else +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#endif +#endif + GL_CALL(glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint *)&state->current_vao)); + GL_CALL(glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint *)&state->current_vbo)); + GL_CALL(glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, (GLint *)&state->current_ibo)); + GL_CALL(glGetIntegerv(GL_CURRENT_PROGRAM, (GLint *)&state->current_program)); + + /* Texture state */ + GL_CALL(glGetIntegerv(GL_ACTIVE_TEXTURE, &state->active_texture)); + GL_CALL(glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *)&state->bound_texture_2d)); + + /* Viewport and scissor */ + GL_CALL(glGetIntegerv(GL_VIEWPORT, state->viewport)); + GL_CALL(glGetBooleanv(GL_SCISSOR_TEST, &state->scissor_test_enabled)); + GL_CALL(glGetIntegerv(GL_SCISSOR_BOX, state->scissor_box)); + + /* Clear values */ + GL_CALL(glGetFloatv(GL_COLOR_CLEAR_VALUE, state->clear_color)); + GL_CALL(glGetFloatv(GL_DEPTH_CLEAR_VALUE, &state->clear_depth)); +} + +static void lv_gltf_view_pop_opengl_state(const lv_opengl_state_t * state) +{ + /* Restore blend state */ + if(state->blend_enabled) { + GL_CALL(glEnable(GL_BLEND)); + } + else { + GL_CALL(glDisable(GL_BLEND)); + } + GL_CALL(glBlendFunc(state->blend_src, state->blend_dst)); + GL_CALL(glBlendEquation(state->blend_equation)); + + /* Restore depth state */ + if(state->depth_test_enabled) { + GL_CALL(glEnable(GL_DEPTH_TEST)); + } + else { + GL_CALL(glDisable(GL_DEPTH_TEST)); + } + GL_CALL(glDepthMask(state->depth_mask)); + GL_CALL(glDepthFunc(state->depth_func)); + + /* Restore face culling state */ + if(state->cull_face_enabled) { + GL_CALL(glEnable(GL_CULL_FACE)); + } + else { + GL_CALL(glDisable(GL_CULL_FACE)); + } + GL_CALL(glCullFace(state->cull_face_mode)); + GL_CALL(glFrontFace(state->front_face)); + + /* Restore stencil state */ + if(state->stencil_test_enabled) { + GL_CALL(glEnable(GL_STENCIL_TEST)); + } + else { + GL_CALL(glDisable(GL_STENCIL_TEST)); + } + GL_CALL(glStencilMask(state->stencil_mask)); + GL_CALL(glStencilFunc(state->stencil_func, state->stencil_ref, state->stencil_value_mask)); + + /* Restore buffer bindings */ + GL_CALL(glBindVertexArray(state->current_vao)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, state->current_vbo)); + GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state->current_ibo)); + GL_CALL(glUseProgram(state->current_program)); + + /* Restore texture state */ + GL_CALL(glActiveTexture(state->active_texture)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, state->bound_texture_2d)); + + /* Restore viewport and scissor */ + GL_CALL(glViewport(state->viewport[0], state->viewport[1], state->viewport[2], state->viewport[3])); + if(state->scissor_test_enabled) { + GL_CALL(glEnable(GL_SCISSOR_TEST)); + } + else { + GL_CALL(glDisable(GL_SCISSOR_TEST)); + } + GL_CALL(glScissor(state->scissor_box[0], state->scissor_box[1], state->scissor_box[2], state->scissor_box[3])); + + /* Restore clear values */ + GL_CALL(glClearColor(state->clear_color[0], state->clear_color[1], state->clear_color[2], state->clear_color[3])); + GL_CALL(glClearDepthf(state->clear_depth)); +} + +static GLuint lv_gltf_view_render_model(lv_gltf_t * viewer, lv_gltf_model_t * model, bool is_first_model, bool dirty) +{ + lv_gltf_view_state_t * vstate = &viewer->state; + lv_gltf_view_desc_t * view_desc = &viewer->desc; + bool opt_draw_bg = is_first_model && (view_desc->bg_mode == LV_GLTF_BG_MODE_ENVIRONMENT); + bool opt_aa_this_frame = (view_desc->aa_mode == LV_GLTF_AA_MODE_ON) || + (view_desc->aa_mode == LV_GLTF_AA_MODE_DYNAMIC && model->last_frame_no_motion == true); + if(!is_first_model) { + /* If this data object is a secondary render pass, inherit the anti-alias setting for this frame from the first gltf_data drawn*/ + opt_aa_this_frame = view_desc->frame_was_antialiased; + } + + lv_opengl_state_t opengl_state; + lv_gltf_view_push_opengl_state(&opengl_state); + + int32_t last_render_w = view_desc->render_width; + int32_t last_render_h = view_desc->render_height; + view_desc->render_width = lv_obj_get_width((lv_obj_t *)viewer) * (opt_aa_this_frame ? 2 : 1); + view_desc->render_height = lv_obj_get_height((lv_obj_t *)viewer) * (opt_aa_this_frame ? 2 : 1); + + bool new_size = last_render_h != view_desc->render_height || last_render_w != view_desc->render_width; + + if(opt_aa_this_frame != model->last_frame_was_antialiased) { + /* Antialiasing state has changed since the last render */ + if(is_first_model) { + if(vstate->render_state_ready) { + setup_cleanup_opengl_output(&vstate->render_state); + vstate->render_state = setup_primary_output((uint32_t)view_desc->render_width, + (uint32_t)view_desc->render_height, + opt_aa_this_frame); + } + } + model->last_frame_was_antialiased = opt_aa_this_frame; + } + + view_desc->frame_was_antialiased = opt_aa_this_frame; + + if(new_size || !vstate->render_state_ready) { + vstate->render_state_ready = true; + vstate->render_state = + setup_primary_output(view_desc->render_width, view_desc->render_height, opt_aa_this_frame); + setup_finish_frame(); + } + if(vstate->render_opaque_buffer && vstate->opaque_render_state.framebuffer == 0) { + vstate->opaque_render_state = + setup_opaque_output(vstate->opaque_frame_buffer_width, vstate->opaque_frame_buffer_height); + setup_finish_frame(); + } + + bool last_frame_no_motion = model->_last_frame_no_motion; + model->_last_frame_no_motion = model->last_frame_no_motion; + model->last_frame_no_motion = true; + + + if(dirty || lv_gltf_data_transform_cache_is_empty(model) || (model->camera != model->last_camera_index)) { + model->last_frame_no_motion = false; + lv_gltf_view_recache_all_transforms(model); + } + else if(model->last_frame_no_motion && model->_last_frame_no_motion && last_frame_no_motion) { + /* Nothing changed at all, return the previous output frame */ + setup_finish_frame(); + lv_gltf_view_pop_opengl_state(&opengl_state); + return vstate->render_state.texture; + } + + render_skins(viewer, model); + + NodeDistanceVector distance_sort_nodes; + + for(const auto & kv : model->blended_nodes_by_material_index) { + for(const auto & pair : kv.second) { + auto node = pair.first; + auto new_node = NodeIndexDistancePair( + fastgltf::math::length( + model->view_pos - + lv_gltf_data_get_centerpoint(model, lv_gltf_data_get_cached_transform(model, node), + node->meshIndex.value(), pair.second)), + NodeIndexPair(node, pair.second)); + distance_sort_nodes.push_back(new_node); + } + } + std::sort(distance_sort_nodes.begin(), distance_sort_nodes.end(), + [](const NodeIndexDistancePair & a, const NodeIndexDistancePair & b) { + return a.first > b.first; + }); + + /* Reset the last material index to an unused value once per frame at the start*/ + model->last_material_index = 99999; + + if(vstate->render_opaque_buffer) { + std::optional saver; + if(!is_first_model) { + /* Cache the current matrices */ + saver.emplace(viewer); + } + + if(model->camera > 0) { + setup_view_proj_matrix_from_camera(viewer, model->camera - 1, view_desc, model, true); + } + else { + setup_view_proj_matrix(viewer, view_desc, model, true); + } + lv_result_t result = setup_restore_opaque_output(viewer, &vstate->opaque_render_state, + vstate->opaque_frame_buffer_width, + vstate->opaque_frame_buffer_height, is_first_model); + LV_ASSERT_MSG(result == LV_RESULT_OK, "Failed to setup opaque output which should never happen"); + if(result != LV_RESULT_OK) { + lv_gltf_view_pop_opengl_state(&opengl_state); + return vstate->render_state.texture; + } + + if(opt_draw_bg) { + setup_draw_environment_background(&viewer->shader_manager, viewer, view_desc->blur_bg); + } + + render_materials(viewer, model, model->opaque_nodes_by_material_index, true); + + for(const auto & node_distance_pair : distance_sort_nodes) { + const auto & node_element = node_distance_pair.second; + const auto & node = node_element.first; + draw_primitive(node_element.second, viewer, model, *node, node->meshIndex.value(), + lv_gltf_data_get_cached_transform(model, node), viewer->environment, true); + } + + GL_CALL(glBindTexture(GL_TEXTURE_2D, vstate->opaque_render_state.texture)); + GL_CALL(glGenerateMipmap(GL_TEXTURE_2D)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, GL_NONE)); + setup_finish_frame(); + } + + if(is_first_model) { + if(model->camera > 0) { + setup_view_proj_matrix_from_camera(viewer, model->camera - 1, view_desc, model, false); + } + else { + setup_view_proj_matrix(viewer, view_desc, model, false); + } + } + + lv_result_t result = render_primary_output(viewer, &vstate->render_state, view_desc->render_width, + view_desc->render_height, is_first_model); + + LV_ASSERT_MSG(result == LV_RESULT_OK, "Failed to restore primary output which should never happen"); + if(result != LV_RESULT_OK) { + lv_gltf_view_pop_opengl_state(&opengl_state); + return vstate->render_state.texture; + } + if(opt_draw_bg) { + setup_draw_environment_background(&viewer->shader_manager, viewer, view_desc->blur_bg); + } + + render_materials(viewer, model, model->opaque_nodes_by_material_index, false); + + for(const auto & node_distance_pair : distance_sort_nodes) { + const auto & node_element = node_distance_pair.second; + const auto & node = node_element.first; + draw_primitive(node_element.second, viewer, model, *node, node->meshIndex.value(), + lv_gltf_data_get_cached_transform(model, node), viewer->environment, false); + } + if(opt_aa_this_frame) { + GL_CALL(glBindTexture(GL_TEXTURE_2D, vstate->render_state.texture)); + GL_CALL(glGenerateMipmap(GL_TEXTURE_2D)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, GL_NONE)); + } + setup_finish_frame(); + lv_gltf_view_pop_opengl_state(&opengl_state); + return vstate->render_state.texture; +} + +static void setup_finish_frame(void) +{ + GL_CALL(glDisable(GL_DEPTH_TEST)); + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, 0)); + GL_CALL(glBindRenderbuffer(GL_RENDERBUFFER, 0)); + GL_CALL(glUseProgram(0)); +} + +static void render_materials(lv_gltf_t * viewer, lv_gltf_model_t * gltf_data, const MaterialIndexMap & map, + bool is_transmission_pass) +{ + for(const auto & kv : map) { + for(const auto & pair : kv.second) { + auto node = pair.first; + draw_primitive(pair.second, viewer, gltf_data, *node, node->meshIndex.value(), + lv_gltf_data_get_cached_transform(gltf_data, node), + viewer->environment, is_transmission_pass); + } + } +} + +static void render_skins(lv_gltf_t * viewer, lv_gltf_model_t * model) +{ + uint32_t skin_count = lv_gltf_data_get_skins_size(model); + if(skin_count == 0) { + return; + } + lv_gltf_data_delete_textures(model); + for(size_t i = 0; i < skin_count; ++i) { + const auto & skin_index = lv_gltf_data_get_skin(model, i); + const auto & skin = model->asset.skins[skin_index]; + auto & ibm = viewer->ibm_by_skin_then_node[skin_index]; + + size_t num_joints = skin.joints.size(); + size_t tex_width = std::ceil(std::sqrt((float)num_joints * 8.0f)); + + GLuint rtex = lv_gltf_data_create_texture(model); + GL_CALL(glBindTexture(GL_TEXTURE_2D, rtex)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + float * texture_data = (float *)lv_malloc(tex_width * tex_width * 4 * sizeof(*texture_data)); + LV_ASSERT_MALLOC(texture_data); + size_t texture_data_index = 0; + + for(uint64_t j = 0; j < num_joints; j++) { + auto & joint_node = model->asset.nodes[skin.joints[j]]; + fastgltf::math::fmat4x4 final_joint_matrix = + lv_gltf_data_get_cached_transform(model, &joint_node) * ibm[&joint_node]; + + lv_memcpy(&texture_data[texture_data_index], final_joint_matrix.data(), sizeof(float) * 16); + lv_memcpy(&texture_data[texture_data_index + 16], + fastgltf::math::transpose(fastgltf::math::inverse(final_joint_matrix)).data(), + sizeof(float) * 16); + + texture_data_index += 32; + } + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, tex_width, tex_width, 0, GL_RGBA, GL_FLOAT, texture_data)); + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, GL_NONE)); + lv_free(texture_data); + } +} +static void draw_primitive(int32_t prim_num, lv_gltf_t * viewer, lv_gltf_model_t * gltf_data, fastgltf::Node & node, + std::size_t mesh_index, const fastgltf::math::fmat4x4 & matrix, + const lv_gltf_environment_t * env_tex, bool is_transmission_pass) +{ + lv_gltf_mesh_data_t * mesh = lv_gltf_data_get_mesh(gltf_data, mesh_index); + const auto & asset = lv_gltf_data_get_asset(gltf_data); + const auto & _prim_data = lv_gltf_data_get_primitive_from_mesh(mesh, prim_num); + + std::size_t index_count = 0; + auto & indexAccessor = asset->accessors[asset->meshes[mesh_index].primitives[prim_num].indicesAccessor.value()]; + if(!setup_primitive(prim_num, viewer, gltf_data, node, mesh_index, matrix, env_tex, is_transmission_pass)) { + return; + } + + if(indexAccessor.bufferViewIndex.has_value()) { + index_count = (uint32_t)indexAccessor.count; + } + if(index_count > 0) { + GL_CALL(glDrawElements(_prim_data->primitiveType, index_count, _prim_data->indexType, 0)); + } +} +static bool setup_primitive(int32_t prim_num, lv_gltf_t * viewer, lv_gltf_model_t * model, fastgltf::Node & node, + std::size_t mesh_index, const fastgltf::math::fmat4x4 & matrix, + const lv_gltf_environment_t * env_tex, bool is_transmission_pass) +{ + lv_gltf_view_desc_t * view_desc = &viewer->desc; + lv_gltf_mesh_data_t * mesh = lv_gltf_data_get_mesh(model, mesh_index); + const auto & _prim_data = lv_gltf_data_get_primitive_from_mesh(mesh, prim_num); + auto & _prim_gltf_data = model->asset.meshes[mesh_index].primitives[prim_num]; + auto & mappings = _prim_gltf_data.mappings; + std::size_t materialIndex = + (!mappings.empty() && mappings[viewer->state.material_variant].has_value()) ? + mappings[viewer->state.material_variant].value() + 1 : + ((_prim_gltf_data.materialIndex.has_value()) ? (_prim_gltf_data.materialIndex.value() + 1) : 0); + + GL_CALL(glBindVertexArray(_prim_data->vertexArray)); + + lv_gltf_compiled_shader_t * compiled_shader = lv_gltf_get_compiled_shader(model, materialIndex); + const lv_gltf_uniform_locations_t * uniforms = &compiled_shader->uniforms; + + /* Fast path, primitive setup in the primitive draw render */ + if((model->last_material_index == materialIndex) && (model->last_pass_was_transmission == is_transmission_pass)) { + GL_CALL(glUniformMatrix4fv(uniforms->model_matrix, 1, GL_FALSE, &matrix[0][0])); + return true; + } + + model->last_material_index = materialIndex; + model->last_pass_was_transmission = is_transmission_pass; + + const GLuint program = compiled_shader->program; + + GL_CALL(glUseProgram(program)); + + GL_CALL(glUniformMatrix4fv(uniforms->model_matrix, 1, GL_FALSE, &matrix[0][0])); + GL_CALL(glUniformMatrix4fv(uniforms->view_matrix, 1, false, viewer->view_matrix.data())); + GL_CALL(glUniformMatrix4fv(uniforms->projection_matrix, 1, false, viewer->projection_matrix.data())); + GL_CALL(glUniformMatrix4fv(uniforms->view_projection_matrix, 1, false, viewer->view_projection_matrix.data())); + const auto & _campos = viewer->camera_pos; + GL_CALL(glUniform3f(uniforms->camera, _campos[0], _campos[1], _campos[2])); + + GL_CALL(glUniform1f(uniforms->exposure, view_desc->exposure)); + GL_CALL(glUniform1f(uniforms->env_intensity, view_desc->env_pow)); + GL_CALL(glUniform1i(uniforms->env_mip_count, (int32_t)env_tex->mip_count)); + setup_environment_rotation_matrix(viewer->environment->angle, program); + GL_CALL(glEnable(GL_CULL_FACE)); + GL_CALL(glDisable(GL_BLEND)); + GL_CALL(glEnable(GL_DEPTH_TEST)); + GL_CALL(glDepthMask(GL_TRUE)); + GL_CALL(glCullFace(GL_BACK)); + uint32_t tex_num = 0; + + if(!draw_material(viewer, uniforms, model, _prim_data, materialIndex, is_transmission_pass, program, &tex_num)) { + return false; + } + + const lv_gltf_view_state_t * vstate = &viewer->state; + if(!is_transmission_pass && vstate->render_opaque_buffer) { + GL_CALL(glActiveTexture(GL_TEXTURE0 + tex_num)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, vstate->opaque_render_state.texture)); + GL_CALL(glUniform1i(uniforms->transmission_framebuffer_sampler, tex_num)); + GL_CALL(glUniform2i(uniforms->transmission_framebuffer_size, (int32_t)vstate->opaque_frame_buffer_width, + (int32_t)vstate->opaque_frame_buffer_height)); + tex_num++; + } + + if(node.skinIndex.has_value()) { + GL_CALL(glActiveTexture(GL_TEXTURE0 + tex_num)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, lv_gltf_data_get_skin_texture_at(model, node.skinIndex.value()))); + GL_CALL(glUniform1i(uniforms->joints_sampler, tex_num)); + tex_num++; + } + if(env_tex->diffuse != GL_NONE) { + GL_CALL(glActiveTexture(GL_TEXTURE0 + tex_num)); + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, env_tex->diffuse)); + GL_CALL(glUniform1i(uniforms->env_diffuse_sampler, tex_num++)); + } + if(env_tex->specular != GL_NONE) { + GL_CALL(glActiveTexture(GL_TEXTURE0 + tex_num)); + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, env_tex->specular)); + GL_CALL(glUniform1i(uniforms->env_specular_sampler, tex_num++)); + } + if(env_tex->sheen != GL_NONE) { + GL_CALL(glActiveTexture(GL_TEXTURE0 + tex_num)); + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, env_tex->sheen)); + GL_CALL(glUniform1i(uniforms->env_sheen_sampler, tex_num++)); + } + if(env_tex->ggxLut != GL_NONE) { + GL_CALL(glActiveTexture(GL_TEXTURE0 + tex_num)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, env_tex->ggxLut)); + GL_CALL(glUniform1i(uniforms->env_ggx_lut_sampler, tex_num++)); + } + if(env_tex->charlie_lut != GL_NONE) { + GL_CALL(glActiveTexture(GL_TEXTURE0 + tex_num)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, env_tex->charlie_lut)); + GL_CALL(glUniform1i(uniforms->env_charlie_lut_sampler, tex_num++)); + } + return true; +} + +static bool draw_material(lv_gltf_t * viewer, const lv_gltf_uniform_locations_t * uniforms, lv_gltf_model_t * model, + lv_gltf_primitive_t * _prim_data, size_t materialIndex, bool is_transmission_pass, GLuint program, + uint32_t * tex_num) +{ + const auto & asset = lv_gltf_data_get_asset(model); + + bool has_material = asset->materials.size() > (materialIndex - 1); + + if(!has_material) { + render_uniform_color_alpha(uniforms->base_color_factor, fastgltf::math::fvec4(1.0f)); + GL_CALL(glUniform1f(uniforms->roughness_factor, 0.5f)); + GL_CALL(glUniform1f(uniforms->metallic_factor, 0.5f)); + GL_CALL(glUniform1f(uniforms->ior, 1.5f)); + GL_CALL(glUniform1f(uniforms->dispersion, 0.0f)); + GL_CALL(glUniform1f(uniforms->thickness, 0.01847f)); + return true; + } + + auto & gltfMaterial = asset->materials[materialIndex - 1]; + + if(is_transmission_pass && (gltfMaterial.transmission != NULL)) { + return false; + } + + if(gltfMaterial.doubleSided) + GL_CALL(glDisable(GL_CULL_FACE)); + if(gltfMaterial.alphaMode == fastgltf::AlphaMode::Blend) { + GL_CALL(glEnable(GL_BLEND)); + if(!is_transmission_pass) { + GL_CALL(glDepthMask(GL_FALSE)); + } + GL_CALL(glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); + GL_CALL(glBlendEquation(GL_FUNC_ADD)); + GL_CALL(glEnable(GL_CULL_FACE)); + } + else { + if(gltfMaterial.alphaMode == fastgltf::AlphaMode::Mask) { + GL_CALL(glUniform1f(uniforms->alpha_cutoff, gltfMaterial.alphaCutoff)); + GL_CALL(glDisable(GL_CULL_FACE)); + } + } + + draw_lights(model, program); +#if LV_GLTF_CONVERT_BASE_COLOR_TO_SRGB + render_uniform_color_alpha(uniforms->base_color_factor, color_convert_to_srgb(gltfMaterial.pbrData.baseColorFactor)); +#else + render_uniform_color_alpha(uniforms->base_color_factor, gltfMaterial.pbrData.baseColorFactor); +#endif + render_uniform_color(uniforms->emissive_factor, gltfMaterial.emissiveFactor); + + GL_CALL(glUniform1f(uniforms->emissive_strength, gltfMaterial.emissiveStrength)); + GL_CALL(glUniform1f(uniforms->roughness_factor, gltfMaterial.pbrData.roughnessFactor)); + GL_CALL(glUniform1f(uniforms->metallic_factor, gltfMaterial.pbrData.metallicFactor)); + GL_CALL(glUniform1f(uniforms->ior, gltfMaterial.ior)); + GL_CALL(glUniform1f(uniforms->dispersion, gltfMaterial.dispersion)); + + if(gltfMaterial.pbrData.baseColorTexture.has_value()) + *tex_num = render_texture(*tex_num, _prim_data->albedoTexture, _prim_data->baseColorTexcoordIndex, + gltfMaterial.pbrData.baseColorTexture->transform, uniforms->base_color_sampler, + uniforms->base_color_uv_set, uniforms->base_color_uv_transform); + if(gltfMaterial.emissiveTexture.has_value()) + *tex_num = render_texture(*tex_num, _prim_data->emissiveTexture, _prim_data->emissiveTexcoordIndex, + gltfMaterial.emissiveTexture->transform, uniforms->emissive_sampler, + uniforms->emissive_uv_set, uniforms->emissive_uv_transform); + if(gltfMaterial.pbrData.metallicRoughnessTexture.has_value()) + *tex_num = render_texture(*tex_num, _prim_data->metalRoughTexture, _prim_data->metallicRoughnessTexcoordIndex, + gltfMaterial.pbrData.metallicRoughnessTexture->transform, + uniforms->metallic_roughness_sampler, uniforms->metallic_roughness_uv_set, + uniforms->metallic_roughness_uv_transform); + if(gltfMaterial.occlusionTexture.has_value()) { + GL_CALL(glUniform1f(uniforms->occlusion_strength, static_cast(gltfMaterial.occlusionTexture->strength))); + *tex_num = render_texture(*tex_num, _prim_data->occlusionTexture, _prim_data->occlusionTexcoordIndex, + gltfMaterial.occlusionTexture->transform, uniforms->occlusion_sampler, + uniforms->occlusion_uv_set, uniforms->occlusion_uv_transform); + } + + if(gltfMaterial.normalTexture.has_value()) { + GL_CALL(glUniform1f(uniforms->normal_scale, static_cast(gltfMaterial.normalTexture->scale))); + *tex_num = render_texture(*tex_num, _prim_data->normalTexture, _prim_data->normalTexcoordIndex, + gltfMaterial.normalTexture->transform, uniforms->normal_sampler, + uniforms->normal_uv_set, uniforms->normal_uv_transform); + } + + if(gltfMaterial.clearcoat && gltfMaterial.clearcoat->clearcoatFactor > 0.0f) { + GL_CALL(glUniform1f(uniforms->clearcoat_factor, static_cast(gltfMaterial.clearcoat->clearcoatFactor))); + GL_CALL(glUniform1f(uniforms->clearcoat_roughness_factor, + static_cast(gltfMaterial.clearcoat->clearcoatRoughnessFactor))); + + if(gltfMaterial.clearcoat->clearcoatTexture.has_value()) + *tex_num = render_texture(*tex_num, _prim_data->clearcoatTexture, _prim_data->clearcoatTexcoordIndex, + gltfMaterial.clearcoat->clearcoatTexture->transform, + uniforms->clearcoat_sampler, uniforms->clearcoat_uv_set, + uniforms->clearcoat_uv_transform); + if(gltfMaterial.clearcoat->clearcoatRoughnessTexture.has_value()) + *tex_num = render_texture(*tex_num, _prim_data->clearcoatRoughnessTexture, + _prim_data->clearcoatRoughnessTexcoordIndex, + gltfMaterial.clearcoat->clearcoatRoughnessTexture->transform, + uniforms->clearcoat_roughness_sampler, uniforms->clearcoat_roughness_uv_set, + uniforms->clearcoat_roughness_uv_transform); + if(gltfMaterial.clearcoat->clearcoatNormalTexture.has_value()) { + GL_CALL(glUniform1f(uniforms->clearcoat_normal_scale, + static_cast(gltfMaterial.clearcoat->clearcoatNormalTexture->scale))); + *tex_num = render_texture(*tex_num, _prim_data->clearcoatNormalTexture, + _prim_data->clearcoatNormalTexcoordIndex, + gltfMaterial.clearcoat->clearcoatNormalTexture->transform, + uniforms->clearcoat_normal_sampler, uniforms->clearcoat_normal_uv_set, + uniforms->clearcoat_normal_uv_transform); + } + } + + if(gltfMaterial.volume) { + GL_CALL(glUniform1f(uniforms->attenuation_distance, gltfMaterial.volume->attenuationDistance)); + render_uniform_color(uniforms->attenuation_color, gltfMaterial.volume->attenuationColor); + GL_CALL(glUniform1f(uniforms->thickness, gltfMaterial.volume->thicknessFactor)); + if(gltfMaterial.volume->thicknessTexture.has_value()) { + *tex_num = render_texture(*tex_num, _prim_data->thicknessTexture, _prim_data->thicknessTexcoordIndex, + gltfMaterial.volume->thicknessTexture->transform, uniforms->thickness_sampler, + uniforms->thickness_uv_set, uniforms->thickness_uv_transform); + } + } + + if(gltfMaterial.transmission) { + GL_CALL(glUniform1f(uniforms->transmission_factor, gltfMaterial.transmission->transmissionFactor)); + GL_CALL(glUniform2i(uniforms->screen_size, viewer->desc.render_width, viewer->desc.render_height)); + if(gltfMaterial.transmission->transmissionTexture.has_value()) + *tex_num = render_texture(*tex_num, _prim_data->transmissionTexture, + _prim_data->transmissionTexcoordIndex, + gltfMaterial.transmission->transmissionTexture->transform, + uniforms->transmission_sampler, uniforms->transmission_uv_set, + uniforms->transmission_uv_transform); + } + + if(gltfMaterial.sheen) { + render_uniform_color(uniforms->sheen_color_factor, gltfMaterial.sheen->sheenColorFactor); + GL_CALL(glUniform1f(uniforms->sheen_roughness_factor, + static_cast(gltfMaterial.sheen->sheenRoughnessFactor))); + if(gltfMaterial.sheen->sheenColorTexture.has_value()) { + LV_LOG_WARN("Material has unhandled sheen texture"); + } + } + if(gltfMaterial.specular) { + render_uniform_color(uniforms->specular_color_factor, gltfMaterial.specular->specularColorFactor); + GL_CALL(glUniform1f(uniforms->specular_factor, static_cast(gltfMaterial.specular->specularFactor))); + if(gltfMaterial.specular->specularTexture.has_value()) { + LV_LOG_WARN("Material has unhandled specular texture"); + } + if(gltfMaterial.specular->specularColorTexture.has_value()) { + LV_LOG_WARN("Material has unhandled specular color texture"); + } + } + +#if FASTGLTF_ENABLE_DEPRECATED_EXT + if(gltfMaterial.specularGlossiness) { + LV_LOG_WARN( + "Model uses outdated legacy mode pbr_speculargloss. Please update this model to a new shading model "); + render_uniform_color_alpha(uniforms->diffuse_factor, gltfMaterial.specularGlossiness->diffuseFactor); + render_uniform_color(uniforms->specular_factor, gltfMaterial.specularGlossiness->specularFactor); + GL_CALL(glUniform1f(uniforms->glossiness_factor, + static_cast(gltfMaterial.specularGlossiness->glossinessFactor))); + if(gltfMaterial.specularGlossiness->diffuseTexture.has_value()) { + *tex_num = render_texture(*tex_num, _prim_data->diffuseTexture, _prim_data->diffuseTexcoordIndex, + gltfMaterial.specularGlossiness->diffuseTexture->transform, + uniforms->diffuse_sampler, uniforms->diffuse_uv_set, + uniforms->diffuse_uv_transform); + } + if(gltfMaterial.specularGlossiness->specularGlossinessTexture.has_value()) { + *tex_num = render_texture(*tex_num, _prim_data->specularGlossinessTexture, + _prim_data->specularGlossinessTexcoordIndex, + gltfMaterial.specularGlossiness->specularGlossinessTexture->transform, + uniforms->specular_glossiness_sampler, uniforms->specular_glossiness_uv_set, + uniforms->specular_glossiness_uv_transform); + } + } +#endif + + if(gltfMaterial.diffuseTransmission && gltfMaterial.diffuseTransmission->diffuseTransmissionFactor > 0.0f) { + render_uniform_color(uniforms->diffuse_transmission_color_factor, + gltfMaterial.diffuseTransmission->diffuseTransmissionColorFactor); + GL_CALL(glUniform1f(uniforms->diffuse_transmission_factor, + static_cast(gltfMaterial.diffuseTransmission->diffuseTransmissionFactor))); + if(gltfMaterial.diffuseTransmission->diffuseTransmissionTexture.has_value()) { + *tex_num = render_texture(*tex_num, _prim_data->diffuseTransmissionTexture, + _prim_data->diffuseTransmissionTexcoordIndex, + gltfMaterial.diffuseTransmission->diffuseTransmissionTexture->transform, + uniforms->diffuse_transmission_sampler, uniforms->diffuse_transmission_uv_set, + uniforms->diffuse_transmission_uv_transform); + } + if(gltfMaterial.diffuseTransmission->diffuseTransmissionColorTexture.has_value()) { + *tex_num = render_texture(*tex_num, _prim_data->diffuseTransmissionColorTexture, + _prim_data->diffuseTransmissionColorTexcoordIndex, + gltfMaterial.diffuseTransmission->diffuseTransmissionColorTexture->transform, + uniforms->diffuse_transmission_color_sampler, + uniforms->diffuse_transmission_color_uv_set, + uniforms->diffuse_transmission_color_uv_transform); + } + } + return true; +} +static void draw_lights(lv_gltf_model_t * model, GLuint program) +{ + if(model->node_by_light_index.empty()) { + return; + } + size_t max_light_nodes = model->node_by_light_index.size(); + size_t max_scene_lights = model->asset.lights.size(); + if(max_scene_lights != max_light_nodes) { + LV_LOG_ERROR("Scene light count (%zu) != scene light node count (%zu)\n", max_scene_lights, max_light_nodes); + return; + } + + char tag[100]; + char prefix[20]; + for(size_t i = 0; i < max_scene_lights; i++) { + // Update each field of the light struct + lv_snprintf(prefix, sizeof(prefix), "u_Lights[%zu]", i + 1); + auto & lightNode = model->node_by_light_index[i]; + const fastgltf::math::fmat4x4 & light_matrix = lv_gltf_data_get_cached_transform(model, lightNode); + + lv_snprintf(tag, sizeof(tag), "%s.position", prefix); + glUniform3fv(glGetUniformLocation(program, tag), 1, &light_matrix[3][0]); + + lv_snprintf(tag, sizeof(tag), "%s.direction", prefix); + float tlight_dir[3] = { -light_matrix[2][0], -light_matrix[2][1], -light_matrix[2][2] }; + + glUniform3fv(glGetUniformLocation(program, tag), 1, &tlight_dir[0]); + + lv_snprintf(tag, sizeof(tag), "%s.range", prefix); + const auto & m = light_matrix.data(); + + if(model->asset.lights[i].range.has_value()) { + float light_scale = fastgltf::math::length(fastgltf::math::fvec3(m[0], m[4], m[8])); + glUniform1f(glGetUniformLocation(program, tag), model->asset.lights[i].range.value() * light_scale); + } + else { + glUniform1f(glGetUniformLocation(program, tag), 9999.f); + } + + lv_snprintf(tag, sizeof(tag), "%s.color", prefix); + glUniform3fv(glGetUniformLocation(program, tag), 1, &(model->asset.lights[i].color.data()[0])); + + lv_snprintf(tag, sizeof(tag), "%s.intensity", prefix); + glUniform1f(glGetUniformLocation(program, tag), model->asset.lights[i].intensity); + + lv_snprintf(tag, sizeof(tag), "%s.innerConeCos", prefix); + if(model->asset.lights[i].innerConeAngle.has_value()) { + glUniform1f(glGetUniformLocation(program, tag), + std::cos(model->asset.lights[i].innerConeAngle.value())); + + } + else { + glUniform1f(glGetUniformLocation(program, tag), -1.0f); + } + + lv_snprintf(tag, sizeof(tag), "%s.outerConeCos", prefix); + + if(model->asset.lights[i].outerConeAngle.has_value()) { + glUniform1f(glGetUniformLocation(program, tag), + std::cos(model->asset.lights[i].outerConeAngle.value())); + + } + else { + glUniform1f(glGetUniformLocation(program, tag), -1.0f); + } + lv_snprintf(tag, sizeof(tag), "%s.type", prefix); + glUniform1i(glGetUniformLocation(program, tag), (GLint)model->asset.lights[i].type); + } +} + +lv_result_t render_primary_output(lv_gltf_t * viewer, const lv_gltf_renwin_state_t * state, int32_t texture_w, + int32_t texture_h, bool prepare_bg) +{ + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, state->framebuffer)); + + if(glGetError() != GL_NO_ERROR) { + return LV_RESULT_INVALID; + } + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, state->texture, 0)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, state->renderbuffer, 0)); + GL_CALL(glViewport(0, 0, texture_w, texture_h)); + if(prepare_bg) { + /* cast is safe because viewer is a lv_obj_t*/ + setup_draw_solid_background(viewer, lv_obj_get_style_bg_color((lv_obj_t *)viewer, LV_PART_MAIN), + lv_obj_get_style_bg_opa((lv_obj_t *)viewer, LV_PART_MAIN)); + } + + return glGetError() == GL_NO_ERROR ? LV_RESULT_OK : LV_RESULT_INVALID; +} + +static fastgltf::math::nvec4 color_convert_to_srgb(fastgltf::math::nvec4 color) +{ + const float SRGB_GAMMA = 2.4f; + const float INV_SRGB_GAMMA = 1.0f / SRGB_GAMMA; + // Apply the sRGB conversion formula: + // sRGB = 12.92 * C, if C <= 0.0031308 + // sRGB = 1.055 * C^(1/2.4) - 0.055, if C > 0.0031308 + + fastgltf::math::nvec4 srgbColor; + for(int i = 0; i < 3; i++) { // Loop through R, G, B channels + float c = color[i]; + if(c <= 0.0031308f) { + srgbColor[i] = 12.92f * c; + } + else { + srgbColor[i] = 1.055f * pow(c, INV_SRGB_GAMMA) - 0.055f; + } + } + + srgbColor[3] = color[3]; + return srgbColor; +} + +static void render_uniform_color_alpha(GLint uniform_loc, fastgltf::math::nvec4 color) +{ + GL_CALL(glUniform4f(uniform_loc, static_cast(color[0]), static_cast(color[1]), + static_cast(color[2]), static_cast(color[3]))); +} +static void render_uniform_color(GLint uniform_loc, fastgltf::math::nvec3 color) +{ + GL_CALL(glUniform3f(uniform_loc, static_cast(color[0]), static_cast(color[1]), + static_cast(color[2]))); +} + +static uint32_t render_texture(uint32_t tex_unit, uint32_t tex_name, int32_t tex_coord_index, + std::unique_ptr & tex_transform, GLint sampler, GLint uv_set, + GLint uv_transform) +{ + /* Activate the texture unit*/ + GL_CALL(glActiveTexture(GL_TEXTURE0 + tex_unit)); + /* Bind the texture (assuming 2D texture) */ + GL_CALL(glBindTexture(GL_TEXTURE_2D, tex_name)); + /* Set the sampler to use the texture unit */ + GL_CALL(glUniform1i(sampler, tex_unit)); + /* Set the UV set index */ + GL_CALL(glUniform1i(uv_set, tex_coord_index)); + if(tex_transform != NULL) { + GL_CALL(glUniformMatrix3fv(uv_transform, 1, GL_FALSE, &(create_texture_transform_matrix(tex_transform)[0][0]))); + } + + tex_unit++; + return tex_unit; +} + +static fastgltf::math::fmat3x3 create_texture_transform_matrix(std::unique_ptr & transform) +{ + fastgltf::math::fmat3x3 rotation = fastgltf::math::fmat3x3(0.f); + fastgltf::math::fmat3x3 scale = fastgltf::math::fmat3x3(0.f); + fastgltf::math::fmat3x3 translation = fastgltf::math::fmat3x3(0.f); + fastgltf::math::fmat3x3 result = fastgltf::math::fmat3x3(0.f); + + float s = std::sin(transform->rotation); + float c = std::cos(transform->rotation); + rotation[0][0] = c; + rotation[1][1] = c; + rotation[0][1] = s; + rotation[1][0] = -s; + rotation[2][2] = 1.0f; + + scale[0][0] = transform->uvScale[0]; + scale[1][1] = transform->uvScale[1]; + scale[2][2] = 1.0f; + + translation[0][0] = 1.0f; + translation[1][1] = 1.0f; + translation[0][2] = transform->uvOffset[0]; + translation[1][2] = transform->uvOffset[1]; + translation[2][2] = 1.0f; + + result = translation * rotation; + result = result * scale; + return result; +} + +static lv_gltf_renwin_state_t setup_opaque_output(uint32_t texture_width, uint32_t texture_height) +{ + lv_gltf_renwin_state_t result; + + GLuint rtex; + GL_CALL(glGenTextures(1, &rtex)); + result.texture = rtex; + + GL_CALL(glBindTexture(GL_TEXTURE_2D, result.texture)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width, texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, GL_NONE)); + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + + GLuint rdepth; + GL_CALL(glGenTextures(1, &rdepth)); + result.renderbuffer = rdepth; + GL_CALL(glBindTexture(GL_TEXTURE_2D, result.renderbuffer)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); +#ifdef __EMSCRIPTEN__ + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, LV_GL_PREFERRED_DEPTH, texture_width, texture_height, 0, GL_DEPTH_COMPONENT, + GL_UNSIGNED_INT, NULL)); +#else + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, LV_GL_PREFERRED_DEPTH, texture_width, texture_height, 0, GL_DEPTH_COMPONENT, + GL_UNSIGNED_SHORT, NULL)); +#endif + GL_CALL(glBindTexture(GL_TEXTURE_2D, GL_NONE)); + + GL_CALL(glGenFramebuffers(1, &result.framebuffer)); + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, result.framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, result.texture, 0)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, result.renderbuffer, 0)); + + return result; +} + +static lv_gltf_renwin_state_t setup_primary_output(int32_t texture_width, int32_t texture_height, bool mipmaps_enabled) +{ + lv_gltf_renwin_state_t result; + + GLuint rtex; + GL_CALL(glGenTextures(1, &rtex)); + result.texture = rtex; + GL_CALL(glBindTexture(GL_TEXTURE_2D, result.texture)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + mipmaps_enabled ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1)); + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width, texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, GL_NONE)); + GL_CALL(glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + + GLuint rdepth; + GL_CALL(glGenTextures(1, &rdepth)); + result.renderbuffer = rdepth; + GL_CALL(glBindTexture(GL_TEXTURE_2D, result.renderbuffer)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1)); +#ifdef __EMSCRIPTEN__ // Check if compiling for Emscripten (WebGL) + // For WebGL2 + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, LV_GL_PREFERRED_DEPTH, texture_width, texture_height, 0, GL_DEPTH_COMPONENT, + GL_UNSIGNED_INT, NULL)); +#else + // For Desktop OpenGL + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, LV_GL_PREFERRED_DEPTH, texture_width, texture_height, 0, GL_DEPTH_COMPONENT, + GL_UNSIGNED_SHORT, NULL)); +#endif + GL_CALL(glBindTexture(GL_TEXTURE_2D, GL_NONE)); + + GL_CALL(glGenFramebuffers(1, &result.framebuffer)); + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, result.framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, result.texture, 0)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, result.renderbuffer, 0)); + + return result; +} + +static void setup_cleanup_opengl_output(lv_gltf_renwin_state_t * state) +{ + if(!state) { + return; + } + if(state->framebuffer) { + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, 0)); + GL_CALL(glDeleteFramebuffers(1, &state->framebuffer)); + state->framebuffer = 0; + } + if(state->texture) { + GL_CALL(glDeleteTextures(1, &state->texture)); + state->texture = 0; + } + if(state->renderbuffer) { + GL_CALL(glDeleteTextures(1, &state->renderbuffer)); + state->renderbuffer = 0; + } +} +static void setup_view_proj_matrix_from_camera(lv_gltf_t * viewer, uint32_t camera, lv_gltf_view_desc_t * view_desc, + lv_gltf_model_t * model, bool transmission_pass) +{ + /* The following matrix math is for the projection matrices as defined by the glTF spec:*/ + /* https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#projection-matrices*/ + + fastgltf::math::fmat4x4 projection; + const auto & asset = lv_gltf_data_get_asset(model); + + auto width = view_desc->render_width; + auto height = view_desc->render_height; + /* It's possible the transmission pass should simply use the regular passes aspect despite having different metrics itself. */ + /* TODO: test both ways to see which has less distortion*/ + + float aspect = (float)width / (float)height; + if(transmission_pass) { + width = LV_GLTF_TRANSMISSION_PASS_SIZE; + height = LV_GLTF_TRANSMISSION_PASS_SIZE; + } + + std::visit(fastgltf::visitor{ + [&](fastgltf::Camera::Perspective & perspective) + { + projection = fastgltf::math::fmat4x4(0.0f); + projection[0][0] = 1.f / (aspect * tan(0.5f * perspective.yfov)); + projection[1][1] = 1.f / (tan(0.5f * perspective.yfov)); + projection[2][3] = -1; + + if(perspective.zfar.has_value()) { + // Finite projection matrix + projection[2][2] = (*perspective.zfar + perspective.znear) / + (perspective.znear - *perspective.zfar); + projection[3][2] = (2 * *perspective.zfar * perspective.znear) / + (perspective.znear - *perspective.zfar); + } + else { + // Infinite projection matrix + projection[2][2] = -1; + projection[3][2] = -2 * perspective.znear; + } + }, + [&](fastgltf::Camera::Orthographic & orthographic) + { + projection = fastgltf::math::fmat4x4(1.0f); + projection[0][0] = (1.f / orthographic.xmag) * aspect; + projection[1][1] = 1.f / orthographic.ymag; + projection[2][2] = 2.f / (orthographic.znear - orthographic.zfar); + projection[3][2] = + (orthographic.zfar + orthographic.znear) / (orthographic.znear - orthographic.zfar); + }, + }, + asset->cameras[camera].camera); + + viewer->view_matrix = model->view_mat; + viewer->camera_pos = model->view_pos; + viewer->projection_matrix = projection; + viewer->view_projection_matrix = projection * viewer->view_matrix; +} + +static void setup_view_proj_matrix(lv_gltf_t * viewer, lv_gltf_view_desc_t * view_desc, lv_gltf_model_t * model, + bool transmission_pass) +{ + LV_UNUSED(model); + const lv_gltf_model_t * main_model = *(lv_gltf_model_t **)lv_array_at(&viewer->models, 0); + auto b_radius = lv_gltf_data_get_radius(main_model); + + float radius = b_radius * LV_GLTF_DISTANCE_SCALE_FACTOR; + radius *= view_desc->distance; + + fastgltf::math::fvec3 rcam_dir = fastgltf::math::fvec3(0.0f, 0.0f, 1.0f); + + fastgltf::math::fmat3x3 rotation1 = + fastgltf::math::asMatrix(lv_gltf_math_euler_to_quaternion(0.f, 0.f, fastgltf::math::radians(view_desc->pitch))); + fastgltf::math::fmat3x3 rotation2 = + fastgltf::math::asMatrix(lv_gltf_math_euler_to_quaternion(fastgltf::math::radians(view_desc->yaw), 0.f, 0.f)); + + rcam_dir = rotation1 * rcam_dir; + rcam_dir = rotation2 * rcam_dir; + + fastgltf::math::fvec3 ncam_dir = fastgltf::math::normalize(rcam_dir); + fastgltf::math::fvec3 cam_target = fastgltf::math::fvec3(view_desc->focal_x, view_desc->focal_y, view_desc->focal_z); + fastgltf::math::fvec3 cam_position = fastgltf::math::fvec3(cam_target[0] + (ncam_dir[0] * radius), + cam_target[1] + (ncam_dir[1] * radius), + cam_target[2] + (ncam_dir[2] * radius)); + + fastgltf::math::fmat4x4 view_mat = + lv_gltf_math_look_at_rh(cam_position, cam_target, fastgltf::math::fvec3(0.0f, 1.0f, 0.0f)); + + // Create Projection Matrix + fastgltf::math::fmat4x4 projection; + float fov = view_desc->fov; + + float znear = b_radius * 0.05f; + float zfar = b_radius * std::max(4.0, 8.0 * view_desc->distance); + auto width = view_desc->render_width; + auto height = view_desc->render_height; + // It's possible the transmission pass should simply use the regular passes aspect despite having different metrics itself. Testing both ways to see which has less distortion + float aspect = (float)width / (float)height; + if(transmission_pass) { + width = 256; + height = 256; + } + + if(fov <= 0.0f) { + // Isometric view: create an orthographic projection + float orthoSize = view_desc->distance * b_radius; // Adjust as needed + + projection = fastgltf::math::fmat4x4(1.0f); + projection[0][0] = -(orthoSize * aspect); + projection[1][1] = (orthoSize); + projection[2][2] = 2.f / (znear - zfar); + projection[3][2] = (zfar + znear) / (znear - zfar); + + } + else { + // Perspective view + projection = fastgltf::math::fmat4x4(0.0f); + LV_ASSERT(width != 0 && height != 0); + projection[0][0] = 1.f / (aspect * tan(0.5f * fastgltf::math::radians(fov))); + projection[1][1] = 1.f / (tan(0.5f * fastgltf::math::radians(fov))); + projection[2][3] = -1; + + // Finite projection matrix + projection[2][2] = (zfar + znear) / (znear - zfar); + projection[3][2] = (2.f * zfar * znear) / (znear - zfar); + } + + viewer->view_matrix = view_mat; + viewer->projection_matrix = projection; + viewer->view_projection_matrix = projection * view_mat; + viewer->camera_pos = cam_position; +} + + +static lv_result_t setup_restore_opaque_output(lv_gltf_t * viewer, const lv_gltf_renwin_state_t * renwin_state, + uint32_t texture_w, + uint32_t texture_h, bool prepare_bg) +{ + LV_LOG_TRACE("Color texture ID: %u, Depth texture ID: %u", renwin_state->texture, renwin_state->renderbuffer); + + GL_CALL(glBindFramebuffer(GL_FRAMEBUFFER, renwin_state->framebuffer)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renwin_state->texture, 0)); + GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, renwin_state->renderbuffer, 0)); + GL_CALL(glViewport(0, 0, texture_w, texture_h)); + if(prepare_bg) { + /* cast is safe because viewer is a lv_obj_t*/ + setup_draw_solid_background(viewer, lv_obj_get_style_bg_color((lv_obj_t *)viewer, LV_PART_MAIN), + lv_obj_get_style_bg_opa((lv_obj_t *)viewer, LV_PART_MAIN)); + } + return glGetError() == GL_NO_ERROR ? LV_RESULT_OK : LV_RESULT_INVALID; +} + +static void setup_draw_environment_background(lv_opengl_shader_manager_t * manager, lv_gltf_t * viewer, float blur) +{ + GL_CALL(glBindVertexArray(manager->bg_vao)); + + GL_CALL(glUseProgram(manager->bg_program)); + GL_CALL(glEnable(GL_CULL_FACE)); + GL_CALL(glDisable(GL_BLEND)); + GL_CALL(glDisable(GL_DEPTH_TEST)); + GL_CALL(glUniformMatrix4fv(glGetUniformLocation(manager->bg_program, "u_ViewProjectionMatrix"), 1, false, + viewer->view_projection_matrix.data())); + + /* Bind the texture to the specified texture unit*/ + GL_CALL(glActiveTexture(GL_TEXTURE0 + 0)); + GL_CALL(glBindTexture(GL_TEXTURE_CUBE_MAP, viewer->environment->specular)); + + GL_CALL(glUniform1i(glGetUniformLocation(manager->bg_program, "u_GGXEnvSampler"), 0)); + + GL_CALL(glUniform1i(glGetUniformLocation(manager->bg_program, "u_MipCount"), viewer->environment->mip_count)); + GL_CALL(glUniform1f(glGetUniformLocation(manager->bg_program, "u_EnvBlurNormalized"), blur)); + GL_CALL(glUniform1f(glGetUniformLocation(manager->bg_program, "u_EnvIntensity"), 1.0f)); + GL_CALL(glUniform1f(glGetUniformLocation(manager->bg_program, "u_Exposure"), 1.0f)); + + setup_environment_rotation_matrix(viewer->environment->angle, manager->bg_program); + + GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, manager->bg_index_buf)); + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, manager->bg_vertex_buf)); + GL_CALL(glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, NULL)); + + GL_CALL(glBindVertexArray(0)); + return; +} + +static void setup_draw_solid_background(lv_gltf_t * viewer, lv_color_t bg_color, lv_opa_t bg_opa) +{ + LV_UNUSED(viewer); + GL_CALL(glClearDepthf(1.0f)); + /* Red / blue color order reversed below so they'll end up in the correct order + * after the shader swaps the channels again, back to correct. */ + GL_CALL(glClearColor((float)bg_color.blue / 255.0f, (float)bg_color.green / 255.0f, + (float)bg_color.red / 255.0f, (float)bg_opa / 255.0f)); + + GL_CALL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + +} + +static void lv_gltf_view_recache_all_transforms(lv_gltf_model_t * model) +{ + int32_t anim_num = model->current_animation; + uint32_t scene_index = 0; + + model->last_camera_index = model->camera; + model->write_ops_flushed = true; + model->write_ops_pending = false; + size_t current_camera_count = 0; + + lv_gltf_data_clear_transform_cache(model); + + auto tmat = fastgltf::math::fmat4x4{}; + fastgltf::custom_iterate_scene_nodes( + model, scene_index, &tmat, + [&](lv_gltf_model_node_t * node, fastgltf::math::fmat4x4 & parentworldmatrix, + fastgltf::math::fmat4x4 & localmatrix) { + bool made_changes = false; + bool made_rotation_changes = false; + if(lv_gltf_data_animation_get_channel_set(anim_num, model, node->fastgltf_node)->size() > 0) { + lv_gltf_data_animation_matrix_apply(model->local_timestamp / 1000., anim_num, model, node->fastgltf_node, + localmatrix); + made_changes = true; + } + bool worldmatrix_was_inlined = false; + fastgltf::math::fmat4x4 inlined_worldmatrix; + const uint32_t write_ops_count = lv_array_size(&node->write_ops); + if(node->read_attrs || write_ops_count > 0) { + fastgltf::math::fvec3 local_pos; + fastgltf::math::fquat local_quat; + fastgltf::math::fvec3 local_scale; + fastgltf::math::decomposeTransformMatrix(localmatrix, local_scale, local_quat, local_pos); + fastgltf::math::fvec3 local_rot = lv_gltf_math_quaternion_to_euler(local_quat); + + for(uint32_t i = 0; i < write_ops_count; ++i) { + lv_gltf_write_op_t * write_op = (lv_gltf_write_op_t *)lv_array_at(&node->write_ops, i); + made_changes = true; + switch(write_op->prop) { + case LV_GLTF_NODE_PROP_POSITION: + local_pos[write_op->channel] = write_op->value; + break; + case LV_GLTF_NODE_PROP_ROTATION: + local_rot[write_op->channel] = write_op->value; + made_rotation_changes = true; + break; + case LV_GLTF_NODE_PROP_SCALE: + local_scale[write_op->channel] = write_op->value; + break; + } + } + + /* Rebuild the local matrix after applying all write operations*/ + if(made_rotation_changes) local_quat = lv_gltf_math_euler_to_quaternion(local_rot[0], local_rot[1], local_rot[2]); + + if(node->fastgltf_node->children.size() == 0) { + worldmatrix_was_inlined = true; + inlined_worldmatrix = fastgltf::math::scale(fastgltf::math::rotate(fastgltf::math::translate(fastgltf::math::fmat4x4( + parentworldmatrix), local_pos), local_quat), local_scale); + } + else { + localmatrix = fastgltf::math::scale(fastgltf::math::rotate(fastgltf::math::translate(fastgltf::math::fmat4x4(), + local_pos), local_quat), local_scale); + } + + if(node->read_attrs) { + bool value_changed = false; + lv_3dpoint_t * target_local_position = &node->read_attrs->node_data.local_position; + lv_3dpoint_t * target_world_position = &node->read_attrs->node_data.world_position; + lv_3dpoint_t * target_scale = &node->read_attrs->node_data.scale; + lv_3dpoint_t * target_rotation = &node->read_attrs->node_data.rotation; + + if(node->read_attrs->read_world_position) { + fastgltf::math::fvec3 world_pos; + fastgltf::math::fquat world_quat; + fastgltf::math::fvec3 world_scale; + fastgltf::math::decomposeTransformMatrix(parentworldmatrix * localmatrix, + world_scale, world_quat, world_pos); + if(lv_memcmp(target_world_position, world_pos.data(), sizeof(*target_world_position))) { + lv_memcpy(target_world_position, world_pos.data(), sizeof(*target_world_position)); + value_changed = true; + } + } + if(lv_memcmp(target_local_position, local_pos.data(), sizeof(*target_local_position))) { + lv_memcpy(target_local_position, local_pos.data(), sizeof(*target_local_position)); + value_changed = true; + } + if(lv_memcmp(target_rotation, local_rot.data(), sizeof(*target_rotation))) { + lv_memcpy(target_rotation, local_rot.data(), sizeof(*target_rotation)); + value_changed = true; + } + if(lv_memcmp(target_scale, local_scale.data(), sizeof(*target_scale))) { + lv_memcpy(target_scale, local_scale.data(), sizeof(*target_scale)); + value_changed = true; + } + node->read_attrs->value_changed |= value_changed; + } + } + + if(made_changes || !lv_gltf_data_has_cached_transform(model, node->fastgltf_node)) { + auto world_matrix = worldmatrix_was_inlined ? inlined_worldmatrix : (parentworldmatrix * localmatrix); + lv_gltf_data_set_cached_transform(model, node->fastgltf_node, world_matrix); + } + + if(node->fastgltf_node->cameraIndex.has_value()) { + current_camera_count++; + if(current_camera_count == model->camera) { + fastgltf::math::fmat4x4 cammat = worldmatrix_was_inlined ? inlined_worldmatrix : (parentworldmatrix * localmatrix); + fastgltf::removeScale(cammat); + model->view_pos = cammat.col(3); /* Implicit conversion from 4 element column to 3 element vector */ + model->view_mat = fastgltf::math::inverse(cammat); + } + } + }); +} + +static void setup_environment_rotation_matrix(float env_rotation_angle, uint32_t shader_program) +{ + fastgltf::math::fmat3x3 rotmat = + fastgltf::math::asMatrix(lv_gltf_math_euler_to_quaternion(env_rotation_angle, 0.f, 3.14159f)); + + // Get the uniform location and set the uniform + int32_t u_loc; + GL_CALL(u_loc = glGetUniformLocation(shader_program, "u_EnvRotation")); + GL_CALL(glUniformMatrix3fv(u_loc, 1, GL_FALSE, (const GLfloat *)rotmat.data())); +} + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view_shader.cpp b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view_shader.cpp new file mode 100644 index 0000000..92f828f --- /dev/null +++ b/inc/lvgl/src/libs/gltf/gltf_view/lv_gltf_view_shader.cpp @@ -0,0 +1,379 @@ +/** + * @file lv_gltf_view_shader.cpp + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gltf_view_internal.h" +#if LV_USE_GLTF + +#include "fastgltf/types.hpp" +#include "../gltf_data/lv_gltf_data_internal.hpp" +#include "../gltf_data/lv_gltf_data_internal.h" +#include "../../../drivers/opengles/opengl_shader/lv_opengl_shader_internal.h" +#include "../../../misc/lv_array.h" +#include "../../../misc/lv_assert.h" +#include "../../../misc/lv_types.h" +#include "../../../stdlib/lv_sprintf.h" +#include "../../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t add_define(lv_array_t * array, const char * defsymbol, const char * value, bool value_allocated); +static lv_result_t add_define_if_primitive_attribute_exists(lv_array_t * array, const fastgltf::Asset & asset, + const fastgltf::Primitive * primitive, const char * attribute, + const char * define); + +static lv_result_t add_texture_defines_impl(lv_array_t * array, const fastgltf::TextureInfo & material_prop, + const char * define, + const char * uv_define); + +static lv_result_t add_texture_defines(lv_array_t * array, + const fastgltf::Optional & material_prop, + const char * define, const char * uv_define); + +static lv_result_t add_texture_defines(lv_array_t * array, + const fastgltf::Optional & material_prop, + const char * define, const char * uv_define); + +static lv_result_t add_texture_defines(lv_array_t * array, + const fastgltf::Optional & material_prop, + const char * define, const char * uv_define); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_gltf_view_shader_injest_discover_defines(lv_array_t * result, lv_gltf_model_t * data, + fastgltf::Node * node, + fastgltf::Primitive * prim) +{ + const auto & asset = data->asset; + + if(add_define(result, "_OPAQUE", "0", false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define(result, "_MASK", "1", false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define(result, "_BLEND", "2", false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + + LV_ASSERT_MSG(prim->findAttribute("POSITION") != prim->attributes.end(), + "A mesh primitive is required to hold the POSITION attribute"); + LV_ASSERT_MSG(prim->indicesAccessor.has_value(), + "We specify fastgltf::Options::GenerateMeshIndices, so we should always have indices"); + + if(!prim->materialIndex.has_value()) { + if(add_define(result, "ALPHAMODE", "_OPAQUE", false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + else { + const auto & material = asset.materials[prim->materialIndex.value()]; + if(add_define(result, "TONEMAP_KHR_PBR_NEUTRAL", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(material.unlit) { + if(add_define(result, "MATERIAL_UNLIT", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + else { + if(material.pbrData.baseColorFactor.x() == 0.0f + && material.pbrData.baseColorFactor.y() == 0.0f + && material.pbrData.baseColorFactor.z() == 0.0f + && material.pbrData.metallicFactor == 1.0f + && material.pbrData.roughnessFactor == 1.0f + && material.emissiveStrength > 0.0f) { + /* Special case where settings preclude IBL's ability to have visible effect, so disable it entirely */ + LV_LOG_TRACE("Special case identified, disabling IBL and enabling UNLIT\n"); + if(add_define(result, "MATERIAL_UNLIT", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + else { + if(add_define(result, "MATERIAL_METALLICROUGHNESS", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define(result, "USE_IBL", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + const size_t light_count = data->node_by_light_index.size(); + if(light_count > 10) { + LV_LOG_ERROR("Too many scene lights, max is 10"); + } + else if(light_count > 0) { + if(add_define(result, "USE_PUNCTUAL", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + char * count = (char *) lv_zalloc(5); + lv_snprintf(count, 5, "%zu", light_count); + if(add_define(result, "LIGHT_COUNT", count, true) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + else { + if(add_define(result, "LIGHT_COUNT", "0", false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + } +#if LV_GLTF_LINEAR_OUTPUT + if(add_define(result, "LINEAR_OUTPUT", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } +#endif + + // only set cutoff value for mask material + if(material.alphaMode == fastgltf::AlphaMode::Mask) { + if(add_define(result, "ALPHAMODE", "_MASK", false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + else if(material.alphaMode == fastgltf::AlphaMode::Opaque) { + if(add_define(result, "ALPHAMODE", "_OPAQUE", false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + else { + if(add_define(result, "ALPHAMODE", "_BLEND", false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + if(add_texture_defines(result, material.pbrData.baseColorTexture, "HAS_BASE_COLOR_MAP", + "HAS_BASECOLOR_UV_TRANSFORM") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_texture_defines(result, material.pbrData.metallicRoughnessTexture, "HAS_METALLIC_ROUGHNESS_MAP", + "HAS_METALLICROUGHNESS_UV_TRANSFORM") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_texture_defines(result, material.occlusionTexture, "HAS_OCCLUSION_MAP", "HAS_OCCLUSION_UV_TRANSFORM") == + LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_texture_defines(result, material.normalTexture, "HAS_NORMAL_MAP", "HAS_NORMAL_UV_TRANSFORM") == + LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_texture_defines(result, material.emissiveTexture, "HAS_EMISSIVE_MAP", "HAS_EMISSIVE_UV_TRANSFORM") == + LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + + if(add_define(result, "MATERIAL_EMISSIVE_STRENGTH", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(material.sheen) + if(add_define(result, "MATERIAL_SHEEN", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(material.specular) + if(add_define(result, "MATERIAL_SPECULAR", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(material.specularGlossiness) { + if(add_define(result, "MATERIAL_SPECULARGLOSSINESS", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_texture_defines(result, material.specularGlossiness->diffuseTexture, "HAS_DIFFUSE_MAP", + "HAS_DIFFUSE_UV_TRANSFORM") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_texture_defines(result, material.specularGlossiness->specularGlossinessTexture, + "HAS_SPECULARGLOSSINESS_MAP", "HAS_SPECULARGLOSSINESS_UV_TRANSFORM") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + if(material.transmission) { + if(add_define(result, "MATERIAL_TRANSMISSION", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } +#if 0 /* Material dispersion is being revisited.*/ + if(add_define(result, "MATERIAL_DISPERSION", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } +#endif + if(add_define(result, "MATERIAL_VOLUME", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(material.transmission->transmissionTexture.has_value()) + if(add_define(result, "HAS_TRANSMISSION_MAP", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(material.volume) { + add_texture_defines(result, material.volume->thicknessTexture, "HAS_THICKNESS_MAP", + "HAS_THICKNESS_UV_TRANSFORM"); + } + } + if(material.clearcoat && material.clearcoat->clearcoatFactor > 0.0f) { + if(add_define(result, "MATERIAL_CLEARCOAT", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_texture_defines(result, material.clearcoat->clearcoatTexture, "HAS_CLEARCOAT_MAP", + "HAS_CLEARCOAT_UV_TRANSFORM") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_texture_defines(result, material.clearcoat->clearcoatRoughnessTexture, + "HAS_CLEARCOAT_ROUGHNESS_MAP", + "HAS_CLEARCOATROUGHNESS_UV_TRANSFORM") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_texture_defines(result, material.clearcoat->clearcoatNormalTexture, "HAS_CLEARCOAT_NORMAL_MAP", + "HAS_CLEARCOATNORMAL_UV_TRANSFORM") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + if(material.diffuseTransmission && material.diffuseTransmission->diffuseTransmissionFactor > 0.0f) { + if(add_define(result, "MATERIAL_DIFFUSE_TRANSMISSION", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(material.diffuseTransmission->diffuseTransmissionTexture.has_value()) { + if(add_define(result, "HAS_DIFFUSE_TRANSMISSION_MAP", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + if(material.diffuseTransmission->diffuseTransmissionColorTexture.has_value()) { + if(add_define(result, "HAS_DIFFUSE_TRANSMISSION_COLOR_MAP", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + } + } + if(add_define_if_primitive_attribute_exists(result, asset, prim, "NORMAL", "HAS_NORMAL_VEC3") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define_if_primitive_attribute_exists(result, asset, prim, "TANGENT", "HAS_TANGENT_VEC4") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define_if_primitive_attribute_exists(result, asset, prim, "TEXCOORD_0", "HAS_TEXCOORD_0_VEC2") == + LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define_if_primitive_attribute_exists(result, asset, prim, "TEXCOORD_1", "HAS_TEXCOORD_1_VEC2") == + LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define_if_primitive_attribute_exists(result, asset, prim, "JOINTS_0", + "HAS_JOINTS_0_VEC4") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define_if_primitive_attribute_exists(result, asset, prim, "JOINTS_1", + "HAS_JOINTS_1_VEC4") == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define_if_primitive_attribute_exists(result, asset, prim, "WEIGHTS_0", "HAS_WEIGHTS_0_VEC4") == + LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(add_define_if_primitive_attribute_exists(result, asset, prim, "WEIGHTS_1", "HAS_WEIGHTS_1_VEC4") == + LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + + const auto * joints0it = prim->findAttribute("JOINTS_0"); + const auto * weights0it = prim->findAttribute("WEIGHTS_0"); + if((node->skinIndex.has_value()) && (joints0it != prim->attributes.end()) && (weights0it != prim->attributes.end())) { + if(add_define(result, "USE_SKINNING", NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + } + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t add_define(lv_array_t * array, const char * name, const char * value, bool value_allocated) +{ + const size_t n = lv_array_size(array); + for(size_t i = 0; i < n; ++i) { + lv_opengl_shader_define_t * define = (lv_opengl_shader_define_t *)lv_array_at(array, i); + if(lv_streq(define->name, name)) { + return LV_RESULT_OK; + } + } + + lv_opengl_shader_define_t entry = { name, value, value_allocated }; + return lv_array_push_back(array, &entry); +} + +static lv_result_t add_define_if_primitive_attribute_exists(lv_array_t * array, const fastgltf::Asset & asset, + const fastgltf::Primitive * primitive, const char * attribute, + const char * define) +{ + const auto & it = primitive->findAttribute(attribute); + if(it == primitive->attributes.end() || !asset.accessors[it->accessorIndex].bufferViewIndex.has_value()) { + return LV_RESULT_OK; + } + return add_define(array, define, NULL, false); +} + +static lv_result_t add_texture_defines_impl(lv_array_t * array, const fastgltf::TextureInfo & material_prop, + const char * define, + const char * uv_define) +{ + if(add_define(array, define, NULL, false) == LV_RESULT_INVALID) { + return LV_RESULT_INVALID; + } + if(!material_prop.transform) { + return LV_RESULT_OK; + } + return add_define(array, uv_define, NULL, false); +} + +static lv_result_t add_texture_defines(lv_array_t * array, + const fastgltf::Optional & material_prop, + const char * define, const char * uv_define) +{ + if(!material_prop.has_value()) { + return LV_RESULT_OK; + } + return add_texture_defines_impl(array, material_prop.value(), define, uv_define); +} + +static lv_result_t add_texture_defines(lv_array_t * array, + const fastgltf::Optional & material_prop, + const char * define, const char * uv_define) +{ + if(!material_prop.has_value()) { + return LV_RESULT_OK; + } + return add_texture_defines_impl(array, material_prop.value(), define, uv_define); +} + +static lv_result_t add_texture_defines(lv_array_t * array, + const fastgltf::Optional & material_prop, + const char * define, const char * uv_define) +{ + if(!material_prop.has_value()) { + return LV_RESULT_OK; + } + return add_texture_defines_impl(array, material_prop.value(), define, uv_define); +} + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/math/lv_3dmath.c b/inc/lvgl/src/libs/gltf/math/lv_3dmath.c new file mode 100644 index 0000000..038dded --- /dev/null +++ b/inc/lvgl/src/libs/gltf/math/lv_3dmath.c @@ -0,0 +1,50 @@ +/** + * @file lv_3dmath.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_3dmath.h" +#if LV_USE_GLTF + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_3dplane_t lv_get_ground_plane(float elevation) +{ + return (lv_3dplane_t) { + .origin = {0.f, elevation, 0.f}, + .direction = {0.f, 1.f, 0.f} + }; +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/math/lv_3dmath.h b/inc/lvgl/src/libs/gltf/math/lv_3dmath.h new file mode 100644 index 0000000..0360e96 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/math/lv_3dmath.h @@ -0,0 +1,72 @@ +/** + * @file lv_3dmath.h + * + */ + +#ifndef LV_3DMATH_H +#define LV_3DMATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GLTF + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + float x; + float y; + float z; +} lv_3dpoint_t; + +typedef struct { + float x; + float y; + float z; + float w; +} lv_quaternion_t; + +typedef struct { + lv_3dpoint_t origin; + lv_3dpoint_t direction; +} lv_3dplane_t; + +typedef lv_3dplane_t lv_3dray_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get a plane that faces upward, centered at a given height + * @param elevation elevation of the ground plane, in world units. this is usually zero + * @return ground plane + */ +lv_3dplane_t lv_get_ground_plane(float elevation); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GLTF*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + + +#endif /*LV_3DMATH_H*/ diff --git a/inc/lvgl/src/libs/gltf/math/lv_gltf_math.cpp b/inc/lvgl/src/libs/gltf/math/lv_gltf_math.cpp new file mode 100644 index 0000000..02f4775 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/math/lv_gltf_math.cpp @@ -0,0 +1,78 @@ +/** + * @file lv_gltf_math.cpp + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gltf_math.hpp" + +#if LV_USE_GLTF + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** Creates a right-handed view matrix */ +fastgltf::math::fmat4x4 lv_gltf_math_look_at_rh(const fastgltf::math::fvec3 & eye, const fastgltf::math::fvec3 & center, + const fastgltf::math::fvec3 & up) noexcept +{ + auto dir = normalize(center - eye); + auto lft = normalize(cross(dir, up)); + auto rup = cross(lft, dir); + + fastgltf::math::fmat4x4 ret(1.f); + ret.col(0) = { lft.x(), rup.x(), -dir.x(), 0.f }; + ret.col(1) = { lft.y(), rup.y(), -dir.y(), 0.f }; + ret.col(2) = { lft.z(), rup.z(), -dir.z(), 0.f }; + ret.col(3) = { -dot(lft, eye), -dot(rup, eye), dot(dir, eye), 1.f }; + return ret; +} + +/** + * Creates a right-handed perspective matrix, with the near and far clips at -1 and +1, respectively. + * @param fov The FOV in radians + */ +[[nodiscard]] fastgltf::math::fmat4x4 lv_gltf_math_perspective_rh(float fov, float ratio, float z_near, + float z_far) noexcept +{ + fastgltf::math::fmat4x4 ret(0.f); + auto tanHalfFov = std::tan(fov / 2.f); + ret.col(0).x() = 1.f / (ratio * tanHalfFov); + ret.col(1).y() = 1.f / tanHalfFov; + ret.col(2).z() = -(z_far + z_near) / (z_far - z_near); + ret.col(2).w() = -1.f; + ret.col(3).z() = -(2.f * z_far * z_near) / (z_far - z_near); + return ret; +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_GLTF*/ diff --git a/inc/lvgl/src/libs/gltf/math/lv_gltf_math.hpp b/inc/lvgl/src/libs/gltf/math/lv_gltf_math.hpp new file mode 100644 index 0000000..fadd1f5 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/math/lv_gltf_math.hpp @@ -0,0 +1,84 @@ +/** + * @file lv_gltf_math.hpp + * @brief GLTF math utilities and helper functions + */ + +#ifndef LV_GLTF_MATH_HPP +#define LV_GLTF_MATH_HPP + +/********************* + * INCLUDES + *********************/ + +#include "../../../lv_conf_internal.h" + +#if LV_USE_GLTF + +#include + +/********************* + * DEFINES + *********************/ + +#ifndef M_PI + #define M_PI 3.14159265358979323846264338327950288 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +fastgltf::math::fmat4x4 lv_gltf_math_look_at_rh(const fastgltf::math::fvec3 & eye, const fastgltf::math::fvec3 & center, const fastgltf::math::fvec3 & up) noexcept; +fastgltf::math::fmat4x4 lv_gltf_math_perspective_rh(float fov, float ratio, float z_near, float z_far) noexcept; + +template +[[nodiscard]] fastgltf::math::quat lv_gltf_math_euler_to_quaternion(T P, T Y, T R) +{ + // Convert degrees to radians if necessary + // roll = roll * (M_PI / 180.0); + // pitch = pitch * (M_PI / 180.0); + // yaw = yaw * (M_PI / 180.0); + T H = T(0.5); + Y *= H; + P *= H; + R *= H; + T cy = cos(Y), sy = sin(Y), cp = cos(P), sp = sin(P), cr = cos(R), sr = sin(R); + T cr_cp = cr * cp, sp_sy = sp * sy, sr_cp = sr * cp, sp_cy = sp * cy; + return fastgltf::math::quat( + sr_cp * cy - cr * sp_sy, // X + sr_cp * sy + cr * sp_cy, // Y + cr_cp * sy - sr * sp_cy, // Z + cr_cp * cy + sr * sp_sy // W + ); +} + +template +[[nodiscard]] fastgltf::math::vec lv_gltf_math_quaternion_to_euler(fastgltf::math::quat q) +{ + T Q11 = q[1] * q[1]; + // Roll (Z) + T sinr_cosp = T(2.0) * (q[3] * q[0] + q[1] * q[2]); + T cosr_cosp = T(1.0) - T(2.0) * (q[0] * q[0] + Q11); + // Pitch (X) + T sinp = T(2.0) * (q[3] * q[1] - q[2] * q[0]); + // Yaw (Y) + T siny_cosp = T(2.0) * (q[3] * q[2] + q[0] * q[1]); + T cosy_cosp = T(1.0) - T(2.0) * (Q11 + q[2] * q[2]); + + return fastgltf::math::vec( + (std::abs(sinp) >= T(1)) ? std::copysign(T(M_PI) / T(2), sinp) : std::asin(sinp), + std::atan2(siny_cosp, cosy_cosp), + std::atan2(sinr_cosp, cosr_cosp) + ); +} + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GLTF*/ +#endif /*LV_GLTF_MATH_HPP*/ diff --git a/inc/lvgl/src/libs/gltf/stb_image/stb_image.h b/inc/lvgl/src/libs/gltf/stb_image/stb_image.h new file mode 100644 index 0000000..f7344e5 --- /dev/null +++ b/inc/lvgl/src/libs/gltf/stb_image/stb_image.h @@ -0,0 +1,8366 @@ +/* stb_image - v2.30 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.30 (2024-05-31) avoid erroneous gcc warning + 2.29 (2023-05-xx) optimizations + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data); +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO + #include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum { + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct { + int (*read)(void * user, char * data, + int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip)(void * user, int + n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof)(void * user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const * buffer, int len, int * x, int * y, + int * channels_in_file, int desired_channels); +STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, + int * channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc * stbi_load(char const * filename, int * x, int * y, int * channels_in_file, int desired_channels); +STBIDEF stbi_uc * stbi_load_from_file(FILE * f, int * x, int * y, int * channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc * stbi_load_gif_from_memory(stbi_uc const * buffer, int len, int ** delays, int * x, int * y, int * z, + int * comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char * buffer, size_t bufferlen, const wchar_t * input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us * stbi_load_16_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, + int desired_channels); +STBIDEF stbi_us * stbi_load_16_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, + int * channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us * stbi_load_16(char const * filename, int * x, int * y, int * channels_in_file, int desired_channels); +STBIDEF stbi_us * stbi_load_from_file_16(FILE * f, int * x, int * y, int * channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR +STBIDEF float * stbi_loadf_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, + int desired_channels); +STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, + int * channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF float * stbi_loadf(char const * filename, int * x, int * y, int * channels_in_file, int desired_channels); +STBIDEF float * stbi_loadf_from_file(FILE * f, int * x, int * y, int * channels_in_file, int desired_channels); +#endif +#endif + +#ifndef STBI_NO_HDR +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); +STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); +STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const * clbk, void * user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const * buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr(char const * filename); +STBIDEF int stbi_is_hdr_from_file(FILE * f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// on most compilers (and ALL modern mainstream compilers) this is threadsafe +STBIDEF const char * stbi_failure_reason(void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free(void * retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const * buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const * clbk, void * user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const * filename, int * x, int * y, int * comp); +STBIDEF int stbi_info_from_file(FILE * f, int * x, int * y, int * comp); +STBIDEF int stbi_is_16_bit(char const * filename); +STBIDEF int stbi_is_16_bit_from_file(FILE * f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char * buffer, int len, int initial_size, int * outlen); +STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char * buffer, int len, int initial_size, + int * outlen, int parse_header); +STBIDEF char * stbi_zlib_decode_malloc(const char * buffer, int len, int * outlen); +STBIDEF int stbi_zlib_decode_buffer(char * obuffer, int olen, const char * ibuffer, int ilen); + +STBIDEF char * stbi_zlib_decode_noheader_malloc(const char * buffer, int len, int * outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char * obuffer, int olen, const char * ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) + #define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) + #include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO + #include +#endif + +#ifndef STBI_ASSERT + #include + #define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus + #define STBI_EXTERN extern "C" +#else + #define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define STBI_THREAD_LOCAL thread_local + #elif defined(__GNUC__) && __GNUC__ < 5 + #define STBI_THREAD_LOCAL __thread + #elif defined(_MSC_VER) + #define STBI_THREAD_LOCAL __declspec(thread) + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) + #define STBI_THREAD_LOCAL _Thread_local + #endif + + #ifndef STBI_THREAD_LOCAL + #if defined(__GNUC__) + #define STBI_THREAD_LOCAL __thread + #endif + #endif +#endif + +#if defined(_MSC_VER) || defined(__SYMBIAN32__) + typedef unsigned short stbi__uint16; + typedef signed short stbi__int16; + typedef unsigned int stbi__uint32; + typedef signed int stbi__int32; +#else + #include + typedef uint16_t stbi__uint16; + typedef int16_t stbi__int16; + typedef uint32_t stbi__uint32; + typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32) == 4 ? 1 : -1]; + +#ifdef _MSC_VER + #define STBI_NOTUSED(v) (void)(v) +#else + #define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER + #define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) + // ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) + // ok +#else + #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC + #define STBI_MALLOC(sz) malloc(sz) + #define STBI_REALLOC(p,newsz) realloc(p,newsz) + #define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED + #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) + #define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) + #define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) + // gcc doesn't support sse2 intrinsics unless you compile with -msse2, + // which in turn means it gets to use SSE2 everywhere. This is unfortunate, + // but previous attempts to provide the SSE2 functions with runtime + // detection caused numerous issues. The way architecture extensions are + // exposed in GCC/Clang is, sadly, not really suited for one-file libs. + // New behavior: if compiled with -msse2, we use SSE2 without any + // detection; if not, we don't use it at all. + #define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) + // Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET + // + // 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the + // Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. + // As a result, enabling SSE2 on 32-bit MinGW is dangerous when not + // simultaneously enabling "-mstackrealign". + // + // See https://github.com/nothings/stb/issues/81 for more information. + // + // So default to no SSE2 on 32-bit MinGW. If you've read this far and added + // -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. + #define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info, 1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax, 1 + cpuid + mov res, edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) + #undef STBI_NEON +#endif + +#ifdef STBI_NEON + #include + #ifdef _MSC_VER + #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + #else + #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + #endif +#endif + +#ifndef STBI_SIMD_ALIGN + #define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS + #define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct { + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void * io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc * img_buffer, * img_buffer_end; + stbi_uc * img_buffer_original, * img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context * s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context * s, stbi_uc const * buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer + len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context * s, stbi_io_callbacks * c, void * user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void * user, char * data, int size) +{ + return (int) fread(data, 1, size, (FILE *) user); +} + +static void stbi__stdio_skip(void * user, int n) +{ + int ch; + fseek((FILE *) user, n, SEEK_CUR); + ch = fgetc((FILE *) user); /* have to read a byte to reset feof()'s flag */ + if(ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void * user) +{ + return feof((FILE *) user) || ferror((FILE *) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = { + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context * s, FILE * f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context * s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum { + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct { + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG + static int stbi__jpeg_test(stbi__context * s); + static void * stbi__jpeg_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); + static int stbi__jpeg_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_PNG + static int stbi__png_test(stbi__context * s); + static void * stbi__png_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); + static int stbi__png_info(stbi__context * s, int * x, int * y, int * comp); + static int stbi__png_is16(stbi__context * s); +#endif + +#ifndef STBI_NO_BMP + static int stbi__bmp_test(stbi__context * s); + static void * stbi__bmp_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); + static int stbi__bmp_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_TGA + static int stbi__tga_test(stbi__context * s); + static void * stbi__tga_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); + static int stbi__tga_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context * s); +static void * stbi__psd_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri, + int bpc); +static int stbi__psd_info(stbi__context * s, int * x, int * y, int * comp); +static int stbi__psd_is16(stbi__context * s); +#endif + +#ifndef STBI_NO_HDR + static int stbi__hdr_test(stbi__context * s); + static float * stbi__hdr_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); + static int stbi__hdr_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_PIC + static int stbi__pic_test(stbi__context * s); + static void * stbi__pic_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); + static int stbi__pic_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context * s); +static void * stbi__gif_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); +static void * stbi__load_gif_main(stbi__context * s, int ** delays, int * x, int * y, int * z, int * comp, + int req_comp); +static int stbi__gif_info(stbi__context * s, int * x, int * y, int * comp); +#endif + +#ifndef STBI_NO_PNM + static int stbi__pnm_test(stbi__context * s); + static void * stbi__pnm_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri); + static int stbi__pnm_info(stbi__context * s, int * x, int * y, int * comp); + static int stbi__pnm_is16(stbi__context * s); +#endif + +static +#ifdef STBI_THREAD_LOCAL + STBI_THREAD_LOCAL +#endif +const char * stbi__g_failure_reason; + +STBIDEF const char * stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char * str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void * stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if(b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if(a < 0 || b < 0) return 0; + if(b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX / b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a * b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) && + stbi__addsizes_valid(a * b * c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) && + stbi__mul2sizes_valid(a * b * c, d) && stbi__addsizes_valid(a * b * c * d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void * stbi__malloc_mad2(int a, int b, int add) +{ + if(!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a * b + add); +} +#endif + +static void * stbi__malloc_mad3(int a, int b, int c, int add) +{ + if(!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a * b * c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void * stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if(!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a * b * c * d + add); +} +#endif + +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) +{ + if((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow + if(a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two ints fits in a signed short, 0 on overflow. +static int stbi__mul2shorts_valid(int a, int b) +{ + if(b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if((a >= 0) == (b >= 0)) return a <= SHRT_MAX / b; // product is positive, so similar to mul2sizes_valid + if(b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void * retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR + static float * stbi__ldr_to_hdr(stbi_uc * data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR + static stbi_uc * stbi__hdr_to_ldr(float * data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ + ? stbi__vertically_flip_on_load_local \ + : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void * stbi__load_main(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri, + int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) +#ifndef STBI_NO_PNG + if(stbi__png_test(s)) return stbi__png_load(s, x, y, comp, req_comp, ri); +#endif +#ifndef STBI_NO_BMP + if(stbi__bmp_test(s)) return stbi__bmp_load(s, x, y, comp, req_comp, ri); +#endif +#ifndef STBI_NO_GIF + if(stbi__gif_test(s)) return stbi__gif_load(s, x, y, comp, req_comp, ri); +#endif +#ifndef STBI_NO_PSD + if(stbi__psd_test(s)) return stbi__psd_load(s, x, y, comp, req_comp, ri, bpc); +#else + STBI_NOTUSED(bpc); +#endif +#ifndef STBI_NO_PIC + if(stbi__pic_test(s)) return stbi__pic_load(s, x, y, comp, req_comp, ri); +#endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later +#ifndef STBI_NO_JPEG + if(stbi__jpeg_test(s)) return stbi__jpeg_load(s, x, y, comp, req_comp, ri); +#endif +#ifndef STBI_NO_PNM + if(stbi__pnm_test(s)) return stbi__pnm_load(s, x, y, comp, req_comp, ri); +#endif + +#ifndef STBI_NO_HDR + if(stbi__hdr_test(s)) { + float * hdr = stbi__hdr_load(s, x, y, comp, req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } +#endif + +#ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if(stbi__tga_test(s)) + return stbi__tga_load(s, x, y, comp, req_comp, ri); +#endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc * stbi__convert_16_to_8(stbi__uint16 * orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc * reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if(reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for(i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 * stbi__convert_8_to_16(stbi_uc * orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 * enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len * 2); + if(enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for(i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void * image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc * bytes = (stbi_uc *)image; + + for(row = 0; row < (h >> 1); row++) { + stbi_uc * row0 = bytes + row * bytes_per_row; + stbi_uc * row1 = bytes + (h - row - 1) * bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while(bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void * image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc * bytes = (stbi_uc *)image; + for(slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char * stbi__load_and_postprocess_8bit(stbi__context * s, int * x, int * y, int * comp, int req_comp) +{ + stbi__result_info ri; + void * result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if(result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if(ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if(stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 * stbi__load_and_postprocess_16bit(stbi__context * s, int * x, int * y, int * comp, int req_comp) +{ + stbi__result_info ri; + void * result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if(result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if(ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if(stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float * result, int * x, int * y, int * comp, int req_comp) +{ + if(stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, + const char * str, int cbmb, wchar_t * widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, + const wchar_t * widestr, int cchwide, char * str, int cbmb, const char * defchar, int * used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char * buffer, size_t bufferlen, const wchar_t * input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE * stbi__fopen(char const * filename, char const * mode) +{ + FILE * f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if(0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename) / sizeof(*wFilename))) + return 0; + + if(0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode) / sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if(0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if(0 != fopen_s(&f, filename, mode)) + f = 0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc * stbi_load(char const * filename, int * x, int * y, int * comp, int req_comp) +{ + FILE * f = stbi__fopen(filename, "rb"); + unsigned char * result; + if(!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f, x, y, comp, req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc * stbi_load_from_file(FILE * f, int * x, int * y, int * comp, int req_comp) +{ + unsigned char * result; + stbi__context s; + stbi__start_file(&s, f); + result = stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp); + if(result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int)(s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 * stbi_load_from_file_16(FILE * f, int * x, int * y, int * comp, int req_comp) +{ + stbi__uint16 * result; + stbi__context s; + stbi__start_file(&s, f); + result = stbi__load_and_postprocess_16bit(&s, x, y, comp, req_comp); + if(result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int)(s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us * stbi_load_16(char const * filename, int * x, int * y, int * comp, int req_comp) +{ + FILE * f = stbi__fopen(filename, "rb"); + stbi__uint16 * result; + if(!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f, x, y, comp, req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us * stbi_load_16_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * channels_in_file, + int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels); +} + +STBIDEF stbi_us * stbi_load_16_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, + int * channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels); +} + +STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp); +} + +STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * comp, + int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc * stbi_load_gif_from_memory(stbi_uc const * buffer, int len, int ** delays, int * x, int * y, int * z, + int * comp, int req_comp) +{ + unsigned char * result; + stbi__context s; + stbi__start_mem(&s, buffer, len); + + result = (unsigned char *) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if(stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices(result, *x, *y, *z, *comp); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float * stbi__loadf_main(stbi__context * s, int * x, int * y, int * comp, int req_comp) +{ + unsigned char * data; +#ifndef STBI_NO_HDR + if(stbi__hdr_test(s)) { + stbi__result_info ri; + float * hdr_data = stbi__hdr_load(s, x, y, comp, req_comp, &ri); + if(hdr_data) + stbi__float_postprocess(hdr_data, x, y, comp, req_comp); + return hdr_data; + } +#endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if(data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float * stbi_loadf_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__loadf_main(&s, x, y, comp, req_comp); +} + +STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const * clbk, void * user, int * x, int * y, int * comp, + int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s, x, y, comp, req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float * stbi_loadf(char const * filename, int * x, int * y, int * comp, int req_comp) +{ + float * result; + FILE * f = stbi__fopen(filename, "rb"); + if(!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f, x, y, comp, req_comp); + fclose(f); + return result; +} + +STBIDEF float * stbi_loadf_from_file(FILE * f, int * x, int * y, int * comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s, f); + return stbi__loadf_main(&s, x, y, comp, req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const * buffer, int len) +{ +#ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__hdr_test(&s); +#else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; +#endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr(char const * filename) +{ + FILE * f = stbi__fopen(filename, "rb"); + int result = 0; + if(f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE * f) +{ +#ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s, f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; +#else + STBI_NOTUSED(f); + return 0; +#endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const * clbk, void * user) +{ +#ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); +#else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; +#endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) +{ + stbi__l2h_gamma = gamma; +} +STBIDEF void stbi_ldr_to_hdr_scale(float scale) +{ + stbi__l2h_scale = scale; +} +#endif + +static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) +{ + stbi__h2l_gamma_i = 1 / gamma; +} +STBIDEF void stbi_hdr_to_ldr_scale(float scale) +{ + stbi__h2l_scale_i = 1 / scale; +} + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum { + STBI__SCAN_load = 0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context * s) +{ + int n = (s->io.read)(s->io_user_data, (char *)s->buffer_start, s->buflen); + s->callback_already_read += (int)(s->img_buffer - s->img_buffer_original); + if(n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + 1; + *s->img_buffer = 0; + } + else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context * s) +{ + if(s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if(s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context * s) +{ + if(s->io.read) { + if(!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if(s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context * s, int n) +{ + if(n == 0) return; // already there! + if(n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if(s->io.read) { + int blen = (int)(s->img_buffer_end - s->img_buffer); + if(blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context * s, stbi_uc * buffer, int n) +{ + if(s->io.read) { + int blen = (int)(s->img_buffer_end - s->img_buffer); + if(blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char *) buffer + blen, n - blen); + res = (count == (n - blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if(s->img_buffer + n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } + else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context * s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context * s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context * s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context * s) +{ + stbi__uint32 z = stbi__get16le(s); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char * stbi__convert_format(unsigned char * data, int img_n, int req_comp, unsigned int x, + unsigned int y) +{ + int i, j; + unsigned char * good; + + if(req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if(good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for(j = 0; j < (int) y; ++j) { + unsigned char * src = data + j * x * img_n ; + unsigned char * dest = good + j * x * req_comp; + +#define STBI__COMBO(a,b) ((a)*8+(b)) +#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch(STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1, 2) { + dest[0] = src[0]; + dest[1] = 255; + } + break; + STBI__CASE(1, 3) { + dest[0] = dest[1] = dest[2] = src[0]; + } + break; + STBI__CASE(1, 4) { + dest[0] = dest[1] = dest[2] = src[0]; + dest[3] = 255; + } + break; + STBI__CASE(2, 1) { + dest[0] = src[0]; + } + break; + STBI__CASE(2, 3) { + dest[0] = dest[1] = dest[2] = src[0]; + } + break; + STBI__CASE(2, 4) { + dest[0] = dest[1] = dest[2] = src[0]; + dest[3] = src[1]; + } + break; + STBI__CASE(3, 4) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + dest[3] = 255; + } + break; + STBI__CASE(3, 1) { + dest[0] = stbi__compute_y(src[0], src[1], src[2]); + } + break; + STBI__CASE(3, 2) { + dest[0] = stbi__compute_y(src[0], src[1], src[2]); + dest[1] = 255; + } + break; + STBI__CASE(4, 1) { + dest[0] = stbi__compute_y(src[0], src[1], src[2]); + } + break; + STBI__CASE(4, 2) { + dest[0] = stbi__compute_y(src[0], src[1], src[2]); + dest[1] = src[3]; + } + break; + STBI__CASE(4, 3) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + } + break; + default: + STBI_ASSERT(0); + STBI_FREE(data); + STBI_FREE(good); + return stbi__errpuc("unsupported", "Unsupported format conversion"); + } +#undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16)(((r * 77) + (g * 150) + (29 * b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 * stbi__convert_format16(stbi__uint16 * data, int img_n, int req_comp, unsigned int x, + unsigned int y) +{ + int i, j; + stbi__uint16 * good; + + if(req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if(good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for(j = 0; j < (int) y; ++j) { + stbi__uint16 * src = data + j * x * img_n ; + stbi__uint16 * dest = good + j * x * req_comp; + +#define STBI__COMBO(a,b) ((a)*8+(b)) +#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch(STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1, 2) { + dest[0] = src[0]; + dest[1] = 0xffff; + } + break; + STBI__CASE(1, 3) { + dest[0] = dest[1] = dest[2] = src[0]; + } + break; + STBI__CASE(1, 4) { + dest[0] = dest[1] = dest[2] = src[0]; + dest[3] = 0xffff; + } + break; + STBI__CASE(2, 1) { + dest[0] = src[0]; + } + break; + STBI__CASE(2, 3) { + dest[0] = dest[1] = dest[2] = src[0]; + } + break; + STBI__CASE(2, 4) { + dest[0] = dest[1] = dest[2] = src[0]; + dest[3] = src[1]; + } + break; + STBI__CASE(3, 4) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + dest[3] = 0xffff; + } + break; + STBI__CASE(3, 1) { + dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); + } + break; + STBI__CASE(3, 2) { + dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); + dest[1] = 0xffff; + } + break; + STBI__CASE(4, 1) { + dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); + } + break; + STBI__CASE(4, 2) { + dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); + dest[1] = src[3]; + } + break; + STBI__CASE(4, 3) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + } + break; + default: + STBI_ASSERT(0); + STBI_FREE(data); + STBI_FREE(good); + return (stbi__uint16 *) stbi__errpuc("unsupported", "Unsupported format conversion"); + } +#undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float * stbi__ldr_to_hdr(stbi_uc * data, int x, int y, int comp) +{ + int i, k, n; + float * output; + if(!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if(output == NULL) { + STBI_FREE(data); + return stbi__errpf("outofmem", "Out of memory"); + } + // compute number of non-alpha components + if(comp & 1) n = comp; + else n = comp - 1; + for(i = 0; i < x * y; ++i) { + for(k = 0; k < n; ++k) { + output[i * comp + k] = (float)(pow(data[i * comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if(n < comp) { + for(i = 0; i < x * y; ++i) { + output[i * comp + n] = data[i * comp + n] / 255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc * stbi__hdr_to_ldr(float * data, int x, int y, int comp) +{ + int i, k, n; + stbi_uc * output; + if(!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if(output == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + // compute number of non-alpha components + if(comp & 1) n = comp; + else n = comp - 1; + for(i = 0; i < x * y; ++i) { + for(k = 0; k < n; ++k) { + float z = (float) pow(data[i * comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if(z < 0) z = 0; + if(z > 255) z = 255; + output[i * comp + k] = (stbi_uc) stbi__float2int(z); + } + if(k < comp) { + float z = data[i * comp + k] * 255 + 0.5f; + if(z < 0) z = 0; + if(z > 255) z = 255; + output[i * comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct { + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct { + stbi__context * s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + + // sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + + // definition of jpeg image component + struct { + int id; + int h, v; + int tq; + int hd, ha; + int dc_pred; + + int x, y, w2, h2; + stbi_uc * data; + void * raw_data, * raw_coeff; + stbi_uc * linebuf; + short * coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + + // kernels + void (*idct_block_kernel)(stbi_uc * out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc * out, const stbi_uc * y, const stbi_uc * pcb, const stbi_uc * pcr, int count, + int step); + stbi_uc * (*resample_row_hv_2_kernel)(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman * h, int * count) +{ + int i, j, k = 0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for(i = 0; i < 16; ++i) { + for(j = 0; j < count[i]; ++j) { + h->size[k++] = (stbi_uc)(i + 1); + if(k >= 257) return stbi__err("bad size list", "Corrupt JPEG"); + } + } + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j = 1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if(h->size[k] == j) { + while(h->size[k] == j) + h->code[k++] = (stbi__uint16)(code++); + if(code - 1 >= (1u << j)) return stbi__err("bad code lengths", "Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16 - j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for(i = 0; i < k; ++i) { + int s = h->size[i]; + if(s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS - s); + int m = 1 << (FAST_BITS - s); + for(j = 0; j < m; ++j) { + h->fast[c + j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 * fast_ac, stbi__huffman * h) +{ + int i; + for(i = 0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if(fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if(magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if(k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if(k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16)((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg * j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if(b == 0xff) { + int c = stbi__get8(j->s); + while(c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if(c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while(j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17] = {0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg * j, stbi__huffman * h) +{ + unsigned int temp; + int c, k; + + if(j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1); + k = h->fast[c]; + if(k < 255) { + int s = h->size[k]; + if(s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for(k = FAST_BITS + 1 ; ; ++k) + if(temp < h->maxcode[k]) + break; + if(k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if(k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + if(c < 0 || c >= 256) // symbol id out of bounds! + return -1; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + if(j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & (sgn - 1)); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg * j, int n) +{ + unsigned int k; + if(j->code_bits < n) stbi__grow_buffer_unsafe(j); + if(j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg * j) +{ + unsigned int k; + if(j->code_bits < 1) stbi__grow_buffer_unsafe(j); + if(j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64 + 15] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg * j, short data[64], stbi__huffman * hdc, stbi__huffman * hac, + stbi__int16 * fac, int b, stbi__uint16 * dequant) +{ + int diff, dc, k; + int t; + + if(j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if(t < 0 || t > 15) return stbi__err("bad huffman code", "Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data, 0, 64 * sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + if(!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if(!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short)(dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c, r, s; + if(j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1); + r = fac[c]; + if(r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if(s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)((r >> 8) * dequant[zig]); + } + else { + int rs = stbi__jpeg_huff_decode(j, hac); + if(rs < 0) return stbi__err("bad huffman code", "Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if(s == 0) { + if(rs != 0xf0) break; // end block + k += 16; + } + else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]); + } + } + } while(k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg * j, short data[64], stbi__huffman * hdc, int b) +{ + int diff, dc; + int t; + if(j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if(j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if(j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data, 0, 64 * sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if(t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + if(!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if(!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short)(dc * (1 << j->succ_low)); + } + else { + // refinement scan for DC coefficient + if(stbi__jpeg_get_bit(j)) + data[0] += (short)(1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg * j, short data[64], stbi__huffman * hac, stbi__int16 * fac) +{ + int k; + if(j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if(j->succ_high == 0) { + int shift = j->succ_low; + + if(j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c, r, s; + if(j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1); + r = fac[c]; + if(r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + if(s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)((r >> 8) * (1 << shift)); + } + else { + int rs = stbi__jpeg_huff_decode(j, hac); + if(rs < 0) return stbi__err("bad huffman code", "Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if(s == 0) { + if(r < 15) { + j->eob_run = (1 << r); + if(r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } + else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)(stbi__extend_receive(j, s) * (1 << shift)); + } + } + } while(k <= j->spec_end); + } + else { + // refinement scan for these AC coefficients + + short bit = (short)(1 << j->succ_low); + + if(j->eob_run) { + --j->eob_run; + for(k = j->spec_start; k <= j->spec_end; ++k) { + short * p = &data[stbi__jpeg_dezigzag[k]]; + if(*p != 0) + if(stbi__jpeg_get_bit(j)) + if((*p & bit) == 0) { + if(*p > 0) + *p += bit; + else + *p -= bit; + } + } + } + else { + k = j->spec_start; + do { + int r, s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if(rs < 0) return stbi__err("bad huffman code", "Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if(s == 0) { + if(r < 15) { + j->eob_run = (1 << r) - 1; + if(r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } + else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } + else { + if(s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if(stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while(k <= j->spec_end) { + short * p = &data[stbi__jpeg_dezigzag[k++]]; + if(*p != 0) { + if(stbi__jpeg_get_bit(j)) + if((*p & bit) == 0) { + if(*p > 0) + *p += bit; + else + *p -= bit; + } + } + else { + if(r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while(k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if((unsigned int) x > 255) { + if(x < 0) return 0; + if(x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc * out, int out_stride, short data[64]) +{ + int i, val[64], * v = val; + stbi_uc * o; + short * d = data; + + // columns + for(i = 0; i < 8; ++i, ++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if(d[ 8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0 + && d[40] == 0 && d[48] == 0 && d[56] == 0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] * 4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } + else { + STBI__IDCT_1D(d[ 0], d[ 8], d[16], d[24], d[32], d[40], d[48], d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; + x1 += 512; + x2 += 512; + x3 += 512; + v[ 0] = (x0 + t3) >> 10; + v[56] = (x0 - t3) >> 10; + v[ 8] = (x1 + t2) >> 10; + v[48] = (x1 - t2) >> 10; + v[16] = (x2 + t1) >> 10; + v[40] = (x2 - t1) >> 10; + v[24] = (x3 + t0) >> 10; + v[32] = (x3 - t0) >> 10; + } + } + + for(i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128 << 17); + x1 += 65536 + (128 << 17); + x2 += 65536 + (128 << 17); + x3 += 65536 + (128 << 17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0 + t3) >> 17); + o[7] = stbi__clamp((x0 - t3) >> 17); + o[1] = stbi__clamp((x1 + t2) >> 17); + o[6] = stbi__clamp((x1 - t2) >> 17); + o[2] = stbi__clamp((x2 + t1) >> 17); + o[5] = stbi__clamp((x2 - t1) >> 17); + o[3] = stbi__clamp((x3 + t0) >> 17); + o[4] = stbi__clamp((x3 - t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc * out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y +#define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y +#define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) +#define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add +#define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub +#define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack +#define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) +#define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) +#define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + +#define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17)); + + // load + row0 = _mm_load_si128((const __m128i *)(data + 0 * 8)); + row1 = _mm_load_si128((const __m128i *)(data + 1 * 8)); + row2 = _mm_load_si128((const __m128i *)(data + 2 * 8)); + row3 = _mm_load_si128((const __m128i *)(data + 3 * 8)); + row4 = _mm_load_si128((const __m128i *)(data + 4 * 8)); + row5 = _mm_load_si128((const __m128i *)(data + 5 * 8)); + row6 = _mm_load_si128((const __m128i *)(data + 6 * 8)); + row7 = _mm_load_si128((const __m128i *)(data + 7 * 8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); + out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); + out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); + out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); + out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); + out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); + out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); + out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc * out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + + // wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + + // wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + + // butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0 * 8); + row1 = vld1q_s16(data + 1 * 8); + row2 = vld1q_s16(data + 2 * 8); + row3 = vld1q_s16(data + 3 * 8); + row4 = vld1q_s16(data + 4 * 8); + row5 = vld1q_s16(data + 5 * 8); + row6 = vld1q_s16(data + 6 * 8); + row7 = vld1q_s16(data + 7 * 8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { + // these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. + // whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); + out += out_stride; + vst1_u8(out, p1); + out += out_stride; + vst1_u8(out, p2); + out += out_stride; + vst1_u8(out, p3); + out += out_stride; + vst1_u8(out, p4); + out += out_stride; + vst1_u8(out, p5); + out += out_stride; + vst1_u8(out, p6); + out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg * j) +{ + stbi_uc x; + if(j->marker != STBI__MARKER_none) { + x = j->marker; + j->marker = STBI__MARKER_none; + return x; + } + x = stbi__get8(j->s); + if(x != 0xff) return STBI__MARKER_none; + while(x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg * j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg * z) +{ + stbi__jpeg_reset(z); + if(!z->progressive) { + if(z->scan_n == 1) { + int i, j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x + 7) >> 3; + int h = (z->img_comp[n].y + 7) >> 3; + for(j = 0; j < h; ++j) { + for(i = 0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if(!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, + z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if(--z->todo <= 0) { + if(z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if(!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + else { // interleaved + int i, j, k, x, y; + STBI_SIMD_ALIGN(short, data[64]); + for(j = 0; j < z->img_mcu_y; ++j) { + for(i = 0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for(k = 0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for(y = 0; y < z->img_comp[n].v; ++y) { + for(x = 0; x < z->img_comp[n].h; ++x) { + int x2 = (i * z->img_comp[n].h + x) * 8; + int y2 = (j * z->img_comp[n].v + y) * 8; + int ha = z->img_comp[n].ha; + if(!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, + z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * y2 + x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if(--z->todo <= 0) { + if(z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if(!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } + else { + if(z->scan_n == 1) { + int i, j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x + 7) >> 3; + int h = (z->img_comp[n].y + 7) >> 3; + for(j = 0; j < h; ++j) { + for(i = 0; i < w; ++i) { + short * data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if(z->spec_start == 0) { + if(!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + else { + int ha = z->img_comp[n].ha; + if(!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if(--z->todo <= 0) { + if(z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if(!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + else { // interleaved + int i, j, k, x, y; + for(j = 0; j < z->img_mcu_y; ++j) { + for(i = 0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for(k = 0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for(y = 0; y < z->img_comp[n].v; ++y) { + for(x = 0; x < z->img_comp[n].h; ++x) { + int x2 = (i * z->img_comp[n].h + x); + int y2 = (j * z->img_comp[n].v + y); + short * data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if(!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if(--z->todo <= 0) { + if(z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if(!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short * data, stbi__uint16 * dequant) +{ + int i; + for(i = 0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg * z) +{ + if(z->progressive) { + // dequantize and idct the data + int i, j, n; + for(n = 0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x + 7) >> 3; + int h = (z->img_comp[n].y + 7) >> 3; + for(j = 0; j < h; ++j) { + for(i = 0; i < w; ++i) { + short * data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg * z, int m) +{ + int L; + switch(m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker", "Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if(stbi__get16be(z->s) != 4) return stbi__err("bad DRI len", "Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s) - 2; + while(L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15, i; + if(p != 0 && p != 1) return stbi__err("bad DQT type", "Corrupt JPEG"); + if(t > 3) return stbi__err("bad DQT table", "Corrupt JPEG"); + + for(i = 0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L == 0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s) - 2; + while(L > 0) { + stbi_uc * v; + int sizes[16], i, n = 0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if(tc > 1 || th > 3) return stbi__err("bad DHT header", "Corrupt JPEG"); + for(i = 0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + if(n > 256) return stbi__err("bad DHT header", "Corrupt JPEG"); // Loop over i < n would write past end of values! + L -= 17; + if(tc == 0) { + if(!stbi__build_huffman(z->huff_dc + th, sizes)) return 0; + v = z->huff_dc[th].values; + } + else { + if(!stbi__build_huffman(z->huff_ac + th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for(i = 0; i < n; ++i) + v[i] = stbi__get8(z->s); + if(tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L == 0; + } + + // check for comment block or APP blocks + if((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if(L < 2) { + if(m == 0xFE) + return stbi__err("bad COM len", "Corrupt JPEG"); + else + return stbi__err("bad APP len", "Corrupt JPEG"); + } + L -= 2; + + if(m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J', 'F', 'I', 'F', '\0'}; + int ok = 1; + int i; + for(i = 0; i < 5; ++i) + if(stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if(ok) + z->jfif = 1; + } + else if(m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A', 'd', 'o', 'b', 'e', '\0'}; + int ok = 1; + int i; + for(i = 0; i < 6; ++i) + if(stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if(ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker", "Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg * z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if(z->scan_n < 1 || z->scan_n > 4 || + z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count", "Corrupt JPEG"); + if(Ls != 6 + 2 * z->scan_n) return stbi__err("bad SOS len", "Corrupt JPEG"); + for(i = 0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for(which = 0; which < z->s->img_n; ++which) + if(z->img_comp[which].id == id) + break; + if(which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; + if(z->img_comp[which].hd > 3) return stbi__err("bad DC huff", "Corrupt JPEG"); + z->img_comp[which].ha = q & 15; + if(z->img_comp[which].ha > 3) return stbi__err("bad AC huff", "Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if(z->progressive) { + if(z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } + else { + if(z->spec_start != 0) return stbi__err("bad SOS", "Corrupt JPEG"); + if(z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS", "Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg * z, int ncomp, int why) +{ + int i; + for(i = 0; i < ncomp; ++i) { + if(z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if(z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if(z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg * z, int scan) +{ + stbi__context * s = z->s; + int Lf, p, i, q, h_max = 1, v_max = 1, c; + Lf = stbi__get16be(s); + if(Lf < 11) return stbi__err("bad SOF len", "Corrupt JPEG"); // JPEG + p = stbi__get8(s); + if(p != 8) return stbi__err("only 8-bit", "JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); + if(s->img_y == 0) return stbi__err("no header height", + "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); + if(s->img_x == 0) return stbi__err("0 width", "Corrupt JPEG"); // JPEG requires + if(s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large", "Very large image (corrupt?)"); + if(s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large", "Very large image (corrupt?)"); + c = stbi__get8(s); + if(c != 3 && c != 1 && c != 4) return stbi__err("bad component count", "Corrupt JPEG"); + s->img_n = c; + for(i = 0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if(Lf != 8 + 3 * s->img_n) return stbi__err("bad SOF len", "Corrupt JPEG"); + + z->rgb = 0; + for(i = 0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if(s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); + if(!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H", "Corrupt JPEG"); + z->img_comp[i].v = q & 15; + if(!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V", "Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); + if(z->img_comp[i].tq > 3) return stbi__err("bad TQ", "Corrupt JPEG"); + } + + if(scan != STBI__SCAN_load) return 1; + + if(!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for(i = 0; i < s->img_n; ++i) { + if(z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if(z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for(i = 0; i < s->img_n; ++i) { + if(h_max % z->img_comp[i].h != 0) return stbi__err("bad H", "Corrupt JPEG"); + if(v_max % z->img_comp[i].v != 0) return stbi__err("bad V", "Corrupt JPEG"); + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h; + + for(i = 0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if(z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i + 1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc *)(((size_t) z->img_comp[i].raw_data + 15) & ~15); + if(z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if(z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i + 1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short *)(((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg * z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if(!stbi__SOI(m)) return stbi__err("no SOI", "Corrupt JPEG"); + if(scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while(!stbi__SOF(m)) { + if(!stbi__process_marker(z, m)) return 0; + m = stbi__get_marker(z); + while(m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if(stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if(!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg * j) +{ + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while(!stbi__at_eof(j->s)) { + stbi_uc x = stbi__get8(j->s); + while(x == 0xff) { // might be a marker + if(stbi__at_eof(j->s)) return STBI__MARKER_none; + x = stbi__get8(j->s); + if(x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg * j) +{ + int m; + for(m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if(!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while(!stbi__EOI(m)) { + if(stbi__SOS(m)) { + if(!stbi__process_scan_header(j)) return 0; + if(!stbi__parse_entropy_coded_data(j)) return 0; + if(j->marker == STBI__MARKER_none) { + j->marker = stbi__skip_jpeg_junk_at_end(j); + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + m = stbi__get_marker(j); + if(STBI__RESTART(m)) + m = stbi__get_marker(j); + } + else if(stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if(Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if(NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); + } + else { + if(!stbi__process_marker(j, m)) return 1; + m = stbi__get_marker(j); + } + } + if(j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc * (*resample_row_func)(stbi_uc * out, stbi_uc * in0, stbi_uc * in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc * resample_row_1(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc * stbi__resample_row_v_2(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for(i = 0; i < w; ++i) + out[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc * stbi__resample_row_h_2(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc * input = in_near; + + if(w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0] * 3 + input[1] + 2); + for(i = 1; i < w - 1; ++i) { + int n = 3 * input[i] + 2; + out[i * 2 + 0] = stbi__div4(n + input[i - 1]); + out[i * 2 + 1] = stbi__div4(n + input[i + 1]); + } + out[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2); + out[i * 2 + 1] = input[w - 1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc * stbi__resample_row_hv_2(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i, t0, t1; + if(w == 1) { + out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3 * in_near[0] + in_far[0]; + out[0] = stbi__div4(t1 + 2); + for(i = 1; i < w; ++i) { + t0 = t1; + t1 = 3 * in_near[i] + in_far[i]; + out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8); + out[i * 2 ] = stbi__div16(3 * t1 + t0 + 8); + } + out[w * 2 - 1] = stbi__div4(t1 + 2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc * stbi__resample_row_hv_2_simd(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i = 0, t0, t1; + + if(w == 1) { + out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3 * in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for(; i < ((w - 1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *)(in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *)(in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *)(out + i * 2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i * 2, o); +#endif + + // "previous" value for next iter + t1 = 3 * in_near[i + 7] + in_far[i + 7]; + } + + t0 = t1; + t1 = 3 * in_near[i] + in_far[i]; + out[i * 2] = stbi__div16(3 * t1 + t0 + 8); + + for(++i; i < w; ++i) { + t0 = t1; + t1 = 3 * in_near[i] + in_far[i]; + out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8); + out[i * 2 ] = stbi__div16(3 * t1 + t0 + 8); + } + out[w * 2 - 1] = stbi__div4(t1 + 2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc * stbi__resample_row_generic(stbi_uc * out, stbi_uc * in_near, stbi_uc * in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i, j; + STBI_NOTUSED(in_far); + for(i = 0; i < w; ++i) + for(j = 0; j < hs; ++j) + out[i * hs + j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc * out, const stbi_uc * y, const stbi_uc * pcb, const stbi_uc * pcr, + int count, int step) +{ + int i; + for(i = 0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1 << 19); // rounding + int r, g, b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr * stbi__float2fixed(1.40200f); + g = y_fixed + (cr * -stbi__float2fixed(0.71414f)) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb * stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if((unsigned) r > 255) { + if(r < 0) r = 0; + else r = 255; + } + if((unsigned) g > 255) { + if(g < 0) g = 0; + else g = 255; + } + if((unsigned) b > 255) { + if(b < 0) b = 0; + else b = 255; + } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc * out, stbi_uc const * y, stbi_uc const * pcb, stbi_uc const * pcr, + int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if(step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16((short)(1.40200f * 4096.0f + 0.5f)); + __m128i cr_const1 = _mm_set1_epi16(- (short)(0.71414f * 4096.0f + 0.5f)); + __m128i cb_const0 = _mm_set1_epi16(- (short)(0.34414f * 4096.0f + 0.5f)); + __m128i cb_const1 = _mm_set1_epi16((short)(1.77200f * 4096.0f + 0.5f)); + __m128i y_bias = _mm_set1_epi8((char)(unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for(; i + 7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *)(y + i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *)(pcr + i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *)(pcb + i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *)(out + 0), o0); + _mm_storeu_si128((__m128i *)(out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if(step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16((short)(1.40200f * 4096.0f + 0.5f)); + int16x8_t cr_const1 = vdupq_n_s16(- (short)(0.71414f * 4096.0f + 0.5f)); + int16x8_t cb_const0 = vdupq_n_s16(- (short)(0.34414f * 4096.0f + 0.5f)); + int16x8_t cb_const1 = vdupq_n_s16((short)(1.77200f * 4096.0f + 0.5f)); + + for(; i + 7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8 * 4; + } + } +#endif + + for(; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1 << 19); // rounding + int r, g, b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr * stbi__float2fixed(1.40200f); + g = y_fixed + cr * -stbi__float2fixed(0.71414f) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb * stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if((unsigned) r > 255) { + if(r < 0) r = 0; + else r = 255; + } + if((unsigned) g > 255) { + if(g < 0) g = 0; + else g = 255; + } + if((unsigned) b > 255) { + if(b < 0) b = 0; + else b = 255; + } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg * j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if(stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg * j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct { + resample_row_func resample; + stbi_uc * line0, * line1; + int hs, vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x * y + 128; + return (stbi_uc)((t + (t >> 8)) >> 8); +} + +static stbi_uc * load_jpeg_image(stbi__jpeg * z, int * out_x, int * out_y, int * comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if(req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if(!stbi__decode_jpeg_image(z)) { + stbi__cleanup_jpeg(z); + return NULL; + } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if(z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if(decode_n <= 0) { + stbi__cleanup_jpeg(z); + return NULL; + } + + // resample and color-convert + { + int k; + unsigned int i, j; + stbi_uc * output; + stbi_uc * coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for(k = 0; k < decode_n; ++k) { + stbi__resample * r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if(!z->img_comp[k].linebuf) { + stbi__cleanup_jpeg(z); + return stbi__errpuc("outofmem", "Out of memory"); + } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs - 1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if(r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if(r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if(r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if(r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if(!output) { + stbi__cleanup_jpeg(z); + return stbi__errpuc("outofmem", "Out of memory"); + } + + // now go ahead and resample + for(j = 0; j < z->s->img_y; ++j) { + stbi_uc * out = output + n * z->s->img_x * j; + for(k = 0; k < decode_n; ++k) { + stbi__resample * r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if(++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if(++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if(n >= 3) { + stbi_uc * y = coutput[0]; + if(z->s->img_n == 3) { + if(is_rgb) { + for(i = 0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } + else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } + else if(z->s->img_n == 4) { + if(z->app14_color_transform == 0) { // CMYK + for(i = 0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } + else if(z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for(i = 0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } + else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } + else + for(i = 0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } + else { + if(is_rgb) { + if(n == 1) + for(i = 0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for(i = 0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } + else if(z->s->img_n == 4 && z->app14_color_transform == 0) { + for(i = 0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } + else if(z->s->img_n == 4 && z->app14_color_transform == 2) { + for(i = 0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } + else { + stbi_uc * y = coutput[0]; + if(n == 1) + for(i = 0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for(i = 0; i < z->s->img_x; ++i) { + *out++ = y[i]; + *out++ = 255; + } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if(comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void * stbi__jpeg_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) +{ + unsigned char * result; + stbi__jpeg * j = (stbi__jpeg *) stbi__malloc(sizeof(stbi__jpeg)); + if(!j) return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x, y, comp, req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context * s) +{ + int r; + stbi__jpeg * j = (stbi__jpeg *)stbi__malloc(sizeof(stbi__jpeg)); + if(!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg * j, int * x, int * y, int * comp) +{ + if(!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind(j->s); + return 0; + } + if(x) *x = j->s->img_x; + if(y) *y = j->s->img_y; + if(comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context * s, int * x, int * y, int * comp) +{ + int result; + stbi__jpeg * j = (stbi__jpeg *)(stbi__malloc(sizeof(stbi__jpeg))); + if(!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct { + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16 - bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman * z, const stbi_uc * sizelist, int num) +{ + int i, k = 0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for(i = 0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for(i = 1; i < 16; ++i) + if(sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for(i = 1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if(sizes[i]) + if(code - 1 >= (1 << i)) return stbi__err("bad codelengths", "Corrupt PNG"); + z->maxcode[i] = code << (16 - i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for(i = 0; i < num; ++i) { + int s = sizelist[i]; + if(s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16)((s << 9) | i); + z->size [c] = (stbi_uc) s; + z->value[c] = (stbi__uint16) i; + if(s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s], s); + while(j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct { + stbi_uc * zbuffer, * zbuffer_end; + int num_bits; + int hit_zeof_once; + stbi__uint32 code_buffer; + + char * zout; + char * zout_start; + char * zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf * z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf * z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf * z) +{ + do { + if(z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while(z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf * z, int n) +{ + unsigned int k; + if(z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf * a, stbi__zhuffman * z) +{ + int b, s, k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for(s = STBI__ZFAST_BITS + 1; ; ++s) + if(k < z->maxcode[s]) + break; + if(s >= 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s]; + if(b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! + if(z->size[b] != s) return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf * a, stbi__zhuffman * z) +{ + int b, s; + if(a->num_bits < 16) { + if(stbi__zeof(a)) { + if(!a->hit_zeof_once) { + // This is the first time we hit eof, insert 16 extra padding btis + // to allow us to keep going; if we actually consume any of them + // though, that is invalid data. This is caught later. + a->hit_zeof_once = 1; + a->num_bits += 16; // add 16 implicit zero bits + } + else { + // We already inserted our extra 16 padding bits and are again + // out, this stream is actually prematurely terminated. + return -1; + } + } + else { + stbi__fill_bits(a); + } + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if(b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf * z, char * zout, int n) // need to make room for n bytes +{ + char * q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if(!z->z_expandable) return stbi__err("output buffer limit", "Corrupt PNG"); + cur = (unsigned int)(z->zout - z->zout_start); + limit = old_limit = (unsigned)(z->zout_end - z->zout_start); + if(UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while(cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if(q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, + 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, + 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 +}; + +static const int stbi__zlength_extra[31] = +{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0 }; + +static const int stbi__zdist_base[32] = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0 + }; + +static const int stbi__zdist_extra[32] = +{ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + +static int stbi__parse_huffman_block(stbi__zbuf * a) +{ + char * zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if(z < 256) { + if(z < 0) return stbi__err("bad huffman code", "Corrupt PNG"); // error in huffman codes + if(zout >= a->zout_end) { + if(!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } + else { + stbi_uc * p; + int len, dist; + if(z == 256) { + a->zout = zout; + if(a->hit_zeof_once && a->num_bits < 16) { + // The first time we hit zeof, we inserted 16 extra zero bits into our bit + // buffer so the decoder can just do its speculative decoding. But if we + // actually consumed any of those bits (which is the case when num_bits < 16), + // the stream actually read past the end so it is malformed. + return stbi__err("unexpected end", "Corrupt PNG"); + } + return 1; + } + if(z >= 286) return stbi__err("bad huffman code", + "Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data + z -= 257; + len = stbi__zlength_base[z]; + if(stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if(z < 0 || + z >= 30) return stbi__err("bad huffman code", + "Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data + dist = stbi__zdist_base[z]; + if(stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if(zout - a->zout_start < dist) return stbi__err("bad dist", "Corrupt PNG"); + if(len > a->zout_end - zout) { + if(!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *)(zout - dist); + if(dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if(len) { + do * zout++ = v; + while(--len); + } + } + else { + if(len) { + do * zout++ = *p++; + while(--len); + } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf * a) +{ + static const stbi_uc length_dezigzag[19] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286 + 32 + 137]; //padding for maximum single op + stbi_uc codelength_sizes[19]; + int i, n; + + int hlit = stbi__zreceive(a, 5) + 257; + int hdist = stbi__zreceive(a, 5) + 1; + int hclen = stbi__zreceive(a, 4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for(i = 0; i < hclen; ++i) { + int s = stbi__zreceive(a, 3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if(!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while(n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if(c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if(c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if(c == 16) { + c = stbi__zreceive(a, 2) + 3; + if(n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n - 1]; + } + else if(c == 17) { + c = stbi__zreceive(a, 3) + 3; + } + else if(c == 18) { + c = stbi__zreceive(a, 7) + 11; + } + else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if(ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes + n, fill, c); + n += c; + } + } + if(n != ntot) return stbi__err("bad codelengths", "Corrupt PNG"); + if(!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if(!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf * a) +{ + stbi_uc header[4]; + int len, nlen, k; + if(a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while(a->num_bits > 0) { + header[k++] = (stbi_uc)(a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if(a->num_bits < 0) return stbi__err("zlib corrupt", "Corrupt PNG"); + // now fill header the normal way + while(k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if(nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt", "Corrupt PNG"); + if(a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer", "Corrupt PNG"); + if(a->zout + len > a->zout_end) + if(!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf * a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if(stbi__zeof(a)) return stbi__err("bad zlib header", "Corrupt PNG"); // zlib spec + if((cmf * 256 + flg) % 31 != 0) return stbi__err("bad zlib header", "Corrupt PNG"); // zlib spec + if(flg & 32) return stbi__err("no preset dict", "Corrupt PNG"); // preset dictionary not allowed in png + if(cm != 8) return stbi__err("bad compression", "Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = { + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8 +}; +static const stbi_uc stbi__zdefault_distance[32] = { + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf * a, int parse_header) +{ + int final, type; + if(parse_header) + if(!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + a->hit_zeof_once = 0; + do { + final = stbi__zreceive(a, 1); + type = stbi__zreceive(a, 2); + if(type == 0) { + if(!stbi__parse_uncompressed_block(a)) return 0; + } + else if(type == 3) { + return 0; + } + else { + if(type == 1) { + // use fixed code lengths + if(!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, STBI__ZNSYMS)) return 0; + if(!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } + else { + if(!stbi__compute_huffman_codes(a)) return 0; + } + if(!stbi__parse_huffman_block(a)) return 0; + } + } while(!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf * a, char * obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char * buffer, int len, int initial_size, int * outlen) +{ + stbi__zbuf a; + char * p = (char *) stbi__malloc(initial_size); + if(p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if(stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if(outlen) *outlen = (int)(a.zout - a.zout_start); + return a.zout_start; + } + else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char * stbi_zlib_decode_malloc(char const * buffer, int len, int * outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char * buffer, int len, int initial_size, + int * outlen, int parse_header) +{ + stbi__zbuf a; + char * p = (char *) stbi__malloc(initial_size); + if(p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if(stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if(outlen) *outlen = (int)(a.zout - a.zout_start); + return a.zout_start; + } + else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char * obuffer, int olen, char const * ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if(stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int)(a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char * stbi_zlib_decode_noheader_malloc(char const * buffer, int len, int * outlen) +{ + stbi__zbuf a; + char * p = (char *) stbi__malloc(16384); + if(p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if(stbi__do_zlib(&a, p, 16384, 1, 0)) { + if(outlen) *outlen = (int)(a.zout - a.zout_start); + return a.zout_start; + } + else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char * obuffer, int olen, const char * ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if(stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int)(a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct { + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context * s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context * s) +{ + static const stbi_uc png_sig[8] = { 137, 80, 78, 71, 13, 10, 26, 10 }; + int i; + for(i = 0; i < 8; ++i) + if(stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig", "Not a PNG"); + return 1; +} + +typedef struct { + stbi__context * s; + stbi_uc * idata, * expanded, * out; + int depth; +} stbi__png; + + +enum { + STBI__F_none = 0, + STBI__F_sub = 1, + STBI__F_up = 2, + STBI__F_avg = 3, + STBI__F_paeth = 4, + // synthetic filter used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first +}; + +static stbi_uc first_row_filter[5] = { + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub +}; + +static int stbi__paeth(int a, int b, int c) +{ + // This formulation looks very different from the reference in the PNG spec, but is + // actually equivalent and has favorable data dependencies and admits straightforward + // generation of branch-free code, which helps performance significantly. + int thresh = c * 3 - (a + b); + int lo = a < b ? a : b; + int hi = a < b ? b : a; + int t0 = (hi <= thresh) ? lo : c; + int t1 = (thresh <= lo) ? hi : t0; + return t1; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0, 0, 0, 0x01 }; + +// adds an extra all-255 alpha channel +// dest == src is legal +// img_n must be 1 or 3 +static void stbi__create_png_alpha_expand8(stbi_uc * dest, stbi_uc * src, stbi__uint32 x, int img_n) +{ + int i; + // must process data backwards since we allow dest==src + if(img_n == 1) { + for(i = x - 1; i >= 0; --i) { + dest[i * 2 + 1] = 255; + dest[i * 2 + 0] = src[i]; + } + } + else { + STBI_ASSERT(img_n == 3); + for(i = x - 1; i >= 0; --i) { + dest[i * 4 + 3] = 255; + dest[i * 4 + 2] = src[i * 3 + 2]; + dest[i * 4 + 1] = src[i * 3 + 1]; + dest[i * 4 + 0] = src[i * 3 + 0]; + } + } +} + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png * a, stbi_uc * raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, + stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16 ? 2 : 1); + stbi__context * s = a->s; + stbi__uint32 i, j, stride = x * out_n * bytes; + stbi__uint32 img_len, img_width_bytes; + stbi_uc * filter_buf; + int all_ok = 1; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n * bytes; + int filter_bytes = img_n * bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if(!a->out) return stbi__err("outofmem", "Out of memory"); + + // note: error exits here don't need to clean up a->out individually, + // stbi__do_png always does on error. + if(!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + if(!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG"); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if(raw_len < img_len) return stbi__err("not enough pixels", "Corrupt PNG"); + + // Allocate two scan lines worth of filter workspace buffer. + filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0); + if(!filter_buf) return stbi__err("outofmem", "Out of memory"); + + // Filtering for low-bit-depth images + if(depth < 8) { + filter_bytes = 1; + width = img_width_bytes; + } + + for(j = 0; j < y; ++j) { + // cur/prior filter buffers alternate + stbi_uc * cur = filter_buf + (j & 1) * img_width_bytes; + stbi_uc * prior = filter_buf + (~j & 1) * img_width_bytes; + stbi_uc * dest = a->out + stride * j; + int nk = width * filter_bytes; + int filter = *raw++; + + // check filter type + if(filter > 4) { + all_ok = stbi__err("invalid filter", "Corrupt PNG"); + break; + } + + // if first row, use special filter that doesn't sample previous row + if(j == 0) filter = first_row_filter[filter]; + + // perform actual filtering + switch(filter) { + case STBI__F_none: + memcpy(cur, raw, nk); + break; + case STBI__F_sub: + memcpy(cur, raw, filter_bytes); + for(k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); + break; + case STBI__F_up: + for(k = 0; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); + break; + case STBI__F_avg: + for(k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1)); + for(k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); + break; + case STBI__F_paeth: + for(k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0) + for(k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); + break; + case STBI__F_avg_first: + memcpy(cur, raw, filter_bytes); + for(k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); + break; + } + + raw += nk; + + // expand decoded bits in cur to dest, also adding an extra alpha channel if desired + if(depth < 8) { + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + stbi_uc * in = cur; + stbi_uc * out = dest; + stbi_uc inb = 0; + stbi__uint32 nsmp = x * img_n; + + // expand bits to bytes first + if(depth == 4) { + for(i = 0; i < nsmp; ++i) { + if((i & 1) == 0) inb = *in++; + *out++ = scale * (inb >> 4); + inb <<= 4; + } + } + else if(depth == 2) { + for(i = 0; i < nsmp; ++i) { + if((i & 3) == 0) inb = *in++; + *out++ = scale * (inb >> 6); + inb <<= 2; + } + } + else { + STBI_ASSERT(depth == 1); + for(i = 0; i < nsmp; ++i) { + if((i & 7) == 0) inb = *in++; + *out++ = scale * (inb >> 7); + inb <<= 1; + } + } + + // insert alpha=255 values if desired + if(img_n != out_n) + stbi__create_png_alpha_expand8(dest, dest, x, img_n); + } + else if(depth == 8) { + if(img_n == out_n) + memcpy(dest, cur, x * img_n); + else + stbi__create_png_alpha_expand8(dest, cur, x, img_n); + } + else if(depth == 16) { + // convert the image data from big-endian to platform-native + stbi__uint16 * dest16 = (stbi__uint16 *)dest; + stbi__uint32 nsmp = x * img_n; + + if(img_n == out_n) { + for(i = 0; i < nsmp; ++i, ++dest16, cur += 2) + * dest16 = (cur[0] << 8) | cur[1]; + } + else { + STBI_ASSERT(img_n + 1 == out_n); + if(img_n == 1) { + for(i = 0; i < x; ++i, dest16 += 2, cur += 2) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = 0xffff; + } + } + else { + STBI_ASSERT(img_n == 3); + for(i = 0; i < x; ++i, dest16 += 4, cur += 6) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = (cur[2] << 8) | cur[3]; + dest16[2] = (cur[4] << 8) | cur[5]; + dest16[3] = 0xffff; + } + } + } + } + } + + STBI_FREE(filter_buf); + if(!all_ok) return 0; + + return 1; +} + +static int stbi__create_png_image(stbi__png * a, stbi_uc * image_data, stbi__uint32 image_data_len, int out_n, + int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc * final; + int p; + if(!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if(!final) return stbi__err("outofmem", "Out of memory"); + for(p = 0; p < 7; ++p) { + int xorig[] = { 0, 4, 0, 2, 0, 1, 0 }; + int yorig[] = { 0, 0, 4, 0, 2, 0, 1 }; + int xspc[] = { 8, 8, 4, 4, 2, 2, 1 }; + int yspc[] = { 8, 8, 8, 4, 4, 2, 2 }; + int i, j, x, y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p]; + if(x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if(!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for(j = 0; j < y; ++j) { + for(i = 0; i < x; ++i) { + int out_y = j * yspc[p] + yorig[p]; + int out_x = i * xspc[p] + xorig[p]; + memcpy(final + out_y * a->s->img_x * out_bytes + out_x * out_bytes, + a->out + (j * x + i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png * z, stbi_uc tc[3], int out_n) +{ + stbi__context * s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc * p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if(out_n == 2) { + for(i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } + else { + for(i = 0; i < pixel_count; ++i) { + if(p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png * z, stbi__uint16 tc[3], int out_n) +{ + stbi__context * s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 * p = (stbi__uint16 *) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if(out_n == 2) { + for(i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } + else { + for(i = 0; i < pixel_count; ++i) { + if(p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png * a, stbi_uc * palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc * p, * temp_out, * orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if(p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if(pal_img_n == 3) { + for(i = 0; i < pixel_count; ++i) { + int n = orig[i] * 4; + p[0] = palette[n ]; + p[1] = palette[n + 1]; + p[2] = palette[n + 2]; + p += 3; + } + } + else { + for(i = 0; i < pixel_count; ++i) { + int n = orig[i] * 4; + p[0] = palette[n ]; + p[1] = palette[n + 1]; + p[2] = palette[n + 2]; + p[3] = palette[n + 3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ + ? stbi__unpremultiply_on_load_local \ + : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ + ? stbi__de_iphone_flag_local \ + : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +static void stbi__de_iphone(stbi__png * z) +{ + stbi__context * s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc * p = z->out; + + if(s->img_out_n == 3) { // convert bgr to rgb + for(i = 0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } + else { + STBI_ASSERT(s->img_out_n == 4); + if(stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for(i = 0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if(a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = (t * 255 + half) / a; + } + else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } + else { + // convert bgr to rgb + for(i = 0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png * z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n = 0; + stbi_uc has_trans = 0, tc[3] = {0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0; + int first = 1, k, interlace = 0, color = 0, is_iphone = 0; + stbi__context * s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if(!stbi__check_png_header(s)) return 0; + + if(scan == STBI__SCAN_type) return 1; + + for(;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch(c.type) { + case STBI__PNG_TYPE('C', 'g', 'B', 'I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I', 'H', 'D', 'R'): { + int comp, filter; + if(!first) return stbi__err("multiple IHDR", "Corrupt PNG"); + first = 0; + if(c.length != 13) return stbi__err("bad IHDR len", "Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if(s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large", "Very large image (corrupt?)"); + if(s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large", "Very large image (corrupt?)"); + z->depth = stbi__get8(s); + if(z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && + z->depth != 16) return stbi__err("1/2/4/8/16-bit only", "PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); + if(color > 6) return stbi__err("bad ctype", "Corrupt PNG"); + if(color == 3 && z->depth == 16) return stbi__err("bad ctype", "Corrupt PNG"); + if(color == 3) pal_img_n = 3; + else if(color & 1) return stbi__err("bad ctype", "Corrupt PNG"); + comp = stbi__get8(s); + if(comp) return stbi__err("bad comp method", "Corrupt PNG"); + filter = stbi__get8(s); + if(filter) return stbi__err("bad filter method", "Corrupt PNG"); + interlace = stbi__get8(s); + if(interlace > 1) return stbi__err("bad interlace method", "Corrupt PNG"); + if(!s->img_x || !s->img_y) return stbi__err("0-pixel image", "Corrupt PNG"); + if(!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + } + else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large", "Corrupt PNG"); + } + // even with SCAN_header, have to scan to see if we have a tRNS + break; + } + + case STBI__PNG_TYPE('P', 'L', 'T', 'E'): { + if(first) return stbi__err("first not IHDR", "Corrupt PNG"); + if(c.length > 256 * 3) return stbi__err("invalid PLTE", "Corrupt PNG"); + pal_len = c.length / 3; + if(pal_len * 3 != c.length) return stbi__err("invalid PLTE", "Corrupt PNG"); + for(i = 0; i < pal_len; ++i) { + palette[i * 4 + 0] = stbi__get8(s); + palette[i * 4 + 1] = stbi__get8(s); + palette[i * 4 + 2] = stbi__get8(s); + palette[i * 4 + 3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t', 'R', 'N', 'S'): { + if(first) return stbi__err("first not IHDR", "Corrupt PNG"); + if(z->idata) return stbi__err("tRNS after IDAT", "Corrupt PNG"); + if(pal_img_n) { + if(scan == STBI__SCAN_header) { + s->img_n = 4; + return 1; + } + if(pal_len == 0) return stbi__err("tRNS before PLTE", "Corrupt PNG"); + if(c.length > pal_len) return stbi__err("bad tRNS len", "Corrupt PNG"); + pal_img_n = 4; + for(i = 0; i < c.length; ++i) + palette[i * 4 + 3] = stbi__get8(s); + } + else { + if(!(s->img_n & 1)) return stbi__err("tRNS with alpha", "Corrupt PNG"); + if(c.length != (stbi__uint32) s->img_n * 2) return stbi__err("bad tRNS len", "Corrupt PNG"); + has_trans = 1; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if(scan == STBI__SCAN_header) { + ++s->img_n; + return 1; + } + if(z->depth == 16) { + for(k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning + tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } + else { + for(k = 0; k < s->img_n && k < 3; ++k) + tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I', 'D', 'A', 'T'): { + if(first) return stbi__err("first not IHDR", "Corrupt PNG"); + if(pal_img_n && !pal_len) return stbi__err("no PLTE", "Corrupt PNG"); + if(scan == STBI__SCAN_header) { + // header scan definitely stops at first IDAT + if(pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if(c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); + if((int)(ioff + c.length) < (int)ioff) return 0; + if(ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc * p; + if(idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while(ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); + if(p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if(!stbi__getn(s, z->idata + ioff, c.length)) return stbi__err("outofdata", "Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I', 'E', 'N', 'D'): { + stbi__uint32 raw_len, bpl; + if(first) return stbi__err("first not IHDR", "Corrupt PNG"); + if(scan != STBI__SCAN_load) return 1; + if(z->idata == NULL) return stbi__err("no IDAT", "Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, + (int *) &raw_len, !is_iphone); + if(z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); + z->idata = NULL; + if((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n + 1; + else + s->img_out_n = s->img_n; + if(!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if(has_trans) { + if(z->depth == 16) { + if(!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } + else { + if(!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if(is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if(pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if(req_comp >= 3) s->img_out_n = req_comp; + if(!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } + else if(has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); + z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if(first) return stbi__err("first not IHDR", "Corrupt PNG"); + if((c.type & (1 << 29)) == 0) { +#ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); +#endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void * stbi__do_png(stbi__png * p, int * x, int * y, int * n, int req_comp, stbi__result_info * ri) +{ + void * result = NULL; + if(req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if(stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if(p->depth <= 8) + ri->bits_per_channel = 8; + else if(p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if(req_comp && req_comp != p->s->img_out_n) { + if(ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if(result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if(n) *n = p->s->img_n; + } + STBI_FREE(p->out); + p->out = NULL; + STBI_FREE(p->expanded); + p->expanded = NULL; + STBI_FREE(p->idata); + p->idata = NULL; + + return result; +} + +static void * stbi__png_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x, y, comp, req_comp, ri); +} + +static int stbi__png_test(stbi__context * s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png * p, int * x, int * y, int * comp) +{ + if(!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind(p->s); + return 0; + } + if(x) *x = p->s->img_x; + if(y) *y = p->s->img_y; + if(comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context * s, int * x, int * y, int * comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context * s) +{ + stbi__png p; + p.s = s; + if(!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if(p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context * s) +{ + int r; + int sz; + if(stbi__get8(s) != 'B') return 0; + if(stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context * s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n = 0; + if(z == 0) return -1; + if(z >= 0x10000) { + n += 16; + z >>= 16; + } + if(z >= 0x00100) { + n += 8; + z >>= 8; + } + if(z >= 0x00010) { + n += 4; + z >>= 4; + } + if(z >= 0x00004) { + n += 2; + z >>= 2; + } + if(z >= 0x00002) { + n += 1;/* >>= 1;*/ + } + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0, 0, 1, 0, 2, 4, 6, 0, + }; + if(shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8 - bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int)((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct { + int bpp, offset, hsz; + unsigned int mr, mg, mb, ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data * info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if(compress == 3) + return 1; + + if(compress == 0) { + if(info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } + else if(info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } + else { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +static void * stbi__bmp_parse_header(stbi__context * s, stbi__bmp_data * info) +{ + int hsz; + if(stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if(info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + if(hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && + hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if(hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } + else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if(stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if(hsz != 12) { + int compress = stbi__get32le(s); + if(compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if(compress >= 4) return stbi__errpuc("BMP JPEG/PNG", + "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if(compress == 3 && info->bpp != 16 && + info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if(hsz == 40 || hsz == 56) { + if(hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if(info->bpp == 16 || info->bpp == 32) { + if(compress == 0) { + stbi__bmp_set_mask_defaults(info, compress); + } + else if(compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if(info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } + else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } + else { + // V4/V5 header + int i; + if(hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + if(compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + stbi__get32le(s); // discard color space + for(i = 0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if(hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void * stbi__bmp_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) +{ + stbi_uc * out; + unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a; + stbi_uc pal[256][4]; + int psize = 0, i, j, width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if(stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if(s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + if(s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if(info.hsz == 12) { + if(info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } + else { + if(info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if(psize == 0) { + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256 * 4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if(bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if(info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } + else { + stbi__skip(s, info.offset - bytes_read_so_far); + } + } + + if(info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if(req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if(!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if(!out) return stbi__errpuc("outofmem", "Out of memory"); + if(info.bpp < 16) { + int z = 0; + if(psize == 0 || psize > 256) { + STBI_FREE(out); + return stbi__errpuc("invalid", "Corrupt BMP"); + } + for(i = 0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if(info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if(info.bpp == 1) width = (s->img_x + 7) >> 3; + else if(info.bpp == 4) width = (s->img_x + 1) >> 1; + else if(info.bpp == 8) width = s->img_x; + else { + STBI_FREE(out); + return stbi__errpuc("bad bpp", "Corrupt BMP"); + } + pad = (-width) & 3; + if(info.bpp == 1) { + for(j = 0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for(i = 0; i < (int) s->img_x; ++i) { + int color = (v >> bit_offset) & 0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if(target == 4) out[z++] = 255; + if(i + 1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } + else { + for(j = 0; j < (int) s->img_y; ++j) { + for(i = 0; i < (int) s->img_x; i += 2) { + int v = stbi__get8(s), v2 = 0; + if(info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if(target == 4) out[z++] = 255; + if(i + 1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if(target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } + else { + int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0; + int z = 0; + int easy = 0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if(info.bpp == 24) width = 3 * s->img_x; + else if(info.bpp == 16) width = 2 * s->img_x; + else /* bpp = 32 and pad = 0 */ width = 0; + pad = (-width) & 3; + if(info.bpp == 24) { + easy = 1; + } + else if(info.bpp == 32) { + if(mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if(!easy) { + if(!mr || !mg || !mb) { + STBI_FREE(out); + return stbi__errpuc("bad masks", "Corrupt BMP"); + } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr) - 7; + rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg) - 7; + gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb) - 7; + bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma) - 7; + acount = stbi__bitcount(ma); + if(rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { + STBI_FREE(out); + return stbi__errpuc("bad masks", "Corrupt BMP"); + } + } + for(j = 0; j < (int) s->img_y; ++j) { + if(easy) { + for(i = 0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z + 2] = stbi__get8(s); + out[z + 1] = stbi__get8(s); + out[z + 0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if(target == 4) out[z++] = a; + } + } + else { + int bpp = info.bpp; + for(i = 0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if(target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if(target == 4 && all_a == 0) + for(i = 4 * s->img_x * s->img_y - 1; i >= 0; i -= 4) + out[i] = 255; + + if(flip_vertically) { + stbi_uc t; + for(j = 0; j < (int) s->img_y >> 1; ++j) { + stbi_uc * p1 = out + j * s->img_x * target; + stbi_uc * p2 = out + (s->img_y - 1 - j) * s->img_x * target; + for(i = 0; i < (int) s->img_x * target; ++i) { + t = p1[i]; + p1[i] = p2[i]; + p2[i] = t; + } + } + } + + if(req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if(out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if(comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int * is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if(is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: + return STBI_grey; + case 16: + if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: + if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: + return bits_per_pixel / 8; + default: + return 0; + } +} + +static int stbi__tga_info(stbi__context * s, int * x, int * y, int * comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if(tga_colormap_type > 1) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if(tga_colormap_type == 1) { // colormapped (paletted) image + if(tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s, 4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) { + stbi__rewind(s); + return 0; + } + stbi__skip(s, 4); // skip image x and y origin + tga_colormap_bpp = sz; + } + else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11)) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s, 9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if(tga_w < 1) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if(tga_h < 1) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if(tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } + else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if(x) *x = tga_w; + if(y) *y = tga_h; + if(comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context * s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if(tga_color_type > 1) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if(tga_color_type == 1) { // colormapped (paletted) image + if(sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s, 4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) goto errorEnd; + stbi__skip(s, 4); // skip image x and y origin + } + else { // "normal" image w/o colormap + if((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11)) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s, 9); // skip colormap specification and image x/y origin + } + if(stbi__get16le(s) < 1) goto errorEnd; // test width + if(stbi__get16le(s) < 1) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if((tga_color_type == 1) && (sz != 8) && + (sz != 16)) goto errorEnd; // for colormapped images, bpp is size of an index + if((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context * s, stbi_uc * out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255) / 31); + out[1] = (stbi_uc)((g * 255) / 31); + out[2] = (stbi_uc)((b * 255) / 31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void * stbi__tga_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16 = 0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char * tga_data; + unsigned char * tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if(tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + if(tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + + // do a tiny bit of precessing + if(tga_image_type >= 8) { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if(tga_indexed) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if(comp) *comp = tga_comp; + + if(!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char *)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if(!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset); + + if(!tga_indexed && !tga_is_RLE && !tga_rgb16) { + for(i = 0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height - i - 1 : i; + stbi_uc * tga_row = tga_data + row * tga_width * tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } + else { + // do I need to load a palette? + if(tga_indexed) { + if(tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start); + // load the palette + tga_palette = (unsigned char *)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if(!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if(tga_rgb16) { + stbi_uc * pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for(i = 0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } + else if(!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for(i = 0; i < tga_width * tga_height; ++i) { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if(tga_is_RLE) { + if(RLE_count == 0) { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } + else if(!RLE_repeating) { + read_next_pixel = 1; + } + } + else { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if(read_next_pixel) { + // load however much data we did have + if(tga_indexed) { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if(pal_idx >= tga_palette_len) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for(j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx + j]; + } + } + else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } + else { + // read in the data raw + for(j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for(j = 0; j < tga_comp; ++j) + tga_data[i * tga_comp + j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if(tga_inverted) { + for(j = 0; j * 2 < tga_height; ++j) { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for(i = tga_width * tga_comp; i > 0; --i) { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if(tga_palette != NULL) { + STBI_FREE(tga_palette); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if(tga_comp >= 3 && !tga_rgb16) { + unsigned char * tga_pixel = tga_data; + for(i = 0; i < tga_width * tga_height; ++i) { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if(req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context * s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context * s, stbi_uc * p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if(len == 128) { + // No-op. + } + else if(len < 128) { + // Copy next len+1 bytes literally. + len++; + if(len > nleft) return 0; // corrupt data + count += len; + while(len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } + else if(len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if(len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while(len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void * stbi__psd_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri, + int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w, h; + stbi_uc * out; + STBI_NOTUSED(ri); + + // Check identifier + if(stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if(stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if(channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if(h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + if(w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if(bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if(stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s, stbi__get32be(s)); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s)); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s)); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if(compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if(!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if(!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } + else + out = (stbi_uc *) stbi__malloc(4 * w * h); + + if(!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w * h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if(compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2); + + // Read the RLE data by channel. + for(channel = 0; channel < 4; channel++) { + stbi_uc * p; + + p = out + channel; + if(channel >= channelCount) { + // Fill this channel with default data. + for(i = 0; i < pixelCount; i++, p += 4) + * p = (channel == 3 ? 255 : 0); + } + else { + // Read the RLE data. + if(!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } + else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for(channel = 0; channel < 4; channel++) { + if(channel >= channelCount) { + // Fill this channel with default data. + if(bitdepth == 16 && bpc == 16) { + stbi__uint16 * q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for(i = 0; i < pixelCount; i++, q += 4) + * q = val; + } + else { + stbi_uc * p = out + channel; + stbi_uc val = channel == 3 ? 255 : 0; + for(i = 0; i < pixelCount; i++, p += 4) + * p = val; + } + } + else { + if(ri->bits_per_channel == 16) { // output bpc + stbi__uint16 * q = ((stbi__uint16 *) out) + channel; + for(i = 0; i < pixelCount; i++, q += 4) + * q = (stbi__uint16) stbi__get16be(s); + } + else { + stbi_uc * p = out + channel; + if(bitdepth == 16) { // input bpc + for(i = 0; i < pixelCount; i++, p += 4) + * p = (stbi_uc)(stbi__get16be(s) >> 8); + } + else { + for(i = 0; i < pixelCount; i++, p += 4) + * p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if(channelCount >= 4) { + if(ri->bits_per_channel == 16) { + for(i = 0; i < w * h; ++i) { + stbi__uint16 * pixel = (stbi__uint16 *) out + 4 * i; + if(pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16)(pixel[0] * ra + inv_a); + pixel[1] = (stbi__uint16)(pixel[1] * ra + inv_a); + pixel[2] = (stbi__uint16)(pixel[2] * ra + inv_a); + } + } + } + else { + for(i = 0; i < w * h; ++i) { + unsigned char * pixel = out + 4 * i; + if(pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char)(pixel[0] * ra + inv_a); + pixel[1] = (unsigned char)(pixel[1] * ra + inv_a); + pixel[2] = (unsigned char)(pixel[2] * ra + inv_a); + } + } + } + } + + // convert to desired output format + if(req_comp && req_comp != 4) { + if(ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if(out == NULL) return out; // stbi__convert_format frees input on failure + } + + if(comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context * s, const char * str) +{ + int i; + for(i = 0; i < 4; ++i) + if(stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context * s) +{ + int i; + + if(!stbi__pic_is4(s, "\x53\x80\xF6\x34")) + return 0; + + for(i = 0; i < 84; ++i) + stbi__get8(s); + + if(!stbi__pic_is4(s, "PICT")) + return 0; + + return 1; +} + +typedef struct { + stbi_uc size, type, channel; +} stbi__pic_packet; + +static stbi_uc * stbi__readval(stbi__context * s, int channel, stbi_uc * dest) +{ + int mask = 0x80, i; + + for(i = 0; i < 4; ++i, mask >>= 1) { + if(channel & mask) { + if(stbi__at_eof(s)) return stbi__errpuc("bad file", "PIC file too short"); + dest[i] = stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel, stbi_uc * dest, const stbi_uc * src) +{ + int mask = 0x80, i; + + for(i = 0; i < 4; ++i, mask >>= 1) + if(channel & mask) + dest[i] = src[i]; +} + +static stbi_uc * stbi__pic_load_core(stbi__context * s, int width, int height, int * comp, stbi_uc * result) +{ + int act_comp = 0, num_packets = 0, y, chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet * packet; + + if(num_packets == sizeof(packets) / sizeof(packets[0])) + return stbi__errpuc("bad format", "too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if(stbi__at_eof(s)) return stbi__errpuc("bad file", "file too short (reading packets)"); + if(packet->size != 8) return stbi__errpuc("bad format", "packet isn't 8bpp"); + } while(chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y = 0; y < height; ++y) { + int packet_idx; + + for(packet_idx = 0; packet_idx < num_packets; ++packet_idx) { + stbi__pic_packet * packet = &packets[packet_idx]; + stbi_uc * dest = result + y * width * 4; + + switch(packet->type) { + default: + return stbi__errpuc("bad format", "packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x = 0; x < width; ++x, dest += 4) + if(!stbi__readval(s, packet->channel, dest)) + return 0; + break; + } + + case 1: { //Pure RLE + int left = width, i; + + while(left > 0) { + stbi_uc count, value[4]; + + count = stbi__get8(s); + if(stbi__at_eof(s)) return stbi__errpuc("bad file", "file too short (pure read count)"); + + if(count > left) + count = (stbi_uc) left; + + if(!stbi__readval(s, packet->channel, value)) return 0; + + for(i = 0; i < count; ++i, dest += 4) + stbi__copyval(packet->channel, dest, value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left = width; + while(left > 0) { + int count = stbi__get8(s), i; + if(stbi__at_eof(s)) return stbi__errpuc("bad file", "file too short (mixed read count)"); + + if(count >= 128) { // Repeated + stbi_uc value[4]; + + if(count == 128) + count = stbi__get16be(s); + else + count -= 127; + if(count > left) + return stbi__errpuc("bad file", "scanline overrun"); + + if(!stbi__readval(s, packet->channel, value)) + return 0; + + for(i = 0; i < count; ++i, dest += 4) + stbi__copyval(packet->channel, dest, value); + } + else { // Raw + ++count; + if(count > left) return stbi__errpuc("bad file", "scanline overrun"); + + for(i = 0; i < count; ++i, dest += 4) + if(!stbi__readval(s, packet->channel, dest)) + return 0; + } + left -= count; + } + break; + } + } + } + } + + return result; +} + +static void * stbi__pic_load(stbi__context * s, int * px, int * py, int * comp, int req_comp, stbi__result_info * ri) +{ + stbi_uc * result; + int i, x, y, internal_comp; + STBI_NOTUSED(ri); + + if(!comp) comp = &internal_comp; + + for(i = 0; i < 92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if(y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + if(x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + + if(stbi__at_eof(s)) return stbi__errpuc("bad file", "file too short (pic header)"); + if(!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + if(!result) return stbi__errpuc("outofmem", "Out of memory"); + memset(result, 0xff, x * y * 4); + + if(!stbi__pic_load_core(s, x, y, comp, result)) { + STBI_FREE(result); + result = 0; + } + *px = x; + *py = y; + if(req_comp == 0) req_comp = *comp; + result = stbi__convert_format(result, 4, req_comp, x, y); + + return result; +} + +static int stbi__pic_test(stbi__context * s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct { + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct { + int w, h; + stbi_uc * out; // output buffer (always 4 components) + stbi_uc * background; // The current "background" as far as a gif is concerned + stbi_uc * history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc * color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context * s) +{ + int sz; + if(stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if(sz != '9' && sz != '7') return 0; + if(stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context * s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context * s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for(i = 0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context * s, stbi__gif * g, int * comp, int is_info) +{ + stbi_uc version; + if(stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if(version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if(stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if(g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large", "Very large image (corrupt?)"); + if(g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large", "Very large image (corrupt?)"); + + if(comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if(is_info) return 1; + + if(g->flags & 0x80) + stbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context * s, int * x, int * y, int * comp) +{ + stbi__gif * g = (stbi__gif *) stbi__malloc(sizeof(stbi__gif)); + if(!g) return stbi__err("outofmem", "Out of memory"); + if(!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind(s); + return 0; + } + if(x) *x = g->w; + if(y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif * g, stbi__uint16 code) +{ + stbi_uc * p, * c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if(g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if(g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if(c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if(g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while(g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc * stbi__process_gif_raster(stbi__context * s, stbi__gif * g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw * p; + + lzw_cs = stbi__get8(s); + if(lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for(init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear + 2; + oldcode = -1; + + len = 0; + for(;;) { + if(valid_bits < codesize) { + if(len == 0) { + len = stbi__get8(s); // start new block + if(len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } + else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if(code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } + else if(code == clear + 1) { // end of stream code + stbi__skip(s, len); + while((len = stbi__get8(s)) > 0) + stbi__skip(s, len); + return g->out; + } + else if(code <= avail) { + if(first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if(oldcode >= 0) { + p = &g->codes[avail++]; + if(avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } + else if(code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } + else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc * stbi__gif_load_next(stbi__context * s, stbi__gif * g, int * comp, int req_comp, stbi_uc * two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if(g->out == 0) { + if(!stbi__gif_header(s, g, comp, 0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if(!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if(!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } + else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if(dispose == 3) { // use previous graphic + for(pi = 0; pi < pcount; ++pi) { + if(g->history[pi]) { + memcpy(&g->out[pi * 4], &two_back[pi * 4], 4); + } + } + } + else if(dispose == 2) { + // restore what was changed last frame to background before that frame; + for(pi = 0; pi < pcount; ++pi) { + if(g->history[pi]) { + memcpy(&g->out[pi * 4], &g->background[pi * 4], 4); + } + } + } + else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy(g->background, g->out, 4 * g->w * g->h); + } + + // clear my history; + memset(g->history, 0x00, g->w * g->h); // pixels that were affected previous frame + + for(;;) { + int tag = stbi__get8(s); + switch(tag) { + case 0x2C: { /* Image Descriptor */ + stbi__int32 x, y, w, h; + stbi_uc * o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if(((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if(w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if(g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } + else { + g->step = g->line_size; + g->parse = 0; + } + + if(g->lflags & 0x80) { + stbi__gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } + else if(g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } + else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if(!o) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if(first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for(pi = 0; pi < pcount; ++pi) { + if(g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy(&g->out[pi * 4], &g->pal[g->bgindex], 4); + } + } + } + + return o; + } + + case 0x21: { // Comment Extension. + int len; + int ext = stbi__get8(s); + if(ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if(len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if(g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if(g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if(g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } + else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } + else { + stbi__skip(s, len); + break; + } + } + while((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void * stbi__load_gif_main_outofmem(stbi__gif * g, stbi_uc * out, int ** delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if(out) STBI_FREE(out); + if(delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void * stbi__load_gif_main(stbi__context * s, int ** delays, int * x, int * y, int * z, int * comp, int req_comp) +{ + if(stbi__gif_test(s)) { + int layers = 0; + stbi_uc * u = 0; + stbi_uc * out = 0; + stbi_uc * two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if(delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if(u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if(u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if(out) { + void * tmp = (stbi_uc *) STBI_REALLOC_SIZED(out, out_size, layers * stride); + if(!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc *) tmp; + out_size = layers * stride; + } + + if(delays) { + int * new_delays = (int *) STBI_REALLOC_SIZED(*delays, delays_size, sizeof(int) * layers); + if(!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } + else { + out = (stbi_uc *)stbi__malloc(layers * stride); + if(!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if(delays) { + *delays = (int *) stbi__malloc(layers * sizeof(int)); + if(!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy(out + ((layers - 1) * stride), u, stride); + if(layers >= 2) { + two_back = out - 2 * stride; + } + + if(delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while(u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if(req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } + else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void * stbi__gif_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) +{ + stbi_uc * u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if(u == (stbi_uc *) s) u = 0; // end of animated gif marker + if(u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if(req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } + else if(g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context * s, int * x, int * y, int * comp) +{ + return stbi__gif_info_raw(s, x, y, comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context * s, const char * signature) +{ + int i; + for(i = 0; signature[i]; ++i) + if(stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context * s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char * stbi__hdr_gettoken(stbi__context * z, char * buffer) +{ + int len = 0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while(!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if(len == STBI__HDR_BUFLEN - 1) { + // flush to end of line + while(!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float * output, stbi_uc * input, int req_comp) +{ + if(input[3] != 0) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if(req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if(req_comp == 2) output[1] = 1; + if(req_comp == 4) output[3] = 1; + } + else { + switch(req_comp) { + case 4: + output[3] = 1; /* fallthrough */ + case 3: + output[0] = output[1] = output[2] = 0; + break; + case 2: + output[1] = 1; /* fallthrough */ + case 1: + output[0] = 0; + break; + } + } +} + +static float * stbi__hdr_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char * token; + int valid = 0; + int width, height; + stbi_uc * scanline; + float * hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1, c2, z; + const char * headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s, buffer); + if(strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s, buffer); + if(token[0] == 0) break; + if(strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if(!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s, buffer); + if(strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while(*token == ' ') ++token; + if(strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + if(height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large", "Very large image (corrupt?)"); + if(width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large", "Very large image (corrupt?)"); + + *x = width; + *y = height; + + if(comp) *comp = 3; + if(req_comp == 0) req_comp = 3; + + if(!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if(!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if(width < 8 || width >= 32768) { + // Read flat data + for(j = 0; j < height; ++j) { + for(i = 0; i < width; ++i) { + stbi_uc rgbe[4]; +main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } + else { + // Read RLE-encoded data + scanline = NULL; + + for(j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if(c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if(len != width) { + STBI_FREE(hdr_data); + STBI_FREE(scanline); + return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); + } + if(scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if(!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for(k = 0; k < 4; ++k) { + int nleft; + i = 0; + while((nleft = width - i) > 0) { + count = stbi__get8(s); + if(count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if((count == 0) || (count > nleft)) { + STBI_FREE(hdr_data); + STBI_FREE(scanline); + return stbi__errpf("corrupt", "bad RLE data in HDR"); + } + for(z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } + else { + // Dump + if((count == 0) || (count > nleft)) { + STBI_FREE(hdr_data); + STBI_FREE(scanline); + return stbi__errpf("corrupt", "bad RLE data in HDR"); + } + for(z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for(i = 0; i < width; ++i) + stbi__hdr_convert(hdr_data + (j * width + i) * req_comp, scanline + i * 4, req_comp); + } + if(scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context * s, int * x, int * y, int * comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char * token; + int valid = 0; + int dummy; + + if(!x) x = &dummy; + if(!y) y = &dummy; + if(!comp) comp = &dummy; + + if(stbi__hdr_test(s) == 0) { + stbi__rewind(s); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s, buffer); + if(token[0] == 0) break; + if(strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if(!valid) { + stbi__rewind(s); + return 0; + } + token = stbi__hdr_gettoken(s, buffer); + if(strncmp(token, "-Y ", 3)) { + stbi__rewind(s); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while(*token == ' ') ++token; + if(strncmp(token, "+X ", 3)) { + stbi__rewind(s); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context * s, int * x, int * y, int * comp) +{ + void * p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + if(p == NULL) { + stbi__rewind(s); + return 0; + } + if(x) *x = s->img_x; + if(y) *y = s->img_y; + if(comp) { + if(info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context * s, int * x, int * y, int * comp) +{ + int channelCount, dummy, depth; + if(!x) x = &dummy; + if(!y) y = &dummy; + if(!comp) comp = &dummy; + if(stbi__get32be(s) != 0x38425053) { + stbi__rewind(s); + return 0; + } + if(stbi__get16be(s) != 1) { + stbi__rewind(s); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if(channelCount < 0 || channelCount > 16) { + stbi__rewind(s); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if(depth != 8 && depth != 16) { + stbi__rewind(s); + return 0; + } + if(stbi__get16be(s) != 3) { + stbi__rewind(s); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context * s) +{ + int channelCount, depth; + if(stbi__get32be(s) != 0x38425053) { + stbi__rewind(s); + return 0; + } + if(stbi__get16be(s) != 1) { + stbi__rewind(s); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if(channelCount < 0 || channelCount > 16) { + stbi__rewind(s); + return 0; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if(depth != 16) { + stbi__rewind(s); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context * s, int * x, int * y, int * comp) +{ + int act_comp = 0, num_packets = 0, chained, dummy; + stbi__pic_packet packets[10]; + + if(!x) x = &dummy; + if(!y) y = &dummy; + if(!comp) comp = &dummy; + + if(!stbi__pic_is4(s, "\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if(stbi__at_eof(s)) { + stbi__rewind(s); + return 0; + } + if((*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet * packet; + + if(num_packets == sizeof(packets) / sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if(stbi__at_eof(s)) { + stbi__rewind(s); + return 0; + } + if(packet->size != 8) { + stbi__rewind(s); + return 0; + } + } while(chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context * s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if(p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + return 1; +} + +static void * stbi__pnm_load(stbi__context * s, int * x, int * y, int * comp, int req_comp, stbi__result_info * ri) +{ + stbi_uc * out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if(ri->bits_per_channel == 0) + return 0; + + if(s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + if(s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large", "Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if(comp) *comp = s->img_n; + + if(!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if(!out) return stbi__errpuc("outofmem", "Out of memory"); + if(!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } + + if(req_comp && req_comp != s->img_n) { + if(ri->bits_per_channel == 16) { + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); + } + else { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + } + if(out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context * s, char * c) +{ + for(;;) { + while(!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if(stbi__at_eof(s) || *c != '#') + break; + + while(!stbi__at_eof(s) && *c != '\n' && *c != '\r') + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context * s, char * c) +{ + int value = 0; + + while(!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value * 10 + (*c - '0'); + *c = (char) stbi__get8(s); + if((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); + } + + return value; +} + +static int stbi__pnm_info(stbi__context * s, int * x, int * y, int * comp) +{ + int maxv, dummy; + char c, p, t; + + if(!x) x = &dummy; + if(!y) y = &dummy; + if(!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if(p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + if(*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + if(*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if(maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if(maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context * s) +{ + if(stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#endif + +static int stbi__info_main(stbi__context * s, int * x, int * y, int * comp) +{ +#ifndef STBI_NO_JPEG + if(stbi__jpeg_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_PNG + if(stbi__png_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_GIF + if(stbi__gif_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_BMP + if(stbi__bmp_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_PSD + if(stbi__psd_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_PIC + if(stbi__pic_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_PNM + if(stbi__pnm_info(s, x, y, comp)) return 1; +#endif + +#ifndef STBI_NO_HDR + if(stbi__hdr_info(s, x, y, comp)) return 1; +#endif + + // test tga last because it's a crappy test! +#ifndef STBI_NO_TGA + if(stbi__tga_info(s, x, y, comp)) + return 1; +#endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context * s) +{ +#ifndef STBI_NO_PNG + if(stbi__png_is16(s)) return 1; +#endif + +#ifndef STBI_NO_PSD + if(stbi__psd_is16(s)) return 1; +#endif + +#ifndef STBI_NO_PNM + if(stbi__pnm_is16(s)) return 1; +#endif + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const * filename, int * x, int * y, int * comp) +{ + FILE * f = stbi__fopen(filename, "rb"); + int result; + if(!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE * f, int * x, int * y, int * comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s, x, y, comp); + fseek(f, pos, SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const * filename) +{ + FILE * f = stbi__fopen(filename, "rb"); + int result; + if(!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE * f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f, pos, SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const * buffer, int len, int * x, int * y, int * comp) +{ + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__info_main(&s, x, y, comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const * c, void * user, int * x, int * y, int * comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s, x, y, comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const * buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s, buffer, len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const * c, void * user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/inc/lvgl/src/libs/gstreamer/lv_gstreamer.c b/inc/lvgl/src/libs/gstreamer/lv_gstreamer.c new file mode 100644 index 0000000..5b56a00 --- /dev/null +++ b/inc/lvgl/src/libs/gstreamer/lv_gstreamer.c @@ -0,0 +1,685 @@ +/** + * @file lv_gstreamer.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_gstreamer_internal.h" + +#if LV_USE_GSTREAMER + +#include +#include +#include "../../core/lv_obj_class_private.h" +#include "../../misc/lv_event_private.h" + +/********************* + * DEFINES + *********************/ + +#define MY_CLASS (&lv_gstreamer_class) + + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + const char * factory; + const char * name; + GstElement ** store; +} lv_gstreamer_pipeline_element_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_gstreamer_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_gstreamer_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void on_decode_pad_added(GstElement * element, GstPad * pad, gpointer user_data); +static GstFlowReturn on_new_sample(GstElement * sink, gpointer user_data); +static void gstreamer_timer_cb(lv_timer_t * timer); +static lv_result_t gstreamer_poll_bus(lv_gstreamer_t * streamer); +static void gstreamer_update_frame(lv_gstreamer_t * streamer); +static lv_result_t gstreamer_make_and_add_to_pipeline(lv_gstreamer_t * streamer, + const lv_gstreamer_pipeline_element_t * elements, size_t element_count); +static lv_result_t gstreamer_send_state_changed(lv_gstreamer_t * streamer, lv_gstreamer_stream_state_t state); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_gstreamer_class = { + .constructor_cb = lv_gstreamer_constructor, + .destructor_cb = lv_gstreamer_destructor, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_gstreamer_t), + .base_class = &lv_image_class, + .name = "lv_gstreamer", +}; + +/********************** + * MACROS + **********************/ + +#if LV_COLOR_DEPTH == 16 + #define GST_FORMAT "RGB16" + #define IMAGE_FORMAT LV_COLOR_FORMAT_RGB565 +#elif LV_COLOR_DEPTH == 24 + #define GST_FORMAT "BGR" + #define IMAGE_FORMAT LV_COLOR_FORMAT_RGB888 +#elif LV_COLOR_DEPTH == 32 + #define GST_FORMAT "BGRA" + #define IMAGE_FORMAT LV_COLOR_FORMAT_ARGB8888 +#else + #error Unsupported LV_COLOR_DEPTH +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_gstreamer_create(lv_obj_t * parent) +{ + if(!gst_is_initialized()) { + gst_init(0, NULL); + } + + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + + LV_TRACE_OBJ_CREATE("end"); + return obj; +} + +lv_result_t lv_gstreamer_set_src(lv_obj_t * obj, const char * factory_name, const char * property, const char * source) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(factory_name); + + if(!obj || !factory_name) { + LV_LOG_WARN("Refusing to set source with invalid params. Obj: %p Factory Name: %s", (void *)obj, factory_name); + return LV_RESULT_INVALID; + } + + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + + if(streamer->pipeline) { + LV_LOG_WARN("LVGL doesn't allow modifying the GStreamer source. Create a new widget with a new src instead"); + return LV_RESULT_INVALID; + } + GstElement * pipeline = gst_pipeline_new("lv_gstreamer_pipeline"); + if(!pipeline) { + LV_LOG_ERROR("Failed to create gstreamer pipeline"); + return LV_RESULT_INVALID; + } + + GstElement * head = gst_element_factory_make(factory_name, "lv_gstreamer_source"); + if(!head) { + gst_object_unref(pipeline); + LV_LOG_ERROR("Failed to create source from factory '%s'", factory_name); + return LV_RESULT_INVALID; + } + + if(!gst_bin_add(GST_BIN(pipeline), head)) { + gst_object_unref(head); + gst_object_unref(pipeline); + LV_LOG_ERROR("Failed to add source element to pipeline"); + return LV_RESULT_INVALID; + } + + if(property != NULL && source != NULL) { + g_object_set(G_OBJECT(head), property, source, NULL); + } + + /* The uri decode source element will automatically handle parsing and decoding for us + * for other source types, we need to add a parser and a decoder ourselves element*/ + if(!lv_streq(LV_GSTREAMER_FACTORY_URI_DECODE, factory_name)) { + GstElement * decodebin = gst_element_factory_make("decodebin", "lv_gstreamer_decodebin"); + if(!decodebin) { + gst_object_unref(pipeline); + LV_LOG_ERROR("Failed to create decodebin element"); + return LV_RESULT_INVALID; + } + if(!gst_bin_add(GST_BIN(pipeline), decodebin)) { + gst_object_unref(decodebin); + gst_object_unref(pipeline); + LV_LOG_ERROR("Failed to add decodebin element to pipeline"); + return LV_RESULT_INVALID; + } + + if(!gst_element_link(head, decodebin)) { + gst_object_unref(pipeline); + LV_LOG_ERROR("Failed to link source with parsebin elements"); + return LV_RESULT_INVALID; + } + head = decodebin; + } + + /* At this point we don't yet know the input format + * Once the source starts receiving the data, it will create the necessary pads, + * i.e one pad for audio and one for video + * We add a callback so that we automatically connect to the data once it's figured out*/ + g_signal_connect(head, "pad-added", G_CALLBACK(on_decode_pad_added), streamer); + + streamer->pipeline = pipeline; + return LV_RESULT_OK; +} + +void lv_gstreamer_play(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(!obj) { + return; + } + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + if(!streamer->pipeline) { + LV_LOG_WARN("Cannot play: GStreamer pipeline not initialized"); + return; + } + GstStateChangeReturn ret = gst_element_set_state(streamer->pipeline, GST_STATE_PLAYING); + if(ret == GST_STATE_CHANGE_FAILURE) { + LV_LOG_ERROR("Unable to play pipeline"); + return; + } + gstreamer_send_state_changed(streamer, LV_GSTREAMER_STREAM_STATE_PLAY); +} + +void lv_gstreamer_pause(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(!obj) { + return; + } + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + if(!streamer->pipeline) { + LV_LOG_WARN("Cannot pause: GStreamer pipeline not initialized"); + return; + } + GstStateChangeReturn ret = gst_element_set_state(streamer->pipeline, GST_STATE_PAUSED); + + if(ret == GST_STATE_CHANGE_FAILURE) { + LV_LOG_ERROR("Unable to pause pipeline"); + return; + } + gstreamer_send_state_changed(streamer, LV_GSTREAMER_STREAM_STATE_PAUSE); +} + +void lv_gstreamer_stop(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(!obj) { + return; + } + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + if(!streamer->pipeline) { + LV_LOG_WARN("Cannot stop: GStreamer pipeline not initialized"); + return; + } + GstStateChangeReturn ret = gst_element_set_state(streamer->pipeline, GST_STATE_READY); + if(ret == GST_STATE_CHANGE_FAILURE) { + LV_LOG_ERROR("Unable to stop pipeline"); + return; + } + gstreamer_send_state_changed(streamer, LV_GSTREAMER_STREAM_STATE_STOP); +} +void lv_gstreamer_set_position(lv_obj_t * obj, uint32_t position) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(!obj) { + return; + } + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + if(!streamer->pipeline) { + LV_LOG_WARN("Cannot set position: GStreamer pipeline not initialized"); + return; + } + gint64 seek_position = (gint64)position * GST_MSECOND; + + if(!gst_element_seek_simple(streamer->pipeline, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, + seek_position)) { + LV_LOG_WARN("Seek operation failed"); + } +} + +uint32_t lv_gstreamer_get_duration(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + + if(!streamer->pipeline) { + return 0; + } + + gint64 duration; + if(gst_element_query_duration(streamer->pipeline, GST_FORMAT_TIME, &duration)) { + return (uint32_t)(duration / GST_MSECOND); + } + + return 0; +} + +uint32_t lv_gstreamer_get_position(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + + if(!streamer->pipeline) { + return 0; + } + + gint64 position; + if(gst_element_query_position(streamer->pipeline, GST_FORMAT_TIME, &position)) { + return (uint32_t)(position / GST_MSECOND); + } + + return 0; +} + +lv_gstreamer_state_t lv_gstreamer_get_state(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + + if(!streamer->pipeline) { + return LV_GSTREAMER_STATE_NULL; + } + + GstState state, pending; + GstStateChangeReturn ret = gst_element_get_state(streamer->pipeline, &state, &pending, 0); + + if(ret == GST_STATE_CHANGE_FAILURE) { + return LV_GSTREAMER_STATE_NULL; + } + + switch(state) { + case GST_STATE_NULL: + return LV_GSTREAMER_STATE_NULL; + case GST_STATE_READY: + return LV_GSTREAMER_STATE_READY; + case GST_STATE_PAUSED: + return LV_GSTREAMER_STATE_PAUSED; + case GST_STATE_PLAYING: + return LV_GSTREAMER_STATE_PLAYING; + default: + return LV_GSTREAMER_STATE_NULL; + } +} + +void lv_gstreamer_set_volume(lv_obj_t * obj, uint8_t volume) +{ + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + + if(!streamer->audio_volume) { + return; + } + + g_object_set(streamer->audio_volume, "volume", volume / 100.f, NULL); +} + +uint8_t lv_gstreamer_get_volume(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + + if(!streamer->audio_volume) { + return 0; + } + + gdouble volume; + g_object_get(streamer->audio_volume, "volume", &volume, NULL); + + return (uint8_t)(volume * 100.f); +} + +void lv_gstreamer_set_rate(lv_obj_t * obj, uint32_t rate) +{ + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + + if(!streamer->pipeline) { + return; + } + + gdouble gst_rate = (gdouble)rate / 256.0; + + gint64 current_pos; + + if(!gst_element_query_position(streamer->pipeline, GST_FORMAT_TIME, ¤t_pos)) { + LV_LOG_WARN("Failed to query current position which is required to set the stream rate"); + return; + } + + /* Perform the seek with new rate from the current position */ + if(!gst_element_seek(streamer->pipeline, gst_rate, + GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, + GST_SEEK_TYPE_SET, current_pos, + GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) { + LV_LOG_WARN("Failed to change stream rate"); + } +} + +lv_gstreamer_stream_state_t lv_gstreamer_get_stream_state(lv_event_t * e) +{ + if(!e || e->code != LV_EVENT_STATE_CHANGED) { + LV_LOG_WARN("Invalid event"); + return -1; + } + return *(lv_gstreamer_stream_state_t *)lv_event_get_param(e); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_gstreamer_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + lv_memzero(&streamer->frame, sizeof(streamer->frame)); + + streamer->gstreamer_timer = lv_timer_create(gstreamer_timer_cb, LV_DEF_REFR_PERIOD / 5, streamer); + LV_ASSERT_NULL(streamer->gstreamer_timer); + + streamer->frame_queue = g_async_queue_new(); + LV_ASSERT_NULL(streamer->frame_queue); + streamer->last_sample = NULL; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static lv_result_t gstreamer_poll_bus(lv_gstreamer_t * streamer) +{ + GstBus * bus = gst_element_get_bus(streamer->pipeline); + GstMessage * msg; + + while((msg = gst_bus_pop(bus)) != NULL) { + const GstMessageType message_type = GST_MESSAGE_TYPE(msg); + switch(message_type) { + case GST_MESSAGE_ERROR: { + GError * err; + gchar * debug; + gst_message_parse_error(msg, &err, &debug); + LV_LOG_ERROR("GStreamer error: %s", err->message); + g_error_free(err); + g_free(debug); + break; + } + case GST_MESSAGE_EOS: + if(gstreamer_send_state_changed(streamer, LV_GSTREAMER_STREAM_STATE_END) == LV_RESULT_INVALID) { + /* Object deleted inside event handler */ + gst_object_unref(bus); + gst_message_unref(msg); + return LV_RESULT_INVALID; + } + break; + case GST_MESSAGE_STATE_CHANGED: { + GstState old_state, new_state; + gst_message_parse_state_changed(msg, &old_state, &new_state, NULL); + LV_LOG_INFO("State changed: %s -> %s", gst_element_state_get_name(old_state), + gst_element_state_get_name(new_state)); + break; + } + default: + LV_LOG_TRACE("Received message %d", message_type); + break; + } + gst_message_unref(msg); + } + gst_object_unref(bus); + return LV_RESULT_OK; +} + +static void gstreamer_update_frame(lv_gstreamer_t * streamer) +{ + GstSample * sample = g_async_queue_try_pop(streamer->frame_queue); + + if(!sample) { + return; + } + + const bool first_frame = !streamer->is_video_info_valid; + if(first_frame) { + GstCaps * caps = gst_sample_get_caps(sample); + if(!caps || !gst_video_info_from_caps(&streamer->video_info, caps)) { + LV_LOG_ERROR("Failed to get video info from caps"); + gst_sample_unref(sample); + return; + } + streamer->is_video_info_valid = true; + } + + + GstBuffer * buffer = gst_sample_get_buffer(sample); + GstMapInfo map; + if(buffer && gst_buffer_map(buffer, &map, GST_MAP_READ)) { + if(streamer->last_buffer) { + gst_buffer_unmap(streamer->last_buffer, &streamer->last_map_info); + } + if(streamer->last_sample) { + gst_sample_unref(streamer->last_sample); + } + streamer->last_buffer = buffer; + streamer->last_map_info = map; + + streamer->last_sample = sample; + + streamer->frame = (lv_image_dsc_t) { + .data = map.data, + .data_size = map.size, + .header = { + .magic = LV_IMAGE_HEADER_MAGIC, + .cf = IMAGE_FORMAT, + .flags = LV_IMAGE_FLAGS_MODIFIABLE, + .h = GST_VIDEO_INFO_HEIGHT(&streamer->video_info), + .w = GST_VIDEO_INFO_WIDTH(&streamer->video_info), + .stride = GST_VIDEO_INFO_PLANE_STRIDE(&streamer->video_info, 0), + } + }; + lv_image_set_src((lv_obj_t *)streamer, &streamer->frame); + } + /* We send the event AFTER setting the image source so that users can query the + * resolution on this specific event callback */ + if(first_frame) { + if(gstreamer_send_state_changed(streamer, LV_GSTREAMER_STREAM_STATE_START) == LV_RESULT_INVALID) { + /* Object deleted inside event handler */ + return; + } + /*Send READY event for backwards compatibility with v9.4*/ + lv_obj_send_event((lv_obj_t *)streamer, LV_EVENT_READY, streamer); + } + +} +static void gstreamer_timer_cb(lv_timer_t * timer) +{ + lv_gstreamer_t * streamer = lv_timer_get_user_data(timer); + + if(!streamer->pipeline) { + return; + } + + if(gstreamer_poll_bus(streamer) == LV_RESULT_INVALID) { + return; + } + gstreamer_update_frame(streamer); +} + +static void lv_gstreamer_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_gstreamer_t * streamer = (lv_gstreamer_t *)obj; + + if(streamer->pipeline) { + gst_element_set_state(streamer->pipeline, GST_STATE_NULL); + gst_object_unref(streamer->pipeline); + } + if(streamer->last_buffer) { + gst_buffer_unmap(streamer->last_buffer, &streamer->last_map_info); + } + if(streamer->last_sample) { + gst_sample_unref(streamer->last_sample); + } + if(streamer->frame_queue) { + GstSample * sample; + while((sample = g_async_queue_try_pop(streamer->frame_queue)) != NULL) { + gst_sample_unref(sample); + } + g_async_queue_unref(streamer->frame_queue); + streamer->frame_queue = NULL; + } + lv_timer_delete(streamer->gstreamer_timer); +} + +static lv_result_t gstreamer_make_and_add_to_pipeline(lv_gstreamer_t * streamer, + const lv_gstreamer_pipeline_element_t * elements, size_t element_count) +{ + for(size_t i = 0; i < element_count; ++i) { + GstElement * el = gst_element_factory_make(elements[i].factory, elements[i].name); + if(!el) { + /* The previous elements were added to the pipeline so we don't need to unref them explicitly + * Unrefing the pipeline is enough and is done by caller*/ + LV_LOG_ERROR("Failed to create %s element", elements[i].name); + return LV_RESULT_INVALID; + } + *(elements[i].store) = el; + if(!gst_bin_add(GST_BIN(streamer->pipeline), el)) { + gst_object_unref(el); + LV_LOG_ERROR("Failed to add %s element to pipeline", elements[i].name); + return LV_RESULT_INVALID; + } + } + return LV_RESULT_OK; +} + +static void on_decode_pad_added(GstElement * element, GstPad * pad, gpointer user_data) +{ + LV_UNUSED(element); + lv_gstreamer_t * streamer = (lv_gstreamer_t *)user_data; + GstCaps * caps = gst_pad_get_current_caps(pad); + + GstStructure * structure = gst_caps_get_structure(caps, 0); + const gchar * name = gst_structure_get_name(structure); + + LV_LOG_TRACE("Pad discovered %s", name); + + if(g_str_has_prefix(name, "video/")) { + if(!streamer->video_convert) { + GstElement * video_app_sink; + GstElement * video_rate; + GstElement * video_queue; + const lv_gstreamer_pipeline_element_t elements[] = { + {"videoconvert", "lv_gstreamer_video_convert", &streamer->video_convert}, + {"videorate", "lv_gstreamer_video_rate", &video_rate}, + {"queue", "lv_gstreamer_video_queue", &video_queue}, + {"appsink", "lv_gstreamer_video_sink", &video_app_sink}, + }; + const size_t element_count = sizeof(elements) / sizeof(elements[0]); + if(gstreamer_make_and_add_to_pipeline(streamer, elements, element_count) != LV_RESULT_OK) { + goto exit; + } + + /* Here we set the fps we want the pipeline to produce and the color format + * This is achieved by the video_convert and video_rate elements that will automatically throttle and + * convert the image to the format we desire*/ + uint32_t target_fps = 1000 / LV_DEF_REFR_PERIOD; + char caps_str[128]; + lv_snprintf(caps_str, sizeof(caps_str), "video/x-raw,format=%s,framerate=%" LV_PRIu32 "/1", GST_FORMAT, target_fps); + + GstCaps * appsink_caps = gst_caps_from_string(caps_str); + g_object_set(G_OBJECT(video_app_sink), "emit-signals", TRUE, "sync", TRUE, "max-buffers", 1, "drop", TRUE, "caps", + appsink_caps, NULL); + gst_caps_unref(appsink_caps); + + if(!gst_element_link_many(streamer->video_convert, video_rate, video_queue, video_app_sink, NULL)) { + LV_LOG_ERROR("Failed to link video convert to sink"); + goto exit; + } + for(size_t i = 0; i < element_count; ++i) { + gst_element_sync_state_with_parent(*elements[i].store); + } + g_signal_connect(video_app_sink, "new-sample", G_CALLBACK(on_new_sample), streamer); + } + + GstPad * video_convert_sink_pad = gst_element_get_static_pad(streamer->video_convert, "sink"); + if(gst_pad_is_linked(video_convert_sink_pad)) { + LV_LOG_WARN("Received another video pad '%s' but our video pipeline is already linked - Ignoring", name); + } + else if(gst_pad_link(pad, video_convert_sink_pad) != GST_PAD_LINK_OK) { + LV_LOG_ERROR("Failed to link discovered pad '%s' to videoconvert", name); + } + gst_object_unref(video_convert_sink_pad); + } + else if(g_str_has_prefix(name, "audio/")) { + if(!streamer->audio_convert) { + GstElement * audio_resample; + GstElement * audio_sink; + const lv_gstreamer_pipeline_element_t elements[] = { + {"audioconvert", "lv_gstreamer_audio_convert", &streamer->audio_convert}, + {"volume", "lv_gstreamer_audio_volume", &streamer->audio_volume}, + {"audioresample", "lv_gstreamer_audio_resample", &audio_resample}, + {"autoaudiosink", "lv_gstreamer_audio_sink", &audio_sink}, + }; + const size_t element_count = sizeof(elements) / sizeof(elements[0]); + if(gstreamer_make_and_add_to_pipeline(streamer, elements, element_count) != LV_RESULT_OK) { + goto exit; + } + if(!gst_element_link_many(streamer->audio_convert, audio_resample, streamer->audio_volume, audio_sink, NULL)) { + LV_LOG_ERROR("Failed to link audio convert to sink"); + goto exit; + } + for(size_t i = 0; i < element_count; ++i) { + gst_element_sync_state_with_parent(*elements[i].store); + } + } + + GstPad * audio_convert_sink_pad = gst_element_get_static_pad(streamer->audio_convert, "sink"); + if(!gst_pad_is_linked(audio_convert_sink_pad)) { + if(gst_pad_link(pad, audio_convert_sink_pad) != GST_PAD_LINK_OK) { + LV_LOG_ERROR("Failed to link discovered pad '%s' to audioconvert", name); + } + } + else { + LV_LOG_WARN("Received another audio pad '%s' but our audio pipeline is already linked - Ignoring", name); + } + gst_object_unref(audio_convert_sink_pad); + } + +exit: + gst_caps_unref(caps); +} + +static GstFlowReturn on_new_sample(GstElement * sink, gpointer user_data) +{ + /* This function is called from a thread other than the main one so we can't call anything related to LVGL here + * Instead, we acquire the new sample (the new frame) and push it to the queue so that we can retrieve it from an LVGL timer + * Note that the pipeline spits out a new frame every LV_DEF_REFR_PERIOD as per the way it's set up so we shouldn't ever lose any + * frames with this method*/ + lv_gstreamer_t * streamer = (lv_gstreamer_t *)user_data; + GstSample * sample; + + g_signal_emit_by_name(sink, "pull-sample", &sample); + if(!sample) { + return GST_FLOW_OK; + } + + g_async_queue_push(streamer->frame_queue, sample); + return GST_FLOW_OK; +} + +static lv_result_t gstreamer_send_state_changed(lv_gstreamer_t * streamer, lv_gstreamer_stream_state_t state) +{ + return lv_obj_send_event((lv_obj_t *)streamer, LV_EVENT_STATE_CHANGED, &state); +} +#endif diff --git a/inc/lvgl/src/libs/gstreamer/lv_gstreamer.h b/inc/lvgl/src/libs/gstreamer/lv_gstreamer.h new file mode 100644 index 0000000..e7503ce --- /dev/null +++ b/inc/lvgl/src/libs/gstreamer/lv_gstreamer.h @@ -0,0 +1,199 @@ +/** + * @file lv_gstreamer.h + * + */ + +#ifndef LV_GSTREAMER_H +#define LV_GSTREAMER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_GSTREAMER +#include "../../core/lv_obj.h" + + +/********************* + * DEFINES + *********************/ + + +/* Using the `URI` "factory", we can specify various URI schemes as media sources including + * - local files (file://) + * - web streams (http://, https://) + * - RTSP streams (rtsp://) + * - UDP streams (udp://) + * and many others. + * GStreamer's uridecodebin automatically selects the appropriate + * source element and decoder based on the URI scheme and media format. */ +#define LV_GSTREAMER_FACTORY_URI_DECODE "uridecodebin" +#define LV_GSTREAMER_PROPERTY_URI_DECODE "uri" + +#define LV_GSTREAMER_FACTORY_FILE "filesrc" +#define LV_GSTREAMER_PROPERTY_FILE "location" + +#define LV_GSTREAMER_FACTORY_HTTP "souphttpsrc" +#define LV_GSTREAMER_PROPERTY_HTTP "location" + +#define LV_GSTREAMER_FACTORY_HTTPS "souphttpsrc" +#define LV_GSTREAMER_PROPERTY_HTTPS "location" + +#define LV_GSTREAMER_FACTORY_V4L2_CAMERA "v4l2src" +#define LV_GSTREAMER_PROPERTY_V4L2_CAMERA "device" + +#define LV_GSTREAMER_FACTORY_ALSA_AUDIO "alsasrc" +#define LV_GSTREAMER_PROPERTY_ALSA_AUDIO "device" + +#define LV_GSTREAMER_FACTORY_PULSE_AUDIO "pulsesrc" +#define LV_GSTREAMER_PROPERTY_PULSE_AUDIO "device" + +#define LV_GSTREAMER_FACTORY_TEST_AUDIO "audiotestsrc" +#define LV_GSTREAMER_PROPERTY_TEST_AUDIO NULL + +#define LV_GSTREAMER_FACTORY_TEST_VIDEO "videotestsrc" +#define LV_GSTREAMER_PROPERTY_TEST_VIDEO NULL + +#define LV_GSTREAMER_FACTORY_APP "appsrc" +#define LV_GSTREAMER_PROPERTY_APP NULL + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_GSTREAMER_STATE_NULL, + LV_GSTREAMER_STATE_READY, + LV_GSTREAMER_STATE_PAUSED, + LV_GSTREAMER_STATE_PLAYING +} lv_gstreamer_state_t; + +typedef enum { + LV_GSTREAMER_STREAM_STATE_START, + LV_GSTREAMER_STREAM_STATE_PLAY, + LV_GSTREAMER_STREAM_STATE_PAUSE, + LV_GSTREAMER_STREAM_STATE_STOP, + LV_GSTREAMER_STREAM_STATE_END +} lv_gstreamer_stream_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a gstreamer object + * @param parent pointer to an object, it will be the parent of the new gstreamer + * @return pointer to the created gstreamer + */ +lv_obj_t * lv_gstreamer_create(lv_obj_t * parent); + +/** + * Add a source to this gstreamer object + * @param gstreamer pointer to a gstreamer object + * @param factory_name the factory name for the source of this gstreamer object. + * for common factory names, check `LV_GSTREAMER_FACTORY_XXX` defines + * @param property the property name for the gstreamer source object + * for common properties, see `LV_GSTREAMER_PROPERTY_XXX` defines + * Passing NULL will create the source object but not set its source + * @param source the property value for the gstreamer source object + * Passing NULL will create the source object but not set its source + * @return LV_RESULT_OK if the source was correctly set else LV_RESULT_INVALID + */ +lv_result_t lv_gstreamer_set_src(lv_obj_t * gstreamer, const char * factory_name, const char * property, + const char * source); + +/** + * Play this gstreamer + * @param gstreamer pointer to a gstreamer object + */ +void lv_gstreamer_play(lv_obj_t * gstreamer); + +/** + * Pause this gstreamer + * @param gstreamer pointer to a gstreamer object + */ +void lv_gstreamer_pause(lv_obj_t * gstreamer); + +/** + * Stop this gstreamer + * @param gstreamer pointer to a gstreamer object + */ +void lv_gstreamer_stop(lv_obj_t * gstreamer); + +/** + * Seek a position in this gstreamer + * @param gstreamer pointer to a gstreamer object + * @param position position to seek to + */ +void lv_gstreamer_set_position(lv_obj_t * gstreamer, uint32_t position); + +/** + * Get the duration of this gstreamer + * @param gstreamer pointer to a gstreamer object + * @return the duration (in ms) of the gstreamer object + */ +uint32_t lv_gstreamer_get_duration(lv_obj_t * gstreamer); + +/** + * Get the position of this gstreamer + * @param gstreamer pointer to a gstreamer object + * @return the position (in ms) of the gstreamer object + */ +uint32_t lv_gstreamer_get_position(lv_obj_t * gstreamer); + +/** + * Get the state of this gstreamer + * @param gstreamer pointer to a gstreamer object + */ +lv_gstreamer_state_t lv_gstreamer_get_state(lv_obj_t * gstreamer); + +/** + * Set the volume of this gstreamer + * @param gstreamer pointer to a gstreamer object + * @param volume the value to set in the range [0..100]. Higher values are clamped + */ +void lv_gstreamer_set_volume(lv_obj_t * gstreamer, uint8_t volume); + +/** + * Get the volume of this gstreamer + * @param gstreamer pointer to a gstreamer object + * @return the volume for this gstreamer + */ +uint8_t lv_gstreamer_get_volume(lv_obj_t * gstreamer); + +/** + * Set the speed rate of this gstreamer + * @param gstreamer pointer to a gstreamer object + * @param rate the rate factor. Example values: + * - 256: 1x + * - <256: slow down + * - >256: speed up + * - 128: 0.5x + * - 512: 2x + */ +void lv_gstreamer_set_rate(lv_obj_t * gstreamer, uint32_t rate); + +/** + * Retrieve the stream state from a STATE_CHANGED event callback + * @param e pointer to the event + * @return the stream state or -1 if `e` is invalid (i.e. NULL or does not match expected event) + */ +lv_gstreamer_stream_state_t lv_gstreamer_get_stream_state(lv_event_t * e); + + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GSTREAMER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GSTREAMER_H*/ diff --git a/inc/lvgl/src/libs/gstreamer/lv_gstreamer_internal.h b/inc/lvgl/src/libs/gstreamer/lv_gstreamer_internal.h new file mode 100644 index 0000000..2c8c123 --- /dev/null +++ b/inc/lvgl/src/libs/gstreamer/lv_gstreamer_internal.h @@ -0,0 +1,78 @@ +/** + * @file lv_gstreamer_internal.h + * + */ + +#ifndef LV_GSTREAMER_INTERNAL_H +#define LV_GSTREAMER_INTERNAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GSTREAMER + +#include +#include + +#include "../../widgets/image/lv_image_private.h" + +#include "lv_gstreamer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_gstreamer_t { + lv_image_t image; + lv_image_dsc_t frame; + GstVideoInfo video_info; + GstMapInfo last_map_info; + GstBuffer * last_buffer; + GstSample * last_sample; + GstElement * pipeline; + GstElement * audio_convert; + GstElement * video_convert; + GstElement * audio_volume; + lv_timer_t * gstreamer_timer; + GAsyncQueue * frame_queue; + bool is_video_info_valid; +}; + +typedef struct { + uint8_t * frame_data; + uint32_t width; + uint32_t height; + uint32_t stride; + size_t data_size; +} frame_data_t; + +typedef struct _lv_gstreamer_t lv_gstreamer_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_gstreamer_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_GSTREAMER != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GSTREAMER_INTERNAL_H*/ diff --git a/inc/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c b/inc/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c new file mode 100644 index 0000000..f16fa04 --- /dev/null +++ b/inc/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c @@ -0,0 +1,644 @@ +/** + * @file lv_libjpeg_turbo.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_image_decoder_private.h" +#include "../../../lvgl.h" +#if LV_USE_LIBJPEG_TURBO + +#include "lv_libjpeg_turbo.h" +#include +#include +#include +#include +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "JPEG_TURBO" + +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +#define JPEG_PIXEL_SIZE 3 /* RGB888 */ +#define JPEG_SIGNATURE 0xFFD8FF +#define IS_JPEG_SIGNATURE(x) (((x) & 0x00FFFFFF) == JPEG_SIGNATURE) +#define ORIENTATION_TAG 0x112 /* Exif tag for orientation */ +#define APP1_MARKER JPEG_APP0 + 1 /* APP1 Marker code https://www.media.mit.edu/pia/Research/deepview/exif.html */ +#define MARKER_DATA_LIMIT 0xFFFF /* APP1 Marker limit */ + +/********************** + * TYPEDEFS + **********************/ +/** +* according to the Exif specification(http://www.cipa.jp/std/documents/e/DC-008-Translation-2019-E.pdf) +* Relationship between image data and orientation on a display screen according to an orientation tag +*/ +typedef enum { + /* Orientation = 0 is created when the image data in the Exif is not rotated */ + IMAGE_CLOCKWISE_NONE = 0, + /* Orientation = 1 is created when Oth row of the coded image data stored in the Exif image file + * and the visual top of the display screen, and Oth column and visual left, will each be matched for display + */ + IMAGE_CLOCKWISE_0 = 1, + /* Orientation = 2 is equivalent to an arrangement that is reversed Orientation = 1 horizontally */ + IMAGE_FLIP_HOR = 2, + /* Orientation = 3 is equivalent to an arrangement that is turned Orientation = 6 90 degrees clockwise */ + IMAGE_CLOCKWISE_180 = 3, + /* Orientation = 4 is equivalent to an arrangement that is reversed Orientation = 3 horizontally */ + IMAGE_FLIP_VER = 4, + /* Orientation = 5 is equivalent to an arrangement that is reversed Orientation = 6 horizontally */ + IMAGE_TRANSPOSE = 5, + /* Orientation = 6 is equivalent to an arrangement that is turned Orientation = 1 90 degrees clockwise */ + IMAGE_CLOCKWISE_90 = 6, + /* Orientation = 7 is equivalent to an arrangement that is reversed Orientation = 8 horizontally */ + IMAGE_TRANSVERSE = 7, + /* Orientation = 8 is equivalent to an arrangement that is turned Orientation = 3 90 degrees clockwise */ + IMAGE_CLOCKWISE_270 = 8, +} image_orientation_t; + +typedef struct error_mgr_s { + struct jpeg_error_mgr pub; + jmp_buf jb; +} error_mgr_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void convert_size_with_orientation(image_orientation_t image_orientation, uint32_t * width, uint32_t * height); +static lv_draw_buf_t * decode_jpeg_file(const char * filename); +static bool get_jpeg_head_info(const char * filename, uint32_t * width, uint32_t * height); +static bool get_jpeg_size(uint8_t * data, uint32_t data_size, uint32_t * width, uint32_t * height); +static image_orientation_t get_jpeg_direction(uint8_t * data, uint32_t data_size); +static inline void process_buffer_orientation(image_orientation_t op, uint8_t * cur_pos, lv_image_header_t * header, + uint32_t line_index, uint8_t * buffer, uint32_t buf_stride); +static image_orientation_t jpeg_markers_reader(struct jpeg_decompress_struct * cinfo); +static void jpeg_cmyk_to_bgrx(uint8_t * cmyk_data, uint32_t pixel_count); +static void error_exit(j_common_ptr cinfo); +/********************** + * STATIC VARIABLES + **********************/ +const int JPEG_EXIF = 0x45786966; /* Exif data structure tag */ +const int JPEG_BIG_ENDIAN_TAG = 0x4d4d; +const int JPEG_LITTLE_ENDIAN_TAG = 0x4949; + +/********************** + * MACROS + **********************/ +#define TRANS_32_VALUE(big_endian, data) big_endian ? \ + ((*(data) << 24) | (*((data) + 1) << 16) | (*((data) + 2) << 8) | *((data) + 3)) : \ + (*(data) | (*((data) + 1) << 8) | (*((data) + 2) << 16) | (*((data) + 3) << 24)) +#define TRANS_16_VALUE(big_endian, data) big_endian ? \ + ((*(data) << 8) | *((data) + 1)) : (*(data) | (*((data) + 1) << 8)) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register the JPEG decoder functions in LVGL + */ +void lv_libjpeg_turbo_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_close_cb(dec, decoder_close); + + dec->name = DECODER_NAME; +} + +void lv_libjpeg_turbo_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a JPEG image + * @param dsc image descriptor containing the source and type of the image and other info. + * @param header store the info here + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info + */ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + LV_UNUSED(decoder); /*Unused*/ + lv_image_src_t src_type = dsc->src_type; /*Get the source type*/ + + /*If it's a JPEG file...*/ + if(src_type == LV_IMAGE_SRC_FILE) { + const char * src = dsc->src; + uint32_t jpg_signature = 0; + uint32_t rn; + lv_fs_read(&dsc->file, &jpg_signature, sizeof(jpg_signature), &rn); + + if(rn != sizeof(jpg_signature)) { + LV_LOG_WARN("file: %s signature len = %" LV_PRIu32 " error", src, rn); + return LV_RESULT_INVALID; + } + + const char * ext = lv_fs_get_ext(src); + bool is_jpeg_ext = (lv_strcmp(ext, "jpg") == 0) + || (lv_strcmp(ext, "jpeg") == 0); + + if(!IS_JPEG_SIGNATURE(jpg_signature)) { + if(is_jpeg_ext) { + LV_LOG_WARN("file: %s signature = 0X%" LV_PRIX32 " error", src, jpg_signature); + } + return LV_RESULT_INVALID; + } + + uint32_t width; + uint32_t height; + + if(!get_jpeg_head_info(src, &width, &height)) { + return LV_RESULT_INVALID; + } + + /*Save the data in the header*/ + header->cf = LV_COLOR_FORMAT_RGB888; + header->w = width; + header->h = height; + + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ +} + +/** + * Open a JPEG image and return the decided image + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + /*If it's a JPEG file...*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + lv_draw_buf_t * decoded = decode_jpeg_file(fn); + if(decoded == NULL) { + LV_LOG_WARN("decode jpeg file failed"); + return LV_RESULT_INVALID; + } + + dsc->decoded = decoded; + + if(dsc->args.no_cache) return LV_RESULT_OK; + + /*If the image cache is disabled, just return the decoded image*/ + if(!lv_image_cache_is_enabled()) return LV_RESULT_OK; + + /*Add the decoded image to the cache*/ + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); + + if(entry == NULL) { + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; + return LV_RESULT_OK; /*If not returned earlier then it failed*/ + } + + return LV_RESULT_INVALID; /*If not returned earlier then it failed*/ +} + +/** + * Free the allocated resources + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + if(dsc->args.no_cache || + !lv_image_cache_is_enabled()) lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); +} + +static void convert_size_with_orientation(image_orientation_t image_orientation, uint32_t * width, uint32_t * height) +{ + if(image_orientation == IMAGE_CLOCKWISE_NONE || image_orientation == IMAGE_CLOCKWISE_0 + || image_orientation == IMAGE_CLOCKWISE_180 || image_orientation == IMAGE_FLIP_VER || + image_orientation == IMAGE_FLIP_HOR) { + return; + } + + uint32_t tmp = *width; + *width = *height; + *height = tmp; +} + +static lv_draw_buf_t * decode_jpeg_file(const char * filename) +{ + /* This struct contains the JPEG decompression parameters and pointers to + * working space (which is allocated as needed by the JPEG library). + */ + struct jpeg_decompress_struct cinfo; + /* We use our private extension JPEG error handler. + * Note that this struct must live as long as the main JPEG parameter + * struct, to avoid dangling-pointer problems. + */ + error_mgr_t jerr; + + /* More stuff */ + JSAMPARRAY buffer; /* Output row buffer */ + + uint32_t row_stride; /* physical row width in output buffer */ + + lv_draw_buf_t * decoded = NULL; + + /* In this example we want to open the input file before doing anything else, + * so that the setjmp() error recovery below can assume the file is open. + * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that + * requires it in order to read binary files. + */ + + uint32_t data_size; + uint8_t * data = lv_fs_load_with_alloc(filename, &data_size); + if(data == NULL) { + LV_LOG_WARN("can't load file %s", filename); + return NULL; + } + + /* read jpeg exif orientation */ + image_orientation_t image_orientation = get_jpeg_direction(data, data_size); + + /* allocate and initialize JPEG decompression object */ + + /* We set up the normal JPEG error routines, then override error_exit. */ + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = error_exit; + /* Establish the setjmp return context for my_error_exit to use. */ + if(setjmp(jerr.jb)) { + LV_LOG_WARN("decoding error"); + if(decoded) { + lv_draw_buf_destroy(decoded); + } + + /* If we get here, the JPEG code has signaled an error. + * We need to clean up the JPEG object, close the input file, and return. + */ + jpeg_destroy_decompress(&cinfo); + lv_free(data); + return NULL; + } + + /* Now we can initialize the JPEG decompression object. */ + jpeg_create_decompress(&cinfo); + + /* specify data source (eg, a file or buffer) */ + jpeg_mem_src(&cinfo, data, data_size); + + /* read file parameters with jpeg_read_header() */ + jpeg_read_header(&cinfo, TRUE); + + /* We can ignore the return value from jpeg_read_header since + * (a) suspension is not possible with the stdio data source, and + * (b) we passed TRUE to reject a tables-only JPEG file as an error. + * See libjpeg.doc for more info. + */ + + /* set parameters for decompression */ + if(cinfo.jpeg_color_space == JCS_CMYK || cinfo.jpeg_color_space == JCS_YCCK) { + cinfo.out_color_space = JCS_CMYK; + } + else { + cinfo.out_color_space = JCS_EXT_BGR; + } + + /* In this example, we don't need to change any of the defaults set by + * jpeg_read_header(), so we do nothing here. + */ + + /* Start decompressor */ + jpeg_start_decompress(&cinfo); + + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* We may need to do some setup of our own at this point before reading + * the data. After jpeg_start_decompress() we have the correct scaled + * output image dimensions available, as well as the output colormap + * if we asked for color quantization. + * In this example, we need to make an output work buffer of the right size. + */ + /* JSAMPLEs per row in output buffer */ + row_stride = cinfo.output_width * cinfo.output_components; + /* Make a one-row-high sample array that will go away when done with image */ + buffer = (*cinfo.mem->alloc_sarray) + ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); + + uint32_t width = cinfo.output_width; + uint32_t height = cinfo.output_height; + convert_size_with_orientation(image_orientation, &width, &height); + + lv_image_header_t image_header = { 0 }; + image_header.w = width; + image_header.h = height; + image_header.stride = row_stride; + + lv_color_format_t fm = LV_COLOR_FORMAT_RGB888; + if(cinfo.out_color_space == JCS_CMYK) { + fm = LV_COLOR_FORMAT_XRGB8888; + } + + /* Allocate the decoded draw buffer */ + decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, width, height, fm, LV_STRIDE_AUTO); + if(decoded != NULL) { + uint32_t line_index = 0; + /* while (scan lines remain to be read) */ + /* jpeg_read_scanlines(...); */ + + /* Here we use the library's state variable cinfo.output_scanline as the + * loop counter, so that we don't have to keep track ourselves. + */ + while(cinfo.output_scanline < cinfo.output_height) { + /* jpeg_read_scanlines expects an array of pointers to scanlines. + * Here the array is only one element long, but you could ask for + * more than one scanline at a time if that's more convenient. + */ + jpeg_read_scanlines(&cinfo, buffer, 1); + + if(cinfo.out_color_space == JCS_CMYK) { + jpeg_cmyk_to_bgrx(buffer[0], decoded->header.w); + } + + /* Assume put_scanline_someplace wants a pointer and sample count. */ + process_buffer_orientation(image_orientation, decoded->data, &image_header, line_index, buffer[0], + decoded->header.stride); + line_index++; + } + } + + /* Finish decompression */ + + jpeg_finish_decompress(&cinfo); + + /* We can ignore the return value since suspension is not possible + * with the stdio data source. + */ + + /* Release JPEG decompression object */ + + /* This is an important step since it will release a good deal of memory. */ + jpeg_destroy_decompress(&cinfo); + + /* After finish_decompress, we can close the input file. + * Here we postpone it until after no more JPEG errors are possible, + * so as to simplify the setjmp error logic above. (Actually, I don't + * think that jpeg_destroy can do an error exit, but why assume anything...) + */ + lv_free(data); + + return decoded; +} + +static bool get_jpeg_head_info(const char * filename, uint32_t * width, uint32_t * height) +{ + uint8_t * data = NULL; + uint32_t data_size; + data = lv_fs_load_with_alloc(filename, &data_size); + if(data == NULL) { + return false; + } + + if(!get_jpeg_size(data, data_size, width, height)) { + LV_LOG_WARN("read jpeg size failed."); + } + + lv_free(data); + + return JPEG_HEADER_OK; +} + +static void jpeg_decompress_prepare(struct jpeg_decompress_struct * cinfo, uint8_t * data, uint32_t data_size) +{ + jpeg_create_decompress(cinfo); + jpeg_mem_src(cinfo, data, data_size); + jpeg_save_markers(cinfo, APP1_MARKER, MARKER_DATA_LIMIT); +} + +static bool get_jpeg_size(uint8_t * data, uint32_t data_size, uint32_t * width, uint32_t * height) +{ + struct jpeg_decompress_struct cinfo; + error_mgr_t jerr; + + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = error_exit; + + if(setjmp(jerr.jb)) { + LV_LOG_WARN("read jpeg head failed"); + jpeg_destroy_decompress(&cinfo); + return false; + } + + /* jpeg_create_decompress */ + jpeg_decompress_prepare(&cinfo, data, data_size); + + int ret = jpeg_read_header(&cinfo, TRUE); + if(ret != JPEG_HEADER_OK) { + LV_LOG_WARN("read jpeg header failed: %d", ret); + jpeg_destroy_decompress(&cinfo); + return false; + } + + /* read file exif orientation */ + image_orientation_t op = jpeg_markers_reader(&cinfo); + + *width = cinfo.image_width; + *height = cinfo.image_height; + convert_size_with_orientation(op, width, height); + + jpeg_destroy_decompress(&cinfo); + + return true; +} + +static image_orientation_t get_jpeg_direction(uint8_t * data, uint32_t data_size) +{ + image_orientation_t res = IMAGE_CLOCKWISE_NONE; + struct jpeg_decompress_struct cinfo; + error_mgr_t jerr; + + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = error_exit; + + if(setjmp(jerr.jb)) { + LV_LOG_WARN("read jpeg orientation failed"); + jpeg_destroy_decompress(&cinfo); + return res; + } + /* jpeg_create_decompress */ + jpeg_decompress_prepare(&cinfo, data, data_size); + /* read file exif orientation */ + res = jpeg_markers_reader(&cinfo); + + jpeg_destroy_decompress(&cinfo); + + LV_LOG_INFO("read jpeg orientation data : %d", res); + + return res; +} + +static inline void process_buffer_orientation(image_orientation_t op, uint8_t * cur_pos, lv_image_header_t * header, + uint32_t line_index, uint8_t * buffer, uint32_t buf_stride) +{ + uint32_t dst_index = 0; + switch(op) { + case IMAGE_CLOCKWISE_NONE: + case IMAGE_CLOCKWISE_0: + lv_memcpy(cur_pos + line_index * buf_stride, buffer, header->stride); + break; + case IMAGE_CLOCKWISE_90: + for(uint32_t x = 0; x < header->h; x++) { + dst_index = x * buf_stride + (header->w - line_index - 1) * JPEG_PIXEL_SIZE; + lv_memcpy(cur_pos + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); + } + break; + case IMAGE_CLOCKWISE_180: + for(uint32_t x = 0; x < header->w; x++) { + dst_index = (header->h - line_index - 1) * buf_stride + x * JPEG_PIXEL_SIZE; + lv_memcpy(cur_pos + dst_index, buffer + (header->w - x - 1) * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); + } + break; + case IMAGE_CLOCKWISE_270: + for(uint32_t x = 0; x < header->h; x++) { + dst_index = (header->h - x - 1) * buf_stride + line_index * JPEG_PIXEL_SIZE; + lv_memcpy(cur_pos + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); + } + break; + case IMAGE_FLIP_VER: + dst_index = (header->h - line_index - 1) * buf_stride; + lv_memcpy(cur_pos + dst_index, buffer, header->stride); + break; + case IMAGE_FLIP_HOR: + for(uint32_t x = 0; x < header->w; x++) { + dst_index = line_index * buf_stride + (header->w - x - 1) * JPEG_PIXEL_SIZE; + lv_memcpy(cur_pos + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); + } + break; + case IMAGE_TRANSPOSE: + for(uint32_t x = 0; x < header->h; x++) { + dst_index = x * buf_stride + line_index * JPEG_PIXEL_SIZE; + lv_memcpy(cur_pos + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); + } + break; + case IMAGE_TRANSVERSE: + for(uint32_t x = 0; x < header->h; x++) { + dst_index = (header->h - x - 1) * buf_stride + (header->w - line_index - 1) * JPEG_PIXEL_SIZE; + lv_memcpy(cur_pos + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE); + } + break; + default: + lv_memcpy(cur_pos + line_index * buf_stride, buffer, header->stride); + break; + } +} + +static image_orientation_t jpeg_markers_reader(struct jpeg_decompress_struct * cinfo) +{ + image_orientation_t res = IMAGE_CLOCKWISE_NONE; + + if(cinfo == NULL || cinfo->marker == NULL) { + return res; + } + + cinfo->marker->read_markers(cinfo); + + jpeg_saved_marker_ptr marker = cinfo->marker_list; + while(marker != NULL) { + if(marker->marker == APP1_MARKER) { + JOCTET FAR * app1_data = marker->data; + if(TRANS_32_VALUE(true, app1_data) == JPEG_EXIF) { + uint16_t endian_tag = TRANS_16_VALUE(true, app1_data + 4 + 2); + if(!(endian_tag == JPEG_LITTLE_ENDIAN_TAG || endian_tag == JPEG_BIG_ENDIAN_TAG)) { + return res; + } + bool is_big_endian = endian_tag == JPEG_BIG_ENDIAN_TAG; + /* first ifd offset addr : 4bytes(Exif) + 2bytes(0x00) + 2bytes(align) + 2bytes(tag mark) */ + unsigned int offset = TRANS_32_VALUE(is_big_endian, app1_data + 8 + 2); + /* ifd base : 4bytes(Exif) + 2bytes(0x00) */ + unsigned char * ifd = 0; + do { + /* ifd start: 4bytes(Exif) + 2bytes(0x00) + offset value(2bytes(align) + 2bytes(tag mark) + 4bytes(offset size)) */ + unsigned int entry_offset = 4 + 2 + offset + 2; + if(entry_offset >= marker->data_length) { + return res; + } + ifd = app1_data + entry_offset; + unsigned short num_entries = TRANS_16_VALUE(is_big_endian, ifd - 2); + if(entry_offset + num_entries * 12 >= marker->data_length) { + return res; + } + for(int i = 0; i < num_entries; i++) { + unsigned short tag = TRANS_16_VALUE(is_big_endian, ifd); + if(tag == ORIENTATION_TAG) { + /* ifd entry: 12bytes = 2bytes(tag number) + 2bytes(kind of data) + 4bytes(number of components) + 4bytes(data) + * orientation kind(0x03) of data is unsigned short */ + uint32_t dirc = TRANS_16_VALUE(is_big_endian, ifd + 2 + 2 + 4); + res = (dirc >= IMAGE_CLOCKWISE_0 && dirc <= IMAGE_CLOCKWISE_270) ? (image_orientation_t)dirc : IMAGE_CLOCKWISE_NONE; + } + ifd += 12; + } + offset = TRANS_32_VALUE(is_big_endian, ifd); + } while(offset != 0); + } + break; + } + marker = marker->next; + } + + return res; +} + +static void jpeg_cmyk_to_bgrx(uint8_t * cmyk_data, uint32_t pixel_count) +{ + uint8_t * ptr = cmyk_data; + for(uint32_t i = 0; i < pixel_count; i++) { + uint8_t c = 255 - ptr[0]; + uint8_t m = 255 - ptr[1]; + uint8_t y = 255 - ptr[2]; + uint8_t k = 255 - ptr[3]; + + uint16_t inv_k = 255 - k; + ptr[0] = (uint8_t)(((inv_k * (255 - y)) + 128) / 255); + ptr[1] = (uint8_t)(((inv_k * (255 - m)) + 128) / 255); + ptr[2] = (uint8_t)(((inv_k * (255 - c)) + 128) / 255); + ptr[3] = 255; + + ptr += 4; + } +} + +static void error_exit(j_common_ptr cinfo) +{ + error_mgr_t * myerr = (error_mgr_t *)cinfo->err; + (*cinfo->err->output_message)(cinfo); + longjmp(myerr->jb, 1); +} + +#endif /*LV_USE_LIBJPEG_TURBO*/ diff --git a/inc/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h b/inc/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h new file mode 100644 index 0000000..177c83a --- /dev/null +++ b/inc/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h @@ -0,0 +1,48 @@ +/** + * @file lv_libjpeg_turbo.h + * + */ + +#ifndef LV_LIBJPEG_TURBO_H +#define LV_LIBJPEG_TURBO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_LIBJPEG_TURBO + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register the JPEG-Turbo decoder functions in LVGL + */ +void lv_libjpeg_turbo_init(void); + +void lv_libjpeg_turbo_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LIBJPEG_TURBO*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_LIBJPEG_TURBO_H*/ diff --git a/inc/lvgl/src/libs/libpng/lv_libpng.c b/inc/lvgl/src/libs/libpng/lv_libpng.c new file mode 100644 index 0000000..a2dcfad --- /dev/null +++ b/inc/lvgl/src/libs/libpng/lv_libpng.c @@ -0,0 +1,294 @@ +/** + * @file lv_libpng.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_image_decoder_private.h" +#include "../../../lvgl.h" +#if LV_USE_LIBPNG + +#include "lv_libpng.h" +#include +#include +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "PNG" + +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static lv_draw_buf_t * decode_png(lv_image_decoder_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_libpng_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_close_cb(dec, decoder_close); + + dec->name = DECODER_NAME; +} + +void lv_libpng_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a PNG image + * @param dsc can be file name or pointer to a C array + * @param header store the info here + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info + */ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_image_src_t src_type = dsc->src_type; /*Get the source type*/ + + if(src_type == LV_IMAGE_SRC_FILE || src_type == LV_IMAGE_SRC_VARIABLE) { + uint32_t * size; + static const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; + uint8_t buf[24]; + + /*If it's a PNG file...*/ + if(src_type == LV_IMAGE_SRC_FILE) { + /* Read the width and height from the file. They have a constant location: + * [16..19]: width + * [20..23]: height + */ + uint32_t rn; + lv_fs_read(&dsc->file, buf, sizeof(buf), &rn); + + if(rn != sizeof(buf)) return LV_RESULT_INVALID; + + if(lv_memcmp(buf, magic, sizeof(magic)) != 0) return LV_RESULT_INVALID; + + size = (uint32_t *)&buf[16]; + } + /*If it's a PNG file in a C array...*/ + else { + const lv_image_dsc_t * img_dsc = dsc->src; + const uint32_t data_size = img_dsc->data_size; + size = ((uint32_t *)img_dsc->data) + 4; + + if(data_size < sizeof(magic)) return LV_RESULT_INVALID; + if(lv_memcmp(img_dsc->data, magic, sizeof(magic)) != 0) return LV_RESULT_INVALID; + } + + /*Save the data in the header*/ + header->cf = LV_COLOR_FORMAT_ARGB8888; + /*The width and height are stored in Big endian format so convert them to little endian*/ + header->w = (int32_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); + header->h = (int32_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); + + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ +} + +/** + * Open a PNG image and return the decoded image + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_draw_buf_t * decoded; + decoded = decode_png(dsc); + + if(decoded == NULL) { + return LV_RESULT_INVALID; + } + + lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); + if(adjusted == NULL) { + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + /*The adjusted draw buffer is newly allocated.*/ + if(adjusted != decoded) { + lv_draw_buf_destroy(decoded); + decoded = adjusted; + } + + dsc->decoded = decoded; + + if(dsc->args.no_cache) { + return LV_RESULT_OK; + } + + /*If the image cache is disabled, just return the decoded image*/ + if(!lv_image_cache_is_enabled()) { + return LV_RESULT_OK; + } + + /*Add the decoded image to the cache*/ + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); + + if(entry == NULL) { + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; + + return LV_RESULT_OK; /*The image is fully decoded. Return with its pointer*/ +} + +/** + * Free the allocated resources + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + if(dsc->args.no_cache || + !lv_image_cache_is_enabled()) lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); +} + +static lv_draw_buf_t * decode_png(lv_image_decoder_dsc_t * dsc) +{ + LV_PROFILER_DECODER_BEGIN; + int ret; + uint8_t * png_data; + uint32_t png_data_size; + /*Prepare png_image*/ + png_image image; + lv_memzero(&image, sizeof(image)); + image.version = PNG_IMAGE_VERSION; + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + png_data = lv_fs_load_with_alloc((const char *)dsc->src, &png_data_size); + if(png_data == NULL) { + LV_LOG_WARN("can't load file: %s", (const char *)dsc->src); + LV_PROFILER_DECODER_END; + return NULL; + } + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = dsc->src; + png_data = (uint8_t *)img_dsc->data; + png_data_size = img_dsc->data_size; + } + else { + LV_PROFILER_DECODER_END; + return NULL; + } + + /*Ready to read file*/ + LV_PROFILER_DECODER_BEGIN_TAG("png_image_begin_read_from_memory"); + ret = png_image_begin_read_from_memory(&image, png_data, png_data_size); + LV_PROFILER_DECODER_END_TAG("png_image_begin_read_from_memory"); + if(!ret) { + LV_LOG_ERROR("png read failed: %d", ret); + if(dsc->src_type == LV_IMAGE_SRC_FILE) + lv_free(png_data); + LV_PROFILER_DECODER_END; + return NULL; + } + + lv_color_format_t cf; + if(dsc->args.use_indexed && (image.format & PNG_FORMAT_FLAG_COLORMAP)) { + cf = LV_COLOR_FORMAT_I8; + image.format = PNG_FORMAT_BGRA_COLORMAP; + } + else { + cf = LV_COLOR_FORMAT_ARGB8888; + image.format = PNG_FORMAT_BGRA; + } + + /*Alloc image buffer*/ + lv_draw_buf_t * decoded; + decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, image.width, image.height, cf, LV_STRIDE_AUTO); + if(decoded == NULL) { + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + LV_LOG_ERROR("alloc PNG_IMAGE_SIZE(%" LV_PRIu32 ") failed: %s", (uint32_t)PNG_IMAGE_SIZE(image), + (const char *)dsc->src); + lv_free(png_data); + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) + LV_LOG_ERROR("alloc PNG_IMAGE_SIZE(%" LV_PRIu32 ")", (uint32_t)PNG_IMAGE_SIZE(image)); + + LV_PROFILER_DECODER_BEGIN_TAG("png_image_free"); + png_image_free(&image); + LV_PROFILER_DECODER_END_TAG("png_image_free"); + LV_PROFILER_DECODER_END; + return NULL; + } + + void * palette = decoded->data; + void * map = decoded->data + LV_COLOR_INDEXED_PALETTE_SIZE(cf) * sizeof(lv_color32_t); + + /*Start decoding*/ + LV_PROFILER_DECODER_BEGIN_TAG("png_image_finish_read"); + ret = png_image_finish_read(&image, NULL, map, decoded->header.stride, palette); + LV_PROFILER_DECODER_END_TAG("png_image_finish_read"); + LV_PROFILER_DECODER_BEGIN_TAG("png_image_free"); + png_image_free(&image); + LV_PROFILER_DECODER_END_TAG("png_image_free"); + if(dsc->src_type == LV_IMAGE_SRC_FILE) + lv_free(png_data); + if(!ret) { + LV_LOG_ERROR("png decode failed: %s", image.message); + lv_draw_buf_destroy(decoded); + LV_PROFILER_DECODER_END; + return NULL; + } + + LV_PROFILER_DECODER_END; + return decoded; +} + +#endif /*LV_USE_LIBPNG*/ diff --git a/inc/lvgl/src/libs/libpng/lv_libpng.h b/inc/lvgl/src/libs/libpng/lv_libpng.h new file mode 100644 index 0000000..1279458 --- /dev/null +++ b/inc/lvgl/src/libs/libpng/lv_libpng.h @@ -0,0 +1,48 @@ +/** + * @file lv_libpng.h + * + */ + +#ifndef LV_LIBPNG_H +#define LV_LIBPNG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_LIBPNG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_libpng_init(void); + +void lv_libpng_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LIBPNG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_LIBPNG_H*/ diff --git a/inc/lvgl/src/libs/libwebp/lv_libwebp.c b/inc/lvgl/src/libs/libwebp/lv_libwebp.c new file mode 100644 index 0000000..3806d00 --- /dev/null +++ b/inc/lvgl/src/libs/libwebp/lv_libwebp.c @@ -0,0 +1,240 @@ +/** + * @file lv_libwebp.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_image_decoder_private.h" +#include "../../../lvgl.h" +#if LV_USE_LIBWEBP + +#include "lv_libwebp.h" +#include +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "LIBWEBP" + +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +#define WEBP_HEADER_SIZE 64 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static lv_draw_buf_t * decode_webp_file(lv_image_decoder_dsc_t * dsc, const char * filename); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register the WEBP decoder functions in LVGL + */ +void lv_libwebp_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_close_cb(dec, decoder_close); + + dec->name = DECODER_NAME; +} + +void lv_libwebp_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a WEBP image + * @param dsc can be file name or pointer to a C array + * @param header store the info here + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info + */ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + LV_UNUSED(decoder); /*Unused*/ + lv_image_src_t src_type = dsc->src_type; /*Get the source type*/ + + /*If it's a webp file...*/ + if(src_type == LV_IMAGE_SRC_FILE) { + uint8_t buf[WEBP_HEADER_SIZE]; + int width; + int height; + uint32_t rn; + lv_fs_res_t res = lv_fs_read(&dsc->file, buf, sizeof(buf), &rn); + + /* The max header size = RIFF + VP8X + (optional chunks) + VP8(L), 64 bytes is enough to get the width and height. + * If the file is smaller than 64 bytes, it's maybe a valid webp file, + * so we don't check the result length here. + * VP8X : RIFF(12) + VP8X(18) = 30bytes; + * VP8(L): RIFF(12) + VP8(L) chunk header(8) + VP8(L) frame header(5) = 23bytes; + * VP8: RIFF(12) + VP8(L) chunk header(8) + VP8(L) frame header(10) = 28bytes; + */ + if(res != LV_FS_RES_OK) return LV_RESULT_INVALID; + + if(WebPGetInfo(buf, rn, &width, &height) == 0) { + return LV_RESULT_INVALID; + } + + /*Default decoder color format is ARGB8888*/ + header->cf = LV_COLOR_FORMAT_ARGB8888; + header->w = width; + header->h = height; + header->stride = width * sizeof(lv_color32_t); + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; /*If it didn't succeed earlier then it's an error*/ +} + +/** + * Open a WEBP image and return the decoded image + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + /*If it's a webp file...*/ + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + lv_draw_buf_t * decoded = decode_webp_file(dsc, fn); + if(decoded == NULL) { + return LV_RESULT_INVALID; + } + + lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); + if(adjusted == NULL) { + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + + /*The adjusted draw buffer is newly allocated.*/ + if(adjusted != decoded) { + lv_draw_buf_destroy(decoded); + decoded = adjusted; + } + + dsc->decoded = decoded; + + if(dsc->args.no_cache) { + return LV_RESULT_OK; + } + + /*If the image cache is disabled, just return the decoded image*/ + if(!lv_image_cache_is_enabled()) { + return LV_RESULT_OK; + } + + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); + + if(entry == NULL) { + lv_draw_buf_destroy(decoded); + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; + + return LV_RESULT_OK; /*The image is fully decoded. Return with its pointer*/ + } + + return LV_RESULT_INVALID; /*If not returned earlier then it failed*/ +} + +/** + * Free the allocated resources + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); /*Unused*/ + + if(dsc->args.no_cache || + !lv_image_cache_is_enabled()) lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); +} + +static lv_draw_buf_t * decode_webp_file(lv_image_decoder_dsc_t * dsc, const char * filename) +{ + LV_PROFILER_DECODER_BEGIN; + uint32_t data_size; + uint8_t * data = lv_fs_load_with_alloc(filename, &data_size); + if(data == NULL) { + LV_LOG_WARN("can't load file: %s", filename); + LV_PROFILER_DECODER_END; + return NULL; + } + + /*Alloc image buffer*/ + lv_draw_buf_t * decoded; + decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, dsc->header.w, dsc->header.h, dsc->header.cf, + LV_STRIDE_AUTO); + if(decoded == NULL) { + LV_LOG_ERROR("alloc draw buffer failed: %s", filename); + lv_free(data); + LV_PROFILER_DECODER_END; + return NULL; + } + + WebPDecoderConfig config; + WebPInitDecoderConfig(&config); + + config.output.colorspace = MODE_BGRA; + config.output.u.RGBA.rgba = (uint8_t *) decoded->data; + config.output.u.RGBA.stride = decoded->header.stride; + config.output.u.RGBA.size = decoded->data_size; + config.output.is_external_memory = 1; + + LV_PROFILER_DECODER_BEGIN_TAG("WebPDecode"); + int status = WebPDecode(data, data_size, &config); + LV_PROFILER_DECODER_END_TAG("WebPDecode"); + + if(status != VP8_STATUS_OK) { + LV_LOG_ERROR("decode webp failed: %s, status: %d", filename, status); + lv_draw_buf_destroy(decoded); + decoded = NULL; + } + + lv_free(data); + LV_PROFILER_DECODER_END; + return decoded; +} + +#endif /*LV_USE_LIBWEBP*/ diff --git a/inc/lvgl/src/libs/libwebp/lv_libwebp.h b/inc/lvgl/src/libs/libwebp/lv_libwebp.h new file mode 100644 index 0000000..3a19d04 --- /dev/null +++ b/inc/lvgl/src/libs/libwebp/lv_libwebp.h @@ -0,0 +1,48 @@ +/** + * @file lv_libwebp.h + * + */ + +#ifndef LV_LIBWEBP_H +#define LV_LIBWEBP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_LIBWEBP + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register the WEBP decoder functions in LVGL + */ +void lv_libwebp_init(void); + +void lv_libwebp_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LIBWEBP*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_LIBWEBP_H*/ diff --git a/inc/lvgl/src/libs/lodepng/LICENSE.txt b/inc/lvgl/src/libs/lodepng/LICENSE.txt new file mode 100644 index 0000000..83aa1b4 --- /dev/null +++ b/inc/lvgl/src/libs/lodepng/LICENSE.txt @@ -0,0 +1,21 @@ +Copyright (c) 2005-2018 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. + diff --git a/inc/lvgl/src/libs/lodepng/lodepng.c b/inc/lvgl/src/libs/lodepng/lodepng.c new file mode 100644 index 0000000..7e37636 --- /dev/null +++ b/inc/lvgl/src/libs/lodepng/lodepng.c @@ -0,0 +1,7662 @@ +/* +LodePNG version 20230410 + +Copyright (c) 2005-2023 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +/* +The manual and changelog are in the header file "lodepng.h" +Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. +*/ + +#include "lodepng.h" +#if LV_USE_LODEPNG +#include "../../core/lv_global.h" + +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +#ifdef LODEPNG_COMPILE_DISK + #include /* LONG_MAX */ + #include /* file handling */ +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ALLOCATORS + #include /* allocations */ +#endif /* LODEPNG_COMPILE_ALLOCATORS */ + +#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ + #pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ + #pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ +#endif /*_MSC_VER */ + +const char * LODEPNG_VERSION_STRING = "20230410"; + +/* +This source file is divided into the following large parts. The code sections +with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. +-Tools for C and common code for PNG and Zlib +-C Code for Zlib (huffman, deflate, ...) +-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) +-The C++ wrapper around all of the above +*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // Tools for C, and common code for PNG and Zlib. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*The malloc, realloc and free functions defined here with "lodepng_" in front +of the name, so that you can easily change them to others related to your +platform if needed. Everything else in the code calls these. Pass +-DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out +#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and +define them in your own project's source files without needing to change +lodepng source code. Don't forget to remove "static" if you copypaste them +from here.*/ + +#ifdef LODEPNG_COMPILE_ALLOCATORS +static void * lodepng_malloc(size_t size) +{ +#ifdef LODEPNG_MAX_ALLOC + if(size > LODEPNG_MAX_ALLOC) return 0; +#endif + return lv_malloc(size); +} + +/* NOTE: when realloc returns NULL, it leaves the original memory untouched */ +static void * lodepng_realloc(void * ptr, size_t new_size) +{ +#ifdef LODEPNG_MAX_ALLOC + if(new_size > LODEPNG_MAX_ALLOC) return 0; +#endif + return lv_realloc(ptr, new_size); +} + +static void lodepng_free(void * ptr) +{ + lv_free(ptr); +} +#else /*LODEPNG_COMPILE_ALLOCATORS*/ +/* TODO: support giving additional void* payload to the custom allocators */ +void * lodepng_malloc(size_t size); +void * lodepng_realloc(void * ptr, size_t new_size); +void lodepng_free(void * ptr); +#endif /*LODEPNG_COMPILE_ALLOCATORS*/ + +/* convince the compiler to inline a function, for use when this measurably improves performance */ +/* inline is not available in C90, but use it when supported by the compiler */ +#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define LODEPNG_INLINE inline +#else + #define LODEPNG_INLINE /* not available */ +#endif + +/* restrict is not available in C90, but use it when supported by the compiler */ +#if (defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) ||\ + (defined(_MSC_VER) && (_MSC_VER >= 1400)) || \ + (defined(__WATCOMC__) && (__WATCOMC__ >= 1250) && !defined(__cplusplus)) + #define LODEPNG_RESTRICT __restrict +#else + #define LODEPNG_RESTRICT /* not available */ +#endif + +/* Replacements for C library functions such as memcpy and strlen, to support platforms +where a full C library is not available. The compiler can recognize them and compile +to something as fast. */ + +static void lodepng_memcpy(void * LODEPNG_RESTRICT dst, + const void * LODEPNG_RESTRICT src, size_t size) +{ + lv_memcpy(dst, src, size); +} + +static void lodepng_memset(void * LODEPNG_RESTRICT dst, + int value, size_t num) +{ + lv_memset(dst, value, num); +} + +/* does not check memory out of bounds, do not use on untrusted data */ +static size_t lodepng_strlen(const char * a) +{ + const char * orig = a; + /* avoid warning about unused function in case of disabled COMPILE... macros */ + (void)(&lodepng_strlen); + while(*a) a++; + return (size_t)(a - orig); +} + +#define LODEPNG_MAX(a, b) (((a) > (b)) ? (a) : (b)) +#define LODEPNG_MIN(a, b) (((a) < (b)) ? (a) : (b)) + +#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER) +/* Safely check if adding two integers will overflow (no undefined +behavior, compiler removing the code, etc...) and output result. */ +static int lodepng_addofl(size_t a, size_t b, size_t * result) +{ + *result = a + b; /* Unsigned addition is well defined and safe in C90 */ + return *result < a; +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_DECODER)*/ + +#ifdef LODEPNG_COMPILE_DECODER +/* Safely check if multiplying two integers will overflow (no undefined +behavior, compiler removing the code, etc...) and output result. */ +static int lodepng_mulofl(size_t a, size_t b, size_t * result) +{ + *result = a * b; /* Unsigned multiplication is well defined and safe in C90 */ + return (a != 0 && *result / a != b); +} + +#ifdef LODEPNG_COMPILE_ZLIB +/* Safely check if a + b > c, even if overflow could happen. */ +static int lodepng_gtofl(size_t a, size_t b, size_t c) +{ + size_t d; + if(lodepng_addofl(a, b, &d)) return 1; + return d > c; +} +#endif /*LODEPNG_COMPILE_ZLIB*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +/* +Often in case of an error a value is assigned to a variable and then it breaks +out of a loop (to go to the cleanup phase of a function). This macro does that. +It makes the error handling code shorter and more readable. + +Example: if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83); +*/ +#define CERROR_BREAK(errorvar, code){\ + errorvar = code;\ + break;\ + } + +/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ +#define ERROR_BREAK(code) CERROR_BREAK(error, code) + +/*Set error var to the error code, and return it.*/ +#define CERROR_RETURN_ERROR(errorvar, code){\ + errorvar = code;\ + return code;\ + } + +/*Try the code, if it returns error, also return the error.*/ +#define CERROR_TRY_RETURN(call){\ + unsigned error = call;\ + if(error) return error;\ + } + +/*Set error var to the error code, and return from the void function.*/ +#define CERROR_RETURN(errorvar, code){\ + errorvar = code;\ + return;\ + } + +/* +About uivector, ucvector and string: +-All of them wrap dynamic arrays or text strings in a similar way. +-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. +-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. +-They're not used in the interface, only internally in this file as static functions. +-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. +*/ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER +/*dynamic vector of unsigned ints*/ +typedef struct uivector { + unsigned * data; + size_t size; /*size in number of unsigned longs*/ + size_t allocsize; /*allocated size in bytes*/ +} uivector; + +static void uivector_cleanup(void * p) +{ + ((uivector *)p)->size = ((uivector *)p)->allocsize = 0; + lodepng_free(((uivector *)p)->data); + ((uivector *)p)->data = NULL; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_resize(uivector * p, size_t size) +{ + size_t allocsize = size * sizeof(unsigned); + if(allocsize > p->allocsize) { + size_t newsize = allocsize + (p->allocsize >> 1u); + void * data = lodepng_realloc(p->data, newsize); + if(data) { + p->allocsize = newsize; + p->data = (unsigned *)data; + } + else return 0; /*error: not enough memory*/ + } + p->size = size; + return 1; /*success*/ +} + +static void uivector_init(uivector * p) +{ + p->data = NULL; + p->size = p->allocsize = 0; +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned uivector_push_back(uivector * p, unsigned c) +{ + if(!uivector_resize(p, p->size + 1)) return 0; + p->data[p->size - 1] = c; + return 1; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* /////////////////////////////////////////////////////////////////////////// */ + +/*dynamic vector of unsigned chars*/ +typedef struct ucvector { + unsigned char * data; + size_t size; /*used size*/ + size_t allocsize; /*allocated size*/ +} ucvector; + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_reserve(ucvector * p, size_t size) +{ + if(size > p->allocsize) { + size_t newsize = size + (p->allocsize >> 1u); + void * data = lodepng_realloc(p->data, newsize); + if(data) { + p->allocsize = newsize; + p->data = (unsigned char *)data; + } + else return 0; /*error: not enough memory*/ + } + return 1; /*success*/ +} + +/*returns 1 if success, 0 if failure ==> nothing done*/ +static unsigned ucvector_resize(ucvector * p, size_t size) +{ + p->size = size; + return ucvector_reserve(p, size); +} + +static ucvector ucvector_init(unsigned char * buffer, size_t size) +{ + ucvector v; + v.data = buffer; + v.allocsize = v.size = size; + return v; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +/*free string pointer and set it to NULL*/ +static void string_cleanup(char ** out) +{ + lodepng_free(*out); + *out = NULL; +} + +/*also appends null termination character*/ +static char * alloc_string_sized(const char * in, size_t insize) +{ + char * out = (char *)lodepng_malloc(insize + 1); + if(out) { + lodepng_memcpy(out, in, insize); + out[insize] = 0; + } + return out; +} + +/* dynamically allocates a new string with a copy of the null terminated input text */ +static char * alloc_string(const char * in) +{ + return alloc_string_sized(in, lodepng_strlen(in)); +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG) +static unsigned lodepng_read32bitInt(const unsigned char * buffer) +{ + return (((unsigned)buffer[0] << 24u) | ((unsigned)buffer[1] << 16u) | + ((unsigned)buffer[2] << 8u) | (unsigned)buffer[3]); +} +#endif /*defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_PNG)*/ + +#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) +/*buffer must have at least 4 allocated bytes available*/ +static void lodepng_set32bitInt(unsigned char * buffer, unsigned value) +{ + buffer[0] = (unsigned char)((value >> 24) & 0xff); + buffer[1] = (unsigned char)((value >> 16) & 0xff); + buffer[2] = (unsigned char)((value >> 8) & 0xff); + buffer[3] = (unsigned char)((value) & 0xff); +} +#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / File IO / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DISK + +/* returns negative value on error. This should be pure C compatible, so no fstat. */ +static long lodepng_filesize(const char * filename) +{ + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return -1; + uint32_t size = 0; + if(lv_fs_seek(&f, 0, LV_FS_SEEK_END) != 0) { + lv_fs_close(&f); + return -1; + } + + lv_fs_tell(&f, &size); + lv_fs_close(&f); + return size; +} + +/* load file into buffer that already has the correct allocated size. Returns error code.*/ +static unsigned lodepng_buffer_file(unsigned char * out, size_t size, const char * filename) +{ + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) return 78; + + uint32_t br; + res = lv_fs_read(&f, out, size, &br); + lv_fs_close(&f); + + if(res != LV_FS_RES_OK) return 78; + if(br != size) return 78; + + return 0; +} + +unsigned lodepng_load_file(unsigned char ** out, size_t * outsize, const char * filename) +{ + long size = lodepng_filesize(filename); + if(size < 0) return 78; + *outsize = (size_t)size; + + *out = (unsigned char *)lodepng_malloc((size_t)size); + if(!(*out) && size > 0) return 83; /*the above malloc failed*/ + + return lodepng_buffer_file(*out, (size_t)size, filename); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned lodepng_save_file(const unsigned char * buffer, size_t buffersize, const char * filename) +{ + lv_fs_file_t f; + lv_fs_res_t res = lv_fs_open(&f, filename, LV_FS_MODE_WR); + if(res != LV_FS_RES_OK) return 79; + + uint32_t bw; + res = lv_fs_write(&f, buffer, buffersize, &bw); + lv_fs_close(&f); + return 0; +} + +#endif /*LODEPNG_COMPILE_DISK*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of common code and tools. Begin of Zlib related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_ENCODER + +typedef struct { + ucvector * data; + unsigned char bp; /*ok to overflow, indicates bit pos inside byte*/ +} LodePNGBitWriter; + +static void LodePNGBitWriter_init(LodePNGBitWriter * writer, ucvector * data) +{ + writer->data = data; + writer->bp = 0; +} + +/*TODO: this ignores potential out of memory errors*/ +#define WRITEBIT(writer, bit){\ + /* append new byte */\ + if(((writer->bp) & 7u) == 0) {\ + if(!ucvector_resize(writer->data, writer->data->size + 1)) return;\ + writer->data->data[writer->data->size - 1] = 0;\ + }\ + (writer->data->data[writer->data->size - 1]) |= (bit << ((writer->bp) & 7u));\ + ++writer->bp;\ + } + +/* LSB of value is written first, and LSB of bytes is used first */ +static void writeBits(LodePNGBitWriter * writer, unsigned value, size_t nbits) +{ + if(nbits == 1) { /* compiler should statically compile this case if nbits == 1 */ + WRITEBIT(writer, value); + } + else { + /* TODO: increase output size only once here rather than in each WRITEBIT */ + size_t i; + for(i = 0; i != nbits; ++i) { + WRITEBIT(writer, (unsigned char)((value >> i) & 1)); + } + } +} + +/* This one is to use for adding huffman symbol, the value bits are written MSB first */ +static void writeBitsReversed(LodePNGBitWriter * writer, unsigned value, size_t nbits) +{ + size_t i; + for(i = 0; i != nbits; ++i) { + /* TODO: increase output size only once here rather than in each WRITEBIT */ + WRITEBIT(writer, (unsigned char)((value >> (nbits - 1u - i)) & 1u)); + } +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +typedef struct { + const unsigned char * data; + size_t size; /*size of data in bytes*/ + size_t bitsize; /*size of data in bits, end of valid bp values, should be 8*size*/ + size_t bp; + unsigned buffer; /*buffer for reading bits. NOTE: 'unsigned' must support at least 32 bits*/ +} LodePNGBitReader; + +/* data size argument is in bytes. Returns error if size too large causing overflow */ +static unsigned LodePNGBitReader_init(LodePNGBitReader * reader, const unsigned char * data, size_t size) +{ + size_t temp; + reader->data = data; + reader->size = size; + /* size in bits, return error if overflow (if size_t is 32 bit this supports up to 500MB) */ + if(lodepng_mulofl(size, 8u, &reader->bitsize)) return 105; + /*ensure incremented bp can be compared to bitsize without overflow even when it would be incremented 32 too much and + trying to ensure 32 more bits*/ + if(lodepng_addofl(reader->bitsize, 64u, &temp)) return 105; + reader->bp = 0; + reader->buffer = 0; + return 0; /*ok*/ +} + +/* +ensureBits functions: +Ensures the reader can at least read nbits bits in one or more readBits calls, +safely even if not enough bits are available. +The nbits parameter is unused but is given for documentation purposes, error +checking for amount of bits must be done beforehand. +*/ + +/*See ensureBits documentation above. This one ensures up to 9 bits */ +static LODEPNG_INLINE void ensureBits9(LodePNGBitReader * reader, size_t nbits) +{ + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 1u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u); + reader->buffer >>= (reader->bp & 7u); + } + else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer = reader->data[start + 0]; + reader->buffer >>= (reader->bp & 7u); + } + (void)nbits; +} + +/*See ensureBits documentation above. This one ensures up to 17 bits */ +static LODEPNG_INLINE void ensureBits17(LodePNGBitReader * reader, size_t nbits) +{ + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 2u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | + ((unsigned)reader->data[start + 2] << 16u); + reader->buffer >>= (reader->bp & 7u); + } + else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); + reader->buffer >>= (reader->bp & 7u); + } + (void)nbits; +} + +/*See ensureBits documentation above. This one ensures up to 25 bits */ +static LODEPNG_INLINE void ensureBits25(LodePNGBitReader * reader, size_t nbits) +{ + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 3u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | + ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); + reader->buffer >>= (reader->bp & 7u); + } + else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); + if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); + reader->buffer >>= (reader->bp & 7u); + } + (void)nbits; +} + +/*See ensureBits documentation above. This one ensures up to 32 bits */ +static LODEPNG_INLINE void ensureBits32(LodePNGBitReader * reader, size_t nbits) +{ + size_t start = reader->bp >> 3u; + size_t size = reader->size; + if(start + 4u < size) { + reader->buffer = (unsigned)reader->data[start + 0] | ((unsigned)reader->data[start + 1] << 8u) | + ((unsigned)reader->data[start + 2] << 16u) | ((unsigned)reader->data[start + 3] << 24u); + reader->buffer >>= (reader->bp & 7u); + reader->buffer |= (((unsigned)reader->data[start + 4] << 24u) << (8u - (reader->bp & 7u))); + } + else { + reader->buffer = 0; + if(start + 0u < size) reader->buffer |= reader->data[start + 0]; + if(start + 1u < size) reader->buffer |= ((unsigned)reader->data[start + 1] << 8u); + if(start + 2u < size) reader->buffer |= ((unsigned)reader->data[start + 2] << 16u); + if(start + 3u < size) reader->buffer |= ((unsigned)reader->data[start + 3] << 24u); + reader->buffer >>= (reader->bp & 7u); + } + (void)nbits; +} + +/* Get bits without advancing the bit pointer. Must have enough bits available with ensureBits. Max nbits is 31. */ +static LODEPNG_INLINE unsigned peekBits(LodePNGBitReader * reader, size_t nbits) +{ + /* The shift allows nbits to be only up to 31. */ + return reader->buffer & ((1u << nbits) - 1u); +} + +/* Must have enough bits available with ensureBits */ +static LODEPNG_INLINE void advanceBits(LodePNGBitReader * reader, size_t nbits) +{ + reader->buffer >>= nbits; + reader->bp += nbits; +} + +/* Must have enough bits available with ensureBits */ +static LODEPNG_INLINE unsigned readBits(LodePNGBitReader * reader, size_t nbits) +{ + unsigned result = peekBits(reader, nbits); + advanceBits(reader, nbits); + return result; +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +static unsigned reverseBits(unsigned bits, unsigned num) +{ + /*TODO: implement faster lookup table based version when needed*/ + unsigned i, result = 0; + for(i = 0; i < num; i++) result |= ((bits >> (num - i - 1u)) & 1u) << i; + return result; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflate - Huffman / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#define FIRST_LENGTH_CODE_INDEX 257 +#define LAST_LENGTH_CODE_INDEX 285 +/*256 literals, the end code, some length codes, and 2 unused codes*/ +#define NUM_DEFLATE_CODE_SYMBOLS 288 +/*the distance codes have their own symbols, 30 used, 2 unused*/ +#define NUM_DISTANCE_SYMBOLS 32 +/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ +#define NUM_CODE_LENGTH_CODES 19 + +/*the base lengths represented by codes 257-285*/ +static const unsigned LENGTHBASE[29] + = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, + 67, 83, 99, 115, 131, 163, 195, 227, 258 + }; + +/*the extra bits used by codes 257-285 (added to base length)*/ +static const unsigned LENGTHEXTRA[29] + = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0 + }; + +/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ +static const unsigned DISTANCEBASE[30] + = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, + 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 + }; + +/*the extra bits of backwards distances (added to base)*/ +static const unsigned DISTANCEEXTRA[30] + = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, + 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 + }; + +/*the order in which "code length alphabet code lengths" are stored as specified by deflate, out of this the huffman +tree of the dynamic huffman tree lengths is generated*/ +static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] + = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +/* ////////////////////////////////////////////////////////////////////////// */ + +/* +Huffman tree struct, containing multiple representations of the tree +*/ +typedef struct HuffmanTree { + unsigned * codes; /*the huffman codes (bit patterns representing the symbols)*/ + unsigned * lengths; /*the lengths of the huffman codes*/ + unsigned maxbitlen; /*maximum number of bits a single code can get*/ + unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ + /* for reading only */ + unsigned char * table_len; /*length of symbol from lookup table, or max length if secondary lookup needed*/ + unsigned short * table_value; /*value of symbol from lookup table, or pointer to secondary table if needed*/ +} HuffmanTree; + +static void HuffmanTree_init(HuffmanTree * tree) +{ + tree->codes = 0; + tree->lengths = 0; + tree->table_len = 0; + tree->table_value = 0; +} + +static void HuffmanTree_cleanup(HuffmanTree * tree) +{ + lodepng_free(tree->codes); + lodepng_free(tree->lengths); + lodepng_free(tree->table_len); + lodepng_free(tree->table_value); +} + +/* amount of bits for first huffman table lookup (aka root bits), see HuffmanTree_makeTable and huffmanDecodeSymbol.*/ +/* values 8u and 9u work the fastest */ +#define FIRSTBITS 9u + +/* a symbol value too big to represent any valid symbol, to indicate reading disallowed huffman bits combination, +which is possible in case of only 0 or 1 present symbols. */ +#define INVALIDSYMBOL 65535u + +/* make table for huffman decoding */ +static unsigned HuffmanTree_makeTable(HuffmanTree * tree) +{ + static const unsigned headsize = 1u << FIRSTBITS; /*size of the first table*/ + static const unsigned mask = (1u << FIRSTBITS) /*headsize*/ - 1u; + size_t i, numpresent, pointer, size; /*total table size*/ + unsigned * maxlens = (unsigned *)lodepng_malloc(headsize * sizeof(unsigned)); + if(!maxlens) return 83; /*alloc fail*/ + + /* compute maxlens: max total bit length of symbols sharing prefix in the first table*/ + lodepng_memset(maxlens, 0, headsize * sizeof(*maxlens)); + for(i = 0; i < tree->numcodes; i++) { + unsigned symbol = tree->codes[i]; + unsigned l = tree->lengths[i]; + unsigned index; + if(l <= FIRSTBITS) continue; /*symbols that fit in first table don't increase secondary table size*/ + /*get the FIRSTBITS MSBs, the MSBs of the symbol are encoded first. See later comment about the reversing*/ + index = reverseBits(symbol >> (l - FIRSTBITS), FIRSTBITS); + maxlens[index] = LODEPNG_MAX(maxlens[index], l); + } + /* compute total table size: size of first table plus all secondary tables for symbols longer than FIRSTBITS */ + size = headsize; + for(i = 0; i < headsize; ++i) { + unsigned l = maxlens[i]; + if(l > FIRSTBITS) size += (((size_t)1) << (l - FIRSTBITS)); + } + tree->table_len = (unsigned char *)lodepng_malloc(size * sizeof(*tree->table_len)); + tree->table_value = (unsigned short *)lodepng_malloc(size * sizeof(*tree->table_value)); + if(!tree->table_len || !tree->table_value) { + lodepng_free(maxlens); + /* freeing tree->table values is done at a higher scope */ + return 83; /*alloc fail*/ + } + /*initialize with an invalid length to indicate unused entries*/ + for(i = 0; i < size; ++i) tree->table_len[i] = 16; + + /*fill in the first table for long symbols: max prefix size and pointer to secondary tables*/ + pointer = headsize; + for(i = 0; i < headsize; ++i) { + unsigned l = maxlens[i]; + if(l <= FIRSTBITS) continue; + tree->table_len[i] = l; + tree->table_value[i] = (unsigned short)pointer; + pointer += (((size_t)1) << (l - FIRSTBITS)); + } + lodepng_free(maxlens); + + /*fill in the first table for short symbols, or secondary table for long symbols*/ + numpresent = 0; + for(i = 0; i < tree->numcodes; ++i) { + unsigned l = tree->lengths[i]; + unsigned symbol, reverse; + if(l == 0) continue; + symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/ + /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/ + reverse = reverseBits(symbol, l); + numpresent++; + + if(l <= FIRSTBITS) { + /*short symbol, fully in first table, replicated num times if l < FIRSTBITS*/ + unsigned num = 1u << (FIRSTBITS - l); + unsigned j; + for(j = 0; j < num; ++j) { + /*bit reader will read the l bits of symbol first, the remaining FIRSTBITS - l bits go to the MSB's*/ + unsigned index = reverse | (j << l); + if(tree->table_len[index] != 16) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ + tree->table_len[index] = l; + tree->table_value[index] = (unsigned short)i; + } + } + else { + /*long symbol, shares prefix with other long symbols in first lookup table, needs second lookup*/ + /*the FIRSTBITS MSBs of the symbol are the first table index*/ + unsigned index = reverse & mask; + unsigned maxlen = tree->table_len[index]; + /*log2 of secondary table length, should be >= l - FIRSTBITS*/ + unsigned tablelen = maxlen - FIRSTBITS; + unsigned start = tree->table_value[index]; /*starting index in secondary table*/ + unsigned num = 1u << (tablelen - (l - FIRSTBITS)); /*amount of entries of this symbol in secondary table*/ + unsigned j; + if(maxlen < l) return 55; /*invalid tree: long symbol shares prefix with short symbol*/ + for(j = 0; j < num; ++j) { + unsigned reverse2 = reverse >> FIRSTBITS; /* l - FIRSTBITS bits */ + unsigned index2 = start + (reverse2 | (j << (l - FIRSTBITS))); + tree->table_len[index2] = l; + tree->table_value[index2] = (unsigned short)i; + } + } + } + + if(numpresent < 2) { + /* In case of exactly 1 symbol, in theory the huffman symbol needs 0 bits, + but deflate uses 1 bit instead. In case of 0 symbols, no symbols can + appear at all, but such huffman tree could still exist (e.g. if distance + codes are never used). In both cases, not all symbols of the table will be + filled in. Fill them in with an invalid symbol value so returning them from + huffmanDecodeSymbol will cause error. */ + for(i = 0; i < size; ++i) { + if(tree->table_len[i] == 16) { + /* As length, use a value smaller than FIRSTBITS for the head table, + and a value larger than FIRSTBITS for the secondary table, to ensure + valid behavior for advanceBits when reading this symbol. */ + tree->table_len[i] = (i < headsize) ? 1 : (FIRSTBITS + 1); + tree->table_value[i] = INVALIDSYMBOL; + } + } + } + else { + /* A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. + If that is not the case (due to too long length codes), the table will not + have been fully used, and this is an error (not all bit combinations can be + decoded): an oversubscribed huffman tree, indicated by error 55. */ + for(i = 0; i < size; ++i) { + if(tree->table_len[i] == 16) return 55; + } + } + + return 0; +} + +/* +Second step for the ...makeFromLengths and ...makeFromFrequencies functions. +numcodes, lengths and maxbitlen must already be filled in correctly. return +value is error. +*/ +static unsigned HuffmanTree_makeFromLengths2(HuffmanTree * tree) +{ + unsigned * blcount; + unsigned * nextcode; + unsigned error = 0; + unsigned bits, n; + + tree->codes = (unsigned *)lodepng_malloc(tree->numcodes * sizeof(unsigned)); + blcount = (unsigned *)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); + nextcode = (unsigned *)lodepng_malloc((tree->maxbitlen + 1) * sizeof(unsigned)); + if(!tree->codes || !blcount || !nextcode) error = 83; /*alloc fail*/ + + if(!error) { + for(n = 0; n != tree->maxbitlen + 1; n++) blcount[n] = nextcode[n] = 0; + /*step 1: count number of instances of each code length*/ + for(bits = 0; bits != tree->numcodes; ++bits) ++blcount[tree->lengths[bits]]; + /*step 2: generate the nextcode values*/ + for(bits = 1; bits <= tree->maxbitlen; ++bits) { + nextcode[bits] = (nextcode[bits - 1] + blcount[bits - 1]) << 1u; + } + /*step 3: generate all the codes*/ + for(n = 0; n != tree->numcodes; ++n) { + if(tree->lengths[n] != 0) { + tree->codes[n] = nextcode[tree->lengths[n]]++; + /*remove superfluous bits from the code*/ + tree->codes[n] &= ((1u << tree->lengths[n]) - 1u); + } + } + } + + lodepng_free(blcount); + lodepng_free(nextcode); + + if(!error) error = HuffmanTree_makeTable(tree); + return error; +} + +/* +given the code lengths (as stored in the PNG file), generate the tree as defined +by Deflate. maxbitlen is the maximum bits that a code in the tree can have. +return value is error. +*/ +static unsigned HuffmanTree_makeFromLengths(HuffmanTree * tree, const unsigned * bitlen, + size_t numcodes, unsigned maxbitlen) +{ + unsigned i; + tree->lengths = (unsigned *)lodepng_malloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + tree->maxbitlen = maxbitlen; + return HuffmanTree_makeFromLengths2(tree); +} + +#ifdef LODEPNG_COMPILE_ENCODER + +/*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", +Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ + +/*chain node for boundary package merge*/ +typedef struct BPMNode { + int weight; /*the sum of all weights in this chain*/ + unsigned index; /*index of this leaf node (called "count" in the paper)*/ + struct BPMNode * tail; /*the next nodes in this chain (null if last)*/ + int in_use; +} BPMNode; + +/*lists of chains*/ +typedef struct BPMLists { + /*memory pool*/ + unsigned memsize; + BPMNode * memory; + unsigned numfree; + unsigned nextfree; + BPMNode ** freelist; + /*two heads of lookahead chains per list*/ + unsigned listsize; + BPMNode ** chains0; + BPMNode ** chains1; +} BPMLists; + +/*creates a new chain node with the given parameters, from the memory in the lists */ +static BPMNode * bpmnode_create(BPMLists * lists, int weight, unsigned index, BPMNode * tail) +{ + unsigned i; + BPMNode * result; + + /*memory full, so garbage collect*/ + if(lists->nextfree >= lists->numfree) { + /*mark only those that are in use*/ + for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; + for(i = 0; i != lists->listsize; ++i) { + BPMNode * node; + for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; + for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; + } + /*collect those that are free*/ + lists->numfree = 0; + for(i = 0; i != lists->memsize; ++i) { + if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; + } + lists->nextfree = 0; + } + + result = lists->freelist[lists->nextfree++]; + result->weight = weight; + result->index = index; + result->tail = tail; + return result; +} + +/*sort the leaves with stable mergesort*/ +static void bpmnode_sort(BPMNode * leaves, size_t num) +{ + BPMNode * mem = (BPMNode *)lodepng_malloc(sizeof(*leaves) * num); + size_t width, counter = 0; + for(width = 1; width < num; width *= 2) { + BPMNode * a = (counter & 1) ? mem : leaves; + BPMNode * b = (counter & 1) ? leaves : mem; + size_t p; + for(p = 0; p < num; p += 2 * width) { + size_t q = (p + width > num) ? num : (p + width); + size_t r = (p + 2 * width > num) ? num : (p + 2 * width); + size_t i = p, j = q, k; + for(k = p; k < r; k++) { + if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++]; + else b[k] = a[j++]; + } + } + counter++; + } + if(counter & 1) lodepng_memcpy(leaves, mem, sizeof(*leaves) * num); + lodepng_free(mem); +} + +/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ +static void boundaryPM(BPMLists * lists, BPMNode * leaves, size_t numpresent, int c, int num) +{ + unsigned lastindex = lists->chains1[c]->index; + + if(c == 0) { + if(lastindex >= numpresent) return; + lists->chains0[c] = lists->chains1[c]; + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); + } + else { + /*sum of the weights of the head nodes of the previous lookahead chains.*/ + int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; + lists->chains0[c] = lists->chains1[c]; + if(lastindex < numpresent && sum > leaves[lastindex].weight) { + lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); + return; + } + lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); + /*in the end we are only interested in the chain of the last list, so no + need to recurse if we're at the last one (this gives measurable speedup)*/ + if(num + 1 < (int)(2 * numpresent - 2)) { + boundaryPM(lists, leaves, numpresent, c - 1, num); + boundaryPM(lists, leaves, numpresent, c - 1, num); + } + } +} + +unsigned lodepng_huffman_code_lengths(unsigned * lengths, const unsigned * frequencies, + size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + unsigned i; + size_t numpresent = 0; /*number of symbols with non-zero frequency*/ + BPMNode * leaves; /*the symbols, only those with > 0 frequency*/ + + if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ + if((1u << maxbitlen) < (unsigned)numcodes) return 80; /*error: represent all symbols*/ + + leaves = (BPMNode *)lodepng_malloc(numcodes * sizeof(*leaves)); + if(!leaves) return 83; /*alloc fail*/ + + for(i = 0; i != numcodes; ++i) { + if(frequencies[i] > 0) { + leaves[numpresent].weight = (int)frequencies[i]; + leaves[numpresent].index = i; + ++numpresent; + } + } + + lodepng_memset(lengths, 0, numcodes * sizeof(*lengths)); + + /*ensure at least two present symbols. There should be at least one symbol + according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To + make these work as well ensure there are at least two symbols. The + Package-Merge code below also doesn't work correctly if there's only one + symbol, it'd give it the theoretical 0 bits but in practice zlib wants 1 bit*/ + if(numpresent == 0) { + lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ + } + else if(numpresent == 1) { + lengths[leaves[0].index] = 1; + lengths[leaves[0].index == 0 ? 1 : 0] = 1; + } + else { + BPMLists lists; + BPMNode * node; + + bpmnode_sort(leaves, numpresent); + + lists.listsize = maxbitlen; + lists.memsize = 2 * maxbitlen * (maxbitlen + 1); + lists.nextfree = 0; + lists.numfree = lists.memsize; + lists.memory = (BPMNode *)lodepng_malloc(lists.memsize * sizeof(*lists.memory)); + lists.freelist = (BPMNode **)lodepng_malloc(lists.memsize * sizeof(BPMNode *)); + lists.chains0 = (BPMNode **)lodepng_malloc(lists.listsize * sizeof(BPMNode *)); + lists.chains1 = (BPMNode **)lodepng_malloc(lists.listsize * sizeof(BPMNode *)); + if(!lists.memory || !lists.freelist || !lists.chains0 || !lists.chains1) error = 83; /*alloc fail*/ + + if(!error) { + for(i = 0; i != lists.memsize; ++i) lists.freelist[i] = &lists.memory[i]; + + bpmnode_create(&lists, leaves[0].weight, 1, 0); + bpmnode_create(&lists, leaves[1].weight, 2, 0); + + for(i = 0; i != lists.listsize; ++i) { + lists.chains0[i] = &lists.memory[0]; + lists.chains1[i] = &lists.memory[1]; + } + + /*each boundaryPM call adds one chain to the last list, and we need 2 * numpresent - 2 chains.*/ + for(i = 2; i != 2 * numpresent - 2; ++i) boundaryPM(&lists, leaves, numpresent, (int)maxbitlen - 1, (int)i); + + for(node = lists.chains1[maxbitlen - 1]; node; node = node->tail) { + for(i = 0; i != node->index; ++i) ++lengths[leaves[i].index]; + } + } + + lodepng_free(lists.memory); + lodepng_free(lists.freelist); + lodepng_free(lists.chains0); + lodepng_free(lists.chains1); + } + + lodepng_free(leaves); + return error; +} + +/*Create the Huffman tree given the symbol frequencies*/ +static unsigned HuffmanTree_makeFromFrequencies(HuffmanTree * tree, const unsigned * frequencies, + size_t mincodes, size_t numcodes, unsigned maxbitlen) +{ + unsigned error = 0; + while(!frequencies[numcodes - 1] && numcodes > mincodes) --numcodes; /*trim zeroes*/ + tree->lengths = (unsigned *)lodepng_malloc(numcodes * sizeof(unsigned)); + if(!tree->lengths) return 83; /*alloc fail*/ + tree->maxbitlen = maxbitlen; + tree->numcodes = (unsigned)numcodes; /*number of symbols*/ + + error = lodepng_huffman_code_lengths(tree->lengths, frequencies, numcodes, maxbitlen); + if(!error) error = HuffmanTree_makeFromLengths2(tree); + return error; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*get the literal and length code tree of a deflated block with fixed tree, as per the deflate specification*/ +static unsigned generateFixedLitLenTree(HuffmanTree * tree) +{ + unsigned i, error = 0; + unsigned * bitlen = (unsigned *)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*288 possible codes: 0-255=literals, 256=endcode, 257-285=lengthcodes, 286-287=unused*/ + for(i = 0; i <= 143; ++i) bitlen[i] = 8; + for(i = 144; i <= 255; ++i) bitlen[i] = 9; + for(i = 256; i <= 279; ++i) bitlen[i] = 7; + for(i = 280; i <= 287; ++i) bitlen[i] = 8; + + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DEFLATE_CODE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +/*get the distance code tree of a deflated block with fixed tree, as specified in the deflate specification*/ +static unsigned generateFixedDistanceTree(HuffmanTree * tree) +{ + unsigned i, error = 0; + unsigned * bitlen = (unsigned *)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen) return 83; /*alloc fail*/ + + /*there are 32 distance codes, but 30-31 are unused*/ + for(i = 0; i != NUM_DISTANCE_SYMBOLS; ++i) bitlen[i] = 5; + error = HuffmanTree_makeFromLengths(tree, bitlen, NUM_DISTANCE_SYMBOLS, 15); + + lodepng_free(bitlen); + return error; +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* +returns the code. The bit reader must already have been ensured at least 15 bits +*/ +static unsigned huffmanDecodeSymbol(LodePNGBitReader * reader, const HuffmanTree * codetree) +{ + unsigned short code = peekBits(reader, FIRSTBITS); + unsigned short l = codetree->table_len[code]; + unsigned short value = codetree->table_value[code]; + if(l <= FIRSTBITS) { + advanceBits(reader, l); + return value; + } + else { + advanceBits(reader, FIRSTBITS); + value += peekBits(reader, l - FIRSTBITS); + advanceBits(reader, codetree->table_len[value] - FIRSTBITS); + return codetree->table_value[value]; + } +} +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Inflator (Decompressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*get the tree of a deflated block with fixed tree, as specified in the deflate specification +Returns error code.*/ +static unsigned getTreeInflateFixed(HuffmanTree * tree_ll, HuffmanTree * tree_d) +{ + unsigned error = generateFixedLitLenTree(tree_ll); + if(error) return error; + return generateFixedDistanceTree(tree_d); +} + +/*get the tree of a deflated block with dynamic tree, the tree itself is also Huffman compressed with a known tree*/ +static unsigned getTreeInflateDynamic(HuffmanTree * tree_ll, HuffmanTree * tree_d, + LodePNGBitReader * reader) +{ + /*make sure that length values that aren't filled in will be 0, or a wrong tree will be generated*/ + unsigned error = 0; + unsigned n, HLIT, HDIST, HCLEN, i; + + /*see comments in deflateDynamic for explanation of the context and these variables, it is analogous*/ + unsigned * bitlen_ll = 0; /*lit,len code lengths*/ + unsigned * bitlen_d = 0; /*dist code lengths*/ + /*code length code lengths ("clcl"), the bit lengths of the huffman tree used to compress bitlen_ll and bitlen_d*/ + unsigned * bitlen_cl = 0; + HuffmanTree tree_cl; /*the code tree for code length codes (the huffman tree for compressed huffman trees)*/ + + if(reader->bitsize - reader->bp < 14) return 49; /*error: the bit pointer is or will go past the memory*/ + ensureBits17(reader, 14); + + /*number of literal/length codes + 257. Unlike the spec, the value 257 is added to it here already*/ + HLIT = readBits(reader, 5) + 257; + /*number of distance codes. Unlike the spec, the value 1 is added to it here already*/ + HDIST = readBits(reader, 5) + 1; + /*number of code length codes. Unlike the spec, the value 4 is added to it here already*/ + HCLEN = readBits(reader, 4) + 4; + + bitlen_cl = (unsigned *)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(unsigned)); + if(!bitlen_cl) return 83 /*alloc fail*/; + + HuffmanTree_init(&tree_cl); + + while(!error) { + /*read the code length codes out of 3 * (amount of code length codes) bits*/ + if(lodepng_gtofl(reader->bp, HCLEN * 3, reader->bitsize)) { + ERROR_BREAK(50); /*error: the bit pointer is or will go past the memory*/ + } + for(i = 0; i != HCLEN; ++i) { + ensureBits9(reader, 3); /*out of bounds already checked above */ + bitlen_cl[CLCL_ORDER[i]] = readBits(reader, 3); + } + for(i = HCLEN; i != NUM_CODE_LENGTH_CODES; ++i) { + bitlen_cl[CLCL_ORDER[i]] = 0; + } + + error = HuffmanTree_makeFromLengths(&tree_cl, bitlen_cl, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*now we can use this tree to read the lengths for the tree that this function will return*/ + bitlen_ll = (unsigned *)lodepng_malloc(NUM_DEFLATE_CODE_SYMBOLS * sizeof(unsigned)); + bitlen_d = (unsigned *)lodepng_malloc(NUM_DISTANCE_SYMBOLS * sizeof(unsigned)); + if(!bitlen_ll || !bitlen_d) ERROR_BREAK(83 /*alloc fail*/); + lodepng_memset(bitlen_ll, 0, NUM_DEFLATE_CODE_SYMBOLS * sizeof(*bitlen_ll)); + lodepng_memset(bitlen_d, 0, NUM_DISTANCE_SYMBOLS * sizeof(*bitlen_d)); + + /*i is the current symbol we're reading in the part that contains the code lengths of lit/len and dist codes*/ + i = 0; + while(i < HLIT + HDIST) { + unsigned code; + ensureBits25(reader, 22); /* up to 15 bits for huffman code, up to 7 extra bits below*/ + code = huffmanDecodeSymbol(reader, &tree_cl); + if(code <= 15) { /*a length code*/ + if(i < HLIT) bitlen_ll[i] = code; + else bitlen_d[i - HLIT] = code; + ++i; + } + else if(code == 16) { /*repeat previous*/ + unsigned replength = 3; /*read in the 2 bits that indicate repeat length (3-6)*/ + unsigned value; /*set value to the previous code*/ + + if(i == 0) ERROR_BREAK(54); /*can't repeat previous if i is 0*/ + + replength += readBits(reader, 2); + + if(i < HLIT + 1) value = bitlen_ll[i - 1]; + else value = bitlen_d[i - HLIT - 1]; + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) { + if(i >= HLIT + HDIST) ERROR_BREAK(13); /*error: i is larger than the amount of codes*/ + if(i < HLIT) bitlen_ll[i] = value; + else bitlen_d[i - HLIT] = value; + ++i; + } + } + else if(code == 17) { /*repeat "0" 3-10 times*/ + unsigned replength = 3; /*read in the bits that indicate repeat length*/ + replength += readBits(reader, 3); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) { + if(i >= HLIT + HDIST) ERROR_BREAK(14); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } + else if(code == 18) { /*repeat "0" 11-138 times*/ + unsigned replength = 11; /*read in the bits that indicate repeat length*/ + replength += readBits(reader, 7); + + /*repeat this value in the next lengths*/ + for(n = 0; n < replength; ++n) { + if(i >= HLIT + HDIST) ERROR_BREAK(15); /*error: i is larger than the amount of codes*/ + + if(i < HLIT) bitlen_ll[i] = 0; + else bitlen_d[i - HLIT] = 0; + ++i; + } + } + else { /*if(code == INVALIDSYMBOL)*/ + ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ + } + /*check if any of the ensureBits above went out of bounds*/ + if(reader->bp > reader->bitsize) { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ + ERROR_BREAK(50); /*error, bit pointer jumps past memory*/ + } + } + if(error) break; + + if(bitlen_ll[256] == 0) ERROR_BREAK(64); /*the length of the end code 256 must be larger than 0*/ + + /*now we've finally got HLIT and HDIST, so generate the code trees, and the function is done*/ + error = HuffmanTree_makeFromLengths(tree_ll, bitlen_ll, NUM_DEFLATE_CODE_SYMBOLS, 15); + if(error) break; + error = HuffmanTree_makeFromLengths(tree_d, bitlen_d, NUM_DISTANCE_SYMBOLS, 15); + + break; /*end of error-while*/ + } + + lodepng_free(bitlen_cl); + lodepng_free(bitlen_ll); + lodepng_free(bitlen_d); + HuffmanTree_cleanup(&tree_cl); + + return error; +} + +/*inflate a block with dynamic of fixed Huffman tree. btype must be 1 or 2.*/ +static unsigned inflateHuffmanBlock(ucvector * out, LodePNGBitReader * reader, + unsigned btype, size_t max_output_size) +{ + unsigned error = 0; + HuffmanTree tree_ll; /*the huffman tree for literal and length codes*/ + HuffmanTree tree_d; /*the huffman tree for distance codes*/ + const size_t reserved_size = + 260; /* must be at least 258 for max length, and a few extra for adding a few extra literals */ + int done = 0; + + if(!ucvector_reserve(out, out->size + reserved_size)) return 83; /*alloc fail*/ + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + if(btype == 1) error = getTreeInflateFixed(&tree_ll, &tree_d); + else /*if(btype == 2)*/ error = getTreeInflateDynamic(&tree_ll, &tree_d, reader); + + + while(!error && !done) { /*decode all symbols until end reached, breaks at end code*/ + /*code_ll is literal, length or end code*/ + unsigned code_ll; + /* ensure enough bits for 2 huffman code reads (15 bits each): if the first is a literal, a second literal is read at once. This + appears to be slightly faster, than ensuring 20 bits here for 1 huffman symbol and the potential 5 extra bits for the length symbol.*/ + ensureBits32(reader, 30); + code_ll = huffmanDecodeSymbol(reader, &tree_ll); + if(code_ll <= 255) { + /*slightly faster code path if multiple literals in a row*/ + out->data[out->size++] = (unsigned char)code_ll; + code_ll = huffmanDecodeSymbol(reader, &tree_ll); + } + if(code_ll <= 255) { /*literal symbol*/ + out->data[out->size++] = (unsigned char)code_ll; + } + else if(code_ll >= FIRST_LENGTH_CODE_INDEX && code_ll <= LAST_LENGTH_CODE_INDEX) { /*length code*/ + unsigned code_d, distance; + unsigned numextrabits_l, numextrabits_d; /*extra bits for length and distance*/ + size_t start, backward, length; + + /*part 1: get length base*/ + length = LENGTHBASE[code_ll - FIRST_LENGTH_CODE_INDEX]; + + /*part 2: get extra bits and add the value of that to length*/ + numextrabits_l = LENGTHEXTRA[code_ll - FIRST_LENGTH_CODE_INDEX]; + if(numextrabits_l != 0) { + /* bits already ensured above */ + ensureBits25(reader, 5); + length += readBits(reader, numextrabits_l); + } + + /*part 3: get distance code*/ + ensureBits32(reader, 28); /* up to 15 for the huffman symbol, up to 13 for the extra bits */ + code_d = huffmanDecodeSymbol(reader, &tree_d); + if(code_d > 29) { + if(code_d <= 31) { + ERROR_BREAK(18); /*error: invalid distance code (30-31 are never used)*/ + } + else { /* if(code_d == INVALIDSYMBOL) */ + ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ + } + } + distance = DISTANCEBASE[code_d]; + + /*part 4: get extra bits from distance*/ + numextrabits_d = DISTANCEEXTRA[code_d]; + if(numextrabits_d != 0) { + /* bits already ensured above */ + distance += readBits(reader, numextrabits_d); + } + + /*part 5: fill in all the out[n] values based on the length and dist*/ + start = out->size; + if(distance > start) ERROR_BREAK(52); /*too long backward distance*/ + backward = start - distance; + + out->size += length; + if(distance < length) { + size_t forward; + lodepng_memcpy(out->data + start, out->data + backward, distance); + start += distance; + for(forward = distance; forward < length; ++forward) { + out->data[start++] = out->data[backward++]; + } + } + else { + lodepng_memcpy(out->data + start, out->data + backward, length); + } + } + else if(code_ll == 256) { + done = 1; /*end code, finish the loop*/ + } + else { /*if(code_ll == INVALIDSYMBOL)*/ + ERROR_BREAK(16); /*error: tried to read disallowed huffman symbol*/ + } + if(out->allocsize - out->size < reserved_size) { + if(!ucvector_reserve(out, out->size + reserved_size)) ERROR_BREAK(83); /*alloc fail*/ + } + /*check if any of the ensureBits above went out of bounds*/ + if(reader->bp > reader->bitsize) { + /*return error code 10 or 11 depending on the situation that happened in huffmanDecodeSymbol + (10=no endcode, 11=wrong jump outside of tree)*/ + /* TODO: revise error codes 10,11,50: the above comment is no longer valid */ + ERROR_BREAK(51); /*error, bit pointer jumps past memory*/ + } + if(max_output_size && out->size > max_output_size) { + ERROR_BREAK(109); /*error, larger than max size*/ + } + } + + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned inflateNoCompression(ucvector * out, LodePNGBitReader * reader, + const LodePNGDecompressSettings * settings) +{ + size_t bytepos; + size_t size = reader->size; + unsigned LEN, NLEN, error = 0; + + /*go to first boundary of byte*/ + bytepos = (reader->bp + 7u) >> 3u; + + /*read LEN (2 bytes) and NLEN (2 bytes)*/ + if(bytepos + 4 >= size) return 52; /*error, bit pointer will jump past memory*/ + LEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); + bytepos += 2; + NLEN = (unsigned)reader->data[bytepos] + ((unsigned)reader->data[bytepos + 1] << 8u); + bytepos += 2; + + /*check if 16-bit NLEN is really the one's complement of LEN*/ + if(!settings->ignore_nlen && LEN + NLEN != 65535) { + return 21; /*error: NLEN is not one's complement of LEN*/ + } + + if(!ucvector_resize(out, out->size + LEN)) return 83; /*alloc fail*/ + + /*read the literal data: LEN bytes are now stored in the out buffer*/ + if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/ + + /*out->data can be NULL (when LEN is zero), and arithmetics on NULL ptr is undefined*/ + if(LEN) { + lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN); + bytepos += LEN; + } + + reader->bp = bytepos << 3u; + + return error; +} + +static unsigned lodepng_inflatev(ucvector * out, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings) +{ + unsigned BFINAL = 0; + LodePNGBitReader reader; + unsigned error = LodePNGBitReader_init(&reader, in, insize); + + if(error) return error; + + while(!BFINAL) { + unsigned BTYPE; + if(reader.bitsize - reader.bp < 3) return 52; /*error, bit pointer will jump past memory*/ + ensureBits9(&reader, 3); + BFINAL = readBits(&reader, 1); + BTYPE = readBits(&reader, 2); + + if(BTYPE == 3) return 20; /*error: invalid BTYPE*/ + else if(BTYPE == 0) error = inflateNoCompression(out, &reader, settings); /*no compression*/ + else error = inflateHuffmanBlock(out, &reader, BTYPE, settings->max_output_size); /*compression, BTYPE 01 or 10*/ + if(!error && settings->max_output_size && out->size > settings->max_output_size) error = 109; + if(error) break; + } + + return error; +} + +unsigned lodepng_inflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings) +{ + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_inflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned inflatev(ucvector * out, const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings) +{ + if(settings->custom_inflate) { + unsigned error = settings->custom_inflate(&out->data, &out->size, in, insize, settings); + out->allocsize = out->size; + if(error) { + /*the custom inflate is allowed to have its own error codes, however, we translate it to code 110*/ + error = 110; + /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ + if(settings->max_output_size && out->size > settings->max_output_size) error = 109; + } + return error; + } + else { + return lodepng_inflatev(out, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Deflator (Compressor) / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static const unsigned MAX_SUPPORTED_DEFLATE_LENGTH = 258; + +/*search the index in the array, that has the largest value smaller than or equal to the given value, +given array must be sorted (if no value is smaller, it returns the size of the given array)*/ +static size_t searchCodeIndex(const unsigned * array, size_t array_size, size_t value) +{ + /*binary search (only small gain over linear). TODO: use CPU log2 instruction for getting symbols instead*/ + size_t left = 1; + size_t right = array_size - 1; + + while(left <= right) { + size_t mid = (left + right) >> 1; + if(array[mid] >= value) right = mid - 1; + else left = mid + 1; + } + if(left >= array_size || array[left] > value) left--; + return left; +} + +static void addLengthDistance(uivector * values, size_t length, size_t distance) +{ + /*values in encoded vector are those used by deflate: + 0-255: literal bytes + 256: end + 257-285: length/distance pair (length code, followed by extra length bits, distance code, extra distance bits) + 286-287: invalid*/ + + unsigned length_code = (unsigned)searchCodeIndex(LENGTHBASE, 29, length); + unsigned extra_length = (unsigned)(length - LENGTHBASE[length_code]); + unsigned dist_code = (unsigned)searchCodeIndex(DISTANCEBASE, 30, distance); + unsigned extra_distance = (unsigned)(distance - DISTANCEBASE[dist_code]); + + size_t pos = values->size; + /*TODO: return error when this fails (out of memory)*/ + unsigned ok = uivector_resize(values, values->size + 4); + if(ok) { + values->data[pos + 0] = length_code + FIRST_LENGTH_CODE_INDEX; + values->data[pos + 1] = extra_length; + values->data[pos + 2] = dist_code; + values->data[pos + 3] = extra_distance; + } +} + +/*3 bytes of data get encoded into two bytes. The hash cannot use more than 3 +bytes as input because 3 is the minimum match length for deflate*/ +static const unsigned HASH_NUM_VALUES = 65536; +static const unsigned HASH_BIT_MASK = 65535; /*HASH_NUM_VALUES - 1, but C90 does not like that as initializer*/ + +typedef struct Hash { + int * head; /*hash value to head circular pos - can be outdated if went around window*/ + /*circular pos to prev circular pos*/ + unsigned short * chain; + int * val; /*circular pos to hash value*/ + + /*TODO: do this not only for zeros but for any repeated byte. However for PNG + it's always going to be the zeros that dominate, so not important for PNG*/ + int * headz; /*similar to head, but for chainz*/ + unsigned short * chainz; /*those with same amount of zeros*/ + unsigned short * zeros; /*length of zeros streak, used as a second hash chain*/ +} Hash; + +static unsigned hash_init(Hash * hash, unsigned windowsize) +{ + unsigned i; + hash->head = (int *)lodepng_malloc(sizeof(int) * HASH_NUM_VALUES); + hash->val = (int *)lodepng_malloc(sizeof(int) * windowsize); + hash->chain = (unsigned short *)lodepng_malloc(sizeof(unsigned short) * windowsize); + + hash->zeros = (unsigned short *)lodepng_malloc(sizeof(unsigned short) * windowsize); + hash->headz = (int *)lodepng_malloc(sizeof(int) * (MAX_SUPPORTED_DEFLATE_LENGTH + 1)); + hash->chainz = (unsigned short *)lodepng_malloc(sizeof(unsigned short) * windowsize); + + if(!hash->head || !hash->chain || !hash->val || !hash->headz || !hash->chainz || !hash->zeros) { + return 83; /*alloc fail*/ + } + + /*initialize hash table*/ + for(i = 0; i != HASH_NUM_VALUES; ++i) hash->head[i] = -1; + for(i = 0; i != windowsize; ++i) hash->val[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chain[i] = i; /*same value as index indicates uninitialized*/ + + for(i = 0; i <= MAX_SUPPORTED_DEFLATE_LENGTH; ++i) hash->headz[i] = -1; + for(i = 0; i != windowsize; ++i) hash->chainz[i] = i; /*same value as index indicates uninitialized*/ + + return 0; +} + +static void hash_cleanup(Hash * hash) +{ + lodepng_free(hash->head); + lodepng_free(hash->val); + lodepng_free(hash->chain); + + lodepng_free(hash->zeros); + lodepng_free(hash->headz); + lodepng_free(hash->chainz); +} + + + +static unsigned getHash(const unsigned char * data, size_t size, size_t pos) +{ + unsigned result = 0; + if(pos + 2 < size) { + /*A simple shift and xor hash is used. Since the data of PNGs is dominated + by zeroes due to the filters, a better hash does not have a significant + effect on speed in traversing the chain, and causes more time spend on + calculating the hash.*/ + result ^= ((unsigned)data[pos + 0] << 0u); + result ^= ((unsigned)data[pos + 1] << 4u); + result ^= ((unsigned)data[pos + 2] << 8u); + } + else { + size_t amount, i; + if(pos >= size) return 0; + amount = size - pos; + for(i = 0; i != amount; ++i) result ^= ((unsigned)data[pos + i] << (i * 8u)); + } + return result & HASH_BIT_MASK; +} + +static unsigned countZeros(const unsigned char * data, size_t size, size_t pos) +{ + const unsigned char * start = data + pos; + const unsigned char * end = start + MAX_SUPPORTED_DEFLATE_LENGTH; + if(end > data + size) end = data + size; + data = start; + while(data != end && *data == 0) ++data; + /*subtracting two addresses returned as 32-bit number (max value is MAX_SUPPORTED_DEFLATE_LENGTH)*/ + return (unsigned)(data - start); +} + +/*wpos = pos & (windowsize - 1)*/ +static void updateHashChain(Hash * hash, size_t wpos, unsigned hashval, unsigned short numzeros) +{ + hash->val[wpos] = (int)hashval; + if(hash->head[hashval] != -1) hash->chain[wpos] = hash->head[hashval]; + hash->head[hashval] = (int)wpos; + + hash->zeros[wpos] = numzeros; + if(hash->headz[numzeros] != -1) hash->chainz[wpos] = hash->headz[numzeros]; + hash->headz[numzeros] = (int)wpos; +} + +/* +LZ77-encode the data. Return value is error code. The input are raw bytes, the output +is in the form of unsigned integers with codes representing for example literal bytes, or +length/distance pairs. +It uses a hash table technique to let it encode faster. When doing LZ77 encoding, a +sliding window (of windowsize) is used, and all past bytes in that window can be used as +the "dictionary". A brute force search through all possible distances would be slow, and +this hash technique is one out of several ways to speed this up. +*/ +static unsigned encodeLZ77(uivector * out, Hash * hash, + const unsigned char * in, size_t inpos, size_t insize, unsigned windowsize, + unsigned minmatch, unsigned nicematch, unsigned lazymatching) +{ + size_t pos; + unsigned i, error = 0; + /*for large window lengths, assume the user wants no compression loss. Otherwise, max hash chain length speedup.*/ + unsigned maxchainlength = windowsize >= 8192 ? windowsize : windowsize / 8u; + unsigned maxlazymatch = windowsize >= 8192 ? MAX_SUPPORTED_DEFLATE_LENGTH : 64; + + unsigned usezeros = 1; /*not sure if setting it to false for windowsize < 8192 is better or worse*/ + unsigned numzeros = 0; + + unsigned offset; /*the offset represents the distance in LZ77 terminology*/ + unsigned length; + unsigned lazy = 0; + unsigned lazylength = 0, lazyoffset = 0; + unsigned hashval; + unsigned current_offset, current_length; + unsigned prev_offset; + const unsigned char * lastptr, * foreptr, * backptr; + unsigned hashpos; + + if(windowsize == 0 || windowsize > 32768) return 60; /*error: windowsize smaller/larger than allowed*/ + if((windowsize & (windowsize - 1)) != 0) return 90; /*error: must be power of two*/ + + if(nicematch > MAX_SUPPORTED_DEFLATE_LENGTH) nicematch = MAX_SUPPORTED_DEFLATE_LENGTH; + + for(pos = inpos; pos < insize; ++pos) { + size_t wpos = pos & (windowsize - 1); /*position for in 'circular' hash buffers*/ + unsigned chainlength = 0; + + hashval = getHash(in, insize, pos); + + if(usezeros && hashval == 0) { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } + else { + numzeros = 0; + } + + updateHashChain(hash, wpos, hashval, numzeros); + + /*the length and offset found for the current position*/ + length = 0; + offset = 0; + + hashpos = hash->chain[wpos]; + + lastptr = &in[insize < pos + MAX_SUPPORTED_DEFLATE_LENGTH ? insize : pos + MAX_SUPPORTED_DEFLATE_LENGTH]; + + /*search for the longest string*/ + prev_offset = 0; + for(;;) { + if(chainlength++ >= maxchainlength) break; + current_offset = (unsigned)(hashpos <= wpos ? wpos - hashpos : wpos - hashpos + windowsize); + + if(current_offset < prev_offset) break; /*stop when went completely around the circular buffer*/ + prev_offset = current_offset; + if(current_offset > 0) { + /*test the next characters*/ + foreptr = &in[pos]; + backptr = &in[pos - current_offset]; + + /*common case in PNGs is lots of zeros. Quickly skip over them as a speedup*/ + if(numzeros >= 3) { + unsigned skip = hash->zeros[hashpos]; + if(skip > numzeros) skip = numzeros; + backptr += skip; + foreptr += skip; + } + + while(foreptr != lastptr && *backptr == *foreptr) { /*maximum supported length by deflate is max length*/ + ++backptr; + ++foreptr; + } + current_length = (unsigned)(foreptr - &in[pos]); + + if(current_length > length) { + length = current_length; /*the longest length*/ + offset = current_offset; /*the offset that is related to this longest length*/ + /*jump out once a length of max length is found (speed gain). This also jumps + out if length is MAX_SUPPORTED_DEFLATE_LENGTH*/ + if(current_length >= nicematch) break; + } + } + + if(hashpos == hash->chain[hashpos]) break; + + if(numzeros >= 3 && length > numzeros) { + hashpos = hash->chainz[hashpos]; + if(hash->zeros[hashpos] != numzeros) break; + } + else { + hashpos = hash->chain[hashpos]; + /*outdated hash value, happens if particular value was not encountered in whole last window*/ + if(hash->val[hashpos] != (int)hashval) break; + } + } + + if(lazymatching) { + if(!lazy && length >= 3 && length <= maxlazymatch && length < MAX_SUPPORTED_DEFLATE_LENGTH) { + lazy = 1; + lazylength = length; + lazyoffset = offset; + continue; /*try the next byte*/ + } + if(lazy) { + lazy = 0; + if(pos == 0) ERROR_BREAK(81); + if(length > lazylength + 1) { + /*push the previous character as literal*/ + if(!uivector_push_back(out, in[pos - 1])) ERROR_BREAK(83 /*alloc fail*/); + } + else { + length = lazylength; + offset = lazyoffset; + hash->head[hashval] = -1; /*the same hashchain update will be done, this ensures no wrong alteration*/ + hash->headz[numzeros] = -1; /*idem*/ + --pos; + } + } + } + if(length >= 3 && offset > windowsize) ERROR_BREAK(86 /*too big (or overflown negative) offset*/); + + /*encode it as length/distance pair or literal value*/ + if(length < 3) { /*only lengths of 3 or higher are supported as length/distance pair*/ + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else if(length < minmatch || (length == 3 && offset > 4096)) { + /*compensate for the fact that longer offsets have more extra bits, a + length of only 3 may be not worth it then*/ + if(!uivector_push_back(out, in[pos])) ERROR_BREAK(83 /*alloc fail*/); + } + else { + addLengthDistance(out, length, offset); + for(i = 1; i < length; ++i) { + ++pos; + wpos = pos & (windowsize - 1); + hashval = getHash(in, insize, pos); + if(usezeros && hashval == 0) { + if(numzeros == 0) numzeros = countZeros(in, insize, pos); + else if(pos + numzeros > insize || in[pos + numzeros - 1] != 0) --numzeros; + } + else { + numzeros = 0; + } + updateHashChain(hash, wpos, hashval, numzeros); + } + } + } /*end of the loop through each character of input*/ + + return error; +} + +/* /////////////////////////////////////////////////////////////////////////// */ + +static unsigned deflateNoCompression(ucvector * out, const unsigned char * data, size_t datasize) +{ + /*non compressed deflate block data: 1 bit BFINAL,2 bits BTYPE,(5 bits): it jumps to start of next byte, + 2 bytes LEN, 2 bytes NLEN, LEN bytes literal DATA*/ + + size_t i, numdeflateblocks = (datasize + 65534u) / 65535u; + unsigned datapos = 0; + for(i = 0; i != numdeflateblocks; ++i) { + unsigned BFINAL, BTYPE, LEN, NLEN; + unsigned char firstbyte; + size_t pos = out->size; + + BFINAL = (i == numdeflateblocks - 1); + BTYPE = 0; + + LEN = 65535; + if(datasize - datapos < 65535u) LEN = (unsigned)datasize - datapos; + NLEN = 65535 - LEN; + + if(!ucvector_resize(out, out->size + LEN + 5)) return 83; /*alloc fail*/ + + firstbyte = (unsigned char)(BFINAL + ((BTYPE & 1u) << 1u) + ((BTYPE & 2u) << 1u)); + out->data[pos + 0] = firstbyte; + out->data[pos + 1] = (unsigned char)(LEN & 255); + out->data[pos + 2] = (unsigned char)(LEN >> 8u); + out->data[pos + 3] = (unsigned char)(NLEN & 255); + out->data[pos + 4] = (unsigned char)(NLEN >> 8u); + lodepng_memcpy(out->data + pos + 5, data + datapos, LEN); + datapos += LEN; + } + + return 0; +} + +/* +write the lz77-encoded data, which has lit, len and dist codes, to compressed stream using huffman trees. +tree_ll: the tree for lit and len codes. +tree_d: the tree for distance codes. +*/ +static void writeLZ77data(LodePNGBitWriter * writer, const uivector * lz77_encoded, + const HuffmanTree * tree_ll, const HuffmanTree * tree_d) +{ + size_t i = 0; + for(i = 0; i != lz77_encoded->size; ++i) { + unsigned val = lz77_encoded->data[i]; + writeBitsReversed(writer, tree_ll->codes[val], tree_ll->lengths[val]); + if(val > 256) { /*for a length code, 3 more things have to be added*/ + unsigned length_index = val - FIRST_LENGTH_CODE_INDEX; + unsigned n_length_extra_bits = LENGTHEXTRA[length_index]; + unsigned length_extra_bits = lz77_encoded->data[++i]; + + unsigned distance_code = lz77_encoded->data[++i]; + + unsigned distance_index = distance_code; + unsigned n_distance_extra_bits = DISTANCEEXTRA[distance_index]; + unsigned distance_extra_bits = lz77_encoded->data[++i]; + + writeBits(writer, length_extra_bits, n_length_extra_bits); + writeBitsReversed(writer, tree_d->codes[distance_code], tree_d->lengths[distance_code]); + writeBits(writer, distance_extra_bits, n_distance_extra_bits); + } + } +} + +/*Deflate for a block of type "dynamic", that is, with freely, optimally, created huffman trees*/ +static unsigned deflateDynamic(LodePNGBitWriter * writer, Hash * hash, + const unsigned char * data, size_t datapos, size_t dataend, + const LodePNGCompressSettings * settings, unsigned final) +{ + unsigned error = 0; + + /* + A block is compressed as follows: The PNG data is lz77 encoded, resulting in + literal bytes and length/distance pairs. This is then huffman compressed with + two huffman trees. One huffman tree is used for the lit and len values ("ll"), + another huffman tree is used for the dist values ("d"). These two trees are + stored using their code lengths, and to compress even more these code lengths + are also run-length encoded and huffman compressed. This gives a huffman tree + of code lengths "cl". The code lengths used to describe this third tree are + the code length code lengths ("clcl"). + */ + + /*The lz77 encoded data, represented with integers since there will also be length and distance codes in it*/ + uivector lz77_encoded; + HuffmanTree tree_ll; /*tree for lit,len values*/ + HuffmanTree tree_d; /*tree for distance codes*/ + HuffmanTree tree_cl; /*tree for encoding the code lengths representing tree_ll and tree_d*/ + unsigned * frequencies_ll = 0; /*frequency of lit,len codes*/ + unsigned * frequencies_d = 0; /*frequency of dist codes*/ + unsigned * frequencies_cl = 0; /*frequency of code length codes*/ + unsigned * bitlen_lld = 0; /*lit,len,dist code lengths (int bits), literally (without repeat codes).*/ + unsigned * bitlen_lld_e = 0; /*bitlen_lld encoded with repeat codes (this is a rudimentary run length compression)*/ + size_t datasize = dataend - datapos; + + /* + If we could call "bitlen_cl" the code length code lengths ("clcl"), that is the bit lengths of codes to represent + tree_cl in CLCL_ORDER, then due to the huffman compression of huffman tree representations ("two levels"), there are + some analogies: + bitlen_lld is to tree_cl what data is to tree_ll and tree_d. + bitlen_lld_e is to bitlen_lld what lz77_encoded is to data. + bitlen_cl is to bitlen_lld_e what bitlen_lld is to lz77_encoded. + */ + + unsigned BFINAL = final; + size_t i; + size_t numcodes_ll, numcodes_d, numcodes_lld, numcodes_lld_e, numcodes_cl; + unsigned HLIT, HDIST, HCLEN; + + uivector_init(&lz77_encoded); + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + HuffmanTree_init(&tree_cl); + /* could fit on stack, but >1KB is on the larger side so allocate instead */ + frequencies_ll = (unsigned *)lodepng_malloc(286 * sizeof(*frequencies_ll)); + frequencies_d = (unsigned *)lodepng_malloc(30 * sizeof(*frequencies_d)); + frequencies_cl = (unsigned *)lodepng_malloc(NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); + + if(!frequencies_ll || !frequencies_d || !frequencies_cl) error = 83; /*alloc fail*/ + + /*This while loop never loops due to a break at the end, it is here to + allow breaking out of it to the cleanup phase on error conditions.*/ + while(!error) { + lodepng_memset(frequencies_ll, 0, 286 * sizeof(*frequencies_ll)); + lodepng_memset(frequencies_d, 0, 30 * sizeof(*frequencies_d)); + lodepng_memset(frequencies_cl, 0, NUM_CODE_LENGTH_CODES * sizeof(*frequencies_cl)); + + if(settings->use_lz77) { + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(error) break; + } + else { + if(!uivector_resize(&lz77_encoded, datasize)) ERROR_BREAK(83 /*alloc fail*/); + for(i = datapos; i < dataend; + ++i) lz77_encoded.data[i - datapos] = data[i]; /*no LZ77, but still will be Huffman compressed*/ + } + + /*Count the frequencies of lit, len and dist codes*/ + for(i = 0; i != lz77_encoded.size; ++i) { + unsigned symbol = lz77_encoded.data[i]; + ++frequencies_ll[symbol]; + if(symbol > 256) { + unsigned dist = lz77_encoded.data[i + 2]; + ++frequencies_d[dist]; + i += 3; + } + } + frequencies_ll[256] = 1; /*there will be exactly 1 end code, at the end of the block*/ + + /*Make both huffman trees, one for the lit and len codes, one for the dist codes*/ + error = HuffmanTree_makeFromFrequencies(&tree_ll, frequencies_ll, 257, 286, 15); + if(error) break; + /*2, not 1, is chosen for mincodes: some buggy PNG decoders require at least 2 symbols in the dist tree*/ + error = HuffmanTree_makeFromFrequencies(&tree_d, frequencies_d, 2, 30, 15); + if(error) break; + + numcodes_ll = LODEPNG_MIN(tree_ll.numcodes, 286); + numcodes_d = LODEPNG_MIN(tree_d.numcodes, 30); + /*store the code lengths of both generated trees in bitlen_lld*/ + numcodes_lld = numcodes_ll + numcodes_d; + bitlen_lld = (unsigned *)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld)); + /*numcodes_lld_e never needs more size than bitlen_lld*/ + bitlen_lld_e = (unsigned *)lodepng_malloc(numcodes_lld * sizeof(*bitlen_lld_e)); + if(!bitlen_lld || !bitlen_lld_e) ERROR_BREAK(83); /*alloc fail*/ + numcodes_lld_e = 0; + + for(i = 0; i != numcodes_ll; ++i) bitlen_lld[i] = tree_ll.lengths[i]; + for(i = 0; i != numcodes_d; ++i) bitlen_lld[numcodes_ll + i] = tree_d.lengths[i]; + + /*run-length compress bitlen_ldd into bitlen_lld_e by using repeat codes 16 (copy length 3-6 times), + 17 (3-10 zeroes), 18 (11-138 zeroes)*/ + for(i = 0; i != numcodes_lld; ++i) { + unsigned j = 0; /*amount of repetitions*/ + while(i + j + 1 < numcodes_lld && bitlen_lld[i + j + 1] == bitlen_lld[i]) ++j; + + if(bitlen_lld[i] == 0 && j >= 2) { /*repeat code for zeroes*/ + ++j; /*include the first zero*/ + if(j <= 10) { /*repeat code 17 supports max 10 zeroes*/ + bitlen_lld_e[numcodes_lld_e++] = 17; + bitlen_lld_e[numcodes_lld_e++] = j - 3; + } + else { /*repeat code 18 supports max 138 zeroes*/ + if(j > 138) j = 138; + bitlen_lld_e[numcodes_lld_e++] = 18; + bitlen_lld_e[numcodes_lld_e++] = j - 11; + } + i += (j - 1); + } + else if(j >= 3) { /*repeat code for value other than zero*/ + size_t k; + unsigned num = j / 6u, rest = j % 6u; + bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; + for(k = 0; k < num; ++k) { + bitlen_lld_e[numcodes_lld_e++] = 16; + bitlen_lld_e[numcodes_lld_e++] = 6 - 3; + } + if(rest >= 3) { + bitlen_lld_e[numcodes_lld_e++] = 16; + bitlen_lld_e[numcodes_lld_e++] = rest - 3; + } + else j -= rest; + i += j; + } + else { /*too short to benefit from repeat code*/ + bitlen_lld_e[numcodes_lld_e++] = bitlen_lld[i]; + } + } + + /*generate tree_cl, the huffmantree of huffmantrees*/ + for(i = 0; i != numcodes_lld_e; ++i) { + ++frequencies_cl[bitlen_lld_e[i]]; + /*after a repeat code come the bits that specify the number of repetitions, + those don't need to be in the frequencies_cl calculation*/ + if(bitlen_lld_e[i] >= 16) ++i; + } + + error = HuffmanTree_makeFromFrequencies(&tree_cl, frequencies_cl, + NUM_CODE_LENGTH_CODES, NUM_CODE_LENGTH_CODES, 7); + if(error) break; + + /*compute amount of code-length-code-lengths to output*/ + numcodes_cl = NUM_CODE_LENGTH_CODES; + /*trim zeros at the end (using CLCL_ORDER), but minimum size must be 4 (see HCLEN below)*/ + while(numcodes_cl > 4u && tree_cl.lengths[CLCL_ORDER[numcodes_cl - 1u]] == 0) { + numcodes_cl--; + } + + /* + Write everything into the output + + After the BFINAL and BTYPE, the dynamic block consists out of the following: + - 5 bits HLIT, 5 bits HDIST, 4 bits HCLEN + - (HCLEN+4)*3 bits code lengths of code length alphabet + - HLIT + 257 code lengths of lit/length alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - HDIST + 1 code lengths of distance alphabet (encoded using the code length + alphabet, + possible repetition codes 16, 17, 18) + - compressed data + - 256 (end code) + */ + + /*Write block type*/ + writeBits(writer, BFINAL, 1); + writeBits(writer, 0, 1); /*first bit of BTYPE "dynamic"*/ + writeBits(writer, 1, 1); /*second bit of BTYPE "dynamic"*/ + + /*write the HLIT, HDIST and HCLEN values*/ + /*all three sizes take trimmed ending zeroes into account, done either by HuffmanTree_makeFromFrequencies + or in the loop for numcodes_cl above, which saves space. */ + HLIT = (unsigned)(numcodes_ll - 257); + HDIST = (unsigned)(numcodes_d - 1); + HCLEN = (unsigned)(numcodes_cl - 4); + writeBits(writer, HLIT, 5); + writeBits(writer, HDIST, 5); + writeBits(writer, HCLEN, 4); + + /*write the code lengths of the code length alphabet ("bitlen_cl")*/ + for(i = 0; i != numcodes_cl; ++i) writeBits(writer, tree_cl.lengths[CLCL_ORDER[i]], 3); + + /*write the lengths of the lit/len AND the dist alphabet*/ + for(i = 0; i != numcodes_lld_e; ++i) { + writeBitsReversed(writer, tree_cl.codes[bitlen_lld_e[i]], tree_cl.lengths[bitlen_lld_e[i]]); + /*extra bits of repeat codes*/ + if(bitlen_lld_e[i] == 16) writeBits(writer, bitlen_lld_e[++i], 2); + else if(bitlen_lld_e[i] == 17) writeBits(writer, bitlen_lld_e[++i], 3); + else if(bitlen_lld_e[i] == 18) writeBits(writer, bitlen_lld_e[++i], 7); + } + + /*write the compressed data symbols*/ + writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); + /*error: the length of the end code 256 must be larger than 0*/ + if(tree_ll.lengths[256] == 0) ERROR_BREAK(64); + + /*write the end code*/ + writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]); + + break; /*end of error-while*/ + } + + /*cleanup*/ + uivector_cleanup(&lz77_encoded); + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + HuffmanTree_cleanup(&tree_cl); + lodepng_free(frequencies_ll); + lodepng_free(frequencies_d); + lodepng_free(frequencies_cl); + lodepng_free(bitlen_lld); + lodepng_free(bitlen_lld_e); + + return error; +} + +static unsigned deflateFixed(LodePNGBitWriter * writer, Hash * hash, + const unsigned char * data, + size_t datapos, size_t dataend, + const LodePNGCompressSettings * settings, unsigned final) +{ + HuffmanTree tree_ll; /*tree for literal values and length codes*/ + HuffmanTree tree_d; /*tree for distance codes*/ + + unsigned BFINAL = final; + unsigned error = 0; + size_t i; + + HuffmanTree_init(&tree_ll); + HuffmanTree_init(&tree_d); + + error = generateFixedLitLenTree(&tree_ll); + if(!error) error = generateFixedDistanceTree(&tree_d); + + if(!error) { + writeBits(writer, BFINAL, 1); + writeBits(writer, 1, 1); /*first bit of BTYPE*/ + writeBits(writer, 0, 1); /*second bit of BTYPE*/ + + if(settings->use_lz77) { /*LZ77 encoded*/ + uivector lz77_encoded; + uivector_init(&lz77_encoded); + error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, + settings->minmatch, settings->nicematch, settings->lazymatching); + if(!error) writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); + uivector_cleanup(&lz77_encoded); + } + else { /*no LZ77, but still will be Huffman compressed*/ + for(i = datapos; i < dataend; ++i) { + writeBitsReversed(writer, tree_ll.codes[data[i]], tree_ll.lengths[data[i]]); + } + } + /*add END code*/ + if(!error) writeBitsReversed(writer, tree_ll.codes[256], tree_ll.lengths[256]); + } + + /*cleanup*/ + HuffmanTree_cleanup(&tree_ll); + HuffmanTree_cleanup(&tree_d); + + return error; +} + +static unsigned lodepng_deflatev(ucvector * out, const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings) +{ + unsigned error = 0; + size_t i, blocksize, numdeflateblocks; + Hash hash; + LodePNGBitWriter writer; + + LodePNGBitWriter_init(&writer, out); + + if(settings->btype > 2) return 61; + else if(settings->btype == 0) return deflateNoCompression(out, in, insize); + else if(settings->btype == 1) blocksize = insize; + else { /*if(settings->btype == 2)*/ + /*on PNGs, deflate blocks of 65-262k seem to give most dense encoding*/ + blocksize = insize / 8u + 8; + if(blocksize < 65536) blocksize = 65536; + if(blocksize > 262144) blocksize = 262144; + } + + numdeflateblocks = (insize + blocksize - 1) / blocksize; + if(numdeflateblocks == 0) numdeflateblocks = 1; + + error = hash_init(&hash, settings->windowsize); + + if(!error) { + for(i = 0; i != numdeflateblocks && !error; ++i) { + unsigned final = (i == numdeflateblocks - 1); + size_t start = i * blocksize; + size_t end = start + blocksize; + if(end > insize) end = insize; + + if(settings->btype == 1) error = deflateFixed(&writer, &hash, in, start, end, settings, final); + else if(settings->btype == 2) error = deflateDynamic(&writer, &hash, in, start, end, settings, final); + } + } + + hash_cleanup(&hash); + + return error; +} + +unsigned lodepng_deflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings) +{ + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_deflatev(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +static unsigned deflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings) +{ + if(settings->custom_deflate) { + unsigned error = settings->custom_deflate(out, outsize, in, insize, settings); + /*the custom deflate is allowed to have its own error codes, however, we translate it to code 111*/ + return error ? 111 : 0; + } + else { + return lodepng_deflate(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Adler32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +static unsigned update_adler32(unsigned adler, const unsigned char * data, unsigned len) +{ + unsigned s1 = adler & 0xffffu; + unsigned s2 = (adler >> 16u) & 0xffffu; + + while(len != 0u) { + unsigned i; + /*at least 5552 sums can be done before the sums overflow, saving a lot of module divisions*/ + unsigned amount = len > 5552u ? 5552u : len; + len -= amount; + for(i = 0; i != amount; ++i) { + s1 += (*data++); + s2 += s1; + } + s1 %= 65521u; + s2 %= 65521u; + } + + return (s2 << 16u) | s1; +} + +/*Return the adler32 of the bytes data[0..len-1]*/ +static unsigned adler32(const unsigned char * data, unsigned len) +{ + return update_adler32(1u, data, len); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Zlib / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_DECODER + +static unsigned lodepng_zlib_decompressv(ucvector * out, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings) +{ + unsigned error = 0; + unsigned CM, CINFO, FDICT; + + if(insize < 2) return 53; /*error, size of zlib data too small*/ + /*read information from zlib header*/ + if((in[0] * 256 + in[1]) % 31 != 0) { + /*error: 256 * in[0] + in[1] must be a multiple of 31, the FCHECK value is supposed to be made that way*/ + return 24; + } + + CM = in[0] & 15; + CINFO = (in[0] >> 4) & 15; + /*FCHECK = in[1] & 31;*/ /*FCHECK is already tested above*/ + FDICT = (in[1] >> 5) & 1; + /*FLEVEL = (in[1] >> 6) & 3;*/ /*FLEVEL is not used here*/ + + if(CM != 8 || CINFO > 7) { + /*error: only compression method 8: inflate with sliding window of 32k is supported by the PNG spec*/ + return 25; + } + if(FDICT != 0) { + /*error: the specification of PNG says about the zlib stream: + "The additional flags shall not specify a preset dictionary."*/ + return 26; + } + + error = inflatev(out, in + 2, insize - 2, settings); + if(error) return error; + + if(!settings->ignore_adler32) { + unsigned ADLER32 = lodepng_read32bitInt(&in[insize - 4]); + unsigned checksum = adler32(out->data, (unsigned)(out->size)); + if(checksum != ADLER32) return 58; /*error, adler checksum not correct, data must be corrupted*/ + } + + return 0; /*no error*/ +} + + +unsigned lodepng_zlib_decompress(unsigned char ** out, size_t * outsize, const unsigned char * in, + size_t insize, const LodePNGDecompressSettings * settings) +{ + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_zlib_decompressv(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + return error; +} + +/*expected_size is expected output size, to avoid intermediate allocations. Set to 0 if not known. */ +static unsigned zlib_decompress(unsigned char ** out, size_t * outsize, size_t expected_size, + const unsigned char * in, size_t insize, const LodePNGDecompressSettings * settings) +{ + unsigned error; + if(settings->custom_zlib) { + error = settings->custom_zlib(out, outsize, in, insize, settings); + if(error) { + /*the custom zlib is allowed to have its own error codes, however, we translate it to code 110*/ + error = 110; + /*if there's a max output size, and the custom zlib returned error, then indicate that error instead*/ + if(settings->max_output_size && *outsize > settings->max_output_size) error = 109; + } + } + else { + ucvector v = ucvector_init(*out, *outsize); + if(expected_size) { + /*reserve the memory to avoid intermediate reallocations*/ + ucvector_resize(&v, *outsize + expected_size); + v.size = *outsize; + } + error = lodepng_zlib_decompressv(&v, in, insize, settings); + *out = v.data; + *outsize = v.size; + } + return error; +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER + +unsigned lodepng_zlib_compress(unsigned char ** out, size_t * outsize, const unsigned char * in, + size_t insize, const LodePNGCompressSettings * settings) +{ + size_t i; + unsigned error; + unsigned char * deflatedata = 0; + size_t deflatesize = 0; + + error = deflate(&deflatedata, &deflatesize, in, insize, settings); + + *out = NULL; + *outsize = 0; + if(!error) { + *outsize = deflatesize + 6; + *out = (unsigned char *)lodepng_malloc(*outsize); + if(!*out) error = 83; /*alloc fail*/ + } + + if(!error) { + unsigned ADLER32 = adler32(in, (unsigned)insize); + /*zlib data: 1 byte CMF (CM+CINFO), 1 byte FLG, deflate data, 4 byte ADLER32 checksum of the Decompressed data*/ + unsigned CMF = 120; /*0b01111000: CM 8, CINFO 7. With CINFO 7, any window size up to 32768 can be used.*/ + unsigned FLEVEL = 0; + unsigned FDICT = 0; + unsigned CMFFLG = 256 * CMF + FDICT * 32 + FLEVEL * 64; + unsigned FCHECK = 31 - CMFFLG % 31; + CMFFLG += FCHECK; + + (*out)[0] = (unsigned char)(CMFFLG >> 8); + (*out)[1] = (unsigned char)(CMFFLG & 255); + for(i = 0; i != deflatesize; ++i)(*out)[i + 2] = deflatedata[i]; + lodepng_set32bitInt(&(*out)[*outsize - 4], ADLER32); + } + + lodepng_free(deflatedata); + return error; +} + +/* compress using the default or custom zlib function */ +static unsigned zlib_compress(unsigned char ** out, size_t * outsize, const unsigned char * in, + size_t insize, const LodePNGCompressSettings * settings) +{ + if(settings->custom_zlib) { + unsigned error = settings->custom_zlib(out, outsize, in, insize, settings); + /*the custom zlib is allowed to have its own error codes, however, we translate it to code 111*/ + return error ? 111 : 0; + } + else { + return lodepng_zlib_compress(out, outsize, in, insize, settings); + } +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#else /*no LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DECODER +static unsigned zlib_decompress(unsigned char ** out, size_t * outsize, size_t expected_size, + const unsigned char * in, size_t insize, const LodePNGDecompressSettings * settings) +{ + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + (void)expected_size; + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER +static unsigned zlib_compress(unsigned char ** out, size_t * outsize, const unsigned char * in, + size_t insize, const LodePNGCompressSettings * settings) +{ + if(!settings->custom_zlib) return 87; /*no custom zlib function provided */ + return settings->custom_zlib(out, outsize, in, insize, settings); +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#endif /*LODEPNG_COMPILE_ZLIB*/ + +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/*this is a good tradeoff between speed and compression ratio*/ +#define DEFAULT_WINDOWSIZE 2048 + +void lodepng_compress_settings_init(LodePNGCompressSettings * settings) +{ + /*compress with dynamic huffman tree (not in the mathematical sense, just not the predefined one)*/ + settings->btype = 2; + settings->use_lz77 = 1; + settings->windowsize = DEFAULT_WINDOWSIZE; + settings->minmatch = 3; + settings->nicematch = 128; + settings->lazymatching = 1; + + settings->custom_zlib = 0; + settings->custom_deflate = 0; + settings->custom_context = 0; +} + +const LodePNGCompressSettings lodepng_default_compress_settings = {2, 1, DEFAULT_WINDOWSIZE, 3, 128, 1, 0, 0, 0}; + + +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DECODER + +void lodepng_decompress_settings_init(LodePNGDecompressSettings * settings) +{ + settings->ignore_adler32 = 0; + settings->ignore_nlen = 0; + settings->max_output_size = 0; + + settings->custom_zlib = 0; + settings->custom_inflate = 0; + settings->custom_context = 0; +} + +const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, 0, 0, 0}; + +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // End of Zlib related code. Begin of PNG related code. // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_PNG + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / CRC32 / */ +/* ////////////////////////////////////////////////////////////////////////// */ + + +#ifdef LODEPNG_COMPILE_CRC + +static const unsigned lodepng_crc32_table0[256] = { + 0x00000000u, 0x77073096u, 0xee0e612cu, 0x990951bau, 0x076dc419u, 0x706af48fu, 0xe963a535u, 0x9e6495a3u, + 0x0edb8832u, 0x79dcb8a4u, 0xe0d5e91eu, 0x97d2d988u, 0x09b64c2bu, 0x7eb17cbdu, 0xe7b82d07u, 0x90bf1d91u, + 0x1db71064u, 0x6ab020f2u, 0xf3b97148u, 0x84be41deu, 0x1adad47du, 0x6ddde4ebu, 0xf4d4b551u, 0x83d385c7u, + 0x136c9856u, 0x646ba8c0u, 0xfd62f97au, 0x8a65c9ecu, 0x14015c4fu, 0x63066cd9u, 0xfa0f3d63u, 0x8d080df5u, + 0x3b6e20c8u, 0x4c69105eu, 0xd56041e4u, 0xa2677172u, 0x3c03e4d1u, 0x4b04d447u, 0xd20d85fdu, 0xa50ab56bu, + 0x35b5a8fau, 0x42b2986cu, 0xdbbbc9d6u, 0xacbcf940u, 0x32d86ce3u, 0x45df5c75u, 0xdcd60dcfu, 0xabd13d59u, + 0x26d930acu, 0x51de003au, 0xc8d75180u, 0xbfd06116u, 0x21b4f4b5u, 0x56b3c423u, 0xcfba9599u, 0xb8bda50fu, + 0x2802b89eu, 0x5f058808u, 0xc60cd9b2u, 0xb10be924u, 0x2f6f7c87u, 0x58684c11u, 0xc1611dabu, 0xb6662d3du, + 0x76dc4190u, 0x01db7106u, 0x98d220bcu, 0xefd5102au, 0x71b18589u, 0x06b6b51fu, 0x9fbfe4a5u, 0xe8b8d433u, + 0x7807c9a2u, 0x0f00f934u, 0x9609a88eu, 0xe10e9818u, 0x7f6a0dbbu, 0x086d3d2du, 0x91646c97u, 0xe6635c01u, + 0x6b6b51f4u, 0x1c6c6162u, 0x856530d8u, 0xf262004eu, 0x6c0695edu, 0x1b01a57bu, 0x8208f4c1u, 0xf50fc457u, + 0x65b0d9c6u, 0x12b7e950u, 0x8bbeb8eau, 0xfcb9887cu, 0x62dd1ddfu, 0x15da2d49u, 0x8cd37cf3u, 0xfbd44c65u, + 0x4db26158u, 0x3ab551ceu, 0xa3bc0074u, 0xd4bb30e2u, 0x4adfa541u, 0x3dd895d7u, 0xa4d1c46du, 0xd3d6f4fbu, + 0x4369e96au, 0x346ed9fcu, 0xad678846u, 0xda60b8d0u, 0x44042d73u, 0x33031de5u, 0xaa0a4c5fu, 0xdd0d7cc9u, + 0x5005713cu, 0x270241aau, 0xbe0b1010u, 0xc90c2086u, 0x5768b525u, 0x206f85b3u, 0xb966d409u, 0xce61e49fu, + 0x5edef90eu, 0x29d9c998u, 0xb0d09822u, 0xc7d7a8b4u, 0x59b33d17u, 0x2eb40d81u, 0xb7bd5c3bu, 0xc0ba6cadu, + 0xedb88320u, 0x9abfb3b6u, 0x03b6e20cu, 0x74b1d29au, 0xead54739u, 0x9dd277afu, 0x04db2615u, 0x73dc1683u, + 0xe3630b12u, 0x94643b84u, 0x0d6d6a3eu, 0x7a6a5aa8u, 0xe40ecf0bu, 0x9309ff9du, 0x0a00ae27u, 0x7d079eb1u, + 0xf00f9344u, 0x8708a3d2u, 0x1e01f268u, 0x6906c2feu, 0xf762575du, 0x806567cbu, 0x196c3671u, 0x6e6b06e7u, + 0xfed41b76u, 0x89d32be0u, 0x10da7a5au, 0x67dd4accu, 0xf9b9df6fu, 0x8ebeeff9u, 0x17b7be43u, 0x60b08ed5u, + 0xd6d6a3e8u, 0xa1d1937eu, 0x38d8c2c4u, 0x4fdff252u, 0xd1bb67f1u, 0xa6bc5767u, 0x3fb506ddu, 0x48b2364bu, + 0xd80d2bdau, 0xaf0a1b4cu, 0x36034af6u, 0x41047a60u, 0xdf60efc3u, 0xa867df55u, 0x316e8eefu, 0x4669be79u, + 0xcb61b38cu, 0xbc66831au, 0x256fd2a0u, 0x5268e236u, 0xcc0c7795u, 0xbb0b4703u, 0x220216b9u, 0x5505262fu, + 0xc5ba3bbeu, 0xb2bd0b28u, 0x2bb45a92u, 0x5cb36a04u, 0xc2d7ffa7u, 0xb5d0cf31u, 0x2cd99e8bu, 0x5bdeae1du, + 0x9b64c2b0u, 0xec63f226u, 0x756aa39cu, 0x026d930au, 0x9c0906a9u, 0xeb0e363fu, 0x72076785u, 0x05005713u, + 0x95bf4a82u, 0xe2b87a14u, 0x7bb12baeu, 0x0cb61b38u, 0x92d28e9bu, 0xe5d5be0du, 0x7cdcefb7u, 0x0bdbdf21u, + 0x86d3d2d4u, 0xf1d4e242u, 0x68ddb3f8u, 0x1fda836eu, 0x81be16cdu, 0xf6b9265bu, 0x6fb077e1u, 0x18b74777u, + 0x88085ae6u, 0xff0f6a70u, 0x66063bcau, 0x11010b5cu, 0x8f659effu, 0xf862ae69u, 0x616bffd3u, 0x166ccf45u, + 0xa00ae278u, 0xd70dd2eeu, 0x4e048354u, 0x3903b3c2u, 0xa7672661u, 0xd06016f7u, 0x4969474du, 0x3e6e77dbu, + 0xaed16a4au, 0xd9d65adcu, 0x40df0b66u, 0x37d83bf0u, 0xa9bcae53u, 0xdebb9ec5u, 0x47b2cf7fu, 0x30b5ffe9u, + 0xbdbdf21cu, 0xcabac28au, 0x53b39330u, 0x24b4a3a6u, 0xbad03605u, 0xcdd70693u, 0x54de5729u, 0x23d967bfu, + 0xb3667a2eu, 0xc4614ab8u, 0x5d681b02u, 0x2a6f2b94u, 0xb40bbe37u, 0xc30c8ea1u, 0x5a05df1bu, 0x2d02ef8du +}; + +static const unsigned lodepng_crc32_table1[256] = { + 0x00000000u, 0x191b3141u, 0x32366282u, 0x2b2d53c3u, 0x646cc504u, 0x7d77f445u, 0x565aa786u, 0x4f4196c7u, + 0xc8d98a08u, 0xd1c2bb49u, 0xfaefe88au, 0xe3f4d9cbu, 0xacb54f0cu, 0xb5ae7e4du, 0x9e832d8eu, 0x87981ccfu, + 0x4ac21251u, 0x53d92310u, 0x78f470d3u, 0x61ef4192u, 0x2eaed755u, 0x37b5e614u, 0x1c98b5d7u, 0x05838496u, + 0x821b9859u, 0x9b00a918u, 0xb02dfadbu, 0xa936cb9au, 0xe6775d5du, 0xff6c6c1cu, 0xd4413fdfu, 0xcd5a0e9eu, + 0x958424a2u, 0x8c9f15e3u, 0xa7b24620u, 0xbea97761u, 0xf1e8e1a6u, 0xe8f3d0e7u, 0xc3de8324u, 0xdac5b265u, + 0x5d5daeaau, 0x44469febu, 0x6f6bcc28u, 0x7670fd69u, 0x39316baeu, 0x202a5aefu, 0x0b07092cu, 0x121c386du, + 0xdf4636f3u, 0xc65d07b2u, 0xed705471u, 0xf46b6530u, 0xbb2af3f7u, 0xa231c2b6u, 0x891c9175u, 0x9007a034u, + 0x179fbcfbu, 0x0e848dbau, 0x25a9de79u, 0x3cb2ef38u, 0x73f379ffu, 0x6ae848beu, 0x41c51b7du, 0x58de2a3cu, + 0xf0794f05u, 0xe9627e44u, 0xc24f2d87u, 0xdb541cc6u, 0x94158a01u, 0x8d0ebb40u, 0xa623e883u, 0xbf38d9c2u, + 0x38a0c50du, 0x21bbf44cu, 0x0a96a78fu, 0x138d96ceu, 0x5ccc0009u, 0x45d73148u, 0x6efa628bu, 0x77e153cau, + 0xbabb5d54u, 0xa3a06c15u, 0x888d3fd6u, 0x91960e97u, 0xded79850u, 0xc7cca911u, 0xece1fad2u, 0xf5facb93u, + 0x7262d75cu, 0x6b79e61du, 0x4054b5deu, 0x594f849fu, 0x160e1258u, 0x0f152319u, 0x243870dau, 0x3d23419bu, + 0x65fd6ba7u, 0x7ce65ae6u, 0x57cb0925u, 0x4ed03864u, 0x0191aea3u, 0x188a9fe2u, 0x33a7cc21u, 0x2abcfd60u, + 0xad24e1afu, 0xb43fd0eeu, 0x9f12832du, 0x8609b26cu, 0xc94824abu, 0xd05315eau, 0xfb7e4629u, 0xe2657768u, + 0x2f3f79f6u, 0x362448b7u, 0x1d091b74u, 0x04122a35u, 0x4b53bcf2u, 0x52488db3u, 0x7965de70u, 0x607eef31u, + 0xe7e6f3feu, 0xfefdc2bfu, 0xd5d0917cu, 0xcccba03du, 0x838a36fau, 0x9a9107bbu, 0xb1bc5478u, 0xa8a76539u, + 0x3b83984bu, 0x2298a90au, 0x09b5fac9u, 0x10aecb88u, 0x5fef5d4fu, 0x46f46c0eu, 0x6dd93fcdu, 0x74c20e8cu, + 0xf35a1243u, 0xea412302u, 0xc16c70c1u, 0xd8774180u, 0x9736d747u, 0x8e2de606u, 0xa500b5c5u, 0xbc1b8484u, + 0x71418a1au, 0x685abb5bu, 0x4377e898u, 0x5a6cd9d9u, 0x152d4f1eu, 0x0c367e5fu, 0x271b2d9cu, 0x3e001cddu, + 0xb9980012u, 0xa0833153u, 0x8bae6290u, 0x92b553d1u, 0xddf4c516u, 0xc4eff457u, 0xefc2a794u, 0xf6d996d5u, + 0xae07bce9u, 0xb71c8da8u, 0x9c31de6bu, 0x852aef2au, 0xca6b79edu, 0xd37048acu, 0xf85d1b6fu, 0xe1462a2eu, + 0x66de36e1u, 0x7fc507a0u, 0x54e85463u, 0x4df36522u, 0x02b2f3e5u, 0x1ba9c2a4u, 0x30849167u, 0x299fa026u, + 0xe4c5aeb8u, 0xfdde9ff9u, 0xd6f3cc3au, 0xcfe8fd7bu, 0x80a96bbcu, 0x99b25afdu, 0xb29f093eu, 0xab84387fu, + 0x2c1c24b0u, 0x350715f1u, 0x1e2a4632u, 0x07317773u, 0x4870e1b4u, 0x516bd0f5u, 0x7a468336u, 0x635db277u, + 0xcbfad74eu, 0xd2e1e60fu, 0xf9ccb5ccu, 0xe0d7848du, 0xaf96124au, 0xb68d230bu, 0x9da070c8u, 0x84bb4189u, + 0x03235d46u, 0x1a386c07u, 0x31153fc4u, 0x280e0e85u, 0x674f9842u, 0x7e54a903u, 0x5579fac0u, 0x4c62cb81u, + 0x8138c51fu, 0x9823f45eu, 0xb30ea79du, 0xaa1596dcu, 0xe554001bu, 0xfc4f315au, 0xd7626299u, 0xce7953d8u, + 0x49e14f17u, 0x50fa7e56u, 0x7bd72d95u, 0x62cc1cd4u, 0x2d8d8a13u, 0x3496bb52u, 0x1fbbe891u, 0x06a0d9d0u, + 0x5e7ef3ecu, 0x4765c2adu, 0x6c48916eu, 0x7553a02fu, 0x3a1236e8u, 0x230907a9u, 0x0824546au, 0x113f652bu, + 0x96a779e4u, 0x8fbc48a5u, 0xa4911b66u, 0xbd8a2a27u, 0xf2cbbce0u, 0xebd08da1u, 0xc0fdde62u, 0xd9e6ef23u, + 0x14bce1bdu, 0x0da7d0fcu, 0x268a833fu, 0x3f91b27eu, 0x70d024b9u, 0x69cb15f8u, 0x42e6463bu, 0x5bfd777au, + 0xdc656bb5u, 0xc57e5af4u, 0xee530937u, 0xf7483876u, 0xb809aeb1u, 0xa1129ff0u, 0x8a3fcc33u, 0x9324fd72u +}; + +static const unsigned lodepng_crc32_table2[256] = { + 0x00000000u, 0x01c26a37u, 0x0384d46eu, 0x0246be59u, 0x0709a8dcu, 0x06cbc2ebu, 0x048d7cb2u, 0x054f1685u, + 0x0e1351b8u, 0x0fd13b8fu, 0x0d9785d6u, 0x0c55efe1u, 0x091af964u, 0x08d89353u, 0x0a9e2d0au, 0x0b5c473du, + 0x1c26a370u, 0x1de4c947u, 0x1fa2771eu, 0x1e601d29u, 0x1b2f0bacu, 0x1aed619bu, 0x18abdfc2u, 0x1969b5f5u, + 0x1235f2c8u, 0x13f798ffu, 0x11b126a6u, 0x10734c91u, 0x153c5a14u, 0x14fe3023u, 0x16b88e7au, 0x177ae44du, + 0x384d46e0u, 0x398f2cd7u, 0x3bc9928eu, 0x3a0bf8b9u, 0x3f44ee3cu, 0x3e86840bu, 0x3cc03a52u, 0x3d025065u, + 0x365e1758u, 0x379c7d6fu, 0x35dac336u, 0x3418a901u, 0x3157bf84u, 0x3095d5b3u, 0x32d36beau, 0x331101ddu, + 0x246be590u, 0x25a98fa7u, 0x27ef31feu, 0x262d5bc9u, 0x23624d4cu, 0x22a0277bu, 0x20e69922u, 0x2124f315u, + 0x2a78b428u, 0x2bbade1fu, 0x29fc6046u, 0x283e0a71u, 0x2d711cf4u, 0x2cb376c3u, 0x2ef5c89au, 0x2f37a2adu, + 0x709a8dc0u, 0x7158e7f7u, 0x731e59aeu, 0x72dc3399u, 0x7793251cu, 0x76514f2bu, 0x7417f172u, 0x75d59b45u, + 0x7e89dc78u, 0x7f4bb64fu, 0x7d0d0816u, 0x7ccf6221u, 0x798074a4u, 0x78421e93u, 0x7a04a0cau, 0x7bc6cafdu, + 0x6cbc2eb0u, 0x6d7e4487u, 0x6f38fadeu, 0x6efa90e9u, 0x6bb5866cu, 0x6a77ec5bu, 0x68315202u, 0x69f33835u, + 0x62af7f08u, 0x636d153fu, 0x612bab66u, 0x60e9c151u, 0x65a6d7d4u, 0x6464bde3u, 0x662203bau, 0x67e0698du, + 0x48d7cb20u, 0x4915a117u, 0x4b531f4eu, 0x4a917579u, 0x4fde63fcu, 0x4e1c09cbu, 0x4c5ab792u, 0x4d98dda5u, + 0x46c49a98u, 0x4706f0afu, 0x45404ef6u, 0x448224c1u, 0x41cd3244u, 0x400f5873u, 0x4249e62au, 0x438b8c1du, + 0x54f16850u, 0x55330267u, 0x5775bc3eu, 0x56b7d609u, 0x53f8c08cu, 0x523aaabbu, 0x507c14e2u, 0x51be7ed5u, + 0x5ae239e8u, 0x5b2053dfu, 0x5966ed86u, 0x58a487b1u, 0x5deb9134u, 0x5c29fb03u, 0x5e6f455au, 0x5fad2f6du, + 0xe1351b80u, 0xe0f771b7u, 0xe2b1cfeeu, 0xe373a5d9u, 0xe63cb35cu, 0xe7fed96bu, 0xe5b86732u, 0xe47a0d05u, + 0xef264a38u, 0xeee4200fu, 0xeca29e56u, 0xed60f461u, 0xe82fe2e4u, 0xe9ed88d3u, 0xebab368au, 0xea695cbdu, + 0xfd13b8f0u, 0xfcd1d2c7u, 0xfe976c9eu, 0xff5506a9u, 0xfa1a102cu, 0xfbd87a1bu, 0xf99ec442u, 0xf85cae75u, + 0xf300e948u, 0xf2c2837fu, 0xf0843d26u, 0xf1465711u, 0xf4094194u, 0xf5cb2ba3u, 0xf78d95fau, 0xf64fffcdu, + 0xd9785d60u, 0xd8ba3757u, 0xdafc890eu, 0xdb3ee339u, 0xde71f5bcu, 0xdfb39f8bu, 0xddf521d2u, 0xdc374be5u, + 0xd76b0cd8u, 0xd6a966efu, 0xd4efd8b6u, 0xd52db281u, 0xd062a404u, 0xd1a0ce33u, 0xd3e6706au, 0xd2241a5du, + 0xc55efe10u, 0xc49c9427u, 0xc6da2a7eu, 0xc7184049u, 0xc25756ccu, 0xc3953cfbu, 0xc1d382a2u, 0xc011e895u, + 0xcb4dafa8u, 0xca8fc59fu, 0xc8c97bc6u, 0xc90b11f1u, 0xcc440774u, 0xcd866d43u, 0xcfc0d31au, 0xce02b92du, + 0x91af9640u, 0x906dfc77u, 0x922b422eu, 0x93e92819u, 0x96a63e9cu, 0x976454abu, 0x9522eaf2u, 0x94e080c5u, + 0x9fbcc7f8u, 0x9e7eadcfu, 0x9c381396u, 0x9dfa79a1u, 0x98b56f24u, 0x99770513u, 0x9b31bb4au, 0x9af3d17du, + 0x8d893530u, 0x8c4b5f07u, 0x8e0de15eu, 0x8fcf8b69u, 0x8a809decu, 0x8b42f7dbu, 0x89044982u, 0x88c623b5u, + 0x839a6488u, 0x82580ebfu, 0x801eb0e6u, 0x81dcdad1u, 0x8493cc54u, 0x8551a663u, 0x8717183au, 0x86d5720du, + 0xa9e2d0a0u, 0xa820ba97u, 0xaa6604ceu, 0xaba46ef9u, 0xaeeb787cu, 0xaf29124bu, 0xad6fac12u, 0xacadc625u, + 0xa7f18118u, 0xa633eb2fu, 0xa4755576u, 0xa5b73f41u, 0xa0f829c4u, 0xa13a43f3u, 0xa37cfdaau, 0xa2be979du, + 0xb5c473d0u, 0xb40619e7u, 0xb640a7beu, 0xb782cd89u, 0xb2cddb0cu, 0xb30fb13bu, 0xb1490f62u, 0xb08b6555u, + 0xbbd72268u, 0xba15485fu, 0xb853f606u, 0xb9919c31u, 0xbcde8ab4u, 0xbd1ce083u, 0xbf5a5edau, 0xbe9834edu +}; + +static const unsigned lodepng_crc32_table3[256] = { + 0x00000000u, 0xb8bc6765u, 0xaa09c88bu, 0x12b5afeeu, 0x8f629757u, 0x37def032u, 0x256b5fdcu, 0x9dd738b9u, + 0xc5b428efu, 0x7d084f8au, 0x6fbde064u, 0xd7018701u, 0x4ad6bfb8u, 0xf26ad8ddu, 0xe0df7733u, 0x58631056u, + 0x5019579fu, 0xe8a530fau, 0xfa109f14u, 0x42acf871u, 0xdf7bc0c8u, 0x67c7a7adu, 0x75720843u, 0xcdce6f26u, + 0x95ad7f70u, 0x2d111815u, 0x3fa4b7fbu, 0x8718d09eu, 0x1acfe827u, 0xa2738f42u, 0xb0c620acu, 0x087a47c9u, + 0xa032af3eu, 0x188ec85bu, 0x0a3b67b5u, 0xb28700d0u, 0x2f503869u, 0x97ec5f0cu, 0x8559f0e2u, 0x3de59787u, + 0x658687d1u, 0xdd3ae0b4u, 0xcf8f4f5au, 0x7733283fu, 0xeae41086u, 0x525877e3u, 0x40edd80du, 0xf851bf68u, + 0xf02bf8a1u, 0x48979fc4u, 0x5a22302au, 0xe29e574fu, 0x7f496ff6u, 0xc7f50893u, 0xd540a77du, 0x6dfcc018u, + 0x359fd04eu, 0x8d23b72bu, 0x9f9618c5u, 0x272a7fa0u, 0xbafd4719u, 0x0241207cu, 0x10f48f92u, 0xa848e8f7u, + 0x9b14583du, 0x23a83f58u, 0x311d90b6u, 0x89a1f7d3u, 0x1476cf6au, 0xaccaa80fu, 0xbe7f07e1u, 0x06c36084u, + 0x5ea070d2u, 0xe61c17b7u, 0xf4a9b859u, 0x4c15df3cu, 0xd1c2e785u, 0x697e80e0u, 0x7bcb2f0eu, 0xc377486bu, + 0xcb0d0fa2u, 0x73b168c7u, 0x6104c729u, 0xd9b8a04cu, 0x446f98f5u, 0xfcd3ff90u, 0xee66507eu, 0x56da371bu, + 0x0eb9274du, 0xb6054028u, 0xa4b0efc6u, 0x1c0c88a3u, 0x81dbb01au, 0x3967d77fu, 0x2bd27891u, 0x936e1ff4u, + 0x3b26f703u, 0x839a9066u, 0x912f3f88u, 0x299358edu, 0xb4446054u, 0x0cf80731u, 0x1e4da8dfu, 0xa6f1cfbau, + 0xfe92dfecu, 0x462eb889u, 0x549b1767u, 0xec277002u, 0x71f048bbu, 0xc94c2fdeu, 0xdbf98030u, 0x6345e755u, + 0x6b3fa09cu, 0xd383c7f9u, 0xc1366817u, 0x798a0f72u, 0xe45d37cbu, 0x5ce150aeu, 0x4e54ff40u, 0xf6e89825u, + 0xae8b8873u, 0x1637ef16u, 0x048240f8u, 0xbc3e279du, 0x21e91f24u, 0x99557841u, 0x8be0d7afu, 0x335cb0cau, + 0xed59b63bu, 0x55e5d15eu, 0x47507eb0u, 0xffec19d5u, 0x623b216cu, 0xda874609u, 0xc832e9e7u, 0x708e8e82u, + 0x28ed9ed4u, 0x9051f9b1u, 0x82e4565fu, 0x3a58313au, 0xa78f0983u, 0x1f336ee6u, 0x0d86c108u, 0xb53aa66du, + 0xbd40e1a4u, 0x05fc86c1u, 0x1749292fu, 0xaff54e4au, 0x322276f3u, 0x8a9e1196u, 0x982bbe78u, 0x2097d91du, + 0x78f4c94bu, 0xc048ae2eu, 0xd2fd01c0u, 0x6a4166a5u, 0xf7965e1cu, 0x4f2a3979u, 0x5d9f9697u, 0xe523f1f2u, + 0x4d6b1905u, 0xf5d77e60u, 0xe762d18eu, 0x5fdeb6ebu, 0xc2098e52u, 0x7ab5e937u, 0x680046d9u, 0xd0bc21bcu, + 0x88df31eau, 0x3063568fu, 0x22d6f961u, 0x9a6a9e04u, 0x07bda6bdu, 0xbf01c1d8u, 0xadb46e36u, 0x15080953u, + 0x1d724e9au, 0xa5ce29ffu, 0xb77b8611u, 0x0fc7e174u, 0x9210d9cdu, 0x2aacbea8u, 0x38191146u, 0x80a57623u, + 0xd8c66675u, 0x607a0110u, 0x72cfaefeu, 0xca73c99bu, 0x57a4f122u, 0xef189647u, 0xfdad39a9u, 0x45115eccu, + 0x764dee06u, 0xcef18963u, 0xdc44268du, 0x64f841e8u, 0xf92f7951u, 0x41931e34u, 0x5326b1dau, 0xeb9ad6bfu, + 0xb3f9c6e9u, 0x0b45a18cu, 0x19f00e62u, 0xa14c6907u, 0x3c9b51beu, 0x842736dbu, 0x96929935u, 0x2e2efe50u, + 0x2654b999u, 0x9ee8defcu, 0x8c5d7112u, 0x34e11677u, 0xa9362eceu, 0x118a49abu, 0x033fe645u, 0xbb838120u, + 0xe3e09176u, 0x5b5cf613u, 0x49e959fdu, 0xf1553e98u, 0x6c820621u, 0xd43e6144u, 0xc68bceaau, 0x7e37a9cfu, + 0xd67f4138u, 0x6ec3265du, 0x7c7689b3u, 0xc4caeed6u, 0x591dd66fu, 0xe1a1b10au, 0xf3141ee4u, 0x4ba87981u, + 0x13cb69d7u, 0xab770eb2u, 0xb9c2a15cu, 0x017ec639u, 0x9ca9fe80u, 0x241599e5u, 0x36a0360bu, 0x8e1c516eu, + 0x866616a7u, 0x3eda71c2u, 0x2c6fde2cu, 0x94d3b949u, 0x090481f0u, 0xb1b8e695u, 0xa30d497bu, 0x1bb12e1eu, + 0x43d23e48u, 0xfb6e592du, 0xe9dbf6c3u, 0x516791a6u, 0xccb0a91fu, 0x740cce7au, 0x66b96194u, 0xde0506f1u +}; + +static const unsigned lodepng_crc32_table4[256] = { + 0x00000000u, 0x3d6029b0u, 0x7ac05360u, 0x47a07ad0u, 0xf580a6c0u, 0xc8e08f70u, 0x8f40f5a0u, 0xb220dc10u, + 0x30704bc1u, 0x0d106271u, 0x4ab018a1u, 0x77d03111u, 0xc5f0ed01u, 0xf890c4b1u, 0xbf30be61u, 0x825097d1u, + 0x60e09782u, 0x5d80be32u, 0x1a20c4e2u, 0x2740ed52u, 0x95603142u, 0xa80018f2u, 0xefa06222u, 0xd2c04b92u, + 0x5090dc43u, 0x6df0f5f3u, 0x2a508f23u, 0x1730a693u, 0xa5107a83u, 0x98705333u, 0xdfd029e3u, 0xe2b00053u, + 0xc1c12f04u, 0xfca106b4u, 0xbb017c64u, 0x866155d4u, 0x344189c4u, 0x0921a074u, 0x4e81daa4u, 0x73e1f314u, + 0xf1b164c5u, 0xccd14d75u, 0x8b7137a5u, 0xb6111e15u, 0x0431c205u, 0x3951ebb5u, 0x7ef19165u, 0x4391b8d5u, + 0xa121b886u, 0x9c419136u, 0xdbe1ebe6u, 0xe681c256u, 0x54a11e46u, 0x69c137f6u, 0x2e614d26u, 0x13016496u, + 0x9151f347u, 0xac31daf7u, 0xeb91a027u, 0xd6f18997u, 0x64d15587u, 0x59b17c37u, 0x1e1106e7u, 0x23712f57u, + 0x58f35849u, 0x659371f9u, 0x22330b29u, 0x1f532299u, 0xad73fe89u, 0x9013d739u, 0xd7b3ade9u, 0xead38459u, + 0x68831388u, 0x55e33a38u, 0x124340e8u, 0x2f236958u, 0x9d03b548u, 0xa0639cf8u, 0xe7c3e628u, 0xdaa3cf98u, + 0x3813cfcbu, 0x0573e67bu, 0x42d39cabu, 0x7fb3b51bu, 0xcd93690bu, 0xf0f340bbu, 0xb7533a6bu, 0x8a3313dbu, + 0x0863840au, 0x3503adbau, 0x72a3d76au, 0x4fc3fedau, 0xfde322cau, 0xc0830b7au, 0x872371aau, 0xba43581au, + 0x9932774du, 0xa4525efdu, 0xe3f2242du, 0xde920d9du, 0x6cb2d18du, 0x51d2f83du, 0x167282edu, 0x2b12ab5du, + 0xa9423c8cu, 0x9422153cu, 0xd3826fecu, 0xeee2465cu, 0x5cc29a4cu, 0x61a2b3fcu, 0x2602c92cu, 0x1b62e09cu, + 0xf9d2e0cfu, 0xc4b2c97fu, 0x8312b3afu, 0xbe729a1fu, 0x0c52460fu, 0x31326fbfu, 0x7692156fu, 0x4bf23cdfu, + 0xc9a2ab0eu, 0xf4c282beu, 0xb362f86eu, 0x8e02d1deu, 0x3c220dceu, 0x0142247eu, 0x46e25eaeu, 0x7b82771eu, + 0xb1e6b092u, 0x8c869922u, 0xcb26e3f2u, 0xf646ca42u, 0x44661652u, 0x79063fe2u, 0x3ea64532u, 0x03c66c82u, + 0x8196fb53u, 0xbcf6d2e3u, 0xfb56a833u, 0xc6368183u, 0x74165d93u, 0x49767423u, 0x0ed60ef3u, 0x33b62743u, + 0xd1062710u, 0xec660ea0u, 0xabc67470u, 0x96a65dc0u, 0x248681d0u, 0x19e6a860u, 0x5e46d2b0u, 0x6326fb00u, + 0xe1766cd1u, 0xdc164561u, 0x9bb63fb1u, 0xa6d61601u, 0x14f6ca11u, 0x2996e3a1u, 0x6e369971u, 0x5356b0c1u, + 0x70279f96u, 0x4d47b626u, 0x0ae7ccf6u, 0x3787e546u, 0x85a73956u, 0xb8c710e6u, 0xff676a36u, 0xc2074386u, + 0x4057d457u, 0x7d37fde7u, 0x3a978737u, 0x07f7ae87u, 0xb5d77297u, 0x88b75b27u, 0xcf1721f7u, 0xf2770847u, + 0x10c70814u, 0x2da721a4u, 0x6a075b74u, 0x576772c4u, 0xe547aed4u, 0xd8278764u, 0x9f87fdb4u, 0xa2e7d404u, + 0x20b743d5u, 0x1dd76a65u, 0x5a7710b5u, 0x67173905u, 0xd537e515u, 0xe857cca5u, 0xaff7b675u, 0x92979fc5u, + 0xe915e8dbu, 0xd475c16bu, 0x93d5bbbbu, 0xaeb5920bu, 0x1c954e1bu, 0x21f567abu, 0x66551d7bu, 0x5b3534cbu, + 0xd965a31au, 0xe4058aaau, 0xa3a5f07au, 0x9ec5d9cau, 0x2ce505dau, 0x11852c6au, 0x562556bau, 0x6b457f0au, + 0x89f57f59u, 0xb49556e9u, 0xf3352c39u, 0xce550589u, 0x7c75d999u, 0x4115f029u, 0x06b58af9u, 0x3bd5a349u, + 0xb9853498u, 0x84e51d28u, 0xc34567f8u, 0xfe254e48u, 0x4c059258u, 0x7165bbe8u, 0x36c5c138u, 0x0ba5e888u, + 0x28d4c7dfu, 0x15b4ee6fu, 0x521494bfu, 0x6f74bd0fu, 0xdd54611fu, 0xe03448afu, 0xa794327fu, 0x9af41bcfu, + 0x18a48c1eu, 0x25c4a5aeu, 0x6264df7eu, 0x5f04f6ceu, 0xed242adeu, 0xd044036eu, 0x97e479beu, 0xaa84500eu, + 0x4834505du, 0x755479edu, 0x32f4033du, 0x0f942a8du, 0xbdb4f69du, 0x80d4df2du, 0xc774a5fdu, 0xfa148c4du, + 0x78441b9cu, 0x4524322cu, 0x028448fcu, 0x3fe4614cu, 0x8dc4bd5cu, 0xb0a494ecu, 0xf704ee3cu, 0xca64c78cu +}; + +static const unsigned lodepng_crc32_table5[256] = { + 0x00000000u, 0xcb5cd3a5u, 0x4dc8a10bu, 0x869472aeu, 0x9b914216u, 0x50cd91b3u, 0xd659e31du, 0x1d0530b8u, + 0xec53826du, 0x270f51c8u, 0xa19b2366u, 0x6ac7f0c3u, 0x77c2c07bu, 0xbc9e13deu, 0x3a0a6170u, 0xf156b2d5u, + 0x03d6029bu, 0xc88ad13eu, 0x4e1ea390u, 0x85427035u, 0x9847408du, 0x531b9328u, 0xd58fe186u, 0x1ed33223u, + 0xef8580f6u, 0x24d95353u, 0xa24d21fdu, 0x6911f258u, 0x7414c2e0u, 0xbf481145u, 0x39dc63ebu, 0xf280b04eu, + 0x07ac0536u, 0xccf0d693u, 0x4a64a43du, 0x81387798u, 0x9c3d4720u, 0x57619485u, 0xd1f5e62bu, 0x1aa9358eu, + 0xebff875bu, 0x20a354feu, 0xa6372650u, 0x6d6bf5f5u, 0x706ec54du, 0xbb3216e8u, 0x3da66446u, 0xf6fab7e3u, + 0x047a07adu, 0xcf26d408u, 0x49b2a6a6u, 0x82ee7503u, 0x9feb45bbu, 0x54b7961eu, 0xd223e4b0u, 0x197f3715u, + 0xe82985c0u, 0x23755665u, 0xa5e124cbu, 0x6ebdf76eu, 0x73b8c7d6u, 0xb8e41473u, 0x3e7066ddu, 0xf52cb578u, + 0x0f580a6cu, 0xc404d9c9u, 0x4290ab67u, 0x89cc78c2u, 0x94c9487au, 0x5f959bdfu, 0xd901e971u, 0x125d3ad4u, + 0xe30b8801u, 0x28575ba4u, 0xaec3290au, 0x659ffaafu, 0x789aca17u, 0xb3c619b2u, 0x35526b1cu, 0xfe0eb8b9u, + 0x0c8e08f7u, 0xc7d2db52u, 0x4146a9fcu, 0x8a1a7a59u, 0x971f4ae1u, 0x5c439944u, 0xdad7ebeau, 0x118b384fu, + 0xe0dd8a9au, 0x2b81593fu, 0xad152b91u, 0x6649f834u, 0x7b4cc88cu, 0xb0101b29u, 0x36846987u, 0xfdd8ba22u, + 0x08f40f5au, 0xc3a8dcffu, 0x453cae51u, 0x8e607df4u, 0x93654d4cu, 0x58399ee9u, 0xdeadec47u, 0x15f13fe2u, + 0xe4a78d37u, 0x2ffb5e92u, 0xa96f2c3cu, 0x6233ff99u, 0x7f36cf21u, 0xb46a1c84u, 0x32fe6e2au, 0xf9a2bd8fu, + 0x0b220dc1u, 0xc07ede64u, 0x46eaaccau, 0x8db67f6fu, 0x90b34fd7u, 0x5bef9c72u, 0xdd7beedcu, 0x16273d79u, + 0xe7718facu, 0x2c2d5c09u, 0xaab92ea7u, 0x61e5fd02u, 0x7ce0cdbau, 0xb7bc1e1fu, 0x31286cb1u, 0xfa74bf14u, + 0x1eb014d8u, 0xd5ecc77du, 0x5378b5d3u, 0x98246676u, 0x852156ceu, 0x4e7d856bu, 0xc8e9f7c5u, 0x03b52460u, + 0xf2e396b5u, 0x39bf4510u, 0xbf2b37beu, 0x7477e41bu, 0x6972d4a3u, 0xa22e0706u, 0x24ba75a8u, 0xefe6a60du, + 0x1d661643u, 0xd63ac5e6u, 0x50aeb748u, 0x9bf264edu, 0x86f75455u, 0x4dab87f0u, 0xcb3ff55eu, 0x006326fbu, + 0xf135942eu, 0x3a69478bu, 0xbcfd3525u, 0x77a1e680u, 0x6aa4d638u, 0xa1f8059du, 0x276c7733u, 0xec30a496u, + 0x191c11eeu, 0xd240c24bu, 0x54d4b0e5u, 0x9f886340u, 0x828d53f8u, 0x49d1805du, 0xcf45f2f3u, 0x04192156u, + 0xf54f9383u, 0x3e134026u, 0xb8873288u, 0x73dbe12du, 0x6eded195u, 0xa5820230u, 0x2316709eu, 0xe84aa33bu, + 0x1aca1375u, 0xd196c0d0u, 0x5702b27eu, 0x9c5e61dbu, 0x815b5163u, 0x4a0782c6u, 0xcc93f068u, 0x07cf23cdu, + 0xf6999118u, 0x3dc542bdu, 0xbb513013u, 0x700de3b6u, 0x6d08d30eu, 0xa65400abu, 0x20c07205u, 0xeb9ca1a0u, + 0x11e81eb4u, 0xdab4cd11u, 0x5c20bfbfu, 0x977c6c1au, 0x8a795ca2u, 0x41258f07u, 0xc7b1fda9u, 0x0ced2e0cu, + 0xfdbb9cd9u, 0x36e74f7cu, 0xb0733dd2u, 0x7b2fee77u, 0x662adecfu, 0xad760d6au, 0x2be27fc4u, 0xe0beac61u, + 0x123e1c2fu, 0xd962cf8au, 0x5ff6bd24u, 0x94aa6e81u, 0x89af5e39u, 0x42f38d9cu, 0xc467ff32u, 0x0f3b2c97u, + 0xfe6d9e42u, 0x35314de7u, 0xb3a53f49u, 0x78f9ececu, 0x65fcdc54u, 0xaea00ff1u, 0x28347d5fu, 0xe368aefau, + 0x16441b82u, 0xdd18c827u, 0x5b8cba89u, 0x90d0692cu, 0x8dd55994u, 0x46898a31u, 0xc01df89fu, 0x0b412b3au, + 0xfa1799efu, 0x314b4a4au, 0xb7df38e4u, 0x7c83eb41u, 0x6186dbf9u, 0xaada085cu, 0x2c4e7af2u, 0xe712a957u, + 0x15921919u, 0xdececabcu, 0x585ab812u, 0x93066bb7u, 0x8e035b0fu, 0x455f88aau, 0xc3cbfa04u, 0x089729a1u, + 0xf9c19b74u, 0x329d48d1u, 0xb4093a7fu, 0x7f55e9dau, 0x6250d962u, 0xa90c0ac7u, 0x2f987869u, 0xe4c4abccu +}; + +static const unsigned lodepng_crc32_table6[256] = { + 0x00000000u, 0xa6770bb4u, 0x979f1129u, 0x31e81a9du, 0xf44f2413u, 0x52382fa7u, 0x63d0353au, 0xc5a73e8eu, + 0x33ef4e67u, 0x959845d3u, 0xa4705f4eu, 0x020754fau, 0xc7a06a74u, 0x61d761c0u, 0x503f7b5du, 0xf64870e9u, + 0x67de9cceu, 0xc1a9977au, 0xf0418de7u, 0x56368653u, 0x9391b8ddu, 0x35e6b369u, 0x040ea9f4u, 0xa279a240u, + 0x5431d2a9u, 0xf246d91du, 0xc3aec380u, 0x65d9c834u, 0xa07ef6bau, 0x0609fd0eu, 0x37e1e793u, 0x9196ec27u, + 0xcfbd399cu, 0x69ca3228u, 0x582228b5u, 0xfe552301u, 0x3bf21d8fu, 0x9d85163bu, 0xac6d0ca6u, 0x0a1a0712u, + 0xfc5277fbu, 0x5a257c4fu, 0x6bcd66d2u, 0xcdba6d66u, 0x081d53e8u, 0xae6a585cu, 0x9f8242c1u, 0x39f54975u, + 0xa863a552u, 0x0e14aee6u, 0x3ffcb47bu, 0x998bbfcfu, 0x5c2c8141u, 0xfa5b8af5u, 0xcbb39068u, 0x6dc49bdcu, + 0x9b8ceb35u, 0x3dfbe081u, 0x0c13fa1cu, 0xaa64f1a8u, 0x6fc3cf26u, 0xc9b4c492u, 0xf85cde0fu, 0x5e2bd5bbu, + 0x440b7579u, 0xe27c7ecdu, 0xd3946450u, 0x75e36fe4u, 0xb044516au, 0x16335adeu, 0x27db4043u, 0x81ac4bf7u, + 0x77e43b1eu, 0xd19330aau, 0xe07b2a37u, 0x460c2183u, 0x83ab1f0du, 0x25dc14b9u, 0x14340e24u, 0xb2430590u, + 0x23d5e9b7u, 0x85a2e203u, 0xb44af89eu, 0x123df32au, 0xd79acda4u, 0x71edc610u, 0x4005dc8du, 0xe672d739u, + 0x103aa7d0u, 0xb64dac64u, 0x87a5b6f9u, 0x21d2bd4du, 0xe47583c3u, 0x42028877u, 0x73ea92eau, 0xd59d995eu, + 0x8bb64ce5u, 0x2dc14751u, 0x1c295dccu, 0xba5e5678u, 0x7ff968f6u, 0xd98e6342u, 0xe86679dfu, 0x4e11726bu, + 0xb8590282u, 0x1e2e0936u, 0x2fc613abu, 0x89b1181fu, 0x4c162691u, 0xea612d25u, 0xdb8937b8u, 0x7dfe3c0cu, + 0xec68d02bu, 0x4a1fdb9fu, 0x7bf7c102u, 0xdd80cab6u, 0x1827f438u, 0xbe50ff8cu, 0x8fb8e511u, 0x29cfeea5u, + 0xdf879e4cu, 0x79f095f8u, 0x48188f65u, 0xee6f84d1u, 0x2bc8ba5fu, 0x8dbfb1ebu, 0xbc57ab76u, 0x1a20a0c2u, + 0x8816eaf2u, 0x2e61e146u, 0x1f89fbdbu, 0xb9fef06fu, 0x7c59cee1u, 0xda2ec555u, 0xebc6dfc8u, 0x4db1d47cu, + 0xbbf9a495u, 0x1d8eaf21u, 0x2c66b5bcu, 0x8a11be08u, 0x4fb68086u, 0xe9c18b32u, 0xd82991afu, 0x7e5e9a1bu, + 0xefc8763cu, 0x49bf7d88u, 0x78576715u, 0xde206ca1u, 0x1b87522fu, 0xbdf0599bu, 0x8c184306u, 0x2a6f48b2u, + 0xdc27385bu, 0x7a5033efu, 0x4bb82972u, 0xedcf22c6u, 0x28681c48u, 0x8e1f17fcu, 0xbff70d61u, 0x198006d5u, + 0x47abd36eu, 0xe1dcd8dau, 0xd034c247u, 0x7643c9f3u, 0xb3e4f77du, 0x1593fcc9u, 0x247be654u, 0x820cede0u, + 0x74449d09u, 0xd23396bdu, 0xe3db8c20u, 0x45ac8794u, 0x800bb91au, 0x267cb2aeu, 0x1794a833u, 0xb1e3a387u, + 0x20754fa0u, 0x86024414u, 0xb7ea5e89u, 0x119d553du, 0xd43a6bb3u, 0x724d6007u, 0x43a57a9au, 0xe5d2712eu, + 0x139a01c7u, 0xb5ed0a73u, 0x840510eeu, 0x22721b5au, 0xe7d525d4u, 0x41a22e60u, 0x704a34fdu, 0xd63d3f49u, + 0xcc1d9f8bu, 0x6a6a943fu, 0x5b828ea2u, 0xfdf58516u, 0x3852bb98u, 0x9e25b02cu, 0xafcdaab1u, 0x09baa105u, + 0xfff2d1ecu, 0x5985da58u, 0x686dc0c5u, 0xce1acb71u, 0x0bbdf5ffu, 0xadcafe4bu, 0x9c22e4d6u, 0x3a55ef62u, + 0xabc30345u, 0x0db408f1u, 0x3c5c126cu, 0x9a2b19d8u, 0x5f8c2756u, 0xf9fb2ce2u, 0xc813367fu, 0x6e643dcbu, + 0x982c4d22u, 0x3e5b4696u, 0x0fb35c0bu, 0xa9c457bfu, 0x6c636931u, 0xca146285u, 0xfbfc7818u, 0x5d8b73acu, + 0x03a0a617u, 0xa5d7ada3u, 0x943fb73eu, 0x3248bc8au, 0xf7ef8204u, 0x519889b0u, 0x6070932du, 0xc6079899u, + 0x304fe870u, 0x9638e3c4u, 0xa7d0f959u, 0x01a7f2edu, 0xc400cc63u, 0x6277c7d7u, 0x539fdd4au, 0xf5e8d6feu, + 0x647e3ad9u, 0xc209316du, 0xf3e12bf0u, 0x55962044u, 0x90311ecau, 0x3646157eu, 0x07ae0fe3u, 0xa1d90457u, + 0x579174beu, 0xf1e67f0au, 0xc00e6597u, 0x66796e23u, 0xa3de50adu, 0x05a95b19u, 0x34414184u, 0x92364a30u +}; + +static const unsigned lodepng_crc32_table7[256] = { + 0x00000000u, 0xccaa009eu, 0x4225077du, 0x8e8f07e3u, 0x844a0efau, 0x48e00e64u, 0xc66f0987u, 0x0ac50919u, + 0xd3e51bb5u, 0x1f4f1b2bu, 0x91c01cc8u, 0x5d6a1c56u, 0x57af154fu, 0x9b0515d1u, 0x158a1232u, 0xd92012acu, + 0x7cbb312bu, 0xb01131b5u, 0x3e9e3656u, 0xf23436c8u, 0xf8f13fd1u, 0x345b3f4fu, 0xbad438acu, 0x767e3832u, + 0xaf5e2a9eu, 0x63f42a00u, 0xed7b2de3u, 0x21d12d7du, 0x2b142464u, 0xe7be24fau, 0x69312319u, 0xa59b2387u, + 0xf9766256u, 0x35dc62c8u, 0xbb53652bu, 0x77f965b5u, 0x7d3c6cacu, 0xb1966c32u, 0x3f196bd1u, 0xf3b36b4fu, + 0x2a9379e3u, 0xe639797du, 0x68b67e9eu, 0xa41c7e00u, 0xaed97719u, 0x62737787u, 0xecfc7064u, 0x205670fau, + 0x85cd537du, 0x496753e3u, 0xc7e85400u, 0x0b42549eu, 0x01875d87u, 0xcd2d5d19u, 0x43a25afau, 0x8f085a64u, + 0x562848c8u, 0x9a824856u, 0x140d4fb5u, 0xd8a74f2bu, 0xd2624632u, 0x1ec846acu, 0x9047414fu, 0x5ced41d1u, + 0x299dc2edu, 0xe537c273u, 0x6bb8c590u, 0xa712c50eu, 0xadd7cc17u, 0x617dcc89u, 0xeff2cb6au, 0x2358cbf4u, + 0xfa78d958u, 0x36d2d9c6u, 0xb85dde25u, 0x74f7debbu, 0x7e32d7a2u, 0xb298d73cu, 0x3c17d0dfu, 0xf0bdd041u, + 0x5526f3c6u, 0x998cf358u, 0x1703f4bbu, 0xdba9f425u, 0xd16cfd3cu, 0x1dc6fda2u, 0x9349fa41u, 0x5fe3fadfu, + 0x86c3e873u, 0x4a69e8edu, 0xc4e6ef0eu, 0x084cef90u, 0x0289e689u, 0xce23e617u, 0x40ace1f4u, 0x8c06e16au, + 0xd0eba0bbu, 0x1c41a025u, 0x92cea7c6u, 0x5e64a758u, 0x54a1ae41u, 0x980baedfu, 0x1684a93cu, 0xda2ea9a2u, + 0x030ebb0eu, 0xcfa4bb90u, 0x412bbc73u, 0x8d81bcedu, 0x8744b5f4u, 0x4beeb56au, 0xc561b289u, 0x09cbb217u, + 0xac509190u, 0x60fa910eu, 0xee7596edu, 0x22df9673u, 0x281a9f6au, 0xe4b09ff4u, 0x6a3f9817u, 0xa6959889u, + 0x7fb58a25u, 0xb31f8abbu, 0x3d908d58u, 0xf13a8dc6u, 0xfbff84dfu, 0x37558441u, 0xb9da83a2u, 0x7570833cu, + 0x533b85dau, 0x9f918544u, 0x111e82a7u, 0xddb48239u, 0xd7718b20u, 0x1bdb8bbeu, 0x95548c5du, 0x59fe8cc3u, + 0x80de9e6fu, 0x4c749ef1u, 0xc2fb9912u, 0x0e51998cu, 0x04949095u, 0xc83e900bu, 0x46b197e8u, 0x8a1b9776u, + 0x2f80b4f1u, 0xe32ab46fu, 0x6da5b38cu, 0xa10fb312u, 0xabcaba0bu, 0x6760ba95u, 0xe9efbd76u, 0x2545bde8u, + 0xfc65af44u, 0x30cfafdau, 0xbe40a839u, 0x72eaa8a7u, 0x782fa1beu, 0xb485a120u, 0x3a0aa6c3u, 0xf6a0a65du, + 0xaa4de78cu, 0x66e7e712u, 0xe868e0f1u, 0x24c2e06fu, 0x2e07e976u, 0xe2ade9e8u, 0x6c22ee0bu, 0xa088ee95u, + 0x79a8fc39u, 0xb502fca7u, 0x3b8dfb44u, 0xf727fbdau, 0xfde2f2c3u, 0x3148f25du, 0xbfc7f5beu, 0x736df520u, + 0xd6f6d6a7u, 0x1a5cd639u, 0x94d3d1dau, 0x5879d144u, 0x52bcd85du, 0x9e16d8c3u, 0x1099df20u, 0xdc33dfbeu, + 0x0513cd12u, 0xc9b9cd8cu, 0x4736ca6fu, 0x8b9ccaf1u, 0x8159c3e8u, 0x4df3c376u, 0xc37cc495u, 0x0fd6c40bu, + 0x7aa64737u, 0xb60c47a9u, 0x3883404au, 0xf42940d4u, 0xfeec49cdu, 0x32464953u, 0xbcc94eb0u, 0x70634e2eu, + 0xa9435c82u, 0x65e95c1cu, 0xeb665bffu, 0x27cc5b61u, 0x2d095278u, 0xe1a352e6u, 0x6f2c5505u, 0xa386559bu, + 0x061d761cu, 0xcab77682u, 0x44387161u, 0x889271ffu, 0x825778e6u, 0x4efd7878u, 0xc0727f9bu, 0x0cd87f05u, + 0xd5f86da9u, 0x19526d37u, 0x97dd6ad4u, 0x5b776a4au, 0x51b26353u, 0x9d1863cdu, 0x1397642eu, 0xdf3d64b0u, + 0x83d02561u, 0x4f7a25ffu, 0xc1f5221cu, 0x0d5f2282u, 0x079a2b9bu, 0xcb302b05u, 0x45bf2ce6u, 0x89152c78u, + 0x50353ed4u, 0x9c9f3e4au, 0x121039a9u, 0xdeba3937u, 0xd47f302eu, 0x18d530b0u, 0x965a3753u, 0x5af037cdu, + 0xff6b144au, 0x33c114d4u, 0xbd4e1337u, 0x71e413a9u, 0x7b211ab0u, 0xb78b1a2eu, 0x39041dcdu, 0xf5ae1d53u, + 0x2c8e0fffu, 0xe0240f61u, 0x6eab0882u, 0xa201081cu, 0xa8c40105u, 0x646e019bu, 0xeae10678u, 0x264b06e6u +}; + +/* Computes the cyclic redundancy check as used by PNG chunks*/ +unsigned lodepng_crc32(const unsigned char * data, size_t length) +{ + /*Using the Slicing by Eight algorithm*/ + unsigned r = 0xffffffffu; + while(length >= 8) { + r = lodepng_crc32_table7[(data[0] ^ (r & 0xffu))] ^ + lodepng_crc32_table6[(data[1] ^ ((r >> 8) & 0xffu))] ^ + lodepng_crc32_table5[(data[2] ^ ((r >> 16) & 0xffu))] ^ + lodepng_crc32_table4[(data[3] ^ ((r >> 24) & 0xffu))] ^ + lodepng_crc32_table3[data[4]] ^ + lodepng_crc32_table2[data[5]] ^ + lodepng_crc32_table1[data[6]] ^ + lodepng_crc32_table0[data[7]]; + data += 8; + length -= 8; + } + while(length--) { + r = lodepng_crc32_table0[(r ^ *data++) & 0xffu] ^ (r >> 8); + } + return r ^ 0xffffffffu; +} +#else /* LODEPNG_COMPILE_CRC */ +/*in this case, the function is only declared here, and must be defined externally +so that it will be linked in. + +Example implementation that uses a much smaller lookup table for memory constrained cases: + +unsigned lodepng_crc32(const unsigned char* data, size_t length) { + unsigned r = 0xffffffffu; + static const unsigned table[16] = { + 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c + }; + while(length--) { + r = table[(r ^ *data) & 0xf] ^ (r >> 4); + r = table[(r ^ (*data >> 4)) & 0xf] ^ (r >> 4); + data++; + } + return r ^ 0xffffffffu; +} +*/ +unsigned lodepng_crc32(const unsigned char * data, size_t length); +#endif /* LODEPNG_COMPILE_CRC */ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Reading and writing PNG color channel bits / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/* The color channel bits of less-than-8-bit pixels are read with the MSB of bytes first, +so LodePNGBitWriter and LodePNGBitReader can't be used for those. */ + +static unsigned char readBitFromReversedStream(size_t * bitpointer, const unsigned char * bitstream) +{ + unsigned char result = (unsigned char)((bitstream[(*bitpointer) >> 3] >> (7 - ((*bitpointer) & 0x7))) & 1); + ++(*bitpointer); + return result; +} + +/* TODO: make this faster */ +static unsigned readBitsFromReversedStream(size_t * bitpointer, const unsigned char * bitstream, size_t nbits) +{ + unsigned result = 0; + size_t i; + for(i = 0 ; i < nbits; ++i) { + result <<= 1u; + result |= (unsigned)readBitFromReversedStream(bitpointer, bitstream); + } + return result; +} + +static void setBitOfReversedStream(size_t * bitpointer, unsigned char * bitstream, unsigned char bit) +{ + /*the current bit in bitstream may be 0 or 1 for this to work*/ + if(bit == 0) bitstream[(*bitpointer) >> 3u] &= (unsigned char)(~(1u << (7u - ((*bitpointer) & 7u)))); + else bitstream[(*bitpointer) >> 3u] |= (1u << (7u - ((*bitpointer) & 7u))); + ++(*bitpointer); +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG chunks / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +unsigned lodepng_chunk_length(const unsigned char * chunk) +{ + return lodepng_read32bitInt(chunk); +} + +void lodepng_chunk_type(char type[5], const unsigned char * chunk) +{ + unsigned i; + for(i = 0; i != 4; ++i) type[i] = (char)chunk[4 + i]; + type[4] = 0; /*null termination char*/ +} + +unsigned char lodepng_chunk_type_equals(const unsigned char * chunk, const char * type) +{ + if(lodepng_strlen(type) != 4) return 0; + return (chunk[4] == type[0] && chunk[5] == type[1] && chunk[6] == type[2] && chunk[7] == type[3]); +} + +unsigned char lodepng_chunk_ancillary(const unsigned char * chunk) +{ + return((chunk[4] & 32) != 0); +} + +unsigned char lodepng_chunk_private(const unsigned char * chunk) +{ + return((chunk[6] & 32) != 0); +} + +unsigned char lodepng_chunk_safetocopy(const unsigned char * chunk) +{ + return((chunk[7] & 32) != 0); +} + +unsigned char * lodepng_chunk_data(unsigned char * chunk) +{ + return &chunk[8]; +} + +const unsigned char * lodepng_chunk_data_const(const unsigned char * chunk) +{ + return &chunk[8]; +} + +unsigned lodepng_chunk_check_crc(const unsigned char * chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_read32bitInt(&chunk[length + 8]); + /*the CRC is taken of the data and the 4 chunk type letters, not the length*/ + unsigned checksum = lodepng_crc32(&chunk[4], length + 4); + if(CRC != checksum) return 1; + else return 0; +} + +void lodepng_chunk_generate_crc(unsigned char * chunk) +{ + unsigned length = lodepng_chunk_length(chunk); + unsigned CRC = lodepng_crc32(&chunk[4], length + 4); + lodepng_set32bitInt(chunk + 8 + length, CRC); +} + +unsigned char * lodepng_chunk_next(unsigned char * chunk, unsigned char * end) +{ + size_t available_size = (size_t)(end - chunk); + if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/ + if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 + && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { + /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ + return chunk + 8; + } + else { + size_t total_chunk_length; + if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; + if(total_chunk_length > available_size) return end; /*outside of range*/ + return chunk + total_chunk_length; + } +} + +const unsigned char * lodepng_chunk_next_const(const unsigned char * chunk, const unsigned char * end) +{ + size_t available_size = (size_t)(end - chunk); + if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/ + if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 + && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { + /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ + return chunk + 8; + } + else { + size_t total_chunk_length; + if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; + if(total_chunk_length > available_size) return end; /*outside of range*/ + return chunk + total_chunk_length; + } +} + +unsigned char * lodepng_chunk_find(unsigned char * chunk, unsigned char * end, const char type[5]) +{ + for(;;) { + if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ + if(lodepng_chunk_type_equals(chunk, type)) return chunk; + chunk = lodepng_chunk_next(chunk, end); + } +} + +const unsigned char * lodepng_chunk_find_const(const unsigned char * chunk, const unsigned char * end, + const char type[5]) +{ + for(;;) { + if(chunk >= end || end - chunk < 12) return 0; /* past file end: chunk + 12 > end */ + if(lodepng_chunk_type_equals(chunk, type)) return chunk; + chunk = lodepng_chunk_next_const(chunk, end); + } +} + +unsigned lodepng_chunk_append(unsigned char ** out, size_t * outsize, const unsigned char * chunk) +{ + unsigned i; + size_t total_chunk_length, new_length; + unsigned char * chunk_start, * new_buffer; + + if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return 77; + if(lodepng_addofl(*outsize, total_chunk_length, &new_length)) return 77; + + new_buffer = (unsigned char *)lodepng_realloc(*out, new_length); + if(!new_buffer) return 83; /*alloc fail*/ + (*out) = new_buffer; + (*outsize) = new_length; + chunk_start = &(*out)[new_length - total_chunk_length]; + + for(i = 0; i != total_chunk_length; ++i) chunk_start[i] = chunk[i]; + + return 0; +} + +/*Sets length and name and allocates the space for data and crc but does not +set data or crc yet. Returns the start of the chunk in chunk. The start of +the data is at chunk + 8. To finalize chunk, add the data, then use +lodepng_chunk_generate_crc */ +static unsigned lodepng_chunk_init(unsigned char ** chunk, + ucvector * out, + size_t length, const char * type) +{ + size_t new_length = out->size; + if(lodepng_addofl(new_length, length, &new_length)) return 77; + if(lodepng_addofl(new_length, 12, &new_length)) return 77; + if(!ucvector_resize(out, new_length)) return 83; /*alloc fail*/ + *chunk = out->data + new_length - length - 12u; + + /*1: length*/ + lodepng_set32bitInt(*chunk, (unsigned)length); + + /*2: chunk name (4 letters)*/ + lodepng_memcpy(*chunk + 4, type, 4); + + return 0; +} + +/* like lodepng_chunk_create but with custom allocsize */ +static unsigned lodepng_chunk_createv(ucvector * out, + size_t length, const char * type, const unsigned char * data) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, length, type)); + + /* 3: the data + * LVGL: In the upstream lodepng code, lodepng_memcpy doesn't use memcpy and instead uses a simple `for` loop to copy the data into its destination + * `lv_memcpy`, on the other hand, may call `memcpy` under the hood and `src` can't be NULL + * The function `addChunk_IEND` is an example of a function that calls this function with data == NULL*/ + if(data) { + lodepng_memcpy(chunk + 8, data, length); + } + + /*4: CRC (of the chunkname characters and the data)*/ + lodepng_chunk_generate_crc(chunk); + + return 0; +} + +unsigned lodepng_chunk_create(unsigned char ** out, size_t * outsize, + size_t length, const char * type, const unsigned char * data) +{ + ucvector v = ucvector_init(*out, *outsize); + unsigned error = lodepng_chunk_createv(&v, length, type, data); + *out = v.data; + *outsize = v.size; + return error; +} + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / Color types, channels, bits / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*checks if the colortype is valid and the bitdepth bd is allowed for this colortype. +Return value is a LodePNG error code.*/ +static unsigned checkColorValidity(LodePNGColorType colortype, unsigned bd) +{ + switch(colortype) { + case LCT_GREY: + if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8 || bd == 16)) return 37; + break; + case LCT_RGB: + if(!(bd == 8 || bd == 16)) return 37; + break; + case LCT_PALETTE: + if(!(bd == 1 || bd == 2 || bd == 4 || bd == 8)) return 37; + break; + case LCT_GREY_ALPHA: + if(!(bd == 8 || bd == 16)) return 37; + break; + case LCT_RGBA: + if(!(bd == 8 || bd == 16)) return 37; + break; + case LCT_MAX_OCTET_VALUE: + return 31; /* invalid color type */ + default: + return 31; /* invalid color type */ + } + return 0; /*allowed color type / bits combination*/ +} + +static unsigned getNumColorChannels(LodePNGColorType colortype) +{ + switch(colortype) { + case LCT_GREY: + return 1; + case LCT_RGB: + return 3; + case LCT_PALETTE: + return 1; + case LCT_GREY_ALPHA: + return 2; + case LCT_RGBA: + return 4; + case LCT_MAX_OCTET_VALUE: + return 0; /* invalid color type */ + default: + return 0; /*invalid color type*/ + } +} + +static unsigned lodepng_get_bpp_lct(LodePNGColorType colortype, unsigned bitdepth) +{ + /*bits per pixel is amount of channels * bits per channel*/ + return getNumColorChannels(colortype) * bitdepth; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +void lodepng_color_mode_init(LodePNGColorMode * info) +{ + info->key_defined = 0; + info->key_r = info->key_g = info->key_b = 0; + info->colortype = LCT_RGBA; + info->bitdepth = 8; + info->palette = 0; + info->palettesize = 0; +} + +/*allocates palette memory if needed, and initializes all colors to black*/ +static void lodepng_color_mode_alloc_palette(LodePNGColorMode * info) +{ + size_t i; + /*if the palette is already allocated, it will have size 1024 so no reallocation needed in that case*/ + /*the palette must have room for up to 256 colors with 4 bytes each.*/ + if(!info->palette) info->palette = (unsigned char *)lodepng_malloc(1024); + if(!info->palette) return; /*alloc fail*/ + for(i = 0; i != 256; ++i) { + /*Initialize all unused colors with black, the value used for invalid palette indices. + This is an error according to the PNG spec, but common PNG decoders make it black instead. + That makes color conversion slightly faster due to no error handling needed.*/ + info->palette[i * 4 + 0] = 0; + info->palette[i * 4 + 1] = 0; + info->palette[i * 4 + 2] = 0; + info->palette[i * 4 + 3] = 255; + } +} + +void lodepng_color_mode_cleanup(LodePNGColorMode * info) +{ + lodepng_palette_clear(info); +} + +unsigned lodepng_color_mode_copy(LodePNGColorMode * dest, const LodePNGColorMode * source) +{ + lodepng_color_mode_cleanup(dest); + lodepng_memcpy(dest, source, sizeof(LodePNGColorMode)); + if(source->palette) { + dest->palette = (unsigned char *)lodepng_malloc(1024); + if(!dest->palette && source->palettesize) return 83; /*alloc fail*/ + lodepng_memcpy(dest->palette, source->palette, source->palettesize * 4); + } + return 0; +} + +LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth) +{ + LodePNGColorMode result; + lodepng_color_mode_init(&result); + result.colortype = colortype; + result.bitdepth = bitdepth; + return result; +} + +static int lodepng_color_mode_equal(const LodePNGColorMode * a, const LodePNGColorMode * b) +{ + size_t i; + if(a->colortype != b->colortype) return 0; + if(a->bitdepth != b->bitdepth) return 0; + if(a->key_defined != b->key_defined) return 0; + if(a->key_defined) { + if(a->key_r != b->key_r) return 0; + if(a->key_g != b->key_g) return 0; + if(a->key_b != b->key_b) return 0; + } + if(a->palettesize != b->palettesize) return 0; + for(i = 0; i != a->palettesize * 4; ++i) { + if(a->palette[i] != b->palette[i]) return 0; + } + return 1; +} + +void lodepng_palette_clear(LodePNGColorMode * info) +{ + if(info->palette) lodepng_free(info->palette); + info->palette = 0; + info->palettesize = 0; +} + +unsigned lodepng_palette_add(LodePNGColorMode * info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + if(!info->palette) { /*allocate palette if empty*/ + lodepng_color_mode_alloc_palette(info); + if(!info->palette) return 83; /*alloc fail*/ + } + if(info->palettesize >= 256) { + return 108; /*too many palette values*/ + } + info->palette[4 * info->palettesize + 0] = r; + info->palette[4 * info->palettesize + 1] = g; + info->palette[4 * info->palettesize + 2] = b; + info->palette[4 * info->palettesize + 3] = a; + ++info->palettesize; + return 0; +} + +/*calculate bits per pixel out of colortype and bitdepth*/ +unsigned lodepng_get_bpp(const LodePNGColorMode * info) +{ + return lodepng_get_bpp_lct(info->colortype, info->bitdepth); +} + +unsigned lodepng_get_channels(const LodePNGColorMode * info) +{ + return getNumColorChannels(info->colortype); +} + +unsigned lodepng_is_greyscale_type(const LodePNGColorMode * info) +{ + return info->colortype == LCT_GREY || info->colortype == LCT_GREY_ALPHA; +} + +unsigned lodepng_is_alpha_type(const LodePNGColorMode * info) +{ + return (info->colortype & 4) != 0; /*4 or 6*/ +} + +unsigned lodepng_is_palette_type(const LodePNGColorMode * info) +{ + return info->colortype == LCT_PALETTE; +} + +unsigned lodepng_has_palette_alpha(const LodePNGColorMode * info) +{ + size_t i; + for(i = 0; i != info->palettesize; ++i) { + if(info->palette[i * 4 + 3] < 255) return 1; + } + return 0; +} + +unsigned lodepng_can_have_alpha(const LodePNGColorMode * info) +{ + return info->key_defined + || lodepng_is_alpha_type(info) + || lodepng_has_palette_alpha(info); +} + +static size_t lodepng_get_raw_size_lct(unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + size_t bpp = lodepng_get_bpp_lct(colortype, bitdepth); + size_t n = (size_t)w * (size_t)h; + return ((n / 8u) * bpp) + ((n & 7u) * bpp + 7u) / 8u; +} + +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode * color) +{ + return lodepng_get_raw_size_lct(w, h, color->colortype, color->bitdepth); +} + + +#ifdef LODEPNG_COMPILE_PNG + +/*in an idat chunk, each scanline is a multiple of 8 bits, unlike the lodepng output buffer, +and in addition has one extra byte per line: the filter byte. So this gives a larger +result than lodepng_get_raw_size. Set h to 1 to get the size of 1 row including filter byte. */ +static size_t lodepng_get_raw_size_idat(unsigned w, unsigned h, unsigned bpp) +{ + /* + 1 for the filter byte, and possibly plus padding bits per line. */ + /* Ignoring casts, the expression is equal to (w * bpp + 7) / 8 + 1, but avoids overflow of w * bpp */ + size_t line = ((size_t)(w / 8u) * bpp) + 1u + ((w & 7u) * bpp + 7u) / 8u; + return (size_t)h * line; +} + +#ifdef LODEPNG_COMPILE_DECODER +/*Safely checks whether size_t overflow can be caused due to amount of pixels. +This check is overcautious rather than precise. If this check indicates no overflow, +you can safely compute in a size_t (but not an unsigned): +-(size_t)w * (size_t)h * 8 +-amount of bytes in IDAT (including filter, padding and Adam7 bytes) +-amount of bytes in raw color model +Returns 1 if overflow possible, 0 if not. +*/ +static int lodepng_pixel_overflow(unsigned w, unsigned h, + const LodePNGColorMode * pngcolor, const LodePNGColorMode * rawcolor) +{ + size_t bpp = LODEPNG_MAX(lodepng_get_bpp(pngcolor), lodepng_get_bpp(rawcolor)); + size_t numpixels, total; + size_t line; /* bytes per line in worst case */ + + if(lodepng_mulofl((size_t)w, (size_t)h, &numpixels)) return 1; + if(lodepng_mulofl(numpixels, 8, &total)) return 1; /* bit pointer with 8-bit color, or 8 bytes per channel color */ + + /* Bytes per scanline with the expression "(w / 8u) * bpp) + ((w & 7u) * bpp + 7u) / 8u" */ + if(lodepng_mulofl((size_t)(w / 8u), bpp, &line)) return 1; + if(lodepng_addofl(line, ((w & 7u) * bpp + 7u) / 8u, &line)) return 1; + + if(lodepng_addofl(line, 5, &line)) return 1; /* 5 bytes overhead per line: 1 filterbyte, 4 for Adam7 worst case */ + if(lodepng_mulofl(line, h, &total)) return 1; /* Total bytes in worst case */ + + return 0; /* no overflow */ +} +#endif /*LODEPNG_COMPILE_DECODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static void LodePNGUnknownChunks_init(LodePNGInfo * info) +{ + unsigned i; + for(i = 0; i != 3; ++i) info->unknown_chunks_data[i] = 0; + for(i = 0; i != 3; ++i) info->unknown_chunks_size[i] = 0; +} + +static void LodePNGUnknownChunks_cleanup(LodePNGInfo * info) +{ + unsigned i; + for(i = 0; i != 3; ++i) lodepng_free(info->unknown_chunks_data[i]); +} + +static unsigned LodePNGUnknownChunks_copy(LodePNGInfo * dest, const LodePNGInfo * src) +{ + unsigned i; + + LodePNGUnknownChunks_cleanup(dest); + + for(i = 0; i != 3; ++i) { + size_t j; + dest->unknown_chunks_size[i] = src->unknown_chunks_size[i]; + dest->unknown_chunks_data[i] = (unsigned char *)lodepng_malloc(src->unknown_chunks_size[i]); + if(!dest->unknown_chunks_data[i] && dest->unknown_chunks_size[i]) return 83; /*alloc fail*/ + for(j = 0; j < src->unknown_chunks_size[i]; ++j) { + dest->unknown_chunks_data[i][j] = src->unknown_chunks_data[i][j]; + } + } + + return 0; +} + +/******************************************************************************/ + +static void LodePNGText_init(LodePNGInfo * info) +{ + info->text_num = 0; + info->text_keys = NULL; + info->text_strings = NULL; +} + +static void LodePNGText_cleanup(LodePNGInfo * info) +{ + size_t i; + for(i = 0; i != info->text_num; ++i) { + string_cleanup(&info->text_keys[i]); + string_cleanup(&info->text_strings[i]); + } + lodepng_free(info->text_keys); + lodepng_free(info->text_strings); +} + +static unsigned LodePNGText_copy(LodePNGInfo * dest, const LodePNGInfo * source) +{ + size_t i = 0; + dest->text_keys = NULL; + dest->text_strings = NULL; + dest->text_num = 0; + for(i = 0; i != source->text_num; ++i) { + CERROR_TRY_RETURN(lodepng_add_text(dest, source->text_keys[i], source->text_strings[i])); + } + return 0; +} + +static unsigned lodepng_add_text_sized(LodePNGInfo * info, const char * key, const char * str, size_t size) +{ + char ** new_keys = (char **)(lodepng_realloc(info->text_keys, sizeof(char *) * (info->text_num + 1))); + char ** new_strings = (char **)(lodepng_realloc(info->text_strings, sizeof(char *) * (info->text_num + 1))); + + if(new_keys) info->text_keys = new_keys; + if(new_strings) info->text_strings = new_strings; + + if(!new_keys || !new_strings) return 83; /*alloc fail*/ + + ++info->text_num; + info->text_keys[info->text_num - 1] = alloc_string(key); + info->text_strings[info->text_num - 1] = alloc_string_sized(str, size); + if(!info->text_keys[info->text_num - 1] || !info->text_strings[info->text_num - 1]) return 83; /*alloc fail*/ + + return 0; +} + +unsigned lodepng_add_text(LodePNGInfo * info, const char * key, const char * str) +{ + return lodepng_add_text_sized(info, key, str, lodepng_strlen(str)); +} + +void lodepng_clear_text(LodePNGInfo * info) +{ + LodePNGText_cleanup(info); +} + +/******************************************************************************/ + +static void LodePNGIText_init(LodePNGInfo * info) +{ + info->itext_num = 0; + info->itext_keys = NULL; + info->itext_langtags = NULL; + info->itext_transkeys = NULL; + info->itext_strings = NULL; +} + +static void LodePNGIText_cleanup(LodePNGInfo * info) +{ + size_t i; + for(i = 0; i != info->itext_num; ++i) { + string_cleanup(&info->itext_keys[i]); + string_cleanup(&info->itext_langtags[i]); + string_cleanup(&info->itext_transkeys[i]); + string_cleanup(&info->itext_strings[i]); + } + lodepng_free(info->itext_keys); + lodepng_free(info->itext_langtags); + lodepng_free(info->itext_transkeys); + lodepng_free(info->itext_strings); +} + +static unsigned LodePNGIText_copy(LodePNGInfo * dest, const LodePNGInfo * source) +{ + size_t i = 0; + dest->itext_keys = NULL; + dest->itext_langtags = NULL; + dest->itext_transkeys = NULL; + dest->itext_strings = NULL; + dest->itext_num = 0; + for(i = 0; i != source->itext_num; ++i) { + CERROR_TRY_RETURN(lodepng_add_itext(dest, source->itext_keys[i], source->itext_langtags[i], + source->itext_transkeys[i], source->itext_strings[i])); + } + return 0; +} + +void lodepng_clear_itext(LodePNGInfo * info) +{ + LodePNGIText_cleanup(info); +} + +static unsigned lodepng_add_itext_sized(LodePNGInfo * info, const char * key, const char * langtag, + const char * transkey, const char * str, size_t size) +{ + char ** new_keys = (char **)(lodepng_realloc(info->itext_keys, sizeof(char *) * (info->itext_num + 1))); + char ** new_langtags = (char **)(lodepng_realloc(info->itext_langtags, sizeof(char *) * (info->itext_num + 1))); + char ** new_transkeys = (char **)(lodepng_realloc(info->itext_transkeys, sizeof(char *) * (info->itext_num + 1))); + char ** new_strings = (char **)(lodepng_realloc(info->itext_strings, sizeof(char *) * (info->itext_num + 1))); + + if(new_keys) info->itext_keys = new_keys; + if(new_langtags) info->itext_langtags = new_langtags; + if(new_transkeys) info->itext_transkeys = new_transkeys; + if(new_strings) info->itext_strings = new_strings; + + if(!new_keys || !new_langtags || !new_transkeys || !new_strings) return 83; /*alloc fail*/ + + ++info->itext_num; + + info->itext_keys[info->itext_num - 1] = alloc_string(key); + info->itext_langtags[info->itext_num - 1] = alloc_string(langtag); + info->itext_transkeys[info->itext_num - 1] = alloc_string(transkey); + info->itext_strings[info->itext_num - 1] = alloc_string_sized(str, size); + + return 0; +} + +unsigned lodepng_add_itext(LodePNGInfo * info, const char * key, const char * langtag, + const char * transkey, const char * str) +{ + return lodepng_add_itext_sized(info, key, langtag, transkey, str, lodepng_strlen(str)); +} + +/* same as set but does not delete */ +static unsigned lodepng_assign_icc(LodePNGInfo * info, const char * name, const unsigned char * profile, + unsigned profile_size) +{ + if(profile_size == 0) return 100; /*invalid ICC profile size*/ + + info->iccp_name = alloc_string(name); + info->iccp_profile = (unsigned char *)lodepng_malloc(profile_size); + + if(!info->iccp_name || !info->iccp_profile) return 83; /*alloc fail*/ + + lodepng_memcpy(info->iccp_profile, profile, profile_size); + info->iccp_profile_size = profile_size; + + return 0; /*ok*/ +} + +unsigned lodepng_set_icc(LodePNGInfo * info, const char * name, const unsigned char * profile, unsigned profile_size) +{ + if(info->iccp_name) lodepng_clear_icc(info); + info->iccp_defined = 1; + + return lodepng_assign_icc(info, name, profile, profile_size); +} + +void lodepng_clear_icc(LodePNGInfo * info) +{ + string_cleanup(&info->iccp_name); + lodepng_free(info->iccp_profile); + info->iccp_profile = NULL; + info->iccp_profile_size = 0; + info->iccp_defined = 0; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +void lodepng_info_init(LodePNGInfo * info) +{ + lodepng_color_mode_init(&info->color); + info->interlace_method = 0; + info->compression_method = 0; + info->filter_method = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + info->background_defined = 0; + info->background_r = info->background_g = info->background_b = 0; + + LodePNGText_init(info); + LodePNGIText_init(info); + + info->time_defined = 0; + info->phys_defined = 0; + + info->gama_defined = 0; + info->chrm_defined = 0; + info->srgb_defined = 0; + info->iccp_defined = 0; + info->iccp_name = NULL; + info->iccp_profile = NULL; + + info->sbit_defined = 0; + info->sbit_r = info->sbit_g = info->sbit_b = info->sbit_a = 0; + + LodePNGUnknownChunks_init(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +void lodepng_info_cleanup(LodePNGInfo * info) +{ + lodepng_color_mode_cleanup(&info->color); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + LodePNGText_cleanup(info); + LodePNGIText_cleanup(info); + + lodepng_clear_icc(info); + + LodePNGUnknownChunks_cleanup(info); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +unsigned lodepng_info_copy(LodePNGInfo * dest, const LodePNGInfo * source) +{ + lodepng_info_cleanup(dest); + lodepng_memcpy(dest, source, sizeof(LodePNGInfo)); + lodepng_color_mode_init(&dest->color); + CERROR_TRY_RETURN(lodepng_color_mode_copy(&dest->color, &source->color)); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + CERROR_TRY_RETURN(LodePNGText_copy(dest, source)); + CERROR_TRY_RETURN(LodePNGIText_copy(dest, source)); + if(source->iccp_defined) { + CERROR_TRY_RETURN(lodepng_assign_icc(dest, source->iccp_name, source->iccp_profile, source->iccp_profile_size)); + } + + LodePNGUnknownChunks_init(dest); + CERROR_TRY_RETURN(LodePNGUnknownChunks_copy(dest, source)); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + return 0; +} + +/* ////////////////////////////////////////////////////////////////////////// */ + +/*index: bitgroup index, bits: bitgroup size(1, 2 or 4), in: bitgroup value, out: octet array to add bits to*/ +static void addColorBits(unsigned char * out, size_t index, unsigned bits, unsigned in) +{ + unsigned m = bits == 1 ? 7 : bits == 2 ? 3 : 1; /*8 / bits - 1*/ + /*p = the partial index in the byte, e.g. with 4 palettebits it is 0 for first half or 1 for second half*/ + unsigned p = index & m; + in &= (1u << bits) - 1u; /*filter out any other bits of the input value*/ + in = in << (bits * (m - p)); + if(p == 0) out[index * bits / 8u] = in; + else out[index * bits / 8u] |= in; +} + +typedef struct ColorTree ColorTree; + +/* +One node of a color tree +This is the data structure used to count the number of unique colors and to get a palette +index for a color. It's like an octree, but because the alpha channel is used too, each +node has 16 instead of 8 children. +*/ +struct ColorTree { + ColorTree * children[16]; /*up to 16 pointers to ColorTree of next level*/ + int index; /*the payload. Only has a meaningful value if this is in the last level*/ +}; + +static void color_tree_init(ColorTree * tree) +{ + lodepng_memset(tree->children, 0, 16 * sizeof(*tree->children)); + tree->index = -1; +} + +static void color_tree_cleanup(ColorTree * tree) +{ + int i; + for(i = 0; i != 16; ++i) { + if(tree->children[i]) { + color_tree_cleanup(tree->children[i]); + lodepng_free(tree->children[i]); + } + } +} + +/*returns -1 if color not present, its index otherwise*/ +static int color_tree_get(ColorTree * tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + int bit = 0; + for(bit = 0; bit < 8; ++bit) { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) return -1; + else tree = tree->children[i]; + } + return tree ? tree->index : -1; +} + +#ifdef LODEPNG_COMPILE_ENCODER +static int color_tree_has(ColorTree * tree, unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + return color_tree_get(tree, r, g, b, a) >= 0; +} +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/*color is not allowed to already exist. +Index should be >= 0 (it's signed to be compatible with using -1 for "doesn't exist") +Returns error code, or 0 if ok*/ +static unsigned color_tree_add(ColorTree * tree, + unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned index) +{ + int bit; + for(bit = 0; bit < 8; ++bit) { + int i = 8 * ((r >> bit) & 1) + 4 * ((g >> bit) & 1) + 2 * ((b >> bit) & 1) + 1 * ((a >> bit) & 1); + if(!tree->children[i]) { + tree->children[i] = (ColorTree *)lodepng_malloc(sizeof(ColorTree)); + if(!tree->children[i]) return 83; /*alloc fail*/ + color_tree_init(tree->children[i]); + } + tree = tree->children[i]; + } + tree->index = (int)index; + return 0; +} + +/*put a pixel, given its RGBA color, into image of any color type*/ +static unsigned rgba8ToPixel(unsigned char * out, size_t i, + const LodePNGColorMode * mode, ColorTree * tree /*for palette*/, + unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + if(mode->colortype == LCT_GREY) { + unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ + if(mode->bitdepth == 8) out[i] = gray; + else if(mode->bitdepth == 16) out[i * 2 + 0] = out[i * 2 + 1] = gray; + else { + /*take the most significant bits of gray*/ + gray = ((unsigned)gray >> (8u - mode->bitdepth)) & ((1u << mode->bitdepth) - 1u); + addColorBits(out, i, mode->bitdepth, gray); + } + } + else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + out[i * 3 + 0] = r; + out[i * 3 + 1] = g; + out[i * 3 + 2] = b; + } + else { + out[i * 6 + 0] = out[i * 6 + 1] = r; + out[i * 6 + 2] = out[i * 6 + 3] = g; + out[i * 6 + 4] = out[i * 6 + 5] = b; + } + } + else if(mode->colortype == LCT_PALETTE) { + int index = color_tree_get(tree, r, g, b, a); + if(index < 0) return 82; /*color not in palette*/ + if(mode->bitdepth == 8) out[i] = index; + else addColorBits(out, i, mode->bitdepth, (unsigned)index); + } + else if(mode->colortype == LCT_GREY_ALPHA) { + unsigned char gray = r; /*((unsigned short)r + g + b) / 3u;*/ + if(mode->bitdepth == 8) { + out[i * 2 + 0] = gray; + out[i * 2 + 1] = a; + } + else if(mode->bitdepth == 16) { + out[i * 4 + 0] = out[i * 4 + 1] = gray; + out[i * 4 + 2] = out[i * 4 + 3] = a; + } + } + else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + out[i * 4 + 0] = r; + out[i * 4 + 1] = g; + out[i * 4 + 2] = b; + out[i * 4 + 3] = a; + } + else { + out[i * 8 + 0] = out[i * 8 + 1] = r; + out[i * 8 + 2] = out[i * 8 + 3] = g; + out[i * 8 + 4] = out[i * 8 + 5] = b; + out[i * 8 + 6] = out[i * 8 + 7] = a; + } + } + + return 0; /*no error*/ +} + +/*put a pixel, given its RGBA16 color, into image of any color 16-bitdepth type*/ +static void rgba16ToPixel(unsigned char * out, size_t i, + const LodePNGColorMode * mode, + unsigned short r, unsigned short g, unsigned short b, unsigned short a) +{ + if(mode->colortype == LCT_GREY) { + unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ + out[i * 2 + 0] = (gray >> 8) & 255; + out[i * 2 + 1] = gray & 255; + } + else if(mode->colortype == LCT_RGB) { + out[i * 6 + 0] = (r >> 8) & 255; + out[i * 6 + 1] = r & 255; + out[i * 6 + 2] = (g >> 8) & 255; + out[i * 6 + 3] = g & 255; + out[i * 6 + 4] = (b >> 8) & 255; + out[i * 6 + 5] = b & 255; + } + else if(mode->colortype == LCT_GREY_ALPHA) { + unsigned short gray = r; /*((unsigned)r + g + b) / 3u;*/ + out[i * 4 + 0] = (gray >> 8) & 255; + out[i * 4 + 1] = gray & 255; + out[i * 4 + 2] = (a >> 8) & 255; + out[i * 4 + 3] = a & 255; + } + else if(mode->colortype == LCT_RGBA) { + out[i * 8 + 0] = (r >> 8) & 255; + out[i * 8 + 1] = r & 255; + out[i * 8 + 2] = (g >> 8) & 255; + out[i * 8 + 3] = g & 255; + out[i * 8 + 4] = (b >> 8) & 255; + out[i * 8 + 5] = b & 255; + out[i * 8 + 6] = (a >> 8) & 255; + out[i * 8 + 7] = a & 255; + } +} + +/*Get RGBA8 color of pixel with index i (y * width + x) from the raw image with given color type.*/ +static void getPixelColorRGBA8(unsigned char * r, unsigned char * g, + unsigned char * b, unsigned char * a, + const unsigned char * in, size_t i, + const LodePNGColorMode * mode) +{ + if(mode->colortype == LCT_GREY) { + if(mode->bitdepth == 8) { + *r = *g = *b = in[i]; + if(mode->key_defined && *r == mode->key_r) *a = 0; + else *a = 255; + } + else if(mode->bitdepth == 16) { + *r = *g = *b = in[i * 2 + 0]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 255; + } + else { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = i * mode->bitdepth; + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + *r = *g = *b = (value * 255) / highest; + if(mode->key_defined && value == mode->key_r) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + *r = in[i * 3 + 0]; + *g = in[i * 3 + 1]; + *b = in[i * 3 + 2]; + if(mode->key_defined && *r == mode->key_r && *g == mode->key_g && *b == mode->key_b) *a = 0; + else *a = 255; + } + else { + *r = in[i * 6 + 0]; + *g = in[i * 6 + 2]; + *b = in[i * 6 + 4]; + if(mode->key_defined && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 255; + } + } + else if(mode->colortype == LCT_PALETTE) { + unsigned index; + if(mode->bitdepth == 8) index = in[i]; + else { + size_t j = i * mode->bitdepth; + index = readBitsFromReversedStream(&j, in, mode->bitdepth); + } + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + *r = mode->palette[index * 4 + 0]; + *g = mode->palette[index * 4 + 1]; + *b = mode->palette[index * 4 + 2]; + *a = mode->palette[index * 4 + 3]; + } + else if(mode->colortype == LCT_GREY_ALPHA) { + if(mode->bitdepth == 8) { + *r = *g = *b = in[i * 2 + 0]; + *a = in[i * 2 + 1]; + } + else { + *r = *g = *b = in[i * 4 + 0]; + *a = in[i * 4 + 2]; + } + } + else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + *r = in[i * 4 + 0]; + *g = in[i * 4 + 1]; + *b = in[i * 4 + 2]; + *a = in[i * 4 + 3]; + } + else { + *r = in[i * 8 + 0]; + *g = in[i * 8 + 2]; + *b = in[i * 8 + 4]; + *a = in[i * 8 + 6]; + } + } +} + +/*Similar to getPixelColorRGBA8, but with all the for loops inside of the color +mode test cases, optimized to convert the colors much faster, when converting +to the common case of RGBA with 8 bit per channel. buffer must be RGBA with +enough memory.*/ +static void getPixelColorsRGBA8(unsigned char * LODEPNG_RESTRICT buffer, size_t numpixels, + const unsigned char * LODEPNG_RESTRICT in, + const LodePNGColorMode * mode) +{ + unsigned num_channels = 4; + size_t i; + if(mode->colortype == LCT_GREY) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i]; + buffer[3] = 255; + } + if(mode->key_defined) { + buffer -= numpixels * num_channels; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + if(buffer[0] == mode->key_r) buffer[3] = 0; + } + } + } + else if(mode->bitdepth == 16) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2]; + buffer[3] = mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r ? 0 : 255; + } + } + else { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; + buffer[3] = mode->key_defined && value == mode->key_r ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + lodepng_memcpy(buffer, &in[i * 3], 3); + buffer[3] = 255; + } + if(mode->key_defined) { + buffer -= numpixels * num_channels; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + if(buffer[0] == mode->key_r && buffer[1] == mode->key_g && buffer[2] == mode->key_b) buffer[3] = 0; + } + } + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 6 + 0]; + buffer[1] = in[i * 6 + 2]; + buffer[2] = in[i * 6 + 4]; + buffer[3] = mode->key_defined + && 256U * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256U * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256U * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b ? 0 : 255; + } + } + } + else if(mode->colortype == LCT_PALETTE) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = in[i]; + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 4); + } + } + else { + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 4); + } + } + } + else if(mode->colortype == LCT_GREY_ALPHA) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; + buffer[3] = in[i * 2 + 1]; + } + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; + buffer[3] = in[i * 4 + 2]; + } + } + } + else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + lodepng_memcpy(buffer, in, numpixels * 4); + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 8 + 0]; + buffer[1] = in[i * 8 + 2]; + buffer[2] = in[i * 8 + 4]; + buffer[3] = in[i * 8 + 6]; + } + } + } +} + +/*Similar to getPixelColorsRGBA8, but with 3-channel RGB output.*/ +static void getPixelColorsRGB8(unsigned char * LODEPNG_RESTRICT buffer, size_t numpixels, + const unsigned char * LODEPNG_RESTRICT in, + const LodePNGColorMode * mode) +{ + const unsigned num_channels = 3; + size_t i; + if(mode->colortype == LCT_GREY) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i]; + } + } + else if(mode->bitdepth == 16) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2]; + } + } + else { + unsigned highest = ((1U << mode->bitdepth) - 1U); /*highest possible value for this bit depth*/ + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned value = readBitsFromReversedStream(&j, in, mode->bitdepth); + buffer[0] = buffer[1] = buffer[2] = (value * 255) / highest; + } + } + } + else if(mode->colortype == LCT_RGB) { + if(mode->bitdepth == 8) { + lodepng_memcpy(buffer, in, numpixels * 3); + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 6 + 0]; + buffer[1] = in[i * 6 + 2]; + buffer[2] = in[i * 6 + 4]; + } + } + } + else if(mode->colortype == LCT_PALETTE) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = in[i]; + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 3); + } + } + else { + size_t j = 0; + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + unsigned index = readBitsFromReversedStream(&j, in, mode->bitdepth); + /*out of bounds of palette not checked: see lodepng_color_mode_alloc_palette.*/ + lodepng_memcpy(buffer, &mode->palette[index * 4], 3); + } + } + } + else if(mode->colortype == LCT_GREY_ALPHA) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 2 + 0]; + } + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = buffer[1] = buffer[2] = in[i * 4 + 0]; + } + } + } + else if(mode->colortype == LCT_RGBA) { + if(mode->bitdepth == 8) { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + lodepng_memcpy(buffer, &in[i * 4], 3); + } + } + else { + for(i = 0; i != numpixels; ++i, buffer += num_channels) { + buffer[0] = in[i * 8 + 0]; + buffer[1] = in[i * 8 + 2]; + buffer[2] = in[i * 8 + 4]; + } + } + } +} + +/*Get RGBA16 color of pixel with index i (y * width + x) from the raw image with +given color type, but the given color type must be 16-bit itself.*/ +static void getPixelColorRGBA16(unsigned short * r, unsigned short * g, unsigned short * b, unsigned short * a, + const unsigned char * in, size_t i, const LodePNGColorMode * mode) +{ + if(mode->colortype == LCT_GREY) { + *r = *g = *b = 256 * in[i * 2 + 0] + in[i * 2 + 1]; + if(mode->key_defined && 256U * in[i * 2 + 0] + in[i * 2 + 1] == mode->key_r) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_RGB) { + *r = 256u * in[i * 6 + 0] + in[i * 6 + 1]; + *g = 256u * in[i * 6 + 2] + in[i * 6 + 3]; + *b = 256u * in[i * 6 + 4] + in[i * 6 + 5]; + if(mode->key_defined + && 256u * in[i * 6 + 0] + in[i * 6 + 1] == mode->key_r + && 256u * in[i * 6 + 2] + in[i * 6 + 3] == mode->key_g + && 256u * in[i * 6 + 4] + in[i * 6 + 5] == mode->key_b) *a = 0; + else *a = 65535; + } + else if(mode->colortype == LCT_GREY_ALPHA) { + *r = *g = *b = 256u * in[i * 4 + 0] + in[i * 4 + 1]; + *a = 256u * in[i * 4 + 2] + in[i * 4 + 3]; + } + else if(mode->colortype == LCT_RGBA) { + *r = 256u * in[i * 8 + 0] + in[i * 8 + 1]; + *g = 256u * in[i * 8 + 2] + in[i * 8 + 3]; + *b = 256u * in[i * 8 + 4] + in[i * 8 + 5]; + *a = 256u * in[i * 8 + 6] + in[i * 8 + 7]; + } +} + +unsigned lodepng_convert(unsigned char * out, const unsigned char * in, + const LodePNGColorMode * mode_out, const LodePNGColorMode * mode_in, + unsigned w, unsigned h) +{ + size_t i; + ColorTree tree; + size_t numpixels = (size_t)w * (size_t)h; + unsigned error = 0; + + if(mode_in->colortype == LCT_PALETTE && !mode_in->palette) { + return 107; /* error: must provide palette if input mode is palette */ + } + + if(lodepng_color_mode_equal(mode_out, mode_in)) { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + lodepng_memcpy(out, in, numbytes); + return 0; + } + + if(mode_out->colortype == LCT_PALETTE) { + size_t palettesize = mode_out->palettesize; + const unsigned char * palette = mode_out->palette; + size_t palsize = (size_t)1u << mode_out->bitdepth; + /*if the user specified output palette but did not give the values, assume + they want the values of the input color type (assuming that one is palette). + Note that we never create a new palette ourselves.*/ + if(palettesize == 0) { + palettesize = mode_in->palettesize; + palette = mode_in->palette; + /*if the input was also palette with same bitdepth, then the color types are also + equal, so copy literally. This to preserve the exact indices that were in the PNG + even in case there are duplicate colors in the palette.*/ + if(mode_in->colortype == LCT_PALETTE && mode_in->bitdepth == mode_out->bitdepth) { + size_t numbytes = lodepng_get_raw_size(w, h, mode_in); + lodepng_memcpy(out, in, numbytes); + return 0; + } + } + if(palettesize < palsize) palsize = palettesize; + color_tree_init(&tree); + for(i = 0; i != palsize; ++i) { + const unsigned char * p = &palette[i * 4]; + error = color_tree_add(&tree, p[0], p[1], p[2], p[3], (unsigned)i); + if(error) break; + } + } + + if(!error) { + if(mode_in->bitdepth == 16 && mode_out->bitdepth == 16) { + for(i = 0; i != numpixels; ++i) { + unsigned short r = 0, g = 0, b = 0, a = 0; + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + rgba16ToPixel(out, i, mode_out, r, g, b, a); + } + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGBA) { + getPixelColorsRGBA8(out, numpixels, in, mode_in); + } + else if(mode_out->bitdepth == 8 && mode_out->colortype == LCT_RGB) { + getPixelColorsRGB8(out, numpixels, in, mode_in); + } + else { + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + error = rgba8ToPixel(out, i, mode_out, &tree, r, g, b, a); + if(error) break; + } + } + } + + if(mode_out->colortype == LCT_PALETTE) { + color_tree_cleanup(&tree); + } + + return error; +} + + +/* Converts a single rgb color without alpha from one type to another, color bits truncated to +their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow +function, do not use to process all pixels of an image. Alpha channel not supported on purpose: +this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the +specification it looks like bKGD should ignore the alpha values of the palette since it can use +any palette index but doesn't have an alpha channel. Idem with ignoring color key. */ +static unsigned lodepng_convert_rgb( + unsigned * r_out, unsigned * g_out, unsigned * b_out, + unsigned r_in, unsigned g_in, unsigned b_in, + const LodePNGColorMode * mode_out, const LodePNGColorMode * mode_in) +{ + unsigned r = 0, g = 0, b = 0; + unsigned mul = 65535 / ((1u << mode_in->bitdepth) - 1u); /*65535, 21845, 4369, 257, 1*/ + unsigned shift = 16 - mode_out->bitdepth; + + if(mode_in->colortype == LCT_GREY || mode_in->colortype == LCT_GREY_ALPHA) { + r = g = b = r_in * mul; + } + else if(mode_in->colortype == LCT_RGB || mode_in->colortype == LCT_RGBA) { + r = r_in * mul; + g = g_in * mul; + b = b_in * mul; + } + else if(mode_in->colortype == LCT_PALETTE) { + if(r_in >= mode_in->palettesize) return 82; + r = mode_in->palette[r_in * 4 + 0] * 257u; + g = mode_in->palette[r_in * 4 + 1] * 257u; + b = mode_in->palette[r_in * 4 + 2] * 257u; + } + else { + return 31; + } + + /* now convert to output format */ + if(mode_out->colortype == LCT_GREY || mode_out->colortype == LCT_GREY_ALPHA) { + *r_out = r >> shift ; + } + else if(mode_out->colortype == LCT_RGB || mode_out->colortype == LCT_RGBA) { + *r_out = r >> shift ; + *g_out = g >> shift ; + *b_out = b >> shift ; + } + else if(mode_out->colortype == LCT_PALETTE) { + unsigned i; + /* a 16-bit color cannot be in the palette */ + if((r >> 8) != (r & 255) || (g >> 8) != (g & 255) || (b >> 8) != (b & 255)) return 82; + for(i = 0; i < mode_out->palettesize; i++) { + unsigned j = i * 4; + if((r >> 8) == mode_out->palette[j + 0] && (g >> 8) == mode_out->palette[j + 1] && + (b >> 8) == mode_out->palette[j + 2]) { + *r_out = i; + return 0; + } + } + return 82; + } + else { + return 31; + } + + return 0; +} + +#ifdef LODEPNG_COMPILE_ENCODER + +void lodepng_color_stats_init(LodePNGColorStats * stats) +{ + /*stats*/ + stats->colored = 0; + stats->key = 0; + stats->key_r = stats->key_g = stats->key_b = 0; + stats->alpha = 0; + stats->numcolors = 0; + stats->bits = 1; + stats->numpixels = 0; + /*settings*/ + stats->allow_palette = 1; + stats->allow_greyscale = 1; +} + +/*function used for debug purposes with C++*/ +/*void printColorStats(LodePNGColorStats* p) { + std::cout << "colored: " << (int)p->colored << ", "; + std::cout << "key: " << (int)p->key << ", "; + std::cout << "key_r: " << (int)p->key_r << ", "; + std::cout << "key_g: " << (int)p->key_g << ", "; + std::cout << "key_b: " << (int)p->key_b << ", "; + std::cout << "alpha: " << (int)p->alpha << ", "; + std::cout << "numcolors: " << (int)p->numcolors << ", "; + std::cout << "bits: " << (int)p->bits << std::endl; +}*/ + +/*Returns how many bits needed to represent given value (max 8 bit)*/ +static unsigned getValueRequiredBits(unsigned char value) +{ + if(value == 0 || value == 255) return 1; + /*The scaling of 2-bit and 4-bit values uses multiples of 85 and 17*/ + if(value % 17 == 0) return value % 85 == 0 ? 2 : 4; + return 8; +} + +/*stats must already have been inited. */ +unsigned lodepng_compute_color_stats(LodePNGColorStats * stats, + const unsigned char * in, unsigned w, unsigned h, + const LodePNGColorMode * mode_in) +{ + size_t i; + ColorTree tree; + size_t numpixels = (size_t)w * (size_t)h; + unsigned error = 0; + + /* mark things as done already if it would be impossible to have a more expensive case */ + unsigned colored_done = lodepng_is_greyscale_type(mode_in) ? 1 : 0; + unsigned alpha_done = lodepng_can_have_alpha(mode_in) ? 0 : 1; + unsigned numcolors_done = 0; + unsigned bpp = lodepng_get_bpp(mode_in); + unsigned bits_done = (stats->bits == 1 && bpp == 1) ? 1 : 0; + unsigned sixteen = 0; /* whether the input image is 16 bit */ + unsigned maxnumcolors = 257; + if(bpp <= 8) maxnumcolors = LODEPNG_MIN(257, stats->numcolors + (1u << bpp)); + + stats->numpixels += numpixels; + + /*if palette not allowed, no need to compute numcolors*/ + if(!stats->allow_palette) numcolors_done = 1; + + color_tree_init(&tree); + + /*If the stats was already filled in from previous data, fill its palette in tree + and mark things as done already if we know they are the most expensive case already*/ + if(stats->alpha) alpha_done = 1; + if(stats->colored) colored_done = 1; + if(stats->bits == 16) numcolors_done = 1; + if(stats->bits >= bpp) bits_done = 1; + if(stats->numcolors >= maxnumcolors) numcolors_done = 1; + + if(!numcolors_done) { + for(i = 0; i < stats->numcolors; i++) { + const unsigned char * color = &stats->palette[i * 4]; + error = color_tree_add(&tree, color[0], color[1], color[2], color[3], (unsigned)i); + if(error) goto cleanup; + } + } + + /*Check if the 16-bit input is truly 16-bit*/ + if(mode_in->bitdepth == 16 && !sixteen) { + unsigned short r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + if((r & 255) != ((r >> 8) & 255) || (g & 255) != ((g >> 8) & 255) || + (b & 255) != ((b >> 8) & 255) || (a & 255) != ((a >> 8) & 255)) { /*first and second byte differ*/ + stats->bits = 16; + sixteen = 1; + bits_done = 1; + numcolors_done = 1; /*counting colors no longer useful, palette doesn't support 16-bit*/ + break; + } + } + } + + if(sixteen) { + unsigned short r = 0, g = 0, b = 0, a = 0; + + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + + if(!colored_done && (r != g || r != b)) { + stats->colored = 1; + colored_done = 1; + } + + if(!alpha_done) { + unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); + if(a != 65535 && (a != 0 || (stats->key && !matchkey))) { + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + } + else if(a == 0 && !stats->alpha && !stats->key) { + stats->key = 1; + stats->key_r = r; + stats->key_g = g; + stats->key_b = b; + } + else if(a == 65535 && stats->key && matchkey) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + } + } + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(stats->key && !stats->alpha) { + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA16(&r, &g, &b, &a, in, i, mode_in); + if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + } + } + } + } + else { /* < 16-bit */ + unsigned char r = 0, g = 0, b = 0, a = 0; + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + + if(!bits_done && stats->bits < 8) { + /*only r is checked, < 8 bits is only relevant for grayscale*/ + unsigned bits = getValueRequiredBits(r); + if(bits > stats->bits) stats->bits = bits; + } + bits_done = (stats->bits >= bpp); + + if(!colored_done && (r != g || r != b)) { + stats->colored = 1; + colored_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no colored modes with less than 8-bit per channel*/ + } + + if(!alpha_done) { + unsigned matchkey = (r == stats->key_r && g == stats->key_g && b == stats->key_b); + if(a != 255 && (a != 0 || (stats->key && !matchkey))) { + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + else if(a == 0 && !stats->alpha && !stats->key) { + stats->key = 1; + stats->key_r = r; + stats->key_g = g; + stats->key_b = b; + } + else if(a == 255 && stats->key && matchkey) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + } + + if(!numcolors_done) { + if(!color_tree_has(&tree, r, g, b, a)) { + error = color_tree_add(&tree, r, g, b, a, stats->numcolors); + if(error) goto cleanup; + if(stats->numcolors < 256) { + unsigned char * p = stats->palette; + unsigned n = stats->numcolors; + p[n * 4 + 0] = r; + p[n * 4 + 1] = g; + p[n * 4 + 2] = b; + p[n * 4 + 3] = a; + } + ++stats->numcolors; + numcolors_done = stats->numcolors >= maxnumcolors; + } + } + + if(alpha_done && numcolors_done && colored_done && bits_done) break; + } + + if(stats->key && !stats->alpha) { + for(i = 0; i != numpixels; ++i) { + getPixelColorRGBA8(&r, &g, &b, &a, in, i, mode_in); + if(a != 0 && r == stats->key_r && g == stats->key_g && b == stats->key_b) { + /* Color key cannot be used if an opaque pixel also has that RGB color. */ + stats->alpha = 1; + stats->key = 0; + alpha_done = 1; + if(stats->bits < 8) stats->bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + } + } + + /*make the stats's key always 16-bit for consistency - repeat each byte twice*/ + stats->key_r += (stats->key_r << 8); + stats->key_g += (stats->key_g << 8); + stats->key_b += (stats->key_b << 8); + } + +cleanup: + color_tree_cleanup(&tree); + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*Adds a single color to the color stats. The stats must already have been inited. The color must be given as 16-bit +(with 2 bytes repeating for 8-bit and 65535 for opaque alpha channel). This function is expensive, do not call it for +all pixels of an image but only for a few additional values. */ +static unsigned lodepng_color_stats_add(LodePNGColorStats * stats, + unsigned r, unsigned g, unsigned b, unsigned a) +{ + unsigned error = 0; + unsigned char image[8]; + LodePNGColorMode mode; + lodepng_color_mode_init(&mode); + image[0] = r >> 8; + image[1] = r; + image[2] = g >> 8; + image[3] = g; + image[4] = b >> 8; + image[5] = b; + image[6] = a >> 8; + image[7] = a; + mode.bitdepth = 16; + mode.colortype = LCT_RGBA; + error = lodepng_compute_color_stats(stats, image, 1, 1, &mode); + lodepng_color_mode_cleanup(&mode); + return error; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Computes a minimal PNG color model that can contain all colors as indicated by the stats. +The stats should be computed with lodepng_compute_color_stats. +mode_in is raw color profile of the image the stats were computed on, to copy palette order from when relevant. +Minimal PNG color model means the color type and bit depth that gives smallest amount of bits in the output image, +e.g. gray if only grayscale pixels, palette if less than 256 colors, color key if only single transparent color, ... +This is used if auto_convert is enabled (it is by default). +*/ +static unsigned auto_choose_color(LodePNGColorMode * mode_out, + const LodePNGColorMode * mode_in, + const LodePNGColorStats * stats) +{ + unsigned error = 0; + unsigned palettebits; + size_t i, n; + size_t numpixels = stats->numpixels; + unsigned palette_ok, gray_ok; + + unsigned alpha = stats->alpha; + unsigned key = stats->key; + unsigned bits = stats->bits; + + mode_out->key_defined = 0; + + if(key && numpixels <= 16) { + alpha = 1; /*too few pixels to justify tRNS chunk overhead*/ + key = 0; + if(bits < 8) bits = 8; /*PNG has no alphachannel modes with less than 8-bit per channel*/ + } + + gray_ok = !stats->colored; + if(!stats->allow_greyscale) gray_ok = 0; + if(!gray_ok && bits < 8) bits = 8; + + n = stats->numcolors; + palettebits = n <= 2 ? 1 : (n <= 4 ? 2 : (n <= 16 ? 4 : 8)); + palette_ok = n <= 256 && bits <= 8 && n != 0; /*n==0 means likely numcolors wasn't computed*/ + if(numpixels < n * 2) palette_ok = 0; /*don't add palette overhead if image has only a few pixels*/ + if(gray_ok && !alpha && bits <= palettebits) palette_ok = 0; /*gray is less overhead*/ + if(!stats->allow_palette) palette_ok = 0; + + if(palette_ok) { + const unsigned char * p = stats->palette; + lodepng_palette_clear(mode_out); /*remove potential earlier palette*/ + for(i = 0; i != stats->numcolors; ++i) { + error = lodepng_palette_add(mode_out, p[i * 4 + 0], p[i * 4 + 1], p[i * 4 + 2], p[i * 4 + 3]); + if(error) break; + } + + mode_out->colortype = LCT_PALETTE; + mode_out->bitdepth = palettebits; + + if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize + && mode_in->bitdepth == mode_out->bitdepth) { + /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ + lodepng_color_mode_cleanup(mode_out); /*clears palette, keeps the above set colortype and bitdepth fields as-is*/ + lodepng_color_mode_copy(mode_out, mode_in); + } + } + else { /*8-bit or 16-bit per channel*/ + mode_out->bitdepth = bits; + mode_out->colortype = alpha ? (gray_ok ? LCT_GREY_ALPHA : LCT_RGBA) + : (gray_ok ? LCT_GREY : LCT_RGB); + if(key) { + unsigned mask = (1u << mode_out->bitdepth) - 1u; /*stats always uses 16-bit, mask converts it*/ + mode_out->key_r = stats->key_r & mask; + mode_out->key_g = stats->key_g & mask; + mode_out->key_b = stats->key_b & mask; + mode_out->key_defined = 1; + } + } + + return error; +} + +#endif /* #ifdef LODEPNG_COMPILE_ENCODER */ + +/*Paeth predictor, used by PNG filter type 4*/ +static unsigned char paethPredictor(unsigned char a, unsigned char b, unsigned char c) +{ + /* the subtractions of unsigned char cast it to a signed type. + With gcc, short is faster than int, with clang int is as fast (as of april 2023)*/ + short pa = (b - c) < 0 ? -(b - c) : (b - c); + short pb = (a - c) < 0 ? -(a - c) : (a - c); + /* writing it out like this compiles to something faster than introducing a temp variable*/ + short pc = (a + b - c - c) < 0 ? -(a + b - c - c) : (a + b - c - c); + /* return input value associated with smallest of pa, pb, pc (with certain priority if equal) */ + if(pb < pa) { + a = b; + pa = pb; + } + return (pc < pa) ? c : a; +} + +/*shared values used by multiple Adam7 related functions*/ + +static const unsigned ADAM7_IX[7] = { 0, 4, 0, 2, 0, 1, 0 }; /*x start values*/ +static const unsigned ADAM7_IY[7] = { 0, 0, 4, 0, 2, 0, 1 }; /*y start values*/ +static const unsigned ADAM7_DX[7] = { 8, 8, 4, 4, 2, 2, 1 }; /*x delta values*/ +static const unsigned ADAM7_DY[7] = { 8, 8, 8, 4, 4, 2, 2 }; /*y delta values*/ + +/* +Outputs various dimensions and positions in the image related to the Adam7 reduced images. +passw: output containing the width of the 7 passes +passh: output containing the height of the 7 passes +filter_passstart: output containing the index of the start and end of each + reduced image with filter bytes +padded_passstart output containing the index of the start and end of each + reduced image when without filter bytes but with padded scanlines +passstart: output containing the index of the start and end of each reduced + image without padding between scanlines, but still padding between the images +w, h: width and height of non-interlaced image +bpp: bits per pixel +"padded" is only relevant if bpp is less than 8 and a scanline or image does not + end at a full byte +*/ +static void Adam7_getpassvalues(unsigned passw[7], unsigned passh[7], size_t filter_passstart[8], + size_t padded_passstart[8], size_t passstart[8], unsigned w, unsigned h, unsigned bpp) +{ + /*the passstart values have 8 values: the 8th one indicates the byte after the end of the 7th (= last) pass*/ + unsigned i; + + /*calculate width and height in pixels of each pass*/ + for(i = 0; i != 7; ++i) { + passw[i] = (w + ADAM7_DX[i] - ADAM7_IX[i] - 1) / ADAM7_DX[i]; + passh[i] = (h + ADAM7_DY[i] - ADAM7_IY[i] - 1) / ADAM7_DY[i]; + if(passw[i] == 0) passh[i] = 0; + if(passh[i] == 0) passw[i] = 0; + } + + filter_passstart[0] = padded_passstart[0] = passstart[0] = 0; + for(i = 0; i != 7; ++i) { + /*if passw[i] is 0, it's 0 bytes, not 1 (no filtertype-byte)*/ + filter_passstart[i + 1] = filter_passstart[i] + + ((passw[i] && passh[i]) ? passh[i] * (1u + (passw[i] * bpp + 7u) / 8u) : 0); + /*bits padded if needed to fill full byte at end of each scanline*/ + padded_passstart[i + 1] = padded_passstart[i] + passh[i] * ((passw[i] * bpp + 7u) / 8u); + /*only padded at end of reduced image*/ + passstart[i + 1] = passstart[i] + (passh[i] * passw[i] * bpp + 7u) / 8u; + } +} + +#ifdef LODEPNG_COMPILE_DECODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Decoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + +/*read the information from the header and store it in the LodePNGInfo. return value is error*/ +unsigned lodepng_inspect(unsigned * w, unsigned * h, LodePNGState * state, + const unsigned char * in, size_t insize) +{ + unsigned width, height; + LodePNGInfo * info = &state->info_png; + if(insize == 0 || in == 0) { + CERROR_RETURN_ERROR(state->error, 48); /*error: the given data is empty*/ + } + if(insize < 33) { + CERROR_RETURN_ERROR(state->error, 27); /*error: the data length is smaller than the length of a PNG header*/ + } + + /*when decoding a new PNG image, make sure all parameters created after previous decoding are reset*/ + /* TODO: remove this. One should use a new LodePNGState for new sessions */ + lodepng_info_cleanup(info); + lodepng_info_init(info); + + if(in[0] != 137 || in[1] != 80 || in[2] != 78 || in[3] != 71 + || in[4] != 13 || in[5] != 10 || in[6] != 26 || in[7] != 10) { + CERROR_RETURN_ERROR(state->error, 28); /*error: the first 8 bytes are not the correct PNG signature*/ + } + if(lodepng_chunk_length(in + 8) != 13) { + CERROR_RETURN_ERROR(state->error, 94); /*error: header size must be 13 bytes*/ + } + if(!lodepng_chunk_type_equals(in + 8, "IHDR")) { + CERROR_RETURN_ERROR(state->error, 29); /*error: it doesn't start with a IHDR chunk!*/ + } + + /*read the values given in the header*/ + width = lodepng_read32bitInt(&in[16]); + height = lodepng_read32bitInt(&in[20]); + /*TODO: remove the undocumented feature that allows to give null pointers to width or height*/ + if(w) *w = width; + if(h) *h = height; + info->color.bitdepth = in[24]; + info->color.colortype = (LodePNGColorType)in[25]; + info->compression_method = in[26]; + info->filter_method = in[27]; + info->interlace_method = in[28]; + + /*errors returned only after the parsing so other values are still output*/ + + /*error: invalid image size*/ + if(width == 0 || height == 0) CERROR_RETURN_ERROR(state->error, 93); + /*error: invalid colortype or bitdepth combination*/ + state->error = checkColorValidity(info->color.colortype, info->color.bitdepth); + if(state->error) return state->error; + /*error: only compression method 0 is allowed in the specification*/ + if(info->compression_method != 0) CERROR_RETURN_ERROR(state->error, 32); + /*error: only filter method 0 is allowed in the specification*/ + if(info->filter_method != 0) CERROR_RETURN_ERROR(state->error, 33); + /*error: only interlace methods 0 and 1 exist in the specification*/ + if(info->interlace_method > 1) CERROR_RETURN_ERROR(state->error, 34); + + if(!state->decoder.ignore_crc) { + unsigned CRC = lodepng_read32bitInt(&in[29]); + unsigned checksum = lodepng_crc32(&in[12], 17); + if(CRC != checksum) { + CERROR_RETURN_ERROR(state->error, 57); /*invalid CRC*/ + } + } + + return state->error; +} + +static unsigned unfilterScanline(unsigned char * recon, const unsigned char * scanline, const unsigned char * precon, + size_t bytewidth, unsigned char filterType, size_t length) +{ + /* + For PNG filter method 0 + unfilter a PNG image scanline by scanline. when the pixels are smaller than 1 byte, + the filter works byte per byte (bytewidth = 1) + precon is the previous unfiltered scanline, recon the result, scanline the current one + the incoming scanlines do NOT include the filtertype byte, that one is given in the parameter filterType instead + recon and scanline MAY be the same memory address! precon must be disjoint. + */ + + size_t i; + switch(filterType) { + case 0: + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + break; + case 1: { + size_t j = 0; + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + recon[j]; + break; + } + case 2: + if(precon) { + for(i = 0; i != length; ++i) recon[i] = scanline[i] + precon[i]; + } + else { + for(i = 0; i != length; ++i) recon[i] = scanline[i]; + } + break; + case 3: + if(precon) { + size_t j = 0; + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i] + (precon[i] >> 1u); + /* Unroll independent paths of this predictor. A 6x and 8x version is also possible but that adds + too much code. Whether this speeds up anything depends on compiler and settings. */ + if(bytewidth >= 4) { + for(; i + 3 < length; i += 4, j += 4) { + unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2], s3 = scanline[i + 3]; + unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2], r3 = recon[j + 3]; + unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2], p3 = precon[i + 3]; + recon[i + 0] = s0 + ((r0 + p0) >> 1u); + recon[i + 1] = s1 + ((r1 + p1) >> 1u); + recon[i + 2] = s2 + ((r2 + p2) >> 1u); + recon[i + 3] = s3 + ((r3 + p3) >> 1u); + } + } + else if(bytewidth >= 3) { + for(; i + 2 < length; i += 3, j += 3) { + unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1], s2 = scanline[i + 2]; + unsigned char r0 = recon[j + 0], r1 = recon[j + 1], r2 = recon[j + 2]; + unsigned char p0 = precon[i + 0], p1 = precon[i + 1], p2 = precon[i + 2]; + recon[i + 0] = s0 + ((r0 + p0) >> 1u); + recon[i + 1] = s1 + ((r1 + p1) >> 1u); + recon[i + 2] = s2 + ((r2 + p2) >> 1u); + } + } + else if(bytewidth >= 2) { + for(; i + 1 < length; i += 2, j += 2) { + unsigned char s0 = scanline[i + 0], s1 = scanline[i + 1]; + unsigned char r0 = recon[j + 0], r1 = recon[j + 1]; + unsigned char p0 = precon[i + 0], p1 = precon[i + 1]; + recon[i + 0] = s0 + ((r0 + p0) >> 1u); + recon[i + 1] = s1 + ((r1 + p1) >> 1u); + } + } + for(; i != length; ++i, ++j) recon[i] = scanline[i] + ((recon[j] + precon[i]) >> 1u); + } + else { + size_t j = 0; + for(i = 0; i != bytewidth; ++i) recon[i] = scanline[i]; + for(i = bytewidth; i != length; ++i, ++j) recon[i] = scanline[i] + (recon[j] >> 1u); + } + break; + case 4: + if(precon) { + /* Unroll independent paths of this predictor. Whether this speeds up + anything depends on compiler and settings. */ + if(bytewidth == 8) { + unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0; + unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0; + unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0; + unsigned char a6, b6 = 0, c6, d6 = 0, a7, b7 = 0, c7, d7 = 0; + for(i = 0; i + 7 < length; i += 8) { + c0 = b0; + c1 = b1; + c2 = b2; + c3 = b3; + c4 = b4; + c5 = b5; + c6 = b6; + c7 = b7; + b0 = precon[i + 0]; + b1 = precon[i + 1]; + b2 = precon[i + 2]; + b3 = precon[i + 3]; + b4 = precon[i + 4]; + b5 = precon[i + 5]; + b6 = precon[i + 6]; + b7 = precon[i + 7]; + a0 = d0; + a1 = d1; + a2 = d2; + a3 = d3; + a4 = d4; + a5 = d5; + a6 = d6; + a7 = d7; + d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); + d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); + d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); + d3 = scanline[i + 3] + paethPredictor(a3, b3, c3); + d4 = scanline[i + 4] + paethPredictor(a4, b4, c4); + d5 = scanline[i + 5] + paethPredictor(a5, b5, c5); + d6 = scanline[i + 6] + paethPredictor(a6, b6, c6); + d7 = scanline[i + 7] + paethPredictor(a7, b7, c7); + recon[i + 0] = d0; + recon[i + 1] = d1; + recon[i + 2] = d2; + recon[i + 3] = d3; + recon[i + 4] = d4; + recon[i + 5] = d5; + recon[i + 6] = d6; + recon[i + 7] = d7; + } + } + else if(bytewidth == 6) { + unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0; + unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0; + unsigned char a4, b4 = 0, c4, d4 = 0, a5, b5 = 0, c5, d5 = 0; + for(i = 0; i + 5 < length; i += 6) { + c0 = b0; + c1 = b1; + c2 = b2; + c3 = b3; + c4 = b4; + c5 = b5; + b0 = precon[i + 0]; + b1 = precon[i + 1]; + b2 = precon[i + 2]; + b3 = precon[i + 3]; + b4 = precon[i + 4]; + b5 = precon[i + 5]; + a0 = d0; + a1 = d1; + a2 = d2; + a3 = d3; + a4 = d4; + a5 = d5; + d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); + d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); + d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); + d3 = scanline[i + 3] + paethPredictor(a3, b3, c3); + d4 = scanline[i + 4] + paethPredictor(a4, b4, c4); + d5 = scanline[i + 5] + paethPredictor(a5, b5, c5); + recon[i + 0] = d0; + recon[i + 1] = d1; + recon[i + 2] = d2; + recon[i + 3] = d3; + recon[i + 4] = d4; + recon[i + 5] = d5; + } + } + else if(bytewidth == 4) { + unsigned char a0, b0 = 0, c0, d0 = 0, a1, b1 = 0, c1, d1 = 0; + unsigned char a2, b2 = 0, c2, d2 = 0, a3, b3 = 0, c3, d3 = 0; + for(i = 0; i + 3 < length; i += 4) { + c0 = b0; + c1 = b1; + c2 = b2; + c3 = b3; + b0 = precon[i + 0]; + b1 = precon[i + 1]; + b2 = precon[i + 2]; + b3 = precon[i + 3]; + a0 = d0; + a1 = d1; + a2 = d2; + a3 = d3; + d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); + d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); + d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); + d3 = scanline[i + 3] + paethPredictor(a3, b3, c3); + recon[i + 0] = d0; + recon[i + 1] = d1; + recon[i + 2] = d2; + recon[i + 3] = d3; + } + } + else if(bytewidth == 3) { + unsigned char a0, b0 = 0, c0, d0 = 0; + unsigned char a1, b1 = 0, c1, d1 = 0; + unsigned char a2, b2 = 0, c2, d2 = 0; + for(i = 0; i + 2 < length; i += 3) { + c0 = b0; + c1 = b1; + c2 = b2; + b0 = precon[i + 0]; + b1 = precon[i + 1]; + b2 = precon[i + 2]; + a0 = d0; + a1 = d1; + a2 = d2; + d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); + d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); + d2 = scanline[i + 2] + paethPredictor(a2, b2, c2); + recon[i + 0] = d0; + recon[i + 1] = d1; + recon[i + 2] = d2; + } + } + else if(bytewidth == 2) { + unsigned char a0, b0 = 0, c0, d0 = 0; + unsigned char a1, b1 = 0, c1, d1 = 0; + for(i = 0; i + 1 < length; i += 2) { + c0 = b0; + c1 = b1; + b0 = precon[i + 0]; + b1 = precon[i + 1]; + a0 = d0; + a1 = d1; + d0 = scanline[i + 0] + paethPredictor(a0, b0, c0); + d1 = scanline[i + 1] + paethPredictor(a1, b1, c1); + recon[i + 0] = d0; + recon[i + 1] = d1; + } + } + else if(bytewidth == 1) { + unsigned char a, b = 0, c, d = 0; + for(i = 0; i != length; ++i) { + c = b; + b = precon[i]; + a = d; + d = scanline[i] + paethPredictor(a, b, c); + recon[i] = d; + } + } + else { + /* Normally not a possible case, but this would handle it correctly */ + for(i = 0; i != bytewidth; ++i) { + recon[i] = (scanline[i] + precon[i]); /*paethPredictor(0, precon[i], 0) is always precon[i]*/ + } + } + /* finish any remaining bytes */ + for(; i != length; ++i) { + recon[i] = (scanline[i] + paethPredictor(recon[i - bytewidth], precon[i], precon[i - bytewidth])); + } + } + else { + size_t j = 0; + for(i = 0; i != bytewidth; ++i) { + recon[i] = scanline[i]; + } + for(i = bytewidth; i != length; ++i, ++j) { + /*paethPredictor(recon[i - bytewidth], 0, 0) is always recon[i - bytewidth]*/ + recon[i] = (scanline[i] + recon[j]); + } + } + break; + default: + return 36; /*error: invalid filter type given*/ + } + return 0; +} + +static unsigned unfilter(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, unsigned bpp) +{ + /* + For PNG filter method 0 + this function unfilters a single image (e.g. without interlacing this is called once, with Adam7 seven times) + out must have enough bytes allocated already, in must have the scanlines + 1 filtertype byte per scanline + w and h are image dimensions or dimensions of reduced image, bpp is bits per pixel + in and out are allowed to be the same memory address (but aren't the same size since in has the extra filter bytes) + */ + + unsigned y; + unsigned char * prevline = 0; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7u) / 8u; + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; + + for(y = 0; y < h; ++y) { + size_t outindex = linebytes * y; + size_t inindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + unsigned char filterType = in[inindex]; + + CERROR_TRY_RETURN(unfilterScanline(&out[outindex], &in[inindex + 1], prevline, bytewidth, filterType, linebytes)); + + prevline = &out[outindex]; + } + + return 0; +} + +/* +in: Adam7 interlaced image, with no padding bits between scanlines, but between + reduced images so that each reduced image starts at a byte. +out: the same pixels, but re-ordered so that they're now a non-interlaced image with size w*h +bpp: bits per pixel +out has the following size in bits: w * h * bpp. +in is possibly bigger due to padding bits between reduced images. +out must be big enough AND must be 0 everywhere if bpp < 8 in the current implementation +(because that's likely a little bit faster) +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_deinterlace(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) { + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + size_t bytewidth = bpp / 8u; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + size_t pixelinstart = passstart[i] + (y * passw[i] + x) * bytewidth; + size_t pixeloutstart = ((ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * (size_t)w + + ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bytewidth; + for(b = 0; b < bytewidth; ++b) { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else { /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + ibp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + obp = (ADAM7_IY[i] + (size_t)y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + (size_t)x * ADAM7_DX[i]) * bpp; + for(b = 0; b < bpp; ++b) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +static void removePaddingBits(unsigned char * out, const unsigned char * in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /* + After filtering there are still padding bits if scanlines have non multiple of 8 bit amounts. They need + to be removed (except at last scanline of (Adam7-reduced) image) before working with pure image buffers + for the Adam7 code, the color convert code and the output to the user. + in and out are allowed to be the same buffer, in may also be higher but still overlapping; in must + have >= ilinebits*h bits, out must have >= olinebits*h bits, olinebits must be <= ilinebits + also used to move bits after earlier such operations happened, e.g. in a sequence of reduced images from Adam7 + only useful if (ilinebits - olinebits) is a value in the range 1..7 + */ + unsigned y; + size_t diff = ilinebits - olinebits; + size_t ibp = 0, obp = 0; /*input and output bit pointers*/ + for(y = 0; y < h; ++y) { + size_t x; + for(x = 0; x < olinebits; ++x) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + ibp += diff; + } +} + +/*out must be buffer big enough to contain full image, and in must contain the full decompressed data from +the IDAT chunks (with filter index bytes and possible padding bits) +return value is error*/ +static unsigned postProcessScanlines(unsigned char * out, unsigned char * in, + unsigned w, unsigned h, const LodePNGInfo * info_png) +{ + /* + This function converts the filtered-padded-interlaced data into pure 2D image buffer with the PNG's colortype. + Steps: + *) if no Adam7: 1) unfilter 2) remove padding bits (= possible extra bits per scanline if bpp < 8) + *) if adam7: 1) 7x unfilter 2) 7x remove padding bits 3) Adam7_deinterlace + NOTE: the in buffer will be overwritten with intermediate data! + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + if(bpp == 0) return 31; /*error: invalid colortype*/ + + if(info_png->interlace_method == 0) { + if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { + CERROR_TRY_RETURN(unfilter(in, in, w, h, bpp)); + removePaddingBits(out, in, w * bpp, ((w * bpp + 7u) / 8u) * 8u, h); + } + /*we can immediately filter into the out buffer, no other steps needed*/ + else CERROR_TRY_RETURN(unfilter(out, in, w, h, bpp)); + } + else { /*interlace_method is 1 (Adam7)*/ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + for(i = 0; i != 7; ++i) { + CERROR_TRY_RETURN(unfilter(&in[padded_passstart[i]], &in[filter_passstart[i]], passw[i], passh[i], bpp)); + /*TODO: possible efficiency improvement: if in this reduced image the bits fit nicely in 1 scanline, + move bytes instead of bits or move not at all*/ + if(bpp < 8) { + /*remove padding bits in scanlines; after this there still may be padding + bits between the different reduced images: each reduced image still starts nicely at a byte*/ + removePaddingBits(&in[passstart[i]], &in[padded_passstart[i]], passw[i] * bpp, + ((passw[i] * bpp + 7u) / 8u) * 8u, passh[i]); + } + } + + Adam7_deinterlace(out, in, w, h, bpp); + } + + return 0; +} + +static unsigned readChunk_PLTE(LodePNGColorMode * color, const unsigned char * data, size_t chunkLength) +{ + unsigned pos = 0, i; + color->palettesize = chunkLength / 3u; + if(color->palettesize == 0 || color->palettesize > 256) return 38; /*error: palette too small or big*/ + lodepng_color_mode_alloc_palette(color); + if(!color->palette && color->palettesize) { + color->palettesize = 0; + return 83; /*alloc fail*/ + } + + for(i = 0; i != color->palettesize; ++i) { + color->palette[4 * i + 0] = data[pos++]; /*R*/ + color->palette[4 * i + 1] = data[pos++]; /*G*/ + color->palette[4 * i + 2] = data[pos++]; /*B*/ + color->palette[4 * i + 3] = 255; /*alpha*/ + } + + return 0; /* OK */ +} + +static unsigned readChunk_tRNS(LodePNGColorMode * color, const unsigned char * data, size_t chunkLength) +{ + unsigned i; + if(color->colortype == LCT_PALETTE) { + /*error: more alpha values given than there are palette entries*/ + if(chunkLength > color->palettesize) return 39; + + for(i = 0; i != chunkLength; ++i) color->palette[4 * i + 3] = data[i]; + } + else if(color->colortype == LCT_GREY) { + /*error: this chunk must be 2 bytes for grayscale image*/ + if(chunkLength != 2) return 30; + + color->key_defined = 1; + color->key_r = color->key_g = color->key_b = 256u * data[0] + data[1]; + } + else if(color->colortype == LCT_RGB) { + /*error: this chunk must be 6 bytes for RGB image*/ + if(chunkLength != 6) return 41; + + color->key_defined = 1; + color->key_r = 256u * data[0] + data[1]; + color->key_g = 256u * data[2] + data[3]; + color->key_b = 256u * data[4] + data[5]; + } + else return 42; /*error: tRNS chunk not allowed for other color models*/ + + return 0; /* OK */ +} + + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*background color chunk (bKGD)*/ +static unsigned readChunk_bKGD(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(info->color.colortype == LCT_PALETTE) { + /*error: this chunk must be 1 byte for indexed color image*/ + if(chunkLength != 1) return 43; + + /*error: invalid palette index, or maybe this chunk appeared before PLTE*/ + if(data[0] >= info->color.palettesize) return 103; + + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = data[0]; + } + else if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { + /*error: this chunk must be 2 bytes for grayscale image*/ + if(chunkLength != 2) return 44; + + /*the values are truncated to bitdepth in the PNG file*/ + info->background_defined = 1; + info->background_r = info->background_g = info->background_b = 256u * data[0] + data[1]; + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { + /*error: this chunk must be 6 bytes for grayscale image*/ + if(chunkLength != 6) return 45; + + /*the values are truncated to bitdepth in the PNG file*/ + info->background_defined = 1; + info->background_r = 256u * data[0] + data[1]; + info->background_g = 256u * data[2] + data[3]; + info->background_b = 256u * data[4] + data[5]; + } + + return 0; /* OK */ +} + +/*text chunk (tEXt)*/ +static unsigned readChunk_tEXt(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + unsigned error = 0; + char * key = 0, * str = 0; + + while(!error) { /*not really a while loop, only used to break on error*/ + unsigned length, string2_begin; + + length = 0; + while(length < chunkLength && data[length] != 0) ++length; + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char *)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(key, data, length); + key[length] = 0; + + string2_begin = length + 1; /*skip keyword null terminator*/ + + length = (unsigned)(chunkLength < string2_begin ? 0 : chunkLength - string2_begin); + str = (char *)lodepng_malloc(length + 1); + if(!str) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(str, data + string2_begin, length); + str[length] = 0; + + error = lodepng_add_text(info, key, str); + + break; + } + + lodepng_free(key); + lodepng_free(str); + + return error; +} + +/*compressed text chunk (zTXt)*/ +static unsigned readChunk_zTXt(LodePNGInfo * info, const LodePNGDecoderSettings * decoder, + const unsigned char * data, size_t chunkLength) +{ + unsigned error = 0; + + /*copy the object to change parameters in it*/ + LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; + + unsigned length, string2_begin; + char * key = 0; + unsigned char * str = 0; + size_t size = 0; + + while(!error) { /*not really a while loop, only used to break on error*/ + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 2 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char *)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(key, data, length); + key[length] = 0; + + if(data[length + 1] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) CERROR_BREAK(error, 75); /*no null termination, corrupt?*/ + + length = (unsigned)chunkLength - string2_begin; + zlibsettings.max_output_size = decoder->max_text_size; + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&str, &size, 0, &data[string2_begin], + length, &zlibsettings); + /*error: compressed text larger than decoder->max_text_size*/ + if(error && size > zlibsettings.max_output_size) error = 112; + if(error) break; + error = lodepng_add_text_sized(info, key, (char *)str, size); + break; + } + + lodepng_free(key); + lodepng_free(str); + + return error; +} + +/*international text chunk (iTXt)*/ +static unsigned readChunk_iTXt(LodePNGInfo * info, const LodePNGDecoderSettings * decoder, + const unsigned char * data, size_t chunkLength) +{ + unsigned error = 0; + unsigned i; + + /*copy the object to change parameters in it*/ + LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; + + unsigned length, begin, compressed; + char * key = 0, * langtag = 0, * transkey = 0; + + while(!error) { /*not really a while loop, only used to break on error*/ + /*Quick check if the chunk length isn't too small. Even without check + it'd still fail with other error checks below if it's too short. This just gives a different error code.*/ + if(chunkLength < 5) CERROR_BREAK(error, 30); /*iTXt chunk too short*/ + + /*read the key*/ + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 3 >= chunkLength) CERROR_BREAK(error, 75); /*no null termination char, corrupt?*/ + if(length < 1 || length > 79) CERROR_BREAK(error, 89); /*keyword too short or long*/ + + key = (char *)lodepng_malloc(length + 1); + if(!key) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(key, data, length); + key[length] = 0; + + /*read the compression method*/ + compressed = data[length + 1]; + if(data[length + 2] != 0) CERROR_BREAK(error, 72); /*the 0 byte indicating compression must be 0*/ + + /*even though it's not allowed by the standard, no error is thrown if + there's no null termination char, if the text is empty for the next 3 texts*/ + + /*read the langtag*/ + begin = length + 3; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + langtag = (char *)lodepng_malloc(length + 1); + if(!langtag) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(langtag, data + begin, length); + langtag[length] = 0; + + /*read the transkey*/ + begin += length + 1; + length = 0; + for(i = begin; i < chunkLength && data[i] != 0; ++i) ++length; + + transkey = (char *)lodepng_malloc(length + 1); + if(!transkey) CERROR_BREAK(error, 83); /*alloc fail*/ + + lodepng_memcpy(transkey, data + begin, length); + transkey[length] = 0; + + /*read the actual text*/ + begin += length + 1; + + length = (unsigned)chunkLength < begin ? 0 : (unsigned)chunkLength - begin; + + if(compressed) { + unsigned char * str = 0; + size_t size = 0; + zlibsettings.max_output_size = decoder->max_text_size; + /*will fail if zlib error, e.g. if length is too small*/ + error = zlib_decompress(&str, &size, 0, &data[begin], + length, &zlibsettings); + /*error: compressed text larger than decoder->max_text_size*/ + if(error && size > zlibsettings.max_output_size) error = 112; + if(!error) error = lodepng_add_itext_sized(info, key, langtag, transkey, (char *)str, size); + lodepng_free(str); + } + else { + error = lodepng_add_itext_sized(info, key, langtag, transkey, (char *)(data + begin), length); + } + + break; + } + + lodepng_free(key); + lodepng_free(langtag); + lodepng_free(transkey); + + return error; +} + +static unsigned readChunk_tIME(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 7) return 73; /*invalid tIME chunk size*/ + + info->time_defined = 1; + info->time.year = 256u * data[0] + data[1]; + info->time.month = data[2]; + info->time.day = data[3]; + info->time.hour = data[4]; + info->time.minute = data[5]; + info->time.second = data[6]; + + return 0; /* OK */ +} + +static unsigned readChunk_pHYs(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 9) return 74; /*invalid pHYs chunk size*/ + + info->phys_defined = 1; + info->phys_x = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; + info->phys_y = 16777216u * data[4] + 65536u * data[5] + 256u * data[6] + data[7]; + info->phys_unit = data[8]; + + return 0; /* OK */ +} + +static unsigned readChunk_gAMA(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 4) return 96; /*invalid gAMA chunk size*/ + + info->gama_defined = 1; + info->gama_gamma = 16777216u * data[0] + 65536u * data[1] + 256u * data[2] + data[3]; + + return 0; /* OK */ +} + +static unsigned readChunk_cHRM(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 32) return 97; /*invalid cHRM chunk size*/ + + info->chrm_defined = 1; + info->chrm_white_x = 16777216u * data[ 0] + 65536u * data[ 1] + 256u * data[ 2] + data[ 3]; + info->chrm_white_y = 16777216u * data[ 4] + 65536u * data[ 5] + 256u * data[ 6] + data[ 7]; + info->chrm_red_x = 16777216u * data[ 8] + 65536u * data[ 9] + 256u * data[10] + data[11]; + info->chrm_red_y = 16777216u * data[12] + 65536u * data[13] + 256u * data[14] + data[15]; + info->chrm_green_x = 16777216u * data[16] + 65536u * data[17] + 256u * data[18] + data[19]; + info->chrm_green_y = 16777216u * data[20] + 65536u * data[21] + 256u * data[22] + data[23]; + info->chrm_blue_x = 16777216u * data[24] + 65536u * data[25] + 256u * data[26] + data[27]; + info->chrm_blue_y = 16777216u * data[28] + 65536u * data[29] + 256u * data[30] + data[31]; + + return 0; /* OK */ +} + +static unsigned readChunk_sRGB(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + if(chunkLength != 1) return 98; /*invalid sRGB chunk size (this one is never ignored)*/ + + info->srgb_defined = 1; + info->srgb_intent = data[0]; + + return 0; /* OK */ +} + +static unsigned readChunk_iCCP(LodePNGInfo * info, const LodePNGDecoderSettings * decoder, + const unsigned char * data, size_t chunkLength) +{ + unsigned error = 0; + unsigned i; + size_t size = 0; + /*copy the object to change parameters in it*/ + LodePNGDecompressSettings zlibsettings = decoder->zlibsettings; + + unsigned length, string2_begin; + + info->iccp_defined = 1; + if(info->iccp_name) lodepng_clear_icc(info); + + for(length = 0; length < chunkLength && data[length] != 0; ++length) ; + if(length + 2 >= chunkLength) return 75; /*no null termination, corrupt?*/ + if(length < 1 || length > 79) return 89; /*keyword too short or long*/ + + info->iccp_name = (char *)lodepng_malloc(length + 1); + if(!info->iccp_name) return 83; /*alloc fail*/ + + info->iccp_name[length] = 0; + for(i = 0; i != length; ++i) info->iccp_name[i] = (char)data[i]; + + if(data[length + 1] != 0) return 72; /*the 0 byte indicating compression must be 0*/ + + string2_begin = length + 2; + if(string2_begin > chunkLength) return 75; /*no null termination, corrupt?*/ + + length = (unsigned)chunkLength - string2_begin; + zlibsettings.max_output_size = decoder->max_icc_size; + error = zlib_decompress(&info->iccp_profile, &size, 0, + &data[string2_begin], + length, &zlibsettings); + /*error: ICC profile larger than decoder->max_icc_size*/ + if(error && size > zlibsettings.max_output_size) error = 113; + info->iccp_profile_size = (unsigned)size; + if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/ + return error; +} + +/*significant bits chunk (sBIT)*/ +static unsigned readChunk_sBIT(LodePNGInfo * info, const unsigned char * data, size_t chunkLength) +{ + unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth; + if(info->color.colortype == LCT_GREY) { + /*error: this chunk must be 1 bytes for grayscale image*/ + if(chunkLength != 1) return 114; + if(data[0] == 0 || data[0] > bitdepth) return 115; + info->sbit_defined = 1; + info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/ + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) { + /*error: this chunk must be 3 bytes for RGB and palette image*/ + if(chunkLength != 3) return 114; + if(data[0] == 0 || data[1] == 0 || data[2] == 0) return 115; + if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth) return 115; + info->sbit_defined = 1; + info->sbit_r = data[0]; + info->sbit_g = data[1]; + info->sbit_b = data[2]; + } + else if(info->color.colortype == LCT_GREY_ALPHA) { + /*error: this chunk must be 2 byte for grayscale with alpha image*/ + if(chunkLength != 2) return 114; + if(data[0] == 0 || data[1] == 0) return 115; + if(data[0] > bitdepth || data[1] > bitdepth) return 115; + info->sbit_defined = 1; + info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/ + info->sbit_a = data[1]; + } + else if(info->color.colortype == LCT_RGBA) { + /*error: this chunk must be 4 bytes for grayscale image*/ + if(chunkLength != 4) return 114; + if(data[0] == 0 || data[1] == 0 || data[2] == 0 || data[3] == 0) return 115; + if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth || data[3] > bitdepth) return 115; + info->sbit_defined = 1; + info->sbit_r = data[0]; + info->sbit_g = data[1]; + info->sbit_b = data[2]; + info->sbit_a = data[3]; + } + + return 0; /* OK */ +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_inspect_chunk(LodePNGState * state, size_t pos, + const unsigned char * in, size_t insize) +{ + const unsigned char * chunk = in + pos; + unsigned chunkLength; + const unsigned char * data; + unsigned unhandled = 0; + unsigned error = 0; + + if(pos + 4 > insize) return 30; + chunkLength = lodepng_chunk_length(chunk); + if(chunkLength > 2147483647) return 63; + data = lodepng_chunk_data_const(chunk); + if(chunkLength + 12 > insize - pos) return 30; + + if(lodepng_chunk_type_equals(chunk, "PLTE")) { + error = readChunk_PLTE(&state->info_png.color, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "tRNS")) { + error = readChunk_tRNS(&state->info_png.color, data, chunkLength); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + } + else if(lodepng_chunk_type_equals(chunk, "bKGD")) { + error = readChunk_bKGD(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "tEXt")) { + error = readChunk_tEXt(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "zTXt")) { + error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "iTXt")) { + error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "tIME")) { + error = readChunk_tIME(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "pHYs")) { + error = readChunk_pHYs(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "gAMA")) { + error = readChunk_gAMA(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "cHRM")) { + error = readChunk_cHRM(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "sRGB")) { + error = readChunk_sRGB(&state->info_png, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "iCCP")) { + error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); + } + else if(lodepng_chunk_type_equals(chunk, "sBIT")) { + error = readChunk_sBIT(&state->info_png, data, chunkLength); +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + else { + /* unhandled chunk is ok (is not an error) */ + unhandled = 1; + } + + if(!error && !unhandled && !state->decoder.ignore_crc) { + if(lodepng_chunk_check_crc(chunk)) return 57; /*invalid CRC*/ + } + + return error; +} + +/*read a PNG, the result will be in the same color type as the PNG (hence "generic")*/ +static void decodeGeneric(unsigned char ** out, unsigned * w, unsigned * h, + LodePNGState * state, + const unsigned char * in, size_t insize) +{ + unsigned char IEND = 0; + const unsigned char * chunk; /*points to beginning of next chunk*/ + unsigned char * idat; /*the data from idat chunks, zlib compressed*/ + size_t idatsize = 0; + unsigned char * scanlines = 0; + size_t scanlines_size = 0, expected_size = 0; + size_t outsize = 0; + + /*for unknown chunk order*/ + unsigned unknown = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned critical_pos = 1; /*1 = after IHDR, 2 = after PLTE, 3 = after IDAT*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + + + /* safe output values in case error happens */ + *out = 0; + *w = *h = 0; + + state->error = lodepng_inspect(w, h, state, in, insize); /*reads header and resets other parameters in state->info_png*/ + if(state->error) return; + + if(lodepng_pixel_overflow(*w, *h, &state->info_png.color, &state->info_raw)) { + CERROR_RETURN(state->error, 92); /*overflow possible due to amount of pixels*/ + } + + /*the input filesize is a safe upper bound for the sum of idat chunks size*/ + idat = (unsigned char *)lodepng_malloc(insize); + if(!idat) CERROR_RETURN(state->error, 83); /*alloc fail*/ + + chunk = &in[33]; /*first byte of the first chunk after the header*/ + + /*loop through the chunks, ignoring unknown chunks and stopping at IEND chunk. + IDAT data is put at the start of the in buffer*/ + while(!IEND && !state->error) { + unsigned chunkLength; + const unsigned char * data; /*the data in the chunk*/ + size_t pos = (size_t)(chunk - in); + + /*error: next chunk out of bounds of the in buffer*/ + if(chunk < in || pos + 12 > insize) { + if(state->decoder.ignore_end) break; /*other errors may still happen though*/ + CERROR_BREAK(state->error, 30); + } + + /*length of the data of the chunk, excluding the 12 bytes for length, chunk type and CRC*/ + chunkLength = lodepng_chunk_length(chunk); + /*error: chunk length larger than the max PNG chunk size*/ + if(chunkLength > 2147483647) { + if(state->decoder.ignore_end) break; /*other errors may still happen though*/ + CERROR_BREAK(state->error, 63); + } + + if(pos + (size_t)chunkLength + 12 > insize || pos + (size_t)chunkLength + 12 < pos) { + CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk (or int overflow)*/ + } + + data = lodepng_chunk_data_const(chunk); + + unknown = 0; + + /*IDAT chunk, containing compressed image data*/ + if(lodepng_chunk_type_equals(chunk, "IDAT")) { + size_t newsize; + if(lodepng_addofl(idatsize, chunkLength, &newsize)) CERROR_BREAK(state->error, 95); + if(newsize > insize) CERROR_BREAK(state->error, 95); + lodepng_memcpy(idat + idatsize, data, chunkLength); + idatsize += chunkLength; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 3; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + else if(lodepng_chunk_type_equals(chunk, "IEND")) { + /*IEND chunk*/ + IEND = 1; + } + else if(lodepng_chunk_type_equals(chunk, "PLTE")) { + /*palette chunk (PLTE)*/ + state->error = readChunk_PLTE(&state->info_png.color, data, chunkLength); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + critical_pos = 2; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + else if(lodepng_chunk_type_equals(chunk, "tRNS")) { + /*palette transparency chunk (tRNS). Even though this one is an ancillary chunk , it is still compiled + in without 'LODEPNG_COMPILE_ANCILLARY_CHUNKS' because it contains essential color information that + affects the alpha channel of pixels. */ + state->error = readChunk_tRNS(&state->info_png.color, data, chunkLength); + if(state->error) break; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*background color chunk (bKGD)*/ + } + else if(lodepng_chunk_type_equals(chunk, "bKGD")) { + state->error = readChunk_bKGD(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "tEXt")) { + /*text chunk (tEXt)*/ + if(state->decoder.read_text_chunks) { + state->error = readChunk_tEXt(&state->info_png, data, chunkLength); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "zTXt")) { + /*compressed text chunk (zTXt)*/ + if(state->decoder.read_text_chunks) { + state->error = readChunk_zTXt(&state->info_png, &state->decoder, data, chunkLength); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "iTXt")) { + /*international text chunk (iTXt)*/ + if(state->decoder.read_text_chunks) { + state->error = readChunk_iTXt(&state->info_png, &state->decoder, data, chunkLength); + if(state->error) break; + } + } + else if(lodepng_chunk_type_equals(chunk, "tIME")) { + state->error = readChunk_tIME(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "pHYs")) { + state->error = readChunk_pHYs(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "gAMA")) { + state->error = readChunk_gAMA(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "cHRM")) { + state->error = readChunk_cHRM(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "sRGB")) { + state->error = readChunk_sRGB(&state->info_png, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "iCCP")) { + state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); + if(state->error) break; + } + else if(lodepng_chunk_type_equals(chunk, "sBIT")) { + state->error = readChunk_sBIT(&state->info_png, data, chunkLength); + if(state->error) break; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + else /*it's not an implemented chunk type, so ignore it: skip over the data*/ { + /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ + if(!state->decoder.ignore_critical && !lodepng_chunk_ancillary(chunk)) { + CERROR_BREAK(state->error, 69); + } + + unknown = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(state->decoder.remember_unknown_chunks) { + state->error = lodepng_chunk_append(&state->info_png.unknown_chunks_data[critical_pos - 1], + &state->info_png.unknown_chunks_size[critical_pos - 1], chunk); + if(state->error) break; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + } + + if(!state->decoder.ignore_crc && !unknown) { /*check CRC if wanted, only on known chunk types*/ + if(lodepng_chunk_check_crc(chunk)) CERROR_BREAK(state->error, 57); /*invalid CRC*/ + } + + if(!IEND) chunk = lodepng_chunk_next_const(chunk, in + insize); + } + + if(!state->error && state->info_png.color.colortype == LCT_PALETTE && !state->info_png.color.palette) { + state->error = 106; /* error: PNG file must have PLTE chunk if color type is palette */ + } + + if(!state->error) { + /*predict output size, to allocate exact size for output buffer to avoid more dynamic allocation. + If the decompressed size does not match the prediction, the image must be corrupt.*/ + if(state->info_png.interlace_method == 0) { + unsigned bpp = lodepng_get_bpp(&state->info_png.color); + expected_size = lodepng_get_raw_size_idat(*w, *h, bpp); + } + else { + unsigned bpp = lodepng_get_bpp(&state->info_png.color); + /*Adam-7 interlaced: expected size is the sum of the 7 sub-images sizes*/ + expected_size = 0; + expected_size += lodepng_get_raw_size_idat((*w + 7) >> 3, (*h + 7) >> 3, bpp); + if(*w > 4) expected_size += lodepng_get_raw_size_idat((*w + 3) >> 3, (*h + 7) >> 3, bpp); + expected_size += lodepng_get_raw_size_idat((*w + 3) >> 2, (*h + 3) >> 3, bpp); + if(*w > 2) expected_size += lodepng_get_raw_size_idat((*w + 1) >> 2, (*h + 3) >> 2, bpp); + expected_size += lodepng_get_raw_size_idat((*w + 1) >> 1, (*h + 1) >> 2, bpp); + if(*w > 1) expected_size += lodepng_get_raw_size_idat((*w + 0) >> 1, (*h + 1) >> 1, bpp); + expected_size += lodepng_get_raw_size_idat((*w + 0), (*h + 0) >> 1, bpp); + } + + state->error = zlib_decompress(&scanlines, &scanlines_size, expected_size, idat, idatsize, + &state->decoder.zlibsettings); + } + if(!state->error && scanlines_size != expected_size) state->error = 91; /*decompressed size doesn't match prediction*/ + lodepng_free(idat); + + if(!state->error) { + lv_draw_buf_t * decoded = lv_draw_buf_create_ex(image_cache_draw_buf_handlers, *w, *h, LV_COLOR_FORMAT_ARGB8888, 4 * *w); + if(decoded) { + *out = (unsigned char*)decoded; + outsize = decoded->data_size; + } + else state->error = 83; /*alloc fail*/ + } + if(!state->error) { + lv_draw_buf_t * decoded = (lv_draw_buf_t *)*out; + lodepng_memset(decoded->data, 0, outsize); + state->error = postProcessScanlines(decoded->data, scanlines, *w, *h, &state->info_png); + } + lodepng_free(scanlines); +} + +unsigned lodepng_decode(unsigned char ** out, unsigned * w, unsigned * h, + LodePNGState * state, + const unsigned char * in, size_t insize) +{ + *out = NULL; + decodeGeneric(out, w, h, state, in, insize); + if(state->error) return state->error; + if(!state->decoder.color_convert || lodepng_color_mode_equal(&state->info_raw, &state->info_png.color)) { + /*same color type, no copying or converting of data needed*/ + /*store the info_png color settings on the info_raw so that the info_raw still reflects what colortype + the raw image has to the end user*/ + if(!state->decoder.color_convert) { + state->error = lodepng_color_mode_copy(&state->info_raw, &state->info_png.color); + if(state->error) return state->error; + } + } + else { /*color conversion needed*/ + lv_draw_buf_t * old_buf = (lv_draw_buf_t *)*out; + + /*TODO: check if this works according to the statement in the documentation: "The converter can convert + from grayscale input color type, to 8-bit grayscale or grayscale with alpha"*/ + if(!(state->info_raw.colortype == LCT_RGB || state->info_raw.colortype == LCT_RGBA) + && !(state->info_raw.bitdepth == 8)) { + return 56; /*unsupported color mode conversion*/ + } + + lv_draw_buf_t * new_buf = lv_draw_buf_create_ex(image_cache_draw_buf_handlers,*w, *h, LV_COLOR_FORMAT_ARGB8888, 4 * *w); + if(new_buf == NULL) { + state->error = 83; /*alloc fail*/ + } + else { + state->error = lodepng_convert(new_buf->data, old_buf->data, + &state->info_raw, &state->info_png.color, *w, *h); + + if (state->error) { + lv_draw_buf_destroy(new_buf); + new_buf = NULL; + } + } + + *out = (unsigned char*)new_buf; + lv_draw_buf_destroy(old_buf); + } + return state->error; +} + +unsigned lodepng_decode_memory(unsigned char ** out, unsigned * w, unsigned * h, const unsigned char * in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*disable reading things that this function doesn't output*/ + state.decoder.read_text_chunks = 0; + state.decoder.remember_unknown_chunks = 0; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + error = lodepng_decode(out, w, h, &state, in, insize); + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_decode32(unsigned char ** out, unsigned * w, unsigned * h, const unsigned char * in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGBA, 8); +} + +unsigned lodepng_decode24(unsigned char ** out, unsigned * w, unsigned * h, const unsigned char * in, size_t insize) +{ + return lodepng_decode_memory(out, w, h, in, insize, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_decode_file(unsigned char ** out, unsigned * w, unsigned * h, const char * filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char * buffer = 0; + size_t buffersize; + unsigned error; + /* safe output values in case error happens */ + *out = 0; + *w = *h = 0; + error = lodepng_load_file(&buffer, &buffersize, filename); + if(!error) error = lodepng_decode_memory(out, w, h, buffer, buffersize, colortype, bitdepth); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_decode32_file(unsigned char ** out, unsigned * w, unsigned * h, const char * filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGBA, 8); +} + +unsigned lodepng_decode24_file(unsigned char ** out, unsigned * w, unsigned * h, const char * filename) +{ + return lodepng_decode_file(out, w, h, filename, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_decoder_settings_init(LodePNGDecoderSettings * settings) +{ + settings->color_convert = 1; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->read_text_chunks = 1; + settings->remember_unknown_chunks = 0; + settings->max_text_size = 16777216; + settings->max_icc_size = 16777216; /* 16MB is much more than enough for any reasonable ICC profile */ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + settings->ignore_crc = 0; + settings->ignore_critical = 0; + settings->ignore_end = 0; + lodepng_decompress_settings_init(&settings->zlibsettings); +} + +#endif /*LODEPNG_COMPILE_DECODER*/ + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) + +void lodepng_state_init(LodePNGState * state) +{ +#ifdef LODEPNG_COMPILE_DECODER + lodepng_decoder_settings_init(&state->decoder); +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + lodepng_encoder_settings_init(&state->encoder); +#endif /*LODEPNG_COMPILE_ENCODER*/ + lodepng_color_mode_init(&state->info_raw); + lodepng_info_init(&state->info_png); + state->error = 1; +} + +void lodepng_state_cleanup(LodePNGState * state) +{ + lodepng_color_mode_cleanup(&state->info_raw); + lodepng_info_cleanup(&state->info_png); +} + +void lodepng_state_copy(LodePNGState * dest, const LodePNGState * source) +{ + lodepng_state_cleanup(dest); + *dest = *source; + lodepng_color_mode_init(&dest->info_raw); + lodepng_info_init(&dest->info_png); + dest->error = lodepng_color_mode_copy(&dest->info_raw, &source->info_raw); + if(dest->error) return; + dest->error = lodepng_info_copy(&dest->info_png, &source->info_png); + if(dest->error) return; +} + +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_ENCODER + +/* ////////////////////////////////////////////////////////////////////////// */ +/* / PNG Encoder / */ +/* ////////////////////////////////////////////////////////////////////////// */ + + +static unsigned writeSignature(ucvector * out) +{ + size_t pos = out->size; + const unsigned char signature[] = {137, 80, 78, 71, 13, 10, 26, 10}; + /*8 bytes PNG signature, aka the magic bytes*/ + if(!ucvector_resize(out, out->size + 8)) return 83; /*alloc fail*/ + lodepng_memcpy(out->data + pos, signature, 8); + return 0; +} + +static unsigned addChunk_IHDR(ucvector * out, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth, unsigned interlace_method) +{ + unsigned char * chunk, * data; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 13, "IHDR")); + data = chunk + 8; + + lodepng_set32bitInt(data + 0, w); /*width*/ + lodepng_set32bitInt(data + 4, h); /*height*/ + data[8] = (unsigned char)bitdepth; /*bit depth*/ + data[9] = (unsigned char)colortype; /*color type*/ + data[10] = 0; /*compression method*/ + data[11] = 0; /*filter method*/ + data[12] = interlace_method; /*interlace method*/ + + lodepng_chunk_generate_crc(chunk); + return 0; +} + +/* only adds the chunk if needed (there is a key or palette with alpha) */ +static unsigned addChunk_PLTE(ucvector * out, const LodePNGColorMode * info) +{ + unsigned char * chunk; + size_t i, j = 8; + + if(info->palettesize == 0 || info->palettesize > 256) { + return 68; /*invalid palette size, it is only allowed to be 1-256*/ + } + + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE")); + + for(i = 0; i != info->palettesize; ++i) { + /*add all channels except alpha channel*/ + chunk[j++] = info->palette[i * 4 + 0]; + chunk[j++] = info->palette[i * 4 + 1]; + chunk[j++] = info->palette[i * 4 + 2]; + } + + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_tRNS(ucvector * out, const LodePNGColorMode * info) +{ + unsigned char * chunk = 0; + + if(info->colortype == LCT_PALETTE) { + size_t i, amount = info->palettesize; + /*the tail of palette values that all have 255 as alpha, does not have to be encoded*/ + for(i = info->palettesize; i != 0; --i) { + if(info->palette[4 * (i - 1) + 3] != 255) break; + --amount; + } + if(amount) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, amount, "tRNS")); + /*add the alpha channel values from the palette*/ + for(i = 0; i != amount; ++i) chunk[8 + i] = info->palette[4 * i + 3]; + } + } + else if(info->colortype == LCT_GREY) { + if(info->key_defined) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "tRNS")); + chunk[8] = (unsigned char)(info->key_r >> 8); + chunk[9] = (unsigned char)(info->key_r & 255); + } + } + else if(info->colortype == LCT_RGB) { + if(info->key_defined) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "tRNS")); + chunk[8] = (unsigned char)(info->key_r >> 8); + chunk[9] = (unsigned char)(info->key_r & 255); + chunk[10] = (unsigned char)(info->key_g >> 8); + chunk[11] = (unsigned char)(info->key_g & 255); + chunk[12] = (unsigned char)(info->key_b >> 8); + chunk[13] = (unsigned char)(info->key_b & 255); + } + } + + if(chunk) lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_IDAT(ucvector * out, const unsigned char * data, size_t datasize, + LodePNGCompressSettings * zlibsettings) +{ + unsigned error = 0; + unsigned char * zlib = 0; + size_t zlibsize = 0; + + error = zlib_compress(&zlib, &zlibsize, data, datasize, zlibsettings); + if(!error) { + error = lodepng_chunk_createv(out, zlibsize, "IDAT", zlib); + } + lodepng_free(zlib); + return error; +} + +static unsigned addChunk_IEND(ucvector * out) +{ + return lodepng_chunk_createv(out, 0, "IEND", 0); +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + +static unsigned addChunk_tEXt(ucvector * out, const char * keyword, const char * textstring) +{ + unsigned char * chunk = 0; + size_t keysize = lodepng_strlen(keyword), textsize = lodepng_strlen(textstring); + size_t size = keysize + 1 + textsize; + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, size, "tEXt")); + lodepng_memcpy(chunk + 8, keyword, keysize); + chunk[8 + keysize] = 0; /*null termination char*/ + lodepng_memcpy(chunk + 9 + keysize, textstring, textsize); + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_zTXt(ucvector * out, const char * keyword, const char * textstring, + LodePNGCompressSettings * zlibsettings) +{ + unsigned error = 0; + unsigned char * chunk = 0; + unsigned char * compressed = 0; + size_t compressedsize = 0; + size_t textsize = lodepng_strlen(textstring); + size_t keysize = lodepng_strlen(keyword); + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + + error = zlib_compress(&compressed, &compressedsize, + (const unsigned char *)textstring, textsize, zlibsettings); + if(!error) { + size_t size = keysize + 2 + compressedsize; + error = lodepng_chunk_init(&chunk, out, size, "zTXt"); + } + if(!error) { + lodepng_memcpy(chunk + 8, keyword, keysize); + chunk[8 + keysize] = 0; /*null termination char*/ + chunk[9 + keysize] = 0; /*compression method: 0*/ + lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); + lodepng_chunk_generate_crc(chunk); + } + + lodepng_free(compressed); + return error; +} + +static unsigned addChunk_iTXt(ucvector * out, unsigned compress, const char * keyword, const char * langtag, + const char * transkey, const char * textstring, LodePNGCompressSettings * zlibsettings) +{ + unsigned error = 0; + unsigned char * chunk = 0; + unsigned char * compressed = 0; + size_t compressedsize = 0; + size_t textsize = lodepng_strlen(textstring); + size_t keysize = lodepng_strlen(keyword), langsize = lodepng_strlen(langtag), transsize = lodepng_strlen(transkey); + + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + + if(compress) { + error = zlib_compress(&compressed, &compressedsize, + (const unsigned char *)textstring, textsize, zlibsettings); + } + if(!error) { + size_t size = keysize + 3 + langsize + 1 + transsize + 1 + (compress ? compressedsize : textsize); + error = lodepng_chunk_init(&chunk, out, size, "iTXt"); + } + if(!error) { + size_t pos = 8; + lodepng_memcpy(chunk + pos, keyword, keysize); + pos += keysize; + chunk[pos++] = 0; /*null termination char*/ + chunk[pos++] = (compress ? 1 : 0); /*compression flag*/ + chunk[pos++] = 0; /*compression method: 0*/ + lodepng_memcpy(chunk + pos, langtag, langsize); + pos += langsize; + chunk[pos++] = 0; /*null termination char*/ + lodepng_memcpy(chunk + pos, transkey, transsize); + pos += transsize; + chunk[pos++] = 0; /*null termination char*/ + if(compress) { + lodepng_memcpy(chunk + pos, compressed, compressedsize); + } + else { + lodepng_memcpy(chunk + pos, textstring, textsize); + } + lodepng_chunk_generate_crc(chunk); + } + + lodepng_free(compressed); + return error; +} + +static unsigned addChunk_bKGD(ucvector * out, const LodePNGInfo * info) +{ + unsigned char * chunk = 0; + if(info->color.colortype == LCT_GREY || info->color.colortype == LCT_GREY_ALPHA) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "bKGD")); + chunk[8] = (unsigned char)(info->background_r >> 8); + chunk[9] = (unsigned char)(info->background_r & 255); + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_RGBA) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 6, "bKGD")); + chunk[8] = (unsigned char)(info->background_r >> 8); + chunk[9] = (unsigned char)(info->background_r & 255); + chunk[10] = (unsigned char)(info->background_g >> 8); + chunk[11] = (unsigned char)(info->background_g & 255); + chunk[12] = (unsigned char)(info->background_b >> 8); + chunk[13] = (unsigned char)(info->background_b & 255); + } + else if(info->color.colortype == LCT_PALETTE) { + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "bKGD")); + chunk[8] = (unsigned char)(info->background_r & 255); /*palette index*/ + } + if(chunk) lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_tIME(ucvector * out, const LodePNGTime * time) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 7, "tIME")); + chunk[8] = (unsigned char)(time->year >> 8); + chunk[9] = (unsigned char)(time->year & 255); + chunk[10] = (unsigned char)time->month; + chunk[11] = (unsigned char)time->day; + chunk[12] = (unsigned char)time->hour; + chunk[13] = (unsigned char)time->minute; + chunk[14] = (unsigned char)time->second; + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_pHYs(ucvector * out, const LodePNGInfo * info) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 9, "pHYs")); + lodepng_set32bitInt(chunk + 8, info->phys_x); + lodepng_set32bitInt(chunk + 12, info->phys_y); + chunk[16] = info->phys_unit; + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_gAMA(ucvector * out, const LodePNGInfo * info) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "gAMA")); + lodepng_set32bitInt(chunk + 8, info->gama_gamma); + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_cHRM(ucvector * out, const LodePNGInfo * info) +{ + unsigned char * chunk; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 32, "cHRM")); + lodepng_set32bitInt(chunk + 8, info->chrm_white_x); + lodepng_set32bitInt(chunk + 12, info->chrm_white_y); + lodepng_set32bitInt(chunk + 16, info->chrm_red_x); + lodepng_set32bitInt(chunk + 20, info->chrm_red_y); + lodepng_set32bitInt(chunk + 24, info->chrm_green_x); + lodepng_set32bitInt(chunk + 28, info->chrm_green_y); + lodepng_set32bitInt(chunk + 32, info->chrm_blue_x); + lodepng_set32bitInt(chunk + 36, info->chrm_blue_y); + lodepng_chunk_generate_crc(chunk); + return 0; +} + +static unsigned addChunk_sRGB(ucvector * out, const LodePNGInfo * info) +{ + unsigned char data = info->srgb_intent; + return lodepng_chunk_createv(out, 1, "sRGB", &data); +} + +static unsigned addChunk_iCCP(ucvector * out, const LodePNGInfo * info, LodePNGCompressSettings * zlibsettings) +{ + unsigned error = 0; + unsigned char * chunk = 0; + unsigned char * compressed = 0; + size_t compressedsize = 0; + size_t keysize = lodepng_strlen(info->iccp_name); + + if(keysize < 1 || keysize > 79) return 89; /*error: invalid keyword size*/ + error = zlib_compress(&compressed, &compressedsize, + info->iccp_profile, info->iccp_profile_size, zlibsettings); + if(!error) { + size_t size = keysize + 2 + compressedsize; + error = lodepng_chunk_init(&chunk, out, size, "iCCP"); + } + if(!error) { + lodepng_memcpy(chunk + 8, info->iccp_name, keysize); + chunk[8 + keysize] = 0; /*null termination char*/ + chunk[9 + keysize] = 0; /*compression method: 0*/ + lodepng_memcpy(chunk + 10 + keysize, compressed, compressedsize); + lodepng_chunk_generate_crc(chunk); + } + + lodepng_free(compressed); + return error; +} + +static unsigned addChunk_sBIT(ucvector * out, const LodePNGInfo * info) +{ + unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth; + unsigned char * chunk = 0; + if(info->color.colortype == LCT_GREY) { + if(info->sbit_r == 0 || info->sbit_r > bitdepth) return 115; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "sBIT")); + chunk[8] = info->sbit_r; + } + else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) { + if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0) return 115; + if(info->sbit_r > bitdepth || info->sbit_g > bitdepth || info->sbit_b > bitdepth) return 115; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 3, "sBIT")); + chunk[8] = info->sbit_r; + chunk[9] = info->sbit_g; + chunk[10] = info->sbit_b; + } + else if(info->color.colortype == LCT_GREY_ALPHA) { + if(info->sbit_r == 0 || info->sbit_a == 0) return 115; + if(info->sbit_r > bitdepth || info->sbit_a > bitdepth) return 115; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "sBIT")); + chunk[8] = info->sbit_r; + chunk[9] = info->sbit_a; + } + else if(info->color.colortype == LCT_RGBA) { + if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0 || info->sbit_a == 0 || + info->sbit_r > bitdepth || info->sbit_g > bitdepth || + info->sbit_b > bitdepth || info->sbit_a > bitdepth) { + return 115; + } + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "sBIT")); + chunk[8] = info->sbit_r; + chunk[9] = info->sbit_g; + chunk[10] = info->sbit_b; + chunk[11] = info->sbit_a; + } + if(chunk) lodepng_chunk_generate_crc(chunk); + return 0; +} + +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +static void filterScanline(unsigned char * out, const unsigned char * scanline, const unsigned char * prevline, + size_t length, size_t bytewidth, unsigned char filterType) +{ + size_t i; + switch(filterType) { + case 0: /*None*/ + for(i = 0; i != length; ++i) out[i] = scanline[i]; + break; + case 1: /*Sub*/ + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - scanline[i - bytewidth]; + break; + case 2: /*Up*/ + if(prevline) { + for(i = 0; i != length; ++i) out[i] = scanline[i] - prevline[i]; + } + else { + for(i = 0; i != length; ++i) out[i] = scanline[i]; + } + break; + case 3: /*Average*/ + if(prevline) { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i] - (prevline[i] >> 1); + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1); + } + else { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1); + } + break; + case 4: /*Paeth*/ + if(prevline) { + /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/ + for(i = 0; i != bytewidth; ++i) out[i] = (scanline[i] - prevline[i]); + for(i = bytewidth; i < length; ++i) { + out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth])); + } + } + else { + for(i = 0; i != bytewidth; ++i) out[i] = scanline[i]; + /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/ + for(i = bytewidth; i < length; ++i) out[i] = (scanline[i] - scanline[i - bytewidth]); + } + break; + default: + return; /*invalid filter type given*/ + } +} + +/* integer binary logarithm, max return value is 31 */ +static size_t ilog2(size_t i) +{ + size_t result = 0; + if(i >= 65536) { + result += 16; + i >>= 16; + } + if(i >= 256) { + result += 8; + i >>= 8; + } + if(i >= 16) { + result += 4; + i >>= 4; + } + if(i >= 4) { + result += 2; + i >>= 2; + } + if(i >= 2) { + result += 1; /*i >>= 1;*/ + } + return result; +} + +/* integer approximation for i * log2(i), helper function for LFS_ENTROPY */ +static size_t ilog2i(size_t i) +{ + size_t l; + if(i == 0) return 0; + l = ilog2(i); + /* approximate i*log2(i): l is integer logarithm, ((i - (1u << l)) << 1u) + linearly approximates the missing fractional part multiplied by i */ + return i * l + ((i - (((size_t)1) << l)) << 1u); +} + +static unsigned filter(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, + const LodePNGColorMode * color, const LodePNGEncoderSettings * settings) +{ + /* + For PNG filter method 0 + out must be a buffer with as size: h + (w * h * bpp + 7u) / 8u, because there are + the scanlines with 1 extra byte per scanline + */ + + unsigned bpp = lodepng_get_bpp(color); + /*the width of a scanline in bytes, not including the filter type*/ + size_t linebytes = lodepng_get_raw_size_idat(w, 1, bpp) - 1u; + + /*bytewidth is used for filtering, is 1 when bpp < 8, number of bytes per pixel otherwise*/ + size_t bytewidth = (bpp + 7u) / 8u; + const unsigned char * prevline = 0; + unsigned x, y; + unsigned error = 0; + LodePNGFilterStrategy strategy = settings->filter_strategy; + + /* + There is a heuristic called the minimum sum of absolute differences heuristic, suggested by the PNG standard: + * If the image type is Palette, or the bit depth is smaller than 8, then do not filter the image (i.e. + use fixed filtering, with the filter None). + * (The other case) If the image type is Grayscale or RGB (with or without Alpha), and the bit depth is + not smaller than 8, then use adaptive filtering heuristic as follows: independently for each row, apply + all five filters and select the filter that produces the smallest sum of absolute values per row. + This heuristic is used if filter strategy is LFS_MINSUM and filter_palette_zero is true. + + If filter_palette_zero is true and filter_strategy is not LFS_MINSUM, the above heuristic is followed, + but for "the other case", whatever strategy filter_strategy is set to instead of the minimum sum + heuristic is used. + */ + if(settings->filter_palette_zero && + (color->colortype == LCT_PALETTE || color->bitdepth < 8)) strategy = LFS_ZERO; + + if(bpp == 0) return 31; /*error: invalid color type*/ + + if(strategy >= LFS_ZERO && strategy <= LFS_FOUR) { + unsigned char type = (unsigned char)strategy; + for(y = 0; y != h; ++y) { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_MINSUM) { + /*adaptive filtering*/ + unsigned char * attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned char type, bestType = 0; + + for(type = 0; type != 5; ++type) { + attempt[type] = (unsigned char *)lodepng_malloc(linebytes); + if(!attempt[type]) error = 83; /*alloc fail*/ + } + + if(!error) { + for(y = 0; y != h; ++y) { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) { + size_t sum = 0; + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + + /*calculate the sum of the result*/ + if(type == 0) { + for(x = 0; x != linebytes; ++x) sum += (unsigned char)(attempt[type][x]); + } + else { + for(x = 0; x != linebytes; ++x) { + /*For differences, each byte should be treated as signed, values above 127 are negative + (converted to signed char). Filtertype 0 isn't a difference though, so use unsigned there. + This means filtertype 0 is almost never chosen, but that is justified.*/ + unsigned char s = attempt[type][x]; + sum += s < 128 ? s : (255U - s); + } + } + + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum < smallest) { + bestType = type; + smallest = sum; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else if(strategy == LFS_ENTROPY) { + unsigned char * attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t bestSum = 0; + unsigned type, bestType = 0; + unsigned count[256]; + + for(type = 0; type != 5; ++type) { + attempt[type] = (unsigned char *)lodepng_malloc(linebytes); + if(!attempt[type]) error = 83; /*alloc fail*/ + } + + if(!error) { + for(y = 0; y != h; ++y) { + /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) { + size_t sum = 0; + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + lodepng_memset(count, 0, 256 * sizeof(*count)); + for(x = 0; x != linebytes; ++x) ++count[attempt[type][x]]; + ++count[type]; /*the filter type itself is part of the scanline*/ + for(x = 0; x != 256; ++x) { + sum += ilog2i(count[x]); + } + /*check if this is smallest sum (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || sum > bestSum) { + bestType = type; + bestSum = sum; + } + } + + prevline = &in[y * linebytes]; + + /*now fill the out values*/ + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else if(strategy == LFS_PREDEFINED) { + for(y = 0; y != h; ++y) { + size_t outindex = (1 + linebytes) * y; /*the extra filterbyte added to each row*/ + size_t inindex = linebytes * y; + unsigned char type = settings->predefined_filters[y]; + out[outindex] = type; /*filter type byte*/ + filterScanline(&out[outindex + 1], &in[inindex], prevline, linebytes, bytewidth, type); + prevline = &in[inindex]; + } + } + else if(strategy == LFS_BRUTE_FORCE) { + /*brute force filter chooser. + deflate the scanline after every filter attempt to see which one deflates best. + This is very slow and gives only slightly smaller, sometimes even larger, result*/ + size_t size[5]; + unsigned char * attempt[5]; /*five filtering attempts, one for each filter type*/ + size_t smallest = 0; + unsigned type = 0, bestType = 0; + unsigned char * dummy; + LodePNGCompressSettings zlibsettings; + lodepng_memcpy(&zlibsettings, &settings->zlibsettings, sizeof(LodePNGCompressSettings)); + /*use fixed tree on the attempts so that the tree is not adapted to the filtertype on purpose, + to simulate the true case where the tree is the same for the whole image. Sometimes it gives + better result with dynamic tree anyway. Using the fixed tree sometimes gives worse, but in rare + cases better compression. It does make this a bit less slow, so it's worth doing this.*/ + zlibsettings.btype = 1; + /*a custom encoder likely doesn't read the btype setting and is optimized for complete PNG + images only, so disable it*/ + zlibsettings.custom_zlib = 0; + zlibsettings.custom_deflate = 0; + for(type = 0; type != 5; ++type) { + attempt[type] = (unsigned char *)lodepng_malloc(linebytes); + if(!attempt[type]) error = 83; /*alloc fail*/ + } + if(!error) { + for(y = 0; y != h; ++y) { /*try the 5 filter types*/ + for(type = 0; type != 5; ++type) { + unsigned testsize = (unsigned)linebytes; + /*if(testsize > 8) testsize /= 8;*/ /*it already works good enough by testing a part of the row*/ + + filterScanline(attempt[type], &in[y * linebytes], prevline, linebytes, bytewidth, type); + size[type] = 0; + dummy = 0; + zlib_compress(&dummy, &size[type], attempt[type], testsize, &zlibsettings); + lodepng_free(dummy); + /*check if this is smallest size (or if type == 0 it's the first case so always store the values)*/ + if(type == 0 || size[type] < smallest) { + bestType = type; + smallest = size[type]; + } + } + prevline = &in[y * linebytes]; + out[y * (linebytes + 1)] = bestType; /*the first byte of a scanline will be the filter type*/ + for(x = 0; x != linebytes; ++x) out[y * (linebytes + 1) + 1 + x] = attempt[bestType][x]; + } + } + for(type = 0; type != 5; ++type) lodepng_free(attempt[type]); + } + else return 88; /* unknown filter strategy */ + + return error; +} + +static void addPaddingBits(unsigned char * out, const unsigned char * in, + size_t olinebits, size_t ilinebits, unsigned h) +{ + /*The opposite of the removePaddingBits function + olinebits must be >= ilinebits*/ + unsigned y; + size_t diff = olinebits - ilinebits; + size_t obp = 0, ibp = 0; /*bit pointers*/ + for(y = 0; y != h; ++y) { + size_t x; + for(x = 0; x < ilinebits; ++x) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + /*obp += diff; --> no, fill in some value in the padding bits too, to avoid + "Use of uninitialised value of size ###" warning from valgrind*/ + for(x = 0; x != diff; ++x) setBitOfReversedStream(&obp, out, 0); + } +} + +/* +in: non-interlaced image with size w*h +out: the same pixels, but re-ordered according to PNG's Adam7 interlacing, with + no padding bits between scanlines, but between reduced images so that each + reduced image starts at a byte. +bpp: bits per pixel +there are no padding bits, not between scanlines, not between reduced images +in has the following size in bits: w * h * bpp. +out is possibly bigger due to padding bits between reduced images +NOTE: comments about padding bits are only relevant if bpp < 8 +*/ +static void Adam7_interlace(unsigned char * out, const unsigned char * in, unsigned w, unsigned h, unsigned bpp) +{ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned i; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + if(bpp >= 8) { + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + size_t bytewidth = bpp / 8u; + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + size_t pixelinstart = ((ADAM7_IY[i] + y * ADAM7_DY[i]) * w + ADAM7_IX[i] + x * ADAM7_DX[i]) * bytewidth; + size_t pixeloutstart = passstart[i] + (y * passw[i] + x) * bytewidth; + for(b = 0; b < bytewidth; ++b) { + out[pixeloutstart + b] = in[pixelinstart + b]; + } + } + } + } + else { /*bpp < 8: Adam7 with pixels < 8 bit is a bit trickier: with bit pointers*/ + for(i = 0; i != 7; ++i) { + unsigned x, y, b; + unsigned ilinebits = bpp * passw[i]; + unsigned olinebits = bpp * w; + size_t obp, ibp; /*bit pointers (for out and in buffer)*/ + for(y = 0; y < passh[i]; ++y) + for(x = 0; x < passw[i]; ++x) { + ibp = (ADAM7_IY[i] + y * ADAM7_DY[i]) * olinebits + (ADAM7_IX[i] + x * ADAM7_DX[i]) * bpp; + obp = (8 * passstart[i]) + (y * ilinebits + x * bpp); + for(b = 0; b < bpp; ++b) { + unsigned char bit = readBitFromReversedStream(&ibp, in); + setBitOfReversedStream(&obp, out, bit); + } + } + } + } +} + +/*out must be buffer big enough to contain uncompressed IDAT chunk data, and in must contain the full image. +return value is error**/ +static unsigned preProcessScanlines(unsigned char ** out, size_t * outsize, const unsigned char * in, + unsigned w, unsigned h, + const LodePNGInfo * info_png, const LodePNGEncoderSettings * settings) +{ + /* + This function converts the pure 2D image with the PNG's colortype, into filtered-padded-interlaced data. Steps: + *) if no Adam7: 1) add padding bits (= possible extra bits per scanline if bpp < 8) 2) filter + *) if adam7: 1) Adam7_interlace 2) 7x add padding bits 3) 7x filter + */ + unsigned bpp = lodepng_get_bpp(&info_png->color); + unsigned error = 0; + + if(info_png->interlace_method == 0) { + *outsize = h + (h * ((w * bpp + 7u) / 8u)); /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char *)lodepng_malloc(*outsize); + if(!(*out) && (*outsize)) error = 83; /*alloc fail*/ + + if(!error) { + /*non multiple of 8 bits per scanline, padding bits needed per scanline*/ + if(bpp < 8 && w * bpp != ((w * bpp + 7u) / 8u) * 8u) { + unsigned char * padded = (unsigned char *)lodepng_malloc(h * ((w * bpp + 7u) / 8u)); + if(!padded) error = 83; /*alloc fail*/ + if(!error) { + addPaddingBits(padded, in, ((w * bpp + 7u) / 8u) * 8u, w * bpp, h); + error = filter(*out, padded, w, h, &info_png->color, settings); + } + lodepng_free(padded); + } + else { + /*we can immediately filter into the out buffer, no other steps needed*/ + error = filter(*out, in, w, h, &info_png->color, settings); + } + } + } + else { /*interlace_method is 1 (Adam7)*/ + unsigned passw[7], passh[7]; + size_t filter_passstart[8], padded_passstart[8], passstart[8]; + unsigned char * adam7; + + Adam7_getpassvalues(passw, passh, filter_passstart, padded_passstart, passstart, w, h, bpp); + + *outsize = filter_passstart[7]; /*image size plus an extra byte per scanline + possible padding bits*/ + *out = (unsigned char *)lodepng_malloc(*outsize); + if(!(*out)) error = 83; /*alloc fail*/ + + adam7 = (unsigned char *)lodepng_malloc(passstart[7]); + if(!adam7 && passstart[7]) error = 83; /*alloc fail*/ + + if(!error) { + unsigned i; + + Adam7_interlace(adam7, in, w, h, bpp); + for(i = 0; i != 7; ++i) { + if(bpp < 8) { + unsigned char * padded = (unsigned char *)lodepng_malloc(padded_passstart[i + 1] - padded_passstart[i]); + if(!padded) ERROR_BREAK(83); /*alloc fail*/ + addPaddingBits(padded, &adam7[passstart[i]], + ((passw[i] * bpp + 7u) / 8u) * 8u, passw[i] * bpp, passh[i]); + error = filter(&(*out)[filter_passstart[i]], padded, + passw[i], passh[i], &info_png->color, settings); + lodepng_free(padded); + } + else { + error = filter(&(*out)[filter_passstart[i]], &adam7[padded_passstart[i]], + passw[i], passh[i], &info_png->color, settings); + } + + if(error) break; + } + } + + lodepng_free(adam7); + } + + return error; +} + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +static unsigned addUnknownChunks(ucvector * out, unsigned char * data, size_t datasize) +{ + unsigned char * inchunk = data; + while((size_t)(inchunk - data) < datasize) { + CERROR_TRY_RETURN(lodepng_chunk_append(&out->data, &out->size, inchunk)); + out->allocsize = out->size; /*fix the allocsize again*/ + inchunk = lodepng_chunk_next(inchunk, data + datasize); + } + return 0; +} + +static unsigned isGrayICCProfile(const unsigned char * profile, unsigned size) +{ + /* + It is a gray profile if bytes 16-19 are "GRAY", rgb profile if bytes 16-19 + are "RGB ". We do not perform any full parsing of the ICC profile here, other + than check those 4 bytes to grayscale profile. Other than that, validity of + the profile is not checked. This is needed only because the PNG specification + requires using a non-gray color model if there is an ICC profile with "RGB " + (sadly limiting compression opportunities if the input data is grayscale RGB + data), and requires using a gray color model if it is "GRAY". + */ + if(size < 20) return 0; + return profile[16] == 'G' && profile[17] == 'R' && profile[18] == 'A' && profile[19] == 'Y'; +} + +static unsigned isRGBICCProfile(const unsigned char * profile, unsigned size) +{ + /* See comment in isGrayICCProfile*/ + if(size < 20) return 0; + return profile[16] == 'R' && profile[17] == 'G' && profile[18] == 'B' && profile[19] == ' '; +} +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +unsigned lodepng_encode(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h, + LodePNGState * state) +{ + unsigned char * data = 0; /*uncompressed version of the IDAT chunk data*/ + size_t datasize = 0; + ucvector outv = ucvector_init(NULL, 0); + LodePNGInfo info; + const LodePNGInfo * info_png = &state->info_png; + LodePNGColorMode auto_color; + + lodepng_info_init(&info); + lodepng_color_mode_init(&auto_color); + + /*provide some proper output values if error will happen*/ + *out = 0; + *outsize = 0; + state->error = 0; + + /*check input values validity*/ + if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette) + && (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) { + /*this error is returned even if auto_convert is enabled and thus encoder could + generate the palette by itself: while allowing this could be possible in theory, + it may complicate the code or edge cases, and always requiring to give a palette + when setting this color type is a simpler contract*/ + state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ + goto cleanup; + } + if(state->encoder.zlibsettings.btype > 2) { + state->error = 61; /*error: invalid btype*/ + goto cleanup; + } + if(info_png->interlace_method > 1) { + state->error = 71; /*error: invalid interlace mode*/ + goto cleanup; + } + state->error = checkColorValidity(info_png->color.colortype, info_png->color.bitdepth); + if(state->error) goto cleanup; /*error: invalid color type given*/ + state->error = checkColorValidity(state->info_raw.colortype, state->info_raw.bitdepth); + if(state->error) goto cleanup; /*error: invalid color type given*/ + + /* color convert and compute scanline filter types */ + lodepng_info_copy(&info, &state->info_png); + if(state->encoder.auto_convert) { + LodePNGColorStats stats; + unsigned allow_convert = 1; + lodepng_color_stats_init(&stats); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->iccp_defined && + isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { + /*the PNG specification does not allow to use palette with a GRAY ICC profile, even + if the palette has only gray colors, so disallow it.*/ + stats.allow_palette = 0; + } + if(info_png->iccp_defined && + isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size)) { + /*the PNG specification does not allow to use grayscale color with RGB ICC profile, so disallow gray.*/ + stats.allow_greyscale = 0; + } +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + state->error = lodepng_compute_color_stats(&stats, image, w, h, &state->info_raw); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->background_defined) { + /*the background chunk's color must be taken into account as well*/ + unsigned r = 0, g = 0, b = 0; + LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16); + lodepng_convert_rgb(&r, &g, &b, + info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color); + state->error = lodepng_color_stats_add(&stats, r, g, b, 65535); + if(state->error) goto cleanup; + } +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + state->error = auto_choose_color(&auto_color, &state->info_raw, &stats); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->sbit_defined) { + /*if sbit is defined, due to strict requirements of which sbit values can be present for which color modes, + auto_convert can't be done in many cases. However, do support a few cases here. + TODO: more conversions may be possible, and it may also be possible to get a more appropriate color type out of + auto_choose_color if knowledge about sbit is used beforehand + */ + unsigned sbit_max = LODEPNG_MAX(LODEPNG_MAX(LODEPNG_MAX(info_png->sbit_r, info_png->sbit_g), + info_png->sbit_b), info_png->sbit_a); + unsigned equal = (!info_png->sbit_g || info_png->sbit_g == info_png->sbit_r) + && (!info_png->sbit_b || info_png->sbit_b == info_png->sbit_r) + && (!info_png->sbit_a || info_png->sbit_a == info_png->sbit_r); + allow_convert = 0; + if(info.color.colortype == LCT_PALETTE && + auto_color.colortype == LCT_PALETTE) { + /* input and output are palette, and in this case it may happen that palette data is + expected to be copied from info_raw into the info_png */ + allow_convert = 1; + } + /*going from 8-bit RGB to palette (or 16-bit as long as sbit_max <= 8) is possible + since both are 8-bit RGB for sBIT's purposes*/ + if(info.color.colortype == LCT_RGB && + auto_color.colortype == LCT_PALETTE && sbit_max <= 8) { + allow_convert = 1; + } + /*going from 8-bit RGBA to palette is also ok but only if sbit_a is exactly 8*/ + if(info.color.colortype == LCT_RGBA && auto_color.colortype == LCT_PALETTE && + info_png->sbit_a == 8 && sbit_max <= 8) { + allow_convert = 1; + } + /*going from 16-bit RGB(A) to 8-bit RGB(A) is ok if all sbit values are <= 8*/ + if((info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA) && info.color.bitdepth == 16 && + auto_color.colortype == info.color.colortype && auto_color.bitdepth == 8 && + sbit_max <= 8) { + allow_convert = 1; + } + /*going to less channels is ok if all bit values are equal (all possible values in sbit, + as well as the chosen bitdepth of the result). Due to how auto_convert works, + we already know that auto_color.colortype has less than or equal amount of channels than + info.colortype. Palette is not used here. This conversion is not allowed if + info_png->sbit_r < auto_color.bitdepth, because specifically for alpha, non-presence of + an sbit value heavily implies that alpha's bit depth is equal to the PNG bit depth (rather + than the bit depths set in the r, g and b sbit values, by how the PNG specification describes + handling tRNS chunk case with sBIT), so be conservative here about ignoring user input.*/ + if(info.color.colortype != LCT_PALETTE && auto_color.colortype != LCT_PALETTE && + equal && info_png->sbit_r == auto_color.bitdepth) { + allow_convert = 1; + } + } +#endif + if(state->encoder.force_palette) { + if(info.color.colortype != LCT_GREY && info.color.colortype != LCT_GREY_ALPHA && + (auto_color.colortype == LCT_GREY || auto_color.colortype == LCT_GREY_ALPHA)) { + /*user speficially forced a PLTE palette, so cannot convert to grayscale types because + the PNG specification only allows writing a suggested palette in PLTE for truecolor types*/ + allow_convert = 0; + } + } + if(allow_convert) { + lodepng_color_mode_copy(&info.color, &auto_color); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*also convert the background chunk*/ + if(info_png->background_defined) { + if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b, + info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) { + state->error = 104; + goto cleanup; + } + } +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + } + } +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + if(info_png->iccp_defined) { + unsigned gray_icc = isGrayICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); + unsigned rgb_icc = isRGBICCProfile(info_png->iccp_profile, info_png->iccp_profile_size); + unsigned gray_png = info.color.colortype == LCT_GREY || info.color.colortype == LCT_GREY_ALPHA; + if(!gray_icc && !rgb_icc) { + state->error = 100; /* Disallowed profile color type for PNG */ + goto cleanup; + } + if(gray_icc != gray_png) { + /*Not allowed to use RGB/RGBA/palette with GRAY ICC profile or vice versa, + or in case of auto_convert, it wasn't possible to find appropriate model*/ + state->error = state->encoder.auto_convert ? 102 : 101; + goto cleanup; + } + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + if(!lodepng_color_mode_equal(&state->info_raw, &info.color)) { + unsigned char * converted; + size_t size = ((size_t)w * (size_t)h * (size_t)lodepng_get_bpp(&info.color) + 7u) / 8u; + + converted = (unsigned char *)lodepng_malloc(size); + if(!converted && size) state->error = 83; /*alloc fail*/ + if(!state->error) { + state->error = lodepng_convert(converted, image, &info.color, &state->info_raw, w, h); + } + if(!state->error) { + state->error = preProcessScanlines(&data, &datasize, converted, w, h, &info, &state->encoder); + } + lodepng_free(converted); + if(state->error) goto cleanup; + } + else { + state->error = preProcessScanlines(&data, &datasize, image, w, h, &info, &state->encoder); + if(state->error) goto cleanup; + } + + /* output all PNG chunks */ { +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + size_t i; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*write signature and chunks*/ + state->error = writeSignature(&outv); + if(state->error) goto cleanup; + /*IHDR*/ + state->error = addChunk_IHDR(&outv, w, h, info.color.colortype, info.color.bitdepth, info.interlace_method); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*unknown chunks between IHDR and PLTE*/ + if(info.unknown_chunks_data[0]) { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[0], info.unknown_chunks_size[0]); + if(state->error) goto cleanup; + } + /*color profile chunks must come before PLTE */ + if(info.iccp_defined) { + state->error = addChunk_iCCP(&outv, &info, &state->encoder.zlibsettings); + if(state->error) goto cleanup; + } + if(info.srgb_defined) { + state->error = addChunk_sRGB(&outv, &info); + if(state->error) goto cleanup; + } + if(info.gama_defined) { + state->error = addChunk_gAMA(&outv, &info); + if(state->error) goto cleanup; + } + if(info.chrm_defined) { + state->error = addChunk_cHRM(&outv, &info); + if(state->error) goto cleanup; + } + if(info_png->sbit_defined) { + state->error = addChunk_sBIT(&outv, &info); + if(state->error) goto cleanup; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*PLTE*/ + if(info.color.colortype == LCT_PALETTE) { + state->error = addChunk_PLTE(&outv, &info.color); + if(state->error) goto cleanup; + } + if(state->encoder.force_palette && (info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA)) { + /*force_palette means: write suggested palette for truecolor in PLTE chunk*/ + state->error = addChunk_PLTE(&outv, &info.color); + if(state->error) goto cleanup; + } + /*tRNS (this will only add if when necessary) */ + state->error = addChunk_tRNS(&outv, &info.color); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*bKGD (must come between PLTE and the IDAt chunks*/ + if(info.background_defined) { + state->error = addChunk_bKGD(&outv, &info); + if(state->error) goto cleanup; + } + /*pHYs (must come before the IDAT chunks)*/ + if(info.phys_defined) { + state->error = addChunk_pHYs(&outv, &info); + if(state->error) goto cleanup; + } + + /*unknown chunks between PLTE and IDAT*/ + if(info.unknown_chunks_data[1]) { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[1], info.unknown_chunks_size[1]); + if(state->error) goto cleanup; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + /*IDAT (multiple IDAT chunks must be consecutive)*/ + state->error = addChunk_IDAT(&outv, data, datasize, &state->encoder.zlibsettings); + if(state->error) goto cleanup; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*tIME*/ + if(info.time_defined) { + state->error = addChunk_tIME(&outv, &info.time); + if(state->error) goto cleanup; + } + /*tEXt and/or zTXt*/ + for(i = 0; i != info.text_num; ++i) { + if(lodepng_strlen(info.text_keys[i]) > 79) { + state->error = 66; /*text chunk too large*/ + goto cleanup; + } + if(lodepng_strlen(info.text_keys[i]) < 1) { + state->error = 67; /*text chunk too small*/ + goto cleanup; + } + if(state->encoder.text_compression) { + state->error = addChunk_zTXt(&outv, info.text_keys[i], info.text_strings[i], &state->encoder.zlibsettings); + if(state->error) goto cleanup; + } + else { + state->error = addChunk_tEXt(&outv, info.text_keys[i], info.text_strings[i]); + if(state->error) goto cleanup; + } + } + /*LodePNG version id in text chunk*/ + if(state->encoder.add_id) { + unsigned already_added_id_text = 0; + for(i = 0; i != info.text_num; ++i) { + const char * k = info.text_keys[i]; + /* Could use strcmp, but we're not calling or reimplementing this C library function for this use only */ + if(k[0] == 'L' && k[1] == 'o' && k[2] == 'd' && k[3] == 'e' && + k[4] == 'P' && k[5] == 'N' && k[6] == 'G' && k[7] == '\0') { + already_added_id_text = 1; + break; + } + } + if(already_added_id_text == 0) { + state->error = addChunk_tEXt(&outv, "LodePNG", LODEPNG_VERSION_STRING); /*it's shorter as tEXt than as zTXt chunk*/ + if(state->error) goto cleanup; + } + } + /*iTXt*/ + for(i = 0; i != info.itext_num; ++i) { + if(lodepng_strlen(info.itext_keys[i]) > 79) { + state->error = 66; /*text chunk too large*/ + goto cleanup; + } + if(lodepng_strlen(info.itext_keys[i]) < 1) { + state->error = 67; /*text chunk too small*/ + goto cleanup; + } + state->error = addChunk_iTXt( + &outv, state->encoder.text_compression, + info.itext_keys[i], info.itext_langtags[i], info.itext_transkeys[i], info.itext_strings[i], + &state->encoder.zlibsettings); + if(state->error) goto cleanup; + } + + /*unknown chunks between IDAT and IEND*/ + if(info.unknown_chunks_data[2]) { + state->error = addUnknownChunks(&outv, info.unknown_chunks_data[2], info.unknown_chunks_size[2]); + if(state->error) goto cleanup; + } +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + state->error = addChunk_IEND(&outv); + if(state->error) goto cleanup; + } + +cleanup: + lodepng_info_cleanup(&info); + lodepng_free(data); + lodepng_color_mode_cleanup(&auto_color); + + /*instead of cleaning the vector up, give it to the output*/ + *out = outv.data; + *outsize = outv.size; + + return state->error; +} + +unsigned lodepng_encode_memory(unsigned char ** out, size_t * outsize, const unsigned char * image, + unsigned w, unsigned h, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned error; + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + state.info_png.color.colortype = colortype; + state.info_png.color.bitdepth = bitdepth; + lodepng_encode(out, outsize, image, w, h, &state); + error = state.error; + lodepng_state_cleanup(&state); + return error; +} + +unsigned lodepng_encode32(unsigned char ** out, size_t * outsize, const unsigned char * image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24(unsigned char ** out, size_t * outsize, const unsigned char * image, unsigned w, unsigned h) +{ + return lodepng_encode_memory(out, outsize, image, w, h, LCT_RGB, 8); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned lodepng_encode_file(const char * filename, const unsigned char * image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char * buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, image, w, h, colortype, bitdepth); + if(!error) error = lodepng_save_file(buffer, buffersize, filename); + lodepng_free(buffer); + return error; +} + +unsigned lodepng_encode32_file(const char * filename, const unsigned char * image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGBA, 8); +} + +unsigned lodepng_encode24_file(const char * filename, const unsigned char * image, unsigned w, unsigned h) +{ + return lodepng_encode_file(filename, image, w, h, LCT_RGB, 8); +} +#endif /*LODEPNG_COMPILE_DISK*/ + +void lodepng_encoder_settings_init(LodePNGEncoderSettings * settings) +{ + lodepng_compress_settings_init(&settings->zlibsettings); + settings->filter_palette_zero = 1; + settings->filter_strategy = LFS_MINSUM; + settings->auto_convert = 1; + settings->force_palette = 0; + settings->predefined_filters = 0; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + settings->add_id = 0; + settings->text_compression = 1; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT +/* +This returns the description of a numerical error code in English. This is also +the documentation of all the error codes. +*/ +const char * lodepng_error_text(unsigned code) +{ + switch(code) { + case 0: + return "no error, everything went ok"; + case 1: + return "nothing done yet"; /*the Encoder/Decoder has done nothing yet, error checking makes no sense yet*/ + case 10: + return "end of input memory reached without huffman end code"; /*while huffman decoding*/ + case 11: + return "error in code tree made it jump outside of huffman tree"; /*while huffman decoding*/ + case 13: + return "problem while processing dynamic deflate block"; + case 14: + return "problem while processing dynamic deflate block"; + case 15: + return "problem while processing dynamic deflate block"; + /*this error could happen if there are only 0 or 1 symbols present in the huffman code:*/ + case 16: + return "invalid code while processing dynamic deflate block"; + case 17: + return "end of out buffer memory reached while inflating"; + case 18: + return "invalid distance code while inflating"; + case 19: + return "end of out buffer memory reached while inflating"; + case 20: + return "invalid deflate block BTYPE encountered while decoding"; + case 21: + return "NLEN is not ones complement of LEN in a deflate block"; + + /*end of out buffer memory reached while inflating: + This can happen if the inflated deflate data is longer than the amount of bytes required to fill up + all the pixels of the image, given the color depth and image dimensions. Something that doesn't + happen in a normal, well encoded, PNG image.*/ + case 22: + return "end of out buffer memory reached while inflating"; + case 23: + return "end of in buffer memory reached while inflating"; + case 24: + return "invalid FCHECK in zlib header"; + case 25: + return "invalid compression method in zlib header"; + case 26: + return "FDICT encountered in zlib header while it's not used for PNG"; + case 27: + return "PNG file is smaller than a PNG header"; + /*Checks the magic file header, the first 8 bytes of the PNG file*/ + case 28: + return "incorrect PNG signature, it's no PNG or corrupted"; + case 29: + return "first chunk is not the header chunk"; + case 30: + return "chunk length too large, chunk broken off at end of file"; + case 31: + return "illegal PNG color type or bpp"; + case 32: + return "illegal PNG compression method"; + case 33: + return "illegal PNG filter method"; + case 34: + return "illegal PNG interlace method"; + case 35: + return "chunk length of a chunk is too large or the chunk too small"; + case 36: + return "illegal PNG filter type encountered"; + case 37: + return "illegal bit depth for this color type given"; + case 38: + return "the palette is too small or too big"; /*0, or more than 256 colors*/ + case 39: + return "tRNS chunk before PLTE or has more entries than palette size"; + case 40: + return "tRNS chunk has wrong size for grayscale image"; + case 41: + return "tRNS chunk has wrong size for RGB image"; + case 42: + return "tRNS chunk appeared while it was not allowed for this color type"; + case 43: + return "bKGD chunk has wrong size for palette image"; + case 44: + return "bKGD chunk has wrong size for grayscale image"; + case 45: + return "bKGD chunk has wrong size for RGB image"; + case 48: + return "empty input buffer given to decoder. Maybe caused by non-existing file?"; + case 49: + return "jumped past memory while generating dynamic huffman tree"; + case 50: + return "jumped past memory while generating dynamic huffman tree"; + case 51: + return "jumped past memory while inflating huffman block"; + case 52: + return "jumped past memory while inflating"; + case 53: + return "size of zlib data too small"; + case 54: + return "repeat symbol in tree while there was no value symbol yet"; + /*jumped past tree while generating huffman tree, this could be when the + tree will have more leaves than symbols after generating it out of the + given lengths. They call this an oversubscribed dynamic bit lengths tree in zlib.*/ + case 55: + return "jumped past tree while generating huffman tree"; + case 56: + return "given output image colortype or bitdepth not supported for color conversion"; + case 57: + return "invalid CRC encountered (checking CRC can be disabled)"; + case 58: + return "invalid ADLER32 encountered (checking ADLER32 can be disabled)"; + case 59: + return "requested color conversion not supported"; + case 60: + return "invalid window size given in the settings of the encoder (must be 0-32768)"; + case 61: + return "invalid BTYPE given in the settings of the encoder (only 0, 1 and 2 are allowed)"; + /*LodePNG leaves the choice of RGB to grayscale conversion formula to the user.*/ + case 62: + return "conversion from color to grayscale not supported"; + /*(2^31-1)*/ + case 63: + return "length of a chunk too long, max allowed for PNG is 2147483647 bytes per chunk"; + /*this would result in the inability of a deflated block to ever contain an end code. It must be at least 1.*/ + case 64: + return "the length of the END symbol 256 in the Huffman tree is 0"; + case 66: + return "the length of a text chunk keyword given to the encoder is longer than the maximum of 79 bytes"; + case 67: + return "the length of a text chunk keyword given to the encoder is smaller than the minimum of 1 byte"; + case 68: + return "tried to encode a PLTE chunk with a palette that has less than 1 or more than 256 colors"; + case 69: + return "unknown chunk type with 'critical' flag encountered by the decoder"; + case 71: + return "invalid interlace mode given to encoder (must be 0 or 1)"; + case 72: + return "while decoding, invalid compression method encountering in zTXt or iTXt chunk (it must be 0)"; + case 73: + return "invalid tIME chunk size"; + case 74: + return "invalid pHYs chunk size"; + /*length could be wrong, or data chopped off*/ + case 75: + return "no null termination char found while decoding text chunk"; + case 76: + return "iTXt chunk too short to contain required bytes"; + case 77: + return "integer overflow in buffer size"; + case 78: + return "failed to open file for reading"; /*file doesn't exist or couldn't be opened for reading*/ + case 79: + return "failed to open file for writing"; + case 80: + return "tried creating a tree of 0 symbols"; + case 81: + return "lazy matching at pos 0 is impossible"; + case 82: + return "color conversion to palette requested while a color isn't in palette, or index out of bounds"; + case 83: + return "memory allocation failed"; + case 84: + return "given image too small to contain all pixels to be encoded"; + case 86: + return "impossible offset in lz77 encoding (internal bug)"; + case 87: + return "must provide custom zlib function pointer if LODEPNG_COMPILE_ZLIB is not defined"; + case 88: + return "invalid filter strategy given for LodePNGEncoderSettings.filter_strategy"; + case 89: + return "text chunk keyword too short or long: must have size 1-79"; + /*the windowsize in the LodePNGCompressSettings. Requiring POT(==> & instead of %) makes encoding 12% faster.*/ + case 90: + return "windowsize must be a power of two"; + case 91: + return "invalid decompressed idat size"; + case 92: + return "integer overflow due to too many pixels"; + case 93: + return "zero width or height is invalid"; + case 94: + return "header chunk must have a size of 13 bytes"; + case 95: + return "integer overflow with combined idat chunk size"; + case 96: + return "invalid gAMA chunk size"; + case 97: + return "invalid cHRM chunk size"; + case 98: + return "invalid sRGB chunk size"; + case 99: + return "invalid sRGB rendering intent"; + case 100: + return "invalid ICC profile color type, the PNG specification only allows RGB or GRAY"; + case 101: + return "PNG specification does not allow RGB ICC profile on gray color types and vice versa"; + case 102: + return "not allowed to set grayscale ICC profile with colored pixels by PNG specification"; + case 103: + return "invalid palette index in bKGD chunk. Maybe it came before PLTE chunk?"; + case 104: + return "invalid bKGD color while encoding (e.g. palette index out of range)"; + case 105: + return "integer overflow of bitsize"; + case 106: + return "PNG file must have PLTE chunk if color type is palette"; + case 107: + return "color convert from palette mode requested without setting the palette data in it"; + case 108: + return "tried to add more than 256 values to a palette"; + /*this limit can be configured in LodePNGDecompressSettings*/ + case 109: + return "tried to decompress zlib or deflate data larger than desired max_output_size"; + case 110: + return "custom zlib or inflate decompression failed"; + case 111: + return "custom zlib or deflate compression failed"; + /*max text size limit can be configured in LodePNGDecoderSettings. This error prevents + unreasonable memory consumption when decoding due to impossibly large text sizes.*/ + case 112: + return "compressed text unreasonably large"; + /*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents + unreasonable memory consumption when decoding due to impossibly large ICC profile*/ + case 113: + return "ICC profile unreasonably large"; + case 114: + return "sBIT chunk has wrong size for the color type of the image"; + case 115: + return "sBIT value out of range"; + } + return "unknown error code"; +} +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* // C++ Wrapper // */ +/* ////////////////////////////////////////////////////////////////////////// */ +/* ////////////////////////////////////////////////////////////////////////// */ + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ + +#ifdef LODEPNG_COMPILE_DISK +unsigned load_file(std::vector & buffer, const std::string & filename) +{ + long size = lodepng_filesize(filename.c_str()); + if(size < 0) return 78; + buffer.resize((size_t)size); + return size == 0 ? 0 : lodepng_buffer_file(&buffer[0], (size_t)size, filename.c_str()); +} + +/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ +unsigned save_file(const std::vector & buffer, const std::string & filename) +{ + return lodepng_save_file(buffer.empty() ? 0 : &buffer[0], buffer.size(), filename.c_str()); +} +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +unsigned decompress(std::vector & out, const unsigned char * in, size_t insize, + const LodePNGDecompressSettings & settings) +{ + unsigned char * buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings); + if(buffer) { + out.insert(out.end(), buffer, &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned decompress(std::vector & out, const std::vector & in, + const LodePNGDecompressSettings & settings) +{ + return decompress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned compress(std::vector & out, const unsigned char * in, size_t insize, + const LodePNGCompressSettings & settings) +{ + unsigned char * buffer = 0; + size_t buffersize = 0; + unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); + if(buffer) { + out.insert(out.end(), buffer, &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned compress(std::vector & out, const std::vector & in, + const LodePNGCompressSettings & settings) +{ + return compress(out, in.empty() ? 0 : &in[0], in.size(), settings); +} +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ + + +#ifdef LODEPNG_COMPILE_PNG + +State::State() +{ + lodepng_state_init(this); +} + +State::State(const State & other) +{ + lodepng_state_init(this); + lodepng_state_copy(this, &other); +} + +State::~State() +{ + lodepng_state_cleanup(this); +} + +State & State::operator=(const State & other) +{ + lodepng_state_copy(this, &other); + return *this; +} + +#ifdef LODEPNG_COMPILE_DECODER + +unsigned decode(std::vector & out, unsigned & w, unsigned & h, const unsigned char * in, + size_t insize, LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char * buffer = 0; + unsigned error = lodepng_decode_memory(&buffer, &w, &h, in, insize, colortype, bitdepth); + if(buffer && !error) { + State state; + state.info_raw.colortype = colortype; + state.info_raw.bitdepth = bitdepth; + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), buffer, &buffer[buffersize]); + } + lodepng_free(buffer); + return error; +} + +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + const std::vector & in, LodePNGColorType colortype, unsigned bitdepth) +{ + return decode(out, w, h, in.empty() ? 0 : &in[0], (unsigned)in.size(), colortype, bitdepth); +} + +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + State & state, + const unsigned char * in, size_t insize) +{ + unsigned char * buffer = NULL; + unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); + if(buffer && !error) { + size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); + out.insert(out.end(), buffer, &buffer[buffersize]); + } + lodepng_free(buffer); + return error; +} + +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + State & state, + const std::vector & in) +{ + return decode(out, w, h, state, in.empty() ? 0 : &in[0], in.size()); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned decode(std::vector & out, unsigned & w, unsigned & h, const std::string & filename, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + /* safe output values in case error happens */ + w = h = 0; + unsigned error = load_file(buffer, filename); + if(error) return error; + return decode(out, w, h, buffer, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DECODER */ +#endif /* LODEPNG_COMPILE_DISK */ + +#ifdef LODEPNG_COMPILE_ENCODER +unsigned encode(std::vector & out, const unsigned char * in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + unsigned char * buffer; + size_t buffersize; + unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); + if(buffer) { + out.insert(out.end(), buffer, &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector & out, + const std::vector & in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} + +unsigned encode(std::vector & out, + const unsigned char * in, unsigned w, unsigned h, + State & state) +{ + unsigned char * buffer; + size_t buffersize; + unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); + if(buffer) { + out.insert(out.end(), buffer, &buffer[buffersize]); + lodepng_free(buffer); + } + return error; +} + +unsigned encode(std::vector & out, + const std::vector & in, unsigned w, unsigned h, + State & state) +{ + if(lodepng_get_raw_size(w, h, &state.info_raw) > in.size()) return 84; + return encode(out, in.empty() ? 0 : &in[0], w, h, state); +} + +#ifdef LODEPNG_COMPILE_DISK +unsigned encode(const std::string & filename, + const unsigned char * in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + std::vector buffer; + unsigned error = encode(buffer, in, w, h, colortype, bitdepth); + if(!error) error = save_file(buffer, filename); + return error; +} + +unsigned encode(const std::string & filename, + const std::vector & in, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth) +{ + if(lodepng_get_raw_size_lct(w, h, colortype, bitdepth) > in.size()) return 84; + return encode(filename, in.empty() ? 0 : &in[0], w, h, colortype, bitdepth); +} +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_PNG */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ + +#endif /*LV_USE_LODEPNG*/ diff --git a/inc/lvgl/src/libs/lodepng/lodepng.h b/inc/lvgl/src/libs/lodepng/lodepng.h new file mode 100644 index 0000000..b620b5c --- /dev/null +++ b/inc/lvgl/src/libs/lodepng/lodepng.h @@ -0,0 +1,2105 @@ +/* +LodePNG version 20230410 + +Copyright (c) 2005-2023 Lode Vandevenne + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. +*/ + +#ifndef LODEPNG_H +#define LODEPNG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../../lvgl.h" +#if LV_USE_LODEPNG +#include LV_STDDEF_INCLUDE /*for size_t*/ +LV_ATTRIBUTE_EXTERN_DATA extern const char * LODEPNG_VERSION_STRING; + +/* +The following #defines are used to create code sections. They can be disabled +to disable code sections, which can give faster compile time and smaller binary. +The "NO_COMPILE" defines are designed to be used to pass as defines to the +compiler command to disable them without modifying this header, e.g. +-DLODEPNG_NO_COMPILE_ZLIB for gcc or clang. +*/ +/*deflate & zlib. If disabled, you must specify alternative zlib functions in +the custom_zlib field of the compress and decompress settings*/ +#ifndef LODEPNG_NO_COMPILE_ZLIB + /*pass -DLODEPNG_NO_COMPILE_ZLIB to the compiler to disable this, or comment out LODEPNG_COMPILE_ZLIB below*/ + #define LODEPNG_COMPILE_ZLIB +#endif + +/*png encoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_PNG + /*pass -DLODEPNG_NO_COMPILE_PNG to the compiler to disable this, or comment out LODEPNG_COMPILE_PNG below*/ + #define LODEPNG_COMPILE_PNG +#endif + +/*deflate&zlib decoder and png decoder*/ +#ifndef LODEPNG_NO_COMPILE_DECODER + /*pass -DLODEPNG_NO_COMPILE_DECODER to the compiler to disable this, or comment out LODEPNG_COMPILE_DECODER below*/ + #define LODEPNG_COMPILE_DECODER +#endif + +/*deflate&zlib encoder and png encoder*/ +#ifndef LODEPNG_NO_COMPILE_ENCODER + /*pass -DLODEPNG_NO_COMPILE_ENCODER to the compiler to disable this, or comment out LODEPNG_COMPILE_ENCODER below*/ + #define LODEPNG_COMPILE_ENCODER +#endif + +/*the optional built in harddisk file loading and saving functions*/ +#ifndef LODEPNG_NO_COMPILE_DISK + /*pass -DLODEPNG_NO_COMPILE_DISK to the compiler to disable this, or comment out LODEPNG_COMPILE_DISK below*/ + #define LODEPNG_COMPILE_DISK +#endif + +/*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ +#ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS + /*pass -DLODEPNG_NO_COMPILE_ANCILLARY_CHUNKS to the compiler to disable this, + or comment out LODEPNG_COMPILE_ANCILLARY_CHUNKS below*/ + #define LODEPNG_COMPILE_ANCILLARY_CHUNKS +#endif + +/*ability to convert error numerical codes to English text string*/ +#ifndef LODEPNG_NO_COMPILE_ERROR_TEXT + /*pass -DLODEPNG_NO_COMPILE_ERROR_TEXT to the compiler to disable this, + or comment out LODEPNG_COMPILE_ERROR_TEXT below*/ + #define LODEPNG_COMPILE_ERROR_TEXT +#endif + +/*Compile the default allocators (C's free, malloc and realloc). If you disable this, +you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your +source files with custom allocators.*/ +#ifndef LODEPNG_NO_COMPILE_ALLOCATORS + /*pass -DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler to disable the built-in ones, + or comment out LODEPNG_COMPILE_ALLOCATORS below*/ + #define LODEPNG_COMPILE_ALLOCATORS +#endif + +/*Disable built-in CRC function, in that case a custom implementation of +lodepng_crc32 must be defined externally so that it can be linked in. +The default built-in CRC code comes with 8KB of lookup tables, so for memory constrained environment you may want it +disabled and provide a much smaller implementation externally as said above. You can find such an example implementation +in a comment in the lodepng.c(pp) file in the 'else' case of the searchable LODEPNG_COMPILE_CRC section.*/ +#ifndef LODEPNG_NO_COMPILE_CRC + /*pass -DLODEPNG_NO_COMPILE_CRC to the compiler to disable the built-in one, + or comment out LODEPNG_COMPILE_CRC below*/ + #define LODEPNG_COMPILE_CRC +#endif + +/*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ +#ifdef __cplusplus + #ifndef LODEPNG_NO_COMPILE_CPP + /*pass -DLODEPNG_NO_COMPILE_CPP to the compiler to disable C++ (not needed if a C-only compiler), + or comment out LODEPNG_COMPILE_CPP below*/ + #define LODEPNG_COMPILE_CPP + #endif +#endif + +#ifdef LODEPNG_COMPILE_CPP + #include + #include +#endif /*LODEPNG_COMPILE_CPP*/ + +#ifdef LODEPNG_COMPILE_PNG +/*The PNG color types (also used for raw image).*/ +typedef enum LodePNGColorType { + LCT_GREY = 0, /*grayscale: 1,2,4,8,16 bit*/ + LCT_RGB = 2, /*RGB: 8,16 bit*/ + LCT_PALETTE = 3, /*palette: 1,2,4,8 bit*/ + LCT_GREY_ALPHA = 4, /*grayscale with alpha: 8,16 bit*/ + LCT_RGBA = 6, /*RGB with alpha: 8,16 bit*/ + /*LCT_MAX_OCTET_VALUE lets the compiler allow this enum to represent any invalid + byte value from 0 to 255 that could be present in an invalid PNG file header. Do + not use, compare with or set the name LCT_MAX_OCTET_VALUE, instead either use + the valid color type names above, or numeric values like 1 or 7 when checking for + particular disallowed color type byte values, or cast to integer to print it.*/ + LCT_MAX_OCTET_VALUE = 255 +} LodePNGColorType; + +#ifdef LODEPNG_COMPILE_DECODER +/* +Converts PNG data in memory to raw pixel data. +out: Output parameter. Pointer to buffer that will contain the raw pixel data. + After decoding, its size is w * h * (bytes per pixel) bytes larger than + initially. Bytes per pixel depends on colortype and bitdepth. + Must be freed after usage with free(*out). + Note: for 16-bit per channel colors, uses big endian format like PNG does. +w: Output parameter. Pointer to width of pixel data. +h: Output parameter. Pointer to height of pixel data. +in: Memory buffer with the PNG file. +insize: size of the in buffer. +colortype: the desired color type for the raw output image. See explanation on PNG color types. +bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_decode_memory(unsigned char ** out, unsigned * w, unsigned * h, + const unsigned char * in, size_t insize, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ +unsigned lodepng_decode32(unsigned char ** out, unsigned * w, unsigned * h, + const unsigned char * in, size_t insize); + +/*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ +unsigned lodepng_decode24(unsigned char ** out, unsigned * w, unsigned * h, + const unsigned char * in, size_t insize); + +#ifdef LODEPNG_COMPILE_DISK +/* +Load PNG from disk, from file with given name. +Same as the other decode functions, but instead takes a filename as input. + +NOTE: Wide-character filenames are not supported, you can use an external method +to handle such files and decode in-memory.*/ +unsigned lodepng_decode_file(unsigned char ** out, unsigned * w, unsigned * h, + const char * filename, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image. + +NOTE: Wide-character filenames are not supported, you can use an external method +to handle such files and decode in-memory.*/ +unsigned lodepng_decode32_file(unsigned char ** out, unsigned * w, unsigned * h, + const char * filename); + +/*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image. + +NOTE: Wide-character filenames are not supported, you can use an external method +to handle such files and decode in-memory.*/ +unsigned lodepng_decode24_file(unsigned char ** out, unsigned * w, unsigned * h, + const char * filename); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_DECODER*/ + + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Converts raw pixel data into a PNG image in memory. The colortype and bitdepth + of the output PNG image cannot be chosen, they are automatically determined + by the colortype, bitdepth and content of the input pixel data. + Note: for 16-bit per channel colors, needs big endian format like PNG does. +out: Output parameter. Pointer to buffer that will contain the PNG image data. + Must be freed after usage with free(*out). +outsize: Output parameter. Pointer to the size in bytes of the out buffer. +image: The raw pixel data to encode. The size of this buffer should be + w * h * (bytes per pixel), bytes per pixel depends on colortype and bitdepth. +w: width of the raw pixel data in pixels. +h: height of the raw pixel data in pixels. +colortype: the color type of the raw input image. See explanation on PNG color types. +bitdepth: the bit depth of the raw input image. See explanation on PNG color types. +Return value: LodePNG error code (0 means no error). +*/ +unsigned lodepng_encode_memory(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ +unsigned lodepng_encode32(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h); + +/*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ +unsigned lodepng_encode24(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DISK +/* +Converts raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. + +NOTE: This overwrites existing files without warning! + +NOTE: Wide-character filenames are not supported, you can use an external method +to handle such files and encode in-memory.*/ +unsigned lodepng_encode_file(const char * filename, + const unsigned char * image, unsigned w, unsigned h, + LodePNGColorType colortype, unsigned bitdepth); + +/*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image. + +NOTE: Wide-character filenames are not supported, you can use an external method +to handle such files and encode in-memory.*/ +unsigned lodepng_encode32_file(const char * filename, + const unsigned char * image, unsigned w, unsigned h); + +/*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image. + +NOTE: Wide-character filenames are not supported, you can use an external method +to handle such files and encode in-memory.*/ +unsigned lodepng_encode24_file(const char * filename, + const unsigned char * image, unsigned w, unsigned h); +#endif /*LODEPNG_COMPILE_DISK*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#ifdef LODEPNG_COMPILE_CPP +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_DECODER +/*Same as lodepng_decode_memory, but decodes to an std::vector. The colortype +is the format to output the pixels to. Default is RGBA 8-bit per channel.*/ +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + const unsigned char * in, size_t insize, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + const std::vector & in, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts PNG file from disk to raw pixel data in memory. +Same as the other decode functions, but instead takes a filename as input. + +NOTE: Wide-character filenames are not supported, you can use an external method +to handle such files and decode in-memory. +*/ +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + const std::string & filename, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/*Same as lodepng_encode_memory, but encodes to an std::vector. colortype +is that of the raw input data. The output PNG color type will be auto chosen.*/ +unsigned encode(std::vector & out, + const unsigned char * in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(std::vector & out, + const std::vector & in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#ifdef LODEPNG_COMPILE_DISK +/* +Converts 32-bit RGBA raw pixel data into a PNG file on disk. +Same as the other encode functions, but instead takes a filename as output. + +NOTE: This overwrites existing files without warning! + +NOTE: Wide-character filenames are not supported, you can use an external method +to handle such files and decode in-memory. +*/ +unsigned encode(const std::string & filename, + const unsigned char * in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +unsigned encode(const std::string & filename, + const std::vector & in, unsigned w, unsigned h, + LodePNGColorType colortype = LCT_RGBA, unsigned bitdepth = 8); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_ENCODER */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ +#endif /*LODEPNG_COMPILE_PNG*/ + +#ifdef LODEPNG_COMPILE_ERROR_TEXT + /*Returns an English description of the numerical error code.*/ + const char * lodepng_error_text(unsigned code); +#endif /*LODEPNG_COMPILE_ERROR_TEXT*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Settings for zlib decompression*/ +typedef struct LodePNGDecompressSettings LodePNGDecompressSettings; +struct LodePNGDecompressSettings { + /* Check LodePNGDecoderSettings for more ignorable errors such as ignore_crc */ + unsigned ignore_adler32; /*if 1, continue and don't give an error message if the Adler32 checksum is corrupted*/ + unsigned ignore_nlen; /*ignore complement of len checksum in uncompressed blocks*/ + + /*Maximum decompressed size, beyond this the decoder may (and is encouraged to) stop decoding, + return an error, output a data size > max_output_size and all the data up to that point. This is + neither a hard limit nor a guarantee, but can prevent excessive memory usage. This setting is + ignored by the PNG decoder, but is used by the deflate/zlib decoder and can be used by custom ones. + Set to 0 to impose no limit (the default).*/ + size_t max_output_size; + + /*use custom zlib decoder instead of built in one (default: null). + Should return 0 if success, any non-0 if error (numeric value not exposed).*/ + unsigned(*custom_zlib)(unsigned char **, size_t *, + const unsigned char *, size_t, + const LodePNGDecompressSettings *); + /*use custom deflate decoder instead of built in one (default: null) + if custom_zlib is not null, custom_inflate is ignored (the zlib format uses deflate). + Should return 0 if success, any non-0 if error (numeric value not exposed).*/ + unsigned(*custom_inflate)(unsigned char **, size_t *, + const unsigned char *, size_t, + const LodePNGDecompressSettings *); + + const void * custom_context; /*optional custom settings for custom functions*/ +}; + +LV_ATTRIBUTE_EXTERN_DATA extern const LodePNGDecompressSettings lodepng_default_decompress_settings; +void lodepng_decompress_settings_init(LodePNGDecompressSettings * settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Settings for zlib compression. Tweaking these settings tweaks the balance +between speed and compression ratio. +*/ +typedef struct LodePNGCompressSettings LodePNGCompressSettings; +struct LodePNGCompressSettings { /*deflate = compress*/ + /*LZ77 related settings*/ + unsigned btype; /*the block type for LZ (0, 1, 2 or 3, see zlib standard). Should be 2 for proper compression.*/ + unsigned use_lz77; /*whether or not to use LZ77. Should be 1 for proper compression.*/ + unsigned windowsize; /*must be a power of two <= 32768. higher compresses more but is slower. Default value: 2048.*/ + unsigned minmatch; /*minimum lz77 length. 3 is normally best, 6 can be better for some PNGs. Default: 0*/ + unsigned nicematch; /*stop searching if >= this length found. Set to 258 for best compression. Default: 128*/ + unsigned lazymatching; /*use lazy matching: better compression but a bit slower. Default: true*/ + + /*use custom zlib encoder instead of built in one (default: null)*/ + unsigned(*custom_zlib)(unsigned char **, size_t *, + const unsigned char *, size_t, + const LodePNGCompressSettings *); + /*use custom deflate encoder instead of built in one (default: null) + if custom_zlib is used, custom_deflate is ignored since only the built in + zlib function will call custom_deflate*/ + unsigned(*custom_deflate)(unsigned char **, size_t *, + const unsigned char *, size_t, + const LodePNGCompressSettings *); + + const void * custom_context; /*optional custom settings for custom functions*/ +}; + +LV_ATTRIBUTE_EXTERN_DATA extern const LodePNGCompressSettings lodepng_default_compress_settings; +void lodepng_compress_settings_init(LodePNGCompressSettings * settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_PNG +/* +Color mode of an image. Contains all information required to decode the pixel +bits to RGBA colors. This information is the same as used in the PNG file +format, and is used both for PNG and raw image data in LodePNG. +*/ +typedef struct LodePNGColorMode { + /*header (IHDR)*/ + LodePNGColorType colortype; /*color type, see PNG standard or documentation further in this header file*/ + unsigned bitdepth; /*bits per sample, see PNG standard or documentation further in this header file*/ + + /* + palette (PLTE and tRNS) + + Dynamically allocated with the colors of the palette, including alpha. + This field may not be allocated directly, use lodepng_color_mode_init first, + then lodepng_palette_add per color to correctly initialize it (to ensure size + of exactly 1024 bytes). + + The alpha channels must be set as well, set them to 255 for opaque images. + + When decoding, with the default settings you can ignore this palette, since + LodePNG already fills the palette colors in the pixels of the raw RGBA output, + but when decoding to the original PNG color mode it is needed to reconstruct + the colors. + + The palette is only supported for color type 3. + */ + unsigned char * palette; /*palette in RGBARGBA... order. Must be either 0, or when allocated must have 1024 bytes*/ + size_t palettesize; /*palette size in number of colors (amount of used bytes is 4 * palettesize)*/ + + /* + transparent color key (tRNS) + + This color uses the same bit depth as the bitdepth value in this struct, which can be 1-bit to 16-bit. + For grayscale PNGs, r, g and b will all 3 be set to the same. + + When decoding, by default you can ignore this information, since LodePNG sets + pixels with this key to transparent already in the raw RGBA output. + + The color key is only supported for color types 0 and 2. + */ + unsigned key_defined; /*is a transparent color key given? 0 = false, 1 = true*/ + unsigned key_r; /*red/grayscale component of color key*/ + unsigned key_g; /*green component of color key*/ + unsigned key_b; /*blue component of color key*/ +} LodePNGColorMode; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_color_mode_init(LodePNGColorMode * info); +void lodepng_color_mode_cleanup(LodePNGColorMode * info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_color_mode_copy(LodePNGColorMode * dest, const LodePNGColorMode * source); +/* Makes a temporary LodePNGColorMode that does not need cleanup (no palette) */ +LodePNGColorMode lodepng_color_mode_make(LodePNGColorType colortype, unsigned bitdepth); + +void lodepng_palette_clear(LodePNGColorMode * info); +/*add 1 color to the palette*/ +unsigned lodepng_palette_add(LodePNGColorMode * info, + unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +/*get the total amount of bits per pixel, based on colortype and bitdepth in the struct*/ +unsigned lodepng_get_bpp(const LodePNGColorMode * info); +/*get the amount of color channels used, based on colortype in the struct. +If a palette is used, it counts as 1 channel.*/ +unsigned lodepng_get_channels(const LodePNGColorMode * info); +/*is it a grayscale type? (only colortype 0 or 4)*/ +unsigned lodepng_is_greyscale_type(const LodePNGColorMode * info); +/*has it got an alpha channel? (only colortype 2 or 6)*/ +unsigned lodepng_is_alpha_type(const LodePNGColorMode * info); +/*has it got a palette? (only colortype 3)*/ +unsigned lodepng_is_palette_type(const LodePNGColorMode * info); +/*only returns true if there is a palette and there is a value in the palette with alpha < 255. +Loops through the palette to check this.*/ +unsigned lodepng_has_palette_alpha(const LodePNGColorMode * info); +/* +Check if the given color info indicates the possibility of having non-opaque pixels in the PNG image. +Returns true if the image can have translucent or invisible pixels (it still be opaque if it doesn't use such pixels). +Returns false if the image can only have opaque pixels. +In detail, it returns true only if it's a color type with alpha, or has a palette with non-opaque values, +or if "key_defined" is true. +*/ +unsigned lodepng_can_have_alpha(const LodePNGColorMode * info); +/*Returns the byte size of a raw image buffer with given width, height and color mode*/ +size_t lodepng_get_raw_size(unsigned w, unsigned h, const LodePNGColorMode * color); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +/*The information of a Time chunk in PNG.*/ +typedef struct LodePNGTime { + unsigned year; /*2 bytes used (0-65535)*/ + unsigned month; /*1-12*/ + unsigned day; /*1-31*/ + unsigned hour; /*0-23*/ + unsigned minute; /*0-59*/ + unsigned second; /*0-60 (to allow for leap seconds)*/ +} LodePNGTime; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/*Information about the PNG image, except pixels, width and height.*/ +typedef struct LodePNGInfo { + /*header (IHDR), palette (PLTE) and transparency (tRNS) chunks*/ + unsigned compression_method;/*compression method of the original file. Always 0.*/ + unsigned filter_method; /*filter method of the original file*/ + unsigned interlace_method; /*interlace method of the original file: 0=none, 1=Adam7*/ + LodePNGColorMode color; /*color type and bits, palette and transparency of the PNG file*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /* + Suggested background color chunk (bKGD) + + This uses the same color mode and bit depth as the PNG (except no alpha channel), + with values truncated to the bit depth in the unsigned integer. + + For grayscale and palette PNGs, the value is stored in background_r. The values + in background_g and background_b are then unused. The decoder will set them + equal to background_r, the encoder ignores them in this case. + + When decoding, you may get these in a different color mode than the one you requested + for the raw pixels: the colortype and bitdepth defined by info_png.color, that is the + ones defined in the header of the PNG image, are used. + + When encoding with auto_convert, you must use the color model defined in info_png.color for + these values. The encoder normally ignores info_png.color when auto_convert is on, but will + use it to interpret these values (and convert copies of them to its chosen color model). + + When encoding, avoid setting this to an expensive color, such as a non-gray value + when the image is gray, or the compression will be worse since it will be forced to + write the PNG with a more expensive color mode (when auto_convert is on). + + The decoder does not use this background color to edit the color of pixels. This is a + completely optional metadata feature. + */ + unsigned background_defined; /*is a suggested background color given?*/ + unsigned background_r; /*red/gray/palette component of suggested background color*/ + unsigned background_g; /*green component of suggested background color*/ + unsigned background_b; /*blue component of suggested background color*/ + + /* + Non-international text chunks (tEXt and zTXt) + + The char** arrays each contain num strings. The actual messages are in + text_strings, while text_keys are keywords that give a short description what + the actual text represents, e.g. Title, Author, Description, or anything else. + + All the string fields below including strings, keys, names and language tags are null terminated. + The PNG specification uses null characters for the keys, names and tags, and forbids null + characters to appear in the main text which is why we can use null termination everywhere here. + + A keyword is minimum 1 character and maximum 79 characters long (plus the + additional null terminator). It's discouraged to use a single line length + longer than 79 characters for texts. + + Don't allocate these text buffers yourself. Use the init/cleanup functions + correctly and use lodepng_add_text and lodepng_clear_text. + + Standard text chunk keywords and strings are encoded using Latin-1. + */ + size_t text_num; /*the amount of texts in these char** buffers (there may be more texts in itext)*/ + char ** text_keys; /*the keyword of a text chunk (e.g. "Comment")*/ + char ** text_strings; /*the actual text*/ + + /* + International text chunks (iTXt) + Similar to the non-international text chunks, but with additional strings + "langtags" and "transkeys", and the following text encodings are used: + keys: Latin-1, langtags: ASCII, transkeys and strings: UTF-8. + keys must be 1-79 characters (plus the additional null terminator), the other + strings are any length. + */ + size_t itext_num; /*the amount of international texts in this PNG*/ + char ** itext_keys; /*the English keyword of the text chunk (e.g. "Comment")*/ + char ** itext_langtags; /*language tag for this text's language, ISO/IEC 646 string, e.g. ISO 639 language tag*/ + char ** itext_transkeys; /*keyword translated to the international language - UTF-8 string*/ + char ** itext_strings; /*the actual international text - UTF-8 string*/ + + /*time chunk (tIME)*/ + unsigned time_defined; /*set to 1 to make the encoder generate a tIME chunk*/ + LodePNGTime time; + + /*phys chunk (pHYs)*/ + unsigned phys_defined; /*if 0, there is no pHYs chunk and the values below are undefined, if 1 else there is one*/ + unsigned phys_x; /*pixels per unit in x direction*/ + unsigned phys_y; /*pixels per unit in y direction*/ + unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ + + /* + Color profile related chunks: gAMA, cHRM, sRGB, iCPP, sBIT + + LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color + profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please + use these values with a color management library. + + See the PNG, ICC and sRGB specifications for more information about the meaning of these values. + */ + + /* gAMA chunk: optional, overridden by sRGB or iCCP if those are present. */ + unsigned gama_defined; /* Whether a gAMA chunk is present (0 = not present, 1 = present). */ + unsigned gama_gamma; /* Gamma exponent times 100000 */ + + /* cHRM chunk: optional, overridden by sRGB or iCCP if those are present. */ + unsigned chrm_defined; /* Whether a cHRM chunk is present (0 = not present, 1 = present). */ + unsigned chrm_white_x; /* White Point x times 100000 */ + unsigned chrm_white_y; /* White Point y times 100000 */ + unsigned chrm_red_x; /* Red x times 100000 */ + unsigned chrm_red_y; /* Red y times 100000 */ + unsigned chrm_green_x; /* Green x times 100000 */ + unsigned chrm_green_y; /* Green y times 100000 */ + unsigned chrm_blue_x; /* Blue x times 100000 */ + unsigned chrm_blue_y; /* Blue y times 100000 */ + + /* + sRGB chunk: optional. May not appear at the same time as iCCP. + If gAMA is also present gAMA must contain value 45455. + If cHRM is also present cHRM must contain respectively 31270,32900,64000,33000,30000,60000,15000,6000. + */ + unsigned srgb_defined; /* Whether an sRGB chunk is present (0 = not present, 1 = present). */ + unsigned srgb_intent; /* Rendering intent: 0=perceptual, 1=rel. colorimetric, 2=saturation, 3=abs. colorimetric */ + + /* + iCCP chunk: optional. May not appear at the same time as sRGB. + + LodePNG does not parse or use the ICC profile (except its color space header field for an edge case), a + separate library to handle the ICC data (not included in LodePNG) format is needed to use it for color + management and conversions. + + For encoding, if iCCP is present, gAMA and cHRM are recommended to be added as well with values that match the ICC + profile as closely as possible, if you wish to do this you should provide the correct values for gAMA and cHRM and + enable their '_defined' flags since LodePNG will not automatically compute them from the ICC profile. + + For encoding, the ICC profile is required by the PNG specification to be an "RGB" profile for non-gray + PNG color types and a "GRAY" profile for gray PNG color types. If you disable auto_convert, you must ensure + the ICC profile type matches your requested color type, else the encoder gives an error. If auto_convert is + enabled (the default), and the ICC profile is not a good match for the pixel data, this will result in an encoder + error if the pixel data has non-gray pixels for a GRAY profile, or a silent less-optimal compression of the pixel + data if the pixels could be encoded as grayscale but the ICC profile is RGB. + + To avoid this do not set an ICC profile in the image unless there is a good reason for it, and when doing so + make sure you compute it carefully to avoid the above problems. + */ + unsigned iccp_defined; /* Whether an iCCP chunk is present (0 = not present, 1 = present). */ + char * iccp_name; /* Null terminated string with profile name, 1-79 bytes */ + /* + The ICC profile in iccp_profile_size bytes. + Don't allocate this buffer yourself. Use the init/cleanup functions + correctly and use lodepng_set_icc and lodepng_clear_icc. + */ + unsigned char * iccp_profile; + unsigned iccp_profile_size; /* The size of iccp_profile in bytes */ + + /* + sBIT chunk: significant bits. Optional metadata, only set this if needed. + + If defined, these values give the bit depth of the original data. Since PNG only stores 1, 2, 4, 8 or 16-bit + per channel data, the significant bits value can be used to indicate the original encoded data has another + sample depth, such as 10 or 12. + + Encoders using this value, when storing the pixel data, should use the most significant bits + of the data to store the original bits, and use a good sample depth scaling method such as + "left bit replication" to fill in the least significant bits, rather than fill zeroes. + + Decoders using this value, if able to work with data that's e.g. 10-bit or 12-bit, should right + shift the data to go back to the original bit depth, but decoders are also allowed to ignore + sbit and work e.g. with the 8-bit or 16-bit data from the PNG directly, since thanks + to the encoder contract, the values encoded in PNG are in valid range for the PNG bit depth. + + For grayscale images, sbit_g and sbit_b are not used, and for images that don't use color + type RGBA or grayscale+alpha, sbit_a is not used (it's not used even for palette images with + translucent palette values, or images with color key). The values that are used must be + greater than zero and smaller than or equal to the PNG bit depth. + + The color type from the header in the PNG image defines these used and unused fields: if + decoding with a color mode conversion, such as always decoding to RGBA, this metadata still + only uses the color type of the original PNG, and may e.g. lack the alpha channel info + if the PNG was RGB. When encoding with auto_convert (as well as without), also always the + color model defined in info_png.color determines this. + + NOTE: enabling sbit can hurt compression, because the encoder can then not always use + auto_convert to choose a more optimal color mode for the data, because the PNG format has + strict requirements for the allowed sbit values in combination with color modes. + For example, setting these fields to 10-bit will force the encoder to keep using a 16-bit per channel + color mode, even if the pixel data would in fact fit in a more efficient 8-bit mode. + */ + unsigned sbit_defined; /*is significant bits given? if not, the values below are unused*/ + unsigned sbit_r; /*red or gray component of significant bits*/ + unsigned sbit_g; /*green component of significant bits*/ + unsigned sbit_b; /*blue component of significant bits*/ + unsigned sbit_a; /*alpha component of significant bits*/ + + /* End of color profile related chunks */ + + + /* + unknown chunks: chunks not known by LodePNG, passed on byte for byte. + + There are 3 buffers, one for each position in the PNG where unknown chunks can appear. + Each buffer contains all unknown chunks for that position consecutively. + The 3 positions are: + 0: between IHDR and PLTE, 1: between PLTE and IDAT, 2: between IDAT and IEND. + + For encoding, do not store critical chunks or known chunks that are enabled with a "_defined" flag + above in here, since the encoder will blindly follow this and could then encode an invalid PNG file + (such as one with two IHDR chunks or the disallowed combination of sRGB with iCCP). But do use + this if you wish to store an ancillary chunk that is not supported by LodePNG (such as sPLT or hIST), + or any non-standard PNG chunk. + + Do not allocate or traverse this data yourself. Use the chunk traversing functions declared + later, such as lodepng_chunk_next and lodepng_chunk_append, to read/write this struct. + */ + unsigned char * unknown_chunks_data[3]; + size_t unknown_chunks_size[3]; /*size in bytes of the unknown chunks, given for protection*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGInfo; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_info_init(LodePNGInfo * info); +void lodepng_info_cleanup(LodePNGInfo * info); +/*return value is error code (0 means no error)*/ +unsigned lodepng_info_copy(LodePNGInfo * dest, const LodePNGInfo * source); + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS +unsigned lodepng_add_text(LodePNGInfo * info, const char * key, const char * str); /*push back both texts at once*/ +void lodepng_clear_text(LodePNGInfo * info); /*use this to clear the texts again after you filled them in*/ + +unsigned lodepng_add_itext(LodePNGInfo * info, const char * key, const char * langtag, + const char * transkey, const char * str); /*push back the 4 texts of 1 chunk at once*/ +void lodepng_clear_itext(LodePNGInfo * info); /*use this to clear the itexts again after you filled them in*/ + +/*replaces if exists*/ +unsigned lodepng_set_icc(LodePNGInfo * info, const char * name, const unsigned char * profile, unsigned profile_size); +void lodepng_clear_icc(LodePNGInfo * info); /*use this to clear the texts again after you filled them in*/ +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ + +/* +Converts raw buffer from one color type to another color type, based on +LodePNGColorMode structs to describe the input and output color type. +See the reference manual at the end of this header file to see which color conversions are supported. +return value = LodePNG error code (0 if all went ok, an error if the conversion isn't supported) +The out buffer must have size (w * h * bpp + 7) / 8, where bpp is the bits per pixel +of the output color type (lodepng_get_bpp). +For < 8 bpp images, there should not be padding bits at the end of scanlines. +For 16-bit per channel colors, uses big endian format like PNG does. +Return value is LodePNG error code +*/ +unsigned lodepng_convert(unsigned char * out, const unsigned char * in, + const LodePNGColorMode * mode_out, const LodePNGColorMode * mode_in, + unsigned w, unsigned h); + +#ifdef LODEPNG_COMPILE_DECODER +/* +Settings for the decoder. This contains settings for the PNG and the Zlib +decoder, but not the Info settings from the Info structs. +*/ +typedef struct LodePNGDecoderSettings { + LodePNGDecompressSettings zlibsettings; /*in here is the setting to ignore Adler32 checksums*/ + + /* Check LodePNGDecompressSettings for more ignorable errors such as ignore_adler32 */ + unsigned ignore_crc; /*ignore CRC checksums*/ + unsigned ignore_critical; /*ignore unknown critical chunks*/ + unsigned ignore_end; /*ignore issues at end of file if possible (missing IEND chunk, too large chunk, ...)*/ + /* TODO: make a system involving warnings with levels and a strict mode instead. Other potentially recoverable + errors: srgb rendering intent value, size of content of ancillary chunks, more than 79 characters for some + strings, placement/combination rules for ancillary chunks, crc of unknown chunks, allowed characters + in string keys, etc... */ + + unsigned color_convert; /*whether to convert the PNG to the color type you want. Default: yes*/ + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + unsigned read_text_chunks; /*if false but remember_unknown_chunks is true, they're stored in the unknown chunks*/ + + /*store all bytes from unknown chunks in the LodePNGInfo (off by default, useful for a png editor)*/ + unsigned remember_unknown_chunks; + + /* maximum size for decompressed text chunks. If a text chunk's text is larger than this, an error is returned, + unless reading text chunks is disabled or this limit is set higher or disabled. Set to 0 to allow any size. + By default it is a value that prevents unreasonably large strings from hogging memory. */ + size_t max_text_size; + + /* maximum size for compressed ICC chunks. If the ICC profile is larger than this, an error will be returned. Set to + 0 to allow any size. By default this is a value that prevents ICC profiles that would be much larger than any + legitimate profile could be to hog memory. */ + size_t max_icc_size; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGDecoderSettings; + +void lodepng_decoder_settings_init(LodePNGDecoderSettings * settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/*automatically use color type with less bits per pixel if losslessly possible. Default: AUTO*/ +typedef enum LodePNGFilterStrategy { + /*every filter at zero*/ + LFS_ZERO = 0, + /*every filter at 1, 2, 3 or 4 (paeth), unlike LFS_ZERO not a good choice, but for testing*/ + LFS_ONE = 1, + LFS_TWO = 2, + LFS_THREE = 3, + LFS_FOUR = 4, + /*Use filter that gives minimum sum, as described in the official PNG filter heuristic.*/ + LFS_MINSUM, + /*Use the filter type that gives smallest Shannon entropy for this scanline. Depending + on the image, this is better or worse than minsum.*/ + LFS_ENTROPY, + /* + Brute-force-search PNG filters by compressing each filter for each scanline. + Experimental, very slow, and only rarely gives better compression than MINSUM. + */ + LFS_BRUTE_FORCE, + /*use predefined_filters buffer: you specify the filter type for each scanline*/ + LFS_PREDEFINED +} LodePNGFilterStrategy; + +/*Gives characteristics about the integer RGBA colors of the image (count, alpha channel usage, bit depth, ...), +which helps decide which color model to use for encoding. +Used internally by default if "auto_convert" is enabled. Public because it's useful for custom algorithms.*/ +typedef struct LodePNGColorStats { + unsigned colored; /*not grayscale*/ + unsigned key; /*image is not opaque and color key is possible instead of full alpha*/ + unsigned short key_r; /*key values, always as 16-bit, in 8-bit case the byte is duplicated, e.g. 65535 means 255*/ + unsigned short key_g; + unsigned short key_b; + unsigned alpha; /*image is not opaque and alpha channel or alpha palette required*/ + unsigned numcolors; /*amount of colors, up to 257. Not valid if bits == 16 or allow_palette is disabled.*/ + unsigned char + palette[1024]; /*Remembers up to the first 256 RGBA colors, in no particular order, only valid when numcolors is valid*/ + unsigned bits; /*bits per channel (not for palette). 1,2 or 4 for grayscale only. 16 if 16-bit per channel required.*/ + size_t numpixels; + + /*user settings for computing/using the stats*/ + unsigned allow_palette; /*default 1. if 0, disallow choosing palette colortype in auto_choose_color, and don't count numcolors*/ + unsigned allow_greyscale; /*default 1. if 0, choose RGB or RGBA even if the image only has gray colors*/ +} LodePNGColorStats; + +void lodepng_color_stats_init(LodePNGColorStats * stats); + +/*Get a LodePNGColorStats of the image. The stats must already have been inited. +Returns error code (e.g. alloc fail) or 0 if ok.*/ +unsigned lodepng_compute_color_stats(LodePNGColorStats * stats, + const unsigned char * image, unsigned w, unsigned h, + const LodePNGColorMode * mode_in); + +/*Settings for the encoder.*/ +typedef struct LodePNGEncoderSettings { + LodePNGCompressSettings zlibsettings; /*settings for the zlib encoder, such as window size, ...*/ + + unsigned auto_convert; /*automatically choose output PNG color type. Default: true*/ + + /*If true, follows the official PNG heuristic: if the PNG uses a palette or lower than + 8 bit depth, set all filters to zero. Otherwise use the filter_strategy. Note that to + completely follow the official PNG heuristic, filter_palette_zero must be true and + filter_strategy must be LFS_MINSUM*/ + unsigned filter_palette_zero; + /*Which filter strategy to use when not using zeroes due to filter_palette_zero. + Set filter_palette_zero to 0 to ensure always using your chosen strategy. Default: LFS_MINSUM*/ + LodePNGFilterStrategy filter_strategy; + /*used if filter_strategy is LFS_PREDEFINED. In that case, this must point to a buffer with + the same length as the amount of scanlines in the image, and each value must <= 5. You + have to cleanup this buffer, LodePNG will never free it. Don't forget that filter_palette_zero + must be set to 0 to ensure this is also used on palette or low bitdepth images.*/ + const unsigned char * predefined_filters; + + /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). + If colortype is 3, PLTE is always created. If color type is explicitly set + to a grayscale type (1 or 4), this is not done and is ignored. If enabling this, + a palette must be present in the info_png. + NOTE: enabling this may worsen compression if auto_convert is used to choose + optimal color mode, because it cannot use grayscale color modes in this case*/ + unsigned force_palette; +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*add LodePNG identifier and version as a text chunk, for debugging*/ + unsigned add_id; + /*encode text chunks as zTXt chunks instead of tEXt chunks, and use compression in iTXt chunks*/ + unsigned text_compression; +#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ +} LodePNGEncoderSettings; + +void lodepng_encoder_settings_init(LodePNGEncoderSettings * settings); +#endif /*LODEPNG_COMPILE_ENCODER*/ + + +#if defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) +/*The settings, state and information for extended encoding and decoding.*/ +typedef struct LodePNGState { +#ifdef LODEPNG_COMPILE_DECODER + LodePNGDecoderSettings decoder; /*the decoding settings*/ +#endif /*LODEPNG_COMPILE_DECODER*/ +#ifdef LODEPNG_COMPILE_ENCODER + LodePNGEncoderSettings encoder; /*the encoding settings*/ +#endif /*LODEPNG_COMPILE_ENCODER*/ + LodePNGColorMode info_raw; /*specifies the format in which you would like to get the raw pixel buffer*/ + LodePNGInfo info_png; /*info of the PNG image obtained after decoding*/ + unsigned error; +} LodePNGState; + +/*init, cleanup and copy functions to use with this struct*/ +void lodepng_state_init(LodePNGState * state); +void lodepng_state_cleanup(LodePNGState * state); +void lodepng_state_copy(LodePNGState * dest, const LodePNGState * source); +#endif /* defined(LODEPNG_COMPILE_DECODER) || defined(LODEPNG_COMPILE_ENCODER) */ + +#ifdef LODEPNG_COMPILE_DECODER +/* +Same as lodepng_decode_memory, but uses a LodePNGState to allow custom settings and +getting much more information about the PNG image and color mode. +*/ +unsigned lodepng_decode(unsigned char ** out, unsigned * w, unsigned * h, + LodePNGState * state, + const unsigned char * in, size_t insize); + +/* +Read the PNG header, but not the actual data. This returns only the information +that is in the IHDR chunk of the PNG, such as width, height and color type. The +information is placed in the info_png field of the LodePNGState. +*/ +unsigned lodepng_inspect(unsigned * w, unsigned * h, + LodePNGState * state, + const unsigned char * in, size_t insize); +#endif /*LODEPNG_COMPILE_DECODER*/ + +/* +Reads one metadata chunk (other than IHDR, which is handled by lodepng_inspect) +of the PNG file and outputs what it read in the state. Returns error code on failure. +Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const +to find the desired chunk type, and if non null use lodepng_inspect_chunk (with +chunk_pointer - start_of_file as pos). +Supports most metadata chunks from the PNG standard (gAMA, bKGD, tEXt, ...). +Ignores unsupported, unknown, non-metadata or IHDR chunks (without error). +Requirements: &in[pos] must point to start of a chunk, must use regular +lodepng_inspect first since format of most other chunks depends on IHDR, and if +there is a PLTE chunk, that one must be inspected before tRNS or bKGD. +*/ +unsigned lodepng_inspect_chunk(LodePNGState * state, size_t pos, + const unsigned char * in, size_t insize); + +#ifdef LODEPNG_COMPILE_ENCODER +/*This function allocates the out buffer with standard malloc and stores the size in *outsize.*/ +unsigned lodepng_encode(unsigned char ** out, size_t * outsize, + const unsigned char * image, unsigned w, unsigned h, + LodePNGState * state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +/* +The lodepng_chunk functions are normally not needed, except to traverse the +unknown chunks stored in the LodePNGInfo struct, or add new ones to it. +It also allows traversing the chunks of an encoded PNG file yourself. + +The chunk pointer always points to the beginning of the chunk itself, that is +the first byte of the 4 length bytes. + +In the PNG file format, chunks have the following format: +-4 bytes length: length of the data of the chunk in bytes (chunk itself is 12 bytes longer) +-4 bytes chunk type (ASCII a-z,A-Z only, see below) +-length bytes of data (may be 0 bytes if length was 0) +-4 bytes of CRC, computed on chunk name + data + +The first chunk starts at the 8th byte of the PNG file, the entire rest of the file +exists out of concatenated chunks with the above format. + +PNG standard chunk ASCII naming conventions: +-First byte: uppercase = critical, lowercase = ancillary +-Second byte: uppercase = public, lowercase = private +-Third byte: must be uppercase +-Fourth byte: uppercase = unsafe to copy, lowercase = safe to copy +*/ + +/* +Gets the length of the data of the chunk. Total chunk length has 12 bytes more. +There must be at least 4 bytes to read from. If the result value is too large, +it may be corrupt data. +*/ +unsigned lodepng_chunk_length(const unsigned char * chunk); + +/*puts the 4-byte type in null terminated string*/ +void lodepng_chunk_type(char type[5], const unsigned char * chunk); + +/*check if the type is the given type*/ +unsigned char lodepng_chunk_type_equals(const unsigned char * chunk, const char * type); + +/*0: it's one of the critical chunk types, 1: it's an ancillary chunk (see PNG standard)*/ +unsigned char lodepng_chunk_ancillary(const unsigned char * chunk); + +/*0: public, 1: private (see PNG standard)*/ +unsigned char lodepng_chunk_private(const unsigned char * chunk); + +/*0: the chunk is unsafe to copy, 1: the chunk is safe to copy (see PNG standard)*/ +unsigned char lodepng_chunk_safetocopy(const unsigned char * chunk); + +/*get pointer to the data of the chunk, where the input points to the header of the chunk*/ +unsigned char * lodepng_chunk_data(unsigned char * chunk); +const unsigned char * lodepng_chunk_data_const(const unsigned char * chunk); + +/*returns 0 if the crc is correct, 1 if it's incorrect (0 for OK as usual!)*/ +unsigned lodepng_chunk_check_crc(const unsigned char * chunk); + +/*generates the correct CRC from the data and puts it in the last 4 bytes of the chunk*/ +void lodepng_chunk_generate_crc(unsigned char * chunk); + +/* +Iterate to next chunks, allows iterating through all chunks of the PNG file. +Input must be at the beginning of a chunk (result of a previous lodepng_chunk_next call, +or the 8th byte of a PNG file which always has the first chunk), or alternatively may +point to the first byte of the PNG file (which is not a chunk but the magic header, the +function will then skip over it and return the first real chunk). +Will output pointer to the start of the next chunk, or at or beyond end of the file if there +is no more chunk after this or possibly if the chunk is corrupt. +Start this process at the 8th byte of the PNG file. +In a non-corrupt PNG file, the last chunk should have name "IEND". +*/ +unsigned char * lodepng_chunk_next(unsigned char * chunk, unsigned char * end); +const unsigned char * lodepng_chunk_next_const(const unsigned char * chunk, const unsigned char * end); + +/*Finds the first chunk with the given type in the range [chunk, end), or returns NULL if not found.*/ +unsigned char * lodepng_chunk_find(unsigned char * chunk, unsigned char * end, const char type[5]); +const unsigned char * lodepng_chunk_find_const(const unsigned char * chunk, const unsigned char * end, + const char type[5]); + +/* +Appends chunk to the data in out. The given chunk should already have its chunk header. +The out variable and outsize are updated to reflect the new reallocated buffer. +Returns error code (0 if it went ok) +*/ +unsigned lodepng_chunk_append(unsigned char ** out, size_t * outsize, const unsigned char * chunk); + +/* +Appends new chunk to out. The chunk to append is given by giving its length, type +and data separately. The type is a 4-letter string. +The out variable and outsize are updated to reflect the new reallocated buffer. +Return error code (0 if it went ok) +*/ +unsigned lodepng_chunk_create(unsigned char ** out, size_t * outsize, size_t length, + const char * type, const unsigned char * data); + + +/*Calculate CRC32 of buffer*/ +unsigned lodepng_crc32(const unsigned char * buf, size_t len); +#endif /*LODEPNG_COMPILE_PNG*/ + + +#ifdef LODEPNG_COMPILE_ZLIB +/* +This zlib part can be used independently to zlib compress and decompress a +buffer. It cannot be used to create gzip files however, and it only supports the +part of zlib that is required for PNG, it does not support dictionaries. +*/ + +#ifdef LODEPNG_COMPILE_DECODER +/*Inflate a buffer. Inflate is the decompression step of deflate. Out buffer must be freed after use.*/ +unsigned lodepng_inflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings); + +/* +Decompresses Zlib data. Reallocates the out buffer and appends the data. The +data must be according to the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_decompress(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGDecompressSettings * settings); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* +Compresses data with Zlib. Reallocates the out buffer and appends the data. +Zlib adds a small header and trailer around the deflate data. +The data is output in the format of the zlib specification. +Either, *out must be NULL and *outsize must be 0, or, *out must be a valid +buffer and *outsize its size in bytes. out must be freed by user after usage. +*/ +unsigned lodepng_zlib_compress(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings); + +/* +Find length-limited Huffman code for given frequencies. This function is in the +public interface only for tests, it's used internally by lodepng_deflate. +*/ +unsigned lodepng_huffman_code_lengths(unsigned * lengths, const unsigned * frequencies, + size_t numcodes, unsigned maxbitlen); + +/*Compress a buffer with deflate. See RFC 1951. Out buffer must be freed after use.*/ +unsigned lodepng_deflate(unsigned char ** out, size_t * outsize, + const unsigned char * in, size_t insize, + const LodePNGCompressSettings * settings); + +#endif /*LODEPNG_COMPILE_ENCODER*/ +#endif /*LODEPNG_COMPILE_ZLIB*/ + +#ifdef LODEPNG_COMPILE_DISK + /* + Load a file from disk into buffer. The function allocates the out buffer, and + after usage you should free it. + out: output parameter, contains pointer to loaded buffer. + outsize: output parameter, size of the allocated out buffer + filename: the path to the file to load + return value: error code (0 means ok) + + NOTE: Wide-character filenames are not supported, you can use an external method + to handle such files and decode in-memory. + */ + unsigned lodepng_load_file(unsigned char ** out, size_t * outsize, const char * filename); + + /* + Save a file from buffer to disk. Warning, if it exists, this function overwrites + the file without warning! + buffer: the buffer to write + buffersize: size of the buffer to write + filename: the path to the file to save to + return value: error code (0 means ok) + + NOTE: Wide-character filenames are not supported, you can use an external method + to handle such files and encode in-memory + */ + unsigned lodepng_save_file(const unsigned char * buffer, size_t buffersize, const char * filename); +#endif /*LODEPNG_COMPILE_DISK*/ + +#ifdef LODEPNG_COMPILE_CPP +/* The LodePNG C++ wrapper uses std::vectors instead of manually allocated memory buffers. */ +namespace lodepng +{ +#ifdef LODEPNG_COMPILE_PNG +class State : public LodePNGState +{ + public: + State(); + State(const State & other); + ~State(); + State & operator=(const State & other); +}; + +#ifdef LODEPNG_COMPILE_DECODER +/* Same as other lodepng::decode, but using a State for more settings and information. */ +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + State & state, + const unsigned char * in, size_t insize); +unsigned decode(std::vector & out, unsigned & w, unsigned & h, + State & state, + const std::vector & in); +#endif /*LODEPNG_COMPILE_DECODER*/ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Same as other lodepng::encode, but using a State for more settings and information. */ +unsigned encode(std::vector & out, + const unsigned char * in, unsigned w, unsigned h, + State & state); +unsigned encode(std::vector & out, + const std::vector & in, unsigned w, unsigned h, + State & state); +#endif /*LODEPNG_COMPILE_ENCODER*/ + +#ifdef LODEPNG_COMPILE_DISK + /* + Load a file from disk into an std::vector. + return value: error code (0 means ok) + + NOTE: Wide-character filenames are not supported, you can use an external method + to handle such files and decode in-memory + */ + unsigned load_file(std::vector & buffer, const std::string & filename); + + /* + Save the binary data in an std::vector to a file on disk. The file is overwritten + without warning. + + NOTE: Wide-character filenames are not supported, you can use an external method + to handle such files and encode in-memory + */ + unsigned save_file(const std::vector & buffer, const std::string & filename); +#endif /* LODEPNG_COMPILE_DISK */ +#endif /* LODEPNG_COMPILE_PNG */ + +#ifdef LODEPNG_COMPILE_ZLIB +#ifdef LODEPNG_COMPILE_DECODER +/* Zlib-decompress an unsigned char buffer */ +unsigned decompress(std::vector & out, const unsigned char * in, size_t insize, + const LodePNGDecompressSettings & settings = lodepng_default_decompress_settings); + +/* Zlib-decompress an std::vector */ +unsigned decompress(std::vector & out, const std::vector & in, + const LodePNGDecompressSettings & settings = lodepng_default_decompress_settings); +#endif /* LODEPNG_COMPILE_DECODER */ + +#ifdef LODEPNG_COMPILE_ENCODER +/* Zlib-compress an unsigned char buffer */ +unsigned compress(std::vector & out, const unsigned char * in, size_t insize, + const LodePNGCompressSettings & settings = lodepng_default_compress_settings); + +/* Zlib-compress an std::vector */ +unsigned compress(std::vector & out, const std::vector & in, + const LodePNGCompressSettings & settings = lodepng_default_compress_settings); +#endif /* LODEPNG_COMPILE_ENCODER */ +#endif /* LODEPNG_COMPILE_ZLIB */ +} /* namespace lodepng */ +#endif /*LODEPNG_COMPILE_CPP*/ + +/* +TODO: +[.] test if there are no memory leaks or security exploits - done a lot but needs to be checked often +[.] check compatibility with various compilers - done but needs to be redone for every newer version +[X] converting color to 16-bit per channel types +[X] support color profile chunk types (but never let them touch RGB values by default) +[ ] support all public PNG chunk types (almost done except sPLT and hIST) +[ ] make sure encoder generates no chunks with size > (2^31)-1 +[ ] partial decoding (stream processing) +[X] let the "isFullyOpaque" function check color keys and transparent palettes too +[X] better name for the variables "codes", "codesD", "codelengthcodes", "clcl" and "lldl" +[ ] allow treating some errors like warnings, when image is recoverable (e.g. 69, 57, 58) +[ ] make warnings like: oob palette, checksum fail, data after iend, wrong/unknown crit chunk, no null terminator in text, ... +[ ] error messages with line numbers (and version) +[ ] errors in state instead of as return code? +[ ] new errors/warnings like suspiciously big decompressed ztxt or iccp chunk +[ ] let the C++ wrapper catch exceptions coming from the standard library and return LodePNG error codes +[ ] allow user to provide custom color conversion functions, e.g. for premultiplied alpha, padding bits or not, ... +[ ] allow user to give data (void*) to custom allocator +[X] provide alternatives for C library functions not present on some platforms (memcpy, ...) +*/ + +#endif /*LV_USE_LODEPNG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LODEPNG_H inclusion guard*/ + +/* +LodePNG Documentation +--------------------- + +0. table of contents +-------------------- + + 1. about + 1.1. supported features + 1.2. features not supported + 2. C and C++ version + 3. security + 4. decoding + 5. encoding + 6. color conversions + 6.1. PNG color types + 6.2. color conversions + 6.3. padding bits + 6.4. A note about 16-bits per channel and endianness + 7. error values + 8. chunks and PNG editing + 9. compiler support + 10. examples + 10.1. decoder C++ example + 10.2. decoder C example + 11. state settings reference + 12. changes + 13. contact information + + +1. about +-------- + +PNG is a file format to store raster images losslessly with good compression, +supporting different color types and alpha channel. + +LodePNG is a PNG codec according to the Portable Network Graphics (PNG) +Specification (Second Edition) - W3C Recommendation 10 November 2003. + +The specifications used are: + +*) Portable Network Graphics (PNG) Specification (Second Edition): + http://www.w3.org/TR/2003/REC-PNG-20031110 +*) RFC 1950 ZLIB Compressed Data Format version 3.3: + http://www.gzip.org/zlib/rfc-zlib.html +*) RFC 1951 DEFLATE Compressed Data Format Specification ver 1.3: + http://www.gzip.org/zlib/rfc-deflate.html + +The most recent version of LodePNG can currently be found at +http://lodev.org/lodepng/ + +LodePNG works both in C (ISO C90) and C++, with a C++ wrapper that adds +extra functionality. + +LodePNG exists out of two files: +-lodepng.h: the header file for both C and C++ +-lodepng.c(pp): give it the name lodepng.c or lodepng.cpp (or .cc) depending on your usage + +If you want to start using LodePNG right away without reading this doc, get the +examples from the LodePNG website to see how to use it in code, or check the +smaller examples in chapter 13 here. + +LodePNG is simple but only supports the basic requirements. To achieve +simplicity, the following design choices were made: There are no dependencies +on any external library. There are functions to decode and encode a PNG with +a single function call, and extended versions of these functions taking a +LodePNGState struct allowing to specify or get more information. By default +the colors of the raw image are always RGB or RGBA, no matter what color type +the PNG file uses. To read and write files, there are simple functions to +convert the files to/from buffers in memory. + +This all makes LodePNG suitable for loading textures in games, demos and small +programs, ... It's less suitable for full fledged image editors, loading PNGs +over network (it requires all the image data to be available before decoding can +begin), life-critical systems, ... + +1.1. supported features +----------------------- + +The following features are supported by the decoder: + +*) decoding of PNGs with any color type, bit depth and interlace mode, to a 24- or 32-bit color raw image, + or the same color type as the PNG +*) encoding of PNGs, from any raw image to 24- or 32-bit color, or the same color type as the raw image +*) Adam7 interlace and deinterlace for any color type +*) loading the image from harddisk or decoding it from a buffer from other sources than harddisk +*) support for alpha channels, including RGBA color model, translucent palettes and color keying +*) zlib decompression (inflate) +*) zlib compression (deflate) +*) CRC32 and ADLER32 checksums +*) colorimetric color profile conversions: currently experimentally available in lodepng_util.cpp only, + plus alternatively ability to pass on chroma/gamma/ICC profile information to other color management system. +*) handling of unknown chunks, allowing making a PNG editor that stores custom and unknown chunks. +*) the following chunks are supported by both encoder and decoder: + IHDR: header information + PLTE: color palette + IDAT: pixel data + IEND: the final chunk + tRNS: transparency for palettized images + tEXt: textual information + zTXt: compressed textual information + iTXt: international textual information + bKGD: suggested background color + pHYs: physical dimensions + tIME: modification time + cHRM: RGB chromaticities + gAMA: RGB gamma correction + iCCP: ICC color profile + sRGB: rendering intent + sBIT: significant bits + +1.2. features not supported +--------------------------- + +The following features are not (yet) supported: + +*) some features needed to make a conformant PNG-Editor might be still missing. +*) partial loading/stream processing. All data must be available and is processed in one call. +*) The hIST and sPLT public chunks are not (yet) supported but treated as unknown chunks + + +2. C and C++ version +-------------------- + +The C version uses buffers allocated with alloc that you need to free() +yourself. You need to use init and cleanup functions for each struct whenever +using a struct from the C version to avoid exploits and memory leaks. + +The C++ version has extra functions with std::vectors in the interface and the +lodepng::State class which is a LodePNGState with constructor and destructor. + +These files work without modification for both C and C++ compilers because all +the additional C++ code is in "#ifdef __cplusplus" blocks that make C-compilers +ignore it, and the C code is made to compile both with strict ISO C90 and C++. + +To use the C++ version, you need to rename the source file to lodepng.cpp +(instead of lodepng.c), and compile it with a C++ compiler. + +To use the C version, you need to rename the source file to lodepng.c (instead +of lodepng.cpp), and compile it with a C compiler. + + +3. Security +----------- + +Even if carefully designed, it's always possible that LodePNG contains possible +exploits. If you discover one, please let me know, and it will be fixed. + +When using LodePNG, care has to be taken with the C version of LodePNG, as well +as the C-style structs when working with C++. The following conventions are used +for all C-style structs: + +-if a struct has a corresponding init function, always call the init function when making a new one +-if a struct has a corresponding cleanup function, call it before the struct disappears to avoid memory leaks +-if a struct has a corresponding copy function, use the copy function instead of "=". + The destination must also be inited already. + + +4. Decoding +----------- + +Decoding converts a PNG compressed image to a raw pixel buffer. + +Most documentation on using the decoder is at its declarations in the header +above. For C, simple decoding can be done with functions such as +lodepng_decode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_decode. For C++, all decoding can be done with the +various lodepng::decode functions, and lodepng::State can be used for advanced +features. + +When using the LodePNGState, it uses the following fields for decoding: +*) LodePNGInfo info_png: it stores extra information about the PNG (the input) in here +*) LodePNGColorMode info_raw: here you can say what color mode of the raw image (the output) you want to get +*) LodePNGDecoderSettings decoder: you can specify a few extra settings for the decoder to use + +LodePNGInfo info_png +-------------------- + +After decoding, this contains extra information of the PNG image, except the actual +pixels, width and height because these are already gotten directly from the decoder +functions. + +It contains for example the original color type of the PNG image, text comments, +suggested background color, etc... More details about the LodePNGInfo struct are +at its declaration documentation. + +LodePNGColorMode info_raw +------------------------- + +When decoding, here you can specify which color type you want +the resulting raw image to be. If this is different from the colortype of the +PNG, then the decoder will automatically convert the result. This conversion +always works, except if you want it to convert a color PNG to grayscale or to +a palette with missing colors. + +By default, 32-bit color is used for the result. + +LodePNGDecoderSettings decoder +------------------------------ + +The settings can be used to ignore the errors created by invalid CRC and Adler32 +chunks, and to disable the decoding of tEXt chunks. + +There's also a setting color_convert, true by default. If false, no conversion +is done, the resulting data will be as it was in the PNG (after decompression) +and you'll have to puzzle the colors of the pixels together yourself using the +color type information in the LodePNGInfo. + + +5. Encoding +----------- + +Encoding converts a raw pixel buffer to a PNG compressed image. + +Most documentation on using the encoder is at its declarations in the header +above. For C, simple encoding can be done with functions such as +lodepng_encode32, and more advanced decoding can be done with the struct +LodePNGState and lodepng_encode. For C++, all encoding can be done with the +various lodepng::encode functions, and lodepng::State can be used for advanced +features. + +Like the decoder, the encoder can also give errors. However it gives less errors +since the encoder input is trusted, the decoder input (a PNG image that could +be forged by anyone) is not trusted. + +When using the LodePNGState, it uses the following fields for encoding: +*) LodePNGInfo info_png: here you specify how you want the PNG (the output) to be. +*) LodePNGColorMode info_raw: here you say what color type of the raw image (the input) has +*) LodePNGEncoderSettings encoder: you can specify a few settings for the encoder to use + +LodePNGInfo info_png +-------------------- + +When encoding, you use this the opposite way as when decoding: for encoding, +you fill in the values you want the PNG to have before encoding. By default it's +not needed to specify a color type for the PNG since it's automatically chosen, +but it's possible to choose it yourself given the right settings. + +The encoder will not always exactly match the LodePNGInfo struct you give, +it tries as close as possible. Some things are ignored by the encoder. The +encoder uses, for example, the following settings from it when applicable: +colortype and bitdepth, text chunks, time chunk, the color key, the palette, the +background color, the interlace method, unknown chunks, ... + +When encoding to a PNG with colortype 3, the encoder will generate a PLTE chunk. +If the palette contains any colors for which the alpha channel is not 255 (so +there are translucent colors in the palette), it'll add a tRNS chunk. + +LodePNGColorMode info_raw +------------------------- + +You specify the color type of the raw image that you give to the input here, +including a possible transparent color key and palette you happen to be using in +your raw image data. + +By default, 32-bit color is assumed, meaning your input has to be in RGBA +format with 4 bytes (unsigned chars) per pixel. + +LodePNGEncoderSettings encoder +------------------------------ + +The following settings are supported (some are in sub-structs): +*) auto_convert: when this option is enabled, the encoder will +automatically choose the smallest possible color mode (including color key) that +can encode the colors of all pixels without information loss. +*) btype: the block type for LZ77. 0 = uncompressed, 1 = fixed huffman tree, + 2 = dynamic huffman tree (best compression). Should be 2 for proper + compression. +*) use_lz77: whether or not to use LZ77 for compressed block types. Should be + true for proper compression. +*) windowsize: the window size used by the LZ77 encoder (1 - 32768). Has value + 2048 by default, but can be set to 32768 for better, but slow, compression. +*) force_palette: if colortype is 2 or 6, you can make the encoder write a PLTE + chunk if force_palette is true. This can used as suggested palette to convert + to by viewers that don't support more than 256 colors (if those still exist) +*) add_id: add text chunk "Encoder: LodePNG " to the image. +*) text_compression: default 1. If 1, it'll store texts as zTXt instead of tEXt chunks. + zTXt chunks use zlib compression on the text. This gives a smaller result on + large texts but a larger result on small texts (such as a single program name). + It's all tEXt or all zTXt though, there's no separate setting per text yet. + + +6. color conversions +-------------------- + +An important thing to note about LodePNG, is that the color type of the PNG, and +the color type of the raw image, are completely independent. By default, when +you decode a PNG, you get the result as a raw image in the color type you want, +no matter whether the PNG was encoded with a palette, grayscale or RGBA color. +And if you encode an image, by default LodePNG will automatically choose the PNG +color type that gives good compression based on the values of colors and amount +of colors in the image. It can be configured to let you control it instead as +well, though. + +To be able to do this, LodePNG does conversions from one color mode to another. +It can convert from almost any color type to any other color type, except the +following conversions: RGB to grayscale is not supported, and converting to a +palette when the palette doesn't have a required color is not supported. This is +not supported on purpose: this is information loss which requires a color +reduction algorithm that is beyond the scope of a PNG encoder (yes, RGB to gray +is easy, but there are multiple ways if you want to give some channels more +weight). + +By default, when decoding, you get the raw image in 32-bit RGBA or 24-bit RGB +color, no matter what color type the PNG has. And by default when encoding, +LodePNG automatically picks the best color model for the output PNG, and expects +the input image to be 32-bit RGBA or 24-bit RGB. So, unless you want to control +the color format of the images yourself, you can skip this chapter. + +6.1. PNG color types +-------------------- + +A PNG image can have many color types, ranging from 1-bit color to 64-bit color, +as well as palettized color modes. After the zlib decompression and unfiltering +in the PNG image is done, the raw pixel data will have that color type and thus +a certain amount of bits per pixel. If you want the output raw image after +decoding to have another color type, a conversion is done by LodePNG. + +The PNG specification gives the following color types: + +0: grayscale, bit depths 1, 2, 4, 8, 16 +2: RGB, bit depths 8 and 16 +3: palette, bit depths 1, 2, 4 and 8 +4: grayscale with alpha, bit depths 8 and 16 +6: RGBA, bit depths 8 and 16 + +Bit depth is the amount of bits per pixel per color channel. So the total amount +of bits per pixel is: amount of channels * bitdepth. + +6.2. color conversions +---------------------- + +As explained in the sections about the encoder and decoder, you can specify +color types and bit depths in info_png and info_raw to change the default +behaviour. + +If, when decoding, you want the raw image to be something else than the default, +you need to set the color type and bit depth you want in the LodePNGColorMode, +or the parameters colortype and bitdepth of the simple decoding function. + +If, when encoding, you use another color type than the default in the raw input +image, you need to specify its color type and bit depth in the LodePNGColorMode +of the raw image, or use the parameters colortype and bitdepth of the simple +encoding function. + +If, when encoding, you don't want LodePNG to choose the output PNG color type +but control it yourself, you need to set auto_convert in the encoder settings +to false, and specify the color type you want in the LodePNGInfo of the +encoder (including palette: it can generate a palette if auto_convert is true, +otherwise not). + +If the input and output color type differ (whether user chosen or auto chosen), +LodePNG will do a color conversion, which follows the rules below, and may +sometimes result in an error. + +To avoid some confusion: +-the decoder converts from PNG to raw image +-the encoder converts from raw image to PNG +-the colortype and bitdepth in LodePNGColorMode info_raw, are those of the raw image +-the colortype and bitdepth in the color field of LodePNGInfo info_png, are those of the PNG +-when encoding, the color type in LodePNGInfo is ignored if auto_convert + is enabled, it is automatically generated instead +-when decoding, the color type in LodePNGInfo is set by the decoder to that of the original + PNG image, but it can be ignored since the raw image has the color type you requested instead +-if the color type of the LodePNGColorMode and PNG image aren't the same, a conversion + between the color types is done if the color types are supported. If it is not + supported, an error is returned. If the types are the same, no conversion is done. +-even though some conversions aren't supported, LodePNG supports loading PNGs from any + colortype and saving PNGs to any colortype, sometimes it just requires preparing + the raw image correctly before encoding. +-both encoder and decoder use the same color converter. + +The function lodepng_convert does the color conversion. It is available in the +interface but normally isn't needed since the encoder and decoder already call +it. + +Non supported color conversions: +-color to grayscale when non-gray pixels are present: no error is thrown, but +the result will look ugly because only the red channel is taken (it assumes all +three channels are the same in this case so ignores green and blue). The reason +no error is given is to allow converting from three-channel grayscale images to +one-channel even if there are numerical imprecisions. +-anything to palette when the palette does not have an exact match for a from-color +in it: in this case an error is thrown + +Supported color conversions: +-anything to 8-bit RGB, 8-bit RGBA, 16-bit RGB, 16-bit RGBA +-any gray or gray+alpha, to gray or gray+alpha +-anything to a palette, as long as the palette has the requested colors in it +-removing alpha channel +-higher to smaller bitdepth, and vice versa + +If you want no color conversion to be done (e.g. for speed or control): +-In the encoder, you can make it save a PNG with any color type by giving the +raw color mode and LodePNGInfo the same color mode, and setting auto_convert to +false. +-In the decoder, you can make it store the pixel data in the same color type +as the PNG has, by setting the color_convert setting to false. Settings in +info_raw are then ignored. + +6.3. padding bits +----------------- + +In the PNG file format, if a less than 8-bit per pixel color type is used and the scanlines +have a bit amount that isn't a multiple of 8, then padding bits are used so that each +scanline starts at a fresh byte. But that is NOT true for the LodePNG raw input and output. +The raw input image you give to the encoder, and the raw output image you get from the decoder +will NOT have these padding bits, e.g. in the case of a 1-bit image with a width +of 7 pixels, the first pixel of the second scanline will the 8th bit of the first byte, +not the first bit of a new byte. + +6.4. A note about 16-bits per channel and endianness +---------------------------------------------------- + +LodePNG uses unsigned char arrays for 16-bit per channel colors too, just like +for any other color format. The 16-bit values are stored in big endian (most +significant byte first) in these arrays. This is the opposite order of the +little endian used by x86 CPU's. + +LodePNG always uses big endian because the PNG file format does so internally. +Conversions to other formats than PNG uses internally are not supported by +LodePNG on purpose, there are myriads of formats, including endianness of 16-bit +colors, the order in which you store R, G, B and A, and so on. Supporting and +converting to/from all that is outside the scope of LodePNG. + +This may mean that, depending on your use case, you may want to convert the big +endian output of LodePNG to little endian with a for loop. This is certainly not +always needed, many applications and libraries support big endian 16-bit colors +anyway, but it means you cannot simply cast the unsigned char* buffer to an +unsigned short* buffer on x86 CPUs. + + +7. error values +--------------- + +All functions in LodePNG that return an error code, return 0 if everything went +OK, or a non-zero code if there was an error. + +The meaning of the LodePNG error values can be retrieved with the function +lodepng_error_text: given the numerical error code, it returns a description +of the error in English as a string. + +Check the implementation of lodepng_error_text to see the meaning of each code. + +It is not recommended to use the numerical values to programmatically make +different decisions based on error types as the numbers are not guaranteed to +stay backwards compatible. They are for human consumption only. Programmatically +only 0 or non-0 matter. + + +8. chunks and PNG editing +------------------------- + +If you want to add extra chunks to a PNG you encode, or use LodePNG for a PNG +editor that should follow the rules about handling of unknown chunks, or if your +program is able to read other types of chunks than the ones handled by LodePNG, +then that's possible with the chunk functions of LodePNG. + +A PNG chunk has the following layout: + +4 bytes length +4 bytes type name +length bytes data +4 bytes CRC + +8.1. iterating through chunks +----------------------------- + +If you have a buffer containing the PNG image data, then the first chunk (the +IHDR chunk) starts at byte number 8 of that buffer. The first 8 bytes are the +signature of the PNG and are not part of a chunk. But if you start at byte 8 +then you have a chunk, and can check the following things of it. + +NOTE: none of these functions check for memory buffer boundaries. To avoid +exploits, always make sure the buffer contains all the data of the chunks. +When using lodepng_chunk_next, make sure the returned value is within the +allocated memory. + +unsigned lodepng_chunk_length(const unsigned char* chunk): + +Get the length of the chunk's data. The total chunk length is this length + 12. + +void lodepng_chunk_type(char type[5], const unsigned char* chunk): +unsigned char lodepng_chunk_type_equals(const unsigned char* chunk, const char* type): + +Get the type of the chunk or compare if it's a certain type + +unsigned char lodepng_chunk_critical(const unsigned char* chunk): +unsigned char lodepng_chunk_private(const unsigned char* chunk): +unsigned char lodepng_chunk_safetocopy(const unsigned char* chunk): + +Check if the chunk is critical in the PNG standard (only IHDR, PLTE, IDAT and IEND are). +Check if the chunk is private (public chunks are part of the standard, private ones not). +Check if the chunk is safe to copy. If it's not, then, when modifying data in a critical +chunk, unsafe to copy chunks of the old image may NOT be saved in the new one if your +program doesn't handle that type of unknown chunk. + +unsigned char* lodepng_chunk_data(unsigned char* chunk): +const unsigned char* lodepng_chunk_data_const(const unsigned char* chunk): + +Get a pointer to the start of the data of the chunk. + +unsigned lodepng_chunk_check_crc(const unsigned char* chunk): +void lodepng_chunk_generate_crc(unsigned char* chunk): + +Check if the crc is correct or generate a correct one. + +unsigned char* lodepng_chunk_next(unsigned char* chunk): +const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk): + +Iterate to the next chunk. This works if you have a buffer with consecutive chunks. Note that these +functions do no boundary checking of the allocated data whatsoever, so make sure there is enough +data available in the buffer to be able to go to the next chunk. + +unsigned lodepng_chunk_append(unsigned char** out, size_t* outsize, const unsigned char* chunk): +unsigned lodepng_chunk_create(unsigned char** out, size_t* outsize, unsigned length, + const char* type, const unsigned char* data): + +These functions are used to create new chunks that are appended to the data in *out that has +length *outsize. The append function appends an existing chunk to the new data. The create +function creates a new chunk with the given parameters and appends it. Type is the 4-letter +name of the chunk. + +8.2. chunks in info_png +----------------------- + +The LodePNGInfo struct contains fields with the unknown chunk in it. It has 3 +buffers (each with size) to contain 3 types of unknown chunks: +the ones that come before the PLTE chunk, the ones that come between the PLTE +and the IDAT chunks, and the ones that come after the IDAT chunks. +It's necessary to make the distinction between these 3 cases because the PNG +standard forces to keep the ordering of unknown chunks compared to the critical +chunks, but does not force any other ordering rules. + +info_png.unknown_chunks_data[0] is the chunks before PLTE +info_png.unknown_chunks_data[1] is the chunks after PLTE, before IDAT +info_png.unknown_chunks_data[2] is the chunks after IDAT + +The chunks in these 3 buffers can be iterated through and read by using the same +way described in the previous subchapter. + +When using the decoder to decode a PNG, you can make it store all unknown chunks +if you set the option settings.remember_unknown_chunks to 1. By default, this +option is off (0). + +The encoder will always encode unknown chunks that are stored in the info_png. +If you need it to add a particular chunk that isn't known by LodePNG, you can +use lodepng_chunk_append or lodepng_chunk_create to the chunk data in +info_png.unknown_chunks_data[x]. + +Chunks that are known by LodePNG should not be added in that way. E.g. to make +LodePNG add a bKGD chunk, set background_defined to true and add the correct +parameters there instead. + + +9. compiler support +------------------- + +No libraries other than the current standard C library are needed to compile +LodePNG. For the C++ version, only the standard C++ library is needed on top. +Add the files lodepng.c(pp) and lodepng.h to your project, include +lodepng.h where needed, and your program can read/write PNG files. + +It is compatible with C90 and up, and C++03 and up. + +If performance is important, use optimization when compiling! For both the +encoder and decoder, this makes a large difference. + +Make sure that LodePNG is compiled with the same compiler of the same version +and with the same settings as the rest of the program, or the interfaces with +std::vectors and std::strings in C++ can be incompatible. + +CHAR_BITS must be 8 or higher, because LodePNG uses unsigned chars for octets. + +*) gcc and g++ + +LodePNG is developed in gcc so this compiler is natively supported. It gives no +warnings with compiler options "-Wall -Wextra -pedantic -ansi", with gcc and g++ +version 4.7.1 on Linux, 32-bit and 64-bit. + +*) Clang + +Fully supported and warning-free. + +*) Mingw + +The Mingw compiler (a port of gcc for Windows) should be fully supported by +LodePNG. + +*) Visual Studio and Visual C++ Express Edition + +LodePNG should be warning-free with warning level W4. Two warnings were disabled +with pragmas though: warning 4244 about implicit conversions, and warning 4996 +where it wants to use a non-standard function fopen_s instead of the standard C +fopen. + +Visual Studio may want "stdafx.h" files to be included in each source file and +give an error "unexpected end of file while looking for precompiled header". +This is not standard C++ and will not be added to the stock LodePNG. You can +disable it for lodepng.cpp only by right clicking it, Properties, C/C++, +Precompiled Headers, and set it to Not Using Precompiled Headers there. + +NOTE: Modern versions of VS should be fully supported, but old versions, e.g. +VS6, are not guaranteed to work. + +*) Compilers on Macintosh + +LodePNG has been reported to work both with gcc and LLVM for Macintosh, both for +C and C++. + +*) Other Compilers + +If you encounter problems on any compilers, feel free to let me know and I may +try to fix it if the compiler is modern and standards compliant. + + +10. examples +------------ + +This decoder example shows the most basic usage of LodePNG. More complex +examples can be found on the LodePNG website. + +NOTE: these examples do not support wide-character filenames, you can use an +external method to handle such files and encode or decode in-memory + +10.1. decoder C++ example +------------------------- + +#include "lodepng.h" +#include + +int main(int argc, char *argv[]) { + const char* filename = argc > 1 ? argv[1] : "test.png"; + + //load and decode + std::vector image; + unsigned width, height; + unsigned error = lodepng::decode(image, width, height, filename); + + //if there's an error, display it + if(error) std::cout << "decoder error " << error << ": " << lodepng_error_text(error) << std::endl; + + //the pixels are now in the vector "image", 4 bytes per pixel, ordered RGBARGBA..., use it as texture, draw it, ... +} + +10.2. decoder C example +----------------------- + +#include "lodepng.h" + +int main(int argc, char *argv[]) { + unsigned error; + unsigned char* image; + size_t width, height; + const char* filename = argc > 1 ? argv[1] : "test.png"; + + error = lodepng_decode32_file(&image, &width, &height, filename); + + if(error) printf("decoder error %u: %s\n", error, lodepng_error_text(error)); + + / * use image here * / + + free(image); + return 0; +} + +11. state settings reference +---------------------------- + +A quick reference of some settings to set on the LodePNGState + +For decoding: + +state.decoder.zlibsettings.ignore_adler32: ignore ADLER32 checksums +state.decoder.zlibsettings.custom_...: use custom inflate function +state.decoder.ignore_crc: ignore CRC checksums +state.decoder.ignore_critical: ignore unknown critical chunks +state.decoder.ignore_end: ignore missing IEND chunk. May fail if this corruption causes other errors +state.decoder.color_convert: convert internal PNG color to chosen one +state.decoder.read_text_chunks: whether to read in text metadata chunks +state.decoder.remember_unknown_chunks: whether to read in unknown chunks +state.info_raw.colortype: desired color type for decoded image +state.info_raw.bitdepth: desired bit depth for decoded image +state.info_raw....: more color settings, see struct LodePNGColorMode +state.info_png....: no settings for decoder but output, see struct LodePNGInfo + +For encoding: + +state.encoder.zlibsettings.btype: disable compression by setting it to 0 +state.encoder.zlibsettings.use_lz77: use LZ77 in compression +state.encoder.zlibsettings.windowsize: tweak LZ77 windowsize +state.encoder.zlibsettings.minmatch: tweak min LZ77 length to match +state.encoder.zlibsettings.nicematch: tweak LZ77 match where to stop searching +state.encoder.zlibsettings.lazymatching: try one more LZ77 matching +state.encoder.zlibsettings.custom_...: use custom deflate function +state.encoder.auto_convert: choose optimal PNG color type, if 0 uses info_png +state.encoder.filter_palette_zero: PNG filter strategy for palette +state.encoder.filter_strategy: PNG filter strategy to encode with +state.encoder.force_palette: add palette even if not encoding to one +state.encoder.add_id: add LodePNG identifier and version as a text chunk +state.encoder.text_compression: use compressed text chunks for metadata +state.info_raw.colortype: color type of raw input image you provide +state.info_raw.bitdepth: bit depth of raw input image you provide +state.info_raw: more color settings, see struct LodePNGColorMode +state.info_png.color.colortype: desired color type if auto_convert is false +state.info_png.color.bitdepth: desired bit depth if auto_convert is false +state.info_png.color....: more color settings, see struct LodePNGColorMode +state.info_png....: more PNG related settings, see struct LodePNGInfo + + +12. changes +----------- + +The version number of LodePNG is the date of the change given in the format +yyyymmdd. + +Some changes aren't backwards compatible. Those are indicated with a (!) +symbol. + +Not all changes are listed here, the commit history in github lists more: +https://github.com/lvandeve/lodepng + +*) 10 apr 2023: faster CRC32 implementation, but with larger lookup table. +*) 13 jun 2022: added support for the sBIT chunk. +*) 09 jan 2022: minor decoder speed improvements. +*) 27 jun 2021: added warnings that file reading/writing functions don't support + wide-character filenames (support for this is not planned, opening files is + not the core part of PNG decoding/decoding and is platform dependent). +*) 17 okt 2020: prevent decoding too large text/icc chunks by default. +*) 06 mar 2020: simplified some of the dynamic memory allocations. +*) 12 jan 2020: (!) added 'end' argument to lodepng_chunk_next to allow correct + overflow checks. +*) 14 aug 2019: around 25% faster decoding thanks to huffman lookup tables. +*) 15 jun 2019: (!) auto_choose_color API changed (for bugfix: don't use palette + if gray ICC profile) and non-ICC LodePNGColorProfile renamed to + LodePNGColorStats. +*) 30 dec 2018: code style changes only: removed newlines before opening braces. +*) 10 sep 2018: added way to inspect metadata chunks without full decoding. +*) 19 aug 2018: (!) fixed color mode bKGD is encoded with and made it use + palette index in case of palette. +*) 10 aug 2018: (!) added support for gAMA, cHRM, sRGB and iCCP chunks. This + change is backwards compatible unless you relied on unknown_chunks for those. +*) 11 jun 2018: less restrictive check for pixel size integer overflow +*) 14 jan 2018: allow optionally ignoring a few more recoverable errors +*) 17 sep 2017: fix memory leak for some encoder input error cases +*) 27 nov 2016: grey+alpha auto color model detection bugfix +*) 18 apr 2016: Changed qsort to custom stable sort (for platforms w/o qsort). +*) 09 apr 2016: Fixed colorkey usage detection, and better file loading (within + the limits of pure C90). +*) 08 dec 2015: Made load_file function return error if file can't be opened. +*) 24 okt 2015: Bugfix with decoding to palette output. +*) 18 apr 2015: Boundary PM instead of just package-merge for faster encoding. +*) 24 aug 2014: Moved to github +*) 23 aug 2014: Reduced needless memory usage of decoder. +*) 28 jun 2014: Removed fix_png setting, always support palette OOB for + simplicity. Made ColorProfile public. +*) 09 jun 2014: Faster encoder by fixing hash bug and more zeros optimization. +*) 22 dec 2013: Power of two windowsize required for optimization. +*) 15 apr 2013: Fixed bug with LAC_ALPHA and color key. +*) 25 mar 2013: Added an optional feature to ignore some PNG errors (fix_png). +*) 11 mar 2013: (!) Bugfix with custom free. Changed from "my" to "lodepng_" + prefix for the custom allocators and made it possible with a new #define to + use custom ones in your project without needing to change lodepng's code. +*) 28 jan 2013: Bugfix with color key. +*) 27 okt 2012: Tweaks in text chunk keyword length error handling. +*) 8 okt 2012: (!) Added new filter strategy (entropy) and new auto color mode. + (no palette). Better deflate tree encoding. New compression tweak settings. + Faster color conversions while decoding. Some internal cleanups. +*) 23 sep 2012: Reduced warnings in Visual Studio a little bit. +*) 1 sep 2012: (!) Removed #define's for giving custom (de)compression functions + and made it work with function pointers instead. +*) 23 jun 2012: Added more filter strategies. Made it easier to use custom alloc + and free functions and toggle #defines from compiler flags. Small fixes. +*) 6 may 2012: (!) Made plugging in custom zlib/deflate functions more flexible. +*) 22 apr 2012: (!) Made interface more consistent, renaming a lot. Removed + redundant C++ codec classes. Reduced amount of structs. Everything changed, + but it is cleaner now imho and functionality remains the same. Also fixed + several bugs and shrunk the implementation code. Made new samples. +*) 6 nov 2011: (!) By default, the encoder now automatically chooses the best + PNG color model and bit depth, based on the amount and type of colors of the + raw image. For this, autoLeaveOutAlphaChannel replaced by auto_choose_color. +*) 9 okt 2011: simpler hash chain implementation for the encoder. +*) 8 sep 2011: lz77 encoder lazy matching instead of greedy matching. +*) 23 aug 2011: tweaked the zlib compression parameters after benchmarking. + A bug with the PNG filtertype heuristic was fixed, so that it chooses much + better ones (it's quite significant). A setting to do an experimental, slow, + brute force search for PNG filter types is added. +*) 17 aug 2011: (!) changed some C zlib related function names. +*) 16 aug 2011: made the code less wide (max 120 characters per line). +*) 17 apr 2011: code cleanup. Bugfixes. Convert low to 16-bit per sample colors. +*) 21 feb 2011: fixed compiling for C90. Fixed compiling with sections disabled. +*) 11 dec 2010: encoding is made faster, based on suggestion by Peter Eastman + to optimize long sequences of zeros. +*) 13 nov 2010: added LodePNG_InfoColor_hasPaletteAlpha and + LodePNG_InfoColor_canHaveAlpha functions for convenience. +*) 7 nov 2010: added LodePNG_error_text function to get error code description. +*) 30 okt 2010: made decoding slightly faster +*) 26 okt 2010: (!) changed some C function and struct names (more consistent). + Reorganized the documentation and the declaration order in the header. +*) 08 aug 2010: only changed some comments and external samples. +*) 05 jul 2010: fixed bug thanks to warnings in the new gcc version. +*) 14 mar 2010: fixed bug where too much memory was allocated for char buffers. +*) 02 sep 2008: fixed bug where it could create empty tree that linux apps could + read by ignoring the problem but windows apps couldn't. +*) 06 jun 2008: added more error checks for out of memory cases. +*) 26 apr 2008: added a few more checks here and there to ensure more safety. +*) 06 mar 2008: crash with encoding of strings fixed +*) 02 feb 2008: support for international text chunks added (iTXt) +*) 23 jan 2008: small cleanups, and #defines to divide code in sections +*) 20 jan 2008: support for unknown chunks allowing using LodePNG for an editor. +*) 18 jan 2008: support for tIME and pHYs chunks added to encoder and decoder. +*) 17 jan 2008: ability to encode and decode compressed zTXt chunks added + Also various fixes, such as in the deflate and the padding bits code. +*) 13 jan 2008: Added ability to encode Adam7-interlaced images. Improved + filtering code of encoder. +*) 07 jan 2008: (!) changed LodePNG to use ISO C90 instead of C++. A + C++ wrapper around this provides an interface almost identical to before. + Having LodePNG be pure ISO C90 makes it more portable. The C and C++ code + are together in these files but it works both for C and C++ compilers. +*) 29 dec 2007: (!) changed most integer types to unsigned int + other tweaks +*) 30 aug 2007: bug fixed which makes this Borland C++ compatible +*) 09 aug 2007: some VS2005 warnings removed again +*) 21 jul 2007: deflate code placed in new namespace separate from zlib code +*) 08 jun 2007: fixed bug with 2- and 4-bit color, and small interlaced images +*) 04 jun 2007: improved support for Visual Studio 2005: crash with accessing + invalid std::vector element [0] fixed, and level 3 and 4 warnings removed +*) 02 jun 2007: made the encoder add a tag with version by default +*) 27 may 2007: zlib and png code separated (but still in the same file), + simple encoder/decoder functions added for more simple usage cases +*) 19 may 2007: minor fixes, some code cleaning, new error added (error 69), + moved some examples from here to lodepng_examples.cpp +*) 12 may 2007: palette decoding bug fixed +*) 24 apr 2007: changed the license from BSD to the zlib license +*) 11 mar 2007: very simple addition: ability to encode bKGD chunks. +*) 04 mar 2007: (!) tEXt chunk related fixes, and support for encoding + palettized PNG images. Plus little interface change with palette and texts. +*) 03 mar 2007: Made it encode dynamic Huffman shorter with repeat codes. + Fixed a bug where the end code of a block had length 0 in the Huffman tree. +*) 26 feb 2007: Huffman compression with dynamic trees (BTYPE 2) now implemented + and supported by the encoder, resulting in smaller PNGs at the output. +*) 27 jan 2007: Made the Adler-32 test faster so that a timewaste is gone. +*) 24 jan 2007: gave encoder an error interface. Added color conversion from any + greyscale type to 8-bit greyscale with or without alpha. +*) 21 jan 2007: (!) Totally changed the interface. It allows more color types + to convert to and is more uniform. See the manual for how it works now. +*) 07 jan 2007: Some cleanup & fixes, and a few changes over the last days: + encode/decode custom tEXt chunks, separate classes for zlib & deflate, and + at last made the decoder give errors for incorrect Adler32 or Crc. +*) 01 jan 2007: Fixed bug with encoding PNGs with less than 8 bits per channel. +*) 29 dec 2006: Added support for encoding images without alpha channel, and + cleaned out code as well as making certain parts faster. +*) 28 dec 2006: Added "Settings" to the encoder. +*) 26 dec 2006: The encoder now does LZ77 encoding and produces much smaller files now. + Removed some code duplication in the decoder. Fixed little bug in an example. +*) 09 dec 2006: (!) Placed output parameters of public functions as first parameter. + Fixed a bug of the decoder with 16-bit per color. +*) 15 okt 2006: Changed documentation structure +*) 09 okt 2006: Encoder class added. It encodes a valid PNG image from the + given image buffer, however for now it's not compressed. +*) 08 sep 2006: (!) Changed to interface with a Decoder class +*) 30 jul 2006: (!) LodePNG_InfoPng , width and height are now retrieved in different + way. Renamed decodePNG to decodePNGGeneric. +*) 29 jul 2006: (!) Changed the interface: image info is now returned as a + struct of type LodePNG::LodePNG_Info, instead of a vector, which was a bit clumsy. +*) 28 jul 2006: Cleaned the code and added new error checks. + Corrected terminology "deflate" into "inflate". +*) 23 jun 2006: Added SDL example in the documentation in the header, this + example allows easy debugging by displaying the PNG and its transparency. +*) 22 jun 2006: (!) Changed way to obtain error value. Added + loadFile function for convenience. Made decodePNG32 faster. +*) 21 jun 2006: (!) Changed type of info vector to unsigned. + Changed position of palette in info vector. Fixed an important bug that + happened on PNGs with an uncompressed block. +*) 16 jun 2006: Internally changed unsigned into unsigned where + needed, and performed some optimizations. +*) 07 jun 2006: (!) Renamed functions to decodePNG and placed them + in LodePNG namespace. Changed the order of the parameters. Rewrote the + documentation in the header. Renamed files to lodepng.cpp and lodepng.h +*) 22 apr 2006: Optimized and improved some code +*) 07 sep 2005: (!) Changed to std::vector interface +*) 12 aug 2005: Initial release (C++, decoder only) + + +13. contact information +----------------------- + +Feel free to contact me with suggestions, problems, comments, ... concerning +LodePNG. If you encounter a PNG image that doesn't work properly with this +decoder, feel free to send it and I'll use it to find and fix the problem. + +My email address is (puzzle the account and domain together with an @ symbol): +Domain: gmail dot com. +Account: lode dot vandevenne. + + +Copyright (c) 2005-2022 Lode Vandevenne +*/ diff --git a/inc/lvgl/src/libs/lodepng/lv_lodepng.c b/inc/lvgl/src/libs/lodepng/lv_lodepng.c new file mode 100644 index 0000000..4ec0b1d --- /dev/null +++ b/inc/lvgl/src/libs/lodepng/lv_lodepng.c @@ -0,0 +1,275 @@ +/** + * @file lv_lodepng.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_image_decoder_private.h" +#include "../../../lvgl.h" +#include "../../core/lv_global.h" +#if LV_USE_LODEPNG + +#include "lv_lodepng.h" +#include "lodepng.h" +#include + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "LODEPNG" + +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc); +static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt); +static lv_draw_buf_t * decode_png_data(const void * png_data, size_t png_data_size); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_lodepng_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_close_cb(dec, decoder_close); + + dec->name = DECODER_NAME; +} + +void lv_lodepng_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get info about a PNG image + * @param decoder pointer to the decoder where this function belongs + * @param dsc image descriptor containing the source and type of the image and other info. + * @param header image information is set in header parameter + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't get the info + */ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + LV_UNUSED(decoder); /*Unused*/ + + lv_image_src_t src_type = dsc->src_type; /*Get the source type*/ + + if(src_type == LV_IMAGE_SRC_FILE || src_type == LV_IMAGE_SRC_VARIABLE) { + uint32_t * size; + static const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; + uint8_t buf[24]; + + /*If it's a PNG file...*/ + if(src_type == LV_IMAGE_SRC_FILE) { + /* Read the width and height from the file. They have a constant location: + * [16..19]: width + * [20..23]: height + */ + uint32_t rn; + lv_fs_read(&dsc->file, buf, sizeof(buf), &rn); + + if(rn != sizeof(buf)) return LV_RESULT_INVALID; + + if(lv_memcmp(buf, magic, sizeof(magic)) != 0) return LV_RESULT_INVALID; + + size = (uint32_t *)&buf[16]; + } + /*If it's a PNG file in a C array...*/ + else { + const lv_image_dsc_t * img_dsc = dsc->src; + const uint32_t data_size = img_dsc->data_size; + size = ((uint32_t *)img_dsc->data) + 4; + + if(data_size < sizeof(magic)) return LV_RESULT_INVALID; + if(lv_memcmp(img_dsc->data, magic, sizeof(magic)) != 0) return LV_RESULT_INVALID; + } + + /*Save the data in the header*/ + header->cf = LV_COLOR_FORMAT_ARGB8888; + /*The width and height are stored in Big endian format so convert them to little endian*/ + header->w = (int32_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); + header->h = (int32_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); + + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; /*If didn't succeeded earlier then it's an error*/ +} + +/** + * Open a PNG image and decode it into dsc.decoded + * @param decoder pointer to the decoder where this function belongs + * @param dsc decoded image descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + LV_PROFILER_DECODER_BEGIN_TAG("lv_lodepng_decoder_open"); + + const uint8_t * png_data = NULL; + size_t png_data_size = 0; + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + + /*Load the file*/ + unsigned error = lodepng_load_file((void *)&png_data, &png_data_size, fn); + if(error) { + if(png_data != NULL) { + lv_free((void *)png_data); + } + LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + LV_PROFILER_DECODER_END_TAG("lv_lodepng_decoder_open"); + return LV_RESULT_INVALID; + } + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = dsc->src; + png_data = img_dsc->data; + png_data_size = img_dsc->data_size; + } + else { + LV_PROFILER_DECODER_END_TAG("lv_lodepng_decoder_open"); + return LV_RESULT_INVALID; + } + + lv_draw_buf_t * decoded = decode_png_data(png_data, png_data_size); + + if(dsc->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)png_data); + + if(!decoded) { + LV_LOG_WARN("Error decoding PNG"); + LV_PROFILER_DECODER_END_TAG("lv_lodepng_decoder_open"); + return LV_RESULT_INVALID; + } + + lv_draw_buf_t * adjusted = lv_image_decoder_post_process(dsc, decoded); + if(adjusted == NULL) { + lv_draw_buf_destroy(decoded); + LV_PROFILER_DECODER_END_TAG("lv_lodepng_decoder_open"); + return LV_RESULT_INVALID; + } + + /*The adjusted draw buffer is newly allocated.*/ + if(adjusted != decoded) { + lv_draw_buf_destroy(decoded); + decoded = adjusted; + } + + dsc->decoded = decoded; + + if(dsc->args.no_cache) { + LV_PROFILER_DECODER_END_TAG("lv_lodepng_decoder_open"); + return LV_RESULT_OK; + } + + /*If the image cache is disabled, just return the decoded image*/ + if(!lv_image_cache_is_enabled()) { + LV_PROFILER_DECODER_END_TAG("lv_lodepng_decoder_open"); + return LV_RESULT_OK; + } + + /*Add the decoded image to the cache*/ + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, decoded, NULL); + + if(entry == NULL) { + lv_draw_buf_destroy(decoded); + dsc->decoded = NULL; + LV_PROFILER_DECODER_END_TAG("lv_lodepng_decoder_open"); + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; + + LV_PROFILER_DECODER_END_TAG("lv_lodepng_decoder_open"); + return LV_RESULT_OK; /*If not returned earlier then it failed*/ +} + +/** + * Close PNG image and free data + * @param decoder pointer to the decoder where this function belongs + * @param dsc decoded image descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + if(dsc->args.no_cache || + !lv_image_cache_is_enabled()) lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); +} + +static lv_draw_buf_t * decode_png_data(const void * png_data, size_t png_data_size) +{ + unsigned png_width; /*Not used, just required by the decoder*/ + unsigned png_height; /*Not used, just required by the decoder*/ + lv_draw_buf_t * decoded = NULL; + + /*Decode the image in ARGB8888 */ + unsigned error = lodepng_decode32((unsigned char **)&decoded, &png_width, &png_height, png_data, png_data_size); + if(error) { + if(decoded != NULL) lv_draw_buf_destroy(decoded); + return NULL; + } + + /*Convert the image to the system's color depth*/ + convert_color_depth(decoded->data, png_width * png_height); + + return decoded; +} + +/** + * If the display is not in 32 bit format (ARGB888) then convert the image to the current color depth + * @param img the ARGB888 image + * @param px_cnt number of pixels in `img` + */ +static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt) +{ + lv_color32_t * img_argb = (lv_color32_t *)img_p; + uint32_t i; + for(i = 0; i < px_cnt; i++) { + uint8_t blue = img_argb[i].blue; + img_argb[i].blue = img_argb[i].red; + img_argb[i].red = blue; + } +} + +#endif /*LV_USE_LODEPNG*/ diff --git a/inc/lvgl/src/libs/lodepng/lv_lodepng.h b/inc/lvgl/src/libs/lodepng/lv_lodepng.h new file mode 100644 index 0000000..f3dc4b7 --- /dev/null +++ b/inc/lvgl/src/libs/lodepng/lv_lodepng.h @@ -0,0 +1,48 @@ +/** + * @file lv_lodepng.h + * + */ + +#ifndef LV_LODEPNG_H +#define LV_LODEPNG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_LODEPNG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register the PNG decoder functions in LVGL + */ +void lv_lodepng_init(void); + +void lv_lodepng_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LODEPNG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_LODEPNG_H*/ diff --git a/inc/lvgl/src/libs/lz4/LICENSE.txt b/inc/lvgl/src/libs/lz4/LICENSE.txt new file mode 100644 index 0000000..4884916 --- /dev/null +++ b/inc/lvgl/src/libs/lz4/LICENSE.txt @@ -0,0 +1,24 @@ +LZ4 Library +Copyright (c) 2011-2020, Yann Collet +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/inc/lvgl/src/libs/lz4/lz4.c b/inc/lvgl/src/libs/lz4/lz4.c new file mode 100644 index 0000000..852443a --- /dev/null +++ b/inc/lvgl/src/libs/lz4/lz4.c @@ -0,0 +1,2835 @@ +/* + LZ4 - Fast LZ compression algorithm + Copyright (C) 2011-2023, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ + +#include "../../lv_conf_internal.h" +#if LV_USE_LZ4_INTERNAL + +/*-************************************ +* Tuning parameters +**************************************/ +/* + * LZ4_HEAPMODE : + * Select how stateless compression functions like `LZ4_compress_default()` + * allocate memory for their hash table, + * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). + */ +#ifndef LZ4_HEAPMODE +# define LZ4_HEAPMODE 0 +#endif + +/* + * LZ4_ACCELERATION_DEFAULT : + * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 + */ +#define LZ4_ACCELERATION_DEFAULT 1 +/* + * LZ4_ACCELERATION_MAX : + * Any "acceleration" value higher than this threshold + * get treated as LZ4_ACCELERATION_MAX instead (fix #876) + */ +#define LZ4_ACCELERATION_MAX 65537 + + +/*-************************************ +* CPU Feature Detection +**************************************/ +/* LZ4_FORCE_MEMORY_ACCESS + * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. + * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. + * The below switch allow to select different access method for improved performance. + * Method 0 (default) : use `memcpy()`. Safe and portable. + * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). + * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. + * Method 2 : direct access. This method is portable but violate C standard. + * It can generate buggy code on targets which assembly generation depends on alignment. + * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) + * See https://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. + * Prefer these methods in priority order (0 > 1 > 2) + */ +#ifndef LZ4_FORCE_MEMORY_ACCESS /* can be defined externally */ +# if defined(__GNUC__) && \ + ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) \ + || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) +# define LZ4_FORCE_MEMORY_ACCESS 2 +# elif (defined(__INTEL_COMPILER) && !defined(_WIN32)) || defined(__GNUC__) || defined(_MSC_VER) +# define LZ4_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +/* + * LZ4_FORCE_SW_BITCOUNT + * Define this parameter if your target system or compiler does not support hardware bit count + */ +#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for WinCE doesn't support Hardware bit count */ +# undef LZ4_FORCE_SW_BITCOUNT /* avoid double def */ +# define LZ4_FORCE_SW_BITCOUNT +#endif + + + +/*-************************************ +* Dependency +**************************************/ +/* + * LZ4_SRC_INCLUDED: + * Amalgamation flag, whether lz4.c is included + */ +#ifndef LZ4_SRC_INCLUDED +# define LZ4_SRC_INCLUDED 1 +#endif + +#ifndef LZ4_DISABLE_DEPRECATE_WARNINGS +# define LZ4_DISABLE_DEPRECATE_WARNINGS /* due to LZ4_decompress_safe_withPrefix64k */ +#endif + +#ifndef LZ4_STATIC_LINKING_ONLY +# define LZ4_STATIC_LINKING_ONLY +#endif +#include "lz4.h" +/* see also "memory routines" below */ + + +/*-************************************ +* Compiler Options +**************************************/ +#if defined(_MSC_VER) && (_MSC_VER >= 1400) /* Visual Studio 2005+ */ +# include /* only present in VS2005+ */ +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +# pragma warning(disable : 6237) /* disable: C6237: conditional expression is always 0 */ +# pragma warning(disable : 6239) /* disable: C6239: ( && ) always evaluates to the result of */ +# pragma warning(disable : 6240) /* disable: C6240: ( && ) always evaluates to the result of */ +# pragma warning(disable : 6326) /* disable: C6326: Potential comparison of a constant with another constant */ +#endif /* _MSC_VER */ + +#ifndef LZ4_FORCE_INLINE +# if defined (_MSC_VER) && !defined (__clang__) /* MSVC */ +# define LZ4_FORCE_INLINE static __forceinline +# else +# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ +# if defined (__GNUC__) || defined (__clang__) +# define LZ4_FORCE_INLINE static inline __attribute__((always_inline)) +# else +# define LZ4_FORCE_INLINE static inline +# endif +# else +# define LZ4_FORCE_INLINE static +# endif /* __STDC_VERSION__ */ +# endif /* _MSC_VER */ +#endif /* LZ4_FORCE_INLINE */ + +/* LZ4_FORCE_O2 and LZ4_FORCE_INLINE + * gcc on ppc64le generates an unrolled SIMDized loop for LZ4_wildCopy8, + * together with a simple 8-byte copy loop as a fall-back path. + * However, this optimization hurts the decompression speed by >30%, + * because the execution does not go to the optimized loop + * for typical compressible data, and all of the preamble checks + * before going to the fall-back path become useless overhead. + * This optimization happens only with the -O3 flag, and -O2 generates + * a simple 8-byte copy loop. + * With gcc on ppc64le, all of the LZ4_decompress_* and LZ4_wildCopy8 + * functions are annotated with __attribute__((optimize("O2"))), + * and also LZ4_wildCopy8 is forcibly inlined, so that the O2 attribute + * of LZ4_wildCopy8 does not affect the compression speed. + */ +#if defined(__PPC64__) && defined(__LITTLE_ENDIAN__) && defined(__GNUC__) && !defined(__clang__) +# define LZ4_FORCE_O2 __attribute__((optimize("O2"))) +# undef LZ4_FORCE_INLINE +# define LZ4_FORCE_INLINE static __inline __attribute__((optimize("O2"),always_inline)) +#else +# define LZ4_FORCE_O2 +#endif + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__) +# define expect(expr,value) (__builtin_expect ((expr),(value)) ) +#else +# define expect(expr,value) (expr) +#endif + +#ifndef likely +#define likely(expr) expect((expr) != 0, 1) +#endif +#ifndef unlikely +#define unlikely(expr) expect((expr) != 0, 0) +#endif + +/* Should the alignment test prove unreliable, for some reason, + * it can be disabled by setting LZ4_ALIGN_TEST to 0 */ +#ifndef LZ4_ALIGN_TEST /* can be externally provided */ +# define LZ4_ALIGN_TEST 1 +#endif + + +/*-************************************ +* Memory routines +**************************************/ + +/*! LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION : + * Disable relatively high-level LZ4/HC functions that use dynamic memory + * allocation functions (malloc(), calloc(), free()). + * + * Note that this is a compile-time switch. And since it disables + * public/stable LZ4 v1 API functions, we don't recommend using this + * symbol to generate a library for distribution. + * + * The following public functions are removed when this symbol is defined. + * - lz4 : LZ4_createStream, LZ4_freeStream, + * LZ4_createStreamDecode, LZ4_freeStreamDecode, LZ4_create (deprecated) + * - lz4hc : LZ4_createStreamHC, LZ4_freeStreamHC, + * LZ4_createHC (deprecated), LZ4_freeHC (deprecated) + * - lz4frame, lz4file : All LZ4F_* functions + */ +#if defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +# define ALLOC(s) lz4_error_memory_allocation_is_disabled +# define ALLOC_AND_ZERO(s) lz4_error_memory_allocation_is_disabled +# define FREEMEM(p) lz4_error_memory_allocation_is_disabled +#elif defined(LZ4_USER_MEMORY_FUNCTIONS) +/* memory management functions can be customized by user project. + * Below functions must exist somewhere in the Project + * and be available at link time */ +void* LZ4_malloc(size_t s); +void* LZ4_calloc(size_t n, size_t s); +void LZ4_free(void* p); +# define ALLOC(s) LZ4_malloc(s) +# define ALLOC_AND_ZERO(s) LZ4_calloc(1,s) +# define FREEMEM(p) LZ4_free(p) +#else +# include /* malloc, calloc, free */ +# define ALLOC(s) malloc(s) +# define ALLOC_AND_ZERO(s) calloc(1,s) +# define FREEMEM(p) free(p) +#endif + +#if ! LZ4_FREESTANDING +# include /* memset, memcpy */ +#endif +#if !defined(LZ4_memset) +# define LZ4_memset(p,v,s) memset((p),(v),(s)) +#endif +#define MEM_INIT(p,v,s) LZ4_memset((p),(v),(s)) + + +/*-************************************ +* Common Constants +**************************************/ +#define MINMATCH 4 + +#define WILDCOPYLENGTH 8 +#define LASTLITERALS 5 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MFLIMIT 12 /* see ../doc/lz4_Block_format.md#parsing-restrictions */ +#define MATCH_SAFEGUARD_DISTANCE ((2*WILDCOPYLENGTH) - MINMATCH) /* ensure it's possible to write 2 x wildcopyLength without overflowing output buffer */ +#define FASTLOOP_SAFE_DISTANCE 64 +static const int LZ4_minLength = (MFLIMIT+1); + +#define KB *(1 <<10) +#define MB *(1 <<20) +#define GB *(1U<<30) + +#define LZ4_DISTANCE_ABSOLUTE_MAX 65535 +#if (LZ4_DISTANCE_MAX > LZ4_DISTANCE_ABSOLUTE_MAX) /* max supported by LZ4 format */ +# error "LZ4_DISTANCE_MAX is too big : must be <= 65535" +#endif + +#define ML_BITS 4 +#define ML_MASK ((1U<=1) +# include +#else +# ifndef assert +# define assert(condition) ((void)0) +# endif +#endif + +#define LZ4_STATIC_ASSERT(c) { enum { LZ4_static_assert = 1/(int)(!!(c)) }; } /* use after variable declarations */ + +#if defined(LZ4_DEBUG) && (LZ4_DEBUG>=2) +# include + static int g_debuglog_enable = 1; +# define DEBUGLOG(l, ...) { \ + if ((g_debuglog_enable) && (l<=LZ4_DEBUG)) { \ + fprintf(stderr, __FILE__ " %i: ", __LINE__); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " \n"); \ + } } +#else +# define DEBUGLOG(l, ...) {} /* disabled */ +#endif + +static int LZ4_isAligned(const void* ptr, size_t alignment) +{ + return ((size_t)ptr & (alignment -1)) == 0; +} + + +/*-************************************ +* Types +**************************************/ +#include +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef uint8_t BYTE; + typedef uint16_t U16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; + typedef uintptr_t uptrval; +#else +# if UINT_MAX != 4294967295UL +# error "LZ4 code (when not C++ or C99) assumes that sizeof(int) == 4" +# endif + typedef unsigned char BYTE; + typedef unsigned short U16; + typedef unsigned int U32; + typedef signed int S32; + typedef unsigned long long U64; + typedef size_t uptrval; /* generally true, except OpenVMS-64 */ +#endif + +#if defined(__x86_64__) + typedef U64 reg_t; /* 64-bits in x32 mode */ +#else + typedef size_t reg_t; /* 32-bits in x32 mode */ +#endif + +typedef enum { + notLimited = 0, + limitedOutput = 1, + fillOutput = 2 +} limitedOutput_directive; + + +/*-************************************ +* Reading and writing into memory +**************************************/ + +/** + * LZ4 relies on memcpy with a constant size being inlined. In freestanding + * environments, the compiler can't assume the implementation of memcpy() is + * standard compliant, so it can't apply its specialized memcpy() inlining + * logic. When possible, use __builtin_memcpy() to tell the compiler to analyze + * memcpy() as if it were standard compliant, so it can inline it in freestanding + * environments. This is needed when decompressing the Linux Kernel, for example. + */ +#if !defined(LZ4_memcpy) +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4_memcpy(dst, src, size) __builtin_memcpy(dst, src, size) +# else +# define LZ4_memcpy(dst, src, size) memcpy(dst, src, size) +# endif +#endif + +#if !defined(LZ4_memmove) +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4_memmove __builtin_memmove +# else +# define LZ4_memmove memmove +# endif +#endif + +static unsigned LZ4_isLittleEndian(void) +{ + const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +} + +#if defined(__GNUC__) || defined(__INTEL_COMPILER) +#define LZ4_PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__)) +#elif defined(_MSC_VER) +#define LZ4_PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop)) +#endif + +#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) +/* lie to the compiler about data alignment; use with caution */ + +static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } +static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } +static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } + +static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } +static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } + +#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) + +/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ +/* currently only defined for gcc and icc */ +LZ4_PACK(typedef struct { U16 u16; }) LZ4_unalign16; +LZ4_PACK(typedef struct { U32 u32; }) LZ4_unalign32; +LZ4_PACK(typedef struct { reg_t uArch; }) LZ4_unalignST; + +static U16 LZ4_read16(const void* ptr) { return ((const LZ4_unalign16*)ptr)->u16; } +static U32 LZ4_read32(const void* ptr) { return ((const LZ4_unalign32*)ptr)->u32; } +static reg_t LZ4_read_ARCH(const void* ptr) { return ((const LZ4_unalignST*)ptr)->uArch; } + +static void LZ4_write16(void* memPtr, U16 value) { ((LZ4_unalign16*)memPtr)->u16 = value; } +static void LZ4_write32(void* memPtr, U32 value) { ((LZ4_unalign32*)memPtr)->u32 = value; } + +#else /* safe and portable access using memcpy() */ + +static U16 LZ4_read16(const void* memPtr) +{ + U16 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static U32 LZ4_read32(const void* memPtr) +{ + U32 val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static reg_t LZ4_read_ARCH(const void* memPtr) +{ + reg_t val; LZ4_memcpy(&val, memPtr, sizeof(val)); return val; +} + +static void LZ4_write16(void* memPtr, U16 value) +{ + LZ4_memcpy(memPtr, &value, sizeof(value)); +} + +static void LZ4_write32(void* memPtr, U32 value) +{ + LZ4_memcpy(memPtr, &value, sizeof(value)); +} + +#endif /* LZ4_FORCE_MEMORY_ACCESS */ + + +static U16 LZ4_readLE16(const void* memPtr) +{ + if (LZ4_isLittleEndian()) { + return LZ4_read16(memPtr); + } else { + const BYTE* p = (const BYTE*)memPtr; + return (U16)((U16)p[0] | (p[1]<<8)); + } +} + +#ifdef LZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT +static U32 LZ4_readLE32(const void* memPtr) +{ + if (LZ4_isLittleEndian()) { + return LZ4_read32(memPtr); + } else { + const BYTE* p = (const BYTE*)memPtr; + return (U32)p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24); + } +} +#endif + +static void LZ4_writeLE16(void* memPtr, U16 value) +{ + if (LZ4_isLittleEndian()) { + LZ4_write16(memPtr, value); + } else { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE) value; + p[1] = (BYTE)(value>>8); + } +} + +/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ +LZ4_FORCE_INLINE +void LZ4_wildCopy8(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_memcpy(d,s,8); d+=8; s+=8; } while (d= 16. */ +LZ4_FORCE_INLINE void +LZ4_wildCopy32(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_memcpy(d,s,16); LZ4_memcpy(d+16,s+16,16); d+=32; s+=32; } while (d= dstPtr + MINMATCH + * - there is at least 12 bytes available to write after dstEnd */ +LZ4_FORCE_INLINE void +LZ4_memcpy_using_offset(BYTE* dstPtr, const BYTE* srcPtr, BYTE* dstEnd, const size_t offset) +{ + BYTE v[8]; + + assert(dstEnd >= dstPtr + MINMATCH); + + switch(offset) { + case 1: + MEM_INIT(v, *srcPtr, 8); + break; + case 2: + LZ4_memcpy(v, srcPtr, 2); + LZ4_memcpy(&v[2], srcPtr, 2); +#if defined(_MSC_VER) && (_MSC_VER <= 1937) /* MSVC 2022 ver 17.7 or earlier */ +# pragma warning(push) +# pragma warning(disable : 6385) /* warning C6385: Reading invalid data from 'v'. */ +#endif + LZ4_memcpy(&v[4], v, 4); +#if defined(_MSC_VER) && (_MSC_VER <= 1937) /* MSVC 2022 ver 17.7 or earlier */ +# pragma warning(pop) +#endif + break; + case 4: + LZ4_memcpy(v, srcPtr, 4); + LZ4_memcpy(&v[4], srcPtr, 4); + break; + default: + LZ4_memcpy_using_offset_base(dstPtr, srcPtr, dstEnd, offset); + return; + } + + LZ4_memcpy(dstPtr, v, 8); + dstPtr += 8; + while (dstPtr < dstEnd) { + LZ4_memcpy(dstPtr, v, 8); + dstPtr += 8; + } +} +#endif + + +/*-************************************ +* Common functions +**************************************/ +static unsigned LZ4_NbCommonBytes (reg_t val) +{ + assert(val != 0); + if (LZ4_isLittleEndian()) { + if (sizeof(val) == 8) { +# if defined(_MSC_VER) && (_MSC_VER >= 1800) && (defined(_M_AMD64) && !defined(_M_ARM64EC)) && !defined(LZ4_FORCE_SW_BITCOUNT) +/*-************************************************************************************************* +* ARM64EC is a Microsoft-designed ARM64 ABI compatible with AMD64 applications on ARM64 Windows 11. +* The ARM64EC ABI does not support AVX/AVX2/AVX512 instructions, nor their relevant intrinsics +* including _tzcnt_u64. Therefore, we need to neuter the _tzcnt_u64 code path for ARM64EC. +****************************************************************************************************/ +# if defined(__clang__) && (__clang_major__ < 10) + /* Avoid undefined clang-cl intrinsics issue. + * See https://github.com/lz4/lz4/pull/1017 for details. */ + return (unsigned)__builtin_ia32_tzcnt_u64(val) >> 3; +# else + /* x64 CPUS without BMI support interpret `TZCNT` as `REP BSF` */ + return (unsigned)_tzcnt_u64(val) >> 3; +# endif +# elif defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanForward64(&r, (U64)val); + return (unsigned)r >> 3; +# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_ctzll((U64)val) >> 3; +# else + const U64 m = 0x0101010101010101ULL; + val ^= val - 1; + return (unsigned)(((U64)((val & (m - 1)) * m)) >> 56); +# endif + } else /* 32 bits */ { +# if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r; + _BitScanForward(&r, (U32)val); + return (unsigned)r >> 3; +# elif (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_ctz((U32)val) >> 3; +# else + const U32 m = 0x01010101; + return (unsigned)((((val - 1) ^ val) & (m - 1)) * m) >> 24; +# endif + } + } else /* Big Endian CPU */ { + if (sizeof(val)==8) { +# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(__TINYC__) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_clzll((U64)val) >> 3; +# else +#if 1 + /* this method is probably faster, + * but adds a 128 bytes lookup table */ + static const unsigned char ctz7_tab[128] = { + 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + }; + U64 const mask = 0x0101010101010101ULL; + U64 const t = (((val >> 8) - mask) | val) & mask; + return ctz7_tab[(t * 0x0080402010080402ULL) >> 57]; +#else + /* this method doesn't consume memory space like the previous one, + * but it contains several branches, + * that may end up slowing execution */ + static const U32 by32 = sizeof(val)*4; /* 32 on 64 bits (goal), 16 on 32 bits. + Just to avoid some static analyzer complaining about shift by 32 on 32-bits target. + Note that this code path is never triggered in 32-bits mode. */ + unsigned r; + if (!(val>>by32)) { r=4; } else { r=0; val>>=by32; } + if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + r += (!val); + return r; +#endif +# endif + } else /* 32 bits */ { +# if (defined(__clang__) || (defined(__GNUC__) && ((__GNUC__ > 3) || \ + ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))))) && \ + !defined(LZ4_FORCE_SW_BITCOUNT) + return (unsigned)__builtin_clz((U32)val) >> 3; +# else + val >>= 8; + val = ((((val + 0x00FFFF00) | 0x00FFFFFF) + val) | + (val + 0x00FF0000)) >> 24; + return (unsigned)val ^ 3; +# endif + } + } +} + + +#define STEPSIZE sizeof(reg_t) +LZ4_FORCE_INLINE +unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) +{ + const BYTE* const pStart = pIn; + + if (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { + pIn+=STEPSIZE; pMatch+=STEPSIZE; + } else { + return LZ4_NbCommonBytes(diff); + } } + + while (likely(pIn < pInLimit-(STEPSIZE-1))) { + reg_t const diff = LZ4_read_ARCH(pMatch) ^ LZ4_read_ARCH(pIn); + if (!diff) { pIn+=STEPSIZE; pMatch+=STEPSIZE; continue; } + pIn += LZ4_NbCommonBytes(diff); + return (unsigned)(pIn - pStart); + } + + if ((STEPSIZE==8) && (pIn<(pInLimit-3)) && (LZ4_read32(pMatch) == LZ4_read32(pIn))) { pIn+=4; pMatch+=4; } + if ((pIn<(pInLimit-1)) && (LZ4_read16(pMatch) == LZ4_read16(pIn))) { pIn+=2; pMatch+=2; } + if ((pIn compression run slower on incompressible data */ + + +/*-************************************ +* Local Structures and types +**************************************/ +typedef enum { clearedTable = 0, byPtr, byU32, byU16 } tableType_t; + +/** + * This enum distinguishes several different modes of accessing previous + * content in the stream. + * + * - noDict : There is no preceding content. + * - withPrefix64k : Table entries up to ctx->dictSize before the current blob + * blob being compressed are valid and refer to the preceding + * content (of length ctx->dictSize), which is available + * contiguously preceding in memory the content currently + * being compressed. + * - usingExtDict : Like withPrefix64k, but the preceding content is somewhere + * else in memory, starting at ctx->dictionary with length + * ctx->dictSize. + * - usingDictCtx : Everything concerning the preceding content is + * in a separate context, pointed to by ctx->dictCtx. + * ctx->dictionary, ctx->dictSize, and table entries + * in the current context that refer to positions + * preceding the beginning of the current compression are + * ignored. Instead, ctx->dictCtx->dictionary and ctx->dictCtx + * ->dictSize describe the location and size of the preceding + * content, and matches are found by looking in the ctx + * ->dictCtx->hashTable. + */ +typedef enum { noDict = 0, withPrefix64k, usingExtDict, usingDictCtx } dict_directive; +typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; + + +/*-************************************ +* Local Utils +**************************************/ +int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } +const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } +int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } +int LZ4_sizeofState(void) { return sizeof(LZ4_stream_t); } + + +/*-**************************************** +* Internal Definitions, used only in Tests +*******************************************/ +#if defined (__cplusplus) +extern "C" { +#endif + +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize); + +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize); +int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, + int compressedSize, int targetOutputSize, int dstCapacity, + const void* dictStart, size_t dictSize); +#if defined (__cplusplus) +} +#endif + +/*-****************************** +* Compression functions +********************************/ +LZ4_FORCE_INLINE U32 LZ4_hash4(U32 sequence, tableType_t const tableType) +{ + if (tableType == byU16) + return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); + else + return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); +} + +LZ4_FORCE_INLINE U32 LZ4_hash5(U64 sequence, tableType_t const tableType) +{ + const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; + if (LZ4_isLittleEndian()) { + const U64 prime5bytes = 889523592379ULL; + return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); + } else { + const U64 prime8bytes = 11400714785074694791ULL; + return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog)); + } +} + +LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) +{ + if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); + +#ifdef LZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT + return LZ4_hash4(LZ4_readLE32(p), tableType); +#else + return LZ4_hash4(LZ4_read32(p), tableType); +#endif +} + +LZ4_FORCE_INLINE void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: { /* illegal! */ assert(0); return; } + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = NULL; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = 0; return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = 0; return; } + } +} + +LZ4_FORCE_INLINE void LZ4_putIndexOnHash(U32 idx, U32 h, void* tableBase, tableType_t const tableType) +{ + switch (tableType) + { + default: /* fallthrough */ + case clearedTable: /* fallthrough */ + case byPtr: { /* illegal! */ assert(0); return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = idx; return; } + case byU16: { U16* hashTable = (U16*) tableBase; assert(idx < 65536); hashTable[h] = (U16)idx; return; } + } +} + +/* LZ4_putPosition*() : only used in byPtr mode */ +LZ4_FORCE_INLINE void LZ4_putPositionOnHash(const BYTE* p, U32 h, + void* tableBase, tableType_t const tableType) +{ + const BYTE** const hashTable = (const BYTE**)tableBase; + assert(tableType == byPtr); (void)tableType; + hashTable[h] = p; +} + +LZ4_FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType) +{ + U32 const h = LZ4_hashPosition(p, tableType); + LZ4_putPositionOnHash(p, h, tableBase, tableType); +} + +/* LZ4_getIndexOnHash() : + * Index of match position registered in hash table. + * hash position must be calculated by using base+index, or dictBase+index. + * Assumption 1 : only valid if tableType == byU32 or byU16. + * Assumption 2 : h is presumed valid (within limits of hash table) + */ +LZ4_FORCE_INLINE U32 LZ4_getIndexOnHash(U32 h, const void* tableBase, tableType_t tableType) +{ + LZ4_STATIC_ASSERT(LZ4_MEMORY_USAGE > 2); + if (tableType == byU32) { + const U32* const hashTable = (const U32*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-2))); + return hashTable[h]; + } + if (tableType == byU16) { + const U16* const hashTable = (const U16*) tableBase; + assert(h < (1U << (LZ4_MEMORY_USAGE-1))); + return hashTable[h]; + } + assert(0); return 0; /* forbidden case */ +} + +static const BYTE* LZ4_getPositionOnHash(U32 h, const void* tableBase, tableType_t tableType) +{ + assert(tableType == byPtr); (void)tableType; + { const BYTE* const* hashTable = (const BYTE* const*) tableBase; return hashTable[h]; } +} + +LZ4_FORCE_INLINE const BYTE* +LZ4_getPosition(const BYTE* p, + const void* tableBase, tableType_t tableType) +{ + U32 const h = LZ4_hashPosition(p, tableType); + return LZ4_getPositionOnHash(h, tableBase, tableType); +} + +LZ4_FORCE_INLINE void +LZ4_prepareTable(LZ4_stream_t_internal* const cctx, + const int inputSize, + const tableType_t tableType) { + /* If the table hasn't been used, it's guaranteed to be zeroed out, and is + * therefore safe to use no matter what mode we're in. Otherwise, we figure + * out if it's safe to leave as is or whether it needs to be reset. + */ + if ((tableType_t)cctx->tableType != clearedTable) { + assert(inputSize >= 0); + if ((tableType_t)cctx->tableType != tableType + || ((tableType == byU16) && cctx->currentOffset + (unsigned)inputSize >= 0xFFFFU) + || ((tableType == byU32) && cctx->currentOffset > 1 GB) + || tableType == byPtr + || inputSize >= 4 KB) + { + DEBUGLOG(4, "LZ4_prepareTable: Resetting table in %p", cctx); + MEM_INIT(cctx->hashTable, 0, LZ4_HASHTABLESIZE); + cctx->currentOffset = 0; + cctx->tableType = (U32)clearedTable; + } else { + DEBUGLOG(4, "LZ4_prepareTable: Re-use hash table (no reset)"); + } + } + + /* Adding a gap, so all previous entries are > LZ4_DISTANCE_MAX back, + * is faster than compressing without a gap. + * However, compressing with currentOffset == 0 is faster still, + * so we preserve that case. + */ + if (cctx->currentOffset != 0 && tableType == byU32) { + DEBUGLOG(5, "LZ4_prepareTable: adding 64KB to currentOffset"); + cctx->currentOffset += 64 KB; + } + + /* Finally, clear history */ + cctx->dictCtx = NULL; + cctx->dictionary = NULL; + cctx->dictSize = 0; +} + +/** LZ4_compress_generic_validated() : + * inlined, to ensure branches are decided at compilation time. + * The following conditions are presumed already validated: + * - source != NULL + * - inputSize > 0 + */ +LZ4_FORCE_INLINE int LZ4_compress_generic_validated( + LZ4_stream_t_internal* const cctx, + const char* const source, + char* const dest, + const int inputSize, + int* inputConsumed, /* only written when outputDirective == fillOutput */ + const int maxOutputSize, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) +{ + int result; + const BYTE* ip = (const BYTE*)source; + + U32 const startIndex = cctx->currentOffset; + const BYTE* base = (const BYTE*)source - startIndex; + const BYTE* lowLimit; + + const LZ4_stream_t_internal* dictCtx = (const LZ4_stream_t_internal*) cctx->dictCtx; + const BYTE* const dictionary = + dictDirective == usingDictCtx ? dictCtx->dictionary : cctx->dictionary; + const U32 dictSize = + dictDirective == usingDictCtx ? dictCtx->dictSize : cctx->dictSize; + const U32 dictDelta = + (dictDirective == usingDictCtx) ? startIndex - dictCtx->currentOffset : 0; /* make indexes in dictCtx comparable with indexes in current context */ + + int const maybe_extMem = (dictDirective == usingExtDict) || (dictDirective == usingDictCtx); + U32 const prefixIdxLimit = startIndex - dictSize; /* used when dictDirective == dictSmall */ + const BYTE* const dictEnd = dictionary ? dictionary + dictSize : dictionary; + const BYTE* anchor = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimitPlusOne = iend - MFLIMIT + 1; + const BYTE* const matchlimit = iend - LASTLITERALS; + + /* the dictCtx currentOffset is indexed on the start of the dictionary, + * while a dictionary in the current context precedes the currentOffset */ + const BYTE* dictBase = (dictionary == NULL) ? NULL : + (dictDirective == usingDictCtx) ? + dictionary + dictSize - dictCtx->currentOffset : + dictionary + dictSize - startIndex; + + BYTE* op = (BYTE*) dest; + BYTE* const olimit = op + maxOutputSize; + + U32 offset = 0; + U32 forwardH; + + DEBUGLOG(5, "LZ4_compress_generic_validated: srcSize=%i, tableType=%u", inputSize, tableType); + assert(ip != NULL); + if (tableType == byU16) assert(inputSize= 1); + + lowLimit = (const BYTE*)source - (dictDirective == withPrefix64k ? dictSize : 0); + + /* Update context state */ + if (dictDirective == usingDictCtx) { + /* Subsequent linked blocks can't use the dictionary. */ + /* Instead, they use the block we just compressed. */ + cctx->dictCtx = NULL; + cctx->dictSize = (U32)inputSize; + } else { + cctx->dictSize += (U32)inputSize; + } + cctx->currentOffset += (U32)inputSize; + cctx->tableType = (U32)tableType; + + if (inputSizehashTable, byPtr); + } else { + LZ4_putIndexOnHash(startIndex, h, cctx->hashTable, tableType); + } } + ip++; forwardH = LZ4_hashPosition(ip, tableType); + + /* Main Loop */ + for ( ; ; ) { + const BYTE* match; + BYTE* token; + const BYTE* filledIp; + + /* Find a match */ + if (tableType == byPtr) { + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType); + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType); + + } while ( (match+LZ4_DISTANCE_MAX < ip) + || (LZ4_read32(match) != LZ4_read32(ip)) ); + + } else { /* byU32, byU16 */ + + const BYTE* forwardIp = ip; + int step = 1; + int searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + U32 const current = (U32)(forwardIp - base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex <= current); + assert(forwardIp - base < (ptrdiff_t)(2 GB - 1)); + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimitPlusOne)) goto _last_literals; + assert(ip < mflimitPlusOne); + + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + assert(tableType == byU32); + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + matchIndex += dictDelta; /* make dictCtx index comparable with current context */ + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else if (dictDirective == usingExtDict) { + if (matchIndex < startIndex) { + DEBUGLOG(7, "extDict candidate: matchIndex=%5u < startIndex=%5u", matchIndex, startIndex); + assert(startIndex - matchIndex >= MINMATCH); + assert(dictBase); + match = dictBase + matchIndex; + lowLimit = dictionary; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; + } + } else { /* single continuous memory segment */ + match = base + matchIndex; + } + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + + DEBUGLOG(7, "candidate at pos=%u (offset=%u \n", matchIndex, current - matchIndex); + if ((dictIssue == dictSmall) && (matchIndex < prefixIdxLimit)) { continue; } /* match outside of valid area */ + assert(matchIndex < current); + if ( ((tableType != byU16) || (LZ4_DISTANCE_MAX < LZ4_DISTANCE_ABSOLUTE_MAX)) + && (matchIndex+LZ4_DISTANCE_MAX < current)) { + continue; + } /* too far */ + assert((current - matchIndex) <= LZ4_DISTANCE_MAX); /* match now expected within distance */ + + if (LZ4_read32(match) == LZ4_read32(ip)) { + if (maybe_extMem) offset = current - matchIndex; + break; /* match found */ + } + + } while(1); + } + + /* Catch up */ + filledIp = ip; + assert(ip > anchor); /* this is always true as ip has been advanced before entering the main loop */ + if ((match > lowLimit) && unlikely(ip[-1] == match[-1])) { + do { ip--; match--; } while (((ip > anchor) & (match > lowLimit)) && (unlikely(ip[-1] == match[-1]))); + } + + /* Encode Literals */ + { unsigned const litLength = (unsigned)(ip - anchor); + token = op++; + if ((outputDirective == limitedOutput) && /* Check output buffer overflow */ + (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit)) ) { + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + if ((outputDirective == fillOutput) && + (unlikely(op + (litLength+240)/255 /* litlen */ + litLength /* literals */ + 2 /* offset */ + 1 /* token */ + MFLIMIT - MINMATCH /* min last literals so last match is <= end - MFLIMIT */ > olimit))) { + op--; + goto _last_literals; + } + if (litLength >= RUN_MASK) { + unsigned len = litLength - RUN_MASK; + *token = (RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< olimit)) { + /* the match was too close to the end, rewind and go to last literals */ + op = token; + goto _last_literals; + } + + /* Encode Offset */ + if (maybe_extMem) { /* static test */ + DEBUGLOG(6, " with offset=%u (ext if > %i)", offset, (int)(ip - (const BYTE*)source)); + assert(offset <= LZ4_DISTANCE_MAX && offset > 0); + LZ4_writeLE16(op, (U16)offset); op+=2; + } else { + DEBUGLOG(6, " with offset=%u (same segment)", (U32)(ip - match)); + assert(ip-match <= LZ4_DISTANCE_MAX); + LZ4_writeLE16(op, (U16)(ip - match)); op+=2; + } + + /* Encode MatchLength */ + { unsigned matchCode; + + if ( (dictDirective==usingExtDict || dictDirective==usingDictCtx) + && (lowLimit==dictionary) /* match within extDict */ ) { + const BYTE* limit = ip + (dictEnd-match); + assert(dictEnd > match); + if (limit > matchlimit) limit = matchlimit; + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); + ip += (size_t)matchCode + MINMATCH; + if (ip==limit) { + unsigned const more = LZ4_count(limit, (const BYTE*)source, matchlimit); + matchCode += more; + ip += more; + } + DEBUGLOG(6, " with matchLength=%u starting in extDict", matchCode+MINMATCH); + } else { + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); + ip += (size_t)matchCode + MINMATCH; + DEBUGLOG(6, " with matchLength=%u", matchCode+MINMATCH); + } + + if ((outputDirective) && /* Check output buffer overflow */ + (unlikely(op + (1 + LASTLITERALS) + (matchCode+240)/255 > olimit)) ) { + if (outputDirective == fillOutput) { + /* Match description too long : reduce it */ + U32 newMatchCode = 15 /* in token */ - 1 /* to avoid needing a zero byte */ + ((U32)(olimit - op) - 1 - LASTLITERALS) * 255; + ip -= matchCode - newMatchCode; + assert(newMatchCode < matchCode); + matchCode = newMatchCode; + if (unlikely(ip <= filledIp)) { + /* We have already filled up to filledIp so if ip ends up less than filledIp + * we have positions in the hash table beyond the current position. This is + * a problem if we reuse the hash table. So we have to remove these positions + * from the hash table. + */ + const BYTE* ptr; + DEBUGLOG(5, "Clearing %u positions", (U32)(filledIp - ip)); + for (ptr = ip; ptr <= filledIp; ++ptr) { + U32 const h = LZ4_hashPosition(ptr, tableType); + LZ4_clearHash(h, cctx->hashTable, tableType); + } + } + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + if (matchCode >= ML_MASK) { + *token += ML_MASK; + matchCode -= ML_MASK; + LZ4_write32(op, 0xFFFFFFFF); + while (matchCode >= 4*255) { + op+=4; + LZ4_write32(op, 0xFFFFFFFF); + matchCode -= 4*255; + } + op += matchCode / 255; + *op++ = (BYTE)(matchCode % 255); + } else + *token += (BYTE)(matchCode); + } + /* Ensure we have enough space for the last literals. */ + assert(!(outputDirective == fillOutput && op + 1 + LASTLITERALS > olimit)); + + anchor = ip; + + /* Test end of chunk */ + if (ip >= mflimitPlusOne) break; + + /* Fill table */ + { U32 const h = LZ4_hashPosition(ip-2, tableType); + if (tableType == byPtr) { + LZ4_putPositionOnHash(ip-2, h, cctx->hashTable, byPtr); + } else { + U32 const idx = (U32)((ip-2) - base); + LZ4_putIndexOnHash(idx, h, cctx->hashTable, tableType); + } } + + /* Test next position */ + if (tableType == byPtr) { + + match = LZ4_getPosition(ip, cctx->hashTable, tableType); + LZ4_putPosition(ip, cctx->hashTable, tableType); + if ( (match+LZ4_DISTANCE_MAX >= ip) + && (LZ4_read32(match) == LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + } else { /* byU32, byU16 */ + + U32 const h = LZ4_hashPosition(ip, tableType); + U32 const current = (U32)(ip-base); + U32 matchIndex = LZ4_getIndexOnHash(h, cctx->hashTable, tableType); + assert(matchIndex < current); + if (dictDirective == usingDictCtx) { + if (matchIndex < startIndex) { + /* there was no match, try the dictionary */ + assert(tableType == byU32); + matchIndex = LZ4_getIndexOnHash(h, dictCtx->hashTable, byU32); + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + matchIndex += dictDelta; + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else if (dictDirective==usingExtDict) { + if (matchIndex < startIndex) { + assert(dictBase); + match = dictBase + matchIndex; + lowLimit = dictionary; /* required for match length counter */ + } else { + match = base + matchIndex; + lowLimit = (const BYTE*)source; /* required for match length counter */ + } + } else { /* single memory segment */ + match = base + matchIndex; + } + LZ4_putIndexOnHash(current, h, cctx->hashTable, tableType); + assert(matchIndex < current); + if ( ((dictIssue==dictSmall) ? (matchIndex >= prefixIdxLimit) : 1) + && (((tableType==byU16) && (LZ4_DISTANCE_MAX == LZ4_DISTANCE_ABSOLUTE_MAX)) ? 1 : (matchIndex+LZ4_DISTANCE_MAX >= current)) + && (LZ4_read32(match) == LZ4_read32(ip)) ) { + token=op++; + *token=0; + if (maybe_extMem) offset = current - matchIndex; + DEBUGLOG(6, "seq.start:%i, literals=%u, match.start:%i", + (int)(anchor-(const BYTE*)source), 0, (int)(ip-(const BYTE*)source)); + goto _next_match; + } + } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + + } + +_last_literals: + /* Encode Last Literals */ + { size_t lastRun = (size_t)(iend - anchor); + if ( (outputDirective) && /* Check output buffer overflow */ + (op + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > olimit)) { + if (outputDirective == fillOutput) { + /* adapt lastRun to fill 'dst' */ + assert(olimit >= op); + lastRun = (size_t)(olimit-op) - 1/*token*/; + lastRun -= (lastRun + 256 - RUN_MASK) / 256; /*additional length tokens*/ + } else { + assert(outputDirective == limitedOutput); + return 0; /* cannot compress within `dst` budget. Stored indexes in hash table are nonetheless fine */ + } + } + DEBUGLOG(6, "Final literal run : %i literals", (int)lastRun); + if (lastRun >= RUN_MASK) { + size_t accumulator = lastRun - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRun< 0); + DEBUGLOG(5, "LZ4_compress_generic: compressed %i bytes into %i bytes", inputSize, result); + return result; +} + +/** LZ4_compress_generic() : + * inlined, to ensure branches are decided at compilation time; + * takes care of src == (NULL, 0) + * and forward the rest to LZ4_compress_generic_validated */ +LZ4_FORCE_INLINE int LZ4_compress_generic( + LZ4_stream_t_internal* const cctx, + const char* const src, + char* const dst, + const int srcSize, + int *inputConsumed, /* only written when outputDirective == fillOutput */ + const int dstCapacity, + const limitedOutput_directive outputDirective, + const tableType_t tableType, + const dict_directive dictDirective, + const dictIssue_directive dictIssue, + const int acceleration) +{ + DEBUGLOG(5, "LZ4_compress_generic: srcSize=%i, dstCapacity=%i", + srcSize, dstCapacity); + + if ((U32)srcSize > (U32)LZ4_MAX_INPUT_SIZE) { return 0; } /* Unsupported srcSize, too large (or negative) */ + if (srcSize == 0) { /* src == NULL supported if srcSize == 0 */ + if (outputDirective != notLimited && dstCapacity <= 0) return 0; /* no output, can't write anything */ + DEBUGLOG(5, "Generating an empty block"); + assert(outputDirective == notLimited || dstCapacity >= 1); + assert(dst != NULL); + dst[0] = 0; + if (outputDirective == fillOutput) { + assert (inputConsumed != NULL); + *inputConsumed = 0; + } + return 1; + } + assert(src != NULL); + + return LZ4_compress_generic_validated(cctx, src, dst, srcSize, + inputConsumed, /* only written into if outputDirective == fillOutput */ + dstCapacity, outputDirective, + tableType, dictDirective, dictIssue, acceleration); +} + + +int LZ4_compress_fast_extState(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t_internal* const ctx = & LZ4_initStream(state, sizeof(LZ4_stream_t)) -> internal_donotuse; + assert(ctx != NULL); + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + if (maxOutputSize >= LZ4_compressBound(inputSize)) { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (inputSize < LZ4_64Klimit) { + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)source > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(ctx, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + +/** + * LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. It is only safe + * to call if the state buffer is known to be correctly initialized already + * (see comment in lz4.h on LZ4_resetStream_fast() for a definition of + * "correctly initialized"). + */ +int LZ4_compress_fast_extState_fastReset(void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration) +{ + LZ4_stream_t_internal* const ctx = &((LZ4_stream_t*)state)->internal_donotuse; + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + assert(ctx != NULL); + + if (dstCapacity >= LZ4_compressBound(srcSize)) { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, 0, notLimited, tableType, noDict, noDictIssue, acceleration); + } + } else { + if (srcSize < LZ4_64Klimit) { + const tableType_t tableType = byU16; + LZ4_prepareTable(ctx, srcSize, tableType); + if (ctx->currentOffset) { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, dictSmall, acceleration); + } else { + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } else { + const tableType_t tableType = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + LZ4_prepareTable(ctx, srcSize, tableType); + return LZ4_compress_generic(ctx, src, dst, srcSize, NULL, dstCapacity, limitedOutput, tableType, noDict, noDictIssue, acceleration); + } + } +} + + +int LZ4_compress_fast(const char* src, char* dest, int srcSize, int dstCapacity, int acceleration) +{ + int result; +#if (LZ4_HEAPMODE) + LZ4_stream_t* const ctxPtr = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctxPtr == NULL) return 0; +#else + LZ4_stream_t ctx; + LZ4_stream_t* const ctxPtr = &ctx; +#endif + result = LZ4_compress_fast_extState(ctxPtr, src, dest, srcSize, dstCapacity, acceleration); + +#if (LZ4_HEAPMODE) + FREEMEM(ctxPtr); +#endif + return result; +} + + +int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity) +{ + return LZ4_compress_fast(src, dst, srcSize, dstCapacity, 1); +} + + +/* Note!: This function leaves the stream in an unclean/broken state! + * It is not safe to subsequently use the same state with a _fastReset() or + * _continue() call without resetting it. */ +static int LZ4_compress_destSize_extState_internal(LZ4_stream_t* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize, int acceleration) +{ + void* const s = LZ4_initStream(state, sizeof (*state)); + assert(s != NULL); (void)s; + + if (targetDstSize >= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ + return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, acceleration); + } else { + if (*srcSizePtr < LZ4_64Klimit) { + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, byU16, noDict, noDictIssue, acceleration); + } else { + tableType_t const addrMode = ((sizeof(void*)==4) && ((uptrval)src > LZ4_DISTANCE_MAX)) ? byPtr : byU32; + return LZ4_compress_generic(&state->internal_donotuse, src, dst, *srcSizePtr, srcSizePtr, targetDstSize, fillOutput, addrMode, noDict, noDictIssue, acceleration); + } } +} + +int LZ4_compress_destSize_extState(void* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize, int acceleration) +{ + int const r = LZ4_compress_destSize_extState_internal((LZ4_stream_t*)state, src, dst, srcSizePtr, targetDstSize, acceleration); + /* clean the state on exit */ + LZ4_initStream(state, sizeof (LZ4_stream_t)); + return r; +} + + +int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ +#if (LZ4_HEAPMODE) + LZ4_stream_t* const ctx = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ + if (ctx == NULL) return 0; +#else + LZ4_stream_t ctxBody; + LZ4_stream_t* const ctx = &ctxBody; +#endif + + int result = LZ4_compress_destSize_extState_internal(ctx, src, dst, srcSizePtr, targetDstSize, 1); + +#if (LZ4_HEAPMODE) + FREEMEM(ctx); +#endif + return result; +} + + + +/*-****************************** +* Streaming functions +********************************/ + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4_stream_t* LZ4_createStream(void) +{ + LZ4_stream_t* const lz4s = (LZ4_stream_t*)ALLOC(sizeof(LZ4_stream_t)); + LZ4_STATIC_ASSERT(sizeof(LZ4_stream_t) >= sizeof(LZ4_stream_t_internal)); + DEBUGLOG(4, "LZ4_createStream %p", lz4s); + if (lz4s == NULL) return NULL; + LZ4_initStream(lz4s, sizeof(*lz4s)); + return lz4s; +} +#endif + +static size_t LZ4_stream_t_alignment(void) +{ +#if LZ4_ALIGN_TEST + typedef struct { char c; LZ4_stream_t t; } t_a; + return sizeof(t_a) - sizeof(LZ4_stream_t); +#else + return 1; /* effectively disabled */ +#endif +} + +LZ4_stream_t* LZ4_initStream (void* buffer, size_t size) +{ + DEBUGLOG(5, "LZ4_initStream"); + if (buffer == NULL) { return NULL; } + if (size < sizeof(LZ4_stream_t)) { return NULL; } + if (!LZ4_isAligned(buffer, LZ4_stream_t_alignment())) return NULL; + MEM_INIT(buffer, 0, sizeof(LZ4_stream_t_internal)); + return (LZ4_stream_t*)buffer; +} + +/* resetStream is now deprecated, + * prefer initStream() which is more general */ +void LZ4_resetStream (LZ4_stream_t* LZ4_stream) +{ + DEBUGLOG(5, "LZ4_resetStream (ctx:%p)", LZ4_stream); + MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t_internal)); +} + +void LZ4_resetStream_fast(LZ4_stream_t* ctx) { + LZ4_prepareTable(&(ctx->internal_donotuse), 0, byU32); +} + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +int LZ4_freeStream (LZ4_stream_t* LZ4_stream) +{ + if (!LZ4_stream) return 0; /* support free on NULL */ + DEBUGLOG(5, "LZ4_freeStream %p", LZ4_stream); + FREEMEM(LZ4_stream); + return (0); +} +#endif + + +typedef enum { _ld_fast, _ld_slow } LoadDict_mode_e; +#define HASH_UNIT sizeof(reg_t) +static int LZ4_loadDict_internal(LZ4_stream_t* LZ4_dict, + const char* dictionary, int dictSize, + LoadDict_mode_e _ld) +{ + LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; + const tableType_t tableType = byU32; + const BYTE* p = (const BYTE*)dictionary; + const BYTE* const dictEnd = p + dictSize; + U32 idx32; + + DEBUGLOG(4, "LZ4_loadDict (%i bytes from %p into %p)", dictSize, dictionary, LZ4_dict); + + /* It's necessary to reset the context, + * and not just continue it with prepareTable() + * to avoid any risk of generating overflowing matchIndex + * when compressing using this dictionary */ + LZ4_resetStream(LZ4_dict); + + /* We always increment the offset by 64 KB, since, if the dict is longer, + * we truncate it to the last 64k, and if it's shorter, we still want to + * advance by a whole window length so we can provide the guarantee that + * there are only valid offsets in the window, which allows an optimization + * in LZ4_compress_fast_continue() where it uses noDictIssue even when the + * dictionary isn't a full 64k. */ + dict->currentOffset += 64 KB; + + if (dictSize < (int)HASH_UNIT) { + return 0; + } + + if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; + dict->dictionary = p; + dict->dictSize = (U32)(dictEnd - p); + dict->tableType = (U32)tableType; + idx32 = dict->currentOffset - dict->dictSize; + + while (p <= dictEnd-HASH_UNIT) { + U32 const h = LZ4_hashPosition(p, tableType); + /* Note: overwriting => favors positions end of dictionary */ + LZ4_putIndexOnHash(idx32, h, dict->hashTable, tableType); + p+=3; idx32+=3; + } + + if (_ld == _ld_slow) { + /* Fill hash table with additional references, to improve compression capability */ + p = dict->dictionary; + idx32 = dict->currentOffset - dict->dictSize; + while (p <= dictEnd-HASH_UNIT) { + U32 const h = LZ4_hashPosition(p, tableType); + U32 const limit = dict->currentOffset - 64 KB; + if (LZ4_getIndexOnHash(h, dict->hashTable, tableType) <= limit) { + /* Note: not overwriting => favors positions beginning of dictionary */ + LZ4_putIndexOnHash(idx32, h, dict->hashTable, tableType); + } + p++; idx32++; + } + } + + return (int)dict->dictSize; +} + +int LZ4_loadDict(LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + return LZ4_loadDict_internal(LZ4_dict, dictionary, dictSize, _ld_fast); +} + +int LZ4_loadDictSlow(LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + return LZ4_loadDict_internal(LZ4_dict, dictionary, dictSize, _ld_slow); +} + +void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream) +{ + const LZ4_stream_t_internal* dictCtx = (dictionaryStream == NULL) ? NULL : + &(dictionaryStream->internal_donotuse); + + DEBUGLOG(4, "LZ4_attach_dictionary (%p, %p, size %u)", + workingStream, dictionaryStream, + dictCtx != NULL ? dictCtx->dictSize : 0); + + if (dictCtx != NULL) { + /* If the current offset is zero, we will never look in the + * external dictionary context, since there is no value a table + * entry can take that indicate a miss. In that case, we need + * to bump the offset to something non-zero. + */ + if (workingStream->internal_donotuse.currentOffset == 0) { + workingStream->internal_donotuse.currentOffset = 64 KB; + } + + /* Don't actually attach an empty dictionary. + */ + if (dictCtx->dictSize == 0) { + dictCtx = NULL; + } + } + workingStream->internal_donotuse.dictCtx = dictCtx; +} + + +static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, int nextSize) +{ + assert(nextSize >= 0); + if (LZ4_dict->currentOffset + (unsigned)nextSize > 0x80000000) { /* potential ptrdiff_t overflow (32-bits mode) */ + /* rescale hash table */ + U32 const delta = LZ4_dict->currentOffset - 64 KB; + const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; + int i; + DEBUGLOG(4, "LZ4_renormDictT"); + for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; + else LZ4_dict->hashTable[i] -= delta; + } + LZ4_dict->currentOffset = 64 KB; + if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; + LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; + } +} + + +int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, + const char* source, char* dest, + int inputSize, int maxOutputSize, + int acceleration) +{ + const tableType_t tableType = byU32; + LZ4_stream_t_internal* const streamPtr = &LZ4_stream->internal_donotuse; + const char* dictEnd = streamPtr->dictSize ? (const char*)streamPtr->dictionary + streamPtr->dictSize : NULL; + + DEBUGLOG(5, "LZ4_compress_fast_continue (inputSize=%i, dictSize=%u)", inputSize, streamPtr->dictSize); + + LZ4_renormDictT(streamPtr, inputSize); /* fix index overflow */ + if (acceleration < 1) acceleration = LZ4_ACCELERATION_DEFAULT; + if (acceleration > LZ4_ACCELERATION_MAX) acceleration = LZ4_ACCELERATION_MAX; + + /* invalidate tiny dictionaries */ + if ( (streamPtr->dictSize < 4) /* tiny dictionary : not enough for a hash */ + && (dictEnd != source) /* prefix mode */ + && (inputSize > 0) /* tolerance : don't lose history, in case next invocation would use prefix mode */ + && (streamPtr->dictCtx == NULL) /* usingDictCtx */ + ) { + DEBUGLOG(5, "LZ4_compress_fast_continue: dictSize(%u) at addr:%p is too small", streamPtr->dictSize, streamPtr->dictionary); + /* remove dictionary existence from history, to employ faster prefix mode */ + streamPtr->dictSize = 0; + streamPtr->dictionary = (const BYTE*)source; + dictEnd = source; + } + + /* Check overlapping input/dictionary space */ + { const char* const sourceEnd = source + inputSize; + if ((sourceEnd > (const char*)streamPtr->dictionary) && (sourceEnd < dictEnd)) { + streamPtr->dictSize = (U32)(dictEnd - sourceEnd); + if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; + if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; + streamPtr->dictionary = (const BYTE*)dictEnd - streamPtr->dictSize; + } + } + + /* prefix mode : source data follows dictionary */ + if (dictEnd == source) { + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, dictSmall, acceleration); + else + return LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, withPrefix64k, noDictIssue, acceleration); + } + + /* external dictionary mode */ + { int result; + if (streamPtr->dictCtx) { + /* We depend here on the fact that dictCtx'es (produced by + * LZ4_loadDict) guarantee that their tables contain no references + * to offsets between dictCtx->currentOffset - 64 KB and + * dictCtx->currentOffset - dictCtx->dictSize. This makes it safe + * to use noDictIssue even when the dict isn't a full 64 KB. + */ + if (inputSize > 4 KB) { + /* For compressing large blobs, it is faster to pay the setup + * cost to copy the dictionary's tables into the active context, + * so that the compression loop is only looking into one table. + */ + LZ4_memcpy(streamPtr, streamPtr->dictCtx, sizeof(*streamPtr)); + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingDictCtx, noDictIssue, acceleration); + } + } else { /* small data <= 4 KB */ + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, dictSmall, acceleration); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, NULL, maxOutputSize, limitedOutput, tableType, usingExtDict, noDictIssue, acceleration); + } + } + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + return result; + } +} + + +/* Hidden debug function, to force-test external dictionary mode */ +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int srcSize) +{ + LZ4_stream_t_internal* const streamPtr = &LZ4_dict->internal_donotuse; + int result; + + LZ4_renormDictT(streamPtr, srcSize); + + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, dictSmall, 1); + } else { + result = LZ4_compress_generic(streamPtr, source, dest, srcSize, NULL, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); + } + + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)srcSize; + + return result; +} + + +/*! LZ4_saveDict() : + * If previously compressed data block is not guaranteed to remain available at its memory location, + * save it into a safer place (char* safeBuffer). + * Note : no need to call LZ4_loadDict() afterwards, dictionary is immediately usable, + * one can therefore call LZ4_compress_fast_continue() right after. + * @return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. + */ +int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) +{ + LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; + + DEBUGLOG(5, "LZ4_saveDict : dictSize=%i, safeBuffer=%p", dictSize, safeBuffer); + + if ((U32)dictSize > 64 KB) { dictSize = 64 KB; } /* useless to define a dictionary > 64 KB */ + if ((U32)dictSize > dict->dictSize) { dictSize = (int)dict->dictSize; } + + if (safeBuffer == NULL) assert(dictSize == 0); + if (dictSize > 0) { + const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; + assert(dict->dictionary); + LZ4_memmove(safeBuffer, previousDictEnd - dictSize, (size_t)dictSize); + } + + dict->dictionary = (const BYTE*)safeBuffer; + dict->dictSize = (U32)dictSize; + + return dictSize; +} + + + +/*-******************************* + * Decompression functions + ********************************/ + +typedef enum { decode_full_block = 0, partial_decode = 1 } earlyEnd_directive; + +#undef MIN +#define MIN(a,b) ( (a) < (b) ? (a) : (b) ) + + +/* variant for decompress_unsafe() + * does not know end of input + * presumes input is well formed + * note : will consume at least one byte */ +static size_t read_long_length_no_check(const BYTE** pp) +{ + size_t b, l = 0; + do { b = **pp; (*pp)++; l += b; } while (b==255); + DEBUGLOG(6, "read_long_length_no_check: +length=%zu using %zu input bytes", l, l/255 + 1) + return l; +} + +/* core decoder variant for LZ4_decompress_fast*() + * for legacy support only : these entry points are deprecated. + * - Presumes input is correctly formed (no defense vs malformed inputs) + * - Does not know input size (presume input buffer is "large enough") + * - Decompress a full block (only) + * @return : nb of bytes read from input. + * Note : this variant is not optimized for speed, just for maintenance. + * the goal is to remove support of decompress_fast*() variants by v2.0 +**/ +LZ4_FORCE_INLINE int +LZ4_decompress_unsafe_generic( + const BYTE* const istart, + BYTE* const ostart, + int decompressedSize, + + size_t prefixSize, + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note: =0 if dictStart==NULL */ + ) +{ + const BYTE* ip = istart; + BYTE* op = (BYTE*)ostart; + BYTE* const oend = ostart + decompressedSize; + const BYTE* const prefixStart = ostart - prefixSize; + + DEBUGLOG(5, "LZ4_decompress_unsafe_generic"); + if (dictStart == NULL) assert(dictSize == 0); + + while (1) { + /* start new sequence */ + unsigned token = *ip++; + + /* literals */ + { size_t ll = token >> ML_BITS; + if (ll==15) { + /* long literal length */ + ll += read_long_length_no_check(&ip); + } + if ((size_t)(oend-op) < ll) return -1; /* output buffer overflow */ + LZ4_memmove(op, ip, ll); /* support in-place decompression */ + op += ll; + ip += ll; + if ((size_t)(oend-op) < MFLIMIT) { + if (op==oend) break; /* end of block */ + DEBUGLOG(5, "invalid: literals end at distance %zi from end of block", oend-op); + /* incorrect end of block : + * last match must start at least MFLIMIT==12 bytes before end of output block */ + return -1; + } } + + /* match */ + { size_t ml = token & 15; + size_t const offset = LZ4_readLE16(ip); + ip+=2; + + if (ml==15) { + /* long literal length */ + ml += read_long_length_no_check(&ip); + } + ml += MINMATCH; + + if ((size_t)(oend-op) < ml) return -1; /* output buffer overflow */ + + { const BYTE* match = op - offset; + + /* out of range */ + if (offset > (size_t)(op - prefixStart) + dictSize) { + DEBUGLOG(6, "offset out of range"); + return -1; + } + + /* check special case : extDict */ + if (offset > (size_t)(op - prefixStart)) { + /* extDict scenario */ + const BYTE* const dictEnd = dictStart + dictSize; + const BYTE* extMatch = dictEnd - (offset - (size_t)(op-prefixStart)); + size_t const extml = (size_t)(dictEnd - extMatch); + if (extml > ml) { + /* match entirely within extDict */ + LZ4_memmove(op, extMatch, ml); + op += ml; + ml = 0; + } else { + /* match split between extDict & prefix */ + LZ4_memmove(op, extMatch, extml); + op += extml; + ml -= extml; + } + match = prefixStart; + } + + /* match copy - slow variant, supporting overlap copy */ + { size_t u; + for (u=0; u= ipmax before start of loop. Returns initial_error if so. + * @error (output) - error code. Must be set to 0 before call. +**/ +typedef size_t Rvl_t; +static const Rvl_t rvl_error = (Rvl_t)(-1); +LZ4_FORCE_INLINE Rvl_t +read_variable_length(const BYTE** ip, const BYTE* ilimit, + int initial_check) +{ + Rvl_t s, length = 0; + assert(ip != NULL); + assert(*ip != NULL); + assert(ilimit != NULL); + if (initial_check && unlikely((*ip) >= ilimit)) { /* read limit reached */ + return rvl_error; + } + s = **ip; + (*ip)++; + length += s; + if (unlikely((*ip) > ilimit)) { /* read limit reached */ + return rvl_error; + } + /* accumulator overflow detection (32-bit mode only) */ + if ((sizeof(length) < 8) && unlikely(length > ((Rvl_t)(-1)/2)) ) { + return rvl_error; + } + if (likely(s != 255)) return length; + do { + s = **ip; + (*ip)++; + length += s; + if (unlikely((*ip) > ilimit)) { /* read limit reached */ + return rvl_error; + } + /* accumulator overflow detection (32-bit mode only) */ + if ((sizeof(length) < 8) && unlikely(length > ((Rvl_t)(-1)/2)) ) { + return rvl_error; + } + } while (s == 255); + + return length; +} + +/*! LZ4_decompress_generic() : + * This generic decompression function covers all use cases. + * It shall be instantiated several times, using different sets of directives. + * Note that it is important for performance that this function really get inlined, + * in order to remove useless branches during compilation optimization. + */ +LZ4_FORCE_INLINE int +LZ4_decompress_generic( + const char* const src, + char* const dst, + int srcSize, + int outputSize, /* If endOnInput==endOnInputSize, this value is `dstCapacity` */ + + earlyEnd_directive partialDecoding, /* full, partial */ + dict_directive dict, /* noDict, withPrefix64k, usingExtDict */ + const BYTE* const lowPrefix, /* always <= dst, == dst when no prefix */ + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note : = 0 if noDict */ + ) +{ + if ((src == NULL) || (outputSize < 0)) { return -1; } + + { const BYTE* ip = (const BYTE*) src; + const BYTE* const iend = ip + srcSize; + + BYTE* op = (BYTE*) dst; + BYTE* const oend = op + outputSize; + BYTE* cpy; + + const BYTE* const dictEnd = (dictStart == NULL) ? NULL : dictStart + dictSize; + + const int checkOffset = (dictSize < (int)(64 KB)); + + + /* Set up the "end" pointers for the shortcut. */ + const BYTE* const shortiend = iend - 14 /*maxLL*/ - 2 /*offset*/; + const BYTE* const shortoend = oend - 14 /*maxLL*/ - 18 /*maxML*/; + + const BYTE* match; + size_t offset; + unsigned token; + size_t length; + + + DEBUGLOG(5, "LZ4_decompress_generic (srcSize:%i, dstSize:%i)", srcSize, outputSize); + + /* Special cases */ + assert(lowPrefix <= op); + if (unlikely(outputSize==0)) { + /* Empty output buffer */ + if (partialDecoding) return 0; + return ((srcSize==1) && (*ip==0)) ? 0 : -1; + } + if (unlikely(srcSize==0)) { return -1; } + + /* LZ4_FAST_DEC_LOOP: + * designed for modern OoO performance cpus, + * where copying reliably 32-bytes is preferable to an unpredictable branch. + * note : fast loop may show a regression for some client arm chips. */ +#if LZ4_FAST_DEC_LOOP + if ((oend - op) < FASTLOOP_SAFE_DISTANCE) { + DEBUGLOG(6, "move to safe decode loop"); + goto safe_decode; + } + + /* Fast loop : decode sequences as long as output < oend-FASTLOOP_SAFE_DISTANCE */ + DEBUGLOG(6, "using fast decode loop"); + while (1) { + /* Main fastloop assertion: We can always wildcopy FASTLOOP_SAFE_DISTANCE */ + assert(oend - op >= FASTLOOP_SAFE_DISTANCE); + assert(ip < iend); + token = *ip++; + length = token >> ML_BITS; /* literal length */ + DEBUGLOG(7, "blockPos%6u: litLength token = %u", (unsigned)(op-(BYTE*)dst), (unsigned)length); + + /* decode literal length */ + if (length == RUN_MASK) { + size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); + if (addl == rvl_error) { + DEBUGLOG(6, "error reading long literal length"); + goto _output_error; + } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + + /* copy literals */ + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if ((op+length>oend-32) || (ip+length>iend-32)) { goto safe_literal_copy; } + LZ4_wildCopy32(op, ip, op+length); + ip += length; op += length; + } else if (ip <= iend-(16 + 1/*max lit + offset + nextToken*/)) { + /* We don't need to check oend, since we check it once for each loop below */ + DEBUGLOG(7, "copy %u bytes in a 16-bytes stripe", (unsigned)length); + /* Literals can only be <= 14, but hope compilers optimize better when copy by a register size */ + LZ4_memcpy(op, ip, 16); + ip += length; op += length; + } else { + goto safe_literal_copy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + DEBUGLOG(6, "blockPos%6u: offset = %u", (unsigned)(op-(BYTE*)dst), (unsigned)offset); + match = op - offset; + assert(match <= op); /* overflow check */ + + /* get matchlength */ + length = token & ML_MASK; + DEBUGLOG(7, " match length token = %u (len==%u)", (unsigned)length, (unsigned)length+MINMATCH); + + if (length == ML_MASK) { + size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); + if (addl == rvl_error) { + DEBUGLOG(5, "error reading long match length"); + goto _output_error; + } + length += addl; + length += MINMATCH; + DEBUGLOG(7, " long match length == %u", (unsigned)length); + if (unlikely((uptrval)(op)+length<(uptrval)op)) { goto _output_error; } /* overflow detection */ + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + goto safe_match_copy; + } + } else { + length += MINMATCH; + if (op + length >= oend - FASTLOOP_SAFE_DISTANCE) { + DEBUGLOG(7, "moving to safe_match_copy (ml==%u)", (unsigned)length); + goto safe_match_copy; + } + + /* Fastpath check: skip LZ4_wildCopy32 when true */ + if ((dict == withPrefix64k) || (match >= lowPrefix)) { + if (offset >= 8) { + assert(match >= lowPrefix); + assert(match <= op); + assert(op + 18 <= oend); + + LZ4_memcpy(op, match, 8); + LZ4_memcpy(op+8, match+8, 8); + LZ4_memcpy(op+16, match+16, 2); + op += length; + continue; + } } } + + if ( checkOffset && (unlikely(match + dictSize < lowPrefix)) ) { + DEBUGLOG(5, "Error : pos=%zi, offset=%zi => outside buffers", op-lowPrefix, op-match); + goto _output_error; + } + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + assert(dictEnd != NULL); + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) { + DEBUGLOG(7, "partialDecoding: dictionary match, close to dstEnd"); + length = MIN(length, (size_t)(oend-op)); + } else { + DEBUGLOG(6, "end-of-block condition violated") + goto _output_error; + } } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + LZ4_memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + LZ4_memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) { *op++ = *copyFrom++; } + } else { + LZ4_memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + + /* copy match within block */ + cpy = op + length; + + assert((op <= oend) && (oend-op >= 32)); + if (unlikely(offset<16)) { + LZ4_memcpy_using_offset(op, match, cpy, offset); + } else { + LZ4_wildCopy32(op, match, cpy); + } + + op = cpy; /* wildcopy correction */ + } + safe_decode: +#endif + + /* Main Loop : decode remaining sequences where output < FASTLOOP_SAFE_DISTANCE */ + DEBUGLOG(6, "using safe decode loop"); + while (1) { + assert(ip < iend); + token = *ip++; + length = token >> ML_BITS; /* literal length */ + DEBUGLOG(7, "blockPos%6u: litLength token = %u", (unsigned)(op-(BYTE*)dst), (unsigned)length); + + /* A two-stage shortcut for the most common case: + * 1) If the literal length is 0..14, and there is enough space, + * enter the shortcut and copy 16 bytes on behalf of the literals + * (in the fast mode, only 8 bytes can be safely copied this way). + * 2) Further if the match length is 4..18, copy 18 bytes in a similar + * manner; but we ensure that there's enough space in the output for + * those 18 bytes earlier, upon entering the shortcut (in other words, + * there is a combined check for both stages). + */ + if ( (length != RUN_MASK) + /* strictly "less than" on input, to re-enter the loop with at least one byte */ + && likely((ip < shortiend) & (op <= shortoend)) ) { + /* Copy the literals */ + LZ4_memcpy(op, ip, 16); + op += length; ip += length; + + /* The second stage: prepare for match copying, decode full info. + * If it doesn't work out, the info won't be wasted. */ + length = token & ML_MASK; /* match length */ + DEBUGLOG(7, "blockPos%6u: matchLength token = %u (len=%u)", (unsigned)(op-(BYTE*)dst), (unsigned)length, (unsigned)length + 4); + offset = LZ4_readLE16(ip); ip += 2; + match = op - offset; + assert(match <= op); /* check overflow */ + + /* Do not deal with overlapping matches. */ + if ( (length != ML_MASK) + && (offset >= 8) + && (dict==withPrefix64k || match >= lowPrefix) ) { + /* Copy the match. */ + LZ4_memcpy(op + 0, match + 0, 8); + LZ4_memcpy(op + 8, match + 8, 8); + LZ4_memcpy(op +16, match +16, 2); + op += length + MINMATCH; + /* Both stages worked, load the next token. */ + continue; + } + + /* The second stage didn't work out, but the info is ready. + * Propel it right to the point of match copying. */ + goto _copy_match; + } + + /* decode literal length */ + if (length == RUN_MASK) { + size_t const addl = read_variable_length(&ip, iend-RUN_MASK, 1); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)(op))) { goto _output_error; } /* overflow detection */ + if (unlikely((uptrval)(ip)+length<(uptrval)(ip))) { goto _output_error; } /* overflow detection */ + } + +#if LZ4_FAST_DEC_LOOP + safe_literal_copy: +#endif + /* copy literals */ + cpy = op+length; + + LZ4_STATIC_ASSERT(MFLIMIT >= WILDCOPYLENGTH); + if ((cpy>oend-MFLIMIT) || (ip+length>iend-(2+1+LASTLITERALS))) { + /* We've either hit the input parsing restriction or the output parsing restriction. + * In the normal scenario, decoding a full block, it must be the last sequence, + * otherwise it's an error (invalid input or dimensions). + * In partialDecoding scenario, it's necessary to ensure there is no buffer overflow. + */ + if (partialDecoding) { + /* Since we are partial decoding we may be in this block because of the output parsing + * restriction, which is not valid since the output buffer is allowed to be undersized. + */ + DEBUGLOG(7, "partialDecoding: copying literals, close to input or output end") + DEBUGLOG(7, "partialDecoding: literal length = %u", (unsigned)length); + DEBUGLOG(7, "partialDecoding: remaining space in dstBuffer : %i", (int)(oend - op)); + DEBUGLOG(7, "partialDecoding: remaining space in srcBuffer : %i", (int)(iend - ip)); + /* Finishing in the middle of a literals segment, + * due to lack of input. + */ + if (ip+length > iend) { + length = (size_t)(iend-ip); + cpy = op + length; + } + /* Finishing in the middle of a literals segment, + * due to lack of output space. + */ + if (cpy > oend) { + cpy = oend; + assert(op<=oend); + length = (size_t)(oend-op); + } + } else { + /* We must be on the last sequence (or invalid) because of the parsing limitations + * so check that we exactly consume the input and don't overrun the output buffer. + */ + if ((ip+length != iend) || (cpy > oend)) { + DEBUGLOG(5, "should have been last run of literals") + DEBUGLOG(5, "ip(%p) + length(%i) = %p != iend (%p)", ip, (int)length, ip+length, iend); + DEBUGLOG(5, "or cpy(%p) > (oend-MFLIMIT)(%p)", cpy, oend-MFLIMIT); + DEBUGLOG(5, "after writing %u bytes / %i bytes available", (unsigned)(op-(BYTE*)dst), outputSize); + goto _output_error; + } + } + LZ4_memmove(op, ip, length); /* supports overlapping memory regions, for in-place decompression scenarios */ + ip += length; + op += length; + /* Necessarily EOF when !partialDecoding. + * When partialDecoding, it is EOF if we've either + * filled the output buffer or + * can't proceed with reading an offset for following match. + */ + if (!partialDecoding || (cpy == oend) || (ip >= (iend-2))) { + break; + } + } else { + LZ4_wildCopy8(op, ip, cpy); /* can overwrite up to 8 bytes beyond cpy */ + ip += length; op = cpy; + } + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + + /* get matchlength */ + length = token & ML_MASK; + DEBUGLOG(7, "blockPos%6u: matchLength token = %u", (unsigned)(op-(BYTE*)dst), (unsigned)length); + + _copy_match: + if (length == ML_MASK) { + size_t const addl = read_variable_length(&ip, iend - LASTLITERALS + 1, 0); + if (addl == rvl_error) { goto _output_error; } + length += addl; + if (unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ + } + length += MINMATCH; + +#if LZ4_FAST_DEC_LOOP + safe_match_copy: +#endif + if ((checkOffset) && (unlikely(match + dictSize < lowPrefix))) goto _output_error; /* Error : offset outside buffers */ + /* match starting within external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + assert(dictEnd != NULL); + if (unlikely(op+length > oend-LASTLITERALS)) { + if (partialDecoding) length = MIN(length, (size_t)(oend-op)); + else goto _output_error; /* doesn't respect parsing restriction */ + } + + if (length <= (size_t)(lowPrefix-match)) { + /* match fits entirely within external dictionary : just copy */ + LZ4_memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match stretches into both external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix - match); + size_t const restSize = length - copySize; + LZ4_memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op - lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) *op++ = *copyFrom++; + } else { + LZ4_memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + assert(match >= lowPrefix); + + /* copy match within block */ + cpy = op + length; + + /* partialDecoding : may end anywhere within the block */ + assert(op<=oend); + if (partialDecoding && (cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + size_t const mlen = MIN(length, (size_t)(oend-op)); + const BYTE* const matchEnd = match + mlen; + BYTE* const copyEnd = op + mlen; + if (matchEnd > op) { /* overlap copy */ + while (op < copyEnd) { *op++ = *match++; } + } else { + LZ4_memcpy(op, match, mlen); + } + op = copyEnd; + if (op == oend) { break; } + continue; + } + + if (unlikely(offset<8)) { + LZ4_write32(op, 0); /* silence msan warning when offset==0 */ + op[0] = match[0]; + op[1] = match[1]; + op[2] = match[2]; + op[3] = match[3]; + match += inc32table[offset]; + LZ4_memcpy(op+4, match, 4); + match -= dec64table[offset]; + } else { + LZ4_memcpy(op, match, 8); + match += 8; + } + op += 8; + + if (unlikely(cpy > oend-MATCH_SAFEGUARD_DISTANCE)) { + BYTE* const oCopyLimit = oend - (WILDCOPYLENGTH-1); + if (cpy > oend-LASTLITERALS) { goto _output_error; } /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ + if (op < oCopyLimit) { + LZ4_wildCopy8(op, match, oCopyLimit); + match += oCopyLimit - op; + op = oCopyLimit; + } + while (op < cpy) { *op++ = *match++; } + } else { + LZ4_memcpy(op, match, 8); + if (length > 16) { LZ4_wildCopy8(op+8, match+8, cpy); } + } + op = cpy; /* wildcopy correction */ + } + + /* end of decoding */ + DEBUGLOG(5, "decoded %i bytes", (int) (((char*)op)-dst)); + return (int) (((char*)op)-dst); /* Nb of output bytes decoded */ + + /* Overflow error detected */ + _output_error: + return (int) (-(((const char*)ip)-src))-1; + } +} + + +/*===== Instantiate the API decoding functions. =====*/ + +LZ4_FORCE_O2 +int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, + decode_full_block, noDict, + (BYTE*)dest, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_partial(const char* src, char* dst, int compressedSize, int targetOutputSize, int dstCapacity) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(src, dst, compressedSize, dstCapacity, + partial_decode, + noDict, (BYTE*)dst, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_fast(const char* source, char* dest, int originalSize) +{ + DEBUGLOG(5, "LZ4_decompress_fast"); + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 0, NULL, 0); +} + +/*===== Instantiate a few more decoding cases, used more than once. =====*/ + +LZ4_FORCE_O2 /* Exported, an obsolete API function. */ +int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_partial_withPrefix64k(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, withPrefix64k, + (BYTE*)dest - 64 KB, NULL, 0); +} + +/* Another obsolete API function, paired with the previous one. */ +int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 64 KB, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_withSmallPrefix(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, noDict, + (BYTE*)dest-prefixSize, NULL, 0); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_safe_partial_withSmallPrefix(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, + size_t prefixSize) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, noDict, + (BYTE*)dest-prefixSize, NULL, 0); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, + int compressedSize, int maxOutputSize, + const void* dictStart, size_t dictSize) +{ + DEBUGLOG(5, "LZ4_decompress_safe_forceExtDict"); + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_O2 +int LZ4_decompress_safe_partial_forceExtDict(const char* source, char* dest, + int compressedSize, int targetOutputSize, int dstCapacity, + const void* dictStart, size_t dictSize) +{ + dstCapacity = MIN(targetOutputSize, dstCapacity); + return LZ4_decompress_generic(source, dest, compressedSize, dstCapacity, + partial_decode, usingExtDict, + (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +LZ4_FORCE_O2 +static int LZ4_decompress_fast_extDict(const char* source, char* dest, int originalSize, + const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + 0, (const BYTE*)dictStart, dictSize); +} + +/* The "double dictionary" mode, for use with e.g. ring buffers: the first part + * of the dictionary is passed as prefix, and the second via dictStart + dictSize. + * These routines are used only once, in LZ4_decompress_*_continue(). + */ +LZ4_FORCE_INLINE +int LZ4_decompress_safe_doubleDict(const char* source, char* dest, int compressedSize, int maxOutputSize, + size_t prefixSize, const void* dictStart, size_t dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + decode_full_block, usingExtDict, + (BYTE*)dest-prefixSize, (const BYTE*)dictStart, dictSize); +} + +/*===== streaming decompression functions =====*/ + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4_streamDecode_t* LZ4_createStreamDecode(void) +{ + LZ4_STATIC_ASSERT(sizeof(LZ4_streamDecode_t) >= sizeof(LZ4_streamDecode_t_internal)); + return (LZ4_streamDecode_t*) ALLOC_AND_ZERO(sizeof(LZ4_streamDecode_t)); +} + +int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) +{ + if (LZ4_stream == NULL) { return 0; } /* support free on NULL */ + FREEMEM(LZ4_stream); + return 0; +} +#endif + +/*! LZ4_setStreamDecode() : + * Use this function to instruct where to find the dictionary. + * This function is not necessary if previous data is still available where it was decoded. + * Loading a size of 0 is allowed (same effect as no dictionary). + * @return : 1 if OK, 0 if error + */ +int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + lz4sd->prefixSize = (size_t)dictSize; + if (dictSize) { + assert(dictionary != NULL); + lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; + } else { + lz4sd->prefixEnd = (const BYTE*) dictionary; + } + lz4sd->externalDict = NULL; + lz4sd->extDictSize = 0; + return 1; +} + +/*! LZ4_decoderRingBufferSize() : + * when setting a ring buffer for streaming decompression (optional scenario), + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * Note : in a ring buffer scenario, + * blocks are presumed decompressed next to each other. + * When not enough space remains for next block (remainingSize < maxBlockSize), + * decoding resumes from beginning of ring buffer. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +int LZ4_decoderRingBufferSize(int maxBlockSize) +{ + if (maxBlockSize < 0) return 0; + if (maxBlockSize > LZ4_MAX_INPUT_SIZE) return 0; + if (maxBlockSize < 16) maxBlockSize = 16; + return LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize); +} + +/* +*_continue() : + These decoding functions allow decompression of multiple blocks in "streaming" mode. + Previously decoded blocks must still be available at the memory position where they were decoded. + If it's not possible, save the relevant part of decoded data into a safe buffer, + and indicate where it stands using LZ4_setStreamDecode() +*/ +LZ4_FORCE_O2 +int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + + if (lz4sd->prefixSize == 0) { + /* The first call, no dictionary yet. */ + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + /* They're rolling the current segment. */ + if (lz4sd->prefixSize >= 64 KB - 1) + result = LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + else if (lz4sd->extDictSize == 0) + result = LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize); + else + result = LZ4_decompress_safe_doubleDict(source, dest, compressedSize, maxOutputSize, + lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)result; + lz4sd->prefixEnd += result; + } else { + /* The buffer wraps around, or they're switching to another buffer. */ + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } + + return result; +} + +LZ4_FORCE_O2 int +LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, + const char* source, char* dest, int originalSize) +{ + LZ4_streamDecode_t_internal* const lz4sd = + (assert(LZ4_streamDecode!=NULL), &LZ4_streamDecode->internal_donotuse); + int result; + + DEBUGLOG(5, "LZ4_decompress_fast_continue (toDecodeSize=%i)", originalSize); + assert(originalSize >= 0); + + if (lz4sd->prefixSize == 0) { + DEBUGLOG(5, "first invocation : no prefix nor extDict"); + assert(lz4sd->extDictSize == 0); + result = LZ4_decompress_fast(source, dest, originalSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } else if (lz4sd->prefixEnd == (BYTE*)dest) { + DEBUGLOG(5, "continue using existing prefix"); + result = LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + lz4sd->prefixSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += (size_t)originalSize; + lz4sd->prefixEnd += originalSize; + } else { + DEBUGLOG(5, "prefix becomes extDict"); + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_fast_extDict(source, dest, originalSize, + lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = (size_t)originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } + + return result; +} + + +/* +Advanced decoding functions : +*_usingDict() : + These decoding functions work the same as "_continue" ones, + the dictionary must be explicitly provided within parameters +*/ + +int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_safe(source, dest, compressedSize, maxOutputSize); + if (dictStart+dictSize == dest) { + if (dictSize >= 64 KB - 1) { + return LZ4_decompress_safe_withPrefix64k(source, dest, compressedSize, maxOutputSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_withSmallPrefix(source, dest, compressedSize, maxOutputSize, (size_t)dictSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_forceExtDict(source, dest, compressedSize, maxOutputSize, dictStart, (size_t)dictSize); +} + +int LZ4_decompress_safe_partial_usingDict(const char* source, char* dest, int compressedSize, int targetOutputSize, int dstCapacity, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_safe_partial(source, dest, compressedSize, targetOutputSize, dstCapacity); + if (dictStart+dictSize == dest) { + if (dictSize >= 64 KB - 1) { + return LZ4_decompress_safe_partial_withPrefix64k(source, dest, compressedSize, targetOutputSize, dstCapacity); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_partial_withSmallPrefix(source, dest, compressedSize, targetOutputSize, dstCapacity, (size_t)dictSize); + } + assert(dictSize >= 0); + return LZ4_decompress_safe_partial_forceExtDict(source, dest, compressedSize, targetOutputSize, dstCapacity, dictStart, (size_t)dictSize); +} + +int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) +{ + if (dictSize==0 || dictStart+dictSize == dest) + return LZ4_decompress_unsafe_generic( + (const BYTE*)source, (BYTE*)dest, originalSize, + (size_t)dictSize, NULL, 0); + assert(dictSize >= 0); + return LZ4_decompress_fast_extDict(source, dest, originalSize, dictStart, (size_t)dictSize); +} + + +/*=************************************************* +* Obsolete Functions +***************************************************/ +/* obsolete compression functions */ +int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) +{ + return LZ4_compress_default(source, dest, inputSize, maxOutputSize); +} +int LZ4_compress(const char* src, char* dest, int srcSize) +{ + return LZ4_compress_default(src, dest, srcSize, LZ4_compressBound(srcSize)); +} +int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); +} +int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) +{ + return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); +} +int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int dstCapacity) +{ + return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, dstCapacity, 1); +} +int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) +{ + return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); +} + +/* +These decompression functions are deprecated and should no longer be used. +They are only provided here for compatibility with older user programs. +- LZ4_uncompress is totally equivalent to LZ4_decompress_fast +- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe +*/ +int LZ4_uncompress (const char* source, char* dest, int outputSize) +{ + return LZ4_decompress_fast(source, dest, outputSize); +} +int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) +{ + return LZ4_decompress_safe(source, dest, isize, maxOutputSize); +} + +/* Obsolete Streaming functions */ + +int LZ4_sizeofStreamState(void) { return sizeof(LZ4_stream_t); } + +int LZ4_resetStreamState(void* state, char* inputBuffer) +{ + (void)inputBuffer; + LZ4_resetStream((LZ4_stream_t*)state); + return 0; +} + +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +void* LZ4_create (char* inputBuffer) +{ + (void)inputBuffer; + return LZ4_createStream(); +} +#endif + +char* LZ4_slideInputBuffer (void* state) +{ + /* avoid const char * -> char * conversion warning */ + return (char *)(uptrval)((LZ4_stream_t*)state)->internal_donotuse.dictionary; +} + +#endif /* LZ4_COMMONDEFS_ONLY */ + +#endif /* LV_USE_LZ4_INTERNAL */ + diff --git a/inc/lvgl/src/libs/lz4/lz4.h b/inc/lvgl/src/libs/lz4/lz4.h new file mode 100644 index 0000000..bbb3f04 --- /dev/null +++ b/inc/lvgl/src/libs/lz4/lz4.h @@ -0,0 +1,899 @@ +/* + * LZ4 - Fast LZ compression algorithm + * Header File + * Copyright (C) 2011-2023, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ + +#include "../../lv_conf_internal.h" +#if LV_USE_LZ4_INTERNAL +#if defined (__cplusplus) +extern "C" { +#endif + +/** + * LVGL's porting + */ +#include "../../lvgl.h" +#define LZ4_FREESTANDING 1 +#define LZ4_memset lv_memset +#define LZ4_memcpy lv_memcpy +#define LZ4_memmove lv_memmove + +#ifndef LZ4_H_2983827168210 +#define LZ4_H_2983827168210 + +/* --- Dependency --- */ +#include /* size_t */ + + +/** + Introduction + + LZ4 is lossless compression algorithm, providing compression speed >500 MB/s per core, + scalable with multi-cores CPU. It features an extremely fast decoder, with speed in + multiple GB/s per core, typically reaching RAM speed limits on multi-core systems. + + The LZ4 compression library provides in-memory compression and decompression functions. + It gives full buffer control to user. + Compression can be done in: + - a single step (described as Simple Functions) + - a single step, reusing a context (described in Advanced Functions) + - unbounded multiple steps (described as Streaming compression) + + lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md). + Decompressing such a compressed block requires additional metadata. + Exact metadata depends on exact decompression function. + For the typical case of LZ4_decompress_safe(), + metadata includes block's compressed size, and maximum bound of decompressed size. + Each application is free to encode and pass such metadata in whichever way it wants. + + lz4.h only handle blocks, it can not generate Frames. + + Blocks are different from Frames (doc/lz4_Frame_format.md). + Frames bundle both blocks and metadata in a specified manner. + Embedding metadata is required for compressed data to be self-contained and portable. + Frame format is delivered through a companion API, declared in lz4frame.h. + The `lz4` CLI can only manage frames. +*/ + +/*^*************************************************************** +* Export parameters +*****************************************************************/ +/* +* LZ4_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +* LZ4LIB_VISIBILITY : +* Control library symbols visibility. +*/ +#ifndef LZ4LIB_VISIBILITY +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4LIB_VISIBILITY __attribute__ ((visibility ("default"))) +# else +# define LZ4LIB_VISIBILITY +# endif +#endif +#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) +# define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY +#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) +# define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define LZ4LIB_API LZ4LIB_VISIBILITY +#endif + +/*! LZ4_FREESTANDING : + * When this macro is set to 1, it enables "freestanding mode" that is + * suitable for typical freestanding environment which doesn't support + * standard C library. + * + * - LZ4_FREESTANDING is a compile-time switch. + * - It requires the following macros to be defined: + * LZ4_memcpy, LZ4_memmove, LZ4_memset. + * - It only enables LZ4/HC functions which don't use heap. + * All LZ4F_* functions are not supported. + * - See tests/freestanding.c to check its basic setup. + */ +#if defined(LZ4_FREESTANDING) && (LZ4_FREESTANDING == 1) +# define LZ4_HEAPMODE 0 +# define LZ4HC_HEAPMODE 0 +# define LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION 1 +# if !defined(LZ4_memcpy) +# error "LZ4_FREESTANDING requires macro 'LZ4_memcpy'." +# endif +# if !defined(LZ4_memset) +# error "LZ4_FREESTANDING requires macro 'LZ4_memset'." +# endif +# if !defined(LZ4_memmove) +# error "LZ4_FREESTANDING requires macro 'LZ4_memmove'." +# endif +#elif ! defined(LZ4_FREESTANDING) +# define LZ4_FREESTANDING 0 +#endif + + +/*------ Version ------*/ +#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ +#define LZ4_VERSION_MINOR 10 /* for new (non-breaking) interface capabilities */ +#define LZ4_VERSION_RELEASE 0 /* for tweaks, bug-fixes, or development */ + +#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) + +#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE +#define LZ4_QUOTE(str) #str +#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) +#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) /* requires v1.7.3+ */ + +LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version; requires v1.3.0+ */ +LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version; requires v1.7.5+ */ + + +/*-************************************ +* Tuning memory usage +**************************************/ +/*! + * LZ4_MEMORY_USAGE : + * Can be selected at compile time, by setting LZ4_MEMORY_USAGE. + * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB) + * Increasing memory usage improves compression ratio, generally at the cost of speed. + * Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality. + * Default value is 14, for 16KB, which nicely fits into most L1 caches. + */ +#ifndef LZ4_MEMORY_USAGE +# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT +#endif + +/* These are absolute limits, they should not be changed by users */ +#define LZ4_MEMORY_USAGE_MIN 10 +#define LZ4_MEMORY_USAGE_DEFAULT 14 +#define LZ4_MEMORY_USAGE_MAX 20 + +#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN) +# error "LZ4_MEMORY_USAGE is too small !" +#endif + +#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX) +# error "LZ4_MEMORY_USAGE is too large !" +#endif + +/*-************************************ +* Simple Functions +**************************************/ +/*! LZ4_compress_default() : + * Compresses 'srcSize' bytes from buffer 'src' + * into already allocated 'dst' buffer of size 'dstCapacity'. + * Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize). + * It also runs faster, so it's a recommended setting. + * If the function cannot compress 'src' into a more limited 'dst' budget, + * compression stops *immediately*, and the function result is zero. + * In which case, 'dst' content is undefined (invalid). + * srcSize : max supported value is LZ4_MAX_INPUT_SIZE. + * dstCapacity : size of buffer 'dst' (which must be already allocated) + * @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity) + * or 0 if compression fails + * Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer). + */ +LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity); + +/*! LZ4_decompress_safe() : + * @compressedSize : is the exact complete size of the compressed block. + * @dstCapacity : is the size of destination buffer (which must be already allocated), + * presumed an upper bound of decompressed size. + * @return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity) + * If destination buffer is not large enough, decoding will stop and output an error code (negative value). + * If the source stream is detected malformed, the function will stop decoding and return a negative result. + * Note 1 : This function is protected against malicious data packets : + * it will never writes outside 'dst' buffer, nor read outside 'source' buffer, + * even if the compressed block is maliciously modified to order the decoder to do these actions. + * In such case, the decoder stops immediately, and considers the compressed block malformed. + * Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them. + * The implementation is free to send / store / derive this information in whichever way is most beneficial. + * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. + */ +LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity); + + +/*-************************************ +* Advanced Functions +**************************************/ +#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ +#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) + +/*! LZ4_compressBound() : + Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) + This function is primarily useful for memory allocation purposes (destination buffer size). + Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). + Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize) + inputSize : max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is incorrect (too large or negative) +*/ +LZ4LIB_API int LZ4_compressBound(int inputSize); + +/*! LZ4_compress_fast() : + Same as LZ4_compress_default(), but allows selection of "acceleration" factor. + The larger the acceleration value, the faster the algorithm, but also the lesser the compression. + It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. + An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by LZ4_ACCELERATION_DEFAULT (currently == 1, see lz4.c). + Values > LZ4_ACCELERATION_MAX will be replaced by LZ4_ACCELERATION_MAX (currently == 65537, see lz4.c). +*/ +LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_fast_extState() : + * Same as LZ4_compress_fast(), using an externally allocated memory space for its state. + * Use LZ4_sizeofState() to know how much memory must be allocated, + * and allocate it on 8-bytes boundaries (using `malloc()` typically). + * Then, provide this buffer as `void* state` to compression function. + */ +LZ4LIB_API int LZ4_sizeofState(void); +LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_compress_destSize() : + * Reverse the logic : compresses as much data as possible from 'src' buffer + * into already allocated buffer 'dst', of size >= 'dstCapacity'. + * This function either compresses the entire 'src' content into 'dst' if it's large enough, + * or fill 'dst' buffer completely with as much data as possible from 'src'. + * note: acceleration parameter is fixed to "default". + * + * *srcSizePtr : in+out parameter. Initially contains size of input. + * Will be modified to indicate how many bytes where read from 'src' to fill 'dst'. + * New value is necessarily <= input value. + * @return : Nb bytes written into 'dst' (necessarily <= dstCapacity) + * or 0 if compression fails. + * + * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed in v1.9.2+): + * the produced compressed content could, in specific circumstances, + * require to be decompressed into a destination buffer larger + * by at least 1 byte than the content to decompress. + * If an application uses `LZ4_compress_destSize()`, + * it's highly recommended to update liblz4 to v1.9.2 or better. + * If this can't be done or ensured, + * the receiving decompression function should provide + * a dstCapacity which is > decompressedSize, by at least 1 byte. + * See https://github.com/lz4/lz4/issues/859 for details + */ +LZ4LIB_API int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize); + +/*! LZ4_decompress_safe_partial() : + * Decompress an LZ4 compressed block, of size 'srcSize' at position 'src', + * into destination buffer 'dst' of size 'dstCapacity'. + * Up to 'targetOutputSize' bytes will be decoded. + * The function stops decoding on reaching this objective. + * This can be useful to boost performance + * whenever only the beginning of a block is required. + * + * @return : the number of bytes decoded in `dst` (necessarily <= targetOutputSize) + * If source stream is detected malformed, function returns a negative result. + * + * Note 1 : @return can be < targetOutputSize, if compressed block contains less data. + * + * Note 2 : targetOutputSize must be <= dstCapacity + * + * Note 3 : this function effectively stops decoding on reaching targetOutputSize, + * so dstCapacity is kind of redundant. + * This is because in older versions of this function, + * decoding operation would still write complete sequences. + * Therefore, there was no guarantee that it would stop writing at exactly targetOutputSize, + * it could write more bytes, though only up to dstCapacity. + * Some "margin" used to be required for this operation to work properly. + * Thankfully, this is no longer necessary. + * The function nonetheless keeps the same signature, in an effort to preserve API compatibility. + * + * Note 4 : If srcSize is the exact size of the block, + * then targetOutputSize can be any value, + * including larger than the block's decompressed size. + * The function will, at most, generate block's decompressed size. + * + * Note 5 : If srcSize is _larger_ than block's compressed size, + * then targetOutputSize **MUST** be <= block's decompressed size. + * Otherwise, *silent corruption will occur*. + */ +LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity); + + +/*-********************************************* +* Streaming Compression Functions +***********************************************/ +typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ + +/*! + Note about RC_INVOKED + + - RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio). + https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros + + - Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars) + and reports warning "RC4011: identifier truncated". + + - To eliminate the warning, we surround long preprocessor symbol with + "#if !defined(RC_INVOKED) ... #endif" block that means + "skip this block when rc.exe is trying to read it". +*/ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); +LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_resetStream_fast() : v1.9.0+ + * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks + * (e.g., LZ4_compress_fast_continue()). + * + * An LZ4_stream_t must be initialized once before usage. + * This is automatically done when created by LZ4_createStream(). + * However, should the LZ4_stream_t be simply declared on stack (for example), + * it's necessary to initialize it first, using LZ4_initStream(). + * + * After init, start any new stream with LZ4_resetStream_fast(). + * A same LZ4_stream_t can be re-used multiple times consecutively + * and compress multiple streams, + * provided that it starts each new stream with LZ4_resetStream_fast(). + * + * LZ4_resetStream_fast() is much faster than LZ4_initStream(), + * but is not compatible with memory regions containing garbage data. + * + * Note: it's only useful to call LZ4_resetStream_fast() + * in the context of streaming compression. + * The *extState* functions perform their own resets. + * Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive. + */ +LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr); + +/*! LZ4_loadDict() : + * Use this function to reference a static dictionary into LZ4_stream_t. + * The dictionary must remain available during compression. + * LZ4_loadDict() triggers a reset, so any previous data will be forgotten. + * The same dictionary will have to be loaded on decompression side for successful decoding. + * Dictionary are useful for better compression of small data (KB range). + * While LZ4 itself accepts any input as dictionary, dictionary efficiency is also a topic. + * When in doubt, employ the Zstandard's Dictionary Builder. + * Loading a size of 0 is allowed, and is the same as reset. + * @return : loaded dictionary size, in bytes (note: only the last 64 KB are loaded) + */ +LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_loadDictSlow() : v1.10.0+ + * Same as LZ4_loadDict(), + * but uses a bit more cpu to reference the dictionary content more thoroughly. + * This is expected to slightly improve compression ratio. + * The extra-cpu cost is likely worth it if the dictionary is re-used across multiple sessions. + * @return : loaded dictionary size, in bytes (note: only the last 64 KB are loaded) + */ +LZ4LIB_API int LZ4_loadDictSlow(LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_attach_dictionary() : stable since v1.10.0 + * + * This allows efficient re-use of a static dictionary multiple times. + * + * Rather than re-loading the dictionary buffer into a working context before + * each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a + * working LZ4_stream_t, this function introduces a no-copy setup mechanism, + * in which the working stream references @dictionaryStream in-place. + * + * Several assumptions are made about the state of @dictionaryStream. + * Currently, only states which have been prepared by LZ4_loadDict() or + * LZ4_loadDictSlow() should be expected to work. + * + * Alternatively, the provided @dictionaryStream may be NULL, + * in which case any existing dictionary stream is unset. + * + * If a dictionary is provided, it replaces any pre-existing stream history. + * The dictionary contents are the only history that can be referenced and + * logically immediately precede the data compressed in the first subsequent + * compression call. + * + * The dictionary will only remain attached to the working stream through the + * first compression call, at the end of which it is cleared. + * @dictionaryStream stream (and source buffer) must remain in-place / accessible / unchanged + * through the completion of the compression session. + * + * Note: there is no equivalent LZ4_attach_*() method on the decompression side + * because there is no initialization cost, hence no need to share the cost across multiple sessions. + * To decompress LZ4 blocks using dictionary, attached or not, + * just employ the regular LZ4_setStreamDecode() for streaming, + * or the stateless LZ4_decompress_safe_usingDict() for one-shot decompression. + */ +LZ4LIB_API void +LZ4_attach_dictionary(LZ4_stream_t* workingStream, + const LZ4_stream_t* dictionaryStream); + +/*! LZ4_compress_fast_continue() : + * Compress 'src' content using data from previously compressed blocks, for better compression ratio. + * 'dst' buffer must be already allocated. + * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. + * + * @return : size of compressed block + * or 0 if there is an error (typically, cannot fit into 'dst'). + * + * Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block. + * Each block has precise boundaries. + * Each block must be decompressed separately, calling LZ4_decompress_*() with relevant metadata. + * It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together. + * + * Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory ! + * + * Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB. + * Make sure that buffers are separated, by at least one byte. + * This construction ensures that each block only depends on previous block. + * + * Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB. + * + * Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed. + */ +LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_saveDict() : + * If last 64KB data cannot be guaranteed to remain available at its current memory location, + * save it into a safer place (char* safeBuffer). + * This is schematically equivalent to a memcpy() followed by LZ4_loadDict(), + * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. + * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. + */ +LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize); + + +/*-********************************************** +* Streaming Decompression Functions +* Bufferless synchronous API +************************************************/ +typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */ + +/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() : + * creation / destruction of streaming decompression tracking context. + * A tracking context can be re-used multiple times. + */ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); +LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_setStreamDecode() : + * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. + * Use this function to start decompression of a new stream of blocks. + * A dictionary can optionally be set. Use NULL or size 0 for a reset order. + * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. + * @return : 1 if OK, 0 if error + */ +LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); + +/*! LZ4_decoderRingBufferSize() : v1.8.2+ + * Note : in a ring buffer scenario (optional), + * blocks are presumed decompressed next to each other + * up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize), + * at which stage it resumes from beginning of ring buffer. + * When setting such a ring buffer for streaming decompression, + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize); +#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */ + +/*! LZ4_decompress_safe_continue() : + * This decoding function allows decompression of consecutive blocks in "streaming" mode. + * The difference with the usual independent blocks is that + * new blocks are allowed to find references into former blocks. + * A block is an unsplittable entity, and must be presented entirely to the decompression function. + * LZ4_decompress_safe_continue() only accepts one block at a time. + * It's modeled after `LZ4_decompress_safe()` and behaves similarly. + * + * @LZ4_streamDecode : decompression state, tracking the position in memory of past data + * @compressedSize : exact complete size of one compressed block. + * @dstCapacity : size of destination buffer (which must be already allocated), + * must be an upper bound of decompressed size. + * @return : number of bytes decompressed into destination buffer (necessarily <= dstCapacity) + * If destination buffer is not large enough, decoding will stop and output an error code (negative value). + * If the source stream is detected malformed, the function will stop decoding and return a negative result. + * + * The last 64KB of previously decoded data *must* remain available and unmodified + * at the memory position where they were previously decoded. + * If less than 64KB of data has been decoded, all the data must be present. + * + * Special : if decompression side sets a ring buffer, it must respect one of the following conditions : + * - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize). + * maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes. + * In which case, encoding and decoding buffers do not need to be synchronized. + * Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize. + * - Synchronized mode : + * Decompression buffer size is _exactly_ the same as compression buffer size, + * and follows exactly same update rule (block boundaries at same positions), + * and decoding function is provided with exact decompressed size of each block (exception for last block of the stream), + * _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB). + * - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes. + * In which case, encoding and decoding buffers do not need to be synchronized, + * and encoding ring buffer can have any size, including small ones ( < 64 KB). + * + * Whenever these conditions are not possible, + * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, + * then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block. +*/ +LZ4LIB_API int +LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, + const char* src, char* dst, + int srcSize, int dstCapacity); + + +/*! LZ4_decompress_safe_usingDict() : + * Works the same as + * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_safe_continue() + * However, it's stateless: it doesn't need any LZ4_streamDecode_t state. + * Dictionary is presumed stable : it must remain accessible and unmodified during decompression. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ +LZ4LIB_API int +LZ4_decompress_safe_usingDict(const char* src, char* dst, + int srcSize, int dstCapacity, + const char* dictStart, int dictSize); + +/*! LZ4_decompress_safe_partial_usingDict() : + * Behaves the same as LZ4_decompress_safe_partial() + * with the added ability to specify a memory segment for past data. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ +LZ4LIB_API int +LZ4_decompress_safe_partial_usingDict(const char* src, char* dst, + int compressedSize, + int targetOutputSize, int maxOutputSize, + const char* dictStart, int dictSize); + +#endif /* LZ4_H_2983827168210 */ + + +/*^************************************* + * !!!!!! STATIC LINKING ONLY !!!!!! + ***************************************/ + +/*-**************************************************************************** + * Experimental section + * + * Symbols declared in this section must be considered unstable. Their + * signatures or semantics may change, or they may be removed altogether in the + * future. They are therefore only safe to depend on when the caller is + * statically linked against the library. + * + * To protect against unsafe usage, not only are the declarations guarded, + * the definitions are hidden by default + * when building LZ4 as a shared/dynamic library. + * + * In order to access these declarations, + * define LZ4_STATIC_LINKING_ONLY in your application + * before including LZ4's headers. + * + * In order to make their implementations accessible dynamically, you must + * define LZ4_PUBLISH_STATIC_FUNCTIONS when building the LZ4 library. + ******************************************************************************/ + +#ifdef LZ4_STATIC_LINKING_ONLY + +#ifndef LZ4_STATIC_3504398509 +#define LZ4_STATIC_3504398509 + +#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS +# define LZ4LIB_STATIC_API LZ4LIB_API +#else +# define LZ4LIB_STATIC_API +#endif + + +/*! LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. + * It is only safe to call if the state buffer is known to be correctly initialized already + * (see above comment on LZ4_resetStream_fast() for a definition of "correctly initialized"). + * From a high level, the difference is that + * this function initializes the provided state with a call to something like LZ4_resetStream_fast() + * while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream(). + */ +LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_compress_destSize_extState() : introduced in v1.10.0 + * Same as LZ4_compress_destSize(), but using an externally allocated state. + * Also: exposes @acceleration + */ +int LZ4_compress_destSize_extState(void* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize, int acceleration); + +/*! In-place compression and decompression + * + * It's possible to have input and output sharing the same buffer, + * for highly constrained memory environments. + * In both cases, it requires input to lay at the end of the buffer, + * and decompression to start at beginning of the buffer. + * Buffer size must feature some margin, hence be larger than final size. + * + * |<------------------------buffer--------------------------------->| + * |<-----------compressed data--------->| + * |<-----------decompressed size------------------>| + * |<----margin---->| + * + * This technique is more useful for decompression, + * since decompressed size is typically larger, + * and margin is short. + * + * In-place decompression will work inside any buffer + * which size is >= LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize). + * This presumes that decompressedSize > compressedSize. + * Otherwise, it means compression actually expanded data, + * and it would be more efficient to store such data with a flag indicating it's not compressed. + * This can happen when data is not compressible (already compressed, or encrypted). + * + * For in-place compression, margin is larger, as it must be able to cope with both + * history preservation, requiring input data to remain unmodified up to LZ4_DISTANCE_MAX, + * and data expansion, which can happen when input is not compressible. + * As a consequence, buffer size requirements are much higher, + * and memory savings offered by in-place compression are more limited. + * + * There are ways to limit this cost for compression : + * - Reduce history size, by modifying LZ4_DISTANCE_MAX. + * Note that it is a compile-time constant, so all compressions will apply this limit. + * Lower values will reduce compression ratio, except when input_size < LZ4_DISTANCE_MAX, + * so it's a reasonable trick when inputs are known to be small. + * - Require the compressor to deliver a "maximum compressed size". + * This is the `dstCapacity` parameter in `LZ4_compress*()`. + * When this size is < LZ4_COMPRESSBOUND(inputSize), then compression can fail, + * in which case, the return code will be 0 (zero). + * The caller must be ready for these cases to happen, + * and typically design a backup scheme to send data uncompressed. + * The combination of both techniques can significantly reduce + * the amount of margin required for in-place compression. + * + * In-place compression can work in any buffer + * which size is >= (maxCompressedSize) + * with maxCompressedSize == LZ4_COMPRESSBOUND(srcSize) for guaranteed compression success. + * LZ4_COMPRESS_INPLACE_BUFFER_SIZE() depends on both maxCompressedSize and LZ4_DISTANCE_MAX, + * so it's possible to reduce memory requirements by playing with them. + */ + +#define LZ4_DECOMPRESS_INPLACE_MARGIN(compressedSize) (((compressedSize) >> 8) + 32) +#define LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize) ((decompressedSize) + LZ4_DECOMPRESS_INPLACE_MARGIN(decompressedSize)) /**< note: presumes that compressedSize < decompressedSize. note2: margin is overestimated a bit, since it could use compressedSize instead */ + +#ifndef LZ4_DISTANCE_MAX /* history window size; can be user-defined at compile time */ +# define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */ +#endif + +#define LZ4_COMPRESS_INPLACE_MARGIN (LZ4_DISTANCE_MAX + 32) /* LZ4_DISTANCE_MAX can be safely replaced by srcSize when it's smaller */ +#define LZ4_COMPRESS_INPLACE_BUFFER_SIZE(maxCompressedSize) ((maxCompressedSize) + LZ4_COMPRESS_INPLACE_MARGIN) /**< maxCompressedSize is generally LZ4_COMPRESSBOUND(inputSize), but can be set to any lower value, with the risk that compression can fail (return code 0(zero)) */ + +#endif /* LZ4_STATIC_3504398509 */ +#endif /* LZ4_STATIC_LINKING_ONLY */ + + + +#ifndef LZ4_H_98237428734687 +#define LZ4_H_98237428734687 + +/*-************************************************************ + * Private Definitions + ************************************************************** + * Do not use these definitions directly. + * They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`. + * Accessing members will expose user code to API and/or ABI break in future versions of the library. + **************************************************************/ +#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2) +#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE) +#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */ + +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef int8_t LZ4_i8; + typedef uint8_t LZ4_byte; + typedef uint16_t LZ4_u16; + typedef uint32_t LZ4_u32; +#else + typedef signed char LZ4_i8; + typedef unsigned char LZ4_byte; + typedef unsigned short LZ4_u16; + typedef unsigned int LZ4_u32; +#endif + +/*! LZ4_stream_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_stream_t object. +**/ + +typedef struct LZ4_stream_t_internal LZ4_stream_t_internal; +struct LZ4_stream_t_internal { + LZ4_u32 hashTable[LZ4_HASH_SIZE_U32]; + const LZ4_byte* dictionary; + const LZ4_stream_t_internal* dictCtx; + LZ4_u32 currentOffset; + LZ4_u32 tableType; + LZ4_u32 dictSize; + /* Implicit padding to ensure structure is aligned */ +}; + +#define LZ4_STREAM_MINSIZE ((1UL << (LZ4_MEMORY_USAGE)) + 32) /* static size, for inter-version compatibility */ +union LZ4_stream_u { + char minStateSize[LZ4_STREAM_MINSIZE]; + LZ4_stream_t_internal internal_donotuse; +}; /* previously typedef'd to LZ4_stream_t */ + + +/*! LZ4_initStream() : v1.9.0+ + * An LZ4_stream_t structure must be initialized at least once. + * This is automatically done when invoking LZ4_createStream(), + * but it's not when the structure is simply declared on stack (for example). + * + * Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t. + * It can also initialize any arbitrary buffer of sufficient size, + * and will @return a pointer of proper type upon initialization. + * + * Note : initialization fails if size and alignment conditions are not respected. + * In which case, the function will @return NULL. + * Note2: An LZ4_stream_t structure guarantees correct alignment and size. + * Note3: Before v1.9.0, use LZ4_resetStream() instead +**/ +LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* stateBuffer, size_t size); + + +/*! LZ4_streamDecode_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_streamDecode_t object. +**/ +typedef struct { + const LZ4_byte* externalDict; + const LZ4_byte* prefixEnd; + size_t extDictSize; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +#define LZ4_STREAMDECODE_MINSIZE 32 +union LZ4_streamDecode_u { + char minStateSize[LZ4_STREAMDECODE_MINSIZE]; + LZ4_streamDecode_t_internal internal_donotuse; +} ; /* previously typedef'd to LZ4_streamDecode_t */ + + + +/*-************************************ +* Obsolete Functions +**************************************/ + +/*! Deprecation warnings + * + * Deprecated functions make the compiler generate a warning when invoked. + * This is meant to invite users to update their source code. + * Should deprecation warnings be a problem, it is generally possible to disable them, + * typically with -Wno-deprecated-declarations for gcc + * or _CRT_SECURE_NO_WARNINGS in Visual. + * + * Another method is to define LZ4_DISABLE_DEPRECATE_WARNINGS + * before including the header file. + */ +#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS +# define LZ4_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define LZ4_DEPRECATED(message) [[deprecated(message)]] +# elif defined(_MSC_VER) +# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) +# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 45)) +# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 31) +# define LZ4_DEPRECATED(message) __attribute__((deprecated)) +# else +# pragma message("WARNING: LZ4_DEPRECATED needs custom implementation for this compiler") +# define LZ4_DEPRECATED(message) /* disabled */ +# endif +#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ + +/*! Obsolete compression functions (since v1.7.3) */ +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize); +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); +LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/*! Obsolete decompression functions (since v1.8.0) */ +LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize); +LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); + +/* Obsolete streaming functions (since v1.7.0) + * degraded functionality; do not use! + * + * In order to perform streaming compression, these functions depended on data + * that is no longer tracked in the state. They have been preserved as well as + * possible: using them will still produce a correct output. However, they don't + * actually retain any history between compression calls. The compression ratio + * achieved will therefore be no better than compressing each chunk + * independently. + */ +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void); +LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state); + +/*! Obsolete streaming decoding functions (since v1.7.0) */ +LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); +LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); + +/*! Obsolete LZ4_decompress_fast variants (since v1.9.0) : + * These functions used to be faster than LZ4_decompress_safe(), + * but this is no longer the case. They are now slower. + * This is because LZ4_decompress_fast() doesn't know the input size, + * and therefore must progress more cautiously into the input buffer to not read beyond the end of block. + * On top of that `LZ4_decompress_fast()` is not protected vs malformed or malicious inputs, making it a security liability. + * As a consequence, LZ4_decompress_fast() is strongly discouraged, and deprecated. + * + * The last remaining LZ4_decompress_fast() specificity is that + * it can decompress a block without knowing its compressed size. + * Such functionality can be achieved in a more secure manner + * by employing LZ4_decompress_safe_partial(). + * + * Parameters: + * originalSize : is the uncompressed size to regenerate. + * `dst` must be already allocated, its size must be >= 'originalSize' bytes. + * @return : number of bytes read from source buffer (== compressed size). + * The function expects to finish at block's end exactly. + * If the source stream is detected malformed, the function stops decoding and returns a negative result. + * note : LZ4_decompress_fast*() requires originalSize. Thanks to this information, it never writes past the output buffer. + * However, since it doesn't know its 'src' size, it may read an unknown amount of input, past input buffer bounds. + * Also, since match offsets are not validated, match reads from 'src' may underflow too. + * These issues never happen if input (compressed) data is correct. + * But they may happen if input data is invalid (error or intentional tampering). + * As a consequence, use these functions in trusted environments with trusted data **only**. + */ +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_partial() instead") +LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider migrating towards LZ4_decompress_safe_continue() instead. " + "Note that the contract will change (requires block's compressed size, instead of decompressed size)") +LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_partial_usingDict() instead") +LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize); + +/*! LZ4_resetStream() : + * An LZ4_stream_t structure must be initialized at least once. + * This is done with LZ4_initStream(), or LZ4_resetStream(). + * Consider switching to LZ4_initStream(), + * invoking LZ4_resetStream() will trigger deprecation warnings in the future. + */ +LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr); + + +#endif /* LZ4_H_98237428734687 */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* LV_USE_LZ4_INTERNAL */ + diff --git a/inc/lvgl/src/libs/nanovg/LICENSE.txt b/inc/lvgl/src/libs/nanovg/LICENSE.txt new file mode 100644 index 0000000..2a03a1a --- /dev/null +++ b/inc/lvgl/src/libs/nanovg/LICENSE.txt @@ -0,0 +1,18 @@ +Copyright (c) 2013 Mikko Mononen memon@inside.org + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + diff --git a/inc/lvgl/src/libs/nanovg/nanovg.c b/inc/lvgl/src/libs/nanovg/nanovg.c new file mode 100644 index 0000000..9e82e23 --- /dev/null +++ b/inc/lvgl/src/libs/nanovg/nanovg.c @@ -0,0 +1,2577 @@ +// +// Copyright (c) 2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include "../../lv_conf_internal.h" + +#if LV_USE_NANOVG + +#include +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/lv_log.h" + +#include "nanovg.h" + +#ifdef _MSC_VER + #pragma warning(disable: 4100) // unreferenced formal parameter + #pragma warning(disable: 4127) // conditional expression is constant + #pragma warning(disable: 4204) // nonstandard extension used : non-constant aggregate initializer + #pragma warning(disable: 4706) // assignment within conditional expression +#endif + +#define NVG_INIT_FONTIMAGE_SIZE 512 +#define NVG_MAX_FONTIMAGE_SIZE 2048 +#define NVG_MAX_FONTIMAGES 4 + +#define NVG_INIT_COMMANDS_SIZE 256 +#define NVG_INIT_POINTS_SIZE 128 +#define NVG_INIT_PATHS_SIZE 16 +#define NVG_INIT_VERTS_SIZE 256 + +#ifndef NVG_MAX_STATES + #define NVG_MAX_STATES 32 +#endif + +#define NVG_KAPPA90 0.5522847493f // Length proportional to radius of a cubic bezier handle for 90deg arcs. + +#define NVG_COUNTOF(arr) (sizeof(arr) / sizeof(0[arr])) + +/** + * This value determines the maximum permissible pixel error when a Bézier curve is subdivided into line segments; + * a smaller value results in smoother lines but also more vertices. + */ +#define NVG_TESS_TOL_FACTOR 0.5f + +enum NVGcommands { + NVG_MOVETO = 0, + NVG_LINETO = 1, + NVG_BEZIERTO = 2, + NVG_CLOSE = 3, + NVG_WINDING = 4, +}; + +enum NVGpointFlags { + NVG_PT_CORNER = 0x01, + NVG_PT_LEFT = 0x02, + NVG_PT_BEVEL = 0x04, + NVG_PR_INNERBEVEL = 0x08, +}; + +struct NVGstate { + NVGcompositeOperationState compositeOperation; + int shapeAntiAlias; + NVGpaint fill; + NVGpaint stroke; + float strokeWidth; + float miterLimit; + int lineJoin; + int lineCap; + float alpha; + float xform[6]; + NVGscissor scissor; + float fontSize; + float letterSpacing; + float lineHeight; + float fontBlur; + int textAlign; + int fontId; +}; +typedef struct NVGstate NVGstate; + +struct NVGpoint { + float x, y; + float dx, dy; + float len; + float dmx, dmy; + unsigned char flags; +}; +typedef struct NVGpoint NVGpoint; + +struct NVGpathCache { + NVGpoint * points; + int npoints; + int cpoints; + NVGpath * paths; + int npaths; + int cpaths; + NVGvertex * verts; + int nverts; + int cverts; + float bounds[4]; +}; +typedef struct NVGpathCache NVGpathCache; + +struct NVGcontext { + NVGparams params; + float * commands; + int ccommands; + int ncommands; + float commandx, commandy; + NVGstate states[NVG_MAX_STATES]; + int nstates; + NVGpathCache * cache; + float tessTol; + float distTol; + float fringeWidth; + float devicePxRatio; + struct FONScontext * fs; + int fontImages[NVG_MAX_FONTIMAGES]; + int fontImageIdx; + int drawCallCount; + int fillTriCount; + int strokeTriCount; + int textTriCount; +}; + +static float nvg__sqrtf(float a) +{ + return sqrtf(a); +} +static float nvg__modf(float a, float b) +{ + return fmodf(a, b); +} +static float nvg__sinf(float a) +{ + return sinf(a); +} +static float nvg__cosf(float a) +{ + return cosf(a); +} +static float nvg__tanf(float a) +{ + return tanf(a); +} +static float nvg__atan2f(float a, float b) +{ + return atan2f(a, b); +} +static float nvg__acosf(float a) +{ + return acosf(a); +} + +static int nvg__mini(int a, int b) +{ + return a < b ? a : b; +} +static int nvg__maxi(int a, int b) +{ + return a > b ? a : b; +} +static int nvg__clampi(int a, int mn, int mx) +{ + return a < mn ? mn : (a > mx ? mx : a); +} +static float nvg__minf(float a, float b) +{ + return a < b ? a : b; +} +static float nvg__maxf(float a, float b) +{ + return a > b ? a : b; +} +static float nvg__absf(float a) +{ + return a >= 0.0f ? a : -a; +} +static float nvg__signf(float a) +{ + return a >= 0.0f ? 1.0f : -1.0f; +} +static float nvg__clampf(float a, float mn, float mx) +{ + return a < mn ? mn : (a > mx ? mx : a); +} +static float nvg__cross(float dx0, float dy0, float dx1, float dy1) +{ + return dx1 * dy0 - dx0 * dy1; +} + +static float nvg__normalize(float * x, float * y) +{ + float d = nvg__sqrtf((*x) * (*x) + (*y) * (*y)); + if(d > 1e-6f) { + float id = 1.0f / d; + *x *= id; + *y *= id; + } + return d; +} + + +static void nvg__deletePathCache(NVGpathCache * c) +{ + if(c == NULL) return; + if(c->points != NULL) lv_free(c->points); + if(c->paths != NULL) lv_free(c->paths); + if(c->verts != NULL) lv_free(c->verts); + lv_free(c); +} + +static NVGpathCache * nvg__allocPathCache(void) +{ + NVGpathCache * c = (NVGpathCache *)lv_malloc(sizeof(NVGpathCache)); + if(c == NULL) goto error; + lv_memzero(c, sizeof(NVGpathCache)); + + c->points = (NVGpoint *)lv_malloc(sizeof(NVGpoint) * NVG_INIT_POINTS_SIZE); + if(!c->points) goto error; + c->npoints = 0; + c->cpoints = NVG_INIT_POINTS_SIZE; + + c->paths = (NVGpath *)lv_malloc(sizeof(NVGpath) * NVG_INIT_PATHS_SIZE); + if(!c->paths) goto error; + c->npaths = 0; + c->cpaths = NVG_INIT_PATHS_SIZE; + + c->verts = (NVGvertex *)lv_malloc(sizeof(NVGvertex) * NVG_INIT_VERTS_SIZE); + if(!c->verts) goto error; + c->nverts = 0; + c->cverts = NVG_INIT_VERTS_SIZE; + + return c; +error: + nvg__deletePathCache(c); + return NULL; +} + +static void nvg__setDevicePixelRatio(NVGcontext * ctx, float ratio) +{ + ctx->tessTol = NVG_TESS_TOL_FACTOR / ratio; + ctx->distTol = 0.01f / ratio; + ctx->fringeWidth = 1.0f / ratio; + ctx->devicePxRatio = ratio; +} + +static NVGcompositeOperationState nvg__compositeOperationState(int op) +{ + int sfactor, dfactor; + + if(op == NVG_SOURCE_OVER) { + sfactor = NVG_ONE; + dfactor = NVG_ONE_MINUS_SRC_ALPHA; + } + else if(op == NVG_SOURCE_IN) { + sfactor = NVG_DST_ALPHA; + dfactor = NVG_ZERO; + } + else if(op == NVG_SOURCE_OUT) { + sfactor = NVG_ONE_MINUS_DST_ALPHA; + dfactor = NVG_ZERO; + } + else if(op == NVG_ATOP) { + sfactor = NVG_DST_ALPHA; + dfactor = NVG_ONE_MINUS_SRC_ALPHA; + } + else if(op == NVG_DESTINATION_OVER) { + sfactor = NVG_ONE_MINUS_DST_ALPHA; + dfactor = NVG_ONE; + } + else if(op == NVG_DESTINATION_IN) { + sfactor = NVG_ZERO; + dfactor = NVG_SRC_ALPHA; + } + else if(op == NVG_DESTINATION_OUT) { + sfactor = NVG_ZERO; + dfactor = NVG_ONE_MINUS_SRC_ALPHA; + } + else if(op == NVG_DESTINATION_ATOP) { + sfactor = NVG_ONE_MINUS_DST_ALPHA; + dfactor = NVG_SRC_ALPHA; + } + else if(op == NVG_LIGHTER) { + sfactor = NVG_ONE; + dfactor = NVG_ONE; + } + else if(op == NVG_COPY) { + sfactor = NVG_ONE; + dfactor = NVG_ZERO; + } + else if(op == NVG_XOR) { + sfactor = NVG_ONE_MINUS_DST_ALPHA; + dfactor = NVG_ONE_MINUS_SRC_ALPHA; + } + else { + sfactor = NVG_ONE; + dfactor = NVG_ZERO; + } + + NVGcompositeOperationState state; + state.srcRGB = sfactor; + state.dstRGB = dfactor; + state.srcAlpha = sfactor; + state.dstAlpha = dfactor; + return state; +} + +static NVGstate * nvg__getState(NVGcontext * ctx) +{ + return &ctx->states[ctx->nstates - 1]; +} + +NVGcontext * nvgCreateInternal(NVGparams * params) +{ + NVGcontext * ctx = (NVGcontext *)lv_malloc(sizeof(NVGcontext)); + int i; + if(ctx == NULL) goto error; + lv_memzero(ctx, sizeof(NVGcontext)); + + ctx->params = *params; + for(i = 0; i < NVG_MAX_FONTIMAGES; i++) + ctx->fontImages[i] = 0; + + ctx->commands = (float *)lv_malloc(sizeof(float) * NVG_INIT_COMMANDS_SIZE); + if(!ctx->commands) goto error; + ctx->ncommands = 0; + ctx->ccommands = NVG_INIT_COMMANDS_SIZE; + + ctx->cache = nvg__allocPathCache(); + if(ctx->cache == NULL) goto error; + + nvgSave(ctx); + nvgReset(ctx); + + nvg__setDevicePixelRatio(ctx, 1.0f); + + if(ctx->params.renderCreate(ctx->params.userPtr) == 0) goto error; + + return ctx; + +error: + nvgDeleteInternal(ctx); + return 0; +} + +NVGparams * nvgInternalParams(NVGcontext * ctx) +{ + return &ctx->params; +} + +void nvgDeleteInternal(NVGcontext * ctx) +{ + int i; + if(ctx == NULL) return; + if(ctx->commands != NULL) lv_free(ctx->commands); + if(ctx->cache != NULL) nvg__deletePathCache(ctx->cache); + + for(i = 0; i < NVG_MAX_FONTIMAGES; i++) { + if(ctx->fontImages[i] != 0) { + nvgDeleteImage(ctx, ctx->fontImages[i]); + ctx->fontImages[i] = 0; + } + } + + if(ctx->params.renderDelete != NULL) + ctx->params.renderDelete(ctx->params.userPtr); + + lv_free(ctx); +} + +void nvgBeginFrame(NVGcontext * ctx, float windowWidth, float windowHeight, float devicePixelRatio) +{ + /* printf("Tris: draws:%d fill:%d stroke:%d text:%d TOT:%d\n", + ctx->drawCallCount, ctx->fillTriCount, ctx->strokeTriCount, ctx->textTriCount, + ctx->fillTriCount+ctx->strokeTriCount+ctx->textTriCount);*/ + + ctx->nstates = 0; + nvgSave(ctx); + nvgReset(ctx); + + nvg__setDevicePixelRatio(ctx, devicePixelRatio); + + ctx->params.renderViewport(ctx->params.userPtr, windowWidth, windowHeight, devicePixelRatio); + + ctx->drawCallCount = 0; + ctx->fillTriCount = 0; + ctx->strokeTriCount = 0; + ctx->textTriCount = 0; +} + +void nvgCancelFrame(NVGcontext * ctx) +{ + ctx->params.renderCancel(ctx->params.userPtr); +} + +void nvgEndFrame(NVGcontext * ctx) +{ + ctx->params.renderFlush(ctx->params.userPtr); + if(ctx->fontImageIdx != 0) { + int fontImage = ctx->fontImages[ctx->fontImageIdx]; + ctx->fontImages[ctx->fontImageIdx] = 0; + int i, j, iw, ih; + // delete images that smaller than current one + if(fontImage == 0) + return; + nvgImageSize(ctx, fontImage, &iw, &ih); + for(i = j = 0; i < ctx->fontImageIdx; i++) { + if(ctx->fontImages[i] != 0) { + int nw, nh; + int image = ctx->fontImages[i]; + ctx->fontImages[i] = 0; + nvgImageSize(ctx, image, &nw, &nh); + if(nw < iw || nh < ih) + nvgDeleteImage(ctx, image); + else + ctx->fontImages[j++] = image; + } + } + // make current font image to first + ctx->fontImages[j] = ctx->fontImages[0]; + ctx->fontImages[0] = fontImage; + ctx->fontImageIdx = 0; + } +} + +NVGcolor nvgRGB(unsigned char r, unsigned char g, unsigned char b) +{ + return nvgRGBA(r, g, b, 255); +} + +NVGcolor nvgRGBf(float r, float g, float b) +{ + return nvgRGBAf(r, g, b, 1.0f); +} + +NVGcolor nvgRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + NVGcolor color; + // Use longer initialization to suppress warning. + color.ch.r = r / 255.0f; + color.ch.g = g / 255.0f; + color.ch.b = b / 255.0f; + color.ch.a = a / 255.0f; + return color; +} + +NVGcolor nvgRGBAf(float r, float g, float b, float a) +{ + NVGcolor color; + // Use longer initialization to suppress warning. + color.ch.r = r; + color.ch.g = g; + color.ch.b = b; + color.ch.a = a; + return color; +} + +NVGcolor nvgTransRGBA(NVGcolor c, unsigned char a) +{ + c.ch.a = a / 255.0f; + return c; +} + +NVGcolor nvgTransRGBAf(NVGcolor c, float a) +{ + c.ch.a = a; + return c; +} + +NVGcolor nvgLerpRGBA(NVGcolor c0, NVGcolor c1, float u) +{ + int i; + float oneminu; + NVGcolor cint = { 0 }; + + u = nvg__clampf(u, 0.0f, 1.0f); + oneminu = 1.0f - u; + for(i = 0; i < 4; i++) { + cint.rgba[i] = c0.rgba[i] * oneminu + c1.rgba[i] * u; + } + + return cint; +} + +NVGcolor nvgHSL(float h, float s, float l) +{ + return nvgHSLA(h, s, l, 255); +} + +static float nvg__hue(float h, float m1, float m2) +{ + if(h < 0) h += 1; + if(h > 1) h -= 1; + if(h < 1.0f / 6.0f) + return m1 + (m2 - m1) * h * 6.0f; + else if(h < 3.0f / 6.0f) + return m2; + else if(h < 4.0f / 6.0f) + return m1 + (m2 - m1) * (2.0f / 3.0f - h) * 6.0f; + return m1; +} + +NVGcolor nvgHSLA(float h, float s, float l, unsigned char a) +{ + float m1, m2; + NVGcolor col; + h = nvg__modf(h, 1.0f); + if(h < 0.0f) h += 1.0f; + s = nvg__clampf(s, 0.0f, 1.0f); + l = nvg__clampf(l, 0.0f, 1.0f); + m2 = l <= 0.5f ? (l * (1 + s)) : (l + s - l * s); + m1 = 2 * l - m2; + col.ch.r = nvg__clampf(nvg__hue(h + 1.0f / 3.0f, m1, m2), 0.0f, 1.0f); + col.ch.g = nvg__clampf(nvg__hue(h, m1, m2), 0.0f, 1.0f); + col.ch.b = nvg__clampf(nvg__hue(h - 1.0f / 3.0f, m1, m2), 0.0f, 1.0f); + col.ch.a = a / 255.0f; + return col; +} + +void nvgTransformIdentity(float * t) +{ + t[0] = 1.0f; + t[1] = 0.0f; + t[2] = 0.0f; + t[3] = 1.0f; + t[4] = 0.0f; + t[5] = 0.0f; +} + +void nvgTransformTranslate(float * t, float tx, float ty) +{ + t[0] = 1.0f; + t[1] = 0.0f; + t[2] = 0.0f; + t[3] = 1.0f; + t[4] = tx; + t[5] = ty; +} + +void nvgTransformScale(float * t, float sx, float sy) +{ + t[0] = sx; + t[1] = 0.0f; + t[2] = 0.0f; + t[3] = sy; + t[4] = 0.0f; + t[5] = 0.0f; +} + +void nvgTransformRotate(float * t, float a) +{ + float cs = nvg__cosf(a), sn = nvg__sinf(a); + t[0] = cs; + t[1] = sn; + t[2] = -sn; + t[3] = cs; + t[4] = 0.0f; + t[5] = 0.0f; +} + +void nvgTransformSkewX(float * t, float a) +{ + t[0] = 1.0f; + t[1] = 0.0f; + t[2] = nvg__tanf(a); + t[3] = 1.0f; + t[4] = 0.0f; + t[5] = 0.0f; +} + +void nvgTransformSkewY(float * t, float a) +{ + t[0] = 1.0f; + t[1] = nvg__tanf(a); + t[2] = 0.0f; + t[3] = 1.0f; + t[4] = 0.0f; + t[5] = 0.0f; +} + +void nvgTransformMultiply(float * t, const float * s) +{ + float t0 = t[0] * s[0] + t[1] * s[2]; + float t2 = t[2] * s[0] + t[3] * s[2]; + float t4 = t[4] * s[0] + t[5] * s[2] + s[4]; + t[1] = t[0] * s[1] + t[1] * s[3]; + t[3] = t[2] * s[1] + t[3] * s[3]; + t[5] = t[4] * s[1] + t[5] * s[3] + s[5]; + t[0] = t0; + t[2] = t2; + t[4] = t4; +} + +void nvgTransformPremultiply(float * t, const float * s) +{ + float s2[6]; + lv_memcpy(s2, s, sizeof(float) * 6); + nvgTransformMultiply(s2, t); + lv_memcpy(t, s2, sizeof(float) * 6); +} + +int nvgTransformInverse(float * inv, const float * t) +{ + double invdet, det = (double)t[0] * t[3] - (double)t[2] * t[1]; + if(det > -1e-6 && det < 1e-6) { + nvgTransformIdentity(inv); + return 0; + } + invdet = 1.0 / det; + inv[0] = (float)(t[3] * invdet); + inv[2] = (float)(-t[2] * invdet); + inv[4] = (float)(((double)t[2] * t[5] - (double)t[3] * t[4]) * invdet); + inv[1] = (float)(-t[1] * invdet); + inv[3] = (float)(t[0] * invdet); + inv[5] = (float)(((double)t[1] * t[4] - (double)t[0] * t[5]) * invdet); + return 1; +} + +void nvgTransformPoint(float * dx, float * dy, const float * t, float sx, float sy) +{ + *dx = sx * t[0] + sy * t[2] + t[4]; + *dy = sx * t[1] + sy * t[3] + t[5]; +} + +float nvgDegToRad(float deg) +{ + return deg / 180.0f * NVG_PI; +} + +float nvgRadToDeg(float rad) +{ + return rad / NVG_PI * 180.0f; +} + +static void nvg__setPaintColor(NVGpaint * p, NVGcolor color) +{ + lv_memzero(p, sizeof(*p)); + nvgTransformIdentity(p->xform); + p->radius = 0.0f; + p->feather = 1.0f; + p->innerColor = color; + p->outerColor = color; +} + + +// State handling +void nvgSave(NVGcontext * ctx) +{ + if(ctx->nstates >= NVG_MAX_STATES) + return; + if(ctx->nstates > 0) + lv_memcpy(&ctx->states[ctx->nstates], &ctx->states[ctx->nstates - 1], sizeof(NVGstate)); + ctx->nstates++; +} + +void nvgRestore(NVGcontext * ctx) +{ + if(ctx->nstates <= 1) + return; + ctx->nstates--; +} + +void nvgReset(NVGcontext * ctx) +{ + NVGstate * state = nvg__getState(ctx); + lv_memzero(state, sizeof(*state)); + + nvg__setPaintColor(&state->fill, nvgRGBA(255, 255, 255, 255)); + nvg__setPaintColor(&state->stroke, nvgRGBA(0, 0, 0, 255)); + state->compositeOperation = nvg__compositeOperationState(NVG_SOURCE_OVER); + state->shapeAntiAlias = 1; + state->strokeWidth = 1.0f; + state->miterLimit = 10.0f; + state->lineCap = NVG_BUTT; + state->lineJoin = NVG_MITER; + state->alpha = 1.0f; + nvgTransformIdentity(state->xform); + + state->scissor.extent[0] = -1.0f; + state->scissor.extent[1] = -1.0f; + + state->fontSize = 16.0f; + state->letterSpacing = 0.0f; + state->lineHeight = 1.0f; + state->fontBlur = 0.0f; + state->textAlign = NVG_ALIGN_LEFT | NVG_ALIGN_BASELINE; + state->fontId = 0; +} + +// State setting +void nvgShapeAntiAlias(NVGcontext * ctx, int enabled) +{ + NVGstate * state = nvg__getState(ctx); + state->shapeAntiAlias = enabled; +} + +void nvgStrokeWidth(NVGcontext * ctx, float width) +{ + NVGstate * state = nvg__getState(ctx); + state->strokeWidth = width; +} + +void nvgMiterLimit(NVGcontext * ctx, float limit) +{ + NVGstate * state = nvg__getState(ctx); + state->miterLimit = limit; +} + +void nvgLineCap(NVGcontext * ctx, int cap) +{ + NVGstate * state = nvg__getState(ctx); + state->lineCap = cap; +} + +void nvgLineJoin(NVGcontext * ctx, int join) +{ + NVGstate * state = nvg__getState(ctx); + state->lineJoin = join; +} + +void nvgGlobalAlpha(NVGcontext * ctx, float alpha) +{ + NVGstate * state = nvg__getState(ctx); + state->alpha = alpha; +} + +void nvgTransform(NVGcontext * ctx, float a, float b, float c, float d, float e, float f) +{ + NVGstate * state = nvg__getState(ctx); + float t[6] = { a, b, c, d, e, f }; + nvgTransformPremultiply(state->xform, t); +} + +void nvgResetTransform(NVGcontext * ctx) +{ + NVGstate * state = nvg__getState(ctx); + nvgTransformIdentity(state->xform); +} + +void nvgTranslate(NVGcontext * ctx, float x, float y) +{ + NVGstate * state = nvg__getState(ctx); + float t[6]; + nvgTransformTranslate(t, x, y); + nvgTransformPremultiply(state->xform, t); +} + +void nvgRotate(NVGcontext * ctx, float angle) +{ + NVGstate * state = nvg__getState(ctx); + float t[6]; + nvgTransformRotate(t, angle); + nvgTransformPremultiply(state->xform, t); +} + +void nvgSkewX(NVGcontext * ctx, float angle) +{ + NVGstate * state = nvg__getState(ctx); + float t[6]; + nvgTransformSkewX(t, angle); + nvgTransformPremultiply(state->xform, t); +} + +void nvgSkewY(NVGcontext * ctx, float angle) +{ + NVGstate * state = nvg__getState(ctx); + float t[6]; + nvgTransformSkewY(t, angle); + nvgTransformPremultiply(state->xform, t); +} + +void nvgScale(NVGcontext * ctx, float x, float y) +{ + NVGstate * state = nvg__getState(ctx); + float t[6]; + nvgTransformScale(t, x, y); + nvgTransformPremultiply(state->xform, t); +} + +void nvgCurrentTransform(NVGcontext * ctx, float * xform) +{ + NVGstate * state = nvg__getState(ctx); + if(xform == NULL) return; + lv_memcpy(xform, state->xform, sizeof(float) * 6); +} + +void nvgStrokeColor(NVGcontext * ctx, NVGcolor color) +{ + NVGstate * state = nvg__getState(ctx); + nvg__setPaintColor(&state->stroke, color); +} + +void nvgStrokePaint(NVGcontext * ctx, NVGpaint paint) +{ + NVGstate * state = nvg__getState(ctx); + state->stroke = paint; + nvgTransformMultiply(state->stroke.xform, state->xform); +} + +void nvgFillColor(NVGcontext * ctx, NVGcolor color) +{ + NVGstate * state = nvg__getState(ctx); + nvg__setPaintColor(&state->fill, color); +} + +void nvgFillPaint(NVGcontext * ctx, NVGpaint paint) +{ + NVGstate * state = nvg__getState(ctx); + state->fill = paint; + nvgTransformMultiply(state->fill.xform, state->xform); +} + +int nvgCreateImage(NVGcontext * ctx, int w, int h, int imageFlags, int format, const unsigned char * data) +{ + return ctx->params.renderCreateTexture(ctx->params.userPtr, format, w, h, imageFlags, data); +} + +void nvgUpdateImage(NVGcontext * ctx, int image, const unsigned char * data) +{ + int w, h; + ctx->params.renderGetTextureSize(ctx->params.userPtr, image, &w, &h); + ctx->params.renderUpdateTexture(ctx->params.userPtr, image, 0, 0, w, h, data); +} + +void nvgImageSize(NVGcontext * ctx, int image, int * w, int * h) +{ + ctx->params.renderGetTextureSize(ctx->params.userPtr, image, w, h); +} + +void nvgDeleteImage(NVGcontext * ctx, int image) +{ + ctx->params.renderDeleteTexture(ctx->params.userPtr, image); +} + +NVGpaint nvgLinearGradient(NVGcontext * ctx, + float sx, float sy, float ex, float ey, + NVGcolor icol, NVGcolor ocol) +{ + NVGpaint p; + float dx, dy, d; + const float large = 1e5; + NVG_NOTUSED(ctx); + lv_memzero(&p, sizeof(p)); + + // Calculate transform aligned to the line + dx = ex - sx; + dy = ey - sy; + d = sqrtf(dx * dx + dy * dy); + if(d > 0.0001f) { + dx /= d; + dy /= d; + } + else { + dx = 0; + dy = 1; + } + + p.xform[0] = dy; + p.xform[1] = -dx; + p.xform[2] = dx; + p.xform[3] = dy; + p.xform[4] = sx - dx * large; + p.xform[5] = sy - dy * large; + + p.extent[0] = large; + p.extent[1] = large + d * 0.5f; + + p.radius = 0.0f; + + p.feather = nvg__maxf(1.0f, d); + + p.innerColor = icol; + p.outerColor = ocol; + + return p; +} + +NVGpaint nvgRadialGradient(NVGcontext * ctx, + float cx, float cy, float inr, float outr, + NVGcolor icol, NVGcolor ocol) +{ + NVGpaint p; + float r = (inr + outr) * 0.5f; + float f = (outr - inr); + NVG_NOTUSED(ctx); + lv_memzero(&p, sizeof(p)); + + nvgTransformIdentity(p.xform); + p.xform[4] = cx; + p.xform[5] = cy; + + p.extent[0] = r; + p.extent[1] = r; + + p.radius = r; + + p.feather = nvg__maxf(1.0f, f); + + p.innerColor = icol; + p.outerColor = ocol; + + return p; +} + +NVGpaint nvgBoxGradient(NVGcontext * ctx, + float x, float y, float w, float h, float r, float f, + NVGcolor icol, NVGcolor ocol) +{ + NVGpaint p; + NVG_NOTUSED(ctx); + lv_memzero(&p, sizeof(p)); + + nvgTransformIdentity(p.xform); + p.xform[4] = x + w * 0.5f; + p.xform[5] = y + h * 0.5f; + + p.extent[0] = w * 0.5f; + p.extent[1] = h * 0.5f; + + p.radius = r; + + p.feather = nvg__maxf(1.0f, f); + + p.innerColor = icol; + p.outerColor = ocol; + + return p; +} + + +NVGpaint nvgImagePattern(NVGcontext * ctx, + float cx, float cy, float w, float h, float angle, + int image, float alpha) +{ + NVGpaint p; + NVG_NOTUSED(ctx); + lv_memzero(&p, sizeof(p)); + + nvgTransformRotate(p.xform, angle); + p.xform[4] = cx; + p.xform[5] = cy; + + p.extent[0] = w; + p.extent[1] = h; + + p.image = image; + + p.innerColor = p.outerColor = nvgRGBAf(1, 1, 1, alpha); + + return p; +} + +// Scissoring +void nvgScissor(NVGcontext * ctx, float x, float y, float w, float h) +{ + NVGstate * state = nvg__getState(ctx); + + w = nvg__maxf(0.0f, w); + h = nvg__maxf(0.0f, h); + + nvgTransformIdentity(state->scissor.xform); + state->scissor.xform[4] = x + w * 0.5f; + state->scissor.xform[5] = y + h * 0.5f; + nvgTransformMultiply(state->scissor.xform, state->xform); + + state->scissor.extent[0] = w * 0.5f; + state->scissor.extent[1] = h * 0.5f; +} + +static void nvg__isectRects(float * dst, + float ax, float ay, float aw, float ah, + float bx, float by, float bw, float bh) +{ + float minx = nvg__maxf(ax, bx); + float miny = nvg__maxf(ay, by); + float maxx = nvg__minf(ax + aw, bx + bw); + float maxy = nvg__minf(ay + ah, by + bh); + dst[0] = minx; + dst[1] = miny; + dst[2] = nvg__maxf(0.0f, maxx - minx); + dst[3] = nvg__maxf(0.0f, maxy - miny); +} + +void nvgIntersectScissor(NVGcontext * ctx, float x, float y, float w, float h) +{ + NVGstate * state = nvg__getState(ctx); + float pxform[6], invxorm[6]; + float rect[4]; + float ex, ey, tex, tey; + + // If no previous scissor has been set, set the scissor as current scissor. + if(state->scissor.extent[0] < 0) { + nvgScissor(ctx, x, y, w, h); + return; + } + + // Transform the current scissor rect into current transform space. + // If there is difference in rotation, this will be approximation. + lv_memcpy(pxform, state->scissor.xform, sizeof(float) * 6); + ex = state->scissor.extent[0]; + ey = state->scissor.extent[1]; + nvgTransformInverse(invxorm, state->xform); + nvgTransformMultiply(pxform, invxorm); + tex = ex * nvg__absf(pxform[0]) + ey * nvg__absf(pxform[2]); + tey = ex * nvg__absf(pxform[1]) + ey * nvg__absf(pxform[3]); + + // Intersect rects. + nvg__isectRects(rect, pxform[4] - tex, pxform[5] - tey, tex * 2, tey * 2, x, y, w, h); + + nvgScissor(ctx, rect[0], rect[1], rect[2], rect[3]); +} + +void nvgResetScissor(NVGcontext * ctx) +{ + NVGstate * state = nvg__getState(ctx); + lv_memzero(state->scissor.xform, sizeof(state->scissor.xform)); + state->scissor.extent[0] = -1.0f; + state->scissor.extent[1] = -1.0f; +} + +// Global composite operation. +void nvgGlobalCompositeOperation(NVGcontext * ctx, int op) +{ + NVGstate * state = nvg__getState(ctx); + state->compositeOperation = nvg__compositeOperationState(op); +} + +void nvgGlobalCompositeBlendFunc(NVGcontext * ctx, int sfactor, int dfactor) +{ + nvgGlobalCompositeBlendFuncSeparate(ctx, sfactor, dfactor, sfactor, dfactor); +} + +void nvgGlobalCompositeBlendFuncSeparate(NVGcontext * ctx, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) +{ + NVGcompositeOperationState op; + op.srcRGB = srcRGB; + op.dstRGB = dstRGB; + op.srcAlpha = srcAlpha; + op.dstAlpha = dstAlpha; + + NVGstate * state = nvg__getState(ctx); + state->compositeOperation = op; +} + +static int nvg__ptEquals(float x1, float y1, float x2, float y2, float tol) +{ + float dx = x2 - x1; + float dy = y2 - y1; + return dx * dx + dy * dy < tol * tol; +} + +static float nvg__distPtSeg(float x, float y, float px, float py, float qx, float qy) +{ + float pqx, pqy, dx, dy, d, t; + pqx = qx - px; + pqy = qy - py; + dx = x - px; + dy = y - py; + d = pqx * pqx + pqy * pqy; + t = pqx * dx + pqy * dy; + if(d > 0) t /= d; + if(t < 0) t = 0; + else if(t > 1) t = 1; + dx = px + t * pqx - x; + dy = py + t * pqy - y; + return dx * dx + dy * dy; +} + +static void nvg__appendCommands(NVGcontext * ctx, float * vals, int nvals) +{ + NVGstate * state = nvg__getState(ctx); + int i; + + if(ctx->ncommands + nvals > ctx->ccommands) { + float * commands; + int ccommands = ctx->ncommands + nvals + ctx->ccommands / 2; + commands = (float *)lv_realloc(ctx->commands, sizeof(float) * ccommands); + if(commands == NULL) return; + ctx->commands = commands; + ctx->ccommands = ccommands; + } + + if((int)vals[0] != NVG_CLOSE && (int)vals[0] != NVG_WINDING) { + ctx->commandx = vals[nvals - 2]; + ctx->commandy = vals[nvals - 1]; + } + + // transform commands + i = 0; + while(i < nvals) { + int cmd = (int)vals[i]; + switch(cmd) { + case NVG_MOVETO: + nvgTransformPoint(&vals[i + 1], &vals[i + 2], state->xform, vals[i + 1], vals[i + 2]); + i += 3; + break; + case NVG_LINETO: + nvgTransformPoint(&vals[i + 1], &vals[i + 2], state->xform, vals[i + 1], vals[i + 2]); + i += 3; + break; + case NVG_BEZIERTO: + nvgTransformPoint(&vals[i + 1], &vals[i + 2], state->xform, vals[i + 1], vals[i + 2]); + nvgTransformPoint(&vals[i + 3], &vals[i + 4], state->xform, vals[i + 3], vals[i + 4]); + nvgTransformPoint(&vals[i + 5], &vals[i + 6], state->xform, vals[i + 5], vals[i + 6]); + i += 7; + break; + case NVG_CLOSE: + i++; + break; + case NVG_WINDING: + i += 2; + break; + default: + i++; + } + } + + lv_memcpy(&ctx->commands[ctx->ncommands], vals, nvals * sizeof(float)); + + ctx->ncommands += nvals; +} + + +static void nvg__clearPathCache(NVGcontext * ctx) +{ + ctx->cache->npoints = 0; + ctx->cache->npaths = 0; +} + +static NVGpath * nvg__lastPath(NVGcontext * ctx) +{ + if(ctx->cache->npaths > 0) + return &ctx->cache->paths[ctx->cache->npaths - 1]; + return NULL; +} + +static void nvg__addPath(NVGcontext * ctx) +{ + NVGpath * path; + if(ctx->cache->npaths + 1 > ctx->cache->cpaths) { + NVGpath * paths; + int cpaths = ctx->cache->npaths + 1 + ctx->cache->cpaths / 2; + paths = (NVGpath *)lv_realloc(ctx->cache->paths, sizeof(NVGpath) * cpaths); + if(paths == NULL) return; + ctx->cache->paths = paths; + ctx->cache->cpaths = cpaths; + } + path = &ctx->cache->paths[ctx->cache->npaths]; + lv_memzero(path, sizeof(*path)); + path->first = ctx->cache->npoints; + path->winding = NVG_CCW; + + ctx->cache->npaths++; +} + +static NVGpoint * nvg__lastPoint(NVGcontext * ctx) +{ + if(ctx->cache->npoints > 0) + return &ctx->cache->points[ctx->cache->npoints - 1]; + return NULL; +} + +static void nvg__addPoint(NVGcontext * ctx, float x, float y, int flags) +{ + NVGpath * path = nvg__lastPath(ctx); + NVGpoint * pt; + if(path == NULL) return; + + if(path->count > 0 && ctx->cache->npoints > 0) { + pt = nvg__lastPoint(ctx); + if(nvg__ptEquals(pt->x, pt->y, x, y, ctx->distTol)) { + pt->flags |= flags; + return; + } + } + + if(ctx->cache->npoints + 1 > ctx->cache->cpoints) { + NVGpoint * points; + int cpoints = ctx->cache->npoints + 1 + ctx->cache->cpoints / 2; + points = (NVGpoint *)lv_realloc(ctx->cache->points, sizeof(NVGpoint) * cpoints); + if(points == NULL) return; + ctx->cache->points = points; + ctx->cache->cpoints = cpoints; + } + + pt = &ctx->cache->points[ctx->cache->npoints]; + lv_memzero(pt, sizeof(*pt)); + pt->x = x; + pt->y = y; + pt->flags = (unsigned char)flags; + + ctx->cache->npoints++; + path->count++; +} + +static void nvg__closePath(NVGcontext * ctx) +{ + NVGpath * path = nvg__lastPath(ctx); + if(path == NULL) return; + path->closed = 1; +} + +static void nvg__pathWinding(NVGcontext * ctx, int winding) +{ + NVGpath * path = nvg__lastPath(ctx); + if(path == NULL) return; + path->winding = winding; +} + +static float nvg__getAverageScale(float * t) +{ + float sx = sqrtf(t[0] * t[0] + t[2] * t[2]); + float sy = sqrtf(t[1] * t[1] + t[3] * t[3]); + return (sx + sy) * 0.5f; +} + +static NVGvertex * nvg__allocTempVerts(NVGcontext * ctx, int nverts) +{ + if(nverts > ctx->cache->cverts) { + NVGvertex * verts; + int cverts = (nverts + 0xff) & ~0xff; // Round up to prevent allocations when things change just slightly. + verts = (NVGvertex *)lv_realloc(ctx->cache->verts, sizeof(NVGvertex) * cverts); + if(verts == NULL) return NULL; + ctx->cache->verts = verts; + ctx->cache->cverts = cverts; + } + + return ctx->cache->verts; +} + +static float nvg__triarea2(float ax, float ay, float bx, float by, float cx, float cy) +{ + float abx = bx - ax; + float aby = by - ay; + float acx = cx - ax; + float acy = cy - ay; + return acx * aby - abx * acy; +} + +static float nvg__polyArea(NVGpoint * pts, int npts) +{ + int i; + float area = 0; + for(i = 2; i < npts; i++) { + NVGpoint * a = &pts[0]; + NVGpoint * b = &pts[i - 1]; + NVGpoint * c = &pts[i]; + area += nvg__triarea2(a->x, a->y, b->x, b->y, c->x, c->y); + } + return area * 0.5f; +} + +static void nvg__polyReverse(NVGpoint * pts, int npts) +{ + NVGpoint tmp; + int i = 0, j = npts - 1; + while(i < j) { + tmp = pts[i]; + pts[i] = pts[j]; + pts[j] = tmp; + i++; + j--; + } +} + + +static void nvg__vset(NVGvertex * vtx, float x, float y, float u, float v) +{ + vtx->x = x; + vtx->y = y; + vtx->u = u; + vtx->v = v; +} + +static void nvg__tesselateBezier(NVGcontext * ctx, + float x1, float y1, float x2, float y2, + float x3, float y3, float x4, float y4, + int level, int type) +{ + float x12, y12, x23, y23, x34, y34, x123, y123, x234, y234, x1234, y1234; + float dx, dy, d2, d3; + + if(level > 10) return; + + x12 = (x1 + x2) * 0.5f; + y12 = (y1 + y2) * 0.5f; + x23 = (x2 + x3) * 0.5f; + y23 = (y2 + y3) * 0.5f; + x34 = (x3 + x4) * 0.5f; + y34 = (y3 + y4) * 0.5f; + x123 = (x12 + x23) * 0.5f; + y123 = (y12 + y23) * 0.5f; + + dx = x4 - x1; + dy = y4 - y1; + d2 = nvg__absf(((x2 - x4) * dy - (y2 - y4) * dx)); + d3 = nvg__absf(((x3 - x4) * dy - (y3 - y4) * dx)); + + if((d2 + d3) * (d2 + d3) < ctx->tessTol * (dx * dx + dy * dy)) { + nvg__addPoint(ctx, x4, y4, type); + return; + } + + /* if (nvg__absf(x1+x3-x2-x2) + nvg__absf(y1+y3-y2-y2) + nvg__absf(x2+x4-x3-x3) + nvg__absf(y2+y4-y3-y3) < ctx->tessTol) { + nvg__addPoint(ctx, x4, y4, type); + return; + }*/ + + x234 = (x23 + x34) * 0.5f; + y234 = (y23 + y34) * 0.5f; + x1234 = (x123 + x234) * 0.5f; + y1234 = (y123 + y234) * 0.5f; + + nvg__tesselateBezier(ctx, x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1, 0); + nvg__tesselateBezier(ctx, x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1, type); +} + +static void nvg__flattenPaths(NVGcontext * ctx) +{ + NVGpathCache * cache = ctx->cache; + // NVGstate* state = nvg__getState(ctx); + NVGpoint * last; + NVGpoint * p0; + NVGpoint * p1; + NVGpoint * pts; + NVGpath * path; + int i, j; + float * cp1; + float * cp2; + float * p; + float area; + + if(cache->npaths > 0) + return; + + // Flatten + i = 0; + while(i < ctx->ncommands) { + int cmd = (int)ctx->commands[i]; + switch(cmd) { + case NVG_MOVETO: + nvg__addPath(ctx); + p = &ctx->commands[i + 1]; + nvg__addPoint(ctx, p[0], p[1], NVG_PT_CORNER); + i += 3; + break; + case NVG_LINETO: + p = &ctx->commands[i + 1]; + nvg__addPoint(ctx, p[0], p[1], NVG_PT_CORNER); + i += 3; + break; + case NVG_BEZIERTO: + last = nvg__lastPoint(ctx); + if(last != NULL) { + cp1 = &ctx->commands[i + 1]; + cp2 = &ctx->commands[i + 3]; + p = &ctx->commands[i + 5]; + nvg__tesselateBezier(ctx, last->x, last->y, cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1], 0, NVG_PT_CORNER); + } + i += 7; + break; + case NVG_CLOSE: + nvg__closePath(ctx); + i++; + break; + case NVG_WINDING: + nvg__pathWinding(ctx, (int)ctx->commands[i + 1]); + i += 2; + break; + default: + i++; + } + } + + cache->bounds[0] = cache->bounds[1] = 1e6f; + cache->bounds[2] = cache->bounds[3] = -1e6f; + + // Calculate the direction and length of line segments. + for(j = 0; j < cache->npaths; j++) { + path = &cache->paths[j]; + pts = &cache->points[path->first]; + + // If the first and last points are the same, remove the last, mark as closed path. + p0 = &pts[path->count - 1]; + p1 = &pts[0]; + if(nvg__ptEquals(p0->x, p0->y, p1->x, p1->y, ctx->distTol)) { + path->count--; + p0 = &pts[path->count - 1]; + path->closed = 1; + } + + // Enforce winding. + if(path->count > 2) { + area = nvg__polyArea(pts, path->count); + if(path->winding == NVG_CCW && area < 0.0f) + nvg__polyReverse(pts, path->count); + if(path->winding == NVG_CW && area > 0.0f) + nvg__polyReverse(pts, path->count); + } + + for(i = 0; i < path->count; i++) { + // Calculate segment direction and length + p0->dx = p1->x - p0->x; + p0->dy = p1->y - p0->y; + p0->len = nvg__normalize(&p0->dx, &p0->dy); + // Update bounds + cache->bounds[0] = nvg__minf(cache->bounds[0], p0->x); + cache->bounds[1] = nvg__minf(cache->bounds[1], p0->y); + cache->bounds[2] = nvg__maxf(cache->bounds[2], p0->x); + cache->bounds[3] = nvg__maxf(cache->bounds[3], p0->y); + // Advance + p0 = p1++; + } + } +} + +static int nvg__curveDivs(float r, float arc, float tol) +{ + float da = acosf(r / (r + tol)) * 2.0f; + return nvg__maxi(2, (int)ceilf(arc / da)); +} + +static void nvg__chooseBevel(int bevel, NVGpoint * p0, NVGpoint * p1, float w, + float * x0, float * y0, float * x1, float * y1) +{ + if(bevel) { + *x0 = p1->x + p0->dy * w; + *y0 = p1->y - p0->dx * w; + *x1 = p1->x + p1->dy * w; + *y1 = p1->y - p1->dx * w; + } + else { + *x0 = p1->x + p1->dmx * w; + *y0 = p1->y + p1->dmy * w; + *x1 = p1->x + p1->dmx * w; + *y1 = p1->y + p1->dmy * w; + } +} + +static NVGvertex * nvg__roundJoin(NVGvertex * dst, NVGpoint * p0, NVGpoint * p1, + float lw, float rw, float lu, float ru, int ncap, + float fringe) +{ + int i, n; + float dlx0 = p0->dy; + float dly0 = -p0->dx; + float dlx1 = p1->dy; + float dly1 = -p1->dx; + NVG_NOTUSED(fringe); + + if(p1->flags & NVG_PT_LEFT) { + float lx0, ly0, lx1, ly1, a0, a1; + nvg__chooseBevel(p1->flags & NVG_PR_INNERBEVEL, p0, p1, lw, &lx0, &ly0, &lx1, &ly1); + a0 = atan2f(-dly0, -dlx0); + a1 = atan2f(-dly1, -dlx1); + if(a1 > a0) a1 -= NVG_PI * 2; + + nvg__vset(dst, lx0, ly0, lu, 1); + dst++; + nvg__vset(dst, p1->x - dlx0 * rw, p1->y - dly0 * rw, ru, 1); + dst++; + + n = nvg__clampi((int)ceilf(((a0 - a1) / NVG_PI) * ncap), 2, ncap); + for(i = 0; i < n; i++) { + float u = i / (float)(n - 1); + float a = a0 + u * (a1 - a0); + float rx = p1->x + cosf(a) * rw; + float ry = p1->y + sinf(a) * rw; + nvg__vset(dst, p1->x, p1->y, 0.5f, 1); + dst++; + nvg__vset(dst, rx, ry, ru, 1); + dst++; + } + + nvg__vset(dst, lx1, ly1, lu, 1); + dst++; + nvg__vset(dst, p1->x - dlx1 * rw, p1->y - dly1 * rw, ru, 1); + dst++; + + } + else { + float rx0, ry0, rx1, ry1, a0, a1; + nvg__chooseBevel(p1->flags & NVG_PR_INNERBEVEL, p0, p1, -rw, &rx0, &ry0, &rx1, &ry1); + a0 = atan2f(dly0, dlx0); + a1 = atan2f(dly1, dlx1); + if(a1 < a0) a1 += NVG_PI * 2; + + nvg__vset(dst, p1->x + dlx0 * rw, p1->y + dly0 * rw, lu, 1); + dst++; + nvg__vset(dst, rx0, ry0, ru, 1); + dst++; + + n = nvg__clampi((int)ceilf(((a1 - a0) / NVG_PI) * ncap), 2, ncap); + for(i = 0; i < n; i++) { + float u = i / (float)(n - 1); + float a = a0 + u * (a1 - a0); + float lx = p1->x + cosf(a) * lw; + float ly = p1->y + sinf(a) * lw; + nvg__vset(dst, lx, ly, lu, 1); + dst++; + nvg__vset(dst, p1->x, p1->y, 0.5f, 1); + dst++; + } + + nvg__vset(dst, p1->x + dlx1 * rw, p1->y + dly1 * rw, lu, 1); + dst++; + nvg__vset(dst, rx1, ry1, ru, 1); + dst++; + + } + return dst; +} + +static NVGvertex * nvg__bevelJoin(NVGvertex * dst, NVGpoint * p0, NVGpoint * p1, + float lw, float rw, float lu, float ru, float fringe) +{ + float rx0, ry0, rx1, ry1; + float lx0, ly0, lx1, ly1; + float dlx0 = p0->dy; + float dly0 = -p0->dx; + float dlx1 = p1->dy; + float dly1 = -p1->dx; + NVG_NOTUSED(fringe); + + if(p1->flags & NVG_PT_LEFT) { + nvg__chooseBevel(p1->flags & NVG_PR_INNERBEVEL, p0, p1, lw, &lx0, &ly0, &lx1, &ly1); + + nvg__vset(dst, lx0, ly0, lu, 1); + dst++; + nvg__vset(dst, p1->x - dlx0 * rw, p1->y - dly0 * rw, ru, 1); + dst++; + + if(p1->flags & NVG_PT_BEVEL) { + nvg__vset(dst, lx0, ly0, lu, 1); + dst++; + nvg__vset(dst, p1->x - dlx0 * rw, p1->y - dly0 * rw, ru, 1); + dst++; + + nvg__vset(dst, lx1, ly1, lu, 1); + dst++; + nvg__vset(dst, p1->x - dlx1 * rw, p1->y - dly1 * rw, ru, 1); + dst++; + } + else { + rx0 = p1->x - p1->dmx * rw; + ry0 = p1->y - p1->dmy * rw; + + nvg__vset(dst, p1->x, p1->y, 0.5f, 1); + dst++; + nvg__vset(dst, p1->x - dlx0 * rw, p1->y - dly0 * rw, ru, 1); + dst++; + + nvg__vset(dst, rx0, ry0, ru, 1); + dst++; + nvg__vset(dst, rx0, ry0, ru, 1); + dst++; + + nvg__vset(dst, p1->x, p1->y, 0.5f, 1); + dst++; + nvg__vset(dst, p1->x - dlx1 * rw, p1->y - dly1 * rw, ru, 1); + dst++; + } + + nvg__vset(dst, lx1, ly1, lu, 1); + dst++; + nvg__vset(dst, p1->x - dlx1 * rw, p1->y - dly1 * rw, ru, 1); + dst++; + + } + else { + nvg__chooseBevel(p1->flags & NVG_PR_INNERBEVEL, p0, p1, -rw, &rx0, &ry0, &rx1, &ry1); + + nvg__vset(dst, p1->x + dlx0 * lw, p1->y + dly0 * lw, lu, 1); + dst++; + nvg__vset(dst, rx0, ry0, ru, 1); + dst++; + + if(p1->flags & NVG_PT_BEVEL) { + nvg__vset(dst, p1->x + dlx0 * lw, p1->y + dly0 * lw, lu, 1); + dst++; + nvg__vset(dst, rx0, ry0, ru, 1); + dst++; + + nvg__vset(dst, p1->x + dlx1 * lw, p1->y + dly1 * lw, lu, 1); + dst++; + nvg__vset(dst, rx1, ry1, ru, 1); + dst++; + } + else { + lx0 = p1->x + p1->dmx * lw; + ly0 = p1->y + p1->dmy * lw; + + nvg__vset(dst, p1->x + dlx0 * lw, p1->y + dly0 * lw, lu, 1); + dst++; + nvg__vset(dst, p1->x, p1->y, 0.5f, 1); + dst++; + + nvg__vset(dst, lx0, ly0, lu, 1); + dst++; + nvg__vset(dst, lx0, ly0, lu, 1); + dst++; + + nvg__vset(dst, p1->x + dlx1 * lw, p1->y + dly1 * lw, lu, 1); + dst++; + nvg__vset(dst, p1->x, p1->y, 0.5f, 1); + dst++; + } + + nvg__vset(dst, p1->x + dlx1 * lw, p1->y + dly1 * lw, lu, 1); + dst++; + nvg__vset(dst, rx1, ry1, ru, 1); + dst++; + } + + return dst; +} + +static NVGvertex * nvg__buttCapStart(NVGvertex * dst, NVGpoint * p, + float dx, float dy, float w, float d, + float aa, float u0, float u1) +{ + float px = p->x - dx * d; + float py = p->y - dy * d; + float dlx = dy; + float dly = -dx; + nvg__vset(dst, px + dlx * w - dx * aa, py + dly * w - dy * aa, u0, 0); + dst++; + nvg__vset(dst, px - dlx * w - dx * aa, py - dly * w - dy * aa, u1, 0); + dst++; + nvg__vset(dst, px + dlx * w, py + dly * w, u0, 1); + dst++; + nvg__vset(dst, px - dlx * w, py - dly * w, u1, 1); + dst++; + return dst; +} + +static NVGvertex * nvg__buttCapEnd(NVGvertex * dst, NVGpoint * p, + float dx, float dy, float w, float d, + float aa, float u0, float u1) +{ + float px = p->x + dx * d; + float py = p->y + dy * d; + float dlx = dy; + float dly = -dx; + nvg__vset(dst, px + dlx * w, py + dly * w, u0, 1); + dst++; + nvg__vset(dst, px - dlx * w, py - dly * w, u1, 1); + dst++; + nvg__vset(dst, px + dlx * w + dx * aa, py + dly * w + dy * aa, u0, 0); + dst++; + nvg__vset(dst, px - dlx * w + dx * aa, py - dly * w + dy * aa, u1, 0); + dst++; + return dst; +} + + +static NVGvertex * nvg__roundCapStart(NVGvertex * dst, NVGpoint * p, + float dx, float dy, float w, int ncap, + float aa, float u0, float u1) +{ + int i; + float px = p->x; + float py = p->y; + float dlx = dy; + float dly = -dx; + NVG_NOTUSED(aa); + for(i = 0; i < ncap; i++) { + float a = i / (float)(ncap - 1) * NVG_PI; + float ax = cosf(a) * w, ay = sinf(a) * w; + nvg__vset(dst, px - dlx * ax - dx * ay, py - dly * ax - dy * ay, u0, 1); + dst++; + nvg__vset(dst, px, py, 0.5f, 1); + dst++; + } + nvg__vset(dst, px + dlx * w, py + dly * w, u0, 1); + dst++; + nvg__vset(dst, px - dlx * w, py - dly * w, u1, 1); + dst++; + return dst; +} + +static NVGvertex * nvg__roundCapEnd(NVGvertex * dst, NVGpoint * p, + float dx, float dy, float w, int ncap, + float aa, float u0, float u1) +{ + int i; + float px = p->x; + float py = p->y; + float dlx = dy; + float dly = -dx; + NVG_NOTUSED(aa); + nvg__vset(dst, px + dlx * w, py + dly * w, u0, 1); + dst++; + nvg__vset(dst, px - dlx * w, py - dly * w, u1, 1); + dst++; + for(i = 0; i < ncap; i++) { + float a = i / (float)(ncap - 1) * NVG_PI; + float ax = cosf(a) * w, ay = sinf(a) * w; + nvg__vset(dst, px, py, 0.5f, 1); + dst++; + nvg__vset(dst, px - dlx * ax + dx * ay, py - dly * ax + dy * ay, u0, 1); + dst++; + } + return dst; +} + + +static void nvg__calculateJoins(NVGcontext * ctx, float w, int lineJoin, float miterLimit) +{ + NVGpathCache * cache = ctx->cache; + int i, j; + float iw = 0.0f; + + if(w > 0.0f) iw = 1.0f / w; + + // Calculate which joins needs extra vertices to append, and gather vertex count. + for(i = 0; i < cache->npaths; i++) { + NVGpath * path = &cache->paths[i]; + NVGpoint * pts = &cache->points[path->first]; + NVGpoint * p0 = &pts[path->count - 1]; + NVGpoint * p1 = &pts[0]; + int nleft = 0; + + path->nbevel = 0; + + for(j = 0; j < path->count; j++) { + float dlx0, dly0, dlx1, dly1, dmr2, cross, limit; + dlx0 = p0->dy; + dly0 = -p0->dx; + dlx1 = p1->dy; + dly1 = -p1->dx; + // Calculate extrusions + p1->dmx = (dlx0 + dlx1) * 0.5f; + p1->dmy = (dly0 + dly1) * 0.5f; + dmr2 = p1->dmx * p1->dmx + p1->dmy * p1->dmy; + if(dmr2 > 0.000001f) { + float scale = 1.0f / dmr2; + if(scale > 600.0f) { + scale = 600.0f; + } + p1->dmx *= scale; + p1->dmy *= scale; + } + + // Clear flags, but keep the corner. + p1->flags = (p1->flags & NVG_PT_CORNER) ? NVG_PT_CORNER : 0; + + // Keep track of left turns. + cross = p1->dx * p0->dy - p0->dx * p1->dy; + if(cross > 0.0f) { + nleft++; + p1->flags |= NVG_PT_LEFT; + } + + // Calculate if we should use bevel or miter for inner join. + limit = nvg__maxf(1.01f, nvg__minf(p0->len, p1->len) * iw); + if((dmr2 * limit * limit) < 1.0f) + p1->flags |= NVG_PR_INNERBEVEL; + + // Check to see if the corner needs to be beveled. + if(p1->flags & NVG_PT_CORNER) { + if((dmr2 * miterLimit * miterLimit) < 1.0f || lineJoin == NVG_BEVEL || lineJoin == NVG_ROUND) { + p1->flags |= NVG_PT_BEVEL; + } + } + + if((p1->flags & (NVG_PT_BEVEL | NVG_PR_INNERBEVEL)) != 0) + path->nbevel++; + + p0 = p1++; + } + + path->convex = (nleft == path->count) ? 1 : 0; + } +} + + +static int nvg__expandStroke(NVGcontext * ctx, float w, float fringe, int lineCap, int lineJoin, float miterLimit) +{ + NVGpathCache * cache = ctx->cache; + NVGvertex * verts; + NVGvertex * dst; + int cverts, i, j; + float aa = fringe;//ctx->fringeWidth; + float u0 = 0.0f, u1 = 1.0f; + int ncap = nvg__curveDivs(w, NVG_PI, ctx->tessTol); // Calculate divisions per half circle. + + w += aa * 0.5f; + + // Disable the gradient used for antialiasing when antialiasing is not used. + if(aa == 0.0f) { + u0 = 0.5f; + u1 = 0.5f; + } + + nvg__calculateJoins(ctx, w, lineJoin, miterLimit); + + // Calculate max vertex usage. + cverts = 0; + for(i = 0; i < cache->npaths; i++) { + NVGpath * path = &cache->paths[i]; + int loop = (path->closed == 0) ? 0 : 1; + if(lineJoin == NVG_ROUND) + cverts += (path->count + path->nbevel * (ncap + 2) + 1) * 2; // plus one for loop + else + cverts += (path->count + path->nbevel * 5 + 1) * 2; // plus one for loop + if(loop == 0) { + // space for caps + if(lineCap == NVG_ROUND) { + cverts += (ncap * 2 + 2) * 2; + } + else { + cverts += (3 + 3) * 2; + } + } + } + + verts = nvg__allocTempVerts(ctx, cverts); + if(verts == NULL) return 0; + + for(i = 0; i < cache->npaths; i++) { + NVGpath * path = &cache->paths[i]; + NVGpoint * pts = &cache->points[path->first]; + NVGpoint * p0; + NVGpoint * p1; + int s, e, loop; + float dx, dy; + + path->fill = 0; + path->nfill = 0; + + // Calculate fringe or stroke + loop = (path->closed == 0) ? 0 : 1; + dst = verts; + path->stroke = dst; + + if(loop) { + // Looping + p0 = &pts[path->count - 1]; + p1 = &pts[0]; + s = 0; + e = path->count; + } + else { + // Add cap + p0 = &pts[0]; + p1 = &pts[1]; + s = 1; + e = path->count - 1; + } + + if(loop == 0) { + // Add cap + dx = p1->x - p0->x; + dy = p1->y - p0->y; + nvg__normalize(&dx, &dy); + if(lineCap == NVG_BUTT) + dst = nvg__buttCapStart(dst, p0, dx, dy, w, -aa * 0.5f, aa, u0, u1); + else if(lineCap == NVG_BUTT || lineCap == NVG_SQUARE) + dst = nvg__buttCapStart(dst, p0, dx, dy, w, w - aa, aa, u0, u1); + else if(lineCap == NVG_ROUND) + dst = nvg__roundCapStart(dst, p0, dx, dy, w, ncap, aa, u0, u1); + } + + for(j = s; j < e; ++j) { + if((p1->flags & (NVG_PT_BEVEL | NVG_PR_INNERBEVEL)) != 0) { + if(lineJoin == NVG_ROUND) { + dst = nvg__roundJoin(dst, p0, p1, w, w, u0, u1, ncap, aa); + } + else { + dst = nvg__bevelJoin(dst, p0, p1, w, w, u0, u1, aa); + } + } + else { + nvg__vset(dst, p1->x + (p1->dmx * w), p1->y + (p1->dmy * w), u0, 1); + dst++; + nvg__vset(dst, p1->x - (p1->dmx * w), p1->y - (p1->dmy * w), u1, 1); + dst++; + } + p0 = p1++; + } + + if(loop) { + // Loop it + nvg__vset(dst, verts[0].x, verts[0].y, u0, 1); + dst++; + nvg__vset(dst, verts[1].x, verts[1].y, u1, 1); + dst++; + } + else { + // Add cap + dx = p1->x - p0->x; + dy = p1->y - p0->y; + nvg__normalize(&dx, &dy); + if(lineCap == NVG_BUTT) + dst = nvg__buttCapEnd(dst, p1, dx, dy, w, -aa * 0.5f, aa, u0, u1); + else if(lineCap == NVG_BUTT || lineCap == NVG_SQUARE) + dst = nvg__buttCapEnd(dst, p1, dx, dy, w, w - aa, aa, u0, u1); + else if(lineCap == NVG_ROUND) + dst = nvg__roundCapEnd(dst, p1, dx, dy, w, ncap, aa, u0, u1); + } + + path->nstroke = (int)(dst - verts); + + verts = dst; + } + + return 1; +} + +static int nvg__expandFill(NVGcontext * ctx, float w, int lineJoin, float miterLimit) +{ + NVGpathCache * cache = ctx->cache; + NVGvertex * verts; + NVGvertex * dst; + int cverts, convex, i, j; + float aa = ctx->fringeWidth; + int fringe = w > 0.0f; + + nvg__calculateJoins(ctx, w, lineJoin, miterLimit); + + // Calculate max vertex usage. + cverts = 0; + for(i = 0; i < cache->npaths; i++) { + NVGpath * path = &cache->paths[i]; + cverts += path->count + path->nbevel + 1; + if(fringe) + cverts += (path->count + path->nbevel * 5 + 1) * 2; // plus one for loop + } + + verts = nvg__allocTempVerts(ctx, cverts); + if(verts == NULL) return 0; + + convex = cache->npaths == 1 && cache->paths[0].convex; + + for(i = 0; i < cache->npaths; i++) { + NVGpath * path = &cache->paths[i]; + NVGpoint * pts = &cache->points[path->first]; + NVGpoint * p0; + NVGpoint * p1; + float rw, lw, woff; + float ru, lu; + + // Calculate shape vertices. + woff = 0.5f * aa; + dst = verts; + path->fill = dst; + + if(fringe) { + // Looping + p0 = &pts[path->count - 1]; + p1 = &pts[0]; + for(j = 0; j < path->count; ++j) { + if(p1->flags & NVG_PT_BEVEL) { + float dlx0 = p0->dy; + float dly0 = -p0->dx; + float dlx1 = p1->dy; + float dly1 = -p1->dx; + if(p1->flags & NVG_PT_LEFT) { + float lx = p1->x + p1->dmx * woff; + float ly = p1->y + p1->dmy * woff; + nvg__vset(dst, lx, ly, 0.5f, 1); + dst++; + } + else { + float lx0 = p1->x + dlx0 * woff; + float ly0 = p1->y + dly0 * woff; + float lx1 = p1->x + dlx1 * woff; + float ly1 = p1->y + dly1 * woff; + nvg__vset(dst, lx0, ly0, 0.5f, 1); + dst++; + nvg__vset(dst, lx1, ly1, 0.5f, 1); + dst++; + } + } + else { + nvg__vset(dst, p1->x + (p1->dmx * woff), p1->y + (p1->dmy * woff), 0.5f, 1); + dst++; + } + p0 = p1++; + } + } + else { + for(j = 0; j < path->count; ++j) { + nvg__vset(dst, pts[j].x, pts[j].y, 0.5f, 1); + dst++; + } + } + + path->nfill = (int)(dst - verts); + verts = dst; + + // Calculate fringe + if(fringe) { + lw = w + woff; + rw = w - woff; + lu = 0; + ru = 1; + dst = verts; + path->stroke = dst; + + // Create only half a fringe for convex shapes so that + // the shape can be rendered without stenciling. + if(convex) { + lw = woff; // This should generate the same vertex as fill inset above. + lu = 0.5f; // Set outline fade at middle. + } + + // Looping + p0 = &pts[path->count - 1]; + p1 = &pts[0]; + + for(j = 0; j < path->count; ++j) { + if((p1->flags & (NVG_PT_BEVEL | NVG_PR_INNERBEVEL)) != 0) { + dst = nvg__bevelJoin(dst, p0, p1, lw, rw, lu, ru, ctx->fringeWidth); + } + else { + nvg__vset(dst, p1->x + (p1->dmx * lw), p1->y + (p1->dmy * lw), lu, 1); + dst++; + nvg__vset(dst, p1->x - (p1->dmx * rw), p1->y - (p1->dmy * rw), ru, 1); + dst++; + } + p0 = p1++; + } + + // Loop it + nvg__vset(dst, verts[0].x, verts[0].y, lu, 1); + dst++; + nvg__vset(dst, verts[1].x, verts[1].y, ru, 1); + dst++; + + path->nstroke = (int)(dst - verts); + verts = dst; + } + else { + path->stroke = NULL; + path->nstroke = 0; + } + } + + return 1; +} + + +// Draw +void nvgBeginPath(NVGcontext * ctx) +{ + ctx->ncommands = 0; + nvg__clearPathCache(ctx); +} + +void nvgMoveTo(NVGcontext * ctx, float x, float y) +{ + float vals[] = { NVG_MOVETO, x, y }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgLineTo(NVGcontext * ctx, float x, float y) +{ + float vals[] = { NVG_LINETO, x, y }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgBezierTo(NVGcontext * ctx, float c1x, float c1y, float c2x, float c2y, float x, float y) +{ + float vals[] = { NVG_BEZIERTO, c1x, c1y, c2x, c2y, x, y }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgQuadTo(NVGcontext * ctx, float cx, float cy, float x, float y) +{ + float x0 = ctx->commandx; + float y0 = ctx->commandy; + float vals[] = { NVG_BEZIERTO, + x0 + 2.0f / 3.0f * (cx - x0), y0 + 2.0f / 3.0f * (cy - y0), + x + 2.0f / 3.0f * (cx - x), y + 2.0f / 3.0f * (cy - y), + x, y + }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgArcTo(NVGcontext * ctx, float x1, float y1, float x2, float y2, float radius) +{ + float x0 = ctx->commandx; + float y0 = ctx->commandy; + float dx0, dy0, dx1, dy1, a, d, cx, cy, a0, a1; + int dir; + + if(ctx->ncommands == 0) { + return; + } + + // Handle degenerate cases. + if(nvg__ptEquals(x0, y0, x1, y1, ctx->distTol) || + nvg__ptEquals(x1, y1, x2, y2, ctx->distTol) || + nvg__distPtSeg(x1, y1, x0, y0, x2, y2) < ctx->distTol * ctx->distTol || + radius < ctx->distTol) { + nvgLineTo(ctx, x1, y1); + return; + } + + // Calculate tangential circle to lines (x0,y0)-(x1,y1) and (x1,y1)-(x2,y2). + dx0 = x0 - x1; + dy0 = y0 - y1; + dx1 = x2 - x1; + dy1 = y2 - y1; + nvg__normalize(&dx0, &dy0); + nvg__normalize(&dx1, &dy1); + a = nvg__acosf(dx0 * dx1 + dy0 * dy1); + d = radius / nvg__tanf(a / 2.0f); + + // printf("a=%f° d=%f\n", a/NVG_PI*180.0f, d); + + if(d > 10000.0f) { + nvgLineTo(ctx, x1, y1); + return; + } + + if(nvg__cross(dx0, dy0, dx1, dy1) > 0.0f) { + cx = x1 + dx0 * d + dy0 * radius; + cy = y1 + dy0 * d + -dx0 * radius; + a0 = nvg__atan2f(dx0, -dy0); + a1 = nvg__atan2f(-dx1, dy1); + dir = NVG_CW; + // printf("CW c=(%f, %f) a0=%f° a1=%f°\n", cx, cy, a0/NVG_PI*180.0f, a1/NVG_PI*180.0f); + } + else { + cx = x1 + dx0 * d + -dy0 * radius; + cy = y1 + dy0 * d + dx0 * radius; + a0 = nvg__atan2f(-dx0, dy0); + a1 = nvg__atan2f(dx1, -dy1); + dir = NVG_CCW; + // printf("CCW c=(%f, %f) a0=%f° a1=%f°\n", cx, cy, a0/NVG_PI*180.0f, a1/NVG_PI*180.0f); + } + + nvgArc(ctx, cx, cy, radius, a0, a1, dir); +} + +void nvgClosePath(NVGcontext * ctx) +{ + float vals[] = { NVG_CLOSE }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgPathWinding(NVGcontext * ctx, int dir) +{ + float vals[] = { NVG_WINDING, (float)dir }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgArc(NVGcontext * ctx, float cx, float cy, float r, float a0, float a1, int dir) +{ + float a = 0, da = 0, hda = 0, kappa = 0; + float dx = 0, dy = 0, x = 0, y = 0, tanx = 0, tany = 0; + float px = 0, py = 0, ptanx = 0, ptany = 0; + float vals[3 + 5 * 7 + 100]; + int i, ndivs, nvals; + int move = ctx->ncommands > 0 ? NVG_LINETO : NVG_MOVETO; + + // Clamp angles + da = a1 - a0; + if(dir == NVG_CW) { + if(nvg__absf(da) >= NVG_PI * 2) { + da = NVG_PI * 2; + } + else { + while(da < 0.0f) da += NVG_PI * 2; + } + } + else { + if(nvg__absf(da) >= NVG_PI * 2) { + da = -NVG_PI * 2; + } + else { + while(da > 0.0f) da -= NVG_PI * 2; + } + } + + // Split arc into max 90 degree segments. + ndivs = nvg__maxi(1, nvg__mini((int)(nvg__absf(da) / (NVG_PI * 0.5f) + 0.5f), 5)); + hda = (da / (float)ndivs) / 2.0f; + kappa = nvg__absf(4.0f / 3.0f * (1.0f - nvg__cosf(hda)) / nvg__sinf(hda)); + + if(dir == NVG_CCW) + kappa = -kappa; + + nvals = 0; + for(i = 0; i <= ndivs; i++) { + a = a0 + da * (i / (float)ndivs); + dx = nvg__cosf(a); + dy = nvg__sinf(a); + x = cx + dx * r; + y = cy + dy * r; + tanx = -dy * r * kappa; + tany = dx * r * kappa; + + if(i == 0) { + vals[nvals++] = (float)move; + vals[nvals++] = x; + vals[nvals++] = y; + } + else { + vals[nvals++] = NVG_BEZIERTO; + vals[nvals++] = px + ptanx; + vals[nvals++] = py + ptany; + vals[nvals++] = x - tanx; + vals[nvals++] = y - tany; + vals[nvals++] = x; + vals[nvals++] = y; + } + px = x; + py = y; + ptanx = tanx; + ptany = tany; + } + + nvg__appendCommands(ctx, vals, nvals); +} + +void nvgRect(NVGcontext * ctx, float x, float y, float w, float h) +{ + float vals[] = { + NVG_MOVETO, x, y, + NVG_LINETO, x, y + h, + NVG_LINETO, x + w, y + h, + NVG_LINETO, x + w, y, + NVG_CLOSE + }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgRoundedRect(NVGcontext * ctx, float x, float y, float w, float h, float r) +{ + nvgRoundedRectVarying(ctx, x, y, w, h, r, r, r, r); +} + +void nvgRoundedRectVarying(NVGcontext * ctx, float x, float y, float w, float h, float radTopLeft, float radTopRight, + float radBottomRight, float radBottomLeft) +{ + if(radTopLeft < 0.1f && radTopRight < 0.1f && radBottomRight < 0.1f && radBottomLeft < 0.1f) { + nvgRect(ctx, x, y, w, h); + return; + } + else { + float halfw = nvg__absf(w) * 0.5f; + float halfh = nvg__absf(h) * 0.5f; + float rxBL = nvg__minf(radBottomLeft, halfw) * nvg__signf(w), ryBL = nvg__minf(radBottomLeft, halfh) * nvg__signf(h); + float rxBR = nvg__minf(radBottomRight, halfw) * nvg__signf(w), ryBR = nvg__minf(radBottomRight, halfh) * nvg__signf(h); + float rxTR = nvg__minf(radTopRight, halfw) * nvg__signf(w), ryTR = nvg__minf(radTopRight, halfh) * nvg__signf(h); + float rxTL = nvg__minf(radTopLeft, halfw) * nvg__signf(w), ryTL = nvg__minf(radTopLeft, halfh) * nvg__signf(h); + float vals[] = { + NVG_MOVETO, x, y + ryTL, + NVG_LINETO, x, y + h - ryBL, + NVG_BEZIERTO, x, y + h - ryBL * (1 - NVG_KAPPA90), x + rxBL * (1 - NVG_KAPPA90), y + h, x + rxBL, y + h, + NVG_LINETO, x + w - rxBR, y + h, + NVG_BEZIERTO, x + w - rxBR * (1 - NVG_KAPPA90), y + h, x + w, y + h - ryBR * (1 - NVG_KAPPA90), x + w, y + h - ryBR, + NVG_LINETO, x + w, y + ryTR, + NVG_BEZIERTO, x + w, y + ryTR * (1 - NVG_KAPPA90), x + w - rxTR * (1 - NVG_KAPPA90), y, x + w - rxTR, y, + NVG_LINETO, x + rxTL, y, + NVG_BEZIERTO, x + rxTL * (1 - NVG_KAPPA90), y, x, y + ryTL * (1 - NVG_KAPPA90), x, y + ryTL, + NVG_CLOSE + }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); + } +} + +void nvgEllipse(NVGcontext * ctx, float cx, float cy, float rx, float ry) +{ + float vals[] = { + NVG_MOVETO, cx - rx, cy, + NVG_BEZIERTO, cx - rx, cy + ry * NVG_KAPPA90, cx - rx * NVG_KAPPA90, cy + ry, cx, cy + ry, + NVG_BEZIERTO, cx + rx * NVG_KAPPA90, cy + ry, cx + rx, cy + ry * NVG_KAPPA90, cx + rx, cy, + NVG_BEZIERTO, cx + rx, cy - ry * NVG_KAPPA90, cx + rx * NVG_KAPPA90, cy - ry, cx, cy - ry, + NVG_BEZIERTO, cx - rx * NVG_KAPPA90, cy - ry, cx - rx, cy - ry * NVG_KAPPA90, cx - rx, cy, + NVG_CLOSE + }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgCircle(NVGcontext * ctx, float cx, float cy, float r) +{ + nvgEllipse(ctx, cx, cy, r, r); +} + +void nvgDebugDumpPathCache(NVGcontext * ctx) +{ + const NVGpath * path; + int i, j; + + LV_LOG_USER("Dumping %d cached paths", ctx->cache->npaths); + for(i = 0; i < ctx->cache->npaths; i++) { + path = &ctx->cache->paths[i]; + LV_LOG_USER(" - Path %d", i); + if(path->nfill) { + LV_LOG_USER(" - fill: %d", path->nfill); + for(j = 0; j < path->nfill; j++) + LV_LOG_USER("%f\t%f", path->fill[j].x, path->fill[j].y); + } + if(path->nstroke) { + LV_LOG_USER(" - stroke: %d", path->nstroke); + for(j = 0; j < path->nstroke; j++) + LV_LOG_USER("%f\t%f", path->stroke[j].x, path->stroke[j].y); + } + } +} + +void nvgFill(NVGcontext * ctx) +{ + NVGstate * state = nvg__getState(ctx); + const NVGpath * path; + NVGpaint fillPaint = state->fill; + int i; + + nvg__flattenPaths(ctx); + if(ctx->params.edgeAntiAlias && state->shapeAntiAlias) + nvg__expandFill(ctx, ctx->fringeWidth, NVG_MITER, 2.4f); + else + nvg__expandFill(ctx, 0.0f, NVG_MITER, 2.4f); + + // Apply global alpha + fillPaint.innerColor.ch.a *= state->alpha; + fillPaint.outerColor.ch.a *= state->alpha; + + ctx->params.renderFill(ctx->params.userPtr, &fillPaint, state->compositeOperation, &state->scissor, ctx->fringeWidth, + ctx->cache->bounds, ctx->cache->paths, ctx->cache->npaths); + + // Count triangles + for(i = 0; i < ctx->cache->npaths; i++) { + path = &ctx->cache->paths[i]; + ctx->fillTriCount += path->nfill - 2; + ctx->fillTriCount += path->nstroke - 2; + ctx->drawCallCount += 2; + } +} + +void nvgStroke(NVGcontext * ctx) +{ + NVGstate * state = nvg__getState(ctx); + float scale = nvg__getAverageScale(state->xform); + float strokeWidth = nvg__clampf(state->strokeWidth * scale, 0.0f, 200.0f); + NVGpaint strokePaint = state->stroke; + const NVGpath * path; + int i; + + + if(strokeWidth < ctx->fringeWidth) { + // If the stroke width is less than pixel size, use alpha to emulate coverage. + // Since coverage is area, scale by alpha*alpha. + float alpha = nvg__clampf(strokeWidth / ctx->fringeWidth, 0.0f, 1.0f); + strokePaint.innerColor.ch.a *= alpha * alpha; + strokePaint.outerColor.ch.a *= alpha * alpha; + strokeWidth = ctx->fringeWidth; + } + + // Apply global alpha + strokePaint.innerColor.ch.a *= state->alpha; + strokePaint.outerColor.ch.a *= state->alpha; + + nvg__flattenPaths(ctx); + + if(ctx->params.edgeAntiAlias && state->shapeAntiAlias) + nvg__expandStroke(ctx, strokeWidth * 0.5f, ctx->fringeWidth, state->lineCap, state->lineJoin, state->miterLimit); + else + nvg__expandStroke(ctx, strokeWidth * 0.5f, 0.0f, state->lineCap, state->lineJoin, state->miterLimit); + + ctx->params.renderStroke(ctx->params.userPtr, &strokePaint, state->compositeOperation, &state->scissor, + ctx->fringeWidth, + strokeWidth, ctx->cache->paths, ctx->cache->npaths); + + // Count triangles + for(i = 0; i < ctx->cache->npaths; i++) { + path = &ctx->cache->paths[i]; + ctx->strokeTriCount += path->nstroke - 2; + ctx->drawCallCount++; + } +} + +// Add fonts +int nvgCreateFont(NVGcontext * ctx, const char * name, const char * filename) +{ + (void)ctx; + (void)name; + (void)filename; + return -1; +} + +int nvgCreateFontAtIndex(NVGcontext * ctx, const char * name, const char * filename, const int fontIndex) +{ + (void)ctx; + (void)name; + (void)filename; + (void)fontIndex; + return -1; +} + +int nvgCreateFontMem(NVGcontext * ctx, const char * name, unsigned char * data, int ndata, int freeData) +{ + (void)ctx; + (void)name; + (void)data; + (void)ndata; + (void)freeData; + return -1; +} + +int nvgCreateFontMemAtIndex(NVGcontext * ctx, const char * name, unsigned char * data, int ndata, int freeData, + const int fontIndex) +{ + (void)ctx; + (void)name; + (void)data; + (void)ndata; + (void)freeData; + (void)fontIndex; + return -1; +} + +int nvgFindFont(NVGcontext * ctx, const char * name) +{ + (void)ctx; + (void)name; + return -1; +} + + +int nvgAddFallbackFontId(NVGcontext * ctx, int baseFont, int fallbackFont) +{ + (void)ctx; + (void)baseFont; + (void)fallbackFont; + return 0; +} + +int nvgAddFallbackFont(NVGcontext * ctx, const char * baseFont, const char * fallbackFont) +{ + (void)ctx; + (void)baseFont; + (void)fallbackFont; + return 0; +} + +void nvgResetFallbackFontsId(NVGcontext * ctx, int baseFont) +{ + (void)ctx; + (void)baseFont; +} + +void nvgResetFallbackFonts(NVGcontext * ctx, const char * baseFont) +{ + (void)ctx; + (void)baseFont; +} + +// State setting +void nvgFontSize(NVGcontext * ctx, float size) +{ + NVGstate * state = nvg__getState(ctx); + state->fontSize = size; +} + +void nvgFontBlur(NVGcontext * ctx, float blur) +{ + NVGstate * state = nvg__getState(ctx); + state->fontBlur = blur; +} + +void nvgTextLetterSpacing(NVGcontext * ctx, float spacing) +{ + NVGstate * state = nvg__getState(ctx); + state->letterSpacing = spacing; +} + +void nvgTextLineHeight(NVGcontext * ctx, float lineHeight) +{ + NVGstate * state = nvg__getState(ctx); + state->lineHeight = lineHeight; +} + +void nvgTextAlign(NVGcontext * ctx, int align) +{ + NVGstate * state = nvg__getState(ctx); + state->textAlign = align; +} + +void nvgFontFaceId(NVGcontext * ctx, int font) +{ + NVGstate * state = nvg__getState(ctx); + state->fontId = font; +} + +void nvgFontFace(NVGcontext * ctx, const char * font) +{ + (void)ctx; + (void)font; +} + +float nvgText(NVGcontext * ctx, float x, float y, const char * string, const char * end) +{ + (void)ctx; + (void)x; + (void)y; + (void)string; + (void)end; + return 0; +} + +void nvgTextBox(NVGcontext * ctx, float x, float y, float breakRowWidth, const char * string, const char * end) +{ + (void)ctx; + (void)x; + (void)y; + (void)breakRowWidth; + (void)string; + (void)end; +} + +int nvgTextBreakLines(NVGcontext * ctx, const char * string, const char * end, float breakRowWidth, NVGtextRow * rows, + int maxRows) +{ + (void)ctx; + (void)string; + (void)end; + (void)breakRowWidth; + (void)rows; + (void)maxRows; + return 0; +} + +float nvgTextBounds(NVGcontext * ctx, float x, float y, const char * string, const char * end, float * bounds) +{ + (void)ctx; + (void)x; + (void)y; + (void)string; + (void)end; + (void)bounds; + return 0; +} + +void nvgTextBoxBounds(NVGcontext * ctx, float x, float y, float breakRowWidth, const char * string, const char * end, + float * bounds) +{ + (void)ctx; + (void)x; + (void)y; + (void)breakRowWidth; + (void)string; + (void)end; + (void)bounds; +} + +void nvgTextMetrics(NVGcontext * ctx, float * ascender, float * descender, float * lineh) +{ + (void)ctx; + (void)ascender; + (void)descender; + (void)lineh; +} +// vim: ft=c nu noet ts=4 + +#endif /* LV_USE_NANOVG */ diff --git a/inc/lvgl/src/libs/nanovg/nanovg.h b/inc/lvgl/src/libs/nanovg/nanovg.h new file mode 100644 index 0000000..ece8bd6 --- /dev/null +++ b/inc/lvgl/src/libs/nanovg/nanovg.h @@ -0,0 +1,707 @@ +// +// Copyright (c) 2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef NANOVG_H +#define NANOVG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../lv_conf_internal.h" + +#if LV_USE_NANOVG + +#define NVG_PI 3.14159265358979323846264338327f + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +#endif + +typedef struct NVGcontext NVGcontext; + +union NVGcolor { + float rgba[4]; + struct { + float r, g, b, a; + } ch; +}; +typedef union NVGcolor NVGcolor; + +struct NVGpaint { + float xform[6]; + float extent[2]; + float radius; + float feather; + NVGcolor innerColor; + NVGcolor outerColor; + int image; +}; +typedef struct NVGpaint NVGpaint; + +enum NVGwinding { + NVG_CCW = 1, // Winding for solid shapes + NVG_CW = 2, // Winding for holes +}; + +enum NVGsolidity { + NVG_SOLID = 1, // CCW + NVG_HOLE = 2, // CW +}; + +enum NVGlineCap { + NVG_BUTT, + NVG_ROUND, + NVG_SQUARE, + NVG_BEVEL, + NVG_MITER, +}; + +enum NVGalign { + // Horizontal align + NVG_ALIGN_LEFT = 1 << 0, // Default, align text horizontally to left. + NVG_ALIGN_CENTER = 1 << 1, // Align text horizontally to center. + NVG_ALIGN_RIGHT = 1 << 2, // Align text horizontally to right. + // Vertical align + NVG_ALIGN_TOP = 1 << 3, // Align text vertically to top. + NVG_ALIGN_MIDDLE = 1 << 4, // Align text vertically to middle. + NVG_ALIGN_BOTTOM = 1 << 5, // Align text vertically to bottom. + NVG_ALIGN_BASELINE = 1 << 6, // Default, align text vertically to baseline. +}; + +enum NVGblendFactor { + NVG_ZERO = 1 << 0, + NVG_ONE = 1 << 1, + NVG_SRC_COLOR = 1 << 2, + NVG_ONE_MINUS_SRC_COLOR = 1 << 3, + NVG_DST_COLOR = 1 << 4, + NVG_ONE_MINUS_DST_COLOR = 1 << 5, + NVG_SRC_ALPHA = 1 << 6, + NVG_ONE_MINUS_SRC_ALPHA = 1 << 7, + NVG_DST_ALPHA = 1 << 8, + NVG_ONE_MINUS_DST_ALPHA = 1 << 9, + NVG_SRC_ALPHA_SATURATE = 1 << 10, +}; + +enum NVGcompositeOperation { + NVG_SOURCE_OVER, + NVG_SOURCE_IN, + NVG_SOURCE_OUT, + NVG_ATOP, + NVG_DESTINATION_OVER, + NVG_DESTINATION_IN, + NVG_DESTINATION_OUT, + NVG_DESTINATION_ATOP, + NVG_LIGHTER, + NVG_COPY, + NVG_XOR, +}; + +struct NVGcompositeOperationState { + int srcRGB; + int dstRGB; + int srcAlpha; + int dstAlpha; +}; +typedef struct NVGcompositeOperationState NVGcompositeOperationState; + +struct NVGglyphPosition { + const char * str; // Position of the glyph in the input string. + float x; // The x-coordinate of the logical glyph position. + float minx, maxx; // The bounds of the glyph shape. +}; +typedef struct NVGglyphPosition NVGglyphPosition; + +struct NVGtextRow { + const char * start; // Pointer to the input text where the row starts. + const char * end; // Pointer to the input text where the row ends (one past the last character). + const char * next; // Pointer to the beginning of the next row. + float width; // Logical width of the row. + float minx, + maxx; // Actual bounds of the row. Logical with and bounds can differ because of kerning and some parts over extending. +}; +typedef struct NVGtextRow NVGtextRow; + +enum NVGimageFlags { + NVG_IMAGE_GENERATE_MIPMAPS = 1 << 0, // Generate mipmaps during creation of the image. + NVG_IMAGE_REPEATX = 1 << 1, // Repeat image in X direction. + NVG_IMAGE_REPEATY = 1 << 2, // Repeat image in Y direction. + NVG_IMAGE_FLIPY = 1 << 3, // Flips (inverses) image in Y direction when rendered. + NVG_IMAGE_PREMULTIPLIED = 1 << 4, // Image data has premultiplied alpha. + NVG_IMAGE_NEAREST = 1 << 5, // Image interpolation is Nearest instead Linear +}; + +// Begin drawing a new frame +// Calls to nanovg drawing API should be wrapped in nvgBeginFrame() & nvgEndFrame() +// nvgBeginFrame() defines the size of the window to render to in relation currently +// set viewport (i.e. glViewport on GL backends). Device pixel ration allows to +// control the rendering on Hi-DPI devices. +// For example, GLFW returns two dimension for an opened window: window size and +// frame buffer size. In that case you would set windowWidth/Height to the window size +// devicePixelRatio to: frameBufferWidth / windowWidth. +void nvgBeginFrame(NVGcontext * ctx, float windowWidth, float windowHeight, float devicePixelRatio); + +// Cancels drawing the current frame. +void nvgCancelFrame(NVGcontext * ctx); + +// Ends drawing flushing remaining render state. +void nvgEndFrame(NVGcontext * ctx); + +// +// Composite operation +// +// The composite operations in NanoVG are modeled after HTML Canvas API, and +// the blend func is based on OpenGL (see corresponding manuals for more info). +// The colors in the blending state have premultiplied alpha. + +// Sets the composite operation. The op parameter should be one of NVGcompositeOperation. +void nvgGlobalCompositeOperation(NVGcontext * ctx, int op); + +// Sets the composite operation with custom pixel arithmetic. The parameters should be one of NVGblendFactor. +void nvgGlobalCompositeBlendFunc(NVGcontext * ctx, int sfactor, int dfactor); + +// Sets the composite operation with custom pixel arithmetic for RGB and alpha components separately. The parameters should be one of NVGblendFactor. +void nvgGlobalCompositeBlendFuncSeparate(NVGcontext * ctx, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha); + +// +// Color utils +// +// Colors in NanoVG are stored as unsigned ints in ABGR format. + +// Returns a color value from red, green, blue values. Alpha will be set to 255 (1.0f). +NVGcolor nvgRGB(unsigned char r, unsigned char g, unsigned char b); + +// Returns a color value from red, green, blue values. Alpha will be set to 1.0f. +NVGcolor nvgRGBf(float r, float g, float b); + + +// Returns a color value from red, green, blue and alpha values. +NVGcolor nvgRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +// Returns a color value from red, green, blue and alpha values. +NVGcolor nvgRGBAf(float r, float g, float b, float a); + + +// Linearly interpolates from color c0 to c1, and returns resulting color value. +NVGcolor nvgLerpRGBA(NVGcolor c0, NVGcolor c1, float u); + +// Sets transparency of a color value. +NVGcolor nvgTransRGBA(NVGcolor c0, unsigned char a); + +// Sets transparency of a color value. +NVGcolor nvgTransRGBAf(NVGcolor c0, float a); + +// Returns color value specified by hue, saturation and lightness. +// HSL values are all in range [0..1], alpha will be set to 255. +NVGcolor nvgHSL(float h, float s, float l); + +// Returns color value specified by hue, saturation and lightness and alpha. +// HSL values are all in range [0..1], alpha in range [0..255] +NVGcolor nvgHSLA(float h, float s, float l, unsigned char a); + +// +// State Handling +// +// NanoVG contains state which represents how paths will be rendered. +// The state contains transform, fill and stroke styles, text and font styles, +// and scissor clipping. + +// Pushes and saves the current render state into a state stack. +// A matching nvgRestore() must be used to restore the state. +void nvgSave(NVGcontext * ctx); + +// Pops and restores current render state. +void nvgRestore(NVGcontext * ctx); + +// Resets current render state to default values. Does not affect the render state stack. +void nvgReset(NVGcontext * ctx); + +// +// Render styles +// +// Fill and stroke render style can be either a solid color or a paint which is a gradient or a pattern. +// Solid color is simply defined as a color value, different kinds of paints can be created +// using nvgLinearGradient(), nvgBoxGradient(), nvgRadialGradient() and nvgImagePattern(). +// +// Current render style can be saved and restored using nvgSave() and nvgRestore(). + +// Sets whether to draw antialias for nvgStroke() and nvgFill(). It's enabled by default. +void nvgShapeAntiAlias(NVGcontext * ctx, int enabled); + +// Sets current stroke style to a solid color. +void nvgStrokeColor(NVGcontext * ctx, NVGcolor color); + +// Sets current stroke style to a paint, which can be a one of the gradients or a pattern. +void nvgStrokePaint(NVGcontext * ctx, NVGpaint paint); + +// Sets current fill style to a solid color. +void nvgFillColor(NVGcontext * ctx, NVGcolor color); + +// Sets current fill style to a paint, which can be a one of the gradients or a pattern. +void nvgFillPaint(NVGcontext * ctx, NVGpaint paint); + +// Sets the miter limit of the stroke style. +// Miter limit controls when a sharp corner is beveled. +void nvgMiterLimit(NVGcontext * ctx, float limit); + +// Sets the stroke width of the stroke style. +void nvgStrokeWidth(NVGcontext * ctx, float size); + +// Sets how the end of the line (cap) is drawn, +// Can be one of: NVG_BUTT (default), NVG_ROUND, NVG_SQUARE. +void nvgLineCap(NVGcontext * ctx, int cap); + +// Sets how sharp path corners are drawn. +// Can be one of NVG_MITER (default), NVG_ROUND, NVG_BEVEL. +void nvgLineJoin(NVGcontext * ctx, int join); + +// Sets the transparency applied to all rendered shapes. +// Already transparent paths will get proportionally more transparent as well. +void nvgGlobalAlpha(NVGcontext * ctx, float alpha); + +// +// Transforms +// +// The paths, gradients, patterns and scissor region are transformed by an transformation +// matrix at the time when they are passed to the API. +// The current transformation matrix is a affine matrix: +// [sx kx tx] +// [ky sy ty] +// [ 0 0 1] +// Where: sx,sy define scaling, kx,ky skewing, and tx,ty translation. +// The last row is assumed to be 0,0,1 and is not stored. +// +// Apart from nvgResetTransform(), each transformation function first creates +// specific transformation matrix and pre-multiplies the current transformation by it. +// +// Current coordinate system (transformation) can be saved and restored using nvgSave() and nvgRestore(). + +// Resets current transform to a identity matrix. +void nvgResetTransform(NVGcontext * ctx); + +// Premultiplies current coordinate system by specified matrix. +// The parameters are interpreted as matrix as follows: +// [a c e] +// [b d f] +// [0 0 1] +void nvgTransform(NVGcontext * ctx, float a, float b, float c, float d, float e, float f); + +// Translates current coordinate system. +void nvgTranslate(NVGcontext * ctx, float x, float y); + +// Rotates current coordinate system. Angle is specified in radians. +void nvgRotate(NVGcontext * ctx, float angle); + +// Skews the current coordinate system along X axis. Angle is specified in radians. +void nvgSkewX(NVGcontext * ctx, float angle); + +// Skews the current coordinate system along Y axis. Angle is specified in radians. +void nvgSkewY(NVGcontext * ctx, float angle); + +// Scales the current coordinate system. +void nvgScale(NVGcontext * ctx, float x, float y); + +// Stores the top part (a-f) of the current transformation matrix in to the specified buffer. +// [a c e] +// [b d f] +// [0 0 1] +// There should be space for 6 floats in the return buffer for the values a-f. +void nvgCurrentTransform(NVGcontext * ctx, float * xform); + + +// The following functions can be used to make calculations on 2x3 transformation matrices. +// A 2x3 matrix is represented as float[6]. + +// Sets the transform to identity matrix. +void nvgTransformIdentity(float * dst); + +// Sets the transform to translation matrix matrix. +void nvgTransformTranslate(float * dst, float tx, float ty); + +// Sets the transform to scale matrix. +void nvgTransformScale(float * dst, float sx, float sy); + +// Sets the transform to rotate matrix. Angle is specified in radians. +void nvgTransformRotate(float * dst, float a); + +// Sets the transform to skew-x matrix. Angle is specified in radians. +void nvgTransformSkewX(float * dst, float a); + +// Sets the transform to skew-y matrix. Angle is specified in radians. +void nvgTransformSkewY(float * dst, float a); + +// Sets the transform to the result of multiplication of two transforms, of A = A*B. +void nvgTransformMultiply(float * dst, const float * src); + +// Sets the transform to the result of multiplication of two transforms, of A = B*A. +void nvgTransformPremultiply(float * dst, const float * src); + +// Sets the destination to inverse of specified transform. +// Returns 1 if the inverse could be calculated, else 0. +int nvgTransformInverse(float * dst, const float * src); + +// Transform a point by given transform. +void nvgTransformPoint(float * dstx, float * dsty, const float * xform, float srcx, float srcy); + +// Converts degrees to radians and vice versa. +float nvgDegToRad(float deg); +float nvgRadToDeg(float rad); + +// +// Images +// +// NanoVG allows you to load jpg, png, psd, tga, pic and gif files to be used for rendering. +// In addition you can upload your own image. The image loading is provided by stb_image. +// The parameter imageFlags is combination of flags defined in NVGimageFlags. + +// Creates image from specified image data with custom format. +// format: see NVGtexture. +// Returns handle to the image. +int nvgCreateImage(NVGcontext * ctx, int w, int h, int imageFlags, int format, const unsigned char * data); + +// Updates image data specified by image handle. +void nvgUpdateImage(NVGcontext * ctx, int image, const unsigned char * data); + +// Returns the dimensions of a created image. +void nvgImageSize(NVGcontext * ctx, int image, int * w, int * h); + +// Deletes created image. +void nvgDeleteImage(NVGcontext * ctx, int image); + +// +// Paints +// +// NanoVG supports four types of paints: linear gradient, box gradient, radial gradient and image pattern. +// These can be used as paints for strokes and fills. + +// Creates and returns a linear gradient. Parameters (sx,sy)-(ex,ey) specify the start and end coordinates +// of the linear gradient, icol specifies the start color and ocol the end color. +// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). +NVGpaint nvgLinearGradient(NVGcontext * ctx, float sx, float sy, float ex, float ey, + NVGcolor icol, NVGcolor ocol); + +// Creates and returns a box gradient. Box gradient is a feathered rounded rectangle, it is useful for rendering +// drop shadows or highlights for boxes. Parameters (x,y) define the top-left corner of the rectangle, +// (w,h) define the size of the rectangle, r defines the corner radius, and f feather. Feather defines how blurry +// the border of the rectangle is. Parameter icol specifies the inner color and ocol the outer color of the gradient. +// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). +NVGpaint nvgBoxGradient(NVGcontext * ctx, float x, float y, float w, float h, + float r, float f, NVGcolor icol, NVGcolor ocol); + +// Creates and returns a radial gradient. Parameters (cx,cy) specify the center, inr and outr specify +// the inner and outer radius of the gradient, icol specifies the start color and ocol the end color. +// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). +NVGpaint nvgRadialGradient(NVGcontext * ctx, float cx, float cy, float inr, float outr, + NVGcolor icol, NVGcolor ocol); + +// Creates and returns an image pattern. Parameters (ox,oy) specify the left-top location of the image pattern, +// (ex,ey) the size of one image, angle rotation around the top-left corner, image is handle to the image to render. +// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). +NVGpaint nvgImagePattern(NVGcontext * ctx, float ox, float oy, float ex, float ey, + float angle, int image, float alpha); + +// +// Scissoring +// +// Scissoring allows you to clip the rendering into a rectangle. This is useful for various +// user interface cases like rendering a text edit or a timeline. + +// Sets the current scissor rectangle. +// The scissor rectangle is transformed by the current transform. +void nvgScissor(NVGcontext * ctx, float x, float y, float w, float h); + +// Intersects current scissor rectangle with the specified rectangle. +// The scissor rectangle is transformed by the current transform. +// Note: in case the rotation of previous scissor rect differs from +// the current one, the intersection will be done between the specified +// rectangle and the previous scissor rectangle transformed in the current +// transform space. The resulting shape is always rectangle. +void nvgIntersectScissor(NVGcontext * ctx, float x, float y, float w, float h); + +// Reset and disables scissoring. +void nvgResetScissor(NVGcontext * ctx); + +// +// Paths +// +// Drawing a new shape starts with nvgBeginPath(), it clears all the currently defined paths. +// Then you define one or more paths and sub-paths which describe the shape. The are functions +// to draw common shapes like rectangles and circles, and lower level step-by-step functions, +// which allow to define a path curve by curve. +// +// NanoVG uses even-odd fill rule to draw the shapes. Solid shapes should have counter clockwise +// winding and holes should have counter clockwise order. To specify winding of a path you can +// call nvgPathWinding(). This is useful especially for the common shapes, which are drawn CCW. +// +// Finally you can fill the path using current fill style by calling nvgFill(), and stroke it +// with current stroke style by calling nvgStroke(). +// +// The curve segments and sub-paths are transformed by the current transform. + +// Clears the current path and sub-paths. +void nvgBeginPath(NVGcontext * ctx); + +// Starts new sub-path with specified point as first point. +void nvgMoveTo(NVGcontext * ctx, float x, float y); + +// Adds line segment from the last point in the path to the specified point. +void nvgLineTo(NVGcontext * ctx, float x, float y); + +// Adds cubic bezier segment from last point in the path via two control points to the specified point. +void nvgBezierTo(NVGcontext * ctx, float c1x, float c1y, float c2x, float c2y, float x, float y); + +// Adds quadratic bezier segment from last point in the path via a control point to the specified point. +void nvgQuadTo(NVGcontext * ctx, float cx, float cy, float x, float y); + +// Adds an arc segment at the corner defined by the last path point, and two specified points. +void nvgArcTo(NVGcontext * ctx, float x1, float y1, float x2, float y2, float radius); + +// Closes current sub-path with a line segment. +void nvgClosePath(NVGcontext * ctx); + +// Sets the current sub-path winding, see NVGwinding and NVGsolidity. +void nvgPathWinding(NVGcontext * ctx, int dir); + +// Creates new circle arc shaped sub-path. The arc center is at cx,cy, the arc radius is r, +// and the arc is drawn from angle a0 to a1, and swept in direction dir (NVG_CCW, or NVG_CW). +// Angles are specified in radians. +void nvgArc(NVGcontext * ctx, float cx, float cy, float r, float a0, float a1, int dir); + +// Creates new rectangle shaped sub-path. +void nvgRect(NVGcontext * ctx, float x, float y, float w, float h); + +// Creates new rounded rectangle shaped sub-path. +void nvgRoundedRect(NVGcontext * ctx, float x, float y, float w, float h, float r); + +// Creates new rounded rectangle shaped sub-path with varying radii for each corner. +void nvgRoundedRectVarying(NVGcontext * ctx, float x, float y, float w, float h, float radTopLeft, float radTopRight, + float radBottomRight, float radBottomLeft); + +// Creates new ellipse shaped sub-path. +void nvgEllipse(NVGcontext * ctx, float cx, float cy, float rx, float ry); + +// Creates new circle shaped sub-path. +void nvgCircle(NVGcontext * ctx, float cx, float cy, float r); + +// Fills the current path with current fill style. +void nvgFill(NVGcontext * ctx); + +// Fills the current path with current stroke style. +void nvgStroke(NVGcontext * ctx); + + +// +// Text +// +// NanoVG allows you to load .ttf files and use the font to render text. +// +// The appearance of the text can be defined by setting the current text style +// and by specifying the fill color. Common text and font settings such as +// font size, letter spacing and text align are supported. Font blur allows you +// to create simple text effects such as drop shadows. +// +// At render time the font face can be set based on the font handles or name. +// +// Font measure functions return values in local space, the calculations are +// carried in the same resolution as the final rendering. This is done because +// the text glyph positions are snapped to the nearest pixels sharp rendering. +// +// The local space means that values are not rotated or scale as per the current +// transformation. For example if you set font size to 12, which would mean that +// line height is 16, then regardless of the current scaling and rotation, the +// returned line height is always 16. Some measures may vary because of the scaling +// since aforementioned pixel snapping. +// +// While this may sound a little odd, the setup allows you to always render the +// same way regardless of scaling. I.e. following works regardless of scaling: +// +// const char* txt = "Text me up."; +// nvgTextBounds(vg, x,y, txt, NULL, bounds); +// nvgBeginPath(vg); +// nvgRect(vg, bounds[0],bounds[1], bounds[2]-bounds[0], bounds[3]-bounds[1]); +// nvgFill(vg); +// +// Note: currently only solid color fill is supported for text. + +// Creates font by loading it from the disk from specified file name. +// Returns handle to the font. +int nvgCreateFont(NVGcontext * ctx, const char * name, const char * filename); + +// fontIndex specifies which font face to load from a .ttf/.ttc file. +int nvgCreateFontAtIndex(NVGcontext * ctx, const char * name, const char * filename, const int fontIndex); + +// Creates font by loading it from the specified memory chunk. +// Returns handle to the font. +int nvgCreateFontMem(NVGcontext * ctx, const char * name, unsigned char * data, int ndata, int freeData); + +// fontIndex specifies which font face to load from a .ttf/.ttc file. +int nvgCreateFontMemAtIndex(NVGcontext * ctx, const char * name, unsigned char * data, int ndata, int freeData, + const int fontIndex); + +// Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. +int nvgFindFont(NVGcontext * ctx, const char * name); + +// Adds a fallback font by handle. +int nvgAddFallbackFontId(NVGcontext * ctx, int baseFont, int fallbackFont); + +// Adds a fallback font by name. +int nvgAddFallbackFont(NVGcontext * ctx, const char * baseFont, const char * fallbackFont); + +// Resets fallback fonts by handle. +void nvgResetFallbackFontsId(NVGcontext * ctx, int baseFont); + +// Resets fallback fonts by name. +void nvgResetFallbackFonts(NVGcontext * ctx, const char * baseFont); + +// Sets the font size of current text style. +void nvgFontSize(NVGcontext * ctx, float size); + +// Sets the blur of current text style. +void nvgFontBlur(NVGcontext * ctx, float blur); + +// Sets the letter spacing of current text style. +void nvgTextLetterSpacing(NVGcontext * ctx, float spacing); + +// Sets the proportional line height of current text style. The line height is specified as multiple of font size. +void nvgTextLineHeight(NVGcontext * ctx, float lineHeight); + +// Sets the text align of current text style, see NVGalign for options. +void nvgTextAlign(NVGcontext * ctx, int align); + +// Sets the font face based on specified id of current text style. +void nvgFontFaceId(NVGcontext * ctx, int font); + +// Sets the font face based on specified name of current text style. +void nvgFontFace(NVGcontext * ctx, const char * font); + +// Draws text string at specified location. If end is specified only the sub-string up to the end is drawn. +float nvgText(NVGcontext * ctx, float x, float y, const char * string, const char * end); + +// Draws multi-line text string at specified location wrapped at the specified width. If end is specified only the sub-string up to the end is drawn. +// White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. +// Words longer than the max width are slit at nearest character (i.e. no hyphenation). +void nvgTextBox(NVGcontext * ctx, float x, float y, float breakRowWidth, const char * string, const char * end); + +// Measures the specified text string. Parameter bounds should be a pointer to float[4], +// if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax] +// Returns the horizontal advance of the measured text (i.e. where the next character should drawn). +// Measured values are returned in local coordinate space. +float nvgTextBounds(NVGcontext * ctx, float x, float y, const char * string, const char * end, float * bounds); + +// Measures the specified multi-text string. Parameter bounds should be a pointer to float[4], +// if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax] +// Measured values are returned in local coordinate space. +void nvgTextBoxBounds(NVGcontext * ctx, float x, float y, float breakRowWidth, const char * string, const char * end, + float * bounds); + +// Calculates the glyph x positions of the specified text. If end is specified only the sub-string will be used. +// Measured values are returned in local coordinate space. +int nvgTextGlyphPositions(NVGcontext * ctx, float x, float y, const char * string, const char * end, + NVGglyphPosition * positions, int maxPositions); + +// Returns the vertical metrics based on the current text style. +// Measured values are returned in local coordinate space. +void nvgTextMetrics(NVGcontext * ctx, float * ascender, float * descender, float * lineh); + +// Breaks the specified text into lines. If end is specified only the sub-string will be used. +// White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. +// Words longer than the max width are slit at nearest character (i.e. no hyphenation). +int nvgTextBreakLines(NVGcontext * ctx, const char * string, const char * end, float breakRowWidth, NVGtextRow * rows, + int maxRows); + +// +// Internal Render API +// +enum NVGtexture { + NVG_TEXTURE_ALPHA = 0x01, + NVG_TEXTURE_BGRA = 0x02, /* ARGB8888 format (memory order: B-G-R-A) */ + NVG_TEXTURE_RGBA = 0x03, /* Standard OpenGL RGBA format */ + NVG_TEXTURE_BGR = 0x04, /* RGB888 format (memory order: B-G-R) */ + NVG_TEXTURE_RGB565 = 0x05, /* RGB565 format */ + NVG_TEXTURE_BGRX = 0x06, /* XRGB8888 format (memory order: B-G-R-X, X ignored) */ +}; + +struct NVGscissor { + float xform[6]; + float extent[2]; +}; +typedef struct NVGscissor NVGscissor; + +struct NVGvertex { + float x, y, u, v; +}; +typedef struct NVGvertex NVGvertex; + +struct NVGpath { + int first; + int count; + unsigned char closed; + int nbevel; + NVGvertex * fill; + int nfill; + NVGvertex * stroke; + int nstroke; + int winding; + int convex; +}; +typedef struct NVGpath NVGpath; + +struct NVGparams { + void * userPtr; + int edgeAntiAlias; + int (*renderCreate)(void * uptr); + int (*renderCreateTexture)(void * uptr, int type, int w, int h, int imageFlags, const unsigned char * data); + int (*renderDeleteTexture)(void * uptr, int image); + int (*renderUpdateTexture)(void * uptr, int image, int x, int y, int w, int h, const unsigned char * data); + int (*renderGetTextureSize)(void * uptr, int image, int * w, int * h); + void (*renderViewport)(void * uptr, float width, float height, float devicePixelRatio); + void (*renderCancel)(void * uptr); + void (*renderFlush)(void * uptr); + void (*renderFill)(void * uptr, NVGpaint * paint, NVGcompositeOperationState compositeOperation, NVGscissor * scissor, + float fringe, const float * bounds, const NVGpath * paths, int npaths); + void (*renderStroke)(void * uptr, NVGpaint * paint, NVGcompositeOperationState compositeOperation, NVGscissor * scissor, + float fringe, float strokeWidth, const NVGpath * paths, int npaths); + void (*renderTriangles)(void * uptr, NVGpaint * paint, NVGcompositeOperationState compositeOperation, + NVGscissor * scissor, const NVGvertex * verts, int nverts, float fringe); + void (*renderDelete)(void * uptr); +}; +typedef struct NVGparams NVGparams; + +// Constructor and destructor, called by the render back-end. +NVGcontext * nvgCreateInternal(NVGparams * params); +void nvgDeleteInternal(NVGcontext * ctx); + +NVGparams * nvgInternalParams(NVGcontext * ctx); + +// Debug function to dump cached path data. +void nvgDebugDumpPathCache(NVGcontext * ctx); + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#define NVG_NOTUSED(v) for (;;) { (void)(1 ? (void)0 : ( (void)(v) ) ); break; } + +#endif // LV_USE_NANOVG + +#ifdef __cplusplus +} +#endif + +#endif // NANOVG_H diff --git a/inc/lvgl/src/libs/nanovg/nanovg_gl.h b/inc/lvgl/src/libs/nanovg/nanovg_gl.h new file mode 100644 index 0000000..0796c93 --- /dev/null +++ b/inc/lvgl/src/libs/nanovg/nanovg_gl.h @@ -0,0 +1,1842 @@ +// +// Copyright (c) 2009-2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// +#ifndef NANOVG_GL_H +#define NANOVG_GL_H + +#include "../../lv_conf_internal.h" + +#if LV_USE_NANOVG + +#ifdef __cplusplus +extern "C" { +#endif + +// Create flags + +enum NVGcreateFlags { + // Flag indicating if geometry based anti-aliasing is used (may not be needed when using MSAA). + NVG_ANTIALIAS = 1 << 0, + // Flag indicating if strokes should be drawn using stencil buffer. The rendering will be a little + // slower, but path overlaps (i.e. self-intersecting or sharp turns) will be drawn just once. + NVG_STENCIL_STROKES = 1 << 1, + // Flag indicating that additional debug checks are done. + NVG_DEBUG = 1 << 2, +}; + +#if defined NANOVG_GL2_IMPLEMENTATION +# define NANOVG_GL2 1 +# define NANOVG_GL_IMPLEMENTATION 1 +# define NANOVG_GL_USE_UNIFORMBUFFER 0 +#elif defined NANOVG_GL3_IMPLEMENTATION +# define NANOVG_GL3 1 +# define NANOVG_GL_IMPLEMENTATION 1 +# define NANOVG_GL_USE_UNIFORMBUFFER 1 +#elif defined NANOVG_GLES2_IMPLEMENTATION +# define NANOVG_GLES2 1 +# define NANOVG_GL_IMPLEMENTATION 1 +# define NANOVG_GL_USE_UNIFORMBUFFER 0 +#elif defined NANOVG_GLES3_IMPLEMENTATION +# define NANOVG_GLES3 1 +# define NANOVG_GL_IMPLEMENTATION 1 +# define NANOVG_GL_USE_UNIFORMBUFFER 0 +#endif + +#define NANOVG_GL_USE_STATE_FILTER (1) + +// Creates NanoVG contexts for different OpenGL (ES) versions. +// Flags should be combination of the create flags above. + +#if defined NANOVG_GL2 + +NVGcontext * nvgCreateGL2(int flags); +void nvgDeleteGL2(NVGcontext * ctx); + +int nvglCreateImageFromHandleGL2(NVGcontext * ctx, GLuint textureId, int w, int h, int flags); +GLuint nvglImageHandleGL2(NVGcontext * ctx, int image); + +#endif + +#if defined NANOVG_GL3 + +NVGcontext * nvgCreateGL3(int flags); +void nvgDeleteGL3(NVGcontext * ctx); + +int nvglCreateImageFromHandleGL3(NVGcontext * ctx, GLuint textureId, int w, int h, int flags); +GLuint nvglImageHandleGL3(NVGcontext * ctx, int image); + +#endif + +#if defined NANOVG_GLES2 + +NVGcontext * nvgCreateGLES2(int flags); +void nvgDeleteGLES2(NVGcontext * ctx); + +int nvglCreateImageFromHandleGLES2(NVGcontext * ctx, GLuint textureId, int w, int h, int flags); +GLuint nvglImageHandleGLES2(NVGcontext * ctx, int image); + +#endif + +#if defined NANOVG_GLES3 + +NVGcontext * nvgCreateGLES3(int flags); +void nvgDeleteGLES3(NVGcontext * ctx); + +int nvglCreateImageFromHandleGLES3(NVGcontext * ctx, GLuint textureId, int w, int h, int flags); +GLuint nvglImageHandleGLES3(NVGcontext * ctx, int image); + +#endif + +// These are additional flags on top of NVGimageFlags. +enum NVGimageFlagsGL { + NVG_IMAGE_NODELETE = 1 << 16, // Do not delete GL texture handle. +}; + +#ifdef __cplusplus +} +#endif + +#endif /* NANOVG_GL_H */ + +#ifdef NANOVG_GL_IMPLEMENTATION + +#include +#include "nanovg.h" +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" +#include "../../stdlib/lv_sprintf.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_profiler.h" + +enum GLNVGuniformLoc { + GLNVG_LOC_VIEWSIZE, + GLNVG_LOC_TEX, + GLNVG_LOC_FRAG, + GLNVG_MAX_LOCS +}; + +enum GLNVGshaderType { + NSVG_SHADER_FILLGRAD, + NSVG_SHADER_FILLIMG, + NSVG_SHADER_SIMPLE, + NSVG_SHADER_IMG +}; + +#define GLNVG_SHADER_COUNT 4 + +#if NANOVG_GL_USE_UNIFORMBUFFER +enum GLNVGuniformBindings { + GLNVG_FRAG_BINDING = 0, +}; +#endif + +struct GLNVGshader { + GLuint prog; + GLuint frag; + GLuint vert; + GLint loc[GLNVG_MAX_LOCS]; +}; +typedef struct GLNVGshader GLNVGshader; + +struct GLNVGtexture { + int id; + GLuint tex; + int width, height; + int type; + int flags; +}; +typedef struct GLNVGtexture GLNVGtexture; + +struct GLNVGblend { + GLenum srcRGB; + GLenum dstRGB; + GLenum srcAlpha; + GLenum dstAlpha; +}; +typedef struct GLNVGblend GLNVGblend; + +enum GLNVGcallType { + GLNVG_NONE = 0, + GLNVG_FILL, + GLNVG_CONVEXFILL, + GLNVG_STROKE, + GLNVG_TRIANGLES, +}; + +struct GLNVGcall { + int type; + int image; + int pathOffset; + int pathCount; + int triangleOffset; + int triangleCount; + int uniformOffset; + int shaderType; + GLNVGblend blendFunc; +}; +typedef struct GLNVGcall GLNVGcall; + +struct GLNVGpath { + int fillOffset; + int fillCount; + int strokeOffset; + int strokeCount; +}; +typedef struct GLNVGpath GLNVGpath; + +#if NANOVG_GL_USE_UNIFORMBUFFER +struct GLNVGfragUniforms { + struct { + float scissorMat[12]; // matrices are actually 3 vec4s + float paintMat[12]; + union NVGcolor innerCol; + union NVGcolor outerCol; + float scissorExt[2]; + float scissorScale[2]; + float extent[2]; + float radius; + float feather; + float strokeMult; + float strokeThr; + int texType; + int type; + } s; +}; +typedef struct GLNVGfragUniforms GLNVGfragUniforms; +#else +// note: after modifying layout or size of uniform array, +// don't forget to also update the fragment shader source! +#define NANOVG_GL_UNIFORMARRAY_SIZE 11 +union GLNVGfragUniforms { + struct { + float scissorMat[12]; // matrices are actually 3 vec4s + float paintMat[12]; + union NVGcolor innerCol; + union NVGcolor outerCol; + float scissorExt[2]; + float scissorScale[2]; + float extent[2]; + float radius; + float feather; + float strokeMult; + float strokeThr; + float texType; + float type; + } s; + float uniformArray[NANOVG_GL_UNIFORMARRAY_SIZE][4]; +}; +typedef union GLNVGfragUniforms GLNVGfragUniforms; +#endif + +struct GLNVGcontext { + GLNVGshader shaders[GLNVG_SHADER_COUNT]; + GLNVGtexture * textures; + float view[2]; + int ntextures; + int ctextures; + int textureId; + GLuint vertBuf[2]; + int vertBufIndex; +#if defined NANOVG_GL3 + GLuint vertArr; +#endif +#if NANOVG_GL_USE_UNIFORMBUFFER + GLuint fragBuf; +#endif + int fragSize; + int flags; + int boundShader; + + // Per frame buffers + GLNVGcall * calls; + int ccalls; + int ncalls; + GLNVGpath * paths; + int cpaths; + int npaths; + struct NVGvertex * verts; + int cverts; + int nverts; + unsigned char * uniforms; + int cuniforms; + int nuniforms; + + // cached state +#if NANOVG_GL_USE_STATE_FILTER + GLuint boundTexture; + GLuint stencilMask; + GLenum stencilFunc; + GLint stencilFuncRef; + GLuint stencilFuncMask; + GLNVGblend blendFunc; +#endif + + int dummyTex; +}; +typedef struct GLNVGcontext GLNVGcontext; + +static int glnvg__maxi(int a, int b) +{ + return a > b ? a : b; +} + +#ifdef NANOVG_GLES2 +static unsigned int glnvg__nearestPow2(unsigned int num) +{ + unsigned n = num > 0 ? num - 1 : 0; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; + return n; +} +#endif + +static void glnvg__bindTexture(GLNVGcontext * gl, GLuint tex) +{ +#if NANOVG_GL_USE_STATE_FILTER + if(gl->boundTexture != tex) { + gl->boundTexture = tex; + glBindTexture(GL_TEXTURE_2D, tex); + } +#else + glBindTexture(GL_TEXTURE_2D, tex); +#endif +} + +static void glnvg__stencilMask(GLNVGcontext * gl, GLuint mask) +{ +#if NANOVG_GL_USE_STATE_FILTER + if(gl->stencilMask != mask) { + gl->stencilMask = mask; + glStencilMask(mask); + } +#else + glStencilMask(mask); +#endif +} + +static void glnvg__stencilFunc(GLNVGcontext * gl, GLenum func, GLint ref, GLuint mask) +{ +#if NANOVG_GL_USE_STATE_FILTER + if((gl->stencilFunc != func) || + (gl->stencilFuncRef != ref) || + (gl->stencilFuncMask != mask)) { + + gl->stencilFunc = func; + gl->stencilFuncRef = ref; + gl->stencilFuncMask = mask; + glStencilFunc(func, ref, mask); + } +#else + glStencilFunc(func, ref, mask); +#endif +} +static void glnvg__blendFuncSeparate(GLNVGcontext * gl, const GLNVGblend * blend) +{ +#if NANOVG_GL_USE_STATE_FILTER + if((gl->blendFunc.srcRGB != blend->srcRGB) || + (gl->blendFunc.dstRGB != blend->dstRGB) || + (gl->blendFunc.srcAlpha != blend->srcAlpha) || + (gl->blendFunc.dstAlpha != blend->dstAlpha)) { + + gl->blendFunc = *blend; + glBlendFuncSeparate(blend->srcRGB, blend->dstRGB, blend->srcAlpha, blend->dstAlpha); + } +#else + glBlendFuncSeparate(blend->srcRGB, blend->dstRGB, blend->srcAlpha, blend->dstAlpha); +#endif +} + +static GLNVGtexture * glnvg__allocTexture(GLNVGcontext * gl) +{ + GLNVGtexture * tex = NULL; + int i; + + for(i = 0; i < gl->ntextures; i++) { + if(gl->textures[i].id == 0) { + tex = &gl->textures[i]; + break; + } + } + if(tex == NULL) { + if(gl->ntextures + 1 > gl->ctextures) { + GLNVGtexture * textures; + int ctextures = glnvg__maxi(gl->ntextures + 1, 4) + gl->ctextures / 2; // 1.5x Overallocate + textures = (GLNVGtexture *)lv_realloc(gl->textures, sizeof(GLNVGtexture) * ctextures); + if(textures == NULL) return NULL; + gl->textures = textures; + gl->ctextures = ctextures; + } + tex = &gl->textures[gl->ntextures++]; + } + + lv_memzero(tex, sizeof(*tex)); + tex->id = ++gl->textureId; + + return tex; +} + +static GLNVGtexture * glnvg__findTexture(GLNVGcontext * gl, int id) +{ + int i; + for(i = 0; i < gl->ntextures; i++) + if(gl->textures[i].id == id) + return &gl->textures[i]; + return NULL; +} + +static int glnvg__deleteTexture(GLNVGcontext * gl, int id) +{ + int i; + for(i = 0; i < gl->ntextures; i++) { + if(gl->textures[i].id == id) { + if(gl->textures[i].tex != 0 && (gl->textures[i].flags & NVG_IMAGE_NODELETE) == 0) + glDeleteTextures(1, &gl->textures[i].tex); + lv_memzero(&gl->textures[i], sizeof(gl->textures[i])); + return 1; + } + } + return 0; +} + +static void glnvg__dumpShaderError(GLuint shader, const char * name, const char * type) +{ + GLchar str[512 + 1]; + GLsizei len = 0; + glGetShaderInfoLog(shader, 512, &len, str); + if(len > 512) len = 512; + str[len] = '\0'; + LV_LOG_ERROR("Shader %s/%s error:\n%s", name, type, str); +} + +static void glnvg__dumpProgramError(GLuint prog, const char * name) +{ + GLchar str[512 + 1]; + GLsizei len = 0; + glGetProgramInfoLog(prog, 512, &len, str); + if(len > 512) len = 512; + str[len] = '\0'; + LV_LOG_ERROR("Program %s error:\n%s", name, str); +} + +static void glnvg__checkError(GLNVGcontext * gl, const char * str) +{ + GLenum err; + if((gl->flags & NVG_DEBUG) == 0) return; + err = glGetError(); + if(err != GL_NO_ERROR) { + LV_LOG_ERROR("Error %08x after %s", err, str); + return; + } +} + +static int glnvg__createShader(GLNVGshader * shader, const char * name, const char * header, const char * opts, + const char * vshader, const char * fshader) +{ + GLint status; + GLuint prog, vert, frag; + const char * str[3]; + str[0] = header; + str[1] = opts != NULL ? opts : ""; + + lv_memzero(shader, sizeof(*shader)); + + prog = glCreateProgram(); + vert = glCreateShader(GL_VERTEX_SHADER); + frag = glCreateShader(GL_FRAGMENT_SHADER); + str[2] = vshader; + glShaderSource(vert, 3, str, 0); + str[2] = fshader; + glShaderSource(frag, 3, str, 0); + + glCompileShader(vert); + glGetShaderiv(vert, GL_COMPILE_STATUS, &status); + if(status != GL_TRUE) { + glnvg__dumpShaderError(vert, name, "vert"); + return 0; + } + + glCompileShader(frag); + glGetShaderiv(frag, GL_COMPILE_STATUS, &status); + if(status != GL_TRUE) { + glnvg__dumpShaderError(frag, name, "frag"); + return 0; + } + + glAttachShader(prog, vert); + glAttachShader(prog, frag); + + glBindAttribLocation(prog, 0, "vertex"); + glBindAttribLocation(prog, 1, "tcoord"); + + glLinkProgram(prog); + glGetProgramiv(prog, GL_LINK_STATUS, &status); + if(status != GL_TRUE) { + glnvg__dumpProgramError(prog, name); + return 0; + } + + shader->prog = prog; + shader->vert = vert; + shader->frag = frag; + + return 1; +} + +static void glnvg__deleteShader(GLNVGshader * shader) +{ + if(shader->prog != 0) + glDeleteProgram(shader->prog); + if(shader->vert != 0) + glDeleteShader(shader->vert); + if(shader->frag != 0) + glDeleteShader(shader->frag); +} + +static void glnvg__getUniforms(GLNVGshader * shader) +{ + shader->loc[GLNVG_LOC_VIEWSIZE] = glGetUniformLocation(shader->prog, "viewSize"); + shader->loc[GLNVG_LOC_TEX] = glGetUniformLocation(shader->prog, "tex"); + +#if NANOVG_GL_USE_UNIFORMBUFFER + shader->loc[GLNVG_LOC_FRAG] = glGetUniformBlockIndex(shader->prog, "frag"); +#else + shader->loc[GLNVG_LOC_FRAG] = glGetUniformLocation(shader->prog, "frag"); +#endif +} + +static int glnvg__renderCreateTexture(void * uptr, int type, int w, int h, int imageFlags, const unsigned char * data); + +static int glnvg__renderCreate(void * uptr) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + int align = 4; + + // TODO: mediump float may not be enough for GLES2 in iOS. + // see the following discussion: https://github.com/memononen/nanovg/issues/46 + static const char * shaderHeader = +#if defined NANOVG_GL2 + "#define NANOVG_GL2 1\n" +#elif defined NANOVG_GL3 + "#version 150 core\n" + "#define NANOVG_GL3 1\n" +#elif defined NANOVG_GLES2 + "#version 100\n" + "#define NANOVG_GL2 1\n" +#elif defined NANOVG_GLES3 + "#version 300 es\n" + "#define NANOVG_GL3 1\n" +#endif + +#if NANOVG_GL_USE_UNIFORMBUFFER + "#define USE_UNIFORMBUFFER 1\n" +#else + "#define UNIFORMARRAY_SIZE 11\n" +#endif + "\n"; + + static const char * fillVertShader = + "#ifdef GL_ES\n" + "#if defined(NANOVG_GL3)\n" + " precision highp float;\n" + "#else\n" + " precision mediump float;\n" + "#endif\n" + "#endif\n" + "#ifdef NANOVG_GL3\n" + " uniform vec2 viewSize;\n" + " in vec2 vertex;\n" + " in vec2 tcoord;\n" + " out vec2 ftcoord;\n" + " out vec2 fpos;\n" + " out vec2 v_scissorPos;\n" + " out vec2 v_paintPos;\n" + "#else\n" + " uniform vec2 viewSize;\n" + " attribute vec2 vertex;\n" + " attribute vec2 tcoord;\n" + " varying vec2 ftcoord;\n" + " varying vec2 fpos;\n" + " varying vec2 v_scissorPos;\n" + " varying vec2 v_paintPos;\n" + "#endif\n" + "#ifdef NANOVG_GL3\n" + "#ifdef USE_UNIFORMBUFFER\n" + " layout(std140) uniform frag {\n" + " mat3 scissorMat;\n" + " mat3 paintMat;\n" + " vec4 innerCol;\n" + " vec4 outerCol;\n" + " vec2 scissorExt;\n" + " vec2 scissorScale;\n" + " vec2 extent;\n" + " float radius;\n" + " float feather;\n" + " float strokeMult;\n" + " float strokeThr;\n" + " int texType;\n" + " int type;\n" + " };\n" + "#else\n" + " uniform vec4 frag[UNIFORMARRAY_SIZE];\n" + "#endif\n" + "#else\n" + " uniform vec4 frag[UNIFORMARRAY_SIZE];\n" + "#endif\n" + "#ifndef USE_UNIFORMBUFFER\n" + " #define scissorMat mat3(frag[0].xyz, frag[1].xyz, frag[2].xyz)\n" + " #define paintMat mat3(frag[3].xyz, frag[4].xyz, frag[5].xyz)\n" + "#endif\n" + "void main(void) {\n" + " ftcoord = tcoord;\n" + " fpos = vertex;\n" + " gl_Position = vec4(2.0*vertex.x/viewSize.x - 1.0, 1.0 - 2.0*vertex.y/viewSize.y, 0, 1);\n" + " #if SHADER_TYPE != 2\n" // Not SIMPLE + " v_scissorPos = (scissorMat * vec3(vertex, 1.0)).xy;\n" + " #endif\n" + " #if SHADER_TYPE == 0 || SHADER_TYPE == 1\n" // FILLGRAD or FILLIMG + " v_paintPos = (paintMat * vec3(vertex, 1.0)).xy;\n" + " #endif\n" + "}\n"; + + static const char * fillFragShader = + "#ifdef GL_ES\n" + "#if defined(NANOVG_GL3)\n" + " precision highp float;\n" + "#else\n" + " precision mediump float;\n" + "#endif\n" + "#endif\n" + "#ifdef NANOVG_GL3\n" + "#ifdef USE_UNIFORMBUFFER\n" + " layout(std140) uniform frag {\n" + " mat3 scissorMat;\n" + " mat3 paintMat;\n" + " vec4 innerCol;\n" + " vec4 outerCol;\n" + " vec2 scissorExt;\n" + " vec2 scissorScale;\n" + " vec2 extent;\n" + " float radius;\n" + " float feather;\n" + " float strokeMult;\n" + " float strokeThr;\n" + " int texType;\n" + " int type;\n" + " };\n" + "#else\n" // NANOVG_GL3 && !USE_UNIFORMBUFFER + " uniform vec4 frag[UNIFORMARRAY_SIZE];\n" + "#endif\n" + " uniform sampler2D tex;\n" + " in vec2 ftcoord;\n" + " in vec2 fpos;\n" + " in vec2 v_scissorPos;\n" + " in vec2 v_paintPos;\n" + " out vec4 outColor;\n" + "#else\n" // !NANOVG_GL3 + " uniform vec4 frag[UNIFORMARRAY_SIZE];\n" + " uniform sampler2D tex;\n" + " varying vec2 ftcoord;\n" + " varying vec2 fpos;\n" + " varying vec2 v_scissorPos;\n" + " varying vec2 v_paintPos;\n" + "#endif\n" + "#ifndef USE_UNIFORMBUFFER\n" + " #define scissorMat mat3(frag[0].xyz, frag[1].xyz, frag[2].xyz)\n" + " #define paintMat mat3(frag[3].xyz, frag[4].xyz, frag[5].xyz)\n" + " #define innerCol frag[6]\n" + " #define outerCol frag[7]\n" + " #define scissorExt frag[8].xy\n" + " #define scissorScale frag[8].zw\n" + " #define extent frag[9].xy\n" + " #define radius frag[9].z\n" + " #define feather frag[9].w\n" + " #define strokeMult frag[10].x\n" + " #define strokeThr frag[10].y\n" + " #define texType int(frag[10].z)\n" + " #define type int(frag[10].w)\n" + "#endif\n" + "\n" + "float sdroundrect(vec2 pt, vec2 ext, float rad) {\n" + " vec2 ext2 = ext - vec2(rad,rad);\n" + " vec2 d = abs(pt) - ext2;\n" + " return min(max(d.x,d.y),0.0) + length(max(d,0.0)) - rad;\n" + "}\n" + "\n" + "// Scissoring\n" + "float scissorMask(vec2 p) {\n" + " vec2 sc = (abs(p) - scissorExt);\n" + " sc = vec2(0.5,0.5) - sc * scissorScale;\n" + " return clamp(sc.x,0.0,1.0) * clamp(sc.y,0.0,1.0);\n" + "}\n" + "#ifdef EDGE_AA\n" + "// Stroke - from [0..1] to clipped pyramid, where the slope is 1px.\n" + "float strokeMask() {\n" + " return min(1.0, (1.0-abs(ftcoord.x*2.0-1.0))*strokeMult) * min(1.0, ftcoord.y);\n" + "}\n" + "#endif\n" + "\n" + "void main(void) {\n" + " vec4 result;\n" + " #if SHADER_TYPE != 2\n" // Not SIMPLE + " float scissor = scissorMask(v_scissorPos);\n" + " #endif\n" + "#ifdef EDGE_AA\n" + " float strokeAlpha = strokeMask();\n" + " // if (strokeAlpha < strokeThr) discard;\n" + "#else\n" + " float strokeAlpha = 1.0;\n" + "#endif\n" + " #if SHADER_TYPE == 0\n" // Gradient + " // Calculate gradient color using box gradient\n" + " vec2 pt = v_paintPos;\n" + " float d = clamp((sdroundrect(pt, extent, radius) + feather*0.5) / feather, 0.0, 1.0);\n" + " vec4 color = mix(innerCol,outerCol,d);\n" + " // Combine alpha\n" + " color *= strokeAlpha * scissor;\n" + " result = color;\n" + " #elif SHADER_TYPE == 1\n" // Image + " // Calculate color fron texture\n" + " vec2 pt = v_paintPos / extent;\n" + "#ifdef NANOVG_GL3\n" + " vec4 color = texture(tex, pt);\n" + "#else\n" + " vec4 color = texture2D(tex, pt);\n" + "#endif\n" + " if (texType == 1) color = vec4(color.xyz*color.w,color.w);" + " else if (texType == 2) color = vec4(color.x);" + " else if (texType == 3) color.rgb = color.bgr;" // BGR -> RGB swizzle (premultiplied) + " else if (texType == 4) color = vec4(color.bgr, 1.0);" // BGRX -> RGB with alpha=1 + " else if (texType == 5) color = vec4(color.bgr*color.a, color.a);" // BGR swizzle + premultiply + " // Apply color tint and alpha.\n" + " color *= innerCol;\n" + " // Combine alpha\n" + " color *= strokeAlpha * scissor;\n" + " result = color;\n" + " #elif SHADER_TYPE == 2\n" // Stencil fill + " result = vec4(1,1,1,1);\n" + " #elif SHADER_TYPE == 3\n" // Textured tris + "#ifdef NANOVG_GL3\n" + " vec4 color = texture(tex, ftcoord);\n" + "#else\n" + " vec4 color = texture2D(tex, ftcoord);\n" + "#endif\n" + " if (texType == 1) color = vec4(color.xyz*color.w,color.w);" + " else if (texType == 2) color = vec4(color.x);" + " else if (texType == 3) color.rgb = color.bgr;" // BGR -> RGB swizzle (premultiplied) + " else if (texType == 4) color = vec4(color.bgr, 1.0);" // BGRX -> RGB with alpha=1 + " else if (texType == 5) color = vec4(color.bgr*color.a, color.a);" // BGR swizzle + premultiply + " color *= scissor;\n" + " result = color * innerCol;\n" + " #endif\n" + "#ifdef NANOVG_GL3\n" + " outColor = result;\n" + "#else\n" + " gl_FragColor = result;\n" + "#endif\n" + "}\n"; + + glnvg__checkError(gl, "init"); + + int i; + char opts[64]; + for(i = 0; i < GLNVG_SHADER_COUNT; i++) { + lv_snprintf(opts, sizeof(opts), "#define SHADER_TYPE %d\n%s", i, + (gl->flags & NVG_ANTIALIAS) ? "#define EDGE_AA 1\n" : ""); + if(glnvg__createShader(&gl->shaders[i], "shader", shaderHeader, opts, fillVertShader, fillFragShader) == 0) + return 0; + glnvg__checkError(gl, "uniform locations"); + glnvg__getUniforms(&gl->shaders[i]); + } + + // Create dynamic vertex array +#if defined NANOVG_GL3 + glGenVertexArrays(1, &gl->vertArr); +#endif + glGenBuffers(2, gl->vertBuf); + +#if NANOVG_GL_USE_UNIFORMBUFFER + // Create UBOs + glUniformBlockBinding(gl->shaders[0].prog, gl->shaders[0].loc[GLNVG_LOC_FRAG], GLNVG_FRAG_BINDING); + glGenBuffers(1, &gl->fragBuf); + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &align); +#endif + gl->fragSize = sizeof(GLNVGfragUniforms) + align - sizeof(GLNVGfragUniforms) % align; + + // Some platforms does not allow to have samples to unset textures. + // Create empty one which is bound when there's no texture specified. + gl->dummyTex = glnvg__renderCreateTexture(gl, NVG_TEXTURE_ALPHA, 1, 1, 0, NULL); + + glnvg__checkError(gl, "create done"); + + glFinish(); + + return 1; +} + +static int glnvg__renderCreateTexture(void * uptr, int type, int w, int h, int imageFlags, const unsigned char * data) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + GLNVGtexture * tex = glnvg__allocTexture(gl); + + if(tex == NULL) return 0; + +#ifdef NANOVG_GLES2 + // Check for non-power of 2. + if(glnvg__nearestPow2(w) != (unsigned int)w || glnvg__nearestPow2(h) != (unsigned int)h) { + // No repeat + if((imageFlags & NVG_IMAGE_REPEATX) != 0 || (imageFlags & NVG_IMAGE_REPEATY) != 0) { + LV_LOG_WARN("Repeat X/Y is not supported for non power-of-two textures (%d x %d)", w, h); + imageFlags &= ~(NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY); + } + // No mips. + if(imageFlags & NVG_IMAGE_GENERATE_MIPMAPS) { + LV_LOG_WARN("Mip-maps is not support for non power-of-two textures (%d x %d)", w, h); + imageFlags &= ~NVG_IMAGE_GENERATE_MIPMAPS; + } + } +#endif + + glGenTextures(1, &tex->tex); + tex->width = w; + tex->height = h; + tex->type = type; + tex->flags = imageFlags; + glnvg__bindTexture(gl, tex->tex); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); +#ifndef NANOVG_GLES2 + glPixelStorei(GL_UNPACK_ROW_LENGTH, tex->width); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); +#endif + +#if defined (NANOVG_GL2) + // GL 1.4 and later has support for generating mipmaps using a tex parameter. + if(imageFlags & NVG_IMAGE_GENERATE_MIPMAPS) { + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); + } +#endif + + if(type == NVG_TEXTURE_BGRA || type == NVG_TEXTURE_BGRX) + /* BGRA/BGRX: upload as RGBA, shader will swizzle BGR->RGB */ + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + else if(type == NVG_TEXTURE_RGBA) + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + else if(type == NVG_TEXTURE_BGR) + /* BGR888: upload as RGB, shader will swizzle BGR->RGB */ + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data); + else if(type == NVG_TEXTURE_RGB565) + /* RGB565: directly compatible with GL */ + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data); + else +#if defined(NANOVG_GLES2) || defined (NANOVG_GL2) + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); +#elif defined(NANOVG_GLES3) + glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, w, h, 0, GL_RED, GL_UNSIGNED_BYTE, data); +#else + glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, w, h, 0, GL_RED, GL_UNSIGNED_BYTE, data); +#endif + + if(imageFlags & NVG_IMAGE_GENERATE_MIPMAPS) { + if(imageFlags & NVG_IMAGE_NEAREST) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + } + else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + } + } + else { + if(imageFlags & NVG_IMAGE_NEAREST) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + } + + if(imageFlags & NVG_IMAGE_NEAREST) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } + + if(imageFlags & NVG_IMAGE_REPEATX) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + else + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + + if(imageFlags & NVG_IMAGE_REPEATY) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + else + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +#ifndef NANOVG_GLES2 + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); +#endif + + // The new way to build mipmaps on GLES and GL3 +#if !defined(NANOVG_GL2) + if(imageFlags & NVG_IMAGE_GENERATE_MIPMAPS) { + glGenerateMipmap(GL_TEXTURE_2D); + } +#endif + + glnvg__checkError(gl, "create tex"); + glnvg__bindTexture(gl, 0); + + return tex->id; +} + + +static int glnvg__renderDeleteTexture(void * uptr, int image) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + return glnvg__deleteTexture(gl, image); +} + +static int glnvg__renderUpdateTexture(void * uptr, int image, int x, int y, int w, int h, const unsigned char * data) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + GLNVGtexture * tex = glnvg__findTexture(gl, image); + + if(tex == NULL) return 0; + glnvg__bindTexture(gl, tex->tex); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + +#ifndef NANOVG_GLES2 + glPixelStorei(GL_UNPACK_ROW_LENGTH, tex->width); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, x); + glPixelStorei(GL_UNPACK_SKIP_ROWS, y); +#else + // No support for all of skip, need to update a whole row at a time. + if(tex->type == NVG_TEXTURE_BGRA || tex->type == NVG_TEXTURE_RGBA || tex->type == NVG_TEXTURE_BGRX) + data += y * tex->width * 4; + else if(tex->type == NVG_TEXTURE_BGR) + data += y * tex->width * 3; + else if(tex->type == NVG_TEXTURE_RGB565) + data += y * tex->width * 2; + else + data += y * tex->width; + x = 0; + w = tex->width; +#endif + + if(tex->type == NVG_TEXTURE_BGRA || tex->type == NVG_TEXTURE_BGRX) + /* BGRA/BGRX: upload as RGBA, shader will swizzle BGR->RGB */ + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data); + else if(tex->type == NVG_TEXTURE_RGBA) + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data); + else if(tex->type == NVG_TEXTURE_BGR) + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_RGB, GL_UNSIGNED_BYTE, data); + else if(tex->type == NVG_TEXTURE_RGB565) + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data); + else +#if defined(NANOVG_GLES2) || defined(NANOVG_GL2) + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); +#else + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_RED, GL_UNSIGNED_BYTE, data); +#endif + + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +#ifndef NANOVG_GLES2 + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); +#endif + + glnvg__bindTexture(gl, 0); + + return 1; +} + +static int glnvg__renderGetTextureSize(void * uptr, int image, int * w, int * h) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + GLNVGtexture * tex = glnvg__findTexture(gl, image); + if(tex == NULL) return 0; + *w = tex->width; + *h = tex->height; + return 1; +} + +static void glnvg__xformToMat3x4(float * m3, float * t) +{ + m3[0] = t[0]; + m3[1] = t[1]; + m3[2] = 0.0f; + m3[3] = 0.0f; + m3[4] = t[2]; + m3[5] = t[3]; + m3[6] = 0.0f; + m3[7] = 0.0f; + m3[8] = t[4]; + m3[9] = t[5]; + m3[10] = 1.0f; + m3[11] = 0.0f; +} + +static NVGcolor glnvg__premulColor(NVGcolor c) +{ + c.ch.r *= c.ch.a; + c.ch.g *= c.ch.a; + c.ch.b *= c.ch.a; + return c; +} + +static int glnvg__convertPaint(GLNVGcontext * gl, GLNVGfragUniforms * frag, NVGpaint * paint, + NVGscissor * scissor, float width, float fringe, float strokeThr) +{ + GLNVGtexture * tex = NULL; + float invxform[6]; + + lv_memzero(frag, sizeof(*frag)); + + frag->s.innerCol = glnvg__premulColor(paint->innerColor); + frag->s.outerCol = glnvg__premulColor(paint->outerColor); + + if(scissor->extent[0] < -0.5f || scissor->extent[1] < -0.5f) { + lv_memzero(frag->s.scissorMat, sizeof(frag->s.scissorMat)); + frag->s.scissorExt[0] = 1.0f; + frag->s.scissorExt[1] = 1.0f; + frag->s.scissorScale[0] = 1.0f; + frag->s.scissorScale[1] = 1.0f; + } + else { + nvgTransformInverse(invxform, scissor->xform); + glnvg__xformToMat3x4(frag->s.scissorMat, invxform); + frag->s.scissorExt[0] = scissor->extent[0]; + frag->s.scissorExt[1] = scissor->extent[1]; + frag->s.scissorScale[0] = sqrtf(scissor->xform[0] * scissor->xform[0] + scissor->xform[2] * scissor->xform[2]) / fringe; + frag->s.scissorScale[1] = sqrtf(scissor->xform[1] * scissor->xform[1] + scissor->xform[3] * scissor->xform[3]) / fringe; + } + + lv_memcpy(frag->s.extent, paint->extent, sizeof(frag->s.extent)); + frag->s.strokeMult = (width * 0.5f + fringe * 0.5f) / fringe; + frag->s.strokeThr = strokeThr; + + if(paint->image != 0) { + tex = glnvg__findTexture(gl, paint->image); + if(tex == NULL) return 0; + if((tex->flags & NVG_IMAGE_FLIPY) != 0) { + float m1[6], m2[6]; + nvgTransformTranslate(m1, 0.0f, frag->s.extent[1] * 0.5f); + nvgTransformMultiply(m1, paint->xform); + nvgTransformScale(m2, 1.0f, -1.0f); + nvgTransformMultiply(m2, m1); + nvgTransformTranslate(m1, 0.0f, -frag->s.extent[1] * 0.5f); + nvgTransformMultiply(m1, m2); + nvgTransformInverse(invxform, m1); + } + else { + nvgTransformInverse(invxform, paint->xform); + } + frag->s.type = NSVG_SHADER_FILLIMG; + +#if NANOVG_GL_USE_UNIFORMBUFFER + if(tex->type == NVG_TEXTURE_RGBA) + frag->s.texType = (tex->flags & NVG_IMAGE_PREMULTIPLIED) ? 0 : 1; + else if(tex->type == NVG_TEXTURE_BGRA) + frag->s.texType = (tex->flags & NVG_IMAGE_PREMULTIPLIED) ? 3 : 5; // BGR swizzle, optionally premultiply + else if(tex->type == NVG_TEXTURE_BGR) + frag->s.texType = 3; // BGR -> RGB swizzle (no alpha channel) + else if(tex->type == NVG_TEXTURE_BGRX) + frag->s.texType = 4; // BGRX -> RGB with alpha=1 in shader + else if(tex->type == NVG_TEXTURE_RGB565) + frag->s.texType = 0; // RGB565 is directly compatible + else + frag->s.texType = 2; +#else + if(tex->type == NVG_TEXTURE_RGBA) + frag->s.texType = (tex->flags & NVG_IMAGE_PREMULTIPLIED) ? 0.0f : 1.0f; + else if(tex->type == NVG_TEXTURE_BGRA) + frag->s.texType = (tex->flags & NVG_IMAGE_PREMULTIPLIED) ? 3.0f : 5.0f; // BGR swizzle, optionally premultiply + else if(tex->type == NVG_TEXTURE_BGR) + frag->s.texType = 3.0f; // BGR -> RGB swizzle (no alpha channel) + else if(tex->type == NVG_TEXTURE_BGRX) + frag->s.texType = 4.0f; // BGRX -> RGB with alpha=1 in shader + else if(tex->type == NVG_TEXTURE_RGB565) + frag->s.texType = 0.0f; // RGB565 is directly compatible + else + frag->s.texType = 2.0f; +#endif + // printf("frag->texType = %d\n", frag->texType); + } + else { + frag->s.type = NSVG_SHADER_FILLGRAD; + frag->s.radius = paint->radius; + frag->s.feather = paint->feather; + nvgTransformInverse(invxform, paint->xform); + } + + glnvg__xformToMat3x4(frag->s.paintMat, invxform); + + return 1; +} + +static GLNVGfragUniforms * nvg__fragUniformPtr(GLNVGcontext * gl, int i); + +static void glnvg__bindShader(GLNVGcontext * gl, int shaderType) +{ + if(gl->boundShader != shaderType) { + gl->boundShader = shaderType; + glUseProgram(gl->shaders[shaderType].prog); + glUniform1i(gl->shaders[shaderType].loc[GLNVG_LOC_TEX], 0); + glUniform2fv(gl->shaders[shaderType].loc[GLNVG_LOC_VIEWSIZE], 1, gl->view); + } +} + +static void glnvg__setUniforms(GLNVGcontext * gl, int uniformOffset, int image, int shaderType) +{ + GLNVGtexture * tex = NULL; + + glnvg__bindShader(gl, shaderType); + +#if NANOVG_GL_USE_UNIFORMBUFFER + glBindBufferRange(GL_UNIFORM_BUFFER, GLNVG_FRAG_BINDING, gl->fragBuf, uniformOffset, sizeof(GLNVGfragUniforms)); +#else + // Optimization: NSVG_SHADER_SIMPLE doesn't use any uniforms in the fragment shader, + // so we can skip uploading them. + if(shaderType != NSVG_SHADER_SIMPLE) { + GLNVGfragUniforms * frag = nvg__fragUniformPtr(gl, uniformOffset); + glUniform4fv(gl->shaders[shaderType].loc[GLNVG_LOC_FRAG], NANOVG_GL_UNIFORMARRAY_SIZE, &(frag->uniformArray[0][0])); + } +#endif + + if(image != 0) { + tex = glnvg__findTexture(gl, image); + } + // If no image is set, use empty texture + if(tex == NULL) { + tex = glnvg__findTexture(gl, gl->dummyTex); + } + glnvg__bindTexture(gl, tex != NULL ? tex->tex : 0); + glnvg__checkError(gl, "tex paint tex"); +} + +static void glnvg__renderViewport(void * uptr, float width, float height, float devicePixelRatio) +{ + NVG_NOTUSED(devicePixelRatio); + GLNVGcontext * gl = (GLNVGcontext *)uptr; + gl->view[0] = width; + gl->view[1] = height; +} + +static void glnvg__fill(GLNVGcontext * gl, GLNVGcall * call) +{ + LV_PROFILER_DRAW_BEGIN; + GLNVGpath * paths = &gl->paths[call->pathOffset]; + int i, npaths = call->pathCount; + + // Draw shapes + glEnable(GL_STENCIL_TEST); + glnvg__stencilMask(gl, 0xff); + glnvg__stencilFunc(gl, GL_ALWAYS, 0, 0xff); + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + + // set bindpoint for solid loc + glnvg__setUniforms(gl, call->uniformOffset, 0, NSVG_SHADER_SIMPLE); + glnvg__checkError(gl, "fill simple"); + + glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR_WRAP); + glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR_WRAP); + glDisable(GL_CULL_FACE); + for(i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_FAN, paths[i].fillOffset, paths[i].fillCount); + glEnable(GL_CULL_FACE); + + // Draw anti-aliased pixels + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + glnvg__setUniforms(gl, call->uniformOffset + gl->fragSize, call->image, call->shaderType); + glnvg__checkError(gl, "fill fill"); + + if(gl->flags & NVG_ANTIALIAS) { + glnvg__stencilFunc(gl, GL_EQUAL, 0x00, 0xff); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + // Draw fringes + for(i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + } + + // Draw fill + glnvg__stencilFunc(gl, GL_NOTEQUAL, 0x0, 0xff); + glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); + glDrawArrays(GL_TRIANGLE_STRIP, call->triangleOffset, call->triangleCount); + + glDisable(GL_STENCIL_TEST); + LV_PROFILER_DRAW_END; +} + +static void glnvg__convexFill(GLNVGcontext * gl, GLNVGcall * call) +{ + LV_PROFILER_DRAW_BEGIN; + GLNVGpath * paths = &gl->paths[call->pathOffset]; + int i, npaths = call->pathCount; + + glnvg__setUniforms(gl, call->uniformOffset, call->image, call->shaderType); + glnvg__checkError(gl, "convex fill"); + + for(i = 0; i < npaths; i++) { + glDrawArrays(GL_TRIANGLE_FAN, paths[i].fillOffset, paths[i].fillCount); + // Draw fringes + if(paths[i].strokeCount > 0) { + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + } + } + LV_PROFILER_DRAW_END; +} + +static void glnvg__stroke(GLNVGcontext * gl, GLNVGcall * call) +{ + LV_PROFILER_DRAW_BEGIN; + GLNVGpath * paths = &gl->paths[call->pathOffset]; + int npaths = call->pathCount, i; + + if(gl->flags & NVG_STENCIL_STROKES) { + + glEnable(GL_STENCIL_TEST); + glnvg__stencilMask(gl, 0xff); + + // Fill the stroke base without overlap + glnvg__stencilFunc(gl, GL_EQUAL, 0x0, 0xff); + glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); + glnvg__setUniforms(gl, call->uniformOffset + gl->fragSize, call->image, NSVG_SHADER_SIMPLE); + glnvg__checkError(gl, "stroke fill 0"); + for(i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + + // Draw anti-aliased pixels. + glnvg__setUniforms(gl, call->uniformOffset, call->image, call->shaderType); + glnvg__stencilFunc(gl, GL_EQUAL, 0x00, 0xff); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + for(i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + + // Clear stencil buffer. + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + glnvg__stencilFunc(gl, GL_ALWAYS, 0x0, 0xff); + glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); + glnvg__checkError(gl, "stroke fill 1"); + for(i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + glDisable(GL_STENCIL_TEST); + + // glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset + gl->fragSize), paint, scissor, strokeWidth, fringe, 1.0f - 0.5f/255.0f); + + } + else { + glnvg__setUniforms(gl, call->uniformOffset, call->image, call->shaderType); + glnvg__checkError(gl, "stroke fill"); + // Draw Strokes + for(i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + } + LV_PROFILER_DRAW_END; +} + +static void glnvg__triangles(GLNVGcontext * gl, GLNVGcall * call) +{ + LV_PROFILER_DRAW_BEGIN; + glnvg__setUniforms(gl, call->uniformOffset, call->image, NSVG_SHADER_IMG); + glnvg__checkError(gl, "triangles fill"); + + glDrawArrays(GL_TRIANGLES, call->triangleOffset, call->triangleCount); + LV_PROFILER_DRAW_END; +} + +static void glnvg__renderCancel(void * uptr) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + gl->nverts = 0; + gl->npaths = 0; + gl->ncalls = 0; + gl->nuniforms = 0; +} + +static GLenum glnvg_convertBlendFuncFactor(int factor) +{ + if(factor == NVG_ZERO) + return GL_ZERO; + if(factor == NVG_ONE) + return GL_ONE; + if(factor == NVG_SRC_COLOR) + return GL_SRC_COLOR; + if(factor == NVG_ONE_MINUS_SRC_COLOR) + return GL_ONE_MINUS_SRC_COLOR; + if(factor == NVG_DST_COLOR) + return GL_DST_COLOR; + if(factor == NVG_ONE_MINUS_DST_COLOR) + return GL_ONE_MINUS_DST_COLOR; + if(factor == NVG_SRC_ALPHA) + return GL_SRC_ALPHA; + if(factor == NVG_ONE_MINUS_SRC_ALPHA) + return GL_ONE_MINUS_SRC_ALPHA; + if(factor == NVG_DST_ALPHA) + return GL_DST_ALPHA; + if(factor == NVG_ONE_MINUS_DST_ALPHA) + return GL_ONE_MINUS_DST_ALPHA; + if(factor == NVG_SRC_ALPHA_SATURATE) + return GL_SRC_ALPHA_SATURATE; + return GL_INVALID_ENUM; +} + +static GLNVGblend glnvg__blendCompositeOperation(NVGcompositeOperationState op) +{ + GLNVGblend blend; + blend.srcRGB = glnvg_convertBlendFuncFactor(op.srcRGB); + blend.dstRGB = glnvg_convertBlendFuncFactor(op.dstRGB); + blend.srcAlpha = glnvg_convertBlendFuncFactor(op.srcAlpha); + blend.dstAlpha = glnvg_convertBlendFuncFactor(op.dstAlpha); + if(blend.srcRGB == GL_INVALID_ENUM || blend.dstRGB == GL_INVALID_ENUM || blend.srcAlpha == GL_INVALID_ENUM || + blend.dstAlpha == GL_INVALID_ENUM) { + blend.srcRGB = GL_ONE; + blend.dstRGB = GL_ONE_MINUS_SRC_ALPHA; + blend.srcAlpha = GL_ONE; + blend.dstAlpha = GL_ONE_MINUS_SRC_ALPHA; + } + return blend; +} + +static void glnvg__renderFlush(void * uptr) +{ + LV_PROFILER_DRAW_BEGIN; + GLNVGcontext * gl = (GLNVGcontext *)uptr; + int i; + + if(gl->ncalls > 0) { + + // Setup require GL state. + LV_PROFILER_DRAW_BEGIN_TAG("setup_gl_state"); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glFrontFace(GL_CCW); + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glDisable(GL_SCISSOR_TEST); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glStencilMask(0xffffffff); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + glStencilFunc(GL_ALWAYS, 0, 0xffffffff); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, 0); +#if NANOVG_GL_USE_STATE_FILTER + gl->boundTexture = 0; + gl->boundShader = -1; + gl->stencilMask = 0xffffffff; + gl->stencilFunc = GL_ALWAYS; + gl->stencilFuncRef = 0; + gl->stencilFuncMask = 0xffffffff; + gl->blendFunc.srcRGB = GL_INVALID_ENUM; + gl->blendFunc.srcAlpha = GL_INVALID_ENUM; + gl->blendFunc.dstRGB = GL_INVALID_ENUM; + gl->blendFunc.dstAlpha = GL_INVALID_ENUM; +#endif + LV_PROFILER_DRAW_END_TAG("setup_gl_state"); + +#if NANOVG_GL_USE_UNIFORMBUFFER + // Upload ubo for frag shaders + LV_PROFILER_DRAW_BEGIN_TAG("glBindBuffer"); + glBindBuffer(GL_UNIFORM_BUFFER, gl->fragBuf); + LV_PROFILER_DRAW_END_TAG("glBindBuffer"); + LV_PROFILER_DRAW_BEGIN_TAG("glBufferData"); + glBufferData(GL_UNIFORM_BUFFER, gl->nuniforms * gl->fragSize, gl->uniforms, GL_STREAM_DRAW); + LV_PROFILER_DRAW_END_TAG("glBufferData"); +#endif + + // Upload vertex data +#if defined NANOVG_GL3 + LV_PROFILER_DRAW_BEGIN_TAG("glBindVertexArray"); + glBindVertexArray(gl->vertArr); + LV_PROFILER_DRAW_END_TAG("glBindVertexArray"); +#endif + gl->vertBufIndex = (gl->vertBufIndex + 1) % 2; + LV_PROFILER_DRAW_BEGIN_TAG("glBindBuffer"); + glBindBuffer(GL_ARRAY_BUFFER, gl->vertBuf[gl->vertBufIndex]); + LV_PROFILER_DRAW_END_TAG("glBindBuffer"); + LV_PROFILER_DRAW_BEGIN_TAG("glBufferData"); + glBufferData(GL_ARRAY_BUFFER, gl->nverts * sizeof(NVGvertex), gl->verts, GL_STREAM_DRAW); + LV_PROFILER_DRAW_END_TAG("glBufferData"); + LV_PROFILER_DRAW_BEGIN_TAG("glEnableVertexAttribArray"); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + LV_PROFILER_DRAW_END_TAG("glEnableVertexAttribArray"); + LV_PROFILER_DRAW_BEGIN_TAG("glVertexAttribPointer"); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(NVGvertex), (const GLvoid *)(size_t)0); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(NVGvertex), (const GLvoid *)(0 + 2 * sizeof(float))); + LV_PROFILER_DRAW_END_TAG("glVertexAttribPointer"); + +#if NANOVG_GL_USE_UNIFORMBUFFER + LV_PROFILER_DRAW_BEGIN_TAG("glBindBuffer"); + glBindBuffer(GL_UNIFORM_BUFFER, gl->fragBuf); + LV_PROFILER_DRAW_END_TAG("glBindBuffer"); +#endif + + for(i = 0; i < gl->ncalls; i++) { + GLNVGcall * call = &gl->calls[i]; + glnvg__blendFuncSeparate(gl, &call->blendFunc); + if(call->type == GLNVG_FILL) + glnvg__fill(gl, call); + else if(call->type == GLNVG_CONVEXFILL) + glnvg__convexFill(gl, call); + else if(call->type == GLNVG_STROKE) + glnvg__stroke(gl, call); + else if(call->type == GLNVG_TRIANGLES) + glnvg__triangles(gl, call); + } + + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); +#if defined NANOVG_GL3 + glBindVertexArray(0); +#endif + glDisable(GL_CULL_FACE); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glUseProgram(0); + glnvg__bindTexture(gl, 0); + } + + // Reset calls + gl->nverts = 0; + gl->npaths = 0; + gl->ncalls = 0; + gl->nuniforms = 0; + LV_PROFILER_DRAW_END; +} + +static int glnvg__maxVertCount(const NVGpath * paths, int npaths) +{ + int i, count = 0; + for(i = 0; i < npaths; i++) { + count += paths[i].nfill; + count += paths[i].nstroke; + } + return count; +} + +static GLNVGcall * glnvg__allocCall(GLNVGcontext * gl) +{ + GLNVGcall * ret = NULL; + if(gl->ncalls + 1 > gl->ccalls) { + GLNVGcall * calls; + int ccalls = glnvg__maxi(gl->ncalls + 1, 128) + gl->ccalls / 2; // 1.5x Overallocate + calls = (GLNVGcall *)lv_realloc(gl->calls, sizeof(GLNVGcall) * ccalls); + if(calls == NULL) return NULL; + gl->calls = calls; + gl->ccalls = ccalls; + } + ret = &gl->calls[gl->ncalls++]; + lv_memzero(ret, sizeof(GLNVGcall)); + return ret; +} + +static int glnvg__allocPaths(GLNVGcontext * gl, int n) +{ + int ret = 0; + if(gl->npaths + n > gl->cpaths) { + GLNVGpath * paths; + int cpaths = glnvg__maxi(gl->npaths + n, 128) + gl->cpaths / 2; // 1.5x Overallocate + paths = (GLNVGpath *)lv_realloc(gl->paths, sizeof(GLNVGpath) * cpaths); + if(paths == NULL) return -1; + gl->paths = paths; + gl->cpaths = cpaths; + } + ret = gl->npaths; + gl->npaths += n; + return ret; +} + +static int glnvg__allocVerts(GLNVGcontext * gl, int n) +{ + int ret = 0; + if(gl->nverts + n > gl->cverts) { + NVGvertex * verts; + int cverts = glnvg__maxi(gl->nverts + n, 4096) + gl->cverts / 2; // 1.5x Overallocate + verts = (NVGvertex *)lv_realloc(gl->verts, sizeof(NVGvertex) * cverts); + if(verts == NULL) return -1; + gl->verts = verts; + gl->cverts = cverts; + } + ret = gl->nverts; + gl->nverts += n; + return ret; +} + +static int glnvg__allocFragUniforms(GLNVGcontext * gl, int n) +{ + int ret = 0, structSize = gl->fragSize; + if(gl->nuniforms + n > gl->cuniforms) { + unsigned char * uniforms; + int cuniforms = glnvg__maxi(gl->nuniforms + n, 128) + gl->cuniforms / 2; // 1.5x Overallocate + uniforms = (unsigned char *)lv_realloc(gl->uniforms, structSize * cuniforms); + if(uniforms == NULL) return -1; + gl->uniforms = uniforms; + gl->cuniforms = cuniforms; + } + ret = gl->nuniforms * structSize; + gl->nuniforms += n; + return ret; +} + +static GLNVGfragUniforms * nvg__fragUniformPtr(GLNVGcontext * gl, int i) +{ + return (GLNVGfragUniforms *)&gl->uniforms[i]; +} + +static void glnvg__vset(NVGvertex * vtx, float x, float y, float u, float v) +{ + vtx->x = x; + vtx->y = y; + vtx->u = u; + vtx->v = v; +} + +static void glnvg__renderFill(void * uptr, NVGpaint * paint, NVGcompositeOperationState compositeOperation, + NVGscissor * scissor, float fringe, + const float * bounds, const NVGpath * paths, int npaths) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + GLNVGcall * call = glnvg__allocCall(gl); + NVGvertex * quad; + GLNVGfragUniforms * frag; + int i, maxverts, offset; + + if(call == NULL) return; + + call->type = GLNVG_FILL; + call->triangleCount = 4; + call->pathOffset = glnvg__allocPaths(gl, npaths); + if(call->pathOffset == -1) goto error; + call->pathCount = npaths; + call->image = paint->image; + call->blendFunc = glnvg__blendCompositeOperation(compositeOperation); + + if(npaths == 1 && paths[0].convex) { + call->type = GLNVG_CONVEXFILL; + call->triangleCount = 0; // Bounding box fill quad not needed for convex fill + } + + // Allocate vertices for all the paths. + maxverts = glnvg__maxVertCount(paths, npaths) + call->triangleCount; + offset = glnvg__allocVerts(gl, maxverts); + if(offset == -1) goto error; + + for(i = 0; i < npaths; i++) { + GLNVGpath * copy = &gl->paths[call->pathOffset + i]; + const NVGpath * path = &paths[i]; + lv_memzero(copy, sizeof(GLNVGpath)); + if(path->nfill > 0) { + copy->fillOffset = offset; + copy->fillCount = path->nfill; + lv_memcpy(&gl->verts[offset], path->fill, sizeof(NVGvertex) * path->nfill); + offset += path->nfill; + } + if(path->nstroke > 0) { + copy->strokeOffset = offset; + copy->strokeCount = path->nstroke; + lv_memcpy(&gl->verts[offset], path->stroke, sizeof(NVGvertex) * path->nstroke); + offset += path->nstroke; + } + } + + // Setup uniforms for draw calls + if(call->type == GLNVG_FILL) { + // Quad + call->triangleOffset = offset; + quad = &gl->verts[call->triangleOffset]; + glnvg__vset(&quad[0], bounds[2], bounds[3], 0.5f, 1.0f); + glnvg__vset(&quad[1], bounds[2], bounds[1], 0.5f, 1.0f); + glnvg__vset(&quad[2], bounds[0], bounds[3], 0.5f, 1.0f); + glnvg__vset(&quad[3], bounds[0], bounds[1], 0.5f, 1.0f); + + call->uniformOffset = glnvg__allocFragUniforms(gl, 2); + if(call->uniformOffset == -1) goto error; + // Simple shader for stencil + frag = nvg__fragUniformPtr(gl, call->uniformOffset); + lv_memzero(frag, sizeof(*frag)); + frag->s.strokeThr = -1.0f; + frag->s.type = NSVG_SHADER_SIMPLE; + // Fill shader + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset + gl->fragSize), paint, scissor, fringe, fringe, + -1.0f); + } + else { + call->uniformOffset = glnvg__allocFragUniforms(gl, 1); + if(call->uniformOffset == -1) goto error; + // Fill shader + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset), paint, scissor, fringe, fringe, -1.0f); + } + + if(paint->image != 0) + call->shaderType = NSVG_SHADER_FILLIMG; + else + call->shaderType = NSVG_SHADER_FILLGRAD; + + return; + +error: + // We get here if call alloc was ok, but something else is not. + // Roll back the last call to prevent drawing it. + if(gl->ncalls > 0) gl->ncalls--; +} + +static void glnvg__renderStroke(void * uptr, NVGpaint * paint, NVGcompositeOperationState compositeOperation, + NVGscissor * scissor, float fringe, + float strokeWidth, const NVGpath * paths, int npaths) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + GLNVGcall * call = glnvg__allocCall(gl); + int i, maxverts, offset; + + if(call == NULL) return; + + call->type = GLNVG_STROKE; + call->pathOffset = glnvg__allocPaths(gl, npaths); + if(call->pathOffset == -1) goto error; + call->pathCount = npaths; + call->image = paint->image; + call->blendFunc = glnvg__blendCompositeOperation(compositeOperation); + + // Allocate vertices for all the paths. + maxverts = glnvg__maxVertCount(paths, npaths); + offset = glnvg__allocVerts(gl, maxverts); + if(offset == -1) goto error; + + for(i = 0; i < npaths; i++) { + GLNVGpath * copy = &gl->paths[call->pathOffset + i]; + const NVGpath * path = &paths[i]; + lv_memzero(copy, sizeof(GLNVGpath)); + if(path->nstroke) { + copy->strokeOffset = offset; + copy->strokeCount = path->nstroke; + lv_memcpy(&gl->verts[offset], path->stroke, sizeof(NVGvertex) * path->nstroke); + offset += path->nstroke; + } + } + + if(gl->flags & NVG_STENCIL_STROKES) { + // Fill shader + call->uniformOffset = glnvg__allocFragUniforms(gl, 2); + if(call->uniformOffset == -1) goto error; + + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset), paint, scissor, strokeWidth, fringe, -1.0f); + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset + gl->fragSize), paint, scissor, strokeWidth, + fringe, 1.0f - 0.5f / 255.0f); + + } + else { + // Fill shader + call->uniformOffset = glnvg__allocFragUniforms(gl, 1); + if(call->uniformOffset == -1) goto error; + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset), paint, scissor, strokeWidth, fringe, -1.0f); + } + + if(paint->image != 0) + call->shaderType = NSVG_SHADER_FILLIMG; + else + call->shaderType = NSVG_SHADER_FILLGRAD; + + return; + +error: + // We get here if call alloc was ok, but something else is not. + // Roll back the last call to prevent drawing it. + if(gl->ncalls > 0) gl->ncalls--; +} + +static void glnvg__renderTriangles(void * uptr, NVGpaint * paint, NVGcompositeOperationState compositeOperation, + NVGscissor * scissor, + const NVGvertex * verts, int nverts, float fringe) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + GLNVGcall * call = glnvg__allocCall(gl); + GLNVGfragUniforms * frag; + + if(call == NULL) return; + + call->type = GLNVG_TRIANGLES; + call->image = paint->image; + call->blendFunc = glnvg__blendCompositeOperation(compositeOperation); + + // Allocate vertices for all the paths. + call->triangleOffset = glnvg__allocVerts(gl, nverts); + if(call->triangleOffset == -1) goto error; + call->triangleCount = nverts; + + lv_memcpy(&gl->verts[call->triangleOffset], verts, sizeof(NVGvertex) * nverts); + + // Fill shader + call->uniformOffset = glnvg__allocFragUniforms(gl, 1); + if(call->uniformOffset == -1) goto error; + frag = nvg__fragUniformPtr(gl, call->uniformOffset); + glnvg__convertPaint(gl, frag, paint, scissor, 1.0f, fringe, -1.0f); + frag->s.type = NSVG_SHADER_IMG; + call->shaderType = NSVG_SHADER_IMG; + + return; + +error: + // We get here if call alloc was ok, but something else is not. + // Roll back the last call to prevent drawing it. + if(gl->ncalls > 0) gl->ncalls--; +} + +static void glnvg__renderDelete(void * uptr) +{ + GLNVGcontext * gl = (GLNVGcontext *)uptr; + int i; + if(gl == NULL) return; + + for(i = 0; i < GLNVG_SHADER_COUNT; i++) + glnvg__deleteShader(&gl->shaders[i]); + +#if defined NANOVG_GL3 +#if NANOVG_GL_USE_UNIFORMBUFFER + if(gl->fragBuf != 0) + glDeleteBuffers(1, &gl->fragBuf); +#endif + if(gl->vertArr != 0) + glDeleteVertexArrays(1, &gl->vertArr); +#endif + if(gl->vertBuf[0] != 0) + glDeleteBuffers(2, gl->vertBuf); + + for(i = 0; i < gl->ntextures; i++) { + if(gl->textures[i].tex != 0 && (gl->textures[i].flags & NVG_IMAGE_NODELETE) == 0) + glDeleteTextures(1, &gl->textures[i].tex); + } + lv_free(gl->textures); + + lv_free(gl->paths); + lv_free(gl->verts); + lv_free(gl->uniforms); + lv_free(gl->calls); + + lv_free(gl); +} + + +#if defined NANOVG_GL2 + NVGcontext * nvgCreateGL2(int flags) +#elif defined NANOVG_GL3 + NVGcontext * nvgCreateGL3(int flags) +#elif defined NANOVG_GLES2 + NVGcontext * nvgCreateGLES2(int flags) +#elif defined NANOVG_GLES3 + NVGcontext * nvgCreateGLES3(int flags) +#endif +{ + NVGparams params; + NVGcontext * ctx = NULL; + GLNVGcontext * gl = (GLNVGcontext *)lv_malloc(sizeof(GLNVGcontext)); + if(gl == NULL) goto error; + lv_memzero(gl, sizeof(GLNVGcontext)); + + lv_memzero(¶ms, sizeof(params)); + params.renderCreate = glnvg__renderCreate; + params.renderCreateTexture = glnvg__renderCreateTexture; + params.renderDeleteTexture = glnvg__renderDeleteTexture; + params.renderUpdateTexture = glnvg__renderUpdateTexture; + params.renderGetTextureSize = glnvg__renderGetTextureSize; + params.renderViewport = glnvg__renderViewport; + params.renderCancel = glnvg__renderCancel; + params.renderFlush = glnvg__renderFlush; + params.renderFill = glnvg__renderFill; + params.renderStroke = glnvg__renderStroke; + params.renderTriangles = glnvg__renderTriangles; + params.renderDelete = glnvg__renderDelete; + params.userPtr = gl; + params.edgeAntiAlias = flags & NVG_ANTIALIAS ? 1 : 0; + + gl->flags = flags; + + ctx = nvgCreateInternal(¶ms); + if(ctx == NULL) goto error; + + return ctx; + +error: + // 'gl' is freed by nvgDeleteInternal. + if(ctx != NULL) nvgDeleteInternal(ctx); + return NULL; +} + +#if defined NANOVG_GL2 + void nvgDeleteGL2(NVGcontext * ctx) +#elif defined NANOVG_GL3 + void nvgDeleteGL3(NVGcontext * ctx) +#elif defined NANOVG_GLES2 + void nvgDeleteGLES2(NVGcontext * ctx) +#elif defined NANOVG_GLES3 + void nvgDeleteGLES3(NVGcontext * ctx) +#endif +{ + nvgDeleteInternal(ctx); +} + +#if defined NANOVG_GL2 + int nvglCreateImageFromHandleGL2(NVGcontext * ctx, GLuint textureId, int w, int h, int imageFlags) +#elif defined NANOVG_GL3 + int nvglCreateImageFromHandleGL3(NVGcontext * ctx, GLuint textureId, int w, int h, int imageFlags) +#elif defined NANOVG_GLES2 + int nvglCreateImageFromHandleGLES2(NVGcontext * ctx, GLuint textureId, int w, int h, int imageFlags) +#elif defined NANOVG_GLES3 + int nvglCreateImageFromHandleGLES3(NVGcontext * ctx, GLuint textureId, int w, int h, int imageFlags) +#endif +{ + GLNVGcontext * gl = (GLNVGcontext *)nvgInternalParams(ctx)->userPtr; + GLNVGtexture * tex = glnvg__allocTexture(gl); + + if(tex == NULL) return 0; + + tex->type = NVG_TEXTURE_RGBA; + tex->tex = textureId; + tex->flags = imageFlags; + tex->width = w; + tex->height = h; + + return tex->id; +} + +#if defined NANOVG_GL2 + GLuint nvglImageHandleGL2(NVGcontext * ctx, int image) +#elif defined NANOVG_GL3 + GLuint nvglImageHandleGL3(NVGcontext * ctx, int image) +#elif defined NANOVG_GLES2 + GLuint nvglImageHandleGLES2(NVGcontext * ctx, int image) +#elif defined NANOVG_GLES3 + GLuint nvglImageHandleGLES3(NVGcontext * ctx, int image) +#endif +{ + GLNVGcontext * gl = (GLNVGcontext *)nvgInternalParams(ctx)->userPtr; + GLNVGtexture * tex = glnvg__findTexture(gl, image); + return tex->tex; +} + +#endif /* LV_USE_NANOVG */ + +#endif /* NANOVG_GL_IMPLEMENTATION */ diff --git a/inc/lvgl/src/libs/nanovg/nanovg_gl_utils.h b/inc/lvgl/src/libs/nanovg/nanovg_gl_utils.h new file mode 100644 index 0000000..93aea96 --- /dev/null +++ b/inc/lvgl/src/libs/nanovg/nanovg_gl_utils.h @@ -0,0 +1,167 @@ +// +// Copyright (c) 2009-2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// +#ifndef NANOVG_GL_UTILS_H +#define NANOVG_GL_UTILS_H + +#include "../../lv_conf_internal.h" +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" + +#if LV_USE_NANOVG + +#ifdef NANOVG_GL_IMPLEMENTATION +struct NVGLUframebuffer { + NVGcontext * ctx; + GLuint fbo; + GLuint rbo; + GLuint texture; + int image; +}; +#endif + +typedef struct NVGLUframebuffer NVGLUframebuffer; + +// Helper function to create GL frame buffer to render to. +// format: see NVGtexture +void nvgluBindFramebuffer(NVGLUframebuffer * fb); +NVGLUframebuffer * nvgluCreateFramebuffer(NVGcontext * ctx, int w, int h, int imageFlags, int format); +void nvgluDeleteFramebuffer(NVGLUframebuffer * fb); + +#endif // NANOVG_GL_UTILS_H + +#ifdef NANOVG_GL_IMPLEMENTATION + +#if defined(NANOVG_GL3) || defined(NANOVG_GLES2) || defined(NANOVG_GLES3) + // FBO is core in OpenGL 3>. + #define NANOVG_FBO_VALID 1 +#elif defined(NANOVG_GL2) + // On OS X including glext defines FBO on GL2 too. + #ifdef __APPLE__ + #include + #define NANOVG_FBO_VALID 1 + #endif +#endif + +static GLint defaultFBO = -1; + +NVGLUframebuffer * nvgluCreateFramebuffer(NVGcontext * ctx, int w, int h, int imageFlags, int format) +{ +#ifdef NANOVG_FBO_VALID + GLint defFBO; + GLint defaultRBO; + NVGLUframebuffer * fb = NULL; + + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defFBO); + glGetIntegerv(GL_RENDERBUFFER_BINDING, &defaultRBO); + + fb = (NVGLUframebuffer *)lv_malloc(sizeof(NVGLUframebuffer)); + if(fb == NULL) goto error; + lv_memzero(fb, sizeof(NVGLUframebuffer)); + + fb->image = nvgCreateImage(ctx, w, h, imageFlags | NVG_IMAGE_FLIPY | NVG_IMAGE_PREMULTIPLIED, format, NULL); + +#if defined NANOVG_GL2 + fb->texture = nvglImageHandleGL2(ctx, fb->image); +#elif defined NANOVG_GL3 + fb->texture = nvglImageHandleGL3(ctx, fb->image); +#elif defined NANOVG_GLES2 + fb->texture = nvglImageHandleGLES2(ctx, fb->image); +#elif defined NANOVG_GLES3 + fb->texture = nvglImageHandleGLES3(ctx, fb->image); +#endif + + fb->ctx = ctx; + + // frame buffer object + glGenFramebuffers(1, &fb->fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fb->fbo); + + // render buffer object + glGenRenderbuffers(1, &fb->rbo); + glBindRenderbuffer(GL_RENDERBUFFER, fb->rbo); + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, w, h); + + // combine all + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb->texture, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb->rbo); + + if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { +#ifdef GL_DEPTH24_STENCIL8 + // If GL_STENCIL_INDEX8 is not supported, try GL_DEPTH24_STENCIL8 as a fallback. + // Some graphics cards require a depth buffer along with a stencil. + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, w, h); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb->texture, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb->rbo); + + if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) +#endif // GL_DEPTH24_STENCIL8 + goto error; + } + + glBindFramebuffer(GL_FRAMEBUFFER, defFBO); + glBindRenderbuffer(GL_RENDERBUFFER, defaultRBO); + return fb; +error: + glBindFramebuffer(GL_FRAMEBUFFER, defFBO); + glBindRenderbuffer(GL_RENDERBUFFER, defaultRBO); + nvgluDeleteFramebuffer(fb); + return NULL; +#else + NVG_NOTUSED(ctx); + NVG_NOTUSED(w); + NVG_NOTUSED(h); + NVG_NOTUSED(imageFlags); + NVG_NOTUSED(format); + return NULL; +#endif +} + +void nvgluBindFramebuffer(NVGLUframebuffer * fb) +{ +#ifdef NANOVG_FBO_VALID + if(defaultFBO == -1) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); + glBindFramebuffer(GL_FRAMEBUFFER, fb != NULL ? fb->fbo : (GLuint)defaultFBO); +#else + NVG_NOTUSED(fb); +#endif +} + +void nvgluDeleteFramebuffer(NVGLUframebuffer * fb) +{ +#ifdef NANOVG_FBO_VALID + if(fb == NULL) return; + if(fb->fbo != 0) + glDeleteFramebuffers(1, &fb->fbo); + if(fb->rbo != 0) + glDeleteRenderbuffers(1, &fb->rbo); + if(fb->image >= 0) + nvgDeleteImage(fb->ctx, fb->image); + fb->ctx = NULL; + fb->fbo = 0; + fb->rbo = 0; + fb->texture = 0; + fb->image = -1; + lv_free(fb); +#else + NVG_NOTUSED(fb); +#endif +} + +#endif // LV_USE_NANOVG + +#endif // NANOVG_GL_IMPLEMENTATION diff --git a/inc/lvgl/src/libs/qrcode/LICENSE.txt b/inc/lvgl/src/libs/qrcode/LICENSE.txt new file mode 100644 index 0000000..e6cc7e8 --- /dev/null +++ b/inc/lvgl/src/libs/qrcode/LICENSE.txt @@ -0,0 +1,8 @@ +Copyright © 2025 Project Nayuki. (MIT License) +https://www.nayuki.io/page/qr-code-generator-library + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +The Software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the Software or the use or other dealings in the Software. diff --git a/inc/lvgl/src/libs/qrcode/lv_qrcode.c b/inc/lvgl/src/libs/qrcode/lv_qrcode.c new file mode 100644 index 0000000..d0c5c66 --- /dev/null +++ b/inc/lvgl/src/libs/qrcode/lv_qrcode.c @@ -0,0 +1,269 @@ +/** + * @file lv_qrcode.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj_class_private.h" +#include "lv_qrcode_private.h" + +#if LV_USE_QRCODE + +#include "../../misc/cache/lv_cache.h" +#include "qrcodegen.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_qrcode_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_qrcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_qrcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static int32_t get_satisfied_size(int32_t min_version, int32_t size, int32_t * scale); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_qrcode_class = { + .constructor_cb = lv_qrcode_constructor, + .destructor_cb = lv_qrcode_destructor, + .instance_size = sizeof(lv_qrcode_t), + .base_class = &lv_canvas_class, + .name = "lv_qrcode", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_qrcode_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_qrcode_set_size(lv_obj_t * obj, int32_t size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_draw_buf_t * old_buf = lv_canvas_get_draw_buf(obj); + lv_draw_buf_t * new_buf = lv_draw_buf_create(size, size, LV_COLOR_FORMAT_I1, LV_STRIDE_AUTO); + if(new_buf == NULL) { + LV_LOG_ERROR("malloc failed for canvas buffer"); + return; + } + + lv_canvas_set_draw_buf(obj, new_buf); + LV_LOG_INFO("set canvas buffer: %p, size = %d", (void *)new_buf, (int)size); + + /*Clear canvas buffer*/ + lv_draw_buf_clear(new_buf, NULL); + + if(old_buf != NULL) lv_draw_buf_destroy(old_buf); +} + +void lv_qrcode_set_dark_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; + qrcode->dark_color = color; +} + +void lv_qrcode_set_light_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; + qrcode->light_color = color; +} + +lv_result_t lv_qrcode_update(lv_obj_t * obj, const void * data, uint32_t data_len) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; + + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + if(draw_buf == NULL) { + LV_LOG_ERROR("canvas draw buffer is NULL"); + return LV_RESULT_INVALID; + } + + lv_draw_buf_clear(draw_buf, NULL); + lv_canvas_set_palette(obj, 0, lv_color_to_32(qrcode->light_color, LV_OPA_COVER)); + lv_canvas_set_palette(obj, 1, lv_color_to_32(qrcode->dark_color, LV_OPA_COVER)); + lv_image_cache_drop(draw_buf); + + lv_obj_invalidate(obj); + + if(data_len > qrcodegen_BUFFER_LEN_MAX) return LV_RESULT_INVALID; + + int32_t qr_version = qrcodegen_getMinFitVersion(qrcodegen_Ecc_MEDIUM, data_len); + int32_t quiet_zone_scale = 0; + if(qrcode->quiet_zone) qr_version = get_satisfied_size(qr_version, draw_buf->header.w, &quiet_zone_scale); + if(qr_version <= 0 || (qrcode->quiet_zone && quiet_zone_scale <= 0)) return LV_RESULT_INVALID; + + const int32_t qr_size = qrcodegen_version2size(qr_version); + if(qr_size <= 0) return LV_RESULT_INVALID; + const int32_t scale = qrcode->quiet_zone ? quiet_zone_scale : draw_buf->header.w / qr_size; + + uint8_t * qr0 = lv_malloc(qrcodegen_BUFFER_LEN_FOR_VERSION(qr_version)); + LV_ASSERT_MALLOC(qr0); + uint8_t * data_tmp = lv_malloc(qrcodegen_BUFFER_LEN_FOR_VERSION(qr_version)); + LV_ASSERT_MALLOC(data_tmp); + lv_memcpy(data_tmp, data, data_len); + + bool ok = qrcodegen_encodeBinary(data_tmp, data_len, + qr0, qrcodegen_Ecc_MEDIUM, + qr_version, qr_version, + qrcodegen_Mask_AUTO, true); + + if(!ok) { + lv_free(qr0); + lv_free(data_tmp); + return LV_RESULT_INVALID; + } + + /* Temporarily disable invalidation to improve the efficiency of lv_canvas_set_px */ + lv_display_enable_invalidation(lv_obj_get_display(obj), false); + + int32_t obj_w = draw_buf->header.w; + int scaled = qr_size * scale; + int margin = (obj_w - scaled) / 2; + uint8_t * buf_u8 = draw_buf->data + 8; /*+8 skip the palette*/ + lv_color_t c = lv_color_hex(1); + + /* Copy the qr code canvas: + * A simple `lv_canvas_set_px` would work but it's slow for so many pixels. + * So buffer 1 byte (8 px) from the qr code and set it in the canvas image */ + uint32_t row_byte_cnt = draw_buf->header.stride; + int y; + for(y = margin; y < scaled + margin; y += scale) { + uint8_t b = 0; + uint8_t p = 0; + bool aligned = false; + int x; + for(x = margin; x < scaled + margin; x++) { + bool a = qrcodegen_getModule(qr0, (x - margin) / scale, (y - margin) / scale); + + if(aligned == false && (x & 0x7) == 0) aligned = true; + + if(aligned == false) { + if(a) { + lv_canvas_set_px(obj, x, y, c, LV_OPA_COVER); + } + } + else { + if(!a) b |= (1 << (7 - p)); + p++; + if(p == 8) { + uint32_t px = row_byte_cnt * y + (x >> 3); + buf_u8[px] = ~b; + b = 0; + p = 0; + } + } + } + + /*Process the last byte of the row*/ + if(p) { + /*Make the rest of the bits white*/ + b |= (1 << (8 - p)) - 1; + + uint32_t px = row_byte_cnt * y + (x >> 3); + buf_u8[px] = ~b; + } + + /*The Qr is probably scaled so simply to the repeated rows*/ + int s; + const uint8_t * row_ori = buf_u8 + row_byte_cnt * y; + for(s = 1; s < scale; s++) { + lv_memcpy((uint8_t *)buf_u8 + row_byte_cnt * (y + s), row_ori, row_byte_cnt); + } + } + + /* invalidate the canvas to refresh it */ + lv_display_enable_invalidation(lv_obj_get_display(obj), true); + + lv_free(qr0); + lv_free(data_tmp); + return LV_RESULT_OK; +} + +void lv_qrcode_set_data(lv_obj_t * obj, const char * data) +{ + if(data == NULL) return; + lv_qrcode_update(obj, data, lv_strlen(data)); +} + +void lv_qrcode_set_quiet_zone(lv_obj_t * obj, bool enable) +{ + lv_qrcode_t * qrcode = (lv_qrcode_t *)obj; + qrcode->quiet_zone = enable; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_qrcode_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + /*Set default size*/ + lv_qrcode_set_size(obj, LV_DPI_DEF); + + /*Set default color*/ + lv_qrcode_set_dark_color(obj, lv_color_black()); + lv_qrcode_set_light_color(obj, lv_color_white()); +} + +static void lv_qrcode_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + if(draw_buf == NULL) return; + lv_image_cache_drop(draw_buf); + + /*@fixme destroy buffer in cache free_cb.*/ + lv_draw_buf_destroy(draw_buf); +} + +static int32_t get_satisfied_size(int32_t min_version, int32_t size, int32_t * scale) +{ + if(min_version <= 0) return -1; + + int32_t offset = size; + int32_t satisfied_version = min_version; + if(scale) *scale = 0; + + for(int32_t version = min_version; version <= min_version + 2 && version <= qrcodegen_VERSION_MAX - 3; version++) { + int32_t version_size = qrcodegen_version2size(version + 1); + int32_t tmp_offset = size % version_size; + int32_t tmp_scale = size / version_size; + + if(tmp_offset < offset) { + offset = tmp_offset; + satisfied_version = version; + if(scale) *scale = tmp_scale; + } + } + return satisfied_version; +} + +#endif /*LV_USE_QRCODE*/ diff --git a/inc/lvgl/src/libs/qrcode/lv_qrcode.h b/inc/lvgl/src/libs/qrcode/lv_qrcode.h new file mode 100644 index 0000000..0056824 --- /dev/null +++ b/inc/lvgl/src/libs/qrcode/lv_qrcode.h @@ -0,0 +1,100 @@ +/** + * @file lv_qrcode.h + * + */ + +#ifndef LV_QRCODE_H +#define LV_QRCODE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../misc/lv_color.h" +#include "../../misc/lv_types.h" +#include "../../widgets/canvas/lv_canvas.h" +#include LV_STDBOOL_INCLUDE +#include LV_STDINT_INCLUDE +#if LV_USE_QRCODE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_qrcode_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an empty QR code (an `lv_canvas`) object. + * @param parent point to an object where to create the QR code + * @return pointer to the created QR code object + */ +lv_obj_t * lv_qrcode_create(lv_obj_t * parent); + +/** + * Set QR code size. + * @param obj pointer to a QR code object + * @param size width and height of the QR code + */ +void lv_qrcode_set_size(lv_obj_t * obj, int32_t size); + +/** + * Set QR code dark color. + * @param obj pointer to a QR code object + * @param color dark color of the QR code + */ +void lv_qrcode_set_dark_color(lv_obj_t * obj, lv_color_t color); + +/** + * Set QR code light color. + * @param obj pointer to a QR code object + * @param color light color of the QR code + */ +void lv_qrcode_set_light_color(lv_obj_t * obj, lv_color_t color); + +/** + * Set the data of a QR code object + * @param obj pointer to a QR code object + * @param data data to display + * @param data_len length of data in bytes + * @return LV_RESULT_OK: if no error; LV_RESULT_INVALID: on error + */ +lv_result_t lv_qrcode_update(lv_obj_t * obj, const void * data, uint32_t data_len); + +/** + * Helper function to set the data of a QR code object + * @param obj pointer to a QR code object + * @param data data to display as a string + */ +void lv_qrcode_set_data(lv_obj_t * obj, const char * data); + +/** + * Enable or disable quiet zone. + * Quiet zone is the area around the QR code where no data is encoded. + * @param obj pointer to a QR code object + * @param enable true: enable quiet zone; false: disable quiet zone + */ +void lv_qrcode_set_quiet_zone(lv_obj_t * obj, bool enable); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_QRCODE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_QRCODE_H*/ diff --git a/inc/lvgl/src/libs/qrcode/lv_qrcode_private.h b/inc/lvgl/src/libs/qrcode/lv_qrcode_private.h new file mode 100644 index 0000000..86acae2 --- /dev/null +++ b/inc/lvgl/src/libs/qrcode/lv_qrcode_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_qrcode_private.h + * + */ + +#ifndef LV_QRCODE_PRIVATE_H +#define LV_QRCODE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../widgets/canvas/lv_canvas_private.h" +#include "lv_qrcode.h" + +#if LV_USE_QRCODE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of qrcode*/ +struct _lv_qrcode_t { + lv_canvas_t canvas; + lv_color_t dark_color; + lv_color_t light_color; + int32_t quiet_zone; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_QRCODE */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_QRCODE_PRIVATE_H*/ diff --git a/inc/lvgl/src/libs/qrcode/qrcodegen.c b/inc/lvgl/src/libs/qrcode/qrcodegen.c new file mode 100644 index 0000000..f501a24 --- /dev/null +++ b/inc/lvgl/src/libs/qrcode/qrcodegen.c @@ -0,0 +1,1116 @@ +/* + * QR Code generator library (C) + * + * Copyright (c) Project Nayuki. (MIT License) + * https://www.nayuki.io/page/qr-code-generator-library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +#include "qrcodegen.h" +#include "../../misc/lv_assert.h" + +#if LV_USE_QRCODE +#include +#include +#include + +#ifndef QRCODEGEN_TEST + #define testable static // Keep functions private +#else + #define testable // Expose private functions +#endif + + +/*---- Forward declarations for private functions ----*/ + +// Regarding all public and private functions defined in this source file: +// - They require all pointer/array arguments to be not null unless the array length is zero. +// - They only read input scalar/array arguments, write to output pointer/array +// arguments, and return scalar values; they are "pure" functions. +// - They don't read mutable global variables or write to any global variables. +// - They don't perform I/O, read the clock, print to console, etc. +// - They allocate a small and constant amount of stack memory. +// - They don't allocate or free any memory on the heap. +// - They don't recurse or mutually recurse. All the code +// could be inlined into the top-level public functions. +// - They run in at most quadratic time with respect to input arguments. +// Most functions run in linear time, and some in constant time. +// There are no unbounded loops or non-obvious termination conditions. +// - They are completely thread-safe if the caller does not give the +// same writable buffer to concurrent calls to these functions. + +testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int * bitLen); + +testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]); +testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl); +testable int getNumRawDataModules(int ver); + +testable void calcReedSolomonGenerator(int degree, uint8_t result[]); +testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, + const uint8_t generator[], int degree, uint8_t result[]); +testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y); + +testable void initializeFunctionModules(int version, uint8_t qrcode[]); +static void drawWhiteFunctionModules(uint8_t qrcode[], int version); +static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]); +testable int getAlignmentPatternPositions(int version, uint8_t result[7]); +static void fillRectangle(int left, int top, int width, int height, uint8_t qrcode[]); + +static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]); +static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask); +static long getPenaltyScore(const uint8_t qrcode[]); +static void addRunToHistory(unsigned char run, unsigned char history[7]); +static bool hasFinderLikePattern(const unsigned char runHistory[7]); + +testable bool getModule(const uint8_t qrcode[], int x, int y); +testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack); +testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack); +static bool getBit(int x, int i); + +testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars); +testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version); +static int numCharCountBits(enum qrcodegen_Mode mode, int version); + + + +/*---- Private tables of constants ----*/ + +// The set of all legal characters in alphanumeric mode, where each character +// value maps to the index in the string. For checking text and encoding segments. +static const char * ALPHANUMERIC_CHARSET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"; + +// For generating error correction codes. +testable const int8_t ECC_CODEWORDS_PER_BLOCK[4][41] = { + // Version: (note that index 0 is for padding, and is set to an illegal value) + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level + {-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Low + {-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, // Medium + {-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // Quartile + {-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, // High +}; + +#define qrcodegen_REED_SOLOMON_DEGREE_MAX 30 // Based on the table above + +// For generating error correction codes. +testable const int8_t NUM_ERROR_CORRECTION_BLOCKS[4][41] = { + // Version: (note that index 0 is for padding, and is set to an illegal value) + //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level + {-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25}, // Low + {-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49}, // Medium + {-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68}, // Quartile + {-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81}, // High +}; + +// For automatic mask pattern selection. +static const int PENALTY_N1 = 3; +static const int PENALTY_N2 = 3; +static const int PENALTY_N3 = 40; +static const int PENALTY_N4 = 10; + + + +/*---- High-level QR Code encoding functions ----*/ + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeText(const char * text, uint8_t tempBuffer[], uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) +{ + + size_t textLen = strlen(text); + if(textLen == 0) + return qrcodegen_encodeSegmentsAdvanced(NULL, 0, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); + size_t bufLen = qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion); + + struct qrcodegen_Segment seg; + if(qrcodegen_isNumeric(text)) { + if(qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_NUMERIC, textLen) > bufLen) + goto fail; + seg = qrcodegen_makeNumeric(text, tempBuffer); + } + else if(qrcodegen_isAlphanumeric(text)) { + if(qrcodegen_calcSegmentBufferSize(qrcodegen_Mode_ALPHANUMERIC, textLen) > bufLen) + goto fail; + seg = qrcodegen_makeAlphanumeric(text, tempBuffer); + } + else { + if(textLen > bufLen) + goto fail; + for(size_t i = 0; i < textLen; i++) + tempBuffer[i] = (uint8_t)text[i]; + seg.mode = qrcodegen_Mode_BYTE; + seg.bitLength = calcSegmentBitLength(seg.mode, textLen); + if(seg.bitLength == -1) + goto fail; + seg.numChars = (int)textLen; + seg.data = tempBuffer; + } + return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, tempBuffer, qrcode); + +fail: + qrcode[0] = 0; // Set size to invalid value for safety + return false; +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl) +{ + + struct qrcodegen_Segment seg; + seg.mode = qrcodegen_Mode_BYTE; + seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); + if(seg.bitLength == -1) { + qrcode[0] = 0; // Set size to invalid value for safety + return false; + } + seg.numChars = (int)dataLen; + seg.data = dataAndTemp; + return qrcodegen_encodeSegmentsAdvanced(&seg, 1, ecl, minVersion, maxVersion, mask, boostEcl, dataAndTemp, qrcode); +} + + +// Appends the given number of low-order bits of the given value to the given byte-based +// bit buffer, increasing the bit length. Requires 0 <= numBits <= 16 and val < 2^numBits. +testable void appendBitsToBuffer(unsigned int val, int numBits, uint8_t buffer[], int * bitLen) +{ + LV_ASSERT(0 <= numBits && numBits <= 16 && (unsigned long)val >> numBits == 0); + for(int i = numBits - 1; i >= 0; i--, (*bitLen)++) + buffer[*bitLen >> 3] |= ((val >> i) & 1) << (7 - (*bitLen & 7)); +} + + + +/*---- Low-level QR Code encoding functions ----*/ + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, + enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]) +{ + return qrcodegen_encodeSegmentsAdvanced(segs, len, ecl, + qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX, -1, true, tempBuffer, qrcode); +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, + int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]) +{ + LV_ASSERT(segs != NULL || len == 0); + LV_ASSERT(qrcodegen_VERSION_MIN <= minVersion && minVersion <= maxVersion && maxVersion <= qrcodegen_VERSION_MAX); + LV_ASSERT(0 <= (int)ecl && (int)ecl <= 3 && -1 <= (int)mask && (int)mask <= 7); + + // Find the minimal version number to use + int version, dataUsedBits; + for(version = minVersion; ; version++) { + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available + dataUsedBits = getTotalBits(segs, len, version); + if(dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) + break; // This version number is found to be suitable + if(version >= maxVersion) { // All versions in the range could not fit the given data + qrcode[0] = 0; // Set size to invalid value for safety + return false; + } + } + LV_ASSERT(dataUsedBits != -1); + + // Increase the error correction level while the data still fits in the current version number + for(int i = (int)qrcodegen_Ecc_MEDIUM; i <= (int)qrcodegen_Ecc_HIGH; i++) { // From low to high + if(boostEcl && dataUsedBits <= getNumDataCodewords(version, (enum qrcodegen_Ecc)i) * 8) + ecl = (enum qrcodegen_Ecc)i; + } + + // Concatenate all segments to create the data bit string + memset(qrcode, 0, qrcodegen_BUFFER_LEN_FOR_VERSION(version) * sizeof(qrcode[0])); + int bitLen = 0; + for(size_t i = 0; i < len; i++) { + const struct qrcodegen_Segment * seg = &segs[i]; + appendBitsToBuffer((int)seg->mode, 4, qrcode, &bitLen); + appendBitsToBuffer(seg->numChars, numCharCountBits(seg->mode, version), qrcode, &bitLen); + for(int j = 0; j < seg->bitLength; j++) + appendBitsToBuffer((seg->data[j >> 3] >> (7 - (j & 7))) & 1, 1, qrcode, &bitLen); + } + LV_ASSERT(bitLen == dataUsedBits); + + // Add terminator and pad up to a byte if applicable + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; + LV_ASSERT(bitLen <= dataCapacityBits); + int terminatorBits = dataCapacityBits - bitLen; + if(terminatorBits > 4) + terminatorBits = 4; + appendBitsToBuffer(0, terminatorBits, qrcode, &bitLen); + appendBitsToBuffer(0, (8 - bitLen % 8) % 8, qrcode, &bitLen); + LV_ASSERT(bitLen % 8 == 0); + + // Pad with alternating bytes until data capacity is reached + for(uint8_t padByte = 0xEC; bitLen < dataCapacityBits; padByte ^= 0xEC ^ 0x11) + appendBitsToBuffer(padByte, 8, qrcode, &bitLen); + + // Draw function and data codeword modules + addEccAndInterleave(qrcode, version, ecl, tempBuffer); + initializeFunctionModules(version, qrcode); + drawCodewords(tempBuffer, getNumRawDataModules(version) / 8, qrcode); + drawWhiteFunctionModules(qrcode, version); + initializeFunctionModules(version, tempBuffer); + + // Handle masking + if(mask == qrcodegen_Mask_AUTO) { // Automatically choose best mask + long minPenalty = LONG_MAX; + for(int i = 0; i < 8; i++) { + enum qrcodegen_Mask msk = (enum qrcodegen_Mask)i; + applyMask(tempBuffer, qrcode, msk); + drawFormatBits(ecl, msk, qrcode); + long penalty = getPenaltyScore(qrcode); + if(penalty < minPenalty) { + mask = msk; + minPenalty = penalty; + } + applyMask(tempBuffer, qrcode, msk); // Undoes the mask due to XOR + } + } + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); + applyMask(tempBuffer, qrcode, mask); + drawFormatBits(ecl, mask, qrcode); + return true; +} + + + +/*---- Error correction code generation functions ----*/ + +// Appends error correction bytes to each block of the given data array, then interleaves +// bytes from the blocks and stores them in the result array. data[0 : dataLen] contains +// the input data. data[dataLen : rawCodewords] is used as a temporary work area and will +// be clobbered by this function. The final answer is stored in result[0 : rawCodewords]. +testable void addEccAndInterleave(uint8_t data[], int version, enum qrcodegen_Ecc ecl, uint8_t result[]) +{ + // Calculate parameter numbers + LV_ASSERT(0 <= (int)ecl && (int)ecl < 4 && qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + int numBlocks = NUM_ERROR_CORRECTION_BLOCKS[(int)ecl][version]; + int blockEccLen = ECC_CODEWORDS_PER_BLOCK [(int)ecl][version]; + int rawCodewords = getNumRawDataModules(version) / 8; + int dataLen = getNumDataCodewords(version, ecl); + int numShortBlocks = numBlocks - rawCodewords % numBlocks; + int shortBlockDataLen = rawCodewords / numBlocks - blockEccLen; + + // Split data into blocks, calculate ECC, and interleave + // (not concatenate) the bytes into a single sequence + uint8_t generator[qrcodegen_REED_SOLOMON_DEGREE_MAX]; + calcReedSolomonGenerator(blockEccLen, generator); + const uint8_t * dat = data; + for(int i = 0; i < numBlocks; i++) { + int datLen = shortBlockDataLen + (i < numShortBlocks ? 0 : 1); + uint8_t * ecc = &data[dataLen]; // Temporary storage + calcReedSolomonRemainder(dat, datLen, generator, blockEccLen, ecc); + for(int j = 0, k = i; j < datLen; j++, k += numBlocks) { // Copy data + if(j == shortBlockDataLen) + k -= numShortBlocks; + result[k] = dat[j]; + } + for(int j = 0, k = dataLen + i; j < blockEccLen; j++, k += numBlocks) // Copy ECC + result[k] = ecc[j]; + dat += datLen; + } +} + + +// Returns the number of 8-bit codewords that can be used for storing data (not ECC), +// for the given version number and error correction level. The result is in the range [9, 2956]. +testable int getNumDataCodewords(int version, enum qrcodegen_Ecc ecl) +{ + int v = version, e = (int)ecl; + LV_ASSERT(0 <= e && e < 4); + return getNumRawDataModules(v) / 8 + - ECC_CODEWORDS_PER_BLOCK [e][v] + * NUM_ERROR_CORRECTION_BLOCKS[e][v]; +} + + +// Returns the number of data bits that can be stored in a QR Code of the given version number, after +// all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8. +// The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table. +testable int getNumRawDataModules(int ver) +{ + LV_ASSERT(qrcodegen_VERSION_MIN <= ver && ver <= qrcodegen_VERSION_MAX); + int result = (16 * ver + 128) * ver + 64; + if(ver >= 2) { + int numAlign = ver / 7 + 2; + result -= (25 * numAlign - 10) * numAlign - 55; + if(ver >= 7) + result -= 36; + } + return result; +} + + + +/*---- Reed-Solomon ECC generator functions ----*/ + +// Calculates the Reed-Solomon generator polynomial of the given degree, storing in result[0 : degree]. +testable void calcReedSolomonGenerator(int degree, uint8_t result[]) +{ + // Start with the monomial x^0 + LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + memset(result, 0, degree * sizeof(result[0])); + result[degree - 1] = 1; + + // Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}), + // drop the highest term, and store the rest of the coefficients in order of descending powers. + // Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D). + uint8_t root = 1; + for(int i = 0; i < degree; i++) { + // Multiply the current product by (x - r^i) + for(int j = 0; j < degree; j++) { + result[j] = finiteFieldMultiply(result[j], root); + if(j + 1 < degree) + result[j] ^= result[j + 1]; + } + root = finiteFieldMultiply(root, 0x02); + } +} + + +// Calculates the remainder of the polynomial data[0 : dataLen] when divided by the generator[0 : degree], where all +// polynomials are in big endian and the generator has an implicit leading 1 term, storing the result in result[0 : degree]. +testable void calcReedSolomonRemainder(const uint8_t data[], int dataLen, + const uint8_t generator[], int degree, uint8_t result[]) +{ + + // Perform polynomial division + LV_ASSERT(1 <= degree && degree <= qrcodegen_REED_SOLOMON_DEGREE_MAX); + memset(result, 0, degree * sizeof(result[0])); + for(int i = 0; i < dataLen; i++) { + uint8_t factor = data[i] ^ result[0]; + memmove(&result[0], &result[1], (degree - 1) * sizeof(result[0])); + result[degree - 1] = 0; + for(int j = 0; j < degree; j++) + result[j] ^= finiteFieldMultiply(generator[j], factor); + } +} + +#undef qrcodegen_REED_SOLOMON_DEGREE_MAX + + +// Returns the product of the two given field elements modulo GF(2^8/0x11D). +// All inputs are valid. This could be implemented as a 256*256 lookup table. +testable uint8_t finiteFieldMultiply(uint8_t x, uint8_t y) +{ + // Russian peasant multiplication + uint8_t z = 0; + for(int i = 7; i >= 0; i--) { + z = (z << 1) ^ ((z >> 7) * 0x11D); + z ^= ((y >> i) & 1) * x; + } + return z; +} + + + +/*---- Drawing function modules ----*/ + +// Clears the given QR Code grid with white modules for the given +// version's size, then marks every function module as black. +testable void initializeFunctionModules(int version, uint8_t qrcode[]) +{ + // Initialize QR Code + int qrsize = version * 4 + 17; + memset(qrcode, 0, ((qrsize * qrsize + 7) / 8 + 1) * sizeof(qrcode[0])); + qrcode[0] = (uint8_t)qrsize; + + // Fill horizontal and vertical timing patterns + fillRectangle(6, 0, 1, qrsize, qrcode); + fillRectangle(0, 6, qrsize, 1, qrcode); + + // Fill 3 finder patterns (all corners except bottom right) and format bits + fillRectangle(0, 0, 9, 9, qrcode); + fillRectangle(qrsize - 8, 0, 8, 9, qrcode); + fillRectangle(0, qrsize - 8, 9, 8, qrcode); + + // Fill numerous alignment patterns + uint8_t alignPatPos[7]; + int numAlign = getAlignmentPatternPositions(version, alignPatPos); + for(int i = 0; i < numAlign; i++) { + for(int j = 0; j < numAlign; j++) { + // Don't draw on the three finder corners + if(!((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0))) + fillRectangle(alignPatPos[i] - 2, alignPatPos[j] - 2, 5, 5, qrcode); + } + } + + // Fill version blocks + if(version >= 7) { + fillRectangle(qrsize - 11, 0, 3, 6, qrcode); + fillRectangle(0, qrsize - 11, 6, 3, qrcode); + } +} + + +// Draws white function modules and possibly some black modules onto the given QR Code, without changing +// non-function modules. This does not draw the format bits. This requires all function modules to be previously +// marked black (namely by initializeFunctionModules()), because this may skip redrawing black function modules. +static void drawWhiteFunctionModules(uint8_t qrcode[], int version) +{ + // Draw horizontal and vertical timing patterns + int qrsize = qrcodegen_getSize(qrcode); + for(int i = 7; i < qrsize - 7; i += 2) { + setModule(qrcode, 6, i, false); + setModule(qrcode, i, 6, false); + } + + // Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules) + for(int dy = -4; dy <= 4; dy++) { + for(int dx = -4; dx <= 4; dx++) { + int dist = abs(dx); + if(abs(dy) > dist) + dist = abs(dy); + if(dist == 2 || dist == 4) { + setModuleBounded(qrcode, 3 + dx, 3 + dy, false); + setModuleBounded(qrcode, qrsize - 4 + dx, 3 + dy, false); + setModuleBounded(qrcode, 3 + dx, qrsize - 4 + dy, false); + } + } + } + + // Draw numerous alignment patterns + uint8_t alignPatPos[7]; + int numAlign = getAlignmentPatternPositions(version, alignPatPos); + for(int i = 0; i < numAlign; i++) { + for(int j = 0; j < numAlign; j++) { + if((i == 0 && j == 0) || (i == 0 && j == numAlign - 1) || (i == numAlign - 1 && j == 0)) + continue; // Don't draw on the three finder corners + for(int dy = -1; dy <= 1; dy++) { + for(int dx = -1; dx <= 1; dx++) + setModule(qrcode, alignPatPos[i] + dx, alignPatPos[j] + dy, dx == 0 && dy == 0); + } + } + } + + // Draw version blocks + if(version >= 7) { + // Calculate error correction code and pack bits + int rem = version; // version is uint6, in the range [7, 40] + for(int i = 0; i < 12; i++) + rem = (rem << 1) ^ ((rem >> 11) * 0x1F25); + long bits = (long)version << 12 | rem; // uint18 + LV_ASSERT(bits >> 18 == 0); + + // Draw two copies + for(int i = 0; i < 6; i++) { + for(int j = 0; j < 3; j++) { + int k = qrsize - 11 + j; + setModule(qrcode, k, i, (bits & 1) != 0); + setModule(qrcode, i, k, (bits & 1) != 0); + bits >>= 1; + } + } + } +} + + +// Draws two copies of the format bits (with its own error correction code) based +// on the given mask and error correction level. This always draws all modules of +// the format bits, unlike drawWhiteFunctionModules() which might skip black modules. +static void drawFormatBits(enum qrcodegen_Ecc ecl, enum qrcodegen_Mask mask, uint8_t qrcode[]) +{ + // Calculate error correction code and pack bits + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); + static const int table[] = {1, 0, 3, 2}; + int data = table[(int)ecl] << 3 | (int)mask; // errCorrLvl is uint2, mask is uint3 + int rem = data; + for(int i = 0; i < 10; i++) + rem = (rem << 1) ^ ((rem >> 9) * 0x537); + int bits = (data << 10 | rem) ^ 0x5412; // uint15 + LV_ASSERT(bits >> 15 == 0); + + // Draw first copy + for(int i = 0; i <= 5; i++) + setModule(qrcode, 8, i, getBit(bits, i)); + setModule(qrcode, 8, 7, getBit(bits, 6)); + setModule(qrcode, 8, 8, getBit(bits, 7)); + setModule(qrcode, 7, 8, getBit(bits, 8)); + for(int i = 9; i < 15; i++) + setModule(qrcode, 14 - i, 8, getBit(bits, i)); + + // Draw second copy + int qrsize = qrcodegen_getSize(qrcode); + for(int i = 0; i < 8; i++) + setModule(qrcode, qrsize - 1 - i, 8, getBit(bits, i)); + for(int i = 8; i < 15; i++) + setModule(qrcode, 8, qrsize - 15 + i, getBit(bits, i)); + setModule(qrcode, 8, qrsize - 8, true); // Always black +} + + +// Calculates and stores an ascending list of positions of alignment patterns +// for this version number, returning the length of the list (in the range [0,7]). +// Each position is in the range [0,177), and are used on both the x and y axes. +// This could be implemented as lookup table of 40 variable-length lists of unsigned bytes. +testable int getAlignmentPatternPositions(int version, uint8_t result[7]) +{ + if(version == 1) + return 0; + int numAlign = version / 7 + 2; + int step = (version == 32) ? 26 : + (version * 4 + numAlign * 2 + 1) / (numAlign * 2 - 2) * 2; + for(int i = numAlign - 1, pos = version * 4 + 10; i >= 1; i--, pos -= step) + result[i] = pos; + result[0] = 6; + return numAlign; +} + + +// Sets every pixel in the range [left : left + width] * [top : top + height] to black. +static void fillRectangle(int left, int top, int width, int height, uint8_t qrcode[]) +{ + for(int dy = 0; dy < height; dy++) { + for(int dx = 0; dx < width; dx++) + setModule(qrcode, left + dx, top + dy, true); + } +} + + + +/*---- Drawing data modules and masking ----*/ + +// Draws the raw codewords (including data and ECC) onto the given QR Code. This requires the initial state of +// the QR Code to be black at function modules and white at codeword modules (including unused remainder bits). +static void drawCodewords(const uint8_t data[], int dataLen, uint8_t qrcode[]) +{ + int qrsize = qrcodegen_getSize(qrcode); + int i = 0; // Bit index into the data + // Do the funny zigzag scan + for(int right = qrsize - 1; right >= 1; right -= 2) { // Index of right column in each column pair + if(right == 6) + right = 5; + for(int vert = 0; vert < qrsize; vert++) { // Vertical counter + for(int j = 0; j < 2; j++) { + int x = right - j; // Actual x coordinate + bool upward = ((right + 1) & 2) == 0; + int y = upward ? qrsize - 1 - vert : vert; // Actual y coordinate + if(!getModule(qrcode, x, y) && i < dataLen * 8) { + bool black = getBit(data[i >> 3], 7 - (i & 7)); + setModule(qrcode, x, y, black); + i++; + } + // If this QR Code has any remainder bits (0 to 7), they were assigned as + // 0/false/white by the constructor and are left unchanged by this method + } + } + } + LV_ASSERT(i == dataLen * 8); +} + + +// XORs the codeword modules in this QR Code with the given mask pattern. +// The function modules must be marked and the codeword bits must be drawn +// before masking. Due to the arithmetic of XOR, calling applyMask() with +// the same mask value a second time will undo the mask. A final well-formed +// QR Code needs exactly one (not zero, two, etc.) mask applied. +static void applyMask(const uint8_t functionModules[], uint8_t qrcode[], enum qrcodegen_Mask mask) +{ + LV_ASSERT(0 <= (int)mask && (int)mask <= 7); // Disallows qrcodegen_Mask_AUTO + int qrsize = qrcodegen_getSize(qrcode); + for(int y = 0; y < qrsize; y++) { + for(int x = 0; x < qrsize; x++) { + if(getModule(functionModules, x, y)) + continue; + bool invert; + switch((int)mask) { + case 0: + invert = (x + y) % 2 == 0; + break; + case 1: + invert = y % 2 == 0; + break; + case 2: + invert = x % 3 == 0; + break; + case 3: + invert = (x + y) % 3 == 0; + break; + case 4: + invert = (x / 3 + y / 2) % 2 == 0; + break; + case 5: + invert = x * y % 2 + x * y % 3 == 0; + break; + case 6: + invert = (x * y % 2 + x * y % 3) % 2 == 0; + break; + case 7: + invert = ((x + y) % 2 + x * y % 3) % 2 == 0; + break; + default: + LV_ASSERT(false); + return; + } + bool val = getModule(qrcode, x, y); + setModule(qrcode, x, y, val ^ invert); + } + } +} + + +// Calculates and returns the penalty score based on state of the given QR Code's current modules. +// This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score. +static long getPenaltyScore(const uint8_t qrcode[]) +{ + int qrsize = qrcodegen_getSize(qrcode); + long result = 0; + + // Adjacent modules in row having same color, and finder-like patterns + for(int y = 0; y < qrsize; y++) { + unsigned char runHistory[7] = {0}; + bool color = false; + unsigned char runX = 0; + for(int x = 0; x < qrsize; x++) { + if(getModule(qrcode, x, y) == color) { + runX++; + if(runX == 5) + result += PENALTY_N1; + else if(runX > 5) + result++; + } + else { + addRunToHistory(runX, runHistory); + if(!color && hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + color = getModule(qrcode, x, y); + runX = 1; + } + } + addRunToHistory(runX, runHistory); + if(color) + addRunToHistory(0, runHistory); // Dummy run of white + if(hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + } + // Adjacent modules in column having same color, and finder-like patterns + for(int x = 0; x < qrsize; x++) { + unsigned char runHistory[7] = {0}; + bool color = false; + unsigned char runY = 0; + for(int y = 0; y < qrsize; y++) { + if(getModule(qrcode, x, y) == color) { + runY++; + if(runY == 5) + result += PENALTY_N1; + else if(runY > 5) + result++; + } + else { + addRunToHistory(runY, runHistory); + if(!color && hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + color = getModule(qrcode, x, y); + runY = 1; + } + } + addRunToHistory(runY, runHistory); + if(color) + addRunToHistory(0, runHistory); // Dummy run of white + if(hasFinderLikePattern(runHistory)) + result += PENALTY_N3; + } + + // 2*2 blocks of modules having same color + for(int y = 0; y < qrsize - 1; y++) { + for(int x = 0; x < qrsize - 1; x++) { + bool color = getModule(qrcode, x, y); + if(color == getModule(qrcode, x + 1, y) && + color == getModule(qrcode, x, y + 1) && + color == getModule(qrcode, x + 1, y + 1)) + result += PENALTY_N2; + } + } + + // Balance of black and white modules + int black = 0; + for(int y = 0; y < qrsize; y++) { + for(int x = 0; x < qrsize; x++) { + if(getModule(qrcode, x, y)) + black++; + } + } + int total = qrsize * qrsize; // Note that size is odd, so black/total != 1/2 + // Compute the smallest integer k >= 0 such that (45-5k)% <= black/total <= (55+5k)% + int k = (int)((labs(black * 20L - total * 10L) + total - 1) / total) - 1; + result += k * PENALTY_N4; + return result; +} + + +// Inserts the given value to the front of the given array, which shifts over the +// existing values and deletes the last value. A helper function for getPenaltyScore(). +static void addRunToHistory(unsigned char run, unsigned char history[7]) +{ + memmove(&history[1], &history[0], 6 * sizeof(history[0])); + history[0] = run; +} + + +// Tests whether the given run history has the pattern of ratio 1:1:3:1:1 in the middle, and +// surrounded by at least 4 on either or both ends. A helper function for getPenaltyScore(). +// Must only be called immediately after a run of white modules has ended. +static bool hasFinderLikePattern(const unsigned char runHistory[7]) +{ + unsigned char n = runHistory[1]; + // The maximum QR Code size is 177, hence the run length n <= 177. + // Arithmetic is promoted to int, so n*4 will not overflow. + return n > 0 && runHistory[2] == n && runHistory[4] == n && runHistory[5] == n + && runHistory[3] == n * 3 && (runHistory[0] >= n * 4 || runHistory[6] >= n * 4); +} + + + +/*---- Basic QR Code information ----*/ + +// Public function - see documentation comment in header file. +int qrcodegen_getSize(const uint8_t qrcode[]) +{ + LV_ASSERT(qrcode != NULL); + int result = qrcode[0]; + LV_ASSERT((qrcodegen_VERSION_MIN * 4 + 17) <= result + && result <= (qrcodegen_VERSION_MAX * 4 + 17)); + return result; +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y) +{ + LV_ASSERT(qrcode != NULL); + int qrsize = qrcode[0]; + return (0 <= x && x < qrsize && 0 <= y && y < qrsize) && getModule(qrcode, x, y); +} + + +// Gets the module at the given coordinates, which must be in bounds. +testable bool getModule(const uint8_t qrcode[], int x, int y) +{ + int qrsize = qrcode[0]; + LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + int index = y * qrsize + x; + return getBit(qrcode[(index >> 3) + 1], index & 7); +} + + +// Sets the module at the given coordinates, which must be in bounds. +testable void setModule(uint8_t qrcode[], int x, int y, bool isBlack) +{ + int qrsize = qrcode[0]; + LV_ASSERT(21 <= qrsize && qrsize <= 177 && 0 <= x && x < qrsize && 0 <= y && y < qrsize); + int index = y * qrsize + x; + int bitIndex = index & 7; + int byteIndex = (index >> 3) + 1; + if(isBlack) + qrcode[byteIndex] |= 1 << bitIndex; + else + qrcode[byteIndex] &= (1 << bitIndex) ^ 0xFF; +} + + +// Sets the module at the given coordinates, doing nothing if out of bounds. +testable void setModuleBounded(uint8_t qrcode[], int x, int y, bool isBlack) +{ + int qrsize = qrcode[0]; + if(0 <= x && x < qrsize && 0 <= y && y < qrsize) + setModule(qrcode, x, y, isBlack); +} + + +// Returns true iff the i'th bit of x is set to 1. Requires x >= 0 and 0 <= i <= 14. +static bool getBit(int x, int i) +{ + return ((x >> i) & 1) != 0; +} + + + +/*---- Segment handling ----*/ + +// Public function - see documentation comment in header file. +bool qrcodegen_isAlphanumeric(const char * text) +{ + LV_ASSERT(text != NULL); + for(; *text != '\0'; text++) { + if(strchr(ALPHANUMERIC_CHARSET, *text) == NULL) + return false; + } + return true; +} + + +// Public function - see documentation comment in header file. +bool qrcodegen_isNumeric(const char * text) +{ + LV_ASSERT(text != NULL); + for(; *text != '\0'; text++) { + if(*text < '0' || *text > '9') + return false; + } + return true; +} + + +// Public function - see documentation comment in header file. +size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars) +{ + int temp = calcSegmentBitLength(mode, numChars); + if(temp == -1) + return SIZE_MAX; + LV_ASSERT(0 <= temp && temp <= INT16_MAX); + return ((size_t)temp + 7) / 8; +} + + +// Returns the number of data bits needed to represent a segment +// containing the given number of characters using the given mode. Notes: +// - Returns -1 on failure, i.e. numChars > INT16_MAX or +// the number of needed bits exceeds INT16_MAX (i.e. 32767). +// - Otherwise, all valid results are in the range [0, INT16_MAX]. +// - For byte mode, numChars measures the number of bytes, not Unicode code points. +// - For ECI mode, numChars must be 0, and the worst-case number of bits is returned. +// An actual ECI segment can have shorter data. For non-ECI modes, the result is exact. +testable int calcSegmentBitLength(enum qrcodegen_Mode mode, size_t numChars) +{ + // All calculations are designed to avoid overflow on all platforms + if(numChars > (unsigned int)INT16_MAX) + return -1; + long result = (long)numChars; + if(mode == qrcodegen_Mode_NUMERIC) + result = (result * 10 + 2) / 3; // ceil(10/3 * n) + else if(mode == qrcodegen_Mode_ALPHANUMERIC) + result = (result * 11 + 1) / 2; // ceil(11/2 * n) + else if(mode == qrcodegen_Mode_BYTE) + result *= 8; + else if(mode == qrcodegen_Mode_KANJI) + result *= 13; + else if(mode == qrcodegen_Mode_ECI && numChars == 0) + result = 3 * 8; + else { // Invalid argument + LV_ASSERT(false); + return -1; + } + LV_ASSERT(result >= 0); + if((unsigned int)result > (unsigned int)INT16_MAX) + return -1; + return (int)result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]) +{ + LV_ASSERT(data != NULL || len == 0); + struct qrcodegen_Segment result; + result.mode = qrcodegen_Mode_BYTE; + result.bitLength = calcSegmentBitLength(result.mode, len); + LV_ASSERT(result.bitLength != -1); + result.numChars = (int)len; + if(len > 0) + memcpy(buf, data, len * sizeof(buf[0])); + result.data = buf; + return result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeNumeric(const char * digits, uint8_t buf[]) +{ + LV_ASSERT(digits != NULL); + struct qrcodegen_Segment result; + size_t len = strlen(digits); + result.mode = qrcodegen_Mode_NUMERIC; + int bitLen = calcSegmentBitLength(result.mode, len); + LV_ASSERT(bitLen != -1); + result.numChars = (int)len; + if(bitLen > 0) + memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); + result.bitLength = 0; + + unsigned int accumData = 0; + int accumCount = 0; + for(; *digits != '\0'; digits++) { + char c = *digits; + LV_ASSERT('0' <= c && c <= '9'); + accumData = accumData * 10 + (unsigned int)(c - '0'); + accumCount++; + if(accumCount == 3) { + appendBitsToBuffer(accumData, 10, buf, &result.bitLength); + accumData = 0; + accumCount = 0; + } + } + if(accumCount > 0) // 1 or 2 digits remaining + appendBitsToBuffer(accumData, accumCount * 3 + 1, buf, &result.bitLength); + LV_ASSERT(result.bitLength == bitLen); + result.data = buf; + return result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char * text, uint8_t buf[]) +{ + LV_ASSERT(text != NULL); + struct qrcodegen_Segment result; + size_t len = strlen(text); + result.mode = qrcodegen_Mode_ALPHANUMERIC; + int bitLen = calcSegmentBitLength(result.mode, len); + LV_ASSERT(bitLen != -1); + result.numChars = (int)len; + if(bitLen > 0) + memset(buf, 0, ((size_t)bitLen + 7) / 8 * sizeof(buf[0])); + result.bitLength = 0; + + unsigned int accumData = 0; + int accumCount = 0; + for(; *text != '\0'; text++) { + const char * temp = strchr(ALPHANUMERIC_CHARSET, *text); + LV_ASSERT(temp != NULL); + accumData = accumData * 45 + (unsigned int)(temp - ALPHANUMERIC_CHARSET); + accumCount++; + if(accumCount == 2) { + appendBitsToBuffer(accumData, 11, buf, &result.bitLength); + accumData = 0; + accumCount = 0; + } + } + if(accumCount > 0) // 1 character remaining + appendBitsToBuffer(accumData, 6, buf, &result.bitLength); + LV_ASSERT(result.bitLength == bitLen); + result.data = buf; + return result; +} + + +// Public function - see documentation comment in header file. +struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]) +{ + struct qrcodegen_Segment result; + result.mode = qrcodegen_Mode_ECI; + result.numChars = 0; + result.bitLength = 0; + if(assignVal < 0) { + LV_ASSERT(false); + } + else if(assignVal < (1 << 7)) { + memset(buf, 0, 1 * sizeof(buf[0])); + appendBitsToBuffer(assignVal, 8, buf, &result.bitLength); + } + else if(assignVal < (1 << 14)) { + memset(buf, 0, 2 * sizeof(buf[0])); + appendBitsToBuffer(2, 2, buf, &result.bitLength); + appendBitsToBuffer(assignVal, 14, buf, &result.bitLength); + } + else if(assignVal < 1000000L) { + memset(buf, 0, 3 * sizeof(buf[0])); + appendBitsToBuffer(6, 3, buf, &result.bitLength); + appendBitsToBuffer(assignVal >> 10, 11, buf, &result.bitLength); + appendBitsToBuffer(assignVal & 0x3FF, 10, buf, &result.bitLength); + } + else { + LV_ASSERT(false); + } + result.data = buf; + return result; +} + + +// Calculates the number of bits needed to encode the given segments at the given version. +// Returns a non-negative number if successful. Otherwise returns -1 if a segment has too +// many characters to fit its length field, or the total bits exceeds INT16_MAX. +testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version) +{ + LV_ASSERT(segs != NULL || len == 0); + long result = 0; + for(size_t i = 0; i < len; i++) { + int numChars = segs[i].numChars; + int bitLength = segs[i].bitLength; + LV_ASSERT(0 <= numChars && numChars <= INT16_MAX); + LV_ASSERT(0 <= bitLength && bitLength <= INT16_MAX); + int ccbits = numCharCountBits(segs[i].mode, version); + LV_ASSERT(0 <= ccbits && ccbits <= 16); + if(numChars >= (1L << ccbits)) + return -1; // The segment's length doesn't fit the field's bit width + result += 4L + ccbits + bitLength; + if(result > INT16_MAX) + return -1; // The sum might overflow an int type + } + LV_ASSERT(0 <= result && result <= INT16_MAX); + return (int)result; +} + + +// Returns the bit width of the character count field for a segment in the given mode +// in a QR Code at the given version number. The result is in the range [0, 16]. +static int numCharCountBits(enum qrcodegen_Mode mode, int version) +{ + LV_ASSERT(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); + int i = (version + 7) / 17; + switch(mode) { + case qrcodegen_Mode_NUMERIC : { + static const int temp[] = {10, 12, 14}; + return temp[i]; + } + case qrcodegen_Mode_ALPHANUMERIC: { + static const int temp[] = { 9, 11, 13}; + return temp[i]; + } + case qrcodegen_Mode_BYTE : { + static const int temp[] = { 8, 16, 16}; + return temp[i]; + } + case qrcodegen_Mode_KANJI : { + static const int temp[] = { 8, 10, 12}; + return temp[i]; + } + case qrcodegen_Mode_ECI : + return 0; + default: + LV_ASSERT(false); + return -1; // Dummy value + } +} + +int qrcodegen_getMinFitVersion(enum qrcodegen_Ecc ecl, size_t dataLen) +{ + struct qrcodegen_Segment seg; + seg.mode = qrcodegen_Mode_BYTE; + seg.bitLength = calcSegmentBitLength(seg.mode, dataLen); + seg.numChars = (int)dataLen; + + for(int version = qrcodegen_VERSION_MIN; version <= qrcodegen_VERSION_MAX; version++) { + int dataCapacityBits = getNumDataCodewords(version, ecl) * 8; // Number of data bits available + int dataUsedBits = getTotalBits(&seg, 1, version); + if(dataUsedBits != -1 && dataUsedBits <= dataCapacityBits) + return version; + } + return -1; +} + +int qrcodegen_version2size(int version) +{ + if(version < qrcodegen_VERSION_MIN || version > qrcodegen_VERSION_MAX) { + return -1; + } + + return ((version - 1) * 4 + 21); +} +#endif diff --git a/inc/lvgl/src/libs/qrcode/qrcodegen.h b/inc/lvgl/src/libs/qrcode/qrcodegen.h new file mode 100644 index 0000000..7b80645 --- /dev/null +++ b/inc/lvgl/src/libs/qrcode/qrcodegen.h @@ -0,0 +1,324 @@ +/* + * QR Code generator library (C) + * + * Copyright (c) Project Nayuki. (MIT License) + * https://www.nayuki.io/page/qr-code-generator-library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +#pragma once + +#include "../../../lvgl.h" +#ifdef LV_USE_QRCODE + +#include LV_STDBOOL_INCLUDE +#include LV_STDDEF_INCLUDE +#include LV_STDINT_INCLUDE + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* + * This library creates QR Code symbols, which is a type of two-dimension barcode. + * Invented by Denso Wave and described in the ISO/IEC 18004 standard. + * A QR Code structure is an immutable square grid of black and white cells. + * The library provides functions to create a QR Code from text or binary data. + * The library covers the QR Code Model 2 specification, supporting all versions (sizes) + * from 1 to 40, all 4 error correction levels, and 4 character encoding modes. + * + * Ways to create a QR Code object: + * - High level: Take the payload data and call qrcodegen_encodeText() or qrcodegen_encodeBinary(). + * - Low level: Custom-make the list of segments and call + * qrcodegen_encodeSegments() or qrcodegen_encodeSegmentsAdvanced(). + * (Note that all ways require supplying the desired error correction level and various byte buffers.) + */ + + +/*---- Enum and struct types----*/ + +/* + * The error correction level in a QR Code symbol. + */ +enum qrcodegen_Ecc { + // Must be declared in ascending order of error protection + // so that an internal qrcodegen function works properly + qrcodegen_Ecc_LOW = 0, // The QR Code can tolerate about 7% erroneous codewords + qrcodegen_Ecc_MEDIUM, // The QR Code can tolerate about 15% erroneous codewords + qrcodegen_Ecc_QUARTILE, // The QR Code can tolerate about 25% erroneous codewords + qrcodegen_Ecc_HIGH, // The QR Code can tolerate about 30% erroneous codewords +}; + + +/* + * The mask pattern used in a QR Code symbol. + */ +enum qrcodegen_Mask { + // A special value to tell the QR Code encoder to + // automatically select an appropriate mask pattern + qrcodegen_Mask_AUTO = -1, + // The eight actual mask patterns + qrcodegen_Mask_0 = 0, + qrcodegen_Mask_1, + qrcodegen_Mask_2, + qrcodegen_Mask_3, + qrcodegen_Mask_4, + qrcodegen_Mask_5, + qrcodegen_Mask_6, + qrcodegen_Mask_7, +}; + + +/* + * Describes how a segment's data bits are interpreted. + */ +enum qrcodegen_Mode { + qrcodegen_Mode_NUMERIC = 0x1, + qrcodegen_Mode_ALPHANUMERIC = 0x2, + qrcodegen_Mode_BYTE = 0x4, + qrcodegen_Mode_KANJI = 0x8, + qrcodegen_Mode_ECI = 0x7, +}; + + +/* + * A segment of character/binary/control data in a QR Code symbol. + * The mid-level way to create a segment is to take the payload data + * and call a factory function such as qrcodegen_makeNumeric(). + * The low-level way to create a segment is to custom-make the bit buffer + * and initialize a qrcodegen_Segment struct with appropriate values. + * Even in the most favorable conditions, a QR Code can only hold 7089 characters of data. + * Any segment longer than this is meaningless for the purpose of generating QR Codes. + * Moreover, the maximum allowed bit length is 32767 because + * the largest QR Code (version 40) has 31329 modules. + */ +struct qrcodegen_Segment { + // The mode indicator of this segment. + enum qrcodegen_Mode mode; + + // The length of this segment's unencoded data. Measured in characters for + // numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. + // Always zero or positive. Not the same as the data's bit length. + int numChars; + + // The data bits of this segment, packed in bitwise big endian. + // Can be null if the bit length is zero. + uint8_t * data; + + // The number of valid data bits used in the buffer. Requires + // 0 <= bitLength <= 32767, and bitLength <= (capacity of data array) * 8. + // The character count (numChars) must agree with the mode and the bit buffer length. + int bitLength; +}; + + + +/*---- Macro constants and functions ----*/ + +#define qrcodegen_VERSION_MIN 1 // The minimum version number supported in the QR Code Model 2 standard +#define qrcodegen_VERSION_MAX 40 // The maximum version number supported in the QR Code Model 2 standard + +// Calculates the number of bytes needed to store any QR Code up to and including the given version number, +// as a compile-time constant. For example, 'uint8_t buffer[qrcodegen_BUFFER_LEN_FOR_VERSION(25)];' +// can store any single QR Code from version 1 to 25 (inclusive). The result fits in an int (or int16). +// Requires qrcodegen_VERSION_MIN <= n <= qrcodegen_VERSION_MAX. +#define qrcodegen_BUFFER_LEN_FOR_VERSION(n) ((((n) * 4 + 17) * ((n) * 4 + 17) + 7) / 8 + 1) + +// The worst-case number of bytes needed to store one QR Code, up to and including +// version 40. This value equals 3918, which is just under 4 kilobytes. +// Use this more convenient value to avoid calculating tighter memory bounds for buffers. +#define qrcodegen_BUFFER_LEN_MAX qrcodegen_BUFFER_LEN_FOR_VERSION(qrcodegen_VERSION_MAX) + + + +/*---- Functions (high level) to generate QR Codes ----*/ + +/* + * Encodes the given text string to a QR Code, returning true if encoding succeeded. + * If the data is too long to fit in any version in the given range + * at the given ECC level, then false is returned. + * - The input text must be encoded in UTF-8 and contain no NULs. + * - The variables ecl and mask must correspond to enum constant values. + * - Requires 1 <= minVersion <= maxVersion <= 40. + * - The arrays tempBuffer and qrcode must each have a length + * of at least qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion). + * - After the function returns, tempBuffer contains no useful data. + * - If successful, the resulting QR Code may use numeric, + * alphanumeric, or byte mode to encode the text. + * - In the most optimistic case, a QR Code at version 40 with low ECC + * can hold any UTF-8 string up to 2953 bytes, or any alphanumeric string + * up to 4296 characters, or any digit string up to 7089 characters. + * These numbers represent the hard upper limit of the QR Code standard. + * - Please consult the QR Code specification for information on + * data capacities per version, ECC level, and text encoding mode. + */ +bool qrcodegen_encodeText(const char * text, uint8_t tempBuffer[], uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl); + + +/* + * Encodes the given binary data to a QR Code, returning true if encoding succeeded. + * If the data is too long to fit in any version in the given range + * at the given ECC level, then false is returned. + * - The input array range dataAndTemp[0 : dataLen] should normally be + * valid UTF-8 text, but is not required by the QR Code standard. + * - The variables ecl and mask must correspond to enum constant values. + * - Requires 1 <= minVersion <= maxVersion <= 40. + * - The arrays dataAndTemp and qrcode must each have a length + * of at least qrcodegen_BUFFER_LEN_FOR_VERSION(maxVersion). + * - After the function returns, the contents of dataAndTemp may have changed, + * and does not represent useful data anymore. + * - If successful, the resulting QR Code will use byte mode to encode the data. + * - In the most optimistic case, a QR Code at version 40 with low ECC can hold any byte + * sequence up to length 2953. This is the hard upper limit of the QR Code standard. + * - Please consult the QR Code specification for information on + * data capacities per version, ECC level, and text encoding mode. + */ +bool qrcodegen_encodeBinary(uint8_t dataAndTemp[], size_t dataLen, uint8_t qrcode[], + enum qrcodegen_Ecc ecl, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl); + + +/*---- Functions (low level) to generate QR Codes ----*/ + +/* + * Renders a QR Code representing the given segments at the given error correction level. + * The smallest possible QR Code version is automatically chosen for the output. Returns true if + * QR Code creation succeeded, or false if the data is too long to fit in any version. The ECC level + * of the result may be higher than the ecl argument if it can be done without increasing the version. + * This function allows the user to create a custom sequence of segments that switches + * between modes (such as alphanumeric and byte) to encode text in less space. + * This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary(). + * To save memory, the segments' data buffers can alias/overlap tempBuffer, and will + * result in them being clobbered, but the QR Code output will still be correct. + * But the qrcode array must not overlap tempBuffer or any segment's data buffer. + */ +bool qrcodegen_encodeSegments(const struct qrcodegen_Segment segs[], size_t len, + enum qrcodegen_Ecc ecl, uint8_t tempBuffer[], uint8_t qrcode[]); + + +/* + * Renders a QR Code representing the given segments with the given encoding parameters. + * Returns true if QR Code creation succeeded, or false if the data is too long to fit in the range of versions. + * The smallest possible QR Code version within the given range is automatically + * chosen for the output. Iff boostEcl is true, then the ECC level of the result + * may be higher than the ecl argument if it can be done without increasing the + * version. The mask number is either between 0 to 7 (inclusive) to force that + * mask, or -1 to automatically choose an appropriate mask (which may be slow). + * This function allows the user to create a custom sequence of segments that switches + * between modes (such as alphanumeric and byte) to encode text in less space. + * This is a low-level API; the high-level API is qrcodegen_encodeText() and qrcodegen_encodeBinary(). + * To save memory, the segments' data buffers can alias/overlap tempBuffer, and will + * result in them being clobbered, but the QR Code output will still be correct. + * But the qrcode array must not overlap tempBuffer or any segment's data buffer. + */ +bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], size_t len, enum qrcodegen_Ecc ecl, + int minVersion, int maxVersion, int mask, bool boostEcl, uint8_t tempBuffer[], uint8_t qrcode[]); + + +/* + * Tests whether the given string can be encoded as a segment in alphanumeric mode. + * A string is encodable iff each character is in the following set: 0 to 9, A to Z + * (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon. + */ +bool qrcodegen_isAlphanumeric(const char * text); + + +/* + * Tests whether the given string can be encoded as a segment in numeric mode. + * A string is encodable iff each character is in the range 0 to 9. + */ +bool qrcodegen_isNumeric(const char * text); + + +/* + * Returns the number of bytes (uint8_t) needed for the data buffer of a segment + * containing the given number of characters using the given mode. Notes: + * - Returns SIZE_MAX on failure, i.e. numChars > INT16_MAX or + * the number of needed bits exceeds INT16_MAX (i.e. 32767). + * - Otherwise, all valid results are in the range [0, ceil(INT16_MAX / 8)], i.e. at most 4096. + * - It is okay for the user to allocate more bytes for the buffer than needed. + * - For byte mode, numChars measures the number of bytes, not Unicode code points. + * - For ECI mode, numChars must be 0, and the worst-case number of bytes is returned. + * An actual ECI segment can have shorter data. For non-ECI modes, the result is exact. + */ +size_t qrcodegen_calcSegmentBufferSize(enum qrcodegen_Mode mode, size_t numChars); + + +/* + * Returns a segment representing the given binary data encoded in + * byte mode. All input byte arrays are acceptable. Any text string + * can be converted to UTF-8 bytes and encoded as a byte mode segment. + */ +struct qrcodegen_Segment qrcodegen_makeBytes(const uint8_t data[], size_t len, uint8_t buf[]); + + +/* + * Returns a segment representing the given string of decimal digits encoded in numeric mode. + */ +struct qrcodegen_Segment qrcodegen_makeNumeric(const char * digits, uint8_t buf[]); + + +/* + * Returns a segment representing the given text string encoded in alphanumeric mode. + * The characters allowed are: 0 to 9, A to Z (uppercase only), space, + * dollar, percent, asterisk, plus, hyphen, period, slash, colon. + */ +struct qrcodegen_Segment qrcodegen_makeAlphanumeric(const char * text, uint8_t buf[]); + + +/* + * Returns a segment representing an Extended Channel Interpretation + * (ECI) designator with the given assignment value. + */ +struct qrcodegen_Segment qrcodegen_makeEci(long assignVal, uint8_t buf[]); + + +/*---- Functions to extract raw data from QR Codes ----*/ + +/* + * Returns the side length of the given QR Code, assuming that encoding succeeded. + * The result is in the range [21, 177]. Note that the length of the array buffer + * is related to the side length - every 'uint8_t qrcode[]' must have length at least + * qrcodegen_BUFFER_LEN_FOR_VERSION(version), which equals ceil(size^2 / 8 + 1). + */ +int qrcodegen_getSize(const uint8_t qrcode[]); + + +/* + * Returns the color of the module (pixel) at the given coordinates, which is false + * for white or true for black. The top left corner has the coordinates (x=0, y=0). + * If the given coordinates are out of bounds, then false (white) is returned. + */ +bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y); + +/* + * Returns the qrcode size of the specified version. Returns -1 on failure + */ +int qrcodegen_version2size(int version); +/* + * Returns the min version of the data that can be stored. Returns -1 on failure + */ +int qrcodegen_getMinFitVersion(enum qrcodegen_Ecc ecl, size_t dataLen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/inc/lvgl/src/libs/rle/lv_rle.c b/inc/lvgl/src/libs/rle/lv_rle.c new file mode 100644 index 0000000..e715b7c --- /dev/null +++ b/inc/lvgl/src/libs/rle/lv_rle.c @@ -0,0 +1,112 @@ +/** + * @file lv_rle.c + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../stdlib/lv_string.h" +#include "lv_rle.h" + +#if LV_USE_RLE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +uint32_t lv_rle_decompress(const uint8_t * input, + uint32_t input_buff_len, uint8_t * output, + uint32_t output_buff_len, uint8_t blk_size) +{ + uint32_t ctrl_byte; + uint32_t rd_len = 0; + uint32_t wr_len = 0; + + while(rd_len < input_buff_len) { + ctrl_byte = input[0]; + rd_len++; + input++; + if(rd_len > input_buff_len) + return 0; + + if(ctrl_byte & 0x80) { + /* copy directly from input to output */ + uint32_t bytes = blk_size * (ctrl_byte & 0x7f); + rd_len += bytes; + if(rd_len > input_buff_len) + return 0; + + wr_len += bytes; + if(wr_len > output_buff_len) { + if(wr_len > output_buff_len + blk_size) + return 0; /* Error */ + lv_memcpy(output, input, output_buff_len - (wr_len - bytes)); + return output_buff_len; + } + + lv_memcpy(output, input, bytes); + output += bytes; + input += bytes; + } + else { + rd_len += blk_size; + if(rd_len > input_buff_len) + return 0; + + wr_len += blk_size * ctrl_byte; + if(wr_len > output_buff_len) { + if(wr_len > output_buff_len + blk_size) + return 0; /* Error happened */ + + /* Skip the last pixel, which could overflow output buffer.*/ + for(uint32_t i = 0; i < ctrl_byte - 1; i++) { + lv_memcpy(output, input, blk_size); + output += blk_size; + } + return output_buff_len; + } + + if(blk_size == 1) { + /* optimize the most common case. */ + lv_memset(output, input[0], ctrl_byte); + output += ctrl_byte; + } + else { + for(uint32_t i = 0; i < ctrl_byte; i++) { + lv_memcpy(output, input, blk_size); + output += blk_size; + } + } + input += blk_size; + } + } + + return wr_len; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_RLE*/ diff --git a/inc/lvgl/src/libs/rle/lv_rle.h b/inc/lvgl/src/libs/rle/lv_rle.h new file mode 100644 index 0000000..02ab6a3 --- /dev/null +++ b/inc/lvgl/src/libs/rle/lv_rle.h @@ -0,0 +1,46 @@ +/** + * @file lv_rle.h + * + */ + +#ifndef LV_RLE_H +#define LV_RLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_RLE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +uint32_t lv_rle_decompress(const uint8_t * input, + uint32_t input_buff_len, uint8_t * output, + uint32_t output_buff_len, uint8_t blk_size); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_RLE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_RLE_H*/ diff --git a/inc/lvgl/src/libs/rlottie/lv_rlottie.c b/inc/lvgl/src/libs/rlottie/lv_rlottie.c new file mode 100644 index 0000000..1bc81ba --- /dev/null +++ b/inc/lvgl/src/libs/rlottie/lv_rlottie.c @@ -0,0 +1,244 @@ +/** + * @file lv_rlottie.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lvgl.h" +#if LV_USE_RLOTTIE + +#include "lv_rlottie_private.h" +#include "../../core/lv_obj_class_private.h" +#include +#include + +/********************* +* DEFINES +*********************/ +#define MY_CLASS (&lv_rlottie_class) +#define LV_ARGB32 32 + +/********************** +* TYPEDEFS +**********************/ +#define LV_ARGB32 32 + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_rlottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void next_frame_task_cb(lv_timer_t * t); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_rlottie_class = { + .constructor_cb = lv_rlottie_constructor, + .destructor_cb = lv_rlottie_destructor, + .instance_size = sizeof(lv_rlottie_t), + .base_class = &lv_image_class, + .name = "lv_rlottie", +}; + +typedef struct { + int32_t width; + int32_t height; + const char * rlottie_desc; + const char * path; +} lv_rlottie_create_info_t; + +/*Only used in lv_obj_class_create_obj, no affect multiple instances*/ +static lv_rlottie_create_info_t create_info; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_rlottie_create_from_file(lv_obj_t * parent, int32_t width, int32_t height, const char * path) +{ + create_info.width = width; + create_info.height = height; + create_info.path = path; + create_info.rlottie_desc = NULL; + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + + return obj; +} + +lv_obj_t * lv_rlottie_create_from_raw(lv_obj_t * parent, int32_t width, int32_t height, const char * rlottie_desc) +{ + create_info.width = width; + create_info.height = height; + create_info.rlottie_desc = rlottie_desc; + create_info.path = NULL; + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + + return obj; +} + +void lv_rlottie_set_play_mode(lv_obj_t * obj, const lv_rlottie_ctrl_t ctrl) +{ + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + rlottie->play_ctrl = ctrl; + + if(rlottie->task && (rlottie->dest_frame != rlottie->current_frame || + (rlottie->play_ctrl & LV_RLOTTIE_CTRL_PAUSE) == LV_RLOTTIE_CTRL_PLAY)) { + lv_timer_resume(rlottie->task); + } +} + +void lv_rlottie_set_current_frame(lv_obj_t * obj, const size_t goto_frame) +{ + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + rlottie->current_frame = goto_frame < rlottie->total_frames ? goto_frame : rlottie->total_frames - 1; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_rlottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + + if(create_info.rlottie_desc) { + rlottie->animation = lottie_animation_from_data(create_info.rlottie_desc, create_info.rlottie_desc, ""); + } + else if(create_info.path) { + rlottie->animation = lottie_animation_from_file(create_info.path); + } + if(rlottie->animation == NULL) { + LV_LOG_WARN("The animation can't be opened"); + return; + } + + rlottie->total_frames = lottie_animation_get_totalframe(rlottie->animation); + rlottie->framerate = (size_t)lottie_animation_get_framerate(rlottie->animation); + rlottie->current_frame = 0; + + rlottie->scanline_width = create_info.width * LV_ARGB32 / 8; + + size_t allocated_buf_size = (create_info.width * create_info.height * LV_ARGB32 / 8); + rlottie->allocated_buf = lv_malloc(allocated_buf_size); + if(rlottie->allocated_buf != NULL) { + rlottie->allocated_buffer_size = allocated_buf_size; + memset(rlottie->allocated_buf, 0, allocated_buf_size); + } + + rlottie->imgdsc.header.cf = LV_COLOR_FORMAT_ARGB8888; + rlottie->imgdsc.header.h = create_info.height; + rlottie->imgdsc.header.w = create_info.width; + rlottie->imgdsc.data = (void *)rlottie->allocated_buf; + rlottie->imgdsc.data_size = allocated_buf_size; + + lv_image_set_src(obj, &rlottie->imgdsc); + + rlottie->play_ctrl = LV_RLOTTIE_CTRL_FORWARD | LV_RLOTTIE_CTRL_PLAY | LV_RLOTTIE_CTRL_LOOP; + rlottie->dest_frame = rlottie->total_frames; /* invalid destination frame so it's possible to pause on frame 0 */ + + rlottie->task = lv_timer_create(next_frame_task_cb, 1000 / rlottie->framerate, obj); + + lv_obj_update_layout(obj); +} + +static void lv_rlottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + + if(rlottie->animation) { + lottie_animation_destroy(rlottie->animation); + rlottie->animation = 0; + rlottie->current_frame = 0; + rlottie->framerate = 0; + rlottie->scanline_width = 0; + rlottie->total_frames = 0; + } + + if(rlottie->task) { + lv_timer_delete(rlottie->task); + rlottie->task = NULL; + rlottie->play_ctrl = LV_RLOTTIE_CTRL_FORWARD; + rlottie->dest_frame = 0; + } + + lv_image_cache_drop(&rlottie->imgdsc); + + if(rlottie->allocated_buf) { + lv_free(rlottie->allocated_buf); + rlottie->allocated_buf = NULL; + rlottie->allocated_buffer_size = 0; + } + +} + +static void next_frame_task_cb(lv_timer_t * t) +{ + lv_obj_t * obj = lv_timer_get_user_data(t); + lv_rlottie_t * rlottie = (lv_rlottie_t *) obj; + + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_PAUSE) == LV_RLOTTIE_CTRL_PAUSE) { + if(rlottie->current_frame == rlottie->dest_frame) { + /* Pause the timer too when it has run once to avoid CPU consumption */ + lv_timer_pause(t); + return; + } + rlottie->dest_frame = rlottie->current_frame; + } + else { + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_BACKWARD) == LV_RLOTTIE_CTRL_BACKWARD) { + if(rlottie->current_frame > 0) + --rlottie->current_frame; + else { /* Looping ? */ + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_LOOP) == LV_RLOTTIE_CTRL_LOOP) + rlottie->current_frame = rlottie->total_frames - 1; + else { + lv_obj_send_event(obj, LV_EVENT_READY, NULL); + lv_timer_pause(t); + return; + } + } + } + else { + if(rlottie->current_frame < rlottie->total_frames) + ++rlottie->current_frame; + else { /* Looping ? */ + if((rlottie->play_ctrl & LV_RLOTTIE_CTRL_LOOP) == LV_RLOTTIE_CTRL_LOOP) + rlottie->current_frame = 0; + else { + lv_obj_send_event(obj, LV_EVENT_READY, NULL); + lv_timer_pause(t); + return; + } + } + } + } + + lottie_animation_render( + rlottie->animation, + rlottie->current_frame, + rlottie->allocated_buf, + rlottie->imgdsc.header.w, + rlottie->imgdsc.header.h, + rlottie->scanline_width + ); + + lv_obj_invalidate(obj); +} + +#endif /*LV_USE_RLOTTIE*/ diff --git a/inc/lvgl/src/libs/rlottie/lv_rlottie.h b/inc/lvgl/src/libs/rlottie/lv_rlottie.h new file mode 100644 index 0000000..44bcf2e --- /dev/null +++ b/inc/lvgl/src/libs/rlottie/lv_rlottie.h @@ -0,0 +1,58 @@ +/** + * @file lv_rlottie.h + * + */ + +#ifndef LV_RLOTTIE_H +#define LV_RLOTTIE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_RLOTTIE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_RLOTTIE_CTRL_FORWARD = 0, + LV_RLOTTIE_CTRL_BACKWARD = 1, + LV_RLOTTIE_CTRL_PAUSE = 2, + LV_RLOTTIE_CTRL_PLAY = 0, /* Yes, play = 0 is the default mode */ + LV_RLOTTIE_CTRL_LOOP = 8, +} lv_rlottie_ctrl_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_rlottie_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_obj_t * lv_rlottie_create_from_file(lv_obj_t * parent, int32_t width, int32_t height, const char * path); + +lv_obj_t * lv_rlottie_create_from_raw(lv_obj_t * parent, int32_t width, int32_t height, + const char * rlottie_desc); + +void lv_rlottie_set_play_mode(lv_obj_t * rlottie, const lv_rlottie_ctrl_t ctrl); +void lv_rlottie_set_current_frame(lv_obj_t * rlottie, const size_t goto_frame); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_RLOTTIE*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_RLOTTIE_H*/ diff --git a/inc/lvgl/src/libs/rlottie/lv_rlottie_private.h b/inc/lvgl/src/libs/rlottie/lv_rlottie_private.h new file mode 100644 index 0000000..344c390 --- /dev/null +++ b/inc/lvgl/src/libs/rlottie/lv_rlottie_private.h @@ -0,0 +1,61 @@ +/** + * @file lv_rlottie_private.h + * + */ + +#ifndef LV_RLOTTIE_PRIVATE_H +#define LV_RLOTTIE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_rlottie.h" +#if LV_USE_RLOTTIE +#include "../../widgets/image/lv_image_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** definition in lottieanimation_capi.c */ +struct Lottie_Animation_S; + +struct _lv_rlottie_t { + lv_image_t img_ext; + struct Lottie_Animation_S * animation; + lv_timer_t * task; + lv_image_dsc_t imgdsc; + size_t total_frames; + size_t current_frame; + size_t framerate; + uint32_t * allocated_buf; + size_t allocated_buffer_size; + size_t scanline_width; + lv_rlottie_ctrl_t play_ctrl; + size_t dest_frame; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_RLOTTIE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_RLOTTIE_PRIVATE_H*/ diff --git a/inc/lvgl/src/libs/svg/lv_svg.c b/inc/lvgl/src/libs/svg/lv_svg.c new file mode 100644 index 0000000..8bb6051 --- /dev/null +++ b/inc/lvgl/src/libs/svg/lv_svg.c @@ -0,0 +1,124 @@ +/** + * @file lv_svg.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_svg.h" +#if LV_USE_SVG + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_log.h" +#include "../../stdlib/lv_mem.h" + +#include "lv_svg_token.h" +#include "lv_svg_parser.h" + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_svg_node_constructor(const lv_tree_class_t * class_p, lv_tree_node_t * node) +{ + LV_UNUSED(class_p); + lv_svg_node_t * t = (lv_svg_node_t *)node; + t->xml_id = NULL; + t->type = LV_SVG_TAG_INVALID; + lv_array_init(&t->attrs, 4, sizeof(lv_svg_attr_t)); + t->render_obj = NULL; +} + +static void lv_svg_node_destructor(const lv_tree_class_t * class_p, lv_tree_node_t * node) +{ + LV_UNUSED(class_p); + lv_svg_node_t * t = (lv_svg_node_t *)node; + if(t->xml_id) { + lv_free(t->xml_id); + } + for(uint32_t i = 0; i < lv_array_size(&t->attrs); i++) { + lv_svg_attr_t * attr = lv_array_at(&t->attrs, i); + if(attr->val_type == LV_SVG_ATTR_VALUE_PTR) { + lv_free(attr->value.val); + } + } + lv_array_deinit(&t->attrs); +} + +static bool svg_token_process_cb(_lv_svg_token_t * token, void * data) +{ + _lv_svg_parser_t * parser = (_lv_svg_parser_t *)data; + return _lv_svg_parser_token(parser, token); +} + +/********************** + * STATIC VARIABLES + **********************/ +const lv_tree_class_t lv_svg_node_class = { + .base_class = &lv_tree_node_class, + .instance_size = sizeof(lv_svg_node_t), + .constructor_cb = lv_svg_node_constructor, + .destructor_cb = lv_svg_node_destructor, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +lv_svg_node_t * lv_svg_load_data(const char * svg_data, uint32_t data_len) +{ + LV_ASSERT_NULL(svg_data); + LV_ASSERT(data_len > 0); + + _lv_svg_parser_t parser; + _lv_svg_parser_init(&parser); + + if(_lv_svg_tokenizer(svg_data, data_len, svg_token_process_cb, &parser)) { + if(_lv_svg_parser_is_finish(&parser)) { + lv_svg_node_t * doc = parser.doc_root; + parser.doc_root = NULL; + _lv_svg_parser_deinit(&parser); +#if LV_USE_SVG_DEBUG + _lv_svg_dump_tree(doc, 0); +#endif + return doc; + } + else { + _lv_svg_parser_deinit(&parser); + LV_LOG_ERROR("svg document parser raise errors!"); + return NULL; + } + } + else { + _lv_svg_parser_deinit(&parser); + LV_LOG_ERROR("svg document tokenizer raise errors!"); + return NULL; + } +} + +lv_svg_node_t * lv_svg_node_create(lv_svg_node_t * parent) +{ + lv_tree_node_t * node = lv_tree_node_create(&lv_svg_node_class, (lv_tree_node_t *)parent); + return (lv_svg_node_t *)node; +} + +void lv_svg_node_delete(lv_svg_node_t * node) +{ + lv_tree_node_delete((lv_tree_node_t *)node); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#endif /*LV_USE_SVG*/ diff --git a/inc/lvgl/src/libs/svg/lv_svg.h b/inc/lvgl/src/libs/svg/lv_svg.h new file mode 100644 index 0000000..9d96cc7 --- /dev/null +++ b/inc/lvgl/src/libs/svg/lv_svg.h @@ -0,0 +1,336 @@ +/** + * @file lv_svg.h + * + */ + +#ifndef LV_SVG_H +#define LV_SVG_H + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_SVG + +#include "../../misc/lv_array.h" +#include "../../misc/lv_tree.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +enum _lv_svg_tag_t { + LV_SVG_TAG_INVALID = -1, + LV_SVG_TAG_CONTENT, + LV_SVG_TAG_SVG, + LV_SVG_TAG_USE, + LV_SVG_TAG_G, + LV_SVG_TAG_PATH, + LV_SVG_TAG_RECT, + LV_SVG_TAG_CIRCLE, + LV_SVG_TAG_ELLIPSE, + LV_SVG_TAG_LINE, + LV_SVG_TAG_POLYLINE, + LV_SVG_TAG_POLYGON, + LV_SVG_TAG_SOLID_COLOR, + LV_SVG_TAG_LINEAR_GRADIENT, + LV_SVG_TAG_RADIAL_GRADIENT, + LV_SVG_TAG_STOP, + LV_SVG_TAG_DEFS, + LV_SVG_TAG_IMAGE, +#if LV_USE_SVG_ANIMATION + LV_SVG_TAG_MPATH, + LV_SVG_TAG_SET, + LV_SVG_TAG_ANIMATE, + LV_SVG_TAG_ANIMATE_COLOR, + LV_SVG_TAG_ANIMATE_TRANSFORM, + LV_SVG_TAG_ANIMATE_MOTION, +#endif + LV_SVG_TAG_TEXT, + LV_SVG_TAG_TSPAN, + LV_SVG_TAG_TEXT_AREA, +}; +typedef int8_t lv_svg_tag_t; + +enum _lv_svg_attr_type_t { + LV_SVG_ATTR_INVALID = 0, + LV_SVG_ATTR_ID, + LV_SVG_ATTR_XML_ID, + LV_SVG_ATTR_VERSION, + LV_SVG_ATTR_BASE_PROFILE, + LV_SVG_ATTR_VIEWBOX, + LV_SVG_ATTR_PRESERVE_ASPECT_RATIO, + LV_SVG_ATTR_VIEWPORT_FILL, + LV_SVG_ATTR_VIEWPORT_FILL_OPACITY, + LV_SVG_ATTR_DISPLAY, + LV_SVG_ATTR_VISIBILITY, + LV_SVG_ATTR_X, + LV_SVG_ATTR_Y, + LV_SVG_ATTR_WIDTH, + LV_SVG_ATTR_HEIGHT, + LV_SVG_ATTR_RX, + LV_SVG_ATTR_RY, + LV_SVG_ATTR_CX, + LV_SVG_ATTR_CY, + LV_SVG_ATTR_R, + LV_SVG_ATTR_X1, + LV_SVG_ATTR_Y1, + LV_SVG_ATTR_X2, + LV_SVG_ATTR_Y2, + LV_SVG_ATTR_POINTS, + LV_SVG_ATTR_D, + LV_SVG_ATTR_PATH_LENGTH, + LV_SVG_ATTR_XLINK_HREF, + LV_SVG_ATTR_STYLE, + LV_SVG_ATTR_FILL, + LV_SVG_ATTR_FILL_RULE, + LV_SVG_ATTR_FILL_OPACITY, + LV_SVG_ATTR_STROKE, + LV_SVG_ATTR_STROKE_WIDTH, + LV_SVG_ATTR_STROKE_LINECAP, + LV_SVG_ATTR_STROKE_LINEJOIN, + LV_SVG_ATTR_STROKE_MITER_LIMIT, + LV_SVG_ATTR_STROKE_DASH_ARRAY, + LV_SVG_ATTR_STROKE_DASH_OFFSET, + LV_SVG_ATTR_STROKE_OPACITY, + LV_SVG_ATTR_OPACITY, + LV_SVG_ATTR_SOLID_COLOR, + LV_SVG_ATTR_SOLID_OPACITY, + LV_SVG_ATTR_GRADIENT_UNITS, + LV_SVG_ATTR_GRADIENT_STOP_OFFSET, + LV_SVG_ATTR_GRADIENT_STOP_COLOR, + LV_SVG_ATTR_GRADIENT_STOP_OPACITY, + LV_SVG_ATTR_FONT_FAMILY, + LV_SVG_ATTR_FONT_STYLE, + LV_SVG_ATTR_FONT_VARIANT, + LV_SVG_ATTR_FONT_WEIGHT, + LV_SVG_ATTR_FONT_SIZE, + LV_SVG_ATTR_TRANSFORM, + LV_SVG_ATTR_TEXT_ANCHOR, +#if LV_USE_SVG_ANIMATION + LV_SVG_ATTR_ATTRIBUTE_NAME, + LV_SVG_ATTR_ATTRIBUTE_TYPE, + LV_SVG_ATTR_BEGIN, + LV_SVG_ATTR_END, + LV_SVG_ATTR_DUR, + LV_SVG_ATTR_MIN, + LV_SVG_ATTR_MAX, + LV_SVG_ATTR_RESTART, + LV_SVG_ATTR_REPEAT_COUNT, + LV_SVG_ATTR_REPEAT_DUR, + LV_SVG_ATTR_CALC_MODE, + LV_SVG_ATTR_VALUES, + LV_SVG_ATTR_KEY_TIMES, + LV_SVG_ATTR_KEY_SPLINES, + LV_SVG_ATTR_KEY_POINTS, + LV_SVG_ATTR_FROM, + LV_SVG_ATTR_TO, + LV_SVG_ATTR_BY, + LV_SVG_ATTR_ADDITIVE, + LV_SVG_ATTR_ACCUMULATE, + LV_SVG_ATTR_PATH, + LV_SVG_ATTR_ROTATE, + LV_SVG_ATTR_TRANSFORM_TYPE, +#endif +}; +typedef uint8_t lv_svg_attr_type_t; + +enum _lv_svg_transform_type_t { + LV_SVG_TRANSFORM_TYPE_MATRIX = 1, + LV_SVG_TRANSFORM_TYPE_TRANSLATE, + LV_SVG_TRANSFORM_TYPE_ROTATE, + LV_SVG_TRANSFORM_TYPE_SCALE, + LV_SVG_TRANSFORM_TYPE_SKEW_X, + LV_SVG_TRANSFORM_TYPE_SKEW_Y, +}; +typedef uint8_t lv_svg_transform_type_t; + +#if LV_USE_SVG_ANIMATION +enum lv_svg_anim_action_t { + LV_SVG_ANIM_REMOVE = 0, + LV_SVG_ANIM_FREEZE, +}; + +enum _lv_svg_anim_restart_type_t { + LV_SVG_ANIM_RESTART_ALWAYS = 0, + LV_SVG_ANIM_RESTART_WHEN_NOT_ACTIVE, + LV_SVG_ANIM_RESTART_NEVER, +}; + +enum _lv_svg_anim_calc_mode_t { + LV_SVG_ANIM_CALC_MODE_LINEAR = 0, + LV_SVG_ANIM_CALC_MODE_PACED, + LV_SVG_ANIM_CALC_MODE_SPLINE, + LV_SVG_ANIM_CALC_MODE_DISCRETE, +}; + +enum _lv_svg_anim_additive_type_t { + LV_SVG_ANIM_ADDITIVE_REPLACE = 0, + LV_SVG_ANIM_ADDITIVE_SUM, +}; + +enum _lv_svg_anim_accumulate_type_t { + LV_SVG_ANIM_ACCUMULATE_NONE = 0, + LV_SVG_ANIM_ACCUMULATE_SUM, +}; +#endif + +enum _lv_svg_aspect_ratio_t { + LV_SVG_ASPECT_RATIO_NONE = 0, + LV_SVG_ASPECT_RATIO_XMIN_YMIN = (1 << 1), + LV_SVG_ASPECT_RATIO_XMID_YMIN = (2 << 1), + LV_SVG_ASPECT_RATIO_XMAX_YMIN = (3 << 1), + LV_SVG_ASPECT_RATIO_XMIN_YMID = (4 << 1), + LV_SVG_ASPECT_RATIO_XMID_YMID = (5 << 1), + LV_SVG_ASPECT_RATIO_XMAX_YMID = (6 << 1), + LV_SVG_ASPECT_RATIO_XMIN_YMAX = (7 << 1), + LV_SVG_ASPECT_RATIO_XMID_YMAX = (8 << 1), + LV_SVG_ASPECT_RATIO_XMAX_YMAX = (9 << 1), +}; +typedef uint32_t lv_svg_aspect_ratio_t; + +enum _lv_svg_aspect_ratio_opt_t { + LV_SVG_ASPECT_RATIO_OPT_MEET = 0, + LV_SVG_ASPECT_RATIO_OPT_SLICE, +}; + +typedef struct { + float x; + float y; +} lv_svg_point_t; + +typedef struct { + float m[3][3]; +} lv_svg_matrix_t; + +typedef uint32_t lv_svg_color_t; + +enum _lv_svg_fill_rule_t { + LV_SVG_FILL_NONZERO = 0, + LV_SVG_FILL_EVENODD, +}; +typedef uint8_t lv_svg_fill_rule_t; + +enum _lv_svg_line_cap_t { + LV_SVG_LINE_CAP_BUTT = 0, + LV_SVG_LINE_CAP_SQUARE, + LV_SVG_LINE_CAP_ROUND, +}; +typedef uint8_t lv_svg_line_cap_t; + +enum _lv_svg_line_join_t { + LV_SVG_LINE_JOIN_MITER = 0, + LV_SVG_LINE_JOIN_BEVEL, + LV_SVG_LINE_JOIN_ROUND, +}; +typedef uint8_t lv_svg_line_join_t; + +enum _lv_svg_gradient_units_t { + LV_SVG_GRADIENT_UNITS_OBJECT = 0, + LV_SVG_GRADIENT_UNITS_USER_SPACE, +}; +typedef uint8_t lv_svg_gradient_units_t; + +typedef union { + int32_t ival; + uint32_t uval; + float fval; + char * sval; + void * val; +} lv_svg_attr_value_t; + +/* + * to simplify list buffer management, allocate enough memory for all data and length. + * | size | data[0] | data[1] | data[2] | ... | + */ +typedef struct { + uint32_t length; + uint8_t data[1]; +} lv_svg_attr_values_list_t; + +/* https://www.w3.org/TR/SVGTiny12/svgudomidl.html */ +enum _lv_svg_path_cmd_t { + LV_SVG_PATH_CMD_MOVE_TO = 77, + LV_SVG_PATH_CMD_LINE_TO = 76, + LV_SVG_PATH_CMD_CURVE_TO = 67, + LV_SVG_PATH_CMD_QUAD_TO = 81, + LV_SVG_PATH_CMD_ARC_TO = 65, /*svg2 extension*/ + LV_SVG_PATH_CMD_CLOSE = 90, +}; + +/* + * to simplify list buffer management, allocate enough memory for all path data and cmd. + * | cmd | data[0] | data[1] | data[2] | ... | + */ +typedef struct { + uint32_t cmd; + uint8_t data[1]; +} lv_svg_attr_path_value_t; + +enum _lv_svg_attr_value_type_t { + LV_SVG_ATTR_VALUE_DATA = 0, + LV_SVG_ATTR_VALUE_PTR, +}; +typedef uint8_t lv_svg_attr_value_type_t; + +enum _lv_svg_attr_value_class_t { + LV_SVG_ATTR_VALUE_NONE = 0, + LV_SVG_ATTR_VALUE_INITIAL, + LV_SVG_ATTR_VALUE_INHERIT, +}; +typedef uint8_t lv_svg_attr_value_class_t; + +typedef struct { + lv_svg_attr_type_t id; + lv_svg_attr_value_type_t val_type; + lv_svg_attr_value_class_t class_type; + lv_svg_attr_value_t value; +} lv_svg_attr_t; + +struct _lv_svg_render_obj; + +typedef struct { + lv_tree_node_t base; + char * xml_id; /* xml_id or content */ + lv_svg_tag_t type; + lv_array_t attrs; + struct _lv_svg_render_obj * render_obj; +} lv_svg_node_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Loading SVG data and creating the DOM tree + * @param svg_data pointer to the SVG data + * @param data_len the SVG data length + */ +lv_svg_node_t * lv_svg_load_data(const char * svg_data, uint32_t data_len); + +/** + * @brief Create an SVG DOM node + * @param parent pointer to the parent node + * @return true: an new SVG DOM node, false: NULL + */ +lv_svg_node_t * lv_svg_node_create(lv_svg_node_t * parent); + +/** + * @brief Delete an SVG DOM subtree + * @param node pointer to an SVG DOM subtree + */ +void lv_svg_node_delete(lv_svg_node_t * node); + +/********************** + * MACROS + **********************/ +#define LV_SVG_NODE_CHILD(n, i) \ + ((lv_svg_node_t *)(LV_TREE_NODE((n))->children[i])) + +#define LV_SVG_NODE(n) ((lv_svg_node_t*)(n)) + +#endif /*LV_USE_SVG*/ + +#endif /*LV_SVG_H*/ diff --git a/inc/lvgl/src/libs/svg/lv_svg_decoder.c b/inc/lvgl/src/libs/svg/lv_svg_decoder.c new file mode 100644 index 0000000..6822aa7 --- /dev/null +++ b/inc/lvgl/src/libs/svg/lv_svg_decoder.c @@ -0,0 +1,384 @@ +/** + * @file lv_svg_decoder.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_image_decoder_private.h" +#include "../../../lvgl.h" + +#if LV_USE_SVG +#include "lv_svg_decoder.h" + +#include "lv_svg.h" +#include "../../draw/lv_draw_buf_private.h" +#include "../../display/lv_display_private.h" + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "SVG" + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t svg_decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * src, + lv_image_header_t * header); +static lv_result_t svg_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static void svg_decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static uint8_t * alloc_file(const char * filename, uint32_t * size); +static void svg_draw_buf_free(void * svg_buf); + +static void svg_draw(lv_layer_t * layer, const lv_image_decoder_dsc_t * dsc, const lv_area_t * coords, + const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * clip_area); +/********************** + * STATIC VARIABLES + **********************/ +static struct _lv_draw_buf_handlers_t _svg_draw_buf_handler = { + .buf_free_cb = svg_draw_buf_free, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Register the SVG decoder functions in LVGL + */ +void lv_svg_decoder_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, svg_decoder_info); + lv_image_decoder_set_open_cb(dec, svg_decoder_open); + lv_image_decoder_set_close_cb(dec, svg_decoder_close); + + dec->name = DECODER_NAME; +} + +void lv_svg_decoder_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == svg_decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static bool valid_svg_data(const uint8_t * data, uint32_t data_size) +{ + return (data_size >= 4 && lv_memcmp(data, "= 5 && lv_memcmp(data, "src_type; + + int width = 0; + int height = 0; + + if(src_type == LV_IMAGE_SRC_FILE || src_type == LV_IMAGE_SRC_VARIABLE) { + const void * src_data = src->src; + uint8_t * buf = NULL; + + if(src_type == LV_IMAGE_SRC_FILE) { + /*Support only "*.svg" files*/ + if(lv_strcmp(lv_fs_get_ext(src_data), "svg")) { + return LV_RESULT_INVALID; + } + + uint32_t rn; + lv_fs_res_t res; + uint32_t file_size = 0; + res = lv_fs_seek(&src->file, 0, LV_FS_SEEK_END); + if(res == LV_FS_RES_OK) { + lv_fs_tell(&src->file, &file_size); + lv_fs_seek(&src->file, 0, LV_FS_SEEK_SET); /* Reset position to start */ + } +#ifdef LV_USE_SVG_DEBUG + LV_LOG_INFO("LVGL file_size = %d.", file_size); + +#endif + if(file_size > 512) + file_size = 512; + + buf = (uint8_t *)lv_zalloc(file_size); + LV_ASSERT_NULL(buf); + /* read some bytes for searching svg header */ + res = lv_fs_read(&src->file, buf, file_size, &rn); + if(res != LV_FS_RES_OK) { + LV_LOG_WARN("can't open %s", (char *)src_data); + lv_free(buf); + return LV_RESULT_INVALID; + } + + if(!valid_svg_data(buf, rn)) { + lv_free(buf); + return LV_RESULT_INVALID; + } + + width = LV_DPI_DEF; + height = LV_DPI_DEF; + + uint8_t * svg_start = NULL; + uint8_t * svg_end = NULL; + uint8_t * ptr = buf; + uint8_t * ptr_end = buf + file_size - 1; + while(ptr < ptr_end) { + if(*ptr == '<') { + if(lv_strncmp((char *)(ptr + 1), "svg", 3) == 0) { + svg_start = ptr; + } + } + if(svg_start && (*ptr == '>')) { + svg_end = ptr; + break; + } + ptr++; + } + + if(svg_start && svg_end) { + lv_svg_node_t * svg_doc = lv_svg_load_data((char *)svg_start, svg_end - svg_start); + lv_svg_render_obj_t * svg_header = lv_svg_render_create(svg_doc); + if(svg_header->tag == LV_SVG_TAG_SVG) { + lv_area_t bounds; + svg_header->clz->get_bounds(svg_header, &bounds); + width = lv_area_get_width(&bounds) - 1; + height = lv_area_get_height(&bounds) - 1; + } + lv_svg_render_delete(svg_header); + lv_svg_node_delete(svg_doc); + } + else + LV_LOG_WARN("can't find svg viewport tag end"); + + lv_free(buf); + } + else { + const lv_image_dsc_t * img_dsc = src_data; + uint32_t data_size = img_dsc->data_size; + width = img_dsc->header.w; + height = img_dsc->header.h; + + if(!valid_svg_data(img_dsc->data, data_size)) { + return LV_RESULT_INVALID; + } + } + + header->cf = LV_COLOR_FORMAT_ARGB8888; + header->w = width; + header->h = height; + header->stride = width * 4; + header->flags |= LV_IMAGE_FLAGS_CUSTOM_DRAW; + + decoder->custom_draw_cb = svg_draw; + + return LV_RESULT_OK; + } + + return LV_RESULT_INVALID; +} + +static lv_result_t svg_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + LV_PROFILER_DECODER_BEGIN_TAG("lv_svg_decoder_open"); + + uint8_t * svg_data = NULL; + uint32_t svg_data_size = 0; + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + if(lv_strcmp(lv_fs_get_ext(fn), "svg") == 0) { /*Check the extension*/ + + svg_data = alloc_file(fn, &svg_data_size); + if(svg_data == NULL) { + LV_LOG_WARN("can't load file: %s", (const char *)dsc->src); + LV_PROFILER_DECODER_END_TAG("lv_svg_decoder_open"); + return LV_RESULT_INVALID; + } + + } + else { + LV_PROFILER_DECODER_END_TAG("lv_svg_decoder_open"); + return LV_RESULT_INVALID; + } + } + else if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = dsc->src; + svg_data = (uint8_t *)img_dsc->data; + svg_data_size = (uint32_t)img_dsc->data_size; + } + else { + LV_PROFILER_DECODER_END_TAG("lv_svg_decoder_open"); + return LV_RESULT_INVALID; + } + + lv_svg_node_t * svg_doc = lv_svg_load_data((char *)svg_data, svg_data_size); + lv_svg_render_obj_t * draw_list = lv_svg_render_create(svg_doc); + + if(dsc->src_type == LV_IMAGE_SRC_FILE) { + lv_free(svg_data); + } + lv_svg_node_delete(svg_doc); + + /* create a fake draw_buf object */ + lv_draw_buf_t * draw_buf = lv_zalloc(sizeof(lv_draw_buf_t)); + + draw_buf->header.w = 1; + draw_buf->header.h = 1; + draw_buf->header.cf = LV_COLOR_FORMAT_ARGB8888; + draw_buf->header.flags = LV_IMAGE_FLAGS_ALLOCATED | LV_IMAGE_FLAGS_CUSTOM_DRAW; + draw_buf->header.stride = 4; + draw_buf->header.magic = LV_IMAGE_HEADER_MAGIC; + draw_buf->data = NULL; + draw_buf->unaligned_data = (void *)draw_list; + draw_buf->data_size = lv_svg_render_get_size(draw_list); + draw_buf->handlers = &_svg_draw_buf_handler; + + dsc->decoded = draw_buf; + + if(!dsc->args.no_cache && lv_image_cache_is_enabled()) { + + lv_image_cache_data_t search_key; + search_key.src_type = dsc->src_type; + search_key.src = dsc->src; + search_key.slot.size = dsc->decoded->data_size; + + lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, draw_buf, NULL); + + if(entry == NULL) { + lv_draw_buf_destroy(draw_buf); + LV_PROFILER_DECODER_END_TAG("lv_svg_decoder_open"); + return LV_RESULT_INVALID; + } + dsc->cache_entry = entry; + } + + LV_PROFILER_DECODER_END_TAG("lv_svg_decoder_open"); + return LV_RESULT_OK; +} + +static void svg_decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + + if(dsc->args.no_cache || + !lv_image_cache_is_enabled()) lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded); +} + +static uint8_t * alloc_file(const char * filename, uint32_t * size) +{ + uint8_t * data = NULL; + lv_fs_file_t f; + uint32_t data_size; + uint32_t rn; + lv_fs_res_t res; + + *size = 0; + + res = lv_fs_open(&f, filename, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + LV_LOG_WARN("can't open %s", filename); + return NULL; + } + + res = lv_fs_seek(&f, 0, LV_FS_SEEK_END); + if(res != LV_FS_RES_OK) { + goto failed; + } + + res = lv_fs_tell(&f, &data_size); + if(res != LV_FS_RES_OK) { + goto failed; + } + + res = lv_fs_seek(&f, 0, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) { + goto failed; + } + + /*Read file to buffer*/ + data = lv_malloc(data_size); + if(data == NULL) { + LV_LOG_WARN("malloc failed for data size %u", data_size); + goto failed; + } + + res = lv_fs_read(&f, data, data_size, &rn); + + if(res == LV_FS_RES_OK && rn == data_size) { + *size = rn; + } + else { + LV_LOG_WARN("read file failed"); + lv_free(data); + data = NULL; + } + +failed: + lv_fs_close(&f); + return data; +} + +static void svg_draw_buf_free(void * svg_buf) +{ + lv_svg_render_obj_t * draw_list = (lv_svg_render_obj_t *)svg_buf; + lv_svg_render_delete(draw_list); +} + +static void svg_draw(lv_layer_t * layer, const lv_image_decoder_dsc_t * decoder_dsc, const lv_area_t * coords, + const lv_draw_image_dsc_t * image_dsc, const lv_area_t * clip_area) +{ + const lv_draw_buf_t * draw_buf = decoder_dsc->decoded; + const lv_svg_render_obj_t * list = draw_buf->unaligned_data; + + LV_PROFILER_DRAW_BEGIN; + + lv_draw_vector_dsc_t * dsc = lv_draw_vector_dsc_create(layer); + + /*Save the widget so that `LV_EVENT_DRAW_TASK_ADDED` can be sent to it in `lv_draw_vector`*/ + dsc->base.obj = image_dsc->base.obj; + + lv_matrix_t matrix; + lv_matrix_identity(&matrix); + lv_matrix_translate(&matrix, coords->x1, coords->y1); + dsc->ctx->scissor_area = *clip_area; + if(image_dsc) { + int32_t off_x = (lv_area_get_width(coords) - image_dsc->header.w - 1) / 2; + int32_t off_y = (lv_area_get_height(coords) - image_dsc->header.h - 1) / 2; + + if(image_dsc->pivot.x != 0 || image_dsc->pivot.y != 0) { + lv_matrix_translate(&matrix, off_x, off_y); + } + lv_matrix_translate(&matrix, image_dsc->pivot.x, image_dsc->pivot.y); + lv_matrix_rotate(&matrix, image_dsc->rotation / 10.0f); + lv_matrix_scale(&matrix, image_dsc->scale_x / 256.0f, image_dsc->scale_y / 256.0f); + lv_matrix_translate(&matrix, -image_dsc->pivot.x, -image_dsc->pivot.y); + } + lv_draw_vector_dsc_set_transform(dsc, &matrix); + lv_draw_svg_render(dsc, list); + lv_draw_vector(dsc); + lv_draw_vector_dsc_delete(dsc); + + LV_PROFILER_DRAW_END; +} + +#endif /*LV_USE_SVG*/ diff --git a/inc/lvgl/src/libs/svg/lv_svg_decoder.h b/inc/lvgl/src/libs/svg/lv_svg_decoder.h new file mode 100644 index 0000000..b73a640 --- /dev/null +++ b/inc/lvgl/src/libs/svg/lv_svg_decoder.h @@ -0,0 +1,51 @@ +/** + * @file lv_svg_decoder.h + * + */ + +#ifndef LV_SVG_DECODER_H +#define LV_SVG_DECODER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_SVG + +#include "../../draw/lv_image_decoder.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register the SVG decoder functions in LVGL + */ +void lv_svg_decoder_init(void); + +void lv_svg_decoder_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SVG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SVG_DECODER_H*/ diff --git a/inc/lvgl/src/libs/svg/lv_svg_parser.c b/inc/lvgl/src/libs/svg/lv_svg_parser.c new file mode 100644 index 0000000..afcaf51 --- /dev/null +++ b/inc/lvgl/src/libs/svg/lv_svg_parser.c @@ -0,0 +1,2479 @@ +/** + * @file lv_svg_parser.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_svg_parser.h" +#if LV_USE_SVG + +#include "../../../lvgl.h" +#include +#include +#include +#include + +/********************* +* DEFINES +*********************/ +#ifndef M_PI + #define M_PI 3.1415926f +#endif + +#define MAP_LEN(m) sizeof((m)) / sizeof((m[0])) + +#define CHECK_AND_RESIZE_ATTRS(a) \ + do { \ + if((lv_array_size(&(a)) + 1) > lv_array_capacity(&(a))) { \ + lv_array_resize(&(a), (a).capacity << 1); \ + } \ + } while(0) + +/********************** +* TYPEDEFS +**********************/ +static const struct _lv_svg_tag_map { + const char * name; + uint32_t name_len; + lv_svg_tag_t tag; +} _svg_tag_map[] = { + {"svg", 3, LV_SVG_TAG_SVG}, + {"use", 3, LV_SVG_TAG_USE}, + {"g", 1, LV_SVG_TAG_G}, + {"path", 4, LV_SVG_TAG_PATH}, + {"rect", 4, LV_SVG_TAG_RECT}, + {"circle", 6, LV_SVG_TAG_CIRCLE}, + {"ellipse", 7, LV_SVG_TAG_ELLIPSE}, + {"line", 4, LV_SVG_TAG_LINE}, + {"polyline", 8, LV_SVG_TAG_POLYLINE}, + {"polygon", 7, LV_SVG_TAG_POLYGON}, + {"solidColor", 10, LV_SVG_TAG_SOLID_COLOR}, + {"linearGradient", 14, LV_SVG_TAG_LINEAR_GRADIENT}, + {"radialGradient", 14, LV_SVG_TAG_RADIAL_GRADIENT}, + {"stop", 4, LV_SVG_TAG_STOP}, + {"defs", 4, LV_SVG_TAG_DEFS}, + {"image", 5, LV_SVG_TAG_IMAGE}, +#if LV_USE_SVG_ANIMATION + {"mpath", 5, LV_SVG_TAG_MPATH}, + {"set", 3, LV_SVG_TAG_SET}, + {"animate", 7, LV_SVG_TAG_ANIMATE}, + {"animateColor", 12, LV_SVG_TAG_ANIMATE_COLOR}, + {"animateTransform", 16, LV_SVG_TAG_ANIMATE_TRANSFORM}, + {"animateMotion", 13, LV_SVG_TAG_ANIMATE_MOTION}, +#endif + {"text", 4, LV_SVG_TAG_TEXT}, + {"tspan", 5, LV_SVG_TAG_TSPAN}, + {"textArea", 8, LV_SVG_TAG_TEXT_AREA}, +}; + +static const struct _lv_svg_attr_map { + const char * name; + uint32_t name_len; + lv_svg_attr_type_t attr; +} _svg_attr_map[] = { + {"id", 2, LV_SVG_ATTR_ID}, + {"xml:id", 6, LV_SVG_ATTR_XML_ID}, + {"version", 7, LV_SVG_ATTR_VERSION}, + {"baseProfile", 11, LV_SVG_ATTR_BASE_PROFILE}, + {"viewBox", 7, LV_SVG_ATTR_VIEWBOX}, + {"preserveAspectRatio", 19, LV_SVG_ATTR_PRESERVE_ASPECT_RATIO}, + {"viewport-fill", 13, LV_SVG_ATTR_VIEWPORT_FILL}, + {"viewport-fill-opacity", 21, LV_SVG_ATTR_VIEWPORT_FILL_OPACITY}, + {"display", 7, LV_SVG_ATTR_DISPLAY}, + {"visibility", 10, LV_SVG_ATTR_VISIBILITY}, + {"x", 1, LV_SVG_ATTR_X}, + {"y", 1, LV_SVG_ATTR_Y}, + {"width", 5, LV_SVG_ATTR_WIDTH}, + {"height", 6, LV_SVG_ATTR_HEIGHT}, + {"rx", 2, LV_SVG_ATTR_RX}, + {"ry", 2, LV_SVG_ATTR_RY}, + {"cx", 2, LV_SVG_ATTR_CX}, + {"cy", 2, LV_SVG_ATTR_CY}, + {"r", 1, LV_SVG_ATTR_R}, + {"x1", 2, LV_SVG_ATTR_X1}, + {"y1", 2, LV_SVG_ATTR_Y1}, + {"x2", 2, LV_SVG_ATTR_X2}, + {"y2", 2, LV_SVG_ATTR_Y2}, + {"points", 6, LV_SVG_ATTR_POINTS}, + {"d", 1, LV_SVG_ATTR_D}, + {"pathLength", 10, LV_SVG_ATTR_PATH_LENGTH}, + {"xlink:href", 10, LV_SVG_ATTR_XLINK_HREF}, + {"style", 5, LV_SVG_ATTR_STYLE}, + {"fill", 4, LV_SVG_ATTR_FILL}, + {"fill-rule", 9, LV_SVG_ATTR_FILL_RULE}, + {"fill-opacity", 12, LV_SVG_ATTR_FILL_OPACITY}, + {"stroke", 6, LV_SVG_ATTR_STROKE}, + {"stroke-width", 12, LV_SVG_ATTR_STROKE_WIDTH}, + {"stroke-linecap", 14, LV_SVG_ATTR_STROKE_LINECAP}, + {"stroke-linejoin", 15, LV_SVG_ATTR_STROKE_LINEJOIN}, + {"stroke-miterlimit", 17, LV_SVG_ATTR_STROKE_MITER_LIMIT}, + {"stroke-dasharray", 16, LV_SVG_ATTR_STROKE_DASH_ARRAY}, + {"stroke-dashoffset", 17, LV_SVG_ATTR_STROKE_DASH_OFFSET}, + {"stroke-opacity", 14, LV_SVG_ATTR_STROKE_OPACITY}, + {"opacity", 7, LV_SVG_ATTR_OPACITY}, + {"solid-color", 11, LV_SVG_ATTR_SOLID_COLOR}, + {"solid-opacity", 13, LV_SVG_ATTR_SOLID_OPACITY}, + {"gradientUnits", 13, LV_SVG_ATTR_GRADIENT_UNITS}, + {"offset", 6, LV_SVG_ATTR_GRADIENT_STOP_OFFSET}, + {"stop-color", 10, LV_SVG_ATTR_GRADIENT_STOP_COLOR}, + {"stop-opacity", 12, LV_SVG_ATTR_GRADIENT_STOP_OPACITY}, + {"font-family", 11, LV_SVG_ATTR_FONT_FAMILY}, + {"font-style", 10, LV_SVG_ATTR_FONT_STYLE}, + {"font-variant", 12, LV_SVG_ATTR_FONT_VARIANT}, + {"font-weight", 11, LV_SVG_ATTR_FONT_WEIGHT}, + {"font-size", 9, LV_SVG_ATTR_FONT_SIZE}, + {"transform", 9, LV_SVG_ATTR_TRANSFORM}, + {"text-anchor", 11, LV_SVG_ATTR_TEXT_ANCHOR}, +#if LV_USE_SVG_ANIMATION + {"attributeName", 13, LV_SVG_ATTR_ATTRIBUTE_NAME}, + {"attributeType", 13, LV_SVG_ATTR_ATTRIBUTE_TYPE}, + {"begin", 5, LV_SVG_ATTR_BEGIN}, + {"end", 3, LV_SVG_ATTR_END}, + {"dur", 3, LV_SVG_ATTR_DUR}, + {"min", 3, LV_SVG_ATTR_MIN}, + {"max", 3, LV_SVG_ATTR_MAX}, + {"restart", 7, LV_SVG_ATTR_RESTART}, + {"repeatCount", 11, LV_SVG_ATTR_REPEAT_COUNT}, + {"repeatDur", 9, LV_SVG_ATTR_REPEAT_DUR}, + {"calcMode", 8, LV_SVG_ATTR_CALC_MODE}, + {"values", 6, LV_SVG_ATTR_VALUES}, + {"keyTimes", 8, LV_SVG_ATTR_KEY_TIMES}, + {"keySplines", 10, LV_SVG_ATTR_KEY_SPLINES}, + {"keyPoints", 9, LV_SVG_ATTR_KEY_POINTS}, + {"from", 4, LV_SVG_ATTR_FROM}, + {"to", 2, LV_SVG_ATTR_TO}, + {"by", 2, LV_SVG_ATTR_BY}, + {"additive", 8, LV_SVG_ATTR_ADDITIVE}, + {"accumulate", 10, LV_SVG_ATTR_ACCUMULATE}, + {"path", 4, LV_SVG_ATTR_PATH}, + {"rotate", 6, LV_SVG_ATTR_ROTATE}, + {"type", 4, LV_SVG_ATTR_TRANSFORM_TYPE}, +#endif +}; + +static const struct _lv_svg_attr_aspect_ratio_map { + const char * name; + uint32_t align; +} _svg_attr_aspect_ratio_map[] = { + {"xMinYMin", LV_SVG_ASPECT_RATIO_XMIN_YMIN}, + {"xMidYMin", LV_SVG_ASPECT_RATIO_XMID_YMIN}, + {"xMaxYMin", LV_SVG_ASPECT_RATIO_XMAX_YMIN}, + {"xMinYMid", LV_SVG_ASPECT_RATIO_XMIN_YMID}, + {"xMidYMid", LV_SVG_ASPECT_RATIO_XMID_YMID}, + {"xMaxYMid", LV_SVG_ASPECT_RATIO_XMAX_YMID}, + {"xMinYMax", LV_SVG_ASPECT_RATIO_XMIN_YMAX}, + {"xMidYMax", LV_SVG_ASPECT_RATIO_XMID_YMAX}, + {"xMaxYMax", LV_SVG_ASPECT_RATIO_XMAX_YMAX}, +}; + +static const struct _lv_svg_color_map { + const char * name; + uint32_t name_len; + uint32_t color; +} _svg_color_map[] = { + {"aliceblue", 9, 0xf0f8ff}, + {"antiquewhite", 12, 0xfaebd7}, + {"aqua", 4, 0x00ffff}, + {"aquamarine", 10, 0x7fffd4}, + {"azure", 5, 0xf0ffff}, + {"beige", 5, 0xf5f5dc}, + {"bisque", 6, 0xffe4c4}, + {"black", 5, 0x000000}, + {"blanchedalmond", 14, 0xffebcd}, + {"blue", 4, 0x0000ff}, + {"blueviolet", 10, 0x8a2be2}, + {"brown", 5, 0xa52a2a}, + {"burlywood", 9, 0xdeb887}, + {"cadetblue", 9, 0x5f9ea0}, + {"chartreuse", 10, 0x7fff00}, + {"chocolate", 9, 0xd2691e}, + {"coral", 5, 0xff7f50}, + {"cornflowerblue", 14, 0x6495ed}, + {"cornsilk", 8, 0xfff8dc}, + {"crimson", 7, 0xdc143c}, + {"cyan", 4, 0x00ffff}, + {"darkblue", 8, 0x00008b}, + {"darkcyan", 8, 0x008b8b}, + {"darkgoldenrod", 13, 0xb8860b}, + {"darkgray", 8, 0xa9a9a9}, + {"darkgrey", 8, 0xa9a9a9}, + {"darkgreen", 9, 0x006400}, + {"darkkhaki", 9, 0xbdb76b}, + {"darkmagenta", 11, 0x8b008b}, + {"darkolivegreen", 14, 0x556b2f}, + {"darkorange", 10, 0xff8c00}, + {"darkorchid", 10, 0x9932cc}, + {"darkred", 7, 0x8b0000}, + {"darksalmon", 10, 0xe9967a}, + {"darkseagreen", 12, 0x8fbc8f}, + {"darkslateblue", 13, 0x483d8b}, + {"darkslategray", 13, 0x2f4f4f}, + {"darkslategrey", 13, 0x2f4f4f}, + {"darkturquoise", 13, 0x00ced1}, + {"darkviolet", 10, 0x9400d3}, + {"deeppink", 8, 0xff1493}, + {"deepskyblue", 11, 0x00bfff}, + {"dimgray", 7, 0x696969}, + {"dimgrey", 7, 0x696969}, + {"dodgerblue", 10, 0x1e90ff}, + {"firebrick", 9, 0xb22222}, + {"floralwhite", 11, 0xfffaf0}, + {"forestgreen", 11, 0x228b22}, + {"fuchsia", 7, 0xff00ff}, + {"gainsboro", 9, 0xdcdcdc}, + {"ghostwhite", 10, 0xf8f8ff}, + {"gold", 4, 0xffd700}, + {"goldenrod", 9, 0xdaa520}, + {"gray", 4, 0x808080}, + {"grey", 4, 0x808080}, + {"green", 5, 0x008000}, + {"greenyellow", 11, 0xadff2f}, + {"honeydew", 8, 0xf0fff0}, + {"hotpink", 7, 0xff69b4}, + {"indianred", 9, 0xcd5c5c}, + {"indigo", 6, 0x4b0082}, + {"ivory", 5, 0xfffff0}, + {"khaki", 5, 0xf0e68c}, + {"lavender", 8, 0xe6e6fa}, + {"lavenderblush", 13, 0xfff0f5}, + {"lawngreen", 9, 0x7cfc00}, + {"lemonchiffon", 12, 0xfffacd}, + {"lightblue", 9, 0xadd8e6}, + {"lightcoral", 10, 0xf08080}, + {"lightcyan", 9, 0xe0ffff}, + {"lightgoldenrodyellow", 20, 0xfafad2}, + {"lightgray", 9, 0xd3d3d3}, + {"lightgrey", 9, 0xd3d3d3}, + {"lightgreen", 10, 0x90ee90}, + {"lightpink", 9, 0xffb6c1}, + {"lightsalmon", 11, 0xffa07a}, + {"lightseagreen", 13, 0x20b2aa}, + {"lightskyblue", 12, 0x87cefa}, + {"lightslategray", 14, 0x778899}, + {"lightslategrey", 14, 0x778899}, + {"lightsteelblue", 14, 0xb0c4de}, + {"lightyellow", 11, 0xffffe0}, + {"lime", 4, 0x00ff00}, + {"limegreen", 9, 0x32cd32}, + {"linen", 5, 0xfaf0e6}, + {"magenta", 7, 0xff00ff}, + {"maroon", 6, 0x800000}, + {"mediumaquamarine", 16, 0x66cdaa}, + {"mediumblue", 10, 0x0000cd}, + {"mediumorchid", 12, 0xba55d3}, + {"mediumpurple", 12, 0x9370d8}, + {"mediumseagreen", 14, 0x3cb371}, + {"mediumslateblue", 15, 0x7b68ee}, + {"mediumspringgreen", 17, 0x00fa9a}, + {"mediumturquoise", 15, 0x48d1cc}, + {"mediumvioletred", 15, 0xc71585}, + {"midnightblue", 12, 0x191970}, + {"mintcream", 9, 0xf5fffa}, + {"mistyrose", 9, 0xffe4e1}, + {"moccasin", 8, 0xffe4b5}, + {"navajowhite", 11, 0xffdead}, + {"navy", 4, 0x000080}, + {"oldlace", 7, 0xfdf5e6}, + {"olive", 5, 0x808000}, + {"olivedrab", 9, 0x6b8e23}, + {"orange", 6, 0xffa500}, + {"orangered", 9, 0xff4500}, + {"orchid", 6, 0xda70d6}, + {"palegoldenrod", 13, 0xeee8aa}, + {"palegreen", 9, 0x98fb98}, + {"paleturquoise", 13, 0xafeeee}, + {"palevioletred", 13, 0xd87093}, + {"papayawhip", 10, 0xffefd5}, + {"peachpuff", 9, 0xffdab9}, + {"peru", 4, 0xcd853f}, + {"pink", 4, 0xffc0cb}, + {"plum", 4, 0xdda0dd}, + {"powderblue", 10, 0xb0e0e6}, + {"purple", 6, 0x800080}, + {"red", 3, 0xff0000}, + {"rosybrown", 9, 0xbc8f8f}, + {"royalblue", 9, 0x4169e1}, + {"saddlebrown", 11, 0x8b4513}, + {"salmon", 6, 0xfa8072}, + {"sandybrown", 10, 0xf4a460}, + {"seagreen", 8, 0x2e8b57}, + {"seashell", 8, 0xfff5ee}, + {"sienna", 6, 0xa0522d}, + {"silver", 6, 0xc0c0c0}, + {"skyblue", 7, 0x87ceeb}, + {"slateblue", 9, 0x6a5acd}, + {"slategray", 9, 0x708090}, + {"slategrey", 9, 0x708090}, + {"snow", 4, 0xfffafa}, + {"springgreen", 11, 0x00ff7f}, + {"steelblue", 9, 0x4682b4}, + {"tan", 3, 0xd2b48c}, + {"teal", 4, 0x008080}, + {"thistle", 7, 0xd8bfd8}, + {"tomato", 6, 0xff6347}, + {"turquoise", 9, 0x40e0d0}, + {"violet", 6, 0xee82ee}, + {"wheat", 5, 0xf5deb3}, + {"white", 5, 0xffffff}, + {"whitesmoke", 10, 0xf5f5f5}, + {"yellow", 6, 0xffff00}, + {"yellowgreen", 11, 0x9acd32}, +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_svg_tag_t _get_svg_tag_type(const _lv_svg_token_t * token) +{ + uint32_t len = MAP_LEN(_svg_tag_map); + uint32_t token_len = SVG_TOKEN_LEN(token); + + for(uint32_t i = 0; i < len; i++) { + if(token_len == _svg_tag_map[i].name_len && strncmp(_svg_tag_map[i].name, token->start, token_len) == 0) { + return _svg_tag_map[i].tag; + } + } + return LV_SVG_TAG_INVALID; +} + +static bool _process_end_tag(_lv_svg_parser_t * parser, lv_svg_tag_t tag, const _lv_svg_token_t * token) +{ + if(parser->state == LV_SVG_PARSER_IGNORE) { + uint32_t len = SVG_TOKEN_LEN(token); + if((parser->ignore_len == len) && strncmp(parser->ignore_name, token->start, len) == 0) { + parser->state = LV_SVG_PARSER_PROCESS; + lv_free(parser->ignore_name); + parser->ignore_name = NULL; + parser->ignore_len = 0; + } + return true; + } + + if(parser->cur_node->type != tag) { + LV_LOG_ERROR("svg tag does not match in pairs!"); + return false; + } + + if(parser->cur_node != parser->doc_root) { + parser->cur_node = (lv_svg_node_t *)LV_TREE_NODE(parser->cur_node)->parent; + } + return true; +} + +static lv_svg_attr_type_t _get_svg_attr_type(const char * attr_start, const char * attr_end) +{ + uint32_t len = MAP_LEN(_svg_attr_map); + uint32_t attr_len = attr_end - attr_start; + + for(uint32_t i = 0; i < len; i++) { + if(attr_len == _svg_attr_map[i].name_len && strncmp(_svg_attr_map[i].name, attr_start, attr_len) == 0) { + return _svg_attr_map[i].attr; + } + } + return LV_SVG_ATTR_INVALID; +} + +static void _process_string(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + char * str = lv_malloc(len + 1); + LV_ASSERT_MALLOC(str); + lv_memcpy(str, val_start, len); + str[len] = '\0'; + attr->value.sval = str; +} + +static void _process_xlink(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + if(*val_start == '#') { + val_start++; + } + + uint32_t len = val_end - val_start; + char * str = lv_malloc(len + 1); + LV_ASSERT_MALLOC(str); + lv_memcpy(str, val_start, len); + str[len] = '\0'; + attr->value.sval = str; +} + +static bool _is_number_begin(char ch) +{ + return ch != 0 && strchr("0123456789+-.", ch) != NULL; +} + +static const char * _next_semicolon(const char * str, const char * str_end) +{ + while((str < str_end) && *str != ';') { + ++str; + } + return str; +} + +static const char * _next_colon(const char * str, const char * str_end) +{ + while((str < str_end) && *str != ':') { + ++str; + } + return str; +} + +static const char * _skip_space(const char * str, const char * str_end) +{ + while((str < str_end) && isspace((unsigned char) * str)) { + ++str; + } + return str; +} + +static bool _is_separators(char c) +{ + return c == ',' || c == '\t' || c == '\n' || c == '\r'; +} + +static const char * _skip_space_and_separators(const char * str, const char * str_end) +{ + while((str < str_end) && (isspace((unsigned char) * str) || _is_separators(*str))) { + ++str; + } + return str; +} + +static const char * _parse_number(const char * str, const char * str_end, float * val) +{ + if(!str) { + return NULL; + } + // skip loading + while((str < str_end) && !_is_number_begin(*str)) { + ++str; + } + + if(str == str_end) { // parse fail + return NULL; + } + + char * end = NULL; + *val = strtof(str, &end); + return end; +} + +static const char * _parse_length(const char * str, const char * str_end, int32_t dpi, float * val) +{ + str = _parse_number(str, str_end, val); + if(str) { + uint32_t len = str_end - str; + if(len > 0) { + if(len == 1 && (*str == '%')) { + // percentage + *val *= 0.01f; + } + else if(len == 2) { + if(str[0] == 'p' && str[1] == 't') { // pt + *val = *val / 72.0f * (float)dpi; + } + else if(str[0] == 'p' && str[1] == 'c') { // pc + *val = *val / 6.0f * (float)dpi; + } + else if(str[0] == 'i' && str[1] == 'n') { // in + *val = *val * (float)dpi; + } + else if(str[0] == 'm' && str[1] == 'm') { // mm + *val = *val / 25.4f * (float)dpi; + } + else if(str[0] == 'c' && str[1] == 'm') { // cm + *val = *val / 2.54f * (float)dpi; + } + else if(str[0] == 'e' && str[1] == 'm') { // em + *val = *val * 16.0f; // FIXME: browser default font size + } + else if(str[0] == 'e' && str[1] == 'x') { // ex + *val = *val * 16.0f * 0.52f; + } + } + } + str += len; + } + return str; +} + +static const char * _parse_color(const char * str, const char * str_end, uint32_t * val) +{ + if(!str) { + return NULL; + } + + const char * ptr = str; + while((ptr < str_end) && (*ptr != ')')) { // calc letters end + ++ptr; + } + + uint32_t len = ptr - str; + uint32_t r = 0, g = 0, b = 0; + + if(*str == '#') { + if(len == 4) { // three digit hex format '#rgb' + if(isxdigit((unsigned char)str[1]) && isxdigit((unsigned char)str[2]) && isxdigit((unsigned char)str[3])) { + char st[3] = {0}; + st[0] = st[1] = str[1]; + r = (uint8_t)strtol(st, NULL, 16); + st[0] = st[1] = str[2]; + g = (uint8_t)strtol(st, NULL, 16); + st[0] = st[1] = str[3]; + b = (uint8_t)strtol(st, NULL, 16); + } + } + else if(len == 7) { // six digit hex format '#rrggbb' + if(isxdigit((unsigned char)str[1]) && isxdigit((unsigned char)str[2]) && isxdigit((unsigned char)str[3]) + && isxdigit((unsigned char)str[4]) && isxdigit((unsigned char)str[5]) && isxdigit((unsigned char)str[6])) { + char st[3] = {0}; + st[0] = str[1]; + st[1] = str[2]; + r = (uint8_t)strtol(st, NULL, 16); + st[0] = str[3]; + st[1] = str[4]; + g = (uint8_t)strtol(st, NULL, 16); + st[0] = str[5]; + st[1] = str[6]; + b = (uint8_t)strtol(st, NULL, 16); + } + } + // make color + *val = (r << 16) + (g << 8) + b; + } + else if(len > 5 && strncmp(str, "rgba(", 5) == 0) { + str += 5; + bool valid_color = true; + float vals[3] = {0}; + uint32_t alpha = 255; + + for(int i = 0; i < 3; i++) { + str = _parse_number(str, ptr, &vals[i]); + if(!str) valid_color = false; + + if(*str == '%') { + vals[i] *= 2.56f; + } + } + + float a = 0.0f; + str = _parse_number(str, ptr, &a); + if(str) { + if(*str == '%') { + a *= 2.56f; + } + else if(a >= 0.0f && a <= 1.0f) { + a *= 255.0f; + } + alpha = (uint8_t)a; + } + + if(valid_color) { + r = (uint8_t)vals[0]; + g = (uint8_t)vals[1]; + b = (uint8_t)vals[2]; + } + // make color + *val = (alpha << 24) + (r << 16) + (g << 8) + b; + } + else if(len > 4 && strncmp(str, "rgb(", 4) == 0) { + str += 4; + bool valid_color = true; + float vals[3] = {0}; + + for(int i = 0; i < 3; i++) { + str = _parse_number(str, ptr, &vals[i]); + if(!str) valid_color = false; + + if(*str == '%') { + vals[i] *= 2.56f; + } + } + + if(valid_color) { + r = (uint8_t)vals[0]; + g = (uint8_t)vals[1]; + b = (uint8_t)vals[2]; + } + // make color + *val = (r << 16) + (g << 8) + b; + } + else { // color keyword + uint32_t map_len = MAP_LEN(_svg_color_map); + for(uint32_t i = 0; i < map_len; i++) { + if(len == _svg_color_map[i].name_len && strncmp(_svg_color_map[i].name, str, len) == 0) { + *val = _svg_color_map[i].color; + } + } + } + return ++ptr; +} + +static void _multiply_matrix(lv_svg_matrix_t * matrix, const lv_svg_matrix_t * mul) +{ + // TODO: use NEON to optimize this function on ARM architecture. + lv_svg_matrix_t tmp; + + for(int y = 0; y < 3; y++) { + for(int x = 0; x < 3; x++) { + tmp.m[y][x] = (matrix->m[y][0] * mul->m[0][x]) + + (matrix->m[y][1] * mul->m[1][x]) + + (matrix->m[y][2] * mul->m[2][x]); + } + } + + lv_memcpy(matrix, &tmp, sizeof(lv_svg_matrix_t)); +} + +static const char * _parse_matrix(const char * str, const char * str_end, lv_svg_transform_type_t type, + lv_svg_matrix_t * matrix) +{ + // skip loading + while((str < str_end) && *str != '(') { + ++str; + } + + if(str == str_end) { // parse fail + return str; + } + + const char * ptr = str; + switch(type) { + case LV_SVG_TRANSFORM_TYPE_MATRIX: { + float vals[6] = {0}; + for(int i = 0; i < 6; i++) { + ptr = _parse_number(ptr, str_end, &vals[i]); + if(!ptr) return str; + str = ptr; + } + + lv_svg_matrix_t mt = {{ + {vals[0], vals[2], vals[4]}, + {vals[1], vals[3], vals[5]}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &mt); + } + break; + case LV_SVG_TRANSFORM_TYPE_TRANSLATE: { + float tx = 0.0f, ty = 0.0f; + ptr = _parse_number(ptr, str_end, &tx); + if(!ptr) return str; + str = ptr; + + ptr = _skip_space(ptr, str_end); + if(*ptr != ')') { + ptr = _parse_number(ptr, str_end, &ty); + if(ptr) str = ptr; + } + + lv_svg_matrix_t tlm = {{ + {1.0f, 0.0f, tx}, + {0.0f, 1.0f, ty}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &tlm); + } + break; + case LV_SVG_TRANSFORM_TYPE_ROTATE: { + float degree = 0.0f, cx = 0.0f, cy = 0.0f; + bool trans = false; + + ptr = _parse_number(ptr, str_end, °ree); + if(!ptr) return str; + str = ptr; + + ptr = _skip_space(ptr, str_end); + if(*ptr != ')') { + ptr = _parse_number(ptr, str_end, &cx); + ptr = _parse_number(ptr, str_end, &cy); + if(ptr) { + trans = true; + str = ptr; + } + } + + float radian = degree / 180.0f * (float)M_PI; + float cos_r = cosf(radian); + float sin_r = sinf(radian); + + lv_svg_matrix_t rtm = {{ + {cos_r, -sin_r, 0.0f}, + {sin_r, cos_r, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + if(!trans) { + _multiply_matrix(matrix, &rtm); + } + else { + lv_svg_matrix_t tlm = {{ + {1.0f, 0.0f, cx}, + {0.0f, 1.0f, cy}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &tlm); + _multiply_matrix(matrix, &rtm); + + tlm.m[0][2] = -cx; + tlm.m[1][2] = -cy; + _multiply_matrix(matrix, &tlm); + } + } + break; + case LV_SVG_TRANSFORM_TYPE_SCALE: { + float sx = 0.0f, sy = 0.0f; + ptr = _parse_number(ptr, str_end, &sx); + if(!ptr) return str; + str = ptr; + + sy = sx; + + ptr = _skip_space(ptr, str_end); + if(*ptr != ')') { + ptr = _parse_number(ptr, str_end, &sy); + if(ptr) str = ptr; + } + + lv_svg_matrix_t scm = {{ + {sx, 0.0f, 0.0f}, + {0.0f, sy, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &scm); + } + break; + case LV_SVG_TRANSFORM_TYPE_SKEW_X: { + float degree = 0.0f; + ptr = _parse_number(ptr, str_end, °ree); + if(!ptr) return str; + str = ptr; + + float radian = degree / 180.0f * (float)M_PI; + float tan = tanf(radian); + + lv_svg_matrix_t skm = {{ + {1.0f, tan, 0.0f}, + {0.0f, 1.0f, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &skm); + } + break; + case LV_SVG_TRANSFORM_TYPE_SKEW_Y: { + float degree = 0.0f; + ptr = _parse_number(ptr, str_end, °ree); + if(!ptr) return str; + str = ptr; + + float radian = degree / 180.0f * (float)M_PI; + float tan = tanf(radian); + + lv_svg_matrix_t skm = {{ + {1.0f, 0.0f, 0.0f}, + {tan, 1.0f, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + _multiply_matrix(matrix, &skm); + } + break; + } + return str; +} + +static void _process_view_box(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + if(len >= 4 && strncmp(val_start, "none", 4) == 0) { + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_NONE; + return; + } + + float * vals = lv_malloc_zeroed(sizeof(float) * 4); + LV_ASSERT_MALLOC(vals); + const char * ptr = val_start; + for(int i = 0; i < 4; i++) { + ptr = _parse_number(ptr, val_end, &vals[i]); + if(!ptr) { + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_NONE; + lv_free(vals); + return; + } + } + attr->value.val = vals; +} + +static void _process_points_value(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t list_cap = 4; + lv_svg_attr_values_list_t * list = lv_malloc(sizeof(lv_svg_point_t) * list_cap + sizeof(uint32_t)); + LV_ASSERT_MALLOC(list); + + float val_number = 0.0f; + const char * ptr = val_start; + uint32_t point_cnt = 0; + + while(ptr < val_end) { + if(point_cnt == list_cap) { + list_cap = list_cap << 1; + list = (lv_svg_attr_values_list_t *)lv_realloc(list, sizeof(lv_svg_point_t) * list_cap + sizeof(uint32_t)); + LV_ASSERT_MALLOC(list); + } + lv_svg_point_t * pt = (lv_svg_point_t *)(&list->data) + point_cnt; + val_number = 0.0f; + ptr = _parse_number(ptr, val_end, &val_number); + pt->x = val_number; + val_number = 0.0f; + ptr = _parse_number(ptr, val_end, &val_number); + pt->y = val_number; + if(!ptr) break; + ++point_cnt; + } + + list->length = point_cnt; + attr->value.val = list; +} + +static int _get_path_point_count(char cmd) +{ + switch(cmd) { + case 'M': + case 'm': + case 'L': + case 'l': + case 'H': + case 'h': + case 'V': + case 'v': + case 'Z': + case 'z': + return 1; + case 'C': + case 'c': + case 'S': + case 's': + return 3; + case 'Q': + case 'q': + case 'T': + case 't': + return 2; + case 'A': + case 'a': + return 4; + default: + return 0; + } +} + +static bool _is_relative_cmd(char cmd) +{ + switch(cmd) { + case 'a': + case 'm': + case 'l': + case 'h': + case 'v': + case 'c': + case 's': + case 'q': + case 't': + case 'z': + return true; + case 'A': + case 'M': + case 'L': + case 'H': + case 'V': + case 'C': + case 'S': + case 'Q': + case 'T': + case 'Z': + default: + return false; + } +} + +static bool _is_path_cmd(char ch) +{ + return ch != 0 && strchr("AMLHVCSQTZamlhvcsqtz", ch) != NULL; +} + +static void _process_path_value(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t list_cap = 4; + uint32_t list_size = sizeof(lv_svg_point_t) * list_cap + sizeof(uint32_t) * list_cap + sizeof(uint32_t); + lv_svg_attr_values_list_t * list = lv_malloc(list_size); + LV_ASSERT_MALLOC(list); + + uint32_t cmd_cnt = 0; + uint32_t cur_size = 0; + char cur_cmd = 0; + lv_svg_point_t cur_point = {0, 0}; + lv_svg_point_t cur_ctrlPoint = {0, 0}; + lv_svg_point_t first_point = {0, 0}; + + const char * ptr = val_start; + uint8_t * data_ptr = (uint8_t *)(&list->data); + + while(ptr < val_end) { + ptr = _skip_space_and_separators(ptr, val_end); + if(ptr == val_end) break; + + char ch = *ptr; + if(_is_number_begin(ch)) { + if(cur_cmd != 0) { + if(cur_cmd == 'M') { + ch = 'L'; + } + else if(cur_cmd == 'm') { + ch = 'l'; + } + else { + ch = cur_cmd; + } + } + else { + break; + } + } + else if(_is_path_cmd(ch)) { + ++ptr; + } + else { + LV_LOG_ERROR("Unsupport path command [%c]", ch); + break; + } + + int point_count = _get_path_point_count(ch); + uint32_t mem_inc = sizeof(lv_svg_point_t) * point_count + sizeof(uint32_t); + + if((cur_size + mem_inc) > (list_size - sizeof(uint32_t))) { + list_cap = list_cap << 1; + list_size = sizeof(lv_svg_point_t) * list_cap + sizeof(uint32_t) * list_cap + sizeof(uint32_t); + list = (lv_svg_attr_values_list_t *)lv_realloc(list, list_size); + LV_ASSERT_MALLOC(list); + } + + data_ptr = (uint8_t *)(&list->data) + cur_size; + lv_svg_attr_path_value_t * path_seg = (lv_svg_attr_path_value_t *)data_ptr; + + bool relative = _is_relative_cmd(ch); + + switch(ch) { + case 'm': + case 'M': { + lv_svg_point_t * point = (lv_svg_point_t *)(&path_seg->data); + float xval = 0.0f; + ptr = _parse_number(ptr, val_end, &xval); + float yval = 0.0f; + ptr = _parse_number(ptr, val_end, &yval); + if(relative) { + xval += cur_point.x; + yval += cur_point.y; + } + path_seg->cmd = LV_SVG_PATH_CMD_MOVE_TO; + point->x = xval; + point->y = yval; + cur_point.x = xval; + cur_point.y = yval; + first_point.x = xval; + first_point.y = yval; + } + break; + case 'L': + case 'l': { + lv_svg_point_t * point = (lv_svg_point_t *)(&path_seg->data); + float xval = 0.0f; + ptr = _parse_number(ptr, val_end, &xval); + float yval = 0.0f; + ptr = _parse_number(ptr, val_end, &yval); + if(relative) { + xval += cur_point.x; + yval += cur_point.y; + } + path_seg->cmd = LV_SVG_PATH_CMD_LINE_TO; + point->x = xval; + point->y = yval; + cur_point.x = xval; + cur_point.y = yval; + } + break; + case 'H': + case 'h': { + lv_svg_point_t * point = (lv_svg_point_t *)(&path_seg->data); + float xval = 0.0f; + ptr = _parse_number(ptr, val_end, &xval); + if(relative) { + xval += cur_point.x; + } + path_seg->cmd = LV_SVG_PATH_CMD_LINE_TO; + point->x = xval; + point->y = cur_point.y; + cur_point.x = xval; + } + break; + case 'V': + case 'v': { + lv_svg_point_t * point = (lv_svg_point_t *)(&path_seg->data); + float yval = 0.0f; + ptr = _parse_number(ptr, val_end, &yval); + if(relative) { + yval += cur_point.y; + } + path_seg->cmd = LV_SVG_PATH_CMD_LINE_TO; + point->x = cur_point.x; + point->y = yval; + cur_point.y = yval; + } + break; + case 'C': + case 'c': { + lv_svg_point_t * point = (lv_svg_point_t *)(&path_seg->data); + for(int i = 0; i < 3; i++) { + float xval = 0.0f; + ptr = _parse_number(ptr, val_end, &xval); + float yval = 0.0f; + ptr = _parse_number(ptr, val_end, &yval); + if(relative) { + xval += cur_point.x; + yval += cur_point.y; + } + path_seg->cmd = LV_SVG_PATH_CMD_CURVE_TO; + point[i].x = xval; + point[i].y = yval; + } + + cur_ctrlPoint.x = point[1].x; + cur_ctrlPoint.y = point[1].y; + cur_point.x = point[2].x; + cur_point.y = point[2].y; + } + break; + case 'S': + case 's': { + lv_svg_point_t * point = (lv_svg_point_t *)(&path_seg->data); + + if(cur_cmd == 'C' || cur_cmd == 'c' || cur_cmd == 'S' || cur_cmd == 's') { + point[0].x = cur_point.x * 2 - cur_ctrlPoint.x; + point[0].y = cur_point.y * 2 - cur_ctrlPoint.y; + } + else { + point[0].x = cur_point.x; + point[0].y = cur_point.y; + } + + for(int i = 1; i < 3; i++) { + float xval = 0.0f; + ptr = _parse_number(ptr, val_end, &xval); + float yval = 0.0f; + ptr = _parse_number(ptr, val_end, &yval); + if(relative) { + xval += cur_point.x; + yval += cur_point.y; + } + path_seg->cmd = LV_SVG_PATH_CMD_CURVE_TO; + point[i].x = xval; + point[i].y = yval; + } + + cur_ctrlPoint.x = point[1].x; + cur_ctrlPoint.y = point[1].y; + cur_point.x = point[2].x; + cur_point.y = point[2].y; + } + break; + case 'Q': + case 'q': { + lv_svg_point_t * point = (lv_svg_point_t *)(&path_seg->data); + for(int i = 0; i < 2; i++) { + float xval = 0.0f; + ptr = _parse_number(ptr, val_end, &xval); + float yval = 0.0f; + ptr = _parse_number(ptr, val_end, &yval); + if(relative) { + xval += cur_point.x; + yval += cur_point.y; + } + path_seg->cmd = LV_SVG_PATH_CMD_QUAD_TO; + point[i].x = xval; + point[i].y = yval; + } + + cur_ctrlPoint.x = point[0].x; + cur_ctrlPoint.y = point[0].y; + cur_point.x = point[1].x; + cur_point.y = point[1].y; + } + break; + case 'T': + case 't': { + lv_svg_point_t * point = (lv_svg_point_t *)(&path_seg->data); + if(cur_cmd == 'Q' || cur_cmd == 'q' || cur_cmd == 'T' || cur_cmd == 't') { + point[0].x = cur_point.x * 2 - cur_ctrlPoint.x; + point[0].y = cur_point.y * 2 - cur_ctrlPoint.y; + } + else { + point[0].x = cur_point.x; + point[0].y = cur_point.y; + } + + for(int i = 1; i < 2; i++) { + float xval = 0.0f; + ptr = _parse_number(ptr, val_end, &xval); + float yval = 0.0f; + ptr = _parse_number(ptr, val_end, &yval); + if(relative) { + xval += cur_point.x; + yval += cur_point.y; + } + path_seg->cmd = LV_SVG_PATH_CMD_QUAD_TO; + point[i].x = xval; + point[i].y = yval; + } + + cur_ctrlPoint.x = point[0].x; + cur_ctrlPoint.y = point[0].y; + cur_point.x = point[1].x; + cur_point.y = point[1].y; + } + break; + case 'A': + case 'a': { + lv_svg_point_t * point = (lv_svg_point_t *)(&path_seg->data); + float rx = 0.0f; + ptr = _parse_number(ptr, val_end, &rx); + float ry = 0.0f; + ptr = _parse_number(ptr, val_end, &ry); + float rotate = 0.0f; + ptr = _parse_number(ptr, val_end, &rotate); + float large_arc = 0.0f; + ptr = _parse_number(ptr, val_end, &large_arc); + float sweep = 0.0f; + ptr = _parse_number(ptr, val_end, &sweep); + + float xval = 0.0f; + ptr = _parse_number(ptr, val_end, &xval); + float yval = 0.0f; + ptr = _parse_number(ptr, val_end, &yval); + if(relative) { + xval += cur_point.x; + yval += cur_point.y; + } + + path_seg->cmd = LV_SVG_PATH_CMD_ARC_TO; + point[0].x = rx; + point[0].y = ry; + point[1].x = rotate; + point[1].y = 0.0f; + point[2].x = large_arc; + point[2].y = sweep; + point[3].x = xval; + point[3].y = yval; + + cur_point.x = xval; + cur_point.y = yval; + } + break; + case 'Z': + case 'z': { + path_seg->cmd = LV_SVG_PATH_CMD_CLOSE; + cur_point.x = first_point.x; + cur_point.y = first_point.y; + } + break; + } + + if(!ptr) break; + cur_size += mem_inc; + cur_cmd = ch; + ++cmd_cnt; + } + + list->length = cmd_cnt; + attr->value.val = list; +} + +static void _process_gradient_units(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + int32_t val = 0; + + if(len == 14 && strncmp(val_start, "userSpaceOnUse", 14) == 0) { + val = LV_SVG_GRADIENT_UNITS_USER_SPACE; + } + else { + val = LV_SVG_GRADIENT_UNITS_OBJECT; + } + attr->value.ival = val; +} + +static void _process_paint_dasharray(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + + if(len >= 4 && strncmp(val_start, "none", 4) == 0) { + attr->class_type = LV_SVG_ATTR_VALUE_NONE; + return; + } + else if(len >= 7 && strncmp(val_start, "inherit", 7) == 0) { + attr->class_type = LV_SVG_ATTR_VALUE_INHERIT; + return; + } + else { + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + + uint32_t list_cap = 4; + lv_svg_attr_values_list_t * list = lv_malloc(sizeof(float) * list_cap + sizeof(uint32_t)); + LV_ASSERT_MALLOC(list); + + uint32_t count = 0; + const char * ptr = val_start; + + while(ptr < val_end) { + if(count == list_cap) { + list_cap = list_cap << 1; + list = lv_realloc(list, sizeof(float) * list_cap + sizeof(uint32_t)); + LV_ASSERT_MALLOC(list); + } + float * val = (float *)(&list->data) + count; + ptr = _parse_number(ptr, val_end, val); + if(!ptr) break; + ++count; + } + + list->length = count; + attr->value.val = list; + } +} + +static void _process_font_attrs(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end, int32_t dpi) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + + if(len >= 7 && strncmp(val_start, "inherit", 7) == 0) { + attr->class_type = LV_SVG_ATTR_VALUE_INHERIT; + return; + } + + if(type == LV_SVG_ATTR_FONT_SIZE && _is_number_begin(*val_start)) { + float val_number = 0.0f; + val_start = _parse_length(val_start, val_end, dpi, &val_number); + attr->value.fval = val_number; + } + else { + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + + char * str = lv_malloc(len + 1); + LV_ASSERT_MALLOC(str); + lv_memcpy(str, val_start, len); + str[len] = '\0'; + attr->value.sval = str; + } +} + +static void _process_paint_attrs(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + + if(len >= 7 && strncmp(val_start, "inherit", 7) == 0) { + attr->class_type = LV_SVG_ATTR_VALUE_INHERIT; + return; + } + + if(type == LV_SVG_ATTR_FILL_RULE) { + int32_t val = 0; + if(strncmp(val_start, "evenodd", 7) == 0) { + val = LV_SVG_FILL_EVENODD; + } + else { + val = LV_SVG_FILL_NONZERO; + } + attr->value.ival = val; + } + else if(type == LV_SVG_ATTR_STROKE_LINECAP) { + int32_t val = 0; + if(strncmp(val_start, "round", 5) == 0) { + val = LV_SVG_LINE_CAP_ROUND; + } + else if(strncmp(val_start, "square", 6) == 0) { + val = LV_SVG_LINE_CAP_SQUARE; + } + else { + val = LV_SVG_LINE_CAP_BUTT; + } + attr->value.ival = val; + } + else if(type == LV_SVG_ATTR_STROKE_LINEJOIN) { + int32_t val = 0; + if(strncmp(val_start, "round", 5) == 0) { + val = LV_SVG_LINE_JOIN_ROUND; + } + else if(strncmp(val_start, "bevel", 5) == 0) { + val = LV_SVG_LINE_JOIN_BEVEL; + } + else { + val = LV_SVG_LINE_JOIN_MITER; + } + attr->value.ival = val; + } + else if(type == LV_SVG_ATTR_STROKE_WIDTH) { + float val = 1.0f; + val_start = _parse_number(val_start, val_end, &val); + if(val < 0.0f) { + val = 0.0f; + } + attr->value.fval = val; + } + else if(type == LV_SVG_ATTR_STROKE_MITER_LIMIT) { + float val = 4.0f; + val_start = _parse_number(val_start, val_end, &val); + if(val < 1.0f) { + val = 1.0f; + } + attr->value.ival = (int32_t)val; + } + else if(type == LV_SVG_ATTR_STROKE_DASH_OFFSET) { + float val = 0.0f; + val_start = _parse_number(val_start, val_end, &val); + attr->value.fval = val; + } + else if(type == LV_SVG_ATTR_GRADIENT_STOP_OFFSET) { + float val = 0.0f; + val_start = _parse_number(val_start, val_end, &val); + attr->value.fval = val; + } +} + +static void _process_paint(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + if(len >= 4 && strncmp(val_start, "none", 4) == 0) { + attr->class_type = LV_SVG_ATTR_VALUE_NONE; + return; + } + else if(len >= 7 && strncmp(val_start, "inherit", 7) == 0) { + attr->class_type = LV_SVG_ATTR_VALUE_INHERIT; + return; + } + else if(len > 4 && strncmp(val_start, "url(", 4) == 0) { + // parse url + const char * ptr = val_start + 4; + const char * url_start = NULL; + const char * url_end = NULL; + + ptr = _skip_space(ptr, val_end); + if(ptr == val_end) { + attr->class_type = LV_SVG_ATTR_VALUE_NONE; + return; + } + + if(*ptr == '#') { + url_start = ptr + 1; + } + + while((ptr < val_end) && !isspace((unsigned char) * ptr) && *ptr != ')') { + ++ptr; + } + + url_end = ptr; + if(url_start && url_end) { + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + len = url_end - url_start; + char * node_id = lv_malloc(len + 1); + LV_ASSERT_MALLOC(node_id); + lv_memcpy(node_id, url_start, len); + node_id[len] = '\0'; + attr->value.sval = node_id; + } + return; + } + else { +#if LV_USE_SVG_ANIMATION + if(len == 6) { + if(strncmp(val_start, "freeze", 6) == 0) { + attr->value.ival = LV_SVG_ANIM_FREEZE; + return; + } + else if(strncmp(val_start, "remove", 6) == 0) { + attr->value.ival = LV_SVG_ANIM_REMOVE; + return; + } + } +#endif + // parse color + uint32_t color = 0; + _parse_color(val_start, val_end, &color); + attr->value.uval = color; + return; + } +} + +static void _process_opacity_value(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + + if(len >= 7 && strncmp(val_start, "inherit", 7) == 0) { + attr->class_type = LV_SVG_ATTR_VALUE_INHERIT; + return; + } + + float val_number = 1.0f; + val_start = _parse_number(val_start, val_end, &val_number); + + if(val_number < 0.0f) val_number = 0.0f; + else if(val_number > 1.0f) val_number = 1.0f; + + attr->value.fval = val_number; +} + +static void _process_length_value(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end, int32_t dpi) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + float val_number = 0.0f; + val_start = _parse_length(val_start, val_end, dpi, &val_number); + attr->value.fval = val_number; +} + +static void _process_transform(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + if(len >= 4 && strncmp(val_start, "none", 4) == 0) { + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_NONE; + return; + } + + lv_svg_matrix_t * matrix = lv_malloc_zeroed(sizeof(lv_svg_matrix_t)); + LV_ASSERT_MALLOC(matrix); + matrix->m[0][0] = matrix->m[1][1] = matrix->m[2][2] = 1.0f; // identity + + const char * ptr = val_start; + while(ptr < val_end) { + ptr = _skip_space(ptr, val_end); + if(ptr == val_end) break; + + len = val_end - ptr; + + if(len >= 9 && strncmp(ptr, "translate", 9) == 0) { + ptr = _parse_matrix(ptr, val_end, LV_SVG_TRANSFORM_TYPE_TRANSLATE, matrix); + } + else if(len >= 6 && strncmp(ptr, "matrix", 6) == 0) { + ptr = _parse_matrix(ptr, val_end, LV_SVG_TRANSFORM_TYPE_MATRIX, matrix); + } + else if(len >= 6 && strncmp(ptr, "rotate", 6) == 0) { + ptr = _parse_matrix(ptr, val_end, LV_SVG_TRANSFORM_TYPE_ROTATE, matrix); + } + else if(len >= 5 && strncmp(ptr, "scale", 5) == 0) { + ptr = _parse_matrix(ptr, val_end, LV_SVG_TRANSFORM_TYPE_SCALE, matrix); + } + else if(len >= 5 && strncmp(ptr, "skewX", 5) == 0) { + ptr = _parse_matrix(ptr, val_end, LV_SVG_TRANSFORM_TYPE_SKEW_X, matrix); + } + else if(len >= 5 && strncmp(ptr, "skewY", 5) == 0) { + ptr = _parse_matrix(ptr, val_end, LV_SVG_TRANSFORM_TYPE_SKEW_Y, matrix); + } + + ++ptr; + } + attr->value.val = matrix; +} + +static void _process_preserve_aspect_ratio(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + lv_svg_aspect_ratio_t ratio = LV_SVG_ASPECT_RATIO_XMID_YMID; + uint32_t len = MAP_LEN(_svg_attr_aspect_ratio_map); + + for(uint32_t i = 0; i < len; i++) { + if(strncmp(_svg_attr_aspect_ratio_map[i].name, val_start, 8) == 0) { + ratio = _svg_attr_aspect_ratio_map[i].align; + val_start += 8; + break; + } + else if(strncmp("none", val_start, 4) == 0) { + ratio = LV_SVG_ASPECT_RATIO_NONE; + val_start += 4; + break; + } + } + + if(ratio != LV_SVG_ASPECT_RATIO_NONE) { + len = val_end - val_start; + if(len > 4) { + val_start = _skip_space(val_start, val_end); + if(strncmp(val_start, "meet", 4) == 0) { + ratio |= LV_SVG_ASPECT_RATIO_OPT_MEET; + } + else if(strncmp(val_start, "slice", 5) == 0) { + ratio |= LV_SVG_ASPECT_RATIO_OPT_SLICE; + } + } + } + attr->value.uval = ratio; +} + +#if LV_USE_SVG_ANIMATION +typedef void(*_parse_list_cb)(lv_svg_node_t * node, lv_svg_attr_t * attr, const char * val_start, const char * val_end, + int32_t dpi, void * data); + +static uint32_t _parse_anim_value_list(lv_svg_node_t * node, lv_svg_attr_t * attr, const char * val_start, + const char * val_end, int32_t dpi, _parse_list_cb cb, void * data) +{ + uint32_t count = 0; + val_start = _skip_space(val_start, val_end); + const char * ptr = val_start; + + while(ptr != val_end) { + if(*ptr == ';') { + cb(node, attr, val_start, ptr, dpi, data); + val_start = ++ptr; + val_start = _skip_space(val_start, val_end); + count++; + } + else { + ++ptr; + } + } + if(val_start < val_end) { + cb(node, attr, val_start, ptr, dpi, data); + count++; + } + return count; +} + +static const char * _parse_clock_time(const char * str, const char * str_end, float * val) +{ + str = _parse_number(str, str_end, val); + if(str) { + uint32_t len = str_end - str; + if(len > 0) { + if(len >= 2 && str[0] == 'm' && str[1] == 's') { + *val = roundf(*val); + } + else { + *val = roundf(*val * 1000.0f); + } + } + else { + *val = roundf(*val * 1000.0f); + } + str += len; + return str; + } + *val = roundf(*val * 1000.0f); + return str; +} + +static void _process_clock_time(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + if(len == 10 && strncmp(val_start, "indefinite", 10) == 0) { + attr->value.fval = 0.0f; + return; + } + + float val_number = 0.0f; + val_start = _parse_clock_time(val_start, val_end, &val_number); + attr->value.fval = val_number; // ms +} + +static void _process_anim_attr_number(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + if(type == LV_SVG_ATTR_REPEAT_COUNT) { + uint32_t len = val_end - val_start; + if(len == 10 && strncmp(val_start, "indefinite", 10) == 0) { + attr->value.uval = 0; + return; + } + + float val_number = 0.0f; + val_start = _parse_number(val_start, val_end, &val_number); + attr->value.uval = (uint32_t)val_number; + } + else { // LV_SVG_ATTR_ROTATE + uint32_t len = val_end - val_start; + if(len == 4 && strncmp(val_start, "auto", 4) == 0) { + attr->class_type = + LV_SVG_ATTR_VALUE_INHERIT; // rotated over time by the angle of the direction (i.e., directional tangent vector) of the motion path + attr->value.fval = 0.0f; + return; + } + else if(len == 12 && strncmp(val_start, "auto-reverse", 12) == 0) { + attr->class_type = + LV_SVG_ATTR_VALUE_INHERIT; // rotated over time by the angle of the direction (i.e., directional tangent vector) of the motion path plus 180 degrees. + attr->value.fval = 180.0f; + return; + } + + float val_number = 0.0f; + val_start = _parse_number(val_start, val_end, &val_number); + attr->value.fval = val_number; + } +} + +static void _process_anim_attr_names(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + attr->value.ival = _get_svg_attr_type(val_start, val_end); +} + +static void _process_anim_attr_options(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + uint32_t len = val_end - val_start; + switch(type) { + case LV_SVG_ATTR_RESTART: { + if(len == 6 && strncmp(val_start, "always", 6) == 0) { + attr->value.ival = LV_SVG_ANIM_RESTART_ALWAYS; + return; + } + else if(len == 13 && strncmp(val_start, "whenNotActive", 13) == 0) { + attr->value.ival = LV_SVG_ANIM_RESTART_WHEN_NOT_ACTIVE; + return; + } + else if(len == 5 && strncmp(val_start, "never", 5) == 0) { + attr->value.ival = LV_SVG_ANIM_RESTART_NEVER; + return; + } + } + break; + case LV_SVG_ATTR_CALC_MODE: { + if(len == 6 && strncmp(val_start, "linear", 6) == 0) { + attr->value.ival = LV_SVG_ANIM_CALC_MODE_LINEAR; + return; + } + else if(len == 5 && strncmp(val_start, "paced", 5) == 0) { + attr->value.ival = LV_SVG_ANIM_CALC_MODE_PACED; + return; + } + else if(len == 6 && strncmp(val_start, "spline", 6) == 0) { + attr->value.ival = LV_SVG_ANIM_CALC_MODE_SPLINE; + return; + } + else if(len == 8 && strncmp(val_start, "discrete", 8) == 0) { + attr->value.ival = LV_SVG_ANIM_CALC_MODE_DISCRETE; + return; + } + } + break; + case LV_SVG_ATTR_ADDITIVE: { + if(len == 7 && strncmp(val_start, "replace", 7) == 0) { + attr->value.ival = LV_SVG_ANIM_ADDITIVE_REPLACE; + return; + } + else if(len == 3 && strncmp(val_start, "sum", 3) == 0) { + attr->value.ival = LV_SVG_ANIM_ADDITIVE_SUM; + return; + } + } + break; + case LV_SVG_ATTR_ACCUMULATE: { + if(len == 4 && strncmp(val_start, "none", 4) == 0) { + attr->value.ival = LV_SVG_ANIM_ACCUMULATE_NONE; + return; + } + else if(len == 3 && strncmp(val_start, "sum", 3) == 0) { + attr->value.ival = LV_SVG_ANIM_ACCUMULATE_SUM; + return; + } + } + break; + case LV_SVG_ATTR_TRANSFORM_TYPE: { + if(len == 9 && strncmp(val_start, "translate", 9) == 0) { + attr->value.ival = LV_SVG_TRANSFORM_TYPE_TRANSLATE; + return; + } + else if(len == 5 && strncmp(val_start, "scale", 5) == 0) { + attr->value.ival = LV_SVG_TRANSFORM_TYPE_SCALE; + return; + } + else if(len == 6 && strncmp(val_start, "rotate", 6) == 0) { + attr->value.ival = LV_SVG_TRANSFORM_TYPE_ROTATE; + return; + } + else if(len == 5 && strncmp(val_start, "skewX", 5) == 0) { + attr->value.ival = LV_SVG_TRANSFORM_TYPE_SKEW_X; + return; + } + else if(len == 5 && strncmp(val_start, "skewY", 5) == 0) { + attr->value.ival = LV_SVG_TRANSFORM_TYPE_SKEW_Y; + return; + } + } + break; + } + attr->value.ival = 0; +} + +static void _parse_anim_value(lv_svg_node_t * node, lv_svg_attr_t * attr, const char * val_start, const char * val_end, + int32_t dpi) +{ + if(node->type == LV_SVG_TAG_ANIMATE || node->type == LV_SVG_TAG_SET) { + float val_number = 0.0f; + val_start = _parse_length(val_start, val_end, dpi, &val_number); + attr->value.fval = val_number; + } + else if(node->type == LV_SVG_TAG_ANIMATE_COLOR) { + uint32_t color = 0; + val_start = _parse_color(val_start, val_end, &color); + attr->value.uval = color; + } + else if(node->type == LV_SVG_TAG_ANIMATE_TRANSFORM) { + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + lv_svg_attr_values_list_t * list = lv_malloc(sizeof(float) * 4 + sizeof(uint32_t)); + LV_ASSERT_MALLOC(list); + + float val_number = 0.0f; + uint32_t cnt = 0; + const char * ptr = val_start; + + while((ptr < val_end) && (cnt < 3)) { + float * val = (float *)(&list->data) + cnt; + + val_number = 0.0f; + ptr = _parse_number(ptr, val_end, &val_number); + *val = val_number; + + if(!ptr) break; + ++cnt; + } + + list->length = cnt; + attr->value.val = list; + } + else if(node->type == LV_SVG_TAG_ANIMATE_MOTION) { + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + lv_svg_attr_values_list_t * list = lv_malloc(sizeof(lv_svg_point_t) + sizeof(uint32_t)); + LV_ASSERT_MALLOC(list); + + lv_svg_point_t * pt = (lv_svg_point_t *)(&list->data); + + float val_number = 0.0f; + val_start = _parse_number(val_start, val_end, &val_number); + pt->x = val_number; + val_number = 0.0f; + val_start = _parse_number(val_start, val_end, &val_number); + pt->y = val_number; + + list->length = 1; + attr->value.val = list; + } +} + +struct _parse_value_list_context { + uint32_t mem_size; + uint32_t list_count; + lv_svg_attr_values_list_t * list; +}; + +struct _transform_values_list { + uint32_t length; + float data[4]; +}; + +#define GET_NEXT_VALUE_PTR(ptr, ctx, type) \ + do { \ + lv_svg_attr_values_list_t * list = ctx->list; \ + if(!list) { \ + ctx->mem_size = sizeof(type) * 4 + sizeof(uint32_t);\ + ctx->list = lv_malloc_zeroed(ctx->mem_size); \ + LV_ASSERT_MALLOC(ctx->list); \ + ptr = (type *)(&(ctx->list->data)); \ + ctx->list_count = 1; \ + } else { \ + uint32_t mem = sizeof(type) * (ctx->list_count + 1) + sizeof(uint32_t); \ + if(ctx->mem_size < mem) { \ + ctx->mem_size = (ctx->list_count << 1) * sizeof(type) + sizeof(uint32_t); \ + ctx->list = (lv_svg_attr_values_list_t *)lv_realloc(ctx->list, ctx->mem_size); \ + LV_ASSERT_MALLOC(ctx->list); \ + } \ + ptr = (type *)(&(ctx->list->data)) + ctx->list_count; \ + ctx->list_count++; \ + } \ + } while(0) + +static void _anim_values_cb(lv_svg_node_t * node, lv_svg_attr_t * attr, const char * val_start, const char * val_end, + int32_t dpi, void * data) +{ + LV_UNUSED(attr); + struct _parse_value_list_context * ctx = (struct _parse_value_list_context *)data; + + if(node->type == LV_SVG_TAG_ANIMATE || node->type == LV_SVG_TAG_SET) { + float * val_number = NULL; + GET_NEXT_VALUE_PTR(val_number, ctx, float); + val_start = _parse_length(val_start, val_end, dpi, val_number); + } + else if(node->type == LV_SVG_TAG_ANIMATE_COLOR) { + uint32_t * color = NULL; + GET_NEXT_VALUE_PTR(color, ctx, uint32_t); + val_start = _parse_color(val_start, val_end, color); + } + else if(node->type == LV_SVG_TAG_ANIMATE_TRANSFORM) { + struct _transform_values_list * trans_vals = NULL; + GET_NEXT_VALUE_PTR(trans_vals, ctx, struct _transform_values_list); + + uint32_t cnt = 0; + const char * ptr = val_start; + + while((ptr < val_end) && (cnt < 3)) { + float * val = &(trans_vals->data[cnt]); + ptr = _parse_number(ptr, val_end, val); + if(!ptr) break; + ++cnt; + } + + trans_vals->length = cnt; + } + else if(node->type == LV_SVG_TAG_ANIMATE_MOTION) { + lv_svg_point_t * point = NULL; + GET_NEXT_VALUE_PTR(point, ctx, lv_svg_point_t); + val_start = _parse_number(val_start, val_end, &point->x); + val_start = _parse_number(val_start, val_end, &point->y); + } + ctx->list->length = ctx->list_count; +} + +static void _anim_keys_cb(lv_svg_node_t * node, lv_svg_attr_t * attr, const char * val_start, const char * val_end, + int32_t dpi, void * data) +{ + LV_UNUSED(node); + LV_UNUSED(attr); + LV_UNUSED(dpi); + struct _parse_value_list_context * ctx = (struct _parse_value_list_context *)data; + + float * val_number = NULL; + GET_NEXT_VALUE_PTR(val_number, ctx, float); + val_start = _parse_number(val_start, val_end, val_number); + + ctx->list->length = ctx->list_count; +} + +static void _anim_key_splines_cb(lv_svg_node_t * node, lv_svg_attr_t * attr, const char * val_start, + const char * val_end, int32_t dpi, void * data) +{ + LV_UNUSED(node); + LV_UNUSED(attr); + LV_UNUSED(dpi); + struct _parse_value_list_context * ctx = (struct _parse_value_list_context *)data; + + lv_svg_point_t * point = NULL; + GET_NEXT_VALUE_PTR(point, ctx, lv_svg_point_t); + val_start = _parse_number(val_start, val_end, &point->x); + val_start = _parse_number(val_start, val_end, &point->y); + + GET_NEXT_VALUE_PTR(point, ctx, lv_svg_point_t); + val_start = _parse_number(val_start, val_end, &point->x); + val_start = _parse_number(val_start, val_end, &point->y); + + ctx->list->length = ctx->list_count; +} + +static void _anim_begin_end_cb(lv_svg_node_t * node, lv_svg_attr_t * attr, const char * val_start, + const char * val_end, int32_t dpi, void * data) +{ + LV_UNUSED(node); + LV_UNUSED(attr); + LV_UNUSED(dpi); + struct _parse_value_list_context * ctx = (struct _parse_value_list_context *)data; + + // offset-value + float * val_number = NULL; + GET_NEXT_VALUE_PTR(val_number, ctx, float); + val_start = _parse_clock_time(val_start, val_end, val_number); + + //FIXME: not support begin-end type + // syncbase-value + // event-value + // repeat-value + // accessKey-value + // indefinite + + ctx->list->length = ctx->list_count; +} + +static void _process_anim_attr_values(lv_svg_node_t * node, lv_svg_attr_type_t type, const char * val_start, + const char * val_end, int32_t dpi) +{ + CHECK_AND_RESIZE_ATTRS(node->attrs); + + node->attrs.size++; + lv_svg_attr_t * attr = lv_array_at(&node->attrs, node->attrs.size - 1); + attr->id = type; + attr->val_type = LV_SVG_ATTR_VALUE_DATA; + attr->class_type = LV_SVG_ATTR_VALUE_INITIAL; + + if(type == LV_SVG_ATTR_VALUES) { + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + struct _parse_value_list_context ctx = {.mem_size = 0, .list_count = 0, .list = NULL}; + _parse_anim_value_list(node, attr, val_start, val_end, dpi, _anim_values_cb, &ctx); + attr->value.val = ctx.list; + } + else if(type == LV_SVG_ATTR_KEY_TIMES || type == LV_SVG_ATTR_KEY_POINTS) { + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + struct _parse_value_list_context ctx = {.mem_size = 0, .list_count = 0, .list = NULL}; + _parse_anim_value_list(node, attr, val_start, val_end, dpi, _anim_keys_cb, &ctx); + attr->value.val = ctx.list; + } + else if(type == LV_SVG_ATTR_KEY_SPLINES) { + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + struct _parse_value_list_context ctx = {.mem_size = 0, .list_count = 0, .list = NULL}; + _parse_anim_value_list(node, attr, val_start, val_end, dpi, _anim_key_splines_cb, &ctx); + attr->value.val = ctx.list; + } + else if(type == LV_SVG_ATTR_BEGIN || type == LV_SVG_ATTR_END) { + attr->val_type = LV_SVG_ATTR_VALUE_PTR; + struct _parse_value_list_context ctx = {.mem_size = 0, .list_count = 0, .list = NULL}; + _parse_anim_value_list(node, attr, val_start, val_end, dpi, _anim_begin_end_cb, &ctx); + attr->value.val = ctx.list; + } + else { + _parse_anim_value(node, attr, val_start, val_end, dpi); + } +} + +#endif + +static void create_tokens_from_style_attr(lv_array_t * result, _lv_svg_token_attr_t * tok_attr) +{ + lv_svg_attr_type_t type = _get_svg_attr_type(tok_attr->name_start, tok_attr->name_end); + LV_ASSERT(type == LV_SVG_ATTR_STYLE); + tok_attr->value_start = _skip_space(tok_attr->value_start, tok_attr->value_end); + + /*Generate extra tokens from a style attribute (eg: style="fill:none;stroke-width:6;")*/ + while(tok_attr->value_end - tok_attr->value_start > 0) { + const char * name_start = tok_attr->value_start; + /*colon separates attribute name from value*/ + const char * colon = _next_colon(tok_attr->value_start, tok_attr->value_end); + if(colon == tok_attr->value_end) { + /* No colon found, invalid style property */ + break; + } + /* semicolon marks the end of the value*/ + const char * semicolon = _next_semicolon(colon, tok_attr->value_end); + + const char * value_start = colon + 1; + if(value_start >= semicolon) { + /* Empty value like "fill:;" or "fill:" at end*/ + tok_attr->value_start = _skip_space(semicolon + 1, tok_attr->value_end); + continue; + } + + _lv_svg_token_attr_t new_attr = { + .name_start = name_start, + .name_end = colon, + .value_start = value_start, + .value_end = semicolon, + + }; + tok_attr->value_start = _skip_space(semicolon + 1, tok_attr->value_end); +#if LV_USE_SVG_DEBUG + LV_LOG_INFO("'%.*s': '%.*s'\n", + (int)(colon - name_start), name_start, + (int)(semicolon - value_start), value_start); +#endif + lv_array_push_back(result, &new_attr); + } +} +static void _process_attr_tag(_lv_svg_parser_t * parser, lv_svg_node_t * node, _lv_svg_token_attr_t * tok_attr) +{ + lv_svg_attr_type_t type = _get_svg_attr_type(tok_attr->name_start, tok_attr->name_end); + + /* Style attributes are processed separately and expanded into individual + * property attributes (e.g., style="fill:red;stroke:blue" becomes separate + * fill and stroke attributes). Skip processing the style attribute itself + * since its constituent properties have already been added to the token array */ + if(type == LV_SVG_ATTR_STYLE) { + return; + } + + tok_attr->value_start = _skip_space(tok_attr->value_start, tok_attr->value_end); + uint32_t value_len = tok_attr->value_end - tok_attr->value_start; + if(value_len == 0) { + return; // skip empty value attribute + } + + if(type == LV_SVG_ATTR_XML_ID || type == LV_SVG_ATTR_ID) { // get xml:id + char * str = lv_malloc(value_len + 1); + LV_ASSERT_MALLOC(str); + lv_memcpy(str, tok_attr->value_start, value_len); + str[value_len] = '\0'; + node->xml_id = str; + return; + } + + switch(type) { + case LV_SVG_ATTR_VERSION: + case LV_SVG_ATTR_BASE_PROFILE: + _process_string(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_VIEWBOX: + _process_view_box(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_PRESERVE_ASPECT_RATIO: + _process_preserve_aspect_ratio(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_X: + case LV_SVG_ATTR_Y: + case LV_SVG_ATTR_WIDTH: + case LV_SVG_ATTR_HEIGHT: + case LV_SVG_ATTR_RX: + case LV_SVG_ATTR_RY: + case LV_SVG_ATTR_CX: + case LV_SVG_ATTR_CY: + case LV_SVG_ATTR_R: + case LV_SVG_ATTR_X1: + case LV_SVG_ATTR_Y1: + case LV_SVG_ATTR_X2: + case LV_SVG_ATTR_Y2: + case LV_SVG_ATTR_PATH_LENGTH: + _process_length_value(node, type, tok_attr->value_start, tok_attr->value_end, parser->dpi); + break; + case LV_SVG_ATTR_OPACITY: + case LV_SVG_ATTR_FILL_OPACITY: + case LV_SVG_ATTR_STROKE_OPACITY: + case LV_SVG_ATTR_SOLID_OPACITY: + case LV_SVG_ATTR_VIEWPORT_FILL_OPACITY: + case LV_SVG_ATTR_GRADIENT_STOP_OPACITY: + _process_opacity_value(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_POINTS: + _process_points_value(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_D: +#if LV_USE_SVG_ANIMATION + case LV_SVG_ATTR_PATH: +#endif + _process_path_value(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_TRANSFORM: + _process_transform(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_FILL: + case LV_SVG_ATTR_STROKE: + case LV_SVG_ATTR_VIEWPORT_FILL: + case LV_SVG_ATTR_SOLID_COLOR: + case LV_SVG_ATTR_GRADIENT_STOP_COLOR: + _process_paint(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_FILL_RULE: + case LV_SVG_ATTR_STROKE_LINECAP: + case LV_SVG_ATTR_STROKE_LINEJOIN: + case LV_SVG_ATTR_STROKE_WIDTH: + case LV_SVG_ATTR_STROKE_MITER_LIMIT: + case LV_SVG_ATTR_STROKE_DASH_OFFSET: + case LV_SVG_ATTR_GRADIENT_STOP_OFFSET: + _process_paint_attrs(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_STROKE_DASH_ARRAY: + _process_paint_dasharray(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_GRADIENT_UNITS: + _process_gradient_units(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_FONT_FAMILY: + case LV_SVG_ATTR_FONT_STYLE: + case LV_SVG_ATTR_FONT_VARIANT: + case LV_SVG_ATTR_FONT_WEIGHT: + case LV_SVG_ATTR_FONT_SIZE: + _process_font_attrs(node, type, tok_attr->value_start, tok_attr->value_end, parser->dpi); + break; + case LV_SVG_ATTR_XLINK_HREF: + _process_xlink(node, type, tok_attr->value_start, tok_attr->value_end); + break; +#if LV_USE_SVG_ANIMATION + case LV_SVG_ATTR_DUR: + case LV_SVG_ATTR_MIN: + case LV_SVG_ATTR_MAX: + case LV_SVG_ATTR_REPEAT_DUR: + _process_clock_time(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_ATTRIBUTE_NAME: + _process_anim_attr_names(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_FROM: + case LV_SVG_ATTR_TO: + case LV_SVG_ATTR_BY: + case LV_SVG_ATTR_VALUES: + case LV_SVG_ATTR_KEY_TIMES: + case LV_SVG_ATTR_KEY_POINTS: + case LV_SVG_ATTR_KEY_SPLINES: + case LV_SVG_ATTR_BEGIN: + case LV_SVG_ATTR_END: + _process_anim_attr_values(node, type, tok_attr->value_start, tok_attr->value_end, parser->dpi); + break; + case LV_SVG_ATTR_ROTATE: + case LV_SVG_ATTR_REPEAT_COUNT: + _process_anim_attr_number(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_RESTART: + case LV_SVG_ATTR_CALC_MODE: + case LV_SVG_ATTR_ADDITIVE: + case LV_SVG_ATTR_ACCUMULATE: + case LV_SVG_ATTR_TRANSFORM_TYPE: + _process_anim_attr_options(node, type, tok_attr->value_start, tok_attr->value_end); + break; + case LV_SVG_ATTR_ATTRIBUTE_TYPE: +#endif + case LV_SVG_ATTR_DISPLAY: + case LV_SVG_ATTR_VISIBILITY: + case LV_SVG_ATTR_TEXT_ANCHOR: + LV_LOG_USER("Attribute not supported %.*s", (int)(tok_attr->name_end - tok_attr->name_start), tok_attr->name_start); + // not support yet + break; + } + +} +static void _process_attrs_tag(_lv_svg_parser_t * parser, lv_svg_node_t * node, const _lv_svg_token_t * token) +{ + uint32_t len = lv_array_size(&token->attrs); + lv_array_t inline_style_tokens; + lv_array_init(&inline_style_tokens, 0, sizeof(_lv_svg_token_attr_t)); + + for(uint32_t i = 0; i < len; i++) { + _lv_svg_token_attr_t * tok_attr = lv_array_at(&token->attrs, i); + lv_svg_attr_type_t type = _get_svg_attr_type(tok_attr->name_start, tok_attr->name_end); + + /* Expand style attributes into individual property attributes */ + if(type == LV_SVG_ATTR_STYLE) { + create_tokens_from_style_attr(&inline_style_tokens, tok_attr); + continue; + } + _process_attr_tag(parser, node, tok_attr); + } + + len = lv_array_size(&inline_style_tokens); + + /* Process style-derived attributes last to ensure inline + * style properties override regular attributes*/ + for(uint32_t i = 0; i < len; i++) { + _lv_svg_token_attr_t * tok_attr = lv_array_at(&inline_style_tokens, i); + _process_attr_tag(parser, node, tok_attr); + } + lv_array_deinit(&inline_style_tokens); +} + +static bool _process_begin_tag(_lv_svg_parser_t * parser, lv_svg_tag_t tag, const _lv_svg_token_t * token) +{ + if(parser->state == LV_SVG_PARSER_IGNORE) { + // ignore ignored tokens + return true; + } + + if(token->type == LV_SVG_TOKEN_CONTENT) { + uint32_t len = SVG_TOKEN_LEN(token); + char * content = lv_malloc(len + 1); + LV_ASSERT_MALLOC(content); + lv_memcpy(content, token->start, len); + content[len] = '\0'; + lv_svg_node_t * node = lv_svg_node_create(parser->cur_node); + node->xml_id = content; + node->type = LV_SVG_TAG_CONTENT; + return true; + } + + // begin invalid tag + if(tag == LV_SVG_TAG_INVALID) { + if(!token->flat) { + parser->state = LV_SVG_PARSER_IGNORE; + uint32_t len = SVG_TOKEN_LEN(token); + parser->ignore_name = lv_malloc(len + 1); + LV_ASSERT_MALLOC(parser->ignore_name); + parser->ignore_len = len; + lv_memcpy(parser->ignore_name, token->start, len); + parser->ignore_name[len] = '\0'; + } + return true; + } + + // create new node + lv_svg_node_t * node = lv_svg_node_create(parser->cur_node); + node->type = tag; + _process_attrs_tag(parser, node, token); + + if(!parser->doc_root) { // root node + parser->doc_root = node; + } + if(!token->flat) { // FIXME: not leaf node + parser->cur_node = node; + } + return true; +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void _lv_svg_parser_init(_lv_svg_parser_t * parser) +{ + LV_ASSERT_NULL(parser); + lv_memzero(parser, sizeof(_lv_svg_parser_t)); + parser->state = LV_SVG_PARSER_PROCESS; + parser->ignore_name = NULL; + parser->ignore_len = 0; + parser->dpi = 96; // FIXME: Is it right ? + parser->doc_root = NULL; + parser->cur_node = NULL; +} + +void _lv_svg_parser_deinit(_lv_svg_parser_t * parser) +{ + LV_ASSERT_NULL(parser); + if(parser->ignore_name) { + lv_free(parser->ignore_name); + parser->ignore_name = NULL; + parser->ignore_len = 0; + } + + if(parser->doc_root) { + lv_svg_node_delete(parser->doc_root); + } + parser->doc_root = parser->cur_node = NULL; +} + +bool _lv_svg_parser_is_finish(_lv_svg_parser_t * parser) +{ + LV_ASSERT_NULL(parser); + return (parser->doc_root != NULL) + && (parser->cur_node == parser->doc_root) + && (parser->state != LV_SVG_PARSER_IGNORE); +} + +bool _lv_svg_parser_token(_lv_svg_parser_t * parser, const _lv_svg_token_t * token) +{ + LV_ASSERT_NULL(parser); + LV_ASSERT_NULL(token); + lv_svg_tag_t tag = _get_svg_tag_type(token); + + if(parser->doc_root == NULL) { + if(!(tag == LV_SVG_TAG_SVG && token->type == LV_SVG_TOKEN_BEGIN)) { + LV_LOG_ERROR("root element in svg document must be !"); + return false; + } + } + + if(token->type == LV_SVG_TOKEN_END) { + return _process_end_tag(parser, tag, token); + } + + return _process_begin_tag(parser, tag, token); +} + +#if LV_USE_SVG_DEBUG +#include +void _lv_svg_dump_tree(lv_svg_node_t * root, int depth) +{ + if(!root) { + return; + } + + for(int i = 0; i < depth; i++) { + printf(" "); + } + if(root->type == LV_SVG_TAG_CONTENT) { + printf("content: [%s]\n", root->xml_id); + } + else { + printf("tag <%s>", _svg_tag_map[root->type - 1].name); + if(root->xml_id) { + printf(" - id [%s]", root->xml_id); + } + printf("\n"); + } + + uint32_t len = lv_array_size(&root->attrs); + for(uint32_t i = 0; i < len; i++) { + for(int j = 0; j < depth; j++) { + printf(" "); + } + lv_svg_attr_t * attr = lv_array_at(&root->attrs, i); + printf(" attr <%s>\n", _svg_attr_map[attr->id - 1].name); + } + + lv_tree_node_t * tree_root = (lv_tree_node_t *)root; + + for(uint32_t i = 0; i < tree_root->child_cnt; i++) { + ++depth; + _lv_svg_dump_tree((lv_svg_node_t *)tree_root->children[i], depth); + --depth; + } +} +#endif /*LV_USE_SVG_DEBUG*/ + +/********************** + * STATIC FUNCTIONS + **********************/ +#endif /*LV_USE_SVG*/ diff --git a/inc/lvgl/src/libs/svg/lv_svg_parser.h b/inc/lvgl/src/libs/svg/lv_svg_parser.h new file mode 100644 index 0000000..fc99fe8 --- /dev/null +++ b/inc/lvgl/src/libs/svg/lv_svg_parser.h @@ -0,0 +1,84 @@ +/** + * @file lv_svg_parser.h + * + */ + +#ifndef LV_SVG_PARSER_H +#define LV_SVG_PARSER_H + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_SVG + +#include "lv_svg.h" +#include "lv_svg_token.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_SVG_PARSER_PROCESS = 0, + LV_SVG_PARSER_IGNORE, +} _lv_svg_parser_state_t; + +typedef struct { + uint16_t state; + char * ignore_name; + uint32_t ignore_len; + int32_t dpi; + lv_svg_node_t * doc_root; + lv_svg_node_t * cur_node; +} _lv_svg_parser_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the SVG parser + * @param parser pointer to a parser object + */ +void _lv_svg_parser_init(_lv_svg_parser_t * parser); + +/** + * @brief Deinitialize the SVG parser + * @param parser pointer to a parser object + */ +void _lv_svg_parser_deinit(_lv_svg_parser_t * parser); + +/** + * @brief Parse an SVG document + * @param parser pointer to a parser object + * @param token pointer to a token object + * @return true: the parsing is finished, false: the parsing is not finished yet. + */ +bool _lv_svg_parser_token(_lv_svg_parser_t * parser, const _lv_svg_token_t * token); + +/** + * @brief Check if the parsing is finished + * @param parser pointer to a parser object + * @return true: the parsing is finished, false: the parsing is not finished yet. + */ +bool _lv_svg_parser_is_finish(_lv_svg_parser_t * parser); + +/** + * @brief Dump the SVG tree + * @param root pointer to the root of the SVG tree + * @param depth the depth of the current node in the tree + */ +void _lv_svg_dump_tree(lv_svg_node_t * root, int depth); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SVG*/ + +#endif /*LV_SVG_PARSER_H*/ diff --git a/inc/lvgl/src/libs/svg/lv_svg_render.c b/inc/lvgl/src/libs/svg/lv_svg_render.c new file mode 100644 index 0000000..4d6663c --- /dev/null +++ b/inc/lvgl/src/libs/svg/lv_svg_render.c @@ -0,0 +1,2598 @@ +/** + * @file lv_svg_render.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../lvgl.h" +#include "lv_svg_render.h" +#if LV_USE_SVG + +#include "../../misc/lv_text_private.h" +#include +#include + +#if LV_USE_FREETYPE + #include "../../libs/freetype/lv_freetype_private.h" +#endif + +/********************* +* DEFINES +*********************/ +#ifndef M_PI + #define M_PI 3.1415926f +#endif + +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) +#define ABS(a) fabsf(a) + +#define CALC_BOUNDS(p, bounds) \ + do { \ + if((p).x < (bounds).x1) (bounds).x1 = (int32_t)(p).x; \ + if((p).y < (bounds).y1) (bounds).y1 = (int32_t)(p).y; \ + if((p).x > (bounds).x2) (bounds).x2 = (int32_t)(p).x; \ + if((p).y > (bounds).y2) (bounds).y2 = (int32_t)(p).y; \ + } while(0) + +#define PCT_TO_PX(v, base) ((v) > 1 ? (v) : ((v) * (base))) + +enum { + _RENDER_NORMAL = 0, + _RENDER_IN_DEFS = 1, + _RENDER_IN_GROUP = 2, +}; + +enum { + _RENDER_ATTR_FILL = (4 << 1), + _RENDER_ATTR_FILL_RULE = (4 << 2), + _RENDER_ATTR_FILL_OPACITY = (4 << 3), + _RENDER_ATTR_STROKE = (4 << 4), + _RENDER_ATTR_STROKE_OPACITY = (4 << 5), + _RENDER_ATTR_STROKE_WIDTH = (4 << 6), + _RENDER_ATTR_STROKE_LINECAP = (4 << 7), + _RENDER_ATTR_STROKE_LINEJOIN = (4 << 8), + _RENDER_ATTR_STROKE_MITER_LIMIT = (4 << 9), + _RENDER_ATTR_STROKE_DASH_ARRAY = (4 << 10), +}; + +/********************** +* TYPEDEFS +**********************/ +static void _set_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr); +static void _set_draw_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr); +static void _init_draw_dsc(lv_vector_path_ctx_t * dsc); +static void _deinit_draw_dsc(lv_vector_path_ctx_t * dsc); +static void _copy_draw_dsc(lv_vector_path_ctx_t * dst, const lv_vector_path_ctx_t * src); +static void _prepare_render(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc); +static void _special_render(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc); +#if LV_USE_FREETYPE + static void _freetype_outline_cb(lv_event_t * e); +#endif + +typedef struct { + lv_svg_render_obj_t base; + float width; + float height; + bool viewport_fill; +} lv_svg_render_viewport_t; + +typedef struct { + lv_svg_render_obj_t base; + lv_array_t items; +} lv_svg_render_group_t; + +typedef struct { + lv_svg_render_obj_t base; + float x; + float y; + char * xlink; +} lv_svg_render_use_t; + +typedef struct { + lv_svg_render_obj_t base; + lv_color_t color; + float opacity; +} lv_svg_render_solid_t; + +typedef struct { + lv_svg_render_obj_t base; + lv_vector_gradient_t dsc; + lv_svg_gradient_units_t units; +} lv_svg_render_gradient_t; + +typedef struct { + lv_svg_render_obj_t base; + float x; + float y; + float width; + float height; + float rx; + float ry; +} lv_svg_render_rect_t; + +typedef struct { + lv_svg_render_obj_t base; + float cx; + float cy; + float r; +} lv_svg_render_circle_t; + +typedef struct { + lv_svg_render_obj_t base; + float cx; + float cy; + float rx; + float ry; +} lv_svg_render_ellipse_t; + +typedef struct { + lv_svg_render_obj_t base; + float x1; + float y1; + float x2; + float y2; +} lv_svg_render_line_t; + +typedef struct { + lv_svg_render_obj_t base; + lv_vector_path_t * path; + lv_area_t bounds; +} lv_svg_render_poly_t; + +typedef struct { + lv_svg_render_obj_t base; + float x; + float y; + float width; + float height; + lv_draw_image_dsc_t img_dsc; + lv_svg_aspect_ratio_t ratio; +} lv_svg_render_image_t; + +#if LV_USE_FREETYPE +typedef struct { + lv_svg_render_obj_t base; + lv_array_t contents; + char * family; + float size; + lv_freetype_font_style_t style; + lv_font_t * font; + float x; + float y; + lv_vector_path_t * path; + lv_area_t bounds; +} lv_svg_render_text_t; + +typedef struct _lv_svg_render_content { + lv_svg_render_obj_t base; + void (*render_content)(const struct _lv_svg_render_content * content, + lv_draw_vector_dsc_t * dsc, lv_matrix_t * matrix); + uint32_t * letters; + uint32_t count; +} lv_svg_render_content_t; + +typedef struct { + lv_svg_render_content_t base; + char * family; + float size; + lv_freetype_font_style_t style; + lv_font_t * font; + lv_vector_path_t * path; + lv_area_t bounds; +} lv_svg_render_tspan_t; +#endif + +struct _lv_svg_draw_dsc { + struct _lv_svg_draw_dsc * next; + lv_vector_path_ctx_t dsc; + const char * fill_ref; + const char * stroke_ref; +}; + +struct _lv_svg_drawing_builder_state { + const lv_svg_node_t * doc; + struct _lv_svg_draw_dsc * draw_dsc; + int in_group_deps; + bool in_defs; +#if LV_USE_FREETYPE + bool in_text; + lv_svg_node_t * cur_text; +#endif + lv_svg_render_obj_t * list; + lv_svg_render_obj_t * tail; +}; + +/********************** + * STATIC VARIABLES + **********************/ +static lv_svg_render_hal_t hal_funcs = {NULL, NULL}; + +/********************** + * STATIC PROTOTYPES + **********************/ +void lv_svg_render_init(const lv_svg_render_hal_t * hal) +{ + if(hal) { + hal_funcs = *hal; +#if LV_USE_FREETYPE + lv_freetype_outline_add_event(_freetype_outline_cb, LV_EVENT_ALL, NULL); +#endif + } +} + +static struct _lv_svg_draw_dsc * _lv_svg_draw_dsc_create(void) +{ + struct _lv_svg_draw_dsc * dsc = lv_zalloc(sizeof(struct _lv_svg_draw_dsc)); + LV_ASSERT_MALLOC(dsc); + _init_draw_dsc(&(dsc->dsc)); + return dsc; +} + +static void _lv_svg_draw_dsc_delete(struct _lv_svg_draw_dsc * dsc) +{ + while(dsc) { + struct _lv_svg_draw_dsc * cur = dsc; + dsc = dsc->next; + _deinit_draw_dsc(&(cur->dsc)); + lv_free(cur); + } +} + +static struct _lv_svg_draw_dsc * _lv_svg_draw_dsc_push(struct _lv_svg_draw_dsc * dsc) +{ + if(!dsc) return NULL; + struct _lv_svg_draw_dsc * cur = lv_zalloc(sizeof(struct _lv_svg_draw_dsc)); + LV_ASSERT_MALLOC(cur); + _copy_draw_dsc(&(cur->dsc), &(dsc->dsc)); + cur->fill_ref = dsc->fill_ref; + cur->stroke_ref = dsc->stroke_ref; + cur->next = dsc; + return cur; +} + +static struct _lv_svg_draw_dsc * _lv_svg_draw_dsc_pop(struct _lv_svg_draw_dsc * dsc) +{ + if(!dsc) return NULL; + struct _lv_svg_draw_dsc * cur = dsc->next; + lv_free(dsc); + return cur; +} + +static void _set_viewport_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_draw_attr(obj, dsc, attr); + lv_svg_render_viewport_t * view = (lv_svg_render_viewport_t *)obj; + switch(attr->id) { + case LV_SVG_ATTR_WIDTH: + view->width = attr->value.fval; + break; + case LV_SVG_ATTR_HEIGHT: + view->height = attr->value.fval; + break; + case LV_SVG_ATTR_VIEWBOX: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INITIAL) { + float * vals = attr->value.val; + float scale_x = 1.0f; + float scale_y = 1.0f; + float trans_x = vals[0]; + float trans_y = vals[1]; + + if(view->width > 0 && vals[2] > 0) { + scale_x = view->width / vals[2]; + } + if(view->height > 0 && vals[3] > 0) { + scale_y = view->height / vals[3]; + } + view->width = scale_x * vals[2]; + view->height = scale_y * vals[3]; + + lv_matrix_scale(&obj->matrix, scale_x, scale_y); + lv_matrix_translate(&obj->matrix, -trans_x, -trans_y); + } + } + break; + case LV_SVG_ATTR_VIEWPORT_FILL: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INITIAL + && attr->val_type == LV_SVG_ATTR_VALUE_DATA) { + dsc->fill_dsc.color = lv_color_to_32(lv_color_hex(attr->value.uval), 0xFF); + view->viewport_fill = true; + } + else if(attr->class_type == LV_SVG_ATTR_VALUE_NONE) { + view->viewport_fill = false; + } + } + break; + case LV_SVG_ATTR_VIEWPORT_FILL_OPACITY: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INITIAL) { + dsc->fill_dsc.opa = (lv_opa_t)(attr->value.fval * 255.0f); + } + } + break; + } +} + +static void _set_use_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_use_t * use = (lv_svg_render_use_t *)obj; + switch(attr->id) { + case LV_SVG_ATTR_X: + use->x = attr->value.fval; + break; + case LV_SVG_ATTR_Y: + use->y = attr->value.fval; + break; + case LV_SVG_ATTR_XLINK_HREF: { + if(use->xlink) lv_free(use->xlink); + use->xlink = lv_strdup(attr->value.sval); + } + break; + } +} + +static void _set_solid_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + LV_UNUSED(dsc); + lv_svg_render_solid_t * solid = (lv_svg_render_solid_t *)obj; + switch(attr->id) { + case LV_SVG_ATTR_SOLID_COLOR: + solid->color = lv_color_hex(attr->value.uval); + break; + case LV_SVG_ATTR_SOLID_OPACITY: + solid->opacity = attr->value.fval; + break; + } +} + +static void _set_gradient_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + LV_UNUSED(dsc); + lv_svg_render_gradient_t * grad = (lv_svg_render_gradient_t *)obj; + switch(attr->id) { + case LV_SVG_ATTR_CX: + grad->dsc.cx = attr->value.fval; + break; + case LV_SVG_ATTR_CY: + grad->dsc.cy = attr->value.fval; + break; + case LV_SVG_ATTR_R: + grad->dsc.cr = attr->value.fval; + break; + case LV_SVG_ATTR_X1: + grad->dsc.x1 = attr->value.fval; + break; + case LV_SVG_ATTR_Y1: + grad->dsc.y1 = attr->value.fval; + break; + case LV_SVG_ATTR_X2: + grad->dsc.x2 = attr->value.fval; + break; + case LV_SVG_ATTR_Y2: + grad->dsc.y2 = attr->value.fval; + break; + case LV_SVG_ATTR_GRADIENT_UNITS: + grad->units = attr->value.ival; + break; + } +} + +static void _set_rect_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_rect_t * rect = (lv_svg_render_rect_t *)obj; + switch(attr->id) { + case LV_SVG_ATTR_X: + rect->x = attr->value.fval; + break; + case LV_SVG_ATTR_Y: + rect->y = attr->value.fval; + break; + case LV_SVG_ATTR_WIDTH: + rect->width = attr->value.fval; + break; + case LV_SVG_ATTR_HEIGHT: + rect->height = attr->value.fval; + break; + case LV_SVG_ATTR_RX: + rect->rx = attr->value.fval; + break; + case LV_SVG_ATTR_RY: + rect->ry = attr->value.fval; + break; + } +} + +static void _set_circle_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_circle_t * circle = (lv_svg_render_circle_t *)obj; + switch(attr->id) { + case LV_SVG_ATTR_CX: + circle->cx = attr->value.fval; + break; + case LV_SVG_ATTR_CY: + circle->cy = attr->value.fval; + break; + case LV_SVG_ATTR_R: + circle->r = attr->value.fval; + break; + } +} + +static void _set_ellipse_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_ellipse_t * ellipse = (lv_svg_render_ellipse_t *)obj; + switch(attr->id) { + case LV_SVG_ATTR_CX: + ellipse->cx = attr->value.fval; + break; + case LV_SVG_ATTR_CY: + ellipse->cy = attr->value.fval; + break; + case LV_SVG_ATTR_RX: + ellipse->rx = attr->value.fval; + break; + case LV_SVG_ATTR_RY: + ellipse->ry = attr->value.fval; + break; + } +} + +static void _set_line_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_line_t * line = (lv_svg_render_line_t *)obj; + switch(attr->id) { + case LV_SVG_ATTR_X1: + line->x1 = attr->value.fval; + break; + case LV_SVG_ATTR_Y1: + line->y1 = attr->value.fval; + break; + case LV_SVG_ATTR_X2: + line->x2 = attr->value.fval; + break; + case LV_SVG_ATTR_Y2: + line->y2 = attr->value.fval; + break; + } +} + +static void _set_polyline_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_poly_t * poly = (lv_svg_render_poly_t *)obj; + if(attr->id == LV_SVG_ATTR_POINTS) { + lv_vector_path_clear(poly->path); + lv_svg_attr_values_list_t * vals = (lv_svg_attr_values_list_t *)(attr->value.val); + uint32_t len = vals->length; + lv_svg_point_t * points = (lv_svg_point_t *)(&vals->data); + + CALC_BOUNDS(points[0], poly->bounds); + lv_fpoint_t pt = {points[0].x, points[0].y}; + lv_vector_path_move_to(poly->path, &pt); + for(uint32_t i = 1; i < len; i++) { + pt.x = points[i].x; + pt.y = points[i].y; + lv_vector_path_line_to(poly->path, &pt); + CALC_BOUNDS(pt, poly->bounds); + } + } +} + +static void _set_polygon_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_polyline_attr(obj, dsc, attr); + lv_svg_render_poly_t * poly = (lv_svg_render_poly_t *)obj; + if(attr->id == LV_SVG_ATTR_POINTS) { + lv_vector_path_close(poly->path); + } +} + +static size_t _get_path_seg_size(uint32_t cmd) +{ + switch(cmd) { + case LV_SVG_PATH_CMD_MOVE_TO: + case LV_SVG_PATH_CMD_LINE_TO: + case LV_SVG_PATH_CMD_CLOSE: + return sizeof(lv_svg_point_t) + sizeof(uint32_t); + case LV_SVG_PATH_CMD_QUAD_TO: + return sizeof(lv_svg_point_t) * 2 + sizeof(uint32_t); + case LV_SVG_PATH_CMD_CURVE_TO: + return sizeof(lv_svg_point_t) * 3 + sizeof(uint32_t); + case LV_SVG_PATH_CMD_ARC_TO: + return sizeof(lv_svg_point_t) * 4 + sizeof(uint32_t); + default: + return 0; + } +} + +static void _set_path_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_poly_t * poly = (lv_svg_render_poly_t *)obj; + if(attr->id == LV_SVG_ATTR_D) { + lv_vector_path_clear(poly->path); + lv_svg_attr_values_list_t * vals = (lv_svg_attr_values_list_t *)(attr->value.val); + uint32_t len = vals->length; + uint8_t * data_ptr = (uint8_t *)(&vals->data); + + for(uint32_t i = 0; i < len; i++) { + lv_svg_attr_path_value_t * path_seg = (lv_svg_attr_path_value_t *)data_ptr; + uint32_t cmd = path_seg->cmd; + lv_svg_point_t * points = (lv_svg_point_t *)(&path_seg->data); + switch(cmd) { + case LV_SVG_PATH_CMD_MOVE_TO: { + lv_fpoint_t pt = {points[0].x, points[0].y}; + lv_vector_path_move_to(poly->path, &pt); + CALC_BOUNDS(pt, poly->bounds); + } + break; + case LV_SVG_PATH_CMD_LINE_TO: { + lv_fpoint_t pt = {points[0].x, points[0].y}; + lv_vector_path_line_to(poly->path, &pt); + CALC_BOUNDS(pt, poly->bounds); + } + break; + case LV_SVG_PATH_CMD_QUAD_TO: { + lv_fpoint_t pt[2] = { + {points[0].x, points[0].y}, + {points[1].x, points[1].y} + }; + lv_vector_path_quad_to(poly->path, &pt[0], &pt[1]); + CALC_BOUNDS(pt[0], poly->bounds); + CALC_BOUNDS(pt[1], poly->bounds); + } + break; + case LV_SVG_PATH_CMD_CURVE_TO: { + lv_fpoint_t pt[3] = { + {points[0].x, points[0].y}, + {points[1].x, points[1].y}, + {points[2].x, points[2].y} + }; + lv_vector_path_cubic_to(poly->path, &pt[0], &pt[1], &pt[2]); + CALC_BOUNDS(pt[0], poly->bounds); + CALC_BOUNDS(pt[1], poly->bounds); + CALC_BOUNDS(pt[2], poly->bounds); + } + break; + case LV_SVG_PATH_CMD_ARC_TO: { + lv_fpoint_t pt[4] = { + {points[0].x, points[0].y}, + {points[1].x, points[1].y}, + {points[2].x, points[2].y}, + {points[3].x, points[3].y} + }; + lv_vector_path_arc_to(poly->path, pt[0].x, pt[0].y, pt[1].x, pt[2].x > 0, pt[2].y > 0, &pt[3]); + lv_vector_path_get_bounding(poly->path, &poly->bounds); + } + break; + case LV_SVG_PATH_CMD_CLOSE: { + lv_vector_path_close(poly->path); + } + break; + } + size_t mem_inc = _get_path_seg_size(cmd); + data_ptr += mem_inc; + } + } +} + +#if LV_USE_FREETYPE +#define SET_FONT_ATTRS(obj, attr) \ + do { \ + switch(attr->id) { \ + case LV_SVG_ATTR_FONT_FAMILY: { \ + if(attr->val_type == LV_SVG_ATTR_VALUE_PTR) { \ + if((obj)->font) { \ + lv_freetype_font_delete((obj)->font); \ + (obj)->font = NULL; \ + } \ + lv_vector_path_clear((obj)->path); \ + if((obj)->family) lv_free((obj)->family); \ + (obj)->family = lv_strdup(attr->value.sval); \ + } \ + } \ + break; \ + case LV_SVG_ATTR_FONT_SIZE: \ + if(attr->class_type == LV_SVG_ATTR_VALUE_INITIAL) { \ + if(attr->val_type == LV_SVG_ATTR_VALUE_DATA) { \ + if((obj)->font) { \ + lv_freetype_font_delete((obj)->font); \ + (obj)->font = NULL; \ + } \ + (obj)->size = attr->value.fval; \ + lv_vector_path_clear((obj)->path); \ + } \ + } \ + break; \ + case LV_SVG_ATTR_FONT_STYLE: \ + if(attr->class_type == LV_SVG_ATTR_VALUE_INITIAL) { \ + if(attr->val_type == LV_SVG_ATTR_VALUE_PTR) { \ + if((obj)->font) { \ + lv_freetype_font_delete((obj)->font); \ + (obj)->font = NULL; \ + } \ + lv_vector_path_clear((obj)->path); \ + if(strncmp(attr->value.sval, "italic", 6) == 0) { \ + (obj)->style = LV_FREETYPE_FONT_STYLE_ITALIC; \ + } \ + } \ + } \ + break; \ + case LV_SVG_ATTR_FONT_WEIGHT: \ + if(attr->class_type == LV_SVG_ATTR_VALUE_INITIAL) { \ + if(attr->val_type == LV_SVG_ATTR_VALUE_PTR) { \ + if((obj)->font) { \ + lv_freetype_font_delete((obj)->font); \ + (obj)->font = NULL; \ + } \ + lv_vector_path_clear((obj)->path); \ + if(strncmp(attr->value.sval, "bold", 4) == 0) { \ + (obj)->style = LV_FREETYPE_FONT_STYLE_BOLD; \ + } \ + } \ + } \ + break; \ + case LV_SVG_ATTR_FONT_VARIANT: \ + if(attr->class_type == LV_SVG_ATTR_VALUE_INITIAL) { \ + if(attr->val_type == LV_SVG_ATTR_VALUE_PTR) { \ + if((obj)->font) { \ + lv_freetype_font_delete((obj)->font); \ + (obj)->font = NULL; \ + } \ + lv_vector_path_clear((obj)->path); \ + if(strncmp(attr->value.sval, "small-caps", 10) == 0) { \ + (obj)->size /= 2; \ + } \ + } \ + } \ + break; \ + } \ + } while(0) + +static void _set_tspan_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_tspan_t * tspan = (lv_svg_render_tspan_t *)obj; + + SET_FONT_ATTRS(tspan, attr); +} + +static void _set_text_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_text_t * text = (lv_svg_render_text_t *)obj; + + SET_FONT_ATTRS(text, attr); + + switch(attr->id) { + case LV_SVG_ATTR_X: + text->x = attr->value.fval; + break; + case LV_SVG_ATTR_Y: + text->y = attr->value.fval; + break; + } +} +#endif + +static void _set_image_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + _set_attr(obj, dsc, attr); + lv_svg_render_image_t * image = (lv_svg_render_image_t *)obj; + switch(attr->id) { + case LV_SVG_ATTR_X: + image->x = attr->value.fval; + break; + case LV_SVG_ATTR_Y: + image->y = attr->value.fval; + break; + case LV_SVG_ATTR_HEIGHT: + image->height = attr->value.fval; + break; + case LV_SVG_ATTR_WIDTH: + image->width = attr->value.fval; + break; + case LV_SVG_ATTR_OPACITY: + image->img_dsc.opa = (lv_opa_t)(attr->value.fval * 255.0f); + break; + case LV_SVG_ATTR_XLINK_HREF: { + const char * xlink = attr->value.sval; + if(hal_funcs.load_image) { + hal_funcs.load_image(xlink, &image->img_dsc); + } + } + break; + case LV_SVG_ATTR_PRESERVE_ASPECT_RATIO: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INITIAL) { + image->ratio = attr->value.uval; + } + } + break; + } +} + +static void _set_draw_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + LV_UNUSED(obj); + switch(attr->id) { + case LV_SVG_ATTR_FILL: { + if(attr->class_type == LV_SVG_ATTR_VALUE_NONE) { + dsc->fill_dsc.opa = LV_OPA_0; + obj->flags |= _RENDER_ATTR_FILL_OPACITY; + obj->flags |= _RENDER_ATTR_FILL; + return; + } + else if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_FILL; + return; + } + else { + if(obj->fill_ref) { + lv_free(obj->fill_ref); + obj->fill_ref = NULL; + } + if(attr->val_type == LV_SVG_ATTR_VALUE_PTR) { + obj->fill_ref = lv_strdup(attr->value.sval); + } + else { /* color */ + dsc->fill_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->fill_dsc.color = lv_color_to_32(lv_color_hex(attr->value.uval), 0xFF); + } + obj->flags |= _RENDER_ATTR_FILL; + if(obj->dsc.fill_dsc.opa == LV_OPA_0) { + dsc->fill_dsc.opa = LV_OPA_COVER; + obj->flags |= _RENDER_ATTR_FILL_OPACITY; + } + } + } + break; + case LV_SVG_ATTR_STROKE: { + if(attr->class_type == LV_SVG_ATTR_VALUE_NONE) { + dsc->stroke_dsc.opa = LV_OPA_0; + obj->flags |= _RENDER_ATTR_STROKE_OPACITY; + obj->flags |= _RENDER_ATTR_STROKE; + return; + } + else if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_STROKE; + return; + } + else { + if(obj->stroke_ref) { + lv_free(obj->stroke_ref); + obj->stroke_ref = NULL; + } + if(attr->val_type == LV_SVG_ATTR_VALUE_PTR) { + obj->stroke_ref = lv_strdup(attr->value.sval); + } + else { /* color */ + dsc->stroke_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->stroke_dsc.color = lv_color_to_32(lv_color_hex(attr->value.uval), 0xFF); + } + } + + obj->flags |= _RENDER_ATTR_STROKE; + if(obj->dsc.stroke_dsc.opa == LV_OPA_0) { + dsc->stroke_dsc.opa = LV_OPA_COVER; + obj->flags |= _RENDER_ATTR_STROKE_OPACITY; + } + } + break; + case LV_SVG_ATTR_FILL_OPACITY: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_FILL_OPACITY; + return; + } + dsc->fill_dsc.opa = (lv_opa_t)(attr->value.fval * 255.0f); + obj->flags |= _RENDER_ATTR_FILL_OPACITY; + } + break; + case LV_SVG_ATTR_STROKE_OPACITY: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_STROKE_OPACITY; + return; + } + dsc->stroke_dsc.opa = (lv_opa_t)(attr->value.fval * 255.0f); + obj->flags |= _RENDER_ATTR_STROKE_OPACITY; + } + break; + case LV_SVG_ATTR_FILL_RULE: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_FILL_RULE; + return; + } + dsc->fill_dsc.fill_rule = attr->value.ival; + obj->flags |= _RENDER_ATTR_FILL_RULE; + } + break; + case LV_SVG_ATTR_STROKE_WIDTH: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_STROKE_WIDTH; + return; + } + dsc->stroke_dsc.width = attr->value.fval; + obj->flags |= _RENDER_ATTR_STROKE_WIDTH; + } + break; + case LV_SVG_ATTR_STROKE_LINECAP: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_STROKE_LINECAP; + return; + } + dsc->stroke_dsc.cap = attr->value.ival; + obj->flags |= _RENDER_ATTR_STROKE_LINECAP; + } + break; + case LV_SVG_ATTR_STROKE_LINEJOIN: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_STROKE_LINEJOIN; + return; + } + dsc->stroke_dsc.join = attr->value.ival; + obj->flags |= _RENDER_ATTR_STROKE_LINEJOIN; + } + break; + case LV_SVG_ATTR_STROKE_MITER_LIMIT: { + if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_STROKE_MITER_LIMIT; + return; + } + dsc->stroke_dsc.miter_limit = attr->value.ival; + obj->flags |= _RENDER_ATTR_STROKE_MITER_LIMIT; + } + break; + case LV_SVG_ATTR_STROKE_DASH_ARRAY: { + if(attr->class_type == LV_SVG_ATTR_VALUE_NONE) { + lv_array_clear(&(dsc->stroke_dsc.dash_pattern)); + obj->flags |= _RENDER_ATTR_STROKE_DASH_ARRAY; + return; + } + else if(attr->class_type == LV_SVG_ATTR_VALUE_INHERIT) { + obj->flags &= ~_RENDER_ATTR_STROKE_DASH_ARRAY; + return; + } + else { + lv_array_t * dash_array = &(dsc->stroke_dsc.dash_pattern); + + lv_svg_attr_values_list_t * vals = (lv_svg_attr_values_list_t *)(attr->value.val); + uint32_t len = vals->length; + float * dashs = (float *)(&vals->data); + lv_array_clear(dash_array); + + obj->flags |= _RENDER_ATTR_STROKE_DASH_ARRAY; + if(len) { + if(lv_array_capacity(dash_array) == 0) { + lv_array_init(dash_array, len, sizeof(float)); + } + else { + lv_array_resize(dash_array, len); + } + for(uint32_t i = 0; i < len; i++) { + lv_array_push_back(dash_array, (uint8_t *)(&dashs[i])); + } + } + } + } + break; + case LV_SVG_ATTR_STROKE_DASH_OFFSET: + /* not support yet */ + break; + } +} + +static void _set_attr(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr) +{ + if(attr->id == LV_SVG_ATTR_TRANSFORM) { + if(attr->class_type == LV_SVG_ATTR_VALUE_NONE) { + return; + } + lv_memcpy(&(obj->matrix), attr->value.val, sizeof(lv_matrix_t)); + } + else { + _set_draw_attr(obj, dsc, attr); + } +} + +static void _set_solid_ref(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, + const lv_svg_render_obj_t * target_obj, bool fill) +{ + LV_UNUSED(target_obj); + lv_svg_render_solid_t * solid = (lv_svg_render_solid_t *)obj; + if(fill) { + dsc->fill_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->fill_dsc.color = lv_color_to_32(solid->color, 0xFF); + dsc->fill_dsc.opa = (lv_opa_t)(solid->opacity * 255.0f); + } + else { + dsc->stroke_dsc.style = LV_VECTOR_DRAW_STYLE_SOLID; + dsc->stroke_dsc.color = lv_color_to_32(solid->color, 0xFF); + dsc->stroke_dsc.opa = (lv_opa_t)(solid->opacity * 255.0f); + } +} + +static void _set_gradient_ref(lv_svg_render_obj_t * obj, lv_vector_path_ctx_t * dsc, + const lv_svg_render_obj_t * target_obj, bool fill) +{ + if(!target_obj->clz->get_bounds) { + return; + } + + lv_svg_render_gradient_t * grad = (lv_svg_render_gradient_t *)obj; + lv_vector_gradient_t * grad_dsc = NULL; + lv_matrix_t * mtx = NULL; + + if(fill) { + dsc->fill_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + grad_dsc = &dsc->fill_dsc.gradient; + mtx = &dsc->fill_dsc.matrix; + } + else { + dsc->stroke_dsc.style = LV_VECTOR_DRAW_STYLE_GRADIENT; + grad_dsc = &dsc->stroke_dsc.gradient; + mtx = &dsc->stroke_dsc.matrix; + } + + if(grad->units == LV_SVG_GRADIENT_UNITS_USER_SPACE) { + lv_svg_render_obj_t * list = obj->head; + while(list) { + if(list->tag == LV_SVG_TAG_SVG) { + target_obj = list; /* viewport */ + break; + } + list = list->next; + } + } + + lv_memcpy(grad_dsc, &grad->dsc, sizeof(lv_vector_gradient_t)); + + lv_area_t bounds = {0, 0, 0, 0}; + target_obj->clz->get_bounds(target_obj, &bounds); + + int32_t w = bounds.x2 - bounds.x1; + int32_t h = bounds.y2 - bounds.y1; + if(grad->dsc.style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { + grad_dsc->cx = PCT_TO_PX(grad_dsc->cx, w); + grad_dsc->cy = PCT_TO_PX(grad_dsc->cy, h); + grad_dsc->cr = PCT_TO_PX(grad_dsc->cr, MAX(w, h)); + if(grad->units == LV_SVG_GRADIENT_UNITS_OBJECT) { + lv_matrix_translate(mtx, bounds.x1, bounds.y1); + } + } + else { /* LV_VECTOR_GRADIENT_STYLE_LINEAR */ + grad_dsc->x1 = PCT_TO_PX(grad_dsc->x1, w); + grad_dsc->y1 = PCT_TO_PX(grad_dsc->y1, h); + grad_dsc->x2 = PCT_TO_PX(grad_dsc->x2, w); + grad_dsc->y2 = PCT_TO_PX(grad_dsc->y2, h); + if(grad->units == LV_SVG_GRADIENT_UNITS_OBJECT) { + lv_matrix_translate(mtx, bounds.x1, bounds.y1); + } + } +} + +static void _init_draw_dsc(lv_vector_path_ctx_t * dsc) +{ + lv_vector_fill_dsc_t * fill_dsc = &(dsc->fill_dsc); + fill_dsc->style = LV_VECTOR_DRAW_STYLE_SOLID; + fill_dsc->color = lv_color_to_32(lv_color_black(), 0xFF); + fill_dsc->opa = LV_OPA_COVER; + fill_dsc->fill_rule = LV_VECTOR_FILL_NONZERO; + lv_matrix_identity(&(fill_dsc->matrix)); /* identity matrix */ + + lv_vector_stroke_dsc_t * stroke_dsc = &(dsc->stroke_dsc); + stroke_dsc->style = LV_VECTOR_DRAW_STYLE_SOLID; + stroke_dsc->color = lv_color_to_32(lv_color_black(), 0xFF); + stroke_dsc->opa = LV_OPA_0; /* default no stroke */ + stroke_dsc->width = 1.0f; + stroke_dsc->cap = LV_VECTOR_STROKE_CAP_BUTT; + stroke_dsc->join = LV_VECTOR_STROKE_JOIN_MITER; + stroke_dsc->miter_limit = 4.0f; + lv_matrix_identity(&(stroke_dsc->matrix)); + + dsc->blend_mode = LV_VECTOR_BLEND_SRC_OVER; + lv_matrix_identity(&(dsc->matrix)); +} + +static void _deinit_draw_dsc(lv_vector_path_ctx_t * dsc) +{ + lv_array_deinit(&(dsc->stroke_dsc.dash_pattern)); +} + +static void _copy_draw_dsc(lv_vector_path_ctx_t * dst, const lv_vector_path_ctx_t * src) +{ + lv_memcpy(&dst->fill_dsc, &src->fill_dsc, sizeof(lv_vector_fill_dsc_t)); + + dst->stroke_dsc.style = src->stroke_dsc.style; + dst->stroke_dsc.color = src->stroke_dsc.color; + dst->stroke_dsc.opa = src->stroke_dsc.opa; + dst->stroke_dsc.width = src->stroke_dsc.width; + dst->stroke_dsc.cap = src->stroke_dsc.cap; + dst->stroke_dsc.join = src->stroke_dsc.join; + dst->stroke_dsc.miter_limit = src->stroke_dsc.miter_limit; + lv_array_clear(&(dst->stroke_dsc.dash_pattern)); + lv_array_copy(&(dst->stroke_dsc.dash_pattern), &(src->stroke_dsc.dash_pattern)); + lv_memcpy(&(dst->stroke_dsc.gradient), &(src->stroke_dsc.gradient), sizeof(lv_vector_gradient_t)); + lv_memcpy(&(dst->stroke_dsc.matrix), &(src->stroke_dsc.matrix), sizeof(lv_matrix_t)); + + dst->blend_mode = src->blend_mode; +} + +static void _copy_draw_dsc_from_ref(lv_draw_vector_dsc_t * dsc, const lv_svg_render_obj_t * obj) +{ + lv_vector_path_ctx_t * dst = dsc->ctx; + if(obj->fill_ref) { + lv_svg_render_obj_t * list = obj->head; + while(list) { + if(list->id) { + if(strcmp(obj->fill_ref, list->id) == 0) { + list->clz->set_paint_ref(list, dst, obj, true); + break; + } + } + list = list->next; + } + } + + if(obj->stroke_ref) { + lv_svg_render_obj_t * list = obj->head; + while(list) { + if(list->id) { + if(strcmp(obj->stroke_ref, list->id) == 0) { + list->clz->set_paint_ref(list, dst, obj, false); + break; + } + } + list = list->next; + } + } +} + +static void _set_render_attrs(lv_svg_render_obj_t * obj, const lv_svg_node_t * node, + struct _lv_svg_drawing_builder_state * state) +{ + obj->tag = node->type; + if((node->type != LV_SVG_TAG_CONTENT) && node->xml_id) { + obj->id = lv_strdup(node->xml_id); + } + if(obj->clz->init) { + obj->clz->init(obj, node); + } + if(state->draw_dsc->fill_ref) { + obj->fill_ref = lv_strdup(state->draw_dsc->fill_ref); + } + if(state->draw_dsc->stroke_ref) { + obj->stroke_ref = lv_strdup(state->draw_dsc->stroke_ref); + } + + uint32_t len = lv_array_size(&node->attrs); + for(uint32_t i = 0; i < len; i++) { + lv_svg_attr_t * attr = lv_array_at(&node->attrs, i); + obj->clz->set_attr(obj, &(state->draw_dsc->dsc), attr); + } + if(node->type == LV_SVG_TAG_G) { /* only need store it */ + state->draw_dsc->fill_ref = obj->fill_ref; + state->draw_dsc->stroke_ref = obj->stroke_ref; + } + obj->head = state->list; +} + +/* init functions */ + +static void _init_obj(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + LV_UNUSED(node); + lv_matrix_identity(&obj->matrix); +} + +static void _init_viewport(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + _init_obj(obj, node); + lv_svg_render_viewport_t * view = (lv_svg_render_viewport_t *)obj; + view->viewport_fill = false; +} + +static void _init_group(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + _init_obj(obj, node); + lv_svg_render_group_t * group = (lv_svg_render_group_t *)obj; + lv_array_init(&group->items, LV_TREE_NODE(node)->child_cnt, sizeof(lv_svg_render_obj_t *)); +} + +static void _init_image(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + _init_obj(obj, node); + lv_svg_render_image_t * image = (lv_svg_render_image_t *)obj; + lv_draw_image_dsc_init(&image->img_dsc); + image->ratio = LV_SVG_ASPECT_RATIO_XMID_YMID | LV_SVG_ASPECT_RATIO_OPT_MEET; +} + +static void _init_poly(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + _init_obj(obj, node); + lv_svg_render_poly_t * poly = (lv_svg_render_poly_t *)obj; + poly->path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + lv_area_set(&poly->bounds, INT_MAX, INT_MAX, INT_MIN, INT_MIN); +} + +#if LV_USE_FREETYPE +static void _init_text(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + _init_obj(obj, node); + lv_svg_render_text_t * text = (lv_svg_render_text_t *)obj; + text->family = lv_strdup("sans-serif"); + text->size = 16.0f; + text->style = LV_FREETYPE_FONT_STYLE_NORMAL; + text->font = NULL; + text->x = text->y = 0.0f; + lv_array_init(&text->contents, LV_TREE_NODE(node)->child_cnt, sizeof(lv_svg_render_obj_t *)); + text->path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); +} + +static void _init_content(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + _init_obj(obj, node); + lv_svg_render_content_t * content = (lv_svg_render_content_t *)obj; + const char * str = node->xml_id; + content->count = lv_text_get_encoded_length(str); + content->letters = lv_malloc(sizeof(uint32_t) * content->count); + LV_ASSERT_MALLOC(content->letters); + uint32_t offset = 0; + for(uint32_t i = 0; i < content->count; i++) { + content->letters[i] = lv_text_encoded_next(str, &offset); + } +} + +static void _init_tspan(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + _init_obj(obj, node); + lv_svg_render_tspan_t * span = (lv_svg_render_tspan_t *)obj; + lv_svg_node_t * parent = LV_SVG_NODE(LV_TREE_NODE(node)->parent); + if(parent->type != LV_SVG_TAG_TEXT) { + return; + } + + lv_svg_render_text_t * text = (lv_svg_render_text_t *)parent->render_obj; + span->family = lv_strdup(text->family); + span->size = text->size; + span->style = text->style; + span->path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + + lv_svg_node_t * content_node = LV_SVG_NODE(LV_TREE_NODE(node)->children[0]); + _init_content(obj, content_node); +} +#endif + +static void _init_solid(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + _init_obj(obj, node); + lv_svg_render_solid_t * solid = (lv_svg_render_solid_t *)obj; + solid->opacity = 1.0f; +} + +static void _init_gradient(lv_svg_render_obj_t * obj, const lv_svg_node_t * node) +{ + _init_obj(obj, node); + lv_svg_render_gradient_t * grad = (lv_svg_render_gradient_t *)obj; + grad->units = LV_SVG_GRADIENT_UNITS_OBJECT; + grad->dsc.cx = 0.5f; + grad->dsc.cy = 0.5f; + grad->dsc.cr = 0.5f; + grad->dsc.x1 = 0.0f; + grad->dsc.y1 = 0.0f; + grad->dsc.x2 = 1.0f; + grad->dsc.y2 = 0.0f; + grad->dsc.spread = LV_VECTOR_GRADIENT_SPREAD_PAD; + + uint32_t count = LV_TREE_NODE(node)->child_cnt; + uint32_t stop_count = 0; + + for(uint32_t i = 0; i < count; i++) { + lv_svg_node_t * child_node = LV_SVG_NODE_CHILD(node, i); + uint32_t len = lv_array_size(&child_node->attrs); + + bool is_stop = false; + lv_color_t stop_color = lv_color_black(); + lv_opa_t stop_opa = LV_OPA_COVER; + uint8_t stop_frac = 0; + + for(uint32_t j = 0; j < len; j++) { + lv_svg_attr_t * attr = lv_array_at(&child_node->attrs, j); + switch(attr->id) { + case LV_SVG_ATTR_GRADIENT_STOP_COLOR: { + stop_color = lv_color_hex(attr->value.uval); + is_stop = true; + } + break; + case LV_SVG_ATTR_GRADIENT_STOP_OPACITY: { + stop_opa = (lv_opa_t)(attr->value.fval * 255.0f); + is_stop = true; + } + break; + case LV_SVG_ATTR_GRADIENT_STOP_OFFSET: { + stop_frac = (uint8_t)(attr->value.fval * 255.0f); + is_stop = true; + } + break; + } + } + + if(is_stop) { + grad->dsc.stops[stop_count].opa = stop_opa; + grad->dsc.stops[stop_count].frac = stop_frac; + grad->dsc.stops[stop_count].color = stop_color; + stop_count++; + } + + if(stop_count == LV_GRADIENT_MAX_STOPS) { + break; + } + } + grad->dsc.stops_count = stop_count; +} + +static void _setup_matrix(lv_matrix_t * matrix, lv_draw_vector_dsc_t * dsc, const lv_svg_render_obj_t * obj) +{ + lv_memcpy(matrix, &dsc->ctx->matrix, sizeof(lv_matrix_t)); + lv_matrix_multiply(&dsc->ctx->matrix, &obj->matrix); +} + +static void _restore_matrix(lv_matrix_t * matrix, lv_draw_vector_dsc_t * dsc) +{ + lv_memcpy(&dsc->ctx->matrix, matrix, sizeof(lv_matrix_t)); +} + +static void _prepare_render(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc) +{ + _copy_draw_dsc(dsc->ctx, &(obj->dsc)); +} + +static void _special_render(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc) +{ + const lv_vector_path_ctx_t * src = &(obj->dsc); + lv_vector_path_ctx_t * dst = dsc->ctx; + + if(obj->flags & _RENDER_ATTR_FILL) { + lv_memcpy(&(dst->fill_dsc), &(src->fill_dsc), sizeof(lv_vector_fill_dsc_t)); + dst->blend_mode = src->blend_mode; + } + + if(obj->flags & _RENDER_ATTR_FILL_OPACITY) { + dst->fill_dsc.opa = src->fill_dsc.opa; + } + + if(obj->flags & _RENDER_ATTR_FILL_RULE) { + dst->fill_dsc.fill_rule = src->fill_dsc.fill_rule; + } + + if(obj->flags & _RENDER_ATTR_STROKE) { + dst->stroke_dsc.style = src->stroke_dsc.style; + dst->stroke_dsc.color = src->stroke_dsc.color; + lv_memcpy(&(dst->stroke_dsc.gradient), &(src->stroke_dsc.gradient), sizeof(lv_vector_gradient_t)); + lv_memcpy(&(dst->stroke_dsc.matrix), &(src->stroke_dsc.matrix), sizeof(lv_matrix_t)); + dst->blend_mode = src->blend_mode; + } + + if(obj->flags & _RENDER_ATTR_STROKE_OPACITY) { + dst->stroke_dsc.opa = src->stroke_dsc.opa; + } + + if(obj->flags & _RENDER_ATTR_STROKE_WIDTH) { + dst->stroke_dsc.width = src->stroke_dsc.width; + } + if(obj->flags & _RENDER_ATTR_STROKE_LINECAP) { + dst->stroke_dsc.cap = src->stroke_dsc.cap; + } + if(obj->flags & _RENDER_ATTR_STROKE_LINEJOIN) { + dst->stroke_dsc.join = src->stroke_dsc.join; + } + if(obj->flags & _RENDER_ATTR_STROKE_MITER_LIMIT) { + dst->stroke_dsc.miter_limit = src->stroke_dsc.miter_limit; + } + if(obj->flags & _RENDER_ATTR_STROKE_DASH_ARRAY) { + lv_array_clear(&(dst->stroke_dsc.dash_pattern)); + lv_array_copy(&(dst->stroke_dsc.dash_pattern), &(src->stroke_dsc.dash_pattern)); + } +} + +/* render functions */ +static void _render_viewport(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + LV_UNUSED(matrix); + + lv_svg_render_viewport_t * view = (lv_svg_render_viewport_t *)obj; + lv_matrix_multiply(&dsc->ctx->matrix, &obj->matrix); + if(view->viewport_fill) { + lv_area_t rc = {0, 0, (int32_t)view->width, (int32_t)view->height}; + lv_vector_path_t * path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + lv_vector_path_append_rect(path, &rc, 0, 0); + lv_draw_vector_dsc_add_path(dsc, path); + lv_vector_path_delete(path); + } +} + +static void _render_rect(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_matrix_t mtx; + _setup_matrix(&mtx, dsc, obj); + + if(matrix) { + lv_matrix_multiply(&dsc->ctx->matrix, matrix); + } + + lv_svg_render_rect_t * rect = (lv_svg_render_rect_t *)obj; + + if(rect->rx > 0 && rect->ry == 0) rect->ry = rect->rx; + else if(rect->ry > 0 && rect->rx == 0) rect->rx = rect->ry; + + lv_vector_path_t * path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + lv_area_t rc = {(int32_t)rect->x, (int32_t)rect->y, (int32_t)(rect->x + rect->width - 1), (int32_t)(rect->y + rect->height - 1)}; + lv_vector_path_append_rect(path, &rc, rect->rx, rect->ry); + + _copy_draw_dsc_from_ref(dsc, obj); + lv_draw_vector_dsc_add_path(dsc, path); + lv_vector_path_delete(path); + + _restore_matrix(&mtx, dsc); +} + +static void _render_circle(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_matrix_t mtx; + _setup_matrix(&mtx, dsc, obj); + + if(matrix) { + lv_matrix_multiply(&dsc->ctx->matrix, matrix); + } + + lv_svg_render_circle_t * circle = (lv_svg_render_circle_t *)obj; + lv_vector_path_t * path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + lv_fpoint_t cp = {circle->cx, circle->cy}; + lv_vector_path_append_circle(path, &cp, circle->r, circle->r); + + _copy_draw_dsc_from_ref(dsc, obj); + lv_draw_vector_dsc_add_path(dsc, path); + lv_vector_path_delete(path); + + _restore_matrix(&mtx, dsc); +} + +static void _render_ellipse(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_matrix_t mtx; + _setup_matrix(&mtx, dsc, obj); + + if(matrix) { + lv_matrix_multiply(&dsc->ctx->matrix, matrix); + } + + lv_svg_render_ellipse_t * ellipse = (lv_svg_render_ellipse_t *)obj; + lv_vector_path_t * path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + lv_fpoint_t cp = {ellipse->cx, ellipse->cy}; + lv_vector_path_append_circle(path, &cp, ellipse->rx, ellipse->ry); + + _copy_draw_dsc_from_ref(dsc, obj); + lv_draw_vector_dsc_add_path(dsc, path); + lv_vector_path_delete(path); + + _restore_matrix(&mtx, dsc); +} + +static void _render_line(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_matrix_t mtx; + _setup_matrix(&mtx, dsc, obj); + + if(matrix) { + lv_matrix_multiply(&dsc->ctx->matrix, matrix); + } + + lv_svg_render_line_t * line = (lv_svg_render_line_t *)obj; + lv_vector_path_t * path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + lv_fpoint_t sp = {line->x1, line->y1}; + lv_vector_path_move_to(path, &sp); + lv_fpoint_t ep = {line->x2, line->y2}; + lv_vector_path_line_to(path, &ep); + + _copy_draw_dsc_from_ref(dsc, obj); + lv_draw_vector_dsc_add_path(dsc, path); + lv_vector_path_delete(path); + + _restore_matrix(&mtx, dsc); +} + +static void _render_poly(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_matrix_t mtx; + _setup_matrix(&mtx, dsc, obj); + + if(matrix) { + lv_matrix_multiply(&dsc->ctx->matrix, matrix); + } + + lv_svg_render_poly_t * poly = (lv_svg_render_poly_t *)obj; + + _copy_draw_dsc_from_ref(dsc, obj); + lv_draw_vector_dsc_add_path(dsc, poly->path); + + _restore_matrix(&mtx, dsc); +} + +static void _render_group(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_svg_render_group_t * group = (lv_svg_render_group_t *)obj; + lv_matrix_t mtx; + _setup_matrix(&mtx, dsc, obj); + + struct _lv_svg_draw_dsc save_dsc; + lv_memzero(&save_dsc, sizeof(struct _lv_svg_draw_dsc)); + + for(uint32_t i = 0; i < group->items.size; i++) { + lv_svg_render_obj_t * list = *((lv_svg_render_obj_t **)lv_array_at(&group->items, i)); + + if(list->clz->render && (list->flags & _RENDER_IN_GROUP)) { + _copy_draw_dsc(&(save_dsc.dsc), dsc->ctx); + _special_render(list, dsc); + list->clz->render(list, dsc, matrix); + _copy_draw_dsc(dsc->ctx, &(save_dsc.dsc)); + } + } + + _restore_matrix(&mtx, dsc); +} + +static void _render_image(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_matrix_t imtx; + _setup_matrix(&imtx, dsc, obj); + + if(matrix) { + lv_matrix_multiply(&dsc->ctx->matrix, matrix); + } + + lv_svg_render_image_t * image = (lv_svg_render_image_t *)obj; + if(!image->img_dsc.header.w || !image->img_dsc.header.h || !image->img_dsc.src) { + return; + } + + lv_vector_path_t * path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + lv_area_t rc = {(int32_t)image->x, (int32_t)image->y, (int32_t)(image->x + image->width - 1), (int32_t)(image->y + image->height - 1)}; + lv_vector_path_append_rect(path, &rc, 0, 0); + + lv_matrix_t mtx; + lv_matrix_identity(&mtx); + + float img_w = (float)image->img_dsc.header.w; + float img_h = (float)image->img_dsc.header.h; + float scale_x = image->width / img_w; + float scale_y = image->height / img_h; + float scale = 1.0f; + + if((image->ratio & 0x1) == LV_SVG_ASPECT_RATIO_OPT_SLICE) { + scale = MAX(scale_x, scale_y); + } + else if((image->ratio & 0x1) == LV_SVG_ASPECT_RATIO_OPT_MEET) { + scale = MIN(scale_x, scale_y); + } + + uint32_t align = image->ratio & ~0x1; + + switch(align) { + case LV_SVG_ASPECT_RATIO_NONE: + lv_matrix_scale(&mtx, scale_x, scale_y); + break; + case LV_SVG_ASPECT_RATIO_XMIN_YMIN: + lv_matrix_scale(&mtx, scale, scale); + break; + case LV_SVG_ASPECT_RATIO_XMID_YMIN: { + float tx = (image->width - img_w * scale) / 2; + lv_matrix_translate(&mtx, tx, 0); + lv_matrix_scale(&mtx, scale, scale); + } + break; + case LV_SVG_ASPECT_RATIO_XMAX_YMIN: { + float tx = image->width - img_w * scale; + lv_matrix_translate(&mtx, tx, 0); + lv_matrix_scale(&mtx, scale, scale); + } + break; + case LV_SVG_ASPECT_RATIO_XMIN_YMID: { + float ty = (image->height - img_h * scale) / 2; + lv_matrix_translate(&mtx, 0, ty); + lv_matrix_scale(&mtx, scale, scale); + } + break; + case LV_SVG_ASPECT_RATIO_XMID_YMID: { + float tx = (image->width - img_w * scale) / 2; + float ty = (image->height - img_h * scale) / 2; + lv_matrix_translate(&mtx, tx, ty); + lv_matrix_scale(&mtx, scale, scale); + } + break; + case LV_SVG_ASPECT_RATIO_XMAX_YMID: { + float tx = image->width - img_w * scale; + float ty = (image->height - img_h * scale) / 2; + lv_matrix_translate(&mtx, tx, ty); + lv_matrix_scale(&mtx, scale, scale); + } + break; + case LV_SVG_ASPECT_RATIO_XMIN_YMAX: { + float ty = image->height - img_h * scale; + lv_matrix_translate(&mtx, 0, ty); + lv_matrix_scale(&mtx, scale, scale); + } + break; + case LV_SVG_ASPECT_RATIO_XMID_YMAX: { + float tx = (image->width - img_w * scale) / 2; + float ty = image->height - img_h * scale; + lv_matrix_translate(&mtx, tx, ty); + lv_matrix_scale(&mtx, scale, scale); + } + break; + case LV_SVG_ASPECT_RATIO_XMAX_YMAX: { + float tx = image->width - img_w * scale; + float ty = image->height - img_h * scale; + lv_matrix_translate(&mtx, tx, ty); + lv_matrix_scale(&mtx, scale, scale); + } + break; + } + + lv_draw_vector_dsc_set_fill_transform(dsc, &mtx); + lv_draw_vector_dsc_set_fill_image(dsc, &image->img_dsc); + + _copy_draw_dsc_from_ref(dsc, obj); + lv_draw_vector_dsc_add_path(dsc, path); + lv_vector_path_delete(path); + + _restore_matrix(&imtx, dsc); +} + +static void _render_use(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + LV_UNUSED(matrix); + lv_matrix_t imtx; + _setup_matrix(&imtx, dsc, obj); + + lv_svg_render_use_t * use = (lv_svg_render_use_t *)obj; + + lv_matrix_t mtx; + lv_matrix_identity(&mtx); + lv_matrix_translate(&mtx, use->x, use->y); + + lv_svg_render_obj_t * list = obj->head; + while(list) { + if(list->id) { + if(strcmp(use->xlink, list->id) == 0) { + if(list->clz->render) { + _prepare_render(list, dsc); + _special_render(obj, dsc); + _copy_draw_dsc_from_ref(dsc, obj); + list->clz->render(list, dsc, &mtx); + } + break; + } + } + list = list->next; + } + + _restore_matrix(&imtx, dsc); +} + +#if LV_USE_FREETYPE +static bool _is_control_character(uint32_t ch) +{ + return ch == '\n' || ch == '\t' || ch == '\r'; +} + +static void _render_text(const lv_svg_render_obj_t * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix) +{ + lv_svg_render_text_t * text = (lv_svg_render_text_t *)obj; + if(!text->font) { + if(!hal_funcs.get_font_path) { + return; + } + const char * font_path = hal_funcs.get_font_path(text->family); + if(!font_path) { + return; + } + text->font = lv_freetype_font_create(font_path, LV_FREETYPE_FONT_RENDER_MODE_OUTLINE, (uint32_t)text->size, + text->style); + } + + if(!text->font || !lv_freetype_is_outline_font(text->font)) { + LV_LOG_ERROR("svg current font is not outline font!"); + return; + } + + lv_matrix_t tmtx; + _setup_matrix(&tmtx, dsc, obj); + + if(matrix) { + lv_matrix_multiply(&dsc->ctx->matrix, matrix); + } + + bool build_path = false; + if(lv_array_size(&text->path->ops) == 0) { /* empty path */ + build_path = true; + } + + /* draw text contents and spans */ + lv_matrix_t mtx; + lv_matrix_identity(&mtx); + lv_matrix_translate(&mtx, text->x, text->y); + for(uint32_t i = 0; i < lv_array_size(&text->contents); i++) { + lv_svg_render_obj_t * ptext = *((lv_svg_render_obj_t **)lv_array_at(&text->contents, i)); + lv_svg_render_content_t * content = (lv_svg_render_content_t *)ptext; + + if(content->render_content) { + content->render_content(content, dsc, &mtx); + } + else { + if(build_path) { + lv_vector_path_t * glyph_path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + + float scale = text->size / 128.0f; + for(uint32_t j = 0; j < content->count; j++) { + + uint32_t letter = content->letters[j]; + if(_is_control_character(letter)) { + continue; + } + lv_font_glyph_dsc_t g; + lv_font_get_glyph_dsc(text->font, &g, content->letters[j], '\0'); + lv_vector_path_t * p = (lv_vector_path_t *)lv_font_get_glyph_bitmap(&g, NULL); + lv_vector_path_clear(glyph_path); + lv_vector_path_copy(glyph_path, p); + uint32_t letter_w = g.box_w > 0 ? g.box_w : g.adv_w; + + lv_matrix_t scale_matrix = mtx; + lv_matrix_translate(&mtx, g.ofs_x, 0); + lv_matrix_scale(&scale_matrix, scale, scale); + lv_matrix_transform_path(&scale_matrix, glyph_path); + + lv_vector_path_append_path(text->path, glyph_path); + text->font->release_glyph(text->font, &g); + lv_matrix_translate(&mtx, letter_w, 0); + } + + lv_vector_path_delete(glyph_path); + lv_vector_path_get_bounding(text->path, &text->bounds); + } + } + } + + _copy_draw_dsc_from_ref(dsc, obj); + lv_draw_vector_dsc_add_path(dsc, text->path); + + _restore_matrix(&tmtx, dsc); +} + +static void _render_span(const lv_svg_render_content_t * content, lv_draw_vector_dsc_t * dsc, lv_matrix_t * matrix) +{ + lv_svg_render_obj_t * obj = (lv_svg_render_obj_t *)content; + + lv_svg_render_tspan_t * span = (lv_svg_render_tspan_t *)content; + if(!span->font) { + if(!hal_funcs.get_font_path) { + return; + } + const char * font_path = hal_funcs.get_font_path(span->family); + if(!font_path) { + return; + } + span->font = lv_freetype_font_create(font_path, LV_FREETYPE_FONT_RENDER_MODE_OUTLINE, (uint32_t)span->size, + span->style); + } + + if(!span->font || !lv_freetype_is_outline_font(span->font)) { + LV_LOG_ERROR("svg current font is not outline font!"); + return; + } + + struct _lv_svg_draw_dsc save_dsc; + lv_memzero(&save_dsc, sizeof(struct _lv_svg_draw_dsc)); + _copy_draw_dsc(&(save_dsc.dsc), dsc->ctx); + + _copy_draw_dsc(dsc->ctx, &(obj->dsc)); + + if(lv_array_size(&span->path->ops) == 0) { /* empty path */ + lv_vector_path_t * glyph_path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + /* draw text contents and spans */ + lv_matrix_t * mtx = matrix; + + float scale = span->size / 128.0f; + for(uint32_t j = 0; j < content->count; j++) { + + uint32_t letter = content->letters[j]; + if(_is_control_character(letter)) { + continue; + } + lv_font_glyph_dsc_t g; + lv_font_get_glyph_dsc(span->font, &g, content->letters[j], '\0'); + lv_vector_path_t * p = (lv_vector_path_t *)lv_font_get_glyph_bitmap(&g, NULL); + lv_vector_path_clear(glyph_path); + lv_vector_path_copy(glyph_path, p); + uint32_t letter_w = g.box_w > 0 ? g.box_w : g.adv_w; + + lv_matrix_t scale_matrix = *mtx; + lv_matrix_translate(mtx, g.ofs_x, 0); + lv_matrix_scale(&scale_matrix, scale, scale); + lv_matrix_transform_path(&scale_matrix, glyph_path); + + lv_vector_path_append_path(span->path, glyph_path); + span->font->release_glyph(span->font, &g); + lv_matrix_translate(mtx, letter_w, 0); + } + lv_vector_path_delete(glyph_path); + lv_vector_path_get_bounding(span->path, &span->bounds); + } + _copy_draw_dsc_from_ref(dsc, obj); + lv_draw_vector_dsc_add_path(dsc, span->path); + + _copy_draw_dsc(dsc->ctx, &(save_dsc.dsc)); +} +#endif + +/* get bounds functions */ + +static void _get_viewport_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_viewport_t * viewport = (lv_svg_render_viewport_t *)obj; + area->x1 = 0; + area->y1 = 0; + area->x2 = (int32_t)roundf(viewport->width); + area->y2 = (int32_t)roundf(viewport->height); +} + +static void _get_rect_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_rect_t * rect = (lv_svg_render_rect_t *)obj; + area->x1 = (int32_t)rect->x; + area->y1 = (int32_t)rect->y; + area->x2 = (int32_t)(rect->x + rect->width); + area->y2 = (int32_t)(rect->y + rect->height); +} + +static void _get_circle_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_circle_t * circle = (lv_svg_render_circle_t *)obj; + area->x1 = (int32_t)(circle->cx - circle->r); + area->y1 = (int32_t)(circle->cy - circle->r); + area->x2 = (int32_t)(circle->cx + circle->r); + area->y2 = (int32_t)(circle->cy + circle->r); +} + +static void _get_ellipse_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_ellipse_t * ellipse = (lv_svg_render_ellipse_t *)obj; + area->x1 = (int32_t)(ellipse->cx - ellipse->rx); + area->y1 = (int32_t)(ellipse->cy - ellipse->ry); + area->x2 = (int32_t)(ellipse->cx + ellipse->rx); + area->y2 = (int32_t)(ellipse->cy + ellipse->ry); +} + +static void _get_line_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_line_t * line = (lv_svg_render_line_t *)obj; + area->x1 = (int32_t)(line->x1); + area->y1 = (int32_t)(line->y1); + area->x2 = (int32_t)(line->x2); + area->y2 = (int32_t)(line->y2); +} + +static void _get_poly_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_poly_t * poly = (lv_svg_render_poly_t *)obj; + lv_area_copy(area, &poly->bounds); +} + +static void _get_group_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_group_t * group = (lv_svg_render_group_t *)obj; + + int32_t x1 = 0; + int32_t y1 = 0; + int32_t x2 = 0; + int32_t y2 = 0; + + for(uint32_t i = 0; i < group->items.size; i++) { + lv_svg_render_obj_t * list = *((lv_svg_render_obj_t **)lv_array_at(&group->items, i)); + + lv_area_t tc = {0}; + if(list->clz->get_bounds) { + list->clz->get_bounds(list, &tc); + + x1 = MIN(tc.x1, x1); + y1 = MIN(tc.y1, y1); + x2 = MAX(tc.x2, x2); + y2 = MAX(tc.y2, y2); + } + } + + area->x1 = x1; + area->y1 = y1; + area->x2 = x2; + area->y2 = y2; +} + +static void _get_use_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_use_t * use = (lv_svg_render_use_t *)obj; + + lv_svg_render_obj_t * list = obj->head; + while(list) { + if(list->id && strcmp(use->xlink, list->id) == 0) { + if(list->clz->get_bounds) { + list->clz->get_bounds(list, area); + } + break; + } + list = list->next; + } +} + +#if LV_USE_FREETYPE +static void _get_text_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_text_t * text = (lv_svg_render_text_t *)obj; + lv_area_copy(area, &text->bounds); +} + +static void _get_tspan_bounds(const lv_svg_render_obj_t * obj, lv_area_t * area) +{ + lv_svg_render_tspan_t * tspan = (lv_svg_render_tspan_t *)obj; + lv_area_copy(area, &tspan->bounds); +} +#endif + +/* get size fucctions */ +static uint32_t _calc_path_data_size(lv_vector_path_t * path) +{ + uint32_t size = 0; + size += path->ops.capacity * path->ops.element_size; + size += path->points.capacity * path->points.element_size; + size += sizeof(int32_t); + return size; +} + +static void _get_obj_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + *size += sizeof(lv_svg_render_obj_t); + if(obj->id) { + *size += strlen(obj->id); + } + if(obj->fill_ref) { + *size += strlen(obj->fill_ref); + } + if(obj->stroke_ref) { + *size += strlen(obj->stroke_ref); + } +} + +static void _get_viewport_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + *size += sizeof(float) * 2; + *size += sizeof(bool); +} + +static void _get_rect_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + *size += sizeof(float) * 6; +} + +static void _get_circle_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + *size += sizeof(float) * 3; +} + +static void _get_ellipse_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + *size += sizeof(float) * 4; +} + +static void _get_line_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + *size += sizeof(float) * 4; +} + +static void _get_poly_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + lv_svg_render_poly_t * poly = (lv_svg_render_poly_t *)obj; + lv_vector_path_t * path = poly->path; + + *size += _calc_path_data_size(path); + *size += sizeof(lv_vector_path_t); + *size += sizeof(lv_area_t); + *size += sizeof(void *); +} + +static void _get_use_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + lv_svg_render_use_t * use = (lv_svg_render_use_t *)obj; + if(use->xlink) { + *size += lv_strlen(use->xlink); + } + *size += sizeof(float) * 2; + *size += sizeof(void *); + +} + +static void _get_image_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + *size += sizeof(lv_draw_image_dsc_t); + *size += sizeof(lv_svg_aspect_ratio_t); + *size += sizeof(float) * 4; +} + +static void _get_solid_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + *size += sizeof(lv_color_t); + *size += sizeof(float); +} + +static void _get_grad_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + *size += sizeof(lv_vector_gradient_t); + *size += sizeof(lv_svg_gradient_units_t); +} + +#if LV_USE_FREETYPE +static void _get_span_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + lv_svg_render_tspan_t * span = (lv_svg_render_tspan_t *)obj; + if(span->family) { + *size += lv_strlen(span->family); + } + + *size += _calc_path_data_size(span->path); + *size += sizeof(float); + *size += sizeof(lv_freetype_font_style_t); + *size += sizeof(lv_vector_path_t); + *size += sizeof(lv_area_t); + *size += sizeof(void *) * 3; +} + +static void _get_txt_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + lv_svg_render_text_t * txt = (lv_svg_render_text_t *)obj; + if(txt->family) { + *size += lv_strlen(txt->family); + } + + *size += lv_array_capacity(&txt->contents) * sizeof(void *); + *size += _calc_path_data_size(txt->path); + *size += sizeof(float) * 3; + *size += sizeof(lv_freetype_font_style_t); + *size += sizeof(lv_vector_path_t); + *size += sizeof(lv_area_t); + *size += sizeof(void *) * 3; +} + +static void _get_content_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + lv_svg_render_content_t * content = (lv_svg_render_content_t *)obj; + *size += sizeof(uint32_t) * (content->count + 1); +} +#endif + +static void _get_group_size(const struct _lv_svg_render_obj * obj, uint32_t * size) +{ + _get_obj_size(obj, size); + lv_svg_render_group_t * group = (lv_svg_render_group_t *)obj; + *size += lv_array_capacity(&group->items) * sizeof(void *); +} + +/* destroy functions */ +static void _destroy_poly(lv_svg_render_obj_t * obj) +{ + lv_svg_render_poly_t * poly = (lv_svg_render_poly_t *)obj; + lv_vector_path_delete(poly->path); +} + +static void _destroy_use(lv_svg_render_obj_t * obj) +{ + lv_svg_render_use_t * use = (lv_svg_render_use_t *)obj; + if(use->xlink) { + lv_free(use->xlink); + } +} + +static void _destroy_group(lv_svg_render_obj_t * obj) +{ + lv_svg_render_group_t * group = (lv_svg_render_group_t *)obj; + lv_array_deinit(&group->items); +} + +#if LV_USE_FREETYPE +static void _destroy_text(lv_svg_render_obj_t * obj) +{ + lv_svg_render_text_t * text = (lv_svg_render_text_t *)obj; + if(text->font) { + lv_freetype_font_delete(text->font); + } + if(text->family) { + lv_free(text->family); + } + lv_array_deinit(&text->contents); + lv_vector_path_delete(text->path); +} + +static void _destroy_content(lv_svg_render_obj_t * obj) +{ + lv_svg_render_content_t * content = (lv_svg_render_content_t *)obj; + if(content->letters) { + lv_free(content->letters); + } +} + +static void _destroy_tspan(lv_svg_render_obj_t * obj) +{ + lv_svg_render_tspan_t * span = (lv_svg_render_tspan_t *)obj; + if(span->font) { + lv_freetype_font_delete(span->font); + } + + if(span->family) { + lv_free(span->family); + } + + _destroy_content(obj); + lv_vector_path_delete(span->path); +} + +#endif + +static lv_svg_render_class svg_viewport_class = { + .init = _init_viewport, + .render = _render_viewport, + .set_attr = _set_viewport_attr, + .get_bounds = _get_viewport_bounds, + .get_size = _get_viewport_size, +}; + +static lv_svg_render_class svg_rect_class = { + .init = _init_obj, + .render = _render_rect, + .set_attr = _set_rect_attr, + .get_bounds = _get_rect_bounds, + .get_size = _get_rect_size, +}; + +static lv_svg_render_class svg_circle_class = { + .init = _init_obj, + .render = _render_circle, + .set_attr = _set_circle_attr, + .get_bounds = _get_circle_bounds, + .get_size = _get_circle_size, +}; + +static lv_svg_render_class svg_ellipse_class = { + .init = _init_obj, + .render = _render_ellipse, + .set_attr = _set_ellipse_attr, + .get_bounds = _get_ellipse_bounds, + .get_size = _get_ellipse_size, +}; + +static lv_svg_render_class svg_line_class = { + .init = _init_obj, + .render = _render_line, + .set_attr = _set_line_attr, + .get_bounds = _get_line_bounds, + .get_size = _get_line_size, +}; + +static lv_svg_render_class svg_polyline_class = { + .init = _init_poly, + .render = _render_poly, + .set_attr = _set_polyline_attr, + .get_bounds = _get_poly_bounds, + .destroy = _destroy_poly, + .get_size = _get_poly_size, +}; + +static lv_svg_render_class svg_polygon_class = { + .init = _init_poly, + .render = _render_poly, + .set_attr = _set_polygon_attr, + .get_bounds = _get_poly_bounds, + .destroy = _destroy_poly, + .get_size = _get_poly_size, +}; + +static lv_svg_render_class svg_path_class = { + .init = _init_poly, + .render = _render_poly, + .set_attr = _set_path_attr, + .get_bounds = _get_poly_bounds, + .destroy = _destroy_poly, + .get_size = _get_poly_size, +}; + +#if LV_USE_FREETYPE +static lv_svg_render_class svg_text_class = { + .init = _init_text, + .set_attr = _set_text_attr, + .render = _render_text, + .get_bounds = _get_text_bounds, + .destroy = _destroy_text, + .get_size = _get_txt_size, +}; + +static lv_svg_render_class svg_tspan_class = { + .init = _init_tspan, + .set_attr = _set_tspan_attr, + .get_bounds = _get_tspan_bounds, + .destroy = _destroy_tspan, + .get_size = _get_span_size, +}; + +static lv_svg_render_class svg_content_class = { + .init = _init_content, + .destroy = _destroy_content, + .get_size = _get_content_size, +}; +#endif + +static lv_svg_render_class svg_image_class = { + .init = _init_image, + .render = _render_image, + .set_attr = _set_image_attr, + .get_size = _get_image_size, +}; + +static lv_svg_render_class svg_use_class = { + .init = _init_obj, + .set_attr = _set_use_attr, + .render = _render_use, + .destroy = _destroy_use, + .get_bounds = _get_use_bounds, + .get_size = _get_use_size, +}; + +static lv_svg_render_class svg_solid_class = { + .init = _init_solid, + .set_attr = _set_solid_attr, + .set_paint_ref = _set_solid_ref, + .get_size = _get_solid_size, +}; + +static lv_svg_render_class svg_grad_class = { + .init = _init_gradient, + .set_attr = _set_gradient_attr, + .set_paint_ref = _set_gradient_ref, + .get_size = _get_grad_size, +}; + +static lv_svg_render_class svg_group_class = { + .init = _init_group, + .set_attr = _set_attr, + .render = _render_group, + .destroy = _destroy_group, + .get_bounds = _get_group_bounds, + .get_size = _get_group_size, +}; + +static lv_svg_render_obj_t * _lv_svg_render_create(const lv_svg_node_t * node, + struct _lv_svg_drawing_builder_state * state) +{ + switch(node->type) { + case LV_SVG_TAG_SVG: { + lv_svg_render_viewport_t * view = lv_zalloc(sizeof(lv_svg_render_viewport_t)); + LV_ASSERT_MALLOC(view); + view->base.clz = &svg_viewport_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(view), node, state); + return LV_SVG_RENDER_OBJ(view); + } + case LV_SVG_TAG_RECT: { + lv_svg_render_rect_t * rect = lv_zalloc(sizeof(lv_svg_render_rect_t)); + LV_ASSERT_MALLOC(rect); + rect->base.clz = &svg_rect_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(rect), node, state); + return LV_SVG_RENDER_OBJ(rect); + } + case LV_SVG_TAG_CIRCLE: { + lv_svg_render_circle_t * circle = lv_zalloc(sizeof(lv_svg_render_circle_t)); + LV_ASSERT_MALLOC(circle); + circle->base.clz = &svg_circle_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(circle), node, state); + return LV_SVG_RENDER_OBJ(circle); + } + case LV_SVG_TAG_ELLIPSE: { + lv_svg_render_ellipse_t * ellipse = lv_zalloc(sizeof(lv_svg_render_ellipse_t)); + LV_ASSERT_MALLOC(ellipse); + ellipse->base.clz = &svg_ellipse_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(ellipse), node, state); + return LV_SVG_RENDER_OBJ(ellipse); + } + case LV_SVG_TAG_LINE: { + lv_svg_render_line_t * line = lv_zalloc(sizeof(lv_svg_render_line_t)); + LV_ASSERT_MALLOC(line); + line->base.clz = &svg_line_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(line), node, state); + return LV_SVG_RENDER_OBJ(line); + } + case LV_SVG_TAG_POLYLINE: { + lv_svg_render_poly_t * poly = lv_zalloc(sizeof(lv_svg_render_poly_t)); + LV_ASSERT_MALLOC(poly); + poly->base.clz = &svg_polyline_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(poly), node, state); + return LV_SVG_RENDER_OBJ(poly); + } + case LV_SVG_TAG_POLYGON: { + lv_svg_render_poly_t * poly = lv_zalloc(sizeof(lv_svg_render_poly_t)); + LV_ASSERT_MALLOC(poly); + poly->base.clz = &svg_polygon_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(poly), node, state); + return LV_SVG_RENDER_OBJ(poly); + } + case LV_SVG_TAG_PATH: { + lv_svg_render_poly_t * poly = lv_zalloc(sizeof(lv_svg_render_poly_t)); + LV_ASSERT_MALLOC(poly); + poly->base.clz = &svg_path_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(poly), node, state); + return LV_SVG_RENDER_OBJ(poly); + } +#if LV_USE_FREETYPE + case LV_SVG_TAG_TEXT: { + lv_svg_render_text_t * txt = lv_zalloc(sizeof(lv_svg_render_text_t)); + LV_ASSERT_MALLOC(txt); + txt->base.clz = &svg_text_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(txt), node, state); + return LV_SVG_RENDER_OBJ(txt); + } + case LV_SVG_TAG_TSPAN: { + lv_svg_render_tspan_t * span = lv_zalloc(sizeof(lv_svg_render_tspan_t)); + LV_ASSERT_MALLOC(span); + lv_svg_render_content_t * content = (lv_svg_render_content_t *)span; + content->render_content = _render_span; + content->base.clz = &svg_tspan_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(span), node, state); + return LV_SVG_RENDER_OBJ(span); + } + case LV_SVG_TAG_CONTENT: { + lv_svg_render_content_t * content = lv_zalloc(sizeof(lv_svg_render_content_t)); + LV_ASSERT_MALLOC(content); + content->base.clz = &svg_content_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(content), node, state); + return LV_SVG_RENDER_OBJ(content); + } +#endif + case LV_SVG_TAG_IMAGE: { + lv_svg_render_image_t * image = lv_zalloc(sizeof(lv_svg_render_image_t)); + LV_ASSERT_MALLOC(image); + image->base.clz = &svg_image_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(image), node, state); + return LV_SVG_RENDER_OBJ(image); + } + case LV_SVG_TAG_USE: { + lv_svg_render_use_t * use = lv_zalloc(sizeof(lv_svg_render_use_t)); + LV_ASSERT_MALLOC(use); + use->base.clz = &svg_use_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(use), node, state); + return LV_SVG_RENDER_OBJ(use); + } + case LV_SVG_TAG_SOLID_COLOR: { + lv_svg_render_solid_t * solid = lv_zalloc(sizeof(lv_svg_render_solid_t)); + LV_ASSERT_MALLOC(solid); + solid->base.clz = &svg_solid_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(solid), node, state); + return LV_SVG_RENDER_OBJ(solid); + } + case LV_SVG_TAG_RADIAL_GRADIENT: + case LV_SVG_TAG_LINEAR_GRADIENT: { + lv_svg_render_gradient_t * grad = lv_zalloc(sizeof(lv_svg_render_gradient_t)); + LV_ASSERT_MALLOC(grad); + grad->base.clz = &svg_grad_class; + if(node->type == LV_SVG_TAG_LINEAR_GRADIENT) { + grad->dsc.style = LV_VECTOR_GRADIENT_STYLE_LINEAR; + } + else { /* radial gradient */ + grad->dsc.style = LV_VECTOR_GRADIENT_STYLE_RADIAL; + } + _set_render_attrs(LV_SVG_RENDER_OBJ(grad), node, state); + return LV_SVG_RENDER_OBJ(grad); + } + case LV_SVG_TAG_G: { + lv_svg_render_group_t * group = lv_zalloc(sizeof(lv_svg_render_group_t)); + LV_ASSERT_MALLOC(group); + group->base.clz = &svg_group_class; + _set_render_attrs(LV_SVG_RENDER_OBJ(group), node, state); + return LV_SVG_RENDER_OBJ(group); + } + default: + return NULL; + } +} + +static bool _lv_svg_doc_walk_cb(const lv_tree_node_t * node, void * data) +{ + struct _lv_svg_drawing_builder_state * state = (struct _lv_svg_drawing_builder_state *)data; + lv_svg_render_obj_t * obj = _lv_svg_render_create(LV_SVG_NODE(node), state); + if(!obj) { + return true; + } + + if(state->in_defs) { + obj->flags |= _RENDER_IN_DEFS; + } + if(state->in_group_deps > 0) { + obj->flags |= _RENDER_IN_GROUP; + } + + if(state->list == NULL) { + state->list = obj; + state->tail = obj; + } + else { + state->tail->next = obj; + state->tail = obj; + } + LV_SVG_NODE(node)->render_obj = obj; + return true; +} + +static bool _lv_svg_doc_walk_before_cb(const lv_tree_node_t * node, void * data) +{ + struct _lv_svg_drawing_builder_state * state = (struct _lv_svg_drawing_builder_state *)data; + lv_svg_node_t * svg_node = LV_SVG_NODE(node); +#if LV_USE_FREETYPE + if(svg_node->type == LV_SVG_TAG_TEXT) { + state->in_text = true; + state->cur_text = svg_node; + } +#endif + if(svg_node->type == LV_SVG_TAG_DEFS) { + state->in_defs = true; + } + + if(svg_node->type == LV_SVG_TAG_G) { + state->in_group_deps++; + } + state->draw_dsc = _lv_svg_draw_dsc_push(state->draw_dsc); + return true; +} + +static void _lv_svg_doc_walk_after_cb(const lv_tree_node_t * node, void * data) +{ + struct _lv_svg_drawing_builder_state * state = (struct _lv_svg_drawing_builder_state *)data; + lv_svg_node_t * svg_node = LV_SVG_NODE(node); + if(svg_node->render_obj) { + _copy_draw_dsc(&(LV_SVG_NODE(node)->render_obj->dsc), &(state->draw_dsc->dsc)); + } +#if LV_USE_FREETYPE + if(state->in_text) { + if(svg_node->type == LV_SVG_TAG_TSPAN || svg_node->type == LV_SVG_TAG_CONTENT) { + if(LV_TREE_NODE(svg_node)->parent == LV_TREE_NODE(state->cur_text)) { + lv_svg_render_text_t * text = (lv_svg_render_text_t *)state->cur_text->render_obj; + if((lv_array_size(&text->contents) + 1) > lv_array_capacity(&text->contents)) { + lv_array_resize(&text->contents, text->contents.capacity << 1); + } + lv_array_push_back(&text->contents, (uint8_t *)(&svg_node->render_obj)); + } + } + } + if(svg_node->type == LV_SVG_TAG_TEXT) { + state->in_text = false; + state->cur_text = NULL; + } +#endif + if(svg_node->type == LV_SVG_TAG_G) { + lv_svg_render_group_t * group = (lv_svg_render_group_t *)svg_node->render_obj; + uint32_t count = LV_TREE_NODE(node)->child_cnt; + for(uint32_t i = 0; i < count; i++) { + lv_svg_node_t * child = LV_SVG_NODE_CHILD(node, i); + if(child->render_obj) { /* not defs */ + lv_array_push_back(&group->items, (uint8_t *)(&child->render_obj)); + } + } + + state->in_group_deps--; + if(state->in_group_deps == 0) { + group->base.flags &= ~_RENDER_IN_GROUP; + } + } + if(svg_node->type == LV_SVG_TAG_DEFS) { + state->in_defs = false; + } + state->draw_dsc = _lv_svg_draw_dsc_pop(state->draw_dsc); +} + +#if LV_USE_FREETYPE +static void _freetype_outline_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_freetype_outline_event_param_t * param = lv_event_get_param(e); + switch(code) { + case LV_EVENT_CREATE: + param->outline = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + break; + case LV_EVENT_DELETE: + lv_vector_path_delete(param->outline); + break; + case LV_EVENT_INSERT: { + if(param->type == LV_FREETYPE_OUTLINE_MOVE_TO) { + lv_fpoint_t pt = {0}; + pt.x = LV_FREETYPE_F26DOT6_TO_FLOAT(param->to.x); + pt.y = -LV_FREETYPE_F26DOT6_TO_FLOAT(param->to.y); + lv_vector_path_move_to(param->outline, &pt); + } + else if(param->type == LV_FREETYPE_OUTLINE_LINE_TO) { + lv_fpoint_t pt = {0}; + pt.x = LV_FREETYPE_F26DOT6_TO_FLOAT(param->to.x); + pt.y = -LV_FREETYPE_F26DOT6_TO_FLOAT(param->to.y); + lv_vector_path_line_to(param->outline, &pt); + } + else if(param->type == LV_FREETYPE_OUTLINE_CUBIC_TO) { + lv_fpoint_t pt[3] = {0}; + pt[0].x = LV_FREETYPE_F26DOT6_TO_FLOAT(param->control1.x); + pt[0].y = -LV_FREETYPE_F26DOT6_TO_FLOAT(param->control1.y); + pt[1].x = LV_FREETYPE_F26DOT6_TO_FLOAT(param->control2.x); + pt[1].y = -LV_FREETYPE_F26DOT6_TO_FLOAT(param->control2.y); + pt[2].x = LV_FREETYPE_F26DOT6_TO_FLOAT(param->to.x); + pt[2].y = -LV_FREETYPE_F26DOT6_TO_FLOAT(param->to.y); + lv_vector_path_cubic_to(param->outline, &pt[0], &pt[1], &pt[2]); + } + else if(param->type == LV_FREETYPE_OUTLINE_CONIC_TO) { + lv_fpoint_t pt[2] = {0}; + pt[0].x = LV_FREETYPE_F26DOT6_TO_FLOAT(param->control1.x); + pt[0].y = -LV_FREETYPE_F26DOT6_TO_FLOAT(param->control1.y); + pt[1].x = LV_FREETYPE_F26DOT6_TO_FLOAT(param->to.x); + pt[1].y = -LV_FREETYPE_F26DOT6_TO_FLOAT(param->to.y); + lv_vector_path_quad_to(param->outline, &pt[0], &pt[1]); + } + else if(param->type == LV_FREETYPE_OUTLINE_END) { + lv_vector_path_close(param->outline); + } + } + break; + default: + LV_LOG_WARN("unknown event code: %d", code); + break; + } +} +#endif +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_svg_render_obj_t * lv_svg_render_create(const lv_svg_node_t * svg_doc) +{ + if(!svg_doc) { + return NULL; + } + + struct _lv_svg_draw_dsc * dsc = _lv_svg_draw_dsc_create(); + struct _lv_svg_drawing_builder_state state = { + .doc = svg_doc, + .draw_dsc = dsc, + .in_group_deps = 0, + .in_defs = false, +#if LV_USE_FREETYPE + .in_text = false, + .cur_text = NULL, +#endif + .list = NULL, .tail = NULL + }; + + lv_tree_walk(LV_TREE_NODE(svg_doc), LV_TREE_WALK_PRE_ORDER, _lv_svg_doc_walk_cb, _lv_svg_doc_walk_before_cb, + _lv_svg_doc_walk_after_cb, &state); + _lv_svg_draw_dsc_delete(dsc); + return state.list; +} + +void lv_svg_render_delete(lv_svg_render_obj_t * list) +{ + while(list) { + lv_svg_render_obj_t * obj = list; + list = list->next; + + _deinit_draw_dsc(&(obj->dsc)); + + if(obj->clz->destroy) { + obj->clz->destroy(obj); + } + if(obj->id) { + lv_free(obj->id); + } + if(obj->fill_ref) { + lv_free(obj->fill_ref); + } + if(obj->stroke_ref) { + lv_free(obj->stroke_ref); + } + lv_free(obj); + } +} + +uint32_t lv_svg_render_get_size(const lv_svg_render_obj_t * render) +{ + if(!render) { + return 0; + } + + uint32_t size = 0; + const lv_svg_render_obj_t * cur = render; + while(cur) { + if(cur->clz->get_size) { + cur->clz->get_size(cur, &size); + } + cur = cur->next; + } + return size; +} + +lv_result_t lv_svg_render_get_viewport_size(const lv_svg_render_obj_t * render, float * width, float * height) +{ + if(!render) { + LV_LOG_WARN("Invalid render object"); + return LV_RESULT_INVALID; + } + + if(render->clz != &svg_viewport_class) { + LV_LOG_WARN("Invalid render object type"); + return LV_RESULT_INVALID; + } + const lv_svg_render_viewport_t * cur = (const lv_svg_render_viewport_t *)render; + if(width) { + *width = cur->width; + } + if(height) { + *height = cur->height; + } + return LV_RESULT_OK; +} + +void lv_draw_svg_render(lv_draw_vector_dsc_t * dsc, const lv_svg_render_obj_t * render) +{ + if(!render || !dsc) { + return; + } + + const lv_svg_render_obj_t * cur = render; + while(cur) { + if(cur->clz->render && ((cur->flags & 3) == _RENDER_NORMAL)) { + _prepare_render(cur, dsc); + cur->clz->render(cur, dsc, NULL); + } + cur = cur->next; + } +} + +void lv_draw_svg(lv_layer_t * layer, const lv_svg_node_t * svg_doc) +{ + if(!svg_doc) { + return; + } + + lv_draw_vector_dsc_t * dsc = lv_draw_vector_dsc_create(layer); + lv_svg_render_obj_t * list = lv_svg_render_create(svg_doc); + lv_draw_svg_render(dsc, list); + lv_draw_vector(dsc); + lv_svg_render_delete(list); + lv_draw_vector_dsc_delete(dsc); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +#endif /*LV_USE_SVG*/ diff --git a/inc/lvgl/src/libs/svg/lv_svg_render.h b/inc/lvgl/src/libs/svg/lv_svg_render.h new file mode 100644 index 0000000..e2578bf --- /dev/null +++ b/inc/lvgl/src/libs/svg/lv_svg_render.h @@ -0,0 +1,125 @@ +/** + * @file lv_svg_render.h + * + */ + +#ifndef LV_SVG_RENDER_H +#define LV_SVG_RENDER_H + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_SVG +#if !LV_USE_VECTOR_GRAPHIC + #error "LV_USE_SVG requires LV_USE_VECTOR_GRAPHIC = 1" +#endif + +#include "lv_svg.h" +#include "../../misc/lv_types.h" +#include "../../draw/lv_draw_vector_private.h" + +/********************* + * DEFINES + *********************/ + +#define LV_SVG_RENDER_OBJ(n) ((lv_svg_render_obj_t*)(n)) + +/********************** + * TYPEDEFS + **********************/ +struct _lv_svg_render_class; + +typedef struct _lv_svg_render_obj { + struct _lv_svg_render_obj * next; + lv_svg_tag_t tag; + uint32_t flags; + char * id; + lv_vector_path_ctx_t dsc; + lv_matrix_t matrix; + + /* for url(XXX) reference */ + struct _lv_svg_render_obj * head; + char * fill_ref; + char * stroke_ref; + struct _lv_svg_render_class * clz; +} lv_svg_render_obj_t; + +typedef struct _lv_svg_render_class { + void (*set_paint_ref)(struct _lv_svg_render_obj * obj, lv_vector_path_ctx_t * dsc, + const struct _lv_svg_render_obj * target_obj, bool fill); + + void (*init)(struct _lv_svg_render_obj * obj, const lv_svg_node_t * node); + void (*render)(const struct _lv_svg_render_obj * obj, lv_draw_vector_dsc_t * dsc, const lv_matrix_t * matrix); + void (*set_attr)(struct _lv_svg_render_obj * obj, lv_vector_path_ctx_t * dsc, const lv_svg_attr_t * attr); + void (*get_bounds)(const struct _lv_svg_render_obj * obj, lv_area_t * area); + void (*get_size)(const struct _lv_svg_render_obj * obj, uint32_t * size); + void (*destroy)(struct _lv_svg_render_obj * obj); +} lv_svg_render_class; + +typedef struct _lv_svg_render_hal { + void (*load_image)(const char * image_url, lv_draw_image_dsc_t * img_dsc); + const char * (*get_font_path)(const char * font_family); +} lv_svg_render_hal_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the SVG render + * @param hal pointer to a structure with rendering functions + */ +void lv_svg_render_init(const lv_svg_render_hal_t * hal); + +/** + * @brief Create a new SVG render from an SVG document + * @param svg_doc pointer to the SVG document + * @return pointer to the new SVG render object + */ +lv_svg_render_obj_t * lv_svg_render_create(const lv_svg_node_t * svg_doc); + +/** + * @brief Delete an SVG render object + * @param render pointer to the SVG render object to delete + */ +void lv_svg_render_delete(lv_svg_render_obj_t * render); + +/** + * @brief Get size of render objects + * @param render pointer to the SVG render object + * @return the bytes of SVG render objects + */ +uint32_t lv_svg_render_get_size(const lv_svg_render_obj_t * render); + +/** + * @brief Get viewport's width and height of the render object + * @param render pointer to the SVG render object + * @param width pointer to save the width of the viewport of the SVG render object + * @param height pointer to save the height of the viewport of the SVG render object + * @return lv_result_t, LV_RESULT_OK if success, LV_RESULT_INVALID if fail + */ +lv_result_t lv_svg_render_get_viewport_size(const lv_svg_render_obj_t * render, float * width, float * height); + +/** + * @brief Render an SVG object to a vector graphics + * @param dsc pointer to the vector graphics descriptor + * @param render pointer to the SVG render object to render + */ +void lv_draw_svg_render(lv_draw_vector_dsc_t * dsc, const lv_svg_render_obj_t * render); + +/** + * @brief Draw an SVG document to a layer + * @param layer pointer to the target layer + * @param svg_doc pointer to the SVG document to draw + */ +void lv_draw_svg(lv_layer_t * layer, const lv_svg_node_t * svg_doc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SVG*/ + +#endif /*LV_SVG_RENDER_H*/ diff --git a/inc/lvgl/src/libs/svg/lv_svg_token.c b/inc/lvgl/src/libs/svg/lv_svg_token.c new file mode 100644 index 0000000..1c7643a --- /dev/null +++ b/inc/lvgl/src/libs/svg/lv_svg_token.c @@ -0,0 +1,483 @@ +/** + * @file lv_svg_token.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_svg_token.h" +#if LV_USE_SVG + +#include "../../../lvgl.h" +#include +#include + +/********************* +* DEFINES +*********************/ + +/********************** +* TYPEDEFS +**********************/ + +/* + * tag mask quote mask tag search comment doc type xml inst + * | 0 0 0 | 0 0 | 0 | 0 | 0 | 0 | 0 | + */ +enum { + SVG_TAG_MASK = (1 << 3) - 1, + SVG_QUOTE_MASK = (1 << 5) - (1 << 3), + SVG_TAG = 1 << 5, + SVG_SEARCH = 1 << 6, + SVG_COMMENT = 1 << 7, + SVG_DOCTYPE = 1 << 8, + SVG_XMLINST = 1 << 9, +}; +typedef uint32_t _lv_svg_parser_bits_t; + +enum { + SVG_NO_QUOTE = 0, + SVG_SINGLE_QUOTE = 1, + SVG_DOUBLE_QUOTE = 2, +}; +typedef uint32_t _lv_svg_parser_quote_t; + +enum { + SVG_NO_TAG = 0, + SVG_TAG_NAME = 1, + SVG_ATTR_START = 2, + SVG_ATTR_NAME = 3, + SVG_SEARCH_EQUAL = 4, + SVG_SEARCH_VALUE = 5, + SVG_QUOTE_VALUE = 6, + SVG_VALUE = 7, +}; +typedef uint32_t _lv_svg_parser_tag_state_t; + +typedef struct { + uint32_t flags; + const char * cur; + const char * end; +} _lv_svg_parser_state_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void _set_state(_lv_svg_parser_state_t * state, uint32_t bit) +{ + state->flags |= bit; +} + +static void _clear_state(_lv_svg_parser_state_t * state, uint32_t bit) +{ + state->flags &= ~bit; +} + +static bool _is_state(_lv_svg_parser_state_t * state, uint32_t bit) +{ + return state->flags & bit; +} + +static void _set_tag_state(_lv_svg_parser_state_t * state, uint32_t bit) +{ + state->flags = (state->flags & ~SVG_TAG_MASK) | bit; +} + +static void _set_quote_state(_lv_svg_parser_state_t * state, uint32_t bit) +{ + state->flags = (state->flags & ~SVG_QUOTE_MASK) | (bit << 3); +} + +static bool _special_handle(_lv_svg_parser_state_t * state) +{ + return state->flags & (SVG_TAG | SVG_SEARCH | SVG_TAG_MASK | SVG_COMMENT | SVG_DOCTYPE | SVG_XMLINST); +} + +static void _lv_svg_token_init(_lv_svg_token_t * token) +{ + token->start = NULL; + token->end = NULL; + token->type = LV_SVG_TOKEN_CONTENT; + token->flat = false; + token->cur_attr = NULL; + lv_array_init(&token->attrs, LV_ARRAY_DEFAULT_CAPACITY, sizeof(_lv_svg_token_attr_t)); +} + +static void _lv_svg_token_reset(_lv_svg_token_t * token) +{ + token->start = NULL; + token->end = NULL; + token->type = LV_SVG_TOKEN_CONTENT; + token->flat = false; + token->cur_attr = NULL; + lv_array_clear(&token->attrs); +} + +static bool _lv_svg_token_process(_lv_svg_token_t * token, svg_token_process cb, void * data) +{ + if(!token->start || SVG_TOKEN_LEN(token) == 0) + return true; + + bool ret = cb(token, data); + _lv_svg_token_reset(token); + return ret; +} + +static _lv_svg_token_attr_t * _new_svg_attr(_lv_svg_token_t * token) +{ + if((lv_array_size(&token->attrs) + 1) > lv_array_capacity(&token->attrs)) { + lv_array_resize(&token->attrs, token->attrs.capacity << 1); + } + + token->attrs.size++; + _lv_svg_token_attr_t * attr = lv_array_at(&token->attrs, token->attrs.size - 1); + lv_memset(attr, 0, sizeof(_lv_svg_token_attr_t)); + return attr; +} + +static void _svg_parser_xml_inst(_lv_svg_parser_state_t * state, _lv_svg_token_t * token) +{ + LV_UNUSED(token); + + while(state->cur <= state->end) { + char ch = *(state->cur); + if(ch == '>' && (*(state->cur - 1)) == '?') { + _clear_state(state, SVG_XMLINST); + state->cur++; + break; + } + state->cur++; + } +} + +static void _svg_parser_comment(_lv_svg_parser_state_t * state, _lv_svg_token_t * token) +{ + LV_UNUSED(token); + + while(state->cur <= state->end) { + char ch = *(state->cur); + if(ch == '>' && (*(state->cur - 1)) == '-' && (*(state->cur - 2)) == '-') { + _clear_state(state, SVG_COMMENT); + state->cur++; + break; + } + state->cur++; + } +} + +static void _svg_parser_doctype(_lv_svg_parser_state_t * state, _lv_svg_token_t * token) +{ + LV_UNUSED(token); + + //TODO: processing DTD type + while(state->cur <= state->end) { + char ch = *(state->cur); + if(ch == '>') { + _clear_state(state, SVG_DOCTYPE); + state->cur++; + break; + } + state->cur++; + } +} + +static bool _svg_parser_tag(_lv_svg_parser_state_t * state, _lv_svg_token_t * token, svg_token_process cb, void * data) +{ + while(state->cur <= state->end) { + switch(state->flags & SVG_TAG_MASK) { + case SVG_NO_TAG: { + if(!_lv_svg_token_process(token, cb, data)) { + return false; + } + state->cur++; + } + return true; + case SVG_TAG_NAME: { + char ch = *(state->cur); + if(ch == '/') { + token->type = LV_SVG_TOKEN_END; + state->cur++; + if(!token->start) { + token->start = state->cur; + } + continue; + } + else if(ch == '>' || isspace(ch)) { + token->end = state->cur; + _set_tag_state(state, SVG_ATTR_START); + continue; + } + else { + if(!token->start) { + token->type = LV_SVG_TOKEN_BEGIN; + token->start = state->cur; + } + state->cur++; + continue; + } + } + break; + case SVG_ATTR_START: { + char ch = *(state->cur); + if(!isspace(ch) && ch != '\'' && ch != '\"') { + if(ch == '/') { + token->flat = true; + state->cur++; + continue; + } + if(ch == '>') { + _set_tag_state(state, SVG_NO_TAG); + } + else { + token->cur_attr = NULL; + _set_tag_state(state, SVG_ATTR_NAME); + } + continue; + } + } + break; + case SVG_ATTR_NAME: { + if(!token->cur_attr) { + token->cur_attr = _new_svg_attr(token); + } + char ch = *(state->cur); + if(isspace(ch) || ch == '=' || ch == '/' || ch == '>') { + token->cur_attr->name_end = state->cur; + _set_tag_state(state, SVG_SEARCH_EQUAL); + continue; + } + else { + if(!token->cur_attr->name_start) { + token->cur_attr->name_start = state->cur; + } + state->cur++; + continue; + } + } + break; + case SVG_SEARCH_EQUAL: { + char ch = *(state->cur); + if(!isspace(ch) && ch != '/' && ch != '\'' && ch != '\"') { + if(ch == '=') { + _set_tag_state(state, SVG_SEARCH_VALUE); + } + else { + // attr name has empty value + token->cur_attr = NULL; + _set_tag_state(state, SVG_ATTR_START); + continue; + } + } + } + break; + case SVG_SEARCH_VALUE: { + char ch = *(state->cur); + if(!isspace(ch)) { + if(ch == '\'' || ch == '\"') { + if(ch == '\'') { + _set_quote_state(state, SVG_SINGLE_QUOTE); + } + else { + _set_quote_state(state, SVG_DOUBLE_QUOTE); + } + _set_tag_state(state, SVG_QUOTE_VALUE); + } + else { + _set_tag_state(state, SVG_VALUE); + continue; + } + } + } + break; + case SVG_QUOTE_VALUE: { + char ch = *(state->cur); + if((ch == '\'' && ((state->flags & SVG_QUOTE_MASK) >> 3) == SVG_SINGLE_QUOTE) + || (ch == '\"' && ((state->flags & SVG_QUOTE_MASK) >> 3) == SVG_DOUBLE_QUOTE)) { + if(!token->cur_attr->value_start) { + token->cur_attr->value_start = state->cur; + } + token->cur_attr->value_end = state->cur; + _set_quote_state(state, SVG_NO_QUOTE); + _set_tag_state(state, SVG_ATTR_START); + continue; + } + else { + if(!token->cur_attr->value_start) { + token->cur_attr->value_start = state->cur; + } + state->cur++; + continue; + } + } + break; + case SVG_VALUE: { + char ch = *(state->cur); + if(isspace(ch) || ch == '>' || ch == '/') { + if(!token->cur_attr->value_start) { + token->cur_attr->value_start = state->cur; + } + token->cur_attr->value_end = state->cur; + _set_quote_state(state, SVG_NO_QUOTE); + _set_tag_state(state, SVG_ATTR_START); + continue; + } + else { + if(!token->cur_attr->value_start) { + token->cur_attr->value_start = state->cur; + } + state->cur++; + continue; + } + } + break; + } + state->cur++; + } + return true; +} + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool _lv_svg_tokenizer(const char * svg_data, uint32_t data_len, svg_token_process cb, void * data) +{ + LV_ASSERT_NULL(svg_data); + LV_ASSERT(data_len > 0); + LV_ASSERT_NULL(cb); + LV_ASSERT_NULL(data); + + _lv_svg_token_t token; + _lv_svg_token_init(&token); + _lv_svg_parser_state_t state = { + .flags = 0, + .cur = svg_data, + .end = svg_data + data_len, + }; + + while(state.cur < state.end) { + char ch = *(state.cur); + if(ch == '\r' || ch == '\n') { // skip LR character + state.cur++; + continue; + } + else if(_special_handle(&state)) { + if(_is_state(&state, SVG_TAG)) { + _clear_state(&state, SVG_TAG); + switch(ch) { + case '/': // end tag + _set_tag_state(&state, SVG_TAG_NAME); + break; + case '!': { + // ") - 1 < itrEnd) && (!memcmp(itr + 2, "--", sizeof("--") - 1))) { + toff = sizeof("!--") - 1; + return SimpleXMLType::Comment; + } else if (itr + sizeof("") - 1 < itrEnd) { + toff = sizeof("!") - 1; + return SimpleXMLType::DoctypeChild; + } + return SimpleXMLType::Open; + } + return SimpleXMLType::Open; +} + + +/************************************************************************/ +/* External Class Implementation */ +/************************************************************************/ + +const char* simpleXmlNodeTypeToString(TVG_UNUSED SvgNodeType type) +{ +#ifdef THORVG_LOG_ENABLED + static const char* TYPE_NAMES[] = { + "Svg", + "G", + "Defs", + "Animation", + "Arc", + "Circle", + "Ellipse", + "Image", + "Line", + "Path", + "Polygon", + "Polyline", + "Rect", + "Text", + "TextArea", + "Tspan", + "Use", + "Video", + "ClipPath", + "Mask", + "Symbol", + "Unknown", + }; + return TYPE_NAMES[(int) type]; +#endif + return nullptr; +} + + +bool isIgnoreUnsupportedLogElements(TVG_UNUSED const char* tagName) +{ +#ifdef THORVG_LOG_ENABLED + const auto elementsNum = 1; + const char* const elements[] = { "title" }; + + for (unsigned int i = 0; i < elementsNum; ++i) { + if (!strncmp(tagName, elements[i], strlen(tagName))) { + return true; + } + } + return false; +#else + return true; +#endif +} + + +bool simpleXmlParseAttributes(const char* buf, unsigned bufLength, simpleXMLAttributeCb func, const void* data) +{ + const char *itr = buf, *itrEnd = buf + bufLength; + char* tmpBuf = (char*)lv_malloc(bufLength + 1); + LV_ASSERT_MALLOC(tmpBuf); + + if (!buf || !func || !tmpBuf) goto error; + + while (itr < itrEnd) { + const char* p = _skipWhiteSpacesAndXmlEntities(itr, itrEnd); + const char *key, *keyEnd, *value, *valueEnd; + char* tval; + + if (p == itrEnd) goto success; + + key = p; + for (keyEnd = key; keyEnd < itrEnd; keyEnd++) { + if ((*keyEnd == '=') || (isspace((unsigned char)*keyEnd))) break; + } + if (keyEnd == itrEnd) goto error; + if (keyEnd == key) { // There is no key. This case is invalid, but explores the following syntax. + itr = keyEnd + 1; + continue; + } + + if (*keyEnd == '=') value = keyEnd + 1; + else { + value = (const char*)memchr(keyEnd, '=', itrEnd - keyEnd); + if (!value) goto error; + value++; + } + keyEnd = _simpleXmlUnskipXmlEntities(keyEnd, key); + + value = _skipWhiteSpacesAndXmlEntities(value, itrEnd); + if (value == itrEnd) goto error; + + if ((*value == '"') || (*value == '\'')) { + valueEnd = (const char*)memchr(value + 1, *value, itrEnd - value); + if (!valueEnd) goto error; + value++; + } else { + valueEnd = _simpleXmlFindWhiteSpace(value, itrEnd); + } + + itr = valueEnd + 1; + + value = _skipWhiteSpacesAndXmlEntities(value, itrEnd); + valueEnd = _unskipWhiteSpacesAndXmlEntities(valueEnd, value); + + memcpy(tmpBuf, key, keyEnd - key); + tmpBuf[keyEnd - key] = '\0'; + + tval = tmpBuf + (keyEnd - key) + 1; + int i = 0; + while (value < valueEnd) { + value = _simpleXmlSkipXmlEntities(value, valueEnd); + tval[i++] = *value; + value++; + } + tval[i] = '\0'; + + if (!func((void*)data, tmpBuf, tval)) { + if (!_isIgnoreUnsupportedLogAttributes(tmpBuf, tval)) { + TVGLOG("SVG", "Unsupported attributes used [Elements type: %s][Id : %s][Attribute: %s][Value: %s]", simpleXmlNodeTypeToString(((SvgLoaderData*)data)->svgParse->node->type), ((SvgLoaderData*)data)->svgParse->node->id ? ((SvgLoaderData*)data)->svgParse->node->id : "NO_ID", tmpBuf, tval ? tval : "NONE"); + } + } + } + +success: + lv_free(tmpBuf); + return true; + +error: + lv_free(tmpBuf); + return false; +} + + +bool simpleXmlParse(const char* buf, unsigned bufLength, bool strip, simpleXMLCb func, const void* data) +{ + const char *itr = buf, *itrEnd = buf + bufLength; + + if (!buf || !func) return false; + + while (itr < itrEnd) { + if (itr[0] == '<') { + //Invalid case + if (itr + 1 >= itrEnd) return false; + + size_t toff = 0; + SimpleXMLType type = _getXMLType(itr, itrEnd, toff); + + const char* p; + if (type == SimpleXMLType::CData) p = _simpleXmlFindEndCdataTag(itr + 1 + toff, itrEnd); + else if (type == SimpleXMLType::DoctypeChild) p = _simpleXmlFindDoctypeChildEndTag(itr + 1 + toff, itrEnd); + else if (type == SimpleXMLType::Comment) p = _simpleXmlFindEndCommentTag(itr + 1 + toff, itrEnd); + else p = _simpleXmlFindEndTag(itr + 1 + toff, itrEnd); + + if (p) { + //Invalid case: '<' nested + if (*p == '<' && type != SimpleXMLType::Doctype) return false; + const char *start, *end; + + start = itr + 1 + toff; + end = p; + + switch (type) { + case SimpleXMLType::Open: { + if (p[-1] == '/') { + type = SimpleXMLType::OpenEmpty; + end--; + } + break; + } + case SimpleXMLType::CData: { + if (!memcmp(p - 2, "]]", 2)) end -= 2; + break; + } + case SimpleXMLType::Processing: { + if (p[-1] == '?') end--; + break; + } + case SimpleXMLType::Comment: { + if (!memcmp(p - 2, "--", 2)) end -= 2; + break; + } + default: { + break; + } + } + + if (strip && (type != SimpleXMLType::CData)) { + start = _skipWhiteSpacesAndXmlEntities(start, end); + end = _unskipWhiteSpacesAndXmlEntities(end, start); + } + + if (!func((void*)data, type, start, (unsigned int)(end - start))) return false; + + itr = p + 1; + } else { + return false; + } + } else { + const char *p, *end; + + if (strip) { + p = itr; + p = _skipWhiteSpacesAndXmlEntities(p, itrEnd); + if (p) { + if (!func((void*)data, SimpleXMLType::Ignored, itr, (unsigned int)(p - itr))) return false; + itr = p; + } + } + + p = _simpleXmlFindStartTag(itr, itrEnd); + if (!p) p = itrEnd; + + end = p; + if (strip) end = _unskipWhiteSpacesAndXmlEntities(end, itr); + + if (itr != end && !func((void*)data, SimpleXMLType::Data, itr, (unsigned int)(end - itr))) return false; + + if (strip && (end < p) && !func((void*)data, SimpleXMLType::Ignored, end, (unsigned int)(p - end))) return false; + + itr = p; + } + } + return true; +} + + +bool simpleXmlParseW3CAttribute(const char* buf, unsigned bufLength, simpleXMLAttributeCb func, const void* data) +{ + const char* end; + char* key; + char* val; + char* next; + + if (!buf) return false; + + end = buf + bufLength; + key = (char*)alloca(end - buf + 1); + val = (char*)alloca(end - buf + 1); + + if (buf == end) return true; + + do { + char* sep = (char*)strchr(buf, ':'); + next = (char*)strchr(buf, ';'); + if (sep >= end) { + next = nullptr; + sep = nullptr; + } + if (next >= end) next = nullptr; + + key[0] = '\0'; + val[0] = '\0'; + + if (sep != nullptr && next == nullptr) { + memcpy(key, buf, sep - buf); + key[sep - buf] = '\0'; + + memcpy(val, sep + 1, end - sep - 1); + val[end - sep - 1] = '\0'; + } else if (sep != nullptr && sep < next) { + memcpy(key, buf, sep - buf); + key[sep - buf] = '\0'; + + memcpy(val, sep + 1, next - sep - 1); + val[next - sep - 1] = '\0'; + } else if (next) { + memcpy(key, buf, next - buf); + key[next - buf] = '\0'; + } + + if (key[0]) { + key = const_cast(_simpleXmlSkipWhiteSpace(key, key + strlen(key))); + key[_simpleXmlUnskipWhiteSpace(key + strlen(key) , key) - key] = '\0'; + val = const_cast(_simpleXmlSkipWhiteSpace(val, val + strlen(val))); + val[_simpleXmlUnskipWhiteSpace(val + strlen(val) , val) - val] = '\0'; + + if (!func((void*)data, key, val)) { + if (!_isIgnoreUnsupportedLogAttributes(key, val)) { + TVGLOG("SVG", "Unsupported attributes used [Elements type: %s][Id : %s][Attribute: %s][Value: %s]", simpleXmlNodeTypeToString(((SvgLoaderData*)data)->svgParse->node->type), ((SvgLoaderData*)data)->svgParse->node->id ? ((SvgLoaderData*)data)->svgParse->node->id : "NO_ID", key, val ? val : "NONE"); + } + } + } + + if (!next) break; + buf = next + 1; + } while (true); + + return true; +} + + +/* + * Supported formats: + * tag {}, .name {}, tag.name{} + */ +const char* simpleXmlParseCSSAttribute(const char* buf, unsigned bufLength, char** tag, char** name, const char** attrs, unsigned* attrsLength) +{ + if (!buf) return nullptr; + + *tag = *name = nullptr; + *attrsLength = 0; + + auto itr = _simpleXmlSkipWhiteSpace(buf, buf + bufLength); + auto itrEnd = (const char*)memchr(buf, '{', bufLength); + + if (!itrEnd || itr == itrEnd) return nullptr; + + auto nextElement = (const char*)memchr(itrEnd, '}', bufLength - (itrEnd - buf)); + if (!nextElement) return nullptr; + + *attrs = itrEnd + 1; + *attrsLength = nextElement - *attrs; + + const char *p; + + itrEnd = _simpleXmlUnskipWhiteSpace(itrEnd, itr); + if (*(itrEnd - 1) == '.') return nullptr; + + for (p = itr; p < itrEnd; p++) { + if (*p == '.') break; + } + + if (p == itr) *tag = lv_strdup("all"); + else *tag = strDuplicate(itr, p - itr); + + if (p == itrEnd) *name = nullptr; + else *name = strDuplicate(p + 1, itrEnd - p - 1); + + return (nextElement ? nextElement + 1 : nullptr); +} + + +const char* simpleXmlFindAttributesTag(const char* buf, unsigned bufLength) +{ + const char *itr = buf, *itrEnd = buf + bufLength; + + for (; itr < itrEnd; itr++) { + if (!isspace((unsigned char)*itr)) { + //User skip tagname and already gave it the attributes. + if (*itr == '=') return buf; + } else { + itr = _simpleXmlUnskipXmlEntities(itr, buf); + if (itr == itrEnd) return nullptr; + return itr; + } + } + + return nullptr; +} + +#endif /* LV_USE_THORVG_INTERNAL */ + diff --git a/inc/lvgl/src/libs/thorvg/tvgXmlParser.h b/inc/lvgl/src/libs/thorvg/tvgXmlParser.h new file mode 100644 index 0000000..be08068 --- /dev/null +++ b/inc/lvgl/src/libs/thorvg/tvgXmlParser.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 - 2024 the ThorVG project. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "../../lv_conf_internal.h" +#if LV_USE_THORVG_INTERNAL + +#ifndef _TVG_SIMPLE_XML_PARSER_H_ +#define _TVG_SIMPLE_XML_PARSER_H_ + +#include "tvgSvgLoaderCommon.h" + +#define NUMBER_OF_XML_ENTITIES 9 +const char* const xmlEntity[] = {" ", """, " ", "'", "&", "<", ">", "#", "'"}; +const int xmlEntityLength[] = {5, 6, 6, 6, 5, 4, 4, 6, 6}; + +enum class SimpleXMLType +{ + Open = 0, //!< \ + OpenEmpty, //!< \ + Close, //!< \ + Data, //!< tag text data + CData, //!< \ + Error, //!< error contents + Processing, //!< \ \ + Doctype, //!< \ + Ignored, //!< whatever is ignored by parser, like whitespace + DoctypeChild //!< \font_draw_buf_handlers) + +/********************* + * DEFINES + *********************/ + +#define STB_RECT_PACK_IMPLEMENTATION +#define STBRP_STATIC +#define STBTT_STATIC +#define STB_TRUETYPE_IMPLEMENTATION +#define STBTT_HEAP_FACTOR_SIZE_32 50 +#define STBTT_HEAP_FACTOR_SIZE_128 20 +#define STBTT_HEAP_FACTOR_SIZE_DEFAULT 10 +#define STBTT_malloc(x, u) ((void)(u), lv_malloc(x)) +#define STBTT_free(x, u) ((void)(u), lv_free(x)) + +#if LV_TINY_TTF_FILE_SUPPORT != 0 +/* for stream support */ +#define STBTT_STREAM_TYPE ttf_cb_stream_t * +#define STBTT_STREAM_SEEK(s, x) ttf_cb_stream_seek(s, x); +#define STBTT_STREAM_READ(s, x, y) ttf_cb_stream_read(s, x, y); + +/* a hydra stream that can be in memory or from a file*/ +typedef struct ttf_cb_stream { + lv_fs_file_t * file; + const void * data; + size_t size; + size_t position; +} ttf_cb_stream_t; + +static void ttf_cb_stream_read(ttf_cb_stream_t * stream, void * data, size_t to_read); +static void ttf_cb_stream_seek(ttf_cb_stream_t * stream, size_t position); +#endif + +#include "stb_rect_pack.h" +#include "stb_truetype_htcw.h" + +/********************** + * TYPEDEFS + **********************/ + +typedef struct ttf_font_desc { + lv_cache_t * glyph_cache; + lv_cache_t * draw_data_cache; + lv_cache_t * kerning_cache; + stbtt_fontinfo info; + lv_fs_file_t file; +#if LV_TINY_TTF_FILE_SUPPORT != 0 + ttf_cb_stream_t stream; +#else + const uint8_t * stream; +#endif + float scale; + int ascent; + int descent; + int cache_size; + lv_font_kerning_t kerning; +} ttf_font_desc_t; + +typedef struct _tiny_ttf_glyph_cache_data_t { + lv_font_glyph_dsc_t glyph_dsc; + uint32_t unicode; + int adv_w; +} tiny_ttf_glyph_cache_data_t; + +typedef struct { + int glyph1_idx; + int glyph2_idx; + uint16_t adv_w16; +} tiny_ttf_kerning_cache_data_t; + +typedef struct { + const ttf_font_desc_t * dsc; + int adv_w; +} tiny_ttf_kerning_cache_create_data_t; + +typedef struct _lv_tiny_ttf_cache_data_t { + lv_draw_buf_t * draw_buf; + uint32_t glyph_index; + uint32_t size; +} tiny_ttf_cache_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next); +static const void * ttf_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf); +static void ttf_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc); +static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, + int32_t font_size, lv_font_kerning_t kerning, + size_t cache_size); + +static bool tiny_ttf_glyph_cache_create_cb(tiny_ttf_glyph_cache_data_t * node, void * user_data); +static void tiny_ttf_glyph_cache_free_cb(tiny_ttf_glyph_cache_data_t * node, void * user_data); +static lv_cache_compare_res_t tiny_ttf_glyph_cache_compare_cb(const tiny_ttf_glyph_cache_data_t * lhs, + const tiny_ttf_glyph_cache_data_t * rhs); + +static bool tiny_ttf_draw_data_cache_create_cb(tiny_ttf_cache_data_t * node, void * user_data); +static void tiny_ttf_draw_data_cache_free_cb(tiny_ttf_cache_data_t * node, void * user_data); +static lv_cache_compare_res_t tiny_ttf_draw_data_cache_compare_cb(const tiny_ttf_cache_data_t * lhs, + const tiny_ttf_cache_data_t * rhs); + +static bool tiny_ttf_kerning_cache_create_cb(tiny_ttf_kerning_cache_data_t * node, void * user_data); +static void tiny_ttf_kerning_cache_free_cb(tiny_ttf_kerning_cache_data_t * node, void * user_data); +static lv_cache_compare_res_t tiny_ttf_kerning_cache_compare_cb(const tiny_ttf_kerning_cache_data_t * lhs, + const tiny_ttf_kerning_cache_data_t * rhs); + +static void lv_tiny_ttf_cache_create(ttf_font_desc_t * dsc); + +static lv_font_t * tiny_ttf_font_create_cb(const lv_font_info_t * info, const void * src); +static void tiny_ttf_font_delete_cb(lv_font_t * font); +static void * tiny_ttf_font_dup_src_cb(const void * src); +static void tiny_ttf_font_free_src_cb(void * src); + +/********************** + * GLOBAL VARIABLES + **********************/ + +const lv_font_class_t lv_tiny_ttf_font_class = { + .create_cb = tiny_ttf_font_create_cb, + .delete_cb = tiny_ttf_font_delete_cb, + .dup_src_cb = tiny_ttf_font_dup_src_cb, + .free_src_cb = tiny_ttf_font_free_src_cb, +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_tiny_ttf_set_size(lv_font_t * font, int32_t font_size) +{ + if(font_size <= 0) { + LV_LOG_ERROR("invalid font size: %"LV_PRIx32, font_size); + return; + } + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + dsc->scale = stbtt_ScaleForMappingEmToPixels(&dsc->info, font_size); + int line_gap = 0; + stbtt_GetFontVMetrics(&dsc->info, &dsc->ascent, &dsc->descent, &line_gap); + font->line_height = (int32_t)(dsc->scale * (dsc->ascent - dsc->descent + line_gap)); + font->base_line = (int32_t)(dsc->scale * (line_gap - dsc->descent)); + + /* size change means cache needs to be invalidated. */ + + if(dsc->glyph_cache) { + lv_cache_destroy(dsc->glyph_cache, NULL); + dsc->glyph_cache = NULL; + } + + if(dsc->draw_data_cache) { + lv_cache_destroy(dsc->draw_data_cache, NULL); + dsc->draw_data_cache = NULL; + } + if(dsc->kerning_cache) { + lv_cache_destroy(dsc->kerning_cache, NULL); + dsc->kerning_cache = NULL; + } + + lv_tiny_ttf_cache_create(dsc); +} + +void lv_tiny_ttf_destroy(lv_font_t * font) +{ + LV_ASSERT_NULL(font); + + if(font->dsc != NULL) { + ttf_font_desc_t * ttf = (ttf_font_desc_t *)font->dsc; +#if LV_TINY_TTF_FILE_SUPPORT != 0 + if(ttf->stream.file != NULL) { + lv_fs_close(&ttf->file); + } +#endif + lv_cache_destroy(ttf->glyph_cache, NULL); + lv_cache_destroy(ttf->draw_data_cache, NULL); + lv_cache_destroy(ttf->kerning_cache, NULL); + lv_free(ttf); + font->dsc = NULL; + } + + lv_free(font); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_TINY_TTF_FILE_SUPPORT != 0 +static void ttf_cb_stream_read(ttf_cb_stream_t * stream, void * data, size_t to_read) +{ + if(stream->file != NULL) { + uint32_t br; + lv_fs_read(stream->file, data, to_read, &br); + } + else { + if(to_read + stream->position >= stream->size) { + to_read = stream->size - stream->position; + } + memcpy(data, ((const unsigned char *)stream->data + stream->position), to_read); + stream->position += to_read; + } +} +static void ttf_cb_stream_seek(ttf_cb_stream_t * stream, size_t position) +{ + if(stream->file != NULL) { + lv_fs_seek(stream->file, position, LV_FS_SEEK_SET); + } + else { + if(position > stream->size) { + stream->position = stream->size; + } + else { + stream->position = position; + } + } +} +#endif + +static inline uint16_t ttf_calculate_kerning_width(float scale, uint16_t adv_w, int k) +{ + + /*Horizontal space required by the glyph in [px]*/; + return (uint16_t)(scale * (adv_w + k) + 0.5f); +} + +static uint16_t ttf_get_glyph_pair_kerning_width(const ttf_font_desc_t * dsc, uint32_t g1, uint32_t g2, int adv_w) +{ + tiny_ttf_kerning_cache_data_t kerning_cache_search_key = { + .glyph1_idx = g1, + .glyph2_idx = g2, + }; + + tiny_ttf_kerning_cache_create_data_t kerning_cache_create_data = { + .adv_w = adv_w, + .dsc = dsc, + }; + + if(dsc->kerning_cache->max_size == 0) { + /* No cache, call the create function directly */ + bool ret = tiny_ttf_kerning_cache_create_cb(&kerning_cache_search_key, (void *)&kerning_cache_create_data); + LV_ASSERT(ret); + return kerning_cache_search_key.adv_w16; + } + + LV_ASSERT_NULL(dsc->kerning_cache); + lv_cache_entry_t * kerning_entry = lv_cache_acquire_or_create(dsc->kerning_cache, &kerning_cache_search_key, + (void *)&kerning_cache_create_data); + LV_ASSERT_NULL(kerning_entry); + tiny_ttf_kerning_cache_data_t * data = lv_cache_entry_get_data(kerning_entry); + LV_ASSERT_NULL(data); + + lv_cache_release(dsc->kerning_cache, kerning_entry, NULL); + return data->adv_w16; +} + +static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, + uint32_t unicode_letter_next) +{ + if(unicode_letter < 0x20 || + unicode_letter == 0xf8ff || /*LV_SYMBOL_DUMMY*/ + unicode_letter == 0x200c) { /*ZERO WIDTH NON-JOINER*/ + dsc_out->box_w = 0; + dsc_out->adv_w = 0; + dsc_out->box_h = 0; /*height of the bitmap in [px]*/ + dsc_out->ofs_x = 0; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = 0; /*Y offset of the bitmap in [pf]*/ + dsc_out->format = LV_FONT_GLYPH_FORMAT_NONE; + dsc_out->is_placeholder = false; + return true; + } + + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + + tiny_ttf_glyph_cache_data_t search_key = { + .unicode = unicode_letter, + }; + + + int adv_w; + lv_cache_entry_t * entry = lv_cache_acquire_or_create(dsc->glyph_cache, &search_key, (void *)dsc); + + if(entry == NULL) { + if(!dsc->cache_size) { /* no cache, do everything directly */ + int g1 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter); + tiny_ttf_glyph_cache_create_cb(&search_key, dsc); + *dsc_out = search_key.glyph_dsc; + adv_w = search_key.adv_w; + + /*Kerning correction*/ + if(font->kerning == LV_FONT_KERNING_NORMAL && + unicode_letter_next != 0) { + int g2 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter_next); /* not using cache, only do glyph id lookup */ + if(g2) { + dsc_out->adv_w = ttf_get_glyph_pair_kerning_width(dsc, g1, g2, adv_w); + } + } + + dsc_out->entry = NULL; + return true; + } + LV_LOG_ERROR("cache not allocated"); + return false; + } + + tiny_ttf_glyph_cache_data_t * data = lv_cache_entry_get_data(entry); + *dsc_out = data->glyph_dsc; + adv_w = data->adv_w; + lv_cache_release(dsc->glyph_cache, entry, NULL); + + /*Kerning correction*/ + if(font->kerning == LV_FONT_KERNING_NORMAL && + unicode_letter_next != 0) { /* check if we need to do any kerning calculations */ + uint32_t g1 = dsc_out->gid.index; + + int g2 = 0; + search_key.unicode = unicode_letter_next; /* reuse search key */ + lv_cache_entry_t * entry_next = lv_cache_acquire_or_create(dsc->glyph_cache, &search_key, (void *)dsc); + + if(entry_next == NULL) { + g2 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter_next); + } + else { + tiny_ttf_glyph_cache_data_t * data_next = lv_cache_entry_get_data(entry_next); + g2 = data_next->glyph_dsc.gid.index; + lv_cache_release(dsc->glyph_cache, entry_next, NULL); + } + if(g2) { + dsc_out->adv_w = ttf_get_glyph_pair_kerning_width(dsc, g1, g2, adv_w); + } + } + + dsc_out->entry = NULL; + return true; /*true: glyph found; false: glyph was not found*/ +} + +static const void * ttf_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc, lv_draw_buf_t * draw_buf) +{ + LV_UNUSED(draw_buf); + uint32_t glyph_index = g_dsc->gid.index; + const lv_font_t * font = g_dsc->resolved_font; + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + tiny_ttf_cache_data_t search_key = { + .glyph_index = glyph_index, + .size = font->line_height, + }; + + lv_cache_entry_t * entry = lv_cache_acquire_or_create(dsc->draw_data_cache, &search_key, (void *)font->dsc); + if(entry == NULL) { + if(!dsc->cache_size) { /* no cache, do everything directly */ + if(tiny_ttf_draw_data_cache_create_cb(&search_key, (void *)font->dsc)) { + /* use the cache entry to store the buffer if no cache specified */ + g_dsc->entry = (lv_cache_entry_t *)search_key.draw_buf; + return g_dsc->entry; + } + else { + return NULL; + } + } + LV_LOG_ERROR("cache not allocated"); + return NULL; + } + + g_dsc->entry = entry; + tiny_ttf_cache_data_t * cached_data = lv_cache_entry_get_data(entry); + return cached_data->draw_buf; +} + +static void ttf_release_glyph_cb(const lv_font_t * font, lv_font_glyph_dsc_t * g_dsc) +{ + LV_ASSERT_NULL(font); + + ttf_font_desc_t * dsc = (ttf_font_desc_t *)font->dsc; + if(!dsc->cache_size) { /* no cache, do everything directly */ + lv_draw_buf_destroy((lv_draw_buf_t *)g_dsc->entry); + } + else { + if(g_dsc->entry == NULL) { + return; + } + lv_cache_release(dsc->draw_data_cache, g_dsc->entry, NULL); + } + g_dsc->entry = NULL; +} + +static void lv_tiny_ttf_cache_create(ttf_font_desc_t * dsc) +{ + /*Init cache*/ + dsc->glyph_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(tiny_ttf_glyph_cache_data_t), dsc->cache_size, + (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t)tiny_ttf_glyph_cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)tiny_ttf_glyph_cache_create_cb, + .free_cb = (lv_cache_free_cb_t)tiny_ttf_glyph_cache_free_cb + }); + lv_cache_set_name(dsc->glyph_cache, "TINY_TTF_GLYPH"); + + dsc->draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(tiny_ttf_cache_data_t), dsc->cache_size, + (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t)tiny_ttf_draw_data_cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)tiny_ttf_draw_data_cache_create_cb, + .free_cb = (lv_cache_free_cb_t)tiny_ttf_draw_data_cache_free_cb, + }); + lv_cache_set_name(dsc->draw_data_cache, "TINY_TTF_DRAW_DATA"); + + dsc->kerning_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(tiny_ttf_kerning_cache_data_t), + LV_TINY_TTF_CACHE_KERNING_CNT, + (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t)tiny_ttf_kerning_cache_compare_cb, + .create_cb = (lv_cache_create_cb_t)tiny_ttf_kerning_cache_create_cb, + .free_cb = (lv_cache_free_cb_t)tiny_ttf_kerning_cache_free_cb, + }); + lv_cache_set_name(dsc->kerning_cache, "TINY_TTF_KERNING_DATA"); +} + +static lv_font_t * lv_tiny_ttf_create(const char * path, const void * data, size_t data_size, int32_t font_size, + lv_font_kerning_t kerning, size_t cache_size) +{ + LV_UNUSED(data_size); + if((path == NULL && data == NULL) || 0 >= font_size) { + LV_LOG_ERROR("tiny_ttf: invalid argument"); + return NULL; + } + ttf_font_desc_t * dsc = lv_malloc_zeroed(sizeof(ttf_font_desc_t)); + if(dsc == NULL) { + LV_LOG_ERROR("tiny_ttf: out of memory"); + return NULL; + } +#if LV_TINY_TTF_FILE_SUPPORT != 0 + if(path != NULL) { + if(LV_FS_RES_OK != lv_fs_open(&dsc->file, path, LV_FS_MODE_RD)) { + lv_free(dsc); + LV_LOG_ERROR("tiny_ttf: unable to open %s\n", path); + return NULL; + } + dsc->stream.file = &dsc->file; + } + else { + dsc->stream.data = (const uint8_t *)data; + dsc->stream.size = data_size; + } + if(0 == stbtt_InitFont(&dsc->info, &dsc->stream, stbtt_GetFontOffsetForIndex(&dsc->stream, 0))) { + lv_free(dsc); + LV_LOG_ERROR("tiny_ttf: init failed"); + return NULL; + } + +#else + dsc->stream = (const uint8_t *)data; + if(0 == stbtt_InitFont(&dsc->info, dsc->stream, stbtt_GetFontOffsetForIndex(dsc->stream, 0))) { + lv_free(dsc); + LV_LOG_ERROR("tiny_ttf: init failed"); + return NULL; + } +#endif + + dsc->cache_size = cache_size; + + lv_font_t * out_font = lv_malloc_zeroed(sizeof(lv_font_t)); + if(out_font == NULL) { + lv_free(dsc); + LV_LOG_ERROR("tiny_ttf: out of memory"); + return NULL; + } + + /* check if font has kerning tables to use, else disable kerning automatically. */ + if(kerning != LV_FONT_KERNING_NONE && stbtt_KernTableCheck(&dsc->info) == 0) { + /* disable kerning if font has no tables. */ + LV_LOG_INFO("Disabling kerning as font doesn't support it."); + kerning = LV_FONT_KERNING_NONE; + } + + dsc->kerning = kerning; + out_font->kerning = kerning; + + out_font->get_glyph_dsc = ttf_get_glyph_dsc_cb; + out_font->get_glyph_bitmap = ttf_get_glyph_bitmap_cb; + out_font->release_glyph = ttf_release_glyph_cb; + out_font->dsc = dsc; + lv_tiny_ttf_set_size(out_font, font_size); + return out_font; +} +#if LV_TINY_TTF_FILE_SUPPORT != 0 +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, int32_t font_size, lv_font_kerning_t kerning, + size_t cache_size) +{ + return lv_tiny_ttf_create(path, NULL, 0, font_size, kerning, cache_size); +} +lv_font_t * lv_tiny_ttf_create_file(const char * path, int32_t font_size) +{ + return lv_tiny_ttf_create(path, NULL, 0, font_size, LV_FONT_KERNING_NORMAL, LV_TINY_TTF_CACHE_GLYPH_CNT); +} +#endif + +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, int32_t font_size, + lv_font_kerning_t kerning, size_t cache_size) +{ + return lv_tiny_ttf_create(NULL, data, data_size, font_size, kerning, cache_size); +} +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, int32_t font_size) +{ + return lv_tiny_ttf_create(NULL, data, data_size, font_size, LV_FONT_KERNING_NORMAL, LV_TINY_TTF_CACHE_GLYPH_CNT); +} + +/*----------------- + * Cache Callbacks + *----------------*/ + +static bool tiny_ttf_glyph_cache_create_cb(tiny_ttf_glyph_cache_data_t * node, void * user_data) +{ + ttf_font_desc_t * dsc = (ttf_font_desc_t *)user_data; + lv_font_glyph_dsc_t * dsc_out = &node->glyph_dsc; + + uint32_t unicode_letter = node->unicode; + + int g1 = stbtt_FindGlyphIndex(&dsc->info, (int)unicode_letter); + if(g1 == 0) { + /* Glyph not found */ + return false; + } + int x1, y1, x2, y2; + + stbtt_GetGlyphBitmapBox(&dsc->info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); + + int advw; + int lsb; + stbtt_GetGlyphHMetrics(&dsc->info, g1, &advw, &lsb); + if(dsc->kerning != LV_FONT_KERNING_NORMAL) { /* calculate default advance */ + dsc_out->adv_w = ttf_get_glyph_pair_kerning_width(dsc, g1, 0, advw); + } + else { + dsc_out->adv_w = ttf_calculate_kerning_width(dsc->scale, advw, 0); + } + /* precalculate no kerning value */ + node->adv_w = advw; + dsc_out->box_w = (x2 - x1 + 1); /*width of the bitmap in [px]*/ + dsc_out->box_h = (y2 - y1 + 1); /*height of the bitmap in [px]*/ + dsc_out->ofs_x = x1; /*X offset of the bitmap in [pf]*/ + dsc_out->ofs_y = -y2; /*Y offset of the bitmap measured from the as line*/ + dsc_out->format = LV_FONT_GLYPH_FORMAT_A8; + dsc_out->is_placeholder = false; + dsc_out->gid.index = (uint32_t)g1; + + return true; +} + +static void tiny_ttf_glyph_cache_free_cb(tiny_ttf_glyph_cache_data_t * node, void * user_data) +{ + LV_UNUSED(node); + LV_UNUSED(user_data); +} + +static lv_cache_compare_res_t tiny_ttf_glyph_cache_compare_cb(const tiny_ttf_glyph_cache_data_t * lhs, + const tiny_ttf_glyph_cache_data_t * rhs) +{ + if(lhs->unicode != rhs->unicode) { + return lhs->unicode > rhs->unicode ? 1 : -1; + } + + return 0; +} + +static bool tiny_ttf_draw_data_cache_create_cb(tiny_ttf_cache_data_t * node, void * user_data) +{ + int g1 = (int)node->glyph_index; + if(g1 == 0) { + /* Glyph not found */ + return false; + } + + ttf_font_desc_t * dsc = (ttf_font_desc_t *)user_data; + + const stbtt_fontinfo * info = (const stbtt_fontinfo *)&dsc->info; + int x1, y1, x2, y2; + stbtt_GetGlyphBitmapBox(info, g1, dsc->scale, dsc->scale, &x1, &y1, &x2, &y2); + int w, h; + w = x2 - x1 + 1; + h = y2 - y1 + 1; + + lv_draw_buf_t * draw_buf = lv_draw_buf_create_ex(font_draw_buf_handlers, w, h, LV_COLOR_FORMAT_A8, LV_STRIDE_AUTO); + if(NULL == draw_buf) { + LV_LOG_ERROR("tiny_ttf: out of memory"); + return false; + } + + lv_draw_buf_clear(draw_buf, NULL); + + uint32_t stride = draw_buf->header.stride; + stbtt_MakeGlyphBitmap(info, draw_buf->data, w, h, stride, dsc->scale, dsc->scale, g1); + + lv_draw_buf_flush_cache(draw_buf, NULL); + node->draw_buf = draw_buf; + return true; +} + +static void tiny_ttf_draw_data_cache_free_cb(tiny_ttf_cache_data_t * node, void * user_data) +{ + LV_UNUSED(user_data); + + lv_draw_buf_destroy(node->draw_buf); +} + +static lv_cache_compare_res_t tiny_ttf_draw_data_cache_compare_cb(const tiny_ttf_cache_data_t * lhs, + const tiny_ttf_cache_data_t * rhs) +{ + if(lhs->glyph_index != rhs->glyph_index) { + return lhs->glyph_index > rhs->glyph_index ? 1 : -1; + } + + if(lhs->size != rhs->size) { + return lhs->size > rhs->size ? 1 : -1; + } + + return 0; +} + +static bool tiny_ttf_kerning_cache_create_cb(tiny_ttf_kerning_cache_data_t * node, void * user_data) +{ + tiny_ttf_kerning_cache_create_data_t * create_data = (tiny_ttf_kerning_cache_create_data_t *)user_data; + const ttf_font_desc_t * dsc = create_data->dsc; + const int adv_w = create_data->adv_w; + const int k = stbtt_GetGlyphKernAdvance(&dsc->info, node->glyph1_idx, node->glyph2_idx); + node->adv_w16 = ttf_calculate_kerning_width(dsc->scale, adv_w, k); + return true; +} + +static void tiny_ttf_kerning_cache_free_cb(tiny_ttf_kerning_cache_data_t * node, void * user_data) +{ + LV_UNUSED(node); + LV_UNUSED(user_data); +} + +static lv_cache_compare_res_t tiny_ttf_kerning_cache_compare_cb(const tiny_ttf_kerning_cache_data_t * lhs, + const tiny_ttf_kerning_cache_data_t * rhs) +{ + lv_cache_compare_res_t ret = lhs->glyph1_idx - rhs->glyph1_idx; + if(ret == 0) { + return lhs->glyph2_idx - rhs->glyph2_idx; + } + return ret; +} + +static lv_font_t * tiny_ttf_font_create_cb(const lv_font_info_t * info, const void * src) +{ + const lv_tiny_ttf_font_src_t * font_src = src; + + if(font_src->path) { +#if LV_TINY_TTF_FILE_SUPPORT + if(font_src->cache_size) { + return lv_tiny_ttf_create_file_ex(font_src->path, info->size, info->kerning, font_src->cache_size); + } + + return lv_tiny_ttf_create_file(font_src->path, info->size); +#else + LV_LOG_WARN("LV_TINY_TTF_FILE_SUPPORT not enabled"); + return NULL; +#endif + } + + if(font_src->cache_size) { + return lv_tiny_ttf_create_data_ex(font_src->data, font_src->data_size, info->size, info->kerning, font_src->cache_size); + } + + return lv_tiny_ttf_create_data(font_src->data, font_src->data_size, info->size); +} + +static void tiny_ttf_font_delete_cb(lv_font_t * font) +{ + lv_tiny_ttf_destroy(font); +} + +static void * tiny_ttf_font_dup_src_cb(const void * src) +{ + const lv_tiny_ttf_font_src_t * font_src = src; + + lv_tiny_ttf_font_src_t * new_src = lv_malloc_zeroed(sizeof(lv_tiny_ttf_font_src_t)); + LV_ASSERT_MALLOC(new_src); + *new_src = *font_src; + + if(font_src->path) { + new_src->path = lv_strdup(font_src->path); + } + + return new_src; +} + +static void tiny_ttf_font_free_src_cb(void * src) +{ + lv_tiny_ttf_font_src_t * font_src = src; + if(font_src->path) { + lv_free((char *)font_src->path); + font_src->path = NULL; + } + + lv_free(font_src); +} + +#endif diff --git a/inc/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h b/inc/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h new file mode 100644 index 0000000..09910bc --- /dev/null +++ b/inc/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h @@ -0,0 +1,107 @@ +/** + * @file lv_tiny_ttf.h + * + */ + +#ifndef LV_TINY_TTF_H +#define LV_TINY_TTF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_TINY_TTF + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + const char * path; /**< Path to the font file*/ + const void * data; /**< Pointer to the font data*/ + size_t data_size; /**< Size of the font data*/ + size_t cache_size; /**< Size of the font cache*/ +} lv_tiny_ttf_font_src_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_font_class_t lv_tiny_ttf_font_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_TINY_TTF_FILE_SUPPORT != 0 +/** + * Create a font from the specified file or path with the specified line height. + * @param path the path or file name of the font + * @param font_size the font size in pixel + * @return a font object + */ +lv_font_t * lv_tiny_ttf_create_file(const char * path, int32_t font_size); + +/** + * Create a font from the specified file or path with the specified line height with the specified cache size. + * @param path the path or file name of the font + * @param font_size the font size in pixel + * @param kerning kerning value in pixel + * @param cache_size the cache size in count + * @return a font object + */ +lv_font_t * lv_tiny_ttf_create_file_ex(const char * path, int32_t font_size, lv_font_kerning_t kerning, + size_t cache_size); +#endif + +/** + * Create a font from the specified data pointer with the specified line height. + * @param data the data pointer + * @param data_size the data size + * @param font_size the font size in pixel + * @return a font object + */ +lv_font_t * lv_tiny_ttf_create_data(const void * data, size_t data_size, int32_t font_size); + +/** + * Create a font from the specified data pointer with the specified line height and the specified cache size. + * @param data the data pointer + * @param data_size the data size + * @param font_size the font size in pixel + * @param kerning kerning value in pixel + * @param cache_size the cache size in count + * @return + */ +lv_font_t * lv_tiny_ttf_create_data_ex(const void * data, size_t data_size, int32_t font_size, + lv_font_kerning_t kerning, size_t cache_size); + +/** + * Set the size of the font to a new font_size + * @note the font bitmap cache and glyph cache will be flushed. + * @param font the font object + * @param font_size the font size in pixel + */ +void lv_tiny_ttf_set_size(lv_font_t * font, int32_t font_size); + +/** + * Destroy a font previously created with lv_tiny_ttf_create_xxxx() + * @param font the font object + */ +void lv_tiny_ttf_destroy(lv_font_t * font); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TINY_TTF*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TINY_TTF_H*/ diff --git a/inc/lvgl/src/libs/tiny_ttf/stb_rect_pack.h b/inc/lvgl/src/libs/tiny_ttf/stb_rect_pack.h new file mode 100644 index 0000000..b4c8b4d --- /dev/null +++ b/inc/lvgl/src/libs/tiny_ttf/stb_rect_pack.h @@ -0,0 +1,633 @@ +// stb_rect_pack.h - v1.01 - public domain - rectangle packing +// Sean Barrett 2014 +// +// Useful for e.g. packing rectangular textures into an atlas. +// Does not do rotation. +// +// Before #including, +// +// #define STB_RECT_PACK_IMPLEMENTATION +// +// in the file that you want to have the implementation. +// +// Not necessarily the awesomest packing method, but better than +// the totally naive one in stb_truetype (which is primarily what +// this is meant to replace). +// +// Has only had a few tests run, may have issues. +// +// More docs to come. +// +// No memory allocations; uses qsort() and assert() from stdlib. +// Can override those by defining STBRP_SORT and STBRP_ASSERT. +// +// This library currently uses the Skyline Bottom-Left algorithm. +// +// Please note: better rectangle packers are welcome! Please +// implement them to the same API, but with a different init +// function. +// +// Credits +// +// Library +// Sean Barrett +// Minor features +// Martins Mozeiko +// github:IntellectualKitty +// +// Bugfixes / warning fixes +// Jeremy Jaussaud +// Fabian Giesen +// +// Version history: +// +// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section +// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles +// 0.99 (2019-02-07) warning fixes +// 0.11 (2017-03-03) return packing success/fail result +// 0.10 (2016-10-25) remove cast-away-const to avoid warnings +// 0.09 (2016-08-27) fix compiler warnings +// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) +// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) +// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort +// 0.05: added STBRP_ASSERT to allow replacing assert +// 0.04: fixed minor bug in STBRP_LARGE_RECTS support +// 0.01: initial release +// +// LICENSE +// +// See end of file for license information. + +////////////////////////////////////////////////////////////////////////////// +// +// INCLUDE SECTION +// + +#ifndef STB_INCLUDE_STB_RECT_PACK_H +#define STB_INCLUDE_STB_RECT_PACK_H + +#define STB_RECT_PACK_VERSION 1 + +#ifdef STBRP_STATIC + #define STBRP_DEF static +#else + #define STBRP_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbrp_context stbrp_context; +typedef struct stbrp_node stbrp_node; +typedef struct stbrp_rect stbrp_rect; +/// @endcond + +typedef int stbrp_coord; + +#define STBRP__MAXVAL 0x7fffffff +// Mostly for internal use, but this is the maximum supported coordinate value. + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects); +// Assign packed locations to rectangles. The rectangles are of type +// 'stbrp_rect' defined below, stored in the array 'rects', and there +// are 'num_rects' many of them. +// +// Rectangles which are successfully packed have the 'was_packed' flag +// set to a non-zero value and 'x' and 'y' store the minimum location +// on each axis (i.e. bottom-left in cartesian coordinates, top-left +// if you imagine y increasing downwards). Rectangles which do not fit +// have the 'was_packed' flag set to 0. +// +// You should not try to access the 'rects' array from another thread +// while this function is running, as the function temporarily reorders +// the array while it executes. +// +// To pack into another rectangle, you need to call stbrp_init_target +// again. To continue packing into the same rectangle, you can call +// this function again. Calling this multiple times with multiple rect +// arrays will probably produce worse packing results than calling it +// a single time with the full rectangle array, but the option is +// available. +// +// The function returns 1 if all of the rectangles were successfully +// packed and 0 otherwise. + +struct stbrp_rect { + // reserved for your use: + int id; + + // input: + stbrp_coord w, h; + + // output: + stbrp_coord x, y; + int was_packed; // non-zero if valid packing + +}; // 16 bytes, nominally + +STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes); +// Initialize a rectangle packer to: +// pack a rectangle that is 'width' by 'height' in dimensions +// using temporary storage provided by the array 'nodes', which is 'num_nodes' long +// +// You must call this function every time you start packing into a new target. +// +// There is no "shutdown" function. The 'nodes' memory must stay valid for +// the following stbrp_pack_rects() call (or calls), but can be freed after +// the call (or calls) finish. +// +// Note: to guarantee best results, either: +// 1. make sure 'num_nodes' >= 'width' +// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' +// +// If you don't do either of the above things, widths will be quantized to multiples +// of small integers to guarantee the algorithm doesn't run out of temporary storage. +// +// If you do #2, then the non-quantized algorithm will be used, but the algorithm +// may run out of temporary storage and be unable to pack some rectangles. + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem); +// Optionally call this function after init but before doing any packing to +// change the handling of the out-of-temp-memory scenario, described above. +// If you call init again, this will be reset to the default (false). + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic); +// Optionally select which packing heuristic the library should use. Different +// heuristics will produce better/worse results for different data sets. +// If you call init again, this will be reset to the default. + +enum { + STBRP_HEURISTIC_Skyline_default = 0, + STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, + STBRP_HEURISTIC_Skyline_BF_sortHeight +}; + +////////////////////////////////////////////////////////////////////////////// +// +// the details of the following structures don't matter to you, but they must +// be visible so you can handle the memory allocations for them + +struct stbrp_node { + stbrp_coord x, y; + stbrp_node * next; +}; + +struct stbrp_context { + int width; + int height; + int align; + int init_mode; + int heuristic; + int num_nodes; + stbrp_node * active_head; + stbrp_node * free_head; + stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' +}; + +#ifdef __cplusplus +} +#endif + +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// IMPLEMENTATION SECTION +// + +#ifdef STB_RECT_PACK_IMPLEMENTATION +#ifndef STBRP_SORT + #include + #define STBRP_SORT qsort +#endif + +#ifndef STBRP_ASSERT + #include + #define STBRP_ASSERT assert +#endif + +#ifdef _MSC_VER + #define STBRP__NOTUSED(v) (void)(v) + #define STBRP__CDECL __cdecl +#else + #define STBRP__NOTUSED(v) (void)sizeof(v) + #define STBRP__CDECL +#endif + +enum { + STBRP__INIT_skyline = 1 +}; + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context * context, int heuristic) +{ + switch(context->init_mode) { + case STBRP__INIT_skyline: + STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); + context->heuristic = heuristic; + break; + default: + STBRP_ASSERT(0); + } +} + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context * context, int allow_out_of_mem) +{ + if(allow_out_of_mem) + // if it's ok to run out of memory, then don't bother aligning them; + // this gives better packing, but may fail due to OOM (even though + // the rectangles easily fit). @TODO a smarter approach would be to only + // quantize once we've hit OOM, then we could get rid of this parameter. + context->align = 1; + else { + // if it's not ok to run out of memory, then quantize the widths + // so that num_nodes is always enough nodes. + // + // I.e. num_nodes * align >= width + // align >= width / num_nodes + // align = ceil(width/num_nodes) + + context->align = (context->width + context->num_nodes - 1) / context->num_nodes; + } +} + +STBRP_DEF void stbrp_init_target(stbrp_context * context, int width, int height, stbrp_node * nodes, int num_nodes) +{ + int i; + + for(i = 0; i < num_nodes - 1; ++i) + nodes[i].next = &nodes[i + 1]; + nodes[i].next = NULL; + context->init_mode = STBRP__INIT_skyline; + context->heuristic = STBRP_HEURISTIC_Skyline_default; + context->free_head = &nodes[0]; + context->active_head = &context->extra[0]; + context->width = width; + context->height = height; + context->num_nodes = num_nodes; + stbrp_setup_allow_out_of_mem(context, 0); + + // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) + context->extra[0].x = 0; + context->extra[0].y = 0; + context->extra[0].next = &context->extra[1]; + context->extra[1].x = (stbrp_coord) width; + context->extra[1].y = (1 << 30); + context->extra[1].next = NULL; +} + +// find minimum y position if it starts at x1 +static int stbrp__skyline_find_min_y(stbrp_context * c, stbrp_node * first, int x0, int width, int * pwaste) +{ + stbrp_node * node = first; + int x1 = x0 + width; + int min_y, visited_width, waste_area; + + STBRP__NOTUSED(c); + + STBRP_ASSERT(first->x <= x0); + +#if 0 + // skip in case we're past the node + while(node->next->x <= x0) + ++node; +#else + STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency +#endif + + STBRP_ASSERT(node->x <= x0); + + min_y = 0; + waste_area = 0; + visited_width = 0; + while(node->x < x1) { + if(node->y > min_y) { + // raise min_y higher. + // we've accounted for all waste up to min_y, + // but we'll now add more waste for everything we've visited + waste_area += visited_width * (node->y - min_y); + min_y = node->y; + // the first time through, visited_width might be reduced + if(node->x < x0) + visited_width += node->next->x - x0; + else + visited_width += node->next->x - node->x; + } + else { + // add waste area + int under_width = node->next->x - node->x; + if(under_width + visited_width > width) + under_width = width - visited_width; + waste_area += under_width * (min_y - node->y); + visited_width += under_width; + } + node = node->next; + } + + *pwaste = waste_area; + return min_y; +} + +typedef struct { + int x, y; + stbrp_node ** prev_link; +} stbrp__findresult; + +static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context * c, int width, int height) +{ + int best_waste = (1 << 30), best_x, best_y = (1 << 30); + stbrp__findresult fr; + stbrp_node ** prev, * node, * tail, ** best = NULL; + + // align to multiple of c->align + width = (width + c->align - 1); + width -= width % c->align; + STBRP_ASSERT(width % c->align == 0); + + // if it can't possibly fit, bail immediately + if(width > c->width || height > c->height) { + fr.prev_link = NULL; + fr.x = fr.y = 0; + return fr; + } + + node = c->active_head; + prev = &c->active_head; + while(node->x + width <= c->width) { + int y, waste; + y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); + if(c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL + // bottom left + if(y < best_y) { + best_y = y; + best = prev; + } + } + else { + // best-fit + if(y + height <= c->height) { + // can only use it if it first vertically + if(y < best_y || (y == best_y && waste < best_waste)) { + best_y = y; + best_waste = waste; + best = prev; + } + } + } + prev = &node->next; + node = node->next; + } + + best_x = (best == NULL) ? 0 : (*best)->x; + + // if doing best-fit (BF), we also have to try aligning right edge to each node position + // + // e.g, if fitting + // + // ____________________ + // |____________________| + // + // into + // + // | | + // | ____________| + // |____________| + // + // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned + // + // This makes BF take about 2x the time + + if(c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { + tail = c->active_head; + node = c->active_head; + prev = &c->active_head; + // find first node that's admissible + while(tail->x < width) + tail = tail->next; + while(tail) { + int xpos = tail->x - width; + int y, waste; + STBRP_ASSERT(xpos >= 0); + // find the left position that matches this + while(node->next->x <= xpos) { + prev = &node->next; + node = node->next; + } + STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); + y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); + if(y + height <= c->height) { + if(y <= best_y) { + if(y < best_y || waste < best_waste || (waste == best_waste && xpos < best_x)) { + best_x = xpos; + STBRP_ASSERT(y <= best_y); + best_y = y; + best_waste = waste; + best = prev; + } + } + } + tail = tail->next; + } + } + + fr.prev_link = best; + fr.x = best_x; + fr.y = best_y; + return fr; +} + +static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context * context, int width, int height) +{ + // find best position according to heuristic + stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); + stbrp_node * node, * cur; + + // bail if: + // 1. it failed + // 2. the best node doesn't fit (we don't always check this) + // 3. we're out of memory + if(res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { + res.prev_link = NULL; + return res; + } + + // on success, create new node + node = context->free_head; + node->x = (stbrp_coord) res.x; + node->y = (stbrp_coord)(res.y + height); + + context->free_head = node->next; + + // insert the new node into the right starting point, and + // let 'cur' point to the remaining nodes needing to be + // stitched back in + + cur = *res.prev_link; + if(cur->x < res.x) { + // preserve the existing one, so start testing with the next one + stbrp_node * next = cur->next; + cur->next = node; + cur = next; + } + else { + *res.prev_link = node; + } + + // from here, traverse cur and free the nodes, until we get to one + // that shouldn't be freed + while(cur->next && cur->next->x <= res.x + width) { + stbrp_node * next = cur->next; + // move the current node to the free list + cur->next = context->free_head; + context->free_head = cur; + cur = next; + } + + // stitch the list back in + node->next = cur; + + if(cur->x < res.x + width) + cur->x = (stbrp_coord)(res.x + width); + +#ifdef _DEBUG + cur = context->active_head; + while(cur->x < context->width) { + STBRP_ASSERT(cur->x < cur->next->x); + cur = cur->next; + } + STBRP_ASSERT(cur->next == NULL); + + { + int count = 0; + cur = context->active_head; + while(cur) { + cur = cur->next; + ++count; + } + cur = context->free_head; + while(cur) { + cur = cur->next; + ++count; + } + STBRP_ASSERT(count == context->num_nodes + 2); + } +#endif + + return res; +} + +static int STBRP__CDECL rect_height_compare(const void * a, const void * b) +{ + const stbrp_rect * p = (const stbrp_rect *) a; + const stbrp_rect * q = (const stbrp_rect *) b; + if(p->h > q->h) + return -1; + if(p->h < q->h) + return 1; + return (p->w > q->w) ? -1 : (p->w < q->w); +} + +static int STBRP__CDECL rect_original_order(const void * a, const void * b) +{ + const stbrp_rect * p = (const stbrp_rect *) a; + const stbrp_rect * q = (const stbrp_rect *) b; + return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); +} + +STBRP_DEF int stbrp_pack_rects(stbrp_context * context, stbrp_rect * rects, int num_rects) +{ + int i, all_rects_packed = 1; + + // we use the 'was_packed' field internally to allow sorting/unsorting + for(i = 0; i < num_rects; ++i) { + rects[i].was_packed = i; + } + + // sort according to heuristic + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); + + for(i = 0; i < num_rects; ++i) { + if(rects[i].w == 0 || rects[i].h == 0) { + rects[i].x = rects[i].y = 0; // empty rect needs no space + } + else { + stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); + if(fr.prev_link) { + rects[i].x = (stbrp_coord) fr.x; + rects[i].y = (stbrp_coord) fr.y; + } + else { + rects[i].x = rects[i].y = STBRP__MAXVAL; + } + } + } + + // unsort + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); + + // set was_packed flags and all_rects_packed status + for(i = 0; i < num_rects; ++i) { + rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); + if(!rects[i].was_packed) + all_rects_packed = 0; + } + + // return the all_rects_packed status + return all_rects_packed; +} +#endif + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop +#endif + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/inc/lvgl/src/libs/tiny_ttf/stb_truetype_htcw.h b/inc/lvgl/src/libs/tiny_ttf/stb_truetype_htcw.h new file mode 100644 index 0000000..d2dc388 --- /dev/null +++ b/inc/lvgl/src/libs/tiny_ttf/stb_truetype_htcw.h @@ -0,0 +1,5598 @@ +// stb_truetype.h - v1.26htcw (fork to enable streaming and low memory environments) +// stb_truetype.h - v1.26 - public domain +// authored from 2009-2021 by Sean Barrett / RAD Game Tools +// +// ======================================================================= +// +// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES +// +// This library does no range checking of the offsets found in the file, +// meaning an attacker can use it to read arbitrary memory. +// +// ======================================================================= +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// render glyphs to one-channel SDF bitmaps (signed-distance field/function) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// Dougall Johnson: OpenType / Type 2 font handling +// Daniel Ribeiro Maciel: basic GPOS-based kerning +// +// Misc other: +// Ryan Gordon +// Simon Glass +// github:IntellectualKitty +// Imanol Celaya +// Daniel Ribeiro Maciel +// +// Bug/warning reports/fixes: +// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe +// Cass Everitt Martins Mozeiko github:aloucks +// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam +// Brian Hook Omar Cornut github:vassvik +// Walter van Niftrik Ryan Griege +// David Gow Peter LaValle +// David Given Sergey Popov +// Ivan-Assen Ivanov Giumo X. Clanjor +// Anthony Pesch Higor Euripedes +// Johan Duparc Thomas Fields +// Hou Qiming Derek Vinyard +// Rob Loach Cort Stratton +// Kenney Phillis Jr. Brian Costabile +// Ken Voskuil (kaesve) +// +// VERSION HISTORY +// +// 1.26 (2021-08-28) fix broken rasterizer +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// variant PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// +// Full history can be found at the end of this file. +// +// LICENSE +// +// See end of file for license information. +// +// USAGE +// +// Include this file in whatever places need to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// To make the implementation private to the file that generates the implementation, +// #define STBTT_STATIC +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// Improved 3D API (more shippable): +// #include "stb_rect_pack.h" -- optional, but you really want it +// stbtt_PackBegin() +// stbtt_PackSetOversampling() -- for improved quality on small fonts +// stbtt_PackFontRanges() -- pack and renders +// stbtt_PackEnd() +// stbtt_GetPackedQuad() +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections +// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetFontVMetricsOS2() +// stbtt_GetCodepointKernAdvance() +// +// Starting with version 1.06, the rasterizer was replaced with a new, +// faster and generally-more-precise rasterizer. The new rasterizer more +// accurately measures pixel coverage for anti-aliasing, except in the case +// where multiple shapes overlap, in which case it overestimates the AA pixel +// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If +// this turns out to be a problem, you can re-enable the old rasterizer with +// #define STBTT_RASTERIZER_VERSION 1 +// which will incur about a 15% speed hit. +// +// ADDITIONAL DOCUMENTATION +// +// Immediately after this block comment are a series of sample programs. +// +// After the sample programs is the "header file" section. This section +// includes documentation for each API function. +// +// Some important concepts to understand to use this library: +// +// Codepoint +// Characters are defined by unicode codepoints, e.g. 65 is +// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is +// the hiragana for "ma". +// +// Glyph +// A visual character shape (every codepoint is rendered as +// some glyph) +// +// Glyph index +// A font-specific integer ID representing a glyph +// +// Baseline +// Glyph shapes are defined relative to a baseline, which is the +// bottom of uppercase characters. Characters extend both above +// and below the baseline. +// +// Current Point +// As you draw text to the screen, you keep track of a "current point" +// which is the origin of each character. The current point's vertical +// position is the baseline. Even "baked fonts" use this model. +// +// Vertical Font Metrics +// The vertical qualities of the font, used to vertically position +// and space the characters. See docs for stbtt_GetFontVMetrics. +// +// Font Size in Pixels or Points +// The preferred interface for specifying font sizes in stb_truetype +// is to specify how tall the font's vertical extent should be in pixels. +// If that sounds good enough, skip the next paragraph. +// +// Most font APIs instead use "points", which are a common typographic +// measurement for describing font size, defined as 72 points per inch. +// stb_truetype provides a point API for compatibility. However, true +// "per inch" conventions don't make much sense on computer displays +// since different monitors have different number of pixels per +// inch. For example, Windows traditionally uses a convention that +// there are 96 pixels per inch, thus making 'inch' measurements have +// nothing to do with inches, and thus effectively defining a point to +// be 1.333 pixels. Additionally, the TrueType font data provides +// an explicit scale factor to scale a given font's glyphs to points, +// but the author has observed that this scale factor is often wrong +// for non-commercial fonts, thus making fonts scaled in points +// according to the TrueType spec incoherently sized in practice. +// +// DETAILED USAGE: +// +// Scale: +// Select how high you want the font to be, in points or pixels. +// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute +// a scale factor SF that will be used by all other functions. +// +// Baseline: +// You need to select a y-coordinate that is the baseline of where +// your text will appear. Call GetFontBoundingBox to get the baseline-relative +// bounding box for all characters. SF*-y0 will be the distance in pixels +// that the worst-case character could extend above the baseline, so if +// you want the top edge of characters to appear at the top of the +// screen where y=0, then you would set the baseline to SF*-y0. +// +// Current point: +// Set the current point where the first character will appear. The +// first character could extend left of the current point; this is font +// dependent. You can either choose a current point that is the leftmost +// point and hope, or add some padding, or check the bounding box or +// left-side-bearing of the first character to be displayed and set +// the current point based on that. +// +// Displaying a character: +// Compute the bounding box of the character. It will contain signed values +// relative to . I.e. if it returns x0,y0,x1,y1, +// then the character should be displayed in the rectangle from +// to = 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512, 512, *text - 32, &x, &y, &q, 1);//1=opengl & d3d10+,0=d3d9 + glTexCoord2f(q.s0, q.t0); + glVertex2f(q.x0, q.y0); + glTexCoord2f(q.s1, q.t0); + glVertex2f(q.x1, q.y0); + glTexCoord2f(q.s1, q.t1); + glVertex2f(q.x1, q.y1); + glTexCoord2f(q.s0, q.t1); + glVertex2f(q.x0, q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1 << 25]; + +int main(int argc, char ** argv) +{ + stbtt_fontinfo font; + unsigned char * bitmap; + int w, h, i, j, c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1 << 25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer, 0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0, stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0, 0); + + for(j = 0; j < h; ++j) { + for(i = 0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j * w + i] >> 5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24 << 20]; +unsigned char screen[20][79]; + +int main(int arg, char ** argv) +{ + stbtt_fontinfo font; + int i, j, ascent, baseline, ch = 0; + float scale, xpos = 2; // leave a little padding in case the character extends left + char * text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent, 0, 0); + baseline = (int)(ascent * scale); + + while(text[ch]) { + int advance, lsb, x0, y0, x1, y1; + float x_shift = xpos - (float)floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale, scale, x_shift, 0, &x0, &y0, &x1, &y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int)xpos + x0], x1 - x0, y1 - y0, 79, scale, scale, + x_shift, 0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to render + // a sequence of characters, you really need to render each bitmap to a temp buffer, then + // "alpha blend" that into the working buffer + xpos += (advance * scale); + if(text[ch + 1]) + xpos += scale * stbtt_GetCodepointKernAdvance(&font, text[ch], text[ch + 1]); + ++ch; + } + + for(j = 0; j < 20; ++j) { + for(i = 0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i] >> 5]); + putchar('\n'); + } + + return 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH YOUR CODEBASE +//// +//// The following sections allow you to supply alternate definitions +//// of C library functions used by stb_truetype, e.g. if you don't +//// link with the C runtime library. + +#ifdef STB_TRUETYPE_IMPLEMENTATION +// #define your own (u)stbtt_int8/16/32 before including to override this +#ifndef stbtt_uint8 + typedef unsigned char stbtt_uint8; + typedef signed char stbtt_int8; + typedef unsigned short stbtt_uint16; + typedef signed short stbtt_int16; + typedef unsigned int stbtt_uint32; + typedef signed int stbtt_int32; +#endif + +typedef char stbtt__check_size32[sizeof(stbtt_int32) == 4 ? 1 : -1]; +typedef char stbtt__check_size16[sizeof(stbtt_int16) == 2 ? 1 : -1]; + +// define STBTT_STDIO_STREAM to stream from a FILE object +// instead of from memory. Or define STBTT_STREAM_TYPE, +// STBTT_STREAM_READ and STBTT_STREAM_SEEK to implement +// another streaming source +#ifdef STBTT_STDIO_STREAM + #include + #define STBTT_STREAM_TYPE FILE* + #define STBTT_STREAM_READ(s,x,y) fread(x,1,y,s); + #define STBTT_STREAM_SEEK(s,x) fseek(s,x,SEEK_SET); +#endif + +// heap factor sizes for various counts of objects +// adjust for your platform. Below is suitable for +// modern PC class machines. +#ifndef STBTT_HEAP_FACTOR_SIZE_32 + #define STBTT_HEAP_FACTOR_SIZE_32 2000 +#endif + +#ifndef STBTT_HEAP_FACTOR_SIZE_128 + #define STBTT_HEAP_FACTOR_SIZE_128 800 +#endif + +#ifndef STBTT_HEAP_FACTOR_SIZE_DEFAULT + #define STBTT_HEAP_FACTOR_SIZE_DEFAULT 100 +#endif + +// e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h +#ifndef STBTT_ifloor + #include + #define STBTT_ifloor(x) ((int) floor(x)) + #define STBTT_iceil(x) ((int) ceil(x)) +#endif + +#ifndef STBTT_sqrt + #include + #define STBTT_sqrt(x) (float)sqrt(x) + #define STBTT_pow(x,y) pow(x,y) +#endif + +#ifndef STBTT_fmod + #include + #define STBTT_fmod(x,y) fmod(x,y) +#endif + +#ifndef STBTT_cos + #include + #define STBTT_cos(x) cos(x) + #define STBTT_acos(x) acos(x) +#endif + +#ifndef STBTT_fabs + #include + #define STBTT_fabs(x) (float)fabs(x) +#endif + +// #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h +#ifndef STBTT_malloc + #include + #define STBTT_malloc(x,u) ((void)(u),malloc(x)) + #define STBTT_free(x,u) ((void)(u),free(x)) +#endif + +#ifndef STBTT_assert + #include + #define STBTT_assert(x) assert(x) +#endif + +#ifndef STBTT_strlen + #include + #define STBTT_strlen(x) strlen(x) +#endif + +#ifndef STBTT_memcpy + #include + #define STBTT_memcpy memcpy + #define STBTT_memset memset +#endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef STBTT_STATIC + #define STBTT_DEF static +#else + #define STBTT_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// private structure +typedef struct { +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data; + stbtt_uint32 offset; +#else + unsigned char * data; +#endif + int cursor; + int size; +} stbtt__buf; + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// TEXTURE BAKING API +// +// If you use this API, you only have to call two functions ever. +// + +typedef struct { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; +} stbtt_bakedchar; + +typedef struct { + float x0, y0, s0, t0; // top-left + float x1, y1, s1, t1; // bottom-right +} stbtt_aligned_quad; + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, // same data as above + int char_index, // character to display + float * xpos, float * ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad * q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// +// The coordinate system used assumes y increases downwards. +// +// Characters will extend both above and below the current position; +// see discussion of "BASELINE" above. +// +// It's inefficient; you might want to c&p it and optimize it. + +////////////////////////////////////////////////////////////////////////////// +// +// NEW TEXTURE BAKING API +// +// This provides options for packing multiple fonts into one atlas, not +// perfectly but better than nothing. + +typedef struct { + unsigned short x0, y0, x1, y1; // coordinates of bbox in bitmap + float xoff, yoff, xadvance; + float xoff2, yoff2; +} stbtt_packedchar; + +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbtt_pack_context stbtt_pack_context; +typedef struct stbtt_fontinfo stbtt_fontinfo; +/// @endcond + +#ifndef STB_RECT_PACK_VERSION +/// @cond +/** + * Tells Doxygen to ignore a duplicate declaration + */ +typedef struct stbrp_rect stbrp_rect; +/// @endcond + +#endif +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int width, int height, + int stride_in_bytes, int padding, void * alloc_context); + +// Initializes a packing context stored in the passed-in stbtt_pack_context. +// Future calls using this context will pack characters into the bitmap passed +// in here: a 1-channel bitmap that is width * height. stride_in_bytes is +// the distance from one row to the next (or 0 to mean they are packed tightly +// together). "padding" is the amount of padding to leave between each +// character (normally you want '1' for bitmaps you'll use as textures with +// bilinear filtering). +// +// Returns 0 on failure, 1 on success. + +STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc); +// Cleans up the packing context and frees all memory. + +#define STBTT_POINT_SIZE(x) (-(x)) + +typedef struct { + float font_size; + int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint + int * array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints + int num_chars; + stbtt_packedchar * chardata_for_range; // output + unsigned char h_oversample, v_oversample; // don't set these, they're used internally +} stbtt_pack_range; + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, + unsigned int v_oversample); +// Oversampling a font increases the quality by allowing higher-quality subpixel +// positioning, and is especially valuable at smaller text sizes. +// +// This function sets the amount of oversampling for all following calls to +// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given +// pack context. The default (no oversampling) is achieved by h_oversample=1 +// and v_oversample=1. The total number of pixels required is +// h_oversample*v_oversample larger than the default; for example, 2x2 +// oversampling requires 4x the storage of 1x1. For best results, render +// oversampled textures with bilinear filtering. Look at the readme in +// stb/tests/oversample for information about oversampled fonts +// +// To use with PackFontRangesGather etc., you must set it before calls +// call to PackFontRangesGatherRects. + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip); +// If skip != 0, this tells stb_truetype to skip any codepoints for which +// there is no corresponding glyph. If skip=0, which is the default, then +// codepoints without a glyph received the font's "missing character" glyph, +// typically an empty box by convention. + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, // same data as above + int char_index, // character to display + float * xpos, float * ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad * q, // output: quad to draw + int align_to_integer); + +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects); +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects); +// Calling these functions in sequence is roughly equivalent to calling +// stbtt_PackFontRanges(). If you more control over the packing of multiple +// fonts, or if you want to pack custom data into a font texture, take a look +// at the source to of stbtt_PackFontRanges() and create a custom version +// using these functions, e.g. call GatherRects multiple times, +// building up a single array of rects, then call PackRects once, +// then call RenderIntoRects repeatedly. This may result in a +// better packing than calling PackFontRanges multiple times +// (or it may not). + +// this is an opaque structure that you shouldn't mess with which holds +// all the context needed from PackBegin to PackEnd. +struct stbtt_pack_context { + void * user_allocator_context; + void * pack_info; + int width; + int height; + int stride_in_bytes; + int padding; + int skip_missing; + unsigned int h_oversample, v_oversample; + unsigned char * pixels; + void * nodes; +}; + +////////////////////////////////////////////////////////////////////////////// +// +// FONT LOADING +// +// +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data); +#else +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data); +#endif +// This function will determine the number of fonts in a font file. TrueType +// collection (.ttc) files may contain multiple fonts, while TrueType font +// (.ttf) files only contain one font. The number of fonts can be used for +// indexing with the previous function where the index is between zero and one +// less than the total fonts. If an error occurs, -1 is returned. +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE, int index); +#else +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index); +#endif + +// Each .ttf/.ttc file may have more than one font. Each font has a sequential +// index number starting from 0. Call this function to get the font offset for +// a given index; it returns -1 if the index is out of range. A regular .ttf +// file will only define one font and it always be at offset 0, so it will +// return '0' for index 0, and -1 for all other indices. + +// The following structure is defined publicly so you can declare one on +// the stack or as a global or etc, but you should treat it as opaque. +struct stbtt_fontinfo { + void * userdata; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data; +#else + unsigned char * data; // pointer to .ttf file +#endif + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca, head, glyf, hhea, hmtx, kern, gpos, svg; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph + + stbtt__buf cff; // cff font data + stbtt__buf charstrings; // the charstring index + stbtt__buf gsubrs; // global charstring subroutines index + stbtt__buf subrs; // private charstring subroutines index + stbtt__buf fontdicts; // array of font dicts + stbtt__buf fdselect; // map from glyph to fontdict +}; +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset); +#else +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset); +#endif +// Given an offset into the file that defines a font, this function builds +// the necessary cached info for the rest of the system. You must allocate +// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't +// need to do anything special to free it, because the contents are pure +// value data with no additional data structures. Returns 0 on failure. + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER TO GLYPH-INDEX CONVERSIOn + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint); +// If you're going to perform multiple operations on the same character +// and you want a speed-up, call this function with the character you're +// going to process, then use glyph-based functions instead of the +// codepoint-based functions. +// Returns 0 if the character codepoint is not defined in the font. + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER PROPERTIES +// + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float pixels); +// computes a scale factor to produce a font whose "height" is 'pixels' tall. +// Height is measured as the distance from the highest ascender to the lowest +// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics +// and computing: +// scale = pixels / (ascent - descent) +// so if you prefer to measure height by the ascent only, use a similar calculation. + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels); +// computes a scale factor to produce a font whose EM size is mapped to +// 'pixels' tall. This is probably what traditional APIs compute, but +// I'm not positive. + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap); +// ascent is the coordinate above the baseline the font extends; descent +// is the coordinate below the baseline the font extends (i.e. it is typically negative) +// lineGap is the spacing between one row's descent and the next row's ascent... +// so you should advance the vertical position by "*ascent - *descent + *lineGap" +// these are expressed in unscaled coordinates, so you must multiply by +// the scale factor for a given size + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, + int * typoLineGap); +// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 +// table (specific to MS/Windows TTF files). +// +// Returns 1 on success (table present), 0 on failure. + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1); +// the bounding box around all possible characters + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, + int * leftSideBearing); +// leftSideBearing is the offset from the current horizontal position to the left edge of the character +// advanceWidth is the offset from the current horizontal position to the next horizontal position +// these are expressed in unscaled coordinates + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2); +// an additional amount to add to the 'advance' value between ch1 and ch2 + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1); +// Gets the bounding box of the visible part of the glyph, in unscaled coordinates + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, + int * leftSideBearing); +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2); +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); +// as above, but takes one or more glyph indices for greater efficiency + +typedef struct _stbtt_kerningentry { + int glyph1; // use stbtt_FindGlyphIndex + int glyph2; + int advance; +} stbtt_kerningentry; + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info); +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length); +// Retrieves a complete list of all of the kerning pairs provided by the font +// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. +// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) + +////////////////////////////////////////////////////////////////////////////// +// +// GLYPH SHAPES (you probably don't need these, but they have to go before +// the bitmaps for C declaration-order reasons) +// + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) +enum { + STBTT_vmove = 1, + STBTT_vline, + STBTT_vcurve, + STBTT_vcubic +}; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values +// (we share this with other code at RAD) +#define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file +typedef struct { + stbtt_vertex_type x, y, cx, cy, cx1, cy1; + unsigned char type, padding; +} stbtt_vertex; +#endif + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index); +// returns non-zero if nothing is drawn for this glyph + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex ** vertices); +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex ** vertices); +// returns # of vertices and fills *vertices with the pointer to them +// these are expressed in "unscaled" coordinates +// +// The shape is a series of contours. Each one starts with +// a STBTT_moveto, then consists of a series of mixed +// STBTT_lineto and STBTT_curveto segments. A lineto +// draws a line from previous endpoint to its x,y; a curveto +// draws a quadratic bezier from previous endpoint to +// its x,y, using cx,cy as the bezier control point. + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * vertices); +// frees the data allocated above + +STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl); +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs); +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs); +// fills svg with the character's SVG data. +// returns data size or 0 if SVG not found. + +////////////////////////////////////////////////////////////////////////////// +// +// BITMAP RENDERING +// + +STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata); +// frees the bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, + int codepoint, int * width, int * height, int * xoff, int * yoff); +// allocates a large-enough single-channel 8bpp bitmap and renders the +// specified character/glyph at the specified scale into it, with +// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). +// *width & *height are filled out with the width & height of the bitmap, +// which is stored left-to-right, top-to-bottom. +// +// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff); +// the same as stbtt_GetCodepointBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int codepoint); +// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap +// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap +// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the +// width and height and positioning info for it first. + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); +// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, + int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int codepoint); +// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering +// is performed (see stbtt_PackSetOversampling) + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, + int * ix0, int * iy0, int * ix1, int * iy1); +// get the bbox of the bitmap centered around the glyph origin; so the +// bitmap width is ix1-ix0, height is iy1-iy0, and location to place +// the bitmap top left is (leftSideBearing*scale,iy0). +// (Note that the bitmap uses y-increases-down, but the shape uses +// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, + float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); +// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel +// shift for the character + +// the following functions are equivalent to the above functions, but operate +// on glyph indices instead of Unicode codepoints (for efficiency) +STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, + int * width, int * height, int * xoff, int * yoff); +STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff); +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int glyph); +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, + int * iy0, int * ix1, int * iy1); +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, + float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1); + +// @TODO: don't expose this structure +typedef struct { + int w, h, stride; + unsigned char * pixels; +} stbtt__bitmap; + +// rasterize a shape with quadratic beziers into a bitmap +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, // 1-channel bitmap to draw into + float flatness_in_pixels, // allowable error of curve in pixels + stbtt_vertex * vertices, // array of vertices defining shape + int num_verts, // number of vertices in above array + float scale_x, float scale_y, // scale applied to input vertices + float shift_x, float shift_y, // translation applied to input vertices + int x_off, int y_off, // another translation applied to input + int invert, // if non-zero, vertically flip shape + void * userdata); // context for to STBTT_MALLOC + +////////////////////////////////////////////////////////////////////////////// +// +// Signed Distance Function (or Field) rendering + +STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata); +// frees the SDF bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff); +// These functions compute a discretized SDF field for a single character, suitable for storing +// in a single-channel texture, sampling with bilinear filtering, and testing against +// larger than some threshold to produce scalable fonts. +// info -- the font +// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap +// glyph/codepoint -- the character to generate the SDF for +// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), +// which allows effects like bit outlines +// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) +// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) +// if positive, > onedge_value is inside; if negative, < onedge_value is inside +// width,height -- output height & width of the SDF bitmap (including padding) +// xoff,yoff -- output origin of the character +// return value -- a 2D array of bytes 0..255, width*height in size +// +// pixel_dist_scale & onedge_value are a scale & bias that allows you to make +// optimal use of the limited 0..255 for your application, trading off precision +// and special effects. SDF values outside the range 0..255 are clamped to 0..255. +// +// Example: +// scale = stbtt_ScaleForPixelHeight(22) +// padding = 5 +// onedge_value = 180 +// pixel_dist_scale = 180/5.0 = 36.0 +// +// This will create an SDF bitmap in which the character is about 22 pixels +// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled +// shape, sample the SDF at each pixel and fill the pixel if the SDF value +// is greater than or equal to 180/255. (You'll actually want to antialias, +// which is beyond the scope of this example.) Additionally, you can compute +// offset outlines (e.g. to stroke the character border inside & outside, +// or only outside). For example, to fill outside the character up to 3 SDF +// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above +// choice of variables maps a range from 5 pixels outside the shape to +// 2 pixels inside the shape to 0..255; this is intended primarily for apply +// outside effects only (the interior range is needed to allow proper +// antialiasing of the font at *smaller* sizes) +// +// The function computes the SDF analytically at each SDF pixel, not by e.g. +// building a higher-res bitmap and approximating it. In theory the quality +// should be as high as possible for an SDF of this size & representation, but +// unclear if this is true in practice (perhaps building a higher-res bitmap +// and computing from that can allow drop-out prevention). +// +// The algorithm has not been optimized at all, so expect it to be slow +// if computing lots of characters or very large sizes. + +////////////////////////////////////////////////////////////////////////////// +// +// Finding the right font... +// +// You should really just solve this offline, keep your own tables +// of what font is what, and don't try to get it out of the .ttf file. +// That's because getting it out of the .ttf file is really hard, because +// the names in the file can appear in many possible encodings, in many +// possible languages, and e.g. if you need a case-insensitive comparison, +// the details of that depend on the encoding & language in a complex way +// (actually underspecified in truetype, but also gigantic). +// +// But you can use the provided functions in two possible ways: +// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on +// unicode-encoded names to try to find the font you want; +// you can run this before calling stbtt_InitFont() +// +// stbtt_GetFontNameString() lets you get any of the various strings +// from the file yourself and do your own comparisons on them. +// You have to have called stbtt_InitFont() first. + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags); +#else +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags); +#endif +// returns the offset (not index) of the font that matches, or -1 if none +// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". +// if you use any other flag, use a font name like "Arial"; this checks +// the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2); +#else +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, + int len2); +#endif +// returns 1/0 whether the first string interpreted as utf8 is identical to +// the second string interpreted as big-endian utf16... useful for strings from next func + +STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, + int encodingID, int languageID, int nameID); + +// returns the string (which may be big-endian double byte, e.g. for unicode) +// and puts the length in bytes in *length. +// +// some of the values for the IDs are below; for more see the truetype spec: +// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html +// http://www.microsoft.com/typography/otspec/name.htm + +enum { // platformID + STBTT_PLATFORM_ID_UNICODE = 0, + STBTT_PLATFORM_ID_MAC = 1, + STBTT_PLATFORM_ID_ISO = 2, + STBTT_PLATFORM_ID_MICROSOFT = 3 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 = 0, + STBTT_UNICODE_EID_UNICODE_1_1 = 1, + STBTT_UNICODE_EID_ISO_10646 = 2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP = 3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL = 4 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL = 0, + STBTT_MS_EID_UNICODE_BMP = 1, + STBTT_MS_EID_SHIFTJIS = 2, + STBTT_MS_EID_UNICODE_FULL = 10 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN = 0, STBTT_MAC_EID_ARABIC = 4, + STBTT_MAC_EID_JAPANESE = 1, STBTT_MAC_EID_HEBREW = 5, + STBTT_MAC_EID_CHINESE_TRAD = 2, STBTT_MAC_EID_GREEK = 6, + STBTT_MAC_EID_KOREAN = 3, STBTT_MAC_EID_RUSSIAN = 7 +}; + +enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH = 0x0409, STBTT_MS_LANG_ITALIAN = 0x0410, + STBTT_MS_LANG_CHINESE = 0x0804, STBTT_MS_LANG_JAPANESE = 0x0411, + STBTT_MS_LANG_DUTCH = 0x0413, STBTT_MS_LANG_KOREAN = 0x0412, + STBTT_MS_LANG_FRENCH = 0x040c, STBTT_MS_LANG_RUSSIAN = 0x0419, + STBTT_MS_LANG_GERMAN = 0x0407, STBTT_MS_LANG_SPANISH = 0x0409, + STBTT_MS_LANG_HEBREW = 0x040d, STBTT_MS_LANG_SWEDISH = 0x041D +}; + +enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH = 0, STBTT_MAC_LANG_JAPANESE = 11, + STBTT_MAC_LANG_ARABIC = 12, STBTT_MAC_LANG_KOREAN = 23, + STBTT_MAC_LANG_DUTCH = 4, STBTT_MAC_LANG_RUSSIAN = 32, + STBTT_MAC_LANG_FRENCH = 1, STBTT_MAC_LANG_SPANISH = 6, + STBTT_MAC_LANG_GERMAN = 2, STBTT_MAC_LANG_SWEDISH = 5, + STBTT_MAC_LANG_HEBREW = 10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED = 33, + STBTT_MAC_LANG_ITALIAN = 3, STBTT_MAC_LANG_CHINESE_TRAD = 19 +}; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +#ifndef STBTT_MAX_OVERSAMPLE + #define STBTT_MAX_OVERSAMPLE 8 +#endif + +#if STBTT_MAX_OVERSAMPLE > 255 + #error "STBTT_MAX_OVERSAMPLE cannot be > 255" +#endif + +typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE - 1)) == 0 ? 1 : -1]; + +#ifndef STBTT_RASTERIZER_VERSION + #define STBTT_RASTERIZER_VERSION 2 +#endif + +#ifdef _MSC_VER + #define STBTT__NOTUSED(v) (void)(v) +#else + #define STBTT__NOTUSED(v) (void)sizeof(v) +#endif + +////////////////////////////////////////////////////////////////////////// +// +// stbtt__buf helpers to parse data from file +// + +static stbtt_uint8 stbtt__buf_get8(stbtt__buf * b) +{ + if(b->cursor >= b->size) + return 0; +#ifdef STBTT_STREAM_TYPE + long pos = (long)(b->cursor + b->offset); + STBTT_STREAM_SEEK(b->data, pos); + stbtt_uint8 result; + STBTT_STREAM_READ(b->data, &result, 1); + ++b->cursor; + return result; +#else + return b->data[b->cursor++]; +#endif + +} + +static stbtt_uint8 stbtt__buf_peek8(stbtt__buf * b) +{ + if(b->cursor >= b->size) + return 0; +#ifdef STBTT_STREAM_TYPE + long pos = (long)(b->cursor + b->offset); + STBTT_STREAM_SEEK(b->data, pos); + stbtt_uint8 result; + STBTT_STREAM_READ(b->data, &result, 1); + return result; +#else + return b->data[b->cursor]; +#endif + +} + +static void stbtt__buf_seek(stbtt__buf * b, int o) +{ + STBTT_assert(!(o > b->size || o < 0)); + b->cursor = (o > b->size || o < 0) ? b->size : o; +} + +static void stbtt__buf_skip(stbtt__buf * b, int o) +{ + stbtt__buf_seek(b, b->cursor + o); +} + +static stbtt_uint32 stbtt__buf_get(stbtt__buf * b, int n) +{ + stbtt_uint32 v = 0; + int i; + STBTT_assert(n >= 1 && n <= 4); + for(i = 0; i < n; i++) + v = (v << 8) | stbtt__buf_get8(b); + return v; +} +#ifdef STBTT_STREAM_TYPE + static stbtt__buf stbtt__new_buf(STBTT_STREAM_TYPE s, size_t size) +#else + static stbtt__buf stbtt__new_buf(const void * p, size_t size) +#endif +{ + stbtt__buf r; + STBTT_assert(size < 0x40000000); +#ifdef STBTT_STREAM_TYPE + r.data = s; + r.offset = 0; +#else + r.data = (stbtt_uint8 *)p; +#endif + r.size = (int)size; + r.cursor = 0; + return r; +} + +#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) +#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) + +static stbtt__buf stbtt__buf_range(const stbtt__buf * b, int o, int s) +{ + stbtt__buf r = stbtt__new_buf(NULL, 0); + if(o < 0 || s < 0 || o > b->size || s > b->size - o) return r; +#ifdef STBTT_STREAM_TYPE + r.data = b->data; + r.offset = b->offset + o; +#else + r.data = b->data + o; +#endif + r.size = s; + return r; +} + +static stbtt__buf stbtt__cff_get_index(stbtt__buf * b) +{ + int count, start, offsize; + start = b->cursor; + count = stbtt__buf_get16(b); + if(count) { + offsize = stbtt__buf_get8(b); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(b, offsize * count); + stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); + } + return stbtt__buf_range(b, start, b->cursor - start); +} + +static stbtt_uint32 stbtt__cff_int(stbtt__buf * b) +{ + int b0 = stbtt__buf_get8(b); + if(b0 >= 32 && b0 <= 246) return b0 - 139; + else if(b0 >= 247 && b0 <= 250) return (b0 - 247) * 256 + stbtt__buf_get8(b) + 108; + else if(b0 >= 251 && b0 <= 254) return -(b0 - 251) * 256 - stbtt__buf_get8(b) - 108; + else if(b0 == 28) return stbtt__buf_get16(b); + else if(b0 == 29) return stbtt__buf_get32(b); + STBTT_assert(0); + return 0; +} + +static void stbtt__cff_skip_operand(stbtt__buf * b) +{ + int v, b0 = stbtt__buf_peek8(b); + STBTT_assert(b0 >= 28); + if(b0 == 30) { + stbtt__buf_skip(b, 1); + while(b->cursor < b->size) { + v = stbtt__buf_get8(b); + if((v & 0xF) == 0xF || (v >> 4) == 0xF) + break; + } + } + else { + stbtt__cff_int(b); + } +} + +static stbtt__buf stbtt__dict_get(stbtt__buf * b, int key) +{ + stbtt__buf_seek(b, 0); + while(b->cursor < b->size) { + int start = b->cursor, end, op; + while(stbtt__buf_peek8(b) >= 28) + stbtt__cff_skip_operand(b); + end = b->cursor; + op = stbtt__buf_get8(b); + if(op == 12) op = stbtt__buf_get8(b) | 0x100; + if(op == key) return stbtt__buf_range(b, start, end - start); + } + return stbtt__buf_range(b, 0, 0); +} + +static void stbtt__dict_get_ints(stbtt__buf * b, int key, int outcount, stbtt_uint32 * out) +{ + int i; + stbtt__buf operands = stbtt__dict_get(b, key); + for(i = 0; i < outcount && operands.cursor < operands.size; i++) + out[i] = stbtt__cff_int(&operands); +} + +static int stbtt__cff_index_count(stbtt__buf * b) +{ + stbtt__buf_seek(b, 0); + return stbtt__buf_get16(b); +} + +static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) +{ + int count, offsize, start, end; + stbtt__buf_seek(&b, 0); + count = stbtt__buf_get16(&b); + offsize = stbtt__buf_get8(&b); + STBTT_assert(i >= 0 && i < count); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(&b, i * offsize); + start = stbtt__buf_get(&b, offsize); + end = stbtt__buf_get(&b, offsize); + return stbtt__buf_range(&b, 2 + (count + 1) * offsize + start, end - start); +} + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + +#ifdef STBTT_STREAM_TYPE +static stbtt_uint8 ttBYTE(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r; + STBTT_STREAM_READ(s, &r, 1); + return r; +} +#define ttCHAR(s, offset) ((stbtt_int8)ttBYTE(s,offset)) +static stbtt_uint16 ttUSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[2]; + STBTT_STREAM_READ(s, &r, 2); + return r[0] * 256 + r[1]; +} +static stbtt_int16 ttSHORT(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[2]; + STBTT_STREAM_READ(s, &r, 2); + return r[0] * 256 + r[1]; +} +static stbtt_uint32 ttULONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[4]; + STBTT_STREAM_READ(s, &r, 4); + return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; +} +static stbtt_int32 ttLONG(STBTT_STREAM_TYPE s, stbtt_uint32 offset) +{ + STBTT_STREAM_SEEK(s, offset); + stbtt_uint8 r[4]; + STBTT_STREAM_READ(s, &r, 4); + return (r[0] << 24) + (r[1] << 16) + (r[2] << 8) + r[3]; +} +#else +#define ttBYTE(p, offset) (* (stbtt_uint8 *) (p+offset)) +#define ttCHAR(p, offset) (* (stbtt_int8 *) (p+offset)) +static stbtt_uint16 ttUSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return p[offset + 0] * 256 + p[offset + 1]; +} +static stbtt_int16 ttSHORT(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return p[offset + 0] * 256 + p[offset + 1]; +} +static stbtt_uint32 ttULONG(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; +} +static stbtt_int32 ttLONG(const stbtt_uint8 * p, stbtt_uint32 offset) +{ + return (p[offset + 0] << 24) + (p[offset + 1] << 16) + (p[offset + 2] << 8) + p[offset + 3]; +} +#endif +#define ttFixed(p, offset) ttLONG(p, offset) + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) +#ifdef STBTT_STREAM_TYPE + static int stbtt__isfont(STBTT_STREAM_TYPE stream, stbtt_uint32 offs) +#else + static int stbtt__isfont(stbtt_uint8 * font, stbtt_uint32 offs) +#endif +{ +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 font[4]; + STBTT_STREAM_SEEK(stream, offs); + STBTT_STREAM_READ(stream, font, 4); +#else + font += offs; +#endif + // check the version number + if(stbtt_tag4(font, '1', 0, 0, 0)) return 1; // TrueType 1 + if(stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if(stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if(stbtt_tag4(font, 0, 1, 0, 0)) return 1; // OpenType 1.0 + if(stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts + return 0; +} + +// @OPTIMIZE: binary search +#ifdef STBTT_STREAM_TYPE + static stbtt_uint32 stbtt__find_table(STBTT_STREAM_TYPE data, stbtt_uint32 fontstart, const char * tag) +#else + static stbtt_uint32 stbtt__find_table(stbtt_uint8 * data, stbtt_uint32 fontstart, const char * tag) +#endif +{ + stbtt_int32 num_tables = ttUSHORT(data, fontstart + 4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for(i = 0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16 * i; +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(data, loc + 0); + STBTT_STREAM_READ(data, buf, 4); + if(stbtt_tag(buf, tag)) + return ttULONG(data, loc + 8); +#else + if(stbtt_tag(data + loc + 0, tag)) + return ttULONG(data, loc + 8); +#endif + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_GetFontOffsetForIndex_internal(STBTT_STREAM_TYPE font_collection, int index) +#else + static int stbtt_GetFontOffsetForIndex_internal(unsigned char * font_collection, int index) +#endif +{ + // if it's just a font, there's only one valid index + if(stbtt__isfont(font_collection, 0)) + return index == 0 ? 0 : -1; + + // check if it's a TTC +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(font_collection, 0); + STBTT_STREAM_READ(font_collection, buf, 4); + if(stbtt_tag(buf, "ttcf")) { +#else + if(stbtt_tag(font_collection, "ttcf")) { +#endif + // version 1? + if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection, 8); + if(index >= n) + return -1; + return ttULONG(font_collection, 12 + index * 4); + } + } + return -1; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_GetNumberOfFonts_internal(STBTT_STREAM_TYPE font_collection) +#else + static int stbtt_GetNumberOfFonts_internal(unsigned char * font_collection) +#endif +{ + // if it's just a font, there's only one valid font + if(stbtt__isfont(font_collection, 0)) + return 1; + + // check if it's a TTC +#ifdef STBTT_STREAM_TYPE + stbtt_uint8 buf[4]; + STBTT_STREAM_SEEK(font_collection, 0); + STBTT_STREAM_READ(font_collection, buf, 4); + if(stbtt_tag(buf, "ttcf")) { +#else + if(stbtt_tag(font_collection, "ttcf")) { +#endif + // version 1? + if(ttULONG(font_collection, 4) == 0x00010000 || ttULONG(font_collection, 4) == 0x00020000) { + return ttLONG(font_collection, 8); + } + } + return 0; +} + +static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) +{ + stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; + stbtt__buf pdict; + stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); + if(!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); + pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); + stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); + if(!subrsoff) return stbtt__new_buf(NULL, 0); + stbtt__buf_seek(&cff, private_loc[1] + subrsoff); + return stbtt__cff_get_index(&cff); +} + +// since most people won't use this, find this table the first time it's needed +static int stbtt__get_svg(stbtt_fontinfo * info) +{ + stbtt_uint32 t; + if(info->svg < 0) { + t = stbtt__find_table(info->data, info->fontstart, "SVG "); + if(t) { + stbtt_uint32 offset = ttULONG(info->data, t + 2); + info->svg = t + offset; + } + else { + info->svg = 0; + } + } + return info->svg; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_InitFont_internal(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int fontstart) +#else + static int stbtt_InitFont_internal(stbtt_fontinfo * info, unsigned char * data, int fontstart) +#endif +{ + stbtt_uint32 cmap, t; + stbtt_int32 i, numTables; + + info->data = data; + info->fontstart = fontstart; + info->cff = stbtt__new_buf(NULL, 0); + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required + + if(!cmap || !info->head || !info->hhea || !info->hmtx) + return 0; + if(info->glyf) { + // required for truetype + if(!info->loca) return 0; + } + else { + // initialization for CFF / Type2 fonts (OTF) + stbtt__buf b, topdict, topdictidx; + stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; + stbtt_uint32 cff; + + cff = stbtt__find_table(data, fontstart, "CFF "); + if(!cff) return 0; + + info->fontdicts = stbtt__new_buf(NULL, 0); + info->fdselect = stbtt__new_buf(NULL, 0); + + // @TODO this should use size from table (not 512MB) + +#ifdef STBTT_STREAM_TYPE + info->cff = stbtt__new_buf(info->data, 512 * 1024 * 1024); + info->cff.offset = cff; +#else + info->cff = stbtt__new_buf(info->data + cff, 512 * 1024 * 1024); +#endif + b = info->cff; + + // read the header + stbtt__buf_skip(&b, 2); + stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize + + // @TODO the name INDEX could list multiple fonts, + // but we just use the first one. + stbtt__cff_get_index(&b); // name INDEX + topdictidx = stbtt__cff_get_index(&b); + topdict = stbtt__cff_index_get(topdictidx, 0); + stbtt__cff_get_index(&b); // string INDEX + info->gsubrs = stbtt__cff_get_index(&b); + + stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); + stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); + stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); + stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); + info->subrs = stbtt__get_subrs(b, topdict); + + // we only support Type 2 charstrings + if(cstype != 2) return 0; + if(charstrings == 0) return 0; + + if(fdarrayoff) { + // looks like a CID font + if(!fdselectoff) return 0; + stbtt__buf_seek(&b, fdarrayoff); + info->fontdicts = stbtt__cff_get_index(&b); + info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size - fdselectoff); + } + + stbtt__buf_seek(&b, charstrings); + info->charstrings = stbtt__cff_get_index(&b); + } + + t = stbtt__find_table(data, fontstart, "maxp"); + if(t) + info->numGlyphs = ttUSHORT(data, t + 4); + else + info->numGlyphs = 0xffff; + + info->svg = -1; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data, cmap + 2); + info->index_map = 0; + for(i = 0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch(ttUSHORT(data, encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch(ttUSHORT(data, encoding_record + 2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data, encoding_record + 4); + break; + } + break; + case STBTT_PLATFORM_ID_UNICODE: + // Mac/iOS has these + // all the encodingIDs are unicode, so we don't bother to check it + info->index_map = cmap + ttULONG(data, encoding_record + 4); + break; + } + } + if(info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data, info->head + 50); + return 1; +} + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo * info, int unicode_codepoint) +{ +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + stbtt_uint8 * data = info->data; +#endif + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data, index_map + 0); + if(format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data, index_map + 2); + if(unicode_codepoint < bytes - 6) + return ttBYTE(data, index_map + 6 + unicode_codepoint); + return 0; + } + else if(format == 6) { + stbtt_uint32 first = ttUSHORT(data, index_map + 6); + stbtt_uint32 count = ttUSHORT(data, index_map + 8); + if((stbtt_uint32)unicode_codepoint >= first && (stbtt_uint32)unicode_codepoint < first + count) + return ttUSHORT(data, index_map + 10 + (unicode_codepoint - first) * 2); + return 0; + } + else if(format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } + else if(format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data, index_map + 6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data, index_map + 8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data, index_map + 10); + stbtt_uint16 rangeShift = ttUSHORT(data, index_map + 12) >> 1; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if(unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if(unicode_codepoint >= ttUSHORT(data, search + rangeShift * 2)) + search += rangeShift * 2; + + // now decrement to bias correctly to find smallest + search -= 2; + while(entrySelector) { + stbtt_uint16 end; + searchRange >>= 1; + end = ttUSHORT(data, search + searchRange * 2); + if(unicode_codepoint > end) + search += searchRange * 2; + --entrySelector; + } + search += 2; + + { + stbtt_uint16 offset, start, last; + stbtt_uint16 item = (stbtt_uint16)((search - endCount) >> 1); + + start = ttUSHORT(data, index_map + 14 + segcount * 2 + 2 + 2 * item); + last = ttUSHORT(data, endCount + 2 * item); + if(unicode_codepoint < start || unicode_codepoint > last) + return 0; + + offset = ttUSHORT(data, index_map + 14 + segcount * 6 + 2 + 2 * item); + if(offset == 0) + return (stbtt_uint16)(unicode_codepoint + ttSHORT(data, index_map + 14 + segcount * 4 + 2 + 2 * item)); + + return ttUSHORT(data, offset + (unicode_codepoint - start) * 2 + index_map + 14 + segcount * 6 + 2 + 2 * item); + } + } + else if(format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data, index_map + 12); + stbtt_int32 low, high; + low = 0; + high = (stbtt_int32)ngroups; + // Binary search the right group. + while(low < high) { + stbtt_int32 mid = low + ((high - low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data, index_map + 16 + mid * 12); + stbtt_uint32 end_char = ttULONG(data, index_map + 16 + mid * 12 + 4); + if((stbtt_uint32)unicode_codepoint < start_char) + high = mid; + else if((stbtt_uint32)unicode_codepoint > end_char) + low = mid + 1; + else { + stbtt_uint32 start_glyph = ttULONG(data, index_map + 16 + mid * 12 + 8); + if(format == 12) + return start_glyph + unicode_codepoint - start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_vertex * *vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex * v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, + stbtt_int32 cy) +{ + v->type = type; + v->x = (stbtt_int16)x; + v->y = (stbtt_int16)y; + v->cx = (stbtt_int16)cx; + v->cy = (stbtt_int16)cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo * info, int glyph_index) +{ + int g1, g2; + + STBTT_assert(!info->cff.size); + + if(glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if(info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if(info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data, info->loca + glyph_index * 2 + 2) * 2; + } + else { + g1 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG(info->data, info->loca + glyph_index * 4 + 4); + } + + return g1 == g2 ? -1 : g1; // if length is 0, return -1 +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1); + +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) +{ + if(info->cff.size) { + stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); + } + else { + int g = stbtt__GetGlyfOffset(info, glyph_index); + if(g < 0) return 0; + + if(x0) *x0 = ttSHORT(info->data, g + 2); + if(y0) *y0 = ttSHORT(info->data, g + 4); + if(x1) *x1 = ttSHORT(info->data, g + 6); + if(y1) *y1 = ttSHORT(info->data, g + 8); + } + return 1; +} + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo * info, int codepoint, int * x0, int * y0, int * x1, int * y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info, codepoint), x0, y0, x1, y1); +} + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo * info, int glyph_index) +{ + stbtt_int16 numberOfContours; + int g; + if(info->cff.size) + return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; + g = stbtt__GetGlyfOffset(info, glyph_index); + if(g < 0) return 1; + numberOfContours = ttSHORT(info->data, g); + return numberOfContours == 0; +} + +static int stbtt__close_shape(stbtt_vertex * vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if(start_off) { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + scx) >> 1, (cy + scy) >> 1, cx, cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, scx, scy); + } + else { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx, sy, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, sx, sy, 0, 0); + } + return num_vertices; +} + +static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint32 endPtsOfContours; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + stbtt_uint8 * data = info->data; +#endif + stbtt_vertex * vertices = 0; + int num_vertices = 0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if(g < 0) return 0; + + numberOfContours = ttSHORT(data, g); + + if(numberOfContours > 0) { + stbtt_uint8 flags = 0, flagcount; + stbtt_int32 ins, i, j = 0, m, n, next_move, was_off = 0, off, start_off = 0; + stbtt_int32 x, y, cx, cy, sx, sy, scx, scy; + stbtt_uint32 points; + endPtsOfContours = (g + 10); + ins = ttUSHORT(data, g + 10 + numberOfContours * 2); + points = g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1 + ttUSHORT(data, endPtsOfContours + numberOfContours * 2 - 2); + + m = n + 2 * numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex *)STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if(vertices == 0) + return 0; + + next_move = 0; + flagcount = 0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for(i = 0; i < n; ++i) { + if(flagcount == 0) { + flags = ttBYTE(data, points++); + if(flags & 8) + flagcount = ttBYTE(data, points++); + } + else + --flagcount; + vertices[off + i].type = flags; + } + + // now load x coordinates + x = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if(flags & 2) { + stbtt_int16 dx = ttBYTE(data, points++); + x += (flags & 16) ? dx : -dx; // ??? + } + else { + if(!(flags & 16)) { + x = x + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); + points += 2; + } + } + vertices[off + i].x = (stbtt_int16)x; + } + + // now load y coordinates + y = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + if(flags & 4) { + stbtt_int16 dy = ttBYTE(data, points++); + y += (flags & 32) ? dy : -dy; // ??? + } + else { + if(!(flags & 32)) { + y = y + (stbtt_int16)(ttBYTE(data, points) * 256 + ttBYTE(data, points + 1)); + points += 2; + } + } + vertices[off + i].y = (stbtt_int16)y; + } + + // now convert them to our format + num_vertices = 0; + sx = sy = cx = cy = scx = scy = 0; + for(i = 0; i < n; ++i) { + flags = vertices[off + i].type; + x = (stbtt_int16)vertices[off + i].x; + y = (stbtt_int16)vertices[off + i].y; + + if(next_move == i) { + if(i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + + // now start the new one + start_off = !(flags & 1); + if(start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if(!(vertices[off + i + 1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32)vertices[off + i + 1].x) >> 1; + sy = (y + (stbtt_int32)vertices[off + i + 1].y) >> 1; + } + else { + // otherwise just use the next point as our start point + sx = (stbtt_int32)vertices[off + i + 1].x; + sy = (stbtt_int32)vertices[off + i + 1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } + else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove, sx, sy, 0, 0); + was_off = 0; + next_move = 1 + ttUSHORT(data, endPtsOfContours + j * 2); + ++j; + } + else { + if(!(flags & 1)) { // if it's a curve + if(was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx + x) >> 1, (cy + y) >> 1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } + else { + if(was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x, y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x, y, 0, 0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx, sy, scx, scy, cx, cy); + } + else if(numberOfContours < 0) { + // Compound shapes. + int more = 1; + stbtt_uint32 comp = g + 10; + num_vertices = 0; + vertices = 0; + while(more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex * comp_verts = 0, * tmp = 0; + float mtx[6] = { 1, 0, 0, 1, 0, 0 }, m, n; + + flags = ttSHORT(data, comp); + comp += 2; + gidx = ttSHORT(data, comp); + comp += 2; + + if(flags & 2) { // XY values + if(flags & 1) { // shorts + mtx[4] = ttSHORT(data, comp); + comp += 2; + mtx[5] = ttSHORT(data, comp); + comp += 2; + } + else { + mtx[4] = ttCHAR(data, comp); + comp += 1; + mtx[5] = ttCHAR(data, comp); + comp += 1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if(flags & (1 << 3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = mtx[2] = 0; + } + else if(flags & (1 << 6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + } + else if(flags & (1 << 7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[1] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[2] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + mtx[3] = ttSHORT(data, comp) / 16384.0f; + comp += 2; + } + + // Find transformation scales. + m = (float)STBTT_sqrt(mtx[0] * mtx[0] + mtx[1] * mtx[1]); + n = (float)STBTT_sqrt(mtx[2] * mtx[2] + mtx[3] * mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if(comp_num_verts > 0) { + // Transform vertices. + for(i = 0; i < comp_num_verts; ++i) { + stbtt_vertex * v = &comp_verts[i]; + stbtt_vertex_type x, y; + x = v->x; + y = v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + x = v->cx; + y = v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0] * x + mtx[2] * y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1] * x + mtx[3] * y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex *)STBTT_malloc((num_vertices + comp_num_verts) * sizeof(stbtt_vertex), info->userdata); + if(!tmp) { + if(vertices) STBTT_free(vertices, info->userdata); + if(comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if(num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices * sizeof(stbtt_vertex)); + STBTT_memcpy(tmp + num_vertices, comp_verts, comp_num_verts * sizeof(stbtt_vertex)); + if(vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1 << 5); + } + } + else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +typedef struct { + int bounds; + int started; + float first_x, first_y; + float x, y; + stbtt_int32 min_x, max_x, min_y, max_y; + + stbtt_vertex * pvertices; + int num_vertices; +} stbtt__csctx; + +#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} + +static void stbtt__track_vertex(stbtt__csctx * c, stbtt_int32 x, stbtt_int32 y) +{ + if(x > c->max_x || !c->started) c->max_x = x; + if(y > c->max_y || !c->started) c->max_y = y; + if(x < c->min_x || !c->started) c->min_x = x; + if(y < c->min_y || !c->started) c->min_y = y; + c->started = 1; +} + +static void stbtt__csctx_v(stbtt__csctx * c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, + stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) +{ + if(c->bounds) { + stbtt__track_vertex(c, x, y); + if(type == STBTT_vcubic) { + stbtt__track_vertex(c, cx, cy); + stbtt__track_vertex(c, cx1, cy1); + } + } + else { + stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); + c->pvertices[c->num_vertices].cx1 = (stbtt_int16)cx1; + c->pvertices[c->num_vertices].cy1 = (stbtt_int16)cy1; + } + c->num_vertices++; +} + +static void stbtt__csctx_close_shape(stbtt__csctx * ctx) +{ + if(ctx->first_x != ctx->x || ctx->first_y != ctx->y) + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rmove_to(stbtt__csctx * ctx, float dx, float dy) +{ + stbtt__csctx_close_shape(ctx); + ctx->first_x = ctx->x = ctx->x + dx; + ctx->first_y = ctx->y = ctx->y + dy; + stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rline_to(stbtt__csctx * ctx, float dx, float dy) +{ + ctx->x += dx; + ctx->y += dy; + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rccurve_to(stbtt__csctx * ctx, float dx1, float dy1, float dx2, float dy2, float dx3, + float dy3) +{ + float cx1 = ctx->x + dx1; + float cy1 = ctx->y + dy1; + float cx2 = cx1 + dx2; + float cy2 = cy1 + dy2; + ctx->x = cx2 + dx3; + ctx->y = cy2 + dy3; + stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); +} + +static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) +{ + int count = stbtt__cff_index_count(&idx); + int bias = 107; + if(count >= 33900) + bias = 32768; + else if(count >= 1240) + bias = 1131; + n += bias; + if(n < 0 || n >= count) + return stbtt__new_buf(NULL, 0); + return stbtt__cff_index_get(idx, n); +} + +static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo * info, int glyph_index) +{ + stbtt__buf fdselect = info->fdselect; + int nranges, start, end, v, fmt, fdselector = -1, i; + + stbtt__buf_seek(&fdselect, 0); + fmt = stbtt__buf_get8(&fdselect); + if(fmt == 0) { + // untested + stbtt__buf_skip(&fdselect, glyph_index); + fdselector = stbtt__buf_get8(&fdselect); + } + else if(fmt == 3) { + nranges = stbtt__buf_get16(&fdselect); + start = stbtt__buf_get16(&fdselect); + for(i = 0; i < nranges; i++) { + v = stbtt__buf_get8(&fdselect); + end = stbtt__buf_get16(&fdselect); + if(glyph_index >= start && glyph_index < end) { + fdselector = v; + break; + } + start = end; + } + } + if(fdselector == -1) stbtt__new_buf(NULL, 0); + return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); +} + +static int stbtt__run_charstring(const stbtt_fontinfo * info, int glyph_index, stbtt__csctx * c) +{ + int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; + int has_subrs = 0, clear_stack; + float s[48]; + stbtt__buf subr_stack[10], subrs = info->subrs, b; + float f; + +#define STBTT__CSERR(s) (0) + + // this currently ignores the initial width value, which isn't needed if we have hmtx + b = stbtt__cff_index_get(info->charstrings, glyph_index); + while(b.cursor < b.size) { + i = 0; + clear_stack = 1; + b0 = stbtt__buf_get8(&b); + switch(b0) { + // @TODO implement hinting + case 0x13: // hintmask + case 0x14: // cntrmask + if(in_header) + maskbits += (sp / 2); // implicit "vstem" + in_header = 0; + stbtt__buf_skip(&b, (maskbits + 7) / 8); + break; + + case 0x01: // hstem + case 0x03: // vstem + case 0x12: // hstemhm + case 0x17: // vstemhm + maskbits += (sp / 2); + break; + + case 0x15: // rmoveto + in_header = 0; + if(sp < 2) return STBTT__CSERR("rmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 2], s[sp - 1]); + break; + case 0x04: // vmoveto + in_header = 0; + if(sp < 1) return STBTT__CSERR("vmoveto stack"); + stbtt__csctx_rmove_to(c, 0, s[sp - 1]); + break; + case 0x16: // hmoveto + in_header = 0; + if(sp < 1) return STBTT__CSERR("hmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp - 1], 0); + break; + + case 0x05: // rlineto + if(sp < 2) return STBTT__CSERR("rlineto stack"); + for(; i + 1 < sp; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical + // starting from a different place. + + case 0x07: // vlineto + if(sp < 1) return STBTT__CSERR("vlineto stack"); + goto vlineto; + case 0x06: // hlineto + if(sp < 1) return STBTT__CSERR("hlineto stack"); + for(;;) { + if(i >= sp) break; + stbtt__csctx_rline_to(c, s[i], 0); + i++; +vlineto: + if(i >= sp) break; + stbtt__csctx_rline_to(c, 0, s[i]); + i++; + } + break; + + case 0x1F: // hvcurveto + if(sp < 4) return STBTT__CSERR("hvcurveto stack"); + goto hvcurveto; + case 0x1E: // vhcurveto + if(sp < 4) return STBTT__CSERR("vhcurveto stack"); + for(;;) { + if(i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, 0, s[i], s[i + 1], s[i + 2], s[i + 3], (sp - i == 5) ? s[i + 4] : 0.0f); + i += 4; +hvcurveto: + if(i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, s[i], 0, s[i + 1], s[i + 2], (sp - i == 5) ? s[i + 4] : 0.0f, s[i + 3]); + i += 4; + } + break; + + case 0x08: // rrcurveto + if(sp < 6) return STBTT__CSERR("rcurveline stack"); + for(; i + 5 < sp; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x18: // rcurveline + if(sp < 8) return STBTT__CSERR("rcurveline stack"); + for(; i + 5 < sp - 2; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + if(i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + break; + + case 0x19: // rlinecurve + if(sp < 8) return STBTT__CSERR("rlinecurve stack"); + for(; i + 1 < sp - 6; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i + 1]); + if(i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); + stbtt__csctx_rccurve_to(c, s[i], s[i + 1], s[i + 2], s[i + 3], s[i + 4], s[i + 5]); + break; + + case 0x1A: // vvcurveto + case 0x1B: // hhcurveto + if(sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); + f = 0.0; + if(sp & 1) { + f = s[i]; + i++; + } + for(; i + 3 < sp; i += 4) { + if(b0 == 0x1B) + stbtt__csctx_rccurve_to(c, s[i], f, s[i + 1], s[i + 2], s[i + 3], 0.0); + else + stbtt__csctx_rccurve_to(c, f, s[i], s[i + 1], s[i + 2], 0.0, s[i + 3]); + f = 0.0; + } + break; + + case 0x0A: // callsubr + if(!has_subrs) { + if(info->fdselect.size) + subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); + has_subrs = 1; + } + // FALLTHROUGH + case 0x1D: // callgsubr + if(sp < 1) return STBTT__CSERR("call(g|)subr stack"); + v = (int)s[--sp]; + if(subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); + subr_stack[subr_stack_height++] = b; + b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); + if(b.size == 0) return STBTT__CSERR("subr not found"); + b.cursor = 0; + clear_stack = 0; + break; + + case 0x0B: // return + if(subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); + b = subr_stack[--subr_stack_height]; + clear_stack = 0; + break; + + case 0x0E: // endchar + stbtt__csctx_close_shape(c); + return 1; + + case 0x0C: { // two-byte escape + float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; + float dx, dy; + int b1 = stbtt__buf_get8(&b); + switch(b1) { + // @TODO These "flex" implementations ignore the flex-depth and resolution, + // and always draw beziers. + case 0x22: // hflex + if(sp < 7) return STBTT__CSERR("hflex stack"); + dx1 = s[0]; + dx2 = s[1]; + dy2 = s[2]; + dx3 = s[3]; + dx4 = s[4]; + dx5 = s[5]; + dx6 = s[6]; + stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); + break; + + case 0x23: // flex + if(sp < 13) return STBTT__CSERR("flex stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = s[10]; + dy6 = s[11]; + //fd is s[12] + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + case 0x24: // hflex1 + if(sp < 9) return STBTT__CSERR("hflex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dx4 = s[5]; + dx5 = s[6]; + dy5 = s[7]; + dx6 = s[8]; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1 + dy2 + dy5)); + break; + + case 0x25: // flex1 + if(sp < 11) return STBTT__CSERR("flex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = dy6 = s[10]; + dx = dx1 + dx2 + dx3 + dx4 + dx5; + dy = dy1 + dy2 + dy3 + dy4 + dy5; + if(STBTT_fabs(dx) > STBTT_fabs(dy)) + dy6 = -dy; + else + dx6 = -dx; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + default: + return STBTT__CSERR("unimplemented"); + } + } + break; + + default: + if(b0 != 255 && b0 != 28 && b0 < 32) + return STBTT__CSERR("reserved operator"); + + // push immediate + if(b0 == 255) { + f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; + } + else { + stbtt__buf_skip(&b, -1); + f = (float)(stbtt_int16)stbtt__cff_int(&b); + } + if(sp >= 48) return STBTT__CSERR("push stack overflow"); + s[sp++] = f; + clear_stack = 0; + break; + } + if(clear_stack) sp = 0; + } + return STBTT__CSERR("no endchar"); + +#undef STBTT__CSERR +} + +static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + // runs the charstring twice, once to count and once to output (to avoid realloc) + stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); + stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); + if(stbtt__run_charstring(info, glyph_index, &count_ctx)) { + *pvertices = (stbtt_vertex *)STBTT_malloc(count_ctx.num_vertices * sizeof(stbtt_vertex), info->userdata); + output_ctx.pvertices = *pvertices; + if(stbtt__run_charstring(info, glyph_index, &output_ctx)) { + STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); + return output_ctx.num_vertices; + } + } + *pvertices = NULL; + return 0; +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo * info, int glyph_index, int * x0, int * y0, int * x1, int * y1) +{ + stbtt__csctx c = STBTT__CSCTX_INIT(1); + int r = stbtt__run_charstring(info, glyph_index, &c); + if(x0) *x0 = r ? c.min_x : 0; + if(y0) *y0 = r ? c.min_y : 0; + if(x1) *x1 = r ? c.max_x : 0; + if(y1) *y1 = r ? c.max_y : 0; + return r ? c.num_vertices : 0; +} + +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo * info, int glyph_index, stbtt_vertex * *pvertices) +{ + if(!info->cff.size) + return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); + else + return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); +} + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo * info, int glyph_index, int * advanceWidth, + int * leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data, info->hhea + 34); + if(glyph_index < numOfLongHorMetrics) { + if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * glyph_index); + if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, info->hmtx + 4 * glyph_index + 2); + } + else { + if(advanceWidth) *advanceWidth = ttSHORT(info->data, info->hmtx + 4 * (numOfLongHorMetrics - 1)); + if(leftSideBearing) *leftSideBearing = ttSHORT(info->data, + info->hmtx + 4 * numOfLongHorMetrics + 2 * (glyph_index - numOfLongHorMetrics)); + } +} + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo * info) +{ + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format + return 0; + + return ttUSHORT(info->data, 10 + info->kern); +} + +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo * info, stbtt_kerningentry * table, int table_length) +{ + int k, length; + + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, 2 + info->kern) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, 8 + info->kern) != 1) // horizontal flag must be set in format + return 0; + + length = ttUSHORT(info->data, 10 + info->kern); + if(table_length < length) + length = table_length; + + for(k = 0; k < length; k++) { + table[k].glyph1 = ttUSHORT(info->data, 18 + (k * 6) + info->kern); + table[k].glyph2 = ttUSHORT(info->data, 20 + (k * 6) + info->kern); + table[k].advance = ttSHORT(info->data, 22 + (k * 6) + info->kern); + } + + return length; +} + +static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) +{ + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if(!info->kern) + return 0; + if(ttUSHORT(info->data, info->kern + 2) < 1) // number of tables, need at least 1 + return 0; + if(ttUSHORT(info->data, info->kern + 8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(info->data, info->kern + 10) - 1; + needle = glyph1 << 16 | glyph2; + while(l <= r) { + m = (l + r) >> 1; + straw = ttULONG(info->data, info->kern + 18 + (m * 6)); // note: unaligned read + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else + return ttSHORT(info->data, info->kern + 22 + (m * 6)); + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static stbtt_int32 stbtt__GetCoverageIndex(STBTT_STREAM_TYPE data, stbtt_uint32 coverageTable, int glyph) +#else + static stbtt_int32 stbtt__GetCoverageIndex(const stbtt_uint8 * data, stbtt_uint32 coverageTable, int glyph) +#endif +{ + stbtt_uint16 coverageFormat = ttUSHORT(data, coverageTable); + switch(coverageFormat) { + case 1: { + stbtt_uint16 glyphCount = ttUSHORT(data, coverageTable + 2); + + // Binary search. + stbtt_int32 l = 0, r = glyphCount - 1, m; + int straw, needle = glyph; + while(l <= r) { + stbtt_uint32 glyphArray = coverageTable + 4; + stbtt_uint16 glyphID; + m = (l + r) >> 1; + glyphID = ttUSHORT(data, glyphArray + 2 * m); + straw = glyphID; + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else { + return m; + } + } + break; + } + + case 2: { + stbtt_uint16 rangeCount = ttUSHORT(data, coverageTable + 2); + stbtt_uint32 rangeArray = coverageTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = rangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while(l <= r) { + stbtt_uint32 rangeRecord; + m = (l + r) >> 1; + rangeRecord = rangeArray + 6 * m; + strawStart = ttUSHORT(data, rangeRecord); + strawEnd = ttUSHORT(data, rangeRecord + 2); + if(needle < strawStart) + r = m - 1; + else if(needle > strawEnd) + l = m + 1; + else { + stbtt_uint16 startCoverageIndex = ttUSHORT(data, rangeRecord + 4); + return startCoverageIndex + glyph - strawStart; + } + } + break; + } + + default: + return -1; // unsupported + } + + return -1; +} +#ifdef STBTT_STREAM_TYPE + static stbtt_int32 stbtt__GetGlyphClass(STBTT_STREAM_TYPE data, stbtt_uint32 classDefTable, int glyph) +#else + static stbtt_int32 stbtt__GetGlyphClass(const stbtt_uint8 * data, stbtt_uint32 classDefTable, int glyph) +#endif +{ + stbtt_uint16 classDefFormat = ttUSHORT(data, classDefTable); + switch(classDefFormat) { + case 1: { + stbtt_uint16 startGlyphID = ttUSHORT(data, classDefTable + 2); + stbtt_uint16 glyphCount = ttUSHORT(data, classDefTable + 4); + stbtt_uint32 classDef1ValueArray = classDefTable + 6; + + if(glyph >= startGlyphID && glyph < startGlyphID + glyphCount) + return (stbtt_int32)ttUSHORT(data, classDef1ValueArray + 2 * (glyph - startGlyphID)); + break; + } + + case 2: { + stbtt_uint16 classRangeCount = ttUSHORT(data, classDefTable + 2); + stbtt_uint32 classRangeRecords = classDefTable + 4; + + // Binary search. + stbtt_int32 l = 0, r = classRangeCount - 1, m; + int strawStart, strawEnd, needle = glyph; + while(l <= r) { + stbtt_uint32 classRangeRecord; + m = (l + r) >> 1; + classRangeRecord = classRangeRecords + 6 * m; + strawStart = ttUSHORT(data, classRangeRecord); + strawEnd = ttUSHORT(data, classRangeRecord + 2); + if(needle < strawStart) + r = m - 1; + else if(needle > strawEnd) + l = m + 1; + else + return (stbtt_int32)ttUSHORT(data, classRangeRecord + 4); + } + break; + } + + default: + return -1; // Unsupported definition type, return an error. + } + + // "All glyphs not assigned to a class fall into class 0". (OpenType spec) + return 0; +} + +// Define to STBTT_assert(x) if you want to break on unimplemented formats. +#define STBTT_GPOS_TODO_assert(x) + +static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo * info, int glyph1, int glyph2) +{ + stbtt_uint16 lookupListOffset; + stbtt_uint32 lookupList; + stbtt_uint16 lookupCount; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + const stbtt_uint8 * data = info->data; +#endif + stbtt_int32 i, sti; + + if(!info->gpos) return 0; + + if(ttUSHORT(data, 0 + info->gpos) != 1) return 0; // Major version 1 + if(ttUSHORT(data, 2 + info->gpos) != 0) return 0; // Minor version 0 + + lookupListOffset = ttUSHORT(data, 8 + info->gpos); + lookupList = info->gpos + lookupListOffset; + lookupCount = ttUSHORT(data, lookupList); + + for(i = 0; i < lookupCount; ++i) { + stbtt_uint16 lookupOffset = ttUSHORT(data, lookupList + 2 + 2 * i); + stbtt_uint32 lookupTable = lookupList + lookupOffset; + + stbtt_uint16 lookupType = ttUSHORT(data, lookupTable); + stbtt_uint16 subTableCount = ttUSHORT(data, lookupTable + 4); + stbtt_uint32 subTableOffsets = lookupTable + 6; + if(lookupType != 2) // Pair Adjustment Positioning Subtable + continue; + + for(sti = 0; sti < subTableCount; sti++) { + stbtt_uint16 subtableOffset = ttUSHORT(data, subTableOffsets + 2 * sti); + stbtt_uint32 table = lookupTable + subtableOffset; + stbtt_uint16 posFormat = ttUSHORT(data, table); + stbtt_uint16 coverageOffset = ttUSHORT(data, table + 2); + stbtt_int32 coverageIndex = stbtt__GetCoverageIndex(data, table + coverageOffset, glyph1); + if(coverageIndex == -1) continue; + + switch(posFormat) { + case 1: { + stbtt_int32 l, r, m; + int straw, needle; + stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); + if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_int32 valueRecordPairSizeInBytes = 2; + stbtt_uint16 pairSetCount = ttUSHORT(data, table + 8); + stbtt_uint16 pairPosOffset = ttUSHORT(data, table + 10 + 2 * coverageIndex); + stbtt_uint32 pairValueTable = table + pairPosOffset; + stbtt_uint16 pairValueCount = ttUSHORT(data, pairValueTable); + stbtt_uint32 pairValueArray = pairValueTable + 2; + + if(coverageIndex >= pairSetCount) return 0; + + needle = glyph2; + r = pairValueCount - 1; + l = 0; + + // Binary search. + while(l <= r) { + stbtt_uint16 secondGlyph; + stbtt_uint32 pairValue; + m = (l + r) >> 1; + pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; + secondGlyph = ttUSHORT(data, pairValue); + straw = secondGlyph; + if(needle < straw) + r = m - 1; + else if(needle > straw) + l = m + 1; + else { + stbtt_int16 xAdvance = ttSHORT(data, pairValue + 2); + return xAdvance; + } + } + } + else + return 0; + break; + } + + case 2: { + stbtt_uint16 valueFormat1 = ttUSHORT(data, table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(data, table + 6); + if(valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_uint16 classDef1Offset = ttUSHORT(data, table + 8); + stbtt_uint16 classDef2Offset = ttUSHORT(data, table + 10); + int glyph1class = stbtt__GetGlyphClass(data, table + classDef1Offset, glyph1); + int glyph2class = stbtt__GetGlyphClass(data, table + classDef2Offset, glyph2); + + stbtt_uint16 class1Count = ttUSHORT(data, table + 12); + stbtt_uint16 class2Count = ttUSHORT(data, table + 14); + stbtt_uint32 class1Records, class2Records; + stbtt_int16 xAdvance; + + if(glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed + if(glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed + + class1Records = table + 16; + class2Records = class1Records + 2 * (glyph1class * class2Count); + xAdvance = ttSHORT(data, class2Records + 2 * glyph2class); + return xAdvance; + } + else + return 0; + break; + } + + default: + return 0; // Unsupported position format + } + } + } + return 0; +} + +STBTT_DEF int stbtt_KernTableCheck(const stbtt_fontinfo * info) +{ + if(info->gpos) { + stbtt_uint16 lookupListOffset; + stbtt_uint32 lookupList; + stbtt_uint16 lookupCount; +#ifdef STBTT_STREAM_TYPE + STBTT_STREAM_TYPE data = info->data; +#else + const stbtt_uint8 * data = info->data; +#endif + stbtt_int32 i; + + if(!info->gpos) return 0; + + if(ttUSHORT(data, 0 + info->gpos) != 1) return 0; // Major version 1 + if(ttUSHORT(data, 2 + info->gpos) != 0) return 0; // Minor version 0 + + lookupListOffset = ttUSHORT(data, 8 + info->gpos); + lookupList = info->gpos + lookupListOffset; + lookupCount = ttUSHORT(data, lookupList); + + for(i = 0; i < lookupCount; ++i) { + stbtt_uint16 lookupOffset = ttUSHORT(data, lookupList + 2 + 2 * i); + stbtt_uint32 lookupTable = lookupList + lookupOffset; + + stbtt_uint16 lookupType = ttUSHORT(data, lookupTable); + + if(lookupType != 2) // Pair Adjustment Positioning Subtable + continue; + + return 1; // we have a usable lookup table. + } + return 0; + } + else if(info->kern) { + return 1; + } + return 0; +} + +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo * info, int g1, int g2) +{ + int xAdvance = 0; + + if(info->gpos) + xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); + else if(info->kern) + xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); + + return xAdvance; +} + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo * info, int ch1, int ch2) +{ + if(!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info, ch1), stbtt_FindGlyphIndex(info, ch2)); +} + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo * info, int codepoint, int * advanceWidth, + int * leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info, codepoint), advanceWidth, leftSideBearing); +} + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo * info, int * ascent, int * descent, int * lineGap) +{ + if(ascent) *ascent = ttSHORT(info->data, info->hhea + 4); + if(descent) *descent = ttSHORT(info->data, info->hhea + 6); + if(lineGap) *lineGap = ttSHORT(info->data, info->hhea + 8); +} + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo * info, int * typoAscent, int * typoDescent, + int * typoLineGap) +{ + int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); + if(!tab) + return 0; + if(typoAscent) *typoAscent = ttSHORT(info->data, tab + 68); + if(typoDescent) *typoDescent = ttSHORT(info->data, tab + 70); + if(typoLineGap) *typoLineGap = ttSHORT(info->data, tab + 72); + return 1; +} + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo * info, int * x0, int * y0, int * x1, int * y1) +{ + *x0 = ttSHORT(info->data, info->head + 36); + *y0 = ttSHORT(info->data, info->head + 38); + *x1 = ttSHORT(info->data, info->head + 40); + *y1 = ttSHORT(info->data, info->head + 42); +} + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo * info, float height) +{ + int fheight = ttSHORT(info->data, info->hhea + 4) - ttSHORT(info->data, info->hhea + 6); + return (float)height / fheight; +} + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo * info, float pixels) +{ + int unitsPerEm = ttUSHORT(info->data, info->head + 18); + return pixels / unitsPerEm; +} + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo * info, stbtt_vertex * v) +{ + STBTT_free(v, info->userdata); +} + +STBTT_DEF stbtt_uint32 stbtt_FindSVGDoc(const stbtt_fontinfo * info, int gl) +{ + int i; + stbtt_uint32 svg_doc_list = stbtt__get_svg((stbtt_fontinfo *)info); + + int numEntries = ttUSHORT(info->data, svg_doc_list); + stbtt_uint32 svg_docs = svg_doc_list + 2; + + for(i = 0; i < numEntries; i++) { + stbtt_uint32 svg_doc = svg_docs + (12 * i); + if((gl >= ttUSHORT(info->data, svg_doc)) && (gl <= ttUSHORT(info->data, svg_doc + 2))) + return svg_doc; + } + return 0; +} + +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo * info, int gl, stbtt_uint32 * svgOfs) +{ + stbtt_uint32 svg_doc; + + if(info->svg == 0) + return 0; + + svg_doc = stbtt_FindSVGDoc(info, gl); + if(svg_doc != 0) { + *svgOfs = info->svg + ttULONG(info->data, svg_doc + 4); + return ttULONG(info->data, svg_doc + 8); + } + else { + return 0; + } +} + +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo * info, int unicode_codepoint, stbtt_uint32 * svgOfs) +{ + return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svgOfs); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, + float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) +{ + int x0 = 0, y0 = 0, x1, y1; // =0 suppresses compiler warning + if(!stbtt_GetGlyphBox(font, glyph, &x0, &y0, &x1, &y1)) { + // e.g. space character + if(ix0) *ix0 = 0; + if(iy0) *iy0 = 0; + if(ix1) *ix1 = 0; + if(iy1) *iy1 = 0; + } + else { + // move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if(ix0) *ix0 = STBTT_ifloor(x0 * scale_x + shift_x); + if(iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); + if(ix1) *ix1 = STBTT_iceil(x1 * scale_x + shift_x); + if(iy1) *iy1 = STBTT_iceil(-y0 * scale_y + shift_y); + } +} + +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo * font, int glyph, float scale_x, float scale_y, int * ix0, + int * iy0, int * ix1, int * iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo * font, int codepoint, float scale_x, + float scale_y, float shift_x, float shift_y, int * ix0, int * iy0, int * ix1, int * iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font, codepoint), scale_x, scale_y, shift_x, shift_y, ix0, + iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo * font, int codepoint, float scale_x, float scale_y, + int * ix0, int * iy0, int * ix1, int * iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y, 0.0f, 0.0f, ix0, iy0, ix1, iy1); +} + +////////////////////////////////////////////////////////////////////////////// +// +// Rasterizer + +typedef struct stbtt__hheap_chunk { + struct stbtt__hheap_chunk * next; +} stbtt__hheap_chunk; + +typedef struct stbtt__hheap { + struct stbtt__hheap_chunk * head; + void * first_free; + int num_remaining_in_head_chunk; +} stbtt__hheap; + +static void * stbtt__hheap_alloc(stbtt__hheap * hh, size_t size, void * userdata) +{ + if(hh->first_free) { + void * p = hh->first_free; + hh->first_free = *(void **)p; + return p; + } + else { + if(hh->num_remaining_in_head_chunk == 0) { + int count = (size < 32 ? STBTT_HEAP_FACTOR_SIZE_32 : size < 128 ? STBTT_HEAP_FACTOR_SIZE_128 : + STBTT_HEAP_FACTOR_SIZE_DEFAULT); + stbtt__hheap_chunk * c = (stbtt__hheap_chunk *)STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); + if(c == NULL) + return NULL; + c->next = hh->head; + hh->head = c; + hh->num_remaining_in_head_chunk = count; + } + --hh->num_remaining_in_head_chunk; + return (char *)(hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; + } +} + +static void stbtt__hheap_free(stbtt__hheap * hh, void * p) +{ + *(void **)p = hh->first_free; + hh->first_free = p; +} + +static void stbtt__hheap_cleanup(stbtt__hheap * hh, void * userdata) +{ + stbtt__hheap_chunk * c = hh->head; + while(c) { + stbtt__hheap_chunk * n = c->next; + STBTT_free(c, userdata); + c = n; + } +} + +typedef struct stbtt__edge { + float x0, y0, x1, y1; + int invert; +} stbtt__edge; + +typedef struct stbtt__active_edge { + struct stbtt__active_edge * next; +#if STBTT_RASTERIZER_VERSION==1 + int x, dx; + float ey; + int direction; +#elif STBTT_RASTERIZER_VERSION==2 + float fx, fdx, fdy; + float direction; + float sy; + float ey; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif +} stbtt__active_edge; + +#if STBTT_RASTERIZER_VERSION == 1 +#define STBTT_FIXSHIFT 10 +#define STBTT_FIX (1 << STBTT_FIXSHIFT) +#define STBTT_FIXMASK (STBTT_FIX-1) + +static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, + void * userdata) +{ + stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + if(!z) return z; + + // round dx down to avoid overshooting + if(dxdy < 0) + z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); + else + z->dx = STBTT_ifloor(STBTT_FIX * dxdy); + + z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - + e->y0)); // use z->dx so when we offset later it's by the same amount + z->x -= off_x * STBTT_FIX; + + z->ey = e->y1; + z->next = 0; + z->direction = e->invert ? 1 : -1; + return z; +} +#elif STBTT_RASTERIZER_VERSION == 2 +static stbtt__active_edge * stbtt__new_active(stbtt__hheap * hh, stbtt__edge * e, int off_x, float start_point, + void * userdata) +{ + stbtt__active_edge * z = (stbtt__active_edge *)stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + //STBTT_assert(e->y0 <= start_point); + if(!z) return z; + z->fdx = dxdy; + z->fdy = dxdy != 0.0f ? (1.0f / dxdy) : 0.0f; + z->fx = e->x0 + dxdy * (start_point - e->y0); + z->fx -= off_x; + z->direction = e->invert ? 1.0f : -1.0f; + z->sy = e->y0; + z->ey = e->y1; + z->next = 0; + return z; +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#if STBTT_RASTERIZER_VERSION == 1 +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char * scanline, int len, stbtt__active_edge * e, int max_weight) +{ + // non-zero winding fill + int x0 = 0, w = 0; + + while(e) { + if(w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; + w += e->direction; + } + else { + int x1 = e->x; + w += e->direction; + // if we went to zero, we need to draw + if(w == 0) { + int i = x0 >> STBTT_FIXSHIFT; + int j = x1 >> STBTT_FIXSHIFT; + + if(i < len && j >= 0) { + if(i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8)((x1 - x0) * max_weight >> STBTT_FIXSHIFT); + } + else { + if(i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8)(((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); + else + i = -1; // clip + + if(j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8)(((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); + else + j = len; // clip + + for(++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8)max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, + int off_y, void * userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge * active = NULL; + int y, j = 0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], * scanline; + + if(result->w > 512) + scanline = (unsigned char *)STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float)vsubsample + 1; + + while(j < result->h) { + STBTT_memset(scanline, 0, result->w); + for(s = 0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge ** step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while(*step) { + stbtt__active_edge * z = *step; + if(z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for(;;) { + int changed = 0; + step = &active; + while(*step && (*step)->next) { + if((*step)->x > (*step)->next->x) { + stbtt__active_edge * t = *step; + stbtt__active_edge * q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if(!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while(e->y0 <= scan_y) { + if(e->y1 > scan_y) { + stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); + if(z != NULL) { + // find insertion point + if(active == NULL) + active = z; + else if(z->x < active->x) { + // insert at front + z->next = active; + active = z; + } + else { + // find thing to insert AFTER + stbtt__active_edge * p = active; + while(p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + } + ++e; + } + + // now process all active edges in XOR fashion + if(active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if(scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +#elif STBTT_RASTERIZER_VERSION == 2 + +// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 +// (i.e. it has already been clipped to those) +static void stbtt__handle_clipped_edge(float * scanline, int x, stbtt__active_edge * e, float x0, float y0, float x1, + float y1) +{ + if(y0 == y1) return; + STBTT_assert(y0 < y1); + STBTT_assert(e->sy <= e->ey); + if(y0 > e->ey) return; + if(y1 < e->sy) return; + if(y0 < e->sy) { + x0 += (x1 - x0) * (e->sy - y0) / (y1 - y0); + y0 = e->sy; + } + if(y1 > e->ey) { + x1 += (x1 - x0) * (e->ey - y1) / (y1 - y0); + y1 = e->ey; + } + + if(x0 == x) + STBTT_assert(x1 <= x + 1); + else if(x0 == x + 1) + STBTT_assert(x1 >= x); + else if(x0 <= x) + STBTT_assert(x1 <= x); + else if(x0 >= x + 1) + STBTT_assert(x1 >= x + 1); + else + STBTT_assert(x1 >= x && x1 <= x + 1); + + if(x0 <= x && x1 <= x) + scanline[x] += e->direction * (y1 - y0); + else if(x0 >= x + 1 && x1 >= x + 1) { + /*Nothing to do*/; + } + else { + STBTT_assert(x0 >= x && x0 <= x + 1 && x1 >= x && x1 <= x + 1); + scanline[x] += e->direction * (y1 - y0) * (1 - ((x0 - x) + (x1 - x)) / 2); // coverage = 1 - average x position + } +} + +static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) +{ + STBTT_assert(top_width >= 0); + STBTT_assert(bottom_width >= 0); + return (top_width + bottom_width) / 2.0f * height; +} + +static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) +{ + return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); +} + +static float stbtt__sized_triangle_area(float height, float width) +{ + return height * width / 2; +} + +static void stbtt__fill_active_edges_new(float * scanline, float * scanline_fill, int len, stbtt__active_edge * e, + float y_top) +{ + float y_bottom = y_top + 1; + + while(e) { + // brute force every pixel + + // compute intersection points with top & bottom + STBTT_assert(e->ey >= y_top); + + if(e->fdx == 0) { + float x0 = e->fx; + if(x0 < len) { + if(x0 >= 0) { + stbtt__handle_clipped_edge(scanline, (int)x0, e, x0, y_top, x0, y_bottom); + stbtt__handle_clipped_edge(scanline_fill - 1, (int)x0 + 1, e, x0, y_top, x0, y_bottom); + } + else { + stbtt__handle_clipped_edge(scanline_fill - 1, 0, e, x0, y_top, x0, y_bottom); + } + } + } + else { + float x0 = e->fx; + float dx = e->fdx; + float xb = x0 + dx; + float x_top, x_bottom; + float sy0, sy1; + float dy = e->fdy; + STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); + + // compute endpoints of line segment clipped to this scanline (if the + // line segment starts on this scanline. x0 is the intersection of the + // line with y_top, but that may be off the line segment. + if(e->sy > y_top) { + x_top = x0 + dx * (e->sy - y_top); + sy0 = e->sy; + } + else { + x_top = x0; + sy0 = y_top; + } + if(e->ey < y_bottom) { + x_bottom = x0 + dx * (e->ey - y_top); + sy1 = e->ey; + } + else { + x_bottom = xb; + sy1 = y_bottom; + } + + if(x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { + // from here on, we don't have to range check x values + + if((int)x_top == (int)x_bottom) { + float height; + // simple case, only spans one pixel + int x = (int)x_top; + height = (sy1 - sy0) * e->direction; + STBTT_assert(x >= 0 && x < len); + scanline[x] += stbtt__position_trapezoid_area(height, x_top, x + 1.0f, x_bottom, x + 1.0f); + scanline_fill[x] += height; // everything right of this pixel is filled + } + else { + int x, x1, x2; + float y_crossing, y_final, step, sign, area; + // covers 2+ pixels + if(x_top > x_bottom) { + // flip scanline vertically; signed area is the same + float t; + sy0 = y_bottom - (sy0 - y_top); + sy1 = y_bottom - (sy1 - y_top); + t = sy0, sy0 = sy1, sy1 = t; + t = x_bottom, x_bottom = x_top, x_top = t; + dx = -dx; + dy = -dy; + t = x0, x0 = xb, xb = t; + } + STBTT_assert(dy >= 0); + STBTT_assert(dx >= 0); + + x1 = (int)x_top; + x2 = (int)x_bottom; + // compute intersection with y axis at x1+1 + y_crossing = y_top + dy * (x1 + 1 - x0); + + // compute intersection with y axis at x2 + y_final = y_top + dy * (x2 - x0); + + // x1 x_top x2 x_bottom + // y_top +------|-----+------------+------------+--------|---+------------+ + // | | | | | | + // | | | | | | + // sy0 | Txxxxx|............|............|............|............| + // y_crossing | *xxxxx.......|............|............|............| + // | | xxxxx..|............|............|............| + // | | /- xx*xxxx........|............|............| + // | | dy < | xxxxxx..|............|............| + // y_final | | \- | xx*xxx.........|............| + // sy1 | | | | xxxxxB...|............| + // | | | | | | + // | | | | | | + // y_bottom +------------+------------+------------+------------+------------+ + // + // goal is to measure the area covered by '.' in each pixel + + // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 + // @TODO: maybe test against sy1 rather than y_bottom? + if(y_crossing > y_bottom) + y_crossing = y_bottom; + + sign = e->direction; + + // area of the rectangle covered from sy0..y_crossing + area = sign * (y_crossing - sy0); + + // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) + scanline[x1] += stbtt__sized_triangle_area(area, x1 + 1 - x_top); + + // check if final y_crossing is blown up; no test case for this + if(y_final > y_bottom) { + y_final = y_bottom; + dy = (y_final - y_crossing) / (x2 - (x1 + 1)); // if denom=0, y_final = y_crossing, so y_final <= y_bottom + } + + // in second pixel, area covered by line segment found in first pixel + // is always a rectangle 1 wide * the height of that line segment; this + // is exactly what the variable 'area' stores. it also gets a contribution + // from the line segment within it. the THIRD pixel will get the first + // pixel's rectangle contribution, the second pixel's rectangle contribution, + // and its own contribution. the 'own contribution' is the same in every pixel except + // the leftmost and rightmost, a trapezoid that slides down in each pixel. + // the second pixel's contribution to the third pixel will be the + // rectangle 1 wide times the height change in the second pixel, which is dy. + + step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, + // which multiplied by 1-pixel-width is how much pixel area changes for each step in x + // so the area advances by 'step' every time + + for(x = x1 + 1; x < x2; ++x) { + scanline[x] += area + step / 2; // area of trapezoid is 1*step/2 + area += step; + } + STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down + STBTT_assert(sy1 > y_final - 0.01f); + + // area covered in the last pixel is the rectangle from all the pixels to the left, + // plus the trapezoid filled by the line segment in this pixel all the way to the right edge + scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1 - y_final, (float)x2, x2 + 1.0f, x_bottom, x2 + 1.0f); + + // the rest of the line is filled based on the total height of the line segment in this pixel + scanline_fill[x2] += sign * (sy1 - sy0); + } + } + else { + // if edge goes outside of box we're drawing, we require + // clipping logic. since this does not match the intended use + // of this library, we use a different, very slow brute + // force implementation + // note though that this does happen some of the time because + // x_top and x_bottom can be extrapolated at the top & bottom of + // the shape and actually lie outside the bounding box + int x; + for(x = 0; x < len; ++x) { + // cases: + // + // there can be up to two intersections with the pixel. any intersection + // with left or right edges can be handled by splitting into two (or three) + // regions. intersections with top & bottom do not necessitate case-wise logic. + // + // the old way of doing this found the intersections with the left & right edges, + // then used some simple logic to produce up to three segments in sorted order + // from top-to-bottom. however, this had a problem: if an x edge was epsilon + // across the x border, then the corresponding y position might not be distinct + // from the other y segment, and it might ignored as an empty segment. to avoid + // that, we need to explicitly produce segments based on x positions. + + // rename variables to clearly-defined pairs + float y0 = y_top; + float x1 = (float)(x); + float x2 = (float)(x + 1); + float x3 = xb; + float y3 = y_bottom; + + // x = e->x + e->dx * (y-y_top) + // (y-y_top) = (x - e->x) / e->dx + // y = (x - e->x) / e->dx + y_top + float y1 = (x - x0) / dx + y_top; + float y2 = (x + 1 - x0) / dx + y_top; + + if(x0 < x1 && x3 > x2) { // three segments descending down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if(x3 < x1 && x0 > x2) { // three segments descending down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x0 < x1 && x3 > x1) { // two segments across x, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x3 < x1 && x0 > x1) { // two segments across x, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x1, y1); + stbtt__handle_clipped_edge(scanline, x, e, x1, y1, x3, y3); + } + else if(x0 < x2 && x3 > x2) { // two segments across x+1, down-right + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else if(x3 < x2 && x0 > x2) { // two segments across x+1, down-left + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x2, y2); + stbtt__handle_clipped_edge(scanline, x, e, x2, y2, x3, y3); + } + else { // one segment + stbtt__handle_clipped_edge(scanline, x, e, x0, y0, x3, y3); + } + } + } + } + e = e->next; + } +} + +// directly AA rasterize edges w/o supersampling +static void stbtt__rasterize_sorted_edges(stbtt__bitmap * result, stbtt__edge * e, int n, int vsubsample, int off_x, + int off_y, void * userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge * active = NULL; + int y, j = 0, i; + float scanline_data[129], * scanline, * scanline2; + + STBTT__NOTUSED(vsubsample); + + if(result->w > 64) + scanline = (float *)STBTT_malloc((result->w * 2 + 1) * sizeof(float), userdata); + else + scanline = scanline_data; + + scanline2 = scanline + result->w; + + y = off_y; + e[n].y0 = (float)(off_y + result->h) + 1; + + while(j < result->h) { + // find center of pixel for this scanline + float scan_y_top = y + 0.0f; + float scan_y_bottom = y + 1.0f; + stbtt__active_edge ** step = &active; + + STBTT_memset(scanline, 0, result->w * sizeof(scanline[0])); + STBTT_memset(scanline2, 0, (result->w + 1) * sizeof(scanline[0])); + + // update all active edges; + // remove all active edges that terminate before the top of this scanline + while(*step) { + stbtt__active_edge * z = *step; + if(z->ey <= scan_y_top) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } + else { + step = &((*step)->next); // advance through list + } + } + + // insert all edges that start before the bottom of this scanline + while(e->y0 <= scan_y_bottom) { + if(e->y0 != e->y1) { + stbtt__active_edge * z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); + if(z != NULL) { + if(j == 0 && off_y != 0) { + if(z->ey < scan_y_top) { + // this can happen due to subpixel positioning and some kind of fp rounding error i think + z->ey = scan_y_top; + } + } + STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds + // insert at front + z->next = active; + active = z; + } + } + ++e; + } + + // now process all active edges + if(active) + stbtt__fill_active_edges_new(scanline, scanline2 + 1, result->w, active, scan_y_top); + + { + float sum = 0; + for(i = 0; i < result->w; ++i) { + float k; + int m; + sum += scanline2[i]; + k = scanline[i] + sum; + k = (float)STBTT_fabs(k) * 255 + 0.5f; + m = (int)k; + if(m > 255) m = 255; + result->pixels[j * result->stride + i] = (unsigned char)m; + } + } + // advance all the edges + step = &active; + while(*step) { + stbtt__active_edge * z = *step; + z->fx += z->fdx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + + ++y; + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if(scanline != scanline_data) + STBTT_free(scanline, userdata); +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) + +static void stbtt__sort_edges_ins_sort(stbtt__edge * p, int n) +{ + int i, j; + for(i = 1; i < n; ++i) { + stbtt__edge t = p[i], * a = &t; + j = i; + while(j > 0) { + stbtt__edge * b = &p[j - 1]; + int c = STBTT__COMPARE(a, b); + if(!c) break; + p[j] = p[j - 1]; + --j; + } + if(i != j) + p[j] = t; + } +} + +static void stbtt__sort_edges_quicksort(stbtt__edge * p, int n) +{ + /* threshold for transitioning to insertion sort */ + while(n > 12) { + stbtt__edge t; + int c01, c12, c, m, i, j; + + /* compute median of three */ + m = n >> 1; + c01 = STBTT__COMPARE(&p[0], &p[m]); + c12 = STBTT__COMPARE(&p[m], &p[n - 1]); + /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ + if(c01 != c12) { + /* otherwise, we'll need to swap something else to middle */ + int z; + c = STBTT__COMPARE(&p[0], &p[n - 1]); + /* 0>mid && midn => n; 0 0 */ + /* 0n: 0>n => 0; 0 n */ + z = (c == c12) ? 0 : n - 1; + t = p[z]; + p[z] = p[m]; + p[m] = t; + } + /* now p[m] is the median-of-three */ + /* swap it to the beginning so it won't move around */ + t = p[0]; + p[0] = p[m]; + p[m] = t; + + /* partition loop */ + i = 1; + j = n - 1; + for(;;) { + /* handling of equality is crucial here */ + /* for sentinels & efficiency with duplicates */ + for(;; ++i) { + if(!STBTT__COMPARE(&p[i], &p[0])) break; + } + for(;; --j) { + if(!STBTT__COMPARE(&p[0], &p[j])) break; + } + /* make sure we haven't crossed */ + if(i >= j) break; + t = p[i]; + p[i] = p[j]; + p[j] = t; + + ++i; + --j; + } + /* recurse on smaller side, iterate on larger */ + if(j < (n - i)) { + stbtt__sort_edges_quicksort(p, j); + p = p + i; + n = n - i; + } + else { + stbtt__sort_edges_quicksort(p + i, n - i); + n = j; + } + } +} + +static void stbtt__sort_edges(stbtt__edge * p, int n) +{ + stbtt__sort_edges_quicksort(p, n); + stbtt__sort_edges_ins_sort(p, n); +} + +typedef struct { + float x, y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap * result, stbtt__point * pts, int * wcount, int windings, float scale_x, + float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void * userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge * e; + int n, i, j, k, m; +#if STBTT_RASTERIZER_VERSION == 1 + int vsubsample = result->h < 8 ? 15 : 5; +#elif STBTT_RASTERIZER_VERSION == 2 + int vsubsample = 1; +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for(i = 0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge *)STBTT_malloc(sizeof(*e) * (n + 1), userdata); // add an extra one as a sentinel + if(e == 0) return; + n = 0; + + m = 0; + for(i = 0; i < windings; ++i) { + stbtt__point * p = pts + m; + m += wcount[i]; + j = wcount[i] - 1; + for(k = 0; k < wcount[i]; j = k++) { + int a = k, b = j; + // skip the edge if horizontal + if(p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if(invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a = j, b = k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + stbtt__sort_edges(e, n); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point * points, int n, float x, float y) +{ + if(!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, + float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2 * x1 + x2) / 4; + float my = (y0 + 2 * y1 + y2) / 4; + // versus directly drawn line + float dx = (x0 + x2) / 2 - mx; + float dy = (y0 + y2) / 2 - my; + if(n > 16) // 65536 segments on one curve better be enough! + return 1; + if(dx * dx + dy * dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0, y0, (x0 + x1) / 2.0f, (y0 + y1) / 2.0f, mx, my, + objspace_flatness_squared, n + 1); + stbtt__tesselate_curve(points, num_points, mx, my, (x1 + x2) / 2.0f, (y1 + y2) / 2.0f, x2, y2, + objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x2, y2); + *num_points = *num_points + 1; + } + return 1; +} + +static void stbtt__tesselate_cubic(stbtt__point * points, int * num_points, float x0, float y0, float x1, float y1, + float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) +{ + // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough + float dx0 = x1 - x0; + float dy0 = y1 - y0; + float dx1 = x2 - x1; + float dy1 = y2 - y1; + float dx2 = x3 - x2; + float dy2 = y3 - y2; + float dx = x3 - x0; + float dy = y3 - y0; + float longlen = (float)(STBTT_sqrt(dx0 * dx0 + dy0 * dy0) + STBTT_sqrt(dx1 * dx1 + dy1 * dy1) + STBTT_sqrt( + dx2 * dx2 + dy2 * dy2)); + float shortlen = (float)STBTT_sqrt(dx * dx + dy * dy); + float flatness_squared = longlen * longlen - shortlen * shortlen; + + if(n > 16) // 65536 segments on one curve better be enough! + return; + + if(flatness_squared > objspace_flatness_squared) { + float x01 = (x0 + x1) / 2; + float y01 = (y0 + y1) / 2; + float x12 = (x1 + x2) / 2; + float y12 = (y1 + y2) / 2; + float x23 = (x2 + x3) / 2; + float y23 = (y2 + y3) / 2; + + float xa = (x01 + x12) / 2; + float ya = (y01 + y12) / 2; + float xb = (x12 + x23) / 2; + float yb = (y12 + y23) / 2; + + float mx = (xa + xb) / 2; + float my = (ya + yb) / 2; + + stbtt__tesselate_cubic(points, num_points, x0, y0, x01, y01, xa, ya, mx, my, objspace_flatness_squared, n + 1); + stbtt__tesselate_cubic(points, num_points, mx, my, xb, yb, x23, y23, x3, y3, objspace_flatness_squared, n + 1); + } + else { + stbtt__add_point(points, *num_points, x3, y3); + *num_points = *num_points + 1; + } +} + +// returns number of contours +static stbtt__point * stbtt_FlattenCurves(stbtt_vertex * vertices, int num_verts, float objspace_flatness, + int ** contour_lengths, int * num_contours, void * userdata) +{ + stbtt__point * points = 0; + int num_points = 0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i, n = 0, start = 0, pass; + + // count how many "moves" there are to get the contour count + for(i = 0; i < num_verts; ++i) + if(vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if(n == 0) return 0; + + *contour_lengths = (int *)STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if(*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for(pass = 0; pass < 2; ++pass) { + float x = 0, y = 0; + if(pass == 1) { + points = (stbtt__point *)STBTT_malloc(num_points * sizeof(points[0]), userdata); + if(points == NULL) goto error; + } + num_points = 0; + n = -1; + for(i = 0; i < num_verts; ++i) { + switch(vertices[i].type) { + case STBTT_vmove: + // start the next contour + if(n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + case STBTT_vcubic: + stbtt__tesselate_cubic(points, &num_points, x, y, + vertices[i].cx, vertices[i].cy, + vertices[i].cx1, vertices[i].cy1, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap * result, float flatness_in_pixels, stbtt_vertex * vertices, int num_verts, + float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void * userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count = 0; + int * winding_lengths = NULL; + stbtt__point * windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, + &winding_count, userdata); + if(windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, + invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +STBTT_DEF void stbtt_FreeBitmap(unsigned char * bitmap, void * userdata) +{ + STBTT_free(bitmap, userdata); +} + +STBTT_DEF unsigned char * stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int glyph, int * width, int * height, int * xoff, int * yoff) +{ + int ix0, iy0, ix1, iy1; + stbtt__bitmap gbm; + stbtt_vertex * vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if(scale_x == 0) scale_x = scale_y; + if(scale_y == 0) { + if(scale_x == 0) { + STBTT_free(vertices, info->userdata); + return NULL; + } + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, &ix1, &iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if(width) *width = gbm.w; + if(height) *height = gbm.h; + if(xoff) *xoff = ix0; + if(yoff) *yoff = iy0; + + if(gbm.w && gbm.h) { + gbm.pixels = (unsigned char *)STBTT_malloc(gbm.w * gbm.h, info->userdata); + if(gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +STBTT_DEF unsigned char * stbtt_GetGlyphBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, int glyph, + int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0, iy0; + stbtt_vertex * vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0, &iy0, 0, 0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if(gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, glyph); +} + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo * info, float scale_x, float scale_y, + float shift_x, float shift_y, int codepoint, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info, codepoint), + width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, + int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, + int oversample_y, float * sub_x, float * sub_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, + oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, + stbtt_FindGlyphIndex(info, codepoint)); +} + +STBTT_DEF unsigned char * stbtt_GetCodepointBitmap(const stbtt_fontinfo * info, float scale_x, float scale_y, + int codepoint, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, codepoint, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo * info, unsigned char * output, int out_w, int out_h, + int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f, 0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small +#ifdef STBTT_STREAM_TYPE +static int stbtt_BakeFontBitmap_internal(STBTT_STREAM_TYPE data, + int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char * pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar * chardata) +#else +static int stbtt_BakeFontBitmap_internal(unsigned char * data, + int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char * pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar * chardata) +#endif +{ + float scale; + int x, y, bottom_y, i; + stbtt_fontinfo f; + f.userdata = NULL; + if(!stbtt_InitFont(&f, data, offset)) + return -1; + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + x = y = 1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for(i = 0; i < num_chars; ++i) { + int advance, lsb, x0, y0, x1, y1, gw, gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale, scale, &x0, &y0, &x1, &y1); + gw = x1 - x0; + gh = y1 - y0; + if(x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if(y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x + gw < pw); + STBTT_assert(y + gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels + x + y * pw, gw, gh, pw, scale, scale, g); + chardata[i].x0 = (stbtt_int16)x; + chardata[i].y0 = (stbtt_int16)y; + chardata[i].x1 = (stbtt_int16)(x + gw); + chardata[i].y1 = (stbtt_int16)(y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float)x0; + chardata[i].yoff = (float)y0; + x = x + gw + 1; + if(y + gh + 1 > bottom_y) + bottom_y = y + gh + 1; + } + return bottom_y; +} + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar * chardata, int pw, int ph, int char_index, float * xpos, + float * ypos, stbtt_aligned_quad * q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_bakedchar * b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// rectangle packing replacement routines if you don't have stb_rect_pack.h +// + +#ifndef STB_RECT_PACK_VERSION + +typedef int stbrp_coord; + +//////////////////////////////////////////////////////////////////////////////////// +// // +// // +// COMPILER WARNING ?!?!? // +// // +// // +// if you get a compile warning due to these symbols being defined more than // +// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // +// // +//////////////////////////////////////////////////////////////////////////////////// + +typedef struct { + int width, height; + int x, y, bottom_y; +} stbrp_context; + +typedef struct { + unsigned char x; +} stbrp_node; + +struct stbrp_rect { + stbrp_coord x, y; + int id, w, h, was_packed; +}; + +static void stbrp_init_target(stbrp_context * con, int pw, int ph, stbrp_node * nodes, int num_nodes) +{ + con->width = pw; + con->height = ph; + con->x = 0; + con->y = 0; + con->bottom_y = 0; + STBTT__NOTUSED(nodes); + STBTT__NOTUSED(num_nodes); +} + +static void stbrp_pack_rects(stbrp_context * con, stbrp_rect * rects, int num_rects) +{ + int i; + for(i = 0; i < num_rects; ++i) { + if(con->x + rects[i].w > con->width) { + con->x = 0; + con->y = con->bottom_y; + } + if(con->y + rects[i].h > con->height) + break; + rects[i].x = con->x; + rects[i].y = con->y; + rects[i].was_packed = 1; + con->x += rects[i].w; + if(con->y + rects[i].h > con->bottom_y) + con->bottom_y = con->y + rects[i].h; + } + for(; i < num_rects; ++i) + rects[i].was_packed = 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If +// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context * spc, unsigned char * pixels, int pw, int ph, int stride_in_bytes, + int padding, void * alloc_context) +{ + stbrp_context * context = (stbrp_context *)STBTT_malloc(sizeof(*context), alloc_context); + int num_nodes = pw - padding; + stbrp_node * nodes = (stbrp_node *)STBTT_malloc(sizeof(*nodes) * num_nodes, alloc_context); + + if(context == NULL || nodes == NULL) { + if(context != NULL) STBTT_free(context, alloc_context); + if(nodes != NULL) STBTT_free(nodes, alloc_context); + return 0; + } + + spc->user_allocator_context = alloc_context; + spc->width = pw; + spc->height = ph; + spc->pixels = pixels; + spc->pack_info = context; + spc->nodes = nodes; + spc->padding = padding; + spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; + spc->h_oversample = 1; + spc->v_oversample = 1; + spc->skip_missing = 0; + + stbrp_init_target(context, pw - padding, ph - padding, nodes, num_nodes); + + if(pixels) + STBTT_memset(pixels, 0, pw * ph); // background of 0 around pixels + + return 1; +} + +STBTT_DEF void stbtt_PackEnd(stbtt_pack_context * spc) +{ + STBTT_free(spc->nodes, spc->user_allocator_context); + STBTT_free(spc->pack_info, spc->user_allocator_context); +} + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context * spc, unsigned int h_oversample, unsigned int v_oversample) +{ + STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); + STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); + if(h_oversample <= STBTT_MAX_OVERSAMPLE) + spc->h_oversample = h_oversample; + if(v_oversample <= STBTT_MAX_OVERSAMPLE) + spc->v_oversample = v_oversample; +} + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context * spc, int skip) +{ + spc->skip_missing = skip; +} + +#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) + +static void stbtt__h_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_w = w - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for(j = 0; j < h; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch(kernel_width) { + case 2: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 2); + } + break; + case 3: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 3); + } + break; + case 4: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 4); + } + break; + case 5: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / 5); + } + break; + default: + for(i = 0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char)(total / kernel_width); + } + break; + } + + for(; i < w; ++i) { + STBTT_assert(pixels[i] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i] = (unsigned char)(total / kernel_width); + } + + pixels += stride_in_bytes; + } +} + +static void stbtt__v_prefilter(unsigned char * pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_h = h - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for(j = 0; j < w; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch(kernel_width) { + case 2: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 2); + } + break; + case 3: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 3); + } + break; + case 4: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 4); + } + break; + case 5: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / 5); + } + break; + default: + for(i = 0; i <= safe_h; ++i) { + total += pixels[i * stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i + kernel_width) & STBTT__OVER_MASK] = pixels[i * stride_in_bytes]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + break; + } + + for(; i < h; ++i) { + STBTT_assert(pixels[i * stride_in_bytes] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i * stride_in_bytes] = (unsigned char)(total / kernel_width); + } + + pixels += 1; + } +} + +static float stbtt__oversample_shift(int oversample) +{ + if(!oversample) + return 0.0f; + + // The prefilter is a box filter of width "oversample", + // which shifts phase by (oversample - 1)/2 pixels in + // oversampled space. We want to shift in the opposite + // direction to counter this. + return (float) - (oversample - 1) / (2.0f * (float)oversample); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) +{ + int i, j, k; + int missing_glyph_added = 0; + + k = 0; + for(i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + ranges[i].h_oversample = (unsigned char)spc->h_oversample; + ranges[i].v_oversample = (unsigned char)spc->v_oversample; + for(j = 0; j < ranges[i].num_chars; ++j) { + int x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + if(glyph == 0 && (spc->skip_missing || missing_glyph_added)) { + rects[k].w = rects[k].h = 0; + } + else { + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + &x0, &y0, &x1, &y1); + rects[k].w = (stbrp_coord)(x1 - x0 + spc->padding + spc->h_oversample - 1); + rects[k].h = (stbrp_coord)(y1 - y0 + spc->padding + spc->v_oversample - 1); + if(glyph == 0) + missing_glyph_added = 1; + } + ++k; + } + } + + return k; +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo * info, unsigned char * output, int out_w, + int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, + float * sub_x, float * sub_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, + output, + out_w - (prefilter_x - 1), + out_h - (prefilter_y - 1), + out_stride, + scale_x, + scale_y, + shift_x, + shift_y, + glyph); + + if(prefilter_x > 1) + stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); + + if(prefilter_y > 1) + stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); + + *sub_x = stbtt__oversample_shift(prefilter_x); + *sub_y = stbtt__oversample_shift(prefilter_y); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context * spc, const stbtt_fontinfo * info, + stbtt_pack_range * ranges, int num_ranges, stbrp_rect * rects) +{ + int i, j, k, missing_glyph = -1, return_value = 1; + + // save current values + int old_h_over = spc->h_oversample; + int old_v_over = spc->v_oversample; + + k = 0; + for(i = 0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + float recip_h, recip_v, sub_x, sub_y; + spc->h_oversample = ranges[i].h_oversample; + spc->v_oversample = ranges[i].v_oversample; + recip_h = 1.0f / spc->h_oversample; + recip_v = 1.0f / spc->v_oversample; + sub_x = stbtt__oversample_shift(spc->h_oversample); + sub_y = stbtt__oversample_shift(spc->v_oversample); + for(j = 0; j < ranges[i].num_chars; ++j) { + stbrp_rect * r = &rects[k]; + if(r->was_packed && r->w != 0 && r->h != 0) { + stbtt_packedchar * bc = &ranges[i].chardata_for_range[j]; + int advance, lsb, x0, y0, x1, y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : + ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + stbrp_coord pad = (stbrp_coord)spc->padding; + + // pad on left and top + r->x += pad; + r->y += pad; + r->w -= pad; + r->h -= pad; + stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); + stbtt_GetGlyphBitmapBox(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + &x0, &y0, &x1, &y1); + stbtt_MakeGlyphBitmapSubpixel(info, + spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w - spc->h_oversample + 1, + r->h - spc->v_oversample + 1, + spc->stride_in_bytes, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0, 0, + glyph); + + if(spc->h_oversample > 1) + stbtt__h_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->h_oversample); + + if(spc->v_oversample > 1) + stbtt__v_prefilter(spc->pixels + r->x + r->y * spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->v_oversample); + + bc->x0 = (stbtt_int16)r->x; + bc->y0 = (stbtt_int16)r->y; + bc->x1 = (stbtt_int16)(r->x + r->w); + bc->y1 = (stbtt_int16)(r->y + r->h); + bc->xadvance = scale * advance; + bc->xoff = (float)x0 * recip_h + sub_x; + bc->yoff = (float)y0 * recip_v + sub_y; + bc->xoff2 = (x0 + r->w) * recip_h + sub_x; + bc->yoff2 = (y0 + r->h) * recip_v + sub_y; + + if(glyph == 0) + missing_glyph = j; + } + else if(spc->skip_missing) { + return_value = 0; + } + else if(r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { + ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; + } + else { + return_value = 0; // if any fail, report failure + } + + ++k; + } + } + + // restore original values + spc->h_oversample = old_h_over; + spc->v_oversample = old_v_over; + + return return_value; +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges); +#else +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges); +#endif + +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context * spc, stbrp_rect * rects, int num_rects) +{ + stbrp_pack_rects((stbrp_context *)spc->pack_info, rects, num_rects); +} +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges) +#else +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + stbtt_pack_range * ranges, int num_ranges) +#endif +{ + stbtt_fontinfo info; + int i, j, n, return_value = 1; + //stbrp_context *context = (stbrp_context *) spc->pack_info; + stbrp_rect * rects; + + // flag all characters as NOT packed + for(i = 0; i < num_ranges; ++i) + for(j = 0; j < ranges[i].num_chars; ++j) + ranges[i].chardata_for_range[j].x0 = + ranges[i].chardata_for_range[j].y0 = + ranges[i].chardata_for_range[j].x1 = + ranges[i].chardata_for_range[j].y1 = 0; + + n = 0; + for(i = 0; i < num_ranges; ++i) + n += ranges[i].num_chars; + + rects = (stbrp_rect *)STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); + if(rects == NULL) + return 0; + + info.userdata = spc->user_allocator_context; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, font_index)); + + n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); + + stbtt_PackFontRangesPackRects(spc, rects, n); + + return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); + + STBTT_free(rects, spc->user_allocator_context); + return return_value; +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); +#else +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, STBTT_STREAM_TYPE fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) +#else +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context * spc, const unsigned char * fontdata, int font_index, + float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar * chardata_for_range) +#endif +{ + stbtt_pack_range range; + range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; + range.array_of_unicode_codepoints = NULL; + range.num_chars = num_chars_in_range; + range.chardata_for_range = chardata_for_range; + range.font_size = font_size; + return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); +} + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, + float * descent, float * lineGap); +#else +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, + float * descent, float * lineGap); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF void stbtt_GetScaledFontVMetrics(STBTT_STREAM_TYPE fontdata, int index, float size, float * ascent, + float * descent, float * lineGap) +#else +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char * fontdata, int index, float size, float * ascent, + float * descent, float * lineGap) +#endif +{ + int i_ascent, i_descent, i_lineGap; + float scale; + stbtt_fontinfo info; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); + scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); + stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); + *ascent = (float)i_ascent * scale; + *descent = (float)i_descent * scale; + *lineGap = (float)i_lineGap * scale; +} + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar * chardata, int pw, int ph, int char_index, float * xpos, + float * ypos, stbtt_aligned_quad * q, int align_to_integer) +{ + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_packedchar * b = chardata + char_index; + + if(align_to_integer) { + float x = (float)STBTT_ifloor((*xpos + b->xoff) + 0.5f); + float y = (float)STBTT_ifloor((*ypos + b->yoff) + 0.5f); + q->x0 = x; + q->y0 = y; + q->x1 = x + b->xoff2 - b->xoff; + q->y1 = y + b->yoff2 - b->yoff; + } + else { + q->x0 = *xpos + b->xoff; + q->y0 = *ypos + b->yoff; + q->x1 = *xpos + b->xoff2; + q->y1 = *ypos + b->yoff2; + } + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// sdf computation +// + +#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) +#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) + +static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], + float hits[2][2]) +{ + float q0perp = q0[1] * ray[0] - q0[0] * ray[1]; + float q1perp = q1[1] * ray[0] - q1[0] * ray[1]; + float q2perp = q2[1] * ray[0] - q2[0] * ray[1]; + float roperp = orig[1] * ray[0] - orig[0] * ray[1]; + + float a = q0perp - 2 * q1perp + q2perp; + float b = q1perp - q0perp; + float c = q0perp - roperp; + + float s0 = 0., s1 = 0.; + int num_s = 0; + + if(a != 0.0f) { + float discr = b * b - a * c; + if(discr > 0.0f) { + float rcpna = -1 / a; + float d = (float)STBTT_sqrt(discr); + s0 = (b + d) * rcpna; + s1 = (b - d) * rcpna; + if(s0 >= 0.0f && s0 <= 1.0f) + num_s = 1; + if(d > 0.0f && s1 >= 0.0f && s1 <= 1.0f) { + if(num_s == 0) s0 = s1; + ++num_s; + } + } + } + else { + // 2*b*s + c = 0 + // s = -c / (2*b) + s0 = c / (-2 * b); + if(s0 >= 0.0f && s0 <= 1.0f) + num_s = 1; + } + + if(num_s == 0) + return 0; + else { + float rcp_len2 = 1 / (ray[0] * ray[0] + ray[1] * ray[1]); + float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; + + float q0d = q0[0] * rayn_x + q0[1] * rayn_y; + float q1d = q1[0] * rayn_x + q1[1] * rayn_y; + float q2d = q2[0] * rayn_x + q2[1] * rayn_y; + float rod = orig[0] * rayn_x + orig[1] * rayn_y; + + float q10d = q1d - q0d; + float q20d = q2d - q0d; + float q0rd = q0d - rod; + + hits[0][0] = q0rd + s0 * (2.0f - 2.0f * s0) * q10d + s0 * s0 * q20d; + hits[0][1] = a * s0 + b; + + if(num_s > 1) { + hits[1][0] = q0rd + s1 * (2.0f - 2.0f * s1) * q10d + s1 * s1 * q20d; + hits[1][1] = a * s1 + b; + return 2; + } + else { + return 1; + } + } +} + +static int equal(float * a, float * b) +{ + return (a[0] == b[0] && a[1] == b[1]); +} + +static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex * verts) +{ + int i; + float orig[2], ray[2] = { 1, 0 }; + float y_frac; + int winding = 0; + + // make sure y never passes through a vertex of the shape + y_frac = (float)STBTT_fmod(y, 1.0f); + if(y_frac < 0.01f) + y += 0.01f; + else if(y_frac > 0.99f) + y -= 0.01f; + + orig[0] = x; + orig[1] = y; + + // test a ray from (-infinity,y) to (x,y) + for(i = 0; i < nverts; ++i) { + if(verts[i].type == STBTT_vline) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].x, y1 = (int)verts[i].y; + if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if(x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + if(verts[i].type == STBTT_vcurve) { + int x0 = (int)verts[i - 1].x, y0 = (int)verts[i - 1].y; + int x1 = (int)verts[i].cx, y1 = (int)verts[i].cy; + int x2 = (int)verts[i].x, y2 = (int)verts[i].y; + int ax = STBTT_min(x0, STBTT_min(x1, x2)), ay = STBTT_min(y0, STBTT_min(y1, y2)); + int by = STBTT_max(y0, STBTT_max(y1, y2)); + if(y > ay && y < by && x > ax) { + float q0[2], q1[2], q2[2]; + float hits[2][2]; + q0[0] = (float)x0; + q0[1] = (float)y0; + q1[0] = (float)x1; + q1[1] = (float)y1; + q2[0] = (float)x2; + q2[1] = (float)y2; + if(equal(q0, q1) || equal(q1, q2)) { + x0 = (int)verts[i - 1].x; + y0 = (int)verts[i - 1].y; + x1 = (int)verts[i].x; + y1 = (int)verts[i].y; + if(y > STBTT_min(y0, y1) && y < STBTT_max(y0, y1) && x > STBTT_min(x0, x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1 - x0) + x0; + if(x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + else { + int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); + if(num_hits >= 1) + if(hits[0][0] < 0) + winding += (hits[0][1] < 0 ? -1 : 1); + if(num_hits >= 2) + if(hits[1][0] < 0) + winding += (hits[1][1] < 0 ? -1 : 1); + } + } + } + } + return winding; +} + +static float stbtt__cuberoot(float x) +{ + if(x < 0) + return -(float)STBTT_pow(-x, 1.0f / 3.0f); + else + return (float)STBTT_pow(x, 1.0f / 3.0f); +} + +// x^3 + a*x^2 + b*x + c = 0 +static int stbtt__solve_cubic(float a, float b, float c, float * r) +{ + float s = -a / 3; + float p = b - a * a / 3; + float q = a * (2 * a * a - 9 * b) / 27 + c; + float p3 = p * p * p; + float d = q * q + 4 * p3 / 27; + if(d >= 0) { + float z = (float)STBTT_sqrt(d); + float u = (-q + z) / 2; + float v = (-q - z) / 2; + u = stbtt__cuberoot(u); + v = stbtt__cuberoot(v); + r[0] = s + u + v; + return 1; + } + else { + float u = (float)STBTT_sqrt(-p / 3); + float v = (float)STBTT_acos(-STBTT_sqrt(-27 / p3) * q / 2) / 3; // p3 must be negative, since d is negative + float m = (float)STBTT_cos(v); + float n = (float)STBTT_cos(v - 3.141592f / 2) * 1.732050808f; + r[0] = s + u * 2 * m; + r[1] = s - u * (m + n); + r[2] = s - u * (m - n); + + //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? + //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); + //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); + return 3; + } +} + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo * info, float scale, int glyph, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) +{ + float scale_x = scale, scale_y = scale; + int ix0, iy0, ix1, iy1; + int w, h; + unsigned char * data; + + if(scale == 0) return NULL; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f, 0.0f, &ix0, &iy0, &ix1, &iy1); + + // if empty, return NULL + if(ix0 == ix1 || iy0 == iy1) + return NULL; + + ix0 -= padding; + iy0 -= padding; + ix1 += padding; + iy1 += padding; + + w = (ix1 - ix0); + h = (iy1 - iy0); + + if(width) *width = w; + if(height) *height = h; + if(xoff) *xoff = ix0; + if(yoff) *yoff = iy0; + + // invert for y-downwards bitmaps + scale_y = -scale_y; + + { + int x, y, i, j; + float * precompute; + stbtt_vertex * verts; + int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); + data = (unsigned char *)STBTT_malloc(w * h, info->userdata); + precompute = (float *)STBTT_malloc(num_verts * sizeof(float), info->userdata); + + for(i = 0, j = num_verts - 1; i < num_verts; j = i++) { + if(verts[i].type == STBTT_vline) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float x1 = verts[j].x * scale_x, y1 = verts[j].y * scale_y; + float dist = (float)STBTT_sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)); + precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; + } + else if(verts[i].type == STBTT_vcurve) { + float x2 = verts[j].x * scale_x, y2 = verts[j].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float len2 = bx * bx + by * by; + if(len2 != 0.0f) + precompute[i] = 1.0f / (bx * bx + by * by); + else + precompute[i] = 0.0f; + } + else + precompute[i] = 0.0f; + } + + for(y = iy0; y < iy1; ++y) { + for(x = ix0; x < ix1; ++x) { + float val; + float min_dist = 999999.0f; + float sx = (float)x + 0.5f; + float sy = (float)y + 0.5f; + float x_gspace = (sx / scale_x); + float y_gspace = (sy / scale_y); + + int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, + verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path + + for(i = 0; i < num_verts; ++i) { + float x0 = verts[i].x * scale_x, y0 = verts[i].y * scale_y; + + if(verts[i].type == STBTT_vline && precompute[i] != 0.0f) { + float x1 = verts[i - 1].x * scale_x, y1 = verts[i - 1].y * scale_y; + + float dist, dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + + // coarse culling against bbox + //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && + // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) + dist = (float)STBTT_fabs((x1 - x0) * (y0 - sy) - (y1 - y0) * (x0 - sx)) * precompute[i]; + STBTT_assert(i != 0); + if(dist < min_dist) { + // check position along line + // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) + // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) + float dx = x1 - x0, dy = y1 - y0; + float px = x0 - sx, py = y0 - sy; + // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy + // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve + float t = -(px * dx + py * dy) / (dx * dx + dy * dy); + if(t >= 0.0f && t <= 1.0f) + min_dist = dist; + } + } + else if(verts[i].type == STBTT_vcurve) { + float x2 = verts[i - 1].x * scale_x, y2 = verts[i - 1].y * scale_y; + float x1 = verts[i].cx * scale_x, y1 = verts[i].cy * scale_y; + float box_x0 = STBTT_min(STBTT_min(x0, x1), x2); + float box_y0 = STBTT_min(STBTT_min(y0, y1), y2); + float box_x1 = STBTT_max(STBTT_max(x0, x1), x2); + float box_y1 = STBTT_max(STBTT_max(y0, y1), y2); + // coarse culling against bbox to avoid computing cubic unnecessarily + if(sx > box_x0 - min_dist && sx < box_x1 + min_dist && sy > box_y0 - min_dist && sy < box_y1 + min_dist) { + int num = 0; + float ax = x1 - x0, ay = y1 - y0; + float bx = x0 - 2 * x1 + x2, by = y0 - 2 * y1 + y2; + float mx = x0 - sx, my = y0 - sy; + float res[3] = { 0.f, 0.f, 0.f }; + float px, py, t, it, dist2; + float a_inv = precompute[i]; + if(a_inv == 0.0f) { // if a_inv is 0, it's 2nd degree so use quadratic formula + float a = 3 * (ax * bx + ay * by); + float b = 2 * (ax * ax + ay * ay) + (mx * bx + my * by); + float c = mx * ax + my * ay; + if(a == 0.0f) { // if a is 0, it's linear + if(b != 0.0f) { + res[num++] = -c / b; + } + } + else { + float discriminant = b * b - 4 * a * c; + if(discriminant < 0) + num = 0; + else { + float root = (float)STBTT_sqrt(discriminant); + res[0] = (-b - root) / (2 * a); + res[1] = (-b + root) / (2 * a); + num = 2; // don't bother distinguishing 1-solution case, as code below will still work + } + } + } + else { + float b = 3 * (ax * bx + ay * by) * a_inv; // could precompute this as it doesn't depend on sample point + float c = (2 * (ax * ax + ay * ay) + (mx * bx + my * by)) * a_inv; + float d = (mx * ax + my * ay) * a_inv; + num = stbtt__solve_cubic(b, c, d, res); + } + dist2 = (x0 - sx) * (x0 - sx) + (y0 - sy) * (y0 - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + + if(num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { + t = res[0], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if(num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { + t = res[1], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + if(num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { + t = res[2], it = 1.0f - t; + px = it * it * x0 + 2 * t * it * x1 + t * t * x2; + py = it * it * y0 + 2 * t * it * y1 + t * t * y2; + dist2 = (px - sx) * (px - sx) + (py - sy) * (py - sy); + if(dist2 < min_dist * min_dist) + min_dist = (float)STBTT_sqrt(dist2); + } + } + } + } + if(winding == 0) + min_dist = -min_dist; // if outside the shape, value is negative + val = onedge_value + pixel_dist_scale * min_dist; + if(val < 0) + val = 0; + else if(val > 255) + val = 255; + data[(y - iy0) * w + (x - ix0)] = (unsigned char)val; + } + } + STBTT_free(precompute, info->userdata); + STBTT_free(verts, info->userdata); + } + return data; +} + +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo * info, float scale, int codepoint, int padding, + unsigned char onedge_value, float pixel_dist_scale, int * width, int * height, int * xoff, int * yoff) +{ + return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, + width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_FreeSDF(unsigned char * bitmap, void * userdata) +{ + STBTT_free(bitmap, userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +#ifdef STBTT_STREAM_TYPE +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, STBTT_STREAM_TYPE s2, + stbtt_uint32 s2offs, stbtt_int32 len2) +#else +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 * s1, stbtt_int32 len1, stbtt_uint8 * s2, + stbtt_uint32 s2offs, stbtt_int32 len2) +#endif +{ + stbtt_int32 i = 0; + + // convert utf16 to utf8 and compare the results while converting + while(len2) { + stbtt_uint16 ch = ttUSHORT(s2, s2offs); + if(ch < 0x80) { + if(i >= len1) return -1; + if(s1[i++] != ch) return -1; + } + else if(ch < 0x800) { + if(i + 1 >= len1) return -1; + if(s1[i++] != 0xc0 + (ch >> 6)) return -1; + if(s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } + else if(ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = ttUSHORT(s2, s2offs + 2); + if(i + 3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if(s1[i++] != 0xf0 + (c >> 18)) return -1; + if(s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((c) & 0x3f)) return -1; + s2offs += 2; // plus another 2 below + len2 -= 2; + } + else if(ch >= 0xdc00 && ch < 0xe000) { + return -1; + } + else { + if(i + 2 >= len1) return -1; + if(s1[i++] != 0xe0 + (ch >> 12)) return -1; + if(s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if(s1[i++] != 0x80 + ((ch) & 0x3f)) return -1; + } + s2offs += 2; + len2 -= 2; + } + return i; +} +#ifdef STBTT_STREAM_TYPE +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, s2, s2offs, len2); +} +#else +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char * s1, int len1, char * s2, stbtt_uint32 s2offs, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8 *)s1, len1, (stbtt_uint8 *)s2, s2offs, len2); +} +#endif +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +STBTT_DEF stbtt_uint32 stbtt_GetFontNameString(const stbtt_fontinfo * font, int * length, int platformID, + int encodingID, int languageID, int nameID) +{ + stbtt_int32 i, count, stringOffset; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(font->data, offset, "name"); + if(!nm) return 0; + + count = ttUSHORT(font->data, nm + 2); + stringOffset = nm + ttUSHORT(font->data, nm + 4); + for(i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if(platformID == ttUSHORT(font->data, loc + 0) && encodingID == ttUSHORT(font->data, loc + 2) + && languageID == ttUSHORT(font->data, loc + 4) && nameID == ttUSHORT(font->data, loc + 6)) { + *length = ttUSHORT(font->data, loc + 8); + return stringOffset + ttUSHORT(font->data, loc + 10); + } + } + return 0; +} +#ifdef STBTT_STREAM_TYPE +static int stbtt__matchpair(STBTT_STREAM_TYPE fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, + stbtt_int32 target_id, stbtt_int32 next_id) +#else +static int stbtt__matchpair(stbtt_uint8 * fc, stbtt_uint32 nm, stbtt_uint8 * name, stbtt_int32 nlen, + stbtt_int32 target_id, stbtt_int32 next_id) +#endif +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc, nm + 2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc, nm + 4); + + for(i = 0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc, loc + 6); + if(id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc, loc + 0), encoding = ttUSHORT(fc, loc + 2), language = ttUSHORT(fc, loc + 4); + + // is this a Unicode encoding? + if(platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc, loc + 8); + stbtt_int32 off = ttUSHORT(fc, loc + 10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc, stringOffset + off, slen); + if(matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if(i + 1 < count && ttUSHORT(fc, loc + 12 + 6) == next_id && ttUSHORT(fc, loc + 12) == platform && + ttUSHORT(fc, loc + 12 + 2) == encoding && ttUSHORT(fc, loc + 12 + 4) == language) { + slen = ttUSHORT(fc, loc + 12 + 8); + off = ttUSHORT(fc, loc + 12 + 10); + if(slen == 0) { + if(matchlen == nlen) + return 1; + } + else if(matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; +#ifdef STBTT_STREAM_TYPE + if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, fc, stringOffset + off, + slen)) +#else + if(stbtt_CompareUTF8toUTF16_bigendian_internal((char *)(name + matchlen), nlen - matchlen, (char *)fc, + stringOffset + off, slen)) +#endif + return 1; + } + } + else { + // if nothing immediately following + if(matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt__matches(STBTT_STREAM_TYPE fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) +#else + static int stbtt__matches(stbtt_uint8 * fc, stbtt_uint32 offset, stbtt_uint8 * name, stbtt_int32 flags) +#endif + +{ + stbtt_int32 nlen = (stbtt_int32)STBTT_strlen((char *)name); + stbtt_uint32 nm, hd; + if(!stbtt__isfont(fc, offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if(flags) { + hd = stbtt__find_table(fc, offset, "head"); + if((ttUSHORT(fc, hd + 44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if(!nm) return 0; + + if(flags) { + if(name == NULL) return 1; + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if(stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + else { + if(name == NULL) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if(stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} +#ifdef STBTT_STREAM_TYPE + static int stbtt_FindMatchingFont_internal(STBTT_STREAM_TYPE font_collection, char * name_utf8, stbtt_int32 flags) +#else + static int stbtt_FindMatchingFont_internal(unsigned char * font_collection, char * name_utf8, stbtt_int32 flags) +#endif +{ + stbtt_int32 i; + for(i = 0;; ++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if(off < 0) return off; +#ifdef STBTT_STREAM_TYPE + if(stbtt__matches(font_collection, off, (stbtt_uint8 *)name_utf8, flags)) +#else + if(stbtt__matches((stbtt_uint8 *)font_collection, off, (stbtt_uint8 *)name_utf8, flags)) +#endif + return off; + } +} + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata); +#else +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata); +#endif + +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_BakeFontBitmap(STBTT_STREAM_TYPE data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata) +#else +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char * data, int offset, + float pixel_height, unsigned char * pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar * chardata) +#endif +{ +#ifdef STBTT_STREAM_TYPE + return stbtt_BakeFontBitmap_internal(data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); +#else + return stbtt_BakeFontBitmap_internal((unsigned char *)data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, + chardata); +#endif +} +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetFontOffsetForIndex(STBTT_STREAM_TYPE data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal(data, index); +} +#else +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char * data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal((unsigned char *)data, index); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_GetNumberOfFonts(STBTT_STREAM_TYPE data) +{ + return stbtt_GetNumberOfFonts_internal(data); +} +#else +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char * data) +{ + return stbtt_GetNumberOfFonts_internal((unsigned char *)data); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, STBTT_STREAM_TYPE data, int offset) +{ + return stbtt_InitFont_internal(info, data, offset); +} +#else +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo * info, const unsigned char * data, int offset) +{ + return stbtt_InitFont_internal(info, (unsigned char *)data, offset); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_FindMatchingFont(STBTT_STREAM_TYPE fontdata, const char * name, int flags) +{ + return stbtt_FindMatchingFont_internal(fontdata, (char *)name, flags); +} +#else +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char * fontdata, const char * name, int flags) +{ + return stbtt_FindMatchingFont_internal((unsigned char *)fontdata, (char *)name, flags); +} +#endif +#ifdef STBTT_STREAM_TYPE +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, STBTT_STREAM_TYPE s2, stbtt_uint32 s2offs, + int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, s2, s2offs, len2); +} +#else +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char * s1, int len1, const char * s2, stbtt_uint32 s2offs, + int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *)s1, len1, (char *)s2, s2offs, len2); +} +#endif + +#if defined(__GNUC__) || defined(__clang__) + #pragma GCC diagnostic pop + #pragma GCC diagnostic pop +#endif + +#endif // STB_TRUETYPE_IMPLEMENTATION + +// FULL VERSION HISTORY +// +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) allow user-defined fabs() replacement +// fix memory leak if fontsize=0.0 +// fix warning from duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// allow PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) +// also more precise AA rasterizer, except if shapes overlap +// remove need for STBTT_sort +// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC +// 1.04 (2015-04-15) typo in example +// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes +// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ +// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match +// non-oversampled; STBTT_POINT_SIZE for packed case only +// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling +// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) +// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID +// 0.8b (2014-07-07) fix a warning +// 0.8 (2014-05-25) fix a few more warnings +// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back +// 0.6c (2012-07-24) improve documentation +// 0.6b (2012-07-20) fix a few more warnings +// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, +// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b (2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (stb) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/inc/lvgl/src/libs/tjpgd/LICENSE.txt b/inc/lvgl/src/libs/tjpgd/LICENSE.txt new file mode 100644 index 0000000..b910bf4 --- /dev/null +++ b/inc/lvgl/src/libs/tjpgd/LICENSE.txt @@ -0,0 +1,15 @@ +/*----------------------------------------------------------------------------/ +/ TJpgDec - Tiny JPEG Decompressor R0.03 (C)ChaN, 2021 +/-----------------------------------------------------------------------------/ +/ The TJpgDec is a generic JPEG decompressor module for tiny embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following terms. +/ +/ Copyright (C) 2021, ChaN, all right reserved. +/ +/ * The TJpgDec module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ diff --git a/inc/lvgl/src/libs/tjpgd/lv_tjpgd.c b/inc/lvgl/src/libs/tjpgd/lv_tjpgd.c new file mode 100644 index 0000000..7872ea1 --- /dev/null +++ b/inc/lvgl/src/libs/tjpgd/lv_tjpgd.c @@ -0,0 +1,309 @@ +/** + * @file lv_tjpgd.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../draw/lv_image_decoder_private.h" +#include "../../../lvgl.h" +#if LV_USE_TJPGD + +#include "tjpgd.h" +#include "lv_tjpgd.h" +#include "../../misc/lv_fs_private.h" +#include + +/********************* + * DEFINES + *********************/ + +#define DECODER_NAME "TJPGD" + +#define TJPGD_WORKBUFF_SIZE 4096 //Recommended by TJPGD library + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header); +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); + +static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area); +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); +static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata); +static int is_jpg(const uint8_t * raw_data, size_t len); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_tjpgd_init(void) +{ + lv_image_decoder_t * dec = lv_image_decoder_create(); + lv_image_decoder_set_info_cb(dec, decoder_info); + lv_image_decoder_set_open_cb(dec, decoder_open); + lv_image_decoder_set_get_area_cb(dec, decoder_get_area); + lv_image_decoder_set_close_cb(dec, decoder_close); + + dec->name = DECODER_NAME; +} + +void lv_tjpgd_deinit(void) +{ + lv_image_decoder_t * dec = NULL; + while((dec = lv_image_decoder_get_next(dec)) != NULL) { + if(dec->info_cb == decoder_info) { + lv_image_decoder_delete(dec); + break; + } + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t decoder_info(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, lv_image_header_t * header) +{ + LV_UNUSED(decoder); + + const void * src = dsc->src; + lv_image_src_t src_type = dsc->src_type; + + if(src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = src; + uint8_t * raw_data = (uint8_t *)img_dsc->data; + const uint32_t raw_data_size = img_dsc->data_size; + + if(is_jpg(raw_data, raw_data_size) == true) { +#if LV_USE_FS_MEMFS + header->cf = LV_COLOR_FORMAT_RAW; + header->w = img_dsc->header.w; + header->h = img_dsc->header.h; + header->stride = img_dsc->header.w * 3; + return LV_RESULT_OK; +#else + LV_LOG_WARN("LV_USE_FS_MEMFS needs to enabled to decode from data"); + return LV_RESULT_INVALID; +#endif + } + } + else if(src_type == LV_IMAGE_SRC_FILE) { + const char * fn = src; + const char * ext = lv_fs_get_ext(fn); + if((lv_strcmp(ext, "jpg") == 0) || (lv_strcmp(ext, "jpeg") == 0)) { + uint8_t workb[TJPGD_WORKBUFF_SIZE]; + JDEC jd; + JRESULT rc = jd_prepare(&jd, input_func, workb, TJPGD_WORKBUFF_SIZE, &dsc->file); + if(rc) { + LV_LOG_WARN("jd_prepare error: %d", rc); + return LV_RESULT_INVALID; + } + header->cf = LV_COLOR_FORMAT_RAW; + header->w = jd.width; + header->h = jd.height; + header->stride = jd.width * 3; + + return LV_RESULT_OK; + } + } + return LV_RESULT_INVALID; +} + +static size_t input_func(JDEC * jd, uint8_t * buff, size_t ndata) +{ + lv_fs_file_t * f = jd->device; + if(!f) return 0; + + if(buff) { + uint32_t rn = 0; + lv_fs_read(f, buff, (uint32_t)ndata, &rn); + return rn; + } + else { + uint32_t pos; + lv_fs_tell(f, &pos); + lv_fs_seek(f, (uint32_t)(ndata + pos), LV_FS_SEEK_SET); + return ndata; + } + return 0; +} + +/** + * Decode a JPG image and return the decoded data. + * @param decoder pointer to the decoder + * @param dsc pointer to the decoder descriptor + * @return LV_RESULT_OK: no error; LV_RESULT_INVALID: can't open the image + */ +static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + lv_fs_file_t * f = NULL; + if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) { +#if LV_USE_FS_MEMFS + const lv_image_dsc_t * img_dsc = dsc->src; + if(is_jpg(img_dsc->data, img_dsc->data_size) == true) { + f = lv_malloc(sizeof(lv_fs_file_t)); + if(f == NULL) return LV_RESULT_INVALID; + lv_fs_path_ex_t path; + lv_fs_make_path_from_buffer(&path, LV_FS_MEMFS_LETTER, img_dsc->data, img_dsc->data_size, "bin"); + lv_fs_res_t res; + res = lv_fs_open(f, (const char *)&path, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + lv_free(f); + return LV_RESULT_INVALID; + } + } +#else + LV_LOG_WARN("LV_USE_FS_MEMFS needs to enabled to decode from data"); +#endif + } + else if(dsc->src_type == LV_IMAGE_SRC_FILE) { + const char * fn = dsc->src; + if((lv_strcmp(lv_fs_get_ext(fn), "jpg") == 0) || (lv_strcmp(lv_fs_get_ext(fn), "jpeg") == 0)) { + f = lv_malloc(sizeof(lv_fs_file_t)); + if(f == NULL) return LV_RESULT_INVALID; + lv_fs_res_t res; + res = lv_fs_open(f, fn, LV_FS_MODE_RD); + if(res != LV_FS_RES_OK) { + lv_free(f); + return LV_RESULT_INVALID; + } + } + } + if(f == NULL) return LV_RESULT_INVALID; + + uint8_t * workb_temp = lv_malloc(TJPGD_WORKBUFF_SIZE); + JDEC * jd = lv_malloc(sizeof(JDEC)); + JRESULT rc = JDR_MEM1; + + if(workb_temp != NULL && jd != NULL) + rc = jd_prepare(jd, input_func, workb_temp, (size_t)TJPGD_WORKBUFF_SIZE, f); + + if(rc != JDR_OK) { + lv_fs_close(f); + lv_free(f); + lv_free(workb_temp); + lv_free(jd); + return LV_RESULT_INVALID; + } + + dsc->user_data = jd; + dsc->header.cf = LV_COLOR_FORMAT_RGB888; + dsc->header.w = jd->width; + dsc->header.h = jd->height; + dsc->header.stride = jd->width * 3; + + return LV_RESULT_OK; +} + +static lv_result_t decoder_get_area(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, + const lv_area_t * full_area, lv_area_t * decoded_area) +{ + LV_UNUSED(decoder); + LV_UNUSED(full_area); + + JDEC * jd = dsc->user_data; + lv_draw_buf_t * decoded = (void *)dsc->decoded; + + uint32_t mx, my; + mx = jd->msx * 8; + my = jd->msy * 8; /* Size of the MCU (pixel) */ + if(decoded_area->y1 == LV_COORD_MIN) { + decoded_area->y1 = 0; + decoded_area->y2 = my - 1; + decoded_area->x1 = -((int32_t)mx); + decoded_area->x2 = -1; + jd->scale = 0; + jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Initialize DC values */ + jd->rst = 0; + jd->rsc = 0; + if(decoded == NULL) { + decoded = lv_malloc_zeroed(sizeof(lv_draw_buf_t)); + dsc->decoded = decoded; + } + else { + lv_fs_seek(jd->device, 0, LV_FS_SEEK_SET); + JRESULT rc = jd_prepare(jd, input_func, jd->pool_original, (size_t)TJPGD_WORKBUFF_SIZE, jd->device); + if(rc) return LV_RESULT_INVALID; + } + decoded->data = jd->workbuf; + decoded->header = dsc->header; + } + + decoded_area->x1 += mx; + decoded_area->x2 += mx; + + if(decoded_area->x1 >= jd->width) { + decoded_area->x1 = 0; + decoded_area->x2 = mx - 1; + decoded_area->y1 += my; + decoded_area->y2 += my; + } + + if(decoded_area->x2 >= jd->width) decoded_area->x2 = jd->width - 1; + if(decoded_area->y2 >= jd->height) decoded_area->y2 = jd->height - 1; + + decoded->header.w = lv_area_get_width(decoded_area); + decoded->header.h = lv_area_get_height(decoded_area); + decoded->header.stride = decoded->header.w * 3; + decoded->data_size = decoded->header.stride * decoded->header.h; + + /* Process restart interval if enabled */ + JRESULT rc; + if(jd->nrst && jd->rst++ == jd->nrst) { + rc = jd_restart(jd, jd->rsc++); + if(rc != JDR_OK) return LV_RESULT_INVALID; + jd->rst = 1; + } + + /* Load an MCU (decompress huffman coded stream, dequantize and apply IDCT) */ + rc = jd_mcu_load(jd); + if(rc != JDR_OK) return LV_RESULT_INVALID; + + /* Output the MCU (YCbCr to RGB, scaling and output) */ + rc = jd_mcu_output(jd, NULL, decoded_area->x1, decoded_area->y1); + if(rc != JDR_OK) return LV_RESULT_INVALID; + + return LV_RESULT_OK; +} + +/** + * Free the allocated resources + * @param decoder pointer to the decoder where this function belongs + * @param dsc pointer to a descriptor which describes this decoding session + */ +static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc) +{ + LV_UNUSED(decoder); + JDEC * jd = dsc->user_data; + lv_fs_close(jd->device); + lv_free(jd->device); + lv_free(jd->pool_original); + lv_free(jd); + lv_free((void *)dsc->decoded); +} + +static int is_jpg(const uint8_t * raw_data, size_t len) +{ + const uint8_t jpg_signature[] = {0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46}; + if(len < sizeof(jpg_signature)) return false; + return memcmp(jpg_signature, raw_data, sizeof(jpg_signature)) == 0; +} + +#endif /*LV_USE_TJPGD*/ diff --git a/inc/lvgl/src/libs/tjpgd/lv_tjpgd.h b/inc/lvgl/src/libs/tjpgd/lv_tjpgd.h new file mode 100644 index 0000000..ec35800 --- /dev/null +++ b/inc/lvgl/src/libs/tjpgd/lv_tjpgd.h @@ -0,0 +1,45 @@ +/** + * @file lv_tjpgd.h + * + */ + +#ifndef LV_TJPGD_H +#define LV_TJPGD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#if LV_USE_TJPGD + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_tjpgd_init(void); + +void lv_tjpgd_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TJPGD*/ + +#ifdef __cplusplus +} +#endif + +#endif /* LV_TJPGD_H */ diff --git a/inc/lvgl/src/libs/tjpgd/tjpgd.c b/inc/lvgl/src/libs/tjpgd/tjpgd.c new file mode 100644 index 0000000..7152adf --- /dev/null +++ b/inc/lvgl/src/libs/tjpgd/tjpgd.c @@ -0,0 +1,1139 @@ +/*----------------------------------------------------------------------------/ +/ TJpgDec - Tiny JPEG Decompressor R0.03 (C)ChaN, 2021 +/-----------------------------------------------------------------------------/ +/ The TJpgDec is a generic JPEG decompressor module for tiny embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following terms. +/ +/ Copyright (C) 2021, ChaN, all right reserved. +/ +/ * The TJpgDec module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ +/ Oct 04, 2011 R0.01 First release. +/ Feb 19, 2012 R0.01a Fixed decompression fails when scan starts with an escape seq. +/ Sep 03, 2012 R0.01b Added JD_TBLCLIP option. +/ Mar 16, 2019 R0.01c Supported stdint.h. +/ Jul 01, 2020 R0.01d Fixed wrong integer type usage. +/ May 08, 2021 R0.02 Supported grayscale image. Separated configuration options. +/ Jun 11, 2021 R0.02a Some performance improvement. +/ Jul 01, 2021 R0.03 Added JD_FASTDECODE option. +/ Some performance improvement. +/----------------------------------------------------------------------------*/ + +#include "tjpgd.h" + +#if LV_USE_TJPGD + +#if JD_FASTDECODE == 2 + #define HUFF_BIT 10 /* Bit length to apply fast huffman decode */ + #define HUFF_LEN (1 << HUFF_BIT) + #define HUFF_MASK (HUFF_LEN - 1) +#endif + + +/*-----------------------------------------------*/ +/* Zigzag-order to raster-order conversion table */ +/*-----------------------------------------------*/ + +static const uint8_t Zig[64] = { /* Zigzag-order to raster-order conversion table */ + 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 +}; + + + +/*-------------------------------------------------*/ +/* Input scale factor of Arai algorithm */ +/* (scaled up 16 bits for fixed point operations) */ +/*-------------------------------------------------*/ + +static const uint16_t Ipsf[64] = { /* See also aa_idct.png */ + (uint16_t)(1.00000 * 8192), (uint16_t)(1.38704 * 8192), (uint16_t)(1.30656 * 8192), (uint16_t)(1.17588 * 8192), (uint16_t)(1.00000 * 8192), (uint16_t)(0.78570 * 8192), (uint16_t)(0.54120 * 8192), (uint16_t)(0.27590 * 8192), + (uint16_t)(1.38704 * 8192), (uint16_t)(1.92388 * 8192), (uint16_t)(1.81226 * 8192), (uint16_t)(1.63099 * 8192), (uint16_t)(1.38704 * 8192), (uint16_t)(1.08979 * 8192), (uint16_t)(0.75066 * 8192), (uint16_t)(0.38268 * 8192), + (uint16_t)(1.30656 * 8192), (uint16_t)(1.81226 * 8192), (uint16_t)(1.70711 * 8192), (uint16_t)(1.53636 * 8192), (uint16_t)(1.30656 * 8192), (uint16_t)(1.02656 * 8192), (uint16_t)(0.70711 * 8192), (uint16_t)(0.36048 * 8192), + (uint16_t)(1.17588 * 8192), (uint16_t)(1.63099 * 8192), (uint16_t)(1.53636 * 8192), (uint16_t)(1.38268 * 8192), (uint16_t)(1.17588 * 8192), (uint16_t)(0.92388 * 8192), (uint16_t)(0.63638 * 8192), (uint16_t)(0.32442 * 8192), + (uint16_t)(1.00000 * 8192), (uint16_t)(1.38704 * 8192), (uint16_t)(1.30656 * 8192), (uint16_t)(1.17588 * 8192), (uint16_t)(1.00000 * 8192), (uint16_t)(0.78570 * 8192), (uint16_t)(0.54120 * 8192), (uint16_t)(0.27590 * 8192), + (uint16_t)(0.78570 * 8192), (uint16_t)(1.08979 * 8192), (uint16_t)(1.02656 * 8192), (uint16_t)(0.92388 * 8192), (uint16_t)(0.78570 * 8192), (uint16_t)(0.61732 * 8192), (uint16_t)(0.42522 * 8192), (uint16_t)(0.21677 * 8192), + (uint16_t)(0.54120 * 8192), (uint16_t)(0.75066 * 8192), (uint16_t)(0.70711 * 8192), (uint16_t)(0.63638 * 8192), (uint16_t)(0.54120 * 8192), (uint16_t)(0.42522 * 8192), (uint16_t)(0.29290 * 8192), (uint16_t)(0.14932 * 8192), + (uint16_t)(0.27590 * 8192), (uint16_t)(0.38268 * 8192), (uint16_t)(0.36048 * 8192), (uint16_t)(0.32442 * 8192), (uint16_t)(0.27590 * 8192), (uint16_t)(0.21678 * 8192), (uint16_t)(0.14932 * 8192), (uint16_t)(0.07612 * 8192) +}; + + + +/*---------------------------------------------*/ +/* Conversion table for fast clipping process */ +/*---------------------------------------------*/ + +#if JD_TBLCLIP + +#define BYTECLIP(v) Clip8[(unsigned int)(v) & 0x3FF] + +static const uint8_t Clip8[1024] = { + /* 0..255 */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + /* 256..511 */ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* -512..-257 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* -256..-1 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +#else /* JD_TBLCLIP */ + +static uint8_t BYTECLIP(int val) +{ + if(val < 0) return 0; + if(val > 255) return 255; + return (uint8_t)val; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Allocate a memory block from memory pool */ +/*-----------------------------------------------------------------------*/ + +static void * alloc_pool( /* Pointer to allocated memory block (NULL:no memory available) */ + JDEC * jd, /* Pointer to the decompressor object */ + size_t ndata /* Number of bytes to allocate */ +) +{ + char * rp = 0; + + + ndata = (ndata + 3) & ~3; /* Align block size to the word boundary */ + + if(jd->sz_pool >= ndata) { + jd->sz_pool -= ndata; + rp = (char *)jd->pool; /* Get start of available memory pool */ + jd->pool = (void *)(rp + ndata); /* Allocate required bytes */ + } + + return (void *)rp; /* Return allocated memory block (NULL:no memory to allocate) */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create de-quantization and prescaling tables with a DQT segment */ +/*-----------------------------------------------------------------------*/ + +static JRESULT create_qt_tbl( /* 0:OK, !0:Failed */ + JDEC * jd, /* Pointer to the decompressor object */ + const uint8_t * data, /* Pointer to the quantizer tables */ + size_t ndata /* Size of input data */ +) +{ + unsigned int i, zi; + uint8_t d; + int32_t * pb; + + + while(ndata) { /* Process all tables in the segment */ + if(ndata < 65) return JDR_FMT1; /* Err: table size is unaligned */ + ndata -= 65; + d = *data++; /* Get table property */ + if(d & 0xF0) return JDR_FMT1; /* Err: not 8-bit resolution */ + i = d & 3; /* Get table ID */ + pb = alloc_pool(jd, 64 * sizeof(int32_t)); /* Allocate a memory block for the table */ + if(!pb) return JDR_MEM1; /* Err: not enough memory */ + jd->qttbl[i] = pb; /* Register the table */ + for(i = 0; i < 64; i++) { /* Load the table */ + zi = Zig[i]; /* Zigzag-order to raster-order conversion */ + pb[zi] = (int32_t)((uint32_t) * data++ * Ipsf[zi]); /* Apply scale factor of Arai algorithm to the de-quantizers */ + } + } + + return JDR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create huffman code tables with a DHT segment */ +/*-----------------------------------------------------------------------*/ + +static JRESULT create_huffman_tbl( /* 0:OK, !0:Failed */ + JDEC * jd, /* Pointer to the decompressor object */ + const uint8_t * data, /* Pointer to the packed huffman tables */ + size_t ndata /* Size of input data */ +) +{ + unsigned int i, j, b, cls, num; + size_t np; + uint8_t d, * pb, * pd; + uint16_t hc, * ph; + + + while(ndata) { /* Process all tables in the segment */ + if(ndata < 17) return JDR_FMT1; /* Err: wrong data size */ + ndata -= 17; + d = *data++; /* Get table number and class */ + if(d & 0xEE) return JDR_FMT1; /* Err: invalid class/number */ + cls = d >> 4; + num = d & 0x0F; /* class = dc(0)/ac(1), table number = 0/1 */ + pb = alloc_pool(jd, 16); /* Allocate a memory block for the bit distribution table */ + if(!pb) return JDR_MEM1; /* Err: not enough memory */ + jd->huffbits[num][cls] = pb; + for(np = i = 0; i < 16; i++) { /* Load number of patterns for 1 to 16-bit code */ + np += (pb[i] = *data++); /* Get sum of code words for each code */ + } + ph = alloc_pool(jd, np * sizeof(uint16_t)); /* Allocate a memory block for the code word table */ + if(!ph) return JDR_MEM1; /* Err: not enough memory */ + jd->huffcode[num][cls] = ph; + hc = 0; + for(j = i = 0; i < 16; i++) { /* Re-build huffman code word table */ + b = pb[i]; + while(b--) ph[j++] = hc++; + hc <<= 1; + } + + if(ndata < np) return JDR_FMT1; /* Err: wrong data size */ + ndata -= np; + pd = alloc_pool(jd, np); /* Allocate a memory block for the decoded data */ + if(!pd) return JDR_MEM1; /* Err: not enough memory */ + jd->huffdata[num][cls] = pd; + for(i = 0; i < np; i++) { /* Load decoded data corresponds to each code word */ + d = *data++; + if(!cls && d > 11) return JDR_FMT1; + pd[i] = d; + } +#if JD_FASTDECODE == 2 + { /* Create fast huffman decode table */ + unsigned int span, td, ti; + uint16_t * tbl_ac = 0; + uint8_t * tbl_dc = 0; + + if(cls) { + tbl_ac = alloc_pool(jd, HUFF_LEN * sizeof(uint16_t)); /* LUT for AC elements */ + if(!tbl_ac) return JDR_MEM1; /* Err: not enough memory */ + jd->hufflut_ac[num] = tbl_ac; + memset(tbl_ac, 0xFF, HUFF_LEN * sizeof(uint16_t)); /* Default value (0xFFFF: may be long code) */ + } + else { + tbl_dc = alloc_pool(jd, HUFF_LEN * sizeof(uint8_t)); /* LUT for AC elements */ + if(!tbl_dc) return JDR_MEM1; /* Err: not enough memory */ + jd->hufflut_dc[num] = tbl_dc; + memset(tbl_dc, 0xFF, HUFF_LEN * sizeof(uint8_t)); /* Default value (0xFF: may be long code) */ + } + for(i = b = 0; b < HUFF_BIT; b++) { /* Create LUT */ + for(j = pb[b]; j; j--) { + ti = ph[i] << (HUFF_BIT - 1 - b) & HUFF_MASK; /* Index of input pattern for the code */ + if(cls) { + td = pd[i++] | ((b + 1) << 8); /* b15..b8: code length, b7..b0: zero run and data length */ + for(span = 1 << (HUFF_BIT - 1 - b); span; span--, tbl_ac[ti++] = (uint16_t)td) ; + } + else { + td = pd[i++] | ((b + 1) << 4); /* b7..b4: code length, b3..b0: data length */ + for(span = 1 << (HUFF_BIT - 1 - b); span; span--, tbl_dc[ti++] = (uint8_t)td) ; + } + } + } + jd->longofs[num][cls] = i; /* Code table offset for long code */ + } +#endif + } + + return JDR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Extract a huffman decoded data from input stream */ +/*-----------------------------------------------------------------------*/ + +static int huffext( /* >=0: decoded data, <0: error code */ + JDEC * jd, /* Pointer to the decompressor object */ + unsigned int id, /* Table ID (0:Y, 1:C) */ + unsigned int cls /* Table class (0:DC, 1:AC) */ +) +{ + size_t dc = jd->dctr; + uint8_t * dp = jd->dptr; + unsigned int d, flg = 0; + +#if JD_FASTDECODE == 0 + uint8_t bm, nd, bl; + const uint8_t * hb = jd->huffbits[id][cls]; /* Bit distribution table */ + const uint16_t * hc = jd->huffcode[id][cls]; /* Code word table */ + const uint8_t * hd = jd->huffdata[id][cls]; /* Data table */ + + + bm = jd->dbit; /* Bit mask to extract */ + d = 0; + bl = 16; /* Max code length */ + do { + if(!bm) { /* Next byte? */ + if(!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + else { + dp++; /* Next data ptr */ + } + dc--; /* Decrement number of available bytes */ + if(flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if(*dp != 0) return 0 - (int)JDR_FMT1; /* Err: unexpected flag is detected (may be corrupted data) */ + *dp = 0xFF; /* The flag is a data 0xFF */ + } + else { + if(*dp == 0xFF) { /* Is start of flag sequence? */ + flg = 1; + continue; /* Enter flag sequence, get trailing byte */ + } + } + bm = 0x80; /* Read from MSB */ + } + d <<= 1; /* Get a bit */ + if(*dp & bm) d++; + bm >>= 1; + + for(nd = *hb++; nd; nd--) { /* Search the code word in this bit length */ + if(d == *hc++) { /* Matched? */ + jd->dbit = bm; + jd->dctr = dc; + jd->dptr = dp; + return *hd; /* Return the decoded data */ + } + hd++; + } + bl--; + } while(bl); + +#else + const uint8_t * hb, * hd; + const uint16_t * hc; + unsigned int nc, bl, wbit = jd->dbit % 32; + uint32_t w = jd->wreg & ((1UL << wbit) - 1); + + + while(wbit < 16) { /* Prepare 16 bits into the working register */ + if(jd->marker) { + d = 0xFF; /* Input stream has stalled for a marker. Generate stuff bits */ + } + else { + if(!dc) { /* Buffer empty, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + d = *dp++; + dc--; + if(flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if(d != 0) jd->marker = d; /* Not an escape of 0xFF but a marker */ + d = 0xFF; + } + else { + if(d == 0xFF) { /* Is start of flag sequence? */ + flg = 1; + continue; /* Enter flag sequence, get trailing byte */ + } + } + } + w = w << 8 | d; /* Shift 8 bits in the working register */ + wbit += 8; + } + jd->dctr = dc; + jd->dptr = dp; + jd->wreg = w; + +#if JD_FASTDECODE == 2 + /* Table search for the short codes */ + d = (unsigned int)(w >> (wbit - HUFF_BIT)); /* Short code as table index */ + if(cls) { /* AC element */ + d = jd->hufflut_ac[id][d]; /* Table decode */ + if(d != 0xFFFF) { /* It is done if hit in short code */ + jd->dbit = wbit - (d >> 8); /* Snip the code length */ + return d & 0xFF; /* b7..0: zero run and following data bits */ + } + } + else { /* DC element */ + d = jd->hufflut_dc[id][d]; /* Table decode */ + if(d != 0xFF) { /* It is done if hit in short code */ + jd->dbit = wbit - (d >> 4); /* Snip the code length */ + return d & 0xF; /* b3..0: following data bits */ + } + } + + /* Incremental search for the codes longer than HUFF_BIT */ + hb = jd->huffbits[id][cls] + HUFF_BIT; /* Bit distribution table */ + hc = jd->huffcode[id][cls] + jd->longofs[id][cls]; /* Code word table */ + hd = jd->huffdata[id][cls] + jd->longofs[id][cls]; /* Data table */ + bl = HUFF_BIT + 1; +#else + /* Incremental search for all codes */ + hb = jd->huffbits[id][cls]; /* Bit distribution table */ + hc = jd->huffcode[id][cls]; /* Code word table */ + hd = jd->huffdata[id][cls]; /* Data table */ + bl = 1; +#endif + for(; bl <= 16; bl++) { /* Incremental search */ + nc = *hb++; + if(nc) { + d = w >> (wbit - bl); + do { /* Search the code word in this bit length */ + if(d == *hc++) { /* Matched? */ + jd->dbit = wbit - bl; /* Snip the huffman code */ + return *hd; /* Return the decoded data */ + } + hd++; + } while(--nc); + } + } +#endif + + return 0 - (int)JDR_FMT1; /* Err: code not found (may be corrupted data) */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Extract N bits from input stream */ +/*-----------------------------------------------------------------------*/ + +static int bitext( /* >=0: extracted data, <0: error code */ + JDEC * jd, /* Pointer to the decompressor object */ + unsigned int nbit /* Number of bits to extract (1 to 16) */ +) +{ + size_t dc = jd->dctr; + uint8_t * dp = jd->dptr; + unsigned int d, flg = 0; + +#if JD_FASTDECODE == 0 + uint8_t mbit = jd->dbit; + + d = 0; + do { + if(!mbit) { /* Next byte? */ + if(!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + else { + dp++; /* Next data ptr */ + } + dc--; /* Decrement number of available bytes */ + if(flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if(*dp != 0) return 0 - (int)JDR_FMT1; /* Err: unexpected flag is detected (may be corrupted data) */ + *dp = 0xFF; /* The flag is a data 0xFF */ + } + else { + if(*dp == 0xFF) { /* Is start of flag sequence? */ + flg = 1; + continue; /* Enter flag sequence */ + } + } + mbit = 0x80; /* Read from MSB */ + } + d <<= 1; /* Get a bit */ + if(*dp & mbit) d |= 1; + mbit >>= 1; + nbit--; + } while(nbit); + + jd->dbit = mbit; + jd->dctr = dc; + jd->dptr = dp; + return (int)d; + +#else + unsigned int wbit = jd->dbit % 32; + uint32_t w = jd->wreg & ((1UL << wbit) - 1); + + + while(wbit < nbit) { /* Prepare nbit bits into the working register */ + if(jd->marker) { + d = 0xFF; /* Input stream stalled, generate stuff bits */ + } + else { + if(!dc) { /* Buffer empty, re-fill input buffer */ + dp = jd->inbuf; /* Top of input buffer */ + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return 0 - (int)JDR_INP; /* Err: read error or wrong stream termination */ + } + d = *dp++; + dc--; + if(flg) { /* In flag sequence? */ + flg = 0; /* Exit flag sequence */ + if(d != 0) jd->marker = d; /* Not an escape of 0xFF but a marker */ + d = 0xFF; + } + else { + if(d == 0xFF) { /* Is start of flag sequence? */ + flg = 1; + continue; /* Enter flag sequence, get trailing byte */ + } + } + } + w = w << 8 | d; /* Get 8 bits into the working register */ + wbit += 8; + } + jd->wreg = w; + jd->dbit = wbit - nbit; + jd->dctr = dc; + jd->dptr = dp; + + return (int)(w >> ((wbit - nbit) % 32)); +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Process restart interval */ +/*-----------------------------------------------------------------------*/ + +JRESULT jd_restart( + JDEC * jd, /* Pointer to the decompressor object */ + uint16_t rstn /* Expected restart sequence number */ +) +{ + unsigned int i; + uint8_t * dp = jd->dptr; + size_t dc = jd->dctr; + +#if JD_FASTDECODE == 0 + uint16_t d = 0; + + /* Get two bytes from the input stream */ + for(i = 0; i < 2; i++) { + if(!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return JDR_INP; + } + else { + dp++; + } + dc--; + d = d << 8 | *dp; /* Get a byte */ + } + jd->dptr = dp; + jd->dctr = dc; + jd->dbit = 0; + + /* Check the marker */ + if((d & 0xFFD8) != 0xFFD0 || (d & 7) != (rstn & 7)) { + return JDR_FMT1; /* Err: expected RSTn marker is not detected (may be corrupted data) */ + } + +#else + uint16_t marker; + + + if(jd->marker) { /* Generate a maker if it has been detected */ + marker = 0xFF00 | jd->marker; + jd->marker = 0; + } + else { + marker = 0; + for(i = 0; i < 2; i++) { /* Get a restart marker */ + if(!dc) { /* No input data is available, re-fill input buffer */ + dp = jd->inbuf; + dc = jd->infunc(jd, dp, JD_SZBUF); + if(!dc) return JDR_INP; + } + marker = (marker << 8) | *dp++; /* Get a byte */ + dc--; + } + jd->dptr = dp; + jd->dctr = dc; + } + + /* Check the marker */ + if((marker & 0xFFD8) != 0xFFD0 || (marker & 7) != (rstn & 7)) { + return JDR_FMT1; /* Err: expected RSTn marker was not detected (may be corrupted data) */ + } + + jd->dbit = 0; /* Discard stuff bits */ +#endif + + jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Reset DC offset */ + return JDR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Apply Inverse-DCT in Arai Algorithm (see also aa_idct.png) */ +/*-----------------------------------------------------------------------*/ + +static void block_idct( + int32_t * src, /* Input block data (de-quantized and pre-scaled for Arai Algorithm) */ + jd_yuv_t * dst /* Pointer to the destination to store the block as byte array */ +) +{ + const int32_t M13 = (int32_t)(1.41421 * 4096), M2 = (int32_t)(1.08239 * 4096), M4 = (int32_t)(2.61313 * 4096), + M5 = (int32_t)(1.84776 * 4096); + int32_t v0, v1, v2, v3, v4, v5, v6, v7; + int32_t t10, t11, t12, t13; + int i; + + /* Process columns */ + for(i = 0; i < 8; i++) { + v0 = src[8 * 0]; /* Get even elements */ + v1 = src[8 * 2]; + v2 = src[8 * 4]; + v3 = src[8 * 6]; + + t10 = v0 + v2; /* Process the even elements */ + t12 = v0 - v2; + t11 = (v1 - v3) * M13 >> 12; + v3 += v1; + t11 -= v3; + v0 = t10 + v3; + v3 = t10 - v3; + v1 = t11 + t12; + v2 = t12 - t11; + + v4 = src[8 * 7]; /* Get odd elements */ + v5 = src[8 * 1]; + v6 = src[8 * 5]; + v7 = src[8 * 3]; + + t10 = v5 - v4; /* Process the odd elements */ + t11 = v5 + v4; + t12 = v6 - v7; + v7 += v6; + v5 = (t11 - v7) * M13 >> 12; + v7 += t11; + t13 = (t10 + t12) * M5 >> 12; + v4 = t13 - (t10 * M2 >> 12); + v6 = t13 - (t12 * M4 >> 12) - v7; + v5 -= v6; + v4 -= v5; + + src[8 * 0] = v0 + v7; /* Write-back transformed values */ + src[8 * 7] = v0 - v7; + src[8 * 1] = v1 + v6; + src[8 * 6] = v1 - v6; + src[8 * 2] = v2 + v5; + src[8 * 5] = v2 - v5; + src[8 * 3] = v3 + v4; + src[8 * 4] = v3 - v4; + + src++; /* Next column */ + } + + /* Process rows */ + src -= 8; + for(i = 0; i < 8; i++) { + v0 = src[0] + (128L << 8); /* Get even elements (remove DC offset (-128) here) */ + v1 = src[2]; + v2 = src[4]; + v3 = src[6]; + + t10 = v0 + v2; /* Process the even elements */ + t12 = v0 - v2; + t11 = (v1 - v3) * M13 >> 12; + v3 += v1; + t11 -= v3; + v0 = t10 + v3; + v3 = t10 - v3; + v1 = t11 + t12; + v2 = t12 - t11; + + v4 = src[7]; /* Get odd elements */ + v5 = src[1]; + v6 = src[5]; + v7 = src[3]; + + t10 = v5 - v4; /* Process the odd elements */ + t11 = v5 + v4; + t12 = v6 - v7; + v7 += v6; + v5 = (t11 - v7) * M13 >> 12; + v7 += t11; + t13 = (t10 + t12) * M5 >> 12; + v4 = t13 - (t10 * M2 >> 12); + v6 = t13 - (t12 * M4 >> 12) - v7; + v5 -= v6; + v4 -= v5; + + /* Descale the transformed values 8 bits and output a row */ +#if JD_FASTDECODE >= 1 + dst[0] = (int16_t)((v0 + v7) >> 8); + dst[7] = (int16_t)((v0 - v7) >> 8); + dst[1] = (int16_t)((v1 + v6) >> 8); + dst[6] = (int16_t)((v1 - v6) >> 8); + dst[2] = (int16_t)((v2 + v5) >> 8); + dst[5] = (int16_t)((v2 - v5) >> 8); + dst[3] = (int16_t)((v3 + v4) >> 8); + dst[4] = (int16_t)((v3 - v4) >> 8); +#else + dst[0] = BYTECLIP((v0 + v7) >> 8); + dst[7] = BYTECLIP((v0 - v7) >> 8); + dst[1] = BYTECLIP((v1 + v6) >> 8); + dst[6] = BYTECLIP((v1 - v6) >> 8); + dst[2] = BYTECLIP((v2 + v5) >> 8); + dst[5] = BYTECLIP((v2 - v5) >> 8); + dst[3] = BYTECLIP((v3 + v4) >> 8); + dst[4] = BYTECLIP((v3 - v4) >> 8); +#endif + + dst += 8; + src += 8; /* Next row */ + } +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load all blocks in an MCU into working buffer */ +/*-----------------------------------------------------------------------*/ + +JRESULT jd_mcu_load( + JDEC * jd /* Pointer to the decompressor object */ +) +{ + int32_t * tmp = (int32_t *)jd->workbuf; /* Block working buffer for de-quantize and IDCT */ + int d, e; + unsigned int blk, nby, i, bc, z, id, cmp; + jd_yuv_t * bp; + const int32_t * dqf; + + + nby = jd->msx * jd->msy; /* Number of Y blocks (1, 2 or 4) */ + bp = jd->mcubuf; /* Pointer to the first block of MCU */ + + for(blk = 0; blk < nby + 2; blk++) { /* Get nby Y blocks and two C blocks */ + cmp = (blk < nby) ? 0 : blk - nby + 1; /* Component number 0:Y, 1:Cb, 2:Cr */ + + if(cmp && jd->ncomp != 3) { /* Clear C blocks if not exist (monochrome image) */ + for(i = 0; i < 64; bp[i++] = 128) ; + + } + else { /* Load Y/C blocks from input stream */ + id = cmp ? 1 : 0; /* Huffman table ID of this component */ + + /* Extract a DC element from input stream */ + d = huffext(jd, id, 0); /* Extract a huffman coded data (bit length) */ + if(d < 0) return (JRESULT)(0 - d); /* Err: invalid code or input */ + bc = (unsigned int)d; + d = jd->dcv[cmp]; /* DC value of previous block */ + if(bc) { /* If there is any difference from previous block */ + e = bitext(jd, bc); /* Extract data bits */ + if(e < 0) return (JRESULT)(0 - e); /* Err: input */ + bc = 1 << (bc - 1); /* MSB position */ + if(!(e & bc)) e -= (bc << 1) - 1; /* Restore negative value if needed */ + d += e; /* Get current value */ + jd->dcv[cmp] = (int16_t)d; /* Save current DC value for next block */ + } + dqf = jd->qttbl[jd->qtid[cmp]]; /* De-quantizer table ID for this component */ + tmp[0] = d * dqf[0] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ + + /* Extract following 63 AC elements from input stream */ + memset(&tmp[1], 0, 63 * sizeof(int32_t)); /* Initialize all AC elements */ + z = 1; /* Top of the AC elements (in zigzag-order) */ + do { + d = huffext(jd, id, 1); /* Extract a huffman coded value (zero runs and bit length) */ + if(d == 0) break; /* EOB? */ + if(d < 0) return (JRESULT)(0 - d); /* Err: invalid code or input error */ + bc = (unsigned int)d; + z += bc >> 4; /* Skip leading zero run */ + if(z >= 64) return JDR_FMT1; /* Too long zero run */ + if(bc &= 0x0F) { /* Bit length? */ + d = bitext(jd, bc); /* Extract data bits */ + if(d < 0) return (JRESULT)(0 - d); /* Err: input device */ + bc = 1 << (bc - 1); /* MSB position */ + if(!(d & bc)) d -= (bc << 1) - 1; /* Restore negative value if needed */ + i = Zig[z]; /* Get raster-order index */ + tmp[i] = d * dqf[i] >> 8; /* De-quantize, apply scale factor of Arai algorithm and descale 8 bits */ + } + } while(++z < 64); /* Next AC element */ + + if(JD_FORMAT != 2 || !cmp) { /* C components may not be processed if in grayscale output */ + if(z == 1 || (JD_USE_SCALE && + jd->scale == + 3)) { /* If no AC element or scale ratio is 1/8, IDCT can be omitted and the block is filled with DC value */ + d = (jd_yuv_t)((*tmp / 256) + 128); + if(JD_FASTDECODE >= 1) { + for(i = 0; i < 64; bp[i++] = d) ; + } + else { + memset(bp, d, 64); + } + } + else { + block_idct(tmp, bp); /* Apply IDCT and store the block to the MCU buffer */ + } + } + } + + bp += 64; /* Next block */ + } + + return JDR_OK; /* All blocks have been loaded successfully */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Output an MCU: Convert YCrCb to RGB and output it in RGB form */ +/*-----------------------------------------------------------------------*/ + +JRESULT jd_mcu_output( + JDEC * jd, /* Pointer to the decompressor object */ + int (*outfunc)(JDEC *, void *, JRECT *), /* RGB output function */ + unsigned int x, /* MCU location in the image */ + unsigned int y /* MCU location in the image */ +) +{ + const int CVACC = (sizeof(int) > 2) ? 1024 : 128; /* Adaptive accuracy for both 16-/32-bit systems */ + unsigned int ix, iy, mx, my, rx, ry; + int yy, cb, cr; + jd_yuv_t * py, * pc; + uint8_t * pix; + JRECT rect; + + + mx = jd->msx * 8; + my = jd->msy * 8; /* MCU size (pixel) */ + rx = (x + mx <= jd->width) ? mx : jd->width - + x; /* Output rectangular size (it may be clipped at right/bottom end of image) */ + ry = (y + my <= jd->height) ? my : jd->height - y; + if(JD_USE_SCALE) { + rx >>= jd->scale; + ry >>= jd->scale; + if(!rx || !ry) return JDR_OK; /* Skip this MCU if all pixel is to be rounded off */ + x >>= jd->scale; + y >>= jd->scale; + } + rect.left = x; + rect.right = x + rx - 1; /* Rectangular area in the frame buffer */ + rect.top = y; + rect.bottom = y + ry - 1; + + + if(!JD_USE_SCALE || jd->scale != 3) { /* Not for 1/8 scaling */ + pix = (uint8_t *)jd->workbuf; + + if(JD_FORMAT != 2) { /* RGB output (build an RGB MCU from Y/C component) */ + for(iy = 0; iy < my; iy++) { + pc = py = jd->mcubuf; + if(my == 16) { /* Double block height? */ + pc += 64 * 4 + (iy >> 1) * 8; + if(iy >= 8) py += 64; + } + else { /* Single block height */ + pc += mx * 8 + iy * 8; + } + py += iy * 8; + for(ix = 0; ix < mx; ix++) { + cb = pc[0] - 128; /* Get Cb/Cr component and remove offset */ + cr = pc[64] - 128; + if(mx == 16) { /* Double block width? */ + if(ix == 8) py += 64 - 8; /* Jump to next block if double block height */ + pc += ix & 1; /* Step forward chroma pointer every two pixels */ + } + else { /* Single block width */ + pc++; /* Step forward chroma pointer every pixel */ + } + yy = *py++; /* Get Y component */ + *pix++ = /*B*/ BYTECLIP(yy + ((int)(1.772 * CVACC) * cb) / CVACC); + *pix++ = /*G*/ BYTECLIP(yy - ((int)(0.344 * CVACC) * cb + (int)(0.714 * CVACC) * cr) / CVACC); + *pix++ = /*R*/ BYTECLIP(yy + ((int)(1.402 * CVACC) * cr) / CVACC); + } + } + } + } + + /* Squeeze up pixel table if a part of MCU is to be truncated */ + mx >>= jd->scale; + if(rx < mx) { /* Is the MCU spans right edge? */ + uint8_t * s, * d; + unsigned int xi, yi; + + s = d = (uint8_t *)jd->workbuf; + for(yi = 0; yi < ry; yi++) { + for(xi = 0; xi < rx; xi++) { /* Copy effective pixels */ + *d++ = *s++; + if(JD_FORMAT != 2) { + *d++ = *s++; + *d++ = *s++; + } + } + s += (mx - rx) * (JD_FORMAT != 2 ? 3 : 1); /* Skip truncated pixels */ + } + } + + /* Convert RGB888 to RGB565 if needed */ + if(JD_FORMAT == 1) { + uint8_t * s = (uint8_t *)jd->workbuf; + uint16_t w, * d = (uint16_t *)s; + unsigned int n = rx * ry; + + do { + w = (*s++ & 0xF8) << 8; /* RRRRR----------- */ + w |= (*s++ & 0xFC) << 3; /* -----GGGGGG----- */ + w |= *s++ >> 3; /* -----------BBBBB */ + *d++ = w; + } while(--n); + } + + /* Output the rectangular */ + if(outfunc) return outfunc(jd, jd->workbuf, &rect) ? JDR_OK : JDR_INTR; + return 0; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Analyze the JPEG image and Initialize decompressor object */ +/*-----------------------------------------------------------------------*/ + +#define LDB_WORD(ptr) (uint16_t)(((uint16_t)*((uint8_t*)(ptr))<<8)|(uint16_t)*(uint8_t*)((ptr)+1)) + + +JRESULT jd_prepare( + JDEC * jd, /* Blank decompressor object */ + size_t (*infunc)(JDEC *, uint8_t *, size_t), /* JPEG stream input function */ + void * pool, /* Working buffer for the decompression session */ + size_t sz_pool, /* Size of working buffer */ + void * dev /* I/O device identifier for the session */ +) +{ + uint8_t * seg, b; + uint16_t marker; + unsigned int n, i, ofs; + size_t len; + JRESULT rc; + + + memset(jd, 0, sizeof( + JDEC)); /* Clear decompression object (this might be a problem if machine's null pointer is not all bits zero) */ + jd->pool = pool; /* Work memory */ + jd->pool_original = pool; + jd->sz_pool = sz_pool; /* Size of given work memory */ + jd->infunc = infunc; /* Stream input function */ + jd->device = dev; /* I/O device identifier */ + + jd->inbuf = seg = alloc_pool(jd, JD_SZBUF); /* Allocate stream input buffer */ + if(!seg) return JDR_MEM1; + + ofs = marker = 0; /* Find SOI marker */ + do { + if(jd->infunc(jd, seg, 1) != 1) return JDR_INP; /* Err: SOI was not detected */ + ofs++; + marker = marker << 8 | seg[0]; + } while(marker != 0xFFD8); + + for(;;) { /* Parse JPEG segments */ + /* Get a JPEG marker */ + if(jd->infunc(jd, seg, 4) != 4) return JDR_INP; + marker = LDB_WORD(seg); /* Marker */ + len = LDB_WORD(seg + 2); /* Length field */ + if(len <= 2 || (marker >> 8) != 0xFF) return JDR_FMT1; + len -= 2; /* Segment content size */ + ofs += 4 + len; /* Number of bytes loaded */ + + switch(marker & 0xFF) { + case 0xC0: /* SOF0 (baseline JPEG) */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + jd->width = LDB_WORD(&seg[3]); /* Image width in unit of pixel */ + jd->height = LDB_WORD(&seg[1]); /* Image height in unit of pixel */ + jd->ncomp = seg[5]; /* Number of color components */ + if(jd->ncomp != 3 && jd->ncomp != 1) return JDR_FMT3; /* Err: Supports only Grayscale and Y/Cb/Cr */ + + /* Check each image component */ + for(i = 0; i < jd->ncomp; i++) { + b = seg[7 + 3 * i]; /* Get sampling factor */ + if(i == 0) { /* Y component */ + if(b != 0x11 && b != 0x22 && b != 0x21) { /* Check sampling factor */ + return JDR_FMT3; /* Err: Supports only 4:4:4, 4:2:0 or 4:2:2 */ + } + jd->msx = b >> 4; + jd->msy = b & 15; /* Size of MCU [blocks] */ + } + else { /* Cb/Cr component */ + if(b != 0x11) return JDR_FMT3; /* Err: Sampling factor of Cb/Cr must be 1 */ + } + jd->qtid[i] = seg[8 + 3 * i]; /* Get dequantizer table ID for this component */ + if(jd->qtid[i] > 3) return JDR_FMT3; /* Err: Invalid ID */ + } + break; + + case 0xDD: /* DRI - Define Restart Interval */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + jd->nrst = LDB_WORD(seg); /* Get restart interval (MCUs) */ + break; + + case 0xC4: /* DHT - Define Huffman Tables */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + rc = create_huffman_tbl(jd, seg, len); /* Create huffman tables */ + if(rc) return rc; + break; + + case 0xDB: /* DQT - Define Quantizer Tables */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + rc = create_qt_tbl(jd, seg, len); /* Create de-quantizer tables */ + if(rc) return rc; + break; + + case 0xDA: /* SOS - Start of Scan */ + if(len > JD_SZBUF) return JDR_MEM2; + if(jd->infunc(jd, seg, len) != len) return JDR_INP; /* Load segment data */ + + if(!jd->width || !jd->height) return JDR_FMT1; /* Err: Invalid image size */ + if(seg[0] != jd->ncomp) return JDR_FMT3; /* Err: Wrong color components */ + + /* Check if all tables corresponding to each components have been loaded */ + for(i = 0; i < jd->ncomp; i++) { + b = seg[2 + 2 * i]; /* Get huffman table ID */ + if(b != 0x00 && b != 0x11) return JDR_FMT3; /* Err: Different table number for DC/AC element */ + n = i ? 1 : 0; /* Component class */ + if(!jd->huffbits[n][0] || !jd->huffbits[n][1]) { /* Check huffman table for this component */ + return JDR_FMT1; /* Err: Not loaded */ + } + if(!jd->qttbl[jd->qtid[i]]) { /* Check dequantizer table for this component */ + return JDR_FMT1; /* Err: Not loaded */ + } + } + + /* Allocate working buffer for MCU and pixel output */ + n = jd->msy * jd->msx; /* Number of Y blocks in the MCU */ + if(!n) return JDR_FMT1; /* Err: SOF0 has not been loaded */ + len = n * 64 * 2 + 64; /* Allocate buffer for IDCT and RGB output */ + if(len < 256) len = 256; /* but at least 256 byte is required for IDCT */ + jd->workbuf = alloc_pool(jd, + len); /* and it may occupy a part of following MCU working buffer for RGB output */ + if(!jd->workbuf) return JDR_MEM1; /* Err: not enough memory */ + jd->mcubuf = alloc_pool(jd, (n + 2) * 64 * sizeof(jd_yuv_t)); /* Allocate MCU working buffer */ + if(!jd->mcubuf) return JDR_MEM1; /* Err: not enough memory */ + + /* Align stream read offset to JD_SZBUF */ + if(ofs %= JD_SZBUF) { + jd->dctr = jd->infunc(jd, seg + ofs, (size_t)(JD_SZBUF - ofs)); + } + jd->dptr = seg + ofs - (JD_FASTDECODE ? 0 : 1); + + return JDR_OK; /* Initialization succeeded. Ready to decompress the JPEG image. */ + + case 0xC1: /* SOF1 */ + case 0xC2: /* SOF2 */ + case 0xC3: /* SOF3 */ + case 0xC5: /* SOF5 */ + case 0xC6: /* SOF6 */ + case 0xC7: /* SOF7 */ + case 0xC9: /* SOF9 */ + case 0xCA: /* SOF10 */ + case 0xCB: /* SOF11 */ + case 0xCD: /* SOF13 */ + case 0xCE: /* SOF14 */ + case 0xCF: /* SOF15 */ + case 0xD9: /* EOI */ + return JDR_FMT3; /* Unsupported JPEG standard (may be progressive JPEG) */ + + default: /* Unknown segment (comment, exif or etc..) */ + /* Skip segment data (null pointer specifies to remove data from the stream) */ + if(jd->infunc(jd, 0, len) != len) return JDR_INP; + } + } +} + + + + +/*-----------------------------------------------------------------------*/ +/* Start to decompress the JPEG picture */ +/*-----------------------------------------------------------------------*/ + +JRESULT jd_decomp( + JDEC * jd, /* Initialized decompression object */ + int (*outfunc)(JDEC *, void *, JRECT *), /* RGB output function */ + uint8_t scale /* Output de-scaling factor (0 to 3) */ +) +{ + unsigned int x, y, mx, my; + uint16_t rst, rsc; + JRESULT rc; + + + if(scale > (JD_USE_SCALE ? 3 : 0)) return JDR_PAR; + jd->scale = scale; + + mx = jd->msx * 8; + my = jd->msy * 8; /* Size of the MCU (pixel) */ + + jd->dcv[2] = jd->dcv[1] = jd->dcv[0] = 0; /* Initialize DC values */ + rst = rsc = 0; + + rc = JDR_OK; + for(y = 0; y < jd->height; y += my) { /* Vertical loop of MCUs */ + for(x = 0; x < jd->width; x += mx) { /* Horizontal loop of MCUs */ + if(jd->nrst && rst++ == jd->nrst) { /* Process restart interval if enabled */ + rc = jd_restart(jd, rsc++); + if(rc != JDR_OK) return rc; + rst = 1; + } + rc = jd_mcu_load(jd); /* Load an MCU (decompress huffman coded stream, dequantize and apply IDCT) */ + if(rc != JDR_OK) return rc; + rc = jd_mcu_output(jd, outfunc, x, y); /* Output the MCU (YCbCr to RGB, scaling and output) */ + if(rc != JDR_OK) return rc; + } + } + + return rc; +} +#endif diff --git a/inc/lvgl/src/libs/tjpgd/tjpgd.h b/inc/lvgl/src/libs/tjpgd/tjpgd.h new file mode 100644 index 0000000..887038a --- /dev/null +++ b/inc/lvgl/src/libs/tjpgd/tjpgd.h @@ -0,0 +1,108 @@ +/*----------------------------------------------------------------------------/ +/ TJpgDec - Tiny JPEG Decompressor R0.03 include file (C)ChaN, 2021 +/----------------------------------------------------------------------------*/ +#ifndef DEF_TJPGDEC +#define DEF_TJPGDEC + +#ifdef __cplusplus +extern "C" { +#endif + +#include "../../lv_conf_internal.h" +#include "tjpgdcnf.h" + +#if LV_USE_TJPGD + +#include +#include + +#if JD_FASTDECODE >= 1 +typedef int16_t jd_yuv_t; +#else +typedef uint8_t jd_yuv_t; +#endif + + +/* Error code */ +typedef enum { + JDR_OK = 0, /* 0: Succeeded */ + JDR_INTR, /* 1: Interrupted by output function */ + JDR_INP, /* 2: Device error or wrong termination of input stream */ + JDR_MEM1, /* 3: Insufficient memory pool for the image */ + JDR_MEM2, /* 4: Insufficient stream input buffer */ + JDR_PAR, /* 5: Parameter error */ + JDR_FMT1, /* 6: Data format error (may be broken data) */ + JDR_FMT2, /* 7: Right format but not supported */ + JDR_FMT3 /* 8: Not supported JPEG standard */ +} JRESULT; + + + +/* Rectangular region in the output image */ +typedef struct { + uint16_t left; /* Left end */ + uint16_t right; /* Right end */ + uint16_t top; /* Top end */ + uint16_t bottom; /* Bottom end */ +} JRECT; + + + +/* Decompressor object structure */ +typedef struct JDEC JDEC; +struct JDEC { + size_t dctr; /* Number of bytes available in the input buffer */ + uint8_t * dptr; /* Current data read ptr */ + uint8_t * inbuf; /* Bit stream input buffer */ + uint8_t dbit; /* Number of bits available in wreg or reading bit mask */ + uint8_t scale; /* Output scaling ratio */ + uint8_t msx, msy; /* MCU size in unit of block (width, height) */ + uint8_t qtid[3]; /* Quantization table ID of each component, Y, Cb, Cr */ + uint8_t ncomp; /* Number of color components 1:grayscale, 3:color */ + int16_t dcv[3]; /* Previous DC element of each component */ + uint16_t nrst; /* Restart interval */ + uint16_t rst; /* Restart count*/ + uint16_t rsc; /* Expected restart sequence ID*/ + uint16_t width, height; /* Size of the input image (pixel) */ + uint8_t * huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */ + uint16_t * huffcode[2][2]; /* Huffman code word tables [id][dcac] */ + uint8_t * huffdata[2][2]; /* Huffman decoded data tables [id][dcac] */ + int32_t * qttbl[4]; /* Dequantizer tables [id] */ +#if JD_FASTDECODE >= 1 + uint32_t wreg; /* Working shift register */ + uint8_t marker; /* Detected marker (0:None) */ +#if JD_FASTDECODE == 2 + uint8_t longofs[2][2]; /* Table offset of long code [id][dcac] */ + uint16_t * hufflut_ac[2]; /* Fast huffman decode tables for AC short code [id] */ + uint8_t * hufflut_dc[2]; /* Fast huffman decode tables for DC short code [id] */ +#endif +#endif + void * workbuf; /* Working buffer for IDCT and RGB output */ + jd_yuv_t * mcubuf; /* Working buffer for the MCU */ + void * pool; /* Pointer to available memory pool */ + void * pool_original; /* Pointer to original pool */ + size_t sz_pool; /* Size of memory pool (bytes available) */ + size_t (*infunc)(JDEC *, uint8_t *, size_t); /* Pointer to jpeg stream input function */ + void * device; /* Pointer to I/O device identifier for the session */ +}; + + + +/* TJpgDec API functions */ +JRESULT jd_prepare(JDEC * jd, size_t (*infunc)(JDEC *, uint8_t *, size_t), void * pool, size_t sz_pool, void * dev); + +JRESULT jd_decomp(JDEC * jd, int (*outfunc)(JDEC *, void *, JRECT *), uint8_t scale); + +JRESULT jd_mcu_load(JDEC * jd); + +JRESULT jd_mcu_output(JDEC * jd, int (*outfunc)(JDEC *, void *, JRECT *), unsigned int x, unsigned int y); + +JRESULT jd_restart(JDEC * jd, uint16_t rstn); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _TJPGDEC */ diff --git a/inc/lvgl/src/libs/tjpgd/tjpgdcnf.h b/inc/lvgl/src/libs/tjpgd/tjpgdcnf.h new file mode 100644 index 0000000..dc27d6a --- /dev/null +++ b/inc/lvgl/src/libs/tjpgd/tjpgdcnf.h @@ -0,0 +1,33 @@ +/*----------------------------------------------*/ +/* TJpgDec System Configurations R0.03 */ +/*----------------------------------------------*/ + +#define JD_SZBUF 512 +/* Specifies size of stream input buffer */ + +#define JD_FORMAT 0 +/* Specifies output pixel format. +/ 0: RGB888 (24-bit/pix) +/ 1: RGB565 (16-bit/pix) +/ 2: Grayscale (8-bit/pix) +*/ + +#define JD_USE_SCALE 0 +/* Switches output descaling feature. +/ 0: Disable +/ 1: Enable +*/ + +#define JD_TBLCLIP 1 +/* Use table conversion for saturation arithmetic. A bit faster, but increases 1 KB of code size. +/ 0: Disable +/ 1: Enable +*/ + +#define JD_FASTDECODE 1 +/* Optimization level +/ 0: Basic optimization. Suitable for 8/16-bit MCUs. +/ 1: + 32-bit barrel shifter. Suitable for 32-bit MCUs. +/ 2: + Table conversion for huffman decoding (wants 6 << HUFF_BIT bytes of RAM) +*/ + diff --git a/inc/lvgl/src/libs/vg_lite_driver/LICENSE.txt b/inc/lvgl/src/libs/vg_lite_driver/LICENSE.txt new file mode 100755 index 0000000..baef4d7 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/LICENSE.txt @@ -0,0 +1,26 @@ +**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +**************************************************************************** diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc255/0x40A/vg_lite_options.h b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc255/0x40A/vg_lite_options.h new file mode 100755 index 0000000..11ee09a --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc255/0x40A/vg_lite_options.h @@ -0,0 +1,113 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#ifndef VG_LITE_OPTIONS_H +#define VG_LITE_OPTIONS_H + +#include "../../../../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + + #define CHIPID 0x255 + #define REVISION 0x1311 + #define CID 0x40A + #define ECOID 0x1 + + #define gcFEATURE_VG_IM_INDEX_FORMAT 1 + #define gcFEATURE_VG_SCISSOR 1 + #define gcFEATURE_VG_BORDER_CULLING 1 + #define gcFEATURE_VG_RGBA2_FORMAT 1 + #define gcFEATURE_VG_QUALITY_8X 1 + #define gcFEATURE_VG_IM_FASTCLEAR 0 + #define gcFEATURE_VG_RADIAL_GRADIENT 0 + #define gcFEATURE_VG_GLOBAL_ALPHA 0 + #define gcFEATURE_VG_RGBA8_ETC2_EAC 0 + #define gcFEATURE_VG_COLOR_KEY 0 + #define gcFEATURE_VG_DOUBLE_IMAGE 0 + #define gcFEATURE_VG_YUV_OUTPUT 0 + #define gcFEATURE_VG_FLEXA 0 + #define gcFEATURE_VG_24BIT 0 + #define gcFEATURE_VG_DITHER 0 + #define gcFEATURE_VG_USE_DST 0 + #define gcFEATURE_VG_PE_CLEAR 0 + #define gcFEATURE_VG_IM_INPUT 1 + #define gcFEATURE_VG_DEC_COMPRESS 0 + #define gcFEATURE_VG_LINEAR_GRADIENT_EXT 0 + #define gcFEATURE_VG_MASK 0 + #define gcFEATURE_VG_MIRROR 0 + #define gcFEATURE_VG_GAMMA 0 + #define gcFEATURE_VG_NEW_BLEND_MODE 0 + #define gcFEATURE_VG_STENCIL 0 + #define gcFEATURE_VG_SRC_PREMULTIPLIED 1 + #define gcFEATURE_VG_HW_PREMULTIPLY 0 + #define gcFEATURE_VG_COLOR_TRANSFORMATION 0 + #define gcFEATURE_VG_LVGL_SUPPORT 0 + #define gcFEATURE_VG_INDEX_ENDIAN 0 + #define gcFEATURE_VG_24BIT_PLANAR 0 + #define gcFEATURE_VG_PIXEL_MATRIX 0 + #define gcFEATURE_VG_NEW_IMAGE_INDEX 0 + #define gcFEATURE_VG_PARALLEL_PATHS 0 + #define gcFEATURE_VG_STRIPE_MODE 1 + #define gcFEATURE_VG_IM_DEC_INPUT 0 + #define gcFEATURE_VG_GAUSSIAN_BLUR 0 + #define gcFEATURE_VG_RECTANGLE_TILED_OUT 0 + #define gcFEATURE_VG_TESSELLATION_TILED_OUT 0 + #define gcFEATURE_VG_IM_REPEAT_REFLECT 0 + #define gcFEATURE_VG_YUY2_INPUT 1 + #define gcFEATURE_VG_YUV_INPUT 0 + #define gcFEATURE_VG_YUV_TILED_INPUT 0 + #define gcFEATURE_VG_AYUV_INPUT 0 + #define gcFEATURE_VG_16PIXELS_ALIGNED 1 + #define gcFEATURE_VG_DEC_COMPRESS_2_0 0 + #define gcFEATURE_VG_NV24_INPUT 0 + #define gcFEATURE_VG_TILED_LIMIT 0 + #define gcFEATURE_VG_SRC_ADDRESS_16BYTES_ALIGNED 0 + #define gcFEATURE_VG_SRC_ADDRESS_64BYTES_ALIGNED 0 + #define gcFEATURE_VG_SRC_TILE_4PIXELS_ALIGNED 0 + #define gcFEATURE_VG_SRC_BUF_ALINGED 0 + #define gcFEATURE_VG_DST_ADDRESS_64BYTES_ALIGNED 0 + #define gcFEATURE_VG_DST_TILE_4PIXELS_ALIGNED 0 + #define gcFEATURE_VG_DST_BUF_ALIGNED 0 + #define gcFEATURE_VG_DST_24BIT_PLANAR_ALIGNED 0 + #define gcFEATURE_VG_DST_BUFLEN_ALIGNED 0 + #define gcFEATURE_VG_FORMAT_SUPPORT_CHECK 0 + #define gcFEATURE_VG_YUV_ALIGNED_CHECK 0 + #define gcFEATURE_VG_512_PARALLEL_PATHS 1 + #define gcFEATURE_VG_CLOCK_GATING_TS_MODULE 1 + #define gcFEATURE_VG_CLOCK_GATING_VG_MODULE 1 + + /* SW Features */ + #define gcFEATURE_VG_STROKE_PATH 1 + #define gcFEATURE_VG_ARC_PATH 1 + #define gcFEATURE_VG_ERROR_CHECK 1 + #define gcFEATURE_VG_TRACE_API 0 + #define gcFEATURE_VG_POWER_MANAGEMENT 0 + #define gcFEATURE_VG_TILED_MODE 1 + #define gcFEATURE_VG_SINGLE_COMMAND_BUFFER 0 + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_OPTIONS_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc355/0x0_1215/vg_lite_options.h b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc355/0x0_1215/vg_lite_options.h new file mode 100755 index 0000000..80a545b --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc355/0x0_1215/vg_lite_options.h @@ -0,0 +1,117 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#ifndef VG_LITE_OPTIONS_H +#define VG_LITE_OPTIONS_H + +#include "../../../../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + + #define CHIPID 0x355 + #define REVISION 0x1215 + #define CID 0x0 + #define ECOID 0x0 + + #define gcFEATURE_VG_IM_INDEX_FORMAT 0 + #define gcFEATURE_VG_SCISSOR 1 + #define gcFEATURE_VG_BORDER_CULLING 0 + #define gcFEATURE_VG_RGBA2_FORMAT 0 + #define gcFEATURE_VG_QUALITY_8X 0 + #define gcFEATURE_VG_IM_FASTCLEAR 0 + #define gcFEATURE_VG_RADIAL_GRADIENT 1 + #define gcFEATURE_VG_GLOBAL_ALPHA 0 + #define gcFEATURE_VG_RGBA8_ETC2_EAC 0 + #define gcFEATURE_VG_COLOR_KEY 1 + #define gcFEATURE_VG_DOUBLE_IMAGE 0 + #define gcFEATURE_VG_YUV_OUTPUT 0 + #define gcFEATURE_VG_FLEXA 0 + #define gcFEATURE_VG_24BIT 0 + #define gcFEATURE_VG_DITHER 1 + #define gcFEATURE_VG_USE_DST 0 + #define gcFEATURE_VG_PE_CLEAR 0 + #define gcFEATURE_VG_IM_INPUT 1 + #define gcFEATURE_VG_DEC_COMPRESS 0 + #define gcFEATURE_VG_LINEAR_GRADIENT_EXT 1 + #define gcFEATURE_VG_MASK 1 + #define gcFEATURE_VG_MIRROR 1 + #define gcFEATURE_VG_GAMMA 1 + #define gcFEATURE_VG_NEW_BLEND_MODE 0 + #define gcFEATURE_VG_STENCIL 1 + #define gcFEATURE_VG_SRC_PREMULTIPLIED 0 + #define gcFEATURE_VG_HW_PREMULTIPLY 1 + #define gcFEATURE_VG_COLOR_TRANSFORMATION 1 + #define gcFEATURE_VG_LVGL_SUPPORT 0 + #define gcFEATURE_VG_INDEX_ENDIAN 0 + #define gcFEATURE_VG_24BIT_PLANAR 0 + #define gcFEATURE_VG_PIXEL_MATRIX 0 + #define gcFEATURE_VG_NEW_IMAGE_INDEX 0 + #define gcFEATURE_VG_PARALLEL_PATHS 0 + #define gcFEATURE_VG_STRIPE_MODE 1 + #define gcFEATURE_VG_IM_DEC_INPUT 0 + #define gcFEATURE_VG_GAUSSIAN_BLUR 0 + #define gcFEATURE_VG_RECTANGLE_TILED_OUT 0 + #define gcFEATURE_VG_TESSELLATION_TILED_OUT 0 + #define gcFEATURE_VG_IM_REPEAT_REFLECT 1 + #define gcFEATURE_VG_YUY2_INPUT 0 + #define gcFEATURE_VG_YUV_INPUT 0 + #define gcFEATURE_VG_YUV_TILED_INPUT 0 + #define gcFEATURE_VG_AYUV_INPUT 0 + #define gcFEATURE_VG_16PIXELS_ALIGNED 1 + #define gcFEATURE_VG_DEC_COMPRESS_2_0 0 + #define gcFEATURE_VG_NV24_INPUT 0 + #define gcFEATURE_VG_TILED_LIMIT 0 + #define gcFEATURE_VG_SRC_ADDRESS_16BYTES_ALIGNED 0 + #define gcFEATURE_VG_SRC_ADDRESS_64BYTES_ALIGNED 0 + #define gcFEATURE_VG_SRC_TILE_4PIXELS_ALIGNED 0 + #define gcFEATURE_VG_SRC_BUF_ALINGED 0 + #define gcFEATURE_VG_DST_ADDRESS_64BYTES_ALIGNED 0 + #define gcFEATURE_VG_DST_TILE_4PIXELS_ALIGNED 0 + #define gcFEATURE_VG_DST_BUF_ALIGNED 0 + #define gcFEATURE_VG_DST_24BIT_PLANAR_ALIGNED 0 + #define gcFEATURE_VG_DST_BUFLEN_ALIGNED 0 + #define gcFEATURE_VG_FORMAT_SUPPORT_CHECK 0 + #define gcFEATURE_VG_YUV_ALIGNED_CHECK 0 + #define gcFEATURE_VG_512_PARALLEL_PATHS 1 + #define gcFEATURE_VG_CLOCK_GATING_TS_MODULE 1 + #define gcFEATURE_VG_CLOCK_GATING_VG_MODULE 1 + + /* SW Features */ + #define gcFEATURE_VG_STROKE_PATH 1 + #define gcFEATURE_VG_ARC_PATH 1 + #define gcFEATURE_VG_ERROR_CHECK 1 + #define gcFEATURE_VG_TRACE_API 0 + #define gcFEATURE_VG_POWER_MANAGEMENT 0 + #define gcFEATURE_VG_TILED_MODE 1 + #define gcFEATURE_VG_SINGLE_COMMAND_BUFFER 0 + + /*** + #define gcFEATURE_VG_RESOLUTION_8K 1 + #define gcFEATURE_VG_IMAGE_16K 0 + ***/ +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_OPTIONS_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc355/0x0_1216/vg_lite_options.h b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc355/0x0_1216/vg_lite_options.h new file mode 100755 index 0000000..8322499 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc355/0x0_1216/vg_lite_options.h @@ -0,0 +1,117 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ +#ifndef VG_LITE_OPTIONS_H +#define VG_LITE_OPTIONS_H + +#include "../../../../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + + #define CHIPID 0x355 + #define REVISION 0x1216 + #define CID 0x0 + #define ECOID 0x0 + + #define gcFEATURE_VG_IM_INDEX_FORMAT 0 + #define gcFEATURE_VG_SCISSOR 1 + #define gcFEATURE_VG_BORDER_CULLING 0 + #define gcFEATURE_VG_RGBA2_FORMAT 0 + #define gcFEATURE_VG_QUALITY_8X 0 + #define gcFEATURE_VG_IM_FASTCLEAR 0 + #define gcFEATURE_VG_RADIAL_GRADIENT 1 + #define gcFEATURE_VG_GLOBAL_ALPHA 0 + #define gcFEATURE_VG_RGBA8_ETC2_EAC 0 + #define gcFEATURE_VG_COLOR_KEY 1 + #define gcFEATURE_VG_DOUBLE_IMAGE 0 + #define gcFEATURE_VG_YUV_OUTPUT 0 + #define gcFEATURE_VG_FLEXA 0 + #define gcFEATURE_VG_24BIT 0 + #define gcFEATURE_VG_DITHER 1 + #define gcFEATURE_VG_USE_DST 0 + #define gcFEATURE_VG_PE_CLEAR 0 + #define gcFEATURE_VG_IM_INPUT 1 + #define gcFEATURE_VG_DEC_COMPRESS 0 + #define gcFEATURE_VG_LINEAR_GRADIENT_EXT 1 + #define gcFEATURE_VG_MASK 1 + #define gcFEATURE_VG_MIRROR 1 + #define gcFEATURE_VG_GAMMA 1 + #define gcFEATURE_VG_NEW_BLEND_MODE 0 + #define gcFEATURE_VG_STENCIL 1 + #define gcFEATURE_VG_SRC_PREMULTIPLIED 0 + #define gcFEATURE_VG_HW_PREMULTIPLY 1 + #define gcFEATURE_VG_COLOR_TRANSFORMATION 1 + #define gcFEATURE_VG_LVGL_SUPPORT 0 + #define gcFEATURE_VG_INDEX_ENDIAN 0 + #define gcFEATURE_VG_24BIT_PLANAR 0 + #define gcFEATURE_VG_PIXEL_MATRIX 0 + #define gcFEATURE_VG_NEW_IMAGE_INDEX 0 + #define gcFEATURE_VG_PARALLEL_PATHS 0 + #define gcFEATURE_VG_STRIPE_MODE 1 + #define gcFEATURE_VG_IM_DEC_INPUT 0 + #define gcFEATURE_VG_GAUSSIAN_BLUR 0 + #define gcFEATURE_VG_RECTANGLE_TILED_OUT 0 + #define gcFEATURE_VG_TESSELLATION_TILED_OUT 0 + #define gcFEATURE_VG_IM_REPEAT_REFLECT 1 + #define gcFEATURE_VG_YUY2_INPUT 0 + #define gcFEATURE_VG_YUV_INPUT 0 + #define gcFEATURE_VG_YUV_TILED_INPUT 0 + #define gcFEATURE_VG_AYUV_INPUT 0 + #define gcFEATURE_VG_16PIXELS_ALIGNED 1 + #define gcFEATURE_VG_DEC_COMPRESS_2_0 0 + #define gcFEATURE_VG_NV24_INPUT 0 + #define gcFEATURE_VG_TILED_LIMIT 0 + #define gcFEATURE_VG_SRC_ADDRESS_16BYTES_ALIGNED 0 + #define gcFEATURE_VG_SRC_ADDRESS_64BYTES_ALIGNED 0 + #define gcFEATURE_VG_SRC_TILE_4PIXELS_ALIGNED 0 + #define gcFEATURE_VG_SRC_BUF_ALINGED 0 + #define gcFEATURE_VG_DST_ADDRESS_64BYTES_ALIGNED 0 + #define gcFEATURE_VG_DST_TILE_4PIXELS_ALIGNED 0 + #define gcFEATURE_VG_DST_BUF_ALIGNED 0 + #define gcFEATURE_VG_DST_24BIT_PLANAR_ALIGNED 0 + #define gcFEATURE_VG_DST_BUFLEN_ALIGNED 0 + #define gcFEATURE_VG_FORMAT_SUPPORT_CHECK 0 + #define gcFEATURE_VG_YUV_ALIGNED_CHECK 0 + #define gcFEATURE_VG_512_PARALLEL_PATHS 1 + #define gcFEATURE_VG_CLOCK_GATING_TS_MODULE 1 + #define gcFEATURE_VG_CLOCK_GATING_VG_MODULE 1 + + /* SW Features */ + #define gcFEATURE_VG_STROKE_PATH 1 + #define gcFEATURE_VG_ARC_PATH 1 + #define gcFEATURE_VG_ERROR_CHECK 1 + #define gcFEATURE_VG_TRACE_API 0 + #define gcFEATURE_VG_POWER_MANAGEMENT 0 + #define gcFEATURE_VG_TILED_MODE 1 + #define gcFEATURE_VG_SINGLE_COMMAND_BUFFER 0 + + /*** + #define gcFEATURE_VG_RESOLUTION_8K 1 + #define gcFEATURE_VG_IMAGE_16K 0 + ***/ + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_OPTIONS_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc555/0x423/vg_lite_options.h b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc555/0x423/vg_lite_options.h new file mode 100755 index 0000000..e6663f2 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc555/0x423/vg_lite_options.h @@ -0,0 +1,115 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#ifndef VG_LITE_OPTIONS_H +#define VG_LITE_OPTIONS_H + +#include "../../../../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + + #define CHIPID 0x555 + #define REVISION 0x1230 + #define CID 0x423 + #define ECOID 0x0 + + #define gcFEATURE_VG_IM_INDEX_FORMAT 1 + #define gcFEATURE_VG_SCISSOR 1 + #define gcFEATURE_VG_BORDER_CULLING 1 + #define gcFEATURE_VG_RGBA2_FORMAT 1 + #define gcFEATURE_VG_QUALITY_8X 0 + #define gcFEATURE_VG_IM_FASTCLEAR 0 + #define gcFEATURE_VG_RADIAL_GRADIENT 1 + #define gcFEATURE_VG_GLOBAL_ALPHA 1 + #define gcFEATURE_VG_RGBA8_ETC2_EAC 1 + #define gcFEATURE_VG_COLOR_KEY 1 + #define gcFEATURE_VG_DOUBLE_IMAGE 0 + #define gcFEATURE_VG_YUV_OUTPUT 0 + #define gcFEATURE_VG_FLEXA 0 + #define gcFEATURE_VG_24BIT 1 + #define gcFEATURE_VG_DITHER 1 + #define gcFEATURE_VG_USE_DST 0 + #define gcFEATURE_VG_PE_CLEAR 1 + #define gcFEATURE_VG_IM_INPUT 1 + #define gcFEATURE_VG_DEC_COMPRESS 1 + #define gcFEATURE_VG_LINEAR_GRADIENT_EXT 1 + #define gcFEATURE_VG_MASK 1 + #define gcFEATURE_VG_MIRROR 1 + #define gcFEATURE_VG_GAMMA 1 + #define gcFEATURE_VG_NEW_BLEND_MODE 1 + #define gcFEATURE_VG_STENCIL 1 + #define gcFEATURE_VG_SRC_PREMULTIPLIED 0 + #define gcFEATURE_VG_HW_PREMULTIPLY 1 + #define gcFEATURE_VG_COLOR_TRANSFORMATION 1 + #define gcFEATURE_VG_LVGL_SUPPORT 1 + #define gcFEATURE_VG_INDEX_ENDIAN 0 + #define gcFEATURE_VG_24BIT_PLANAR 0 + #define gcFEATURE_VG_PIXEL_MATRIX 0 + #define gcFEATURE_VG_NEW_IMAGE_INDEX 1 + #define gcFEATURE_VG_PARALLEL_PATHS 1 + #define gcFEATURE_VG_STRIPE_MODE 1 + #define gcFEATURE_VG_IM_DEC_INPUT 1 + #define gcFEATURE_VG_GAUSSIAN_BLUR 0 + #define gcFEATURE_VG_RECTANGLE_TILED_OUT 1 + #define gcFEATURE_VG_TESSELLATION_TILED_OUT 1 + #define gcFEATURE_VG_IM_REPEAT_REFLECT 1 + #define gcFEATURE_VG_YUY2_INPUT 1 + #define gcFEATURE_VG_YUV_INPUT 1 + #define gcFEATURE_VG_YUV_TILED_INPUT 0 + #define gcFEATURE_VG_AYUV_INPUT 0 + #define gcFEATURE_VG_16PIXELS_ALIGNED 1 + #define gcFEATURE_VG_MATH_PRECISION_FIX 1 + #define gcFEATURE_VG_SPLIT_PATH 1 + #define gcFEATURE_VG_DEC_COMPRESS_2_0 0 + #define gcFEATURE_VG_CLOCK_GATING_TS_MODULE 1 + #define gcFEATURE_VG_CLOCK_GATING_VG_MODULE 0 + #define gcFEATURE_VG_NV24_INPUT 0 + #define gcFEATURE_VG_TILED_LIMIT 3 + #define gcFEATURE_VG_SRC_ADDRESS_64BYTES_ALIGNED 1 + #define gcFEATURE_VG_SRC_TILE_4PIXELS_ALIGNED 1 + #define gcFEATURE_VG_SRC_BUF_ALINGED 0 + #define gcFEATURE_VG_SRC_ADDRESS_16BYTES_ALIGNED 0 + #define gcFEATURE_VG_DST_ADDRESS_64BYTES_ALIGNED 0 + #define gcFEATURE_VG_DST_TILE_4PIXELS_ALIGNED 1 + #define gcFEATURE_VG_DST_BUF_ALIGNED 0 + #define gcFEATURE_VG_DST_24BIT_PLANAR_ALIGNED 0 + #define gcFEATURE_VG_DST_BUFLEN_ALIGNED 0 + #define gcFEATURE_VG_FORMAT_SUPPORT_CHECK 0 + #define gcFEATURE_VG_YUV_ALIGNED_CHECK 1 + #define gcFEATURE_VG_512_PARALLEL_PATHS 0 + + /* SW Features */ + #define gcFEATURE_VG_STROKE_PATH 1 + #define gcFEATURE_VG_ARC_PATH 1 + #define gcFEATURE_VG_ERROR_CHECK 1 + #define gcFEATURE_VG_TRACE_API 0 + #define gcFEATURE_VG_POWER_MANAGEMENT 1 + #define gcFEATURE_VG_TILED_MODE 1 + #define gcFEATURE_VG_SINGLE_COMMAND_BUFFER 0 + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_OPTIONS_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc555/0x423_ECO/vg_lite_options.h b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc555/0x423_ECO/vg_lite_options.h new file mode 100755 index 0000000..f67dc0a --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/Series/gc555/0x423_ECO/vg_lite_options.h @@ -0,0 +1,115 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#ifndef VG_LITE_OPTIONS_H +#define VG_LITE_OPTIONS_H + +#include "../../../../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + + #define CHIPID 0x555 + #define REVISION 0x1230 + #define CID 0x423 + #define ECOID 0x1 + + #define gcFEATURE_VG_IM_INDEX_FORMAT 1 + #define gcFEATURE_VG_SCISSOR 1 + #define gcFEATURE_VG_BORDER_CULLING 1 + #define gcFEATURE_VG_RGBA2_FORMAT 1 + #define gcFEATURE_VG_QUALITY_8X 0 + #define gcFEATURE_VG_IM_FASTCLEAR 0 + #define gcFEATURE_VG_RADIAL_GRADIENT 1 + #define gcFEATURE_VG_GLOBAL_ALPHA 1 + #define gcFEATURE_VG_RGBA8_ETC2_EAC 1 + #define gcFEATURE_VG_COLOR_KEY 1 + #define gcFEATURE_VG_DOUBLE_IMAGE 0 + #define gcFEATURE_VG_YUV_OUTPUT 0 + #define gcFEATURE_VG_FLEXA 0 + #define gcFEATURE_VG_24BIT 1 + #define gcFEATURE_VG_DITHER 1 + #define gcFEATURE_VG_USE_DST 0 + #define gcFEATURE_VG_PE_CLEAR 1 + #define gcFEATURE_VG_IM_INPUT 1 + #define gcFEATURE_VG_DEC_COMPRESS 1 + #define gcFEATURE_VG_LINEAR_GRADIENT_EXT 1 + #define gcFEATURE_VG_MASK 1 + #define gcFEATURE_VG_MIRROR 1 + #define gcFEATURE_VG_GAMMA 1 + #define gcFEATURE_VG_NEW_BLEND_MODE 1 + #define gcFEATURE_VG_STENCIL 1 + #define gcFEATURE_VG_SRC_PREMULTIPLIED 0 + #define gcFEATURE_VG_HW_PREMULTIPLY 1 + #define gcFEATURE_VG_COLOR_TRANSFORMATION 1 + #define gcFEATURE_VG_LVGL_SUPPORT 1 + #define gcFEATURE_VG_INDEX_ENDIAN 0 + #define gcFEATURE_VG_24BIT_PLANAR 0 + #define gcFEATURE_VG_PIXEL_MATRIX 0 + #define gcFEATURE_VG_NEW_IMAGE_INDEX 1 + #define gcFEATURE_VG_PARALLEL_PATHS 1 + #define gcFEATURE_VG_STRIPE_MODE 1 + #define gcFEATURE_VG_IM_DEC_INPUT 1 + #define gcFEATURE_VG_GAUSSIAN_BLUR 0 + #define gcFEATURE_VG_RECTANGLE_TILED_OUT 1 + #define gcFEATURE_VG_TESSELLATION_TILED_OUT 1 + #define gcFEATURE_VG_IM_REPEAT_REFLECT 1 + #define gcFEATURE_VG_YUY2_INPUT 1 + #define gcFEATURE_VG_YUV_INPUT 1 + #define gcFEATURE_VG_YUV_TILED_INPUT 0 + #define gcFEATURE_VG_AYUV_INPUT 0 + #define gcFEATURE_VG_16PIXELS_ALIGNED 1 + #define gcFEATURE_VG_MATH_PRECISION_FIX 0 + #define gcFEATURE_VG_SPLIT_PATH 1 + #define gcFEATURE_VG_DEC_COMPRESS_2_0 0 + #define gcFEATURE_VG_CLOCK_GATING_TS_MODULE 1 + #define gcFEATURE_VG_CLOCK_GATING_VG_MODULE 0 + #define gcFEATURE_VG_NV24_INPUT 0 + #define gcFEATURE_VG_TILED_LIMIT 3 + #define gcFEATURE_VG_SRC_ADDRESS_16BYTES_ALIGNED 0 + #define gcFEATURE_VG_SRC_ADDRESS_64BYTES_ALIGNED 1 + #define gcFEATURE_VG_SRC_TILE_4PIXELS_ALIGNED 1 + #define gcFEATURE_VG_SRC_BUF_ALINGED 0 + #define gcFEATURE_VG_DST_ADDRESS_64BYTES_ALIGNED 0 + #define gcFEATURE_VG_DST_TILE_4PIXELS_ALIGNED 1 + #define gcFEATURE_VG_DST_BUF_ALIGNED 0 + #define gcFEATURE_VG_DST_24BIT_PLANAR_ALIGNED 0 + #define gcFEATURE_VG_DST_BUFLEN_ALIGNED 0 + #define gcFEATURE_VG_FORMAT_SUPPORT_CHECK 0 + #define gcFEATURE_VG_YUV_ALIGNED_CHECK 1 + #define gcFEATURE_VG_512_PARALLEL_PATHS 0 + + /* SW Features */ + #define gcFEATURE_VG_STROKE_PATH 1 + #define gcFEATURE_VG_ARC_PATH 1 + #define gcFEATURE_VG_ERROR_CHECK 1 + #define gcFEATURE_VG_TRACE_API 0 + #define gcFEATURE_VG_POWER_MANAGEMENT 1 + #define gcFEATURE_VG_TILED_MODE 1 + #define gcFEATURE_VG_SINGLE_COMMAND_BUFFER 0 + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_OPTIONS_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite.c b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite.c new file mode 100755 index 0000000..207747a --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite.c @@ -0,0 +1,7404 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "vg_lite_context.h" + +static float offsetTable[7] = {0, 0.000575f, -0.000575f, 0.0001f, -0.0001f, 0.0000375f, -0.0000375f}; + +#if VG_SW_BLIT_PRECISION_OPT +uint8_t GetIndex(uint32_t RotationStep, uint32_t ScaleValue) +{ + uint8_t index = 0; + switch(RotationStep) { + case 0: //rotate 0 + switch(ScaleValue) { + case 10: + case 15: + case 25: + case 30: + case 70: + case 75: + index = 1; + break; + case 45: + case 50: + case 60: + case 65: + case 550: + index = 3; + break; + case 55: + case 250: + case 350: + index = 4; + break; + case 85: + case 90: + case 95: + case 150: + case 450: + case 650: + case 750: + case 850: + case 950: + index = 5; + break; + case 125: + index = 2; + break; + default: + index = 0; + break; + } + break; + case 2: //rotate 90 + switch(ScaleValue) { + case 10: + index = 2; + break; + case 15: + case 25: + case 30: + case 45: + case 75: + case 85: + case 90: + case 95: + case 150: + case 250: + case 350: + case 450: + case 550: + case 850: + index = 5; + break; + case 35: + case 750: + index = 4; + break; + case 50: + index = 1; + break; + case 55: + case 60: + case 65: + case 70: + index = 3; + break; + default: + index = 0; + break; + } + break; + case 3: //rotate 135 + switch(ScaleValue) { + case 10: + case 15: + case 20: + case 35: + case 45: + case 50: + case 60: + case 75: + index = 2; + break; + case 85: + case 90: + case 100: + case 400: + case 450: + case 500: + case 550: + case 850: + index = 4; + break; + default: + index = 0; + break; + } + break; + case 4: //rotate 180 + switch(ScaleValue) { + case 10: + case 15: + case 25: + case 30: + case 35: + case 50: + index = 1; + break; + case 45: + case 55: + case 65: + case 70: + case 75: + case 85: + case 90: + case 95: + case 150: + case 250: + case 350: + case 450: + case 550: + case 650: + case 750: + case 850: + case 950: + index = 5; + break; + default: + index = 0; + break; + } + break; + case 5: //rotate 225 + switch(ScaleValue) { + case 10: + case 15: + case 20: + case 30: + case 35: + case 40: + case 45: + case 55: + case 60: + case 90: + index = 6; + break; + default: + index = 0; + break; + } + break; + case 6: //rotate 270 + switch(ScaleValue) { + case 10: + case 25: + case 30: + case 35: + case 45: + case 55: + case 60: + case 65: + case 70: + case 75: + case 80: + case 85: + case 90: + case 95: + case 150: + case 350: + case 450: + case 550: + case 650: + case 750: + case 850: + case 950: + index = 5; + break; + default: + index = 0; + break; + } + break; + case 7: //rotate 315 + switch(ScaleValue) { + case 20: + case 25: + case 30: + case 35: + case 40: + case 45: + case 50: + case 55: + case 60: + case 65: + case 70: + case 80: + case 85: + case 90: + case 95: + case 350: + case 550: + case 900: + index = 5; + break; + default: + index = 0; + break; + } + break; + default : + index = 0; + break; + } + return index; +} +#endif /* VG_SW_BLIT_PRECISION_OPT */ + +/* Global context variables and feature table. +*/ +vg_lite_context_t s_context = { 0 }; +#if gcFEATURE_VG_SINGLE_COMMAND_BUFFER + uint32_t command_buffer_size = VG_LITE_SINGLE_COMMAND_BUFFER_SIZE; +#else + uint32_t command_buffer_size = VG_LITE_COMMAND_BUFFER_SIZE; +#endif +uint32_t submit_flag = 0; + +vg_lite_matrix_t identity_mtx = { + { + { 1.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f }, + { 0.0f, 0.0f, 1.0f } + }, + 1.0f, 1.0f, 0.0f +}; + +/* Initialize the feature table of a chip. */ +vg_lite_ftable_t s_ftable = { + { + gcFEATURE_VG_IM_INDEX_FORMAT, + gcFEATURE_VG_SCISSOR, + gcFEATURE_VG_BORDER_CULLING, + gcFEATURE_VG_RGBA2_FORMAT, + gcFEATURE_VG_QUALITY_8X, + gcFEATURE_VG_IM_FASTCLEAR, + gcFEATURE_VG_RADIAL_GRADIENT, + gcFEATURE_VG_GLOBAL_ALPHA, + gcFEATURE_VG_RGBA8_ETC2_EAC, + gcFEATURE_VG_COLOR_KEY, + gcFEATURE_VG_DOUBLE_IMAGE, + gcFEATURE_VG_YUV_OUTPUT, + gcFEATURE_VG_FLEXA, + gcFEATURE_VG_24BIT, + gcFEATURE_VG_DITHER, + gcFEATURE_VG_USE_DST, + gcFEATURE_VG_PE_CLEAR, + gcFEATURE_VG_IM_INPUT, + gcFEATURE_VG_DEC_COMPRESS, + gcFEATURE_VG_LINEAR_GRADIENT_EXT, + gcFEATURE_VG_MASK, + gcFEATURE_VG_MIRROR, + gcFEATURE_VG_GAMMA, + gcFEATURE_VG_NEW_BLEND_MODE, + gcFEATURE_VG_STENCIL, + gcFEATURE_VG_SRC_PREMULTIPLIED, + gcFEATURE_VG_HW_PREMULTIPLY, + gcFEATURE_VG_COLOR_TRANSFORMATION, + gcFEATURE_VG_LVGL_SUPPORT, + gcFEATURE_VG_INDEX_ENDIAN, + gcFEATURE_VG_24BIT_PLANAR, + gcFEATURE_VG_PIXEL_MATRIX, + gcFEATURE_VG_NEW_IMAGE_INDEX, + gcFEATURE_VG_PARALLEL_PATHS, + gcFEATURE_VG_STRIPE_MODE, + gcFEATURE_VG_IM_DEC_INPUT, + gcFEATURE_VG_GAUSSIAN_BLUR, + gcFEATURE_VG_RECTANGLE_TILED_OUT, + gcFEATURE_VG_TESSELLATION_TILED_OUT, + gcFEATURE_VG_IM_REPEAT_REFLECT, + gcFEATURE_VG_YUY2_INPUT, + gcFEATURE_VG_YUV_INPUT, + gcFEATURE_VG_YUV_TILED_INPUT, + gcFEATURE_VG_AYUV_INPUT, + gcFEATURE_VG_16PIXELS_ALIGNED, + gcFEATURE_VG_DEC_COMPRESS_2_0, + gcFEATURE_VG_NV24_INPUT, + gcFEATURE_VG_TILED_LIMIT, + gcFEATURE_VG_TILED_MODE, + gcFEATURE_VG_SRC_ADDRESS_16BYTES_ALIGNED, + gcFEATURE_VG_SRC_ADDRESS_64BYTES_ALIGNED, + gcFEATURE_VG_SRC_TILE_4PIXELS_ALIGNED, + gcFEATURE_VG_SRC_BUF_ALINGED, + gcFEATURE_VG_DST_ADDRESS_64BYTES_ALIGNED, + gcFEATURE_VG_DST_TILE_4PIXELS_ALIGNED, + gcFEATURE_VG_DST_BUF_ALIGNED, + gcFEATURE_VG_DST_24BIT_PLANAR_ALIGNED, + gcFEATURE_VG_DST_BUFLEN_ALIGNED, + gcFEATURE_VG_FORMAT_SUPPORT_CHECK, + gcFEATURE_VG_YUV_ALIGNED_CHECK, + gcFEATURE_VG_512_PARALLEL_PATHS, + } +}; + +static vg_lite_error_t check_hardware_chip_info(void) +{ + vg_lite_uint32_t chip_id = 0, chip_rev = 0, cid = 0, eco_id = 0; + + vg_lite_get_product_info(NULL, &chip_id, &chip_rev); + vg_lite_get_register(0x30, &cid); + vg_lite_get_register(0xE8, &eco_id); + + if(CHIPID != chip_id || REVISION != chip_rev || CID != cid || ECOID != eco_id) { + printf("VGLite API initialization Error!!! \nHardware ChipId: 0x%X ChipRevision: 0x%X Cid: 0x%X Ecoid: 0x%X \n", + chip_id, chip_rev, cid, eco_id); + printf("NOT match vg_lite_options.h CHIPID: 0x%X REVISION: 0x%X CID: 0x%X Ecoid: 0x%X \n", CHIPID, REVISION, CID, + ECOID); + return VG_LITE_NOT_SUPPORT; + } + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t check_compress( + vg_lite_buffer_format_t format, + vg_lite_compress_mode_t compress_mode, + vg_lite_buffer_layout_t tiled, + uint32_t width, + uint32_t height +) +{ +#if gcFEATURE_VG_DEC_COMPRESS + vg_lite_error_t error = VG_LITE_SUCCESS; + + if(compress_mode) { + if(compress_mode > VG_LITE_DEC_HV_SAMPLE || compress_mode < VG_LITE_DEC_DISABLE) + return VG_LITE_INVALID_ARGUMENT; + + if(tiled) { + if(width % 16 || height % 4) + return VG_LITE_INVALID_ARGUMENT; + } + else { + if(width % 16 || compress_mode == VG_LITE_DEC_HV_SAMPLE) + return VG_LITE_INVALID_ARGUMENT; + } + +#if gcFEATURE_VG_DEC_COMPRESS_2_0 + if(format != VG_LITE_BGRA8888 && format != VG_LITE_BGRX8888 && format != VG_LITE_BGR888) { + printf("Invalid compression format!\n"); + return VG_LITE_INVALID_ARGUMENT; + } +#else + if(format != VG_LITE_BGRX8888 && format != VG_LITE_RGBX8888 && format != VG_LITE_BGRA8888 + && format != VG_LITE_RGBA8888 && format != VG_LITE_RGB888 && format != VG_LITE_BGR888) { + printf("Invalid compression format!\n"); + return VG_LITE_INVALID_ARGUMENT; + } +#endif + } + + return error; +#else + return VG_LITE_SUCCESS; +#endif +} + +static vg_lite_float_t _calc_decnano_compress_ratio( + vg_lite_buffer_format_t format, + vg_lite_compress_mode_t compress_mode +) +{ + vg_lite_float_t ratio = 1.0f; + +#if gcFEATURE_VG_DEC_COMPRESS_2_0 + switch(compress_mode) { + case VG_LITE_DEC_NON_SAMPLE: + switch(format) { + case VG_LITE_BGRA8888: + case VG_LITE_BGR888: + ratio = 0.5f; + break; + case VG_LITE_BGRX8888: + ratio = 0.385f; + break; + default: + return ratio; + } + break; + + case VG_LITE_DEC_HSAMPLE: + switch(format) { + case VG_LITE_BGRA8888: + ratio = 0.385f; + break; + case VG_LITE_BGRX8888: + ratio = 0.25f; + break; + case VG_LITE_BGR888: + ratio = 0.334f; + break; + default: + return ratio; + } + break; + + case VG_LITE_DEC_HV_SAMPLE: + switch(format) { + case VG_LITE_BGRA8888: + ratio = 0.385f; + break; + case VG_LITE_BGRX8888: + ratio = 0.25f; + break; + case VG_LITE_BGR888: + ratio = 0.334f; + break; + default: + return ratio; + } + break; + + default: + return ratio; + } +#else +#if gcFEATURE_VG_DEC_COMPRESS + switch(compress_mode) { + case VG_LITE_DEC_NON_SAMPLE: + switch(format) { + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_BGRA8888: + case VG_LITE_RGBA8888: + ratio = 0.625f; + break; + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + case VG_LITE_BGRX8888: + case VG_LITE_RGBX8888: + ratio = 0.5f; + break; + case VG_LITE_RGB888: + case VG_LITE_BGR888: + ratio = 0.667f; + break; + default: + return ratio; + } + break; + + case VG_LITE_DEC_HSAMPLE: + switch(format) { + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_BGRA8888: + case VG_LITE_RGBA8888: + case VG_LITE_RGB888: + case VG_LITE_BGR888: + ratio = 0.5f; + break; + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + case VG_LITE_BGRX8888: + case VG_LITE_RGBX8888: + ratio = 0.375f; + break; + default: + return ratio; + } + break; + + case VG_LITE_DEC_HV_SAMPLE: + switch(format) { + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_BGRA8888: + case VG_LITE_RGBA8888: + ratio = 0.375f; + break; + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + case VG_LITE_BGRX8888: + case VG_LITE_RGBX8888: + ratio = 0.25f; + break; + default: + return ratio; + } + break; + default: + return ratio; + } +#endif + +#endif + + return ratio; +} + +static inline int32_t has_valid_command_buffer(vg_lite_context_t * context) +{ + if(context == NULL) + return 0; + if(context->command_buffer_current >= CMDBUF_COUNT) + return 0; + if(context->command_buffer[context->command_buffer_current] == NULL) + return 0; + + return 1; +} + +typedef vg_lite_float_t FLOATVECTOR4[4]; + +static void ClampColor(FLOATVECTOR4 Source, FLOATVECTOR4 Target, uint8_t Premultiplied) +{ + vg_lite_float_t colorMax; + /* Clamp the alpha channel. */ + Target[3] = CLAMP(Source[3], 0.0f, 1.0f); + + /* Determine the maximum value for the color channels. */ + colorMax = Premultiplied ? Target[3] : 1.0f; + + /* Clamp the color channels. */ + Target[0] = CLAMP(Source[0], 0.0f, colorMax); + Target[1] = CLAMP(Source[1], 0.0f, colorMax); + Target[2] = CLAMP(Source[2], 0.0f, colorMax); +} + +static uint8_t PackColorComponent(vg_lite_float_t value) +{ + /* Compute the rounded normalized value. */ + vg_lite_float_t rounded = value * 255.0f + 0.5f; + + /* Get the integer part. */ + int32_t roundedInt = (int32_t)rounded; + + /* Clamp to 0..1 range. */ + uint8_t clamped = (uint8_t)CLAMP(roundedInt, 0, 255); + + /* Return result. */ + return clamped; +} + +#if DUMP_IMAGE +static void dump_img(void * memory, int32_t width, int32_t height, vg_lite_buffer_format_t format) +{ + FILE * fp; + char imgname[255] = {'\0'}; + static int32_t num = 1; + uint32_t * pt = (uint32_t *) memory; + int32_t i; + + sprintf(imgname, "img_pid%d_%d.txt", getpid(), num++); + + fp = fopen(imgname, "w"); + + if(fp == NULL) + printf("error!\n"); + + + switch(format) { + case VG_LITE_INDEX_1: + for(i = 0; i < width * height / 32; ++i) { + fprintf(fp, "0x%08x\n", pt[i]); + } + break; + + case VG_LITE_INDEX_2: + for(i = 0; i < width * height / 16; ++i) { + fprintf(fp, "0x%08x\n", pt[i]); + } + break; + + case VG_LITE_INDEX_4: + for(i = 0; i < width * height / 8; ++i) { + fprintf(fp, "0x%08x\n", pt[i]); + } + break; + + case VG_LITE_INDEX_8: + for(i = 0; i < width * height / 4; ++i) { + fprintf(fp, "0x%08x\n", pt[i]); + } + break; + + case VG_LITE_RGBA2222: + for(i = 0; i < width * height / 4; ++i) { + fprintf(fp, "0x%08x\n", pt[i]); + } + break; + + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + for(i = 0; i < width * height / 2; ++i) { + fprintf(fp, "0x%08x\n", pt[i]); + } + break; + + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + for(i = 0; i < width * height; ++i) { + fprintf(fp, "0x%08x\n", pt[i]); + } + break; + + default: + break; + } + fclose(fp); + fp = NULL; +} +#endif + +static uint32_t rgb_to_l(uint32_t color) +{ + uint32_t l = (uint32_t)((0.2126f * (vg_lite_float_t)(color & 0xFF)) + + (0.7152f * (vg_lite_float_t)((color >> 8) & 0xFF)) + + (0.0722f * (vg_lite_float_t)((color >> 16) & 0xFF))); + return l | (l << 24); +} + +/* Get the bpp information of a color format. */ +void get_format_bytes(vg_lite_buffer_format_t format, + uint32_t * mul, + uint32_t * div, + uint32_t * bytes_align) +{ + *mul = *div = 1; + *bytes_align = 4; + switch(format) { + case VG_LITE_L8: + case VG_LITE_A8: + case VG_LITE_RGBA8888_ETC2_EAC: + break; + + case VG_LITE_A4: + *div = 2; + break; + + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_YUYV: + case VG_LITE_YUY2: + case VG_LITE_YUY2_TILED: + /* AYUY2 buffer memory = YUY2 + alpha. */ + case VG_LITE_AYUY2: + case VG_LITE_AYUY2_TILED: + /* ABGR8565_PLANAR buffer memory = RGB565 + alpha. */ + case VG_LITE_ABGR8565_PLANAR: + case VG_LITE_ARGB8565_PLANAR: + case VG_LITE_RGBA5658_PLANAR: + case VG_LITE_BGRA5658_PLANAR: + *mul = 2; + break; + + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + *mul = 4; + break; + + case VG_LITE_NV12: + case VG_LITE_NV12_TILED: + *mul = 1; + break; + + case VG_LITE_ANV12: + case VG_LITE_ANV12_TILED: + *mul = 4; + break; + + case VG_LITE_INDEX_1: + *div = 8; + *bytes_align = 8; + break; + + case VG_LITE_INDEX_2: + *div = 4; + *bytes_align = 8; + break; + + case VG_LITE_INDEX_4: + *div = 2; + *bytes_align = 8; + break; + + case VG_LITE_INDEX_8: + *bytes_align = 1; + break; + + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + *mul = 1; + break; + + case VG_LITE_RGB888: + case VG_LITE_BGR888: + case VG_LITE_ABGR8565: + case VG_LITE_BGRA5658: + case VG_LITE_ARGB8565: + case VG_LITE_RGBA5658: + *mul = 3; + break; + + /* OpenVG format*/ + case OPENVG_sRGBX_8888: + case OPENVG_sRGBX_8888_PRE: + case OPENVG_sRGBA_8888: + case OPENVG_sRGBA_8888_PRE: + case OPENVG_lRGBX_8888: + case OPENVG_lRGBX_8888_PRE: + case OPENVG_lRGBA_8888: + case OPENVG_lRGBA_8888_PRE: + case OPENVG_sXRGB_8888: + case OPENVG_sARGB_8888: + case OPENVG_sARGB_8888_PRE: + case OPENVG_lXRGB_8888: + case OPENVG_lARGB_8888: + case OPENVG_lARGB_8888_PRE: + case OPENVG_sBGRX_8888: + case OPENVG_sBGRA_8888: + case OPENVG_sBGRA_8888_PRE: + case OPENVG_lBGRX_8888: + case OPENVG_lBGRA_8888: + case OPENVG_sXBGR_8888: + case OPENVG_sABGR_8888: + case OPENVG_lBGRA_8888_PRE: + case OPENVG_sABGR_8888_PRE: + case OPENVG_lXBGR_8888: + case OPENVG_lABGR_8888: + case OPENVG_lABGR_8888_PRE: + *mul = 4; + break; + + case OPENVG_sRGBA_5551: + case OPENVG_sRGBA_5551_PRE: + case OPENVG_lRGBA_5551: + case OPENVG_lRGBA_5551_PRE: + case OPENVG_sRGBA_4444: + case OPENVG_sRGBA_4444_PRE: + case OPENVG_lRGBA_4444: + case OPENVG_lRGBA_4444_PRE: + case OPENVG_sARGB_1555: + case OPENVG_sARGB_4444: + case OPENVG_sBGRA_5551: + case OPENVG_sBGRA_4444: + case OPENVG_sABGR_1555: + case OPENVG_sABGR_4444: + case OPENVG_sRGB_565: + case OPENVG_sRGB_565_PRE: + case OPENVG_sBGR_565: + case OPENVG_lRGB_565: + case OPENVG_lRGB_565_PRE: + * mul = 2; + break; + + case OPENVG_sL_8: + case OPENVG_lL_8: + case OPENVG_A_8: + break; + + case OPENVG_BW_1: + case OPENVG_A_4: + case OPENVG_A_1: + * div = 2; + break; + + default: + break; + } +} + +/* Convert VGLite target color format to HW value. */ +static uint32_t convert_target_format(vg_lite_buffer_format_t format, vg_lite_capabilities_t caps) +{ + switch(format) { + case VG_LITE_A8: + return 0x0; + + case VG_LITE_L8: + return 0x6; + + case VG_LITE_ABGR4444: + return 0x14; + + case VG_LITE_ARGB4444: + return 0x34; + + case VG_LITE_RGBA4444: + return 0x24; + + case VG_LITE_BGRA4444: + return 0x4; + + case VG_LITE_RGB565: + return 0x21; + + case VG_LITE_BGR565: + return 0x1; + + case VG_LITE_ABGR8888: + return 0x13; + + case VG_LITE_ARGB8888: + return 0x33; + + case VG_LITE_RGBA8888: + return 0x23; + + case VG_LITE_BGRA8888: + return 0x3; + + case VG_LITE_RGBX8888: + return 0x22; + + case VG_LITE_BGRX8888: + return 0x2; + + case VG_LITE_XBGR8888: + return 0x12; + + case VG_LITE_XRGB8888: + return 0x32; + + case VG_LITE_ABGR1555: + return 0x15; + + case VG_LITE_RGBA5551: + return 0x25; + + case VG_LITE_ARGB1555: + return 0x35; + + case VG_LITE_BGRA5551: + return 0x5; + + case VG_LITE_YUYV: + case VG_LITE_YUY2: + case VG_LITE_YUY2_TILED: + return 0x8; + + case VG_LITE_NV12: + case VG_LITE_NV12_TILED: + return 0xB; + + case VG_LITE_ANV12: + case VG_LITE_ANV12_TILED: + return 0xE; + + case VG_LITE_BGRA2222: + return 0x7; + + case VG_LITE_RGBA2222: + return 0x27; + + case VG_LITE_ABGR2222: + return 0x17; + + case VG_LITE_ARGB2222: + return 0x37; + + case VG_LITE_ARGB8565: + return 0x3A; + + case VG_LITE_RGBA5658: + return 0x2A; + + case VG_LITE_ABGR8565: + return 0x1A; + + case VG_LITE_BGRA5658: + return 0x0A; + + case VG_LITE_ARGB8565_PLANAR: + return 0x3C; + + case VG_LITE_RGBA5658_PLANAR: + return 0x2C; + + case VG_LITE_ABGR8565_PLANAR: + return 0x1C; + + case VG_LITE_BGRA5658_PLANAR: + return 0x0C; + + case VG_LITE_RGB888: + return 0x29; + + case VG_LITE_BGR888: + return 0x09; + + case VG_LITE_AYUY2: + case VG_LITE_AYUY2_TILED: + return 0xF; + + /* OpenVG VGImageFormat */ + + case OPENVG_sRGBX_8888: + case OPENVG_sRGBX_8888_PRE: + return 0x12; + break; + + case OPENVG_sRGBA_8888: + case OPENVG_sRGBA_8888_PRE: + return 0x13; + break; + + case OPENVG_sRGB_565: + case OPENVG_sRGB_565_PRE: + return 0x1; + break; + + case OPENVG_sRGBA_5551: + case OPENVG_sRGBA_5551_PRE: + return 0x15; + break; + + case OPENVG_sRGBA_4444: + case OPENVG_sRGBA_4444_PRE: + return 0x14; + break; + + case OPENVG_sL_8: + return 0x6; + break; + + case OPENVG_lRGBX_8888: + case OPENVG_lRGBX_8888_PRE: + return 0x12; + break; + + case OPENVG_lRGBA_8888: + case OPENVG_lRGBA_8888_PRE: + return 0x13; + break; + + case OPENVG_lRGB_565: + case OPENVG_lRGB_565_PRE: + return 0x1; + break; + + case OPENVG_lRGBA_5551: + case OPENVG_lRGBA_5551_PRE: + return 0x15; + break; + + case OPENVG_lRGBA_4444: + case OPENVG_lRGBA_4444_PRE: + return 0x14; + break; + + case OPENVG_lL_8: + return 0x6; + break; + + case OPENVG_A_8: + return 0x0; + break; + + case OPENVG_sXRGB_8888: + return 0x2; + break; + + case OPENVG_sARGB_8888: + return 0x3; + break; + + case OPENVG_sARGB_8888_PRE: + return 0x3; + break; + + case OPENVG_sARGB_1555: + return 0x5; + break; + + case OPENVG_sARGB_4444: + return 0x4; + break; + + case OPENVG_lXRGB_8888: + return 0x2; + break; + + case OPENVG_lARGB_8888: + return 0x3; + break; + + case OPENVG_lARGB_8888_PRE: + return 0x3; + break; + + case OPENVG_sBGRX_8888: + return 0x32; + break; + + case OPENVG_sBGRA_8888: + return 0x33; + break; + + case OPENVG_sBGRA_8888_PRE: + return 0x33; + break; + + case OPENVG_sBGR_565: + return 0x21; + break; + + case OPENVG_sBGRA_5551: + return 0x35; + break; + + case OPENVG_sBGRA_4444: + return 0x34; + break; + + case OPENVG_lBGRX_8888: + return 0x32; + break; + + case OPENVG_lBGRA_8888: + return 0x33; + break; + + case OPENVG_lBGRA_8888_PRE: + return 0x33; + break; + + case OPENVG_sXBGR_8888: + return 0x22; + break; + + case OPENVG_sABGR_8888: + return 0x23; + break; + + case OPENVG_sABGR_8888_PRE: + return 0x23; + break; + + case OPENVG_sABGR_1555: + return 0x25; + break; + + case OPENVG_sABGR_4444: + return 0x24; + break; + + case OPENVG_lXBGR_8888: + return 0x22; + break; + + case OPENVG_lABGR_8888: + return 0x23; + break; + + case OPENVG_lABGR_8888_PRE: + return 0x23; + break; + + default: + return 0xFF; + } +} + +#define FORMAT_ALIGNMENT(stride,align) \ + { \ + if ((stride) % (align) != 0) \ + return VG_LITE_INVALID_ARGUMENT; \ + return VG_LITE_SUCCESS; \ + } + +#if gcFEATURE_VG_16PIXELS_ALIGNED +/* Determine source IM is aligned by specified bytes */ +static vg_lite_error_t _check_source_aligned(vg_lite_buffer_format_t format, uint32_t stride) +{ + switch(format) { + case VG_LITE_A4: + case VG_LITE_INDEX_1: + case VG_LITE_INDEX_2: + case VG_LITE_INDEX_4: + FORMAT_ALIGNMENT(stride, 8); + break; + + case VG_LITE_L8: + case VG_LITE_A8: + case VG_LITE_INDEX_8: + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + case VG_LITE_RGBA8888_ETC2_EAC: + FORMAT_ALIGNMENT(stride, 16); + break; + + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_YUYV: + case VG_LITE_YUY2: + case VG_LITE_NV12: + case VG_LITE_YV12: + case VG_LITE_YV24: + case VG_LITE_YV16: + case VG_LITE_NV16: + case VG_LITE_NV24: + case VG_LITE_ABGR8565_PLANAR: + case VG_LITE_BGRA5658_PLANAR: + case VG_LITE_ARGB8565_PLANAR: + case VG_LITE_RGBA5658_PLANAR: + FORMAT_ALIGNMENT(stride, 32); + break; + + case VG_LITE_RGB888: + case VG_LITE_BGR888: + case VG_LITE_ABGR8565: + case VG_LITE_BGRA5658: + case VG_LITE_ARGB8565: + case VG_LITE_RGBA5658: + FORMAT_ALIGNMENT(stride, 48); + break; + + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + FORMAT_ALIGNMENT(stride, 64); + break; + + default: + return VG_LITE_SUCCESS; + } +} +#endif + +#if gcFEATURE_VG_SRC_BUF_ALINGED +static vg_lite_error_t _check_source_aligned_2(vg_lite_buffer_format_t format, uint32_t stride) +{ + switch(format) { + case VG_LITE_A4: + case VG_LITE_A8: + case VG_LITE_L8: + case VG_LITE_INDEX_1: + case VG_LITE_INDEX_2: + case VG_LITE_INDEX_4: + case VG_LITE_INDEX_8: + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + case VG_LITE_RGBA8888_ETC2_EAC: + FORMAT_ALIGNMENT(stride, 1); + break; + + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_YV16: + case VG_LITE_NV16: + case VG_LITE_YV12: + case VG_LITE_NV12: + case VG_LITE_YV24: + case VG_LITE_ABGR8565_PLANAR: + case VG_LITE_BGRA5658_PLANAR: + case VG_LITE_ARGB8565_PLANAR: + case VG_LITE_RGBA5658_PLANAR: + FORMAT_ALIGNMENT(stride, 2); + break; + + case VG_LITE_RGB888: + case VG_LITE_BGR888: + case VG_LITE_ABGR8565: + case VG_LITE_BGRA5658: + case VG_LITE_ARGB8565: + case VG_LITE_RGBA5658: + FORMAT_ALIGNMENT(stride, 3); + break; + + case VG_LITE_YUY2: + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + FORMAT_ALIGNMENT(stride, 4); + break; + + default: + return VG_LITE_SUCCESS; + } +} + +static vg_lite_error_t _check_source_aligned_3(vg_lite_buffer_format_t format, uint32_t stride) +{ + switch(format) { + case VG_LITE_INDEX_1: + case VG_LITE_INDEX_2: + FORMAT_ALIGNMENT(stride, 1); + break; + + case VG_LITE_A4: + case VG_LITE_INDEX_4: + FORMAT_ALIGNMENT(stride, 2); + break; + + case VG_LITE_A8: + case VG_LITE_L8: + case VG_LITE_YV24: + case VG_LITE_INDEX_8: + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + case VG_LITE_RGBA8888_ETC2_EAC: + FORMAT_ALIGNMENT(stride, 4); + break; + + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_YUY2: + case VG_LITE_YV12: + case VG_LITE_NV12: + case VG_LITE_ABGR8565_PLANAR: + case VG_LITE_BGRA5658_PLANAR: + case VG_LITE_ARGB8565_PLANAR: + case VG_LITE_RGBA5658_PLANAR: + FORMAT_ALIGNMENT(stride, 8); + break; + + case VG_LITE_RGB888: + case VG_LITE_BGR888: + case VG_LITE_ABGR8565: + case VG_LITE_BGRA5658: + case VG_LITE_ARGB8565: + case VG_LITE_RGBA5658: + FORMAT_ALIGNMENT(stride, 12); + break; + + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + FORMAT_ALIGNMENT(stride, 16); + break; + + default: + return VG_LITE_SUCCESS; + } +} +#endif + +#if gcFEATURE_VG_FORMAT_SUPPORT_CHECK +static vg_lite_error_t _check_format_support_1(vg_lite_buffer_format_t format) +{ + switch(format) { + case VG_LITE_A8: + case VG_LITE_L8: + case VG_LITE_RGBA2222: + case VG_LITE_BGRA2222: + case VG_LITE_ABGR2222: + case VG_LITE_ARGB2222: + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_ABGR4444: + case VG_LITE_ARGB4444: + case VG_LITE_BGRA5551: + case VG_LITE_RGBA5551: + case VG_LITE_ABGR1555: + case VG_LITE_ARGB1555: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_RGB888: + case VG_LITE_BGR888: + case VG_LITE_ABGR8565: + case VG_LITE_BGRA5658: + case VG_LITE_ARGB8565: + case VG_LITE_RGBA5658: + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_ABGR8888: + case VG_LITE_ARGB8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_XBGR8888: + case VG_LITE_XRGB8888: + break; + default: + return VG_LITE_NOT_SUPPORT; + } + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t _check_format_support_2(vg_lite_buffer_format_t format) +{ + switch(format) { + case VG_LITE_INDEX_1: + case VG_LITE_INDEX_2: + case VG_LITE_INDEX_4: + case VG_LITE_INDEX_8: + case VG_LITE_A4: + case VG_LITE_YUY2: + case VG_LITE_YUY2_TILED: + case VG_LITE_RGBA8888_ETC2_EAC: + break; + default: + return VG_LITE_NOT_SUPPORT; + } + + return VG_LITE_SUCCESS; +} +#endif + +vg_lite_error_t srcbuf_align_check(vg_lite_buffer_t * source) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_FORMAT_SUPPORT_CHECK + if(_check_format_support_1(source->format) && _check_format_support_2(source->format)) { + return VG_LITE_NOT_SUPPORT; + } +#endif + +#if gcFEATURE_VG_SRC_ADDRESS_64BYTES_ALIGNED + uint32_t align, mul, div, bpp; + get_format_bytes(source->format, &mul, &div, &align); + bpp = 8 * mul / div; + + if(bpp == 8) { + if((uint32_t)(source->address) % 16 != 0) { + printf("buffer address need to be aglined to 16 bytes."); + return VG_LITE_INVALID_ARGUMENT; + } + } + else if(bpp == 16) { + if((uint32_t)(source->address) % 32 != 0) { + printf("buffer address need to be aglined to 32 bytes."); + return VG_LITE_INVALID_ARGUMENT; + } + } + else if(bpp == 24 || bpp == 32) { + if((uint32_t)(source->address) % 64 != 0) { + printf("buffer address need to be aglined to 64 bytes."); + return VG_LITE_INVALID_ARGUMENT; + } + } + else { + if((uint32_t)(source->address) % 8 != 0) { + printf("buffer address need to be aglined to 8 bytes."); + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif + +#if gcFEATURE_VG_SRC_BUF_ALINGED +#if gcFEATURE_VG_SRC_ADDRESS_16BYTES_ALIGNED + if(source->format == VG_LITE_ARGB8888 || + source->format == VG_LITE_BGRA8888 || + source->format == VG_LITE_ABGR8888 || + source->format == VG_LITE_ARGB8888 + ) { + if((uint32_t)(source->address) % 16 != 0) { + printf("buffer address need to be aglined to 16 bytes."); + return VG_LITE_INVALID_ARGUMENT; + } + } + else +#endif + { + if((uint32_t)(source->address) % 8 != 0) { + printf("buffer address need to be aglined to 8 bytes."); + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif + + if(source->tiled == VG_LITE_TILED) { +#if gcFEATURE_VG_SRC_TILE_4PIXELS_ALIGNED + uint32_t align, mul, div; + get_format_bytes(source->format, &mul, &div, &align); + if((source->stride % (4 * mul / div) != 0) || (source->height % 4 != 0)) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif + +#if gcFEATURE_VG_SRC_BUF_ALINGED + vg_lite_error_t error; + error = _check_source_aligned_3(source->format, source->stride); + if(error != VG_LITE_SUCCESS) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif + +#if gcFEATURE_VG_YUV_ALIGNED_CHECK + if(source->format == VG_LITE_YUY2) { + if(source->address % 32 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(source->tiled) { + if(source->stride % 8 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + else { + if(source->stride % 32 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + } +#endif + } + + if(source->tiled == VG_LITE_LINEAR) { +#if gcFEATURE_VG_16PIXELS_ALIGNED + uint32_t align, mul, div; + get_format_bytes(source->format, &mul, &div, &align); + if(source->stride % (16 * mul / div) != 0) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif + +#if gcFEATURE_VG_SRC_BUF_ALINGED + vg_lite_error_t error; + error = _check_source_aligned_2(source->format, source->stride); + if(error != VG_LITE_SUCCESS) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif + +#if gcFEATURE_VG_YUV_ALIGNED_CHECK + if(source->format == VG_LITE_NV12 || source->format == VG_LITE_NV16) { + if(source->address % 32 != 0 || source->stride % 32 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(source->yuv.uv_planar % 32 != 0 || source->yuv.uv_stride % 32 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(source->format == VG_LITE_YV12 || source->format == VG_LITE_YV16) { + if(source->address % 32 != 0 || source->stride % 32 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(source->yuv.uv_planar % 16 != 0 || source->yuv.uv_stride % 16 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(source->yuv.v_planar % 16 != 0 || source->yuv.v_stride % 16 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(source->format == VG_LITE_YV24) { + if(source->address % 32 != 0 || source->stride % 32 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(source->yuv.uv_planar % 32 != 0 || source->yuv.uv_stride % 32 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(source->yuv.v_planar % 32 != 0 || source->yuv.v_stride % 32 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif + } + + + if(source->compress_mode != VG_LITE_DEC_DISABLE) { +#if (gcFEATURE_VG_DEC_COMPRESS || gcFEATURE_VG_DEC_COMPRESS_2_0) +#if gcFEATURE_VG_DEC_COMPRESS_2_0 + if(source->format == VG_LITE_BGRA8888 || source->format == VG_LITE_BGRX8888) { + if((source->stride * source->height) % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(source->format == VG_LITE_BGR888) { + if((source->stride * source->height) % 48 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#else + if(source->format == VG_LITE_BGRX8888 || source->format == VG_LITE_RGBX8888 + || source->format == VG_LITE_BGRA8888 || source->format == VG_LITE_RGBA8888) { + if((source->stride * source->height) % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(source->format == VG_LITE_RGB888 || source->format == VG_LITE_BGR888) { + if((source->stride * source->height) % 48 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif +#endif + } + + return error; +} + +vg_lite_error_t dstbuf_align_check(vg_lite_buffer_t * target) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t align, mul, div, bpp; + uint32_t tile_flag = 0; + uint32_t tile_flag1 = 0; + get_format_bytes(target->format, &mul, &div, &align); + bpp = 8 * mul / div; + +#if gcFEATURE_VG_FORMAT_SUPPORT_CHECK + if(_check_format_support_1(target->format)) { + return VG_LITE_NOT_SUPPORT; + } +#endif + +#if gcFEATURE_VG_DST_TILE_4PIXELS_ALIGNED + if(target->tiled == VG_LITE_TILED) { + if((target->stride % (4 * mul / div) != 0) || (target->height % 4 != 0)) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif + + if(target->compress_mode == VG_LITE_DEC_DISABLE) { +#if gcFEATURE_VG_DST_BUF_ALIGNED + if(target->tiled == VG_LITE_TILED) { + if(bpp == 8 || bpp == 16 || bpp == 32) { + if(target->stride % (4 * mul / div)) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) { + if(target->stride % 12 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(target->format >= VG_LITE_ABGR8565_PLANAR && target->format <= VG_LITE_RGBA5658_PLANAR) { + if(target->stride % 8 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + } + else { + if(bpp == 8 || bpp == 16 || bpp == 32) { + if(target->stride % (mul / div)) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) { + if(target->stride % 3 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(target->format >= VG_LITE_ABGR8565_PLANAR && target->format <= VG_LITE_RGBA5658_PLANAR) { + if(target->stride % 2 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + } + + if(bpp == 8 || bpp == 16 || bpp == 32) { + if((uint32_t)(target->address) % 4 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) { + if((uint32_t)(target->address) % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif + +#if gcFEATURE_VG_DST_ADDRESS_64BYTES_ALIGNED + if((uint32_t)(target->address) % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif + +#if gcFEATURE_VG_DST_24BIT_PLANAR_ALIGNED + if(target->format >= VG_LITE_ABGR8565_PLANAR && target->format <= VG_LITE_RGBA5658_PLANAR) { + if((uint32_t)(target->address) % 32 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + if((uint32_t)(target->yuv.alpha_planar) % 16 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif + } + else { +#if (gcFEATURE_VG_DEC_COMPRESS || gcFEATURE_VG_DEC_COMPRESS_2_0) + if((uint32_t)(target->address) % 64 != 0) { + printf("target address need to be aligned to 64 bytes."); + return VG_LITE_INVALID_ARGUMENT; + } + +#if gcFEATURE_VG_DEC_COMPRESS_2_0 + if(target->format == VG_LITE_BGRA8888 || target->format == VG_LITE_BGRX8888) { + if((target->stride * target->height) % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(target->format == VG_LITE_BGR888) { + if((target->stride * target->height) % 48 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#else + if(target->format == VG_LITE_BGRX8888 || target->format == VG_LITE_RGBX8888 + || target->format == VG_LITE_BGRA8888 || target->format == VG_LITE_RGBA8888) { + if((target->stride * target->height) % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(target->format == VG_LITE_RGB888 || target->format == VG_LITE_BGR888) { + if((target->stride * target->height) % 48 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif +#endif + } + + if(target->tiled == VG_LITE_TILED) { +#if gcFEATURE_VG_RECTANGLE_TILED_OUT + tile_flag1 = 1; +#else + tile_flag1 = 0; +#endif + tile_flag = 1; + } + +#if (gcFEATURE_VG_TILED_LIMIT == 1) + if(tile_flag1 ^ tile_flag) { + if(bpp != 24) { + if(target->stride % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + else { + if(target->stride % 48 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + } +#elif (gcFEATURE_VG_TILED_LIMIT == 2) + if(tile_flag1 ^ tile_flag) { + return VG_LITE_INVALID_ARGUMENT; + } +#elif (gcFEATURE_VG_TILED_LIMIT == 3) + if(target->address % 4 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(target->stride % (mul / div) != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + if(target->compress_mode || bpp == 24) { + if(target->address % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + if(target->tiled) { + if(bpp != 24) { + if(target->stride % 16 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + else { + if(target->stride % 12 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + if(target->address % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(tile_flag1 ^ tile_flag) { + if(target->address % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + if(bpp != 24) { + if(target->stride % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + else { + if(target->stride % 48 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + } +#endif + return error; +} + + +/* Convert VGLite source color format to HW values. */ +uint32_t convert_source_format(vg_lite_buffer_format_t format) +{ + switch(format) { + case VG_LITE_L8: + return 0x0; + + case VG_LITE_A4: + return 0x1; + + case VG_LITE_A8: + return 0x2; + + case VG_LITE_RGBA4444: + return 0x23; + + case VG_LITE_BGRA4444: + return 0x3; + + case VG_LITE_ABGR4444: + return 0x13; + + case VG_LITE_ARGB4444: + return 0x33; + + case VG_LITE_RGB565: + return 0x25; + + case VG_LITE_BGR565: + return 0x5; + + case VG_LITE_RGBA8888: + return 0x27; + + case VG_LITE_BGRA8888: + return 0x7; + + case VG_LITE_ABGR8888: + return 0x17; + + case VG_LITE_ARGB8888: + return 0x37; + + case VG_LITE_RGBX8888: + return 0x26; + + case VG_LITE_BGRX8888: + return 0x6; + + case VG_LITE_XBGR8888: + return 0x16; + + case VG_LITE_XRGB8888: + return 0x36; + + case VG_LITE_BGRA5551: + return 0x4; + + case VG_LITE_RGBA5551: + return 0x24; + + case VG_LITE_ABGR1555: + return 0x14; + + case VG_LITE_ARGB1555: + return 0x34; + + case VG_LITE_YUYV: + return 0x8; + + case VG_LITE_YUY2: + case VG_LITE_YUY2_TILED: + return 0x8; + + case VG_LITE_NV12: + case VG_LITE_NV12_TILED: + return 0xB; + + case VG_LITE_ANV12: + case VG_LITE_ANV12_TILED: + return 0xE; + + case VG_LITE_YV12: + return 0x9; + + case VG_LITE_YV24: + return 0xD; + + case VG_LITE_YV16: + return 0xC; + + case VG_LITE_NV16: + return 0xA; + + case VG_LITE_NV24: + case VG_LITE_NV24_TILED: + return 0xD | (1 << 19); + + case VG_LITE_AYUY2: + case VG_LITE_AYUY2_TILED: + return 0xF; + + case VG_LITE_INDEX_1: + return 0x200; + + case VG_LITE_INDEX_2: + return 0x400; + + case VG_LITE_INDEX_4: + return 0x600; + + case VG_LITE_INDEX_8: + return 0x800; + + case VG_LITE_RGBA2222: + return 0xA20; + + case VG_LITE_BGRA2222: + return 0xA00; + + case VG_LITE_ABGR2222: + return 0xA10; + + case VG_LITE_ARGB2222: + return 0xA30; + + case VG_LITE_RGBA8888_ETC2_EAC: + return 0xE00; + + case VG_LITE_ARGB8565: + return 0x40000030; + + case VG_LITE_RGBA5658: + return 0x40000020; + + case VG_LITE_ABGR8565: + return 0x40000010; + + case VG_LITE_BGRA5658: + return 0x40000000; + + case VG_LITE_RGB888: + return 0x20000020; + + case VG_LITE_BGR888: + return 0x20000000; + + case VG_LITE_ARGB8565_PLANAR: + return 0x60000030; + + case VG_LITE_RGBA5658_PLANAR: + return 0x60000020; + + case VG_LITE_ABGR8565_PLANAR: + return 0x60000010; + + case VG_LITE_BGRA5658_PLANAR: + return 0x60000000; + + /* OpenVG VGImageFormat */ + case OPENVG_sRGBX_8888: + case OPENVG_sRGBX_8888_PRE: + return 0x16; + break; + + case OPENVG_sRGBA_8888: + case OPENVG_sRGBA_8888_PRE: + return 0x17; + break; + + case OPENVG_sRGB_565: + case OPENVG_sRGB_565_PRE: + return 0x5; + break; + + case OPENVG_sRGBA_5551: + case OPENVG_sRGBA_5551_PRE: + return 0x14; + break; + + case OPENVG_sRGBA_4444: + case OPENVG_sRGBA_4444_PRE: + return 0x13; + break; + + case OPENVG_sL_8: + return 0x0; + break; + + case OPENVG_lRGBX_8888: + case OPENVG_lRGBX_8888_PRE: + return 0x16; + break; + + case OPENVG_lRGBA_8888: + case OPENVG_lRGBA_8888_PRE: + return 0x17; + break; + + case OPENVG_lRGB_565: + case OPENVG_lRGB_565_PRE: + return 0x5; + break; + + case OPENVG_lRGBA_5551: + case OPENVG_lRGBA_5551_PRE: + return 0x14; + break; + + case OPENVG_lRGBA_4444: + case OPENVG_lRGBA_4444_PRE: + return 0x13; + break; + + case OPENVG_lL_8: + return 0x0; + break; + + case OPENVG_A_8: + return 0x2; + break; + + case OPENVG_BW_1: + return 0x200; + break; + + case OPENVG_A_1: + return 0x1; + break; + + case OPENVG_A_4: + return 0x1; + break; + + case OPENVG_sXRGB_8888: + return 0x6; + break; + + case OPENVG_sARGB_8888: + return 0x7; + break; + + case OPENVG_sARGB_8888_PRE: + return 0x7; + break; + + case OPENVG_sARGB_1555: + return 0x4; + break; + + case OPENVG_sARGB_4444: + return 0x3; + break; + + case OPENVG_lXRGB_8888: + return 0x6; + break; + + case OPENVG_lARGB_8888: + return 0x7; + break; + case OPENVG_lARGB_8888_PRE: + return 0x7; + break; + + case OPENVG_sBGRX_8888: + return 0x36; + break; + + case OPENVG_sBGRA_8888: + return 0x37; + break; + + case OPENVG_sBGRA_8888_PRE: + return 0x37; + break; + + case OPENVG_sBGR_565: + return 0x25; + break; + + case OPENVG_sBGRA_5551: + return 0x34; + break; + + case OPENVG_sBGRA_4444: + return 0x33; + break; + + case OPENVG_lBGRX_8888: + return 0x36; + break; + + case OPENVG_lBGRA_8888: + return 0x37; + break; + + case OPENVG_lBGRA_8888_PRE: + return 0x37; + break; + + case OPENVG_sXBGR_8888: + return 0x26; + break; + + case OPENVG_sABGR_8888: + return 0x27; + break; + + case OPENVG_sABGR_8888_PRE: + return 0x27; + break; + + case OPENVG_sABGR_1555: + return 0x24; + break; + + case OPENVG_sABGR_4444: + return 0x23; + break; + + case OPENVG_lXBGR_8888: + return 0x26; + break; + + case OPENVG_lABGR_8888: + return 0x27; + break; + + case OPENVG_lABGR_8888_PRE: + return 0x27; + break; + + default: + return 0; + break; + } +} + +/* Convert VGLite blend modes to HW values. */ +uint32_t convert_blend(vg_lite_blend_t blend) +{ + switch(blend) { + case VG_LITE_BLEND_SRC_OVER: + case VG_LITE_BLEND_NORMAL_LVGL: + case OPENVG_BLEND_SRC_OVER: + return 0x00000100; + + case VG_LITE_BLEND_DST_OVER: + case OPENVG_BLEND_DST_OVER: + return 0x00000200; + + case VG_LITE_BLEND_SRC_IN: + case OPENVG_BLEND_SRC_IN: + return 0x00000300; + + case VG_LITE_BLEND_DST_IN: + case OPENVG_BLEND_DST_IN: + return 0x00000400; + + case VG_LITE_BLEND_MULTIPLY: + case VG_LITE_BLEND_MULTIPLY_LVGL: + case OPENVG_BLEND_MULTIPLY: + return 0x00000500; + + case VG_LITE_BLEND_SCREEN: + case OPENVG_BLEND_SCREEN: + return 0x00000600; + + case VG_LITE_BLEND_DARKEN: + case OPENVG_BLEND_DARKEN: + return 0x00000700; + + case VG_LITE_BLEND_LIGHTEN: + case OPENVG_BLEND_LIGHTEN: + return 0x00000800; + + case VG_LITE_BLEND_ADDITIVE: + case VG_LITE_BLEND_ADDITIVE_LVGL: + case OPENVG_BLEND_ADDITIVE: + return 0x00000900; + + case VG_LITE_BLEND_SUBTRACT: + return 0x00000A00; + + case VG_LITE_BLEND_SUBTRACT_LVGL: +#if gcFEATURE_VG_LVGL_SUPPORT + return 0x00000C00; +#else + return 0x00000A00; +#endif + + default: + return 0; + } +} + +/* Convert VGLite uv swizzle enums to HW values. */ +uint32_t convert_uv_swizzle(vg_lite_swizzle_t swizzle) +{ + switch(swizzle) { + case VG_LITE_SWIZZLE_UV: + return 0x00000040; + break; + + case VG_LITE_SWIZZLE_VU: + return 0x00000050; + + default: + return 0; + break; + } +} + +/* Convert VGLite yuv standard enums to HW values. */ +uint32_t convert_yuv2rgb(vg_lite_yuv2rgb_t yuv) +{ + switch(yuv) { + case VG_LITE_YUV601: + return 0; + break; + + case VG_LITE_YUV709: + return 0x00008000; + + default: + return 0; + break; + } +} + +static vg_lite_error_t submit(vg_lite_context_t * context); +static vg_lite_error_t stall(vg_lite_context_t * context, uint32_t time_ms, uint32_t mask); + +/* Push a state array into current command buffer. */ +vg_lite_error_t push_clut(vg_lite_context_t * context, uint32_t address, uint32_t count, uint32_t * data) +{ + uint32_t i; + vg_lite_error_t error; + if(!has_valid_command_buffer(context)) + return VG_LITE_NO_CONTEXT; + + if(CMDBUF_OFFSET(*context) + 8 + VG_LITE_ALIGN(count + 1, 2) * 4 >= CMDBUF_SIZE(*context)) { + VG_LITE_RETURN_ERROR(submit(context)); + VG_LITE_RETURN_ERROR(stall(context, 0, (uint32_t)~0)); + } + + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_STATES(count, address); + + for(i = 0; i < count; i++) { + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1 + i] = data[i]; + } + if(i % 2 == 0) { + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1 + i] = VG_LITE_NOP(); + } + +#if DUMP_COMMAND + { + uint32_t loops; + if(strncmp(filename, "Commandbuffer", 13)) { + sprintf(filename, "Commandbuffer_pid%d.txt", getpid()); + } + + fp = fopen(filename, "a"); + + if(fp == NULL) + printf("error!\n"); + + fprintf(fp, "Command buffer: 0x%08x, ", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0]); + + for(loops = 0; loops < count / 2; loops++) { + fprintf(fp, "0x%08x,\nCommand buffer: 0x%08x, ", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[(loops + 1) * 2 - 1], + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[(loops + 1) * 2]); + } + + fprintf(fp, "0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[(loops + 1) * 2 - 1]); + + fclose(fp); + fp = NULL; + } +#endif + + CMDBUF_OFFSET(*context) += VG_LITE_ALIGN(count + 1, 2) * 4; + + return VG_LITE_SUCCESS; +} + +/* Push a single state command into the current command buffer. */ +vg_lite_error_t push_state(vg_lite_context_t * context, uint32_t address, uint32_t data) +{ + vg_lite_error_t error; + if(!has_valid_command_buffer(context)) + return VG_LITE_NO_CONTEXT; + + /* TODO wait for hw to complete development. */ + /* if (address == 0x0A1B || context->hw.hw_states[address & 0xff].state != data || !context->hw.hw_states[address & 0xff].init) */ + { + if(CMDBUF_OFFSET(*context) + 16 >= CMDBUF_SIZE(*context)) { + VG_LITE_RETURN_ERROR(submit(context)); + VG_LITE_RETURN_ERROR(stall(context, 0, (uint32_t)~0)); + } + + /* TODO context->hw.hw_states[address & 0xff].state = data; + context->hw.hw_states[address & 0xff].init = 1;*/ + + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_STATE(address); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1] = data; + +#if DUMP_COMMAND + if(strncmp(filename, "Commandbuffer", 13)) { + sprintf(filename, "Commandbuffer_pid%d.txt", getpid()); + } + + fp = fopen(filename, "a"); + + if(fp == NULL) + printf("error!\n"); + + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0], + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1]); + + fclose(fp); + fp = NULL; +#endif + + CMDBUF_OFFSET(*context) += 8; + } + + return VG_LITE_SUCCESS; +} + +/* Push a single state command with given address. */ +vg_lite_error_t push_state_ptr(vg_lite_context_t * context, uint32_t address, void * data_ptr) +{ + vg_lite_error_t error; + uint32_t data = *(uint32_t *) data_ptr; + if(!has_valid_command_buffer(context)) + return VG_LITE_NO_CONTEXT; + + /* TODO wait for hw to complete development. */ + /* if (address == 0x0A1B || context->hw.hw_states[address & 0xff].state != data || !context->hw.hw_states[address & 0xff].init) */ + { + if(CMDBUF_OFFSET(*context) + 16 >= CMDBUF_SIZE(*context)) { + VG_LITE_RETURN_ERROR(submit(context)); + VG_LITE_RETURN_ERROR(stall(context, 0, (uint32_t)~0)); + } + + /* TODO context->hw.hw_states[address & 0xff].state = data; + context->hw.hw_states[address & 0xff].init = 1;*/ + + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_STATE(address); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1] = data; + +#if DUMP_COMMAND + if(strncmp(filename, "Commandbuffer", 13)) { + sprintf(filename, "Commandbuffer_pid%d.txt", getpid()); + } + + fp = fopen(filename, "a"); + + if(fp == NULL) + printf("error!\n"); + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0], + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1]); + + fclose(fp); + fp = NULL; +#endif + + CMDBUF_OFFSET(*context) += 8; + } + + return VG_LITE_SUCCESS; +} + +/* Push a "call" command into the current command buffer. */ +vg_lite_error_t push_call(vg_lite_context_t * context, uint32_t address, uint32_t bytes) +{ + vg_lite_error_t error; + if(!has_valid_command_buffer(context)) + return VG_LITE_NO_CONTEXT; + + if(CMDBUF_OFFSET(*context) + 16 >= CMDBUF_SIZE(*context)) { + VG_LITE_RETURN_ERROR(submit(context)); + VG_LITE_RETURN_ERROR(stall(context, 0, (uint32_t)~0)); + } + + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_CALL((bytes + 7) / 8); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1] = address; + +#if DUMP_COMMAND + if(strncmp(filename, "Commandbuffer", 13)) { + sprintf(filename, "Commandbuffer_pid%d.txt", getpid()); + } + + fp = fopen(filename, "a"); + + if(fp == NULL) + printf("error!\n"); + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0], + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1]); + + fclose(fp); + fp = NULL; +#endif + + CMDBUF_OFFSET(*context) += 8; + +#if !gcFEATURE_VG_CMD_CALL_FIX + VG_LITE_RETURN_ERROR(push_stall(&s_context, 0x10)); +#endif + + return VG_LITE_SUCCESS; +} + +#if gcFEATURE_VG_PE_CLEAR +static vg_lite_error_t push_pe_clear(vg_lite_context_t * context, uint32_t size) +{ + vg_lite_error_t error; + if(!has_valid_command_buffer(context)) + return VG_LITE_NO_CONTEXT; + + if(CMDBUF_OFFSET(*context) + 16 >= CMDBUF_SIZE(*context)) { + VG_LITE_RETURN_ERROR(submit(context)); + VG_LITE_RETURN_ERROR(stall(context, 0, (uint32_t)~0)); + } + + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_DATA(1); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1] = 0; + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[2] = size; + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[3] = 0; + + CMDBUF_OFFSET(*context) += 16; + + return VG_LITE_SUCCESS; +} +#endif + +/* Push a rectangle command into the current command buffer. */ +static vg_lite_error_t push_rectangle(vg_lite_context_t * context, int32_t x, int32_t y, int32_t width, int32_t height) +{ + vg_lite_error_t error; + if(!has_valid_command_buffer(context)) + return VG_LITE_NO_CONTEXT; + + if(CMDBUF_OFFSET(*context) + 16 >= CMDBUF_SIZE(*context)) { + VG_LITE_RETURN_ERROR(submit(context)); + VG_LITE_RETURN_ERROR(stall(context, 0, (uint32_t)~0)); + } + + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_DATA(1); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1] = 0; + ((uint16_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[4] = (uint16_t)x; + ((uint16_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[5] = (uint16_t)y; + ((uint16_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[6] = (uint16_t)width; + ((uint16_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[7] = (uint16_t)height; + +#if DUMP_COMMAND + if(strncmp(filename, "Commandbuffer", 13)) { + sprintf(filename, "Commandbuffer_pid%d.txt", getpid()); + } + + fp = fopen(filename, "a"); + + if(fp == NULL) + printf("error!\n"); + + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0], 0); + + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint16_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[5] << 16 | + ((uint16_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[4], + ((uint16_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[7] << 16 | + ((uint16_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[6]); + + fclose(fp); + fp = NULL; +#endif + + CMDBUF_OFFSET(*context) += 16; + + return VG_LITE_SUCCESS; +} + +/* Push a data array into the current command buffer. */ +vg_lite_error_t push_data(vg_lite_context_t * context, uint32_t size, void * data) +{ + vg_lite_error_t error; + uint32_t bytes = VG_LITE_ALIGN(size, 8); + + if(!has_valid_command_buffer(context)) + return VG_LITE_NO_CONTEXT; + + if(CMDBUF_OFFSET(*context) + 16 + bytes >= CMDBUF_SIZE(*context)) { + VG_LITE_RETURN_ERROR(submit(context)); + VG_LITE_RETURN_ERROR(stall(context, 0, (uint32_t)~0)); + } + + /* Command buffer size must be at least data size "bytes" plus header and END command */ + if((bytes + 16) > CMDBUF_SIZE(*context)) { + printf("Command buffer size needs increase for data sized %d bytes!\n", (int)(bytes + 16)); + return VG_LITE_OUT_OF_RESOURCES; + } + + ((uint64_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[(bytes >> 3)] = 0; + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_DATA((bytes >> 3)); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1] = 0; + memcpy(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context) + 8, data, size); + +#if DUMP_COMMAND + { + int32_t loops; + + if(strncmp(filename, "Commandbuffer", 13)) { + sprintf(filename, "Commandbuffer_pid%d.txt", getpid()); + } + + fp = fopen(filename, "a"); + + if(fp == NULL) + printf("error!\n"); + + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0], 0); + for(loops = 0; loops < (bytes >> 3); loops++) { + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[(loops + 1) * 2], + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[(loops + 1) * 2 + 1]); + } + + fclose(fp); + fp = NULL; + } +#endif + + CMDBUF_OFFSET(*context) += 8 + bytes; + + return VG_LITE_SUCCESS; +} + +/* Push a "stall" command into the current command buffer. */ +vg_lite_error_t push_stall(vg_lite_context_t * context, uint32_t module) +{ + vg_lite_error_t error; + if(!has_valid_command_buffer(context)) + return VG_LITE_NO_CONTEXT; + + if(CMDBUF_OFFSET(*context) + 16 >= CMDBUF_SIZE(*context)) { + VG_LITE_RETURN_ERROR(submit(context)); + VG_LITE_RETURN_ERROR(stall(context, 0, (uint32_t)~0)); + } + + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_SEMAPHORE(module); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1] = 0; + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[2] = VG_LITE_STALL(module); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[3] = 0; + +#if DUMP_COMMAND + if(strncmp(filename, "Commandbuffer", 13)) { + sprintf(filename, "Commandbuffer_pid%d.txt", getpid()); + } + + fp = fopen(filename, "a"); + + if(fp == NULL) + printf("error!\n"); + + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0], 0); + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[2], 0); + + fclose(fp); + fp = NULL; +#endif + + CMDBUF_OFFSET(*context) += 16; + + return VG_LITE_SUCCESS; +} + +/* Submit the current command buffer to HW and reset the current command buffer offset. */ +static vg_lite_error_t submit(vg_lite_context_t * context) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_submit_t submit; + +#if gcdVG_ENABLE_DELAY_RESUME + vg_lite_kernel_delay_resume_t delay_resume; + delay_resume.query_delay_resume = 1; + int resume_flag = vg_lite_kernel(VG_LITE_QUERY_DELAY_RESUME, &delay_resume); + + if(resume_flag == 1) { + /* Reset GPU. */ + vg_lite_kernel_reset_t reset; + reset.delay_resume_flag = 1; + vg_lite_kernel(VG_LITE_RESET, &reset); + printf("Delay resume success! \n"); + +#ifdef __ZEPHYR__ + /* If delay resume is enabled, power and clock would be turned on during the reset process. */ + /* Disable GPU clocking*/ + vg_lite_kernel_gpu_clock_state_t gpu_state; + gpu_state.state = VG_LITE_GPU_STOP; + vg_lite_kernel(VG_LITE_SET_GPU_CLOCK_STATE, &gpu_state); +#endif + } +#endif + + /* Check if there is a valid context and an allocated command buffer. */ + if(!has_valid_command_buffer(context)) + return VG_LITE_NO_CONTEXT; + + /* Check if there is anything to submit. */ + if(CMDBUF_OFFSET(*context) == 0) + return VG_LITE_INVALID_ARGUMENT; + +#if 0 + /* This case is safe as command buffer is allocated with (command_buffer_size + 8) bytes */ + if(CMDBUF_OFFSET(*context) + 8 >= CMDBUF_SIZE(*context)) { + /* Reset command buffer offset. */ + CMDBUF_OFFSET(*context) = 0; + return VG_LITE_OUT_OF_RESOURCES; + } +#endif + + /* Append END command into the command buffer. */ + if(s_context.frame_flag == VG_LITE_FRAME_END_FLAG) { + /* A interrupt will be received to indicate that the GPU is idle. */ + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_END(EVENT_FRAME_END); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1] = 0; + } + else { + /* A interrupt will be received to indicate that the GPU has completed the current instruction. */ + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0] = VG_LITE_END(EVENT_END); + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[1] = 0; + } + + s_context.frame_flag = 0; + +#if DUMP_COMMAND + if(strncmp(filename, "Commandbuffer", 13)) { + sprintf(filename, "Commandbuffer_pid%d.txt", getpid()); + } + + fp = fopen(filename, "a"); + + if(fp == NULL) + printf("error!\n"); + + fprintf(fp, "Command buffer: 0x%08x, 0x%08x,\n", + ((uint32_t *)(CMDBUF_BUFFER(*context) + CMDBUF_OFFSET(*context)))[0], 0); + + fprintf(fp, "Command buffer addr is : %p,\n", CMDBUF_BUFFER(*context)); + fprintf(fp, "Command buffer offset is : %d,\n", CMDBUF_OFFSET(*context) + 8); + + fclose(fp); + fp = NULL; +#endif + + CMDBUF_OFFSET(*context) += 8; + + /* Submit the command buffer. */ + submit.context = &context->context; + submit.commands = CMDBUF_BUFFER(*context); + submit.command_size = CMDBUF_OFFSET(*context); + submit.command_id = CMDBUF_INDEX(*context); + +#if DUMP_LAST_CAPTURE + //backup command + context->Physical = (size_t)CMDBUF_BUFFER(*context); + context->last_command_buffer_logical = submit.context->command_buffer_logical[CMDBUF_INDEX(*context)]; + context->last_command_size = submit.command_size; +#endif + /* Wait if GPU has not completed previous CMD buffer */ + if(submit_flag) { + VG_LITE_RETURN_ERROR(stall(&s_context, 0, (uint32_t)~0)); + } + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_SUBMIT, &submit)); + + submit_flag = 1; + + vglitemDUMP_BUFFER("command", (size_t)CMDBUF_BUFFER(*context), + submit.context->command_buffer_logical[CMDBUF_INDEX(*context)], 0, submit.command_size); +#if !DUMP_COMMAND_CAPTURE + vglitemDUMP("@[commit]"); +#endif + +#if DUMP_INIT_COMMAND + is_init++; +#endif + + /* Reset command buffer. */ + CMDBUF_OFFSET(*context) = 0; + + return error; +} + +/* Wait for the HW to finish the current execution. */ +static vg_lite_error_t stall(vg_lite_context_t * context, uint32_t time_ms, uint32_t mask) +{ +#if !defined(_WINDLL) + vg_lite_error_t error; +#endif + vg_lite_kernel_wait_t wait; + +#if !DUMP_COMMAND_BY_USER +#if !DUMP_COMMAND_CAPTURE + vglitemDUMP("@[stall]"); +#endif +#endif + + /* Wait until GPU is ready. */ + wait.context = &context->context; + wait.timeout_ms = time_ms > 0 ? time_ms : VG_LITE_INFINITE; + wait.event_mask = mask; + wait.reset_type = RESTORE_ALL_COMMAND; +#if defined(_WINDLL) + vg_lite_kernel(VG_LITE_WAIT, &wait); +#else +#if !DUMP_LAST_CAPTURE + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_WAIT, &wait)); +#else + error = vg_lite_kernel(VG_LITE_WAIT, &wait); +#endif +#endif +#if DUMP_LAST_CAPTURE +#if !defined(_WINDLL) + if(error == VG_LITE_TIMEOUT) { + vglitemDUMP_BUFFER_single("command", context->Physical, + context->last_command_buffer_logical, 0, context->last_command_size); + } +#endif +#endif + submit_flag = 0; + return VG_LITE_SUCCESS; +} + +/* Get the inversion of a matrix. */ +uint32_t inverse(vg_lite_matrix_t * result, vg_lite_matrix_t * matrix) +{ + vg_lite_float_t det00, det01, det02; + vg_lite_float_t d; + int32_t isAffine; + + /* Test for identity matrix. */ + if(matrix == NULL) { + result->m[0][0] = 1.0f; + result->m[0][1] = 0.0f; + result->m[0][2] = 0.0f; + result->m[1][0] = 0.0f; + result->m[1][1] = 1.0f; + result->m[1][2] = 0.0f; + result->m[2][0] = 0.0f; + result->m[2][1] = 0.0f; + result->m[2][2] = 1.0f; + + /* Success. */ + return 1; + } + + det00 = (matrix->m[1][1] * matrix->m[2][2]) - (matrix->m[2][1] * matrix->m[1][2]); + det01 = (matrix->m[2][0] * matrix->m[1][2]) - (matrix->m[1][0] * matrix->m[2][2]); + det02 = (matrix->m[1][0] * matrix->m[2][1]) - (matrix->m[2][0] * matrix->m[1][1]); + + /* Compute determinant. */ + d = (matrix->m[0][0] * det00) + (matrix->m[0][1] * det01) + (matrix->m[0][2] * det02); + + /* Return 0 if there is no inverse matrix. */ + if(d == 0.0f) + return 0; + + /* Compute reciprocal. */ + d = 1.0f / d; + + /* Determine if the matrix is affine. */ + isAffine = (matrix->m[2][0] == 0.0f) && (matrix->m[2][1] == 0.0f) && (matrix->m[2][2] == 1.0f); + + result->m[0][0] = d * det00; + result->m[0][1] = d * ((matrix->m[2][1] * matrix->m[0][2]) - (matrix->m[0][1] * matrix->m[2][2])); + result->m[0][2] = d * ((matrix->m[0][1] * matrix->m[1][2]) - (matrix->m[1][1] * matrix->m[0][2])); + result->m[1][0] = d * det01; + result->m[1][1] = d * ((matrix->m[0][0] * matrix->m[2][2]) - (matrix->m[2][0] * matrix->m[0][2])); + result->m[1][2] = d * ((matrix->m[1][0] * matrix->m[0][2]) - (matrix->m[0][0] * matrix->m[1][2])); + result->m[2][0] = isAffine ? 0.0f : d * det02; + result->m[2][1] = isAffine ? 0.0f : d * ((matrix->m[2][0] * matrix->m[0][1]) - (matrix->m[0][0] * matrix->m[2][1])); + result->m[2][2] = isAffine ? 1.0f : d * ((matrix->m[0][0] * matrix->m[1][1]) - (matrix->m[1][0] * matrix->m[0][1])); + + /* Success. */ + return 1; +} + +/* Transform a 2D point by a given matrix. */ +uint32_t transform(vg_lite_point_t * result, vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t * matrix) +{ + vg_lite_float_t pt_x; + vg_lite_float_t pt_y; + vg_lite_float_t pt_w; + + /* Test for identity matrix. */ + if(matrix == NULL) { + result->x = (int)x; + result->y = (int)y; + + /* Success. */ + return 1; + } + + if(((matrix->m[0][1] != 0.0f) || (matrix->m[1][0] != 0.0f) || (matrix->m[2][0] != 0.0f) || (matrix->m[2][1] != 0.0f) || + (matrix->m[2][2] != 1.0f)) && + (s_context.filter == VG_LITE_FILTER_LINEAR || s_context.filter == VG_LITE_FILTER_BI_LINEAR)) { + if(x != 0) { + x = x + 0.5f; + } + + if(y != 0 && s_context.filter == VG_LITE_FILTER_BI_LINEAR) { + y = y + 0.5f; + } + } + + /* Transform x, y, and w. */ + pt_x = (x * matrix->m[0][0]) + (y * matrix->m[0][1]) + matrix->m[0][2]; + pt_y = (x * matrix->m[1][0]) + (y * matrix->m[1][1]) + matrix->m[1][2]; + pt_w = (x * matrix->m[2][0]) + (y * matrix->m[2][1]) + matrix->m[2][2]; + + if(pt_w <= 0.0f) + return 0; + + /* Compute projected x and y. */ + if(pt_x < 0) { + result->x = (int)((pt_x / pt_w) - 0.5f); + } + else { + result->x = (int)((pt_x / pt_w) + 0.5f); + } + if(pt_y < 0) { + result->y = (int)((pt_y / pt_w) - 0.5f); + } + else { + result->y = (int)((pt_y / pt_w) + 0.5f); + } + + /* Success. */ + return 1; +} + +/* Flush specific VG module. */ +static vg_lite_error_t flush_target(void) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_context_t * context = GET_CONTEXT(); + + do { + VG_LITE_BREAK_ERROR(push_state(context, 0x0A1B, 0x00000011)); + VG_LITE_BREAK_ERROR(push_stall(context, 7)); + } while(0); + + return error; +} + +/* Set the current render target. */ +vg_lite_error_t set_render_target(vg_lite_buffer_t * target) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t yuv2rgb = 0; + uint32_t uv_swiz = 0; + uint32_t tile_setting; + uint32_t flexa_mode = 0; + uint32_t compress_mode = 0; + uint32_t mirror_mode = 0; + uint32_t premultiply_dst = 0; + uint32_t rgb_alphadiv = 0; + uint32_t read_dest = 0; + uint32_t dst_format = 0; + uint32_t rt_changed = 0; + + if(target == NULL) { + return VG_LITE_INVALID_ARGUMENT; + } + + /* Check if render target parameters are really changed. */ + if(memcmp(s_context.rtbuffer, target, sizeof(vg_lite_buffer_t))) { + rt_changed = 1; + } + /* Simply return if render target, scissor, mirror, gamma, flexa states are not changed. */ + if(!rt_changed && !s_context.scissor_dirty && !s_context.mirror_dirty && !s_context.gamma_dirty && + !s_context.flexa_dirty) { + return VG_LITE_SUCCESS; + } + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_YUV_OUTPUT + if((target != NULL) && + (target->format == VG_LITE_YUY2 || + target->format == VG_LITE_AYUY2 || + target->format == VG_LITE_YUY2_TILED || + target->format == VG_LITE_AYUY2_TILED)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT_PLANAR + if(target->format >= VG_LITE_ABGR8565_PLANAR && target->format <= VG_LITE_RGBA5658_PLANAR) { + return VG_LITE_NOT_SUPPORT; + } +#endif + + VG_LITE_RETURN_ERROR(dstbuf_align_check(target)); + VG_LITE_RETURN_ERROR(check_compress(target->format, target->compress_mode, target->tiled, target->width, + target->height)); +#endif /* gcFEATURE_VG_ERROR_CHECK */ + +#if gcFEATURE_VG_IM_FASTCLEAR + update_fc_buffer(target); +#endif + + /* Flush previous render target before setting the new render target. */ + vg_lite_flush(); + + /* Program render target states */ + { + if(((target->format >= VG_LITE_YUY2) && (target->format <= VG_LITE_AYUY2)) || + ((target->format >= VG_LITE_YUY2_TILED) && (target->format <= VG_LITE_AYUY2_TILED))) { + yuv2rgb = convert_yuv2rgb(target->yuv.yuv2rgb); + uv_swiz = convert_uv_swizzle(target->yuv.swizzle); + } + + if(s_context.flexa_mode) { + flexa_mode = 1 << 7; + } +#if (CHIPID==0x355 || CHIPID==0x255) + if(s_context.mirror_orient == VG_LITE_ORIENTATION_TOP_BOTTOM) { +#else + if(s_context.mirror_orient == VG_LITE_ORIENTATION_BOTTOM_TOP) { +#endif + mirror_mode = 1 << 16; + } + compress_mode = ((uint32_t)target->compress_mode) << 25; + + if(target->premultiplied || target->apply_premult) { + premultiply_dst = 0x00000100; + } + +#if gcFEATURE_VG_HW_PREMULTIPLY + rgb_alphadiv = 0x00000200; +#endif +#if gcFEATURE_VG_USE_DST + read_dest = 0x00100000; +#endif + dst_format = convert_target_format(target->format, s_context.capabilities); + if(dst_format == 0xFF) { + printf("Target format: 0x%x is not supported.\n", target->format); + return VG_LITE_NOT_SUPPORT; + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A10, + dst_format | read_dest | uv_swiz | yuv2rgb | flexa_mode | compress_mode | mirror_mode | s_context.gamma_value | + premultiply_dst | rgb_alphadiv)); + + s_context.mirror_dirty = 0; + s_context.gamma_dirty = 0; + + if(s_context.flexa_dirty && !s_context.flexa_mode && s_context.tessbuf.tessbuf_size) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AC8, s_context.tessbuf.tessbuf_size - 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AC8, s_context.tessbuf.tessbuf_size)); + s_context.flexa_dirty = 0; + } + + if(target->yuv.uv_planar) { + /* Program uv plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5C, target->yuv.uv_planar)); + } + if(target->yuv.alpha_planar) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5D, target->yuv.alpha_planar)); + } + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A11, target->address)); + + tile_setting = (target->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0; + + /* 24bit format stride configured to 4bpp. */ + if(target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) { + uint32_t stride = target->stride / 3 * 4; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A12, stride | tile_setting)); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A12, target->stride | tile_setting)); + } + + /* Set scissor rectangle on the render target */ + if(s_context.scissor_set) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A13, s_context.scissor[2] | (s_context.scissor[3] << 16))); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A13, target->width | (target->height << 16))); + } + s_context.scissor_dirty = 0; + } + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG(" set_render_target %p (%d, %d)\n", target, target->width, target->height); +#endif + + /* Copy the current render target parameters into s_context.rtbuffer */ + if(rt_changed) { + memcpy(s_context.rtbuffer, target, sizeof(vg_lite_buffer_t)); + } + + return error; +} + +/*************** VGLite API Functions ***********************************************/ + +vg_lite_error_t vg_lite_clear(vg_lite_buffer_t * target, + vg_lite_rectangle_t * rect, + vg_lite_color_t color) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_clear)(target, rect, color); +#endif + + vg_lite_error_t error; + vg_lite_point_t point_min, point_max; + int32_t left, top, right, bottom; + uint32_t color32; + uint32_t tile_setting = 0; + uint32_t stripe_mode = 0; + uint32_t in_premult = 0; +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_clear %p %p 0x%08X\n", target, rect, color); + if(rect) VGLITE_LOG(" Rect(%d, %d, %d, %d)\n", rect->x, rect->y, rect->width, rect->height); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if (CHIPID == 0x355) + if(target->format == VG_LITE_L8 || target->format == VG_LITE_YUYV || + target->format == VG_LITE_BGRA2222 || target->format == VG_LITE_RGBA2222 || + target->format == VG_LITE_ABGR2222 || target->format == VG_LITE_ARGB2222) { + printf("Target format: 0x%x is not supported.\n", target->format); + return VG_LITE_NOT_SUPPORT; + } +#endif +#endif + +#if gcFEATURE_VG_GAMMA + set_gamma_dest_only(target, VGL_FALSE); +#endif + + if(target->premultiplied) { + in_premult = 0x00000000; + target->apply_premult = 0; + } + else { + in_premult = 0x10000000; + target->apply_premult = 1; + } + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + + /* Get rectangle. */ + if(rect) { + point_min.x = rect->x; + point_min.y = rect->y; + point_max.x = rect->x + rect->width; + point_max.y = rect->y + rect->height; + } + else { + point_min.x = 0; + point_min.y = 0; + point_max.x = s_context.rtbuffer->width; + point_max.y = s_context.rtbuffer->height; + } + + /* Clip to target. */ + if(s_context.scissor_set && !target->scissor_buffer) { + left = s_context.scissor[0]; + top = s_context.scissor[1]; + right = s_context.scissor[2]; + bottom = s_context.scissor[3]; + } + else { + left = 0; + top = 0; + right = target->width; + bottom = target->height; + } + + point_min.x = MAX(point_min.x, left); + point_min.y = MAX(point_min.y, top); + point_max.x = MIN(point_max.x, right); + point_max.y = MIN(point_max.y, bottom); + + /* No need to draw. */ + if((point_max.x <= point_min.x) || (point_max.y <= point_min.y)) { + return VG_LITE_SUCCESS; + } + + /* Get converted color when target is in L8 format. */ + color32 = (target->format == VG_LITE_L8) ? rgb_to_l(color) : color; +#if gcFEATURE_VG_RECTANGLE_TILED_OUT + if(target->tiled == VG_LITE_TILED) { + tile_setting = 0x40; + stripe_mode = 0x20000000; + } +#endif + +#if gcFEATURE_VG_IM_FASTCLEAR + if((rect == NULL) || + (point_min.x == 0 && point_min.y == 0 && + ((point_max.x - point_min.x) == s_context.rtbuffer->width) && + ((point_max.y - point_min.y) == s_context.rtbuffer->height))) { + convert_color(s_context.rtbuffer->format, color32, &color32, NULL); + clear_fc(&target->fc_buffer[0], (uint32_t)color32); + } + else +#endif + { + /* Setup the command buffer. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, color32)); + + /* Clear operation is not affected by color transformation and pixel matrix. + * So PE clear and push_rectangle() clear have the same clear result color. + */ +#if gcFEATURE_VG_PE_CLEAR + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, 0)); + if((!rect && (point_min.x == 0 && point_min.y == 0 && (point_max.x - point_min.x) == target->width)) && + !s_context.scissor_enable && !s_context.scissor_set && !s_context.enable_mask) { + if(target->compress_mode == VG_LITE_DEC_DISABLE) { +#if gcFEATURE_VG_DST_BUFLEN_ALIGNED + uint32_t align, mul, div; + get_format_bytes(target->format, &mul, &div, &align); + if((mul / div != 3) && ((target->stride * (point_max.y - point_min.y)) % 64 != 0)) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif + +#if gcFEATURE_VG_24BIT + uint32_t align1, mul1, div1; + get_format_bytes(target->format, &mul1, &div1, &align1); + if((mul1 / div1 == 3) && ((target->stride * (point_max.y - point_min.y)) % 48 != 0)) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif + } + else { +#if gcFEATURE_VG_DEC_COMPRESS_2_0 + if(target->format == VG_LITE_BGRA8888 || target->format == VG_LITE_BGRX8888) { + if((target->stride * (point_max.y - point_min.y)) % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(target->format == VG_LITE_BGR888) { + if((target->stride * (point_max.y - point_min.y)) % 48 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif +#if gcFEATURE_VG_DEC_COMPRESS + if(target->format == VG_LITE_BGRX8888 || target->format == VG_LITE_RGBX8888 + || target->format == VG_LITE_BGRA8888 || target->format == VG_LITE_RGBA8888) { + if((target->stride * (point_max.y - point_min.y)) % 64 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } + + if(target->format == VG_LITE_RGB888 || target->format == VG_LITE_BGR888) { + if((target->stride * (point_max.y - point_min.y)) % 48 != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + in_premult | 0x00000004 | tile_setting | s_context.scissor_enable | stripe_mode)); + VG_LITE_RETURN_ERROR(push_pe_clear(&s_context, target->stride * (point_max.y - point_min.y))); + } + else +#endif + { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + in_premult | 0x00000001 | tile_setting | s_context.scissor_enable | stripe_mode)); + VG_LITE_RETURN_ERROR(push_rectangle(&s_context, point_min.x, point_min.y, point_max.x - point_min.x, + point_max.y - point_min.y)); + } + + /* flush VGPE after clear */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00000011)); + } + + /* Success. */ + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_blit2(vg_lite_buffer_t * target, + vg_lite_buffer_t * source0, + vg_lite_buffer_t * source1, + vg_lite_matrix_t * matrix0, + vg_lite_matrix_t * matrix1, + vg_lite_blend_t blend, + vg_lite_filter_t filter) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_blit2)(target, source0, source1, matrix0, matrix1, blend, filter); +#endif + +#if gcFEATURE_VG_DOUBLE_IMAGE && gcFEATURE_VG_IM_INPUT + vg_lite_error_t error; + vg_lite_point_t point_min, point_max, temp; + vg_lite_matrix_t inverse_matrix; + vg_lite_float_t x_step[2][3]; + vg_lite_float_t y_step[2][3]; + vg_lite_float_t c_step[2][3]; + uint32_t imageMode; + uint32_t blend_mode; + uint32_t filter_mode = 0; + int32_t stride0; + int32_t stride1; + uint32_t rotation = 0; + uint32_t conversion = 0; + uint32_t tiled0, tiled1; + int32_t left, right, bottom, top; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_blit2 %p %p %p %p %p %d %d\n", target, source0, source1, matrix0, matrix1, blend, filter); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_24BIT + if((target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) || + (source0->format >= VG_LITE_RGB888 && source0->format <= VG_LITE_RGBA5658) || + (source1->format >= VG_LITE_RGB888 && source1->format <= VG_LITE_RGBA5658)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUY2_INPUT + if(source0->format == VG_LITE_YUYV || source0->format == VG_LITE_YUY2 || source1->format == VG_LITE_YUYV || + source1->format == VG_LITE_YUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_INPUT + if((source0->format >= VG_LITE_NV12 && source0->format <= VG_LITE_NV16) || (source1->format >= VG_LITE_NV12 && + source1->format <= VG_LITE_NV16) || source0->format == VG_LITE_NV24 || source1->format >= VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#elif !gcFEATURE_VG_NV24_INPUT + if(source0->format == VG_LITE_NV24 || source1->format >= VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_AYUV_INPUT + if(source0->format == VG_LITE_ANV12 || source0->format == VG_LITE_AYUY2 || source1->format == VG_LITE_ANV12 || + source1->format == VG_LITE_AYUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_TILED_INPUT + if((source0->format >= VG_LITE_YUY2_TILED && source0->format <= VG_LITE_AYUY2_TILED) || + (source1->format >= VG_LITE_YUY2_TILED && source1->format <= VG_LITE_AYUY2_TILED) || + (source0->format == VG_LITE_NV24_TILED) || (source1->format == VG_LITE_NV24_TILED)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_NEW_BLEND_MODE + if(blend == VG_LITE_BLEND_DARKEN || blend == VG_LITE_BLEND_LIGHTEN) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#endif /* gcFEATURE_VG_ERROR_CHECK */ + + if(!matrix0) { + matrix0 = &identity_mtx; + } + if(!matrix1) { + matrix1 = &identity_mtx; + } + + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + + /* Check if the specified matrix has rotation or perspective. */ + if((matrix0->m[0][1] != 0.0f) + || (matrix0->m[1][0] != 0.0f) + || (matrix0->m[2][0] != 0.0f) + || (matrix0->m[2][1] != 0.0f) + || (matrix0->m[2][2] != 1.0f) + ) { + /* Mark that we have rotation. */ + rotation = 0x8000; + } + + /* Check whether L8 is supported or not. */ + if((target->format == VG_LITE_L8) && ((source0->format != VG_LITE_L8) && (source0->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + + /* Calculate transformation for Image0 (Paint) & Image1 (Image). */ + /* Image1. */ + /* Transform image (0,0) to screen. */ + if(!transform(&temp, 0.0f, 0.0f, matrix0)) + return VG_LITE_INVALID_ARGUMENT; + + /* Set initial point. */ + point_min = temp; + point_max = temp; + + /* Transform image (0,height) to screen. */ + if(!transform(&temp, 0.0f, (vg_lite_float_t)source0->height, matrix0)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,height) to screen. */ + if(!transform(&temp, (vg_lite_float_t)source0->width, (vg_lite_float_t)source0->height, matrix0)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,0) to screen. */ + if(!transform(&temp, (vg_lite_float_t)source0->width, 0.0f, matrix0)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Clip to target. */ + if(s_context.scissor_set) { + left = s_context.scissor[0]; + top = s_context.scissor[1]; + right = s_context.scissor[2]; + bottom = s_context.scissor[3]; + } + else { + left = top = 0; + right = target->width; + bottom = target->height; + } + + point_min.x = MAX(point_min.x, left); + point_min.y = MAX(point_min.y, top); + point_max.x = MIN(point_max.x, right); + point_max.y = MIN(point_max.y, bottom); + + if((point_max.x - point_min.x) <= 0 || (point_max.y - point_min.y) <= 0) + return VG_LITE_SUCCESS; + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix0)) + return VG_LITE_INVALID_ARGUMENT; + + /* Compute interpolation steps for image1 (Image). */ + x_step[1][0] = inverse_matrix.m[0][0] / source0->width; + x_step[1][1] = inverse_matrix.m[1][0] / source0->height; + x_step[1][2] = inverse_matrix.m[2][0]; + y_step[1][0] = inverse_matrix.m[0][1] / source0->width; + y_step[1][1] = inverse_matrix.m[1][1] / source0->height; + y_step[1][2] = inverse_matrix.m[2][1]; + c_step[1][0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]) / source0->width; + c_step[1][1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / source0->height; + c_step[1][2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + + /* Image0 (Paint, as background ). */ + /* Transform image (0,0) to screen. */ + if(!transform(&temp, 0.0f, 0.0f, matrix1)) + return VG_LITE_INVALID_ARGUMENT; + + /* Set initial point. */ + point_min = temp; + point_max = temp; + + /* Transform image (0,height) to screen. */ + if(!transform(&temp, 0.0f, (vg_lite_float_t)source1->height, matrix1)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,height) to screen. */ + if(!transform(&temp, (vg_lite_float_t)source1->width, (vg_lite_float_t)source1->height, matrix1)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,0) to screen. */ + if(!transform(&temp, (vg_lite_float_t)source1->width, 0.0f, matrix1)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Clip to target. */ + if(s_context.scissor_set) { + left = s_context.scissor[0]; + top = s_context.scissor[1]; + right = s_context.scissor[2]; + bottom = s_context.scissor[3]; + } + else { + left = top = 0; + right = target->width; + bottom = target->height; + } + + point_min.x = MAX(point_min.x, left); + point_min.y = MAX(point_min.y, top); + point_max.x = MIN(point_max.x, right); + point_max.y = MIN(point_max.y, bottom); + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix1)) + return VG_LITE_INVALID_ARGUMENT; + + /* Compute interpolation steps for image1 (Image). */ + x_step[0][0] = inverse_matrix.m[0][0] / source1->width; + x_step[0][1] = inverse_matrix.m[1][0] / source1->height; + x_step[0][2] = inverse_matrix.m[2][0]; + y_step[0][0] = inverse_matrix.m[0][1] / source1->width; + y_step[0][1] = inverse_matrix.m[1][1] / source1->height; + y_step[0][2] = inverse_matrix.m[2][1]; + c_step[0][0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]) / source1->width; + c_step[0][1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / source1->height; + c_step[0][2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + + /* DOUBLE_IMAGE mode. */ + imageMode = 0x5000; + blend_mode = convert_blend(blend); + tiled0 = (source0->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0; + tiled1 = (source1->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0; + + switch(filter) { + case VG_LITE_FILTER_POINT: + filter_mode = 0; + break; + + case VG_LITE_FILTER_LINEAR: + filter_mode = 0x10000; + break; + + case VG_LITE_FILTER_BI_LINEAR: + filter_mode = 0x20000; + break; + + case VG_LITE_FILTER_GAUSSIAN: + filter_mode = 0x30000; + break; + } + + /* Setup the command buffer. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + 0x10000001 | imageMode | blend_mode | rotation | s_context.enable_mask | s_context.color_transform | + s_context.matrix_enable)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); + /* Program image1. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A18, (void *) &c_step[1][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A19, (void *) &c_step[1][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1A, (void *) &c_step[1][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1C, (void *) &x_step[1][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1D, (void *) &x_step[1][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1E, (void *) &x_step[1][2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A20, (void *) &y_step[1][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A21, (void *) &y_step[1][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A22, (void *) &y_step[1][2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A25, convert_source_format(source0->format) | filter_mode | conversion)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A27, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source0->address)); + + if(source0->yuv.uv_planar != 0) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A51, source0->yuv.uv_planar)); + } + if(source0->yuv.v_planar != 0) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source0->yuv.v_planar)); + } + + if(source0->yuv.alpha_planar != 0) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source0->yuv.alpha_planar)); + } + /* 24bit format stride configured to 4bpp. */ + if(source0->format >= VG_LITE_RGB888 && source0->format <= VG_LITE_RGBA5658) { + stride0 = source0->stride / 3 * 4; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, stride0 | tiled0)); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, source0->stride | tiled0)); + } + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2D, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2F, source0->width | (source0->height << 16))); + + /* Program image0 (Paint, as background). */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A84, (void *) &c_step[0][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A85, (void *) &c_step[0][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A86, (void *) &c_step[0][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A7C, (void *) &x_step[0][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A7D, (void *) &x_step[0][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A7E, (void *) &x_step[0][2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A80, (void *) &y_step[0][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A81, (void *) &y_step[0][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A82, (void *) &y_step[0][2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A24, convert_source_format(source1->format) | filter_mode | conversion)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A26, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A28, source1->address)); + if(source1->yuv.uv_planar != 0) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A50, source1->yuv.uv_planar)); + } + if(source1->yuv.v_planar != 0) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A52, source1->yuv.v_planar)); + } + if(source1->yuv.alpha_planar != 0) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A52, source1->yuv.alpha_planar)); + } + /* 24bit format stride configured to 4bpp. */ + if(source1->format >= VG_LITE_RGB888 && source1->format <= VG_LITE_RGBA5658) { + stride1 = source1->stride / 3 * 4; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2A, stride1 | tiled1)); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2A, source1->stride | tiled1)); + } + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2C, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2E, source1->width | (source1->height << 16))); + + VG_LITE_RETURN_ERROR(push_rectangle(&s_context, point_min.x, point_min.y, point_max.x - point_min.x, + point_max.y - point_min.y)); + VG_LITE_RETURN_ERROR(flush_target()); + + vglitemDUMP_BUFFER("image", (size_t)source0->address, source0->memory, 0, (source0->stride) * (source0->height)); + vglitemDUMP_BUFFER("image", (size_t)source1->address, source1->memory, 0, (source1->stride) * (source1->height)); +#if DUMP_IMAGE + dump_img(source0->memory, source0->width, source0->height, source0->format); + dump_img(source1->memory, source1->width, source1->height, source1->format); +#endif + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_blit(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_blit)(target, source, matrix, blend, color, filter); +#endif + +#if gcFEATURE_VG_IM_INPUT + vg_lite_error_t error; + vg_lite_point_t point_min, point_max, temp; + vg_lite_matrix_t inverse_matrix; + vg_lite_float_t x_step[3]; + vg_lite_float_t y_step[3]; + vg_lite_float_t c_step[3]; + uint32_t imageMode = 0; + uint32_t paintType = 0; + uint32_t in_premult = 0; + uint32_t blend_mode; + uint32_t filter_mode = 0; + uint32_t transparency_mode = 0; + uint32_t conversion = 0; + uint32_t tiled_source; + uint32_t yuv2rgb = 0; + uint32_t uv_swiz = 0; + uint32_t compress_mode = 0; + uint32_t src_premultiply_enable = 0; + uint32_t index_endian = 0; + uint32_t eco_fifo = 0; + uint32_t tile_setting = 0; + uint32_t stripe_mode = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; + int32_t left, top, right, bottom; + int32_t stride; + uint8_t lvgl_sw_blend = 0; +#if VG_SW_BLIT_PRECISION_OPT + uint8_t * bufferPointer; + uint32_t bufferAddress = 0, bufferAlignAddress = 0, addressOffset = 0, mul = 0, div = 0, required_align = 0; + vg_lite_buffer_t new_target; + vg_lite_point_t point0_0_afterTransform = { 0 }; + uint8_t enableSwPreOpt = 0; + int32_t matrixOffsetX = 0; + + /* Only accept interger move */ + if(matrix != NULL && filter == VG_LITE_FILTER_POINT) { + matrix->m[0][2] = (vg_lite_float_t)(matrix->m[0][2] >= 0 ? (int32_t)(matrix->m[0][2] + 0.5) : (int32_t)( + matrix->m[0][2] - 0.5)); + matrix->m[1][2] = (vg_lite_float_t)(matrix->m[1][2] >= 0 ? (int32_t)(matrix->m[1][2] + 0.5) : (int32_t)( + matrix->m[1][2] - 0.5)); + /* Only nonperspective transform with scale or rotation could enable optimization */ + if((matrix->m[2][0] == 0.0f && matrix->m[2][1] == 0.0f && matrix->m[2][2] == 1.0f) && + (matrix->m[0][0] != 1.0f || matrix->m[1][1] != 1.0f || matrix->m[0][1] != 0.0f)) { + if(target->tiled != VG_LITE_TILED && (target->format < VG_LITE_RGB888 || target->format > VG_LITE_RGBA5658_PLANAR)) { + enableSwPreOpt = 1; + } + } + } +#endif /* VG_SW_BLIT_PRECISION_OPT */ + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_blit %p %p %p %d 0x%08X %d\n", target, source, matrix, blend, color, filter); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_INDEX_ENDIAN + if((source->format >= VG_LITE_INDEX_1) && (source->format <= VG_LITE_INDEX_4) && source->index_endian) { + return VG_LITE_NOT_SUPPORT; + } +#endif + +#if !gcFEATURE_VG_RGBA8_ETC2_EAC + if(source->format == VG_LITE_RGBA8888_ETC2_EAC) { + return VG_LITE_NOT_SUPPORT; + } +#else + if((source->format == VG_LITE_RGBA8888_ETC2_EAC) && (source->width % 16 || source->height % 4)) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif +#if !gcFEATURE_VG_YUY2_INPUT + if(source->format == VG_LITE_YUYV || source->format == VG_LITE_YUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_INPUT + if((source->format >= VG_LITE_NV12 && source->format <= VG_LITE_NV16) || source->format == VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#elif !gcFEATURE_VG_NV24_INPUT + if(source->format == VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_AYUV_INPUT + if(source->format == VG_LITE_ANV12 || source->format == VG_LITE_AYUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_TILED_INPUT + if((source->format >= VG_LITE_YUY2_TILED && source->format <= VG_LITE_AYUY2_TILED) || + (source->format == VG_LITE_NV24_TILED)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT + if((target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) || + (source->format >= VG_LITE_RGB888 && source->format <= VG_LITE_RGBA5658)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT_PLANAR + if(source->format >= VG_LITE_ABGR8565_PLANAR && source->format <= VG_LITE_RGBA5658_PLANAR) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_IM_DEC_INPUT + if(source->compress_mode != VG_LITE_DEC_DISABLE) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_STENCIL + if(source->image_mode == VG_LITE_STENCIL_MODE) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_NEW_BLEND_MODE + if(blend == VG_LITE_BLEND_DARKEN || blend == VG_LITE_BLEND_LIGHTEN) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(blend && (target->format == VG_LITE_YUYV || target->format == VG_LITE_YUY2 || target->format == VG_LITE_YUY2_TILED + || target->format == VG_LITE_AYUY2 || target->format == VG_LITE_AYUY2_TILED)) { + return VG_LITE_NOT_SUPPORT; + } +#if (CHIPID == 0x355) + if(target->format == VG_LITE_L8 || target->format == VG_LITE_YUYV || + target->format == VG_LITE_BGRA2222 || target->format == VG_LITE_RGBA2222 || + target->format == VG_LITE_ABGR2222 || target->format == VG_LITE_ARGB2222) { + printf("Target format: 0x%x is not supported.\n", target->format); + return VG_LITE_NOT_SUPPORT; + } + if(source->format == VG_LITE_L8 || source->format == VG_LITE_YUYV || + source->format == VG_LITE_BGRA2222 || source->format == VG_LITE_RGBA2222 || + source->format == VG_LITE_ABGR2222 || source->format == VG_LITE_ARGB2222) { + printf("Source format: 0x%x is not supported.\n", source->format); + return VG_LITE_NOT_SUPPORT; + } +#endif + + VG_LITE_RETURN_ERROR(srcbuf_align_check(source)); + VG_LITE_RETURN_ERROR(check_compress(source->format, source->compress_mode, source->tiled, source->width, + source->height)); +#endif /* gcFEATURE_VG_ERROR_CHECK */ + +#if !gcFEATURE_VG_LVGL_SUPPORT + if((blend >= VG_LITE_BLEND_ADDITIVE_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) || + (blend == VG_LITE_BLEND_NORMAL_LVGL && gcFEATURE_VG_SRC_PREMULTIPLIED)) { + if(!source->lvgl_buffer) { + source->lvgl_buffer = (vg_lite_buffer_t *)vg_lite_os_malloc(sizeof(vg_lite_buffer_t)); + *source->lvgl_buffer = *source; + source->lvgl_buffer->lvgl_buffer = NULL; + vg_lite_allocate(source->lvgl_buffer); + } + /* Make sure render target is up to date before reading RT. */ + vg_lite_finish(); + setup_lvgl_image(target, source, source->lvgl_buffer, blend); + blend = VG_LITE_BLEND_SRC_OVER; + lvgl_sw_blend = 1; + } +#endif + + if(!matrix) { + matrix = &identity_mtx; + } + +#if gcFEATURE_VG_INDEX_ENDIAN + if((source->format >= VG_LITE_INDEX_1) && (source->format <= VG_LITE_INDEX_4) && source->index_endian) { + index_endian = 1 << 14; + } +#endif +#if !gcFEATURE_VG_STRIPE_MODE + /* Enable fifo feature to share buffer between vg and ts to improve the rotation performance */ + eco_fifo = 1 << 7; +#endif + + transparency_mode = (source->transparency_mode == VG_LITE_IMAGE_TRANSPARENT ? 0x8000 : 0); + s_context.filter = filter; + + /* Check if the specified matrix has rotation or perspective. */ + if(((matrix->m[0][1] != 0.0f) + || (matrix->m[1][0] != 0.0f) + || (matrix->m[2][0] != 0.0f) + || (matrix->m[2][1] != 0.0f) + || (matrix->m[2][2] != 1.0f) + ) + && (blend == VG_LITE_BLEND_NONE + || blend == VG_LITE_BLEND_SRC_IN + || blend == VG_LITE_BLEND_DST_IN + ) + ) { +#if gcFEATURE_VG_BORDER_CULLING + /* Mark that we have rotation. */ + transparency_mode = 0x8000; +#else + blend = VG_LITE_BLEND_SRC_OVER; +#endif +#if !gcFEATURE_VG_STRIPE_MODE + stripe_mode = 1 << 29; +#endif + } + + /* Check whether L8 is supported or not. */ + if((target->format == VG_LITE_L8) && ((source->format != VG_LITE_L8) && (source->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + +#if gcFEATURE_VG_16PIXELS_ALIGNED + /* Check if source specify bytes are aligned */ + error = _check_source_aligned(source->format, source->stride); + if(error != VG_LITE_SUCCESS) { + return error; + } +#endif + + /* Transform image (0,0) to screen. */ + if(!transform(&temp, 0.0f, 0.0f, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Set initial point. */ + point_min = temp; + point_max = temp; +#if VG_SW_BLIT_PRECISION_OPT + point0_0_afterTransform = temp; +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + /* Transform image (0,height) to screen. */ + if(!transform(&temp, 0.0f, (vg_lite_float_t)source->height, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,height) to screen. */ + if(!transform(&temp, (vg_lite_float_t)source->width, (vg_lite_float_t)source->height, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,0) to screen. */ + if(!transform(&temp, (vg_lite_float_t)source->width, 0.0f, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Clip to target. */ + if(s_context.scissor_set && !target->scissor_buffer) { + left = s_context.scissor[0]; + top = s_context.scissor[1]; + right = s_context.scissor[2]; + bottom = s_context.scissor[3]; + } + else { + left = 0; + top = 0; + right = target->width; + bottom = target->height; + } + + point_min.x = MAX(point_min.x, left); + point_min.y = MAX(point_min.y, top); + point_max.x = MIN(point_max.x, right); + point_max.y = MIN(point_max.y, bottom); + + /* No need to draw. */ + if((point_max.x <= point_min.x) || (point_max.y <= point_min.y)) { + return VG_LITE_SUCCESS; + } + +#if gcFEATURE_VG_GAMMA + get_st_gamma_src_dest(source, target); +#endif + +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_GLOBAL, 0xff)); + } +#endif + + /*blend input into context*/ + s_context.blend_mode = blend; + in_premult = 0x00000000; + + /* Adjust premultiply setting according to openvg condition */ + src_premultiply_enable = 0x01000100; + if(s_context.color_transform == 0 && s_context.gamma_dst == s_context.gamma_src && s_context.matrix_enable == 0 && + s_context.dst_alpha_mode == 0 && s_context.src_alpha_mode == 0 && + (source->image_mode == VG_LITE_NORMAL_IMAGE_MODE || source->image_mode == 0)) { + prediv_flag = 0; + } + else { + prediv_flag = 1; + } + if((s_context.blend_mode >= OPENVG_BLEND_SRC && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE) || + source->image_mode == VG_LITE_STENCIL_MODE + || (s_context.blend_mode >= VG_LITE_BLEND_NORMAL_LVGL && s_context.blend_mode <= VG_LITE_BLEND_MULTIPLY_LVGL)) { + premul_flag = 1; + } + else { + premul_flag = 0; + } + + if((source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 0) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 0)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + /* when src and dst all pre format, im pre_out set to 0 to perform data truncation to prevent data overflow */ + else if(source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 0) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 0 && target->premultiplied == 1) || + (source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 1)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 1) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 1)) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + if((source->format == VG_LITE_A4 || source->format == VG_LITE_A8) && blend >= VG_LITE_BLEND_SRC_OVER && + blend <= VG_LITE_BLEND_SUBTRACT) { +#if (CHIPID==0x255) + src_premultiply_enable = 0x00000000; +#endif +#if gcFEATURE_VG_SRC_PREMULTIPLIED + src_premultiply_enable = src_premultiply_enable & ~(1 << 8); +#endif + in_premult = 0x00000000; + } + if(source->premultiplied == target->premultiplied && premul_flag == 0) { + target->apply_premult = 1; + } + else { + target->apply_premult = 0; + } +#if (gcFEATURE_VG_SRC_PREMULTIPLIED == 0) + if(blend == VG_LITE_BLEND_NORMAL_LVGL) + in_premult = 0x00000000; +#endif +#if VG_SW_BLIT_PRECISION_OPT + if(enableSwPreOpt) { + get_format_bytes(target->format, &mul, &div, &required_align); + //update target memory address + bufferAddress = target->address; + bufferAddress = bufferAddress + point_min.y * target->stride + point_min.x * (mul / div); + //base address need align + bufferAlignAddress = bufferAddress & ~(required_align - 1); + + //update buffer pointer address + bufferPointer = (uint8_t *)target->memory; + bufferPointer = bufferPointer + (bufferAlignAddress - target->address); + + //update offset + addressOffset = bufferAddress - bufferAlignAddress; + //we need give some offset to match actual translate + matrixOffsetX = addressOffset * div / mul; + + //update new_target and set it as target + memcpy(&new_target, target, sizeof(vg_lite_buffer_t)); + new_target.address = bufferAlignAddress; + new_target.memory = bufferPointer; + new_target.width = point_max.x - point_min.x + matrixOffsetX; + new_target.height = point_max.y - point_min.y; + target = &new_target; + + //update matrix + matrix->m[0][2] = (vg_lite_float_t)(point0_0_afterTransform.x - point_min.x + matrixOffsetX); + matrix->m[1][2] = (vg_lite_float_t)(point0_0_afterTransform.y - point_min.y); + + //modify point_min and point_max to let them start from (0, 0) + point_max.x = point_max.x - point_min.x; + point_max.y = point_max.y - point_min.y; + point_min.x = 0; + point_min.y = 0; + } +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix)) + return VG_LITE_INVALID_ARGUMENT; + +#if gcFEATURE_VG_MATH_PRECISION_FIX + if(filter == VG_LITE_FILTER_LINEAR) { + /* Compute interpolation steps. */ + x_step[0] = (inverse_matrix.m[0][0] - 0.5f * inverse_matrix.m[2][0]); + x_step[1] = inverse_matrix.m[1][0]; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = (inverse_matrix.m[0][1] - 0.5f * inverse_matrix.m[2][1]); + y_step[1] = inverse_matrix.m[1][1]; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[0][2] - 0.5f * inverse_matrix.m[2][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } + else if(filter == VG_LITE_FILTER_BI_LINEAR) { + /* Shift the linear sampling points to center of pixels to avoid pixel offset issue */ + x_step[0] = (inverse_matrix.m[0][0] - 0.5f * inverse_matrix.m[2][0]); + x_step[1] = (inverse_matrix.m[1][0] - 0.5f * inverse_matrix.m[2][0]); + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = (inverse_matrix.m[0][1] - 0.5f * inverse_matrix.m[2][1]); + y_step[1] = (inverse_matrix.m[1][1] - 0.5f * inverse_matrix.m[2][1]); + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[0][2] - 0.5f * inverse_matrix.m[2][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[1][2] - 0.5f * inverse_matrix.m[2][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } + else { + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0]; + x_step[1] = inverse_matrix.m[1][0]; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1]; + y_step[1] = inverse_matrix.m[1][1]; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + + // For FL32 rounding trick + uint32_t datax[2], datay[2], datac[2]; + for(int idx = 0; idx < 2; idx++) { + datax[idx] = *(uint32_t *)((void *)&x_step[idx]); + datay[idx] = *(uint32_t *)((void *)&y_step[idx]); + datac[idx] = *(uint32_t *)((void *)&c_step[idx]); + } + for(int i = 0; i < 2; i++) { + int aSign = (datax[i] & 0x80000000) >> 31; + int bSign = (datay[i] & 0x80000000) >> 31; + int cSign = (datac[i] & 0x80000000) >> 31; + int aIn = (datax[i] & 0x20) >> 5; + int bIn = (datay[i] & 0x20) >> 5; + if((aSign == 0) && (bSign == 0) && (aIn == bIn)) { + int cIn = (aSign ^ cSign) ^ ((~aIn) & 0x1); + if(cIn == 0) { + datac[i] &= 0xFFFFFFDF; + } + else { + datac[i] |= 0x00000020; + } + c_step[i] = *(vg_lite_float_t *)((void *)&datac[i]); + } + } + } +#else + if(filter == VG_LITE_FILTER_LINEAR) { + /* Compute interpolation steps. */ + x_step[0] = (inverse_matrix.m[0][0] - 0.5f * inverse_matrix.m[2][0]) / source->width; + x_step[1] = inverse_matrix.m[1][0] / source->height; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = (inverse_matrix.m[0][1] - 0.5f * inverse_matrix.m[2][1]) / source->width; + y_step[1] = inverse_matrix.m[1][1] / source->height; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[0][2] - 0.5f * inverse_matrix.m[2][2]) / source->width; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / source->height; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } + else if(filter == VG_LITE_FILTER_BI_LINEAR) { + /* Shift the linear sampling points to center of pixels to avoid pixel offset issue */ + x_step[0] = (inverse_matrix.m[0][0] - 0.5f * inverse_matrix.m[2][0]) / source->width; + x_step[1] = (inverse_matrix.m[1][0] - 0.5f * inverse_matrix.m[2][0]) / source->height; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = (inverse_matrix.m[0][1] - 0.5f * inverse_matrix.m[2][1]) / source->width; + y_step[1] = (inverse_matrix.m[1][1] - 0.5f * inverse_matrix.m[2][1]) / source->height; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[0][2] - 0.5f * inverse_matrix.m[2][2]) / source->width; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[1][2] - 0.5f * inverse_matrix.m[2][2]) / source->height; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } + else { + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0] / source->width; + x_step[1] = inverse_matrix.m[1][0] / source->height; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1] / source->width; + y_step[1] = inverse_matrix.m[1][1] / source->height; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]) / source->width; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / source->height; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } +#endif + +#if VG_SW_BLIT_PRECISION_OPT + /* Update C offset */ + if(enableSwPreOpt) { + uint8_t indexC0 = 0; + uint8_t indexC1 = 0; + uint32_t temp0 = (uint32_t)(matrix->angle / 45); + uint32_t temp1 = (uint32_t)(matrix->scaleX * 100); + uint32_t temp2 = (uint32_t)(matrix->scaleY * 100); + indexC0 = GetIndex(temp0, temp1); + indexC1 = GetIndex(temp0, temp2); + c_step[0] = c_step[0] + offsetTable[indexC0]; + c_step[1] = c_step[1] + offsetTable[indexC1]; + } +#else + c_step[0] = c_step[0] + offsetTable[0]; + c_step[1] = c_step[1] + offsetTable[0]; +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + /* Determine image mode (NORMAL, NONE , MULTIPLY or STENCIL) depending on the color. */ + switch(source->image_mode) { + case VG_LITE_NONE_IMAGE_MODE: + imageMode = 0x00000000; + break; + case VG_LITE_MULTIPLY_IMAGE_MODE: + imageMode = 0x00002000; + break; + case VG_LITE_NORMAL_IMAGE_MODE: + case VG_LITE_ZERO: + imageMode = 0x00001000; + break; + case VG_LITE_STENCIL_MODE: + imageMode = 0x00003000; + break; + case VG_LITE_RECOLOR_MODE: + imageMode = 0x00006000; + break; + } + + switch(filter) { + case VG_LITE_FILTER_POINT: + filter_mode = 0; + break; + + case VG_LITE_FILTER_LINEAR: + filter_mode = 0x10000; + break; + + case VG_LITE_FILTER_BI_LINEAR: + filter_mode = 0x20000; + break; + + case VG_LITE_FILTER_GAUSSIAN: + filter_mode = 0x30000; + break; + } + + switch(source->paintType) { + case VG_LITE_PAINT_COLOR: + paintType = 0; + break; + + case VG_LITE_PAINT_LINEAR_GRADIENT: + paintType = 1 << 24; + break; + + case VG_LITE_PAINT_RADIAL_GRADIENT: + paintType = 1 << 25; + break; + + case VG_LITE_PAINT_PATTERN: + paintType = 1 << 24 | 1 << 25; + break; + + default: + break; + } + + blend_mode = convert_blend(blend); + tiled_source = (source->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0 ; +#if gcFEATURE_VG_RECTANGLE_TILED_OUT + if(target->tiled == VG_LITE_TILED) { + tile_setting = 0x40; + stripe_mode = 0x20000000; + } +#endif + +#if (gcFEATURE_VG_DEC_COMPRESS | gcFEATURE_VG_DEC_COMPRESS_2_0) + if(source->compress_mode != VG_LITE_DEC_DISABLE && target->compress_mode == VG_LITE_DEC_DISABLE) { + if(source->format != target->format) { + printf("The format of source and target buffers is inconsistent in decompressing!\n"); + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif + compress_mode = (uint32_t)source->compress_mode << 25; + + /* Setup the command buffer. */ +#if gcFEATURE_VG_GLOBAL_ALPHA + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD1, + s_context.dst_alpha_mode | s_context.dst_alpha_value | s_context.src_alpha_mode | s_context.src_alpha_value)); +#endif + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + 0x00000001 | paintType | in_premult | imageMode | blend_mode | transparency_mode | tile_setting | s_context.enable_mask + | s_context.color_transform | s_context.matrix_enable | eco_fifo | s_context.scissor_enable | stripe_mode)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, color)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A18, (void *) &c_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A19, (void *) &c_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1A, (void *) &c_step[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1C, (void *) &x_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1D, (void *) &x_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1E, (void *) &x_step[2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A20, (void *) &y_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A21, (void *) &y_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A22, (void *) &y_step[2])); + + if(((source->format >= VG_LITE_YUY2) && + (source->format <= VG_LITE_AYUY2)) || + ((source->format >= VG_LITE_YUY2_TILED) && + (source->format <= VG_LITE_AYUY2_TILED))) { + yuv2rgb = convert_yuv2rgb(source->yuv.yuv2rgb); + uv_swiz = convert_uv_swizzle(source->yuv.swizzle); + } + +#if gcFEATURE_VG_IM_FASTCLEAR + if(source->fc_enable) { + uint32_t im_fc_enable = (source->fc_enable == 0) ? 0 : 0x800000; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A25, + convert_source_format(source->format) | filter_mode | uv_swiz | yuv2rgb | conversion | im_fc_enable | ahb_read_split | + compress_mode | src_premultiply_enable | index_endian)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0ACF, source->fc_buffer[0].address)); /* FC buffer address. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD0, source->fc_buffer[0].color)); /* FC clear value. */ + } +#endif + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A25, + convert_source_format(source->format) | filter_mode | uv_swiz | yuv2rgb | conversion | compress_mode | + src_premultiply_enable | index_endian)); + if(source->yuv.uv_planar) { + /* Program u plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A51, source->yuv.uv_planar)); + } + if(source->yuv.v_planar) { + /* Program v plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source->yuv.v_planar)); + } + if(source->yuv.alpha_planar != 0) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source->yuv.alpha_planar)); + } + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A27, target->bg_color)); + +#if !gcFEATURE_VG_LVGL_SUPPORT + if(lvgl_sw_blend) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source->lvgl_buffer->address)); + } + else +#endif + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source->address)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); + /* 24bit format stride configured to 4bpp. */ + if(source->format >= VG_LITE_RGB888 && source->format <= VG_LITE_RGBA5658) { + stride = source->stride / 3 * 4; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, stride | tiled_source)); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, source->stride | tiled_source)); + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2D, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2F, source->width | (source->height << 16))); + +#if VG_SW_BLIT_PRECISION_OPT + if(enableSwPreOpt) { + VG_LITE_RETURN_ERROR(push_rectangle(&s_context, point_min.x + matrixOffsetX, point_min.y, point_max.x - point_min.x, + point_max.y - point_min.y)); + } + else +#endif /* VG_SW_BLIT_PRECISION_OPT */ + { + VG_LITE_RETURN_ERROR(push_rectangle(&s_context, point_min.x, point_min.y, point_max.x - point_min.x, + point_max.y - point_min.y)); + } + +#if !gcFEATURE_VG_STRIPE_MODE + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0E02, 0x10 | (0x7 << 8))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0F00, 0x10 | (0x7 << 8))); +#endif + + if(!s_context.flexa_mode) { + error = flush_target(); + } +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_NORMAL, 0xFF)); + } +#endif + + vglitemDUMP_BUFFER("image", (size_t)source->address, source->memory, 0, (source->stride) * (source->height)); + +#if DUMP_IMAGE + dump_img(source->memory, source->width, source->height, source->format); +#endif + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_blit_rect(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_rectangle_t * rect, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_blit_rect)(target, source, rect, matrix, blend, color, filter); +#endif + +#if gcFEATURE_VG_IM_INPUT + vg_lite_error_t error; + vg_lite_point_t point_min, point_max, temp; + vg_lite_matrix_t inverse_matrix; + vg_lite_float_t x_step[3]; + vg_lite_float_t y_step[3]; + vg_lite_float_t c_step[3]; + uint32_t imageMode = 0; + uint32_t paintType = 0; + uint32_t in_premult = 0; + uint32_t blend_mode; + uint32_t filter_mode = 0; + uint32_t transparency_mode = 0; + uint32_t conversion = 0; + uint32_t rect_x = 0, rect_y = 0, rect_w = 0, rect_h = 0; + uint32_t tiled_source; + uint32_t yuv2rgb = 0; + uint32_t uv_swiz = 0; + uint32_t compress_mode = 0; + uint32_t src_premultiply_enable = 0; + uint32_t index_endian = 0; + uint32_t eco_fifo = 0; + uint32_t tile_setting = 0; + uint32_t stripe_mode = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; + int32_t left, top, right, bottom; + int32_t stride; + uint8_t lvgl_sw_blend = 0; +#if VG_SW_BLIT_PRECISION_OPT + uint8_t * bufferPointer; + uint32_t bufferAddress = 0, bufferAlignAddress = 0, addressOffset = 0, mul = 0, div = 0, required_align = 0; + vg_lite_buffer_t new_target; + vg_lite_point_t point0_0_afterTransform = { 0 }; + uint8_t enableSwPreOpt = 0; + int32_t matrixOffsetX = 0; + + /* Only accept interger move */ + if(matrix != NULL && filter == VG_LITE_FILTER_POINT) { + matrix->m[0][2] = (vg_lite_float_t)(matrix->m[0][2] >= 0 ? (int32_t)(matrix->m[0][2] + 0.5) : (int32_t)( + matrix->m[0][2] - 0.5)); + matrix->m[1][2] = (vg_lite_float_t)(matrix->m[1][2] >= 0 ? (int32_t)(matrix->m[1][2] + 0.5) : (int32_t)( + matrix->m[1][2] - 0.5)); + /* Only nonperspective transform with scale or rotation could enable optimization */ + if((matrix->m[2][0] == 0.0f && matrix->m[2][1] == 0.0f && matrix->m[2][2] == 1.0f) && + (matrix->m[0][0] != 1.0f || matrix->m[1][1] != 1.0f || matrix->m[0][1] != 0.0f)) { + if(target->tiled != VG_LITE_TILED && (target->format < VG_LITE_RGB888 || target->format > VG_LITE_RGBA5658_PLANAR)) { + enableSwPreOpt = 1; + } + } + } +#endif /* VG_SW_BLIT_PRECISION_OPT */ + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_blit_rect %p %p %p %p %d 0x%08X %d\n", target, source, rect, matrix, blend, color, filter); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_INDEX_ENDIAN + if((source->format >= VG_LITE_INDEX_1) && (source->format <= VG_LITE_INDEX_4) && source->index_endian) { + return VG_LITE_NOT_SUPPORT; + } +#endif + +#if !gcFEATURE_VG_RGBA8_ETC2_EAC + if(source->format == VG_LITE_RGBA8888_ETC2_EAC) { + return VG_LITE_NOT_SUPPORT; + } +#else + if((source->format == VG_LITE_RGBA8888_ETC2_EAC) && (source->width % 16 || source->height % 4)) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif +#if !gcFEATURE_VG_YUY2_INPUT + if(source->format == VG_LITE_YUYV || source->format == VG_LITE_YUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_INPUT + if((source->format >= VG_LITE_NV12 && source->format <= VG_LITE_NV16) || source->format == VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#elif !gcFEATURE_VG_NV24_INPUT + if(source->format == VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_AYUV_INPUT + if(source->format == VG_LITE_ANV12 || source->format == VG_LITE_AYUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_TILED_INPUT + if((source->format >= VG_LITE_YUY2_TILED && source->format <= VG_LITE_AYUY2_TILED) || + (source->format == VG_LITE_NV24_TILED)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT + if((target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) || + (source->format >= VG_LITE_RGB888 && source->format <= VG_LITE_RGBA5658)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT_PLANAR + if(source->format >= VG_LITE_ABGR8565_PLANAR && source->format <= VG_LITE_RGBA5658_PLANAR) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_IM_DEC_INPUT + if(source->compress_mode != VG_LITE_DEC_DISABLE) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_STENCIL + if(source->image_mode == VG_LITE_STENCIL_MODE) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_NEW_BLEND_MODE + if(blend == VG_LITE_BLEND_DARKEN || blend == VG_LITE_BLEND_LIGHTEN) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(blend && (target->format == VG_LITE_YUYV || target->format == VG_LITE_YUY2 || target->format == VG_LITE_YUY2_TILED + || target->format == VG_LITE_AYUY2 || target->format == VG_LITE_AYUY2_TILED)) { + return VG_LITE_NOT_SUPPORT; + } +#if (CHIPID == 0x355) + if(target->format == VG_LITE_L8 || target->format == VG_LITE_YUYV || + target->format == VG_LITE_BGRA2222 || target->format == VG_LITE_RGBA2222 || + target->format == VG_LITE_ABGR2222 || target->format == VG_LITE_ARGB2222) { + printf("Target format: 0x%x is not supported.\n", target->format); + return VG_LITE_NOT_SUPPORT; + } + if(source->format == VG_LITE_L8 || source->format == VG_LITE_YUYV || + source->format == VG_LITE_BGRA2222 || source->format == VG_LITE_RGBA2222 || + source->format == VG_LITE_ABGR2222 || source->format == VG_LITE_ARGB2222) { + printf("Source format: 0x%x is not supported.\n", source->format); + return VG_LITE_NOT_SUPPORT; + } +#endif + + VG_LITE_RETURN_ERROR(srcbuf_align_check(source)); + VG_LITE_RETURN_ERROR(check_compress(source->format, source->compress_mode, source->tiled, source->width, + source->height)); +#endif /* gcFEATURE_VG_ERROR_CHECK */ + +#if !gcFEATURE_VG_LVGL_SUPPORT + if((blend >= VG_LITE_BLEND_ADDITIVE_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) || + (blend == VG_LITE_BLEND_NORMAL_LVGL && gcFEATURE_VG_SRC_PREMULTIPLIED)) { + if(!source->lvgl_buffer) { + source->lvgl_buffer = (vg_lite_buffer_t *)vg_lite_os_malloc(sizeof(vg_lite_buffer_t)); + *source->lvgl_buffer = *source; + source->lvgl_buffer->lvgl_buffer = NULL; + vg_lite_allocate(source->lvgl_buffer); + } + /* Make sure render target is up to date before reading RT. */ + vg_lite_finish(); + setup_lvgl_image(target, source, source->lvgl_buffer, blend); + blend = VG_LITE_BLEND_SRC_OVER; + lvgl_sw_blend = 1; + } +#endif + + if(!matrix) { + matrix = &identity_mtx; + } + +#if gcFEATURE_VG_INDEX_ENDIAN + if((source->format >= VG_LITE_INDEX_1) && (source->format <= VG_LITE_INDEX_4) && source->index_endian) { + index_endian = 1 << 14; + } +#endif +#if !gcFEATURE_VG_STRIPE_MODE + /* Enable fifo feature to share buffer between vg and ts to improve the rotation performance */ + eco_fifo = 1 << 7; +#endif + + transparency_mode = (source->transparency_mode == VG_LITE_IMAGE_TRANSPARENT ? 0x8000 : 0); + s_context.filter = filter; + + /* Check if the specified matrix has rotation or perspective. */ + if(((matrix->m[0][1] != 0.0f) + || (matrix->m[1][0] != 0.0f) + || (matrix->m[2][0] != 0.0f) + || (matrix->m[2][1] != 0.0f) + || (matrix->m[2][2] != 1.0f) + ) + && (blend == VG_LITE_BLEND_NONE + || blend == VG_LITE_BLEND_SRC_IN + || blend == VG_LITE_BLEND_DST_IN + ) + ) { +#if gcFEATURE_VG_BORDER_CULLING + /* Mark that we have rotation. */ + transparency_mode = 0x8000; +#else + blend = VG_LITE_BLEND_SRC_OVER; +#endif +#if !gcFEATURE_VG_STRIPE_MODE + stripe_mode = 1 << 29; +#endif + } + + /* Check whether L8 is supported or not. */ + if((target->format == VG_LITE_L8) && ((source->format != VG_LITE_L8) && (source->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + +#if gcFEATURE_VG_16PIXELS_ALIGNED + /* Check if source specify bytes are aligned */ + error = _check_source_aligned(source->format, source->stride); + if(error != VG_LITE_SUCCESS) { + return error; + } +#endif + /* Set source region. */ + if(rect != NULL) { + rect_x = (rect->x < 0) ? 0 : rect->x; + rect_y = (rect->y < 0) ? 0 : rect->y; + rect_w = rect->width; + rect_h = rect->height; + if((rect_x > (uint32_t)source->width) || (rect_y > (uint32_t)source->height) || + (rect_w == 0) || (rect_h == 0)) { + /*No intersection*/ + return VG_LITE_INVALID_ARGUMENT; + } + if(rect_x + rect_w > (uint32_t)source->width) { + rect_w = source->width - rect_x; + } + if(rect_y + rect_h > (uint32_t)source->height) { + rect_h = source->height - rect_y; + } + } + else { + rect_x = rect_y = 0; + rect_w = source->width; + rect_h = source->height; + } + + /* Transform image (0,0) to screen. */ + if(!transform(&temp, 0.0f, 0.0f, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Set initial point. */ + point_min = temp; + point_max = temp; +#if VG_SW_BLIT_PRECISION_OPT + point0_0_afterTransform = temp; +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + /* Transform image (0,height) to screen. */ + if(!transform(&temp, 0.0f, (vg_lite_float_t)rect_h, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,height) to screen. */ + if(!transform(&temp, (vg_lite_float_t)rect_w, (vg_lite_float_t)rect_h, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,0) to screen. */ + if(!transform(&temp, (vg_lite_float_t)rect_w, 0.0f, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Clip to target. */ + if(s_context.scissor_set && !target->scissor_buffer) { + left = s_context.scissor[0]; + top = s_context.scissor[1]; + right = s_context.scissor[2]; + bottom = s_context.scissor[3]; + } + else { + left = 0; + top = 0; + right = target->width; + bottom = target->height; + } + + point_min.x = MAX(point_min.x, left); + point_min.y = MAX(point_min.y, top); + point_max.x = MIN(point_max.x, right); + point_max.y = MIN(point_max.y, bottom); + + /* No need to draw. */ + if((point_max.x <= point_min.x) || (point_max.y <= point_min.y)) { + return VG_LITE_SUCCESS; + } + +#if gcFEATURE_VG_GAMMA + get_st_gamma_src_dest(source, target); +#endif + +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_GLOBAL, 0xff)); + } +#endif + + /*blend input into context*/ + s_context.blend_mode = blend; + in_premult = 0x00000000; + + /* Adjust premultiply setting according to openvg condition */ + src_premultiply_enable = 0x01000100; + if(s_context.color_transform == 0 && s_context.gamma_dst == s_context.gamma_src && s_context.matrix_enable == 0 && + s_context.dst_alpha_mode == 0 && s_context.src_alpha_mode == 0 && + (source->image_mode == VG_LITE_NORMAL_IMAGE_MODE || source->image_mode == 0)) { + prediv_flag = 0; + } + else { + prediv_flag = 1; + } + if((s_context.blend_mode >= OPENVG_BLEND_SRC && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE) || + source->image_mode == VG_LITE_STENCIL_MODE + || (s_context.blend_mode >= VG_LITE_BLEND_NORMAL_LVGL && s_context.blend_mode <= VG_LITE_BLEND_MULTIPLY_LVGL)) { + premul_flag = 1; + } + else { + premul_flag = 0; + } + + if((source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 0) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 0)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + /* when src and dst all pre format, im pre_out set to 0 to perform data truncation to prevent data overflow */ + else if(source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 0) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 0 && target->premultiplied == 1) || + (source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 1)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 1) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 1)) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + if((source->format == VG_LITE_A4 || source->format == VG_LITE_A8) && blend >= VG_LITE_BLEND_SRC_OVER && + blend <= VG_LITE_BLEND_SUBTRACT) { +#if (CHIPID==0x255) + src_premultiply_enable = 0x00000000; +#endif +#if gcFEATURE_VG_SRC_PREMULTIPLIED + src_premultiply_enable = src_premultiply_enable & ~(1 << 8); +#endif + in_premult = 0x00000000; + } + if(source->premultiplied == target->premultiplied && premul_flag == 0) { + target->apply_premult = 1; + } + else { + target->apply_premult = 0; + } +#if (gcFEATURE_VG_SRC_PREMULTIPLIED == 0) + if(blend == VG_LITE_BLEND_NORMAL_LVGL) + in_premult = 0x00000000; +#endif +#if VG_SW_BLIT_PRECISION_OPT + if(enableSwPreOpt) { + get_format_bytes(target->format, &mul, &div, &required_align); + //update target memory address + bufferAddress = target->address; + bufferAddress = bufferAddress + point_min.y * target->stride + point_min.x * (mul / div); + //base address need align + bufferAlignAddress = bufferAddress & ~(required_align - 1); + + //update buffer pointer address + bufferPointer = (uint8_t *)target->memory; + bufferPointer = bufferPointer + (bufferAlignAddress - target->address); + + //update offset + addressOffset = bufferAddress - bufferAlignAddress; + //we need give some offset to match actual translate + matrixOffsetX = addressOffset * div / mul; + + //update new_target and set it as target + memcpy(&new_target, target, sizeof(vg_lite_buffer_t)); + new_target.address = bufferAlignAddress; + new_target.memory = bufferPointer; + new_target.width = point_max.x - point_min.x + matrixOffsetX; + new_target.height = point_max.y - point_min.y; + target = &new_target; + + //update matrix + matrix->m[0][2] = (vg_lite_float_t)(point0_0_afterTransform.x - point_min.x + matrixOffsetX); + matrix->m[1][2] = (vg_lite_float_t)(point0_0_afterTransform.y - point_min.y); + + //modify point_min and point_max to let them start from (0, 0) + point_max.x = point_max.x - point_min.x; + point_max.y = point_max.y - point_min.y; + point_min.x = 0; + point_min.y = 0; + } +#endif /* VG_SW_BLIT_PRECISION_OPT */ + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix)) + return VG_LITE_INVALID_ARGUMENT; + +#if gcFEATURE_VG_MATH_PRECISION_FIX + if(filter == VG_LITE_FILTER_LINEAR) { + /* Compute interpolation steps. */ + x_step[0] = (inverse_matrix.m[0][0] - 0.5f * inverse_matrix.m[2][0]); + x_step[1] = inverse_matrix.m[1][0]; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = (inverse_matrix.m[0][1] - 0.5f * inverse_matrix.m[2][1]); + y_step[1] = inverse_matrix.m[1][1]; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[0][2] - 0.5f * inverse_matrix.m[2][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } + else if(filter == VG_LITE_FILTER_BI_LINEAR) { + /* Shift the linear sampling points to center of pixels to avoid pixel offset issue */ + x_step[0] = (inverse_matrix.m[0][0] - 0.5f * inverse_matrix.m[2][0]); + x_step[1] = (inverse_matrix.m[1][0] - 0.5f * inverse_matrix.m[2][0]); + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = (inverse_matrix.m[0][1] - 0.5f * inverse_matrix.m[2][1]); + y_step[1] = (inverse_matrix.m[1][1] - 0.5f * inverse_matrix.m[2][1]); + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[0][2] - 0.5f * inverse_matrix.m[2][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[1][2] - 0.5f * inverse_matrix.m[2][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } + else { + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0]; + x_step[1] = inverse_matrix.m[1][0]; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1]; + y_step[1] = inverse_matrix.m[1][1]; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + + // For FL32 rounding trick + uint32_t datax[2], datay[2], datac[2]; + for(int idx = 0; idx < 2; idx++) { + datax[idx] = *(uint32_t *)((void *)&x_step[idx]); + datay[idx] = *(uint32_t *)((void *)&y_step[idx]); + datac[idx] = *(uint32_t *)((void *)&c_step[idx]); + } + for(int i = 0; i < 2; i++) { + int aSign = (datax[i] & 0x80000000) >> 31; + int bSign = (datay[i] & 0x80000000) >> 31; + int cSign = (datac[i] & 0x80000000) >> 31; + int aIn = (datax[i] & 0x20) >> 5; + int bIn = (datay[i] & 0x20) >> 5; + if((aSign == 0) && (bSign == 0) && (aIn == bIn)) { + int cIn = (aSign ^ cSign) ^ ((~aIn) & 0x1); + if(cIn == 0) { + datac[i] &= 0xFFFFFFDF; + } + else { + datac[i] |= 0x00000020; + } + c_step[i] = *(vg_lite_float_t *)((void *)&datac[i]); + } + } + } +#else + if(filter == VG_LITE_FILTER_LINEAR) { + /* Compute interpolation steps. */ + x_step[0] = (inverse_matrix.m[0][0] - 0.5f * inverse_matrix.m[2][0]) / rect_w; + x_step[1] = inverse_matrix.m[1][0] / rect_h; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = (inverse_matrix.m[0][1] - 0.5f * inverse_matrix.m[2][1]) / rect_w; + y_step[1] = inverse_matrix.m[1][1] / rect_h; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[0][2] - 0.5f * inverse_matrix.m[2][2]) / rect_w; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / rect_h; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } + else if(filter == VG_LITE_FILTER_BI_LINEAR) { + /* Shift the linear sampling points to center of pixels to avoid pixel offset issue */ + x_step[0] = (inverse_matrix.m[0][0] - 0.5f * inverse_matrix.m[2][0]) / rect_w; + x_step[1] = (inverse_matrix.m[1][0] - 0.5f * inverse_matrix.m[2][0]) / rect_h; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = (inverse_matrix.m[0][1] - 0.5f * inverse_matrix.m[2][1]) / rect_w; + y_step[1] = (inverse_matrix.m[1][1] - 0.5f * inverse_matrix.m[2][1]) / rect_h; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[0][2] - 0.5f * inverse_matrix.m[2][2]) / rect_w; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) - 0.25f * (inverse_matrix.m[2][0] + + inverse_matrix.m[2][1]) + inverse_matrix.m[1][2] - 0.5f * inverse_matrix.m[2][2]) / rect_h; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } + else { + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0] / rect_w; + x_step[1] = inverse_matrix.m[1][0] / rect_h; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1] / rect_w; + y_step[1] = inverse_matrix.m[1][1] / rect_h; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]) / rect_w; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / rect_h; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + } +#endif + +#if VG_SW_BLIT_PRECISION_OPT + /* Update C offset */ + if(enableSwPreOpt) { + uint8_t indexC0 = 0; + uint8_t indexC1 = 0; + uint32_t temp0 = (uint32_t)(matrix->angle / 45); + uint32_t temp1 = (uint32_t)(matrix->scaleX * 100); + uint32_t temp2 = (uint32_t)(matrix->scaleY * 100); + indexC0 = GetIndex(temp0, temp1); + indexC1 = GetIndex(temp0, temp2); + c_step[0] = c_step[0] + offsetTable[indexC0]; + c_step[1] = c_step[1] + offsetTable[indexC1]; + } +#else + c_step[0] = c_step[0] + offsetTable[0]; + c_step[1] = c_step[1] + offsetTable[0]; +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + /* Determine image mode (NORMAL, NONE , MULTIPLY or STENCIL) depending on the color. */ + switch(source->image_mode) { + case VG_LITE_NONE_IMAGE_MODE: + imageMode = 0x00000000; + break; + case VG_LITE_MULTIPLY_IMAGE_MODE: + imageMode = 0x00002000; + break; + case VG_LITE_NORMAL_IMAGE_MODE: + case VG_LITE_ZERO: + imageMode = 0x00001000; + break; + case VG_LITE_STENCIL_MODE: + imageMode = 0x00003000; + break; + case VG_LITE_RECOLOR_MODE: + imageMode = 0x00006000; + break; + } + + switch(filter) { + case VG_LITE_FILTER_POINT: + filter_mode = 0; + break; + + case VG_LITE_FILTER_LINEAR: + filter_mode = 0x10000; + break; + + case VG_LITE_FILTER_BI_LINEAR: + filter_mode = 0x20000; + break; + + case VG_LITE_FILTER_GAUSSIAN: + filter_mode = 0x30000; + break; + } + + switch(source->paintType) { + case VG_LITE_PAINT_COLOR: + paintType = 0; + break; + + case VG_LITE_PAINT_LINEAR_GRADIENT: + paintType = 1 << 24; + break; + + case VG_LITE_PAINT_RADIAL_GRADIENT: + paintType = 1 << 25; + break; + + case VG_LITE_PAINT_PATTERN: + paintType = 1 << 24 | 1 << 25; + break; + + default: + break; + } + + blend_mode = convert_blend(blend); + tiled_source = (source->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0 ; +#if gcFEATURE_VG_RECTANGLE_TILED_OUT + if(target->tiled == VG_LITE_TILED) { + tile_setting = 0x40; + stripe_mode = 0x20000000; + } +#endif + +#if (gcFEATURE_VG_DEC_COMPRESS | gcFEATURE_VG_DEC_COMPRESS_2_0) + if(source->compress_mode != VG_LITE_DEC_DISABLE && target->compress_mode == VG_LITE_DEC_DISABLE) { + if(source->format != target->format) { + printf("The format of source and target buffers is inconsistent in decompressing!\n"); + return VG_LITE_INVALID_ARGUMENT; + } + } +#endif + compress_mode = (uint32_t)source->compress_mode << 25; + + /* Setup the command buffer. */ +#if gcFEATURE_VG_GLOBAL_ALPHA + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD1, + s_context.dst_alpha_mode | s_context.dst_alpha_value | s_context.src_alpha_mode | s_context.src_alpha_value)); +#endif + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + 0x00000001 | paintType | in_premult | imageMode | blend_mode | transparency_mode | tile_setting | s_context.enable_mask + | s_context.color_transform | s_context.matrix_enable | eco_fifo | s_context.scissor_enable | stripe_mode)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, color)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A18, (void *) &c_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A19, (void *) &c_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1A, (void *) &c_step[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1C, (void *) &x_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1D, (void *) &x_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1E, (void *) &x_step[2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A20, (void *) &y_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A21, (void *) &y_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A22, (void *) &y_step[2])); + + if(((source->format >= VG_LITE_YUY2) && + (source->format <= VG_LITE_AYUY2)) || + ((source->format >= VG_LITE_YUY2_TILED) && + (source->format <= VG_LITE_AYUY2_TILED))) { + yuv2rgb = convert_yuv2rgb(source->yuv.yuv2rgb); + uv_swiz = convert_uv_swizzle(source->yuv.swizzle); + } + +#if gcFEATURE_VG_IM_FASTCLEAR + if(source->fc_enable) { + uint32_t im_fc_enable = (source->fc_enable == 0) ? 0 : 0x800000; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A25, + convert_source_format(source->format) | filter_mode | uv_swiz | yuv2rgb | conversion | im_fc_enable | ahb_read_split | + compress_mode | src_premultiply_enable | index_endian)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0ACF, source->fc_buffer[0].address)); /* FC buffer address. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD0, source->fc_buffer[0].color)); /* FC clear value. */ + } +#endif + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A25, + convert_source_format(source->format) | filter_mode | uv_swiz | yuv2rgb | conversion | compress_mode | + src_premultiply_enable | index_endian)); + if(source->yuv.uv_planar) { + /* Program u plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A51, source->yuv.uv_planar)); + } + if(source->yuv.v_planar) { + /* Program v plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source->yuv.v_planar)); + } + if(source->yuv.alpha_planar != 0) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source->yuv.alpha_planar)); + } + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A27, target->bg_color)); + +#if !gcFEATURE_VG_LVGL_SUPPORT + if(lvgl_sw_blend) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source->lvgl_buffer->address)); + } + else +#endif + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source->address)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); + /* 24bit format stride configured to 4bpp. */ + if(source->format >= VG_LITE_RGB888 && source->format <= VG_LITE_RGBA5658) { + stride = source->stride / 3 * 4; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, stride | tiled_source)); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, source->stride | tiled_source)); + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2D, rect_x | (rect_y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2F, rect_w | (rect_h << 16))); + +#if VG_SW_BLIT_PRECISION_OPT + if(enableSwPreOpt) { + VG_LITE_RETURN_ERROR(push_rectangle(&s_context, point_min.x + matrixOffsetX, point_min.y, point_max.x - point_min.x, + point_max.y - point_min.y)); + } + else +#endif /* VG_SW_BLIT_PRECISION_OPT */ + { + VG_LITE_RETURN_ERROR(push_rectangle(&s_context, point_min.x, point_min.y, point_max.x - point_min.x, + point_max.y - point_min.y)); + } + +#if !gcFEATURE_VG_STRIPE_MODE + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0E02, 0x10 | (0x7 << 8))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0F00, 0x10 | (0x7 << 8))); +#endif + + if(!s_context.flexa_mode) { + error = flush_target(); + } +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_NORMAL, 0xFF)); + } +#endif + + vglitemDUMP_BUFFER("image", (size_t)source->address, source->memory, 0, (source->stride) * (source->height)); + +#if DUMP_IMAGE + dump_img(source->memory, source->width, source->height, source->format); +#endif + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +/* Program initial states for tessellation buffer. */ +static vg_lite_error_t program_tessellation(vg_lite_context_t * context) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t tessellation_size = 0; + +#if (CHIPID==0x355 || CHIPID==0x255) + + /* Compute tessellation buffer size. */ + uint32_t width = (context->tessbuf.tess_w_h & 0xFFFF); + /* uint32_t height = (context->tessbuf.tess_w_h >> 16); */ + + context->tessbuf.tess_stride = VG_LITE_ALIGN(width * 8, 64); + + /* Each bit in the L1 cache represents 64 bytes of tessellation data. */ + context->tessbuf.L1_size = VG_LITE_ALIGN(VG_LITE_ALIGN(context->tessbuf.tessbuf_size / 64, 64) / 8, 64); +#if (CHIPID==0x355) + /* Each bit in the L2 cache represents 32 bytes of L1 data. */ + context->tessbuf.L2_size = VG_LITE_ALIGN(VG_LITE_ALIGN(context->tessbuf.L1_size / 32, 64) / 8, 64); + tessellation_size = context->tessbuf.L2_size; +#else /* CHIPID: 0x255 */ + tessellation_size = context->tessbuf.L1_size; +#endif + + context->tessbuf.L1_phyaddr = context->tessbuf.physical_addr + context->tessbuf.tessbuf_size; + context->tessbuf.L2_phyaddr = context->tessbuf.L1_phyaddr + context->tessbuf.L1_size; + context->tessbuf.L1_logical = context->tessbuf.logical_addr + context->tessbuf.tessbuf_size; + context->tessbuf.L2_logical = context->tessbuf.L1_logical + context->tessbuf.L1_size; + + /* Program tessellation buffer: input for VG module. */ + VG_LITE_RETURN_ERROR(push_state(context, 0x0A30, context->tessbuf.physical_addr)); /* Tessellation buffer address. */ + VG_LITE_RETURN_ERROR(push_state(context, 0x0A31, + context->tessbuf.L1_phyaddr)); /* L1 address of tessellation buffer. */ + VG_LITE_RETURN_ERROR(push_state(context, 0x0A32, + context->tessbuf.L2_phyaddr)); /* L2 address of tessellation buffer. */ + VG_LITE_RETURN_ERROR(push_state(context, 0x0A33, context->tessbuf.tess_stride)); + + /* Program tessellation control: for TS module. */ + VG_LITE_RETURN_ERROR(push_state(context, 0x0A35, context->tessbuf.physical_addr)); + VG_LITE_RETURN_ERROR(push_state(context, 0x0A36, context->tessbuf.L1_phyaddr)); + VG_LITE_RETURN_ERROR(push_state(context, 0x0A37, context->tessbuf.L2_phyaddr)); + VG_LITE_RETURN_ERROR(push_state(context, 0x0A38, context->tessbuf.tess_stride)); + VG_LITE_RETURN_ERROR(push_state(context, 0x0A3A, context->tessbuf.tess_w_h)); + +#if (REVISION==0x1217 && CID==0x407) + VG_LITE_RETURN_ERROR(push_state(context, 0x0AB1, context->tessbuf.tess_stride)); + VG_LITE_RETURN_ERROR(push_state(context, 0x0AB2, context->tessbuf.tess_stride)); +#endif + + VG_LITE_RETURN_ERROR(push_state(context, 0x0A3D, tessellation_size / 64)); + +#else /* (CHIPID==0x355 || CHIPID==0x255) */ + + tessellation_size = context->tessbuf.tessbuf_size; + + /* Program tessellation control: for TS module. */ + VG_LITE_RETURN_ERROR(push_state(context, 0x0A35, context->tessbuf.physical_addr)); + VG_LITE_RETURN_ERROR(push_state(context, 0x0AC8, tessellation_size)); + VG_LITE_RETURN_ERROR(push_state(context, 0x0ACB, context->tessbuf.physical_addr + tessellation_size)); + VG_LITE_RETURN_ERROR(push_state(context, 0x0ACC, context->tessbuf.countbuf_size)); + +#endif /* (CHIPID==0x355 || CHIPID==0x255) */ + + return error; +} + +vg_lite_error_t vg_lite_init(vg_lite_uint32_t tess_width, vg_lite_uint32_t tess_height) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_init)(tess_width, tess_height); +#endif + + vg_lite_error_t error; + vg_lite_kernel_initialize_t initialize; + uint8_t i; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_init %d %d\n", tess_width, tess_height); +#endif + + if(s_context.rtbuffer) { + if(s_context.tess_width >= tess_width && s_context.tess_height >= tess_height) { + /* VGLite is already initialized properly. Return */ + return VG_LITE_SUCCESS; + } + else { + vg_lite_close(); + } + } + + s_context.rtbuffer = (vg_lite_buffer_t *)vg_lite_os_malloc(sizeof(vg_lite_buffer_t)); + if(!s_context.rtbuffer) + return VG_LITE_OUT_OF_RESOURCES; + memset(s_context.rtbuffer, 0, sizeof(vg_lite_buffer_t)); + + if(tess_width <= 0) { + tess_width = 0; + tess_height = 0; + } + if(tess_height <= 0) { + tess_height = 0; + tess_width = 0; + } + tess_width = VG_LITE_ALIGN(tess_width, 16); + + /* Allocate a command buffer and a tessellation buffer. + Add extra 8 bytes in the allocated command buffer so there is space for a END command. */ + initialize.command_buffer_size = command_buffer_size + 8; + initialize.tess_width = tess_width; + initialize.tess_height = tess_height; + initialize.command_buffer_pool = (vg_lite_vidmem_pool_t)s_context.command_buffer_pool; + initialize.tess_buffer_pool = (vg_lite_vidmem_pool_t)s_context.tess_buffer_pool; + initialize.context = &s_context.context; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_INITIALIZE, &initialize)); + + /* Verify driver ChipId/ChipRevision/Cid match hardware chip information */ + VG_LITE_RETURN_ERROR(check_hardware_chip_info()); + + /* Save draw context. */ + s_context.capabilities = initialize.capabilities; + s_context.command_buffer[0] = (uint8_t *)initialize.command_buffer[0]; + s_context.command_buffer[1] = (uint8_t *)initialize.command_buffer[1]; + s_context.command_buffer_size = command_buffer_size; + s_context.command_offset[0] = 0; + s_context.command_offset[1] = 0; + + if((tess_width > 0) && (tess_height > 0)) { + /* Set and Program Tessellation Buffer states. */ + s_context.tessbuf.physical_addr = initialize.physical_addr; + s_context.tessbuf.logical_addr = initialize.logical_addr; + s_context.tessbuf.tess_w_h = initialize.tess_w_h; + s_context.tessbuf.tessbuf_size = initialize.tessbuf_size; + s_context.tessbuf.countbuf_size = initialize.countbuf_size; + + VG_LITE_RETURN_ERROR(program_tessellation(&s_context)); + /* Init register gcregVGPEColorKey. */ + for(i = 0; i < 8; i++) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A90 + i, 0)); + } + } + s_context.custom_tessbuf = 0; + s_context.custom_cmdbuf = 0; + s_context.tess_width = tess_width; + s_context.tess_height = tess_height; + + /* Init scissor rect. */ + s_context.scissor[0] = + s_context.scissor[1] = + s_context.scissor[2] = + s_context.scissor[3] = 0; + + s_context.path_counter = 0; + + s_context.mirror_orient = VG_LITE_ORIENTATION_TOP_BOTTOM; + +#if DUMP_INIT_COMMAND + physical_address = (size_t)CMDBUF_BUFFER(s_context); + uint32_t * ptr = (uint32_t *) s_context.context.command_buffer_logical[CMDBUF_INDEX(s_context)]; + ptr += 1; + for(int i = 0; i < 12; i++) { + init_buffer[i] = *ptr; + ptr += 2; + } + is_init = 0; +#endif + +#if DUMP_CAPTURE || DUMP_LAST_CAPTURE + _SetDumpFileInfo(); +#endif + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_close(void) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_close)(); +#endif + + vg_lite_error_t error; + vg_lite_kernel_terminate_t terminate; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_close\n"); +#endif + + if(s_context.scissor_layer) { + vg_lite_free(s_context.scissor_layer); + vg_lite_os_free(s_context.scissor_layer); + } + + if(s_context.custom_cmdbuf) { + vg_lite_kernel_unmap_memory_t unmap = {0}; + unmap.bytes = s_context.command_buffer_size * 2; + unmap.logical = s_context.command_buffer[0]; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_UNMAP_MEMORY, &unmap)); + } + + if(s_context.custom_tessbuf) { + vg_lite_kernel_unmap_memory_t unmap = {0}; + unmap.bytes = s_context.tessbuf.tessbuf_size + s_context.tessbuf.countbuf_size; + unmap.logical = s_context.tessbuf.logical_addr; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_UNMAP_MEMORY, &unmap)); + } + + /* Termnate the draw context. */ + terminate.context = &s_context.context; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_TERMINATE, &terminate)); + + if(s_context.rtbuffer) + vg_lite_os_free(s_context.rtbuffer); + + submit_flag = 0; + + /* Reset the draw context. */ + memset(&s_context, 0, sizeof(s_context)); + +#if DUMP_CAPTURE + _SetDumpFileInfo(); +#endif + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_set_command_buffer_size(vg_lite_uint32_t size) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_set_command_buffer_size)(size); +#endif + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_command_buffer_size %d\n", size); +#endif + + if(command_buffer_size == 0) + return VG_LITE_INVALID_ARGUMENT; + + command_buffer_size = size; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_set_command_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_map_memory_t map = { 0 }; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_command_buffer 0x%08X %d\n", physical, size); +#endif + + if((physical == 0) || (size == 0) || (physical % 64) || (size % 128)) + return VG_LITE_INVALID_ARGUMENT; + + map.bytes = size; + map.physical = physical; + + if(s_context.command_buffer[0]) { + + if(submit_flag) + VG_LITE_RETURN_ERROR(stall(&s_context, 0, (uint32_t)~0)); + + if(!s_context.custom_cmdbuf) { + vg_lite_kernel_free_t free; + free.memory_handle = s_context.context.command_buffer[0]; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &free)); + s_context.context.command_buffer[0] = 0; + + free.memory_handle = s_context.context.command_buffer[1]; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &free)); + s_context.context.command_buffer[1] = 0; + } + else { + vg_lite_kernel_unmap_memory_t unmap = { 0 }; + + unmap.bytes = s_context.command_buffer_size + 8; + unmap.logical = s_context.command_buffer[0]; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_UNMAP_MEMORY, &unmap)); + unmap.bytes = s_context.command_buffer_size + 8; + unmap.logical = s_context.command_buffer[1]; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_UNMAP_MEMORY, &unmap)); + } + } + + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_MAP_MEMORY, &map)); + + s_context.context.command_buffer_logical[0] = map.logical; + s_context.context.command_buffer_physical[0] = map.physical; + + s_context.context.command_buffer_logical[1] = (void *)((uint8_t *)map.logical + map.bytes / 2); + s_context.context.command_buffer_physical[1] = map.physical + map.bytes / 2; + + s_context.command_buffer[0] = s_context.context.command_buffer_logical[0]; + s_context.command_buffer[1] = s_context.context.command_buffer_logical[1]; + s_context.command_offset[0] = 0; + s_context.command_offset[1] = 0; + s_context.command_buffer_current = 0; + /* Reserve 8 bytes in mapped command buffer so there is space for a END command. */ + s_context.command_buffer_size = (map.bytes / 2) - 8; + s_context.custom_cmdbuf = 1; + + return error; +} + +vg_lite_error_t vg_lite_set_tess_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_map_memory_t map = { 0 }; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_tess_buffer 0x%08X %d\n", physical, size); +#endif + + if((physical == 0) || (size == 0) || (physical % 64) || (size % 64) || (size < MIN_TS_SIZE)) + return VG_LITE_INVALID_ARGUMENT; + + map.bytes = size; + map.physical = physical; + + if(s_context.tessbuf.logical_addr) { + if(submit_flag) + VG_LITE_RETURN_ERROR(stall(&s_context, 0, (uint32_t)~0)); + if(!s_context.custom_tessbuf) { + vg_lite_kernel_free_t free; + free.memory_handle = s_context.context.tess_buffer; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &free)); + s_context.context.tess_buffer = 0; + } + else { + vg_lite_kernel_unmap_memory_t unmap = { 0 }; + + unmap.bytes = s_context.tessbuf.tessbuf_size + s_context.tessbuf.countbuf_size; + unmap.logical = s_context.tessbuf.logical_addr; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_UNMAP_MEMORY, &unmap)); + } + } + + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_MAP_MEMORY, &map)); + + s_context.tessbuf.logical_addr = map.logical; + s_context.tessbuf.physical_addr = map.physical; + s_context.tessbuf.countbuf_size = size * 3 / 128; + s_context.tessbuf.countbuf_size = VG_LITE_ALIGN(s_context.tessbuf.countbuf_size, 64); + s_context.tessbuf.tessbuf_size = map.bytes - s_context.tessbuf.countbuf_size; + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A35, s_context.tessbuf.physical_addr)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AC8, s_context.tessbuf.tessbuf_size)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0ACB, s_context.tessbuf.physical_addr + s_context.tessbuf.tessbuf_size)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0ACC, s_context.tessbuf.countbuf_size)); + + s_context.custom_tessbuf = 1; + + return error; +} + +vg_lite_error_t vg_lite_get_mem_size(vg_lite_uint32_t * size) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_mem_t mem; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_get_mem_size %p\n", size); +#endif + + mem.pool = VG_LITE_POOL_RESERVED_MEMORY1; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_QUERY_MEM, &mem)); + *size = mem.bytes; + + return error; +} + +/* Handle tiled & yuv allocation. Currently including NV12, ANV12, YV12, YV16, NV16, YV24, NV24. */ +static vg_lite_error_t _allocate_tiled_yuv_planar(vg_lite_buffer_t * buffer) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t yplane_size = 0; + vg_lite_kernel_allocate_t allocate, uv_allocate, v_allocate; + + if(((buffer->format < VG_LITE_NV12) || (buffer->format > VG_LITE_ANV12_TILED) + || (buffer->format == VG_LITE_AYUY2) || (buffer->format == VG_LITE_YUY2_TILED)) + && ((buffer->format != VG_LITE_NV24) && (buffer->format != VG_LITE_NV24_TILED))) { + return error; + } + + /* For NV12, there are 2 planes (Y, UV); + For ANV12, there are 3 planes (Y, UV, Alpha). + Each plane must be aligned by (4, 8). + Then Y plane must be aligned by (8, 8). + For YVxx, there are 3 planes (Y, U, V). + YV12 is similar to NV12, both YUV420 format. + YV16 and NV16 are YUV422 format. + YV24 is YUV444 format. + */ + buffer->width = VG_LITE_ALIGN(buffer->width, 8); + buffer->height = VG_LITE_ALIGN(buffer->height, 8); + buffer->stride = VG_LITE_ALIGN(buffer->width, 64); + + switch(buffer->format) { + case VG_LITE_NV12: + case VG_LITE_ANV12: + case VG_LITE_NV12_TILED: + case VG_LITE_ANV12_TILED: + buffer->yuv.uv_stride = buffer->stride; + buffer->yuv.alpha_stride = buffer->stride; + buffer->yuv.uv_height = buffer->height / 2; + break; + + case VG_LITE_NV16: + buffer->yuv.uv_stride = buffer->stride; + buffer->yuv.uv_height = buffer->height; + break; + + case VG_LITE_NV24: + case VG_LITE_NV24_TILED: + buffer->yuv.uv_stride = buffer->stride * 2; + buffer->yuv.uv_height = buffer->height; + break; + + case VG_LITE_YV12: + buffer->yuv.uv_stride = + buffer->yuv.v_stride = buffer->stride / 2; + buffer->yuv.uv_height = + buffer->yuv.v_height = buffer->height / 2; + break; + + case VG_LITE_YV16: + buffer->yuv.uv_stride = + buffer->yuv.v_stride = buffer->stride; + buffer->yuv.uv_height = + buffer->yuv.v_height = buffer->height / 2; + break; + + case VG_LITE_YV24: + buffer->yuv.uv_stride = + buffer->yuv.v_stride = buffer->stride; + buffer->yuv.uv_height = + buffer->yuv.v_height = buffer->height; + break; + + default: + return error; + } + + yplane_size = buffer->stride * buffer->height; + + /* Allocate buffer memory: Y. */ + allocate.bytes = yplane_size; + allocate.contiguous = 1; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &allocate)); + + /* Save the allocation. */ + buffer->handle = allocate.memory_handle; + buffer->memory = allocate.memory; + buffer->address = allocate.memory_gpu; + + if((buffer->format == VG_LITE_NV12) || (buffer->format == VG_LITE_ANV12) + || (buffer->format == VG_LITE_NV16) || (buffer->format == VG_LITE_NV24) + || (buffer->format == VG_LITE_NV12_TILED) || (buffer->format == VG_LITE_ANV12_TILED)) { + /* Allocate buffer memory: UV. */ + uv_allocate.bytes = buffer->yuv.uv_stride * buffer->yuv.uv_height; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &uv_allocate)); + buffer->yuv.uv_handle = uv_allocate.memory_handle; + buffer->yuv.uv_memory = uv_allocate.memory; + buffer->yuv.uv_planar = uv_allocate.memory_gpu; + + if((buffer->format == VG_LITE_ANV12) || (buffer->format == VG_LITE_ANV12_TILED)) { + uv_allocate.bytes = yplane_size; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &uv_allocate)); + buffer->yuv.alpha_planar = uv_allocate.memory_gpu; + } + } + else { + /* Allocate buffer memory: U, V. */ + uv_allocate.bytes = buffer->yuv.uv_stride * buffer->yuv.uv_height; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &uv_allocate)); + buffer->yuv.uv_handle = uv_allocate.memory_handle; + buffer->yuv.uv_memory = uv_allocate.memory; + buffer->yuv.uv_planar = uv_allocate.memory_gpu; + + v_allocate.bytes = buffer->yuv.v_stride * buffer->yuv.v_height; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &v_allocate)); + buffer->yuv.v_handle = v_allocate.memory_handle; + buffer->yuv.v_memory = v_allocate.memory; + buffer->yuv.v_planar = v_allocate.memory_gpu; + } + + return error; +} + +vg_lite_error_t vg_lite_allocate(vg_lite_buffer_t * buffer) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_allocate)(buffer); +#endif + + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_allocate_t allocate; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_allocate %p (w: %d, h: %d, fmt: %d)\n", buffer, buffer->width, buffer->height, buffer->format); +#endif + + if(buffer->format == VG_LITE_RGBA8888_ETC2_EAC && +#if (CHIPID == 0x555) + (buffer->width % 16 || buffer->height % 4) +#else + (buffer->width % 4 || buffer->height % 4) +#endif + ) { + return VG_LITE_INVALID_ARGUMENT; + } + + /* Set buffer->premultiplied properly according to buffer->format */ + if(buffer->format < VG_LITE_RGBA8888) { + /* For all OpenVG VG_* formats */ +#if gcFEATURE_VG_HW_PREMULTIPLY + switch(buffer->format) { + case OPENVG_sRGBA_8888_PRE: + case OPENVG_lRGBA_8888_PRE: + case OPENVG_sARGB_8888_PRE: + case OPENVG_lARGB_8888_PRE: + case OPENVG_sBGRA_8888_PRE: + case OPENVG_lBGRA_8888_PRE: + case OPENVG_sABGR_8888_PRE: + case OPENVG_lABGR_8888_PRE: + case OPENVG_sRGBX_8888_PRE: + case OPENVG_lRGBX_8888_PRE: + case OPENVG_sRGB_565_PRE: + case OPENVG_lRGB_565_PRE: + case OPENVG_sRGBA_5551_PRE: + case OPENVG_lRGBA_5551_PRE: + case OPENVG_sRGBA_4444_PRE: + case OPENVG_lRGBA_4444_PRE: + buffer->premultiplied = 1; + break; + default: + buffer->premultiplied = 0; + break; + }; +#else + /* Cannot support OpenVG VG_* format if HW does not support premultiply */ + return VG_LITE_INVALID_ARGUMENT; +#endif + } + else { + /* All VG_LITE_* formats are not premultiplied */ + buffer->premultiplied = 0; + } + + /* Reset planar. */ + buffer->yuv.uv_planar = + buffer->yuv.v_planar = + buffer->yuv.alpha_planar = 0; + + /* Align height in case format is tiled. */ + if((buffer->format >= VG_LITE_YUY2 && buffer->format <= VG_LITE_NV16) || buffer->format == VG_LITE_NV24) { + buffer->height = VG_LITE_ALIGN(buffer->height, 4); + buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; + } + + if((buffer->format >= VG_LITE_YUY2_TILED && buffer->format <= VG_LITE_AYUY2_TILED) || + buffer->format == VG_LITE_NV24_TILED) { + buffer->height = VG_LITE_ALIGN(buffer->height, 4); + buffer->tiled = VG_LITE_TILED; + buffer->yuv.swizzle = VG_LITE_SWIZZLE_UV; + } + + if((buffer->format >= VG_LITE_NV12 && buffer->format <= VG_LITE_ANV12_TILED + && buffer->format != VG_LITE_AYUY2 && buffer->format != VG_LITE_YUY2_TILED) + || (buffer->format >= VG_LITE_NV24 && buffer->format <= VG_LITE_NV24_TILED)) { + _allocate_tiled_yuv_planar(buffer); + } + else { + /* Driver need compute the stride always with RT500 project. */ + + vg_lite_float_t ratio = 1.0f; + uint32_t mul, div, align; + get_format_bytes(buffer->format, &mul, &div, &align); + buffer->stride = buffer->width * mul / div; + +#if gcFEATURE_VG_16PIXELS_ALIGNED + int tmp_align = 16 * mul / div; + if((mul / div) % 2 != 0) { + if(buffer->stride % tmp_align != 0) { + buffer->stride = (buffer->stride + tmp_align) / tmp_align * tmp_align; + } + } + else { + buffer->stride = VG_LITE_ALIGN(buffer->stride, tmp_align); + } +#endif + /* Allocate the buffer. */ + if(buffer->compress_mode) + ratio = _calc_decnano_compress_ratio(buffer->format, buffer->compress_mode); + allocate.bytes = (uint32_t)(buffer->stride * buffer->height * ratio); + +#if gcFEATURE_VG_IM_FASTCLEAR + allocate.bytes = VG_LITE_ALIGN(allocate.bytes, 64); +#endif + allocate.contiguous = 1; + allocate.pool = (vg_lite_vidmem_pool_t)s_context.render_buffer_pool; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &allocate)); + + /* Save the buffer allocation. */ + buffer->handle = allocate.memory_handle; + buffer->memory = allocate.memory; + buffer->address = allocate.memory_gpu; + buffer->pool = (vg_lite_memory_pool_t)allocate.pool; + + if((buffer->format == VG_LITE_AYUY2) || (buffer->format == VG_LITE_AYUY2_TILED) || + ((buffer->format >= VG_LITE_ABGR8565_PLANAR) + && (buffer->format <= VG_LITE_RGBA5658_PLANAR))) { + allocate.bytes = buffer->stride * buffer->height; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &allocate)); + buffer->yuv.alpha_planar = allocate.memory_gpu; + } + } + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("=>buffer: width=%d, height=%d, stride=%d, bytes=%d, format=%d\n", + buffer->width, buffer->height, buffer->stride, allocate.bytes, buffer->format); +#endif + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_free(vg_lite_buffer_t * buffer) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_free)(buffer); +#endif + + vg_lite_error_t error; + vg_lite_kernel_free_t free, uv_free, v_free; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_free %p\n", buffer); +#endif + + if(buffer == NULL) + return VG_LITE_INVALID_ARGUMENT; + if(!(memcmp(s_context.rtbuffer, buffer, sizeof(vg_lite_buffer_t)))) { + if(VG_LITE_SUCCESS == submit(&s_context)) { + VG_LITE_RETURN_ERROR(stall(&s_context, 0, ~0)); + } + +#if !DUMP_COMMAND_CAPTURE + vglitemDUMP("@[swap 0x%08X %dx%d +%u]", + s_context.rtbuffer->address, + s_context.rtbuffer->width, s_context.rtbuffer->height, + s_context.rtbuffer->stride); + vglitemDUMP_BUFFER( + "framebuffer", + (size_t)s_context.rtbuffer->address, s_context.rtbuffer->memory, + 0, + s_context.rtbuffer->stride * (s_context.rtbuffer->height)); +#endif + + memset(s_context.rtbuffer, 0, sizeof(vg_lite_buffer_t)); + } + +#if !gcFEATURE_VG_LVGL_SUPPORT + if(buffer->lvgl_buffer != NULL) { + free.memory_handle = buffer->lvgl_buffer->handle; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &free)); + vg_lite_os_free(buffer->lvgl_buffer); + buffer->lvgl_buffer = NULL; + } +#endif + + if(buffer->yuv.uv_planar) { + /* Free UV(U) planar buffer. */ + vglitemDUMP_BUFFER( + "uv_plane", + (size_t)buffer->yuv.uv_planar, buffer->yuv.uv_memory, + 0, + buffer->yuv.uv_stride * buffer->yuv.uv_height); + + uv_free.memory_handle = buffer->yuv.uv_handle; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &uv_free)); + + /* Mark the buffer as freed. */ + buffer->yuv.uv_handle = NULL; + buffer->yuv.uv_memory = NULL; + } + + if(buffer->yuv.v_planar) { + /* Free V planar buffer. */ + vglitemDUMP_BUFFER( + "v_plane", + (size_t)buffer->yuv.v_planar, buffer->yuv.v_memory, + 0, + buffer->yuv.v_stride * buffer->yuv.v_height); + /* Free V planar buffer. */ + v_free.memory_handle = buffer->yuv.v_handle; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &v_free)); + + /* Mark the buffer as freed. */ + buffer->yuv.v_handle = NULL; + buffer->yuv.v_memory = NULL; + } + +#if gcFEATURE_VG_IM_FASTCLEAR + if(buffer->fc_buffer[0].handle != 0) { +#if VG_TARGET_FC_DUMP + vglitemDUMP_BUFFER( + "fcbuffer", + (uint64_t)buffer->fc_buffer[0].address, buffer->fc_buffer[0].memory, + 0, + buffer->fc_buffer[0].stride * (buffer->fc_buffer[0].height)); +#endif + _free_fc_buffer(&buffer->fc_buffer[0]); + } +#endif + + /* Make sure we have a valid memory handle. */ + if(buffer->handle == NULL) { + return VG_LITE_INVALID_ARGUMENT; + } + + /* Free the buffer. */ + free.memory_handle = buffer->handle; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &free)); + + /* Mark the buffer as freed. */ + buffer->handle = NULL; + buffer->memory = NULL; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_map(vg_lite_buffer_t * buffer, vg_lite_map_flag_t flag, int32_t fd) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_map)(buffer, flag, fd); +#endif + + vg_lite_error_t error; + vg_lite_kernel_map_t map; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_map %p\n", buffer); +#endif + + /* We either need a logical or physical address. */ + if(buffer->memory == NULL && buffer->address == 0) { + return VG_LITE_INVALID_ARGUMENT; + } + + /* Compute the stride. Align if necessary. */ + if(buffer->stride == 0) { + uint32_t mul, div, align; + get_format_bytes(buffer->format, &mul, &div, &align); + buffer->stride = buffer->width * mul / div; + } + + /* Map the buffer. */ + map.bytes = buffer->stride * buffer->height; + map.logical = buffer->memory; + map.physical = buffer->address; + + if(flag == VG_LITE_MAP_USER_MEMORY) { + map.flags = VG_LITE_HAL_MAP_USER_MEMORY; + } + else if(flag == VG_LITE_MAP_DMABUF) { + map.flags = VG_LITE_HAL_MAP_DMABUF; + } + else { + return VG_LITE_INVALID_ARGUMENT; + } + + map.dma_buf_fd = fd; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_MAP, &map)); + + /* Save the buffer allocation. */ + buffer->handle = map.memory_handle; + buffer->address = map.memory_gpu; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_unmap(vg_lite_buffer_t * buffer) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_unmap)(buffer); +#endif + + vg_lite_error_t error; + vg_lite_kernel_unmap_t unmap; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_unmap %p\n", buffer); +#endif + + /* Make sure we have a valid memory handle. */ + if(buffer->handle == NULL) { + return VG_LITE_INVALID_ARGUMENT; + } + + /* Unmap the buffer. */ + unmap.memory_handle = buffer->handle; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_UNMAP, &unmap)); + + /* Mark the buffer as freed. */ + buffer->handle = NULL; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_flush_mapped_buffer(vg_lite_buffer_t * buffer) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_flush_mapped_buffer)(buffer); +#endif + + vg_lite_error_t error; + vg_lite_kernel_cache_t cache; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_flush_mapped_buffer %p\n", buffer); +#endif + + /* Make sure we have a valid memory handle. */ + if(buffer->handle == NULL) { + return VG_LITE_INVALID_ARGUMENT; + } + + cache.memory_handle = buffer->handle; + cache.cache_op = VG_LITE_CACHE_INVALIDATE; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_CACHE, &cache)); + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_get_register(vg_lite_uint32_t address, vg_lite_uint32_t * result) +{ + vg_lite_error_t error; + vg_lite_kernel_info_t data; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_get_register 0x%08X %p\n", address, result); +#endif + + /* Get input register address. */ + data.addr = address; + + /* Get register info. */ + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_CHECK, &data)); + + /* Return register info. */ + *result = data.reg; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_get_info(vg_lite_info_t * info) +{ +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_get_info %p\n", info); +#endif + + if(info != NULL) { + info->api_version = VGLITE_API_VERSION_3_0; + info->header_version = VGLITE_HEADER_VERSION; + info->release_version = VGLITE_RELEASE_VERSION; + info->reserved = 0; + } + + return VG_LITE_SUCCESS; +} + +vg_lite_uint32_t vg_lite_get_product_info(vg_lite_char * name, vg_lite_uint32_t * chip_id, vg_lite_uint32_t * chip_rev) +{ + const char * product_name; + uint32_t name_len; + vg_lite_uint32_t rev = 0, id = 0; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_get_product_info %p %p %p\n", name, chip_id, chip_rev); +#endif + + vg_lite_get_register(0x24, &rev); + vg_lite_get_register(0x20, &id); + + if(id == 0x265 || id == 0x555) + product_name = "GCNanoUltraV"; + else if(id == 0x255) + product_name = "GCNanoLiteV"; + else if(id == 0x355) + product_name = "GC355"; + else + product_name = "Unknown"; + + name_len = strlen(product_name) + 1; + if(name != NULL) { + memcpy(name, product_name, name_len); + } + + if(chip_id != NULL) { + *chip_id = id; + } + + if(chip_rev != NULL) { + *chip_rev = rev; + } + + return name_len; +} + +vg_lite_uint32_t vg_lite_query_feature(vg_lite_feature_t feature) +{ + uint32_t result; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_query_feature %d\n", feature); +#endif + + if(feature < gcFEATURE_COUNT) + result = s_ftable.ftable[feature]; + else + result = 0; + + return result; +} + +vg_lite_error_t vg_lite_finish() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_finish)(); +#endif + + vg_lite_error_t error; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_finish\n"); +#endif + + /* Return if there is nothing to submit. */ + if(CMDBUF_OFFSET(s_context) == 0) { + if(submit_flag) + VG_LITE_RETURN_ERROR(stall(&s_context, 0, (uint32_t)~0)); + return VG_LITE_SUCCESS; + } + + /* Flush is moved from each draw to here. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, 0x00000001)); + + VG_LITE_RETURN_ERROR(flush_target()); + VG_LITE_RETURN_ERROR(submit(&s_context)); +#if gcFEATURE_VG_POWER_MANAGEMENT + s_context.context.end_of_frame = 1; +#endif + +#if defined(_WINDLL) + VG_LITE_RETURN_ERROR(stall(&s_context, 0, (uint32_t)~0)); +#elif defined(__linux__) + VG_LITE_RETURN_ERROR(stall(&s_context, 20000, (uint32_t)~0)); +#else + VG_LITE_RETURN_ERROR(stall(&s_context, 5000, (uint32_t)~0)); +#endif + +#if gcFEATURE_VG_IM_FASTCLEAR +#if VG_TARGET_FC_DUMP + fc_buf_dump(s_context.rtbuffer, &s_context.fcBuffer); +#endif +#endif + +#if gcFEATURE_VG_SINGLE_COMMAND_BUFFER + CMDBUF_OFFSET(s_context) = 0; +#else + CMDBUF_SWAP(s_context); + /* Reset command buffer. */ + CMDBUF_OFFSET(s_context) = 0; +#endif + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_flush(void) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_flush)(); +#endif + +#if !gcFEATURE_VG_SINGLE_COMMAND_BUFFER + vg_lite_error_t error; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_flush\n"); +#endif + + /* Return if there is nothing to submit. */ + if(CMDBUF_OFFSET(s_context) == 0) + return VG_LITE_SUCCESS; + + /* Wait if GPU has not completed previous CMD buffer */ + if(submit_flag) { + VG_LITE_RETURN_ERROR(stall(&s_context, 0, (uint32_t)~0)); + } + + /* Submit the current command buffer. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, 0x00000001)); + VG_LITE_RETURN_ERROR(flush_target()); + VG_LITE_RETURN_ERROR(submit(&s_context)); +#if gcFEATURE_VG_POWER_MANAGEMENT + s_context.context.end_of_frame = 1; +#endif + + CMDBUF_SWAP(s_context); + + /* Reset command buffer. */ + CMDBUF_OFFSET(s_context) = 0; + + return VG_LITE_SUCCESS; + +#else + printf("vg_lite_flush is not support when enable single command buffer!\n"); + return VG_LITE_NOT_SUPPORT; +#endif + +} + +vg_lite_error_t vg_lite_init_grad(vg_lite_linear_gradient_t * grad) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if DUMP_API + FUNC_DUMP(vg_lite_init_grad)(grad); +#endif + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_init_grad %p\n", grad); +#endif + + grad->count = 0; + + /* Set the member values according to driver defaults. */ + grad->image.width = VLC_GRADIENT_BUFFER_WIDTH; + grad->image.height = 1; + grad->image.stride = 0; + grad->image.format = VG_LITE_BGRA8888; + + /* Allocate the image for gradient. */ + VG_LITE_RETURN_ERROR(vg_lite_allocate(&grad->image)); + + return error; +} + +vg_lite_error_t vg_lite_set_linear_grad(vg_lite_ext_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_linear_gradient_parameter_t linear_gradient, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_multiplied) +{ + static vg_lite_color_ramp_t default_ramp[] = { + { + 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }, + { + 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f + } + }; + + uint32_t i, trg_count; + vg_lite_float_t prev_stop; + vg_lite_color_ramp_t * src_ramp; + vg_lite_color_ramp_t * src_ramp_last; + vg_lite_color_ramp_t * trg_ramp; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_linear_grad %p %d %p (%f %f %f %f) %d %d\n", grad, count, color_ramp, + linear_gradient.X0, linear_gradient.X1, linear_gradient.Y0, linear_gradient.Y1, spread_mode, pre_multiplied); +#endif + + /* Reset the count. */ + trg_count = 0; + + if((linear_gradient.X0 == linear_gradient.X1) && (linear_gradient.Y0 == linear_gradient.Y1)) + return VG_LITE_INVALID_ARGUMENT; + + grad->linear_grad = linear_gradient; + grad->pre_multiplied = pre_multiplied; + grad->spread_mode = spread_mode; + + if(!count || count > VLC_MAX_COLOR_RAMP_STOPS || color_ramp == NULL) + goto Empty_sequence_handler; + + for(i = 0; i < count; i++) + grad->color_ramp[i] = color_ramp[i]; + grad->ramp_length = count; + + /* Determine the last source ramp. */ + src_ramp_last + = grad->color_ramp + + grad->ramp_length; + + /* Set the initial previous stop. */ + prev_stop = -1; + + /* Reset the count. */ + trg_count = 0; + + /* Walk through the source ramp. */ + for( + src_ramp = grad->color_ramp, trg_ramp = grad->converted_ramp; + (src_ramp < src_ramp_last) && (trg_count < VLC_MAX_COLOR_RAMP_STOPS + 2); + src_ramp += 1 + ) { + /* Must be in increasing order. */ + if(src_ramp->stop < prev_stop) { + /* Ignore the entire sequence. */ + trg_count = 0; + break; + } + + /* Update the previous stop value. */ + prev_stop = src_ramp->stop; + + /* Must be within [0..1] range. */ + if((src_ramp->stop < 0.0f) || (src_ramp->stop > 1.0f)) { + /* Ignore. */ + continue; + } + + /* Clamp color. */ + ClampColor(COLOR_FROM_RAMP(src_ramp), COLOR_FROM_RAMP(trg_ramp), 0); + + /* First stop greater then zero? */ + if((trg_count == 0) && (src_ramp->stop > 0.0f)) { + /* Force the first stop to 0.0f. */ + trg_ramp->stop = 0.0f; + + /* Replicate the entry. */ + trg_ramp[1] = *trg_ramp; + trg_ramp[1].stop = src_ramp->stop; + + /* Advance. */ + trg_ramp += 2; + trg_count += 2; + } + else { + /* Set the stop value. */ + trg_ramp->stop = src_ramp->stop; + + /* Advance. */ + trg_ramp += 1; + trg_count += 1; + } + } + + /* Empty sequence? */ + if(trg_count == 0) { + memcpy(grad->converted_ramp, default_ramp, sizeof(default_ramp)); + grad->converted_length = sizeof(default_ramp) / 5; + } + else { + /* The last stop must be at 1.0. */ + if(trg_ramp[-1].stop != 1.0f) { + /* Replicate the last entry. */ + *trg_ramp = trg_ramp[-1]; + + /* Force the last stop to 1.0f. */ + trg_ramp->stop = 1.0f; + + /* Update the final entry count. */ + trg_count += 1; + } + + /* Set new length. */ + grad->converted_length = trg_count; + } + return VG_LITE_SUCCESS; + +Empty_sequence_handler: + memcpy(grad->converted_ramp, default_ramp, sizeof(default_ramp)); + grad->converted_length = sizeof(default_ramp) / 5; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_update_linear_grad(vg_lite_ext_linear_gradient_t * grad) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_update_linear_grad)(grad); +#endif + + uint32_t ramp_length; + vg_lite_color_ramp_t * color_ramp; + uint32_t stop; + uint32_t i, width; + uint8_t * bits; + vg_lite_float_t x0, y0, x1, y1, length, dx, dy; + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_update_linear_grad %p\n", grad); +#endif + + /* Get shortcuts to the color ramp. */ + ramp_length = grad->converted_length; + color_ramp = grad->converted_ramp; + + x0 = grad->matrix.m[0][0] * grad->linear_grad.X0 + grad->matrix.m[0][1] * grad->linear_grad.Y0 + grad->matrix.m[0][2]; + y0 = grad->matrix.m[1][0] * grad->linear_grad.X0 + grad->matrix.m[1][1] * grad->linear_grad.Y0 + grad->matrix.m[1][2]; + x1 = grad->matrix.m[0][0] * grad->linear_grad.X1 + grad->matrix.m[0][1] * grad->linear_grad.Y1 + grad->matrix.m[0][2]; + y1 = grad->matrix.m[1][0] * grad->linear_grad.X1 + grad->matrix.m[1][1] * grad->linear_grad.Y1 + grad->matrix.m[1][2]; + dx = x1 - x0; + dy = y1 - y0; + length = (vg_lite_float_t)sqrt(dx * dx + dy * dy); + width = ramp_length * 128; + + if(length <= 0) + return VG_LITE_INVALID_ARGUMENT; + /* Find the common denominator of the color ramp stops. */ + + /* Compute transform matrix from ramp surface to grad.*/ + vg_lite_identity(&(grad->matrix)); + vg_lite_translate(x0, y0, &(grad->matrix)); + vg_lite_rotate( + ((dy >= 0) ? acosf(dx / length) : (2 * PI - acosf(dx / length))) * 180.f / PI, + &(grad->matrix) + ); + vg_lite_scale(length / width, 1.f, &(grad->matrix)); + + /* Set grad to ramp surface. */ + grad->linear_grad.X0 = 0.f; + grad->linear_grad.Y0 = 0.f; + grad->linear_grad.X1 = (float)width; + grad->linear_grad.Y1 = 0.f; + + /* Allocate the color ramp surface. */ + memset(&grad->image, 0, sizeof(grad->image)); + grad->image.width = width; + grad->image.height = 1; + grad->image.stride = 0; + grad->image.image_mode = VG_LITE_NONE_IMAGE_MODE; + grad->image.format = VG_LITE_ABGR8888; + + /* Allocate the image for gradient. */ + VG_LITE_RETURN_ERROR(vg_lite_allocate(&grad->image)); + memset(grad->image.memory, 0, grad->image.stride * grad->image.height); + /* Set pointer to color array. */ + bits = (uint8_t *)grad->image.memory; + + /* Start filling the color array. */ + stop = 0; + for(i = 0; i < width; ++i) { + vg_lite_float_t gradient; + vg_lite_float_t color[4]; + vg_lite_float_t color1[4]; + vg_lite_float_t color2[4]; + vg_lite_float_t weight; + + if(i == 241) + i = 241; + /* Compute gradient for current color array entry. */ + gradient = (vg_lite_float_t) i / (vg_lite_float_t)(width - 1); + + /* Find the entry in the color ramp that matches or exceeds this + ** gradient. */ + while(gradient > color_ramp[stop].stop) { + ++stop; + } + + if(gradient == color_ramp[stop].stop) { + /* Perfect match weight 1.0. */ + weight = 1.0f; + + /* Use color ramp color. */ + color1[3] = color_ramp[stop].alpha; + color1[2] = color_ramp[stop].blue; + color1[1] = color_ramp[stop].green; + color1[0] = color_ramp[stop].red; + + color2[3] = + color2[2] = + color2[1] = + color2[0] = 0.0f; + } + else { + if(stop == 0) { + return VG_LITE_INVALID_ARGUMENT; + } + /* Compute weight. */ + weight = (color_ramp[stop].stop - gradient) + / (color_ramp[stop].stop - color_ramp[stop - 1].stop); + + /* Grab color ramp color of previous stop. */ + color1[3] = color_ramp[stop - 1].alpha; + color1[2] = color_ramp[stop - 1].blue; + color1[1] = color_ramp[stop - 1].green; + color1[0] = color_ramp[stop - 1].red; + + /* Grab color ramp color of current stop. */ + color2[3] = color_ramp[stop].alpha; + color2[2] = color_ramp[stop].blue; + color2[1] = color_ramp[stop].green; + color2[0] = color_ramp[stop].red; + } + + if(grad->pre_multiplied) { + /* Pre-multiply the first color. */ + color1[2] *= color1[3]; + color1[1] *= color1[3]; + color1[0] *= color1[3]; + + /* Pre-multiply the second color. */ + color2[2] *= color2[3]; + color2[1] *= color2[3]; + color2[0] *= color2[3]; + } + + /* Filter the colors per channel. */ + color[3] = LERP(color1[3], color2[3], weight); + color[2] = LERP(color1[2], color2[2], weight); + color[1] = LERP(color1[1], color2[1], weight); + color[0] = LERP(color1[0], color2[0], weight); + + /* Pack the final color. */ + *bits++ = PackColorComponent(color[3]); + *bits++ = PackColorComponent(color[2]); + *bits++ = PackColorComponent(color[1]); + *bits++ = PackColorComponent(color[0]); + } + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_set_radial_grad(vg_lite_radial_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_radial_gradient_parameter_t radial_grad, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_multiplied) +{ + static vg_lite_color_ramp_t defaultRamp[] = { + { + 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }, + { + 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f + } + }; + + uint32_t i, trgCount; + vg_lite_float_t prevStop; + vg_lite_color_ramp_t * srcRamp; + vg_lite_color_ramp_t * srcRampLast; + vg_lite_color_ramp_t * trgRamp; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_radial_grad %p %d %p (%f %f %f %f %f) %d %d\n", grad, count, color_ramp, + radial_grad.cx, radial_grad.cy, radial_grad.fx, radial_grad.fy, radial_grad.r, spread_mode, pre_multiplied); +#endif + + /* Reset the count. */ + trgCount = 0; + + if(radial_grad.r <= 0) + return VG_LITE_INVALID_ARGUMENT; + + grad->radial_grad = radial_grad; + grad->pre_multiplied = pre_multiplied; + grad->spread_mode = spread_mode; + + if(!count || count > VLC_MAX_COLOR_RAMP_STOPS || color_ramp == NULL) + goto Empty_sequence_handler; + + for(i = 0; i < count; i++) + grad->color_ramp[i] = color_ramp[i]; + grad->ramp_length = count; + + /* Determine the last source ramp. */ + srcRampLast + = grad->color_ramp + + grad->ramp_length; + + /* Set the initial previous stop. */ + prevStop = -1; + + /* Reset the count. */ + trgCount = 0; + + /* Walk through the source ramp. */ + for( + srcRamp = grad->color_ramp, trgRamp = grad->converted_ramp; + (srcRamp < srcRampLast) && (trgCount < VLC_MAX_COLOR_RAMP_STOPS + 2); + srcRamp += 1 + ) { + /* Must be in increasing order. */ + if(srcRamp->stop < prevStop) { + /* Ignore the entire sequence. */ + trgCount = 0; + break; + } + + /* Update the previous stop value. */ + prevStop = srcRamp->stop; + + /* Must be within [0..1] range. */ + if((srcRamp->stop < 0.0f) || (srcRamp->stop > 1.0f)) { + /* Ignore. */ + continue; + } + + /* Clamp color. */ + ClampColor(COLOR_FROM_RAMP(srcRamp), COLOR_FROM_RAMP(trgRamp), 0); + + /* First stop greater then zero? */ + if((trgCount == 0) && (srcRamp->stop > 0.0f)) { + /* Force the first stop to 0.0f. */ + trgRamp->stop = 0.0f; + + /* Replicate the entry. */ + trgRamp[1] = *trgRamp; + trgRamp[1].stop = srcRamp->stop; + + /* Advance. */ + trgRamp += 2; + trgCount += 2; + } + else { + /* Set the stop value. */ + trgRamp->stop = srcRamp->stop; + + /* Advance. */ + trgRamp += 1; + trgCount += 1; + } + } + + /* Empty sequence? */ + if(trgCount == 0) { + memcpy(grad->converted_ramp, defaultRamp, sizeof(defaultRamp)); + grad->converted_length = sizeof(defaultRamp) / 5; + } + else { + /* The last stop must be at 1.0. */ + if(trgRamp[-1].stop != 1.0f) { + /* Replicate the last entry. */ + *trgRamp = trgRamp[-1]; + + /* Force the last stop to 1.0f. */ + trgRamp->stop = 1.0f; + + /* Update the final entry count. */ + trgCount += 1; + } + + /* Set new length. */ + grad->converted_length = trgCount; + } + return VG_LITE_SUCCESS; + +Empty_sequence_handler: + memcpy(grad->converted_ramp, defaultRamp, sizeof(defaultRamp)); + grad->converted_length = sizeof(defaultRamp) / 5; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_update_radial_grad(vg_lite_radial_gradient_t * grad) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_update_radial_grad)(grad); +#endif + + uint32_t ramp_length; + vg_lite_color_ramp_t * colorRamp; + uint32_t common, stop; + uint32_t i, width; + uint8_t * bits; + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t align, mul, div; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_update_radial_grad %p\n", grad); +#endif + + /* Get shortcuts to the color ramp. */ + ramp_length = grad->converted_length; + colorRamp = grad->converted_ramp; + + if(grad->radial_grad.r <= 0) + return VG_LITE_INVALID_ARGUMENT; + + if(grad->radial_grad.r < 1) { + common = 1; + for(i = 0; i < ramp_length; ++i) { + if(colorRamp[i].stop != 0.0f) { + vg_lite_float_t mul2 = common * colorRamp[i].stop; + vg_lite_float_t frac = mul2 - (vg_lite_float_t)floor(mul2); + if(frac > 0.00013f) { /* Suppose error for zero is 0.00013 */ + common = MAX(common, (uint32_t)(1.0f / frac + 0.5f)); + } + } + } + + /* Compute the width of the required color array. */ + width = common + 1; + width = (width + 15) & (~0xf); + } + else { + width = ramp_length * 128; + } + + /* Allocate the color ramp surface. */ + memset(&grad->image, 0, sizeof(grad->image)); + grad->image.width = width; + grad->image.height = 1; + grad->image.stride = 0; + grad->image.image_mode = VG_LITE_NONE_IMAGE_MODE; + grad->image.format = VG_LITE_ABGR8888; + + /* Allocate the image for gradient. */ + VG_LITE_RETURN_ERROR(vg_lite_allocate(&grad->image)); + + get_format_bytes(VG_LITE_ABGR8888, &mul, &div, &align); + width = grad->image.stride * div / mul; + + /* Set pointer to color array. */ + bits = (uint8_t *)grad->image.memory; + + /* Start filling the color array. */ + stop = 0; + for(i = 0; i < width; ++i) { + vg_lite_float_t gradient; + vg_lite_float_t color[4]; + vg_lite_float_t color1[4]; + vg_lite_float_t color2[4]; + vg_lite_float_t weight; + + /* Compute gradient for current color array entry. */ + gradient = (vg_lite_float_t) i / (vg_lite_float_t)(width - 1); + + /* Find the entry in the color ramp that matches or exceeds this + ** gradient. */ + while(gradient > colorRamp[stop].stop) { + ++stop; + } + + if(gradient == colorRamp[stop].stop) { + /* Perfect match weight 1.0. */ + weight = 1.0f; + + /* Use color ramp color. */ + color1[3] = colorRamp[stop].alpha; + color1[2] = colorRamp[stop].blue; + color1[1] = colorRamp[stop].green; + color1[0] = colorRamp[stop].red; + + color2[3] = + color2[2] = + color2[1] = + color2[0] = 0.0f; + } + else { + /* Compute weight. */ + weight = (colorRamp[stop].stop - gradient) + / (colorRamp[stop].stop - colorRamp[stop - 1].stop); + + /* Grab color ramp color of previous stop. */ + color1[3] = colorRamp[stop - 1].alpha; + color1[2] = colorRamp[stop - 1].blue; + color1[1] = colorRamp[stop - 1].green; + color1[0] = colorRamp[stop - 1].red; + + /* Grab color ramp color of current stop. */ + color2[3] = colorRamp[stop].alpha; + color2[2] = colorRamp[stop].blue; + color2[1] = colorRamp[stop].green; + color2[0] = colorRamp[stop].red; + } + + if(grad->pre_multiplied) { + /* Pre-multiply the first color. */ + color1[2] *= color1[3]; + color1[1] *= color1[3]; + color1[0] *= color1[3]; + + /* Pre-multiply the second color. */ + color2[2] *= color2[3]; + color2[1] *= color2[3]; + color2[0] *= color2[3]; + } + + /* Filter the colors per channel. */ + color[3] = LERP(color1[3], color2[3], weight); + color[2] = LERP(color1[2], color2[2], weight); + color[1] = LERP(color1[1], color2[1], weight); + color[0] = LERP(color1[0], color2[0], weight); + + /* Pack the final color. */ + *bits++ = PackColorComponent(color[3]); + *bits++ = PackColorComponent(color[2]); + *bits++ = PackColorComponent(color[1]); + *bits++ = PackColorComponent(color[0]); + } + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_set_grad(vg_lite_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_uint32_t * colors, + vg_lite_uint32_t * stops) +{ + uint32_t i; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_grad %p %d %p %p\n", grad, count, colors, stops); +#endif + + grad->count = 0; /* Opaque B&W gradient */ + if(!count || count > VLC_MAX_GRADIENT_STOPS || colors == NULL || stops == NULL) + return VG_LITE_SUCCESS; + + /* Check stops validity */ + for(i = 0; i < count; i++) + if(stops[i] < VLC_GRADIENT_BUFFER_WIDTH) { + if(!grad->count || stops[i] > grad->stops[grad->count - 1]) { + grad->stops[grad->count] = stops[i]; + grad->colors[grad->count] = colors[i]; + grad->count++; + } + else if(stops[i] == grad->stops[grad->count - 1]) { + /* Equal stops : use the color corresponding to the last stop + in the sequence */ + grad->colors[grad->count - 1] = colors[i]; + } + } + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_update_grad(vg_lite_linear_gradient_t * grad) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_update_grad)(grad); +#endif + + vg_lite_error_t error = VG_LITE_SUCCESS; + int32_t r0, g0, b0, a0; + int32_t r1, g1, b1, a1; + int32_t lr, lg, lb, la; + uint32_t i; + int32_t j; + int32_t ds, dr, dg, db, da; + uint32_t * buffer = (uint32_t *)grad->image.memory; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_update_grad %p\n", grad); +#endif + + if(grad->count == 0) { + /* If no valid stops have been specified (e.g., due to an empty input + * array, out-of-range, or out-of-order stops), a stop at 0 with color + * 0xFF000000 (opaque black) and a stop at 255 with color 0xFFFFFFFF + * (opaque white) are implicitly defined. */ + grad->stops[0] = 0; + grad->colors[0] = 0xFF000000; /* Opaque black */ + grad->stops[1] = 255; + grad->colors[1] = 0xFFFFFFFF; /* Opaque white */ + grad->count = 2; + } + else if(grad->count && grad->stops[0] != 0) { + /* If at least one valid stop has been specified, but none has been + * defined with an offset of 0, an implicit stop is added with an + * offset of 0 and the same color as the first user-defined stop. */ + for(i = 0; i < grad->stops[0]; i++) + buffer[i] = grad->colors[0]; + } + a0 = A(grad->colors[0]); + r0 = R(grad->colors[0]); + g0 = G(grad->colors[0]); + b0 = B(grad->colors[0]); + + /* Calculate the colors for each pixel of the image. */ + for(i = 0; i < grad->count - 1; i++) { + buffer[grad->stops[i]] = grad->colors[i]; + ds = grad->stops[i + 1] - grad->stops[i]; + a1 = A(grad->colors[i + 1]); + r1 = R(grad->colors[i + 1]); + g1 = G(grad->colors[i + 1]); + b1 = B(grad->colors[i + 1]); + + da = a1 - a0; + dr = r1 - r0; + dg = g1 - g0; + db = b1 - b0; + + for(j = 1; j < ds; j++) { + la = a0 + da * j / ds; + lr = r0 + dr * j / ds; + lg = g0 + dg * j / ds; + lb = b0 + db * j / ds; + + buffer[grad->stops[i] + j] = ARGB(la, lr, lg, lb); + } + + a0 = a1; + r0 = r1; + g0 = g1; + b0 = b1; + } + + /* If at least one valid stop has been specified, but none has been defined + * with an offset of 255, an implicit stop is added with an offset of 255 + * and the same color as the last user-defined stop. */ + for(i = grad->stops[grad->count - 1]; i < VLC_GRADIENT_BUFFER_WIDTH; i++) + buffer[i] = grad->colors[grad->count - 1]; + + return error; +} + +vg_lite_error_t vg_lite_clear_linear_grad(vg_lite_ext_linear_gradient_t * grad) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_clear_linear_grad)(grad); +#endif + + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_clear_linear_grad %p\n", grad); +#endif + + grad->count = 0; + /* Release the image resource. */ + if(grad->image.handle != NULL) { + error = vg_lite_free(&grad->image); + } + + return error; +} + +vg_lite_error_t vg_lite_clear_grad(vg_lite_linear_gradient_t * grad) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_clear_grad)(grad); +#endif + + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_clear_grad %p\n", grad); +#endif + + grad->count = 0; + /* Release the image resource. */ + if(grad->image.handle != NULL) { + error = vg_lite_free(&grad->image); + } + + return error; +} + +vg_lite_error_t vg_lite_clear_radial_grad(vg_lite_radial_gradient_t * grad) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_clear_radial_grad)(grad); +#endif + + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_clear_radial_grad %p\n", grad); +#endif + + grad->count = 0; + /* Release the image resource. */ + if(grad->image.handle != NULL) { + error = vg_lite_free(&grad->image); + } + + return error; +} + +vg_lite_matrix_t * vg_lite_get_linear_grad_matrix(vg_lite_ext_linear_gradient_t * grad) +{ +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_get_linear_grad_matrix %p\n", grad); +#endif + + return &grad->matrix; +} + +vg_lite_matrix_t * vg_lite_get_grad_matrix(vg_lite_linear_gradient_t * grad) +{ +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_get_grad_matrix %p\n", grad); +#endif + + return &grad->matrix; +} + +vg_lite_matrix_t * vg_lite_get_radial_grad_matrix(vg_lite_radial_gradient_t * grad) +{ +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_get_radial_grad_matrix %p\n", grad); +#endif + + return &grad->matrix; +} + +vg_lite_error_t vg_lite_dump_command_buffer() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_dump_command_buffer)(); +#endif + + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_submit_t submit; + vg_lite_context_t * context = &s_context; + + /* Submit the command buffer. */ + submit.context = &context->context; + submit.commands = CMDBUF_BUFFER(*context); + submit.command_size = CMDBUF_OFFSET(*context); + submit.command_id = CMDBUF_INDEX(*context); + + vglitemDUMP_BUFFER("command", (size_t)CMDBUF_BUFFER(*context), + submit.context->command_buffer_logical[CMDBUF_INDEX(*context)], 0, submit.command_size); + +#if !DUMP_COMMAND_CAPTURE + vglitemDUMP("@[commit]"); +#endif + + return error; +} + +vg_lite_error_t vg_lite_get_parameter(vg_lite_param_type_t type, + vg_lite_int32_t count, + vg_lite_pointer params) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_uint32_t gpu_idle = 0; + vg_lite_float_t * fparams; + vg_lite_uint32_t * uiparams; + + vg_lite_kernel_hardware_running_time_t time; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_get_parameter %d %p\n", count, params); +#endif + + switch(type) { + case VG_LITE_GPU_IDLE_STATE: + if(count != 1) { + return VG_LITE_INVALID_ARGUMENT; + } + vg_lite_get_register(0x04, &gpu_idle); + uiparams = (vg_lite_uint32_t *)params; + *uiparams = ((gpu_idle & 0x0B05) == 0x0B05); + break; + + case VG_LITE_SCISSOR_RECT: + if((count % 4) != 0) { + return VG_LITE_INVALID_ARGUMENT; + } + fparams = (vg_lite_float_t *)params; + for(vg_lite_int32_t i = 0; i < count; i++) { + *(fparams + i) = (vg_lite_float_t)s_context.scissor[i]; + } + break; + + case VG_LITE_HARDWARE_RUNNING_TIME: + vg_lite_kernel(VG_LITE_RECORD_RUNNING_TIME, &time); + *((float *)params) = (float)time.run_time / (float)time.hertz; + break; + + default: + error = VG_LITE_INVALID_ARGUMENT; + break; + } + + return error; +} + +vg_lite_error_t vg_lite_copy_image(vg_lite_buffer_t * target, vg_lite_buffer_t * source, + vg_lite_int32_t sx, vg_lite_int32_t sy, + vg_lite_int32_t dx, vg_lite_int32_t dy, + vg_lite_uint32_t width, vg_lite_uint32_t height) +{ +#if gcFEATURE_VG_IM_INPUT + vg_lite_error_t error; + vg_lite_point_t point_min, point_max, temp; + vg_lite_matrix_t inverse_matrix; + vg_lite_matrix_t n; + vg_lite_float_t x_step[3]; + vg_lite_float_t y_step[3]; + vg_lite_float_t c_step[3]; + uint32_t imageMode = 0; + uint32_t in_premult = 0; + int32_t stride; + uint32_t transparency_mode = 0; + uint32_t filter_mode = 0; + uint32_t conversion = 0; + uint32_t tiled_source; + int32_t left, top, right, bottom; + uint32_t rect_x = 0, rect_y = 0, rect_w = 0, rect_h = 0; + vg_lite_rectangle_t rectangle = { dx, dy, width, height }; + uint32_t yuv2rgb = 0; + uint32_t uv_swiz = 0; + uint32_t compress_mode; + uint32_t src_premultiply_enable = 0; + uint32_t index_endian = 0; + uint32_t eco_fifo = 0; + uint32_t tile_setting = 0; + uint32_t stripe_mode = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; + vg_lite_color_t color = 0; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_copy_image %p %p %d %d %d %d %d %d\n", target, source, sx, sy, dx, dy, width, height); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_INDEX_ENDIAN + if((source->format >= VG_LITE_INDEX_1) && (source->format <= VG_LITE_INDEX_4) && source->index_endian) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_RECTANGLE_TILED_OUT + if(target->tiled != VG_LITE_LINEAR) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_RGBA8_ETC2_EAC + if(source->format == VG_LITE_RGBA8888_ETC2_EAC) { + return VG_LITE_NOT_SUPPORT; + } +#else + if((source->format == VG_LITE_RGBA8888_ETC2_EAC) && (source->width % 16 || source->height % 4)) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif +#if !gcFEATURE_VG_YUY2_INPUT + if(source->format == VG_LITE_YUYV || source->format == VG_LITE_YUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_INPUT + if((source->format >= VG_LITE_NV12 && source->format <= VG_LITE_NV16) || source->format == VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#elif !gcFEATURE_VG_NV24_INPUT + if(source->format == VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_AYUV_INPUT + if(source->format == VG_LITE_ANV12 || source->format == VG_LITE_AYUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_TILED_INPUT + if((source->format >= VG_LITE_YUY2_TILED && source->format <= VG_LITE_AYUY2_TILED) || + (source->format == VG_LITE_NV24_TILED)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT + if((target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) || + (source->format >= VG_LITE_RGB888 && source->format <= VG_LITE_RGBA5658)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT_PLANAR + if(source->format >= VG_LITE_ABGR8565_PLANAR && source->format <= VG_LITE_RGBA5658_PLANAR) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_IM_DEC_INPUT + if(source->compress_mode != VG_LITE_DEC_DISABLE) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_STENCIL + if(source->image_mode == VG_LITE_STENCIL_MODE) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if (CHIPID == 0x355) + if(target->format == VG_LITE_L8 || target->format == VG_LITE_YUYV || + target->format == VG_LITE_BGRA2222 || target->format == VG_LITE_RGBA2222 || + target->format == VG_LITE_ABGR2222 || target->format == VG_LITE_ARGB2222) { + printf("Target format: 0x%x is not supported.\n", target->format); + return VG_LITE_NOT_SUPPORT; + } + if(source->format == VG_LITE_L8 || source->format == VG_LITE_YUYV || + source->format == VG_LITE_BGRA2222 || source->format == VG_LITE_RGBA2222 || + source->format == VG_LITE_ABGR2222 || source->format == VG_LITE_ARGB2222) { + printf("Source format: 0x%x is not supported.\n", source->format); + return VG_LITE_NOT_SUPPORT; + } +#endif + + VG_LITE_RETURN_ERROR(srcbuf_align_check(source)); + VG_LITE_RETURN_ERROR(check_compress(source->format, source->compress_mode, source->tiled, source->width, + source->height)); +#endif /* gcFEATURE_VG_ERROR_CHECK */ + +#if gcFEATURE_VG_INDEX_ENDIAN + if((source->format >= VG_LITE_INDEX_1) && (source->format <= VG_LITE_INDEX_4) && source->index_endian) { + index_endian = 1 << 14; + } +#endif +#if !gcFEATURE_VG_STRIPE_MODE + /* Enable fifo feature to share buffer between vg and ts to improve the rotation performance */ + eco_fifo = 1 << 7; +#endif + + transparency_mode = (source->transparency_mode == VG_LITE_IMAGE_TRANSPARENT ? 0x8000 : 0); + + vg_lite_matrix_t * matrix = &n; + vg_lite_identity(matrix); + vg_lite_translate((vg_lite_float_t)sx, (vg_lite_float_t)sy, matrix); + + /* Check whether L8 is supported or not. */ + if((target->format == VG_LITE_L8) && ((source->format != VG_LITE_L8) && (source->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + +#if gcFEATURE_VG_16PIXELS_ALIGNED + /* Check if source specify bytes are aligned */ + error = _check_source_aligned(source->format, source->stride); + if(error != VG_LITE_SUCCESS) { + return error; + } +#endif + + /* Set source region. */ + vg_lite_rectangle_t * rect = &rectangle; + rect_x = (rect->x < 0) ? 0 : rect->x; + rect_y = (rect->y < 0) ? 0 : rect->y; + rect_w = rect->width; + rect_h = rect->height; + if((rect_x > (uint32_t)source->width) || (rect_y > (uint32_t)source->height) || + (rect_w == 0) || (rect_h == 0)) { + /*No intersection*/ + return VG_LITE_INVALID_ARGUMENT; + } + if(rect_x + rect_w > (uint32_t)source->width) { + rect_w = source->width - rect_x; + } + if(rect_y + rect_h > (uint32_t)source->height) { + rect_h = source->height - rect_y; + } + + /* Transform image (0,0) to screen. */ + if(!transform(&temp, 0.0f, 0.0f, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Set initial point. */ + point_min = temp; + point_max = temp; + + /* Transform image (0,height) to screen. */ + if(!transform(&temp, 0.0f, (vg_lite_float_t)rect_h, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,height) to screen. */ + if(!transform(&temp, (vg_lite_float_t)rect_w, (vg_lite_float_t)rect_h, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Transform image (width,0) to screen. */ + if(!transform(&temp, (vg_lite_float_t)rect_w, 0.0f, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Determine min/max. */ + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + /* Clip to target. */ + if(s_context.scissor_set && !target->scissor_buffer) { + left = s_context.scissor[0]; + top = s_context.scissor[1]; + right = s_context.scissor[2]; + bottom = s_context.scissor[3]; + } + else { + left = 0; + top = 0; + right = target->width; + bottom = target->height; + } + + point_min.x = MAX(point_min.x, left); + point_min.y = MAX(point_min.y, top); + point_max.x = MIN(point_max.x, right); + point_max.y = MIN(point_max.y, bottom); + + /* No need to draw. */ + if((point_max.x <= point_min.x) || (point_max.y <= point_min.y)) { + return VG_LITE_SUCCESS; + } + +#if gcFEATURE_VG_GAMMA + get_st_gamma_src_dest(source, target); +#endif + + /*blend input into context*/ + in_premult = 0x00000000; + + /* Adjust premultiply setting according to openvg condition */ + src_premultiply_enable = 0x01000100; + if(s_context.color_transform == 0 && s_context.gamma_dst == s_context.gamma_src && s_context.matrix_enable == 0 && + s_context.dst_alpha_mode == 0 && s_context.src_alpha_mode == 0 && + (source->image_mode == VG_LITE_NORMAL_IMAGE_MODE || source->image_mode == 0)) { + prediv_flag = 0; + } + else { + prediv_flag = 1; + } + + if((source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 0) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 0)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + /* when src and dst all pre format, im pre_out set to 0 to perform data truncation to prevent data overflow */ + else if(source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 0) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + else if((source->premultiplied == 0 && target->premultiplied == 1) || + (source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 1)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 1) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 1)) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + if(source->premultiplied == target->premultiplied && premul_flag == 0) { + target->apply_premult = 1; + } + else { + target->apply_premult = 0; + } + + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix)) + return VG_LITE_INVALID_ARGUMENT; + +#if gcFEATURE_VG_MATH_PRECISION_FIX + + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0]; + x_step[1] = inverse_matrix.m[1][0]; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1]; + y_step[1] = inverse_matrix.m[1][1]; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + +#else + + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0] / rect_w; + x_step[1] = inverse_matrix.m[1][0] / rect_h; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1] / rect_w; + y_step[1] = inverse_matrix.m[1][1] / rect_h; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]) / rect_w; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / rect_h; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; + +#endif + + /* Determine image mode (NORMAL) depending on the color. */ + imageMode = 0x00001000; + + tiled_source = (source->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0; + +#if gcFEATURE_VG_RECTANGLE_TILED_OUT + if(target->tiled == VG_LITE_TILED) { + tile_setting = 0x40; + stripe_mode = 0x20000000; + } +#endif + compress_mode = (uint32_t)source->compress_mode << 25; + + /* Setup the command buffer. */ +#if gcFEATURE_VG_GLOBAL_ALPHA + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD1, + s_context.dst_alpha_mode | s_context.dst_alpha_value | s_context.src_alpha_mode | s_context.src_alpha_value)); +#endif + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + 0x00000001 | in_premult | imageMode | transparency_mode | tile_setting | eco_fifo | s_context.scissor_enable | + stripe_mode)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, color)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A18, (void *)&c_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A19, (void *)&c_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1A, (void *)&c_step[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1C, (void *)&x_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1D, (void *)&x_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1E, (void *)&x_step[2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A20, (void *)&y_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A21, (void *)&y_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A22, (void *)&y_step[2])); + + if(((source->format >= VG_LITE_YUY2) && + (source->format <= VG_LITE_AYUY2)) || + ((source->format >= VG_LITE_YUY2_TILED) && + (source->format <= VG_LITE_AYUY2_TILED))) { + yuv2rgb = convert_yuv2rgb(source->yuv.yuv2rgb); + uv_swiz = convert_uv_swizzle(source->yuv.swizzle); + } + +#if gcFEATURE_VG_IM_FASTCLEAR + if(source->fc_enable) { + uint32_t im_fc_enable = (source->fc_enable == 0) ? 0 : 0x800000; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A25, + convert_source_format(source->format) | filter_mode | uv_swiz | yuv2rgb | conversion | im_fc_enable | ahb_read_split | + compress_mode | src_premultiply_enable | index_endian)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0ACF, source->fc_buffer[0].address)); /* FC buffer address. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD0, source->fc_buffer[0].color)); /* FC clear value. */ + } +#endif + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A25, + convert_source_format(source->format) | filter_mode | uv_swiz | yuv2rgb | conversion | compress_mode | + src_premultiply_enable | index_endian)); + if(source->yuv.uv_planar) { + /* Program u plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A51, source->yuv.uv_planar)); + } + if(source->yuv.v_planar) { + /* Program v plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source->yuv.v_planar)); + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A27, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source->address)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); + /* 24bit format stride configured to 4bpp. */ + if(source->format >= VG_LITE_RGB888 && source->format <= VG_LITE_RGBA5658) { + stride = source->stride / 3 * 4; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, stride | tiled_source)); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, source->stride | tiled_source)); + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2D, rect_x | (rect_y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2F, rect_w | (rect_h << 16))); + VG_LITE_RETURN_ERROR(push_rectangle(&s_context, point_min.x, point_min.y, point_max.x - point_min.x, + point_max.y - point_min.y)); + +#if !gcFEATURE_VG_STRIPE_MODE + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0E02, 0x10 | (0x7 << 8))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0F00, 0x10 | (0x7 << 8))); +#endif + + if(!s_context.flexa_mode) { + error = flush_target(); + } + + vglitemDUMP_BUFFER("image", (size_t)source->address, source->memory, 0, (source->stride) * (source->height)); + +#if DUMP_IMAGE + dump_img(source->memory, source->width, source->height, source->format); +#endif + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_set_memory_pool(vg_lite_buffer_type_t type, vg_lite_memory_pool_t pool) +{ + if(!(pool >= VG_LITE_MEMORY_POOL_1 && pool <= VG_LITE_MEMORY_POOL_2)) + return VG_LITE_INVALID_ARGUMENT; + + switch(type) { + case VG_LITE_COMMAND_BUFFER: + s_context.command_buffer_pool = pool; + break; + + case VG_LITE_TESSELLATION_BUFFER: + s_context.tess_buffer_pool = pool; + break; + + case VG_LITE_RENDER_BUFFER: + s_context.render_buffer_pool = pool; + break; + + default: + return VG_LITE_INVALID_ARGUMENT; + } + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_frame_delimiter(vg_lite_frame_flag_t flag) +{ + s_context.frame_flag = flag; + + vg_lite_error_t error = vg_lite_finish(); + + return error; +} + +#endif /* LV_USE_VG_LITE_DRIVER */ + diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_context.h b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_context.h new file mode 100755 index 0000000..a09cf68 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_context.h @@ -0,0 +1,313 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include +#include +#include +#include +#include +#include +#include "../inc/vg_lite.h" +#include "../VGLiteKernel/vg_lite_kernel.h" +#include "../VGLiteKernel/vg_lite_option.h" + +#define DUMP_CAPTURE 0 +#define DUMP_COMMAND_CAPTURE 0 +#define DUMP_INIT_COMMAND 0 +#define DUMP_API 0 +#define DUMP_LAST_CAPTURE 0 + +#if DUMP_API + #include "dumpAPI.h" +#endif + +#define VGLITE_LOG printf + +/*** Global Context Access ***/ +#define GET_CONTEXT() &s_context + +/*** Default command buffer size is 32KB. Double command buffer is used. + App can call vg_lite_set_command_buffer_size(size) before vg_lite_init() + to overwrite the default command buffer size. +***/ +#define VG_LITE_COMMAND_BUFFER_SIZE (32 << 10) +#define VG_LITE_SINGLE_COMMAND_BUFFER_SIZE (64 << 10) /* For only using one command buffer. */ + +#define CMDBUF_BUFFER(context) (context).command_buffer[(context).command_buffer_current] +#define CMDBUF_INDEX(context) (context).command_buffer_current +#define CMDBUF_SIZE(context) (context).command_buffer_size +#define CMDBUF_OFFSET(context) (context).command_offset[(context).command_buffer_current] +#define CMDBUF_SWAP(context) (context).command_buffer_current = \ + ((context).command_buffer_current + 1) % CMDBUF_COUNT + +/*** Command macros ***/ +#define VG_LITE_END(interrupt) (0x00000000 | interrupt) +#define VG_LITE_SEMAPHORE(id) (0x10000000 | id) +#define VG_LITE_STALL(id) (0x20000000 | id) +#define VG_LITE_STATE(address) (0x30010000 | address) +#define VG_LITE_STATES(count, address) (0x30000000 | ((count) << 16) | address) +#define VG_LITE_DATA(count) (0x40000000 | count) +#define VG_LITE_CALL(count) (0x60000000 | count) +#define VG_LITE_RETURN() (0x70000000) +#define VG_LITE_NOP() (0x80000000) + +#define FC_BURST_BYTES 64 +#define FC_BIT_TO_BYTES 64 + +#define STATES_COUNT 208 +#define MIN_TS_SIZE 8 << 10 + +#define VG_LITE_RETURN_ERROR(func) \ + if ((error = func) != VG_LITE_SUCCESS) \ + return error + +#define VG_LITE_BREAK_ERROR(func) \ + if ((error = func) != VG_LITE_SUCCESS) \ + break + +#define VG_LITE_ERROR_HANDLER(func) \ + if ((error = func) != VG_LITE_SUCCESS) \ + goto ErrorHandler + +/*** Shortcuts. ***/ +#define A(color) (color) >> 24 +#define R(color) ((color) & 0x00ff0000) >> 16 +#define G(color) ((color) & 0x0000ff00) >> 8 +#define B(color) ((color) & 0xff) +#define ARGB(a, r, g, b) ((a) << 24) | ((r) << 16) | ((g) << 8 ) | (b) +#define ARGB4(a, r, g, b) (((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | (((g) & 0xf0)) | ((b) >> 4) + +#define MIN(a, b) (a) > (b) ? (b) : (a) +#define MAX(a, b) (a) > (b) ? (a) : (b) + +#define LERP(v1, v2, w) ((v1) * (w) + (v2) * (1.0f - (w))) +#define CLAMP(x, min, max) (((x) < (min)) ? (min) : ((x) > (max)) ? (max) : (x)) + +#define COLOR_FROM_RAMP(ColorRamp) (((vg_lite_float_t *) ColorRamp) + 1) + +#define MATRIX_ROWS 3 +#define GET_MATRIX_VALUES(Pointer) ((float *) (Pointer)) +#define MAT(Matrix, Row, Column) (GET_MATRIX_VALUES(Matrix)[Row * MATRIX_ROWS + Column]) +#define PI 3.141592653589793238462643383279502f + +#if !gcFEATURE_VG_MATH_PRECISION_FIX && (CHIPID == 0x555) + #define VG_SW_BLIT_PRECISION_OPT 1 +#else + #define VG_SW_BLIT_PRECISION_OPT 0 +#endif + +/* Driver implementation internal structures. +*/ +typedef struct vg_lite_states { + uint32_t state; + uint8_t init; +} vg_lite_states_t; + +typedef struct vg_lite_hardware { + vg_lite_states_t hw_states[STATES_COUNT]; +} vg_lite_hardware_t; + +/* Tessellation buffer information. */ +typedef struct vg_lite_tess_buffer { + vg_lite_uint32_t physical_addr; /*! Physical address for tessellation buffer. */ + vg_lite_uint8_t * logical_addr; /*! Logical address for tessellation buffer. */ + vg_lite_uint32_t tessbuf_size; /*! Buffer size for tessellation buffer */ + vg_lite_uint32_t countbuf_size; /*! Buffer size for VG count buffer */ + vg_lite_uint32_t tess_w_h; /*! Combination of buffer width and height. */ + /* gc355 Specific fields below */ + vg_lite_uint32_t L1_phyaddr; /*! L1 physical address. */ + vg_lite_uint32_t L2_phyaddr; /*! L2 physical address. */ + vg_lite_uint8_t * L1_logical; /*! L1 Logical address. */ + vg_lite_uint8_t * L2_logical; /*! L2 Logical address. */ + vg_lite_uint32_t L1_size; /*! L1 size for tessellation buffer */ + vg_lite_uint32_t L2_size; /*! L2 size for tessellation buffer */ + vg_lite_uint32_t tess_stride; /*! Stride for tessellation buffer */ +} vg_lite_tess_buffer_t; + +typedef struct vg_lite_context { + vg_lite_kernel_context_t context; + vg_lite_hardware_t hw; + vg_lite_capabilities_t capabilities; + uint8_t * command_buffer[CMDBUF_COUNT]; + uint32_t command_buffer_size; + uint32_t command_offset[CMDBUF_COUNT]; + uint32_t command_buffer_current; + vg_lite_memory_pool_t command_buffer_pool; + + vg_lite_tess_buffer_t tessbuf; + vg_lite_memory_pool_t tess_buffer_pool; + + vg_lite_buffer_t * rtbuffer; /* DDRLess: this is used as composing buffer. */ + vg_lite_memory_pool_t render_buffer_pool; + + vg_lite_float_t path_lastX; + vg_lite_float_t path_lastY; + uint32_t scissor_set; + uint32_t scissor_enable; + uint32_t scissor_dirty; + int32_t scissor[4]; /* Scissor area: x, y, right, bottom. */ + vg_lite_buffer_t * scissor_layer; + + uint32_t src_alpha_mode; + uint32_t src_alpha_value; + uint32_t dst_alpha_mode; + uint32_t dst_alpha_value; + vg_lite_blend_t blend_mode; + + uint32_t sbi_mode; + uint32_t sync_mode; + uint32_t flexa_mode; + uint32_t stream_id; + uint32_t segment_address; + uint32_t segment_count; + uint32_t segment_size; + uint32_t stop_flag; + uint8_t flexa_dirty; + uint32_t start_flag; + uint32_t reset_flag; + uint8_t custom_cmdbuf; + uint8_t custom_tessbuf; + uint32_t enable_mask; + uint32_t matrix_enable; + uint32_t tess_width; + uint32_t tess_height; + uint32_t target_width; + uint32_t target_height; + uint8_t enable_scissor; + uint32_t mirror_orient; + uint32_t mirror_dirty; + uint32_t gamma_value; + uint32_t gamma_dirty; + uint32_t gamma_src; + uint32_t gamma_dst; + uint32_t gamma_stencil; + uint32_t color_transform; + uint32_t path_counter; + vg_lite_filter_t filter; + void * last_command_buffer_logical; + size_t Physical; + uint32_t last_command_size; + vg_lite_frame_flag_t frame_flag; + +} vg_lite_context_t; + +typedef struct vg_lite_ftable { + uint32_t ftable[gcFEATURE_COUNT]; +} vg_lite_ftable_t; + +extern vg_lite_context_t s_context; +extern vg_lite_ftable_t s_ftable; + +extern vg_lite_error_t set_render_target(vg_lite_buffer_t * target); +extern vg_lite_error_t push_state(vg_lite_context_t * context, uint32_t address, uint32_t data); +extern vg_lite_error_t push_state_ptr(vg_lite_context_t * context, uint32_t address, void * data_ptr); +extern vg_lite_error_t push_call(vg_lite_context_t * context, uint32_t address, uint32_t bytes); +extern vg_lite_error_t push_data(vg_lite_context_t * context, uint32_t size, void * data); +extern vg_lite_error_t push_clut(vg_lite_context_t * context, uint32_t address, uint32_t count, uint32_t * data); +extern vg_lite_error_t push_stall(vg_lite_context_t * context, uint32_t module); + +extern void * vg_lite_os_malloc(size_t size); +extern void vg_lite_os_free(void * memory); + +extern vg_lite_void set_gamma_dest_only(vg_lite_buffer_t * target, vg_lite_int32_t stencil); +extern vg_lite_void save_st_gamma_src_dest(vg_lite_buffer_t * source, vg_lite_buffer_t * target); +extern vg_lite_void get_st_gamma_src_dest(vg_lite_buffer_t * source, vg_lite_buffer_t * target); + +extern vg_lite_void setup_lvgl_image(vg_lite_buffer_t * dst, vg_lite_buffer_t * src, vg_lite_buffer_t * temp, + vg_lite_blend_t operation); + +#if defined(__ZEPHYR__) + extern void * vg_lite_os_fopen(const char * __restrict path, const char * __restrict mode); + extern int vg_lite_os_fclose(void * fp); + extern size_t vg_lite_os_fread(void * __restrict ptr, size_t size, size_t nmemb, void * __restrict fp); + extern size_t vg_lite_os_fwrite(const void * __restrict ptr, size_t size, size_t nmemb, void * fp); + extern int vg_lite_os_fseek(void * fp, long offset, int whence); + extern int vg_lite_os_fflush(void * fp); + extern int vg_lite_os_fprintf(void * __restrict fp, const char * __restrict format, ...); + extern int vg_lite_os_getpid(void); +#else + extern int vg_lite_os_fseek(FILE * Stream, long Offset, int Origin); + extern FILE * vg_lite_os_fopen(char const * FileName, char const * Mode); + extern long vg_lite_os_ftell(FILE * Stream); + extern size_t vg_lite_os_fread(void * Buffer, size_t ElementSize, size_t ElementCount, FILE * Stream); + extern size_t vg_lite_os_fwrite(void const * Buffer, size_t ElementSize, size_t ElementCount, FILE * Stream); + extern int vg_lite_os_close(FILE * Stream); + extern int vg_lite_os_fflush(FILE * fp); +#endif + +/**************************** Dump command, image ********************************************/ + +#define DUMP_COMMAND 0 +#define DUMP_IMAGE 0 + +/* Enable FC buffer dump if SOC supports fast clear */ +#define VG_TARGET_FC_DUMP 0 + +#if DUMP_COMMAND || DUMP_IMAGE + #ifdef __linux__ + #include + #endif + FILE * fp; + char filename[30]; +#endif + +/**************************** Dump Capture ****************************************************/ + +#ifndef vgliteDUMP_PATH + #define vgliteDUMP_PATH "./" +#endif + +#ifndef vgliteDUMP_KEY + #define vgliteDUMP_KEY "process" +#endif + +#if DUMP_LAST_CAPTURE + void _SetDumpFileInfo(); + vg_lite_error_t vglitefDumpBuffer_single(char * Tag, size_t Physical, void * Logical, size_t Offset, size_t Bytes); + #define vglitemDUMP_single vglitefDump + #define vglitemDUMP_BUFFER_single vglitefDumpBuffer_single +#endif +#if DUMP_CAPTURE +void _SetDumpFileInfo(); +vg_lite_error_t vglitefDump(char * String, ...); +vg_lite_error_t vglitefDumpBuffer(char * Tag, size_t Physical, void * Logical, size_t Offset, size_t Bytes); +#define vglitemDUMP vglitefDump +#define vglitemDUMP_BUFFER vglitefDumpBuffer +#else +static inline void __dummy_dump(char * Message, ...) {} +static inline void __dummy_dump_buffer(char * Tag, size_t Physical, void * Logical, size_t Offset, size_t Bytes) {} +#define vglitemDUMP __dummy_dump +#define vglitemDUMP_BUFFER __dummy_dump_buffer +#endif + +/**********************************************************************************************/ + +#endif /* LV_USE_VG_LITE_DRIVER */ + diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_image.c b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_image.c new file mode 100755 index 0000000..358eac4 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_image.c @@ -0,0 +1,2385 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "vg_lite_context.h" + +#define MATRIX_FP_ABS(x) (((x) < 0) ? -(x) : (x)) +#define MATRIX_FP_EPS 2.2204460492503131e-14 + +extern vg_lite_matrix_t identity_mtx; + +/* Get the plane memory pointer and strides info. */ +static uint32_t get_buffer_planes(vg_lite_buffer_t * buffer, + uint8_t ** memory, + uint32_t * strides) +{ + uint32_t count = 1; + + switch(buffer->format) { + case VG_LITE_RGBA8888: + case VG_LITE_BGRA8888: + case VG_LITE_RGBX8888: + case VG_LITE_BGRX8888: + case VG_LITE_RGB565: + case VG_LITE_BGR565: + case VG_LITE_RGBA4444: + case VG_LITE_BGRA4444: + case VG_LITE_BGRA5551: + case VG_LITE_A8: + case VG_LITE_L8: + case VG_LITE_A4: + case VG_LITE_INDEX_1: + case VG_LITE_INDEX_2: + case VG_LITE_INDEX_4: + case VG_LITE_INDEX_8: + case VG_LITE_YUYV: + case VG_LITE_YUY2: + case VG_LITE_RGBA2222: + count = 1; + memory[0] = (uint8_t *)buffer->memory; + memory[1] = memory[2] = ((uint8_t *)0); + strides[0] = buffer->stride; + strides[1] = strides[2] = 0; + break; + + case VG_LITE_NV12: + case VG_LITE_NV16: + case VG_LITE_NV24: + case VG_LITE_NV24_TILED: + count = 2; + memory[0] = (uint8_t *)buffer->memory; + memory[1] = (uint8_t *)buffer->yuv.uv_memory; + memory[2] = 0; + strides[0] = buffer->stride; + strides[1] = buffer->yuv.uv_stride; + strides[2] = 0; + break; + + case VG_LITE_AYUY2: + count = 2; + memory[0] = (uint8_t *)buffer->memory; + memory[1] = 0; + memory[2] = (uint8_t *)buffer->yuv.v_memory; + strides[0] = buffer->stride; + strides[1] = 0; + strides[2] = buffer->yuv.alpha_stride; + break; + + case VG_LITE_ANV12: + count = 3; + memory[0] = (uint8_t *)buffer->memory; + memory[1] = (uint8_t *)buffer->yuv.uv_memory; + memory[2] = (uint8_t *)buffer->yuv.v_memory; + strides[0] = buffer->stride; + strides[1] = buffer->yuv.uv_stride; + strides[2] = buffer->yuv.alpha_stride; + break; + + case VG_LITE_YV12: + case VG_LITE_YV24: + case VG_LITE_YV16: + count = 3; + memory[0] = (uint8_t *)buffer->memory; + memory[1] = (uint8_t *)buffer->yuv.uv_memory; + memory[2] = (uint8_t *)buffer->yuv.v_memory; + strides[0] = buffer->stride; + strides[1] = buffer->yuv.uv_stride; + strides[2] = buffer->yuv.v_stride; + break; + + case VG_LITE_YUY2_TILED: + case VG_LITE_NV12_TILED: + case VG_LITE_ANV12_TILED: + case VG_LITE_AYUY2_TILED: + default: + count = 0; + + break; + } + return count; +} + +vg_lite_error_t vg_lite_upload_buffer(vg_lite_buffer_t * buffer, + vg_lite_uint8_t * data[3], + vg_lite_uint32_t stride[3]) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_upload_buffer)(buffer, data, stride); +#endif + + vg_lite_error_t error = VG_LITE_SUCCESS; + int32_t plane_count; + uint8_t * buffer_memory[3] = {((uint8_t *)0)}; + uint32_t buffer_strides[3] = {0}; + uint8_t * pdata; + int32_t i, j; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_upload_buffer %p %p %p\n", buffer, data, stride); +#endif + + /* Get buffer memory info. */ + plane_count = get_buffer_planes(buffer, buffer_memory, buffer_strides); + + if(plane_count > 0 && plane_count <= 3) { + /* Copy the data to buffer. */ + for(i = 0; i < plane_count; i++) { + pdata = data[i]; + for(j = 0; j < buffer->height; j++) { + memcpy(buffer_memory[i], pdata, buffer_strides[i]); + buffer_memory[i] += buffer_strides[i]; + pdata += stride[i]; + } + } + } + else { + error = VG_LITE_INVALID_ARGUMENT; + } + + return error; +} + +static vg_lite_error_t swap(float * a, float * b) +{ + float temp; + if(a == NULL || b == NULL) + return VG_LITE_INVALID_ARGUMENT; + temp = *a; + *a = *b; + *b = temp; + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_get_transform_matrix(vg_lite_float_point4_t src, vg_lite_float_point4_t dst, + vg_lite_matrix_t * mat) +{ + float a[8][8], b[9], A[64]; + int i, j, k, m = 8, n = 1; + int astep = 8, bstep = 1; + float d; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_get_transform_matrix %p %p %p\n", src, dst, mat); +#endif + + if(src == NULL || dst == NULL || mat == NULL) + return VG_LITE_INVALID_ARGUMENT; + + for(i = 0; i < 4; ++i) { + a[i][0] = a[i + 4][3] = (float)src[i].x; + a[i][1] = a[i + 4][4] = (float)src[i].y; + a[i][2] = a[i + 4][5] = 1.0f; + a[i][3] = a[i][4] = a[i][5] = + a[i + 4][0] = a[i + 4][1] = a[i + 4][2] = 0.0f; + a[i][6] = (float)(-src[i].x * dst[i].x); + a[i][7] = (float)(-src[i].y * dst[i].x); + a[i + 4][6] = (float)(-src[i].x * dst[i].y); + a[i + 4][7] = (float)(-src[i].y * dst[i].y); + b[i] = (float)dst[i].x; + b[i + 4] = (float)dst[i].y; + } + for(i = 0; i < 8; ++i) { + for(j = 0; j < 8; ++j) { + A[8 * i + j] = a[i][j]; + } + } + + for(i = 0; i < m; i++) { + k = i; + for(j = i + 1; j < m; j++) + if(MATRIX_FP_ABS(A[j * astep + i]) > MATRIX_FP_ABS(A[k * astep + i])) + k = j; + if(MATRIX_FP_ABS(A[k * astep + i]) < MATRIX_FP_EPS) + return VG_LITE_INVALID_ARGUMENT; + if(k != i) { + for(j = i; j < m; j++) + swap(&A[i * astep + j], &A[k * astep + j]); + for(j = 0; j < n; j++) + swap(&b[i * bstep + j], &b[k * bstep + j]); + } + d = -1 / A[i * astep + i]; + for(j = i + 1; j < m; j++) { + float alpha = A[j * astep + i] * d; + for(k = i + 1; k < m; k++) + A[j * astep + k] += alpha * A[i * astep + k]; + for(k = 0; k < n; k++) + b[j * bstep + k] += alpha * b[i * bstep + k]; + } + } + + for(i = m - 1; i >= 0; i--) + for(j = 0; j < n; j++) { + float s = b[i * bstep + j]; + for(k = i + 1; k < m; k++) + s -= A[i * astep + k] * b[k * bstep + j]; + b[i * bstep + j] = s / A[i * astep + i]; + } + + b[8] = 1; + + for(i = 0; i < 3; ++i) { + for(j = 0; j < 3; ++j) { + mat->m[i][j] = b[i * 3 + j]; + } + } + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_set_scissor(vg_lite_int32_t x, vg_lite_int32_t y, vg_lite_int32_t right, vg_lite_int32_t bottom) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_set_scissor)(x, y, right, bottom); +#endif + +#if gcFEATURE_VG_SCISSOR + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_scissor %d %d %d %d\n", x, y, right, bottom); +#endif + + /* Save scissor Box States. */ + s_context.scissor[0] = x; + s_context.scissor[1] = y; + s_context.scissor[2] = right; + s_context.scissor[3] = bottom; + + /* Scissor dirty. */ + s_context.scissor_dirty = 1; + s_context.scissor_set = 1; + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_enable_scissor() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_enable_scissor)(); +#endif + +#if gcFEATURE_VG_MASK + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_enable_scissor\n"); +#endif + + /* Enable scissor Mode. */ + if(!s_context.scissor_enable) { + s_context.scissor_enable = 1 << 4; + s_context.scissor_dirty = 1; + } + + return VG_LITE_SUCCESS; +#else + /* Noop */ + return VG_LITE_SUCCESS; +#endif +} + +vg_lite_error_t vg_lite_disable_scissor() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_disable_scissor)(); +#endif + +#if gcFEATURE_VG_MASK + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_disable_scissor\n"); +#endif + + /* Disable scissor Mode. */ + if(s_context.scissor_enable) { + s_context.scissor_enable = 0; + s_context.scissor_dirty = 1; + } + + return VG_LITE_SUCCESS; +#else + /* Noop */ + return VG_LITE_SUCCESS; +#endif +} + +vg_lite_error_t vg_lite_set_CLUT(vg_lite_uint32_t count, vg_lite_uint32_t * colors) +{ +#if gcFEATURE_VG_IM_INDEX_FORMAT + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t addr = 0x0B00; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_CLUT %d %p\n", count, colors); +#endif + +#if gcFEATURE_VG_NEW_IMAGE_INDEX + { + switch(count) { + case 256: + case 16: + case 4: + case 2: + addr = 0x0B00; + break; + default: + error = VG_LITE_INVALID_ARGUMENT; + return error; + break; + } + } +#else + { + switch(count) { + case 256: + addr = 0x0B00; + break; + case 16: + addr = 0x0AA0; + break; + case 4: + addr = 0x0A9C; + break; + case 2: + addr = 0x0A98; + break; + default: + error = VG_LITE_INVALID_ARGUMENT; + return error; + break; + } + } +#endif + + VG_LITE_RETURN_ERROR(push_clut(&s_context, addr, count, (uint32_t *)colors)); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_source_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_source_global_alpha)(alpha_mode, alpha_value); +#endif + +#if gcFEATURE_VG_GLOBAL_ALPHA + uint32_t image_alpha_mode; + uint32_t image_alpha_value; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_source_global_alpha %d %d\n", alpha_mode, alpha_value); +#endif + + image_alpha_mode = (uint8_t)alpha_mode; + image_alpha_value = alpha_value << 2; + + s_context.src_alpha_mode = image_alpha_mode; + s_context.src_alpha_value = image_alpha_value; + + return VG_LITE_SUCCESS; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_dest_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_dest_global_alpha)(alpha_mode, alpha_value); +#endif + +#if gcFEATURE_VG_GLOBAL_ALPHA + uint32_t dest_alpha_mode; + uint32_t dest_alpha_value; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_dest_global_alpha %d %d\n", alpha_mode, alpha_value); +#endif + + dest_alpha_mode = (alpha_mode == VG_LITE_NORMAL) ? 0 : (alpha_mode == VG_LITE_GLOBAL) ? 0x00000400 : 0x00000800; + dest_alpha_value = alpha_value << 12; + + s_context.dst_alpha_mode = dest_alpha_mode; + s_context.dst_alpha_value = dest_alpha_value; + + return VG_LITE_SUCCESS; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_set_color_key(vg_lite_color_key4_t colorkey) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_set_color_key)(colorkey); +#endif + +#if gcFEATURE_VG_COLOR_KEY + uint8_t i; + uint32_t value_low = 0; + uint32_t value_high = 0; + uint8_t r, g, b, a, e; + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_color_key %p\n", colorkey); +#endif + + /* Set color key states. */ + for(i = 0; i < 4; i++) { + /* Set gcregVGPEColorKeyLow. Layout "E/R/G/B". */ + r = colorkey[i].low_r; + g = colorkey[i].low_g; + b = colorkey[i].low_b; + e = colorkey[i].enable; + value_low = (e << 24) | (r << 16) | (g << 8) | b; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A90 + i, value_low)); + + /* Set gcregVGPEColorKeyHigh. Layout "A/R/G/B". */ + r = colorkey[i].high_r; + g = colorkey[i].high_g; + b = colorkey[i].high_b; + a = colorkey[i].alpha; + value_high = (a << 24) | (r << 16) | (g << 8) | b; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A94 + i, value_high)); + } + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_enable_dither() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_enable_dither)(); +#endif + +#if gcFEATURE_VG_DITHER + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t table_low = 0x7B48F3C0; + uint32_t table_high = 0x596AD1E2; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_enable_dither\n"); +#endif + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5A, table_low)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5B, table_high)); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_disable_dither() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_disable_dither)(); +#endif + +#if gcFEATURE_VG_DITHER + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_disable_dither\n"); +#endif + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5A, 0xFFFFFFFF)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A5B, 0xFFFFFFFF)); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_enable_masklayer() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_enable_masklayer)(); +#endif + +#if gcFEATURE_VG_MASK + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_enable_masklayer\n"); +#endif + + s_context.enable_mask = (1 << 20); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_disable_masklayer() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_disable_masklayer)(); +#endif + +#if gcFEATURE_VG_MASK + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_disable_masklayer\n"); +#endif + + s_context.enable_mask = 0; + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_create_masklayer(vg_lite_buffer_t * masklayer, vg_lite_uint32_t width, vg_lite_uint32_t height) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_create_masklayer)(masklayer, width, height); +#endif + +#if gcFEATURE_VG_MASK + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_create_masklayer %p %d %d\n", masklayer, width, height); +#endif + + memset(masklayer, 0, sizeof(vg_lite_buffer_t)); + masklayer->width = width; + masklayer->height = height; + masklayer->format = VG_LITE_A8; + VG_LITE_RETURN_ERROR(vg_lite_allocate(masklayer)); + + VG_LITE_RETURN_ERROR(vg_lite_clear(masklayer, NULL, 0xFF << 24)); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_fill_masklayer(vg_lite_buffer_t * masklayer, vg_lite_rectangle_t * rect, vg_lite_uint8_t value) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_fill_masklayer)(masklayer, rect, value); +#endif + +#if gcFEATURE_VG_MASK + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_fill_masklayer %p %p %d\n", masklayer, rect, value); +#endif + + error = vg_lite_clear(masklayer, rect, value << 24); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_blend_masklayer( + vg_lite_buffer_t * dst_masklayer, + vg_lite_buffer_t * src_masklayer, + vg_lite_mask_operation_t operation, + vg_lite_rectangle_t * rect +) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_blend_masklayer)(dst_masklayer, src_masklayer, operation, rect); +#endif + +#if gcFEATURE_VG_MASK + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_matrix_t matrix; + vg_lite_filter_t filter = VG_LITE_FILTER_POINT; + vg_lite_rectangle_t area = *rect; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_blend_masklayer %p %p %d %p\n", dst_masklayer, src_masklayer, operation, rect); +#endif + + vg_lite_identity(&matrix); + vg_lite_translate((vg_lite_float_t)rect->x, (vg_lite_float_t)rect->y, &matrix); + + switch(operation) { + case VG_LITE_CLEAR_MASK: + VG_LITE_RETURN_ERROR(vg_lite_clear(dst_masklayer, &area, 0x0)); + break; + case VG_LITE_FILL_MASK: + VG_LITE_RETURN_ERROR(vg_lite_clear(dst_masklayer, &area, 0xFF << 24)); + break; + case VG_LITE_SET_MASK: + area.x = 0; + area.y = 0; + VG_LITE_RETURN_ERROR(vg_lite_blit_rect(dst_masklayer, src_masklayer, &area, &matrix, VG_LITE_BLEND_NONE, 0, filter)); + break; + case VG_LITE_UNION_MASK: + area.x = 0; + area.y = 0; + VG_LITE_RETURN_ERROR(vg_lite_blit_rect(dst_masklayer, src_masklayer, &area, &matrix, VG_LITE_BLEND_SCREEN, 0, filter)); + break; + case VG_LITE_INTERSECT_MASK: + area.x = 0; + area.y = 0; + VG_LITE_RETURN_ERROR(vg_lite_blit_rect(dst_masklayer, src_masklayer, &area, &matrix, VG_LITE_BLEND_DST_IN, 0, filter)); + break; + case VG_LITE_SUBTRACT_MASK: + area.x = 0; + area.y = 0; + VG_LITE_RETURN_ERROR(vg_lite_blit_rect(dst_masklayer, src_masklayer, &area, &matrix, VG_LITE_BLEND_SUBTRACT, 0, + filter)); + break; + default: + break; + } + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_set_masklayer(vg_lite_buffer_t * masklayer) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_set_masklayer)(masklayer); +#endif + +#if gcFEATURE_VG_MASK + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_masklayer %p\n", masklayer); +#endif + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A14, masklayer->address)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A15, masklayer->stride)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00000010)); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_render_masklayer( + vg_lite_buffer_t * masklayer, + vg_lite_mask_operation_t operation, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_color_t color, + vg_lite_matrix_t * matrix +) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_render_masklayer)(masklayer, operation, path, fill_rule, color, matrix); +#endif + +#if gcFEATURE_VG_MASK + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_render_masklayer %p %d %p %d %d %p\n", masklayer, operation, path, fill_rule, color, matrix); +#endif + + if(!matrix) { + matrix = &identity_mtx; + } + + switch(operation) { + case VG_LITE_CLEAR_MASK: + VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_NONE, 0)); + break; + case VG_LITE_FILL_MASK: + VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_NONE, 0xFF << 24)); + break; + case VG_LITE_SET_MASK: + VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_NONE, color << 24)); + break; + case VG_LITE_UNION_MASK: + VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_SCREEN, color << 24)); + break; + case VG_LITE_INTERSECT_MASK: + VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_DST_IN, color << 24)); + break; + case VG_LITE_SUBTRACT_MASK: + VG_LITE_RETURN_ERROR(vg_lite_draw(masklayer, path, fill_rule, matrix, VG_LITE_BLEND_SUBTRACT, color << 24)); + break; + default: + break; + } + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_destroy_masklayer(vg_lite_buffer_t * masklayer) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_destroy_masklayer)(masklayer); +#endif + +#if gcFEATURE_VG_MASK + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_destroy_masklayer %p\n", masklayer); +#endif + + VG_LITE_RETURN_ERROR(vg_lite_free(masklayer)); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_set_pixel_matrix(vg_lite_pixel_matrix_t matrix, vg_lite_pixel_channel_enable_t * channel) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_set_pixel_matrix)(matrix, channel); +#endif + +#if gcFEATURE_VG_PIXEL_MATRIX + vg_lite_error_t error = VG_LITE_SUCCESS; + short pix_matrix[20] = { 0 }; + int i = 0; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_pixel_matrix %p (%d %d %d %d)\n", matrix, channel->enable_a, channel->enable_b, + channel->enable_g, channel->enable_r); +#endif + + s_context.matrix_enable = (channel->enable_a ? (1 << 17) : 0) | + (channel->enable_r ? (1 << 23) : 0) | + (channel->enable_g ? (1 << 22) : 0) | + (channel->enable_b ? (1 << 21) : 0); + + if(s_context.matrix_enable) { + for(i = 0; i < 20; i++) { + if(matrix[i] > 127.0f || matrix[i] < -128.0f) { + return VG_LITE_INVALID_ARGUMENT; + } + pix_matrix[i] = (short)(matrix[i] * 256); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0ADE + i, pix_matrix[i])); + } + } + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_gaussian_filter(vg_lite_float_t w0, vg_lite_float_t w1, vg_lite_float_t w2) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_gaussian_filter)(w0, w1, w2); +#endif + +#if gcFEATURE_VG_GAUSSIAN_BLUR + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_gaussian_filter %f %f %f\n", w0, w1, w2); +#endif + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD2 + 1, (uint32_t)(w0 * 256))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD4 + 1, (uint32_t)(w1 * 256))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD6 + 1, (uint32_t)(w2 * 256))); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_scissor_rects(vg_lite_buffer_t * target, vg_lite_uint32_t nums, vg_lite_rectangle_t rect[]) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_scissor_rects)(target, nums, rect); +#endif + +#if gcFEATURE_VG_MASK + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_rectangle_t rect_clamp, rect_draw; + vg_lite_int32_t left_x, right_x, left_len, middle_len, right_len, stride, j, max_x, max_y; + vg_lite_uint8_t alpha; + vg_lite_uint32_t i; +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_scissor_rects %d %p\n", nums, rect); + for(i = 0; i < nums; i++) { + VGLITE_LOG(" Rect(%d, %d, %d, %d)\n", rect[i].x, rect[i].y, rect[i].width, rect[i].height); + } +#endif + + /* Record scissor enable flag and disable scissor. */ + vg_lite_uint8_t enable = s_context.scissor_enable; + s_context.scissor_enable = 0; + + /* Free the old scissor layer if its size is too small for target */ + if(s_context.scissor_layer && + (s_context.scissor_layer->width < ((target->width + 7) / 8) || s_context.scissor_layer->height < target->height)) { + vg_lite_free(s_context.scissor_layer); + vg_lite_os_free(s_context.scissor_layer); + s_context.scissor_layer = NULL; + } + + /* Allocate if scissor layer is NULL */ + if(s_context.scissor_layer == NULL) { + s_context.scissor_layer = (vg_lite_buffer_t *)vg_lite_os_malloc(sizeof(vg_lite_buffer_t)); + if(!s_context.scissor_layer) { + return VG_LITE_OUT_OF_RESOURCES; + } + + memset(s_context.scissor_layer, 0, sizeof(vg_lite_buffer_t)); + s_context.scissor_layer->scissor_buffer = 1; + s_context.scissor_layer->width = (target->width + 7) / 8; + s_context.scissor_layer->height = target->height; + s_context.scissor_layer->format = VG_LITE_A8; + VG_LITE_RETURN_ERROR(vg_lite_allocate(s_context.scissor_layer)); + } + s_context.scissor_layer->scissor_buffer = 1; + + /* Clear scissor layer*/ + VG_LITE_RETURN_ERROR(vg_lite_clear(s_context.scissor_layer, NULL, 0x00000000)); + vg_lite_finish(); + + max_x = s_context.scissor_layer->width * 8; + max_y = s_context.scissor_layer->height; + + /* Draw rectangle to scissor layer, one bit data of scissor layer corresponds to one pixel. */ + for(i = 0; i < nums; ++i) { + /* Clamp the rect */ + memcpy(&rect_clamp, &rect[i], sizeof(vg_lite_rectangle_t)); + { + if(rect_clamp.x < 0 || rect_clamp.y < 0) { + rect_clamp.width += rect_clamp.x; + rect_clamp.height += rect_clamp.y; + rect_clamp.x = rect_clamp.y = 0; + } + if(rect_clamp.x >= max_x || rect_clamp.y >= max_y || rect_clamp.width <= 0 || rect_clamp.height <= 0) { + rect_clamp.x = rect_clamp.y = rect_clamp.width = rect_clamp.height = 0; + } + if(rect_clamp.x + rect_clamp.width > max_x) { + rect_clamp.width = max_x - rect_clamp.x; + } + if(rect_clamp.y + rect_clamp.height > max_y) { + rect_clamp.height = max_y - rect_clamp.y; + } + } + + if(((rect_clamp.x + rect_clamp.width) >> 3) == (rect_clamp.x >> 3)) { + rect_draw.x = rect_clamp.x / 8; + rect_draw.y = rect_clamp.y; + rect_draw.width = 1; + rect_draw.height = rect_clamp.height; + alpha = (uint8_t)(((uint8_t)(0xff >> (8 - rect_clamp.width))) << (rect_clamp.x % 8)); + stride = s_context.scissor_layer->stride; + for(j = rect_draw.y; j < rect_draw.height + rect_draw.y; ++j) { + ((vg_lite_uint8_t *)s_context.scissor_layer->memory)[j * stride + rect_draw.x] |= alpha; + } + } + else { + /* Split the rect */ + left_x = (rect_clamp.x % 8 == 0) ? rect_clamp.x : ((rect_clamp.x + 7) & 0xFFFFFFF8); + right_x = (rect_clamp.x + rect_clamp.width) & 0xFFFFFFF8; + middle_len = right_x - left_x; + left_len = left_x - rect_clamp.x; + right_len = rect_clamp.x + rect_clamp.width - right_x; + + /* Draw left rect */ + if(left_len) { + rect_draw.x = rect_clamp.x / 8; + rect_draw.y = rect_clamp.y; + rect_draw.width = 1; + rect_draw.height = rect_clamp.height; + alpha = (uint8_t)(0xff << (8 - left_len)); + stride = s_context.scissor_layer->stride; + for(j = rect_draw.y; j < rect_draw.height + rect_draw.y; ++j) { + ((vg_lite_uint8_t *)s_context.scissor_layer->memory)[j * stride + rect_draw.x] |= alpha; + } + } + + /* Draw middle rect */ + if(middle_len) { + rect_draw.x = left_x / 8; + rect_draw.y = rect_clamp.y; + rect_draw.width = middle_len / 8; + rect_draw.height = rect_clamp.height; + VG_LITE_RETURN_ERROR(vg_lite_clear(s_context.scissor_layer, &rect_draw, 0xFFFFFFFF)); + vg_lite_finish(); + } + + /* Draw right rect */ + if(right_len) { + rect_draw.x = (rect_clamp.x + rect_clamp.width - right_len) / 8; + rect_draw.y = rect_clamp.y; + rect_draw.width = 1; + rect_draw.height = rect_clamp.height; + alpha = (uint8_t)(0xff >> (8 - right_len)); + stride = s_context.scissor_layer->stride; + for(j = rect_draw.y; j < rect_draw.height + rect_draw.y; ++j) { + ((vg_lite_uint8_t *)s_context.scissor_layer->memory)[j * stride + rect_draw.x] |= alpha; + } + } + } + } + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A16, s_context.scissor_layer->address)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A17, s_context.scissor_layer->stride)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00000100)); + vg_lite_finish(); + s_context.scissor_enable = enable; + s_context.scissor_dirty = 1; + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_set_mirror(vg_lite_orientation_t orientation) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_set_mirror)(orientation); +#endif + +#if gcFEATURE_VG_MIRROR + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_mirror %d\n", orientation); +#endif + + s_context.mirror_orient = orientation; + s_context.mirror_dirty = 1; + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_set_gamma(vg_lite_gamma_conversion_t gamma_value) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_set_gamma)(gamma_value); +#endif + +#if gcFEATURE_VG_GAMMA + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_gamma %d\n", gamma_value); +#endif + + s_context.gamma_value = gamma_value << 12; + s_context.gamma_dirty = 1; + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +/* Set s_context.gamma_value base on target buffer */ +vg_lite_void set_gamma_dest_only(vg_lite_buffer_t * target, vg_lite_int32_t stencil) +{ + uint32_t gamma_value = 0; + + /* Set gamma configuration of source buffer */ + /* Openvg paintcolor defaults to SRGB */ + s_context.gamma_src = 1; + + /* Set gamma configuration of dst buffer */ + if((target->format >= OPENVG_lRGBX_8888 && target->format <= OPENVG_A_4) || + (target->format >= OPENVG_lXRGB_8888 && target->format <= OPENVG_lARGB_8888_PRE) || + (target->format >= OPENVG_lBGRX_8888 && target->format <= OPENVG_lBGRA_8888_PRE) || + (target->format >= OPENVG_lXBGR_8888 && target->format <= OPENVG_lABGR_8888_PRE) || + (target->format >= OPENVG_lRGBX_8888_PRE && target->format <= OPENVG_lRGBA_4444_PRE)) { + s_context.gamma_dst = 0; + } + else { + s_context.gamma_dst = 1; + } + + if(s_context.gamma_src == 0 && s_context.gamma_dst == 1) { + gamma_value = 0x00002000; + } + else if(s_context.gamma_src == 1 && s_context.gamma_dst == 0) { + gamma_value = 0x00001000; + } + else { + gamma_value = 0x00000000; + } + + if(stencil && target->image_mode == VG_LITE_STENCIL_MODE) { + s_context.gamma_stencil = gamma_value; + gamma_value = 0x00000000; + } + + if(s_context.gamma_dirty == 0 && gamma_value != s_context.gamma_value) { + s_context.gamma_value = gamma_value; + s_context.gamma_dirty = 1; + } +} + +/* Set s_context.gamma_value base on source and target buffers */ +vg_lite_void get_st_gamma_src_dest(vg_lite_buffer_t * source, vg_lite_buffer_t * target) +{ + uint32_t gamma_value = 0; + + /* Set gamma configuration of source buffer */ + if((source->format >= OPENVG_lRGBX_8888 && source->format <= OPENVG_A_4) || + (source->format >= OPENVG_lXRGB_8888 && source->format <= OPENVG_lARGB_8888_PRE) || + (source->format >= OPENVG_lBGRX_8888 && source->format <= OPENVG_lBGRA_8888_PRE) || + (source->format >= OPENVG_lXBGR_8888 && source->format <= OPENVG_lABGR_8888_PRE) || + (source->format >= OPENVG_lRGBX_8888_PRE && source->format <= OPENVG_lRGBA_4444_PRE)) { + s_context.gamma_src = 0; + } + else { + s_context.gamma_src = 1; + } + /* Set gamma configuration of dst buffer */ + if((target->format >= OPENVG_lRGBX_8888 && target->format <= OPENVG_A_4) || + (target->format >= OPENVG_lXRGB_8888 && target->format <= OPENVG_lARGB_8888_PRE) || + (target->format >= OPENVG_lBGRX_8888 && target->format <= OPENVG_lBGRA_8888_PRE) || + (target->format >= OPENVG_lXBGR_8888 && target->format <= OPENVG_lABGR_8888_PRE) || + (target->format >= OPENVG_lRGBX_8888_PRE && target->format <= OPENVG_lRGBA_4444_PRE)) { + s_context.gamma_dst = 0; + } + else { + s_context.gamma_dst = 1; + } + + if(s_context.gamma_src == 0 && s_context.gamma_dst == 1) { + gamma_value = 0x00002000; + } + else if(s_context.gamma_src == 1 && s_context.gamma_dst == 0) { + gamma_value = 0x00001000; + } + else { + gamma_value = 0x00000000; + } + + if(source->image_mode == VG_LITE_STENCIL_MODE) { + if(source->paintType == VG_LITE_PAINT_PATTERN + || source->paintType == VG_LITE_PAINT_RADIAL_GRADIENT + || source->paintType == VG_LITE_PAINT_LINEAR_GRADIENT) { + gamma_value = s_context.gamma_stencil; + } + else if(source->paintType == VG_LITE_PAINT_COLOR && s_context.gamma_dst == 0) { + gamma_value = 0x00001000; + } + else { + gamma_value = 0x00000000; + } + } + + if(s_context.gamma_dirty == 0 && gamma_value != s_context.gamma_value) { + s_context.gamma_value = gamma_value; + s_context.gamma_dirty = 1; + } +} + +/* Set s_context.gamma_value base on source and target buffers */ +vg_lite_void save_st_gamma_src_dest(vg_lite_buffer_t * source, vg_lite_buffer_t * target) +{ + uint32_t gamma_value = 0; + + /* Set gamma configuration of source buffer */ + if((source->format >= OPENVG_lRGBX_8888 && source->format <= OPENVG_A_4) || + (source->format >= OPENVG_lXRGB_8888 && source->format <= OPENVG_lARGB_8888_PRE) || + (source->format >= OPENVG_lBGRX_8888 && source->format <= OPENVG_lBGRA_8888_PRE) || + (source->format >= OPENVG_lXBGR_8888 && source->format <= OPENVG_lABGR_8888_PRE) || + (source->format >= OPENVG_lRGBX_8888_PRE && source->format <= OPENVG_lRGBA_4444_PRE)) { + s_context.gamma_src = 0; + } + else { + s_context.gamma_src = 1; + } + /* Set gamma configuration of dst buffer */ + if((target->format >= OPENVG_lRGBX_8888 && target->format <= OPENVG_A_4) || + (target->format >= OPENVG_lXRGB_8888 && target->format <= OPENVG_lARGB_8888_PRE) || + (target->format >= OPENVG_lBGRX_8888 && target->format <= OPENVG_lBGRA_8888_PRE) || + (target->format >= OPENVG_lXBGR_8888 && target->format <= OPENVG_lABGR_8888_PRE) || + (target->format >= OPENVG_lRGBX_8888_PRE && target->format <= OPENVG_lRGBA_4444_PRE)) { + s_context.gamma_dst = 0; + } + else { + s_context.gamma_dst = 1; + } + + if(s_context.gamma_src == 0 && s_context.gamma_dst == 1) { + gamma_value = 0x00002000; + } + else if(s_context.gamma_src == 1 && s_context.gamma_dst == 0) { + gamma_value = 0x00001000; + } + else { + gamma_value = 0x00000000; + } + + if(target->image_mode == VG_LITE_STENCIL_MODE) { + s_context.gamma_stencil = gamma_value; + gamma_value = 0x00000000; + } + + if(s_context.gamma_dirty == 0 && gamma_value != s_context.gamma_value) { + s_context.gamma_value = gamma_value; + s_context.gamma_dirty = 1; + } +} + +vg_lite_error_t vg_lite_enable_color_transform() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_enable_color_transform)(); +#endif + +#if gcFEATURE_VG_COLOR_TRANSFORMATION + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_enable_color_transform\n"); +#endif + + s_context.color_transform = (1 << 16); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_disable_color_transform() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_disable_color_transform)(); +#endif + +#if gcFEATURE_VG_COLOR_TRANSFORMATION + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_disable_color_transform\n"); +#endif + + s_context.color_transform = 0; + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_set_color_transform(vg_lite_color_transform_t * values) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_enable_color_transform)(); +#endif + +#if gcFEATURE_VG_COLOR_TRANSFORMATION + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_float_t * color_transformations = (vg_lite_float_t *)values; + int color_elements = 0; + short temp_transform[8] = { 0 }; + uint32_t final_transform[8] = { 0 }; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_color_transform %p\n", values); +#endif + + for(color_elements = 0; color_elements < 8; color_elements++) { + if(color_elements % 2) { + color_transformations[color_elements] = CLAMP(color_transformations[color_elements], -1.0f, 1.0f); + } + else { + color_transformations[color_elements] = CLAMP(color_transformations[color_elements], -127.0f, 127.0f); + } + temp_transform[color_elements] = (short)(color_transformations[color_elements] * 256); + final_transform[color_elements] = (uint32_t)temp_transform[color_elements] & 0x0000FFFF; + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0C, final_transform[2] | final_transform[3] << 16)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0D, final_transform[4] | final_transform[5] << 16)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0E, final_transform[6] | final_transform[7] << 16)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0F, final_transform[0] | final_transform[1] << 16)); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +#if !gcFEATURE_VG_LVGL_SUPPORT + +typedef struct { + float r; + float g; + float b; + float a; +} Color; + +int colorToInt(float c, int maxc) +{ + return MIN(MAX((int)floor(c * (float)maxc + 0.5f), 0), maxc); +} + +float intToColor(unsigned int i, unsigned int maxi) +{ + return (float)(i & maxi) / (float)maxi; +} + +Color readPixel(vg_lite_buffer_t * src, int x, int y) +{ + unsigned int p = 0; + Color c; + uint8_t * scanline = (uint8_t *)src->memory + y * src->stride; + + uint8_t bitsPerPixel = 0; + int rb = 0; + int gb = 0; + int bb = 0; + int ab = 0; + int rs = 0; + int gs = 0; + int bs = 0; + int as = 0; + switch(src->format) { + case VG_LITE_A8: + case VG_LITE_L8: + ab = 8; + bitsPerPixel = 8; + break; + case VG_LITE_ABGR4444: + rs = 12; + gs = 8; + bs = 4; + as = 0; + rb = 4; + gb = 4; + bb = 4; + ab = 4; + bitsPerPixel = 16; + break; + case VG_LITE_ARGB4444: + bs = 12; + gs = 8; + rs = 4; + as = 0; + rb = 4; + gb = 4; + bb = 4; + ab = 4; + bitsPerPixel = 16; + break; + case VG_LITE_RGBA4444: + as = 12; + bs = 8; + gs = 4; + rs = 0; + rb = 4; + gb = 4; + bb = 4; + ab = 4; + bitsPerPixel = 16; + break; + case VG_LITE_BGRA4444: + as = 12; + rs = 8; + gs = 4; + bs = 0; + rb = 4; + gb = 4; + bb = 4; + ab = 4; + bitsPerPixel = 16; + break; + case VG_LITE_RGB565: + rs = 0; + gs = 5; + bs = 11; + as = 0; + rb = 5; + gb = 6; + bb = 5; + ab = 0; + bitsPerPixel = 16; + break; + case VG_LITE_BGR565: + rs = 11; + gs = 5; + bs = 0; + as = 0; + rb = 5; + gb = 6; + bb = 5; + ab = 0; + bitsPerPixel = 16; + break; + case VG_LITE_ABGR8888: + case VG_LITE_XBGR8888: + rs = 24; + gs = 16; + bs = 8; + as = 0; + rb = 8; + gb = 8; + bb = 8; + ab = 8; + bitsPerPixel = 32; + break; + case VG_LITE_ARGB8888: + case VG_LITE_XRGB8888: + rs = 8; + gs = 16; + bs = 24; + as = 0; + rb = 8; + gb = 8; + bb = 8; + ab = 8; + bitsPerPixel = 32; + break; + case VG_LITE_RGBA8888: + case VG_LITE_RGBX8888: + rs = 0; + gs = 8; + bs = 16; + as = 24; + rb = 8; + gb = 8; + bb = 8; + ab = 8; + bitsPerPixel = 32; + break; + case VG_LITE_BGRA8888: + case VG_LITE_BGRX8888: + rs = 16; + gs = 8; + bs = 0; + as = 24; + rb = 8; + gb = 8; + bb = 8; + ab = 8; + bitsPerPixel = 32; + break; + case VG_LITE_ABGR1555: + rs = 11; + gs = 6; + bs = 1; + as = 0; + rb = 5; + gb = 5; + bb = 5; + ab = 1; + bitsPerPixel = 16; + break; + case VG_LITE_RGBA5551: + rs = 0; + gs = 5; + bs = 10; + as = 15; + rb = 5; + gb = 5; + bb = 5; + ab = 1; + bitsPerPixel = 16; + break; + case VG_LITE_ARGB1555: + rs = 1; + gs = 6; + bs = 11; + as = 0; + rb = 5; + gb = 5; + bb = 5; + ab = 1; + bitsPerPixel = 16; + break; + case VG_LITE_BGRA5551: + rs = 10; + gs = 5; + bs = 0; + as = 15; + rb = 5; + gb = 5; + bb = 5; + ab = 1; + bitsPerPixel = 16; + break; + case VG_LITE_BGRA2222: + rs = 4; + gs = 2; + bs = 0; + as = 6; + rb = 2; + gb = 2; + bb = 2; + ab = 2; + bitsPerPixel = 8; + break; + case VG_LITE_RGBA2222: + rs = 0; + gs = 2; + bs = 4; + as = 6; + rb = 2; + gb = 2; + bb = 2; + ab = 2; + bitsPerPixel = 8; + break; + case VG_LITE_ABGR2222: + rs = 6; + gs = 4; + bs = 2; + as = 0; + rb = 2; + gb = 2; + bb = 2; + ab = 2; + bitsPerPixel = 8; + break; + case VG_LITE_ARGB2222: + rs = 2; + gs = 4; + bs = 6; + as = 0; + rb = 2; + gb = 2; + bb = 2; + ab = 2; + bitsPerPixel = 8; + break; + default: + break; + } + + switch(bitsPerPixel) { + case 32: { + uint32_t * s = (((uint32_t *)scanline) + x); + p = (unsigned int) * s; + break; + } + + case 16: { + uint16_t * s = ((uint16_t *)scanline) + x; + p = (unsigned int) * s; + break; + } + + case 8: { + uint8_t * s = ((uint8_t *)scanline) + x; + p = (unsigned int) * s; + break; + } + case 4: { + uint8_t * s = ((uint8_t *)scanline) + (x >> 1); + p = (unsigned int)(*s >> ((x & 1) << 2)) & 0xf; + break; + } + case 2: { + uint8_t * s = ((uint8_t *)scanline) + (x >> 2); + p = (unsigned int)(*s >> ((x & 3) << 1)) & 0x3; + break; + } + default: { + uint8_t * s = ((uint8_t *)scanline) + (x >> 3); + p = (unsigned int)(*s >> (x & 7)) & 0x1; + break; + } + } + + //rgba + c.r = rb ? intToColor(p >> rs, (1 << rb) - 1) : (float)1.0f; + c.g = gb ? intToColor(p >> gs, (1 << gb) - 1) : (float)1.0f; + c.b = bb ? intToColor(p >> bs, (1 << bb) - 1) : (float)1.0f; + c.a = ab ? intToColor(p >> as, (1 << ab) - 1) : (float)1.0f; + + return c; +} + +void writePixel(vg_lite_buffer_t * temp, int x, int y, Color * c) +{ + uint8_t bitsPerPixel = 0; + int rb = 0; + int gb = 0; + int bb = 0; + int ab = 0; + int rs = 0; + int gs = 0; + int bs = 0; + int as = 0; + switch(temp->format) { + case VG_LITE_A8: + case VG_LITE_L8: + ab = 8; + bitsPerPixel = 8; + break; + case VG_LITE_ABGR4444: + rs = 12; + gs = 8; + bs = 4; + as = 0; + rb = 4; + gb = 4; + bb = 4; + ab = 4; + bitsPerPixel = 16; + break; + case VG_LITE_ARGB4444: + bs = 12; + gs = 8; + rs = 4; + as = 0; + rb = 4; + gb = 4; + bb = 4; + ab = 4; + bitsPerPixel = 16; + break; + case VG_LITE_RGBA4444: + as = 12; + bs = 8; + gs = 4; + rs = 0; + rb = 4; + gb = 4; + bb = 4; + ab = 4; + bitsPerPixel = 16; + break; + case VG_LITE_BGRA4444: + as = 12; + rs = 8; + gs = 4; + bs = 0; + rb = 4; + gb = 4; + bb = 4; + ab = 4; + bitsPerPixel = 16; + break; + case VG_LITE_RGB565: + rs = 0; + gs = 5; + bs = 11; + as = 0; + rb = 5; + gb = 6; + bb = 5; + ab = 0; + bitsPerPixel = 16; + break; + case VG_LITE_BGR565: + rs = 11; + gs = 5; + bs = 0; + as = 0; + rb = 5; + gb = 6; + bb = 5; + ab = 0; + bitsPerPixel = 16; + break; + case VG_LITE_ABGR8888: + case VG_LITE_XBGR8888: + rs = 24; + gs = 16; + bs = 8; + as = 0; + rb = 8; + gb = 8; + bb = 8; + ab = 8; + bitsPerPixel = 32; + break; + case VG_LITE_ARGB8888: + case VG_LITE_XRGB8888: + rs = 8; + gs = 16; + bs = 24; + as = 0; + rb = 8; + gb = 8; + bb = 8; + ab = 8; + bitsPerPixel = 32; + break; + case VG_LITE_RGBA8888: + case VG_LITE_RGBX8888: + rs = 0; + gs = 8; + bs = 16; + as = 24; + rb = 8; + gb = 8; + bb = 8; + ab = 8; + bitsPerPixel = 32; + break; + case VG_LITE_BGRA8888: + case VG_LITE_BGRX8888: + rs = 16; + gs = 8; + bs = 0; + as = 24; + rb = 8; + gb = 8; + bb = 8; + ab = 8; + bitsPerPixel = 32; + break; + case VG_LITE_ABGR1555: + rs = 11; + gs = 6; + bs = 1; + as = 0; + rb = 5; + gb = 5; + bb = 5; + ab = 1; + bitsPerPixel = 16; + break; + case VG_LITE_RGBA5551: + rs = 0; + gs = 5; + bs = 10; + as = 15; + rb = 5; + gb = 5; + bb = 5; + ab = 1; + bitsPerPixel = 16; + break; + case VG_LITE_ARGB1555: + rs = 1; + gs = 6; + bs = 11; + as = 0; + rb = 5; + gb = 5; + bb = 5; + ab = 1; + bitsPerPixel = 16; + break; + case VG_LITE_BGRA5551: + rs = 10; + gs = 5; + bs = 0; + as = 15; + rb = 5; + gb = 5; + bb = 5; + ab = 1; + bitsPerPixel = 16; + break; + case VG_LITE_BGRA2222: + rs = 4; + gs = 2; + bs = 0; + as = 6; + rb = 2; + gb = 2; + bb = 2; + ab = 2; + bitsPerPixel = 8; + break; + case VG_LITE_RGBA2222: + rs = 0; + gs = 2; + bs = 4; + as = 6; + rb = 2; + gb = 2; + bb = 2; + ab = 2; + bitsPerPixel = 8; + break; + case VG_LITE_ABGR2222: + rs = 6; + gs = 4; + bs = 2; + as = 0; + rb = 2; + gb = 2; + bb = 2; + ab = 2; + bitsPerPixel = 8; + break; + case VG_LITE_ARGB2222: + rs = 2; + gs = 4; + bs = 6; + as = 0; + rb = 2; + gb = 2; + bb = 2; + ab = 2; + bitsPerPixel = 8; + break; + default: + break; + } + + unsigned int cr = rb ? colorToInt(c->r, (1 << rb) - 1) : 0; + unsigned int cg = gb ? colorToInt(c->g, (1 << gb) - 1) : 0; + unsigned int cb = bb ? colorToInt(c->b, (1 << bb) - 1) : 0; + unsigned int ca = ab ? colorToInt(c->a, (1 << ab) - 1) : 0; + + unsigned int p = (cr << rs) | (cg << gs) | (cb << bs) | (ca << as); + char * scanline = (char *)temp->memory + y * temp->stride; + switch(bitsPerPixel) { + case 32: { + uint32_t * s = ((uint32_t *)scanline) + x; + *s = (uint32_t)p; + break; + } + + case 16: { + uint16_t * s = ((uint16_t *)scanline) + x; + *s = (uint16_t)p; + break; + } + + case 8: { + char * s = ((char *)scanline) + x; + *s = (char)p; + break; + } + case 4: { + char * s = ((char *)scanline) + (x >> 1); + *s = (char)((p << ((x & 1) << 2)) | ((unsigned int) * s & ~(0xf << ((x & 1) << 2)))); + break; + } + + case 2: { + char * s = ((char *)scanline) + (x >> 2); + *s = (char)((p << ((x & 3) << 1)) | ((unsigned int) * s & ~(0x3 << ((x & 3) << 1)))); + break; + } + + default: { + break; + } + } +} + +vg_lite_void setup_lvgl_image(vg_lite_buffer_t * dst, vg_lite_buffer_t * src, vg_lite_buffer_t * lvgl_buf, + vg_lite_blend_t operation) +{ + Color c_src, c_dst, c_temp; + /* copy source region to tmp dst */ + for(int j = 0; j < src->height; j++) { + for(int i = 0; i < src->width; i++) { + c_src = readPixel(src, i, j); + c_dst = readPixel(dst, i, j); + + switch(operation) { + case VG_LITE_BLEND_NORMAL_LVGL: + c_temp.a = c_src.a; + c_temp.r = c_src.a * c_src.r; + c_temp.g = c_src.a * c_src.g; + c_temp.b = c_src.a * c_src.b; + break; + case VG_LITE_BLEND_ADDITIVE_LVGL: + c_temp.a = c_src.a; + c_temp.r = (c_src.r + c_dst.r) * c_src.a; + c_temp.g = (c_src.g + c_dst.g) * c_src.a; + c_temp.b = (c_src.b + c_dst.b) * c_src.a; + break; + case VG_LITE_BLEND_SUBTRACT_LVGL: + c_temp.a = c_src.a; + c_temp.r = c_src.r < c_dst.r ? (c_dst.r - c_src.r) * c_src.a : 0; + c_temp.g = c_src.g < c_dst.g ? (c_dst.g - c_src.g) * c_src.a : 0; + c_temp.b = c_src.b < c_dst.b ? (c_dst.b - c_src.b) * c_src.a : 0; + break; + case VG_LITE_BLEND_MULTIPLY_LVGL: + c_temp.a = c_src.a; + c_temp.r = c_src.r * c_dst.r * c_src.a; + c_temp.g = c_src.g * c_dst.g * c_src.a; + c_temp.b = c_src.b * c_dst.b * c_src.a; + break; + default: + break; + } + if(lvgl_buf) { + writePixel(lvgl_buf, i, j, &c_temp); + } +#if !gcFEATURE_VG_GLOBAL_ALPHA + c_dst.a = 1.0; + writePixel(dst, i, j, &c_dst); +#endif + } + } + return; +} + +#endif /* !gcFEATURE_VG_LVGL_SUPPORT */ + +/****************** FLEXA Support ***************/ + +vg_lite_error_t vg_lite_flexa_enable() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_flexa_enable)(); +#endif + +#if gcFEATURE_VG_FLEXA + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_info_t data; + uint32_t reset_bit; + vg_lite_kernel_flexa_info_t flexa_data; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_flexa_enable\n"); +#endif + + flexa_data.sbi_mode = s_context.sbi_mode = 0x1; + flexa_data.sync_mode = s_context.sync_mode = BIT(14); + flexa_data.flexa_mode = s_context.flexa_mode = 0x1; + flexa_data.segment_address = s_context.segment_address; + flexa_data.segment_count = s_context.segment_count; + flexa_data.segment_size = s_context.segment_size; + flexa_data.stream_id = s_context.stream_id; + flexa_data.start_flag = s_context.start_flag = BIT(9); + flexa_data.stop_flag = s_context.stop_flag = BIT(11); + flexa_data.reset_flag = s_context.reset_flag = BIT(10); + /* set sync mode */ + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FLEXA_ENABLE, &flexa_data)); + + /* check if reset is complete */ + data.addr = 0x03600; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_CHECK, &data)); + reset_bit = data.reg; + + if(reset_bit == 1) { + error = VG_LITE_TIMEOUT; + return error; + } + s_context.flexa_dirty = 1; + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_flexa_set_stream(vg_lite_uint8_t stream_id) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_flexa_set_stream)(stream_id); +#endif + +#if gcFEATURE_VG_FLEXA + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_flexa_set_stream %d\n", stream_id); +#endif + + s_context.stream_id = stream_id << 1; + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_flexa_bg_buffer(vg_lite_uint8_t stream_id, vg_lite_buffer_t * buffer, + vg_lite_uint32_t bg_seg_count, vg_lite_uint32_t bg_seg_size) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_flexa_bg_buffer)(stream_id, buffer, bg_seg_count, bg_seg_size); +#endif + +#if gcFEATURE_VG_FLEXA + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_flexa_info_t flexa_data; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_flexa_bg_buffer %d %p %d %d\n", stream_id, buffer, bg_seg_count, bg_seg_size); +#endif + + flexa_data.sbi_mode = s_context.sbi_mode; + flexa_data.segment_address = s_context.segment_address = buffer->address; + flexa_data.segment_count = s_context.segment_count = bg_seg_count; + flexa_data.segment_size = s_context.segment_size = bg_seg_size; + flexa_data.stream_id = s_context.stream_id; + flexa_data.start_flag = s_context.start_flag; + flexa_data.stop_flag = s_context.stop_flag; + flexa_data.reset_flag = s_context.reset_flag; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FLEXA_SET_BACKGROUND_ADDRESS, &flexa_data)); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_flexa_stop_frame() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_flexa_stop_frame)(); +#endif + +#if gcFEATURE_VG_FLEXA + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_flexa_info_t flexa_data; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_flexa_stop_frame\n"); +#endif + + flexa_data.stop_flag = s_context.stop_flag = BIT(11); + flexa_data.stream_id = s_context.stream_id; + flexa_data.sbi_mode = s_context.sbi_mode; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FLEXA_STOP_FRAME, &flexa_data)); + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +vg_lite_error_t vg_lite_flexa_disable() +{ +#if DUMP_API + FUNC_DUMP(vg_lite_flexa_disable)(); +#endif + +#if gcFEATURE_VG_FLEXA + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_flexa_info_t flexa_data; + vg_lite_kernel_info_t data; + uint32_t reset_bit; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_flexa_disable\n"); +#endif + + flexa_data.flexa_mode = s_context.flexa_mode = 0x0; + flexa_data.sync_mode = s_context.sync_mode = BIT(2); + flexa_data.stream_id = s_context.stream_id = 0; + flexa_data.sbi_mode = s_context.sbi_mode = 0x0; + flexa_data.start_flag = s_context.start_flag = 0x0; + flexa_data.stop_flag = s_context.stop_flag = 0x0; + flexa_data.reset_flag = s_context.reset_flag = 0x0; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FLEXA_DISABLE, &flexa_data)); + + /* check if reset is complete */ + data.addr = 0x03600; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_CHECK, &data)); + reset_bit = data.reg; + if(reset_bit == 1) { + error = VG_LITE_TIMEOUT; + return error; + } + s_context.flexa_dirty = 1; + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +/****************** FAST_CLEAR implementation. ***************/ +#if gcFEATURE_VG_IM_FASTCLEAR +static vg_lite_error_t _free_fc_buffer(vg_lite_fc_buffer_t * buffer) +{ + vg_lite_error_t error; + vg_lite_kernel_free_t free; + + if(buffer == NULL) + return VG_LITE_INVALID_ARGUMENT; + + /* Make sure we have a valid memory handle. */ + if(buffer->handle) { + /* Free the buffer. */ + free.memory_handle = buffer->handle; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &free)); + + /* Mark the buffer as freed. */ + buffer->handle = NULL; + buffer->memory = NULL; + } + + return VG_LITE_SUCCESS; +} +static vg_lite_error_t convert_color(vg_lite_buffer_format_t format, uint32_t value, uint32_t * result, int * bpp) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t r, g, b, a; + int Bpp = 0; + + r = B(value); + g = G(value); + b = R(value); + a = A(value); + + do { + switch(format) { + case VG_LITE_RGBA8888: + *result = ARGB(a, b, g, r); + Bpp = 32; + break; + + case VG_LITE_BGRA8888: + *result = ARGB(a, r, g, b); + Bpp = 32; + break; + + case VG_LITE_RGBX8888: + *result = ARGB(0xff, b, g, r); + Bpp = 32; + break; + + case VG_LITE_BGRX8888: + *result = ARGB(0xff, r, g, b); + Bpp = 32; + break; + + + case VG_LITE_RGBA4444: + *result = ARGB4(a, b, g, r); + Bpp = 16; + break; + + case VG_LITE_BGRA4444: + *result = ARGB4(a, r, g, b); + Bpp = 16; + break; + + case VG_LITE_RGB565: + *result = ((b & 0xf8) << 8) | + ((g & 0xfc) << 3) | + ((r & 0xf8) >> 3); + Bpp = 16; + break; + + case VG_LITE_BGR565: + *result = ((r & 0xf8) << 8) | + ((g & 0xfc) << 3) | + ((b & 0xf8) >> 3); + Bpp = 16; + break; + + case VG_LITE_BGRA5551: + *result = ((b & 0xf8) << 8) | + ((g & 0xf8) << 3) | + ((r & 0xf8) >> 2) | + ((a & 0x80) >> 7); + Bpp = 16; + break; + + case VG_LITE_A8: + *result = ARGB(a, a, a, a); + Bpp = 8; + break; + + case VG_LITE_L8: + *result = ARGB(r, r, r, r); + Bpp = 8; + break; + + default: + error = VG_LITE_NOT_SUPPORT; + break; + } + } while(0); + + if(bpp != NULL) { + *bpp = Bpp; + } + + if(Bpp == 16) { + *result = ((*result) << 16) | (*result); + } + return error; +} + +/* Fill Target buffer by FC buffer. Only used in cmodel/fpga for verification. */ +#if defined(DEBUG) || defined(_DEBUG) +static vg_lite_error_t fill_fc_target(vg_lite_buffer_t * target, vg_lite_buffer_t * fcb) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint8_t * fc = (uint8_t *)fcb->memory; + uint16_t * target16; + uint32_t * target32; + uint8_t * target8; + uint32_t clear32; + int byte_done = 0; + int i, j, k; + int bpp; + + do { + convert_color(target->format, target->fc_buffer[0].color, &clear32, &bpp); + + if(bpp == 32) { + target32 = (uint32_t *)target->memory; + for(i = 0; i < fcb->width; i++) { + + for(j = 0; j < 8; j++) { /* Loop the bits*/ + + if(!(((*fc) >> j) & 1)) { + for(k = 0; k < 64 / 4; k++) { + target32[k] = clear32; + byte_done += 4; + if(byte_done >= target->stride * target->height) { + return error; + } + } + } + + target32 += 64 / 4; + } + + fc++; + } + } + else if(bpp == 16) { + target16 = (uint16_t *)target->memory; + for(i = 0; i < fcb->width; i++) { + + for(j = 0; j < 8; j++) { /* Loop the bits*/ + + if(!(((*fc) >> j) & 1)) { + for(k = 0; k < 64 / 2; k++) { + target16[k] = (uint16_t)clear32; + byte_done += 2; + if(byte_done >= target->stride * target->height) { + return error; + } + } + } + + target16 += 64 / 2; + } + + fc++; + } + } + else if(bpp == 8) { + target8 = (uint8_t *)target->memory; + for(i = 0; i < fcb->width; i++) { + + for(j = 0; j < 8; j++) { /* Loop the bits*/ + + if(!(((*fc) >> j) & 1)) { + for(k = 0; k < 64; k++) { + target8[k] = (uint8_t)clear32; + byte_done++; + if(byte_done >= target->stride * target->height) { + return error; + } + } + } + + target8 += 64; + } + + fc++; + } + } + } while(0); + + return error; +} +#endif + +/* Update the fast_clear buffer when render target switched. */ +static vg_lite_error_t update_fc_buffer(vg_lite_buffer_t * target) +{ + int rt_bytes; + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_context_t * context = GET_CONTEXT(); + vg_lite_kernel_allocate_t allocate; + + do { + if(target == NULL) { + error = VG_LITE_INVALID_ARGUMENT; + break; + } + + rt_bytes = target->stride * target->height; + rt_bytes = VG_LITE_ALIGN(rt_bytes, (FC_BIT_TO_BYTES * 2)); + rt_bytes = rt_bytes / FC_BIT_TO_BYTES / 2; + /* Only allocate new buffer when the allocated is not big enough. Yes*/ + if(rt_bytes > target->fc_buffer[0].stride) { + _free_fc_buffer(&target->fc_buffer[0]); + + target->fc_buffer[0].width = rt_bytes; /* The actually used bytes. */ + rt_bytes = VG_LITE_ALIGN(rt_bytes, FC_BURST_BYTES); /* The allocated aligned bytes. */ + target->fc_buffer[0].stride = rt_bytes; + target->fc_buffer[0].height = 1; + allocate.bytes = rt_bytes; + allocate.contiguous = 1; + + VG_LITE_BREAK_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &allocate)); + target->fc_buffer[0].handle = allocate.memory_handle; + target->fc_buffer[0].memory = allocate.memory; + target->fc_buffer[0].address = allocate.memory_gpu; + } + else { + /* Just update the fc buffer size. */ + target->fc_buffer[0].width = rt_bytes; + } + memset(target->fc_buffer[0].memory, 0xff, target->fc_buffer[0].stride); + VG_LITE_RETURN_ERROR(push_state(context, 0x0A9A, target->fc_buffer[0].address)); /* FC buffer address. */ + } while(0); + + return error; +} + +/* Update FC registers and clear FC buffer. */ +static vg_lite_error_t clear_fc(vg_lite_fc_buffer_t * buffer, uint32_t value) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_context_t * context = GET_CONTEXT(); + uint32_t bytes_to_clear; + + if(buffer == NULL) + return VG_LITE_INVALID_ARGUMENT; + bytes_to_clear = buffer->stride / FC_BURST_BYTES; + buffer->color = value; + + do { + VG_LITE_BREAK_ERROR(push_state(context, 0x0A9B, value)); /* FC clear value. */ + VG_LITE_BREAK_ERROR(push_state(context, 0x0AB0, 0x80000000 | bytes_to_clear)); /* FC clear command. */ + } while(0); + + return error; +} + +#if VG_TARGET_FC_DUMP +static int fc_buf_dump(vg_lite_buffer_t * target, vg_lite_buffer_t * fcb) +{ + int error = VG_LITE_SUCCESS; + uint8_t * fc = (uint8_t *)fcb->memory; + uint8_t * target8; + int byte_done = 0; + int target_bytes; + int i, j; + + static unsigned s_cnt; + unsigned cnt = s_cnt; + + FILE * fpFCBuf; + FILE * fpTargetBuf; + FILE * fpTargetBufInfo; + char buf[256]; + + s_cnt++; + + sprintf(buf, "gc555.fc_buf.f%04d.txt", cnt); + fpFCBuf = fopen(buf, "wt"); + if(NULL == fpFCBuf) { + fprintf(stderr, "[Warning] Open file \'%s\' fail.\n", buf); + return -1; + } + + sprintf(buf, "gc555.target_buf_info.f%04d.txt", cnt); + fpTargetBufInfo = fopen(buf, "wt"); + if(NULL == fpTargetBufInfo) { + fprintf(stderr, "[Warning] Open file \'%s\' fail.\n", buf); + fclose(fpFCBuf); + return -1; + } + else { + fprintf(fpTargetBufInfo, "%-12s: %d\n", "format", target->format); + fprintf(fpTargetBufInfo, "%-12s: %d\n", "tiled", target->tiled); + fprintf(fpTargetBufInfo, "%-12s: %d\n", "width", target->width); + fprintf(fpTargetBufInfo, "%-12s: %d\n", "height", target->height); + fprintf(fpTargetBufInfo, "%-12s: %d\n", "stride", target->stride); + + fclose(fpTargetBufInfo); + } + + sprintf(buf, "gc555.target_buf.f%04d.txt", cnt); + fpTargetBuf = fopen(buf, "wt"); + if(NULL == fpTargetBuf) { + fprintf(stderr, "[Warning] Open file \'%s\' fail.\n", buf); + fclose(fpFCBuf); + return -1; + } + + /* Dump FC buffer & Dump target buffer */ + target8 = (uint8_t *)target->memory; + target_bytes = target->stride * target->height; + + for(i = 0; i < fcb->width; ++i) { + fprintf(fpFCBuf, "%02x\n", fc[i]); + /* 1 byte of fc related with 512 bytes of target buffer */ + for(j = 0; j < 128; ++j) { + fprintf(fpTargetBuf, "%02x", byte_done < target_bytes ? target8[0] : 0); + byte_done++; + + fprintf(fpTargetBuf, "%02x", byte_done < target_bytes ? target8[1] : 0); + byte_done++; + + fprintf(fpTargetBuf, "%02x", byte_done < target_bytes ? target8[2] : 0); + byte_done++; + + fprintf(fpTargetBuf, "%02x\n", byte_done < target_bytes ? target8[3] : 0); + byte_done++; + + target8 += 4; + } + } + + fclose(fpFCBuf); + fclose(fpTargetBuf); + + return error; +} +#endif /* VG_TARGET_FC_DUMP */ +#endif /* gcFEATURE_VG_IM_FASTCLEAR */ + +#endif /* LV_USE_VG_LITE_DRIVER */ + diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_matrix.c b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_matrix.c new file mode 100755 index 0000000..7858566 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_matrix.c @@ -0,0 +1,167 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include +#include +#include "vg_lite_context.h" + + +vg_lite_error_t vg_lite_identity(vg_lite_matrix_t * matrix) +{ +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_identity %p\n", matrix); +#endif + + /* Set identify matrix. */ + matrix->m[0][0] = 1.0f; + matrix->m[0][1] = 0.0f; + matrix->m[0][2] = 0.0f; + matrix->m[1][0] = 0.0f; + matrix->m[1][1] = 1.0f; + matrix->m[1][2] = 0.0f; + matrix->m[2][0] = 0.0f; + matrix->m[2][1] = 0.0f; + matrix->m[2][2] = 1.0f; + + matrix->scaleX = 1.0f; + matrix->scaleY = 1.0f; + matrix->angle = 0.0f; + + return VG_LITE_SUCCESS; +} + +static void multiply(vg_lite_matrix_t * matrix, vg_lite_matrix_t * mult) +{ + vg_lite_matrix_t temp; + int row, column; + + /* Process all rows. */ + for(row = 0; row < 3; row++) { + /* Process all columns. */ + for(column = 0; column < 3; column++) { + /* Compute matrix entry. */ + temp.m[row][column] = (matrix->m[row][0] * mult->m[0][column]) + + (matrix->m[row][1] * mult->m[1][column]) + + (matrix->m[row][2] * mult->m[2][column]); + } + } + + /* Copy temporary matrix into result. */ + memcpy(matrix, &temp, sizeof(vg_lite_float_t) * 9); +} + +vg_lite_error_t vg_lite_translate(vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t * matrix) +{ +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_translate %f %f %p\n", x, y, matrix); +#endif + + /* Set translation matrix. */ + vg_lite_matrix_t t = { + { + { 1.0f, 0.0f, x }, + { 0.0f, 1.0f, y }, + { 0.0f, 0.0f, 1.0f } + }, + 1.0f, 1.0f, 0.0f + }; + + /* Multiply with current matrix. */ + multiply(matrix, &t); + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_scale(vg_lite_float_t scale_x, vg_lite_float_t scale_y, vg_lite_matrix_t * matrix) +{ +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_scale %f %f %p\n", scale_x, scale_y, matrix); +#endif + + /* Set scale matrix. */ + vg_lite_matrix_t s = { + { + { scale_x, 0.0f, 0.0f }, + { 0.0f, scale_y, 0.0f }, + { 0.0f, 0.0f, 1.0f } + }, + 1.0f, 1.0f, 0.0f + }; + + /* Multiply with current matrix. */ + multiply(matrix, &s); + +#if VG_SW_BLIT_PRECISION_OPT + matrix->scaleX = matrix->scaleX * scale_x; + matrix->scaleY = matrix->scaleY * scale_y; +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_rotate(vg_lite_float_t degrees, vg_lite_matrix_t * matrix) +{ +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_rotate %f %p\n", degrees, matrix); +#endif + + /* Convert degrees into radians. */ + vg_lite_float_t angle = (degrees / 180.0f) * 3.141592654f; + + /* Compuet cosine and sine values. */ + vg_lite_float_t cos_angle = cosf(angle); + vg_lite_float_t sin_angle = sinf(angle); + + /* Set rotation matrix. */ + vg_lite_matrix_t r = { + { + { cos_angle, -sin_angle, 0.0f }, + { sin_angle, cos_angle, 0.0f }, + { 0.0f, 0.0f, 1.0f } + }, + 1.0f, 1.0f, 0.0f + }; + + /* Multiply with current matrix. */ + multiply(matrix, &r); + +#if VG_SW_BLIT_PRECISION_OPT + matrix->angle = matrix->angle + degrees; + if(matrix->angle >= 360) { + vg_lite_uint32_t count = (vg_lite_uint32_t)matrix->angle / 360; + matrix->angle = matrix->angle - count * 360; + } +#endif /* VG_SW_BLIT_PRECISION_OPT */ + + return VG_LITE_SUCCESS; +} + +#endif /* LV_USE_VG_LITE_DRIVER */ + diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_options.h b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_options.h new file mode 100755 index 0000000..6ee997d --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_options.h @@ -0,0 +1,40 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#ifndef VG_LITE_OPTIONS_DISPATCH_H +#define VG_LITE_OPTIONS_DISPATCH_H + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + + #define VG_LITE_OPTIONS VG_LITE_OPTIONS_2 + #define VG_LITE_OPTIONS_2 <../VGLite/Series/LV_VG_LITE_HAL_GPU_SERIES/LV_VG_LITE_HAL_GPU_REVISION/vg_lite_options.h> + #include VG_LITE_OPTIONS + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_OPTIONS_DISPATCH_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_path.c b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_path.c new file mode 100755 index 0000000..e7dfaf9 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_path.c @@ -0,0 +1,5495 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "vg_lite_context.h" + +/* Path data operations. */ +#define CDALIGN(value, by) (((value) + (by) - 1) & ~((by) - 1)) +#define CDMIN(x, y) ((x) > (y) ? (y) : (x)) +#define CDMAX(x, y) ((x) > (y) ? (x) : (y)) + + +extern uint32_t transform(vg_lite_point_t * result, vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t * matrix); +extern uint32_t convert_blend(vg_lite_blend_t blend); +extern uint32_t inverse(vg_lite_matrix_t * result, vg_lite_matrix_t * matrix); +extern uint32_t convert_yuv2rgb(vg_lite_yuv2rgb_t yuv); +extern uint32_t convert_uv_swizzle(vg_lite_swizzle_t swizzle); +extern uint32_t convert_source_format(vg_lite_buffer_format_t format); +extern vg_lite_error_t check_compress(vg_lite_buffer_format_t format, vg_lite_compress_mode_t compress_mode, + vg_lite_buffer_layout_t tiled, uint32_t width, uint32_t height); +extern void get_format_bytes(vg_lite_buffer_format_t format, uint32_t * mul, uint32_t * div, uint32_t * bytes_align); +extern vg_lite_error_t srcbuf_align_check(vg_lite_buffer_t * source); + +extern vg_lite_matrix_t identity_mtx; + +/* Convert VGLite data format to HW value. */ +static uint32_t convert_path_format(vg_lite_format_t format) +{ + switch(format) { + case VG_LITE_S8: + return 0; + + case VG_LITE_S16: + return 0x100000; + + case VG_LITE_S32: + return 0x200000; + + case VG_LITE_FP32: + return 0x300000; + + default: + return 0; + } +} + +/* Convert VGLite quality enums to HW values. */ +static uint32_t convert_path_quality(vg_lite_quality_t quality) +{ + switch(quality) { + case VG_LITE_HIGH: + return 0x3; + + case VG_LITE_UPPER: + return 0x2; + + case VG_LITE_MEDIUM: + return 0x1; + + default: + return 0x0; + } +} + +static int32_t get_data_count(uint8_t cmd) +{ + static int32_t count[] = { + 0, + 0, + 2, + 2, + 2, + 2, + 4, + 4, + 6, + 6, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 4, + 4, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5 + }; + + if(cmd > VLC_OP_LCWARC_REL) { + return -1; + } + else { + return count[cmd]; + } +} + +static void compute_pathbounds(float * xmin, float * ymin, float * xmax, float * ymax, float x, float y) +{ + if(xmin != NULL) { + *xmin = *xmin < x ? *xmin : x; + } + + if(xmax != NULL) { + *xmax = *xmax > x ? *xmax : x; + } + + if(ymin != NULL) { + *ymin = *ymin < y ? *ymin : y; + } + + if(ymax != NULL) { + *ymax = *ymax > y ? *ymax : y; + } +} + +int32_t get_data_size(vg_lite_format_t format) +{ + int32_t data_size = 0; + + switch(format) { + case VG_LITE_S8: + data_size = sizeof(int8_t); + break; + + case VG_LITE_S16: + data_size = sizeof(int16_t); + break; + + case VG_LITE_S32: + data_size = sizeof(int32_t); + break; + + default: + data_size = sizeof(vg_lite_float_t); + break; + } + + return data_size; +} + +vg_lite_error_t vg_lite_init_path(vg_lite_path_t * path, + vg_lite_format_t data_format, + vg_lite_quality_t quality, + vg_lite_uint32_t path_length, + vg_lite_pointer path_data, + vg_lite_float_t min_x, vg_lite_float_t min_y, + vg_lite_float_t max_x, vg_lite_float_t max_y) +{ + int32_t data_size, num = 0; + + if(path == NULL) + return VG_LITE_INVALID_ARGUMENT; + + memset(path, 0, sizeof(*path)); + path->format = data_format; + path->quality = quality; + path->bounding_box[0] = min_x; + path->bounding_box[1] = min_y; + path->bounding_box[2] = max_x; + path->bounding_box[3] = max_y; + + /* Path data cannot end with a CLOSE op. Replace CLOSE with END for path_data */ + data_size = get_data_size(data_format); + num = path_length / data_size; + + switch(data_format) { + case VG_LITE_S8: + if(path_data && (*((char *)path_data + num - 1) == VLC_OP_CLOSE)) { + *(char *)((int *)path_data + num - 1) = VLC_OP_END; + } + break; + + case VG_LITE_S16: + if(path_data && (*(char *)((short *)path_data + num - 1) == VLC_OP_CLOSE)) { + *(char *)((short *)path_data + num - 1) = VLC_OP_END; + } + break; + + case VG_LITE_S32: + if(path_data && (*(char *)((int *)path_data + num - 1) == VLC_OP_CLOSE)) { + *(char *)((int *)path_data + num - 1) = VLC_OP_END; + } + break; + + case VG_LITE_FP32: + if(path_data && (*(char *)((float *)path_data + num - 1) == VLC_OP_CLOSE)) { + *(char *)((float *)path_data + num - 1) = VLC_OP_END; + } + break; + + default: + break; + } + + path->path_length = path_length; + path->path = path_data; + + path->path_changed = 1; + path->uploaded.address = 0; + path->uploaded.bytes = 0; + path->uploaded.handle = NULL; + path->uploaded.memory = NULL; + path->pdata_internal = 0; + s_context.path_lastX = 0; + s_context.path_lastY = 0; + /* Default FILL path type*/ + path->path_type = VG_LITE_DRAW_FILL_PATH; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_set_path_type(vg_lite_path_t * path, vg_lite_path_type_t path_type) +{ + if(!path || + (path_type != VG_LITE_DRAW_FILL_PATH && + path_type != VG_LITE_DRAW_STROKE_PATH && + path_type != VG_LITE_DRAW_FILL_STROKE_PATH) + ) + return VG_LITE_INVALID_ARGUMENT; + + path->path_type = path_type; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_clear_path(vg_lite_path_t * path) +{ + vg_lite_error_t error; + if(path->uploaded.handle != NULL) { + vg_lite_kernel_free_t free_cmd; + free_cmd.memory_handle = path->uploaded.handle; + error = vg_lite_kernel(VG_LITE_FREE, &free_cmd); + if(error != VG_LITE_SUCCESS) + return error; + } + +#if (CHIPID==0x355) + if(path->stroke && path->stroke->uploaded.handle != NULL) { + vg_lite_kernel_free_t free_cmd; + free_cmd.memory_handle = path->stroke->uploaded.handle; + error = vg_lite_kernel(VG_LITE_FREE, &free_cmd); + if(error != VG_LITE_SUCCESS) + return error; + } +#endif + + path->uploaded.address = 0; + path->uploaded.bytes = 0; + path->uploaded.handle = NULL; + path->uploaded.memory = NULL; + +#if (CHIPID==0x355) + if(path->stroke) { + path->stroke->uploaded.address = 0; + path->stroke->uploaded.bytes = 0; + path->stroke->uploaded.handle = NULL; + path->stroke->uploaded.memory = NULL; + } +#endif + + if(path->pdata_internal == 1 && path->path != NULL) { + vg_lite_os_free(path->path); + } + path->path = NULL; + + if(path->stroke_path) { + vg_lite_os_free(path->stroke_path); + path->stroke_path = NULL; + } + +#if gcFEATURE_VG_STROKE_PATH + if(path->stroke) { + if(path->stroke->path_list_divide) { + vg_lite_path_list_ptr cur_list; + while(path->stroke->path_list_divide) { + cur_list = path->stroke->path_list_divide->next; + if(path->stroke->path_list_divide->path_points) { + vg_lite_path_point_ptr temp_point; + while(path->stroke->path_list_divide->path_points) { + temp_point = path->stroke->path_list_divide->path_points->next; + vg_lite_os_free(path->stroke->path_list_divide->path_points); + path->stroke->path_list_divide->path_points = temp_point; + } + temp_point = NULL; + } + vg_lite_os_free(path->stroke->path_list_divide); + path->stroke->path_list_divide = cur_list; + } + cur_list = 0; + } + + if(path->stroke->stroke_paths) { + vg_lite_sub_path_ptr temp_sub_path; + while(path->stroke->stroke_paths) { + temp_sub_path = path->stroke->stroke_paths->next; + if(path->stroke->stroke_paths->point_list) { + vg_lite_path_point_ptr temp_point; + while(path->stroke->stroke_paths->point_list) { + temp_point = path->stroke->stroke_paths->point_list->next; + vg_lite_os_free(path->stroke->stroke_paths->point_list); + path->stroke->stroke_paths->point_list = temp_point; + } + temp_point = NULL; + } + vg_lite_os_free(path->stroke->stroke_paths); + path->stroke->stroke_paths = temp_sub_path; + } + temp_sub_path = NULL; + } + + if(path->stroke->dash_pattern) + vg_lite_os_free(path->stroke->dash_pattern); + + vg_lite_os_free(path->stroke); + path->stroke = NULL; + path->stroke_valid = 0; + + + path->stroke_size = 0; + } +#endif + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_upload_path(vg_lite_path_t * path) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_upload_path)(path); +#endif + + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t bytes; + vg_lite_buffer_t Buf, * buffer; + + buffer = &Buf; + + /* Compute the number of bytes required for path + command buffer prefix/postfix. */ + bytes = (8 + path->path_length + 7 + 8) & ~7; + + /* Allocate GPU memory. */ + buffer->width = bytes; + buffer->height = 1; + buffer->stride = 0; + buffer->format = VG_LITE_A8; + VG_LITE_RETURN_ERROR(vg_lite_allocate(buffer)); + + /* Initialize command buffer prefix. */ + ((uint32_t *) buffer->memory)[0] = VG_LITE_DATA((path->path_length + 7) / 8); + ((uint32_t *) buffer->memory)[1] = 0; + + /* Copy the path data. */ + memcpy((uint32_t *) buffer->memory + 2, path->path, path->path_length); + + /* Initialize command buffer postfix. */ + ((uint32_t *) buffer->memory)[(bytes >> 2) - 2] = VG_LITE_RETURN(); + ((uint32_t *) buffer->memory)[(bytes >> 2) - 1] = 0; + + /* Mark path as uploaded. */ + path->path = buffer->memory; + path->uploaded.handle = buffer->handle; + path->uploaded.address = buffer->address; + path->uploaded.memory = buffer->memory; + path->uploaded.bytes = bytes; + path->path_changed = 0; + VLM_PATH_ENABLE_UPLOAD(*path); /* Implicitly enable path uploading. */ + + /* Return pointer to vg_lite_buffer structure. */ + return error; +} + +vg_lite_uint32_t vg_lite_get_path_length(vg_lite_uint8_t * cmd, vg_lite_uint32_t count, vg_lite_format_t format) +{ + uint32_t size = 0; + int32_t dCount = 0; + uint32_t i = 0; + int32_t data_size = 0; + + data_size = get_data_size(format); + + for(i = 0; i < count; i++) { + size++; /* OP CODE. */ + + dCount = get_data_count(cmd[i]); + size = CDALIGN(size, data_size); + size += dCount * data_size; + + } + if(cmd[count - 1] != VLC_OP_END || cmd[count - 1] != VLC_OP_CLOSE) { + size++; + size = CDALIGN(size, data_size); + } + + return size; +} + +vg_lite_error_t vg_lite_append_path(vg_lite_path_t * path, + vg_lite_uint8_t * cmd, + vg_lite_pointer data, + vg_lite_uint32_t seg_count) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t i; + int32_t j; + int32_t offset = 0; + int32_t dataCount = 0; + float * dataf = (float *) data; + float * pathf = NULL; + int32_t * data_s32 = (int32_t *) data; + int32_t * path_s32 = NULL; + int16_t * data_s16 = (int16_t *) data; + int16_t * path_s16 = NULL; + int8_t * data_s8 = (int8_t *) data; + int8_t * path_s8 = NULL; + uint8_t * pathc = NULL; + int32_t data_size; + uint8_t arc_path = 0; + uint8_t h_v_path = 0; + uint8_t smooth_path = 0; + float px = 0.0f, py = 0.0f, cx = 0.0f, cy = 0.0f; + int rel = 0; + + if(cmd == NULL || data == NULL || path == NULL) + return VG_LITE_INVALID_ARGUMENT; + + for(i = 0; i < seg_count; i++) { + if(cmd[i] > VLC_OP_LCWARC_REL) + return VG_LITE_INVALID_ARGUMENT; + } + + /* Support NULL path->path case for OpenVG */ + if(!path->path) { + data_size = vg_lite_get_path_length(cmd, seg_count, path->format); + path->path = (vg_lite_pointer)vg_lite_os_malloc(data_size); + if(!path->path) { + return VG_LITE_OUT_OF_RESOURCES; + } + path->pdata_internal = 1; + memset(path->path, 0, data_size); + } + + data_size = get_data_size(path->format); + path->path_changed = 1; + pathf = (float *)path->path; + path_s32 = (int32_t *)path->path; + path_s16 = (int16_t *)path->path; + path_s8 = (int8_t *)path->path; + pathc = (uint8_t *)path->path; + /* Set bounding box if the first opcode is VLC_OP_MOVE_* */ + if((cmd[0] & 0xfe) == VLC_OP_MOVE) { + switch(path->format) { + case VG_LITE_S8: + cx = (float)data_s8[0]; + cy = (float)data_s8[1]; + break; + case VG_LITE_S16: + cx = (float)data_s16[0]; + cy = (float)data_s16[1]; + break; + case VG_LITE_S32: + cx = (float)data_s32[0]; + cy = (float)data_s32[1]; + break; + case VG_LITE_FP32: + cx = (float)dataf[0]; + cy = (float)dataf[1]; + break; + } + path->bounding_box[0] = path->bounding_box[2] = cx; + path->bounding_box[1] = path->bounding_box[3] = cy; + } + + /* Loop to fill path data. */ + for(i = 0; i < seg_count; i++) { +#if (CHIPID == 0x355) + if((i < seg_count) && cmd[i] == VLC_OP_CLOSE && (cmd[i + 1] == VLC_OP_MOVE || cmd[i + 1] == VLC_OP_MOVE_REL)) { + if(data_size == 1) { + *(pathc + offset) = cmd[i]; + offset++; + } + else if(data_size == 2) { + *(uint16_t *)(pathc + offset) = 0x0101; + offset += 2; + } + else if(data_size == 4) { + *(uint32_t *)(pathc + offset) = 0x01010101; + offset += 4; + } + } + else +#endif + { + *(pathc + offset) = cmd[i]; + offset++; + } + + dataCount = get_data_count(cmd[i]); + /* compute the bounding_box. */ + if(dataCount >= 0) { + offset = CDALIGN(offset, data_size); + if((cmd[i] > VLC_OP_CLOSE) && + (cmd[i] < VLC_OP_HLINE) && + ((cmd[i] & 0x01) == 1)) { + rel = 1; + } + else if((cmd[i] >= VLC_OP_HLINE) && + ((cmd[i] & 0x01) == 0)) { + rel = 1; + } + else { + rel = 0; + } + if(cmd[i] >= VLC_OP_HLINE && cmd[i] <= VLC_OP_VLINE_REL) { + switch(path->format) { + case VG_LITE_S8: + path_s8 = (int8_t *)(pathc + offset); + path_s8[0] = *data_s8; + data_s8++; + if(rel) { + cx = px + (float)path_s8[0]; + cy = py + (float)path_s8[1]; + } + else { + cx = (float)path_s8[0]; + cy = (float)path_s8[1]; + } + break; + + case VG_LITE_S16: + path_s16 = (int16_t *)(pathc + offset); + path_s16[0] = *data_s16; + data_s16++; + if(rel) { + cx = px + (float)path_s16[0]; + cy = py + (float)path_s16[1]; + } + else { + cx = (float)path_s16[0]; + cy = (float)path_s16[1]; + } + break; + + case VG_LITE_S32: + path_s32 = (int32_t *)(pathc + offset); + path_s32[0] = *data_s32; + data_s32++; + if(rel) { + cx = px + (float)path_s32[0]; + cy = py + (float)path_s32[1]; + } + else { + cx = (float)path_s32[0]; + cy = (float)path_s32[1]; + } + break; + + case VG_LITE_FP32: + pathf = (float *)(pathc + offset); + pathf[0] = *dataf; + dataf++; + if(rel) { + cx = px + (float)pathf[0]; + cy = py + (float)pathf[1]; + } + else { + cx = (float)pathf[0]; + cy = (float)pathf[1]; + } + break; + } + h_v_path = 1; + /* Update path bounds. */ + path->bounding_box[0] = CDMIN(path->bounding_box[0], cx); + path->bounding_box[2] = CDMAX(path->bounding_box[2], cx); + path->bounding_box[1] = CDMIN(path->bounding_box[1], cy); + path->bounding_box[3] = CDMAX(path->bounding_box[3], cy); + } + else if(cmd[i] < VLC_OP_SCCWARC) { + /* Mark smooth path,convert it in next step. */ + if(cmd[i] <= VLC_OP_SCUBIC_REL && cmd[i] >= VLC_OP_SQUAD) { + smooth_path = 1; + } + for(j = 0; j < dataCount / 2; j++) { + switch(path->format) { + case VG_LITE_S8: + path_s8 = (int8_t *)(pathc + offset); + path_s8[j * 2] = *data_s8; + data_s8++; + path_s8[j * 2 + 1] = *data_s8; + data_s8++; + + if(rel) { + cx = px + path_s8[j * 2]; + cy = py + path_s8[j * 2 + 1]; + } + else { + cx = path_s8[j * 2]; + cy = path_s8[j * 2 + 1]; + } + break; + case VG_LITE_S16: + path_s16 = (int16_t *)(pathc + offset); + path_s16[j * 2] = *data_s16; + data_s16++; + path_s16[j * 2 + 1] = *data_s16; + data_s16++; + + if(rel) { + cx = px + path_s16[j * 2]; + cy = py + path_s16[j * 2 + 1]; + } + else { + cx = path_s16[j * 2]; + cy = path_s16[j * 2 + 1]; + } + break; + case VG_LITE_S32: + path_s32 = (int32_t *)(pathc + offset); + path_s32[j * 2] = *data_s32; + data_s32++; + path_s32[j * 2 + 1] = *data_s32; + data_s32++; + + if(rel) { + cx = px + path_s32[j * 2]; + cy = py + path_s32[j * 2 + 1]; + } + else { + cx = (float)path_s32[j * 2]; + cy = (float)path_s32[j * 2 + 1]; + } + break; + case VG_LITE_FP32: + pathf = (float *)(pathc + offset); + pathf[j * 2] = *dataf; + dataf++; + pathf[j * 2 + 1] = *dataf; + dataf++; + + if(rel) { + cx = px + pathf[j * 2]; + cy = py + pathf[j * 2 + 1]; + } + else { + cx = pathf[j * 2]; + cy = pathf[j * 2 + 1]; + } + break; + + default: + return VG_LITE_INVALID_ARGUMENT; + } + if(cmd[i] <= VLC_OP_LINE_REL && cmd[i] >= VLC_OP_MOVE) { + /* Update move to and line path bounds. */ + path->bounding_box[0] = CDMIN(path->bounding_box[0], cx); + path->bounding_box[2] = CDMAX(path->bounding_box[2], cx); + path->bounding_box[1] = CDMIN(path->bounding_box[1], cy); + path->bounding_box[3] = CDMAX(path->bounding_box[3], cy); + } + + } + } +#if gcFEATURE_VG_ARC_PATH + else { + arc_path = 1; + switch(path->format) { + case VG_LITE_S8: + path_s8 = (int8_t *)(pathc + offset); + path_s8[0] = *data_s8; + data_s8++; + path_s8[1] = *data_s8; + data_s8++; + path_s8[2] = *data_s8; + data_s8++; + path_s8[3] = *data_s8; + data_s8++; + path_s8[4] = *data_s8; + data_s8++; + + if(rel) { + cx = px + path_s8[3]; + cy = py + path_s8[4]; + } + else { + cx = path_s8[3]; + cy = path_s8[4]; + } + /* Update path bounds. */ + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + cx + 2 * path_s8[0], cy + 2 * path_s8[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + px + 2 * path_s8[1], py + 2 * path_s8[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + cx - 2 * path_s8[0], cy - 2 * path_s8[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + px - 2 * path_s8[1], py - 2 * path_s8[1]); + break; + + case VG_LITE_S16: + path_s16 = (int16_t *)(pathc + offset); + path_s16[0] = *data_s16; + data_s16++; + path_s16[1] = *data_s16; + data_s16++; + path_s16[2] = *data_s16; + data_s16++; + path_s16[3] = *data_s16; + data_s16++; + path_s16[4] = *data_s16; + data_s16++; + + if(rel) { + cx = px + path_s16[3]; + cy = py + path_s16[4]; + } + else { + cx = path_s16[3]; + cy = path_s16[4]; + } + /* Update path bounds. */ + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + cx + 2 * path_s16[0], cy + 2 * path_s16[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + px + 2 * path_s16[1], py + 2 * path_s16[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + cx - 2 * path_s16[0], cy - 2 * path_s16[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + px - 2 * path_s16[1], py - 2 * path_s16[1]); + break; + + case VG_LITE_S32: + path_s32 = (int32_t *)(pathc + offset); + path_s32[0] = *data_s32; + data_s32++; + path_s32[1] = *data_s32; + data_s32++; + path_s32[2] = *data_s32; + data_s32++; + path_s32[3] = *data_s32; + data_s32++; + path_s32[4] = *data_s32; + data_s32++; + + if(rel) { + cx = px + path_s32[3]; + cy = py + path_s32[4]; + } + else { + cx = (float)path_s32[3]; + cy = (float)path_s32[4]; + } + /* Update path bounds. */ + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + cx + 2 * path_s32[0], cy + 2 * path_s32[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + px + 2 * path_s32[1], py + 2 * path_s32[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + cx - 2 * path_s32[0], cy - 2 * path_s32[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + px - 2 * path_s32[1], py - 2 * path_s32[1]); + break; + + case VG_LITE_FP32: + pathf = (float *)(pathc + offset); + pathf[0] = *dataf; + dataf++; + pathf[1] = *dataf; + dataf++; + pathf[2] = *dataf; + dataf++; + pathf[3] = *dataf; + dataf++; + pathf[4] = *dataf; + dataf++; + + if(rel) { + cx = px + pathf[3]; + cy = py + pathf[4]; + } + else { + cx = pathf[3]; + cy = pathf[4]; + } + /* Update path bounds. */ + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + cx + 2 * pathf[0], cy + 2 * pathf[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + px + 2 * pathf[1], py + 2 * pathf[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + cx - 2 * pathf[0], cy - 2 * pathf[1]); + compute_pathbounds(&path->bounding_box[0], &path->bounding_box[1], &path->bounding_box[2], &path->bounding_box[3], + px - 2 * pathf[1], py - 2 * pathf[1]); + break; + } + + } +#endif + px = cx; + py = cy; + + offset += dataCount * data_size; + } + } + if(cmd[seg_count - 1] == VLC_OP_END +#if gcFEATURE_VG_ARC_PATH + || (cmd[seg_count - 1] == VLC_OP_CLOSE && (arc_path | h_v_path | smooth_path)) +#endif + ) { + path->path_length = offset; + } + else { + path->path_length = offset + data_size; + path->add_end = 1; + ((uint8_t *)(path->path))[offset] = 0; + } + +#if gcFEATURE_VG_ARC_PATH + if(arc_path | h_v_path | smooth_path) { + error = vg_lite_init_arc_path(path, + path->format, + path->quality, + path->path_length, + path->path, + path->bounding_box[0], path->bounding_box[1], + path->bounding_box[2], path->bounding_box[3]); + } +#endif + s_context.path_lastX = cx; + s_context.path_lastY = cy; + return error; +} + +#if (CHIPID==0x355 || CHIPID==0x255) /* GC355/GC255 vg_lite_draw functions */ + +#define UPDATE_BOUNDING_BOX(bbx, point) \ + do { \ + if ((point).x < (bbx).x) { \ + (bbx).width += (bbx).x - (point).x; \ + (bbx).x = (point).x; \ + } \ + if ((point).y < (bbx).y) { \ + (bbx).height += (bbx).y - (point).y; \ + (bbx).y = (point).y; \ + } \ + if ((point).x > (bbx).x + (bbx).width) \ + (bbx).width = (point).x - (bbx).x; \ + if ((point).y > (bbx).y + (bbx).height) \ + (bbx).height = (point).y - (bbx).y; \ + } while(0) + +static vg_lite_error_t transform_bounding_box(vg_lite_rectangle_t * in_bbx, + vg_lite_matrix_t * matrix, + vg_lite_rectangle_t * clip, + vg_lite_rectangle_t * out_bbx, + vg_lite_point_t * origin) +{ + vg_lite_point_t temp; + + memset(out_bbx, 0, sizeof(vg_lite_rectangle_t)); + + /* Transform image point (0, 0). */ + if(!transform(&temp, 0.0f, 0.0f, matrix)) + return VG_LITE_INVALID_ARGUMENT; + out_bbx->x = temp.x; + out_bbx->y = temp.y; + + /* Provide position of the new origin to the caller if requested. */ + if(origin != NULL) { + origin->x = temp.x; + origin->y = temp.y; + } + + /* Transform image point (0, height). */ + if(!transform(&temp, 0.0f, (vg_lite_float_t)in_bbx->height, matrix)) + return VG_LITE_INVALID_ARGUMENT; + UPDATE_BOUNDING_BOX(*out_bbx, temp); + + /* Transform image point (width, height). */ + if(!transform(&temp, (vg_lite_float_t)in_bbx->width, (vg_lite_float_t)in_bbx->height, matrix)) + return VG_LITE_INVALID_ARGUMENT; + UPDATE_BOUNDING_BOX(*out_bbx, temp); + + /* Transform image point (width, 0). */ + if(!transform(&temp, (vg_lite_float_t)in_bbx->width, 0.0f, matrix)) + return VG_LITE_INVALID_ARGUMENT; + UPDATE_BOUNDING_BOX(*out_bbx, temp); + + /* Clip is required */ + if(clip) { + out_bbx->x = MAX(out_bbx->x, clip->x); + out_bbx->y = MAX(out_bbx->y, clip->y); + out_bbx->width = MIN((out_bbx->x + out_bbx->width), (clip->x + clip->width)) - out_bbx->x; + out_bbx->height = MIN((out_bbx->y + out_bbx->height), (clip->y + clip->height)) - out_bbx->y; + } + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t set_interpolation_steps(vg_lite_buffer_t * target, + vg_lite_int32_t s_width, + vg_lite_int32_t s_height, + vg_lite_matrix_t * matrix) +{ + vg_lite_matrix_t im; + vg_lite_rectangle_t src_bbx, bounding_box, clip; + vg_lite_float_t xs[3], ys[3], cs[3]; + vg_lite_error_t error = VG_LITE_SUCCESS; + float dx = 0.0f, dy = 0.0f; + +#define ERR_LIMIT 0.0000610351562f + + /* Get bounding box. */ + memset(&src_bbx, 0, sizeof(vg_lite_rectangle_t)); + memset(&clip, 0, sizeof(vg_lite_rectangle_t)); + src_bbx.width = (int32_t)s_width; + src_bbx.height = (int32_t)s_height; + + if(s_context.scissor_set) { + clip.x = s_context.scissor[0]; + clip.y = s_context.scissor[1]; + clip.width = s_context.scissor[2]; + clip.height = s_context.scissor[3]; + } + else { + clip.x = clip.y = 0; + clip.width = s_context.rtbuffer->width; + clip.height = s_context.rtbuffer->height; + } + transform_bounding_box(&src_bbx, matrix, &clip, &bounding_box, NULL); + /* Compute inverse matrix. */ + if(!inverse(&im, matrix)) + return VG_LITE_INVALID_ARGUMENT; + /* Compute interpolation steps. */ + /* X step */ + xs[0] = im.m[0][0] / s_width; + xs[1] = im.m[1][0] / s_height; + xs[2] = im.m[2][0]; + /* Y step */ + ys[0] = im.m[0][1] / s_width; + ys[1] = im.m[1][1] / s_height; + ys[2] = im.m[2][1]; + /* C step 2 */ + cs[2] = 0.5f * (im.m[2][0] + im.m[2][1]) + im.m[2][2]; + + /* C step 0, 1*/ + cs[0] = (0.5f * (im.m[0][0] + im.m[0][1]) + im.m[0][2] + dx) / s_width; + cs[1] = (0.5f * (im.m[1][0] + im.m[1][1]) + im.m[1][2] + dy) / s_height; + /* Set command buffer */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A18, (void *)&cs[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A19, (void *)&cs[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1A, (void *)&cs[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1C, (void *)&xs[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1D, (void *)&xs[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1E, (void *)&xs[2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A20, (void *)&ys[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A21, (void *)&ys[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A22, (void *)&ys[2])); + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t set_interpolation_steps_draw_paint(vg_lite_buffer_t * target, + vg_lite_int32_t s_width, + vg_lite_int32_t s_height, + vg_lite_matrix_t * matrix) +{ + vg_lite_matrix_t im; + vg_lite_rectangle_t src_bbx, bounding_box, clip; + vg_lite_float_t xs[3], ys[3], cs[3]; + vg_lite_error_t error = VG_LITE_SUCCESS; + float dx = 0.0f, dy = 0.0f; + +#define ERR_LIMIT 0.0000610351562f + + /* Get bounding box. */ + memset(&src_bbx, 0, sizeof(vg_lite_rectangle_t)); + memset(&clip, 0, sizeof(vg_lite_rectangle_t)); + src_bbx.width = (int32_t)s_width; + src_bbx.height = (int32_t)s_height; + + if(s_context.scissor_set) { + clip.x = s_context.scissor[0]; + clip.y = s_context.scissor[1]; + clip.width = s_context.scissor[2]; + clip.height = s_context.scissor[3]; + } + else { + clip.x = clip.y = 0; + clip.width = s_context.rtbuffer->width; + clip.height = s_context.rtbuffer->height; + } + transform_bounding_box(&src_bbx, matrix, &clip, &bounding_box, NULL); + /* Compute inverse matrix. */ + if(!inverse(&im, matrix)) + return VG_LITE_INVALID_ARGUMENT; + /* Compute interpolation steps. */ + /* X step */ + xs[0] = im.m[0][0] / s_width; + xs[1] = im.m[1][0] / s_height; + xs[2] = im.m[2][0]; + /* Y step */ + ys[0] = im.m[0][1] / s_width; + ys[1] = im.m[1][1] / s_height; + ys[2] = im.m[2][1]; + /* C step 2 */ + cs[2] = 0.5f * (im.m[2][0] + im.m[2][1]) + im.m[2][2]; + + /* C step 0, 1*/ + cs[0] = (0.5f * (im.m[0][0] + im.m[0][1]) + im.m[0][2] + dx) / s_width; + cs[1] = (0.5f * (im.m[1][0] + im.m[1][1]) + im.m[1][2] + dy) / s_height; + + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A04, (void *)&cs[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A05, (void *)&cs[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A06, (void *)&xs[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A07, (void *)&xs[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A08, (void *)&ys[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A09, (void *)&ys[1])); + /* Set command buffer */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A18, (void *)&cs[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A19, (void *)&cs[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1A, (void *)&cs[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1C, (void *)&xs[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1D, (void *)&xs[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1E, (void *)&xs[2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A20, (void *)&ys[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A21, (void *)&ys[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A22, (void *)&ys[2])); + + return VG_LITE_SUCCESS; +} + +/* GC355/GC255 vg_lite_draw API implementation + */ +vg_lite_error_t vg_lite_draw(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color) +{ + uint32_t blend_mode; + uint32_t format, quality, tiling, fill; + uint32_t tessellation_size; + vg_lite_error_t error; + int32_t dst_align_width; + uint32_t mul, div, align; + vg_lite_point_t point_min = {0}, point_max = {0}, temp = {0}; + int x, y, width, height; + uint8_t ts_is_fullscreen = 0; + uint32_t in_premult = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; +#if(CHIPID == 0x355) + uint8_t * path_re = NULL; + uint32_t index = 0; +#endif + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_draw %p %p %d %p %d 0x%08X\n", target, path, fill_rule, matrix, blend, color); + VGLITE_LOG(" path_type %d, path_length %d, stroke_size %d\n", path->path_type, path->path_length, path->stroke_size); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_QUALITY_8X + if(path->quality == VG_LITE_UPPER) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(!path || !path->path) { + return VG_LITE_INVALID_ARGUMENT; + } +#if (CHIPID == 0x355) + if(target->format == VG_LITE_L8 || target->format == VG_LITE_YUYV || + target->format == VG_LITE_BGRA2222 || target->format == VG_LITE_RGBA2222 || + target->format == VG_LITE_ABGR2222 || target->format == VG_LITE_ARGB2222) { + printf("Target format: 0x%x is not supported.\n", target->format); + return VG_LITE_NOT_SUPPORT; + } +#endif +#endif /* gcFEATURE_VG_ERROR_CHECK */ + + if(!path->path_length) { + return VG_LITE_SUCCESS; + } + + if(!matrix) { + matrix = &identity_mtx; + } + +#if gcFEATURE_VG_GAMMA + set_gamma_dest_only(target, VGL_FALSE); +#endif + + /*blend input into context*/ + s_context.blend_mode = blend; + + /* Adjust premultiply setting according to openvg condition */ + target->apply_premult = 0; + premul_flag = (s_context.blend_mode >= OPENVG_BLEND_SRC_OVER && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE); + if(target->premultiplied == 0 && premul_flag == 0) { + in_premult = 0x10000000; + target->apply_premult = 1; + } + else if((target->premultiplied == 1) || + (target->premultiplied == 0 && premul_flag == 1)) { + in_premult = 0x00000000; + } + if(blend == VG_LITE_BLEND_NORMAL_LVGL) { + in_premult = 0x00000000; + } + + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + else if(error == VG_LITE_NO_CONTEXT) { + /* If scissoring is enabled and no valid scissoring rectangles + are present, no drawing occurs */ + return VG_LITE_SUCCESS; + } + + width = s_context.tessbuf.tess_w_h & 0xFFFF; + height = s_context.tessbuf.tess_w_h >> 16; + get_format_bytes(target->format, &mul, &div, &align); + dst_align_width = target->stride * div / mul; + if(width == 0 || height == 0) + return VG_LITE_NO_CONTEXT; + if((dst_align_width <= width) && (target->height <= height)) { + ts_is_fullscreen = 1; + point_min.x = 0; + point_min.y = 0; + point_max.x = dst_align_width; + point_max.y = target->height; + } + + if(ts_is_fullscreen == 0) { + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[1], matrix); + point_min = point_max = temp; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[1], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + if(point_min.x < 0) point_min.x = 0; + if(point_min.y < 0) point_min.y = 0; + if(point_max.x > dst_align_width) point_max.x = dst_align_width; + if(point_max.y > target->height) point_max.y = target->height; + + if(s_context.scissor_set) { + point_min.x = MAX(point_min.x, s_context.scissor[0]); + point_min.y = MAX(point_min.y, s_context.scissor[1]); + point_max.x = MIN(point_max.x, s_context.scissor[0] + s_context.scissor[2]); + point_max.y = MIN(point_max.y, s_context.scissor[1] + s_context.scissor[3]); + } + } + + /* Convert states into hardware values. */ + blend_mode = convert_blend(blend); + format = convert_path_format(path->format); + quality = convert_path_quality(path->quality); + tiling = (s_context.capabilities.cap.tiled == 2) ? 0x2000000 : 0; + fill = (fill_rule == VG_LITE_FILL_EVEN_ODD) ? 0x10 : 0; + tessellation_size = s_context.tessbuf.L2_size ? s_context.tessbuf.L2_size : s_context.tessbuf.L1_size; + + /* Setup the command buffer. */ + /* Program color register. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + in_premult | s_context.capabilities.cap.tiled | blend_mode | s_context.enable_mask | s_context.scissor_enable | + s_context.color_transform | s_context.matrix_enable)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, color)); + /* Program tessellation control: for TS module. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3B, 0x3F800000)); /* Path tessellation SCALE. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3C, 0x00000000)); /* Path tessellation BIAS. */ + /* Program matrix. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A40, (void *) &matrix->m[0][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A41, (void *) &matrix->m[0][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A42, (void *) &matrix->m[0][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A43, (void *) &matrix->m[1][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A44, (void *) &matrix->m[1][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A45, (void *) &matrix->m[1][2])); + + /* Setup tessellation loop. */ + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO || + path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + for(y = point_min.y; y < point_max.y; y += height) { + for(x = point_min.x; x < point_max.x; x += width) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_stall(&s_context, 15)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A01, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + } + } + } + } + /* Setup tessellation loop. */ + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + for(y = point_min.y; y < point_max.y; y += height) { + for(x = point_min.x; x < point_max.x; x += width) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_stall(&s_context, 15)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A01, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + + if(VLM_PATH_STROKE_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->stroke->uploaded.address, path->stroke->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + } + } + } + } + /* Finialize command buffer. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); + + return error; +} + +/* GC355/GC255 vg_lite_draw_pattern API implementation + */ +vg_lite_error_t vg_lite_draw_pattern(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_buffer_t * source, + vg_lite_matrix_t * pattern_matrix, + vg_lite_blend_t blend, + vg_lite_pattern_mode_t pattern_mode, + vg_lite_color_t pattern_color, + vg_lite_color_t color, + vg_lite_filter_t filter) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t imageMode; + uint32_t blend_mode; + uint32_t filter_mode = 0; + int32_t dst_align_width; + uint32_t mul, div, align; + uint32_t conversion = 0; + uint32_t tiled_source; + vg_lite_matrix_t matrix; + uint32_t pattern_tile = 0; + uint32_t transparency_mode = 0; + + /* The following code is from "draw path" */ + uint32_t format, quality, tiling, fill; + uint32_t tessellation_size; + + vg_lite_point_t point_min = {0}, point_max = {0}, temp = {0}; + int x, y, width, height; + uint8_t ts_is_fullscreen = 0; + uint32_t in_premult = 0; + uint32_t src_premultiply_enable = 0; + uint32_t paintType = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; + uint8_t lvgl_sw_blend = 0; + +#if(CHIPID == 0X355) + uint8_t * path_re = NULL; + uint32_t index = 0; +#endif +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_draw_pattern %p %p %d %p %p %p %d %d 0x%08X %d\n", + target, path, fill_rule, path_matrix, source, pattern_matrix, blend, pattern_mode, pattern_color, filter); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_QUALITY_8X + if(path->quality == VG_LITE_UPPER) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(source->format == VG_LITE_A4 || source->format == VG_LITE_A8) { + return VG_LITE_NOT_SUPPORT; + } + if(!path || !path->path) { + return VG_LITE_INVALID_ARGUMENT; + } +#if (CHIPID == 0x355) + if(target->format == VG_LITE_L8 || target->format == VG_LITE_YUYV || + target->format == VG_LITE_BGRA2222 || target->format == VG_LITE_RGBA2222 || + target->format == VG_LITE_ABGR2222 || target->format == VG_LITE_ARGB2222) { + printf("Target format: 0x%x is not supported.\n", target->format); + return VG_LITE_NOT_SUPPORT; + } +#endif +#endif /* gcFEATURE_VG_ERROR_CHECK */ + +#if !gcFEATURE_VG_LVGL_SUPPORT + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + if(!source->lvgl_buffer) { + source->lvgl_buffer = (vg_lite_buffer_t *)vg_lite_os_malloc(sizeof(vg_lite_buffer_t)); + *source->lvgl_buffer = *source; + source->lvgl_buffer->lvgl_buffer = NULL; + vg_lite_allocate(source->lvgl_buffer); + } + /* Make sure render target is up to date before reading RT. */ + vg_lite_finish(); + setup_lvgl_image(target, source, source->lvgl_buffer, blend); + blend = VG_LITE_BLEND_SRC_OVER; + lvgl_sw_blend = 1; + } +#endif + + if(!path->path_length) { + return VG_LITE_SUCCESS; + } + + if(!path_matrix) { + path_matrix = &identity_mtx; + } + if(!pattern_matrix) { + pattern_matrix = &identity_mtx; + } + + /* Work on pattern states. */ + matrix = *pattern_matrix; + if(source->paintType == VG_LITE_PAINT_PATTERN) { + matrix.m[2][0] = 0; + matrix.m[2][1] = 0; + matrix.m[2][2] = 1; + source->image_mode = VG_LITE_NONE_IMAGE_MODE; + } + +#if gcFEATURE_VG_GAMMA + save_st_gamma_src_dest(source, target); +#endif + + /*blend input into context*/ + s_context.blend_mode = blend; + in_premult = 0x00000000; + + /* Adjust premultiply setting according to openvg condition */ + src_premultiply_enable = 0x01000100; + if(s_context.color_transform == 0 && s_context.gamma_dst == s_context.gamma_src && s_context.matrix_enable == 0 && + s_context.dst_alpha_mode == 0 && s_context.src_alpha_mode == 0 && + (source->image_mode == VG_LITE_NORMAL_IMAGE_MODE || source->image_mode == 0)) { + prediv_flag = 0; + } + else { + prediv_flag = 1; + } + if((s_context.blend_mode >= OPENVG_BLEND_SRC_OVER && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE) || + source->image_mode == VG_LITE_STENCIL_MODE) { + premul_flag = 1; + } + else { + premul_flag = 0; + } + + if((source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 0) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 0)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + /* when src and dst all pre format, im pre_out set to 0 to perform data truncation to prevent data overflow */ + else if(source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 0) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 0 && target->premultiplied == 1) || + (source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 1)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 1) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 1)) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + if((source->format == VG_LITE_A4 || source->format == VG_LITE_A8) && blend >= VG_LITE_BLEND_SRC_OVER && + blend <= VG_LITE_BLEND_SUBTRACT) { + in_premult = 0x00000000; + } + if(blend == VG_LITE_BLEND_NORMAL_LVGL) { + in_premult = 0x00000000; + } + if(source->premultiplied == target->premultiplied && premul_flag == 0) { + target->apply_premult = 1; + } + else { + target->apply_premult = 0; + } + + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + else if(error == VG_LITE_NO_CONTEXT) { + /* If scissoring is enabled and no valid scissoring rectangles + are present, no drawing occurs */ + return VG_LITE_SUCCESS; + } + + transparency_mode = (source->transparency_mode == VG_LITE_IMAGE_TRANSPARENT ? 0x8000 : 0); + width = s_context.tessbuf.tess_w_h & 0xFFFF; + height = s_context.tessbuf.tess_w_h >> 16; + get_format_bytes(target->format, &mul, &div, &align); + dst_align_width = target->stride * div / mul; + if(width == 0 || height == 0) + return VG_LITE_NO_CONTEXT; + if((dst_align_width <= width) && (target->height <= height)) { + ts_is_fullscreen = 1; + point_min.x = 0; + point_min.y = 0; + point_max.x = dst_align_width; + point_max.y = target->height; + } + + /* If target is L8 and source is in YUV or RGB (not L8 or A8) then we have to convert RGB into L8. */ + if((target->format == VG_LITE_L8) && ((source->format != VG_LITE_L8) && (source->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + + /* Determine image mode (NORMAL or MULTIPLY) depending on the color. */ + imageMode = (source->image_mode == VG_LITE_NONE_IMAGE_MODE) ? 0 : (source->image_mode == VG_LITE_MULTIPLY_IMAGE_MODE) ? + 0x00002000 : 0x00001000; + tiled_source = (source->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0 ; + + if(pattern_mode == VG_LITE_PATTERN_COLOR) { + uint8_t a, r, g, b; + pattern_tile = 0; + a = pattern_color >> 24; + r = pattern_color >> 16; + g = pattern_color >> 8; + b = pattern_color; + pattern_color = (a << 24) | (b << 16) | (g << 8) | r; + } + else if(pattern_mode == VG_LITE_PATTERN_PAD) { + pattern_tile = 0x1000; + } +#if gcFEATURE_VG_IM_REPEAT_REFLECT + else if(pattern_mode == VG_LITE_PATTERN_REPEAT) { + pattern_tile = 0x2000; + } + else if(pattern_mode == VG_LITE_PATTERN_REFLECT) { + pattern_tile = 0x3000; + } +#endif + else { + return VG_LITE_INVALID_ARGUMENT; + } + + switch(filter) { + case VG_LITE_FILTER_POINT: + filter_mode = 0; + break; + + case VG_LITE_FILTER_LINEAR: + filter_mode = 0x10000; + break; + + case VG_LITE_FILTER_BI_LINEAR: + filter_mode = 0x20000; + break; + + case VG_LITE_FILTER_GAUSSIAN: + filter_mode = 0x30000; + break; + } + + if(source->paintType == VG_LITE_PAINT_PATTERN) { + VG_LITE_RETURN_ERROR(set_interpolation_steps_draw_paint(target, source->width, source->height, &matrix)); + /* enable pre-multiplied in image unit */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A24, convert_source_format(source->format) | + filter_mode | pattern_tile | conversion | src_premultiply_enable)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A26, pattern_color)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A28, source->address)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2A, source->stride | tiled_source)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2C, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2E, source->width | (source->height << 16))); + } + else { + VG_LITE_RETURN_ERROR(set_interpolation_steps(target, source->width, source->height, &matrix)); + /* enable pre-multiplied in image unit */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A25, convert_source_format(source->format) | + filter_mode | pattern_tile | conversion | src_premultiply_enable)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A27, pattern_color)); + +#if !gcFEATURE_VG_LVGL_SUPPORT + if(lvgl_sw_blend) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source->lvgl_buffer->address)); + } + else +#endif + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source->address)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, source->stride | tiled_source)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2D, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2F, source->width | (source->height << 16))); + } + + /* Work on path states. */ + matrix = *path_matrix; + + if(ts_is_fullscreen == 0) { + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[1], &matrix); + point_min = point_max = temp; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[1], &matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[3], &matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[3], &matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + point_min.x = MAX(point_min.x, 0); + point_min.y = MAX(point_min.y, 0); + point_max.x = MIN(point_max.x, dst_align_width); + point_max.y = MIN(point_max.y, target->height); + + if(s_context.scissor_set) { + point_min.x = MAX(point_min.x, s_context.scissor[0]); + point_min.y = MAX(point_min.y, s_context.scissor[1]); + point_max.x = MIN(point_max.x, s_context.scissor[0] + s_context.scissor[2]); + point_max.y = MIN(point_max.y, s_context.scissor[1] + s_context.scissor[3]); + } + } + + /* Convert states into hardware values. */ + blend_mode = convert_blend(blend); + format = convert_path_format(path->format); + quality = convert_path_quality(path->quality); + tiling = (s_context.capabilities.cap.tiled == 2) ? 0x2000000 : 0; + fill = (fill_rule == VG_LITE_FILL_EVEN_ODD) ? 0x10 : 0; + tessellation_size = s_context.tessbuf.L2_size ? s_context.tessbuf.L2_size : s_context.tessbuf.L1_size; + + /* Setup the command buffer. */ + /* Program color register. */ + if(source->paintType == VG_LITE_PAINT_PATTERN) { + paintType = 1 << 24 | 1 << 25; + } + /* enable pre-multiplied from VG to VGPE */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + 0x2 | in_premult | paintType | s_context.capabilities.cap.tiled | imageMode | blend_mode | transparency_mode | + s_context.enable_mask | s_context.scissor_enable | s_context.color_transform | s_context.matrix_enable)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000400 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3B, 0x3F800000)); /* Path tessellation SCALE. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3C, 0x00000000)); /* Path tessellation BIAS. */ + /* Program matrix. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A40, (void *) &matrix.m[0][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A41, (void *) &matrix.m[0][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A42, (void *) &matrix.m[0][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A43, (void *) &matrix.m[1][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A44, (void *) &matrix.m[1][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A45, (void *) &matrix.m[1][2])); + + /* Setup tessellation loop. */ + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO || + path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + for(y = point_min.y; y < point_max.y; y += height) { + for(x = point_min.x; x < point_max.x; x += width) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_stall(&s_context, 15)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A01, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + } + } + } + } + /* Setup tessellation loop. */ + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + for(y = point_min.y; y < point_max.y; y += height) { + for(x = point_min.x; x < point_max.x; x += width) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_stall(&s_context, 15)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A01, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + + if(VLM_PATH_STROKE_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->stroke->uploaded.address, path->stroke->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + } + } + } + } + + /* Finialize command buffer. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); + vglitemDUMP_BUFFER("image", (size_t)source->address, source->memory, 0, (source->stride) * (source->height)); + + return error; +} + +/* GC355/GC255 vg_lite_draw_linear_grad API implementation + */ +vg_lite_error_t vg_lite_draw_linear_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_linear_gradient_ext_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t image_mode; + uint32_t blend_mode; + uint32_t filter_mode = 0; + uint32_t conversion = 0; + uint32_t tiled_source; + int32_t dst_align_width; + uint32_t mul, div, align; + vg_lite_matrix_t inverse_matrix; + vg_lite_buffer_t * source = &grad->image; + vg_lite_matrix_t * matrix = &grad->matrix; + uint32_t linear_tile = 0; + uint32_t transparency_mode = 0; + uint32_t in_premult = 0; + uint32_t src_premultiply_enable = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; + void * data; + + /* The following code is from "draw path" */ + uint32_t format, quality, tiling, fill; + uint32_t tessellation_size; + + vg_lite_kernel_allocate_t memory; + vg_lite_kernel_free_t free_memory; + uint32_t return_offset = 0; + + vg_lite_point_t point_min = {0}, point_max = {0}, temp = {0}; + int x, y, width, height; + uint8_t ts_is_fullscreen = 0; + + vg_lite_float_t dx, dy, dxdx_dydy; + vg_lite_float_t lg_step_x_lin, lg_step_y_lin, lg_constant_lin; + +#if(CHIPID == 0X355) + uint8_t * path_re = NULL; + uint32_t index = 0; +#endif +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_draw_linear_grad %p %p %d %p %p 0x%08X %d %d\n", + target, path, fill_rule, path_matrix, grad, paint_color, blend, filter); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_LVGL_SUPPORT + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_QUALITY_8X + if(path->quality == VG_LITE_UPPER) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(source->format == VG_LITE_A4 || source->format == VG_LITE_A8) { + return VG_LITE_NOT_SUPPORT; + } + if(!path || !path->path) { + return VG_LITE_INVALID_ARGUMENT; + } +#if (CHIPID == 0x355) + if(target->format == VG_LITE_L8 || target->format == VG_LITE_YUYV || + target->format == VG_LITE_BGRA2222 || target->format == VG_LITE_RGBA2222 || + target->format == VG_LITE_ABGR2222 || target->format == VG_LITE_ARGB2222) { + printf("Target format: 0x%x is not supported.\n", target->format); + return VG_LITE_NOT_SUPPORT; + } +#endif +#endif /* gcFEATURE_VG_ERROR_CHECK */ + + if(!path_matrix) { + path_matrix = &identity_mtx; + } + +#if gcFEATURE_VG_GAMMA + set_gamma_dest_only(target, VGL_TRUE); +#endif + + /*blend input into context*/ + s_context.blend_mode = blend; + + src_premultiply_enable = 0x01000100; + if(s_context.color_transform == 0 && s_context.gamma_dst == s_context.gamma_src && s_context.matrix_enable == 0 && + s_context.dst_alpha_mode == 0 && s_context.src_alpha_mode == 0 && + (source->image_mode == VG_LITE_NORMAL_IMAGE_MODE || source->image_mode == 0)) { + prediv_flag = 0; + } + else { + prediv_flag = 1; + } + if((s_context.blend_mode >= OPENVG_BLEND_SRC_OVER && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE) || + source->image_mode == VG_LITE_STENCIL_MODE) { + premul_flag = 1; + } + else { + premul_flag = 0; + } + + if((source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 0) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 0)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + /* when src and dst all pre format, im pre_out set to 0 to perform data truncation to prevent data overflow */ + else if(source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 0) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 0 && target->premultiplied == 1) || + (source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 1)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 1) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 1)) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + if((source->format == VG_LITE_A4 || source->format == VG_LITE_A8) && blend >= VG_LITE_BLEND_SRC_OVER && + blend <= VG_LITE_BLEND_SUBTRACT) { +#if (CHIPID==0x255) + src_premultiply_enable = 0x00000000; +#endif + in_premult = 0x00000000; + } + if(blend == VG_LITE_BLEND_NORMAL_LVGL) { + in_premult = 0x00000000; + } + if(source->premultiplied == target->premultiplied && premul_flag == 0) { + target->apply_premult = 1; + } + else { + target->apply_premult = 0; + } + + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + else if(error == VG_LITE_NO_CONTEXT) { + /* If scissoring is enabled and no valid scissoring rectangles + are present, no drawing occurs */ + return VG_LITE_SUCCESS; + } + + transparency_mode = (source->transparency_mode == VG_LITE_IMAGE_TRANSPARENT ? 0x8000 : 0); + width = s_context.tessbuf.tess_w_h & 0xFFFF; + height = s_context.tessbuf.tess_w_h >> 16; + get_format_bytes(target->format, &mul, &div, &align); + dst_align_width = target->stride * div / mul; + if(width == 0 || height == 0) + return VG_LITE_NO_CONTEXT; + if((dst_align_width <= width) && (target->height <= height)) { + ts_is_fullscreen = 1; + point_min.x = 0; + point_min.y = 0; + point_max.x = dst_align_width; + point_max.y = target->height; + } + + /* If target is L8 and source is in YUV or RGB (not L8 or A8) then we have to convert RGB into L8. */ + if((target->format == VG_LITE_L8) && ((source->format != VG_LITE_L8) && (source->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + + /* Determine image mode (NORMAL or MULTIPLY) depending on the color. */ + image_mode = (source->image_mode == VG_LITE_NONE_IMAGE_MODE) ? 0 : (source->image_mode == VG_LITE_MULTIPLY_IMAGE_MODE) ? + 0x00002000 : 0x00001000; + tiled_source = (source->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0 ; + + switch(grad->spread_mode) { + case VG_LITE_GRADIENT_SPREAD_FILL: + linear_tile = 0x0; + break; + + case VG_LITE_GRADIENT_SPREAD_PAD: + linear_tile = 0x1000; + break; + + case VG_LITE_GRADIENT_SPREAD_REPEAT: + linear_tile = 0x2000; + break; + + case VG_LITE_GRADIENT_SPREAD_REFLECT: + linear_tile = 0x3000; + break; + } + + switch(filter) { + case VG_LITE_FILTER_POINT: + filter_mode = 0; + break; + + case VG_LITE_FILTER_LINEAR: + filter_mode = 0x10000; + break; + + case VG_LITE_FILTER_BI_LINEAR: + filter_mode = 0x20000; + break; + + case VG_LITE_FILTER_GAUSSIAN: + filter_mode = 0x30000; + break; + } + + if(grad->spread_mode == VG_LITE_GRADIENT_SPREAD_FILL) { + uint8_t a, r, g, b; + a = paint_color >> 24; + r = paint_color >> 16; + g = paint_color >> 8; + b = paint_color; + paint_color = (a << 24) | (b << 16) | (g << 8) | r; + } + + /* compute radial gradient paremeters */ + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + dx = grad->linear_grad.X1 - grad->linear_grad.X0; + dy = grad->linear_grad.Y1 - grad->linear_grad.Y0; + dxdx_dydy = dx * dx + dy * dy; + + /* + ** dx (T(x) - x0) + dy (T(y) - y0) + ** g = ------------------------------- + ** dx^2 + dy^2 + ** + ** where + ** + ** dx := x1 - x0 + ** dy := y1 - y1 + ** T(x) := (x + 0.5) m00 + (y + 0.5) m01 + m02 + ** = x m00 + y m01 + 0.5 (m00 + m01) + m02 + ** T(y) := (x + 0.5) m10 + (y + 0.5) m11 + m12 + ** = x m10 + y m11 + 0.5 (m10 + m11) + m12. + ** + ** We can factor the top line into: + ** + ** = dx (x m00 + y m01 + 0.5 (m00 + m01) + m02 - x0) + ** + dy (x m10 + y m11 + 0.5 (m10 + m11) + m12 - y0) + ** + ** = x (dx m00 + dy m10) + ** + y (dx m01 + dy m11) + ** + dx (0.5 (m00 + m01) + m02 - x0) + ** + dy (0.5 (m10 + m11) + m12 - y0). + */ + + lg_step_x_lin + = (dx * MAT(&inverse_matrix, 0, 0) + dy * MAT(&inverse_matrix, 1, 0)) + / dxdx_dydy; + + lg_step_y_lin + = (dx * MAT(&inverse_matrix, 0, 1) + dy * MAT(&inverse_matrix, 1, 1)) + / dxdx_dydy; + + lg_constant_lin = + ( + ( + 0.5f * (MAT(&inverse_matrix, 0, 0) + MAT(&inverse_matrix, 0, 1)) + + MAT(&inverse_matrix, 0, 2) - grad->linear_grad.X0 + ) * dx + + + + + ( + 0.5f * (MAT(&inverse_matrix, 1, 0) + MAT(&inverse_matrix, 1, 1)) + + MAT(&inverse_matrix, 1, 2) - grad->linear_grad.Y0 + ) * dy + ) + / dxdx_dydy; + + /* Setup the command buffer. */ + + /* linear gradient parameters*/ + data = &lg_constant_lin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A04, *(uint32_t *) data)); + data = &lg_step_x_lin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A06, *(uint32_t *) data)); + data = &lg_step_y_lin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A08, *(uint32_t *) data)); + + VG_LITE_RETURN_ERROR(set_interpolation_steps(target, source->width, source->height, matrix)); + + /* enable pre-multiplied in image unit */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A24, convert_source_format(source->format) | + filter_mode | linear_tile | conversion | src_premultiply_enable)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A26, paint_color)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A28, source->address)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2A, tiled_source)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2C, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2E, source->width)); + + /* Work on path states. */ + matrix = path_matrix; + + if(ts_is_fullscreen == 0) { + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[1], matrix); + point_min = point_max = temp; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[1], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + point_min.x = MAX(point_min.x, 0); + point_min.y = MAX(point_min.y, 0); + point_max.x = MIN(point_max.x, dst_align_width); + point_max.y = MIN(point_max.y, target->height); + + if(s_context.scissor_set) { + point_min.x = MAX(point_min.x, s_context.scissor[0]); + point_min.y = MAX(point_min.y, s_context.scissor[1]); + point_max.x = MIN(point_max.x, s_context.scissor[0] + s_context.scissor[2]); + point_max.y = MIN(point_max.y, s_context.scissor[1] + s_context.scissor[3]); + } + } + + /* Convert states into hardware values. */ + blend_mode = convert_blend(blend); + format = convert_path_format(path->format); + quality = convert_path_quality(path->quality); + tiling = (s_context.capabilities.cap.tiled == 2) ? 0x2000000 : 0; + fill = (fill_rule == VG_LITE_FILL_EVEN_ODD) ? 0x10 : 0; + tessellation_size = s_context.tessbuf.L2_size ? s_context.tessbuf.L2_size : s_context.tessbuf.L1_size; + + /* Setup the command buffer. */ + /* Program color register. */ + + /* enable pre-multiplied from VG to VGPE */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + 0x01000002 | s_context.capabilities.cap.tiled | in_premult | image_mode | blend_mode | transparency_mode | + s_context.enable_mask | s_context.scissor_enable | s_context.color_transform | s_context.matrix_enable)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000400 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3B, 0x3F800000)); /* Path tessellation SCALE. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3C, 0x00000000)); /* Path tessellation BIAS. */ + /* Program matrix. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A40, (void *) &matrix->m[0][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A41, (void *) &matrix->m[0][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A42, (void *) &matrix->m[0][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A43, (void *) &matrix->m[1][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A44, (void *) &matrix->m[1][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A45, (void *) &matrix->m[1][2])); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + if(path->path_changed != 0) { + if(path->uploaded.handle != NULL) { + free_memory.memory_handle = path->uploaded.handle; + vg_lite_kernel(VG_LITE_FREE, &free_memory); + path->uploaded.address = 0; + path->uploaded.memory = NULL; + path->uploaded.handle = NULL; + } + /* Allocate memory for the path data. */ + memory.bytes = 16 + VG_LITE_ALIGN(path->path_length, 8); + return_offset = (8 + VG_LITE_ALIGN(path->path_length, 8)) / 4; + memory.contiguous = 1; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &memory)); + ((uint64_t *) memory.memory)[(path->path_length + 7) / 8] = 0; + ((uint32_t *) memory.memory)[0] = VG_LITE_DATA((path->path_length + 7) / 8); + ((uint32_t *) memory.memory)[1] = 0; + memcpy((uint8_t *) memory.memory + 8, path->path, path->path_length); + ((uint32_t *) memory.memory)[return_offset] = VG_LITE_RETURN(); + ((uint32_t *) memory.memory)[return_offset + 1] = 0; + + path->uploaded.handle = memory.memory_handle; + path->uploaded.memory = memory.memory; + path->uploaded.address = memory.memory_gpu; + path->uploaded.bytes = memory.bytes; + path->path_changed = 0; + } + } + + /* Setup tessellation loop. */ + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO) { + for(y = point_min.y; y < point_max.y; y += height) { + for(x = point_min.x; x < point_max.x; x += width) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_stall(&s_context, 15)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A01, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + } + } + } + } + /* Setup tessellation loop. */ + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + for(y = point_min.y; y < point_max.y; y += height) { + for(x = point_min.x; x < point_max.x; x += width) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_stall(&s_context, 15)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A01, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + + if(VLM_PATH_STROKE_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->stroke->uploaded.address, path->stroke->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + } + } + } + } + + /* Finialize command buffer. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); + + return error; +} + +/* GC355/GC255 vg_lite_draw_radial_grad API implementation + */ +vg_lite_error_t vg_lite_draw_radial_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_radial_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t imageMode; + uint32_t blend_mode; + uint32_t filter_mode = 0; + uint32_t conversion = 0; + uint32_t tiled_source; + int32_t dst_align_width; + uint32_t mul, div, align; + vg_lite_matrix_t inverse_matrix; + vg_lite_buffer_t * source = &grad->image; + vg_lite_matrix_t * matrix = &grad->matrix; + uint32_t rad_tile = 0; + uint32_t transparency_mode = 0; + uint32_t in_premult = 0; + uint32_t src_premultiply_enable = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; + void * data; + + /* The following code is from "draw path" */ + uint32_t format, quality, tiling, fill; + uint32_t tessellation_size; + + vg_lite_kernel_allocate_t memory; + vg_lite_kernel_free_t free_memory; + uint32_t return_offset = 0; + + vg_lite_point_t point_min = {0}, point_max = {0}, temp = {0}; + int x, y, width, height; + uint8_t ts_is_fullscreen = 0; + + vg_lite_float_t radius; + + vg_lite_float_t centerX, centerY; + vg_lite_float_t focalX, focalY; + vg_lite_float_t fx, fy; + vg_lite_float_t fxfy_2; + vg_lite_float_t radius2; + vg_lite_float_t r2_fx2, r2_fy2; + vg_lite_float_t r2_fx2_2, r2_fy2_2; + vg_lite_float_t r2_fx2_fy2; + vg_lite_float_t r2_fx2_fy2sq; + vg_lite_float_t cx, cy; + + vg_lite_float_t rgConstantLin, rgStepXLin, rgStepYLin; + vg_lite_float_t rgConstantRad, rgStepXRad, rgStepYRad; + vg_lite_float_t rgStepXXRad, rgStepYYRad, rgStepXYRad; +#if(CHIPID == 0X355) + uint8_t * path_re = NULL; + uint32_t index = 0; +#endif +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_draw_radial_grad %p %p %d %p %p 0x%08X %d %d\n", + target, path, fill_rule, path_matrix, grad, paint_color, blend, filter); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_LVGL_SUPPORT + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_QUALITY_8X + if(path->quality == VG_LITE_UPPER) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(source->format == VG_LITE_A4 || source->format == VG_LITE_A8) { + return VG_LITE_NOT_SUPPORT; + } + if(!path || !path->path) { + return VG_LITE_INVALID_ARGUMENT; + } +#if (CHIPID == 0x355) + if(target->format == VG_LITE_L8 || target->format == VG_LITE_YUYV || + target->format == VG_LITE_BGRA2222 || target->format == VG_LITE_RGBA2222 || + target->format == VG_LITE_ABGR2222 || target->format == VG_LITE_ARGB2222) { + printf("Target format: 0x%x is not supported.\n", target->format); + return VG_LITE_NOT_SUPPORT; + } +#endif + radius = grad->radial_grad.r; + if(radius < 0) { + return VG_LITE_INVALID_ARGUMENT; + } + VG_LITE_RETURN_ERROR(check_compress(source->format, source->compress_mode, source->tiled, source->width, + source->height)); +#endif /* gcFEATURE_VG_ERROR_CHECK */ + + if(!path->path_length) { + return VG_LITE_SUCCESS; + } + + if(!path_matrix) { + path_matrix = &identity_mtx; + } + +#if gcFEATURE_VG_GAMMA + set_gamma_dest_only(target, VGL_TRUE); +#endif + + /*blend input into context*/ + s_context.blend_mode = blend; + + src_premultiply_enable = 0x01000100; + if(s_context.color_transform == 0 && s_context.gamma_dst == s_context.gamma_src && s_context.matrix_enable == 0 && + s_context.dst_alpha_mode == 0 && s_context.src_alpha_mode == 0 && + (source->image_mode == VG_LITE_NORMAL_IMAGE_MODE || source->image_mode == 0)) { + prediv_flag = 0; + } + else { + prediv_flag = 1; + } + if((s_context.blend_mode >= OPENVG_BLEND_SRC_OVER && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE) || + source->image_mode == VG_LITE_STENCIL_MODE) { + premul_flag = 1; + } + else { + premul_flag = 0; + } + + if((source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 0) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 0)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + /* when src and dst all pre format, im pre_out set to 0 to perform data truncation to prevent data overflow */ + else if(source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 0) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 0 && target->premultiplied == 1) || + (source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 1)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 1) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 1)) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + if((source->format == VG_LITE_A4 || source->format == VG_LITE_A8) && blend >= VG_LITE_BLEND_SRC_OVER && + blend <= VG_LITE_BLEND_SUBTRACT) { +#if (CHIPID==0x255) + src_premultiply_enable = 0x00000000; +#endif + in_premult = 0x00000000; + } + if(blend == VG_LITE_BLEND_NORMAL_LVGL) { + in_premult = 0x00000000; + } + if(source->premultiplied == target->premultiplied && premul_flag == 0) { + target->apply_premult = 1; + } + else { + target->apply_premult = 0; + } + + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + else if(error == VG_LITE_NO_CONTEXT) { + /* If scissoring is enabled and no valid scissoring rectangles + are present, no drawing occurs */ + return VG_LITE_SUCCESS; + } + + transparency_mode = (source->transparency_mode == VG_LITE_IMAGE_TRANSPARENT ? 0x8000 : 0); + width = s_context.tessbuf.tess_w_h & 0xFFFF; + height = s_context.tessbuf.tess_w_h >> 16; + get_format_bytes(target->format, &mul, &div, &align); + dst_align_width = target->stride * div / mul; + if(width == 0 || height == 0) + return VG_LITE_NO_CONTEXT; + if((dst_align_width <= width) && (target->height <= height)) { + ts_is_fullscreen = 1; + point_min.x = 0; + point_min.y = 0; + point_max.x = dst_align_width; + point_max.y = target->height; + } + + /* If target is L8 and source is in YUV or RGB (not L8 or A8) then we have to convert RGB into L8. */ + if((target->format == VG_LITE_L8) && ((source->format != VG_LITE_L8) && (source->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + + /* Determine image mode (NORMAL or MULTIPLY) depending on the color. */ + imageMode = (source->image_mode == VG_LITE_NONE_IMAGE_MODE) ? 0 : (source->image_mode == VG_LITE_MULTIPLY_IMAGE_MODE) ? + 0x00002000 : 0x00001000; + tiled_source = (source->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0 ; + + switch(grad->spread_mode) { + case VG_LITE_GRADIENT_SPREAD_FILL: + rad_tile = 0x0; + break; + + case VG_LITE_GRADIENT_SPREAD_PAD: + rad_tile = 0x1000; + break; + + case VG_LITE_GRADIENT_SPREAD_REPEAT: + rad_tile = 0x2000; + break; + + case VG_LITE_GRADIENT_SPREAD_REFLECT: + rad_tile = 0x3000; + break; + } + + switch(filter) { + case VG_LITE_FILTER_POINT: + filter_mode = 0; + break; + + case VG_LITE_FILTER_LINEAR: + filter_mode = 0x10000; + break; + + case VG_LITE_FILTER_BI_LINEAR: + filter_mode = 0x20000; + break; + + case VG_LITE_FILTER_GAUSSIAN: + filter_mode = 0x30000; + break; + } + + if(grad->spread_mode == VG_LITE_GRADIENT_SPREAD_FILL) { + uint8_t a, r, g, b; + a = paint_color >> 24; + r = paint_color >> 16; + g = paint_color >> 8; + b = paint_color; + paint_color = (a << 24) | (b << 16) | (g << 8) | r; + } + + /* compute radial gradient paremeters */ + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Make shortcuts to the gradient information. */ + centerX = grad->radial_grad.cx; + centerY = grad->radial_grad.cy; + focalX = grad->radial_grad.fx; + focalY = grad->radial_grad.fy; + + /* Compute constants of the equation. */ + fx = focalX - centerX; + fy = focalY - centerY; + radius2 = radius * radius; + if(fx * fx + fy * fy > radius2) { + /* If the focal point is outside the circle, let's move it + to inside the circle. Per vg11 spec pg125 "If (fx, fy) lies outside ... + For here, we set it at 0.9 ratio to the center. + */ + vg_lite_float_t fr = (vg_lite_float_t)sqrt(fx * fx + fy * fy); + fx = radius * fx / fr * 0.9f; + fy = radius * fy / fr * 0.9f; + focalX = grad->radial_grad.fx + fx; + focalY = grad->radial_grad.fy + fy; + } + + fxfy_2 = 2.0f * fx * fy; + r2_fx2 = radius2 - fx * fx; + r2_fy2 = radius2 - fy * fy; + r2_fx2_2 = 2.0f * r2_fx2; + r2_fy2_2 = 2.0f * r2_fy2; + r2_fx2_fy2 = r2_fx2 - fy * fy; + r2_fx2_fy2sq = r2_fx2_fy2 * r2_fx2_fy2; + + /* _____________________________________ + ** dx fx + dy fy + \/r^2 (dx^2 + dy^2) - (dx fy - dy fx)^2 + ** g = ------------------------------------------------------- + ** r^2 - fx^2 - fy^2 + ** + ** Where + ** + ** dx := F(x) - focalX + ** dy := F(y) - focalY + ** fx := focalX - centerX + ** fy := focalX - centerY + ** + ** and + ** + ** F(x) := (x + 0.5) m00 + (y + 0.5) m01 + m02 + ** F(y) := (x + 0.5) m10 + (y + 0.5) m11 + m12 + ** + ** So, dx can be factored into + ** + ** dx = (x + 0.5) m00 + (y + 0.5) m01 + m02 - focalX + ** = x m00 + y m01 + 0.5 m00 + 0.5 m01 + m02 - focalX + ** + ** = x m00 + y m01 + cx + ** + ** where + ** + ** cx := 0.5 m00 + 0.5 m01 + m02 - focalX + ** + ** The same way we can factor dy into + ** + ** dy = x m10 + y m11 + cy + ** + ** where + ** + ** cy := 0.5 m10 + 0.5 m11 + m12 - focalY. + ** + ** Now we can rewrite g as + ** ______________________________________ + ** dx fx + dy fy / r^2 (dx^2 + dy^2) - (dx fy - dy fx)^2 + ** g = ----------------- + \ / ------------------------------------- + ** r^2 - fx^2 - fy^2 \/ (r^2 - fx^2 - fy^2)^2 + ** ____ + ** = gLin + \/gRad + ** + ** where + ** + ** dx fx + dy fy + ** gLin := ----------------- + ** r^2 - fx^2 - fy^2 + ** + ** r^2 (dx^2 + dy^2) - (dx fy - dy fx)^2 + ** gRad := ------------------------------------- + ** (r^2 - fx^2 - fy^2)^2 + */ + + cx + = 0.5f * (MAT(&inverse_matrix, 0, 0) + MAT(&inverse_matrix, 0, 1)) + + MAT(&inverse_matrix, 0, 2) + - focalX; + + cy + = 0.5f * (MAT(&inverse_matrix, 1, 0) + MAT(&inverse_matrix, 1, 1)) + + MAT(&inverse_matrix, 1, 2) + - focalY; + + /* + ** dx fx + dy fy + ** gLin := ----------------- + ** r^2 - fx^2 - fy^2 + ** + ** We can factor the top half into + ** + ** = (x m00 + y m01 + cx) fx + (x m10 + y m11 + cy) fy + ** + ** = x (m00 fx + m10 fy) + ** + y (m01 fx + m11 fy) + ** + cx fx + cy fy. + */ + + rgStepXLin + = (MAT(&inverse_matrix, 0, 0) * fx + MAT(&inverse_matrix, 1, 0) * fy) + / r2_fx2_fy2; + + rgStepYLin + = (MAT(&inverse_matrix, 0, 1) * fx + MAT(&inverse_matrix, 1, 1) * fy) + / r2_fx2_fy2; + + rgConstantLin = (cx * fx + cy * fy) / r2_fx2_fy2; + + /* + ** r^2 (dx^2 + dy^2) - (dx fy - dy fx)^2 + ** gRad := ------------------------------------- + ** (r^2 - fx^2 - fy^2)^2 + ** + ** r^2 (dx^2 + dy^2) - dx^2 fy^2 - dy^2 fx^2 + 2 dx dy fx fy + ** := --------------------------------------------------------- + ** (r^2 - fx^2 - fy^2)^2 + ** + ** dx^2 (r^2 - fy^2) + dy^2 (r^2 - fx^2) + 2 dx dy fx fy + ** := ----------------------------------------------------- + ** (r^2 - fx^2 - fy^2)^2 + ** + ** First, lets factor dx^2 into + ** + ** dx^2 = (x m00 + y m01 + cx)^2 + ** = x^2 m00^2 + y^2 m01^2 + 2 x y m00 m01 + ** + 2 x m00 cx + 2 y m01 cx + cx^2 + ** + ** = x^2 (m00^2) + ** + y^2 (m01^2) + ** + x y (2 m00 m01) + ** + x (2 m00 cx) + ** + y (2 m01 cx) + ** + cx^2. + ** + ** The same can be done for dy^2: + ** + ** dy^2 = x^2 (m10^2) + ** + y^2 (m11^2) + ** + x y (2 m10 m11) + ** + x (2 m10 cy) + ** + y (2 m11 cy) + ** + cy^2. + ** + ** Let's also factor dx dy into + ** + ** dx dy = (x m00 + y m01 + cx) (x m10 + y m11 + cy) + ** = x^2 m00 m10 + y^2 m01 m11 + x y m00 m11 + x y m01 m10 + ** + x m00 cy + x m10 cx + y m01 cy + y m11 cx + cx cy + ** + ** = x^2 (m00 m10) + ** + y^2 (m01 m11) + ** + x y (m00 m11 + m01 m10) + ** + x (m00 cy + m10 cx) + ** + y (m01 cy + m11 cx) + ** + cx cy. + ** + ** Now that we have all this, lets look at the top of gRad. + ** + ** = dx^2 (r^2 - fy^2) + dy^2 (r^2 - fx^2) + 2 dx dy fx fy + ** = x^2 m00^2 (r^2 - fy^2) + y^2 m01^2 (r^2 - fy^2) + ** + x y 2 m00 m01 (r^2 - fy^2) + x 2 m00 cx (r^2 - fy^2) + ** + y 2 m01 cx (r^2 - fy^2) + cx^2 (r^2 - fy^2) + ** + x^2 m10^2 (r^2 - fx^2) + y^2 m11^2 (r^2 - fx^2) + ** + x y 2 m10 m11 (r^2 - fx^2) + x 2 m10 cy (r^2 - fx^2) + ** + y 2 m11 cy (r^2 - fx^2) + cy^2 (r^2 - fx^2) + ** + x^2 m00 m10 2 fx fy + y^2 m01 m11 2 fx fy + ** + x y (m00 m11 + m01 m10) 2 fx fy + ** + x (m00 cy + m10 cx) 2 fx fy + y (m01 cy + m11 cx) 2 fx fy + ** + cx cy 2 fx fy + ** + ** = x^2 ( m00^2 (r^2 - fy^2) + ** + m10^2 (r^2 - fx^2) + ** + m00 m10 2 fx fy + ** ) + ** + y^2 ( m01^2 (r^2 - fy^2) + ** + m11^2 (r^2 - fx^2) + ** + m01 m11 2 fx fy + ** ) + ** + x y ( 2 m00 m01 (r^2 - fy^2) + ** + 2 m10 m11 (r^2 - fx^2) + ** + (m00 m11 + m01 m10) 2 fx fy + ** ) + ** + x ( 2 m00 cx (r^2 - fy^2) + ** + 2 m10 cy (r^2 - fx^2) + ** + (m00 cy + m10 cx) 2 fx fy + ** ) + ** + y ( 2 m01 cx (r^2 - fy^2) + ** + 2 m11 cy (r^2 - fx^2) + ** + (m01 cy + m11 cx) 2 fx fy + ** ) + ** + cx^2 (r^2 - fy^2) + cy^2 (r^2 - fx^2) + cx cy 2 fx fy. + */ + + rgStepXXRad = + ( + MAT(&inverse_matrix, 0, 0) * MAT(&inverse_matrix, 0, 0) * r2_fy2 + + MAT(&inverse_matrix, 1, 0) * MAT(&inverse_matrix, 1, 0) * r2_fx2 + + MAT(&inverse_matrix, 0, 0) * MAT(&inverse_matrix, 1, 0) * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgStepYYRad = + ( + MAT(&inverse_matrix, 0, 1) * MAT(&inverse_matrix, 0, 1) * r2_fy2 + + MAT(&inverse_matrix, 1, 1) * MAT(&inverse_matrix, 1, 1) * r2_fx2 + + MAT(&inverse_matrix, 0, 1) * MAT(&inverse_matrix, 1, 1) * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgStepXYRad = + ( + MAT(&inverse_matrix, 0, 0) * MAT(&inverse_matrix, 0, 1) * r2_fy2_2 + + MAT(&inverse_matrix, 1, 0) * MAT(&inverse_matrix, 1, 1) * r2_fx2_2 + + ( + MAT(&inverse_matrix, 0, 0) * MAT(&inverse_matrix, 1, 1) + + MAT(&inverse_matrix, 0, 1) * MAT(&inverse_matrix, 1, 0) + ) + * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgStepXRad = + ( + MAT(&inverse_matrix, 0, 0) * cx * r2_fy2_2 + + MAT(&inverse_matrix, 1, 0) * cy * r2_fx2_2 + + ( + MAT(&inverse_matrix, 0, 0) * cy + + MAT(&inverse_matrix, 1, 0) * cx + ) + * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgStepYRad = + ( + MAT(&inverse_matrix, 0, 1) * cx * r2_fy2_2 + + MAT(&inverse_matrix, 1, 1) * cy * r2_fx2_2 + + ( + MAT(&inverse_matrix, 0, 1) * cy + + MAT(&inverse_matrix, 1, 1) * cx + ) + * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgConstantRad = + ( + cx * cx * r2_fy2 + + cy * cy * r2_fx2 + + cx * cy * fxfy_2 + ) + / r2_fx2_fy2sq; + + /* Setup the command buffer. */ + data = &rgConstantLin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A04, *(uint32_t *) data)); + data = &rgStepXLin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A06, *(uint32_t *) data)); + data = &rgStepYLin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A08, *(uint32_t *) data)); + data = &rgConstantRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A05, *(uint32_t *) data)); + data = &rgStepXRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A07, *(uint32_t *) data)); + data = &rgStepYRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A09, *(uint32_t *) data)); + data = &rgStepXXRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A03, *(uint32_t *) data)); + data = &rgStepYYRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0A, *(uint32_t *) data)); + data = &rgStepXYRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0B, *(uint32_t *) data)); + VG_LITE_RETURN_ERROR(set_interpolation_steps(target, source->width, source->height, matrix)); + + /* enable pre-multiplied in image unit */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A24, convert_source_format(source->format) | + filter_mode | rad_tile | conversion | src_premultiply_enable)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A26, paint_color)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A28, source->address)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2A, tiled_source)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2C, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2E, source->width)); + + /* Work on path states. */ + matrix = path_matrix; + + if(ts_is_fullscreen == 0) { + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[1], matrix); + point_min = point_max = temp; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[1], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + point_min.x = MAX(point_min.x, 0); + point_min.y = MAX(point_min.y, 0); + point_max.x = MIN(point_max.x, dst_align_width); + point_max.y = MIN(point_max.y, target->height); + + if(s_context.scissor_set) { + point_min.x = MAX(point_min.x, s_context.scissor[0]); + point_min.y = MAX(point_min.y, s_context.scissor[1]); + point_max.x = MIN(point_max.x, s_context.scissor[0] + s_context.scissor[2]); + point_max.y = MIN(point_max.y, s_context.scissor[1] + s_context.scissor[3]); + } + } + + /* Convert states into hardware values. */ + blend_mode = convert_blend(blend); + format = convert_path_format(path->format); + quality = convert_path_quality(path->quality); + tiling = (s_context.capabilities.cap.tiled == 2) ? 0x2000000 : 0; + fill = (fill_rule == VG_LITE_FILL_EVEN_ODD) ? 0x10 : 0; + tessellation_size = s_context.tessbuf.L2_size ? s_context.tessbuf.L2_size : s_context.tessbuf.L1_size; + + /* Setup the command buffer. */ + /* Program color register. */ + + /* enable pre-multiplied from VG to VGPE */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + 0x02000002 | s_context.capabilities.cap.tiled | in_premult | imageMode | blend_mode | transparency_mode | + s_context.enable_mask | s_context.scissor_enable | s_context.color_transform | s_context.matrix_enable)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000400 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3B, 0x3F800000)); /* Path tessellation SCALE. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3C, 0x00000000)); /* Path tessellation BIAS. */ + /* Program matrix. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A40, (void *) &matrix->m[0][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A41, (void *) &matrix->m[0][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A42, (void *) &matrix->m[0][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A43, (void *) &matrix->m[1][0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A44, (void *) &matrix->m[1][1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A45, (void *) &matrix->m[1][2])); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + if(path->path_changed != 0) { + if(path->uploaded.handle != NULL) { + free_memory.memory_handle = path->uploaded.handle; + vg_lite_kernel(VG_LITE_FREE, &free_memory); + path->uploaded.address = 0; + path->uploaded.memory = NULL; + path->uploaded.handle = NULL; + } + /* Allocate memory for the path data. */ + memory.bytes = 16 + VG_LITE_ALIGN(path->path_length, 8); + return_offset = (8 + VG_LITE_ALIGN(path->path_length, 8)) / 4; + memory.contiguous = 1; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &memory)); + ((uint64_t *) memory.memory)[(path->path_length + 7) / 8] = 0; + ((uint32_t *) memory.memory)[0] = VG_LITE_DATA((path->path_length + 7) / 8); + ((uint32_t *) memory.memory)[1] = 0; + memcpy((uint8_t *) memory.memory + 8, path->path, path->path_length); + ((uint32_t *) memory.memory)[return_offset] = VG_LITE_RETURN(); + ((uint32_t *) memory.memory)[return_offset + 1] = 0; + + path->uploaded.handle = memory.memory_handle; + path->uploaded.memory = memory.memory; + path->uploaded.address = memory.memory_gpu; + path->uploaded.bytes = memory.bytes; + path->path_changed = 0; + } + } + + /* Setup tessellation loop. */ + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO || + path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + for(y = point_min.y; y < point_max.y; y += height) { + for(x = point_min.x; x < point_max.x; x += width) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_stall(&s_context, 15)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A01, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + } + } + } + } + /* Setup tessellation loop. */ + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + for(y = point_min.y; y < point_max.y; y += height) { + for(x = point_min.x; x < point_max.x; x += width) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_stall(&s_context, 15)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A01, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + + if(VLM_PATH_STROKE_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->stroke->uploaded.address, path->stroke->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + } + } + } + } + + /* Finialize command buffer. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); + + return error; +} + +#else /* (CHIPID==0x355 || CHIPID==0x255) */ + +/* GC555 vg_lite_draw API implementation + */ +vg_lite_error_t vg_lite_draw(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_draw)(target, path, fill_rule, matrix, blend, color); +#endif + + uint32_t blend_mode; + uint32_t format, quality, tiling, fill; + uint32_t tessellation_size; + vg_lite_error_t error; + vg_lite_point_t point_min = { 0 }, point_max = { 0 }, temp = { 0 }; + int width, height; + uint8_t ts_is_fullscreen = 0; + uint32_t return_offset = 0; + vg_lite_kernel_free_t free_memory; + vg_lite_kernel_allocate_t memory; + float new_matrix[6]; + float scale, bias; + uint32_t tile_setting = 0; + uint32_t in_premult = 0; + uint32_t premul_flag = 0; +#if (!gcFEATURE_VG_PARALLEL_PATHS && gcFEATURE_VG_512_PARALLEL_PATHS) + uint32_t parallel_workpaths1 = 2; + uint32_t parallel_workpaths2 = 2; +#endif +#if (!gcFEATURE_VG_SPLIT_PATH || !gcFEATURE_VG_PARALLEL_PATHS || !gcFEATURE_VG_512_PARALLEL_PATHS) + int32_t y = 0; + uint32_t par_height = 0; + int32_t next_boundary = 0; +#endif + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_draw %p %p %d %p %d 0x%08X\n", target, path, fill_rule, matrix, blend, color); + VGLITE_LOG(" path_type %d, path_length %d, stroke_size %d\n", path->path_type, path->path_length, path->stroke_size); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_QUALITY_8X + if(path->quality == VG_LITE_UPPER) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT + if(target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_NEW_BLEND_MODE + if(blend == VG_LITE_BLEND_DARKEN || blend == VG_LITE_BLEND_LIGHTEN) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(!path || !path->path) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif /* gcFEATURE_VG_ERROR_CHECK */ + + if(!path->path_length) { + return VG_LITE_SUCCESS; + } + + if(!matrix) { + matrix = &identity_mtx; + } + +#if gcFEATURE_VG_GAMMA + set_gamma_dest_only(target, VGL_FALSE); +#endif +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_GLOBAL, 0xff)); + } +#endif + /*blend input into context*/ + s_context.blend_mode = blend; + + /* Adjust premultiply setting according to openvg condition */ + target->apply_premult = 0; + premul_flag = (s_context.blend_mode >= OPENVG_BLEND_SRC_OVER && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE) + || (s_context.blend_mode >= VG_LITE_BLEND_NORMAL_LVGL && s_context.blend_mode <= VG_LITE_BLEND_MULTIPLY_LVGL); + + if(target->premultiplied == 0 && premul_flag == 0) { + in_premult = 0x10000000; + target->apply_premult = 1; + } + else if((target->premultiplied == 1) || + (target->premultiplied == 0 && premul_flag == 1)) { + in_premult = 0x00000000; + } + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + + if((target->format == VG_LITE_YUYV || target->format == VG_LITE_YUY2 || target->format == VG_LITE_YUY2_TILED + || target->format == VG_LITE_AYUY2 || target->format == VG_LITE_AYUY2_TILED) + && path->quality != VG_LITE_LOW) { + path->quality = VG_LITE_LOW; + printf("If target is YUV group , the path qulity should use VG_LITE_LOW.\n"); + } + + width = target->width; + height = target->height; + if(s_context.scissor_set) { + width = s_context.scissor[2] - s_context.scissor[0]; + height = s_context.scissor[3] - s_context.scissor[1]; + } + if(width == 0 || height == 0) + return VG_LITE_NO_CONTEXT; + if((target->width <= width) && (target->height <= height) && (!s_context.scissor_set)) { + ts_is_fullscreen = 1; + point_min.x = 0; + point_min.y = 0; + point_max.x = target->width; + point_max.y = target->height; + } + + if(ts_is_fullscreen == 0) { + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[1], matrix); + point_min = point_max = temp; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[1], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + if(point_min.x < 0) point_min.x = 0; + if(point_min.y < 0) point_min.y = 0; + if(point_max.x > target->width) point_max.x = target->width; + if(point_max.y > target->height) point_max.y = target->height; + + if(s_context.scissor_set) { + point_min.x = MAX(point_min.x, s_context.scissor[0]); + point_min.y = MAX(point_min.y, s_context.scissor[1]); + point_max.x = MIN(point_max.x, s_context.scissor[2]); + point_max.y = MIN(point_max.y, s_context.scissor[3]); + } + } + + width = point_max.x - point_min.x; + height = point_max.y - point_min.y; + scale = 1.0f; + bias = 0.0f; + new_matrix[0] = matrix->m[0][0] * scale; + new_matrix[1] = matrix->m[0][1] * scale; + new_matrix[2] = (matrix->m[0][0] + matrix->m[0][1]) * bias + matrix->m[0][2]; + new_matrix[3] = matrix->m[1][0] * scale; + new_matrix[4] = matrix->m[1][1] * scale; + new_matrix[5] = (matrix->m[1][0] + matrix->m[1][1]) * bias + matrix->m[1][2]; + + /* Convert states into hardware values. */ + blend_mode = convert_blend(blend); + format = convert_path_format(path->format); + quality = convert_path_quality(path->quality); + tiling = (s_context.capabilities.cap.tiled == 2) ? 0x2000000 : 0; + fill = (fill_rule == VG_LITE_FILL_EVEN_ODD) ? 0x10 : 0; + tessellation_size = s_context.tessbuf.tessbuf_size; +#if gcFEATURE_VG_TESSELLATION_TILED_OUT + tile_setting = (target->tiled != VG_LITE_LINEAR) ? 0x40 : 0; +#endif + + /* Setup the command buffer. */ + /* Program color register. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + in_premult | s_context.capabilities.cap.tiled | blend_mode | tile_setting | s_context.enable_mask | + s_context.scissor_enable | s_context.color_transform | s_context.matrix_enable)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, color)); + /* Program tessellation control: for TS module. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000000 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3B, 0x3F800000)); /* Path tessellation SCALE. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3C, 0x00000000)); /* Path tessellation BIAS. */ + /* Program matrix. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A40, (void *)&new_matrix[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A41, (void *)&new_matrix[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A42, (void *)&new_matrix[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A43, (void *)&new_matrix[3])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A44, (void *)&new_matrix[4])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A45, (void *)&new_matrix[5])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0ACD, (void *)&matrix->m[0][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0ACE, (void *)&matrix->m[1][2])); + + /* DDRLess does not support uploading path data. */ + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + if(path->path_changed != 0) { + if(path->uploaded.handle != NULL) { + free_memory.memory_handle = path->uploaded.handle; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_FREE, &free_memory)); + path->uploaded.address = 0; + path->uploaded.memory = NULL; + path->uploaded.handle = NULL; + } + /* Allocate memory for the path data. */ + memory.bytes = 16 + VG_LITE_ALIGN(path->path_length, 8); + return_offset = (8 + VG_LITE_ALIGN(path->path_length, 8)) / 4; + memory.contiguous = 1; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &memory)); + ((uint64_t *)memory.memory)[(path->path_length + 7) / 8] = 0; + ((uint32_t *)memory.memory)[0] = VG_LITE_DATA((path->path_length + 7) / 8); + ((uint32_t *)memory.memory)[1] = 0; + memcpy((uint8_t *)memory.memory + 8, path->path, path->path_length); + ((uint32_t *)memory.memory)[return_offset] = VG_LITE_RETURN(); + ((uint32_t *)memory.memory)[return_offset + 1] = 0; + + path->uploaded.handle = memory.memory_handle; + path->uploaded.memory = memory.memory; + path->uploaded.address = memory.memory_gpu; + path->uploaded.bytes = memory.bytes; + path->path_changed = 0; + } + } + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + vglitemDUMP_BUFFER("path", (size_t)path->uploaded.address, (uint8_t *)(path->uploaded.memory), 0, path->uploaded.bytes); + } + +#if !DUMP_COMMAND_CAPTURE + vglitemDUMP("@[memory 0x%08X 0x%08X]", s_context.tessbuf.physical_addr, s_context.tessbuf.tessbuf_size); +#endif + + if(width + point_min.x > target->width) { + width = target->width - point_min.x; + } + +#if (!gcFEATURE_VG_SPLIT_PATH || !gcFEATURE_VG_PARALLEL_PATHS || !gcFEATURE_VG_512_PARALLEL_PATHS) + s_context.tessbuf.tess_w_h = width | (height << 16); + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO || + path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { +#if !gcFEATURE_VG_PARALLEL_PATHS + if(height <= 128) + parallel_workpaths1 = 4; + else + parallel_workpaths1 = height * 128 / 4096 - 1; + + if(parallel_workpaths1 > parallel_workpaths2) + parallel_workpaths1 = parallel_workpaths2; +#endif + for(y = point_min.y; y < point_max.y; y += par_height) { +#if !gcFEATURE_VG_512_PARALLEL_PATHS + next_boundary = (y + 512) & 0xfffffe00; +#elif (!gcFEATURE_VG_PARALLEL_PATHS && gcFEATURE_VG_SPLIT_PATH) + next_boundary = (y + 32) & 0xffffffe0; +#else + next_boundary = (y + 16) & 0xfffffff0; +#endif + par_height = ((next_boundary < point_max.y) ? next_boundary - y : (point_max.y - y)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + in_premult | s_context.capabilities.cap.tiled | blend_mode | tile_setting | s_context.enable_mask | + s_context.scissor_enable | s_context.color_transform | s_context.matrix_enable)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, color)); + /* Program tessellation control: for TS module. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000000 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (par_height << 16))); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00000101)); +#if !gcFEATURE_VG_PARALLEL_PATHS + s_context.path_counter++; + if(parallel_workpaths1 == s_context.path_counter) { + VG_LITE_RETURN_ERROR(push_stall(&s_context, 7)); + s_context.path_counter = 0; + } +#endif + } + } + } + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { +#if !gcFEATURE_VG_PARALLEL_PATHS + if(height <= 128) + parallel_workpaths1 = 4; + else + parallel_workpaths1 = height * 128 / 4096 - 1; + + if(parallel_workpaths1 > parallel_workpaths2) + parallel_workpaths1 = parallel_workpaths2; +#endif + for(y = point_min.y; y < point_max.y; y += par_height) { +#if !gcFEATURE_VG_512_PARALLEL_PATHS + next_boundary = (y + 512) & 0xfffffe00; +#elif (!gcFEATURE_VG_PARALLEL_PATHS && gcFEATURE_VG_SPLIT_PATH) + next_boundary = (y + 32) & 0xffffffe0; +#else + next_boundary = (y + 16) & 0xfffffff0; +#endif + par_height = ((next_boundary < point_max.y) ? next_boundary - y : (point_max.y - y)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + in_premult | s_context.capabilities.cap.tiled | blend_mode | tile_setting | s_context.enable_mask | + s_context.scissor_enable | s_context.color_transform | s_context.matrix_enable)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (y << 16))); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (par_height << 16))); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00000101)); +#if !gcFEATURE_VG_PARALLEL_PATHS + s_context.path_counter++; + if(parallel_workpaths1 == s_context.path_counter) { + VG_LITE_RETURN_ERROR(push_stall(&s_context, 7)); + s_context.path_counter = 0; + } +#endif + } + } + } +#else + { + s_context.tessbuf.tess_w_h = width | (height << 16); + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO || + path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (point_min.y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, s_context.tessbuf.tess_w_h)); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + } + } + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + /* Tessellate path. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (point_min.y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, s_context.tessbuf.tess_w_h)); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + } + } + } +#endif +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_NORMAL, 0xFF)); + } +#endif + return error; +} + +/* GC555 vg_lite_draw_pattern API implementation + */ +vg_lite_error_t vg_lite_draw_pattern(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_buffer_t * source, + vg_lite_matrix_t * pattern_matrix, + vg_lite_blend_t blend, + vg_lite_pattern_mode_t pattern_mode, + vg_lite_color_t pattern_color, + vg_lite_color_t color, + vg_lite_filter_t filter) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_draw_pattern)(target, path, fill_rule, path_matrix, source, pattern_matrix, blend, pattern_mode, + pattern_color, color, filter); +#endif + +#if gcFEATURE_VG_IM_INPUT + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_matrix_t inverse_matrix; + vg_lite_float_t x_step[3]; + vg_lite_float_t y_step[3]; + vg_lite_float_t c_step[3]; + uint32_t imageMode = 0; + uint32_t blend_mode; + uint32_t filter_mode = 0; + int32_t stride; + uint32_t conversion = 0; + uint32_t tiled_source; + vg_lite_matrix_t matrix; + uint32_t pattern_tile = 0; + uint32_t transparency_mode = 0; + uint32_t tile_setting = 0; + uint32_t yuv2rgb = 0; + uint32_t uv_swiz = 0; + /* The following code is from "draw path" */ + uint32_t format, quality, tiling, fill; + uint32_t tessellation_size; + + vg_lite_kernel_allocate_t memory; + vg_lite_kernel_free_t free_memory; + uint32_t return_offset = 0; + + vg_lite_point_t point_min = { 0 }, point_max = { 0 }, temp = { 0 }; + int width, height; + uint8_t ts_is_fullscreen = 0; + + float new_matrix[6]; + float Scale, Bias; + + uint32_t compress_mode; + uint32_t src_premultiply_enable = 0; + uint32_t index_endian = 0; + uint32_t in_premult = 0; + uint32_t paintType = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; + uint8_t lvgl_sw_blend = 0; +#if (!gcFEATURE_VG_PARALLEL_PATHS && gcFEATURE_VG_512_PARALLEL_PATHS) + uint32_t parallel_workpaths1 = 2; + uint32_t parallel_workpaths2 = 2; +#endif +#if (!gcFEATURE_VG_SPLIT_PATH || !gcFEATURE_VG_PARALLEL_PATHS || !gcFEATURE_VG_512_PARALLEL_PATHS) + int32_t y = 0; + uint32_t par_height = 0; + int32_t next_boundary = 0; +#endif + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_draw_pattern %p %p %d %p %p %p %d %d 0x%08X %d\n", + target, path, fill_rule, path_matrix, source, pattern_matrix, blend, pattern_mode, pattern_color, filter); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_QUALITY_8X + if(path->quality == VG_LITE_UPPER) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_INDEX_ENDIAN + if((source->format >= VG_LITE_INDEX_1) && (source->format <= VG_LITE_INDEX_4) && source->index_endian) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_RGBA8_ETC2_EAC + if(source->format == VG_LITE_RGBA8888_ETC2_EAC) { + return VG_LITE_NOT_SUPPORT; + } +#else + if((source->format == VG_LITE_RGBA8888_ETC2_EAC) && (source->width % 16 || source->height % 4)) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif +#if !gcFEATURE_VG_YUY2_INPUT + if(source->format == VG_LITE_YUYV || source->format == VG_LITE_YUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_INPUT + if((source->format >= VG_LITE_NV12 && source->format <= VG_LITE_NV16) || source->format == VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#elif !gcFEATURE_VG_NV24_INPUT + if(source->format == VG_LITE_NV24) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_AYUV_INPUT + if(source->format == VG_LITE_ANV12 || source->format == VG_LITE_AYUY2) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_YUV_TILED_INPUT + if((source->format >= VG_LITE_YUY2_TILED && source->format <= VG_LITE_AYUY2_TILED) || + (source->format == VG_LITE_NV24_TILED)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT + if((target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) || + (source->format >= VG_LITE_RGB888 && source->format <= VG_LITE_RGBA5658)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT_PLANAR + if(source->format >= VG_LITE_ABGR8565_PLANAR && source->format <= VG_LITE_RGBA5658_PLANAR) { + return VG_LITE_NOT_SUPPORT; + } +#endif + +#if !gcFEATURE_VG_STENCIL + if(source->image_mode == VG_LITE_STENCIL_MODE) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_NEW_BLEND_MODE + if(blend == VG_LITE_BLEND_DARKEN || blend == VG_LITE_BLEND_LIGHTEN) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(!path || !path->path) { + return VG_LITE_INVALID_ARGUMENT; + } + + VG_LITE_RETURN_ERROR(srcbuf_align_check(source)); + VG_LITE_RETURN_ERROR(check_compress(source->format, source->compress_mode, source->tiled, source->width, + source->height)); +#endif /* gcFEATURE_VG_ERROR_CHECK */ + +#if !gcFEATURE_VG_LVGL_SUPPORT + if((blend >= VG_LITE_BLEND_ADDITIVE_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) || + (blend == VG_LITE_BLEND_NORMAL_LVGL && gcFEATURE_VG_SRC_PREMULTIPLIED)) { + if(!source->lvgl_buffer) { + source->lvgl_buffer = (vg_lite_buffer_t *)vg_lite_os_malloc(sizeof(vg_lite_buffer_t)); + *source->lvgl_buffer = *source; + source->lvgl_buffer->lvgl_buffer = NULL; + vg_lite_allocate(source->lvgl_buffer); + } + /* Make sure render target is up to date before reading RT. */ + vg_lite_finish(); + setup_lvgl_image(target, source, source->lvgl_buffer, blend); + blend = VG_LITE_BLEND_SRC_OVER; + lvgl_sw_blend = 1; + } +#endif + + if(!path->path_length) { + return VG_LITE_SUCCESS; + } + + if(!path_matrix) { + path_matrix = &identity_mtx; + } + if(!pattern_matrix) { + pattern_matrix = &identity_mtx; + } + + /* Work on pattern states. */ + matrix = *pattern_matrix; + if(source->paintType == VG_LITE_PAINT_PATTERN) { + matrix.m[2][0] = 0; + matrix.m[2][1] = 0; + matrix.m[2][2] = 1; + source->image_mode = VG_LITE_NONE_IMAGE_MODE; + } + +#if gcFEATURE_VG_INDEX_ENDIAN + if((source->format >= VG_LITE_INDEX_1) && (source->format <= VG_LITE_INDEX_4) && source->index_endian) { + index_endian = 1 << 14; + } +#endif + +#if gcFEATURE_VG_GAMMA + save_st_gamma_src_dest(source, target); +#endif + +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_GLOBAL, 0xff)); + } +#endif + /*blend input into context*/ + s_context.blend_mode = blend; + in_premult = 0x00000000; + + /* Adjust premultiply setting according to openvg condition */ + src_premultiply_enable = 0x01000100; + if(s_context.color_transform == 0 && s_context.gamma_dst == s_context.gamma_src && s_context.matrix_enable == 0 && + s_context.dst_alpha_mode == 0 && s_context.src_alpha_mode == 0 && + (source->image_mode == VG_LITE_NORMAL_IMAGE_MODE || source->image_mode == 0)) { + prediv_flag = 0; + } + else { + prediv_flag = 1; + } + if((s_context.blend_mode >= OPENVG_BLEND_SRC_OVER && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE) || + source->image_mode == VG_LITE_STENCIL_MODE + || (s_context.blend_mode >= VG_LITE_BLEND_NORMAL_LVGL && s_context.blend_mode <= VG_LITE_BLEND_MULTIPLY_LVGL)) { + premul_flag = 1; + } + else { + premul_flag = 0; + } + + if((source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 0) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 0)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + /* when src and dst all pre format, im pre_out set to 0 to perform data truncation to prevent data overflow */ + else if(source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 0) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 0 && target->premultiplied == 1) || + (source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 1)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 1) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 1)) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + if((source->format == VG_LITE_A4 || source->format == VG_LITE_A8) && blend >= VG_LITE_BLEND_SRC_OVER && + blend <= VG_LITE_BLEND_SUBTRACT) { + in_premult = 0x00000000; + } + if(source->premultiplied == target->premultiplied && premul_flag == 0) { + target->apply_premult = 1; + } + else { + target->apply_premult = 0; + } +#if (gcFEATURE_VG_SRC_PREMULTIPLIED == 0) + if(blend == VG_LITE_BLEND_NORMAL_LVGL) + in_premult = 0x00000000; +#endif + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + + if((target->format == VG_LITE_YUYV || target->format == VG_LITE_YUY2 || target->format == VG_LITE_YUY2_TILED + || target->format == VG_LITE_AYUY2 || target->format == VG_LITE_AYUY2_TILED) + && path->quality != VG_LITE_LOW) { + path->quality = VG_LITE_LOW; + printf("If target is YUV group , the path qulity should use VG_LITE_LOW.\n"); + } + + transparency_mode = (source->transparency_mode == VG_LITE_IMAGE_TRANSPARENT ? 0x8000 : 0); + width = target->width; + height = target->height; + + if(s_context.scissor_set) { + width = s_context.scissor[2] - s_context.scissor[0]; + height = s_context.scissor[3] - s_context.scissor[1]; + } + if(width == 0 || height == 0) + return VG_LITE_NO_CONTEXT; + if((target->width <= width) && (target->height <= height) && (!s_context.scissor_set)) { + ts_is_fullscreen = 1; + point_min.x = 0; + point_min.y = 0; + point_max.x = target->width; + point_max.y = target->height; + } + + /* If target is L8 and source is in YUV or RGB (not L8 or A8) then we have to convert RGB into L8. */ + if((target->format == VG_LITE_L8) && ((source->format != VG_LITE_L8) && (source->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, &matrix)) + return VG_LITE_INVALID_ARGUMENT; + +#if gcFEATURE_VG_MATH_PRECISION_FIX + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0]; + x_step[1] = inverse_matrix.m[1][0]; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1]; + y_step[1] = inverse_matrix.m[1][1]; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; +#else + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0] / source->width; + x_step[1] = inverse_matrix.m[1][0] / source->height; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1] / source->width; + y_step[1] = inverse_matrix.m[1][1] / source->height; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]) / source->width; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / source->height; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; +#endif + + /* Determine image mode (NORMAL, NONE , MULTIPLY or STENCIL) depending on the color. */ + switch(source->image_mode) { + case VG_LITE_NONE_IMAGE_MODE: + imageMode = 0x0; + break; + + case VG_LITE_MULTIPLY_IMAGE_MODE: + imageMode = 0x00002000; + break; + + case VG_LITE_NORMAL_IMAGE_MODE: + case VG_LITE_ZERO: + imageMode = 0x00001000; + break; + + case VG_LITE_STENCIL_MODE: + imageMode = 0x00003000; + break; + + case VG_LITE_RECOLOR_MODE: + imageMode = 0x00006000; + break; + } + + switch(filter) { + case VG_LITE_FILTER_POINT: + filter_mode = 0; + break; + + case VG_LITE_FILTER_LINEAR: + filter_mode = 0x10000; + break; + + case VG_LITE_FILTER_BI_LINEAR: + filter_mode = 0x20000; + break; + + case VG_LITE_FILTER_GAUSSIAN: + filter_mode = 0x30000; + break; + } + + tiled_source = (source->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0 ; + compress_mode = (uint32_t)source->compress_mode << 25; + + if(pattern_mode == VG_LITE_PATTERN_COLOR) { + uint8_t a, r, g, b; + pattern_tile = 0; + a = pattern_color >> 24; + r = pattern_color >> 16; + g = pattern_color >> 8; + b = pattern_color; + pattern_color = (a << 24) | (b << 16) | (g << 8) | r; + } + else if(pattern_mode == VG_LITE_PATTERN_PAD) { + pattern_tile = 0x1000; + } +#if gcFEATURE_VG_IM_REPEAT_REFLECT + else if(pattern_mode == VG_LITE_PATTERN_REPEAT) { + pattern_tile = 0x2000; + } + else if(pattern_mode == VG_LITE_PATTERN_REFLECT) { + pattern_tile = 0x3000; + } +#endif + else { + return VG_LITE_INVALID_ARGUMENT; + } + + if(source->paintType == VG_LITE_PAINT_PATTERN) { + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A04, (void *) &c_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A05, (void *) &c_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A06, (void *) &x_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A07, (void *) &x_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A08, (void *) &y_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A09, (void *) &y_step[1])); + } + + /* Setup the command buffer. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A18, (void *) &c_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A19, (void *) &c_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1A, (void *) &c_step[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1C, (void *) &x_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1D, (void *) &x_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1E, (void *) &x_step[2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A20, (void *) &y_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A21, (void *) &y_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A22, (void *) &y_step[2])); + + if(((source->format >= VG_LITE_YUY2) && + (source->format <= VG_LITE_AYUY2)) || + ((source->format >= VG_LITE_YUY2_TILED) && + (source->format <= VG_LITE_AYUY2_TILED))) { + yuv2rgb = convert_yuv2rgb(source->yuv.yuv2rgb); + uv_swiz = convert_uv_swizzle(source->yuv.swizzle); + } + blend_mode = convert_blend(blend); + + if(source->paintType == VG_LITE_PAINT_PATTERN) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A24, + convert_source_format(source->format) | filter_mode | pattern_tile | uv_swiz | yuv2rgb | conversion | compress_mode | + src_premultiply_enable | index_endian)); + + if(source->yuv.uv_planar) { + /* Program u plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A50, source->yuv.uv_planar)); + } + if(source->yuv.v_planar) { + /* Program v plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A52, source->yuv.v_planar)); + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A26, pattern_color)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A28, source->address)); + /* 24bit format stride configured to 4bpp. */ + if(source->format >= VG_LITE_RGB888 && source->format <= VG_LITE_RGBA5658) { + stride = source->stride / 3 * 4; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2A, stride | tiled_source)); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2A, source->stride | tiled_source)); + } + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2C, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2E, source->width | (source->height << 16))); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A25, + convert_source_format(source->format) | filter_mode | pattern_tile | uv_swiz | yuv2rgb | conversion | compress_mode | + src_premultiply_enable | index_endian)); + + if(source->yuv.uv_planar) { + /* Program u plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A51, source->yuv.uv_planar)); + } + if(source->yuv.v_planar) { + /* Program v plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source->yuv.v_planar)); + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A27, pattern_color)); + +#if !gcFEATURE_VG_LVGL_SUPPORT + if(lvgl_sw_blend) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source->lvgl_buffer->address)); + } + else +#endif + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A29, source->address)); + + /* 24bit format stride configured to 4bpp. */ + if(source->format >= VG_LITE_RGB888 && source->format <= VG_LITE_RGBA5658) { + stride = source->stride / 3 * 4; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, stride | tiled_source)); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2B, source->stride | tiled_source)); + } + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2D, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2F, source->width | (source->height << 16))); + } + + /* Work on path states. */ + matrix = *path_matrix; + + if(ts_is_fullscreen == 0) { + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[1], &matrix); + point_min = point_max = temp; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[1], &matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[3], &matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[3], &matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + point_min.x = MAX(point_min.x, 0); + point_min.y = MAX(point_min.y, 0); + point_max.x = MIN(point_max.x, target->width); + point_max.y = MIN(point_max.y, target->height); + + if(s_context.scissor_set) { + point_min.x = MAX(point_min.x, s_context.scissor[0]); + point_min.y = MAX(point_min.y, s_context.scissor[1]); + point_max.x = MIN(point_max.x, s_context.scissor[2]); + point_max.y = MIN(point_max.y, s_context.scissor[3]); + } + } + + width = point_max.x - point_min.x; + height = point_max.y - point_min.y; + Scale = 1.0f; + Bias = 0.0f; + new_matrix[0] = matrix.m[0][0] * Scale; + new_matrix[1] = matrix.m[0][1] * Scale; + new_matrix[2] = (matrix.m[0][0] + matrix.m[0][1]) * Bias + matrix.m[0][2]; + new_matrix[3] = matrix.m[1][0] * Scale; + new_matrix[4] = matrix.m[1][1] * Scale; + new_matrix[5] = (matrix.m[1][0] + matrix.m[1][1]) * Bias + matrix.m[1][2]; + + /* Convert states into hardware values. */ + format = convert_path_format(path->format); + quality = convert_path_quality(path->quality); + tiling = (s_context.capabilities.cap.tiled == 2) ? 0x2000000 : 0; + fill = (fill_rule == VG_LITE_FILL_EVEN_ODD) ? 0x10 : 0; + tessellation_size = s_context.tessbuf.tessbuf_size; +#if gcFEATURE_VG_TESSELLATION_TILED_OUT + tile_setting = (target->tiled != VG_LITE_LINEAR) ? 0x40 : 0; +#endif + + if(source->paintType == VG_LITE_PAINT_PATTERN) { + paintType = 1 << 24 | 1 << 25; + } + + /* Setup the command buffer. */ +#if gcFEATURE_VG_GLOBAL_ALPHA + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0AD1, + s_context.dst_alpha_mode | s_context.dst_alpha_value | s_context.src_alpha_mode | s_context.src_alpha_value)); +#endif + /* Program color register. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + in_premult | paintType | s_context.capabilities.cap.tiled | imageMode | blend_mode | transparency_mode | tile_setting | + s_context.enable_mask | s_context.scissor_enable | s_context.color_transform | s_context.matrix_enable | 0x2)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000000 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3B, 0x3F800000)); /* Path tessellation SCALE. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3C, 0x00000000)); /* Path tessellation BIAS. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, color)); + /* Program matrix. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A40, (void *) &new_matrix[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A41, (void *) &new_matrix[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A42, (void *) &new_matrix[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A43, (void *) &new_matrix[3])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A44, (void *) &new_matrix[4])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A45, (void *) &new_matrix[5])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0ACD, (void *) &matrix.m[0][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0ACE, (void *) &matrix.m[1][2])); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + if(path->path_changed != 0) { + if(path->uploaded.handle != NULL) { + free_memory.memory_handle = path->uploaded.handle; + vg_lite_kernel(VG_LITE_FREE, &free_memory); + path->uploaded.address = 0; + path->uploaded.memory = NULL; + path->uploaded.handle = NULL; + } + /* Allocate memory for the path data. */ + memory.bytes = 16 + VG_LITE_ALIGN(path->path_length, 8); + return_offset = (8 + VG_LITE_ALIGN(path->path_length, 8)) / 4; + memory.contiguous = 1; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &memory)); + ((uint64_t *) memory.memory)[(path->path_length + 7) / 8] = 0; + ((uint32_t *) memory.memory)[0] = VG_LITE_DATA((path->path_length + 7) / 8); + ((uint32_t *) memory.memory)[1] = 0; + memcpy((uint8_t *) memory.memory + 8, path->path, path->path_length); + ((uint32_t *) memory.memory)[return_offset] = VG_LITE_RETURN(); + ((uint32_t *) memory.memory)[return_offset + 1] = 0; + + path->uploaded.handle = memory.memory_handle; + path->uploaded.memory = memory.memory; + path->uploaded.address = memory.memory_gpu; + path->uploaded.bytes = memory.bytes; + path->path_changed = 0; + } + } + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + vglitemDUMP_BUFFER("path", (size_t)path->uploaded.address, (uint8_t *)(path->uploaded.memory), 0, path->uploaded.bytes); + } + +#if !DUMP_COMMAND_CAPTURE + vglitemDUMP("@[memory 0x%08X 0x%08X]", s_context.tessbuf.physical_addr, s_context.tessbuf.tessbuf_size); +#endif + + if(width + point_min.x > target->width) { + width = target->width - point_min.x; + } + +#if (!gcFEATURE_VG_SPLIT_PATH || !gcFEATURE_VG_PARALLEL_PATHS || !gcFEATURE_VG_512_PARALLEL_PATHS) + s_context.tessbuf.tess_w_h = width | (height << 16); + +#if !gcFEATURE_VG_PARALLEL_PATHS + if(height <= 128) + parallel_workpaths1 = 4; + else + parallel_workpaths1 = height * 128 / 4096 - 1; + + if(parallel_workpaths1 > parallel_workpaths2) + parallel_workpaths1 = parallel_workpaths2; +#endif + for(y = point_min.y; y < point_max.y; y += par_height) { +#if !gcFEATURE_VG_512_PARALLEL_PATHS + next_boundary = (y + 512) & 0xfffffe00; +#elif (!gcFEATURE_VG_PARALLEL_PATHS && gcFEATURE_VG_SPLIT_PATH) + next_boundary = (y + 32) & 0xffffffe0; +#else + next_boundary = (y + 16) & 0xfffffff0; +#endif + par_height = ((next_boundary < point_max.y) ? next_boundary - y : (point_max.y - y)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + in_premult | paintType | s_context.capabilities.cap.tiled | imageMode | blend_mode | transparency_mode | tile_setting | + s_context.enable_mask | s_context.scissor_enable | s_context.color_transform | s_context.matrix_enable | 0x2)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000000 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, color));; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (par_height << 16))); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO) + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + } +#if !gcFEATURE_VG_PARALLEL_PATHS + s_context.path_counter++; + if(parallel_workpaths1 == s_context.path_counter) { + VG_LITE_RETURN_ERROR(push_stall(&s_context, 7)); + s_context.path_counter = 0; + } +#endif + } + } +#else + { + /* Tessellate path. */ + s_context.tessbuf.tess_w_h = width | (height << 16); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (point_min.y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, s_context.tessbuf.tess_w_h)); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO) + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + } + } + } +#endif +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_NORMAL, 0xFF)); + } +#endif + vglitemDUMP_BUFFER("image", (size_t)source->address, source->memory, 0, (source->stride) * (source->height)); +#if DUMP_IMAGE + dump_img(source->memory, source->width, source->height, source->format); +#endif + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +/* GC555 vg_lite_draw_linear_grad API implementation + */ +vg_lite_error_t vg_lite_draw_linear_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_ext_linear_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_draw_linear_grad)(target, path, fill_rule, path_matrix, grad, paint_color, blend, filter); +#endif + +#if gcFEATURE_VG_LINEAR_GRADIENT_EXT && gcFEATURE_VG_IM_INPUT + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t image_mode = 0; + uint32_t blend_mode; + uint32_t filter_mode = 0; + uint32_t conversion = 0; + uint32_t tiled_source; + vg_lite_matrix_t inverse_matrix; + vg_lite_float_t x_step[3]; + vg_lite_float_t y_step[3]; + vg_lite_float_t c_step[3]; + vg_lite_buffer_t * source = &grad->image; + vg_lite_matrix_t * matrix = &grad->matrix; + uint32_t linear_tile = 0; + uint32_t transparency_mode = 0; + uint32_t yuv2rgb = 0; + uint32_t uv_swiz = 0; + uint32_t in_premult = 0; + uint32_t src_premultiply_enable = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; + void * data; + + /* The following code is from "draw path" */ + uint32_t format, quality, tiling, fill; + uint32_t tessellation_size; + + vg_lite_kernel_allocate_t memory; + vg_lite_kernel_free_t free_memory; + uint32_t return_offset = 0; + + vg_lite_point_t point_min = { 0 }, point_max = { 0 }, temp = { 0 }; + int width, height; + uint8_t ts_is_fullscreen = 0; + float new_matrix[6]; + float Scale, Bias; + + vg_lite_float_t dx, dy, dxdx_dydy; + vg_lite_float_t lg_step_x_lin, lg_step_y_lin, lg_constant_lin; + +#if !gcFEATURE_VG_PARALLEL_PATHS + uint32_t parallel_workpaths1 = 2; + uint32_t parallel_workpaths2 = 2; + +#endif + + int y; + int temp_height = 0; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_draw_linear_grad %p %p %d %p %p 0x%08X %d %d\n", + target, path, fill_rule, path_matrix, grad, paint_color, blend, filter); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_QUALITY_8X + if(path->quality == VG_LITE_UPPER) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_LVGL_SUPPORT + if((blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT + if(target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) { + return VG_LITE_NOT_SUPPORT; + } +#endif + +#if !gcFEATURE_VG_STENCIL + if(source->image_mode == VG_LITE_STENCIL_MODE) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_NEW_BLEND_MODE + if(blend == VG_LITE_BLEND_DARKEN || blend == VG_LITE_BLEND_LIGHTEN) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_IM_REPEAT_REFLECT + if(grad->spread_mode == VG_LITE_GRADIENT_SPREAD_REPEAT || grad->spread_mode == VG_LITE_GRADIENT_SPREAD_REFLECT) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(source->format == VG_LITE_A4 || source->format == VG_LITE_A8) { + return VG_LITE_NOT_SUPPORT; + } + if(!path || !path->path) { + return VG_LITE_INVALID_ARGUMENT; + } +#endif /* gcFEATURE_VG_ERROR_CHECK */ + + if(!path->path_length) { + return VG_LITE_SUCCESS; + } + + if(!path_matrix) { + path_matrix = &identity_mtx; + } + +#if gcFEATURE_VG_GAMMA + set_gamma_dest_only(target, VGL_TRUE); +#endif +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_GLOBAL, 0xff)); + } +#endif + /*blend input into context*/ + s_context.blend_mode = blend; + + src_premultiply_enable = 0x01000100; + if(s_context.color_transform == 0 && s_context.gamma_dst == s_context.gamma_src && s_context.matrix_enable == 0 && + s_context.dst_alpha_mode == 0 && s_context.src_alpha_mode == 0 && + (source->image_mode == VG_LITE_NORMAL_IMAGE_MODE || source->image_mode == 0)) { + prediv_flag = 0; + } + else { + prediv_flag = 1; + } + if((s_context.blend_mode >= OPENVG_BLEND_SRC_OVER && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE) || + source->image_mode == VG_LITE_STENCIL_MODE + || (s_context.blend_mode >= VG_LITE_BLEND_NORMAL_LVGL && s_context.blend_mode <= VG_LITE_BLEND_MULTIPLY_LVGL)) { + premul_flag = 1; + } + else { + premul_flag = 0; + } + + if((source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 0) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 0)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + /* when src and dst all pre format, im pre_out set to 0 to perform data truncation to prevent data overflow */ + else if(source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 0) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 0 && target->premultiplied == 1) || + (source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 1)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 1) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 1)) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + if((source->format == VG_LITE_A4 || source->format == VG_LITE_A8) && blend >= VG_LITE_BLEND_SRC_OVER && + blend <= VG_LITE_BLEND_SUBTRACT) { +#if (CHIPID==0x255) + src_premultiply_enable = 0x00000000; +#endif + in_premult = 0x00000000; + } + if(source->premultiplied == target->premultiplied && premul_flag == 0) { + target->apply_premult = 1; + } + else { + target->apply_premult = 0; + } + + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + else if(error == VG_LITE_NO_CONTEXT) { + /* If scissoring is enabled and no valid scissoring rectangles + are present, no drawing occurs */ + return VG_LITE_SUCCESS; + } + + transparency_mode = (source->transparency_mode == VG_LITE_IMAGE_TRANSPARENT ? 0x8000 : 0); + width = s_context.tessbuf.tess_w_h & 0xFFFF; + height = s_context.tessbuf.tess_w_h >> 16; + + if(width == 0 || height == 0) + return VG_LITE_NO_CONTEXT; + if((target->width <= width) && (target->height <= height) && (!s_context.scissor_set)) { + ts_is_fullscreen = 1; + point_min.x = 0; + point_min.y = 0; + point_max.x = target->width; + point_max.y = target->height; + } + + /* If target is L8 and source is in YUV or RGB (not L8 or A8) then we have to convert RGB into L8. */ + if((target->format == VG_LITE_L8) && ((source->format != VG_LITE_L8) && (source->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + + /* Determine image mode (NORMAL, NONE , MULTIPLY or STENCIL) depending on the color. */ + switch(source->image_mode) { + case VG_LITE_NONE_IMAGE_MODE: + image_mode = 0x0; + break; + + case VG_LITE_MULTIPLY_IMAGE_MODE: + return VG_LITE_INVALID_ARGUMENT; + + case VG_LITE_NORMAL_IMAGE_MODE: + case VG_LITE_ZERO: + image_mode = 0x00001000; + break; + + case VG_LITE_STENCIL_MODE: + image_mode = 0x00003000; + break; + + case VG_LITE_RECOLOR_MODE: + image_mode = 0x00006000; + break; + } + tiled_source = (source->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0 ; + + switch(grad->spread_mode) { + case VG_LITE_GRADIENT_SPREAD_FILL: + linear_tile = 0x0; + break; + + case VG_LITE_GRADIENT_SPREAD_PAD: + linear_tile = 0x1000; + break; + + case VG_LITE_GRADIENT_SPREAD_REPEAT: + linear_tile = 0x2000; + break; + + case VG_LITE_GRADIENT_SPREAD_REFLECT: + linear_tile = 0x3000; + break; + } + + switch(filter) { + case VG_LITE_FILTER_POINT: + filter_mode = 0; + break; + + case VG_LITE_FILTER_LINEAR: + filter_mode = 0x10000; + break; + + case VG_LITE_FILTER_BI_LINEAR: + filter_mode = 0x20000; + break; + + case VG_LITE_FILTER_GAUSSIAN: + filter_mode = 0x30000; + break; + } + + if(grad->spread_mode == VG_LITE_GRADIENT_SPREAD_FILL) { + uint8_t a, r, g, b; + a = paint_color >> 24; + r = paint_color >> 16; + g = paint_color >> 8; + b = paint_color; + paint_color = (a << 24) | (b << 16) | (g << 8) | r; + } + + /* compute linear gradient paremeters */ + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + dx = grad->linear_grad.X1 - grad->linear_grad.X0; + dy = grad->linear_grad.Y1 - grad->linear_grad.Y0; +#if gcFEATURE_VG_MATH_PRECISION_FIX + dxdx_dydy = (vg_lite_float_t)((dx * dx + dy * dy) / sqrt((dx + 1) * (dx + 1) + (dy + 1) * (dy + 1))); +#else + dxdx_dydy = dx * dx + dy * dy; +#endif + + /* + ** dx (T(x) - x0) + dy (T(y) - y0) + ** g = ------------------------------- + ** dx^2 + dy^2 + ** + ** where + ** + ** dx := x1 - x0 + ** dy := y1 - y0 + ** T(x) := (x + 0.5) m00 + (y + 0.5) m01 + m02 + ** = x m00 + y m01 + 0.5 (m00 + m01) + m02 + ** T(y) := (x + 0.5) m10 + (y + 0.5) m11 + m12 + ** = x m10 + y m11 + 0.5 (m10 + m11) + m12. + ** + ** We can factor the top line into: + ** + ** = dx (x m00 + y m01 + 0.5 (m00 + m01) + m02 - x0) + ** + dy (x m10 + y m11 + 0.5 (m10 + m11) + m12 - y0) + ** + ** = x (dx m00 + dy m10) + ** + y (dx m01 + dy m11) + ** + dx (0.5 (m00 + m01) + m02 - x0) + ** + dy (0.5 (m10 + m11) + m12 - y0). + */ + + lg_step_x_lin + = (dx * MAT(&inverse_matrix, 0, 0) + dy * MAT(&inverse_matrix, 1, 0)) + / dxdx_dydy; + + lg_step_y_lin + = (dx * MAT(&inverse_matrix, 0, 1) + dy * MAT(&inverse_matrix, 1, 1)) + / dxdx_dydy; + + lg_constant_lin = + ( + ( + 0.5f * (MAT(&inverse_matrix, 0, 0) + MAT(&inverse_matrix, 0, 1)) + + MAT(&inverse_matrix, 0, 2) - grad->linear_grad.X0 + ) * dx + + + + + ( + 0.5f * (MAT(&inverse_matrix, 1, 0) + MAT(&inverse_matrix, 1, 1)) + + MAT(&inverse_matrix, 1, 2) - grad->linear_grad.Y0 + ) * dy + ) + / dxdx_dydy; + + /* Setup the command buffer. */ + + /* linear gradient parameters*/ + data = &lg_constant_lin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A04, *(uint32_t *) data)); + data = &lg_step_x_lin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A06, *(uint32_t *) data)); + data = &lg_step_y_lin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A08, *(uint32_t *) data)); + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix)) + return VG_LITE_INVALID_ARGUMENT; + +#if gcFEATURE_VG_MATH_PRECISION_FIX + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0]; + x_step[1] = inverse_matrix.m[1][0]; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1]; + y_step[1] = inverse_matrix.m[1][1]; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; +#else + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0] / source->width; + x_step[1] = inverse_matrix.m[1][0] / source->height; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1] / source->width; + y_step[1] = inverse_matrix.m[1][1] / source->height; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]) / source->width; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / source->height; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; +#endif + + /* Setup the command buffer. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A18, (void *) &c_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A19, (void *) &c_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1A, (void *) &c_step[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1C, (void *) &x_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1D, (void *) &x_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1E, (void *) &x_step[2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A20, (void *) &y_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A21, (void *) &y_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A22, (void *) &y_step[2])); + + if(((source->format >= VG_LITE_YUY2) && + (source->format <= VG_LITE_AYUY2)) || + ((source->format >= VG_LITE_YUY2_TILED) && + (source->format <= VG_LITE_AYUY2_TILED))) { + yuv2rgb = convert_yuv2rgb(source->yuv.yuv2rgb); + uv_swiz = convert_uv_swizzle(source->yuv.swizzle); + } + + if(source->yuv.uv_planar) { + /* Program u plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A51, source->yuv.uv_planar)); + } + if(source->yuv.v_planar) { + /* Program v plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source->yuv.v_planar)); + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A24, convert_source_format(source->format) | + filter_mode | uv_swiz | yuv2rgb | linear_tile | conversion | src_premultiply_enable)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A26, paint_color)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A28, source->address)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2A, tiled_source)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2C, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2E, source->width | (source->height << 16))); + + /* Work on path states. */ + matrix = path_matrix; + + if(ts_is_fullscreen == 0) { + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[1], matrix); + point_min = point_max = temp; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[1], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + point_min.x = MAX(point_min.x, 0); + point_min.y = MAX(point_min.y, 0); + point_max.x = MIN(point_max.x, target->width); + point_max.y = MIN(point_max.y, target->height); + + if(s_context.scissor_set) { + point_min.x = MAX(point_min.x, s_context.scissor[0]); + point_min.y = MAX(point_min.y, s_context.scissor[1]); + point_max.x = MIN(point_max.x, s_context.scissor[2]); + point_max.y = MIN(point_max.y, s_context.scissor[3]); + } + } + + Scale = 1.0f; + Bias = 0.0f; + new_matrix[0] = matrix->m[0][0] * Scale; + new_matrix[1] = matrix->m[0][1] * Scale; + new_matrix[2] = (matrix->m[0][0] + matrix->m[0][1]) * Bias + matrix->m[0][2]; + new_matrix[3] = matrix->m[1][0] * Scale; + new_matrix[4] = matrix->m[1][1] * Scale; + new_matrix[5] = (matrix->m[1][0] + matrix->m[1][1]) * Bias + matrix->m[1][2]; + + /* Convert states into hardware values. */ + blend_mode = convert_blend(blend); + format = convert_path_format(path->format); + quality = convert_path_quality(path->quality); + tiling = (s_context.capabilities.cap.tiled == 2) ? 0x2000000 : 0; + fill = (fill_rule == VG_LITE_FILL_EVEN_ODD) ? 0x10 : 0; + tessellation_size = s_context.tessbuf.tessbuf_size; + + /* Setup the command buffer. */ + /* Program color register. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + 0x01000002 | s_context.capabilities.cap.tiled | in_premult | image_mode | blend_mode | transparency_mode | + s_context.enable_mask | s_context.color_transform | s_context.matrix_enable | s_context.scissor_enable)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000400 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3B, 0x3F800000)); /* Path tessellation SCALE. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3C, 0x00000000)); /* Path tessellation BIAS. */ + /* Program matrix. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A40, (void *) &new_matrix[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A41, (void *) &new_matrix[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A42, (void *) &new_matrix[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A43, (void *) &new_matrix[3])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A44, (void *) &new_matrix[4])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A45, (void *) &new_matrix[5])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0ACD, (void *) &matrix->m[0][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0ACE, (void *) &matrix->m[1][2])); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + if(path->path_changed != 0) { + if(path->uploaded.handle != NULL) { + free_memory.memory_handle = path->uploaded.handle; + vg_lite_kernel(VG_LITE_FREE, &free_memory); + path->uploaded.address = 0; + path->uploaded.memory = NULL; + path->uploaded.handle = NULL; + } + /* Allocate memory for the path data. */ + memory.bytes = 16 + VG_LITE_ALIGN(path->path_length, 8); + return_offset = (8 + VG_LITE_ALIGN(path->path_length, 8)) / 4; + memory.contiguous = 1; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &memory)); + ((uint64_t *) memory.memory)[(path->path_length + 7) / 8] = 0; + ((uint32_t *) memory.memory)[0] = VG_LITE_DATA((path->path_length + 7) / 8); + ((uint32_t *) memory.memory)[1] = 0; + memcpy((uint8_t *) memory.memory + 8, path->path, path->path_length); + ((uint32_t *) memory.memory)[return_offset] = VG_LITE_RETURN(); + ((uint32_t *) memory.memory)[return_offset + 1] = 0; + + path->uploaded.handle = memory.memory_handle; + path->uploaded.memory = memory.memory; + path->uploaded.address = memory.memory_gpu; + path->uploaded.bytes = memory.bytes; + path->path_changed = 0; + } + } + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + vglitemDUMP_BUFFER("path", (size_t)path->uploaded.address, (uint8_t *)(path->uploaded.memory), 0, path->uploaded.bytes); + } + +#if !DUMP_COMMAND_CAPTURE + vglitemDUMP("@[memory 0x%08X 0x%08X]", s_context.tessbuf.physical_addr, s_context.tessbuf.tessbuf_size); +#endif + + if(width + point_min.x > target->width) { + width = target->width - point_min.x; + } + +#if (gcFEATURE_VG_PARALLEL_PATHS && gcFEATURE_VG_512_PARALLEL_PATHS) + { + /* Tessellate path. */ + s_context.tessbuf.tess_w_h = width | (height << 16); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (point_min.y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, s_context.tessbuf.tess_w_h)); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO) + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + } + } + } +#else + { + height = s_context.tessbuf.tess_w_h >> 16; + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO) { +#if gcFEATURE_VG_512_PARALLEL_PATHS + if(height <= 128) + parallel_workpaths1 = 4; + else + parallel_workpaths1 = height * 128 / 4096 - 1; + + if(parallel_workpaths1 > parallel_workpaths2) + parallel_workpaths1 = parallel_workpaths2; +#endif + for(y = point_min.y; y < point_max.y; y += height) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (y << 16))); + if(y + height > target->height) { + temp_height = target->height - y; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (temp_height << 16))); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (height << 16))); + } + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); +#if gcFEATURE_VG_512_PARALLEL_PATHS + s_context.path_counter ++; + if(parallel_workpaths1 == s_context.path_counter) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0E02, 0x10 | (0x7 << 8))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0F00, 0x10 | (0x7 << 8))); + s_context.path_counter = 0; + } +#endif + } + } + } + + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + for(y = point_min.y; y < point_max.y; y += height) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (y << 16))); + if(y + height > target->height) { + temp_height = target->height - y; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (temp_height << 16))); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (height << 16))); + } + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); +#if gcFEATURE_VG_512_PARALLEL_PATHS + s_context.path_counter ++; + if(parallel_workpaths1 == s_context.path_counter) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0E02, 0x10 | (0x7 << 8))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0F00, 0x10 | (0x7 << 8))); + s_context.path_counter = 0; + } +#endif + } + } + } + } +#endif + + /* Finialize command buffer. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_NORMAL, 0xFF)); + } +#endif + vglitemDUMP_BUFFER("image", (size_t)source->address, source->memory, 0, (source->stride) * (source->height)); +#if DUMP_IMAGE + dump_img(source->memory, source->width, source->height, source->format); +#endif + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +/* GC555 vg_lite_draw_radial_grad API implementation + */ +vg_lite_error_t vg_lite_draw_radial_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_radial_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_draw_radial_grad)(target, path, fill_rule, path_matrix, grad, paint_color, blend, filter); +#endif + +#if gcFEATURE_VG_RADIAL_GRADIENT && gcFEATURE_VG_IM_INPUT + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t imageMode = 0; + uint32_t blend_mode; + uint32_t filter_mode = 0; + uint32_t conversion = 0; + uint32_t tiled_source; + vg_lite_matrix_t inverse_matrix; + vg_lite_float_t x_step[3]; + vg_lite_float_t y_step[3]; + vg_lite_float_t c_step[3]; + vg_lite_buffer_t * source = &grad->image; + vg_lite_matrix_t * matrix = &grad->matrix; + uint32_t rad_tile = 0; + uint32_t transparency_mode = 0; + uint32_t yuv2rgb = 0; + uint32_t uv_swiz = 0; + void * data; + uint32_t compress_mode; + uint32_t in_premult = 0; + uint32_t src_premultiply_enable = 0; + uint32_t premul_flag = 0; + uint32_t prediv_flag = 0; + + /* The following code is from "draw path" */ + uint32_t format, quality, tiling, fill; + uint32_t tessellation_size; + + vg_lite_kernel_allocate_t memory; + vg_lite_kernel_free_t free_memory; + uint32_t return_offset = 0; + + vg_lite_point_t point_min = { 0 }, point_max = { 0 }, temp = { 0 }; + int width, height; + uint8_t ts_is_fullscreen = 0; + float new_matrix[6]; + float Scale, Bias; + + vg_lite_float_t radius; + + vg_lite_float_t centerX, centerY; + vg_lite_float_t focalX, focalY; + vg_lite_float_t fx, fy; + vg_lite_float_t fxfy_2; + vg_lite_float_t radius2; + vg_lite_float_t r2_fx2, r2_fy2; + vg_lite_float_t r2_fx2_2, r2_fy2_2; + vg_lite_float_t r2_fx2_fy2; + vg_lite_float_t r2_fx2_fy2sq; + vg_lite_float_t cx, cy; + + vg_lite_float_t rgConstantLin, rgStepXLin, rgStepYLin; + vg_lite_float_t rgConstantRad, rgStepXRad, rgStepYRad; + vg_lite_float_t rgStepXXRad, rgStepYYRad, rgStepXYRad; + + int y; + int temp_height = 0; + +#if !gcFEATURE_VG_PARALLEL_PATHS + uint32_t parallel_workpaths1 = 2; + uint32_t parallel_workpaths2 = 2; +#endif + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_draw_radial_grad %p %p %d %p %p 0x%08X %d %d\n", + target, path, fill_rule, path_matrix, grad, paint_color, blend, filter); +#endif + +#if gcFEATURE_VG_ERROR_CHECK +#if !gcFEATURE_VG_QUALITY_8X + if(path->quality == VG_LITE_UPPER) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_LVGL_SUPPORT + if((blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL)) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_24BIT + if(target->format >= VG_LITE_RGB888 && target->format <= VG_LITE_RGBA5658) { + return VG_LITE_NOT_SUPPORT; + } +#endif + +#if !gcFEATURE_VG_STENCIL + if(source->image_mode == VG_LITE_STENCIL_MODE) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_NEW_BLEND_MODE + if(blend == VG_LITE_BLEND_DARKEN || blend == VG_LITE_BLEND_LIGHTEN) { + return VG_LITE_NOT_SUPPORT; + } +#endif +#if !gcFEATURE_VG_IM_REPEAT_REFLECT + if(grad->spread_mode == VG_LITE_GRADIENT_SPREAD_REPEAT || grad->spread_mode == VG_LITE_GRADIENT_SPREAD_REFLECT) { + return VG_LITE_NOT_SUPPORT; + } +#endif + if(source->format == VG_LITE_A4 || source->format == VG_LITE_A8) { + return VG_LITE_NOT_SUPPORT; + } + if(!path || !path->path) { + return VG_LITE_INVALID_ARGUMENT; + } + radius = grad->radial_grad.r; + if(radius < 0) { + return VG_LITE_INVALID_ARGUMENT; + } + VG_LITE_RETURN_ERROR(check_compress(source->format, source->compress_mode, source->tiled, source->width, + source->height)); +#endif /* gcFEATURE_VG_ERROR_CHECK */ + + if(!path->path_length) { + return VG_LITE_SUCCESS; + } + + if(!path_matrix) { + path_matrix = &identity_mtx; + } + +#if gcFEATURE_VG_GAMMA + set_gamma_dest_only(target, VGL_TRUE); +#endif +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_GLOBAL, 0xff)); + } +#endif + /*blend input into context*/ + s_context.blend_mode = blend; + + src_premultiply_enable = 0x01000100; + if(s_context.color_transform == 0 && s_context.gamma_dst == s_context.gamma_src && s_context.matrix_enable == 0 && + s_context.dst_alpha_mode == 0 && s_context.src_alpha_mode == 0 && + (source->image_mode == VG_LITE_NORMAL_IMAGE_MODE || source->image_mode == 0)) { + prediv_flag = 0; + } + else { + prediv_flag = 1; + } + if((s_context.blend_mode >= OPENVG_BLEND_SRC_OVER && s_context.blend_mode <= OPENVG_BLEND_ADDITIVE) || + source->image_mode == VG_LITE_STENCIL_MODE + || (s_context.blend_mode >= VG_LITE_BLEND_NORMAL_LVGL && s_context.blend_mode <= VG_LITE_BLEND_MULTIPLY_LVGL)) { + premul_flag = 1; + } + else { + premul_flag = 0; + } + + if((source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 0) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 0)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x10000000; + } + /* when src and dst all pre format, im pre_out set to 0 to perform data truncation to prevent data overflow */ + else if(source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 0) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 0 && target->premultiplied == 1) || + (source->premultiplied == 0 && target->premultiplied == 0 && premul_flag == 1)) { + src_premultiply_enable = 0x01000100; + in_premult = 0x00000000; + } + else if((source->premultiplied == 1 && target->premultiplied == 1 && prediv_flag == 1) || + (source->premultiplied == 1 && target->premultiplied == 0 && prediv_flag == 1)) { + src_premultiply_enable = 0x00000100; + in_premult = 0x00000000; + } + if((source->format == VG_LITE_A4 || source->format == VG_LITE_A8) && blend >= VG_LITE_BLEND_SRC_OVER && + blend <= VG_LITE_BLEND_SUBTRACT) { +#if (CHIPID==0x255) + src_premultiply_enable = 0x00000000; +#endif + in_premult = 0x00000000; + } + if(source->premultiplied == target->premultiplied && premul_flag == 0) { + target->apply_premult = 1; + } + else { + target->apply_premult = 0; + } + + error = set_render_target(target); + if(error != VG_LITE_SUCCESS) { + return error; + } + else if(error == VG_LITE_NO_CONTEXT) { + /* If scissoring is enabled and no valid scissoring rectangles + are present, no drawing occurs */ + return VG_LITE_SUCCESS; + } + + if((target->format == VG_LITE_YUYV || target->format == VG_LITE_YUY2 || target->format == VG_LITE_YUY2_TILED + || target->format == VG_LITE_AYUY2 || target->format == VG_LITE_AYUY2_TILED) + && path->quality != VG_LITE_LOW) { + path->quality = VG_LITE_LOW; + printf("If target is YUV group , the path qulity should use VG_LITE_LOW.\n"); + } + + transparency_mode = (source->transparency_mode == VG_LITE_IMAGE_TRANSPARENT ? 0x8000 : 0); + width = s_context.tessbuf.tess_w_h & 0xFFFF; + height = s_context.tessbuf.tess_w_h >> 16; + + if(width == 0 || height == 0) + return VG_LITE_NO_CONTEXT; + if((target->width <= width) && (target->height <= height) && (!s_context.scissor_set)) { + ts_is_fullscreen = 1; + point_min.x = 0; + point_min.y = 0; + point_max.x = target->width; + point_max.y = target->height; + } + + /* If target is L8 and source is in YUV or RGB (not L8 or A8) then we have to convert RGB into L8. */ + if((target->format == VG_LITE_L8) && ((source->format != VG_LITE_L8) && (source->format != VG_LITE_A8))) { + conversion = 0x80000000; + } + + /* Determine image mode (NORMAL, NONE , MULTIPLY or STENCIL) depending on the color. */ + switch(source->image_mode) { + case VG_LITE_NONE_IMAGE_MODE: + imageMode = 0x0; + break; + + case VG_LITE_MULTIPLY_IMAGE_MODE: + return VG_LITE_INVALID_ARGUMENT; + + case VG_LITE_NORMAL_IMAGE_MODE: + case VG_LITE_ZERO: + imageMode = 0x00001000; + break; + + case VG_LITE_STENCIL_MODE: + imageMode = 0x00003000; + break; + + case VG_LITE_RECOLOR_MODE: + imageMode = 0x00006000; + break; + } + + switch(filter) { + case VG_LITE_FILTER_POINT: + filter_mode = 0; + break; + + case VG_LITE_FILTER_LINEAR: + filter_mode = 0x10000; + break; + + case VG_LITE_FILTER_BI_LINEAR: + filter_mode = 0x20000; + break; + + case VG_LITE_FILTER_GAUSSIAN: + filter_mode = 0x30000; + break; + } + + tiled_source = (source->tiled != VG_LITE_LINEAR) ? 0x10000000 : 0 ; + + switch(grad->spread_mode) { + case VG_LITE_GRADIENT_SPREAD_FILL: + rad_tile = 0x0; + break; + + case VG_LITE_GRADIENT_SPREAD_PAD: + rad_tile = 0x1000; + break; + + case VG_LITE_GRADIENT_SPREAD_REPEAT: + rad_tile = 0x2000; + break; + + case VG_LITE_GRADIENT_SPREAD_REFLECT: + rad_tile = 0x3000; + break; + } + + compress_mode = (uint32_t)source->compress_mode << 25; + + if(grad->spread_mode == VG_LITE_GRADIENT_SPREAD_FILL) { + uint8_t a, r, g, b; + a = paint_color >> 24; + r = paint_color >> 16; + g = paint_color >> 8; + b = paint_color; + paint_color = (a << 24) | (b << 16) | (g << 8) | r; + } + + /* compute radial gradient paremeters */ + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix)) + return VG_LITE_INVALID_ARGUMENT; + + /* Make shortcuts to the gradient information. */ + centerX = grad->radial_grad.cx; + centerY = grad->radial_grad.cy; + focalX = grad->radial_grad.fx; + focalY = grad->radial_grad.fy; + + /* Compute constants of the equation. */ + fx = focalX - centerX; + fy = focalY - centerY; + radius2 = radius * radius; + if(fx * fx + fy * fy > radius2) { + /* If the focal point is outside the circle, let's move it + to inside the circle. Per vg11 spec pg125 "If (fx, fy) lies outside ... + For here, we set it at 0.9 ratio to the center. + */ + vg_lite_float_t fr = (vg_lite_float_t)sqrt(fx * fx + fy * fy); + fx = radius * fx / fr * 0.9f; + fy = radius * fy / fr * 0.9f; + focalX = grad->radial_grad.fx + fx; + focalY = grad->radial_grad.fy + fy; + } + + fxfy_2 = 2.0f * fx * fy; + r2_fx2 = radius2 - fx * fx; + r2_fy2 = radius2 - fy * fy; + r2_fx2_2 = 2.0f * r2_fx2; + r2_fy2_2 = 2.0f * r2_fy2; +#if gcFEATURE_VG_MATH_PRECISION_FIX + r2_fx2_fy2 = (r2_fx2 - fy * fy) / source->width; + r2_fx2_fy2sq = (r2_fx2_fy2 * r2_fx2_fy2); +#else + r2_fx2_fy2 = r2_fx2 - fy * fy; + r2_fx2_fy2sq = r2_fx2_fy2 * r2_fx2_fy2; +#endif + + /* _____________________________________ + ** dx fx + dy fy + \/r^2 (dx^2 + dy^2) - (dx fy - dy fx)^2 + ** g = ------------------------------------------------------- + ** r^2 - fx^2 - fy^2 + ** + ** Where + ** + ** dx := F(x) - focalX + ** dy := F(y) - focalY + ** fx := focalX - centerX + ** fy := focalX - centerY + ** + ** and + ** + ** F(x) := (x + 0.5) m00 + (y + 0.5) m01 + m02 + ** F(y) := (x + 0.5) m10 + (y + 0.5) m11 + m12 + ** + ** So, dx can be factored into + ** + ** dx = (x + 0.5) m00 + (y + 0.5) m01 + m02 - focalX + ** = x m00 + y m01 + 0.5 m00 + 0.5 m01 + m02 - focalX + ** + ** = x m00 + y m01 + cx + ** + ** where + ** + ** cx := 0.5 m00 + 0.5 m01 + m02 - focalX + ** + ** The same way we can factor dy into + ** + ** dy = x m10 + y m11 + cy + ** + ** where + ** + ** cy := 0.5 m10 + 0.5 m11 + m12 - focalY. + ** + ** Now we can rewrite g as + ** ______________________________________ + ** dx fx + dy fy / r^2 (dx^2 + dy^2) - (dx fy - dy fx)^2 + ** g = ----------------- + \ / ------------------------------------- + ** r^2 - fx^2 - fy^2 \/ (r^2 - fx^2 - fy^2)^2 + ** ____ + ** = gLin + \/gRad + ** + ** where + ** + ** dx fx + dy fy + ** gLin := ----------------- + ** r^2 - fx^2 - fy^2 + ** + ** r^2 (dx^2 + dy^2) - (dx fy - dy fx)^2 + ** gRad := ------------------------------------- + ** (r^2 - fx^2 - fy^2)^2 + */ + + cx + = 0.5f * (MAT(&inverse_matrix, 0, 0) + MAT(&inverse_matrix, 0, 1)) + + MAT(&inverse_matrix, 0, 2) + - focalX; + + cy + = 0.5f * (MAT(&inverse_matrix, 1, 0) + MAT(&inverse_matrix, 1, 1)) + + MAT(&inverse_matrix, 1, 2) + - focalY; + + /* + ** dx fx + dy fy + ** gLin := ----------------- + ** r^2 - fx^2 - fy^2 + ** + ** We can factor the top half into + ** + ** = (x m00 + y m01 + cx) fx + (x m10 + y m11 + cy) fy + ** + ** = x (m00 fx + m10 fy) + ** + y (m01 fx + m11 fy) + ** + cx fx + cy fy. + */ + + rgStepXLin + = (MAT(&inverse_matrix, 0, 0) * fx + MAT(&inverse_matrix, 1, 0) * fy) + / r2_fx2_fy2; + + rgStepYLin + = (MAT(&inverse_matrix, 0, 1) * fx + MAT(&inverse_matrix, 1, 1) * fy) + / r2_fx2_fy2; + + rgConstantLin = (cx * fx + cy * fy) / r2_fx2_fy2; + + /* + ** r^2 (dx^2 + dy^2) - (dx fy - dy fx)^2 + ** gRad := ------------------------------------- + ** (r^2 - fx^2 - fy^2)^2 + ** + ** r^2 (dx^2 + dy^2) - dx^2 fy^2 - dy^2 fx^2 + 2 dx dy fx fy + ** := --------------------------------------------------------- + ** (r^2 - fx^2 - fy^2)^2 + ** + ** dx^2 (r^2 - fy^2) + dy^2 (r^2 - fx^2) + 2 dx dy fx fy + ** := ----------------------------------------------------- + ** (r^2 - fx^2 - fy^2)^2 + ** + ** First, lets factor dx^2 into + ** + ** dx^2 = (x m00 + y m01 + cx)^2 + ** = x^2 m00^2 + y^2 m01^2 + 2 x y m00 m01 + ** + 2 x m00 cx + 2 y m01 cx + cx^2 + ** + ** = x^2 (m00^2) + ** + y^2 (m01^2) + ** + x y (2 m00 m01) + ** + x (2 m00 cx) + ** + y (2 m01 cx) + ** + cx^2. + ** + ** The same can be done for dy^2: + ** + ** dy^2 = x^2 (m10^2) + ** + y^2 (m11^2) + ** + x y (2 m10 m11) + ** + x (2 m10 cy) + ** + y (2 m11 cy) + ** + cy^2. + ** + ** Let's also factor dx dy into + ** + ** dx dy = (x m00 + y m01 + cx) (x m10 + y m11 + cy) + ** = x^2 m00 m10 + y^2 m01 m11 + x y m00 m11 + x y m01 m10 + ** + x m00 cy + x m10 cx + y m01 cy + y m11 cx + cx cy + ** + ** = x^2 (m00 m10) + ** + y^2 (m01 m11) + ** + x y (m00 m11 + m01 m10) + ** + x (m00 cy + m10 cx) + ** + y (m01 cy + m11 cx) + ** + cx cy. + ** + ** Now that we have all this, lets look at the top of gRad. + ** + ** = dx^2 (r^2 - fy^2) + dy^2 (r^2 - fx^2) + 2 dx dy fx fy + ** = x^2 m00^2 (r^2 - fy^2) + y^2 m01^2 (r^2 - fy^2) + ** + x y 2 m00 m01 (r^2 - fy^2) + x 2 m00 cx (r^2 - fy^2) + ** + y 2 m01 cx (r^2 - fy^2) + cx^2 (r^2 - fy^2) + ** + x^2 m10^2 (r^2 - fx^2) + y^2 m11^2 (r^2 - fx^2) + ** + x y 2 m10 m11 (r^2 - fx^2) + x 2 m10 cy (r^2 - fx^2) + ** + y 2 m11 cy (r^2 - fx^2) + cy^2 (r^2 - fx^2) + ** + x^2 m00 m10 2 fx fy + y^2 m01 m11 2 fx fy + ** + x y (m00 m11 + m01 m10) 2 fx fy + ** + x (m00 cy + m10 cx) 2 fx fy + y (m01 cy + m11 cx) 2 fx fy + ** + cx cy 2 fx fy + ** + ** = x^2 ( m00^2 (r^2 - fy^2) + ** + m10^2 (r^2 - fx^2) + ** + m00 m10 2 fx fy + ** ) + ** + y^2 ( m01^2 (r^2 - fy^2) + ** + m11^2 (r^2 - fx^2) + ** + m01 m11 2 fx fy + ** ) + ** + x y ( 2 m00 m01 (r^2 - fy^2) + ** + 2 m10 m11 (r^2 - fx^2) + ** + (m00 m11 + m01 m10) 2 fx fy + ** ) + ** + x ( 2 m00 cx (r^2 - fy^2) + ** + 2 m10 cy (r^2 - fx^2) + ** + (m00 cy + m10 cx) 2 fx fy + ** ) + ** + y ( 2 m01 cx (r^2 - fy^2) + ** + 2 m11 cy (r^2 - fx^2) + ** + (m01 cy + m11 cx) 2 fx fy + ** ) + ** + cx^2 (r^2 - fy^2) + cy^2 (r^2 - fx^2) + cx cy 2 fx fy. + */ + + rgStepXXRad = + ( + MAT(&inverse_matrix, 0, 0) * MAT(&inverse_matrix, 0, 0) * r2_fy2 + + MAT(&inverse_matrix, 1, 0) * MAT(&inverse_matrix, 1, 0) * r2_fx2 + + MAT(&inverse_matrix, 0, 0) * MAT(&inverse_matrix, 1, 0) * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgStepYYRad = + ( + MAT(&inverse_matrix, 0, 1) * MAT(&inverse_matrix, 0, 1) * r2_fy2 + + MAT(&inverse_matrix, 1, 1) * MAT(&inverse_matrix, 1, 1) * r2_fx2 + + MAT(&inverse_matrix, 0, 1) * MAT(&inverse_matrix, 1, 1) * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgStepXYRad = + ( + MAT(&inverse_matrix, 0, 0) * MAT(&inverse_matrix, 0, 1) * r2_fy2_2 + + MAT(&inverse_matrix, 1, 0) * MAT(&inverse_matrix, 1, 1) * r2_fx2_2 + + ( + MAT(&inverse_matrix, 0, 0) * MAT(&inverse_matrix, 1, 1) + + MAT(&inverse_matrix, 0, 1) * MAT(&inverse_matrix, 1, 0) + ) + * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgStepXRad = + ( + MAT(&inverse_matrix, 0, 0) * cx * r2_fy2_2 + + MAT(&inverse_matrix, 1, 0) * cy * r2_fx2_2 + + ( + MAT(&inverse_matrix, 0, 0) * cy + + MAT(&inverse_matrix, 1, 0) * cx + ) + * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgStepYRad = + ( + MAT(&inverse_matrix, 0, 1) * cx * r2_fy2_2 + + MAT(&inverse_matrix, 1, 1) * cy * r2_fx2_2 + + ( + MAT(&inverse_matrix, 0, 1) * cy + + MAT(&inverse_matrix, 1, 1) * cx + ) + * fxfy_2 + ) + / r2_fx2_fy2sq; + + rgConstantRad = + ( + cx * cx * r2_fy2 + + cy * cy * r2_fx2 + + cx * cy * fxfy_2 + ) + / r2_fx2_fy2sq; + + /* Setup the command buffer. */ + + /* rad gradient parameters*/ + data = &rgConstantLin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A04, *(uint32_t *) data)); + data = &rgStepXLin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A06, *(uint32_t *) data)); + data = &rgStepYLin; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A08, *(uint32_t *) data)); + data = &rgConstantRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A05, *(uint32_t *) data)); + data = &rgStepXRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A07, *(uint32_t *) data)); + data = &rgStepYRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A09, *(uint32_t *) data)); + data = &rgStepXXRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A03, *(uint32_t *) data)); + data = &rgStepYYRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0A, *(uint32_t *) data)); + data = &rgStepXYRad; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A0B, *(uint32_t *) data)); + + /* Compute inverse matrix. */ + if(!inverse(&inverse_matrix, matrix)) + return VG_LITE_INVALID_ARGUMENT; + +#if gcFEATURE_VG_MATH_PRECISION_FIX + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0]; + x_step[1] = inverse_matrix.m[1][0]; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1]; + y_step[1] = inverse_matrix.m[1][1]; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]); + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]); + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; +#else + /* Compute interpolation steps. */ + x_step[0] = inverse_matrix.m[0][0] / source->width; + x_step[1] = inverse_matrix.m[1][0] / source->height; + x_step[2] = inverse_matrix.m[2][0]; + y_step[0] = inverse_matrix.m[0][1] / source->width; + y_step[1] = inverse_matrix.m[1][1] / source->height; + y_step[2] = inverse_matrix.m[2][1]; + c_step[0] = (0.5f * (inverse_matrix.m[0][0] + inverse_matrix.m[0][1]) + inverse_matrix.m[0][2]) / source->width; + c_step[1] = (0.5f * (inverse_matrix.m[1][0] + inverse_matrix.m[1][1]) + inverse_matrix.m[1][2]) / source->height; + c_step[2] = 0.5f * (inverse_matrix.m[2][0] + inverse_matrix.m[2][1]) + inverse_matrix.m[2][2]; +#endif + + /* Setup the command buffer. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A18, (void *) &c_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A19, (void *) &c_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1A, (void *) &c_step[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1C, (void *) &x_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1D, (void *) &x_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A1E, (void *) &x_step[2])); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1F, 0x00000001)); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A20, (void *) &y_step[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A21, (void *) &y_step[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A22, (void *) &y_step[2])); + + if(((source->format >= VG_LITE_YUY2) && + (source->format <= VG_LITE_AYUY2)) || + ((source->format >= VG_LITE_YUY2_TILED) && + (source->format <= VG_LITE_AYUY2_TILED))) { + yuv2rgb = convert_yuv2rgb(source->yuv.yuv2rgb); + uv_swiz = convert_uv_swizzle(source->yuv.swizzle); + } + + if(source->yuv.uv_planar) { + /* Program u plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A51, source->yuv.uv_planar)); + } + if(source->yuv.v_planar) { + /* Program v plane address if necessary. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A53, source->yuv.v_planar)); + } + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A24, convert_source_format(source->format) | + filter_mode | uv_swiz | yuv2rgb | rad_tile | conversion | src_premultiply_enable | compress_mode)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A26, paint_color)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A28, source->address)); + + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2A, tiled_source)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2C, 0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A2E, source->width | (source->height << 16))); + + /* Work on path states. */ + matrix = path_matrix; + + if(ts_is_fullscreen == 0) { + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[1], matrix); + point_min = point_max = temp; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[1], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[2], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + transform(&temp, (vg_lite_float_t)path->bounding_box[0], (vg_lite_float_t)path->bounding_box[3], matrix); + if(temp.x < point_min.x) point_min.x = temp.x; + if(temp.y < point_min.y) point_min.y = temp.y; + if(temp.x > point_max.x) point_max.x = temp.x; + if(temp.y > point_max.y) point_max.y = temp.y; + + point_min.x = MAX(point_min.x, 0); + point_min.y = MAX(point_min.y, 0); + point_max.x = MIN(point_max.x, target->width); + point_max.y = MIN(point_max.y, target->height); + + if(s_context.scissor_set) { + point_min.x = MAX(point_min.x, s_context.scissor[0]); + point_min.y = MAX(point_min.y, s_context.scissor[1]); + point_max.x = MIN(point_max.x, s_context.scissor[2]); + point_max.y = MIN(point_max.y, s_context.scissor[3]); + } + } + + Scale = 1.0f; + Bias = 0.0f; + new_matrix[0] = matrix->m[0][0] * Scale; + new_matrix[1] = matrix->m[0][1] * Scale; + new_matrix[2] = (matrix->m[0][0] + matrix->m[0][1]) * Bias + matrix->m[0][2]; + new_matrix[3] = matrix->m[1][0] * Scale; + new_matrix[4] = matrix->m[1][1] * Scale; + new_matrix[5] = (matrix->m[1][0] + matrix->m[1][1]) * Bias + matrix->m[1][2]; + + /* Convert states into hardware values. */ + blend_mode = convert_blend(blend); + format = convert_path_format(path->format); + quality = convert_path_quality(path->quality); + tiling = (s_context.capabilities.cap.tiled == 2) ? 0x2000000 : 0; + fill = (fill_rule == VG_LITE_FILL_EVEN_ODD) ? 0x10 : 0; + tessellation_size = s_context.tessbuf.tessbuf_size; + + /* Setup the command buffer. */ + /* Program color register. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A00, + 0x02000002 | s_context.capabilities.cap.tiled | in_premult | imageMode | blend_mode | transparency_mode | + s_context.enable_mask | s_context.color_transform | s_context.matrix_enable | s_context.scissor_enable)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000000 | format | quality | tiling | fill)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3B, 0x3F800000)); /* Path tessellation SCALE. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3C, 0x00000000)); /* Path tessellation BIAS. */ + /* Program matrix. */ + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A40, (void *) &new_matrix[0])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A41, (void *) &new_matrix[1])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A42, (void *) &new_matrix[2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A43, (void *) &new_matrix[3])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A44, (void *) &new_matrix[4])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0A45, (void *) &new_matrix[5])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0ACD, (void *) &matrix->m[0][2])); + VG_LITE_RETURN_ERROR(push_state_ptr(&s_context, 0x0ACE, (void *) &matrix->m[1][2])); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + if(path->path_changed != 0) { + if(path->uploaded.handle != NULL) { + free_memory.memory_handle = path->uploaded.handle; + vg_lite_kernel(VG_LITE_FREE, &free_memory); + path->uploaded.address = 0; + path->uploaded.memory = NULL; + path->uploaded.handle = NULL; + } + /* Allocate memory for the path data. */ + memory.bytes = 16 + VG_LITE_ALIGN(path->path_length, 8); + return_offset = (8 + VG_LITE_ALIGN(path->path_length, 8)) / 4; + memory.contiguous = 1; + VG_LITE_RETURN_ERROR(vg_lite_kernel(VG_LITE_ALLOCATE, &memory)); + ((uint64_t *) memory.memory)[(path->path_length + 7) / 8] = 0; + ((uint32_t *) memory.memory)[0] = VG_LITE_DATA((path->path_length + 7) / 8); + ((uint32_t *) memory.memory)[1] = 0; + memcpy((uint8_t *) memory.memory + 8, path->path, path->path_length); + ((uint32_t *) memory.memory)[return_offset] = VG_LITE_RETURN(); + ((uint32_t *) memory.memory)[return_offset + 1] = 0; + + path->uploaded.handle = memory.memory_handle; + path->uploaded.memory = memory.memory; + path->uploaded.address = memory.memory_gpu; + path->uploaded.bytes = memory.bytes; + path->path_changed = 0; + } + } + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + vglitemDUMP_BUFFER("path", (size_t)path->uploaded.address, (uint8_t *)(path->uploaded.memory), 0, path->uploaded.bytes); + } + +#if !DUMP_COMMAND_CAPTURE + vglitemDUMP("@[memory 0x%08X 0x%08X]", s_context.tessbuf.physical_addr, s_context.tessbuf.tessbuf_size); +#endif + + if(width + point_min.x > target->width) { + width = target->width - point_min.x; + } + +#if (gcFEATURE_VG_PARALLEL_PATHS && gcFEATURE_VG_512_PARALLEL_PATHS) + { + /* Tessellate path. */ + s_context.tessbuf.tess_w_h = width | (height << 16); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (point_min.y << 16))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, s_context.tessbuf.tess_w_h)); + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO) + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); + } + } + } +#else + { + height = s_context.tessbuf.tess_w_h >> 16; + if(path->path_type == VG_LITE_DRAW_FILL_PATH || path->path_type == VG_LITE_DRAW_ZERO) { +#if gcFEATURE_VG_512_PARALLEL_PATHS + if(height <= 128) + parallel_workpaths1 = 4; + else + parallel_workpaths1 = height * 128 / 4096 - 1; + + if(parallel_workpaths1 > parallel_workpaths2) + parallel_workpaths1 = parallel_workpaths2; +#endif + + for(y = point_min.y; y < point_max.y; y += height) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (y << 16))); + if(y + height > target->height) { + temp_height = target->height - y; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (temp_height << 16))); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (height << 16))); + } + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + VG_LITE_RETURN_ERROR(push_data(&s_context, path->path_length, path->path)); +#if gcFEATURE_VG_512_PARALLEL_PATHS + s_context.path_counter ++; + if(parallel_workpaths1 == s_context.path_counter) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0E02, 0x10 | (0x7 << 8))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0F00, 0x10 | (0x7 << 8))); + s_context.path_counter = 0; + } +#endif + } + } + } + if(path->path_type == VG_LITE_DRAW_STROKE_PATH || path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH) { + for(y = point_min.y; y < point_max.y; y += height) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A1B, 0x00011000)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3D, tessellation_size / 64)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A39, point_min.x | (y << 16))); + if(y + height > target->height) { + temp_height = target->height - y; + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (temp_height << 16))); + } + else { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A3A, width | (height << 16))); + } + + if(VLM_PATH_GET_UPLOAD_BIT(*path) == 1) { + VG_LITE_RETURN_ERROR(push_call(&s_context, path->uploaded.address, path->uploaded.bytes)); + } + else { + format = convert_path_format(VG_LITE_FP32); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0x01000200 | format | quality | tiling | 0x0)); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A02, path->stroke_color)); + VG_LITE_RETURN_ERROR(push_data(&s_context, path->stroke_size, path->stroke_path)); +#if gcFEATURE_VG_512_PARALLEL_PATHS + s_context.path_counter ++; + if(parallel_workpaths1 == s_context.path_counter) { + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0E02, 0x10 | (0x7 << 8))); + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0F00, 0x10 | (0x7 << 8))); + s_context.path_counter = 0; + } +#endif + } + } + } + } +#endif + + /* Finialize command buffer. */ + VG_LITE_RETURN_ERROR(push_state(&s_context, 0x0A34, 0)); +#if gcFEATURE_VG_GLOBAL_ALPHA + if(blend >= VG_LITE_BLEND_NORMAL_LVGL && blend <= VG_LITE_BLEND_MULTIPLY_LVGL) { + VG_LITE_RETURN_ERROR(vg_lite_dest_global_alpha(VG_LITE_NORMAL, 0xFF)); + } +#endif + vglitemDUMP_BUFFER("image", (size_t)source->address, source->memory, 0, (source->stride) * (source->height)); +#if DUMP_IMAGE + dump_img(source->memory, source->width, source->height, source->format); +#endif + + return error; +#else + return VG_LITE_NOT_SUPPORT; +#endif +} + +#endif /* (CHIPID==0x355 || CHIPID==0x255) */ + +/* GC555/GC355/GC255 vg_lite_draw_grad API implementation + */ +vg_lite_error_t vg_lite_draw_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_linear_gradient_t * grad, + vg_lite_blend_t blend) +{ +#if DUMP_API + FUNC_DUMP(vg_lite_draw_grad)(target, path, fill_rule, matrix, grad, blend); +#endif + + return vg_lite_draw_pattern(target, path, fill_rule, matrix, + &grad->image, &grad->matrix, blend, VG_LITE_PATTERN_PAD, 0, 0, VG_LITE_FILTER_LINEAR); +} + +#endif /* LV_USE_VG_LITE_DRIVER */ + diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_stroke.c b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_stroke.c new file mode 100755 index 0000000..16c7c09 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLite/vg_lite_stroke.c @@ -0,0 +1,5421 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "vg_lite_context.h" + + +#define PI 3.141592653589793238462643383279502f +#define SINF(x) ((vg_lite_float_t) sin(x)) +#define COSF(x) ((vg_lite_float_t) cos(x)) +#define FABSF(x) ((vg_lite_float_t) fabs(x)) +#define SQRTF(x) ((vg_lite_float_t) sqrt(x)) +#define CLAMP(x, min, max) (((x) < (min)) ? (min) : \ + ((x) > (max)) ? (max) : (x)) +#define ACOSF(x) ((vg_lite_float_t) acos(x)) +#define FMODF(x, y) ((vg_lite_float_t) fmod((x), (y))) +#define CEILF(x) ((vg_lite_float_t) ceil(x)) + +#define SIZEOF(a) ((size_t)(sizeof(a))) +#define PTR2SIZE(p) ((uintptr_t)(p)) + +#define FLOAT_EPSILON 0.001f + +#define SWING_NO 0 +#define SWING_OUT 1 +#define SWING_IN 2 + +/* Point curve type for generated stroke path. */ +#define CURVE_LINE 0 +#define CURVE_QUAD_CONTROL 1 +#define CURVE_QUAD_ANCHOR 2 +#define CURVE_ARC_SCCW 3 +#define CURVE_ARC_SCCW_HALF 4 + +#define FLOAT_PI 3.141592654f +#define FLOAT_PI_TWO 6.283185307f +#define FLOAT_PI_THREE_QUARTER 2.356194490f +#define FLOAT_PI_HALF 1.570796327f +#define FLOAT_PI_QUARTER 0.7853981634f +#define FLOAT_PI_EIGHTH 0.3926990817f +/* cos(PI/8) */ +#define FLOAT_COS_PI_EIGHTH 0.9238795325f + +#define FLOAT_DIFF_EPSILON 0.125f +#define FLOAT_SWING_CENTER_RANGE 0.125f +#define FLOAT_ANGLE_EPSILON 0.0045f +#define FLOAT_ANGLE_EPSILON_COS 0.99999f +#define FLOAT_MIN_ARC_ANGLE 0.044f +#define FLOAT_MIN_ARC_ANGLE_COS 0.999f + +/* Float constants. */ +#define gcvMAX_POS_FLOAT ((vg_lite_float_t) 3.4028235e+038) +#define gcvMAX_NEG_FLOAT ((vg_lite_float_t) -3.4028235e+038) + +#define FLOAT_MIN gcvMAX_NEG_FLOAT +#define FLOAT_MAX gcvMAX_POS_FLOAT + +#define FLOAT_FAT_LINE_WIDTH 2.5f + +/* Point flatten type for flattened line segments. */ +#define vgcFLATTEN_NO 0 +#define vgcFLATTEN_START 1 +#define vgcFLATTEN_MIDDLE 2 +#define vgcFLATTEN_END 3 + +typedef struct vg_lite_control_coord { + vg_lite_float_t startX; + vg_lite_float_t startY; + vg_lite_float_t lastX; + vg_lite_float_t lastY; + vg_lite_float_t controlX; + vg_lite_float_t controlY; +} vg_lite_control_coord_t; + +/* Command size calculation shortcuts. */ +#define COMMANDSIZE(CoordinateCount, CoordinateType) \ + ((1+CoordinateCount) * SIZEOF(CoordinateType)) + +extern int32_t get_data_size(vg_lite_format_t format); + +static uint32_t _commandSize_float[] = { + COMMANDSIZE(0, vg_lite_float_t), /* 0: END */ + COMMANDSIZE(0, vg_lite_float_t), /* 1: CLOSE */ + COMMANDSIZE(2, vg_lite_float_t), /* 2: MOVE */ + COMMANDSIZE(2, vg_lite_float_t), /* 3: MOVE_REL */ + COMMANDSIZE(2, vg_lite_float_t), /* 4: LINE */ + COMMANDSIZE(2, vg_lite_float_t), /* 5: LINE_REL */ + COMMANDSIZE(4, vg_lite_float_t), /* 6: QUAD */ + COMMANDSIZE(4, vg_lite_float_t), /* 7: QUAD_REL */ + COMMANDSIZE(6, vg_lite_float_t), /* 8: CUBIC */ + COMMANDSIZE(6, vg_lite_float_t), /* 9: CUBIC_REL */ + COMMANDSIZE(0, vg_lite_float_t), /* 10: BREAK */ + COMMANDSIZE(1, vg_lite_float_t), /* 11: HLINE */ + COMMANDSIZE(1, vg_lite_float_t), /* 12: HLINE_REL */ + COMMANDSIZE(1, vg_lite_float_t), /* 13: VLINE */ + COMMANDSIZE(1, vg_lite_float_t), /* 14: VLINE_REL */ + COMMANDSIZE(2, vg_lite_float_t), /* 15: SQUAD */ + COMMANDSIZE(2, vg_lite_float_t), /* 16: SQUAD_REL */ + COMMANDSIZE(4, vg_lite_float_t), /* 17: SCUBIC */ + COMMANDSIZE(4, vg_lite_float_t), /* 18: SCUBIC_REL */ + COMMANDSIZE(5, vg_lite_float_t), /* 19: SCCWARC */ + COMMANDSIZE(5, vg_lite_float_t), /* 20: SCCWARC_REL */ + COMMANDSIZE(5, vg_lite_float_t), /* 21: SCWARC */ + COMMANDSIZE(5, vg_lite_float_t), /* 22: SCWARC_REL */ + COMMANDSIZE(5, vg_lite_float_t), /* 23: LCCWARC */ + COMMANDSIZE(5, vg_lite_float_t), /* 24: LCCWARC_REL */ + COMMANDSIZE(5, vg_lite_float_t), /* 25: LCWARC */ + COMMANDSIZE(5, vg_lite_float_t), /* 26: LCWARC_REL */ +}; + +#if gcFEATURE_VG_STROKE_PATH + +static vg_lite_float_t _GetS8_NS_NB(int8_t * Data) +{ + int8_t x0 = *((int8_t *) Data); + vg_lite_float_t x = (vg_lite_float_t) x0; + + return x; +} + +static vg_lite_float_t _GetS16_NS_NB(int8_t * Data) +{ + int16_t x0 = *((int16_t *) Data); + vg_lite_float_t x = (vg_lite_float_t) x0; + + return x; +} + +static vg_lite_float_t _GetS32_NS_NB(int8_t * Data) +{ + int32_t x0 = *((int32_t *) Data); + vg_lite_float_t x = (vg_lite_float_t) x0; + + return x; +} + +static vg_lite_float_t _GetF_NS_NB(int8_t * Data) +{ + vg_lite_float_t x = *((vg_lite_float_t *) Data); + + return x; +} + +/* Special sqrt(1.0f + x) for quick calculation when 0 <= x <= 1. */ +static vg_lite_float_t _Sqrt( + vg_lite_float_t X +) +{ + vg_lite_float_t x = X; + vg_lite_float_t s = 1.0f; + + s += x * 0.5f; + x *= X; + s -= x * 0.12445995211601257f; + x *= X; + s += x * 0.058032196015119553f; + x *= X; + s -= x * 0.025314478203654289f; + x *= X; + s += x * 0.0059584137052297592f; + + return s; +} + +static vg_lite_error_t _set_point_tangent( + vg_lite_path_point_ptr Point, + vg_lite_float_t Dx, + vg_lite_float_t Dy +) +{ + if(!Point) + return VG_LITE_INVALID_ARGUMENT; + + if(Dx == 0.0f) { + if(Dy == 0.0f) { + if(Point->prev) { + Point->length = 0.0f; + Point->tangentX = Point->prev->tangentX; + Point->tangentY = Point->prev->tangentY; + } + else { + Point->length = 0.0f; + Point->tangentX = 0.0f; + Point->tangentY = 0.0f; + } + } + else { + Point->tangentX = 0.0f; + if(Dy > 0.0f) { + Point->length = Dy; + Point->tangentY = 1.0f; + } + else { + Point->length = -Dy; + Point->tangentY = -1.0f; + } + } + } + else if(Dy == 0.0f) { + Point->tangentY = 0.0f; + if(Dx > 0.0f) { + Point->length = Dx; + Point->tangentX = 1.0f; + } + else { + Point->length = -Dx; + Point->tangentX = -1.0f; + } + } + else { + vg_lite_float_t l, tx, ty; + + vg_lite_float_t dx, dy; + vg_lite_float_t t, t2; + + dx = (Dx >= 0.0f ? Dx : -Dx); + dy = (Dy >= 0.0f ? Dy : -Dy); + if(dx >= dy) { + t = dy / dx; + t2 = t * t; + l = _Sqrt(t2); + Point->length = l * dx; + + tx = 1.0f / l; + ty = tx * t; + } + else { + t = dx / dy; + t2 = t * t; + l = _Sqrt(t2); + Point->length = l * dy; + + ty = 1.0f / l; + tx = ty * t; + } + if(Dx < 0.0f) tx = -tx; + if(Dy < 0.0f) ty = -ty; + + tx = CLAMP(tx, -1.0f, 1.0f); + ty = CLAMP(ty, -1.0f, 1.0f); + Point->tangentX = tx; + Point->tangentY = ty; + } + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t _add_point_to_point_list_wdelta( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t X, + vg_lite_float_t Y, + vg_lite_float_t DX, + vg_lite_float_t DY, + uint8_t flatten_flag +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_path_point_ptr last_point; + vg_lite_path_point_ptr point; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + last_point = stroke_conversion->path_end; + point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*point)); + if(!point) + return VG_LITE_OUT_OF_RESOURCES; + + memset(point, 0, sizeof(*point)); + + point->x = X; + point->y = Y; + point->flatten_flag = flatten_flag; + + /* Calculate tangent for last_point. */ + VG_LITE_ERROR_HANDLER(_set_point_tangent(last_point, DX, DY)); + + last_point->next = point; + stroke_conversion->path_end = point; + point->prev = last_point; + stroke_conversion->point_count++; + + stroke_conversion->cur_list->path_end = point; + stroke_conversion->cur_list->point_count++; + + return error; + +ErrorHandler: + vg_lite_os_free(point); + point = NULL; + return error; +} + +static vg_lite_error_t _create_new_point_list( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t X, + vg_lite_float_t Y, + uint8_t flatten_flag +) +{ + vg_lite_error_t status = VG_LITE_SUCCESS; + vg_lite_path_point_ptr point; + vg_lite_path_list_ptr path_list_divide; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*point)); + if(!point) + return VG_LITE_OUT_OF_RESOURCES; + memset(point, 0, sizeof(*point)); + + point->x = X; + point->y = Y; + point->flatten_flag = flatten_flag; + point->prev = NULL; + stroke_conversion->point_count = 0; + + stroke_conversion->path_end = stroke_conversion->path_points = point; + stroke_conversion->point_count++; + + path_list_divide = (vg_lite_path_list_ptr)vg_lite_os_malloc(sizeof(*path_list_divide)); + if(!path_list_divide) + return VG_LITE_OUT_OF_RESOURCES; + memset(path_list_divide, 0, sizeof(*path_list_divide)); + + path_list_divide->path_end = path_list_divide->path_points = point; + path_list_divide->point_count++; + + if(stroke_conversion->cur_list == NULL) { + stroke_conversion->cur_list = path_list_divide; + stroke_conversion->path_list_divide = path_list_divide; + } + else { + stroke_conversion->cur_list->next = path_list_divide; + stroke_conversion->cur_list = stroke_conversion->cur_list->next; + } + + return status; +} + +static vg_lite_error_t _add_point_to_point_list( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t X, + vg_lite_float_t Y, + uint8_t flatten_flag +) +{ + vg_lite_error_t status = VG_LITE_SUCCESS; + vg_lite_path_point_ptr last_point; + vg_lite_path_point_ptr point; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + last_point = stroke_conversion->path_end; + if(last_point == NULL) { + point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*point)); + if(!point) + return VG_LITE_OUT_OF_RESOURCES; + memset(point, 0, sizeof(*point)); + + point->x = X; + point->y = Y; + point->flatten_flag = flatten_flag; + point->prev = NULL; + stroke_conversion->path_end = stroke_conversion->path_points = point; + stroke_conversion->point_count++; + status = VG_LITE_SUCCESS; + } + else { + vg_lite_float_t dX = X - last_point->x; + vg_lite_float_t dY = Y - last_point->y; + vg_lite_float_t deltaX = (dX >= 0.0f ? dX : -dX); + vg_lite_float_t deltaY = (dY >= 0.0f ? dY : -dY); + + /* Check for degenerated line. */ + if(deltaX == 0.0f && deltaY == 0.0f) { + /* Skip degenerated line. */ + status = VG_LITE_SUCCESS; + goto ErrorHandler; + } + if(deltaX < FLOAT_EPSILON && deltaY < FLOAT_EPSILON) { + vg_lite_float_t ratioX, ratioY; + + if(deltaX == 0.0f) { + ratioX = 0.0f; + } + else if(X == 0.0f) { + ratioX = deltaX; + } + else { + ratioX = deltaX / X; + if(ratioX < 0.0f) ratioX = -ratioX; + } + if(deltaY == 0.0f) { + ratioY = 0.0f; + } + else if(Y == 0.0f) { + ratioY = deltaY; + } + else { + ratioY = deltaY / Y; + if(ratioY < 0.0f) ratioY = -ratioY; + } + if(ratioX < 1.0e-6f && ratioY < 1.0e-6f) { + /* Skip degenerated line. */ + status = VG_LITE_SUCCESS; + goto ErrorHandler; + } + } + + status = _add_point_to_point_list_wdelta(stroke_conversion, X, Y, dX, dY, flatten_flag); + } + +ErrorHandler: + return status; +} + +#define gcFEATURE_VG_SIMPLYFIED_BEZIER 1 + +#if gcFEATURE_VG_SIMPLYFIED_BEZIER +void quad_bezier(float * x, float * y, const float curve[6], float t) +{ + const float * v0, * v1, * v2; + float mt, t2, mt2, res[2]; + + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + + mt = 1 - t; + t2 = t * t; + mt2 = mt * mt; + + for(uint8_t i = 0; i < 2; ++i) { + res[i] = v0[i] * mt2 + 2 * v1[i] * mt * t + v2[i] * t2; + } + + *x = res[0]; + *y = res[1]; +} + +void cubic_bezier(float * x, float * y, const float curve[8], float t) +{ + const float * v0, * v1, * v2, * v3; + float mt, t2, mt2, t3, mt3, res[2]; + + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + v3 = &curve[6]; + + mt = 1 - t; + t2 = t * t; + t3 = t2 * t; + mt2 = mt * mt; + mt3 = mt2 * mt; + + for(uint8_t i = 0; i < 2; ++i) { + res[i] = v0[i] * mt3 + 3 * v1[i] * mt2 * t + 3 * v2[i] * mt * t2 + v3[i] * t3; + } + + *x = res[0]; + *y = res[1]; +} + +void pointer_warp_affine(float out[2], float pt[2], vg_lite_matrix_t * matrix) +{ + float x, y; + + x = pt[0]; + y = pt[1]; + + out[0] = matrix->m[0][0] * x + matrix->m[1][0] * y + matrix->m[2][0]; + out[1] = matrix->m[0][1] * x + matrix->m[1][1] * y + matrix->m[2][1]; +} + +void get_aligned_quad(float out[6], float curve[6]) +{ + float * v0, * v1, * v2; + float angle, dx, dy; + vg_lite_matrix_t matrix; + + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + + dx = v2[0] - v0[0]; + dy = v2[1] - v0[1]; + angle = (dy >= 0) ? acosf(dx / sqrtf(dx * dx + dy * dy)) : (2 * 3.1415926535f - acosf(dx / sqrtf(dx * dx + dy * dy))); + + vg_lite_identity(&matrix); + vg_lite_translate(-v0[0], -v0[1], &matrix); + vg_lite_rotate(-angle, &matrix); + + pointer_warp_affine(&out[0], v0, &matrix); + pointer_warp_affine(&out[2], v1, &matrix); + pointer_warp_affine(&out[4], v2, &matrix); +} + +void get_aligned_cubic(float out[8], float curve[8]) +{ + float * v0, * v1, * v2, * v3; + float angle, dx, dy; + vg_lite_matrix_t matrix; + + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + v3 = &curve[6]; + + dx = v3[0] - v0[0]; + dy = v3[1] - v0[1]; + angle = (dy >= 0) ? acosf(dx / sqrtf(dx * dx + dy * dy)) : (2 * 3.1415926535f - acosf(dx / sqrtf(dx * dx + dy * dy))); + + vg_lite_identity(&matrix); + vg_lite_translate(-v0[0], -v0[1], &matrix); + vg_lite_rotate(-angle, &matrix); + + pointer_warp_affine(&out[0], v0, &matrix); + pointer_warp_affine(&out[2], v1, &matrix); + pointer_warp_affine(&out[4], v2, &matrix); + pointer_warp_affine(&out[6], v3, &matrix); +} + +void split_quad(float out1[6], float out2[6], float curve[6], float split) +{ + float * v0, * v1, * v2; + float s, s2, ms, ms2; + + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + + s = split; + ms = 1 - split; + s2 = s * s; + ms2 = ms * ms; + + float B[2][3] = { + {v0[0], v1[0], v2[0]}, + {v0[1], v1[1], v2[1]} + }; + + /* First curve */ + { + float C[2][3] = { {0} }; + float A[9] = { + 1, 0, 0, + ms, s, 0, + ms2, 2 * ms * s, s2 + }; + /* C = A �� B */ + for(uint8_t i = 0; i < 2; ++i) { + for(size_t y = 0; y < 3; ++y) + for(size_t x = 0; x < 1; ++x) + for(size_t z = 0; z < 3; ++z) { + C[i][x + y * 1] += A[z + y * 3] * B[i][x + z * 1]; + } + } + + out1[0] = C[0][0]; + out1[1] = C[1][0]; + out1[2] = C[0][1]; + out1[3] = C[1][1]; + out1[4] = C[0][2]; + out1[5] = C[1][2]; + } + + /* Second curve */ + { + float C[2][3] = { {0} }; + float A[9] = { + ms2, 2 * s * ms, s2, + 0, ms, s, + 0, 0, 1 + }; + /* C = A �� B */ + for(uint8_t i = 0; i < 2; ++i) { + for(size_t y = 0; y < 3; ++y) + for(size_t x = 0; x < 1; ++x) + for(size_t z = 0; z < 3; ++z) { + C[i][x + y * 1] += A[z + y * 3] * B[i][x + z * 1]; + } + } + + out2[0] = C[0][0]; + out2[1] = C[1][0]; + out2[2] = C[0][1]; + out2[3] = C[1][1]; + out2[4] = C[0][2]; + out2[5] = C[1][2]; + } +} + +void split_cubic(float out1[8], float out2[8], float curve[8], float split) +{ + float * v0, * v1, * v2, * v3; + float s, s2, s3, ms, ms2, ms3; + + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + v3 = &curve[6]; + + s = split; + ms = 1 - split; + s2 = s * s; + ms2 = ms * ms; + s3 = s2 * s; + ms3 = ms2 * ms; + + float B[2][4] = { + {v0[0], v1[0], v2[0], v3[0]}, + {v0[1], v1[1], v2[1], v3[1]} + }; + + /* First curve */ + { + float C[2][4] = { {0} }; + float A[16] = { + 1, 0, 0, 0, + ms, s, 0, 0, + ms2, 2 * ms * s, s2, 0, + ms3, 3 * s * ms2, 3 * s2 * ms, s3 + }; + /* C = A �� B */ + for(uint8_t i = 0; i < 2; ++i) { + for(size_t y = 0; y < 4; ++y) + for(size_t x = 0; x < 1; ++x) + for(size_t z = 0; z < 4; ++z) { + C[i][x + y * 1] += A[z + y * 4] * B[i][x + z * 1]; + } + } + + out1[0] = C[0][0]; + out1[1] = C[1][0]; + out1[2] = C[0][1]; + out1[3] = C[1][1]; + out1[4] = C[0][2]; + out1[5] = C[1][2]; + out1[6] = C[0][3]; + out1[7] = C[1][3]; + } + + /* Second curve */ + { + float C[2][4] = { {0} }; + float A[16] = { + ms3, 3 * s * ms2, 3 * s2 * ms, s3, + 0, ms2, 2 * ms * s, s2, + 0, 0, ms, s, + 0, 0, 0, 1 + }; + /* C = A �� B */ + for(uint8_t i = 0; i < 2; ++i) { + for(size_t y = 0; y < 4; ++y) + for(size_t x = 0; x < 1; ++x) + for(size_t z = 0; z < 4; ++z) { + C[i][x + y * 1] += A[z + y * 4] * B[i][x + z * 1]; + } + } + + out2[0] = C[0][0]; + out2[1] = C[1][0]; + out2[2] = C[0][1]; + out2[3] = C[1][1]; + out2[4] = C[0][2]; + out2[5] = C[1][2]; + out2[6] = C[0][3]; + out2[7] = C[1][3]; + } +} +#if (CHIPID != 0x265) +static vg_lite_error_t _flatten_quad_bezier( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t rootCurve[6], + vg_lite_float_t subCurve[6], + vg_lite_uint8_t level) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + float * v0, * v1, * v2; + float dx2, dy2, d1; + float subCurve1[6], subCurve2[6]; + vg_lite_path_point_ptr point0, point1; + vg_lite_float_t * curve; + curve = (level == 0) ? rootCurve : subCurve; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + if(level > 10) return error; + + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + + if(level == 0) { + /* Add extra P0 for incoming tangent. */ + point0 = stroke_conversion->path_end; + /* First add P1 to calculate incoming tangent, which is saved in P0. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v1[0], v1[1], vgcFLATTEN_START)); + + point1 = stroke_conversion->path_end; + /* Change the point1's coordinates back to P0. */ + point1->x = v0[0]; + point1->y = v0[1]; + point0->length = 0.0f; + } + + dx2 = v2[0] - v0[0]; + dy2 = v2[1] - v0[1]; + d1 = fabsf((v1[0] - v2[0]) * dy2 - (v1[1] - v2[1]) * dx2); + + if(d1 * d1 < 0.25 * (dx2 * dx2 + dy2 * dy2)) { + float bound[4]; + + bound[0] = MIN(v0[0], v2[0]); + bound[1] = MIN(v0[1], v2[1]); + bound[2] = MAX(v0[0], v2[0]); + bound[3] = MAX(v0[1], v2[1]); + + if(!(v1[0] >= bound[0] && v1[0] <= bound[2] && v1[1] >= bound[1] && v1[1] <= bound[3])) { + /* Compute root. */ + float alignedCurve[6]; + float d, n, t, pt[2]; + + get_aligned_quad(alignedCurve, curve); + + n = alignedCurve[0] - alignedCurve[2]; + d = alignedCurve[0] - 2.f * alignedCurve[2] + alignedCurve[4]; + if(fabsf(d) > 1e-12f) { + t = n / d; + if(t > 1e-12f && t < 1.f - 1e-12f) { + quad_bezier(&pt[0], &pt[1], curve, t); + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, pt[0], pt[1], vgcFLATTEN_MIDDLE)); + } + } + } + else if(level == 0) { + float pt[2]; + uint8_t n = 16; + for(uint8_t i = 1; i < n; i++) { + vg_lite_float_t t = (vg_lite_float_t)i / (vg_lite_float_t)n; + quad_bezier(&pt[0], &pt[1], curve, t); + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, pt[0], pt[1], vgcFLATTEN_MIDDLE)); + } + } + if(level == 0) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_END)); + } + else if((v2[0] != rootCurve[4]) || (v2[1] != rootCurve[5])) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_MIDDLE)); + } + if(level == 0) { + /* Add extra P2 for outgoing tangent. */ + /* First change P2(point0)'s coordinates to P1. */ + point0 = stroke_conversion->path_end; + point0->x = v1[0]; + point0->y = v1[1]; + + /* Add P2 to calculate outgoing tangent. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_NO)); + + point1 = stroke_conversion->path_end; + + /* Change point0's coordinates back to P2. */ + point0->x = v2[0]; + point0->y = v2[1]; + point0->length = 0.0f; + } + return error; + } + + split_quad(subCurve1, subCurve2, curve, 0.5); + VG_LITE_ERROR_HANDLER(_flatten_quad_bezier(stroke_conversion, rootCurve, subCurve1, level + 1)); + VG_LITE_ERROR_HANDLER(_flatten_quad_bezier(stroke_conversion, rootCurve, subCurve2, level + 1)); + if(level == 0) { + /* Add point 2 separately to avoid cumulative errors. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_END)); + + /* Add extra P2 for outgoing tangent. */ + /* First change P2(point0)'s coordinates to P1. */ + point0 = stroke_conversion->path_end; + point0->x = v1[0]; + point0->y = v1[1]; + + /* Add P2 to calculate outgoing tangent. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_NO)); + + point1 = stroke_conversion->path_end; + + /* Change point0's coordinates back to P2. */ + point0->x = v2[0]; + point0->y = v2[1]; + point0->length = 0.0f; + } +ErrorHandler: + return error; +} +#else +static vg_lite_error_t _flatten_quad_bezier_original( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t curve[6], + vg_lite_uint8_t level) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + float * v0, * v1, * v2; + float dx2, dy2, d1; + float subCurve1[6], subCurve2[6]; + vg_lite_path_point_ptr point0, point1; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + if(level > 10) return error; + + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + + if(level == 0) { + /* Add extra P0 for incoming tangent. */ + point0 = stroke_conversion->path_end; + /* First add P1 to calculate incoming tangent, which is saved in P0. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v1[0], v1[1], vgcFLATTEN_NO)); + + point1 = stroke_conversion->path_end; + /* Change the point1's coordinates back to P0. */ + point1->x = v0[0]; + point1->y = v0[1]; + point0->length = 0.0f; + } + + dx2 = v2[0] - v0[0]; + dy2 = v2[1] - v0[1]; + d1 = fabsf((v1[0] - v2[0]) * dy2 - (v1[1] - v2[1]) * dx2); + + if(d1 * d1 < 0.25 * (dx2 * dx2 + dy2 * dy2)) { + float bound[4]; + + bound[0] = MIN(v0[0], v2[0]); + bound[1] = MIN(v0[1], v2[1]); + bound[2] = MAX(v0[0], v2[0]); + bound[3] = MAX(v0[1], v2[1]); + + if(!(v1[0] >= bound[0] && v1[0] <= bound[2] && v1[1] >= bound[1] && v1[1] <= bound[3])) { + /* Compute root. */ + float alignedCurve[6]; + float d, n, t, pt[2]; + + get_aligned_quad(alignedCurve, curve); + + n = alignedCurve[0] - alignedCurve[2]; + d = alignedCurve[0] - 2.f * alignedCurve[2] + alignedCurve[4]; + if(fabsf(d) > 1e-12f) { + t = n / d; + if(t > 1e-12f && t < 1.f - 1e-12f) { + quad_bezier(&pt[0], &pt[1], curve, t); + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, pt[0], pt[1], vgcFLATTEN_NO)); + } + } + } + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_NO)); + return error; + } + + split_quad(subCurve1, subCurve2, curve, 0.5); + VG_LITE_ERROR_HANDLER(_flatten_quad_bezier_original(stroke_conversion, subCurve1, level + 1)); + VG_LITE_ERROR_HANDLER(_flatten_quad_bezier_original(stroke_conversion, subCurve2, level + 1)); + if(level == 0) { + /* Add point 2 separately to avoid cumulative errors. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_NO)); + + /* Add extra P2 for outgoing tangent. */ + /* First change P2(point0)'s coordinates to P1. */ + point0 = stroke_conversion->path_end; + point0->x = v1[0]; + point0->y = v1[1]; + + /* Add P2 to calculate outgoing tangent. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_NO)); + + point1 = stroke_conversion->path_end; + + /* Change point0's coordinates back to P2. */ + point0->x = v2[0]; + point0->y = v2[1]; + point0->length = 0.0f; + } +ErrorHandler: + return error; +} +#endif + +#if (CHIPID != 0x265) +static vg_lite_error_t _flatten_cubic_bezier( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t rootCurve[8], + vg_lite_float_t subCurve[8], + vg_lite_uint8_t level) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + float * v0, * v1, * v2, * v3; + float dx3, dy3, d1, d2; + float subCurve1[8], subCurve2[8]; + vg_lite_path_point_ptr point0, point1; + vg_lite_float_t * curve; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + if(level > 10) return error; + + curve = (level == 0) ? rootCurve : subCurve; + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + v3 = &curve[6]; + + if(level == 0) { + /* Add extra P0 for incoming tangent. */ + point0 = stroke_conversion->path_end; + /* First add P1/P2/P3 to calculate incoming tangent, which is saved in P0. */ + if(v0[0] != v1[0] || v0[1] != v1[1]) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v1[0], v1[1], vgcFLATTEN_START)); + } + else if(v0[0] != v2[0] || v0[1] != v2[1]) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_START)); + } + else { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_START)); + } + point1 = stroke_conversion->path_end; + /* Change the point1's coordinates back to P0. */ + point1->x = v0[0]; + point1->y = v0[1]; + point0->length = 0.0f; + } + + dx3 = v3[0] - v0[0]; + dy3 = v3[1] - v0[1]; + d1 = fabsf((v1[0] - v3[0]) * dy3 - (v1[1] - v3[1]) * dx3); + d2 = fabsf((v2[0] - v3[0]) * dy3 - (v2[1] - v3[1]) * dx3); + + if((d1 + d2) * (d1 + d2) < 0.25f * (dx3 * dx3 + dy3 * dy3)) { + float bound[4]; + + bound[0] = MIN(v0[0], v3[0]); + bound[1] = MIN(v0[1], v3[1]); + bound[2] = MAX(v0[0], v3[0]); + bound[3] = MAX(v0[1], v3[1]); + if(!(v1[0] >= bound[0] && v1[0] <= bound[2] && v1[1] >= bound[1] && v1[1] <= bound[3]) || + !(v2[0] >= bound[0] && v2[0] <= bound[2] && v2[1] >= bound[1] && v2[1] <= bound[3])) { + /* Compute root. */ + float alignedCurve[8]; + float a, b, c, b2ac, root[2], t, pt[2]; + uint8_t rootNum; + + get_aligned_cubic(alignedCurve, curve); + + a = -3.f * alignedCurve[0] + 9.f * alignedCurve[2] - 9.f * alignedCurve[4] + 3.f * alignedCurve[6]; + b = 6.f * alignedCurve[0] - 12.f * alignedCurve[2] + 6.f * alignedCurve[4]; + c = -3.f * alignedCurve[0] + 3.f * alignedCurve[2]; + rootNum = 0; + if(fabs(a) < 1e-12f) { // linear solution + t = -c / b; + if(t > 1e-12f && t < 1.f - 1e-12f) + root[rootNum++] = t; + } + else { // quadtratic solution + b2ac = b * b - 4.f * a * c; + if(b2ac > 1e-12f) { + t = (-b + (float)sqrt(b2ac)) / (2.f * a); + if(t > 1e-12f && t < 1.f - 1e-12f) + root[rootNum++] = t; + t = (-b - (float)sqrt(b2ac)) / (2.f * a); + if(t > 1e-12f && t < 1.f - 1e-12f) + root[rootNum++] = t; + } + } + if(rootNum == 2 && root[0] > root[1]) { + /* Exchange root. */ + float tmp; + tmp = root[0]; + root[0] = root[1]; + root[1] = tmp; + } + if((rootNum <= 2) && (level == 0)) { + float pt[2]; + uint8_t n = 8; + if(rootNum == 2) { + float step = (root[1] - root[0]) / 8; + float t = root[0]; + while(t < root[1]) { + cubic_bezier(&pt[0], &pt[1], curve, t); + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, pt[0], pt[1], vgcFLATTEN_MIDDLE)); + t += step; + } + } + else { + for(uint8_t i = 1; i < n; i++) { + vg_lite_float_t t = (vg_lite_float_t)i / (vg_lite_float_t)n; + cubic_bezier(&pt[0], &pt[1], curve, t); + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, pt[0], pt[1], vgcFLATTEN_MIDDLE)); + } + } + } + else { + for(uint8_t i = 0; i < rootNum; i++) { + cubic_bezier(&pt[0], &pt[1], curve, root[i]); + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, pt[0], pt[1], vgcFLATTEN_MIDDLE)); + } + } + } + else if(level == 0) { + vg_lite_float_t a1x, a1y, a2x, a2y, a3x, a3y; + vg_lite_float_t ddf0, ddf1, t1, t2, upper_bound; + vg_lite_uint32_t n; + vg_lite_float_t pt[2]; + a1x = 3 * (v1[0] - v0[0]); + a1y = 3 * (v1[1] - v0[1]); + a2x = 3 * (v0[0] - v1[0] - v1[0] + v2[0]); + a2y = 3 * (v0[1] - v1[1] - v1[1] + v2[1]); + a3x = 3 * (v1[0] - v2[0]) + v3[0] - v0[0]; + a3y = 3 * (v1[1] - v2[1]) + v3[1] - v0[1]; + + ddf0 = a2x * a2x + a2y * a2y; + t1 = a2x + a3x + a3x + a3x; + t2 = a2y + a3y + a3y + a3y; + ddf1 = t1 * t1 + t2 * t2; + upper_bound = ddf0 > ddf1 ? ddf0 : ddf1; + upper_bound = SQRTF(upper_bound); + upper_bound += upper_bound; + upper_bound = SQRTF(upper_bound); + if(stroke_conversion->fattened) { + upper_bound *= stroke_conversion->line_width; + } + n = (vg_lite_uint32_t)ceil(upper_bound); + + if(n == 0 || n > 64) { + n = (vg_lite_uint8_t)(64 / (level + 1)); + } + for(vg_lite_uint32_t i = 1; i < n; i++) { + vg_lite_float_t t = (vg_lite_float_t)i / (vg_lite_float_t)n; + cubic_bezier(&pt[0], &pt[1], curve, t); + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, pt[0], pt[1], vgcFLATTEN_MIDDLE)); + } + } + + if(level == 0) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_END)); + } + else { + vg_lite_float_t pt[2], t; + for(int i = 1; i < 4; i++) { + t = (vg_lite_float_t)i / 4; + cubic_bezier(&pt[0], &pt[1], curve, t); + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, pt[0], pt[1], vgcFLATTEN_MIDDLE)); + } + if((v3[0] != rootCurve[6]) || (v3[1] != rootCurve[7])) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_MIDDLE)); + } + } + + /* Add extra P3 for outgoing tangent. */ + /* First change P3(point0)'s coordinates to P0/P1/P2. */ + if(level == 0) { + point0 = stroke_conversion->path_end; + if(v3[0] != v2[0] || v3[1] != v2[1]) { + point0->x = v2[0]; + point0->y = v2[1]; + } + else if(v3[0] != v1[0] || v3[1] != v1[1]) { + point0->x = v1[0]; + point0->y = v1[1]; + } + else { + point0->x = v0[0]; + point0->y = v0[1]; + } + + /* Add P3 to calculate outgoing tangent. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_NO)); + + point1 = stroke_conversion->path_end; + + /* Change point0's coordinates back to P3. */ + point0->x = v3[0]; + point0->y = v3[1]; + point0->length = 0.0f; + } + return error; + } + + split_cubic(subCurve1, subCurve2, curve, 0.5); + VG_LITE_ERROR_HANDLER(_flatten_cubic_bezier(stroke_conversion, rootCurve, subCurve1, level + 1)); + VG_LITE_ERROR_HANDLER(_flatten_cubic_bezier(stroke_conversion, rootCurve, subCurve2, level + 1)); + if(level == 0) { + /* Add point 3 separately to avoid cumulative errors. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_END)); + + /* Add extra P3 for outgoing tangent. */ + /* First change P3(point0)'s coordinates to P0/P1/P2. */ + point0 = stroke_conversion->path_end; + if(v3[0] != v2[0] || v3[1] != v2[1]) { + point0->x = v2[0]; + point0->y = v2[1]; + } + else if(v3[0] != v1[0] || v3[1] != v1[1]) { + point0->x = v1[0]; + point0->y = v1[1]; + } + else { + point0->x = v0[0]; + point0->y = v0[1]; + } + + /* Add P3 to calculate outgoing tangent. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_NO)); + + point1 = stroke_conversion->path_end; + + /* Change point0's coordinates back to P3. */ + point0->x = v3[0]; + point0->y = v3[1]; + point0->length = 0.0f; + } +ErrorHandler: + return error; +} +#else +static vg_lite_error_t _flatten_cubic_bezier_original( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t curve[8], + vg_lite_uint8_t level) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + float * v0, * v1, * v2, * v3; + float dx3, dy3, d1, d2; + float subCurve1[8], subCurve2[8]; + vg_lite_path_point_ptr point0, point1; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + if(level > 10) return error; + + v0 = &curve[0]; + v1 = &curve[2]; + v2 = &curve[4]; + v3 = &curve[6]; + + if(level == 0) { + /* Add extra P0 for incoming tangent. */ + point0 = stroke_conversion->path_end; + /* First add P1/P2/P3 to calculate incoming tangent, which is saved in P0. */ + if(v0[0] != v1[0] || v0[1] != v1[1]) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v1[0], v1[1], vgcFLATTEN_NO)); + } + else if(v0[0] != v2[0] || v0[1] != v2[1]) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v2[0], v2[1], vgcFLATTEN_NO)); + } + else { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_NO)); + } + point1 = stroke_conversion->path_end; + /* Change the point1's coordinates back to P0. */ + point1->x = v0[0]; + point1->y = v0[1]; + point0->length = 0.0f; + } + + dx3 = v3[0] - v0[0]; + dy3 = v3[1] - v0[1]; + d1 = fabsf((v1[0] - v3[0]) * dy3 - (v1[1] - v3[1]) * dx3); + d2 = fabsf((v2[0] - v3[0]) * dy3 - (v2[1] - v3[1]) * dx3); + + if((d1 + d2) * (d1 + d2) < 0.25f * (dx3 * dx3 + dy3 * dy3)) { + float bound[4]; + + bound[0] = MIN(v0[0], v3[0]); + bound[1] = MIN(v0[1], v3[1]); + bound[2] = MAX(v0[0], v3[0]); + bound[3] = MAX(v0[1], v3[1]); + if(!(v1[0] >= bound[0] && v1[0] <= bound[2] && v1[1] >= bound[1] && v1[1] <= bound[3]) || + !(v2[0] >= bound[0] && v2[0] <= bound[2] && v2[1] >= bound[1] && v2[1] <= bound[3])) { + /* Compute root. */ + float alignedCurve[8]; + float a, b, c, b2ac, root[2], t, pt[2]; + uint8_t rootNum; + + get_aligned_cubic(alignedCurve, curve); + + a = -3.f * alignedCurve[0] + 9.f * alignedCurve[2] - 9.f * alignedCurve[4] + 3.f * alignedCurve[6]; + b = 6.f * alignedCurve[0] - 12.f * alignedCurve[2] + 6.f * alignedCurve[4]; + c = -3.f * alignedCurve[0] + 3.f * alignedCurve[2]; + rootNum = 0; + if(fabs(a) < 1e-12f) { // linear solution + t = -c / b; + if(t > 1e-12f && t < 1.f - 1e-12f) + root[rootNum++] = t; + } + else { // quadtratic solution + b2ac = b * b - 4.f * a * c; + if(b2ac > 1e-12f) { + t = (-b + (float)sqrt(b2ac)) / (2.f * a); + if(t > 1e-12f && t < 1.f - 1e-12f) + root[rootNum++] = t; + t = (-b - (float)sqrt(b2ac)) / (2.f * a); + if(t > 1e-12f && t < 1.f - 1e-12f) + root[rootNum++] = t; + } + } + + if(rootNum == 2 && root[0] > root[1]) { + /* Exchange root. */ + float tmp; + tmp = root[0]; + root[0] = root[1]; + root[1] = tmp; + } + + for(uint8_t i = 0; i < rootNum; ++i) { + cubic_bezier(&pt[0], &pt[1], curve, root[i]); + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, pt[0], pt[1], vgcFLATTEN_NO)); + } + } + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_NO)); + return error; + } + + split_cubic(subCurve1, subCurve2, curve, 0.5); + VG_LITE_ERROR_HANDLER(_flatten_cubic_bezier_original(stroke_conversion, subCurve1, level + 1)); + VG_LITE_ERROR_HANDLER(_flatten_cubic_bezier_original(stroke_conversion, subCurve2, level + 1)); + if(level == 0) { + /* Add point 3 separately to avoid cumulative errors. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_NO)); + + /* Add extra P3 for outgoing tangent. */ + /* First change P3(point0)'s coordinates to P0/P1/P2. */ + point0 = stroke_conversion->path_end; + if(v3[0] != v2[0] || v3[1] != v2[1]) { + point0->x = v2[0]; + point0->y = v2[1]; + } + else if(v3[0] != v1[0] || v3[1] != v1[1]) { + point0->x = v1[0]; + point0->y = v1[1]; + } + else { + point0->x = v0[0]; + point0->y = v0[1]; + } + + /* Add P3 to calculate outgoing tangent. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, v3[0], v3[1], vgcFLATTEN_NO)); + + point1 = stroke_conversion->path_end; + + /* Change point0's coordinates back to P3. */ + point0->x = v3[0]; + point0->y = v3[1]; + point0->length = 0.0f; + } +ErrorHandler: + return error; +} +#endif +#else +static vg_lite_error_t +_flatten_quad_bezier( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t X0, + vg_lite_float_t Y0, + vg_lite_float_t X1, + vg_lite_float_t Y1, + vg_lite_float_t X2, + vg_lite_float_t Y2 +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t n; + vg_lite_path_point_ptr point0, point1; + vg_lite_float_t x, y; + vg_lite_float_t a1x, a1y, a2x, a2y; + vg_lite_float_t f1, f2, t1, t2, upper_bound; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + /* Formula. + * f(t) = (1 - t)^2 * p0 + 2 * t * (1 - t) * p1 + t^2 * p2 + * = a0 + a1 * t + a2 * t^2 + * a0 = p0 + * a1 = 2 * (-p0 + p1) + * a2 = p0 - 2 * p1 + p2 + */ + x = X1 - X0; + a1x = x + x; + y = Y1 - Y0; + a1y = y + y; + a2x = X0 - X1 - X1 + X2; + a2y = Y0 - Y1 - Y1 + Y2; + + /* Step 1: Calculate N. */ + /* Lefan's method. */ + /* dist(t) = ... + * t2 = ... + * if 0 <= t2 <= 1 + * upper_bound = dist(t2) + * else + * upper_bound = max(dist(0), dist(1)) + * N = ceil(sqrt(upper_bound / epsilon / 8)) + */ + /* Prepare dist(t). */ + f1 = a1x * a2y - a2x * a1y; + if(f1 != 0.0f) { + if(f1 < 0.0f) f1 = -f1; + + /* Calculate t2. */ + t1 = a2x * a2x + a2y * a2y; + t2 = -(x * a2x + y * a2y) / t1; + /* Calculate upper_bound. */ + if(t2 >= 0.0f && t2 <= 1.0f) { + f2 = x + a2x * t2; + f2 *= f2; + t1 = y + a2y * t2; + t1 *= t1; + upper_bound = t1 + f2; + } + else { + f2 = x + a2x; + f2 *= f2; + t1 = y + a2y; + t1 *= t1; + t2 = t1 + f2; + t1 = x * x + y * y; + upper_bound = t1 < t2 ? t1 : t2; + } + /* Calculate n. */ + upper_bound = f1 / SQRTF(upper_bound); + upper_bound = SQRTF(upper_bound); + if(stroke_conversion->fattened) { + upper_bound *= stroke_conversion->line_width; + } + n = (uint32_t) ceil(upper_bound); + } + else { + /* n = 0 => n = 256. */ + n = 256; + } + + if(n == 0 || n > 256) { + n = 256; + } + + /* Add extra P0 for incoming tangent. */ + point0 = stroke_conversion->path_end; + /* First add P1 to calculate incoming tangent, which is saved in P0. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, X1, Y1, vgcFLATTEN_START)); + + point1 = stroke_conversion->path_end; + /* Change the point1's coordinates back to P0. */ + point1->x = X0; + point1->y = Y0; + point0->length = 0.0f; + + if(n > 1) { + vg_lite_float_t d, dsquare, dx, dy, ddx, ddy; + vg_lite_float_t ratioX, ratioY; + uint32_t i; + + /* Step 2: Calculate deltas. */ + /* Df(t) = f(t + d) - f(t) + * = a1 * d + a2 * d^2 + 2 * a2 * d * t + * DDf(t) = Df(t + d) - Df(t) + * = 2 * a2 * d^2 + * f(0) = a0 + * Df(0) = a1 * d + a2 * d^2 + * DDf(0) = 2 * a2 * d^2 + */ + d = 1.0f / (vg_lite_float_t) n; + dsquare = d * d; + ddx = a2x * dsquare; + ddy = a2y * dsquare; + dx = a1x * d + ddx; + dy = a1y * d + ddy; + ddx += ddx; + ddy += ddy; + + /* Step 3: Add points. */ + ratioX = dx / X0; + if(ratioX < 0.0f) ratioX = -ratioX; + ratioY = dy / Y0; + if(ratioY < 0.0f) ratioY = -ratioY; + if(ratioX > 1.0e-6f && ratioY > 1.0e-6f) { + x = X0; + y = Y0; + for(i = 1; i < n; i++) { + x += dx; + y += dy; + + /* Add a point to subpath. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list_wdelta(stroke_conversion, x, y, dx, dy, vgcFLATTEN_MIDDLE)); + + dx += ddx; + dy += ddy; + } + + } + else { + for(i = 1; i < n; i++) { + vg_lite_float_t t = (vg_lite_float_t) i / (vg_lite_float_t) n; + vg_lite_float_t u = 1.0f - t; + vg_lite_float_t a0 = u * u; + vg_lite_float_t a1 = 2.0f * t * u; + vg_lite_float_t a2 = t * t; + + x = a0 * X0 + a1 * X1 + a2 * X2; + y = a0 * Y0 + a1 * Y1 + a2 * Y2; + + /* Add a point to subpath. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, x, y, vgcFLATTEN_MIDDLE)); + } + } + } + + /* Add point 2 separately to avoid cumulative errors. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, X2, Y2, vgcFLATTEN_END)); + + /* Add extra P2 for outgoing tangent. */ + /* First change P2(point0)'s coordinates to P1. */ + point0 = stroke_conversion->path_end; + point0->x = X1; + point0->y = Y1; + + /* Add P2 to calculate outgoing tangent. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, X2, Y2, vgcFLATTEN_NO)); + + point1 = stroke_conversion->path_end; + + /* Change point0's coordinates back to P2. */ + point0->x = X2; + point0->y = Y2; + point0->length = 0.0f; + +ErrorHandler: + return error; +} + +static vg_lite_error_t +_flatten_cubic_bezier( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t X0, + vg_lite_float_t Y0, + vg_lite_float_t X1, + vg_lite_float_t Y1, + vg_lite_float_t X2, + vg_lite_float_t Y2, + vg_lite_float_t X3, + vg_lite_float_t Y3 +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t n; + vg_lite_path_point_ptr point0, point1; + vg_lite_float_t x, y; + vg_lite_float_t a1x, a1y, a2x, a2y, a3x, a3y; + vg_lite_float_t ddf0, ddf1, t1, t2, upper_bound; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + /* Formula. + * f(t) = (1 - t)^3 * p0 + 3 * t * (1 - t)^2 * p1 + 3 * t^2 * (1 - t) * p2 + t^3 * p3 + * = a0 + a1 * t + a2 * t^2 + a3 * t^3 + */ + x = X1 - X0; + a1x = x + x + x; + y = Y1 - Y0; + a1y = y + y + y; + x = X0 - X1 - X1 + X2; + a2x = x + x + x; + y = Y0 - Y1 - Y1 + Y2; + a2y = y + y + y; + x = X1 - X2; + a3x = x + x + x + X3 - X0; + y = Y1 - Y2; + a3y = y + y + y + Y3 - Y0; + + /* Step 1: Calculate N. */ + /* Lefan's method. */ + /* df(t)/dt = a1 + 2 * a2 * t + 3 * a3 * t^2 + * d2f(t)/dt2 = 2 * a2 + 6 * a3 * t + * N = ceil(sqrt(max(ddfx(0)^2 + ddfy(0)^2, ddfx(1)^2 + ddyf(1)^2) / epsilon / 8)) + */ + + ddf0 = a2x * a2x + a2y * a2y; + t1 = a2x + a3x + a3x + a3x; + t2 = a2y + a3y + a3y + a3y; + ddf1 = t1 * t1 + t2 * t2; + upper_bound = ddf0 > ddf1 ? ddf0 : ddf1; + upper_bound = SQRTF(upper_bound); + upper_bound += upper_bound; + upper_bound = SQRTF(upper_bound); + if(stroke_conversion->fattened) { + upper_bound *= stroke_conversion->line_width; + } + n = (uint32_t) ceil(upper_bound); + + if(n == 0 || n > 256) { + n = 256; + } + + /* Add extra P0 for incoming tangent. */ + point0 = stroke_conversion->path_end; + /* First add P1/P2/P3 to calculate incoming tangent, which is saved in P0. */ + if(X0 != X1 || Y0 != Y1) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, X1, Y1, vgcFLATTEN_START)); + } + else if(X0 != X2 || Y0 != Y2) { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, X2, Y2, vgcFLATTEN_START)); + } + else { + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, X3, Y3, vgcFLATTEN_START)); + } + point1 = stroke_conversion->path_end; + /* Change the point1's coordinates back to P0. */ + point1->x = X0; + point1->y = Y0; + point0->length = 0.0f; + + if(n > 1) { + vg_lite_float_t d, dsquare, dcube, dx, dy, ddx, ddy, dddx, dddy; + vg_lite_float_t ratioX, ratioY; + uint32_t i; + + /* Step 2: Calculate deltas */ + /* Df(t) = f(t + d) - f(t) + * DDf(t) = Df(t + d) - Df(t) + * DDDf(t) = DDf(t + d) - DDf(t) + * f(0) = a0 + * Df(0) = a1 * d + a2 * d^2 + a3 * d^3 + * DDf(0) = 2 * a2 * d^2 + 6 * a3 * d^3 + * DDDf(0) = 6 * a3 * d^3 + */ + d = 1.0f / (vg_lite_float_t) n; + dsquare = d * d; + dcube = dsquare * d; + ddx = a2x * dsquare; + ddy = a2y * dsquare; + dddx = a3x * dcube; + dddy = a3y * dcube; + dx = a1x * d + ddx + dddx; + dy = a1y * d + ddy + dddy; + ddx += ddx; + ddy += ddy; + dddx *= 6.0f; + dddy *= 6.0f; + ddx += dddx; + ddy += dddy; + + /* Step 3: Add points. */ + ratioX = dx / X0; + if(ratioX < 0.0f) ratioX = -ratioX; + ratioY = dy / Y0; + if(ratioY < 0.0f) ratioY = -ratioY; + if(ratioX > 1.0e-6f && ratioY > 1.0e-6f) { + x = X0; + y = Y0; + for(i = 1; i < n; i++) { + x += dx; + y += dy; + + /* Add a point to subpath. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list_wdelta(stroke_conversion, x, y, dx, dy, vgcFLATTEN_MIDDLE)); + dx += ddx; + ddx += dddx; + dy += ddy; + ddy += dddy; + } + } + else { + for(i = 1; i < n; i++) { + vg_lite_float_t t = (vg_lite_float_t) i / (vg_lite_float_t) n; + vg_lite_float_t tSquare = t * t; + vg_lite_float_t tCube = tSquare * t; + vg_lite_float_t a0 = 1.0f - 3.0f * t + 3.0f * tSquare - tCube; + vg_lite_float_t a1 = 3.0f * t - 6.0f * tSquare + 3.0f * tCube; + vg_lite_float_t a2 = 3.0f * tSquare - 3.0f * tCube; + vg_lite_float_t a3 = tCube; + + x = a0 * X0 + a1 * X1 + a2 * X2 + a3 * X3; + y = a0 * Y0 + a1 * Y1 + a2 * Y2 + a3 * Y3; + + /* Add a point to subpath. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, x, y, vgcFLATTEN_MIDDLE)); + } + } + } + + /* Add point 3 separately to avoid cumulative errors. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, X3, Y3, vgcFLATTEN_END)); + + /* Add extra P3 for outgoing tangent. */ + /* First change P3(point0)'s coordinates to P0/P1/P2. */ + point0 = stroke_conversion->path_end; + if(X3 != X2 || Y3 != Y2) { + point0->x = X2; + point0->y = Y2; + } + else if(X3 != X1 || Y3 != Y1) { + point0->x = X1; + point0->y = Y1; + } + else { + point0->x = X0; + point0->y = Y0; + } + + /* Add P3 to calculate outgoing tangent. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, X3, Y3, vgcFLATTEN_NO)); + + point1 = stroke_conversion->path_end; + + /* Change point0's coordinates back to P3. */ + point0->x = X3; + point0->y = Y3; + point0->length = 0.0f; + +ErrorHandler: + return error; +} +#endif /* gcFEATURE_VG_SIMPLYFIED_BEZIER */ + +#define GETINCREMENT(pointer, datatype_size) \ + (datatype_size - (PTR2SIZE(pointer) & (datatype_size - 1))) + +#define SKIPTODATA(pointer, datatype_size, SIZE) \ + /* Determine the increment value. */ \ + increment = GETINCREMENT(pointer, datatype_size); \ + /* Skip to the data. */ \ + pointer += increment; \ + SIZE -= increment + +#define VGSL_GETVALUE(X) \ + X = get_value(data_pointer); \ + data_pointer += data_type_size; \ + size -= data_type_size + +#define VGSL_GETCOORDXY(X, Y) \ + VGSL_GETVALUE(X); \ + VGSL_GETVALUE(Y); \ + if (is_relative) { X += ox; Y += oy; } + +typedef vg_lite_float_t(*vg_value_getter)(int8_t * Data); + +static vg_lite_error_t _flatten_path( + vg_lite_stroke_t * stroke_conversion, + vg_lite_path_t * path +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t increment; + uint8_t is_relative; + uint32_t size; + uint32_t path_command; + uint32_t prev_command; + uint8_t data_type_size; + int8_t * data_pointer = NULL; + int8_t * data_pointer_use = NULL; + vg_lite_float_t sx, sy; + vg_lite_float_t ox, oy; + vg_lite_float_t px, py; + vg_lite_float_t x0, y0, x1, y1, x2, y2; + vg_value_getter get_value = NULL; + + if(!stroke_conversion || !path) + return VG_LITE_INVALID_ARGUMENT; + + sx = sy = ox = oy = px = py = 0.0f; + + prev_command = 0xFF; + + /* Select the data picker. */ + switch(path->format) { + case VG_LITE_S8: + data_type_size = 1; + get_value = _GetS8_NS_NB; + break; + + case VG_LITE_S16: + data_type_size = 2; + get_value = _GetS16_NS_NB; + break; + + case VG_LITE_S32: + data_type_size = 4; + get_value = _GetS32_NS_NB; + break; + + case VG_LITE_FP32: + data_type_size = 4; + get_value = _GetF_NS_NB; + break; + + default: + error = VG_LITE_INVALID_ARGUMENT; + goto ErrorHandler; + } + + if((path->path_type == VG_LITE_DRAW_FILL_PATH) || (path->path_type == VG_LITE_DRAW_FILL_STROKE_PATH)) { + if(path->path_length % (3 * data_type_size) == 0) { + /* add END_PATH if path_data have no END_PATH */ + stroke_conversion->add_end = 1; + path->path_length = path->path_length + data_type_size; + data_pointer_use = (int8_t *)vg_lite_os_malloc(path->path_length); + if(!data_pointer_use) + return VG_LITE_OUT_OF_RESOURCES; + memset(data_pointer_use, 0, path->path_length); + memcpy((int8_t *)data_pointer_use, (int8_t *)path->path, path->path_length - data_type_size); + vg_lite_os_free(path->path); + path->path = data_pointer_use; + path->pdata_internal = 1; + } + if(path->add_end == 1) { + stroke_conversion->add_end = 1; + } + else { + stroke_conversion->add_end = 0; + } + } + + /* Determine the data size. */ + size = path->path_length; + + /* Determine the beginning of the path data. */ + data_pointer = (int8_t *)path->path; + + /* Add an extra gcvVGCMD_MOVE 0.0 0.0 to handle the case the first command is not gcvVGCMD_MOVE. */ + if((*data_pointer & 0xfe) != VLC_OP_MOVE) { + /* Add first point to subpath. */ + VG_LITE_ERROR_HANDLER(_create_new_point_list(stroke_conversion, 0.f, 0.f, vgcFLATTEN_NO)); + } + + while(size > 0) { + /* Get the command. */ + path_command = *data_pointer & 0x1F; + + /* Assume absolute. */ + is_relative = VGL_FALSE; + + switch(path_command) { + case VLC_OP_END: + /* Skip the command. */ + size -= 1; + + if(prev_command == VLC_OP_END) { + /* Continuous gcvVGCMD_CLOSE - do nothing. */ + break; + } + + if((prev_command & 0xfe) == VLC_OP_MOVE) { + /* Delete the invalid path list. */ + vg_lite_path_list_ptr path_list_divide = stroke_conversion->cur_list; + vg_lite_os_free(path_list_divide->path_points); + vg_lite_os_free(path_list_divide); + if(stroke_conversion->cur_list == stroke_conversion->path_list_divide) { + stroke_conversion->cur_list = stroke_conversion->path_list_divide = NULL; + stroke_conversion->path_end = NULL; + stroke_conversion->path_points = NULL; + stroke_conversion->point_count = 0; + } + else { + stroke_conversion->cur_list = stroke_conversion->path_list_divide; + while(stroke_conversion->cur_list->next != path_list_divide) + stroke_conversion->cur_list = stroke_conversion->cur_list->next; + stroke_conversion->path_end = stroke_conversion->cur_list->path_end; + stroke_conversion->point_count = stroke_conversion->cur_list->point_count; + stroke_conversion->cur_list->next = NULL; + } + break; + } + + if(!stroke_conversion->add_end) { + /* Check if subPath is already closed. */ + if(ox != sx || oy != sy) { + /* Add a line from current point to the first point of current subpath. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, sx, sy, vgcFLATTEN_NO)); + } + if(stroke_conversion->path_points != stroke_conversion->path_end) { + /* Copy tangent data from first point to last_point. */ + vg_lite_path_point_ptr first_point = stroke_conversion->path_points; + vg_lite_path_point_ptr last_point = stroke_conversion->path_end; + last_point->length = first_point->length; + last_point->tangentX = first_point->tangentX; + last_point->tangentY = first_point->tangentY; + } + else { + /* Single point path. */ + vg_lite_path_point_ptr point = stroke_conversion->path_points; + point->tangentX = 0.0f; + point->tangentY = 0.0f; + point->length = 0.0f; + } + stroke_conversion->cur_list->closed = 1; + stroke_conversion->closed = 1; + stroke_conversion->path_end->next = NULL; + } + break; + + case VLC_OP_CLOSE: + /* Skip the command. */ + SKIPTODATA(data_pointer, data_type_size, size); + + if(prev_command == VLC_OP_CLOSE) { + /* Continuous gcvVGCMD_CLOSE - do nothing. */ + break; + } + + /* Check if subPath is already closed. */ + if(ox != sx || oy != sy) { + /* Add a line from current point to the first point of current subpath. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, sx, sy, vgcFLATTEN_NO)); + } + + if(stroke_conversion->path_points != stroke_conversion->path_end) { + /* Copy tangent data from first point to last_point. */ + vg_lite_path_point_ptr first_point = stroke_conversion->path_points; + vg_lite_path_point_ptr last_point = stroke_conversion->path_end; + last_point->length = first_point->length; + last_point->tangentX = first_point->tangentX; + last_point->tangentY = first_point->tangentY; + } + else { + /* Single point path. */ + vg_lite_path_point_ptr point = stroke_conversion->path_points; + point->tangentX = 0.0f; + point->tangentY = 0.0f; + point->length = 0.0f; + } + + px = ox = sx; + py = oy = sy; + + stroke_conversion->cur_list->closed = 1; + stroke_conversion->closed = 1; + break; + + case VLC_OP_MOVE_REL: + is_relative = 1; + + case VLC_OP_MOVE: /* Indicate the beginning of a new sub-path. */ + /* Skip to the data. */ + SKIPTODATA(data_pointer, data_type_size, size); + VGSL_GETCOORDXY(x0, y0); + + if((prev_command & 0xfe) == VLC_OP_MOVE) { + /* Continuous gcvVGCMD_MOVE draw nothing */ + stroke_conversion->path_points->x = x0; + stroke_conversion->path_points->y = y0; + } + else { + /* First command is gcvVGCMD_MOVE. */ + /* Add first point to subpath. */ + VG_LITE_ERROR_HANDLER(_create_new_point_list(stroke_conversion, x0, y0, vgcFLATTEN_NO)); + } + + sx = px = ox = x0; + sy = py = oy = y0; + break; + + case VLC_OP_LINE_REL: + is_relative = 1; + + case VLC_OP_LINE: + /* Skip to the data. */ + SKIPTODATA(data_pointer, data_type_size, size); + VGSL_GETCOORDXY(x0, y0); + + /* Add a point to subpath. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, x0, y0, vgcFLATTEN_NO)); + + px = ox = x0; + py = oy = y0; + break; + + case VLC_OP_QUAD_REL: + is_relative = 1; + + case VLC_OP_QUAD: + /* Skip to the data. */ + SKIPTODATA(data_pointer, data_type_size, size); + VGSL_GETCOORDXY(x0, y0); + VGSL_GETCOORDXY(x1, y1); + + if((ox == x0 && oy == y0) && (ox == x1 && oy == y1)) { + /* Degenerated Bezier curve. Becomes a point. */ + /* Discard zero-length segments. */ + } + else if((ox == x0 && oy == y0) || (x0 == x1 && y0 == y1)) { + /* Degenerated Bezier curve. Becomes a line. */ + /* Add a point to subpath. */ + VG_LITE_ERROR_HANDLER(_add_point_to_point_list(stroke_conversion, x1, y1, vgcFLATTEN_NO)); + } + else { +#if gcFEATURE_VG_SIMPLYFIED_BEZIER + vg_lite_float_t curve[6] = { ox, oy, x0, y0, x1, y1 }; +#if (CHIPID != 0x265) + vg_lite_float_t subCurve[6] = { 0, 0, 0, 0, 0, 0}; + VG_LITE_ERROR_HANDLER(_flatten_quad_bezier(stroke_conversion, curve, subCurve, 0)); +#else + VG_LITE_ERROR_HANDLER(_flatten_quad_bezier_original(stroke_conversion, curve, 0)); +#endif +#else + VG_LITE_ERROR_HANDLER(_flatten_quad_bezier(stroke_conversion, ox, oy, x0, y0, x1, y1)); +#endif + } + + px = x0; + py = y0; + ox = x1; + oy = y1; + break; + + case VLC_OP_CUBIC_REL: + is_relative = 1; + + case VLC_OP_CUBIC: + /* Skip to the data. */ + SKIPTODATA(data_pointer, data_type_size, size); + VGSL_GETCOORDXY(x0, y0); + VGSL_GETCOORDXY(x1, y1); + VGSL_GETCOORDXY(x2, y2); + + if((ox == x0 && oy == y0) && (ox == x1 && oy == y1) && (ox == x2 && oy == y2)) { + /* Degenerated Bezier curve. Becomes a point. */ + /* Discard zero-length segments. */ + } + else { +#if gcFEATURE_VG_SIMPLYFIED_BEZIER + vg_lite_float_t curve[8] = { ox, oy, x0, y0, x1, y1, x2, y2 }; +#if (CHIPID != 0x265) + vg_lite_float_t subCurve[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + VG_LITE_ERROR_HANDLER(_flatten_cubic_bezier(stroke_conversion, curve, subCurve, 0)); +#else + VG_LITE_ERROR_HANDLER(_flatten_cubic_bezier_original(stroke_conversion, curve, 0)); +#endif +#else + VG_LITE_ERROR_HANDLER(_flatten_cubic_bezier(stroke_conversion, ox, oy, x0, y0, x1, y1, x2, y2)); +#endif + } + + px = x1; + py = y1; + ox = x2; + oy = y2; + break; + default: + error = VG_LITE_INVALID_ARGUMENT; + goto ErrorHandler; + } + prev_command = path_command; + } + + if((prev_command != VLC_OP_END)) { + stroke_conversion->cur_list->path_end->next = NULL; + stroke_conversion->path_end->next = NULL; + if(stroke_conversion->point_count == 1) { + /* Single point path. */ + vg_lite_path_point_ptr point = stroke_conversion->path_points; + point->tangentX = 0.0f; + point->tangentY = 0.0f; + point->length = 0.0f; + } + } + +ErrorHandler: + return error; +} + +static vg_lite_error_t +_add_point_to_right_stroke_point_list_tail( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t X, + vg_lite_float_t Y +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_path_point_ptr point; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*point)); + if(!point) + return VG_LITE_OUT_OF_RESOURCES; + + memset(point, 0, sizeof(*point)); + + point->x = X; + point->y = Y; + point->curve_type = CURVE_LINE; + point->prev = stroke_conversion->right_point; + point->next = NULL; + stroke_conversion->right_point->next = point; + stroke_conversion->right_point = point; + stroke_conversion->stroke_count++; + + stroke_conversion->last_stroke->point_count++; + + return error; +} + +static vg_lite_error_t +_add_point_to_left_point_list_head( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t X, + vg_lite_float_t Y +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_path_point_ptr point; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*point)); + if(!point) + return VG_LITE_OUT_OF_RESOURCES; + + memset(point, 0, sizeof(*point)); + + point->x = X; + point->y = Y; + point->curve_type = CURVE_LINE; + point->next = stroke_conversion->left_point; + point->prev = NULL; + stroke_conversion->left_point->prev = point; + stroke_conversion->left_point = point; + stroke_conversion->stroke_count++; + + stroke_conversion->last_stroke->point_count++; + + return error; +} + +static vg_lite_error_t _add_stroke_sub_path( + vg_lite_stroke_t * stroke_conversion, + vg_lite_sub_path_ptr * sub_path +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + if(!stroke_conversion || !sub_path) + return VG_LITE_INVALID_ARGUMENT; + + *sub_path = (vg_lite_sub_path_ptr)vg_lite_os_malloc(sizeof(**sub_path)); + if(!*sub_path) + return VG_LITE_OUT_OF_RESOURCES; + + memset(*sub_path, 0, sizeof(**sub_path)); + + if(stroke_conversion->last_stroke != NULL) { + stroke_conversion->last_stroke->next = *sub_path; + stroke_conversion->last_stroke = *sub_path; + } + else { + stroke_conversion->last_stroke = stroke_conversion->stroke_paths = *sub_path; + } + + return error; +} + +static vg_lite_error_t +_add_zero_length_stroke_sub_path( + vg_lite_stroke_t * stroke_conversion, + vg_lite_sub_path_ptr * stroke_subpath +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_path_point_ptr new_point, Point; + vg_lite_sub_path_ptr stroke_sub_path; + vg_lite_float_t half_width; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + half_width = stroke_conversion->half_width; + Point = stroke_conversion->path_points; + if(stroke_conversion->cap_style == VG_LITE_CAP_BUTT) { + /* No need to draw zero-length subPath for gcvCAP_BUTT. */ + error = VG_LITE_SUCCESS; + goto ErrorHandler; + } + + VG_LITE_ERROR_HANDLER(_add_stroke_sub_path(stroke_conversion, &stroke_sub_path)); + + if(stroke_conversion->cap_style == VG_LITE_CAP_SQUARE) { + /* Draw a square along the point's direction. */ + vg_lite_float_t dx, dy; + + if(Point->tangentX == 0.0f || Point->tangentY == 0.0f) { + dx = half_width; + dy = 0.0f; + } + else { + dx = Point->tangentY * half_width; + dy = -Point->tangentX * half_width; + } + + new_point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*new_point)); + if(!new_point) + return VG_LITE_OUT_OF_RESOURCES; + memset(new_point, 0, sizeof(*new_point)); + + new_point->x = Point->x + dx + dy; + new_point->y = Point->y - dx + dy; + new_point->curve_type = CURVE_LINE; + stroke_sub_path->point_list = stroke_conversion->right_point = new_point; + stroke_sub_path->point_count = 1; + + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + Point->x + dx - dy, Point->y + dx + dy)); + + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + Point->x - dx - dy, Point->y + dx - dy)); + + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + Point->x - dx + dy, Point->y - dx - dy)); + } + else { + /* Draw a circle. */ + new_point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*new_point)); + if(!new_point) + return VG_LITE_OUT_OF_RESOURCES; + memset(new_point, 0, sizeof(*new_point)); + + new_point->x = Point->x + half_width; + new_point->y = Point->y; + new_point->curve_type = CURVE_LINE; + stroke_sub_path->point_list = stroke_conversion->right_point = new_point; + stroke_sub_path->point_count = 1; + + /* Add upper half circle. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + Point->x - half_width, Point->y)); + + stroke_conversion->right_point->curve_type = CURVE_ARC_SCCW_HALF; + stroke_conversion->right_point->tangentX = Point->x; + stroke_conversion->right_point->tangentY = Point->y; + + /* Add lower half circle. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + Point->x + half_width, Point->y)); + + stroke_conversion->right_point->curve_type = CURVE_ARC_SCCW_HALF; + stroke_conversion->right_point->tangentX = Point->x; + stroke_conversion->right_point->tangentY = Point->y; + } + + stroke_sub_path->end_point = stroke_conversion->right_point; + stroke_sub_path->end_point->next = NULL; + +ErrorHandler: + return error; +} + +/* Special asin(x) for quick calculation when -sqrt(0.5) <= x <= sqrt(0.5). */ +static vg_lite_float_t _Asin( + vg_lite_float_t X +) +{ + vg_lite_float_t x = X; + vg_lite_float_t x2 = X * X; + vg_lite_float_t s = X; + + x *= x2; + s += x * 0.1660510562575219f; + x *= x2; + s += x * 0.084044676143618186f; + x *= x2; + s += x * 0.0023776176698039313f; + x *= x2; + s += x * 0.10211922020091345f; + + return s; +} + +/* Special cos(x) for quick calculation when -PI <= x <= PI. */ +static vg_lite_float_t _Cos( + vg_lite_float_t X +) +{ + vg_lite_float_t x2 = X * X; + vg_lite_float_t x = x2; + vg_lite_float_t s = 1.0f; + + s -= x * 0.49985163079668843f; + x *= x2; + s += x * 0.041518066216932693f; + x *= x2; + s -= x * 0.0013422997970712939f; + x *= x2; + s += x * 0.000018930111278021357f; + + return s; +} + +/* Special sin(x) for quick calculation when -PI <= x <= PI. */ +static vg_lite_float_t _Sine( + vg_lite_float_t X +) +{ + vg_lite_float_t x = X; + vg_lite_float_t x2 = X * X; + vg_lite_float_t s = X; + + x *= x2; + s -= x * 0.16664527099620879f; + x *= x2; + s += x * 0.0083154803736487041f; + x *= x2; + s -= x * 0.00019344151251408578f; + x *= x2; + s += x * 0.0000021810214160988925f; + + return s; +} + +static vg_lite_float_t +_Angle( + vg_lite_float_t X, + vg_lite_float_t Y, + vg_lite_float_t Length +) +{ + vg_lite_float_t angle; + vg_lite_float_t ux = (X >= 0.0f ? X : -X); + vg_lite_float_t uy = (Y >= 0.0f ? Y : -Y); + + if(ux > uy) { + angle = ((uy > 0.0f && ux < Length) ? _Asin(uy / Length) : 0.0f); + } + else { + angle = ((ux > 0.0f && uy < Length) ? (FLOAT_PI_HALF - _Asin(ux / Length)) : FLOAT_PI_HALF); + } + + if(X < 0.0f) angle = FLOAT_PI - angle; + if(Y < 0.0f) angle = -angle; + + return angle; +} + +/* The arc is always counter clockwise and less than half circle (small). */ +static vg_lite_error_t +_convert_circle_arc( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t Radius, + vg_lite_float_t CenterX, + vg_lite_float_t CenterY, + vg_lite_float_t StartX, + vg_lite_float_t StartY, + vg_lite_float_t EndX, + vg_lite_float_t EndY, + uint8_t Half_circle, + vg_lite_path_point_ptr * point_list +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + /*gceVGCMD segmentCommand;*/ + vg_lite_float_t theta1, theta_span; + uint32_t segs; + vg_lite_float_t theta, theta_half, theta2; + vg_lite_float_t cos_theta_half; + vg_lite_float_t control_ratio; + vg_lite_float_t controlX, controlY, anchorX, anchorY; + /*gctFLOAT lastX, lastY;*/ + vg_lite_path_point_ptr point, start_point, last_point; + + if(!stroke_conversion || !point_list) + return VG_LITE_INVALID_ARGUMENT; + + /* Converting. */ + theta1 = _Angle(StartX - CenterX, StartY - CenterY, Radius); + if(Half_circle) { + theta_span = FLOAT_PI; + segs = 4; + theta = FLOAT_PI_QUARTER; + theta_half = FLOAT_PI_EIGHTH; + cos_theta_half = FLOAT_COS_PI_EIGHTH; + } + else { + theta_span = _Angle(EndX - CenterX, EndY - CenterY, Radius) - theta1; + if(theta_span == 0.0f) { + /* Handle specail case for huge scaling. */ + *point_list = NULL; + error = VG_LITE_SUCCESS; + return error; + } + + if((theta_span < 0)) { + theta_span += FLOAT_PI_TWO; + } + + /* Calculate the number of quadratic Bezier curves. */ + /* Assumption: most of angles are small angles. */ + if(theta_span <= FLOAT_PI_QUARTER) segs = 1; + else if(theta_span <= FLOAT_PI_HALF) segs = 2; + else if(theta_span <= FLOAT_PI_THREE_QUARTER) segs = 3; + else segs = 4; + + theta = theta_span / segs; + theta_half = theta / 2.0f; + cos_theta_half = _Cos(theta_half); + } + + /* Determine the segment command. */ + /*egmentCommand = gcvVGCMD_ARC_QUAD;*/ + + /* Generate quadratic Bezier curves. */ + start_point = last_point = NULL; + control_ratio = Radius / cos_theta_half; + while(segs-- > 0) { + theta1 += theta; + + theta2 = theta1 - theta_half; + if(theta2 > FLOAT_PI) theta2 -= FLOAT_PI_TWO; + controlX = CenterX + _Cos(theta2) * control_ratio; + controlY = CenterY + _Sine(theta2) * control_ratio; + + theta2 = theta1; + if(theta2 > FLOAT_PI) theta2 -= FLOAT_PI_TWO; + anchorX = CenterX + _Cos(theta2) * Radius; + anchorY = CenterY + _Sine(theta2) * Radius; + + if(segs == 0) { + /* Use end point directly to avoid accumulated errors. */ + anchorX = EndX; + anchorY = EndY; + } + + /* Add control point. */ + point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*point)); + if(!point) + return VG_LITE_OUT_OF_RESOURCES; + + memset(point, 0, sizeof(*point)); + + point->x = controlX; + point->y = controlY; + point->curve_type = CURVE_QUAD_CONTROL; + if(last_point) { + last_point->next = point; + last_point = point; + } + else { + start_point = last_point = point; + } + + /* Add anchor point. */ + point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*point)); + if(!point) { + error = VG_LITE_OUT_OF_RESOURCES; + goto ErrorHandler; + } + + memset(point, 0, sizeof(*point)); + + point->x = anchorX; + point->y = anchorY; + point->curve_type = CURVE_QUAD_ANCHOR; + last_point->next = point; + last_point = point; + } + + if(last_point) { + last_point->next = NULL; + } + *point_list = start_point; + + return error; + +ErrorHandler: + /* Return status. */ + if(start_point) { + vg_lite_os_free(start_point); + start_point = last_point = NULL; + } + return error; +} + +static vg_lite_error_t +_start_new_stroke_sub_path( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t X, + vg_lite_float_t Y, + vg_lite_float_t Dx, + vg_lite_float_t Dy, + uint8_t add_end_cap, + vg_lite_sub_path_ptr * stroke_subpath +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + vg_lite_sub_path_ptr stroke_sub_path; + vg_lite_path_point_ptr new_point; + + if(!stroke_conversion || !stroke_subpath) + return VG_LITE_INVALID_ARGUMENT; + + VG_LITE_ERROR_HANDLER(_add_stroke_sub_path(stroke_conversion, &stroke_sub_path)); + + new_point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*new_point)); + if(!new_point) + return VG_LITE_OUT_OF_RESOURCES; + + memset(new_point, 0, sizeof(*new_point)); + new_point->x = X + Dx; + new_point->y = Y + Dy; + new_point->prev = NULL; + new_point->curve_type = CURVE_LINE; + stroke_conversion->stroke_points = stroke_conversion->right_point = new_point; + + stroke_sub_path->point_list = stroke_conversion->right_point = new_point; + + new_point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*new_point)); + if(!new_point) + return VG_LITE_OUT_OF_RESOURCES; + + memset(new_point, 0, sizeof(*new_point)); + new_point->x = X - Dx; + new_point->y = Y - Dy; + new_point->curve_type = CURVE_LINE; + new_point->next = NULL; + stroke_conversion->stroke_end = stroke_conversion->left_point = new_point; + + stroke_conversion->stroke_count = 2; + + stroke_sub_path->end_point = stroke_conversion->left_point = new_point; + stroke_sub_path->point_count = 2; + + if(add_end_cap) { + /* Add end cap if the subPath is not closed. */ + switch(stroke_conversion->cap_style) { + case VG_LITE_CAP_BUTT: + /* No adjustment needed. */ + break; + case VG_LITE_CAP_ROUND: + /* Add curve. */ + /* Add the starting point again as arc. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + stroke_sub_path->point_list->x, stroke_sub_path->point_list->y)); + stroke_conversion->right_point->curve_type = CURVE_ARC_SCCW_HALF; + stroke_conversion->right_point->tangentX = X; + stroke_conversion->right_point->tangentY = Y; + /* Change the starting point to end point. */ + stroke_sub_path->point_list->x = stroke_sub_path->end_point->x; + stroke_sub_path->point_list->y = stroke_sub_path->end_point->y; + break; + case VG_LITE_CAP_SQUARE: + stroke_conversion->right_point->x += Dy; + stroke_conversion->right_point->y -= Dx; + stroke_conversion->left_point->x += Dy; + stroke_conversion->left_point->y -= Dx; + break; + } + } + + *stroke_subpath = stroke_sub_path; + +ErrorHandler: + return error; +} + +static void +_adjust_joint_point( + vg_lite_path_point_ptr Point, + vg_lite_path_point_ptr join_point, + vg_lite_float_t X, + vg_lite_float_t Y, + vg_lite_float_t Ratio +) +{ + vg_lite_float_t mx = (join_point->x + X) / 2.0f; + vg_lite_float_t my = (join_point->y + Y) / 2.0f; + vg_lite_float_t dx = mx - Point->x; + vg_lite_float_t dy = my - Point->y; + + dx = dx * Ratio; + dy = dy * Ratio; + join_point->x = Point->x + dx; + join_point->y = Point->y + dy; +} + +static uint8_t +_is_angle_span_acute( + vg_lite_float_t Ux, + vg_lite_float_t Uy, + vg_lite_float_t Vx, + vg_lite_float_t Vy +) +{ + return ((Ux * Vx + Uy * Vy) > 0.0f ? 1 : 0); +} + +static vg_lite_error_t +_draw_swing_pie_area( + vg_lite_stroke_t * stroke_conversion, + vg_lite_path_point_ptr center_point, + uint8_t end_at_prev_point +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + if(stroke_conversion->swing_ccw) { + vg_lite_path_point_ptr start_point = stroke_conversion->swing_stroke; + vg_lite_path_point_ptr end_point = NULL, real_end_point = NULL; + vg_lite_path_point_ptr point, prev_point; + uint32_t count = 0; + + { + if(end_at_prev_point) { + /* Detach the end point from leftStrokePoint. */ + /* The end point will be added back later. */ + real_end_point = stroke_conversion->left_point; + stroke_conversion->left_point = real_end_point->next; + stroke_conversion->left_point->prev = NULL; + } + + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, + center_point->x, center_point->y)); + end_point = stroke_conversion->left_point; + + /* Reverse the point list from startPoint to endPoint. */ + for(point = start_point; point; point = prev_point) { + prev_point = point->prev; + point->prev = point->next; + point->next = prev_point; + count++; + } + + if(end_point) { + end_point->next = start_point->prev; + } + start_point->prev->prev = end_point; + start_point->prev = NULL; + stroke_conversion->left_point = start_point; + + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, + center_point->x, center_point->y)); + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, + stroke_conversion->swing_start->x, + stroke_conversion->swing_start->y)); + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, + end_point->prev->x, end_point->prev->y)); + + if(end_at_prev_point) { + if(real_end_point) { + real_end_point->next = stroke_conversion->left_point; + } + stroke_conversion->left_point->prev = real_end_point; + stroke_conversion->left_point = real_end_point; + } + } + } + else { + vg_lite_path_point_ptr start_point = stroke_conversion->swing_stroke; + vg_lite_path_point_ptr end_point = NULL, real_end_point = NULL; + vg_lite_path_point_ptr point, next_point; + uint32_t count = 0; + + { + if(end_at_prev_point) { + /* Detach the end point from leftStrokePoint. */ + /* The end point will be added back later. */ + real_end_point = stroke_conversion->right_point; + stroke_conversion->right_point = real_end_point->prev; + stroke_conversion->right_point->next = NULL; + } + + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + center_point->x, center_point->y)); + end_point = stroke_conversion->right_point; + + /* Reverse the point list from startPoint to endPoint. */ + for(point = start_point; point; point = next_point) { + next_point = point->next; + point->next = point->prev; + point->prev = next_point; + count++; + } + end_point->prev = start_point->next; + start_point->next->next = end_point; + start_point->next = NULL; + stroke_conversion->right_point = start_point; + + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + center_point->x, center_point->y)); + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + stroke_conversion->swing_start->x, + stroke_conversion->swing_start->y)); + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + end_point->next->x, end_point->next->y)); + + if(end_at_prev_point) { + real_end_point->prev = stroke_conversion->right_point; + stroke_conversion->right_point->next = real_end_point; + stroke_conversion->right_point = real_end_point; + } + } + } + + stroke_conversion->swing_handling = SWING_NO; + +ErrorHandler: + return error; +} + +static vg_lite_error_t +_process_line_joint( + vg_lite_stroke_t * stroke_conversion, + vg_lite_path_point_ptr Point, + vg_lite_float_t Length, + vg_lite_float_t prev_length, + uint32_t Swing_handling, + vg_lite_float_t X1, + vg_lite_float_t Y1, + vg_lite_float_t X2, + vg_lite_float_t Y2 +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_join_style_t join_style; + vg_lite_float_t half_width; + vg_lite_float_t ratio; + vg_lite_float_t min_length_square; + vg_lite_float_t cos_theta; + uint8_t counter_clockwise; + uint8_t fat_line; + uint32_t swing_handling = SWING_NO; + uint8_t handle_short_line = 0; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + join_style = stroke_conversion->join_style; + half_width = stroke_conversion->half_width; + fat_line = stroke_conversion->fattened; + if(stroke_conversion->swing_length < half_width) { + if(stroke_conversion->need_swing) { + swing_handling = SWING_OUT; + } + else { + handle_short_line = 1; + } + } + else if(stroke_conversion->stroke_length - stroke_conversion->swing_length < half_width) { + if(stroke_conversion->need_swing) { + swing_handling = SWING_IN; + } + else { + handle_short_line = 1; + } + } + + if(swing_handling != Swing_handling) { + error = VG_LITE_INVALID_ARGUMENT; + goto ErrorHandler; + } + + /* For flattened curves/arcs, the join style is always round. */ + if((Point->flatten_flag != vgcFLATTEN_NO) && fat_line) { + join_style = VG_LITE_JOIN_ROUND; + } + + /* First, determine the turn is clockwise or counter-clockwise. */ + cos_theta = Point->prev->tangentX * Point->tangentX + Point->prev->tangentY * Point->tangentY; + + if(cos_theta > FLOAT_ANGLE_EPSILON_COS) { + /* Straight line or semi-straight line--no need to handle join. */ + if(stroke_conversion->swing_handling != SWING_NO) { + /* Begin to swing to the opposite direction. */ + /* Draw the swing area (pie area). */ + VG_LITE_ERROR_HANDLER(_draw_swing_pie_area(stroke_conversion, Point->prev, 1)); + } + + /* Add the new stroke points. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, X1, Y1)); + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, X2, Y2)); + if(stroke_conversion->swing_handling != SWING_NO) { + stroke_conversion->swing_count++; + } + + goto endCheck; + } + else if(cos_theta < -FLOAT_ANGLE_EPSILON_COS) { + /* Almost 180 degree turn. */ + counter_clockwise = 1; + ratio = FLOAT_MAX; + min_length_square = FLOAT_MAX; + } + else { + vg_lite_float_t angleSign = Point->prev->tangentX * Point->tangentY - Point->prev->tangentY * Point->tangentX; + counter_clockwise = (angleSign >= 0.0f ? 1 : 0); + ratio = 2.0f / (1.0f + cos_theta); + min_length_square = half_width * half_width * (1.0f - cos_theta) / (1.0f + cos_theta) + 0.02f; + } + + if(stroke_conversion->swing_handling != SWING_NO) { + if(counter_clockwise != stroke_conversion->swing_ccw) { + /* Swing to the opposite direction. */ + /* Draw the swing area (pie area). */ + VG_LITE_ERROR_HANDLER(_draw_swing_pie_area(stroke_conversion, Point->prev, 1)); + } + } + + if(counter_clockwise) { + if(stroke_conversion->swing_handling != SWING_NO) { + vg_lite_path_point_ptr prev_point = stroke_conversion->left_point->next; /* Skip the line segment movement. */ + vg_lite_float_t deltaX = X2 - prev_point->x; + vg_lite_float_t deltaY = Y2 - prev_point->y; + if(_is_angle_span_acute(stroke_conversion->swing_deltax, + stroke_conversion->swing_deltay, + deltaX, deltaY)) { + /* Continue swinging. */ + stroke_conversion->swing_deltax = deltaX; + stroke_conversion->swing_deltay = deltaY; + } + else { + /* Swing to the max. */ + /* Draw the swing area (pie area). */ + VG_LITE_ERROR_HANDLER(_draw_swing_pie_area(stroke_conversion, Point->prev, 1)); + } + } + + /* Check if the miter length is too long for inner intersection. */ + if(stroke_conversion->swing_handling == SWING_NO + && ! handle_short_line + && min_length_square <= Length * Length + && min_length_square <= prev_length * prev_length) { + /* Adjust leftStrokePoint to the intersection point. */ + _adjust_joint_point(Point, stroke_conversion->left_point, X2, Y2, ratio); + } + else if(stroke_conversion->swing_handling == SWING_NO && Point->flatten_flag == vgcFLATTEN_NO) { + /* Add the point to avoid incorrect sharp angle. */ + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, Point->x, Point->y)); + /* Add the point to form a loop to avoid out-of-bound problem. */ + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, X2, Y2)); + } + else if(stroke_conversion->swing_handling == SWING_NO && (! fat_line || Swing_handling == SWING_NO)) { + /* Flattened line segments should not have sharp angle. */ + /* Add the point to form a loop to avoid out-of-bound problem. */ + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, X2, Y2)); + } + else { + if(stroke_conversion->swing_handling == SWING_NO) { + vg_lite_path_point_ptr prev_point = stroke_conversion->left_point; + + /* Start swing handling. */ + stroke_conversion->swing_handling = Swing_handling; + stroke_conversion->swing_ccw = 1; + stroke_conversion->swing_start = Point; + stroke_conversion->swing_centlen = 0.0f; + stroke_conversion->swing_count = 0; + + /* Save stroking path delta. */ + stroke_conversion->swing_deltax = X2 - prev_point->x; + stroke_conversion->swing_deltay = Y2 - prev_point->y; + + /* Add extra center point for swing out pie area. */ + /* VIV: [todo] Should adjust prev_point, instead of adding new point? */ + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, Point->x, Point->y)); + + /* Add extra start stroke point for swing out pie area. */ + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, prev_point->x, prev_point->y)); + + stroke_conversion->swing_stroke = stroke_conversion->left_point; + } + + /* Add curve. */ + /* Note that the curve will be reversed, so the direction is CW. */ + /* Then, left side is in reversed order, so the direction is CCW. */ + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, X2, Y2)); + stroke_conversion->left_point->curve_type = CURVE_ARC_SCCW; + stroke_conversion->left_point->tangentX = Point->x; + stroke_conversion->left_point->tangentY = Point->y; + + stroke_conversion->swing_count++; + } + + switch(join_style) { + case VG_LITE_JOIN_ROUND: + if(cos_theta > FLOAT_MIN_ARC_ANGLE_COS) { + /* Add a point. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, X1, Y1)); + } + else { + /* Add curve. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, X1, Y1)); + stroke_conversion->right_point->curve_type = CURVE_ARC_SCCW; + stroke_conversion->right_point->tangentX = Point->x; + stroke_conversion->right_point->tangentY = Point->y; + } + break; + case VG_LITE_JOIN_MITER: + if(ratio <= stroke_conversion->miter_square) { + /* Adjust lastRightStrokePoint to the outer intersection point. */ + _adjust_joint_point(Point, stroke_conversion->right_point, X1, Y1, ratio); + break; + } + /* Else use Bevel join style. */ + case VG_LITE_JOIN_BEVEL: + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, X1, Y1)); + break; + } + } + else { + if(stroke_conversion->swing_handling != SWING_NO) { + vg_lite_path_point_ptr prev_point = stroke_conversion->right_point->prev; /* Skip the line segment movement. */ + vg_lite_float_t deltaX = X1 - prev_point->x; + vg_lite_float_t deltaY = Y1 - prev_point->y; + if(_is_angle_span_acute(stroke_conversion->swing_deltax, + stroke_conversion->swing_deltay, + deltaX, deltaY)) { + /* Continue swinging. */ + stroke_conversion->swing_deltax = deltaX; + stroke_conversion->swing_deltay = deltaY; + } + else { + /* Swing to the max. */ + /* Draw the swing area (pie area). */ + VG_LITE_ERROR_HANDLER(_draw_swing_pie_area(stroke_conversion, Point->prev, 1)); + } + } + + /* Check if the miter length is too long for inner intersection. */ + if(stroke_conversion->swing_handling == SWING_NO + && ! handle_short_line + && min_length_square <= Length * Length + && min_length_square <= prev_length * prev_length) { + /* Adjust lastRightStrokePoint to the intersection point. */ + _adjust_joint_point(Point, stroke_conversion->right_point, X1, Y1, ratio); + } + else if(stroke_conversion->swing_handling == SWING_NO && Point->flatten_flag == vgcFLATTEN_NO) { + /* Add the point to avoid incorrect sharp angle. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, Point->x, Point->y)); + /* Add the point to form a loop to avoid out-of-bound problem. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, X1, Y1)); + } + else if(stroke_conversion->swing_handling == SWING_NO && (! fat_line || Swing_handling == SWING_NO)) { + /* Flattened line segments should not have sharp angle. */ + /* Add the point to form a loop to avoid out-of-bound problem. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, X1, Y1)); + } + else { + if(stroke_conversion->swing_handling == SWING_NO) { + vg_lite_path_point_ptr prev_point = stroke_conversion->right_point; + + /* Start swing handling. */ + stroke_conversion->swing_handling = Swing_handling; + stroke_conversion->swing_ccw = 0; + stroke_conversion->swing_start = Point; + stroke_conversion->swing_centlen = 0.0f; + stroke_conversion->swing_count = 0; + + /* Save stroking path delta. */ + stroke_conversion->swing_deltax = X1 - prev_point->x; + stroke_conversion->swing_deltay = Y1 - prev_point->y; + + /* Add extra center point for swing out pie area. */ + /* VIV: [todo] Should adjust prev_point, instead of adding new point? */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, Point->x, Point->y)); + + /* Add extra start stroke point for swing out pie area. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, prev_point->x, prev_point->y)); + + stroke_conversion->swing_stroke = stroke_conversion->right_point; + } + + if(cos_theta > FLOAT_MIN_ARC_ANGLE_COS) { + /* Add a point. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, X1, Y1)); + } + else { + /* Add curve. */ + /* Note that the curve will be reversed, so the direction is CCW. */ + stroke_conversion->right_point->curve_type = CURVE_ARC_SCCW; + stroke_conversion->right_point->tangentX = Point->x; + stroke_conversion->right_point->tangentY = Point->y; + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, X1, Y1)); + } + stroke_conversion->swing_count++; + } + + switch(join_style) { + case VG_LITE_JOIN_ROUND: + if(cos_theta > FLOAT_MIN_ARC_ANGLE_COS) { + /* Add a point. */ + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, X2, Y2)); + } + else { + /* Add curve. */ + stroke_conversion->left_point->curve_type = CURVE_ARC_SCCW; + stroke_conversion->left_point->tangentX = Point->x; + stroke_conversion->left_point->tangentY = Point->y; + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, X2, Y2)); + } + break; + case VG_LITE_JOIN_MITER: + if(ratio <= stroke_conversion->miter_square) { + /* Adjust leftStrokePoint to the outer intersection point. */ + _adjust_joint_point(Point, stroke_conversion->left_point, X2, Y2, ratio); + break; + } + /* Else use Bevel join style. */ + case VG_LITE_JOIN_BEVEL: + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, X2, Y2)); + break; + } + } + +endCheck: + if(stroke_conversion->need_swing) { + stroke_conversion->swing_length += Point->length; + } + if(stroke_conversion->swing_handling != SWING_NO) { + if(Point->flatten_flag == vgcFLATTEN_END || + (stroke_conversion->swing_handling == SWING_OUT && + stroke_conversion->swing_length > half_width)) { + /* Draw the swing area (pie area). */ + VG_LITE_ERROR_HANDLER(_draw_swing_pie_area(stroke_conversion, Point, 0)); + } + else { + /* Check if center line will move too far. */ + stroke_conversion->swing_centlen += Point->length; + if(stroke_conversion->swing_centlen > FLOAT_SWING_CENTER_RANGE) { + /* Draw the swing area (pie area). */ + VG_LITE_ERROR_HANDLER(_draw_swing_pie_area(stroke_conversion, Point, 0)); + } + } + } + +ErrorHandler: + return error; +} + +static vg_lite_error_t +_close_stroke_sub_path( + vg_lite_stroke_t * stroke_conversion, + vg_lite_path_point_ptr Point, + vg_lite_float_t Length, + vg_lite_float_t prev_length, + uint8_t Swing_handling, + vg_lite_path_point_ptr first_stroke_point, + vg_lite_path_point_ptr last_stroke_point +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + /* Handle line joint style for the first/last point in closed path. */ + VG_LITE_ERROR_HANDLER(_process_line_joint( + stroke_conversion, Point, + Length, prev_length, Swing_handling, + first_stroke_point->x, first_stroke_point->y, + last_stroke_point->x, last_stroke_point->y + )); + + if(stroke_conversion->cap_style == VG_LITE_CAP_SQUARE + && stroke_conversion->join_style == VG_LITE_JOIN_MITER + && stroke_conversion->pattern_count > 0) { + stroke_conversion->left_point->x = last_stroke_point->x; + stroke_conversion->left_point->y = last_stroke_point->y; + } + + /* Adjust the two end ponts of the first point. */ + first_stroke_point->x = stroke_conversion->right_point->x; + first_stroke_point->y = stroke_conversion->right_point->y; + last_stroke_point->x = stroke_conversion->left_point->x; + last_stroke_point->y = stroke_conversion->left_point->y; + + /* Concatnate right and left point lists. */ + stroke_conversion->right_point->next = stroke_conversion->left_point; + stroke_conversion->left_point->prev = stroke_conversion->right_point; + + /*gcmERROR_RETURN(_CheckStrokeSubPath(stroke_conversion->lastStrokeSubPath));*/ + +ErrorHandler: + return error; +} + +static vg_lite_error_t _end_stroke_sub_path( + vg_lite_stroke_t * stroke_conversion, + vg_lite_float_t X, + vg_lite_float_t Y, + vg_lite_float_t Dx, + vg_lite_float_t Dy +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + /* Add points for end of line. */ + VG_LITE_RETURN_ERROR(_add_point_to_right_stroke_point_list_tail(stroke_conversion, X + Dx, Y + Dy)); + VG_LITE_RETURN_ERROR(_add_point_to_left_point_list_head(stroke_conversion, X - Dx, Y - Dy)); + + /* Add end cap if the subPath is not closed. */ + switch(stroke_conversion->cap_style) { + case VG_LITE_CAP_BUTT: + /* No adjustment needed. */ + break; + case VG_LITE_CAP_ROUND: + /* Add curve. */ + stroke_conversion->left_point->curve_type = CURVE_ARC_SCCW_HALF; + stroke_conversion->left_point->tangentX = X; + stroke_conversion->left_point->tangentY = Y; + break; + case VG_LITE_CAP_SQUARE: + stroke_conversion->right_point->x -= Dy; + stroke_conversion->right_point->y += Dx; + stroke_conversion->left_point->x -= Dy; + stroke_conversion->left_point->y += Dx; + break; + } + + /* Concatnate right and left point lists. */ + stroke_conversion->right_point->next = stroke_conversion->left_point; + stroke_conversion->left_point->prev = stroke_conversion->right_point; + + /*gcmERROR_RETURN(_CheckStrokeSubPath(stroke_conversion->lastStrokeSubPath));*/ + return error; +} + +static vg_lite_error_t _get_next_dash_length( + vg_lite_stroke_t * stroke_conversion, + uint32_t * dash_index, + vg_lite_float_t * dash_length +) +{ + if(!stroke_conversion || !dash_index || !dash_length) + return VG_LITE_INVALID_ARGUMENT; + + (*dash_index)++; + if(*dash_index == stroke_conversion->pattern_count) { + *dash_index = 0; + } + *dash_length = stroke_conversion->dash_pattern[*dash_index]; + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t +_create_stroke_path( + vg_lite_stroke_t * stroke_conversion +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_sub_path_ptr stroke_sub_path = NULL, first_stroke_sub_path = NULL; + vg_lite_path_point_ptr point, next_point; + vg_lite_float_t half_width; + vg_lite_float_t x, y; + vg_lite_float_t dx, dy, ux, uy; + vg_lite_float_t length, prev_length, first_length; + vg_lite_float_t dash_length; + uint32_t dash_index; + uint8_t dashing; + uint8_t add_end_cap; + uint8_t need_to_handle_swing = 1 /* (stroke_conversion->strokeCapStyle == gcvCAP_BUTT) */; + vg_lite_uint8_t dash_phase_reset; + + vg_lite_path_point_ptr first_right_point = NULL; + vg_lite_path_point_ptr last_left_point = NULL; + vg_lite_float_t first_dx = 0.0f, first_dy = 0.0f; + uint8_t drawing = 0; + vg_lite_float_t total_length = 0.0f; + vg_lite_float_t accu_length = 0.0f; + uint32_t swing_handling = SWING_NO; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + half_width = stroke_conversion->half_width; + dashing = stroke_conversion->pattern_count > 0 ? 1 : 0; + dash_index = stroke_conversion->dash_index; + dash_length = stroke_conversion->dash_length; + dash_phase_reset = stroke_conversion->dash_reset; + + /* VIV: [todo] Need to check/debug closed stroke path. */ + need_to_handle_swing = (stroke_conversion->cap_style == VG_LITE_CAP_BUTT || stroke_conversion->closed); + if(need_to_handle_swing) { + uint8_t reallyneed_to_handle_swing = 0; + + /* Calculate the total length. */ + for(point = stroke_conversion->path_points; point; point = point->next) { + total_length += point->length; + + if(point->flatten_flag != vgcFLATTEN_NO) { + reallyneed_to_handle_swing = 1; + } + } + stroke_conversion->stroke_length = total_length; + if(reallyneed_to_handle_swing) { + swing_handling = SWING_OUT; + } + else { + need_to_handle_swing = 0; + swing_handling = SWING_NO; + } + } + stroke_conversion->need_swing = need_to_handle_swing; + + point = stroke_conversion->path_points; + next_point = point->next; + if(next_point == NULL) { + if(!dashing || ((dash_index & 0x1) == 0)) { + /* Single point (zero-length) subpath. */ + /* Note that one-MOVE_TO subpaths are removed during parsing. */ + VG_LITE_ERROR_HANDLER(_add_zero_length_stroke_sub_path(stroke_conversion, &stroke_sub_path)); + } + goto ErrorHandler; + } + + /* Adjust closed status for dashing. */ + if(dashing && stroke_conversion->closed && ((dash_index & 0x1) == 1)) { + stroke_conversion->closed = VGL_FALSE; + } + + /* Set add_end_cap. */ + add_end_cap = dashing ? 1 : (stroke_conversion->closed ? 0 : 1); + + /* Process first line. */ + first_length = point->length; + ux = point->tangentX; + uy = point->tangentY; + dx = uy * half_width; + dy = -ux * half_width; + if(need_to_handle_swing) { + stroke_conversion->swing_length = first_length; + } + + if(dashing) { + vg_lite_float_t delta_length; + + /* Draw dashes. */ + x = point->x; + y = point->y; + do { + if((dash_index & 0x1) == 0) { + VG_LITE_ERROR_HANDLER(_start_new_stroke_sub_path( + stroke_conversion, + x, y, + dx, dy, add_end_cap, + &stroke_sub_path + )); + + drawing = 1; + add_end_cap = 1; + if(stroke_conversion->closed && (first_stroke_sub_path == NULL)) { + first_stroke_sub_path = stroke_conversion->last_stroke; + first_right_point = stroke_conversion->right_point; + last_left_point = stroke_conversion->left_point; + first_dx = dx; + first_dy = dy; + } + } + + delta_length = first_length - dash_length; + if(delta_length >= FLOAT_EPSILON) { + /* Move (x, y) forward along the line by dash_length. */ + x += ux * dash_length; + y += uy * dash_length; + + if((dash_index & 0x1) == 0) { + VG_LITE_ERROR_HANDLER(_end_stroke_sub_path( + stroke_conversion, + x, y, + dx, dy + )); + + drawing = 0; + } + + VG_LITE_ERROR_HANDLER(_get_next_dash_length(stroke_conversion, &dash_index, &dash_length)); + first_length = delta_length; + } + else if(delta_length <= -FLOAT_EPSILON) { + dash_length = -delta_length; + break; + } + else { + if((dash_index & 0x1) == 0) { + VG_LITE_ERROR_HANDLER(_end_stroke_sub_path( + stroke_conversion, + next_point->x, next_point->y, + dx, dy + )); + + drawing = 0; + } + + VG_LITE_ERROR_HANDLER(_get_next_dash_length(stroke_conversion, &dash_index, &dash_length)); + first_length = 0; + break; + } + } while(1); + } + else { + VG_LITE_ERROR_HANDLER(_start_new_stroke_sub_path( + stroke_conversion, + point->x, point->y, + dx, dy, add_end_cap, + &stroke_sub_path + )); + + drawing = 1; + add_end_cap = 1; + } + + /* Process the rest of lines. */ + prev_length = first_length; + for(point = next_point, next_point = point->next; next_point; + point = next_point, next_point = point->next) { + if(!dashing || ((dash_index & 0x1) == 0 && drawing)) { + /* Add points for end of line for line join process with next line. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + point->x + dx, point->y + dy)); + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, + point->x - dx, point->y - dy)); + } + + length = point->length; + ux = point->tangentX; + uy = point->tangentY; + dx = uy * half_width; + dy = -ux * half_width; + if(need_to_handle_swing) { + accu_length += point->prev->length; + stroke_conversion->swing_length = accu_length; + if(accu_length < half_width) { + swing_handling = SWING_OUT; + } + else if(total_length - accu_length < half_width) { + swing_handling = SWING_IN; + } + else { + swing_handling = SWING_NO; + } + } + + if(!dashing) { + /* Handle line joint style. */ + VG_LITE_ERROR_HANDLER(_process_line_joint( + stroke_conversion, point, + length, prev_length, swing_handling, + point->x + dx, point->y + dy, + point->x - dx, point->y - dy + )); + } + else { + vg_lite_float_t delta_length; + + /* Draw dashes. */ + x = point->x; + y = point->y; + if((dash_index & 0x1) == 0) { + if(drawing) { + /* Handle line joint style. */ + VG_LITE_ERROR_HANDLER(_process_line_joint( + stroke_conversion, point, + dash_length, prev_length, swing_handling, + x + dx, y + dy, + x - dx, y - dy + )); + } + else { + /* Start a new sub path. */ + VG_LITE_ERROR_HANDLER(_start_new_stroke_sub_path( + stroke_conversion, + x, y, + dx, dy, add_end_cap, + &stroke_sub_path + )); + + drawing = 1; + add_end_cap = 1; + } + } + do { + delta_length = length - dash_length; + if(delta_length >= FLOAT_EPSILON) { + /* Move (x, y) forward along the line by dash_length. */ + x += ux * dash_length; + y += uy * dash_length; + + if((dash_index & 0x1) == 0) { + VG_LITE_ERROR_HANDLER(_end_stroke_sub_path( + stroke_conversion, + x, y, dx, dy + )); + + drawing = 0; + } + + VG_LITE_ERROR_HANDLER(_get_next_dash_length(stroke_conversion, &dash_index, &dash_length)); + length = delta_length; + } + else if(delta_length <= -FLOAT_EPSILON) { + dash_length = -delta_length; + break; + } + else { + if((dash_index & 0x1) == 0) { + VG_LITE_ERROR_HANDLER(_end_stroke_sub_path( + stroke_conversion, + next_point->x, next_point->y, + dx, dy + )); + + drawing = 0; + } + + VG_LITE_ERROR_HANDLER(_get_next_dash_length(stroke_conversion, &dash_index, &dash_length)); + length = 0; + break; + } + + if((dash_index & 0x1) == 0) { + VG_LITE_ERROR_HANDLER(_start_new_stroke_sub_path( + stroke_conversion, + x, y, + dx, dy, add_end_cap, + &stroke_sub_path + )); + + drawing = 1; + add_end_cap = 1; + } + } while(1); + } + + prev_length = length; + } + + if(need_to_handle_swing) { + accu_length += point->prev->length; + stroke_conversion->swing_length = accu_length; + if(accu_length < half_width) { + swing_handling = SWING_OUT; + } + else if(total_length - accu_length < half_width) { + swing_handling = SWING_IN; + } + else { + swing_handling = SWING_NO; + } + } + + if(stroke_conversion->swing_handling != SWING_NO) { + /* Draw the swing area (pie area). */ + VG_LITE_ERROR_HANDLER(_draw_swing_pie_area(stroke_conversion, stroke_conversion->path_end, VGL_FALSE)); + } + + if(stroke_conversion->closed) { + if(! dashing || drawing) { + /* Add points for end of line. */ + VG_LITE_ERROR_HANDLER(_add_point_to_right_stroke_point_list_tail(stroke_conversion, + point->x + dx, point->y + dy)); + VG_LITE_ERROR_HANDLER(_add_point_to_left_point_list_head(stroke_conversion, + point->x - dx, point->y - dy)); + + if(! dashing) { + if(stroke_sub_path) { + /* Handle line joint style for the first/last point in closed path. */ + VG_LITE_ERROR_HANDLER(_close_stroke_sub_path( + stroke_conversion, point, + first_length, prev_length, swing_handling, + stroke_sub_path->point_list, stroke_sub_path->end_point + )); + } + } + else { + /* Handle line joint style for the first/last point in closed path. */ + if(first_right_point && last_left_point) { + VG_LITE_ERROR_HANDLER(_close_stroke_sub_path( + stroke_conversion, point, + first_length, prev_length, swing_handling, + first_right_point, last_left_point + )); + } + else { + error = VG_LITE_INVALID_ARGUMENT; + goto ErrorHandler; + } + } + } + else if(stroke_conversion->cap_style != VG_LITE_CAP_BUTT) { + /* No closing join need. Add end cap for the starting point. */ + + if(stroke_conversion->cap_style == VG_LITE_CAP_SQUARE) { + if(first_right_point && last_left_point) { + first_right_point->x += first_dy; + first_right_point->y -= first_dx; + last_left_point->x += first_dy; + last_left_point->y -= first_dx; + } + else { + error = VG_LITE_INVALID_ARGUMENT; + goto ErrorHandler; + } + } + else { + vg_lite_sub_path_ptr last_stroke = stroke_conversion->last_stroke; + vg_lite_path_point_ptr start_point = last_stroke->point_list; + vg_lite_path_point_ptr extra_point; + + /* Add curve. */ + /* Add extra point to the beginning with end point's coordinates. */ + extra_point = (vg_lite_path_point_ptr)vg_lite_os_malloc(sizeof(*extra_point)); + if(!extra_point) + return VG_LITE_OUT_OF_RESOURCES; + memset(extra_point, 0, sizeof(*extra_point)); + + extra_point->x = last_stroke->end_point->x; + extra_point->y = last_stroke->end_point->y; + extra_point->next = start_point; + start_point->prev = extra_point; + start_point->curve_type = CURVE_ARC_SCCW; + start_point->tangentX = stroke_conversion->path_points->x; + start_point->tangentY = stroke_conversion->path_points->y; + last_stroke->point_list = extra_point; + } + } + } + else if(! dashing || + (((dash_index & 0x1) == 0) && (dash_length < stroke_conversion->dash_pattern[dash_index]))) { + /* Add end cap if the subPath is not closed. */ + VG_LITE_ERROR_HANDLER(_end_stroke_sub_path( + stroke_conversion, + point->x, point->y, + dx, dy + )); + + drawing = 0; + } + + if(!dash_phase_reset) { + /* Update dash index and length for next subpath. */ + if(dashing) { + if(((dash_index & 0x1) == 1) && + (stroke_conversion->dash_pattern[dash_index] - dash_length < FLOAT_EPSILON)) { + stroke_conversion->dash_index = dash_index - 1; + stroke_conversion->dash_length = 0; + } + else { + stroke_conversion->dash_index = dash_index; + stroke_conversion->dash_length = dash_length; + } + } + } + +ErrorHandler: + return error; +} + +static vg_lite_error_t _copy_stroke_path( + vg_lite_stroke_t * stroke_conversion, + vg_lite_path_t * path +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_path_point_ptr point, prev_point, tmp_point; + vg_lite_float_t totalsize = 0, real_size = 0; + float * pfloat; + char * cpath; +#if (CHIPID==0x355 || CHIPID==0x255) + char last_opcode = 0; +#endif + void * temp_stroke_data = NULL; + uint32_t temp_stroke_size; + vg_lite_sub_path_ptr sub_path; + vg_lite_float_t half_width; + +#if (CHIPID==0x355) + vg_lite_buffer_t buffer = { 0 }; + uint32_t bytes; +#endif + + if(!stroke_conversion || !path) + return VG_LITE_INVALID_ARGUMENT; + + half_width = stroke_conversion->half_width; + sub_path = stroke_conversion->stroke_paths; + + if(!stroke_conversion || !path || !sub_path) + return VG_LITE_SUCCESS; + + while(sub_path) { + tmp_point = prev_point = point = sub_path->point_list; + totalsize += _commandSize_float[VLC_OP_LINE] * sub_path->point_count + _commandSize_float[VLC_OP_CLOSE]; + for(; tmp_point; tmp_point = tmp_point->next) { + if(tmp_point->curve_type == CURVE_ARC_SCCW || tmp_point->curve_type == CURVE_ARC_SCCW_HALF) { + totalsize += 4 * _commandSize_float[VLC_OP_QUAD]; + } + } + + temp_stroke_data = path->stroke_path; + temp_stroke_size = path->stroke_size; + + path->stroke_size += (int32_t)totalsize; + +#if (CHIPID==0x355) + if(sub_path->next == NULL) { + bytes = (8 + path->stroke_size + 7 + 8) & ~7; + buffer.width = bytes; + buffer.height = 1; + buffer.stride = 0; + buffer.format = VG_LITE_A8; + VG_LITE_RETURN_ERROR(vg_lite_allocate(&buffer)); + + memset(buffer.memory, 0, buffer.stride); + ((uint32_t *)buffer.memory)[0] = VG_LITE_DATA((path->stroke_size + 7) / 8); + ((uint32_t *)buffer.memory)[1] = 0; + if(temp_stroke_data) { + memcpy((char *)buffer.memory + 8, temp_stroke_data, temp_stroke_size); + vg_lite_os_free(temp_stroke_data); + temp_stroke_data = NULL; + } + + path->stroke_path = 0; + pfloat = (vg_lite_float_t *)((char *)buffer.memory + 8 + temp_stroke_size); + } + else +#endif + { + path->stroke_path = (void *)vg_lite_os_malloc(path->stroke_size); + if(!path->stroke_path) { + error = VG_LITE_OUT_OF_RESOURCES; + goto ErrorHandler; + } + + memset(path->stroke_path, 0, path->stroke_size); + + if(temp_stroke_data) { + memcpy(path->stroke_path, temp_stroke_data, temp_stroke_size); + vg_lite_os_free(temp_stroke_data); + temp_stroke_data = NULL; + } + + pfloat = (vg_lite_float_t *)((char *)path->stroke_path + temp_stroke_size); + } +#if (CHIPID==0x355 || CHIPID==0x255) + if(last_opcode == VLC_OP_CLOSE) { + cpath = (char *)(pfloat - 1) + 1; + *cpath++ = VLC_OP_MOVE; + cpath = (char *)pfloat; + } + else +#endif + { + cpath = (char *)pfloat; + *cpath = VLC_OP_MOVE; + pfloat++; + } + + *pfloat++ = point->x; + *pfloat++ = point->y; + real_size += _commandSize_float[VLC_OP_MOVE]; +#if (CHIPID==0x355 || CHIPID==0x255) + if(last_opcode == VLC_OP_CLOSE) + real_size -= 4; +#endif + + for(point = point->next; point; prev_point = point, point = point->next) { + if(point->curve_type == CURVE_LINE) { + if(point->x == prev_point->x && point->y == prev_point->y) { + path->stroke_size -= _commandSize_float[VLC_OP_LINE]; + /* Skip zero-length lines. */ + continue; + } + + /* Add new command. */ + cpath = (char *)pfloat; + *cpath = VLC_OP_LINE; + pfloat++; + + /* Set the coordinates. */ + *pfloat++ = point->x; + *pfloat++ = point->y; + real_size += _commandSize_float[VLC_OP_LINE]; + } + else if(point->curve_type == CURVE_QUAD_CONTROL) { + /* Add new command. */ + cpath = (char *)pfloat; + *cpath = VLC_OP_QUAD; + pfloat++; + + /* Set the coordinates. */ + prev_point = point, point = point->next; + *pfloat++ = prev_point->x; + *pfloat++ = prev_point->y; + *pfloat++ = point->x; + *pfloat++ = point->y; + + real_size += _commandSize_float[VLC_OP_QUAD]; + } + else { + vg_lite_path_point_ptr point_list, p, nextP; + vg_lite_path_point_ptr p2; + + if(point->curve_type == CURVE_ARC_SCCW) { + /* Convert an arc to Bezier curves. */ + VG_LITE_ERROR_HANDLER(_convert_circle_arc(stroke_conversion, half_width, + point->tangentX, point->tangentY, + prev_point->x, prev_point->y, + point->x, point->y, + 0, &point_list)); + } + else { + /* Convert a half circle to Bezier curves. */ + VG_LITE_ERROR_HANDLER(_convert_circle_arc(stroke_conversion, half_width, + point->tangentX, point->tangentY, + prev_point->x, prev_point->y, + point->x, point->y, + 1, &point_list)); + + } + + if(point_list) { + for(p = point_list; p; p = nextP) { + /* Add new command. */ + cpath = (char *)pfloat; + *cpath = VLC_OP_QUAD; + pfloat++; + + /* Set the coordinates. */ + p2 = p->next; + nextP = p2->next; + + *pfloat++ = p->x; + *pfloat++ = p->y; + *pfloat++ = p2->x; + *pfloat++ = p2->y; + real_size += _commandSize_float[VLC_OP_QUAD]; + vg_lite_os_free(p); + vg_lite_os_free(p2); + } + } + else { + /* Handle special case of huge scaling. */ + /* Add new command. */ + cpath = (char *)pfloat; + *cpath = VLC_OP_LINE; + pfloat++; + + /* Set the coordinates. */ + *pfloat++ = point->x; + *pfloat++ = point->y; + real_size += _commandSize_float[VLC_OP_LINE]; + } + } + } + + /* Create a CLOSE_PATH command at the end. */ + cpath = (char *)pfloat; + if(sub_path->next) + *cpath = VLC_OP_CLOSE; + else + *cpath = VLC_OP_END; + real_size += _commandSize_float[VLC_OP_CLOSE]; + path->stroke_size = temp_stroke_size + (int32_t)real_size; + totalsize = 0; + real_size = 0; + sub_path = sub_path->next; +#if (CHIPID==0x355 || CHIPID==0x255) + last_opcode = *cpath; +#endif + } + +#if (CHIPID==0x355) + /* Initialize command buffer postfix. */ + ((uint32_t *)buffer.memory)[(bytes >> 2) - 2] = VG_LITE_RETURN(); + ((uint32_t *)buffer.memory)[(bytes >> 2) - 1] = 0; + + /* Mark stroke as uploaded. */ + path->stroke->uploaded.handle = buffer.handle; + path->stroke->uploaded.address = buffer.address; + path->stroke->uploaded.memory = buffer.memory; + path->stroke->uploaded.bytes = bytes; + VLM_PATH_STROKE_ENABLE_UPLOAD(*path); +#endif + +ErrorHandler: + if(temp_stroke_data) { + vg_lite_os_free(temp_stroke_data); + temp_stroke_data = NULL; + } + return error; +} + +static vg_lite_error_t _initialize_stroke_dash_parameters( + vg_lite_stroke_t * stroke_conversion +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t count; + uint32_t i; + vg_lite_float_t * pattern_src; + vg_lite_float_t * pattern, * temp_pattern; + vg_lite_float_t length; + + if(!stroke_conversion) + return VG_LITE_INVALID_ARGUMENT; + + count = stroke_conversion->pattern_count; + if(count == 0 || !stroke_conversion->dash_pattern) + return error; + + length = stroke_conversion->dash_phase; + + /* The last pattern is ignored if the number is odd. */ + if(count & 0x1) count--; + + pattern = (vg_lite_float_t *)vg_lite_os_malloc(count * sizeof(vg_lite_float_t)); + if(!pattern) + return VG_LITE_OUT_OF_RESOURCES; + + temp_pattern = pattern; + stroke_conversion->pattern_length = 0.0f; + pattern_src = stroke_conversion->dash_pattern; + + for(i = 0; i < count; i++, pattern++, pattern_src++) { + if(*pattern_src < 0.0f) { + *pattern = 0.0f; + } + else { + *pattern = *pattern_src; + } + stroke_conversion->pattern_length += *pattern; + } + + if(stroke_conversion->pattern_length < FLOAT_EPSILON) { + stroke_conversion->pattern_count = 0; + vg_lite_os_free(temp_pattern); + temp_pattern = NULL; + return error; + } + + while(length < 0.0f) { + length += stroke_conversion->pattern_length; + } + + while(length >= stroke_conversion->pattern_length) { + length -= stroke_conversion->pattern_length; + } + + pattern = stroke_conversion->dash_pattern; + for(i = 0; i < stroke_conversion->pattern_count; i++, pattern++) { + if(length <= *pattern) break; + + length -= *pattern; + } + + stroke_conversion->dash_index = i; + stroke_conversion->dash_length = *pattern - length; + + vg_lite_os_free(temp_pattern); + temp_pattern = NULL; + + return error; +} + +vg_lite_error_t vg_lite_update_stroke( + vg_lite_path_t * path +) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_stroke_t * stroke_conversion; + vg_lite_path_list_ptr cur_list; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_update_stroke %p\n", path); +#endif + + if(!path) + return VG_LITE_INVALID_ARGUMENT; + + if(!path->path_length) + return VG_LITE_SUCCESS; + + if(!path->path) + return VG_LITE_INVALID_ARGUMENT; + + if(!path->stroke) + return VG_LITE_INVALID_ARGUMENT; + + stroke_conversion = path->stroke; + cur_list = stroke_conversion->cur_list; + +#if (CHIPID==0x355) + if(path->stroke && path->stroke->uploaded.handle != NULL) { + vg_lite_kernel_free_t free_cmd; + free_cmd.memory_handle = path->stroke->uploaded.handle; + error = vg_lite_kernel(VG_LITE_FREE, &free_cmd); + if(error != VG_LITE_SUCCESS) + return error; + + path->stroke->uploaded.address = 0; + path->stroke->uploaded.bytes = 0; + path->stroke->uploaded.handle = NULL; + path->stroke->uploaded.memory = NULL; + } +#endif + + /* Free the existing stroke path. */ + if(path->stroke_path) { + vg_lite_os_free(path->stroke_path); + /* Reset the stroke. */ + path->stroke_path = NULL; + } + + if(stroke_conversion->line_width >= FLOAT_FAT_LINE_WIDTH + && stroke_conversion->line_width >= 1.0f) { + stroke_conversion->fattened = 1; + } + + stroke_conversion->add_end = path->add_end; + + VG_LITE_RETURN_ERROR(_initialize_stroke_dash_parameters(stroke_conversion)); + VG_LITE_RETURN_ERROR(_flatten_path(stroke_conversion, path)); + + for(cur_list = stroke_conversion->path_list_divide; cur_list; cur_list = cur_list->next) { + stroke_conversion->path_end = cur_list->path_end; + stroke_conversion->path_points = cur_list->path_points; + stroke_conversion->point_count = cur_list->point_count; + stroke_conversion->closed = cur_list->closed; + + VG_LITE_RETURN_ERROR(_create_stroke_path(stroke_conversion)); + } + + if(stroke_conversion->path_list_divide) { + stroke_conversion->path_end = stroke_conversion->path_list_divide->path_end; + stroke_conversion->path_points = stroke_conversion->path_list_divide->path_points; + stroke_conversion->point_count = stroke_conversion->path_list_divide->point_count; + } + + VG_LITE_RETURN_ERROR(_copy_stroke_path(stroke_conversion, path)); + + /* add VLC_OP_END if stroke_path is empty. */ + if(path->stroke_size == 0) { + path->stroke_path = vg_lite_os_malloc(_commandSize_float[VLC_OP_END]); + if(!path->stroke_path) + return VG_LITE_OUT_OF_RESOURCES; + *(uint8_t *)path->stroke_path = VLC_OP_END; + path->stroke_size = _commandSize_float[VLC_OP_END]; + } + + return error; +} + +vg_lite_error_t vg_lite_set_stroke( + vg_lite_path_t * path, + vg_lite_cap_style_t cap_style, + vg_lite_join_style_t join_style, + vg_lite_float_t line_width, + vg_lite_float_t miter_limit, + vg_lite_float_t * dash_pattern, + vg_lite_uint32_t pattern_count, + vg_lite_float_t dash_phase, + vg_lite_color_t stroke_color +) +{ +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_set_stroke %p %d %d %f %f %p %d %f 0x%08X\n", path, cap_style, join_style, line_width, miter_limit, + dash_pattern, pattern_count, dash_phase, stroke_color); +#endif + + if(!path || line_width <= 0) + return VG_LITE_INVALID_ARGUMENT; + + if(miter_limit < 1.0f) + miter_limit = 1.0f; + + if(!path->stroke) { + path->stroke = (vg_lite_stroke_t *)vg_lite_os_malloc(sizeof(vg_lite_stroke_t)); + if(!path->stroke) + return VG_LITE_OUT_OF_RESOURCES; + memset(path->stroke, 0, sizeof(vg_lite_stroke_t)); + } + else { + if(path->stroke) { + if(path->stroke->path_list_divide) { + vg_lite_path_list_ptr cur_list; + while(path->stroke->path_list_divide) { + cur_list = path->stroke->path_list_divide->next; + if(path->stroke->path_list_divide->path_points) { + vg_lite_path_point_ptr temp_point; + while(path->stroke->path_list_divide->path_points) { + temp_point = path->stroke->path_list_divide->path_points->next; + vg_lite_os_free(path->stroke->path_list_divide->path_points); + path->stroke->path_list_divide->path_points = temp_point; + } + temp_point = NULL; + } + vg_lite_os_free(path->stroke->path_list_divide); + path->stroke->path_list_divide = cur_list; + } + cur_list = NULL; + } + + if(path->stroke->stroke_paths) { + vg_lite_sub_path_ptr temp_sub_path; + while(path->stroke->stroke_paths) { + temp_sub_path = path->stroke->stroke_paths->next; + if(path->stroke->stroke_paths->point_list) { + vg_lite_path_point_ptr temp_point; + while(path->stroke->stroke_paths->point_list) { + temp_point = path->stroke->stroke_paths->point_list->next; + vg_lite_os_free(path->stroke->stroke_paths->point_list); + path->stroke->stroke_paths->point_list = temp_point; + } + temp_point = NULL; + } + vg_lite_os_free(path->stroke->stroke_paths); + path->stroke->stroke_paths = temp_sub_path; + } + temp_sub_path = NULL; + } + + if(path->stroke->dash_pattern) + vg_lite_os_free(path->stroke->dash_pattern); + + path->stroke_valid = 0; + } + + memset(path->stroke, 0, sizeof(vg_lite_stroke_t)); + path->stroke_size = 0; + } + + /* Clamp dash pattern and phase. */ + pattern_count &= 0xFFFFFFFE; + float * dash_pattern_copy = NULL; + if(pattern_count > 0) { + dash_pattern_copy = vg_lite_os_malloc(pattern_count * sizeof(float)); + if(!dash_pattern_copy) + return VG_LITE_OUT_OF_RESOURCES; + } + for(uint32_t i = 0; i < pattern_count; ++i) + dash_pattern_copy[i] = (dash_pattern[i] > 0.f) ? dash_pattern[i] : 0.f; + if(dash_phase < 0.f) { + float dash_total_length = 0.f; + for(uint32_t i = 0; i < pattern_count; ++i) + dash_total_length += dash_pattern_copy[i]; + if(dash_total_length > 0.f) + dash_phase += (int)(-dash_phase / dash_total_length + 1) * dash_total_length; + else + dash_phase = 0.f; + } + + path->stroke->cap_style = cap_style; + path->stroke->join_style = join_style; + path->stroke->line_width = line_width; + path->stroke->miter_limit = miter_limit; + path->stroke->half_width = line_width / 2.0f; + path->stroke->miter_square = path->stroke->miter_limit * path->stroke->miter_limit; + path->stroke->dash_pattern = dash_pattern_copy; + path->stroke->pattern_count = pattern_count; + path->stroke->dash_phase = dash_phase; + path->stroke_color = stroke_color; + + return VG_LITE_SUCCESS; +} + +#else /* gcFEATURE_VG_STROKE_PATH */ + +vg_lite_error_t vg_lite_update_stroke( + vg_lite_path_t * path +) +{ + return VG_LITE_NOT_SUPPORT; +} + +vg_lite_error_t vg_lite_set_stroke( + vg_lite_path_t * path, + vg_lite_cap_style_t cap_style, + vg_lite_join_style_t join_style, + vg_lite_float_t line_width, + vg_lite_float_t miter_limit, + vg_lite_float_t * dash_pattern, + vg_lite_uint32_t pattern_count, + vg_lite_float_t dash_phase, + vg_lite_color_t stroke_color +) +{ + return VG_LITE_NOT_SUPPORT; +} + +#endif /* gcFEATURE_VG_STROKE_PATH */ + +#if gcFEATURE_VG_ARC_PATH + +static vg_lite_float_t _angle( + vg_lite_float_t Ux, + vg_lite_float_t Uy, + vg_lite_float_t Vx, + vg_lite_float_t Vy +) +{ + + vg_lite_float_t dot, length, angle, cosVal; + int32_t sign; + + dot = Ux * Vx + Uy * Vy; + length = SQRTF(Ux * Ux + Uy * Uy) * SQRTF(Vx * Vx + Vy * Vy); + sign = (Ux * Vy - Uy * Vx < 0) ? -1 : 1; + cosVal = dot / length; + cosVal = CLAMP(cosVal, -1.0f, 1.0f); + angle = sign * ACOSF(cosVal); + return angle; +} + +void compute_quadpathbounds(vg_lite_path_t * path, float currentX, float currentY, float controlX, float controlY, + float lastX, float lastY) +{ + int j = 0; + float newPointX = 0; + float newPointY = 0; + + for(j = 1; j <= 256; j++) { + float t = (float)j / 256; + float u = 1.0f - t; + float term1 = u * u; + float term2 = t * u * 2.0f; + float term3 = t * t; + newPointX = currentX * term1 + controlX * term2 + lastX * term3; + newPointY = currentY * term1 + controlY * term2 + lastY * term3; + + path->bounding_box[0] = MIN(path->bounding_box[0], newPointX); + path->bounding_box[1] = MIN(path->bounding_box[1], newPointY); + path->bounding_box[2] = MAX(path->bounding_box[2], newPointX); + path->bounding_box[3] = MAX(path->bounding_box[3], newPointY); + } +} + +vg_lite_error_t _convert_hline( + vg_lite_float_t EndX, + vg_lite_float_t EndY, + uint8_t Relative, + vg_lite_control_coord_t * coords, + void ** path_data, + uint32_t * offset, + uint32_t last_size +) +{ + vg_lite_float_t endX, endY; + uint8_t segmentCommand; + int32_t segs; + uint32_t bufferSize; + char * pchar, * linePath; + vg_lite_float_t * pfloat; + + /******************************************************************* + ** Converting. + */ + if(path_data == NULL || *path_data == NULL || offset == NULL || coords == NULL) + return VG_LITE_INVALID_ARGUMENT; + segs = 1; + if(Relative) { + endX = EndX + coords->lastX; + endY = EndY + coords->lastY; + } + else { + endX = EndX; + endY = EndY; + } + + /* Determine the segment command. */ + segmentCommand = Relative + ? VLC_OP_LINE_REL + : VLC_OP_LINE; + + /* Determine the size of the buffer required. */ + bufferSize = (1 + 2) * SIZEOF(vg_lite_float_t) * segs; + + linePath = (char *)vg_lite_os_malloc(*offset + bufferSize + last_size); + if(linePath == NULL) + return VG_LITE_OUT_OF_RESOURCES; +#if(CHIPID == 0x355) + memset(linePath, 0, *offset + bufferSize + last_size); +#endif + memcpy(linePath, (char *)*path_data, *offset); + vg_lite_os_free(*path_data); + + *path_data = linePath; + pchar = linePath + *offset; + pfloat = (vg_lite_float_t *)pchar; + + while(segs-- > 0) { + /* Adjust relative coordinates. */ + pchar = (char *)pfloat; + *pchar = segmentCommand; + pfloat++; + if(Relative) { + *pfloat++ = EndX; + *pfloat++ = 0; + } + else { + *pfloat++ = EndX; + *pfloat++ = EndY; + } + *offset += (1 + 2) * SIZEOF(vg_lite_float_t); + } + /* Update the control coordinates. */ + coords->lastX = endX; + coords->lastY = endY; + coords->controlX = endX; + coords->controlY = endY; + return VG_LITE_SUCCESS; +} + +vg_lite_error_t _convert_vline( + vg_lite_float_t EndX, + vg_lite_float_t EndY, + uint8_t Relative, + vg_lite_control_coord_t * coords, + void ** path_data, + uint32_t * offset, + uint32_t last_size +) +{ + vg_lite_float_t endX, endY; + uint8_t segmentCommand; + int32_t segs; + uint32_t bufferSize; + char * pchar, * linePath; + vg_lite_float_t * pfloat; + + /******************************************************************* + ** Converting. + */ + if(path_data == NULL || *path_data == NULL || offset == NULL || coords == NULL) + return VG_LITE_INVALID_ARGUMENT; + segs = 1; + if(Relative) { + endX = EndX + coords->lastX; + endY = EndY + coords->lastY; + } + else { + endX = EndX; + endY = EndY; + } + + /* Determine the segment command. */ + segmentCommand = Relative + ? VLC_OP_LINE_REL + : VLC_OP_LINE; + + /* Determine the size of the buffer required. */ + bufferSize = (1 + 2) * SIZEOF(vg_lite_float_t) * segs; + + linePath = (char *)vg_lite_os_malloc(*offset + bufferSize + last_size); + if(linePath == NULL) + return VG_LITE_OUT_OF_RESOURCES; +#if(CHIPID == 0x355) + memset(linePath, 0, *offset + bufferSize + last_size); +#endif + memcpy(linePath, (char *)*path_data, *offset); + vg_lite_os_free(*path_data); + + *path_data = linePath; + pchar = linePath + *offset; + pfloat = (vg_lite_float_t *)pchar; + + while(segs-- > 0) { + /* Adjust relative coordinates. */ + pchar = (char *)pfloat; + *pchar = segmentCommand; + pfloat++; + if(Relative) { + *pfloat++ = 0; + *pfloat++ = EndY; + } + else { + *pfloat++ = EndX; + *pfloat++ = EndY; + } + *offset += (1 + 2) * SIZEOF(vg_lite_float_t); + } + /* Update the control coordinates. */ + coords->lastX = endX; + coords->lastY = endY; + coords->controlX = endX; + coords->controlY = endY; + return VG_LITE_SUCCESS; +} + +vg_lite_error_t _convert_scubic( + vg_lite_float_t EndX, + vg_lite_float_t EndY, + vg_lite_float_t ControlX, + vg_lite_float_t ControlY, + uint8_t Relative, + vg_lite_control_coord_t * coords, + void ** path_data, + uint32_t * offset, + uint32_t last_size +) +{ + vg_lite_float_t endX, endY; + uint8_t segmentCommand; + int32_t segs; + uint32_t bufferSize; + char * pchar, * cubicPath; + vg_lite_float_t * pfloat; + vg_lite_float_t controlX; + vg_lite_float_t controlY; + /******************************************************************* + ** Converting. + */ + if(path_data == NULL || *path_data == NULL || offset == NULL || coords == NULL) + return VG_LITE_INVALID_ARGUMENT; + segs = 1; + if(Relative) { + endX = EndX + coords->lastX; + endY = EndY + coords->lastY; + controlX = coords->lastX + ControlX; + controlY = coords->lastY + ControlY; + } + else { + endX = EndX; + endY = EndY; + controlX = ControlX; + controlY = ControlY; + } + + /* Determine the segment command. */ + segmentCommand = Relative + ? VLC_OP_CUBIC_REL + : VLC_OP_CUBIC; + + /* Determine the size of the buffer required. */ + bufferSize = (1 + 6) * SIZEOF(vg_lite_float_t) * segs; + + cubicPath = (char *)vg_lite_os_malloc(*offset + bufferSize + last_size); + if(cubicPath == NULL) + return VG_LITE_OUT_OF_RESOURCES; +#if(CHIPID == 0x355) + memset(cubicPath, 0, *offset + bufferSize + last_size); +#endif + memcpy(cubicPath, (char *)*path_data, *offset); + vg_lite_os_free(*path_data); + + *path_data = cubicPath; + pchar = cubicPath + *offset; + pfloat = (vg_lite_float_t *)pchar; + + while(segs-- > 0) { + /* Adjust relative coordinates. */ + pchar = (char *)pfloat; + *pchar = segmentCommand; + pfloat++; + if(Relative) { + /* Calculate the first control point and convert to relative coordinates. */ + *pfloat++ = (2 * coords->lastX - coords->controlX) - coords->lastX; + *pfloat++ = (2 * coords->lastY - coords->controlY) - coords->lastY; + *pfloat++ = ControlX; + *pfloat++ = ControlY; + *pfloat++ = EndX; + *pfloat++ = EndY; + *offset += (1 + 6) * SIZEOF(vg_lite_float_t); + } + else { + *pfloat++ = 2 * coords->lastX - coords->controlX; + *pfloat++ = 2 * coords->lastY - coords->controlY; + *pfloat++ = ControlX; + *pfloat++ = ControlY; + *pfloat++ = EndX; + *pfloat++ = EndY; + *offset += (1 + 6) * SIZEOF(vg_lite_float_t); + } + } + /* Update the control coordinates. */ + coords->lastX = endX; + coords->lastY = endY; + coords->controlX = controlX; + coords->controlY = controlY; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t _convert_squad( + vg_lite_float_t EndX, + vg_lite_float_t EndY, + uint8_t Relative, + vg_lite_control_coord_t * coords, + void ** path_data, + uint32_t * offset, + uint32_t last_size +) +{ + vg_lite_float_t endX, endY; + uint8_t segmentCommand; + int32_t segs; + uint32_t bufferSize; + char * pchar, * quadPath; + vg_lite_float_t * pfloat; + vg_lite_float_t ControlX1; + vg_lite_float_t ControlY1; + vg_lite_float_t controlX; + vg_lite_float_t controlY; + /******************************************************************* + ** Converting. + */ + if(path_data == NULL || *path_data == NULL || offset == NULL || coords == NULL) + return VG_LITE_INVALID_ARGUMENT; + segs = 1; + if(Relative) { + endX = EndX + coords->lastX; + endY = EndY + coords->lastY; + } + else { + endX = EndX; + endY = EndY; + } + + /* Determine the segment command. */ + segmentCommand = Relative + ? VLC_OP_QUAD_REL + : VLC_OP_QUAD; + + /* Determine the size of the buffer required. */ + bufferSize = (1 + 4) * SIZEOF(vg_lite_float_t) * segs; + + quadPath = (char *)vg_lite_os_malloc(*offset + bufferSize + last_size); + if(quadPath == NULL) + return VG_LITE_OUT_OF_RESOURCES; +#if(CHIPID == 0x355) + memset(quadPath, 0, *offset + bufferSize + last_size); +#endif + memcpy(quadPath, (char *)*path_data, *offset); + vg_lite_os_free(*path_data); + + *path_data = quadPath; + pchar = quadPath + *offset; + pfloat = (vg_lite_float_t *)pchar; + + while(segs-- > 0) { + /* Adjust relative coordinates. */ + pchar = (char *)pfloat; + *pchar = segmentCommand; + pfloat++; + if(Relative) { + ControlX1 = *pfloat++ = (2 * coords->lastX - coords->controlX) - coords->lastX; + ControlY1 = *pfloat++ = (2 * coords->lastY - coords->controlY) - coords->lastY; + controlX = ControlX1 + coords->lastX; + controlY = ControlY1 + coords->lastY; + *pfloat++ = EndX; + *pfloat++ = EndY; + *offset += (1 + 4) * SIZEOF(vg_lite_float_t); + } + else { + controlX = *pfloat++ = 2 * coords->lastX - coords->controlX; + controlY = *pfloat++ = 2 * coords->lastY - coords->controlY; + *pfloat++ = EndX; + *pfloat++ = EndY; + *offset += (1 + 4) * SIZEOF(vg_lite_float_t); + } + } + /* Update the control coordinates. */ + coords->startX = coords->lastX; + coords->startY = coords->lastY; + coords->lastX = endX; + coords->lastY = endY; + coords->controlX = controlX; + coords->controlY = controlY; + + return VG_LITE_SUCCESS; +} + +/*! + @discussion + Convert arc to multi-segment bezier curve. + @param HorRadius + Major axis radius. + @param VerRadius + minor axis radius. + @param RotAngle + Rotation angle. + @param EndX + End coordinate x. + @param EndX + End coordinate y. + @param CounterClockwise + If this is 0,anticlockwise rotation,if this is 1,clockwise rotation. + @param Large + 1 means big arc,0 means little arc. + @param Relative + 1 means absolute coordinates,0 means relative coordinates. + @param coords + Including the start point coordinates of the path,the control point of the last segment of the path, + and the end point of the last segment of the path. + @param path_data + Path data usr for internal conversion. + @param offset + The offset of path_data. + @param last_size + The remain unconverted size of the original path data. + @result + Error code. VG_LITE_INVALID_ARGUMENTS to indicate the parameters are wrong. +*/ +vg_lite_error_t _convert_arc( + vg_lite_float_t HorRadius, + vg_lite_float_t VerRadius, + vg_lite_float_t RotAngle, + vg_lite_float_t EndX, + vg_lite_float_t EndY, + uint8_t CounterClockwise, + uint8_t Large, + uint8_t Relative, + vg_lite_control_coord_t * coords, + void ** path_data, + uint32_t * offset, + uint32_t last_size +) +{ + vg_lite_float_t endX, endY; + uint8_t segmentCommand; + vg_lite_float_t phi, cosPhi, sinPhi; + vg_lite_float_t dxHalf, dyHalf; + vg_lite_float_t x1Prime, y1Prime; + vg_lite_float_t rx, ry; + vg_lite_float_t x1PrimeSquare, y1PrimeSquare; + vg_lite_float_t lambda; + vg_lite_float_t rxSquare, rySquare; + int32_t sign; + vg_lite_float_t sq, signedSq; + vg_lite_float_t cxPrime, cyPrime; + vg_lite_float_t theta1, thetaSpan; + int32_t segs; + vg_lite_float_t theta, ax, ay, x, y; + vg_lite_float_t controlX, controlY, anchorX, anchorY; + vg_lite_float_t lastX, lastY; + uint32_t bufferSize; + char * pchar, * arcPath; + vg_lite_float_t * pfloat; + + /******************************************************************* + ** Converting. + */ + if(path_data == NULL || *path_data == NULL || offset == NULL || coords == NULL) + return VG_LITE_INVALID_ARGUMENT; + + if(Relative) { + endX = EndX + coords->lastX; + endY = EndY + coords->lastY; + } + else { + endX = EndX; + endY = EndY; + } + + phi = RotAngle / 180.0f * PI; + cosPhi = COSF(phi); + sinPhi = SINF(phi); + + if(Relative) { + dxHalf = - EndX / 2.0f; + dyHalf = - EndY / 2.0f; + } + else { + dxHalf = (coords->lastX - endX) / 2.0f; + dyHalf = (coords->lastY - endY) / 2.0f; + } + + x1Prime = cosPhi * dxHalf + sinPhi * dyHalf; + y1Prime = -sinPhi * dxHalf + cosPhi * dyHalf; + + rx = FABSF(HorRadius); + ry = FABSF(VerRadius); + + x1PrimeSquare = x1Prime * x1Prime; + y1PrimeSquare = y1Prime * y1Prime; + + lambda = x1PrimeSquare / (rx * rx) + y1PrimeSquare / (ry * ry); + if(lambda > 1.0f) { + rx *= SQRTF(lambda); + ry *= SQRTF(lambda); + } + + rxSquare = rx * rx; + rySquare = ry * ry; + + sign = (Large == CounterClockwise) ? -1 : 1; + sq = (rxSquare * rySquare + - rxSquare * y1PrimeSquare + - rySquare * x1PrimeSquare + ) + / + (rxSquare * y1PrimeSquare + + rySquare * x1PrimeSquare + ); + signedSq = sign * ((sq < 0) ? 0 : SQRTF(sq)); + cxPrime = signedSq * (rx * y1Prime / ry); + cyPrime = signedSq * -(ry * x1Prime / rx); + + theta1 = _angle(1, 0, (x1Prime - cxPrime) / rx, (y1Prime - cyPrime) / ry); + theta1 = FMODF(theta1, 2 * PI); + + thetaSpan = _angle((x1Prime - cxPrime) / rx, (y1Prime - cyPrime) / ry, + (-x1Prime - cxPrime) / rx, (-y1Prime - cyPrime) / ry); + + if(!CounterClockwise && (thetaSpan > 0)) { + thetaSpan -= 2 * PI; + } + else if(CounterClockwise && (thetaSpan < 0)) { + thetaSpan += 2 * PI; + } + + thetaSpan = FMODF(thetaSpan, 2 * PI); + + /******************************************************************* + ** Drawing. + */ + segs = (int32_t)(CEILF(FABSF(thetaSpan) / (45.0f / 180.0f * PI))); + + theta = thetaSpan / segs; + + ax = coords->lastX - COSF(theta1) * rx; + ay = coords->lastY - SINF(theta1) * ry; + if(FABSF(HorRadius) != 0 && + FABSF(VerRadius) != 0 && + (endX != coords->lastX || endY != coords->lastY)) { + /* Determine the segment command. */ + segmentCommand = Relative + ? VLC_OP_QUAD_REL + : VLC_OP_QUAD; + + /* Determine the size of the buffer required. */ + bufferSize = (1 + 2 * 2) * SIZEOF(vg_lite_float_t) * segs; + + arcPath = (char *)vg_lite_os_malloc(*offset + bufferSize + last_size); + if(arcPath == NULL) + return VG_LITE_OUT_OF_RESOURCES; +#if(CHIPID == 0x355) + memset(arcPath, 0, *offset + bufferSize + last_size); +#endif + memcpy(arcPath, (char *)*path_data, *offset); + vg_lite_os_free(*path_data); + + *path_data = arcPath; + + pchar = arcPath + *offset; + pfloat = (vg_lite_float_t *)pchar; + + /* Set initial last point. */ + lastX = coords->lastX; + lastY = coords->lastY; + + while(segs-- > 0) { + theta1 += theta; + + controlX = ax + COSF(theta1 - (theta / 2.0f)) * rx / COSF(theta / 2.0f); + controlY = ay + SINF(theta1 - (theta / 2.0f)) * ry / COSF(theta / 2.0f); + + anchorX = ax + COSF(theta1) * rx; + anchorY = ay + SINF(theta1) * ry; + + if(RotAngle != 0) { + x = coords->lastX + cosPhi * (controlX - coords->lastX) - sinPhi * (controlY - coords->lastY); + y = coords->lastY + sinPhi * (controlX - coords->lastX) + cosPhi * (controlY - coords->lastY); + controlX = x; + controlY = y; + + x = coords->lastX + cosPhi * (anchorX - coords->lastX) - sinPhi * (anchorY - coords->lastY); + y = coords->lastY + sinPhi * (anchorX - coords->lastX) + cosPhi * (anchorY - coords->lastY); + anchorX = x; + anchorY = y; + } + + if(segs == 0) { + /* Use end point directly to avoid accumulated errors. */ + anchorX = endX; + anchorY = endY; + } + + /* Adjust relative coordinates. */ + if(Relative) { + vg_lite_float_t nextLastX = anchorX; + vg_lite_float_t nextLastY = anchorY; + + controlX -= lastX; + controlY -= lastY; + + anchorX -= lastX; + anchorY -= lastY; + + lastX = nextLastX; + lastY = nextLastY; + } + pchar = (char *)pfloat; + *pchar = segmentCommand; + pfloat++; + *pfloat++ = controlX; + *pfloat++ = controlY; + *pfloat++ = anchorX; + *pfloat++ = anchorY; + *offset += (1 + 2 * 2) * SIZEOF(vg_lite_float_t); + } + } + else { + /* Determine the segment command. */ + segmentCommand = Relative + ? VLC_OP_LINE_REL + : VLC_OP_LINE; + + /* Determine the size of the buffer required. */ + bufferSize = (1 + 2) * SIZEOF(vg_lite_float_t); + + arcPath = (char *)vg_lite_os_malloc(*offset + bufferSize + last_size); + if(arcPath == NULL) + return VG_LITE_OUT_OF_RESOURCES; + memcpy(arcPath, (char *)*path_data, *offset); + vg_lite_os_free(*path_data); + + *path_data = arcPath; + + pchar = arcPath + *offset; + pfloat = (vg_lite_float_t *)pchar; + pchar = (char *)pfloat; + *pchar = segmentCommand; + pfloat++; + *pfloat++ = Relative ? EndX : endX; + *pfloat++ = Relative ? EndY : endY; + *offset += (1 + 2) * SIZEOF(vg_lite_float_t); + + } + /* Update the control coordinates. */ + coords->lastX = endX; + coords->lastY = endY; + coords->controlX = endX; + coords->controlY = endY; + + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_init_arc_path(vg_lite_path_t * path, + vg_lite_format_t data_format, + vg_lite_quality_t quality, + vg_lite_uint32_t path_length, + vg_lite_pointer path_data, + vg_lite_float_t min_x, vg_lite_float_t min_y, + vg_lite_float_t max_x, vg_lite_float_t max_y) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + uint32_t i = 0, j, command = 0, offset = 0; + vg_lite_float_t moveToX, moveToY, lineToX, lineToY, controlX, controlY, quadToX, quadToY; + vg_lite_float_t controlX1, controlY1, controlX2, controlY2, cubicToX, cubicToY; + vg_lite_float_t horRadius, verRadius, rotAngle, endX, endY; + float * pfloat, * fpath; + char * cpath, * pathdata; + vg_lite_control_coord_t coords; + char add_end = path->add_end; + vg_lite_int32_t bytes; + vg_lite_pointer path_data_fp32 = path_data; + int8_t cmd, * path_data_s8_ptr; + int16_t * path_data_s16_ptr; + int32_t * path_data_s32_ptr; + float * path_data_fp32_ptr; + int32_t data_size, num = 0; + memset(&coords, 0, sizeof(vg_lite_control_coord_t)); + coords.lastX = s_context.path_lastX; + coords.lastY = s_context.path_lastY; + +#if gcFEATURE_VG_TRACE_API + VGLITE_LOG("vg_lite_init_arc_path %p %d %d %d %p %f %f %f %f\n", path, data_format, quality, path_length, path_data, + min_x, min_y, max_x, max_y); +#endif + + if(path == NULL || path_data == NULL) + return VG_LITE_INVALID_ARGUMENT; + + /* Path data cannot end with a CLOSE op. Replace CLOSE with END for path_data */ + data_size = get_data_size(data_format); + num = path_length / data_size; + + switch(data_format) { + case VG_LITE_S8: + if(path_data && (*((char *)path_data + num - 1) == VLC_OP_CLOSE)) { + *(char *)((int *)path_data + num - 1) = VLC_OP_END; + } + break; + + case VG_LITE_S16: + if(path_data && (*(char *)((short *)path_data + num - 1) == VLC_OP_CLOSE)) { + *(char *)((short *)path_data + num - 1) = VLC_OP_END; + } + break; + + case VG_LITE_S32: + if(path_data && (*(char *)((int *)path_data + num - 1) == VLC_OP_CLOSE)) { + *(char *)((int *)path_data + num - 1) = VLC_OP_END; + } + break; + + case VG_LITE_FP32: + if(path_data && (*(char *)((float *)path_data + num - 1) == VLC_OP_CLOSE)) { + *(char *)((float *)path_data + num - 1) = VLC_OP_END; + } + break; + + default: + break; + } + + /* Convert path format into float. */ + switch(data_format) { + case VG_LITE_S8: + /* src_s8, dst_fp32 */ + bytes = path_length * 4; + path_data_fp32 = vg_lite_os_malloc(bytes); + if(path_data_fp32 == NULL) + return VG_LITE_OUT_OF_RESOURCES; + memset(path_data_fp32, 0, bytes); + path_data_fp32_ptr = path_data_fp32; + path_data_s8_ptr = (int8_t *)path_data; + i = 0; + while(i < path_length) { + cmd = *(uint8_t *)path_data_s8_ptr; + *(uint8_t *)path_data_fp32_ptr = cmd; + path_data_s8_ptr++; + path_data_fp32_ptr++; + for(j = 0; j < _commandSize_float[cmd] / 4 - 1; j++) { + *path_data_fp32_ptr = (float)(*path_data_s8_ptr); + path_data_fp32_ptr++; + path_data_s8_ptr++; + } + i += _commandSize_float[cmd] / 4; + } + path_length *= 4; + break; + + case VG_LITE_S16: + /* src_s16, dst_fp32 */ + bytes = path_length * 2; + path_data_fp32 = vg_lite_os_malloc(bytes); + if(path_data_fp32 == NULL) + return VG_LITE_OUT_OF_RESOURCES; + memset(path_data_fp32, 0, bytes); + path_data_fp32_ptr = path_data_fp32; + path_data_s16_ptr = (int16_t *)path_data; + i = 0; + while(i < path_length) { + cmd = *(uint8_t *)path_data_s16_ptr; + *(uint8_t *)path_data_fp32_ptr = cmd; + path_data_s16_ptr++; + path_data_fp32_ptr++; + for(j = 0; j < _commandSize_float[cmd] / 4 - 1; j++) { + *path_data_fp32_ptr = (float)(*path_data_s16_ptr); + path_data_fp32_ptr++; + path_data_s16_ptr++; + } + i += _commandSize_float[cmd] / 2; + } + path_length *= 2; + break; + + case VG_LITE_S32: + /* src_s32, dst_fp32 */ + bytes = path_length; + path_data_fp32 = vg_lite_os_malloc(bytes); + if(path_data_fp32 == NULL) + return VG_LITE_OUT_OF_RESOURCES; + memset(path_data_fp32, 0, bytes); + path_data_fp32_ptr = path_data_fp32; + path_data_s32_ptr = (int32_t *)path_data; + i = 0; + while(i < path_length) { + cmd = *(uint8_t *)path_data_s32_ptr; + *(uint8_t *)path_data_fp32_ptr = cmd; + path_data_s32_ptr++; + path_data_fp32_ptr++; + for(j = 0; j < _commandSize_float[cmd] / 4 - 1; j++) { + *path_data_fp32_ptr = (float)(*path_data_s32_ptr); + path_data_fp32_ptr++; + path_data_s32_ptr++; + } + i += _commandSize_float[cmd]; + } + break; + + case VG_LITE_FP32: { + /* src_fp32, dst_fp32 */ + bytes = path_length; + path_data_fp32 = vg_lite_os_malloc(bytes); + if(path_data_fp32 == NULL) + return VG_LITE_OUT_OF_RESOURCES; +#if(CHIPID == 0x355) + memset(path_data_fp32, 0, bytes); +#endif + memcpy(path_data_fp32, path_data, bytes); + break; + } + + default: + break; + } + + vg_lite_clear_path(path); + + data_format = VG_LITE_FP32; + if(!path_length) { + path->format = data_format; + path->quality = quality; + path->bounding_box[0] = min_x; + path->bounding_box[1] = min_y; + path->bounding_box[2] = max_x; + path->bounding_box[3] = max_y; + path->path_length = 0; + path->path = NULL; + path->pdata_internal = 1; + path->path_changed = 1; + path->uploaded.address = 0; + path->uploaded.bytes = 0; + path->uploaded.handle = NULL; + path->uploaded.memory = NULL; + return VG_LITE_SUCCESS; + } + path->add_end = add_end; + path->bounding_box[0] = min_x; + path->bounding_box[1] = min_y; + path->bounding_box[2] = max_x; + path->bounding_box[3] = max_y; + pathdata = (char *)vg_lite_os_malloc(path_length); + if(pathdata == NULL) + return VG_LITE_OUT_OF_RESOURCES; +#if(CHIPID == 0x355) + memset(pathdata, 0, path_length); +#endif + pfloat = (vg_lite_float_t *)path_data_fp32; + i = 0; + while(i < path_length) { + cpath = (char *)pfloat; + command = (uint32_t) * cpath; + pfloat++; +#if (CHIPID==0x355) + uint8_t flag = 0; + if(command == VLC_OP_CLOSE) { + if(*((uint32_t *)cpath + 1) == VLC_OP_MOVE || *((uint32_t *)cpath + 1) == VLC_OP_MOVE_REL) { + flag = 1; + } + } +#endif + switch(command) { + case VLC_OP_END: + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; + *cpath = VLC_OP_END; + offset += _commandSize_float[VLC_OP_END]; + i += _commandSize_float[VLC_OP_END]; + break; + case VLC_OP_CLOSE: + /* Update the control coordinates. */ + coords.lastX = coords.startX; + coords.lastY = coords.startY; + coords.controlX = coords.startX; + coords.controlY = coords.startY; + + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; +#if (CHIPID==0x355) + if(flag == 1) { + if(data_size == 1) { + *cpath = VLC_OP_CLOSE; + } + else if(data_size == 2) { + *(uint16_t *)cpath = 0x0101; + } + else if(data_size == 4) { + *(uint32_t *)cpath = 0x01010101; + } + } + else +#endif + { + *cpath = VLC_OP_CLOSE; + } + offset += _commandSize_float[VLC_OP_CLOSE]; + i += _commandSize_float[VLC_OP_CLOSE]; + break; + case VLC_OP_MOVE: + moveToX = *pfloat; + pfloat++; + moveToY = *pfloat; + pfloat++; + + /* Update the control coordinates. */ + coords.startX = moveToX; + coords.startY = moveToY; + coords.lastX = moveToX; + coords.lastY = moveToY; + coords.controlX = moveToX; + coords.controlY = moveToY; + + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; + *cpath = VLC_OP_MOVE; + fpath++; + *fpath = moveToX; + fpath++; + *fpath = moveToY; + fpath++; + offset += _commandSize_float[VLC_OP_MOVE]; + i += _commandSize_float[VLC_OP_MOVE]; + break; + case VLC_OP_MOVE_REL: + moveToX = *pfloat; + pfloat++; + moveToY = *pfloat; + pfloat++; + + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; + *cpath = VLC_OP_MOVE_REL; + fpath++; + *fpath = moveToX; + fpath++; + *fpath = moveToY; + fpath++; + offset += _commandSize_float[VLC_OP_MOVE_REL]; + i += _commandSize_float[VLC_OP_MOVE_REL]; + + /* Determine the absolute coordinates. */ + moveToX += coords.lastX; + moveToY += coords.lastY; + + /* Update the control coordinates. */ + coords.startX = moveToX; + coords.startY = moveToY; + coords.lastX = moveToX; + coords.lastY = moveToY; + coords.controlX = moveToX; + coords.controlY = moveToY; + break; + case VLC_OP_LINE: + lineToX = *pfloat; + pfloat++; + lineToY = *pfloat; + pfloat++; + + /* Update the control coordinates. */ + coords.lastX = lineToX; + coords.lastY = lineToY; + coords.controlX = lineToX; + coords.controlY = lineToY; + + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; + *cpath = VLC_OP_LINE; + fpath++; + *fpath = lineToX; + fpath++; + *fpath = lineToY; + fpath++; + offset += _commandSize_float[VLC_OP_LINE]; + i += _commandSize_float[VLC_OP_LINE]; + break; + case VLC_OP_LINE_REL: + lineToX = *pfloat; + pfloat++; + lineToY = *pfloat; + pfloat++; + + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; + *cpath = VLC_OP_LINE_REL; + fpath++; + *fpath = lineToX; + fpath++; + *fpath = lineToY; + fpath++; + offset += _commandSize_float[VLC_OP_LINE_REL]; + i += _commandSize_float[VLC_OP_LINE_REL]; + + /* Determine the absolute coordinates. */ + lineToX += coords.lastX; + lineToY += coords.lastY; + + /* Update the control coordinates. */ + coords.lastX = lineToX; + coords.lastY = lineToY; + coords.controlX = lineToX; + coords.controlY = lineToY; + break; + case VLC_OP_QUAD: + controlX = *pfloat; + pfloat++; + controlY = *pfloat; + pfloat++; + quadToX = *pfloat; + pfloat++; + quadToY = *pfloat; + pfloat++; + compute_quadpathbounds(path, coords.lastX, coords.lastY, controlX, controlY, quadToX, quadToY); + /* Update the control coordinates. */ + coords.lastX = quadToX; + coords.lastY = quadToY; + coords.controlX = controlX; + coords.controlY = controlY; + + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; + *cpath = VLC_OP_QUAD; + fpath++; + *fpath = controlX; + fpath++; + *fpath = controlY; + fpath++; + *fpath = quadToX; + fpath++; + *fpath = quadToY; + fpath++; + offset += _commandSize_float[VLC_OP_QUAD]; + i += _commandSize_float[VLC_OP_QUAD]; + break; + case VLC_OP_SQUAD: + quadToX = *pfloat; + pfloat++; + quadToY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SQUAD]; + /* Update the control coordinates. */ + VG_LITE_ERROR_HANDLER(_convert_squad(quadToX, quadToY, VGL_FALSE, &coords, (void *)&pathdata, &offset, + path_length - i)); + compute_quadpathbounds(path, coords.startX, coords.startY, coords.controlX, coords.controlY, quadToX, quadToY); + break; + case VLC_OP_SQUAD_REL: + quadToX = *pfloat; + pfloat++; + quadToY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SQUAD_REL]; + /* Update the control coordinates. */ + VG_LITE_ERROR_HANDLER(_convert_squad(quadToX, quadToY, VGL_TRUE, &coords, (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_QUAD_REL: + controlX = *pfloat; + pfloat++; + controlY = *pfloat; + pfloat++; + quadToX = *pfloat; + pfloat++; + quadToY = *pfloat; + pfloat++; + + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; + *cpath = VLC_OP_QUAD_REL; + fpath++; + *fpath = controlX; + fpath++; + *fpath = controlY; + fpath++; + *fpath = quadToX; + fpath++; + *fpath = quadToY; + fpath++; + offset += _commandSize_float[VLC_OP_QUAD_REL]; + i += _commandSize_float[VLC_OP_QUAD_REL]; + + /* Determine the absolute coordinates. */ + controlX += coords.lastX; + controlY += coords.lastY; + quadToX += coords.lastX; + quadToY += coords.lastY; + + /* Update the control coordinates. */ + coords.lastX = quadToX; + coords.lastY = quadToY; + coords.controlX = controlX; + coords.controlY = controlY; + break; + case VLC_OP_CUBIC: + controlX1 = *pfloat; + pfloat++; + controlY1 = *pfloat; + pfloat++; + controlX2 = *pfloat; + pfloat++; + controlY2 = *pfloat; + pfloat++; + cubicToX = *pfloat; + pfloat++; + cubicToY = *pfloat; + pfloat++; + + /* Update the control coordinates. */ + coords.lastX = cubicToX; + coords.lastY = cubicToY; + coords.controlX = controlX2; + coords.controlY = controlY2; + + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; + *cpath = VLC_OP_CUBIC; + fpath++; + *fpath = controlX1; + fpath++; + *fpath = controlY1; + fpath++; + *fpath = controlX2; + fpath++; + *fpath = controlY2; + fpath++; + *fpath = cubicToX; + fpath++; + *fpath = cubicToY; + fpath++; + offset += _commandSize_float[VLC_OP_CUBIC]; + i += _commandSize_float[VLC_OP_CUBIC]; + break; + case VLC_OP_CUBIC_REL: + controlX1 = *pfloat; + pfloat++; + controlY1 = *pfloat; + pfloat++; + controlX2 = *pfloat; + pfloat++; + controlY2 = *pfloat; + pfloat++; + cubicToX = *pfloat; + pfloat++; + cubicToY = *pfloat; + pfloat++; + + cpath = (char *)pathdata + offset; + fpath = (vg_lite_float_t *)cpath; + *cpath = VLC_OP_CUBIC_REL; + fpath++; + *fpath = controlX1; + fpath++; + *fpath = controlY1; + fpath++; + *fpath = controlX2; + fpath++; + *fpath = controlY2; + fpath++; + *fpath = cubicToX; + fpath++; + *fpath = cubicToY; + fpath++; + offset += _commandSize_float[VLC_OP_CUBIC_REL]; + i += _commandSize_float[VLC_OP_CUBIC_REL]; + + /* Determine the absolute coordinates. */ + controlX2 += coords.lastX; + controlY2 += coords.lastY; + cubicToX += coords.lastX; + cubicToY += coords.lastY; + + /* Update the control coordinates. */ + coords.lastX = cubicToX; + coords.lastY = cubicToY; + coords.controlX = controlX2; + coords.controlY = controlY2; + break; + case VLC_OP_SCUBIC: + controlX1 = *pfloat; + pfloat++; + controlY1 = *pfloat; + pfloat++; + cubicToX = *pfloat; + pfloat++; + cubicToY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCUBIC]; + /* Update the control coordinates. */ + VG_LITE_ERROR_HANDLER(_convert_scubic(cubicToX, cubicToY, controlX1, controlY1, VGL_FALSE, &coords, (void *)&pathdata, + &offset, path_length - i)); + break; + case VLC_OP_SCUBIC_REL: + controlX1 = *pfloat; + pfloat++; + controlY1 = *pfloat; + pfloat++; + cubicToX = *pfloat; + pfloat++; + cubicToY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCUBIC_REL]; + /* Update the control coordinates. */ + VG_LITE_ERROR_HANDLER(_convert_scubic(cubicToX, cubicToY, controlX1, controlY1, VGL_TRUE, &coords, (void *)&pathdata, + &offset, path_length - i)); + break; + case VLC_OP_HLINE: + lineToX = *pfloat; + pfloat++; + lineToY = coords.lastY; + i += _commandSize_float[VLC_OP_HLINE]; + /* Update the control coordinates. */ + VG_LITE_ERROR_HANDLER(_convert_hline(lineToX, lineToY, VGL_FALSE, &coords, (void *)&pathdata, &offset, + path_length - i)); + break; + case VLC_OP_HLINE_REL: + lineToX = *pfloat; + pfloat++; + lineToY = coords.lastY; + i += _commandSize_float[VLC_OP_HLINE_REL]; + /* Update the control coordinates. */ + VG_LITE_ERROR_HANDLER(_convert_hline(lineToX, lineToY, VGL_TRUE, &coords, (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_VLINE: + lineToX = coords.lastX; + lineToY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_VLINE]; + /* Update the control coordinates. */ + VG_LITE_ERROR_HANDLER(_convert_vline(lineToX, lineToY, VGL_FALSE, &coords, (void *)&pathdata, &offset, + path_length - i)); + break; + case VLC_OP_VLINE_REL: + lineToX = coords.lastX; + lineToY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_VLINE_REL]; + /* Update the control coordinates. */ + VG_LITE_ERROR_HANDLER(_convert_vline(lineToX, lineToY, VGL_TRUE, &coords, (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_SCCWARC: + horRadius = *pfloat; + pfloat++; + verRadius = *pfloat; + pfloat++; + rotAngle = *pfloat; + pfloat++; + endX = *pfloat; + pfloat++; + endY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCCWARC]; + VG_LITE_ERROR_HANDLER(_convert_arc(horRadius, verRadius, rotAngle, endX, endY, VGL_FALSE, VGL_FALSE, VGL_FALSE, &coords, + (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_SCCWARC_REL: + horRadius = *pfloat; + pfloat++; + verRadius = *pfloat; + pfloat++; + rotAngle = *pfloat; + pfloat++; + endX = *pfloat; + pfloat++; + endY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCCWARC_REL]; + VG_LITE_ERROR_HANDLER(_convert_arc(horRadius, verRadius, rotAngle, endX, endY, VGL_FALSE, VGL_FALSE, VGL_TRUE, &coords, + (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_SCWARC: + horRadius = *pfloat; + pfloat++; + verRadius = *pfloat; + pfloat++; + rotAngle = *pfloat; + pfloat++; + endX = *pfloat; + pfloat++; + endY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCCWARC_REL]; + VG_LITE_ERROR_HANDLER(_convert_arc(horRadius, verRadius, rotAngle, endX, endY, VGL_TRUE, VGL_FALSE, VGL_FALSE, &coords, + (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_SCWARC_REL: + horRadius = *pfloat; + pfloat++; + verRadius = *pfloat; + pfloat++; + rotAngle = *pfloat; + pfloat++; + endX = *pfloat; + pfloat++; + endY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCCWARC_REL]; + VG_LITE_ERROR_HANDLER(_convert_arc(horRadius, verRadius, rotAngle, endX, endY, VGL_TRUE, VGL_FALSE, VGL_TRUE, &coords, + (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_LCCWARC: + horRadius = *pfloat; + pfloat++; + verRadius = *pfloat; + pfloat++; + rotAngle = *pfloat; + pfloat++; + endX = *pfloat; + pfloat++; + endY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCCWARC_REL]; + VG_LITE_ERROR_HANDLER(_convert_arc(horRadius, verRadius, rotAngle, endX, endY, VGL_FALSE, VGL_TRUE, VGL_FALSE, &coords, + (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_LCCWARC_REL: + horRadius = *pfloat; + pfloat++; + verRadius = *pfloat; + pfloat++; + rotAngle = *pfloat; + pfloat++; + endX = *pfloat; + pfloat++; + endY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCCWARC_REL]; + VG_LITE_ERROR_HANDLER(_convert_arc(horRadius, verRadius, rotAngle, endX, endY, VGL_FALSE, VGL_TRUE, VGL_TRUE, &coords, + (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_LCWARC: + horRadius = *pfloat; + pfloat++; + verRadius = *pfloat; + pfloat++; + rotAngle = *pfloat; + pfloat++; + endX = *pfloat; + pfloat++; + endY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCCWARC_REL]; + VG_LITE_ERROR_HANDLER(_convert_arc(horRadius, verRadius, rotAngle, endX, endY, VGL_TRUE, VGL_TRUE, VGL_FALSE, &coords, + (void *)&pathdata, &offset, path_length - i)); + break; + case VLC_OP_LCWARC_REL: + horRadius = *pfloat; + pfloat++; + verRadius = *pfloat; + pfloat++; + rotAngle = *pfloat; + pfloat++; + endX = *pfloat; + pfloat++; + endY = *pfloat; + pfloat++; + i += _commandSize_float[VLC_OP_SCCWARC_REL]; + VG_LITE_ERROR_HANDLER(_convert_arc(horRadius, verRadius, rotAngle, endX, endY, VGL_TRUE, VGL_TRUE, VGL_TRUE, &coords, + (void *)&pathdata, &offset, path_length - i)); + break; + default: + break; + } + } + + if(path_data_fp32 != NULL) + vg_lite_os_free(path_data_fp32); + path->format = VG_LITE_FP32; + path->quality = quality; + path->path_length = offset; + path->path = pathdata; + path->pdata_internal = 1; + path->path_changed = 1; + path->uploaded.address = 0; + path->uploaded.bytes = 0; + path->uploaded.handle = NULL; + path->uploaded.memory = NULL; + s_context.path_lastX = coords.lastX; + s_context.path_lastY = coords.lastY; + return VG_LITE_SUCCESS; + +ErrorHandler: + vg_lite_os_free(pathdata); + pathdata = NULL; + return error; +} + +#else /* gcFEATURE_VG_ARC_PATH */ + +vg_lite_error_t vg_lite_init_arc_path(vg_lite_path_t * path, + vg_lite_format_t data_format, + vg_lite_quality_t quality, + vg_lite_uint32_t path_length, + vg_lite_pointer path_data, + vg_lite_float_t min_x, vg_lite_float_t min_y, + vg_lite_float_t max_x, vg_lite_float_t max_y) +{ + return VG_LITE_NOT_SUPPORT; +} + +#endif /* gcFEATURE_VG_ARC_PATH */ + +#endif /* LV_USE_VG_LITE_DRIVER */ + diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_debug.h b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_debug.h new file mode 100755 index 0000000..9feb7c6 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_debug.h @@ -0,0 +1,77 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#ifndef VG_LITE_DEBUG_H +#define VG_LITE_DEBUG_H + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "vg_lite_kernel.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define vg_lite_kernel_print vg_lite_hal_trace +#define vg_lite_kernel_trace vg_lite_hal_trace +#define vg_lite_kernel_error vg_lite_hal_print +#define vg_lite_kernel_hintmsg vg_lite_hal_print + +#define VG_IS_SUCCESS(error) (error == VG_LITE_SUCCESS) +#define VG_IS_ERROR(error) (error != VG_LITE_SUCCESS) + +#define ONERROR(func) \ + do \ + { \ + error = func; \ + if (VG_IS_ERROR(error)) \ + { \ + vg_lite_kernel_error((char *)"ONERROR: status = %d(%s) %s(%d)\n", error, vg_lite_hal_Status2Name(error), __FUNCTION__, __LINE__); \ + goto on_error; \ + } \ + } \ + while (VG_FALSE) + +#define ASSERT(arg) \ + do \ + { \ + if (!(arg)) \ + { \ + error = VG_LITE_INVALID_ARGUMENT;\ + goto on_error; \ + } \ + } \ + while (VG_FALSE) + +#ifdef __cplusplus +} +#endif + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_DEBUG_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_hal.h b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_hal.h new file mode 100755 index 0000000..1826988 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_hal.h @@ -0,0 +1,332 @@ +/**************************************************************************** +* +* The MIT License (MIT) +* +* Copyright (c) 2014 - 2022 Vivante Corporation +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +* +***************************************************************************** +* +* The GPL License (GPL) +* +* Copyright (C) 2014 - 2022 Vivante Corporation +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +***************************************************************************** +* +* Note: This software is released under dual MIT and GPL licenses. A +* recipient may use this file under the terms of either the MIT license or +* GPL License. If you wish to use only one license not the other, you can +* indicate your decision by deleting one of the above license notices in your +* version of this file. +* +*****************************************************************************/ + +#ifndef VG_LITE_HAL_H +#define VG_LITE_HAL_H + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#define VGLITE_MEM_ALIGNMENT 128 + +#define VGLITE_EVENT_FRAME_END 2 + +#ifdef __cplusplus +extern "C" { +#endif +/*! + @brief Wait a number of milliseconds. + + @discussion + The VGLite hardware requires some waiting when changing clock frequencies or issuing a reset. This is the wrapper function + for the delay function. + + @param milliseconds + The number of milliseconds to wait. + */ +void vg_lite_hal_delay(uint32_t milliseconds); + +/*! + @brief Initialize the hardware. + + @discussion + The VGLite kernel knows how to program its own hardware, but in any SOC there might be additional control required for + turning on the power or initializing the clocks. This function gets called by the VGLite kernel before the VGLite graphics + hardware gets initialized by the VGLite kernel itself and allows for SOC power management control. + + The implementer should make sure that on exit of this function the power and clock to the VGLite graphics hardware is + turned on and stable. + */ +void vg_lite_hal_initialize(void); + +/*! + @brief Uninitialize the hardware. + + @discussion + The VGLite kernel knows how to program its own hardware, but in any SOC there might be additional control required for + turning off the power or uninitializing the clocks. This function gets called by the VGLite kernel after the VGLite + graphics hardware gets uninitialized by the VGLite kernel itself and allows for SOC power management control. + + On exit of this function it is okay to have the power and/or clock to the VGLite graphics hardware turned off. + */ +void vg_lite_hal_deinitialize(void); + +/*! + @brief Allocate contiguous video memory. + + @discussion + Any memory the VGLite graphics hardware will see should be allocated as contiguous memory. Any allocated memory will be + addressed through an opaque handle, usually a pointer to an opaque structure. The porting layer can put any information it + needs inside this structure. + + @param size + The number of bytes to allocate. + + @param pool + select the reserved memory pool + + @param logical + A pointer to a variable that will receive the logical address of the allocated memory for the CPU. + + @param gpu + A pointer to a variable that will receive the physical address of the allocated memory for the VGLite graphics hardware. + + @result + A pointer to an opaque structure that will be used as the memory handle. NULL should be returned if there is not + enough memory. + */ +vg_lite_error_t vg_lite_hal_allocate_contiguous(unsigned long size, vg_lite_vidmem_pool_t pool, void ** logical, + void ** klogical, uint32_t * physical, void ** node); + +/*! + @brief Free contiguous video memory. + + @discussion + Free the memory allocated by {@link vg_lite_hal_allocate_contiguous}. After this function returns, the associated memory + handle is no longer a valid handle. + + @param memory_handle + A pointer to an opaque structure returned by {@link vg_lite_hal_allocate_contiguous}. + */ +void vg_lite_hal_free_contiguous(void * memory_handle); + +/*! + @brief remove unfree node when continuously allocate buffer without free buffer. + + @discussion + Free the node allocated by {@link kmalloc}. After this function returns, the associated memory + handle is no longer a valid handle. + */ +void vg_lite_hal_free_os_heap(void); + +/*! + @brief Map contiguous logical or physical memory into the VGLite graphics hardware space. + + @discussion + Any memory, like a frame buffer or some pre-allocated image or path data, needs to be mapped into the VGLite graphics + hardware address space and wrapped by a memory handle. This allows the VGLite graphics hardware access that memory + directly. + + Either a logical or a physical address should be passed in to map. + + @param size + The number of bytes to map. + + @param logical + The logical address of the memory region to map or NULL if the logical address is not known. + + @param physical + The physical address of the memory region to map if logical is NULL. + + @param gpu + A pointer to a variable that will receive the VGLite graphics hardware addressable address of the mapped region. + + @result + A pointer to an opaque structure that will be used as the memory handle. NULL should be returned if there is + not enough system resources to map the region. + */ +void * vg_lite_hal_map(uint32_t flags, uint32_t bytes, void * logical, uint32_t physical, int32_t dma_buf_fd, + uint32_t * gpu); + +/*! + @brief Unmap a previously mapped region. + + @discussion + If a mapped region by {@link vg_lite_hal_map} is no longer needed, it should be unmapped to free up any allocated system + resources used when mapping the region. + + @param memory_handle + A pointer to an opaque structure returned by {@link vg_lite_hal_map}. + */ +void vg_lite_hal_unmap(void * memory_handle); + +/*! + @brief Execute a memory barrier. + + @discussion + Some systems require a a memory barrier to make sure all store operations in the CPU have been handled. This is the wrapper + function for a memory barrier. + */ +void vg_lite_hal_barrier(void); + +/*! + @brief Read data from a register from the VGLite graphics hardware. + + @discussion + In order to communicate with the VGLite graphics hardware, the kernel needs to read and write to some hardware registers. + In each SOC those registers could be allocated at a different space in the physical memory map. + + @param address + The relative address of the VGLite graphics hardware register to read from. + + @result + The 32-bit value returned from reading the register. + */ +uint32_t vg_lite_hal_peek(uint32_t address); + +/*! + @brief Write data to a register from the VGLite graphics hardware. + + @discussion + In order to communicate with the VGLite graphics hardware, the kernel needs to read and write to some hardware registers. + In each SOC those registers could be allocated at a different space in the physical memory map. + + @param address + The relative address of the VGLite graphics hardware register to write to. + + @param data + The data to write to the VGLite graphics hardware register. + */ +void vg_lite_hal_poke(uint32_t address, uint32_t data); + +/*! + @brief query the remaining allocate contiguous video memory. + + @param data + The data to get the remaining allocate contiguous video memory bytes. + */ +vg_lite_error_t vg_lite_hal_query_mem(vg_lite_kernel_mem_t * mem); + +/*! + @brief Map contiguous physical memory into the user space. + + @param node + This node have 3 attributes, bytes means the number of bytes to map. + physical means the physical address of the memory region to map.logical means + the return logical address of the memory region after map. + */ +vg_lite_error_t vg_lite_hal_map_memory(vg_lite_kernel_map_memory_t * node); + +/*! + @brief Unmap a previously mapped region. + + @param node + This node have 2 attributes, bytes means the number of bytes to unmap.logical means + the logical address of the memory region to unmap. + */ +vg_lite_error_t vg_lite_hal_unmap_memory(vg_lite_kernel_unmap_memory_t * node); + +/*! + @brief Wait until an interrupt from the VGLite graphics hardware has been received. + + @discussion + Currently, the VGLite API is synchronous. This means that after each call it will wait until the VGLite graphics hardware + has completed. The VGLite graphics hardware will send an interrupt when it is finished, and this function will wait until + that interrupt has been received by the operating system. + + A timeout value is specified in order if the kernel wants to wait for a specific number of milliseconds fir the interrupt to + occur. If the interrupt does not occur in the specified timeout, a timeout error will be returned. + + @param timeout + The number of milliseconds to wait for the interrupt before returning a timeout error. If timeout = 0xFFFFFFFF + then {@link vg_lite_hal_wait_interrupt} will wait forever for the interrupt. + + @param mask + Irq event mask to wait for. + + @result + A boolean value indicating whether the interrupt was received (1) or not (0). + */ +int32_t vg_lite_hal_wait_interrupt(uint32_t timeout, uint32_t mask, uint32_t * value); + +/*! + @brief After call vg_lite_hal_map(), flush cpu cache according the direction + spicified by parameter cache_op. + */ +vg_lite_error_t vg_lite_hal_operation_cache(void * handle, vg_lite_cache_op_t cache_op); + +/*! + @brief export memory to dma buf, and get the dma buf fd + */ +vg_lite_error_t vg_lite_hal_memory_export(int32_t * fd); + +/*! + @brief print message + */ +void vg_lite_hal_print(char * format, ...); + +/*! + @brief trace message + */ +void vg_lite_hal_trace(char * format, ...); + +/*! + @brief error number to string + */ +const char * vg_lite_hal_Status2Name(vg_lite_error_t status); + +/*! + @brief allocate virtual memory from os + */ +vg_lite_error_t vg_lite_hal_allocate(uint32_t size, void ** memory); + +/*! + @brief free virtual memory + */ +vg_lite_error_t vg_lite_hal_free(void * memory); + +/*! + @brief set gpu execute state + */ +void vg_lite_set_gpu_execute_state(vg_lite_gpu_execute_state_t state); + +#ifdef __cplusplus +} +#endif + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_HAL_H */ + + diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_hw.h b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_hw.h new file mode 100755 index 0000000..a4c7332 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_hw.h @@ -0,0 +1,98 @@ +/**************************************************************************** +* +* The MIT License (MIT) +* +* Copyright (c) 2014 - 2022 Vivante Corporation +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +* +***************************************************************************** +* +* The GPL License (GPL) +* +* Copyright (C) 2014 - 2022 Vivante Corporation +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +***************************************************************************** +* +* Note: This software is released under dual MIT and GPL licenses. A +* recipient may use this file under the terms of either the MIT license or +* GPL License. If you wish to use only one license not the other, you can +* indicate your decision by deleting one of the above license notices in your +* version of this file. +* +*****************************************************************************/ + +#ifndef VG_LITE_HW_H +#define VG_LITE_HW_H + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#define VG_LITE_HW_CLOCK_CONTROL 0x000 +#define VG_LITE_HW_IDLE 0x004 +#define VG_LITE_INTR_STATUS 0x010 +#define VG_LITE_INTR_ENABLE 0x014 +#define VG_LITE_HW_CHIP_ID 0x020 +#define VG_LITE_HW_CMDBUF_ADDRESS 0x500 +#define VG_LITE_HW_CMDBUF_SIZE 0x504 +#define VG_LITE_POWER_CONTROL 0x100 +#define VG_LITE_POWER_MODULE_CONTROL 0x104 + +#define VG_LITE_EXT_WORK_CONTROL 0x520 +#define VG_LITE_EXT_VIDEO_SIZE 0x524 +#define VG_LITE_EXT_CLEAR_VALUE 0x528 + +#define VG_LITE_EXT_VIDEO_CONTROL 0x51C + +typedef struct clock_control { + uint32_t reserved0 : 1; + uint32_t clock_gate : 1; + uint32_t scale : 7; + uint32_t scale_load : 1; + uint32_t ram_clock_gating : 1; + uint32_t debug_registers : 1; + uint32_t soft_reset : 1; + uint32_t reserved13 : 6; + uint32_t isolate : 1; +} clock_control_t; + +typedef union vg_lite_hw_clock_control { + clock_control_t control; + uint32_t data; +} vg_lite_hw_clock_control_t; + +#define VG_LITE_HW_IDLE_STATE 0x0B05 + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_HW_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_kernel.c b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_kernel.c new file mode 100755 index 0000000..012a02e --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_kernel.c @@ -0,0 +1,1387 @@ +/**************************************************************************** +* +* The MIT License (MIT) +* +* Copyright (c) 2014 - 2022 Vivante Corporation +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +* +***************************************************************************** +* +* The GPL License (GPL) +* +* Copyright (C) 2014 - 2022 Vivante Corporation +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +***************************************************************************** +* +* Note: This software is released under dual MIT and GPL licenses. A +* recipient may use this file under the terms of either the MIT license or +* GPL License. If you wish to use only one license not the other, you can +* indicate your decision by deleting one of the above license notices in your +* version of this file. +* +*****************************************************************************/ + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "../lv_vg_lite_hal/vg_lite_platform.h" +#include "vg_lite_kernel.h" +#include "vg_lite_hal.h" +#include "vg_lite_hw.h" +#if defined(__linux__) && !defined(EMULATOR) + #include + /*#include */ + #include + #include + #include + #include + #include +#endif + +#if gcdVG_RECORD_HARDWARE_RUNNING_TIME + + #ifdef __linux__ + #include + unsigned long start_time, end_time; + unsigned long period_time, total_time = 0; + + #else + #include + struct timeval start_time, end_time; + unsigned long period_time, total_time = 0; + #endif + +#endif + +#define FLEXA_TIMEOUT_STATE BIT(21) +#define FLEXA_HANDSHEKE_FAIL_STATE BIT(22) +#define MIN_TS_SIZE (8 << 10) + +#if gcdVG_ENABLE_BACKUP_COMMAND +# define STATE_COMMAND(address) (0x30010000 | address) +# define END_COMMAND(interrupt) (0x00000000 | interrupt) +# define SEMAPHORE_COMMAND(id) (0x10000000 | id) +# define STALL_COMMAND(id) (0x20000000 | id) + +static vg_lite_kernel_context_t global_power_context = {0}; +static uint32_t * power_context_klogical = NULL; +static uint32_t state_map_table[4096]; +static uint32_t backup_command_buffer_physical; +static void * backup_command_buffer_klogical; +static uint32_t backup_command_buffer_size; +uint32_t init_buffer[12]; +uint32_t is_init; +size_t physical_address; +#endif + +static int s_reference = 0; + +#if gcdVG_ENABLE_DELAY_RESUME + static int delay_resume = 0; +#endif + +#if gcdVG_ENABLE_GPU_RESET + static uint32_t gpu_reset_count = 0; +#endif + +static vg_lite_error_t do_terminate(vg_lite_kernel_terminate_t * data); +static vg_lite_error_t vg_lite_kernel_vidmem_allocate(uint32_t * bytes, uint32_t flags, vg_lite_vidmem_pool_t pool, + void ** memory, void ** kmemory, uint32_t * memory_gpu, void ** memory_handle); +static vg_lite_error_t vg_lite_kernel_vidmem_free(void * handle); +static void soft_reset(void); +static vg_lite_error_t do_wait(vg_lite_kernel_wait_t * data); + +#if gcdVG_ENABLE_BACKUP_COMMAND +static vg_lite_error_t restore_gpu_state(void); + +static vg_lite_error_t restore_init_command(uint32_t physical, uint32_t size) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_uint32_t total_suspend_time = 0; + vg_lite_uint32_t suspend_time_limit = 1000; + + /* flush cache. */ + vg_lite_hal_barrier(); + + vg_lite_hal_poke(VG_LITE_HW_CMDBUF_ADDRESS, physical); + vg_lite_hal_poke(VG_LITE_HW_CMDBUF_SIZE, (size + 7) / 8); + + while(!vg_lite_hal_peek(VG_LITE_INTR_STATUS)) { + vg_lite_hal_delay(2); + if(total_suspend_time < suspend_time_limit) { + total_suspend_time += 2; + } + else { + error = VG_LITE_TIMEOUT; + break; + } + } + vg_lite_hal_delay(2); + + return error; +} +#if gcdVG_ENABLE_GPU_RESET && gcdVG_ENABLE_BACKUP_COMMAND +static vg_lite_error_t execute_command(uint32_t physical, uint32_t size, vg_lite_gpu_reset_type_t reset_type) +{ + vg_lite_kernel_wait_t wait; + vg_lite_error_t error = VG_LITE_SUCCESS; + + wait.timeout_ms = 1000; + wait.event_mask = (uint32_t)~0; + wait.reset_type = reset_type; + + /* flush cache. */ + vg_lite_hal_barrier(); + + vg_lite_hal_poke(VG_LITE_HW_CMDBUF_ADDRESS, physical); + vg_lite_hal_poke(VG_LITE_HW_CMDBUF_SIZE, (size + 7) / 8); + + error = do_wait(&wait); + + return error; +} +#endif + +static uint32_t push_command(uint32_t command, uint32_t data, uint32_t index) +{ + uint32_t address = 0; + + if((command & 0xFFFF0000) == 0x30010000) { + address = command & 0x0000FFFF; + state_map_table[address] = index; + } + + if(NULL == power_context_klogical) + power_context_klogical = global_power_context.power_context_klogical; + + power_context_klogical[index++] = command; + power_context_klogical[index++] = data; + + return index; +} + +static vg_lite_error_t backup_power_context_buffer(uint32_t * command_buffer_klogical, uint32_t size) +{ + int index = 0; + uint32_t command = 0; + uint32_t address = 0; + uint32_t context_index = 0; + uint32_t data = 0; + + if(NULL == command_buffer_klogical) { + return VG_LITE_INVALID_ARGUMENT; + } + + for(index = 0; index < size; index++) { + command = command_buffer_klogical[index]; + + if(((command & 0xFFFF0000) == 0x30010000) && ((index % 2) == 0)) { + data = command_buffer_klogical[index + 1]; + address = command & 0x0000FFFF; + context_index = state_map_table[address]; + if((address < 0) || (address > 4095)) { + vg_lite_kernel_print("Index out of bounds, wrong address and data 0x%08X 0x%08X\n", command, data); + return VG_LITE_INVALID_ARGUMENT; + } + if(-1 != context_index) { + power_context_klogical[context_index + 1] = data; + } + else { + power_context_klogical[global_power_context.power_context_size / 4 + 0] = command; + power_context_klogical[global_power_context.power_context_size / 4 + 1] = data; + state_map_table[address] = global_power_context.power_context_size / 4; + global_power_context.power_context_size += 8; + } + } + } + + return VG_LITE_SUCCESS; +} +#endif + +static void gpu(int enable) +{ + vg_lite_hw_clock_control_t value; + uint32_t reset_timer = 2; + const uint32_t reset_timer_limit = 1000; +#if gcdVG_ENABLE_AUTO_CLOCK_GATING + uint32_t data; +#endif + + if(enable) { + /* Enable clock gating. */ + value.data = vg_lite_hal_peek(VG_LITE_HW_CLOCK_CONTROL); + value.control.clock_gate = 0; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); + vg_lite_hal_delay(1); + + /* Set clock speed. */ + value.control.scale = 64; + value.control.scale_load = 1; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); + vg_lite_hal_delay(1); + value.control.scale_load = 0; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); + vg_lite_hal_delay(5); + +#if gcdVG_DUMP_DEBUG_REGISTER + value.control.debug_registers = 0; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); +#endif + + /* Perform a soft reset. */ + soft_reset(); + do { + vg_lite_hal_delay(reset_timer); + reset_timer *= 2; // If reset failed, try again with a longer wait. Need to check why if dead lopp happens here. + } while(!VG_LITE_KERNEL_IS_GPU_IDLE()); + +#if gcdVG_ENABLE_AUTO_CLOCK_GATING + /* Enable Module Clock gating */ + data = vg_lite_hal_peek(VG_LITE_POWER_CONTROL); + data |= 0x1; + vg_lite_hal_poke(VG_LITE_POWER_CONTROL, data); + vg_lite_hal_delay(1); + +#if !gcFEATURE_VG_CLOCK_GATING_TS_MODULE + data = vg_lite_hal_peek(VG_LITE_POWER_MODULE_CONTROL); + data |= 0x800; + vg_lite_hal_poke(VG_LITE_POWER_MODULE_CONTROL, data); + vg_lite_hal_delay(1); +#endif + +#if !gcFEATURE_VG_CLOCK_GATING_VG_MODULE + data = vg_lite_hal_peek(VG_LITE_POWER_MODULE_CONTROL); + data |= 0x100; + vg_lite_hal_poke(VG_LITE_POWER_MODULE_CONTROL, data); + vg_lite_hal_delay(1); +#endif + +#endif + } + else { + while(!VG_LITE_KERNEL_IS_GPU_IDLE() && + (reset_timer < reset_timer_limit) // Force shutdown if timeout. + ) { + vg_lite_hal_delay(reset_timer); + reset_timer *= 2; + } + + /* Set idle speed. */ + value.data = vg_lite_hal_peek(VG_LITE_HW_CLOCK_CONTROL); + value.control.scale = 1; + value.control.scale_load = 1; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); + vg_lite_hal_delay(1); + value.control.scale_load = 0; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); + vg_lite_hal_delay(5); + + /* Disable clock gating. */ + value.control.clock_gate = 1; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); + vg_lite_hal_delay(1); + } +} + +/* Initialize some customized modeuls [DDRLess]. */ +static vg_lite_error_t init_3rd(vg_lite_kernel_initialize_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + /* TODO: Init the YUV<->RGB converters. Reserved for SOC. */ + /* vg_lite_hal_poke(0x00514, data->yuv_pre); + vg_lite_hal_poke(0x00518, data->yuv_post); + */ + return error; +} + +static vg_lite_error_t init_vglite(vg_lite_kernel_initialize_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + vg_lite_kernel_context_t * context; + vg_lite_uint32_t flags = 0, i; +#if gcdVG_ENABLE_BACKUP_COMMAND + vg_lite_uint32_t index; +#endif + +#if defined(__linux__) && !defined(EMULATOR) + vg_lite_kernel_context_t __user * context_usr; + vg_lite_kernel_context_t mycontext = { + .command_buffer = { 0 }, + .command_buffer_logical = { 0 }, + .command_buffer_klogical = { 0 }, + .command_buffer_physical = { 0 }, + }; + + // Construct the context. + context_usr = (vg_lite_kernel_context_t __user *) data->context; +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) + if(!access_ok(VERIFY_READ, context_usr, sizeof(*context_usr)) || + !access_ok(VERIFY_WRITE, context_usr, sizeof(*context_usr))) { +#else + if(!access_ok(context_usr, sizeof(*context_usr)) || + !access_ok(context_usr, sizeof(*context_usr))) { +#endif + /* Out of memory. */ + return VG_LITE_OUT_OF_MEMORY; + } + context = &mycontext; +#else + // Construct the context. + context = data->context; + if(context == NULL) { + /* Out of memory. */ + return VG_LITE_OUT_OF_MEMORY; + } +#endif + + /* Zero out all pointers. */ + for(i = 0; i < CMDBUF_COUNT; i++) { + context->command_buffer[i] = NULL; + context->command_buffer_logical[i] = NULL; + context->command_buffer_physical[i] = 0; + } + context->tess_buffer = NULL; + context->tessbuf_logical = NULL; + context->tessbuf_physical = 0; +#if gcdVG_ENABLE_BACKUP_COMMAND + global_power_context.power_context_logical = NULL; + global_power_context.power_context_klogical = NULL; + global_power_context.power_context_physical = 0; + global_power_context.power_context = NULL; + global_power_context.power_context_capacity = 32 << 10; + global_power_context.power_context_size = 0; +#endif + /* Increment reference counter. */ + if(s_reference++ == 0) { + /* Initialize the SOC. */ + vg_lite_hal_initialize(); + + /* Enable the GPU. */ + gpu(1); + } + + /* Fill in hardware capabilities. */ + data->capabilities.data = 0; + + /* Allocate the command buffer. */ + if(data->command_buffer_size) { + for(i = 0; i < CMDBUF_COUNT; i ++) { + /* Allocate the memory. */ + error = vg_lite_kernel_vidmem_allocate(&data->command_buffer_size, + flags, + data->command_buffer_pool, + &context->command_buffer_logical[i], + &context->command_buffer_klogical[i], + &context->command_buffer_physical[i], + &context->command_buffer[i]); + if(error != VG_LITE_SUCCESS) { + /* Free any allocated memory. */ + vg_lite_kernel_terminate_t terminate = { context }; + do_terminate(&terminate); + + /* Out of memory. */ + ONERROR(error); + } + + /* Return command buffer logical pointer and GPU address. */ + data->command_buffer[i] = context->command_buffer_logical[i]; + data->command_buffer_gpu[i] = context->command_buffer_physical[i]; + } + } + +#if gcdVG_ENABLE_BACKUP_COMMAND + if(global_power_context.power_context_capacity) { + /* Allocate the backup buffer. */ + error = vg_lite_kernel_vidmem_allocate(&global_power_context.power_context_capacity, + flags, + VG_LITE_POOL_RESERVED_MEMORY1, + &global_power_context.power_context_logical, + &global_power_context.power_context_klogical, + &global_power_context.power_context_physical, + &global_power_context.power_context); + if(error != VG_LITE_SUCCESS) { + /* Free any allocated memory. */ + vg_lite_kernel_terminate_t terminate = { &global_power_context }; + do_terminate(&terminate); + + /* Out of memory. */ + ONERROR(error); + } + + /* Initialize power context buffer */ + for(i = 0; i < sizeof(state_map_table) / sizeof(state_map_table[0]); i++) + state_map_table[i] = -1; +#if (CHIPID==0x355 || CHIPID==0x255) + index = push_command(STATE_COMMAND(0x0A30), 0x00000000, 0); + index = push_command(STATE_COMMAND(0x0A31), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A32), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A33), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A35), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A36), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A37), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A38), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A3A), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A3D), 0x00000000, index); +#else + index = push_command(STATE_COMMAND(0x0A35), 0x00000000, 0); + index = push_command(STATE_COMMAND(0x0AC8), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0ACB), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0ACC), 0x00000000, index); +#endif + index = push_command(STATE_COMMAND(0x0A90), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A91), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A92), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A93), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A94), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A95), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A96), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A97), 0x00000000, index); + + index = push_command(STATE_COMMAND(0x0A10), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0AC8), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0AC8), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A5C), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A5D), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A11), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A12), 0x00000000, index); + index = push_command(STATE_COMMAND(0x0A13), 0x00000000, index); + + global_power_context.power_context_size = index * 4; + } +#endif + /* Allocate the tessellation buffer. */ + if((data->tess_width > 0) && (data->tess_height > 0)) { + int width = data->tess_width; + int height = 0; + int vg_countbuffer_size = 0, total_size = 0, ts_buffer_size = 0; + + height = VG_LITE_ALIGN(data->tess_height, 16); + +#if (CHIPID==0x355 || CHIPID==0x255) + { + unsigned long stride, buffer_size, l1_size, l2_size; +#if (CHIPID==0x355) + data->capabilities.cap.l2_cache = 1; + width = VG_LITE_ALIGN(width, 128); +#endif + /* Check if we can used tiled tessellation (128x16). */ + if(((width & 127) == 0) && ((height & 15) == 0)) { + data->capabilities.cap.tiled = 0x3; + } + else { + data->capabilities.cap.tiled = 0x2; + } + + /* Compute tessellation buffer size. */ + stride = VG_LITE_ALIGN(width * 8, 64); + buffer_size = VG_LITE_ALIGN(stride * height, 64); + /* Each bit in the L1 cache represents 64 bytes of tessellation data. */ + l1_size = VG_LITE_ALIGN(VG_LITE_ALIGN(buffer_size / 64, 64) / 8, 64); +#if (CHIPID==0x355) + /* Each bit in the L2 cache represents 32 bytes of L1 data. */ + l2_size = VG_LITE_ALIGN(VG_LITE_ALIGN(l1_size / 32, 64) / 8, 64); +#else + l2_size = 0; +#endif + total_size = buffer_size + l1_size + l2_size; + ts_buffer_size = buffer_size; + } +#else /* (CHIPID==0x355 || CHIPID==0x255) */ + { + /* Check if we can used tiled tessellation (128x16). */ + if(((width & 127) == 0) && ((height & 15) == 0)) { + data->capabilities.cap.tiled = 0x3; + } + else { + data->capabilities.cap.tiled = 0x2; + } + + vg_countbuffer_size = (height + 13) / 14; + vg_countbuffer_size = vg_countbuffer_size * 64; + total_size = height * 128 + vg_countbuffer_size; + if(total_size < MIN_TS_SIZE) + total_size = MIN_TS_SIZE; + ts_buffer_size = total_size - vg_countbuffer_size; + } +#endif /* (CHIPID==0x355 || CHIPID==0x255) */ + + /* Allocate the memory. */ + error = vg_lite_kernel_vidmem_allocate((uint32_t *)&total_size, + flags, + data->tess_buffer_pool, + &context->tessbuf_logical, + &context->tessbuf_klogical, + &context->tessbuf_physical, + &context->tess_buffer); + if(error != VG_LITE_SUCCESS) { + /* Free any allocated memory. */ + vg_lite_kernel_terminate_t terminate = { context }; + do_terminate(&terminate); + + /* Out of memory. */ + ONERROR(error); + } + + /* Return the tessellation buffer pointers and GPU addresses. */ + data->physical_addr = context->tessbuf_physical; + data->logical_addr = (uint8_t *)context->tessbuf_logical; + data->tessbuf_size = ts_buffer_size; + data->countbuf_size = vg_countbuffer_size; + data->tess_w_h = width | (height << 16); + } + +#if gcdVG_ENABLE_GPU_RESET + gpu_reset_count = 0; +#endif + vg_lite_set_gpu_execute_state(VG_LITE_GPU_STOP); + /* Enable all interrupts. */ + vg_lite_hal_poke(VG_LITE_INTR_ENABLE, 0xFFFFFFFF); + +#if defined(__linux__) && !defined(EMULATOR) + if(copy_to_user(context_usr, context, sizeof(vg_lite_kernel_context_t)) != 0) { + // Free any allocated memory. + vg_lite_kernel_terminate_t terminate = { context }; + do_terminate(&terminate); + + return VG_LITE_NO_CONTEXT; + } +#endif + +on_error: + return error; +} + +static vg_lite_error_t do_initialize(vg_lite_kernel_initialize_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + /* Free any allocated memory for the context. */ + do { + error = init_vglite(data); + if(error != VG_LITE_SUCCESS) + break; + + error = init_3rd(data); + if(error != VG_LITE_SUCCESS) + break; + } while(0); + + return error; +} + +static vg_lite_error_t terminate_vglite(vg_lite_kernel_terminate_t * data) +{ + vg_lite_kernel_context_t * context = NULL; +#if defined(__linux__) && !defined(EMULATOR) + vg_lite_kernel_context_t mycontext = { + .command_buffer = { 0 }, + .command_buffer_logical = { 0 }, + .command_buffer_klogical = { 0 }, + .command_buffer_physical = { 0 }, + }; + if(copy_from_user(&mycontext, data->context, sizeof(vg_lite_kernel_context_t)) != 0) { + return VG_LITE_NO_CONTEXT; + } + context = &mycontext; +#else + context = data->context; +#endif + + /* Free any allocated memory for the context. */ + if(context->command_buffer[0]) { + /* Free the command buffer. */ + vg_lite_kernel_vidmem_free(context->command_buffer[0]); + context->command_buffer[0] = NULL; + } + +#if !gcFEATURE_VG_SINGLE_COMMAND_BUFFER + if(context->command_buffer[1]) { + /* Free the command buffer. */ + vg_lite_kernel_vidmem_free(context->command_buffer[1]); + context->command_buffer[1] = NULL; + } +#endif + +#if gcdVG_ENABLE_BACKUP_COMMAND + if(global_power_context.power_context) { + /* Free the power context. */ + vg_lite_kernel_vidmem_free(global_power_context.power_context); + global_power_context.power_context = NULL; + } +#endif + if(context->tess_buffer) { + /* Free the tessellation buffer. */ + vg_lite_kernel_vidmem_free(context->tess_buffer); + context->tess_buffer = NULL; + } + vg_lite_hal_free_os_heap(); + /* Decrement reference counter. */ + if(--s_reference == 0) { + /* Disable the GPU. */ + gpu(0); + + /* De-initialize the SOC. */ + vg_lite_hal_deinitialize(); + } + +#if defined(__linux__) && !defined(EMULATOR) + if(copy_to_user((vg_lite_kernel_context_t __user *) data->context, + &mycontext, sizeof(vg_lite_kernel_context_t)) != 0) { + return VG_LITE_NO_CONTEXT; + } +#endif + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t terminate_3rd(vg_lite_kernel_terminate_t * data) +{ + /* TODO: Terminate the converters. */ + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t do_terminate(vg_lite_kernel_terminate_t * data) +{ + terminate_vglite(data); + terminate_3rd(data); + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t vg_lite_kernel_vidmem_allocate(uint32_t * bytes, uint32_t flags, vg_lite_vidmem_pool_t pool, + void ** memory, void ** kmemory, uint32_t * memory_gpu, void ** memory_handle) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + error = vg_lite_hal_allocate_contiguous(*bytes, pool, memory, kmemory, memory_gpu, memory_handle); + if(VG_IS_ERROR(error)) { + ONERROR(error); + } + + return error; +on_error: + return error; +} + +static vg_lite_error_t vg_lite_kernel_vidmem_free(void * handle) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + vg_lite_hal_free_contiguous(handle); + + return error; +} + +static vg_lite_error_t do_allocate(vg_lite_kernel_allocate_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + error = vg_lite_kernel_vidmem_allocate(&data->bytes, data->flags, data->pool, &data->memory, &data->kmemory, + &data->memory_gpu, &data->memory_handle); + + return error; +} + +static vg_lite_error_t do_free(vg_lite_kernel_free_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + error = vg_lite_kernel_vidmem_free(data->memory_handle); + + return error; +} + +static vg_lite_error_t do_submit(vg_lite_kernel_submit_t * data) +{ + uint32_t offset; + vg_lite_kernel_context_t * context = NULL; + uint32_t physical = data->context->command_buffer_physical[data->command_id]; + +#if defined(__linux__) && !defined(EMULATOR) + vg_lite_kernel_context_t mycontext = { + .command_buffer = { 0 }, + .command_buffer_logical = { 0 }, + .command_buffer_klogical = { 0 }, + .command_buffer_physical = { 0 }, + }; + + if(copy_from_user(&mycontext, data->context, sizeof(vg_lite_kernel_context_t)) != 0) { + return VG_LITE_NO_CONTEXT; + } + context = &mycontext; + physical = context->command_buffer_physical[data->command_id]; +#else + context = data->context; + if(context == NULL) { + return VG_LITE_NO_CONTEXT; + } +#endif + /* Perform a memory barrier. */ + vg_lite_hal_barrier(); + + offset = (uint8_t *) data->commands - (uint8_t *)context->command_buffer_logical[data->command_id]; + +#if gcdVG_ENABLE_BACKUP_COMMAND + backup_power_context_buffer((uint32_t *)((uint8_t *)context->command_buffer_klogical[data->command_id] + offset), + (data->command_size + 3) / 4); + backup_command_buffer_physical = physical + offset; + backup_command_buffer_klogical = (uint32_t *)((uint8_t *)context->command_buffer_klogical[data->command_id] + offset); + backup_command_buffer_size = data->command_size; +#endif + +#if gcdVG_RECORD_HARDWARE_RUNNING_TIME +#ifdef __linux__ + start_time = jiffies; +#else + gettimeofday(&start_time, NULL); +#endif +#endif + + /* set gpu to busy state */ + vg_lite_set_gpu_execute_state(VG_LITE_GPU_RUN); + + /* Write the registers to kick off the command execution (CMDBUF_SIZE). */ + vg_lite_hal_poke(VG_LITE_HW_CMDBUF_ADDRESS, physical + offset); + vg_lite_hal_poke(VG_LITE_HW_CMDBUF_SIZE, (data->command_size + 7) / 8); + + return VG_LITE_SUCCESS; +} + +#if gcdVG_ENABLE_DUMP_COMMAND && gcdVG_ENABLE_BACKUP_COMMAND +static void dump_last_frame(void) +{ + uint32_t * ptr = backup_command_buffer_klogical; + uint32_t size = backup_command_buffer_size; + uint32_t i = 0; + uint32_t data = 0; + + vg_lite_kernel_print("This is init command buffer:\n"); + vg_lite_kernel_print("@[%s 0x%08X 0x00000088\n", "command", physical_address); + vg_lite_kernel_print(" 0x30010A35 0x%08X 0x30010AC8 0x%08X\n", init_buffer[0], init_buffer[1]); + vg_lite_kernel_print(" 0x30010ACB 0x%08X 0x30010ACC 0x%08X\n", init_buffer[2], init_buffer[3]); + vg_lite_kernel_print(" 0x30010A90 0x%08X 0x30010A91 0x%08X\n", init_buffer[4], init_buffer[5]); + vg_lite_kernel_print(" 0x30010A92 0x%08X 0x30010A93 0x%08X\n", init_buffer[6], init_buffer[7]); + vg_lite_kernel_print(" 0x30010A94 0x%08X 0x30010A95 0x%08X\n", init_buffer[8], init_buffer[9]); + vg_lite_kernel_print(" 0x30010A96 0x%08X 0x30010A97 0x%08X\n", init_buffer[10], init_buffer[11]); + vg_lite_kernel_print(" 0x30010A00 0x00000001 0x30010A1B 0x00000011\n"); + vg_lite_kernel_print(" 0x10000007 0x00000000 0x20000007 0x00000000\n"); + vg_lite_kernel_print(" 0x00000000 0x00000000\n"); + vg_lite_kernel_print("] -- %s\n", "command"); + + if(is_init == 1) { + vg_lite_kernel_print("the last submit command is init command.\n"); + } + else { + vg_lite_kernel_print("the last submit command before hang:\n"); + vg_lite_kernel_print("@[%s 0x%08X 0x%08X\n", "command", backup_command_buffer_klogical, size); + for(i = 0; i < size; i += 4) { + vg_lite_kernel_print(" 0x%08X 0x%08X 0x%08X 0x%08X\n", ptr[i], ptr[i + 1], ptr[i + 2], ptr[i + 3]); + } + if(size % 16) { + int j = size % 16 / 4; + switch(j) { + case 1: + vg_lite_kernel_print(" 0x%08X\n", ptr[(size - size % 16) / 4]); + break; + case 2: + vg_lite_kernel_print(" 0x%08X 0x%08X\n", ptr[(size - size % 16) / 4], ptr[(size - size % 16) / 4 + 1]); + break; + case 3: + vg_lite_kernel_print(" 0x%08X 0x%08X 0x%08X\n", ptr[(size - size % 16) / 4], ptr[(size - size % 16) / 4 + 1], + ptr[(size - size % 16) / 4 + 2]); + break; + default: + break; + } + } + } + vg_lite_kernel_print("] -- %s\n", "command"); + + data = vg_lite_hal_peek(VG_LITE_HW_IDLE); + vg_lite_kernel_print("vgidle reg = 0x%08X\n", data); +} +#endif + +static vg_lite_error_t do_wait(vg_lite_kernel_wait_t * data) +{ +#if gcdVG_ENABLE_GPU_RESET && gcdVG_ENABLE_BACKUP_COMMAND + vg_lite_error_t error = VG_LITE_SUCCESS; +#endif + /* Wait for interrupt. */ +#if gcdVG_DUMP_DEBUG_REGISTER + if(!vg_lite_hal_wait_interrupt(5000, data->event_mask, &data->event_got)) { + /* Timeout. */ + unsigned int debug; + unsigned int iter; + + debug = vg_lite_hal_peek(VG_LITE_HW_IDLE); + vg_lite_kernel_print("idle = 0x%x\n", debug); + + debug = vg_lite_hal_peek(VG_LITE_HW_CLOCK_CONTROL); + vg_lite_kernel_print("QAHiClockControl = 0x%x\n", debug); + + for(iter = 0; iter < 16 ; iter ++) { + vg_lite_hal_poke(0x470, iter); + debug = vg_lite_hal_peek(0x448); + vg_lite_kernel_print("0x448[%d] = 0x%x\n", iter, debug); + } + for(iter = 0; iter < 16 ; iter ++) { + vg_lite_hal_poke(0x470, iter << 8); + debug = vg_lite_hal_peek(0x44C); + vg_lite_kernel_print("0x44c[%d] = 0x%x\n", iter, debug); + } + for(iter = 0; iter < 28 ; iter ++) { + vg_lite_hal_poke(0x470, iter << 16); + debug = vg_lite_hal_peek(0x450); + vg_lite_kernel_print("0x450[%d] = 0x%x\n", iter, debug); + } + for(iter = 0; iter < 31; iter++) { + vg_lite_hal_poke(0x470, iter << 24); + debug = vg_lite_hal_peek(0x454); + vg_lite_kernel_print("0x454[%d] = 0x%x\n", iter, debug); + } + for(iter = 128; iter < 133; iter++) { + vg_lite_hal_poke(0x470, iter << 24); + debug = vg_lite_hal_peek(0x454); + vg_lite_kernel_print("0x454[%d] = 0x%x\n", iter, debug); + } + for(iter = 0; iter < 21; iter++) { + vg_lite_hal_poke(0x474, iter); + debug = vg_lite_hal_peek(0x458); + vg_lite_kernel_print("0x458[%d] = 0x%x\n", iter, debug); + } + for(iter = 0; iter < 62; iter++) { + vg_lite_hal_poke(0x474, iter << 8); + debug = vg_lite_hal_peek(0x45C); + vg_lite_kernel_print("0x45C[%d] = 0x%x\n", iter, debug); + } + for(iter = 0; iter < 16; iter++) { + vg_lite_hal_poke(0x474, iter << 16); + debug = vg_lite_hal_peek(0x460); + vg_lite_kernel_print("0x460[%d] = 0x%x\n", iter, debug); + } + for(iter = 0x40; iter <= 0x60; iter += 4) { + debug = vg_lite_hal_peek(iter); + vg_lite_kernel_print("0x%x = 0x%x\n", iter, debug); + } + + debug = vg_lite_hal_peek(0x438); + vg_lite_kernel_print("0x%x = 0x%x\n", 0x438, debug); + debug = vg_lite_hal_peek(0x43C); + vg_lite_kernel_print("0x%x = 0x%x\n", 0x43C, debug); + debug = vg_lite_hal_peek(0x440); + vg_lite_kernel_print("0x%x = 0x%x\n", 0x440, debug); + debug = vg_lite_hal_peek(0x444); + vg_lite_kernel_print("0x%x = 0x%x\n", 0x444, debug); + debug = vg_lite_hal_peek(0x500); + vg_lite_kernel_print("0x%x = 0x%x\n", 0x500, debug); + debug = vg_lite_hal_peek(0x504); + vg_lite_kernel_print("0x%x = 0x%x\n", 0x504, debug); + debug = vg_lite_hal_peek(0x508); + vg_lite_kernel_print("0x%x = 0x%x\n", 0x508, debug); + debug = vg_lite_hal_peek(0x10); + vg_lite_kernel_print("0x%x = 0x%x\n", 0x10, debug); + + for(iter = 0x14; iter <= 0x34; iter += 4) { + debug = vg_lite_hal_peek(iter); + vg_lite_kernel_print("0x%x = 0x%08x\n", iter, debug); + } + + debug = vg_lite_hal_peek(0x98); + vg_lite_kernel_print("0x%x = 0x%08x\n", 0x98, debug); + debug = vg_lite_hal_peek(0xA4); + vg_lite_kernel_print("0x%x = 0x%08x\n", 0xA4, debug); + debug = vg_lite_hal_peek(0xA8); + vg_lite_kernel_print("0x%x = 0x%08x\n", 0xA8, debug); + debug = vg_lite_hal_peek(0xE8); + vg_lite_kernel_print("0x%x = 0x%08x\n", 0xE8, debug); +#if gcdVG_ENABLE_DUMP_COMMAND && gcdVG_ENABLE_BACKUP_COMMAND + dump_last_frame(); +#endif + return VG_LITE_TIMEOUT; + } +#else + if(!vg_lite_hal_wait_interrupt(data->timeout_ms, data->event_mask, &data->event_got)) { + /* Timeout. */ + unsigned int debug; + debug = vg_lite_hal_peek(VG_LITE_HW_IDLE); + if(!VG_LITE_KERNEL_IS_GPU_IDLE()) { + vg_lite_kernel_print("GPU hang.\n"); + vg_lite_kernel_print("GPU idle register = 0x%x\n", debug); + } + +#if gcdVG_ENABLE_DUMP_COMMAND && gcdVG_ENABLE_BACKUP_COMMAND + dump_last_frame(); +#endif + +#if gcdVG_ENABLE_GPU_RESET && gcdVG_ENABLE_BACKUP_COMMAND + gpu_reset_count++; + if(gpu_reset_count <= 1) { + if(data->reset_type == RESTORE_INIT_COMMAND) { + error = VG_LITE_SUCCESS; + } + else if(data->reset_type == RESTORE_LAST_COMMAND) { + error = VG_LITE_SUCCESS; + } + else if(data->reset_type == RESTORE_ALL_COMMAND) { + /* reset and enable the GPU interrupt */ + gpu(1); + vg_lite_hal_poke(VG_LITE_INTR_ENABLE, 0xFFFFFFFF); + /* restore gpu state */ + error = execute_command(global_power_context.power_context_physical, global_power_context.power_context_size + 32, + RESTORE_INIT_COMMAND); + error = execute_command(backup_command_buffer_physical, backup_command_buffer_size, RESTORE_LAST_COMMAND); + } + else { + error = VG_LITE_TIMEOUT; + } + gpu_reset_count = 0; + return error; + } + vg_lite_kernel_print("GPU reset fail!\n"); +#endif + return VG_LITE_TIMEOUT; + } +#endif + +#if gcFEATURE_VG_FLEXA + if(data->event_got & FLEXA_TIMEOUT_STATE) + return VG_LITE_FLEXA_TIME_OUT; + + if(data->event_got & FLEXA_HANDSHEKE_FAIL_STATE) + return VG_LITE_FLEXA_HANDSHAKE_FAIL; +#endif + + /* set gpu to idle state */ + vg_lite_set_gpu_execute_state(VG_LITE_GPU_STOP); + + return VG_LITE_SUCCESS; +} + +#if gcdVG_ENABLE_BACKUP_COMMAND +static vg_lite_error_t restore_gpu_state(void) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + int i = 0; + uint32_t total_size = 0; + + power_context_klogical[global_power_context.power_context_size / 4 + 0] = 0x30010A1B; + power_context_klogical[global_power_context.power_context_size / 4 + 1] = 0x00000001; + power_context_klogical[global_power_context.power_context_size / 4 + 2] = 0x10000007; + power_context_klogical[global_power_context.power_context_size / 4 + 3] = 0x00000000; + power_context_klogical[global_power_context.power_context_size / 4 + 4] = 0x20000007; + power_context_klogical[global_power_context.power_context_size / 4 + 5] = 0x00000000; + power_context_klogical[global_power_context.power_context_size / 4 + 6] = 0x00000000; + power_context_klogical[global_power_context.power_context_size / 4 + 7] = 0x00000000; + total_size = global_power_context.power_context_size + 32; + + vg_lite_kernel_print("after resume and the power_context is:\n"); + for(i = 0; i < total_size / 4; i += 4) { + vg_lite_kernel_print("0x%08X 0x%08X", + power_context_klogical[i], power_context_klogical[i + 1]); + if((i + 2) <= (total_size / 4 - 1)) +#if defined(__linux__) + vg_lite_kernel_print(KERN_CONT " 0x%08X 0x%08X\n", + power_context_klogical[i + 2], power_context_klogical[i + 3]); +#else + vg_lite_kernel_print(" 0x%08X 0x%08X\n", + power_context_klogical[i + 2], power_context_klogical[i + 3]); +#endif + } + vg_lite_kernel_print("global_power_context size = %d\n", total_size); + + /* submit the backup power context */ + error = restore_init_command(global_power_context.power_context_physical, total_size); + if(error == VG_LITE_SUCCESS) + vg_lite_kernel_print("Initialize the GPU state success!\n"); + + /* submit last frame before suspend */ + /*error = restore_init_command(backup_command_buffer_physical, backup_command_buffer_size); + if (error == VG_LITE_SUCCESS) + vg_lite_kernel_print("Initialize the GPU state success!\n");*/ + + return error; +} +#endif + +static vg_lite_error_t do_reset(vg_lite_kernel_reset_t * data) +{ +#if gcdVG_ENABLE_DELAY_RESUME + if(data->delay_resume_flag == 1) { + /* If delay resume is enabled, power and clock should be turned on first.*/ + vg_lite_hal_initialize(); + } +#endif + /* reset and enable the GPU interrupt */ + gpu(1); + +#if gcdVG_ENABLE_BACKUP_COMMAND + restore_gpu_state(); +#endif + + vg_lite_hal_poke(VG_LITE_INTR_ENABLE, 0xFFFFFFFF); + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t do_gpu_close(void) +{ + gpu(0); + + vg_lite_kernel_hintmsg("gpu is shutdown!\n"); + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t do_debug(void) +{ + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t do_map(vg_lite_kernel_map_t * data) +{ + data->memory_handle = vg_lite_hal_map(data->flags, data->bytes, data->logical, data->physical, data->dma_buf_fd, + &data->memory_gpu); + if(data->memory_handle == NULL) + return VG_LITE_OUT_OF_RESOURCES; + else if((long)data->memory_handle == (long) -1) + return VG_LITE_NOT_SUPPORT; + else + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t do_unmap(vg_lite_kernel_unmap_t * data) +{ + vg_lite_hal_unmap(data->memory_handle); + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t do_peek(vg_lite_kernel_info_t * data) +{ + data->reg = vg_lite_hal_peek(data->addr); + + return VG_LITE_SUCCESS; +} + +#if gcFEATURE_VG_FLEXA +static vg_lite_error_t do_flexa_enable(vg_lite_kernel_flexa_info_t * data) +{ + /* reset all flexa states */ + vg_lite_hal_poke(0x03600, 0x0); + /* set sync mode */ + vg_lite_hal_poke(0x03604, data->segment_address); + + vg_lite_hal_poke(0x03608, data->segment_count); + + vg_lite_hal_poke(0x0360C, data->segment_size); + + vg_lite_hal_poke(0x0520, data->sync_mode); + + vg_lite_hal_poke(0x03610, data->stream_id | data->sbi_mode | data->start_flag | data->stop_flag | data->reset_flag); + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t do_flexa_set_background_address(vg_lite_kernel_flexa_info_t * data) +{ + vg_lite_hal_poke(0x03604, data->segment_address); + + vg_lite_hal_poke(0x03608, data->segment_count); + + vg_lite_hal_poke(0x0360C, data->segment_size); + + vg_lite_hal_poke(0x03610, data->stream_id | data->sbi_mode | data->start_flag | data->stop_flag | data->reset_flag); + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t do_flexa_disable(vg_lite_kernel_flexa_info_t * data) +{ + + vg_lite_hal_poke(0x0520, data->sync_mode); + + vg_lite_hal_poke(0x03610, data->stream_id | data->sbi_mode); + + /* reset all flexa states */ + vg_lite_hal_poke(0x03600, 0x0); + + return VG_LITE_SUCCESS; +} + +static vg_lite_error_t do_flexa_stop_frame(vg_lite_kernel_flexa_info_t * data) +{ + vg_lite_hal_poke(0x03610, data->stream_id | data->sbi_mode | data->start_flag | data->stop_flag | data->reset_flag); + + return VG_LITE_SUCCESS; +} +#endif + +static vg_lite_error_t do_query_mem(vg_lite_kernel_mem_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + error = vg_lite_hal_query_mem(data); + + return error; +} + +#if gcdVG_ENABLE_DELAY_RESUME +static vg_lite_error_t set_delay_resume(vg_lite_kernel_delay_resume_t * data) +{ + delay_resume = data->set_delay_resume; + + return VG_LITE_SUCCESS; +} + +static int do_query_delay_resume(void) +{ + if(delay_resume == 1) { + /* Reset delay resume to 0 after query*/ + delay_resume = 0; + return 1; + } + else + return 0; +} + +static int set_gpu_clock_state(vg_lite_kernel_gpu_clock_state_t * gpu_state) +{ +#ifdef __ZEPHYR__ + vg_lite_gpu_execute_state_t state = gpu_state->state; + vg_lite_set_gpu_clock_state(state); +#endif + return VG_LITE_SUCCESS; +} +#endif + +static vg_lite_error_t do_map_memory(vg_lite_kernel_map_memory_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + error = vg_lite_hal_map_memory(data); + + return error; +} + +static vg_lite_error_t do_unmap_memory(vg_lite_kernel_unmap_memory_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + error = vg_lite_hal_unmap_memory(data); + + return error; +} + +static vg_lite_error_t do_cache(vg_lite_kernel_cache_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + error = vg_lite_hal_operation_cache(data->memory_handle, data->cache_op); + + return error; +} + +static vg_lite_error_t do_export_memory(vg_lite_kernel_export_memory_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + error = vg_lite_hal_memory_export(&data->fd); + + return error; +} + +static vg_lite_error_t do_get_running_time(vg_lite_kernel_hardware_running_time_t * data) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; +#if gcdVG_RECORD_HARDWARE_RUNNING_TIME +#ifdef __linux__ + data->run_time = total_time; + data->hertz = HZ; +#else + data->run_time = total_time; + data->hertz = 1e6; +#endif +#endif + return error; +} + +vg_lite_error_t record_running_time(void) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + +#if gcdVG_RECORD_HARDWARE_RUNNING_TIME + +#ifdef __linux__ + end_time = jiffies; + period_time = end_time - start_time; + total_time += period_time; + +#else + gettimeofday(&end_time, NULL); + period_time = (end_time.tv_sec - start_time.tv_sec) * 1e6 + end_time.tv_usec - start_time.tv_usec; + total_time += period_time; + //printk("GPU hardware running period time: %f s\n", (float)period_time/1e-6); + //printk("GPU hardware running total time: %f s\n", (float)total_time/1e-6); +#endif + +#endif + + return error; +} + +static void soft_reset(void) +{ + vg_lite_hw_clock_control_t value; + value.data = vg_lite_hal_peek(VG_LITE_HW_CLOCK_CONTROL); + + /* Perform a soft reset. */ + value.control.isolate = 1; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); + value.control.soft_reset = 1; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); + vg_lite_hal_delay(5); + value.control.soft_reset = 0; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); + value.control.isolate = 0; + vg_lite_hal_poke(VG_LITE_HW_CLOCK_CONTROL, value.data); +} + +vg_lite_error_t vg_lite_kernel(vg_lite_kernel_command_t command, void * data) +{ + /* Dispatch on command. */ + switch(command) { + case VG_LITE_INITIALIZE: + /* Initialize the context. */ + return do_initialize(data); + + case VG_LITE_TERMINATE: + /* Terminate the context. */ + return do_terminate(data); + + case VG_LITE_ALLOCATE: + /* Allocate contiguous memory. */ + return do_allocate(data); + + case VG_LITE_FREE: + /* Free contiguous memory. */ + return do_free(data); + + case VG_LITE_SUBMIT: + /* Submit a command buffer. */ + return do_submit(data); + + case VG_LITE_WAIT: + /* Wait for the GPU. */ + return do_wait(data); + + case VG_LITE_RESET: + /* Reset the GPU. */ + return do_reset(data); + + case VG_LITE_DEBUG: + /* Perform debugging features. */ + return do_debug(); + + case VG_LITE_MAP: + /* Map some memory. */ + return do_map(data); + + case VG_LITE_UNMAP: + /* Unmap some memory. */ + return do_unmap(data); + + /* Get register info. */ + case VG_LITE_CHECK: + /* Get register value. */ + return do_peek(data); + +#if gcFEATURE_VG_FLEXA + case VG_LITE_FLEXA_DISABLE: + /* Write register value. */ + return do_flexa_disable(data); + + case VG_LITE_FLEXA_ENABLE: + /* Write register value. */ + return do_flexa_enable(data); + + case VG_LITE_FLEXA_STOP_FRAME: + /* Write register value. */ + return do_flexa_stop_frame(data); + + case VG_LITE_FLEXA_SET_BACKGROUND_ADDRESS: + /* Write register value. */ + return do_flexa_set_background_address(data); +#endif + + case VG_LITE_QUERY_MEM: + return do_query_mem(data); + + case VG_LITE_MAP_MEMORY: + /* Map memory to user */ + return do_map_memory(data); + + case VG_LITE_UNMAP_MEMORY: + /* Unmap memory to user */ + return do_unmap_memory(data); + + case VG_LITE_CLOSE: + return do_gpu_close(); + + case VG_LITE_CACHE: + return do_cache(data); + + case VG_LITE_EXPORT_MEMORY: + return do_export_memory(data); + + case VG_LITE_RECORD_RUNNING_TIME: + return do_get_running_time(data); + +#if gcdVG_ENABLE_DELAY_RESUME + case VG_LITE_SET_DELAY_RESUME: + return set_delay_resume(data); + + case VG_LITE_QUERY_DELAY_RESUME: + return do_query_delay_resume(); + + case VG_LITE_SET_GPU_CLOCK_STATE: + return set_gpu_clock_state(data); +#endif + default: + break; + } + + /* Invalid command. */ + return VG_LITE_INVALID_ARGUMENT; +} + +#endif /* LV_USE_VG_LITE_DRIVER */ + diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_kernel.h b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_kernel.h new file mode 100755 index 0000000..7ed3696 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_kernel.h @@ -0,0 +1,592 @@ +/**************************************************************************** +* +* The MIT License (MIT) +* +* Copyright (c) 2014 - 2022 Vivante Corporation +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +* +***************************************************************************** +* +* The GPL License (GPL) +* +* Copyright (C) 2014 - 2022 Vivante Corporation +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +***************************************************************************** +* +* Note: This software is released under dual MIT and GPL licenses. A +* recipient may use this file under the terms of either the MIT license or +* GPL License. If you wish to use only one license not the other, you can +* indicate your decision by deleting one of the above license notices in your +* version of this file. +* +*****************************************************************************/ + +#ifndef VG_LITE_KERNEL_H +#define VG_LITE_KERNEL_H + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "../VGLite/vg_lite_options.h" +#include "vg_lite_option.h" + +/* Interrupt IDs from GPU. */ +#define EVENT_UNEXPECTED_MESH 0x80000000 +#define EVENT_CMD_BAD_WRITE 0x40000000 +#define EVENT_ERROR_RECOVER 0x20000000 +#define EVENT_CMD_SWITCH 0x10000000 +#define EVENT_MCU_BAD_WRITE 0x08000000 +#define EVENT_END 0 +#define EVENT_FRAME_END 1 + +#define MAX_CONTIGUOUS_SIZE 0x04000000 + +#define VG_LITE_INFINITE 0xFFFFFFFF + +#if gcFEATURE_VG_SINGLE_COMMAND_BUFFER + #define CMDBUF_COUNT 1 +#else + #define CMDBUF_COUNT 2 +#endif + +#define VG_LITE_ALIGN(number, alignment) \ + (((number) + ((alignment) - 1)) & ~((alignment) - 1)) + +#ifndef BIT + #define BIT(x) (1 << x) +#endif + +#define VG_LITE_KERNEL_IS_GPU_IDLE() \ + ((vg_lite_hal_peek(VG_LITE_HW_IDLE) & VG_LITE_HW_IDLE_STATE) == VG_LITE_HW_IDLE_STATE) + +/* Hardware chip Ids */ +#define GPU_CHIP_ID_GCNANOLITEV 0x255 +#define GPU_CHIP_ID_GC355 0x355 +#define GPU_CHIP_ID_GCNANOULTRAV 0x265 + +/* vg_lite_kernel_map_t flag type */ +#define VG_LITE_HAL_MAP_DMABUF 0x00000004 +#define VG_LITE_HAL_MAP_USER_MEMORY 0x00000008 +#define VG_LITE_HAL_ALLOC_4G 0x00000010 + +/* vg_lite_kernel_allocate_t flag type */ +#define VG_LITE_RESERVED_ALLOCATOR 0x10000000 +#define VG_LITE_GFP_ALLOCATOR 0x20000000 +#define VG_LITE_DMA_ALLOCATOR 0x40000000 +#define VG_LITE_MEMORY_ALLOCATOR_FLAG 0x70000000 + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef VG_LITE_ERROR +#define VG_LITE_ERROR 1 +/*! + @abstract Error codes that the vg_lite functions can return. + + @discussion + All API functions return a status code. On success, VG_LITE_SUCCESS will be returned when a function is + successful. This value is set to zero, so if any function returns a non-zero value, an error has occurred. + */ +typedef enum vg_lite_error { + VG_LITE_SUCCESS = 0, /*! Success. */ + VG_LITE_INVALID_ARGUMENT, /*! An invalid argument was specified. */ + VG_LITE_OUT_OF_MEMORY, /*! Out of GPU memory */ + VG_LITE_NO_CONTEXT, /*! No context or an unintialized context specified. */ + VG_LITE_TIMEOUT, /*! A timeout has occurred during a wait. */ + VG_LITE_OUT_OF_RESOURCES, /*! Out of system resources. */ + VG_LITE_GENERIC_IO, /*! Cannot communicate with the kernel driver. */ + VG_LITE_NOT_SUPPORT, /*! Function call not supported. */ + VG_LITE_ALREADY_EXISTS, /*! Object already exists */ + VG_LITE_NOT_ALIGNED, /*! Data alignment error */ + VG_LITE_FLEXA_TIME_OUT, /*! VG timeout requesting for segment buffer */ + VG_LITE_FLEXA_HANDSHAKE_FAIL, /*! VG and SBI synchronizer handshake failed */ + VG_LITE_SYSTEM_CALL_FAIL, /*! kernel api call fail */ +} +vg_lite_error_t; +#endif + +typedef enum vg_lite_kernel_counter { + /* Dont't touch the counter. */ + VG_LITE_NONE, + + /* Turn the counter on. */ + VG_LITE_ON, + + /* Turn the counter off. */ + VG_LITE_OFF, + + /* Query the counter and reset its values. */ + VG_LITE_QUERY, +} +vg_lite_kernel_counter_t; + +typedef enum vg_lite_kernel_command { + /* Initialize the GPU. */ + VG_LITE_INITIALIZE, + + /* Terminate the GPU. */ + VG_LITE_TERMINATE, + + /* Allocate memory. */ + VG_LITE_ALLOCATE, + + /* Free memory. */ + VG_LITE_FREE, + + /* Submit a command buffer to the GPU. */ + VG_LITE_SUBMIT, + + /* Wait for the GPU to be completed. */ + VG_LITE_WAIT, + + /* Reset the GPU. */ + VG_LITE_RESET, + + /* Debug commands. */ + VG_LITE_DEBUG, + + /* Map memory. */ + VG_LITE_MAP, + + /* Unmap memory. */ + VG_LITE_UNMAP, + + /* Check info. */ + VG_LITE_CHECK, + + /* Query mem. */ + VG_LITE_QUERY_MEM, + + /* Flexa disable */ + VG_LITE_FLEXA_DISABLE, + + /* Flexa enable */ + VG_LITE_FLEXA_ENABLE, + + /* Flexa stop frame */ + VG_LITE_FLEXA_STOP_FRAME, + + /* Set background address */ + VG_LITE_FLEXA_SET_BACKGROUND_ADDRESS, + + /* Map memory to user */ + VG_LITE_MAP_MEMORY, + + /* Unmap memory to user */ + VG_LITE_UNMAP_MEMORY, + + /* Close gpu */ + VG_LITE_CLOSE, + + /* Operation cache */ + VG_LITE_CACHE, + + /* Export memory */ + VG_LITE_EXPORT_MEMORY, + + /* Record GPU hardware running time */ + VG_LITE_RECORD_RUNNING_TIME, + + /* Set delay resume state */ + VG_LITE_SET_DELAY_RESUME, + + /* Query delay resume state */ + VG_LITE_QUERY_DELAY_RESUME, + + /* Set GPU clock state */ + VG_LITE_SET_GPU_CLOCK_STATE, + +} +vg_lite_kernel_command_t; + +typedef enum vg_lite_cache_op { + VG_LITE_CACHE_CLEAN, + VG_LITE_CACHE_INVALIDATE, + VG_LITE_CACHE_FLUSH, +} +vg_lite_cache_op_t; + +typedef enum vg_lite_vidmem_pool { + VG_LITE_POOL_RESERVED_MEMORY1 = 0, + VG_LITE_POOL_RESERVED_MEMORY2 = 1, +} +vg_lite_vidmem_pool_t; + +typedef enum vg_lite_gpu_execute_state { + VG_LITE_GPU_STOP = 0, + VG_LITE_GPU_RUN = 1, +} +vg_lite_gpu_execute_state_t; + +/* Context structure. */ +typedef struct vg_lite_kernel_context { + /* Command buffer. */ + void * command_buffer[CMDBUF_COUNT]; + void * command_buffer_logical[CMDBUF_COUNT]; + void * command_buffer_klogical[CMDBUF_COUNT]; + uint32_t command_buffer_physical[CMDBUF_COUNT]; + uint32_t end_of_frame; + + /* Tessellation buffer. */ + void * tess_buffer; + void * tessbuf_logical; + void * tessbuf_klogical; + uint32_t tessbuf_physical; + + /* power context buffer */ + void * power_context; + void * power_context_logical; + void * power_context_klogical; + uint32_t power_context_physical; + uint32_t power_context_size; + uint32_t power_context_capacity; +} +vg_lite_kernel_context_t; + +typedef struct capabilities { + uint32_t tiled : 2; + uint32_t l2_cache : 1; +} +capabilities_t; + +typedef union vg_lite_capabilities { + capabilities_t cap; + uint32_t data; +} +vg_lite_capabilities_t; + +typedef struct vg_lite_kernel_initialize { + /* INPUT */ + + /* Command buffer size. */ + uint32_t command_buffer_size; + + /* Tessellation buffer width. */ + int32_t tess_width; + + /* Tessellation buffer height. */ + int32_t tess_height; + + /* Memory pool for command buffer. */ + vg_lite_vidmem_pool_t command_buffer_pool; + + /* Memory pool for tessellation buffer. */ + vg_lite_vidmem_pool_t tess_buffer_pool; + + /* OUTPUT */ + + /* Context pointer. */ + vg_lite_kernel_context_t * context; + + /* Capabilities. */ + vg_lite_capabilities_t capabilities; + + /* Allocated command buffer. */ + void * command_buffer[CMDBUF_COUNT]; + + /* GPU address for command buffer. */ + uint32_t command_buffer_gpu[CMDBUF_COUNT]; + + /* GPU addresses for tesselation buffers. */ + uint32_t physical_addr; + + /* Logic addresses for tessellation buffers: used by SW Tessellator. */ + uint8_t * logical_addr; + + /* Size of each level of the tesselation buffer. */ + uint32_t tessbuf_size; + + /* Size of each level of the vg count buffer. */ + uint32_t countbuf_size; + + /* Width and height of tessellation buffer. */ + uint32_t tess_w_h; +} +vg_lite_kernel_initialize_t; + +typedef struct vg_lite_kernel_terminate { + /* Context to terminate. */ + vg_lite_kernel_context_t * context; +} +vg_lite_kernel_terminate_t; + +typedef struct vg_lite_kernel_allocate { + /* INPUT */ + + /* Number of bytes to allocate. */ + uint32_t bytes; + + /* Flag to indicate whether the allocated memory is contiguous or not. */ + int32_t contiguous; + + /* Flag to indicate where to allocate memory */ + uint32_t flags; + + /* select reserved memory pool */ + vg_lite_vidmem_pool_t pool; + + /* OUTPUT */ + + /* Memory handle. */ + void * memory_handle; + + /* Allocated memory. */ + void * memory; + + /* kernel memory */ + void * kmemory; + + /* GPU address of allocated memory. */ + uint32_t memory_gpu; +} +vg_lite_kernel_allocate_t; + +typedef struct vg_lite_kernel_free { + /* Memory handle to free. */ + void * memory_handle; +} +vg_lite_kernel_free_t; + +typedef struct vg_lite_kernel_submit { + /* Context to submit to. */ + vg_lite_kernel_context_t * context; + + /* Pointer to command buffer. */ + void * commands; + + /* Number of bytes in command buffer. */ + uint32_t command_size; + + /* Command Buffer ID. */ + uint32_t command_id; +} +vg_lite_kernel_submit_t; + +typedef enum vg_lite_gpu_reset_type { + RESTORE_INIT_COMMAND = 0, + RESTORE_LAST_COMMAND = 1, + RESTORE_ALL_COMMAND = 2, + RESTORE_NONE = 3, +} +vg_lite_gpu_reset_type_t; + +typedef struct vg_lite_kernel_wait { + /* Context to wait for. */ + vg_lite_kernel_context_t * context; + + /* Timeout in milliseconds. */ + uint32_t timeout_ms; + + /* The event to wait. */ + uint32_t event_mask; + + /* The event(s) got after waiting. */ + uint32_t event_got; + + /* After GPU reset, select submit command */ + vg_lite_gpu_reset_type_t reset_type; +} +vg_lite_kernel_wait_t; + +typedef struct vg_lite_kernel_reset { + /* Context to reset. */ + vg_lite_kernel_context_t * context; + uint32_t delay_resume_flag; +} +vg_lite_kernel_reset_t; + +typedef struct vg_lite_kernel_debug { + /* Context to debug. */ + vg_lite_kernel_context_t * context; + + /* Bandwidth counter enabler. */ + vg_lite_kernel_counter_t bandwidth_counter; + + /* Pixel counter enabler. */ + vg_lite_kernel_counter_t pixel_counters; + + /* OUTPUT */ + + /* Bandwidth counters: + * [0] - burst of 8. + * [1] - burst of 16. + * [2] - burst of 32. + * [3] - burst of 64. + */ + uint32_t bandwidth[4]; + + /* Pixel counters:. + * [0] - Number of tessellated pixels. + * [1] - Number of imaged pixels. + * [2] - Number of rendered pixels. + */ + uint32_t pixels[3]; +} +vg_lite_kernel_debug_t; + +typedef struct vg_lite_kernel_map { + /* INPUT */ + uint32_t flags; + + /* user memory */ + /* Number of bytes to map. */ + uint32_t bytes; + + /* Logical memory address or NULL. */ + void * logical; + + /* Physical memory address or 0. */ + uint32_t physical; + + /* dma_buf */ + /* dma_buf fd */ + int32_t dma_buf_fd; + + /* OUTPUT */ + /* Memory handle for mapped memory. */ + void * memory_handle; + + /* GPU address of mapped memory. */ + uint32_t memory_gpu; +} +vg_lite_kernel_map_t; + +typedef struct vg_lite_kernel_unmap { + /* Memory handle to unmap. */ + void * memory_handle; +} +vg_lite_kernel_unmap_t; + +typedef struct vg_lite_kernel_cache { + vg_lite_cache_op_t cache_op; + + /* Memory handle to operation. */ + void * memory_handle; +} +vg_lite_kernel_cache_t; + +typedef struct vg_lite_kernel_info { + /* Register's address. */ + uint32_t addr; + + /* Check register info. */ + uint32_t reg; +} +vg_lite_kernel_info_t; + +typedef struct vg_lite_kernel_flexa_info { + uint32_t sbi_mode; + uint32_t sync_mode; + uint32_t flexa_mode; + uint32_t stream_id; + uint32_t segment_address; + uint32_t segment_count; + uint32_t segment_size; + uint32_t stop_flag; + uint32_t start_flag; + uint32_t reset_flag; +} +vg_lite_kernel_flexa_info_t; + +typedef struct vg_lite_kernel_mem { + uint32_t bytes; + + vg_lite_vidmem_pool_t pool; +} +vg_lite_kernel_mem_t; + +typedef struct vg_lite_kernel_map_memory { + /* Number of bytes to map. */ + uint32_t bytes; + + /* Physical memory address. */ + uint32_t physical; + + /* Logical memory address. */ + void * logical; +} +vg_lite_kernel_map_memory_t; + +typedef struct vg_lite_kernel_unmap_memory { + /* Number of bytes to map. */ + uint32_t bytes; + + /* Logical memory address. */ + void * logical; +} +vg_lite_kernel_unmap_memory_t; + +typedef struct vg_lite_kernel_close { + vg_lite_kernel_context_t * context; +} +vg_lite_kernel_close_t; + +typedef struct vg_lite_kernel_export_memory { + int32_t fd; +} +vg_lite_kernel_export_memory_t; + +typedef struct vg_lite_kernel_hardware_running_time { + unsigned long run_time; + int32_t hertz; +} +vg_lite_kernel_hardware_running_time_t; + +typedef struct vg_lite_kernel_delay_resume { + uint32_t set_delay_resume; + uint32_t query_delay_resume; +} +vg_lite_kernel_delay_resume_t; + +typedef struct vg_lite_kernel_gpu_clock_state { + uint32_t state; +} +vg_lite_kernel_gpu_clock_state_t; + +vg_lite_error_t vg_lite_kernel(vg_lite_kernel_command_t command, void * data); + +vg_lite_error_t record_running_time(void); + +extern uint32_t init_buffer[12]; +extern uint32_t is_init; +extern size_t physical_address; + +#ifdef __cplusplus +} +#endif + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_KERNEL_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_option.h b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_option.h new file mode 100755 index 0000000..d47de5b --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_option.h @@ -0,0 +1,143 @@ +/**************************************************************************** +* +* The MIT License (MIT) +* +* Copyright (c) 2014 - 2022 Vivante Corporation +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +* DEALINGS IN THE SOFTWARE. +* +***************************************************************************** +* +* The GPL License (GPL) +* +* Copyright (C) 2014 - 2022 Vivante Corporation +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +***************************************************************************** +* +* Note: This software is released under dual MIT and GPL licenses. A +* recipient may use this file under the terms of either the MIT license or +* GPL License. If you wish to use only one license not the other, you can +* indicate your decision by deleting one of the above license notices in your +* version of this file. +* +*****************************************************************************/ + +#ifndef VG_LITE_KERNEL_OPTION_H +#define VG_LITE_KERNEL_OPTION_H + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Set gcdVG_ENABLE_WRITEBUFFER to 1 for Linux Write Combined memory access + * Set gcdVG_ENABLE_WRITEBUFFER to 0 for Linux Uncacheable memory access +*/ +#ifndef gcdVG_ENABLE_WRITEBUFFER +#define gcdVG_ENABLE_WRITEBUFFER 1 +#endif + +/* + * Backup state command, only support Linux and RTOS +*/ +#ifndef gcdVG_ENABLE_BACKUP_COMMAND +#define gcdVG_ENABLE_BACKUP_COMMAND 0 +#endif + +/* + * Power management, only support Linux and RTOS +*/ +#ifndef gcdVG_ENABLE_POWER_MANAGEMENT +#define gcdVG_ENABLE_POWER_MANAGEMENT 0 +#endif + +/* + * when set to 1, vg_lite_hal_trace can use to print message +*/ +#ifndef gcdVG_ENABLE_DEBUG +#define gcdVG_ENABLE_DEBUG 1 +#endif + +/* + * when set to 1, dump last submit command from kernel +*/ +#ifndef gcdVG_ENABLE_DUMP_COMMAND +#define gcdVG_ENABLE_DUMP_COMMAND 0 +#endif + +/* + * when gpu hang, set 1 to open gpu reset function +*/ +#ifndef gcdVG_ENABLE_GPU_RESET +#define gcdVG_ENABLE_GPU_RESET 0 +#endif + +/* + * Set 1 to open gpu auto clock gating feature +*/ +#ifndef gcdVG_ENABLE_AUTO_CLOCK_GATING +#define gcdVG_ENABLE_AUTO_CLOCK_GATING 0 +#endif + +/* + * Set 1 to open dump debug register +*/ +#ifndef gcdVG_DUMP_DEBUG_REGISTER +#define gcdVG_DUMP_DEBUG_REGISTER 0 +#endif + +/* + * For zephyr system + * Set gcdVG_ENABLE_DELAY_RESUME to 1 to open delay resume feature. +*/ +#ifndef gcdVG_ENABLE_DELAY_RESUME +#define gcdVG_ENABLE_DELAY_RESUME 0 +#endif + +/* + * Set 1 to record GPU hardware running time. +*/ +#ifndef gcdVG_RECORD_HARDWARE_RUNNING_TIME +#define gcdVG_RECORD_HARDWARE_RUNNING_TIME 0 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_KERNEL_OPTION_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_type.h b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_type.h new file mode 100755 index 0000000..b24fb0e --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/VGLiteKernel/vg_lite_type.h @@ -0,0 +1,80 @@ +/***************************************************************************** +* +* copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ +#ifndef VG_LITE_TYPE_H +#define VG_LITE_TYPE_H + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#if __KERNEL__ + #include +#endif +#include "vg_lite_kernel.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define VG_FALSE 0 +#define VG_TRUE 1 + +#define VG_SUCCESS 0 +#define VG_FAIL -1 + +typedef int vg_lite_bool_t; +typedef unsigned char vg_lite_uint8_t; +typedef char vg_lite_int8_t; +typedef short vg_lite_int16_t; +typedef unsigned short vg_lite_uint16_t; +typedef int vg_lite_int32_t; +typedef unsigned int vg_lite_uint32_t; +typedef unsigned long long vg_lite_uint64_t; +typedef float vg_lite_float_t; +typedef double vg_lite_double_t; +typedef char vg_lite_char; +typedef char * vg_lite_string; +typedef void * vg_lite_pointer; +typedef void vg_lite_void; +typedef unsigned int vg_lite_color_t; +typedef unsigned long vg_lite_flag_t; +typedef unsigned long vg_lite_long_t; + +#if __KERNEL__ +# if BITS_PER_LONG == 64 +typedef unsigned long long vg_lite_uintptr_t; +# else +typedef unsigned int vg_lite_uintptr_t; +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_TYPE_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/add_lvgl_if.sh b/inc/lvgl/src/libs/vg_lite_driver/add_lvgl_if.sh new file mode 100755 index 0000000..09c7513 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/add_lvgl_if.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +#Add LVGL #if LV_USE_VG_LITE_DRIVER guard +#Usage +# find -name "*.c" | xargs ./add_lvgl_if.sh +# find -name "t*.h" | xargs ./add_lvgl_if.sh + +sed '0,/\*\/$/ {/\*\/$/ {n; s|^|\n#include "../../lv_conf_internal.h"\n#if LV_USE_VG_LITE_DRIVER\n|}}' $@ -i + +sed -i -e '$a\ +\ +#endif /* LV_USE_VG_LITE_DRIVER */\ +' $@ -i diff --git a/inc/lvgl/src/libs/vg_lite_driver/inc/vg_lite.h b/inc/lvgl/src/libs/vg_lite_driver/inc/vg_lite.h new file mode 100755 index 0000000..cf53908 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/inc/vg_lite.h @@ -0,0 +1,1458 @@ +/**************************************************************************** +* +* Copyright 2012 - 2023 Vivante Corporation, Santa Clara, California. +* All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* 'Software'), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sub license, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject +* to the following conditions: +* +* The above copyright notice and this permission notice (including the +* next paragraph) shall be included in all copies or substantial +* portions of the Software. +* +* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +* IN NO EVENT SHALL VIVANTE AND/OR ITS SUPPLIERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*****************************************************************************/ + +#ifndef VG_LITE_H +#define VG_LITE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_MSC_VER) +#define inline __inline +#endif + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include +#include + +/* VGLite API Constants *******************************************************************************************************************/ + +#define VGLITE_HEADER_VERSION 7 + +#ifndef VGLITE_VERSION_3_0 +#define VGLITE_VERSION_3_0 1 + +#define VGLITE_MAKE_VERSION(major, minor, patch) (((major) << 16) | ((minor) << 8) | (patch)) +#define VGLITE_VERSION_MAJOR(version) (((uint32_t)(version) >> 16) & 0xff) +#define VGLITE_VERSION_MINOR(version) (((uint32_t)(version) >> 8) & 0xff) +#define VGLITE_VERSION_PATCH(version) ((uint32_t)(version) & 0xff) + +#define VGLITE_API_VERSION_3_0 VGLITE_MAKE_VERSION(3, 0, 0) + +#define VGLITE_RELEASE_VERSION VGLITE_MAKE_VERSION(4,0,90) + +#define VGL_FALSE 0 +#define VGL_TRUE 1 + +/* Path command (op code). */ +#define VLC_OP_END 0x00 +#define VLC_OP_CLOSE 0x01 +#define VLC_OP_MOVE 0x02 +#define VLC_OP_MOVE_REL 0x03 +#define VLC_OP_LINE 0x04 +#define VLC_OP_LINE_REL 0x05 +#define VLC_OP_QUAD 0x06 +#define VLC_OP_QUAD_REL 0x07 +#define VLC_OP_CUBIC 0x08 +#define VLC_OP_CUBIC_REL 0x09 +#define VLC_OP_BREAK 0x0A +#define VLC_OP_HLINE 0x0B +#define VLC_OP_HLINE_REL 0x0C +#define VLC_OP_VLINE 0x0D +#define VLC_OP_VLINE_REL 0x0E +#define VLC_OP_SQUAD 0x0F +#define VLC_OP_SQUAD_REL 0x10 +#define VLC_OP_SCUBIC 0x11 +#define VLC_OP_SCUBIC_REL 0x12 +#define VLC_OP_SCCWARC 0x13 +#define VLC_OP_SCCWARC_REL 0x14 +#define VLC_OP_SCWARC 0x15 +#define VLC_OP_SCWARC_REL 0x16 +#define VLC_OP_LCCWARC 0x17 +#define VLC_OP_LCCWARC_REL 0x18 +#define VLC_OP_LCWARC 0x19 +#define VLC_OP_LCWARC_REL 0x1A + +/* Macros for path manipulating: See path definitions. */ +#define VLM_PATH_ENABLE_UPLOAD(path) (path).uploaded.property |= 1 +#define VLM_PATH_DISABLE_UPLOAD(path) (path).uploaded.property &= (~1) +#define VLM_PATH_GET_UPLOAD_BIT(path) ((path).uploaded.property & 1) +#define VLM_PATH_STROKE_ENABLE_UPLOAD(path) (path).stroke->uploaded.property |= 1 +#define VLM_PATH_STROKE_DISABLE_UPLOAD(path) (path).stroke->uploaded.property &= (~1) +#define VLM_PATH_STROKE_GET_UPLOAD_BIT(path) ((path).stroke->uploaded.property & 1) + +/* Gradient constants. */ +#define VLC_MAX_COLOR_RAMP_STOPS 256 /*! The max number of radial gradient stops. */ +#define VLC_MAX_GRADIENT_STOPS 16 /*! The max number of gradient stops. */ +#define VLC_GRADIENT_BUFFER_WIDTH 1024 /*! The internal gradient buffer width.*/ + + +/* API name defines for backward compatibility to VGLite 2.0 APIs */ +#define vg_lite_buffer_upload vg_lite_upload_buffer +#define vg_lite_path_append vg_lite_append_path +#define vg_lite_path_calc_length vg_lite_get_path_length +#define vg_lite_set_ts_buffer vg_lite_set_tess_buffer +#define vg_lite_set_draw_path_type vg_lite_set_path_type +#define vg_lite_create_mask_layer vg_lite_create_masklayer +#define vg_lite_fill_mask_layer vg_lite_fill_masklayer +#define vg_lite_blend_mask_layer vg_lite_blend_masklayer +#define vg_lite_generate_mask_layer_by_path vg_lite_render_masklayer +#define vg_lite_set_mask_layer vg_lite_set_masklayer +#define vg_lite_destroy_mask_layer vg_lite_destroy_masklayer +#define vg_lite_enable_mask vg_lite_enable_masklayer +#define vg_lite_enable_color_transformation vg_lite_enable_color_transform +#define vg_lite_set_color_transformation vg_lite_set_color_transform +#define vg_lite_set_image_global_alpha vg_lite_source_global_alpha +#define vg_lite_set_dest_global_alpha vg_lite_dest_global_alpha +#define vg_lite_clear_rad_grad vg_lite_clear_radial_grad +#define vg_lite_update_rad_grad vg_lite_update_radial_grad +#define vg_lite_get_rad_grad_matrix vg_lite_get_radial_grad_matrix +#define vg_lite_set_rad_grad vg_lite_set_radial_grad +#define vg_lite_draw_linear_gradient vg_lite_draw_linear_grad +#define vg_lite_draw_radial_gradient vg_lite_draw_radial_grad +#define vg_lite_draw_gradient vg_lite_draw_grad +#define vg_lite_mem_avail vg_lite_get_mem_size +#define vg_lite_set_update_stroke vg_lite_update_stroke + +#define vg_lite_buffer_image_mode_t vg_lite_image_mode_t +#define vg_lite_draw_path_type_t vg_lite_path_type_t +#define vg_lite_linear_gradient_ext_t vg_lite_ext_linear_gradient_t +#define vg_lite_buffer_transparency_mode_t vg_lite_transparency_t + +/* VG_LITE_BLEND_PREMULTIPLY_SRC_OVER is the same as VG_LITE_BLEND_NORMAL_LVGL */ +#define VG_LITE_BLEND_PREMULTIPLY_SRC_OVER VG_LITE_BLEND_NORMAL_LVGL + +/* VGLite API Types ***********************************************************************************************************************/ + +typedef unsigned char vg_lite_uint8_t; +typedef char vg_lite_int8_t; +typedef short vg_lite_int16_t; +typedef unsigned short vg_lite_uint16_t; +typedef int vg_lite_int32_t; +typedef unsigned int vg_lite_uint32_t; +typedef unsigned long long vg_lite_uint64_t; +typedef float vg_lite_float_t; +typedef double vg_lite_double_t; +typedef char vg_lite_char; +typedef char * vg_lite_string; +typedef void * vg_lite_pointer; +typedef void vg_lite_void; +typedef unsigned int vg_lite_color_t; + + +/* VGLite API Enumerations ****************************************************************************************************************/ + +#ifndef VG_LITE_ERROR +#define VG_LITE_ERROR 1 + +/* Error codes that the vg_lite functions can return. */ +typedef enum vg_lite_error { + VG_LITE_SUCCESS = 0, /*! Success. */ + VG_LITE_INVALID_ARGUMENT, /*! An invalid argument was specified. */ + VG_LITE_OUT_OF_MEMORY, /*! Out of GPU memory. */ + VG_LITE_NO_CONTEXT, /*! No context or an unintialized context specified. */ + VG_LITE_TIMEOUT, /*! A timeout has occurred during a wait. */ + VG_LITE_OUT_OF_RESOURCES, /*! Out of system resources. */ + VG_LITE_GENERIC_IO, /*! Cannot communicate with the kernel driver. */ + VG_LITE_NOT_SUPPORT, /*! Function call not supported. */ + VG_LITE_ALREADY_EXISTS, /*! Object already exists */ + VG_LITE_NOT_ALIGNED, /*! Data alignment error */ + VG_LITE_FLEXA_TIME_OUT, /*! VG timeout requesting for segment buffer */ + VG_LITE_FLEXA_HANDSHAKE_FAIL, /*! VG and SBI synchronizer handshake failed */ +} vg_lite_error_t; +#endif + +/* Chip features bit */ +typedef enum vg_lite_feature { + gcFEATURE_BIT_VG_IM_INDEX_FORMAT, + gcFEATURE_BIT_VG_SCISSOR, + gcFEATURE_BIT_VG_BORDER_CULLING, + gcFEATURE_BIT_VG_RGBA2_FORMAT, + gcFEATURE_BIT_VG_QUALITY_8X, + gcFEATURE_BIT_VG_IM_FASTCLAER, + gcFEATURE_BIT_VG_RADIAL_GRADIENT, + gcFEATURE_BIT_VG_GLOBAL_ALPHA, + gcFEATURE_BIT_VG_RGBA8_ETC2_EAC, + gcFEATURE_BIT_VG_COLOR_KEY, + gcFEATURE_BIT_VG_DOUBLE_IMAGE, + gcFEATURE_BIT_VG_YUV_OUTPUT, + gcFEATURE_BIT_VG_FLEXA, + gcFEATURE_BIT_VG_24BIT, + gcFEATURE_BIT_VG_DITHER, + gcFEATURE_BIT_VG_USE_DST, + gcFEATURE_BIT_VG_PE_CLEAR, + gcFEATURE_BIT_VG_IM_INPUT, + gcFEATURE_BIT_VG_DEC_COMPRESS, + gcFEATURE_BIT_VG_LINEAR_GRADIENT_EXT, + gcFEATURE_BIT_VG_MASK, + gcFEATURE_BIT_VG_MIRROR, + gcFEATURE_BIT_VG_GAMMA, + gcFEATURE_BIT_VG_NEW_BLEND_MODE, + gcFEATURE_BIT_VG_STENCIL, + gcFEATURE_BIT_VG_SRC_PREMULTIPLIED, /*! Valid only if gcFEATURE_BIT_VG_HW_PREMULTIPLY is 0 */ + gcFEATURE_BIT_VG_HW_PREMULTIPLY, /*! HW multiplier can accept either premultiplied or not */ + gcFEATURE_BIT_VG_COLOR_TRANSFORMATION, + gcFEATURE_BIT_VG_LVGL_SUPPORT, + gcFEATURE_BIT_VG_INDEX_ENDIAN, + gcFEATURE_BIT_VG_24BIT_PLANAR, + gcFEATURE_BIT_VG_PIXEL_MATRIX, + gcFEATURE_BIT_VG_NEW_IMAGE_INDEX, + gcFEATURE_BIT_VG_PARALLEL_PATHS, + gcFEATURE_BIT_VG_STRIPE_MODE, + gcFEATURE_BIT_VG_IM_DEC_INPUT, + gcFEATURE_BIT_VG_GAUSSIAN_BLUR, + gcFEATURE_BIT_VG_RECTANGLE_TILED_OUT, + gcFEATURE_BIT_VG_TESSELLATION_TILED_OUT, + gcFEATURE_BIT_VG_IM_REPEAT_REFLECT, + gcFEATURE_BIT_VG_YUY2_INPUT, + gcFEATURE_BIT_VG_YUV_INPUT, + gcFEATURE_BIT_VG_YUV_TILED_INPUT, + gcFEATURE_BIT_VG_AYUV_INPUT, + gcFEATURE_BIT_VG_16PIXELS_ALIGN, + gcFEATURE_BIT_VG_DEC_COMPRESS_2_0, + gcFEATURE_BIT_VG_NV24_INPUT, + gcFEATURE_BIT_VG_TILED_LIMIT, + gcFEATURE_BIT_TILED_MODE, + gcFEATURE_BIT_VG_SRC_ADDRESS_16BYTES_ALIGNED, + gcFEATURE_BIT_VG_SRC_ADDRESS_64BYTES_ALIGNED, + gcFEATURE_BIT_VG_SRC_TILE_4PIXELS_ALIGNED, + gcFEATURE_BIT_VG_SRC_BUF_ALINGED, + gcFEATURE_BIT_VG_DST_ADDRESS_64BYTES_ALIGNED, + gcFEATURE_BIT_VG_DST_TILE_4PIXELS_ALIGNED, + gcFEATURE_BIT_VG_DST_BUF_ALIGNED, + gcFEATURE_BIT_VG_DST_24BIT_PLANAR_ALIGNED, + gcFEATURE_BIT_VG_DST_BUFLEN_ALIGNED, + gcFEATURE_BIT_VG_FORMAT_SUPPORT_CHECK, + gcFEATURE_BIT_VG_YUV_ALIGNED_CHECK, + gcFEATURE_BIT_VG_512_PARALLEL_PATHS, + gcFEATURE_COUNT +} vg_lite_feature_t; + +/* Rendering quality enums. */ +typedef enum vg_lite_quality { + VG_LITE_HIGH, /*! High quality 16x anti-aliasing path. */ + VG_LITE_UPPER, /*! Upper quality 8x anti-aliasing path. */ + VG_LITE_MEDIUM, /*! Medium quality 4x anti-aliasing path. */ + VG_LITE_LOW, /*! Low quality path without any anti-aliasing. */ +} vg_lite_quality_t; + +/* Format of path coordinates. */ +typedef enum vg_lite_format { + VG_LITE_S8, /*! Signed 8-bit coordinates. */ + VG_LITE_S16, /*! Signed 16-bit coordinates. */ + VG_LITE_S32, /*! Signed 32-bit coordinates. */ + VG_LITE_FP32, /*! 32-bit floating point coordinates. */ +} vg_lite_format_t; + +/* Format of pixel buffer. */ +typedef enum vg_lite_buffer_format { + /* The following OPENVG_* enums are defined corresponding to OpenVG + * VGImageFormat enums so VGLite API can take OpenVG VGImageFormat enums directly. + * + * Note: The bits for each color channel are stored within a machine word + * from MSB to LSB in the order indicated by the pixel format name. + * This is opposite of VG_LITE_* formats (from LSB to MSB). + */ + + /* RGB{A,X} channel ordering */ + OPENVG_sRGBX_8888 = 0, + OPENVG_sRGBA_8888 = 1, + OPENVG_sRGBA_8888_PRE = 2, + OPENVG_sRGB_565 = 3, + OPENVG_sRGBA_5551 = 4, + OPENVG_sRGBA_4444 = 5, + OPENVG_sL_8 = 6, + OPENVG_lRGBX_8888 = 7, + OPENVG_lRGBA_8888 = 8, + OPENVG_lRGBA_8888_PRE = 9, + OPENVG_lL_8 = 10, + OPENVG_A_8 = 11, + OPENVG_BW_1 = 12, + OPENVG_A_1 = 13, + OPENVG_A_4 = 14, + + /* The following enums 15 ~ 25 do not exist in OpenVG VGImageFormat. + * They are defined to support OpenVG CTS internalFormat which is set + * base on "sRGB_NONPRE", "lRGB_NONPRE", "sRGB_PRE", "lRGB_PRE" + * destination surface configurations. + */ + OPENVG_sRGBX_8888_PRE = 15, + OPENVG_sRGB_565_PRE = 16, + OPENVG_sRGBA_5551_PRE = 17, + OPENVG_sRGBA_4444_PRE = 18, + OPENVG_lRGBX_8888_PRE = 19, + OPENVG_lRGB_565 = 20, + OPENVG_lRGB_565_PRE = 21, + OPENVG_lRGBA_5551 = 22, + OPENVG_lRGBA_5551_PRE = 23, + OPENVG_lRGBA_4444 = 24, + OPENVG_lRGBA_4444_PRE = 25, + + /* {A,X}RGB channel ordering */ + OPENVG_sXRGB_8888 = 0 | (1 << 6), + OPENVG_sARGB_8888 = 1 | (1 << 6), + OPENVG_sARGB_8888_PRE = 2 | (1 << 6), + OPENVG_sARGB_1555 = 4 | (1 << 6), + OPENVG_sARGB_4444 = 5 | (1 << 6), + OPENVG_lXRGB_8888 = 7 | (1 << 6), + OPENVG_lARGB_8888 = 8 | (1 << 6), + OPENVG_lARGB_8888_PRE = 9 | (1 << 6), + + /* BGR{A,X} channel ordering */ + OPENVG_sBGRX_8888 = 0 | (1 << 7), + OPENVG_sBGRA_8888 = 1 | (1 << 7), + OPENVG_sBGRA_8888_PRE = 2 | (1 << 7), + OPENVG_sBGR_565 = 3 | (1 << 7), + OPENVG_sBGRA_5551 = 4 | (1 << 7), + OPENVG_sBGRA_4444 = 5 | (1 << 7), + OPENVG_lBGRX_8888 = 7 | (1 << 7), + OPENVG_lBGRA_8888 = 8 | (1 << 7), + OPENVG_lBGRA_8888_PRE = 9 | (1 << 7), + + /* {A,X}BGR channel ordering */ + OPENVG_sXBGR_8888 = 0 | (1 << 6) | (1 << 7), + OPENVG_sABGR_8888 = 1 | (1 << 6) | (1 << 7), + OPENVG_sABGR_8888_PRE = 2 | (1 << 6) | (1 << 7), + OPENVG_sABGR_1555 = 4 | (1 << 6) | (1 << 7), + OPENVG_sABGR_4444 = 5 | (1 << 6) | (1 << 7), + OPENVG_lXBGR_8888 = 7 | (1 << 6) | (1 << 7), + OPENVG_lABGR_8888 = 8 | (1 << 6) | (1 << 7), + OPENVG_lABGR_8888_PRE = 9 | (1 << 6) | (1 << 7), + + /* The following VG_LITE_* enums are original VGLite API image format enums. + * + * Note: The bits for each color channel are stored within a machine word + * from LSB to MSB in the order indicated by the pixel format name. + * This is opposite of OPENVG VG_* formats (from MSB to LSB). + */ + VG_LITE_RGBA8888 = 0 | (1 << 10), + VG_LITE_BGRA8888 = 1 | (1 << 10), + VG_LITE_RGBX8888 = 2 | (1 << 10), + VG_LITE_BGRX8888 = 3 | (1 << 10), + VG_LITE_RGB565 = 4 | (1 << 10), + VG_LITE_BGR565 = 5 | (1 << 10), + VG_LITE_RGBA4444 = 6 | (1 << 10), + VG_LITE_BGRA4444 = 7 | (1 << 10), + VG_LITE_BGRA5551 = 8 | (1 << 10), + VG_LITE_A4 = 9 | (1 << 10), + VG_LITE_A8 = 10 | (1 << 10), + VG_LITE_L8 = 11 | (1 << 10), + VG_LITE_YUYV = 12 | (1 << 10), + VG_LITE_YUY2 = 13 | (1 << 10), + VG_LITE_ANV12 = 14 | (1 << 10), + VG_LITE_AYUY2 = 15 | (1 << 10), + VG_LITE_NV12 = 16 | (1 << 10), + VG_LITE_YV12 = 17 | (1 << 10), + VG_LITE_YV24 = 18 | (1 << 10), + VG_LITE_YV16 = 19 | (1 << 10), + VG_LITE_NV16 = 20 | (1 << 10), + VG_LITE_YUY2_TILED = 21 | (1 << 10), + VG_LITE_NV12_TILED = 22 | (1 << 10), + VG_LITE_ANV12_TILED = 23 | (1 << 10), + VG_LITE_AYUY2_TILED = 24 | (1 << 10), + VG_LITE_RGBA2222 = 25 | (1 << 10), + VG_LITE_BGRA2222 = 26 | (1 << 10), + VG_LITE_ABGR2222 = 27 | (1 << 10), + VG_LITE_ARGB2222 = 28 | (1 << 10), + VG_LITE_ABGR4444 = 29 | (1 << 10), + VG_LITE_ARGB4444 = 30 | (1 << 10), + VG_LITE_ABGR8888 = 31 | (1 << 10), + VG_LITE_ARGB8888 = 32 | (1 << 10), + VG_LITE_ABGR1555 = 33 | (1 << 10), + VG_LITE_RGBA5551 = 34 | (1 << 10), + VG_LITE_ARGB1555 = 35 | (1 << 10), + VG_LITE_XBGR8888 = 36 | (1 << 10), + VG_LITE_XRGB8888 = 37 | (1 << 10), + VG_LITE_RGBA8888_ETC2_EAC = 38 | (1 << 10), + VG_LITE_RGB888 = 39 | (1 << 10), + VG_LITE_BGR888 = 40 | (1 << 10), + VG_LITE_ABGR8565 = 41 | (1 << 10), + VG_LITE_BGRA5658 = 42 | (1 << 10), + VG_LITE_ARGB8565 = 43 | (1 << 10), + VG_LITE_RGBA5658 = 44 | (1 << 10), + VG_LITE_ABGR8565_PLANAR = 45 | (1 << 10), + VG_LITE_BGRA5658_PLANAR = 46 | (1 << 10), + VG_LITE_ARGB8565_PLANAR = 47 | (1 << 10), + VG_LITE_RGBA5658_PLANAR = 48 | (1 << 10), + VG_LITE_NV24 = 49 | (1 << 10), + VG_LITE_NV24_TILED = 50 | (1 << 10), + + VG_LITE_INDEX_1 = 0 | (1 << 11), /*! Indexed format. */ + VG_LITE_INDEX_2 = 1 | (1 << 11), + VG_LITE_INDEX_4 = 2 | (1 << 11), + VG_LITE_INDEX_8 = 3 | (1 << 11), + +} vg_lite_buffer_format_t; + +/* Swizzle of packed YUV format UV channels. */ +typedef enum vg_lite_swizzle { + VG_LITE_SWIZZLE_UV, + VG_LITE_SWIZZLE_VU, +} vg_lite_swizzle_t; + +/* The YUV<->RGB conversion rule. */ +typedef enum vg_lite_yuv2rgb { + VG_LITE_YUV601, + VG_LITE_YUV709, +} vg_lite_yuv2rgb_t; + +/* The pixel layout in a buffer. */ +typedef enum vg_lite_buffer_layout { + VG_LITE_LINEAR, + VG_LITE_TILED, +} vg_lite_buffer_layout_t; + +/* The image (buffer) rendering mode. Match OpenVG enum VGImageMode */ +typedef enum vg_lite_image_mode { + /* For enum value backward compatibility */ + VG_LITE_ZERO = 0, + VG_LITE_NORMAL_IMAGE_MODE = 0x1F00, + VG_LITE_MULTIPLY_IMAGE_MODE = 0x1F01, + VG_LITE_STENCIL_MODE = 0x1F02, + VG_LITE_NONE_IMAGE_MODE = 0x1F03, + VG_LITE_RECOLOR_MODE = 0x1F04, +} vg_lite_image_mode_t; + +/* The image (buffer) transparency mode. */ +typedef enum vg_lite_transparency { + VG_LITE_IMAGE_OPAQUE, + VG_LITE_IMAGE_TRANSPARENT +} vg_lite_transparency_t; + +/* Blending modes. OPENVG_BLEND_* match OpenVG enum VGBlendMode. + * S and D represent source and destination non-premultiplied RGB color channels. + * Sa and Da represent the source and destination alpha channels. + * SP and DP represent source and destination alpha-premultiplied RGB color channels (S*Sa, D*Da). + */ +typedef enum vg_lite_blend { + /* Non-premultiplied Blending modes !*/ + VG_LITE_BLEND_NONE = 0, /*! RGB: S, No blend !*/ + /*! A: Sa !*/ + VG_LITE_BLEND_SRC_OVER = 1, /*! RGB: S + D*(1 - Sa) !*/ + /*! A: Sa + Da*(1 - Sa) !*/ + VG_LITE_BLEND_DST_OVER = 2, /*! RGB: S*(1 - Da) + D !*/ + /*! A: Sa*(1 - Da) + Da !*/ + VG_LITE_BLEND_SRC_IN = 3, /*! RGB: S*Da !*/ + /*! A: Sa*Da !*/ + VG_LITE_BLEND_DST_IN = 4, /*! RGB: D*Sa !*/ + /*! A: Da*Sa !*/ + VG_LITE_BLEND_MULTIPLY = 5, /*! RGB: S*(1 - Da) + D*(1 - Sa) + S*D !*/ + /*! A: Sa*(1 - Da) + Da*(1 - Sa) + Sa*Da !*/ + VG_LITE_BLEND_SCREEN = 6, /*! RGB: S + D - S*D !*/ + /*! A: Sa + Da - Sa*Da !*/ + VG_LITE_BLEND_DARKEN = 7, /*! RGB: min(SrcOver, DstOver) !*/ + /*! A: min(SrcOver, DstOver) !*/ + VG_LITE_BLEND_LIGHTEN = 8, /*! RGB: max(SrcOver, DstOver) !*/ + /*! A: max(SrcOver, DstOver) !*/ + VG_LITE_BLEND_ADDITIVE = 9, /*! RGB: S + D !*/ + /*! A: Sa + Da !*/ + VG_LITE_BLEND_SUBTRACT = 10, /*! RGB: D*(1 - Sa) !*/ + /*! A: Da*(1 - Sa) !*/ + VG_LITE_BLEND_NORMAL_LVGL = 11, /*! RGB: S*Sa + D*(1 - Sa) !*/ + /*! A: 0xFF !*/ + VG_LITE_BLEND_ADDITIVE_LVGL = 12, /*! RGB: (S + D)*Sa + D*(1 - Sa) !*/ + /*! A: 0xFF !*/ + VG_LITE_BLEND_SUBTRACT_LVGL = 13, /*! RGB: (S - D)*Sa + D*(1 - Sa) !*/ + /*! A: 0xFF !*/ + VG_LITE_BLEND_MULTIPLY_LVGL = 14, /*! RGB: (S*D)*Sa + D*(1 - Sa) !*/ + /*! A: 0xFF !*/ + + /* Porter Duff Premultiplied Blending modes !*/ + OPENVG_BLEND_SRC = 0x2000, /*! RGB: SP / Sa, No blend !*/ + /*! A: Sa !*/ + OPENVG_BLEND_SRC_OVER = 0x2001, /*! RGB: (SP + DP*(1 - Sa)) / (Sa + Da*(1 - Sa)) !*/ + /*! A: (Sa + Da*(1 - Sa)) !*/ + OPENVG_BLEND_DST_OVER = 0x2002, /*! RGB: (SP*(1 - Da) + DP) / (Sa*(1 - Da) + Da) !*/ + /*! A: (Sa*(1 - Da) + Da) !*/ + OPENVG_BLEND_SRC_IN = 0x2003, /*! RGB: (SP*Da) / (Sa*Da) !*/ + /*! A: (Sa*Da) !*/ + OPENVG_BLEND_DST_IN = 0x2004, /*! RGB: (DP*Sa) / (Sa*Da) !*/ + /*! A: (Sa*Da) !*/ + OPENVG_BLEND_MULTIPLY = 0x2005, /*! RGB: (SP*DP + SP*(1 - Da) + DP*(1 - Sa)) / (Sa + Da*(1 - Sa)) !*/ + /*! A: (Sa + Da*(1 - Sa)) !*/ + OPENVG_BLEND_SCREEN = 0x2006, /*! RGB: (SP + DP - (SP*DP)) / (Sa + Da*(1 - Sa)) !*/ + /*! A: (Sa + Da*(1 - Sa)) !*/ + OPENVG_BLEND_DARKEN = 0x2007, /*! RGB: (min(SP*Da, DP*Sa) + SP*(1 - Da) + DP*(1 - Sa)) / (Sa + Da*(1 - Sa)) !*/ + /*! A: (Sa + Da*(1 - Sa)) !*/ + OPENVG_BLEND_LIGHTEN = 0x2008, /*! RGB: (max(SP*Da, DP*Sa) + SP*(1 - Da) + DP*(1 - Sa)) / (Sa + Da*(1 - Sa)) !*/ + /*! A: (Sa + Da*(1 - Sa)) !*/ + OPENVG_BLEND_ADDITIVE = 0x2009, /*! RGB: (SP + DP) / (Sa + Da) !*/ + /*! A: (Sa + Da) !*/ +} vg_lite_blend_t; + +/* Fill rules. Match OpenVG enum VGFillRule */ +typedef enum vg_lite_fill { + VG_LITE_FILL_EVEN_ODD = 0x1900, /*! A pixel is drawn it it crosses an odd number of path pixels. */ + VG_LITE_FILL_NON_ZERO = 0x1901, /*! A pixel is drawn if it crosses at least one path pixel. */ +} vg_lite_fill_t; + +/* Global alpha modes. */ +typedef enum vg_lite_global_alpha { + VG_LITE_NORMAL = 0, /*! Use original src/dst alpha value. */ + VG_LITE_GLOBAL, /*! Use global src/dst alpha value to replace original src/dst alpha value. */ + VG_LITE_SCALED, /*! Multiply global src/dst alpha value and original src/dst alpha value. */ +} vg_lite_global_alpha_t; + +/* Filter modes. */ +typedef enum vg_lite_filter { + VG_LITE_FILTER_POINT = 0, /*! Fetch the nearest image pixel. */ + VG_LITE_FILTER_LINEAR = 0x1000, /*! Used for linear paint. */ + VG_LITE_FILTER_BI_LINEAR = 0x2000, /*! Use a 2x2 box around the image pixel and perform an interpolation. */ + VG_LITE_FILTER_GAUSSIAN = 0x3000, /*! Perform 3x3 gaussian blur with the convolution for image pixel. */ +} vg_lite_filter_t; + +/* Pattern padding mode. Match OpenVG enum VGTilingMode. */ +typedef enum vg_lite_pattern_mode { + VG_LITE_PATTERN_COLOR = 0x1D00, /*! Pixel outside the bounds of sourceimage should be taken as the color */ + VG_LITE_PATTERN_PAD = 0x1D01, /*! Pixel outside the bounds of sourceimage should be taken as having the same color as the closest edge pixel */ + VG_LITE_PATTERN_REPEAT = 0x1D02, /*! Pixel outside the bounds of sourceimage should be repeated indefinitely in all directions */ + VG_LITE_PATTERN_REFLECT = 0x1D03, /*! Pixel outside the bounds of sourceimage should be reflected indefinitely in all directions */ +} vg_lite_pattern_mode_t; + +/* Paint type. Match OpenVG enum VGPaintType. */ +typedef enum vg_lite_paint_type { + /* For enum value backward compatibility */ + VG_LITE_PAINT_ZERO = 0, + VG_LITE_PAINT_COLOR = 0x1B00, + VG_LITE_PAINT_LINEAR_GRADIENT = 0x1B01, + VG_LITE_PAINT_RADIAL_GRADIENT = 0x1B02, + VG_LITE_PAINT_PATTERN = 0x1B03, +} vg_lite_paint_type_t; + +/* Radial gradient padding mode. Match OpenVG enum VGColorRampSpreadMode */ +typedef enum { + VG_LITE_GRADIENT_SPREAD_FILL = 0, + VG_LITE_GRADIENT_SPREAD_PAD = 0x1C00, + VG_LITE_GRADIENT_SPREAD_REPEAT = 0x1C01, + VG_LITE_GRADIENT_SPREAD_REFLECT = 0x1C02, +} vg_lite_gradient_spreadmode_t; + +/* Decnano Compress mode. */ +typedef enum vg_lite_compress_mode { + VG_LITE_DEC_DISABLE = 0, /*! disable compress */ + VG_LITE_DEC_NON_SAMPLE, /*! compress ratio is 1.6 if use ARGB8888, compress ratio is 2 if use XRGB8888 */ + VG_LITE_DEC_HSAMPLE, /*! compress ratio is 2 if use ARGB8888, compress ratio is 2.6 if use XRGB8888 */ + VG_LITE_DEC_HV_SAMPLE, /*! compress ratio is 2.6 if use ARGB8888, compress ratio is 4 if use XRGB8888 */ +} vg_lite_compress_mode_t; + +/* Draw path type. Match OpenVG enum VGPaintMode */ +typedef enum vg_lite_path_type { + /* For enum value backward compatibility */ + VG_LITE_DRAW_ZERO = 0, + VG_LITE_DRAW_STROKE_PATH = (1 << 0), + VG_LITE_DRAW_FILL_PATH = (1 << 1), + VG_LITE_DRAW_FILL_STROKE_PATH = (1 << 1 | 1 << 0), +} vg_lite_path_type_t; + +/* End cap style. Match OpenVG enum VGCapStyle */ +typedef enum vg_lite_cap_style { + VG_LITE_CAP_BUTT = 0x1700, + VG_LITE_CAP_ROUND = 0x1701, + VG_LITE_CAP_SQUARE = 0x1702, +} vg_lite_cap_style_t; + +/* Line join styles. Match OpenVG enum VGJoinStyle */ +typedef enum vg_lite_join_style { + VG_LITE_JOIN_MITER = 0x1800, + VG_LITE_JOIN_ROUND = 0x1801, + VG_LITE_JOIN_BEVEL = 0x1802, +} vg_lite_join_style_t; + +/* Mask operation mode. Match OpenVG enum VGMaskOperation */ +typedef enum vg_lite_mask_operation { + VG_LITE_CLEAR_MASK = 0x1500, /*! Set all dest mask values to 0 */ + VG_LITE_FILL_MASK = 0x1501, /*! Set all dest mask values to 1 */ + VG_LITE_SET_MASK = 0x1502, /*! Copy from src masklayer to dest masklayer. */ + VG_LITE_UNION_MASK = 0x1503, /*! Replace dest masklayer by its union with src masklayer. */ + VG_LITE_INTERSECT_MASK = 0x1504, /*! Replace dest masklayer by its intersection with src masklayer. */ + VG_LITE_SUBTRACT_MASK = 0x1505, /*! Subtract src mask in dest masklayer */ +} vg_lite_mask_operation_t; + +/* Mirror orientation mode. */ +typedef enum vg_lite_orientation { + VG_LITE_ORIENTATION_TOP_BOTTOM, + VG_LITE_ORIENTATION_BOTTOM_TOP, +} vg_lite_orientation_t; + +/* Gamma conversion mode. */ +typedef enum vg_lite_gamma_conversion { + VG_LITE_GAMMA_NO_CONVERSION, /*! Leave color as is. */ + VG_LITE_GAMMA_LINEAR, /*! Convert from sRGB to linear space. */ + VG_LITE_GAMMA_NON_LINEAR /*! Convert from linear to sRGB space. */ +} vg_lite_gamma_conversion_t; + +/* Index endian */ +typedef enum vg_lite_index_endian { + VG_LITE_INDEX_LITTLE_ENDIAN, /*! Parse the index pixel from low to high, + *! when using index1, the parsing order is bit0~bit7. + *! when using index2, the parsing order is bit0:1,bit2:3,bit4:5.bit6:7. + *! when using index4, the parsing order is bit0:3,bit4:7. + */ + VG_LITE_INDEX_BIG_ENDIAN, /*! Parse the index pixel from low to high, + *! when using index1, the parsing order is bit7~bit0. + *! when using index2, the parsing order is bit7:6,bit5:4,bit3:2.bit1:0. + *! when using index4, the parsing order is bit4:7,bit0:3. + */ +} vg_lite_index_endian_t; + +/* Map flag*/ +typedef enum vg_lite_map_flag { + VG_LITE_MAP_USER_MEMORY = 0, + VG_LITE_MAP_DMABUF = 0x01, +} vg_lite_map_flag_t; + +/*VGLite parameters variable*/ +typedef enum vg_lite_param_type { + VG_LITE_GPU_IDLE_STATE, /*! count must be 1 for GPU idle state TRUE or FALSE */ + VG_LITE_SCISSOR_RECT, /*! count must be 4n for x, y, right, bottom */ + VG_LITE_HARDWARE_RUNNING_TIME, /*! count must be 1 */ +} vg_lite_param_type_t; + +/* Vg lite buffer type */ +typedef enum vg_lite_buffer_type { + VG_LITE_COMMAND_BUFFER, + VG_LITE_TESSELLATION_BUFFER, + VG_LITE_RENDER_BUFFER, +} vg_lite_buffer_type_t; + +/* Reserve memory index */ +typedef enum vg_lite_memory_pool { + VG_LITE_MEMORY_POOL_1 = 0, + VG_LITE_MEMORY_POOL_2 = 1, +} vg_lite_memory_pool_t; + +typedef enum vg_lite_frame_flag { + VG_LITE_FRAME_END_FLAG = 1, +} vg_lite_frame_flag_t; + +/* VGLite API Structures ******************************************************************************************************************/ + +/* VGLite driver information */ +typedef struct vg_lite_info { + vg_lite_uint32_t api_version; + vg_lite_uint32_t header_version; + vg_lite_uint32_t release_version; + vg_lite_uint32_t reserved; +} vg_lite_info_t; + +/* A 2D Point definition. */ +typedef struct vg_lite_point { + vg_lite_int32_t x; + vg_lite_int32_t y; +} vg_lite_point_t; + +/* Four 2D Point that form a polygon */ +typedef vg_lite_point_t vg_lite_point4_t[4]; + +/* A 2D float Point definition. */ +typedef struct vg_lite_float_point { + vg_lite_float_t x; + vg_lite_float_t y; +} vg_lite_float_point_t; + +/* Four 2D float Point that form a polygon */ +typedef vg_lite_float_point_t vg_lite_float_point4_t[4]; + +/* A rectangle.*/ +typedef struct vg_lite_rectangle { + vg_lite_int32_t x; /*! Left coordinate of rectangle. */ + vg_lite_int32_t y; /*! Top coordinate of rectangle. */ + vg_lite_int32_t width; /*! Width of rectangle. */ + vg_lite_int32_t height; /*! Height of rectangle. */ +} vg_lite_rectangle_t; + +typedef struct vg_lite_matrix { + vg_lite_float_t m[3][3]; /*! The 3x3 matrix is in [row][column] order. */ + vg_lite_float_t scaleX; + vg_lite_float_t scaleY; + vg_lite_float_t angle; +} vg_lite_matrix_t; + +typedef struct vg_lite_yuvinfo { + vg_lite_swizzle_t swizzle; /*! UV swizzle. */ + vg_lite_yuv2rgb_t yuv2rgb; /*! 601 or 709 conversion standard. */ + vg_lite_uint32_t uv_planar; /*! UV(U) planar address. */ + vg_lite_uint32_t v_planar; /*! V planar address. */ + vg_lite_uint32_t alpha_planar; /*! Alpha planar address. */ + vg_lite_uint32_t uv_stride; /*! UV(U) stride. */ + vg_lite_uint32_t v_stride; /*! V stride. */ + vg_lite_uint32_t alpha_stride; /*! Alpha stride. */ + vg_lite_uint32_t uv_height; /*! UV(U) height. */ + vg_lite_uint32_t v_height; /*! V height. */ + vg_lite_pointer uv_memory; /*! The logical pointer to the UV(U) planar memory. */ + vg_lite_pointer v_memory; /*! The logical pointer to the V planar memory. */ + vg_lite_pointer uv_handle; /*! The memory handle of the UV(U) planar. */ + vg_lite_pointer v_handle; /*! The memory handle of the V planar. */ +} vg_lite_yuvinfo_t; + +typedef struct vg_lite_path_point * vg_lite_path_point_ptr; +typedef struct vg_lite_path_point { + /* X coordinate. */ + vg_lite_float_t x; + + /* Y coordinate. */ + vg_lite_float_t y; + + /* Flatten flag for flattened path. */ + vg_lite_uint8_t flatten_flag; + + /* Curve type for stroke path. */ + vg_lite_uint8_t curve_type; + + /* X tangent. */ + vg_lite_float_t tangentX; + + /* Y tangent. */ + vg_lite_float_t tangentY; + + /* Length of the line. */ + vg_lite_float_t length; + + /* Pointer to next point node. */ + vg_lite_path_point_ptr next; + + /* Pointer to previous point node. */ + vg_lite_path_point_ptr prev; + +} vg_lite_path_point_t; + +typedef struct vg_lite_sub_path * vg_lite_sub_path_ptr; +typedef struct vg_lite_sub_path { + /* Pointer to next sub path. */ + vg_lite_sub_path_ptr next; + + /* Number of points. */ + vg_lite_uint32_t point_count; + + /* Point list. */ + vg_lite_path_point_ptr point_list; + + /* Last point. */ + vg_lite_path_point_ptr end_point; + + /* Whether is path is closed. */ + vg_lite_uint8_t closed; + + /* Sub path length. */ + vg_lite_float_t length; + +} vg_lite_sub_path_t; + +/* Save divided path data according to MOVE/MOVE_REL. */ +typedef struct vg_lite_path_list * vg_lite_path_list_ptr; +typedef struct vg_lite_path_list { + vg_lite_path_point_ptr path_points; + vg_lite_path_point_ptr path_end; + vg_lite_uint32_t point_count; + vg_lite_path_list_ptr next; + vg_lite_uint8_t closed; + +} vg_lite_path_list_t; + +/* Memory allocation info by kernel. */ +typedef struct vg_lite_hw_memory { + vg_lite_pointer handle; /*! gpu memory object handle. */ + vg_lite_pointer memory; /*! logical memory address. */ + vg_lite_uint32_t address; /*! GPU memory address. */ + vg_lite_uint32_t bytes; /*! Size of memory. */ + vg_lite_uint32_t property; /*! Currently bit0 is used for path upload state: + *! 1 : enable auto path data uploading. + *! 0 : disable path data uploading. path data is embedded in command buffer. */ +} vg_lite_hw_memory_t; + +typedef struct vg_lite_stroke { + /* Stroke parameters */ + vg_lite_cap_style_t cap_style; + vg_lite_join_style_t join_style; + vg_lite_float_t line_width; + vg_lite_float_t miter_limit; + vg_lite_float_t * dash_pattern; + vg_lite_uint32_t pattern_count; + vg_lite_float_t dash_phase; + vg_lite_float_t dash_length; + vg_lite_uint32_t dash_index; + vg_lite_float_t half_width; + + /* Total length of stroke dash patterns. */ + vg_lite_float_t pattern_length; + + /* For fast checking. */ + vg_lite_float_t miter_square; + + /* Temp storage of stroke subPath. */ + vg_lite_path_point_ptr path_points; + vg_lite_path_point_ptr path_end; + vg_lite_uint32_t point_count; + vg_lite_path_point_ptr left_point; + vg_lite_path_point_ptr right_point; + vg_lite_path_point_ptr stroke_points; + vg_lite_path_point_ptr stroke_end; + vg_lite_uint32_t stroke_count; + + /* Divide stroke path according to move or move_rel for avoiding implicit closure. */ + vg_lite_path_list_ptr path_list_divide; + + /* pointer to current divided path data. */ + vg_lite_path_list_ptr cur_list; + + /* Flag that add end_path in driver. */ + vg_lite_uint8_t add_end; + vg_lite_uint8_t dash_reset; + + /* Sub path list. */ + vg_lite_sub_path_ptr stroke_paths; + + /* Last sub path. */ + vg_lite_sub_path_ptr last_stroke; + + /* Swing area handling. */ + vg_lite_uint32_t swing_handling; + vg_lite_float_t swing_deltax; + vg_lite_float_t swing_deltay; + vg_lite_path_point_ptr swing_start; + vg_lite_path_point_ptr swing_stroke; + vg_lite_float_t swing_length; + vg_lite_float_t swing_centlen; + vg_lite_uint32_t swing_count; + vg_lite_uint8_t need_swing; + vg_lite_uint8_t swing_ccw; + + vg_lite_float_t stroke_length; + vg_lite_uint32_t stroke_size; + + /* The stroke line is fat line. */ + vg_lite_uint8_t fattened; + vg_lite_uint8_t closed; + vg_lite_hw_memory_t uploaded; + +} vg_lite_stroke_t; + +/* Fast clear buffer. */ +typedef struct vg_lite_fc_buffer { + vg_lite_int32_t width; /*! Width of the buffer in pixels. */ + vg_lite_int32_t height; /*! height of the buffer in pixels. */ + vg_lite_int32_t stride; /*! The number of bytes to move from one line in the buffer to the next line. */ + vg_lite_pointer + handle; /*! The memory handle of the buffer's memory as allocated by the VGLite kernel. */ + vg_lite_pointer memory; /*! The logical pointer to the buffer's memory for the CPU. */ + vg_lite_uint32_t address; /*! The address to the buffer's memory for the hardware. */ + vg_lite_uint32_t color; /*! The fastclear color value. */ +} vg_lite_fc_buffer_t; + +/* Structure for any image or render target. */ +typedef struct vg_lite_buffer { + vg_lite_int32_t width; /*! Width of the buffer in pixels. */ + vg_lite_int32_t height; /*! Height of the buffer in pixels. */ + vg_lite_int32_t stride; /*! The number of bytes to move from one line in the buffer to the next line. */ + vg_lite_buffer_layout_t tiled; /*! Indicating the buffer memory layout is linear or tiled. */ + vg_lite_buffer_format_t format; /*! The pixel format of the buffer. */ + vg_lite_pointer + handle; /*! The memory handle of the buffer's memory as allocated by the VGLite kernel. */ + vg_lite_pointer memory; /*! The logical pointer to the buffer's memory for the CPU. */ + vg_lite_uint32_t address; /*! The address to the buffer's memory for the hardware. */ + vg_lite_memory_pool_t pool; /*! The buffer's memory pool. */ + vg_lite_yuvinfo_t yuv; /*! The yuv format details. */ + vg_lite_image_mode_t image_mode; /*! The blit image mode. */ + vg_lite_transparency_t transparency_mode; /*! image transparency mode. */ + vg_lite_fc_buffer_t fc_buffer[3]; /*! 3 fastclear buffers,reserved YUV format. */ + vg_lite_compress_mode_t compress_mode; /*! Refer to the definition by vg_lite_compress_mode_t. */ + vg_lite_index_endian_t index_endian; /*! Refer to the definition by vg_lite_index_endian_t. */ + vg_lite_paint_type_t paintType; /*! Get paintcolor from different paint types. */ + vg_lite_uint8_t fc_enable; /*! enable im fastclear. */ + vg_lite_uint8_t scissor_buffer; /*! The buffer is scissor mask buffer. */ + vg_lite_uint8_t premultiplied; /*! The RGB pixel values are alpha-premultipled */ + vg_lite_uint8_t apply_premult; /*! Need to apply alpha-premultiply */ + struct vg_lite_buffer * lvgl_buffer; /*! Buffer for SW LVGL blending support */ + vg_lite_color_t bg_color; /*! Background for edge filter */ +} vg_lite_buffer_t; + +/* Path info for drawing command. */ +typedef struct vg_lite_path { + vg_lite_float_t bounding_box[4]; /*! Bounding box specified as left, top, right, and bottom. */ + vg_lite_quality_t quality; /*! Quality hint for the path. */ + vg_lite_format_t format; /*! Coordinate format. */ + vg_lite_hw_memory_t uploaded; /*! Path data that has been upload into GPU addressable memory. */ + vg_lite_uint32_t path_length; /*! Number of bytes in the path data. */ + vg_lite_pointer path; /*! Pointer to the physical description of the path. */ + vg_lite_int8_t + path_changed; /*! Indicate whether path data is synced with command buffer (uploaded) or not. */ + vg_lite_int8_t pdata_internal; /*! Indicate whether path data memory is allocated by driver. */ + vg_lite_path_type_t path_type; /*! Refer to the definition by vg_lite_path_type_t. */ + vg_lite_stroke_t * stroke; /*! Pointer to a vg_lite_stroke_t structure.*/ + vg_lite_pointer stroke_path; /*! Pointer to the physical description of the stroke path. */ + vg_lite_uint32_t stroke_size; /*! Number of bytes in the stroke path data. */ + vg_lite_color_t stroke_color; /*! The stroke path fill color. */ + vg_lite_int8_t add_end; /*! Flag that add end_path in driver. */ + vg_lite_int8_t + stroke_valid; /*! Flag that judge whether current stroke data is come from current pathdata. */ +} vg_lite_path_t; + +/* Color ramp definition. */ +typedef struct vg_lite_color_ramp { + vg_lite_float_t stop; /*! Value for the color stop. */ + vg_lite_float_t red; /*! Red color channel value for the color stop. */ + vg_lite_float_t green; /*! Green color channel value for the color stop. */ + vg_lite_float_t blue; /*! Blue color channel value for the color stop. */ + vg_lite_float_t alpha; /*! Alpha color channel value for the color stop. */ +} vg_lite_color_ramp_t; + +/* Linear gradient parameter */ +typedef struct vg_lite_linear_gradient_parameter { + vg_lite_float_t X0; + vg_lite_float_t Y0; + vg_lite_float_t X1; + vg_lite_float_t Y1; +} vg_lite_linear_gradient_parameter_t; + +typedef struct vg_lite_radial_gradient_parameter { + vg_lite_float_t cx; /*! x coordinate of the center point. */ + vg_lite_float_t cy; /*! y coordinate of the center point. */ + vg_lite_float_t r; /*! radius. */ + vg_lite_float_t fx; /*! x coordinate of the focal point. */ + vg_lite_float_t fy; /*! y coordinate of the focal point. */ +} vg_lite_radial_gradient_parameter_t; + +/* Linear gradient definition. */ +typedef struct vg_lite_linear_gradient { + vg_lite_uint32_t colors[VLC_MAX_GRADIENT_STOPS]; /*! Colors for stops. */ + vg_lite_uint32_t count; /*! Count of colors, up to 16. */ + vg_lite_uint32_t stops[VLC_MAX_GRADIENT_STOPS]; /*! Color stops, value from 0 to 255. */ + vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ + vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ +} vg_lite_linear_gradient_t; + +/* Extended linear gradient definition. */ +typedef struct vg_lite_ext_linear_gradient { + vg_lite_uint32_t count; /*! Count of colors, up to 256. */ + vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ + vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ + vg_lite_linear_gradient_parameter_t linear_grad; /*! Include center point,focal point and radius.*/ + + vg_lite_uint32_t ramp_length; /*! Color ramp for gradient paints provided to driver. */ + vg_lite_color_ramp_t color_ramp[VLC_MAX_COLOR_RAMP_STOPS]; + + vg_lite_uint32_t converted_length; /*! Converted internal color ramp. */ + vg_lite_color_ramp_t converted_ramp[VLC_MAX_COLOR_RAMP_STOPS + 2]; + + vg_lite_uint8_t + pre_multiplied; /*! If color values of color_ramp[] are multiply by alpha value of color_ramp[]. */ + vg_lite_gradient_spreadmode_t + spread_mode; /*! The spread mode that applied to the pixels out of the image after transformed. */ +} vg_lite_ext_linear_gradient_t; + +/* Radial gradient definition. */ +typedef struct vg_lite_radial_gradient { + vg_lite_uint32_t count; /*! Count of colors, up to 256. */ + vg_lite_matrix_t matrix; /*! The matrix to transform the gradient. */ + vg_lite_buffer_t image; /*! The image for rendering as gradient pattern. */ + vg_lite_radial_gradient_parameter_t radial_grad; /*! Include center point,focal point and radius.*/ + + vg_lite_uint32_t ramp_length; /*! Color ramp for gradient paints provided to the driver. */ + vg_lite_color_ramp_t color_ramp[VLC_MAX_COLOR_RAMP_STOPS]; + + vg_lite_uint32_t converted_length; /*! Converted internal color ramp. */ + vg_lite_color_ramp_t converted_ramp[VLC_MAX_COLOR_RAMP_STOPS + 2]; + + vg_lite_uint8_t + pre_multiplied; /*! If color values of color_ramp[] are multiply by alpha value of color_ramp[]. */ + vg_lite_gradient_spreadmode_t + spread_mode; /*! The spread mode that applied to the pixels out of the image after transformed. */ +} vg_lite_radial_gradient_t; + +/* Colorkey definition */ +typedef struct vg_lite_color_key { + vg_lite_uint8_t enable; /*! The color key is effective only when "enable" is ture, */ + vg_lite_uint8_t low_r; /*! The R chanel of low_rgb. */ + vg_lite_uint8_t low_g; /*! The G chanel of low_rgb. */ + vg_lite_uint8_t low_b; /*! The B chanel of low_rgb. */ + vg_lite_uint8_t alpha; /*! The alpha channel to replace destination pixel alpha channel.*/ + vg_lite_uint8_t high_r; /*! The R chanel of high_rgb. */ + vg_lite_uint8_t high_g; /*! The G chanel of high_rgb. */ + vg_lite_uint8_t high_b; /*! The B chanel of high_rgb. */ +} vg_lite_color_key_t; + +/* Four colorkey definition. + * rgb_hi_0, rgb_lo_0, alpha_0, enable_0; + * rgb_hi_1, rgb_lo_1, alpha_1, enable_1; + * rgb_hi_2, rgb_lo_2, alpha_2, enable_2; + * rgb_hi_3, rgb_lo_3, alpha_3, enable_3; + * Priority order: color_key_0 > color_key_1 > color_key_2 > color_key_3. +*/ +typedef vg_lite_color_key_t vg_lite_color_key4_t[4]; + +/* Pixel matrix values */ +typedef vg_lite_float_t vg_lite_pixel_matrix_t[20]; + +/* HW pixel channel enable flags */ +typedef struct vg_lite_pixel_channel_enable { + vg_lite_uint8_t enable_a; /*! Enable A channel.*/ + vg_lite_uint8_t enable_b; /*! Enable B channel. */ + vg_lite_uint8_t enable_g; /*! Enable G channel. */ + vg_lite_uint8_t enable_r; /*! Enable R channel. */ +} vg_lite_pixel_channel_enable_t; + +/* Pixel color transform */ +typedef struct vg_lite_color_transform { + vg_lite_float_t a_scale; + vg_lite_float_t a_bias; + vg_lite_float_t r_scale; + vg_lite_float_t r_bias; + vg_lite_float_t g_scale; + vg_lite_float_t g_bias; + vg_lite_float_t b_scale; + vg_lite_float_t b_bias; +} vg_lite_color_transform_t; + +/* VGLite API Functions *******************************************************************************************************************/ + +/* Initialize a vglite context. */ +vg_lite_error_t vg_lite_init(vg_lite_uint32_t tess_width, vg_lite_uint32_t tess_height); + +/* Destroy a vglite context. */ +vg_lite_error_t vg_lite_close(void); + +/* Get the VGLite driver information. */ +vg_lite_error_t vg_lite_get_info(vg_lite_info_t * info); + +/* Get the GPU chip information. */ +vg_lite_uint32_t vg_lite_get_product_info(vg_lite_char * name, vg_lite_uint32_t * chip_id, vg_lite_uint32_t * chip_rev); + +/* Query if a specific feature is supported. */ +vg_lite_uint32_t vg_lite_query_feature(vg_lite_feature_t feature); + +/* Flush command buffer and wait for GPU to complete. */ +vg_lite_error_t vg_lite_finish(void); + +/* Flush the command buffer without waiting for GPU to complete. */ +vg_lite_error_t vg_lite_flush(void); + +/* Get the value of register from register's address. */ +vg_lite_error_t vg_lite_get_register(vg_lite_uint32_t address, vg_lite_uint32_t * result); + +/* Generate a 3x3 homogenous matrix to transform 4 source coordinates to 4 target coordinates. */ +vg_lite_error_t vg_lite_get_transform_matrix(vg_lite_float_point4_t src, vg_lite_float_point4_t dst, + vg_lite_matrix_t * mat); + +/* Allocate a buffer from GPU hardware accessible memory. */ +vg_lite_error_t vg_lite_allocate(vg_lite_buffer_t * buffer); + +/* Free a buffer allocated by vg_lite_allocate() */ +vg_lite_error_t vg_lite_free(vg_lite_buffer_t * buffer); + +/* Upload RGB or YUV pixel data to an allocated buffer. */ +vg_lite_error_t vg_lite_upload_buffer(vg_lite_buffer_t * buffer, vg_lite_uint8_t * data[3], vg_lite_uint32_t stride[3]); + +/* Map a buffer into hardware accessible address space. */ +vg_lite_error_t vg_lite_map(vg_lite_buffer_t * buffer, vg_lite_map_flag_t flag, int32_t fd); + +/* Unmap a buffer that is mapped */ +vg_lite_error_t vg_lite_unmap(vg_lite_buffer_t * buffer); + +/* flush cache */ +vg_lite_error_t vg_lite_flush_mapped_buffer(vg_lite_buffer_t * buffer); + +/* Fill a buffer rectangle area with a specified color. */ +vg_lite_error_t vg_lite_clear(vg_lite_buffer_t * target, vg_lite_rectangle_t * rect, vg_lite_color_t color); + +/* Copy a source image to target buffer with transformation, blending, color mixing, and filtering. */ +vg_lite_error_t vg_lite_blit(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter); + +/* Copy a rectangle area of source image to target buffer with transformation, blending, color mixing, and filtering. */ +vg_lite_error_t vg_lite_blit_rect(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_rectangle_t * rect, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color, + vg_lite_filter_t filter); + +/* Copy two source images to the target buffer with transformation, blending, and filtering. */ +vg_lite_error_t vg_lite_blit2(vg_lite_buffer_t * target, + vg_lite_buffer_t * source0, + vg_lite_buffer_t * source1, + vg_lite_matrix_t * matrix0, + vg_lite_matrix_t * matrix1, + vg_lite_blend_t blend, + vg_lite_filter_t filter); + +/* Copy a rectangle area of source image to target buffer without transformation, blending, color mixing, and filtering. */ +vg_lite_error_t vg_lite_copy_image(vg_lite_buffer_t * target, + vg_lite_buffer_t * source, + vg_lite_int32_t sx, + vg_lite_int32_t sy, + vg_lite_int32_t dx, + vg_lite_int32_t dy, + vg_lite_uint32_t width, + vg_lite_uint32_t height); + +/* Draw a path to a target buffer with transformation, color, and blending */ +vg_lite_error_t vg_lite_draw(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_blend_t blend, + vg_lite_color_t color); + +/* Set stroke path attributes. */ +vg_lite_error_t vg_lite_set_stroke(vg_lite_path_t * path, + vg_lite_cap_style_t cap_style, + vg_lite_join_style_t join_style, + vg_lite_float_t line_width, + vg_lite_float_t miter_limit, + vg_lite_float_t * dash_pattern, + vg_lite_uint32_t pattern_count, + vg_lite_float_t dash_phase, + vg_lite_color_t color); + +/* Update stroke path. */ +vg_lite_error_t vg_lite_update_stroke(vg_lite_path_t * path); + +/* Set path type. */ +vg_lite_error_t vg_lite_set_path_type(vg_lite_path_t * path, vg_lite_path_type_t path_type); + +/* Clears all attributes of a path. */ +vg_lite_error_t vg_lite_clear_path(vg_lite_path_t * path); + +/* Upload a path to GPU memory so GPU can access it directly. */ +vg_lite_error_t vg_lite_upload_path(vg_lite_path_t * path); + +/* Initialize a path object with attributes. */ +vg_lite_error_t vg_lite_init_path(vg_lite_path_t * path, + vg_lite_format_t format, + vg_lite_quality_t quality, + vg_lite_uint32_t length, + vg_lite_pointer data, + vg_lite_float_t min_x, + vg_lite_float_t min_y, + vg_lite_float_t max_x, + vg_lite_float_t max_y); + +/* Initializes a arc path with attributes. */ +vg_lite_error_t vg_lite_init_arc_path(vg_lite_path_t * path, + vg_lite_format_t format, + vg_lite_quality_t quality, + vg_lite_uint32_t length, + vg_lite_pointer data, + vg_lite_float_t min_x, + vg_lite_float_t min_y, + vg_lite_float_t max_x, + vg_lite_float_t max_y); + +/* Return the size (in bytes) of command buffer for a path opcode array. */ +vg_lite_uint32_t vg_lite_get_path_length(vg_lite_uint8_t * opcode, + vg_lite_uint32_t count, + vg_lite_format_t format); + +/* Generate command buffer for the (path) based on input opcodes (opcode) and coordinates (data). */ +vg_lite_error_t vg_lite_append_path(vg_lite_path_t * path, + vg_lite_uint8_t * opcode, + vg_lite_pointer data, + vg_lite_uint32_t seg_count); + +/* Set CLUT (Color Look Up Table) for index image. The (colors) is in ARGB format. */ +vg_lite_error_t vg_lite_set_CLUT(vg_lite_uint32_t count, vg_lite_uint32_t * colors); + +/* Draw a path that is filled by a transformed image pattern. */ +vg_lite_error_t vg_lite_draw_pattern(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_buffer_t * pattern_image, + vg_lite_matrix_t * pattern_matrix, + vg_lite_blend_t blend, + vg_lite_pattern_mode_t pattern_mode, + vg_lite_color_t pattern_color, + vg_lite_color_t color, + vg_lite_filter_t filter); + +/* Initialize a linear gradient object with default attributes. */ +vg_lite_error_t vg_lite_init_grad(vg_lite_linear_gradient_t * grad); + +/* Reset a linear gradient object attributes. */ +vg_lite_error_t vg_lite_clear_grad(vg_lite_linear_gradient_t * grad); + +/* Update a linear gradient object. */ +vg_lite_error_t vg_lite_update_grad(vg_lite_linear_gradient_t * grad); + +/* Return pointer to a linear gradient object's matrix. */ +vg_lite_matrix_t * vg_lite_get_grad_matrix(vg_lite_linear_gradient_t * grad); + +/* Set attributes for a linear gradient object. */ +vg_lite_error_t vg_lite_set_grad(vg_lite_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_uint32_t * colors, + vg_lite_uint32_t * stops); + +/* Draw a path with a linear gradient object pattern. */ +vg_lite_error_t vg_lite_draw_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * matrix, + vg_lite_linear_gradient_t * grad, + vg_lite_blend_t blend); + +/* Reset an extended linear gradient object attributes and free image buffer. */ +vg_lite_error_t vg_lite_clear_linear_grad(vg_lite_ext_linear_gradient_t * grad); + +/* Update an extended linear gradient object. */ +vg_lite_error_t vg_lite_update_linear_grad(vg_lite_ext_linear_gradient_t * grad); + +/* Return pointer to an extended linear gradient object's matrix. */ +vg_lite_matrix_t * vg_lite_get_linear_grad_matrix(vg_lite_ext_linear_gradient_t * grad); + +/* Set attributes for an extended linear gradient object. */ +vg_lite_error_t vg_lite_set_linear_grad(vg_lite_ext_linear_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_linear_gradient_parameter_t grad_param, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_mult); + +/* Draw a path with an extended linear gradient object. */ +vg_lite_error_t vg_lite_draw_linear_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_ext_linear_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter); + +/* Reset a radial gradient object attributes and free image buffer. */ +vg_lite_error_t vg_lite_clear_radial_grad(vg_lite_radial_gradient_t * grad); + +/* Update a radial gradient object. */ +vg_lite_error_t vg_lite_update_radial_grad(vg_lite_radial_gradient_t * grad); + +/* Return pointer to a radial gradient object's matrix. */ +vg_lite_matrix_t * vg_lite_get_radial_grad_matrix(vg_lite_radial_gradient_t * grad); + +/* Set attributes for a radial gradient object. */ +vg_lite_error_t vg_lite_set_radial_grad(vg_lite_radial_gradient_t * grad, + vg_lite_uint32_t count, + vg_lite_color_ramp_t * color_ramp, + vg_lite_radial_gradient_parameter_t grad_param, + vg_lite_gradient_spreadmode_t spread_mode, + vg_lite_uint8_t pre_mult); + +/* Draw a path with a radial gradient object pattern. */ +vg_lite_error_t vg_lite_draw_radial_grad(vg_lite_buffer_t * target, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_matrix_t * path_matrix, + vg_lite_radial_gradient_t * grad, + vg_lite_color_t paint_color, + vg_lite_blend_t blend, + vg_lite_filter_t filter); + +/* Load an identity matrix. */ +vg_lite_error_t vg_lite_identity(vg_lite_matrix_t * matrix); + +/* Translate a matrix. */ +vg_lite_error_t vg_lite_translate(vg_lite_float_t x, vg_lite_float_t y, vg_lite_matrix_t * matrix); + +/* Scale a matrix. */ +vg_lite_error_t vg_lite_scale(vg_lite_float_t scale_x, vg_lite_float_t scale_y, vg_lite_matrix_t * matrix); + +/* Rotate a matrix. */ +vg_lite_error_t vg_lite_rotate(vg_lite_float_t degrees, vg_lite_matrix_t * matrix); + +/* Set and enable a scissor rectangle for render target. */ +vg_lite_error_t vg_lite_set_scissor(vg_lite_int32_t x, vg_lite_int32_t y, vg_lite_int32_t right, + vg_lite_int32_t bottom); + +/* Set scissor rectangles on mask layer. Scissor rects are enabled/disabled by following APIs. */ +vg_lite_error_t vg_lite_scissor_rects(vg_lite_buffer_t * target, vg_lite_uint32_t nums, vg_lite_rectangle_t rect[]); + +/* Enable scissor rects defined on mask layer. */ +vg_lite_error_t vg_lite_enable_scissor(void); + +/* Disable scissor rects defined on mask layer. */ +vg_lite_error_t vg_lite_disable_scissor(void); + +/* Query size of available contiguous video memory. */ +vg_lite_error_t vg_lite_get_mem_size(vg_lite_uint32_t * size); + +/* Set global alpha value for source image */ +vg_lite_error_t vg_lite_source_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value); + +/* Set global alpha value for destination image. */ +vg_lite_error_t vg_lite_dest_global_alpha(vg_lite_global_alpha_t alpha_mode, vg_lite_uint8_t alpha_value); + +/* Set colorkey. */ +vg_lite_error_t vg_lite_set_color_key(vg_lite_color_key4_t colorkey); + +/* Enable dither function. Dither is OFF by default. */ +vg_lite_error_t vg_lite_enable_dither(void); + +/* Disable dither function. Dither is OFF by default. */ +vg_lite_error_t vg_lite_disable_dither(void); + +/* Set a 64-byte aligned memory buffer (physical) as VGLite tessellation buffer. */ +vg_lite_error_t vg_lite_set_tess_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size); + +/* Can be called before vg_lite_init() to overwrite the default VG_LITE_COMMAND_BUFFER_SIZE */ +vg_lite_error_t vg_lite_set_command_buffer_size(vg_lite_uint32_t size); + +/* Set a user-defined external memory buffer (physical, 64-byte aligned) as VGLite command buffer. + It should be called after vg_lite_init(). */ +vg_lite_error_t vg_lite_set_command_buffer(vg_lite_uint32_t physical, vg_lite_uint32_t size); + +/* Setup a pixel transform matrix m[20] which transforms each pixel as following: + * + * |a'| |m0 m1 m2 m3 m4 | |a| + * |r'| |m5 m6 m7 m8 m9 | |r| + * |g'| = |m10 m11 m12 m13 m14|.|g| + * |b'| |m15 m16 m17 m18 m19| |b| + * |1 | |0 0 0 0 1 | |1| + * + * The pixel transform for A, R, G, B channel can be enabled/disabled individually with (channel) parameter. + */ +vg_lite_error_t vg_lite_set_pixel_matrix(vg_lite_pixel_matrix_t matrix, vg_lite_pixel_channel_enable_t * channel); + +/* Setup 3x3 gaussian blur weight values to filter image pixels. + * + * Paramters w0, w1, w2 define a 3x3 gaussian blur weight matrix as below + * + * | w2 w1 w2 | + * | w1 w0 w1 | + * | w2 w1 w2 | + * + * The sum of 9 kernel weights must be 1.0 to avoid convolution overflow ( w0 + 4*w1 + 4*w2 = 1.0 ). + * The 3x3 weight matrix applies to a 3x3 pixel block + * + * | pixel[i-1][j-1] pixel[i][j-1] pixel[i+1][j-1]| + * | pixel[i-1][j] pixel[i][j] pixel[i+1][j] | + * | pixel[i-1][j+1] pixel[i][j+1] pixel[i+1][j+1]| + * + * With the following dot product equation: + * + * color[i][j] = w2*pixel[i-1][j-1] + w1*pixel[i][j-1] + w2*pixel[i+1][j-1] + * + w1*pixel[i-1][j] + w0*pixel[i][j] + w1*pixel[i+1][j] + * + w2*pixel[i-1][j+1] + w1*pixel[i][j+1] + w2*pixel[i+1][j+1]; + */ +vg_lite_error_t vg_lite_gaussian_filter(vg_lite_float_t w0, vg_lite_float_t w1, vg_lite_float_t w2); + +/* Enable masklayer function. Masklayer is OFF by default. */ +vg_lite_error_t vg_lite_enable_masklayer(void); + +/* Disable masklayer function. Masklayer is OFF by default. */ +vg_lite_error_t vg_lite_disable_masklayer(void); + +/* Setup a masklayer. */ +vg_lite_error_t vg_lite_set_masklayer(vg_lite_buffer_t * masklayer); + +/* Free a masklayer and disable mask operation. */ +vg_lite_error_t vg_lite_destroy_masklayer(vg_lite_buffer_t * masklayer); + +/* Create a masklayer with default format A8 and default pixel value 255. */ +vg_lite_error_t vg_lite_create_masklayer(vg_lite_buffer_t * masklayer, + vg_lite_uint32_t width, + vg_lite_uint32_t height); + +/* Set pixel values for a rectangle area in a masklayer */ +vg_lite_error_t vg_lite_fill_masklayer(vg_lite_buffer_t * masklayer, + vg_lite_rectangle_t * rect, + vg_lite_uint8_t value); + +/* Blend a rectangle area of src masklayer with dst masklayer according to (operation). */ +vg_lite_error_t vg_lite_blend_masklayer(vg_lite_buffer_t * dst, + vg_lite_buffer_t * src, + vg_lite_mask_operation_t operation, + vg_lite_rectangle_t * rect); + +/* Render a (path) with (fill_rule), (color), (matrix) to the masklayer. */ +vg_lite_error_t vg_lite_render_masklayer(vg_lite_buffer_t * masklayer, + vg_lite_mask_operation_t operation, + vg_lite_path_t * path, + vg_lite_fill_t fill_rule, + vg_lite_color_t color, + vg_lite_matrix_t * matrix); + +/* Set mirror orientation. */ +vg_lite_error_t vg_lite_set_mirror(vg_lite_orientation_t orientation); + +/* Set gamma value. */ +vg_lite_error_t vg_lite_set_gamma(vg_lite_gamma_conversion_t gamma_value); + +/* Enable color transformation, which is OFF by default. */ +vg_lite_error_t vg_lite_enable_color_transform(void); + +/* Disable color transformation, which is OFF by default. */ +vg_lite_error_t vg_lite_disable_color_transform(void); + +/* Set pixel color transformation scale and bias values for each pixel channel. */ +vg_lite_error_t vg_lite_set_color_transform(vg_lite_color_transform_t * values); + +/* Set flexa stream id. */ +vg_lite_error_t vg_lite_flexa_set_stream(vg_lite_uint8_t stream_id); + +/* set flexa background buffer.*/ +vg_lite_error_t vg_lite_flexa_bg_buffer(vg_lite_uint8_t stream_id, + vg_lite_buffer_t * buffer, + vg_lite_uint32_t seg_count, + vg_lite_uint32_t seg_size); + +/* Enable flexa. */ +vg_lite_error_t vg_lite_flexa_enable(void); + +/* Disable flexa.*/ +vg_lite_error_t vg_lite_flexa_disable(void); + +/* Set flexa stop flag after the last frame. */ +vg_lite_error_t vg_lite_flexa_stop_frame(void); + +/* Dump command buffer */ +vg_lite_error_t vg_lite_dump_command_buffer(void); + +/* Dump vg_lite_buffer_t image to a png file. Support on Linux for now. */ +vg_lite_error_t vg_lite_dump_png(const char * filename, vg_lite_buffer_t * buffer); + +/* Return VGLite parameters in params[] array */ +vg_lite_error_t vg_lite_get_parameter(vg_lite_param_type_t type, + vg_lite_int32_t count, + vg_lite_pointer params); + +/* Set memory pool for different buffer allocations. By default all memory buffers are allocated from VG_LITE_MEMORY_POOL_1. + * This API must be called before vg_lite_init() for setting VG_LITE_COMMAND_BUFFER or VG_LITE_TESSELLATION_BUFFER memory pools. + * This API can be called anytime for VG_LITE_RENDER_BUFFER to affect the following vg_lite_allocate() calls. + */ +vg_lite_error_t vg_lite_set_memory_pool(vg_lite_buffer_type_t type, vg_lite_memory_pool_t pool); + +/* Set an end flag for GPU to signal its completion of current frame. + * This API can be called at the end of a frame, and a vg_lite_finish() is contained withen the API. + * An interrupt will be received to indicate that GPU is idle. + */ +vg_lite_error_t vg_lite_frame_delimiter(vg_lite_frame_flag_t flag); + +#endif /* VGLITE_VERSION_3_0 */ + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#ifdef __cplusplus +} +#endif + +#endif /* VG_LITE_H */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/lv_vg_lite_hal/lv_vg_lite_hal.c b/inc/lvgl/src/libs/vg_lite_driver/lv_vg_lite_hal/lv_vg_lite_hal.c new file mode 100644 index 0000000..c9e81cd --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/lv_vg_lite_hal/lv_vg_lite_hal.c @@ -0,0 +1,606 @@ + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "../../../osal/lv_os_private.h" +#include "../../../stdlib/lv_mem.h" + +#if LV_USE_OS == LV_OS_NONE + #error "VGLite hal needs support from an OS, please select one of the supported by LVGL!" +#endif + +#include "vg_lite_platform.h" +#include "../VGLiteKernel/vg_lite_kernel.h" +#include "../VGLiteKernel/vg_lite_hal.h" +#include "../VGLiteKernel/vg_lite_hw.h" + +#include + +static void sleep(uint32_t msec) +{ + lv_sleep_ms(msec); +} + +static uint32_t registerMemBase = LV_VG_LITE_HAL_GPU_BASE_ADDRESS; + +/* If bit31 is activated this indicates a bus error */ +#define IS_AXI_BUS_ERR(x) ((x)&(1U << 31)) +#define HEAP_NODE_USED 0xABBAF00D + +volatile void * contiguousMem[VG_SYSTEM_RESERVE_COUNT] = { + [0 ... VG_SYSTEM_RESERVE_COUNT - 1] = NULL +}; + +uint32_t gpuMemBase[VG_SYSTEM_RESERVE_COUNT] = { + [0 ... VG_SYSTEM_RESERVE_COUNT - 1] = 0 +}; + +/* Default heap size is 16MB. */ +static uint32_t heap_size[VG_SYSTEM_RESERVE_COUNT] = { + [0 ... VG_SYSTEM_RESERVE_COUNT - 1] = MAX_CONTIGUOUS_SIZE +}; + +void __attribute__((weak)) vg_lite_bus_error_handler(); + +void vg_lite_init_mem(vg_module_parameters_t * param) +{ + uint32_t i; + + registerMemBase = param->register_mem_base; + + for(i = 0; i < VG_SYSTEM_RESERVE_COUNT; i++) { + gpuMemBase[i] = param->gpu_mem_base[i]; + contiguousMem[i] = param->contiguous_mem_base[i]; + heap_size[i] = param->contiguous_mem_size[i]; + } +} + +/* Implementation of list. ****************************************/ +#define INIT_LIST_HEAD(entry) \ + (entry)->next = (entry);\ + (entry)->prev = (entry); + +/* Add the list item in front of "head". */ +static inline void add_list(list_head_t * to_add, list_head_t * head) +{ + /* Link the new item. */ + to_add->next = head; + to_add->prev = head->prev; + + /* Modify the neighbor. */ + head->prev = to_add; + if(to_add->prev != NULL) { + to_add->prev->next = to_add; + } +} + +/* Remove an entry out of the list. */ +static inline void delete_list(list_head_t * entry) +{ + if(entry->prev != NULL) { + entry->prev->next = entry->next; + } + if(entry->next != NULL) { + entry->next->prev = entry->prev; + } +} + +/* End of list implementation. ***********/ +static inline void _memset(void * mem, unsigned char value, int size) +{ + int i; + for(i = 0; i < size; i++) { + ((unsigned char *)mem)[i] = value; + } +} + +struct memory_heap { + uint32_t free; + list_head_t list; +}; + +struct mapped_memory { + void * logical; + uint32_t physical; + int page_count; + struct page ** pages; +}; + +struct vg_lite_device { + /* void * gpu; */ + uint32_t register_base; /* Always use physical for register access in RTOS. */ + /* struct page * pages; */ + volatile void * contiguous[VG_SYSTEM_RESERVE_COUNT]; + unsigned int order; + unsigned int heap_size[VG_SYSTEM_RESERVE_COUNT]; + void * virtual[VG_SYSTEM_RESERVE_COUNT]; + uint32_t physical[VG_SYSTEM_RESERVE_COUNT]; + uint32_t size[VG_SYSTEM_RESERVE_COUNT]; + struct memory_heap heap[VG_SYSTEM_RESERVE_COUNT]; + int irq_enabled; + volatile uint32_t int_flags; + /* wait_queue_head_t int_queue; */ + lv_thread_sync_t int_queue; + void * device; + int registered; + int major; + struct class * class; + int created; + vg_lite_gpu_execute_state_t gpu_execute_state; +}; + +struct client_data { + struct vg_lite_device * device; + struct vm_area_struct * vm; + void * contiguous_mapped; +}; + +static struct vg_lite_device * device; + +void vg_lite_set_gpu_execute_state(vg_lite_gpu_execute_state_t state) +{ + device->gpu_execute_state = state; +} + +vg_lite_error_t vg_lite_hal_allocate(unsigned long size, void ** memory) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + /* TODO: Allocate some memory. No more kernel mode in RTOS. */ + *memory = lv_malloc(size); + if(NULL == *memory) + error = VG_LITE_OUT_OF_MEMORY; + + return error; +} + +vg_lite_error_t vg_lite_hal_free(void * memory) +{ + vg_lite_error_t error = VG_LITE_SUCCESS; + + lv_free(memory); + + return error; +} + +void vg_lite_hal_delay(uint32_t ms) +{ + sleep(ms); +} + +void vg_lite_hal_barrier(void) +{ + __asm("DSB"); +} + +static int vg_lite_init(void); +void vg_lite_hal_initialize(void) +{ + vg_lite_init(); +} + +void vg_lite_hal_deinitialize(void) +{ + lv_thread_sync_delete(&device->int_queue); +} + +static int split_node(heap_node_t * node, unsigned long size) +{ + heap_node_t * split; + + /* Allocate a new node. */ + vg_lite_hal_allocate(sizeof(heap_node_t), (void **)&split); + if(split == NULL) + return -1; + + /* Fill in the data of this node of the remaning size. */ + split->offset = node->offset + size; + split->size = node->size - size; + split->status = 0; + + /* Add the new node behind the current node. */ + add_list(&split->list, &node->list); + + /* Adjust the size of the current node. */ + node->size = size; + return 0; +} + +void vg_lite_hal_print(char * format, ...) +{ + static char buffer[128]; + va_list args; + va_start(args, format); + + vsnprintf(buffer, sizeof(buffer) - 1, format, args); + buffer[sizeof(buffer) - 1] = 0; + printf(buffer); + + va_end(args); +} + +void vg_lite_hal_trace(char * format, ...) +{ + static char buffer[128]; + va_list args; + va_start(args, format); + + vsnprintf(buffer, sizeof(buffer) - 1, format, args); + buffer[sizeof(buffer) - 1] = 0; + printf(buffer); + + va_end(args); +} + +const char * vg_lite_hal_Status2Name(vg_lite_error_t status) +{ + switch(status) { + case VG_LITE_SUCCESS: + return "VG_LITE_SUCCESS"; + case VG_LITE_INVALID_ARGUMENT: + return "VG_LITE_INVALID_ARGUMENT"; + case VG_LITE_OUT_OF_MEMORY: + return "VG_LITE_OUT_OF_MEMORY"; + case VG_LITE_NO_CONTEXT: + return "VG_LITE_NO_CONTEXT"; + case VG_LITE_TIMEOUT: + return "VG_LITE_TIMEOUT"; + case VG_LITE_OUT_OF_RESOURCES: + return "VG_LITE_OUT_OF_RESOURCES"; + case VG_LITE_GENERIC_IO: + return "VG_LITE_GENERIC_IO"; + case VG_LITE_NOT_SUPPORT: + return "VG_LITE_NOT_SUPPORT"; + case VG_LITE_ALREADY_EXISTS: + return "VG_LITE_ALREADY_EXISTS"; + case VG_LITE_NOT_ALIGNED: + return "VG_LITE_NOT_ALIGNED"; + case VG_LITE_FLEXA_TIME_OUT: + return "VG_LITE_FLEXA_TIME_OUT"; + case VG_LITE_FLEXA_HANDSHAKE_FAIL: + return "VG_LITE_FLEXA_HANDSHAKE_FAIL"; + case VG_LITE_SYSTEM_CALL_FAIL: + return "VG_LITE_SYSTEM_CALL_FAIL"; + default: + return "nil"; + } +} + +vg_lite_error_t vg_lite_hal_allocate_contiguous(unsigned long size, vg_lite_vidmem_pool_t pool, void ** logical, + void ** klogical, uint32_t * physical, void ** node) +{ + unsigned long aligned_size; + heap_node_t * pos; + + /* Judge if it exceeds the range of pool */ + if(pool >= VG_SYSTEM_RESERVE_COUNT) + pool = VG_SYSTEM_RESERVE_COUNT - 1; + + /* Align the size to 64 bytes. */ + aligned_size = (size + 63) & ~63; + + /* Check if there is enough free memory available. */ + if(aligned_size > device->heap[pool].free) { + return VG_LITE_OUT_OF_MEMORY; + } + + /* Walk the heap backwards. */ + for(pos = (heap_node_t *)device->heap[pool].list.prev; + &pos->list != &device->heap[pool].list; + pos = (heap_node_t *) pos->list.prev) { + /* Check if the current node is free and is big enough. */ + if(pos->status == 0 && pos->size >= aligned_size) { + /* See if we the current node is big enough to split. */ + if(0 != split_node(pos, aligned_size)) { + return VG_LITE_OUT_OF_RESOURCES; + } + /* Mark the current node as used. */ + pos->status = 0xABBAF00D; + + /* Return the logical/physical address. */ + /* *logical = (uint8_t *) private_data->contiguous_mapped + pos->offset; */ + *logical = (uint8_t *)device->virtual[pool] + pos->offset; + *klogical = *logical; + *physical = gpuMemBase[pool] + (uint32_t)(*logical);/* device->physical + pos->offset; */ + + /* Mark which pool the pos belong to */ + pos->pool = pool; + + device->heap[pool].free -= aligned_size; + + *node = pos; + return VG_LITE_SUCCESS; + } + } + + /* Out of memory. */ + return VG_LITE_OUT_OF_MEMORY; +} + +void vg_lite_hal_free_contiguous(void * memory_handle) +{ + /* TODO: no list available in RTOS. */ + heap_node_t * pos, * node; + vg_lite_vidmem_pool_t pool; + + /* Get pointer to node. */ + node = memory_handle; + + if(node->status != 0xABBAF00D) { + return; + } + + /* Determine which pool the node belongs to */ + pool = node->pool; + + /* Mark node as free. */ + node->status = 0; + + /* Add node size to free count. */ + device->heap[pool].free += node->size; + + /* Check if next node is free. */ + pos = node; + for(pos = (heap_node_t *)pos->list.next; + &pos->list != &device->heap[pool].list; + pos = (heap_node_t *)pos->list.next) { + if(pos->status == 0) { + /* Merge the nodes. */ + node->size += pos->size; + if(node->offset > pos->offset) + node->offset = pos->offset; + /* Delete the next node from the list. */ + delete_list(&pos->list); + vg_lite_hal_free(pos); + } + break; + } + + /* Check if the previous node is free. */ + pos = node; + for(pos = (heap_node_t *)pos->list.prev; + &pos->list != &device->heap[pool].list; + pos = (heap_node_t *)pos->list.prev) { + if(pos->status == 0) { + /* Merge the nodes. */ + pos->size += node->size; + if(pos->offset > node->offset) + pos->offset = node->offset; + /* Delete the current node from the list. */ + delete_list(&node->list); + vg_lite_hal_free(node); + } + break; + } + + /* when release command buffer node and ts buffer node to exit,release the linked list*/ + /* if(device->heap[pool].list.next == device->heap[pool].list.prev) { + delete_list(&pos->list); + vg_lite_hal_free(pos); + }*/ +} + +void vg_lite_hal_free_os_heap(void) +{ + struct heap_node * pos, * n; + uint32_t i; + + /* Check for valid device. */ + if(device != NULL) { + /* Process each node. */ + for(i = 0; i < VG_SYSTEM_RESERVE_COUNT; i++) { + for(pos = (heap_node_t *)device->heap[i].list.next, + n = (heap_node_t *)pos->list.next; + &pos->list != &device->heap[i].list; + pos = n, n = (heap_node_t *)n->list.next) { + /* Remove it from the linked list. */ + delete_list(&pos->list); + /* Free up the memory. */ + vg_lite_hal_free(pos); + } + } + } +} + +/* Portable: read register value. */ +uint32_t vg_lite_hal_peek(uint32_t address) +{ + /* Read data from the GPU register. */ + return (uint32_t)(*(volatile uint32_t *)(device->register_base + address)); +} + +/* Portable: write register. */ +void vg_lite_hal_poke(uint32_t address, uint32_t data) +{ + /* Write data to the GPU register. */ + uint32_t * LocalAddr = (uint32_t *)(device->register_base + address); + *LocalAddr = data; +} + +vg_lite_error_t vg_lite_hal_query_mem(vg_lite_kernel_mem_t * mem) +{ + if(device != NULL) { + mem->bytes = device->heap[mem->pool].free; + return VG_LITE_SUCCESS; + } + mem->bytes = 0; + return VG_LITE_NO_CONTEXT; +} + +vg_lite_error_t vg_lite_hal_map_memory(vg_lite_kernel_map_memory_t * node) +{ + node->logical = (void *)node->physical; + return VG_LITE_SUCCESS; +} + +vg_lite_error_t vg_lite_hal_unmap_memory(vg_lite_kernel_unmap_memory_t * node) +{ + return VG_LITE_SUCCESS; +} + +void __attribute__((weak)) vg_lite_bus_error_handler() +{ + /* + * Default implementation of the bus error handler does nothing. Application + * should override this handler if it requires to be notified when a bus + * error event occurs. + */ + return; +} + +void vg_lite_IRQHandler(void) +{ + uint32_t flags = vg_lite_hal_peek(VG_LITE_INTR_STATUS); + + if(flags) { + /* Combine with current interrupt flags. */ + device->int_flags |= flags; + + /* Wake up any waiters. */ + lv_thread_sync_signal_isr(&device->int_queue); + +#if gcdVG_RECORD_HARDWARE_RUNNING_TIME + record_running_time(); +#endif + } +} + +int32_t vg_lite_hal_wait_interrupt(uint32_t timeout, uint32_t mask, uint32_t * value) +{ + if(lv_thread_sync_wait(&device->int_queue) == LV_RESULT_OK) { + if(value != NULL) { + *value = device->int_flags & mask; + } + device->int_flags = 0; + + if(IS_AXI_BUS_ERR(*value)) { + vg_lite_bus_error_handler(); + } + + return 1; + } + + return 0; +} + +vg_lite_error_t vg_lite_hal_memory_export(int32_t * fd) +{ + return VG_LITE_SUCCESS; +} + + +void * vg_lite_hal_map(uint32_t flags, uint32_t bytes, void * logical, uint32_t physical, int32_t dma_buf_fd, + uint32_t * gpu) +{ + (void) flags; + (void) bytes; + (void) logical; + (void) physical; + (void) dma_buf_fd; + (void) gpu; + return (void *)0; +} + +void vg_lite_hal_unmap(void * handle) +{ + + (void) handle; +} + +vg_lite_error_t vg_lite_hal_operation_cache(void * handle, vg_lite_cache_op_t cache_op) +{ + (void) handle; + (void) cache_op; + + return VG_LITE_SUCCESS; +} + +static void vg_lite_exit(void) +{ + heap_node_t * pos; + heap_node_t * n; + uint32_t i; + + /* Check for valid device. */ + if(device != NULL) { + /* TODO: unmap register mem should be unnecessary. */ + device->register_base = 0; + + for(i = 0; i < VG_SYSTEM_RESERVE_COUNT; i++) { + /* Process each node. */ + for(pos = (heap_node_t *)device->heap[i].list.next, n = (heap_node_t *)pos->list.next; + &pos->list != &device->heap[i].list; + pos = n, n = (heap_node_t *)n->list.next) { + /* Remove it from the linked list. */ + delete_list(&pos->list); + + /* Free up the memory. */ + vg_lite_hal_free(pos); + } + } + + /* Free up the device structure. */ + vg_lite_hal_free(device); + } +} + +static int vg_lite_init(void) +{ + heap_node_t * node; + uint32_t i; + + vg_lite_hal_allocate(sizeof(struct vg_lite_device), (void **)&device); + if(NULL == device) + return -1; + + /* Zero out the enture structure. */ + _memset(device, 0, sizeof(struct vg_lite_device)); + + /* Setup register memory. **********************************************/ + device->register_base = registerMemBase; + + + /* Initialize contiguous memory. ***************************************/ + /* Allocate the contiguous memory. */ + for(i = 0; i < VG_SYSTEM_RESERVE_COUNT; i++) { + device->heap_size[i] = heap_size[i]; + device->contiguous[i] = (volatile void *)contiguousMem[i]; + /* Make 64byte aligned. */ + while((((uint32_t)device->contiguous[i]) & 63) != 0) { + device->contiguous[i] = ((unsigned char *)device->contiguous[i]) + 4; + device->heap_size[i] -= 4; + } + + /* Check if we allocated any contiguous memory or not. */ + if(device->contiguous[i] == NULL) { + vg_lite_exit(); + return -1; + } + + device->virtual[i] = (void *)device->contiguous[i]; + device->physical[i] = gpuMemBase[i] + (uint32_t)device->virtual[i]; + device->size[i] = device->heap_size[i]; + + /* Create the heap. */ + INIT_LIST_HEAD(&device->heap[i].list); + device->heap[i].free = device->size[i]; + + vg_lite_hal_allocate(sizeof(heap_node_t), (void **)&node); + if(node == NULL) { + vg_lite_exit(); + return -1; + } + node->offset = 0; + node->size = device->size[i]; + node->status = 0; + add_list(&node->list, &device->heap[i].list); + } + + lv_thread_sync_init(&device->int_queue); + device->int_flags = 0; + + /* Success. */ + return 0; +} + +#endif /* LV_USE_VG_LITE_DRIVER */ diff --git a/inc/lvgl/src/libs/vg_lite_driver/lv_vg_lite_hal/vg_lite_os.c b/inc/lvgl/src/libs/vg_lite_driver/lv_vg_lite_hal/vg_lite_os.c new file mode 100755 index 0000000..d7950a6 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/lv_vg_lite_hal/vg_lite_os.c @@ -0,0 +1,16 @@ +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "../../../lvgl.h" + +void * vg_lite_os_malloc(uint32_t size) +{ + return lv_malloc(size); +} + +void vg_lite_os_free(void * memory) +{ + lv_free(memory); +} + +#endif diff --git a/inc/lvgl/src/libs/vg_lite_driver/lv_vg_lite_hal/vg_lite_platform.h b/inc/lvgl/src/libs/vg_lite_driver/lv_vg_lite_hal/vg_lite_platform.h new file mode 100644 index 0000000..41f0531 --- /dev/null +++ b/inc/lvgl/src/libs/vg_lite_driver/lv_vg_lite_hal/vg_lite_platform.h @@ -0,0 +1,52 @@ +#ifndef VG_LITE_PLATFORM_H +#define VG_LITE_PLATFORM_H + +#include "../../../lv_conf_internal.h" +#if LV_USE_VG_LITE_DRIVER + +#include "stdint.h" +#include "stdlib.h" +#include +#include "../VGLiteKernel/vg_lite_debug.h" +#include "../VGLiteKernel/vg_lite_type.h" +#include "../VGLiteKernel/vg_lite_option.h" + +#define VG_SYSTEM_RESERVE_COUNT 2 + +/* Implementation of list. ****************************************/ +typedef struct list_head { + struct list_head * next; + struct list_head * prev; +} list_head_t; + +typedef struct heap_node { + list_head_t list; + uint32_t offset; + unsigned long size; + int32_t status; + vg_lite_vidmem_pool_t pool; +} heap_node_t; + +typedef struct vg_module_parameters { + + uint32_t register_mem_base; + uint32_t gpu_mem_base[VG_SYSTEM_RESERVE_COUNT]; + + volatile void * contiguous_mem_base[VG_SYSTEM_RESERVE_COUNT]; + uint32_t contiguous_mem_size[VG_SYSTEM_RESERVE_COUNT]; +} +vg_module_parameters_t; + +/*! +@brief Initialize the hardware mem setting. +*/ +void vg_lite_init_mem(vg_module_parameters_t * param); + +/*! +@brief The hardware IRQ handler. +*/ +void vg_lite_IRQHandler(void); + +#endif /* LV_USE_VG_LITE_DRIVER */ + +#endif /* VG_LITE_PLATFORM_H */ \ No newline at end of file diff --git a/inc/lvgl/src/lv_api_map_v8.h b/inc/lvgl/src/lv_api_map_v8.h new file mode 100644 index 0000000..822450f --- /dev/null +++ b/inc/lvgl/src/lv_api_map_v8.h @@ -0,0 +1,328 @@ +/** + * @file lv_api_map_v8.h + * + */ + +#ifndef LV_API_MAP_V8_H +#define LV_API_MAP_V8_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +#define LV_DISP_ROTATION_0 LV_DISPLAY_ROTATION_0 +#define LV_DISP_ROTATION_90 LV_DISPLAY_ROTATION_90 +#define LV_DISP_ROTATION_180 LV_DISPLAY_ROTATION_180 +#define LV_DISP_ROTATION_270 LV_DISPLAY_ROTATION_270 + +#define LV_DISP_RENDER_MODE_PARTIAL LV_DISPLAY_RENDER_MODE_PARTIAL +#define LV_DISP_RENDER_MODE_DIRECT LV_DISPLAY_RENDER_MODE_DIRECT +#define LV_DISP_RENDER_MODE_FULL LV_DISPLAY_RENDER_MODE_FULL + +#if LV_USE_BUTTONMATRIX +#define LV_BTNMATRIX_BTN_NONE LV_BUTTONMATRIX_BUTTON_NONE + +#define LV_BTNMATRIX_CTRL_HIDDEN LV_BUTTONMATRIX_CTRL_HIDDEN +#define LV_BTNMATRIX_CTRL_NO_REPEAT LV_BUTTONMATRIX_CTRL_NO_REPEAT +#define LV_BTNMATRIX_CTRL_DISABLED LV_BUTTONMATRIX_CTRL_DISABLED +#define LV_BTNMATRIX_CTRL_CHECKABLE LV_BUTTONMATRIX_CTRL_CHECKABLE +#define LV_BTNMATRIX_CTRL_CHECKED LV_BUTTONMATRIX_CTRL_CHECKED +#define LV_BTNMATRIX_CTRL_CLICK_TRIG LV_BUTTONMATRIX_CTRL_CLICK_TRIG +#define LV_BTNMATRIX_CTRL_POPOVER LV_BUTTONMATRIX_CTRL_POPOVER +#define LV_BTNMATRIX_CTRL_CUSTOM_1 LV_BUTTONMATRIX_CTRL_CUSTOM_1 +#define LV_BTNMATRIX_CTRL_CUSTOM_2 LV_BUTTONMATRIX_CTRL_CUSTOM_2 +#endif /* LV_USE_BUTTONMATRIX */ + +/********************** + * TYPEDEFS + **********************/ +typedef int32_t lv_coord_t; +typedef lv_result_t lv_res_t; +typedef lv_image_dsc_t lv_img_dsc_t; +typedef lv_display_t lv_disp_t; +typedef lv_display_rotation_t lv_disp_rotation_t; +typedef lv_display_render_mode_t lv_disp_render_t; +typedef lv_anim_completed_cb_t lv_anim_ready_cb_t; +typedef lv_screen_load_anim_t lv_scr_load_anim_t; + +#if LV_USE_BUTTONMATRIX +typedef lv_buttonmatrix_ctrl_t lv_btnmatrix_ctrl_t; +#endif /* LV_USE_BUTTONMATRIX */ + +#if LV_USE_IMAGEBUTTON +#define LV_IMGBTN_STATE_RELEASED LV_IMAGEBUTTON_STATE_RELEASED +#define LV_IMGBTN_STATE_PRESSED LV_IMAGEBUTTON_STATE_PRESSED +#define LV_IMGBTN_STATE_DISABLED LV_IMAGEBUTTON_STATE_DISABLED +#define LV_IMGBTN_STATE_CHECKED_RELEASED LV_IMAGEBUTTON_STATE_CHECKED_RELEASED +#define LV_IMGBTN_STATE_CHECKED_PRESSED LV_IMAGEBUTTON_STATE_CHECKED_PRESSED +#define LV_IMGBTN_STATE_CHECKED_DISABLED LV_IMAGEBUTTON_STATE_CHECKED_DISABLED +#endif /* LV_USE_IMAGEBUTTON */ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_task_handler(void) +{ + return lv_timer_handler(); +} + +/** + * Move the object to the foreground. + * It will look like if it was created as the last child of its parent. + * It also means it can cover any of the siblings. + * @param obj pointer to an object + */ +static inline void lv_obj_move_foreground(lv_obj_t * obj) +{ + lv_obj_t * parent = lv_obj_get_parent(obj); + if(!parent) { + LV_LOG_WARN("parent is NULL"); + return; + } + + lv_obj_move_to_index(obj, lv_obj_get_child_count(parent) - 1); +} + +/** + * Move the object to the background. + * It will look like if it was created as the first child of its parent. + * It also means any of the siblings can cover the object. + * @param obj pointer to an object + */ +static inline void lv_obj_move_background(lv_obj_t * obj) +{ + lv_obj_move_to_index(obj, 0); +} + +/********************** + * MACROS + **********************/ +#define LV_RES_OK LV_RESULT_OK +#define LV_RES_INV LV_RESULT_INVALID + +#define LV_INDEV_STATE_PR LV_INDEV_STATE_PRESSED +#define LV_INDEV_STATE_REL LV_INDEV_STATE_RELEASED + +#define lv_obj_del lv_obj_delete +#define lv_obj_del_async lv_obj_delete_async +#define lv_obj_clear_flag lv_obj_remove_flag +#define lv_obj_clear_state lv_obj_remove_state + +#define lv_indev_set_disp lv_indev_set_display +#define lv_indev_get_act lv_indev_active +#define lv_scr_act lv_screen_active +#define lv_disp_remove lv_display_delete +#define lv_disp_set_default lv_display_set_default +#define lv_disp_get_default lv_display_get_default +#define lv_disp_get_next lv_display_get_next +#define lv_disp_set_rotation lv_display_set_rotation +#define lv_disp_get_hor_res lv_display_get_horizontal_resolution +#define lv_disp_get_ver_res lv_display_get_vertical_resolution +#define lv_disp_get_physical_hor_res lv_display_get_physical_horizontal_resolution +#define lv_disp_get_physical_ver_res lv_display_get_physical_vertical_resolution +#define lv_disp_get_offset_x lv_display_get_offset_x +#define lv_disp_get_offset_y lv_display_get_offset_y +#define lv_disp_get_rotation lv_display_get_rotation +#define lv_disp_get_dpi lv_display_get_dpi +#define lv_disp_get_antialiasing lv_display_get_antialiasing +#define lv_disp_flush_ready lv_display_flush_ready +#define lv_disp_flush_is_last lv_display_flush_is_last +#define lv_disp_get_scr_act lv_display_get_screen_active +#define lv_disp_get_scr_prev lv_display_get_screen_prev +#define lv_disp_load_scr lv_screen_load +#define lv_scr_load lv_screen_load +#define lv_scr_load_anim lv_screen_load_anim +#define lv_disp_get_layer_top lv_display_get_layer_top +#define lv_disp_get_layer_sys lv_display_get_layer_sys +#define lv_disp_send_event lv_display_send_event +#define lv_disp_set_theme lv_display_set_theme +#define lv_disp_get_theme lv_display_get_theme +#define lv_disp_get_inactive_time lv_display_get_inactive_time +#define lv_disp_trig_activity lv_display_trigger_activity +#define lv_disp_enable_invalidation lv_display_enable_invalidation +#define lv_disp_is_invalidation_enabled lv_display_is_invalidation_enabled +#define lv_disp_refr_timer lv_display_refr_timer +#define lv_disp_get_refr_timer lv_display_get_refr_timer + +#define lv_timer_del lv_timer_delete + +#define lv_anim_del lv_anim_delete +#define lv_anim_del_all lv_anim_delete_all +#define lv_anim_set_ready_cb lv_anim_set_completed_cb + +#define lv_group_del lv_group_delete + +#if LV_USE_TEXTAREA +#define lv_txt_get_size lv_text_get_size +#define lv_txt_get_width lv_text_get_width +#endif /* LV_USE_TEXTAREA */ + +#if LV_USE_IMAGE +#define lv_img_create lv_image_create +#define lv_img_set_src lv_image_set_src +#define lv_img_set_offset_x lv_image_set_offset_x +#define lv_img_set_offset_y lv_image_set_offset_y +#define lv_img_set_angle lv_image_set_rotation +#define lv_img_set_pivot lv_image_set_pivot +#define lv_img_set_zoom lv_image_set_scale +#define lv_img_set_antialias lv_image_set_antialias +#define lv_img_get_src lv_image_get_src +#define lv_img_get_offset_x lv_image_get_offset_x +#define lv_img_get_offset_y lv_image_get_offset_y +#define lv_img_get_angle lv_image_get_rotation +#define lv_img_get_pivot lv_image_get_pivot +#define lv_img_get_zoom lv_image_get_scale +#define lv_img_get_antialias lv_image_get_antialias +#endif /* LV_USE_IMAGE */ + +#if LV_USE_IMAGEBUTTON +#define lv_imgbtn_create lv_imagebutton_create +#define lv_imgbtn_set_src lv_imagebutton_set_src +#define lv_imgbtn_set_state lv_imagebutton_set_state +#define lv_imgbtn_get_src_left lv_imagebutton_get_src_left +#define lv_imgbtn_get_src_middle lv_imagebutton_get_src_middle +#define lv_imgbtn_get_src_right lv_imagebutton_get_src_right +#endif /* LV_USE_IMAGEBUTTON */ + +#if LV_USE_LIST +#define lv_list_set_btn_text lv_list_set_button_text +#define lv_list_get_btn_text lv_list_get_button_text +#define lv_list_add_btn lv_list_add_button +#endif /* LV_USE_LIST */ + +#if LV_USE_BUTTON +#define lv_btn_create lv_button_create +#endif /* LV_USE_BUTTON */ + +#if LV_USE_BUTTONMATRIX +#define lv_btnmatrix_create lv_buttonmatrix_create +#define lv_btnmatrix_set_map lv_buttonmatrix_set_map +#define lv_btnmatrix_set_ctrl_map lv_buttonmatrix_set_ctrl_map +#define lv_btnmatrix_set_selected_btn lv_buttonmatrix_set_selected_button +#define lv_btnmatrix_set_btn_ctrl lv_buttonmatrix_set_button_ctrl +#define lv_btnmatrix_clear_btn_ctrl lv_buttonmatrix_clear_button_ctrl +#define lv_btnmatrix_set_btn_ctrl_all lv_buttonmatrix_set_button_ctrl_all +#define lv_btnmatrix_clear_btn_ctrl_all lv_buttonmatrix_clear_button_ctrl_all +#define lv_btnmatrix_set_btn_width lv_buttonmatrix_set_button_width +#define lv_btnmatrix_set_one_checked lv_buttonmatrix_set_one_checked +#define lv_btnmatrix_get_map lv_buttonmatrix_get_map +#define lv_btnmatrix_get_selected_btn lv_buttonmatrix_get_selected_button +#define lv_btnmatrix_get_btn_text lv_buttonmatrix_get_button_text +#define lv_btnmatrix_has_button_ctrl lv_buttonmatrix_has_button_ctrl +#define lv_btnmatrix_get_one_checked lv_buttonmatrix_get_one_checked +#endif /* LV_USE_BUTTONMATRIX */ + +#if LV_USE_TABVIEW +#define lv_tabview_get_tab_btns lv_tabview_get_tab_bar +#define lv_tabview_get_tab_act lv_tabview_get_tab_active +#define lv_tabview_set_act lv_tabview_set_active +#endif /* LV_USE_TABVIEW */ + +#if LV_USE_TILEVIEW +#define lv_tileview_get_tile_act lv_tileview_get_tile_active +#define lv_obj_set_tile_id lv_tileview_set_tile_by_index +#define lv_obj_set_tile lv_tileview_set_tile +#endif /* LV_USE_TILEVIEW */ + +#if LV_USE_ROLLER +#define lv_roller_set_visible_row_cnt lv_roller_set_visible_row_count +#define lv_roller_get_option_cnt lv_roller_get_option_count +#endif /* LV_USE_ROLLER */ + +#if LV_USE_TABLE +#define lv_table_set_col_cnt lv_table_set_column_count +#define lv_table_set_row_cnt lv_table_set_row_count +#define lv_table_get_col_cnt lv_table_get_column_count +#define lv_table_get_row_cnt lv_table_get_row_count +#define lv_table_set_col_width lv_table_set_column_width +#define lv_table_get_col_width lv_table_get_column_width +#endif /* LV_USE_TABLE */ + +#if LV_USE_DROPDOWN +#define lv_dropdown_get_option_cnt lv_dropdown_get_option_count +#endif /* LV_USE_DROPDOWN */ + +#define lv_obj_get_child_cnt lv_obj_get_child_count +#define lv_obj_get_disp lv_obj_get_display +#define lv_obj_delete_anim_ready_cb lv_obj_delete_anim_completed_cb + +#define LV_STYLE_ANIM_TIME LV_STYLE_ANIM_DURATION +#define LV_STYLE_IMG_OPA LV_STYLE_IMAGE_OPA +#define LV_STYLE_IMG_RECOLOR LV_STYLE_IMAGE_RECOLOR +#define LV_STYLE_IMG_RECOLOR_OPA LV_STYLE_IMAGE_RECOLOR_OPA +#define LV_STYLE_SHADOW_OFS_X LV_STYLE_SHADOW_OFFSET_X +#define LV_STYLE_SHADOW_OFS_Y LV_STYLE_SHADOW_OFFSET_Y +#define LV_STYLE_TRANSFORM_ANGLE LV_STYLE_TRANSFORM_ROTATION + +#define lv_obj_get_style_anim_time lv_obj_get_style_anim_duration +#define lv_obj_get_style_img_opa lv_obj_get_style_image_opa +#define lv_obj_get_style_img_recolor lv_obj_get_style_image_recolor +#define lv_obj_get_style_img_recolor_filtered lv_obj_get_style_image_recolor_filtered +#define lv_obj_get_style_img_recolor_opa lv_obj_get_style_image_recolor_opa +#define lv_obj_get_style_shadow_ofs_x lv_obj_get_style_shadow_offset_x +#define lv_obj_get_style_shadow_ofs_y lv_obj_get_style_shadow_offset_y +#define lv_obj_get_style_transform_angle lv_obj_get_style_transform_rotation +#define lv_obj_get_style_bg_img_src lv_obj_get_style_bg_image_src +#define lv_obj_get_style_bg_img_recolor lv_obj_get_style_bg_image_recolor +#define lv_obj_get_style_bg_img_recolor_opa lv_obj_get_style_bg_image_recolor_opa + +#define lv_obj_set_style_anim_time lv_obj_set_style_anim_duration +#define lv_obj_set_style_img_opa lv_obj_set_style_image_opa +#define lv_obj_set_style_img_recolor lv_obj_set_style_image_recolor +#define lv_obj_set_style_img_recolor_opa lv_obj_set_style_image_recolor_opa +#define lv_obj_set_style_shadow_ofs_x lv_obj_set_style_shadow_offset_x +#define lv_obj_set_style_shadow_ofs_y lv_obj_set_style_shadow_offset_y +#define lv_obj_set_style_transform_zoom lv_obj_set_style_transform_scale +#define lv_obj_set_style_transform_angle lv_obj_set_style_transform_rotation +#define lv_obj_set_style_bg_img_src lv_obj_set_style_bg_image_src +#define lv_obj_set_style_bg_img_recolor lv_obj_set_style_bg_image_recolor +#define lv_obj_set_style_bg_img_recolor_opa lv_obj_set_style_bg_image_recolor_opa + +#define lv_style_set_anim_time lv_style_set_anim_duration +#define lv_style_set_img_opa lv_style_set_image_opa +#define lv_style_set_img_recolor lv_style_set_image_recolor +#define lv_style_set_img_recolor_opa lv_style_set_image_recolor_opa +#define lv_style_set_shadow_ofs_x lv_style_set_shadow_offset_x +#define lv_style_set_shadow_ofs_y lv_style_set_shadow_offset_y +#define lv_style_set_transform_angle lv_style_set_transform_rotation +#define lv_style_set_transform_zoom lv_style_set_transform_scale +#define lv_style_set_bg_img_src lv_style_set_bg_image_src +#define lv_style_set_bg_img_recolor lv_style_set_bg_image_recolor +#define lv_style_set_bg_img_recolor_opa lv_style_set_bg_image_recolor_opa + +#if LV_USE_KEYBOARD +#define lv_keyboard_get_selected_btn lv_keyboard_get_selected_button +#define lv_keyboard_get_btn_text lv_keyboard_get_button_text +#endif /* LV_USE_KEYBOARD */ + +#define LV_ZOOM_NONE LV_SCALE_NONE + +#define lv_image_decoder_built_in_open lv_bin_decoder_open +#define lv_image_decoder_built_in_close lv_bin_decoder_close + +/********************** + * MACROS + **********************/ +/** Use this macro to declare an image in a C file*/ +#define LV_IMG_DECLARE(var_name) extern const lv_image_dsc_t var_name; + +/********************** + * DEPRECATED FUNCTIONS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_API_MAP_V8_H*/ diff --git a/inc/lvgl/src/lv_api_map_v9_0.h b/inc/lvgl/src/lv_api_map_v9_0.h new file mode 100644 index 0000000..b0d22cd --- /dev/null +++ b/inc/lvgl/src/lv_api_map_v9_0.h @@ -0,0 +1,66 @@ +/** + * @file lv_api_map_v9_0.h + * + */ + +#ifndef LV_API_MAP_V9_0_H +#define LV_API_MAP_V9_0_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ +#define lv_image_set_align lv_image_set_inner_align +#define lv_image_get_align lv_image_get_inner_align + +#ifndef LV_DRAW_LAYER_SIMPLE_BUF_SIZE +#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE +#endif + +#define lv_button_bind_checked lv_obj_bind_checked + +#define LV_DRAW_BUF_DEFINE LV_DRAW_BUF_DEFINE_STATIC + +#define _lv_utils_bsearch lv_utils_bsearch +#define lv_draw_buf_align_user lv_draw_buf_align_ex +#define lv_draw_buf_create_user lv_draw_buf_create_ex +#define lv_draw_buf_width_to_stride_user lv_draw_buf_width_to_stride_ex +#define lv_draw_buf_dup_user lv_draw_buf_dup_ex + +#define lv_draw_buf_invalidate_cache_user(handlers, drawbuf, area) lv_draw_buf_invalidate_cache(drawbuf, area) +#define lv_draw_buf_flush_cache_user(handlers, drawbuf, area) lv_draw_buf_flush_cache(drawbuf, area) +#define lv_draw_buf_destroy_user(handlers, drawbuf) lv_draw_buf_destroy(drawbuf) + +/********************** + * MACROS + **********************/ + +/********************** + * DEPRECATED FUNCTIONS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_API_MAP_V9_0_H*/ diff --git a/inc/lvgl/src/lv_api_map_v9_1.h b/inc/lvgl/src/lv_api_map_v9_1.h new file mode 100644 index 0000000..1621013 --- /dev/null +++ b/inc/lvgl/src/lv_api_map_v9_1.h @@ -0,0 +1,129 @@ +/** + * @file lv_api_map_v9_1.h + * + */ + +#ifndef LV_API_MAP_V9_1_H +#define LV_API_MAP_V9_1_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * MACROS + **********************/ + +#define _LV_EVENT_LAST LV_EVENT_LAST +#define _lv_event_code_t lv_event_code_t +#define _lv_event_mark_deleted lv_event_mark_deleted +#define lv_obj_add_event lv_obj_add_event_cb + +#define _LV_STYLE_LAST_BUILT_IN_PROP LV_STYLE_LAST_BUILT_IN_PROP +#define _LV_FLEX_REVERSE LV_FLEX_REVERSE +#define _LV_FLEX_WRAP LV_FLEX_WRAP +#define _LV_FLEX_COLUMN LV_FLEX_COLUMN + +#define _lv_area_is_equal lv_area_is_equal +#define _lv_area_is_in lv_area_is_in +#define _lv_area_intersect lv_area_intersect +#define _lv_area_is_point_on lv_area_is_point_on +#define _lv_area_join lv_area_join +#define _lv_image_buf_get_transformed_area lv_image_buf_get_transformed_area + +#define _lv_ll_init lv_ll_init +#define _lv_ll_ins_head lv_ll_ins_head +#define _lv_ll_ins_prev lv_ll_ins_prev +#define _lv_ll_ins_tail lv_ll_ins_tail +#define _lv_ll_get_head lv_ll_get_head +#define _lv_ll_get_tail lv_ll_get_tail +#define _lv_ll_get_next lv_ll_get_next +#define _lv_ll_get_prev lv_ll_get_prev +#define _lv_ll_get_len lv_ll_get_len +#define _lv_ll_move_before lv_ll_move_before +#define _lv_ll_is_empty lv_ll_is_empty +#define _lv_ll_clear lv_ll_clear +#define _lv_ll_remove lv_ll_remove +#define _lv_ll_chg_list lv_ll_chg_list +#define _LV_LL_READ LV_LL_READ +#define _LV_LL_READ_BACK LV_LL_READ_BACK + +#define _lv_obj_scroll_by_raw lv_obj_scroll_by_raw +#define _lv_obj_get_ext_draw_size lv_obj_get_ext_draw_size +#define _lv_indev_scroll_handler lv_indev_scroll_handler + +#define _lv_display_refr_timer lv_disp_refr_timer +#define _lv_disp_refr_timer lv_disp_refr_timer +#define _lv_disp_get_refr_timer lv_disp_get_refr_timer + +#define lv_obj_get_child_by_id lv_obj_find_by_id +#define lv_obj_update_flag lv_obj_set_flag + +#define _lv_inv_area lv_inv_area +#define lv_chart_set_all_value lv_chart_set_all_values +#define lv_calendar_set_showed_date lv_calendar_set_month_shown +#define lv_chart_set_range lv_chart_set_axis_range +#define lv_chart_set_value_by_id lv_chart_set_series_value_by_id +#define lv_chart_get_x_array lv_chart_get_series_x_array +#define lv_chart_get_y_array lv_chart_get_series_y_array +#define lv_chart_set_ext_x_array lv_chart_set_series_ext_x_array +#define lv_chart_set_ext_y_array lv_chart_set_series_ext_y_array + +#if defined(LV_FS_DEFAULT_DRIVE_LETTER) +#warning LV_FS_DEFAULT_DRIVE_LETTER is deprecated. Rename to LV_FS_DEFAULT_DRIVER_LETTER + +#if LV_FS_DEFAULT_DRIVER_LETTER == '\0' +#undef LV_FS_DEFAULT_DRIVER_LETTER +#define LV_FS_DEFAULT_DRIVER_LETTER LV_FS_DEFAULT_DRIVE_LETTER +#endif + +#endif /* defined(LV_FS_DEFAULT_DRIVE_LETTER) */ + +#define LV_LABEL_LONG_WRAP LV_LABEL_LONG_MODE_WRAP +#define LV_LABEL_LONG_DOT LV_LABEL_LONG_MODE_DOTS +#define LV_LABEL_LONG_SCROLL LV_LABEL_LONG_MODE_SCROLL +#define LV_LABEL_LONG_SCROLL_CIRCULAR LV_LABEL_LONG_MODE_SCROLL_CIRCULAR +#define LV_LABEL_LONG_CLIP LV_LABEL_LONG_MODE_CLIP + +#define lv_anim_set_time lv_anim_set_duration +#define lv_anim_set_playback_time lv_anim_set_reverse_duration +#define lv_anim_set_playback_delay lv_anim_set_reverse_delay +#define lv_anim_set_playback_duration lv_anim_set_reverse_duration + +#define lv_gradient_init_stops lv_grad_init_stops +#define lv_gradient_stop_t lv_grad_stop_t + +#define lv_spangroup_new_span lv_spangroup_add_span +#define lv_spangroup_refr_mode lv_spangroup_refresh + +#define lv_slider_set_left_value lv_slider_set_start_value + +#define lv_calendar_header_arrow_create lv_calendar_add_header_arrow +#define lv_calendar_header_dropdown_create lv_calendar_add_header_dropdown + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_API_MAP_V9_1_H */ diff --git a/inc/lvgl/src/lv_api_map_v9_2.h b/inc/lvgl/src/lv_api_map_v9_2.h new file mode 100644 index 0000000..1339452 --- /dev/null +++ b/inc/lvgl/src/lv_api_map_v9_2.h @@ -0,0 +1,57 @@ +/** + * @file lv_api_map_v9_2.h + * + */ + +#ifndef LV_API_MAP_V9_2_H +#define LV_API_MAP_V9_2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#define LV_SCR_LOAD_ANIM_NONE LV_SCREEN_LOAD_ANIM_NONE +#define LV_SCR_LOAD_ANIM_OVER_LEFT LV_SCREEN_LOAD_ANIM_OVER_LEFT +#define LV_SCR_LOAD_ANIM_OVER_RIGHT LV_SCREEN_LOAD_ANIM_OVER_RIGHT +#define LV_SCR_LOAD_ANIM_OVER_TOP LV_SCREEN_LOAD_ANIM_OVER_TOP +#define LV_SCR_LOAD_ANIM_OVER_BOTTOM LV_SCREEN_LOAD_ANIM_OVER_BOTTOM +#define LV_SCR_LOAD_ANIM_MOVE_LEFT LV_SCREEN_LOAD_ANIM_MOVE_LEFT +#define LV_SCR_LOAD_ANIM_MOVE_RIGHT LV_SCREEN_LOAD_ANIM_MOVE_RIGHT +#define LV_SCR_LOAD_ANIM_MOVE_TOP LV_SCREEN_LOAD_ANIM_MOVE_TOP +#define LV_SCR_LOAD_ANIM_MOVE_BOTTOM LV_SCREEN_LOAD_ANIM_MOVE_BOTTOM +#define LV_SCR_LOAD_ANIM_FADE_IN LV_SCREEN_LOAD_ANIM_FADE_IN +#define LV_SCR_LOAD_ANIM_FADE_ON LV_SCREEN_LOAD_ANIM_FADE_ON +#define LV_SCR_LOAD_ANIM_FADE_OUT LV_SCREEN_LOAD_ANIM_FADE_OUT +#define LV_SCR_LOAD_ANIM_OUT_LEFT LV_SCREEN_LOAD_ANIM_OUT_LEFT +#define LV_SCR_LOAD_ANIM_OUT_RIGHT LV_SCREEN_LOAD_ANIM_OUT_RIGHT +#define LV_SCR_LOAD_ANIM_OUT_TOP LV_SCREEN_LOAD_ANIM_OUT_TOP +#define LV_SCR_LOAD_ANIM_OUT_BOTTOM LV_SCREEN_LOAD_ANIM_OUT_BOTTOM + +#define lv_ft81x_spi_operation lv_ft81x_spi_operation_t + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_API_MAP_V9_2_H */ diff --git a/inc/lvgl/src/lv_api_map_v9_3.h b/inc/lvgl/src/lv_api_map_v9_3.h new file mode 100644 index 0000000..d6ec98d --- /dev/null +++ b/inc/lvgl/src/lv_api_map_v9_3.h @@ -0,0 +1,97 @@ +/** + * @file lv_api_map_v9_3.h + * + */ + +#ifndef LV_API_MAP_V9_3_H +#define LV_API_MAP_V9_3_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#define lv_draw_buf_malloc_cb lv_draw_buf_malloc_cb_t +#define lv_draw_buf_free_cb lv_draw_buf_free_cb_t +#define lv_draw_buf_copy_cb lv_draw_buf_copy_cb_t +#define lv_draw_buf_align_cb lv_draw_buf_align_cb_t +#define lv_draw_buf_cache_operation_cb lv_draw_buf_cache_operation_cb_t +#define lv_draw_buf_width_to_stride_cb lv_draw_buf_width_to_stride_cb_t + +#define lv_glfw_window_t lv_opengles_window_t +#define lv_glfw_texture_t lv_opengles_window_texture_t +#define lv_glfw_window_create lv_opengles_glfw_window_create +#define lv_glfw_window_create_ex lv_opengles_glfw_window_create_ex +#define lv_glfw_window_set_title lv_opengles_glfw_window_set_title +#define lv_glfw_window_delete lv_opengles_window_delete +#define lv_glfw_window_set_flip lv_opengles_glfw_window_set_flip +#define lv_glfw_window_add_texture lv_opengles_window_add_texture +#define lv_glfw_texture_remove lv_opengles_window_texture_remove +#define lv_glfw_texture_set_x lv_opengles_window_texture_set_x +#define lv_glfw_texture_set_y lv_opengles_window_texture_set_y +#define lv_glfw_texture_set_opa lv_opengles_window_texture_set_opa +#define lv_glfw_texture_get_mouse_indev lv_opengles_window_texture_get_mouse_indev +#define lv_glfw_window_get_glfw_window lv_opengles_glfw_window_get_glfw_window + +#define lv_vector_dsc_create lv_draw_vector_dsc_create +#define lv_vector_dsc_delete lv_draw_vector_dsc_delete +#define lv_vector_dsc_set_transform lv_draw_vector_dsc_set_transform +#define lv_vector_dsc_set_blend_mode lv_draw_vector_dsc_set_blend_mode +#define lv_vector_dsc_set_fill_color32 lv_draw_vector_dsc_set_fill_color32 +#define lv_vector_dsc_set_fill_color lv_draw_vector_dsc_set_fill_color +#define lv_vector_dsc_set_fill_opa lv_draw_vector_dsc_set_fill_opa +#define lv_vector_dsc_set_fill_rule lv_draw_vector_dsc_set_fill_rule +#define lv_vector_dsc_set_fill_units lv_draw_vector_dsc_set_fill_units +#define lv_vector_dsc_set_fill_image lv_draw_vector_dsc_set_fill_image +#define lv_vector_dsc_set_fill_linear_gradient lv_draw_vector_dsc_set_fill_linear_gradient +#define lv_vector_dsc_set_fill_radial_gradient lv_draw_vector_dsc_set_fill_radial_gradient +#define lv_vector_dsc_set_fill_gradient_spread lv_draw_vector_dsc_set_fill_gradient_spread +#define lv_vector_dsc_set_fill_gradient_color_stops lv_draw_vector_dsc_set_fill_gradient_color_stops +#define lv_vector_dsc_set_fill_transform lv_draw_vector_dsc_set_fill_transform +#define lv_vector_dsc_set_stroke_color32 lv_draw_vector_dsc_set_stroke_color32 +#define lv_vector_dsc_set_stroke_color lv_draw_vector_dsc_set_stroke_color +#define lv_vector_dsc_set_stroke_opa lv_draw_vector_dsc_set_stroke_opa +#define lv_vector_dsc_set_stroke_width lv_draw_vector_dsc_set_stroke_width +#define lv_vector_dsc_set_stroke_dash lv_draw_vector_dsc_set_stroke_dash +#define lv_vector_dsc_set_stroke_cap lv_draw_vector_dsc_set_stroke_cap +#define lv_vector_dsc_set_stroke_join lv_draw_vector_dsc_set_stroke_join +#define lv_vector_dsc_set_stroke_miter_limit lv_draw_vector_dsc_set_stroke_miter_limit +#define lv_vector_dsc_set_stroke_linear_gradient lv_draw_vector_dsc_set_stroke_linear_gradient +#define lv_vector_dsc_set_stroke_radial_gradient lv_draw_vector_dsc_set_stroke_radial_gradient +#define lv_vector_dsc_set_stroke_gradient_spread lv_draw_vector_dsc_set_stroke_gradient_spread +#define lv_vector_dsc_set_stroke_gradient_color_stops lv_draw_vector_dsc_set_stroke_gradient_color_stops +#define lv_vector_dsc_set_stroke_transform lv_draw_vector_dsc_set_stroke_transform +#define lv_vector_dsc_identity lv_draw_vector_dsc_identity +#define lv_vector_dsc_scale lv_draw_vector_dsc_scale +#define lv_vector_dsc_rotate lv_draw_vector_dsc_rotate +#define lv_vector_dsc_translate lv_draw_vector_dsc_translate +#define lv_vector_dsc_skew lv_draw_vector_dsc_skew +#define lv_vector_dsc_add_path lv_draw_vector_dsc_add_path +#define lv_vector_dsc_clear_area lv_draw_vector_dsc_clear_area + + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_API_MAP_V9_3_H */ diff --git a/inc/lvgl/src/lv_api_map_v9_4.h b/inc/lvgl/src/lv_api_map_v9_4.h new file mode 100644 index 0000000..031012d --- /dev/null +++ b/inc/lvgl/src/lv_api_map_v9_4.h @@ -0,0 +1,41 @@ +/** + * @file lv_api_map_v9_4.h + * + */ + +#ifndef LV_API_MAP_V9_4_H +#define LV_API_MAP_V9_4_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#define lv_tabview_rename_tab lv_tabview_set_tab_text +#define lv_wayland_timer_handler lv_timer_handler +#define lv_wayland_display_close_f_t lv_wayland_display_close_cb_t + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_API_MAP_V9_4_H */ diff --git a/inc/lvgl/src/lv_conf_internal.h b/inc/lvgl/src/lv_conf_internal.h new file mode 100644 index 0000000..0c89315 --- /dev/null +++ b/inc/lvgl/src/lv_conf_internal.h @@ -0,0 +1,4973 @@ +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_conf_internal.h + * This file ensures all defines of lv_conf.h have a default value. + */ + +#ifndef LV_CONF_INTERNAL_H +#define LV_CONF_INTERNAL_H +/* clang-format off */ + +/* Config options */ +#define LV_OS_NONE 0 +#define LV_OS_PTHREAD 1 +#define LV_OS_FREERTOS 2 +#define LV_OS_CMSIS_RTOS2 3 +#define LV_OS_RTTHREAD 4 +#define LV_OS_WINDOWS 5 +#define LV_OS_MQX 6 +#define LV_OS_SDL2 7 +#define LV_OS_CUSTOM 255 + +#define LV_STDLIB_BUILTIN 0 +#define LV_STDLIB_CLIB 1 +#define LV_STDLIB_MICROPYTHON 2 +#define LV_STDLIB_RTTHREAD 3 +#define LV_STDLIB_CUSTOM 255 + +#define LV_DRAW_SW_ASM_NONE 0 +#define LV_DRAW_SW_ASM_NEON 1 +#define LV_DRAW_SW_ASM_HELIUM 2 +#define LV_DRAW_SW_ASM_RISCV_V 3 +#define LV_DRAW_SW_ASM_CUSTOM 255 + +#define LV_NEMA_LIB_NONE 0 +#define LV_NEMA_LIB_M33_REVC 1 +#define LV_NEMA_LIB_M33_NEMAPVG 2 +#define LV_NEMA_LIB_M55 3 +#define LV_NEMA_LIB_M7 4 + +#define LV_NEMA_HAL_CUSTOM 0 +#define LV_NEMA_HAL_STM32 1 + +#define LV_NANOVG_BACKEND_GL2 1 +#define LV_NANOVG_BACKEND_GL3 2 +#define LV_NANOVG_BACKEND_GLES2 3 +#define LV_NANOVG_BACKEND_GLES3 4 + +/** Handle special Kconfig options. */ +#ifndef LV_KCONFIG_IGNORE + #include "lv_conf_kconfig.h" + #if defined(CONFIG_LV_CONF_SKIP) && !defined(LV_CONF_SKIP) + #define LV_CONF_SKIP + #endif +#endif + +/* If "lv_conf.h" is available from here try to use it later. */ +#ifdef __has_include + #if __has_include("lv_conf.h") + #ifndef LV_CONF_INCLUDE_SIMPLE + #define LV_CONF_INCLUDE_SIMPLE + #endif + #endif +#endif + +/* If lv_conf.h is not skipped, include it. */ +#if !defined(LV_CONF_SKIP) || defined(LV_CONF_PATH) + #ifdef LV_CONF_PATH /* If there is a path defined for lv_conf.h, use it */ + #include LV_CONF_PATH /* Note: Make sure to define custom CONF_PATH as a string */ + #elif defined(LV_CONF_INCLUDE_SIMPLE) /* Or simply include lv_conf.h is enabled. */ + #include "lv_conf.h" + #else + #include "../../lv_conf.h" /* Else assume lv_conf.h is next to the lvgl folder. */ + #endif + #if !defined(LV_CONF_H) && !defined(LV_CONF_SUPPRESS_DEFINE_CHECK) + /* #include will sometimes silently fail when __has_include is used */ + /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80753 */ + #pragma message("Possible failure to include lv_conf.h, please read the comment in this file if you get errors") + #endif +#endif + +#ifdef CONFIG_LV_COLOR_DEPTH + #define LV_KCONFIG_PRESENT +#endif + +/*---------------------------------- + * Start parsing lv_conf_template.h + -----------------------------------*/ + +/* If you need to include anything here, do it inside the `__ASSEMBLY__` guard */ +#if 0 && defined(__ASSEMBLY__) +#include "my_include.h" +#endif + +/*==================== + COLOR SETTINGS + *====================*/ + +/** Color depth: 1 (I1), 8 (L8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888) */ +#ifndef LV_COLOR_DEPTH + #ifdef CONFIG_LV_COLOR_DEPTH + #define LV_COLOR_DEPTH CONFIG_LV_COLOR_DEPTH + #else + #define LV_COLOR_DEPTH 16 + #endif +#endif + +/*========================= + STDLIB WRAPPER SETTINGS + *=========================*/ + +/** Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#ifndef LV_USE_STDLIB_MALLOC + #ifdef CONFIG_LV_USE_STDLIB_MALLOC + #define LV_USE_STDLIB_MALLOC CONFIG_LV_USE_STDLIB_MALLOC + #else + #define LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN + #endif +#endif + +/** Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#ifndef LV_USE_STDLIB_STRING + #ifdef CONFIG_LV_USE_STDLIB_STRING + #define LV_USE_STDLIB_STRING CONFIG_LV_USE_STDLIB_STRING + #else + #define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN + #endif +#endif + +/** Possible values + * - LV_STDLIB_BUILTIN: LVGL's built in implementation + * - LV_STDLIB_CLIB: Standard C functions, like malloc, strlen, etc + * - LV_STDLIB_MICROPYTHON: MicroPython implementation + * - LV_STDLIB_RTTHREAD: RT-Thread implementation + * - LV_STDLIB_CUSTOM: Implement the functions externally + */ +#ifndef LV_USE_STDLIB_SPRINTF + #ifdef CONFIG_LV_USE_STDLIB_SPRINTF + #define LV_USE_STDLIB_SPRINTF CONFIG_LV_USE_STDLIB_SPRINTF + #else + #define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN + #endif +#endif + +#ifndef LV_STDINT_INCLUDE + #ifdef CONFIG_LV_STDINT_INCLUDE + #define LV_STDINT_INCLUDE CONFIG_LV_STDINT_INCLUDE + #else + #define LV_STDINT_INCLUDE + #endif +#endif +#ifndef LV_STDDEF_INCLUDE + #ifdef CONFIG_LV_STDDEF_INCLUDE + #define LV_STDDEF_INCLUDE CONFIG_LV_STDDEF_INCLUDE + #else + #define LV_STDDEF_INCLUDE + #endif +#endif +#ifndef LV_STDBOOL_INCLUDE + #ifdef CONFIG_LV_STDBOOL_INCLUDE + #define LV_STDBOOL_INCLUDE CONFIG_LV_STDBOOL_INCLUDE + #else + #define LV_STDBOOL_INCLUDE + #endif +#endif +#ifndef LV_INTTYPES_INCLUDE + #ifdef CONFIG_LV_INTTYPES_INCLUDE + #define LV_INTTYPES_INCLUDE CONFIG_LV_INTTYPES_INCLUDE + #else + #define LV_INTTYPES_INCLUDE + #endif +#endif +#ifndef LV_LIMITS_INCLUDE + #ifdef CONFIG_LV_LIMITS_INCLUDE + #define LV_LIMITS_INCLUDE CONFIG_LV_LIMITS_INCLUDE + #else + #define LV_LIMITS_INCLUDE + #endif +#endif +#ifndef LV_STDARG_INCLUDE + #ifdef CONFIG_LV_STDARG_INCLUDE + #define LV_STDARG_INCLUDE CONFIG_LV_STDARG_INCLUDE + #else + #define LV_STDARG_INCLUDE + #endif +#endif + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + /** Size of memory available for `lv_malloc()` in bytes (>= 2kB) */ + #ifndef LV_MEM_SIZE + #ifdef CONFIG_LV_MEM_SIZE + #define LV_MEM_SIZE CONFIG_LV_MEM_SIZE + #else + #define LV_MEM_SIZE (64 * 1024U) /**< [bytes] */ + #endif + #endif + + /** Size of the memory expand for `lv_malloc()` in bytes */ + #ifndef LV_MEM_POOL_EXPAND_SIZE + #ifdef CONFIG_LV_MEM_POOL_EXPAND_SIZE + #define LV_MEM_POOL_EXPAND_SIZE CONFIG_LV_MEM_POOL_EXPAND_SIZE + #else + #define LV_MEM_POOL_EXPAND_SIZE 0 + #endif + #endif + + /** Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too. */ + #ifndef LV_MEM_ADR + #ifdef CONFIG_LV_MEM_ADR + #define LV_MEM_ADR CONFIG_LV_MEM_ADR + #else + #define LV_MEM_ADR 0 /**< 0: unused*/ + #endif + #endif + /* Instead of an address give a memory allocator that will be called to get a memory pool for LVGL. E.g. my_malloc */ + #if LV_MEM_ADR == 0 + #ifndef LV_MEM_POOL_INCLUDE + #ifdef CONFIG_LV_MEM_POOL_INCLUDE + #define LV_MEM_POOL_INCLUDE CONFIG_LV_MEM_POOL_INCLUDE + #else + #undef LV_MEM_POOL_INCLUDE + #endif + #endif + #ifndef LV_MEM_POOL_ALLOC + #ifdef CONFIG_LV_MEM_POOL_ALLOC + #define LV_MEM_POOL_ALLOC CONFIG_LV_MEM_POOL_ALLOC + #else + #undef LV_MEM_POOL_ALLOC + #endif + #endif + #endif +#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ + +/*==================== + HAL SETTINGS + *====================*/ + +/** Default display refresh, input device read and animation step period. */ +#ifndef LV_DEF_REFR_PERIOD + #ifdef CONFIG_LV_DEF_REFR_PERIOD + #define LV_DEF_REFR_PERIOD CONFIG_LV_DEF_REFR_PERIOD + #else + #define LV_DEF_REFR_PERIOD 33 /**< [ms] */ + #endif +#endif + +/** Default Dots Per Inch. Used to initialize default sizes such as widgets sized, style paddings. + * (Not so important, you can adjust it to modify default sizes and spaces.) */ +#ifndef LV_DPI_DEF + #ifdef CONFIG_LV_DPI_DEF + #define LV_DPI_DEF CONFIG_LV_DPI_DEF + #else + #define LV_DPI_DEF 130 /**< [px/inch] */ + #endif +#endif + +/*================= + * OPERATING SYSTEM + *=================*/ +/** Select operating system to use. Possible options: + * - LV_OS_NONE + * - LV_OS_PTHREAD + * - LV_OS_FREERTOS + * - LV_OS_CMSIS_RTOS2 + * - LV_OS_RTTHREAD + * - LV_OS_WINDOWS + * - LV_OS_MQX + * - LV_OS_SDL2 + * - LV_OS_CUSTOM */ +#ifndef LV_USE_OS + #ifdef CONFIG_LV_USE_OS + #define LV_USE_OS CONFIG_LV_USE_OS + #else + #define LV_USE_OS LV_OS_NONE + #endif +#endif + +#if LV_USE_OS == LV_OS_CUSTOM + #ifndef LV_OS_CUSTOM_INCLUDE + #ifdef CONFIG_LV_OS_CUSTOM_INCLUDE + #define LV_OS_CUSTOM_INCLUDE CONFIG_LV_OS_CUSTOM_INCLUDE + #else + #define LV_OS_CUSTOM_INCLUDE + #endif + #endif +#endif +#if LV_USE_OS == LV_OS_FREERTOS + /* + * Unblocking an RTOS task with a direct notification is 45% faster and uses less RAM + * than unblocking a task using an intermediary object such as a binary semaphore. + * RTOS task notifications can only be used when there is only one task that can be the recipient of the event. + */ + #ifndef LV_USE_FREERTOS_TASK_NOTIFY + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_FREERTOS_TASK_NOTIFY + #define LV_USE_FREERTOS_TASK_NOTIFY CONFIG_LV_USE_FREERTOS_TASK_NOTIFY + #else + #define LV_USE_FREERTOS_TASK_NOTIFY 0 + #endif + #else + #define LV_USE_FREERTOS_TASK_NOTIFY 1 + #endif + #endif +#endif + +/*======================== + * RENDERING CONFIGURATION + *========================*/ + +/** Align stride of all layers and images to this bytes */ +#ifndef LV_DRAW_BUF_STRIDE_ALIGN + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_BUF_STRIDE_ALIGN + #define LV_DRAW_BUF_STRIDE_ALIGN CONFIG_LV_DRAW_BUF_STRIDE_ALIGN + #else + #define LV_DRAW_BUF_STRIDE_ALIGN 0 + #endif + #else + #define LV_DRAW_BUF_STRIDE_ALIGN 1 + #endif +#endif + +/** Align start address of draw_buf addresses to this bytes*/ +#ifndef LV_DRAW_BUF_ALIGN + #ifdef CONFIG_LV_DRAW_BUF_ALIGN + #define LV_DRAW_BUF_ALIGN CONFIG_LV_DRAW_BUF_ALIGN + #else + #define LV_DRAW_BUF_ALIGN 4 + #endif +#endif + +/** Using matrix for transformations. + * Requirements: + * - `LV_USE_MATRIX = 1`. + * - Rendering engine needs to support 3x3 matrix transformations. */ +#ifndef LV_DRAW_TRANSFORM_USE_MATRIX + #ifdef CONFIG_LV_DRAW_TRANSFORM_USE_MATRIX + #define LV_DRAW_TRANSFORM_USE_MATRIX CONFIG_LV_DRAW_TRANSFORM_USE_MATRIX + #else + #define LV_DRAW_TRANSFORM_USE_MATRIX 0 + #endif +#endif + +/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode + * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks. + * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers + * and can't be drawn in chunks. */ + +/** The target buffer size for simple layer chunks. */ +#ifndef LV_DRAW_LAYER_SIMPLE_BUF_SIZE + #ifdef CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE + #define LV_DRAW_LAYER_SIMPLE_BUF_SIZE CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE + #else + #define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /**< [bytes]*/ + #endif +#endif + +/* Limit the max allocated memory for simple and transformed layers. + * It should be at least `LV_DRAW_LAYER_SIMPLE_BUF_SIZE` sized but if transformed layers are also used + * it should be enough to store the largest widget too (width x height x 4 area). + * Set it to 0 to have no limit. */ +#ifndef LV_DRAW_LAYER_MAX_MEMORY + #ifdef CONFIG_LV_DRAW_LAYER_MAX_MEMORY + #define LV_DRAW_LAYER_MAX_MEMORY CONFIG_LV_DRAW_LAYER_MAX_MEMORY + #else + #define LV_DRAW_LAYER_MAX_MEMORY 0 /**< No limit by default [bytes]*/ + #endif +#endif + +/** Stack size of drawing thread. + * NOTE: If FreeType or ThorVG is enabled, it is recommended to set it to 32KB or more. + */ +#ifndef LV_DRAW_THREAD_STACK_SIZE + #ifdef CONFIG_LV_DRAW_THREAD_STACK_SIZE + #define LV_DRAW_THREAD_STACK_SIZE CONFIG_LV_DRAW_THREAD_STACK_SIZE + #else + #define LV_DRAW_THREAD_STACK_SIZE (8 * 1024) /**< [bytes]*/ + #endif +#endif + +/** Thread priority of the drawing task. + * Higher values mean higher priority. + * Can use values from lv_thread_prio_t enum in lv_os.h: LV_THREAD_PRIO_LOWEST, + * LV_THREAD_PRIO_LOW, LV_THREAD_PRIO_MID, LV_THREAD_PRIO_HIGH, LV_THREAD_PRIO_HIGHEST + * Make sure the priority value aligns with the OS-specific priority levels. + * On systems with limited priority levels (e.g., FreeRTOS), a higher value can improve + * rendering performance but might cause other tasks to starve. */ +#ifndef LV_DRAW_THREAD_PRIO + #ifdef CONFIG_LV_DRAW_THREAD_PRIO + #define LV_DRAW_THREAD_PRIO CONFIG_LV_DRAW_THREAD_PRIO + #else + #define LV_DRAW_THREAD_PRIO LV_THREAD_PRIO_HIGH + #endif +#endif + +#ifndef LV_USE_DRAW_SW + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_DRAW_SW + #define LV_USE_DRAW_SW CONFIG_LV_USE_DRAW_SW + #else + #define LV_USE_DRAW_SW 0 + #endif + #else + #define LV_USE_DRAW_SW 1 + #endif +#endif +#if LV_USE_DRAW_SW == 1 + /* + * Selectively disable color format support in order to reduce code size. + * NOTE: some features use certain color formats internally, e.g. + * - gradients use RGB888 + * - bitmaps with transparency may use ARGB8888 + */ + #ifndef LV_DRAW_SW_SUPPORT_RGB565 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB565 + #define LV_DRAW_SW_SUPPORT_RGB565 CONFIG_LV_DRAW_SW_SUPPORT_RGB565 + #else + #define LV_DRAW_SW_SUPPORT_RGB565 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_RGB565 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + #define LV_DRAW_SW_SUPPORT_RGB565_SWAPPED CONFIG_LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + #else + #define LV_DRAW_SW_SUPPORT_RGB565_SWAPPED 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_RGB565_SWAPPED 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_RGB565A8 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB565A8 + #define LV_DRAW_SW_SUPPORT_RGB565A8 CONFIG_LV_DRAW_SW_SUPPORT_RGB565A8 + #else + #define LV_DRAW_SW_SUPPORT_RGB565A8 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_RGB565A8 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_RGB888 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB888 + #define LV_DRAW_SW_SUPPORT_RGB888 CONFIG_LV_DRAW_SW_SUPPORT_RGB888 + #else + #define LV_DRAW_SW_SUPPORT_RGB888 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_RGB888 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_XRGB8888 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_XRGB8888 + #define LV_DRAW_SW_SUPPORT_XRGB8888 CONFIG_LV_DRAW_SW_SUPPORT_XRGB8888 + #else + #define LV_DRAW_SW_SUPPORT_XRGB8888 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_XRGB8888 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_ARGB8888 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888 + #define LV_DRAW_SW_SUPPORT_ARGB8888 CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888 + #else + #define LV_DRAW_SW_SUPPORT_ARGB8888 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_ARGB8888 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + #define LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + #else + #define LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_L8 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_L8 + #define LV_DRAW_SW_SUPPORT_L8 CONFIG_LV_DRAW_SW_SUPPORT_L8 + #else + #define LV_DRAW_SW_SUPPORT_L8 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_L8 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_AL88 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_AL88 + #define LV_DRAW_SW_SUPPORT_AL88 CONFIG_LV_DRAW_SW_SUPPORT_AL88 + #else + #define LV_DRAW_SW_SUPPORT_AL88 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_AL88 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_A8 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_A8 + #define LV_DRAW_SW_SUPPORT_A8 CONFIG_LV_DRAW_SW_SUPPORT_A8 + #else + #define LV_DRAW_SW_SUPPORT_A8 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_A8 1 + #endif + #endif + #ifndef LV_DRAW_SW_SUPPORT_I1 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_I1 + #define LV_DRAW_SW_SUPPORT_I1 CONFIG_LV_DRAW_SW_SUPPORT_I1 + #else + #define LV_DRAW_SW_SUPPORT_I1 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_I1 1 + #endif + #endif + + /* The threshold of the luminance to consider a pixel as + * active in indexed color format */ + #ifndef LV_DRAW_SW_I1_LUM_THRESHOLD + #ifdef CONFIG_LV_DRAW_SW_I1_LUM_THRESHOLD + #define LV_DRAW_SW_I1_LUM_THRESHOLD CONFIG_LV_DRAW_SW_I1_LUM_THRESHOLD + #else + #define LV_DRAW_SW_I1_LUM_THRESHOLD 127 + #endif + #endif + + /** Set number of draw units. + * - > 1 requires operating system to be enabled in `LV_USE_OS`. + * - > 1 means multiple threads will render the screen in parallel. */ + #ifndef LV_DRAW_SW_DRAW_UNIT_CNT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT + #define LV_DRAW_SW_DRAW_UNIT_CNT CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT + #else + #define LV_DRAW_SW_DRAW_UNIT_CNT 0 + #endif + #else + #define LV_DRAW_SW_DRAW_UNIT_CNT 1 + #endif + #endif + + /** Use Arm-2D to accelerate software (sw) rendering. */ + #ifndef LV_USE_DRAW_ARM2D_SYNC + #ifdef CONFIG_LV_USE_DRAW_ARM2D_SYNC + #define LV_USE_DRAW_ARM2D_SYNC CONFIG_LV_USE_DRAW_ARM2D_SYNC + #else + #define LV_USE_DRAW_ARM2D_SYNC 0 + #endif + #endif + + /** Enable native helium assembly to be compiled. */ + #ifndef LV_USE_NATIVE_HELIUM_ASM + #ifdef CONFIG_LV_USE_NATIVE_HELIUM_ASM + #define LV_USE_NATIVE_HELIUM_ASM CONFIG_LV_USE_NATIVE_HELIUM_ASM + #else + #define LV_USE_NATIVE_HELIUM_ASM 0 + #endif + #endif + + /** + * - 0: Use a simple renderer capable of drawing only simple rectangles with gradient, images, text, and straight lines only. + * - 1: Use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too. */ + #ifndef LV_DRAW_SW_COMPLEX + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_COMPLEX + #define LV_DRAW_SW_COMPLEX CONFIG_LV_DRAW_SW_COMPLEX + #else + #define LV_DRAW_SW_COMPLEX 0 + #endif + #else + #define LV_DRAW_SW_COMPLEX 1 + #endif + #endif + + #if LV_DRAW_SW_COMPLEX == 1 + /** Allow buffering some shadow calculation. + * LV_DRAW_SW_SHADOW_CACHE_SIZE is the maximum shadow size to buffer, where shadow size is + * `shadow_width + radius`. Caching has LV_DRAW_SW_SHADOW_CACHE_SIZE^2 RAM cost. */ + #ifndef LV_DRAW_SW_SHADOW_CACHE_SIZE + #ifdef CONFIG_LV_DRAW_SW_SHADOW_CACHE_SIZE + #define LV_DRAW_SW_SHADOW_CACHE_SIZE CONFIG_LV_DRAW_SW_SHADOW_CACHE_SIZE + #else + #define LV_DRAW_SW_SHADOW_CACHE_SIZE 0 + #endif + #endif + + /** Set number of maximally-cached circle data. + * The circumference of 1/4 circle are saved for anti-aliasing. + * `radius * 4` bytes are used per circle (the most often used radiuses are saved). + * - 0: disables caching */ + #ifndef LV_DRAW_SW_CIRCLE_CACHE_SIZE + #ifdef CONFIG_LV_DRAW_SW_CIRCLE_CACHE_SIZE + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE CONFIG_LV_DRAW_SW_CIRCLE_CACHE_SIZE + #else + #define LV_DRAW_SW_CIRCLE_CACHE_SIZE 4 + #endif + #endif + #endif + + #ifndef LV_USE_DRAW_SW_ASM + #ifdef CONFIG_LV_USE_DRAW_SW_ASM + #define LV_USE_DRAW_SW_ASM CONFIG_LV_USE_DRAW_SW_ASM + #else + #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_NONE + #endif + #endif + + #if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #ifndef LV_DRAW_SW_ASM_CUSTOM_INCLUDE + #ifdef CONFIG_LV_DRAW_SW_ASM_CUSTOM_INCLUDE + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE CONFIG_LV_DRAW_SW_ASM_CUSTOM_INCLUDE + #else + #define LV_DRAW_SW_ASM_CUSTOM_INCLUDE "" + #endif + #endif + #endif + + /** Enable drawing complex gradients in software: linear at an angle, radial or conical */ + #ifndef LV_USE_DRAW_SW_COMPLEX_GRADIENTS + #ifdef CONFIG_LV_USE_DRAW_SW_COMPLEX_GRADIENTS + #define LV_USE_DRAW_SW_COMPLEX_GRADIENTS CONFIG_LV_USE_DRAW_SW_COMPLEX_GRADIENTS + #else + #define LV_USE_DRAW_SW_COMPLEX_GRADIENTS 0 + #endif + #endif + +#endif + +/*Use TSi's aka (Think Silicon) NemaGFX */ +#ifndef LV_USE_NEMA_GFX + #ifdef CONFIG_LV_USE_NEMA_GFX + #define LV_USE_NEMA_GFX CONFIG_LV_USE_NEMA_GFX + #else + #define LV_USE_NEMA_GFX 0 + #endif +#endif + +#if LV_USE_NEMA_GFX + /** Select which NemaGFX static library headers to use. Possible options: + * - LV_NEMA_LIB_NONE an alias of LV_NEMA_LIB_M33_REVC + * - LV_NEMA_LIB_M33_REVC + * - LV_NEMA_LIB_M33_NEMAPVG + * - LV_NEMA_LIB_M55 + * - LV_NEMA_LIB_M7 + * You must also take care to link the correct corresponding static library + * in libs/nema_gfx/lib/core/ + */ + #ifndef LV_USE_NEMA_LIB + #ifdef CONFIG_LV_USE_NEMA_LIB + #define LV_USE_NEMA_LIB CONFIG_LV_USE_NEMA_LIB + #else + #define LV_USE_NEMA_LIB LV_NEMA_LIB_NONE + #endif + #endif + + /** Select which NemaGFX HAL to use. Possible options: + * - LV_NEMA_HAL_CUSTOM + * - LV_NEMA_HAL_STM32 */ + #ifndef LV_USE_NEMA_HAL + #ifdef CONFIG_LV_USE_NEMA_HAL + #define LV_USE_NEMA_HAL CONFIG_LV_USE_NEMA_HAL + #else + #define LV_USE_NEMA_HAL LV_NEMA_HAL_CUSTOM + #endif + #endif + #if LV_USE_NEMA_HAL == LV_NEMA_HAL_STM32 + #ifndef LV_NEMA_STM32_HAL_INCLUDE + #ifdef CONFIG_LV_NEMA_STM32_HAL_INCLUDE + #define LV_NEMA_STM32_HAL_INCLUDE CONFIG_LV_NEMA_STM32_HAL_INCLUDE + #else + #define LV_NEMA_STM32_HAL_INCLUDE + #endif + #endif + + /** Set it to a value like __attribute__((section("Nemagfx_Memory_Pool_Buffer"))) + * and define the section in the linker script if you need the GPU memory to + * be, e.g. in a region where accesses will not be cached. + */ + #ifndef LV_NEMA_STM32_HAL_ATTRIBUTE_POOL_MEM + #ifdef CONFIG_LV_NEMA_STM32_HAL_ATTRIBUTE_POOL_MEM + #define LV_NEMA_STM32_HAL_ATTRIBUTE_POOL_MEM CONFIG_LV_NEMA_STM32_HAL_ATTRIBUTE_POOL_MEM + #else + #define LV_NEMA_STM32_HAL_ATTRIBUTE_POOL_MEM + #endif + #endif + #endif + + /*Enable Vector Graphics Operations. Available only if NemaVG library is present*/ + #ifndef LV_USE_NEMA_VG + #ifdef CONFIG_LV_USE_NEMA_VG + #define LV_USE_NEMA_VG CONFIG_LV_USE_NEMA_VG + #else + #define LV_USE_NEMA_VG 0 + #endif + #endif + #if LV_USE_NEMA_VG + /*Define application's resolution used for VG related buffer allocation */ + #ifndef LV_NEMA_GFX_MAX_RESX + #ifdef CONFIG_LV_NEMA_GFX_MAX_RESX + #define LV_NEMA_GFX_MAX_RESX CONFIG_LV_NEMA_GFX_MAX_RESX + #else + #define LV_NEMA_GFX_MAX_RESX 800 + #endif + #endif + #ifndef LV_NEMA_GFX_MAX_RESY + #ifdef CONFIG_LV_NEMA_GFX_MAX_RESY + #define LV_NEMA_GFX_MAX_RESY CONFIG_LV_NEMA_GFX_MAX_RESY + #else + #define LV_NEMA_GFX_MAX_RESY 600 + #endif + #endif + #endif +#endif + +/** Use NXP's PXP on iMX RTxxx platforms. */ +#ifndef LV_USE_PXP + #ifdef CONFIG_LV_USE_PXP + #define LV_USE_PXP CONFIG_LV_USE_PXP + #else + #define LV_USE_PXP 0 + #endif +#endif + +#if LV_USE_PXP + /** Use PXP for drawing.*/ + #ifndef LV_USE_DRAW_PXP + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_DRAW_PXP + #define LV_USE_DRAW_PXP CONFIG_LV_USE_DRAW_PXP + #else + #define LV_USE_DRAW_PXP 0 + #endif + #else + #define LV_USE_DRAW_PXP 1 + #endif + #endif + + /** Use PXP to rotate display.*/ + #ifndef LV_USE_ROTATE_PXP + #ifdef CONFIG_LV_USE_ROTATE_PXP + #define LV_USE_ROTATE_PXP CONFIG_LV_USE_ROTATE_PXP + #else + #define LV_USE_ROTATE_PXP 0 + #endif + #endif + + #if LV_USE_DRAW_PXP && LV_USE_OS + /** Use additional draw thread for PXP processing.*/ + #ifndef LV_USE_PXP_DRAW_THREAD + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_PXP_DRAW_THREAD + #define LV_USE_PXP_DRAW_THREAD CONFIG_LV_USE_PXP_DRAW_THREAD + #else + #define LV_USE_PXP_DRAW_THREAD 0 + #endif + #else + #define LV_USE_PXP_DRAW_THREAD 1 + #endif + #endif + #endif + + /** Enable PXP asserts. */ + #ifndef LV_USE_PXP_ASSERT + #ifdef CONFIG_LV_USE_PXP_ASSERT + #define LV_USE_PXP_ASSERT CONFIG_LV_USE_PXP_ASSERT + #else + #define LV_USE_PXP_ASSERT 0 + #endif + #endif +#endif + +/** Use NXP's G2D on MPU platforms. */ +#ifndef LV_USE_G2D + #ifdef CONFIG_LV_USE_G2D + #define LV_USE_G2D CONFIG_LV_USE_G2D + #else + #define LV_USE_G2D 0 + #endif +#endif + +#if LV_USE_G2D + /** Use G2D for drawing. **/ + #ifndef LV_USE_DRAW_G2D + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_DRAW_G2D + #define LV_USE_DRAW_G2D CONFIG_LV_USE_DRAW_G2D + #else + #define LV_USE_DRAW_G2D 0 + #endif + #else + #define LV_USE_DRAW_G2D 1 + #endif + #endif + + /** Use G2D to rotate display. **/ + #ifndef LV_USE_ROTATE_G2D + #ifdef CONFIG_LV_USE_ROTATE_G2D + #define LV_USE_ROTATE_G2D CONFIG_LV_USE_ROTATE_G2D + #else + #define LV_USE_ROTATE_G2D 0 + #endif + #endif + + /** Maximum number of buffers that can be stored for G2D draw unit. + * Includes the frame buffers and assets. */ + #ifndef LV_G2D_HASH_TABLE_SIZE + #ifdef CONFIG_LV_G2D_HASH_TABLE_SIZE + #define LV_G2D_HASH_TABLE_SIZE CONFIG_LV_G2D_HASH_TABLE_SIZE + #else + #define LV_G2D_HASH_TABLE_SIZE 50 + #endif + #endif + + #if LV_USE_DRAW_G2D && LV_USE_OS + /** Use additional draw thread for G2D processing.*/ + #ifndef LV_USE_G2D_DRAW_THREAD + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_G2D_DRAW_THREAD + #define LV_USE_G2D_DRAW_THREAD CONFIG_LV_USE_G2D_DRAW_THREAD + #else + #define LV_USE_G2D_DRAW_THREAD 0 + #endif + #else + #define LV_USE_G2D_DRAW_THREAD 1 + #endif + #endif + #endif + + /** Enable G2D asserts. */ + #ifndef LV_USE_G2D_ASSERT + #ifdef CONFIG_LV_USE_G2D_ASSERT + #define LV_USE_G2D_ASSERT CONFIG_LV_USE_G2D_ASSERT + #else + #define LV_USE_G2D_ASSERT 0 + #endif + #endif +#endif + +/** Use Renesas Dave2D on RA platforms. */ +#ifndef LV_USE_DRAW_DAVE2D + #ifdef CONFIG_LV_USE_DRAW_DAVE2D + #define LV_USE_DRAW_DAVE2D CONFIG_LV_USE_DRAW_DAVE2D + #else + #define LV_USE_DRAW_DAVE2D 0 + #endif +#endif + +/** Draw using cached SDL textures*/ +#ifndef LV_USE_DRAW_SDL + #ifdef CONFIG_LV_USE_DRAW_SDL + #define LV_USE_DRAW_SDL CONFIG_LV_USE_DRAW_SDL + #else + #define LV_USE_DRAW_SDL 0 + #endif +#endif + +/** Use VG-Lite GPU. */ +#ifndef LV_USE_DRAW_VG_LITE + #ifdef CONFIG_LV_USE_DRAW_VG_LITE + #define LV_USE_DRAW_VG_LITE CONFIG_LV_USE_DRAW_VG_LITE + #else + #define LV_USE_DRAW_VG_LITE 0 + #endif +#endif +#if LV_USE_DRAW_VG_LITE + /** Enable VG-Lite custom external 'gpu_init()' function */ + #ifndef LV_VG_LITE_USE_GPU_INIT + #ifdef CONFIG_LV_VG_LITE_USE_GPU_INIT + #define LV_VG_LITE_USE_GPU_INIT CONFIG_LV_VG_LITE_USE_GPU_INIT + #else + #define LV_VG_LITE_USE_GPU_INIT 0 + #endif + #endif + + /** Enable VG-Lite assert. */ + #ifndef LV_VG_LITE_USE_ASSERT + #ifdef CONFIG_LV_VG_LITE_USE_ASSERT + #define LV_VG_LITE_USE_ASSERT CONFIG_LV_VG_LITE_USE_ASSERT + #else + #define LV_VG_LITE_USE_ASSERT 0 + #endif + #endif + + /** VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */ + #ifndef LV_VG_LITE_FLUSH_MAX_COUNT + #ifdef CONFIG_LV_VG_LITE_FLUSH_MAX_COUNT + #define LV_VG_LITE_FLUSH_MAX_COUNT CONFIG_LV_VG_LITE_FLUSH_MAX_COUNT + #else + #define LV_VG_LITE_FLUSH_MAX_COUNT 8 + #endif + #endif + + /** Enable border to simulate shadow. + * NOTE: which usually improves performance, + * but does not guarantee the same rendering quality as the software. */ + #ifndef LV_VG_LITE_USE_BOX_SHADOW + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_VG_LITE_USE_BOX_SHADOW + #define LV_VG_LITE_USE_BOX_SHADOW CONFIG_LV_VG_LITE_USE_BOX_SHADOW + #else + #define LV_VG_LITE_USE_BOX_SHADOW 0 + #endif + #else + #define LV_VG_LITE_USE_BOX_SHADOW 1 + #endif + #endif + + /** VG-Lite gradient maximum cache number. + * @note The memory usage of a single gradient image is 4K bytes. */ + #ifndef LV_VG_LITE_GRAD_CACHE_CNT + #ifdef CONFIG_LV_VG_LITE_GRAD_CACHE_CNT + #define LV_VG_LITE_GRAD_CACHE_CNT CONFIG_LV_VG_LITE_GRAD_CACHE_CNT + #else + #define LV_VG_LITE_GRAD_CACHE_CNT 32 + #endif + #endif + + /** VG-Lite stroke maximum cache number. */ + #ifndef LV_VG_LITE_STROKE_CACHE_CNT + #ifdef CONFIG_LV_VG_LITE_STROKE_CACHE_CNT + #define LV_VG_LITE_STROKE_CACHE_CNT CONFIG_LV_VG_LITE_STROKE_CACHE_CNT + #else + #define LV_VG_LITE_STROKE_CACHE_CNT 32 + #endif + #endif + + /** VG-Lite unaligned bitmap font maximum cache number. */ + #ifndef LV_VG_LITE_BITMAP_FONT_CACHE_CNT + #ifdef CONFIG_LV_VG_LITE_BITMAP_FONT_CACHE_CNT + #define LV_VG_LITE_BITMAP_FONT_CACHE_CNT CONFIG_LV_VG_LITE_BITMAP_FONT_CACHE_CNT + #else + #define LV_VG_LITE_BITMAP_FONT_CACHE_CNT 256 + #endif + #endif + + /** Remove VLC_OP_CLOSE path instruction (Workaround for NXP) **/ + #ifndef LV_VG_LITE_DISABLE_VLC_OP_CLOSE + #ifdef CONFIG_LV_VG_LITE_DISABLE_VLC_OP_CLOSE + #define LV_VG_LITE_DISABLE_VLC_OP_CLOSE CONFIG_LV_VG_LITE_DISABLE_VLC_OP_CLOSE + #else + #define LV_VG_LITE_DISABLE_VLC_OP_CLOSE 0 + #endif + #endif + + /** Disable blit rectangular offset to resolve certain hardware errors. */ + #ifndef LV_VG_LITE_DISABLE_BLIT_RECT_OFFSET + #ifdef CONFIG_LV_VG_LITE_DISABLE_BLIT_RECT_OFFSET + #define LV_VG_LITE_DISABLE_BLIT_RECT_OFFSET CONFIG_LV_VG_LITE_DISABLE_BLIT_RECT_OFFSET + #else + #define LV_VG_LITE_DISABLE_BLIT_RECT_OFFSET 0 + #endif + #endif + + /** Disable linear gradient extension for some older versions of drivers. */ + #ifndef LV_VG_LITE_DISABLE_LINEAR_GRADIENT_EXT + #ifdef CONFIG_LV_VG_LITE_DISABLE_LINEAR_GRADIENT_EXT + #define LV_VG_LITE_DISABLE_LINEAR_GRADIENT_EXT CONFIG_LV_VG_LITE_DISABLE_LINEAR_GRADIENT_EXT + #else + #define LV_VG_LITE_DISABLE_LINEAR_GRADIENT_EXT 0 + #endif + #endif + + /** Maximum path dump print length (in points) */ + #ifndef LV_VG_LITE_PATH_DUMP_MAX_LEN + #ifdef CONFIG_LV_VG_LITE_PATH_DUMP_MAX_LEN + #define LV_VG_LITE_PATH_DUMP_MAX_LEN CONFIG_LV_VG_LITE_PATH_DUMP_MAX_LEN + #else + #define LV_VG_LITE_PATH_DUMP_MAX_LEN 1000 + #endif + #endif + + /** Enable usage of the LVGL's built-in vg_lite driver */ + #ifndef LV_USE_VG_LITE_DRIVER + #ifdef CONFIG_LV_USE_VG_LITE_DRIVER + #define LV_USE_VG_LITE_DRIVER CONFIG_LV_USE_VG_LITE_DRIVER + #else + #define LV_USE_VG_LITE_DRIVER 0 + #endif + #endif + #if LV_USE_VG_LITE_DRIVER + /** Used to pick the correct GPU series folder valid options are gc255, gc355 and gc555*/ + #ifndef LV_VG_LITE_HAL_GPU_SERIES + #ifdef CONFIG_LV_VG_LITE_HAL_GPU_SERIES + #define LV_VG_LITE_HAL_GPU_SERIES CONFIG_LV_VG_LITE_HAL_GPU_SERIES + #else + #define LV_VG_LITE_HAL_GPU_SERIES gc255 + #endif + #endif + + /** Used to pick the correct GPU revision header it depends on the vendor */ + #ifndef LV_VG_LITE_HAL_GPU_REVISION + #ifdef CONFIG_LV_VG_LITE_HAL_GPU_REVISION + #define LV_VG_LITE_HAL_GPU_REVISION CONFIG_LV_VG_LITE_HAL_GPU_REVISION + #else + #define LV_VG_LITE_HAL_GPU_REVISION 0x40 + #endif + #endif + + /** Base memory address of the GPU IP it depends on SoC, + * default value is for NXP based devices */ + #ifndef LV_VG_LITE_HAL_GPU_BASE_ADDRESS + #ifdef CONFIG_LV_VG_LITE_HAL_GPU_BASE_ADDRESS + #define LV_VG_LITE_HAL_GPU_BASE_ADDRESS CONFIG_LV_VG_LITE_HAL_GPU_BASE_ADDRESS + #else + #define LV_VG_LITE_HAL_GPU_BASE_ADDRESS 0x40240000 + #endif + #endif + #endif /*LV_USE_VG_LITE_DRIVER*/ + + /** Use ThorVG (a software vector library) as VG-Lite driver to allow testing VGLite on PC + * Requires: LV_USE_THORVG_INTERNAL or LV_USE_THORVG_EXTERNAL */ + #ifndef LV_USE_VG_LITE_THORVG + #ifdef CONFIG_LV_USE_VG_LITE_THORVG + #define LV_USE_VG_LITE_THORVG CONFIG_LV_USE_VG_LITE_THORVG + #else + #define LV_USE_VG_LITE_THORVG 0 + #endif + #endif + #if LV_USE_VG_LITE_THORVG + /** Enable LVGL's blend mode support */ + #ifndef LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT + #ifdef CONFIG_LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT CONFIG_LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT + #else + #define LV_VG_LITE_THORVG_LVGL_BLEND_SUPPORT 0 + #endif + #endif + + /** Enable YUV color format support */ + #ifndef LV_VG_LITE_THORVG_YUV_SUPPORT + #ifdef CONFIG_LV_VG_LITE_THORVG_YUV_SUPPORT + #define LV_VG_LITE_THORVG_YUV_SUPPORT CONFIG_LV_VG_LITE_THORVG_YUV_SUPPORT + #else + #define LV_VG_LITE_THORVG_YUV_SUPPORT 0 + #endif + #endif + + /** Enable Linear gradient extension support */ + #ifndef LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT + #ifdef CONFIG_LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT + #define LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT CONFIG_LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT + #else + #define LV_VG_LITE_THORVG_LINEAR_GRADIENT_EXT_SUPPORT 0 + #endif + #endif + + /** Enable alignment on 16 pixels */ + #ifndef LV_VG_LITE_THORVG_16PIXELS_ALIGN + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_VG_LITE_THORVG_16PIXELS_ALIGN + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN CONFIG_LV_VG_LITE_THORVG_16PIXELS_ALIGN + #else + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 0 + #endif + #else + #define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1 + #endif + #endif + + /** Buffer address alignment */ + #ifndef LV_VG_LITE_THORVG_BUF_ADDR_ALIGN + #ifdef CONFIG_LV_VG_LITE_THORVG_BUF_ADDR_ALIGN + #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN CONFIG_LV_VG_LITE_THORVG_BUF_ADDR_ALIGN + #else + #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64 + #endif + #endif + + /** Enable multi-thread render */ + #ifndef LV_VG_LITE_THORVG_THREAD_RENDER + #ifdef CONFIG_LV_VG_LITE_THORVG_THREAD_RENDER + #define LV_VG_LITE_THORVG_THREAD_RENDER CONFIG_LV_VG_LITE_THORVG_THREAD_RENDER + #else + #define LV_VG_LITE_THORVG_THREAD_RENDER 0 + #endif + #endif + #endif /*LV_USE_VG_LITE_THORVG*/ +#endif + +/** Accelerate blends, fills, etc. with STM32 DMA2D */ +#ifndef LV_USE_DRAW_DMA2D + #ifdef CONFIG_LV_USE_DRAW_DMA2D + #define LV_USE_DRAW_DMA2D CONFIG_LV_USE_DRAW_DMA2D + #else + #define LV_USE_DRAW_DMA2D 0 + #endif +#endif +#if LV_USE_DRAW_DMA2D + #ifndef LV_DRAW_DMA2D_HAL_INCLUDE + #ifdef CONFIG_LV_DRAW_DMA2D_HAL_INCLUDE + #define LV_DRAW_DMA2D_HAL_INCLUDE CONFIG_LV_DRAW_DMA2D_HAL_INCLUDE + #else + #define LV_DRAW_DMA2D_HAL_INCLUDE "stm32h7xx_hal.h" + #endif + #endif + + /* if enabled, the user is required to call `lv_draw_dma2d_transfer_complete_interrupt_handler` + * upon receiving the DMA2D global interrupt + */ + #ifndef LV_USE_DRAW_DMA2D_INTERRUPT + #ifdef CONFIG_LV_USE_DRAW_DMA2D_INTERRUPT + #define LV_USE_DRAW_DMA2D_INTERRUPT CONFIG_LV_USE_DRAW_DMA2D_INTERRUPT + #else + #define LV_USE_DRAW_DMA2D_INTERRUPT 0 + #endif + #endif +#endif + +/** Draw using cached OpenGLES textures. Requires LV_USE_OPENGLES */ +#ifndef LV_USE_DRAW_OPENGLES + #ifdef CONFIG_LV_USE_DRAW_OPENGLES + #define LV_USE_DRAW_OPENGLES CONFIG_LV_USE_DRAW_OPENGLES + #else + #define LV_USE_DRAW_OPENGLES 0 + #endif +#endif +#if LV_USE_DRAW_OPENGLES + #ifndef LV_DRAW_OPENGLES_TEXTURE_CACHE_COUNT + #ifdef CONFIG_LV_DRAW_OPENGLES_TEXTURE_CACHE_COUNT + #define LV_DRAW_OPENGLES_TEXTURE_CACHE_COUNT CONFIG_LV_DRAW_OPENGLES_TEXTURE_CACHE_COUNT + #else + #define LV_DRAW_OPENGLES_TEXTURE_CACHE_COUNT 64 + #endif + #endif +#endif + +/** Draw using espressif PPA accelerator */ +#ifndef LV_USE_PPA + #ifdef CONFIG_LV_USE_PPA + #define LV_USE_PPA CONFIG_LV_USE_PPA + #else + #define LV_USE_PPA 0 + #endif +#endif +#if LV_USE_PPA + #ifndef LV_USE_PPA_IMG + #ifdef CONFIG_LV_USE_PPA_IMG + #define LV_USE_PPA_IMG CONFIG_LV_USE_PPA_IMG + #else + #define LV_USE_PPA_IMG 0 + #endif + #endif + #ifndef LV_PPA_BURST_LENGTH + #ifdef CONFIG_LV_PPA_BURST_LENGTH + #define LV_PPA_BURST_LENGTH CONFIG_LV_PPA_BURST_LENGTH + #else + #define LV_PPA_BURST_LENGTH 128 + #endif + #endif +#endif + +/* Use EVE FT81X GPU. */ +#ifndef LV_USE_DRAW_EVE + #ifdef CONFIG_LV_USE_DRAW_EVE + #define LV_USE_DRAW_EVE CONFIG_LV_USE_DRAW_EVE + #else + #define LV_USE_DRAW_EVE 0 + #endif +#endif +#if LV_USE_DRAW_EVE + /* EVE_GEN value: 2, 3, or 4 */ + #ifndef LV_DRAW_EVE_EVE_GENERATION + #ifdef CONFIG_LV_DRAW_EVE_EVE_GENERATION + #define LV_DRAW_EVE_EVE_GENERATION CONFIG_LV_DRAW_EVE_EVE_GENERATION + #else + #define LV_DRAW_EVE_EVE_GENERATION 4 + #endif + #endif + + /* The maximum number of bytes to buffer before a single SPI transmission. + * Set it to 0 to disable write buffering. + */ + #ifndef LV_DRAW_EVE_WRITE_BUFFER_SIZE + #ifdef CONFIG_LV_DRAW_EVE_WRITE_BUFFER_SIZE + #define LV_DRAW_EVE_WRITE_BUFFER_SIZE CONFIG_LV_DRAW_EVE_WRITE_BUFFER_SIZE + #else + #define LV_DRAW_EVE_WRITE_BUFFER_SIZE 2048 + #endif + #endif +#endif + +/** Use NanoVG Renderer + * - Requires LV_USE_NANOVG, LV_USE_MATRIX. + */ +#ifndef LV_USE_DRAW_NANOVG + #ifdef CONFIG_LV_USE_DRAW_NANOVG + #define LV_USE_DRAW_NANOVG CONFIG_LV_USE_DRAW_NANOVG + #else + #define LV_USE_DRAW_NANOVG 0 + #endif +#endif +#if LV_USE_DRAW_NANOVG + /** Select OpenGL backend for NanoVG: + * - LV_NANOVG_BACKEND_GL2: OpenGL 2.0 + * - LV_NANOVG_BACKEND_GL3: OpenGL 3.0+ + * - LV_NANOVG_BACKEND_GLES2: OpenGL ES 2.0 + * - LV_NANOVG_BACKEND_GLES3: OpenGL ES 3.0+ + */ + #ifndef LV_NANOVG_BACKEND + #ifdef CONFIG_LV_NANOVG_BACKEND + #define LV_NANOVG_BACKEND CONFIG_LV_NANOVG_BACKEND + #else + #define LV_NANOVG_BACKEND LV_NANOVG_BACKEND_GLES2 + #endif + #endif + + /** Draw image texture cache count. */ + #ifndef LV_NANOVG_IMAGE_CACHE_CNT + #ifdef CONFIG_LV_NANOVG_IMAGE_CACHE_CNT + #define LV_NANOVG_IMAGE_CACHE_CNT CONFIG_LV_NANOVG_IMAGE_CACHE_CNT + #else + #define LV_NANOVG_IMAGE_CACHE_CNT 128 + #endif + #endif + + /** Draw letter texture cache count. */ + #ifndef LV_NANOVG_LETTER_CACHE_CNT + #ifdef CONFIG_LV_NANOVG_LETTER_CACHE_CNT + #define LV_NANOVG_LETTER_CACHE_CNT CONFIG_LV_NANOVG_LETTER_CACHE_CNT + #else + #define LV_NANOVG_LETTER_CACHE_CNT 512 + #endif + #endif +#endif + +/*======================= + * FEATURE CONFIGURATION + *=======================*/ + +/*------------- + * Logging + *-----------*/ + +/** Enable log module */ +#ifndef LV_USE_LOG + #ifdef CONFIG_LV_USE_LOG + #define LV_USE_LOG CONFIG_LV_USE_LOG + #else + #define LV_USE_LOG 0 + #endif +#endif +#if LV_USE_LOG + /** Set value to one of the following levels of logging detail: + * - LV_LOG_LEVEL_TRACE Log detailed information. + * - LV_LOG_LEVEL_INFO Log important events. + * - LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem. + * - LV_LOG_LEVEL_ERROR Log only critical issues, when system may fail. + * - LV_LOG_LEVEL_USER Log only custom log messages added by the user. + * - LV_LOG_LEVEL_NONE Do not log anything. */ + #ifndef LV_LOG_LEVEL + #ifdef CONFIG_LV_LOG_LEVEL + #define LV_LOG_LEVEL CONFIG_LV_LOG_LEVEL + #else + #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN + #endif + #endif + + /** - 1: Print log with 'printf'; + * - 0: User needs to register a callback with `lv_log_register_print_cb()`. */ + #ifndef LV_LOG_PRINTF + #ifdef CONFIG_LV_LOG_PRINTF + #define LV_LOG_PRINTF CONFIG_LV_LOG_PRINTF + #else + #define LV_LOG_PRINTF 0 + #endif + #endif + + /** Set callback to print logs. + * E.g `my_print`. The prototype should be `void my_print(lv_log_level_t level, const char * buf)`. + * Can be overwritten by `lv_log_register_print_cb`. */ + //#define LV_LOG_PRINT_CB + + /** - 1: Enable printing timestamp; + * - 0: Disable printing timestamp. */ + #ifndef LV_LOG_USE_TIMESTAMP + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_USE_TIMESTAMP + #define LV_LOG_USE_TIMESTAMP CONFIG_LV_LOG_USE_TIMESTAMP + #else + #define LV_LOG_USE_TIMESTAMP 0 + #endif + #else + #define LV_LOG_USE_TIMESTAMP 1 + #endif + #endif + + /** - 1: Print file and line number of the log; + * - 0: Do not print file and line number of the log. */ + #ifndef LV_LOG_USE_FILE_LINE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_USE_FILE_LINE + #define LV_LOG_USE_FILE_LINE CONFIG_LV_LOG_USE_FILE_LINE + #else + #define LV_LOG_USE_FILE_LINE 0 + #endif + #else + #define LV_LOG_USE_FILE_LINE 1 + #endif + #endif + + /* Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs. */ + #ifndef LV_LOG_TRACE_MEM + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_MEM + #define LV_LOG_TRACE_MEM CONFIG_LV_LOG_TRACE_MEM + #else + #define LV_LOG_TRACE_MEM 0 + #endif + #else + #define LV_LOG_TRACE_MEM 1 /**< Enable/disable trace logs in memory operations. */ + #endif + #endif + #ifndef LV_LOG_TRACE_TIMER + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_TIMER + #define LV_LOG_TRACE_TIMER CONFIG_LV_LOG_TRACE_TIMER + #else + #define LV_LOG_TRACE_TIMER 0 + #endif + #else + #define LV_LOG_TRACE_TIMER 1 /**< Enable/disable trace logs in timer operations. */ + #endif + #endif + #ifndef LV_LOG_TRACE_INDEV + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_INDEV + #define LV_LOG_TRACE_INDEV CONFIG_LV_LOG_TRACE_INDEV + #else + #define LV_LOG_TRACE_INDEV 0 + #endif + #else + #define LV_LOG_TRACE_INDEV 1 /**< Enable/disable trace logs in input device operations. */ + #endif + #endif + #ifndef LV_LOG_TRACE_DISP_REFR + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_DISP_REFR + #define LV_LOG_TRACE_DISP_REFR CONFIG_LV_LOG_TRACE_DISP_REFR + #else + #define LV_LOG_TRACE_DISP_REFR 0 + #endif + #else + #define LV_LOG_TRACE_DISP_REFR 1 /**< Enable/disable trace logs in display re-draw operations. */ + #endif + #endif + #ifndef LV_LOG_TRACE_EVENT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_EVENT + #define LV_LOG_TRACE_EVENT CONFIG_LV_LOG_TRACE_EVENT + #else + #define LV_LOG_TRACE_EVENT 0 + #endif + #else + #define LV_LOG_TRACE_EVENT 1 /**< Enable/disable trace logs in event dispatch logic. */ + #endif + #endif + #ifndef LV_LOG_TRACE_OBJ_CREATE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_OBJ_CREATE + #define LV_LOG_TRACE_OBJ_CREATE CONFIG_LV_LOG_TRACE_OBJ_CREATE + #else + #define LV_LOG_TRACE_OBJ_CREATE 0 + #endif + #else + #define LV_LOG_TRACE_OBJ_CREATE 1 /**< Enable/disable trace logs in object creation (core `obj` creation plus every widget). */ + #endif + #endif + #ifndef LV_LOG_TRACE_LAYOUT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_LAYOUT + #define LV_LOG_TRACE_LAYOUT CONFIG_LV_LOG_TRACE_LAYOUT + #else + #define LV_LOG_TRACE_LAYOUT 0 + #endif + #else + #define LV_LOG_TRACE_LAYOUT 1 /**< Enable/disable trace logs in flex- and grid-layout operations. */ + #endif + #endif + #ifndef LV_LOG_TRACE_ANIM + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_ANIM + #define LV_LOG_TRACE_ANIM CONFIG_LV_LOG_TRACE_ANIM + #else + #define LV_LOG_TRACE_ANIM 0 + #endif + #else + #define LV_LOG_TRACE_ANIM 1 /**< Enable/disable trace logs in animation logic. */ + #endif + #endif + #ifndef LV_LOG_TRACE_CACHE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LOG_TRACE_CACHE + #define LV_LOG_TRACE_CACHE CONFIG_LV_LOG_TRACE_CACHE + #else + #define LV_LOG_TRACE_CACHE 0 + #endif + #else + #define LV_LOG_TRACE_CACHE 1 /**< Enable/disable trace logs in cache operations. */ + #endif + #endif +#endif /*LV_USE_LOG*/ + +/*------------- + * Asserts + *-----------*/ + +/* Enable assertion failures if an operation fails or invalid data is found. + * If LV_USE_LOG is enabled, an error message will be printed on failure. */ +#ifndef LV_USE_ASSERT_NULL + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ASSERT_NULL + #define LV_USE_ASSERT_NULL CONFIG_LV_USE_ASSERT_NULL + #else + #define LV_USE_ASSERT_NULL 0 + #endif + #else + #define LV_USE_ASSERT_NULL 1 /**< Check if the parameter is NULL. (Very fast, recommended) */ + #endif +#endif +#ifndef LV_USE_ASSERT_MALLOC + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ASSERT_MALLOC + #define LV_USE_ASSERT_MALLOC CONFIG_LV_USE_ASSERT_MALLOC + #else + #define LV_USE_ASSERT_MALLOC 0 + #endif + #else + #define LV_USE_ASSERT_MALLOC 1 /**< Checks is the memory is successfully allocated or no. (Very fast, recommended) */ + #endif +#endif +#ifndef LV_USE_ASSERT_STYLE + #ifdef CONFIG_LV_USE_ASSERT_STYLE + #define LV_USE_ASSERT_STYLE CONFIG_LV_USE_ASSERT_STYLE + #else + #define LV_USE_ASSERT_STYLE 0 /**< Check if the styles are properly initialized. (Very fast, recommended) */ + #endif +#endif +#ifndef LV_USE_ASSERT_MEM_INTEGRITY + #ifdef CONFIG_LV_USE_ASSERT_MEM_INTEGRITY + #define LV_USE_ASSERT_MEM_INTEGRITY CONFIG_LV_USE_ASSERT_MEM_INTEGRITY + #else + #define LV_USE_ASSERT_MEM_INTEGRITY 0 /**< Check the integrity of `lv_mem` after critical operations. (Slow) */ + #endif +#endif +#ifndef LV_USE_ASSERT_OBJ + #ifdef CONFIG_LV_USE_ASSERT_OBJ + #define LV_USE_ASSERT_OBJ CONFIG_LV_USE_ASSERT_OBJ + #else + #define LV_USE_ASSERT_OBJ 0 /**< Check the object's type and existence (e.g. not deleted). (Slow) */ + #endif +#endif + +/** Add a custom handler when assert happens e.g. to restart MCU. */ +#ifndef LV_ASSERT_HANDLER_INCLUDE + #ifdef CONFIG_LV_ASSERT_HANDLER_INCLUDE + #define LV_ASSERT_HANDLER_INCLUDE CONFIG_LV_ASSERT_HANDLER_INCLUDE + #else + #define LV_ASSERT_HANDLER_INCLUDE + #endif +#endif +#ifndef LV_ASSERT_HANDLER + #ifdef CONFIG_LV_ASSERT_HANDLER + #define LV_ASSERT_HANDLER CONFIG_LV_ASSERT_HANDLER + #else + #define LV_ASSERT_HANDLER while(1); /**< Halt by default */ + #endif +#endif + +/*------------- + * Debug + *-----------*/ + +/** 1: Draw random colored rectangles over the redrawn areas. */ +#ifndef LV_USE_REFR_DEBUG + #ifdef CONFIG_LV_USE_REFR_DEBUG + #define LV_USE_REFR_DEBUG CONFIG_LV_USE_REFR_DEBUG + #else + #define LV_USE_REFR_DEBUG 0 + #endif +#endif + +/** 1: Draw a red overlay for ARGB layers and a green overlay for RGB layers*/ +#ifndef LV_USE_LAYER_DEBUG + #ifdef CONFIG_LV_USE_LAYER_DEBUG + #define LV_USE_LAYER_DEBUG CONFIG_LV_USE_LAYER_DEBUG + #else + #define LV_USE_LAYER_DEBUG 0 + #endif +#endif + +/** 1: Adds the following behaviors for debugging: + * - Draw overlays with different colors for each draw_unit's tasks. + * - Draw index number of draw unit on white background. + * - For layers, draws index number of draw unit on black background. */ +#ifndef LV_USE_PARALLEL_DRAW_DEBUG + #ifdef CONFIG_LV_USE_PARALLEL_DRAW_DEBUG + #define LV_USE_PARALLEL_DRAW_DEBUG CONFIG_LV_USE_PARALLEL_DRAW_DEBUG + #else + #define LV_USE_PARALLEL_DRAW_DEBUG 0 + #endif +#endif + +/*------------- + * Others + *-----------*/ + +#ifndef LV_ENABLE_GLOBAL_CUSTOM + #ifdef CONFIG_LV_ENABLE_GLOBAL_CUSTOM + #define LV_ENABLE_GLOBAL_CUSTOM CONFIG_LV_ENABLE_GLOBAL_CUSTOM + #else + #define LV_ENABLE_GLOBAL_CUSTOM 0 + #endif +#endif +#if LV_ENABLE_GLOBAL_CUSTOM + /** Header to include for custom 'lv_global' function" */ + #ifndef LV_GLOBAL_CUSTOM_INCLUDE + #ifdef CONFIG_LV_GLOBAL_CUSTOM_INCLUDE + #define LV_GLOBAL_CUSTOM_INCLUDE CONFIG_LV_GLOBAL_CUSTOM_INCLUDE + #else + #define LV_GLOBAL_CUSTOM_INCLUDE + #endif + #endif +#endif + +/** Default cache size in bytes. + * Used by image decoders such as `lv_lodepng` to keep the decoded image in memory. + * If size is not set to 0, the decoder will fail to decode when the cache is full. + * If size is 0, the cache function is not enabled and the decoded memory will be + * released immediately after use. */ +#ifndef LV_CACHE_DEF_SIZE + #ifdef CONFIG_LV_CACHE_DEF_SIZE + #define LV_CACHE_DEF_SIZE CONFIG_LV_CACHE_DEF_SIZE + #else + #define LV_CACHE_DEF_SIZE 0 + #endif +#endif + +/** Default number of image header cache entries. The cache is used to store the headers of images + * The main logic is like `LV_CACHE_DEF_SIZE` but for image headers. */ +#ifndef LV_IMAGE_HEADER_CACHE_DEF_CNT + #ifdef CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT + #define LV_IMAGE_HEADER_CACHE_DEF_CNT CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT + #else + #define LV_IMAGE_HEADER_CACHE_DEF_CNT 0 + #endif +#endif + +/** Number of stops allowed per gradient. Increase this to allow more stops. + * This adds (sizeof(lv_color_t) + 1) bytes per additional stop. */ +#ifndef LV_GRADIENT_MAX_STOPS + #ifdef CONFIG_LV_GRADIENT_MAX_STOPS + #define LV_GRADIENT_MAX_STOPS CONFIG_LV_GRADIENT_MAX_STOPS + #else + #define LV_GRADIENT_MAX_STOPS 2 + #endif +#endif + +/** Adjust color mix functions rounding. GPUs might calculate color mix (blending) differently. + * - 0: round down, + * - 64: round up from x.75, + * - 128: round up from half, + * - 192: round up from x.25, + * - 254: round up */ +#ifndef LV_COLOR_MIX_ROUND_OFS + #ifdef CONFIG_LV_COLOR_MIX_ROUND_OFS + #define LV_COLOR_MIX_ROUND_OFS CONFIG_LV_COLOR_MIX_ROUND_OFS + #else + #define LV_COLOR_MIX_ROUND_OFS 0 + #endif +#endif + +/** Add 2 x 32-bit variables to each `lv_obj_t` to speed up getting style properties */ +#ifndef LV_OBJ_STYLE_CACHE + #ifdef CONFIG_LV_OBJ_STYLE_CACHE + #define LV_OBJ_STYLE_CACHE CONFIG_LV_OBJ_STYLE_CACHE + #else + #define LV_OBJ_STYLE_CACHE 0 + #endif +#endif + +/** Add `id` field to `lv_obj_t` */ +#ifndef LV_USE_OBJ_ID + #ifdef CONFIG_LV_USE_OBJ_ID + #define LV_USE_OBJ_ID CONFIG_LV_USE_OBJ_ID + #else + #define LV_USE_OBJ_ID 0 + #endif +#endif + +/** Enable support widget names*/ +#ifndef LV_USE_OBJ_NAME + #ifdef CONFIG_LV_USE_OBJ_NAME + #define LV_USE_OBJ_NAME CONFIG_LV_USE_OBJ_NAME + #else + #define LV_USE_OBJ_NAME 0 + #endif +#endif + +/** Automatically assign an ID when obj is created */ +#ifndef LV_OBJ_ID_AUTO_ASSIGN + #ifdef CONFIG_LV_OBJ_ID_AUTO_ASSIGN + #define LV_OBJ_ID_AUTO_ASSIGN CONFIG_LV_OBJ_ID_AUTO_ASSIGN + #else + #define LV_OBJ_ID_AUTO_ASSIGN LV_USE_OBJ_ID + #endif +#endif + +/** Use builtin obj ID handler functions: +* - lv_obj_assign_id: Called when a widget is created. Use a separate counter for each widget class as an ID. +* - lv_obj_id_compare: Compare the ID to decide if it matches with a requested value. +* - lv_obj_stringify_id: Return string-ified identifier, e.g. "button3". +* - lv_obj_free_id: Does nothing, as there is no memory allocation for the ID. +* When disabled these functions needs to be implemented by the user.*/ +#ifndef LV_USE_OBJ_ID_BUILTIN + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_OBJ_ID_BUILTIN + #define LV_USE_OBJ_ID_BUILTIN CONFIG_LV_USE_OBJ_ID_BUILTIN + #else + #define LV_USE_OBJ_ID_BUILTIN 0 + #endif + #else + #define LV_USE_OBJ_ID_BUILTIN 1 + #endif +#endif + +/** Use obj property set/get API. */ +#ifndef LV_USE_OBJ_PROPERTY + #ifdef CONFIG_LV_USE_OBJ_PROPERTY + #define LV_USE_OBJ_PROPERTY CONFIG_LV_USE_OBJ_PROPERTY + #else + #define LV_USE_OBJ_PROPERTY 0 + #endif +#endif + +/** Enable property name support. */ +#ifndef LV_USE_OBJ_PROPERTY_NAME + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_OBJ_PROPERTY_NAME + #define LV_USE_OBJ_PROPERTY_NAME CONFIG_LV_USE_OBJ_PROPERTY_NAME + #else + #define LV_USE_OBJ_PROPERTY_NAME 0 + #endif + #else + #define LV_USE_OBJ_PROPERTY_NAME 1 + #endif +#endif + +/* Enable the multi-touch gesture recognition feature */ +/* Gesture recognition requires the use of floats */ +#ifndef LV_USE_GESTURE_RECOGNITION + #ifdef CONFIG_LV_USE_GESTURE_RECOGNITION + #define LV_USE_GESTURE_RECOGNITION CONFIG_LV_USE_GESTURE_RECOGNITION + #else + #define LV_USE_GESTURE_RECOGNITION 0 + #endif +#endif + +/*===================== + * COMPILER SETTINGS + *====================*/ + +/** For big endian systems set to 1 */ +#ifndef LV_BIG_ENDIAN_SYSTEM + #ifdef CONFIG_LV_BIG_ENDIAN_SYSTEM + #define LV_BIG_ENDIAN_SYSTEM CONFIG_LV_BIG_ENDIAN_SYSTEM + #else + #define LV_BIG_ENDIAN_SYSTEM 0 + #endif +#endif + +/** Define a custom attribute for `lv_tick_inc` function */ +#ifndef LV_ATTRIBUTE_TICK_INC + #ifdef CONFIG_LV_ATTRIBUTE_TICK_INC + #define LV_ATTRIBUTE_TICK_INC CONFIG_LV_ATTRIBUTE_TICK_INC + #else + #define LV_ATTRIBUTE_TICK_INC + #endif +#endif + +/** Define a custom attribute for `lv_timer_handler` function */ +#ifndef LV_ATTRIBUTE_TIMER_HANDLER + #ifdef CONFIG_LV_ATTRIBUTE_TIMER_HANDLER + #define LV_ATTRIBUTE_TIMER_HANDLER CONFIG_LV_ATTRIBUTE_TIMER_HANDLER + #else + #define LV_ATTRIBUTE_TIMER_HANDLER + #endif +#endif + +/** Define a custom attribute for `lv_display_flush_ready` function */ +#ifndef LV_ATTRIBUTE_FLUSH_READY + #ifdef CONFIG_LV_ATTRIBUTE_FLUSH_READY + #define LV_ATTRIBUTE_FLUSH_READY CONFIG_LV_ATTRIBUTE_FLUSH_READY + #else + #define LV_ATTRIBUTE_FLUSH_READY + #endif +#endif + +/** Align VG_LITE buffers on this number of bytes. + * @note vglite_src_buf_aligned() uses this value to validate alignment of passed buffer pointers. */ +#ifndef LV_ATTRIBUTE_MEM_ALIGN_SIZE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE + #define LV_ATTRIBUTE_MEM_ALIGN_SIZE CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE + #else + #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 0 + #endif + #else + #define LV_ATTRIBUTE_MEM_ALIGN_SIZE 1 + #endif +#endif + +/** Will be added where memory needs to be aligned (with -Os data might not be aligned to boundary by default). + * E.g. __attribute__((aligned(4)))*/ +#ifndef LV_ATTRIBUTE_MEM_ALIGN + #ifdef CONFIG_LV_ATTRIBUTE_MEM_ALIGN + #define LV_ATTRIBUTE_MEM_ALIGN CONFIG_LV_ATTRIBUTE_MEM_ALIGN + #else + #define LV_ATTRIBUTE_MEM_ALIGN + #endif +#endif + +/** Attribute to mark large constant arrays, for example for font bitmaps */ +#ifndef LV_ATTRIBUTE_LARGE_CONST + #ifdef CONFIG_LV_ATTRIBUTE_LARGE_CONST + #define LV_ATTRIBUTE_LARGE_CONST CONFIG_LV_ATTRIBUTE_LARGE_CONST + #else + #define LV_ATTRIBUTE_LARGE_CONST + #endif +#endif + +/** Compiler prefix for a large array declaration in RAM */ +#ifndef LV_ATTRIBUTE_LARGE_RAM_ARRAY + #ifdef CONFIG_LV_ATTRIBUTE_LARGE_RAM_ARRAY + #define LV_ATTRIBUTE_LARGE_RAM_ARRAY CONFIG_LV_ATTRIBUTE_LARGE_RAM_ARRAY + #else + #define LV_ATTRIBUTE_LARGE_RAM_ARRAY + #endif +#endif + +/** Place performance critical functions into a faster memory (e.g RAM) */ +#ifndef LV_ATTRIBUTE_FAST_MEM + #ifdef CONFIG_LV_ATTRIBUTE_FAST_MEM + #define LV_ATTRIBUTE_FAST_MEM CONFIG_LV_ATTRIBUTE_FAST_MEM + #else + #define LV_ATTRIBUTE_FAST_MEM + #endif +#endif + +/** Export integer constant to binding. This macro is used with constants in the form of LV_ that + * should also appear on LVGL binding API such as MicroPython. */ +#ifndef LV_EXPORT_CONST_INT + #ifdef CONFIG_LV_EXPORT_CONST_INT + #define LV_EXPORT_CONST_INT CONFIG_LV_EXPORT_CONST_INT + #else + #define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning /**< The default value just prevents GCC warning */ + #endif +#endif + +/** Prefix all global extern data with this */ +#ifndef LV_ATTRIBUTE_EXTERN_DATA + #ifdef CONFIG_LV_ATTRIBUTE_EXTERN_DATA + #define LV_ATTRIBUTE_EXTERN_DATA CONFIG_LV_ATTRIBUTE_EXTERN_DATA + #else + #define LV_ATTRIBUTE_EXTERN_DATA + #endif +#endif + +/** Use `float` as `lv_value_precise_t` */ +#ifndef LV_USE_FLOAT + #ifdef CONFIG_LV_USE_FLOAT + #define LV_USE_FLOAT CONFIG_LV_USE_FLOAT + #else + #define LV_USE_FLOAT 0 + #endif +#endif + +/** Enable matrix support + * - Requires `LV_USE_FLOAT = 1` */ +#ifndef LV_USE_MATRIX + #ifdef CONFIG_LV_USE_MATRIX + #define LV_USE_MATRIX CONFIG_LV_USE_MATRIX + #else + #define LV_USE_MATRIX 0 + #endif +#endif + +/** Include `lvgl_private.h` in `lvgl.h` to access internal data and functions by default */ +#ifndef LV_USE_PRIVATE_API + #ifndef LV_USE_PRIVATE_API + #ifdef CONFIG_LV_USE_PRIVATE_API + #define LV_USE_PRIVATE_API CONFIG_LV_USE_PRIVATE_API + #else + #define LV_USE_PRIVATE_API 0 + #endif + #endif +#endif + +/*================== + * FONT USAGE + *===================*/ + +/* Montserrat fonts with ASCII range and some symbols using bpp = 4 + * https://fonts.google.com/specimen/Montserrat */ +#ifndef LV_FONT_MONTSERRAT_8 + #ifdef CONFIG_LV_FONT_MONTSERRAT_8 + #define LV_FONT_MONTSERRAT_8 CONFIG_LV_FONT_MONTSERRAT_8 + #else + #define LV_FONT_MONTSERRAT_8 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_10 + #ifdef CONFIG_LV_FONT_MONTSERRAT_10 + #define LV_FONT_MONTSERRAT_10 CONFIG_LV_FONT_MONTSERRAT_10 + #else + #define LV_FONT_MONTSERRAT_10 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_12 + #ifdef CONFIG_LV_FONT_MONTSERRAT_12 + #define LV_FONT_MONTSERRAT_12 CONFIG_LV_FONT_MONTSERRAT_12 + #else + #define LV_FONT_MONTSERRAT_12 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_14 + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_FONT_MONTSERRAT_14 + #define LV_FONT_MONTSERRAT_14 CONFIG_LV_FONT_MONTSERRAT_14 + #else + #define LV_FONT_MONTSERRAT_14 0 + #endif + #else + #define LV_FONT_MONTSERRAT_14 1 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_16 + #ifdef CONFIG_LV_FONT_MONTSERRAT_16 + #define LV_FONT_MONTSERRAT_16 CONFIG_LV_FONT_MONTSERRAT_16 + #else + #define LV_FONT_MONTSERRAT_16 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_18 + #ifdef CONFIG_LV_FONT_MONTSERRAT_18 + #define LV_FONT_MONTSERRAT_18 CONFIG_LV_FONT_MONTSERRAT_18 + #else + #define LV_FONT_MONTSERRAT_18 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_20 + #ifdef CONFIG_LV_FONT_MONTSERRAT_20 + #define LV_FONT_MONTSERRAT_20 CONFIG_LV_FONT_MONTSERRAT_20 + #else + #define LV_FONT_MONTSERRAT_20 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_22 + #ifdef CONFIG_LV_FONT_MONTSERRAT_22 + #define LV_FONT_MONTSERRAT_22 CONFIG_LV_FONT_MONTSERRAT_22 + #else + #define LV_FONT_MONTSERRAT_22 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_24 + #ifdef CONFIG_LV_FONT_MONTSERRAT_24 + #define LV_FONT_MONTSERRAT_24 CONFIG_LV_FONT_MONTSERRAT_24 + #else + #define LV_FONT_MONTSERRAT_24 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_26 + #ifdef CONFIG_LV_FONT_MONTSERRAT_26 + #define LV_FONT_MONTSERRAT_26 CONFIG_LV_FONT_MONTSERRAT_26 + #else + #define LV_FONT_MONTSERRAT_26 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_28 + #ifdef CONFIG_LV_FONT_MONTSERRAT_28 + #define LV_FONT_MONTSERRAT_28 CONFIG_LV_FONT_MONTSERRAT_28 + #else + #define LV_FONT_MONTSERRAT_28 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_30 + #ifdef CONFIG_LV_FONT_MONTSERRAT_30 + #define LV_FONT_MONTSERRAT_30 CONFIG_LV_FONT_MONTSERRAT_30 + #else + #define LV_FONT_MONTSERRAT_30 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_32 + #ifdef CONFIG_LV_FONT_MONTSERRAT_32 + #define LV_FONT_MONTSERRAT_32 CONFIG_LV_FONT_MONTSERRAT_32 + #else + #define LV_FONT_MONTSERRAT_32 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_34 + #ifdef CONFIG_LV_FONT_MONTSERRAT_34 + #define LV_FONT_MONTSERRAT_34 CONFIG_LV_FONT_MONTSERRAT_34 + #else + #define LV_FONT_MONTSERRAT_34 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_36 + #ifdef CONFIG_LV_FONT_MONTSERRAT_36 + #define LV_FONT_MONTSERRAT_36 CONFIG_LV_FONT_MONTSERRAT_36 + #else + #define LV_FONT_MONTSERRAT_36 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_38 + #ifdef CONFIG_LV_FONT_MONTSERRAT_38 + #define LV_FONT_MONTSERRAT_38 CONFIG_LV_FONT_MONTSERRAT_38 + #else + #define LV_FONT_MONTSERRAT_38 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_40 + #ifdef CONFIG_LV_FONT_MONTSERRAT_40 + #define LV_FONT_MONTSERRAT_40 CONFIG_LV_FONT_MONTSERRAT_40 + #else + #define LV_FONT_MONTSERRAT_40 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_42 + #ifdef CONFIG_LV_FONT_MONTSERRAT_42 + #define LV_FONT_MONTSERRAT_42 CONFIG_LV_FONT_MONTSERRAT_42 + #else + #define LV_FONT_MONTSERRAT_42 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_44 + #ifdef CONFIG_LV_FONT_MONTSERRAT_44 + #define LV_FONT_MONTSERRAT_44 CONFIG_LV_FONT_MONTSERRAT_44 + #else + #define LV_FONT_MONTSERRAT_44 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_46 + #ifdef CONFIG_LV_FONT_MONTSERRAT_46 + #define LV_FONT_MONTSERRAT_46 CONFIG_LV_FONT_MONTSERRAT_46 + #else + #define LV_FONT_MONTSERRAT_46 0 + #endif +#endif +#ifndef LV_FONT_MONTSERRAT_48 + #ifdef CONFIG_LV_FONT_MONTSERRAT_48 + #define LV_FONT_MONTSERRAT_48 CONFIG_LV_FONT_MONTSERRAT_48 + #else + #define LV_FONT_MONTSERRAT_48 0 + #endif +#endif + +/* Demonstrate special features */ +#ifndef LV_FONT_MONTSERRAT_28_COMPRESSED + #ifdef CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED + #define LV_FONT_MONTSERRAT_28_COMPRESSED CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED + #else + #define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /**< bpp = 3 */ + #endif +#endif +#ifndef LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #ifdef CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW + #else + #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 /**< Hebrew, Arabic, Persian letters and all their forms */ + #endif +#endif +#ifndef LV_FONT_SOURCE_HAN_SANS_SC_14_CJK + #ifdef CONFIG_LV_FONT_SOURCE_HAN_SANS_SC_14_CJK + #define LV_FONT_SOURCE_HAN_SANS_SC_14_CJK CONFIG_LV_FONT_SOURCE_HAN_SANS_SC_14_CJK + #else + #define LV_FONT_SOURCE_HAN_SANS_SC_14_CJK 0 /**< 1338 most common CJK radicals */ + #endif +#endif +#ifndef LV_FONT_SOURCE_HAN_SANS_SC_16_CJK + #ifdef CONFIG_LV_FONT_SOURCE_HAN_SANS_SC_16_CJK + #define LV_FONT_SOURCE_HAN_SANS_SC_16_CJK CONFIG_LV_FONT_SOURCE_HAN_SANS_SC_16_CJK + #else + #define LV_FONT_SOURCE_HAN_SANS_SC_16_CJK 0 /**< 1338 most common CJK radicals */ + #endif +#endif + +/** Pixel perfect monospaced fonts */ +#ifndef LV_FONT_UNSCII_8 + #ifdef CONFIG_LV_FONT_UNSCII_8 + #define LV_FONT_UNSCII_8 CONFIG_LV_FONT_UNSCII_8 + #else + #define LV_FONT_UNSCII_8 0 + #endif +#endif +#ifndef LV_FONT_UNSCII_16 + #ifdef CONFIG_LV_FONT_UNSCII_16 + #define LV_FONT_UNSCII_16 CONFIG_LV_FONT_UNSCII_16 + #else + #define LV_FONT_UNSCII_16 0 + #endif +#endif + +/** Optionally declare custom fonts here. + * + * You can use any of these fonts as the default font too and they will be available + * globally. Example: + * + * @code + * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2) + * @endcode + */ +#ifndef LV_FONT_CUSTOM_DECLARE + #ifdef CONFIG_LV_FONT_CUSTOM_DECLARE + #define LV_FONT_CUSTOM_DECLARE CONFIG_LV_FONT_CUSTOM_DECLARE + #else + #define LV_FONT_CUSTOM_DECLARE + #endif +#endif + +/** Always set a default font */ +#ifndef LV_FONT_DEFAULT + #ifdef CONFIG_LV_FONT_DEFAULT + #define LV_FONT_DEFAULT CONFIG_LV_FONT_DEFAULT + #else + #define LV_FONT_DEFAULT &lv_font_montserrat_14 + #endif +#endif + +/** Enable handling large font and/or fonts with a lot of characters. + * The limit depends on the font size, font face and bpp. + * A compiler error will be triggered if a font needs it. */ +#ifndef LV_FONT_FMT_TXT_LARGE + #ifdef CONFIG_LV_FONT_FMT_TXT_LARGE + #define LV_FONT_FMT_TXT_LARGE CONFIG_LV_FONT_FMT_TXT_LARGE + #else + #define LV_FONT_FMT_TXT_LARGE 0 + #endif +#endif + +/** Enables/disables support for compressed fonts. */ +#ifndef LV_USE_FONT_COMPRESSED + #ifdef CONFIG_LV_USE_FONT_COMPRESSED + #define LV_USE_FONT_COMPRESSED CONFIG_LV_USE_FONT_COMPRESSED + #else + #define LV_USE_FONT_COMPRESSED 0 + #endif +#endif + +/** Enable drawing placeholders when glyph dsc is not found. */ +#ifndef LV_USE_FONT_PLACEHOLDER + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_FONT_PLACEHOLDER + #define LV_USE_FONT_PLACEHOLDER CONFIG_LV_USE_FONT_PLACEHOLDER + #else + #define LV_USE_FONT_PLACEHOLDER 0 + #endif + #else + #define LV_USE_FONT_PLACEHOLDER 1 + #endif +#endif + +/*================= + * TEXT SETTINGS + *=================*/ + +/** + * Select a character encoding for strings. + * Your IDE or editor should have the same character encoding. + * - LV_TXT_ENC_UTF8 + * - LV_TXT_ENC_ASCII + */ +#ifndef LV_TXT_ENC + #ifdef CONFIG_LV_TXT_ENC + #define LV_TXT_ENC CONFIG_LV_TXT_ENC + #else + #define LV_TXT_ENC LV_TXT_ENC_UTF8 + #endif +#endif + +/** While rendering text strings, break (wrap) text on these chars. */ +#ifndef LV_TXT_BREAK_CHARS + #ifdef CONFIG_LV_TXT_BREAK_CHARS + #define LV_TXT_BREAK_CHARS CONFIG_LV_TXT_BREAK_CHARS + #else + #define LV_TXT_BREAK_CHARS " ,.;:-_)]}" + #endif +#endif + +/** If a word is at least this long, will break wherever "prettiest". + * To disable, set to a value <= 0. */ +#ifndef LV_TXT_LINE_BREAK_LONG_LEN + #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_LEN + #define LV_TXT_LINE_BREAK_LONG_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_LEN + #else + #define LV_TXT_LINE_BREAK_LONG_LEN 0 + #endif +#endif + +/** Minimum number of characters in a long word to put on a line before a break. + * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ +#ifndef LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + #define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN + #else + #define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + #endif +#endif + +/** Minimum number of characters in a long word to put on a line after a break. + * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ +#ifndef LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + #ifdef CONFIG_LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN CONFIG_LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN + #else + #define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + #endif +#endif + +/** Support bidirectional text. Allows mixing Left-to-Right and Right-to-Left text. + * The direction will be processed according to the Unicode Bidirectional Algorithm: + * https://www.w3.org/International/articles/inline-bidi-markup/uba-basics */ +#ifndef LV_USE_BIDI + #ifdef CONFIG_LV_USE_BIDI + #define LV_USE_BIDI CONFIG_LV_USE_BIDI + #else + #define LV_USE_BIDI 0 + #endif +#endif +#if LV_USE_BIDI + /*Set the default direction. Supported values: + *`LV_BASE_DIR_LTR` Left-to-Right + *`LV_BASE_DIR_RTL` Right-to-Left + *`LV_BASE_DIR_AUTO` detect text base direction*/ + #ifndef LV_BIDI_BASE_DIR_DEF + #ifdef CONFIG_LV_BIDI_BASE_DIR_DEF + #define LV_BIDI_BASE_DIR_DEF CONFIG_LV_BIDI_BASE_DIR_DEF + #else + #define LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO + #endif + #endif +#endif + +/** Enable Arabic/Persian processing + * In these languages characters should be replaced with another form based on their position in the text */ +#ifndef LV_USE_ARABIC_PERSIAN_CHARS + #ifdef CONFIG_LV_USE_ARABIC_PERSIAN_CHARS + #define LV_USE_ARABIC_PERSIAN_CHARS CONFIG_LV_USE_ARABIC_PERSIAN_CHARS + #else + #define LV_USE_ARABIC_PERSIAN_CHARS 0 + #endif +#endif + +/*The control character to use for signaling text recoloring*/ +#ifndef LV_TXT_COLOR_CMD + #ifdef CONFIG_LV_TXT_COLOR_CMD + #define LV_TXT_COLOR_CMD CONFIG_LV_TXT_COLOR_CMD + #else + #define LV_TXT_COLOR_CMD "#" + #endif +#endif + +/*================== + * WIDGETS + *================*/ +/* Documentation for widgets can be found here: https://docs.lvgl.io/master/widgets/index.html . */ + +/** 1: Causes these widgets to be given default values at creation time. + * - lv_buttonmatrix_t: Get default maps: {"Btn1", "Btn2", "Btn3", "\n", "Btn4", "Btn5", ""}, else map not set. + * - lv_checkbox_t : String label set to "Check box", else set to empty string. + * - lv_dropdown_t : Options set to "Option 1", "Option 2", "Option 3", else no values are set. + * - lv_roller_t : Options set to "Option 1", "Option 2", "Option 3", "Option 4", "Option 5", else no values are set. + * - lv_label_t : Text set to "Text", else empty string. + * - lv_arclabel_t : Text set to "Arced Text", else empty string. + * */ +#ifndef LV_WIDGETS_HAS_DEFAULT_VALUE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE + #define LV_WIDGETS_HAS_DEFAULT_VALUE CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE + #else + #define LV_WIDGETS_HAS_DEFAULT_VALUE 0 + #endif + #else + #define LV_WIDGETS_HAS_DEFAULT_VALUE 1 + #endif +#endif + +#ifndef LV_USE_ANIMIMG + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ANIMIMG + #define LV_USE_ANIMIMG CONFIG_LV_USE_ANIMIMG + #else + #define LV_USE_ANIMIMG 0 + #endif + #else + #define LV_USE_ANIMIMG 1 + #endif +#endif + +#ifndef LV_USE_ARC + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ARC + #define LV_USE_ARC CONFIG_LV_USE_ARC + #else + #define LV_USE_ARC 0 + #endif + #else + #define LV_USE_ARC 1 + #endif +#endif + +#ifndef LV_USE_ARCLABEL + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ARCLABEL + #define LV_USE_ARCLABEL CONFIG_LV_USE_ARCLABEL + #else + #define LV_USE_ARCLABEL 0 + #endif + #else + #define LV_USE_ARCLABEL 1 + #endif +#endif + +#ifndef LV_USE_BAR + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_BAR + #define LV_USE_BAR CONFIG_LV_USE_BAR + #else + #define LV_USE_BAR 0 + #endif + #else + #define LV_USE_BAR 1 + #endif +#endif + +#ifndef LV_USE_BUTTON + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_BUTTON + #define LV_USE_BUTTON CONFIG_LV_USE_BUTTON + #else + #define LV_USE_BUTTON 0 + #endif + #else + #define LV_USE_BUTTON 1 + #endif +#endif + +#ifndef LV_USE_BUTTONMATRIX + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_BUTTONMATRIX + #define LV_USE_BUTTONMATRIX CONFIG_LV_USE_BUTTONMATRIX + #else + #define LV_USE_BUTTONMATRIX 0 + #endif + #else + #define LV_USE_BUTTONMATRIX 1 + #endif +#endif + +#ifndef LV_USE_CALENDAR + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CALENDAR + #define LV_USE_CALENDAR CONFIG_LV_USE_CALENDAR + #else + #define LV_USE_CALENDAR 0 + #endif + #else + #define LV_USE_CALENDAR 1 + #endif +#endif +#if LV_USE_CALENDAR + #ifndef LV_CALENDAR_WEEK_STARTS_MONDAY + #ifdef CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY + #define LV_CALENDAR_WEEK_STARTS_MONDAY CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY + #else + #define LV_CALENDAR_WEEK_STARTS_MONDAY 0 + #endif + #endif + #if LV_CALENDAR_WEEK_STARTS_MONDAY + #ifndef LV_CALENDAR_DEFAULT_DAY_NAMES + #ifdef CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #define LV_CALENDAR_DEFAULT_DAY_NAMES CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"} + #endif + #endif + #else + #ifndef LV_CALENDAR_DEFAULT_DAY_NAMES + #ifdef CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #define LV_CALENDAR_DEFAULT_DAY_NAMES CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES + #else + #define LV_CALENDAR_DEFAULT_DAY_NAMES {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"} + #endif + #endif + #endif + + #ifndef LV_CALENDAR_DEFAULT_MONTH_NAMES + #ifdef CONFIG_LV_CALENDAR_DEFAULT_MONTH_NAMES + #define LV_CALENDAR_DEFAULT_MONTH_NAMES CONFIG_LV_CALENDAR_DEFAULT_MONTH_NAMES + #else + #define LV_CALENDAR_DEFAULT_MONTH_NAMES {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} + #endif + #endif + #ifndef LV_USE_CALENDAR_HEADER_ARROW + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CALENDAR_HEADER_ARROW + #define LV_USE_CALENDAR_HEADER_ARROW CONFIG_LV_USE_CALENDAR_HEADER_ARROW + #else + #define LV_USE_CALENDAR_HEADER_ARROW 0 + #endif + #else + #define LV_USE_CALENDAR_HEADER_ARROW 1 + #endif + #endif + #ifndef LV_USE_CALENDAR_HEADER_DROPDOWN + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN + #define LV_USE_CALENDAR_HEADER_DROPDOWN CONFIG_LV_USE_CALENDAR_HEADER_DROPDOWN + #else + #define LV_USE_CALENDAR_HEADER_DROPDOWN 0 + #endif + #else + #define LV_USE_CALENDAR_HEADER_DROPDOWN 1 + #endif + #endif + #ifndef LV_USE_CALENDAR_CHINESE + #ifdef CONFIG_LV_USE_CALENDAR_CHINESE + #define LV_USE_CALENDAR_CHINESE CONFIG_LV_USE_CALENDAR_CHINESE + #else + #define LV_USE_CALENDAR_CHINESE 0 + #endif + #endif +#endif /*LV_USE_CALENDAR*/ + +#ifndef LV_USE_CANVAS + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CANVAS + #define LV_USE_CANVAS CONFIG_LV_USE_CANVAS + #else + #define LV_USE_CANVAS 0 + #endif + #else + #define LV_USE_CANVAS 1 + #endif +#endif + +#ifndef LV_USE_CHART + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CHART + #define LV_USE_CHART CONFIG_LV_USE_CHART + #else + #define LV_USE_CHART 0 + #endif + #else + #define LV_USE_CHART 1 + #endif +#endif + +#ifndef LV_USE_CHECKBOX + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_CHECKBOX + #define LV_USE_CHECKBOX CONFIG_LV_USE_CHECKBOX + #else + #define LV_USE_CHECKBOX 0 + #endif + #else + #define LV_USE_CHECKBOX 1 + #endif +#endif + +#ifndef LV_USE_DROPDOWN + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_DROPDOWN + #define LV_USE_DROPDOWN CONFIG_LV_USE_DROPDOWN + #else + #define LV_USE_DROPDOWN 0 + #endif + #else + #define LV_USE_DROPDOWN 1 /**< Requires: lv_label */ + #endif +#endif + +#ifndef LV_USE_IMAGE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_IMAGE + #define LV_USE_IMAGE CONFIG_LV_USE_IMAGE + #else + #define LV_USE_IMAGE 0 + #endif + #else + #define LV_USE_IMAGE 1 /**< Requires: lv_label */ + #endif +#endif + +#ifndef LV_USE_IMAGEBUTTON + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_IMAGEBUTTON + #define LV_USE_IMAGEBUTTON CONFIG_LV_USE_IMAGEBUTTON + #else + #define LV_USE_IMAGEBUTTON 0 + #endif + #else + #define LV_USE_IMAGEBUTTON 1 + #endif +#endif + +#ifndef LV_USE_KEYBOARD + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_KEYBOARD + #define LV_USE_KEYBOARD CONFIG_LV_USE_KEYBOARD + #else + #define LV_USE_KEYBOARD 0 + #endif + #else + #define LV_USE_KEYBOARD 1 + #endif +#endif + +#ifndef LV_USE_LABEL + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LABEL + #define LV_USE_LABEL CONFIG_LV_USE_LABEL + #else + #define LV_USE_LABEL 0 + #endif + #else + #define LV_USE_LABEL 1 + #endif +#endif +#if LV_USE_LABEL + #ifndef LV_LABEL_TEXT_SELECTION + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LABEL_TEXT_SELECTION + #define LV_LABEL_TEXT_SELECTION CONFIG_LV_LABEL_TEXT_SELECTION + #else + #define LV_LABEL_TEXT_SELECTION 0 + #endif + #else + #define LV_LABEL_TEXT_SELECTION 1 /**< Enable selecting text of the label */ + #endif + #endif + #ifndef LV_LABEL_LONG_TXT_HINT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LABEL_LONG_TXT_HINT + #define LV_LABEL_LONG_TXT_HINT CONFIG_LV_LABEL_LONG_TXT_HINT + #else + #define LV_LABEL_LONG_TXT_HINT 0 + #endif + #else + #define LV_LABEL_LONG_TXT_HINT 1 /**< Store some extra info in labels to speed up drawing of very long text */ + #endif + #endif + #ifndef LV_LABEL_WAIT_CHAR_COUNT + #ifdef CONFIG_LV_LABEL_WAIT_CHAR_COUNT + #define LV_LABEL_WAIT_CHAR_COUNT CONFIG_LV_LABEL_WAIT_CHAR_COUNT + #else + #define LV_LABEL_WAIT_CHAR_COUNT 3 /**< The count of wait chart */ + #endif + #endif +#endif + +#ifndef LV_USE_LED + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LED + #define LV_USE_LED CONFIG_LV_USE_LED + #else + #define LV_USE_LED 0 + #endif + #else + #define LV_USE_LED 1 + #endif +#endif + +#ifndef LV_USE_LINE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LINE + #define LV_USE_LINE CONFIG_LV_USE_LINE + #else + #define LV_USE_LINE 0 + #endif + #else + #define LV_USE_LINE 1 + #endif +#endif + +#ifndef LV_USE_LIST + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_LIST + #define LV_USE_LIST CONFIG_LV_USE_LIST + #else + #define LV_USE_LIST 0 + #endif + #else + #define LV_USE_LIST 1 + #endif +#endif + +#ifndef LV_USE_LOTTIE + #ifdef CONFIG_LV_USE_LOTTIE + #define LV_USE_LOTTIE CONFIG_LV_USE_LOTTIE + #else + #define LV_USE_LOTTIE 0 /**< Requires: lv_canvas, thorvg */ + #endif +#endif + +#ifndef LV_USE_MENU + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_MENU + #define LV_USE_MENU CONFIG_LV_USE_MENU + #else + #define LV_USE_MENU 0 + #endif + #else + #define LV_USE_MENU 1 + #endif +#endif + +#ifndef LV_USE_MSGBOX + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_MSGBOX + #define LV_USE_MSGBOX CONFIG_LV_USE_MSGBOX + #else + #define LV_USE_MSGBOX 0 + #endif + #else + #define LV_USE_MSGBOX 1 + #endif +#endif + +#ifndef LV_USE_ROLLER + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_ROLLER + #define LV_USE_ROLLER CONFIG_LV_USE_ROLLER + #else + #define LV_USE_ROLLER 0 + #endif + #else + #define LV_USE_ROLLER 1 /**< Requires: lv_label */ + #endif +#endif + +#ifndef LV_USE_SCALE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SCALE + #define LV_USE_SCALE CONFIG_LV_USE_SCALE + #else + #define LV_USE_SCALE 0 + #endif + #else + #define LV_USE_SCALE 1 + #endif +#endif + +#ifndef LV_USE_SLIDER + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SLIDER + #define LV_USE_SLIDER CONFIG_LV_USE_SLIDER + #else + #define LV_USE_SLIDER 0 + #endif + #else + #define LV_USE_SLIDER 1 /**< Requires: lv_bar */ + #endif +#endif + +#ifndef LV_USE_SPAN + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SPAN + #define LV_USE_SPAN CONFIG_LV_USE_SPAN + #else + #define LV_USE_SPAN 0 + #endif + #else + #define LV_USE_SPAN 1 + #endif +#endif +#if LV_USE_SPAN + /** A line of text can contain this maximum number of span descriptors. */ + #ifndef LV_SPAN_SNIPPET_STACK_SIZE + #ifdef CONFIG_LV_SPAN_SNIPPET_STACK_SIZE + #define LV_SPAN_SNIPPET_STACK_SIZE CONFIG_LV_SPAN_SNIPPET_STACK_SIZE + #else + #define LV_SPAN_SNIPPET_STACK_SIZE 64 + #endif + #endif +#endif + +#ifndef LV_USE_SPINBOX + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SPINBOX + #define LV_USE_SPINBOX CONFIG_LV_USE_SPINBOX + #else + #define LV_USE_SPINBOX 0 + #endif + #else + #define LV_USE_SPINBOX 1 + #endif +#endif + +#ifndef LV_USE_SPINNER + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SPINNER + #define LV_USE_SPINNER CONFIG_LV_USE_SPINNER + #else + #define LV_USE_SPINNER 0 + #endif + #else + #define LV_USE_SPINNER 1 + #endif +#endif + +#ifndef LV_USE_SWITCH + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_SWITCH + #define LV_USE_SWITCH CONFIG_LV_USE_SWITCH + #else + #define LV_USE_SWITCH 0 + #endif + #else + #define LV_USE_SWITCH 1 + #endif +#endif + +#ifndef LV_USE_TABLE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TABLE + #define LV_USE_TABLE CONFIG_LV_USE_TABLE + #else + #define LV_USE_TABLE 0 + #endif + #else + #define LV_USE_TABLE 1 + #endif +#endif + +#ifndef LV_USE_TABVIEW + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TABVIEW + #define LV_USE_TABVIEW CONFIG_LV_USE_TABVIEW + #else + #define LV_USE_TABVIEW 0 + #endif + #else + #define LV_USE_TABVIEW 1 + #endif +#endif + +#ifndef LV_USE_TEXTAREA + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TEXTAREA + #define LV_USE_TEXTAREA CONFIG_LV_USE_TEXTAREA + #else + #define LV_USE_TEXTAREA 0 + #endif + #else + #define LV_USE_TEXTAREA 1 /**< Requires: lv_label */ + #endif +#endif +#if LV_USE_TEXTAREA != 0 + #ifndef LV_TEXTAREA_DEF_PWD_SHOW_TIME + #ifdef CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME + #else + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /**< [ms] */ + #endif + #endif +#endif + +#ifndef LV_USE_TILEVIEW + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_TILEVIEW + #define LV_USE_TILEVIEW CONFIG_LV_USE_TILEVIEW + #else + #define LV_USE_TILEVIEW 0 + #endif + #else + #define LV_USE_TILEVIEW 1 + #endif +#endif + +#ifndef LV_USE_WIN + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_WIN + #define LV_USE_WIN CONFIG_LV_USE_WIN + #else + #define LV_USE_WIN 0 + #endif + #else + #define LV_USE_WIN 1 + #endif +#endif + +#ifndef LV_USE_3DTEXTURE + #ifdef CONFIG_LV_USE_3DTEXTURE + #define LV_USE_3DTEXTURE CONFIG_LV_USE_3DTEXTURE + #else + #define LV_USE_3DTEXTURE 0 + #endif +#endif + +/*================== + * THEMES + *==================*/ +/* Documentation for themes can be found here: https://docs.lvgl.io/master/common-widget-features/styles/styles.html#themes . */ + +/** A simple, impressive and very complete theme */ +#ifndef LV_USE_THEME_DEFAULT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_THEME_DEFAULT + #define LV_USE_THEME_DEFAULT CONFIG_LV_USE_THEME_DEFAULT + #else + #define LV_USE_THEME_DEFAULT 0 + #endif + #else + #define LV_USE_THEME_DEFAULT 1 + #endif +#endif +#if LV_USE_THEME_DEFAULT + /** 0: Light mode; 1: Dark mode */ + #ifndef LV_THEME_DEFAULT_DARK + #ifdef CONFIG_LV_THEME_DEFAULT_DARK + #define LV_THEME_DEFAULT_DARK CONFIG_LV_THEME_DEFAULT_DARK + #else + #define LV_THEME_DEFAULT_DARK 0 + #endif + #endif + + /** 1: Enable grow on press */ + #ifndef LV_THEME_DEFAULT_GROW + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_THEME_DEFAULT_GROW + #define LV_THEME_DEFAULT_GROW CONFIG_LV_THEME_DEFAULT_GROW + #else + #define LV_THEME_DEFAULT_GROW 0 + #endif + #else + #define LV_THEME_DEFAULT_GROW 1 + #endif + #endif + + /** Default transition time in ms. */ + #ifndef LV_THEME_DEFAULT_TRANSITION_TIME + #ifdef CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME + #define LV_THEME_DEFAULT_TRANSITION_TIME CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME + #else + #define LV_THEME_DEFAULT_TRANSITION_TIME 80 + #endif + #endif +#endif /*LV_USE_THEME_DEFAULT*/ + +/** A very simple theme that is a good starting point for a custom theme */ +#ifndef LV_USE_THEME_SIMPLE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_THEME_SIMPLE + #define LV_USE_THEME_SIMPLE CONFIG_LV_USE_THEME_SIMPLE + #else + #define LV_USE_THEME_SIMPLE 0 + #endif + #else + #define LV_USE_THEME_SIMPLE 1 + #endif +#endif + +/** A theme designed for monochrome displays */ +#ifndef LV_USE_THEME_MONO + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_THEME_MONO + #define LV_USE_THEME_MONO CONFIG_LV_USE_THEME_MONO + #else + #define LV_USE_THEME_MONO 0 + #endif + #else + #define LV_USE_THEME_MONO 1 + #endif +#endif + +/*================== + * LAYOUTS + *==================*/ +/* Documentation for layouts can be found here: https://docs.lvgl.io/master/common-widget-features/layouts/index.html . */ + +/** A layout similar to Flexbox in CSS. */ +#ifndef LV_USE_FLEX + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_FLEX + #define LV_USE_FLEX CONFIG_LV_USE_FLEX + #else + #define LV_USE_FLEX 0 + #endif + #else + #define LV_USE_FLEX 1 + #endif +#endif + +/** A layout similar to Grid in CSS. */ +#ifndef LV_USE_GRID + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_GRID + #define LV_USE_GRID CONFIG_LV_USE_GRID + #else + #define LV_USE_GRID 0 + #endif + #else + #define LV_USE_GRID 1 + #endif +#endif + +/*==================== + * 3RD PARTS LIBRARIES + *====================*/ +/* Documentation for libraries can be found here: https://docs.lvgl.io/master/libs/index.html . */ + +/* File system interfaces for common APIs */ + +/** Setting a default driver letter allows skipping the driver prefix in filepaths. + * Documentation about how to use the below driver-identifier letters can be found at + * https://docs.lvgl.io/master/main-modules/fs.html#lv-fs-identifier-letters . */ +#ifndef LV_FS_DEFAULT_DRIVER_LETTER + #ifdef CONFIG_LV_FS_DEFAULT_DRIVER_LETTER + #define LV_FS_DEFAULT_DRIVER_LETTER CONFIG_LV_FS_DEFAULT_DRIVER_LETTER + #else + #define LV_FS_DEFAULT_DRIVER_LETTER '\0' + #endif +#endif + +/** API for fopen, fread, etc. */ +#ifndef LV_USE_FS_STDIO + #ifdef CONFIG_LV_USE_FS_STDIO + #define LV_USE_FS_STDIO CONFIG_LV_USE_FS_STDIO + #else + #define LV_USE_FS_STDIO 0 + #endif +#endif +#if LV_USE_FS_STDIO + #ifndef LV_FS_STDIO_LETTER + #ifdef CONFIG_LV_FS_STDIO_LETTER + #define LV_FS_STDIO_LETTER CONFIG_LV_FS_STDIO_LETTER + #else + #define LV_FS_STDIO_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #endif + #endif + #ifndef LV_FS_STDIO_PATH + #ifdef CONFIG_LV_FS_STDIO_PATH + #define LV_FS_STDIO_PATH CONFIG_LV_FS_STDIO_PATH + #else + #define LV_FS_STDIO_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #endif + #endif + #ifndef LV_FS_STDIO_CACHE_SIZE + #ifdef CONFIG_LV_FS_STDIO_CACHE_SIZE + #define LV_FS_STDIO_CACHE_SIZE CONFIG_LV_FS_STDIO_CACHE_SIZE + #else + #define LV_FS_STDIO_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ + #endif + #endif +#endif + +/** API for open, read, etc. */ +#ifndef LV_USE_FS_POSIX + #ifdef CONFIG_LV_USE_FS_POSIX + #define LV_USE_FS_POSIX CONFIG_LV_USE_FS_POSIX + #else + #define LV_USE_FS_POSIX 0 + #endif +#endif +#if LV_USE_FS_POSIX + #ifndef LV_FS_POSIX_LETTER + #ifdef CONFIG_LV_FS_POSIX_LETTER + #define LV_FS_POSIX_LETTER CONFIG_LV_FS_POSIX_LETTER + #else + #define LV_FS_POSIX_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #endif + #endif + #ifndef LV_FS_POSIX_PATH + #ifdef CONFIG_LV_FS_POSIX_PATH + #define LV_FS_POSIX_PATH CONFIG_LV_FS_POSIX_PATH + #else + #define LV_FS_POSIX_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #endif + #endif + #ifndef LV_FS_POSIX_CACHE_SIZE + #ifdef CONFIG_LV_FS_POSIX_CACHE_SIZE + #define LV_FS_POSIX_CACHE_SIZE CONFIG_LV_FS_POSIX_CACHE_SIZE + #else + #define LV_FS_POSIX_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ + #endif + #endif +#endif + +/** API for CreateFile, ReadFile, etc. */ +#ifndef LV_USE_FS_WIN32 + #ifdef CONFIG_LV_USE_FS_WIN32 + #define LV_USE_FS_WIN32 CONFIG_LV_USE_FS_WIN32 + #else + #define LV_USE_FS_WIN32 0 + #endif +#endif +#if LV_USE_FS_WIN32 + #ifndef LV_FS_WIN32_LETTER + #ifdef CONFIG_LV_FS_WIN32_LETTER + #define LV_FS_WIN32_LETTER CONFIG_LV_FS_WIN32_LETTER + #else + #define LV_FS_WIN32_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #endif + #endif + #ifndef LV_FS_WIN32_PATH + #ifdef CONFIG_LV_FS_WIN32_PATH + #define LV_FS_WIN32_PATH CONFIG_LV_FS_WIN32_PATH + #else + #define LV_FS_WIN32_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #endif + #endif + #ifndef LV_FS_WIN32_CACHE_SIZE + #ifdef CONFIG_LV_FS_WIN32_CACHE_SIZE + #define LV_FS_WIN32_CACHE_SIZE CONFIG_LV_FS_WIN32_CACHE_SIZE + #else + #define LV_FS_WIN32_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ + #endif + #endif +#endif + +/** API for FATFS (needs to be added separately). Uses f_open, f_read, etc. */ +#ifndef LV_USE_FS_FATFS + #ifdef CONFIG_LV_USE_FS_FATFS + #define LV_USE_FS_FATFS CONFIG_LV_USE_FS_FATFS + #else + #define LV_USE_FS_FATFS 0 + #endif +#endif +#if LV_USE_FS_FATFS + #ifndef LV_FS_FATFS_LETTER + #ifdef CONFIG_LV_FS_FATFS_LETTER + #define LV_FS_FATFS_LETTER CONFIG_LV_FS_FATFS_LETTER + #else + #define LV_FS_FATFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #endif + #endif + #ifndef LV_FS_FATFS_PATH + #ifdef CONFIG_LV_FS_FATFS_PATH + #define LV_FS_FATFS_PATH CONFIG_LV_FS_FATFS_PATH + #else + #define LV_FS_FATFS_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #endif + #endif + #ifndef LV_FS_FATFS_CACHE_SIZE + #ifdef CONFIG_LV_FS_FATFS_CACHE_SIZE + #define LV_FS_FATFS_CACHE_SIZE CONFIG_LV_FS_FATFS_CACHE_SIZE + #else + #define LV_FS_FATFS_CACHE_SIZE 0 /**< >0 to cache this number of bytes in lv_fs_read() */ + #endif + #endif +#endif + +/** API for memory-mapped file access. */ +#ifndef LV_USE_FS_MEMFS + #ifdef CONFIG_LV_USE_FS_MEMFS + #define LV_USE_FS_MEMFS CONFIG_LV_USE_FS_MEMFS + #else + #define LV_USE_FS_MEMFS 0 + #endif +#endif +#if LV_USE_FS_MEMFS + #ifndef LV_FS_MEMFS_LETTER + #ifdef CONFIG_LV_FS_MEMFS_LETTER + #define LV_FS_MEMFS_LETTER CONFIG_LV_FS_MEMFS_LETTER + #else + #define LV_FS_MEMFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #endif + #endif +#endif + +/** API for LittleFs. */ +#ifndef LV_USE_FS_LITTLEFS + #ifdef CONFIG_LV_USE_FS_LITTLEFS + #define LV_USE_FS_LITTLEFS CONFIG_LV_USE_FS_LITTLEFS + #else + #define LV_USE_FS_LITTLEFS 0 + #endif +#endif +#if LV_USE_FS_LITTLEFS + #ifndef LV_FS_LITTLEFS_LETTER + #ifdef CONFIG_LV_FS_LITTLEFS_LETTER + #define LV_FS_LITTLEFS_LETTER CONFIG_LV_FS_LITTLEFS_LETTER + #else + #define LV_FS_LITTLEFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #endif + #endif + #ifndef LV_FS_LITTLEFS_PATH + #ifdef CONFIG_LV_FS_LITTLEFS_PATH + #define LV_FS_LITTLEFS_PATH CONFIG_LV_FS_LITTLEFS_PATH + #else + #define LV_FS_LITTLEFS_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #endif + #endif +#endif + +/** API for Arduino LittleFs. */ +#ifndef LV_USE_FS_ARDUINO_ESP_LITTLEFS + #ifdef CONFIG_LV_USE_FS_ARDUINO_ESP_LITTLEFS + #define LV_USE_FS_ARDUINO_ESP_LITTLEFS CONFIG_LV_USE_FS_ARDUINO_ESP_LITTLEFS + #else + #define LV_USE_FS_ARDUINO_ESP_LITTLEFS 0 + #endif +#endif +#if LV_USE_FS_ARDUINO_ESP_LITTLEFS + #ifndef LV_FS_ARDUINO_ESP_LITTLEFS_LETTER + #ifdef CONFIG_LV_FS_ARDUINO_ESP_LITTLEFS_LETTER + #define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER CONFIG_LV_FS_ARDUINO_ESP_LITTLEFS_LETTER + #else + #define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #endif + #endif + #ifndef LV_FS_ARDUINO_ESP_LITTLEFS_PATH + #ifdef CONFIG_LV_FS_ARDUINO_ESP_LITTLEFS_PATH + #define LV_FS_ARDUINO_ESP_LITTLEFS_PATH CONFIG_LV_FS_ARDUINO_ESP_LITTLEFS_PATH + #else + #define LV_FS_ARDUINO_ESP_LITTLEFS_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #endif + #endif +#endif + +/** API for Arduino Sd. */ +#ifndef LV_USE_FS_ARDUINO_SD + #ifdef CONFIG_LV_USE_FS_ARDUINO_SD + #define LV_USE_FS_ARDUINO_SD CONFIG_LV_USE_FS_ARDUINO_SD + #else + #define LV_USE_FS_ARDUINO_SD 0 + #endif +#endif +#if LV_USE_FS_ARDUINO_SD + #ifndef LV_FS_ARDUINO_SD_LETTER + #ifdef CONFIG_LV_FS_ARDUINO_SD_LETTER + #define LV_FS_ARDUINO_SD_LETTER CONFIG_LV_FS_ARDUINO_SD_LETTER + #else + #define LV_FS_ARDUINO_SD_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #endif + #endif + #ifndef LV_FS_ARDUINO_SD_PATH + #ifdef CONFIG_LV_FS_ARDUINO_SD_PATH + #define LV_FS_ARDUINO_SD_PATH CONFIG_LV_FS_ARDUINO_SD_PATH + #else + #define LV_FS_ARDUINO_SD_PATH "" /**< Set the working directory. File/directory paths will be appended to it. */ + #endif + #endif +#endif + +/** API for UEFI */ +#ifndef LV_USE_FS_UEFI + #ifdef CONFIG_LV_USE_FS_UEFI + #define LV_USE_FS_UEFI CONFIG_LV_USE_FS_UEFI + #else + #define LV_USE_FS_UEFI 0 + #endif +#endif +#if LV_USE_FS_UEFI + #ifndef LV_FS_UEFI_LETTER + #ifdef CONFIG_LV_FS_UEFI_LETTER + #define LV_FS_UEFI_LETTER CONFIG_LV_FS_UEFI_LETTER + #else + #define LV_FS_UEFI_LETTER '\0' /**< Set an upper-case driver-identifier letter for this driver (e.g. 'A'). */ + #endif + #endif +#endif + +#ifndef LV_USE_FS_FROGFS + #ifdef CONFIG_LV_USE_FS_FROGFS + #define LV_USE_FS_FROGFS CONFIG_LV_USE_FS_FROGFS + #else + #define LV_USE_FS_FROGFS 0 + #endif +#endif +#if LV_USE_FS_FROGFS + #ifndef LV_FS_FROGFS_LETTER + #ifdef CONFIG_LV_FS_FROGFS_LETTER + #define LV_FS_FROGFS_LETTER CONFIG_LV_FS_FROGFS_LETTER + #else + #define LV_FS_FROGFS_LETTER '\0' + #endif + #endif +#endif + +/** LODEPNG decoder library */ +#ifndef LV_USE_LODEPNG + #ifdef CONFIG_LV_USE_LODEPNG + #define LV_USE_LODEPNG CONFIG_LV_USE_LODEPNG + #else + #define LV_USE_LODEPNG 0 + #endif +#endif + +/** PNG decoder(libpng) library */ +#ifndef LV_USE_LIBPNG + #ifdef CONFIG_LV_USE_LIBPNG + #define LV_USE_LIBPNG CONFIG_LV_USE_LIBPNG + #else + #define LV_USE_LIBPNG 0 + #endif +#endif + +/** BMP decoder library */ +#ifndef LV_USE_BMP + #ifdef CONFIG_LV_USE_BMP + #define LV_USE_BMP CONFIG_LV_USE_BMP + #else + #define LV_USE_BMP 0 + #endif +#endif + +/** JPG + split JPG decoder library. + * Split JPG is a custom format optimized for embedded systems. */ +#ifndef LV_USE_TJPGD + #ifdef CONFIG_LV_USE_TJPGD + #define LV_USE_TJPGD CONFIG_LV_USE_TJPGD + #else + #define LV_USE_TJPGD 0 + #endif +#endif + +/** libjpeg-turbo decoder library. + * - Supports complete JPEG specifications and high-performance JPEG decoding. */ +#ifndef LV_USE_LIBJPEG_TURBO + #ifdef CONFIG_LV_USE_LIBJPEG_TURBO + #define LV_USE_LIBJPEG_TURBO CONFIG_LV_USE_LIBJPEG_TURBO + #else + #define LV_USE_LIBJPEG_TURBO 0 + #endif +#endif + +/** WebP decoder library */ +#ifndef LV_USE_LIBWEBP + #ifdef CONFIG_LV_USE_LIBWEBP + #define LV_USE_LIBWEBP CONFIG_LV_USE_LIBWEBP + #else + #define LV_USE_LIBWEBP 0 + #endif +#endif + +/** GIF decoder library */ +#ifndef LV_USE_GIF + #ifdef CONFIG_LV_USE_GIF + #define LV_USE_GIF CONFIG_LV_USE_GIF + #else + #define LV_USE_GIF 0 + #endif +#endif +#if LV_USE_GIF + /** GIF decoder accelerate */ + #ifndef LV_GIF_CACHE_DECODE_DATA + #ifdef CONFIG_LV_GIF_CACHE_DECODE_DATA + #define LV_GIF_CACHE_DECODE_DATA CONFIG_LV_GIF_CACHE_DECODE_DATA + #else + #define LV_GIF_CACHE_DECODE_DATA 0 + #endif + #endif +#endif + +/** GStreamer library */ +#ifndef LV_USE_GSTREAMER + #ifdef CONFIG_LV_USE_GSTREAMER + #define LV_USE_GSTREAMER CONFIG_LV_USE_GSTREAMER + #else + #define LV_USE_GSTREAMER 0 + #endif +#endif + +/** Decode bin images to RAM */ +#ifndef LV_BIN_DECODER_RAM_LOAD + #ifdef CONFIG_LV_BIN_DECODER_RAM_LOAD + #define LV_BIN_DECODER_RAM_LOAD CONFIG_LV_BIN_DECODER_RAM_LOAD + #else + #define LV_BIN_DECODER_RAM_LOAD 0 + #endif +#endif + +/** RLE decompress library */ +#ifndef LV_USE_RLE + #ifdef CONFIG_LV_USE_RLE + #define LV_USE_RLE CONFIG_LV_USE_RLE + #else + #define LV_USE_RLE 0 + #endif +#endif + +/** QR code library */ +#ifndef LV_USE_QRCODE + #ifdef CONFIG_LV_USE_QRCODE + #define LV_USE_QRCODE CONFIG_LV_USE_QRCODE + #else + #define LV_USE_QRCODE 0 + #endif +#endif + +/** Barcode code library */ +#ifndef LV_USE_BARCODE + #ifdef CONFIG_LV_USE_BARCODE + #define LV_USE_BARCODE CONFIG_LV_USE_BARCODE + #else + #define LV_USE_BARCODE 0 + #endif +#endif + +/** FreeType library */ +#ifndef LV_USE_FREETYPE + #ifdef CONFIG_LV_USE_FREETYPE + #define LV_USE_FREETYPE CONFIG_LV_USE_FREETYPE + #else + #define LV_USE_FREETYPE 0 + #endif +#endif +#if LV_USE_FREETYPE + /** Let FreeType use LVGL memory and file porting */ + #ifndef LV_FREETYPE_USE_LVGL_PORT + #ifdef CONFIG_LV_FREETYPE_USE_LVGL_PORT + #define LV_FREETYPE_USE_LVGL_PORT CONFIG_LV_FREETYPE_USE_LVGL_PORT + #else + #define LV_FREETYPE_USE_LVGL_PORT 0 + #endif + #endif + + /** Cache count of glyphs in FreeType, i.e. number of glyphs that can be cached. + * The higher the value, the more memory will be used. */ + #ifndef LV_FREETYPE_CACHE_FT_GLYPH_CNT + #ifdef CONFIG_LV_FREETYPE_CACHE_FT_GLYPH_CNT + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT CONFIG_LV_FREETYPE_CACHE_FT_GLYPH_CNT + #else + #define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256 + #endif + #endif +#endif + +/** Built-in TTF decoder */ +#ifndef LV_USE_TINY_TTF + #ifdef CONFIG_LV_USE_TINY_TTF + #define LV_USE_TINY_TTF CONFIG_LV_USE_TINY_TTF + #else + #define LV_USE_TINY_TTF 0 + #endif +#endif +#if LV_USE_TINY_TTF + /* Enable loading TTF data from files */ + #ifndef LV_TINY_TTF_FILE_SUPPORT + #ifdef CONFIG_LV_TINY_TTF_FILE_SUPPORT + #define LV_TINY_TTF_FILE_SUPPORT CONFIG_LV_TINY_TTF_FILE_SUPPORT + #else + #define LV_TINY_TTF_FILE_SUPPORT 0 + #endif + #endif + #ifndef LV_TINY_TTF_CACHE_GLYPH_CNT + #ifdef CONFIG_LV_TINY_TTF_CACHE_GLYPH_CNT + #define LV_TINY_TTF_CACHE_GLYPH_CNT CONFIG_LV_TINY_TTF_CACHE_GLYPH_CNT + #else + #define LV_TINY_TTF_CACHE_GLYPH_CNT 128 + #endif + #endif + #ifndef LV_TINY_TTF_CACHE_KERNING_CNT + #ifdef CONFIG_LV_TINY_TTF_CACHE_KERNING_CNT + #define LV_TINY_TTF_CACHE_KERNING_CNT CONFIG_LV_TINY_TTF_CACHE_KERNING_CNT + #else + #define LV_TINY_TTF_CACHE_KERNING_CNT 256 + #endif + #endif +#endif + +/** Rlottie library */ +#ifndef LV_USE_RLOTTIE + #ifdef CONFIG_LV_USE_RLOTTIE + #define LV_USE_RLOTTIE CONFIG_LV_USE_RLOTTIE + #else + #define LV_USE_RLOTTIE 0 + #endif +#endif + +/** Requires `LV_USE_3DTEXTURE = 1` */ +#ifndef LV_USE_GLTF + #ifdef CONFIG_LV_USE_GLTF + #define LV_USE_GLTF CONFIG_LV_USE_GLTF + #else + #define LV_USE_GLTF 0 + #endif +#endif + +/** Enable Vector Graphic APIs + * Requires `LV_USE_MATRIX = 1` + * and a rendering engine supporting vector graphics, e.g. + * (LV_USE_DRAW_SW and LV_USE_THORVG) or LV_USE_DRAW_VG_LITE or LV_USE_NEMA_VG. */ +#ifndef LV_USE_VECTOR_GRAPHIC + #ifdef CONFIG_LV_USE_VECTOR_GRAPHIC + #define LV_USE_VECTOR_GRAPHIC CONFIG_LV_USE_VECTOR_GRAPHIC + #else + #define LV_USE_VECTOR_GRAPHIC 0 + #endif +#endif + +/** Enable ThorVG (vector graphics library) from the src/libs folder. + * Requires LV_USE_VECTOR_GRAPHIC */ +#ifndef LV_USE_THORVG_INTERNAL + #ifdef CONFIG_LV_USE_THORVG_INTERNAL + #define LV_USE_THORVG_INTERNAL CONFIG_LV_USE_THORVG_INTERNAL + #else + #define LV_USE_THORVG_INTERNAL 0 + #endif +#endif + +/** Enable ThorVG by assuming that its installed and linked to the project + * Requires LV_USE_VECTOR_GRAPHIC */ +#ifndef LV_USE_THORVG_EXTERNAL + #ifdef CONFIG_LV_USE_THORVG_EXTERNAL + #define LV_USE_THORVG_EXTERNAL CONFIG_LV_USE_THORVG_EXTERNAL + #else + #define LV_USE_THORVG_EXTERNAL 0 + #endif +#endif + +/** Enable NanoVG (vector graphics library) */ +#ifndef LV_USE_NANOVG + #ifdef CONFIG_LV_USE_NANOVG + #define LV_USE_NANOVG CONFIG_LV_USE_NANOVG + #else + #define LV_USE_NANOVG 0 + #endif +#endif + +/** Use lvgl built-in LZ4 lib */ +#ifndef LV_USE_LZ4_INTERNAL + #ifdef CONFIG_LV_USE_LZ4_INTERNAL + #define LV_USE_LZ4_INTERNAL CONFIG_LV_USE_LZ4_INTERNAL + #else + #define LV_USE_LZ4_INTERNAL 0 + #endif +#endif + +/** Use external LZ4 library */ +#ifndef LV_USE_LZ4_EXTERNAL + #ifdef CONFIG_LV_USE_LZ4_EXTERNAL + #define LV_USE_LZ4_EXTERNAL CONFIG_LV_USE_LZ4_EXTERNAL + #else + #define LV_USE_LZ4_EXTERNAL 0 + #endif +#endif + +/*SVG library + * - Requires `LV_USE_VECTOR_GRAPHIC = 1` */ +#ifndef LV_USE_SVG + #ifdef CONFIG_LV_USE_SVG + #define LV_USE_SVG CONFIG_LV_USE_SVG + #else + #define LV_USE_SVG 0 + #endif +#endif +#ifndef LV_USE_SVG_ANIMATION + #ifdef CONFIG_LV_USE_SVG_ANIMATION + #define LV_USE_SVG_ANIMATION CONFIG_LV_USE_SVG_ANIMATION + #else + #define LV_USE_SVG_ANIMATION 0 + #endif +#endif +#ifndef LV_USE_SVG_DEBUG + #ifdef CONFIG_LV_USE_SVG_DEBUG + #define LV_USE_SVG_DEBUG CONFIG_LV_USE_SVG_DEBUG + #else + #define LV_USE_SVG_DEBUG 0 + #endif +#endif + +/** FFmpeg library for image decoding and playing videos. + * Supports all major image formats so do not enable other image decoder with it. */ +#ifndef LV_USE_FFMPEG + #ifdef CONFIG_LV_USE_FFMPEG + #define LV_USE_FFMPEG CONFIG_LV_USE_FFMPEG + #else + #define LV_USE_FFMPEG 0 + #endif +#endif +#if LV_USE_FFMPEG + /** Dump input information to stderr */ + #ifndef LV_FFMPEG_DUMP_FORMAT + #ifdef CONFIG_LV_FFMPEG_DUMP_FORMAT + #define LV_FFMPEG_DUMP_FORMAT CONFIG_LV_FFMPEG_DUMP_FORMAT + #else + #define LV_FFMPEG_DUMP_FORMAT 0 + #endif + #endif + /** Use lvgl file path in FFmpeg Player widget + * You won't be able to open URLs after enabling this feature. + * Note that FFmpeg image decoder will always use lvgl file system. */ + #ifndef LV_FFMPEG_PLAYER_USE_LV_FS + #ifdef CONFIG_LV_FFMPEG_PLAYER_USE_LV_FS + #define LV_FFMPEG_PLAYER_USE_LV_FS CONFIG_LV_FFMPEG_PLAYER_USE_LV_FS + #else + #define LV_FFMPEG_PLAYER_USE_LV_FS 0 + #endif + #endif +#endif + +/*================== + * OTHERS + *==================*/ +/* Documentation for several of the below items can be found here: https://docs.lvgl.io/master/auxiliary-modules/index.html . */ + +/** 1: Enable API to take snapshot for object */ +#ifndef LV_USE_SNAPSHOT + #ifdef CONFIG_LV_USE_SNAPSHOT + #define LV_USE_SNAPSHOT CONFIG_LV_USE_SNAPSHOT + #else + #define LV_USE_SNAPSHOT 0 + #endif +#endif + +/** 1: Enable system monitor component */ +#ifndef LV_USE_SYSMON + #ifdef CONFIG_LV_USE_SYSMON + #define LV_USE_SYSMON CONFIG_LV_USE_SYSMON + #else + #define LV_USE_SYSMON 0 + #endif +#endif +#if LV_USE_SYSMON + /** Get the idle percentage. E.g. uint32_t my_get_idle(void); */ + #ifndef LV_SYSMON_GET_IDLE + #ifdef CONFIG_LV_SYSMON_GET_IDLE + #define LV_SYSMON_GET_IDLE CONFIG_LV_SYSMON_GET_IDLE + #else + #define LV_SYSMON_GET_IDLE lv_os_get_idle_percent + #endif + #endif + /** 1: Enable usage of lv_os_get_proc_idle_percent.*/ + #ifndef LV_SYSMON_PROC_IDLE_AVAILABLE + #ifdef CONFIG_LV_SYSMON_PROC_IDLE_AVAILABLE + #define LV_SYSMON_PROC_IDLE_AVAILABLE CONFIG_LV_SYSMON_PROC_IDLE_AVAILABLE + #else + #define LV_SYSMON_PROC_IDLE_AVAILABLE 0 + #endif + #endif + #if LV_SYSMON_PROC_IDLE_AVAILABLE + /** Get the applications idle percentage. + * - Requires `LV_USE_OS == LV_OS_PTHREAD` */ + #ifndef LV_SYSMON_GET_PROC_IDLE + #ifdef CONFIG_LV_SYSMON_GET_PROC_IDLE + #define LV_SYSMON_GET_PROC_IDLE CONFIG_LV_SYSMON_GET_PROC_IDLE + #else + #define LV_SYSMON_GET_PROC_IDLE lv_os_get_proc_idle_percent + #endif + #endif + #endif + + /** 1: Show CPU usage and FPS count. + * - Requires `LV_USE_SYSMON = 1` */ + #ifndef LV_USE_PERF_MONITOR + #ifdef CONFIG_LV_USE_PERF_MONITOR + #define LV_USE_PERF_MONITOR CONFIG_LV_USE_PERF_MONITOR + #else + #define LV_USE_PERF_MONITOR 0 + #endif + #endif + #if LV_USE_PERF_MONITOR + #ifndef LV_USE_PERF_MONITOR_POS + #ifdef CONFIG_LV_USE_PERF_MONITOR_POS + #define LV_USE_PERF_MONITOR_POS CONFIG_LV_USE_PERF_MONITOR_POS + #else + #define LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT + #endif + #endif + + /** 0: Displays performance data on the screen; 1: Prints performance data using log. */ + #ifndef LV_USE_PERF_MONITOR_LOG_MODE + #ifdef CONFIG_LV_USE_PERF_MONITOR_LOG_MODE + #define LV_USE_PERF_MONITOR_LOG_MODE CONFIG_LV_USE_PERF_MONITOR_LOG_MODE + #else + #define LV_USE_PERF_MONITOR_LOG_MODE 0 + #endif + #endif + #endif + + /** 1: Show used memory and memory fragmentation. + * - Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN` + * - Requires `LV_USE_SYSMON = 1`*/ + #ifndef LV_USE_MEM_MONITOR + #ifdef CONFIG_LV_USE_MEM_MONITOR + #define LV_USE_MEM_MONITOR CONFIG_LV_USE_MEM_MONITOR + #else + #define LV_USE_MEM_MONITOR 0 + #endif + #endif + #if LV_USE_MEM_MONITOR + #ifndef LV_USE_MEM_MONITOR_POS + #ifdef CONFIG_LV_USE_MEM_MONITOR_POS + #define LV_USE_MEM_MONITOR_POS CONFIG_LV_USE_MEM_MONITOR_POS + #else + #define LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT + #endif + #endif + #endif +#endif /*LV_USE_SYSMON*/ + +/** 1: Enable runtime performance profiler */ +#ifndef LV_USE_PROFILER + #ifdef CONFIG_LV_USE_PROFILER + #define LV_USE_PROFILER CONFIG_LV_USE_PROFILER + #else + #define LV_USE_PROFILER 0 + #endif +#endif +#if LV_USE_PROFILER + /** 1: Enable the built-in profiler */ + #ifndef LV_USE_PROFILER_BUILTIN + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_PROFILER_BUILTIN + #define LV_USE_PROFILER_BUILTIN CONFIG_LV_USE_PROFILER_BUILTIN + #else + #define LV_USE_PROFILER_BUILTIN 0 + #endif + #else + #define LV_USE_PROFILER_BUILTIN 1 + #endif + #endif + #if LV_USE_PROFILER_BUILTIN + /** Default profiler trace buffer size */ + #ifndef LV_PROFILER_BUILTIN_BUF_SIZE + #ifdef CONFIG_LV_PROFILER_BUILTIN_BUF_SIZE + #define LV_PROFILER_BUILTIN_BUF_SIZE CONFIG_LV_PROFILER_BUILTIN_BUF_SIZE + #else + #define LV_PROFILER_BUILTIN_BUF_SIZE (16 * 1024) /**< [bytes] */ + #endif + #endif + #ifndef LV_PROFILER_BUILTIN_DEFAULT_ENABLE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_BUILTIN_DEFAULT_ENABLE + #define LV_PROFILER_BUILTIN_DEFAULT_ENABLE CONFIG_LV_PROFILER_BUILTIN_DEFAULT_ENABLE + #else + #define LV_PROFILER_BUILTIN_DEFAULT_ENABLE 0 + #endif + #else + #define LV_PROFILER_BUILTIN_DEFAULT_ENABLE 1 + #endif + #endif + #ifndef LV_USE_PROFILER_BUILTIN_POSIX + #ifdef CONFIG_LV_USE_PROFILER_BUILTIN_POSIX + #define LV_USE_PROFILER_BUILTIN_POSIX CONFIG_LV_USE_PROFILER_BUILTIN_POSIX + #else + #define LV_USE_PROFILER_BUILTIN_POSIX 0 /**< Enable POSIX profiler port */ + #endif + #endif + #endif + + /** Header to include for profiler */ + #ifndef LV_PROFILER_INCLUDE + #ifdef CONFIG_LV_PROFILER_INCLUDE + #define LV_PROFILER_INCLUDE CONFIG_LV_PROFILER_INCLUDE + #else + #define LV_PROFILER_INCLUDE "lvgl/src/misc/lv_profiler_builtin.h" + #endif + #endif + + /** Profiler start point function */ + #ifndef LV_PROFILER_BEGIN + #ifdef CONFIG_LV_PROFILER_BEGIN + #define LV_PROFILER_BEGIN CONFIG_LV_PROFILER_BEGIN + #else + #define LV_PROFILER_BEGIN LV_PROFILER_BUILTIN_BEGIN + #endif + #endif + + /** Profiler end point function */ + #ifndef LV_PROFILER_END + #ifdef CONFIG_LV_PROFILER_END + #define LV_PROFILER_END CONFIG_LV_PROFILER_END + #else + #define LV_PROFILER_END LV_PROFILER_BUILTIN_END + #endif + #endif + + /** Profiler start point function with custom tag */ + #ifndef LV_PROFILER_BEGIN_TAG + #ifdef CONFIG_LV_PROFILER_BEGIN_TAG + #define LV_PROFILER_BEGIN_TAG CONFIG_LV_PROFILER_BEGIN_TAG + #else + #define LV_PROFILER_BEGIN_TAG LV_PROFILER_BUILTIN_BEGIN_TAG + #endif + #endif + + /** Profiler end point function with custom tag */ + #ifndef LV_PROFILER_END_TAG + #ifdef CONFIG_LV_PROFILER_END_TAG + #define LV_PROFILER_END_TAG CONFIG_LV_PROFILER_END_TAG + #else + #define LV_PROFILER_END_TAG LV_PROFILER_BUILTIN_END_TAG + #endif + #endif + + /*Enable layout profiler*/ + #ifndef LV_PROFILER_LAYOUT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_LAYOUT + #define LV_PROFILER_LAYOUT CONFIG_LV_PROFILER_LAYOUT + #else + #define LV_PROFILER_LAYOUT 0 + #endif + #else + #define LV_PROFILER_LAYOUT 1 + #endif + #endif + + /*Enable disp refr profiler*/ + #ifndef LV_PROFILER_REFR + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_REFR + #define LV_PROFILER_REFR CONFIG_LV_PROFILER_REFR + #else + #define LV_PROFILER_REFR 0 + #endif + #else + #define LV_PROFILER_REFR 1 + #endif + #endif + + /*Enable draw profiler*/ + #ifndef LV_PROFILER_DRAW + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_DRAW + #define LV_PROFILER_DRAW CONFIG_LV_PROFILER_DRAW + #else + #define LV_PROFILER_DRAW 0 + #endif + #else + #define LV_PROFILER_DRAW 1 + #endif + #endif + + /*Enable indev profiler*/ + #ifndef LV_PROFILER_INDEV + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_INDEV + #define LV_PROFILER_INDEV CONFIG_LV_PROFILER_INDEV + #else + #define LV_PROFILER_INDEV 0 + #endif + #else + #define LV_PROFILER_INDEV 1 + #endif + #endif + + /*Enable decoder profiler*/ + #ifndef LV_PROFILER_DECODER + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_DECODER + #define LV_PROFILER_DECODER CONFIG_LV_PROFILER_DECODER + #else + #define LV_PROFILER_DECODER 0 + #endif + #else + #define LV_PROFILER_DECODER 1 + #endif + #endif + + /*Enable font profiler*/ + #ifndef LV_PROFILER_FONT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_FONT + #define LV_PROFILER_FONT CONFIG_LV_PROFILER_FONT + #else + #define LV_PROFILER_FONT 0 + #endif + #else + #define LV_PROFILER_FONT 1 + #endif + #endif + + /*Enable fs profiler*/ + #ifndef LV_PROFILER_FS + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_FS + #define LV_PROFILER_FS CONFIG_LV_PROFILER_FS + #else + #define LV_PROFILER_FS 0 + #endif + #else + #define LV_PROFILER_FS 1 + #endif + #endif + + /*Enable style profiler*/ + #ifndef LV_PROFILER_STYLE + #ifdef CONFIG_LV_PROFILER_STYLE + #define LV_PROFILER_STYLE CONFIG_LV_PROFILER_STYLE + #else + #define LV_PROFILER_STYLE 0 + #endif + #endif + + /*Enable timer profiler*/ + #ifndef LV_PROFILER_TIMER + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_TIMER + #define LV_PROFILER_TIMER CONFIG_LV_PROFILER_TIMER + #else + #define LV_PROFILER_TIMER 0 + #endif + #else + #define LV_PROFILER_TIMER 1 + #endif + #endif + + /*Enable cache profiler*/ + #ifndef LV_PROFILER_CACHE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_CACHE + #define LV_PROFILER_CACHE CONFIG_LV_PROFILER_CACHE + #else + #define LV_PROFILER_CACHE 0 + #endif + #else + #define LV_PROFILER_CACHE 1 + #endif + #endif + + /*Enable event profiler*/ + #ifndef LV_PROFILER_EVENT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_PROFILER_EVENT + #define LV_PROFILER_EVENT CONFIG_LV_PROFILER_EVENT + #else + #define LV_PROFILER_EVENT 0 + #endif + #else + #define LV_PROFILER_EVENT 1 + #endif + #endif +#endif + +/** 1: Enable Monkey test */ +#ifndef LV_USE_MONKEY + #ifdef CONFIG_LV_USE_MONKEY + #define LV_USE_MONKEY CONFIG_LV_USE_MONKEY + #else + #define LV_USE_MONKEY 0 + #endif +#endif + +/** 1: Enable grid navigation */ +#ifndef LV_USE_GRIDNAV + #ifdef CONFIG_LV_USE_GRIDNAV + #define LV_USE_GRIDNAV CONFIG_LV_USE_GRIDNAV + #else + #define LV_USE_GRIDNAV 0 + #endif +#endif + +/** 1: Enable `lv_obj` fragment logic */ +#ifndef LV_USE_FRAGMENT + #ifdef CONFIG_LV_USE_FRAGMENT + #define LV_USE_FRAGMENT CONFIG_LV_USE_FRAGMENT + #else + #define LV_USE_FRAGMENT 0 + #endif +#endif + +/** 1: Support using images as font in label or span widgets */ +#ifndef LV_USE_IMGFONT + #ifdef CONFIG_LV_USE_IMGFONT + #define LV_USE_IMGFONT CONFIG_LV_USE_IMGFONT + #else + #define LV_USE_IMGFONT 0 + #endif +#endif + +/** 1: Enable an observer pattern implementation */ +#ifndef LV_USE_OBSERVER + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_OBSERVER + #define LV_USE_OBSERVER CONFIG_LV_USE_OBSERVER + #else + #define LV_USE_OBSERVER 0 + #endif + #else + #define LV_USE_OBSERVER 1 + #endif +#endif + +/** 1: Enable Pinyin input method + * - Requires: lv_keyboard */ +#ifndef LV_USE_IME_PINYIN + #ifdef CONFIG_LV_USE_IME_PINYIN + #define LV_USE_IME_PINYIN CONFIG_LV_USE_IME_PINYIN + #else + #define LV_USE_IME_PINYIN 0 + #endif +#endif +#if LV_USE_IME_PINYIN + /** 1: Use default thesaurus. + * @note If you do not use the default thesaurus, be sure to use `lv_ime_pinyin` after setting the thesaurus. */ + #ifndef LV_IME_PINYIN_USE_DEFAULT_DICT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT + #define LV_IME_PINYIN_USE_DEFAULT_DICT CONFIG_LV_IME_PINYIN_USE_DEFAULT_DICT + #else + #define LV_IME_PINYIN_USE_DEFAULT_DICT 0 + #endif + #else + #define LV_IME_PINYIN_USE_DEFAULT_DICT 1 + #endif + #endif + /** Set maximum number of candidate panels that can be displayed. + * @note This needs to be adjusted according to size of screen. */ + #ifndef LV_IME_PINYIN_CAND_TEXT_NUM + #ifdef CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM + #define LV_IME_PINYIN_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_CAND_TEXT_NUM + #else + #define LV_IME_PINYIN_CAND_TEXT_NUM 6 + #endif + #endif + + /** Use 9-key input (k9). */ + #ifndef LV_IME_PINYIN_USE_K9_MODE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_IME_PINYIN_USE_K9_MODE + #define LV_IME_PINYIN_USE_K9_MODE CONFIG_LV_IME_PINYIN_USE_K9_MODE + #else + #define LV_IME_PINYIN_USE_K9_MODE 0 + #endif + #else + #define LV_IME_PINYIN_USE_K9_MODE 1 + #endif + #endif + #if LV_IME_PINYIN_USE_K9_MODE == 1 + #ifndef LV_IME_PINYIN_K9_CAND_TEXT_NUM + #ifdef CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM CONFIG_LV_IME_PINYIN_K9_CAND_TEXT_NUM + #else + #define LV_IME_PINYIN_K9_CAND_TEXT_NUM 3 + #endif + #endif + #endif /*LV_IME_PINYIN_USE_K9_MODE*/ +#endif + +/** 1: Enable file explorer. + * - Requires: lv_table */ +#ifndef LV_USE_FILE_EXPLORER + #ifdef CONFIG_LV_USE_FILE_EXPLORER + #define LV_USE_FILE_EXPLORER CONFIG_LV_USE_FILE_EXPLORER + #else + #define LV_USE_FILE_EXPLORER 0 + #endif +#endif +#if LV_USE_FILE_EXPLORER + /** Maximum length of path */ + #ifndef LV_FILE_EXPLORER_PATH_MAX_LEN + #ifdef CONFIG_LV_FILE_EXPLORER_PATH_MAX_LEN + #define LV_FILE_EXPLORER_PATH_MAX_LEN CONFIG_LV_FILE_EXPLORER_PATH_MAX_LEN + #else + #define LV_FILE_EXPLORER_PATH_MAX_LEN (128) + #endif + #endif + /** Quick access bar, 1:use, 0:do not use. + * - Requires: lv_list */ + #ifndef LV_FILE_EXPLORER_QUICK_ACCESS + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_FILE_EXPLORER_QUICK_ACCESS + #define LV_FILE_EXPLORER_QUICK_ACCESS CONFIG_LV_FILE_EXPLORER_QUICK_ACCESS + #else + #define LV_FILE_EXPLORER_QUICK_ACCESS 0 + #endif + #else + #define LV_FILE_EXPLORER_QUICK_ACCESS 1 + #endif + #endif +#endif + +/** 1: Enable Font manager */ +#ifndef LV_USE_FONT_MANAGER + #ifdef CONFIG_LV_USE_FONT_MANAGER + #define LV_USE_FONT_MANAGER CONFIG_LV_USE_FONT_MANAGER + #else + #define LV_USE_FONT_MANAGER 0 + #endif +#endif +#if LV_USE_FONT_MANAGER + +/**Font manager name max length*/ +#ifndef LV_FONT_MANAGER_NAME_MAX_LEN + #ifdef CONFIG_LV_FONT_MANAGER_NAME_MAX_LEN + #define LV_FONT_MANAGER_NAME_MAX_LEN CONFIG_LV_FONT_MANAGER_NAME_MAX_LEN + #else + #define LV_FONT_MANAGER_NAME_MAX_LEN 32 + #endif +#endif + +#endif + +/** Enable emulated input devices, time emulation, and screenshot compares. */ +#ifndef LV_USE_TEST + #ifdef CONFIG_LV_USE_TEST + #define LV_USE_TEST CONFIG_LV_USE_TEST + #else + #define LV_USE_TEST 0 + #endif +#endif +#if LV_USE_TEST + +/** Enable `lv_test_screenshot_compare`. + * Requires lodepng and a few MB of extra RAM. */ +#ifndef LV_USE_TEST_SCREENSHOT_COMPARE + #ifdef CONFIG_LV_USE_TEST_SCREENSHOT_COMPARE + #define LV_USE_TEST_SCREENSHOT_COMPARE CONFIG_LV_USE_TEST_SCREENSHOT_COMPARE + #else + #define LV_USE_TEST_SCREENSHOT_COMPARE 0 + #endif +#endif + +#if LV_USE_TEST_SCREENSHOT_COMPARE + /** 1: Automatically create missing reference images*/ + #ifndef LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE + #define LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE CONFIG_LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE + #else + #define LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE 0 + #endif + #else + #define LV_TEST_SCREENSHOT_CREATE_REFERENCE_IMAGE 1 + #endif + #endif +#endif /*LV_USE_TEST_SCREENSHOT_COMPARE*/ + +#endif /*LV_USE_TEST*/ + +/** 1: Enable text translation support */ +#ifndef LV_USE_TRANSLATION + #ifdef CONFIG_LV_USE_TRANSLATION + #define LV_USE_TRANSLATION CONFIG_LV_USE_TRANSLATION + #else + #define LV_USE_TRANSLATION 0 + #endif +#endif + +/*1: Enable color filter style*/ +#ifndef LV_USE_COLOR_FILTER + #ifdef CONFIG_LV_USE_COLOR_FILTER + #define LV_USE_COLOR_FILTER CONFIG_LV_USE_COLOR_FILTER + #else + #define LV_USE_COLOR_FILTER 0 + #endif +#endif + +/*================== + * DEVICES + *==================*/ + +/** Use SDL to open window on PC and handle mouse and keyboard. */ +#ifndef LV_USE_SDL + #ifdef CONFIG_LV_USE_SDL + #define LV_USE_SDL CONFIG_LV_USE_SDL + #else + #define LV_USE_SDL 0 + #endif +#endif +#if LV_USE_SDL + #ifndef LV_SDL_INCLUDE_PATH + #ifdef CONFIG_LV_SDL_INCLUDE_PATH + #define LV_SDL_INCLUDE_PATH CONFIG_LV_SDL_INCLUDE_PATH + #else + #define LV_SDL_INCLUDE_PATH + #endif + #endif + #ifndef LV_SDL_RENDER_MODE + #ifdef CONFIG_LV_SDL_RENDER_MODE + #define LV_SDL_RENDER_MODE CONFIG_LV_SDL_RENDER_MODE + #else + #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /**< LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance */ + #endif + #endif + #ifndef LV_SDL_BUF_COUNT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_SDL_BUF_COUNT + #define LV_SDL_BUF_COUNT CONFIG_LV_SDL_BUF_COUNT + #else + #define LV_SDL_BUF_COUNT 0 + #endif + #else + #define LV_SDL_BUF_COUNT 1 /**< 1 or 2 */ + #endif + #endif + #ifndef LV_SDL_ACCELERATED + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_SDL_ACCELERATED + #define LV_SDL_ACCELERATED CONFIG_LV_SDL_ACCELERATED + #else + #define LV_SDL_ACCELERATED 0 + #endif + #else + #define LV_SDL_ACCELERATED 1 /**< 1: Use hardware acceleration*/ + #endif + #endif + #ifndef LV_SDL_FULLSCREEN + #ifdef CONFIG_LV_SDL_FULLSCREEN + #define LV_SDL_FULLSCREEN CONFIG_LV_SDL_FULLSCREEN + #else + #define LV_SDL_FULLSCREEN 0 /**< 1: Make the window full screen by default */ + #endif + #endif + #ifndef LV_SDL_DIRECT_EXIT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_SDL_DIRECT_EXIT + #define LV_SDL_DIRECT_EXIT CONFIG_LV_SDL_DIRECT_EXIT + #else + #define LV_SDL_DIRECT_EXIT 0 + #endif + #else + #define LV_SDL_DIRECT_EXIT 1 /**< 1: Exit the application when all SDL windows are closed */ + #endif + #endif + #ifndef LV_SDL_MOUSEWHEEL_MODE + #ifdef CONFIG_LV_SDL_MOUSEWHEEL_MODE + #define LV_SDL_MOUSEWHEEL_MODE CONFIG_LV_SDL_MOUSEWHEEL_MODE + #else + #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ + #endif + #endif +#endif + +/** Use X11 to open window on Linux desktop and handle mouse and keyboard */ +#ifndef LV_USE_X11 + #ifdef CONFIG_LV_USE_X11 + #define LV_USE_X11 CONFIG_LV_USE_X11 + #else + #define LV_USE_X11 0 + #endif +#endif +#if LV_USE_X11 + #ifndef LV_X11_DIRECT_EXIT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_X11_DIRECT_EXIT + #define LV_X11_DIRECT_EXIT CONFIG_LV_X11_DIRECT_EXIT + #else + #define LV_X11_DIRECT_EXIT 0 + #endif + #else + #define LV_X11_DIRECT_EXIT 1 /**< Exit application when all X11 windows have been closed */ + #endif + #endif + #ifndef LV_X11_DOUBLE_BUFFER + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_X11_DOUBLE_BUFFER + #define LV_X11_DOUBLE_BUFFER CONFIG_LV_X11_DOUBLE_BUFFER + #else + #define LV_X11_DOUBLE_BUFFER 0 + #endif + #else + #define LV_X11_DOUBLE_BUFFER 1 /**< Use double buffers for rendering */ + #endif + #endif + /* Select only 1 of the following render modes (LV_X11_RENDER_MODE_PARTIAL preferred!). */ + #ifndef LV_X11_RENDER_MODE_PARTIAL + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_X11_RENDER_MODE_PARTIAL + #define LV_X11_RENDER_MODE_PARTIAL CONFIG_LV_X11_RENDER_MODE_PARTIAL + #else + #define LV_X11_RENDER_MODE_PARTIAL 0 + #endif + #else + #define LV_X11_RENDER_MODE_PARTIAL 1 /**< Partial render mode (preferred) */ + #endif + #endif + #ifndef LV_X11_RENDER_MODE_DIRECT + #ifdef CONFIG_LV_X11_RENDER_MODE_DIRECT + #define LV_X11_RENDER_MODE_DIRECT CONFIG_LV_X11_RENDER_MODE_DIRECT + #else + #define LV_X11_RENDER_MODE_DIRECT 0 /**< Direct render mode */ + #endif + #endif + #ifndef LV_X11_RENDER_MODE_FULL + #ifdef CONFIG_LV_X11_RENDER_MODE_FULL + #define LV_X11_RENDER_MODE_FULL CONFIG_LV_X11_RENDER_MODE_FULL + #else + #define LV_X11_RENDER_MODE_FULL 0 /**< Full render mode */ + #endif + #endif +#endif + +/** Use Wayland to open a window and handle input on Linux or BSD desktops */ +#ifndef LV_USE_WAYLAND + #ifdef CONFIG_LV_USE_WAYLAND + #define LV_USE_WAYLAND CONFIG_LV_USE_WAYLAND + #else + #define LV_USE_WAYLAND 0 + #endif +#endif +#if LV_USE_WAYLAND + #ifndef LV_WAYLAND_DIRECT_EXIT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_WAYLAND_DIRECT_EXIT + #define LV_WAYLAND_DIRECT_EXIT CONFIG_LV_WAYLAND_DIRECT_EXIT + #else + #define LV_WAYLAND_DIRECT_EXIT 0 + #endif + #else + #define LV_WAYLAND_DIRECT_EXIT 1 /**< 1: Exit the application when all Wayland windows are closed */ + #endif + #endif +#endif + +/** Driver for /dev/fb */ +#ifndef LV_USE_LINUX_FBDEV + #ifdef CONFIG_LV_USE_LINUX_FBDEV + #define LV_USE_LINUX_FBDEV CONFIG_LV_USE_LINUX_FBDEV + #else + #define LV_USE_LINUX_FBDEV 0 + #endif +#endif +#if LV_USE_LINUX_FBDEV + #ifndef LV_LINUX_FBDEV_BSD + #ifdef CONFIG_LV_LINUX_FBDEV_BSD + #define LV_LINUX_FBDEV_BSD CONFIG_LV_LINUX_FBDEV_BSD + #else + #define LV_LINUX_FBDEV_BSD 0 + #endif + #endif + #ifndef LV_LINUX_FBDEV_RENDER_MODE + #ifdef CONFIG_LV_LINUX_FBDEV_RENDER_MODE + #define LV_LINUX_FBDEV_RENDER_MODE CONFIG_LV_LINUX_FBDEV_RENDER_MODE + #else + #define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL + #endif + #endif + #ifndef LV_LINUX_FBDEV_BUFFER_COUNT + #ifdef CONFIG_LV_LINUX_FBDEV_BUFFER_COUNT + #define LV_LINUX_FBDEV_BUFFER_COUNT CONFIG_LV_LINUX_FBDEV_BUFFER_COUNT + #else + #define LV_LINUX_FBDEV_BUFFER_COUNT 0 + #endif + #endif + #ifndef LV_LINUX_FBDEV_BUFFER_SIZE + #ifdef CONFIG_LV_LINUX_FBDEV_BUFFER_SIZE + #define LV_LINUX_FBDEV_BUFFER_SIZE CONFIG_LV_LINUX_FBDEV_BUFFER_SIZE + #else + #define LV_LINUX_FBDEV_BUFFER_SIZE 60 + #endif + #endif + #ifndef LV_LINUX_FBDEV_MMAP + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_LINUX_FBDEV_MMAP + #define LV_LINUX_FBDEV_MMAP CONFIG_LV_LINUX_FBDEV_MMAP + #else + #define LV_LINUX_FBDEV_MMAP 0 + #endif + #else + #define LV_LINUX_FBDEV_MMAP 1 + #endif + #endif +#endif + +/** Use Nuttx to open window and handle touchscreen */ +#ifndef LV_USE_NUTTX + #ifdef CONFIG_LV_USE_NUTTX + #define LV_USE_NUTTX CONFIG_LV_USE_NUTTX + #else + #define LV_USE_NUTTX 0 + #endif +#endif + +#if LV_USE_NUTTX + #ifndef LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP + #ifdef CONFIG_LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP + #define LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP CONFIG_LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP + #else + #define LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP 0 + #endif + #endif + + /** Use independent image heap for default draw buffer */ + #ifndef LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + #ifdef CONFIG_LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + #define LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP CONFIG_LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + #else + #define LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP 0 + #endif + #endif + + #ifndef LV_USE_NUTTX_LIBUV + #ifdef CONFIG_LV_USE_NUTTX_LIBUV + #define LV_USE_NUTTX_LIBUV CONFIG_LV_USE_NUTTX_LIBUV + #else + #define LV_USE_NUTTX_LIBUV 0 + #endif + #endif + + /** Use Nuttx custom init API to open window and handle touchscreen */ + #ifndef LV_USE_NUTTX_CUSTOM_INIT + #ifdef CONFIG_LV_USE_NUTTX_CUSTOM_INIT + #define LV_USE_NUTTX_CUSTOM_INIT CONFIG_LV_USE_NUTTX_CUSTOM_INIT + #else + #define LV_USE_NUTTX_CUSTOM_INIT 0 + #endif + #endif + + /** Driver for /dev/lcd */ + #ifndef LV_USE_NUTTX_LCD + #ifdef CONFIG_LV_USE_NUTTX_LCD + #define LV_USE_NUTTX_LCD CONFIG_LV_USE_NUTTX_LCD + #else + #define LV_USE_NUTTX_LCD 0 + #endif + #endif + #if LV_USE_NUTTX_LCD + #ifndef LV_NUTTX_LCD_BUFFER_COUNT + #ifdef CONFIG_LV_NUTTX_LCD_BUFFER_COUNT + #define LV_NUTTX_LCD_BUFFER_COUNT CONFIG_LV_NUTTX_LCD_BUFFER_COUNT + #else + #define LV_NUTTX_LCD_BUFFER_COUNT 0 + #endif + #endif + #ifndef LV_NUTTX_LCD_BUFFER_SIZE + #ifdef CONFIG_LV_NUTTX_LCD_BUFFER_SIZE + #define LV_NUTTX_LCD_BUFFER_SIZE CONFIG_LV_NUTTX_LCD_BUFFER_SIZE + #else + #define LV_NUTTX_LCD_BUFFER_SIZE 60 + #endif + #endif + #endif + + /** Driver for /dev/input */ + #ifndef LV_USE_NUTTX_TOUCHSCREEN + #ifdef CONFIG_LV_USE_NUTTX_TOUCHSCREEN + #define LV_USE_NUTTX_TOUCHSCREEN CONFIG_LV_USE_NUTTX_TOUCHSCREEN + #else + #define LV_USE_NUTTX_TOUCHSCREEN 0 + #endif + #endif + + /** Touchscreen cursor size in pixels(<=0: disable cursor) */ + #ifndef LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE + #ifdef CONFIG_LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE + #define LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE CONFIG_LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE + #else + #define LV_NUTTX_TOUCHSCREEN_CURSOR_SIZE 0 + #endif + #endif + + /** Driver for /dev/mouse */ + #ifndef LV_USE_NUTTX_MOUSE + #ifdef CONFIG_LV_USE_NUTTX_MOUSE + #define LV_USE_NUTTX_MOUSE CONFIG_LV_USE_NUTTX_MOUSE + #else + #define LV_USE_NUTTX_MOUSE 0 + #endif + #endif + + /** Mouse movement step (pixels) */ + #ifndef LV_USE_NUTTX_MOUSE_MOVE_STEP + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_NUTTX_MOUSE_MOVE_STEP + #define LV_USE_NUTTX_MOUSE_MOVE_STEP CONFIG_LV_USE_NUTTX_MOUSE_MOVE_STEP + #else + #define LV_USE_NUTTX_MOUSE_MOVE_STEP 0 + #endif + #else + #define LV_USE_NUTTX_MOUSE_MOVE_STEP 1 + #endif + #endif + + /*NuttX trace file and its path*/ + #ifndef LV_USE_NUTTX_TRACE_FILE + #ifdef CONFIG_LV_USE_NUTTX_TRACE_FILE + #define LV_USE_NUTTX_TRACE_FILE CONFIG_LV_USE_NUTTX_TRACE_FILE + #else + #define LV_USE_NUTTX_TRACE_FILE 0 + #endif + #endif + #if LV_USE_NUTTX_TRACE_FILE + #ifndef LV_NUTTX_TRACE_FILE_PATH + #ifdef CONFIG_LV_NUTTX_TRACE_FILE_PATH + #define LV_NUTTX_TRACE_FILE_PATH CONFIG_LV_NUTTX_TRACE_FILE_PATH + #else + #define LV_NUTTX_TRACE_FILE_PATH "/data/lvgl-trace.log" + #endif + #endif + #endif + +#endif + +/** Driver for /dev/dri/card */ +#ifndef LV_USE_LINUX_DRM + #ifdef CONFIG_LV_USE_LINUX_DRM + #define LV_USE_LINUX_DRM CONFIG_LV_USE_LINUX_DRM + #else + #define LV_USE_LINUX_DRM 0 + #endif +#endif + +#if LV_USE_LINUX_DRM + + /* Use the MESA GBM library to allocate DMA buffers that can be + * shared across sub-systems and libraries using the Linux DMA-BUF API. + * The GBM library aims to provide a platform independent memory management system + * it supports the major GPU vendors - This option requires linking with libgbm */ + #ifndef LV_USE_LINUX_DRM_GBM_BUFFERS + #ifdef CONFIG_LV_USE_LINUX_DRM_GBM_BUFFERS + #define LV_USE_LINUX_DRM_GBM_BUFFERS CONFIG_LV_USE_LINUX_DRM_GBM_BUFFERS + #else + #define LV_USE_LINUX_DRM_GBM_BUFFERS 0 + #endif + #endif +#endif + +/** Interface for TFT_eSPI */ +#ifndef LV_USE_TFT_ESPI + #ifdef CONFIG_LV_USE_TFT_ESPI + #define LV_USE_TFT_ESPI CONFIG_LV_USE_TFT_ESPI + #else + #define LV_USE_TFT_ESPI 0 + #endif +#endif + +/** Interface for Lovyan_GFX */ +#ifndef LV_USE_LOVYAN_GFX + #ifdef CONFIG_LV_USE_LOVYAN_GFX + #define LV_USE_LOVYAN_GFX CONFIG_LV_USE_LOVYAN_GFX + #else + #define LV_USE_LOVYAN_GFX 0 + #endif +#endif + +#if LV_USE_LOVYAN_GFX + #ifndef LV_LGFX_USER_INCLUDE + #ifdef CONFIG_LV_LGFX_USER_INCLUDE + #define LV_LGFX_USER_INCLUDE CONFIG_LV_LGFX_USER_INCLUDE + #else + #define LV_LGFX_USER_INCLUDE "lv_lgfx_user.hpp" + #endif + #endif + +#endif /*LV_USE_LOVYAN_GFX*/ + +/** Driver for evdev input devices */ +#ifndef LV_USE_EVDEV + #ifdef CONFIG_LV_USE_EVDEV + #define LV_USE_EVDEV CONFIG_LV_USE_EVDEV + #else + #define LV_USE_EVDEV 0 + #endif +#endif + +/** Driver for libinput input devices */ +#ifndef LV_USE_LIBINPUT + #ifdef CONFIG_LV_USE_LIBINPUT + #define LV_USE_LIBINPUT CONFIG_LV_USE_LIBINPUT + #else + #define LV_USE_LIBINPUT 0 + #endif +#endif + +#if LV_USE_LIBINPUT + #ifndef LV_LIBINPUT_BSD + #ifdef CONFIG_LV_LIBINPUT_BSD + #define LV_LIBINPUT_BSD CONFIG_LV_LIBINPUT_BSD + #else + #define LV_LIBINPUT_BSD 0 + #endif + #endif + + /** Full keyboard support */ + #ifndef LV_LIBINPUT_XKB + #ifdef CONFIG_LV_LIBINPUT_XKB + #define LV_LIBINPUT_XKB CONFIG_LV_LIBINPUT_XKB + #else + #define LV_LIBINPUT_XKB 0 + #endif + #endif + #if LV_LIBINPUT_XKB + /** "setxkbmap -query" can help find the right values for your keyboard */ + #ifndef LV_LIBINPUT_XKB_KEY_MAP + #ifdef CONFIG_LV_LIBINPUT_XKB_KEY_MAP + #define LV_LIBINPUT_XKB_KEY_MAP CONFIG_LV_LIBINPUT_XKB_KEY_MAP + #else + #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL } + #endif + #endif + #endif +#endif + +/* Drivers for LCD devices connected via SPI/parallel port */ +#ifndef LV_USE_ST7735 + #ifdef CONFIG_LV_USE_ST7735 + #define LV_USE_ST7735 CONFIG_LV_USE_ST7735 + #else + #define LV_USE_ST7735 0 + #endif +#endif +#ifndef LV_USE_ST7789 + #ifdef CONFIG_LV_USE_ST7789 + #define LV_USE_ST7789 CONFIG_LV_USE_ST7789 + #else + #define LV_USE_ST7789 0 + #endif +#endif +#ifndef LV_USE_ST7796 + #ifdef CONFIG_LV_USE_ST7796 + #define LV_USE_ST7796 CONFIG_LV_USE_ST7796 + #else + #define LV_USE_ST7796 0 + #endif +#endif +#ifndef LV_USE_ILI9341 + #ifdef CONFIG_LV_USE_ILI9341 + #define LV_USE_ILI9341 CONFIG_LV_USE_ILI9341 + #else + #define LV_USE_ILI9341 0 + #endif +#endif +#ifndef LV_USE_FT81X + #ifdef CONFIG_LV_USE_FT81X + #define LV_USE_FT81X CONFIG_LV_USE_FT81X + #else + #define LV_USE_FT81X 0 + #endif +#endif +#ifndef LV_USE_NV3007 + #ifdef CONFIG_LV_USE_NV3007 + #define LV_USE_NV3007 CONFIG_LV_USE_NV3007 + #else + #define LV_USE_NV3007 0 + #endif +#endif + +#if (LV_USE_ST7735 | LV_USE_ST7789 | LV_USE_ST7796 | LV_USE_ILI9341 | LV_USE_NV3007) + #ifndef LV_USE_GENERIC_MIPI + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_GENERIC_MIPI + #define LV_USE_GENERIC_MIPI CONFIG_LV_USE_GENERIC_MIPI + #else + #define LV_USE_GENERIC_MIPI 0 + #endif + #else + #define LV_USE_GENERIC_MIPI 1 + #endif + #endif +#else + #ifndef LV_USE_GENERIC_MIPI + #ifdef CONFIG_LV_USE_GENERIC_MIPI + #define LV_USE_GENERIC_MIPI CONFIG_LV_USE_GENERIC_MIPI + #else + #define LV_USE_GENERIC_MIPI 0 + #endif + #endif +#endif + +/** Driver for Renesas GLCD */ +#ifndef LV_USE_RENESAS_GLCDC + #ifdef CONFIG_LV_USE_RENESAS_GLCDC + #define LV_USE_RENESAS_GLCDC CONFIG_LV_USE_RENESAS_GLCDC + #else + #define LV_USE_RENESAS_GLCDC 0 + #endif +#endif + +/** Driver for ST LTDC */ +#ifndef LV_USE_ST_LTDC + #ifdef CONFIG_LV_USE_ST_LTDC + #define LV_USE_ST_LTDC CONFIG_LV_USE_ST_LTDC + #else + #define LV_USE_ST_LTDC 0 + #endif +#endif +#if LV_USE_ST_LTDC + /* Only used for partial. */ + #ifndef LV_ST_LTDC_USE_DMA2D_FLUSH + #ifdef CONFIG_LV_ST_LTDC_USE_DMA2D_FLUSH + #define LV_ST_LTDC_USE_DMA2D_FLUSH CONFIG_LV_ST_LTDC_USE_DMA2D_FLUSH + #else + #define LV_ST_LTDC_USE_DMA2D_FLUSH 0 + #endif + #endif +#endif + +/** Driver for NXP ELCDIF */ +#ifndef LV_USE_NXP_ELCDIF + #ifdef CONFIG_LV_USE_NXP_ELCDIF + #define LV_USE_NXP_ELCDIF CONFIG_LV_USE_NXP_ELCDIF + #else + #define LV_USE_NXP_ELCDIF 0 + #endif +#endif + +/** LVGL Windows backend */ +#ifndef LV_USE_WINDOWS + #ifdef CONFIG_LV_USE_WINDOWS + #define LV_USE_WINDOWS CONFIG_LV_USE_WINDOWS + #else + #define LV_USE_WINDOWS 0 + #endif +#endif + +/** LVGL UEFI backend */ +#ifndef LV_USE_UEFI + #ifdef CONFIG_LV_USE_UEFI + #define LV_USE_UEFI CONFIG_LV_USE_UEFI + #else + #define LV_USE_UEFI 0 + #endif +#endif +#if LV_USE_UEFI + #ifndef LV_USE_UEFI_INCLUDE + #ifdef CONFIG_LV_USE_UEFI_INCLUDE + #define LV_USE_UEFI_INCLUDE CONFIG_LV_USE_UEFI_INCLUDE + #else + #define LV_USE_UEFI_INCLUDE "myefi.h" /**< Header that hides the actual framework (EDK2, gnu-efi, ...) */ + #endif + #endif + #ifndef LV_UEFI_USE_MEMORY_SERVICES + #ifdef CONFIG_LV_UEFI_USE_MEMORY_SERVICES + #define LV_UEFI_USE_MEMORY_SERVICES CONFIG_LV_UEFI_USE_MEMORY_SERVICES + #else + #define LV_UEFI_USE_MEMORY_SERVICES 0 /**< Use the memory functions from the boot services table */ + #endif + #endif +#endif + +/** Use a generic OpenGL driver that can be used to embed in other applications or used with GLFW/EGL + * - Requires LV_USE_MATRIX. + */ +#ifndef LV_USE_OPENGLES + #ifdef CONFIG_LV_USE_OPENGLES + #define LV_USE_OPENGLES CONFIG_LV_USE_OPENGLES + #else + #define LV_USE_OPENGLES 0 + #endif +#endif +#if LV_USE_OPENGLES + #ifndef LV_USE_OPENGLES_DEBUG + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_USE_OPENGLES_DEBUG + #define LV_USE_OPENGLES_DEBUG CONFIG_LV_USE_OPENGLES_DEBUG + #else + #define LV_USE_OPENGLES_DEBUG 0 + #endif + #else + #define LV_USE_OPENGLES_DEBUG 1 /**< Enable or disable debug for opengles */ + #endif + #endif +#endif + +/** Use GLFW to open window on PC and handle mouse and keyboard. Requires*/ +#ifndef LV_USE_GLFW + #ifdef CONFIG_LV_USE_GLFW + #define LV_USE_GLFW CONFIG_LV_USE_GLFW + #else + #define LV_USE_GLFW 0 + #endif +#endif + + +/** QNX Screen display and input drivers */ +#ifndef LV_USE_QNX + #ifdef CONFIG_LV_USE_QNX + #define LV_USE_QNX CONFIG_LV_USE_QNX + #else + #define LV_USE_QNX 0 + #endif +#endif +#if LV_USE_QNX + #ifndef LV_QNX_BUF_COUNT + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_QNX_BUF_COUNT + #define LV_QNX_BUF_COUNT CONFIG_LV_QNX_BUF_COUNT + #else + #define LV_QNX_BUF_COUNT 0 + #endif + #else + #define LV_QNX_BUF_COUNT 1 /**< 1 or 2 */ + #endif + #endif +#endif + +/** Enable or disable for external data and destructor function */ +#ifndef LV_USE_EXT_DATA + #ifdef CONFIG_LV_USE_EXT_DATA + #define LV_USE_EXT_DATA CONFIG_LV_USE_EXT_DATA + #else + #define LV_USE_EXT_DATA 0 + #endif +#endif + +/*===================== +* BUILD OPTIONS +*======================*/ + +/** Enable examples to be built with the library. */ +#ifndef LV_BUILD_EXAMPLES + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_BUILD_EXAMPLES + #define LV_BUILD_EXAMPLES CONFIG_LV_BUILD_EXAMPLES + #else + #define LV_BUILD_EXAMPLES 0 + #endif + #else + #define LV_BUILD_EXAMPLES 1 + #endif +#endif + +/** Build the demos */ +#ifndef LV_BUILD_DEMOS + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_BUILD_DEMOS + #define LV_BUILD_DEMOS CONFIG_LV_BUILD_DEMOS + #else + #define LV_BUILD_DEMOS 0 + #endif + #else + #define LV_BUILD_DEMOS 1 + #endif +#endif + +/*=================== + * DEMO USAGE + ====================*/ + +#if LV_BUILD_DEMOS + /** Show some widgets. This might be required to increase `LV_MEM_SIZE`. */ + #ifndef LV_USE_DEMO_WIDGETS + #ifdef CONFIG_LV_USE_DEMO_WIDGETS + #define LV_USE_DEMO_WIDGETS CONFIG_LV_USE_DEMO_WIDGETS + #else + #define LV_USE_DEMO_WIDGETS 0 + #endif + #endif + + /** Demonstrate usage of encoder and keyboard. */ + #ifndef LV_USE_DEMO_KEYPAD_AND_ENCODER + #ifdef CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER + #define LV_USE_DEMO_KEYPAD_AND_ENCODER CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER + #else + #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + #endif + #endif + + /** Benchmark your system */ + #ifndef LV_USE_DEMO_BENCHMARK + #ifdef CONFIG_LV_USE_DEMO_BENCHMARK + #define LV_USE_DEMO_BENCHMARK CONFIG_LV_USE_DEMO_BENCHMARK + #else + #define LV_USE_DEMO_BENCHMARK 0 + #endif + #endif + + #if LV_USE_DEMO_BENCHMARK + /** Use fonts where bitmaps are aligned 16 byte and has Nx16 byte stride */ + #ifndef LV_DEMO_BENCHMARK_ALIGNED_FONTS + #ifdef CONFIG_LV_DEMO_BENCHMARK_ALIGNED_FONTS + #define LV_DEMO_BENCHMARK_ALIGNED_FONTS CONFIG_LV_DEMO_BENCHMARK_ALIGNED_FONTS + #else + #define LV_DEMO_BENCHMARK_ALIGNED_FONTS 0 + #endif + #endif + #endif + + /** Render test for each primitive. + * - Requires at least 480x272 display. */ + #ifndef LV_USE_DEMO_RENDER + #ifdef CONFIG_LV_USE_DEMO_RENDER + #define LV_USE_DEMO_RENDER CONFIG_LV_USE_DEMO_RENDER + #else + #define LV_USE_DEMO_RENDER 0 + #endif + #endif + + /** Stress test for LVGL */ + #ifndef LV_USE_DEMO_STRESS + #ifdef CONFIG_LV_USE_DEMO_STRESS + #define LV_USE_DEMO_STRESS CONFIG_LV_USE_DEMO_STRESS + #else + #define LV_USE_DEMO_STRESS 0 + #endif + #endif + + /** Music player demo */ + #ifndef LV_USE_DEMO_MUSIC + #ifdef CONFIG_LV_USE_DEMO_MUSIC + #define LV_USE_DEMO_MUSIC CONFIG_LV_USE_DEMO_MUSIC + #else + #define LV_USE_DEMO_MUSIC 0 + #endif + #endif + #if LV_USE_DEMO_MUSIC + #ifndef LV_DEMO_MUSIC_SQUARE + #ifdef CONFIG_LV_DEMO_MUSIC_SQUARE + #define LV_DEMO_MUSIC_SQUARE CONFIG_LV_DEMO_MUSIC_SQUARE + #else + #define LV_DEMO_MUSIC_SQUARE 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_LANDSCAPE + #ifdef CONFIG_LV_DEMO_MUSIC_LANDSCAPE + #define LV_DEMO_MUSIC_LANDSCAPE CONFIG_LV_DEMO_MUSIC_LANDSCAPE + #else + #define LV_DEMO_MUSIC_LANDSCAPE 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_ROUND + #ifdef CONFIG_LV_DEMO_MUSIC_ROUND + #define LV_DEMO_MUSIC_ROUND CONFIG_LV_DEMO_MUSIC_ROUND + #else + #define LV_DEMO_MUSIC_ROUND 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_LARGE + #ifdef CONFIG_LV_DEMO_MUSIC_LARGE + #define LV_DEMO_MUSIC_LARGE CONFIG_LV_DEMO_MUSIC_LARGE + #else + #define LV_DEMO_MUSIC_LARGE 0 + #endif + #endif + #ifndef LV_DEMO_MUSIC_AUTO_PLAY + #ifdef CONFIG_LV_DEMO_MUSIC_AUTO_PLAY + #define LV_DEMO_MUSIC_AUTO_PLAY CONFIG_LV_DEMO_MUSIC_AUTO_PLAY + #else + #define LV_DEMO_MUSIC_AUTO_PLAY 0 + #endif + #endif + #endif + + /** Vector graphic demo */ + #ifndef LV_USE_DEMO_VECTOR_GRAPHIC + #ifdef CONFIG_LV_USE_DEMO_VECTOR_GRAPHIC + #define LV_USE_DEMO_VECTOR_GRAPHIC CONFIG_LV_USE_DEMO_VECTOR_GRAPHIC + #else + #define LV_USE_DEMO_VECTOR_GRAPHIC 0 + #endif + #endif + + /** GLTF demo */ + #ifndef LV_USE_DEMO_GLTF + #ifdef CONFIG_LV_USE_DEMO_GLTF + #define LV_USE_DEMO_GLTF CONFIG_LV_USE_DEMO_GLTF + #else + #define LV_USE_DEMO_GLTF 0 + #endif + #endif + + /*--------------------------- + * Demos from lvgl/lv_demos + ---------------------------*/ + + /** Flex layout demo */ + #ifndef LV_USE_DEMO_FLEX_LAYOUT + #ifdef CONFIG_LV_USE_DEMO_FLEX_LAYOUT + #define LV_USE_DEMO_FLEX_LAYOUT CONFIG_LV_USE_DEMO_FLEX_LAYOUT + #else + #define LV_USE_DEMO_FLEX_LAYOUT 0 + #endif + #endif + + /** Smart-phone like multi-language demo */ + #ifndef LV_USE_DEMO_MULTILANG + #ifdef CONFIG_LV_USE_DEMO_MULTILANG + #define LV_USE_DEMO_MULTILANG CONFIG_LV_USE_DEMO_MULTILANG + #else + #define LV_USE_DEMO_MULTILANG 0 + #endif + #endif + + /*E-bike demo with Lottie animations (if LV_USE_LOTTIE is enabled)*/ + #ifndef LV_USE_DEMO_EBIKE + #ifdef CONFIG_LV_USE_DEMO_EBIKE + #define LV_USE_DEMO_EBIKE CONFIG_LV_USE_DEMO_EBIKE + #else + #define LV_USE_DEMO_EBIKE 0 + #endif + #endif + #if LV_USE_DEMO_EBIKE + #ifndef LV_DEMO_EBIKE_PORTRAIT + #ifdef CONFIG_LV_DEMO_EBIKE_PORTRAIT + #define LV_DEMO_EBIKE_PORTRAIT CONFIG_LV_DEMO_EBIKE_PORTRAIT + #else + #define LV_DEMO_EBIKE_PORTRAIT 0 /*0: for 480x270..480x320, 1: for 480x800..720x1280*/ + #endif + #endif + #endif + + /** High-resolution demo */ + #ifndef LV_USE_DEMO_HIGH_RES + #ifdef CONFIG_LV_USE_DEMO_HIGH_RES + #define LV_USE_DEMO_HIGH_RES CONFIG_LV_USE_DEMO_HIGH_RES + #else + #define LV_USE_DEMO_HIGH_RES 0 + #endif + #endif + + /* Smart watch demo */ + #ifndef LV_USE_DEMO_SMARTWATCH + #ifdef CONFIG_LV_USE_DEMO_SMARTWATCH + #define LV_USE_DEMO_SMARTWATCH CONFIG_LV_USE_DEMO_SMARTWATCH + #else + #define LV_USE_DEMO_SMARTWATCH 0 + #endif + #endif +#endif /* LV_BUILD_DEMOS */ + + + +/*---------------------------------- + * End of parsing lv_conf_template.h + -----------------------------------*/ + +/*Fix inconsistent name*/ +#define LV_USE_ANIMIMAGE LV_USE_ANIMIMG + +#ifndef __ASSEMBLY__ +LV_EXPORT_CONST_INT(LV_DPI_DEF); +LV_EXPORT_CONST_INT(LV_DRAW_BUF_STRIDE_ALIGN); +LV_EXPORT_CONST_INT(LV_DRAW_BUF_ALIGN); +#endif + +#undef LV_KCONFIG_PRESENT + +/* Disable VGLite drivers if VGLite drawing is disabled */ +#ifndef LV_USE_VG_LITE_DRIVER + #define LV_USE_VG_LITE_DRIVER 0 +#endif + +#ifndef LV_USE_VG_LITE_THORVG + #define LV_USE_VG_LITE_THORVG 0 +#endif + +/* Set some defines if a dependency is disabled. */ +#if LV_USE_LOG == 0 + #define LV_LOG_LEVEL LV_LOG_LEVEL_NONE + #define LV_LOG_TRACE_MEM 0 + #define LV_LOG_TRACE_TIMER 0 + #define LV_LOG_TRACE_INDEV 0 + #define LV_LOG_TRACE_DISP_REFR 0 + #define LV_LOG_TRACE_EVENT 0 + #define LV_LOG_TRACE_OBJ_CREATE 0 + #define LV_LOG_TRACE_LAYOUT 0 + #define LV_LOG_TRACE_ANIM 0 +#endif /*LV_USE_LOG*/ + +#if LV_USE_WAYLAND + /*Automatically detect wayland backend*/ + #if LV_USE_OPENGLES + #define LV_WAYLAND_USE_EGL 1 + #define LV_WAYLAND_USE_G2D 0 + #define LV_WAYLAND_USE_SHM 0 + #elif LV_USE_G2D + #define LV_WAYLAND_USE_EGL 0 + #define LV_WAYLAND_USE_G2D 1 + #define LV_WAYLAND_USE_SHM 0 + #else + #define LV_WAYLAND_USE_EGL 0 + #define LV_WAYLAND_USE_G2D 0 + #define LV_WAYLAND_USE_SHM 1 + #endif +#else + #define LV_WAYLAND_USE_G2D 0 + #define LV_WAYLAND_USE_SHM 0 + #define LV_WAYLAND_USE_EGL 0 +#endif + +#if LV_USE_LINUX_DRM + #if LV_USE_OPENGLES + #define LV_LINUX_DRM_USE_EGL 1 + #else + #define LV_LINUX_DRM_USE_EGL 0 + #endif /* LV_USE_OPENGLES */ +#else + #define LV_LINUX_DRM_USE_EGL 0 +#endif /*LV_USE_LINUX_DRM*/ + +#if LV_USE_SYSMON == 0 + #define LV_USE_PERF_MONITOR 0 + #define LV_USE_MEM_MONITOR 0 + #define LV_SYSMON_PROC_IDLE_AVAILABLE 0 +#endif /*LV_USE_SYSMON*/ + +#if LV_USE_PERF_MONITOR == 0 + #define LV_USE_PERF_MONITOR_LOG_MODE 0 +#endif /*LV_USE_PERF_MONITOR*/ + +#if LV_BUILD_DEMOS == 0 + #define LV_USE_DEMO_WIDGETS 0 + #define LV_USE_DEMO_KEYPAD_AND_ENCODER 0 + #define LV_USE_DEMO_BENCHMARK 0 + #define LV_USE_DEMO_RENDER 0 + #define LV_USE_DEMO_STRESS 0 + #define LV_USE_DEMO_MUSIC 0 + #define LV_USE_DEMO_VECTOR_GRAPHIC 0 + #define LV_USE_DEMO_FLEX_LAYOUT 0 + #define LV_USE_DEMO_MULTILANG 0 + #define LV_USE_DEMO_EBIKE 0 + #define LV_USE_DEMO_HIGH_RES 0 + #define LV_USE_DEMO_SMARTWATCH 0 + #define LV_USE_DEMO_GLTF 0 +#endif /* LV_BUILD_DEMOS */ + +#ifndef LV_USE_LZ4 + #if (LV_USE_LZ4_INTERNAL || LV_USE_LZ4_EXTERNAL) + #define LV_USE_LZ4 1 + #else + #define LV_USE_LZ4 0 + #endif +#endif + +#ifndef LV_USE_THORVG + #if (LV_USE_THORVG_INTERNAL || LV_USE_THORVG_EXTERNAL) + #define LV_USE_THORVG 1 + #else + #define LV_USE_THORVG 0 + #endif +#endif + +#if LV_USE_SDL && LV_USE_OPENGLES && (LV_USE_DRAW_OPENGLES || LV_USE_DRAW_NANOVG) + #define LV_SDL_USE_EGL 1 +#else + #define LV_SDL_USE_EGL 0 +#endif + +#ifndef LV_USE_EGL + #if LV_LINUX_DRM_USE_EGL || LV_WAYLAND_USE_EGL || LV_SDL_USE_EGL + #define LV_USE_EGL 1 + #else + #define LV_USE_EGL 0 + #endif +#endif /* LV_USE_EGL */ + + +#if LV_USE_OS + #if (LV_USE_FREETYPE || LV_USE_THORVG) && LV_DRAW_THREAD_STACK_SIZE < (32 * 1024) + #error "Increase LV_DRAW_THREAD_STACK_SIZE to at least 32KB for FreeType or ThorVG." + #endif + + #if defined(LV_DRAW_THREAD_STACKSIZE) && !defined(LV_DRAW_THREAD_STACK_SIZE) + #warning "LV_DRAW_THREAD_STACKSIZE was renamed to LV_DRAW_THREAD_STACK_SIZE. Please update lv_conf.h or run menuconfig again." + #define LV_DRAW_THREAD_STACK_SIZE LV_DRAW_THREAD_STACKSIZE + #endif +#endif + +/*Allow only upper case letters and '/' ('/' is a special case for backward compatibility)*/ +#define LV_FS_IS_VALID_LETTER(l) ((l) == '/' || ((l) >= 'A' && (l) <= 'Z')) + +/* If running without lv_conf.h, add typedefs with default value. */ +#ifdef LV_CONF_SKIP + #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) /*Disable warnings for Visual Studio*/ + #define _CRT_SECURE_NO_WARNINGS + #endif +#endif /*defined(LV_CONF_SKIP)*/ + +#endif /*LV_CONF_INTERNAL_H*/ diff --git a/inc/lvgl/src/lv_conf_kconfig.h b/inc/lvgl/src/lv_conf_kconfig.h new file mode 100644 index 0000000..10dee05 --- /dev/null +++ b/inc/lvgl/src/lv_conf_kconfig.h @@ -0,0 +1,325 @@ +/** * @file lv_conf_kconfig.h * Configs that need special handling when LVGL is used with Kconfig */ + +#ifndef LV_CONF_KCONFIG_H +#define LV_CONF_KCONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LV_CONF_KCONFIG_EXTERNAL_INCLUDE +# include LV_CONF_KCONFIG_EXTERNAL_INCLUDE +#else + +# ifdef ESP_PLATFORM +# include "sdkconfig.h" +# include "esp_attr.h" +# endif + +# ifdef __NuttX__ +# include +/* + * Make sure version number in Kconfig file is correctly set. + * Mismatch can happen when user manually copy lvgl/Kconfig file to their project, like what NuttX does. + */ +# include "../lv_version.h" + +# if CONFIG_LVGL_VERSION_MAJOR != LVGL_VERSION_MAJOR || CONFIG_LVGL_VERSION_MINOR != LVGL_VERSION_MINOR \ + || CONFIG_LVGL_VERSION_PATCH != LVGL_VERSION_PATCH +# warning "Version mismatch between Kconfig and lvgl/lv_version.h" +# endif +# elif defined(__RTTHREAD__) +# define LV_CONF_INCLUDE_SIMPLE +# include +# endif + +#endif /*LV_CONF_KCONFIG_EXTERNAL_INCLUDE*/ + +/******************* + * LV_USE_STDLIB_MALLOC + *******************/ + +#ifdef CONFIG_LV_USE_BUILTIN_MALLOC +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_BUILTIN +#elif defined(CONFIG_LV_USE_CLIB_MALLOC) +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_CLIB +#elif defined(CONFIG_LV_USE_MICROPYTHON_MALLOC) +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_MICROPYTHON +#elif defined(CONFIG_LV_USE_RTTHREAD_MALLOC) +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_RTTHREAD +#elif defined (CONFIG_LV_USE_CUSTOM_MALLOC) +# define CONFIG_LV_USE_STDLIB_MALLOC LV_STDLIB_CUSTOM +#endif + +/******************* + * LV_USE_STDLIB_STRING + *******************/ + +#ifdef CONFIG_LV_USE_BUILTIN_STRING +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN +#elif defined(CONFIG_LV_USE_CLIB_STRING) +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_CLIB +#elif defined(CONFIG_LV_USE_MICROPYTHON_STRING) +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_MICROPYTHON +#elif defined(CONFIG_LV_USE_RTTHREAD_STRING) +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_RTTHREAD +#elif defined (CONFIG_LV_USE_CUSTOM_STRING) +# define CONFIG_LV_USE_STDLIB_STRING LV_STDLIB_CUSTOM +#endif + +/******************* + * LV_USE_STDLIB_SPRINTF + *******************/ + +#ifdef CONFIG_LV_USE_BUILTIN_SPRINTF +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN +#elif defined(CONFIG_LV_USE_CLIB_SPRINTF) +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_CLIB +#elif defined(CONFIG_LV_USE_MICROPYTHON_SPRINTF) +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_MICROPYTHON +#elif defined(CONFIG_LV_USE_RTTHREAD_SPRINTF) +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_RTTHREAD +#elif defined (CONFIG_LV_USE_CUSTOM_SPRINTF) +# define CONFIG_LV_USE_STDLIB_SPRINTF LV_STDLIB_CUSTOM +#endif + +/******************* + * LV_USE_OS + *******************/ + +#ifdef CONFIG_LV_OS_NONE +# define CONFIG_LV_USE_OS LV_OS_NONE +#elif defined(CONFIG_LV_OS_PTHREAD) +# define CONFIG_LV_USE_OS LV_OS_PTHREAD +#elif defined(CONFIG_LV_OS_FREERTOS) +# define CONFIG_LV_USE_OS LV_OS_FREERTOS +#elif defined(CONFIG_LV_OS_CMSIS_RTOS2) +# define CONFIG_LV_USE_OS LV_OS_CMSIS_RTOS2 +#elif defined (CONFIG_LV_OS_RTTHREAD) +# define CONFIG_LV_USE_OS LV_OS_RTTHREAD +#elif defined (CONFIG_LV_OS_WINDOWS) +# define CONFIG_LV_USE_OS LV_OS_WINDOWS +#elif defined (CONFIG_LV_OS_MQX) +# define CONFIG_LV_USE_OS LV_OS_MQX +#elif defined (CONFIG_LV_OS_SDL2) +# define CONFIG_LV_USE_OS LV_OS_SDL2 +#elif defined (CONFIG_LV_OS_CUSTOM) +# define CONFIG_LV_USE_OS LV_OS_CUSTOM +#endif + +/******************* + * LV_NANOVG_BACKEND + *******************/ + +#ifdef CONFIG_LV_NANOVG_BACKEND_GL2 +# define CONFIG_LV_NANOVG_BACKEND LV_NANOVG_BACKEND_GL2 +#elif defined(CONFIG_LV_NANOVG_BACKEND_GL3) +# define CONFIG_LV_NANOVG_BACKEND LV_NANOVG_BACKEND_GL3 +#elif defined(CONFIG_LV_NANOVG_BACKEND_GLES2) +# define CONFIG_LV_NANOVG_BACKEND LV_NANOVG_BACKEND_GLES2 +#elif defined(CONFIG_LV_NANOVG_BACKEND_GLES3) +# define CONFIG_LV_NANOVG_BACKEND LV_NANOVG_BACKEND_GLES3 +#endif + +/******************* + * LV_MEM_SIZE + *******************/ + +#ifdef CONFIG_LV_MEM_SIZE_KILOBYTES +# if(CONFIG_LV_MEM_SIZE_KILOBYTES < 2) +# error "LV_MEM_SIZE >= 2kB is required" +# endif + +# define CONFIG_LV_MEM_SIZE (CONFIG_LV_MEM_SIZE_KILOBYTES * 1024U) +#endif + +#ifdef CONFIG_LV_MEM_POOL_EXPAND_SIZE_KILOBYTES +# define CONFIG_LV_MEM_POOL_EXPAND_SIZE (CONFIG_LV_MEM_POOL_EXPAND_SIZE_KILOBYTES * 1024U) +#endif + +/*------------------ + * MONITOR POSITION + *-----------------*/ + +#ifdef CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_LEFT +#elif defined(CONFIG_LV_USE_PERF_MONITOR_ALIGN_TOP_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_RIGHT +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_LEFT) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_BOTTOM_RIGHT) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_LEFT_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_LEFT_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_RIGHT_MID) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_RIGHT_MID +#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_CENTER) +# define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_CENTER +#endif + +#ifdef CONFIG_LV_MEM_MONITOR_ALIGN_TOP_LEFT +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_LEFT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_RIGHT) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_RIGHT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_LEFT) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_LEFT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_BOTTOM_RIGHT) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_BOTTOM_RIGHT +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_LEFT_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_LEFT_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_RIGHT_MID) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_RIGHT_MID +#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_CENTER) +# define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_CENTER +#endif + +/******************** + * FONT SELECTION + *******************/ + +/** + * NOTE: In Kconfig instead of `LV_DEFAULT_FONT` + * `CONFIG_LV_FONT_DEFAULT_` is defined + * hence the large selection with if-s + */ + +/*------------------ + * DEFAULT FONT + *-----------------*/ +#ifdef CONFIG_LV_FONT_DEFAULT_MONTSERRAT_8 +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_8 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_10) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_10 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_12 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_14) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_14 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_16) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_16 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_18) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_18 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_20) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_20 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_22) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_22 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_24) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_24 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_26 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_28 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_30) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_30 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_32) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_32 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_34) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_34 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_36) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_36 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_38) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_38 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_40) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_40 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_42) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_42 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_44) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_44 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_46) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_46 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_48) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_48 +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12_SUBPX) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_12_subpx +#elif defined(CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED) +# define CONFIG_LV_FONT_DEFAULT &lv_font_montserrat_28_compressed +#elif defined(CONFIG_LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW) +# define CONFIG_LV_FONT_DEFAULT &lv_font_dejavu_16_persian_hebrew +#elif defined(CONFIG_LV_FONT_SOURCE_HAN_SANS_SC_14_CJK) +# define CONFIG_LV_FONT_DEFAULT &lv_font_source_han_sans_sc_14_cjk +#elif defined(CONFIG_LV_FONT_SOURCE_HAN_SANS_SC_16_CJK) +# define CONFIG_LV_FONT_DEFAULT &lv_font_source_han_sans_sc_16_cjk +#elif defined(CONFIG_LV_FONT_DEFAULT_UNSCII_8) +# define CONFIG_LV_FONT_DEFAULT &lv_font_unscii_8 +#elif defined(CONFIG_LV_FONT_DEFAULT_UNSCII_16) +# define CONFIG_LV_FONT_DEFAULT &lv_font_unscii_16 +#endif + +/*------------------ + * TEXT ENCODING + *-----------------*/ +#ifdef CONFIG_LV_TXT_ENC_UTF8 +# define CONFIG_LV_TXT_ENC LV_TXT_ENC_UTF8 +#elif defined(CONFIG_LV_TXT_ENC_ASCII) +# define CONFIG_LV_TXT_ENC LV_TXT_ENC_ASCII +#endif + +/*------------------ + * BIDI DIRECTION + *-----------------*/ + +#ifdef CONFIG_LV_BASE_DIR_LTR +# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_LTR +#elif defined(CONFIG_LV_BASE_DIR_RTL) +# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_RTL +#elif defined(CONFIG_LV_BASE_DIR_AUTO) +# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO +#endif + +/*------------------ + * SDL + *-----------------*/ + +#ifdef CONFIG_LV_SDL_RENDER_MODE_PARTIAL +# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL +#elif defined(CONFIG_LV_SDL_RENDER_MODE_DIRECT) +# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT +#elif defined(CONFIG_LV_SDL_RENDER_MODE_FULL) +# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL +#endif + +/*------------------ + * WAYLAND + *-----------------*/ + +#ifdef CONFIG_LV_WAYLAND_RENDER_MODE_PARTIAL +# define CONFIG_LV_WAYLAND_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL +#elif defined(CONFIG_LV_WAYLAND_RENDER_MODE_DIRECT) +# define CONFIG_LV_WAYLAND_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT +#elif defined(CONFIG_LV_WAYLAND_RENDER_MODE_FULL) +# define CONFIG_LV_WAYLAND_RENDER_MODE_FULL LV_DISPLAY_RENDER_MODE_FULL +#endif + +/*------------------ + * LINUX FBDEV + *-----------------*/ + +#ifdef CONFIG_LV_LINUX_FBDEV_RENDER_MODE_PARTIAL +# define CONFIG_LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL +#elif defined(CONFIG_LV_LINUX_FBDEV_RENDER_MODE_DIRECT) +# define CONFIG_LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT +#elif defined(CONFIG_LV_LINUX_FBDEV_RENDER_MODE_FULL) +# define CONFIG_LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL +#endif + + +#ifdef CONFIG_LV_USE_CALENDAR +# ifdef CONFIG_LV_CALENDAR_WEEK_STARTS_MONDAY +# define CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES { CONFIG_LV_MONDAY_STR , CONFIG_LV_TUESDAY_STR, CONFIG_LV_WEDNESDAY_STR, CONFIG_LV_THURSDAY_STR, CONFIG_LV_FRIDAY_STR, CONFIG_LV_SATURDAY_STR, CONFIG_LV_SUNDAY_STR } +# else +# define CONFIG_LV_CALENDAR_DEFAULT_DAY_NAMES { CONFIG_LV_SUNDAY_STR, CONFIG_LV_MONDAY_STR , CONFIG_LV_TUESDAY_STR, CONFIG_LV_WEDNESDAY_STR, CONFIG_LV_THURSDAY_STR, CONFIG_LV_FRIDAY_STR, CONFIG_LV_SATURDAY_STR } +# endif +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CONF_KCONFIG_H*/ diff --git a/inc/lvgl/src/lv_init.c b/inc/lvgl/src/lv_init.c new file mode 100644 index 0000000..2500559 --- /dev/null +++ b/inc/lvgl/src/lv_init.c @@ -0,0 +1,554 @@ +/** + * @file lv_init.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "misc/lv_timer_private.h" +#include "misc/lv_profiler_builtin_private.h" +#include "misc/lv_anim_private.h" +#include "draw/lv_image_decoder_private.h" +#include "draw/lv_draw_buf_private.h" +#include "core/lv_refr_private.h" +#include "core/lv_obj_style_private.h" +#include "core/lv_group_private.h" +#include "lv_init.h" +#include "core/lv_global.h" +#include "core/lv_obj.h" +#include "display/lv_display_private.h" +#include "indev/lv_indev_private.h" +#include "layouts/lv_layout_private.h" +#include "libs/bin_decoder/lv_bin_decoder.h" +#include "libs/bmp/lv_bmp.h" +#include "libs/ffmpeg/lv_ffmpeg.h" +#include "libs/freetype/lv_freetype.h" +#include "libs/fsdrv/lv_fsdrv.h" +#include "libs/tjpgd/lv_tjpgd.h" +#include "libs/libjpeg_turbo/lv_libjpeg_turbo.h" +#include "libs/lodepng/lv_lodepng.h" +#include "libs/libpng/lv_libpng.h" +#include "libs/libwebp/lv_libwebp.h" +#include "libs/tiny_ttf/lv_tiny_ttf.h" +#include "draw/lv_draw.h" +#include "misc/lv_async.h" +#include "misc/lv_fs_private.h" +#include "widgets/gif/lv_gif.h" +#include "widgets/span/lv_span.h" +#include "themes/simple/lv_theme_simple.h" +#include "misc/lv_fs.h" +#include "osal/lv_os_private.h" +#include "debugging/sysmon/lv_sysmon_private.h" +#include "others/translation/lv_translation.h" +#include "drivers/wayland/lv_wayland_private.h" + +#if LV_USE_SVG + #include "libs/svg/lv_svg_decoder.h" +#endif + +#if LV_USE_NEMA_GFX + #include "draw/nema_gfx/lv_draw_nema_gfx.h" +#endif +#if LV_USE_PXP + #if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP + #include "draw/nxp/pxp/lv_draw_pxp.h" + #endif +#endif +#if LV_USE_G2D + #if LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D + #include "draw/nxp/g2d/lv_draw_g2d.h" + #endif +#endif +#if LV_USE_DRAW_DAVE2D + #include "draw/renesas/dave2d/lv_draw_dave2d.h" +#endif +#if LV_USE_DRAW_SDL + #include "draw/sdl/lv_draw_sdl.h" +#endif +#if LV_USE_DRAW_VG_LITE + #include "draw/vg_lite/lv_draw_vg_lite.h" +#endif +#if LV_USE_DRAW_DMA2D + #include "draw/dma2d/lv_draw_dma2d.h" +#endif +#if LV_USE_DRAW_OPENGLES + #include "draw/opengles/lv_draw_opengles.h" +#endif +#if LV_USE_PPA + #include "draw/espressif/ppa/lv_draw_ppa.h" +#endif +#if LV_USE_WINDOWS + #include "drivers/windows/lv_windows_context.h" +#endif +#if LV_USE_UEFI + #include "drivers/uefi/lv_uefi_context.h" +#endif +#if LV_USE_EVDEV + #include "drivers/evdev/lv_evdev_private.h" +#endif +#if LV_USE_DRAW_EVE + #include "draw/eve/lv_draw_eve.h" +#endif + +/********************* + * DEFINES + *********************/ +#define lv_initialized LV_GLOBAL_DEFAULT()->inited +#define lv_deinit_in_progress LV_GLOBAL_DEFAULT()->deinit_in_progress + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_ENABLE_GLOBAL_CUSTOM == 0 + lv_global_t lv_global; +#endif + +/********************** + * MACROS + **********************/ + +#ifndef LV_GLOBAL_INIT + #define LV_GLOBAL_INIT(__GLOBAL_PTR) lv_global_init((lv_global_t *)(__GLOBAL_PTR)) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ +static inline void lv_global_init(lv_global_t * global) +{ + LV_ASSERT_NULL(global); + + if(global == NULL) { + LV_LOG_ERROR("lv_global cannot be null"); + return; + } + + lv_memzero(global, sizeof(lv_global_t)); + + lv_ll_init(&(global->disp_ll), sizeof(lv_display_t)); + lv_ll_init(&(global->indev_ll), sizeof(lv_indev_t)); + + global->memory_zero = ZERO_MEM_SENTINEL; + global->style_refresh = true; + global->layout_count = LV_LAYOUT_LAST; + global->style_last_custom_prop_id = (uint32_t)LV_STYLE_LAST_BUILT_IN_PROP; + global->event_last_register_id = LV_EVENT_LAST; + lv_rand_set_seed(0x1234ABCD); + +#ifdef LV_LOG_PRINT_CB + void LV_LOG_PRINT_CB(lv_log_level_t, const char * txt); + global->custom_log_print_cb = LV_LOG_PRINT_CB; +#endif + +#if defined(LV_DRAW_SW_SHADOW_CACHE_SIZE) && LV_DRAW_SW_SHADOW_CACHE_SIZE > 0 + global->sw_shadow_cache.cache_size = -1; + global->sw_shadow_cache.cache_r = -1; +#endif +} + +static inline void lv_cleanup_devices(lv_global_t * global) +{ + LV_ASSERT_NULL(global); + + if(global) { + /* cleanup indev and display */ + lv_ll_clear_custom(&(global->indev_ll), (void (*)(void *)) lv_indev_delete); + lv_ll_clear_custom(&(global->disp_ll), (void (*)(void *)) lv_display_delete); + } +} + +bool lv_is_initialized(void) +{ +#if LV_ENABLE_GLOBAL_CUSTOM + if(LV_GLOBAL_DEFAULT()) return lv_initialized; + else return false; +#else + return lv_initialized; +#endif +} + +void lv_init(void) +{ + /*First initialize Garbage Collection if needed*/ +#ifdef LV_GC_INIT + LV_GC_INIT(); +#endif + + /*Do nothing if already initialized*/ + if(lv_initialized) { + LV_LOG_WARN("lv_init: already initialized"); + return; + } + + LV_LOG_INFO("begin"); + + /*Initialize members of static variable lv_global */ + LV_GLOBAL_INIT(LV_GLOBAL_DEFAULT()); + + lv_mem_init(); + + lv_draw_buf_init_handlers(); + +#if LV_USE_SPAN != 0 + lv_span_stack_init(); +#endif + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN +#if LV_USE_PROFILER_BUILTIN_POSIX + lv_profiler_builtin_posix_init(); +#else + lv_profiler_builtin_config_t profiler_config; + lv_profiler_builtin_config_init(&profiler_config); + lv_profiler_builtin_init(&profiler_config); +#endif +#endif + + lv_os_init(); + + lv_timer_core_init(); + + lv_fs_init(); + + lv_layout_init(); + + lv_anim_core_init(); + + lv_group_init(); + +#if LV_USE_FREETYPE + /* Since the drawing unit needs to register the freetype event, + * initialize the freetype module first + */ + lv_freetype_init(LV_FREETYPE_CACHE_FT_GLYPH_CNT); +#endif + + lv_draw_init(); + +#if LV_USE_DRAW_SW + lv_draw_sw_init(); +#endif + +#if LV_USE_NEMA_GFX + lv_draw_nema_gfx_init(); +#endif + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP + lv_draw_pxp_init(); +#endif +#endif + +#if LV_USE_G2D +#if LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D + lv_draw_g2d_init(); +#endif +#endif + +#if LV_USE_DRAW_DAVE2D + lv_draw_dave2d_init(); +#endif + +#if LV_USE_DRAW_SDL + lv_draw_sdl_init(); +#endif + +#if LV_USE_DRAW_DMA2D + lv_draw_dma2d_init(); +#endif + +#if LV_USE_DRAW_OPENGLES + lv_draw_opengles_init(); +#endif + +#if LV_USE_PPA + lv_draw_ppa_init(); +#endif + +#if LV_USE_WINDOWS + lv_windows_platform_init(); +#endif + +#if LV_USE_UEFI + lv_uefi_platform_init(); +#endif + +#if LV_USE_DRAW_EVE + lv_draw_eve_init(); +#endif + + lv_obj_style_init(); + + /*Initialize the screen refresh system*/ + lv_refr_init(); + +#if LV_USE_SYSMON + lv_sysmon_builtin_init(); +#endif + + lv_image_decoder_init(LV_CACHE_DEF_SIZE, LV_IMAGE_HEADER_CACHE_DEF_CNT); + lv_bin_decoder_init(); /*LVGL built-in binary image decoder*/ + +#if LV_USE_DRAW_VG_LITE + lv_draw_vg_lite_init(); +#endif + + /*Test if the IDE has UTF-8 encoding*/ + const char * txt = "Á"; + + uint8_t * txt_u8 = (uint8_t *)txt; + if(txt_u8[0] != 0xc3 || txt_u8[1] != 0x81 || txt_u8[2] != 0x00) { + LV_LOG_WARN("The strings have no UTF-8 encoding. Non-ASCII characters won't be displayed."); + } + + uint32_t endianness_test = 0x11223344; + uint8_t * endianness_test_p = (uint8_t *) &endianness_test; + bool big_endian = endianness_test_p[0] == 0x11; + + if(big_endian) { + LV_ASSERT_MSG(LV_BIG_ENDIAN_SYSTEM == 1, + "It's a big endian system but LV_BIG_ENDIAN_SYSTEM is not enabled in lv_conf.h"); + } + else { + LV_ASSERT_MSG(LV_BIG_ENDIAN_SYSTEM == 0, + "It's a little endian system but LV_BIG_ENDIAN_SYSTEM is enabled in lv_conf.h"); + } + +#if LV_USE_ASSERT_MEM_INTEGRITY + LV_LOG_WARN("Memory integrity checks are enabled via LV_USE_ASSERT_MEM_INTEGRITY which makes LVGL much slower"); +#endif + +#if LV_USE_ASSERT_OBJ + LV_LOG_WARN("Object sanity checks are enabled via LV_USE_ASSERT_OBJ which makes LVGL much slower"); +#endif + +#if LV_USE_ASSERT_STYLE + LV_LOG_WARN("Style sanity checks are enabled that uses more RAM"); +#endif + +#if LV_LOG_LEVEL == LV_LOG_LEVEL_TRACE + LV_LOG_WARN("Log level is set to 'Trace' which makes LVGL much slower"); +#endif + +#if LV_USE_FS_FATFS != '\0' + lv_fs_fatfs_init(); +#endif + +#if LV_USE_FS_STDIO != '\0' + lv_fs_stdio_init(); +#endif + +#if LV_USE_FS_POSIX != '\0' + lv_fs_posix_init(); +#endif + +#if LV_USE_FS_WIN32 != '\0' + lv_fs_win32_init(); +#endif + +#if LV_USE_FS_MEMFS + lv_fs_memfs_init(); +#endif + +#if LV_USE_FS_LITTLEFS + lv_fs_littlefs_init(); +#endif + +#if LV_USE_FS_ARDUINO_ESP_LITTLEFS + lv_fs_arduino_esp_littlefs_init(); +#endif + +#if LV_USE_FS_ARDUINO_SD + lv_fs_arduino_sd_init(); +#endif + +#if LV_USE_FS_UEFI + lv_fs_uefi_init(); +#endif + +#if LV_USE_FS_FROGFS + lv_fs_frogfs_init(); +#endif + + /*Use the earlier initialized position of FFmpeg decoder as a fallback decoder*/ +#if LV_USE_FFMPEG + lv_ffmpeg_init(); +#endif + +#if LV_USE_LODEPNG + lv_lodepng_init(); +#endif + +#if LV_USE_LIBPNG + lv_libpng_init(); +#endif + +#if LV_USE_TJPGD + lv_tjpgd_init(); +#endif + +#if LV_USE_LIBJPEG_TURBO + lv_libjpeg_turbo_init(); +#endif + +#if LV_USE_LIBWEBP + lv_libwebp_init(); +#endif + +#if LV_USE_BMP + lv_bmp_init(); +#endif + +#if LV_USE_SVG + lv_svg_decoder_init(); +#endif + +#if LV_USE_TRANSLATION + lv_translation_init(); +#endif + + lv_initialized = true; + + LV_LOG_TRACE("finished"); +} + +void lv_deinit(void) +{ + /*Do nothing if already deinit*/ + if(!lv_initialized) { + LV_LOG_WARN("lv_deinit: already deinit!"); + return; + } + + if(lv_deinit_in_progress) return; + + lv_deinit_in_progress = true; + +#if LV_USE_SYSMON + lv_sysmon_builtin_deinit(); +#endif + + lv_display_set_default(NULL); + + lv_cleanup_devices(LV_GLOBAL_DEFAULT()); + +#if LV_USE_EVDEV + lv_evdev_deinit(); +#endif + +#if LV_USE_SPAN != 0 + lv_span_stack_deinit(); +#endif + +#if LV_USE_FREETYPE + lv_freetype_uninit(); +#endif + +#if LV_USE_THEME_DEFAULT + lv_theme_default_deinit(); +#endif + +#if LV_USE_THEME_SIMPLE + lv_theme_simple_deinit(); +#endif + +#if LV_USE_THEME_MONO + lv_theme_mono_deinit(); +#endif + + lv_image_decoder_deinit(); + + lv_refr_deinit(); + + lv_obj_style_deinit(); + +#if LV_USE_UEFI + lv_uefi_platform_deinit(); +#endif + +#if LV_USE_PXP +#if LV_USE_DRAW_PXP || LV_USE_ROTATE_PXP + lv_draw_pxp_deinit(); +#endif +#endif + +#if LV_USE_WAYLAND + lv_wayland_deinit(); +#endif +#if LV_USE_G2D +#if LV_USE_DRAW_G2D || LV_USE_ROTATE_G2D + lv_draw_g2d_deinit(); +#endif +#endif + +#if LV_USE_DRAW_VG_LITE + lv_draw_vg_lite_deinit(); +#endif + +#if LV_USE_DRAW_DMA2D + lv_draw_dma2d_deinit(); +#endif + +#if LV_USE_DRAW_OPENGLES + lv_draw_opengles_deinit(); +#endif + +#if LV_USE_DRAW_SW + lv_draw_sw_deinit(); +#endif + + lv_draw_deinit(); + + lv_group_deinit(); + + lv_anim_core_deinit(); + + lv_layout_deinit(); + + lv_timer_core_deinit(); + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + lv_profiler_builtin_uninit(); +#endif + +#if LV_USE_OBJ_ID && LV_USE_OBJ_ID_BUILTIN + lv_objid_builtin_destroy(); +#endif + +#if LV_USE_TRANSLATION + lv_translation_deinit(); +#endif + +#if LV_USE_FS_FROGFS + lv_fs_frogfs_deinit(); +#endif + + lv_fs_deinit(); + + lv_mem_deinit(); + + lv_initialized = false; + + LV_LOG_INFO("lv_deinit done"); + +#if LV_USE_LOG + lv_log_register_print_cb(NULL); +#endif + +#ifdef LV_GC_DEINIT + LV_GC_DEINIT(); +#endif + +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/lv_init.h b/inc/lvgl/src/lv_init.h new file mode 100644 index 0000000..0815142 --- /dev/null +++ b/inc/lvgl/src/lv_init.h @@ -0,0 +1,55 @@ +/** + * @file lv_init.h + * + */ + +#ifndef LV_INIT_H +#define LV_INIT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_conf_internal.h" +#include "misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize LVGL library. + * Should be called before any other LVGL related function. + */ +void lv_init(void); + +/** + * Deinit the 'lv' library + */ +void lv_deinit(void); + +/** + * Returns whether the 'lv' library is currently initialized + */ +bool lv_is_initialized(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_INIT_H*/ diff --git a/inc/lvgl/src/lvgl.h b/inc/lvgl/src/lvgl.h new file mode 100644 index 0000000..f49fcc7 --- /dev/null +++ b/inc/lvgl/src/lvgl.h @@ -0,0 +1,39 @@ +/** + * @file lvgl.h + * This file exists only to be compatible with Arduino's library structure + */ + +#ifndef LVGL_SRC_H +#define LVGL_SRC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lvgl.h" +#include "lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LVGL_SRC_H */ diff --git a/inc/lvgl/src/lvgl_private.h b/inc/lvgl/src/lvgl_private.h new file mode 100644 index 0000000..325290c --- /dev/null +++ b/inc/lvgl/src/lvgl_private.h @@ -0,0 +1,38 @@ +/** + * @file lvgl_private.h + * This file exists only to be compatible with Arduino's library structure + */ + +#ifndef LVGL_PRIVATE_SRC_H +#define LVGL_PRIVATE_SRC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lvgl_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LVGL_PRIVATE_SRC_H */ diff --git a/inc/lvgl/src/misc/cache/class/lv_cache_class.h b/inc/lvgl/src/misc/cache/class/lv_cache_class.h new file mode 100644 index 0000000..a09912b --- /dev/null +++ b/inc/lvgl/src/misc/cache/class/lv_cache_class.h @@ -0,0 +1,18 @@ +/** + * @file lv_cache_clazz.h + * + */ + +#ifndef LV_CACHE_CLAZZ_H +#define LV_CACHE_CLAZZ_H + + +/********************* + * INCLUDES + *********************/ + +#include "lv_cache_lru_rb.h" +#include "lv_cache_lru_ll.h" +#include "lv_cache_sc_da.h" + +#endif //LV_CACHE_CLAZZ_H diff --git a/inc/lvgl/src/misc/cache/class/lv_cache_lru_ll.c b/inc/lvgl/src/misc/cache/class/lv_cache_lru_ll.c new file mode 100644 index 0000000..593194f --- /dev/null +++ b/inc/lvgl/src/misc/cache/class/lv_cache_lru_ll.c @@ -0,0 +1,443 @@ +/** +* @file lv_cache_lru_ll.c +* +*/ + +/*********************************\ +* * +* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┓ * +* ┌ ─ ─ ─ ┐ * +* ┃ Cache insert ┃ * +* │Hitting│ head * +* ┃ ─ ─ ─ ─ ┃ * +* ┌─────┐ * +* ┃ │ B │ ┃ * +* └──▲──┘ * +* ┃ │ ┃ * +* ┌──┴──┐ * +* ┃ │ E │ ┃ * +* └──▲──┘ * +* ┃ │ ┃ * +* ┌──┴──┐ * +* ┃ │ A │ ┌ ─ ─ ─ ─ ─ ┐ ┃ * +* └──▲──┘ LRU * +* ┃ │ │ Cache │ ┃ * +* ┌──┴──┐ ─ ─ ─ ─ ─ ─ * +* ┃ │ D │ ┃ * +* └──▲──┘ * +* ┃ │ ┃ * +* ┌──┴──┐ * +* ┃ │ C │ ┃ * +* └──▲──┘ * +* ┃ ┌ ─ ─│─ ─ ┐ ┃ * +* ┌──┴──┐ * +* ┃ │ │ F │ │ ┃ * +* └─────┘ * +* ┃ └ ─ ─ ─ ─ ┘ ┃ * +* remove * +* ┃ tail ┃ * +* ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ * +* * +\*********************************/ + +/********************* + * INCLUDES + *********************/ + +#include "lv_cache_lru_ll.h" +#include "../lv_cache_entry.h" +#include "../../../stdlib/lv_sprintf.h" +#include "../../../stdlib/lv_string.h" +#include "../../lv_ll.h" + +#include "../../lv_iter.h" +#include "../../lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef uint32_t (get_data_size_cb_t)(const void * data); + +struct _lv_cache_lru_ll_t { + lv_cache_t cache; + lv_ll_t ll; + get_data_size_cb_t * get_data_size_cb; +}; + +typedef struct _lv_cache_lru_ll_t lv_cache_lru_ll_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * alloc_cb(void); +static bool init_cnt_cb(lv_cache_t * cache); +static bool init_size_cb(lv_cache_t * cache); +static void destroy_cb(lv_cache_t * cache, void * user_data); + +static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * user_data); +static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * user_data); +static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); +static void drop_cb(lv_cache_t * cache, const void * key, void * user_data); +static void drop_all_cb(lv_cache_t * cache, void * user_data); +static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data); +static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size, + void * user_data); + +static void * alloc_new_node(lv_cache_lru_ll_t * lru, void * key, void * user_data); + +static uint32_t cnt_get_data_size_cb(const void * data); +static uint32_t size_get_data_size_cb(const void * data); + +static lv_iter_t * cache_iter_create_cb(lv_cache_t * cache); +static lv_result_t cache_iter_next_cb(void * instance, void * context, void * elem); + +/********************** + * GLOBAL VARIABLES + **********************/ +const lv_cache_class_t lv_cache_class_lru_ll_count = { + .alloc_cb = alloc_cb, + .init_cb = init_cnt_cb, + .destroy_cb = destroy_cb, + + .get_cb = get_cb, + .add_cb = add_cb, + .remove_cb = remove_cb, + .drop_cb = drop_cb, + .drop_all_cb = drop_all_cb, + .get_victim_cb = get_victim_cb, + .reserve_cond_cb = reserve_cond_cb, + .iter_create_cb = cache_iter_create_cb, +}; + +const lv_cache_class_t lv_cache_class_lru_ll_size = { + .alloc_cb = alloc_cb, + .init_cb = init_size_cb, + .destroy_cb = destroy_cb, + + .get_cb = get_cb, + .add_cb = add_cb, + .remove_cb = remove_cb, + .drop_cb = drop_cb, + .drop_all_cb = drop_all_cb, + .get_victim_cb = get_victim_cb, + .reserve_cond_cb = reserve_cond_cb, + .iter_create_cb = cache_iter_create_cb, +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void * alloc_new_node(lv_cache_lru_ll_t * lru, void * key, void * user_data) +{ + LV_UNUSED(user_data); + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return NULL; + } + + void * new_node = lv_ll_ins_head(&lru->ll); + if(new_node == NULL) { + return NULL; + } + + lv_memcpy(new_node, key, lru->cache.node_size); + lv_cache_entry_t * entry = lv_cache_entry_get_entry(new_node, lru->cache.node_size); + lv_cache_entry_init(entry, &lru->cache, lru->cache.node_size); + return entry; +} + +static void * alloc_cb(void) +{ + void * res = lv_malloc(sizeof(lv_cache_lru_ll_t)); + LV_ASSERT_MALLOC(res); + if(res == NULL) { + LV_LOG_ERROR("malloc failed"); + return NULL; + } + + lv_memzero(res, sizeof(lv_cache_lru_ll_t)); + return res; +} + +static bool init_cnt_cb(lv_cache_t * cache) +{ + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru->cache.ops.compare_cb); + LV_ASSERT_NULL(lru->cache.ops.free_cb); + LV_ASSERT(lru->cache.node_size > 0); + + if(lru->cache.node_size <= 0 || lru->cache.ops.compare_cb == NULL || lru->cache.ops.free_cb == NULL) { + return false; + } + + lv_ll_init(&lru->ll, lv_cache_entry_get_size(lru->cache.node_size)); + lru->get_data_size_cb = cnt_get_data_size_cb; + + return true; +} + +static bool init_size_cb(lv_cache_t * cache) +{ + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru->cache.ops.compare_cb); + LV_ASSERT_NULL(lru->cache.ops.free_cb); + LV_ASSERT(lru->cache.node_size > 0); + + if(lru->cache.node_size <= 0 || lru->cache.ops.compare_cb == NULL || lru->cache.ops.free_cb == NULL) { + return false; + } + + lv_ll_init(&lru->ll, lv_cache_entry_get_size(lru->cache.node_size)); + lru->get_data_size_cb = size_get_data_size_cb; + + return true; +} + +static void destroy_cb(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru); + + if(lru == NULL) { + return; + } + + cache->clz->drop_all_cb(cache, user_data); + cache->size = 0; +} + +static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return NULL; + } + + /* Linear search */ + void * node = NULL; + LV_LL_READ(&lru->ll, node) { + if(lru->cache.ops.compare_cb(node, key) == 0) { + break; + } + } + /*cache hit*/ + if(node) { + void * head = lv_ll_get_head(&lru->ll); + lv_ll_move_before(&lru->ll, node, head); + + lv_cache_entry_t * entry = lv_cache_entry_get_entry(node, cache->node_size); + return entry; + } + return NULL; +} + +static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return NULL; + } + + lv_cache_entry_t * entry = alloc_new_node(lru, (void *)key, user_data); + if(entry == NULL) { + return NULL; + } + + cache->size += lru->get_data_size_cb(key); + + return entry; +} + +static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(entry); + + if(lru == NULL || entry == NULL) { + return; + } + + void * node = lv_cache_entry_get_data(entry); + + lv_ll_remove(&lru->ll, node); + + cache->size -= lru->get_data_size_cb(node); +} + +static void drop_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return; + } + + void * node = cache->clz->get_cb(cache, key, user_data); + if(node == NULL) { + return; + } + lv_ll_remove(&lru->ll, node); + + lru->cache.ops.free_cb(node, user_data); + cache->size -= lru->get_data_size_cb(node); + + lv_cache_entry_t * entry = lv_cache_entry_get_entry(node, cache->node_size); + lv_cache_entry_delete(entry); +} + +static void drop_all_cb(lv_cache_t * cache, void * user_data) +{ + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru); + + if(lru == NULL) { + return; + } + + uint32_t used_cnt = 0; + void * node; + LV_LL_READ(&lru->ll, node) { + /*free user handled data and do other clean up*/ + lv_cache_entry_t * entry = lv_cache_entry_get_entry(node, cache->node_size); + if(lv_cache_entry_get_ref(entry) == 0) { + lru->cache.ops.free_cb(node, user_data); + } + else { + LV_LOG_WARN("entry (%p) is still referenced (%" LV_PRId32 ")", (void *)entry, lv_cache_entry_get_ref(entry)); + used_cnt++; + } + } + if(used_cnt > 0) { + LV_LOG_WARN("%" LV_PRId32 " entries are still referenced", used_cnt); + } + + lv_ll_clear(&lru->ll); + + cache->size = 0; +} + +static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru); + + void * tail; + LV_LL_READ_BACK(&lru->ll, tail) { + lv_cache_entry_t * entry = lv_cache_entry_get_entry(tail, cache->node_size); + if(lv_cache_entry_get_ref(entry) == 0) { + return entry; + } + } + + return NULL; +} + +static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size, + void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)cache; + + LV_ASSERT_NULL(lru); + + if(lru == NULL) { + return LV_CACHE_RESERVE_COND_ERROR; + } + + uint32_t data_size = key ? lru->get_data_size_cb(key) : 0; + if(data_size > lru->cache.max_size) { + LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", data_size, lru->cache.max_size); + return LV_CACHE_RESERVE_COND_TOO_LARGE; + } + + return cache->size + reserved_size + data_size > lru->cache.max_size + ? LV_CACHE_RESERVE_COND_NEED_VICTIM + : LV_CACHE_RESERVE_COND_OK; +} + +static uint32_t cnt_get_data_size_cb(const void * data) +{ + LV_UNUSED(data); + return 1; +} + +static uint32_t size_get_data_size_cb(const void * data) +{ + lv_cache_slot_size_t * slot = (lv_cache_slot_size_t *)data; + return slot->size; +} + +static lv_iter_t * cache_iter_create_cb(lv_cache_t * cache) +{ + return lv_iter_create(cache, lv_cache_entry_get_size(cache->node_size), 0, cache_iter_next_cb); +} + +static lv_result_t cache_iter_next_cb(void * instance, void * context, void * elem) +{ + lv_cache_lru_ll_t * lru = (lv_cache_lru_ll_t *)instance; + void ** ll_node = context; + + LV_ASSERT_NULL(ll_node); + + if(*ll_node == NULL) *ll_node = lv_ll_get_head(&lru->ll); + else *ll_node = lv_ll_get_next(&lru->ll, *ll_node); + + void * node = *ll_node; + + if(node == NULL) return LV_RESULT_INVALID; + + lv_memcpy(elem, node, lv_cache_entry_get_size(lru->cache.node_size)); + + return LV_RESULT_OK; +} diff --git a/inc/lvgl/src/misc/cache/class/lv_cache_lru_ll.h b/inc/lvgl/src/misc/cache/class/lv_cache_lru_ll.h new file mode 100644 index 0000000..8c0352b --- /dev/null +++ b/inc/lvgl/src/misc/cache/class/lv_cache_lru_ll.h @@ -0,0 +1,44 @@ +/** +* @file lv_cache_lru_ll.h +* +*/ + +#ifndef LV_CACHE_LRU_LL_H +#define LV_CACHE_LRU_LL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_cache_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/************************* + * GLOBAL VARIABLES + *************************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_cache_class_t lv_cache_class_lru_ll_count; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_cache_class_t lv_cache_class_lru_ll_size; +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_LRU_LL_H*/ diff --git a/inc/lvgl/src/misc/cache/class/lv_cache_lru_rb.c b/inc/lvgl/src/misc/cache/class/lv_cache_lru_rb.c new file mode 100644 index 0000000..79b64b1 --- /dev/null +++ b/inc/lvgl/src/misc/cache/class/lv_cache_lru_rb.c @@ -0,0 +1,497 @@ +/** +* @file lv_cache_lru_rb.c +* +*/ + +/***************************************************************************\ +* * +* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┓ * +* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┌ ─ ─ ─ ┐ * +* ┌ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ Cache insert ┃ * +* ┃ RB Tree │ │Hitting│ head * +* └ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ ─ ─ ─ ─ ┃ * +* ┃ ┌─┬─┬─┬─┐ ┌─────┐ * +* ┌──│◄│B│►│ │─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┃─ ─ ╋ ─ ─▶│ B │ ┃ * +* ┃ │ └─┴─┴─┴─┘ └──▲──┘ * +* │ │ ┃ ┃ │ ┃ * +* ┃ │ │ ┌──┴──┐ * +* │ └──────┐ ┌ ─┃─ ─ ╋ ─ ─▶│ E │ ┃ * +* ┃ ▼ ┌ ─ ─│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ └──▲──┘ * +* ┌─┬─┬─┬─┐ ▼ │ ┃ ┃ │ ┃ * +* ┃│◄│A│►│ │─ ─ ┘ ┌─┬─┬─┬─┐ │ ┌──┴──┐ * +* └─┴─┴─┴─┘ ┌───│◄│D│►│ │─ ─ ─ ─ ─ ─│─ ╋ ┐ ┃ ─ ▶│ A │ ┌ ─ ─ ─ ─ ─ ┐ ┃ * +* ┃ │ └─┴─┴─┴─┘ └──▲──┘ LRU * +* │ │ │ ┃ │ ┃ │ │ Cache │ ┃ * +* ┃ ▼ └──────┐ ┌──┴──┐ ─ ─ ─ ─ ─ ─ * +* ┌─┬─┬─┬─┐ ▼ │ ┃ └ ─┃─ ─ ▶│ D │ ┃ * +* ┃ │◄│C│►│ │─ ─ ┌─┬─┬─┬─┐ └──▲──┘ * +* └─┴─┴─┴─┘ │ │◄│E│►│ │─ ┘ ┃ ┃ │ ┃ * +* ┃ └─┴─┴─┴─┘ ┌──┴──┐ * +* │ │ ─ ╋ ─ ─┃─ ─ ▶│ C │ ┃ * +* ┃ ─ ─ ─ ─ ┼ ─ ─ ┘ └──▲──┘ * +* ▼ ┃ ┃ ┌ ─ ─│─ ─ ┐ ┃ * +* ┃ ┌─┬─┬─┬─┐ ┌──┴──┐ * +* │◄│F│►│ │─ ─┃─ ─ ╋ ─ ┼▶│ F │ │ ┃ * +* ┃ └─┴─┴─┴─┘ └─────┘ * +* ┃ ┃ └ ─ ─ ─ ─ ┘ ┃ * +* ┃ remove * +* ┃ ┃ tail ┃ * +* ┗ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ * +* * +\***************************************************************************/ + +/********************* + * INCLUDES + *********************/ + +#include "lv_cache_lru_rb.h" +#include "../lv_cache_entry.h" +#include "../../../stdlib/lv_sprintf.h" +#include "../../../stdlib/lv_string.h" +#include "../../lv_ll.h" +#include "../../lv_rb_private.h" +#include "../../lv_rb.h" +#include "../../lv_iter.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef uint32_t (get_data_size_cb_t)(const void * data); + +struct _lv_lru_rb_t { + lv_cache_t cache; + + lv_rb_t rb; + lv_ll_t ll; + + get_data_size_cb_t * get_data_size_cb; +}; +typedef struct _lv_lru_rb_t lv_lru_rb_t_; +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * alloc_cb(void); +static bool init_cnt_cb(lv_cache_t * cache); +static bool init_size_cb(lv_cache_t * cache); +static void destroy_cb(lv_cache_t * cache, void * user_data); + +static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * user_data); +static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * user_data); +static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); +static void drop_cb(lv_cache_t * cache, const void * key, void * user_data); +static void drop_all_cb(lv_cache_t * cache, void * user_data); +static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data); +static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size, + void * user_data); + +static void * alloc_new_node(lv_lru_rb_t_ * lru, void * key, void * user_data); +inline static void ** get_lru_node(lv_lru_rb_t_ * lru, lv_rb_node_t * node); + +static uint32_t cnt_get_data_size_cb(const void * data); +static uint32_t size_get_data_size_cb(const void * data); + +static lv_iter_t * cache_iter_create_cb(lv_cache_t * cache); +static lv_result_t cache_iter_next_cb(void * instance, void * context, void * elem); + +/********************** + * GLOBAL VARIABLES + **********************/ +const lv_cache_class_t lv_cache_class_lru_rb_count = { + .alloc_cb = alloc_cb, + .init_cb = init_cnt_cb, + .destroy_cb = destroy_cb, + + .get_cb = get_cb, + .add_cb = add_cb, + .remove_cb = remove_cb, + .drop_cb = drop_cb, + .drop_all_cb = drop_all_cb, + .get_victim_cb = get_victim_cb, + .reserve_cond_cb = reserve_cond_cb, + .iter_create_cb = cache_iter_create_cb, +}; + +const lv_cache_class_t lv_cache_class_lru_rb_size = { + .alloc_cb = alloc_cb, + .init_cb = init_size_cb, + .destroy_cb = destroy_cb, + + .get_cb = get_cb, + .add_cb = add_cb, + .remove_cb = remove_cb, + .drop_cb = drop_cb, + .drop_all_cb = drop_all_cb, + .get_victim_cb = get_victim_cb, + .reserve_cond_cb = reserve_cond_cb, + .iter_create_cb = cache_iter_create_cb, +}; +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ +static void * alloc_new_node(lv_lru_rb_t_ * lru, void * key, void * user_data) +{ + LV_UNUSED(user_data); + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return NULL; + } + + lv_rb_node_t * node = lv_rb_insert(&lru->rb, key); + if(node == NULL) + goto FAILED_HANDLER2; + + void * data = node->data; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, lru->cache.node_size); + lv_memcpy(data, key, lru->cache.node_size); + + void * lru_node = lv_ll_ins_head(&lru->ll); + if(lru_node == NULL) + goto FAILED_HANDLER1; + + lv_memcpy(lru_node, &node, sizeof(void *)); + lv_memcpy(get_lru_node(lru, node), &lru_node, sizeof(void *)); + + lv_cache_entry_init(entry, &lru->cache, lru->cache.node_size); + goto FAILED_HANDLER2; + +FAILED_HANDLER1: + lv_rb_drop_node(&lru->rb, node); + node = NULL; +FAILED_HANDLER2: + return node; +} + +inline static void ** get_lru_node(lv_lru_rb_t_ * lru, lv_rb_node_t * node) +{ + return (void **)((char *)node->data + lru->rb.size - sizeof(void *)); +} + +static void * alloc_cb(void) +{ + void * res = lv_malloc(sizeof(lv_lru_rb_t_)); + LV_ASSERT_MALLOC(res); + if(res == NULL) { + LV_LOG_ERROR("malloc failed"); + return NULL; + } + + lv_memzero(res, sizeof(lv_lru_rb_t_)); + return res; +} + +static bool init_cnt_cb(lv_cache_t * cache) +{ + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru->cache.ops.compare_cb); + LV_ASSERT_NULL(lru->cache.ops.free_cb); + LV_ASSERT(lru->cache.node_size > 0); + + if(lru->cache.node_size <= 0 || lru->cache.ops.compare_cb == NULL || lru->cache.ops.free_cb == NULL) { + return false; + } + + /*add void* to store the ll node pointer*/ + if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) { + return false; + } + lv_ll_init(&lru->ll, sizeof(void *)); + + lru->get_data_size_cb = cnt_get_data_size_cb; + + return true; +} + +static bool init_size_cb(lv_cache_t * cache) +{ + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru->cache.ops.compare_cb); + LV_ASSERT_NULL(lru->cache.ops.free_cb); + LV_ASSERT(lru->cache.node_size > 0); + + if(lru->cache.node_size <= 0 || lru->cache.ops.compare_cb == NULL || lru->cache.ops.free_cb == NULL) { + return false; + } + + /*add void* to store the ll node pointer*/ + if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) { + return false; + } + lv_ll_init(&lru->ll, sizeof(void *)); + + lru->get_data_size_cb = size_get_data_size_cb; + + return true; +} + +static void destroy_cb(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + + if(lru == NULL) { + return; + } + + cache->clz->drop_all_cb(cache, user_data); +} + +static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return NULL; + } + + /*try the first ll node first*/ + void * head = lv_ll_get_head(&lru->ll); + if(head) { + lv_rb_node_t * node = *(lv_rb_node_t **)head; + void * data = node->data; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, cache->node_size); + if(lru->cache.ops.compare_cb(data, key) == 0) { + return entry; + } + } + + lv_rb_node_t * node = lv_rb_find(&lru->rb, key); + /*cache hit*/ + if(node) { + void * lru_node = *get_lru_node(lru, node); + head = lv_ll_get_head(&lru->ll); + lv_ll_move_before(&lru->ll, lru_node, head); + + lv_cache_entry_t * entry = lv_cache_entry_get_entry(node->data, cache->node_size); + return entry; + } + return NULL; +} + +static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return NULL; + } + + lv_rb_node_t * new_node = alloc_new_node(lru, (void *)key, user_data); + if(new_node == NULL) { + return NULL; + } + + lv_cache_entry_t * entry = lv_cache_entry_get_entry(new_node->data, cache->node_size); + + cache->size += lru->get_data_size_cb(key); + + return entry; +} + +static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(entry); + + if(lru == NULL || entry == NULL) { + return; + } + + void * data = lv_cache_entry_get_data(entry); + lv_rb_node_t * node = lv_rb_find(&lru->rb, data); + if(node == NULL) { + return; + } + + void * lru_node = *get_lru_node(lru, node); + lv_rb_remove_node(&lru->rb, node); + lv_ll_remove(&lru->ll, lru_node); + lv_free(lru_node); + + cache->size -= lru->get_data_size_cb(data); +} + +static void drop_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + LV_ASSERT_NULL(key); + + if(lru == NULL || key == NULL) { + return; + } + + lv_rb_node_t * node = lv_rb_find(&lru->rb, key); + if(node == NULL) { + return; + } + + void * data = node->data; + + lru->cache.ops.free_cb(data, user_data); + cache->size -= lru->get_data_size_cb(data); + + lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, cache->node_size); + void * lru_node = *get_lru_node(lru, node); + + lv_rb_remove_node(&lru->rb, node); + lv_cache_entry_delete(entry); + + lv_ll_remove(&lru->ll, lru_node); + lv_free(lru_node); +} + +static void drop_all_cb(lv_cache_t * cache, void * user_data) +{ + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + + if(lru == NULL) { + return; + } + + uint32_t used_cnt = 0; + lv_rb_node_t ** node; + LV_LL_READ(&lru->ll, node) { + /*free user handled data and do other clean up*/ + void * search_key = (*node)->data; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(search_key, cache->node_size); + if(lv_cache_entry_get_ref(entry) == 0) { + lru->cache.ops.free_cb(search_key, user_data); + } + else { + LV_LOG_WARN("entry (%p) is still referenced (%" LV_PRId32 ")", (void *)entry, lv_cache_entry_get_ref(entry)); + used_cnt++; + } + } + if(used_cnt > 0) { + LV_LOG_WARN("%" LV_PRId32 " entries are still referenced", used_cnt); + } + + lv_rb_destroy(&lru->rb); + lv_ll_clear(&lru->ll); + + cache->size = 0; +} + +static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + + lv_rb_node_t ** tail; + LV_LL_READ_BACK(&lru->ll, tail) { + lv_rb_node_t * tail_node = *tail; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(tail_node->data, cache->node_size); + if(lv_cache_entry_get_ref(entry) == 0) { + return entry; + } + } + + return NULL; +} + +static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size, + void * user_data) +{ + LV_UNUSED(user_data); + + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache; + + LV_ASSERT_NULL(lru); + + if(lru == NULL) { + return LV_CACHE_RESERVE_COND_ERROR; + } + + uint32_t data_size = key ? lru->get_data_size_cb(key) : 0; + if(data_size > lru->cache.max_size) { + LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", data_size, lru->cache.max_size); + return LV_CACHE_RESERVE_COND_TOO_LARGE; + } + + return cache->size + reserved_size + data_size > lru->cache.max_size + ? LV_CACHE_RESERVE_COND_NEED_VICTIM + : LV_CACHE_RESERVE_COND_OK; +} + +static uint32_t cnt_get_data_size_cb(const void * data) +{ + LV_UNUSED(data); + return 1; +} + +static uint32_t size_get_data_size_cb(const void * data) +{ + lv_cache_slot_size_t * slot = (lv_cache_slot_size_t *)data; + return slot->size; +} + +static lv_iter_t * cache_iter_create_cb(lv_cache_t * cache) +{ + return lv_iter_create(cache, lv_cache_entry_get_size(cache->node_size), sizeof(void *), cache_iter_next_cb); +} + +static lv_result_t cache_iter_next_cb(void * instance, void * context, void * elem) +{ + lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)instance; + lv_rb_node_t *** ll_node = context; + + LV_ASSERT_NULL(ll_node); + + if(*ll_node == NULL) *ll_node = lv_ll_get_head(&lru->ll); + else *ll_node = lv_ll_get_next(&lru->ll, *ll_node); + + lv_rb_node_t ** node = *ll_node; + + if(node == NULL) return LV_RESULT_INVALID; + + uint32_t node_size = lru->cache.node_size; + void * search_key = (*node)->data; + lv_memcpy(elem, search_key, lv_cache_entry_get_size(node_size)); + + return LV_RESULT_OK; +} diff --git a/inc/lvgl/src/misc/cache/class/lv_cache_lru_rb.h b/inc/lvgl/src/misc/cache/class/lv_cache_lru_rb.h new file mode 100644 index 0000000..a7dbdc0 --- /dev/null +++ b/inc/lvgl/src/misc/cache/class/lv_cache_lru_rb.h @@ -0,0 +1,44 @@ +/** +* @file lv_cache_lru_rb.h +* +*/ + +#ifndef LV_CACHE_LRU_RB_H +#define LV_CACHE_LRU_RB_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_cache_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/************************* + * GLOBAL VARIABLES + *************************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_cache_class_t lv_cache_class_lru_rb_count; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_cache_class_t lv_cache_class_lru_rb_size; +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_LRU_RB_H*/ diff --git a/inc/lvgl/src/misc/cache/class/lv_cache_sc_da.c b/inc/lvgl/src/misc/cache/class/lv_cache_sc_da.c new file mode 100644 index 0000000..0dfe261 --- /dev/null +++ b/inc/lvgl/src/misc/cache/class/lv_cache_sc_da.c @@ -0,0 +1,515 @@ +/** +* @file lv_cache_sc_da.c +* +*/ +/*********************************************\ +* * +* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┓ * +* * +* ┃ Second Chance Cache ┃ * +* * +* ┃ ┌───┬───┬───┬───┬───┐ ┃ * +* │ B │ E │ A │ D │ C │ * +* ┃ ├─┬─┼─┬─┼─┬─┼─┬─┼─┬─┤ ┃ * +* │1│ │0│ │1│ │1│ │0│ │ * +* ┃ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ┃ * +* [0] [1] [2] [3] [4] * +* ┃ ▲ ▲ ▲ ▲ ┃ * +* │ │ │ │ * +* ┃ │ │ │ ┌ ─ ┴ ┐ ┃ * +* │ │ │ │ add │ * +* ┃ │ │ │ │ new │ ┃ * +* │ │ │ │here │ * +* ┃ │ │ │ └ ─ ─ ┘ ┃ * +* │ │ │ * +* ┃ │ │ ┌ ─ ┴ ─ ─ ─ ─ ┐ ┃ * +* │ │ │ recently │ * +* ┃ │ │ │ used bit=1 │ ┃ * +* │ │ │ (accessed) │ * +* ┃ │ │ └ ─ ─ ─ ─ ─ ─ ┘ ┃ * +* │ │ * +* ┃ │ └ ─ ─ victim bit=0 ┃ * +* │ (will be evicted) * +* ┃ └ ─ ─ ─ ─ victim bit=1 ┃ * +* (gets second chance, * +* ┃ bit reset to 0) ┃ * +* * +* ┃ Eviction Process: ┃ * +* 1. Find first bit=0 * +* ┃ 2. If none, reset all to 0 ┃ * +* 3. Replace first entry * +* ┃ ┃ * +* ┗ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┛ * +* * +* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ * +* ┃ Buffer Entry Structure ┃ * +* ┃ ┌────────────┬──────────────────────┐ ┃ * +* ┃ │ DATA │ ENTRY_DATA │ ┃ * +* ┃ │ (user type)│ (lv_cache_entry_t) │ ┃ * +* ┃ └────────────┴──────────────────────┘ ┃ * +* ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ * +\*********************************************/ + +/********************* + * INCLUDES + *********************/ + +#include "lv_cache_sc_da.h" +#include "../lv_cache_entry.h" +#include "../lv_cache_entry_private.h" +#include "../../../stdlib/lv_sprintf.h" +#include "../../../stdlib/lv_string.h" + +#include "../../lv_iter.h" +#include "../../lv_assert.h" +#include "../../lv_math.h" +#include "../../lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef uint32_t(get_data_size_cb_t)(const void * data); + +typedef struct { + lv_cache_t cache; + uint8_t * data; + size_t capacity; +} lv_cache_sc_da_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void * alloc_cb(void); +static bool init_cnt_cb(lv_cache_t * cache); +static void destroy_cb(lv_cache_t * cache, void * user_data); + +static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, + void * user_data); +static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, + void * user_data); +static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, + void * user_data); +static void drop_cb(lv_cache_t * cache, const void * key, void * user_data); +static void drop_all_cb(lv_cache_t * cache, void * user_data); +static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data); +static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, + const void * key, + size_t reserved_size, + void * user_data); + +static void * alloc_new_entry(lv_cache_sc_da_t * da, const void * key, + void * user_data); + +static lv_iter_t * cache_iter_create_cb(lv_cache_t * cache); +static lv_result_t cache_iter_next_cb(void * instance, void * context, + void * elem); + +static lv_cache_entry_t * get_possible_victim(lv_cache_sc_da_t * da, + size_t index); + +static inline void set_second_chance(lv_cache_entry_t * entry, bool value); +static inline bool has_second_chance(lv_cache_entry_t * entry); +static inline void get_entry(lv_cache_sc_da_t * da, size_t index, + void ** cache_data, lv_cache_entry_t ** cache_entry); + +/********************** + * GLOBAL VARIABLES + **********************/ +const lv_cache_class_t lv_cache_class_sc_da = { + .alloc_cb = alloc_cb, + .init_cb = init_cnt_cb, + .destroy_cb = destroy_cb, + + .get_cb = get_cb, + .add_cb = add_cb, + .remove_cb = remove_cb, + .drop_cb = drop_cb, + .drop_all_cb = drop_all_cb, + .get_victim_cb = get_victim_cb, + .reserve_cond_cb = reserve_cond_cb, + .iter_create_cb = cache_iter_create_cb, +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#define LV_CACHE_ENTRY_SIZE lv_cache_entry_get_size(0) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void get_entry(lv_cache_sc_da_t * da, size_t index, + void ** cache_data, lv_cache_entry_t ** cache_entry) +{ + const size_t node_size = lv_cache_entry_get_size(da->cache.node_size); + *cache_data = da->data + (index * node_size); + *cache_entry = + lv_cache_entry_get_entry(*cache_data, da->cache.node_size); +} +static inline void set_second_chance(lv_cache_entry_t * entry, bool value) +{ + if(value) { + lv_cache_entry_set_flag(entry, LV_CACHE_ENTRY_FLAG_CLASS_CUSTOM); + } + else { + lv_cache_entry_remove_flag(entry, LV_CACHE_ENTRY_FLAG_CLASS_CUSTOM); + } +} + +static inline bool has_second_chance(lv_cache_entry_t * entry) +{ + return lv_cache_entry_has_flag(entry, LV_CACHE_ENTRY_FLAG_CLASS_CUSTOM); +} + +static void * alloc_new_entry(lv_cache_sc_da_t * da, const void * key, + void * user_data) +{ + LV_UNUSED(user_data); + + LV_ASSERT_NULL(da); + LV_ASSERT_NULL(key); + + if(da == NULL || key == NULL) { + return NULL; + } + const size_t node_size = lv_cache_entry_get_size(da->cache.node_size); + + if(da->capacity == da->cache.size) { + if(da->capacity == da->cache.max_size) { + LV_LOG_ERROR( + "Reached maximum size of cache. Unable to allocate a new entry"); + return NULL; + } + + const size_t new_capacity = + LV_MIN(da->capacity == 0 ? 1 : da->capacity * 2, + da->cache.max_size); + + uint8_t * new_data = (uint8_t *)lv_realloc( + da->data, new_capacity * node_size); + + if(!new_data) { + LV_LOG_ERROR("Failed to allocate new data for cache"); + return NULL; + } + + da->data = new_data; + da->capacity = new_capacity; + } + void * last_da_entry; + lv_cache_entry_t * last_cache_entry; + + get_entry(da, da->cache.size, &last_da_entry, &last_cache_entry); + + lv_memcpy(last_da_entry, key, da->cache.node_size); + lv_cache_entry_init(last_cache_entry, &da->cache, da->cache.node_size); + lv_cache_entry_set_flag(last_cache_entry, LV_CACHE_ENTRY_FLAG_DISABLE_DELETE); + + /*New entries start with their second chance set*/ + set_second_chance(last_cache_entry, true); + return last_cache_entry; +} + +static void * alloc_cb(void) +{ + return lv_calloc(1, sizeof(lv_cache_sc_da_t)); +} + +static bool init_cnt_cb(lv_cache_t * cache) +{ + LV_ASSERT_NULL(cache); + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)cache; + return da->cache.node_size > 0 && da->cache.ops.compare_cb && + da->cache.ops.free_cb; +} + +static void destroy_cb(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)cache; + + LV_ASSERT_NULL(da); + + if(da == NULL) { + return; + } + + cache->clz->drop_all_cb(cache, user_data); + cache->size = 0; + lv_free(da->data); + da->data = NULL; + da->capacity = 0; +} + +static lv_cache_entry_t * get_cb(lv_cache_t * cache, const void * key, + void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)cache; + + LV_ASSERT_NULL(da); + LV_ASSERT_NULL(key); + + if(da == NULL || key == NULL) { + return NULL; + } + + /* Linear search */ + lv_cache_entry_t * cache_entry = NULL; + for(size_t i = 0; i < da->cache.size; ++i) { + void * curr_da_entry; + lv_cache_entry_t * curr_cache_entry; + get_entry(da, i, &curr_da_entry, &curr_cache_entry); + + if(da->cache.ops.compare_cb(curr_da_entry, key) == 0) { + cache_entry = curr_cache_entry; + /*When an entry is used, we set it's second chance to true again*/ + set_second_chance(cache_entry, true); + break; + } + } + return cache_entry; +} + +static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, + void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)cache; + + LV_ASSERT_NULL(da); + LV_ASSERT_NULL(key); + + if(da == NULL || key == NULL) { + return NULL; + } + + lv_cache_entry_t * entry = alloc_new_entry(da, key, user_data); + if(entry == NULL) { + return NULL; + } + + cache->size += 1; + + return entry; +} + +static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, + void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)cache; + + LV_ASSERT_NULL(da); + LV_ASSERT_NULL(entry); + + if(da == NULL || entry == NULL) { + return; + } + + const size_t entry_size = lv_cache_entry_get_size(da->cache.node_size); + uint8_t * da_entry_to_remove = (uint8_t *)lv_cache_entry_get_data(entry); + + void * last_da_entry; + lv_cache_entry_t * last_cache_entry; + get_entry(da, cache->size - 1, &last_da_entry, &last_cache_entry); + + if(da_entry_to_remove != last_da_entry) { + lv_memcpy(da_entry_to_remove, last_da_entry, entry_size); + } + cache->size -= 1; +} + +static void drop_cb(lv_cache_t * cache, const void * key, void * user_data) +{ + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)cache; + + LV_ASSERT_NULL(da); + LV_ASSERT_NULL(key); + + if(da == NULL || key == NULL) { + return; + } + lv_cache_entry_t * entry = cache->clz->get_cb(cache, key, user_data); + if(!entry) { + return; + } + + const size_t entry_size = lv_cache_entry_get_size(da->cache.node_size); + uint8_t * da_entry_to_remove = (uint8_t *)lv_cache_entry_get_data(entry); + + void * last_da_entry; + lv_cache_entry_t * last_cache_entry; + get_entry(da, cache->size - 1, &last_da_entry, &last_cache_entry); + + if(da_entry_to_remove != last_da_entry) { + lv_memcpy(da_entry_to_remove, last_da_entry, entry_size); + } + cache->ops.free_cb(da_entry_to_remove, user_data); + cache->size -= 1; +} + +static void drop_all_cb(lv_cache_t * cache, void * user_data) +{ + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)cache; + + LV_ASSERT_NULL(da); + + if(da == NULL) { + return; + } + uint32_t used_cnt = 0; + for(size_t i = 0; i < cache->size; ++i) { + void * da_entry; + lv_cache_entry_t * cache_entry; + get_entry(da, i, &da_entry, &cache_entry); + const int32_t refs = lv_cache_entry_get_ref(cache_entry); + + if(refs > 0) { + LV_LOG_WARN( + "entry (%zu) is still referenced (%" LV_PRId32 + ")", + i, refs); + used_cnt++; + continue; + } + da->cache.ops.free_cb(da_entry, user_data); + } + if(used_cnt > 0) { + LV_LOG_WARN("%" LV_PRId32 " entries are still referenced", + used_cnt); + } + + cache->size = 0; +} + +static lv_cache_entry_t * get_possible_victim(lv_cache_sc_da_t * da, size_t index) +{ + LV_ASSERT(index < da->cache.size); + + void * da_entry; + lv_cache_entry_t * cache_entry; + get_entry(da, index, &da_entry, &cache_entry); + + const uint8_t sec_chance = has_second_chance(cache_entry); + const int32_t refs = lv_cache_entry_get_ref(cache_entry); + + if(sec_chance == 0 && refs == 0) { + return cache_entry; + } + if(sec_chance == 0 && refs > 0) { + LV_LOG_INFO( + "Entry %zu should be evicted but it's still referenced %" LV_PRId32 + " times\n", + index, refs); + return NULL; + } + + /*Remove its second chance*/ + set_second_chance(cache_entry, false); + return NULL; +} + +static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)cache; + + LV_ASSERT_NULL(da); + /* + * We iterate twice to handle the complexity introduced by reference counting + * in the second chance algorithm: + * + * First iteration: Clear second chance bits and look for victims (entries with + * sec_chance=0 AND refs=0). Some entries may have sec_chance=0 but refs>0, + * making them unavailable for eviction despite being marked for removal. + * + * Second iteration: Now that all second chance bits are cleared from the first + * pass, we can find entries that are truly available for eviction (refs=0). + * We can't assume the first entry will be the victim after the first round + * because reference counts may prevent eviction of otherwise eligible entries. + * + * This ensures we give all entries a proper second chance while respecting + * active references that prevent immediate eviction. + */ + for(size_t i = 0; i < 2; ++i) { + for(size_t j = 0; j < da->cache.size; ++j) { + lv_cache_entry_t * victim = get_possible_victim(da, j); + if(victim) { + return victim; + } + } + } + return NULL; +} + +static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, + const void * key, + size_t reserved_size, + void * user_data) +{ + LV_UNUSED(user_data); + LV_UNUSED(key); + + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)cache; + + LV_ASSERT_NULL(da); + + if(da == NULL) { + return LV_CACHE_RESERVE_COND_ERROR; + } + + return cache->size + reserved_size + 1 > da->cache.max_size ? + LV_CACHE_RESERVE_COND_NEED_VICTIM : + LV_CACHE_RESERVE_COND_OK; +} + +static lv_iter_t * cache_iter_create_cb(lv_cache_t * cache) +{ + return lv_iter_create(cache, lv_cache_entry_get_size(cache->node_size), + 0, cache_iter_next_cb); +} + +static lv_result_t cache_iter_next_cb(void * instance, void * context, void * elem) +{ + lv_cache_sc_da_t * da = (lv_cache_sc_da_t *)instance; + uint8_t ** da_entry = context; + LV_ASSERT_NULL(da_entry); + const size_t entry_size = lv_cache_entry_get_size(da->cache.node_size); + + if(*da_entry == NULL) { + *da_entry = da->data; + } + else { + *da_entry += entry_size; + } + + if(*da_entry == NULL) { + return LV_RESULT_INVALID; + } + + lv_memcpy(elem, da_entry, entry_size); + + return LV_RESULT_OK; +} diff --git a/inc/lvgl/src/misc/cache/class/lv_cache_sc_da.h b/inc/lvgl/src/misc/cache/class/lv_cache_sc_da.h new file mode 100644 index 0000000..8223db7 --- /dev/null +++ b/inc/lvgl/src/misc/cache/class/lv_cache_sc_da.h @@ -0,0 +1,44 @@ +/** +* @file lv_cache_sc_da.h +* +*/ + +#ifndef LV_CACHE_SC_DA_H +#define LV_CACHE_SC_DA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_cache_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/************************* + * GLOBAL VARIABLES + *************************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_cache_class_t lv_cache_class_sc_da; + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_SC_DA_H*/ diff --git a/inc/lvgl/src/misc/cache/instance/lv_cache_instance.h b/inc/lvgl/src/misc/cache/instance/lv_cache_instance.h new file mode 100644 index 0000000..2dc6968 --- /dev/null +++ b/inc/lvgl/src/misc/cache/instance/lv_cache_instance.h @@ -0,0 +1,16 @@ +/** + * @file lv_cache_instance.h + * + */ + +#ifndef LV_CACHE_INSTANCE_H +#define LV_CACHE_INSTANCE_H + +/********************* + * INCLUDES + *********************/ + +#include "lv_image_header_cache.h" +#include "lv_image_cache.h" + +#endif //LV_CACHE_INSTANCE_H diff --git a/inc/lvgl/src/misc/cache/instance/lv_image_cache.c b/inc/lvgl/src/misc/cache/instance/lv_image_cache.c new file mode 100644 index 0000000..aaa2362 --- /dev/null +++ b/inc/lvgl/src/misc/cache/instance/lv_image_cache.c @@ -0,0 +1,194 @@ +/** +* @file lv_image_cache.c +* + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../draw/lv_image_decoder_private.h" +#include "../../lv_assert.h" +#include "../../../core/lv_global.h" +#include "../../../misc/lv_iter.h" + +#include "lv_image_cache.h" + +/********************* + * DEFINES + *********************/ + +#define CACHE_NAME "IMAGE" + +#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) +#define image_cache_draw_buf_handlers &(LV_GLOBAL_DEFAULT()->image_cache_draw_buf_handlers) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_cache_compare_res_t image_cache_compare_cb(const lv_image_cache_data_t * lhs, + const lv_image_cache_data_t * rhs); +static void image_cache_free_cb(lv_image_cache_data_t * entry, void * user_data); +static void iter_inspect_cb(void * elem); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_image_cache_init(uint32_t size) +{ + if(img_cache_p != NULL) { + return LV_RESULT_OK; + } + + img_cache_p = lv_cache_create(&lv_cache_class_lru_rb_size, + sizeof(lv_image_cache_data_t), size, (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t) image_cache_compare_cb, + .create_cb = NULL, + .free_cb = (lv_cache_free_cb_t) image_cache_free_cb, + }); + + lv_cache_set_name(img_cache_p, CACHE_NAME); + return img_cache_p != NULL ? LV_RESULT_OK : LV_RESULT_INVALID; +} + +void lv_image_cache_resize(uint32_t new_size, bool evict_now) +{ + lv_cache_set_max_size(img_cache_p, new_size, NULL); + if(evict_now) { + lv_cache_reserve(img_cache_p, new_size, NULL); + } +} + +void lv_image_cache_drop(const void * src) +{ + /*If user invalidate image, the header cache should be invalidated too.*/ + lv_image_header_cache_drop(src); + + /*Notify draw units to invalidate any cached resources (e.g., GPU textures) for this image source.*/ + lv_draw_unit_send_event(NULL, LV_EVENT_INVALIDATE_AREA, (void *)src); + + if(src == NULL) { + lv_cache_drop_all(img_cache_p, NULL); + return; + } + + lv_image_cache_data_t search_key = { + .src = src, + .src_type = lv_image_src_get_type(src), + }; + + lv_cache_drop(img_cache_p, &search_key, NULL); +} + +bool lv_image_cache_is_enabled(void) +{ + return lv_cache_is_enabled(img_cache_p); +} + +lv_iter_t * lv_image_cache_iter_create(void) +{ + return lv_cache_iter_create(img_cache_p); +} + +void lv_image_cache_dump(void) +{ + lv_iter_t * iter = lv_image_cache_iter_create(); + if(iter == NULL) return; + + LV_LOG_USER("Image cache dump:"); + LV_LOG_USER("\tsize\tdata_size\tcf\trc\ttype\tdecoded\t\t\tsrc"); + lv_iter_inspect(iter, iter_inspect_cb); + lv_iter_destroy(iter); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +inline static lv_cache_compare_res_t image_cache_common_compare(const void * lhs_src, lv_image_src_t lhs_src_type, + const void * rhs_src, lv_image_src_t rhs_src_type) +{ + if(lhs_src_type == rhs_src_type) { + if(lhs_src_type == LV_IMAGE_SRC_FILE) { + int32_t cmp_res = lv_strcmp(lhs_src, rhs_src); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + } + else if(lhs_src_type == LV_IMAGE_SRC_VARIABLE) { + if(lhs_src != rhs_src) { + return lhs_src > rhs_src ? 1 : -1; + } + } + return 0; + } + return lhs_src_type > rhs_src_type ? 1 : -1; +} + +static lv_cache_compare_res_t image_cache_compare_cb( + const lv_image_cache_data_t * lhs, + const lv_image_cache_data_t * rhs) +{ + return image_cache_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type); +} + +static void image_cache_free_cb(lv_image_cache_data_t * entry, void * user_data) +{ + LV_UNUSED(user_data); + + /* Destroy the decoded draw buffer if necessary. */ + lv_draw_buf_t * decoded = (lv_draw_buf_t *)entry->decoded; + if(lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_ALLOCATED)) { + lv_draw_buf_destroy(decoded); + } + + /*Free the duplicated file name*/ + if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src); +} + +static void iter_inspect_cb(void * elem) +{ + lv_image_cache_data_t * data = (lv_image_cache_data_t *)elem; + lv_draw_buf_t * decoded = (lv_draw_buf_t *)data->decoded; + lv_image_header_t * header = &decoded->header; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, img_cache_p->node_size); + + LV_UNUSED(decoded); + LV_UNUSED(header); + LV_UNUSED(entry); + + /* size data_size cf rc type decoded src*/ +#define IMAGE_CACHE_DUMP_FORMAT " %4dx%-4d %9"LV_PRIu32" %d %"LV_PRId32" " + switch(data->src_type) { + case LV_IMAGE_SRC_FILE: + LV_LOG_USER(IMAGE_CACHE_DUMP_FORMAT "file\t%-12p\t%s", header->w, header->h, decoded->data_size, header->cf, + lv_cache_entry_get_ref(entry), (void *)data->decoded, (char *)data->src); + break; + case LV_IMAGE_SRC_VARIABLE: + LV_LOG_USER(IMAGE_CACHE_DUMP_FORMAT "var \t%-12p\t%p", header->w, header->h, decoded->data_size, header->cf, + lv_cache_entry_get_ref(entry), (void *)data->decoded, data->src); + break; + default: + LV_LOG_USER(IMAGE_CACHE_DUMP_FORMAT "unkn\t%-12p\t%p", header->w, header->h, decoded->data_size, header->cf, + lv_cache_entry_get_ref(entry), (void *)data->decoded, data->src); + break; + } +} diff --git a/inc/lvgl/src/misc/cache/instance/lv_image_cache.h b/inc/lvgl/src/misc/cache/instance/lv_image_cache.h new file mode 100644 index 0000000..2d1e827 --- /dev/null +++ b/inc/lvgl/src/misc/cache/instance/lv_image_cache.h @@ -0,0 +1,81 @@ +/** +* @file lv_image_cache.h +* + */ + +#ifndef LV_IMAGE_CACHE_H +#define LV_IMAGE_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize image cache. + * @param size size of the cache in bytes. + * @return LV_RESULT_OK: initialization succeeded, LV_RESULT_INVALID: failed. + */ +lv_result_t lv_image_cache_init(uint32_t size); + +/** + * Resize image cache. + * If set to 0, the cache will be disabled. + * @param new_size new size of the cache in bytes. + * @param evict_now true: evict the images should be removed by the eviction policy, false: wait for the next cache cleanup. + */ +void lv_image_cache_resize(uint32_t new_size, bool evict_now); + +/** + * Invalidate image cache. Use NULL to invalidate all images. + * @param src pointer to an image source. + */ +void lv_image_cache_drop(const void * src); + +/** + * Return true if the image cache is enabled. + * @return true: enabled, false: disabled. + */ +bool lv_image_cache_is_enabled(void); + +/** + * Create an iterator to iterate over the image cache. + * @return an iterator to iterate over the image cache. + */ +lv_iter_t * lv_image_cache_iter_create(void); + +/** + * Dump the content of the image cache in a human-readable format with cache order. + */ +void lv_image_cache_dump(void); + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_CACHE_H*/ diff --git a/inc/lvgl/src/misc/cache/instance/lv_image_header_cache.c b/inc/lvgl/src/misc/cache/instance/lv_image_header_cache.c new file mode 100644 index 0000000..de5e287 --- /dev/null +++ b/inc/lvgl/src/misc/cache/instance/lv_image_header_cache.c @@ -0,0 +1,180 @@ +/** +* @file lv_image_header_cache.c +* + */ + +/********************* + * INCLUDES + *********************/ + +#include "../../../draw/lv_image_decoder_private.h" +#include "../../lv_assert.h" +#include "../../../core/lv_global.h" + +#include "lv_image_header_cache.h" +#include "../../lv_iter.h" + +/********************* + * DEFINES + *********************/ + +#define CACHE_NAME "IMAGE_HEADER" + +#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_cache_compare_res_t image_header_cache_compare_cb(const lv_image_header_cache_data_t * lhs, + const lv_image_header_cache_data_t * rhs); +static void image_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data); +static void iter_inspect_cb(void * elem); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_image_header_cache_init(uint32_t count) +{ + if(img_header_cache_p != NULL) { + return LV_RESULT_OK; + } + + img_header_cache_p = lv_cache_create(&lv_cache_class_lru_rb_count, + sizeof(lv_image_header_cache_data_t), count, (lv_cache_ops_t) { + .compare_cb = (lv_cache_compare_cb_t) image_header_cache_compare_cb, + .create_cb = NULL, + .free_cb = (lv_cache_free_cb_t) image_header_cache_free_cb + }); + + lv_cache_set_name(img_header_cache_p, CACHE_NAME); + return img_header_cache_p != NULL ? LV_RESULT_OK : LV_RESULT_INVALID; +} + +void lv_image_header_cache_resize(uint32_t count, bool evict_now) +{ + lv_cache_set_max_size(img_header_cache_p, count, NULL); + if(evict_now) { + lv_cache_reserve(img_header_cache_p, count, NULL); + } +} + +void lv_image_header_cache_drop(const void * src) +{ + if(src == NULL) { + lv_cache_drop_all(img_header_cache_p, NULL); + return; + } + + lv_image_header_cache_data_t search_key = { + .src = src, + .src_type = lv_image_src_get_type(src), + }; + + lv_cache_drop(img_header_cache_p, &search_key, NULL); +} + +bool lv_image_header_cache_is_enabled(void) +{ + return lv_cache_is_enabled(img_header_cache_p); +} + +lv_iter_t * lv_image_header_cache_iter_create(void) +{ + return lv_cache_iter_create(img_header_cache_p); +} + +void lv_image_header_cache_dump(void) +{ + lv_iter_t * iter = lv_image_header_cache_iter_create(); + if(iter == NULL) return; + + LV_LOG_USER("Image cache dump:"); + LV_LOG_USER("\tsize\tdata_size\tcf\trc\ttype\tdecoded\t\t\tsrc"); + lv_iter_inspect(iter, iter_inspect_cb); + lv_iter_destroy(iter); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +inline static lv_cache_compare_res_t image_cache_common_compare(const void * lhs_src, lv_image_src_t lhs_src_type, + const void * rhs_src, lv_image_src_t rhs_src_type) +{ + if(lhs_src_type == rhs_src_type) { + if(lhs_src_type == LV_IMAGE_SRC_FILE) { + int32_t cmp_res = lv_strcmp(lhs_src, rhs_src); + if(cmp_res != 0) { + return cmp_res > 0 ? 1 : -1; + } + } + else if(lhs_src_type == LV_IMAGE_SRC_VARIABLE) { + if(lhs_src != rhs_src) { + return lhs_src > rhs_src ? 1 : -1; + } + } + return 0; + } + return lhs_src_type > rhs_src_type ? 1 : -1; +} + +static lv_cache_compare_res_t image_header_cache_compare_cb( + const lv_image_header_cache_data_t * lhs, + const lv_image_header_cache_data_t * rhs) +{ + return image_cache_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type); +} + +static void image_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data) +{ + LV_UNUSED(user_data); /*Unused*/ + + if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src); +} + +static void iter_inspect_cb(void * elem) +{ + lv_image_cache_data_t * data = (lv_image_cache_data_t *)elem; + lv_draw_buf_t * decoded = (lv_draw_buf_t *)data->decoded; + lv_image_header_t * header = &decoded->header; + lv_cache_entry_t * entry = lv_cache_entry_get_entry(data, img_header_cache_p->node_size); + + LV_UNUSED(decoded); + LV_UNUSED(header); + LV_UNUSED(entry); + + /* size data_size cf rc type decoded src*/ +#define IMAGE_CACHE_DUMP_FORMAT " %4dx%-4d %9"LV_PRIu32" %d %" LV_PRId32 " " + switch(data->src_type) { + case LV_IMAGE_SRC_FILE: + LV_LOG_USER(IMAGE_CACHE_DUMP_FORMAT "file\t%-12p\t%s", header->w, header->h, decoded->data_size, header->cf, + lv_cache_entry_get_ref(entry), (void *)data->decoded, (char *)data->src); + break; + case LV_IMAGE_SRC_VARIABLE: + LV_LOG_USER(IMAGE_CACHE_DUMP_FORMAT "var \t%-12p\t%p", header->w, header->h, decoded->data_size, header->cf, + lv_cache_entry_get_ref(entry), (void *)data->decoded, data->src); + break; + default: + LV_LOG_USER(IMAGE_CACHE_DUMP_FORMAT "unkn\t%-12p\t%p", header->w, header->h, decoded->data_size, header->cf, + lv_cache_entry_get_ref(entry), (void *)data->decoded, data->src); + break; + } +} diff --git a/inc/lvgl/src/misc/cache/instance/lv_image_header_cache.h b/inc/lvgl/src/misc/cache/instance/lv_image_header_cache.h new file mode 100644 index 0000000..4417981 --- /dev/null +++ b/inc/lvgl/src/misc/cache/instance/lv_image_header_cache.h @@ -0,0 +1,82 @@ +/** +* @file lv_image_header_cache.h +* + */ + +#ifndef LV_IMAGE_HEADER_CACHE_H +#define LV_IMAGE_HEADER_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize image header cache. + * @param count initial size of the cache in count of image headers. + * @return LV_RESULT_OK: initialization succeeded, LV_RESULT_INVALID: failed. + */ +lv_result_t lv_image_header_cache_init(uint32_t count); + +/** + * Resize image header cache. + * If set to 0, the cache is disabled. + * @param count new max count of cached image headers. + * @param evict_now true: evict the image headers should be removed by the eviction policy, false: wait for the next cache cleanup. + */ +void lv_image_header_cache_resize(uint32_t count, bool evict_now); + +/** + * Invalidate image header cache. Use NULL to invalidate all image headers. + * It's also automatically called when an image is invalidated. + * @param src pointer to an image source. + */ +void lv_image_header_cache_drop(const void * src); + +/** + * Return true if the image header cache is enabled. + * @return true: enabled, false: disabled. + */ +bool lv_image_header_cache_is_enabled(void); + +/** + * Create an iterator to iterate over the image header cache. + * @return an iterator to iterate over the image header cache. + */ +lv_iter_t * lv_image_header_cache_iter_create(void); + +/** + * Dump the content of the image header cache in a human-readable format with cache order. + */ +void lv_image_header_cache_dump(void); + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_HEADER_CACHE_H*/ diff --git a/inc/lvgl/src/misc/cache/lv_cache.c b/inc/lvgl/src/misc/cache/lv_cache.c new file mode 100644 index 0000000..a029db1 --- /dev/null +++ b/inc/lvgl/src/misc/cache/lv_cache.c @@ -0,0 +1,359 @@ +/** +* @file lv_cache.c +* +*/ + +/********************* + * INCLUDES + *********************/ +#include "lv_cache.h" +#include "../../stdlib/lv_sprintf.h" +#include "../lv_assert.h" +#include "lv_cache_entry_private.h" +#include "lv_cache_private.h" +#include "../lv_profiler.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void cache_drop_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data); +static bool cache_evict_one_internal_no_lock(lv_cache_t * cache, void * user_data); +static lv_cache_entry_t * cache_add_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_cache_t * lv_cache_create(const lv_cache_class_t * cache_class, + size_t node_size, size_t max_size, + lv_cache_ops_t ops) +{ + lv_cache_t * cache = cache_class->alloc_cb(); + LV_ASSERT_MALLOC(cache); + + cache->clz = cache_class; + cache->node_size = node_size; + cache->max_size = max_size; + cache->size = 0; + cache->ops = ops; + + if(cache->clz->init_cb(cache) == false) { + LV_LOG_ERROR("Cache init failed"); + lv_free(cache); + return NULL; + } + + lv_mutex_init(&cache->lock); + + return cache; +} + +void lv_cache_destroy(lv_cache_t * cache, void * user_data) +{ + LV_ASSERT_NULL(cache); + + lv_mutex_lock(&cache->lock); + cache->clz->destroy_cb(cache, user_data); + lv_mutex_unlock(&cache->lock); + lv_mutex_delete(&cache->lock); + lv_free(cache); +} + +lv_cache_entry_t * lv_cache_acquire(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_ASSERT_NULL(cache); + LV_ASSERT_NULL(key); + + LV_PROFILER_CACHE_BEGIN; + + lv_mutex_lock(&cache->lock); + + if(cache->size == 0) { + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; + return NULL; + } + + lv_cache_entry_t * entry = cache->clz->get_cb(cache, key, user_data); + if(entry != NULL) { + lv_cache_entry_acquire_data(entry); + } + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; + return entry; +} +void lv_cache_release(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data) +{ + LV_ASSERT_NULL(entry); + + LV_PROFILER_CACHE_BEGIN; + + lv_mutex_lock(&cache->lock); + lv_cache_entry_release_data(entry, user_data); + + if(lv_cache_entry_get_ref(entry) == 0 && lv_cache_entry_is_invalid(entry)) { + cache->ops.free_cb(lv_cache_entry_get_data(entry), user_data); + lv_cache_entry_delete(entry); + } + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; +} +lv_cache_entry_t * lv_cache_add(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_ASSERT_NULL(cache); + LV_ASSERT_NULL(key); + + LV_PROFILER_CACHE_BEGIN; + + lv_mutex_lock(&cache->lock); + if(cache->max_size == 0) { + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; + return NULL; + } + + lv_cache_entry_t * entry = cache_add_internal_no_lock(cache, key, user_data); + if(entry != NULL) { + lv_cache_entry_acquire_data(entry); + } + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; + return entry; +} +lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_ASSERT_NULL(cache); + LV_ASSERT_NULL(key); + + LV_PROFILER_CACHE_BEGIN; + + lv_mutex_lock(&cache->lock); + lv_cache_entry_t * entry = NULL; + + if(cache->size != 0) { + entry = cache->clz->get_cb(cache, key, user_data); + if(entry != NULL) { + lv_cache_entry_acquire_data(entry); + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; + return entry; + } + } + + if(cache->max_size == 0) { + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; + return NULL; + } + + entry = cache_add_internal_no_lock(cache, key, user_data); + if(entry == NULL) { + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; + return NULL; + } + bool create_res = cache->ops.create_cb(lv_cache_entry_get_data(entry), user_data); + if(create_res == false) { + cache->clz->remove_cb(cache, entry, user_data); + cache->ops.free_cb(lv_cache_entry_get_data(entry), user_data); + lv_cache_entry_delete(entry); + entry = NULL; + } + else { + lv_cache_entry_acquire_data(entry); + } + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; + return entry; +} +void lv_cache_reserve(lv_cache_t * cache, uint32_t reserved_size, void * user_data) +{ + LV_ASSERT_NULL(cache); + + LV_PROFILER_CACHE_BEGIN; + + for(lv_cache_reserve_cond_res_t reserve_cond_res = cache->clz->reserve_cond_cb(cache, NULL, reserved_size, user_data); + reserve_cond_res == LV_CACHE_RESERVE_COND_NEED_VICTIM; + reserve_cond_res = cache->clz->reserve_cond_cb(cache, NULL, reserved_size, user_data)) + cache_evict_one_internal_no_lock(cache, user_data); + + LV_PROFILER_CACHE_END; +} +void lv_cache_drop(lv_cache_t * cache, const void * key, void * user_data) +{ + LV_ASSERT_NULL(cache); + LV_ASSERT_NULL(key); + + LV_PROFILER_CACHE_BEGIN; + + lv_mutex_lock(&cache->lock); + cache_drop_internal_no_lock(cache, key, user_data); + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; +} +bool lv_cache_evict_one(lv_cache_t * cache, void * user_data) +{ + LV_ASSERT_NULL(cache); + + LV_PROFILER_CACHE_BEGIN; + + lv_mutex_lock(&cache->lock); + bool res = cache_evict_one_internal_no_lock(cache, user_data); + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; + return res; +} +void lv_cache_drop_all(lv_cache_t * cache, void * user_data) +{ + LV_ASSERT_NULL(cache); + + LV_PROFILER_CACHE_BEGIN; + + lv_mutex_lock(&cache->lock); + cache->clz->drop_all_cb(cache, user_data); + lv_mutex_unlock(&cache->lock); + + LV_PROFILER_CACHE_END; +} + +void lv_cache_set_max_size(lv_cache_t * cache, size_t max_size, void * user_data) +{ + LV_UNUSED(user_data); + cache->max_size = max_size; +} +size_t lv_cache_get_max_size(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + return cache->max_size; +} +size_t lv_cache_get_size(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + return cache->size; +} +size_t lv_cache_get_free_size(lv_cache_t * cache, void * user_data) +{ + LV_UNUSED(user_data); + return cache->max_size - cache->size; +} +bool lv_cache_is_enabled(lv_cache_t * cache) +{ + return cache->max_size > 0; +} +void lv_cache_set_compare_cb(lv_cache_t * cache, lv_cache_compare_cb_t compare_cb, void * user_data) +{ + LV_UNUSED(user_data); + cache->ops.compare_cb = compare_cb; +} +void lv_cache_set_create_cb(lv_cache_t * cache, lv_cache_create_cb_t alloc_cb, void * user_data) +{ + LV_UNUSED(user_data); + cache->ops.create_cb = alloc_cb; +} +void lv_cache_set_free_cb(lv_cache_t * cache, lv_cache_free_cb_t free_cb, void * user_data) +{ + LV_UNUSED(user_data); + cache->ops.free_cb = free_cb; +} +void lv_cache_set_name(lv_cache_t * cache, const char * name) +{ + if(cache == NULL) return; + cache->name = name; +} +const char * lv_cache_get_name(lv_cache_t * cache) +{ + return cache->name; +} + +lv_iter_t * lv_cache_iter_create(lv_cache_t * cache) +{ + LV_ASSERT_NULL(cache); + if(cache == NULL || cache->clz->iter_create_cb == NULL) return NULL; + return cache->clz->iter_create_cb(cache); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void cache_drop_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data) +{ + lv_cache_entry_t * entry = cache->clz->get_cb(cache, key, user_data); + if(entry == NULL) { + return; + } + + if(lv_cache_entry_get_ref(entry) == 0) { + cache->clz->remove_cb(cache, entry, user_data); + cache->ops.free_cb(lv_cache_entry_get_data(entry), user_data); + lv_cache_entry_delete(entry); + } + else { + lv_cache_entry_set_flag(entry, LV_CACHE_ENTRY_FLAG_INVALID); + cache->clz->remove_cb(cache, entry, user_data); + } +} + +static bool cache_evict_one_internal_no_lock(lv_cache_t * cache, void * user_data) +{ + lv_cache_entry_t * victim = cache->clz->get_victim_cb(cache, user_data); + + if(victim == NULL) { + LV_LOG_ERROR("No victim found"); + return false; + } + + cache->clz->remove_cb(cache, victim, user_data); + cache->ops.free_cb(lv_cache_entry_get_data(victim), user_data); + lv_cache_entry_delete(victim); + return true; +} + +static lv_cache_entry_t * cache_add_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data) +{ + lv_cache_reserve_cond_res_t reserve_cond_res = cache->clz->reserve_cond_cb(cache, key, 0, user_data); + if(reserve_cond_res == LV_CACHE_RESERVE_COND_TOO_LARGE) { + LV_LOG_ERROR("data %p is too large that exceeds max size (%" LV_PRIu32 ")", key, cache->max_size); + return NULL; + } + + for(; reserve_cond_res == LV_CACHE_RESERVE_COND_NEED_VICTIM; + reserve_cond_res = cache->clz->reserve_cond_cb(cache, key, 0, user_data)) + if(cache_evict_one_internal_no_lock(cache, user_data) == false) + return NULL; + + lv_cache_entry_t * entry = cache->clz->add_cb(cache, key, user_data); + + return entry; +} diff --git a/inc/lvgl/src/misc/cache/lv_cache.h b/inc/lvgl/src/misc/cache/lv_cache.h new file mode 100644 index 0000000..3e393e8 --- /dev/null +++ b/inc/lvgl/src/misc/cache/lv_cache.h @@ -0,0 +1,237 @@ +/** + * @file lv_cache.h + * + */ + +#ifndef LV_CACHE_H +#define LV_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_types.h" + +#include "lv_cache_entry.h" + +#include "class/lv_cache_class.h" +#include "instance/lv_cache_instance.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a cache object with the given parameters. + * @param cache_class The class of the cache. Currently only support one two builtin classes: + * - lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. + * - lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. + * @param node_size The node size is the size of the data stored in the cache.. + * @param max_size The max size is the maximum amount of memory or count that the cache can hold. + * - lv_cache_class_lru_rb_count: max_size is the maximum count of nodes in the cache. + * - lv_cache_class_lru_rb_size: max_size is the maximum size of the cache in bytes. + * @param ops A set of operations that can be performed on the cache. See lv_cache_ops_t for details. + * @return Returns a pointer to the created cache object on success, `NULL` on error. + */ +lv_cache_t * lv_cache_create(const lv_cache_class_t * cache_class, + size_t node_size, size_t max_size, + lv_cache_ops_t ops); + +/** + * Destroy a cache object. + * @param cache The cache object pointer to destroy. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_destroy(lv_cache_t * cache, void * user_data); + +/** + * Acquire a cache entry with the given key. If entry not in cache, it will return `NULL` (not found). + * If the entry is found, it's priority will be changed by the cache's policy. And the `lv_cache_entry_t::ref_cnt` will be incremented. + * @param cache The cache object pointer to acquire the entry. + * @param key The key of the entry to acquire. + * @param user_data A user data pointer that will be passed to the create callback. + * @return Returns a pointer to the acquired cache entry on success with `lv_cache_entry_t::ref_cnt` incremented, `NULL` on error. + */ +lv_cache_entry_t * lv_cache_acquire(lv_cache_t * cache, const void * key, void * user_data); + +/** + * Acquire a cache entry with the given key. If the entry is not in the cache, it will create a new entry with the given key. + * If the entry is found, it's priority will be changed by the cache's policy. And the `lv_cache_entry_t::ref_cnt` will be incremented. + * If you want to use this API to simplify the code, you should provide a `lv_cache_ops_t::create_cb` that creates a new entry with the given key. + * This API is a combination of lv_cache_acquire() and lv_cache_add(). The effect is the same as calling lv_cache_acquire() and lv_cache_add() separately. + * And the internal impact on cache is also consistent with these two APIs. + * @param cache The cache object pointer to acquire the entry. + * @param key The key of the entry to acquire or create. + * @param user_data A user data pointer that will be passed to the create callback. + * @return Returns a pointer to the acquired or created cache entry on success with `lv_cache_entry_t::ref_cnt` incremented, `NULL` on error. + */ +lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * key, void * user_data); + +/** + * Add a new cache entry with the given key and data. If the cache is full, the cache's policy will be used to evict an entry. + * @param cache The cache object pointer to add the entry. + * @param key The key of the entry to add. + * @param user_data A user data pointer that will be passed to the create callback. + * @return Returns a pointer to the added cache entry on success with `lv_cache_entry_t::ref_cnt` incremented, `NULL` on error. + */ +lv_cache_entry_t * lv_cache_add(lv_cache_t * cache, const void * key, void * user_data); + +/** + * Release a cache entry. The `lv_cache_entry_t::ref_cnt` will be decremented. If the `lv_cache_entry_t::ref_cnt` is zero, it will issue an error. + * If the entry passed to this function is the last reference to the data and the entry is marked as invalid, the cache's policy will be used to evict the entry. + * @param cache The cache object pointer to release the entry. + * @param entry The cache entry pointer to release. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_release(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); + +/** + * Reserve a certain amount of memory/count in the cache. This function is useful when you want to reserve a certain amount of memory/count in advance, + * for example, when you know that you will need it later. + * When the current cache size is max than the reserved size, the function will evict entries until the reserved size is reached. + * @param cache The cache object pointer to reserve. + * @param reserved_size The amount of memory/count to reserve. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_reserve(lv_cache_t * cache, uint32_t reserved_size, void * user_data); + +/** + * Drop a cache entry with the given key. If the entry is not in the cache, nothing will happen to it. + * If the entry is found, it will be removed from the cache and its data will be freed when the last reference to it is released. + * @note The data will not be freed immediately but when the last reference to it is released. But this entry will not be found by lv_cache_acquire(). + * If you want cache a same key again, you should use lv_cache_add() or lv_cache_acquire_or_create(). + * @param cache The cache object pointer to drop the entry. + * @param key The key of the entry to drop. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_drop(lv_cache_t * cache, const void * key, void * user_data); + +/** + * Drop all cache entries. All entries will be removed from the cache and their data will be freed when the last reference to them is released. + * @note If some entries are still referenced by other objects, it will issue an error. And this case shouldn't happen in normal cases.. + * @param cache The cache object pointer to drop all entries. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_drop_all(lv_cache_t * cache, void * user_data); + +/** + * Evict one entry from the cache. The eviction policy will be used to select the entry to evict. + * @param cache The cache object pointer to evict an entry. + * @param user_data A user data pointer that will be passed to the free callback. + * @return Returns true if an entry is evicted, false if no entry is evicted. + */ +bool lv_cache_evict_one(lv_cache_t * cache, void * user_data); + +/** + * Set the maximum size of the cache. + * If the current cache size is greater than the new maximum size, the cache's policy will be used to evict entries until the new maximum size is reached. + * If set to 0, the cache will be disabled. + * @note But this behavior will happen only new entries are added to the cache. + * @param cache The cache object pointer to set the maximum size. + * @param max_size The new maximum size of the cache. + * @param user_data A user data pointer that will be passed to the free callback. + */ +void lv_cache_set_max_size(lv_cache_t * cache, size_t max_size, void * user_data); + +/** + * Get the maximum size of the cache. + * @param cache The cache object pointer to get the maximum size. + * @param user_data A user data pointer that will be passed to the free callback. + * @return Returns the maximum size of the cache. + */ +size_t lv_cache_get_max_size(lv_cache_t * cache, void * user_data); + +/** + * Get the current size of the cache. + * @param cache The cache object pointer to get the current size. + * @param user_data A user data pointer that will be passed to the free callback. + * @return Returns the current size of the cache. + */ +size_t lv_cache_get_size(lv_cache_t * cache, void * user_data); + +/** + * Get the free size of the cache. + * @param cache The cache object pointer to get the free size. + * @param user_data A user data pointer that will be passed to the free callback. + * @return Returns the free size of the cache. + */ +size_t lv_cache_get_free_size(lv_cache_t * cache, void * user_data); + +/** + * Return true if the cache is enabled. + * Disabled cache means that when the max_size of the cache is 0. In this case, all cache operations will be no-op. + * @param cache The cache object pointer to check if it's disabled. + * @return Returns true if the cache is enabled, false otherwise. + */ +bool lv_cache_is_enabled(lv_cache_t * cache); + +/** + * Set the compare callback of the cache. + * @param cache The cache object pointer to set the compare callback. + * @param compare_cb The compare callback to set. + * @param user_data A user data pointer. + */ +void lv_cache_set_compare_cb(lv_cache_t * cache, lv_cache_compare_cb_t compare_cb, void * user_data); + +/** + * Set the create callback of the cache. + * @param cache The cache object pointer to set the create callback. + * @param alloc_cb The create callback to set. + * @param user_data A user data pointer. + */ +void lv_cache_set_create_cb(lv_cache_t * cache, lv_cache_create_cb_t alloc_cb, void * user_data); + +/** + * Set the free callback of the cache. + * @param cache The cache object pointer to set the free callback. + * @param free_cb The free callback to set. + * @param user_data A user data pointer. + */ +void lv_cache_set_free_cb(lv_cache_t * cache, lv_cache_free_cb_t free_cb, void * user_data); + +/** + * Give a name for a cache object. Only the pointer of the string is saved. + * @param cache The cache object pointer to set the name. + * @param name The name of the cache. + */ +void lv_cache_set_name(lv_cache_t * cache, const char * name); + +/** + * Get the name of a cache object. + * @param cache The cache object pointer to get the name. + * @return Returns the name of the cache. + */ +const char * lv_cache_get_name(lv_cache_t * cache); + +/** + * Create an iterator for the cache object. The iterator is used to iterate over all cache entries. + * @param cache The cache object pointer to create the iterator. + * @return Returns a pointer to the created iterator on success, `NULL` on error. + */ +lv_iter_t * lv_cache_iter_create(lv_cache_t * cache); + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_CACHE_H */ diff --git a/inc/lvgl/src/misc/cache/lv_cache_entry.c b/inc/lvgl/src/misc/cache/lv_cache_entry.c new file mode 100644 index 0000000..91b40c7 --- /dev/null +++ b/inc/lvgl/src/misc/cache/lv_cache_entry.c @@ -0,0 +1,193 @@ +/** +* @file lv_cache_entry.c +* + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_cache_entry.h" +#include "../../stdlib/lv_sprintf.h" +#include "../lv_assert.h" +#include "lv_cache_entry_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_cache_entry_reset_ref(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + entry->ref_cnt = 0; +} + +void lv_cache_entry_inc_ref(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + entry->ref_cnt++; +} + +void lv_cache_entry_dec_ref(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + entry->ref_cnt--; + if(entry->ref_cnt < 0) { + LV_LOG_WARN("ref_cnt(%" LV_PRIu32 ") < 0", entry->ref_cnt); + entry->ref_cnt = 0; + } +} + +int32_t lv_cache_entry_get_ref(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + return entry->ref_cnt; +} + +uint32_t lv_cache_entry_get_node_size(lv_cache_entry_t * entry) +{ + return entry->node_size; +} + +void lv_cache_entry_set_node_size(lv_cache_entry_t * entry, uint32_t node_size) +{ + LV_ASSERT_NULL(entry); + entry->node_size = node_size; +} + +bool lv_cache_entry_is_invalid(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + return entry->flags & LV_CACHE_ENTRY_FLAG_INVALID; +} + +void * lv_cache_entry_get_data(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + return (uint8_t *)entry - entry->node_size; +} + +void * lv_cache_entry_acquire_data(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + + lv_cache_entry_inc_ref(entry); + return lv_cache_entry_get_data(entry); +} + +void lv_cache_entry_release_data(lv_cache_entry_t * entry, void * user_data) +{ + LV_UNUSED(user_data); + + LV_ASSERT_NULL(entry); + if(lv_cache_entry_get_ref(entry) == 0) { + LV_LOG_ERROR("ref_cnt(%" LV_PRIu32 ") == 0", entry->ref_cnt); + return; + } + + lv_cache_entry_dec_ref(entry); +} + +lv_cache_entry_t * lv_cache_entry_get_entry(void * data, const uint32_t node_size) +{ + LV_ASSERT_NULL(data); + return (lv_cache_entry_t *)((uint8_t *)data + node_size); +} + +void lv_cache_entry_set_cache(lv_cache_entry_t * entry, const lv_cache_t * cache) +{ + LV_ASSERT_NULL(entry); + entry->cache = cache; +} + +const lv_cache_t * lv_cache_entry_get_cache(const lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + return entry->cache; +} + +uint32_t lv_cache_entry_get_size(const uint32_t node_size) +{ + return node_size + sizeof(lv_cache_entry_t); +} + +lv_cache_entry_t * lv_cache_entry_alloc(const uint32_t node_size, const lv_cache_t * cache) +{ + void * res = lv_malloc_zeroed(lv_cache_entry_get_size(node_size)); + LV_ASSERT_MALLOC(res) + if(res == NULL) { + LV_LOG_ERROR("malloc failed"); + return NULL; + } + lv_cache_entry_t * entry = (lv_cache_entry_t *)((uint8_t *)res + node_size); + lv_cache_entry_init(entry, cache, node_size); + return entry; +} + +void lv_cache_entry_init(lv_cache_entry_t * entry, const lv_cache_t * cache, const uint32_t node_size) +{ + LV_ASSERT_NULL(entry); + LV_ASSERT_NULL(cache); + + entry->cache = cache; + entry->node_size = node_size; + entry->ref_cnt = 0; + entry->flags = 0; +} + +void lv_cache_entry_delete(lv_cache_entry_t * entry) +{ + LV_ASSERT_NULL(entry); + + if(entry->flags & LV_CACHE_ENTRY_FLAG_DISABLE_DELETE) { + return; + } + + void * data = lv_cache_entry_get_data(entry); + lv_free(data); +} + +void lv_cache_entry_set_flag(lv_cache_entry_t * entry, uint8_t flags) +{ + LV_ASSERT_NULL(entry); + entry->flags |= flags; +} + +void lv_cache_entry_remove_flag(lv_cache_entry_t * entry, uint8_t flags) +{ + LV_ASSERT_NULL(entry); + entry->flags &= (~flags); +} + +bool lv_cache_entry_has_flag(lv_cache_entry_t * entry, uint8_t flags) +{ + LV_ASSERT_NULL(entry); + return (entry->flags & flags) == flags; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/misc/cache/lv_cache_entry.h b/inc/lvgl/src/misc/cache/lv_cache_entry.h new file mode 100644 index 0000000..3c28f2d --- /dev/null +++ b/inc/lvgl/src/misc/cache/lv_cache_entry.h @@ -0,0 +1,113 @@ +/** +* @file lv_cache_entry.h +* + */ + +#ifndef LV_CACHE_ENTRY_H +#define LV_CACHE_ENTRY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the size of a cache entry. + * @param node_size The size of the node in the cache. + * @return The size of the cache entry. + */ +uint32_t lv_cache_entry_get_size(const uint32_t node_size); + +/** + * Get the reference count of a cache entry. + * @param entry The cache entry to get the reference count of. + * @return The reference count of the cache entry. + */ +int32_t lv_cache_entry_get_ref(lv_cache_entry_t * entry); + +/** + * Get the node size of a cache entry. Which is the same size with lv_cache_entry_get_size()'s node_size parameter. + * @param entry The cache entry to get the node size of. + * @return The node size of the cache entry. + */ +uint32_t lv_cache_entry_get_node_size(lv_cache_entry_t * entry); + +/** + * Check if a cache entry is invalid. + * @param entry The cache entry to check. + * @return True: the cache entry is invalid. False: the cache entry is valid. + */ +bool lv_cache_entry_is_invalid(lv_cache_entry_t * entry); + +/** + * Get the data of a cache entry. + * @param entry The cache entry to get the data of. + * @return The pointer to the data of the cache entry. + */ +void * lv_cache_entry_get_data(lv_cache_entry_t * entry); + +/** + * Get the cache instance of a cache entry. + * @param entry The cache entry to get the cache instance of. + * @return The pointer to the cache instance of the cache entry. + */ +const lv_cache_t * lv_cache_entry_get_cache(const lv_cache_entry_t * entry); + +/** + * Get the cache entry of a data. The data should be allocated by the cache instance. + * @param data The data to get the cache entry of. + * @param node_size The size of the node in the cache. + * @return The pointer to the cache entry of the data. + */ +lv_cache_entry_t * lv_cache_entry_get_entry(void * data, const uint32_t node_size); + +/** + * Allocate a cache entry. + * @param node_size The size of the node in the cache. + * @param cache The cache instance to allocate the cache entry from. + * @return The pointer to the allocated cache entry. + */ +lv_cache_entry_t * lv_cache_entry_alloc(const uint32_t node_size, const lv_cache_t * cache); + +/** + * Initialize a cache entry. + * @param entry The cache entry to initialize. + * @param cache The cache instance to allocate the cache entry from. + * @param node_size The size of the node in the cache. + */ +void lv_cache_entry_init(lv_cache_entry_t * entry, const lv_cache_t * cache, const uint32_t node_size); + +/** + * Deallocate a cache entry. And the data of the cache entry will be freed. + * @param entry The cache entry to deallocate. + */ +void lv_cache_entry_delete(lv_cache_entry_t * entry); +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_ENTRY_H*/ diff --git a/inc/lvgl/src/misc/cache/lv_cache_entry_private.h b/inc/lvgl/src/misc/cache/lv_cache_entry_private.h new file mode 100644 index 0000000..de16ff5 --- /dev/null +++ b/inc/lvgl/src/misc/cache/lv_cache_entry_private.h @@ -0,0 +1,62 @@ +/** + * @file lv_cache_entry_private.h + * + */ + +#ifndef LV_CACHE_ENTRY_PRIVATE_H +#define LV_CACHE_ENTRY_PRIVATE_H + +#include +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_cache_entry_t { + const lv_cache_t * cache; + int32_t ref_cnt; + uint32_t node_size; +#define LV_CACHE_ENTRY_FLAG_INVALID (1 << 0) /** Flag indicating if the entry is invalid and can be released */ +#define LV_CACHE_ENTRY_FLAG_DISABLE_DELETE (1 << 1) /** This flag should be set if the cache class is managing the memory of the entry itself*/ +#define LV_CACHE_ENTRY_FLAG_CLASS_CUSTOM (1 << 7) /**A custom flag that can be used by the different cache classes*/ + uint8_t flags; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_cache_entry_reset_ref(lv_cache_entry_t * entry); +void lv_cache_entry_inc_ref(lv_cache_entry_t * entry); +void lv_cache_entry_dec_ref(lv_cache_entry_t * entry); +void lv_cache_entry_set_node_size(lv_cache_entry_t * entry, uint32_t node_size); +void lv_cache_entry_set_cache(lv_cache_entry_t * entry, const lv_cache_t * cache); +void * lv_cache_entry_acquire_data(lv_cache_entry_t * entry); +void lv_cache_entry_release_data(lv_cache_entry_t * entry, void * user_data); +void lv_cache_entry_set_flag(lv_cache_entry_t * entry, uint8_t flags); +void lv_cache_entry_remove_flag(lv_cache_entry_t * entry, uint8_t flags); +bool lv_cache_entry_has_flag(lv_cache_entry_t * entry, uint8_t flags); +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_CACHE_ENTRY_PRIVATE_H */ diff --git a/inc/lvgl/src/misc/cache/lv_cache_private.h b/inc/lvgl/src/misc/cache/lv_cache_private.h new file mode 100644 index 0000000..1f3e6ef --- /dev/null +++ b/inc/lvgl/src/misc/cache/lv_cache_private.h @@ -0,0 +1,199 @@ +/** +* @file lv_cache_private.h +* +*/ + +#ifndef LV_CACHE_PRIVATE_H +#define LV_CACHE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_types.h" +#include "../../osal/lv_os_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * The result of the cache reserve condition callback + */ +typedef enum { + LV_CACHE_RESERVE_COND_OK, /**< The condition is met and no entries need to be evicted */ + LV_CACHE_RESERVE_COND_TOO_LARGE, /**< The condition is not met and the reserve size is too large */ + LV_CACHE_RESERVE_COND_NEED_VICTIM, /**< The condition is not met and a victim is needed to be evicted */ + LV_CACHE_RESERVE_COND_ERROR /**< An error occurred while checking the condition */ +} lv_cache_reserve_cond_res_t; + +struct _lv_cache_ops_t; +struct _lv_cache_t; +struct _lv_cache_class_t; +struct _lv_cache_entry_t; + +typedef struct _lv_cache_ops_t lv_cache_ops_t; +typedef struct _lv_cache_class_t lv_cache_class_t; + +typedef int32_t lv_cache_compare_res_t; +typedef bool (*lv_cache_create_cb_t)(void * node, void * user_data); +typedef void (*lv_cache_free_cb_t)(void * node, void * user_data); +typedef lv_cache_compare_res_t (*lv_cache_compare_cb_t)(const void * a, const void * b); + +/** + * The cache instance allocation function, used by the cache class to allocate memory for cache instances. + * @return It should return a pointer to the allocated instance. + */ +typedef void * (*lv_cache_alloc_cb_t)(void); + +/** + * The cache instance initialization function, used by the cache class to initialize the cache instance. + * @return It should return true if the initialization is successful, false otherwise. + */ +typedef bool (*lv_cache_init_cb_t)(lv_cache_t * cache); + +/** + * The cache instance destruction function, used by the cache class to destroy the cache instance. + */ +typedef void (*lv_cache_destroy_cb_t)(lv_cache_t * cache, void * user_data); + +/** + * The cache get function, used by the cache class to get a cache entry by its key. + * @return `NULL` if the key is not found. + */ +typedef lv_cache_entry_t * (*lv_cache_get_cb_t)(lv_cache_t * cache, const void * key, void * user_data); + +/** + * The cache add function, used by the cache class to add a cache entry with a given key. + * This function only cares about how to add the entry, it doesn't check if the entry already exists and doesn't care about is it a victim or not. + * @return the added cache entry, or NULL if the entry is not added. + */ +typedef lv_cache_entry_t * (*lv_cache_add_cb_t)(lv_cache_t * cache, const void * key, void * user_data); + +/** + * The cache remove function, used by the cache class to remove a cache entry from the cache but doesn't free the memory.. + * This function only cares about how to remove the entry, it doesn't care about is it a victim or not. + */ +typedef void (*lv_cache_remove_cb_t)(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data); + +/** + * The cache drop function, used by the cache class to remove a cache entry from the cache and free the memory. + */ +typedef void (*lv_cache_drop_cb_t)(lv_cache_t * cache, const void * key, void * user_data); + +/** + * The cache drop all function, used by the cache class to remove all cache entries from the cache and free the memory. + */ +typedef void (*lv_cache_drop_all_cb_t)(lv_cache_t * cache, void * user_data); + +/** + * The cache get victim function, used by the cache class to get a victim entry to be evicted. + */ +typedef lv_cache_entry_t * (*lv_cache_get_victim_cb)(lv_cache_t * cache, void * user_data); + +/** + * The cache reserve condition function, used by the cache class to check if a new entry can be added to the cache without exceeding its maximum size. + * See lv_cache_reserve_cond_res_t for the possible results. + */ +typedef lv_cache_reserve_cond_res_t (*lv_cache_reserve_cond_cb)(lv_cache_t * cache, const void * key, size_t size, + void * user_data); + +/** + * The cache iterator creation function, used by the cache class to create an iterator for the cache. + * @return A pointer to the created iterator, or NULL if the iterator cannot be created. + */ +typedef lv_iter_t * (*lv_cache_iter_create_cb)(lv_cache_t * cache); + +/** + * The cache operations struct + */ +struct _lv_cache_ops_t { + lv_cache_compare_cb_t compare_cb; /**< Compare function for keys */ + lv_cache_create_cb_t create_cb; /**< Create function for nodes */ + lv_cache_free_cb_t free_cb; /**< Free function for nodes */ +}; + +/** + * The cache entry struct + */ +struct _lv_cache_t { + const lv_cache_class_t * clz; /**< Cache class. There are two built-in classes: + * - lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. + * - lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. */ + + uint32_t node_size; /**< Size of a node */ + + uint32_t max_size; /**< Maximum size of the cache */ + uint32_t size; /**< Current size of the cache */ + + lv_cache_ops_t ops; /**< Cache operations struct _lv_cache_ops_t */ + + lv_mutex_t lock; /**< Cache lock used to protect the cache in multithreading environments */ + + const char * name; /**< Name of the cache */ +}; + +/** + * Cache class struct for building custom cache classes + * + * Examples: + * - lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy. + * - lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. + */ +struct _lv_cache_class_t { + lv_cache_alloc_cb_t alloc_cb; /**< The allocation function for cache entries */ + lv_cache_init_cb_t init_cb; /**< The initialization function for cache entries */ + lv_cache_destroy_cb_t destroy_cb; /**< The destruction function for cache entries */ + + lv_cache_get_cb_t get_cb; /**< The get function for cache entries */ + lv_cache_add_cb_t add_cb; /**< The add function for cache entries */ + lv_cache_remove_cb_t remove_cb; /**< The remove function for cache entries */ + lv_cache_drop_cb_t drop_cb; /**< The drop function for cache entries */ + lv_cache_drop_all_cb_t drop_all_cb; /**< The drop all function for cache entries */ + lv_cache_get_victim_cb get_victim_cb; /**< The get victim function for cache entries */ + lv_cache_reserve_cond_cb reserve_cond_cb; /**< The reserve condition function for cache entries */ + + lv_cache_iter_create_cb iter_create_cb; /**< The iterator creation function for cache entries */ +}; + +/*----------------- + * Cache entry slot + *----------------*/ + +struct _lv_cache_slot_size_t; + +typedef struct _lv_cache_slot_size_t lv_cache_slot_size_t; + +/** + * Cache entry slot struct + * + * To add new fields to the cache entry, add them to a new struct and add it to the first + * field of the cache data struct. And this one is a size slot for the cache entry. + */ +struct _lv_cache_slot_size_t { + size_t size; +}; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CACHE_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_anim.c b/inc/lvgl/src/misc/lv_anim.c new file mode 100644 index 0000000..23f0479 --- /dev/null +++ b/inc/lvgl/src/misc/lv_anim.c @@ -0,0 +1,859 @@ +/** + * @file lv_anim.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_anim_private.h" + +#include "../core/lv_global.h" +#include "../tick/lv_tick.h" +#include "lv_assert.h" +#include "lv_timer.h" +#include "lv_math.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/**Perform linear animations in max 1024 steps. Used in `path_cb`s*/ +#define LV_ANIM_RESOLUTION 1024 + +/**log2(LV_ANIM_RESOLUTION)*/ +#define LV_ANIM_RES_SHIFT 10 + +/**In an anim. time this bit indicates that the value is speed, and not time*/ +#define LV_ANIM_SPEED_MASK 0x80000000 + +#define state LV_GLOBAL_DEFAULT()->anim_state +#define anim_ll_p &(state.anim_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void anim_timer(lv_timer_t * param); +static void anim_vsync_event(lv_event_t * e); +static void anim_mark_list_change(void); +static void anim_completed_handler(lv_anim_t * a); +static int32_t lv_anim_path_cubic_bezier(const lv_anim_t * a, int32_t x1, + int32_t y1, int32_t x2, int32_t y2); +static void lv_anim_pause_for_internal(lv_anim_t * a, uint32_t ms); +static void resolve_time(lv_anim_t * a); +static bool remove_concurrent_anims(const lv_anim_t * a_current); +static void remove_anim(void * a); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_ANIM + #define LV_TRACE_ANIM(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_ANIM(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_anim_core_init(void) +{ + lv_ll_init(anim_ll_p, sizeof(lv_anim_t)); + state.timer = lv_timer_create(anim_timer, LV_DEF_REFR_PERIOD, NULL); + anim_mark_list_change(); /*Turn off the animation timer*/ + state.anim_list_changed = false; + state.anim_run_round = false; +} + +void lv_anim_core_deinit(void) +{ + lv_anim_delete_all(); +} + +void lv_anim_enable_vsync_mode(bool enable) +{ + if(enable) { + /* Remove animation timer, use vsync instead */ + if(state.timer) { + lv_timer_delete(state.timer); + state.timer = NULL; + } + } + else { + if(!state.timer) { + state.timer = lv_timer_create(anim_timer, LV_DEF_REFR_PERIOD, NULL); + LV_ASSERT_NULL(state.timer); + + if(state.anim_vsync_registered) { + lv_display_unregister_vsync_event(NULL, anim_vsync_event, NULL); + state.anim_vsync_registered = false; + } + } + } + + anim_mark_list_change(); +} + +void lv_anim_init(lv_anim_t * a) +{ + lv_memzero(a, sizeof(lv_anim_t)); + a->duration = 500; + a->start_value = 0; + a->end_value = 100; + a->repeat_cnt = 1; + a->path_cb = lv_anim_path_linear; + a->early_apply = 1; +#if LV_USE_EXT_DATA + a->ext_data.free_cb = NULL; + a->ext_data.data = NULL; +#endif +} + +lv_anim_t * lv_anim_start(const lv_anim_t * a) +{ + LV_TRACE_ANIM("begin"); + + /*Do not let two animations for the same 'var' with the same 'exec_cb'*/ + if(a->early_apply && (a->exec_cb || a->custom_exec_cb)) { + remove_concurrent_anims(a); + } + + /*Add the new animation to the animation linked list*/ + lv_anim_t * new_anim = lv_ll_ins_head(anim_ll_p); + LV_ASSERT_MALLOC(new_anim); + if(new_anim == NULL) return NULL; + + /*Initialize the animation descriptor*/ + lv_memcpy(new_anim, a, sizeof(lv_anim_t)); + if(a->var == a) new_anim->var = new_anim; + new_anim->run_round = state.anim_run_round; + new_anim->last_timer_run = lv_tick_get(); + new_anim->is_paused = false; + + /*Set the start value*/ + if(new_anim->early_apply) { + if(new_anim->get_value_cb) { + int32_t v_ofs = new_anim->get_value_cb(new_anim); + new_anim->start_value += v_ofs; + new_anim->end_value += v_ofs; + + } + + resolve_time(new_anim); + + new_anim->current_value = new_anim->path_cb(new_anim); + if(new_anim->exec_cb) { + new_anim->exec_cb(new_anim->var, new_anim->current_value); + } + if(new_anim->custom_exec_cb) { + new_anim->custom_exec_cb(new_anim, new_anim->current_value); + } + } + + /*Creating an animation changed the linked list. + *It's important if it happens in a ready callback. (see `anim_timer`)*/ + anim_mark_list_change(); + + LV_TRACE_ANIM("finished"); + return new_anim; +} + +uint32_t lv_anim_get_playtime(const lv_anim_t * a) +{ + if(a->repeat_cnt == LV_ANIM_REPEAT_INFINITE) { + return LV_ANIM_PLAYTIME_INFINITE; + } + + uint32_t repeat_cnt = a->repeat_cnt; + if(repeat_cnt < 1) repeat_cnt = 1; + + uint32_t playtime = a->repeat_delay + a->duration + a->reverse_delay + a->reverse_duration; + playtime = playtime * repeat_cnt; + return playtime; +} + +bool lv_anim_delete(void * var, lv_anim_exec_xcb_t exec_cb) +{ + lv_anim_t * a; + bool del_any = false; + a = lv_ll_get_head(anim_ll_p); + while(a != NULL) { + bool del = false; + if((a->var == var || var == NULL) && (a->exec_cb == exec_cb || exec_cb == NULL)) { + remove_anim(a); + anim_mark_list_change(); /*Read by `anim_timer`. It need to know if a delete occurred in + the linked list*/ + del_any = true; + del = true; + } + + /*Always start from the head on delete, because we don't know + *how `anim_ll_p` was changes in `a->deleted_cb` */ + a = del ? lv_ll_get_head(anim_ll_p) : lv_ll_get_next(anim_ll_p, a); + } + + return del_any; +} + +void lv_anim_delete_all(void) +{ + lv_ll_clear_custom(anim_ll_p, remove_anim); + anim_mark_list_change(); +} + +lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb) +{ + lv_anim_t * a; + LV_LL_READ(anim_ll_p, a) { + if(a->var == var && (a->exec_cb == exec_cb || exec_cb == NULL)) { + return a; + } + } + + return NULL; +} + +lv_timer_t * lv_anim_get_timer(void) +{ + return state.timer; +} + +uint16_t lv_anim_count_running(void) +{ + uint16_t cnt = 0; + lv_anim_t * a; + LV_LL_READ(anim_ll_p, a) cnt++; + + return cnt; +} + +uint32_t lv_anim_speed_clamped(uint32_t speed, uint32_t min_time, uint32_t max_time) +{ + + if(speed > 10000) { + LV_LOG_WARN("speed is truncated to 10000 (was %"LV_PRIu32")", speed); + speed = 10230; + } + if(min_time > 10000) { + LV_LOG_WARN("min_time is truncated to 10000 (was %"LV_PRIu32")", min_time); + min_time = 10230; + } + if(max_time > 10000) { + LV_LOG_WARN("max_time is truncated to 10000 (was %"LV_PRIu32")", max_time); + max_time = 10230; + } + + /*Lower the resolution to fit the 0.1023 range*/ + speed = (speed + 5) / 10; + min_time = (min_time + 5) / 10; + max_time = (max_time + 5) / 10; + + return LV_ANIM_SPEED_MASK + (max_time << 20) + (min_time << 10) + speed; + +} + +uint32_t lv_anim_speed(uint32_t speed) +{ + return lv_anim_speed_clamped(speed, 0, 10000); +} + +uint32_t lv_anim_speed_to_time(uint32_t speed, int32_t start, int32_t end) +{ + uint32_t d = LV_ABS(start - end); + uint32_t time = (d * 1000) / speed; + + time = time == 0 ? 1 : time; + + return time; +} + +void lv_anim_refr_now(void) +{ + anim_timer(NULL); +} + +int32_t lv_anim_path_linear(const lv_anim_t * a) +{ + /*Calculate the current step*/ + int32_t step = lv_map(a->act_time, 0, a->duration, 0, LV_ANIM_RESOLUTION); + + /*Get the new value which will be proportional to `step` + *and the `start` and `end` values*/ + int32_t new_value; + new_value = step * (a->end_value - a->start_value); + new_value = new_value >> LV_ANIM_RES_SHIFT; + new_value += a->start_value; + + return new_value; +} + +int32_t lv_anim_path_ease_in(const lv_anim_t * a) +{ + return lv_anim_path_cubic_bezier(a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0), + LV_BEZIER_VAL_FLOAT(1), LV_BEZIER_VAL_FLOAT(1)); +} + +int32_t lv_anim_path_ease_out(const lv_anim_t * a) +{ + return lv_anim_path_cubic_bezier(a, LV_BEZIER_VAL_FLOAT(0), LV_BEZIER_VAL_FLOAT(0), + LV_BEZIER_VAL_FLOAT(0.58), LV_BEZIER_VAL_FLOAT(1)); +} + +int32_t lv_anim_path_ease_in_out(const lv_anim_t * a) +{ + return lv_anim_path_cubic_bezier(a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0), + LV_BEZIER_VAL_FLOAT(0.58), LV_BEZIER_VAL_FLOAT(1)); +} + +int32_t lv_anim_path_overshoot(const lv_anim_t * a) +{ + return lv_anim_path_cubic_bezier(a, 341, 0, 683, 1300); +} + +int32_t lv_anim_path_bounce(const lv_anim_t * a) +{ + /*Calculate the current step*/ + int32_t t = lv_map(a->act_time, 0, a->duration, 0, LV_BEZIER_VAL_MAX); + int32_t diff = (a->end_value - a->start_value); + + /*3 bounces has 5 parts: 3 down and 2 up. One part is t / 5 long*/ + + if(t < 408) { + /*Go down*/ + t = (t * 2500) >> LV_BEZIER_VAL_SHIFT; /*[0..1024] range*/ + t = LV_BEZIER_VAL_MAX - t; + } + else if(t >= 408 && t < 614) { + /*First bounce back*/ + t -= 408; + t = t * 5; /*to [0..1024] range*/ + diff = diff / 20; + } + else if(t >= 614 && t < 819) { + /*Fall back*/ + t -= 614; + t = t * 5; /*to [0..1024] range*/ + t = LV_BEZIER_VAL_MAX - t; + diff = diff / 20; + } + else if(t >= 819 && t < 921) { + /*Second bounce back*/ + t -= 819; + t = t * 10; /*to [0..1024] range*/ + diff = diff / 40; + } + else if(t >= 921 && t <= LV_BEZIER_VAL_MAX) { + /*Fall back*/ + t -= 921; + t = t * 10; /*to [0..1024] range*/ + t = LV_BEZIER_VAL_MAX - t; + diff = diff / 40; + } + + if(t > LV_BEZIER_VAL_MAX) t = LV_BEZIER_VAL_MAX; + if(t < 0) t = 0; + int32_t step = lv_bezier3(t, 0, 500, 800, LV_BEZIER_VAL_MAX); + + int32_t new_value; + new_value = step * diff; + new_value = new_value >> LV_BEZIER_VAL_SHIFT; + new_value = a->end_value - new_value; + + return new_value; +} + +int32_t lv_anim_path_step(const lv_anim_t * a) +{ + if(a->act_time >= a->duration) + return a->end_value; + else + return a->start_value; +} + +int32_t lv_anim_path_custom_bezier3(const lv_anim_t * a) +{ + const lv_anim_bezier3_para_t * para = &a->parameter.bezier3; + return lv_anim_path_cubic_bezier(a, para->x1, para->y1, para->x2, para->y2); +} + +void lv_anim_set_var(lv_anim_t * a, void * var) +{ + a->var = var; +} + +void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb) +{ + a->exec_cb = exec_cb; +} + +void lv_anim_set_duration(lv_anim_t * a, uint32_t duration) +{ + a->duration = duration; +} + +void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) +{ + a->act_time = -(int32_t)(delay); +} + +void lv_anim_set_values(lv_anim_t * a, int32_t start, int32_t end) +{ + a->start_value = start; + a->current_value = INT32_MIN; + a->end_value = end; +} + +void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + a->custom_exec_cb = exec_cb; +} + +void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb) +{ + a->path_cb = path_cb; +} + +void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_start_cb_t start_cb) +{ + a->start_cb = start_cb; +} + +void lv_anim_set_get_value_cb(lv_anim_t * a, lv_anim_get_value_cb_t get_value_cb) +{ + a->get_value_cb = get_value_cb; +} + +void lv_anim_set_completed_cb(lv_anim_t * a, lv_anim_completed_cb_t completed_cb) +{ + a->completed_cb = completed_cb; +} + +void lv_anim_set_deleted_cb(lv_anim_t * a, lv_anim_deleted_cb_t deleted_cb) +{ + a->deleted_cb = deleted_cb; +} + +void lv_anim_set_reverse_duration(lv_anim_t * a, uint32_t duration) +{ + a->reverse_duration = duration; +} + +void lv_anim_set_reverse_time(lv_anim_t * a, uint32_t duration) +{ + lv_anim_set_reverse_duration(a, duration); +} + +void lv_anim_set_reverse_delay(lv_anim_t * a, uint32_t delay) +{ + a->reverse_delay = delay; +} + +void lv_anim_set_repeat_count(lv_anim_t * a, uint32_t cnt) +{ + a->repeat_cnt = cnt; +} + +void lv_anim_set_repeat_delay(lv_anim_t * a, uint32_t delay) +{ + a->repeat_delay = delay; +} + +void lv_anim_set_early_apply(lv_anim_t * a, bool en) +{ + a->early_apply = en; +} + +void lv_anim_set_user_data(lv_anim_t * a, void * user_data) +{ + a->user_data = user_data; +} + +void lv_anim_set_bezier3_param(lv_anim_t * a, int16_t x1, int16_t y1, int16_t x2, int16_t y2) +{ + lv_anim_bezier3_para_t * para = &a->parameter.bezier3; + + para->x1 = x1; + para->x2 = x2; + para->y1 = y1; + para->y2 = y2; +} + +uint32_t lv_anim_get_delay(const lv_anim_t * a) +{ + return -a->act_time; +} + +uint32_t lv_anim_get_time(const lv_anim_t * a) +{ + return a->duration; +} + +uint32_t lv_anim_get_repeat_count(const lv_anim_t * a) +{ + return a->repeat_cnt; +} + +void * lv_anim_get_user_data(const lv_anim_t * a) +{ + return a->user_data; +} + +bool lv_anim_custom_delete(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + return lv_anim_delete(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); +} + +lv_anim_t * lv_anim_custom_get(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) +{ + return lv_anim_get(a ? a->var : NULL, (lv_anim_exec_xcb_t)exec_cb); +} + +uint32_t lv_anim_resolve_speed(uint32_t speed_or_time, int32_t start, int32_t end) +{ + /*It was a simple time*/ + if((speed_or_time & LV_ANIM_SPEED_MASK) == 0) return speed_or_time; + + uint32_t d = LV_ABS(start - end); + uint32_t speed = speed_or_time & 0x3FF; + uint32_t time = (d * 100) / speed; /*Speed is in 10 units per sec*/ + uint32_t max_time = (speed_or_time >> 20) & 0x3FF; + uint32_t min_time = (speed_or_time >> 10) & 0x3FF; + + return LV_CLAMP(min_time * 10, time, max_time * 10); +} + +bool lv_anim_is_paused(lv_anim_t * a) +{ + LV_ASSERT_NULL(a); + return a->is_paused; +} + +void lv_anim_pause(lv_anim_t * a) +{ + LV_ASSERT_NULL(a); + lv_anim_pause_for_internal(a, LV_ANIM_PAUSE_FOREVER); +} + +void lv_anim_pause_for(lv_anim_t * a, uint32_t ms) +{ + LV_ASSERT_NULL(a); + lv_anim_pause_for_internal(a, ms); +} + +void lv_anim_resume(lv_anim_t * a) +{ + LV_ASSERT_NULL(a); + a->is_paused = false; + a->pause_duration = 0; + a->run_round = state.anim_run_round; +} + +#if LV_USE_EXT_DATA +void lv_anim_set_external_data(lv_anim_t * anim, void * data, void (* free_cb)(void * data)) +{ + if(!anim) { + LV_LOG_WARN("Can't attach external user data and destructor callback to a NULL animation"); + return; + } + + anim->ext_data.data = data; + anim->ext_data.free_cb = free_cb; +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Periodically handle the animations. + * @param param unused + */ +static void anim_timer(lv_timer_t * param) +{ + LV_UNUSED(param); + + /*Flip the run round*/ + state.anim_run_round = state.anim_run_round ? false : true; + + lv_anim_t * a = lv_ll_get_head(anim_ll_p); + while(a != NULL) { + uint32_t elaps = lv_tick_elaps(a->last_timer_run); + + if(a->is_paused) { + const uint32_t time_paused = lv_tick_elaps(a->pause_time); + const bool is_pause_over = a->pause_duration != LV_ANIM_PAUSE_FOREVER && time_paused >= a->pause_duration; + + if(is_pause_over) { + const uint32_t pause_overrun = time_paused - a->pause_duration; + a->is_paused = false; + a->act_time += pause_overrun; + a->run_round = !state.anim_run_round; + } + } + else { + a->act_time += elaps; + } + a->last_timer_run = lv_tick_get(); + + /*It can be set by `lv_anim_delete()` typically in `end_cb`. If set then an animation delete + * happened in `anim_completed_handler` which could make this linked list reading corrupt + * because the list is changed meanwhile + */ + state.anim_list_changed = false; + + if(!a->is_paused && a->run_round != state.anim_run_round) { + a->run_round = state.anim_run_round; /*The list readying might be reset so need to know which anim has run already*/ + /*The animation will run now for the first time. Call `start_cb`*/ + if(!a->start_cb_called && a->act_time >= 0) { + + if(a->early_apply == 0 && a->get_value_cb) { + int32_t v_ofs = a->get_value_cb(a); + a->start_value += v_ofs; + a->end_value += v_ofs; + } + + resolve_time(a); + + if(a->start_cb) a->start_cb(a); + a->start_cb_called = 1; + + /*Do not let two animations for the same 'var' with the same 'exec_cb'*/ + remove_concurrent_anims(a); + } + + if(a->act_time >= 0) { + int32_t act_time_original = a->act_time; /*The unclipped version is used later to correctly repeat the animation*/ + if(a->act_time > a->duration) a->act_time = a->duration; + + int32_t act_time_before_exec = a->act_time; + int32_t new_value; + new_value = a->path_cb(a); + + if(new_value != a->current_value) { + a->current_value = new_value; + /*Apply the calculated value*/ + if(a->exec_cb) a->exec_cb(a->var, new_value); + if(!state.anim_list_changed && a->custom_exec_cb) a->custom_exec_cb(a, new_value); + } + + if(!state.anim_list_changed) { + /*Restore the original time to see if there is over time, ignoring silly values. + *Restore only if it wasn't changed in the `exec_cb` for some special reasons.*/ + if(a->act_time == act_time_before_exec && act_time_original < a->duration * 2) { + a->act_time = act_time_original; + } + + /*If the time is elapsed the animation is ready*/ + if(a->act_time >= a->duration) { + anim_completed_handler(a); + } + } + } + } + + /*If the linked list changed due to anim. delete then it's not safe to continue + *the reading of the list from here -> start from the head*/ + if(state.anim_list_changed) + a = lv_ll_get_head(anim_ll_p); + else + a = lv_ll_get_next(anim_ll_p, a); + } + +} + +/** + * Called when an animation is completed to do the necessary things + * e.g. repeat, play in reverse, delete etc. + * @param a pointer to an animation descriptor + */ +static void anim_completed_handler(lv_anim_t * a) +{ + /*In the end of a forward anim decrement repeat cnt.*/ + if(a->reverse_play_in_progress == 0 && a->repeat_cnt > 0 && a->repeat_cnt != LV_ANIM_REPEAT_INFINITE) { + a->repeat_cnt--; + } + + /*Delete animation if + * - no repeat left and no reverse play scheduled (simple one shot animation); or + * - no repeat, reverse play enabled (reverse_duration != 0) and reverse play is completed. */ + if(a->repeat_cnt == 0 && (a->reverse_duration == 0 || a->reverse_play_in_progress == 1)) { + + /*Delete the animation from the list. + * This way the `completed_cb` will see the animations like it's animation is already deleted*/ + lv_ll_remove(anim_ll_p, a); + /*Flag that the list has changed*/ + anim_mark_list_change(); + + /*Call the callback function at the end*/ + if(a->completed_cb != NULL) a->completed_cb(a); + if(a->deleted_cb != NULL) a->deleted_cb(a); +#if LV_USE_EXT_DATA + if(a->ext_data.free_cb) { + a->ext_data.free_cb(a->ext_data.data); + a->ext_data.data = NULL; + } +#endif + lv_free(a); + } + /*If the animation is not deleted then restart it*/ + else { + /*Restart the animation. If the time is over a little compensate it.*/ + int32_t over_time = 0; + a->start_cb_called = 0; + if(a->act_time > a->duration) over_time = a->act_time - a->duration; + a->act_time = over_time - (int32_t)(a->repeat_delay); + /*Swap start and end values in reverse-play mode*/ + if(a->reverse_duration != 0) { + /*If now now playing in reverse, use the 'reverse_delay'.*/ + if(a->reverse_play_in_progress == 0) a->act_time = -(int32_t)(a->reverse_delay); + + /*Toggle reverse-play state*/ + a->reverse_play_in_progress = a->reverse_play_in_progress == 0 ? 1 : 0; + /*Swap the start and end values*/ + int32_t tmp = a->start_value; + a->start_value = a->end_value; + a->end_value = tmp; + /*Swap the time and reverse_duration*/ + tmp = a->duration; + a->duration = a->reverse_duration; + a->reverse_duration = tmp; + } + } +} + +static void anim_vsync_event(lv_event_t * e) +{ + LV_UNUSED(e); + anim_timer(NULL); +} + +static void anim_mark_list_change(void) +{ + state.anim_list_changed = true; + if(lv_ll_get_head(anim_ll_p) == NULL) { + if(state.timer) { + lv_timer_pause(state.timer); + return; + } + + if(state.anim_vsync_registered) { + lv_display_unregister_vsync_event(NULL, anim_vsync_event, NULL); + state.anim_vsync_registered = false; + } + + return; + } + + if(state.timer) { + lv_timer_resume(state.timer); + return; + } + + if(!state.anim_vsync_registered) { + lv_display_register_vsync_event(NULL, anim_vsync_event, NULL); + state.anim_vsync_registered = true; + } +} + +static int32_t lv_anim_path_cubic_bezier(const lv_anim_t * a, int32_t x1, int32_t y1, int32_t x2, int32_t y2) +{ + /*Calculate the current step*/ + uint32_t t = lv_map(a->act_time, 0, a->duration, 0, LV_BEZIER_VAL_MAX); + int32_t step = lv_cubic_bezier(t, x1, y1, x2, y2); + + int32_t new_value; + new_value = step * (a->end_value - a->start_value); + new_value = new_value >> LV_BEZIER_VAL_SHIFT; + new_value += a->start_value; + + return new_value; +} + +static void lv_anim_pause_for_internal(lv_anim_t * a, uint32_t ms) +{ + + a->is_paused = true; + a->pause_time = lv_tick_get(); + a->pause_duration = ms; +} + +static void resolve_time(lv_anim_t * a) +{ + a->duration = lv_anim_resolve_speed(a->duration, a->start_value, a->end_value); + a->reverse_duration = lv_anim_resolve_speed(a->reverse_duration, a->start_value, a->end_value); + a->reverse_delay = lv_anim_resolve_speed(a->reverse_delay, a->start_value, a->end_value); + a->repeat_delay = lv_anim_resolve_speed(a->repeat_delay, a->start_value, a->end_value); +} + +/** + * Remove animations which are animating the same var with the same exec_cb + * and they are already running or they have early_apply + * @param a_current the current animation, use its var and exec_cb as reference to know what to remove + * @return true: at least one animation was delete + */ +static bool remove_concurrent_anims(const lv_anim_t * a_current) +{ + if(a_current->exec_cb == NULL && a_current->custom_exec_cb == NULL) return false; + + lv_anim_t * a; + bool del_any = false; + a = lv_ll_get_head(anim_ll_p); + while(a != NULL) { + bool del = false; + /*We can't test for custom_exec_cb equality because in the MicroPython binding + *a wrapper callback is used here an the real callback data is stored in the `user_data`. + *Therefore equality check would remove all animations.*/ + if(a != a_current && + (a->act_time >= 0 || a->early_apply) && + (a->var == a_current->var) && + ((a->exec_cb && a->exec_cb == a_current->exec_cb) + /*|| (a->custom_exec_cb && a->custom_exec_cb == a_current->custom_exec_cb)*/)) { + lv_ll_remove(anim_ll_p, a); + if(a->deleted_cb != NULL) a->deleted_cb(a); +#if LV_USE_EXT_DATA + if(a->ext_data.free_cb) { + a->ext_data.free_cb(a->ext_data.data); + a->ext_data.data = NULL; + } +#endif + lv_free(a); + /*Read by `anim_timer`. It need to know if a delete occurred in the linked list*/ + anim_mark_list_change(); + + del_any = true; + del = true; + } + + /*Always start from the head on delete, because we don't know + *how `anim_ll_p` was changes in `a->deleted_cb` */ + a = del ? lv_ll_get_head(anim_ll_p) : lv_ll_get_next(anim_ll_p, a); + } + + return del_any; +} + +static void remove_anim(void * a) +{ + lv_anim_t * anim = a; + lv_ll_remove(anim_ll_p, a); + if(anim->deleted_cb != NULL) anim->deleted_cb(anim); +#if LV_USE_EXT_DATA + if(anim->ext_data.free_cb) { + anim->ext_data.free_cb(anim->ext_data.data); + anim->ext_data.data = NULL; + } +#endif + lv_free(a); +} diff --git a/inc/lvgl/src/misc/lv_anim.h b/inc/lvgl/src/misc/lv_anim.h new file mode 100644 index 0000000..1041689 --- /dev/null +++ b/inc/lvgl/src/misc/lv_anim.h @@ -0,0 +1,593 @@ +/** + * @file lv_anim.h + * + */ + +#ifndef LV_ANIM_H +#define LV_ANIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_ext_data.h" +#include "lv_types.h" +#include "lv_math.h" +#include "lv_timer.h" +#include "lv_ll.h" + +/********************* + * DEFINES + *********************/ + +#define LV_ANIM_REPEAT_INFINITE 0xFFFFFFFF +#define LV_ANIM_PLAYTIME_INFINITE 0xFFFFFFFF +#define LV_ANIM_PAUSE_FOREVER 0xFFFFFFFF + +/* + * Macros used to set cubic-bezier anim parameter. + * Parameters come from https://easings.net/ + * + * Usage: + * + * lv_anim_t a; + * lv_anim_init(&a); + * ... + * lv_anim_set_path_cb(&a, lv_anim_path_custom_bezier3); + * LV_ANIM_SET_EASE_IN_SINE(&a); //Set cubic-bezier anim parameter to easeInSine + * ... + * lv_anim_start(&a); + */ + +#define _PARA(a, x1, y1, x2, y2) ((a)->parameter.bezier3 = \ +(lv_anim_bezier3_para_t) { \ + LV_BEZIER_VAL_FLOAT(x1), LV_BEZIER_VAL_FLOAT(y1), \ + LV_BEZIER_VAL_FLOAT(x2), LV_BEZIER_VAL_FLOAT(y2) } \ + ) + +#define LV_ANIM_SET_EASE_IN_SINE(a) _PARA(a, 0.12, 0, 0.39, 0) +#define LV_ANIM_SET_EASE_OUT_SINE(a) _PARA(a, 0.61, 1, 0.88, 1) +#define LV_ANIM_SET_EASE_IN_OUT_SINE(a) _PARA(a, 0.37, 0, 0.63, 1) +#define LV_ANIM_SET_EASE_IN_QUAD(a) _PARA(a, 0.11, 0, 0.5, 0) +#define LV_ANIM_SET_EASE_OUT_QUAD(a) _PARA(a, 0.5, 1, 0.89, 1) +#define LV_ANIM_SET_EASE_IN_OUT_QUAD(a) _PARA(a, 0.45, 0, 0.55, 1) +#define LV_ANIM_SET_EASE_IN_CUBIC(a) _PARA(a, 0.32, 0, 0.67, 0) +#define LV_ANIM_SET_EASE_OUT_CUBIC(a) _PARA(a, 0.33, 1, 0.68, 1) +#define LV_ANIM_SET_EASE_IN_OUT_CUBIC(a) _PARA(a, 0.65, 0, 0.35, 1) +#define LV_ANIM_SET_EASE_IN_QUART(a) _PARA(a, 0.5, 0, 0.75, 0) +#define LV_ANIM_SET_EASE_OUT_QUART(a) _PARA(a, 0.25, 1, 0.5, 1) +#define LV_ANIM_SET_EASE_IN_OUT_QUART(a) _PARA(a, 0.76, 0, 0.24, 1) +#define LV_ANIM_SET_EASE_IN_QUINT(a) _PARA(a, 0.64, 0, 0.78, 0) +#define LV_ANIM_SET_EASE_OUT_QUINT(a) _PARA(a, 0.22, 1, 0.36, 1) +#define LV_ANIM_SET_EASE_IN_OUT_QUINT(a) _PARA(a, 0.83, 0, 0.17, 1) +#define LV_ANIM_SET_EASE_IN_EXPO(a) _PARA(a, 0.7, 0, 0.84, 0) +#define LV_ANIM_SET_EASE_OUT_EXPO(a) _PARA(a, 0.16, 1, 0.3, 1) +#define LV_ANIM_SET_EASE_IN_OUT_EXPO(a) _PARA(a, 0.87, 0, 0.13, 1) +#define LV_ANIM_SET_EASE_IN_CIRC(a) _PARA(a, 0.55, 0, 1, 0.45) +#define LV_ANIM_SET_EASE_OUT_CIRC(a) _PARA(a, 0, 0.55, 0.45, 1) +#define LV_ANIM_SET_EASE_IN_OUT_CIRC(a) _PARA(a, 0.85, 0, 0.15, 1) +#define LV_ANIM_SET_EASE_IN_BACK(a) _PARA(a, 0.36, 0, 0.66, -0.56) +#define LV_ANIM_SET_EASE_OUT_BACK(a) _PARA(a, 0.34, 1.56, 0.64, 1) +#define LV_ANIM_SET_EASE_IN_OUT_BACK(a) _PARA(a, 0.68, -0.6, 0.32, 1.6) + +LV_EXPORT_CONST_INT(LV_ANIM_REPEAT_INFINITE); +LV_EXPORT_CONST_INT(LV_ANIM_PLAYTIME_INFINITE); + +/********************** + * TYPEDEFS + **********************/ + +/** Can be used to indicate if animations are enabled or disabled in a case*/ +#define LV_ANIM_OFF false +#define LV_ANIM_ON true +typedef bool lv_anim_enable_t; + +/** Get the current value during an animation*/ +typedef int32_t (*lv_anim_path_cb_t)(const lv_anim_t *); + +/** Generic prototype of "animator" functions. + * First parameter is the variable to animate. + * Second parameter is the value to set. + * Compatible with `lv_xxx_set_yyy(obj, value)` functions + * The `x` in `_xcb_t` means it's not a fully generic prototype because + * it doesn't receive `lv_anim_t *` as its first argument*/ +typedef void (*lv_anim_exec_xcb_t)(void *, int32_t); + +/** Same as `lv_anim_exec_xcb_t` but receives `lv_anim_t *` as the first parameter. + * It's more consistent but less convenient. Might be used by binding generator functions.*/ +typedef void (*lv_anim_custom_exec_cb_t)(lv_anim_t *, int32_t); + +/** Callback to call when the animation is ready*/ +typedef void (*lv_anim_completed_cb_t)(lv_anim_t *); + +/** Callback to call when the animation really stars (considering `delay`)*/ +typedef void (*lv_anim_start_cb_t)(lv_anim_t *); + +/** Callback used when the animation values are relative to get the current value*/ +typedef int32_t (*lv_anim_get_value_cb_t)(lv_anim_t *); + +/** Callback used when the animation is deleted*/ +typedef void (*lv_anim_deleted_cb_t)(lv_anim_t *); + +/** Parameter used when path is custom_bezier */ +typedef struct { + int16_t x1; + int16_t y1; + int16_t x2; + int16_t y2; +} lv_anim_bezier3_para_t; + +/** Describes an animation*/ +struct _lv_anim_t { +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif + void * var; /**< Variable (Widget or other user-provided object) to animate */ + lv_anim_exec_xcb_t exec_cb; /**< Function to execute to animate */ + lv_anim_custom_exec_cb_t custom_exec_cb; /**< Function to execute to animate, + * same purpose as exec_cb but different parameters */ + lv_anim_start_cb_t start_cb; /**< Call it when animation is starts (considering `delay`) */ + lv_anim_completed_cb_t completed_cb; /**< Call it when animation is fully completed */ + lv_anim_deleted_cb_t deleted_cb; /**< Call it when animation is deleted */ + lv_anim_get_value_cb_t get_value_cb; /**< Get current value in relative mode */ + void * user_data; /**< Custom user data */ + lv_anim_path_cb_t path_cb; /**< Provides path (curve) of animation */ + int32_t start_value; /**< Start value */ + int32_t current_value; /**< Current value */ + int32_t end_value; /**< End value */ + int32_t duration; /**< Animation duration in ms */ + int32_t act_time; /**< Ms elapsed since animation started. Set to negative to make delay. */ + uint32_t reverse_delay; /**< Wait (in ms) after forward play ends and before reverse play begins. */ + uint32_t reverse_duration; /**< Reverse animation duration in ms */ + uint32_t repeat_delay; /**< Wait before repeating */ + uint32_t repeat_cnt; /**< Repeat count for animation */ + union _lv_anim_path_para_t { + lv_anim_bezier3_para_t bezier3; /**< Parameter used when path is custom_bezier */ + } parameter; + + /* Animation system use these - user shouldn't set */ + uint32_t last_timer_run; + uint32_t pause_time; /**parameter.bezier3 + * @param a pointer to an animation + * @return the current value to set + */ +int32_t lv_anim_path_custom_bezier3(const lv_anim_t * a); + +#if LV_USE_EXT_DATA +/** + * @brief Associates external user data with an animation instance + * + * Attaches arbitrary user-defined data to an LVGL animation object along with an optional + * destructor callback that will be automatically invoked when the animation completes + * or is deleted, enabling proper resource cleanup. + * + * @param anim Pointer to the animation object to configure + * @param data User-defined data pointer to associate + * @param free_cb Cleanup callback that receives ext_data when: + * - Animation completes naturally + * - Animation is deleted prematurely + * - New data replaces current association + * NULL indicates no cleanup required + */ +void lv_anim_set_external_data(lv_anim_t * anim, void * data, void (* free_cb)(void * data)); +#endif + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIM_H*/ diff --git a/inc/lvgl/src/misc/lv_anim_private.h b/inc/lvgl/src/misc/lv_anim_private.h new file mode 100644 index 0000000..83e4cd6 --- /dev/null +++ b/inc/lvgl/src/misc/lv_anim_private.h @@ -0,0 +1,63 @@ +/** + * @file lv_anim_private.h + * + */ + +#ifndef LV_ANIM_PRIVATE_H +#define LV_ANIM_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_anim.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + bool anim_list_changed; + bool anim_run_round; + bool anim_vsync_registered; + lv_timer_t * timer; + lv_ll_t anim_ll; +} lv_anim_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init the animation module + */ +void lv_anim_core_init(void); + +/** + * Deinit the animation module + */ +void lv_anim_core_deinit(void); + +/* + * Set animation use vsync mode. + * @param enable true: use vsync mode, false: use timer mode. + */ +void lv_anim_enable_vsync_mode(bool enable); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIM_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_anim_timeline.c b/inc/lvgl/src/misc/lv_anim_timeline.c new file mode 100644 index 0000000..a3cb876 --- /dev/null +++ b/inc/lvgl/src/misc/lv_anim_timeline.c @@ -0,0 +1,343 @@ +/** + * @file lv_anim_timeline.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_anim_private.h" +#include "lv_assert.h" +#include "lv_anim_timeline_private.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" +#if LV_USE_OBJ_NAME + #include "../core/lv_obj_tree.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void anim_timeline_exec_cb(void * var, int32_t v); +static void anim_timeline_set_act_time(lv_anim_timeline_t * at, uint32_t act_time); +static int32_t anim_timeline_path_cb(const lv_anim_t * a); +static void exec_anim(lv_anim_t * a, int32_t v); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_anim_timeline_t * lv_anim_timeline_create(void) +{ + lv_anim_timeline_t * at = lv_malloc_zeroed(sizeof(lv_anim_timeline_t)); + LV_ASSERT_MALLOC(at); + return at; +} + +void lv_anim_timeline_delete(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + lv_anim_timeline_pause(at); + + lv_free(at->anim_dsc); + lv_free(at); +} + +void lv_anim_timeline_add(lv_anim_timeline_t * at, uint32_t start_time, const lv_anim_t * a) +{ + LV_ASSERT_NULL(at); + + at->anim_dsc_cnt++; + at->anim_dsc = lv_realloc(at->anim_dsc, at->anim_dsc_cnt * sizeof(lv_anim_timeline_dsc_t)); + + LV_ASSERT_MALLOC(at->anim_dsc); + + at->anim_dsc[at->anim_dsc_cnt - 1].anim = *a; + at->anim_dsc[at->anim_dsc_cnt - 1].start_time = start_time; +} + +uint32_t lv_anim_timeline_start(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + uint32_t playtime = lv_anim_timeline_get_playtime(at); + uint32_t repeat = at->repeat_count; + uint32_t repeat_delay = at->repeat_delay; + uint32_t start = at->act_time; + uint32_t end = at->reverse ? 0 : playtime; + uint32_t duration = end > start ? end - start : start - end; + + if((!at->reverse && at->act_time == 0) || (at->reverse && at->act_time == playtime)) { + for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { + at->anim_dsc[i].is_started = 0; + at->anim_dsc[i].is_completed = 0; + } + } + + /*Apply the delay only if playing from any ends*/ + uint32_t delay = 0; + if(!at->reverse && at->act_time == 0) delay = at->delay; + else if(at->reverse && at->act_time == playtime) delay = at->delay; + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, at); + lv_anim_set_exec_cb(&a, anim_timeline_exec_cb); + lv_anim_set_values(&a, start, end); + lv_anim_set_duration(&a, duration); + lv_anim_set_delay(&a, delay); + lv_anim_set_path_cb(&a, anim_timeline_path_cb); + lv_anim_set_repeat_count(&a, repeat); + lv_anim_set_repeat_delay(&a, repeat_delay); + lv_anim_start(&a); + return playtime; +} + +void lv_anim_timeline_pause(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + lv_anim_delete(at, anim_timeline_exec_cb); +} + +void lv_anim_timeline_set_reverse(lv_anim_timeline_t * at, bool reverse) +{ + LV_ASSERT_NULL(at); + at->reverse = reverse; +} + +void lv_anim_timeline_set_delay(lv_anim_timeline_t * at, uint32_t delay) +{ + LV_ASSERT_NULL(at); + at->delay = delay; +} + +void lv_anim_timeline_set_repeat_count(lv_anim_timeline_t * at, uint32_t cnt) +{ + LV_ASSERT_NULL(at); + at->repeat_count = cnt; +} + +void lv_anim_timeline_set_repeat_delay(lv_anim_timeline_t * at, uint32_t delay) +{ + LV_ASSERT_NULL(at); + at->repeat_delay = delay; +} + +void lv_anim_timeline_set_progress(lv_anim_timeline_t * at, uint16_t progress) +{ + LV_ASSERT_NULL(at); + + uint32_t playtime = lv_anim_timeline_get_playtime(at); + uint32_t act_time = lv_map(progress, 0, LV_ANIM_TIMELINE_PROGRESS_MAX, 0, playtime); + anim_timeline_set_act_time(at, act_time); +} + +void lv_anim_timeline_set_user_data(lv_anim_timeline_t * at, void * user_data) +{ + LV_ASSERT_NULL(at); + at->user_data = user_data; +} + +uint32_t lv_anim_timeline_get_playtime(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + + uint32_t playtime = 0; + for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { + uint32_t end = lv_anim_get_playtime(&at->anim_dsc[i].anim); + if(end == LV_ANIM_PLAYTIME_INFINITE) + return end; + end += at->anim_dsc[i].start_time; + if(end > playtime) { + playtime = end; + } + } + + return playtime; +} + +bool lv_anim_timeline_get_reverse(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + return at->reverse; +} + + +uint32_t lv_anim_timeline_get_delay(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + return at->delay; +} + +uint16_t lv_anim_timeline_get_progress(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + uint32_t playtime = lv_anim_timeline_get_playtime(at); + return lv_map(at->act_time, 0, playtime, 0, LV_ANIM_TIMELINE_PROGRESS_MAX); +} + +uint32_t lv_anim_timeline_get_repeat_count(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + return at->repeat_count; +} + +uint32_t lv_anim_timeline_get_repeat_delay(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + return at->repeat_delay; +} + +void * lv_anim_timeline_get_user_data(lv_anim_timeline_t * at) +{ + LV_ASSERT_NULL(at); + return at->user_data; +} + +void lv_anim_timeline_merge(lv_anim_timeline_t * dest, const lv_anim_timeline_t * src, int32_t delay) +{ + uint32_t i; + for(i = 0; i < src->anim_dsc_cnt; i++) { + uint32_t anim_delay = src->anim_dsc[i].start_time + delay; + lv_anim_timeline_add(dest, anim_delay, &src->anim_dsc[i].anim); + } +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void anim_timeline_set_act_time(lv_anim_timeline_t * at, uint32_t act_time) +{ + at->act_time = act_time; + bool anim_timeline_is_started = (lv_anim_get(at, anim_timeline_exec_cb) != NULL); + for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { + lv_anim_timeline_dsc_t * anim_dsc = &(at->anim_dsc[i]); + lv_anim_t * a = &(anim_dsc->anim); + + uint32_t start_time = anim_dsc->start_time; + int32_t value = 0; + + if(act_time < start_time && a->early_apply) { + if(anim_timeline_is_started) { + if(at->reverse) { + if(!anim_dsc->is_started && a->start_cb) a->start_cb(a); + anim_dsc->is_started = 1; + } + else { + anim_dsc->is_started = 0; + } + } + + value = a->start_value; + exec_anim(a, value); + + if(anim_timeline_is_started) { + if(at->reverse) { + if(!anim_dsc->is_completed && a->completed_cb) a->completed_cb(a); + anim_dsc->is_completed = 1; + } + else { + anim_dsc->is_completed = 0; + } + } + } + else if(act_time >= start_time && act_time <= (start_time + a->duration)) { + if(anim_timeline_is_started) { + if(!anim_dsc->is_started && a->start_cb) a->start_cb(a); + anim_dsc->is_started = 1; + } + + a->act_time = act_time - start_time; + value = a->path_cb(a); + exec_anim(a, value); + + if(anim_timeline_is_started) { + if(at->reverse) { + if(act_time == start_time) { + if(!anim_dsc->is_completed && a->completed_cb) a->completed_cb(a); + anim_dsc->is_completed = 1; + } + else { + anim_dsc->is_completed = 0; + } + } + else { + if(act_time == (start_time + a->duration)) { + if(!anim_dsc->is_completed && a->completed_cb) a->completed_cb(a); + anim_dsc->is_completed = 1; + } + else { + anim_dsc->is_completed = 0; + } + } + } + } + else if(act_time > start_time + a->duration) { + if(anim_timeline_is_started) { + if(at->reverse) { + anim_dsc->is_started = 0; + } + else { + if(!anim_dsc->is_started && a->start_cb) a->start_cb(a); + anim_dsc->is_started = 1; + } + } + + value = a->end_value; + exec_anim(a, value); + + if(anim_timeline_is_started) { + if(at->reverse) { + anim_dsc->is_completed = 0; + } + else { + if(!anim_dsc->is_completed && a->completed_cb) a->completed_cb(a); + anim_dsc->is_completed = 1; + } + } + } + } +} + +static int32_t anim_timeline_path_cb(const lv_anim_t * a) +{ + /* Directly map original timestamps to avoid loss of accuracy */ + return lv_map(a->act_time, 0, a->duration, a->start_value, a->end_value); +} + +static void anim_timeline_exec_cb(void * var, int32_t v) +{ + lv_anim_timeline_t * at = var; + anim_timeline_set_act_time(at, v); +} + +static void exec_anim(lv_anim_t * a, int32_t v) +{ + + if(a->exec_cb) { + a->exec_cb(a->var, v); + } + if(a->custom_exec_cb) { + a->custom_exec_cb(a, v); + } +} diff --git a/inc/lvgl/src/misc/lv_anim_timeline.h b/inc/lvgl/src/misc/lv_anim_timeline.h new file mode 100644 index 0000000..941d315 --- /dev/null +++ b/inc/lvgl/src/misc/lv_anim_timeline.h @@ -0,0 +1,179 @@ +/** + * @file lv_anim_timeline.h + * + */ + +#ifndef LV_ANIM_TIMELINE_H +#define LV_ANIM_TIMELINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_anim.h" + +/********************* + * DEFINES + *********************/ + +#define LV_ANIM_TIMELINE_PROGRESS_MAX 0xFFFF + +/********************** + * TYPEDEFS + **********************/ + +/*Data of anim_timeline_dsc*/ +typedef struct _lv_anim_timeline_dsc_t { + lv_anim_t anim; + uint32_t start_time; + uint8_t is_started : 1; + uint8_t is_completed : 1; +} lv_anim_timeline_dsc_t; + + +/********************** +* GLOBAL PROTOTYPES +**********************/ + +/** + * Create an animation timeline. + * @return pointer to the animation timeline. + */ +lv_anim_timeline_t * lv_anim_timeline_create(void); + +/** + * Delete animation timeline. + * @param at pointer to the animation timeline. + */ +void lv_anim_timeline_delete(lv_anim_timeline_t * at); + +/** + * Add animation to the animation timeline. + * @param at pointer to the animation timeline. + * @param start_time the time the animation started on the timeline, note that start_time will override the value of delay. + * @param a pointer to an animation. + */ +void lv_anim_timeline_add(lv_anim_timeline_t * at, uint32_t start_time, const lv_anim_t * a); + +/** + * Start the animation timeline. + * @param at pointer to the animation timeline. + * @return total time spent in animation timeline. + */ +uint32_t lv_anim_timeline_start(lv_anim_timeline_t * at); + +/** + * Pause the animation timeline. + * @param at pointer to the animation timeline. + */ +void lv_anim_timeline_pause(lv_anim_timeline_t * at); + +/** + * Set the playback direction of the animation timeline. + * @param at pointer to the animation timeline. + * @param reverse whether to play in reverse. + */ +void lv_anim_timeline_set_reverse(lv_anim_timeline_t * at, bool reverse); + +/** + * Set the time to wait before starting the animation. + * Applies only when playing from the very start, or reverse from the very end. + * @param at pointer to an animation timeline + * @param delay the delay time in milliseconds + */ +void lv_anim_timeline_set_delay(lv_anim_timeline_t * at, uint32_t delay); + +/** + * Make the animation timeline repeat itself. + * @param at pointer to the animation timeline. + * @param cnt repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition. + */ +void lv_anim_timeline_set_repeat_count(lv_anim_timeline_t * at, uint32_t cnt); + +/** + * Set a delay before repeating the animation timeline. + * @param at pointer to the animation timeline. + * @param delay delay in milliseconds before repeating the animation timeline. + */ +void lv_anim_timeline_set_repeat_delay(lv_anim_timeline_t * at, uint32_t delay); + +/** + * Set the progress of the animation timeline. + * @param at pointer to the animation timeline. + * @param progress set value 0~65535 to map 0~100% animation progress. + */ +void lv_anim_timeline_set_progress(lv_anim_timeline_t * at, uint16_t progress); + +/** + * Set the user_data of a an animation timeline + * @param at pointer to the animation timeline. + * @param user_data pointer to any data. Only the pointer will be saved. + */ +void lv_anim_timeline_set_user_data(lv_anim_timeline_t * at, void * user_data); + +/** + * Get the time used to play the animation timeline. + * @param at pointer to the animation timeline. + * @return total time spent in animation timeline. + */ +uint32_t lv_anim_timeline_get_playtime(lv_anim_timeline_t * at); + +/** + * Get whether the animation timeline is played in reverse. + * @param at pointer to the animation timeline. + * @return return true if it is reverse playback. + */ +bool lv_anim_timeline_get_reverse(lv_anim_timeline_t * at); + +/** + * Get the wait time when playing from the very start, or reverse from the very end. + * @param at pointer to an animation timeline + * @return the remaining time in milliseconds + */ +uint32_t lv_anim_timeline_get_delay(lv_anim_timeline_t * at); + +/** + * Get the progress of the animation timeline. + * @param at pointer to the animation timeline. + * @return return value 0~65535 to map 0~100% animation progress. + */ +uint16_t lv_anim_timeline_get_progress(lv_anim_timeline_t * at); + +/** + * Get repeat count of the animation timeline. + * @param at pointer to the animation timeline. + */ +uint32_t lv_anim_timeline_get_repeat_count(lv_anim_timeline_t * at); + +/** + * Get repeat delay of the animation timeline. + * @param at pointer to the animation timeline. + */ +uint32_t lv_anim_timeline_get_repeat_delay(lv_anim_timeline_t * at); + +/** + * Get the user_data of a an animation timeline + * @param at pointer to the animation timeline. + */ +void * lv_anim_timeline_get_user_data(lv_anim_timeline_t * at); + +/** + * Merge (add) all animations of a timeline to another + * @param dest merge animation into this timeline + * @param src merge the animations of this timeline + * @param delay add the animations with this extra delay + */ +void lv_anim_timeline_merge(lv_anim_timeline_t * dest, const lv_anim_timeline_t * src, int32_t delay); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIM_TIMELINE_H*/ diff --git a/inc/lvgl/src/misc/lv_anim_timeline_private.h b/inc/lvgl/src/misc/lv_anim_timeline_private.h new file mode 100644 index 0000000..cf94bae --- /dev/null +++ b/inc/lvgl/src/misc/lv_anim_timeline_private.h @@ -0,0 +1,67 @@ +/** + * @file lv_anim_timeline_private.h + * + */ + +#ifndef LV_ANIM_TIMELINE_PRIVATE_H +#define LV_ANIM_TIMELINE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_anim_timeline.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_anim_timeline_dsc_t; + +/*Data of anim_timeline*/ +struct _lv_anim_timeline_t { + /** Dynamically allocated anim dsc array*/ + struct _lv_anim_timeline_dsc_t * anim_dsc; + + /** The length of anim dsc array*/ + uint32_t anim_dsc_cnt; + + /** Current time of the animation*/ + uint32_t act_time; + + /** Reverse playback*/ + bool reverse; + + /** Delay before starting the animation from any ends*/ + uint32_t delay; + + /** Repeat count*/ + uint32_t repeat_count; + + /** Wait before repeat*/ + uint32_t repeat_delay; + + /** For any custom data*/ + void * user_data; +}; + +/********************** +* GLOBAL PROTOTYPES +**********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIM_TIMELINE_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_area.c b/inc/lvgl/src/misc/lv_area.c new file mode 100644 index 0000000..34743e8 --- /dev/null +++ b/inc/lvgl/src/misc/lv_area.c @@ -0,0 +1,603 @@ +/** + * @file lv_area.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../core/lv_global.h" + +#include "lv_area_private.h" +#include "lv_math.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool lv_point_within_circle(const lv_area_t * area, const lv_point_t * p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_area_set(lv_area_t * area_p, int32_t x1, int32_t y1, int32_t x2, int32_t y2) +{ + area_p->x1 = x1; + area_p->y1 = y1; + area_p->x2 = x2; + area_p->y2 = y2; +} + +void lv_area_set_width(lv_area_t * area_p, int32_t w) +{ + area_p->x2 = area_p->x1 + w - 1; +} + +void lv_area_set_height(lv_area_t * area_p, int32_t h) +{ + area_p->y2 = area_p->y1 + h - 1; +} + +void lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y) +{ + int32_t w = lv_area_get_width(area_p); + int32_t h = lv_area_get_height(area_p); + area_p->x1 = x; + area_p->y1 = y; + lv_area_set_width(area_p, w); + lv_area_set_height(area_p, h); +} + +uint32_t lv_area_get_size(const lv_area_t * area_p) +{ + uint32_t size; + + size = (uint32_t)(area_p->x2 - area_p->x1 + 1) * (area_p->y2 - area_p->y1 + 1); + + return size; +} + +void lv_area_increase(lv_area_t * area, int32_t w_extra, int32_t h_extra) +{ + area->x1 -= w_extra; + area->x2 += w_extra; + area->y1 -= h_extra; + area->y2 += h_extra; +} + +void lv_area_move(lv_area_t * area, int32_t x_ofs, int32_t y_ofs) +{ + area->x1 += x_ofs; + area->x2 += x_ofs; + area->y1 += y_ofs; + area->y2 += y_ofs; +} + +bool lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + /*Get the smaller area from 'a1_p' and 'a2_p'*/ + res_p->x1 = LV_MAX(a1_p->x1, a2_p->x1); + res_p->y1 = LV_MAX(a1_p->y1, a2_p->y1); + res_p->x2 = LV_MIN(a1_p->x2, a2_p->x2); + res_p->y2 = LV_MIN(a1_p->y2, a2_p->y2); + + /*If x1 or y1 greater than x2 or y2 then the areas union is empty*/ + bool union_ok = true; + if((res_p->x1 > res_p->x2) || (res_p->y1 > res_p->y2)) { + union_ok = false; + } + + return union_ok; +} + +int8_t lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + /*Areas have no common parts*/ + if(!lv_area_is_on(a1_p, a2_p)) return -1; + + /*No remaining areas after removing common parts*/ + if(lv_area_is_in(a1_p, a2_p, 0)) return 0; + + /*Result counter*/ + int8_t res_c = 0; + + /*Get required information*/ + lv_area_t n; + int32_t a1_w = lv_area_get_width(a1_p) - 1; + int32_t a1_h = lv_area_get_height(a1_p) - 1; + + /*Compute top rectangle*/ + int32_t th = a2_p->y1 - a1_p->y1; + if(th > 0) { + n.x1 = a1_p->x1; + n.y1 = a1_p->y1; + n.x2 = a1_p->x2; + n.y2 = a1_p->y1 + th - 1; + res_p[res_c++] = n; + } + + /*Compute the bottom rectangle*/ + int32_t bh = a1_h - (a2_p->y2 - a1_p->y1); + if(bh > 0 && a2_p->y2 < a1_p->y2) { + n.x1 = a1_p->x1; + n.y1 = a2_p->y2 + 1; + n.x2 = a1_p->x2; + n.y2 = a2_p->y2 + bh; + res_p[res_c++] = n; + } + + /*Compute side height*/ + int32_t y1 = a2_p->y1 > a1_p->y1 ? a2_p->y1 : a1_p->y1; + int32_t y2 = a2_p->y2 < a1_p->y2 ? a2_p->y2 : a1_p->y2; + int32_t sh = y2 - y1; + + /*Compute the left rectangle*/ + int32_t lw = a2_p->x1 - a1_p->x1; + if(lw > 0 && sh >= 0) { + n.x1 = a1_p->x1; + n.y1 = y1; + n.x2 = a1_p->x1 + lw - 1; + n.y2 = y1 + sh; + res_p[res_c++] = n; + } + + /*Compute the right rectangle*/ + int32_t rw = a1_w - (a2_p->x2 - a1_p->x1); + if(rw > 0 && sh >= 0) { + n.x1 = a2_p->x2 + 1; + n.y1 = y1; + n.x2 = a2_p->x2 + rw; + n.y2 = y1 + sh; + res_p[res_c++] = n; + } + + //Return number of results + return res_c; +} + +void lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + a_res_p->x1 = LV_MIN(a1_p->x1, a2_p->x1); + a_res_p->y1 = LV_MIN(a1_p->y1, a2_p->y1); + a_res_p->x2 = LV_MAX(a1_p->x2, a2_p->x2); + a_res_p->y2 = LV_MAX(a1_p->y2, a2_p->y2); +} + +bool lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius) +{ + /*First check the basic area*/ + bool is_on_rect = false; + if((p_p->x >= a_p->x1 && p_p->x <= a_p->x2) && ((p_p->y >= a_p->y1 && p_p->y <= a_p->y2))) { + is_on_rect = true; + } + if(!is_on_rect) + return false; + /*Now handle potential rounded rectangles*/ + if(radius <= 0) { + /*No radius, it is within the rectangle*/ + return true; + } + int32_t w = lv_area_get_width(a_p) / 2; + int32_t h = lv_area_get_height(a_p) / 2; + int32_t max_radius = LV_MIN(w, h); + if(radius > max_radius) + radius = max_radius; + + /*Check if it's in one of the corners*/ + lv_area_t corner_area; + /*Top left*/ + corner_area.x1 = a_p->x1; + corner_area.x2 = a_p->x1 + radius; + corner_area.y1 = a_p->y1; + corner_area.y2 = a_p->y1 + radius; + if(lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x2 += radius; + corner_area.y2 += radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Bottom left*/ + corner_area.y1 = a_p->y2 - radius; + corner_area.y2 = a_p->y2; + if(lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x2 += radius; + corner_area.y1 -= radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Bottom right*/ + corner_area.x1 = a_p->x2 - radius; + corner_area.x2 = a_p->x2; + if(lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x1 -= radius; + corner_area.y1 -= radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Top right*/ + corner_area.y1 = a_p->y1; + corner_area.y2 = a_p->y1 + radius; + if(lv_area_is_point_on(&corner_area, p_p, 0)) { + corner_area.x1 -= radius; + corner_area.y2 += radius; + return lv_point_within_circle(&corner_area, p_p); + } + /*Not within corners*/ + return true; +} + +bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p) +{ + if((a1_p->x1 <= a2_p->x2) && (a1_p->x2 >= a2_p->x1) && (a1_p->y1 <= a2_p->y2) && (a1_p->y2 >= a2_p->y1)) { + return true; + } + else { + return false; + } +} + +bool lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius) +{ + bool is_in = false; + + if(ain_p->x1 >= aholder_p->x1 && ain_p->y1 >= aholder_p->y1 && ain_p->x2 <= aholder_p->x2 && + ain_p->y2 <= aholder_p->y2) { + is_in = true; + } + + if(!is_in) return false; + if(radius == 0) return true; + + /*Check if the corner points are inside the radius or not*/ + lv_point_t p; + + lv_point_set(&p, ain_p->x1, ain_p->y1); + if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + lv_point_set(&p, ain_p->x2, ain_p->y1); + if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + lv_point_set(&p, ain_p->x1, ain_p->y2); + if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + lv_point_set(&p, ain_p->x2, ain_p->y2); + if(lv_area_is_point_on(aholder_p, &p, radius) == false) return false; + + return true; +} + +bool lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius) +{ + if(aout_p->x2 < aholder_p->x1 || aout_p->y2 < aholder_p->y1 || aout_p->x1 > aholder_p->x2 || + aout_p->y1 > aholder_p->y2) { + return true; + } + + if(radius == 0) return false; + + /*Check if the corner points are outside the radius or not*/ + lv_point_t p; + + lv_point_set(&p, aout_p->x1, aout_p->y1); + if(lv_area_is_point_on(aholder_p, &p, radius)) return false; + + lv_point_set(&p, aout_p->x2, aout_p->y1); + if(lv_area_is_point_on(aholder_p, &p, radius)) return false; + + lv_point_set(&p, aout_p->x1, aout_p->y2); + if(lv_area_is_point_on(aholder_p, &p, radius)) return false; + + lv_point_set(&p, aout_p->x2, aout_p->y2); + if(lv_area_is_point_on(aholder_p, &p, radius)) return false; + + return true; +} + +bool lv_area_is_equal(const lv_area_t * a, const lv_area_t * b) +{ + return a->x1 == b->x1 && a->x2 == b->x2 && a->y1 == b->y1 && a->y2 == b->y2; +} + +void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, int32_t ofs_x, int32_t ofs_y) +{ + + int32_t x; + int32_t y; + switch(align) { + case LV_ALIGN_CENTER: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_TOP_LEFT: + x = 0; + y = 0; + break; + case LV_ALIGN_TOP_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = 0; + break; + + case LV_ALIGN_TOP_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = 0; + break; + + case LV_ALIGN_BOTTOM_LEFT: + x = 0; + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + case LV_ALIGN_BOTTOM_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + + case LV_ALIGN_BOTTOM_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + + case LV_ALIGN_LEFT_MID: + x = 0; + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_RIGHT_MID: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_OUT_TOP_LEFT: + x = 0; + y = -lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_TOP_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = -lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_TOP_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = -lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_BOTTOM_LEFT: + x = 0; + y = lv_area_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_MID: + x = lv_area_get_width(base) / 2 - lv_area_get_width(to_align) / 2; + y = lv_area_get_height(base); + break; + + case LV_ALIGN_OUT_BOTTOM_RIGHT: + x = lv_area_get_width(base) - lv_area_get_width(to_align); + y = lv_area_get_height(base); + break; + + case LV_ALIGN_OUT_LEFT_TOP: + x = -lv_area_get_width(to_align); + y = 0; + break; + + case LV_ALIGN_OUT_LEFT_MID: + x = -lv_area_get_width(to_align); + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_OUT_LEFT_BOTTOM: + x = -lv_area_get_width(to_align); + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + + case LV_ALIGN_OUT_RIGHT_TOP: + x = lv_area_get_width(base); + y = 0; + break; + + case LV_ALIGN_OUT_RIGHT_MID: + x = lv_area_get_width(base); + y = lv_area_get_height(base) / 2 - lv_area_get_height(to_align) / 2; + break; + + case LV_ALIGN_OUT_RIGHT_BOTTOM: + x = lv_area_get_width(base); + y = lv_area_get_height(base) - lv_area_get_height(to_align); + break; + default: + x = 0; + y = 0; + break; + } + + x += base->x1; + y += base->y1; + + int32_t w = lv_area_get_width(to_align); + int32_t h = lv_area_get_height(to_align); + to_align->x1 = x + ofs_x; + to_align->y1 = y + ofs_y; + to_align->x2 = to_align->x1 + w - 1; + to_align->y2 = to_align->y1 + h - 1; +} + +#define LV_TRANSFORM_TRIGO_SHIFT 10 + +void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, + bool zoom_first) +{ + lv_point_array_transform(point, 1, angle, scale_x, scale_y, pivot, zoom_first); +} + +void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t scale_x, int32_t scale_y, + const lv_point_t * pivot, + bool zoom_first) +{ + if(angle == 0 && scale_x == 256 && scale_y == 256) { + return; + } + uint32_t i; + for(i = 0; i < count; i++) { + points[i].x -= pivot->x; + points[i].y -= pivot->y; + + } + + if(angle == 0) { + for(i = 0; i < count; i++) { + points[i].x = (((int32_t)(points[i].x) * scale_x) >> 8) + pivot->x; + points[i].y = (((int32_t)(points[i].y) * scale_y) >> 8) + pivot->y; + } + return; + } + + int32_t angle_limited = angle; + if(angle_limited > 3600) angle_limited -= 3600; + if(angle_limited < 0) angle_limited += 3600; + + int32_t angle_low = angle_limited / 10; + int32_t angle_high = angle_low + 1; + int32_t angle_rem = angle_limited - (angle_low * 10); + + int32_t s1 = lv_trigo_sin(angle_low); + int32_t s2 = lv_trigo_sin(angle_high); + + int32_t c1 = lv_trigo_sin(angle_low + 90); + int32_t c2 = lv_trigo_sin(angle_high + 90); + + int32_t sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10; + sinma = sinma >> (LV_TRIGO_SHIFT - LV_TRANSFORM_TRIGO_SHIFT); + int32_t cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10; + cosma = cosma >> (LV_TRIGO_SHIFT - LV_TRANSFORM_TRIGO_SHIFT); + + for(i = 0; i < count; i++) { + int32_t x = points[i].x; + int32_t y = points[i].y; + if(scale_x == 256 && scale_y == 256) { + points[i].x = ((cosma * x - sinma * y) >> LV_TRANSFORM_TRIGO_SHIFT) + pivot->x; + points[i].y = ((sinma * x + cosma * y) >> LV_TRANSFORM_TRIGO_SHIFT) + pivot->y; + } + else { + if(zoom_first) { + x *= scale_x; + y *= scale_y; + points[i].x = (((cosma * x - sinma * y)) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; + points[i].y = (((sinma * x + cosma * y)) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; + } + else { + points[i].x = (((cosma * x - sinma * y) * scale_x) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x; + points[i].y = (((sinma * x + cosma * y) * scale_y) >> (LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y; + } + } + } +} + +int32_t lv_area_get_width(const lv_area_t * area_p) +{ + return (int32_t)(area_p->x2 - area_p->x1 + 1); +} + +int32_t lv_area_get_height(const lv_area_t * area_p) +{ + return (int32_t)(area_p->y2 - area_p->y1 + 1); +} + +lv_point_t lv_point_from_precise(const lv_point_precise_t * p) +{ + lv_point_t point = { + (int32_t)p->x, (int32_t)p->y + }; + + return point; +} + +lv_point_precise_t lv_point_to_precise(const lv_point_t * p) +{ + lv_point_precise_t point = { + (lv_value_precise_t)p->x, (lv_value_precise_t)p->y + }; + + return point; +} + +void lv_point_set(lv_point_t * p, int32_t x, int32_t y) +{ + p->x = x; + p->y = y; +} + +void lv_point_precise_set(lv_point_precise_t * p, lv_value_precise_t x, lv_value_precise_t y) +{ + p->x = x; + p->y = y; +} + +void lv_point_swap(lv_point_t * p1, lv_point_t * p2) +{ + lv_point_t tmp = *p1; + *p1 = *p2; + *p2 = tmp; +} + +void lv_point_precise_swap(lv_point_precise_t * p1, lv_point_precise_t * p2) +{ + lv_point_precise_t tmp = *p1; + *p1 = *p2; + *p2 = tmp; +} + +int32_t lv_pct(int32_t x) +{ + return LV_PCT(x); +} + +int32_t lv_pct_to_px(int32_t v, int32_t base) +{ + if(LV_COORD_IS_PCT(v)) { + return (LV_COORD_GET_PCT(v) * base) / 100; + } + + return v; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool lv_point_within_circle(const lv_area_t * area, const lv_point_t * p) +{ + int32_t r = (area->x2 - area->x1) / 2; + + /*Circle center*/ + int32_t cx = area->x1 + r; + int32_t cy = area->y1 + r; + + /*Simplify the code by moving everything to (0, 0)*/ + int32_t px = p->x - cx; + int32_t py = p->y - cy; + + uint32_t r_sqrd = r * r; + uint32_t dist = (px * px) + (py * py); + + if(dist <= r_sqrd) + return true; + else + return false; +} diff --git a/inc/lvgl/src/misc/lv_area.h b/inc/lvgl/src/misc/lv_area.h new file mode 100644 index 0000000..0798c74 --- /dev/null +++ b/inc/lvgl/src/misc/lv_area.h @@ -0,0 +1,254 @@ +/** + * @file lv_area.h + * + */ + +#ifndef LV_AREA_H +#define LV_AREA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_types.h" +#include "lv_math.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Represents a point on the screen. + */ +typedef struct { + int32_t x; + int32_t y; +} lv_point_t; + +typedef struct { + lv_value_precise_t x; + lv_value_precise_t y; +} lv_point_precise_t; + +/** Represents an area of the screen.*/ +typedef struct { + int32_t x1; + int32_t y1; + int32_t x2; + int32_t y2; +} lv_area_t; + +/** Alignments*/ + +typedef enum { + LV_ALIGN_DEFAULT = 0, + LV_ALIGN_TOP_LEFT, + LV_ALIGN_TOP_MID, + LV_ALIGN_TOP_RIGHT, + LV_ALIGN_BOTTOM_LEFT, + LV_ALIGN_BOTTOM_MID, + LV_ALIGN_BOTTOM_RIGHT, + LV_ALIGN_LEFT_MID, + LV_ALIGN_RIGHT_MID, + LV_ALIGN_CENTER, + + LV_ALIGN_OUT_TOP_LEFT, + LV_ALIGN_OUT_TOP_MID, + LV_ALIGN_OUT_TOP_RIGHT, + LV_ALIGN_OUT_BOTTOM_LEFT, + LV_ALIGN_OUT_BOTTOM_MID, + LV_ALIGN_OUT_BOTTOM_RIGHT, + LV_ALIGN_OUT_LEFT_TOP, + LV_ALIGN_OUT_LEFT_MID, + LV_ALIGN_OUT_LEFT_BOTTOM, + LV_ALIGN_OUT_RIGHT_TOP, + LV_ALIGN_OUT_RIGHT_MID, + LV_ALIGN_OUT_RIGHT_BOTTOM, +} lv_align_t; + +typedef enum { + LV_DIR_NONE = 0x00, + LV_DIR_LEFT = (1 << 0), + LV_DIR_RIGHT = (1 << 1), + LV_DIR_TOP = (1 << 2), + LV_DIR_BOTTOM = (1 << 3), + LV_DIR_HOR = LV_DIR_LEFT | LV_DIR_RIGHT, + LV_DIR_VER = LV_DIR_TOP | LV_DIR_BOTTOM, + LV_DIR_ALL = LV_DIR_HOR | LV_DIR_VER, +} lv_dir_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize an area + * @param area_p pointer to an area + * @param x1 left coordinate of the area + * @param y1 top coordinate of the area + * @param x2 right coordinate of the area + * @param y2 bottom coordinate of the area + */ +void lv_area_set(lv_area_t * area_p, int32_t x1, int32_t y1, int32_t x2, int32_t y2); + +/** + * Copy an area + * @param dest pointer to the destination area + * @param src pointer to the source area + */ +inline static void lv_area_copy(lv_area_t * dest, const lv_area_t * src) +{ + dest->x1 = src->x1; + dest->y1 = src->y1; + dest->x2 = src->x2; + dest->y2 = src->y2; +} + +/** + * Get the width of an area + * @param area_p pointer to an area + * @return the width of the area (if x1 == x2 -> width = 1) + */ +int32_t lv_area_get_width(const lv_area_t * area_p); + +/** + * Get the height of an area + * @param area_p pointer to an area + * @return the height of the area (if y1 == y2 -> height = 1) + */ +int32_t lv_area_get_height(const lv_area_t * area_p); + +/** + * Set the width of an area + * @param area_p pointer to an area + * @param w the new width of the area (w == 1 makes x1 == x2) + */ +void lv_area_set_width(lv_area_t * area_p, int32_t w); + +/** + * Set the height of an area + * @param area_p pointer to an area + * @param h the new height of the area (h == 1 makes y1 == y2) + */ +void lv_area_set_height(lv_area_t * area_p, int32_t h); + +/** + * Return with area of an area (x * y) + * @param area_p pointer to an area + * @return size of area + */ +uint32_t lv_area_get_size(const lv_area_t * area_p); + +void lv_area_increase(lv_area_t * area, int32_t w_extra, int32_t h_extra); + +void lv_area_move(lv_area_t * area, int32_t x_ofs, int32_t y_ofs); + +/** + * Align an area to another + * @param base an area where the other will be aligned + * @param to_align the area to align + * @param align `LV_ALIGN_...` + * @param ofs_x X offset + * @param ofs_y Y offset + */ +void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, int32_t ofs_x, int32_t ofs_y); + +/** + * Transform a point + * @param point pointer to a point + * @param angle angle with 0.1 resolutions (123 means 12.3°) + * @param scale_x horizontal zoom, 256 means 100% + * @param scale_y vertical zoom, 256 means 100% + * @param pivot pointer to the pivot point of the transformation + * @param zoom_first true: zoom first and rotate after that; else: opposite order + */ +void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, + bool zoom_first); + +/** + * Transform an array of points + * @param points pointer to an array of points + * @param count number of points in the array + * @param angle angle with 0.1 resolutions (123 means 12.3°) + * @param scale_x horizontal zoom, 256 means 100% + * @param scale_y vertical zoom, 256 means 100% + * @param pivot pointer to the pivot point of the transformation + * @param zoom_first true: zoom first and rotate after that; else: opposite order + */ +void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t scale_x, int32_t scale_y, + const lv_point_t * pivot, + bool zoom_first); + +lv_point_t lv_point_from_precise(const lv_point_precise_t * p); + +lv_point_precise_t lv_point_to_precise(const lv_point_t * p); + +void lv_point_set(lv_point_t * p, int32_t x, int32_t y); + +void lv_point_precise_set(lv_point_precise_t * p, lv_value_precise_t x, lv_value_precise_t y); + +void lv_point_swap(lv_point_t * p1, lv_point_t * p2); + +void lv_point_precise_swap(lv_point_precise_t * p1, lv_point_precise_t * p2); + +/********************** + * MACROS + **********************/ + +#define LV_COORD_TYPE_SHIFT (29U) + +#define LV_COORD_TYPE_MASK (3 << LV_COORD_TYPE_SHIFT) +#define LV_COORD_TYPE(x) ((x) & LV_COORD_TYPE_MASK) /*Extract type specifiers*/ +#define LV_COORD_PLAIN(x) ((x) & ~LV_COORD_TYPE_MASK) /*Remove type specifiers*/ + +#define LV_COORD_TYPE_PX (0 << LV_COORD_TYPE_SHIFT) +#define LV_COORD_TYPE_SPEC (1 << LV_COORD_TYPE_SHIFT) +#define LV_COORD_TYPE_PX_NEG (3 << LV_COORD_TYPE_SHIFT) + +#define LV_COORD_IS_PX(x) (LV_COORD_TYPE(x) == LV_COORD_TYPE_PX || LV_COORD_TYPE(x) == LV_COORD_TYPE_PX_NEG) +#define LV_COORD_IS_SPEC(x) (LV_COORD_TYPE(x) == LV_COORD_TYPE_SPEC) + +#define LV_COORD_SET_SPEC(x) ((x) | LV_COORD_TYPE_SPEC) + +/** Max coordinate value */ +#define LV_COORD_MAX ((1 << LV_COORD_TYPE_SHIFT) - 1) +#define LV_COORD_MIN (-LV_COORD_MAX) + +/*Special coordinates*/ +#define LV_SIZE_CONTENT LV_COORD_SET_SPEC(LV_COORD_MAX) +#define LV_PCT_STORED_MAX (LV_COORD_MAX - 1) +#if LV_PCT_STORED_MAX % 2 != 0 +#error LV_PCT_STORED_MAX should be an even number +#endif +#define LV_PCT_POS_MAX (LV_PCT_STORED_MAX / 2) +#define LV_PCT(x) (LV_COORD_SET_SPEC(((x) < 0 ? (LV_PCT_POS_MAX - LV_MAX((x), -LV_PCT_POS_MAX)) : LV_MIN((x), LV_PCT_POS_MAX)))) +#define LV_COORD_IS_PCT(x) ((LV_COORD_IS_SPEC(x) && LV_COORD_PLAIN(x) <= LV_PCT_STORED_MAX)) +#define LV_COORD_GET_PCT(x) (LV_COORD_PLAIN(x) > LV_PCT_POS_MAX ? LV_PCT_POS_MAX - LV_COORD_PLAIN(x) : LV_COORD_PLAIN(x)) + +LV_EXPORT_CONST_INT(LV_COORD_MAX); +LV_EXPORT_CONST_INT(LV_COORD_MIN); +LV_EXPORT_CONST_INT(LV_SIZE_CONTENT); + +/** + * Convert a percentage value to `int32_t`. + * Percentage values are stored in special range + * @param x the percentage (0..1000) + * @return a coordinate that stores the percentage + */ +int32_t lv_pct(int32_t x); + +int32_t lv_pct_to_px(int32_t v, int32_t base); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/inc/lvgl/src/misc/lv_area_private.h b/inc/lvgl/src/misc/lv_area_private.h new file mode 100644 index 0000000..bebca59 --- /dev/null +++ b/inc/lvgl/src/misc/lv_area_private.h @@ -0,0 +1,115 @@ +/** + * @file lv_area_private.h + * + */ + +#ifndef LV_AREA_PRIVATE_H +#define LV_AREA_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Set the position of an area (width and height will be kept) + * @param area_p pointer to an area + * @param x the new x coordinate of the area + * @param y the new y coordinate of the area + */ +void lv_area_set_pos(lv_area_t * area_p, int32_t x, int32_t y); + +/** + * Get the common parts of two areas + * @param res_p pointer to an area, the result will be stored her + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return false: the two area has NO common parts, res_p is invalid + */ +bool lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Get resulting sub areas after removing the common parts of two areas from the first area + * @param res_p pointer to an array of areas with a count of 4, the resulting areas will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + * @return number of results (max 4) or -1 if no intersect + */ +int8_t lv_area_diff(lv_area_t res_p[], const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Join two areas into a third which involves the other two + * @param a_res_p pointer to an area, the result will be stored here + * @param a1_p pointer to the first area + * @param a2_p pointer to the second area + */ +void lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Check if a point is on an area + * @param a_p pointer to an area + * @param p_p pointer to a point + * @param radius radius of area (e.g. for rounded rectangle) + * @return false:the point is out of the area + */ +bool lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, int32_t radius); + +/** + * Check if two area has common parts + * @param a1_p pointer to an area. + * @param a2_p pointer to another area + * @return false: a1_p and a2_p has no common parts + */ +bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); + +/** + * Check if an area is fully on another + * @param ain_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `ain_p` is fully inside `aholder_p` + */ +bool lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, int32_t radius); + +/** + * Check if an area is fully out of another + * @param aout_p pointer to an area which could be in 'aholder_p' + * @param aholder_p pointer to an area which could involve 'ain_p' + * @param radius radius of `aholder_p` (e.g. for rounded rectangle) + * @return true: `aout_p` is fully outside `aholder_p` + */ +bool lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, int32_t radius); + +/** + * Check if 2 area is the same + * @param a pointer to an area + * @param b pointer to another area + */ +bool lv_area_is_equal(const lv_area_t * a, const lv_area_t * b); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_AREA_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_array.c b/inc/lvgl/src/misc/lv_array.c new file mode 100644 index 0000000..f41a35c --- /dev/null +++ b/inc/lvgl/src/misc/lv_array.c @@ -0,0 +1,249 @@ +/** + * @file lv_array.c + * Array. + * The nodes are dynamically allocated by the 'lv_mem' module, + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_array.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +#include "lv_assert.h" +#include "lv_types.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_array_init(lv_array_t * array, uint32_t capacity, uint32_t element_size) +{ + array->size = 0; + array->capacity = capacity; + array->element_size = element_size; + + array->data = lv_malloc(capacity * element_size); + array->inner_alloc = true; + LV_ASSERT_MALLOC(array->data); +} + +void lv_array_init_from_buf(lv_array_t * array, void * buf, uint32_t capacity, uint32_t element_size) +{ + LV_ASSERT_NULL(buf); + array->size = 0; + array->capacity = capacity; + array->element_size = element_size; + + array->data = buf; + array->inner_alloc = false; +} + +void lv_array_deinit(lv_array_t * array) +{ + if(array->data) { + if(array->inner_alloc) lv_free(array->data); + array->data = NULL; + } + + array->size = 0; + array->capacity = 0; +} + +void lv_array_copy(lv_array_t * target, const lv_array_t * source) +{ + if(lv_array_is_empty(source)) { + return; + } + lv_array_deinit(target); + lv_array_init(target, source->capacity, source->element_size); + lv_memcpy(target->data, source->data, source->size * source->element_size); + target->size = source->size; +} + +void lv_array_shrink(lv_array_t * array) +{ + if(array->size <= array->capacity / LV_ARRAY_DEFAULT_SHRINK_RATIO) { + lv_array_resize(array, array->size); + } +} + +lv_result_t lv_array_remove(lv_array_t * array, uint32_t index) +{ + if(!array) { + return LV_RESULT_INVALID; + } + + if(index >= array->size) { + return LV_RESULT_INVALID; + } + + /*Shortcut*/ + if(index == array->size - 1) { + array->size--; + lv_array_shrink(array); + return LV_RESULT_OK; + } + + uint8_t * start = lv_array_at(array, index); + uint8_t * remaining = start + array->element_size; + uint32_t remaining_size = (array->size - index - 1) * array->element_size; + lv_memmove(start, remaining, remaining_size); + array->size--; + lv_array_shrink(array); + return LV_RESULT_OK; +} + +lv_result_t lv_array_remove_unordered(lv_array_t * array, uint32_t index) +{ + if(!array) { + return LV_RESULT_INVALID; + } + + if(index >= array->size) { + return LV_RESULT_INVALID; + } + + /*Shortcut*/ + if(index == array->size - 1) { + array->size--; + lv_array_shrink(array); + return LV_RESULT_OK; + } + + /* Copy the last element into the position to remove*/ + uint8_t * dst = lv_array_at(array, index); + uint8_t * src = lv_array_at(array, array->size - 1); + + lv_memcpy(dst, src, array->element_size); + array->size--; + lv_array_shrink(array); + return LV_RESULT_OK; +} + +lv_result_t lv_array_erase(lv_array_t * array, uint32_t start, uint32_t end) +{ + if(end > array->size) { + end = array->size; + } + + if(start >= end) { + return LV_RESULT_INVALID; + } + + /*Shortcut*/ + if(end == array->size) { + array->size = start; + lv_array_shrink(array); + return LV_RESULT_OK; + } + + uint8_t * start_p = lv_array_at(array, start); + uint8_t * remaining = start_p + (end - start) * array->element_size; + uint32_t remaining_size = (array->size - end) * array->element_size; + lv_memmove(start_p, remaining, remaining_size); + array->size -= (end - start); + lv_array_shrink(array); + return LV_RESULT_OK; +} + +bool lv_array_resize(lv_array_t * array, uint32_t new_capacity) +{ + if(array->inner_alloc == false) { + LV_LOG_WARN("Cannot resize array with external buffer"); + return false; + } + + uint8_t * data = lv_realloc(array->data, new_capacity * array->element_size); + LV_ASSERT_NULL(data); + + if(data == NULL) return false; + + array->data = data; + array->capacity = new_capacity; + if(array->size > new_capacity) { + array->size = new_capacity; + } + return true; +} + +lv_result_t lv_array_concat(lv_array_t * array, const lv_array_t * other) +{ + LV_ASSERT_NULL(array->data); + uint32_t size = other->size; + if(array->size + size > array->capacity) { + /*array is full*/ + if(lv_array_resize(array, array->size + size) == false) { + return LV_RESULT_INVALID; + } + } + + uint8_t * data = array->data + array->size * array->element_size; + lv_memcpy(data, other->data, array->element_size * size); + array->size += size; + return LV_RESULT_OK; +} + +lv_result_t lv_array_push_back(lv_array_t * array, const void * element) +{ + LV_ASSERT_NULL(array->data); + + if(array->size == array->capacity) { + /*array is full*/ + if(lv_array_resize(array, array->capacity + LV_ARRAY_DEFAULT_CAPACITY) == false) { + return LV_RESULT_INVALID; + } + } + + /** + * When the element is NULL, it means that the user wants to add an empty element. + */ + uint8_t * data = array->data + array->size * array->element_size; + if(element) lv_memcpy(data, element, array->element_size); + else lv_memzero(data, array->element_size); + + array->size++; + return LV_RESULT_OK; +} + +void * lv_array_at(const lv_array_t * array, uint32_t index) +{ + if(index >= array->size) { + return NULL; + } + + LV_ASSERT_NULL(array->data); + return array->data + index * array->element_size; +} + +lv_result_t lv_array_assign(lv_array_t * array, uint32_t index, const void * value) +{ + uint8_t * data = lv_array_at(array, index); + if(data == NULL) return LV_RESULT_INVALID; + + lv_memcpy(data, value, array->element_size); + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/misc/lv_array.h b/inc/lvgl/src/misc/lv_array.h new file mode 100644 index 0000000..3559e20 --- /dev/null +++ b/inc/lvgl/src/misc/lv_array.h @@ -0,0 +1,240 @@ +/** + * @file lv_array.h + * Array. The elements are dynamically allocated by the 'lv_mem' module. + */ + +#ifndef LV_ARRAY_H +#define LV_ARRAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +#ifndef LV_ARRAY_DEFAULT_CAPACITY +#define LV_ARRAY_DEFAULT_CAPACITY 4 +#endif + +#ifndef LV_ARRAY_DEFAULT_SHRINK_RATIO +#define LV_ARRAY_DEFAULT_SHRINK_RATIO 2 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/** Description of a array*/ +struct _lv_array_t { + uint8_t * data; + uint32_t size; + uint32_t capacity; + uint32_t element_size; + + bool inner_alloc; /* true: data is allocated by the array; false: data is allocated by the user */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init an array. + * @param array pointer to an `lv_array_t` variable to initialize + * @param capacity the initial capacity of the array + * @param element_size the size of an element in bytes + */ +void lv_array_init(lv_array_t * array, uint32_t capacity, uint32_t element_size); + +/** + * Init an array from a buffer. + * @note The buffer must be large enough to store `capacity` elements. The array will not release the buffer and reallocate it. + * The user must ensure that the buffer is valid during the lifetime of the array. And release the buffer when the array is no longer needed. + * @param array pointer to an `lv_array_t` variable to initialize + * @param buf pointer to a buffer to use as the array's data + * @param capacity the initial capacity of the array + * @param element_size the size of an element in bytes + */ +void lv_array_init_from_buf(lv_array_t * array, void * buf, uint32_t capacity, uint32_t element_size); + +/** + * Resize the array to the given capacity. + * @note if the new capacity is smaller than the current size, the array will be truncated. + * @param array pointer to an `lv_array_t` variable + * @param new_capacity the new capacity of the array + */ +bool lv_array_resize(lv_array_t * array, uint32_t new_capacity); + +/** + * Deinit the array, and free the allocated memory + * @param array pointer to an `lv_array_t` variable to deinitialize + */ +void lv_array_deinit(lv_array_t * array); + +/** + * Return how many elements are stored in the array. + * @param array pointer to an `lv_array_t` variable + * @return the number of elements stored in the array + */ +static inline uint32_t lv_array_size(const lv_array_t * array) +{ + return array->size; +} + +/** + * Return the capacity of the array, i.e. how many elements can be stored. + * @param array pointer to an `lv_array_t` variable + * @return the capacity of the array + */ +static inline uint32_t lv_array_capacity(const lv_array_t * array) +{ + return array->capacity; +} + +/** + * Return if the array is empty + * @param array pointer to an `lv_array_t` variable + * @return true: array is empty; false: array is not empty + */ +static inline bool lv_array_is_empty(const lv_array_t * array) +{ + return array->size == 0; +} + +/** + * Return if the array is full + * @param array pointer to an `lv_array_t` variable + * @return true: array is full; false: array is not full + */ +static inline bool lv_array_is_full(const lv_array_t * array) +{ + return array->size == array->capacity; +} + +/** + * Copy an array to another. + * @note this will create a new array with the same capacity and size as the source array. + * @param target pointer to an `lv_array_t` variable to copy to + * @param source pointer to an `lv_array_t` variable to copy from + */ +void lv_array_copy(lv_array_t * target, const lv_array_t * source); + +/** + * Remove all elements in array. + * @param array pointer to an `lv_array_t` variable + */ +static inline void lv_array_clear(lv_array_t * array) +{ + array->size = 0; +} + +/** + * Shrink the memory capacity of array if necessary. + * @param array pointer to an `lv_array_t` variable + */ +void lv_array_shrink(lv_array_t * array); + +/** + * Remove the element at the specified position in the array. + * + * This function keeps the array order. Complexity is O(n) + * + * @param array pointer to an `lv_array_t` variable + * @param index the index of the element to remove + * @return LV_RESULT_OK: success, otherwise: error + */ +lv_result_t lv_array_remove(lv_array_t * array, uint32_t index); + +/** + * Remove the element at the specified position in the array. + * + * This function does not guarantee the array order. Complexity is O(1) + * + * @param array pointer to an `lv_array_t` variable + * @param index the index of the element to remove + * @return LV_RESULT_OK: success, otherwise: error + */ +lv_result_t lv_array_remove_unordered(lv_array_t * array, uint32_t index); + +/** + * Remove from the array either a single element or a range of elements ([start, end)). + * @note This effectively reduces the container size by the number of elements removed. + * @note When start equals to end, the function has no effect. + * @param array pointer to an `lv_array_t` variable + * @param start the index of the first element to be removed + * @param end the index of the first element that is not to be removed + * @return LV_RESULT_OK: success, otherwise: error + */ +lv_result_t lv_array_erase(lv_array_t * array, uint32_t start, uint32_t end); + +/** + * Concatenate two arrays. Adds new elements to the end of the array. + * @note The destination array is automatically expanded as necessary. + * @param array pointer to an `lv_array_t` variable + * @param other pointer to the array to concatenate + * @return LV_RESULT_OK: success, otherwise: error + */ +lv_result_t lv_array_concat(lv_array_t * array, const lv_array_t * other); + +/** + * Push back element. Adds a new element to the end of the array. + * If the array capacity is not enough for the new element, the array will be resized automatically. + * @note If the element is NULL, it will be added as an empty element. + * @param array pointer to an `lv_array_t` variable + * @param element pointer to the element to add. NULL to push an empty element. + * @return LV_RESULT_OK: success, otherwise: error + */ +lv_result_t lv_array_push_back(lv_array_t * array, const void * element); + +/** + * Assigns one content to the array, replacing its current content. + * @param array pointer to an `lv_array_t` variable + * @param index the index of the element to replace + * @param value pointer to the elements to add + * @return true: success; false: error + */ +lv_result_t lv_array_assign(lv_array_t * array, uint32_t index, const void * value); + +/** + * Returns a pointer to the element at position n in the array. + * @param array pointer to an `lv_array_t` variable + * @param index the index of the element to return + * @return a pointer to the requested element, NULL if `index` is out of range + */ +void * lv_array_at(const lv_array_t * array, uint32_t index); + +/** + * Returns a pointer to the first element in the array. + * @param array pointer to an `lv_array_t` variable + * @return a pointer to the first element in the array + */ +static inline void * lv_array_front(const lv_array_t * array) +{ + return lv_array_at(array, 0); +} + +/** + * Returns a pointer to the last element in the array. + * @param array pointer to an `lv_array_t` variable + */ +static inline void * lv_array_back(const lv_array_t * array) +{ + return lv_array_at(array, lv_array_size(array) - 1); +} + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/inc/lvgl/src/misc/lv_assert.h b/inc/lvgl/src/misc/lv_assert.h new file mode 100644 index 0000000..c9dc849 --- /dev/null +++ b/inc/lvgl/src/misc/lv_assert.h @@ -0,0 +1,87 @@ +/** + * @file lv_assert.h + * + */ + +#ifndef LV_ASSERT_H +#define LV_ASSERT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_log.h" +#include "../stdlib/lv_mem.h" +#include LV_ASSERT_HANDLER_INCLUDE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#define LV_ASSERT(expr) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR("Asserted at expression: %s", #expr); \ + LV_ASSERT_HANDLER \ + } \ + } while(0) + +#define LV_ASSERT_MSG(expr, msg) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR("Asserted at expression: %s (%s)", #expr, msg); \ + LV_ASSERT_HANDLER \ + } \ + } while(0) + +#define LV_ASSERT_FORMAT_MSG(expr, format, ...) \ + do { \ + if(!(expr)) { \ + LV_LOG_ERROR("Asserted at expression: %s " format , #expr, __VA_ARGS__); \ + LV_ASSERT_HANDLER \ + } \ + } while(0) + +/*----------------- + * ASSERTS + *-----------------*/ + +#if LV_USE_ASSERT_NULL +# define LV_ASSERT_NULL(p) LV_ASSERT_MSG(p != NULL, "NULL pointer"); +#else +# define LV_ASSERT_NULL(p) +#endif + +#if LV_USE_ASSERT_MALLOC +# define LV_ASSERT_MALLOC(p) LV_ASSERT_MSG(p != NULL, "Out of memory"); +#else +# define LV_ASSERT_MALLOC(p) +#endif + +#if LV_USE_ASSERT_MEM_INTEGRITY +# define LV_ASSERT_MEM_INTEGRITY() LV_ASSERT_MSG(lv_mem_test() == LV_RESULT_OK, "Memory integrity error"); +#else +# define LV_ASSERT_MEM_INTEGRITY() +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ASSERT_H*/ diff --git a/inc/lvgl/src/misc/lv_async.c b/inc/lvgl/src/misc/lv_async.c new file mode 100644 index 0000000..b2e718d --- /dev/null +++ b/inc/lvgl/src/misc/lv_async.c @@ -0,0 +1,108 @@ +/** + * @file lv_async.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_async.h" +#include "lv_timer_private.h" +#include "../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_async_info_t { + lv_async_cb_t cb; + void * user_data; +} lv_async_info_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_async_timer_cb(lv_timer_t * timer); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_async_call(lv_async_cb_t async_xcb, void * user_data) +{ + /*Allocate an info structure*/ + lv_async_info_t * info = lv_malloc(sizeof(lv_async_info_t)); + + if(info == NULL) + return LV_RESULT_INVALID; + + /*Create a new timer*/ + lv_timer_t * timer = lv_timer_create(lv_async_timer_cb, 0, info); + + if(timer == NULL) { + lv_free(info); + return LV_RESULT_INVALID; + } + + info->cb = async_xcb; + info->user_data = user_data; + + lv_timer_set_repeat_count(timer, 1); + return LV_RESULT_OK; +} + +lv_result_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data) +{ + lv_timer_t * timer = lv_timer_get_next(NULL); + lv_result_t res = LV_RESULT_INVALID; + + while(timer != NULL) { + /*Find the next timer node*/ + lv_timer_t * timer_next = lv_timer_get_next(timer); + + /*Find async timer callback*/ + if(timer->timer_cb == lv_async_timer_cb) { + lv_async_info_t * info = (lv_async_info_t *)timer->user_data; + + /*Match user function callback and user data*/ + if(info->cb == async_xcb && info->user_data == user_data) { + lv_timer_delete(timer); + lv_free(info); + res = LV_RESULT_OK; + } + } + + timer = timer_next; + } + + return res; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_async_timer_cb(lv_timer_t * timer) +{ + /*Save the info because an lv_async_call_cancel might delete it in the callback*/ + lv_async_info_t * info = (lv_async_info_t *)timer->user_data; + lv_async_info_t info_save = *info; + lv_timer_delete(timer); + lv_free(info); + + info_save.cb(info_save.user_data); +} diff --git a/inc/lvgl/src/misc/lv_async.h b/inc/lvgl/src/misc/lv_async.h new file mode 100644 index 0000000..362a0ff --- /dev/null +++ b/inc/lvgl/src/misc/lv_async.h @@ -0,0 +1,61 @@ +/** + * @file lv_async.h + * + */ + +#ifndef LV_ASYNC_H +#define LV_ASYNC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Type for async callback. + */ +typedef void (*lv_async_cb_t)(void *); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Call an asynchronous function the next time lv_timer_handler() is run. This function is likely to return + * **before** the call actually happens! + * @param async_xcb a callback which is the task itself. + * (the 'x' in the argument name indicates that it's not a fully generic function because it not follows + * the `func_name(object, callback, ...)` convention) + * @param user_data custom parameter + */ +lv_result_t lv_async_call(lv_async_cb_t async_xcb, void * user_data); + +/** + * Cancel an asynchronous function call + * @param async_xcb a callback which is the task itself. + * @param user_data custom parameter + */ +lv_result_t lv_async_call_cancel(lv_async_cb_t async_xcb, void * user_data); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ASYNC_H*/ diff --git a/inc/lvgl/src/misc/lv_bidi.c b/inc/lvgl/src/misc/lv_bidi.c new file mode 100644 index 0000000..44f014e --- /dev/null +++ b/inc/lvgl/src/misc/lv_bidi.c @@ -0,0 +1,663 @@ +/** + * @file lv_bidi.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_bidi_private.h" +#include "lv_text_private.h" +#include "lv_types.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +#if LV_USE_BIDI + +/********************* + * DEFINES + *********************/ +#define LV_BIDI_BRACKET_DEPTH 4 + +// Highest bit of the 16-bit pos_conv value specifies whether this pos is RTL or not +#define GET_POS(x) ((x) & 0x7FFF) +#define IS_RTL_POS(x) (((x) & 0x8000) != 0) +#define SET_RTL_POS(x, is_rtl) (GET_POS(x) | ((is_rtl)? 0x8000: 0)) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint32_t bracket_pos; + lv_base_dir_t dir; +} bracket_stack_t; + +typedef struct { + bracket_stack_t br_stack[LV_BIDI_BRACKET_DEPTH]; + uint8_t br_stack_p; +} lv_bidi_ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint32_t lv_bidi_get_next_paragraph(const char * txt); +static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter); +static bool lv_bidi_letter_is_weak(uint32_t letter); +static bool lv_bidi_letter_is_rtl(uint32_t letter); +static bool lv_bidi_letter_is_neutral(uint32_t letter); + +static lv_base_dir_t get_next_run(lv_bidi_ctx_t * ctx, const char * txt, lv_base_dir_t base_dir, uint32_t max_len, + uint32_t * len, + uint16_t * pos_conv_len); +static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t * pos_conv_out, uint16_t pos_conv_rd_base, + uint16_t pos_conv_len); +static uint32_t char_change_to_pair(uint32_t letter); +static lv_base_dir_t bracket_process(lv_bidi_ctx_t * ctx, const char * txt, uint32_t next_pos, uint32_t len, + uint32_t letter, + lv_base_dir_t base_dir); +static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index); +static uint32_t get_txt_len(const char * txt, uint32_t max_len); + +/********************** + * STATIC VARIABLES + **********************/ +static const uint8_t bracket_left[] = {"<({["}; +static const uint8_t bracket_right[] = {">)}]"}; +static const char * custom_neutrals = NULL; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir) +{ + if(base_dir == LV_BASE_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(str_in); + + uint32_t par_start = 0; + uint32_t par_len; + + while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { + str_out[par_start] = str_in[par_start]; + par_start ++; + } + + while(str_in[par_start] != '\0') { + par_len = lv_bidi_get_next_paragraph(&str_in[par_start]); + lv_bidi_process_paragraph(&str_in[par_start], &str_out[par_start], par_len, base_dir, NULL, 0); + par_start += par_len; + + while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { + str_out[par_start] = str_in[par_start]; + par_start ++; + } + } + + str_out[par_start] = '\0'; +} + +/** + * Auto-detect the direction of a text based on the first strong character + * @param txt the text to process + * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +lv_base_dir_t lv_bidi_detect_base_dir(const char * txt) +{ + uint32_t i = 0; + uint32_t letter; + while(txt[i] != '\0') { + letter = lv_text_encoded_next(txt, &i); + + lv_base_dir_t dir; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_RTL || dir == LV_BASE_DIR_LTR) return dir; + } + + /*If there were no strong char earlier return with the default base dir*/ + if(LV_BIDI_BASE_DIR_DEF == LV_BASE_DIR_AUTO) return LV_BASE_DIR_LTR; + else return LV_BIDI_BASE_DIR_DEF; +} + +uint16_t lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, + uint32_t visual_pos, bool * is_rtl) +{ + uint32_t pos_conv_len = get_txt_len(str_in, len); + char * buf = lv_malloc(len + 1); + if(buf == NULL) return (uint16_t) -1; + + uint16_t * pos_conv_buf = lv_malloc(pos_conv_len * sizeof(uint16_t)); + if(pos_conv_buf == NULL) { + lv_free(buf); + return (uint16_t) -1; + } + + if(bidi_txt) *bidi_txt = buf; + + lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); + + if(is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[visual_pos]); + + if(bidi_txt == NULL) lv_free(buf); + uint16_t res = GET_POS(pos_conv_buf[visual_pos]); + lv_free(pos_conv_buf); + return res; +} + +uint16_t lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, + uint32_t logical_pos, bool * is_rtl) +{ + uint32_t pos_conv_len = get_txt_len(str_in, len); + char * buf = lv_malloc(len + 1); + if(buf == NULL) return (uint16_t) -1; + + uint16_t * pos_conv_buf = lv_malloc(pos_conv_len * sizeof(uint16_t)); + if(pos_conv_buf == NULL) { + lv_free(buf); + return (uint16_t) -1; + } + + if(bidi_txt) *bidi_txt = buf; + + lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt : NULL, len, base_dir, pos_conv_buf, pos_conv_len); + + for(uint16_t i = 0; i < pos_conv_len; i++) { + if(GET_POS(pos_conv_buf[i]) == logical_pos) { + + if(is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[i]); + lv_free(pos_conv_buf); + + if(bidi_txt == NULL) lv_free(buf); + return i; + } + } + lv_free(pos_conv_buf); + if(bidi_txt == NULL) lv_free(buf); + return (uint16_t) -1; +} + +void lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, + uint16_t * pos_conv_out, uint16_t pos_conv_len) +{ + uint32_t run_len = 0; + lv_base_dir_t run_dir; + uint32_t rd = 0; + uint32_t wr; + uint16_t pos_conv_run_len = 0; + uint16_t pos_conv_rd = 0; + uint16_t pos_conv_wr; + + if(base_dir == LV_BASE_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(str_in); + if(base_dir == LV_BASE_DIR_RTL) { + wr = len; + pos_conv_wr = pos_conv_len; + } + else { + wr = 0; + pos_conv_wr = 0; + } + + if(str_out) str_out[len] = '\0'; + + lv_base_dir_t dir = base_dir; + + /*Empty the bracket stack*/ + lv_bidi_ctx_t ctx; + lv_memzero(&ctx, sizeof(ctx)); + + /*Process neutral chars in the beginning*/ + while(rd < len) { + uint32_t letter = lv_text_encoded_next(str_in, &rd); + pos_conv_rd++; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(&ctx, str_in, rd, len, letter, base_dir); + else if(dir != LV_BASE_DIR_WEAK) break; + } + + if(rd && str_in[rd] != '\0' && rd < len) { + lv_text_encoded_prev(str_in, &rd); + pos_conv_rd--; + } + + if(rd) { + if(base_dir == LV_BASE_DIR_LTR) { + if(str_out) { + lv_memcpy(&str_out[wr], str_in, rd); + wr += rd; + } + if(pos_conv_out) { + fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_rd, 0); + pos_conv_wr += pos_conv_rd; + } + } + else { + wr -= rd; + pos_conv_wr -= pos_conv_rd; + rtl_reverse(str_out ? &str_out[wr] : NULL, str_in, rd, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, 0, + pos_conv_rd); + } + } + + /*Get and process the runs*/ + + while(rd < len && str_in[rd]) { + run_dir = get_next_run(&ctx, &str_in[rd], base_dir, len - rd, &run_len, &pos_conv_run_len); + + if(base_dir == LV_BASE_DIR_LTR) { + if(run_dir == LV_BASE_DIR_LTR) { + if(str_out) lv_memcpy(&str_out[wr], &str_in[rd], run_len); + if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); + } + else rtl_reverse(str_out ? &str_out[wr] : NULL, &str_in[rd], run_len, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, + pos_conv_rd, pos_conv_run_len); + wr += run_len; + pos_conv_wr += pos_conv_run_len; + } + else { + wr -= run_len; + pos_conv_wr -= pos_conv_run_len; + if(run_dir == LV_BASE_DIR_LTR) { + if(str_out) lv_memcpy(&str_out[wr], &str_in[rd], run_len); + if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); + } + else rtl_reverse(str_out ? &str_out[wr] : NULL, &str_in[rd], run_len, pos_conv_out ? &pos_conv_out[pos_conv_wr] : NULL, + pos_conv_rd, pos_conv_run_len); + } + + rd += run_len; + pos_conv_rd += pos_conv_run_len; + } +} + +void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt) +{ + if(*base_dir == LV_BASE_DIR_AUTO) *base_dir = lv_bidi_detect_base_dir(txt); + + if(*align == LV_TEXT_ALIGN_AUTO) { + if(*base_dir == LV_BASE_DIR_RTL) *align = LV_TEXT_ALIGN_RIGHT; + else *align = LV_TEXT_ALIGN_LEFT; + } +} + +void lv_bidi_set_custom_neutrals_static(const char * neutrals) +{ + custom_neutrals = neutrals; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Get the next paragraph from a text + * @param txt the text to process + * @return the length of the current paragraph in byte count + */ +static uint32_t lv_bidi_get_next_paragraph(const char * txt) +{ + uint32_t i = 0; + + lv_text_encoded_next(txt, &i); + + while(txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { + lv_text_encoded_next(txt, &i); + } + + return i; +} + +/** + * Get the direction of a character + * @param letter a Unicode character + * @return `LV_BASE_DIR_RTL/LTR/WEAK/NEUTRAL` + */ +static lv_base_dir_t lv_bidi_get_letter_dir(uint32_t letter) +{ + if(lv_bidi_letter_is_rtl(letter)) return LV_BASE_DIR_RTL; + if(lv_bidi_letter_is_neutral(letter)) return LV_BASE_DIR_NEUTRAL; + if(lv_bidi_letter_is_weak(letter)) return LV_BASE_DIR_WEAK; + + return LV_BASE_DIR_LTR; +} +/** + * Tell whether a character is weak or not + * @param letter a Unicode character + * @return true/false + */ +static bool lv_bidi_letter_is_weak(uint32_t letter) +{ + uint32_t i = 0; + static const char weaks[] = "0123456789"; + + do { + uint32_t x = lv_text_encoded_next(weaks, &i); + if(letter == x) { + return true; + } + } while(weaks[i] != '\0'); + + return false; +} +/** + * Tell whether a character is RTL or not + * @param letter a Unicode character + * @return true/false + */ +static bool lv_bidi_letter_is_rtl(uint32_t letter) +{ + if(letter == 0x202E) return true; /*Unicode of LV_BIDI_RLO*/ + + /*Check for Persian and Arabic characters [https://en.wikipedia.org/wiki/Arabic_script_in_Unicode]*/ + if(letter >= 0x600 && letter <= 0x6FF) return true; + if(letter >= 0xFB50 && letter <= 0xFDFF) return true; + if(letter >= 0xFE70 && letter <= 0xFEFF) return true; + + /*Check for Hebrew characters [https://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet]*/ + if(letter >= 0x590 && letter <= 0x5FF) return true; + if(letter >= 0xFB1D && letter <= 0xFB4F) return true; + + return false; +} + +/** + * Tell whether a character is neutral or not + * @param letter a Unicode character + * @return true/false + */ +static bool lv_bidi_letter_is_neutral(uint32_t letter) +{ + uint16_t i; + const char * neutrals = " \t\n\r.,:;'\"`!?%/\\-=()[]{}<>@#&$|"; + if(custom_neutrals) { + neutrals = custom_neutrals; + } + + for(i = 0; neutrals[i] != '\0'; i++) { + if(letter == (uint32_t)neutrals[i]) return true; + } + + return false; +} + +static uint32_t get_txt_len(const char * txt, uint32_t max_len) +{ + uint32_t len = 0; + uint32_t i = 0; + + while(i < max_len && txt[i] != '\0') { + lv_text_encoded_next(txt, &i); + len++; + } + + return len; +} + +static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index) +{ + uint16_t i; + for(i = 0; i < len; i++) { + out[i] = SET_RTL_POS(index, false); + index++; + } +} + +static lv_base_dir_t get_next_run(lv_bidi_ctx_t * ctx, const char * txt, lv_base_dir_t base_dir, uint32_t max_len, + uint32_t * len, + uint16_t * pos_conv_len) +{ + uint32_t i = 0; + uint32_t letter; + + uint16_t pos_conv_i = 0; + + letter = lv_text_encoded_next(txt, NULL); + lv_base_dir_t dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(ctx, txt, 0, max_len, letter, base_dir); + + /*Find the first strong char. Skip the neutrals*/ + while(dir == LV_BASE_DIR_NEUTRAL || dir == LV_BASE_DIR_WEAK) { + letter = lv_text_encoded_next(txt, &i); + + pos_conv_i++; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BASE_DIR_NEUTRAL) dir = bracket_process(ctx, txt, i, max_len, letter, base_dir); + + if(dir == LV_BASE_DIR_LTR || dir == LV_BASE_DIR_RTL) break; + + if(i >= max_len || txt[i] == '\0' || txt[i] == '\n' || txt[i] == '\r') { + *len = i; + *pos_conv_len = pos_conv_i; + return base_dir; + } + } + + lv_base_dir_t run_dir = dir; + + uint32_t i_prev = i; + uint32_t i_last_strong = i; + uint16_t pos_conv_i_prev = pos_conv_i; + uint16_t pos_conv_i_last_strong = pos_conv_i; + + /*Find the next char which has different direction*/ + lv_base_dir_t next_dir = base_dir; + while(i_prev < max_len && txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { + letter = lv_text_encoded_next(txt, &i); + pos_conv_i++; + next_dir = lv_bidi_get_letter_dir(letter); + if(next_dir == LV_BASE_DIR_NEUTRAL) next_dir = bracket_process(ctx, txt, i, max_len, letter, base_dir); + + if(next_dir == LV_BASE_DIR_WEAK) { + if(run_dir == LV_BASE_DIR_RTL) { + if(base_dir == LV_BASE_DIR_RTL) { + next_dir = LV_BASE_DIR_LTR; + } + } + } + + /*New dir found?*/ + if((next_dir == LV_BASE_DIR_RTL || next_dir == LV_BASE_DIR_LTR) && next_dir != run_dir) { + /*Include neutrals if `run_dir == base_dir`*/ + if(run_dir == base_dir) { + *len = i_prev; + *pos_conv_len = pos_conv_i_prev; + } + /*Exclude neutrals if `run_dir != base_dir`*/ + else { + *len = i_last_strong; + *pos_conv_len = pos_conv_i_last_strong; + } + + return run_dir; + } + + if(next_dir != LV_BASE_DIR_NEUTRAL) { + i_last_strong = i; + pos_conv_i_last_strong = pos_conv_i; + } + + i_prev = i; + pos_conv_i_prev = pos_conv_i; + } + + /*Handle end of of string. Apply `base_dir` on trailing neutrals*/ + + /*Include neutrals if `run_dir == base_dir`*/ + if(run_dir == base_dir) { + *len = i_prev; + *pos_conv_len = pos_conv_i_prev; + } + /*Exclude neutrals if `run_dir != base_dir`*/ + else { + *len = i_last_strong; + *pos_conv_len = pos_conv_i_last_strong; + } + + return run_dir; +} + +static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t * pos_conv_out, uint16_t pos_conv_rd_base, + uint16_t pos_conv_len) +{ + uint32_t i = len; + uint32_t wr = 0; + uint16_t pos_conv_i = pos_conv_len; + uint16_t pos_conv_wr = 0; + + while(i) { + uint32_t letter = lv_text_encoded_prev(src, &i); + uint16_t pos_conv_letter = --pos_conv_i; + + /*Keep weak letters (numbers) as LTR*/ + if(lv_bidi_letter_is_weak(letter)) { + uint32_t last_weak = i; + uint32_t first_weak = i; + uint16_t pos_conv_last_weak = pos_conv_i; + uint16_t pos_conv_first_weak = pos_conv_i; + while(i) { + letter = lv_text_encoded_prev(src, &i); + pos_conv_letter = --pos_conv_i; + + /*No need to call `char_change_to_pair` because there not such chars here*/ + + /*Finish on non-weak char*/ + /*but treat number and currency related chars as weak*/ + if(lv_bidi_letter_is_weak(letter) == false && letter != '.' && letter != ',' && letter != '$' && letter != '%') { + lv_text_encoded_next(src, &i); /*Rewind one letter*/ + pos_conv_i++; + first_weak = i; + pos_conv_first_weak = pos_conv_i; + break; + } + } + if(i == 0) { + first_weak = 0; + pos_conv_first_weak = 0; + } + + if(dest) lv_memcpy(&dest[wr], &src[first_weak], last_weak - first_weak + 1); + if(pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_last_weak - pos_conv_first_weak + 1, + pos_conv_rd_base + pos_conv_first_weak); + wr += last_weak - first_weak + 1; + pos_conv_wr += pos_conv_last_weak - pos_conv_first_weak + 1; + } + + /*Simply store in reversed order*/ + else { + uint32_t letter_size = lv_text_encoded_size((const char *)&src[i]); + /*Swap arithmetical symbols*/ + if(letter_size == 1) { + uint32_t new_letter = letter = char_change_to_pair(letter); + if(dest) dest[wr] = (uint8_t)new_letter; + if(pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_letter, true); + wr++; + pos_conv_wr++; + } + /*Just store the letter*/ + else { + if(dest) lv_memcpy(&dest[wr], &src[i], letter_size); + if(pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_i, true); + wr += letter_size; + pos_conv_wr++; + } + } + } +} + +static uint32_t char_change_to_pair(uint32_t letter) +{ + + uint8_t i; + for(i = 0; bracket_left[i] != '\0'; i++) { + if(letter == bracket_left[i]) return bracket_right[i]; + } + + for(i = 0; bracket_right[i] != '\0'; i++) { + if(letter == bracket_right[i]) return bracket_left[i]; + } + + return letter; +} + +static lv_base_dir_t bracket_process(lv_bidi_ctx_t * ctx, const char * txt, uint32_t next_pos, uint32_t len, + uint32_t letter, + lv_base_dir_t base_dir) +{ + lv_base_dir_t bracket_dir = LV_BASE_DIR_NEUTRAL; + + uint8_t i; + /*Is the letter an opening bracket?*/ + for(i = 0; bracket_left[i] != '\0'; i++) { + if(bracket_left[i] == letter) { + /*If so find its matching closing bracket. + *If a char with base dir. direction is found then the brackets will have `base_dir` direction*/ + uint32_t txt_i = next_pos; + while(txt_i < len) { + uint32_t letter_next = lv_text_encoded_next(txt, &txt_i); + if(letter_next == bracket_right[i]) { + /*Closing bracket found*/ + break; + } + else { + /*Save the dir*/ + lv_base_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); + if(letter_dir == base_dir) { + bracket_dir = base_dir; + } + } + } + + /*There were no matching closing bracket*/ + if(txt_i > len) return LV_BASE_DIR_NEUTRAL; + + /*There where a strong char with base dir in the bracket so the dir is found.*/ + if(bracket_dir != LV_BASE_DIR_NEUTRAL && bracket_dir != LV_BASE_DIR_WEAK) break; + + /*If there were no matching strong chars in the brackets then check the previous chars*/ + txt_i = next_pos; + if(txt_i) lv_text_encoded_prev(txt, &txt_i); + while(txt_i > 0) { + uint32_t letter_next = lv_text_encoded_prev(txt, &txt_i); + lv_base_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); + if(letter_dir == LV_BASE_DIR_LTR || letter_dir == LV_BASE_DIR_RTL) { + bracket_dir = letter_dir; + break; + } + } + + /*There where a previous strong char which can be used*/ + if(bracket_dir != LV_BASE_DIR_NEUTRAL) break; + + /*There were no strong chars before the bracket, so use the base dir.*/ + if(txt_i == 0) bracket_dir = base_dir; + + break; + } + } + + /*The letter was an opening bracket*/ + if(bracket_left[i] != '\0') { + + if(bracket_dir == LV_BASE_DIR_NEUTRAL || ctx->br_stack_p == LV_BIDI_BRACKET_DEPTH) return LV_BASE_DIR_NEUTRAL; + + ctx->br_stack[ctx->br_stack_p].bracket_pos = i; + ctx->br_stack[ctx->br_stack_p].dir = bracket_dir; + + ctx->br_stack_p++; + return bracket_dir; + } + else if(ctx->br_stack_p > 0) { + /*Is the letter a closing bracket of the last opening?*/ + if(letter == bracket_right[ctx->br_stack[ctx->br_stack_p - 1].bracket_pos]) { + bracket_dir = ctx->br_stack[ctx->br_stack_p - 1].dir; + ctx->br_stack_p--; + return bracket_dir; + } + } + + return LV_BASE_DIR_NEUTRAL; +} + +#endif /*LV_USE_BIDI*/ diff --git a/inc/lvgl/src/misc/lv_bidi.h b/inc/lvgl/src/misc/lv_bidi.h new file mode 100644 index 0000000..77575ef --- /dev/null +++ b/inc/lvgl/src/misc/lv_bidi.h @@ -0,0 +1,83 @@ +/** + * @file lv_bidi.h + * + */ + +#ifndef LV_BIDI_H +#define LV_BIDI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_types.h" +#include "lv_text.h" + +/********************* + * DEFINES + *********************/ +/** Special non printable strong characters. + * They can be inserted to texts to affect the run's direction */ +#define LV_BIDI_LRO "\xE2\x80\xAD" /*U+202D*/ +#define LV_BIDI_RLO "\xE2\x80\xAE" /*U+202E*/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_BASE_DIR_LTR = 0x00, + LV_BASE_DIR_RTL = 0x01, + LV_BASE_DIR_AUTO = 0x02, + + LV_BASE_DIR_NEUTRAL = 0x20, + LV_BASE_DIR_WEAK = 0x21, +} lv_base_dir_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +#if LV_USE_BIDI + +/** + * Get the real text alignment from the a text alignment, base direction and a text. + * @param align LV_TEXT_ALIGN_..., write back the calculated align here (LV_TEXT_ALIGN_LEFT/RIGHT/CENTER) + * @param base_dir LV_BASE_DIR_..., write the calculated base dir here (LV_BASE_DIR_LTR/RTL) + * @param txt a text, used with LV_BASE_DIR_AUTO to determine the base direction + */ +void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt); + +/** + * Set custom neutrals string + * @param neutrals default " \t\n\r.,:;'\"`!?%/\\-=()[]{}<>@#&$|" + */ +void lv_bidi_set_custom_neutrals_static(const char * neutrals); + +/********************** + * MACROS + **********************/ + +#else /*LV_USE_BIDI*/ +/** + * For compatibility if LV_USE_BIDI = 0 + * Get the real text alignment from the a text alignment, base direction and a text. + * @param align For LV_TEXT_ALIGN_AUTO give LV_TEXT_ALIGN_LEFT else leave unchanged, write back the calculated align here + * @param base_dir Unused + * @param txt Unused + */ +static inline void lv_bidi_calculate_align(lv_text_align_t * align, lv_base_dir_t * base_dir, const char * txt) +{ + LV_UNUSED(txt); + LV_UNUSED(base_dir); + if(*align == LV_TEXT_ALIGN_AUTO) * align = LV_TEXT_ALIGN_LEFT; +} +#endif /*LV_USE_BIDI*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BIDI_H*/ diff --git a/inc/lvgl/src/misc/lv_bidi_private.h b/inc/lvgl/src/misc/lv_bidi_private.h new file mode 100644 index 0000000..0b684da --- /dev/null +++ b/inc/lvgl/src/misc/lv_bidi_private.h @@ -0,0 +1,101 @@ +/** + * @file lv_bidi_private.h + * + */ + +#ifndef LV_BIDI_PRIVATE_H +#define LV_BIDI_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_bidi.h" +#if LV_USE_BIDI + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Convert a text to get the characters in the correct visual order according to + * Unicode Bidirectional Algorithm + * @param str_in the text to process + * @param str_out store the result here. Has the be `strlen(str_in)` length + * @param base_dir `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +void lv_bidi_process(const char * str_in, char * str_out, lv_base_dir_t base_dir); + +/** + * Auto-detect the direction of a text based on the first strong character + * @param txt the text to process + * @return `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + */ +lv_base_dir_t lv_bidi_detect_base_dir(const char * txt); + +/** + * Get the logical position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param visual_pos the visual character position which logical position should be get + * @param is_rtl tell the char at `visual_pos` is RTL or LTR context + * @return the logical character position + */ +uint16_t lv_bidi_get_logical_pos(const char * str_in, char ** bidi_txt, uint32_t len, lv_base_dir_t base_dir, + uint32_t visual_pos, bool * is_rtl); + +/** + * Get the visual position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BASE_DIR_LTR` or `LV_BASE_DIR_RTL` + * @param logical_pos the logical character position which visual position should be get + * @param is_rtl tell the char at `logical_pos` is RTL or LTR context + * @return the visual character position + */ +uint16_t lv_bidi_get_visual_pos(const char * str_in, char ** bidi_txt, uint16_t len, lv_base_dir_t base_dir, + uint32_t logical_pos, bool * is_rtl); + +/** + * Bidi process a paragraph of text + * @param str_in the string to process + * @param str_out store the result here + * @param len length of the text + * @param base_dir base dir of the text + * @param pos_conv_out an `uint16_t` array to store the related logical position of the character. + * Can be `NULL` is unused + * @param pos_conv_len length of `pos_conv_out` in element count + */ +void lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_base_dir_t base_dir, + uint16_t * pos_conv_out, uint16_t pos_conv_len); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BIDI*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BIDI_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_circle_buf.c b/inc/lvgl/src/misc/lv_circle_buf.c new file mode 100644 index 0000000..455435c --- /dev/null +++ b/inc/lvgl/src/misc/lv_circle_buf.c @@ -0,0 +1,295 @@ +/** + * @file lv_circle_buf.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_assert.h" + +#include "lv_circle_buf.h" +#include "lv_array.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_circle_buf_t { + lv_array_t array; + uint32_t head; + uint32_t tail; /**< The next write position */ + + bool inner_alloc; /**< true: the array is allocated by the buffer, false: the array is created from an external buffer */ +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void circle_buf_prepare_empty(lv_circle_buf_t * circle_buf); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_circle_buf_t * lv_circle_buf_create(const uint32_t capacity, const uint32_t element_size) +{ + lv_circle_buf_t * circle_buf = lv_malloc(sizeof(lv_circle_buf_t)); + LV_ASSERT_MALLOC(circle_buf); + + if(circle_buf == NULL) { + return NULL; + } + + lv_array_init(&circle_buf->array, capacity, element_size); + circle_buf->head = 0; + circle_buf->tail = 0; + circle_buf->inner_alloc = true; + + circle_buf_prepare_empty(circle_buf); + + return circle_buf; +} + +lv_circle_buf_t * lv_circle_buf_create_from_buf(void * buf, const uint32_t capacity, const uint32_t element_size) +{ + LV_ASSERT_NULL(buf); + + lv_circle_buf_t * circle_buf = lv_malloc(sizeof(lv_circle_buf_t)); + LV_ASSERT_MALLOC(circle_buf); + + if(circle_buf == NULL) { + return NULL; + } + + lv_array_init_from_buf(&circle_buf->array, buf, capacity, element_size); + circle_buf->head = 0; + circle_buf->tail = 0; + circle_buf->inner_alloc = false; + + circle_buf_prepare_empty(circle_buf); + + return circle_buf; +} + +lv_circle_buf_t * lv_circle_buf_create_from_array(const lv_array_t * array) +{ + LV_ASSERT_NULL(array); + if(array == NULL) { + return NULL; + } + + lv_circle_buf_t * circle_buf = lv_malloc(sizeof(lv_circle_buf_t)); + LV_ASSERT_MALLOC(circle_buf); + + if(circle_buf == NULL) { + return NULL; + } + + circle_buf->array = *array; + circle_buf->head = 0; + circle_buf->tail = 0; + circle_buf->inner_alloc = false; + + circle_buf_prepare_empty(circle_buf); + + return circle_buf; +} + +lv_result_t lv_circle_buf_resize(lv_circle_buf_t * circle_buf, const uint32_t capacity) +{ + LV_ASSERT_NULL(circle_buf); + + if(lv_array_resize(&circle_buf->array, capacity) == false) { + return LV_RESULT_INVALID; + } + + circle_buf->head = 0; + circle_buf->tail = 0; + + circle_buf_prepare_empty(circle_buf); + + return LV_RESULT_OK; +} + +void lv_circle_buf_destroy(lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + lv_array_deinit(&circle_buf->array); + + lv_free(circle_buf); +} + +uint32_t lv_circle_buf_size(const lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + return circle_buf->tail - circle_buf->head; +} + +uint32_t lv_circle_buf_capacity(const lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + return lv_array_capacity(&circle_buf->array); +} + +uint32_t lv_circle_buf_remain(const lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + return lv_circle_buf_capacity(circle_buf) - lv_circle_buf_size(circle_buf); +} + +bool lv_circle_buf_is_empty(const lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + return !lv_circle_buf_size(circle_buf); +} + +bool lv_circle_buf_is_full(const lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + return !lv_circle_buf_remain(circle_buf); +} + +void lv_circle_buf_reset(lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + circle_buf->head = 0; + circle_buf->tail = 0; +} + +void * lv_circle_buf_head(const lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + return lv_array_at(&circle_buf->array, + circle_buf->head % lv_circle_buf_capacity(circle_buf)); +} + +void * lv_circle_buf_tail(const lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + return lv_array_at(&circle_buf->array, + circle_buf->tail % lv_circle_buf_capacity(circle_buf)); +} + +lv_result_t lv_circle_buf_read(lv_circle_buf_t * circle_buf, void * data) +{ + LV_ASSERT_NULL(circle_buf); + + if(lv_circle_buf_is_empty(circle_buf)) { + circle_buf->head = 0; + circle_buf->tail = 0; + return LV_RESULT_INVALID; + } + + lv_circle_buf_peek_at(circle_buf, 0, data); + circle_buf->head++; + + return LV_RESULT_OK; +} + +lv_result_t lv_circle_buf_write(lv_circle_buf_t * circle_buf, const void * data) +{ + LV_ASSERT_NULL(circle_buf); + + if(lv_circle_buf_is_full(circle_buf)) { + return LV_RESULT_INVALID; + } + + lv_array_assign(&circle_buf->array, circle_buf->tail % lv_circle_buf_capacity(circle_buf), data); + circle_buf->tail++; + + return LV_RESULT_OK; +} + +uint32_t lv_circle_buf_fill(lv_circle_buf_t * circle_buf, uint32_t count, lv_circle_buf_fill_cb_t fill_cb, + void * user_data) +{ + LV_ASSERT_NULL(circle_buf); + LV_ASSERT_NULL(fill_cb); + + uint32_t filled = 0; + while(count > 0 && !lv_circle_buf_is_full(circle_buf)) { + void * data = lv_circle_buf_tail(circle_buf); + if(fill_cb(data, circle_buf->array.element_size, (int32_t)filled, user_data) == LV_RESULT_OK) { + circle_buf->tail++; + filled++; + } + else break; + + count--; + } + + return filled; +} + +lv_result_t lv_circle_buf_skip(lv_circle_buf_t * circle_buf) +{ + LV_ASSERT_NULL(circle_buf); + + if(lv_circle_buf_is_empty(circle_buf)) { + circle_buf->head = 0; + circle_buf->tail = 0; + return LV_RESULT_INVALID; + } + + circle_buf->head++; + + return LV_RESULT_OK; +} + +lv_result_t lv_circle_buf_peek(const lv_circle_buf_t * circle_buf, void * data) +{ + LV_ASSERT_NULL(circle_buf); + LV_ASSERT_NULL(data); + + return lv_circle_buf_peek_at(circle_buf, 0, data); +} + +lv_result_t lv_circle_buf_peek_at(const lv_circle_buf_t * circle_buf, const uint32_t index, void * data) +{ + LV_ASSERT_NULL(circle_buf); + LV_ASSERT_NULL(data); + + const uint32_t real_index = (index % lv_circle_buf_size(circle_buf) + circle_buf->head) % lv_circle_buf_capacity( + circle_buf); + lv_memcpy(data, lv_array_at(&circle_buf->array, real_index), circle_buf->array.element_size); + + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void circle_buf_prepare_empty(lv_circle_buf_t * circle_buf) +{ + const uint32_t required = lv_array_capacity(&circle_buf->array) - lv_array_size(&circle_buf->array); + for(uint32_t i = 0; i < required; i++) lv_array_push_back(&circle_buf->array, NULL); +} diff --git a/inc/lvgl/src/misc/lv_circle_buf.h b/inc/lvgl/src/misc/lv_circle_buf.h new file mode 100644 index 0000000..2b4f27b --- /dev/null +++ b/inc/lvgl/src/misc/lv_circle_buf.h @@ -0,0 +1,191 @@ +/** +* @file lv_circle_buf.h +* + */ + + +#ifndef LV_CIRCLE_BUF_H +#define LV_CIRCLE_BUF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef bool (*lv_circle_buf_fill_cb_t)(void * buf, uint32_t buff_len, int32_t index, void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a circle buffer + * @param capacity the maximum number of elements in the buffer + * @param element_size the size of an element in bytes + * @return pointer to the created buffer + */ +lv_circle_buf_t * lv_circle_buf_create(uint32_t capacity, uint32_t element_size); + +/** + * Create a circle buffer from an existing buffer + * @param buf pointer to a buffer + * @param capacity the maximum number of elements in the buffer + * @param element_size the size of an element in bytes + * @return pointer to the created buffer + */ +lv_circle_buf_t * lv_circle_buf_create_from_buf(void * buf, uint32_t capacity, uint32_t element_size); + +/** + * Create a circle buffer from an existing array + * @param array pointer to an array + * @return pointer to the created buffer + */ +lv_circle_buf_t * lv_circle_buf_create_from_array(const lv_array_t * array); + +/** + * Resize the buffer + * @param circle_buf pointer to a buffer + * @param capacity the new capacity of the buffer + * @return LV_RESULT_OK: the buffer is resized; LV_RESULT_INVALID: the buffer is not resized + */ +lv_result_t lv_circle_buf_resize(lv_circle_buf_t * circle_buf, uint32_t capacity); + +/** + * Destroy a circle buffer + * @param circle_buf pointer to buffer + */ +void lv_circle_buf_destroy(lv_circle_buf_t * circle_buf); + +/** + * Get the size of the buffer + * @param circle_buf pointer to buffer + * @return the number of elements in the buffer + */ +uint32_t lv_circle_buf_size(const lv_circle_buf_t * circle_buf); + +/** + * Get the capacity of the buffer + * @param circle_buf pointer to buffer + * @return the maximum number of elements in the buffer + */ +uint32_t lv_circle_buf_capacity(const lv_circle_buf_t * circle_buf); + +/** + * Get the remaining space in the buffer + * @param circle_buf pointer to buffer + * @return the number of elements that can be written to the buffer + */ +uint32_t lv_circle_buf_remain(const lv_circle_buf_t * circle_buf); + +/** + * Check if the buffer is empty + * @param circle_buf pointer to buffer + * @return true: the buffer is empty; false: the buffer is not empty + */ +bool lv_circle_buf_is_empty(const lv_circle_buf_t * circle_buf); + +/** + * Check if the buffer is full + * @param circle_buf pointer to buffer + * @return true: the buffer is full; false: the buffer is not full + */ +bool lv_circle_buf_is_full(const lv_circle_buf_t * circle_buf); + +/** + * Reset the buffer + * @param circle_buf pointer to buffer + * @return LV_RESULT_OK: the buffer is reset; LV_RESULT_INVALID: the buffer is not reset + */ +void lv_circle_buf_reset(lv_circle_buf_t * circle_buf); + +/** + * Get the head of the buffer + * @param circle_buf pointer to buffer + * @return pointer to the head of the buffer + */ +void * lv_circle_buf_head(const lv_circle_buf_t * circle_buf); + +/** + * Get the tail of the buffer + * @param circle_buf pointer to buffer + * @return pointer to the tail of the buffer + */ +void * lv_circle_buf_tail(const lv_circle_buf_t * circle_buf); + +/** + * Read a value + * @param circle_buf pointer to buffer + * @param data pointer to a variable to store the read value + * @return LV_RESULT_OK: the value is read; LV_RESULT_INVALID: the value is not read + */ +lv_result_t lv_circle_buf_read(lv_circle_buf_t * circle_buf, void * data); + +/** + * Write a value + * @param circle_buf pointer to buffer + * @param data pointer to the value to write + * @return LV_RESULT_OK: the value is written; LV_RESULT_INVALID: the value is not written + */ +lv_result_t lv_circle_buf_write(lv_circle_buf_t * circle_buf, const void * data); + +/** + * Fill the buffer with values + * @param circle_buf pointer to buffer + * @param count the number of values to fill + * @param fill_cb the callback function to fill the buffer + * @param user_data + * @return the number of values filled + */ +uint32_t lv_circle_buf_fill(lv_circle_buf_t * circle_buf, uint32_t count, lv_circle_buf_fill_cb_t fill_cb, + void * user_data); + +/** + * Skip a value + * @param circle_buf pointer to buffer + * @return LV_RESULT_OK: the value is skipped; LV_RESULT_INVALID: the value is not skipped + */ +lv_result_t lv_circle_buf_skip(lv_circle_buf_t * circle_buf); + +/** + * Peek a value + * @param circle_buf pointer to buffer + * @param data pointer to a variable to store the peeked value + * @return LV_RESULT_OK: the value is peeked; LV_RESULT_INVALID: the value is not peeked + */ +lv_result_t lv_circle_buf_peek(const lv_circle_buf_t * circle_buf, void * data); + +/** + * Peek a value at an index + * @param circle_buf pointer to buffer + * @param index the index of the value to peek, if the index is greater than the size of the buffer, it will return looply. + * @param data pointer to a variable to store the peeked value + * @return LV_RESULT_OK: the value is peeked; LV_RESULT_INVALID: the value is not peeked + */ +lv_result_t lv_circle_buf_peek_at(const lv_circle_buf_t * circle_buf, uint32_t index, void * data); + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CIRCLE_BUF_H*/ diff --git a/inc/lvgl/src/misc/lv_color.c b/inc/lvgl/src/misc/lv_color.c new file mode 100644 index 0000000..fa8d3e7 --- /dev/null +++ b/inc/lvgl/src/misc/lv_color.c @@ -0,0 +1,421 @@ +/** + * @file lv_color.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_color.h" +#include "lv_log.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_color_t lv_color_filter_shade_cb(const lv_color_filter_dsc_t * dsc, lv_color_t c, lv_opa_t opa); + +/********************** + * GLOBAL VARIABLES + **********************/ + +const lv_color_filter_dsc_t lv_color_filter_shade = {.filter_cb = lv_color_filter_shade_cb}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +uint8_t lv_color_format_get_bpp(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_A1: + return 1; + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_A2: + return 2; + case LV_COLOR_FORMAT_I4: + case LV_COLOR_FORMAT_A4: + case LV_COLOR_FORMAT_NEMA_TSC4: + return 4; + case LV_COLOR_FORMAT_NEMA_TSC6: + case LV_COLOR_FORMAT_NEMA_TSC6A: + case LV_COLOR_FORMAT_NEMA_TSC6AP: + return 6; + case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_I8: + case LV_COLOR_FORMAT_ARGB2222: + return 8; + case LV_COLOR_FORMAT_NEMA_TSC12: + case LV_COLOR_FORMAT_NEMA_TSC12A: + return 12; + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB565_SWAPPED: + case LV_COLOR_FORMAT_YUY2: + case LV_COLOR_FORMAT_AL88: + case LV_COLOR_FORMAT_ARGB1555: + case LV_COLOR_FORMAT_ARGB4444: + return 16; + + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_RGB888: + return 24; + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + case LV_COLOR_FORMAT_XRGB8888: + return 32; + + case LV_COLOR_FORMAT_UNKNOWN: + default: + return 0; + } +} + +bool lv_color_format_has_alpha(lv_color_format_t cf) +{ + switch(cf) { + case LV_COLOR_FORMAT_A1: + case LV_COLOR_FORMAT_A2: + case LV_COLOR_FORMAT_A4: + case LV_COLOR_FORMAT_A8: + case LV_COLOR_FORMAT_I1: + case LV_COLOR_FORMAT_I2: + case LV_COLOR_FORMAT_I4: + case LV_COLOR_FORMAT_I8: + case LV_COLOR_FORMAT_RGB565A8: + case LV_COLOR_FORMAT_ARGB8565: + case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + case LV_COLOR_FORMAT_AL88: + case LV_COLOR_FORMAT_ARGB2222: + case LV_COLOR_FORMAT_ARGB1555: + case LV_COLOR_FORMAT_ARGB4444: + return true; + default: + return false; + } +} + +lv_color32_t lv_color_to_32(lv_color_t color, lv_opa_t opa) +{ + lv_color32_t c32; + c32.red = color.red; + c32.green = color.green; + c32.blue = color.blue; + c32.alpha = opa; + return c32; +} + +uint16_t lv_color_to_u16(lv_color_t color) +{ + return ((color.red & 0xF8) << 8) + ((color.green & 0xFC) << 3) + ((color.blue & 0xF8) >> 3); +} + +uint32_t lv_color_to_u32(lv_color_t color) +{ + return (uint32_t)((uint32_t)0xff << 24) + (color.red << 16) + (color.green << 8) + (color.blue); +} + +lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl) +{ + + return lv_color_mix(lv_color_white(), c, lvl); +} + +lv_color_t lv_color_darken(lv_color_t c, lv_opa_t lvl) +{ + return lv_color_mix(lv_color_black(), c, lvl); +} + +lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v) +{ + h = (uint32_t)((uint32_t)h * 255) / 360; + s = (uint16_t)((uint16_t)s * 255) / 100; + v = (uint16_t)((uint16_t)v * 255) / 100; + + uint8_t r, g, b; + + uint8_t region, remainder, p, q, t; + + if(s == 0) { + return lv_color_make(v, v, v); + } + + region = h / 43; + remainder = (h - (region * 43)) * 6; + + p = (v * (255 - s)) >> 8; + q = (v * (255 - ((s * remainder) >> 8))) >> 8; + t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; + + switch(region) { + case 0: + r = v; + g = t; + b = p; + break; + case 1: + r = q; + g = v; + b = p; + break; + case 2: + r = p; + g = v; + b = t; + break; + case 3: + r = p; + g = q; + b = v; + break; + case 4: + r = t; + g = p; + b = v; + break; + default: + r = v; + g = p; + b = q; + break; + } + + lv_color_t result = lv_color_make(r, g, b); + return result; +} + +lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8) +{ + uint16_t r = ((uint32_t)r8 << 10) / 255; + uint16_t g = ((uint32_t)g8 << 10) / 255; + uint16_t b = ((uint32_t)b8 << 10) / 255; + + uint16_t rgbMin = r < g ? (r < b ? r : b) : (g < b ? g : b); + uint16_t rgbMax = r > g ? (r > b ? r : b) : (g > b ? g : b); + + lv_color_hsv_t hsv; + + // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness + hsv.v = (100 * rgbMax) >> 10; + + int32_t delta = rgbMax - rgbMin; + if(delta < 3) { + hsv.h = 0; + hsv.s = 0; + return hsv; + } + + // https://en.wikipedia.org/wiki/HSL_and_HSV#Saturation + hsv.s = 100 * delta / rgbMax; + if(hsv.s < 3) { + hsv.h = 0; + return hsv; + } + + // https://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma + int32_t h; + if(rgbMax == r) + h = (((g - b) << 10) / delta) + (g < b ? (6 << 10) : 0); // between yellow & magenta + else if(rgbMax == g) + h = (((b - r) << 10) / delta) + (2 << 10); // between cyan & yellow + else if(rgbMax == b) + h = (((r - g) << 10) / delta) + (4 << 10); // between magenta & cyan + else + h = 0; + h *= 60; + h >>= 10; + if(h < 0) h += 360; + + hsv.h = h; + return hsv; +} + +/** + * Convert a color to HSV + * @param color color + * @return the given color in HSV + */ +lv_color_hsv_t lv_color_to_hsv(lv_color_t c) +{ + return lv_color_rgb_to_hsv(c.red, c.green, c.blue); +} + +uint8_t lv_color_format_get_size(lv_color_format_t cf) +{ + return (lv_color_format_get_bpp(cf) + 7) >> 3; +} + +uint32_t lv_color_to_int(lv_color_t c) +{ + uint8_t * tmp = (uint8_t *) &c; + return tmp[0] + (tmp[1] << 8) + (tmp[2] << 16); +} + +bool lv_color_eq(lv_color_t c1, lv_color_t c2) +{ + return lv_color_to_int(c1) == lv_color_to_int(c2); +} + +bool lv_color32_eq(lv_color32_t c1, lv_color32_t c2) +{ + return *((uint32_t *)&c1) == *((uint32_t *)&c2); +} + +lv_color_t lv_color_hex(uint32_t c) +{ + lv_color_t ret; + ret.red = (c >> 16) & 0xff; + ret.green = (c >> 8) & 0xff; + ret.blue = (c >> 0) & 0xff; + return ret; +} + +lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b) +{ + lv_color_t ret; + ret.red = r; + ret.green = g; + ret.blue = b; + return ret; +} + +lv_color32_t lv_color32_make(uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + lv_color32_t ret; + ret.red = r; + ret.green = g; + ret.blue = b; + ret.alpha = a; + return ret; +} + +lv_color_t lv_color_hex3(uint32_t c) +{ + return lv_color_make((uint8_t)(((c >> 4) & 0xF0) | ((c >> 8) & 0xF)), (uint8_t)((c & 0xF0) | ((c & 0xF0) >> 4)), + (uint8_t)((c & 0xF) | ((c & 0xF) << 4))); +} + +uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix) +{ + if(mix == 255) return c1; + if(mix == 0) return c2; + if(c1 == c2) return c1; + + uint16_t ret; + + /* Source: https://stackoverflow.com/a/50012418/1999969*/ + mix = (uint32_t)((uint32_t)mix + 4) >> 3; + + /*0x7E0F81F = 0b00000111111000001111100000011111*/ + uint32_t bg = (uint32_t)(c2 | ((uint32_t)c2 << 16)) & 0x7E0F81F; + uint32_t fg = (uint32_t)(c1 | ((uint32_t)c1 << 16)) & 0x7E0F81F; + uint32_t result = ((((fg - bg) * mix) >> 5) + bg) & 0x7E0F81F; + ret = (uint16_t)(result >> 16) | result; + + return ret; +} + +lv_color_t lv_color_white(void) +{ + return lv_color_make(0xff, 0xff, 0xff); +} + +lv_color_t lv_color_black(void) +{ + return lv_color_make(0x00, 0x00, 0x00); +} + +void lv_color_premultiply(lv_color32_t * c) +{ + if(c->alpha == LV_OPA_COVER) { + return; + } + + if(c->alpha == LV_OPA_TRANSP) { + lv_memzero(c, sizeof(lv_color32_t)); + return; + } + + c->red = LV_OPA_MIX2(c->red, c->alpha); + c->green = LV_OPA_MIX2(c->green, c->alpha); + c->blue = LV_OPA_MIX2(c->blue, c->alpha); +} + +void lv_color16_premultiply(lv_color16_t * c, lv_opa_t a) +{ + if(a == LV_OPA_COVER) { + return; + } + + if(a == LV_OPA_TRANSP) { + lv_memzero(c, sizeof(lv_color16_t)); + return; + } + + c->red = LV_OPA_MIX2(c->red, a); + c->green = LV_OPA_MIX2(c->green, a); + c->blue = LV_OPA_MIX2(c->blue, a); +} + +uint8_t lv_color_luminance(lv_color_t c) +{ + return (uint8_t)((uint16_t)(77u * c.red + 151u * c.green + 28u * c.blue) >> 8); +} + +uint8_t lv_color16_luminance(const lv_color16_t c) +{ + return (uint8_t)((uint16_t)(635u * c.red + 613u * c.green + 231u * c.blue) >> 8); +} + +uint8_t lv_color24_luminance(const uint8_t * c) +{ + return (uint8_t)((uint16_t)(77u * c[2] + 151u * c[1] + 28u * c[0]) >> 8); +} + +uint8_t lv_color32_luminance(lv_color32_t c) +{ + return (uint8_t)((uint16_t)(77u * c.red + 151u * c.green + 28u * c.blue) >> 8); +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Helper function to easily create color filters + * @param dsc pointer to a color filter descriptor + * @param c the color to modify + * @param opa the intensity of the modification + * - LV_OPA_50: do nothing + * - < LV_OPA_50: darken + * - LV_OPA_0: fully black + * - > LV_OPA_50: lighten + * - LV_OPA_100: fully white + * @return the modified color + */ +static lv_color_t lv_color_filter_shade_cb(const lv_color_filter_dsc_t * dsc, lv_color_t c, lv_opa_t opa) +{ + LV_UNUSED(dsc); + if(opa == LV_OPA_50) return c; + if(opa < LV_OPA_50) return lv_color_lighten(c, (LV_OPA_50 - opa) * 2); + else return lv_color_darken(c, (opa - LV_OPA_50 * LV_OPA_50) * 2); +} diff --git a/inc/lvgl/src/misc/lv_color.h b/inc/lvgl/src/misc/lv_color.h new file mode 100644 index 0000000..22a8de5 --- /dev/null +++ b/inc/lvgl/src/misc/lv_color.h @@ -0,0 +1,494 @@ +/** + * @file lv_color.h + * + */ + +#ifndef LV_COLOR_H +#define LV_COLOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_assert.h" +#include "lv_math.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ +LV_EXPORT_CONST_INT(LV_COLOR_DEPTH); + +#if LV_COLOR_DEPTH == 8 +#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 2 +#elif LV_COLOR_DEPTH == 16 +#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 3 +#elif LV_COLOR_DEPTH == 24 +#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 +#elif LV_COLOR_DEPTH == 32 +#define LV_COLOR_NATIVE_WITH_ALPHA_SIZE 4 +#endif + +/** + * Opacity percentages. + */ + +enum _lv_opacity_level_t { + LV_OPA_TRANSP = 0, + LV_OPA_0 = 0, + LV_OPA_10 = 25, + LV_OPA_20 = 51, + LV_OPA_30 = 76, + LV_OPA_40 = 102, + LV_OPA_50 = 127, + LV_OPA_60 = 153, + LV_OPA_70 = 178, + LV_OPA_80 = 204, + LV_OPA_90 = 229, + LV_OPA_100 = 255, + LV_OPA_COVER = 255, +}; + +#define LV_OPA_MIN 2 /**< Fully transparent if opa <= LV_OPA_MIN */ +#define LV_OPA_MAX 253 /**< Fully cover if opa >= LV_OPA_MAX */ + +/** + * Get the pixel size of a color format in bits, bpp + * @param cf a color format (`LV_COLOR_FORMAT_...`) + * @return the pixel size in bits + * @sa lv_color_format_get_bpp + */ +#define LV_COLOR_FORMAT_GET_BPP(cf) ( \ + (cf) == LV_COLOR_FORMAT_I1 ? 1 : \ + (cf) == LV_COLOR_FORMAT_A1 ? 1 : \ + (cf) == LV_COLOR_FORMAT_I2 ? 2 : \ + (cf) == LV_COLOR_FORMAT_A2 ? 2 : \ + (cf) == LV_COLOR_FORMAT_I4 ? 4 : \ + (cf) == LV_COLOR_FORMAT_A4 ? 4 : \ + (cf) == LV_COLOR_FORMAT_NEMA_TSC4 ? 4 : \ + (cf) == LV_COLOR_FORMAT_NEMA_TSC6 ? 6 : \ + (cf) == LV_COLOR_FORMAT_NEMA_TSC6A ? 6 : \ + (cf) == LV_COLOR_FORMAT_NEMA_TSC6AP ? 6 : \ + (cf) == LV_COLOR_FORMAT_L8 ? 8 : \ + (cf) == LV_COLOR_FORMAT_A8 ? 8 : \ + (cf) == LV_COLOR_FORMAT_I8 ? 8 : \ + (cf) == LV_COLOR_FORMAT_ARGB2222 ? 8 : \ + (cf) == LV_COLOR_FORMAT_NEMA_TSC12 ? 12 : \ + (cf) == LV_COLOR_FORMAT_NEMA_TSC12A ? 12 : \ + (cf) == LV_COLOR_FORMAT_AL88 ? 16 : \ + (cf) == LV_COLOR_FORMAT_RGB565 ? 16 : \ + (cf) == LV_COLOR_FORMAT_RGB565_SWAPPED ? 16 : \ + (cf) == LV_COLOR_FORMAT_RGB565A8 ? 16 : \ + (cf) == LV_COLOR_FORMAT_YUY2 ? 16 : \ + (cf) == LV_COLOR_FORMAT_ARGB1555 ? 16 : \ + (cf) == LV_COLOR_FORMAT_ARGB4444 ? 16 : \ + (cf) == LV_COLOR_FORMAT_ARGB8565 ? 24 : \ + (cf) == LV_COLOR_FORMAT_RGB888 ? 24 : \ + (cf) == LV_COLOR_FORMAT_ARGB8888 ? 32 : \ + (cf) == LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED ? 32 : \ + (cf) == LV_COLOR_FORMAT_XRGB8888 ? 32 : \ + 0 \ + ) + +/** + * Get the pixel size of a color format in bytes + * @param cf a color format (`LV_COLOR_FORMAT_...`) + * @return the pixel size in bytes + * @sa lv_color_format_get_size + */ +#define LV_COLOR_FORMAT_GET_SIZE(cf) ((LV_COLOR_FORMAT_GET_BPP(cf) + 7) >> 3) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; +} lv_color_t; + +typedef struct { + uint16_t blue : 5; + uint16_t green : 6; + uint16_t red : 5; +} lv_color16_t; + +typedef struct { + uint8_t blue; + uint8_t green; + uint8_t red; + uint8_t alpha; +} lv_color32_t; + +typedef struct { + uint16_t h; + uint8_t s; + uint8_t v; +} lv_color_hsv_t; + +typedef struct { + uint8_t lumi; + uint8_t alpha; +} lv_color16a_t; + +typedef enum { + LV_COLOR_FORMAT_UNKNOWN = 0, + + LV_COLOR_FORMAT_RAW = 0x01, + LV_COLOR_FORMAT_RAW_ALPHA = 0x02, + + /*<=1 byte (+alpha) formats*/ + LV_COLOR_FORMAT_L8 = 0x06, + LV_COLOR_FORMAT_I1 = 0x07, + LV_COLOR_FORMAT_I2 = 0x08, + LV_COLOR_FORMAT_I4 = 0x09, + LV_COLOR_FORMAT_I8 = 0x0A, + LV_COLOR_FORMAT_A8 = 0x0E, + + /*2 byte (+alpha) formats*/ + LV_COLOR_FORMAT_RGB565 = 0x12, + LV_COLOR_FORMAT_ARGB8565 = 0x13, /**< Not supported by sw renderer yet. */ + LV_COLOR_FORMAT_RGB565A8 = 0x14, /**< Color array followed by Alpha array*/ + LV_COLOR_FORMAT_AL88 = 0x15, /**< L8 with alpha >*/ + LV_COLOR_FORMAT_RGB565_SWAPPED = 0x1B, + + /*3 byte (+alpha) formats*/ + LV_COLOR_FORMAT_RGB888 = 0x0F, + LV_COLOR_FORMAT_ARGB8888 = 0x10, + LV_COLOR_FORMAT_XRGB8888 = 0x11, + LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED = 0x1A, + + /*Formats not supported by software renderer but kept here so GPU can use it*/ + LV_COLOR_FORMAT_A1 = 0x0B, + LV_COLOR_FORMAT_A2 = 0x0C, + LV_COLOR_FORMAT_A4 = 0x0D, + LV_COLOR_FORMAT_ARGB1555 = 0x16, + LV_COLOR_FORMAT_ARGB4444 = 0x17, + LV_COLOR_FORMAT_ARGB2222 = 0X18, + + /* reference to https://wiki.videolan.org/YUV/ */ + /*YUV planar formats*/ + LV_COLOR_FORMAT_YUV_START = 0x20, + LV_COLOR_FORMAT_I420 = LV_COLOR_FORMAT_YUV_START, /*YUV420 planar(3 plane)*/ + LV_COLOR_FORMAT_I422 = 0x21, /*YUV422 planar(3 plane)*/ + LV_COLOR_FORMAT_I444 = 0x22, /*YUV444 planar(3 plane)*/ + LV_COLOR_FORMAT_I400 = 0x23, /*YUV400 no chroma channel*/ + LV_COLOR_FORMAT_NV21 = 0x24, /*YUV420 planar(2 plane), UV plane in 'V, U, V, U'*/ + LV_COLOR_FORMAT_NV12 = 0x25, /*YUV420 planar(2 plane), UV plane in 'U, V, U, V'*/ + + /*YUV packed formats*/ + LV_COLOR_FORMAT_YUY2 = 0x26, /*YUV422 packed like 'Y U Y V'*/ + LV_COLOR_FORMAT_UYVY = 0x27, /*YUV422 packed like 'U Y V Y'*/ + + LV_COLOR_FORMAT_YUV_END = LV_COLOR_FORMAT_UYVY, + + LV_COLOR_FORMAT_PROPRIETARY_START = 0x30, + + LV_COLOR_FORMAT_NEMA_TSC_START = LV_COLOR_FORMAT_PROPRIETARY_START, + LV_COLOR_FORMAT_NEMA_TSC4 = LV_COLOR_FORMAT_NEMA_TSC_START, + LV_COLOR_FORMAT_NEMA_TSC6 = 0x31, + LV_COLOR_FORMAT_NEMA_TSC6A = 0x32, + LV_COLOR_FORMAT_NEMA_TSC6AP = 0x33, + LV_COLOR_FORMAT_NEMA_TSC12 = 0x34, + LV_COLOR_FORMAT_NEMA_TSC12A = 0x35, + LV_COLOR_FORMAT_NEMA_TSC_END = LV_COLOR_FORMAT_NEMA_TSC12A, + + /*Color formats in which LVGL can render*/ +#if LV_COLOR_DEPTH == 1 + LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_I1, + LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_I1, +#elif LV_COLOR_DEPTH == 8 + LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_L8, + LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_AL88, +#elif LV_COLOR_DEPTH == 16 + LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_RGB565, + LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_RGB565A8, +#elif LV_COLOR_DEPTH == 24 + LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_RGB888, + LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_ARGB8888, +#elif LV_COLOR_DEPTH == 32 + LV_COLOR_FORMAT_NATIVE = LV_COLOR_FORMAT_XRGB8888, + LV_COLOR_FORMAT_NATIVE_WITH_ALPHA = LV_COLOR_FORMAT_ARGB8888, +#else +#error "LV_COLOR_DEPTH should be 1, 8, 16, 24 or 32" +#endif + +} lv_color_format_t; + +#define LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf) ((cf) >= LV_COLOR_FORMAT_A1 && (cf) <= LV_COLOR_FORMAT_A8) +#define LV_COLOR_FORMAT_IS_INDEXED(cf) ((cf) >= LV_COLOR_FORMAT_I1 && (cf) <= LV_COLOR_FORMAT_I8) +#define LV_COLOR_FORMAT_IS_YUV(cf) ((cf) >= LV_COLOR_FORMAT_YUV_START && (cf) <= LV_COLOR_FORMAT_YUV_END) +#define LV_COLOR_INDEXED_PALETTE_SIZE(cf) ((cf) == LV_COLOR_FORMAT_I1 ? 2 :\ + (cf) == LV_COLOR_FORMAT_I2 ? 4 :\ + (cf) == LV_COLOR_FORMAT_I4 ? 16 :\ + (cf) == LV_COLOR_FORMAT_I8 ? 256 : 0) + +/********************** + * MACROS + **********************/ + +#define LV_COLOR_MAKE(r8, g8, b8) {b8, g8, r8} + +#define LV_OPA_MIX2(a1, a2) ((lv_opa_t)(((int32_t)(a1) * (a2)) >> 8)) +#define LV_OPA_MIX3(a1, a2, a3) ((lv_opa_t)(((int32_t)(a1) * (a2) * (a3)) >> 16)) + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get the pixel size of a color format in bits, bpp + * @param cf a color format (`LV_COLOR_FORMAT_...`) + * @return the pixel size in bits + * @sa LV_COLOR_FORMAT_GET_BPP + */ +uint8_t lv_color_format_get_bpp(lv_color_format_t cf); + +/** + * Get the pixel size of a color format in bytes + * @param cf a color format (`LV_COLOR_FORMAT_...`) + * @return the pixel size in bytes + * @sa LV_COLOR_FORMAT_GET_SIZE + */ +uint8_t lv_color_format_get_size(lv_color_format_t cf); + +/** + * Check if a color format has alpha channel or not + * @param src_cf a color format (`LV_COLOR_FORMAT_...`) + * @return true: has alpha channel; false: doesn't have alpha channel + */ +bool lv_color_format_has_alpha(lv_color_format_t src_cf); + +/** + * Create an ARGB8888 color from RGB888 + alpha + * @param color an RGB888 color + * @param opa the alpha value + * @return the ARGB8888 color + */ +lv_color32_t lv_color_to_32(lv_color_t color, lv_opa_t opa); + +/** + * Convert an RGB888 color to an integer + * @param c an RGB888 color + * @return `c` as an integer + */ +uint32_t lv_color_to_int(lv_color_t c); + +/** + * Check if two RGB888 color are equal + * @param c1 the first color + * @param c2 the second color + * @return true: equal + */ +bool lv_color_eq(lv_color_t c1, lv_color_t c2); + +/** + * Check if two ARGB8888 color are equal + * @param c1 the first color + * @param c2 the second color + * @return true: equal + */ +bool lv_color32_eq(lv_color32_t c1, lv_color32_t c2); + +/** + * Create a color from 0x000000..0xffffff input + * @param c the hex input + * @return the color + */ +lv_color_t lv_color_hex(uint32_t c); + +/** + * Create an RGB888 color + * @param r the red channel (0..255) + * @param g the green channel (0..255) + * @param b the blue channel (0..255) + * @return the color + */ +lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b); + +/** + * Create an ARGB8888 color + * @param r the red channel (0..255) + * @param g the green channel (0..255) + * @param b the blue channel (0..255) + * @param a the alpha channel (0..255) + * @return the color + */ +lv_color32_t lv_color32_make(uint8_t r, uint8_t g, uint8_t b, uint8_t a); + +/** + * Create a color from 0x000..0xfff input + * @param c the hex input (e.g. 0x123 will be 0x112233) + * @return the color + */ +lv_color_t lv_color_hex3(uint32_t c); + +/** + * Check if a color with an RGB888 color is within the color range defined by l_color and h_color. + * @param color the color to check + * @param l_color the lower bound color + * @param h_color the upper bound color + * @return true: pixel is within the color range + */ +static inline bool lv_color_is_in_range(lv_color_t color, lv_color_t l_color, lv_color_t h_color) +{ + return (color.red <= h_color.red && + color.green <= h_color.green && + color.blue <= h_color.blue && + color.red >= l_color.red && + color.green >= l_color.green && + color.blue >= l_color.blue); +} + +/** + * Convert a RGB565 color to RGB888 + * @param c a RGB565 color on lv_color16_t + * @return the color + */ +static inline lv_color_t lv_color16_to_color(lv_color16_t c) +{ + return lv_color_make(c.red << 3, c.green << 2, c.blue << 3); +} + +/** + * Convert am RGB888 color to RGB565 stored in `uint16_t` + * @param color and RGB888 color + * @return `color` as RGB565 on `uin16_t` + */ +uint16_t lv_color_to_u16(lv_color_t color); + +/** + * Convert am RGB888 color to XRGB8888 stored in `uint32_t` + * @param color and RGB888 color + * @return `color` as XRGB8888 on `uin32_t` (the alpha channel is always set to 0xFF) + */ +uint32_t lv_color_to_u32(lv_color_t color); + +/** + * Mix two RGB565 colors + * @param c1 the first color (typically the foreground color) + * @param c2 the second color (typically the background color) + * @param mix 0..255, or LV_OPA_0/10/20... + * @return mix == 0: c2 + * mix == 255: c1 + * mix == 128: 0.5 x c1 + 0.5 x c2 + */ +uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix); + +/** + * Mix white to a color + * @param c the base color + * @param lvl the intensity of white (0: no change, 255: fully white) + * @return the mixed color + */ +lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl); + +/** + * Mix black to a color + * @param c the base color + * @param lvl the intensity of black (0: no change, 255: fully black) + * @return the mixed color + */ +lv_color_t lv_color_darken(lv_color_t c, lv_opa_t lvl); + +/** + * Convert a HSV color to RGB + * @param h hue [0..359] + * @param s saturation [0..100] + * @param v value [0..100] + * @return the given RGB color in RGB (with LV_COLOR_DEPTH depth) + */ +lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v); + +/** + * Convert a 32-bit RGB color to HSV + * @param r8 8-bit red + * @param g8 8-bit green + * @param b8 8-bit blue + * @return the given RGB color in HSV + */ +lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8); + +/** + * Convert a color to HSV + * @param color color + * @return the given color in HSV + */ +lv_color_hsv_t lv_color_to_hsv(lv_color_t color); + +/*Source: https://vuetifyjs.com/en/styles/colors/#material-colors*/ + +/** + * A helper for white color + * @return a white color + */ +lv_color_t lv_color_white(void); + +/** + * A helper for black color + * @return a black color + */ +lv_color_t lv_color_black(void); + +void lv_color_premultiply(lv_color32_t * c); + +void lv_color16_premultiply(lv_color16_t * c, lv_opa_t a); + +/** + * Get the luminance of a color: luminance = 0.3 R + 0.59 G + 0.11 B + * @param c a color + * @return the brightness [0..255] + */ +uint8_t lv_color_luminance(lv_color_t c); + +/** + * Get the luminance of a color16: luminance = 0.3 R + 0.59 G + 0.11 B + * @param c a color + * @return the brightness [0..255] + */ +uint8_t lv_color16_luminance(const lv_color16_t c); + +/** + * Get the luminance of a color24: luminance = 0.3 R + 0.59 G + 0.11 B + * @param c a color + * @return the brightness [0..255] + */ +uint8_t lv_color24_luminance(const uint8_t * c); + +/** + * Get the luminance of a color32: luminance = 0.3 R + 0.59 G + 0.11 B + * @param c a color + * @return the brightness [0..255] + */ +uint8_t lv_color32_luminance(lv_color32_t c); + + +/** + * Swap the endianness of an rgb565 color + * @param c a color + * @return the swapped color + */ +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_swap_16(uint16_t c) +{ + return (c >> 8) | (c << 8); +} + +/********************** + * MACROS + **********************/ + +#include "lv_palette.h" +#include "lv_color_op.h" + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_color_filter_dsc_t lv_color_filter_shade; + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_COLOR_H*/ diff --git a/inc/lvgl/src/misc/lv_color_op.c b/inc/lvgl/src/misc/lv_color_op.c new file mode 100644 index 0000000..cf0f77c --- /dev/null +++ b/inc/lvgl/src/misc/lv_color_op.c @@ -0,0 +1,114 @@ +/** + * @file lv_color_op.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_color_op_private.h" +#include "lv_log.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) +{ + lv_color_t ret; + + ret.red = LV_UDIV255((uint16_t)c1.red * mix + c2.red * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); + ret.green = LV_UDIV255((uint16_t)c1.green * mix + c2.green * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); + ret.blue = LV_UDIV255((uint16_t)c1.blue * mix + c2.blue * (255 - mix) + LV_COLOR_MIX_ROUND_OFS); + return ret; +} + +lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg) +{ + if(fg.alpha >= LV_OPA_MAX) { + fg.alpha = bg.alpha; + return fg; + } + if(fg.alpha <= LV_OPA_MIN) { + return bg; + } + bg.red = LV_UDIV255((uint32_t)((uint32_t)fg.red * fg.alpha + (uint32_t)bg.red * (255 - fg.alpha))); + bg.green = LV_UDIV255((uint32_t)((uint32_t)fg.green * fg.alpha + (uint32_t)bg.green * (255 - fg.alpha))); + bg.blue = LV_UDIV255((uint32_t)((uint32_t)fg.blue * fg.alpha + (uint32_t)bg.blue * (255 - fg.alpha))); + return bg; +} + +lv_color32_t lv_color_mix32_premultiplied(lv_color32_t fg, lv_color32_t bg) +{ + if(fg.alpha >= LV_OPA_MAX) { + return fg; /* Fully opaque foreground replaces background */ + } + if(fg.alpha <= LV_OPA_MIN) { + return bg; /* Fully transparent foreground, return background */ + } + + uint32_t inv_fg_alpha = LV_OPA_MAX - fg.alpha; + + /* Premultiplied blending */ + bg.red = fg.red + ((bg.red * inv_fg_alpha) >> 8); + bg.green = fg.green + ((bg.green * inv_fg_alpha) >> 8); + bg.blue = fg.blue + ((bg.blue * inv_fg_alpha) >> 8); + + return bg; +} + +uint8_t lv_color_brightness(lv_color_t c) +{ + uint16_t bright = (uint16_t)(3u * c.red + c.green + 4u * c.blue); + return (uint8_t)(bright >> 3); +} + +void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb) +{ + dsc->filter_cb = cb; +} + +lv_color32_t lv_color_over32(lv_color32_t fg, lv_color32_t bg) +{ + if(fg.alpha >= LV_OPA_MAX || bg.alpha <= LV_OPA_MIN) { + return fg; + } + else if(fg.alpha <= LV_OPA_MIN) { + return bg; + } + else if(bg.alpha == 255) { + return lv_color_mix32(fg, bg); + } + + lv_opa_t res_alpha = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha); + lv_opa_t ratio = (uint32_t)((uint32_t)fg.alpha * 255) / res_alpha; + fg.alpha = ratio; + lv_color32_t res = lv_color_mix32(fg, bg); + res.alpha = res_alpha; + + return res; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/misc/lv_color_op.h b/inc/lvgl/src/misc/lv_color_op.h new file mode 100644 index 0000000..0c28c0b --- /dev/null +++ b/inc/lvgl/src/misc/lv_color_op.h @@ -0,0 +1,105 @@ +/** + * @file lv_color_op.h + * + */ + +#ifndef LV_COLOR_OP_H +#define LV_COLOR_OP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_assert.h" +#include "lv_math.h" +#include "lv_color.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_color_filter_dsc_t; + +typedef lv_color_t (*lv_color_filter_cb_t)(const struct _lv_color_filter_dsc_t *, lv_color_t, lv_opa_t); + +struct _lv_color_filter_dsc_t { + lv_color_filter_cb_t filter_cb; + void * user_data; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Mix two colors with a given ratio. + * @param c1 the first color to mix (usually the foreground) + * @param c2 the second color to mix (usually the background) + * @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2` + * @return the mixed color + */ +lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix); + +/** + * + * @param fg + * @param bg + * @return + * @note Use bg.alpha in the return value + * @note Use fg.alpha as mix ratio + */ +lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg); + +/** + * @brief Blends two premultiplied ARGB8888 colors while maintaining correct alpha compositing. + * + * This function correctly blends the foreground (fg) and background (bg) colors, + * ensuring that the output remains in a premultiplied alpha format. + * + * @param fg The foreground color in premultiplied ARGB8888 format. + * @param bg The background color in premultiplied ARGB8888 format. + * @return The resulting blended color in premultiplied ARGB8888 format. + * + * @note If the foreground is fully opaque, it is returned as is. + * @note If the foreground is fully transparent, the background is returned. + */ +lv_color32_t lv_color_mix32_premultiplied(lv_color32_t fg, lv_color32_t bg); + +/** + * Get the brightness of a color + * @param c a color + * @return brightness in range [0..255] + */ +uint8_t lv_color_brightness(lv_color_t c); + +void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb); + +/** + * Blend two colors that have not been pre-multiplied using their alpha values + * @param fg the foreground color + * @param bg the background color + * @return result color + */ +lv_color32_t lv_color_over32(lv_color32_t fg, lv_color32_t bg); + +/********************** + * PREDEFINED COLORS + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_COLOR_OP_H*/ diff --git a/inc/lvgl/src/misc/lv_color_op_private.h b/inc/lvgl/src/misc/lv_color_op_private.h new file mode 100644 index 0000000..d6516eb --- /dev/null +++ b/inc/lvgl/src/misc/lv_color_op_private.h @@ -0,0 +1,39 @@ +/** + * @file lv_color_op_private.h + * + */ + +#ifndef LV_COLOR_OP_PRIVATE_H +#define LV_COLOR_OP_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_color_op.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_COLOR_OP_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_event.c b/inc/lvgl/src/misc/lv_event.c new file mode 100644 index 0000000..39c17ff --- /dev/null +++ b/inc/lvgl/src/misc/lv_event.c @@ -0,0 +1,485 @@ +/** + * @file lv_event.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_event_private.h" +#include "../core/lv_global.h" +#include "../stdlib/lv_mem.h" +#include "lv_assert.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +#define event_head LV_GLOBAL_DEFAULT()->event_header +#define event_last_id LV_GLOBAL_DEFAULT()->event_last_register_id + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/* Traverse the list to delete the objects marked for deletion */ +static void cleanup_event_list(lv_event_list_t * list); +static void cleanup_event_list_core(lv_array_t * array); + +static void event_mark_deleting(lv_event_list_t * list, lv_event_dsc_t * dsc); +static bool event_is_marked_deleting(lv_event_dsc_t * dsc); +static uint32_t event_array_size(lv_event_list_t * list); +static lv_event_dsc_t ** event_array_at(lv_event_list_t * list, uint32_t index); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#if LV_USE_LOG && LV_LOG_TRACE_EVENT + #define LV_TRACE_EVENT(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_EVENT(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#if LV_USE_EXT_DATA +void lv_event_desc_set_external_data(lv_event_dsc_t * dsc, void * data, void (* free_cb)(void * data)) +{ + if(!dsc) { + LV_LOG_WARN("Can't attach external user data and destructor callback to a NULL event descriptor"); + return; + } + + dsc->ext_data.data = data; + dsc->ext_data.free_cb = free_cb; +} +#endif + +void lv_event_push(lv_event_t * e) +{ + /*Build a simple linked list from the objects used in the events + *It's important to know if this object was deleted by a nested event + *called from this `event_cb`.*/ + e->prev = event_head; + event_head = e; + +} + +void lv_event_pop(lv_event_t * e) +{ + event_head = e->prev; +} + +lv_result_t lv_event_push_and_send(lv_event_list_t * event_list, lv_event_code_t code, void * original_target, + void * param) +{ + LV_ASSERT_NULL(event_list); + lv_event_t e; + lv_memzero(&e, sizeof(e)); + e.code = code; + e.current_target = original_target; + e.original_target = original_target; + e.param = param; + + lv_event_push(&e); + lv_result_t res = lv_event_send(event_list, &e, true); + if(res != LV_RESULT_OK) goto ret; + + res = lv_event_send(event_list, &e, false); + if(res != LV_RESULT_OK) goto ret; + +ret: + lv_event_pop(&e); + return res; +} + +lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preprocess) +{ + if(list == NULL) return LV_RESULT_OK; + if(e->deleted) return LV_RESULT_INVALID; + + /* When obj is deleted in its own event, it will cause the `list->array` header to be released, + * but the content still exists, which leads to memory leakage. + * Therefore, back up the header in advance, + * which can strive to release the memory and prevent used-after-free. */ + lv_array_t back_array_head = list->array; + + /* Dealing with the problem of nested event deletion event */ + const bool is_traversing = list->is_traversing; + list->is_traversing = true; + + lv_result_t res = LV_RESULT_OK; + const uint32_t size = event_array_size(list); + for(uint32_t i = 0; i < size && !e->deleted; i++) { + lv_event_dsc_t * dsc = *event_array_at(list, i); + if(dsc->cb == NULL) continue; + if(event_is_marked_deleting(dsc)) continue; + const bool is_preprocessed = (dsc->filter & LV_EVENT_PREPROCESS) != 0; + if(is_preprocessed != preprocess) continue; + lv_event_code_t filter = dsc->filter & ~LV_EVENT_PREPROCESS; + if(filter == LV_EVENT_ALL || filter == e->code) { + e->user_data = dsc->user_data; +#if LV_USE_EXT_DATA + e->ext_data.data = dsc->ext_data.data; +#endif + dsc->cb(e); + if(e->stop_processing) break; + + /*Stop if the object is deleted*/ + if(e->deleted) { + res = LV_RESULT_INVALID; + break; + } + } + } + + if(is_traversing) return res; + + if(e->deleted) cleanup_event_list_core(&back_array_head); + else { + list->is_traversing = false; + cleanup_event_list(list); + } + + return res; +} + +lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, + void * user_data) +{ + lv_event_dsc_t * dsc = lv_malloc(sizeof(lv_event_dsc_t)); + LV_ASSERT_NULL(dsc); + + dsc->cb = cb; + dsc->filter = filter; + dsc->user_data = user_data; +#if LV_USE_EXT_DATA + dsc->ext_data.free_cb = NULL; + dsc->ext_data.data = NULL; +#endif + + if(event_array_size(list) == 0) { + /*event list hasn't been initialized.*/ + lv_array_init(&list->array, 1, sizeof(lv_event_dsc_t *)); + } + + lv_array_push_back(&list->array, &dsc); + return dsc; +} + +bool lv_event_remove_dsc(lv_event_list_t * list, lv_event_dsc_t * dsc) +{ + LV_ASSERT_NULL(list); + LV_ASSERT_NULL(dsc); + + const uint32_t size = event_array_size(list); + for(uint32_t i = 0; i < size; i++) { + lv_event_dsc_t * event = *event_array_at(list, i); + if(event == dsc) { +#if LV_USE_EXT_DATA + if(dsc->ext_data.free_cb) { + dsc->ext_data.free_cb(dsc->ext_data.data); + dsc->ext_data.data = NULL; + } +#endif + event_mark_deleting(list, event); + cleanup_event_list(list); + return true; + } + } + + return false; +} + +uint32_t lv_event_get_count(lv_event_list_t * list) +{ + LV_ASSERT_NULL(list); + return event_array_size(list); +} + +lv_event_dsc_t * lv_event_get_dsc(lv_event_list_t * list, uint32_t index) +{ + LV_ASSERT_NULL(list); + lv_event_dsc_t ** dsc = event_array_at(list, index); + return dsc ? *dsc : NULL; +} + +lv_event_cb_t lv_event_dsc_get_cb(lv_event_dsc_t * dsc) +{ + LV_ASSERT_NULL(dsc); + return dsc->cb; +} + +void * lv_event_dsc_get_user_data(lv_event_dsc_t * dsc) +{ + LV_ASSERT_NULL(dsc); + return dsc->user_data; + +} + +bool lv_event_remove(lv_event_list_t * list, uint32_t index) +{ + LV_ASSERT_NULL(list); + lv_event_dsc_t * dsc = lv_event_get_dsc(list, index); + if(dsc == NULL) return false; +#if LV_USE_EXT_DATA + if(dsc->ext_data.free_cb) { + dsc->ext_data.free_cb(dsc->ext_data.data); + dsc->ext_data.data = NULL; + } +#endif + event_mark_deleting(list, dsc); + cleanup_event_list(list); + return true; +} + +void lv_event_remove_all(lv_event_list_t * list) +{ + LV_ASSERT_NULL(list); + const uint32_t size = event_array_size(list); + for(uint32_t i = 0; i < size; i++) { +#if LV_USE_EXT_DATA + lv_event_dsc_t * dsc = lv_event_get_dsc(list, i); + if(dsc && dsc->ext_data.free_cb) { + dsc->ext_data.free_cb(dsc->ext_data.data); + dsc->ext_data.data = NULL; + } +#endif + event_mark_deleting(list, *event_array_at(list, i)); + } + + cleanup_event_list(list); +} + +void * lv_event_get_current_target(lv_event_t * e) +{ + return e->current_target; +} + +void * lv_event_get_target(lv_event_t * e) +{ + return e->original_target; +} + +lv_event_code_t lv_event_get_code(lv_event_t * e) +{ + return e->code & ~LV_EVENT_PREPROCESS; +} + +void * lv_event_get_param(lv_event_t * e) +{ + return e->param; +} + +void * lv_event_get_user_data(lv_event_t * e) +{ + return e->user_data; +} + +void lv_event_stop_bubbling(lv_event_t * e) +{ + e->stop_bubbling = 1; +} + +void lv_event_stop_trickling(lv_event_t * e) +{ + e->stop_trickling = 1; +} + +void lv_event_stop_processing(lv_event_t * e) +{ + e->stop_processing = 1; +} + +void lv_event_free_user_data_cb(lv_event_t * e) +{ + void * p = lv_event_get_user_data(e); + lv_free(p); +} + +uint32_t lv_event_register_id(void) +{ + event_last_id ++; + return event_last_id; +} + +void lv_event_mark_deleted(void * target) +{ + lv_event_t * e = event_head; + + while(e) { + if(e->original_target == target || e->current_target == target) e->deleted = 1; + e = e->prev; + } +} + +const char * lv_event_code_get_name(lv_event_code_t code) +{ + /*Remove the preprocess flag*/ + code &= ~LV_EVENT_PREPROCESS; + +#define ENUM_CASE(x) case LV_##x: return #x + + switch(code) { + ENUM_CASE(EVENT_ALL); + + /** Input device events*/ + ENUM_CASE(EVENT_PRESSED); + ENUM_CASE(EVENT_PRESSING); + ENUM_CASE(EVENT_PRESS_LOST); + ENUM_CASE(EVENT_SHORT_CLICKED); + ENUM_CASE(EVENT_SINGLE_CLICKED); + ENUM_CASE(EVENT_DOUBLE_CLICKED); + ENUM_CASE(EVENT_TRIPLE_CLICKED); + ENUM_CASE(EVENT_LONG_PRESSED); + ENUM_CASE(EVENT_LONG_PRESSED_REPEAT); + ENUM_CASE(EVENT_CLICKED); + ENUM_CASE(EVENT_RELEASED); + ENUM_CASE(EVENT_SCROLL_BEGIN); + ENUM_CASE(EVENT_SCROLL_THROW_BEGIN); + ENUM_CASE(EVENT_SCROLL_END); + ENUM_CASE(EVENT_SCROLL); + ENUM_CASE(EVENT_GESTURE); + ENUM_CASE(EVENT_KEY); + ENUM_CASE(EVENT_ROTARY); + ENUM_CASE(EVENT_FOCUSED); + ENUM_CASE(EVENT_DEFOCUSED); + ENUM_CASE(EVENT_LEAVE); + ENUM_CASE(EVENT_HIT_TEST); + ENUM_CASE(EVENT_INDEV_RESET); + ENUM_CASE(EVENT_HOVER_OVER); + ENUM_CASE(EVENT_HOVER_LEAVE); + + /** Drawing events*/ + ENUM_CASE(EVENT_COVER_CHECK); + ENUM_CASE(EVENT_REFR_EXT_DRAW_SIZE); + ENUM_CASE(EVENT_DRAW_MAIN_BEGIN); + ENUM_CASE(EVENT_DRAW_MAIN); + ENUM_CASE(EVENT_DRAW_MAIN_END); + ENUM_CASE(EVENT_DRAW_POST_BEGIN); + ENUM_CASE(EVENT_DRAW_POST); + ENUM_CASE(EVENT_DRAW_POST_END); + ENUM_CASE(EVENT_DRAW_TASK_ADDED); + + /** Special events*/ + ENUM_CASE(EVENT_VALUE_CHANGED); + ENUM_CASE(EVENT_INSERT); + ENUM_CASE(EVENT_REFRESH); + ENUM_CASE(EVENT_READY); + ENUM_CASE(EVENT_CANCEL); + ENUM_CASE(EVENT_STATE_CHANGED); + + /** Other events*/ + ENUM_CASE(EVENT_CREATE); + ENUM_CASE(EVENT_DELETE); + ENUM_CASE(EVENT_CHILD_CHANGED); + ENUM_CASE(EVENT_CHILD_CREATED); + ENUM_CASE(EVENT_CHILD_DELETED); + ENUM_CASE(EVENT_SCREEN_UNLOAD_START); + ENUM_CASE(EVENT_SCREEN_LOAD_START); + ENUM_CASE(EVENT_SCREEN_LOADED); + ENUM_CASE(EVENT_SCREEN_UNLOADED); + ENUM_CASE(EVENT_SIZE_CHANGED); + ENUM_CASE(EVENT_STYLE_CHANGED); + ENUM_CASE(EVENT_LAYOUT_CHANGED); + ENUM_CASE(EVENT_GET_SELF_SIZE); + ENUM_CASE(EVENT_UPDATE_LAYOUT_COMPLETED); + + /** Events of optional LVGL components*/ + ENUM_CASE(EVENT_INVALIDATE_AREA); + ENUM_CASE(EVENT_RESOLUTION_CHANGED); + ENUM_CASE(EVENT_COLOR_FORMAT_CHANGED); + ENUM_CASE(EVENT_REFR_REQUEST); + ENUM_CASE(EVENT_REFR_START); + ENUM_CASE(EVENT_REFR_READY); + ENUM_CASE(EVENT_RENDER_START); + ENUM_CASE(EVENT_RENDER_READY); + ENUM_CASE(EVENT_FLUSH_START); + ENUM_CASE(EVENT_FLUSH_FINISH); + ENUM_CASE(EVENT_FLUSH_WAIT_START); + ENUM_CASE(EVENT_FLUSH_WAIT_FINISH); + + ENUM_CASE(EVENT_VSYNC); + ENUM_CASE(EVENT_VSYNC_REQUEST); + +#if LV_USE_TRANSLATION + ENUM_CASE(EVENT_TRANSLATION_LANGUAGE_CHANGED); +#endif /*LV_USE_TRANSLATION*/ + + /* Special event flags */ + case LV_EVENT_LAST: + case LV_EVENT_PREPROCESS: + case LV_EVENT_MARKED_DELETING: + break; + + /* Note that default is not added here because when adding new event code, + * if forget to add case, the compiler will automatically report a warning. + */ + } + +#undef ENUM_CASE + + return "EVENT_UNKNOWN"; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void cleanup_event_list_core(lv_array_t * array) +{ + const uint32_t size = lv_array_size(array); + uint32_t kept_count = 0; + for(uint32_t i = 0; i < size; i++) { + lv_event_dsc_t ** dsc_i = lv_array_at(array, i); + lv_event_dsc_t ** dsc_kept = lv_array_at(array, kept_count); + if(event_is_marked_deleting(*dsc_i)) lv_free(*dsc_i); + else { + *dsc_kept = *dsc_i; + kept_count++; + } + } + + if(kept_count == 0) lv_array_deinit(array); + else lv_array_resize(array, kept_count); +} + +static void cleanup_event_list(lv_event_list_t * list) +{ + if(list->is_traversing) return; + if(list->has_marked_deleting == false) return; + + cleanup_event_list_core(&list->array); + + list->has_marked_deleting = false; +} + +static void event_mark_deleting(lv_event_list_t * list, lv_event_dsc_t * dsc) +{ + list->has_marked_deleting = true; + dsc->filter |= LV_EVENT_MARKED_DELETING; +} +static bool event_is_marked_deleting(lv_event_dsc_t * dsc) +{ + return (dsc->filter & LV_EVENT_MARKED_DELETING) != 0; +} +static uint32_t event_array_size(lv_event_list_t * list) +{ + return lv_array_size(&list->array); +} +static lv_event_dsc_t ** event_array_at(lv_event_list_t * list, uint32_t index) +{ + return lv_array_at(&list->array, index); +} diff --git a/inc/lvgl/src/misc/lv_event.h b/inc/lvgl/src/misc/lv_event.h new file mode 100644 index 0000000..be5d0f0 --- /dev/null +++ b/inc/lvgl/src/misc/lv_event.h @@ -0,0 +1,269 @@ +/** + * @file lv_event.h + * + */ + +#ifndef LV_EVENT_H +#define LV_EVENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_types.h" +#include "../lv_conf_internal.h" + +#include "lv_array.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef void (*lv_event_cb_t)(lv_event_t * e); + +/** + * Type of event being sent to Widget + */ +typedef enum { + LV_EVENT_ALL = 0, + + /** Input device events*/ + LV_EVENT_PRESSED, /**< Widget has been pressed */ + LV_EVENT_PRESSING, /**< Widget is being pressed (sent continuously while pressing)*/ + LV_EVENT_PRESS_LOST, /**< Widget is still being pressed but slid cursor/finger off Widget */ + LV_EVENT_SHORT_CLICKED, /**< Widget was pressed for a short period of time, then released. Not sent if scrolled. */ + LV_EVENT_SINGLE_CLICKED, /**< Sent for first short click within a small distance and short time */ + LV_EVENT_DOUBLE_CLICKED, /**< Sent for second short click within small distance and short time */ + LV_EVENT_TRIPLE_CLICKED, /**< Sent for third short click within small distance and short time */ + LV_EVENT_LONG_PRESSED, /**< Object has been pressed for at least `long_press_time`. Not sent if scrolled. */ + LV_EVENT_LONG_PRESSED_REPEAT, /**< Sent after `long_press_time` in every `long_press_repeat_time` ms. Not sent if scrolled. */ + LV_EVENT_CLICKED, /**< Sent on release if not scrolled (regardless to long press)*/ + LV_EVENT_RELEASED, /**< Sent in every cases when Widget has been released */ + LV_EVENT_SCROLL_BEGIN, /**< Scrolling begins. The event parameter is a pointer to the animation of the scroll. Can be modified */ + LV_EVENT_SCROLL_THROW_BEGIN, + LV_EVENT_SCROLL_END, /**< Scrolling ends */ + LV_EVENT_SCROLL, /**< Scrolling */ + LV_EVENT_GESTURE, /**< A gesture is detected. Get gesture with `lv_indev_get_gesture_dir(lv_indev_active());` */ + LV_EVENT_KEY, /**< A key is sent to Widget. Get key with `lv_indev_get_key(lv_indev_active());`*/ + LV_EVENT_ROTARY, /**< An encoder or wheel was rotated. Get rotation count with `lv_event_get_rotary_diff(e);`*/ + LV_EVENT_FOCUSED, /**< Widget received focus */ + LV_EVENT_DEFOCUSED, /**< Widget's focus has been lost */ + LV_EVENT_LEAVE, /**< Widget's focus has been lost but is still selected */ + LV_EVENT_HIT_TEST, /**< Perform advanced hit-testing */ + LV_EVENT_INDEV_RESET, /**< Indev has been reset */ + LV_EVENT_HOVER_OVER, /**< Indev hover over object */ + LV_EVENT_HOVER_LEAVE, /**< Indev hover leave object */ + + /** Drawing events */ + LV_EVENT_COVER_CHECK, /**< Check if Widget fully covers an area. The event parameter is `lv_cover_check_info_t *`. */ + LV_EVENT_REFR_EXT_DRAW_SIZE, /**< Get required extra draw area around Widget (e.g. for shadow). The event parameter is `int32_t *` to store the size. */ + LV_EVENT_DRAW_MAIN_BEGIN, /**< Starting the main drawing phase */ + LV_EVENT_DRAW_MAIN, /**< Perform the main drawing */ + LV_EVENT_DRAW_MAIN_END, /**< Finishing the main drawing phase */ + LV_EVENT_DRAW_POST_BEGIN, /**< Starting the post draw phase (when all children are drawn)*/ + LV_EVENT_DRAW_POST, /**< Perform the post draw phase (when all children are drawn)*/ + LV_EVENT_DRAW_POST_END, /**< Finishing the post draw phase (when all children are drawn)*/ + LV_EVENT_DRAW_TASK_ADDED, /**< Adding a draw task. The `LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS` flag needs to be set */ + + /** Special events */ + LV_EVENT_VALUE_CHANGED, /**< Widget's value has changed (i.e. slider moved)*/ + LV_EVENT_INSERT, /**< Text has been inserted into Widget. The event data is `char *` being inserted. */ + LV_EVENT_REFRESH, /**< Notify Widget to refresh something on it (for user)*/ + LV_EVENT_READY, /**< A process has finished */ + LV_EVENT_CANCEL, /**< A process has been cancelled */ + LV_EVENT_STATE_CHANGED, /**< The state of the widget changed*/ + + /** Other events */ + LV_EVENT_CREATE, /**< Object is being created */ + LV_EVENT_DELETE, /**< Object is being deleted */ + LV_EVENT_CHILD_CHANGED, /**< Child was removed, added, or its size, position were changed */ + LV_EVENT_CHILD_CREATED, /**< Child was created, always bubbles up to all parents */ + LV_EVENT_CHILD_DELETED, /**< Child was deleted, always bubbles up to all parents */ + LV_EVENT_SCREEN_UNLOAD_START, /**< A screen unload started, fired immediately when scr_load is called */ + LV_EVENT_SCREEN_LOAD_START, /**< A screen load started, fired when the screen change delay is expired */ + LV_EVENT_SCREEN_LOADED, /**< A screen was loaded */ + LV_EVENT_SCREEN_UNLOADED, /**< A screen was unloaded */ + LV_EVENT_SIZE_CHANGED, /**< Object coordinates/size have changed */ + LV_EVENT_STYLE_CHANGED, /**< Object's style has changed */ + LV_EVENT_LAYOUT_CHANGED, /**< A child's position position has changed due to a layout recalculation */ + LV_EVENT_GET_SELF_SIZE, /**< Get internal size of a widget */ + + /** Events of optional LVGL components */ + LV_EVENT_INVALIDATE_AREA, /**< An area is invalidated (marked for redraw). `lv_event_get_param(e)` + * returns a pointer to an `lv_area_t` object with the coordinates of the + * area to be invalidated. The area can be freely modified if needed to + * adapt it a special requirement of the display. Usually needed with + * monochrome displays to invalidate `N x 8` rows or columns in one pass. */ + LV_EVENT_RESOLUTION_CHANGED, /**< Sent when the resolution changes due to `lv_display_set_resolution()` or `lv_display_set_rotation()`. */ + LV_EVENT_COLOR_FORMAT_CHANGED,/**< Sent as a result of any call to `lv_display_set_color_format()`. */ + LV_EVENT_REFR_REQUEST, /**< Sent when something happened that requires redraw. */ + LV_EVENT_REFR_START, /**< Sent before a refreshing cycle starts. Sent even if there is nothing to redraw. */ + LV_EVENT_REFR_READY, /**< Sent when refreshing has been completed (after rendering and calling flush callback). Sent even if no redraw happened. */ + LV_EVENT_RENDER_START, /**< Sent just before rendering begins. */ + LV_EVENT_RENDER_READY, /**< Sent after rendering has been completed. */ + LV_EVENT_FLUSH_START, /**< Sent before flush callback is called. */ + LV_EVENT_FLUSH_FINISH, /**< Sent after flush callback call has returned. */ + LV_EVENT_FLUSH_WAIT_START, /**< Sent before flush wait callback is called. */ + LV_EVENT_FLUSH_WAIT_FINISH, /**< Sent after flush wait callback call has returned. */ + LV_EVENT_UPDATE_LAYOUT_COMPLETED, /**< Sent after layout update completes*/ + + LV_EVENT_VSYNC, + LV_EVENT_VSYNC_REQUEST, +#if LV_USE_TRANSLATION + LV_EVENT_TRANSLATION_LANGUAGE_CHANGED, /**< Sent when the translation language changed. */ +#endif /*LV_USE_TRANSLATION*/ + + LV_EVENT_LAST, /** Number of default events */ + + LV_EVENT_PREPROCESS = 0x8000, /** This is a flag that can be set with an event so it's processed + before the class default event processing */ + LV_EVENT_MARKED_DELETING = 0x10000, +} lv_event_code_t; + +typedef struct { + lv_array_t array; + uint8_t is_traversing: 1; /**< True: the list is being nested traversed */ + uint8_t has_marked_deleting: 1; /**< True: the list has marked deleting objects + when some of events are marked as deleting */ +} lv_event_list_t; + +/** + * @brief Event callback. + * Events are used to notify the user of some action being taken on Widget. + * For details, see ::lv_event_t. + */ + +lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preprocess); + +lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, void * user_data); +bool lv_event_remove_dsc(lv_event_list_t * list, lv_event_dsc_t * dsc); + +uint32_t lv_event_get_count(lv_event_list_t * list); + +lv_event_dsc_t * lv_event_get_dsc(lv_event_list_t * list, uint32_t index); + +lv_event_cb_t lv_event_dsc_get_cb(lv_event_dsc_t * dsc); + +void * lv_event_dsc_get_user_data(lv_event_dsc_t * dsc); + +bool lv_event_remove(lv_event_list_t * list, uint32_t index); + +void lv_event_remove_all(lv_event_list_t * list); + +/** + * Get Widget originally targeted by the event. It's the same even if event was bubbled. + * @param e pointer to the event descriptor + * @return the target of the event_code + */ +void * lv_event_get_target(lv_event_t * e); + +/** + * Get current target of the event. It's the Widget for which the event handler being called. + * If the event is not bubbled it's the same as "normal" target. + * @param e pointer to the event descriptor + * @return pointer to the current target of the event_code + */ +void * lv_event_get_current_target(lv_event_t * e); + +/** + * Get event code of an event. + * @param e pointer to the event descriptor + * @return the event code. (E.g. `LV_EVENT_CLICKED`, `LV_EVENT_FOCUSED`, etc) + */ +lv_event_code_t lv_event_get_code(lv_event_t * e); + +/** + * Get parameter passed when event was sent. + * @param e pointer to the event descriptor + * @return pointer to the parameter + */ +void * lv_event_get_param(lv_event_t * e); + +/** + * Get user_data passed when event was registered on Widget. + * @param e pointer to the event descriptor + * @return pointer to the user_data + */ +void * lv_event_get_user_data(lv_event_t * e); + +/** + * Stop event from bubbling. + * This is only valid when called in the middle of an event processing chain. + * @param e pointer to the event descriptor + */ +void lv_event_stop_bubbling(lv_event_t * e); + +/** + * Stop event from trickling down to children. + * This is only valid when called in the middle of an event processing chain. + * @param e pointer to the event descriptor + */ +void lv_event_stop_trickling(lv_event_t * e); + +/** + * Stop processing this event. + * This is only valid when called in the middle of an event processing chain. + * @param e pointer to the event descriptor + */ +void lv_event_stop_processing(lv_event_t * e); + +/** + * Helper function typically used in LV_EVENT_DELETE + * to free the event's user_data + * @param e pointer to an event descriptor + */ +void lv_event_free_user_data_cb(lv_event_t * e); + + +/** + * Register a new, custom event ID. + * It can be used the same way as e.g. `LV_EVENT_CLICKED` to send custom events + * @return the new event id + * + * Example: + * @code + * uint32_t LV_EVENT_MINE = 0; + * ... + * e = lv_event_register_id(); + * ... + * lv_obj_send_event(obj, LV_EVENT_MINE, &some_data); + * @endcode + */ +uint32_t lv_event_register_id(void); + +/** + * Get the name of an event code. + * @param code the event code + * @return the name of the event code as a string + */ +const char * lv_event_code_get_name(lv_event_code_t code); + +#if LV_USE_EXT_DATA +/** + * Set external data and its destructor for an event descriptor. + * This allows associating custom data with an event callback that will be automatically cleaned up + * when the event descriptor is removed or destroyed. + * @param dsc pointer to an event descriptor (from lv_obj_add_event_cb) + * @param data pointer to the external data to associate with the event descriptor + * @param free_cb function pointer to a destructor that will be called to clean up the external data. + * The destructor will receive the data pointer as its parameter. + */ +void lv_event_desc_set_external_data(lv_event_dsc_t * dsc, void * data, void (* free_cb)(void * data)); +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_EVENT_H */ diff --git a/inc/lvgl/src/misc/lv_event_private.h b/inc/lvgl/src/misc/lv_event_private.h new file mode 100644 index 0000000..92efc3e --- /dev/null +++ b/inc/lvgl/src/misc/lv_event_private.h @@ -0,0 +1,85 @@ +/** + * @file lv_event_private.h + * + */ + +#ifndef LV_EVENT_PRIVATE_H +#define LV_EVENT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_ext_data.h" +#include "lv_event.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_event_dsc_t { +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif + lv_event_cb_t cb; + void * user_data; + uint32_t filter; +}; + +struct _lv_event_t { + void * current_target; + void * original_target; + lv_event_code_t code; + void * user_data; + void * param; + lv_event_t * prev; + uint8_t deleted : 1; + uint8_t stop_processing : 1; + uint8_t stop_bubbling : 1; + uint8_t stop_trickling : 1; +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_event_push(lv_event_t * e); + +void lv_event_pop(lv_event_t * e); + + +lv_result_t lv_event_push_and_send(lv_event_list_t * event_list, lv_event_code_t code, void * original_target, + void * param); + +/** + * Nested events can be called and one of them might belong to an object that is being deleted. + * Mark this object's `event_temp_data` deleted to know that its `lv_obj_send_event` should return `LV_RESULT_INVALID` + * @param target pointer to an event target which was deleted + */ +void lv_event_mark_deleted(void * target); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_EVENT_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_ext_data.h b/inc/lvgl/src/misc/lv_ext_data.h new file mode 100644 index 0000000..a7d288e --- /dev/null +++ b/inc/lvgl/src/misc/lv_ext_data.h @@ -0,0 +1,44 @@ +/** + * @file lv_ext_data.h + * + */ + +#ifndef LV_EXT_DATA_H +#define LV_EXT_DATA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +#if LV_USE_EXT_DATA +typedef struct { + void * data; + void (* free_cb)(void * data); +} lv_ext_data_t; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_EXT_DATA_H */ diff --git a/inc/lvgl/src/misc/lv_fs.c b/inc/lvgl/src/misc/lv_fs.c new file mode 100644 index 0000000..f50ada6 --- /dev/null +++ b/inc/lvgl/src/misc/lv_fs.c @@ -0,0 +1,881 @@ +/** + * @file lv_fs.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_fs_private.h" + +#include "../misc/lv_assert.h" +#include "../misc/lv_profiler.h" +#include "../stdlib/lv_string.h" +#include "lv_ll.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#if LV_FS_DEFAULT_DRIVER_LETTER != '\0' && (LV_FS_DEFAULT_DRIVER_LETTER < 'A' || 'Z' < LV_FS_DEFAULT_DRIVER_LETTER) + #error "When enabled, LV_FS_DEFAULT_DRIVER_LETTER needs to be a capital ASCII letter (A-Z)" +#endif + +#define fsdrv_ll_p &(LV_GLOBAL_DEFAULT()->fsdrv_ll) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + char driver_letter; + const char * real_path; +} resolved_path_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static resolved_path_t lv_fs_resolve_path(const char * path); +static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br); +static lv_fs_res_t lv_fs_write_cached(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw); +static lv_fs_res_t lv_fs_seek_cached(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_fs_init(void) +{ + lv_ll_init(fsdrv_ll_p, sizeof(lv_fs_drv_t *)); +} + +void lv_fs_deinit(void) +{ + lv_ll_clear(fsdrv_ll_p); +} + +bool lv_fs_is_ready(char letter) +{ + lv_fs_drv_t * drv = lv_fs_get_drv(letter); + + if(drv == NULL) return false; /*An unknown driver in not ready*/ + + if(drv->ready_cb == NULL) return true; /*Assume the driver is always ready if no handler provided*/ + + return drv->ready_cb(drv); +} + +lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode) +{ + if(path == NULL) { + LV_LOG_WARN("Can't open file: path is NULL"); + return LV_FS_RES_INV_PARAM; + } + + resolved_path_t resolved_path = lv_fs_resolve_path(path); + + lv_fs_drv_t * drv = lv_fs_get_drv(resolved_path.driver_letter); + + if(drv == NULL) { + LV_LOG_WARN("Can't open file (%s): unknown driver letter", path); + return LV_FS_RES_NOT_EX; + } + + if(drv->ready_cb) { + if(drv->ready_cb(drv) == false) { + LV_LOG_WARN("Can't open file (%s): driver not ready", path); + return LV_FS_RES_HW_ERR; + } + } + + if(drv->open_cb == NULL) { + LV_LOG_WARN("Can't open file (%s): open function not exists", path); + return LV_FS_RES_NOT_IMP; + } + + LV_PROFILER_FS_BEGIN; + + file_p->drv = drv; + + /* For memory-mapped files we set the file handle to our file descriptor so that we can access the cache from the file operations */ + if(drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { + file_p->file_d = file_p; + } + else { + void * file_d = drv->open_cb(drv, resolved_path.real_path, mode); + if(file_d == NULL || file_d == (void *)(-1)) { + LV_PROFILER_FS_END; + return LV_FS_RES_UNKNOWN; + } + file_p->file_d = file_d; + } + + if(drv->cache_size) { + file_p->cache = lv_malloc_zeroed(sizeof(lv_fs_file_cache_t)); + LV_ASSERT_MALLOC(file_p->cache); + + /* If this is a memory-mapped file, then set "cache" to the memory buffer */ + if(drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { + lv_fs_path_ex_t * path_ex = (lv_fs_path_ex_t *)path; + lv_result_t res = lv_fs_get_buffer_from_path(path_ex, &file_p->cache->buffer, &file_p->cache->end); + if(res == LV_RESULT_INVALID) { + LV_LOG_WARN("lv_fs_path_ex_t is invalid"); + return LV_FS_RES_UNKNOWN; + } + file_p->cache->start = 0; + file_p->cache->file_position = 0; + } + /*Set an invalid range by default*/ + else { + file_p->cache->start = UINT32_MAX; + file_p->cache->end = UINT32_MAX - 1; + } + } + + LV_PROFILER_FS_END; + + return LV_FS_RES_OK; +} + +void lv_fs_make_path_from_buffer(lv_fs_path_ex_t * path, char letter, const void * buf, uint32_t size, const char * ext) +{ + /*Make a path the contains both the address and the size. */ + + /*Don't add the '.' and the extension if the extension is NULL*/ + if(ext == NULL) { + lv_snprintf(path->path, sizeof(path->path), "%c:%zu-%" LV_PRIu32, letter, (size_t) buf, size); + } + else { + lv_snprintf(path->path, sizeof(path->path), "%c:%zu-%" LV_PRIu32 ".%s", letter, + (size_t) buf, size, ext); + } +} + +lv_result_t lv_fs_get_buffer_from_path(lv_fs_path_ex_t * path, void ** buffer, uint32_t * size) +{ + LV_ASSERT_NULL(path); + LV_ASSERT_NULL(buffer); + LV_ASSERT_NULL(size); + + *size = 0; + *buffer = NULL; + + if(path->path[0] < 'A' || path->path[0] > 'Z') return LV_RESULT_INVALID; + if(path->path[1] != ':') return LV_RESULT_INVALID; + + uint32_t i; + lv_uintptr_t adr = 0; + for(i = 2; path->path[i] != '-' && path->path[i] != '\0' && i < sizeof(path->path); i++) { + adr = adr * 10; + adr += path->path[i] - '0'; + } + + if(path->path[i] == '\0' || i == sizeof(path->path)) return LV_RESULT_INVALID; + i++; /*Skip '-'*/ + + for(; path->path[i] != '.' && path->path[i] != '\0' && i < sizeof(path->path); i++) { + *size = (*size) * 10; + *size += path->path[i] - '0'; + } + + *buffer = (void *)adr; + + return LV_RESULT_OK; +} + +lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p) +{ + if(file_p->drv == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->close_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + LV_PROFILER_FS_BEGIN; + + lv_fs_res_t res = file_p->drv->close_cb(file_p->drv, file_p->file_d); + + if(file_p->drv->cache_size && file_p->cache) { + /* Only free cache if it was pre-allocated (for memory-mapped files it is never allocated) */ + if(file_p->drv->cache_size != LV_FS_CACHE_FROM_BUFFER && file_p->cache->buffer) { + lv_free(file_p->cache->buffer); + } + + lv_free(file_p->cache); + } + + file_p->file_d = NULL; + file_p->drv = NULL; + file_p->cache = NULL; + + LV_PROFILER_FS_END; + + return res; +} + +lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + if(br != NULL) *br = 0; + if(file_p->drv == NULL) return LV_FS_RES_INV_PARAM; + + if(file_p->drv->cache_size) { + if(file_p->drv->read_cb == NULL || file_p->drv->seek_cb == NULL) return LV_FS_RES_NOT_IMP; + } + else { + if(file_p->drv->read_cb == NULL) return LV_FS_RES_NOT_IMP; + } + + LV_PROFILER_FS_BEGIN; + + uint32_t br_tmp = 0; + lv_fs_res_t res; + + if(file_p->drv->cache_size) { + res = lv_fs_read_cached(file_p, buf, btr, &br_tmp); + } + else { + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, buf, btr, &br_tmp); + } + + if(br != NULL) *br = br_tmp; + + LV_PROFILER_FS_END; + + return res; +} + +lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + if(bw != NULL) *bw = 0; + + if(file_p->drv == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->cache_size) { + if(file_p->drv->write_cb == NULL || file_p->drv->seek_cb == NULL) return LV_FS_RES_NOT_IMP; + } + else { + if(file_p->drv->write_cb == NULL) return LV_FS_RES_NOT_IMP; + } + + LV_PROFILER_FS_BEGIN; + + lv_fs_res_t res; + uint32_t bw_tmp = 0; + if(file_p->drv->cache_size) { + res = lv_fs_write_cached(file_p, buf, btw, &bw_tmp); + } + else { + res = file_p->drv->write_cb(file_p->drv, file_p->file_d, buf, btw, &bw_tmp); + } + if(bw != NULL) *bw = bw_tmp; + + LV_PROFILER_FS_END; + return res; +} + +lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + if(file_p->drv == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->cache_size) { + if(file_p->drv->seek_cb == NULL || file_p->drv->tell_cb == NULL) return LV_FS_RES_NOT_IMP; + } + else { + if(file_p->drv->seek_cb == NULL) return LV_FS_RES_NOT_IMP; + } + + LV_PROFILER_FS_BEGIN; + + lv_fs_res_t res; + if(file_p->drv->cache_size) { + res = lv_fs_seek_cached(file_p, pos, whence); + } + else { + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos, whence); + } + + LV_PROFILER_FS_END; + + return res; +} + +lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos) +{ + if(file_p->drv == NULL) { + *pos = 0; + return LV_FS_RES_INV_PARAM; + } + + if(file_p->drv->cache_size == 0 && file_p->drv->tell_cb == NULL) { + *pos = 0; + return LV_FS_RES_NOT_IMP; + } + + LV_PROFILER_FS_BEGIN; + + lv_fs_res_t res; + if(file_p->drv->cache_size) { + *pos = file_p->cache->file_position; + res = LV_FS_RES_OK; + } + else { + res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, pos); + } + + LV_PROFILER_FS_END; + + return res; +} + +lv_fs_res_t lv_fs_get_size(lv_fs_file_t * file_p, uint32_t * size_res) +{ + uint32_t original_pos; + lv_fs_res_t ret = lv_fs_tell(file_p, &original_pos); + if(ret != LV_FS_RES_OK) { + return ret; + } + + ret = lv_fs_seek(file_p, 0, LV_FS_SEEK_END); + if(ret != LV_FS_RES_OK) { + return ret; + } + + ret = lv_fs_tell(file_p, size_res); + + if(ret != LV_FS_RES_OK || *size_res != original_pos) { + lv_fs_res_t seek_res = lv_fs_seek(file_p, original_pos, LV_FS_SEEK_SET); + if(ret == LV_FS_RES_OK) { + ret = seek_res; + } + } + + return ret; +} + +lv_fs_res_t lv_fs_path_get_size(const char * path, uint32_t * size_res) +{ + lv_fs_file_t file; + lv_fs_res_t ret = lv_fs_open(&file, path, LV_FS_MODE_RD); + if(ret != LV_FS_RES_OK) { + return ret; + } + + ret = lv_fs_seek(&file, 0, LV_FS_SEEK_END); + + if(ret == LV_FS_RES_OK) { + ret = lv_fs_tell(&file, size_res); + } + + lv_fs_res_t close_res = lv_fs_close(&file); + if(ret == LV_FS_RES_OK) { + ret = close_res; + } + + return ret; +} + +lv_fs_res_t lv_fs_load_to_buf(void * buf, uint32_t buf_size, const char * path) +{ + lv_fs_file_t file; + lv_fs_res_t ret = lv_fs_open(&file, path, LV_FS_MODE_RD); + if(ret != LV_FS_RES_OK) { + return ret; + } + + uint32_t bytes_read; + ret = lv_fs_read(&file, buf, buf_size, &bytes_read); + + if(ret == LV_FS_RES_OK && bytes_read != buf_size) { + LV_LOG_WARN("Only %"LV_PRIu32" bytes out of %"LV_PRIu32" were read from the file to the buffer", + bytes_read, buf_size); + ret = LV_FS_RES_UNKNOWN; + } + + lv_fs_res_t close_res = lv_fs_close(&file); + if(ret == LV_FS_RES_OK) { + ret = close_res; + } + + return ret; +} + +void * lv_fs_load_with_alloc(const char * path, uint32_t * size) +{ + lv_fs_file_t file; + uint8_t * data = NULL; + + lv_fs_res_t ret = lv_fs_open(&file, path, LV_FS_MODE_RD); + if(ret != LV_FS_RES_OK) { + LV_LOG_WARN("can't open file %s, res %d", path, ret); + return NULL; + } + + ret = lv_fs_get_size(&file, size); + if(ret != LV_FS_RES_OK) { + LV_LOG_WARN("can't get file size %s, res %d", path, ret); + goto fail; + } + + data = lv_malloc(*size); + if(data == NULL) { + LV_LOG_WARN("malloc failed for data with size %" LV_PRIu32, *size); + goto fail; + } + + uint32_t bytes_read; + ret = lv_fs_read(&file, data, *size, &bytes_read); + if(ret != LV_FS_RES_OK || bytes_read != *size) { + LV_LOG_WARN("read %s failed, rn %" LV_PRIu32 ", res %d", path, bytes_read, ret); + lv_free(data); + data = NULL; + } + +fail: + lv_fs_close(&file); + return data; +} + +lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path) +{ + if(path == NULL) return LV_FS_RES_INV_PARAM; + + resolved_path_t resolved_path = lv_fs_resolve_path(path); + + lv_fs_drv_t * drv = lv_fs_get_drv(resolved_path.driver_letter); + + if(drv == NULL) { + return LV_FS_RES_NOT_EX; + } + + if(drv->ready_cb) { + if(drv->ready_cb(drv) == false) { + return LV_FS_RES_HW_ERR; + } + } + + if(drv->dir_open_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + LV_PROFILER_FS_BEGIN; + + void * dir_d = drv->dir_open_cb(drv, resolved_path.real_path); + + if(dir_d == NULL || dir_d == (void *)(-1)) { + LV_PROFILER_FS_END; + return LV_FS_RES_UNKNOWN; + } + + rddir_p->drv = drv; + rddir_p->dir_d = dir_d; + + LV_PROFILER_FS_END; + + return LV_FS_RES_OK; +} + +lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn, uint32_t fn_len) +{ + if(fn_len == 0) { + return LV_FS_RES_INV_PARAM; + } + + if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { + fn[0] = '\0'; + return LV_FS_RES_INV_PARAM; + } + + if(rddir_p->drv->dir_read_cb == NULL) { + fn[0] = '\0'; + return LV_FS_RES_NOT_IMP; + } + + LV_PROFILER_FS_BEGIN; + + lv_fs_res_t res = rddir_p->drv->dir_read_cb(rddir_p->drv, rddir_p->dir_d, fn, fn_len); + + LV_PROFILER_FS_END; + + return res; +} + +lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p) +{ + if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { + return LV_FS_RES_INV_PARAM; + } + + if(rddir_p->drv->dir_close_cb == NULL) { + return LV_FS_RES_NOT_IMP; + } + + LV_PROFILER_FS_BEGIN; + + lv_fs_res_t res = rddir_p->drv->dir_close_cb(rddir_p->drv, rddir_p->dir_d); + + rddir_p->dir_d = NULL; + rddir_p->drv = NULL; + + LV_PROFILER_FS_END; + + return res; +} + +void lv_fs_drv_init(lv_fs_drv_t * drv) +{ + lv_memzero(drv, sizeof(lv_fs_drv_t)); +} + +void lv_fs_drv_register(lv_fs_drv_t * drv_p) +{ + /*Save the new driver*/ + lv_fs_drv_t ** new_drv; + new_drv = lv_ll_ins_head(fsdrv_ll_p); + LV_ASSERT_MALLOC(new_drv); + if(new_drv == NULL) return; + + *new_drv = drv_p; +} + +void lv_fs_remove_drive(char letter) +{ + lv_fs_drv_t ** drv; + LV_LL_READ(fsdrv_ll_p, drv) { + if((*drv)->letter == letter) { + lv_ll_remove(fsdrv_ll_p, drv); /* remove the drive from the list of registered drives */ + if((*drv)->remove_cb) { + (*drv)->remove_cb(*drv); /* call the remove callback if available */ + } + lv_free(drv); /* free the list node*/ + } + } +} + +lv_fs_drv_t * lv_fs_get_drv(char letter) +{ + lv_fs_drv_t ** drv; + + LV_LL_READ(fsdrv_ll_p, drv) { + if((*drv)->letter == letter) { + return *drv; + } + } + + return NULL; +} + +char * lv_fs_get_letters(char * buf) +{ + lv_fs_drv_t ** drv; + uint8_t i = 0; + + LV_LL_READ(fsdrv_ll_p, drv) { + buf[i] = (*drv)->letter; + i++; + } + + buf[i] = '\0'; + + return buf; +} + +const char * lv_fs_get_ext(const char * fn) +{ + size_t i; + for(i = lv_strlen(fn); i > 0; i--) { + if(fn[i] == '.') { + return &fn[i + 1]; + } + else if(fn[i] == '/' || fn[i] == '\\') { + return ""; /*No extension if a '\' or '/' found*/ + } + } + + return ""; /*Empty string if no '.' in the file name.*/ +} + +char * lv_fs_up(char * path) +{ + size_t len = lv_strlen(path); + if(len == 0) return path; + + len--; /*Go before the trailing '\0'*/ + + /*Ignore trailing '/' or '\'*/ + while(path[len] == '/' || path[len] == '\\') { + path[len] = '\0'; + if(len > 0) + len--; + else + return path; + } + + size_t i; + for(i = len; i > 0; i--) { + if(path[i] == '/' || path[i] == '\\') break; + } + + if(i > 0) path[i] = '\0'; + + return path; +} + +const char * lv_fs_get_last(const char * path) +{ + size_t len = lv_strlen(path); + if(len == 0) return path; + + len--; /*Go before the trailing '\0'*/ + + /*Ignore trailing '/' or '\'*/ + while(path[len] == '/' || path[len] == '\\') { + if(len > 0) + len--; + else + return path; + } + + size_t i; + for(i = len; i > 0; i--) { + if(path[i] == '/' || path[i] == '\\' || path[i] == ':') break; + } + + /*No '/' or '\' in the path so return with path itself*/ + if(i == 0) return path; + + return &path[i + 1]; +} + +int lv_fs_path_join(char * buf, size_t buf_sz, const char * base, const char * end) +{ + if(base[0] == '\0') return lv_strlcpy(buf, end, buf_sz); + if(end[0] == '\0') return lv_strlcpy(buf, base, buf_sz); + + size_t base_len = lv_strlen(base); + char base_end_char = base_len ? base[base_len - 1] : '\0'; + + bool base_has_sep = base_end_char == '/' || base_end_char == '\\'; + bool end_has_sep = end[0] == '/' || end[0] == '\\'; + + if(base_has_sep && end_has_sep) { + end++; + end_has_sep = false; + } + + const char * sep = "/"; + if(base_has_sep || end_has_sep) { + sep = ""; + } + + return lv_snprintf(buf, buf_sz, "%s%s%s", base, sep, end); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Extract the drive letter and the real path from LVGL's "abstracted file system" path string + * @param path path string (E.g. S:/folder/file.txt) + */ +static resolved_path_t lv_fs_resolve_path(const char * path) +{ + resolved_path_t resolved; + +#if LV_FS_DEFAULT_DRIVER_LETTER != '\0' /* When using default driver-identifier letter, strict format (X:) is mandatory */ + bool has_drive_prefix = ('A' <= path[0]) && (path[0] <= 'Z') && (path[1] == ':'); + + if(has_drive_prefix) { + resolved.driver_letter = path[0]; + resolved.real_path = path + 2; + } + else { + resolved.driver_letter = LV_FS_DEFAULT_DRIVER_LETTER; + resolved.real_path = path; + } +# else /*Lean rules for backward compatibility*/ + resolved.driver_letter = path[0]; + + if(*path != '\0') { + path++; /*Ignore the driver letter*/ + if(*path == ':') path++; + } + + resolved.real_path = path; +#endif + + return resolved; +} + +static lv_fs_res_t lv_fs_read_cached(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + lv_fs_res_t res = LV_FS_RES_OK; + uint32_t file_position = file_p->cache->file_position; + uint32_t start = file_p->cache->start; + uint32_t end = file_p->cache->end; + char * buffer = file_p->cache->buffer; + uint32_t buffer_size = file_p->drv->cache_size; + + if(start <= file_position && file_position <= end) { + /* Data can be read from cache buffer */ + uint32_t buffer_remaining_length = (uint32_t)end - file_position + 1; + uint32_t buffer_offset = (end - start) - buffer_remaining_length + 1; + + /* Do not allow reading beyond the actual memory block for memory-mapped files */ + if(file_p->drv->cache_size == LV_FS_CACHE_FROM_BUFFER) { + if(btr > buffer_remaining_length) + btr = buffer_remaining_length - 1; + } + + if(btr <= buffer_remaining_length) { + /*Data is in cache buffer, and buffer end not reached, no need to read from FS*/ + lv_memcpy(buf, buffer + buffer_offset, btr); + *br = btr; + } + else { + /*First part of data is in cache buffer, but we need to read rest of data from FS*/ + lv_memcpy(buf, buffer + buffer_offset, buffer_remaining_length); + + file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->end + 1, + LV_FS_SEEK_SET); + + uint32_t bytes_read_to_buffer = 0; + if(btr - buffer_remaining_length > buffer_size) { + /*If remaining data chuck is bigger than buffer size, then do not use cache, instead read it directly from FS*/ + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (char *)buf + buffer_remaining_length, + btr - buffer_remaining_length, &bytes_read_to_buffer); + } + else { + /*If remaining data chunk is smaller than buffer size, then read into cache buffer*/ + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, buffer, buffer_size, &bytes_read_to_buffer); + file_p->cache->start = file_p->cache->end + 1; + file_p->cache->end = file_p->cache->start + bytes_read_to_buffer - 1; + + uint16_t data_chunk_remaining = LV_MIN(btr - buffer_remaining_length, bytes_read_to_buffer); + lv_memcpy((char *)buf + buffer_remaining_length, buffer, data_chunk_remaining); + } + *br = LV_MIN(buffer_remaining_length + bytes_read_to_buffer, btr); + } + } + else { + file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, + LV_FS_SEEK_SET); + + /*Data is not in cache buffer*/ + if(btr > buffer_size) { + /*If bigger data is requested, then do not use cache, instead read it directly*/ + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buf, btr, br); + } + else { + /*If small data is requested, then read from FS into cache buffer*/ + if(buffer == NULL) { + file_p->cache->buffer = lv_malloc(buffer_size); + LV_ASSERT_MALLOC(file_p->cache->buffer); + buffer = file_p->cache->buffer; + } + + uint32_t bytes_read_to_buffer = 0; + res = file_p->drv->read_cb(file_p->drv, file_p->file_d, (void *)buffer, buffer_size, &bytes_read_to_buffer); + file_p->cache->start = file_position; + file_p->cache->end = file_p->cache->start + bytes_read_to_buffer - 1; + + *br = LV_MIN(btr, bytes_read_to_buffer); + lv_memcpy(buf, buffer, *br); + + } + } + + if(res == LV_FS_RES_OK) { + file_p->cache->file_position += *br; + } + + return res; +} + +static lv_fs_res_t lv_fs_write_cached(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw) +{ + lv_fs_res_t res = LV_FS_RES_OK; + + /*Need to do FS seek before writing data to FS*/ + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, file_p->cache->file_position, LV_FS_SEEK_SET); + if(res != LV_FS_RES_OK) return res; + + res = file_p->drv->write_cb(file_p->drv, file_p->file_d, buf, btw, bw); + if(res != LV_FS_RES_OK) return res; + + if(file_p->cache->end >= file_p->cache->start) { + uint32_t start_position = file_p->cache->file_position; + uint32_t end_position = file_p->cache->file_position + *bw - 1; + char * cache_buffer = file_p->cache->buffer; + const char * write_buffer = buf; + + if(start_position <= file_p->cache->start && end_position >= file_p->cache->end) { + lv_memcpy(cache_buffer, + write_buffer + (file_p->cache->start - start_position), + file_p->cache->end + 1 - file_p->cache->start); + } + else if(start_position >= file_p->cache->start && end_position <= file_p->cache->end) { + lv_memcpy(cache_buffer + (start_position - file_p->cache->start), + write_buffer, + end_position + 1 - start_position); + } + else if(end_position >= file_p->cache->start && end_position <= file_p->cache->end) { + lv_memcpy(cache_buffer, + write_buffer + (file_p->cache->start - start_position), + end_position + 1 - file_p->cache->start); + } + else if(start_position >= file_p->cache->start && start_position <= file_p->cache->end) { + lv_memcpy(cache_buffer + (start_position - file_p->cache->start), + write_buffer, + file_p->cache->end + 1 - start_position); + } + } + + file_p->cache->file_position += *bw; + + return res; +} + +static lv_fs_res_t lv_fs_seek_cached(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence) +{ + lv_fs_res_t res = LV_FS_RES_OK; + switch(whence) { + case LV_FS_SEEK_SET: { + file_p->cache->file_position = pos; + break; + } + case LV_FS_SEEK_CUR: { + file_p->cache->file_position += pos; + break; + } + case LV_FS_SEEK_END: { + /*Because we don't know the file size, we do a little trick: do a FS seek, then get the new file position from FS*/ + res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos, whence); + if(res == LV_FS_RES_OK) { + uint32_t tmp_position; + res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, &tmp_position); + + if(res == LV_FS_RES_OK) { + file_p->cache->file_position = tmp_position; + } + } + break; + } + } + + return res; +} diff --git a/inc/lvgl/src/misc/lv_fs.h b/inc/lvgl/src/misc/lv_fs.h new file mode 100644 index 0000000..62bbfad --- /dev/null +++ b/inc/lvgl/src/misc/lv_fs.h @@ -0,0 +1,344 @@ +/** + * @file lv_fs.h + * + */ + +#ifndef LV_FS_H +#define LV_FS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ +#define LV_FS_MAX_FN_LENGTH 64 +#define LV_FS_MAX_PATH_LENGTH 256 + +#define LV_FS_CACHE_FROM_BUFFER UINT32_MAX + +/********************** + * TYPEDEFS + **********************/ + +/** + * Errors in the file system module. + */ +typedef enum { + LV_FS_RES_OK = 0, + LV_FS_RES_HW_ERR, /*Low level hardware error*/ + LV_FS_RES_FS_ERR, /*Error in the file system structure*/ + LV_FS_RES_NOT_EX, /*Driver, file or directory is not exists*/ + LV_FS_RES_FULL, /*Disk full*/ + LV_FS_RES_LOCKED, /*The file is already opened*/ + LV_FS_RES_DENIED, /*Access denied. Check 'fs_open' modes and write protect*/ + LV_FS_RES_BUSY, /*The file system now can't handle it, try later*/ + LV_FS_RES_TOUT, /*Process time outed*/ + LV_FS_RES_NOT_IMP, /*Requested function is not implemented*/ + LV_FS_RES_OUT_OF_MEM, /*Not enough memory for an internal operation*/ + LV_FS_RES_INV_PARAM, /*Invalid parameter among arguments*/ + LV_FS_RES_DRIVE_LETTER_ALREADY_USED, /*A drive with this letter is already registered*/ + LV_FS_RES_UNKNOWN, /*Other unknown error*/ +} lv_fs_res_t; + +/** + * File open mode. + */ +typedef enum { + LV_FS_MODE_WR = 0x01, + LV_FS_MODE_RD = 0x02, +} lv_fs_mode_t; + +/** + * Seek modes. + */ +typedef enum { + LV_FS_SEEK_SET = 0x00, /**< Set the position from absolutely (from the start of file)*/ + LV_FS_SEEK_CUR = 0x01, /**< Set the position from the current position*/ + LV_FS_SEEK_END = 0x02, /**< Set the position from the end of the file*/ +} lv_fs_whence_t; + +struct _lv_fs_drv_t; +typedef struct _lv_fs_drv_t lv_fs_drv_t; +struct _lv_fs_drv_t { + char letter; + uint32_t cache_size; + bool (*ready_cb)(lv_fs_drv_t * drv); + + void(*remove_cb)(lv_fs_drv_t * drv); /*Optional*/ + + void * (*open_cb)(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode); + lv_fs_res_t (*close_cb)(lv_fs_drv_t * drv, void * file_p); + lv_fs_res_t (*read_cb)(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); + lv_fs_res_t (*write_cb)(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); + lv_fs_res_t (*seek_cb)(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence); + lv_fs_res_t (*tell_cb)(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); + + void * (*dir_open_cb)(lv_fs_drv_t * drv, const char * path); + lv_fs_res_t (*dir_read_cb)(lv_fs_drv_t * drv, void * rddir_p, char * fn, uint32_t fn_len); + lv_fs_res_t (*dir_close_cb)(lv_fs_drv_t * drv, void * rddir_p); + + void * user_data; /**< Custom file user data*/ +}; + +typedef struct { + void * file_d; + lv_fs_drv_t * drv; + lv_fs_file_cache_t * cache; +} lv_fs_file_t; + + +typedef struct { + void * dir_d; + lv_fs_drv_t * drv; +} lv_fs_dir_t; + + +/** Extended path object to specify buffer for memory-mapped files */ +typedef struct { + char path[64]; /**< Store the driver letter address and size*/ +} lv_fs_path_ex_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a file system driver with default values. + * It is used to ensure all fields have known values and not memory junk. + * After it you can set the fields. + * @param drv pointer to driver variable to initialize + */ +void lv_fs_drv_init(lv_fs_drv_t * drv); + +/** + * Add a new drive + * @param drv pointer to an lv_fs_drv_t structure which is inited with the + * corresponding function pointers. Only pointer is saved, so the + * driver should be static or dynamically allocated. + */ +void lv_fs_drv_register(lv_fs_drv_t * drv); + +/** + * Give a pointer to a driver from its letter + * @param letter the driver-identifier letter + * @return pointer to a driver or NULL if not found + */ +lv_fs_drv_t * lv_fs_get_drv(char letter); + +/** + * Remove a drive and call its remove function if available + * @param letter letter identifier of the drive to remove + */ +void lv_fs_remove_drive(char letter); + +/** + * Test if a drive is ready or not. If the `ready` function was not initialized `true` will be + * returned. + * @param letter letter of the drive + * @return true: drive is ready; false: drive is not ready + */ +bool lv_fs_is_ready(char letter); + +/** + * Open a file + * @param file_p pointer to a lv_fs_file_t variable + * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) + * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode); + +/** + * Create a special object from buffer/ memory address which looks like a file and can be passed + * as path to `lv_fs_open` and other functions accepting a path. + * + * For example + * @code + * //Create a PNG file from t a buffer and use it + * lv_fs_path_ex_t p; + * lv_fs_make_path_from_buffer(&p, 'A', my_buf, my_buf_size, "png"); + * lv_image_set_src(image1, &p); + * + * @endcode + * @param path path to a lv_fs_path_ex object + * @param letter the identifier letter of the driver. E.g. `LV_FS_MEMFS_LETTER` + * @param buf address of the memory buffer + * @param size size of the memory buffer in bytes + * @param ext the extension, e.g. "png", if NULL no extension will be added. + */ +void lv_fs_make_path_from_buffer(lv_fs_path_ex_t * path, char letter, const void * buf, uint32_t size, + const char * ext); + +/** + * Get the buffer address and size from a path object + * @param path pointer to an initialized `lv_fs_path_ex` data + * @param buffer pointer to a `void *` variable to store the address + * @param size pointer to an `uint32_t` data to store the size + * @return LV_RESULT_OK: buffer and size are set; LV_RESULT_INVALID: an error happened. + */ +lv_result_t lv_fs_get_buffer_from_path(lv_fs_path_ex_t * path, void ** buffer, uint32_t * size); + +/** + * Close an already opened file + * @param file_p pointer to a lv_fs_file_t variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p); + +/** + * Read from a file + * @param file_p pointer to a lv_fs_file_t variable + * @param buf pointer to a buffer where the read bytes are stored + * @param btr Bytes To Read + * @param br the number of real read bytes (Bytes Read). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br); + +/** + * Write into a file + * @param file_p pointer to a lv_fs_file_t variable + * @param buf pointer to a buffer with the bytes to write + * @param btw Bytes To Write + * @param bw the number of real written bytes (Bytes Written). NULL if unused. + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw); + +/** + * Set the position of the 'cursor' (read write pointer) in a file + * @param file_p pointer to a lv_fs_file_t variable + * @param pos the new position expressed in bytes index (0: start of file) + * @param whence tells from where to set position. See lv_fs_whence_t + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos, lv_fs_whence_t whence); + +/** + * Give the position of the read write pointer + * @param file_p pointer to a lv_fs_file_t variable + * @param pos pointer to store the position of the read write pointer + * @return LV_FS_RES_OK or any error from 'fs_res_t' + */ +lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos); + +/** + * Get the size in bytes of an open file. + * The file read/write position will not be affected. + * @param file_p pointer to a lv_fs_file_t variable + * @param size_res pointer to store the file size + * @return LV_FS_RES_OK or any error from `lv_fs_res_t` + */ +lv_fs_res_t lv_fs_get_size(lv_fs_file_t * file_p, uint32_t * size_res); + +/** + * Get the size in bytes of a file at the given path. + * @param path the path of the file + * @param size_res pointer to store the file size + * @return LV_FS_RES_OK or any error from `lv_fs_res_t` + */ +lv_fs_res_t lv_fs_path_get_size(const char * path, uint32_t * size_res); + +/** + * Read the contents of a file at the given path into a buffer. + * @param buf a buffer to read the contents of the file into + * @param buf_size the size of the buffer and the amount to read from the file + * @param path the path of the file + * @return LV_FS_RES_OK on success, LV_FS_RES_UNKNOWN if fewer than + * `buf_size` bytes could be read from the file, + * or any error from `lv_fs_res_t` + */ +lv_fs_res_t lv_fs_load_to_buf(void * buf, uint32_t buf_size, const char * path); + +/** + * Load a file into a memory buffer. + * @param filename the path of the file + * @param size pointer to store the size of the loaded file + * @return a pointer to the loaded file buffer, or NULL if an error occurred + */ +void * lv_fs_load_with_alloc(const char * path, uint32_t * size); + +/** + * Initialize a 'fs_dir_t' variable for directory reading + * @param rddir_p pointer to a 'lv_fs_dir_t' variable + * @param path path to a directory + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path); + +/** + * Read the next filename form a directory. + * The name of the directories will begin with '/' + * @param rddir_p pointer to an initialized 'fs_dir_t' variable + * @param fn pointer to a buffer to store the filename + * @param fn_len length of the buffer to store the filename + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn, uint32_t fn_len); + +/** + * Close the directory reading + * @param rddir_p pointer to an initialized 'fs_dir_t' variable + * @return LV_FS_RES_OK or any error from lv_fs_res_t enum + */ +lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p); + +/** + * Fill a buffer with the letters of existing drivers + * @param buf buffer to store the letters ('\0' added after the last letter) + * @return the buffer + */ +char * lv_fs_get_letters(char * buf); + +/** + * Return with the extension of the filename + * @param fn string with a filename + * @return pointer to the beginning extension or empty string if no extension + */ +const char * lv_fs_get_ext(const char * fn); + +/** + * Step up one level + * @param path pointer to a file name + * @return the truncated file name + */ +char * lv_fs_up(char * path); + +/** + * Get the last element of a path (e.g. U:/folder/file -> file) + * @param path pointer to a file name + * @return pointer to the beginning of the last element in the path + */ +const char * lv_fs_get_last(const char * path); + +/** + * Concatenate two path components and automatically add/remove a separator as needed. + * buf, buf_sz, and the return value are analogous to lv_snprintf + * @param buf the buffer to place the result in + * @param buf_sz the size of buf. At most buf_sz - 1 characters will be written to buf, + * and a null terminator + * @param base the first path component + * @param end the second path component + * @return the number of characters (not including the null terminator) + * that would be written to buf, even if buf_sz-1 was smaller + */ +int lv_fs_path_join(char * buf, size_t buf_sz, const char * base, const char * end); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FS_H*/ diff --git a/inc/lvgl/src/misc/lv_fs_private.h b/inc/lvgl/src/misc/lv_fs_private.h new file mode 100644 index 0000000..0c67840 --- /dev/null +++ b/inc/lvgl/src/misc/lv_fs_private.h @@ -0,0 +1,56 @@ +/** + * @file lv_fs_private.h + * + */ + +#ifndef LV_FS_PRIVATE_H +#define LV_FS_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_fs.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_fs_file_cache_t { + uint32_t start; + uint32_t end; + uint32_t file_position; + void * buffer; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the File system interface + */ +void lv_fs_init(void); + +/** + * Deinitialize the File system interface + */ +void lv_fs_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FS_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_grad.c b/inc/lvgl/src/misc/lv_grad.c new file mode 100644 index 0000000..298837a --- /dev/null +++ b/inc/lvgl/src/misc/lv_grad.c @@ -0,0 +1,115 @@ +/** + * @file lv_grad.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_grad.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_grad_init_stops(lv_grad_dsc_t * dsc, const lv_color_t colors[], const lv_opa_t opa[], + const uint8_t fracs[], int num_stops) +{ + LV_ASSERT(num_stops <= LV_GRADIENT_MAX_STOPS); + LV_ASSERT(num_stops > 1); + LV_ASSERT_NULL(dsc); + LV_ASSERT_NULL(colors); + + dsc->stops_count = num_stops; + for(int i = 0; i < num_stops; i++) { + dsc->stops[i].color = colors[i]; + dsc->stops[i].opa = opa != NULL ? opa[i] : LV_OPA_COVER; + dsc->stops[i].frac = fracs != NULL ? fracs[i] : 255 * i / (num_stops - 1); + } +} + +void lv_grad_horizontal_init(lv_grad_dsc_t * dsc) +{ + LV_ASSERT_NULL(dsc); + + dsc->dir = LV_GRAD_DIR_HOR; +} + +void lv_grad_vertical_init(lv_grad_dsc_t * dsc) +{ + LV_ASSERT_NULL(dsc); + + dsc->dir = LV_GRAD_DIR_VER; +} + +void lv_grad_linear_init(lv_grad_dsc_t * dsc, int32_t from_x, int32_t from_y, int32_t to_x, int32_t to_y, + lv_grad_extend_t extend) +{ + LV_ASSERT_NULL(dsc); + dsc->dir = LV_GRAD_DIR_LINEAR; + dsc->params.linear.start.x = from_x; + dsc->params.linear.start.y = from_y; + dsc->params.linear.end.x = to_x; + dsc->params.linear.end.y = to_y; + dsc->extend = extend; +} + +void lv_grad_radial_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t to_x, int32_t to_y, + lv_grad_extend_t extend) +{ + LV_ASSERT_NULL(dsc); + dsc->dir = LV_GRAD_DIR_RADIAL; + dsc->params.radial.focal.x = center_x; + dsc->params.radial.focal.y = center_y; + dsc->params.radial.focal_extent.x = center_x; + dsc->params.radial.focal_extent.y = center_y; + dsc->params.radial.end.x = center_x; + dsc->params.radial.end.y = center_y; + dsc->params.radial.end_extent.x = to_x; + dsc->params.radial.end_extent.y = to_y; + dsc->extend = extend; +} + +void lv_grad_conical_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t start_angle, + int32_t end_angle, lv_grad_extend_t extend) +{ + LV_ASSERT_NULL(dsc); + dsc->dir = LV_GRAD_DIR_CONICAL; + dsc->params.conical.center.x = center_x; + dsc->params.conical.center.y = center_y; + dsc->params.conical.start_angle = start_angle; + dsc->params.conical.end_angle = end_angle; + dsc->extend = extend; +} + +void lv_grad_radial_set_focal(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t radius) +{ + LV_ASSERT_NULL(dsc); + dsc->params.radial.focal.x = center_x; + dsc->params.radial.focal.y = center_y; + dsc->params.radial.focal_extent.x = center_x + radius; + dsc->params.radial.focal_extent.y = center_y; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/misc/lv_grad.h b/inc/lvgl/src/misc/lv_grad.h new file mode 100644 index 0000000..60f880f --- /dev/null +++ b/inc/lvgl/src/misc/lv_grad.h @@ -0,0 +1,176 @@ +/** + * @file lv_grad.h + * + */ + +#ifndef LV_GRAD_H +#define LV_GRAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_color.h" +#include "lv_area.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * The direction of the gradient. + */ +typedef enum { + LV_GRAD_DIR_NONE, /**< No gradient (the `grad_color` property is ignored)*/ + LV_GRAD_DIR_VER, /**< Simple vertical (top to bottom) gradient*/ + LV_GRAD_DIR_HOR, /**< Simple horizontal (left to right) gradient*/ + LV_GRAD_DIR_LINEAR, /**< Linear gradient defined by start and end points. Can be at any angle.*/ + LV_GRAD_DIR_RADIAL, /**< Radial gradient defined by start and end circles*/ + LV_GRAD_DIR_CONICAL, /**< Conical gradient defined by center point, start and end angles*/ +} lv_grad_dir_t; + +/** + * Gradient behavior outside the defined range. + */ +typedef enum { + LV_GRAD_EXTEND_PAD, /**< Repeat the same color*/ + LV_GRAD_EXTEND_REPEAT, /**< Repeat the pattern*/ + LV_GRAD_EXTEND_REFLECT, /**< Repeat the pattern mirrored*/ +} lv_grad_extend_t; + +/** A gradient stop definition. + * This matches a color and a position in a virtual 0-255 scale. + */ +typedef struct { + lv_color_t color; /**< The stop color */ + lv_opa_t opa; /**< The opacity of the color*/ + uint8_t frac; /**< The stop position in 1/255 unit */ +} lv_grad_stop_t; + +/** A descriptor of a gradient. */ +typedef struct { + lv_grad_stop_t stops[LV_GRADIENT_MAX_STOPS]; /**< A gradient stop array */ + uint8_t stops_count; /**< The number of used stops in the array */ + lv_grad_dir_t dir : 4; /**< The gradient direction. + * Any of LV_GRAD_DIR_NONE, LV_GRAD_DIR_VER, LV_GRAD_DIR_HOR, + * LV_GRAD_TYPE_LINEAR, LV_GRAD_TYPE_RADIAL, LV_GRAD_TYPE_CONICAL */ + lv_grad_extend_t extend : 3; /**< Behaviour outside the defined range. + * LV_GRAD_EXTEND_NONE, LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT, LV_GRAD_EXTEND_REFLECT */ + union { + /*Linear gradient parameters*/ + struct { + lv_point_t start; /**< Linear gradient vector start point */ + lv_point_t end; /**< Linear gradient vector end point */ + } linear; + /*Radial gradient parameters*/ + struct { + lv_point_t focal; /**< Center of the focal (starting) circle in local coordinates */ + /* (can be the same as the ending circle to create concentric circles) */ + lv_point_t focal_extent; /**< Point on the circle (can be the same as the center) */ + lv_point_t end; /**< Center of the ending circle in local coordinates */ + lv_point_t end_extent; /**< Point on the circle determining the radius of the gradient */ + } radial; + /*Conical gradient parameters*/ + struct { + lv_point_t center; /**< Conical gradient center point */ + int16_t start_angle; /**< Start angle 0..3600 */ + int16_t end_angle; /**< End angle 0..3600 */ + } conical; + } params; + void * state; +} lv_grad_dsc_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize gradient color map from a table + * @param grad pointer to a gradient descriptor + * @param colors color array + * @param fracs position array (0..255): if NULL, then colors are distributed evenly + * @param opa opacity array: if NULL, then LV_OPA_COVER is assumed + * @param num_stops number of gradient stops (1..LV_GRADIENT_MAX_STOPS) + */ +void lv_grad_init_stops(lv_grad_dsc_t * grad, const lv_color_t colors[], const lv_opa_t opa[], + const uint8_t fracs[], int num_stops); + +/** + * Helper function to initialize a horizontal gradient. + * @param dsc gradient descriptor + */ +void lv_grad_horizontal_init(lv_grad_dsc_t * dsc); + +/** + * Helper function to initialize a vertical gradient. + * @param dsc gradient descriptor + */ +void lv_grad_vertical_init(lv_grad_dsc_t * dsc); + +/** + * Helper function to initialize linear gradient + * @param dsc gradient descriptor + * @param from_x start x position: can be a coordinate or an lv_pct() value + * predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well + * @param from_y start y position + * @param to_x end x position + * @param to_y end y position + * @param extend one of LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT or LV_GRAD_EXTEND_REFLECT + */ +void lv_grad_linear_init(lv_grad_dsc_t * dsc, int32_t from_x, int32_t from_y, int32_t to_x, int32_t to_y, + lv_grad_extend_t extend); + +/** + * Helper function to initialize radial gradient + * @param dsc gradient descriptor + * @param center_x center x position: can be a coordinate or an lv_pct() value + * predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well + * @param center_y center y position + * @param to_x point on the end circle x position + * @param to_y point on the end circle y position + * @param extend one of LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT or LV_GRAD_EXTEND_REFLECT + */ +void lv_grad_radial_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t to_x, int32_t to_y, + lv_grad_extend_t extend); + +/** + * Set focal (starting) circle of a radial gradient + * @param dsc gradient descriptor + * @param center_x center x position: can be a coordinate or an lv_pct() value + * predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well + * @param center_y center y position + * @param radius radius of the starting circle (NOTE: this must be a scalar number, not percentage) + */ +void lv_grad_radial_set_focal(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t radius); + +/** + * Helper function to initialize conical gradient + * @param dsc gradient descriptor + * @param center_x center x position: can be a coordinate or an lv_pct() value + * predefined constants LV_GRAD_LEFT, LV_GRAD_RIGHT, LV_GRAD_TOP, LV_GRAD_BOTTOM, LV_GRAD_CENTER can be used as well + * @param center_y center y position + * @param start_angle start angle in degrees + * @param end_angle end angle in degrees + * @param extend one of LV_GRAD_EXTEND_PAD, LV_GRAD_EXTEND_REPEAT or LV_GRAD_EXTEND_REFLECT + */ +void lv_grad_conical_init(lv_grad_dsc_t * dsc, int32_t center_x, int32_t center_y, int32_t start_angle, + int32_t end_angle, lv_grad_extend_t extend); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_GRAD_H*/ diff --git a/inc/lvgl/src/misc/lv_iter.c b/inc/lvgl/src/misc/lv_iter.c new file mode 100644 index 0000000..cb6377c --- /dev/null +++ b/inc/lvgl/src/misc/lv_iter.c @@ -0,0 +1,213 @@ +/** + * @file lv_iter.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_assert.h" + +#include "lv_iter.h" + +#include "lv_circle_buf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_iter_t { + /* Iterator state */ + void * instance; /**< Pointer to the object to iterate over */ + uint32_t elem_size; /**< Size of one element in bytes */ + void * context; /**< Custom context for the iteration */ + uint32_t context_size; /**< Size of the custom context in bytes */ + + /* Peeking */ + lv_circle_buf_t * peek_buf; /**< Circular buffer for peeking */ + uint32_t peek_offset; /**< Offset in the peek buffer */ + + /* Callbacks */ + lv_iter_next_cb next_cb; /**< Callback to get the next element */ +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static bool peek_fill_cb(void * buf, uint32_t buf_len, int32_t index, void * user_data); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_iter_t * lv_iter_create(void * instance, const uint32_t elem_size, const uint32_t context_size, + lv_iter_next_cb next_cb) +{ + lv_iter_t * iter = lv_malloc_zeroed(sizeof(lv_iter_t)); + LV_ASSERT_MALLOC(iter); + + if(iter == NULL) { + LV_LOG_ERROR("Could not allocate memory for iterator"); + return NULL; + } + + iter->instance = instance; + iter->elem_size = elem_size; + iter->context_size = context_size; + iter->next_cb = next_cb; + + if(context_size > 0) { + iter->context = lv_malloc_zeroed(context_size); + LV_ASSERT_MALLOC(iter->context); + } + + return iter; +} + +void * lv_iter_get_context(const lv_iter_t * iter) +{ + LV_ASSERT_NULL(iter); + + return iter ? iter->context : NULL; +} + +void lv_iter_destroy(lv_iter_t * iter) +{ + LV_ASSERT_NULL(iter); + if(iter == NULL) return; + + if(iter->context_size > 0) lv_free(iter->context); + if(iter->peek_buf != NULL) lv_circle_buf_destroy(iter->peek_buf); + + iter->context = NULL; + iter->peek_buf = NULL; + + lv_free(iter); +} + +void lv_iter_make_peekable(lv_iter_t * iter, const uint32_t capacity) +{ + LV_ASSERT_NULL(iter); + if(iter == NULL) return; + + if(capacity == 0 || iter->peek_buf != NULL) return; + iter->peek_buf = lv_circle_buf_create(capacity, iter->elem_size); + LV_ASSERT_NULL(iter->peek_buf); +} + +lv_result_t lv_iter_next(lv_iter_t * iter, void * elem) +{ + LV_ASSERT_NULL(iter); + if(iter == NULL) return LV_RESULT_INVALID; + + lv_circle_buf_t * c_buf = iter->peek_buf; + if(c_buf != NULL && !lv_circle_buf_is_empty(c_buf)) { + if(elem) lv_circle_buf_read(c_buf, elem); + else lv_circle_buf_skip(c_buf); + iter->peek_offset = 0; + return LV_RESULT_OK; + } + + const lv_result_t iter_res = iter->next_cb(iter->instance, iter->context, elem); + if(iter_res == LV_RESULT_INVALID) return LV_RESULT_INVALID; + + if(c_buf != NULL) iter->peek_offset = 0; + + return iter_res; +} + +lv_result_t lv_iter_peek(lv_iter_t * iter, void * elem) +{ + LV_ASSERT_NULL(iter); + if(iter == NULL) return LV_RESULT_INVALID; + + lv_circle_buf_t * c_buf = iter->peek_buf; + if(c_buf == NULL) return LV_RESULT_INVALID; + + const uint32_t peek_count = lv_circle_buf_size(c_buf); + if(iter->peek_offset >= peek_count) { + const uint32_t required = iter->peek_offset + 1 - peek_count; + const uint32_t filled = lv_circle_buf_fill(c_buf, required, peek_fill_cb, iter); + if(filled != required) return LV_RESULT_INVALID; + } + + lv_circle_buf_peek_at(c_buf, iter->peek_offset, elem); + + return LV_RESULT_OK; +} + +lv_result_t lv_iter_peek_advance(lv_iter_t * iter) +{ + LV_ASSERT_NULL(iter); + if(iter == NULL) return LV_RESULT_INVALID; + + if(iter->peek_buf == NULL || iter->peek_offset + 1 >= lv_circle_buf_capacity(iter->peek_buf)) + return LV_RESULT_INVALID; + iter->peek_offset++; + return LV_RESULT_OK; +} + +lv_result_t lv_iter_peek_reset(lv_iter_t * iter) +{ + LV_ASSERT_NULL(iter); + if(iter == NULL) return LV_RESULT_INVALID; + + if(iter->peek_buf == NULL) return LV_RESULT_INVALID; + + iter->peek_offset = 0; + return LV_RESULT_OK; +} + +void lv_iter_inspect(lv_iter_t * iter, const lv_iter_inspect_cb inspect_cb) +{ + LV_ASSERT_NULL(iter); + if(iter == NULL) return; + + void * elem = lv_malloc_zeroed(iter->elem_size); + LV_ASSERT_MALLOC(elem); + + if(elem == NULL) { + LV_LOG_ERROR("Could not allocate memory for element"); + return; + } + + while(lv_iter_next(iter, elem) == LV_RESULT_OK) { + inspect_cb(elem); + } + + lv_free(elem); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool peek_fill_cb(void * buf, const uint32_t buf_len, const int32_t index, void * user_data) +{ + LV_UNUSED(buf_len); + LV_UNUSED(index); + + const lv_iter_t * iter = user_data; + const lv_result_t iter_res = iter->next_cb(iter->instance, iter->context, buf); + if(iter_res == LV_RESULT_INVALID) return false; + + return true; +} diff --git a/inc/lvgl/src/misc/lv_iter.h b/inc/lvgl/src/misc/lv_iter.h new file mode 100644 index 0000000..469d441 --- /dev/null +++ b/inc/lvgl/src/misc/lv_iter.h @@ -0,0 +1,120 @@ +/** +* @file lv_iter.h +* + */ + + +#ifndef LV_ITER_H +#define LV_ITER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef lv_result_t (*lv_iter_next_cb)(void * instance, void * context, void * elem); +typedef void (*lv_iter_inspect_cb)(void * elem); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an iterator based on an instance, and then the next element of the iterator can be obtained through lv_iter_next, + * In order to obtain the next operation in a unified and abstract way. + * @param instance The instance to be iterated + * @param elem_size The size of the element to be iterated in bytes + * @param context_size The size of the context to be passed to the next_cb in bytes + * @param next_cb The callback function to get the next element + * @return The iterator object + */ +lv_iter_t * lv_iter_create(void * instance, uint32_t elem_size, uint32_t context_size, lv_iter_next_cb next_cb); + +/** + * Get the context of the iterator. You can use it to store some temporary variables associated with current iterator.. + * @param iter `lv_iter_t` object create before + * @return the iter context + */ +void * lv_iter_get_context(const lv_iter_t * iter); + +/** + * Destroy the iterator object, and release the context. Other resources allocated by the user are not released. + * The user needs to release it by itself. + * @param iter `lv_iter_t` object create before + */ +void lv_iter_destroy(lv_iter_t * iter); + +/** + * Get the next element of the iterator. + * @param iter `lv_iter_t` object create before + * @param elem The pointer to store the next element + * @return LV_RESULT_OK: Get the next element successfully + * LV_RESULT_INVALID: The next element is invalid + */ +lv_result_t lv_iter_next(lv_iter_t * iter, void * elem); + +/** + * Make the iterator peekable, which means that the user can peek the next element without advancing the iterator. + * @param iter `lv_iter_t` object create before + * @param capacity The capacity of the peek buffer + */ +void lv_iter_make_peekable(lv_iter_t * iter, uint32_t capacity); + +/** + * Peek the next element of the iterator without advancing the iterator. + * @param iter `lv_iter_t` object create before + * @param elem The pointer to store the next element + * @return LV_RESULT_OK: Peek the next element successfully + * LV_RESULT_INVALID: The next element is invalid + */ +lv_result_t lv_iter_peek(lv_iter_t * iter, void * elem); + +/** + * Only advance the iterator without getting the next element. + * @param iter `lv_iter_t` object create before + * @return LV_RESULT_OK: Peek the next element successfully + * LV_RESULT_INVALID: The next element is invalid + */ +lv_result_t lv_iter_peek_advance(lv_iter_t * iter); + +/** + * Reset the peek cursor to the `next` cursor. + * @param iter `lv_iter_t` object create before + * @return LV_RESULT_OK: Reset the peek buffer successfully + * LV_RESULT_INVALID: The peek buffer is invalid + */ +lv_result_t lv_iter_peek_reset(lv_iter_t * iter); + +/** + * Inspect the element of the iterator. The callback function will be called for each element of the iterator. + * @param iter `lv_iter_t` object create before + * @param inspect_cb The callback function to inspect the element + */ +void lv_iter_inspect(lv_iter_t * iter, lv_iter_inspect_cb inspect_cb); + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ITER_H*/ diff --git a/inc/lvgl/src/misc/lv_ll.c b/inc/lvgl/src/misc/lv_ll.c new file mode 100644 index 0000000..9d86f1d --- /dev/null +++ b/inc/lvgl/src/misc/lv_ll.c @@ -0,0 +1,339 @@ +/** + * @file lv_ll.c + * Handle linked lists. + * The nodes are dynamically allocated by the 'lv_mem' module, + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ll.h" +#include "../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ +#define LL_NODE_META_SIZE (sizeof(lv_ll_node_t *) + sizeof(lv_ll_node_t *)) +#define LL_PREV_P_OFFSET(ll_p) (ll_p->n_size) +#define LL_NEXT_P_OFFSET(ll_p) (ll_p->n_size + sizeof(lv_ll_node_t *)) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev); +static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_ll_init(lv_ll_t * ll_p, uint32_t node_size) +{ + ll_p->head = NULL; + ll_p->tail = NULL; +#ifdef LV_ARCH_64 + /*Round the size up to 8*/ + node_size = (node_size + 7) & (~0x7); +#else + /*Round the size up to 4*/ + node_size = (node_size + 3) & (~0x3); +#endif + + ll_p->n_size = node_size; +} + +void * lv_ll_ins_head(lv_ll_t * ll_p) +{ + lv_ll_node_t * n_new; + + n_new = lv_malloc(ll_p->n_size + LL_NODE_META_SIZE); + + if(n_new != NULL) { + node_set_prev(ll_p, n_new, NULL); /*No prev. before the new head*/ + node_set_next(ll_p, n_new, ll_p->head); /*After new comes the old head*/ + + if(ll_p->head != NULL) { /*If there is old head then before it goes the new*/ + node_set_prev(ll_p, ll_p->head, n_new); + } + + ll_p->head = n_new; /*Set the new head in the dsc.*/ + if(ll_p->tail == NULL) { /*If there is no tail (1. node) set the tail too*/ + ll_p->tail = n_new; + } + } + + return n_new; +} + +void * lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act) +{ + lv_ll_node_t * n_new; + + if(NULL == ll_p || NULL == n_act) return NULL; + + if(lv_ll_get_head(ll_p) == n_act) { + n_new = lv_ll_ins_head(ll_p); + if(n_new == NULL) return NULL; + } + else { + n_new = lv_malloc(ll_p->n_size + LL_NODE_META_SIZE); + if(n_new == NULL) return NULL; + + lv_ll_node_t * n_prev; + n_prev = lv_ll_get_prev(ll_p, n_act); + node_set_next(ll_p, n_prev, n_new); + node_set_prev(ll_p, n_new, n_prev); + node_set_prev(ll_p, n_act, n_new); + node_set_next(ll_p, n_new, n_act); + } + + return n_new; +} + +void * lv_ll_ins_tail(lv_ll_t * ll_p) +{ + lv_ll_node_t * n_new; + + n_new = lv_malloc(ll_p->n_size + LL_NODE_META_SIZE); + + if(n_new != NULL) { + node_set_next(ll_p, n_new, NULL); /*No next after the new tail*/ + node_set_prev(ll_p, n_new, ll_p->tail); /*The prev. before new is the old tail*/ + if(ll_p->tail != NULL) { /*If there is old tail then the new comes after it*/ + node_set_next(ll_p, ll_p->tail, n_new); + } + + ll_p->tail = n_new; /*Set the new tail in the dsc.*/ + if(ll_p->head == NULL) { /*If there is no head (1. node) set the head too*/ + ll_p->head = n_new; + } + } + + return n_new; +} + +void lv_ll_remove(lv_ll_t * ll_p, void * node_p) +{ + if(ll_p == NULL) return; + + if(lv_ll_get_head(ll_p) == node_p) { + /*The new head will be the node after 'node_p'*/ + ll_p->head = lv_ll_get_next(ll_p, node_p); + if(ll_p->head == NULL) { + ll_p->tail = NULL; + } + else { + node_set_prev(ll_p, ll_p->head, NULL); + } + } + else if(lv_ll_get_tail(ll_p) == node_p) { + /*The new tail will be the node before 'node_p'*/ + ll_p->tail = lv_ll_get_prev(ll_p, node_p); + if(ll_p->tail == NULL) { + ll_p->head = NULL; + } + else { + node_set_next(ll_p, ll_p->tail, NULL); + } + } + else { + lv_ll_node_t * n_prev = lv_ll_get_prev(ll_p, node_p); + lv_ll_node_t * n_next = lv_ll_get_next(ll_p, node_p); + + node_set_next(ll_p, n_prev, n_next); + node_set_prev(ll_p, n_next, n_prev); + } +} + +void lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)) +{ + void * i; + void * i_next; + + i = lv_ll_get_head(ll_p); + i_next = NULL; + + while(i != NULL) { + i_next = lv_ll_get_next(ll_p, i); + if(cleanup == NULL) { + lv_ll_remove(ll_p, i); + lv_free(i); + } + else { + cleanup(i); + } + i = i_next; + } +} + +void lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head) +{ + lv_ll_remove(ll_ori_p, node); + + if(head) { + /*Set node as head*/ + node_set_prev(ll_new_p, node, NULL); + node_set_next(ll_new_p, node, ll_new_p->head); + + if(ll_new_p->head != NULL) { /*If there is old head then before it goes the new*/ + node_set_prev(ll_new_p, ll_new_p->head, node); + } + + ll_new_p->head = node; /*Set the new head in the dsc.*/ + if(ll_new_p->tail == NULL) { /*If there is no tail (first node) set the tail too*/ + ll_new_p->tail = node; + } + } + else { + /*Set node as tail*/ + node_set_prev(ll_new_p, node, ll_new_p->tail); + node_set_next(ll_new_p, node, NULL); + + if(ll_new_p->tail != NULL) { /*If there is old tail then after it goes the new*/ + node_set_next(ll_new_p, ll_new_p->tail, node); + } + + ll_new_p->tail = node; /*Set the new tail in the dsc.*/ + if(ll_new_p->head == NULL) { /*If there is no head (first node) set the head too*/ + ll_new_p->head = node; + } + } +} + +void * lv_ll_get_head(const lv_ll_t * ll_p) +{ + if(ll_p == NULL) return NULL; + return ll_p->head; +} + +void * lv_ll_get_tail(const lv_ll_t * ll_p) +{ + if(ll_p == NULL) return NULL; + return ll_p->tail; +} + +void * lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act) +{ + /*Pointer to the next node is stored in the end of this node. + *Go there and return the address found there*/ + const lv_ll_node_t * n_act_d = n_act; + n_act_d += LL_NEXT_P_OFFSET(ll_p); + return *((lv_ll_node_t **)n_act_d); +} + +void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act) +{ + /*Pointer to the prev. node is stored in the end of this node. + *Go there and return the address found there*/ + const lv_ll_node_t * n_act_d = n_act; + n_act_d += LL_PREV_P_OFFSET(ll_p); + return *((lv_ll_node_t **)n_act_d); +} + +uint32_t lv_ll_get_len(const lv_ll_t * ll_p) +{ + uint32_t len = 0; + void * node; + + for(node = lv_ll_get_head(ll_p); node != NULL; node = lv_ll_get_next(ll_p, node)) { + len++; + } + + return len; +} + +void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) +{ + if(n_act == n_after) return; /*Can't move before itself*/ + + void * n_before; + if(n_after != NULL) + n_before = lv_ll_get_prev(ll_p, n_after); + else + n_before = lv_ll_get_tail(ll_p); /*if `n_after` is NULL `n_act` should be the new tail*/ + + if(n_act == n_before) return; /*Already before `n_after`*/ + + /*It's much easier to remove from the list and add again*/ + lv_ll_remove(ll_p, n_act); + + /*Add again by setting the prev. and next nodes*/ + node_set_next(ll_p, n_before, n_act); + node_set_prev(ll_p, n_act, n_before); + node_set_prev(ll_p, n_after, n_act); + node_set_next(ll_p, n_act, n_after); + + /*If `n_act` was moved before NULL then it become the new tail*/ + if(n_after == NULL) ll_p->tail = n_act; + + /*If `n_act` was moved before `NULL` then it's the new head*/ + if(n_before == NULL) ll_p->head = n_act; +} + +bool lv_ll_is_empty(lv_ll_t * ll_p) +{ + if(ll_p == NULL) return true; + + if(ll_p->head == NULL && ll_p->tail == NULL) return true; + + return false; +} + +void lv_ll_clear(lv_ll_t * ll_p) +{ + lv_ll_clear_custom(ll_p, NULL); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Set the previous node pointer of a node + * @param ll_p pointer to linked list + * @param act pointer to a node which prev. node pointer should be set + * @param prev pointer to a node which should be the previous node before 'act' + */ +static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev) +{ + if(act == NULL) return; /*Can't set the prev node of `NULL`*/ + + uint8_t * act8 = (uint8_t *)act; + + act8 += LL_PREV_P_OFFSET(ll_p); + + lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8; + lv_ll_node_t ** prev_node_p = (lv_ll_node_t **) &prev; + + *act_node_p = *prev_node_p; +} + +/** + * Set the 'next node pointer' of a node + * @param ll_p pointer to linked list + * @param act pointer to a node which next node pointer should be set + * @param next pointer to a node which should be the next node before 'act' + */ +static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next) +{ + if(act == NULL) return; /*Can't set the next node of `NULL`*/ + uint8_t * act8 = (uint8_t *)act; + + act8 += LL_NEXT_P_OFFSET(ll_p); + lv_ll_node_t ** act_node_p = (lv_ll_node_t **) act8; + lv_ll_node_t ** next_node_p = (lv_ll_node_t **) &next; + + *act_node_p = *next_node_p; +} diff --git a/inc/lvgl/src/misc/lv_ll.h b/inc/lvgl/src/misc/lv_ll.h new file mode 100644 index 0000000..ee0836e --- /dev/null +++ b/inc/lvgl/src/misc/lv_ll.h @@ -0,0 +1,169 @@ +/** + * @file lv_ll.h + * Handle linked lists. The nodes are dynamically allocated by the 'lv_mem' module. + */ + +#ifndef LV_LL_H +#define LV_LL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Dummy type to make handling easier*/ +typedef uint8_t lv_ll_node_t; + +/** Description of a linked list*/ +typedef struct { + uint32_t n_size; + lv_ll_node_t * head; + lv_ll_node_t * tail; +} lv_ll_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize linked list + * @param ll_p pointer to lv_ll_t variable + * @param node_size the size of 1 node in bytes + */ +void lv_ll_init(lv_ll_t * ll_p, uint32_t node_size); + +/** + * Add a new head to a linked list + * @param ll_p pointer to linked list + * @return pointer to the new head + */ +void * lv_ll_ins_head(lv_ll_t * ll_p); + +/** + * Insert a new node in front of the n_act node + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the new node + */ +void * lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act); + +/** + * Add a new tail to a linked list + * @param ll_p pointer to linked list + * @return pointer to the new tail + */ +void * lv_ll_ins_tail(lv_ll_t * ll_p); + +/** + * Remove the node 'node_p' from 'll_p' linked list. + * It does not free the memory of node. + * @param ll_p pointer to the linked list of 'node_p' + * @param node_p pointer to node in 'll_p' linked list + */ +void lv_ll_remove(lv_ll_t * ll_p, void * node_p); + +void lv_ll_clear_custom(lv_ll_t * ll_p, void(*cleanup)(void *)); + +/** + * Remove and free all elements from a linked list. The list remain valid but become empty. + * @param ll_p pointer to linked list + */ +void lv_ll_clear(lv_ll_t * ll_p); + +/** + * Move a node to a new linked list + * @param ll_ori_p pointer to the original (old) linked list + * @param ll_new_p pointer to the new linked list + * @param node pointer to a node + * @param head true: be the head in the new list + * false be the tail in the new list + */ +void lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head); + +/** + * Return with head node of the linked list + * @param ll_p pointer to linked list + * @return pointer to the head of 'll_p' + */ +void * lv_ll_get_head(const lv_ll_t * ll_p); + +/** + * Return with tail node of the linked list + * @param ll_p pointer to linked list + * @return pointer to the tail of 'll_p' + */ +void * lv_ll_get_tail(const lv_ll_t * ll_p); + +/** + * Return with the pointer of the next node after 'n_act' + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the next node + */ +void * lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act); + +/** + * Return with the pointer of the previous node after 'n_act' + * @param ll_p pointer to linked list + * @param n_act pointer a node + * @return pointer to the previous node + */ +void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act); + +/** + * Return the length of the linked list. + * @param ll_p pointer to linked list + * @return length of the linked list + */ +uint32_t lv_ll_get_len(const lv_ll_t * ll_p); + +/* + * TODO + * @param ll_p + * @param n1_p + * @param n2_p +void lv_ll_swap(lv_ll_t * ll_p, void * n1_p, void * n2_p); + */ + +/** + * Move a node before another node in the same linked list + * + * @param ll_p pointer to a linked list + * @param n_act pointer to node to move + * @param n_after pointer to a node which should be after `n_act` + */ +void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after); + +/** + * Check if a linked list is empty + * @param ll_p pointer to a linked list + * @return true: the linked list is empty; false: not empty + */ +bool lv_ll_is_empty(lv_ll_t * ll_p); + +/********************** + * MACROS + **********************/ + +#define LV_LL_READ(list, i) for(i = lv_ll_get_head(list); i != NULL; i = lv_ll_get_next(list, i)) + +#define LV_LL_READ_BACK(list, i) for(i = lv_ll_get_tail(list); i != NULL; i = lv_ll_get_prev(list, i)) + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/inc/lvgl/src/misc/lv_log.c b/inc/lvgl/src/misc/lv_log.c new file mode 100644 index 0000000..4dd1975 --- /dev/null +++ b/inc/lvgl/src/misc/lv_log.c @@ -0,0 +1,149 @@ +/** + * @file lv_log.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_log.h" +#if LV_USE_LOG + +#include "../misc/lv_types.h" +#include "../stdlib/lv_sprintf.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" +#include "../tick/lv_tick.h" +#include "../core/lv_global.h" + +#if LV_LOG_PRINTF + #include +#endif + +/********************* + * DEFINES + *********************/ +#if LV_LOG_USE_TIMESTAMP + #define last_log_time LV_GLOBAL_DEFAULT()->log_last_log_time +#endif +#define custom_print_cb LV_GLOBAL_DEFAULT()->custom_log_print_cb + +#if LV_LOG_USE_TIMESTAMP + #define LOG_TIMESTAMP_FMT "\t(%" LV_PRIu32 ".%03" LV_PRIu32 ", +%" LV_PRIu32 ")\t" + #define LOG_TIMESTAMP_EXPR t / 1000, t % 1000, t - last_log_time, +#else + #define LOG_TIMESTAMP_FMT + #define LOG_TIMESTAMP_EXPR +#endif + +#if LV_LOG_USE_FILE_LINE + #define LOG_FILE_LINE_FMT " %s:%d" + #define LOG_FILE_LINE_EXPR , &file[p], line +#else + #define LOG_FILE_LINE_FMT + #define LOG_FILE_LINE_EXPR +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb) +{ + custom_print_cb = print_cb; +} + +void lv_log_add(lv_log_level_t level, const char * file, int line, const char * func, const char * format, ...) +{ + if(level >= LV_LOG_LEVEL_NUM) return; /*Invalid level*/ + + if(level >= LV_LOG_LEVEL) { + va_list args; + va_start(args, format); + +#if LV_LOG_USE_FILE_LINE + /*Use only the file name not the path*/ + size_t p; + for(p = lv_strlen(file); p > 0; p--) { + if(file[p] == '/' || file[p] == '\\') { + p++; /*Skip the slash*/ + break; + } + } +#else + LV_UNUSED(file); + LV_UNUSED(line); +#endif + +#if LV_LOG_USE_TIMESTAMP + uint32_t t = lv_tick_get(); +#endif + static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error", "User"}; + + if(custom_print_cb) { + char buf[512]; + char msg[256]; + lv_vsnprintf(msg, sizeof(msg), format, args); + lv_snprintf(buf, sizeof(buf), "[%s]" LOG_TIMESTAMP_FMT " %s: %s" LOG_FILE_LINE_FMT "\n", + lvl_prefix[level], LOG_TIMESTAMP_EXPR func, msg LOG_FILE_LINE_EXPR); + custom_print_cb(level, buf); + } +#if LV_LOG_PRINTF + else { + printf("[%s]" LOG_TIMESTAMP_FMT " %s: ", + lvl_prefix[level], LOG_TIMESTAMP_EXPR func); + vprintf(format, args); + printf(LOG_FILE_LINE_FMT "\n" LOG_FILE_LINE_EXPR); + fflush(stdout); + } +#endif + +#if LV_LOG_USE_TIMESTAMP + last_log_time = t; +#endif + va_end(args); + } +} + +void lv_log(const char * format, ...) +{ + if(LV_LOG_LEVEL >= LV_LOG_LEVEL_NONE) return; /* disable log */ + + va_list args; + va_start(args, format); + + if(custom_print_cb) { + char buf[512]; + lv_vsnprintf(buf, sizeof(buf), format, args); + custom_print_cb(LV_LOG_LEVEL_USER, buf); + } +#if LV_LOG_PRINTF + else { + vprintf(format, args); + } +#endif + + va_end(args); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_LOG*/ diff --git a/inc/lvgl/src/misc/lv_log.h b/inc/lvgl/src/misc/lv_log.h new file mode 100644 index 0000000..305d309 --- /dev/null +++ b/inc/lvgl/src/misc/lv_log.h @@ -0,0 +1,162 @@ +/** + * @file lv_log.h + * + */ + +#ifndef LV_LOG_H +#define LV_LOG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/*Possible log level. For compatibility declare it independently from `LV_USE_LOG`*/ + +#define LV_LOG_LEVEL_TRACE 0 /**< Log detailed information. */ +#define LV_LOG_LEVEL_INFO 1 /**< Log important events. */ +#define LV_LOG_LEVEL_WARN 2 /**< Log if something unwanted happened but didn't caused problem. */ +#define LV_LOG_LEVEL_ERROR 3 /**< Log only critical issues, when system may fail. */ +#define LV_LOG_LEVEL_USER 4 /**< Log only custom log messages added by the user. */ +#define LV_LOG_LEVEL_NONE 5 /**< Do not log anything. */ +#define LV_LOG_LEVEL_NUM 5 /**< Number of log levels */ + +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_TRACE); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_INFO); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_WARN); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_ERROR); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_USER); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_NONE); + +typedef int8_t lv_log_level_t; + +#if LV_USE_LOG + +#if LV_LOG_USE_FILE_LINE +#define LV_LOG_FILE __FILE__ +#define LV_LOG_LINE __LINE__ +#else +#define LV_LOG_FILE NULL +#define LV_LOG_LINE 0 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/** + * Log print function. Receives a string buffer to print". + */ +typedef void (*lv_log_print_g_cb_t)(lv_log_level_t level, const char * buf); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Register custom print/write function to call when a log is added. + * It can format its "File path", "Line number" and "Description" as required + * and send the formatted log message to a console or serial port. + * @param print_cb a function pointer to print a log + */ +void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb); + +/** + * Print a log message via `printf` if enabled with `LV_LOG_PRINTF` in `lv_conf.h` + * and/or a print callback if registered with `lv_log_register_print_cb` + * @param format printf-like format string + * @param ... parameters for `format` + */ +void lv_log(const char * format, ...) LV_FORMAT_ATTRIBUTE(1, 2); + +/** + * Add a log + * @param level the level of log. (From `lv_log_level_t` enum) + * @param file name of the file when the log added + * @param line line number in the source code where the log added + * @param func name of the function when the log added + * @param format printf-like format string + * @param ... parameters for `format` + */ +void lv_log_add(lv_log_level_t level, const char * file, int line, + const char * func, const char * format, ...) LV_FORMAT_ATTRIBUTE(5, 6); + +/********************** + * MACROS + **********************/ +#ifndef LV_LOG_TRACE +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_TRACE +# define LV_LOG_TRACE(...) lv_log_add(LV_LOG_LEVEL_TRACE, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_TRACE(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_INFO +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO +# define LV_LOG_INFO(...) lv_log_add(LV_LOG_LEVEL_INFO, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_INFO(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_WARN +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_WARN +# define LV_LOG_WARN(...) lv_log_add(LV_LOG_LEVEL_WARN, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_WARN(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_ERROR +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_ERROR +# define LV_LOG_ERROR(...) lv_log_add(LV_LOG_LEVEL_ERROR, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_ERROR(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG_USER +# if LV_LOG_LEVEL <= LV_LOG_LEVEL_USER +# define LV_LOG_USER(...) lv_log_add(LV_LOG_LEVEL_USER, LV_LOG_FILE, LV_LOG_LINE, __func__, __VA_ARGS__) +# else +# define LV_LOG_USER(...) do {}while(0) +# endif +#endif + +#ifndef LV_LOG +# if LV_LOG_LEVEL < LV_LOG_LEVEL_NONE +# define LV_LOG(...) lv_log(__VA_ARGS__) +# else +# define LV_LOG(...) do {} while(0) +# endif +#endif + +#else /*LV_USE_LOG*/ + +/*Do nothing if `LV_USE_LOG 0`*/ +#define lv_log_add(level, file, line, ...) +#define LV_LOG_TRACE(...) do {}while(0) +#define LV_LOG_INFO(...) do {}while(0) +#define LV_LOG_WARN(...) do {}while(0) +#define LV_LOG_ERROR(...) do {}while(0) +#define LV_LOG_USER(...) do {}while(0) +#define LV_LOG(...) do {}while(0) + +#endif /*LV_USE_LOG*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LOG_H*/ diff --git a/inc/lvgl/src/misc/lv_lru.c b/inc/lvgl/src/misc/lv_lru.c new file mode 100755 index 0000000..3bff0e2 --- /dev/null +++ b/inc/lvgl/src/misc/lv_lru.c @@ -0,0 +1,344 @@ +/** + * @file lv_lru.c + * + * @see https://github.com/willcannings/C-LRU-Cache + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_lru.h" +#include "lv_math.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" +#include "lv_assert.h" +#include "lv_log.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_lru_item_t { + void * value; + void * key; + size_t value_length; + size_t key_length; + uint64_t access_count; + struct _lv_lru_item_t * next; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * MurmurHash2 + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + */ +static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_length); + +/** compare a key against an existing item's key */ +static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length); + +/** remove an item and push it to the free items queue */ +static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index); + +/** pop an existing item off the free queue, or create a new one */ +static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/* error helpers */ +#define error_for(conditions, error) if(conditions) {return error;} +#define test_for_missing_cache() error_for(!cache, LV_LRU_MISSING_CACHE) +#define test_for_missing_key() error_for(!key, LV_LRU_MISSING_KEY) +#define test_for_missing_value() error_for(!value || value_length == 0, LV_LRU_MISSING_VALUE) +#define test_for_value_too_large() error_for(value_length > cache->total_memory, LV_LRU_VALUE_TOO_LARGE) + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_lru_t * lv_lru_create(size_t cache_size, size_t average_length, lv_lru_free_cb_t value_free, + lv_lru_free_cb_t key_free) +{ + // create the cache + lv_lru_t * cache = lv_malloc_zeroed(sizeof(lv_lru_t)); + if(!cache) { + LV_LOG_WARN("LRU Cache unable to create cache object"); + return NULL; + } + cache->hash_table_size = cache_size / average_length; + cache->average_item_length = average_length; + cache->free_memory = cache_size; + cache->total_memory = cache_size; + cache->seed = lv_rand(1, UINT32_MAX); + cache->value_free = value_free ? value_free : lv_free; + cache->key_free = key_free ? key_free : lv_free; + + // size the hash table to a guesstimate of the number of slots required (assuming a perfect hash) + cache->items = lv_malloc_zeroed(sizeof(lv_lru_item_t *) * cache->hash_table_size); + if(!cache->items) { + LV_LOG_WARN("LRU Cache unable to create cache hash table"); + lv_free(cache); + return NULL; + } + return cache; +} + +void lv_lru_delete(lv_lru_t * cache) +{ + LV_ASSERT_NULL(cache); + + // free each of the cached items, and the hash table + lv_lru_item_t * item = NULL, * next = NULL; + uint32_t i = 0; + if(cache->items) { + for(; i < cache->hash_table_size; i++) { + item = cache->items[i]; + while(item) { + next = (lv_lru_item_t *) item->next; + cache->value_free(item->value); + cache->key_free(item->key); + cache->free_memory += item->value_length; + lv_free(item); + item = next; + } + } + lv_free(cache->items); + } + + if(cache->free_items) { + item = cache->free_items; + while(item) { + next = (lv_lru_item_t *) item->next; + lv_free(item); + item = next; + } + } + + // free the cache + lv_free(cache); +} + +lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, void * value, size_t value_length) +{ + test_for_missing_cache(); + test_for_missing_key(); + test_for_missing_value(); + test_for_value_too_large(); + + // see if the key already exists + uint32_t hash_index = lv_lru_hash(cache, key, key_length); + int required = 0; + lv_lru_item_t * item = NULL, * prev = NULL; + item = cache->items[hash_index]; + + while(item && lv_lru_cmp_keys(item, key, key_length)) { + prev = item; + item = (lv_lru_item_t *) item->next; + } + + if(item) { + // update the value and value_lengths + required = (int)(value_length - item->value_length); + cache->value_free(item->value); + item->value = value; + item->value_length = value_length; + + } + else { + // insert a new item + item = lv_lru_pop_or_create_item(cache); + item->value = value; + item->key = lv_malloc(key_length); + lv_memcpy(item->key, key, key_length); + item->value_length = value_length; + item->key_length = key_length; + required = (int) value_length; + + if(prev) + prev->next = item; + else + cache->items[hash_index] = item; + } + item->access_count = ++cache->access_count; + + // remove as many items as necessary to free enough space + if(required > 0 && (size_t) required > cache->free_memory) { + while(cache->free_memory < (size_t) required) + lv_lru_remove_lru_item(cache); + } + cache->free_memory -= required; + return LV_LRU_OK; +} + +lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, void ** value) +{ + test_for_missing_cache(); + test_for_missing_key(); + + // loop until we find the item, or hit the end of a chain + uint32_t hash_index = lv_lru_hash(cache, key, key_size); + lv_lru_item_t * item = cache->items[hash_index]; + + while(item && lv_lru_cmp_keys(item, key, key_size)) + item = (lv_lru_item_t *) item->next; + + if(item) { + *value = item->value; + item->access_count = ++cache->access_count; + } + else { + *value = NULL; + } + + return LV_LRU_OK; +} + +lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size) +{ + test_for_missing_cache(); + test_for_missing_key(); + + // loop until we find the item, or hit the end of a chain + lv_lru_item_t * item = NULL, * prev = NULL; + uint32_t hash_index = lv_lru_hash(cache, key, key_size); + item = cache->items[hash_index]; + + while(item && lv_lru_cmp_keys(item, key, key_size)) { + prev = item; + item = (lv_lru_item_t *) item->next; + } + + if(item) { + lv_lru_remove_item(cache, prev, item, hash_index); + } + + return LV_LRU_OK; +} + +void lv_lru_remove_lru_item(lv_lru_t * cache) +{ + lv_lru_item_t * min_item = NULL, * min_prev = NULL; + lv_lru_item_t * item = NULL, * prev = NULL; + uint32_t i = 0, min_index = -1; + uint64_t min_access_count = -1; + + for(; i < cache->hash_table_size; i++) { + item = cache->items[i]; + prev = NULL; + + while(item) { + if(item->access_count < min_access_count || (int64_t) min_access_count == -1) { + min_access_count = item->access_count; + min_item = item; + min_prev = prev; + min_index = i; + } + prev = item; + item = item->next; + } + } + + if(min_item) { + lv_lru_remove_item(cache, min_prev, min_item, min_index); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t lv_lru_hash(lv_lru_t * cache, const void * key, uint32_t key_length) +{ + uint32_t m = 0x5bd1e995; + uint32_t r = 24; + uint32_t h = cache->seed ^ key_length; + char * data = (char *) key; + + while(key_length >= 4) { + uint32_t k = *(uint32_t *) data; + k *= m; + k ^= k >> r; + k *= m; + h *= m; + h ^= k; + data += 4; + key_length -= 4; + } + + if(key_length >= 3) { + h ^= data[2] << 16; + } + if(key_length >= 2) { + h ^= data[1] << 8; + } + if(key_length >= 1) { + h ^= data[0]; + h *= m; + } + + h ^= h >> 13; + h *= m; + h ^= h >> 15; + return h % cache->hash_table_size; +} + +static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_length) +{ + if(key_length != item->key_length) { + return 1; + } + else { + return lv_memcmp(key, item->key, key_length); + } +} + +static void lv_lru_remove_item(lv_lru_t * cache, lv_lru_item_t * prev, lv_lru_item_t * item, uint32_t hash_index) +{ + if(prev) { + prev->next = item->next; + } + else { + cache->items[hash_index] = (lv_lru_item_t *) item->next; + } + + // free memory and update the free memory counter + cache->free_memory += item->value_length; + cache->value_free(item->value); + cache->key_free(item->key); + + // push the item to the free items queue + lv_memzero(item, sizeof(lv_lru_item_t)); + item->next = cache->free_items; + cache->free_items = item; +} + +static lv_lru_item_t * lv_lru_pop_or_create_item(lv_lru_t * cache) +{ + lv_lru_item_t * item = NULL; + + if(cache->free_items) { + item = cache->free_items; + cache->free_items = item->next; + lv_memzero(item, sizeof(lv_lru_item_t)); + } + else { + item = lv_malloc_zeroed(sizeof(lv_lru_item_t)); + } + + return item; +} diff --git a/inc/lvgl/src/misc/lv_lru.h b/inc/lvgl/src/misc/lv_lru.h new file mode 100755 index 0000000..fe41322 --- /dev/null +++ b/inc/lvgl/src/misc/lv_lru.h @@ -0,0 +1,83 @@ +/** + * @file lv_lru.h + * + */ + +#ifndef LV_LRU_H +#define LV_LRU_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_LRU_OK = 0, + LV_LRU_MISSING_CACHE, + LV_LRU_MISSING_KEY, + LV_LRU_MISSING_VALUE, + LV_LRU_LOCK_ERROR, + LV_LRU_VALUE_TOO_LARGE +} lv_lru_res_t; + +typedef void (*lv_lru_free_cb_t)(void * v); + +typedef struct _lv_lru_item_t lv_lru_item_t; + +typedef struct _lv_lru_t { + lv_lru_item_t ** items; + uint64_t access_count; + size_t free_memory; + size_t total_memory; + size_t average_item_length; + size_t hash_table_size; + uint32_t seed; + lv_lru_free_cb_t value_free; + lv_lru_free_cb_t key_free; + lv_lru_item_t * free_items; +} lv_lru_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +lv_lru_t * lv_lru_create(size_t cache_size, size_t average_length, lv_lru_free_cb_t value_free, + lv_lru_free_cb_t key_free); + +void lv_lru_delete(lv_lru_t * cache); + +lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, void * value, size_t value_length); + +lv_lru_res_t lv_lru_get(lv_lru_t * cache, const void * key, size_t key_size, void ** value); + +lv_lru_res_t lv_lru_remove(lv_lru_t * cache, const void * key, size_t key_size); + +/** + * remove the least recently used item + * + * @todo we can optimise this by finding the n lru items, where n = required_space / average_length + */ +void lv_lru_remove_lru_item(lv_lru_t * cache); +/********************** + * MACROS + **********************/ +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LRU_H*/ diff --git a/inc/lvgl/src/misc/lv_math.c b/inc/lvgl/src/misc/lv_math.c new file mode 100644 index 0000000..41fc4dc --- /dev/null +++ b/inc/lvgl/src/misc/lv_math.c @@ -0,0 +1,468 @@ +/** + * @file lv_math.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_math.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define rand_seed LV_GLOBAL_DEFAULT()->math_rand_seed + +/********************** + * TYPEDEFS + **********************/ + +#define CUBIC_NEWTON_ITERATIONS 8 +#define CUBIC_PRECISION_BITS 10 /* 10 or 14 bits recommended, int64_t calculation is used for >14bit precision */ + +#if CUBIC_PRECISION_BITS < 10 || CUBIC_PRECISION_BITS > 20 + #error "cubic precision bits should be in range of [10, 20] for 32bit/64bit calculations." +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ +static const uint16_t sin0_90_table[] = { + 0, 572, 1144, 1715, 2286, 2856, 3425, 3993, 4560, 5126, 5690, 6252, 6813, 7371, 7927, 8481, + 9032, 9580, 10126, 10668, 11207, 11743, 12275, 12803, 13328, 13848, 14365, 14876, 15384, 15886, 16384, 16877, + 17364, 17847, 18324, 18795, 19261, 19720, 20174, 20622, 21063, 21498, 21926, 22348, 22763, 23170, 23571, 23965, + 24351, 24730, 25102, 25466, 25822, 26170, 26510, 26842, 27166, 27482, 27789, 28088, 28378, 28660, 28932, 29197, + 29452, 29698, 29935, 30163, 30382, 30592, 30792, 30983, 31164, 31336, 31499, 31651, 31795, 31928, 32052, 32166, + 32270, 32365, 32449, 32524, 32588, 32643, 32688, 32723, 32748, 32763, 32768 +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_sin(int16_t angle) +{ + int32_t ret = 0; + while(angle < 0) angle += 360; + while(angle >= 360) angle -= 360; + + if(angle < 90) { + ret = sin0_90_table[angle]; + } + else if(angle >= 90 && angle < 180) { + angle = 180 - angle; + ret = sin0_90_table[angle]; + } + else if(angle >= 180 && angle < 270) { + angle = angle - 180; + ret = -sin0_90_table[angle]; + } + else { /*angle >=270*/ + angle = 360 - angle; + ret = -sin0_90_table[angle]; + } + + if(ret == 32767) return 32768; + else if(ret == -32767) return -32768; + else return ret; +} + +/** + * cubic-bezier Reference: + * + * https://github.com/gre/bezier-easing + * https://opensource.apple.com/source/WebCore/WebCore-955.66/platform/graphics/UnitBezier.h + * + * Copyright (c) 2014 Gaëtan Renaudeau + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ + +static int32_t do_cubic_bezier(int32_t t, int32_t a, int32_t b, int32_t c) +{ + /*a * t^3 + b * t^2 + c * t*/ +#if CUBIC_PRECISION_BITS > 14 + int64_t ret; +#else + int32_t ret; +#endif + + ret = a; + ret = (ret * t) >> CUBIC_PRECISION_BITS; + ret = ((ret + b) * t) >> CUBIC_PRECISION_BITS; + ret = ((ret + c) * t) >> CUBIC_PRECISION_BITS; + return ret; +} + +int32_t lv_cubic_bezier(int32_t x, int32_t x1, int32_t y1, int32_t x2, int32_t y2) +{ + int32_t ax, bx, cx, ay, by, cy; + int32_t tl, tr, t; /*t in cubic-bezier function, used for bisection */ + int32_t xs; /*x sampled on curve */ +#if CUBIC_PRECISION_BITS > 14 + int64_t d; /*slope value at specified t*/ +#else + int32_t d; +#endif + + if(x == 0 || x == LV_BEZIER_VAL_MAX) return x; + + /* input is always LV_BEZIER_VAL_SHIFT bit precision */ + +#if CUBIC_PRECISION_BITS != LV_BEZIER_VAL_SHIFT + x <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; + x1 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; + x2 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; + y1 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; + y2 <<= CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT; +#endif + + cx = 3 * x1; + bx = 3 * (x2 - x1) - cx; + ax = (1L << CUBIC_PRECISION_BITS) - cx - bx; + + cy = 3 * y1; + by = 3 * (y2 - y1) - cy; + ay = (1L << CUBIC_PRECISION_BITS) - cy - by; + + /*Try Newton's method firstly */ + t = x; /*Make a guess*/ + for(int i = 0; i < CUBIC_NEWTON_ITERATIONS; i++) { + /*Check if x on curve at t matches input x*/ + xs = do_cubic_bezier(t, ax, bx, cx) - x; + if(LV_ABS(xs) <= 1) goto found; + + /* get slop at t, d = 3 * ax * t^2 + 2 * bx + t + cx */ + d = ax; /* use 64bit operation if needed. */ + d = (3 * d * t) >> CUBIC_PRECISION_BITS; + d = ((d + 2 * bx) * t) >> CUBIC_PRECISION_BITS; + d += cx; + + if(LV_ABS(d) <= 1) break; + + d = ((int64_t)xs * (1L << CUBIC_PRECISION_BITS)) / d; + if(d == 0) break; /*Reached precision limits*/ + t -= d; + } + + /*Fallback to bisection method for reliability*/ + tl = 0, tr = 1L << CUBIC_PRECISION_BITS, t = x; + + if(t < tl) { + t = tl; + goto found; + } + + if(t > tr) { + t = tr; + goto found; + } + + while(tl < tr) { + xs = do_cubic_bezier(t, ax, bx, cx); + if(LV_ABS(xs - x) <= 1) goto found; + x > xs ? (tl = t) : (tr = t); + t = (tr - tl) / 2 + tl; + if(t == tl) break; + } + + /*Failed to find suitable t for given x, return a value anyway.*/ +found: + /*Return y at t*/ +#if CUBIC_PRECISION_BITS != LV_BEZIER_VAL_SHIFT + return do_cubic_bezier(t, ay, by, cy) >> (CUBIC_PRECISION_BITS - LV_BEZIER_VAL_SHIFT); +#else + return do_cubic_bezier(t, ay, by, cy); +#endif +} + +void LV_ATTRIBUTE_FAST_MEM lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask) +{ + x = x << 8; /*To get 4 bit precision. (sqrt(256) = 16 = 4 bit)*/ + + uint32_t root = 0; + uint32_t trial; + /*http://ww1.microchip.com/...en/AppNotes/91040a.pdf*/ + do { + trial = root + mask; + if(trial * trial <= x) root = trial; + mask = mask >> 1; + } while(mask); + + q->i = root >> 4; + q->f = (root & 0xf) << 4; +} + +/* +// Alternative Integer Square Root function +// Contributors include Arne Steinarson for the basic approximation idea, +// Dann Corbit and Mathew Hendry for the first cut at the algorithm, +// Lawrence Kirby for the rearrangement, improvements and range optimization +// and Paul Hsieh for the round-then-adjust idea. +*/ +int32_t LV_ATTRIBUTE_FAST_MEM lv_sqrt32(uint32_t x) +{ + static const unsigned char sqq_table[] = { + 0, 16, 22, 27, 32, 35, 39, 42, 45, 48, 50, 53, 55, 57, + 59, 61, 64, 65, 67, 69, 71, 73, 75, 76, 78, 80, 81, 83, + 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 98, 99, 101, 102, + 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 128, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, + 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, 156, 157, + 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, + 169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, + 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, + 189, 189, 190, 191, 192, 192, 193, 193, 194, 195, 195, 196, 197, 197, + 198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 204, 205, 206, 206, + 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214, 214, 215, + 215, 216, 217, 217, 218, 218, 219, 219, 220, 221, 221, 222, 222, 223, + 224, 224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, 230, 231, + 231, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, + 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, + 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, + 253, 254, 254, 255 + }; + + int32_t xn; + + if(x >= 0x10000) + if(x >= 0x1000000) + if(x >= 0x10000000) + if(x >= 0x40000000) { + if(x >= 65535UL * 65535UL) + return 65535; + xn = sqq_table[x >> 24] << 8; + } + else + xn = sqq_table[x >> 22] << 7; + else if(x >= 0x4000000) + xn = sqq_table[x >> 20] << 6; + else + xn = sqq_table[x >> 18] << 5; + else { + if(x >= 0x100000) + if(x >= 0x400000) + xn = sqq_table[x >> 16] << 4; + else + xn = sqq_table[x >> 14] << 3; + else if(x >= 0x40000) + xn = sqq_table[x >> 12] << 2; + else + xn = sqq_table[x >> 10] << 1; + + goto nr1; + } + else if(x >= 0x100) { + if(x >= 0x1000) + if(x >= 0x4000) + xn = (sqq_table[x >> 8] >> 0) + 1; + else + xn = (sqq_table[x >> 6] >> 1) + 1; + else if(x >= 0x400) + xn = (sqq_table[x >> 4] >> 2) + 1; + else + xn = (sqq_table[x >> 2] >> 3) + 1; + + goto adj; + } + else + return sqq_table[x] >> 4; + + /* Run two iterations of the standard convergence formula */ + + xn = (xn + 1 + x / xn) / 2; +nr1: + xn = (xn + 1 + x / xn) / 2; +adj: + + if(xn * xn > (int32_t)x) /* Correct rounding if necessary */ + xn--; + + return xn; +} + +uint16_t lv_atan2(int x, int y) +{ + /** + * Fast XY vector to integer degree algorithm - Jan 2011 www.RomanBlack.com + * Converts any XY values including 0 to a degree value that should be + * within +/- 1 degree of the accurate value without needing + * large slow trig functions like ArcTan() or ArcCos(). + * NOTE! at least one of the X or Y values must be non-zero! + * This is the full version, for all 4 quadrants and will generate + * the angle in integer degrees from 0-360. + * Any values of X and Y are usable including negative values provided + * they are between -1456 and 1456 so the 16bit multiply does not overflow. + */ + unsigned char negflag; + unsigned char tempdegree; + unsigned char comp; + unsigned int degree; /*this will hold the result*/ + unsigned int ux; + unsigned int uy; + + /*Save the sign flags then remove signs and get XY as unsigned ints*/ + negflag = 0; + if(x < 0) { + negflag += 0x01; /*x flag bit*/ + x = (0 - x); /*is now +*/ + } + ux = x; /*copy to unsigned var before multiply*/ + if(y < 0) { + negflag += 0x02; /*y flag bit*/ + y = (0 - y); /*is now +*/ + } + uy = y; /*copy to unsigned var before multiply*/ + + /*1. Calc the scaled "degrees"*/ + if(ux > uy) { + degree = (uy * 45) / ux; /*degree result will be 0-45 range*/ + negflag += 0x10; /*octant flag bit*/ + } + else { + degree = (ux * 45) / uy; /*degree result will be 0-45 range*/ + } + + /*2. Compensate for the 4 degree error curve*/ + comp = 0; + tempdegree = degree; /*use an unsigned char for speed!*/ + if(tempdegree > 22) { /*if top half of range*/ + if(tempdegree <= 44) comp++; + if(tempdegree <= 41) comp++; + if(tempdegree <= 37) comp++; + if(tempdegree <= 32) comp++; /*max is 4 degrees compensated*/ + } + else { /*else is lower half of range*/ + if(tempdegree >= 2) comp++; + if(tempdegree >= 6) comp++; + if(tempdegree >= 10) comp++; + if(tempdegree >= 15) comp++; /*max is 4 degrees compensated*/ + } + degree += comp; /*degree is now accurate to +/- 1 degree!*/ + + /*Invert degree if it was X>Y octant, makes 0-45 into 90-45*/ + if(negflag & 0x10) degree = (90 - degree); + + /*3. Degree is now 0-90 range for this quadrant,*/ + /*need to invert it for whichever quadrant it was in*/ + if(negflag & 0x02) { /*if -Y*/ + if(negflag & 0x01) /*if -Y -X*/ + degree = (180 + degree); + else /*else is -Y +X*/ + degree = (180 - degree); + } + else { /*else is +Y*/ + if(negflag & 0x01) /*if +Y -X*/ + degree = (360 - degree); + } + return degree; +} + +int64_t lv_pow(int64_t base, int8_t exp) +{ + int64_t result = 1; + + /* Handle negative exponent: base^(-exp) = 1/(base^exp) */ + /* In integer arithmetic, this is 0 for base > 1 */ + if(exp < 0) { + if(base == 0) return 0; /* 0^(-n) is undefined, return 0 */ + if(base == 1) return 1; /* 1^(-n) = 1 */ + if(base == -1) return (exp & 1) ? -1 : 1; /* (-1)^(-n) alternates */ + return 0; /* For all other cases, result is < 1, so 0 */ + } + + while(exp) { + if(exp & 1) + result *= base; + exp >>= 1; + base *= base; + } + + return result; +} + +int32_t lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out) +{ + if(max_in == min_in) return min_out; /*Avoid division by zero later*/ + + if(max_in >= min_in && x >= max_in) return max_out; + if(max_in >= min_in && x <= min_in) return min_out; + + if(max_in <= min_in && x <= max_in) return max_out; + if(max_in <= min_in && x >= min_in) return min_out; + + /** + * The equation should be: + * ((x - min_in) * delta_out) / delta in) + min_out + * To avoid rounding error reorder the operations: + * (x - min_in) * (delta_out / delta_min) + min_out + */ + + int32_t delta_in = max_in - min_in; + int32_t delta_out = max_out - min_out; + + return ((x - min_in) * delta_out) / delta_in + min_out; +} + +void lv_rand_set_seed(uint32_t seed) +{ + rand_seed = seed; +} + +uint32_t lv_rand(uint32_t min, uint32_t max) +{ + /*Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs"*/ + uint32_t x = rand_seed; + x ^= x << 13; + x ^= x >> 17; + x ^= x << 5; + rand_seed = x; + + return (rand_seed % (max - min + 1)) + min; +} + +int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle) +{ + return lv_trigo_sin(angle + 90); +} + +int32_t lv_bezier3(int32_t t, int32_t u0, uint32_t u1, int32_t u2, int32_t u3) +{ + LV_UNUSED(u0); + LV_UNUSED(u3); + return lv_cubic_bezier(t, 341, u1, 683, u2); +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/misc/lv_math.h b/inc/lvgl/src/misc/lv_math.h new file mode 100644 index 0000000..4395994 --- /dev/null +++ b/inc/lvgl/src/misc/lv_math.h @@ -0,0 +1,174 @@ +/** + * @file lv_math.h + * + */ + +#ifndef LV_MATH_H +#define LV_MATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ +#define LV_TRIGO_SIN_MAX 32768 +#define LV_TRIGO_SHIFT 15 /**< >> LV_TRIGO_SHIFT to normalize*/ + +#define LV_BEZIER_VAL_SHIFT 10 /**< log2(LV_BEZIER_VAL_MAX): used to normalize up scaled values*/ +#define LV_BEZIER_VAL_MAX (1L << LV_BEZIER_VAL_SHIFT) /**< Max time in Bezier functions (not [0..1] to use integers)*/ +#define LV_BEZIER_VAL_FLOAT(f) ((int32_t)((f) * LV_BEZIER_VAL_MAX)) /**< Convert const float number cubic-bezier values to fix-point value*/ + +/** Align up value x to align, align must be a power of two */ +#define LV_ALIGN_UP(x, align) (((x) + ((align) - 1)) & ~((align) - 1)) + +/** Round up value x to round, round can be any integer number */ +#define LV_ROUND_UP(x, round) ((((x) + ((round) - 1)) / (round)) * (round)) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + uint16_t i; + uint16_t f; +} lv_sqrt_res_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Return with sinus of an angle + * @param angle + * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 + */ +int32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_trigo_sin(int16_t angle); + +int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle); + +/** + * Calculate the y value of cubic-bezier(x1, y1, x2, y2) function as specified x. + * @param x time in range of [0..LV_BEZIER_VAL_MAX] + * @param x1 x of control point 1 in range of [0..LV_BEZIER_VAL_MAX] + * @param y1 y of control point 1 in range of [0..LV_BEZIER_VAL_MAX] + * @param x2 x of control point 2 in range of [0..LV_BEZIER_VAL_MAX] + * @param y2 y of control point 2 in range of [0..LV_BEZIER_VAL_MAX] + * @return the value calculated + */ +int32_t lv_cubic_bezier(int32_t x, int32_t x1, int32_t y1, int32_t x2, int32_t y2); + +/** + * Calculate a value of a Cubic Bezier function. + * @param t time in range of [0..LV_BEZIER_VAL_MAX] + * @param u0 must be 0 + * @param u1 control value 1 values in range of [0..LV_BEZIER_VAL_MAX] + * @param u2 control value 2 in range of [0..LV_BEZIER_VAL_MAX] + * @param u3 must be LV_BEZIER_VAL_MAX + * @return the value calculated from the given parameters in range of [0..LV_BEZIER_VAL_MAX] + */ +int32_t lv_bezier3(int32_t t, int32_t u0, uint32_t u1, int32_t u2, int32_t u3); + + +/** + * Calculate the atan2 of a vector. + * @param x + * @param y + * @return the angle in degree calculated from the given parameters in range of [0..360] + */ +uint16_t lv_atan2(int x, int y); + +/** + * Get the square root of a number + * @param x integer which square root should be calculated + * @param q store the result here. q->i: integer part, q->f: fractional part in 1/256 unit + * @param mask optional to skip some iterations if the magnitude of the root is known. + * Set to 0x8000 by default. + * If root < 16: mask = 0x80 + * If root < 256: mask = 0x800 + * Else: mask = 0x8000 + */ +void /* LV_ATTRIBUTE_FAST_MEM */ lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask); + +/** + * Alternative (fast, approximate) implementation for getting the square root of an integer. + * @param x integer which square root should be calculated + */ +int32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_sqrt32(uint32_t x); + +/** + * Calculate the square of an integer (input range is 0..32767). + * @param x input + * @return square + */ +static inline int32_t lv_sqr(int32_t x) +{ + return x * x; +} + +/** + * Calculate the integer exponents. + * @param base + * @param exp + * @return base raised to the power exponent + */ +int64_t lv_pow(int64_t base, int8_t exp); + +/** + * Get the mapped of a number given an input and output range + * @param x integer which mapped value should be calculated + * @param min_in min input range + * @param max_in max input range + * @param min_out max output range + * @param max_out max output range + * @return the mapped number + */ +int32_t lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out); + +/** + * Set the seed of the pseudo random number generator + * @param seed a number to initialize the random generator + */ +void lv_rand_set_seed(uint32_t seed); + +/** + * Get a pseudo random number in the given range + * @param min the minimum value + * @param max the maximum value + * @return return the random number. min <= return_value <= max + */ +uint32_t lv_rand(uint32_t min, uint32_t max); + +/********************** + * MACROS + **********************/ +#define LV_MIN(a, b) ((a) < (b) ? (a) : (b)) +#define LV_MIN3(a, b, c) (LV_MIN(LV_MIN(a,b), c)) +#define LV_MIN4(a, b, c, d) (LV_MIN(LV_MIN(a,b), LV_MIN(c,d))) + +#define LV_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define LV_MAX3(a, b, c) (LV_MAX(LV_MAX(a,b), c)) +#define LV_MAX4(a, b, c, d) (LV_MAX(LV_MAX(a,b), LV_MAX(c,d))) + +#define LV_CLAMP(min, val, max) (LV_MAX(min, (LV_MIN(val, max)))) + +#define LV_ABS(x) ((x) > 0 ? (x) : (-(x))) +#define LV_UDIV255(x) (((x) * 0x8081U) >> 0x17) + +#define LV_IS_SIGNED(t) (((t)(-1)) < ((t)0)) +#define LV_UMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0xFULL << ((sizeof(t) * 8ULL) - 4ULL))) +#define LV_SMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0x7ULL << ((sizeof(t) * 8ULL) - 4ULL))) +#define LV_MAX_OF(t) ((unsigned long)(LV_IS_SIGNED(t) ? LV_SMAX_OF(t) : LV_UMAX_OF(t))) + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/inc/lvgl/src/misc/lv_matrix.c b/inc/lvgl/src/misc/lv_matrix.c new file mode 100644 index 0000000..f8b0ba0 --- /dev/null +++ b/inc/lvgl/src/misc/lv_matrix.c @@ -0,0 +1,285 @@ +/** + * @file lv_matrix.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_matrix.h" + +#if LV_USE_MATRIX + +#include "../stdlib/lv_string.h" +#include "lv_math.h" +#include +#include +#include "../misc/lv_log.h" +/********************* + * DEFINES + *********************/ +#ifndef M_PI + #define M_PI 3.1415926f +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_matrix_identity(lv_matrix_t * matrix) +{ + matrix->m[0][0] = 1.0f; + matrix->m[0][1] = 0.0f; + matrix->m[0][2] = 0.0f; + matrix->m[1][0] = 0.0f; + matrix->m[1][1] = 1.0f; + matrix->m[1][2] = 0.0f; + matrix->m[2][0] = 0.0f; + matrix->m[2][1] = 0.0f; + matrix->m[2][2] = 1.0f; +} + +void lv_matrix_translate(lv_matrix_t * matrix, float dx, float dy) +{ + if(lv_matrix_is_identity_or_translation(matrix)) { + /*optimization for matrix translation.*/ + matrix->m[0][2] += dx; + matrix->m[1][2] += dy; + return; + } + + lv_matrix_t tlm = {{ + {1.0f, 0.0f, dx}, + {0.0f, 1.0f, dy}, + {0.0f, 0.0f, 1.0f}, + } + }; + + lv_matrix_multiply(matrix, &tlm); +} + +void lv_matrix_scale(lv_matrix_t * matrix, float scale_x, float scale_y) +{ + lv_matrix_t scm = {{ + {scale_x, 0.0f, 0.0f}, + {0.0f, scale_y, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + lv_matrix_multiply(matrix, &scm); +} + +void lv_matrix_rotate(lv_matrix_t * matrix, float degree) +{ + float radian = degree / 180.0f * (float)M_PI; + float cos_r = cosf(radian); + float sin_r = sinf(radian); + + lv_matrix_t rtm = {{ + {cos_r, -sin_r, 0.0f}, + {sin_r, cos_r, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + lv_matrix_multiply(matrix, &rtm); +} + +void lv_matrix_skew(lv_matrix_t * matrix, float skew_x, float skew_y) +{ + float rskew_x = skew_x / 180.0f * (float)M_PI; + float rskew_y = skew_y / 180.0f * (float)M_PI; + float tan_x = tanf(rskew_x); + float tan_y = tanf(rskew_y); + + lv_matrix_t skm = {{ + {1.0f, tan_x, 0.0f}, + {tan_y, 1.0f, 0.0f}, + {0.0f, 0.0f, 1.0f}, + } + }; + + lv_matrix_multiply(matrix, &skm); +} + +void lv_matrix_multiply(lv_matrix_t * matrix, const lv_matrix_t * mul) +{ + /*TODO: use NEON to optimize this function on ARM architecture.*/ + lv_matrix_t tmp; + + for(int y = 0; y < 3; y++) { + for(int x = 0; x < 3; x++) { + tmp.m[y][x] = (matrix->m[y][0] * mul->m[0][x]) + + (matrix->m[y][1] * mul->m[1][x]) + + (matrix->m[y][2] * mul->m[2][x]); + } + } + + lv_memcpy(matrix, &tmp, sizeof(lv_matrix_t)); +} + +bool lv_matrix_inverse(lv_matrix_t * matrix, const lv_matrix_t * m) +{ + float det00, det01, det02; + float d; + bool is_affine; + + /* Test for identity matrix. */ + if(m == NULL) { + lv_matrix_identity(matrix); + return true; + } + + det00 = (m->m[1][1] * m->m[2][2]) - (m->m[2][1] * m->m[1][2]); + det01 = (m->m[2][0] * m->m[1][2]) - (m->m[1][0] * m->m[2][2]); + det02 = (m->m[1][0] * m->m[2][1]) - (m->m[2][0] * m->m[1][1]); + + /* Compute determinant. */ + d = (m->m[0][0] * det00) + (m->m[0][1] * det01) + (m->m[0][2] * det02); + + /* Return 0 if there is no inverse matrix. */ + if(d == 0.0f) + return false; + + /* Compute reciprocal. */ + d = 1.0f / d; + + /* Determine if the matrix is affine. */ + is_affine = (m->m[2][0] == 0.0f) && (m->m[2][1] == 0.0f) && (m->m[2][2] == 1.0f); + + matrix->m[0][0] = d * det00; + matrix->m[0][1] = d * ((m->m[2][1] * m->m[0][2]) - (m->m[0][1] * m->m[2][2])); + matrix->m[0][2] = d * ((m->m[0][1] * m->m[1][2]) - (m->m[1][1] * m->m[0][2])); + matrix->m[1][0] = d * det01; + matrix->m[1][1] = d * ((m->m[0][0] * m->m[2][2]) - (m->m[2][0] * m->m[0][2])); + matrix->m[1][2] = d * ((m->m[1][0] * m->m[0][2]) - (m->m[0][0] * m->m[1][2])); + matrix->m[2][0] = is_affine ? 0.0f : d * det02; + matrix->m[2][1] = is_affine ? 0.0f : d * ((m->m[2][0] * m->m[0][1]) - (m->m[0][0] * m->m[2][1])); + matrix->m[2][2] = is_affine ? 1.0f : d * ((m->m[0][0] * m->m[1][1]) - (m->m[1][0] * m->m[0][1])); + + /* Success. */ + return true; +} + +lv_point_precise_t lv_matrix_transform_precise_point(const lv_matrix_t * matrix, const lv_point_precise_t * point) +{ + lv_point_precise_t p; + lv_value_precise_t w = point->x * matrix->m[2][0] + point->y * matrix->m[2][1] + matrix->m[2][2]; + if(LV_ABS(w) < FLT_EPSILON) { + LV_LOG_ERROR("matrix is invalid"); + p.x = 0; + p.y = 0; + } + else { + lv_value_precise_t inv_w = 1.0f / w; + p.x = (lv_value_precise_t)roundf((point->x * matrix->m[0][0] + point->y * matrix->m[0][1] + matrix->m[0][2]) * inv_w); + p.y = (lv_value_precise_t)roundf((point->x * matrix->m[1][0] + point->y * matrix->m[1][1] + matrix->m[1][2]) * inv_w); + } + return p; +} + +lv_area_t lv_matrix_transform_area(const lv_matrix_t * matrix, const lv_area_t * area) +{ + if(lv_matrix_is_identity(matrix)) { + return *area; + } + + /** + * Since lv_area_t will subtract 1px when calculating width and height, + * this will affect the matrix transformation calculation, so +1px is needed as compensation, + * and the compensation value is subtracted after the calculation is completed + */ + lv_area_t res; + lv_point_precise_t p[4] = { + {area->x1, area->y1}, + {area->x1, area->y2 + 1}, + {area->x2 + 1, area->y1}, + {area->x2 + 1, area->y2 + 1}, + }; + p[0] = lv_matrix_transform_precise_point(matrix, &p[0]); + p[1] = lv_matrix_transform_precise_point(matrix, &p[1]); + p[2] = lv_matrix_transform_precise_point(matrix, &p[2]); + p[3] = lv_matrix_transform_precise_point(matrix, &p[3]); + + res.x1 = (int32_t)(LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x)); + res.x2 = (int32_t)(LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x)) - 1; + res.y1 = (int32_t)(LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y)); + res.y2 = (int32_t)(LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y)) - 1; + + return res; +} + +bool lv_matrix_is_identity(const lv_matrix_t * matrix) +{ + return (matrix->m[0][2] == 0.0f && matrix->m[1][2] == 0.0f && lv_matrix_is_identity_or_translation(matrix)); +} + +bool lv_matrix_is_identity_or_translation(const lv_matrix_t * matrix) +{ + return (matrix->m[0][0] == 1.0f && + matrix->m[0][1] == 0.0f && + matrix->m[1][0] == 0.0f && + matrix->m[1][1] == 1.0f && + matrix->m[2][0] == 0.0f && + matrix->m[2][1] == 0.0f && + matrix->m[2][2] == 1.0f); +} + +void lv_matrix_transpose(const lv_matrix_t * src, lv_matrix_t * dst) +{ + if(src == NULL || dst == NULL) return; + + if(src == dst) { + /* In-place transposition: 3 swaps, minimal stack usage */ + float tmp; + + tmp = dst->m[0][1]; + dst->m[0][1] = dst->m[1][0]; + dst->m[1][0] = tmp; + + tmp = dst->m[0][2]; + dst->m[0][2] = dst->m[2][0]; + dst->m[2][0] = tmp; + + tmp = dst->m[1][2]; + dst->m[1][2] = dst->m[2][1]; + dst->m[2][1] = tmp; + } + else { + dst->m[0][0] = src->m[0][0]; + dst->m[0][1] = src->m[1][0]; + dst->m[0][2] = src->m[2][0]; + + dst->m[1][0] = src->m[0][1]; + dst->m[1][1] = src->m[1][1]; + dst->m[1][2] = src->m[2][1]; + + dst->m[2][0] = src->m[0][2]; + dst->m[2][1] = src->m[1][2]; + dst->m[2][2] = src->m[2][2]; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_MATRIX*/ diff --git a/inc/lvgl/src/misc/lv_matrix.h b/inc/lvgl/src/misc/lv_matrix.h new file mode 100644 index 0000000..d963d0d --- /dev/null +++ b/inc/lvgl/src/misc/lv_matrix.h @@ -0,0 +1,144 @@ +/** + * @file lv_matrix.h + * + */ + +#ifndef LV_MATRIX_H +#define LV_MATRIX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#if LV_USE_MATRIX + +#include "lv_types.h" +#include "lv_area.h" + +/********************* + * DEFINES + *********************/ + +#if !LV_USE_FLOAT +#error "LV_USE_FLOAT is required for lv_matrix" +#endif + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_matrix_t { + float m[3][3]; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Set matrix to identity matrix + * @param matrix pointer to a matrix + */ +void lv_matrix_identity(lv_matrix_t * matrix); + +/** + * Translate the matrix to new position + * @param matrix pointer to a matrix + * @param tx the amount of translate in x direction + * @param tx the amount of translate in y direction + */ +void lv_matrix_translate(lv_matrix_t * matrix, float tx, float ty); + +/** + * Change the scale factor of the matrix + * @param matrix pointer to a matrix + * @param scale_x the scale factor for the X direction + * @param scale_y the scale factor for the Y direction + */ +void lv_matrix_scale(lv_matrix_t * matrix, float scale_x, float scale_y); + +/** + * Rotate the matrix with origin + * @param matrix pointer to a matrix + * @param degree angle to rotate + */ +void lv_matrix_rotate(lv_matrix_t * matrix, float degree); + +/** + * Change the skew factor of the matrix + * @param matrix pointer to a matrix + * @param skew_x the skew factor for x direction + * @param skew_y the skew factor for y direction + */ +void lv_matrix_skew(lv_matrix_t * matrix, float skew_x, float skew_y); + +/** + * Multiply two matrix and store the result to the first one + * @param matrix pointer to a matrix + * @param matrix2 pointer to another matrix + */ +void lv_matrix_multiply(lv_matrix_t * matrix, const lv_matrix_t * mul); + +/** + * Invert the matrix + * @param matrix pointer to a matrix + * @param m pointer to another matrix (optional) + * @return true: the matrix is invertible, false: the matrix is singular and cannot be inverted + */ +bool lv_matrix_inverse(lv_matrix_t * matrix, const lv_matrix_t * m); + +/** + * Transform a point by a matrix + * @param matrix pointer to a matrix + * @param point pointer to a point + * @return the transformed point + */ +lv_point_precise_t lv_matrix_transform_precise_point(const lv_matrix_t * matrix, const lv_point_precise_t * point); + +/** + * Transform an area by a matrix + * @param matrix pointer to a matrix + * @param area pointer to an area + * @return the transformed area + */ +lv_area_t lv_matrix_transform_area(const lv_matrix_t * matrix, const lv_area_t * area); + +/** + * Check if the matrix is identity + * @param matrix pointer to a matrix + * @return true: the matrix is identity , false: the matrix is not identity + */ +bool lv_matrix_is_identity(const lv_matrix_t * matrix); + +/** + * Check if the matrix is identity or translation matrix + * @param matrix pointer to a matrix + * @return true: the matrix is identity or translation matrix, false: the matrix is not identity or translation matrix + */ +bool lv_matrix_is_identity_or_translation(const lv_matrix_t * matrix); + +/** + * Transpose a matrix. + * @param src pointer to the source matrix. If NULL, the function returns. + * @param dst pointer to the destination matrix. If NULL, the function returns. + * Note: src and dst may point to the same matrix for in-place transposition. + */ +void lv_matrix_transpose(const lv_matrix_t * src, lv_matrix_t * dst); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MATRIX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MATRIX_H*/ diff --git a/inc/lvgl/src/misc/lv_palette.c b/inc/lvgl/src/misc/lv_palette.c new file mode 100644 index 0000000..cbcdf4e --- /dev/null +++ b/inc/lvgl/src/misc/lv_palette.c @@ -0,0 +1,130 @@ +/** + * @file lv_palette.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_palette.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_color_t lv_palette_main(lv_palette_t p) +{ + static const lv_color_t colors[] = { + LV_COLOR_MAKE(0xF4, 0x43, 0x36), LV_COLOR_MAKE(0xE9, 0x1E, 0x63), LV_COLOR_MAKE(0x9C, 0x27, 0xB0), LV_COLOR_MAKE(0x67, 0x3A, 0xB7), + LV_COLOR_MAKE(0x3F, 0x51, 0xB5), LV_COLOR_MAKE(0x21, 0x96, 0xF3), LV_COLOR_MAKE(0x03, 0xA9, 0xF4), LV_COLOR_MAKE(0x00, 0xBC, 0xD4), + LV_COLOR_MAKE(0x00, 0x96, 0x88), LV_COLOR_MAKE(0x4C, 0xAF, 0x50), LV_COLOR_MAKE(0x8B, 0xC3, 0x4A), LV_COLOR_MAKE(0xCD, 0xDC, 0x39), + LV_COLOR_MAKE(0xFF, 0xEB, 0x3B), LV_COLOR_MAKE(0xFF, 0xC1, 0x07), LV_COLOR_MAKE(0xFF, 0x98, 0x00), LV_COLOR_MAKE(0xFF, 0x57, 0x22), + LV_COLOR_MAKE(0x79, 0x55, 0x48), LV_COLOR_MAKE(0x60, 0x7D, 0x8B), LV_COLOR_MAKE(0x9E, 0x9E, 0x9E) + }; + + if(p >= LV_PALETTE_LAST) { + LV_LOG_WARN("Invalid palette: %d", p); + return lv_color_black(); + } + + return colors[p]; + +} + +lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl) +{ + static const lv_color_t colors[][5] = { + {LV_COLOR_MAKE(0xEF, 0x53, 0x50), LV_COLOR_MAKE(0xE5, 0x73, 0x73), LV_COLOR_MAKE(0xEF, 0x9A, 0x9A), LV_COLOR_MAKE(0xFF, 0xCD, 0xD2), LV_COLOR_MAKE(0xFF, 0xEB, 0xEE)}, + {LV_COLOR_MAKE(0xEC, 0x40, 0x7A), LV_COLOR_MAKE(0xF0, 0x62, 0x92), LV_COLOR_MAKE(0xF4, 0x8F, 0xB1), LV_COLOR_MAKE(0xF8, 0xBB, 0xD0), LV_COLOR_MAKE(0xFC, 0xE4, 0xEC)}, + {LV_COLOR_MAKE(0xAB, 0x47, 0xBC), LV_COLOR_MAKE(0xBA, 0x68, 0xC8), LV_COLOR_MAKE(0xCE, 0x93, 0xD8), LV_COLOR_MAKE(0xE1, 0xBE, 0xE7), LV_COLOR_MAKE(0xF3, 0xE5, 0xF5)}, + {LV_COLOR_MAKE(0x7E, 0x57, 0xC2), LV_COLOR_MAKE(0x95, 0x75, 0xCD), LV_COLOR_MAKE(0xB3, 0x9D, 0xDB), LV_COLOR_MAKE(0xD1, 0xC4, 0xE9), LV_COLOR_MAKE(0xED, 0xE7, 0xF6)}, + {LV_COLOR_MAKE(0x5C, 0x6B, 0xC0), LV_COLOR_MAKE(0x79, 0x86, 0xCB), LV_COLOR_MAKE(0x9F, 0xA8, 0xDA), LV_COLOR_MAKE(0xC5, 0xCA, 0xE9), LV_COLOR_MAKE(0xE8, 0xEA, 0xF6)}, + {LV_COLOR_MAKE(0x42, 0xA5, 0xF5), LV_COLOR_MAKE(0x64, 0xB5, 0xF6), LV_COLOR_MAKE(0x90, 0xCA, 0xF9), LV_COLOR_MAKE(0xBB, 0xDE, 0xFB), LV_COLOR_MAKE(0xE3, 0xF2, 0xFD)}, + {LV_COLOR_MAKE(0x29, 0xB6, 0xF6), LV_COLOR_MAKE(0x4F, 0xC3, 0xF7), LV_COLOR_MAKE(0x81, 0xD4, 0xFA), LV_COLOR_MAKE(0xB3, 0xE5, 0xFC), LV_COLOR_MAKE(0xE1, 0xF5, 0xFE)}, + {LV_COLOR_MAKE(0x26, 0xC6, 0xDA), LV_COLOR_MAKE(0x4D, 0xD0, 0xE1), LV_COLOR_MAKE(0x80, 0xDE, 0xEA), LV_COLOR_MAKE(0xB2, 0xEB, 0xF2), LV_COLOR_MAKE(0xE0, 0xF7, 0xFA)}, + {LV_COLOR_MAKE(0x26, 0xA6, 0x9A), LV_COLOR_MAKE(0x4D, 0xB6, 0xAC), LV_COLOR_MAKE(0x80, 0xCB, 0xC4), LV_COLOR_MAKE(0xB2, 0xDF, 0xDB), LV_COLOR_MAKE(0xE0, 0xF2, 0xF1)}, + {LV_COLOR_MAKE(0x66, 0xBB, 0x6A), LV_COLOR_MAKE(0x81, 0xC7, 0x84), LV_COLOR_MAKE(0xA5, 0xD6, 0xA7), LV_COLOR_MAKE(0xC8, 0xE6, 0xC9), LV_COLOR_MAKE(0xE8, 0xF5, 0xE9)}, + {LV_COLOR_MAKE(0x9C, 0xCC, 0x65), LV_COLOR_MAKE(0xAE, 0xD5, 0x81), LV_COLOR_MAKE(0xC5, 0xE1, 0xA5), LV_COLOR_MAKE(0xDC, 0xED, 0xC8), LV_COLOR_MAKE(0xF1, 0xF8, 0xE9)}, + {LV_COLOR_MAKE(0xD4, 0xE1, 0x57), LV_COLOR_MAKE(0xDC, 0xE7, 0x75), LV_COLOR_MAKE(0xE6, 0xEE, 0x9C), LV_COLOR_MAKE(0xF0, 0xF4, 0xC3), LV_COLOR_MAKE(0xF9, 0xFB, 0xE7)}, + {LV_COLOR_MAKE(0xFF, 0xEE, 0x58), LV_COLOR_MAKE(0xFF, 0xF1, 0x76), LV_COLOR_MAKE(0xFF, 0xF5, 0x9D), LV_COLOR_MAKE(0xFF, 0xF9, 0xC4), LV_COLOR_MAKE(0xFF, 0xFD, 0xE7)}, + {LV_COLOR_MAKE(0xFF, 0xCA, 0x28), LV_COLOR_MAKE(0xFF, 0xD5, 0x4F), LV_COLOR_MAKE(0xFF, 0xE0, 0x82), LV_COLOR_MAKE(0xFF, 0xEC, 0xB3), LV_COLOR_MAKE(0xFF, 0xF8, 0xE1)}, + {LV_COLOR_MAKE(0xFF, 0xA7, 0x26), LV_COLOR_MAKE(0xFF, 0xB7, 0x4D), LV_COLOR_MAKE(0xFF, 0xCC, 0x80), LV_COLOR_MAKE(0xFF, 0xE0, 0xB2), LV_COLOR_MAKE(0xFF, 0xF3, 0xE0)}, + {LV_COLOR_MAKE(0xFF, 0x70, 0x43), LV_COLOR_MAKE(0xFF, 0x8A, 0x65), LV_COLOR_MAKE(0xFF, 0xAB, 0x91), LV_COLOR_MAKE(0xFF, 0xCC, 0xBC), LV_COLOR_MAKE(0xFB, 0xE9, 0xE7)}, + {LV_COLOR_MAKE(0x8D, 0x6E, 0x63), LV_COLOR_MAKE(0xA1, 0x88, 0x7F), LV_COLOR_MAKE(0xBC, 0xAA, 0xA4), LV_COLOR_MAKE(0xD7, 0xCC, 0xC8), LV_COLOR_MAKE(0xEF, 0xEB, 0xE9)}, + {LV_COLOR_MAKE(0x78, 0x90, 0x9C), LV_COLOR_MAKE(0x90, 0xA4, 0xAE), LV_COLOR_MAKE(0xB0, 0xBE, 0xC5), LV_COLOR_MAKE(0xCF, 0xD8, 0xDC), LV_COLOR_MAKE(0xEC, 0xEF, 0xF1)}, + {LV_COLOR_MAKE(0xBD, 0xBD, 0xBD), LV_COLOR_MAKE(0xE0, 0xE0, 0xE0), LV_COLOR_MAKE(0xEE, 0xEE, 0xEE), LV_COLOR_MAKE(0xF5, 0xF5, 0xF5), LV_COLOR_MAKE(0xFA, 0xFA, 0xFA)}, + }; + + if(p >= LV_PALETTE_LAST) { + LV_LOG_WARN("Invalid palette: %d", p); + return lv_color_black(); + } + + if(lvl == 0 || lvl > 5) { + LV_LOG_WARN("Invalid level: %d. Must be 1..5", lvl); + return lv_color_black(); + } + + lvl--; + + return colors[p][lvl]; +} + +lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl) +{ + static const lv_color_t colors[][4] = { + {LV_COLOR_MAKE(0xE5, 0x39, 0x35), LV_COLOR_MAKE(0xD3, 0x2F, 0x2F), LV_COLOR_MAKE(0xC6, 0x28, 0x28), LV_COLOR_MAKE(0xB7, 0x1C, 0x1C)}, + {LV_COLOR_MAKE(0xD8, 0x1B, 0x60), LV_COLOR_MAKE(0xC2, 0x18, 0x5B), LV_COLOR_MAKE(0xAD, 0x14, 0x57), LV_COLOR_MAKE(0x88, 0x0E, 0x4F)}, + {LV_COLOR_MAKE(0x8E, 0x24, 0xAA), LV_COLOR_MAKE(0x7B, 0x1F, 0xA2), LV_COLOR_MAKE(0x6A, 0x1B, 0x9A), LV_COLOR_MAKE(0x4A, 0x14, 0x8C)}, + {LV_COLOR_MAKE(0x5E, 0x35, 0xB1), LV_COLOR_MAKE(0x51, 0x2D, 0xA8), LV_COLOR_MAKE(0x45, 0x27, 0xA0), LV_COLOR_MAKE(0x31, 0x1B, 0x92)}, + {LV_COLOR_MAKE(0x39, 0x49, 0xAB), LV_COLOR_MAKE(0x30, 0x3F, 0x9F), LV_COLOR_MAKE(0x28, 0x35, 0x93), LV_COLOR_MAKE(0x1A, 0x23, 0x7E)}, + {LV_COLOR_MAKE(0x1E, 0x88, 0xE5), LV_COLOR_MAKE(0x19, 0x76, 0xD2), LV_COLOR_MAKE(0x15, 0x65, 0xC0), LV_COLOR_MAKE(0x0D, 0x47, 0xA1)}, + {LV_COLOR_MAKE(0x03, 0x9B, 0xE5), LV_COLOR_MAKE(0x02, 0x88, 0xD1), LV_COLOR_MAKE(0x02, 0x77, 0xBD), LV_COLOR_MAKE(0x01, 0x57, 0x9B)}, + {LV_COLOR_MAKE(0x00, 0xAC, 0xC1), LV_COLOR_MAKE(0x00, 0x97, 0xA7), LV_COLOR_MAKE(0x00, 0x83, 0x8F), LV_COLOR_MAKE(0x00, 0x60, 0x64)}, + {LV_COLOR_MAKE(0x00, 0x89, 0x7B), LV_COLOR_MAKE(0x00, 0x79, 0x6B), LV_COLOR_MAKE(0x00, 0x69, 0x5C), LV_COLOR_MAKE(0x00, 0x4D, 0x40)}, + {LV_COLOR_MAKE(0x43, 0xA0, 0x47), LV_COLOR_MAKE(0x38, 0x8E, 0x3C), LV_COLOR_MAKE(0x2E, 0x7D, 0x32), LV_COLOR_MAKE(0x1B, 0x5E, 0x20)}, + {LV_COLOR_MAKE(0x7C, 0xB3, 0x42), LV_COLOR_MAKE(0x68, 0x9F, 0x38), LV_COLOR_MAKE(0x55, 0x8B, 0x2F), LV_COLOR_MAKE(0x33, 0x69, 0x1E)}, + {LV_COLOR_MAKE(0xC0, 0xCA, 0x33), LV_COLOR_MAKE(0xAF, 0xB4, 0x2B), LV_COLOR_MAKE(0x9E, 0x9D, 0x24), LV_COLOR_MAKE(0x82, 0x77, 0x17)}, + {LV_COLOR_MAKE(0xFD, 0xD8, 0x35), LV_COLOR_MAKE(0xFB, 0xC0, 0x2D), LV_COLOR_MAKE(0xF9, 0xA8, 0x25), LV_COLOR_MAKE(0xF5, 0x7F, 0x17)}, + {LV_COLOR_MAKE(0xFF, 0xB3, 0x00), LV_COLOR_MAKE(0xFF, 0xA0, 0x00), LV_COLOR_MAKE(0xFF, 0x8F, 0x00), LV_COLOR_MAKE(0xFF, 0x6F, 0x00)}, + {LV_COLOR_MAKE(0xFB, 0x8C, 0x00), LV_COLOR_MAKE(0xF5, 0x7C, 0x00), LV_COLOR_MAKE(0xEF, 0x6C, 0x00), LV_COLOR_MAKE(0xE6, 0x51, 0x00)}, + {LV_COLOR_MAKE(0xF4, 0x51, 0x1E), LV_COLOR_MAKE(0xE6, 0x4A, 0x19), LV_COLOR_MAKE(0xD8, 0x43, 0x15), LV_COLOR_MAKE(0xBF, 0x36, 0x0C)}, + {LV_COLOR_MAKE(0x6D, 0x4C, 0x41), LV_COLOR_MAKE(0x5D, 0x40, 0x37), LV_COLOR_MAKE(0x4E, 0x34, 0x2E), LV_COLOR_MAKE(0x3E, 0x27, 0x23)}, + {LV_COLOR_MAKE(0x54, 0x6E, 0x7A), LV_COLOR_MAKE(0x45, 0x5A, 0x64), LV_COLOR_MAKE(0x37, 0x47, 0x4F), LV_COLOR_MAKE(0x26, 0x32, 0x38)}, + {LV_COLOR_MAKE(0x75, 0x75, 0x75), LV_COLOR_MAKE(0x61, 0x61, 0x61), LV_COLOR_MAKE(0x42, 0x42, 0x42), LV_COLOR_MAKE(0x21, 0x21, 0x21)}, + }; + + if(p >= LV_PALETTE_LAST) { + LV_LOG_WARN("Invalid palette: %d", p); + return lv_color_black(); + } + + if(lvl == 0 || lvl > 4) { + LV_LOG_WARN("Invalid level: %d. Must be 1..4", lvl); + return lv_color_black(); + } + + lvl--; + + return colors[p][lvl]; +} diff --git a/inc/lvgl/src/misc/lv_palette.h b/inc/lvgl/src/misc/lv_palette.h new file mode 100644 index 0000000..d2f408c --- /dev/null +++ b/inc/lvgl/src/misc/lv_palette.h @@ -0,0 +1,68 @@ +/** + * @file lv_palette.h + * + */ + +#ifndef LV_PALETTE_H +#define LV_PALETTE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_color.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_PALETTE_RED, + LV_PALETTE_PINK, + LV_PALETTE_PURPLE, + LV_PALETTE_DEEP_PURPLE, + LV_PALETTE_INDIGO, + LV_PALETTE_BLUE, + LV_PALETTE_LIGHT_BLUE, + LV_PALETTE_CYAN, + LV_PALETTE_TEAL, + LV_PALETTE_GREEN, + LV_PALETTE_LIGHT_GREEN, + LV_PALETTE_LIME, + LV_PALETTE_YELLOW, + LV_PALETTE_AMBER, + LV_PALETTE_ORANGE, + LV_PALETTE_DEEP_ORANGE, + LV_PALETTE_BROWN, + LV_PALETTE_BLUE_GREY, + LV_PALETTE_GREY, + LV_PALETTE_LAST, + LV_PALETTE_NONE = 0xff, +} lv_palette_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*Source: https://vuetifyjs.com/en/styles/colors/#material-colors*/ + +lv_color_t lv_palette_main(lv_palette_t p); +lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl); +lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PALETTE_H*/ diff --git a/inc/lvgl/src/misc/lv_pending.c b/inc/lvgl/src/misc/lv_pending.c new file mode 100644 index 0000000..8feac7d --- /dev/null +++ b/inc/lvgl/src/misc/lv_pending.c @@ -0,0 +1,117 @@ +/** + * @file lv_pending.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_pending.h" +#include "lv_array.h" +#include "lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_pending_t { + lv_array_t * arr_act; + lv_array_t arr_1; + lv_array_t arr_2; + lv_pending_free_cb_t free_cb; + void * user_data; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static inline void lv_pending_array_clear(lv_pending_t * pending, lv_array_t * arr); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_pending_t * lv_pending_create(size_t obj_size, uint32_t capacity_default) +{ + lv_pending_t * pending = lv_malloc_zeroed(sizeof(lv_pending_t)); + LV_ASSERT_MALLOC(pending); + lv_array_init(&pending->arr_1, capacity_default, obj_size); + lv_array_init(&pending->arr_2, capacity_default, obj_size); + pending->arr_act = &pending->arr_1; + return pending; +} + +void lv_pending_destroy(lv_pending_t * pending) +{ + LV_ASSERT_NULL(pending); + lv_pending_remove_all(pending); + lv_array_deinit(&pending->arr_1); + lv_array_deinit(&pending->arr_2); + lv_memzero(pending, sizeof(lv_pending_t)); + lv_free(pending); +} + +void lv_pending_set_free_cb(lv_pending_t * pending, lv_pending_free_cb_t free_cb, + void * user_data) +{ + LV_ASSERT_NULL(pending); + LV_ASSERT_NULL(free_cb); + pending->free_cb = free_cb; + pending->user_data = user_data; +} + +void lv_pending_add(lv_pending_t * pending, void * obj) +{ + LV_ASSERT_NULL(pending); + LV_ASSERT_NULL(obj); + lv_array_push_back(pending->arr_act, obj); +} + +void lv_pending_remove_all(lv_pending_t * pending) +{ + LV_ASSERT_NULL(pending); + + lv_pending_array_clear(pending, &pending->arr_1); + lv_pending_array_clear(pending, &pending->arr_2); +} + +void lv_pending_swap(lv_pending_t * pending) +{ + pending->arr_act = (pending->arr_act == &pending->arr_1) ? &pending->arr_2 : &pending->arr_1; + lv_pending_array_clear(pending, pending->arr_act); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void lv_pending_array_clear(lv_pending_t * pending, lv_array_t * arr) +{ + LV_ASSERT_NULL(pending->free_cb); + + uint32_t size = lv_array_size(arr); + if(size == 0) { + return; + } + + /* remove all the pending objects */ + for(uint32_t i = 0; i < size; i++) { + pending->free_cb(lv_array_at(arr, i), pending->user_data); + } + + lv_array_clear(arr); +} diff --git a/inc/lvgl/src/misc/lv_pending.h b/inc/lvgl/src/misc/lv_pending.h new file mode 100644 index 0000000..9a23d0e --- /dev/null +++ b/inc/lvgl/src/misc/lv_pending.h @@ -0,0 +1,85 @@ +/** + * @file lv_pending.h + * + */ + +#ifndef LV_PENDING_H +#define LV_PENDING_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_pending_t lv_pending_t; + +typedef void (*lv_pending_free_cb_t)(void * obj, void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a pending list + * @param obj_size the size of the objects in the list + * @param capacity_default the default capacity of the list + * @return a pointer to the pending list + */ +lv_pending_t * lv_pending_create(size_t obj_size, uint32_t capacity_default); + +/** + * Destroy a pending list + * @param pending pointer to the pending list + */ +void lv_pending_destroy(lv_pending_t * pending); + +/** + * Set a free callback for the pending list + * @param pending pointer to the pending list + * @param free_cb the free callback + * @param user_data user data to pass to the free callback + */ +void lv_pending_set_free_cb(lv_pending_t * pending, lv_pending_free_cb_t free_cb, + void * user_data); + +/** + * Add an object to the pending list + * @param pending pointer to the pending list + * @param obj pointer to the object to add + */ +void lv_pending_add(lv_pending_t * pending, void * obj); + +/** + * Remove all objects from both pending lists + * @param pending pointer to the pending list + */ +void lv_pending_remove_all(lv_pending_t * pending); + +/** + * Remove all old object references and swap new object references + * @param pending pointer to the pending list + */ +void lv_pending_swap(lv_pending_t * pending); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PENDING_H*/ diff --git a/inc/lvgl/src/misc/lv_profiler.h b/inc/lvgl/src/misc/lv_profiler.h new file mode 100644 index 0000000..840ee9a --- /dev/null +++ b/inc/lvgl/src/misc/lv_profiler.h @@ -0,0 +1,184 @@ +/** + * @file lv_profiler.h + * + */ + +#ifndef LV_PROFILER_H +#define LV_PROFILER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#if LV_USE_PROFILER + +#include LV_PROFILER_INCLUDE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#else + +#define LV_PROFILER_BEGIN +#define LV_PROFILER_END +#define LV_PROFILER_BEGIN_TAG(tag) LV_UNUSED(tag) +#define LV_PROFILER_END_TAG(tag) LV_UNUSED(tag) + +#endif /*LV_USE_PROFILER*/ + +#if LV_USE_PROFILER && LV_PROFILER_LAYOUT +#define LV_PROFILER_LAYOUT_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_LAYOUT_END LV_PROFILER_END +#define LV_PROFILER_LAYOUT_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_LAYOUT_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_LAYOUT_BEGIN +#define LV_PROFILER_LAYOUT_END +#define LV_PROFILER_LAYOUT_BEGIN_TAG(tag) +#define LV_PROFILER_LAYOUT_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_STYLE +#define LV_PROFILER_STYLE_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_STYLE_END LV_PROFILER_END +#define LV_PROFILER_STYLE_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_STYLE_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_STYLE_BEGIN +#define LV_PROFILER_STYLE_END +#define LV_PROFILER_STYLE_BEGIN_TAG(tag) +#define LV_PROFILER_STYLE_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_DRAW +#define LV_PROFILER_DRAW_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_DRAW_END LV_PROFILER_END +#define LV_PROFILER_DRAW_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_DRAW_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_DRAW_BEGIN +#define LV_PROFILER_DRAW_END +#define LV_PROFILER_DRAW_BEGIN_TAG(tag) +#define LV_PROFILER_DRAW_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_DECODER +#define LV_PROFILER_DECODER_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_DECODER_END LV_PROFILER_END +#define LV_PROFILER_DECODER_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_DECODER_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_DECODER_BEGIN +#define LV_PROFILER_DECODER_END +#define LV_PROFILER_DECODER_BEGIN_TAG(tag) +#define LV_PROFILER_DECODER_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_REFR +#define LV_PROFILER_REFR_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_REFR_END LV_PROFILER_END +#define LV_PROFILER_REFR_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_REFR_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_REFR_BEGIN +#define LV_PROFILER_REFR_END +#define LV_PROFILER_REFR_BEGIN_TAG(tag) +#define LV_PROFILER_REFR_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_INDEV +#define LV_PROFILER_INDEV_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_INDEV_END LV_PROFILER_END +#define LV_PROFILER_INDEV_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_INDEV_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_INDEV_BEGIN +#define LV_PROFILER_INDEV_END +#define LV_PROFILER_INDEV_BEGIN_TAG(tag) +#define LV_PROFILER_INDEV_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_FONT +#define LV_PROFILER_FONT_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_FONT_END LV_PROFILER_END +#define LV_PROFILER_FONT_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_FONT_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_FONT_BEGIN +#define LV_PROFILER_FONT_END +#define LV_PROFILER_FONT_BEGIN_TAG(tag) +#define LV_PROFILER_FONT_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_CACHE +#define LV_PROFILER_CACHE_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_CACHE_END LV_PROFILER_END +#define LV_PROFILER_CACHE_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_CACHE_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_CACHE_BEGIN +#define LV_PROFILER_CACHE_END +#define LV_PROFILER_CACHE_BEGIN_TAG(tag) +#define LV_PROFILER_CACHE_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_FS +#define LV_PROFILER_FS_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_FS_END LV_PROFILER_END +#define LV_PROFILER_FS_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_FS_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_FS_BEGIN +#define LV_PROFILER_FS_END +#define LV_PROFILER_FS_BEGIN_TAG(tag) +#define LV_PROFILER_FS_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_TIMER +#define LV_PROFILER_TIMER_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_TIMER_END LV_PROFILER_END +#define LV_PROFILER_TIMER_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_TIMER_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_TIMER_BEGIN +#define LV_PROFILER_TIMER_END +#define LV_PROFILER_TIMER_BEGIN_TAG(tag) +#define LV_PROFILER_TIMER_END_TAG(tag) +#endif + +#if LV_USE_PROFILER && LV_PROFILER_EVENT +#define LV_PROFILER_EVENT_BEGIN LV_PROFILER_BEGIN +#define LV_PROFILER_EVENT_END LV_PROFILER_END +#define LV_PROFILER_EVENT_BEGIN_TAG(tag) LV_PROFILER_BEGIN_TAG(tag) +#define LV_PROFILER_EVENT_END_TAG(tag) LV_PROFILER_END_TAG(tag) +#else +#define LV_PROFILER_EVENT_BEGIN +#define LV_PROFILER_EVENT_END +#define LV_PROFILER_EVENT_BEGIN_TAG(tag) +#define LV_PROFILER_EVENT_END_TAG(tag) +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PROFILER_H*/ diff --git a/inc/lvgl/src/misc/lv_profiler_builtin.c b/inc/lvgl/src/misc/lv_profiler_builtin.c new file mode 100644 index 0000000..243ec11 --- /dev/null +++ b/inc/lvgl/src/misc/lv_profiler_builtin.c @@ -0,0 +1,270 @@ +/** + * @file lv_profiler_builtin.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_profiler_builtin_private.h" +#include "../lvgl.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +#define profiler_ctx LV_GLOBAL_DEFAULT()->profiler_context + +#define LV_PROFILER_STR_MAX_LEN 128 +#define LV_PROFILER_TICK_PER_SEC_MAX 1000000000 /* Maximum accuracy: 1 nanosecond */ + +#if LV_USE_OS + #define LV_PROFILER_MULTEX_INIT lv_mutex_init(&profiler_ctx->mutex) + #define LV_PROFILER_MULTEX_DEINIT lv_mutex_delete(&profiler_ctx->mutex) + #define LV_PROFILER_MULTEX_LOCK lv_mutex_lock(&profiler_ctx->mutex) + #define LV_PROFILER_MULTEX_UNLOCK lv_mutex_unlock(&profiler_ctx->mutex) +#else + #define LV_PROFILER_MULTEX_INIT + #define LV_PROFILER_MULTEX_DEINIT + #define LV_PROFILER_MULTEX_LOCK + #define LV_PROFILER_MULTEX_UNLOCK +#endif + +/********************** + * TYPEDEFS + **********************/ + +/** + * @brief Structure representing a built-in profiler item in LVGL + */ +typedef struct { + uint64_t tick; /**< The tick value of the profiler item */ + char tag; /**< The tag of the profiler item */ + const char * func; /**< A pointer to the function associated with the profiler item */ +#if LV_USE_OS + int tid; /**< The thread ID of the profiler item */ + int cpu; /**< The CPU ID of the profiler item */ +#endif +} lv_profiler_builtin_item_t; + +/** + * @brief Structure representing a context for the LVGL built-in profiler + */ +typedef struct _lv_profiler_builtin_ctx_t { + lv_profiler_builtin_item_t * item_arr; /**< Pointer to an array of profiler items */ + uint32_t item_num; /**< Number of profiler items in the array */ + uint32_t cur_index; /**< Index of the current profiler item */ + lv_profiler_builtin_config_t config; /**< Configuration for the built-in profiler */ + bool enable; /**< Whether the built-in profiler is enabled */ +#if LV_USE_OS + lv_mutex_t mutex; /**< Mutex to protect the built-in profiler */ +#endif +} lv_profiler_builtin_ctx_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint64_t default_tick_get_cb(void); +static void default_flush_cb(const char * buf); +static int default_tid_get_cb(void); +static int default_cpu_get_cb(void); +static void flush_no_lock(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_profiler_builtin_config_init(lv_profiler_builtin_config_t * config) +{ + LV_ASSERT_NULL(config); + lv_memzero(config, sizeof(lv_profiler_builtin_config_t)); + config->buf_size = LV_PROFILER_BUILTIN_BUF_SIZE; + config->tick_per_sec = 1000; + config->tick_get_cb = default_tick_get_cb; + config->flush_cb = default_flush_cb; + config->tid_get_cb = default_tid_get_cb; + config->cpu_get_cb = default_cpu_get_cb; +} + +void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config) +{ + LV_ASSERT_NULL(config); + LV_ASSERT_NULL(config->tick_get_cb); + + uint32_t num = config->buf_size / sizeof(lv_profiler_builtin_item_t); + if(num == 0) { + LV_LOG_WARN("buf_size must > %d", (int)sizeof(lv_profiler_builtin_item_t)); + return; + } + + if(config->tick_per_sec == 0 || config->tick_per_sec > LV_PROFILER_TICK_PER_SEC_MAX) { + LV_LOG_WARN("tick_per_sec range must be between 1~%d", LV_PROFILER_TICK_PER_SEC_MAX); + return; + } + + /*Free the old item_arr memory*/ + if(profiler_ctx) { + lv_profiler_builtin_uninit(); + } + + profiler_ctx = lv_malloc_zeroed(sizeof(lv_profiler_builtin_ctx_t)); + LV_ASSERT_MALLOC(profiler_ctx); + + profiler_ctx->item_arr = lv_malloc(num * sizeof(lv_profiler_builtin_item_t)); + LV_ASSERT_MALLOC(profiler_ctx->item_arr); + if(profiler_ctx->item_arr == NULL) { + lv_free(profiler_ctx); + profiler_ctx = NULL; + LV_LOG_ERROR("malloc failed for item_arr"); + return; + } + + LV_PROFILER_MULTEX_INIT; + profiler_ctx->item_num = num; + profiler_ctx->config = *config; + + if(profiler_ctx->config.flush_cb) { + /* add profiler header for perfetto */ + profiler_ctx->config.flush_cb("# tracer: nop\n"); + profiler_ctx->config.flush_cb("#\n"); + } + + lv_profiler_builtin_set_enable(LV_PROFILER_BUILTIN_DEFAULT_ENABLE); + + LV_LOG_INFO("init OK, item_num = %d", (int)num); +} + +void lv_profiler_builtin_uninit(void) +{ + if(!profiler_ctx) { + return; + } + + LV_PROFILER_MULTEX_DEINIT; + lv_free(profiler_ctx->item_arr); + lv_free(profiler_ctx); + profiler_ctx = NULL; +} + +void lv_profiler_builtin_set_enable(bool enable) +{ + if(!profiler_ctx) { + return; + } + + profiler_ctx->enable = enable; +} + +void lv_profiler_builtin_flush(void) +{ + LV_ASSERT_NULL(profiler_ctx); + + LV_PROFILER_MULTEX_LOCK; + flush_no_lock(); + LV_PROFILER_MULTEX_UNLOCK; +} + +void lv_profiler_builtin_write(const char * func, char tag) +{ + LV_ASSERT_NULL(func); + + if(!(profiler_ctx && profiler_ctx->enable)) { + return; + } + + LV_PROFILER_MULTEX_LOCK; + + if(profiler_ctx->cur_index >= profiler_ctx->item_num) { + flush_no_lock(); + profiler_ctx->cur_index = 0; + } + + lv_profiler_builtin_item_t * item = &profiler_ctx->item_arr[profiler_ctx->cur_index]; + item->func = func; + item->tag = tag; + item->tick = profiler_ctx->config.tick_get_cb(); + +#if LV_USE_OS + item->tid = profiler_ctx->config.tid_get_cb(); + item->cpu = profiler_ctx->config.cpu_get_cb(); +#endif + + profiler_ctx->cur_index++; + + LV_PROFILER_MULTEX_UNLOCK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint64_t default_tick_get_cb(void) +{ + return lv_tick_get(); +} + +static void default_flush_cb(const char * buf) +{ + LV_LOG("%s", buf); +} + +static int default_tid_get_cb(void) +{ + return 1; +} + +static int default_cpu_get_cb(void) +{ + return 0; +} + +static void flush_no_lock(void) +{ + if(!profiler_ctx->config.flush_cb) { + LV_LOG_WARN("flush_cb is not registered"); + return; + } + + uint32_t cur = 0; + char buf[LV_PROFILER_STR_MAX_LEN]; + uint32_t tick_per_sec = profiler_ctx->config.tick_per_sec; + while(cur < profiler_ctx->cur_index) { + lv_profiler_builtin_item_t * item = &profiler_ctx->item_arr[cur++]; + uint64_t sec = item->tick / tick_per_sec; + uint64_t nsec = (item->tick % tick_per_sec) * (LV_PROFILER_TICK_PER_SEC_MAX / tick_per_sec); + +#if LV_USE_OS + lv_snprintf(buf, sizeof(buf), + " LVGL-%d [%d] %" LV_PRIu64 ".%09" LV_PRIu64 ": tracing_mark_write: %c|1|%s\n", + item->tid, + item->cpu, + sec, + nsec, + item->tag, + item->func); +#else + lv_snprintf(buf, sizeof(buf), + " LVGL-1 [0] %" LV_PRIu64 ".%09" LV_PRIu64 ": tracing_mark_write: %c|1|%s\n", + sec, + nsec, + item->tag, + item->func); +#endif + profiler_ctx->config.flush_cb(buf); + } +} + +#endif /*LV_USE_PROFILER_BUILTIN*/ diff --git a/inc/lvgl/src/misc/lv_profiler_builtin.h b/inc/lvgl/src/misc/lv_profiler_builtin.h new file mode 100644 index 0000000..aa0220b --- /dev/null +++ b/inc/lvgl/src/misc/lv_profiler_builtin.h @@ -0,0 +1,85 @@ +/** + * @file lv_profiler_builtin.h + * + */ + +#ifndef LV_PROFILER_BUILTIN_H +#define LV_PROFILER_BUILTIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +#define LV_PROFILER_BUILTIN_BEGIN_TAG(tag) lv_profiler_builtin_write((tag), 'B') +#define LV_PROFILER_BUILTIN_END_TAG(tag) lv_profiler_builtin_write((tag), 'E') +#define LV_PROFILER_BUILTIN_BEGIN LV_PROFILER_BUILTIN_BEGIN_TAG(__func__) +#define LV_PROFILER_BUILTIN_END LV_PROFILER_BUILTIN_END_TAG(__func__) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Initialize the configuration of the built-in profiler + * @param config Pointer to the configuration structure of the built-in profiler + */ +void lv_profiler_builtin_config_init(lv_profiler_builtin_config_t * config); + +/** + * @brief Initialize the built-in profiler with the given configuration + * @param config Pointer to the configuration structure of the built-in profiler + */ +void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config); + +/** + * @brief Uninitialize the built-in profiler + */ +void lv_profiler_builtin_uninit(void); + +/** + * @brief Enable or disable the built-in profiler + * @param enable true to enable the built-in profiler, false to disable + */ +void lv_profiler_builtin_set_enable(bool enable); + +/** + * @brief Flush the profiling data to the console + */ +void lv_profiler_builtin_flush(void); + +/** + * @brief Write the profiling data for a function with the given tag + * @param func Name of the function being profiled + * @param tag Tag to associate with the profiling data for the function + */ +void lv_profiler_builtin_write(const char * func, char tag); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_PROFILER_BUILTIN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PROFILER_BUILTIN_H*/ diff --git a/inc/lvgl/src/misc/lv_profiler_builtin_posix.c b/inc/lvgl/src/misc/lv_profiler_builtin_posix.c new file mode 100644 index 0000000..1bfff46 --- /dev/null +++ b/inc/lvgl/src/misc/lv_profiler_builtin_posix.c @@ -0,0 +1,134 @@ +/** + * @file lv_profiler_builtin_posix.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_profiler_builtin_private.h" + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN && LV_USE_PROFILER_BUILTIN_POSIX + +#if defined(_WIN32) + #include +#else + #include +#endif + +#include +#include + +#if defined(__linux__) + #include + #include + #include +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static uint64_t tick_get_cb(void); +static void flush_cb(const char * buf); +static int tid_get_cb(void); +static int cpu_get_cb(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_profiler_builtin_posix_init(void) +{ + lv_profiler_builtin_config_t config; + lv_profiler_builtin_config_init(&config); + + /* One second is equal to 1000000000 nanoseconds */ + config.tick_per_sec = 1000000000; + config.tick_get_cb = tick_get_cb; + config.flush_cb = flush_cb; + config.tid_get_cb = tid_get_cb; + config.cpu_get_cb = cpu_get_cb; + lv_profiler_builtin_init(&config); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint64_t tick_get_cb(void) +{ +#if defined(_WIN32) + static LARGE_INTEGER frequency = {0}; + LARGE_INTEGER counter; + + if(frequency.QuadPart == 0) { + if(!QueryPerformanceFrequency(&frequency)) { + fprintf(stderr, "QueryPerformanceFrequency failed\n"); + return 0; + } + } + + if(!QueryPerformanceCounter(&counter)) { + fprintf(stderr, "QueryPerformanceCounter failed\n"); + return 0; + } + + /* Convert counter to nanoseconds */ + return counter.QuadPart * 1000000000ULL / frequency.QuadPart; +#else + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000000000ULL + (uint64_t)ts.tv_nsec; +#endif +} + +static void flush_cb(const char * buf) +{ + printf("%s", buf); +} + +static int tid_get_cb(void) +{ +#if defined(__linux__) + return (int)syscall(SYS_gettid); +#elif defined(_WIN32) + return (int)GetCurrentThreadId(); +#else + return (int)(lv_intptr_t)pthread_self(); +#endif +} + +static int cpu_get_cb(void) +{ +#if defined(__linux__) + unsigned cpu; + int result = syscall(SYS_getcpu, &cpu, NULL, NULL); + if(result < 0) { + fprintf(stderr, "getcpu failed\n"); + return -1; + } + return (int)cpu; +#else + return 0; +#endif +} + +#endif diff --git a/inc/lvgl/src/misc/lv_profiler_builtin_private.h b/inc/lvgl/src/misc/lv_profiler_builtin_private.h new file mode 100644 index 0000000..92c424c --- /dev/null +++ b/inc/lvgl/src/misc/lv_profiler_builtin_private.h @@ -0,0 +1,65 @@ +/** + * @file lv_profiler_builtin_private.h + * + */ + +#ifndef LV_PROFILER_BUILTIN_PRIVATE_H +#define LV_PROFILER_BUILTIN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_profiler_builtin.h" + +#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * @brief LVGL profiler built-in configuration structure + */ +struct _lv_profiler_builtin_config_t { + size_t buf_size; /**< The size of the buffer used for profiling data */ + uint32_t tick_per_sec; /**< The number of ticks per second */ + uint64_t (*tick_get_cb)(void); /**< Callback function to get the current tick count */ + void (*flush_cb)(const char * buf); /**< Callback function to flush the profiling data */ + int (*tid_get_cb)(void); /**< Callback function to get the current thread ID */ + int (*cpu_get_cb)(void); /**< Callback function to get the current CPU */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_USE_PROFILER_BUILTIN_POSIX + +/** + * Initialize the built-in profiler with POSIX functions. + */ +void lv_profiler_builtin_posix_init(void); + +#endif /* LV_USE_PROFILER_BUILTIN_POSIX */ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PROFILER_BUILTIN_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_rb.c b/inc/lvgl/src/misc/lv_rb.c new file mode 100755 index 0000000..8a7328c --- /dev/null +++ b/inc/lvgl/src/misc/lv_rb.c @@ -0,0 +1,556 @@ +/** + * @file lv_rb.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_rb_private.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_rb_node_t * rb_create_node(lv_rb_t * tree); +static lv_rb_node_t * rb_find_leaf_parent(lv_rb_t * tree, lv_rb_node_t * node); +static void rb_right_rotate(lv_rb_t * tree, lv_rb_node_t * node); +static void rb_left_rotate(lv_rb_t * tree, lv_rb_node_t * node); +static void rb_insert_color(lv_rb_t * tree, lv_rb_node_t * node); +static void rb_delete_color(lv_rb_t * tree, lv_rb_node_t * node1, lv_rb_node_t * node2); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_rb_init(lv_rb_t * tree, lv_rb_compare_t compare, size_t node_size) +{ + LV_ASSERT_NULL(tree); + LV_ASSERT_NULL(compare); + LV_ASSERT(node_size > 0); + + if(tree == NULL || compare == NULL || node_size == 0) { + return false; + } + + lv_memzero(tree, sizeof(lv_rb_t)); + + tree->root = NULL; + tree->compare = compare; + tree->size = node_size; + + return true; +} + +lv_rb_node_t * lv_rb_insert(lv_rb_t * tree, void * key) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + + lv_rb_node_t * node = lv_rb_find(tree, key); + if(node) return node; + else { + node = rb_create_node(tree); + if(node == NULL) return NULL; + + if(tree->root == NULL) { + tree->root = node; + node->parent = NULL; + node->color = LV_RB_COLOR_BLACK; + return node; + } + } + + void * new_data = node->data; + node->data = key; + lv_rb_node_t * parent = rb_find_leaf_parent(tree, node); + + node->parent = parent; + node->color = LV_RB_COLOR_RED; + + if(tree->compare(key, parent->data) < 0) parent->left = node; + else parent->right = node; + + rb_insert_color(tree, node); + + node->data = new_data; + return node; +} + +lv_rb_node_t * lv_rb_find(lv_rb_t * tree, const void * key) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + + lv_rb_node_t * current = tree->root; + + while(current != NULL) { + lv_rb_compare_res_t cmp = tree->compare(key, current->data); + + if(cmp == 0) { + return current; + } + else if(cmp < 0) { + current = current->left; + } + else { + current = current->right; + } + } + + return NULL; +} + +void * lv_rb_remove_node(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * child = NULL; + lv_rb_node_t * parent = NULL; + lv_rb_color_t color = LV_RB_COLOR_BLACK; + + if(node->left != NULL && node->right != NULL) { + lv_rb_node_t * replace = node; + replace = lv_rb_minimum_from(replace->right); + + if(node->parent != NULL) { + if(node->parent->left == node) { + node->parent->left = replace; + } + else { + node->parent->right = replace; + } + } + else { + tree->root = replace; + } + + child = replace->right; + parent = replace->parent; + color = replace->color; + + if(parent == node) { + parent = replace; + } + else { + if(child != NULL) { + child->parent = parent; + } + parent->left = child; + replace->right = node->right; + node->right->parent = replace; + } + + replace->parent = node->parent; + replace->color = node->color; + replace->left = node->left; + node->left->parent = replace; + + if(color == LV_RB_COLOR_BLACK) { + rb_delete_color(tree, child, parent); + } + + void * data = node->data; + lv_free(node); + return data; + } + + child = node->right != NULL ? node->right : node->left; + parent = node->parent; + color = node->color; + + if(child != NULL) { + child->parent = parent; + } + + if(parent != NULL) { + if(parent->left == node) { + parent->left = child; + } + else { + parent->right = child; + } + } + else { + tree->root = child; + } + + if(color == LV_RB_COLOR_BLACK) { + rb_delete_color(tree, child, parent); + } + + void * data = node->data; + lv_free(node); + return data; +} + +void * lv_rb_remove(lv_rb_t * tree, const void * key) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + + lv_rb_node_t * node = lv_rb_find(tree, key); + LV_ASSERT_NULL(node); + if(node == NULL) { + LV_LOG_WARN("rb delete %d not found", (int)(uintptr_t)key); + return NULL; + } + + return lv_rb_remove_node(tree, node); +} + +bool lv_rb_drop_node(lv_rb_t * tree, lv_rb_node_t * node) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return false; + } + + void * data = lv_rb_remove_node(tree, node); + if(data) { + lv_free(data); + return true; + } + return false; +} + +bool lv_rb_drop(lv_rb_t * tree, const void * key) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return false; + } + + void * data = lv_rb_remove(tree, key); + if(data) { + lv_free(data); + return true; + } + return false; +} + +void lv_rb_destroy(lv_rb_t * tree) +{ + LV_ASSERT_NULL(tree); + + if(tree == NULL) { + return; + } + + lv_rb_node_t * node = tree->root; + lv_rb_node_t * parent = NULL; + + while(node != NULL) { + if(node->left != NULL) { + node = node->left; + } + else if(node->right != NULL) { + node = node->right; + } + else { + parent = node->parent; + if(parent != NULL) { + if(parent->left == node) { + parent->left = NULL; + } + else { + parent->right = NULL; + } + } + lv_free(node->data); + lv_free(node); + node = parent; + } + } + tree->root = NULL; +} + +lv_rb_node_t * lv_rb_minimum(lv_rb_t * tree) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + return lv_rb_minimum_from(tree->root); +} + +lv_rb_node_t * lv_rb_maximum(lv_rb_t * tree) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return NULL; + } + return lv_rb_maximum_from(tree->root); +} + +lv_rb_node_t * lv_rb_minimum_from(lv_rb_node_t * node) +{ + while(node->left != NULL) { + node = node->left; + } + + return node; +} + +lv_rb_node_t * lv_rb_maximum_from(lv_rb_node_t * node) +{ + while(node->right != NULL) { + node = node->right; + } + + return node; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_rb_node_t * rb_create_node(lv_rb_t * tree) +{ + lv_rb_node_t * node = lv_malloc_zeroed(sizeof(lv_rb_node_t)); + LV_ASSERT_MALLOC(node); + if(node == NULL) { + return NULL; + } + + node->data = lv_malloc_zeroed(tree->size); + LV_ASSERT_MALLOC(node->data); + if(node->data == NULL) { + lv_free(node); + return NULL; + } + + node->color = LV_RB_COLOR_RED; + node->left = NULL; + node->right = NULL; + + return node; +} + +static lv_rb_node_t * rb_find_leaf_parent(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * current = tree->root; + lv_rb_node_t * parent = current; + + while(current != NULL) { + parent = current; + + if(tree->compare(node->data, current->data) < 0) { + current = current->left; + } + else { + current = current->right; + } + } + + return parent; +} + +static void rb_right_rotate(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * left = node->left; + node->left = left->right; + + if(left->right != NULL) { + left->right->parent = node; + } + + left->parent = node->parent; + + if(node->parent == NULL) { + tree->root = left; + } + else if(node == node->parent->right) { + node->parent->right = left; + } + else { + node->parent->left = left; + } + + left->right = node; + node->parent = left; +} + +static void rb_left_rotate(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * right = node->right; + node->right = right->left; + + if(right->left != NULL) { + right->left->parent = node; + } + + right->parent = node->parent; + + if(node->parent == NULL) { + tree->root = right; + } + else if(node == node->parent->left) { + node->parent->left = right; + } + else { + node->parent->right = right; + } + + right->left = node; + node->parent = right; +} + +static void rb_insert_color(lv_rb_t * tree, lv_rb_node_t * node) +{ + lv_rb_node_t * parent = NULL; + lv_rb_node_t * gparent = NULL; + + while((parent = node->parent) && parent->color == LV_RB_COLOR_RED) { + gparent = parent->parent; + + if(parent == gparent->left) { + { + lv_rb_node_t * uncle = gparent->right; + if(uncle && uncle->color == LV_RB_COLOR_RED) { + uncle->color = LV_RB_COLOR_BLACK; + parent->color = LV_RB_COLOR_BLACK; + gparent->color = LV_RB_COLOR_RED; + node = gparent; + continue; + } + } + + if(parent->right == node) { + lv_rb_node_t * tmp; + rb_left_rotate(tree, parent); + tmp = parent; + parent = node; + node = tmp; + } + + parent->color = LV_RB_COLOR_BLACK; + gparent->color = LV_RB_COLOR_RED; + rb_right_rotate(tree, gparent); + } + else { + { + lv_rb_node_t * uncle = gparent->left; + if(uncle && uncle->color == LV_RB_COLOR_RED) { + uncle->color = LV_RB_COLOR_BLACK; + parent->color = LV_RB_COLOR_BLACK; + gparent->color = LV_RB_COLOR_RED; + node = gparent; + continue; + } + } + + if(parent->left == node) { + lv_rb_node_t * tmp; + rb_right_rotate(tree, parent); + tmp = parent; + parent = node; + node = tmp; + } + + parent->color = LV_RB_COLOR_BLACK; + gparent->color = LV_RB_COLOR_RED; + rb_left_rotate(tree, gparent); + } + } + + tree->root->color = LV_RB_COLOR_BLACK; +} + +static void rb_delete_color(lv_rb_t * tree, lv_rb_node_t * node1, lv_rb_node_t * node2) +{ + LV_ASSERT_NULL(tree); + if(tree == NULL) { + return; + } + + while((node1 == NULL || node1->color == LV_RB_COLOR_BLACK) && node1 != tree->root) { + if(node2->left == node1) { + lv_rb_node_t * pNode2 = node2->right; + if(pNode2->color == LV_RB_COLOR_RED) { + pNode2->color = LV_RB_COLOR_BLACK; + node2->color = LV_RB_COLOR_RED; + rb_left_rotate(tree, node2); + pNode2 = node2->right; + } + + if((pNode2->left == NULL || pNode2->left->color == LV_RB_COLOR_BLACK) + && (pNode2->right == NULL || pNode2->right->color == LV_RB_COLOR_BLACK)) { + pNode2->color = LV_RB_COLOR_RED; + node1 = node2; + node2 = node2->parent; + } + else { + if(pNode2->right == NULL || pNode2->right->color == LV_RB_COLOR_BLACK) { + pNode2->left->color = LV_RB_COLOR_BLACK; + pNode2->color = LV_RB_COLOR_RED; + rb_right_rotate(tree, pNode2); + pNode2 = node2->right; + } + pNode2->color = node2->color; + node2->color = LV_RB_COLOR_BLACK; + pNode2->right->color = LV_RB_COLOR_BLACK; + rb_left_rotate(tree, node2); + node1 = tree->root; + break; + } + } + else { + lv_rb_node_t * pNode2 = node2->left; + if(pNode2->color == LV_RB_COLOR_RED) { + pNode2->color = LV_RB_COLOR_BLACK; + node2->color = LV_RB_COLOR_RED; + rb_right_rotate(tree, node2); + pNode2 = node2->left; + } + + if((pNode2->left == NULL || pNode2->left->color == LV_RB_COLOR_BLACK) + && (pNode2->right == NULL || pNode2->right->color == LV_RB_COLOR_BLACK)) { + pNode2->color = LV_RB_COLOR_RED; + node1 = node2; + node2 = node2->parent; + } + else { + if(pNode2->left == NULL || pNode2->left->color == LV_RB_COLOR_BLACK) { + pNode2->right->color = LV_RB_COLOR_BLACK; + pNode2->color = LV_RB_COLOR_RED; + rb_left_rotate(tree, pNode2); + pNode2 = node2->left; + } + pNode2->color = node2->color; + node2->color = LV_RB_COLOR_BLACK; + pNode2->left->color = LV_RB_COLOR_BLACK; + rb_right_rotate(tree, node2); + node1 = tree->root; + break; + } + } + } + if(node1 != NULL) + node1->color = LV_RB_COLOR_BLACK; +} diff --git a/inc/lvgl/src/misc/lv_rb.h b/inc/lvgl/src/misc/lv_rb.h new file mode 100755 index 0000000..ef2766b --- /dev/null +++ b/inc/lvgl/src/misc/lv_rb.h @@ -0,0 +1,66 @@ +/** + * @file lv_rb.h + * + */ + +#ifndef LV_RB_H +#define LV_RB_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_types.h" +#include "lv_assert.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_RB_COLOR_RED, + LV_RB_COLOR_BLACK +} lv_rb_color_t; + +typedef int32_t lv_rb_compare_res_t; + +typedef lv_rb_compare_res_t (*lv_rb_compare_t)(const void * a, const void * b); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +bool lv_rb_init(lv_rb_t * tree, lv_rb_compare_t compare, size_t node_size); +lv_rb_node_t * lv_rb_insert(lv_rb_t * tree, void * key); +lv_rb_node_t * lv_rb_find(lv_rb_t * tree, const void * key); +void * lv_rb_remove_node(lv_rb_t * tree, lv_rb_node_t * node); +void * lv_rb_remove(lv_rb_t * tree, const void * key); +bool lv_rb_drop_node(lv_rb_t * tree, lv_rb_node_t * node); +bool lv_rb_drop(lv_rb_t * tree, const void * key); +lv_rb_node_t * lv_rb_minimum(lv_rb_t * node); +lv_rb_node_t * lv_rb_maximum(lv_rb_t * node); +lv_rb_node_t * lv_rb_minimum_from(lv_rb_node_t * node); +lv_rb_node_t * lv_rb_maximum_from(lv_rb_node_t * node); +void lv_rb_destroy(lv_rb_t * tree); + +/************************* + * GLOBAL VARIABLES + *************************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_RB_H*/ diff --git a/inc/lvgl/src/misc/lv_rb_private.h b/inc/lvgl/src/misc/lv_rb_private.h new file mode 100644 index 0000000..492ca2e --- /dev/null +++ b/inc/lvgl/src/misc/lv_rb_private.h @@ -0,0 +1,54 @@ +/** + * @file lv_rb_private.h + * + */ + +#ifndef LV_RB_PRIVATE_H +#define LV_RB_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_rb.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_rb_node_t { + struct _lv_rb_node_t * parent; + struct _lv_rb_node_t * left; + struct _lv_rb_node_t * right; + lv_rb_color_t color; + void * data; +}; + +struct _lv_rb_t { + lv_rb_node_t * root; + lv_rb_compare_t compare; + size_t size; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_RB_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_style.c b/inc/lvgl/src/misc/lv_style.c new file mode 100644 index 0000000..834761d --- /dev/null +++ b/inc/lvgl/src/misc/lv_style.c @@ -0,0 +1,521 @@ +/** + * @file lv_style.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_style_private.h" +#include "../core/lv_global.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" +#include "lv_assert.h" +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ +#define lv_style_custom_prop_flag_lookup_table_size LV_GLOBAL_DEFAULT()->style_custom_table_size +#define lv_style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table +#define last_custom_prop_id LV_GLOBAL_DEFAULT()->style_last_custom_prop_id + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ + +const lv_style_prop_t lv_style_const_prop_id_inv = LV_STYLE_PROP_INV; + +const uint8_t lv_style_builtin_prop_flag_lookup_table[LV_STYLE_NUM_BUILT_IN_PROPS] = { + [LV_STYLE_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MIN_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MAX_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_HEIGHT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MIN_HEIGHT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MAX_HEIGHT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_LENGTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_X] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_Y] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_TRANSFORM_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_HEIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSLATE_X] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE, + [LV_STYLE_TRANSLATE_Y] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE | LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE, + [LV_STYLE_TRANSFORM_SCALE_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_SCALE_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_SKEW_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_SKEW_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + [LV_STYLE_TRANSFORM_ROTATION] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYER_UPDATE | LV_STYLE_PROP_FLAG_TRANSFORM, + + [LV_STYLE_PAD_TOP] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_BOTTOM] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_LEFT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_RIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_ROW] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_PAD_COLUMN] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MARGIN_TOP] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MARGIN_BOTTOM] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MARGIN_LEFT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_MARGIN_RIGHT] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + + [LV_STYLE_BG_COLOR] = 0, + [LV_STYLE_BG_OPA] = 0, + [LV_STYLE_BG_GRAD_COLOR] = 0, + [LV_STYLE_BG_GRAD_DIR] = 0, + [LV_STYLE_BG_MAIN_STOP] = 0, + [LV_STYLE_BG_GRAD_STOP] = 0, + [LV_STYLE_BG_MAIN_OPA] = 0, + [LV_STYLE_BG_GRAD_OPA] = 0, + [LV_STYLE_BG_GRAD] = 0, + + [LV_STYLE_BG_IMAGE_SRC] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_BG_IMAGE_OPA] = 0, + [LV_STYLE_BG_IMAGE_RECOLOR] = 0, + [LV_STYLE_BG_IMAGE_RECOLOR_OPA] = 0, + [LV_STYLE_BG_IMAGE_TILED] = 0, + + [LV_STYLE_BORDER_COLOR] = 0, + [LV_STYLE_BORDER_OPA] = 0, + [LV_STYLE_BORDER_WIDTH] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_BORDER_SIDE] = 0, + [LV_STYLE_BORDER_POST] = 0, + + [LV_STYLE_OUTLINE_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_OUTLINE_COLOR] = 0, + [LV_STYLE_OUTLINE_OPA] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_OUTLINE_PAD] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + + [LV_STYLE_SHADOW_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_SHADOW_OFFSET_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_SHADOW_OFFSET_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_SHADOW_SPREAD] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_SHADOW_COLOR] = 0, + [LV_STYLE_SHADOW_OPA] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + + [LV_STYLE_IMAGE_OPA] = 0, + [LV_STYLE_IMAGE_RECOLOR] = 0, + [LV_STYLE_IMAGE_RECOLOR_OPA] = 0, + + [LV_STYLE_LINE_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_LINE_DASH_WIDTH] = 0, + [LV_STYLE_LINE_DASH_GAP] = 0, + [LV_STYLE_LINE_ROUNDED] = 0, + [LV_STYLE_LINE_COLOR] = 0, + [LV_STYLE_LINE_OPA] = 0, + + [LV_STYLE_ARC_WIDTH] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_ARC_ROUNDED] = 0, + [LV_STYLE_ARC_COLOR] = 0, + [LV_STYLE_ARC_OPA] = 0, + [LV_STYLE_ARC_IMAGE_SRC] = 0, + + [LV_STYLE_TEXT_COLOR] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_TEXT_OPA] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_TEXT_FONT] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_TEXT_LETTER_SPACE] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_TEXT_LINE_SPACE] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_TEXT_DECOR] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_TEXT_ALIGN] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + + [LV_STYLE_RADIUS] = 0, + [LV_STYLE_CLIP_CORNER] = 0, + [LV_STYLE_OPA] = 0, + [LV_STYLE_OPA_LAYERED] = LV_STYLE_PROP_FLAG_LAYER_UPDATE, + [LV_STYLE_COLOR_FILTER_DSC] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_COLOR_FILTER_OPA] = LV_STYLE_PROP_FLAG_INHERITABLE, + [LV_STYLE_ANIM_DURATION] = 0, + [LV_STYLE_TRANSITION] = 0, + [LV_STYLE_BLEND_MODE] = LV_STYLE_PROP_FLAG_LAYER_UPDATE, + [LV_STYLE_LAYOUT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_BASE_DIR] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_BITMAP_MASK_SRC] = LV_STYLE_PROP_FLAG_LAYER_UPDATE, + [LV_STYLE_RECOLOR] = 0, + [LV_STYLE_RECOLOR_OPA] = 0, + + [LV_STYLE_DROP_SHADOW_RADIUS] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_DROP_SHADOW_OFFSET_X] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_DROP_SHADOW_OFFSET_Y] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + [LV_STYLE_DROP_SHADOW_OPA] = LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE, + +#if LV_USE_FLEX + [LV_STYLE_FLEX_FLOW] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_FLEX_MAIN_PLACE] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_FLEX_CROSS_PLACE] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_FLEX_TRACK_PLACE] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_FLEX_GROW] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, +#endif + +#if LV_USE_GRID + [LV_STYLE_GRID_COLUMN_DSC_ARRAY] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_ROW_DSC_ARRAY] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_COLUMN_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_ROW_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_ROW_SPAN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_ROW_POS] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_COLUMN_SPAN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_COLUMN_POS] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_X_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, + [LV_STYLE_GRID_CELL_Y_ALIGN] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE, +#endif + [LV_STYLE_IMAGE_COLORKEY] = 0, + +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_style_init(lv_style_t * style) +{ +#if LV_USE_ASSERT_STYLE + if(style->sentinel == LV_STYLE_SENTINEL_VALUE && style->prop_cnt > 1) { + LV_LOG_WARN("Style might be already inited. (Potential memory leak)"); + } +#endif + + lv_memzero(style, sizeof(lv_style_t)); +#if LV_USE_ASSERT_STYLE + style->sentinel = LV_STYLE_SENTINEL_VALUE; +#endif +} + +void lv_style_reset(lv_style_t * style) +{ + LV_ASSERT_STYLE(style); + + if(style->prop_cnt != 255) lv_free(style->values_and_props); + lv_memzero(style, sizeof(lv_style_t)); +#if LV_USE_ASSERT_STYLE + style->sentinel = LV_STYLE_SENTINEL_VALUE; +#endif +} + + +void lv_style_copy(lv_style_t * dst, const lv_style_t * src) +{ + if(lv_style_is_const(dst)) { + LV_LOG_WARN("The destination can not be a constant style"); + return; + } + + lv_style_reset(dst); + + lv_style_merge(dst, src); +} + +void lv_style_merge(lv_style_t * dst, const lv_style_t * src) +{ + if(lv_style_is_const(dst)) { + LV_LOG_WARN("The destination can not be a constant style"); + return; + } + + /*Source is empty*/ + if(src->values_and_props == NULL) { + LV_LOG_TRACE("Source style is empty"); + return; + } + if(src->prop_cnt == 0) { + LV_LOG_TRACE("Source style has no properties"); + return; + } + + /* Merge the styles */ + int32_t i; + if(lv_style_is_const(src)) { + lv_style_const_prop_t * props_and_values = (lv_style_const_prop_t *)src->values_and_props; + for(i = 0; props_and_values[i].prop != LV_STYLE_PROP_INV; i++) { + lv_style_set_prop(dst, props_and_values[i].prop, props_and_values[i].value); + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)src->values_and_props + src->prop_cnt * sizeof(lv_style_value_t); + lv_style_value_t * values = (lv_style_value_t *)src->values_and_props; + for(i = 0; i < src->prop_cnt; i++) { + lv_style_set_prop(dst, props[i], values[i]); + } + } +} + +lv_style_prop_t lv_style_register_prop(uint8_t flag) +{ + if(lv_style_custom_prop_flag_lookup_table == NULL) { + lv_style_custom_prop_flag_lookup_table_size = 0; + last_custom_prop_id = (uint16_t)LV_STYLE_LAST_BUILT_IN_PROP; + } + + /* + * Allocate the lookup table if it's not yet available. + */ + size_t required_size = (last_custom_prop_id + 1 - LV_STYLE_LAST_BUILT_IN_PROP); + if(lv_style_custom_prop_flag_lookup_table_size < required_size) { + /* Round required_size up to the nearest 32-byte value */ + required_size = (required_size + 31) & ~31; + LV_ASSERT_MSG(required_size > 0, "required size has become 0?"); + uint8_t * old_p = lv_style_custom_prop_flag_lookup_table; + uint8_t * new_p = lv_realloc(old_p, required_size * sizeof(uint8_t)); + if(new_p == NULL) { + LV_LOG_ERROR("Unable to allocate space for custom property lookup table"); + return LV_STYLE_PROP_INV; + } + lv_style_custom_prop_flag_lookup_table = new_p; + lv_style_custom_prop_flag_lookup_table_size = required_size; + } + last_custom_prop_id++; + /* This should never happen - we should bail out above */ + LV_ASSERT_NULL(lv_style_custom_prop_flag_lookup_table); + lv_style_custom_prop_flag_lookup_table[last_custom_prop_id - LV_STYLE_NUM_BUILT_IN_PROPS] = flag; + return last_custom_prop_id; +} + +lv_style_prop_t lv_style_get_num_custom_props(void) +{ + return last_custom_prop_id - LV_STYLE_LAST_BUILT_IN_PROP; +} + +bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop) +{ + LV_ASSERT_STYLE(style); + + if(lv_style_is_const(style)) { + LV_LOG_ERROR("Cannot remove prop from const style"); + return false; + } + + if(style->prop_cnt == 0) return false; + + LV_PROFILER_STYLE_BEGIN; + + uint8_t * tmp = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint8_t * old_props = (uint8_t *)tmp; + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + if(old_props[i] == prop) { + lv_style_value_t * old_values = (lv_style_value_t *)style->values_and_props; + + size_t size = (style->prop_cnt - 1) * (sizeof(lv_style_value_t) + sizeof(lv_style_prop_t)); + uint8_t * new_values_and_props = lv_malloc(size); + if(new_values_and_props == NULL) { + LV_PROFILER_STYLE_END; + return false; + } + + style->values_and_props = new_values_and_props; + style->prop_cnt--; + + tmp = new_values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint8_t * new_props = (uint8_t *)tmp; + lv_style_value_t * new_values = (lv_style_value_t *)new_values_and_props; + + uint32_t j; + for(i = j = 0; j <= style->prop_cnt; + j++) { /*<=: because prop_cnt already reduced but all the old props. needs to be checked.*/ + if(old_props[j] != prop) { + new_values[i] = old_values[j]; + new_props[i++] = old_props[j]; + } + } + + lv_free(old_values); + LV_PROFILER_STYLE_END; + return true; + } + } + + LV_PROFILER_STYLE_END; + return false; +} + +void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value) +{ + LV_ASSERT_STYLE(style); + + if(lv_style_is_const(style)) { + LV_LOG_ERROR("Cannot set property of constant style"); + return; + } + + LV_ASSERT(prop != LV_STYLE_PROP_INV); + LV_PROFILER_STYLE_BEGIN; + lv_style_prop_t * props; + int32_t i; + + if(style->values_and_props) { + props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + for(i = style->prop_cnt - 1; i >= 0; i--) { + if(props[i] == prop) { + lv_style_value_t * values = (lv_style_value_t *)style->values_and_props; + values[i] = value; + LV_PROFILER_STYLE_END; + return; + } + } + } + + size_t size = (style->prop_cnt + 1) * (sizeof(lv_style_value_t) + sizeof(lv_style_prop_t)); + uint8_t * values_and_props = lv_realloc(style->values_and_props, size); + if(values_and_props == NULL) { + LV_PROFILER_STYLE_END; + return; + } + + style->values_and_props = values_and_props; + + props = values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + /*Shift all props to make place for the value before them*/ + for(i = style->prop_cnt - 1; i >= 0; i--) { + props[i + sizeof(lv_style_value_t) / sizeof(lv_style_prop_t)] = props[i]; + } + style->prop_cnt++; + + /*Go to the new position with the props*/ + props = values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + lv_style_value_t * values = (lv_style_value_t *)values_and_props; + + /*Set the new property and value*/ + props[style->prop_cnt - 1] = prop; + values[style->prop_cnt - 1] = value; + + uint32_t group = lv_style_get_prop_group(prop); + style->has_group |= (uint32_t)1 << group; + LV_PROFILER_STYLE_END; +} + +lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value) +{ + return lv_style_get_prop_inlined(style, prop, value); +} + +void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[], + lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data) +{ + lv_memzero(tr, sizeof(lv_style_transition_dsc_t)); + tr->props = props; + tr->path_xcb = path_cb == NULL ? lv_anim_path_linear : path_cb; + tr->time = time; + tr->delay = delay; + tr->user_data = user_data; +} + +lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop) +{ + const lv_color_t black = LV_COLOR_MAKE(0x00, 0x00, 0x00); + const lv_color_t white = LV_COLOR_MAKE(0xff, 0xff, 0xff); + switch(prop) { + case LV_STYLE_TRANSFORM_SCALE_X: + case LV_STYLE_TRANSFORM_SCALE_Y: + return (lv_style_value_t) { + .num = LV_SCALE_NONE + }; + case LV_STYLE_BG_COLOR: + return (lv_style_value_t) { + .color = white + }; + case LV_STYLE_BG_GRAD_COLOR: + case LV_STYLE_BORDER_COLOR: + case LV_STYLE_SHADOW_COLOR: + case LV_STYLE_OUTLINE_COLOR: + case LV_STYLE_ARC_COLOR: + case LV_STYLE_LINE_COLOR: + case LV_STYLE_TEXT_COLOR: + case LV_STYLE_DROP_SHADOW_COLOR: + case LV_STYLE_IMAGE_RECOLOR: + case LV_STYLE_RECOLOR: + return (lv_style_value_t) { + .color = black + }; + case LV_STYLE_OPA: + case LV_STYLE_OPA_LAYERED: + case LV_STYLE_BORDER_OPA: + case LV_STYLE_TEXT_OPA: + case LV_STYLE_IMAGE_OPA: + case LV_STYLE_BG_GRAD_OPA: + case LV_STYLE_BG_MAIN_OPA: + case LV_STYLE_BG_IMAGE_OPA: + case LV_STYLE_OUTLINE_OPA: + case LV_STYLE_LINE_OPA: + case LV_STYLE_ARC_OPA: + case LV_STYLE_SHADOW_OPA: + return (lv_style_value_t) { + .num = LV_OPA_COVER + }; + case LV_STYLE_BG_GRAD_STOP: + return (lv_style_value_t) { + .num = 255 + }; + case LV_STYLE_BORDER_SIDE: + return (lv_style_value_t) { + .num = LV_BORDER_SIDE_FULL + }; + case LV_STYLE_TEXT_FONT: + return (lv_style_value_t) { + .ptr = LV_FONT_DEFAULT + }; + case LV_STYLE_MAX_WIDTH: + case LV_STYLE_MAX_HEIGHT: + return (lv_style_value_t) { + .num = LV_COORD_MAX + }; + case LV_STYLE_ROTARY_SENSITIVITY: + return (lv_style_value_t) { + .num = 256 + }; + case LV_STYLE_DROP_SHADOW_QUALITY: + return (lv_style_value_t) { + .num = LV_BLUR_QUALITY_PRECISION + }; + +#if LV_USE_GRID + case LV_STYLE_GRID_CELL_ROW_SPAN: + case LV_STYLE_GRID_CELL_COLUMN_SPAN: + return (lv_style_value_t) { + .num = 1 + }; +#endif + + default: + return (lv_style_value_t) { + .ptr = NULL + }; + } +} + +bool lv_style_is_empty(const lv_style_t * style) +{ + LV_ASSERT_STYLE(style); + + return style->prop_cnt == 0; +} + +uint8_t lv_style_prop_lookup_flags(lv_style_prop_t prop) +{ + if(prop == LV_STYLE_PROP_ANY) return LV_STYLE_PROP_FLAG_ALL; /*Any prop can have any flags*/ + if(prop == LV_STYLE_PROP_INV) return 0; + + if(prop < LV_STYLE_NUM_BUILT_IN_PROPS) + return lv_style_builtin_prop_flag_lookup_table[prop]; + prop -= LV_STYLE_NUM_BUILT_IN_PROPS; + if(lv_style_custom_prop_flag_lookup_table != NULL && prop < lv_style_custom_prop_flag_lookup_table_size) + return lv_style_custom_prop_flag_lookup_table[prop]; + return 0; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/misc/lv_style.h b/inc/lvgl/src/misc/lv_style.h new file mode 100644 index 0000000..b369a9c --- /dev/null +++ b/inc/lvgl/src/misc/lv_style.h @@ -0,0 +1,735 @@ +/** + * @file lv_style.h + * + */ + +#ifndef LV_STYLE_H +#define LV_STYLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../font/lv_font.h" +#include "lv_color.h" +#include "lv_area.h" +#include "lv_anim.h" +#include "lv_text.h" +#include "lv_types.h" +#include "lv_assert.h" +#include "lv_bidi.h" +#include "lv_grad.h" +#include "../layouts/lv_layout.h" + +/********************* + * DEFINES + *********************/ + +#define LV_STYLE_SENTINEL_VALUE 0xAABBCCDD + +/* + * Flags for style behavior + */ +#define LV_STYLE_PROP_FLAG_NONE (0) /**< No special behavior */ +#define LV_STYLE_PROP_FLAG_INHERITABLE (1 << 0) /**< Inherited */ +#define LV_STYLE_PROP_FLAG_EXT_DRAW_UPDATE (1 << 1) /**< Requires ext. draw size update when changed */ +#define LV_STYLE_PROP_FLAG_LAYOUT_UPDATE (1 << 2) /**< Requires layout update when changed */ +#define LV_STYLE_PROP_FLAG_PARENT_LAYOUT_UPDATE (1 << 3) /**< Requires layout update on parent when changed */ +#define LV_STYLE_PROP_FLAG_LAYER_UPDATE (1 << 4) /**< Affects layer handling */ +#define LV_STYLE_PROP_FLAG_TRANSFORM (1 << 5) /**< Affects the object's transformation */ +#define LV_STYLE_PROP_FLAG_ALL (0x3F) /**< Indicating all flags */ + +/* + * Other constants + */ +#define LV_SCALE_NONE 256 /**< Value for not zooming the image */ +LV_EXPORT_CONST_INT(LV_SCALE_NONE); + +// *INDENT-OFF* +#if LV_USE_ASSERT_STYLE +#define LV_STYLE_CONST_INIT(var_name, prop_array) \ + const lv_style_t var_name = { \ + .sentinel = LV_STYLE_SENTINEL_VALUE, \ + .values_and_props = (void*)prop_array, \ + .has_group = 0xFFFFFFFF, \ + .prop_cnt = 255 \ + } +#else +#define LV_STYLE_CONST_INIT(var_name, prop_array) \ + const lv_style_t var_name = { \ + .values_and_props = (void*)prop_array, \ + .has_group = 0xFFFFFFFF, \ + .prop_cnt = 255, \ + } +#endif +// *INDENT-ON* + +#define LV_STYLE_CONST_PROPS_END { .prop = LV_STYLE_PROP_INV, .value = { .num = 0 } } + +#if LV_GRADIENT_MAX_STOPS < 2 +#error LVGL needs at least 2 stops for gradients. Please increase the LV_GRADIENT_MAX_STOPS +#endif + +#define LV_GRAD_LEFT LV_PCT(0) +#define LV_GRAD_RIGHT LV_PCT(100) +#define LV_GRAD_TOP LV_PCT(0) +#define LV_GRAD_BOTTOM LV_PCT(100) +#define LV_GRAD_CENTER LV_PCT(50) + +/********************** + * TYPEDEFS + **********************/ + +/** + * Possible options for blending opaque drawings + */ +typedef enum { + LV_BLEND_MODE_NORMAL, /**< Simply mix according to the opacity value*/ + LV_BLEND_MODE_ADDITIVE, /**< Add the respective color channels*/ + LV_BLEND_MODE_SUBTRACTIVE,/**< Subtract the foreground from the background*/ + LV_BLEND_MODE_MULTIPLY, /**< Multiply the foreground and background*/ + LV_BLEND_MODE_DIFFERENCE, /**< Absolute difference between foreground and background*/ +} lv_blend_mode_t; + +/** + * Some options to apply decorations on texts. + * 'OR'ed values can be used. + */ +typedef enum { + LV_TEXT_DECOR_NONE = 0x00, + LV_TEXT_DECOR_UNDERLINE = 0x01, + LV_TEXT_DECOR_STRIKETHROUGH = 0x02, +} lv_text_decor_t; + +/** + * Selects on which sides border should be drawn + * 'OR'ed values can be used. + */ +typedef enum { + LV_BORDER_SIDE_NONE = 0x00, + LV_BORDER_SIDE_BOTTOM = 0x01, + LV_BORDER_SIDE_TOP = 0x02, + LV_BORDER_SIDE_LEFT = 0x04, + LV_BORDER_SIDE_RIGHT = 0x08, + LV_BORDER_SIDE_FULL = 0x0F, + LV_BORDER_SIDE_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ +} lv_border_side_t; + +typedef enum { + LV_BLUR_QUALITY_AUTO = 0, /**< Set the quality automatically */ + LV_BLUR_QUALITY_SPEED, /**< Prefer speed over precision */ + LV_BLUR_QUALITY_PRECISION, /**< Prefer precision over speed*/ +} lv_blur_quality_t; + +/** A image colorkey definition. + * The transparency within the color range of [low, high] will be set to LV_OPA_TRANSP If the "enable" flag is set to true. + */ +typedef struct { + lv_color_t low; + lv_color_t high; +} lv_image_colorkey_t; + +/** + * A common type to handle all the property types in the same way. + */ +typedef union { + int32_t num; /**< Number integer number (opacity, enums, booleans or "normal" numbers)*/ + const void * ptr; /**< Constant pointers (font, cone text, etc)*/ + lv_color_t color; /**< Colors*/ +} lv_style_value_t; + +/** + * Enumeration of all built in style properties + * + * Props are split into groups of 16. When adding a new prop to a group, ensure it does not overflow into the next one. + */ +enum _lv_style_id_t { + LV_STYLE_PROP_INV = 0, + + /*The properties are listed in a special order to make caching more effective. + *Groups are used when LV_OBJ_STYLE_CACHE is enabled. + *If a property from a groups is set, a bit will be set in + *obj->style_main_prop_is_set and style_other_prop_is_set + *to indicate that the property is set. + * + *Strategy 1: group related properties. E.g. if no "border" properties are set + * they will be skipped quickly. + * + *Strategy 2: group common property with rarely used properties. This way + * the common property is cached properly and it's rarely affected + * by other props. The other props are cached in an sub-optimal way, + * but they are used rarely. + * + *Strategy 3: group properties they are used rarely together so that caching doesn't + * interfere + * + *Each group can have 8 properties. (see STYLE_PROP_SHIFTED)*/ + + /* Size related properties*/ + LV_STYLE_WIDTH = 1, + LV_STYLE_HEIGHT, + LV_STYLE_LENGTH, + LV_STYLE_TRANSFORM_WIDTH, + LV_STYLE_TRANSFORM_HEIGHT, + + LV_STYLE_MIN_WIDTH = 8, + LV_STYLE_MAX_WIDTH, + LV_STYLE_MIN_HEIGHT, + LV_STYLE_MAX_HEIGHT, + LV_STYLE_TRANSLATE_X, + LV_STYLE_TRANSLATE_Y, + LV_STYLE_RADIAL_OFFSET, + + /*Position related properties */ + LV_STYLE_X = 16, + LV_STYLE_Y, + LV_STYLE_ALIGN, + + /*Padding related properties */ + LV_STYLE_PAD_TOP = 24, + LV_STYLE_PAD_BOTTOM, + LV_STYLE_PAD_LEFT, + LV_STYLE_PAD_RIGHT, + LV_STYLE_PAD_RADIAL, + LV_STYLE_PAD_ROW, + LV_STYLE_PAD_COLUMN, + + /*Margin related properties*/ + LV_STYLE_MARGIN_TOP = 32, + LV_STYLE_MARGIN_BOTTOM, + LV_STYLE_MARGIN_LEFT, + LV_STYLE_MARGIN_RIGHT, + + /*Bg. Gradient*/ + LV_STYLE_BG_GRAD = 40, + LV_STYLE_BG_GRAD_DIR, + LV_STYLE_BG_MAIN_OPA, + LV_STYLE_BG_GRAD_OPA, + LV_STYLE_BG_GRAD_COLOR, + LV_STYLE_BG_MAIN_STOP, + LV_STYLE_BG_GRAD_STOP, + + /*Bg image*/ + LV_STYLE_BG_IMAGE_SRC = 48, + LV_STYLE_BG_IMAGE_OPA, + LV_STYLE_BG_IMAGE_RECOLOR_OPA, + LV_STYLE_BG_IMAGE_TILED, + LV_STYLE_BG_IMAGE_RECOLOR, + + /*Group 3*/ + LV_STYLE_BORDER_WIDTH = 56, + LV_STYLE_BORDER_COLOR, + LV_STYLE_BORDER_OPA, + LV_STYLE_BORDER_POST, + LV_STYLE_BORDER_SIDE, + + /*Outline */ + LV_STYLE_OUTLINE_WIDTH = 64, + LV_STYLE_OUTLINE_COLOR, + LV_STYLE_OUTLINE_OPA, + LV_STYLE_OUTLINE_PAD, + + /*Image, Shadow, Line, Arc, and Text are rarely used together.*/ + LV_STYLE_BG_OPA = 72, + LV_STYLE_BG_COLOR, + LV_STYLE_SHADOW_WIDTH, + LV_STYLE_LINE_WIDTH, + LV_STYLE_ARC_WIDTH, + LV_STYLE_TEXT_FONT, + LV_STYLE_IMAGE_RECOLOR_OPA, + + LV_STYLE_IMAGE_OPA = 80, + LV_STYLE_SHADOW_OPA, + LV_STYLE_LINE_OPA, + LV_STYLE_ARC_OPA, + LV_STYLE_TEXT_OPA, + + LV_STYLE_SHADOW_COLOR = 88, + LV_STYLE_IMAGE_RECOLOR, + LV_STYLE_LINE_COLOR, + LV_STYLE_ARC_COLOR, + LV_STYLE_TEXT_COLOR, + + LV_STYLE_ARC_IMAGE_SRC = 96, + LV_STYLE_SHADOW_OFFSET_X, + LV_STYLE_SHADOW_OFFSET_Y, + LV_STYLE_SHADOW_SPREAD, + LV_STYLE_LINE_DASH_WIDTH, + LV_STYLE_TEXT_ALIGN, + LV_STYLE_TEXT_LETTER_SPACE, + LV_STYLE_TEXT_LINE_SPACE, + + LV_STYLE_LINE_DASH_GAP = 104, + LV_STYLE_LINE_ROUNDED, + LV_STYLE_IMAGE_COLORKEY, + LV_STYLE_TEXT_OUTLINE_STROKE_WIDTH, + LV_STYLE_TEXT_OUTLINE_STROKE_OPA, + LV_STYLE_TEXT_OUTLINE_STROKE_COLOR, + LV_STYLE_TEXT_DECOR, + LV_STYLE_ARC_ROUNDED, + + /*Group unrelated props*/ + LV_STYLE_OPA = 112, + LV_STYLE_OPA_LAYERED, + LV_STYLE_COLOR_FILTER_DSC, + LV_STYLE_COLOR_FILTER_OPA, + LV_STYLE_ANIM, + LV_STYLE_ANIM_DURATION, + LV_STYLE_TRANSITION, + + /*Radius is requested a lot, group it with rarely requested ones*/ + LV_STYLE_RADIUS = 120, + LV_STYLE_BITMAP_MASK_SRC, + LV_STYLE_BLEND_MODE, + LV_STYLE_ROTARY_SENSITIVITY, + LV_STYLE_TRANSLATE_RADIAL, + + /*Requested a lot but rarely used*/ + LV_STYLE_CLIP_CORNER = 128, + LV_STYLE_BASE_DIR, + LV_STYLE_RECOLOR, + LV_STYLE_RECOLOR_OPA, + LV_STYLE_LAYOUT, + + /*Blur*/ + LV_STYLE_BLUR_RADIUS = 136, + LV_STYLE_BLUR_BACKDROP, + LV_STYLE_BLUR_QUALITY, + + /*Drop shadow*/ + LV_STYLE_DROP_SHADOW_RADIUS = 144, + LV_STYLE_DROP_SHADOW_OFFSET_X, + LV_STYLE_DROP_SHADOW_OFFSET_Y, + LV_STYLE_DROP_SHADOW_COLOR, + LV_STYLE_DROP_SHADOW_OPA, + LV_STYLE_DROP_SHADOW_QUALITY, + + /*Scale and transform*/ + LV_STYLE_TRANSFORM_SCALE_X = 152, + LV_STYLE_TRANSFORM_SCALE_Y, + LV_STYLE_TRANSFORM_PIVOT_X, + LV_STYLE_TRANSFORM_PIVOT_Y, + LV_STYLE_TRANSFORM_ROTATION, + LV_STYLE_TRANSFORM_SKEW_X, + LV_STYLE_TRANSFORM_SKEW_Y, + + /*Flex and basic grid (rarely used together)*/ + LV_STYLE_FLEX_FLOW = 160, + LV_STYLE_FLEX_MAIN_PLACE, + LV_STYLE_FLEX_CROSS_PLACE, + LV_STYLE_FLEX_TRACK_PLACE, + LV_STYLE_FLEX_GROW, + LV_STYLE_GRID_COLUMN_DSC_ARRAY, + LV_STYLE_GRID_ROW_DSC_ARRAY, + + LV_STYLE_GRID_COLUMN_ALIGN = 168, + LV_STYLE_GRID_ROW_ALIGN, + LV_STYLE_GRID_CELL_COLUMN_POS, + LV_STYLE_GRID_CELL_COLUMN_SPAN, + LV_STYLE_GRID_CELL_X_ALIGN, + LV_STYLE_GRID_CELL_ROW_POS, + LV_STYLE_GRID_CELL_ROW_SPAN, + LV_STYLE_GRID_CELL_Y_ALIGN, + + LV_STYLE_LAST_BUILT_IN_PROP, + LV_STYLE_NUM_BUILT_IN_PROPS = LV_STYLE_LAST_BUILT_IN_PROP + 1, + + LV_STYLE_PROP_ANY = 0xFF, + LV_STYLE_PROP_CONST = 0xFF /* magic value for const styles */ +}; + +typedef enum { + LV_STYLE_RES_NOT_FOUND, + LV_STYLE_RES_FOUND, +} lv_style_res_t; + +/** + * Descriptor for style transitions + */ +typedef struct { + const lv_style_prop_t * props; /**< An array with the properties to animate.*/ + void * user_data; /**< A custom user data that will be passed to the animation's user_data */ + lv_anim_path_cb_t path_xcb; /**< A path for the animation.*/ + uint32_t time; /**< Duration of the transition in [ms]*/ + uint32_t delay; /**< Delay before the transition in [ms]*/ +} lv_style_transition_dsc_t; + +/** + * Descriptor of a constant style property. + */ +typedef struct { + lv_style_prop_t prop; + lv_style_value_t value; +} lv_style_const_prop_t; + +/** + * Descriptor of a style (a collection of properties and values). + */ +typedef struct { + +#if LV_USE_ASSERT_STYLE + uint32_t sentinel; +#endif + + void * values_and_props; + + uint32_t has_group; + uint8_t prop_cnt; /**< 255 means it's a constant style*/ +} lv_style_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize a style + * @param style pointer to a style to initialize + * @note Do not call `lv_style_init` on styles that already have some properties + * because this function won't free the used memory, just sets a default state for the style. + * In other words be sure to initialize styles only once! + */ +void lv_style_init(lv_style_t * style); + +/** + * Clear all properties from a style and free all allocated memories. + * @param style pointer to a style + */ +void lv_style_reset(lv_style_t * style); + +/** + * Copy all properties of a style to an other. + * It has the same affect callying the same `lv_set_style_...` + * functions on both styles. + * It means new memory will be allocated to store the properties in + * the destination style. + * After the copy the destination style is fully independent of the source + * and source can removed without affecting the destination style. + * @param dst the destination to copy into (can not the a constant style) + * @param src the source style to copy from. + */ +void lv_style_copy(lv_style_t * dst, const lv_style_t * src); + +/** + * Copy all properties of a style to an other without resetting the dst style. + * It has the same effect as calling the same `lv_set_style_...` + * functions on both styles. + * It means new memory will be allocated to store the properties in + * the destination style. + * After the copy the destination style is fully independent of the source + * and source can removed without affecting the destination style. + * @param dst the destination to copy into (cannot be a constant style) + * @param src the source style to copy from. + */ +void lv_style_merge(lv_style_t * dst, const lv_style_t * src); + + +/** + * Check if a style is constant + * @param style pointer to a style + * @return true: the style is constant + */ +static inline bool lv_style_is_const(const lv_style_t * style) +{ + if(style->prop_cnt == 255) return true; + return false; +} + + +/** + * Register a new style property for custom usage + * @return a new property ID, or LV_STYLE_PROP_INV if there are no more available. + * + * Example: + * @code + * lv_style_prop_t MY_PROP; + * static inline void lv_style_set_my_prop(lv_style_t * style, lv_color_t value) { + * lv_style_value_t v = {.color = value}; lv_style_set_prop(style, MY_PROP, v); } + * + * ... + * MY_PROP = lv_style_register_prop(); + * ... + * lv_style_set_my_prop(&style1, lv_palette_main(LV_PALETTE_RED)); + * @endcode + */ +lv_style_prop_t lv_style_register_prop(uint8_t flag); + +/** + * Get the number of custom properties that have been registered thus far. + */ +lv_style_prop_t lv_style_get_num_custom_props(void); + +/** + * Remove a property from a style + * @param style pointer to a style + * @param prop a style property ORed with a state. + * @return true: the property was found and removed; false: the property wasn't found + */ +bool lv_style_remove_prop(lv_style_t * style, lv_style_prop_t prop); + +/** + * Set the value of property in a style. + * This function shouldn't be used directly by the user. + * Instead use `lv_style_set_()`. E.g. `lv_style_set_bg_color()` + * @param style pointer to style + * @param prop the ID of a property (e.g. `LV_STYLE_BG_COLOR`) + * @param value `lv_style_value_t` variable in which a field is set according to the type of `prop` + */ +void lv_style_set_prop(lv_style_t * style, lv_style_prop_t prop, lv_style_value_t value); + +/** + * Get the value of a property + * @param style pointer to a style + * @param prop the ID of a property + * @param value pointer to a `lv_style_value_t` variable to store the value + * @return LV_RESULT_INVALID: the property wasn't found in the style (`value` is unchanged) + * LV_RESULT_OK: the property was fond, and `value` is set accordingly + * @note For performance reasons there are no sanity check on `style` + */ +lv_style_res_t lv_style_get_prop(const lv_style_t * style, lv_style_prop_t prop, lv_style_value_t * value); + +/** + * Initialize a transition descriptor. + * @param tr pointer to a transition descriptor to initialize + * @param props an array with the properties to transition. The last element must be zero. + * @param path_cb an animation path (ease) callback. If `NULL` liner path will be used. + * @param time duration of the transition in [ms] + * @param delay delay before the transition in [ms] + * @param user_data any custom data that will be saved in the transition animation and will be available when `path_cb` is called + * + * Example: + * @code + * const static lv_style_prop_t trans_props[] = { LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, 0 }; + * static lv_style_transition_dsc_t trans1; + * lv_style_transition_dsc_init(&trans1, trans_props, NULL, 300, 0, NULL); + * @endcode + */ +void lv_style_transition_dsc_init(lv_style_transition_dsc_t * tr, const lv_style_prop_t props[], + lv_anim_path_cb_t path_cb, uint32_t time, uint32_t delay, void * user_data); + +/** + * Get the default value of a property + * @param prop the ID of a property + * @return the default value + */ +lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop); + +/** + * Get the value of a property + * @param style pointer to a style + * @param prop the ID of a property + * @param value pointer to a `lv_style_value_t` variable to store the value + * @return LV_RESULT_INVALID: the property wasn't found in the style (`value` is unchanged) + * LV_RESULT_OK: the property was fond, and `value` is set accordingly + * @note For performance reasons there are no sanity check on `style` + * @note This function is the same as ::lv_style_get_prop but inlined. Use it only on performance critical places + */ +static inline lv_style_res_t lv_style_get_prop_inlined(const lv_style_t * style, lv_style_prop_t prop, + lv_style_value_t * value) +{ + if(lv_style_is_const(style)) { + lv_style_const_prop_t * props = (lv_style_const_prop_t *)style->values_and_props; + uint32_t i; + for(i = 0; props[i].prop != LV_STYLE_PROP_INV; i++) { + if(props[i].prop == prop) { + *value = props[i].value; + return LV_STYLE_RES_FOUND; + } + } + } + else { + lv_style_prop_t * props = (lv_style_prop_t *)style->values_and_props + style->prop_cnt * sizeof(lv_style_value_t); + uint32_t i; + for(i = 0; i < style->prop_cnt; i++) { + if(props[i] == prop) { + lv_style_value_t * values = (lv_style_value_t *)style->values_and_props; + *value = values[i]; + return LV_STYLE_RES_FOUND; + } + } + } + return LV_STYLE_RES_NOT_FOUND; +} + +/** + * Checks if a style is empty (has no properties) + * @param style pointer to a style + * @return true if the style is empty + */ +bool lv_style_is_empty(const lv_style_t * style); + +/** + * Tell the group of a property. If the a property from a group is set in a style the (1 << group) bit of style->has_group is set. + * It allows early skipping the style if the property is not exists in the style at all. + * @param prop a style property + * @return the group [0..30] 30 means all the custom properties with index > 120 + */ +static inline uint32_t lv_style_get_prop_group(lv_style_prop_t prop) +{ + uint32_t group = prop >> 2; + if(group > 30) group = 31; /*The MSB marks all the custom properties*/ + return group; + +} + +/** + * Get the flags of a built-in or custom property. + * + * @param prop a style property + * @return the flags of the property + */ +uint8_t lv_style_prop_lookup_flags(lv_style_prop_t prop); + +#include "lv_style_gen.h" + +/** + * Set `style`s width and height. + * @param style pointer to style to be modified + * @param width width in pixels + * @param height height in pixels + */ +static inline void lv_style_set_size(lv_style_t * style, int32_t width, int32_t height) +{ + lv_style_set_width(style, width); + lv_style_set_height(style, height); +} + +/** + * Set all 4 of `style`s padding values. + * @param style pointer to style to be modified + * @param value padding dimension in pixels + */ +static inline void lv_style_set_pad_all(lv_style_t * style, int32_t value) +{ + lv_style_set_pad_left(style, value); + lv_style_set_pad_right(style, value); + lv_style_set_pad_top(style, value); + lv_style_set_pad_bottom(style, value); +} + +/** + * Set `style`s left and right padding values. + * @param style pointer to style to be modified + * @param value padding dimension in pixels + */ +static inline void lv_style_set_pad_hor(lv_style_t * style, int32_t value) +{ + lv_style_set_pad_left(style, value); + lv_style_set_pad_right(style, value); +} + +/** + * Set `style`s top and bottom padding values. + * @param style pointer to style to be modified + * @param value padding dimension in pixels + */ +static inline void lv_style_set_pad_ver(lv_style_t * style, int32_t value) +{ + lv_style_set_pad_top(style, value); + lv_style_set_pad_bottom(style, value); +} + +/** + * Set `style`s row and column padding gaps (applies only to Grid and Flex layouts). + * @param style pointer to style to be modified + * @param value gap dimension in pixels + */ +static inline void lv_style_set_pad_gap(lv_style_t * style, int32_t value) +{ + lv_style_set_pad_row(style, value); + lv_style_set_pad_column(style, value); +} + +/** + * Set `style`s left and right margin values. + * @param style pointer to style to be modified + * @param value margin dimension in pixels + */ +static inline void lv_style_set_margin_hor(lv_style_t * style, int32_t value) +{ + lv_style_set_margin_left(style, value); + lv_style_set_margin_right(style, value); +} + +/** + * Set `style`s top and bottom margin values. + * @param style pointer to style to be modified + * @param value margin dimension in pixels + */ +static inline void lv_style_set_margin_ver(lv_style_t * style, int32_t value) +{ + lv_style_set_margin_top(style, value); + lv_style_set_margin_bottom(style, value); +} + +/** + * Set all 4 of `style`s margin values. + * @param style pointer to style to be modified + * @param value margin dimension in pixels + */ +static inline void lv_style_set_margin_all(lv_style_t * style, int32_t value) +{ + lv_style_set_margin_left(style, value); + lv_style_set_margin_right(style, value); + lv_style_set_margin_top(style, value); + lv_style_set_margin_bottom(style, value); +} + +/** + * Set `style`s X and Y transform scale values. + * @param style pointer to style to be modified + * @param value scale factor. Example values: + * - 256 or LV_SCALE_NONE: no zoom + * - <256: scale down + * - >256: scale up + * - 128: half size + * - 512: double size + */ +static inline void lv_style_set_transform_scale(lv_style_t * style, int32_t value) +{ + lv_style_set_transform_scale_x(style, value); + lv_style_set_transform_scale_y(style, value); +} + +/** + * @brief Check if the style property has a specified behavioral flag. + * + * Do not pass multiple flags to this function as backwards-compatibility is not guaranteed + * for that. + * + * @param prop Property ID + * @param flag Flag + * @return true if the flag is set for this property + */ +static inline bool lv_style_prop_has_flag(lv_style_prop_t prop, uint8_t flag) +{ + return lv_style_prop_lookup_flags(prop) & flag; +} + +/************************* + * GLOBAL VARIABLES + *************************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t lv_style_const_prop_id_inv; + +/********************** + * MACROS + **********************/ + +#if LV_USE_ASSERT_STYLE +# define LV_ASSERT_STYLE(style_p) \ + do { \ + LV_ASSERT_MSG(style_p != NULL, "The style is NULL"); \ + LV_ASSERT_MSG(style_p->sentinel == LV_STYLE_SENTINEL_VALUE, "Style is not initialized or corrupted"); \ + } while(0) +#else +# define LV_ASSERT_STYLE(p) do{}while(0) +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_STYLE_H*/ diff --git a/inc/lvgl/src/misc/lv_style_gen.c b/inc/lvgl/src/misc/lv_style_gen.c new file mode 100644 index 0000000..8f72b09 --- /dev/null +++ b/inc/lvgl/src/misc/lv_style_gen.c @@ -0,0 +1,1042 @@ +/* + * @file + * + ********************************************************************** + * DO NOT EDIT + * This file is automatically generated by "style_api_gen.py" + ********************************************************************** + */ + + +#include "lv_style.h" + + +void lv_style_set_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_WIDTH, v); +} + +void lv_style_set_min_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MIN_WIDTH, v); +} + +void lv_style_set_max_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MAX_WIDTH, v); +} + +void lv_style_set_height(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_HEIGHT, v); +} + +void lv_style_set_min_height(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MIN_HEIGHT, v); +} + +void lv_style_set_max_height(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MAX_HEIGHT, v); +} + +void lv_style_set_length(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LENGTH, v); +} + +void lv_style_set_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_X, v); +} + +void lv_style_set_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_Y, v); +} + +void lv_style_set_align(lv_style_t * style, lv_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ALIGN, v); +} + +void lv_style_set_transform_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_WIDTH, v); +} + +void lv_style_set_transform_height(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_HEIGHT, v); +} + +void lv_style_set_translate_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSLATE_X, v); +} + +void lv_style_set_translate_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSLATE_Y, v); +} + +void lv_style_set_translate_radial(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSLATE_RADIAL, v); +} + +void lv_style_set_transform_scale_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_X, v); +} + +void lv_style_set_transform_scale_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_SCALE_Y, v); +} + +void lv_style_set_transform_rotation(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_ROTATION, v); +} + +void lv_style_set_transform_pivot_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_X, v); +} + +void lv_style_set_transform_pivot_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_PIVOT_Y, v); +} + +void lv_style_set_transform_skew_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_SKEW_X, v); +} + +void lv_style_set_transform_skew_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TRANSFORM_SKEW_Y, v); +} + +void lv_style_set_pad_top(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_TOP, v); +} + +void lv_style_set_pad_bottom(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_BOTTOM, v); +} + +void lv_style_set_pad_left(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_LEFT, v); +} + +void lv_style_set_pad_right(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_RIGHT, v); +} + +void lv_style_set_pad_row(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_ROW, v); +} + +void lv_style_set_pad_column(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_COLUMN, v); +} + +void lv_style_set_pad_radial(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_PAD_RADIAL, v); +} + +void lv_style_set_margin_top(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MARGIN_TOP, v); +} + +void lv_style_set_margin_bottom(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MARGIN_BOTTOM, v); +} + +void lv_style_set_margin_left(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MARGIN_LEFT, v); +} + +void lv_style_set_margin_right(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_MARGIN_RIGHT, v); +} + +void lv_style_set_bg_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BG_COLOR, v); +} + +void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_OPA, v); +} + +void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_COLOR, v); +} + +void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_DIR, v); +} + +void lv_style_set_bg_main_stop(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_MAIN_STOP, v); +} + +void lv_style_set_bg_grad_stop(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_STOP, v); +} + +void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_MAIN_OPA, v); +} + +void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD_OPA, v); +} + +void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_BG_GRAD, v); +} + +void lv_style_set_bg_image_src(lv_style_t * style, const void * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_SRC, v); +} + +void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_OPA, v); +} + +void lv_style_set_bg_image_recolor(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_RECOLOR, v); +} + +void lv_style_set_bg_image_recolor_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_RECOLOR_OPA, v); +} + +void lv_style_set_bg_image_tiled(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BG_IMAGE_TILED, v); +} + +void lv_style_set_border_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_COLOR, v); +} + +void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_OPA, v); +} + +void lv_style_set_border_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_WIDTH, v); +} + +void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_SIDE, v); +} + +void lv_style_set_border_post(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BORDER_POST, v); +} + +void lv_style_set_outline_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_WIDTH, v); +} + +void lv_style_set_outline_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_COLOR, v); +} + +void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_OPA, v); +} + +void lv_style_set_outline_pad(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OUTLINE_PAD, v); +} + +void lv_style_set_shadow_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_WIDTH, v); +} + +void lv_style_set_shadow_offset_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_OFFSET_X, v); +} + +void lv_style_set_shadow_offset_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_OFFSET_Y, v); +} + +void lv_style_set_shadow_spread(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_SPREAD, v); +} + +void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_COLOR, v); +} + +void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_SHADOW_OPA, v); +} + +void lv_style_set_image_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_IMAGE_OPA, v); +} + +void lv_style_set_image_recolor(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_IMAGE_RECOLOR, v); +} + +void lv_style_set_image_recolor_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_IMAGE_RECOLOR_OPA, v); +} + +void lv_style_set_image_colorkey(lv_style_t * style, const lv_image_colorkey_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_IMAGE_COLORKEY, v); +} + +void lv_style_set_line_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_WIDTH, v); +} + +void lv_style_set_line_dash_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_DASH_WIDTH, v); +} + +void lv_style_set_line_dash_gap(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_DASH_GAP, v); +} + +void lv_style_set_line_rounded(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_ROUNDED, v); +} + +void lv_style_set_line_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_LINE_COLOR, v); +} + +void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LINE_OPA, v); +} + +void lv_style_set_arc_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ARC_WIDTH, v); +} + +void lv_style_set_arc_rounded(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ARC_ROUNDED, v); +} + +void lv_style_set_arc_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_ARC_COLOR, v); +} + +void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ARC_OPA, v); +} + +void lv_style_set_arc_image_src(lv_style_t * style, const void * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_ARC_IMAGE_SRC, v); +} + +void lv_style_set_text_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_COLOR, v); +} + +void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_OPA, v); +} + +void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_FONT, v); +} + +void lv_style_set_text_letter_space(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_LETTER_SPACE, v); +} + +void lv_style_set_text_line_space(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_LINE_SPACE, v); +} + +void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_DECOR, v); +} + +void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_ALIGN, v); +} + +void lv_style_set_text_outline_stroke_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_OUTLINE_STROKE_COLOR, v); +} + +void lv_style_set_text_outline_stroke_width(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_OUTLINE_STROKE_WIDTH, v); +} + +void lv_style_set_text_outline_stroke_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_TEXT_OUTLINE_STROKE_OPA, v); +} + +void lv_style_set_blur_radius(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BLUR_RADIUS, v); +} + +void lv_style_set_blur_backdrop(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BLUR_BACKDROP, v); +} + +void lv_style_set_blur_quality(lv_style_t * style, lv_blur_quality_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BLUR_QUALITY, v); +} + +void lv_style_set_drop_shadow_radius(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_DROP_SHADOW_RADIUS, v); +} + +void lv_style_set_drop_shadow_offset_x(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_DROP_SHADOW_OFFSET_X, v); +} + +void lv_style_set_drop_shadow_offset_y(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_DROP_SHADOW_OFFSET_Y, v); +} + +void lv_style_set_drop_shadow_color(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_DROP_SHADOW_COLOR, v); +} + +void lv_style_set_drop_shadow_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_DROP_SHADOW_OPA, v); +} + +void lv_style_set_drop_shadow_quality(lv_style_t * style, lv_blur_quality_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_DROP_SHADOW_QUALITY, v); +} + +void lv_style_set_radius(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_RADIUS, v); +} + +void lv_style_set_radial_offset(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_RADIAL_OFFSET, v); +} + +void lv_style_set_clip_corner(lv_style_t * style, bool value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_CLIP_CORNER, v); +} + +void lv_style_set_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OPA, v); +} + +void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_OPA_LAYERED, v); +} + +void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_DSC, v); +} + +void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_OPA, v); +} + +void lv_style_set_recolor(lv_style_t * style, lv_color_t value) +{ + lv_style_value_t v = { + .color = value + }; + lv_style_set_prop(style, LV_STYLE_RECOLOR, v); +} + +void lv_style_set_recolor_opa(lv_style_t * style, lv_opa_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_RECOLOR_OPA, v); +} + +void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_ANIM, v); +} + +void lv_style_set_anim_duration(lv_style_t * style, uint32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ANIM_DURATION, v); +} + +void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_TRANSITION, v); +} + +void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BLEND_MODE, v); +} + +void lv_style_set_layout(lv_style_t * style, uint16_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_LAYOUT, v); +} + +void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_BASE_DIR, v); +} + +void lv_style_set_bitmap_mask_src(lv_style_t * style, const void * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_BITMAP_MASK_SRC, v); +} + +void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_ROTARY_SENSITIVITY, v); +} +#if LV_USE_FLEX + +void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_FLOW, v); +} + +void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_MAIN_PLACE, v); +} + +void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_CROSS_PLACE, v); +} + +void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_TRACK_PLACE, v); +} + +void lv_style_set_flex_grow(lv_style_t * style, uint8_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_FLEX_GROW, v); +} +#endif /* LV_USE_FLEX */ + +#if LV_USE_GRID + +void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_DSC_ARRAY, v); +} + +void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_COLUMN_ALIGN, v); +} + +void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value) +{ + lv_style_value_t v = { + .ptr = value + }; + lv_style_set_prop(style, LV_STYLE_GRID_ROW_DSC_ARRAY, v); +} + +void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_ROW_ALIGN, v); +} + +void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_POS, v); +} + +void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_X_ALIGN, v); +} + +void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_COLUMN_SPAN, v); +} + +void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_POS, v); +} + +void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_Y_ALIGN, v); +} + +void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value) +{ + lv_style_value_t v = { + .num = (int32_t)value + }; + lv_style_set_prop(style, LV_STYLE_GRID_CELL_ROW_SPAN, v); +} +#endif /* LV_USE_GRID */ + diff --git a/inc/lvgl/src/misc/lv_style_gen.h b/inc/lvgl/src/misc/lv_style_gen.h new file mode 100644 index 0000000..3c14467 --- /dev/null +++ b/inc/lvgl/src/misc/lv_style_gen.h @@ -0,0 +1,2527 @@ +/* + * @file + * + ********************************************************************** + * DO NOT EDIT + * This file is automatically generated by "style_api_gen.py" + ********************************************************************** + */ + + +#ifndef LV_STYLE_GEN_H +#define LV_STYLE_GEN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Sets width of Widget. Pixel, percentage and `LV_SIZE_CONTENT` values can be used. + * Percentage values are relative to the width of the parent's content area. + * Default: Widget dependent, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_width(lv_style_t * style, int32_t value); + +/** + * Sets a minimal width. Pixel and percentage values can be used. Percentage values + * are relative to the width of the parent's content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_min_width(lv_style_t * style, int32_t value); + +/** + * Sets a maximal width. Pixel and percentage values can be used. Percentage values + * are relative to the width of the parent's content area. + * Default: LV_COORD_MAX, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_max_width(lv_style_t * style, int32_t value); + +/** + * Sets height of Widget. Pixel, percentage and `LV_SIZE_CONTENT` can be used. + * Percentage values are relative to the height of the parent's content area. + * Default: Widget dependent, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_height(lv_style_t * style, int32_t value); + +/** + * Sets a minimal height. Pixel and percentage values can be used. Percentage values + * are relative to the height of the parent's content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_min_height(lv_style_t * style, int32_t value); + +/** + * Sets a maximal height. Pixel and percentage values can be used. Percentage values + * are relative to the height of the parent's content area. + * Default: LV_COORD_MAX, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_max_height(lv_style_t * style, int32_t value); + +/** + * Its meaning depends on the type of Widget. For example in case of lv_scale it means + * the length of the ticks. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_length(lv_style_t * style, int32_t value); + +/** + * Set X coordinate of Widget considering the ``align`` setting. Pixel and percentage + * values can be used. Percentage values are relative to the width of the parent's + * content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_x(lv_style_t * style, int32_t value); + +/** + * Set Y coordinate of Widget considering the ``align`` setting. Pixel and percentage + * values can be used. Percentage values are relative to the height of the parent's + * content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_y(lv_style_t * style, int32_t value); + +/** + * Set the alignment which tells from which point of the parent the X and Y + * coordinates should be interpreted. Possible values are: `LV_ALIGN_DEFAULT`, + * `LV_ALIGN_TOP_LEFT/MID/RIGHT`, `LV_ALIGN_BOTTOM_LEFT/MID/RIGHT`, + * `LV_ALIGN_LEFT/RIGHT_MID`, `LV_ALIGN_CENTER`. `LV_ALIGN_DEFAULT` means + * `LV_ALIGN_TOP_LEFT` with LTR base direction and `LV_ALIGN_TOP_RIGHT` with RTL base + * direction. + * Default: `LV_ALIGN_DEFAULT`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_align(lv_style_t * style, lv_align_t value); + +/** + * Make Widget wider on both sides with this value. Pixel and percentage (with + * `lv_pct(x)`) values can be used. Percentage values are relative to Widget's width. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_transform_width(lv_style_t * style, int32_t value); + +/** + * Make Widget higher on both sides with this value. Pixel and percentage (with + * `lv_pct(x)`) values can be used. Percentage values are relative to Widget's height. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_transform_height(lv_style_t * style, int32_t value); + +/** + * Move Widget with this value in X direction. Applied after layouts, aligns and other + * positioning. Pixel and percentage (with `lv_pct(x)`) values can be used. Percentage + * values are relative to Widget's width. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_translate_x(lv_style_t * style, int32_t value); + +/** + * Move Widget with this value in Y direction. Applied after layouts, aligns and other + * positioning. Pixel and percentage (with `lv_pct(x)`) values can be used. Percentage + * values are relative to Widget's height. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_translate_y(lv_style_t * style, int32_t value); + +/** + * Move object around the centre of the parent object (e.g. around the circumference + * of a scale). + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_translate_radial(lv_style_t * style, int32_t value); + +/** + * Zoom Widget horizontally. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 + * half size, 512 double size, and so on. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_transform_scale_x(lv_style_t * style, int32_t value); + +/** + * Zoom Widget vertically. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 + * half size, 512 double size, and so on. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_transform_scale_y(lv_style_t * style, int32_t value); + +/** + * Rotate Widget. The value is interpreted in 0.1 degree units. E.g. 450 means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_transform_rotation(lv_style_t * style, int32_t value); + +/** + * Set pivot point's X coordinate for transformations. Relative to Widget's top left corner. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_transform_pivot_x(lv_style_t * style, int32_t value); + +/** + * Set pivot point's Y coordinate for transformations. Relative to Widget's top left corner. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_transform_pivot_y(lv_style_t * style, int32_t value); + +/** + * Skew Widget horizontally. The value is interpreted in 0.1 degree units. E.g. 450 + * means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_transform_skew_x(lv_style_t * style, int32_t value); + +/** + * Skew Widget vertically. The value is interpreted in 0.1 degree units. E.g. 450 + * means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_transform_skew_y(lv_style_t * style, int32_t value); + +/** + * Sets the padding on the top. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_pad_top(lv_style_t * style, int32_t value); + +/** + * Sets the padding on the bottom. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_pad_bottom(lv_style_t * style, int32_t value); + +/** + * Sets the padding on the left. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_pad_left(lv_style_t * style, int32_t value); + +/** + * Sets the padding on the right. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_pad_right(lv_style_t * style, int32_t value); + +/** + * Sets the padding between the rows. Used by the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_pad_row(lv_style_t * style, int32_t value); + +/** + * Sets the padding between the columns. Used by the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_pad_column(lv_style_t * style, int32_t value); + +/** + * Pad text labels away from the scale ticks/remainder of the ``LV_PART_``. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_pad_radial(lv_style_t * style, int32_t value); + +/** + * Sets margin on the top. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_margin_top(lv_style_t * style, int32_t value); + +/** + * Sets margin on the bottom. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_margin_bottom(lv_style_t * style, int32_t value); + +/** + * Sets margin on the left. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_margin_left(lv_style_t * style, int32_t value); + +/** + * Sets margin on the right. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_margin_right(lv_style_t * style, int32_t value); + +/** + * Set background color of Widget. + * Default: `0xffffff`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_bg_color(lv_style_t * style, lv_color_t value); + +/** + * Set opacity of the background. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_bg_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set gradient color of the background. Used only if `grad_dir` is not `LV_GRAD_DIR_NONE`. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_bg_grad_color(lv_style_t * style, lv_color_t value); + +/** + * Set direction of the gradient of the background. Possible values are + * `LV_GRAD_DIR_NONE/HOR/VER`. + * Default: `LV_GRAD_DIR_NONE`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_bg_grad_dir(lv_style_t * style, lv_grad_dir_t value); + +/** + * Set point from which background color should start for gradients. 0 means to + * top/left side, 255 the bottom/right side, 128 the center, and so on. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_bg_main_stop(lv_style_t * style, int32_t value); + +/** + * Set point from which background's gradient color should start. 0 means to top/left + * side, 255 the bottom/right side, 128 the center, and so on. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_bg_grad_stop(lv_style_t * style, int32_t value); + +/** + * Set opacity of the first gradient color. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_bg_main_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set opacity of the second gradient color. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_bg_grad_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set gradient definition. The pointed instance must exist while Widget is alive. + * NULL to disable. It wraps `BG_GRAD_COLOR`, `BG_GRAD_DIR`, `BG_MAIN_STOP` and + * `BG_GRAD_STOP` into one descriptor and allows creating gradients with more colors + * as well. If it's set other gradient related properties will be ignored. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to gradient descriptor + */ +void lv_style_set_bg_grad(lv_style_t * style, const lv_grad_dsc_t * value); + +/** + * Set a background image. Can be a pointer to `lv_image_dsc_t`, a path to a file or + * an `LV_SYMBOL_...`. + * Default: `NULL`, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Pointer to image source + */ +void lv_style_set_bg_image_src(lv_style_t * style, const void * value); + +/** + * Set opacity of the background image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means + * fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other + * values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_bg_image_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set a color to mix to the background image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_bg_image_recolor(lv_style_t * style, lv_color_t value); + +/** + * Set intensity of background image recoloring. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means no mixing, 255, `LV_OPA_100` or `LV_OPA_COVER` means full + * recoloring, other values or LV_OPA_10, LV_OPA_20, etc are interpreted + * proportionally. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_bg_image_recolor_opa(lv_style_t * style, lv_opa_t value); + +/** + * If enabled the background image will be tiled. Possible values are `true` or `false`. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_bg_image_tiled(lv_style_t * style, bool value); + +/** + * Set color of the border. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_border_color(lv_style_t * style, lv_color_t value); + +/** + * Set opacity of the border. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_border_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set width of the border. Only pixel values can be used. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_border_width(lv_style_t * style, int32_t value); + +/** + * Set only which side(s) the border should be drawn. Possible values are + * `LV_BORDER_SIDE_NONE/TOP/BOTTOM/LEFT/RIGHT/INTERNAL`. OR-ed values can be used as + * well, e.g. `LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_LEFT`. + * Default: `LV_BORDER_SIDE_FULL`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_border_side(lv_style_t * style, lv_border_side_t value); + +/** + * Sets whether the border should be drawn before or after the children are drawn. + * `true`: after children, `false`: before children. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_border_post(lv_style_t * style, bool value); + +/** + * Set width of outline in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_outline_width(lv_style_t * style, int32_t value); + +/** + * Set color of outline. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_outline_color(lv_style_t * style, lv_color_t value); + +/** + * Set opacity of outline. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_outline_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set padding of outline, i.e. the gap between Widget and the outline. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_outline_pad(lv_style_t * style, int32_t value); + +/** + * Set width of the shadow in pixels. The value should be >= 0. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_shadow_width(lv_style_t * style, int32_t value); + +/** + * Set an offset on the shadow in pixels in X direction. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_shadow_offset_x(lv_style_t * style, int32_t value); + +/** + * Set an offset on the shadow in pixels in Y direction. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_shadow_offset_y(lv_style_t * style, int32_t value); + +/** + * Make shadow calculation to use a larger or smaller rectangle as base. The value can + * be in pixels to make the area larger/smaller. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_shadow_spread(lv_style_t * style, int32_t value); + +/** + * Set color of shadow. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_shadow_color(lv_style_t * style, lv_color_t value); + +/** + * Set opacity of shadow. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_shadow_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set opacity of an image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_image_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set color to mix with the image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_image_recolor(lv_style_t * style, lv_color_t value); + +/** + * Set intensity of color mixing. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_image_recolor_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set image colorkey definition. The lv_image_colorkey_t contains two color values: + * `high_color` and `low_color`. the color of pixels ranging from `low_color` to + * `high_color` will be transparent. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to image color key + */ +void lv_style_set_image_colorkey(lv_style_t * style, const lv_image_colorkey_t * value); + +/** + * Set width of lines in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_line_width(lv_style_t * style, int32_t value); + +/** + * Set width of dashes in pixels. Note that dash works only on horizontal and vertical lines. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_line_dash_width(lv_style_t * style, int32_t value); + +/** + * Set gap between dashes in pixels. Note that dash works only on horizontal and + * vertical lines. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_line_dash_gap(lv_style_t * style, int32_t value); + +/** + * Make end points of the lines rounded. `true`: rounded, `false`: perpendicular line ending. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_line_rounded(lv_style_t * style, bool value); + +/** + * Set color of lines. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_line_color(lv_style_t * style, lv_color_t value); + +/** + * Set opacity of lines. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_line_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set width (thickness) of arcs in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_arc_width(lv_style_t * style, int32_t value); + +/** + * Make end points of arcs rounded. `true`: rounded, `false`: perpendicular line ending. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_arc_rounded(lv_style_t * style, bool value); + +/** + * Set color of arc. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_arc_color(lv_style_t * style, lv_color_t value); + +/** + * Set opacity of arcs. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_arc_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set an image from which arc will be masked out. It's useful to display complex + * effects on the arcs. Can be a pointer to `lv_image_dsc_t` or a path to a file. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to image source + */ +void lv_style_set_arc_image_src(lv_style_t * style, const void * value); + +/** + * Sets color of text. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_text_color(lv_style_t * style, lv_color_t value); + +/** + * Set opacity of text. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_text_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set font of text (a pointer `lv_font_t *`). + * Default: `LV_FONT_DEFAULT`, inherited: Yes, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to font + */ +void lv_style_set_text_font(lv_style_t * style, const lv_font_t * value); + +/** + * Set letter space in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_text_letter_space(lv_style_t * style, int32_t value); + +/** + * Set line space in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_text_line_space(lv_style_t * style, int32_t value); + +/** + * Set decoration for the text. Possible values are + * `LV_TEXT_DECOR_NONE/UNDERLINE/STRIKETHROUGH`. OR-ed values can be used as well. + * Default: `LV_TEXT_DECOR_NONE`, inherited: Yes, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_text_decor(lv_style_t * style, lv_text_decor_t value); + +/** + * Set how to align the lines of the text. Note that it doesn't align the Widget + * itself, only the lines inside the Widget. Possible values are + * `LV_TEXT_ALIGN_LEFT/CENTER/RIGHT/AUTO`. `LV_TEXT_ALIGN_AUTO` detect the text base + * direction and uses left or right alignment accordingly. + * Default: `LV_TEXT_ALIGN_AUTO`, inherited: Yes, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_text_align(lv_style_t * style, lv_text_align_t value); + +/** + * Sets the color of letter outline stroke. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_text_outline_stroke_color(lv_style_t * style, lv_color_t value); + +/** + * Set the letter outline stroke width in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_text_outline_stroke_width(lv_style_t * style, int32_t value); + +/** + * Set the opacity of the letter outline stroke. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means + * fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_text_outline_stroke_opa(lv_style_t * style, lv_opa_t value); + +/** + * Sets the intensity of blurring. Applied on each lv_part separately before the + * children are rendered. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_blur_radius(lv_style_t * style, int32_t value); + +/** + * If `true` the background of the widget will be blurred. The part should have < 100% + * opacity to make it visible. If `false` the given part will be blurred when it's + * rendered but before drawing the children. + * Default: `false`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_blur_backdrop(lv_style_t * style, bool value); + +/** + * Setting to `LV_BLUR_QUALITY_SPEED` the blurring algorithm will prefer speed over + * quality. `LV_BLUR_QUALITY_PRECISION` will force using higher quality but slower + * blur. With `LV_BLUR_QUALITY_AUTO` the quality will be selected automatically. + * Default: `LV_BLUR_QUALITY_AUTO`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_blur_quality(lv_style_t * style, lv_blur_quality_t value); + +/** + * Sets the intensity of blurring. Applied on each lv_part separately before the + * children are rendered. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_drop_shadow_radius(lv_style_t * style, int32_t value); + +/** + * Set an offset on the shadow in pixels in X direction. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_drop_shadow_offset_x(lv_style_t * style, int32_t value); + +/** + * Set an offset on the shadow in pixels in Y direction. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_drop_shadow_offset_y(lv_style_t * style, int32_t value); + +/** + * Set the color of the shadow. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_drop_shadow_color(lv_style_t * style, lv_color_t value); + +/** + * Set the opacity of the shadow. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_drop_shadow_opa(lv_style_t * style, lv_opa_t value); + +/** + * Setting to `LV_BLUR_QUALITY_SPEED` the blurring algorithm will prefer speed over + * quality. `LV_BLUR_QUALITY_PRECISION` will force using higher quality but slower + * blur. With `LV_BLUR_QUALITY_AUTO` the quality will be selected automatically. + * Default: `LV_BLUR_QUALITY_PRECISION`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_drop_shadow_quality(lv_style_t * style, lv_blur_quality_t value); + +/** + * Set radius on every corner. The value is interpreted in pixels (>= 0) or + * `LV_RADIUS_CIRCLE` for max radius. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_radius(lv_style_t * style, int32_t value); + +/** + * Move start point of object (e.g. scale tick) radially. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_radial_offset(lv_style_t * style, int32_t value); + +/** + * Enable clipping of content that overflows rounded corners of parent Widget. Can be + * `true` or `false`. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_clip_corner(lv_style_t * style, bool value); + +/** + * Scale down all opacity values of the Widget by this factor. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means + * fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_opa(lv_style_t * style, lv_opa_t value); + +/** + * First draw Widget on the layer, then scale down layer opacity factor. Value 0, + * `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or + * `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc + * means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_opa_layered(lv_style_t * style, lv_opa_t value); + +/** + * Mix a color with all colors of the Widget. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to color-filter descriptor + */ +void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value); + +/** + * The intensity of mixing of color filter. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value); + +/** + * Set a color to mix to the obj. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Color to submit + */ +void lv_style_set_recolor(lv_style_t * style, lv_color_t value); + +/** + * Sets the intensity of color mixing. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means + * fully transparent. A value of 255, `LV_OPA_100` or `LV_OPA_COVER` means fully + * opaque. Intermediate values like LV_OPA_10, LV_OPA_20, etc result in + * semi-transparency. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_recolor_opa(lv_style_t * style, lv_opa_t value); + +/** + * Animation template for Widget's animation. Should be a pointer to `lv_anim_t`. The + * animation parameters are widget specific, e.g. animation time could be the E.g. + * blink time of the cursor on the Text Area or scroll time of a roller. See Widgets' + * documentation to learn more. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to animation descriptor + */ +void lv_style_set_anim(lv_style_t * style, const lv_anim_t * value); + +/** + * Animation duration in milliseconds. Its meaning is widget specific. E.g. blink time + * of the cursor on the Text Area or scroll time of a roller. See Widgets' + * documentation to learn more. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_anim_duration(lv_style_t * style, uint32_t value); + +/** + * An initialized ``lv_style_transition_dsc_t`` to describe a transition. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to transition descriptor + */ +void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t * value); + +/** + * Describes how to blend the colors to the background. Possible values are + * `LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE/MULTIPLY/DIFFERENCE`. + * Default: `LV_BLEND_MODE_NORMAL`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value); + +/** + * Set layout of Widget. Children will be repositioned and resized according to + * policies set for the layout. For possible values see documentation of the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_layout(lv_style_t * style, uint16_t value); + +/** + * Set base direction of Widget. Possible values are `LV_BIDI_DIR_LTR/RTL/AUTO`. + * Default: `LV_BASE_DIR_AUTO`, inherited: Yes, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value); + +/** + * If set, a layer will be created for the widget and the layer will be masked with + * this A8 bitmap mask. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to A8 bitmap mask + */ +void lv_style_set_bitmap_mask_src(lv_style_t * style, const void * value); + +/** + * Adjust sensitivity for rotary encoders in 1/256 unit. It means, 128: slow down the + * rotary to half, 512: speeds up to double, 256: no change. + * Default: `256`, inherited: Yes, layout: No, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value); + +#if LV_USE_FLEX +/** + * Defines in which direction the flex layout should arrange the children. + * Default: `LV_FLEX_FLOW_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value); + +/** + * Defines how to align the children in the direction of flex flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value); + +/** + * Defines how to align the children perpendicular to the direction of flex flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value); + +/** + * Defines how to align the tracks of the flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value); + +/** + * Defines how much space to take proportionally from the free space of the Widget's track. + * Default: `0`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_flex_grow(lv_style_t * style, uint8_t value); + +#endif /* LV_USE_FLEX */ + +#if LV_USE_GRID +/** + * An array to describe the columns of the grid. Should be LV_GRID_TEMPLATE_LAST terminated. + * Default: `NULL`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to grid-column descriptor array + */ +void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * value); + +/** + * Defines how to distribute the columns. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value); + +/** + * An array to describe the rows of the grid. Should be LV_GRID_TEMPLATE_LAST terminated. + * Default: `NULL`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Pointer to grid-row descriptor array + */ +void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value); + +/** + * Defines how to distribute the rows. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value); + +/** + * Set column in which Widget should be placed. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value); + +/** + * Set how to align Widget horizontally. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value); + +/** + * Set how many columns Widget should span. Needs to be >= 1. + * Default: 1, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value); + +/** + * Set row in which Widget should be placed. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value); + +/** + * Set how to align Widget vertically. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value); + +/** + * Set how many rows Widget should span. Needs to be >= 1. + * Default: 1, inherited: No, layout: Yes, ext. draw: No. + * @param style Pointer to style + * @param value Value to submit + */ +void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value); + +#endif /* LV_USE_GRID */ + +/** + * Sets width of Widget. Pixel, percentage and `LV_SIZE_CONTENT` values can be used. + * Percentage values are relative to the width of the parent's content area. + * Default: Widget dependent, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_WIDTH(val) \ + { \ + .prop = LV_STYLE_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Sets a minimal width. Pixel and percentage values can be used. Percentage values + * are relative to the width of the parent's content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_MIN_WIDTH(val) \ + { \ + .prop = LV_STYLE_MIN_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Sets a maximal width. Pixel and percentage values can be used. Percentage values + * are relative to the width of the parent's content area. + * Default: LV_COORD_MAX, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_MAX_WIDTH(val) \ + { \ + .prop = LV_STYLE_MAX_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Sets height of Widget. Pixel, percentage and `LV_SIZE_CONTENT` can be used. + * Percentage values are relative to the height of the parent's content area. + * Default: Widget dependent, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_HEIGHT(val) \ + { \ + .prop = LV_STYLE_HEIGHT, .value = { .num = (int32_t)val } \ + } + +/** + * Sets a minimal height. Pixel and percentage values can be used. Percentage values + * are relative to the height of the parent's content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_MIN_HEIGHT(val) \ + { \ + .prop = LV_STYLE_MIN_HEIGHT, .value = { .num = (int32_t)val } \ + } + +/** + * Sets a maximal height. Pixel and percentage values can be used. Percentage values + * are relative to the height of the parent's content area. + * Default: LV_COORD_MAX, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_MAX_HEIGHT(val) \ + { \ + .prop = LV_STYLE_MAX_HEIGHT, .value = { .num = (int32_t)val } \ + } + +/** + * Its meaning depends on the type of Widget. For example in case of lv_scale it means + * the length of the ticks. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_LENGTH(val) \ + { \ + .prop = LV_STYLE_LENGTH, .value = { .num = (int32_t)val } \ + } + +/** + * Set X coordinate of Widget considering the ``align`` setting. Pixel and percentage + * values can be used. Percentage values are relative to the width of the parent's + * content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_X(val) \ + { \ + .prop = LV_STYLE_X, .value = { .num = (int32_t)val } \ + } + +/** + * Set Y coordinate of Widget considering the ``align`` setting. Pixel and percentage + * values can be used. Percentage values are relative to the height of the parent's + * content area. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_Y(val) \ + { \ + .prop = LV_STYLE_Y, .value = { .num = (int32_t)val } \ + } + +/** + * Set the alignment which tells from which point of the parent the X and Y + * coordinates should be interpreted. Possible values are: `LV_ALIGN_DEFAULT`, + * `LV_ALIGN_TOP_LEFT/MID/RIGHT`, `LV_ALIGN_BOTTOM_LEFT/MID/RIGHT`, + * `LV_ALIGN_LEFT/RIGHT_MID`, `LV_ALIGN_CENTER`. `LV_ALIGN_DEFAULT` means + * `LV_ALIGN_TOP_LEFT` with LTR base direction and `LV_ALIGN_TOP_RIGHT` with RTL base + * direction. + * Default: `LV_ALIGN_DEFAULT`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_ALIGN(val) \ + { \ + .prop = LV_STYLE_ALIGN, .value = { .num = (int32_t)val } \ + } + +/** + * Make Widget wider on both sides with this value. Pixel and percentage (with + * `lv_pct(x)`) values can be used. Percentage values are relative to Widget's width. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSFORM_WIDTH(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Make Widget higher on both sides with this value. Pixel and percentage (with + * `lv_pct(x)`) values can be used. Percentage values are relative to Widget's height. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSFORM_HEIGHT(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_HEIGHT, .value = { .num = (int32_t)val } \ + } + +/** + * Move Widget with this value in X direction. Applied after layouts, aligns and other + * positioning. Pixel and percentage (with `lv_pct(x)`) values can be used. Percentage + * values are relative to Widget's width. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSLATE_X(val) \ + { \ + .prop = LV_STYLE_TRANSLATE_X, .value = { .num = (int32_t)val } \ + } + +/** + * Move Widget with this value in Y direction. Applied after layouts, aligns and other + * positioning. Pixel and percentage (with `lv_pct(x)`) values can be used. Percentage + * values are relative to Widget's height. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSLATE_Y(val) \ + { \ + .prop = LV_STYLE_TRANSLATE_Y, .value = { .num = (int32_t)val } \ + } + +/** + * Move object around the centre of the parent object (e.g. around the circumference + * of a scale). + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSLATE_RADIAL(val) \ + { \ + .prop = LV_STYLE_TRANSLATE_RADIAL, .value = { .num = (int32_t)val } \ + } + +/** + * Zoom Widget horizontally. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 + * half size, 512 double size, and so on. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSFORM_SCALE_X(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_SCALE_X, .value = { .num = (int32_t)val } \ + } + +/** + * Zoom Widget vertically. The value 256 (or `LV_SCALE_NONE`) means normal size, 128 + * half size, 512 double size, and so on. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSFORM_SCALE_Y(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_SCALE_Y, .value = { .num = (int32_t)val } \ + } + +/** + * Rotate Widget. The value is interpreted in 0.1 degree units. E.g. 450 means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSFORM_ROTATION(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_ROTATION, .value = { .num = (int32_t)val } \ + } + +/** + * Set pivot point's X coordinate for transformations. Relative to Widget's top left corner. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSFORM_PIVOT_X(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_PIVOT_X, .value = { .num = (int32_t)val } \ + } + +/** + * Set pivot point's Y coordinate for transformations. Relative to Widget's top left corner. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSFORM_PIVOT_Y(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_PIVOT_Y, .value = { .num = (int32_t)val } \ + } + +/** + * Skew Widget horizontally. The value is interpreted in 0.1 degree units. E.g. 450 + * means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSFORM_SKEW_X(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_SKEW_X, .value = { .num = (int32_t)val } \ + } + +/** + * Skew Widget vertically. The value is interpreted in 0.1 degree units. E.g. 450 + * means 45 deg. + * Default: 0, inherited: No, layout: Yes, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TRANSFORM_SKEW_Y(val) \ + { \ + .prop = LV_STYLE_TRANSFORM_SKEW_Y, .value = { .num = (int32_t)val } \ + } + +/** + * Sets the padding on the top. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_PAD_TOP(val) \ + { \ + .prop = LV_STYLE_PAD_TOP, .value = { .num = (int32_t)val } \ + } + +/** + * Sets the padding on the bottom. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_PAD_BOTTOM(val) \ + { \ + .prop = LV_STYLE_PAD_BOTTOM, .value = { .num = (int32_t)val } \ + } + +/** + * Sets the padding on the left. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_PAD_LEFT(val) \ + { \ + .prop = LV_STYLE_PAD_LEFT, .value = { .num = (int32_t)val } \ + } + +/** + * Sets the padding on the right. It makes the content area smaller in this direction. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_PAD_RIGHT(val) \ + { \ + .prop = LV_STYLE_PAD_RIGHT, .value = { .num = (int32_t)val } \ + } + +/** + * Sets the padding between the rows. Used by the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_PAD_ROW(val) \ + { \ + .prop = LV_STYLE_PAD_ROW, .value = { .num = (int32_t)val } \ + } + +/** + * Sets the padding between the columns. Used by the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_PAD_COLUMN(val) \ + { \ + .prop = LV_STYLE_PAD_COLUMN, .value = { .num = (int32_t)val } \ + } + +/** + * Pad text labels away from the scale ticks/remainder of the ``LV_PART_``. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_PAD_RADIAL(val) \ + { \ + .prop = LV_STYLE_PAD_RADIAL, .value = { .num = (int32_t)val } \ + } + +/** + * Sets margin on the top. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_MARGIN_TOP(val) \ + { \ + .prop = LV_STYLE_MARGIN_TOP, .value = { .num = (int32_t)val } \ + } + +/** + * Sets margin on the bottom. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_MARGIN_BOTTOM(val) \ + { \ + .prop = LV_STYLE_MARGIN_BOTTOM, .value = { .num = (int32_t)val } \ + } + +/** + * Sets margin on the left. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_MARGIN_LEFT(val) \ + { \ + .prop = LV_STYLE_MARGIN_LEFT, .value = { .num = (int32_t)val } \ + } + +/** + * Sets margin on the right. Widget will keep this space from its siblings in layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_MARGIN_RIGHT(val) \ + { \ + .prop = LV_STYLE_MARGIN_RIGHT, .value = { .num = (int32_t)val } \ + } + +/** + * Set background color of Widget. + * Default: `0xffffff`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_BG_COLOR(val) \ + { \ + .prop = LV_STYLE_BG_COLOR, .value = { .color = val } \ + } + +/** + * Set opacity of the background. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BG_OPA(val) \ + { \ + .prop = LV_STYLE_BG_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set gradient color of the background. Used only if `grad_dir` is not `LV_GRAD_DIR_NONE`. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_BG_GRAD_COLOR(val) \ + { \ + .prop = LV_STYLE_BG_GRAD_COLOR, .value = { .color = val } \ + } + +/** + * Set direction of the gradient of the background. Possible values are + * `LV_GRAD_DIR_NONE/HOR/VER`. + * Default: `LV_GRAD_DIR_NONE`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BG_GRAD_DIR(val) \ + { \ + .prop = LV_STYLE_BG_GRAD_DIR, .value = { .num = (int32_t)val } \ + } + +/** + * Set point from which background color should start for gradients. 0 means to + * top/left side, 255 the bottom/right side, 128 the center, and so on. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BG_MAIN_STOP(val) \ + { \ + .prop = LV_STYLE_BG_MAIN_STOP, .value = { .num = (int32_t)val } \ + } + +/** + * Set point from which background's gradient color should start. 0 means to top/left + * side, 255 the bottom/right side, 128 the center, and so on. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BG_GRAD_STOP(val) \ + { \ + .prop = LV_STYLE_BG_GRAD_STOP, .value = { .num = (int32_t)val } \ + } + +/** + * Set opacity of the first gradient color. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BG_MAIN_OPA(val) \ + { \ + .prop = LV_STYLE_BG_MAIN_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set opacity of the second gradient color. + * Default: 255, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BG_GRAD_OPA(val) \ + { \ + .prop = LV_STYLE_BG_GRAD_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set gradient definition. The pointed instance must exist while Widget is alive. + * NULL to disable. It wraps `BG_GRAD_COLOR`, `BG_GRAD_DIR`, `BG_MAIN_STOP` and + * `BG_GRAD_STOP` into one descriptor and allows creating gradients with more colors + * as well. If it's set other gradient related properties will be ignored. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param val Pointer to gradient descriptor + */ +#define LV_STYLE_CONST_BG_GRAD(val) \ + { \ + .prop = LV_STYLE_BG_GRAD, .value = { .ptr = val } \ + } + +/** + * Set a background image. Can be a pointer to `lv_image_dsc_t`, a path to a file or + * an `LV_SYMBOL_...`. + * Default: `NULL`, inherited: No, layout: No, ext. draw: Yes. + * @param val Pointer to image source + */ +#define LV_STYLE_CONST_BG_IMAGE_SRC(val) \ + { \ + .prop = LV_STYLE_BG_IMAGE_SRC, .value = { .ptr = val } \ + } + +/** + * Set opacity of the background image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means + * fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other + * values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BG_IMAGE_OPA(val) \ + { \ + .prop = LV_STYLE_BG_IMAGE_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set a color to mix to the background image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_BG_IMAGE_RECOLOR(val) \ + { \ + .prop = LV_STYLE_BG_IMAGE_RECOLOR, .value = { .color = val } \ + } + +/** + * Set intensity of background image recoloring. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means no mixing, 255, `LV_OPA_100` or `LV_OPA_COVER` means full + * recoloring, other values or LV_OPA_10, LV_OPA_20, etc are interpreted + * proportionally. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BG_IMAGE_RECOLOR_OPA(val) \ + { \ + .prop = LV_STYLE_BG_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * If enabled the background image will be tiled. Possible values are `true` or `false`. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BG_IMAGE_TILED(val) \ + { \ + .prop = LV_STYLE_BG_IMAGE_TILED, .value = { .num = (int32_t)val } \ + } + +/** + * Set color of the border. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_BORDER_COLOR(val) \ + { \ + .prop = LV_STYLE_BORDER_COLOR, .value = { .color = val } \ + } + +/** + * Set opacity of the border. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BORDER_OPA(val) \ + { \ + .prop = LV_STYLE_BORDER_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set width of the border. Only pixel values can be used. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BORDER_WIDTH(val) \ + { \ + .prop = LV_STYLE_BORDER_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Set only which side(s) the border should be drawn. Possible values are + * `LV_BORDER_SIDE_NONE/TOP/BOTTOM/LEFT/RIGHT/INTERNAL`. OR-ed values can be used as + * well, e.g. `LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_LEFT`. + * Default: `LV_BORDER_SIDE_FULL`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BORDER_SIDE(val) \ + { \ + .prop = LV_STYLE_BORDER_SIDE, .value = { .num = (int32_t)val } \ + } + +/** + * Sets whether the border should be drawn before or after the children are drawn. + * `true`: after children, `false`: before children. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BORDER_POST(val) \ + { \ + .prop = LV_STYLE_BORDER_POST, .value = { .num = (int32_t)val } \ + } + +/** + * Set width of outline in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_OUTLINE_WIDTH(val) \ + { \ + .prop = LV_STYLE_OUTLINE_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Set color of outline. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_OUTLINE_COLOR(val) \ + { \ + .prop = LV_STYLE_OUTLINE_COLOR, .value = { .color = val } \ + } + +/** + * Set opacity of outline. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_OUTLINE_OPA(val) \ + { \ + .prop = LV_STYLE_OUTLINE_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set padding of outline, i.e. the gap between Widget and the outline. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_OUTLINE_PAD(val) \ + { \ + .prop = LV_STYLE_OUTLINE_PAD, .value = { .num = (int32_t)val } \ + } + +/** + * Set width of the shadow in pixels. The value should be >= 0. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_SHADOW_WIDTH(val) \ + { \ + .prop = LV_STYLE_SHADOW_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Set an offset on the shadow in pixels in X direction. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_SHADOW_OFFSET_X(val) \ + { \ + .prop = LV_STYLE_SHADOW_OFFSET_X, .value = { .num = (int32_t)val } \ + } + +/** + * Set an offset on the shadow in pixels in Y direction. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_SHADOW_OFFSET_Y(val) \ + { \ + .prop = LV_STYLE_SHADOW_OFFSET_Y, .value = { .num = (int32_t)val } \ + } + +/** + * Make shadow calculation to use a larger or smaller rectangle as base. The value can + * be in pixels to make the area larger/smaller. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_SHADOW_SPREAD(val) \ + { \ + .prop = LV_STYLE_SHADOW_SPREAD, .value = { .num = (int32_t)val } \ + } + +/** + * Set color of shadow. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_SHADOW_COLOR(val) \ + { \ + .prop = LV_STYLE_SHADOW_COLOR, .value = { .color = val } \ + } + +/** + * Set opacity of shadow. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_SHADOW_OPA(val) \ + { \ + .prop = LV_STYLE_SHADOW_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set opacity of an image. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_IMAGE_OPA(val) \ + { \ + .prop = LV_STYLE_IMAGE_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set color to mix with the image. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_IMAGE_RECOLOR(val) \ + { \ + .prop = LV_STYLE_IMAGE_RECOLOR, .value = { .color = val } \ + } + +/** + * Set intensity of color mixing. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_IMAGE_RECOLOR_OPA(val) \ + { \ + .prop = LV_STYLE_IMAGE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set image colorkey definition. The lv_image_colorkey_t contains two color values: + * `high_color` and `low_color`. the color of pixels ranging from `low_color` to + * `high_color` will be transparent. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param val Pointer to image color key + */ +#define LV_STYLE_CONST_IMAGE_COLORKEY(val) \ + { \ + .prop = LV_STYLE_IMAGE_COLORKEY, .value = { .ptr = val } \ + } + +/** + * Set width of lines in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_LINE_WIDTH(val) \ + { \ + .prop = LV_STYLE_LINE_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Set width of dashes in pixels. Note that dash works only on horizontal and vertical lines. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_LINE_DASH_WIDTH(val) \ + { \ + .prop = LV_STYLE_LINE_DASH_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Set gap between dashes in pixels. Note that dash works only on horizontal and + * vertical lines. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_LINE_DASH_GAP(val) \ + { \ + .prop = LV_STYLE_LINE_DASH_GAP, .value = { .num = (int32_t)val } \ + } + +/** + * Make end points of the lines rounded. `true`: rounded, `false`: perpendicular line ending. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_LINE_ROUNDED(val) \ + { \ + .prop = LV_STYLE_LINE_ROUNDED, .value = { .num = (int32_t)val } \ + } + +/** + * Set color of lines. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_LINE_COLOR(val) \ + { \ + .prop = LV_STYLE_LINE_COLOR, .value = { .color = val } \ + } + +/** + * Set opacity of lines. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_LINE_OPA(val) \ + { \ + .prop = LV_STYLE_LINE_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set width (thickness) of arcs in pixels. + * Default: 0, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_ARC_WIDTH(val) \ + { \ + .prop = LV_STYLE_ARC_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Make end points of arcs rounded. `true`: rounded, `false`: perpendicular line ending. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_ARC_ROUNDED(val) \ + { \ + .prop = LV_STYLE_ARC_ROUNDED, .value = { .num = (int32_t)val } \ + } + +/** + * Set color of arc. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_ARC_COLOR(val) \ + { \ + .prop = LV_STYLE_ARC_COLOR, .value = { .color = val } \ + } + +/** + * Set opacity of arcs. + * Default: `LV_OPA_COVER`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_ARC_OPA(val) \ + { \ + .prop = LV_STYLE_ARC_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set an image from which arc will be masked out. It's useful to display complex + * effects on the arcs. Can be a pointer to `lv_image_dsc_t` or a path to a file. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param val Pointer to image source + */ +#define LV_STYLE_CONST_ARC_IMAGE_SRC(val) \ + { \ + .prop = LV_STYLE_ARC_IMAGE_SRC, .value = { .ptr = val } \ + } + +/** + * Sets color of text. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_TEXT_COLOR(val) \ + { \ + .prop = LV_STYLE_TEXT_COLOR, .value = { .color = val } \ + } + +/** + * Set opacity of text. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means fully + * transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means fully covering, other values + * or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TEXT_OPA(val) \ + { \ + .prop = LV_STYLE_TEXT_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set font of text (a pointer `lv_font_t *`). + * Default: `LV_FONT_DEFAULT`, inherited: Yes, layout: Yes, ext. draw: No. + * @param val Pointer to font + */ +#define LV_STYLE_CONST_TEXT_FONT(val) \ + { \ + .prop = LV_STYLE_TEXT_FONT, .value = { .ptr = val } \ + } + +/** + * Set letter space in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TEXT_LETTER_SPACE(val) \ + { \ + .prop = LV_STYLE_TEXT_LETTER_SPACE, .value = { .num = (int32_t)val } \ + } + +/** + * Set line space in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TEXT_LINE_SPACE(val) \ + { \ + .prop = LV_STYLE_TEXT_LINE_SPACE, .value = { .num = (int32_t)val } \ + } + +/** + * Set decoration for the text. Possible values are + * `LV_TEXT_DECOR_NONE/UNDERLINE/STRIKETHROUGH`. OR-ed values can be used as well. + * Default: `LV_TEXT_DECOR_NONE`, inherited: Yes, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TEXT_DECOR(val) \ + { \ + .prop = LV_STYLE_TEXT_DECOR, .value = { .num = (int32_t)val } \ + } + +/** + * Set how to align the lines of the text. Note that it doesn't align the Widget + * itself, only the lines inside the Widget. Possible values are + * `LV_TEXT_ALIGN_LEFT/CENTER/RIGHT/AUTO`. `LV_TEXT_ALIGN_AUTO` detect the text base + * direction and uses left or right alignment accordingly. + * Default: `LV_TEXT_ALIGN_AUTO`, inherited: Yes, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TEXT_ALIGN(val) \ + { \ + .prop = LV_STYLE_TEXT_ALIGN, .value = { .num = (int32_t)val } \ + } + +/** + * Sets the color of letter outline stroke. + * Default: `0x000000`, inherited: Yes, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_TEXT_OUTLINE_STROKE_COLOR(val) \ + { \ + .prop = LV_STYLE_TEXT_OUTLINE_STROKE_COLOR, .value = { .color = val } \ + } + +/** + * Set the letter outline stroke width in pixels. + * Default: 0, inherited: Yes, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TEXT_OUTLINE_STROKE_WIDTH(val) \ + { \ + .prop = LV_STYLE_TEXT_OUTLINE_STROKE_WIDTH, .value = { .num = (int32_t)val } \ + } + +/** + * Set the opacity of the letter outline stroke. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means + * fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_TEXT_OUTLINE_STROKE_OPA(val) \ + { \ + .prop = LV_STYLE_TEXT_OUTLINE_STROKE_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Sets the intensity of blurring. Applied on each lv_part separately before the + * children are rendered. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BLUR_RADIUS(val) \ + { \ + .prop = LV_STYLE_BLUR_RADIUS, .value = { .num = (int32_t)val } \ + } + +/** + * If `true` the background of the widget will be blurred. The part should have < 100% + * opacity to make it visible. If `false` the given part will be blurred when it's + * rendered but before drawing the children. + * Default: `false`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BLUR_BACKDROP(val) \ + { \ + .prop = LV_STYLE_BLUR_BACKDROP, .value = { .num = (int32_t)val } \ + } + +/** + * Setting to `LV_BLUR_QUALITY_SPEED` the blurring algorithm will prefer speed over + * quality. `LV_BLUR_QUALITY_PRECISION` will force using higher quality but slower + * blur. With `LV_BLUR_QUALITY_AUTO` the quality will be selected automatically. + * Default: `LV_BLUR_QUALITY_AUTO`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BLUR_QUALITY(val) \ + { \ + .prop = LV_STYLE_BLUR_QUALITY, .value = { .num = (int32_t)val } \ + } + +/** + * Sets the intensity of blurring. Applied on each lv_part separately before the + * children are rendered. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_DROP_SHADOW_RADIUS(val) \ + { \ + .prop = LV_STYLE_DROP_SHADOW_RADIUS, .value = { .num = (int32_t)val } \ + } + +/** + * Set an offset on the shadow in pixels in X direction. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_DROP_SHADOW_OFFSET_X(val) \ + { \ + .prop = LV_STYLE_DROP_SHADOW_OFFSET_X, .value = { .num = (int32_t)val } \ + } + +/** + * Set an offset on the shadow in pixels in Y direction. + * Default: `0`, inherited: No, layout: No, ext. draw: Yes. + * @param val Value to submit + */ +#define LV_STYLE_CONST_DROP_SHADOW_OFFSET_Y(val) \ + { \ + .prop = LV_STYLE_DROP_SHADOW_OFFSET_Y, .value = { .num = (int32_t)val } \ + } + +/** + * Set the color of the shadow. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_DROP_SHADOW_COLOR(val) \ + { \ + .prop = LV_STYLE_DROP_SHADOW_COLOR, .value = { .color = val } \ + } + +/** + * Set the opacity of the shadow. + * Default: `0`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_DROP_SHADOW_OPA(val) \ + { \ + .prop = LV_STYLE_DROP_SHADOW_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Setting to `LV_BLUR_QUALITY_SPEED` the blurring algorithm will prefer speed over + * quality. `LV_BLUR_QUALITY_PRECISION` will force using higher quality but slower + * blur. With `LV_BLUR_QUALITY_AUTO` the quality will be selected automatically. + * Default: `LV_BLUR_QUALITY_PRECISION`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_DROP_SHADOW_QUALITY(val) \ + { \ + .prop = LV_STYLE_DROP_SHADOW_QUALITY, .value = { .num = (int32_t)val } \ + } + +/** + * Set radius on every corner. The value is interpreted in pixels (>= 0) or + * `LV_RADIUS_CIRCLE` for max radius. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_RADIUS(val) \ + { \ + .prop = LV_STYLE_RADIUS, .value = { .num = (int32_t)val } \ + } + +/** + * Move start point of object (e.g. scale tick) radially. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_RADIAL_OFFSET(val) \ + { \ + .prop = LV_STYLE_RADIAL_OFFSET, .value = { .num = (int32_t)val } \ + } + +/** + * Enable clipping of content that overflows rounded corners of parent Widget. Can be + * `true` or `false`. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_CLIP_CORNER(val) \ + { \ + .prop = LV_STYLE_CLIP_CORNER, .value = { .num = (int32_t)val } \ + } + +/** + * Scale down all opacity values of the Widget by this factor. Value 0, `LV_OPA_0` or + * `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or `LV_OPA_COVER` means + * fully covering, other values or LV_OPA_10, LV_OPA_20, etc means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_OPA(val) \ + { \ + .prop = LV_STYLE_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * First draw Widget on the layer, then scale down layer opacity factor. Value 0, + * `LV_OPA_0` or `LV_OPA_TRANSP` means fully transparent, 255, `LV_OPA_100` or + * `LV_OPA_COVER` means fully covering, other values or LV_OPA_10, LV_OPA_20, etc + * means semi transparency. + * Default: `LV_OPA_COVER`, inherited: Yes, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_OPA_LAYERED(val) \ + { \ + .prop = LV_STYLE_OPA_LAYERED, .value = { .num = (int32_t)val } \ + } + +/** + * Mix a color with all colors of the Widget. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param val Pointer to color-filter descriptor + */ +#define LV_STYLE_CONST_COLOR_FILTER_DSC(val) \ + { \ + .prop = LV_STYLE_COLOR_FILTER_DSC, .value = { .ptr = val } \ + } + +/** + * The intensity of mixing of color filter. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_COLOR_FILTER_OPA(val) \ + { \ + .prop = LV_STYLE_COLOR_FILTER_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Set a color to mix to the obj. + * Default: `0x000000`, inherited: No, layout: No, ext. draw: No. + * @param val Color to submit + */ +#define LV_STYLE_CONST_RECOLOR(val) \ + { \ + .prop = LV_STYLE_RECOLOR, .value = { .color = val } \ + } + +/** + * Sets the intensity of color mixing. Value 0, `LV_OPA_0` or `LV_OPA_TRANSP` means + * fully transparent. A value of 255, `LV_OPA_100` or `LV_OPA_COVER` means fully + * opaque. Intermediate values like LV_OPA_10, LV_OPA_20, etc result in + * semi-transparency. + * Default: `LV_OPA_TRANSP`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_RECOLOR_OPA(val) \ + { \ + .prop = LV_STYLE_RECOLOR_OPA, .value = { .num = (int32_t)val } \ + } + +/** + * Animation template for Widget's animation. Should be a pointer to `lv_anim_t`. The + * animation parameters are widget specific, e.g. animation time could be the E.g. + * blink time of the cursor on the Text Area or scroll time of a roller. See Widgets' + * documentation to learn more. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param val Pointer to animation descriptor + */ +#define LV_STYLE_CONST_ANIM(val) \ + { \ + .prop = LV_STYLE_ANIM, .value = { .ptr = val } \ + } + +/** + * Animation duration in milliseconds. Its meaning is widget specific. E.g. blink time + * of the cursor on the Text Area or scroll time of a roller. See Widgets' + * documentation to learn more. + * Default: 0, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_ANIM_DURATION(val) \ + { \ + .prop = LV_STYLE_ANIM_DURATION, .value = { .num = (int32_t)val } \ + } + +/** + * An initialized ``lv_style_transition_dsc_t`` to describe a transition. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param val Pointer to transition descriptor + */ +#define LV_STYLE_CONST_TRANSITION(val) \ + { \ + .prop = LV_STYLE_TRANSITION, .value = { .ptr = val } \ + } + +/** + * Describes how to blend the colors to the background. Possible values are + * `LV_BLEND_MODE_NORMAL/ADDITIVE/SUBTRACTIVE/MULTIPLY/DIFFERENCE`. + * Default: `LV_BLEND_MODE_NORMAL`, inherited: No, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BLEND_MODE(val) \ + { \ + .prop = LV_STYLE_BLEND_MODE, .value = { .num = (int32_t)val } \ + } + +/** + * Set layout of Widget. Children will be repositioned and resized according to + * policies set for the layout. For possible values see documentation of the layouts. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_LAYOUT(val) \ + { \ + .prop = LV_STYLE_LAYOUT, .value = { .num = (int32_t)val } \ + } + +/** + * Set base direction of Widget. Possible values are `LV_BIDI_DIR_LTR/RTL/AUTO`. + * Default: `LV_BASE_DIR_AUTO`, inherited: Yes, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_BASE_DIR(val) \ + { \ + .prop = LV_STYLE_BASE_DIR, .value = { .num = (int32_t)val } \ + } + +/** + * If set, a layer will be created for the widget and the layer will be masked with + * this A8 bitmap mask. + * Default: `NULL`, inherited: No, layout: No, ext. draw: No. + * @param val Pointer to A8 bitmap mask + */ +#define LV_STYLE_CONST_BITMAP_MASK_SRC(val) \ + { \ + .prop = LV_STYLE_BITMAP_MASK_SRC, .value = { .ptr = val } \ + } + +/** + * Adjust sensitivity for rotary encoders in 1/256 unit. It means, 128: slow down the + * rotary to half, 512: speeds up to double, 256: no change. + * Default: `256`, inherited: Yes, layout: No, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_ROTARY_SENSITIVITY(val) \ + { \ + .prop = LV_STYLE_ROTARY_SENSITIVITY, .value = { .num = (int32_t)val } \ + } + +#if LV_USE_FLEX +/** + * Defines in which direction the flex layout should arrange the children. + * Default: `LV_FLEX_FLOW_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_FLEX_FLOW(val) \ + { \ + .prop = LV_STYLE_FLEX_FLOW, .value = { .num = (int32_t)val } \ + } + +/** + * Defines how to align the children in the direction of flex flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_FLEX_MAIN_PLACE(val) \ + { \ + .prop = LV_STYLE_FLEX_MAIN_PLACE, .value = { .num = (int32_t)val } \ + } + +/** + * Defines how to align the children perpendicular to the direction of flex flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_FLEX_CROSS_PLACE(val) \ + { \ + .prop = LV_STYLE_FLEX_CROSS_PLACE, .value = { .num = (int32_t)val } \ + } + +/** + * Defines how to align the tracks of the flow. + * Default: `LV_FLEX_ALIGN_NONE`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_FLEX_TRACK_PLACE(val) \ + { \ + .prop = LV_STYLE_FLEX_TRACK_PLACE, .value = { .num = (int32_t)val } \ + } + +/** + * Defines how much space to take proportionally from the free space of the Widget's track. + * Default: `0`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_FLEX_GROW(val) \ + { \ + .prop = LV_STYLE_FLEX_GROW, .value = { .num = (int32_t)val } \ + } + +#endif /* LV_USE_FLEX */ + +#if LV_USE_GRID +/** + * An array to describe the columns of the grid. Should be LV_GRID_TEMPLATE_LAST terminated. + * Default: `NULL`, inherited: No, layout: Yes, ext. draw: No. + * @param val Pointer to grid-column descriptor array + */ +#define LV_STYLE_CONST_GRID_COLUMN_DSC_ARRAY(val) \ + { \ + .prop = LV_STYLE_GRID_COLUMN_DSC_ARRAY, .value = { .ptr = val } \ + } + +/** + * Defines how to distribute the columns. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_GRID_COLUMN_ALIGN(val) \ + { \ + .prop = LV_STYLE_GRID_COLUMN_ALIGN, .value = { .num = (int32_t)val } \ + } + +/** + * An array to describe the rows of the grid. Should be LV_GRID_TEMPLATE_LAST terminated. + * Default: `NULL`, inherited: No, layout: Yes, ext. draw: No. + * @param val Pointer to grid-row descriptor array + */ +#define LV_STYLE_CONST_GRID_ROW_DSC_ARRAY(val) \ + { \ + .prop = LV_STYLE_GRID_ROW_DSC_ARRAY, .value = { .ptr = val } \ + } + +/** + * Defines how to distribute the rows. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_GRID_ROW_ALIGN(val) \ + { \ + .prop = LV_STYLE_GRID_ROW_ALIGN, .value = { .num = (int32_t)val } \ + } + +/** + * Set column in which Widget should be placed. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_GRID_CELL_COLUMN_POS(val) \ + { \ + .prop = LV_STYLE_GRID_CELL_COLUMN_POS, .value = { .num = (int32_t)val } \ + } + +/** + * Set how to align Widget horizontally. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_GRID_CELL_X_ALIGN(val) \ + { \ + .prop = LV_STYLE_GRID_CELL_X_ALIGN, .value = { .num = (int32_t)val } \ + } + +/** + * Set how many columns Widget should span. Needs to be >= 1. + * Default: 1, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_GRID_CELL_COLUMN_SPAN(val) \ + { \ + .prop = LV_STYLE_GRID_CELL_COLUMN_SPAN, .value = { .num = (int32_t)val } \ + } + +/** + * Set row in which Widget should be placed. + * Default: 0, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_GRID_CELL_ROW_POS(val) \ + { \ + .prop = LV_STYLE_GRID_CELL_ROW_POS, .value = { .num = (int32_t)val } \ + } + +/** + * Set how to align Widget vertically. + * Default: `LV_GRID_ALIGN_START`, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_GRID_CELL_Y_ALIGN(val) \ + { \ + .prop = LV_STYLE_GRID_CELL_Y_ALIGN, .value = { .num = (int32_t)val } \ + } + +/** + * Set how many rows Widget should span. Needs to be >= 1. + * Default: 1, inherited: No, layout: Yes, ext. draw: No. + * @param val Value to submit + */ +#define LV_STYLE_CONST_GRID_CELL_ROW_SPAN(val) \ + { \ + .prop = LV_STYLE_GRID_CELL_ROW_SPAN, .value = { .num = (int32_t)val } \ + } + +#endif /* LV_USE_GRID */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV_STYLE_GEN_H */ diff --git a/inc/lvgl/src/misc/lv_style_private.h b/inc/lvgl/src/misc/lv_style_private.h new file mode 100644 index 0000000..8a88185 --- /dev/null +++ b/inc/lvgl/src/misc/lv_style_private.h @@ -0,0 +1,39 @@ +/** + * @file lv_style_private.h + * + */ + +#ifndef LV_STYLE_PRIVATE_H +#define LV_STYLE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_style.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_STYLE_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_templ.c b/inc/lvgl/src/misc/lv_templ.c new file mode 100644 index 0000000..939930c --- /dev/null +++ b/inc/lvgl/src/misc/lv_templ.c @@ -0,0 +1,40 @@ +/** + * @file lv_templ.c + * + */ + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*This typedef exists purely to keep -Wpedantic happy when the file is empty.*/ +/*It can be removed.*/ +typedef int _keep_pedantic_happy; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/misc/lv_templ.h b/inc/lvgl/src/misc/lv_templ.h new file mode 100644 index 0000000..f7e3c26 --- /dev/null +++ b/inc/lvgl/src/misc/lv_templ.h @@ -0,0 +1,37 @@ +/** + * @file lv_templ.h + * + */ + +#ifndef LV_TEMPL_H +#define LV_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEMPL_H*/ diff --git a/inc/lvgl/src/misc/lv_text.c b/inc/lvgl/src/misc/lv_text.c new file mode 100644 index 0000000..b0de257 --- /dev/null +++ b/inc/lvgl/src/misc/lv_text.c @@ -0,0 +1,926 @@ +/** + * @file lv_text.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_text_private.h" +#include "lv_text_ap.h" +#include "lv_math.h" +#include "lv_log.h" +#include "lv_assert.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ +#define NO_BREAK_FOUND UINT32_MAX + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_TXT_ENC == LV_TXT_ENC_UTF8 + static uint8_t lv_text_utf8_size(const char * str); + static uint32_t lv_text_unicode_to_utf8(uint32_t letter_uni); + static uint32_t lv_text_utf8_conv_wc(uint32_t c); + static uint32_t lv_text_utf8_next(const char * txt, uint32_t * i); + static uint32_t lv_text_utf8_prev(const char * txt, uint32_t * i_start); + static uint32_t lv_text_utf8_get_byte_id(const char * txt, uint32_t utf8_id); + static uint32_t lv_text_utf8_get_char_id(const char * txt, uint32_t byte_id); + static uint32_t lv_text_utf8_get_length(const char * txt); +#elif LV_TXT_ENC == LV_TXT_ENC_ASCII + static uint8_t lv_text_iso8859_1_size(const char * str); + static uint32_t lv_text_unicode_to_iso8859_1(uint32_t letter_uni); + static uint32_t lv_text_iso8859_1_conv_wc(uint32_t c); + static uint32_t lv_text_iso8859_1_next(const char * txt, uint32_t * i); + static uint32_t lv_text_iso8859_1_prev(const char * txt, uint32_t * i_start); + static uint32_t lv_text_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id); + static uint32_t lv_text_iso8859_1_get_char_id(const char * txt, uint32_t byte_id); + static uint32_t lv_text_iso8859_1_get_length(const char * txt); +#endif +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ +#if LV_TXT_ENC == LV_TXT_ENC_UTF8 + uint8_t (*const lv_text_encoded_size)(const char *) = lv_text_utf8_size; + uint32_t (*const lv_text_unicode_to_encoded)(uint32_t) = lv_text_unicode_to_utf8; + uint32_t (*const lv_text_encoded_conv_wc)(uint32_t) = lv_text_utf8_conv_wc; + uint32_t (*const lv_text_encoded_next)(const char *, uint32_t *) = lv_text_utf8_next; + uint32_t (*const lv_text_encoded_prev)(const char *, uint32_t *) = lv_text_utf8_prev; + uint32_t (*const lv_text_encoded_get_byte_id)(const char *, uint32_t) = lv_text_utf8_get_byte_id; + uint32_t (*const lv_text_encoded_get_char_id)(const char *, uint32_t) = lv_text_utf8_get_char_id; + uint32_t (*const lv_text_get_encoded_length)(const char *) = lv_text_utf8_get_length; +#elif LV_TXT_ENC == LV_TXT_ENC_ASCII + uint8_t (*const lv_text_encoded_size)(const char *) = lv_text_iso8859_1_size; + uint32_t (*const lv_text_unicode_to_encoded)(uint32_t) = lv_text_unicode_to_iso8859_1; + uint32_t (*const lv_text_encoded_conv_wc)(uint32_t) = lv_text_iso8859_1_conv_wc; + uint32_t (*const lv_text_encoded_next)(const char *, uint32_t *) = lv_text_iso8859_1_next; + uint32_t (*const lv_text_encoded_prev)(const char *, uint32_t *) = lv_text_iso8859_1_prev; + uint32_t (*const lv_text_encoded_get_byte_id)(const char *, uint32_t) = lv_text_iso8859_1_get_byte_id; + uint32_t (*const lv_text_encoded_get_char_id)(const char *, uint32_t) = lv_text_iso8859_1_get_char_id; + uint32_t (*const lv_text_get_encoded_length)(const char *) = lv_text_iso8859_1_get_length; + +#endif + +/********************** + * MACROS + **********************/ + +#define LV_IS_ASCII(value) ((value & 0x80U) == 0x00U) +#define LV_IS_2BYTES_UTF8_CODE(value) ((value & 0xE0U) == 0xC0U) +#define LV_IS_3BYTES_UTF8_CODE(value) ((value & 0xF0U) == 0xE0U) +#define LV_IS_4BYTES_UTF8_CODE(value) ((value & 0xF8U) == 0xF0U) +#define LV_IS_INVALID_UTF8_CODE(value) ((value & 0xC0U) != 0x80U) + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_text_attributes_init(lv_text_attributes_t * attributes) +{ + lv_memzero(attributes, sizeof(lv_text_attributes_t)); +} + +void lv_text_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, int32_t letter_space, + int32_t line_space, int32_t max_width, lv_text_flag_t flag) +{ + lv_text_attributes_t attrs; + lv_text_attributes_init(&attrs); + attrs.line_space = line_space; + attrs.max_width = max_width; + attrs.text_flags = flag; + attrs.letter_space = letter_space; + lv_text_get_size_attributes(size_res, text, font, &attrs); +} + +void lv_text_get_size_attributes(lv_point_t * size_res, const char * text, const lv_font_t * font, + lv_text_attributes_t * attributes) +{ + uint32_t line_start = 0; + uint32_t new_line_start = 0; + uint16_t letter_height = 0; + size_res->x = 0; + size_res->y = 0; + + LV_ASSERT_NULL(attributes); + LV_ASSERT_NULL(font); + LV_ASSERT_NULL(text); + + letter_height = lv_font_get_line_height(font); + + if(attributes->text_flags & LV_TEXT_FLAG_EXPAND) { + attributes->max_width = LV_COORD_MAX; + } + + /*Calc. the height and longest line*/ + while(text[line_start] != '\0') { + new_line_start += lv_text_get_next_line( + &text[line_start], LV_TEXT_LEN_MAX, font, NULL, attributes); + + if((unsigned long)size_res->y + + (unsigned long)letter_height + (unsigned long)attributes->line_space > LV_MAX_OF(int32_t)) { + LV_LOG_WARN("integer overflow while calculating text height"); + return; + } + else { + size_res->y += letter_height; + size_res->y += attributes->line_space; + } + + /*Calculate the longest line*/ + int32_t act_line_length = lv_text_get_width( + &text[line_start], new_line_start - line_start, font, attributes); + + size_res->x = LV_MAX(act_line_length, size_res->x); + line_start = new_line_start; + } + + /*Make the text one line taller if the last character is '\n' or '\r'*/ + if((line_start != 0) && (text[line_start - 1] == '\n' || text[line_start - 1] == '\r')) { + size_res->y += letter_height + attributes->line_space; + } + + /*Correction with the last line space or set the height manually if the text is empty*/ + if(size_res->y == 0) + size_res->y = letter_height; + else + size_res->y -= attributes->line_space; +} + +bool lv_text_is_cmd(lv_text_cmd_state_t * state, uint32_t c) +{ + bool ret = false; + + if(c == (uint32_t)LV_TXT_COLOR_CMD[0]) { + if(*state == LV_TEXT_CMD_STATE_WAIT) { /*Start char*/ + *state = LV_TEXT_CMD_STATE_PAR; + ret = true; + } + /*Other start char in parameter is escaped cmd. char*/ + else if(*state == LV_TEXT_CMD_STATE_WAIT) { + *state = LV_TEXT_CMD_STATE_WAIT; + } + /*Command end*/ + else if(*state == LV_TEXT_CMD_STATE_IN) { + *state = LV_TEXT_CMD_STATE_WAIT; + ret = true; + } + } + + /*Skip the color parameter and wait the space after it*/ + if(*state == LV_TEXT_CMD_STATE_PAR) { + if(c == ' ') { + *state = LV_TEXT_CMD_STATE_IN; /*After the parameter the text is in the command*/ + } + ret = true; + } + + return ret; +} + +/** + * Get the next word of text. A word is delimited by break characters. + * + * If the word cannot fit in the max_width space, obey LV_TXT_LINE_BREAK_LONG_* rules. + * + * If the next word cannot fit anything, return 0. + * + * If the first character is a break character, returns the next index. + * + * Example calls from lv_text_get_next_line() assuming sufficient max_width and + * txt = "Test text\n" + * 0123456789 + * + * Calls would be as follows: + * 1. Return i=4, pointing at breakchar ' ', for the string "Test" + * 2. Return i=5, since i=4 was a breakchar. + * 3. Return i=9, pointing at breakchar '\n' + * 4. Parenting lv_text_get_next_line() would detect subsequent '\0' + * + * TODO: Returned word_w_ptr may overestimate the returned word's width when + * max_width is reached. In current usage, this has no impact. + * + * @param txt a '\0' terminated string + * @param font pointer to a font + * @param letter_space letter space + * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid line breaks + * @param flags settings for the text from 'txt_flag_type' enum + * @param[out] word_w_ptr width (in pixels) of the parsed word. May be NULL. + * @param cmd_state Pointer to a lv_text_cmd_state_t variable which stored the current state of command processing + * @return the index of the first char of the next word (in byte index not letter index. With UTF-8 they are different) + */ +static uint32_t lv_text_get_next_word(const char * txt, const lv_font_t * font, + int32_t letter_space, int32_t max_width, + lv_text_flag_t flag, uint32_t * word_w_ptr, + lv_text_cmd_state_t * cmd_state) +{ + if(txt == NULL || txt[0] == '\0') return 0; + if(font == NULL) return 0; + + if(flag & LV_TEXT_FLAG_EXPAND) max_width = LV_COORD_MAX; + + uint32_t i = 0, i_next = 0, i_next_next = 0; /*Iterating index into txt*/ + uint32_t letter = 0; /*Letter at i*/ + uint32_t letter_next = 0; /*Letter at i_next*/ + int32_t letter_w; + int32_t cur_w = 0; /*Pixel Width of traversed string*/ + uint32_t word_len = 0; /*Number of characters in the traversed word*/ + uint32_t break_index = NO_BREAK_FOUND; /*only used for "long" words*/ + uint32_t break_letter_count = 0; /*Number of characters up to the long word break point*/ + + letter = lv_text_encoded_next(txt, &i_next); + i_next_next = i_next; + + /*Obtain the full word, regardless if it fits or not in max_width*/ + while(txt[i] != '\0') { + letter_next = lv_text_encoded_next(txt, &i_next_next); + word_len++; + + /*Handle the recolor command*/ + if((flag & LV_TEXT_FLAG_RECOLOR) != 0) { + if(lv_text_is_cmd(cmd_state, letter)) { + i = i_next; + i_next = i_next_next; + letter = letter_next; + continue; /*Skip the letter if it is part of a command*/ + } + } + + letter_w = lv_font_get_glyph_width(font, letter, letter_next); + cur_w += letter_w; + + if(letter_w > 0) { + cur_w += letter_space; + } + + /*Test if this character fits within max_width*/ + if(break_index == NO_BREAK_FOUND && (cur_w - letter_space) > max_width) { + break_index = i; + break_letter_count = word_len - 1; + if(flag & LV_TEXT_FLAG_BREAK_ALL) { + break; + } + /*break_index is now pointing at the character that doesn't fit*/ + } + + /*Check for new line chars and breakchars*/ + if(letter == '\n' || letter == '\r' || lv_text_is_break_char(letter)) { + /*Update the output width on the first character if it fits. + *Must do this here in case first letter is a break character.*/ + if(i == 0 && break_index == NO_BREAK_FOUND && word_w_ptr != NULL) *word_w_ptr = cur_w; + word_len--; + break; + } + else if(lv_text_is_a_word(letter_next) || lv_text_is_a_word(letter)) { + /*Found a word for single letter, usually true for CJK*/ + *word_w_ptr = cur_w; + i = i_next; + break; + } + + /*Update the output width*/ + if(word_w_ptr != NULL && break_index == NO_BREAK_FOUND) *word_w_ptr = cur_w; + + i = i_next; + i_next = i_next_next; + letter = letter_next; + } + + /*Entire Word fits in the provided space*/ + if(break_index == NO_BREAK_FOUND) { + if(word_len == 0 || (letter == '\r' && letter_next == '\n')) i = i_next; + return i; + } + +#if LV_TXT_LINE_BREAK_LONG_LEN > 0 + /*Word doesn't fit in provided space, but isn't "long"*/ + if(word_len < LV_TXT_LINE_BREAK_LONG_LEN) { + if(flag & LV_TEXT_FLAG_BREAK_ALL) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; /*Return no word*/ + return 0; + } + + /*Word is "long," but insufficient amounts can fit in provided space*/ + if(break_letter_count < LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN) { + if(flag & LV_TEXT_FLAG_BREAK_ALL) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; + return 0; + } + + /*Word is a "long", but letters may need to be better distributed*/ + { + i = break_index; + int32_t n_move = LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN - (word_len - break_letter_count); + /*Move pointer "i" backwards*/ + for(; n_move > 0; n_move--) { + lv_text_encoded_prev(txt, &i); + /** + * TODO: it would be appropriate to update the returned + * word width hereHowever, in current usage, this doesn't impact anything. + */ + } + } + return i; +#else + if(flag & LV_TEXT_FLAG_BREAK_ALL) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; /*Return no word*/ + (void) break_letter_count; + return 0; +#endif +} + +uint32_t lv_text_get_next_line(const char * txt, uint32_t len, + const lv_font_t * font, int32_t * used_width, lv_text_attributes_t * attributes) +{ + + if(used_width) *used_width = 0; + + if(txt == NULL) return 0; + if(txt[0] == '\0') return 0; + if(font == NULL) return 0; + + int32_t line_w = 0; + + /*If max_width doesn't matter simply find the new line character + *without thinking about word wrapping*/ + if((attributes->text_flags & LV_TEXT_FLAG_EXPAND) || + (attributes->text_flags & LV_TEXT_FLAG_FIT)) { + + uint32_t i; + for(i = 0; i < len && txt[i] != '\n' && txt[i] != '\r' && txt[i] != '\0'; i++) { + /*Just find the new line chars or string ends by incrementing `i`*/ + } + if(i < len && txt[i] != '\0') i++; /*To go beyond `\n`*/ + if(used_width) *used_width = -1; + return i; + } + + if(attributes->text_flags & LV_TEXT_FLAG_EXPAND) { + attributes->max_width = LV_COORD_MAX; + } + lv_text_cmd_state_t cmd_state = LV_TEXT_CMD_STATE_WAIT; + + uint32_t i = 0; /*Iterating index into txt*/ + uint32_t max_width = attributes->max_width; + bool explicit_new_line = false; + + while(i < len && txt[i] != '\0' && max_width > 0) { + lv_text_flag_t word_flag = attributes->text_flags; + + if(i == 0) word_flag |= LV_TEXT_FLAG_BREAK_ALL; + + uint32_t word_w = 0; + uint32_t advance = lv_text_get_next_word(&txt[i], font, attributes->letter_space, + max_width, word_flag, &word_w, &cmd_state); + max_width -= word_w; + line_w += word_w; + + if(advance == 0) { + break; + } + + i += advance; + + if(txt[0] == '\n' || txt[0] == '\r') { + explicit_new_line = true; + break; + } + + if(txt[i] == '\n' || txt[i] == '\r') { + i++; /*Include the following newline in the current line*/ + explicit_new_line = true; + break; + } + } + + /*Always step at least one to avoid infinite loops*/ + if(i == 0) { + uint32_t letter = lv_text_encoded_next(txt, &i); + if(used_width != NULL) { + line_w = lv_font_get_glyph_width(font, letter, '\0'); + } + } + + if(used_width != NULL) { + *used_width = line_w; + } + + /*Skip leading spaces of the next line only for automatic word wrapping*/ + if(!explicit_new_line) { + while(i < len && txt[i] == ' ') { + i++; + } + } + + return i; +} + +int32_t lv_text_get_width(const char * txt, uint32_t length, const lv_font_t * font, + const lv_text_attributes_t * attributes) +{ + if(txt == NULL) return 0; + if(font == NULL) return 0; + if(txt[0] == '\0') return 0; + + uint32_t i = 0; + int32_t width = 0; + lv_text_cmd_state_t cmd_state = LV_TEXT_CMD_STATE_WAIT; + + if(length != 0) { + while(txt[i] != '\0' && i < length) { + + uint32_t letter; + uint32_t letter_next; + + lv_text_encoded_letter_next_2(txt, &letter, &letter_next, &i); + + if((attributes->text_flags & LV_TEXT_FLAG_RECOLOR) != 0) { + if(lv_text_is_cmd(&cmd_state, letter) != false) { + continue; + } + } + + int32_t char_width = lv_font_get_glyph_width(font, letter, letter_next); + if(char_width > 0) { + width += char_width; + width += attributes->letter_space; + } + } + + if(width > 0) { + width -= attributes->letter_space; /*Trim the last letter space. Important if the text is center + aligned*/ + } + } + + return width; +} + +void lv_text_ins(char * txt_buf, uint32_t pos, const char * ins_txt) +{ + if(txt_buf == NULL || ins_txt == NULL) return; + + size_t old_len = lv_strlen(txt_buf); + size_t ins_len = lv_strlen(ins_txt); + if(ins_len == 0) return; + + size_t new_len = ins_len + old_len; + pos = lv_text_encoded_get_byte_id(txt_buf, pos); /*Convert to byte index instead of letter index*/ + + /*Copy the second part into the end to make place to text to insert*/ + size_t i; + for(i = new_len; i >= pos + ins_len; i--) { + txt_buf[i] = txt_buf[i - ins_len]; + } + + /*Copy the text into the new space*/ + lv_memcpy(txt_buf + pos, ins_txt, ins_len); +} + +void lv_text_cut(char * txt, uint32_t pos, uint32_t len) +{ + if(txt == NULL) return; + + size_t old_len = lv_strlen(txt); + + pos = lv_text_encoded_get_byte_id(txt, pos); /*Convert to byte index instead of letter index*/ + len = lv_text_encoded_get_byte_id(&txt[pos], len); + + /*Copy the second part into the end to make place to text to insert*/ + uint32_t i; + for(i = pos; i <= old_len - len; i++) { + txt[i] = txt[i + len]; + } +} + +char * lv_text_set_text_vfmt(const char * fmt, va_list ap) +{ + /*Allocate space for the new text by using trick from C99 standard section 7.19.6.12*/ + va_list ap_copy; + va_copy(ap_copy, ap); + uint32_t len = lv_vsnprintf(NULL, 0, fmt, ap_copy); + va_end(ap_copy); + + char * text = 0; +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Put together the text according to the format string*/ + char * raw_txt = lv_malloc(len + 1); + LV_ASSERT_MALLOC(raw_txt); + if(raw_txt == NULL) { + return NULL; + } + + lv_vsnprintf(raw_txt, len + 1, fmt, ap); + + /*Get the size of the Arabic text and process it*/ + size_t len_ap = lv_text_ap_calc_bytes_count(raw_txt); + text = lv_malloc(len_ap + 1); + LV_ASSERT_MALLOC(text); + if(text == NULL) { + return NULL; + } + lv_text_ap_proc(raw_txt, text); + + lv_free(raw_txt); +#else + text = lv_malloc(len + 1); + LV_ASSERT_MALLOC(text); + if(text == NULL) { + return NULL; + } + + lv_vsnprintf(text, len + 1, fmt, ap); +#endif + + return text; +} + +void lv_text_encoded_letter_next_2(const char * txt, uint32_t * letter, uint32_t * letter_next, uint32_t * ofs) +{ + *letter = lv_text_encoded_next(txt, ofs); + *letter_next = *letter != '\0' ? lv_text_encoded_next(&txt[*ofs], NULL) : 0; +} + +#if LV_TXT_ENC == LV_TXT_ENC_UTF8 +/******************************* + * UTF-8 ENCODER/DECODER + ******************************/ + +/** + * Give the size of an UTF-8 coded character + * @param str pointer to a character in a string + * @return length of the UTF-8 character (1,2,3 or 4), 0 on invalid code. + */ +static uint8_t lv_text_utf8_size(const char * str) +{ + if(LV_IS_ASCII(str[0])) + return 1; + else if(LV_IS_2BYTES_UTF8_CODE(str[0])) + return 2; + else if(LV_IS_3BYTES_UTF8_CODE(str[0])) + return 3; + else if(LV_IS_4BYTES_UTF8_CODE(str[0])) + return 4; + return 0; +} + +/** + * Convert a Unicode letter to UTF-8. + * @param letter_uni a Unicode letter + * @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű') + */ +static uint32_t lv_text_unicode_to_utf8(uint32_t letter_uni) +{ + if(letter_uni < 128) return letter_uni; + uint8_t bytes[4]; + + if(letter_uni < 0x0800) { + bytes[0] = ((letter_uni >> 6) & 0x1F) | 0xC0; + bytes[1] = ((letter_uni >> 0) & 0x3F) | 0x80; + bytes[2] = 0; + bytes[3] = 0; + } + else if(letter_uni < 0x010000) { + bytes[0] = ((letter_uni >> 12) & 0x0F) | 0xE0; + bytes[1] = ((letter_uni >> 6) & 0x3F) | 0x80; + bytes[2] = ((letter_uni >> 0) & 0x3F) | 0x80; + bytes[3] = 0; + } + else if(letter_uni < 0x110000) { + bytes[0] = ((letter_uni >> 18) & 0x07) | 0xF0; + bytes[1] = ((letter_uni >> 12) & 0x3F) | 0x80; + bytes[2] = ((letter_uni >> 6) & 0x3F) | 0x80; + bytes[3] = ((letter_uni >> 0) & 0x3F) | 0x80; + } + else { + return 0; + } + + uint32_t * res_p = (uint32_t *)bytes; + return *res_p; +} + +/** + * Convert a wide character, e.g. 'Á' little endian to be UTF-8 compatible + * @param c a wide character or a Little endian number + * @return `c` in big endian + */ +static uint32_t lv_text_utf8_conv_wc(uint32_t c) +{ +#if LV_BIG_ENDIAN_SYSTEM == 0 + /*Swap the bytes (UTF-8 is big endian, but the MCUs are little endian)*/ + if((c & 0x80) != 0) { + uint32_t swapped; + uint8_t c8[4]; + lv_memcpy(c8, &c, 4); + swapped = (c8[0] << 24) + (c8[1] << 16) + (c8[2] << 8) + (c8[3]); + uint8_t i; + for(i = 0; i < 4; i++) { + if((swapped & 0xFF) == 0) + swapped = (swapped >> 8); /*Ignore leading zeros (they were in the end originally)*/ + } + c = swapped; + } +#endif + return c; +} + +/** + * Decode an UTF-8 character from a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. + * After call it will point to the next UTF-8 char in 'txt'. + * NULL to use txt[0] as index + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_text_utf8_next(const char * txt, uint32_t * i) +{ + /** + * Unicode to UTF-8 + * 00000000 00000000 00000000 0xxxxxxx -> 0xxxxxxx + * 00000000 00000000 00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx + * 00000000 00000000 zzzzyyyy yyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx + * 00000000 000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx + */ + + uint32_t result = 0; + + /*Dummy 'i' pointer is required*/ + uint32_t i_tmp = 0; + if(i == NULL) i = &i_tmp; + + /* Ensure the string is not null */ + if(txt == NULL || txt[*i] == '\0') { + return result; + } + + /*Normal ASCII*/ + if(LV_IS_ASCII(txt[*i])) { + result = txt[*i]; + (*i)++; + } + /*Real UTF-8 decode*/ + else { + /*2 bytes UTF-8 code*/ + if(LV_IS_2BYTES_UTF8_CODE(txt[*i])) { + result = (uint32_t)(txt[*i] & 0x1F) << 6; + (*i)++; + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (txt[*i] & 0x3F); + (*i)++; + } + /*3 bytes UTF-8 code*/ + else if(LV_IS_3BYTES_UTF8_CODE(txt[*i])) { + result = (uint32_t)(txt[*i] & 0x0F) << 12; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (uint32_t)(txt[*i] & 0x3F) << 6; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (txt[*i] & 0x3F); + (*i)++; + } + /*4 bytes UTF-8 code*/ + else if(LV_IS_4BYTES_UTF8_CODE(txt[*i])) { + result = (uint32_t)(txt[*i] & 0x07) << 18; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (uint32_t)(txt[*i] & 0x3F) << 12; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += (uint32_t)(txt[*i] & 0x3F) << 6; + (*i)++; + + if(LV_IS_INVALID_UTF8_CODE(txt[*i])) return 0; + result += txt[*i] & 0x3F; + (*i)++; + } + else { + (*i)++; /*Not UTF-8 char. Go the next.*/ + } + } + return result; +} + +/** + * Get previous UTF-8 character form a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. After the call it will point to the previous + * UTF-8 char in 'txt'. + * @return the decoded Unicode character or 0 on invalid UTF-8 code + */ +static uint32_t lv_text_utf8_prev(const char * txt, uint32_t * i) +{ + uint8_t c_size; + uint8_t cnt = 0; + + /*Try to find a !0 long UTF-8 char by stepping one character back*/ + (*i)--; + do { + if(cnt >= 4) return 0; /*No UTF-8 char found before the initial*/ + + c_size = lv_text_encoded_size(&txt[*i]); + if(c_size == 0) { + if(*i != 0) + (*i)--; + else + return 0; + } + cnt++; + } while(c_size == 0); + + uint32_t i_tmp = *i; + uint32_t letter = lv_text_encoded_next(txt, &i_tmp); /*Character found, get it*/ + + return letter; +} + +/** + * Convert a character index (in an UTF-8 text) to byte index. + * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param utf8_id character index + * @return byte index of the 'utf8_id'th letter + */ +static uint32_t lv_text_utf8_get_byte_id(const char * txt, uint32_t utf8_id) +{ + uint32_t i; + uint32_t byte_cnt = 0; + for(i = 0; i < utf8_id && txt[byte_cnt] != '\0'; i++) { + uint8_t c_size = lv_text_encoded_size(&txt[byte_cnt]); + /* If the char was invalid tell it's 1 byte long*/ + byte_cnt += c_size ? c_size : 1; + } + + return byte_cnt; +} + +/** + * Convert a byte index (in an UTF-8 text) to character index. + * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param byte_id byte index + * @return character index of the letter at 'byte_id'th position + */ +static uint32_t lv_text_utf8_get_char_id(const char * txt, uint32_t byte_id) +{ + uint32_t i = 0; + uint32_t char_cnt = 0; + + while(i < byte_id) { + lv_text_encoded_next(txt, &i); /*'i' points to the next letter so use the prev. value*/ + char_cnt++; + } + + return char_cnt; +} + +/** + * Get the number of characters (and NOT bytes) in a string. Decode it with UTF-8 if enabled. + * E.g.: "ÁBC" is 3 characters (but 4 bytes) + * @param txt a '\0' terminated char string + * @return number of characters + */ +static uint32_t lv_text_utf8_get_length(const char * txt) +{ + uint32_t len = 0; + uint32_t i = 0; + + while(txt[i] != '\0') { + lv_text_encoded_next(txt, &i); + len++; + } + + return len; +} + +#elif LV_TXT_ENC == LV_TXT_ENC_ASCII +/******************************* + * ASCII ENCODER/DECODER + ******************************/ + +/** + * Give the size of an ISO8859-1 coded character + * @param str pointer to a character in a string + * @return length of the ISO8859-1 coded character, will be always 1. + */ +static uint8_t lv_text_iso8859_1_size(const char * str) +{ + LV_UNUSED(str); /*Unused*/ + return 1; +} + +/** + * Convert a Unicode letter to ISO8859-1. + * @param letter_uni a Unicode letter + * @return ISO8859-1 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű') + */ +static uint32_t lv_text_unicode_to_iso8859_1(uint32_t letter_uni) +{ + if(letter_uni < 256) + return letter_uni; + else + return ' '; +} + +/** + * Convert wide characters to ASCII, however wide characters in ASCII range (e.g. 'A') are ASCII compatible by default. + * So this function does nothing just returns with `c`. + * @param c a character, e.g. 'A' + * @return same as `c` + */ +static uint32_t lv_text_iso8859_1_conv_wc(uint32_t c) +{ + return c; +} + +/** + * Decode an ISO8859-1 character from a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. + * After call it will point to the next ISO8859-1 coded char in 'txt'. + * NULL to use txt[0] as index + * @return the decoded ISO8859-1 character. + */ +static uint32_t lv_text_iso8859_1_next(const char * txt, uint32_t * i) +{ + if(i == NULL) return txt[0]; /*Get the next char*/ + + uint8_t letter = txt[*i]; + (*i)++; + return letter; +} + +/** + * Get previous ISO8859-1 character form a string. + * @param txt pointer to '\0' terminated string + * @param i start byte index in 'txt' where to start. After the call it will point to the previous ISO8859-1 coded char in 'txt'. + * @return the decoded ISO8859-1 character. + */ +static uint32_t lv_text_iso8859_1_prev(const char * txt, uint32_t * i) +{ + if(i == NULL) return *(txt - 1); /*Get the prev. char*/ + + (*i)--; + uint8_t letter = txt[*i]; + + return letter; +} + +/** + * Convert a character index (in an ISO8859-1 text) to byte index. + * The ISO8859-1 encoding is compatible with ASCII so the indices of characters is the same as the indices of bytes. + * @param txt a '\0' terminated char string + * @param utf8_id character index + * @return byte index of the 'utf8_id'th letter + */ +static uint32_t lv_text_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id) +{ + LV_UNUSED(txt); /*Unused*/ + return utf8_id; /*In Non encoded no difference*/ +} + +/** + * Convert a byte index (in an ISO8859-1 text) to character index. + * The ISO8859-1 encoding is compatible with ASCII so the indices of characters is the same as the indices of bytes. + * @param txt a '\0' terminated char string + * @param byte_id byte index + * @return character index of the letter at 'byte_id'th position + */ +static uint32_t lv_text_iso8859_1_get_char_id(const char * txt, uint32_t byte_id) +{ + LV_UNUSED(txt); /*Unused*/ + return byte_id; /*In Non encoded no difference*/ +} + +/** + * Get the number of characters (and NOT bytes) in a string. + * The ISO8859-1 encoding is compatible with ASCII so the number of characters is the same as the number of bytes. + * @param txt a '\0' terminated char string + * @return number of characters + */ +static uint32_t lv_text_iso8859_1_get_length(const char * txt) +{ + return lv_strlen(txt); +} +#else + +#error "Invalid character encoding. See `LV_TXT_ENC` in `lv_conf.h`" + +#endif diff --git a/inc/lvgl/src/misc/lv_text.h b/inc/lvgl/src/misc/lv_text.h new file mode 100644 index 0000000..3792f0f --- /dev/null +++ b/inc/lvgl/src/misc/lv_text.h @@ -0,0 +1,86 @@ +/** + * @file lv_text.h + * + */ + +#ifndef LV_TEXT_H +#define LV_TEXT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "lv_types.h" +#include "lv_area.h" +#include "../font/lv_font.h" +#include "../stdlib/lv_sprintf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Options for text rendering. + */ +typedef enum { + LV_TEXT_FLAG_NONE = 0x00, + + /*Ignore max-width to avoid automatic word wrapping*/ + LV_TEXT_FLAG_EXPAND = 0x01, + + /**Max-width is already equal to the longest line. (Used to skip some calculation)*/ + LV_TEXT_FLAG_FIT = 0x02, + + /**To prevent overflow, insert breaks between any two characters. + Otherwise breaks are inserted at word boundaries, as configured via LV_TXT_BREAK_CHARS + or according to LV_TXT_LINE_BREAK_LONG_LEN, LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN, + and LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN.*/ + LV_TEXT_FLAG_BREAK_ALL = 0x04, + + /**Enable parsing of recolor command*/ + LV_TEXT_FLAG_RECOLOR = 0x08, + +} lv_text_flag_t; + +/** Label align policy*/ +typedef enum { + LV_TEXT_ALIGN_AUTO, /**< Align text auto*/ + LV_TEXT_ALIGN_LEFT, /**< Align text to left*/ + LV_TEXT_ALIGN_CENTER, /**< Align text to center*/ + LV_TEXT_ALIGN_RIGHT, /**< Align text to right*/ +} lv_text_align_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Get size of a text + * @param size_res pointer to a 'point_t' variable to store the result + * @param text pointer to a text + * @param font pointer to font of the text + * @param letter_space letter space of the text + * @param line_space line space of the text + * @param max_width max width of the text (break the lines to fit this size). Set COORD_MAX to avoid + * @param flag settings for the text from ::lv_text_flag_t + */ +void lv_text_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, int32_t letter_space, + int32_t line_space, int32_t max_width, lv_text_flag_t flag); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXT_H*/ diff --git a/inc/lvgl/src/misc/lv_text_ap.c b/inc/lvgl/src/misc/lv_text_ap.c new file mode 100644 index 0000000..e6dcb4d --- /dev/null +++ b/inc/lvgl/src/misc/lv_text_ap.c @@ -0,0 +1,302 @@ +/** + * @file lv_text_ap.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_bidi.h" +#include "lv_text_private.h" +#include "lv_text_ap.h" +#include "lv_types.h" +#include "../stdlib/lv_mem.h" +#include "../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + uint8_t char_offset; + uint16_t char_end_form; + int8_t char_beginning_form_offset; + int8_t char_middle_form_offset; + int8_t char_isolated_form_offset; + struct { + uint8_t conj_to_previous; + uint8_t conj_to_next; + } ap_chars_conjunction; +} ap_chars_map_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 +static uint32_t lv_ap_get_char_index(uint16_t c); +static uint32_t lv_text_lam_alef(uint32_t ch_curr, uint32_t ch_next); +static bool lv_text_is_arabic_vowel(uint16_t c); + +/********************** + * STATIC VARIABLES + **********************/ + +const ap_chars_map_t ap_chars_map[] = { + /*{Key Offset, End, Beginning, Middle, Isolated, {conjunction}}*/ + {0, 0xFE81, 0, 0, 0, {0, 0}}, // أ + {1, 0xFE84, -1, 0, -1, {1, 0}}, // أ + {2, 0xFE86, -1, 0, -1, {1, 0}}, // ؤ + {3, 0xFE88, -1, 0, -1, {1, 0}}, // ﺇ + {4, 0xFE8A, 1, 2, -1, {1, 1}}, // ئ + {5, 0xFE8E, -1, 0, -1, {1, 0}}, // آ + {6, 0xFE90, 1, 2, -1, {1, 1}}, // ب + {92, 0xFB57, 1, 2, -1, {1, 1}}, // پ + {8, 0xFE96, 1, 2, -1, {1, 1}}, // ت + {9, 0xFE9A, 1, 2, -1, {1, 1}}, // ث + {10, 0xFE9E, 1, 2, -1, {1, 1}}, // ج + {100, 0xFB7B, 1, 2, -1, {1, 1}}, // چ + {11, 0xFEA2, 1, 2, -1, {1, 1}}, // ح + {12, 0xFEA6, 1, 2, -1, {1, 1}}, // خ + {13, 0xFEAA, -1, 0, -1, {1, 0}}, // د + {14, 0xFEAC, -1, 0, -1, {1, 0}}, // ذ + {15, 0xFEAE, -1, 0, -1, {1, 0}}, // ر + {16, 0xFEB0, -1, 0, -1, {1, 0}}, // ز + {118, 0xFB8B, -1, 0, -1, {1, 0}}, // ژ + {17, 0xFEB2, 1, 2, -1, {1, 1}}, // س + {18, 0xFEB6, 1, 2, -1, {1, 1}}, // ش + {19, 0xFEBA, 1, 2, -1, {1, 1}}, // ص + {20, 0xFEBE, 1, 2, -1, {1, 1}}, // ض + {21, 0xFEC2, 1, 2, -1, {1, 1}}, // ط + {22, 0xFEC6, 1, 2, -1, {1, 1}}, // ظ + {23, 0xFECA, 1, 2, -1, {1, 1}}, // ع + {24, 0xFECE, 1, 2, -1, {1, 1}}, // غ + {30, 0x0640, 0, 0, 0, {1, 1}}, // - (mad, hyphen) + {31, 0xFED2, 1, 2, -1, {1, 1}}, // ف + {32, 0xFED6, 1, 2, -1, {1, 1}}, // ق + {135, 0xFB8F, 1, 2, -1, {1, 1}}, // ک + {33, 0xFEDA, 1, 2, -1, {1, 1}}, // ﻙ + {141, 0xFB93, 1, 2, -1, {1, 1}}, // گ + {34, 0xFEDE, 1, 2, -1, {1, 1}}, // ل + {35, 0xFEE2, 1, 2, -1, {1, 1}}, // م + {36, 0xFEE6, 1, 2, -1, {1, 1}}, // ن + {38, 0xFEEE, -1, 0, -1, {1, 0}}, // و + {37, 0xFEEA, 1, 2, -1, {1, 1}}, // ه + {39, 0xFEF0, 0, 0, -1, {1, 0}}, // ى + {40, 0xFEF2, 1, 2, -1, {1, 1}}, // ي + {170, 0xFBFD, 1, 2, -1, {1, 1}}, // ی + {7, 0xFE94, -1, 2, -1, {1, 0}}, // ة + {206, 0x06F0, -1, 2, 0, {0, 0}}, // ۰ + {207, 0x06F1, 0, 0, 0, {0, 0}}, // ۱ + {208, 0x06F2, 0, 0, 0, {0, 0}}, // ۲ + {209, 0x06F3, 0, 0, 0, {0, 0}}, // ۳ + {210, 0x06F4, 0, 0, 0, {0, 0}}, // ۴ + {211, 0x06F5, 0, 0, 0, {0, 0}}, // ۵ + {212, 0x06F6, 0, 0, 0, {0, 0}}, // ۶ + {213, 0x06F7, 0, 0, 0, {0, 0}}, // ۷ + {214, 0x06F8, 0, 0, 0, {0, 0}}, // ۸ + {215, 0x06F9, 0, 0, 0, {0, 0}}, // ۹ + LV_AP_END_CHARS_LIST +}; +/********************** +* MACROS +**********************/ + +/********************** +* GLOBAL FUNCTIONS +**********************/ +uint32_t lv_text_ap_calc_bytes_count(const char * txt) +{ + uint32_t txt_length = 0; + uint32_t chars_cnt = 0; + uint32_t current_ap_idx = 0; + uint32_t i, j; + uint32_t ch_enc; + + txt_length = lv_text_get_encoded_length(txt); + + i = 0; + j = 0; + while(i < txt_length) { + ch_enc = lv_text_encoded_next(txt, &j); + current_ap_idx = lv_ap_get_char_index(ch_enc); + + if(current_ap_idx != LV_UNDEF_ARABIC_PERSIAN_CHARS) + ch_enc = ap_chars_map[current_ap_idx].char_end_form; + + if(ch_enc < 0x80) + chars_cnt++; + else if(ch_enc < 0x0800) + chars_cnt += 2; + else if(ch_enc < 0x010000) + chars_cnt += 3; + else + chars_cnt += 4; + + i++; + } + + return chars_cnt + 1; +} + +void lv_text_ap_proc(const char * txt, char * txt_out) +{ + uint32_t txt_length = 0; + uint32_t index_current, idx_next, idx_previous, i, j; + uint32_t * ch_enc; + uint32_t * ch_fin; + char * txt_out_temp; + + txt_length = lv_text_get_encoded_length(txt); + + ch_enc = (uint32_t *)lv_malloc(sizeof(uint32_t) * (txt_length + 1)); + ch_fin = (uint32_t *)lv_malloc(sizeof(uint32_t) * (txt_length + 1)); + + i = 0; + j = 0; + while(j < txt_length) + ch_enc[j++] = lv_text_encoded_next(txt, &i); + + ch_enc[j] = 0; + + i = 0; + j = 0; + idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; + while(i < txt_length) { + index_current = lv_ap_get_char_index(ch_enc[i]); + idx_next = lv_ap_get_char_index(ch_enc[i + 1]); + + if(lv_text_is_arabic_vowel(ch_enc[i])) { // Current character is a vowel + ch_fin[j] = ch_enc[i]; + i++; + j++; + continue; // Skip this character + } + else if(lv_text_is_arabic_vowel(ch_enc[i + 1])) { // Next character is a vowel + idx_next = lv_ap_get_char_index(ch_enc[i + 2]); // Skip the vowel character to join with the character after it + } + + if(index_current == LV_UNDEF_ARABIC_PERSIAN_CHARS) { + ch_fin[j] = ch_enc[i]; + j++; + i++; + idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; + continue; + } + + uint8_t conjunction_to_previous = (i == 0 || + idx_previous == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_previous].ap_chars_conjunction.conj_to_next; + uint8_t conjunction_to_next = ((i == txt_length - 1) || + idx_next == LV_UNDEF_ARABIC_PERSIAN_CHARS) ? 0 : ap_chars_map[idx_next].ap_chars_conjunction.conj_to_previous; + + uint32_t lam_alef = lv_text_lam_alef(index_current, idx_next); + if(lam_alef) { + if(conjunction_to_previous) { + lam_alef ++; + } + ch_fin[j] = lam_alef; + idx_previous = LV_UNDEF_ARABIC_PERSIAN_CHARS; + i += 2; + j++; + continue; + } + + if(conjunction_to_previous && conjunction_to_next) + ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_middle_form_offset; + else if(!conjunction_to_previous && conjunction_to_next) + ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_beginning_form_offset; + else if(conjunction_to_previous && !conjunction_to_next) + ch_fin[j] = ap_chars_map[index_current].char_end_form; + else + ch_fin[j] = ap_chars_map[index_current].char_end_form + ap_chars_map[index_current].char_isolated_form_offset; + idx_previous = index_current; + i++; + j++; + } + ch_fin[j] = 0; + for(i = 0; i < txt_length; i++) + ch_enc[i] = 0; + for(i = 0; i < j; i++) + ch_enc[i] = ch_fin[i]; + lv_free(ch_fin); + + txt_out_temp = txt_out; + i = 0; + + while(i < txt_length) { + if(ch_enc[i] < 0x80) { + *(txt_out_temp++) = ch_enc[i] & 0xFF; + } + else if(ch_enc[i] < 0x0800) { + *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x1F) | 0xC0; + *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; + } + else if(ch_enc[i] < 0x010000) { + *(txt_out_temp++) = ((ch_enc[i] >> 12) & 0x0F) | 0xE0; + *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x3F) | 0x80; + *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; + } + else if(ch_enc[i] < 0x110000) { + *(txt_out_temp++) = ((ch_enc[i] >> 18) & 0x07) | 0xF0; + *(txt_out_temp++) = ((ch_enc[i] >> 12) & 0x3F) | 0x80; + *(txt_out_temp++) = ((ch_enc[i] >> 6) & 0x3F) | 0x80; + *(txt_out_temp++) = ((ch_enc[i] >> 0) & 0x3F) | 0x80; + } + + i++; + } + *(txt_out_temp) = '\0'; + lv_free(ch_enc); +} +/********************** +* STATIC FUNCTIONS +**********************/ + +static uint32_t lv_ap_get_char_index(uint16_t c) +{ + for(uint8_t i = 0; ap_chars_map[i].char_end_form; i++) { + if(c == (ap_chars_map[i].char_offset + LV_AP_ALPHABET_BASE_CODE)) + return i; + else if(c == ap_chars_map[i].char_end_form //is it an End form + || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_beginning_form_offset) //is it a Beginning form + || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_middle_form_offset) //is it a middle form + || c == (ap_chars_map[i].char_end_form + ap_chars_map[i].char_isolated_form_offset)) { //is it an isolated form + return i; + } + } + return LV_UNDEF_ARABIC_PERSIAN_CHARS; +} + +static uint32_t lv_text_lam_alef(uint32_t ch_curr, uint32_t ch_next) +{ + uint32_t ch_code = 0; + if(ap_chars_map[ch_curr].char_offset != 34) { + return 0; + } + if(ch_next == LV_UNDEF_ARABIC_PERSIAN_CHARS) { + return 0; + } + ch_code = ap_chars_map[ch_next].char_offset + LV_AP_ALPHABET_BASE_CODE; + if(ch_code == 0x0622) { + return 0xFEF5; // (lam-alef) mad + } + if(ch_code == 0x0623) { + return 0xFEF7; // (lam-alef) top hamza + } + if(ch_code == 0x0625) { + return 0xFEF9; // (lam-alef) bot hamza + } + if(ch_code == 0x0627) { + return 0xFEFB; // (lam-alef) alef + } + return 0; +} + +static bool lv_text_is_arabic_vowel(uint16_t c) +{ + return (c >= 0x064B) && (c <= 0x0652); +} + +#endif diff --git a/inc/lvgl/src/misc/lv_text_ap.h b/inc/lvgl/src/misc/lv_text_ap.h new file mode 100644 index 0000000..cac7c71 --- /dev/null +++ b/inc/lvgl/src/misc/lv_text_ap.h @@ -0,0 +1,49 @@ +/** + * @file lv_text_ap.h + * + */ + +#ifndef LV_TEXT_AP_H +#define LV_TEXT_AP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_text.h" +#include "lv_types.h" +#include "../draw/lv_draw.h" + +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + +/********************* + * DEFINES + *********************/ + +#define LV_UNDEF_ARABIC_PERSIAN_CHARS (UINT32_MAX) +#define LV_AP_ALPHABET_BASE_CODE 0x0622 +#define LV_AP_END_CHARS_LIST {0,0,0,0,0,{0,0}} +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +uint32_t lv_text_ap_calc_bytes_count(const char * txt); +void lv_text_ap_proc(const char * txt, char * txt_out); + +/********************** + * MACROS + **********************/ + +#endif // LV_USE_ARABIC_PERSIAN_CHARS + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXT_AP_H*/ diff --git a/inc/lvgl/src/misc/lv_text_private.h b/inc/lvgl/src/misc/lv_text_private.h new file mode 100644 index 0000000..a54a351 --- /dev/null +++ b/inc/lvgl/src/misc/lv_text_private.h @@ -0,0 +1,330 @@ +/** + * @file lv_text_private.h + * + */ + +#ifndef LV_TEXT_PRIVATE_H +#define LV_TEXT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_text.h" + +/********************* + * DEFINES + *********************/ + +#ifndef LV_TXT_COLOR_CMD +#define LV_TXT_COLOR_CMD "#" +#endif + +#define LV_TXT_ENC_UTF8 1 +#define LV_TXT_ENC_ASCII 2 + +#define LV_TEXT_LEN_MAX UINT32_MAX + +/********************** + * TYPEDEFS + **********************/ + +/** State machine for text renderer. */ +typedef enum { + LV_TEXT_CMD_STATE_WAIT, /**< Waiting for command*/ + LV_TEXT_CMD_STATE_PAR, /**< Processing the parameter*/ + LV_TEXT_CMD_STATE_IN, /**< Processing the command*/ +} lv_text_cmd_state_t; + +typedef struct { + int32_t letter_space; /**< Letter space between letters*/ + int32_t line_space; /**< Space between lines of text*/ + int32_t max_width; /**< Max width of the text (break the lines to fit this size). Set COORD_MAX to avoid*/ + lv_text_flag_t text_flags; +} lv_text_attributes_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the text attributes descriptor + * @param attributes the text attributes descriptor to initialize + */ +void lv_text_attributes_init(lv_text_attributes_t * attributes); + +/** + * Get size of a text + * @param size_res pointer to a 'point_t' variable to store the result + * @param text pointer to a text + * @param font pointer to font of the text + * @param attributes the text attributes, flags for line break behaviour, spacing etc + */ +void lv_text_get_size_attributes(lv_point_t * size_res, const char * text, const lv_font_t * font, + lv_text_attributes_t * attributes); +/** + * Give the length of a text with a given font with text flags + * @param txt a '\0' terminate string + * @param length length of 'txt' in byte count and not characters (Á is 1 character but 2 bytes in + * UTF-8) + * @param font pointer to font of the text + * @param attributes the text attributes, flags for line break behaviour, spacing etc + * @return length of a char_num long text + */ +int32_t lv_text_get_width(const char * txt, uint32_t length, const lv_font_t * font, + const lv_text_attributes_t * attributes); + +/** + * Check if c is command state + * @param state + * @param c + * @return True if c is state + */ +bool lv_text_is_cmd(lv_text_cmd_state_t * state, uint32_t c); + +/** + * Get the next line of text. Check line length and break chars too. + * @param txt a '\0' terminated string + * @param len length of 'txt' in bytes + * @param font pointer to a font + * @param used_width When used_width != NULL, save the width of this line if + * flag == LV_TEXT_FLAG_NONE, otherwise save -1. + * @param attributes text attributes, flags to control line break behaviour, spacing etc + * @return the index of the first char of the new line + * (in byte index not letter index. With UTF-8 they are different) + */ +uint32_t lv_text_get_next_line(const char * txt, uint32_t len, const lv_font_t * font, int32_t * used_width, + lv_text_attributes_t * attributes); + +/** + * Insert a string into another + * @param txt_buf the original text (must be big enough for the result text and NULL terminated) + * @param pos position to insert (0: before the original text, 1: after the first char etc.) + * @param ins_txt text to insert, must be '\0' terminated + */ +void lv_text_ins(char * txt_buf, uint32_t pos, const char * ins_txt); + +/** + * Delete a part of a string + * @param txt string to modify, must be '\0' terminated and should point to a heap or stack frame, not read-only memory. + * @param pos position where to start the deleting (0: before the first char, 1: after the first + * char etc.) + * @param len number of characters to delete + */ +void lv_text_cut(char * txt, uint32_t pos, uint32_t len); + +/** + * Return a new formatted text. Memory will be allocated to store the text. + * @param fmt `printf`-like format + * @param ap items to print + + * @return pointer to the allocated text string. + */ +char * lv_text_set_text_vfmt(const char * fmt, va_list ap) LV_FORMAT_ATTRIBUTE(1, 0); + +/** + * Decode two encoded character from a string. + * @param txt pointer to '\0' terminated string + * @param letter the first decoded Unicode character or 0 on invalid data code + * @param letter_next the second decoded Unicode character or 0 on invalid data code + * @param ofs start index in 'txt' where to start. + * After the call it will point to the next encoded char in 'txt'. + * NULL to use txt[0] as index + */ +void lv_text_encoded_letter_next_2(const char * txt, uint32_t * letter, uint32_t * letter_next, uint32_t * ofs); + +/** + * Test if char is break char or not (a text can broken here or not) + * @param letter a letter + * @return false: 'letter' is not break char + */ +static inline bool lv_text_is_break_char(uint32_t letter) +{ + uint8_t i; + bool ret = false; + + /*Compare the letter to TXT_BREAK_CHARS*/ + for(i = 0; LV_TXT_BREAK_CHARS[i] != '\0'; i++) { + if(letter == (uint32_t)LV_TXT_BREAK_CHARS[i]) { + ret = true; /*If match then it is break char*/ + break; + } + } + + return ret; +} + +/** + * Test if char is break char or not (a text can broken here or not) + * @param letter a letter + * @return false: 'letter' is not break char + */ +static inline bool lv_text_is_a_word(uint32_t letter) +{ + /*Cheap check on invalid letter*/ + if(letter == 0) return false; + + /*CJK Unified Ideographs*/ + if(letter >= 0x4E00 && letter <= 0x9FFF) { + return true; + } + + /*Fullwidth ASCII variants*/ + if(letter >= 0xFF01 && letter <= 0xFF5E) { + return true; + } + + /*CJK symbols and punctuation*/ + if(letter >= 0x3000 && letter <= 0x303F) { + return true; + } + + /*CJK Radicals Supplement*/ + if(letter >= 0x2E80 && letter <= 0x2EFF) { + return true; + } + + /*CJK Strokes*/ + if(letter >= 0x31C0 && letter <= 0x31EF) { + return true; + } + + /*Hiragana and Katakana*/ + if(letter >= 0x3040 && letter <= 0x30FF) { + return true; + } + + /*Chinese Vertical Forms*/ + if(letter >= 0xFE10 && letter <= 0xFE1F) { + return true; + } + + /*CJK Compatibility Forms*/ + if(letter >= 0xFE30 && letter <= 0xFE4F) { + return true; + } + + return false; +} + +/** + * Test if character can be treated as marker, and don't need to be rendered. + * Note, this is not a full list. Add your findings to the list. + * + * @param letter a letter + * @return true if so + */ +static inline bool lv_text_is_marker(uint32_t letter) +{ + if(letter < 0x20) return true; + + /*U+061C ARABIC LETTER MARK, see https://www.compart.com/en/unicode/block/U+0600*/ + if(letter == 0x061C) return true; + + /*U+115F HANGUL CHOSEONG FILLER, See https://www.compart.com/en/unicode/block/U+1100*/ + if(letter == 0x115F) return true; + /*U+1160 HANGUL JUNGSEONG FILLER*/ + if(letter == 0x1160) return true; + + /*See https://www.compart.com/en/unicode/block/U+1800*/ + if(letter >= 0x180B && letter <= 0x180E) return true; + + /*See https://www.compart.com/en/unicode/block/U+2000*/ + if(letter >= 0x200B && letter <= 0x200F) return true; + if(letter >= 0x2028 && letter <= 0x202F) return true; + if(letter >= 0x205F && letter <= 0x206F) return true; + + /*U+FEFF ZERO WIDTH NO-BREAK SPACE, see https://www.compart.com/en/unicode/block/U+FE70*/ + if(letter == 0xFEFF) return true; + + if(letter == 0xF8FF) return true; /*LV_SYMBOL_DUMMY*/ + + return false; +} + +/*************************************************************** + * GLOBAL FUNCTION POINTERS FOR CHARACTER ENCODING INTERFACE + ***************************************************************/ + +/** + * Give the size of an encoded character + * @param txt pointer to a character in a string + * @return length of the encoded character (1,2,3 ...). O in invalid + */ +extern uint8_t (*const lv_text_encoded_size)(const char * txt); + +/** + * Convert a Unicode letter to encoded + * @param letter_uni a Unicode letter + * @return Encoded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ü') + */ +extern uint32_t (*const lv_text_unicode_to_encoded)(uint32_t letter_uni); + +/** + * Convert a wide character, e.g. 'Á' little endian to be compatible with the encoded format. + * @param c a wide character + * @return `c` in the encoded format + */ +extern uint32_t (*const lv_text_encoded_conv_wc)(uint32_t c); + +/** + * Decode the next encoded character from a string. + * @param txt pointer to '\0' terminated string + * @param i_start start index in 'txt' where to start. + * After the call it will point to the next encoded char in 'txt'. + * NULL to use txt[0] as index + * @return the decoded Unicode character or 0 on invalid data code + */ +extern uint32_t (*const lv_text_encoded_next)(const char * txt, uint32_t * i_start); + +/** + * Get the previous encoded character form a string. + * + * @param txt pointer to '\0' terminated string + * @param i_start index in 'txt' where to start. After the call it will point to the previous + * encoded char in 'txt'. + * + * @return the decoded Unicode character or 0 on invalid data + */ +extern uint32_t (*const lv_text_encoded_prev)(const char * txt, uint32_t * i_start); + +/** + * Convert a letter index (in the encoded text) to byte index. + * E.g. in UTF-8 "AÁRT" index of 'R' is 2 but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param utf8_id character index + * @return byte index of the 'enc_id'th letter + */ +extern uint32_t (*const lv_text_encoded_get_byte_id)(const char * txt, uint32_t utf8_id); + +/** + * Convert a byte index (in an encoded text) to character index. + * E.g. in UTF-8 "AÁRT" index of 'R' is 2 but start at byte 3 because 'Á' is 2 bytes long + * @param txt a '\0' terminated UTF-8 string + * @param byte_id byte index + * @return character index of the letter at 'byte_id'th position + */ +extern uint32_t (*const lv_text_encoded_get_char_id)(const char * txt, uint32_t byte_id); + +/** + * Get the number of characters (and NOT bytes) in a string. + * E.g. in UTF-8 "ÁBC" is 3 characters (but 4 bytes) + * @param txt a '\0' terminated char string + * @return number of characters + */ +extern uint32_t (*const lv_text_get_encoded_length)(const char * txt); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXT_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_timer.c b/inc/lvgl/src/misc/lv_timer.c new file mode 100644 index 0000000..eb29603 --- /dev/null +++ b/inc/lvgl/src/misc/lv_timer.c @@ -0,0 +1,414 @@ +/** + * @file lv_timer.c + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_timer_private.h" +#include "../core/lv_global.h" +#include "../tick/lv_tick.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_sprintf.h" +#include "lv_assert.h" +#include "lv_ll.h" +#include "lv_profiler.h" + +/********************* + * DEFINES + *********************/ + +#define IDLE_MEAS_PERIOD 500 /*[ms]*/ +#define DEF_PERIOD 500 + +#define state LV_GLOBAL_DEFAULT()->timer_state +#define timer_ll_p &(state.timer_ll) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool lv_timer_exec(lv_timer_t * timer); +static uint32_t lv_timer_time_remaining(lv_timer_t * timer); +static void lv_timer_handler_resume(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_TIMER + #define LV_TRACE_TIMER(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_TIMER(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_timer_core_init(void) +{ + lv_ll_init(timer_ll_p, sizeof(lv_timer_t)); + + /*Initially enable the lv_timer handling*/ + lv_timer_enable(true); +} + +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void) +{ + LV_TRACE_TIMER("begin"); + + lv_timer_state_t * state_p = &state; + /*Avoid concurrent running of the timer handler*/ + if(state_p->already_running) { + LV_TRACE_TIMER("already running, concurrent calls are not allow, returning"); + return 1; + } + state_p->already_running = true; + + if(state_p->lv_timer_run == false) { + state_p->already_running = false; /*Release mutex*/ + return 1; + } + + LV_PROFILER_TIMER_BEGIN; + lv_lock(); + + uint32_t handler_start = lv_tick_get(); + + if(handler_start == 0) { + state.run_cnt++; + if(state.run_cnt > 100) { + state.run_cnt = 0; + LV_LOG_WARN("It seems lv_tick_inc() is not called."); + } + } + + /*Run all timer from the list*/ + lv_timer_t * next; + lv_timer_t * timer_active; + lv_ll_t * timer_head = timer_ll_p; + do { + state_p->timer_deleted = false; + state_p->timer_created = false; + + timer_active = lv_ll_get_head(timer_head); + while(timer_active) { + /*The timer might be deleted if it runs only once ('repeat_count = 1') + *So get next element until the current is surely valid*/ + next = lv_ll_get_next(timer_head, timer_active); + + if(lv_timer_exec(timer_active)) { + /*If a timer was created or deleted then this or the next item might be corrupted*/ + if(state_p->timer_created || state_p->timer_deleted) { + LV_TRACE_TIMER("Start from the first timer again because a timer was created or deleted"); + break; + } + } + + timer_active = next; /*Load the next timer*/ + } + } while(timer_active); + + uint32_t time_until_next = LV_NO_TIMER_READY; + next = lv_ll_get_head(timer_head); + while(next) { + if(!next->paused) { + uint32_t delay = lv_timer_time_remaining(next); + if(delay < time_until_next) + time_until_next = delay; + } + + next = lv_ll_get_next(timer_head, next); /*Find the next timer*/ + } + + state_p->busy_time += lv_tick_elaps(handler_start); + uint32_t idle_period_time = lv_tick_elaps(state_p->idle_period_start); + if(idle_period_time >= IDLE_MEAS_PERIOD) { + state_p->idle_last = (state_p->busy_time * 100) / idle_period_time; /*Calculate the busy percentage*/ + state_p->idle_last = state_p->idle_last > 100 ? 0 : 100 - state_p->idle_last; /*But we need idle time*/ + state_p->busy_time = 0; + state_p->idle_period_start = lv_tick_get(); + } + + state_p->timer_time_until_next = time_until_next; + state_p->already_running = false; /*Release the mutex*/ + + LV_TRACE_TIMER("finished (%" LV_PRIu32 " ms until the next timer call)", time_until_next); + lv_unlock(); + + LV_PROFILER_TIMER_END; + return time_until_next; +} + +LV_ATTRIBUTE_TIMER_HANDLER void lv_timer_periodic_handler(void) +{ + lv_timer_state_t * state_p = &state; + if(lv_tick_elaps(state_p->periodic_last_tick) >= state_p->timer_time_until_next) { + LV_TRACE_TIMER("calling lv_timer_handler()"); + lv_timer_handler(); + state_p->periodic_last_tick = lv_tick_get(); + } +} + +lv_timer_t * lv_timer_create_basic(void) +{ + return lv_timer_create(NULL, DEF_PERIOD, NULL); +} + +lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data) +{ + lv_timer_t * new_timer = NULL; + + new_timer = lv_ll_ins_head(timer_ll_p); + LV_ASSERT_MALLOC(new_timer); + if(new_timer == NULL) return NULL; + + new_timer->period = period; + new_timer->timer_cb = timer_xcb; + new_timer->repeat_count = -1; + new_timer->paused = 0; + new_timer->last_run = lv_tick_get(); + new_timer->user_data = user_data; + new_timer->auto_delete = true; +#if LV_USE_EXT_DATA + new_timer->ext_data.free_cb = NULL; + new_timer->ext_data.data = NULL; +#endif + + state.timer_created = true; + + lv_timer_handler_resume(); + + return new_timer; +} + +void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb) +{ + LV_ASSERT_NULL(timer); + timer->timer_cb = timer_cb; +} + +void lv_timer_delete(lv_timer_t * timer) +{ + lv_ll_remove(timer_ll_p, timer); + state.timer_deleted = true; + +#if LV_USE_EXT_DATA + if(timer->ext_data.free_cb) { + timer->ext_data.free_cb(timer->ext_data.data); + timer->ext_data.data = NULL; + } +#endif + + lv_free(timer); +} + +void lv_timer_pause(lv_timer_t * timer) +{ + LV_ASSERT_NULL(timer); + timer->paused = true; +} + +void lv_timer_resume(lv_timer_t * timer) +{ + LV_ASSERT_NULL(timer); + timer->paused = false; + lv_timer_handler_resume(); +} + +void lv_timer_set_period(lv_timer_t * timer, uint32_t period) +{ + LV_ASSERT_NULL(timer); + timer->period = period; + lv_timer_handler_resume(); +} + +void lv_timer_ready(lv_timer_t * timer) +{ + LV_ASSERT_NULL(timer); + timer->last_run = lv_tick_get() - timer->period - 1; + lv_timer_handler_resume(); +} + +void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count) +{ + LV_ASSERT_NULL(timer); + timer->repeat_count = repeat_count; +} + +void lv_timer_set_auto_delete(lv_timer_t * timer, bool auto_delete) +{ + LV_ASSERT_NULL(timer); + timer->auto_delete = auto_delete; +} + +void lv_timer_set_user_data(lv_timer_t * timer, void * user_data) +{ + LV_ASSERT_NULL(timer); + timer->user_data = user_data; +} + +void lv_timer_reset(lv_timer_t * timer) +{ + LV_ASSERT_NULL(timer); + timer->last_run = lv_tick_get(); + lv_timer_handler_resume(); +} + +void lv_timer_enable(bool en) +{ + state.lv_timer_run = en; + if(en) lv_timer_handler_resume(); +} + +void lv_timer_core_deinit(void) +{ + lv_timer_enable(false); + + lv_ll_clear(timer_ll_p); +} + +uint32_t lv_timer_get_idle(void) +{ + return state.idle_last; +} + +uint32_t lv_timer_get_time_until_next(void) +{ + return state.timer_time_until_next; +} + +lv_timer_t * lv_timer_get_next(lv_timer_t * timer) +{ + if(timer == NULL) return lv_ll_get_head(timer_ll_p); + else return lv_ll_get_next(timer_ll_p, timer); +} + +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t period) +{ + static uint32_t last_tick = 0; + + if(lv_tick_elaps(last_tick) >= period) { + last_tick = lv_tick_get(); + return lv_timer_handler(); + } + return 1; +} + +void * lv_timer_get_user_data(lv_timer_t * timer) +{ + return timer->user_data; +} + +bool lv_timer_get_paused(lv_timer_t * timer) +{ + return timer->paused; +} + +#if LV_USE_EXT_DATA +void lv_timer_set_external_data(lv_timer_t * timer, void * data, void (* free_cb)(void * data)) +{ + if(!timer) { + LV_LOG_WARN("Can't attach external user data and destructor callback to a NULL timer"); + return; + } + + timer->ext_data.data = data; + timer->ext_data.free_cb = free_cb; +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Execute timer if its remaining time is zero + * @param timer pointer to lv_timer + * @return true: execute, false: not executed + */ +static bool lv_timer_exec(lv_timer_t * timer) +{ + if(timer->paused) return false; + + bool exec = false; + if(lv_timer_time_remaining(timer) == 0) { + /* Decrement the repeat count before executing the timer_cb. + * If any timer is deleted `if(timer->repeat_count == 0)` is not executed below + * but at least the repeat count is zero and the timer can be deleted in the next round*/ + int32_t original_repeat_count = timer->repeat_count; + if(timer->repeat_count > 0) timer->repeat_count--; + timer->last_run = lv_tick_get(); + LV_TRACE_TIMER("calling timer callback: %p", *((void **)&timer->timer_cb)); + + if(timer->timer_cb && original_repeat_count != 0) { + LV_PROFILER_TIMER_BEGIN_TAG("timer_cb"); + timer->timer_cb(timer); + LV_PROFILER_TIMER_END_TAG("timer_cb"); + } + + if(!state.timer_deleted) { + LV_TRACE_TIMER("timer callback %p finished", *((void **)&timer->timer_cb)); + } + else { + LV_TRACE_TIMER("timer callback finished"); + } + + LV_ASSERT_MEM_INTEGRITY(); + exec = true; + } + + if(state.timer_deleted == false) { /*The timer might be deleted by itself as well*/ + if(timer->repeat_count == 0) { /*The repeat count is over, delete the timer*/ + if(timer->auto_delete) { + LV_TRACE_TIMER("deleting timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb)); + lv_timer_delete(timer); + } + else { + LV_TRACE_TIMER("pausing timer with %p callback because the repeat count is over", *((void **)&timer->timer_cb)); + lv_timer_pause(timer); + } + } + } + + return exec; +} + +/** + * Find out how much time remains before a timer must be run. + * @param timer pointer to lv_timer + * @return the time remaining, or 0 if it needs to be run again + */ +static uint32_t lv_timer_time_remaining(lv_timer_t * timer) +{ + /*Check if at least 'period' time elapsed*/ + uint32_t elp = lv_tick_elaps(timer->last_run); + if(elp >= timer->period) + return 0; + return timer->period - elp; +} + +/** + * Call the ready lv_timer + */ +static void lv_timer_handler_resume(void) +{ + /*If there is a timer which is ready to run then resume the timer loop*/ + state.timer_time_until_next = 0; + if(state.resume_cb) { + state.resume_cb(state.resume_data); + } +} + +void lv_timer_handler_set_resume_cb(lv_timer_handler_resume_cb_t cb, void * data) +{ + state.resume_cb = cb; + state.resume_data = data; +} diff --git a/inc/lvgl/src/misc/lv_timer.h b/inc/lvgl/src/misc/lv_timer.h new file mode 100644 index 0000000..76644f6 --- /dev/null +++ b/inc/lvgl/src/misc/lv_timer.h @@ -0,0 +1,223 @@ +/** + * @file lv_timer.h + */ + +#ifndef LV_TIMER_H +#define LV_TIMER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../tick/lv_tick.h" +#include "lv_types.h" +#include "lv_ll.h" + +/********************* + * DEFINES + *********************/ +#ifndef LV_ATTRIBUTE_TIMER_HANDLER +#define LV_ATTRIBUTE_TIMER_HANDLER +#endif + +#define LV_NO_TIMER_READY 0xFFFFFFFF + +/********************** + * TYPEDEFS + **********************/ + +/** + * Timers execute this type of functions. + */ +typedef void (*lv_timer_cb_t)(lv_timer_t *); + +/** + * Timer handler resume this type of function. + */ +typedef void (*lv_timer_handler_resume_cb_t)(void * data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Call it periodically to handle lv_timers. + * @return time till it needs to be run next (in ms) + */ +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void); + +/** + * Call it in the super-loop of main() or threads. It will run lv_timer_handler() + * with a given period in ms. You can use it with sleep or delay in OS environment. + * This function is used to simplify the porting. + * @param period the period for running lv_timer_handler() + * @return the time after which it must be called again + */ +LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t period); + +/** + * Call it in the super-loop of main() or threads. It will automatically call lv_timer_handler() at the right time. + * This function is used to simplify the porting. + */ +LV_ATTRIBUTE_TIMER_HANDLER void lv_timer_periodic_handler(void); + +/** + * Set the resume callback to the timer handler + * @param cb the function to call when timer handler is resumed + * @param data pointer to a resume data + */ +void lv_timer_handler_set_resume_cb(lv_timer_handler_resume_cb_t cb, void * data); + +/** + * Create an "empty" timer. It needs to be initialized with at least + * `lv_timer_set_cb` and `lv_timer_set_period` + * @return pointer to the created timer + */ +lv_timer_t * lv_timer_create_basic(void); + +/** + * Create a new lv_timer + * @param timer_xcb a callback to call periodically. + * (the 'x' in the argument name indicates that it's not a fully generic function because it not follows + * the `func_name(object, callback, ...)` convention) + * @param period call period in ms unit + * @param user_data custom parameter + * @return pointer to the new timer + */ +lv_timer_t * lv_timer_create(lv_timer_cb_t timer_xcb, uint32_t period, void * user_data); + +/** + * Delete a lv_timer + * @param timer pointer to an lv_timer + */ +void lv_timer_delete(lv_timer_t * timer); + +/** + * Pause a timer. + * It is typically safe to call from an interrupt handler or a different thread. + * @param timer pointer to an lv_timer + */ +void lv_timer_pause(lv_timer_t * timer); + +/** + * Resume a timer. + * @param timer pointer to an lv_timer + */ +void lv_timer_resume(lv_timer_t * timer); + +/** + * Set the callback to the timer (the function to call periodically) + * @param timer pointer to a timer + * @param timer_cb the function to call periodically + */ +void lv_timer_set_cb(lv_timer_t * timer, lv_timer_cb_t timer_cb); + +/** + * Set new period for a lv_timer + * @param timer pointer to a lv_timer + * @param period the new period + */ +void lv_timer_set_period(lv_timer_t * timer, uint32_t period); + +/** + * Make a lv_timer ready. It will not wait its period. + * @param timer pointer to a lv_timer. + */ +void lv_timer_ready(lv_timer_t * timer); + +/** + * Set the number of times a timer will repeat. + * @param timer pointer to a lv_timer. + * @param repeat_count -1 : infinity; 0 : stop ; n>0: residual times + */ +void lv_timer_set_repeat_count(lv_timer_t * timer, int32_t repeat_count); + +/** + * Set whether a lv_timer will be deleted automatically when it is called `repeat_count` times. + * @param timer pointer to a lv_timer. + * @param auto_delete true: auto delete; false: timer will be paused when it is called `repeat_count` times. + */ +void lv_timer_set_auto_delete(lv_timer_t * timer, bool auto_delete); + +/** + * Set custom parameter to the lv_timer. + * @param timer pointer to a lv_timer. + * @param user_data custom parameter + */ +void lv_timer_set_user_data(lv_timer_t * timer, void * user_data); + +/** + * Reset a lv_timer. + * It will be called the previously set period milliseconds later. + * @param timer pointer to a lv_timer. + */ +void lv_timer_reset(lv_timer_t * timer); + +/** + * Enable or disable the whole lv_timer handling + * @param en true: lv_timer handling is running, false: lv_timer handling is suspended + */ +void lv_timer_enable(bool en); + +/** + * Get idle percentage + * @return the lv_timer idle in percentage + */ +uint32_t lv_timer_get_idle(void); + +/** + * Get the time remaining until the next timer will run + * @return the time remaining in ms + */ +uint32_t lv_timer_get_time_until_next(void); + +/** + * Iterate through the timers + * @param timer NULL to start iteration or the previous return value to get the next timer + * @return the next timer or NULL if there is no more timer + */ +lv_timer_t * lv_timer_get_next(lv_timer_t * timer); + +/** + * Get the user_data passed when the timer was created + * @param timer pointer to the lv_timer + * @return pointer to the user_data + */ +void * lv_timer_get_user_data(lv_timer_t * timer); + +/** + * Get the pause state of a timer + * @param timer pointer to a lv_timer + * @return true: timer is paused; false: timer is running + */ +bool lv_timer_get_paused(lv_timer_t * timer); + +#if LV_USE_EXT_DATA +/** + * @brief Attaches external user data and destructor callback to a timer object + * + * Associates custom user data with an LVGL timer and specifies a destructor function + * that will be automatically invoked when the timer is deleted to properly clean up + * the associated resources. + * + * @param timer Pointer to the timer object + * @param data User-defined data pointer to associate with the timer + * @param destructor Callback function for cleaning up ext_data when timer is deleted. + * Receives ext_data as parameter. NULL means no cleanup required. + */ +void lv_timer_set_external_data(lv_timer_t * timer, void * data, void (* free_cb)(void * data)); +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/inc/lvgl/src/misc/lv_timer_private.h b/inc/lvgl/src/misc/lv_timer_private.h new file mode 100644 index 0000000..713c738 --- /dev/null +++ b/inc/lvgl/src/misc/lv_timer_private.h @@ -0,0 +1,85 @@ +/** + * @file lv_timer_private.h + * + */ + +#ifndef LV_TIMER_PRIVATE_H +#define LV_TIMER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_ext_data.h" +#include "lv_timer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Descriptor of a lv_timer + */ +struct _lv_timer_t { +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif + uint32_t period; /**< How often the timer should run */ + uint32_t last_run; /**< Last time the timer ran */ + lv_timer_cb_t timer_cb; /**< Timer function */ + void * user_data; /**< Custom user data */ + int32_t repeat_count; /**< 1: One time; -1 : infinity; n>0: residual times */ + volatile int paused; + uint32_t auto_delete : 1; +}; + +typedef struct { + lv_ll_t timer_ll; /**< Linked list to store the lv_timers */ + + bool lv_timer_run; + uint8_t idle_last; + bool timer_deleted; + bool timer_created; + volatile uint32_t timer_time_until_next; + + bool already_running; + uint32_t periodic_last_tick; + uint32_t busy_time; + uint32_t idle_period_start; + uint32_t run_cnt; + + lv_timer_handler_resume_cb_t resume_cb; + void * resume_data; +} lv_timer_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Init the lv_timer module + */ +void lv_timer_core_init(void); + +/** + * Deinit the lv_timer module + */ +void lv_timer_core_deinit(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TIMER_PRIVATE_H*/ diff --git a/inc/lvgl/src/misc/lv_tree.c b/inc/lvgl/src/misc/lv_tree.c new file mode 100644 index 0000000..93fcff9 --- /dev/null +++ b/inc/lvgl/src/misc/lv_tree.c @@ -0,0 +1,189 @@ +/** + * @file lv_tree.c + * Tree. + * The nodes are dynamically allocated by the 'lv_mem' module, + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tree.h" +#include "../stdlib/lv_mem.h" +#include "../stdlib/lv_string.h" + +#include "lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define INIT_CHILDREN_CAP 4 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_tree_class_t lv_tree_node_class = { + .base_class = NULL, + .instance_size = sizeof(lv_tree_node_t), + .constructor_cb = NULL, + .destructor_cb = NULL, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +static void _lv_tree_node_construct(const lv_tree_class_t * class_p, lv_tree_node_t * node) +{ + if(node->class_p->base_class) { + const lv_tree_class_t * original_class_p = node->class_p; + + node->class_p = node->class_p->base_class; + + _lv_tree_node_construct(class_p, node); + + node->class_p = original_class_p; + } + + if(node->class_p->constructor_cb) node->class_p->constructor_cb(class_p, node); +} + +static void _lv_tree_node_destruct(lv_tree_node_t * node) +{ + if(node->class_p->destructor_cb) node->class_p->destructor_cb(node->class_p, node); + + if(node->class_p->base_class) { + node->class_p = node->class_p->base_class; + + _lv_tree_node_destruct(node); + } +} + +static uint32_t get_instance_size(const lv_tree_class_t * class_p) +{ + const lv_tree_class_t * base = class_p; + while(base && base->instance_size == 0) + base = base->base_class; + + LV_ASSERT_NULL(base); + + return base->instance_size; +} + +static lv_tree_node_t * _lv_tree_class_create_node(const lv_tree_class_t * class_p, lv_tree_node_t * parent) +{ + uint32_t s = get_instance_size(class_p); + lv_tree_node_t * node = lv_malloc(s); + if(node == NULL) return NULL; + lv_memzero(node, s); + node->class_p = class_p; + node->parent = parent; + node->child_cap = INIT_CHILDREN_CAP; + node->children = lv_malloc(sizeof(lv_tree_node_t *) * node->child_cap); + if(parent != NULL) { + parent->child_cnt++; + if(parent->child_cnt == parent->child_cap) { + parent->child_cap <<= 1; + parent->children = lv_realloc(parent->children, sizeof(lv_tree_node_t *) * parent->child_cap); + } + parent->children[parent->child_cnt - 1] = node; + } + return node; +} + +lv_tree_node_t * lv_tree_node_create(const lv_tree_class_t * class_p, lv_tree_node_t * parent) +{ + LV_ASSERT_NULL(class_p); + lv_tree_node_t * node = _lv_tree_class_create_node(class_p, parent); + LV_ASSERT_NULL(node); + _lv_tree_node_construct(node->class_p, node); + return node; +} + +static bool _lv_tree_node_destructor_cb(const lv_tree_node_t * n, void * user_data) +{ + LV_UNUSED(user_data); + if(n) { + lv_tree_node_t * node = (lv_tree_node_t *)n; + _lv_tree_node_destruct(node); + lv_free(node->children); + lv_free(node); + } + return true; +} + +void lv_tree_node_delete(lv_tree_node_t * node) +{ + if(node) { + if(node->parent) { + /* Remove from parent */ + lv_tree_node_t * parent = node->parent; + for(uint32_t i = 0; i < parent->child_cnt; i++) { + if(parent->children[i] == node) { + parent->children[i] = NULL; + } + } + } + lv_tree_walk(node, LV_TREE_WALK_POST_ORDER, _lv_tree_node_destructor_cb, NULL, NULL, NULL); + } +} + +bool lv_tree_walk(const lv_tree_node_t * node, + lv_tree_walk_mode_t mode, + lv_tree_traverse_cb_t cb, + lv_tree_before_cb_t bcb, + lv_tree_after_cb_t acb, + void * user_data) +{ + if(node && cb) { + if(mode == LV_TREE_WALK_PRE_ORDER) { + if(bcb && !bcb(node, user_data)) { + return false; + } + if(!cb(node, user_data)) { + return false; + } + } + for(uint32_t i = 0; i < node->child_cnt; i++) { + if(!lv_tree_walk(node->children[i], mode, cb, bcb, acb, user_data)) { + return false; + } + } + if(mode == LV_TREE_WALK_PRE_ORDER) { + if(acb) { + acb(node, user_data); + } + } + + if(mode == LV_TREE_WALK_POST_ORDER) { + if(bcb && !bcb(node, user_data)) { + return false; + } + if(!cb(node, user_data)) { + return false; + } + if(acb) { + acb(node, user_data); + } + return true; + } + else { + return true; + } + } + else { + return true; + } +} diff --git a/inc/lvgl/src/misc/lv_tree.h b/inc/lvgl/src/misc/lv_tree.h new file mode 100644 index 0000000..bec73be --- /dev/null +++ b/inc/lvgl/src/misc/lv_tree.h @@ -0,0 +1,109 @@ +/** + * @file lv_tree.h + * Tree. The tree nodes are dynamically allocated by the 'lv_mem' module. + */ + +#ifndef LV_TREE_H +#define LV_TREE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_types.h" + +/********************* + * DEFINES + *********************/ + +#define LV_TREE_NODE(n) ((lv_tree_node_t*)(n)) + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_tree_class_t lv_tree_class_t; +typedef struct _lv_tree_node_t lv_tree_node_t; + +typedef void (*lv_tree_constructor_cb_t)(const lv_tree_class_t * class_p, lv_tree_node_t * node); +typedef void (*lv_tree_destructor_cb_t)(const lv_tree_class_t * class_p, lv_tree_node_t * node); + +/** + * Describe the common methods of every object. + * Similar to a C++ class. + */ +struct _lv_tree_class_t { + const lv_tree_class_t * base_class; + uint32_t instance_size; + lv_tree_constructor_cb_t constructor_cb; + lv_tree_destructor_cb_t destructor_cb; +}; + +/** Description of a tree node*/ +struct _lv_tree_node_t { + lv_tree_node_t * parent; + lv_tree_node_t ** children; + uint32_t child_cnt; + uint32_t child_cap; + const lv_tree_class_t * class_p; +}; + +enum _lv_tree_walk_mode_t { + LV_TREE_WALK_PRE_ORDER = 0, + LV_TREE_WALK_POST_ORDER, +}; +typedef uint8_t lv_tree_walk_mode_t; + +typedef bool (*lv_tree_traverse_cb_t)(const lv_tree_node_t * node, void * user_data); +typedef bool (*lv_tree_before_cb_t)(const lv_tree_node_t * node, void * user_data); +typedef void (*lv_tree_after_cb_t)(const lv_tree_node_t * node, void * user_data); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +extern const lv_tree_class_t lv_tree_node_class; + +/** + * @brief Create a tree node + * @param class_p pointer to a class of the node + * @param parent pointer to the parent node (or NULL if it's the root node) + * @return pointer to the new node + */ +lv_tree_node_t * lv_tree_node_create(const lv_tree_class_t * class_p, lv_tree_node_t * parent); + +/** + * @brief Delete a tree node and all its children recursively + * @param node pointer to the node to delete + */ +void lv_tree_node_delete(lv_tree_node_t * node); + +/** + * @brief Walk the tree recursively and call a callback function on each node + * @param node pointer to the root node of the tree + * @param mode LV_TREE_WALK_PRE_ORDER or LV_TREE_WALK_POST_ORDER + * @param cb callback function to call on each node + * @param bcb callback function to call before visiting a node + * @param acb callback function to call after visiting a node + * @param user_data user data to pass to the callback functions + * @return true: traversal is finished; false: traversal broken + */ +bool lv_tree_walk(const lv_tree_node_t * node, + lv_tree_walk_mode_t mode, + lv_tree_traverse_cb_t cb, + lv_tree_before_cb_t bcb, + lv_tree_after_cb_t acb, + void * user_data); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/inc/lvgl/src/misc/lv_types.h b/inc/lvgl/src/misc/lv_types.h new file mode 100644 index 0000000..7895a9c --- /dev/null +++ b/inc/lvgl/src/misc/lv_types.h @@ -0,0 +1,461 @@ +/** + * @file lv_types.h + * + */ + +#ifndef LV_TYPES_H +#define LV_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#ifndef __ASSEMBLY__ +#include LV_STDINT_INCLUDE +#include LV_STDDEF_INCLUDE +#include LV_STDBOOL_INCLUDE +#include LV_INTTYPES_INCLUDE +#include LV_LIMITS_INCLUDE +#include LV_STDARG_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/*If __UINTPTR_MAX__ or UINTPTR_MAX are available, use them to determine arch size*/ +#if defined(__UINTPTR_MAX__) && __UINTPTR_MAX__ > 0xFFFFFFFF +#define LV_ARCH_64 + +#elif defined(UINTPTR_MAX) && UINTPTR_MAX > 0xFFFFFFFF +#define LV_ARCH_64 + +/*Otherwise use compiler-dependent means to determine arch size*/ +#elif defined(_WIN64) || defined(__x86_64__) || defined(__ppc64__) || defined (__aarch64__) +#define LV_ARCH_64 + +#endif + +#if LV_USE_3DTEXTURE +#if LV_USE_OPENGLES +#define LV_3DTEXTURE_ID_NULL 0u +#endif + +#ifndef LV_3DTEXTURE_ID_NULL +#error enable LV_USE_OPENGLES to use LV_USE_3DTEXTURE +#endif +#endif /*LV_USE_3DTEXTURE*/ + +/********************** + * TYPEDEFS + **********************/ + +/* Exclude C enum and struct definitions when included by assembly code */ +#ifndef __ASSEMBLY__ + +/** + * LVGL error codes. + */ +typedef enum { + LV_RESULT_INVALID = 0, /*Typically indicates that the object is deleted (become invalid) in the action + function or an operation was failed*/ + LV_RESULT_OK, /*The object is valid (no deleted) after the action*/ +} lv_result_t; + +#if defined(__cplusplus) || __STDC_VERSION__ >= 199901L +/*If c99 or newer, use the definition of uintptr_t directly from */ +typedef uintptr_t lv_uintptr_t; +typedef intptr_t lv_intptr_t; + +#else + +/*Otherwise, use the arch size determination*/ +#ifdef LV_ARCH_64 +typedef uint64_t lv_uintptr_t; +typedef int64_t lv_intptr_t; +#else +typedef uint32_t lv_uintptr_t; +typedef int32_t lv_intptr_t; +#endif + +#endif + +#if LV_USE_FLOAT +typedef float lv_value_precise_t; +#else +typedef int32_t lv_value_precise_t; +#endif + +#if LV_USE_3DTEXTURE +#if LV_USE_OPENGLES +typedef unsigned int lv_3dtexture_id_t; +#endif +#endif + +/** + * Typedefs from various lvgl modules. + * They are defined here to avoid circular dependencies. + */ + +typedef struct _lv_obj_t lv_obj_t; + +typedef lv_obj_t * (*lv_screen_create_cb_t)(void); + +typedef uint8_t lv_opa_t; + +typedef uint8_t lv_style_prop_t; + +typedef struct _lv_obj_class_t lv_obj_class_t; + +typedef struct _lv_group_t lv_group_t; + +typedef struct _lv_display_t lv_display_t; + +typedef struct _lv_layer_t lv_layer_t; +typedef struct _lv_draw_unit_t lv_draw_unit_t; +typedef struct _lv_draw_task_t lv_draw_task_t; + +typedef struct _lv_indev_t lv_indev_t; + +typedef struct _lv_event_t lv_event_t; + +typedef struct _lv_timer_t lv_timer_t; + +typedef struct _lv_theme_t lv_theme_t; + +typedef struct _lv_anim_t lv_anim_t; + +typedef struct _lv_anim_timeline_t lv_anim_timeline_t; + +typedef struct _lv_font_t lv_font_t; +typedef struct _lv_font_class_t lv_font_class_t; +typedef struct _lv_font_info_t lv_font_info_t; + +typedef struct _lv_font_manager_t lv_font_manager_t; + +typedef struct _lv_image_decoder_t lv_image_decoder_t; + +typedef struct _lv_image_decoder_dsc_t lv_image_decoder_dsc_t; + +typedef struct _lv_draw_image_dsc_t lv_draw_image_dsc_t; + +typedef struct _lv_fragment_t lv_fragment_t; +typedef struct _lv_fragment_class_t lv_fragment_class_t; +typedef struct _lv_fragment_managed_states_t lv_fragment_managed_states_t; + +typedef struct _lv_profiler_builtin_config_t lv_profiler_builtin_config_t; + +typedef struct _lv_rb_node_t lv_rb_node_t; + +typedef struct _lv_rb_t lv_rb_t; + +typedef struct _lv_color_filter_dsc_t lv_color_filter_dsc_t; + +typedef struct _lv_event_dsc_t lv_event_dsc_t; + +typedef struct _lv_cache_t lv_cache_t; + +typedef struct _lv_cache_entry_t lv_cache_entry_t; + +typedef struct _lv_fs_file_cache_t lv_fs_file_cache_t; + +typedef struct _lv_image_decoder_args_t lv_image_decoder_args_t; + +typedef struct _lv_image_cache_data_t lv_image_cache_data_t; + +typedef struct _lv_image_header_cache_data_t lv_image_header_cache_data_t; + +typedef struct _lv_draw_mask_t lv_draw_mask_t; + +typedef struct _lv_draw_label_hint_t lv_draw_label_hint_t; + +typedef struct _lv_draw_glyph_dsc_t lv_draw_glyph_dsc_t; + +typedef struct _lv_draw_image_sup_t lv_draw_image_sup_t; + +typedef struct _lv_draw_mask_rect_dsc_t lv_draw_mask_rect_dsc_t; + +typedef struct _lv_obj_style_t lv_obj_style_t; + +typedef struct _lv_obj_style_transition_dsc_t lv_obj_style_transition_dsc_t; + +typedef struct _lv_hit_test_info_t lv_hit_test_info_t; + +typedef struct _lv_cover_check_info_t lv_cover_check_info_t; + +typedef struct _lv_obj_spec_attr_t lv_obj_spec_attr_t; + +typedef struct _lv_image_t lv_image_t; + +typedef struct _lv_animimg_t lv_animimg_t; + +typedef struct _lv_arc_t lv_arc_t; + +typedef struct _lv_arclabel_t lv_arclabel_t; + +typedef struct _lv_label_t lv_label_t; + +typedef struct _lv_bar_anim_t lv_bar_anim_t; + +typedef struct _lv_bar_t lv_bar_t; + +typedef struct _lv_button_t lv_button_t; + +typedef struct _lv_buttonmatrix_t lv_buttonmatrix_t; + +typedef struct _lv_calendar_t lv_calendar_t; + +typedef struct _lv_canvas_t lv_canvas_t; + +typedef struct _lv_chart_series_t lv_chart_series_t; + +typedef struct _lv_chart_cursor_t lv_chart_cursor_t; + +typedef struct _lv_chart_t lv_chart_t; + +typedef struct _lv_checkbox_t lv_checkbox_t; + +typedef struct _lv_dropdown_t lv_dropdown_t; + +typedef struct _lv_dropdown_list_t lv_dropdown_list_t; + +typedef struct _lv_imagebutton_src_info_t lv_imagebutton_src_info_t; + +typedef struct _lv_imagebutton_t lv_imagebutton_t; + +typedef struct _lv_keyboard_t lv_keyboard_t; + +typedef struct _lv_led_t lv_led_t; + +typedef struct _lv_line_t lv_line_t; + +typedef struct _lv_menu_load_page_event_data_t lv_menu_load_page_event_data_t; + +typedef struct _lv_menu_history_t lv_menu_history_t; + +typedef struct _lv_menu_t lv_menu_t; + +typedef struct _lv_menu_page_t lv_menu_page_t; + +typedef struct _lv_msgbox_t lv_msgbox_t; + +typedef struct _lv_roller_t lv_roller_t; + +typedef struct _lv_scale_section_t lv_scale_section_t; + +typedef struct _lv_scale_t lv_scale_t; + +typedef struct _lv_slider_t lv_slider_t; + +typedef struct _lv_span_t lv_span_t; + +typedef struct _lv_spangroup_t lv_spangroup_t; + +typedef struct _lv_textarea_t lv_textarea_t; + +typedef struct _lv_spinbox_t lv_spinbox_t; + +typedef struct _lv_switch_t lv_switch_t; + +typedef struct _lv_table_cell_t lv_table_cell_t; + +typedef struct _lv_table_t lv_table_t; + +typedef struct _lv_tabview_t lv_tabview_t; + +typedef struct _lv_tileview_t lv_tileview_t; + +typedef struct _lv_tileview_tile_t lv_tileview_tile_t; + +typedef struct _lv_win_t lv_win_t; + +typedef struct _lv_spinner_t lv_spinner_t; + +typedef struct _lv_3dtexture_t lv_3dtexture_t; + +typedef struct _lv_gltf_t lv_gltf_t; + +typedef struct _lv_gltf_model_t lv_gltf_model_t; + +typedef struct _lv_gltf_model_node_t lv_gltf_model_node_t; + +typedef struct _lv_gltf_environment lv_gltf_environment_t; + +typedef struct _lv_gltf_ibl_sampler lv_gltf_ibl_sampler_t; + +typedef struct _lv_subject_t lv_subject_t; + +typedef struct _lv_observer_t lv_observer_t; + +typedef struct _lv_subject_increment_dsc_t lv_subject_increment_dsc_t; + +typedef struct _lv_monkey_config_t lv_monkey_config_t; + +typedef struct _lv_ime_pinyin_t lv_ime_pinyin_t; + +typedef struct _lv_file_explorer_t lv_file_explorer_t; + +typedef struct _lv_barcode_t lv_barcode_t; + +typedef struct _lv_qrcode_t lv_qrcode_t; + +typedef struct _lv_freetype_outline_vector_t lv_freetype_outline_vector_t; + +typedef struct _lv_freetype_outline_event_param_t lv_freetype_outline_event_param_t; + +typedef struct _lv_fpoint_t lv_fpoint_t; + +typedef struct _lv_matrix_t lv_matrix_t; + +typedef struct _lv_vector_path_t lv_vector_path_t; + +typedef struct _lv_vector_gradient_t lv_vector_gradient_t; + +typedef struct _lv_vector_fill_dsc_t lv_vector_fill_dsc_t; + +typedef struct _lv_vector_stroke_dsc_t lv_vector_stroke_dsc_t; + +typedef struct _lv_vector_path_ctx_t lv_vector_path_ctx_t; + +typedef struct _lv_draw_vector_dsc_t lv_draw_vector_dsc_t; + +typedef struct _lv_xkb_t lv_xkb_t; + +typedef struct _lv_libinput_event_t lv_libinput_event_t; + +typedef struct _lv_libinput_t lv_libinput_t; + +typedef struct _lv_draw_sw_unit_t lv_draw_sw_unit_t; + +typedef struct _lv_draw_sw_mask_common_dsc_t lv_draw_sw_mask_common_dsc_t; + +typedef struct _lv_draw_sw_mask_line_param_t lv_draw_sw_mask_line_param_t; + +typedef struct _lv_draw_sw_mask_angle_param_t lv_draw_sw_mask_angle_param_t; + +typedef struct _lv_draw_sw_mask_radius_param_t lv_draw_sw_mask_radius_param_t; + +typedef struct _lv_draw_sw_mask_fade_param_t lv_draw_sw_mask_fade_param_t; + +typedef struct _lv_draw_sw_mask_map_param_t lv_draw_sw_mask_map_param_t; + +typedef struct _lv_draw_sw_blend_dsc_t lv_draw_sw_blend_dsc_t; + +typedef struct _lv_draw_sw_blend_fill_dsc_t lv_draw_sw_blend_fill_dsc_t; + +typedef struct _lv_draw_sw_blend_image_dsc_t lv_draw_sw_blend_image_dsc_t; + +typedef struct _lv_draw_buf_handlers_t lv_draw_buf_handlers_t; + +typedef struct _lv_rlottie_t lv_rlottie_t; + +typedef struct _lv_ffmpeg_player_t lv_ffmpeg_player_t; + +typedef struct _lv_opengles_window_t lv_opengles_window_t; +typedef struct _lv_opengles_window_texture_t lv_opengles_window_texture_t; + +typedef uint32_t lv_prop_id_t; + +typedef struct _lv_array_t lv_array_t; + +typedef struct _lv_iter_t lv_iter_t; + +typedef struct _lv_circle_buf_t lv_circle_buf_t; + +typedef struct _lv_draw_buf_t lv_draw_buf_t; + +#if LV_USE_OBJ_PROPERTY +typedef struct _lv_property_name_t lv_property_name_t; +#endif + +#if LV_USE_SYSMON + +typedef struct _lv_sysmon_backend_data_t lv_sysmon_backend_data_t; + +#if LV_USE_PERF_MONITOR +typedef struct _lv_sysmon_perf_info_t lv_sysmon_perf_info_t; +#endif /*LV_USE_PERF_MONITOR*/ + +#endif /*LV_USE_SYSMON*/ + + +#if LV_USE_EVDEV +typedef struct _lv_evdev_discovery_t lv_evdev_discovery_t; +#endif + +#if LV_USE_TRANSLATION +typedef struct _lv_translation_tag_dsc_t lv_translation_tag_dsc_t; + +typedef struct _lv_translation_pack_t lv_translation_pack_t; +#endif + +#if LV_USE_DRAW_EVE +typedef struct _lv_draw_eve_unit_t lv_draw_eve_unit_t; +#endif + +#endif /*__ASSEMBLY__*/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#define LV_UNUSED(x) ((void)x) + +#define _LV_CONCAT(x, y) x ## y +#define LV_CONCAT(x, y) _LV_CONCAT(x, y) +#undef _LV_CONCAT + +#define _LV_CONCAT3(x, y, z) x ## y ## z +#define LV_CONCAT3(x, y, z) _LV_CONCAT3(x, y, z) +#undef _LV_CONCAT3 + +#if defined(PYCPARSER) || defined(__CC_ARM) +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) +#elif defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 4) || __GNUC__ > 4) +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) __attribute__((format(gnu_printf, fmtstr, vararg))) +#elif (defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) || defined(__IAR_SYSTEMS_ICC__)) +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) __attribute__((format(printf, fmtstr, vararg))) +#else +#define LV_FORMAT_ATTRIBUTE(fmtstr, vararg) +#endif + +#ifndef LV_NORETURN +#if defined(PYCPARSER) +#define LV_NORETURN +#elif defined(__GNUC__) +#define LV_NORETURN __attribute__((noreturn)) +#elif defined(_MSC_VER) +#define LV_NORETURN __declspec(noreturn) +#else +#define LV_NORETURN +#endif +#endif /* LV_NORETURN not defined */ + +#ifndef LV_UNREACHABLE +#if defined(__GNUC__) +#define LV_UNREACHABLE() __builtin_unreachable() +#elif defined(_MSC_VER) +#define LV_UNREACHABLE() __assume(0) +#else +#define LV_UNREACHABLE() while(1) +#endif +#endif /* LV_UNREACHABLE not defined */ + +#ifndef LV_ARRAYLEN +#define LV_ARRAYLEN(a) (sizeof(a)/sizeof((a)[0])) +#endif /*LV_ARRAYLEN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TYPES_H*/ diff --git a/inc/lvgl/src/misc/lv_utils.c b/inc/lvgl/src/misc/lv_utils.c new file mode 100644 index 0000000..0a4e626 --- /dev/null +++ b/inc/lvgl/src/misc/lv_utils.c @@ -0,0 +1,95 @@ +/** + * @file lv_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_utils.h" +#include "lv_fs.h" +#include "lv_types.h" +#include "cache/lv_cache.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * lv_utils_bsearch(const void * key, const void * base, size_t n, size_t size, + int (*cmp)(const void * pRef, const void * pElement)) +{ + const char * middle; + int32_t c; + + for(middle = base; n != 0;) { + middle += (n / 2) * size; + if((c = (*cmp)(key, middle)) > 0) { + n = (n / 2) - ((n & 1) == 0); + base = (middle += size); + } + else if(c < 0) { + n /= 2; + middle = base; + } + else { + return (char *)middle; + } + } + return NULL; +} + +lv_result_t lv_draw_buf_save_to_file(const lv_draw_buf_t * draw_buf, const char * path) +{ + lv_fs_file_t file; + lv_fs_res_t res = lv_fs_open(&file, path, LV_FS_MODE_WR); + if(res != LV_FS_RES_OK) { + LV_LOG_ERROR("create file %s failed", path); + return LV_RESULT_INVALID; + } + + /*Image content modified, invalidate image cache.*/ + lv_image_cache_drop(path); + + uint32_t bw; + res = lv_fs_write(&file, &draw_buf->header, sizeof(draw_buf->header), &bw); + if(res != LV_FS_RES_OK || bw != sizeof(draw_buf->header)) { + LV_LOG_ERROR("write draw_buf->header failed"); + lv_fs_close(&file); + return LV_RESULT_INVALID; + } + + res = lv_fs_write(&file, draw_buf->data, draw_buf->data_size, &bw); + if(res != LV_FS_RES_OK || bw != draw_buf->data_size) { + LV_LOG_ERROR("write draw_buf->data failed"); + lv_fs_close(&file); + return LV_RESULT_INVALID; + } + + lv_fs_close(&file); + LV_LOG_TRACE("saved draw_buf to %s", path); + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/misc/lv_utils.h b/inc/lvgl/src/misc/lv_utils.h new file mode 100644 index 0000000..9f30251 --- /dev/null +++ b/inc/lvgl/src/misc/lv_utils.h @@ -0,0 +1,91 @@ +/** + * @file lv_utils.h + * + */ + +#ifndef LV_UTILS_H +#define LV_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_types.h" +#include "../draw/lv_draw_buf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** Searches base[0] to base[n - 1] for an item that matches *key. + * + * @note The function cmp must return negative if it's first + * argument (the search key) is less that it's second (a table entry), + * zero if equal, and positive if greater. + * + * @note Items in the array must be in ascending order. + * + * @param key Pointer to item being searched for + * @param base Pointer to first element to search + * @param n Number of elements + * @param size Size of each element + * @param cmp Pointer to comparison function (see unicode_list_compare() + * as a comparison function example) + * + * @return a pointer to a matching item, or NULL if none exists. + */ +void * lv_utils_bsearch(const void * key, const void * base, size_t n, size_t size, + int (*cmp)(const void * pRef, const void * pElement)); + +/** + * Save a draw buf to a file + * @param draw_buf pointer to a draw buffer + * @param path path to the file to save + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: error + */ +lv_result_t lv_draw_buf_save_to_file(const lv_draw_buf_t * draw_buf, const char * path); + +/** + * Reverse the order of the bytes in a 32-bit value. + * @param x a 32-bit value. + * @return the value `x` with reversed byte-order. + */ +static inline uint32_t lv_swap_bytes_32(uint32_t x) +{ + return (x << 24) + | ((x & 0x0000ff00U) << 8) + | ((x & 0x00ff0000U) >> 8) + | (x >> 24); +} + +/** + * Reverse the order of the bytes in a 16-bit value. + * @param x a 16-bit value. + * @return the value `x` with reversed byte-order. + */ +static inline uint16_t lv_swap_bytes_16(uint16_t x) +{ + return (x << 8) | (x >> 8); +} + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/inc/lvgl/src/osal/lv_cmsis_rtos2.c b/inc/lvgl/src/osal/lv_cmsis_rtos2.c new file mode 100644 index 0000000..7eb8983 --- /dev/null +++ b/inc/lvgl/src/osal/lv_cmsis_rtos2.c @@ -0,0 +1,207 @@ +/** + * @file lv_cmsis_rtos2.c + * + */ + +/* + * Copyright (C) 2023 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os_private.h" + +#if LV_USE_OS == LV_OS_CMSIS_RTOS2 + +#include "../misc/lv_log.h" +#include "../misc/lv_timer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, const char * const name, lv_thread_prio_t prio, + void (*callback)(void *), size_t stack_size, + void * user_data) +{ + LV_UNUSED(name); + static const osPriority_t prio_map[] = { + [LV_THREAD_PRIO_LOWEST] = osPriorityLow, + [LV_THREAD_PRIO_LOW] = osPriorityBelowNormal, + [LV_THREAD_PRIO_MID] = osPriorityNormal, + [LV_THREAD_PRIO_HIGH] = osPriorityHigh, + [LV_THREAD_PRIO_HIGHEST] = osPriorityRealtime7, + }; + + osThreadAttr_t c_tThreadAttribute = { + .stack_size = stack_size, + .priority = prio_map[prio], + }; + + *thread = osThreadNew(callback, user_data, &c_tThreadAttribute); + + if(NULL == *thread) { + LV_LOG_WARN("Error: Failed to create a cmsis-rtos2 thread."); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; + +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + osThreadDetach(*thread); + osStatus_t status = osThreadTerminate(*thread); + if(status == osOK) { + return LV_RESULT_OK; + } + return LV_RESULT_INVALID; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + const osMutexAttr_t Thread_Mutex_attr = { + "LVGLMutex", + osMutexRecursive | osMutexPrioInherit | osMutexRobust, + }; + + *mutex = osMutexNew(&Thread_Mutex_attr); + if(*mutex == NULL) { + LV_LOG_WARN("Error: failed to create cmsis-rtos mutex"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; + +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + osStatus_t status = osMutexAcquire(*mutex, 0U); + if(status != osOK) { + LV_LOG_WARN("Error: failed to lock cmsis-rtos2 mutex %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + osStatus_t status = osMutexAcquire(*mutex, 0U); + if(status != osOK) { + LV_LOG_WARN("Error: failed to lock cmsis-rtos2 mutex in an ISR %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + osStatus_t status = osMutexRelease(*mutex); + if(status != osOK) { + LV_LOG_WARN("Error: failed to release cmsis-rtos2 mutex %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + osStatus_t status = osMutexDelete(*mutex); + if(status != osOK) { + LV_LOG_WARN("Error: failed to delete cmsis-rtos2 mutex %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + *sync = osEventFlagsNew(NULL); + if(NULL == *sync) { + LV_LOG_WARN("Error: failed to create a cmsis-rtos2 EventFlag"); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + uint32_t ret = osEventFlagsWait(*sync, 0x01, osFlagsWaitAny, osWaitForever); + if(ret & (1 << 31)) { + LV_LOG_WARN("Error: failed to wait a cmsis-rtos2 EventFlag %d", ret); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + uint32_t ret = osEventFlagsSet(*sync, 0x01); + if(ret & (1 << 31)) { + LV_LOG_WARN("Error: failed to set a cmsis-rtos2 EventFlag %d", ret); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) +{ + return lv_thread_sync_signal(sync); +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + osStatus_t status = osEventFlagsDelete(*sync); + if(status != osOK) { + LV_LOG_WARN("Error: failed to delete a cmsis-rtos2 EventFlag %d", (int)status); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +uint32_t lv_os_get_idle_percent(void) +{ + return lv_timer_get_idle(); +} + +void lv_sleep_ms(uint32_t ms) +{ + osDelay(ms); +} +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_OS == LV_OS_CMSIS_RTOS2*/ diff --git a/inc/lvgl/src/osal/lv_cmsis_rtos2.h b/inc/lvgl/src/osal/lv_cmsis_rtos2.h new file mode 100644 index 0000000..ae4f94f --- /dev/null +++ b/inc/lvgl/src/osal/lv_cmsis_rtos2.h @@ -0,0 +1,53 @@ +/** + * @file lv_cmsis_rtos2.h + * + */ + +/* + * Copyright (C) 2023 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef LV_CMSIS_RTOS2_H +#define LV_CMSIS_RTOS2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_CMSIS_RTOS2 + +#include "cmsis_os2.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef osThreadId_t lv_thread_t; + +typedef osMutexId_t lv_mutex_t; + +typedef osEventFlagsId_t lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_CMSIS_RTOS2*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CMSIS_RTOS2_H*/ diff --git a/inc/lvgl/src/osal/lv_freertos.c b/inc/lvgl/src/osal/lv_freertos.c new file mode 100644 index 0000000..a8545c1 --- /dev/null +++ b/inc/lvgl/src/osal/lv_freertos.c @@ -0,0 +1,568 @@ +/** + * @file lv_freertos.c + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os_private.h" +#if LV_USE_OS == LV_OS_FREERTOS + +#include "atomic.h" + +#include "../tick/lv_tick.h" +#include "../misc/lv_log.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +#define ulMAX_COUNT 10U + +#define globals LV_GLOBAL_DEFAULT() + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void prvRunThread(void * pxArg); + +static void prvMutexInit(lv_mutex_t * pxMutex); + +static void prvCheckMutexInit(lv_mutex_t * pxMutex); + +static void prvCondInit(lv_thread_sync_t * pxCond); + +static void prvCheckCondInit(lv_thread_sync_t * pxCond); + +static void prvCheckCondInitIsr(lv_thread_sync_t * pxCond); + +#if !LV_USE_FREERTOS_TASK_NOTIFY +static void prvTestAndDecrement(lv_thread_sync_t * pxCond, + uint32_t ulLocalWaitingThreads); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +#ifdef ESP_PLATFORM + static portMUX_TYPE critSectionMux = portMUX_INITIALIZER_UNLOCKED; +#endif + +/********************** + * MACROS + **********************/ + +#ifdef ESP_PLATFORM + #define _enter_critical() taskENTER_CRITICAL(&critSectionMux); + #define _exit_critical() taskEXIT_CRITICAL(&critSectionMux); + #define _enter_critical_isr() taskENTER_CRITICAL_FROM_ISR(); + #define _exit_critical_isr(x) taskEXIT_CRITICAL_FROM_ISR(x); +#else + #define _enter_critical() taskENTER_CRITICAL(); + #define _exit_critical() taskEXIT_CRITICAL(); + #define _enter_critical_isr() taskENTER_CRITICAL_FROM_ISR(); + #define _exit_critical_isr(x) taskEXIT_CRITICAL_FROM_ISR(x); +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * pxThread, const char * const name, + lv_thread_prio_t xSchedPriority, + void (*pvStartRoutine)(void *), size_t usStackSize, + void * xAttr) +{ + pxThread->pTaskArg = xAttr; + pxThread->pvStartRoutine = pvStartRoutine; + + BaseType_t xTaskCreateStatus = xTaskCreate( + prvRunThread, + name, + (configSTACK_DEPTH_TYPE)(usStackSize / sizeof(StackType_t)), + (void *)pxThread, + tskIDLE_PRIORITY + xSchedPriority, + &pxThread->xTaskHandle); + + /* Ensure that the FreeRTOS task was successfully created. */ + if(xTaskCreateStatus != pdPASS) { + LV_LOG_ERROR("xTaskCreate failed!"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_delete(lv_thread_t * pxThread) +{ + vTaskDelete(pxThread->xTaskHandle); + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_init(lv_mutex_t * pxMutex) +{ + /* If mutex in uninitialized, perform initialization. */ + prvCheckMutexInit(pxMutex); + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock(lv_mutex_t * pxMutex) +{ + /* If mutex in uninitialized, perform initialization. */ + prvCheckMutexInit(pxMutex); + + BaseType_t xMutexTakeStatus = xSemaphoreTakeRecursive(pxMutex->xMutex, portMAX_DELAY); + if(xMutexTakeStatus != pdTRUE) { + LV_LOG_ERROR("xSemaphoreTake failed!"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * pxMutex) +{ + /* If mutex in uninitialized, perform initialization. */ + prvCheckMutexInit(pxMutex); + + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + BaseType_t xMutexTakeStatus = xSemaphoreTakeFromISR(pxMutex->xMutex, &xHigherPriorityTaskWoken); + if(xMutexTakeStatus != pdTRUE) { + LV_LOG_ERROR("xSemaphoreTake failed!"); + return LV_RESULT_INVALID; + } + + /* If xHigherPriorityTaskWoken is now set to pdTRUE then a context switch + should be performed to ensure the interrupt returns directly to the highest + priority task. The macro used for this purpose is dependent on the port in + use and may be called portEND_SWITCHING_ISR(). */ + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * pxMutex) +{ + /* If mutex in uninitialized, perform initialization. */ + prvCheckMutexInit(pxMutex); + + BaseType_t xMutexGiveStatus = xSemaphoreGiveRecursive(pxMutex->xMutex); + if(xMutexGiveStatus != pdTRUE) { + LV_LOG_ERROR("xSemaphoreGive failed!"); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_delete(lv_mutex_t * pxMutex) +{ + if(pxMutex->xIsInitialized == pdFALSE) + return LV_RESULT_INVALID; + vSemaphoreDelete(pxMutex->xMutex); + pxMutex->xIsInitialized = pdFALSE; + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * pxCond) +{ + /* If the cond is uninitialized, perform initialization. */ + prvCheckCondInit(pxCond); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * pxCond) +{ + lv_result_t lvRes = LV_RESULT_OK; + + /* If the cond is uninitialized, perform initialization. */ + prvCheckCondInit(pxCond); + +#if LV_USE_FREERTOS_TASK_NOTIFY + TaskHandle_t xCurrentTaskHandle = xTaskGetCurrentTaskHandle(); + + _enter_critical(); + BaseType_t xSyncSygnal = pxCond->xSyncSignal; + pxCond->xSyncSignal = pdFALSE; + if(xSyncSygnal == pdFALSE) { + /* The signal hasn't been sent yet. Tell the sender to notify this task */ + pxCond->xTaskToNotify = xCurrentTaskHandle; + } + /* If we have a signal from the other task, we should not ask to be notified */ + _exit_critical(); + + if(xSyncSygnal == pdFALSE) { + /* Wait for other task to notify this task. */ + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + } + /* If the signal was received, no wait needs to be done */ +#else + uint32_t ulLocalWaitingThreads; + + /* Acquire the mutex. */ + xSemaphoreTake(pxCond->xSyncMutex, portMAX_DELAY); + + while(!pxCond->xSyncSignal) { + /* Increase the counter of threads blocking on condition variable, then + * release the mutex. */ + + /* Atomically increments thread waiting by 1, and + * stores number of threads waiting before increment. */ + ulLocalWaitingThreads = Atomic_Increment_u32(&pxCond->ulWaitingThreads); + + BaseType_t xMutexStatus = xSemaphoreGive(pxCond->xSyncMutex); + + /* Wait on the condition variable. */ + if(xMutexStatus == pdTRUE) { + BaseType_t xCondWaitStatus = xSemaphoreTake( + pxCond->xCondWaitSemaphore, + portMAX_DELAY); + + /* Relock the mutex. */ + xSemaphoreTake(pxCond->xSyncMutex, portMAX_DELAY); + + if(xCondWaitStatus != pdTRUE) { + LV_LOG_ERROR("xSemaphoreTake(xCondWaitSemaphore) failed!"); + lvRes = LV_RESULT_INVALID; + + /* Atomically decrements thread waiting by 1. + * If iLocalWaitingThreads is updated by other thread(s) in between, + * this implementation guarantees to decrement by 1 based on the + * value currently in pxCond->ulWaitingThreads. */ + prvTestAndDecrement(pxCond, ulLocalWaitingThreads + 1); + } + } + else { + LV_LOG_ERROR("xSemaphoreGive(xSyncMutex) failed!"); + lvRes = LV_RESULT_INVALID; + + /* Atomically decrements thread waiting by 1. + * If iLocalWaitingThreads is updated by other thread(s) in between, + * this implementation guarantees to decrement by 1 based on the + * value currently in pxCond->ulWaitingThreads. */ + prvTestAndDecrement(pxCond, ulLocalWaitingThreads + 1); + } + } + + pxCond->xSyncSignal = pdFALSE; + + /* Release the mutex. */ + xSemaphoreGive(pxCond->xSyncMutex); +#endif + + return lvRes; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * pxCond) +{ + /* If the cond is uninitialized, perform initialization. */ + prvCheckCondInit(pxCond); + +#if LV_USE_FREERTOS_TASK_NOTIFY + _enter_critical(); + TaskHandle_t xTaskToNotify = pxCond->xTaskToNotify; + pxCond->xTaskToNotify = NULL; + if(xTaskToNotify == NULL) { + /* No task waiting to be notified. Send this signal for later */ + pxCond->xSyncSignal = pdTRUE; + } + /* If a task is already waiting, there is no need to set the sync signal */ + _exit_critical(); + + if(xTaskToNotify != NULL) { + /* There is a task waiting. Send a notification to it */ + xTaskNotifyGive(xTaskToNotify); + } + /* If there was no task waiting to be notified, we sent a signal for it to see later. */ +#else + /* Acquire the mutex. */ + xSemaphoreTake(pxCond->xSyncMutex, portMAX_DELAY); + + pxCond->xSyncSignal = pdTRUE; + + /* Local copy of number of threads waiting. */ + uint32_t ulLocalWaitingThreads = pxCond->ulWaitingThreads; + + /* Test local copy of threads waiting is larger than zero. */ + while(ulLocalWaitingThreads > 0) { + /* Atomically check whether the copy in memory has changed. + * If not, set the copy of threads waiting in memory to zero. */ + if(ATOMIC_COMPARE_AND_SWAP_SUCCESS == Atomic_CompareAndSwap_u32( + &pxCond->ulWaitingThreads, + 0, + ulLocalWaitingThreads)) { + /* Unblock all. */ + for(uint32_t i = 0; i < ulLocalWaitingThreads; i++) { + xSemaphoreGive(pxCond->xCondWaitSemaphore); + } + + break; + } + + /* Local copy is out dated. Reload from memory and retry. */ + ulLocalWaitingThreads = pxCond->ulWaitingThreads; + } + + /* Release the mutex. */ + xSemaphoreGive(pxCond->xSyncMutex); +#endif + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * pxCond) +{ +#if !LV_USE_FREERTOS_TASK_NOTIFY + /* Cleanup all resources used by the cond. */ + vSemaphoreDelete(pxCond->xCondWaitSemaphore); + vSemaphoreDelete(pxCond->xSyncMutex); + pxCond->ulWaitingThreads = 0; +#endif + pxCond->xSyncSignal = pdFALSE; + pxCond->xIsInitialized = pdFALSE; + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * pxCond) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + /* If the cond is uninitialized, perform initialization. */ + prvCheckCondInitIsr(pxCond); + +#if LV_USE_FREERTOS_TASK_NOTIFY + uint32_t mask = _enter_critical_isr(); + TaskHandle_t xTaskToNotify = pxCond->xTaskToNotify; + pxCond->xTaskToNotify = NULL; + if(xTaskToNotify == NULL) { + /* No task waiting to be notified. Send this signal for later */ + pxCond->xSyncSignal = pdTRUE; + } + /* If a task is already waiting, there is no need to set the sync signal */ + _exit_critical_isr(mask); + + if(xTaskToNotify != NULL) { + /* There is a task waiting. Send a notification to it */ + vTaskNotifyGiveFromISR(xTaskToNotify, &xHigherPriorityTaskWoken); + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + /* If there was no task waiting to be notified, we sent a signal for it to see later. */ +#else + /* Enter critical section to prevent preemption. */ + uint32_t mask = _enter_critical_isr(); + + pxCond->xSyncSignal = pdTRUE; + BaseType_t xAnyHigherPriorityTaskWoken = pdFALSE; + + /* Unblock all. */ + for(uint32_t i = 0; i < pxCond->ulWaitingThreads; i++) { + xSemaphoreGiveFromISR(pxCond->xCondWaitSemaphore, &xAnyHigherPriorityTaskWoken); + xHigherPriorityTaskWoken |= xAnyHigherPriorityTaskWoken; + } + + _exit_critical_isr(mask); + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +#endif + + return LV_RESULT_OK; +} + + +void lv_freertos_task_switch_in(const char * name) +{ + if(lv_strcmp(name, "IDLE")) globals->freertos_idle_task_running = false; + else globals->freertos_idle_task_running = true; + + globals->freertos_task_switch_timestamp = lv_tick_get(); +} + +void lv_freertos_task_switch_out(void) +{ + uint32_t elaps = lv_tick_elaps(globals->freertos_task_switch_timestamp); + if(globals->freertos_idle_task_running) globals->freertos_idle_time_sum += elaps; + else globals->freertos_non_idle_time_sum += elaps; +} + +uint32_t lv_os_get_idle_percent(void) +{ + if(globals->freertos_non_idle_time_sum + globals->freertos_idle_time_sum == 0) { + LV_LOG_WARN("Not enough time elapsed to provide idle percentage"); + return 0; + } + + uint32_t pct = (globals->freertos_idle_time_sum * 100) / (globals->freertos_idle_time_sum + + globals->freertos_non_idle_time_sum); + + globals->freertos_non_idle_time_sum = 0; + globals->freertos_idle_time_sum = 0; + + return pct; +} + +void lv_sleep_ms(uint32_t ms) +{ + vTaskDelay(ms / portTICK_PERIOD_MS); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void prvRunThread(void * pxArg) +{ + lv_thread_t * pxThread = (lv_thread_t *)pxArg; + + /* Run the thread routine. */ + pxThread->pvStartRoutine((void *)pxThread->pTaskArg); + + vTaskDelete(NULL); +} + +static void prvMutexInit(lv_mutex_t * pxMutex) +{ + pxMutex->xMutex = xSemaphoreCreateRecursiveMutex(); + + /* Ensure that the FreeRTOS mutex was successfully created. */ + if(pxMutex->xMutex == NULL) { + LV_LOG_ERROR("xSemaphoreCreateMutex failed!"); + return; + } + + /* Mutex successfully created. */ + pxMutex->xIsInitialized = pdTRUE; +} + +static void prvCheckMutexInit(lv_mutex_t * pxMutex) +{ + /* Check if the mutex needs to be initialized. */ + if(pxMutex->xIsInitialized == pdFALSE) { + /* Mutex initialization must be in a critical section to prevent two threads + * from initializing it at the same time. */ + _enter_critical(); + + /* Check again that the mutex is still uninitialized, i.e. it wasn't + * initialized while this function was waiting to enter the critical + * section. */ + if(pxMutex->xIsInitialized == pdFALSE) { + prvMutexInit(pxMutex); + } + + /* Exit the critical section. */ + _exit_critical(); + } +} + +static void prvCondInit(lv_thread_sync_t * pxCond) +{ + pxCond->xIsInitialized = pdTRUE; + pxCond->xSyncSignal = pdFALSE; + +#if LV_USE_FREERTOS_TASK_NOTIFY + pxCond->xTaskToNotify = NULL; +#else + pxCond->xCondWaitSemaphore = xSemaphoreCreateCounting(ulMAX_COUNT, 0U); + + /* Ensure that the FreeRTOS semaphore was successfully created. */ + if(pxCond->xCondWaitSemaphore == NULL) { + LV_LOG_ERROR("xSemaphoreCreateCounting failed!"); + return; + } + + pxCond->xSyncMutex = xSemaphoreCreateMutex(); + + /* Ensure that the FreeRTOS mutex was successfully created. */ + if(pxCond->xSyncMutex == NULL) { + LV_LOG_ERROR("xSemaphoreCreateMutex failed!"); + /* Cleanup. */ + vSemaphoreDelete(pxCond->xCondWaitSemaphore); + return; + } + + /* Condition variable successfully created. */ + pxCond->ulWaitingThreads = 0; +#endif +} + +static void prvCheckCondInit(lv_thread_sync_t * pxCond) +{ + /* Check if the condition variable needs to be initialized. */ + if(pxCond->xIsInitialized == pdFALSE) { + /* Cond initialization must be in a critical section to prevent two + * threads from initializing it at the same time. */ + _enter_critical(); + + /* Check again that the condition is still uninitialized, i.e. it wasn't + * initialized while this function was waiting to enter the critical + * section. */ + if(pxCond->xIsInitialized == pdFALSE) { + prvCondInit(pxCond); + } + + /* Exit the critical section. */ + _exit_critical(); + } +} + +static void prvCheckCondInitIsr(lv_thread_sync_t * pxCond) +{ + /* Check if the condition variable needs to be initialized. */ + if(pxCond->xIsInitialized == pdFALSE) { + /* Cond initialization must be in a critical section to prevent two + * threads from initializing it at the same time. */ + uint32_t mask = _enter_critical_isr(); + + /* Check again that the condition is still uninitialized, i.e. it wasn't + * initialized while this function was waiting to enter the critical + * section. */ + if(pxCond->xIsInitialized == pdFALSE) { + prvCondInit(pxCond); + } + + /* Exit the critical section. */ + _exit_critical_isr(mask); + } +} + +#if !LV_USE_FREERTOS_TASK_NOTIFY +static void prvTestAndDecrement(lv_thread_sync_t * pxCond, + uint32_t ulLocalWaitingThreads) +{ + /* Test local copy of threads waiting is larger than zero. */ + while(ulLocalWaitingThreads > 0) { + /* Atomically check whether the copy in memory has changed. + * If not, decrease the copy of threads waiting in memory. */ + if(ATOMIC_COMPARE_AND_SWAP_SUCCESS == Atomic_CompareAndSwap_u32( + &pxCond->ulWaitingThreads, + ulLocalWaitingThreads - 1, + ulLocalWaitingThreads)) { + /* Signal one succeeded. Break. */ + break; + } + + /* Local copy may be out dated. Reload from memory and retry. */ + ulLocalWaitingThreads = pxCond->ulWaitingThreads; + } +} +#endif + +#endif /*LV_USE_OS == LV_OS_FREERTOS*/ diff --git a/inc/lvgl/src/osal/lv_freertos.h b/inc/lvgl/src/osal/lv_freertos.h new file mode 100644 index 0000000..96196b7 --- /dev/null +++ b/inc/lvgl/src/osal/lv_freertos.h @@ -0,0 +1,98 @@ +/** + * @file lv_freertos.h + * + */ + +/** + * Copyright 2023 NXP + * + * SPDX-License-Identifier: MIT + */ + +#ifndef LV_FREERTOS_H +#define LV_FREERTOS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_os_private.h" + +#if LV_USE_OS == LV_OS_FREERTOS + +#ifdef ESP_PLATFORM +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#else +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + void (*pvStartRoutine)(void *); /**< Application thread function. */ + void * pTaskArg; /**< Arguments for application thread function. */ + TaskHandle_t xTaskHandle; /**< FreeRTOS task handle. */ +} lv_thread_t; + +typedef struct { + BaseType_t xIsInitialized; /**< Set to pdTRUE if this mutex is initialized, pdFALSE otherwise. */ + SemaphoreHandle_t xMutex; /**< FreeRTOS mutex. */ +} lv_mutex_t; + +typedef struct { + BaseType_t + xIsInitialized; /**< Set to pdTRUE if this condition variable is initialized, pdFALSE otherwise. */ + BaseType_t xSyncSignal; /**< Set to pdTRUE if the thread is signaled, pdFALSE otherwise. */ +#if LV_USE_FREERTOS_TASK_NOTIFY + TaskHandle_t xTaskToNotify; /**< The task waiting to be signalled. NULL if nothing is waiting. */ +#else + SemaphoreHandle_t xCondWaitSemaphore; /**< Threads block on this semaphore in lv_thread_sync_wait. */ + uint32_t ulWaitingThreads; /**< The number of threads currently waiting on this condition variable. */ + SemaphoreHandle_t xSyncMutex; /**< Threads take this mutex before accessing the condition variable. */ +#endif +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Set it for `traceTASK_SWITCHED_IN()` as + * `lv_freertos_task_switch_in(pxCurrentTCB->pcTaskName)` + * to save the start time stamp of a task + * @param name the name of the which is switched in + */ +void lv_freertos_task_switch_in(const char * name); + +/** + * Set it for `traceTASK_SWITCHED_OUT()` as + * `lv_freertos_task_switch_out()` + * to save finish time stamp of a task + */ +void lv_freertos_task_switch_out(void); + + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_FREERTOS*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FREERTOS_H*/ diff --git a/inc/lvgl/src/osal/lv_linux.c b/inc/lvgl/src/osal/lv_linux.c new file mode 100644 index 0000000..99ea96d --- /dev/null +++ b/inc/lvgl/src/osal/lv_linux.c @@ -0,0 +1,220 @@ +/** + * @file lv_linux.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_os_private.h" + +#if defined(__linux__) + +#include "../core/lv_global.h" +#include "../misc/lv_log.h" +#include "lv_linux.h" +#include +#include + +/********************* + * DEFINES + *********************/ + +#define LV_UPTIME_MONITOR_FILE "/proc/stat" +#define LV_UPTIME_MONITOR_SELF_FILE "/proc/self/stat" + +#define LV_PROC_STAT_VAR_FORMAT " %" PRIu32 +#define LV_PROC_STAT_IGNORE_VAR_FORMAT " %*" PRIu32 + +#define last_proc_stat LV_GLOBAL_DEFAULT()->linux_last_proc_stat +#if LV_SYSMON_PROC_IDLE_AVAILABLE + #define last_self_ticks LV_GLOBAL_DEFAULT()->linux_last_self_proc_time_ticks + #define last_system_total_ticks_stat LV_GLOBAL_DEFAULT()->linux_last_system_total_ticks_stat +#endif + +#define LV_SELF_PROC_STAT_BUFFER_SIZE 512 +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_result_t lv_read_proc_stat(lv_linux_proc_stat_t * result); +static uint32_t lv_proc_stat_get_total(const lv_linux_proc_stat_t * p); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +uint32_t lv_os_get_idle_percent(void) +{ + lv_linux_proc_stat_t proc_stat; + { + lv_result_t err = lv_read_proc_stat(&proc_stat); + + if(err == LV_RESULT_INVALID) { + return UINT32_MAX; + } + + for(size_t i = 0; i < LV_PROC_STAT_PARAMS_LEN; ++i) { + uint32_t delta = + proc_stat.buffer[i] - last_proc_stat.buffer[i]; + /* Update old for next call*/ + last_proc_stat.buffer[i] = proc_stat.buffer[i]; + /* Store delta in new */ + proc_stat.buffer[i] = delta; + } + } + + /* From here onwards, there's no risk of overflowing as long as we call this function regularly */ + const uint32_t total = lv_proc_stat_get_total(&proc_stat); + + if(total == 0) { + return 0; + } + + return (proc_stat.fields.idle * 100) / total; +} + +#if LV_SYSMON_PROC_IDLE_AVAILABLE + +uint32_t lv_os_get_proc_idle_percent(void) +{ + uint64_t self_current_time_ticks = 0; + lv_linux_proc_stat_t stat_current_system_total_ticks; + lv_linux_proc_stat_t stat_delta_system_ticks; + + FILE * self = fopen(LV_UPTIME_MONITOR_SELF_FILE, "r"); + if(!self) { + LV_LOG_ERROR("Failed to open " LV_UPTIME_MONITOR_SELF_FILE); + return UINT32_MAX; + } + + char self_stat_buffer[LV_SELF_PROC_STAT_BUFFER_SIZE]; + + if(!fgets(self_stat_buffer, sizeof(self_stat_buffer), self)) { + fclose(self); + LV_LOG_ERROR("Failed to read " LV_UPTIME_MONITOR_SELF_FILE); + return UINT32_MAX; + } + + fclose(self); + + /* The comm field can contain spaces and parentheses, so we find the last ')' + * Skip the whitespace after finding the last ')' */ + char * p = strrchr(self_stat_buffer, ')'); + if(!p) { + LV_LOG_ERROR(LV_UPTIME_MONITOR_SELF_FILE " is missing the closing ')'"); + return UINT32_MAX; + } + p++; /* move past the ')' */ + while(*p && (*p == ' ' || *p == '\t')) + p++; /* skip whitespace after ')' */ + if(!*p) { + LV_LOG_ERROR(LV_UPTIME_MONITOR_SELF_FILE " unexpectedly ends after the closing ')'"); + return UINT32_MAX; + } + + uint64_t utime = 0; + uint64_t stime = 0; + + int scanned_items = sscanf(p, + "%*c " // state (field 3) + "%*d %*d %*d %*d %*d " // ppid, pgrp, session, tty_nr, tpgid (fields 4-8) + "%*u " // flags (field 9) + "%*u %*u %*u %*u " // minflt, cminflt, majflt, cmajflt (fields 10-13) + "%" SCNu64 " %" SCNu64, // utime, stime (fields 14-15) + &utime, &stime); + + if(scanned_items != 2) { + LV_LOG_ERROR("Failed to parse utime/stime"); + return UINT32_MAX; + } + + self_current_time_ticks = utime + stime; + + if(lv_read_proc_stat(&stat_current_system_total_ticks) != LV_RESULT_OK) { + LV_LOG_ERROR("lv_read_proc_stat failed"); + return UINT32_MAX; + } + + /* no delta on the first call so return 0, next call will have actual values*/ + if(last_self_ticks == 0) { + last_self_ticks = self_current_time_ticks; + last_system_total_ticks_stat = stat_current_system_total_ticks; + + return 100; /* 100% idle = 0% CPU usage*/ + } + + uint64_t delta_self_proc_ticks = self_current_time_ticks - last_self_ticks; + + for(size_t i = 0; i < LV_PROC_STAT_PARAMS_LEN; ++i) { + stat_delta_system_ticks.buffer[i] = stat_current_system_total_ticks.buffer[i] - last_system_total_ticks_stat.buffer[i]; + } + + uint64_t delta_total_system_ticks = lv_proc_stat_get_total(&stat_delta_system_ticks); + + last_self_ticks = self_current_time_ticks; + last_system_total_ticks_stat = stat_current_system_total_ticks; + + if(delta_total_system_ticks == 0) return 100; + + uint32_t cpu_usage_percent = (uint32_t)((delta_self_proc_ticks * 100ULL) / delta_total_system_ticks); + + return 100 - cpu_usage_percent; +} + +#endif /*LV_SYSMON_PROC_IDLE_AVAILABLE*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_result_t lv_read_proc_stat(lv_linux_proc_stat_t * result) +{ + FILE * fp = fopen(LV_UPTIME_MONITOR_FILE, "r"); + + if(!fp) { + LV_LOG_ERROR("Failed to open " LV_UPTIME_MONITOR_FILE); + return LV_RESULT_INVALID; + } + const char * fmt = "cpu " LV_PROC_STAT_VAR_FORMAT LV_PROC_STAT_VAR_FORMAT + LV_PROC_STAT_VAR_FORMAT LV_PROC_STAT_VAR_FORMAT + LV_PROC_STAT_IGNORE_VAR_FORMAT LV_PROC_STAT_VAR_FORMAT + LV_PROC_STAT_VAR_FORMAT LV_PROC_STAT_VAR_FORMAT; + + int err = fscanf(fp, fmt, &result->fields.user, &result->fields.nice, + &result->fields.system, &result->fields.idle, + &result->fields.irq, &result->fields.softirq, + &result->fields.steal); + + fclose(fp); + + if(err != LV_PROC_STAT_PARAMS_LEN) { + LV_LOG_ERROR("Failed to parse " LV_UPTIME_MONITOR_FILE); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +static uint32_t lv_proc_stat_get_total(const lv_linux_proc_stat_t * p) +{ + uint32_t sum = 0; + for(size_t i = 0; i < LV_PROC_STAT_PARAMS_LEN; ++i) { + sum += p->buffer[i]; + } + return sum; +} + +#endif diff --git a/inc/lvgl/src/osal/lv_linux.h b/inc/lvgl/src/osal/lv_linux.h new file mode 100644 index 0000000..a94e64b --- /dev/null +++ b/inc/lvgl/src/osal/lv_linux.h @@ -0,0 +1,56 @@ +/** + * @file lv_linux.h + * + */ + +#ifndef LV_LINUX_H +#define LV_LINUX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_os.h" +#ifdef __linux__ +/********************* + * DEFINES + *********************/ + +#define LV_PROC_STAT_PARAMS_LEN 7 + +/********************** + * TYPEDEFS + **********************/ + +typedef union { + struct { + /* + * We ignore the iowait column as it's not reliable + * We ignore the guest and guest_nice columns because they're accounted + * for in user and nice respectively + */ + uint32_t user, nice, system, idle, /*iowait,*/ irq, softirq, + steal /*, guest, guest_nice*/; + } fields; + uint32_t buffer[LV_PROC_STAT_PARAMS_LEN]; +} lv_linux_proc_stat_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*__linux__*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LINUX_H*/ diff --git a/inc/lvgl/src/osal/lv_mqx.c b/inc/lvgl/src/osal/lv_mqx.c new file mode 100644 index 0000000..3b2442f --- /dev/null +++ b/inc/lvgl/src/osal/lv_mqx.c @@ -0,0 +1,181 @@ +/** + * @file lv_mqx.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os_private.h" + +#if LV_USE_OS == LV_OS_MQX + +#include "../misc/lv_log.h" +#include "../misc/lv_timer.h" +#include "../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, const char * const name, lv_thread_prio_t prio, + void (*callback)(void *), size_t stack_size, + void * user_data) +{ + TASK_TEMPLATE_STRUCT task_template; + + lv_memzero(&task_template, sizeof(task_template)); + + task_template.TASK_ADDRESS = (TASK_FPTR)callback; + task_template.TASK_STACKSIZE = stack_size; + task_template.TASK_PRIORITY = _sched_get_min_priority(0) - prio; + task_template.TASK_NAME = name; + task_template.CREATION_PARAMETER = (uint32_t)user_data; + + *thread = _task_create(0, 0, (uint32_t)&task_template); + if(*thread == MQX_NULL_TASK_ID) { + LV_LOG_WARN("_task_create failed!"); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + _mqx_uint ret = _task_destroy(*thread); + if(ret != MQX_OK) { + LV_LOG_WARN("_task_destroy failed!"); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + if(MQX_OK != _mutex_init(mutex, NULL)) { + LV_LOG_WARN("create mutex failed"); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + _mqx_uint ret = _mutex_lock(mutex); + if(ret != MQX_OK) { + LV_LOG_WARN("Error: %x", ret); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + _mqx_uint ret = _mutex_lock(mutex); + if(ret != MQX_OK) { + LV_LOG_WARN("Error: %x", ret); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + _mqx_uint ret = _mutex_unlock(mutex); + if(ret != MQX_OK) { + LV_LOG_WARN("Error: %x", ret); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + _mqx_uint ret = _mutex_destroy(mutex); + if(ret != MQX_OK) { + LV_LOG_WARN("Error: %x", ret); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + if(MQX_OK != _lwsem_create(sync, 0)) { + LV_LOG_WARN("create semaphore failed"); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + _mqx_uint ret = _lwsem_wait(sync); + if(ret != MQX_OK) { + LV_LOG_WARN("Error: %x", ret); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + _mqx_uint ret = _lwsem_post(sync); + if(ret != MQX_OK) { + LV_LOG_WARN("Error: %x", ret); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + _mqx_uint ret = _lwsem_destroy(sync); + if(ret != MQX_OK) { + LV_LOG_WARN("Error: %x", ret); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +uint32_t lv_os_get_idle_percent(void) +{ + return lv_timer_get_idle(); +} + +void lv_sleep_ms(uint32_t ms) +{ + _time_delay(ms); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_OS == LV_OS_MQX*/ diff --git a/inc/lvgl/src/osal/lv_mqx.h b/inc/lvgl/src/osal/lv_mqx.h new file mode 100644 index 0000000..1ccd009 --- /dev/null +++ b/inc/lvgl/src/osal/lv_mqx.h @@ -0,0 +1,51 @@ +/** + * @file lv_mqx.h + * + */ + +#ifndef LV_MQX_H +#define LV_MQX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_os_private.h" + +#if LV_USE_OS == LV_OS_MQX + +#include "mqx.h" +#include "mutex.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef _task_id lv_thread_t; + +typedef MUTEX_STRUCT lv_mutex_t; + +typedef LWSEM_STRUCT lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_MQX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MQX_H*/ diff --git a/inc/lvgl/src/osal/lv_os.c b/inc/lvgl/src/osal/lv_os.c new file mode 100644 index 0000000..c8142a6 --- /dev/null +++ b/inc/lvgl/src/osal/lv_os.c @@ -0,0 +1,80 @@ +/** + * @file lv_os.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os_private.h" +#include "../core/lv_global.h" +#include "../tick/lv_tick.h" + +/********************* + * DEFINES + *********************/ +#define lv_general_mutex LV_GLOBAL_DEFAULT()->lv_general_mutex + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_os_init(void) +{ +#if LV_USE_OS != LV_OS_NONE + lv_mutex_init(&lv_general_mutex); +#endif +} + + +void lv_lock(void) +{ +#if LV_USE_OS != LV_OS_NONE + lv_mutex_lock(&lv_general_mutex); +#endif +} + +lv_result_t lv_lock_isr(void) +{ +#if LV_USE_OS != LV_OS_NONE + return lv_mutex_lock_isr(&lv_general_mutex); +#else + return LV_RESULT_OK; +#endif +} + +void lv_unlock(void) +{ +#if LV_USE_OS != LV_OS_NONE + lv_mutex_unlock(&lv_general_mutex); +#endif +} + +#if LV_USE_OS == LV_OS_NONE +void lv_sleep_ms(uint32_t ms) +{ + lv_delay_ms(ms); +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + + diff --git a/inc/lvgl/src/osal/lv_os.h b/inc/lvgl/src/osal/lv_os.h new file mode 100644 index 0000000..eaa20e9 --- /dev/null +++ b/inc/lvgl/src/osal/lv_os.h @@ -0,0 +1,71 @@ +/** + * @file lv_os.h + * + */ + +#ifndef LV_OS_H +#define LV_OS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * OS OPTIONS + *********************/ + +/********************* + * INCLUDES + *********************/ +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Lock LVGL's general mutex. + * LVGL is not thread safe, so a mutex is used to avoid executing multiple LVGL functions at the same time + * from different threads. It shall be called when calling LVGL functions from threads + * different than lv_timer_handler's thread. It doesn't need to be called in LVGL events because + * they are called from lv_timer_handler(). + * It is called internally in lv_timer_handler(). + */ +void lv_lock(void); + +/** + * Same as `lv_lock()` but can be called from an interrupt. + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_lock_isr(void); + +/** + * The pair of `lv_lock()` and `lv_lock_isr()`. + * It unlocks LVGL general mutex. + * It is called internally in lv_timer_handler(). + */ +void lv_unlock(void); + +/** + * Sleeps the current thread by an amount of milliseconds. + * @param ms amount of milliseconds to sleep the current thread. + */ +void lv_sleep_ms(uint32_t ms); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OS_H*/ diff --git a/inc/lvgl/src/osal/lv_os_none.c b/inc/lvgl/src/osal/lv_os_none.c new file mode 100644 index 0000000..71fb2bb --- /dev/null +++ b/inc/lvgl/src/osal/lv_os_none.c @@ -0,0 +1,52 @@ +/** + * @file lv_os_none.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../lv_conf_internal.h" +#if LV_USE_OS == LV_OS_NONE + +#include "lv_os_private.h" +#include "../misc/lv_timer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +#ifndef __linux__ +uint32_t lv_os_get_idle_percent(void) +{ + return lv_timer_get_idle(); +} +#endif /*__linux__*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + + +#endif diff --git a/inc/lvgl/src/osal/lv_os_none.h b/inc/lvgl/src/osal/lv_os_none.h new file mode 100644 index 0000000..e08a0dc --- /dev/null +++ b/inc/lvgl/src/osal/lv_os_none.h @@ -0,0 +1,43 @@ +/** + * @file lv_os_none.h + * + */ + +#ifndef LV_OS_NONE_H +#define LV_OS_NONE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_NONE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef int lv_mutex_t; +typedef int lv_thread_t; +typedef int lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_NONE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OS_NONE_H*/ diff --git a/inc/lvgl/src/osal/lv_os_private.h b/inc/lvgl/src/osal/lv_os_private.h new file mode 100644 index 0000000..029e90c --- /dev/null +++ b/inc/lvgl/src/osal/lv_os_private.h @@ -0,0 +1,279 @@ +/** + * @file lv_os_private.h + * + */ + +#ifndef LV_OS_PRIVATE_H +#define LV_OS_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * OS OPTIONS + *********************/ + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "lv_os.h" +#include "../misc/lv_types.h" + +#ifdef __linux__ +#include "lv_linux.h" +#endif + +#if LV_USE_OS == LV_OS_NONE +#include "lv_os_none.h" +#elif LV_USE_OS == LV_OS_PTHREAD +#include "lv_pthread.h" +#elif LV_USE_OS == LV_OS_FREERTOS +#include "lv_freertos.h" +#elif LV_USE_OS == LV_OS_CMSIS_RTOS2 +#include "lv_cmsis_rtos2.h" +#elif LV_USE_OS == LV_OS_RTTHREAD +#include "lv_rtthread.h" +#elif LV_USE_OS == LV_OS_WINDOWS +#include "lv_windows.h" +#elif LV_USE_OS == LV_OS_MQX +#include "lv_mqx.h" +#elif LV_USE_OS == LV_OS_SDL2 +#include "lv_sdl2.h" +#elif LV_USE_OS == LV_OS_CUSTOM +#include LV_OS_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_THREAD_PRIO_LOWEST, + LV_THREAD_PRIO_LOW, + LV_THREAD_PRIO_MID, + LV_THREAD_PRIO_HIGH, + LV_THREAD_PRIO_HIGHEST, +} lv_thread_prio_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the OS layer + */ +void lv_os_init(void); + +/** + * Set it for `LV_SYSMON_GET_IDLE` to show the CPU usage + * @return the idle percentage since the last call + */ +uint32_t lv_os_get_idle_percent(void); + +#if LV_SYSMON_PROC_IDLE_AVAILABLE + +uint32_t lv_os_get_proc_idle_percent(void); + +#endif + +#if LV_USE_OS != LV_OS_NONE + +/*---------------------------------------- + * These functions needs to be implemented + * for specific operating systems + *---------------------------------------*/ + +/** + * Create a new thread + * @param thread a variable in which the thread will be stored + * @param name the name of the thread + * @param prio priority of the thread + * @param callback function of the thread + * @param stack_size stack size in bytes + * @param user_data arbitrary data, will be available in the callback + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_init(lv_thread_t * thread, const char * const name, + lv_thread_prio_t prio, void (*callback)(void *), size_t stack_size, + void * user_data); + +/** + * Delete a thread + * @param thread the thread to delete + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_delete(lv_thread_t * thread); + +/** + * Create a mutex + * @param mutex a variable in which the thread will be stored + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_init(lv_mutex_t * mutex); + +/** + * Lock a mutex + * @param mutex the mutex to lock + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_lock(lv_mutex_t * mutex); + +/** + * Lock a mutex from interrupt + * @param mutex the mutex to lock + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex); + +/** + * Unlock a mutex + * @param mutex the mutex to unlock + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex); + +/** + * Delete a mutex + * @param mutex the mutex to delete + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_mutex_delete(lv_mutex_t * mutex); + +/** + * Create a thread synchronization object + * @param sync a variable in which the sync will be stored + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync); + +/** + * Wait for a "signal" on a sync object + * @param sync a sync object + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync); + +/** + * Send a wake-up signal to a sync object + * @param sync a sync object + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync); + +/** + * Send a wake-up signal to a sync object from interrupt + * @param sync a sync object + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync); + +/** + * Delete a sync object + * @param sync a sync object to delete + * @return LV_RESULT_OK: success; LV_RESULT_INVALID: failure + */ +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync); + +#else + +/* Since compilation does not necessarily optimize cross-file empty functions well + * (-O3 optimization alone is not enough unless LTO optimization is enabled), + * In the absence of an operating system, use inline functions to help compile + * optimizations and avoid the call overhead of the OS API to ensure no performance penalty. + */ + +static inline lv_result_t lv_thread_init(lv_thread_t * thread, const char * const name, lv_thread_prio_t prio, + void (*callback)(void *), size_t stack_size, void * user_data) +{ + LV_UNUSED(thread); + LV_UNUSED(name); + LV_UNUSED(callback); + LV_UNUSED(prio); + LV_UNUSED(stack_size); + LV_UNUSED(user_data); + return LV_RESULT_INVALID; +} + +static inline lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + LV_UNUSED(thread); + return LV_RESULT_INVALID; +} + +static inline lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + LV_UNUSED(mutex); + return LV_RESULT_OK; +} + +static inline lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +static inline lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +static inline lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +static inline lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +static inline lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +#endif /*LV_USE_OS != LV_OS_NONE*/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OS_PRIVATE_H*/ diff --git a/inc/lvgl/src/osal/lv_pthread.c b/inc/lvgl/src/osal/lv_pthread.c new file mode 100644 index 0000000..6bec2c7 --- /dev/null +++ b/inc/lvgl/src/osal/lv_pthread.c @@ -0,0 +1,199 @@ +/** + * @file lv_pthread.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os_private.h" + +#if LV_USE_OS == LV_OS_PTHREAD + +#include "../misc/lv_log.h" + +#ifndef __linux__ + #include "../misc/lv_timer.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void * generic_callback(void * user_data); + + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, const char * const name, + lv_thread_prio_t prio, void (*callback)(void *), + size_t stack_size, void * user_data) +{ + LV_UNUSED(name); + LV_UNUSED(prio); + pthread_attr_t attr; + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, stack_size); + thread->callback = callback; + thread->user_data = user_data; + pthread_create(&thread->thread, &attr, generic_callback, thread); + pthread_attr_destroy(&attr); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + int ret = pthread_join(thread->thread, NULL); + if(ret != 0) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + pthread_mutexattr_t attr; + + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + int ret = pthread_mutex_init(mutex, &attr); + pthread_mutexattr_destroy(&attr); + + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + int ret = pthread_mutex_lock(mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + int ret = pthread_mutex_lock(mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + int ret = pthread_mutex_unlock(mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + pthread_mutex_destroy(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + pthread_mutex_init(&sync->mutex, 0); + pthread_cond_init(&sync->cond, 0); + sync->v = false; + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + pthread_mutex_lock(&sync->mutex); + while(!sync->v) { + pthread_cond_wait(&sync->cond, &sync->mutex); + } + sync->v = false; + pthread_mutex_unlock(&sync->mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + pthread_mutex_lock(&sync->mutex); + sync->v = true; + pthread_cond_signal(&sync->cond); + pthread_mutex_unlock(&sync->mutex); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + pthread_mutex_destroy(&sync->mutex); + pthread_cond_destroy(&sync->cond); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +#ifndef __linux__ +uint32_t lv_os_get_idle_percent(void) +{ + return lv_timer_get_idle(); +} +#endif + +void lv_sleep_ms(uint32_t ms) +{ + /* Just call standard posix sleep function */ + usleep(ms * 1000); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void * generic_callback(void * user_data) +{ + lv_thread_t * thread = user_data; + thread->callback(thread->user_data); + return NULL; +} + + +#endif /*LV_USE_OS == LV_OS_PTHREAD*/ diff --git a/inc/lvgl/src/osal/lv_pthread.h b/inc/lvgl/src/osal/lv_pthread.h new file mode 100644 index 0000000..b0c9215 --- /dev/null +++ b/inc/lvgl/src/osal/lv_pthread.h @@ -0,0 +1,58 @@ +/** + * @file lv_pthread.h + * + */ + +#ifndef LV_PTHREAD_H +#define LV_PTHREAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_PTHREAD + +#include +#include +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + pthread_t thread; + void (*callback)(void *); + void * user_data; +} lv_thread_t; + +typedef pthread_mutex_t lv_mutex_t; + +typedef struct { + pthread_mutex_t mutex; + pthread_cond_t cond; + bool v; +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_PTHREAD*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_PTHREAD_H*/ diff --git a/inc/lvgl/src/osal/lv_rtthread.c b/inc/lvgl/src/osal/lv_rtthread.c new file mode 100644 index 0000000..9608ee2 --- /dev/null +++ b/inc/lvgl/src/osal/lv_rtthread.c @@ -0,0 +1,202 @@ +/** + * @file lv_rtthread.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os_private.h" + +#if LV_USE_OS == LV_OS_RTTHREAD + +#include "../misc/lv_log.h" +#include "../misc/lv_timer.h" + +/********************* + * DEFINES + *********************/ + +#define THREAD_TIMESLICE 20U + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, const char * const name, lv_thread_prio_t prio, + void (*callback)(void *), size_t stack_size, + void * user_data) +{ + thread->thread = rt_thread_create(name, + callback, + user_data, + stack_size, + prio, + THREAD_TIMESLICE); + rt_err_t ret = rt_thread_startup(thread->thread); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + rt_err_t ret = rt_thread_delete(thread->thread); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + mutex->mutex = rt_mutex_create("mutex", RT_IPC_FLAG_PRIO); + if(mutex->mutex == RT_NULL) { + LV_LOG_WARN("create mutex failed"); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_FOREVER); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_take(mutex->mutex, RT_WAITING_FOREVER); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_release(mutex->mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + rt_err_t ret = rt_mutex_delete(mutex->mutex); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + sync->sem = rt_sem_create("sem", 0, RT_IPC_FLAG_PRIO); + if(sync->sem == RT_NULL) { + LV_LOG_WARN("create semaphore failed"); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + rt_err_t ret = rt_sem_take(sync->sem, RT_WAITING_FOREVER); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + rt_err_t ret = rt_sem_release(sync->sem); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + rt_err_t ret = rt_sem_delete(sync->sem); + if(ret) { + LV_LOG_WARN("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +uint32_t lv_os_get_idle_percent(void) +{ + return lv_timer_get_idle(); +} + +void lv_sleep_ms(uint32_t ms) +{ + rt_thread_mdelay(ms); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_OS == LV_OS_RTTHREAD*/ diff --git a/inc/lvgl/src/osal/lv_rtthread.h b/inc/lvgl/src/osal/lv_rtthread.h new file mode 100644 index 0000000..255a47a --- /dev/null +++ b/inc/lvgl/src/osal/lv_rtthread.h @@ -0,0 +1,54 @@ +/** + * @file lv_rtthread.h + * + */ + +#ifndef LV_RTTHREAD_H +#define LV_RTTHREAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_RTTHREAD + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + rt_thread_t thread; +} lv_thread_t; + +typedef struct { + rt_mutex_t mutex; +} lv_mutex_t; + +typedef struct { + rt_sem_t sem; +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_RTTHREAD*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_RTTHREAD_H*/ diff --git a/inc/lvgl/src/osal/lv_sdl2.c b/inc/lvgl/src/osal/lv_sdl2.c new file mode 100644 index 0000000..a5ba0be --- /dev/null +++ b/inc/lvgl/src/osal/lv_sdl2.c @@ -0,0 +1,199 @@ +/** + * @file lv_sdl2.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_os_private.h" + +#if LV_USE_OS == LV_OS_SDL2 + +#include +#include "../misc/lv_log.h" + +#ifndef __linux__ + #include "../misc/lv_timer.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static int generic_callback(void * user_data); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init(lv_thread_t * thread, const char * const name, lv_thread_prio_t prio, + void (*callback)(void *), size_t stack_size, void * user_data) +{ + LV_UNUSED(prio); + thread->callback = callback; + thread->user_data = user_data; + thread->thread = SDL_CreateThreadWithStackSize(generic_callback, name, stack_size, thread); + if(thread->thread == NULL) { + LV_LOG_ERROR("Error: %s", SDL_GetError()); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + int ret; + SDL_WaitThread(thread->thread, &ret); + if(ret != 0) { + LV_LOG_ERROR("Error: %d", ret); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + *mutex = SDL_CreateMutex(); + + if(*mutex == NULL) { + LV_LOG_ERROR("Error: %s", SDL_GetError()); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + int ret = SDL_LockMutex(*mutex); + if(ret) { + LV_LOG_ERROR("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + int ret = SDL_LockMutex(*mutex); + if(ret) { + LV_LOG_ERROR("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + int ret = SDL_UnlockMutex(*mutex); + if(ret) { + LV_LOG_ERROR("Error: %d", ret); + return LV_RESULT_INVALID; + } + else { + return LV_RESULT_OK; + } +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + SDL_DestroyMutex(*mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + sync->mutex = SDL_CreateMutex(); + if(sync->mutex == NULL) { + LV_LOG_ERROR("Error: %s", SDL_GetError()); + return LV_RESULT_INVALID; + } + sync->cond = SDL_CreateCond(); + if(sync->cond == NULL) { + LV_LOG_ERROR("Error: %s", SDL_GetError()); + return LV_RESULT_INVALID; + } + sync->v = false; + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + SDL_LockMutex(sync->mutex); + while(!sync->v) { + SDL_CondWait(sync->cond, sync->mutex); + } + sync->v = false; + SDL_UnlockMutex(sync->mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + SDL_LockMutex(sync->mutex); + sync->v = true; + SDL_CondSignal(sync->cond); + SDL_UnlockMutex(sync->mutex); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + SDL_DestroyMutex(sync->mutex); + SDL_DestroyCond(sync->cond); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +#ifndef __linux__ +uint32_t lv_os_get_idle_percent(void) +{ + return lv_timer_get_idle(); +} +#endif + +void lv_sleep_ms(uint32_t ms) +{ + SDL_Delay(ms); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static int generic_callback(void * user_data) +{ + lv_thread_t * thread = user_data; + thread->callback(thread->user_data); + return 0; +} + +#endif /*LV_USE_OS == LV_OS_SDL2*/ diff --git a/inc/lvgl/src/osal/lv_sdl2.h b/inc/lvgl/src/osal/lv_sdl2.h new file mode 100644 index 0000000..69eff58 --- /dev/null +++ b/inc/lvgl/src/osal/lv_sdl2.h @@ -0,0 +1,55 @@ +/** + * @file lv_sdl2.h + * + */ + +#ifndef LV_SDL2_H +#define LV_SDL2_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#if LV_USE_OS == LV_OS_SDL2 +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + SDL_Thread * thread; + void (*callback)(void *); + void * user_data; +} lv_thread_t; + +typedef SDL_mutex * lv_mutex_t; + +typedef struct { + SDL_mutex * mutex; + SDL_cond * cond; + bool v; +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_SDL2*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SDL2_H*/ diff --git a/inc/lvgl/src/osal/lv_windows.c b/inc/lvgl/src/osal/lv_windows.c new file mode 100644 index 0000000..c28bc07 --- /dev/null +++ b/inc/lvgl/src/osal/lv_windows.c @@ -0,0 +1,235 @@ +/** + * @file lv_windows.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_os_private.h" + +#if LV_USE_OS == LV_OS_WINDOWS + +#include +#include "../misc/lv_timer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + void (*callback)(void *); + void * user_data; +} lv_thread_init_data_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static unsigned __stdcall thread_start_routine(void * parameter); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_result_t lv_thread_init( + lv_thread_t * thread, + const char * const name, + lv_thread_prio_t prio, + void (*callback)(void *), + size_t stack_size, + void * user_data) +{ + LV_UNUSED(name); + if(!thread) { + return LV_RESULT_INVALID; + } + + static const int prio_map[] = { + [LV_THREAD_PRIO_LOWEST] = THREAD_PRIORITY_LOWEST, + [LV_THREAD_PRIO_LOW] = THREAD_PRIORITY_BELOW_NORMAL, + [LV_THREAD_PRIO_MID] = THREAD_PRIORITY_NORMAL, + [LV_THREAD_PRIO_HIGH] = THREAD_PRIORITY_ABOVE_NORMAL, + [LV_THREAD_PRIO_HIGHEST] = THREAD_PRIORITY_HIGHEST, + }; + + lv_thread_init_data_t * init_data = + (lv_thread_init_data_t *)(malloc( + sizeof(lv_thread_init_data_t))); + if(!init_data) { + return LV_RESULT_INVALID; + } + init_data->callback = callback; + init_data->user_data = user_data; + + /* + Reference: https://learn.microsoft.com/en-us/windows/win32/api + /processthreadsapi/nf-processthreadsapi-createthread + + A thread in an executable that calls the C run-time library (CRT) should + use the _beginthreadex and _endthreadex functions for thread management + rather than CreateThread and ExitThread; this requires the use of the + multithreaded version of the CRT. If a thread created using CreateThread + calls the CRT, the CRT may terminate the process in low-memory conditions. + */ + *thread = (HANDLE)(_beginthreadex( + NULL, + (unsigned)(stack_size), + thread_start_routine, + init_data, + 0, + NULL)); + if(!*thread) { + return LV_RESULT_INVALID; + } + + /* + Try to set the thread priority. (Not mandatory for creating a new thread.) + */ + SetThreadPriority(*thread, prio_map[prio]); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_delete(lv_thread_t * thread) +{ + lv_result_t result = LV_RESULT_OK; + + if(!TerminateThread(thread, 0)) { + result = LV_RESULT_INVALID; + } + + CloseHandle(thread); + + return result; +} + +lv_result_t lv_mutex_init(lv_mutex_t * mutex) +{ + InitializeCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock(lv_mutex_t * mutex) +{ + EnterCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_lock_isr(lv_mutex_t * mutex) +{ + EnterCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_unlock(lv_mutex_t * mutex) +{ + LeaveCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_mutex_delete(lv_mutex_t * mutex) +{ + DeleteCriticalSection(mutex); + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_init(lv_thread_sync_t * sync) +{ + if(!sync) { + return LV_RESULT_INVALID; + } + + InitializeCriticalSection(&sync->cs); + InitializeConditionVariable(&sync->cv); + sync->v = false; + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_wait(lv_thread_sync_t * sync) +{ + if(!sync) { + return LV_RESULT_INVALID; + } + + EnterCriticalSection(&sync->cs); + while(!sync->v) { + SleepConditionVariableCS(&sync->cv, &sync->cs, INFINITE); + } + sync->v = false; + LeaveCriticalSection(&sync->cs); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal(lv_thread_sync_t * sync) +{ + if(!sync) { + return LV_RESULT_INVALID; + } + + EnterCriticalSection(&sync->cs); + sync->v = true; + WakeConditionVariable(&sync->cv); + LeaveCriticalSection(&sync->cs); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_delete(lv_thread_sync_t * sync) +{ + if(!sync) { + return LV_RESULT_INVALID; + } + + DeleteCriticalSection(&sync->cs); + + return LV_RESULT_OK; +} + +lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t * sync) +{ + LV_UNUSED(sync); + return LV_RESULT_INVALID; +} + +uint32_t lv_os_get_idle_percent(void) +{ + return lv_timer_get_idle(); +} + +void lv_sleep_ms(uint32_t ms) +{ + Sleep(ms); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static unsigned __stdcall thread_start_routine(void * parameter) +{ + lv_thread_init_data_t * init_data = (lv_thread_init_data_t *)(parameter); + if(init_data) { + init_data->callback(init_data->user_data); + free(init_data); + } + + return 0; +} + +#endif /*LV_USE_OS == LV_OS_WINDOWS*/ diff --git a/inc/lvgl/src/osal/lv_windows.h b/inc/lvgl/src/osal/lv_windows.h new file mode 100644 index 0000000..9d86453 --- /dev/null +++ b/inc/lvgl/src/osal/lv_windows.h @@ -0,0 +1,54 @@ +/** + * @file lv_windows.h + * + */ + +#ifndef LV_WINDOWS_H +#define LV_WINDOWS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#if LV_USE_OS == LV_OS_WINDOWS + +#include +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef HANDLE lv_thread_t; + +typedef CRITICAL_SECTION lv_mutex_t; + +typedef struct { + CRITICAL_SECTION cs; + CONDITION_VARIABLE cv; + bool v; +} lv_thread_sync_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OS == LV_OS_WINDOWS*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WINDOWS_H*/ diff --git a/inc/lvgl/src/others/file_explorer/lv_file_explorer.c b/inc/lvgl/src/others/file_explorer/lv_file_explorer.c new file mode 100644 index 0000000..a97f4ea --- /dev/null +++ b/inc/lvgl/src/others/file_explorer/lv_file_explorer.c @@ -0,0 +1,807 @@ +/** + * @file lv_file_explorer.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_file_explorer_private.h" +#include "../../misc/lv_fs_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_FILE_EXPLORER + +#include "../../lvgl.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_file_explorer_class) + +#define FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH (22) +#define FILE_EXPLORER_BROWSER_AREA_WIDTH (100 - FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH) + +#define LV_FILE_NAVIGATION_CURRENT_DIR "." +#define LV_FILE_NAVIGATION_PARENT_DIR "Back" + +#define quick_access_style (LV_GLOBAL_DEFAULT()->file_explorer_quick_access_style) +#define file_explorer_count (LV_GLOBAL_DEFAULT()->file_explorer_count) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_file_explorer_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_file_explorer_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void init_style(lv_obj_t * obj); + +#if LV_FILE_EXPLORER_QUICK_ACCESS + static void quick_access_event_handler(lv_event_t * e); + static void quick_access_area_event_handler(lv_event_t * e); +#endif + +static void browser_file_event_handler(lv_event_t * e); +static void show_dir(lv_obj_t * obj, const char * path); +static void strip_ext(char * dir); +static void exch_table_item(lv_obj_t * tb, int16_t i, int16_t j); +static void file_explorer_sort(lv_obj_t * obj); +static void sort_by_file_kind(lv_obj_t * tb, int16_t lo, int16_t hi); +static bool is_end_with(const char * str1, const char * str2); +static void clear_table_cells_user_data(lv_file_explorer_t * explorer); + +/********************** + * STATIC VARIABLES + **********************/ + + +const lv_obj_class_t lv_file_explorer_class = { + .constructor_cb = lv_file_explorer_constructor, + .destructor_cb = lv_file_explorer_destructor, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_file_explorer_t), + .base_class = &lv_obj_class, + .name = "lv_file_explorer", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_file_explorer_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ +#if LV_FILE_EXPLORER_QUICK_ACCESS +void lv_file_explorer_set_quick_access_path(lv_obj_t * obj, lv_file_explorer_dir_t dir, const char * path) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + /*If path is unavailable */ + if((path == NULL) || (lv_strlen(path) <= 0)) return; + + char ** dir_str = NULL; + switch(dir) { + case LV_EXPLORER_HOME_DIR: + dir_str = &(explorer->home_dir); + break; + case LV_EXPLORER_MUSIC_DIR: + dir_str = &(explorer->music_dir); + break; + case LV_EXPLORER_PICTURES_DIR: + dir_str = &(explorer->pictures_dir); + break; + case LV_EXPLORER_VIDEO_DIR: + dir_str = &(explorer->video_dir); + break; + case LV_EXPLORER_DOCS_DIR: + dir_str = &(explorer->docs_dir); + break; + case LV_EXPLORER_FS_DIR: + dir_str = &(explorer->fs_dir); + break; + + default: + return; + break; + } + + /*Free the old text*/ + if(*dir_str != NULL) { + lv_free(*dir_str); + *dir_str = NULL; + } + + /*Allocate space for the new text*/ + *dir_str = lv_strdup(path); +} + +#endif + +void lv_file_explorer_set_sort(lv_obj_t * obj, lv_file_explorer_sort_t sort) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + explorer->sort = sort; + + file_explorer_sort(obj); +} + +void lv_file_explorer_show_back_button(lv_obj_t * obj, bool show) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + explorer->show_back_button = show; +} + +/*===================== + * Getter functions + *====================*/ +const char * lv_file_explorer_get_selected_file_name(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->sel_fn; +} + +const char * lv_file_explorer_get_current_path(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->current_path; +} + +lv_obj_t * lv_file_explorer_get_file_table(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->file_table; +} + +lv_obj_t * lv_file_explorer_get_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->head_area; +} + +lv_obj_t * lv_file_explorer_get_path_label(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->path_label; +} + +#if LV_FILE_EXPLORER_QUICK_ACCESS +lv_obj_t * lv_file_explorer_get_quick_access_area(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->quick_access_area; +} + +lv_obj_t * lv_file_explorer_get_places_list(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->list_places; +} + +lv_obj_t * lv_file_explorer_get_device_list(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->list_device; +} + +#endif + +lv_file_explorer_sort_t lv_file_explorer_get_sort(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + return explorer->sort; +} + +/*===================== + * Other functions + *====================*/ +void lv_file_explorer_open_dir(lv_obj_t * obj, const char * dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + show_dir(obj, dir); +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static void lv_file_explorer_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + +#if LV_FILE_EXPLORER_QUICK_ACCESS + explorer->home_dir = NULL; + explorer->video_dir = NULL; + explorer->pictures_dir = NULL; + explorer->music_dir = NULL; + explorer->docs_dir = NULL; + explorer->fs_dir = NULL; +#endif + + explorer->sort = LV_EXPLORER_SORT_NONE; + + explorer->show_back_button = true; + + lv_memzero(explorer->current_path, sizeof(explorer->current_path)); + + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + + explorer->cont = lv_obj_create(obj); + lv_obj_set_width(explorer->cont, LV_PCT(100)); + lv_obj_set_flex_grow(explorer->cont, 1); + +#if LV_FILE_EXPLORER_QUICK_ACCESS + /*Quick access bar area on the left*/ + explorer->quick_access_area = lv_obj_create(explorer->cont); + lv_obj_set_size(explorer->quick_access_area, LV_PCT(FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH), LV_PCT(100)); + lv_obj_set_flex_flow(explorer->quick_access_area, LV_FLEX_FLOW_COLUMN); + lv_obj_add_event_cb(explorer->quick_access_area, quick_access_area_event_handler, LV_EVENT_ALL, + explorer); +#endif + + /*File table area on the right*/ + explorer->browser_area = lv_obj_create(explorer->cont); +#if LV_FILE_EXPLORER_QUICK_ACCESS + lv_obj_set_size(explorer->browser_area, LV_PCT(FILE_EXPLORER_BROWSER_AREA_WIDTH), LV_PCT(100)); +#else + lv_obj_set_size(explorer->browser_area, LV_PCT(100), LV_PCT(100)); +#endif + lv_obj_set_flex_flow(explorer->browser_area, LV_FLEX_FLOW_COLUMN); + + /*The area displayed above the file browse list(head)*/ + explorer->head_area = lv_obj_create(explorer->browser_area); + lv_obj_set_size(explorer->head_area, LV_PCT(100), LV_PCT(14)); + lv_obj_remove_flag(explorer->head_area, LV_OBJ_FLAG_SCROLLABLE); + +#if LV_FILE_EXPLORER_QUICK_ACCESS + /*Two lists of quick access bar*/ + lv_obj_t * btn; + /*list 1*/ + explorer->list_device = lv_list_create(explorer->quick_access_area); + lv_obj_set_size(explorer->list_device, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_style_bg_color(lv_list_add_text(explorer->list_device, "DEVICE"), lv_palette_main(LV_PALETTE_ORANGE), 0); + + btn = lv_list_add_button(explorer->list_device, NULL, LV_SYMBOL_DRIVE " File System"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + + /*list 2*/ + explorer->list_places = lv_list_create(explorer->quick_access_area); + lv_obj_set_size(explorer->list_places, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_style_bg_color(lv_list_add_text(explorer->list_places, "PLACES"), lv_palette_main(LV_PALETTE_LIME), 0); + + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_HOME " HOME"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_VIDEO " Video"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_IMAGE " Pictures"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_AUDIO " Music"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); + btn = lv_list_add_button(explorer->list_places, NULL, LV_SYMBOL_FILE " Documents"); + lv_obj_add_event_cb(btn, quick_access_event_handler, LV_EVENT_CLICKED, obj); +#endif + + /*Show current path*/ + explorer->path_label = lv_label_create(explorer->head_area); + lv_label_set_text(explorer->path_label, LV_SYMBOL_EYE_OPEN"https://lvgl.io"); + lv_obj_center(explorer->path_label); + + /*Table showing the contents of the table of contents*/ + explorer->file_table = lv_table_create(explorer->browser_area); + lv_obj_set_size(explorer->file_table, LV_PCT(100), LV_PCT(86)); + lv_table_set_column_width(explorer->file_table, 0, LV_PCT(100)); + lv_table_set_column_count(explorer->file_table, 1); + lv_obj_add_event_cb(explorer->file_table, browser_file_event_handler, LV_EVENT_ALL, obj); + + /*only scroll up and down*/ + lv_obj_set_scroll_dir(explorer->file_table, LV_DIR_TOP | LV_DIR_BOTTOM); + + /*Initialize style*/ + init_style(obj); + + file_explorer_count++; + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_file_explorer_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_UNUSED(obj); + file_explorer_count--; + if(LV_FILE_EXPLORER_QUICK_ACCESS && file_explorer_count == 0) { + lv_style_reset(&quick_access_style); + } +} + +static void init_style(lv_obj_t * obj) +{ + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + /*lv_file_explorer obj style*/ + lv_obj_set_style_radius(obj, 0, 0); + lv_obj_set_style_bg_color(obj, lv_color_hex(0xf2f1f6), 0); + + /*main container style*/ + lv_obj_set_style_radius(explorer->cont, 0, 0); + lv_obj_set_style_bg_opa(explorer->cont, LV_OPA_0, 0); + lv_obj_set_style_border_width(explorer->cont, 0, 0); + lv_obj_set_style_outline_width(explorer->cont, 0, 0); + lv_obj_set_style_pad_column(explorer->cont, 0, 0); + lv_obj_set_style_pad_row(explorer->cont, 0, 0); + lv_obj_set_style_flex_flow(explorer->cont, LV_FLEX_FLOW_ROW, 0); + lv_obj_set_style_pad_all(explorer->cont, 0, 0); + lv_obj_set_style_layout(explorer->cont, LV_LAYOUT_FLEX, 0); + + /*head cont style*/ + lv_obj_set_style_radius(explorer->head_area, 0, 0); + lv_obj_set_style_border_width(explorer->head_area, 0, 0); + lv_obj_set_style_pad_top(explorer->head_area, 0, 0); + +#if LV_FILE_EXPLORER_QUICK_ACCESS + /*Quick access bar container style*/ + lv_obj_set_style_pad_all(explorer->quick_access_area, 0, 0); + lv_obj_set_style_pad_row(explorer->quick_access_area, 20, 0); + lv_obj_set_style_radius(explorer->quick_access_area, 0, 0); + lv_obj_set_style_border_width(explorer->quick_access_area, 1, 0); + lv_obj_set_style_outline_width(explorer->quick_access_area, 0, 0); + lv_obj_set_style_bg_color(explorer->quick_access_area, lv_color_hex(0xf2f1f6), 0); +#endif + + /*File browser container style*/ + lv_obj_set_style_pad_all(explorer->browser_area, 0, 0); + lv_obj_set_style_pad_row(explorer->browser_area, 0, 0); + lv_obj_set_style_radius(explorer->browser_area, 0, 0); + lv_obj_set_style_border_width(explorer->browser_area, 0, 0); + lv_obj_set_style_outline_width(explorer->browser_area, 0, 0); + lv_obj_set_style_bg_color(explorer->browser_area, lv_color_hex(0xffffff), 0); + + /*Style of the table in the browser container*/ + lv_obj_set_style_bg_color(explorer->file_table, lv_color_hex(0xffffff), 0); + lv_obj_set_style_pad_all(explorer->file_table, 0, 0); + lv_obj_set_style_radius(explorer->file_table, 0, 0); + lv_obj_set_style_border_width(explorer->file_table, 0, 0); + lv_obj_set_style_outline_width(explorer->file_table, 0, 0); + +#if LV_FILE_EXPLORER_QUICK_ACCESS + /*Style of the list in the quick access bar*/ + lv_obj_set_style_border_width(explorer->list_device, 0, 0); + lv_obj_set_style_outline_width(explorer->list_device, 0, 0); + lv_obj_set_style_radius(explorer->list_device, 0, 0); + lv_obj_set_style_pad_all(explorer->list_device, 0, 0); + + lv_obj_set_style_border_width(explorer->list_places, 0, 0); + lv_obj_set_style_outline_width(explorer->list_places, 0, 0); + lv_obj_set_style_radius(explorer->list_places, 0, 0); + lv_obj_set_style_pad_all(explorer->list_places, 0, 0); + + /*Style of the quick access list btn in the quick access bar*/ + if(file_explorer_count == 0) { + lv_style_init(&quick_access_style); + lv_style_set_border_width(&quick_access_style, 0); + lv_style_set_bg_color(&quick_access_style, lv_color_hex(0xf2f1f6)); + } + + uint32_t ch_cnt = lv_obj_get_child_count(explorer->quick_access_area); + + for(uint32_t i = 0; i < ch_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(explorer->quick_access_area, i); + + if(lv_obj_check_type(child, &lv_list_class)) { + uint32_t list_ch_cnt = lv_obj_get_child_count(child); + + for(uint32_t j = 0; j < list_ch_cnt; j++) { + lv_obj_t * list_child = lv_obj_get_child(child, j); + if(lv_obj_check_type(list_child, &lv_list_button_class)) { + lv_obj_add_style(list_child, &quick_access_style, 0); + } + } + } + } +#endif + +} + +#if LV_FILE_EXPLORER_QUICK_ACCESS +static void quick_access_event_handler(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * btn = lv_event_get_current_target(e); + lv_obj_t * obj = lv_event_get_user_data(e); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + if(code == LV_EVENT_CLICKED) { + char ** path = NULL; + lv_obj_t * label = lv_obj_get_child(btn, -1); + char * label_text = lv_label_get_text(label); + + if((lv_strcmp(label_text, LV_SYMBOL_HOME " HOME") == 0)) { + path = &(explorer->home_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_VIDEO " Video") == 0)) { + path = &(explorer->video_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_IMAGE " Pictures") == 0)) { + path = &(explorer->pictures_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_AUDIO " Music") == 0)) { + path = &(explorer->music_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_FILE " Documents") == 0)) { + path = &(explorer->docs_dir); + } + else if((lv_strcmp(label_text, LV_SYMBOL_DRIVE " File System") == 0)) { + path = &(explorer->fs_dir); + } + + if(path != NULL) + show_dir(obj, *path); + } +} + +static void quick_access_area_event_handler(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * area = lv_event_get_current_target(e); + lv_obj_t * obj = lv_event_get_user_data(e); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + if(code == LV_EVENT_LAYOUT_CHANGED) { + if(lv_obj_has_flag(area, LV_OBJ_FLAG_HIDDEN)) + lv_obj_set_size(explorer->browser_area, LV_PCT(100), LV_PCT(100)); + else + lv_obj_set_size(explorer->browser_area, LV_PCT(FILE_EXPLORER_BROWSER_AREA_WIDTH), LV_PCT(100)); + } +} +#endif + +static void browser_file_event_handler(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_user_data(e); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + lv_indev_type_t type = lv_indev_get_type(lv_indev_active()); + lv_event_code_t active_code = type == LV_INDEV_TYPE_POINTER || + type == LV_INDEV_TYPE_BUTTON ? LV_EVENT_VALUE_CHANGED : LV_EVENT_CLICKED; + + if(code == active_code) { + char file_name[LV_FILE_EXPLORER_PATH_MAX_LEN]; + const char * selected_text = NULL; + const lv_file_explorer_file_table_entry_data_t * file_entry_user_data = NULL; + uint32_t row; + uint32_t col; + uint8_t navigate_to_parent_dir = 0; + uint8_t navigate_to_child = 0; + + lv_memzero(file_name, sizeof(file_name)); + lv_table_get_selected_cell(explorer->file_table, &row, &col); + selected_text = lv_table_get_cell_value(explorer->file_table, row, col); + file_entry_user_data = lv_table_get_cell_user_data(explorer->file_table, row, col); + + selected_text = selected_text + 5; /* skip table cell format */ + + /* Three navigation modes are supported: + * - Navigate to current directory + * - Navigate to parent directory + * - Navigate to (current directory) child */ + navigate_to_parent_dir = (lv_strcmp(selected_text, LV_FILE_NAVIGATION_PARENT_DIR) == 0); + navigate_to_child = !navigate_to_parent_dir; + + + if((navigate_to_parent_dir) && (lv_strlen(explorer->current_path) > 3)) { + lv_strlcpy(file_name, explorer->current_path, sizeof(file_name)); + strip_ext(file_name); + /*Remove the last '/' character*/ + strip_ext(file_name); + + /* Append / at the end */ + size_t stripped_file_name_length = lv_strlen(file_name); + *(file_name + stripped_file_name_length) = '/'; + if(stripped_file_name_length + 1 < LV_FILE_EXPLORER_PATH_MAX_LEN) { + *(file_name + stripped_file_name_length + 1) = '\0'; + } + } + else { + if(navigate_to_child) { + lv_snprintf((char *)file_name, sizeof(file_name), "%s%s", explorer->current_path, selected_text); + } + else if(navigate_to_parent_dir) { /* We are most likely in the drive letter directory, doesn't have parent directory */ + return; + } + else { /* Nothing to do*/ } + } + + /* Navigate to the file path if this is a directory */ + if(file_entry_user_data->file_kind == LV_FILE_EXPLORER_FILE_KIND_DIR) { + lv_fs_dir_t dir; + lv_fs_res_t res = lv_fs_dir_open(&dir, file_name); + if(res == LV_FS_RES_OK) { + lv_fs_dir_close(&dir); + show_dir(obj, (char *)file_name); + } + else { + LV_LOG_USER("Could not navigate to %s (error: %d)", file_name, res); + } + } + else { + if(navigate_to_child) { + explorer->sel_fn = selected_text; + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + } + } + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_table_set_column_width(explorer->file_table, 0, lv_obj_get_width(explorer->file_table)); + } + else if(code == LV_EVENT_DELETE) { + clear_table_cells_user_data(explorer); + } +} + +static void clear_table_cells_user_data(lv_file_explorer_t * explorer) +{ + const uint32_t row_count = lv_table_get_row_count(explorer->file_table); + const uint32_t col_count = lv_table_get_column_count(explorer->file_table); + + for(uint32_t i = 0; i < row_count; ++i) { + for(uint32_t j = 0; j < col_count; ++j) { + void * file_entry = lv_table_get_cell_user_data(explorer->file_table, i, j); + lv_free(file_entry); + } + } +} + +static void show_dir(lv_obj_t * obj, const char * path) +{ + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + char fn[LV_FILE_EXPLORER_PATH_MAX_LEN]; + uint16_t index = 0; + lv_fs_dir_t dir; + lv_fs_res_t res; + lv_file_explorer_file_table_entry_data_t * file_entry_user_data; + + res = lv_fs_dir_open(&dir, path); + if(res != LV_FS_RES_OK) { + LV_LOG_USER("Open dir error %d!", res); + return; + } + + clear_table_cells_user_data(explorer); + if(explorer->show_back_button) { + lv_table_set_cell_value(explorer->file_table, index++, 0, LV_SYMBOL_LEFT " " LV_FILE_NAVIGATION_PARENT_DIR); + file_entry_user_data = lv_malloc(sizeof(lv_file_explorer_file_table_entry_data_t)); + LV_ASSERT_MALLOC(file_entry_user_data); + file_entry_user_data->file_kind = LV_FILE_EXPLORER_FILE_KIND_DIR; + lv_table_set_cell_user_data(explorer->file_table, 0, 0, file_entry_user_data); + } + + while(1) { + res = lv_fs_dir_read(&dir, fn, sizeof(fn)); + if(res != LV_FS_RES_OK) { + LV_LOG_USER("Driver, file or directory does not exist %d!", res); + break; + } + + /*fn is empty, if not more files to read*/ + if(lv_strlen(fn) == 0) { + LV_LOG_USER("No more files to read!"); + break; + } + + file_entry_user_data = lv_malloc(sizeof(lv_file_explorer_file_table_entry_data_t)); + LV_ASSERT_MALLOC(file_entry_user_data); + + if((is_end_with(fn, ".png") == true) || (is_end_with(fn, ".PNG") == true) || \ + (is_end_with(fn, ".jpg") == true) || (is_end_with(fn, ".JPG") == true) || \ + (is_end_with(fn, ".bmp") == true) || (is_end_with(fn, ".BMP") == true) || \ + (is_end_with(fn, ".gif") == true) || (is_end_with(fn, ".GIF") == true)) { + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_IMAGE " %s", fn); + file_entry_user_data->file_kind = LV_FILE_EXPLORER_FILE_KIND_IMAGE; + } + else if((is_end_with(fn, ".mp3") == true) || (is_end_with(fn, ".MP3") == true) || \ + (is_end_with(fn, ".wav") == true) || (is_end_with(fn, ".WAV") == true)) { + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_AUDIO " %s", fn); + file_entry_user_data->file_kind = LV_FILE_EXPLORER_FILE_KIND_AUDIO; + } + else if((is_end_with(fn, ".mp4") == true) || (is_end_with(fn, ".MP4") == true)) { + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_VIDEO " %s", fn); + file_entry_user_data->file_kind = LV_FILE_EXPLORER_FILE_KIND_VIDEO; + } + else if((is_end_with(fn, ".") == true) || (is_end_with(fn, "..") == true)) { + /*is dir*/ + continue; + } + else if(fn[0] == '/') {/*is dir*/ + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_DIRECTORY " %s", fn + 1); + file_entry_user_data->file_kind = LV_FILE_EXPLORER_FILE_KIND_DIR; + } + else { + lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_FILE " %s", fn); + file_entry_user_data->file_kind = LV_FILE_EXPLORER_FILE_KIND_FILE; + } + + lv_table_set_cell_user_data(explorer->file_table, index, 0, file_entry_user_data); + + index++; + } + + lv_fs_dir_close(&dir); + + lv_table_set_row_count(explorer->file_table, index); + file_explorer_sort(obj); + lv_obj_send_event(obj, LV_EVENT_READY, NULL); + + /*Move the table to the top*/ + lv_obj_scroll_to_y(explorer->file_table, 0, LV_ANIM_OFF); + + lv_strncpy(explorer->current_path, path, sizeof(explorer->current_path)); + lv_label_set_text_fmt(explorer->path_label, LV_SYMBOL_EYE_OPEN" %s", path); + + size_t current_path_len = lv_strlen(explorer->current_path); + if(current_path_len > 0 && + explorer->current_path[current_path_len - 1] != '/' && + current_path_len + 1 < sizeof(explorer->current_path)) { + explorer->current_path[current_path_len] = '/'; + explorer->current_path[current_path_len + 1] = '\0'; + } +} + +/*Remove the specified suffix*/ +static void strip_ext(char * dir) +{ + char * end = dir + lv_strlen(dir); + + while(end >= dir && *end != '/') { + --end; + } + + if(end > dir) { + *end = '\0'; + } + else if(end == dir) { + *(end + 1) = '\0'; + } +} + +static void exch_table_item(lv_obj_t * tb, int16_t i, int16_t j) +{ + if(i == j) return; + const char * i_value = lv_table_get_cell_value(tb, i, 0); + + char * tmp_i_value = lv_malloc(lv_strlen(i_value) + 1); + LV_ASSERT_MALLOC(tmp_i_value); + lv_strcpy(tmp_i_value, i_value); + lv_table_set_cell_value(tb, i, 0, lv_table_get_cell_value(tb, j, 0)); + lv_table_set_cell_value(tb, j, 0, tmp_i_value); + lv_free(tmp_i_value); + + void * old_i_data = lv_table_get_cell_user_data(tb, i, 0); + void * old_j_data = lv_table_get_cell_user_data(tb, j, 0); + lv_table_set_cell_user_data(tb, j, 0, old_i_data); + lv_table_set_cell_user_data(tb, i, 0, old_j_data); +} + +static void file_explorer_sort(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj; + + uint16_t sum = lv_table_get_row_count(explorer->file_table); + + if(sum > 1) { + switch(explorer->sort) { + case LV_EXPLORER_SORT_NONE: + break; + case LV_EXPLORER_SORT_KIND: + sort_by_file_kind(explorer->file_table, 0, (sum - 1)); + break; + default: + break; + } + } +} + +/*Quick sort 3 way*/ +static void sort_by_file_kind(lv_obj_t * tb, int16_t lo, int16_t hi) +{ + if(lo >= hi) return; + + int16_t lt = lo; + int16_t i = lo + 1; + int16_t gt = hi; + lv_file_explorer_file_table_entry_data_t * v = lv_table_get_cell_user_data(tb, lo, 0); + while(i <= gt) { + lv_file_explorer_file_table_entry_data_t * x = lv_table_get_cell_user_data(tb, i, 0); + if(x->file_kind < v->file_kind) + exch_table_item(tb, lt++, i++); + else if(x->file_kind > v->file_kind) + exch_table_item(tb, i, gt--); + else + i++; + } + + sort_by_file_kind(tb, lo, lt - 1); + sort_by_file_kind(tb, gt + 1, hi); +} + +static bool is_end_with(const char * str1, const char * str2) +{ + if(str1 == NULL || str2 == NULL) + return false; + + size_t len1 = lv_strlen(str1); + size_t len2 = lv_strlen(str2); + if((len1 < len2) || (len1 == 0 || len2 == 0)) + return false; + + while(len2 >= 1) { + if(str2[len2 - 1] != str1[len1 - 1]) + return false; + + len2--; + len1--; + } + + return true; +} + +#endif /*LV_USE_FILE_EXPLORER*/ diff --git a/inc/lvgl/src/others/file_explorer/lv_file_explorer.h b/inc/lvgl/src/others/file_explorer/lv_file_explorer.h new file mode 100644 index 0000000..a860cf5 --- /dev/null +++ b/inc/lvgl/src/others/file_explorer/lv_file_explorer.h @@ -0,0 +1,175 @@ +/** + * @file lv_file_explorer.h + * + */ + +#ifndef LV_FILE_EXPLORER_H +#define LV_FILE_EXPLORER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_FILE_EXPLORER != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_EXPLORER_SORT_NONE, + LV_EXPLORER_SORT_KIND, +} lv_file_explorer_sort_t; + +#if LV_FILE_EXPLORER_QUICK_ACCESS +typedef enum { + LV_EXPLORER_HOME_DIR, + LV_EXPLORER_MUSIC_DIR, + LV_EXPLORER_PICTURES_DIR, + LV_EXPLORER_VIDEO_DIR, + LV_EXPLORER_DOCS_DIR, + LV_EXPLORER_FS_DIR, +} lv_file_explorer_dir_t; +#endif + +extern const lv_obj_class_t lv_file_explorer_class; + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_obj_t * lv_file_explorer_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +#if LV_FILE_EXPLORER_QUICK_ACCESS +/** + * Set file_explorer + * @param obj pointer to a label object + * @param dir the dir from 'lv_file_explorer_dir_t' enum. + * @param path path + + */ +void lv_file_explorer_set_quick_access_path(lv_obj_t * obj, lv_file_explorer_dir_t dir, const char * path); +#endif + +/** + * Set file_explorer sort + * @param obj pointer to a file explorer object + * @param sort the sort from 'lv_file_explorer_sort_t' enum. + */ +void lv_file_explorer_set_sort(lv_obj_t * obj, lv_file_explorer_sort_t sort); + +/** + * Set the visibility of the "< Back" button + * @param obj pointer to a file explorer object + * @param show bool true/false, enable or disable button + */ +void lv_file_explorer_show_back_button(lv_obj_t * obj, bool show); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get file explorer Selected file + * @param obj pointer to a file explorer object + * @return pointer to the file explorer selected file name + */ +const char * lv_file_explorer_get_selected_file_name(const lv_obj_t * obj); + +/** + * Get file explorer cur path + * @param obj pointer to a file explorer object + * @return pointer to the file explorer cur path + */ +const char * lv_file_explorer_get_current_path(const lv_obj_t * obj); + +/** + * Get file explorer file list obj(lv_table) + * @param obj pointer to a file explorer object + * @return pointer to the file explorer file table obj(lv_table) + */ +lv_obj_t * lv_file_explorer_get_file_table(lv_obj_t * obj); + +/** + * Get file explorer head area obj + * @param obj pointer to a file explorer object + * @return pointer to the file explorer head area obj(lv_obj) + */ +lv_obj_t * lv_file_explorer_get_header(lv_obj_t * obj); + +/** + * Get file explorer path obj(label) + * @param obj pointer to a file explorer object + * @return pointer to the file explorer path obj(lv_label) + */ +lv_obj_t * lv_file_explorer_get_path_label(lv_obj_t * obj); + +#if LV_FILE_EXPLORER_QUICK_ACCESS +/** + * Get file explorer head area obj + * @param obj pointer to a file explorer object + * @return pointer to the file explorer quick access area obj(lv_obj) + */ +lv_obj_t * lv_file_explorer_get_quick_access_area(lv_obj_t * obj); + +/** + * Get file explorer places list obj(lv_list) + * @param obj pointer to a file explorer object + * @return pointer to the file explorer places list obj(lv_list) + */ +lv_obj_t * lv_file_explorer_get_places_list(lv_obj_t * obj); + +/** + * Get file explorer device list obj(lv_list) + * @param obj pointer to a file explorer object + * @return pointer to the file explorer device list obj(lv_list) + */ +lv_obj_t * lv_file_explorer_get_device_list(lv_obj_t * obj); +#endif + +/** + * Set file_explorer sort + * @param obj pointer to a file explorer object + * @return the current mode from 'lv_file_explorer_sort_t' + */ +lv_file_explorer_sort_t lv_file_explorer_get_sort(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Open a specified path + * @param obj pointer to a file explorer object + * @param dir pointer to the path + */ +void lv_file_explorer_open_dir(lv_obj_t * obj, const char * dir); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FILE_EXPLORER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FILE_EXPLORER_H*/ diff --git a/inc/lvgl/src/others/file_explorer/lv_file_explorer_private.h b/inc/lvgl/src/others/file_explorer/lv_file_explorer_private.h new file mode 100644 index 0000000..1611b47 --- /dev/null +++ b/inc/lvgl/src/others/file_explorer/lv_file_explorer_private.h @@ -0,0 +1,82 @@ +/** + * @file lv_file_explorer_private.h + * + */ + +#ifndef LV_FILE_EXPLORER_PRIVATE_H +#define LV_FILE_EXPLORER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_file_explorer.h" + +#if LV_USE_FILE_EXPLORER != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of canvas*/ +struct _lv_file_explorer_t { + lv_obj_t obj; + lv_obj_t * cont; + lv_obj_t * head_area; + lv_obj_t * browser_area; + lv_obj_t * file_table; + lv_obj_t * path_label; +#if LV_FILE_EXPLORER_QUICK_ACCESS + lv_obj_t * quick_access_area; + lv_obj_t * list_device; + lv_obj_t * list_places; + char * home_dir; + char * music_dir; + char * pictures_dir; + char * video_dir; + char * docs_dir; + char * fs_dir; +#endif + const char * sel_fn; + char current_path[LV_FILE_EXPLORER_PATH_MAX_LEN]; + lv_file_explorer_sort_t sort; + bool show_back_button; +}; + +typedef enum { + LV_FILE_EXPLORER_FILE_KIND_DIR, + LV_FILE_EXPLORER_FILE_KIND_IMAGE, + LV_FILE_EXPLORER_FILE_KIND_AUDIO, + LV_FILE_EXPLORER_FILE_KIND_VIDEO, + LV_FILE_EXPLORER_FILE_KIND_FILE +} lv_file_explorer_file_kind_t; + +typedef struct { + lv_file_explorer_file_kind_t file_kind; +} lv_file_explorer_file_table_entry_data_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_FILE_EXPLORER != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FILE_EXPLORER_PRIVATE_H*/ diff --git a/inc/lvgl/src/others/fragment/lv_fragment.c b/inc/lvgl/src/others/fragment/lv_fragment.c new file mode 100644 index 0000000..9d7fd71 --- /dev/null +++ b/inc/lvgl/src/others/fragment/lv_fragment.c @@ -0,0 +1,156 @@ +/** + * @file lv_fragment.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_fragment_private.h" + +#if LV_USE_FRAGMENT +#include "../../stdlib/lv_string.h" + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void cb_delete_assertion(lv_event_t * event); + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args) +{ + LV_LOG_WARN("lv_fragment is deprecated and will be removed in an upcoming release."); + LV_ASSERT_NULL(cls); + LV_ASSERT_NULL(cls->create_obj_cb); + LV_ASSERT(cls->instance_size >= sizeof(lv_fragment_t)); + lv_fragment_t * instance = lv_malloc_zeroed(cls->instance_size); + instance->cls = cls; + instance->child_manager = lv_fragment_manager_create(instance); + if(cls->constructor_cb) { + cls->constructor_cb(instance, args); + } + return instance; +} + +void lv_fragment_delete(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + if(fragment->managed) { + lv_fragment_manager_remove(fragment->managed->manager, fragment); + return; + } + if(fragment->obj) { + lv_fragment_delete_obj(fragment); + } + /* Objects will leak if this function called before objects deleted */ + const lv_fragment_class_t * cls = fragment->cls; + if(cls->destructor_cb) { + cls->destructor_cb(fragment); + } + lv_fragment_manager_delete(fragment->child_manager); + lv_free(fragment); +} + +lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + return fragment->managed->manager; +} + +lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + return fragment->managed->container; +} + +lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + return lv_fragment_manager_get_parent_fragment(fragment->managed->manager); +} + +lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container) +{ + lv_fragment_managed_states_t * states = fragment->managed; + if(states) { + states->destroying_obj = false; + } + const lv_fragment_class_t * cls = fragment->cls; + lv_obj_t * obj = cls->create_obj_cb(fragment, container); + LV_ASSERT_NULL(obj); + fragment->obj = obj; + lv_fragment_manager_create_obj(fragment->child_manager); + if(states) { + states->obj_created = true; + lv_obj_add_event_cb(obj, cb_delete_assertion, LV_EVENT_DELETE, NULL); + } + if(cls->obj_created_cb) { + cls->obj_created_cb(fragment, obj); + } + return obj; +} + +void lv_fragment_delete_obj(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + lv_fragment_manager_delete_obj(fragment->child_manager); + lv_fragment_managed_states_t * states = fragment->managed; + if(states) { + if(!states->obj_created) return; + states->destroying_obj = true; + + uint32_t i; + uint32_t event_cnt = lv_obj_get_event_count(fragment->obj); + bool cb_removed = false; + for(i = 0; i < event_cnt; i++) { + lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(fragment->obj, i); + if(lv_event_dsc_get_cb(event_dsc) == cb_delete_assertion) { + cb_removed = lv_obj_remove_event(fragment->obj, i); + break; + } + } + + LV_ASSERT(cb_removed); + } + LV_ASSERT_NULL(fragment->obj); + const lv_fragment_class_t * cls = fragment->cls; + if(cls->obj_will_delete_cb) { + cls->obj_will_delete_cb(fragment, fragment->obj); + } + lv_obj_delete(fragment->obj); + if(cls->obj_deleted_cb) { + cls->obj_deleted_cb(fragment, fragment->obj); + } + if(states) { + states->obj_created = false; + } + fragment->obj = NULL; +} + +void lv_fragment_recreate_obj(lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + lv_fragment_delete_obj(fragment); + lv_fragment_create_obj(fragment, *fragment->managed->container); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void cb_delete_assertion(lv_event_t * event) +{ + LV_UNUSED(event); + LV_ASSERT_MSG(0, "Please delete objects with lv_fragment_destroy_obj"); +} + +#endif /*LV_USE_FRAGMENT*/ diff --git a/inc/lvgl/src/others/fragment/lv_fragment.h b/inc/lvgl/src/others/fragment/lv_fragment.h new file mode 100644 index 0000000..1e7d29f --- /dev/null +++ b/inc/lvgl/src/others/fragment/lv_fragment.h @@ -0,0 +1,297 @@ +/** + * Public header for Fragment + * @file lv_fragment.h + */ + +#ifndef LV_FRAGMENT_H +#define LV_FRAGMENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_FRAGMENT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct _lv_fragment_manager_t lv_fragment_manager_t; + +struct _lv_fragment_t { + /** + * Class of this fragment + */ + const lv_fragment_class_t * cls; + /** + * Managed fragment states. If not null, then this fragment is managed. + * + * @warning Don't modify values inside this struct! + */ + lv_fragment_managed_states_t * managed; + /** + * Child fragment manager + */ + lv_fragment_manager_t * child_manager; + /** + * lv_obj returned by create_obj_cb + */ + lv_obj_t * obj; + +}; + +struct _lv_fragment_class_t { + /** + * Constructor function for fragment class + * @param self Fragment instance + * @param args Arguments assigned by fragment manager + */ + void (*constructor_cb)(lv_fragment_t * self, void * args); + + /** + * Destructor function for fragment class + * @param self Fragment instance, will be freed after this call + */ + void (*destructor_cb)(lv_fragment_t * self); + + /** + * Fragment attached to manager + * @param self Fragment instance + */ + void (*attached_cb)(lv_fragment_t * self); + + /** + * Fragment detached from manager + * @param self Fragment instance + */ + void (*detached_cb)(lv_fragment_t * self); + + /** + * Create objects + * @param self Fragment instance + * @param container Container of the objects should be created upon + * @return Created object, NULL if multiple objects has been created + */ + lv_obj_t * (*create_obj_cb)(lv_fragment_t * self, lv_obj_t * container); + + /** + * + * @param self Fragment instance + * @param obj lv_obj returned by create_obj_cb + */ + void (*obj_created_cb)(lv_fragment_t * self, lv_obj_t * obj); + + /** + * Called before objects in the fragment will be deleted. + * + * @param self Fragment instance + * @param obj object with this fragment + */ + void (*obj_will_delete_cb)(lv_fragment_t * self, lv_obj_t * obj); + + /** + * Called when the object created by fragment received `LV_EVENT_DELETE` event + * @param self Fragment instance + * @param obj object with this fragment + */ + void (*obj_deleted_cb)(lv_fragment_t * self, lv_obj_t * obj); + + /** + * Handle event + * @param self Fragment instance + * @param which User-defined ID of event + * @param data1 User-defined data + * @param data2 User-defined data + */ + bool (*event_cb)(lv_fragment_t * self, int code, void * userdata); + + /** + * *REQUIRED*: Allocation size of fragment + */ + size_t instance_size; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create fragment manager instance + * @param parent Parent fragment if this manager is placed inside another fragment, can be null. + * @return Fragment manager instance + */ +lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent); + +/** + * Destroy fragment manager instance + * @param manager Fragment manager instance + */ +void lv_fragment_manager_delete(lv_fragment_manager_t * manager); + +/** + * Create object of all fragments managed by this manager. + * @param manager Fragment manager instance + */ +void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager); + +/** + * Delete object created by all fragments managed by this manager. Instance of fragments will not be deleted. + * @param manager Fragment manager instance + */ +void lv_fragment_manager_delete_obj(lv_fragment_manager_t * manager); + +/** + * Attach fragment to manager, and add to container. + * @param manager Fragment manager instance + * @param fragment Fragment instance + * @param container Pointer to container object for manager to add objects to + */ +void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container); + +/** + * Detach and destroy fragment. If fragment is in navigation stack, remove from it. + * @param manager Fragment manager instance + * @param fragment Fragment instance + */ +void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment); + +/** + * Attach fragment to manager and add to navigation stack. + * @param manager Fragment manager instance + * @param fragment Fragment instance + * @param container Pointer to container object for manager to add objects to + */ +void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container); + +/** + * Remove the top-most fragment for stack + * @param manager Fragment manager instance + * @return true if there is fragment to pop + */ +bool lv_fragment_manager_pop(lv_fragment_manager_t * manager); + +/** + * Replace fragment. Old item in the stack will be removed. + * @param manager Fragment manager instance + * @param fragment Fragment instance + * @param container Pointer to container object for manager to add objects to + */ +void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container); + +/** + * Send event to top-most fragment + * @param manager Fragment manager instance + * @param code User-defined ID of event + * @param userdata User-defined data + * @return true if fragment returned true + */ +bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata); + +/** + * Get stack size of this fragment manager + * @param manager Fragment manager instance + * @return Stack size of this fragment manager + */ +size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager); + +/** + * Get top most fragment instance + * @param manager Fragment manager instance + * @return Top most fragment instance + */ +lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager); + +/** + * Find first fragment instance in the container + * @param manager Fragment manager instance + * @param container Container which target fragment added to + * @return First fragment instance in the container + */ +lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container); + +/** + * Get parent fragment + * @param manager Fragment manager instance + * @return Parent fragment instance + */ +lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager); + +/** + * Create a fragment instance. + * + * @param cls Fragment class. This fragment must return non null object. + * @param args Arguments assigned by fragment manager + * @return Fragment instance + */ +lv_fragment_t * lv_fragment_create(const lv_fragment_class_t * cls, void * args); + +/** + * Destroy a fragment. + * @param fragment Fragment instance. + */ +void lv_fragment_delete(lv_fragment_t * fragment); + +/** + * Get associated manager of this fragment + * @param fragment Fragment instance + * @return Fragment manager instance + */ +lv_fragment_manager_t * lv_fragment_get_manager(lv_fragment_t * fragment); + +/** + * Get container object of this fragment + * @param fragment Fragment instance + * @return Reference to container object + */ +lv_obj_t * const * lv_fragment_get_container(lv_fragment_t * fragment); + +/** + * Get parent fragment of this fragment + * @param fragment Fragment instance + * @return Parent fragment + */ +lv_fragment_t * lv_fragment_get_parent(lv_fragment_t * fragment); + +/** + * Create object by fragment. + * + * @param fragment Fragment instance. + * @param container Container of the objects should be created upon. + * @return Created object + */ +lv_obj_t * lv_fragment_create_obj(lv_fragment_t * fragment, lv_obj_t * container); + +/** + * Delete created object of a fragment + * + * @param fragment Fragment instance. + */ +void lv_fragment_delete_obj(lv_fragment_t * fragment); + +/** + * Destroy obj in fragment, and recreate them. + * @param fragment Fragment instance + */ +void lv_fragment_recreate_obj(lv_fragment_t * fragment); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_FRAGMENT*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FRAGMENT_H*/ diff --git a/inc/lvgl/src/others/fragment/lv_fragment_manager.c b/inc/lvgl/src/others/fragment/lv_fragment_manager.c new file mode 100644 index 0000000..5782a16 --- /dev/null +++ b/inc/lvgl/src/others/fragment/lv_fragment_manager.c @@ -0,0 +1,279 @@ +/** + * @file lv_fragment_manager.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_fragment_private.h" + +#if LV_USE_FRAGMENT + +#include "../../misc/lv_ll.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef struct _lv_fragment_stack_item_t { + lv_fragment_managed_states_t * states; +} lv_fragment_stack_item_t; + +struct _lv_fragment_manager_t { + lv_fragment_t * parent; + /** + * Linked list to store attached fragments + */ + lv_ll_t attached; + /** + * Linked list to store fragments in stack + */ + lv_ll_t stack; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void item_create_obj(lv_fragment_managed_states_t * item); + +static void item_delete_obj(lv_fragment_managed_states_t * item); + +static void item_delete_fragment(lv_fragment_managed_states_t * item); + +static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_fragment_manager_t * lv_fragment_manager_create(lv_fragment_t * parent) +{ + lv_fragment_manager_t * instance = lv_malloc_zeroed(sizeof(lv_fragment_manager_t)); + instance->parent = parent; + lv_ll_init(&instance->attached, sizeof(lv_fragment_managed_states_t)); + lv_ll_init(&instance->stack, sizeof(lv_fragment_stack_item_t)); + return instance; +} + +void lv_fragment_manager_delete(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + lv_fragment_managed_states_t * states; + LV_LL_READ_BACK(&manager->attached, states) { + item_delete_obj(states); + item_delete_fragment(states); + } + lv_ll_clear(&manager->attached); + lv_ll_clear(&manager->stack); + lv_free(manager); +} + +void lv_fragment_manager_create_obj(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + lv_fragment_stack_item_t * top = lv_ll_get_tail(&manager->stack); + lv_fragment_managed_states_t * states = NULL; + LV_LL_READ(&manager->attached, states) { + if(states->in_stack && top->states != states) { + /*Only create obj for top item in stack*/ + continue; + } + item_create_obj(states); + } +} + +void lv_fragment_manager_delete_obj(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + lv_fragment_managed_states_t * states = NULL; + LV_LL_READ_BACK(&manager->attached, states) { + item_delete_obj(states); + } +} + +void lv_fragment_manager_add(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) +{ + lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container); + if(!manager->parent || manager->parent->managed->obj_created) { + item_create_obj(states); + } +} + +void lv_fragment_manager_remove(lv_fragment_manager_t * manager, lv_fragment_t * fragment) +{ + LV_ASSERT_NULL(manager); + LV_ASSERT_NULL(fragment); + LV_ASSERT_NULL(fragment->managed); + LV_ASSERT(fragment->managed->manager == manager); + lv_fragment_managed_states_t * states = fragment->managed; + lv_fragment_managed_states_t * prev = NULL; + bool was_top = false; + if(states->in_stack) { + void * stack_top = lv_ll_get_tail(&manager->stack); + lv_fragment_stack_item_t * item = NULL; + LV_LL_READ_BACK(&manager->stack, item) { + if(item->states == states) { + was_top = stack_top == item; + void * stack_prev = lv_ll_get_prev(&manager->stack, item); + if(!stack_prev) break; + prev = ((lv_fragment_stack_item_t *) stack_prev)->states; + break; + } + } + if(item) { + lv_ll_remove(&manager->stack, item); + lv_free(item); + } + } + item_delete_obj(states); + item_delete_fragment(states); + lv_ll_remove(&manager->attached, states); + lv_free(states); + if(prev && was_top) { + item_create_obj(prev); + } +} + +void lv_fragment_manager_push(lv_fragment_manager_t * manager, lv_fragment_t * fragment, lv_obj_t * const * container) +{ + lv_fragment_stack_item_t * top = lv_ll_get_tail(&manager->stack); + if(top != NULL) { + item_delete_obj(top->states); + } + lv_fragment_managed_states_t * states = fragment_attach(manager, fragment, container); + states->in_stack = true; + /*Add fragment to the top of the stack*/ + lv_fragment_stack_item_t * item = lv_ll_ins_tail(&manager->stack); + lv_memzero(item, sizeof(lv_fragment_stack_item_t)); + item->states = states; + item_create_obj(states); +} + +bool lv_fragment_manager_pop(lv_fragment_manager_t * manager) +{ + lv_fragment_t * top = lv_fragment_manager_get_top(manager); + if(top == NULL) return false; + lv_fragment_manager_remove(manager, top); + return true; +} + +void lv_fragment_manager_replace(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container) +{ + lv_fragment_t * top = lv_fragment_manager_find_by_container(manager, *container); + if(top != NULL) { + lv_fragment_manager_remove(manager, top); + } + lv_fragment_manager_add(manager, fragment, container); +} + +bool lv_fragment_manager_send_event(lv_fragment_manager_t * manager, int code, void * userdata) +{ + LV_ASSERT_NULL(manager); + lv_fragment_managed_states_t * p = NULL; + LV_LL_READ_BACK(&manager->attached, p) { + if(!p->obj_created || p->destroying_obj) continue; + lv_fragment_t * instance = p->instance; + if(!instance) continue; + if(lv_fragment_manager_send_event(instance->child_manager, code, userdata)) return true; + if(p->cls->event_cb && p->cls->event_cb(instance, code, userdata)) return true; + } + return false; +} + +size_t lv_fragment_manager_get_stack_size(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + return lv_ll_get_len(&manager->stack); +} + +lv_fragment_t * lv_fragment_manager_get_top(lv_fragment_manager_t * manager) +{ + LV_ASSERT(manager); + lv_fragment_stack_item_t * top = lv_ll_get_tail(&manager->stack); + if(!top)return NULL; + return top->states->instance; +} + +lv_fragment_t * lv_fragment_manager_find_by_container(lv_fragment_manager_t * manager, const lv_obj_t * container) +{ + LV_ASSERT(manager); + lv_fragment_managed_states_t * states; + LV_LL_READ(&manager->attached, states) { + if(*states->container == container) return states->instance; + } + return NULL; +} + +lv_fragment_t * lv_fragment_manager_get_parent_fragment(lv_fragment_manager_t * manager) +{ + LV_ASSERT_NULL(manager); + return manager->parent; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void item_create_obj(lv_fragment_managed_states_t * item) +{ + LV_ASSERT(item->instance); + lv_fragment_create_obj(item->instance, item->container ? *item->container : NULL); +} + +static void item_delete_obj(lv_fragment_managed_states_t * item) +{ + lv_fragment_delete_obj(item->instance); +} + +/** + * Detach, then destroy fragment + * @param item fragment states + */ +static void item_delete_fragment(lv_fragment_managed_states_t * item) +{ + lv_fragment_t * instance = item->instance; + if(instance->cls->detached_cb) { + instance->cls->detached_cb(instance); + } + instance->managed = NULL; + lv_fragment_delete(instance); + item->instance = NULL; +} + +static lv_fragment_managed_states_t * fragment_attach(lv_fragment_manager_t * manager, lv_fragment_t * fragment, + lv_obj_t * const * container) +{ + LV_ASSERT(manager); + LV_ASSERT(fragment); + LV_ASSERT(fragment->managed == NULL); + lv_fragment_managed_states_t * states = lv_ll_ins_tail(&manager->attached); + lv_memzero(states, sizeof(lv_fragment_managed_states_t)); + states->cls = fragment->cls; + states->manager = manager; + states->container = container; + states->instance = fragment; + fragment->managed = states; + if(fragment->cls->attached_cb) { + fragment->cls->attached_cb(fragment); + } + return states; +} + +#endif /*LV_USE_FRAGMENT*/ diff --git a/inc/lvgl/src/others/fragment/lv_fragment_private.h b/inc/lvgl/src/others/fragment/lv_fragment_private.h new file mode 100644 index 0000000..bf0d23f --- /dev/null +++ b/inc/lvgl/src/others/fragment/lv_fragment_private.h @@ -0,0 +1,77 @@ +/** + * @file lv_fragment_private.h + * + */ + +#ifndef LV_FRAGMENT_PRIVATE_H +#define LV_FRAGMENT_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_fragment.h" + +#if LV_USE_FRAGMENT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Fragment states + */ +struct _lv_fragment_managed_states_t { + /** + * Class of the fragment + */ + const lv_fragment_class_t * cls; + /** + * Manager the fragment attached to + */ + lv_fragment_manager_t * manager; + /** + * Container object the fragment adding view to + */ + lv_obj_t * const * container; + /** + * Fragment instance + */ + lv_fragment_t * instance; + /** + * true between `create_obj_cb` and `obj_deleted_cb` + */ + bool obj_created; + /** + * true before `lv_fragment_delete_obj` is called. Don't touch any object if this is true + */ + bool destroying_obj; + /** + * true if this fragment is in navigation stack that can be popped + */ + bool in_stack; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_FRAGMENT */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_FRAGMENT_PRIVATE_H*/ diff --git a/inc/lvgl/src/others/translation/lv_translation.c b/inc/lvgl/src/others/translation/lv_translation.c new file mode 100644 index 0000000..7d14074 --- /dev/null +++ b/inc/lvgl/src/others/translation/lv_translation.c @@ -0,0 +1,298 @@ +/** + * @file lv_translation.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_translation.h" +#if LV_USE_TRANSLATION + +#include "lv_translation_private.h" +#include "../../misc/lv_ll.h" +#include "../../stdlib/lv_mem.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_assert.h" +#include "../../core/lv_global.h" +#include "../../lvgl_private.h" + +/********************* + * DEFINES + *********************/ +#define packs_ll (LV_GLOBAL_DEFAULT()->translation_packs_ll) +#define selected_lang (LV_GLOBAL_DEFAULT()->translation_selected_lang) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static lv_obj_tree_walk_res_t send_language_change_event(lv_obj_t * obj, void * lang); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_translation_init(void) +{ + lv_ll_init(&packs_ll, sizeof(lv_translation_pack_t)); + selected_lang = NULL; +} + +void lv_translation_deinit(void) +{ + lv_translation_pack_t * pack; + LV_LL_READ(&packs_ll, pack) { + if(pack->is_static == false) { + size_t i; + size_t trans_cnt = lv_array_size(&pack->translation_array); + for(i = 0; i < trans_cnt; i++) { + lv_translation_tag_dsc_t * tag = lv_array_at(&pack->translation_array, i); + lv_free((void *)tag->tag); + + size_t j; + for(j = 0; j < pack->language_cnt; j++) { + lv_free((void *)tag->translations[j]); /*Free each translation of the tag*/ + } + lv_free(tag->translations); + } + + lv_array_deinit(&pack->translation_array); + + for(i = 0; i < pack->language_cnt; i++) { + lv_free((void *)pack->languages[i]); + } + lv_free(pack->languages); + } + } + + lv_ll_clear(&packs_ll); + + lv_free((void *)selected_lang); +} + +lv_translation_pack_t * lv_translation_add_static(const char * const languages[], const char * const tags[], + const char * const translations[]) +{ + LV_ASSERT_NULL(languages); + LV_ASSERT_NULL(tags); + LV_ASSERT_NULL(translations); + + lv_translation_pack_t * pack = lv_ll_ins_head(&packs_ll); + LV_ASSERT_MALLOC(pack); + if(pack == NULL) return NULL; + lv_memzero(pack, sizeof(lv_translation_pack_t)); + pack->is_static = 1; + + /*Count the languages*/ + while(languages[pack->language_cnt]) { + pack->language_cnt++; + } + + pack->languages = (const char **)languages; + pack->tag_p = (const char **)tags; + pack->translation_p = (const char **)translations; + return pack; +} + +lv_translation_pack_t * lv_translation_add_dynamic(void) +{ + lv_translation_pack_t * pack = lv_ll_ins_head(&packs_ll); + LV_ASSERT_MALLOC(pack); + if(pack == NULL) return NULL; + + lv_memzero(pack, sizeof(lv_translation_pack_t)); + + pack->is_static = 0; + lv_array_init(&pack->translation_array, 16, sizeof(lv_translation_tag_dsc_t)); + + return pack; +} + +const char * lv_translation_get_language(void) +{ + return selected_lang; +} + +void lv_translation_set_language(const char * lang) +{ + if(selected_lang) lv_free((void *)selected_lang); + selected_lang = lv_strdup(lang); + lv_obj_tree_walk(NULL, send_language_change_event, (void *)lang); +} + +const char * lv_translation_get(const char * tag) +{ + if(selected_lang == NULL) { + LV_LOG_WARN("No language is selected to get the translation of `%s`", tag); + return tag; + } + + lv_translation_pack_t * pack; + bool lang_found = false; + LV_LL_READ(&packs_ll, pack) { + uint32_t lang; + for(lang = 0; lang < pack->language_cnt; lang++) { + /*Does this pack contains the language?*/ + if(lv_streq(pack->languages[lang], selected_lang)) { + lang_found = true; + /*Find the tag*/ + if(pack->is_static) { + uint32_t t; + for(t = 0; pack->tag_p[t]; t++) { + if(lv_streq(pack->tag_p[t], tag)) { + /*Find the "row" of the tag */ + const char ** tr_row = pack->translation_p + pack->language_cnt * t; + const char * tr = tr_row[lang]; + if(tr) return tr; /*Found directly*/ + + LV_LOG_WARN("`%s` tag is not found. Using the tag as translation.", tag); + return tag; /*Return the tag as a fall back*/ + } + } + } + else { + size_t trans_cnt = lv_array_size(&pack->translation_array); + size_t i; + for(i = 0; i < trans_cnt; i++) { + lv_translation_tag_dsc_t * tag_dsc = lv_array_at(&pack->translation_array, i); + if(lv_streq(tag_dsc->tag, tag)) { + const char * tr = tag_dsc->translations[lang]; + if(tr) return tr; /*Found directly*/ + + LV_LOG_WARN("`%s` tag is not found. Using the tag as translation.", tag); + return tag; /*Return the tag as a worst case option*/ + } + } + } + } + } + } + + if(lang_found) { + LV_LOG_WARN("`%s` tag is not found, using the tag as translation.", tag); + } + else { + LV_LOG_WARN("`%s` language is not found, using the `%s` as translation.", selected_lang, tag); + } + + return tag; +} + +lv_result_t lv_translation_add_language(lv_translation_pack_t * pack, const char * lang) +{ + if(pack->is_static) { + LV_LOG_WARN("Can't add language `%s` to static translation pack `%p`", lang, (void *)pack); + return LV_RESULT_INVALID; + } + + pack->language_cnt++; + pack->languages = lv_realloc(pack->languages, sizeof(const char *) * pack->language_cnt); + LV_ASSERT_MALLOC(pack->languages); + if(pack->languages == NULL) { + LV_LOG_WARN("Couldn't allocate languages in `%p`", (void *)pack); + return LV_RESULT_INVALID; + } + + pack->languages[pack->language_cnt - 1] = lv_strdup(lang); + LV_ASSERT_MALLOC(pack->languages[pack->language_cnt - 1]); + if(pack->languages[pack->language_cnt - 1] == NULL) { + LV_LOG_WARN("Couldn't allocate the new language in `%p`", (void *)pack); + return LV_RESULT_INVALID; + } + + return LV_RESULT_OK; +} + +int32_t lv_translation_get_language_index(lv_translation_pack_t * pack, const char * lang_name) +{ + uint32_t i; + for(i = 0; i < pack->language_cnt; i++) { + if(lv_streq(pack->languages[i], lang_name)) return (int32_t)i; + } + + return -1; +} + + +lv_translation_tag_dsc_t * lv_translation_add_tag(lv_translation_pack_t * pack, const char * tag_name) +{ + if(pack->is_static) { + LV_LOG_WARN("Can't add tag `%s` to static translation pack `%p`", tag_name, (void *)pack); + return NULL; + } + + lv_translation_tag_dsc_t tag; + tag.tag = lv_strdup(tag_name); + LV_ASSERT_MALLOC(tag.tag); + tag.translations = lv_zalloc(pack->language_cnt * sizeof(const char *)); + LV_ASSERT_MALLOC(tag.translations); + + if(tag.tag == NULL || tag.translations == NULL) { + LV_LOG_WARN("Couldn't allocate memory for the tag's data in `%p`", (void *)pack); + lv_free((void *)tag.tag); + lv_free((void *)tag.translations); + return NULL; + } + + lv_result_t res = lv_array_push_back(&pack->translation_array, &tag); + + if(res != LV_RESULT_OK) { + LV_LOG_WARN("Couldn't add the tag in `%p`", (void *)pack); + lv_free((void *)tag.tag); + lv_free((void *)tag.translations); + return NULL; + } + + return lv_array_back(&pack->translation_array); +} + +lv_result_t lv_translation_set_tag_translation(lv_translation_pack_t * pack, lv_translation_tag_dsc_t * tag, + uint32_t lang_idx, const char * trans) +{ + if(pack->is_static) { + LV_LOG_WARN("Can't set tag translation`%s` in static translation pack `%p`", trans, (void *)pack); + return LV_RESULT_INVALID; + } + + if(lang_idx >= pack->language_cnt) { + + LV_LOG_WARN("Can't set the translation for language %" LV_PRIu32 " as there are only %" LV_PRIu32 + " languages defined in %p", + lang_idx, pack->language_cnt, (void *)pack); + return LV_RESULT_INVALID; + } + + lv_free((void *)tag->translations[lang_idx]); /*Free the earlier set language if any*/ + tag->translations[lang_idx] = lv_strdup(trans); + if(tag->translations[lang_idx] == NULL) { + LV_LOG_WARN("Couldn't allocate the new translation in tag `%p` in pack `%p`", (void *)tag, (void *) pack); + return LV_RESULT_INVALID; + } + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_obj_tree_walk_res_t send_language_change_event(lv_obj_t * obj, void * lang) +{ + lv_obj_send_event(obj, LV_EVENT_TRANSLATION_LANGUAGE_CHANGED, lang); + return LV_OBJ_TREE_WALK_NEXT; +} + +#endif /*LV_USE_TRANSLATION*/ diff --git a/inc/lvgl/src/others/translation/lv_translation.h b/inc/lvgl/src/others/translation/lv_translation.h new file mode 100644 index 0000000..cab96cf --- /dev/null +++ b/inc/lvgl/src/others/translation/lv_translation.h @@ -0,0 +1,147 @@ +/** + * @file lv_translation.h + * + */ + +#ifndef LV_TRANSLATION_H +#define LV_TRANSLATION_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_TRANSLATION + +#include LV_STDINT_INCLUDE +#include "../../misc/lv_array.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the translation module + */ +void lv_translation_init(void); + +/** + * De-initialize the translation module and free all allocated translations + */ +void lv_translation_deinit(void); + +/** + * Register a translation pack from static arrays. + * All the pointers need to be static, that is to live while they are used + * @param languages List of languages. E.g. `{"en", "de", NULL}` + * @param tags Tags that are using in the UI. E.g. `{"dog", "cat", NULL}` + * @param translations List of translations. E.g. `{"Dog", "Cat", "Hund", "Katze"}` + * @return The created pack + */ +lv_translation_pack_t * lv_translation_add_static(const char * const languages[], const char * const tags[], + const char * const translations[]); + +/** + * Add a pack to which translations can be added dynamically. + * `pack->languages` needs to be a malloc-ed array where each language is also malloc-ed as an element. + * `pack->translation_array` stores the translation having `lv_translation_tag_dsc_t` items + * In each array element `tag` is a malloced string, `translations` is a malloc-ed array + * with malloc-ed array for each element. + * @return the created pack to which data can be added manually. + */ +lv_translation_pack_t * lv_translation_add_dynamic(void); + +/** + * Select the current language + * The `LV_EVENT_TRANSLATION_LANGUAGE_CHANGED` event will be sent to every widget + * @param lang a string from the defined languages. E.g. "en" or "de" + */ +void lv_translation_set_language(const char * lang); + +/** + * Get the current selected language + * @return the current selected language + */ +const char * lv_translation_get_language(void); + +/** + * Get the translated version of a tag on the selected language + * @param tag the tag to translate + * @return the translation + * @note fallback rules: + * - if the tag is found on the selected language return it + * - if the tag is not found on the selected language, use the fist language + * - if the tag is not found on the first language, return the tag + */ +const char * lv_translation_get(const char * tag); + +/** + * Shorthand of lv_translation_set_language + * @param tag the tag to translate + * @return the translation + */ +static inline const char * lv_tr(const char * tag) +{ + return lv_translation_get(tag); +} + +/** + * Add a new language to a dynamic language pack. + * All languages should be added before adding tags + * @param pack pointer to a dynamic translation pack + * @param lang language to add, e.g. "en", or "de" + * @return LV_RESULT_OK: success, LV_RESULT_INVALID: failed + */ +lv_result_t lv_translation_add_language(lv_translation_pack_t * pack, const char * lang); + +/** + * Get the index of a language in a pack. + * @param pack pointer to a static or dynamic language pack + * @param lang_name name of the language to find + * @return index of the language or -1 if not found. + */ +int32_t lv_translation_get_language_index(lv_translation_pack_t * pack, const char * lang_name); + +/** + * Add a new tag to a dynamic language pack. + * Once the tag is added the translations for each language can be added too by using + * `lv_translation_set_tag_translation` + * @param pack pointer to a dynamic translation pack + * @param tag_name name of the tag, e.g. "dog", or "house" + * @return pointer to the allocated tag descriptor + */ +lv_translation_tag_dsc_t * lv_translation_add_tag(lv_translation_pack_t * pack, const char * tag_name); + +/** + * Add a translation to a tag in a dynamic translation pack + * @param pack pointer to a dynamic translation pack + * @param tag return value of `lv_translation_add_tag` + * @param lang_idx index of the language for which translation should be set + * @param trans the translation on the given language + * @return LV_RESULT_OK: success, LV_RESULT_INVALID: failed + */ +lv_result_t lv_translation_set_tag_translation(lv_translation_pack_t * pack, lv_translation_tag_dsc_t * tag, + uint32_t lang_idx, const char * trans); + +/********************** + * MACROS + **********************/ +#endif /*LV_USE_TRANSLATION*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_TRANSLATION_H */ diff --git a/inc/lvgl/src/others/translation/lv_translation_private.h b/inc/lvgl/src/others/translation/lv_translation_private.h new file mode 100644 index 0000000..3fae694 --- /dev/null +++ b/inc/lvgl/src/others/translation/lv_translation_private.h @@ -0,0 +1,59 @@ +/** + * @file lv_translation_private.h + * + */ + +#ifndef LV_TRANSLATION_PRIVATE_H +#define LV_TRANSLATION_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_TRANSLATION + +#include LV_STDINT_INCLUDE +#include "../../misc/lv_array.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_translation_tag_dsc_t { + const char * tag; + const char ** translations; /**< Translations for each language*/ +}; + +struct _lv_translation_pack_t { + const char ** languages; + uint32_t language_cnt; + uint32_t is_static; /*In the union translations_p is used*/ + const char ** tag_p; + const char ** translation_p; /*E.g. {{"a", "b"}, {"c", "d"}}*/ + lv_array_t translation_array; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TRANSLATION*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_TRANSLATION_PRIVATE_H */ diff --git a/inc/lvgl/src/stdlib/builtin/LICENSE_SPRINTF.txt b/inc/lvgl/src/stdlib/builtin/LICENSE_SPRINTF.txt new file mode 100644 index 0000000..bd9d8c1 --- /dev/null +++ b/inc/lvgl/src/stdlib/builtin/LICENSE_SPRINTF.txt @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2014 Marco Paland + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Original repository: https://github.com/mpaland/printf diff --git a/inc/lvgl/src/stdlib/builtin/LICENSE_TLSF.txt b/inc/lvgl/src/stdlib/builtin/LICENSE_TLSF.txt new file mode 100644 index 0000000..25b0fff --- /dev/null +++ b/inc/lvgl/src/stdlib/builtin/LICENSE_TLSF.txt @@ -0,0 +1 @@ +Released under the BSD license. diff --git a/inc/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c b/inc/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c new file mode 100644 index 0000000..a07a8da --- /dev/null +++ b/inc/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c @@ -0,0 +1,273 @@ +/** + * @file lv_mem_core_builtin.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_mem.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + +#include "lv_tlsf.h" +#include "../lv_string.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_ll.h" +#include "../../misc/lv_math.h" +#include "../../osal/lv_os_private.h" +#include "../../core/lv_global.h" + +#ifdef LV_MEM_POOL_INCLUDE + #include LV_MEM_POOL_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ +/*memset the allocated memories to 0xaa and freed memories to 0xbb (just for testing purposes)*/ +#ifndef LV_MEM_ADD_JUNK + #define LV_MEM_ADD_JUNK 0 +#endif + +#ifdef LV_ARCH_64 + #define MEM_UNIT uint64_t + #define ALIGN_MASK 0x7 +#else + #define MEM_UNIT uint32_t + #define ALIGN_MASK 0x3 +#endif +#define state LV_GLOBAL_DEFAULT()->tlsf_state + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_mem_walker(void * ptr, size_t size, int used, void * user); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_MEM + #define LV_TRACE_MEM(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_MEM(...) +#endif + +#define _COPY(d, s) *d = *s; d++; s++; +#define _SET(d, v) *d = v; d++; +#define _REPEAT8(expr) expr expr expr expr expr expr expr expr + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_mem_init(void) +{ +#if LV_USE_OS + lv_mutex_init(&state.mutex); +#endif + +#if LV_MEM_ADR == 0 +#ifdef LV_MEM_POOL_ALLOC + state.tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_POOL_ALLOC(LV_MEM_SIZE), LV_MEM_SIZE); +#else + /*Allocate a large array to store the dynamically allocated data*/ + static MEM_UNIT work_mem_int[LV_MEM_SIZE / sizeof(MEM_UNIT)] LV_ATTRIBUTE_LARGE_RAM_ARRAY; + state.tlsf = lv_tlsf_create_with_pool((void *)work_mem_int, LV_MEM_SIZE); +#endif +#else + state.tlsf = lv_tlsf_create_with_pool((void *)LV_MEM_ADR, LV_MEM_SIZE); +#endif + + lv_ll_init(&state.pool_ll, sizeof(lv_pool_t)); + + /*Record the first pool*/ + lv_pool_t * pool_p = lv_ll_ins_tail(&state.pool_ll); + LV_ASSERT_MALLOC(pool_p); + *pool_p = lv_tlsf_get_pool(state.tlsf); + +#if LV_MEM_ADD_JUNK + LV_LOG_WARN("LV_MEM_ADD_JUNK is enabled which makes LVGL much slower"); +#endif +} + +void lv_mem_deinit(void) +{ + lv_ll_clear(&state.pool_ll); + lv_tlsf_destroy(state.tlsf); +#if LV_USE_OS + lv_mutex_delete(&state.mutex); +#endif +} + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) +{ + lv_mem_pool_t new_pool = lv_tlsf_add_pool(state.tlsf, mem, bytes); + if(!new_pool) { + LV_LOG_WARN("failed to add memory pool, address: %p, size: %zu", mem, bytes); + return NULL; + } + + lv_pool_t * pool_p = lv_ll_ins_tail(&state.pool_ll); + LV_ASSERT_MALLOC(pool_p); + *pool_p = new_pool; + + return new_pool; +} + +void lv_mem_remove_pool(lv_mem_pool_t pool) +{ + lv_pool_t * pool_p; + LV_LL_READ(&state.pool_ll, pool_p) { + if(*pool_p == pool) { + lv_ll_remove(&state.pool_ll, pool_p); + lv_free(pool_p); + lv_tlsf_remove_pool(state.tlsf, pool); + return; + } + } + LV_LOG_WARN("invalid pool: %p", pool); +} + +void * lv_malloc_core(size_t size) +{ +#if LV_USE_OS + lv_mutex_lock(&state.mutex); +#endif + void * p = lv_tlsf_malloc(state.tlsf, size); + + if(p) { + state.cur_used += lv_tlsf_block_size(p); + state.max_used = LV_MAX(state.cur_used, state.max_used); + } + +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + return p; +} + +void * lv_realloc_core(void * p, size_t new_size) +{ +#if LV_USE_OS + lv_mutex_lock(&state.mutex); +#endif + + size_t old_size = lv_tlsf_block_size(p); + void * p_new = lv_tlsf_realloc(state.tlsf, p, new_size); + + if(p_new) { + state.cur_used -= old_size; + state.cur_used += lv_tlsf_block_size(p_new); + state.max_used = LV_MAX(state.cur_used, state.max_used); + } +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + + return p_new; +} + +void lv_free_core(void * p) +{ +#if LV_USE_OS + lv_mutex_lock(&state.mutex); +#endif + +#if LV_MEM_ADD_JUNK + lv_memset(p, 0xbb, lv_tlsf_block_size(p)); +#endif + size_t size = lv_tlsf_block_size(p); + lv_tlsf_free(state.tlsf, p); + if(state.cur_used > size) state.cur_used -= size; + else state.cur_used = 0; + +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif +} + +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) +{ + /*Init the data*/ + lv_memzero(mon_p, sizeof(lv_mem_monitor_t)); + LV_TRACE_MEM("begin"); + + lv_pool_t * pool_p; + LV_LL_READ(&state.pool_ll, pool_p) { + lv_tlsf_walk_pool(*pool_p, lv_mem_walker, mon_p); + } + + mon_p->used_pct = 100 - (uint64_t)100U * mon_p->free_size / mon_p->total_size; + if(mon_p->free_size > 0) { + mon_p->frag_pct = (uint64_t)mon_p->free_biggest_size * 100U / mon_p->free_size; + mon_p->frag_pct = 100 - mon_p->frag_pct; + } + else { + mon_p->frag_pct = 0; /*no fragmentation if all the RAM is used*/ + } + + mon_p->max_used = state.max_used; + + LV_TRACE_MEM("finished"); +} + +lv_result_t lv_mem_test_core(void) +{ +#if LV_USE_OS + lv_mutex_lock(&state.mutex); +#endif + if(lv_tlsf_check(state.tlsf)) { + LV_LOG_WARN("failed"); +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + return LV_RESULT_INVALID; + } + + lv_pool_t * pool_p; + LV_LL_READ(&state.pool_ll, pool_p) { + if(lv_tlsf_check_pool(*pool_p)) { + LV_LOG_WARN("pool failed"); +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + return LV_RESULT_INVALID; + } + } + + LV_TRACE_MEM("passed"); +#if LV_USE_OS + lv_mutex_unlock(&state.mutex); +#endif + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_mem_walker(void * ptr, size_t size, int used, void * user) +{ + LV_UNUSED(ptr); + + lv_mem_monitor_t * mon_p = user; + mon_p->total_size += size; + if(used) { + mon_p->used_cnt++; + } + else { + mon_p->free_cnt++; + mon_p->free_size += size; + if(size > mon_p->free_biggest_size) + mon_p->free_biggest_size = size; + } +} +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/inc/lvgl/src/stdlib/builtin/lv_sprintf_builtin.c b/inc/lvgl/src/stdlib/builtin/lv_sprintf_builtin.c new file mode 100644 index 0000000..c973752 --- /dev/null +++ b/inc/lvgl/src/stdlib/builtin/lv_sprintf_builtin.c @@ -0,0 +1,878 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. These routines are thread +// safe and reentrant! +// Use this instead of the bloated standard/newlib printf cause these use +// malloc for printf (and may not be thread safe). +// +/////////////////////////////////////////////////////////////////////////////// + +/*Original repository: https://github.com/mpaland/printf*/ + +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_SPRINTF == LV_STDLIB_BUILTIN + +#include "../lv_sprintf.h" +#include "../lv_string.h" +#include "../../misc/lv_types.h" + +#define PRINTF_DISABLE_SUPPORT_FLOAT (!LV_USE_FLOAT) + +// 'ntoa' conversion buffer size, this must be big enough to hold one converted +// numeric number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_NTOA_BUFFER_SIZE + #define PRINTF_NTOA_BUFFER_SIZE 32U +#endif + +// 'ftoa' conversion buffer size, this must be big enough to hold one converted +// float number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_FTOA_BUFFER_SIZE + #define PRINTF_FTOA_BUFFER_SIZE 32U +#endif + +// support for the floating point type (%f) +// default: activated +#if !PRINTF_DISABLE_SUPPORT_FLOAT + #define PRINTF_SUPPORT_FLOAT +#endif + +// support for exponential floating point notation (%e/%g) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_EXPONENTIAL + #define PRINTF_SUPPORT_EXPONENTIAL +#endif + +// define the default floating point precision +// default: 6 digits +#ifndef PRINTF_DEFAULT_FLOAT_PRECISION + #define PRINTF_DEFAULT_FLOAT_PRECISION 6U +#endif + +// define the largest float suitable to print with %f +// default: 1e9 +#ifndef PRINTF_MAX_FLOAT + #define PRINTF_MAX_FLOAT 1e9 +#endif + +// support for the long long types (%llu or %p) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_LONG_LONG + #define PRINTF_SUPPORT_LONG_LONG +#endif + +// support for the ptrdiff_t type (%t) +// ptrdiff_t is normally defined in as long or long long type +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_PTRDIFF_T + #define PRINTF_SUPPORT_PTRDIFF_T +#endif + +/////////////////////////////////////////////////////////////////////////////// + +// internal flag definitions +#define FLAGS_ZEROPAD (1U << 0U) +#define FLAGS_LEFT (1U << 1U) +#define FLAGS_PLUS (1U << 2U) +#define FLAGS_SPACE (1U << 3U) +#define FLAGS_HASH (1U << 4U) +#define FLAGS_UPPERCASE (1U << 5U) +#define FLAGS_CHAR (1U << 6U) +#define FLAGS_SHORT (1U << 7U) +#define FLAGS_LONG (1U << 8U) +#define FLAGS_LONG_LONG (1U << 9U) +#define FLAGS_PRECISION (1U << 10U) +#define FLAGS_ADAPT_EXP (1U << 11U) + +typedef struct { + const char * fmt; + va_list * va; +} lv_vaformat_t; + +// import float.h for DBL_MAX +#if defined(PRINTF_SUPPORT_FLOAT) + #include +#endif + +// output function type +typedef void (*out_fct_type)(char character, void * buffer, size_t idx, size_t maxlen); + +// wrapper (used as buffer) for output function type +typedef struct { + void (*fct)(char character, void * arg); + void * arg; +} out_fct_wrap_type; + +// internal buffer output +static inline void _out_buffer(char character, void * buffer, size_t idx, size_t maxlen) +{ + if(idx < maxlen) { + ((char *)buffer)[idx] = character; + } +} + +// internal null output +static inline void _out_null(char character, void * buffer, size_t idx, size_t maxlen) +{ + LV_UNUSED(character); + LV_UNUSED(buffer); + LV_UNUSED(idx); + LV_UNUSED(maxlen); +} + +// internal test if char is a digit (0-9) +// \return true if char is a digit +static inline bool _is_digit(char ch) +{ + return (ch >= '0') && (ch <= '9'); +} + +// internal ASCII string to unsigned int conversion +static unsigned int _atoi(const char ** str) +{ + unsigned int i = 0U; + while(_is_digit(**str)) { + i = i * 10U + (unsigned int)(*((*str)++) - '0'); + } + return i; +} + +// output the specified string in reverse, taking care of any zero-padding +static size_t _out_rev(out_fct_type out, char * buffer, size_t idx, size_t maxlen, const char * buf, size_t len, + unsigned int width, unsigned int flags) +{ + const size_t start_idx = idx; + + // pad spaces up to given width + if(!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + size_t i; + for(i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } + } + + // reverse string + while(len) { + out(buf[--len], buffer, idx++, maxlen); + } + + // append pad spaces up to given width + if(flags & FLAGS_LEFT) { + while(idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); + } + } + + return idx; +} + +// internal itoa format +static size_t _ntoa_format(out_fct_type out, char * buffer, size_t idx, size_t maxlen, char * buf, size_t len, + bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags) +{ + // pad leading zeros + if(!(flags & FLAGS_LEFT)) { + if(width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + while((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + // handle hash + if(flags & FLAGS_HASH) { + if(!(flags & FLAGS_PRECISION) && len && ((len == prec) || (len == width))) { + len--; + if(len && (base == 16U)) { + len--; + } + } + if((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'x'; + } + else if((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'X'; + } + else if((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'b'; + } + if(len < PRINTF_NTOA_BUFFER_SIZE) { + buf[len++] = '0'; + } + } + + if(len < PRINTF_NTOA_BUFFER_SIZE) { + if(negative) { + buf[len++] = '-'; + } + else if(flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if(flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + +// internal itoa for 'long' type +static size_t _ntoa_long(out_fct_type out, char * buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, + unsigned long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if(!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if(!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while(value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} + +// internal itoa for 'long long' type +#if defined(PRINTF_SUPPORT_LONG_LONG) +static size_t _ntoa_long_long(out_fct_type out, char * buffer, size_t idx, size_t maxlen, unsigned long long value, + bool negative, unsigned long long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if(!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if(!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while(value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} +#endif // PRINTF_SUPPORT_LONG_LONG + +#if defined(PRINTF_SUPPORT_FLOAT) + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// forward declaration so that _ftoa can switch to exp notation for values > PRINTF_MAX_FLOAT +static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, + unsigned int width, unsigned int flags); +#endif + +// internal ftoa for fixed decimal floating point +static size_t _ftoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, + unsigned int width, unsigned int flags) +{ + char buf[PRINTF_FTOA_BUFFER_SIZE]; + size_t len = 0U; + double diff = 0.0; + + // powers of 10 + static const double pow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + + // test for special values + if(value != value) + return _out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); + if(value < -DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); + if(value > DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, (flags & FLAGS_PLUS) ? "fni+" : "fni", (flags & FLAGS_PLUS) ? 4U : 3U, width, + flags); + + // test for very large values + // standard printf behavior is to print EVERY whole number digit -- which could be 100s of characters overflowing your buffers == bad + if((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + return _etoa(out, buffer, idx, maxlen, value, prec, width, flags); +#else + return 0U; +#endif + } + + // test for negative + bool negative = false; + if(value < 0) { + negative = true; + value = 0 - value; + } + + // set default precision, if not set explicitly + if(!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + // limit precision to 9, cause a prec >= 10 can lead to overflow errors + while((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { + buf[len++] = '0'; + prec--; + } + + int whole = (int)value; + double tmp = (value - whole) * pow10[prec]; + unsigned long frac = (unsigned long)tmp; + diff = tmp - frac; + + if(diff > 0.5) { + ++frac; + // handle rollover, e.g. case 0.99 with prec 1 is 1.0 + if(frac >= pow10[prec]) { + frac = 0; + ++whole; + } + } + else if(diff < 0.5) { + } + else if((frac == 0U) || (frac & 1U)) { + // if halfway, round up if odd OR if last digit is 0 + ++frac; + } + + if(prec == 0U) { + diff = value - (double)whole; + if((!(diff < 0.5) || (diff > 0.5)) && (whole & 1)) { + // exactly 0.5 and ODD, then round up + // 1.5 -> 2, but 2.5 -> 2 + ++whole; + } + } + else { + unsigned int count = prec; + // now do fractional part, as an unsigned number + while(len < PRINTF_FTOA_BUFFER_SIZE) { + --count; + buf[len++] = (char)(48U + (frac % 10U)); + if(!(frac /= 10U)) { + break; + } + } + // add extra 0s + while((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { + buf[len++] = '0'; + } + if(len < PRINTF_FTOA_BUFFER_SIZE) { + // add decimal + buf[len++] = '.'; + } + } + + // do whole part, number is reversed + while(len < PRINTF_FTOA_BUFFER_SIZE) { + buf[len++] = (char)(48 + (whole % 10)); + if(!(whole /= 10)) { + break; + } + } + + // pad leading zeros + if(!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { + if(width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + if(len < PRINTF_FTOA_BUFFER_SIZE) { + if(negative) { + buf[len++] = '-'; + } + else if(flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if(flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// internal ftoa variant for exponential floating-point type, contributed by Martijn Jasperse +static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen, double value, unsigned int prec, + unsigned int width, unsigned int flags) +{ + // check for NaN and special values + if((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { + return _ftoa(out, buffer, idx, maxlen, value, prec, width, flags); + } + + // determine the sign + const bool negative = value < 0; + if(negative) { + value = -value; + } + + // default precision + if(!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + + // determine the decimal exponent + // based on the algorithm by David Gay (https://www.ampl.com/netlib/fp/dtoa.c) + union { + uint64_t U; + double F; + } conv; + + conv.F = value; + int exp2 = (int)((conv.U >> 52U) & 0x07FFU) - 1023; // effectively log2 + conv.U = (conv.U & ((1ULL << 52U) - 1U)) | (1023ULL << 52U); // drop the exponent so conv.F is now in [1,2) + // now approximate log10 from the log2 integer part and an expansion of ln around 1.5 + int expval = (int)(0.1760912590558 + exp2 * 0.301029995663981 + (conv.F - 1.5) * 0.289529654602168); + // now we want to compute 10^expval but we want to be sure it won't overflow + exp2 = (int)(expval * 3.321928094887362 + 0.5); + const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; + const double z2 = z * z; + conv.U = (uint64_t)(exp2 + 1023) << 52U; + // compute exp(z) using continued fractions, see https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex + conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); + // correct for rounding errors + if(value < conv.F) { + expval--; + conv.F /= 10; + } + + // the exponent format is "%+03d" and largest value is "307", so set aside 4-5 characters + unsigned int minwidth = ((expval < 100) && (expval > -100)) ? 4U : 5U; + + // in "%g" mode, "prec" is the number of *significant figures* not decimals + if(flags & FLAGS_ADAPT_EXP) { + // do we want to fall-back to "%f" mode? + if((value >= 1e-4) && (value < 1e6)) { + if((int)prec > expval) { + prec = (unsigned)((int)prec - expval - 1); + } + else { + prec = 0; + } + flags |= FLAGS_PRECISION; // make sure _ftoa respects precision + // no characters in exponent + minwidth = 0U; + expval = 0; + } + else { + // we use one sigfig for the whole part + if((prec > 0) && (flags & FLAGS_PRECISION)) { + --prec; + } + } + } + + // will everything fit? + unsigned int fwidth = width; + if(width > minwidth) { + // we didn't fall-back so subtract the characters required for the exponent + fwidth -= minwidth; + } + else { + // not enough characters, so go back to default sizing + fwidth = 0U; + } + if((flags & FLAGS_LEFT) && minwidth) { + // if we're padding on the right, DON'T pad the floating part + fwidth = 0U; + } + + // rescale the float value + if(expval) { + value /= conv.F; + } + + // output the floating part + const size_t start_idx = idx; + idx = _ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, fwidth, flags & ~FLAGS_ADAPT_EXP); + + // output the exponent part + if(minwidth) { + // output the exponential symbol + out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); + // output the exponent value + idx = _ntoa_long(out, buffer, idx, maxlen, (expval < 0) ? -expval : expval, expval < 0, 10, 0, minwidth - 1, + FLAGS_ZEROPAD | FLAGS_PLUS); + // might need to right-pad spaces + if(flags & FLAGS_LEFT) { + while(idx - start_idx < width) out(' ', buffer, idx++, maxlen); + } + } + return idx; +} +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + +// internal vsnprintf +static int lv_vsnprintf_inner(out_fct_type out, char * buffer, const size_t maxlen, const char * format, va_list va) +{ + unsigned int flags, width, precision, n; + size_t idx = 0U; + + if(!buffer) { + // use null output function + out = _out_null; + } + + while(*format) { + // format specifier? %[flags][width][.precision][length] + if(*format != '%') { + // no + out(*format, buffer, idx++, maxlen); + format++; + continue; + } + else { + // yes, evaluate it + format++; + } + + // evaluate flags + flags = 0U; + do { + switch(*format) { + case '0': + flags |= FLAGS_ZEROPAD; + format++; + n = 1U; + break; + case '-': + flags |= FLAGS_LEFT; + format++; + n = 1U; + break; + case '+': + flags |= FLAGS_PLUS; + format++; + n = 1U; + break; + case ' ': + flags |= FLAGS_SPACE; + format++; + n = 1U; + break; + case '#': + flags |= FLAGS_HASH; + format++; + n = 1U; + break; + default : + n = 0U; + break; + } + } while(n); + + // evaluate width field + width = 0U; + if(_is_digit(*format)) { + width = _atoi(&format); + } + else if(*format == '*') { + const int w = va_arg(va, int); + if(w < 0) { + flags |= FLAGS_LEFT; // reverse padding + width = (unsigned int) - w; + } + else { + width = (unsigned int)w; + } + format++; + } + + // evaluate precision field + precision = 0U; + if(*format == '.') { + flags |= FLAGS_PRECISION; + format++; + if(_is_digit(*format)) { + precision = _atoi(&format); + } + else if(*format == '*') { + const int prec = (int)va_arg(va, int); + precision = prec > 0 ? (unsigned int)prec : 0U; + format++; + } + } + + // evaluate length field + switch(*format) { + case 'l' : + flags |= FLAGS_LONG; + format++; + if(*format == 'l') { + flags |= FLAGS_LONG_LONG; + format++; + } + break; + case 'h' : + flags |= FLAGS_SHORT; + format++; + if(*format == 'h') { + flags |= FLAGS_CHAR; + format++; + } + break; +#if defined(PRINTF_SUPPORT_PTRDIFF_T) + case 't' : + flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; +#endif + case 'j' : + flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + case 'z' : + flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + default : + break; + } + + // evaluate specifier + switch(*format) { + case 'd' : + case 'i' : + case 'u' : + case 'x' : + case 'X' : + case 'p' : + case 'P' : + case 'o' : + case 'b' : { + // set the base + unsigned int base; + if(*format == 'x' || *format == 'X') { + base = 16U; + } + else if(*format == 'p' || *format == 'P') { + base = 16U; + flags |= FLAGS_HASH; // always hash for pointer format +#if defined(PRINTF_SUPPORT_LONG_LONG) + if(sizeof(uintptr_t) == sizeof(long long)) + flags |= FLAGS_LONG_LONG; + else +#endif + flags |= FLAGS_LONG; + + if(*(format + 1) == 'V') + format++; + } + else if(*format == 'o') { + base = 8U; + } + else if(*format == 'b') { + base = 2U; + } + else { + base = 10U; + flags &= ~FLAGS_HASH; // no hash for dec format + } + // uppercase + if(*format == 'X' || *format == 'P') { + flags |= FLAGS_UPPERCASE; + } + + // no plus or space flag for u, x, X, o, b + if((*format != 'i') && (*format != 'd')) { + flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + } + + // ignore '0' flag when precision is given + if(flags & FLAGS_PRECISION) { + flags &= ~FLAGS_ZEROPAD; + } + + // convert the integer + if((*format == 'i') || (*format == 'd')) { + // signed + if(flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + const long long value = va_arg(va, long long); + idx = _ntoa_long_long(out, buffer, idx, maxlen, (unsigned long long)(value > 0 ? value : 0 - value), value < 0, base, + precision, width, flags); +#endif + } + else if(flags & FLAGS_LONG) { + const long value = va_arg(va, long); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)(value > 0 ? value : 0 - value), value < 0, base, precision, + width, flags); + } + else { + const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, + int) : va_arg(va, int); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, precision, + width, flags); + } + } + else if(*format == 'V') { + lv_vaformat_t * vaf = va_arg(va, lv_vaformat_t *); + va_list copy; + + va_copy(copy, *vaf->va); + idx += lv_vsnprintf_inner(out, buffer + idx, maxlen - idx, vaf->fmt, copy); + va_end(copy); + } + else { + // unsigned + if(flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + idx = _ntoa_long_long(out, buffer, idx, maxlen, va_arg(va, unsigned long long), false, base, precision, width, flags); +#endif + } + else if(flags & FLAGS_LONG) { + idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); + } + else { + const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, + unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); + idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, flags); + } + } + format++; + break; + } +#if defined(PRINTF_SUPPORT_FLOAT) + case 'f' : + case 'F' : + if(*format == 'F') flags |= FLAGS_UPPERCASE; + idx = _ftoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + case 'e': + case 'E': + case 'g': + case 'G': + if((*format == 'g') || (*format == 'G')) flags |= FLAGS_ADAPT_EXP; + if((*format == 'E') || (*format == 'G')) flags |= FLAGS_UPPERCASE; + idx = _etoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + case 'c' : { + unsigned int l = 1U; + // pre padding + if(!(flags & FLAGS_LEFT)) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // char output + out((char)va_arg(va, int), buffer, idx++, maxlen); + // post padding + if(flags & FLAGS_LEFT) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 's' : { + const char * p = va_arg(va, char *); + unsigned int l = lv_strnlen(p, precision ? precision : (size_t) -1); + // pre padding + if(flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); + } + if(!(flags & FLAGS_LEFT)) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // string output + while((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, maxlen); + } + // post padding + if(flags & FLAGS_LEFT) { + while(l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case '%' : + out('%', buffer, idx++, maxlen); + format++; + break; + + default : + out(*format, buffer, idx++, maxlen); + format++; + break; + } + } + + // termination + out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); + + // return written chars without terminating \0 + return (int)idx; +} + +/////////////////////////////////////////////////////////////////////////////// +/// GLOBAL FUNCTIONS FOR LVGL +/////////////////////////////////////////////////////////////////////////////// + +int lv_snprintf(char * buffer, size_t count, const char * format, ...) +{ + va_list va; + va_start(va, format); + const int ret = lv_vsnprintf_inner(_out_buffer, buffer, count, format, va); + va_end(va); + return ret; +} + +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) +{ + return lv_vsnprintf_inner(_out_buffer, buffer, count, format, va); +} + +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/inc/lvgl/src/stdlib/builtin/lv_string_builtin.c b/inc/lvgl/src/stdlib/builtin/lv_string_builtin.c new file mode 100644 index 0000000..c998ee1 --- /dev/null +++ b/inc/lvgl/src/stdlib/builtin/lv_string_builtin.c @@ -0,0 +1,319 @@ +/** + * @file lv_string_builtin.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_STRING == LV_STDLIB_BUILTIN +#include "../../misc/lv_assert.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_string.h" +#include "../../stdlib/lv_mem.h" + +/********************* + * DEFINES + *********************/ +#ifdef LV_ARCH_64 + #define MEM_UNIT uint64_t + #define ALIGN_MASK 0x7 +#else + #define MEM_UNIT uint32_t + #define ALIGN_MASK 0x3 +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_MEM + #define LV_TRACE_MEM(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_MEM(...) +#endif + +#define _COPY(d, s) *d = *s; d++; s++; +#define _SET(d, v) *d = v; d++; +#define _REPEAT8(expr) expr expr expr expr expr expr expr expr + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) +{ + volatile uint8_t * d8 = dst; + const uint8_t * s8 = src; + + /*Simplify for small memories*/ + if(len < 16) { + while(len) { + *d8 = *s8; + d8++; + s8++; + len--; + } + return dst; + } + + lv_uintptr_t d_align = (lv_uintptr_t)d8 & ALIGN_MASK; + lv_uintptr_t s_align = (lv_uintptr_t)s8 & ALIGN_MASK; + + /*Byte copy for unaligned memories*/ + if(s_align != d_align) { + while(len > 32) { + _REPEAT8(_COPY(d8, s8)); + _REPEAT8(_COPY(d8, s8)); + _REPEAT8(_COPY(d8, s8)); + _REPEAT8(_COPY(d8, s8)); + len -= 32; + } + while(len) { + _COPY(d8, s8) + len--; + } + return dst; + } + + /*Make the memories aligned*/ + if(d_align) { + d_align = ALIGN_MASK + 1 - d_align; + while(d_align && len) { + _COPY(d8, s8); + d_align--; + len--; + } + } + + uint32_t * d32 = (uint32_t *)d8; + const uint32_t * s32 = (uint32_t *)s8; + while(len > 32) { + _REPEAT8(_COPY(d32, s32)) + len -= 32; + } + + d8 = (uint8_t *)d32; + s8 = (const uint8_t *)s32; + while(len) { + _COPY(d8, s8) + len--; + } + + return dst; +} + +void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) +{ + uint8_t * d8 = (uint8_t *)dst; + uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK; + + /*Make the address aligned*/ + if(d_align) { + d_align = ALIGN_MASK + 1 - d_align; + while(d_align && len) { + _SET(d8, v); + len--; + d_align--; + } + } + + uint32_t v32 = (uint32_t)v + ((uint32_t)v << 8) + ((uint32_t)v << 16) + ((uint32_t)v << 24); + uint32_t * d32 = (uint32_t *)d8; + + while(len > 32) { + _REPEAT8(_SET(d32, v32)); + len -= 32; + } + + d8 = (uint8_t *)d32; + while(len) { + _SET(d8, v); + len--; + } +} + +void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len) +{ + if(dst < src || (char *)dst > ((char *)src + len)) { + return lv_memcpy(dst, src, len); + } + + if(dst > src) { + char * tmp = (char *)dst + len - 1; + char * s = (char *)src + len - 1; + + while(len--) { + *tmp-- = *s--; + } + } + else { + char * tmp = (char *)dst; + char * s = (char *)src; + + while(len--) { + *tmp++ = *s++; + } + } + + return dst; +} + +int lv_memcmp(const void * p1, const void * p2, size_t len) +{ + const char * s1 = (const char *) p1; + const char * s2 = (const char *) p2; + while(--len > 0 && (*s1 == *s2)) { + s1++; + s2++; + } + return *s1 - *s2; +} + +/* See https://en.cppreference.com/w/c/string/byte/strlen for reference */ +size_t lv_strlen(const char * str) +{ + size_t i = 0; + while(str[i]) i++; + + return i; +} + +size_t lv_strnlen(const char * str, size_t max_len) +{ + size_t i = 0; + while(i < max_len && str[i]) i++; + + return i; +} + +size_t lv_strlcpy(char * dst, const char * src, size_t dst_size) +{ + size_t i = 0; + if(dst_size > 0) { + for(; i < dst_size - 1 && src[i]; i++) { + dst[i] = src[i]; + } + dst[i] = '\0'; + } + while(src[i]) i++; + return i; +} + +char * lv_strncpy(char * dst, const char * src, size_t dst_size) +{ + size_t i; + for(i = 0; i < dst_size && src[i]; i++) { + dst[i] = src[i]; + } + for(; i < dst_size; i++) { + dst[i] = '\0'; + } + return dst; +} + +char * lv_strcpy(char * dst, const char * src) +{ + char * tmp = dst; + while((*dst++ = *src++) != '\0'); + return tmp; +} + +int lv_strcmp(const char * s1, const char * s2) +{ + while(*s1 && (*s1 == *s2)) { + s1++; + s2++; + } + return *(const unsigned char *)s1 - *(const unsigned char *)s2; +} + +int lv_strncmp(const char * s1, const char * s2, size_t len) +{ + if(len == 0) { + return 0; + } + + while(len > 0 && *s1 && (*s1 == *s2)) { + if(--len == 0) { + return 0; + } + s1++; + s2++; + } + return *(const unsigned char *)s1 - *(const unsigned char *)s2; +} + +char * lv_strdup(const char * src) +{ + size_t len = lv_strlen(src) + 1; + char * dst = lv_malloc(len); + if(dst == NULL) return NULL; + + lv_memcpy(dst, src, len); /*memcpy is faster than strncpy when length is known*/ + return dst; +} + +char * lv_strndup(const char * src, size_t max_len) +{ + size_t len = lv_strnlen(src, max_len); + char * dst = lv_malloc(len + 1); + if(dst == NULL) return NULL; + + lv_memcpy(dst, src, len); + dst[len] = '\0'; + return dst; +} + +char * lv_strcat(char * dst, const char * src) +{ + lv_strcpy(dst + lv_strlen(dst), src); + return dst; +} + +char * lv_strncat(char * dst, const char * src, size_t src_len) +{ + char * tmp = dst; + while(*dst != '\0') { + dst++; + } + while(src_len != 0 && *src != '\0') { + src_len--; + *dst++ = *src++; + } + *dst = '\0'; + return tmp; +} + +char * lv_strchr(const char * s, int c) +{ + for(; ; s++) { + if(*s == c) { + return (char *)s; + } + + if(*s == '\0') { + break; + } + } + + return NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/inc/lvgl/src/stdlib/builtin/lv_tlsf.c b/inc/lvgl/src/stdlib/builtin/lv_tlsf.c new file mode 100644 index 0000000..4232ae3 --- /dev/null +++ b/inc/lvgl/src/stdlib/builtin/lv_tlsf.c @@ -0,0 +1,1245 @@ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + +#include "lv_tlsf_private.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_types.h" + +#undef printf +#define printf LV_LOG_ERROR + +#define TLSF_MAX_POOL_SIZE (LV_MEM_SIZE + LV_MEM_POOL_EXPAND_SIZE) + +#if !defined(_DEBUG) + #define _DEBUG 0 +#endif + +#if defined(__cplusplus) + #define tlsf_decl inline +#else + #define tlsf_decl static +#endif + +/* +** Architecture-specific bit manipulation routines. +** +** TLSF achieves O(1) cost for malloc and free operations by limiting +** the search for a free block to a free list of guaranteed size +** adequate to fulfill the request, combined with efficient free list +** queries using bitmasks and architecture-specific bit-manipulation +** routines. +** +** Most modern processors provide instructions to count leading zeroes +** in a word, find the lowest and highest set bit, etc. These +** specific implementations will be used when available, falling back +** to a reasonably efficient generic implementation. +** +** NOTE: TLSF spec relies on ffs/fls returning value 0..31. +** ffs/fls return 1-32 by default, returning 0 for error. +*/ + +/* +** Detect whether or not we are building for a 32- or 64-bit (LP/LLP) +** architecture. There is no reliable portable method at compile-time. +*/ +#if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) \ + || defined (_WIN64) || defined (__LP64__) || defined (__LLP64__) + #define TLSF_64BIT +#endif + +/* +** Returns one plus the index of the most significant 1-bit of n, +** or if n is zero, returns zero. +*/ +#ifdef TLSF_64BIT + #define TLSF_FLS(n) ((n) & 0xffffffff00000000ull ? 32 + TLSF_FLS32((size_t)(n) >> 32) : TLSF_FLS32(n)) +#else + #define TLSF_FLS(n) TLSF_FLS32(n) +#endif + +#define TLSF_FLS32(n) ((n) & 0xffff0000 ? 16 + TLSF_FLS16((n) >> 16) : TLSF_FLS16(n)) +#define TLSF_FLS16(n) ((n) & 0xff00 ? 8 + TLSF_FLS8 ((n) >> 8) : TLSF_FLS8 (n)) +#define TLSF_FLS8(n) ((n) & 0xf0 ? 4 + TLSF_FLS4 ((n) >> 4) : TLSF_FLS4 (n)) +#define TLSF_FLS4(n) ((n) & 0xc ? 2 + TLSF_FLS2 ((n) >> 2) : TLSF_FLS2 (n)) +#define TLSF_FLS2(n) ((n) & 0x2 ? 1 + TLSF_FLS1 ((n) >> 1) : TLSF_FLS1 (n)) +#define TLSF_FLS1(n) ((n) & 0x1 ? 1 : 0) + +/* +** Returns round up value of log2(n). +** Note: it is used at compile time. +*/ +#define TLSF_LOG2_CEIL(n) ((n) & (n - 1) ? TLSF_FLS(n) : TLSF_FLS(n) - 1) + +/* +** gcc 3.4 and above have builtin support, specialized for architecture. +** Some compilers masquerade as gcc; patchlevel test filters them out. +*/ +#if defined (__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) \ + && defined (__GNUC_PATCHLEVEL__) + +#if defined (__SNC__) +/* SNC for PlayStation 3. */ + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __builtin_clz(reverse); + return bit - 1; +} + +#else + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + return __builtin_ffs(word) - 1; +} + +#endif + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __builtin_clz(word) : 0; + return bit - 1; +} + +#elif defined (_MSC_VER) && (_MSC_VER >= 1400) && (defined (_M_IX86) || defined (_M_X64)) +/* Microsoft Visual C++ support on x86/X64 architectures. */ + +#include + +#pragma intrinsic(_BitScanReverse) +#pragma intrinsic(_BitScanForward) + +tlsf_decl int tlsf_fls(unsigned int word) +{ + unsigned long index; + return _BitScanReverse(&index, word) ? index : -1; +} + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + unsigned long index; + return _BitScanForward(&index, word) ? index : -1; +} + +#elif defined (_MSC_VER) && defined (_M_PPC) +/* Microsoft Visual C++ support on PowerPC architectures. */ + +#include + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = 32 - _CountLeadingZeros(word); + return bit - 1; +} + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - _CountLeadingZeros(reverse); + return bit - 1; +} + +#elif defined (__ARMCC_VERSION) +/* RealView Compilation Tools for ARM */ + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __clz(reverse); + return bit - 1; +} + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __clz(word) : 0; + return bit - 1; +} + +#elif defined (__ghs__) +/* Green Hills support for PowerPC */ + +#include + +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + const int bit = 32 - __CLZ32(reverse); + return bit - 1; +} + +tlsf_decl int tlsf_fls(unsigned int word) +{ + const int bit = word ? 32 - __CLZ32(word) : 0; + return bit - 1; +} + +#else +/* Fall back to generic implementation. */ + +/* Implement ffs in terms of fls. */ +tlsf_decl int tlsf_ffs(unsigned int word) +{ + const unsigned int reverse = word & (~word + 1); + return TLSF_FLS32(reverse) - 1; +} + +tlsf_decl int tlsf_fls(unsigned int word) +{ + return TLSF_FLS32(word) - 1; +} + +#endif + +/* Possibly 64-bit version of tlsf_fls. */ +#if defined (TLSF_64BIT) +tlsf_decl int tlsf_fls_sizet(size_t size) +{ + int high = (int)(size >> 32); + int bits = 0; + if(high) { + bits = 32 + tlsf_fls(high); + } + else { + bits = tlsf_fls((int)size & 0xffffffff); + + } + return bits; +} +#else +#define tlsf_fls_sizet tlsf_fls +#endif + +#undef tlsf_decl + +/* +** Constants. +*/ + +/* Public constants: may be modified. */ +typedef enum { + /* log2 of number of linear subdivisions of block sizes. Larger + ** values require more memory in the control structure. Values of + ** 4 or 5 are typical. + */ + SL_INDEX_COUNT_LOG2 = 5, +} tlsf_public; + +/* Private constants: do not modify. */ +typedef enum { +#if defined (TLSF_64BIT) + /* All allocation sizes and addresses are aligned to 8 bytes. */ + ALIGN_SIZE_LOG2 = 3, +#else + /* All allocation sizes and addresses are aligned to 4 bytes. */ + ALIGN_SIZE_LOG2 = 2, +#endif + ALIGN_SIZE = (1 << ALIGN_SIZE_LOG2), + + /* + ** We support allocations of sizes up to (1 << FL_INDEX_MAX) bits. + ** However, because we linearly subdivide the second-level lists, and + ** our minimum size granularity is 4 bytes, it doesn't make sense to + ** create first-level lists for sizes smaller than SL_INDEX_COUNT * 4, + ** or (1 << (SL_INDEX_COUNT_LOG2 + 2)) bytes, as there we will be + ** trying to split size ranges into more slots than we have available. + ** Instead, we calculate the minimum threshold size, and place all + ** blocks below that size into the 0th first-level list. + */ + +#if defined (TLSF_MAX_POOL_SIZE) + FL_INDEX_MAX = TLSF_LOG2_CEIL(TLSF_MAX_POOL_SIZE), +#elif defined (TLSF_64BIT) + /* + ** TODO: We can increase this to support larger sizes, at the expense + ** of more overhead in the TLSF structure. + */ + FL_INDEX_MAX = 32, +#else + FL_INDEX_MAX = 30, +#endif + SL_INDEX_COUNT = (1 << SL_INDEX_COUNT_LOG2), + FL_INDEX_SHIFT = (SL_INDEX_COUNT_LOG2 + ALIGN_SIZE_LOG2), + FL_INDEX_COUNT = (FL_INDEX_MAX - FL_INDEX_SHIFT + 1), + + SMALL_BLOCK_SIZE = (1 << FL_INDEX_SHIFT), +} tlsf_private; + +/* +** Cast and min/max macros. +*/ + +#define tlsf_cast(t, exp) ((t) (exp)) +#define tlsf_min(a, b) ((a) < (b) ? (a) : (b)) +#define tlsf_max(a, b) ((a) > (b) ? (a) : (b)) + +/* +** Set assert macro, if it has not been provided by the user. +*/ +#define tlsf_assert LV_ASSERT + +#if !defined (tlsf_assert) + #define tlsf_assert assert +#endif + +/* +** Static assertion mechanism. +*/ + +#define _tlsf_glue2(x, y) x ## y +#define _tlsf_glue(x, y) _tlsf_glue2(x, y) +#define tlsf_static_assert(exp) \ + typedef char _tlsf_glue(static_assert, __LINE__) [(exp) ? 1 : -1] + +/* This code has been tested on 32- and 64-bit (LP/LLP) architectures. */ +tlsf_static_assert(sizeof(int) * CHAR_BIT == 32); +tlsf_static_assert(sizeof(size_t) * CHAR_BIT >= 32); +tlsf_static_assert(sizeof(size_t) * CHAR_BIT <= 64); + +/* SL_INDEX_COUNT must be <= number of bits in sl_bitmap's storage type. */ +tlsf_static_assert(sizeof(unsigned int) * CHAR_BIT >= SL_INDEX_COUNT); + +/* Ensure we've properly tuned our sizes. */ +tlsf_static_assert(ALIGN_SIZE == SMALL_BLOCK_SIZE / SL_INDEX_COUNT); + +/* +** Data structures and associated constants. +*/ + +/* +** Block header structure. +** +** There are several implementation subtleties involved: +** - The prev_phys_block field is only valid if the previous block is free. +** - The prev_phys_block field is actually stored at the end of the +** previous block. It appears at the beginning of this structure only to +** simplify the implementation. +** - The next_free / prev_free fields are only valid if the block is free. +*/ +typedef struct block_header_t { + /* Points to the previous physical block. */ + struct block_header_t * prev_phys_block; + + /* The size of this block, excluding the block header. */ + size_t size; + + /* Next and previous free blocks. */ + struct block_header_t * next_free; + struct block_header_t * prev_free; +} block_header_t; + +/* +** Since block sizes are always at least a multiple of 4, the two least +** significant bits of the size field are used to store the block status: +** - bit 0: whether block is busy or free +** - bit 1: whether previous block is busy or free +*/ +static const size_t block_header_free_bit = 1 << 0; +static const size_t block_header_prev_free_bit = 1 << 1; + +/* +** The size of the block header exposed to used blocks is the size field. +** The prev_phys_block field is stored *inside* the previous free block. +*/ +static const size_t block_header_overhead = sizeof(size_t); + +/* User data starts directly after the size field in a used block. */ +static const size_t block_start_offset = + offsetof(block_header_t, size) + sizeof(size_t); + +/* +** A free block must be large enough to store its header minus the size of +** the prev_phys_block field, and no larger than the number of addressable +** bits for FL_INDEX. +*/ +static const size_t block_size_min = + sizeof(block_header_t) - sizeof(block_header_t *); +static const size_t block_size_max = tlsf_cast(size_t, 1) << FL_INDEX_MAX; + +/* The TLSF control structure. */ +typedef struct control_t { + /* Empty lists point at this block to indicate they are free. */ + block_header_t block_null; + + /* Bitmaps for free lists. */ + unsigned int fl_bitmap; + unsigned int sl_bitmap[FL_INDEX_COUNT]; + + /* Head of free lists. */ + block_header_t * blocks[FL_INDEX_COUNT][SL_INDEX_COUNT]; +} control_t; + +/* A type used for casting when doing pointer arithmetic. */ +typedef ptrdiff_t tlsfptr_t; + +/* +** block_header_t member functions. +*/ + +static size_t block_size(const block_header_t * block) +{ + return block->size & ~(block_header_free_bit | block_header_prev_free_bit); +} + +static void block_set_size(block_header_t * block, size_t size) +{ + const size_t oldsize = block->size; + block->size = size | (oldsize & (block_header_free_bit | block_header_prev_free_bit)); +} + +static int block_is_last(const block_header_t * block) +{ + return block_size(block) == 0; +} + +static int block_is_free(const block_header_t * block) +{ + return tlsf_cast(int, block->size & block_header_free_bit); +} + +static void block_set_free(block_header_t * block) +{ + block->size |= block_header_free_bit; +} + +static void block_set_used(block_header_t * block) +{ + block->size &= ~block_header_free_bit; +} + +static int block_is_prev_free(const block_header_t * block) +{ + return tlsf_cast(int, block->size & block_header_prev_free_bit); +} + +static void block_set_prev_free(block_header_t * block) +{ + block->size |= block_header_prev_free_bit; +} + +static void block_set_prev_used(block_header_t * block) +{ + block->size &= ~block_header_prev_free_bit; +} + +static block_header_t * block_from_ptr(const void * ptr) +{ + return tlsf_cast(block_header_t *, + tlsf_cast(unsigned char *, ptr) - block_start_offset); +} + +static void * block_to_ptr(const block_header_t * block) +{ + return tlsf_cast(void *, + tlsf_cast(unsigned char *, block) + block_start_offset); +} + +/* Return location of next block after block of given size. */ +static block_header_t * offset_to_block(const void * ptr, size_t size) +{ + return tlsf_cast(block_header_t *, tlsf_cast(tlsfptr_t, ptr) + size); +} + +/* Return location of previous block. */ +static block_header_t * block_prev(const block_header_t * block) +{ + tlsf_assert(block_is_prev_free(block) && "previous block must be free"); + return block->prev_phys_block; +} + +/* Return location of next existing block. */ +static block_header_t * block_next(const block_header_t * block) +{ + block_header_t * next = offset_to_block(block_to_ptr(block), + block_size(block) - block_header_overhead); + tlsf_assert(!block_is_last(block)); + return next; +} + +/* Link a new block with its physical neighbor, return the neighbor. */ +static block_header_t * block_link_next(block_header_t * block) +{ + block_header_t * next = block_next(block); + next->prev_phys_block = block; + return next; +} + +static void block_mark_as_free(block_header_t * block) +{ + /* Link the block to the next block, first. */ + block_header_t * next = block_link_next(block); + block_set_prev_free(next); + block_set_free(block); +} + +static void block_mark_as_used(block_header_t * block) +{ + block_header_t * next = block_next(block); + block_set_prev_used(next); + block_set_used(block); +} + +static size_t align_up(size_t x, size_t align) +{ + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return (x + (align - 1)) & ~(align - 1); +} + +static size_t align_down(size_t x, size_t align) +{ + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return x - (x & (align - 1)); +} + +static void * align_ptr(const void * ptr, size_t align) +{ + const tlsfptr_t aligned = + (tlsf_cast(tlsfptr_t, ptr) + (align - 1)) & ~(align - 1); + tlsf_assert(0 == (align & (align - 1)) && "must align to a power of two"); + return tlsf_cast(void *, aligned); +} + +/* +** Adjust an allocation size to be aligned to word size, and no smaller +** than internal minimum. +*/ +static size_t adjust_request_size(size_t size, size_t align) +{ + size_t adjust = 0; + if(size) { + const size_t aligned = align_up(size, align); + + /* aligned sized must not exceed block_size_max or we'll go out of bounds on sl_bitmap */ + if(aligned < block_size_max) { + adjust = tlsf_max(aligned, block_size_min); + } + } + return adjust; +} + +/* +** TLSF utility functions. In most cases, these are direct translations of +** the documentation found in the white paper. +*/ + +static void mapping_insert(size_t size, int * fli, int * sli) +{ + int fl, sl; + if(size < SMALL_BLOCK_SIZE) { + /* Store small blocks in first list. */ + fl = 0; + sl = tlsf_cast(int, size) / (SMALL_BLOCK_SIZE / SL_INDEX_COUNT); + } + else { + fl = tlsf_fls_sizet(size); + sl = tlsf_cast(int, size >> (fl - SL_INDEX_COUNT_LOG2)) ^ (1 << SL_INDEX_COUNT_LOG2); + fl -= (FL_INDEX_SHIFT - 1); + } + *fli = fl; + *sli = sl; +} + +/* This version rounds up to the next block size (for allocations) */ +static void mapping_search(size_t size, int * fli, int * sli) +{ + if(size >= SMALL_BLOCK_SIZE) { + const size_t round = (1 << (tlsf_fls_sizet(size) - SL_INDEX_COUNT_LOG2)) - 1; + size += round; + } + mapping_insert(size, fli, sli); +} + +static block_header_t * search_suitable_block(control_t * control, int * fli, int * sli) +{ + int fl = *fli; + int sl = *sli; + + /* + ** First, search for a block in the list associated with the given + ** fl/sl index. + */ + unsigned int sl_map = control->sl_bitmap[fl] & (~0U << sl); + if(!sl_map) { + /* No block exists. Search in the next largest first-level list. */ + const unsigned int fl_map = control->fl_bitmap & (~0U << (fl + 1)); + if(!fl_map) { + /* No free blocks available, memory has been exhausted. */ + return 0; + } + + fl = tlsf_ffs(fl_map); + *fli = fl; + sl_map = control->sl_bitmap[fl]; + } + tlsf_assert(sl_map && "internal error - second level bitmap is null"); + sl = tlsf_ffs(sl_map); + *sli = sl; + + /* Return the first block in the free list. */ + return control->blocks[fl][sl]; +} + +/* Remove a free block from the free list.*/ +static void remove_free_block(control_t * control, block_header_t * block, int fl, int sl) +{ + block_header_t * prev = block->prev_free; + block_header_t * next = block->next_free; + tlsf_assert(prev && "prev_free field cannot be null"); + tlsf_assert(next && "next_free field cannot be null"); + next->prev_free = prev; + prev->next_free = next; + + /* If this block is the head of the free list, set new head. */ + if(control->blocks[fl][sl] == block) { + control->blocks[fl][sl] = next; + + /* If the new head is null, clear the bitmap. */ + if(next == &control->block_null) { + control->sl_bitmap[fl] &= ~(1U << sl); + + /* If the second bitmap is now empty, clear the fl bitmap. */ + if(!control->sl_bitmap[fl]) { + control->fl_bitmap &= ~(1U << fl); + } + } + } +} + +/* Insert a free block into the free block list. */ +static void insert_free_block(control_t * control, block_header_t * block, int fl, int sl) +{ + block_header_t * current = control->blocks[fl][sl]; + tlsf_assert(current && "free list cannot have a null entry"); + tlsf_assert(block && "cannot insert a null entry into the free list"); + block->next_free = current; + block->prev_free = &control->block_null; + current->prev_free = block; + + tlsf_assert(block_to_ptr(block) == align_ptr(block_to_ptr(block), ALIGN_SIZE) + && "block not aligned properly"); + /* + ** Insert the new block at the head of the list, and mark the first- + ** and second-level bitmaps appropriately. + */ + control->blocks[fl][sl] = block; + control->fl_bitmap |= (1U << fl); + control->sl_bitmap[fl] |= (1U << sl); +} + +/* Remove a given block from the free list. */ +static void block_remove(control_t * control, block_header_t * block) +{ + int fl, sl; + mapping_insert(block_size(block), &fl, &sl); + remove_free_block(control, block, fl, sl); +} + +/* Insert a given block into the free list. */ +static void block_insert(control_t * control, block_header_t * block) +{ + int fl, sl; + mapping_insert(block_size(block), &fl, &sl); + insert_free_block(control, block, fl, sl); +} + +static int block_can_split(block_header_t * block, size_t size) +{ + return block_size(block) >= sizeof(block_header_t) + size; +} + +/* Split a block into two, the second of which is free. */ +static block_header_t * block_split(block_header_t * block, size_t size) +{ + /* Calculate the amount of space left in the remaining block. */ + block_header_t * remaining = + offset_to_block(block_to_ptr(block), size - block_header_overhead); + + const size_t remain_size = block_size(block) - (size + block_header_overhead); + + tlsf_assert(block_to_ptr(remaining) == align_ptr(block_to_ptr(remaining), ALIGN_SIZE) + && "remaining block not aligned properly"); + + tlsf_assert(block_size(block) == remain_size + size + block_header_overhead); + block_set_size(remaining, remain_size); + tlsf_assert(block_size(remaining) >= block_size_min && "block split with invalid size"); + + block_set_size(block, size); + block_mark_as_free(remaining); + + return remaining; +} + +/* Absorb a free block's storage into an adjacent previous free block. */ +static block_header_t * block_absorb(block_header_t * prev, block_header_t * block) +{ + tlsf_assert(!block_is_last(prev) && "previous block can't be last"); + /* Note: Leaves flags untouched. */ + prev->size += block_size(block) + block_header_overhead; + block_link_next(prev); + return prev; +} + +/* Merge a just-freed block with an adjacent previous free block. */ +static block_header_t * block_merge_prev(control_t * control, block_header_t * block) +{ + if(block_is_prev_free(block)) { + block_header_t * prev = block_prev(block); + tlsf_assert(prev && "prev physical block can't be null"); + tlsf_assert(block_is_free(prev) && "prev block is not free though marked as such"); + block_remove(control, prev); + block = block_absorb(prev, block); + } + + return block; +} + +/* Merge a just-freed block with an adjacent free block. */ +static block_header_t * block_merge_next(control_t * control, block_header_t * block) +{ + block_header_t * next = block_next(block); + tlsf_assert(next && "next physical block can't be null"); + + if(block_is_free(next)) { + tlsf_assert(!block_is_last(block) && "previous block can't be last"); + block_remove(control, next); + block = block_absorb(block, next); + } + + return block; +} + +/* Trim any trailing block space off the end of a block, return to pool. */ +static void block_trim_free(control_t * control, block_header_t * block, size_t size) +{ + tlsf_assert(block_is_free(block) && "block must be free"); + if(block_can_split(block, size)) { + block_header_t * remaining_block = block_split(block, size); + block_link_next(block); + block_set_prev_free(remaining_block); + block_insert(control, remaining_block); + } +} + +/* Trim any trailing block space off the end of a used block, return to pool. */ +static void block_trim_used(control_t * control, block_header_t * block, size_t size) +{ + tlsf_assert(!block_is_free(block) && "block must be used"); + if(block_can_split(block, size)) { + /* If the next block is free, we must coalesce. */ + block_header_t * remaining_block = block_split(block, size); + block_set_prev_used(remaining_block); + + remaining_block = block_merge_next(control, remaining_block); + block_insert(control, remaining_block); + } +} + +static block_header_t * block_trim_free_leading(control_t * control, block_header_t * block, size_t size) +{ + block_header_t * remaining_block = block; + if(block_can_split(block, size)) { + /* We want the 2nd block. */ + remaining_block = block_split(block, size - block_header_overhead); + block_set_prev_free(remaining_block); + + block_link_next(block); + block_insert(control, block); + } + + return remaining_block; +} + +static block_header_t * block_locate_free(control_t * control, size_t size) +{ + int fl = 0, sl = 0; + block_header_t * block = 0; + + if(size) { + mapping_search(size, &fl, &sl); + + /* + ** mapping_search can futz with the size, so for excessively large sizes it can sometimes wind up + ** with indices that are off the end of the block array. + ** So, we protect against that here, since this is the only callsite of mapping_search. + ** Note that we don't need to check sl, since it comes from a modulo operation that guarantees it's always in range. + */ + if(fl < FL_INDEX_COUNT) { + block = search_suitable_block(control, &fl, &sl); + } + } + + if(block) { + tlsf_assert(block_size(block) >= size); + remove_free_block(control, block, fl, sl); + } + + return block; +} + +static void * block_prepare_used(control_t * control, block_header_t * block, size_t size) +{ + void * p = 0; + if(block) { + tlsf_assert(size && "size must be non-zero"); + block_trim_free(control, block, size); + block_mark_as_used(block); + p = block_to_ptr(block); + } + return p; +} + +/* Clear structure and point all empty lists at the null block. */ +static void control_constructor(control_t * control) +{ + int i, j; + + control->block_null.next_free = &control->block_null; + control->block_null.prev_free = &control->block_null; + + control->fl_bitmap = 0; + for(i = 0; i < FL_INDEX_COUNT; ++i) { + control->sl_bitmap[i] = 0; + for(j = 0; j < SL_INDEX_COUNT; ++j) { + control->blocks[i][j] = &control->block_null; + } + } +} + +/* +** Debugging utilities. +*/ + +typedef struct integrity_t { + int prev_status; + int status; +} integrity_t; + +#define tlsf_insist(x) { tlsf_assert(x); if (!(x)) { status--; } } + +static void integrity_walker(void * ptr, size_t size, int used, void * user) +{ + block_header_t * block = block_from_ptr(ptr); + integrity_t * integ = tlsf_cast(integrity_t *, user); + const int this_prev_status = block_is_prev_free(block) ? 1 : 0; + const int this_status = block_is_free(block) ? 1 : 0; + const size_t this_block_size = block_size(block); + + int status = 0; + LV_UNUSED(used); + tlsf_insist(integ->prev_status == this_prev_status && "prev status incorrect"); + tlsf_insist(size == this_block_size && "block size incorrect"); + + integ->prev_status = this_status; + integ->status += status; +} + +int lv_tlsf_check(lv_tlsf_t tlsf) +{ + int i, j; + + control_t * control = tlsf_cast(control_t *, tlsf); + int status = 0; + + /* Check that the free lists and bitmaps are accurate. */ + for(i = 0; i < FL_INDEX_COUNT; ++i) { + for(j = 0; j < SL_INDEX_COUNT; ++j) { + const int fl_map = control->fl_bitmap & (1U << i); + const int sl_list = control->sl_bitmap[i]; + const int sl_map = sl_list & (1U << j); + const block_header_t * block = control->blocks[i][j]; + + /* Check that first- and second-level lists agree. */ + if(!fl_map) { + tlsf_insist(!sl_map && "second-level map must be null"); + } + + if(!sl_map) { + tlsf_insist(block == &control->block_null && "block list must be null"); + continue; + } + + /* Check that there is at least one free block. */ + tlsf_insist(sl_list && "no free blocks in second-level map"); + tlsf_insist(block != &control->block_null && "block should not be null"); + + while(block != &control->block_null) { + int fli, sli; + tlsf_insist(block_is_free(block) && "block should be free"); + tlsf_insist(!block_is_prev_free(block) && "blocks should have coalesced"); + tlsf_insist(!block_is_free(block_next(block)) && "blocks should have coalesced"); + tlsf_insist(block_is_prev_free(block_next(block)) && "block should be free"); + tlsf_insist(block_size(block) >= block_size_min && "block not minimum size"); + + mapping_insert(block_size(block), &fli, &sli); + tlsf_insist(fli == i && sli == j && "block size indexed in wrong list"); + block = block->next_free; + } + } + } + + return status; +} + +#undef tlsf_insist + +static void default_walker(void * ptr, size_t size, int used, void * user) +{ + LV_UNUSED(user); + printf("\t%p %s size: %x (%p)\n", ptr, used ? "used" : "free", (unsigned int)size, (void *)block_from_ptr(ptr)); +} + +void lv_tlsf_walk_pool(lv_pool_t pool, lv_tlsf_walker walker, void * user) +{ + lv_tlsf_walker pool_walker = walker ? walker : default_walker; + block_header_t * block = + offset_to_block(pool, -(int)block_header_overhead); + + while(block && !block_is_last(block)) { + pool_walker( + block_to_ptr(block), + block_size(block), + !block_is_free(block), + user); + block = block_next(block); + } +} + +size_t lv_tlsf_block_size(void * ptr) +{ + size_t size = 0; + if(ptr) { + const block_header_t * block = block_from_ptr(ptr); + size = block_size(block); + } + return size; +} + +int lv_tlsf_check_pool(lv_pool_t pool) +{ + /* Check that the blocks are physically correct. */ + integrity_t integ = { 0, 0 }; + lv_tlsf_walk_pool(pool, integrity_walker, &integ); + + return integ.status; +} + +/* +** Size of the TLSF structures in a given memory block passed to +** lv_tlsf_create, equal to the size of a control_t +*/ +size_t lv_tlsf_size(void) +{ + return sizeof(control_t); +} + +size_t lv_tlsf_align_size(void) +{ + return ALIGN_SIZE; +} + +size_t lv_tlsf_block_size_min(void) +{ + return block_size_min; +} + +size_t lv_tlsf_block_size_max(void) +{ + return block_size_max; +} + +/* +** Overhead of the TLSF structures in a given memory block passed to +** lv_tlsf_add_pool, equal to the overhead of a free block and the +** sentinel block. +*/ +size_t lv_tlsf_pool_overhead(void) +{ + return 2 * block_header_overhead; +} + +size_t lv_tlsf_alloc_overhead(void) +{ + return block_header_overhead; +} + +lv_pool_t lv_tlsf_add_pool(lv_tlsf_t tlsf, void * mem, size_t bytes) +{ + block_header_t * block; + block_header_t * next; + + const size_t pool_overhead = lv_tlsf_pool_overhead(); + const size_t pool_bytes = align_down(bytes - pool_overhead, ALIGN_SIZE); + + if(((ptrdiff_t)mem % ALIGN_SIZE) != 0) { + printf("lv_tlsf_add_pool: Memory must be aligned by %u bytes.\n", + (unsigned int)ALIGN_SIZE); + return 0; + } + + if(pool_bytes < block_size_min || pool_bytes > block_size_max) { +#if defined (TLSF_64BIT) + printf("lv_tlsf_add_pool: Memory size must be between 0x%x and 0x%x00 bytes.\n", + (unsigned int)(pool_overhead + block_size_min), + (unsigned int)((pool_overhead + block_size_max) / 256)); +#else + printf("lv_tlsf_add_pool: Memory size must be between %u and %u bytes.\n", + (unsigned int)(pool_overhead + block_size_min), + (unsigned int)(pool_overhead + block_size_max)); +#endif + return 0; + } + + /* + ** Create the main free block. Offset the start of the block slightly + ** so that the prev_phys_block field falls outside of the pool - + ** it will never be used. + */ + block = offset_to_block(mem, -(tlsfptr_t)block_header_overhead); + block_set_size(block, pool_bytes); + block_set_free(block); + block_set_prev_used(block); + block_insert(tlsf_cast(control_t *, tlsf), block); + + /* Split the block to create a zero-size sentinel block. */ + next = block_link_next(block); + block_set_size(next, 0); + block_set_used(next); + block_set_prev_free(next); + + return mem; +} + +void lv_tlsf_remove_pool(lv_tlsf_t tlsf, lv_pool_t pool) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + block_header_t * block = offset_to_block(pool, -(int)block_header_overhead); + + int fl = 0, sl = 0; + + tlsf_assert(block_is_free(block) && "block should be free"); + tlsf_assert(!block_is_free(block_next(block)) && "next block should not be free"); + tlsf_assert(block_size(block_next(block)) == 0 && "next block size should be zero"); + + mapping_insert(block_size(block), &fl, &sl); + remove_free_block(control, block, fl, sl); +} + +/* +** TLSF main interface. +*/ + +#if _DEBUG +int test_ffs_fls() +{ + /* Verify ffs/fls work properly. */ + int rv = 0; + rv += (tlsf_ffs(0) == -1) ? 0 : 0x1; + rv += (tlsf_fls(0) == -1) ? 0 : 0x2; + rv += (tlsf_ffs(1) == 0) ? 0 : 0x4; + rv += (tlsf_fls(1) == 0) ? 0 : 0x8; + rv += (tlsf_ffs(0x80000000) == 31) ? 0 : 0x10; + rv += (tlsf_ffs(0x80008000) == 15) ? 0 : 0x20; + rv += (tlsf_fls(0x80000008) == 31) ? 0 : 0x40; + rv += (tlsf_fls(0x7FFFFFFF) == 30) ? 0 : 0x80; + +#if defined (TLSF_64BIT) + rv += (tlsf_fls_sizet(0x80000000) == 31) ? 0 : 0x100; + rv += (tlsf_fls_sizet(0x100000000) == 32) ? 0 : 0x200; + rv += (tlsf_fls_sizet(0xffffffffffffffff) == 63) ? 0 : 0x400; +#endif + + if(rv) { + printf("test_ffs_fls: %x ffs/fls tests failed.\n", rv); + } + return rv; +} +#endif + +lv_tlsf_t lv_tlsf_create(void * mem) +{ +#if _DEBUG + if(test_ffs_fls()) { + return 0; + } +#endif + + if(((tlsfptr_t)mem % ALIGN_SIZE) != 0) { + printf("lv_tlsf_create: Memory must be aligned to %u bytes.\n", + (unsigned int)ALIGN_SIZE); + return 0; + } + + control_constructor(tlsf_cast(control_t *, mem)); + + return tlsf_cast(lv_tlsf_t, mem); +} + +lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes) +{ + lv_tlsf_t tlsf = lv_tlsf_create(mem); + lv_tlsf_add_pool(tlsf, (char *)mem + lv_tlsf_size(), bytes - lv_tlsf_size()); + return tlsf; +} + +void lv_tlsf_destroy(lv_tlsf_t tlsf) +{ + /* Nothing to do. */ + LV_UNUSED(tlsf); +} + +lv_pool_t lv_tlsf_get_pool(lv_tlsf_t tlsf) +{ + return tlsf_cast(lv_pool_t, (char *)tlsf + lv_tlsf_size()); +} + +void * lv_tlsf_malloc(lv_tlsf_t tlsf, size_t size) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + block_header_t * block = block_locate_free(control, adjust); + return block_prepare_used(control, block, adjust); +} + +void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t size) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + + /* + ** We must allocate an additional minimum block size bytes so that if + ** our free block will leave an alignment gap which is smaller, we can + ** trim a leading free block and release it back to the pool. We must + ** do this because the previous physical block is in use, therefore + ** the prev_phys_block field is not valid, and we can't simply adjust + ** the size of that block. + */ + const size_t gap_minimum = sizeof(block_header_t); + const size_t size_with_gap = adjust_request_size(adjust + align + gap_minimum, align); + + /* + ** If alignment is less than or equals base alignment, we're done. + ** If we requested 0 bytes, return null, as lv_tlsf_malloc(0) does. + */ + const size_t aligned_size = (adjust && align > ALIGN_SIZE) ? size_with_gap : adjust; + + block_header_t * block = block_locate_free(control, aligned_size); + + /* This can't be a static assert. */ + tlsf_assert(sizeof(block_header_t) == block_size_min + block_header_overhead); + + if(block) { + void * ptr = block_to_ptr(block); + void * aligned = align_ptr(ptr, align); + size_t gap = tlsf_cast(size_t, + tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); + + /* If gap size is too small, offset to next aligned boundary. */ + if(gap && gap < gap_minimum) { + const size_t gap_remain = gap_minimum - gap; + const size_t offset = tlsf_max(gap_remain, align); + const void * next_aligned = tlsf_cast(void *, + tlsf_cast(tlsfptr_t, aligned) + offset); + + aligned = align_ptr(next_aligned, align); + gap = tlsf_cast(size_t, + tlsf_cast(tlsfptr_t, aligned) - tlsf_cast(tlsfptr_t, ptr)); + } + + if(gap) { + tlsf_assert(gap >= gap_minimum && "gap size too small"); + block = block_trim_free_leading(control, block, gap); + } + } + + return block_prepare_used(control, block, adjust); +} + +size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr) +{ + size_t size = 0; + /* Don't attempt to free a NULL pointer. */ + if(ptr) { + control_t * control = tlsf_cast(control_t *, tlsf); + block_header_t * block = block_from_ptr(ptr); + tlsf_assert(!block_is_free(block) && "block already marked as free"); + size = block->size; + block_mark_as_free(block); + block = block_merge_prev(control, block); + block = block_merge_next(control, block); + block_insert(control, block); + } + + return size; +} + +/* +** The TLSF block information provides us with enough information to +** provide a reasonably intelligent implementation of realloc, growing or +** shrinking the currently allocated block as required. +** +** This routine handles the somewhat esoteric edge cases of realloc: +** - a non-zero size with a null pointer will behave like malloc +** - a zero size with a non-null pointer will behave like free +** - a request that cannot be satisfied will leave the original buffer +** untouched +** - an extended buffer size will leave the newly-allocated area with +** contents undefined +*/ +void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size) +{ + control_t * control = tlsf_cast(control_t *, tlsf); + void * p = 0; + + /* Zero-size requests are treated as free. */ + if(ptr && size == 0) { + lv_tlsf_free(tlsf, ptr); + } + /* Requests with NULL pointers are treated as malloc. */ + else if(!ptr) { + p = lv_tlsf_malloc(tlsf, size); + } + else { + block_header_t * block = block_from_ptr(ptr); + block_header_t * next = block_next(block); + + const size_t cursize = block_size(block); + const size_t combined = cursize + block_size(next) + block_header_overhead; + const size_t adjust = adjust_request_size(size, ALIGN_SIZE); + if(size > cursize && adjust == 0) { + /* The request is probably too large, fail */ + return NULL; + } + + tlsf_assert(!block_is_free(block) && "block already marked as free"); + + /* + ** If the next block is used, or when combined with the current + ** block, does not offer enough space, we must reallocate and copy. + */ + if(adjust > cursize && (!block_is_free(next) || adjust > combined)) { + p = lv_tlsf_malloc(tlsf, size); + if(p) { + const size_t minsize = tlsf_min(cursize, size); + lv_memcpy(p, ptr, minsize); + lv_tlsf_free(tlsf, ptr); + } + } + else { + /* Do we need to expand to the next block? */ + if(adjust > cursize) { + block_merge_next(control, block); + block_mark_as_used(block); + } + + /* Trim the resulting block and return the original pointer. */ + block_trim_used(control, block, adjust); + p = ptr; + } + } + + return p; +} + +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/inc/lvgl/src/stdlib/builtin/lv_tlsf.h b/inc/lvgl/src/stdlib/builtin/lv_tlsf.h new file mode 100644 index 0000000..d563272 --- /dev/null +++ b/inc/lvgl/src/stdlib/builtin/lv_tlsf.h @@ -0,0 +1,96 @@ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + +#ifndef LV_TLSF_H +#define LV_TLSF_H + +/* +** Two Level Segregated Fit memory allocator, version 3.1. +** Written by Matthew Conte +** http://tlsf.baisoku.org +** +** Based on the original documentation by Miguel Masmano: +** http://www.gii.upv.es/tlsf/main/docs +** +** This implementation was written to the specification +** of the document, therefore no GPL restrictions apply. +** +** Copyright (c) 2006-2016, Matthew Conte +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** * Neither the name of the copyright holder nor the +** names of its contributors may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL MATTHEW CONTE BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "../../misc/lv_ll.h" +#include "../../misc/lv_types.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/* lv_tlsf_t: a TLSF structure. Can contain 1 to N pools. */ +/* lv_pool_t: a block of memory that TLSF can manage. */ +typedef void * lv_tlsf_t; +typedef void * lv_pool_t; + +/* Create/destroy a memory pool. */ +lv_tlsf_t lv_tlsf_create(void * mem); +lv_tlsf_t lv_tlsf_create_with_pool(void * mem, size_t bytes); +void lv_tlsf_destroy(lv_tlsf_t tlsf); +lv_pool_t lv_tlsf_get_pool(lv_tlsf_t tlsf); + +/* Add/remove memory pools. */ +lv_pool_t lv_tlsf_add_pool(lv_tlsf_t tlsf, void * mem, size_t bytes); +void lv_tlsf_remove_pool(lv_tlsf_t tlsf, lv_pool_t pool); + +/* malloc/memalign/realloc/free replacements. */ +void * lv_tlsf_malloc(lv_tlsf_t tlsf, size_t bytes); +void * lv_tlsf_memalign(lv_tlsf_t tlsf, size_t align, size_t bytes); +void * lv_tlsf_realloc(lv_tlsf_t tlsf, void * ptr, size_t size); +size_t lv_tlsf_free(lv_tlsf_t tlsf, const void * ptr); + +/* Returns internal block size, not original request size */ +size_t lv_tlsf_block_size(void * ptr); + +/* Overheads/limits of internal structures. */ +size_t lv_tlsf_size(void); +size_t lv_tlsf_align_size(void); +size_t lv_tlsf_block_size_min(void); +size_t lv_tlsf_block_size_max(void); +size_t lv_tlsf_pool_overhead(void); +size_t lv_tlsf_alloc_overhead(void); + +/* Debugging. */ +typedef void (*lv_tlsf_walker)(void * ptr, size_t size, int used, void * user); +void lv_tlsf_walk_pool(lv_pool_t pool, lv_tlsf_walker walker, void * user); +/* Returns nonzero if any internal consistency check fails. */ +int lv_tlsf_check(lv_tlsf_t tlsf); +int lv_tlsf_check_pool(lv_pool_t pool); + +#if defined(__cplusplus) +}; +#endif + +#endif /*LV_TLSF_H*/ + +#endif /*LV_STDLIB_BUILTIN*/ diff --git a/inc/lvgl/src/stdlib/builtin/lv_tlsf_private.h b/inc/lvgl/src/stdlib/builtin/lv_tlsf_private.h new file mode 100644 index 0000000..d9fe9f7 --- /dev/null +++ b/inc/lvgl/src/stdlib/builtin/lv_tlsf_private.h @@ -0,0 +1,54 @@ +/** + * @file lv_tlsf_private.h + * + */ + +#ifndef LV_TLSF_PRIVATE_H +#define LV_TLSF_PRIVATE_H + +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_tlsf.h" +#include "../../osal/lv_os_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { +#if LV_USE_OS + lv_mutex_t mutex; +#endif + lv_tlsf_t tlsf; + size_t cur_used; + size_t max_used; + lv_ll_t pool_ll; +} lv_tlsf_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/ + +#endif /*LV_TLSF_PRIVATE_H*/ diff --git a/inc/lvgl/src/stdlib/clib/lv_mem_core_clib.c b/inc/lvgl/src/stdlib/clib/lv_mem_core_clib.c new file mode 100644 index 0000000..83e90a9 --- /dev/null +++ b/inc/lvgl/src/stdlib/clib/lv_mem_core_clib.c @@ -0,0 +1,94 @@ +/** + * @file lv_mem_core_clib.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_mem.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_CLIB +#include "../../stdlib/lv_mem.h" +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_mem_init(void) +{ + return; /*Nothing to init*/ +} + +void lv_mem_deinit(void) +{ + return; /*Nothing to deinit*/ + +} + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) +{ + /*Not supported*/ + LV_UNUSED(mem); + LV_UNUSED(bytes); + return NULL; +} + +void lv_mem_remove_pool(lv_mem_pool_t pool) +{ + /*Not supported*/ + LV_UNUSED(pool); + return; +} + +void * lv_malloc_core(size_t size) +{ + return malloc(size); +} + +void * lv_realloc_core(void * p, size_t new_size) +{ + return realloc(p, new_size); +} + +void lv_free_core(void * p) +{ + free(p); +} + +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) +{ + /*Not supported*/ + LV_UNUSED(mon_p); + return; +} + +lv_result_t lv_mem_test_core(void) +{ + /*Not supported*/ + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_CLIB*/ diff --git a/inc/lvgl/src/stdlib/clib/lv_sprintf_clib.c b/inc/lvgl/src/stdlib/clib/lv_sprintf_clib.c new file mode 100644 index 0000000..32eaee5 --- /dev/null +++ b/inc/lvgl/src/stdlib/clib/lv_sprintf_clib.c @@ -0,0 +1,58 @@ + +/** + * @file lv_sprintf_clib.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_SPRINTF == LV_STDLIB_CLIB +#include +#include +#include "../lv_sprintf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +int lv_snprintf(char * buffer, size_t count, const char * format, ...) +{ + va_list va; + va_start(va, format); + const int ret = vsnprintf(buffer, count, format, va); + va_end(va); + return ret; +} + +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) +{ + return vsnprintf(buffer, count, format, va); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif diff --git a/inc/lvgl/src/stdlib/clib/lv_string_clib.c b/inc/lvgl/src/stdlib/clib/lv_string_clib.c new file mode 100644 index 0000000..97acfaa --- /dev/null +++ b/inc/lvgl/src/stdlib/clib/lv_string_clib.c @@ -0,0 +1,140 @@ +/** + * @file lv_string_clib.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_STRING == LV_STDLIB_CLIB +#include "../lv_string.h" +#include "../lv_mem.h" /*Need lv_malloc*/ +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) +{ + return memcpy(dst, src, len); +} + +void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) +{ + memset(dst, v, len); +} + +void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len) +{ + return memmove(dst, src, len); +} + +int lv_memcmp(const void * p1, const void * p2, size_t len) +{ + return memcmp(p1, p2, len); +} + +size_t lv_strlen(const char * str) +{ + return strlen(str); +} + +size_t lv_strnlen(const char * str, size_t max_len) +{ + return strnlen(str, max_len); +} + +size_t lv_strlcpy(char * dst, const char * src, size_t dst_size) +{ + size_t src_len = strlen(src); + if(dst_size > 0) { + size_t copy_size = src_len < dst_size ? src_len : dst_size - 1; + memcpy(dst, src, copy_size); + dst[copy_size] = '\0'; + } + return src_len; +} + +char * lv_strncpy(char * dst, const char * src, size_t dest_size) +{ + return strncpy(dst, src, dest_size); +} + +char * lv_strcpy(char * dst, const char * src) +{ + return strcpy(dst, src); +} + +int lv_strcmp(const char * s1, const char * s2) +{ + return strcmp(s1, s2); +} + +int lv_strncmp(const char * s1, const char * s2, size_t len) +{ + return strncmp(s1, s2, len); +} + +char * lv_strdup(const char * src) +{ + /*strdup uses malloc, so use the lv_malloc when LV_USE_STDLIB_MALLOC is not LV_STDLIB_CLIB */ + size_t len = lv_strlen(src) + 1; + char * dst = lv_malloc(len); + if(dst == NULL) return NULL; + + lv_memcpy(dst, src, len); /*do memcpy is faster than strncpy when length is known*/ + return dst; +} + +char * lv_strndup(const char * src, size_t max_len) +{ + size_t len = lv_strnlen(src, max_len); + char * dst = lv_malloc(len + 1); + if(dst == NULL) return NULL; + + lv_memcpy(dst, src, len); + dst[len] = '\0'; + return dst; +} + +char * lv_strcat(char * dst, const char * src) +{ + return strcat(dst, src); +} + +char * lv_strncat(char * dst, const char * src, size_t src_len) +{ + return strncat(dst, src, src_len); +} + +char * lv_strchr(const char * str, int c) +{ + return strchr(str, c); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_CLIB*/ diff --git a/inc/lvgl/src/stdlib/lv_mem.c b/inc/lvgl/src/stdlib/lv_mem.c new file mode 100644 index 0000000..41a002d --- /dev/null +++ b/inc/lvgl/src/stdlib/lv_mem.c @@ -0,0 +1,188 @@ +/** + * @file lv_mem.c + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_mem_private.h" +#include "lv_string.h" +#include "../misc/lv_assert.h" +#include "../misc/lv_log.h" +#include "../core/lv_global.h" + +#if LV_USE_OS == LV_OS_PTHREAD + #include +#endif + +/********************* + * DEFINES + *********************/ +/*memset the allocated memories to 0xaa and freed memories to 0xbb (just for testing purposes)*/ +#ifndef LV_MEM_ADD_JUNK + #define LV_MEM_ADD_JUNK 0 +#endif + +#define zero_mem LV_GLOBAL_DEFAULT()->memory_zero + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void * lv_malloc_core(size_t size); +void * lv_realloc_core(void * p, size_t new_size); +void lv_free_core(void * p); +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p); +lv_result_t lv_mem_test_core(void); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ +#if LV_USE_LOG && LV_LOG_TRACE_MEM + #define LV_TRACE_MEM(...) LV_LOG_TRACE(__VA_ARGS__) +#else + #define LV_TRACE_MEM(...) +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * lv_malloc(size_t size) +{ + LV_TRACE_MEM("allocating %lu bytes", (unsigned long)size); + if(size == 0) { + LV_TRACE_MEM("using zero_mem"); + return &zero_mem; + } + + void * alloc = lv_malloc_core(size); + + if(alloc == NULL) { + LV_LOG_INFO("couldn't allocate memory (%lu bytes)", (unsigned long)size); +#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO + lv_mem_monitor_t mon; + lv_mem_monitor(&mon); + LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu", + mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, + mon.free_biggest_size); +#endif + return NULL; + } + +#if LV_MEM_ADD_JUNK + lv_memset(alloc, 0xaa, size); +#endif + + LV_TRACE_MEM("allocated at %p", alloc); + return alloc; +} + +void * lv_malloc_zeroed(size_t size) +{ + LV_TRACE_MEM("allocating %lu bytes", (unsigned long)size); + if(size == 0) { + LV_TRACE_MEM("using zero_mem"); + return &zero_mem; + } + + void * alloc = lv_malloc_core(size); + if(alloc == NULL) { + LV_LOG_INFO("couldn't allocate memory (%lu bytes)", (unsigned long)size); +#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO + lv_mem_monitor_t mon; + lv_mem_monitor(&mon); + LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu", + mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct, + mon.free_biggest_size); +#endif + return NULL; + } + + lv_memzero(alloc, size); + + LV_TRACE_MEM("allocated at %p", alloc); + return alloc; +} + +void * lv_calloc(size_t num, size_t size) +{ + LV_TRACE_MEM("allocating number of %zu each %zu bytes", num, size); + return lv_malloc_zeroed(num * size); +} + +void * lv_zalloc(size_t size) +{ + return lv_malloc_zeroed(size); +} + +void lv_free(void * data) +{ + LV_TRACE_MEM("freeing %p", data); + if(data == &zero_mem) return; + if(data == NULL) return; + + lv_free_core(data); +} + +void * lv_reallocf(void * data_p, size_t new_size) +{ + void * new = lv_realloc(data_p, new_size); + if(!new) { + lv_free(data_p); + } + return new; +} + +void * lv_realloc(void * data_p, size_t new_size) +{ + LV_TRACE_MEM("reallocating %p with %lu size", data_p, (unsigned long)new_size); + if(new_size == 0) { + LV_TRACE_MEM("using zero_mem"); + lv_free(data_p); + return &zero_mem; + } + + if(data_p == &zero_mem) return lv_malloc(new_size); + + void * new_p = lv_realloc_core(data_p, new_size); + + if(new_p == NULL) { + LV_LOG_ERROR("couldn't reallocate memory"); + return NULL; + } + + LV_TRACE_MEM("reallocated at %p", new_p); + return new_p; +} + +lv_result_t lv_mem_test(void) +{ + if(zero_mem != ZERO_MEM_SENTINEL) { + LV_LOG_WARN("zero_mem is written"); + return LV_RESULT_INVALID; + } + + return lv_mem_test_core(); +} + +void lv_mem_monitor(lv_mem_monitor_t * mon_p) +{ + lv_memzero(mon_p, sizeof(lv_mem_monitor_t)); + lv_mem_monitor_core(mon_p); +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/stdlib/lv_mem.h b/inc/lvgl/src/stdlib/lv_mem.h new file mode 100644 index 0000000..2b9e2de --- /dev/null +++ b/inc/lvgl/src/stdlib/lv_mem.h @@ -0,0 +1,166 @@ +/** + * @file lv_mem.h + * + */ + +#ifndef LV_MEM_H +#define LV_MEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "lv_string.h" + +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef void * lv_mem_pool_t; + +/** + * Heap information structure. + */ +typedef struct { + size_t total_size; /**< Total heap size */ + size_t free_cnt; + size_t free_size; /**< Size of available memory */ + size_t free_biggest_size; + size_t used_cnt; + size_t max_used; /**< Max size of Heap memory used */ + uint8_t used_pct; /**< Percentage used */ + uint8_t frag_pct; /**< Amount of fragmentation */ +} lv_mem_monitor_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize to use malloc/free/realloc etc + */ +void lv_mem_init(void); + +/** + * Drop all dynamically allocated memory and reset the memory pools' state + */ +void lv_mem_deinit(void); + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes); + +void lv_mem_remove_pool(lv_mem_pool_t pool); + +/** + * Allocate memory dynamically + * @param size requested size in bytes + * @return pointer to allocated uninitialized memory, or NULL on failure + */ +void * lv_malloc(size_t size); + +/** + * Allocate a block of zeroed memory dynamically + * @param num requested number of element to be allocated. + * @param size requested size of each element in bytes. + * @return pointer to allocated zeroed memory, or NULL on failure + */ +void * lv_calloc(size_t num, size_t size); + +/** + * Allocate zeroed memory dynamically + * @param size requested size in bytes + * @return pointer to allocated zeroed memory, or NULL on failure + */ +void * lv_zalloc(size_t size); + +/** + * Allocate zeroed memory dynamically + * @param size requested size in bytes + * @return pointer to allocated zeroed memory, or NULL on failure + */ +void * lv_malloc_zeroed(size_t size); + +/** + * Free an allocated data + * @param data pointer to an allocated memory + */ +void lv_free(void * data); + +/** + * Reallocate a memory with a new size. The old content will be kept. + * @param data_p pointer to an allocated memory. + * Its content will be copied to the new memory block and freed + * @param new_size the desired new size in byte + * @return pointer to the new memory, NULL on failure + */ +void * lv_realloc(void * data_p, size_t new_size); + +/** + * Reallocate a memory with a new size. The old content will be kept. + * In case of failure, the old pointer is free'd. + * @param data_p pointer to an allocated memory. + * Its content will be copied to the new memory block and freed + * @param new_size the desired new size in byte + * @return pointer to the new memory, NULL on failure + */ +void * lv_reallocf(void * data_p, size_t new_size); + +/** + * Used internally to execute a plain `malloc` operation + * @param size size in bytes to `malloc` + */ +void * lv_malloc_core(size_t size); + +/** + * Used internally to execute a plain `free` operation + * @param p memory address to free + */ +void lv_free_core(void * p); + +/** + * Used internally to execute a plain realloc operation + * @param p memory address to realloc + * @param new_size size in bytes to realloc + */ +void * lv_realloc_core(void * p, size_t new_size); + +/** + * Used internally by lv_mem_monitor() to gather LVGL heap state information. + * @param mon_p pointer to lv_mem_monitor_t object to be populated. + */ +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p); + +lv_result_t lv_mem_test_core(void); + +/** + * @brief Tests the memory allocation system by allocating and freeing a block of memory. + * @return LV_RESULT_OK if the memory allocation system is working properly, or LV_RESULT_INVALID if there is an error. + */ +lv_result_t lv_mem_test(void); + +/** + * Give information about the work memory of dynamic allocation + * @param mon_p pointer to a lv_mem_monitor_t variable, + * the result of the analysis will be stored here + */ +void lv_mem_monitor(lv_mem_monitor_t * mon_p); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MEM_H*/ diff --git a/inc/lvgl/src/stdlib/lv_mem_private.h b/inc/lvgl/src/stdlib/lv_mem_private.h new file mode 100644 index 0000000..9e70ae1 --- /dev/null +++ b/inc/lvgl/src/stdlib/lv_mem_private.h @@ -0,0 +1,39 @@ +/** + * @file lv_mem_private.h + * + */ + +#ifndef LV_MEM_PRIVATE_H +#define LV_MEM_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MEM_PRIVATE_H*/ diff --git a/inc/lvgl/src/stdlib/lv_sprintf.h b/inc/lvgl/src/stdlib/lv_sprintf.h new file mode 100644 index 0000000..19bfd2f --- /dev/null +++ b/inc/lvgl/src/stdlib/lv_sprintf.h @@ -0,0 +1,60 @@ +/** + * @file lv_sprintf.h + * + */ + +#ifndef LV_SPRINTF_H +#define LV_SPRINTF_H + +#if defined(__has_include) + #if __has_include(LV_INTTYPES_INCLUDE) + #include LV_INTTYPES_INCLUDE + /* platform-specific printf format for int32_t, usually "d" or "ld" */ + #define LV_PRId32 PRId32 + #define LV_PRIu32 PRIu32 + #define LV_PRIx32 PRIx32 + #define LV_PRIX32 PRIX32 + + #define LV_PRId64 PRId64 + #define LV_PRIu64 PRIu64 + #define LV_PRIx64 PRIx64 + #define LV_PRIX64 PRIX64 + #else + #define LV_PRId32 "d" + #define LV_PRIu32 "u" + #define LV_PRIx32 "x" + #define LV_PRIX32 "X" + + #define LV_PRId64 "lld" + #define LV_PRIu64 "llu" + #define LV_PRIx64 "llx" + #define LV_PRIX64 "llX" + #endif +#else + /* hope this is correct for ports without __has_include or without inttypes.h */ + #define LV_PRId32 "d" + #define LV_PRIu32 "u" + #define LV_PRIx32 "x" + #define LV_PRIX32 "X" + + #define LV_PRId64 "lld" + #define LV_PRIu64 "llu" + #define LV_PRIx64 "llx" + #define LV_PRIX64 "llX" +#endif + +#include "../misc/lv_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int lv_snprintf(char * buffer, size_t count, const char * format, ...); + +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va); + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_SPRINTF_H */ diff --git a/inc/lvgl/src/stdlib/lv_string.h b/inc/lvgl/src/stdlib/lv_string.h new file mode 100644 index 0000000..12466c6 --- /dev/null +++ b/inc/lvgl/src/stdlib/lv_string.h @@ -0,0 +1,204 @@ +/** + * @file lv_string.h + * + */ + +#ifndef LV_STRING_H +#define LV_STRING_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * @brief Copies a block of memory from a source address to a destination address. + * @param dst Pointer to the destination array where the content is to be copied. + * @param src Pointer to the source of data to be copied. + * @param len Number of bytes to copy. + * @return Pointer to the destination array. + * @note The function does not check for any overlapping of the source and destination memory blocks. + */ +void * lv_memcpy(void * dst, const void * src, size_t len); + +/** + * @brief Fills a block of memory with a specified value. + * @param dst Pointer to the destination array to fill with the specified value. + * @param v Value to be set. The value is passed as an int, but the function fills + * the block of memory using the unsigned char conversion of this value. + * @param len Number of bytes to be set to the value. + */ +void lv_memset(void * dst, uint8_t v, size_t len); + +/** + * @brief Move a block of memory from source to destination + * @param dst Pointer to the destination array where the content is to be copied. + * @param src Pointer to the source of data to be copied. + * @param len Number of bytes to copy + * @return Pointer to the destination array. + */ +void * lv_memmove(void * dst, const void * src, size_t len); + +/** + * @brief This function will compare two memory blocks + * @param p1 Pointer to the first memory block + * @param p2 Pointer to the second memory block + * @param len Number of bytes to compare + * @return The difference between the value of the first unmatching byte. + */ +int lv_memcmp(const void * p1, const void * p2, size_t len); + +/** + * Same as `memset(dst, 0x00, len)`. + * @param dst pointer to the destination buffer + * @param len number of byte to set + */ +static inline void lv_memzero(void * dst, size_t len) +{ + lv_memset(dst, 0x00, len); +} + +/** + * @brief Computes the length of the string str up to (but not including) the terminating null character. + * @param str Pointer to the null-terminated byte string to be examined. + * @return The length of the string in bytes. + */ +size_t lv_strlen(const char * str); + +/** + * @brief Computes the length of the string str up to (but not including) the terminating null character, + * or the given maximum length. + * @param str Pointer to byte string that is null-terminated or at least max_len bytes long. + * @param max_len Maximum number of characters to examine. + * @return The length of the string in bytes. + */ +size_t lv_strnlen(const char * str, size_t max_len); + +/** + * @brief Copies up to dst_size-1 (non-null) characters from src to dst. A null terminator is always added. + * @param dst Pointer to the destination array where the content is to be copied. + * @param src Pointer to the source of data to be copied. + * @param dst_size Maximum number of characters to be copied to dst, including the null character. + * @return The length of src. The return value is equivalent to the value returned by lv_strlen(src) + */ +size_t lv_strlcpy(char * dst, const char * src, size_t dst_size); + +/** + * @brief Copies up to dest_size characters from the string pointed to by src to the character array pointed to by dst + * and fills the remaining length with null bytes. + * @param dst Pointer to the destination array where the content is to be copied. + * @param src Pointer to the source of data to be copied. + * @param dest_size Maximum number of characters to be copied to dst. + * @return A pointer to the destination array, which is dst. + * @note dst will not be null terminated if dest_size bytes were copied from src before the end of src was reached. + */ +char * lv_strncpy(char * dst, const char * src, size_t dest_size); + +/** + * @brief Copies the string pointed to by src, including the terminating null character, + * to the character array pointed to by dst. + * @param dst Pointer to the destination array where the content is to be copied. + * @param src Pointer to the source of data to be copied. + * @return A pointer to the destination array, which is dst. + */ +char * lv_strcpy(char * dst, const char * src); + +/** + * @brief This function will compare two strings without specified length. + * @param s1 pointer to the first string + * @param s2 pointer to the second string + * @return the difference between the value of the first unmatching character. + */ +int lv_strcmp(const char * s1, const char * s2); + +/** + * @brief This function will compare two strings up to the given length. + * @param s1 pointer to the first string + * @param s2 pointer to the second string + * @param len the maximum amount of characters to compare + * @return the difference between the value of the first unmatching character. + */ +int lv_strncmp(const char * s1, const char * s2, size_t len); + +/** Returns true if the two strings are equal. + * Just a wrapper around strcmp for convenience. + * @param s1 pointer to the first string + * @param s2 pointer to the second string + * @return true: the strings are equal; false: otherwise + */ +static inline bool lv_streq(const char * s1, const char * s2) +{ + return lv_strcmp(s1, s2) == 0; +} + +/** + * @brief Duplicate a string by allocating a new one and copying the content. + * @param src Pointer to the source of data to be copied. + * @return A pointer to the new allocated string. NULL if failed. + */ +char * lv_strdup(const char * src); + +/** + * @brief Duplicate a string by allocating a new one and copying the content + * up to the end or the specified maximum length, whichever comes first. + * @param src Pointer to the source of data to be copied. + * @param max_len Maximum number of characters to be copied. + * @return Pointer to a newly allocated null-terminated string. NULL if failed. + */ +char * lv_strndup(const char * src, size_t max_len); + +/** + * @brief Copies the string pointed to by src, including the terminating null character, + * to the end of the string pointed to by dst. + * @param dst Pointer to the destination string where the content is to be appended. + * @param src Pointer to the source of data to be copied. + * @return A pointer to the destination string, which is dst. + */ +char * lv_strcat(char * dst, const char * src); + +/** + * @brief Copies up to src_len characters from the string pointed to by src + * to the end of the string pointed to by dst. + * A terminating null character is appended to dst even if no null character + * was encountered in src after src_len characters were copied. + * @param dst Pointer to the destination string where the content is to be appended. + * @param src Pointer to the source of data to be copied. + * @param src_len Maximum number of characters from src to be copied to the end of dst. + * @return A pointer to the destination string, which is dst. + */ +char * lv_strncat(char * dst, const char * src, size_t src_len); + +/** + * @brief Searches for the first occurrence of character c in the string str. + * @param str Pointer to the null-terminated byte string to be searched. + * @param c The character to be searched for. + * @return A pointer to the first occurrence of character c in the string str, or a null pointer if c is not found. + */ +char * lv_strchr(const char * str, int c); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_STRING_H*/ diff --git a/inc/lvgl/src/stdlib/micropython/lv_mem_core_micropython.c b/inc/lvgl/src/stdlib/micropython/lv_mem_core_micropython.c new file mode 100644 index 0000000..b306a72 --- /dev/null +++ b/inc/lvgl/src/stdlib/micropython/lv_mem_core_micropython.c @@ -0,0 +1,110 @@ +/** + * @file lv_mem_core_micropython.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_mem.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_MICROPYTHON +#include "../../stdlib/lv_mem.h" +#include "include/lv_mp_mem_custom_include.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_mem_init(void) +{ + return; /*Nothing to init*/ +} + +void lv_mem_deinit(void) +{ + return; /*Nothing to deinit*/ + +} + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) +{ + /*Not supported*/ + LV_UNUSED(mem); + LV_UNUSED(bytes); + return NULL; +} + +void lv_mem_remove_pool(lv_mem_pool_t pool) +{ + /*Not supported*/ + LV_UNUSED(pool); + return; +} + +void * lv_malloc_core(size_t size) +{ +#if MICROPY_MALLOC_USES_ALLOCATED_SIZE + return gc_alloc(size, true); +#else + return m_malloc(size); +#endif +} + +void * lv_realloc_core(void * p, size_t new_size) +{ + +#if MICROPY_MALLOC_USES_ALLOCATED_SIZE + return gc_realloc(p, new_size, true); +#else + return m_realloc(p, new_size); +#endif +} + +void lv_free_core(void * p) +{ + +#if MICROPY_MALLOC_USES_ALLOCATED_SIZE + gc_free(p); + +#else + m_free(p); +#endif +} + +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) +{ + /*Not supported*/ + LV_UNUSED(mon_p); + return; +} + +lv_result_t lv_mem_test_core(void) +{ + /*Not supported*/ + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_MICROPYTHON*/ diff --git a/inc/lvgl/src/stdlib/rtthread/lv_mem_core_rtthread.c b/inc/lvgl/src/stdlib/rtthread/lv_mem_core_rtthread.c new file mode 100644 index 0000000..a52526b --- /dev/null +++ b/inc/lvgl/src/stdlib/rtthread/lv_mem_core_rtthread.c @@ -0,0 +1,98 @@ +/** + * @file lv_mem_core_rtthread.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_mem.h" +#if LV_USE_STDLIB_MALLOC == LV_STDLIB_RTTHREAD +#include "../../stdlib/lv_mem.h" +#include + +#ifndef RT_USING_HEAP + #error "lv_mem_core_rtthread: RT_USING_HEAP is required. Define it in rtconfig.h" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_mem_init(void) +{ + return; /*Nothing to init*/ +} + +void lv_mem_deinit(void) +{ + return; /*Nothing to deinit*/ +} + +lv_mem_pool_t lv_mem_add_pool(void * mem, size_t bytes) +{ + /*Not supported*/ + LV_UNUSED(mem); + LV_UNUSED(bytes); + return NULL; +} + +void lv_mem_remove_pool(lv_mem_pool_t pool) +{ + /*Not supported*/ + LV_UNUSED(pool); + return; +} + +void * lv_malloc_core(size_t size) +{ + return rt_malloc(size); +} + +void * lv_realloc_core(void * p, size_t new_size) +{ + return rt_realloc(p, new_size); +} + +void lv_free_core(void * p) +{ + rt_free(p); +} + +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) +{ + /*Not supported*/ + LV_UNUSED(mon_p); + return; +} + +lv_result_t lv_mem_test_core(void) +{ + /*Not supported*/ + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_RTTHREAD*/ diff --git a/inc/lvgl/src/stdlib/rtthread/lv_sprintf_rtthread.c b/inc/lvgl/src/stdlib/rtthread/lv_sprintf_rtthread.c new file mode 100644 index 0000000..721f4fd --- /dev/null +++ b/inc/lvgl/src/stdlib/rtthread/lv_sprintf_rtthread.c @@ -0,0 +1,61 @@ +/** + * @file lv_sprintf_rtthread.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_SPRINTF == LV_STDLIB_RTTHREAD +#include +#include +#include "../lv_sprintf.h" + +#if LV_USE_FLOAT == 1 + #warning "lv_sprintf_rtthread: rtthread not support float in sprintf" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +int lv_snprintf(char * buffer, size_t count, const char * format, ...) +{ + va_list va; + va_start(va, format); + const int ret = rt_vsnprintf(buffer, count, format, va); + va_end(va); + return ret; +} + +int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) +{ + return rt_vsnprintf(buffer, count, format, va); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_RTTHREAD*/ diff --git a/inc/lvgl/src/stdlib/rtthread/lv_string_rtthread.c b/inc/lvgl/src/stdlib/rtthread/lv_string_rtthread.c new file mode 100644 index 0000000..fd2ff2a --- /dev/null +++ b/inc/lvgl/src/stdlib/rtthread/lv_string_rtthread.c @@ -0,0 +1,162 @@ +/** + * @file lv_string_rtthread.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#if LV_USE_STDLIB_STRING == LV_STDLIB_RTTHREAD +#include "../lv_string.h" +#include "../lv_mem.h" /*Need lv_malloc*/ +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len) +{ + return rt_memcpy(dst, src, len); +} + +void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len) +{ + rt_memset(dst, v, len); +} + +void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len) +{ + return rt_memmove(dst, src, len); +} + +size_t lv_strlen(const char * str) +{ + return rt_strlen(str); +} + +size_t lv_strnlen(const char * str, size_t max_len) +{ + size_t i = 0; + while(i < max_len && str[i]) i++; + + return i; +} + +int lv_memcmp(const void * p1, const void * p2, size_t len) +{ + return rt_memcmp(p1, p2, len); +} + +size_t lv_strlcpy(char * dst, const char * src, size_t dst_size) +{ + size_t src_len = lv_strlen(src); + if(dst_size > 0) { + size_t copy_size = src_len < dst_size ? src_len : dst_size - 1; + lv_memcpy(dst, src, copy_size); + dst[copy_size] = '\0'; + } + return src_len; +} + +char * lv_strncpy(char * dst, const char * src, size_t dest_size) +{ + return rt_strncpy(dst, src, dest_size); +} + +char * lv_strcpy(char * dst, const char * src) +{ + return rt_strcpy(dst, src); +} + +int lv_strcmp(const char * s1, const char * s2) +{ + return rt_strcmp(s1, s2); +} + +int lv_strncmp(const char * s1, const char * s2, size_t len) +{ + return rt_strncmp(s1, s2, len); +} + +char * lv_strdup(const char * src) +{ + size_t len = lv_strlen(src) + 1; + char * dst = lv_malloc(len); + if(dst == NULL) return NULL; + + lv_memcpy(dst, src, len); /*memcpy is faster than strncpy when length is known*/ + return dst; +} + +char * lv_strndup(const char * src, size_t max_len) +{ + size_t len = lv_strnlen(src, max_len); + char * dst = lv_malloc(len + 1); + if(dst == NULL) return NULL; + + lv_memcpy(dst, src, len); + dst[len] = '\0'; + return dst; +} + +char * lv_strcat(char * dst, const char * src) +{ + /*Since RT-thread does not have rt_strcat, + the following code is used instead.*/ + lv_strcpy(dst + lv_strlen(dst), src); + return dst; +} + +char * lv_strncat(char * dst, const char * src, size_t src_len) +{ + char * tmp = dst; + dst += lv_strlen(dst); + while(src_len != 0 && *src != '\0') { + src_len--; + *dst++ = *src++; + } + *dst = '\0'; + return tmp; +} + +char * lv_strchr(const char * s, int c) +{ + for(; ; s++) { + if(*s == c) { + return (char *)s; + } + + if(*s == '\0') { + break; + } + } + + return NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_STDLIB_RTTHREAD*/ diff --git a/inc/lvgl/src/stdlib/uefi/lv_mem_core_uefi.c b/inc/lvgl/src/stdlib/uefi/lv_mem_core_uefi.c new file mode 100644 index 0000000..619c2ed --- /dev/null +++ b/inc/lvgl/src/stdlib/uefi/lv_mem_core_uefi.c @@ -0,0 +1,116 @@ +/** + * @file lv_mem_core_uefi.c + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_mem.h" +#if LV_USE_UEFI +#if LV_UEFI_USE_MEMORY_SERVICES && LV_USE_STDLIB_MALLOC == LV_STDLIB_CUSTOM +#include "../drivers/uefi/lv_uefi_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +typedef struct _mem_header_t { + size_t size; + uint8_t data[0]; +} mem_header_t; + +void lv_mem_init(void) +{ + LV_ASSERT_NULL(gLvEfiBS); + + return; /*Nothing to init*/ +} + +void lv_mem_deinit(void) +{ + return; /*Nothing to deinit*/ +} + +void * lv_malloc_core(size_t size) +{ + size_t size_with_header = size + sizeof(mem_header_t); + mem_header_t * ptr = NULL; + + if(gLvEfiBS->AllocatePool(EfiBootServicesData, size_with_header, (void **)&ptr) != EFI_SUCCESS) return NULL; + + ptr->size = size; + + return ptr->data; +} + +void * lv_realloc_core(void * p, size_t new_size) +{ + mem_header_t * p_header = NULL; + uintptr_t p_address = (uintptr_t)p; + void * p_new = NULL; + + if(p == NULL) return lv_malloc_core(new_size); + // Check for invalid pointers + if(p_address < sizeof(mem_header_t)) return NULL; + + p_address -= sizeof(mem_header_t); + p_header = (mem_header_t *) p_address; + + // UEFI supports no realloc, if the size grows a new memory block has to be allocated + if(p_header->size > new_size) return p; + + p_new = lv_malloc_core(new_size); + lv_memcpy(p_new, p, p_header->size); + lv_free_core(p); + + return p_new; +} + +void lv_free_core(void * p) +{ + uintptr_t p_address = (uintptr_t)p; + if(p_address < sizeof(mem_header_t)) return; + + p_address -= sizeof(mem_header_t); + + gLvEfiBS->FreePool((void *)p_address); +} + +void lv_mem_monitor_core(lv_mem_monitor_t * mon_p) +{ + /*Not supported*/ + LV_UNUSED(mon_p); + return; +} + +lv_result_t lv_mem_test_core(void) +{ + /*Not supported*/ + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif +#endif diff --git a/inc/lvgl/src/themes/default/lv_theme_default.c b/inc/lvgl/src/themes/default/lv_theme_default.c new file mode 100644 index 0000000..4ffb30b --- /dev/null +++ b/inc/lvgl/src/themes/default/lv_theme_default.c @@ -0,0 +1,1243 @@ +/** + * @file lv_theme_default.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../../lvgl.h" /*To see all the widgets*/ + +#if LV_USE_THEME_DEFAULT + +#include "../lv_theme_private.h" +#include "../../misc/lv_color.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +struct _my_theme_t; +typedef struct _my_theme_t my_theme_t; + +#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_default)) + +#define MODE_DARK 1 +#define RADIUS_DEFAULT LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 12 : 8) + +/*SCREEN*/ +#define LIGHT_COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) +#define LIGHT_COLOR_CARD lv_color_white() +#define LIGHT_COLOR_TEXT lv_palette_darken(LV_PALETTE_GREY, 4) +#define LIGHT_COLOR_GREY lv_palette_lighten(LV_PALETTE_GREY, 2) +#define DARK_COLOR_SCR lv_color_hex(0x15171A) +#define DARK_COLOR_CARD lv_color_hex(0x282b30) +#define DARK_COLOR_TEXT lv_palette_lighten(LV_PALETTE_GREY, 5) +#define DARK_COLOR_GREY lv_color_hex(0x2f3237) + +#define TRANSITION_TIME LV_THEME_DEFAULT_TRANSITION_TIME +#define BORDER_WIDTH LV_DPX_CALC(theme->disp_dpi, 2) +#define OUTLINE_WIDTH LV_DPX_CALC(theme->disp_dpi, 3) + +#define PAD_DEF LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 24 : theme->disp_size == DISP_MEDIUM ? 20 : 16) +#define PAD_SMALL LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 14 : theme->disp_size == DISP_MEDIUM ? 12 : 10) +#define PAD_TINY LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 8 : theme->disp_size == DISP_MEDIUM ? 6 : 2) + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t scrollbar; + lv_style_t scrollbar_scrolled; + lv_style_t card; + lv_style_t btn; + + /*Utility*/ + lv_style_t bg_color_primary; + lv_style_t bg_color_primary_muted; + lv_style_t bg_color_secondary; + lv_style_t bg_color_secondary_muted; + lv_style_t bg_color_grey; + lv_style_t bg_color_white; + lv_style_t pressed; + lv_style_t disabled; + lv_style_t pad_zero; + lv_style_t pad_tiny; + lv_style_t pad_small; + lv_style_t pad_normal; + lv_style_t pad_gap; + lv_style_t line_space_large; + lv_style_t text_align_center; + lv_style_t outline_primary; + lv_style_t outline_secondary; + lv_style_t circle; + lv_style_t no_radius; + lv_style_t clip_corner; + lv_style_t rotary_scroll; +#if LV_THEME_DEFAULT_GROW + lv_style_t grow; +#endif + lv_style_t transition_delayed; + lv_style_t transition_normal; + lv_style_t anim; + lv_style_t anim_fast; + + /*Parts*/ + lv_style_t knob; + +#if LV_USE_ARC + lv_style_t arc_indic; + lv_style_t arc_indic_primary; +#endif + +#if LV_USE_CHART + lv_style_t chart_series, chart_indic, chart_bg; +#endif + +#if LV_USE_DROPDOWN + lv_style_t dropdown_list; +#endif + +#if LV_USE_CHECKBOX + lv_style_t cb_marker, cb_marker_checked; +#endif + +#if LV_USE_SWITCH + lv_style_t switch_knob; +#endif + +#if LV_USE_LINE + lv_style_t line; +#endif + +#if LV_USE_TABLE + lv_style_t table_cell; +#endif + +#if LV_USE_TEXTAREA + lv_style_t ta_cursor, ta_placeholder; +#endif + +#if LV_USE_CALENDAR + lv_style_t calendar_btnm_bg, calendar_btnm_day, calendar_header; +#endif + +#if LV_USE_MENU + lv_style_t menu_bg, menu_cont, menu_sidebar_cont, menu_main_cont, menu_page, menu_header_cont, menu_header_btn, + menu_section, menu_pressed, menu_separator; +#endif + +#if LV_USE_MSGBOX + lv_style_t msgbox_backdrop_bg; +#endif + +#if LV_USE_KEYBOARD + lv_style_t keyboard_button_bg; +#endif + +#if LV_USE_LIST + lv_style_t list_bg, list_btn, list_item_grow; +#endif + +#if LV_USE_TABVIEW + lv_style_t tab_bg_focus, tab_btn; +#endif +#if LV_USE_LED + lv_style_t led; +#endif + +#if LV_USE_SCALE + lv_style_t scale; +#endif +} my_theme_styles_t; + +typedef enum { + DISP_SMALL = 3, + DISP_MEDIUM = 2, + DISP_LARGE = 1, +} disp_size_t; + +struct _my_theme_t { + lv_theme_t base; + disp_size_t disp_size; + int32_t disp_dpi; + lv_color_t color_scr; + lv_color_t color_text; + lv_color_t color_card; + lv_color_t color_grey; + bool inited; + my_theme_styles_t styles; + +#if LV_THEME_DEFAULT_TRANSITION_TIME + lv_style_transition_dsc_t trans_delayed; + lv_style_transition_dsc_t trans_normal; +#endif +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void style_init_reset(lv_style_t * style); +static void theme_apply(lv_theme_t * th, lv_obj_t * obj); +static void resolution_change_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init(my_theme_t * theme) +{ +#if TRANSITION_TIME + static const lv_style_prop_t trans_props[] = { + LV_STYLE_BG_OPA, LV_STYLE_BG_COLOR, + LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, + LV_STYLE_TRANSLATE_Y, LV_STYLE_TRANSLATE_X, + LV_STYLE_TRANSFORM_ROTATION, + LV_STYLE_TRANSFORM_SCALE_X, LV_STYLE_TRANSFORM_SCALE_Y, + LV_STYLE_RECOLOR_OPA, LV_STYLE_RECOLOR, + 0 + }; +#endif + + theme->color_scr = theme->base.flags & MODE_DARK ? DARK_COLOR_SCR : LIGHT_COLOR_SCR; + theme->color_text = theme->base.flags & MODE_DARK ? DARK_COLOR_TEXT : LIGHT_COLOR_TEXT; + theme->color_card = theme->base.flags & MODE_DARK ? DARK_COLOR_CARD : LIGHT_COLOR_CARD; + theme->color_grey = theme->base.flags & MODE_DARK ? DARK_COLOR_GREY : LIGHT_COLOR_GREY; + + style_init_reset(&theme->styles.transition_delayed); + style_init_reset(&theme->styles.transition_normal); +#if TRANSITION_TIME + lv_style_transition_dsc_init(&theme->trans_delayed, trans_props, lv_anim_path_linear, TRANSITION_TIME, 70, NULL); + lv_style_transition_dsc_init(&theme->trans_normal, trans_props, lv_anim_path_linear, TRANSITION_TIME, 0, NULL); + + lv_style_set_transition(&theme->styles.transition_delayed, + &theme->trans_delayed); /*Go back to default state with delay*/ + + lv_style_set_transition(&theme->styles.transition_normal, &theme->trans_normal); /*Go back to default state with delay*/ +#endif + + style_init_reset(&theme->styles.scrollbar); + lv_color_t sb_color = (theme->base.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY, + 2) : lv_palette_main(LV_PALETTE_GREY); + lv_style_set_bg_color(&theme->styles.scrollbar, sb_color); + + lv_style_set_radius(&theme->styles.scrollbar, LV_RADIUS_CIRCLE); + lv_style_set_pad_all(&theme->styles.scrollbar, LV_DPX_CALC(theme->disp_dpi, 7)); + lv_style_set_width(&theme->styles.scrollbar, LV_DPX_CALC(theme->disp_dpi, 5)); + lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_40); +#if TRANSITION_TIME + lv_style_set_transition(&theme->styles.scrollbar, &theme->trans_normal); +#endif + + style_init_reset(&theme->styles.scrollbar_scrolled); + lv_style_set_bg_opa(&theme->styles.scrollbar_scrolled, LV_OPA_COVER); + + style_init_reset(&theme->styles.scr); + lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scr, theme->color_scr); + lv_style_set_text_color(&theme->styles.scr, theme->color_text); + lv_style_set_text_font(&theme->styles.scr, theme->base.font_normal); + lv_style_set_pad_row(&theme->styles.scr, PAD_SMALL); + lv_style_set_pad_column(&theme->styles.scr, PAD_SMALL); + lv_style_set_rotary_sensitivity(&theme->styles.scr, theme->disp_dpi / 4 * 256); + + style_init_reset(&theme->styles.card); + lv_style_set_radius(&theme->styles.card, RADIUS_DEFAULT); + lv_style_set_bg_opa(&theme->styles.card, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.card, theme->color_card); + lv_style_set_border_color(&theme->styles.card, theme->color_grey); + lv_style_set_border_width(&theme->styles.card, BORDER_WIDTH); + lv_style_set_border_post(&theme->styles.card, true); + lv_style_set_text_color(&theme->styles.card, theme->color_text); + lv_style_set_pad_all(&theme->styles.card, PAD_DEF); + lv_style_set_pad_row(&theme->styles.card, PAD_SMALL); + lv_style_set_pad_column(&theme->styles.card, PAD_SMALL); + lv_style_set_line_color(&theme->styles.card, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_line_width(&theme->styles.card, LV_DPX_CALC(theme->disp_dpi, 1)); + + style_init_reset(&theme->styles.outline_primary); + lv_style_set_outline_color(&theme->styles.outline_primary, theme->base.color_primary); + lv_style_set_outline_width(&theme->styles.outline_primary, OUTLINE_WIDTH); + lv_style_set_outline_pad(&theme->styles.outline_primary, OUTLINE_WIDTH); + lv_style_set_outline_opa(&theme->styles.outline_primary, LV_OPA_50); + + style_init_reset(&theme->styles.outline_secondary); + lv_style_set_outline_color(&theme->styles.outline_secondary, theme->base.color_secondary); + lv_style_set_outline_width(&theme->styles.outline_secondary, OUTLINE_WIDTH); + lv_style_set_outline_opa(&theme->styles.outline_secondary, LV_OPA_50); + + style_init_reset(&theme->styles.btn); + lv_style_set_radius(&theme->styles.btn, + LV_DPX_CALC(theme->disp_dpi, theme->disp_size == DISP_LARGE ? 16 : theme->disp_size == DISP_MEDIUM ? 12 : 8)); + lv_style_set_bg_opa(&theme->styles.btn, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.btn, theme->color_grey); + if(!(theme->base.flags & MODE_DARK)) { + lv_style_set_shadow_color(&theme->styles.btn, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_shadow_width(&theme->styles.btn, LV_DPX(3)); + lv_style_set_shadow_opa(&theme->styles.btn, LV_OPA_50); + lv_style_set_shadow_offset_y(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, LV_DPX(4))); + } + lv_style_set_text_color(&theme->styles.btn, theme->color_text); + lv_style_set_pad_hor(&theme->styles.btn, PAD_DEF); + lv_style_set_pad_ver(&theme->styles.btn, PAD_SMALL); + lv_style_set_pad_column(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, 5)); + lv_style_set_pad_row(&theme->styles.btn, LV_DPX_CALC(theme->disp_dpi, 5)); + + style_init_reset(&theme->styles.pressed); + lv_style_set_recolor(&theme->styles.pressed, lv_color_black()); + lv_style_set_recolor_opa(&theme->styles.pressed, 35); + + style_init_reset(&theme->styles.disabled); + if(theme_def->base.flags & MODE_DARK) + lv_style_set_recolor(&theme->styles.disabled, lv_palette_darken(LV_PALETTE_GREY, 2)); + else + lv_style_set_recolor(&theme->styles.disabled, lv_palette_lighten(LV_PALETTE_GREY, 2)); + lv_style_set_recolor_opa(&theme->styles.disabled, LV_OPA_50); + + style_init_reset(&theme->styles.clip_corner); + lv_style_set_clip_corner(&theme->styles.clip_corner, true); + lv_style_set_border_post(&theme->styles.clip_corner, true); + + style_init_reset(&theme->styles.pad_normal); + lv_style_set_pad_all(&theme->styles.pad_normal, PAD_DEF); + lv_style_set_pad_row(&theme->styles.pad_normal, PAD_DEF); + lv_style_set_pad_column(&theme->styles.pad_normal, PAD_DEF); + + style_init_reset(&theme->styles.pad_small); + lv_style_set_pad_all(&theme->styles.pad_small, PAD_SMALL); + lv_style_set_pad_gap(&theme->styles.pad_small, PAD_SMALL); + + style_init_reset(&theme->styles.pad_gap); + lv_style_set_pad_row(&theme->styles.pad_gap, LV_DPX_CALC(theme->disp_dpi, 10)); + lv_style_set_pad_column(&theme->styles.pad_gap, LV_DPX_CALC(theme->disp_dpi, 10)); + + style_init_reset(&theme->styles.line_space_large); + lv_style_set_text_line_space(&theme->styles.line_space_large, LV_DPX_CALC(theme->disp_dpi, 20)); + + style_init_reset(&theme->styles.text_align_center); + lv_style_set_text_align(&theme->styles.text_align_center, LV_TEXT_ALIGN_CENTER); + + style_init_reset(&theme->styles.pad_zero); + lv_style_set_pad_all(&theme->styles.pad_zero, 0); + lv_style_set_pad_row(&theme->styles.pad_zero, 0); + lv_style_set_pad_column(&theme->styles.pad_zero, 0); + + style_init_reset(&theme->styles.pad_tiny); + lv_style_set_pad_all(&theme->styles.pad_tiny, PAD_TINY); + lv_style_set_pad_row(&theme->styles.pad_tiny, PAD_TINY); + lv_style_set_pad_column(&theme->styles.pad_tiny, PAD_TINY); + + style_init_reset(&theme->styles.bg_color_primary); + lv_style_set_bg_color(&theme->styles.bg_color_primary, theme->base.color_primary); + lv_style_set_text_color(&theme->styles.bg_color_primary, lv_color_white()); + lv_style_set_bg_opa(&theme->styles.bg_color_primary, LV_OPA_COVER); + + style_init_reset(&theme->styles.bg_color_primary_muted); + lv_style_set_bg_color(&theme->styles.bg_color_primary_muted, theme->base.color_primary); + lv_style_set_text_color(&theme->styles.bg_color_primary_muted, theme->base.color_primary); + lv_style_set_bg_opa(&theme->styles.bg_color_primary_muted, LV_OPA_20); + + style_init_reset(&theme->styles.bg_color_secondary); + lv_style_set_bg_color(&theme->styles.bg_color_secondary, theme->base.color_secondary); + lv_style_set_text_color(&theme->styles.bg_color_secondary, lv_color_white()); + lv_style_set_bg_opa(&theme->styles.bg_color_secondary, LV_OPA_COVER); + + style_init_reset(&theme->styles.bg_color_secondary_muted); + lv_style_set_bg_color(&theme->styles.bg_color_secondary_muted, theme->base.color_secondary); + lv_style_set_text_color(&theme->styles.bg_color_secondary_muted, theme->base.color_secondary); + lv_style_set_bg_opa(&theme->styles.bg_color_secondary_muted, LV_OPA_20); + + style_init_reset(&theme->styles.bg_color_grey); + lv_style_set_bg_color(&theme->styles.bg_color_grey, theme->color_grey); + lv_style_set_bg_opa(&theme->styles.bg_color_grey, LV_OPA_COVER); + lv_style_set_text_color(&theme->styles.bg_color_grey, theme->color_text); + + style_init_reset(&theme->styles.bg_color_white); + lv_style_set_bg_color(&theme->styles.bg_color_white, theme->color_card); + lv_style_set_bg_opa(&theme->styles.bg_color_white, LV_OPA_COVER); + lv_style_set_text_color(&theme->styles.bg_color_white, theme->color_text); + + style_init_reset(&theme->styles.circle); + lv_style_set_radius(&theme->styles.circle, LV_RADIUS_CIRCLE); + + style_init_reset(&theme->styles.no_radius); + lv_style_set_radius(&theme->styles.no_radius, 0); + + style_init_reset(&theme->styles.rotary_scroll); + lv_style_set_rotary_sensitivity(&theme->styles.rotary_scroll, theme->disp_dpi / 4 * 256); + +#if LV_THEME_DEFAULT_GROW + style_init_reset(&theme->styles.grow); + lv_style_set_transform_width(&theme->styles.grow, LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_transform_height(&theme->styles.grow, LV_DPX_CALC(theme->disp_dpi, 3)); +#endif + + style_init_reset(&theme->styles.knob); + lv_style_set_bg_color(&theme->styles.knob, theme->base.color_primary); + lv_style_set_bg_opa(&theme->styles.knob, LV_OPA_COVER); + lv_style_set_pad_all(&theme->styles.knob, LV_DPX_CALC(theme->disp_dpi, 6)); + lv_style_set_radius(&theme->styles.knob, LV_RADIUS_CIRCLE); + + style_init_reset(&theme->styles.anim); + lv_style_set_anim_duration(&theme->styles.anim, 200); + + style_init_reset(&theme->styles.anim_fast); + lv_style_set_anim_duration(&theme->styles.anim_fast, 120); + +#if LV_USE_ARC + style_init_reset(&theme->styles.arc_indic); + lv_style_set_arc_color(&theme->styles.arc_indic, theme->color_grey); + lv_style_set_arc_width(&theme->styles.arc_indic, LV_DPX_CALC(theme->disp_dpi, 15)); + lv_style_set_arc_rounded(&theme->styles.arc_indic, true); + + style_init_reset(&theme->styles.arc_indic_primary); + lv_style_set_arc_color(&theme->styles.arc_indic_primary, theme->base.color_primary); +#endif + +#if LV_USE_DROPDOWN + style_init_reset(&theme->styles.dropdown_list); + lv_style_set_max_height(&theme->styles.dropdown_list, LV_DPI_DEF * 2); +#endif +#if LV_USE_CHECKBOX + style_init_reset(&theme->styles.cb_marker); + lv_style_set_pad_all(&theme->styles.cb_marker, LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_border_width(&theme->styles.cb_marker, BORDER_WIDTH); + lv_style_set_border_color(&theme->styles.cb_marker, theme->base.color_primary); + lv_style_set_bg_color(&theme->styles.cb_marker, theme->color_card); + lv_style_set_bg_opa(&theme->styles.cb_marker, LV_OPA_COVER); + lv_style_set_radius(&theme->styles.cb_marker, RADIUS_DEFAULT / 2); + lv_style_set_text_font(&theme->styles.cb_marker, theme->base.font_small); + lv_style_set_text_color(&theme->styles.cb_marker, lv_color_white()); + + style_init_reset(&theme->styles.cb_marker_checked); + lv_style_set_bg_image_src(&theme->styles.cb_marker_checked, LV_SYMBOL_OK); +#endif + +#if LV_USE_SWITCH + style_init_reset(&theme->styles.switch_knob); + lv_style_set_pad_all(&theme->styles.switch_knob, - LV_DPX_CALC(theme->disp_dpi, 4)); + lv_style_set_bg_color(&theme->styles.switch_knob, lv_color_white()); +#endif + +#if LV_USE_LINE + style_init_reset(&theme->styles.line); + lv_style_set_line_width(&theme->styles.line, 1); + lv_style_set_line_color(&theme->styles.line, theme->color_text); +#endif + +#if LV_USE_CHART + style_init_reset(&theme->styles.chart_bg); + lv_style_set_border_post(&theme->styles.chart_bg, false); + lv_style_set_pad_column(&theme->styles.chart_bg, LV_DPX_CALC(theme->disp_dpi, 10)); + lv_style_set_line_color(&theme->styles.chart_bg, theme->color_grey); + + style_init_reset(&theme->styles.chart_series); + lv_style_set_line_width(&theme->styles.chart_series, LV_DPX_CALC(theme->disp_dpi, 3)); + lv_style_set_radius(&theme->styles.chart_series, LV_DPX_CALC(theme->disp_dpi, 3)); + + int32_t chart_size = LV_DPX_CALC(theme->disp_dpi, 8); + lv_style_set_size(&theme->styles.chart_series, chart_size, chart_size); + lv_style_set_pad_column(&theme->styles.chart_series, LV_DPX_CALC(theme->disp_dpi, 2)); + + style_init_reset(&theme->styles.chart_indic); + lv_style_set_radius(&theme->styles.chart_indic, LV_RADIUS_CIRCLE); + lv_style_set_size(&theme->styles.chart_indic, chart_size, chart_size); + lv_style_set_bg_color(&theme->styles.chart_indic, theme->base.color_primary); + lv_style_set_bg_opa(&theme->styles.chart_indic, LV_OPA_COVER); +#endif + +#if LV_USE_MENU + style_init_reset(&theme->styles.menu_bg); + lv_style_set_pad_all(&theme->styles.menu_bg, 0); + lv_style_set_pad_gap(&theme->styles.menu_bg, 0); + lv_style_set_radius(&theme->styles.menu_bg, 0); + lv_style_set_clip_corner(&theme->styles.menu_bg, true); + lv_style_set_border_side(&theme->styles.menu_bg, LV_BORDER_SIDE_NONE); + + style_init_reset(&theme->styles.menu_section); + lv_style_set_radius(&theme->styles.menu_section, RADIUS_DEFAULT); + lv_style_set_clip_corner(&theme->styles.menu_section, true); + lv_style_set_bg_opa(&theme->styles.menu_section, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.menu_section, theme->color_card); + lv_style_set_text_color(&theme->styles.menu_section, theme->color_text); + + style_init_reset(&theme->styles.menu_cont); + lv_style_set_pad_hor(&theme->styles.menu_cont, PAD_SMALL); + lv_style_set_pad_ver(&theme->styles.menu_cont, PAD_SMALL); + lv_style_set_pad_gap(&theme->styles.menu_cont, PAD_SMALL); + lv_style_set_border_width(&theme->styles.menu_cont, LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_opa(&theme->styles.menu_cont, LV_OPA_10); + lv_style_set_border_color(&theme->styles.menu_cont, theme->color_text); + lv_style_set_border_side(&theme->styles.menu_cont, LV_BORDER_SIDE_NONE); + + style_init_reset(&theme->styles.menu_sidebar_cont); + lv_style_set_pad_all(&theme->styles.menu_sidebar_cont, 0); + lv_style_set_pad_gap(&theme->styles.menu_sidebar_cont, 0); + lv_style_set_border_width(&theme->styles.menu_sidebar_cont, LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_opa(&theme->styles.menu_sidebar_cont, LV_OPA_10); + lv_style_set_border_color(&theme->styles.menu_sidebar_cont, theme->color_text); + lv_style_set_border_side(&theme->styles.menu_sidebar_cont, LV_BORDER_SIDE_RIGHT); + + style_init_reset(&theme->styles.menu_main_cont); + lv_style_set_pad_all(&theme->styles.menu_main_cont, 0); + lv_style_set_pad_gap(&theme->styles.menu_main_cont, 0); + + style_init_reset(&theme->styles.menu_header_cont); + lv_style_set_pad_hor(&theme->styles.menu_header_cont, PAD_SMALL); + lv_style_set_pad_ver(&theme->styles.menu_header_cont, PAD_TINY); + lv_style_set_pad_gap(&theme->styles.menu_header_cont, PAD_SMALL); + + style_init_reset(&theme->styles.menu_header_btn); + lv_style_set_pad_hor(&theme->styles.menu_header_btn, PAD_TINY); + lv_style_set_pad_ver(&theme->styles.menu_header_btn, PAD_TINY); + lv_style_set_shadow_opa(&theme->styles.menu_header_btn, LV_OPA_TRANSP); + lv_style_set_bg_opa(&theme->styles.menu_header_btn, LV_OPA_TRANSP); + lv_style_set_text_color(&theme->styles.menu_header_btn, theme->color_text); + + style_init_reset(&theme->styles.menu_page); + lv_style_set_pad_hor(&theme->styles.menu_page, 0); + lv_style_set_pad_gap(&theme->styles.menu_page, 0); + + style_init_reset(&theme->styles.menu_pressed); + lv_style_set_bg_opa(&theme->styles.menu_pressed, LV_OPA_20); + lv_style_set_bg_color(&theme->styles.menu_pressed, lv_palette_main(LV_PALETTE_GREY)); + + style_init_reset(&theme->styles.menu_separator); + lv_style_set_bg_opa(&theme->styles.menu_separator, LV_OPA_TRANSP); + lv_style_set_pad_ver(&theme->styles.menu_separator, PAD_TINY); +#endif + +#if LV_USE_TABLE + style_init_reset(&theme->styles.table_cell); + lv_style_set_border_width(&theme->styles.table_cell, LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_color(&theme->styles.table_cell, theme->color_grey); + lv_style_set_border_side(&theme->styles.table_cell, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM); +#endif + +#if LV_USE_TEXTAREA + style_init_reset(&theme->styles.ta_cursor); + lv_style_set_border_color(&theme->styles.ta_cursor, theme->color_text); + lv_style_set_border_width(&theme->styles.ta_cursor, LV_DPX_CALC(theme->disp_dpi, 2)); + lv_style_set_pad_left(&theme->styles.ta_cursor, - LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); + lv_style_set_anim_duration(&theme->styles.ta_cursor, 400); + + style_init_reset(&theme->styles.ta_placeholder); + lv_style_set_text_color(&theme->styles.ta_placeholder, + (theme->base.flags & MODE_DARK) ? lv_palette_darken(LV_PALETTE_GREY, + 2) : lv_palette_lighten(LV_PALETTE_GREY, 1)); +#endif + +#if LV_USE_CALENDAR + style_init_reset(&theme->styles.calendar_btnm_bg); + lv_style_set_pad_all(&theme->styles.calendar_btnm_bg, PAD_SMALL); + lv_style_set_pad_gap(&theme->styles.calendar_btnm_bg, PAD_SMALL / 2); + + style_init_reset(&theme->styles.calendar_btnm_day); + lv_style_set_border_width(&theme->styles.calendar_btnm_day, LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_color(&theme->styles.calendar_btnm_day, theme->color_grey); + lv_style_set_bg_color(&theme->styles.calendar_btnm_day, theme->color_card); + lv_style_set_bg_opa(&theme->styles.calendar_btnm_day, LV_OPA_20); + + style_init_reset(&theme->styles.calendar_header); + lv_style_set_pad_hor(&theme->styles.calendar_header, PAD_SMALL); + lv_style_set_pad_top(&theme->styles.calendar_header, PAD_SMALL); + lv_style_set_pad_bottom(&theme->styles.calendar_header, PAD_TINY); + lv_style_set_pad_gap(&theme->styles.calendar_header, PAD_SMALL); +#endif + +#if LV_USE_MSGBOX + style_init_reset(&theme->styles.msgbox_backdrop_bg); + lv_style_set_bg_color(&theme->styles.msgbox_backdrop_bg, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_bg_opa(&theme->styles.msgbox_backdrop_bg, LV_OPA_50); +#endif +#if LV_USE_KEYBOARD + style_init_reset(&theme->styles.keyboard_button_bg); + lv_style_set_shadow_width(&theme->styles.keyboard_button_bg, 0); + lv_style_set_radius(&theme->styles.keyboard_button_bg, + theme->disp_size == DISP_SMALL ? RADIUS_DEFAULT / 2 : RADIUS_DEFAULT); +#endif + +#if LV_USE_TABVIEW + style_init_reset(&theme->styles.tab_btn); + lv_style_set_border_color(&theme->styles.tab_btn, theme->base.color_primary); + lv_style_set_border_width(&theme->styles.tab_btn, BORDER_WIDTH * 2); + lv_style_set_border_side(&theme->styles.tab_btn, LV_BORDER_SIDE_BOTTOM); + lv_style_set_pad_top(&theme->styles.tab_btn, BORDER_WIDTH * 2); + + style_init_reset(&theme->styles.tab_bg_focus); + lv_style_set_outline_pad(&theme->styles.tab_bg_focus, -BORDER_WIDTH); +#endif + +#if LV_USE_LIST + style_init_reset(&theme->styles.list_bg); + lv_style_set_pad_hor(&theme->styles.list_bg, PAD_DEF); + lv_style_set_pad_ver(&theme->styles.list_bg, 0); + lv_style_set_pad_gap(&theme->styles.list_bg, 0); + lv_style_set_clip_corner(&theme->styles.list_bg, true); + + style_init_reset(&theme->styles.list_btn); + lv_style_set_border_width(&theme->styles.list_btn, LV_DPX_CALC(theme->disp_dpi, 1)); + lv_style_set_border_color(&theme->styles.list_btn, theme->color_grey); + lv_style_set_border_side(&theme->styles.list_btn, LV_BORDER_SIDE_BOTTOM); + lv_style_set_pad_all(&theme->styles.list_btn, PAD_SMALL); + lv_style_set_pad_column(&theme->styles.list_btn, PAD_SMALL); + + style_init_reset(&theme->styles.list_item_grow); + lv_style_set_transform_width(&theme->styles.list_item_grow, PAD_DEF); +#endif + +#if LV_USE_LED + style_init_reset(&theme->styles.led); + lv_style_set_bg_opa(&theme->styles.led, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.led, lv_color_white()); + lv_style_set_bg_grad_color(&theme->styles.led, lv_palette_main(LV_PALETTE_GREY)); + lv_style_set_radius(&theme->styles.led, LV_RADIUS_CIRCLE); + lv_style_set_shadow_width(&theme->styles.led, LV_DPX_CALC(theme->disp_dpi, 15)); + lv_style_set_shadow_color(&theme->styles.led, lv_color_white()); + lv_style_set_shadow_spread(&theme->styles.led, LV_DPX_CALC(theme->disp_dpi, 5)); +#endif + +#if LV_USE_SCALE + style_init_reset(&theme->styles.scale); + lv_style_set_line_color(&theme->styles.scale, theme->color_text); + lv_style_set_line_width(&theme->styles.scale, LV_DPX(2)); + lv_style_set_arc_color(&theme->styles.scale, theme->color_text); + lv_style_set_arc_width(&theme->styles.scale, LV_DPX(2)); + lv_style_set_length(&theme->styles.scale, LV_DPX(6)); +#endif +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_theme_t * lv_theme_default_init(lv_display_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, + const lv_font_t * font) +{ + /*This trick is required only to avoid the garbage collection of + *styles' data if LVGL is used in a binding (e.g. MicroPython) + *In a general case styles could be in a simple `static lv_style_t my_style...` variables*/ + + if(!lv_theme_default_is_inited()) { + theme_def = lv_malloc_zeroed(sizeof(my_theme_t)); + LV_ASSERT_MALLOC(theme_def); + } + + my_theme_t * theme = theme_def; + + lv_display_t * new_disp = disp == NULL ? lv_display_get_default() : disp; + int32_t new_dpi = lv_display_get_dpi(new_disp); + int32_t hor_res = lv_display_get_horizontal_resolution(new_disp); + int32_t ver_res = lv_display_get_vertical_resolution(new_disp); + int32_t greater_res = LV_MAX(hor_res, ver_res); + disp_size_t new_size; + + if(greater_res <= 320) new_size = DISP_SMALL; + else if(greater_res < 720) new_size = DISP_MEDIUM; + else new_size = DISP_LARGE; + + /* check theme information whether will change or not*/ + if(theme->inited && theme->disp_dpi == new_dpi && + theme->disp_size == new_size && + lv_color_eq(theme->base.color_primary, color_primary) && + lv_color_eq(theme->base.color_secondary, color_secondary) && + (theme->base.flags == (dark ? MODE_DARK : 0)) && + theme->base.font_small == font) { + return (lv_theme_t *) theme; + } + + theme->disp_size = new_size; + theme->disp_dpi = new_dpi; + theme->base.disp = new_disp; + theme->base.color_primary = color_primary; + theme->base.color_secondary = color_secondary; + theme->base.font_small = font; + theme->base.font_normal = font; + theme->base.font_large = font; + theme->base.apply_cb = theme_apply; + theme->base.flags = dark ? MODE_DARK : 0; +#if LV_USE_EXT_DATA + theme->base.ext_data.free_cb = NULL; + theme->base.ext_data.data = NULL; +#endif + + style_init(theme); + + if(disp == NULL || lv_display_get_theme(disp) == (lv_theme_t *)theme) { + lv_obj_report_style_change(NULL); + } + + theme->inited = true; + + /*Re-initialize the styles if the resolution changes as a different display size might + *result in different paddings */ + lv_display_remove_event_cb_with_user_data(new_disp, resolution_change_event_cb, theme); + lv_display_add_event_cb(new_disp, resolution_change_event_cb, LV_EVENT_RESOLUTION_CHANGED, theme); + + return (lv_theme_t *) theme; +} + +bool lv_theme_default_is_inited(void) +{ + my_theme_t * theme = theme_def; + if(theme == NULL) return false; + return theme->inited; +} + +lv_theme_t * lv_theme_default_get(void) +{ + if(!lv_theme_default_is_inited()) { + return NULL; + } + + return (lv_theme_t *)theme_def; +} + +void lv_theme_default_deinit(void) +{ + my_theme_t * theme = theme_def; + if(theme) { + if(theme->inited) { + lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles)); + uint32_t i; + for(i = 0; i < sizeof(my_theme_styles_t) / sizeof(lv_style_t); i++) { + lv_style_reset(theme_styles + i); + } + } +#if LV_USE_EXT_DATA + if(theme->base.ext_data.free_cb) { + theme->base.ext_data.free_cb(theme->base.ext_data.data); + theme->base.ext_data.data = NULL; + } +#endif + lv_free(theme_def); + theme_def = NULL; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj) +{ + LV_UNUSED(th); + + my_theme_t * theme = theme_def; + lv_obj_t * parent = lv_obj_get_parent(obj); + + if(parent == NULL) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } + + if(lv_obj_check_type(obj, &lv_obj_class)) { +#if LV_USE_TABVIEW + /*Tabview content area*/ + if(lv_obj_check_type(parent, &lv_tabview_class) && lv_obj_get_child(parent, 1) == obj) { + return; + } + /*Tabview button container*/ + else if(lv_obj_check_type(parent, &lv_tabview_class) && lv_obj_get_child(parent, 0) == obj) { + lv_obj_add_style(obj, &theme->styles.bg_color_white, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.tab_bg_focus, LV_STATE_FOCUS_KEY); + return; + } + /*Tabview pages*/ + else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.pad_normal, 0); + lv_obj_add_style(obj, &theme->styles.rotary_scroll, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } +#endif + +#if LV_USE_WIN + /*Header*/ + if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 0) == obj) { + lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); + lv_obj_add_style(obj, &theme->styles.pad_tiny, 0); + return; + } + /*Content*/ + else if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 1) == obj) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.pad_normal, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } +#endif + +#if LV_USE_CALENDAR + if(lv_obj_check_type(parent, &lv_calendar_class)) { + /*No style*/ + return; + } +#endif + + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } +#if LV_USE_BUTTON + else if(lv_obj_check_type(obj, &lv_button_class)) { + +#if LV_USE_TABVIEW + lv_obj_t * tv = lv_obj_get_parent(parent); /*parent is the tabview header*/ + if(tv && lv_obj_get_child(tv, 0) == parent) { /*The button is on the tab view header*/ + if(lv_obj_check_type(tv, &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.tab_btn, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.tab_bg_focus, LV_STATE_FOCUS_KEY); + return; + } + } +#endif + lv_obj_add_style(obj, &theme->styles.btn, 0); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, 0); + lv_obj_add_style(obj, &theme->styles.transition_delayed, 0); + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); +#if LV_THEME_DEFAULT_GROW + lv_obj_add_style(obj, &theme->styles.grow, LV_STATE_PRESSED); +#endif + lv_obj_add_style(obj, &theme->styles.bg_color_secondary, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + +#if LV_USE_MENU + if(lv_obj_check_type(parent, &lv_menu_sidebar_header_cont_class) || + lv_obj_check_type(parent, &lv_menu_main_header_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_header_btn, 0); + lv_obj_add_style(obj, &theme->styles.menu_pressed, LV_STATE_PRESSED); + } +#endif + } +#endif + +#if LV_USE_LINE + else if(lv_obj_check_type(obj, &lv_line_class)) { + lv_obj_add_style(obj, &theme->styles.line, 0); + } +#endif + +#if LV_USE_BUTTONMATRIX + else if(lv_obj_check_type(obj, &lv_buttonmatrix_class)) { + +#if LV_USE_CALENDAR + if(lv_obj_check_type(parent, &lv_calendar_class)) { + lv_obj_add_style(obj, &theme->styles.calendar_btnm_bg, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.calendar_btnm_day, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.btn, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif + +#if LV_USE_BAR + else if(lv_obj_check_type(obj, &lv_bar_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, 0); + lv_obj_add_style(obj, &theme->styles.circle, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.circle, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_SLIDER + else if(lv_obj_check_type(obj, &lv_slider_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, 0); + lv_obj_add_style(obj, &theme->styles.circle, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.circle, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.knob, LV_PART_KNOB); +#if LV_THEME_DEFAULT_GROW + lv_obj_add_style(obj, &theme->styles.grow, LV_PART_KNOB | LV_STATE_PRESSED); +#endif + lv_obj_add_style(obj, &theme->styles.transition_delayed, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_KNOB | LV_STATE_PRESSED); + } +#endif + +#if LV_USE_TABLE + else if(lv_obj_check_type(obj, &lv_table_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.table_cell, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pad_normal, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.bg_color_secondary, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox_class)) { + lv_obj_add_style(obj, &theme->styles.pad_gap, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.cb_marker, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.cb_marker_checked, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_INDICATOR | LV_STATE_PRESSED); +#if LV_THEME_DEFAULT_GROW + lv_obj_add_style(obj, &theme->styles.grow, LV_PART_INDICATOR | LV_STATE_PRESSED); +#endif + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.transition_delayed, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_SWITCH + else if(lv_obj_check_type(obj, &lv_switch_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); + lv_obj_add_style(obj, &theme->styles.circle, 0); + lv_obj_add_style(obj, &theme->styles.anim_fast, 0); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.circle, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.knob, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.switch_knob, LV_PART_KNOB); + + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_CHART + else if(lv_obj_check_type(obj, &lv_chart_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + lv_obj_add_style(obj, &theme->styles.chart_bg, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &theme->styles.chart_series, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.chart_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.chart_series, LV_PART_CURSOR); + } +#endif + +#if LV_USE_ROLLER + else if(lv_obj_check_type(obj, &lv_roller_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.anim, 0); + lv_obj_add_style(obj, &theme->styles.line_space_large, 0); + lv_obj_add_style(obj, &theme->styles.text_align_center, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_SELECTED); + } +#endif + +#if LV_USE_DROPDOWN + else if(lv_obj_check_type(obj, &lv_dropdown_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + lv_obj_add_style(obj, &theme->styles.transition_delayed, 0); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + } + else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.line_space_large, 0); + lv_obj_add_style(obj, &theme->styles.dropdown_list, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_SELECTED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_SELECTED | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_SELECTED | LV_STATE_PRESSED); + } +#endif + +#if LV_USE_ARC + else if(lv_obj_check_type(obj, &lv_arc_class)) { + lv_obj_add_style(obj, &theme->styles.arc_indic, 0); + lv_obj_add_style(obj, &theme->styles.arc_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.arc_indic_primary, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.knob, LV_PART_KNOB); + } +#endif + +#if LV_USE_SPINNER + else if(lv_obj_check_type(obj, &lv_spinner_class)) { + lv_obj_add_style(obj, &theme->styles.arc_indic, 0); + lv_obj_add_style(obj, &theme->styles.arc_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.arc_indic_primary, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_textarea_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &theme->styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); + lv_obj_add_style(obj, &theme->styles.ta_placeholder, LV_PART_TEXTAREA_PLACEHOLDER); + } +#endif + +#if LV_USE_CALENDAR + else if(lv_obj_check_type(obj, &lv_calendar_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + } + +#if LV_USE_CALENDAR_HEADER_ARROW + else if(lv_obj_check_type(obj, &lv_calendar_header_arrow_class)) { + lv_obj_add_style(obj, &theme->styles.calendar_header, 0); + } +#endif + +#if LV_USE_CALENDAR_HEADER_DROPDOWN + else if(lv_obj_check_type(obj, &lv_calendar_header_dropdown_class)) { + lv_obj_add_style(obj, &theme->styles.calendar_header, 0); + } +#endif +#endif + +#if LV_USE_KEYBOARD + else if(lv_obj_check_type(obj, &lv_keyboard_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, theme->disp_size == DISP_LARGE ? &theme->styles.pad_small : &theme->styles.pad_tiny, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.btn, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.bg_color_white, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.keyboard_button_bg, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pressed, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_grey, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.bg_color_secondary_muted, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif + +#if LV_USE_LABEL && LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_label_class) && lv_obj_check_type(parent, &lv_textarea_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_SELECTED); + } +#endif + +#if LV_USE_LIST + else if(lv_obj_check_type(obj, &lv_list_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.list_bg, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + return; + } + else if(lv_obj_check_type(obj, &lv_list_text_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); + lv_obj_add_style(obj, &theme->styles.list_item_grow, 0); + } + else if(lv_obj_check_type(obj, &lv_list_button_class)) { + lv_obj_add_style(obj, &theme->styles.bg_color_white, 0); + lv_obj_add_style(obj, &theme->styles.list_btn, 0); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.list_item_grow, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.list_item_grow, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + } +#endif +#if LV_USE_MENU + else if(lv_obj_check_type(obj, &lv_menu_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.menu_bg, 0); + } + else if(lv_obj_check_type(obj, &lv_menu_sidebar_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_sidebar_cont, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_menu_main_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_main_cont, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_menu_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_cont, 0); + lv_obj_add_style(obj, &theme->styles.menu_pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_STATE_PRESSED | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary_muted, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_STATE_FOCUS_KEY); + } + else if(lv_obj_check_type(obj, &lv_menu_sidebar_header_cont_class) || + lv_obj_check_type(obj, &lv_menu_main_header_cont_class)) { + lv_obj_add_style(obj, &theme->styles.menu_header_cont, 0); + } + else if(lv_obj_check_type(obj, &lv_menu_page_class)) { + lv_obj_add_style(obj, &theme->styles.menu_page, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_menu_section_class)) { + lv_obj_add_style(obj, &theme->styles.menu_section, 0); + } + else if(lv_obj_check_type(obj, &lv_menu_separator_class)) { + lv_obj_add_style(obj, &theme->styles.menu_separator, 0); + } +#endif +#if LV_USE_MSGBOX + else if(lv_obj_check_type(obj, &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + lv_obj_add_style(obj, &theme->styles.clip_corner, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_backdrop_class)) { + lv_obj_add_style(obj, &theme->styles.msgbox_backdrop_bg, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_header_class)) { + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + lv_obj_add_style(obj, &theme->styles.bg_color_grey, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_footer_class)) { + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_content_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + return; + } + else if(lv_obj_check_type(obj, &lv_msgbox_header_button_class) || + lv_obj_check_type(obj, &lv_msgbox_footer_button_class)) { + lv_obj_add_style(obj, &theme->styles.btn, 0); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, 0); + lv_obj_add_style(obj, &theme->styles.transition_delayed, 0); + lv_obj_add_style(obj, &theme->styles.pressed, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.transition_normal, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.bg_color_secondary, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + return; + } +#endif + +#if LV_USE_SPINBOX + else if(lv_obj_check_type(obj, &lv_spinbox_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_small, 0); + lv_obj_add_style(obj, &theme->styles.outline_primary, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.outline_secondary, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.bg_color_primary, LV_PART_CURSOR); + } +#endif +#if LV_USE_TILEVIEW + else if(lv_obj_check_type(obj, &lv_tileview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } + else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + } +#endif + +#if LV_USE_TABVIEW + else if(lv_obj_check_type(obj, &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + } +#endif + +#if LV_USE_WIN + else if(lv_obj_check_type(obj, &lv_win_class)) { + lv_obj_add_style(obj, &theme->styles.clip_corner, 0); + } +#endif + +#if LV_USE_LED + else if(lv_obj_check_type(obj, &lv_led_class)) { + lv_obj_add_style(obj, &theme->styles.led, 0); + } +#endif + +#if LV_USE_SCALE + else if(lv_obj_check_type(obj, &lv_scale_class)) { + lv_obj_add_style(obj, &theme->styles.scale, LV_PART_MAIN); + lv_obj_add_style(obj, &theme->styles.scale, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.scale, LV_PART_ITEMS); + } +#endif +} + +static void style_init_reset(lv_style_t * style) +{ + if(lv_theme_default_is_inited()) { + lv_style_reset(style); + } + else { + lv_style_init(style); + } +} + + +static void resolution_change_event_cb(lv_event_t * e) +{ + lv_display_t * disp = lv_event_get_target(e); + my_theme_t * theme = lv_event_get_user_data(e); + + lv_theme_default_init(disp, theme->base.color_primary, theme->base.color_secondary, theme->base.flags, + theme->base.font_normal); + +} + +#endif diff --git a/inc/lvgl/src/themes/default/lv_theme_default.h b/inc/lvgl/src/themes/default/lv_theme_default.h new file mode 100644 index 0000000..26fad8d --- /dev/null +++ b/inc/lvgl/src/themes/default/lv_theme_default.h @@ -0,0 +1,71 @@ +/** + * @file lv_theme_default.h + * + */ + +#ifndef LV_THEME_DEFAULT_H +#define LV_THEME_DEFAULT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_theme.h" + +#if LV_USE_THEME_DEFAULT + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the theme + * @param disp pointer to display + * @param color_primary the primary color of the theme + * @param color_secondary the secondary color for the theme + * @param dark + * @param font pointer to a font to use. + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_default_init(lv_display_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, + const lv_font_t * font); + +/** + * Check if default theme is initialized + * @return true if default theme is initialized, false otherwise + */ +bool lv_theme_default_is_inited(void); + +/** + * Get default theme + * @return a pointer to default theme, or NULL if this is not initialized + */ +lv_theme_t * lv_theme_default_get(void); + +/** + * Deinitialize the default theme + */ +void lv_theme_default_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_DEFAULT_H*/ diff --git a/inc/lvgl/src/themes/lv_theme.c b/inc/lvgl/src/themes/lv_theme.c new file mode 100644 index 0000000..f226d53 --- /dev/null +++ b/inc/lvgl/src/themes/lv_theme.c @@ -0,0 +1,161 @@ +/** + * @file lv_theme.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_theme_private.h" +#include "../core/lv_obj_private.h" +#include "../core/lv_obj_style_private.h" +#include "../core/lv_obj_class_private.h" +#include "../../lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void apply_theme(lv_theme_t * th, lv_obj_t * obj); +static void apply_theme_recursion(lv_theme_t * th, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_theme_t * lv_theme_get_from_obj(lv_obj_t * obj) +{ + lv_display_t * disp = obj ? lv_obj_get_display(obj) : lv_display_get_default(); + return lv_display_get_theme(disp); +} + +lv_theme_t * lv_theme_create(void) +{ + lv_theme_t * theme = lv_zalloc(sizeof(*theme)); + LV_ASSERT_MALLOC(theme); + return theme; +} +void lv_theme_delete(lv_theme_t * theme) +{ + lv_free(theme); +} + +void lv_theme_copy(lv_theme_t * dst, const lv_theme_t * src) +{ + if(!dst || !src) { + LV_LOG_WARN("Refusing to copy null themes"); + return; + } + lv_memcpy(dst, src, sizeof(*src)); +} + +void lv_theme_apply(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + lv_obj_remove_style_all(obj); + + if(th == NULL) return; + + apply_theme_recursion(th, obj); /*Apply the theme including the base theme(s)*/ +} + +void lv_theme_set_parent(lv_theme_t * theme, lv_theme_t * parent) +{ + theme->parent = parent; +} + +void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb) +{ + theme->apply_cb = apply_cb; +} + +const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_small : LV_FONT_DEFAULT; +} + +const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_normal : LV_FONT_DEFAULT; +} + +const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->font_large : LV_FONT_DEFAULT; +} + +lv_color_t lv_theme_get_color_primary(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->color_primary : lv_palette_main(LV_PALETTE_BLUE_GREY); +} + +lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj) +{ + lv_theme_t * th = lv_theme_get_from_obj(obj); + return th ? th->color_secondary : lv_palette_main(LV_PALETTE_BLUE); +} + +#if LV_USE_EXT_DATA +void lv_theme_set_external_data(lv_theme_t * theme, void * data, void (* free_cb)(void * data)) +{ + if(!theme) { + LV_LOG_WARN("Can't attach external user data and destructor callback to a NULL theme"); + return; + } + + theme->ext_data.data = data; + theme->ext_data.free_cb = free_cb; +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void apply_theme(lv_theme_t * th, lv_obj_t * obj) +{ + if(th->parent) apply_theme(th->parent, obj); + if(th->apply_cb) { + th->apply_cb(th, obj); + for(uint32_t i = 0; i < obj->style_cnt; i++) { + obj->styles[i].is_theme = 1; + } + } +} + +static void apply_theme_recursion(lv_theme_t * th, lv_obj_t * obj) +{ + const lv_obj_class_t * original_class_p = obj->class_p; + + if(obj->class_p->base_class && obj->class_p->theme_inheritable == LV_OBJ_CLASS_THEME_INHERITABLE_TRUE) { + /*Apply the base class theme in obj*/ + obj->class_p = obj->class_p->base_class; + + /*apply the base first*/ + apply_theme_recursion(th, obj); + } + + /*Restore the original class*/ + obj->class_p = original_class_p; + + apply_theme(th, obj); +} diff --git a/inc/lvgl/src/themes/lv_theme.h b/inc/lvgl/src/themes/lv_theme.h new file mode 100644 index 0000000..dab88a4 --- /dev/null +++ b/inc/lvgl/src/themes/lv_theme.h @@ -0,0 +1,144 @@ +/** + *@file lv_theme.h + * + */ + +#ifndef LV_THEME_H +#define LV_THEME_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef void (*lv_theme_apply_cb_t)(lv_theme_t *, lv_obj_t *); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Creates a new theme + * @return the new theme or NULL if allocation failed + */ +lv_theme_t * lv_theme_create(void); + +/** + * Copy 'src' theme into 'dst' + * @param dst pointer to the destination theme + * @param src pointer to the source theme + */ +void lv_theme_copy(lv_theme_t * dst, const lv_theme_t * src); + +/** + * Get the theme assigned to the display of the object + * @param obj pointer to a theme object + * @return the theme of the object's display (can be NULL) + */ +lv_theme_t * lv_theme_get_from_obj(lv_obj_t * obj); + +/** + * Apply the active theme on an object + * @param obj pointer to an object + */ +void lv_theme_apply(lv_obj_t * obj); + +/** + * Set a base theme for a theme. + * The styles from the base them will be added before the styles of the current theme. + * Arbitrary long chain of themes can be created by setting base themes. + * @param theme pointer to theme which base should be set + * @param parent pointer to the base theme + */ +void lv_theme_set_parent(lv_theme_t * theme, lv_theme_t * parent); + +/** + * Set an apply callback for a theme. + * The apply callback is used to add styles to different objects + * @param theme pointer to theme which callback should be set + * @param apply_cb pointer to the callback + */ +void lv_theme_set_apply_cb(lv_theme_t * theme, lv_theme_apply_cb_t apply_cb); + +/** + * Get the small font of the theme + * @param obj pointer to an object + * @return pointer to the font + */ +const lv_font_t * lv_theme_get_font_small(lv_obj_t * obj); +/** + * Get the normal font of the theme + * @param obj pointer to an object + * @return pointer to the font + */ +const lv_font_t * lv_theme_get_font_normal(lv_obj_t * obj); + +/** + * Get the subtitle font of the theme + * @param obj pointer to an object + * @return pointer to the font + */ +const lv_font_t * lv_theme_get_font_large(lv_obj_t * obj); + +/** + * Get the primary color of the theme + * @param obj pointer to an object + * @return the color + */ +lv_color_t lv_theme_get_color_primary(lv_obj_t * obj); + +/** + * Get the secondary color of the theme + * @param obj pointer to an object + * @return the color + */ +lv_color_t lv_theme_get_color_secondary(lv_obj_t * obj); + + +/** + * Delete a theme + * @param theme the theme to destroy + */ +void lv_theme_delete(lv_theme_t * theme); + +#if LV_USE_EXT_DATA +/** + * @brief Attaches external user data and destructor callback to the theme + * + * Associates custom user data with an LVGL theme and specifies a destructor function + * that will be automatically invoked when the theme is deleted to properly clean up + * the associated resources. + * + * @param theme Pointer to theme which callback should be set + * @param data User-defined data pointer to associate with the theme + * @param free_cb Callback function for cleaning up ext_data when theme is deleted. + * Receives ext_data as parameter. NULL means no cleanup required. + */ +void lv_theme_set_external_data(lv_theme_t * theme, void * data, void (* free_cb)(void * data)); +#endif + +/********************** + * MACROS + **********************/ + +#include "default/lv_theme_default.h" +#include "mono/lv_theme_mono.h" +#include "simple/lv_theme_simple.h" + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_H*/ diff --git a/inc/lvgl/src/themes/lv_theme_private.h b/inc/lvgl/src/themes/lv_theme_private.h new file mode 100644 index 0000000..4a8ebcb --- /dev/null +++ b/inc/lvgl/src/themes/lv_theme_private.h @@ -0,0 +1,57 @@ +/** + * @file lv_theme_private.h + * + */ + +#ifndef LV_THEME_PRIVATE_H +#define LV_THEME_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../misc/lv_ext_data.h" +#include "lv_theme.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_theme_t { +#if LV_USE_EXT_DATA + lv_ext_data_t ext_data; +#endif + lv_theme_apply_cb_t apply_cb; + lv_theme_t * parent; /**< Apply the current theme's style on top of this theme. */ + void * user_data; + lv_display_t * disp; + lv_color_t color_primary; + lv_color_t color_secondary; + const lv_font_t * font_small; + const lv_font_t * font_normal; + const lv_font_t * font_large; + uint32_t flags; /**< Any custom flag used by the theme */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_PRIVATE_H*/ diff --git a/inc/lvgl/src/themes/mono/lv_theme_mono.c b/inc/lvgl/src/themes/mono/lv_theme_mono.c new file mode 100644 index 0000000..0c539bf --- /dev/null +++ b/inc/lvgl/src/themes/mono/lv_theme_mono.c @@ -0,0 +1,556 @@ +/** + * @file lv_theme_mono.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_theme_private.h" +#include "../../../lvgl.h" /*To see all the widgets*/ + +#if LV_USE_THEME_MONO + +#include "lv_theme_mono.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +struct _my_theme_t; +typedef struct _my_theme_t my_theme_t; + +#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_mono)) + +#define COLOR_FG dark_bg ? lv_color_white() : lv_color_black() +#define COLOR_BG dark_bg ? lv_color_black() : lv_color_white() + +#define BORDER_W_NORMAL 1 +#define BORDER_W_PR 3 +#define BORDER_W_DIS 0 +#define BORDER_W_FOCUS 1 +#define BORDER_W_EDIT 2 +#define PAD_DEF 4 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t card; + lv_style_t scrollbar; + lv_style_t pr; + lv_style_t inv; + lv_style_t disabled; + lv_style_t focus; + lv_style_t edit; + lv_style_t pad_gap; + lv_style_t pad_zero; + lv_style_t no_radius; + lv_style_t radius_circle; + lv_style_t large_border; + lv_style_t large_line_space; + lv_style_t underline; +#if LV_USE_TEXTAREA + lv_style_t ta_cursor; +#endif +#if LV_USE_CHART + lv_style_t chart_indic; +#endif +} my_theme_styles_t; + +struct _my_theme_t { + lv_theme_t base; + my_theme_styles_t styles; + bool inited; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void style_init_reset(lv_style_t * style); +static void theme_apply(lv_theme_t * th, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init(my_theme_t * theme, bool dark_bg, const lv_font_t * font) +{ + style_init_reset(&theme->styles.scrollbar); + lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scrollbar, COLOR_FG); + lv_style_set_width(&theme->styles.scrollbar, PAD_DEF); + + style_init_reset(&theme->styles.scr); + lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scr, COLOR_BG); + lv_style_set_text_color(&theme->styles.scr, COLOR_FG); + lv_style_set_pad_row(&theme->styles.scr, PAD_DEF); + lv_style_set_pad_column(&theme->styles.scr, PAD_DEF); + lv_style_set_text_font(&theme->styles.scr, font); + + style_init_reset(&theme->styles.card); + lv_style_set_bg_opa(&theme->styles.card, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.card, COLOR_BG); + lv_style_set_border_color(&theme->styles.card, COLOR_FG); + lv_style_set_radius(&theme->styles.card, 2); + lv_style_set_border_width(&theme->styles.card, BORDER_W_NORMAL); + lv_style_set_pad_all(&theme->styles.card, PAD_DEF); + lv_style_set_pad_gap(&theme->styles.card, PAD_DEF); + lv_style_set_text_color(&theme->styles.card, COLOR_FG); + lv_style_set_line_width(&theme->styles.card, 2); + lv_style_set_line_color(&theme->styles.card, COLOR_FG); + lv_style_set_arc_width(&theme->styles.card, 2); + lv_style_set_arc_color(&theme->styles.card, COLOR_FG); + lv_style_set_outline_color(&theme->styles.card, COLOR_FG); + lv_style_set_anim_duration(&theme->styles.card, 300); + + style_init_reset(&theme->styles.pr); + lv_style_set_border_width(&theme->styles.pr, BORDER_W_PR); + + style_init_reset(&theme->styles.inv); + lv_style_set_bg_opa(&theme->styles.inv, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.inv, COLOR_FG); + lv_style_set_border_color(&theme->styles.inv, COLOR_BG); + lv_style_set_line_color(&theme->styles.inv, COLOR_BG); + lv_style_set_arc_color(&theme->styles.inv, COLOR_BG); + lv_style_set_text_color(&theme->styles.inv, COLOR_BG); + lv_style_set_outline_color(&theme->styles.inv, COLOR_BG); + + style_init_reset(&theme->styles.disabled); + lv_style_set_border_width(&theme->styles.disabled, BORDER_W_DIS); + + style_init_reset(&theme->styles.focus); + lv_style_set_outline_width(&theme->styles.focus, 1); + lv_style_set_outline_pad(&theme->styles.focus, BORDER_W_FOCUS); + + style_init_reset(&theme->styles.edit); + lv_style_set_outline_width(&theme->styles.edit, BORDER_W_EDIT); + + style_init_reset(&theme->styles.large_border); + lv_style_set_border_width(&theme->styles.large_border, BORDER_W_EDIT); + + style_init_reset(&theme->styles.pad_gap); + lv_style_set_pad_gap(&theme->styles.pad_gap, PAD_DEF); + + style_init_reset(&theme->styles.pad_zero); + lv_style_set_pad_all(&theme->styles.pad_zero, 0); + lv_style_set_pad_gap(&theme->styles.pad_zero, 0); + + style_init_reset(&theme->styles.no_radius); + lv_style_set_radius(&theme->styles.no_radius, 0); + + style_init_reset(&theme->styles.radius_circle); + lv_style_set_radius(&theme->styles.radius_circle, LV_RADIUS_CIRCLE); + + style_init_reset(&theme->styles.large_line_space); + lv_style_set_text_line_space(&theme->styles.large_line_space, 6); + + style_init_reset(&theme->styles.underline); + lv_style_set_text_decor(&theme->styles.underline, LV_TEXT_DECOR_UNDERLINE); + +#if LV_USE_TEXTAREA + style_init_reset(&theme->styles.ta_cursor); + lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); + lv_style_set_border_color(&theme->styles.ta_cursor, COLOR_FG); + lv_style_set_border_width(&theme->styles.ta_cursor, 2); + lv_style_set_bg_opa(&theme->styles.ta_cursor, LV_OPA_TRANSP); + lv_style_set_anim_duration(&theme->styles.ta_cursor, 500); +#endif + +#if LV_USE_CHART + style_init_reset(&theme->styles.chart_indic); + lv_style_set_radius(&theme->styles.chart_indic, LV_RADIUS_CIRCLE); + lv_style_set_size(&theme->styles.chart_indic, lv_display_dpx(theme->base.disp, 8), lv_display_dpx(theme->base.disp, 8)); + lv_style_set_bg_color(&theme->styles.chart_indic, COLOR_FG); + lv_style_set_bg_opa(&theme->styles.chart_indic, LV_OPA_COVER); +#endif +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_theme_t * lv_theme_mono_init(lv_display_t * disp, bool dark_bg, const lv_font_t * font) +{ + /*This trick is required only to avoid the garbage collection of + *styles' data if LVGL is used in a binding (e.g. MicroPython) + *In a general case styles could be in a simple `static lv_style_t my_style...` variables*/ + if(!lv_theme_mono_is_inited()) { + theme_def = lv_malloc_zeroed(sizeof(my_theme_t)); + LV_ASSERT_MALLOC(theme_def); + } + + my_theme_t * theme = theme_def; + + theme->base.disp = disp; + theme->base.font_small = LV_FONT_DEFAULT; + theme->base.font_normal = LV_FONT_DEFAULT; + theme->base.font_large = LV_FONT_DEFAULT; + theme->base.apply_cb = theme_apply; +#if LV_USE_EXT_DATA + theme->base.ext_data.free_cb = NULL; + theme->base.ext_data.data = NULL; +#endif + + style_init(theme, dark_bg, font); + + if(disp == NULL || lv_display_get_theme(disp) == (lv_theme_t *)theme) { + lv_obj_report_style_change(NULL); + } + + theme->inited = true; + + return (lv_theme_t *)theme_def; +} + +bool lv_theme_mono_is_inited(void) +{ + my_theme_t * theme = theme_def; + if(theme == NULL) return false; + return theme->inited; +} + +lv_theme_t * lv_theme_mono_get(void) +{ + if(!lv_theme_mono_is_inited()) { + return NULL; + } + + return (lv_theme_t *)theme_def; +} + +void lv_theme_mono_deinit(void) +{ + my_theme_t * theme = theme_def; + if(theme) { + if(theme->inited) { + lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles)); + uint32_t i; + for(i = 0; i < sizeof(my_theme_styles_t) / sizeof(lv_style_t); i++) { + lv_style_reset(theme_styles + i); + } + } +#if LV_USE_EXT_DATA + if(theme->base.ext_data.free_cb) { + theme->base.ext_data.free_cb(theme->base.ext_data.data); + theme->base.ext_data.data = NULL; + } +#endif + lv_free(theme_def); + theme_def = NULL; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj) +{ + LV_UNUSED(th); + + my_theme_t * theme = theme_def; + lv_obj_t * parent = lv_obj_get_parent(obj); + + if(parent == NULL) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } + + if(lv_obj_check_type(obj, &lv_obj_class)) { +#if LV_USE_TABVIEW + /*Tabview content area*/ + if(lv_obj_check_type(parent, &lv_tabview_class)) { + return; + } + /*Tabview pages*/ + else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + +#if LV_USE_WIN + /*Header*/ + if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 0) == 0) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + return; + } + /*Content*/ + else if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 1) == obj) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } +#if LV_USE_BUTTON + else if(lv_obj_check_type(obj, &lv_button_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pr, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.inv, LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_BUTTONMATRIX + else if(lv_obj_check_type(obj, &lv_buttonmatrix_class)) { +#if LV_USE_MSGBOX + if(lv_obj_check_type(parent, &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.pad_gap, 0); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + return; + } +#endif +#if LV_USE_TABVIEW + if(lv_obj_check_type(parent, &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.pad_gap, 0); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.underline, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_BAR + else if(lv_obj_check_type(obj, &lv_bar_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_SLIDER + else if(lv_obj_check_type(obj, &lv_slider_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_TABLE + else if(lv_obj_check_type(obj, &lv_table_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.no_radius, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox_class)) { + lv_obj_add_style(obj, &theme->styles.pad_gap, LV_PART_MAIN); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_INDICATOR | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_INDICATOR | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_SWITCH + else if(lv_obj_check_type(obj, &lv_switch_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.radius_circle, 0); + lv_obj_add_style(obj, &theme->styles.pad_zero, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.pad_zero, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_CHART + else if(lv_obj_check_type(obj, &lv_chart_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.chart_indic, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_CURSOR); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_ROLLER + else if(lv_obj_check_type(obj, &lv_roller_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.large_line_space, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_SELECTED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_DROPDOWN + else if(lv_obj_check_type(obj, &lv_dropdown_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pr, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } + else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.large_line_space, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_SELECTED | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_SELECTED | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_ARC + else if(lv_obj_check_type(obj, &lv_arc_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.pad_zero, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.radius_circle, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_textarea_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUSED); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif + +#if LV_USE_CALENDAR + else if(lv_obj_check_type(obj, &lv_calendar_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.no_radius, 0); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.disabled, LV_PART_ITEMS | LV_STATE_DISABLED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_FOCUS_KEY); + } +#endif + +#if LV_USE_KEYBOARD + else if(lv_obj_check_type(obj, &lv_keyboard_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.card, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.pr, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_ITEMS | LV_STATE_CHECKED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + lv_obj_add_style(obj, &theme->styles.large_border, LV_PART_ITEMS | LV_STATE_EDITED); + } +#endif + +#if LV_USE_LIST + else if(lv_obj_check_type(obj, &lv_list_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } + else if(lv_obj_check_type(obj, &lv_list_text_class)) { + + } + else if(lv_obj_check_type(obj, &lv_list_button_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.pr, LV_STATE_PRESSED); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.large_border, LV_STATE_EDITED); + } +#endif +#if LV_USE_MSGBOX + else if(lv_obj_check_type(obj, &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + return; + } +#endif + +#if LV_USE_SPINBOX + else if(lv_obj_check_type(obj, &lv_spinbox_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + lv_obj_add_style(obj, &theme->styles.inv, LV_PART_CURSOR); + lv_obj_add_style(obj, &theme->styles.focus, LV_STATE_FOCUS_KEY); + lv_obj_add_style(obj, &theme->styles.edit, LV_STATE_EDITED); + } +#endif +#if LV_USE_TILEVIEW + else if(lv_obj_check_type(obj, &lv_tileview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } + else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } +#endif + +#if LV_USE_LED + else if(lv_obj_check_type(obj, &lv_led_class)) { + lv_obj_add_style(obj, &theme->styles.card, 0); + } +#endif +} + +static void style_init_reset(lv_style_t * style) +{ + if(lv_theme_mono_is_inited()) { + lv_style_reset(style); + } + else { + lv_style_init(style); + } +} + +#endif diff --git a/inc/lvgl/src/themes/mono/lv_theme_mono.h b/inc/lvgl/src/themes/mono/lv_theme_mono.h new file mode 100644 index 0000000..794411b --- /dev/null +++ b/inc/lvgl/src/themes/mono/lv_theme_mono.h @@ -0,0 +1,68 @@ +/** + * @file lv_theme_mono.h + * + */ + +#ifndef LV_THEME_MONO_H +#define LV_THEME_MONO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_theme.h" + +#if LV_USE_THEME_MONO + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the theme + * @param disp pointer to display + * @param dark_bg + * @param font pointer to a font to use. + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_mono_init(lv_display_t * disp, bool dark_bg, const lv_font_t * font); + +/** +* Check if the theme is initialized +* @return true if default theme is initialized, false otherwise +*/ +bool lv_theme_mono_is_inited(void); + +/** + * Get mono theme + * @return a pointer to mono theme, or NULL if this is not initialized + */ +lv_theme_t * lv_theme_mono_get(void); + +/** + * Deinitialize the mono theme + */ +void lv_theme_mono_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /* LV_THEME_MONO_H */ diff --git a/inc/lvgl/src/themes/simple/lv_theme_simple.c b/inc/lvgl/src/themes/simple/lv_theme_simple.c new file mode 100644 index 0000000..33266c0 --- /dev/null +++ b/inc/lvgl/src/themes/simple/lv_theme_simple.c @@ -0,0 +1,450 @@ +/** + * @file lv_theme_simple.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../lv_theme_private.h" +#include "../../../lvgl.h" /*To see all the widgets*/ + +#if LV_USE_THEME_SIMPLE + +#include "lv_theme_simple.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ + +struct _my_theme_t; +typedef struct _my_theme_t my_theme_t; + +#define theme_def (*(my_theme_t **)(&LV_GLOBAL_DEFAULT()->theme_simple)) + +#define COLOR_SCR lv_palette_lighten(LV_PALETTE_GREY, 4) +#define COLOR_WHITE lv_color_white() +#define COLOR_LIGHT lv_palette_lighten(LV_PALETTE_GREY, 2) +#define COLOR_DARK lv_palette_main(LV_PALETTE_GREY) +#define COLOR_DIM lv_palette_darken(LV_PALETTE_GREY, 2) +#define SCROLLBAR_WIDTH 2 + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_style_t scr; + lv_style_t transp; + lv_style_t white; + lv_style_t light; + lv_style_t dark; + lv_style_t dim; + lv_style_t scrollbar; +#if LV_USE_ARC + lv_style_t arc_line; + lv_style_t arc_knob; +#endif +#if LV_USE_TEXTAREA + lv_style_t ta_cursor; +#endif +} my_theme_styles_t; + +struct _my_theme_t { + lv_theme_t base; + my_theme_styles_t styles; + bool inited; +}; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void style_init_reset(lv_style_t * style); +static void theme_apply(lv_theme_t * th, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void style_init(my_theme_t * theme) +{ + style_init_reset(&theme->styles.scrollbar); + lv_style_set_bg_opa(&theme->styles.scrollbar, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scrollbar, COLOR_DARK); + lv_style_set_width(&theme->styles.scrollbar, SCROLLBAR_WIDTH); + + style_init_reset(&theme->styles.scr); + lv_style_set_bg_opa(&theme->styles.scr, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.scr, COLOR_SCR); + lv_style_set_text_color(&theme->styles.scr, COLOR_DIM); + + style_init_reset(&theme->styles.transp); + lv_style_set_bg_opa(&theme->styles.transp, LV_OPA_TRANSP); + + style_init_reset(&theme->styles.white); + lv_style_set_bg_opa(&theme->styles.white, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.white, COLOR_WHITE); + lv_style_set_line_width(&theme->styles.white, 1); + lv_style_set_line_color(&theme->styles.white, COLOR_WHITE); + lv_style_set_arc_width(&theme->styles.white, 2); + lv_style_set_arc_color(&theme->styles.white, COLOR_WHITE); + + style_init_reset(&theme->styles.light); + lv_style_set_bg_opa(&theme->styles.light, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.light, COLOR_LIGHT); + lv_style_set_line_width(&theme->styles.light, 1); + lv_style_set_line_color(&theme->styles.light, COLOR_LIGHT); + lv_style_set_arc_width(&theme->styles.light, 2); + lv_style_set_arc_color(&theme->styles.light, COLOR_LIGHT); + + style_init_reset(&theme->styles.dark); + lv_style_set_bg_opa(&theme->styles.dark, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.dark, COLOR_DARK); + lv_style_set_line_width(&theme->styles.dark, 1); + lv_style_set_line_color(&theme->styles.dark, COLOR_DARK); + lv_style_set_arc_width(&theme->styles.dark, 2); + lv_style_set_arc_color(&theme->styles.dark, COLOR_DARK); + + style_init_reset(&theme->styles.dim); + lv_style_set_bg_opa(&theme->styles.dim, LV_OPA_COVER); + lv_style_set_bg_color(&theme->styles.dim, COLOR_DIM); + lv_style_set_line_width(&theme->styles.dim, 1); + lv_style_set_line_color(&theme->styles.dim, COLOR_DIM); + lv_style_set_arc_width(&theme->styles.dim, 2); + lv_style_set_arc_color(&theme->styles.dim, COLOR_DIM); + +#if LV_USE_ARC + style_init_reset(&theme->styles.arc_line); + lv_style_set_arc_width(&theme->styles.arc_line, 6); + style_init_reset(&theme->styles.arc_knob); + lv_style_set_pad_all(&theme->styles.arc_knob, 5); +#endif + +#if LV_USE_TEXTAREA + style_init_reset(&theme->styles.ta_cursor); + lv_style_set_border_side(&theme->styles.ta_cursor, LV_BORDER_SIDE_LEFT); + lv_style_set_border_color(&theme->styles.ta_cursor, COLOR_DIM); + lv_style_set_border_width(&theme->styles.ta_cursor, 2); + lv_style_set_bg_opa(&theme->styles.ta_cursor, LV_OPA_TRANSP); + lv_style_set_anim_duration(&theme->styles.ta_cursor, 500); +#endif +} + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_theme_t * lv_theme_simple_init(lv_display_t * disp) +{ + /*This trick is required only to avoid the garbage collection of + *styles' data if LVGL is used in a binding (e.g. MicroPython) + *In a general case styles could be in a simple `static lv_style_t my_style...` variables*/ + if(!lv_theme_simple_is_inited()) { + theme_def = lv_malloc_zeroed(sizeof(my_theme_t)); + LV_ASSERT_MALLOC(theme_def); + } + + my_theme_t * theme = theme_def; + + theme->base.disp = disp; + theme->base.font_small = LV_FONT_DEFAULT; + theme->base.font_normal = LV_FONT_DEFAULT; + theme->base.font_large = LV_FONT_DEFAULT; + theme->base.apply_cb = theme_apply; +#if LV_USE_EXT_DATA + theme->base.ext_data.free_cb = NULL; + theme->base.ext_data.data = NULL; +#endif + + style_init(theme); + + if(disp == NULL || lv_display_get_theme(disp) == (lv_theme_t *)theme) { + lv_obj_report_style_change(NULL); + } + + theme->inited = true; + + return (lv_theme_t *)theme_def; +} + +bool lv_theme_simple_is_inited(void) +{ + my_theme_t * theme = theme_def; + if(theme == NULL) return false; + return theme->inited; +} + +lv_theme_t * lv_theme_simple_get(void) +{ + if(!lv_theme_simple_is_inited()) { + return NULL; + } + + return (lv_theme_t *)theme_def; +} + +void lv_theme_simple_deinit(void) +{ + my_theme_t * theme = theme_def; + if(theme) { + if(theme->inited) { + lv_style_t * theme_styles = (lv_style_t *)(&(theme->styles)); + uint32_t i; + for(i = 0; i < sizeof(my_theme_styles_t) / sizeof(lv_style_t); i++) { + lv_style_reset(theme_styles + i); + } + } +#if LV_USE_EXT_DATA + if(theme->base.ext_data.free_cb) { + theme->base.ext_data.free_cb(theme->base.ext_data.data); + theme->base.ext_data.data = NULL; + } +#endif + lv_free(theme_def); + theme_def = NULL; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void theme_apply(lv_theme_t * th, lv_obj_t * obj) +{ + LV_UNUSED(th); + + my_theme_t * theme = theme_def; + lv_obj_t * parent = lv_obj_get_parent(obj); + + if(parent == NULL) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } + + if(lv_obj_check_type(obj, &lv_obj_class)) { +#if LV_USE_TABVIEW + /*Tabview content area*/ + if(lv_obj_check_type(parent, &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + return; + } + /*Tabview pages*/ + else if(lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + +#if LV_USE_WIN + /*Header*/ + if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 0) == obj) { + lv_obj_add_style(obj, &theme->styles.light, 0); + return; + } + /*Content*/ + else if(lv_obj_check_type(parent, &lv_win_class) && lv_obj_get_child(parent, 1) == obj) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } +#if LV_USE_BUTTON + else if(lv_obj_check_type(obj, &lv_button_class)) { + lv_obj_add_style(obj, &theme->styles.dark, 0); + } +#endif + +#if LV_USE_BUTTONMATRIX + else if(lv_obj_check_type(obj, &lv_buttonmatrix_class)) { +#if LV_USE_MSGBOX + if(lv_obj_check_type(parent, &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + return; + } +#endif +#if LV_USE_TABVIEW + if(lv_obj_check_type(parent, &lv_tabview_class)) { + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + return; + } +#endif + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + } +#endif + +#if LV_USE_BAR + else if(lv_obj_check_type(obj, &lv_bar_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_SLIDER + else if(lv_obj_check_type(obj, &lv_slider_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.dim, LV_PART_KNOB); + } +#endif + +#if LV_USE_TABLE + else if(lv_obj_check_type(obj, &lv_table_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + } +#endif + +#if LV_USE_CHECKBOX + else if(lv_obj_check_type(obj, &lv_checkbox_class)) { + lv_obj_add_style(obj, &theme->styles.light, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR | LV_STATE_CHECKED); + } +#endif + +#if LV_USE_SWITCH + else if(lv_obj_check_type(obj, &lv_switch_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dim, LV_PART_KNOB); + } +#endif + +#if LV_USE_CHART + else if(lv_obj_check_type(obj, &lv_chart_class)) { + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_CURSOR); + } +#endif + +#if LV_USE_ROLLER + else if(lv_obj_check_type(obj, &lv_roller_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_SELECTED); + } +#endif + +#if LV_USE_DROPDOWN + else if(lv_obj_check_type(obj, &lv_dropdown_class)) { + lv_obj_add_style(obj, &theme->styles.white, 0); + } + else if(lv_obj_check_type(obj, &lv_dropdownlist_class)) { + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_SELECTED); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_SELECTED | LV_STATE_CHECKED); + } +#endif + +#if LV_USE_ARC + else if(lv_obj_check_type(obj, &lv_arc_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.transp, 0); + lv_obj_add_style(obj, &theme->styles.arc_line, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.arc_line, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.dim, LV_PART_KNOB); + lv_obj_add_style(obj, &theme->styles.arc_knob, LV_PART_KNOB); + } +#endif + +#if LV_USE_SPINNER + else if(lv_obj_check_type(obj, &lv_spinner_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.transp, 0); + lv_obj_add_style(obj, &theme->styles.arc_line, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_INDICATOR); + lv_obj_add_style(obj, &theme->styles.arc_line, LV_PART_INDICATOR); + } +#endif + +#if LV_USE_TEXTAREA + else if(lv_obj_check_type(obj, &lv_textarea_class)) { + lv_obj_add_style(obj, &theme->styles.white, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + lv_obj_add_style(obj, &theme->styles.ta_cursor, LV_PART_CURSOR | LV_STATE_FOCUSED); + } +#endif + +#if LV_USE_CALENDAR + else if(lv_obj_check_type(obj, &lv_calendar_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + } +#endif + +#if LV_USE_KEYBOARD + else if(lv_obj_check_type(obj, &lv_keyboard_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.white, LV_PART_ITEMS); + lv_obj_add_style(obj, &theme->styles.light, LV_PART_ITEMS | LV_STATE_CHECKED); + } +#endif + +#if LV_USE_LIST + else if(lv_obj_check_type(obj, &lv_list_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + return; + } + else if(lv_obj_check_type(obj, &lv_list_text_class)) { + + } + else if(lv_obj_check_type(obj, &lv_list_button_class)) { + lv_obj_add_style(obj, &theme->styles.dark, 0); + } +#endif +#if LV_USE_MSGBOX + else if(lv_obj_check_type(obj, &lv_msgbox_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + return; + } +#endif + +#if LV_USE_SPINBOX + else if(lv_obj_check_type(obj, &lv_spinbox_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + lv_obj_add_style(obj, &theme->styles.dark, LV_PART_CURSOR); + } +#endif +#if LV_USE_TILEVIEW + else if(lv_obj_check_type(obj, &lv_tileview_class)) { + lv_obj_add_style(obj, &theme->styles.scr, 0); + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } + else if(lv_obj_check_type(obj, &lv_tileview_tile_class)) { + lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR); + } +#endif + +#if LV_USE_LED + else if(lv_obj_check_type(obj, &lv_led_class)) { + lv_obj_add_style(obj, &theme->styles.light, 0); + } +#endif +} + +static void style_init_reset(lv_style_t * style) +{ + if(lv_theme_simple_is_inited()) { + lv_style_reset(style); + } + else { + lv_style_init(style); + } +} + +#endif diff --git a/inc/lvgl/src/themes/simple/lv_theme_simple.h b/inc/lvgl/src/themes/simple/lv_theme_simple.h new file mode 100644 index 0000000..4b02a0e --- /dev/null +++ b/inc/lvgl/src/themes/simple/lv_theme_simple.h @@ -0,0 +1,67 @@ +/** + * @file lv_theme_simple.h + * + */ + +#ifndef LV_THEME_SIMPLE_H +#define LV_THEME_SIMPLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_theme.h" +#include "../../display/lv_display.h" + +#if LV_USE_THEME_SIMPLE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Initialize the theme + * @param disp pointer to display + * @return a pointer to reference this theme later + */ +lv_theme_t * lv_theme_simple_init(lv_display_t * disp); + +/** +* Check if the theme is initialized +* @return true if default theme is initialized, false otherwise +*/ +bool lv_theme_simple_is_inited(void); + +/** + * Get simple theme + * @return a pointer to simple theme, or NULL if this is not initialized + */ +lv_theme_t * lv_theme_simple_get(void); + +/** + * Deinitialize the simple theme + */ +void lv_theme_simple_deinit(void); + +/********************** + * MACROS + **********************/ + +#endif + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_THEME_SIMPLE_H*/ diff --git a/inc/lvgl/src/tick/lv_tick.c b/inc/lvgl/src/tick/lv_tick.c new file mode 100644 index 0000000..4fb6d9c --- /dev/null +++ b/inc/lvgl/src/tick/lv_tick.c @@ -0,0 +1,113 @@ +/** + * @file lv_tick.c + * Provide access to the system tick with 1 millisecond resolution + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tick_private.h" +#include "../misc/lv_types.h" +#include "../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define state LV_GLOBAL_DEFAULT()->tick_state + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period) +{ + lv_tick_state_t * state_p = &state; + + state_p->sys_irq_flag = 0; + state_p->sys_time += tick_period; +} + +uint32_t lv_tick_get(void) +{ + lv_tick_state_t * state_p = &state; + + if(state_p->tick_get_cb) + return state_p->tick_get_cb(); + + /*If `lv_tick_inc` is called from an interrupt while `sys_time` is read + *the result might be corrupted. + *This loop detects if `lv_tick_inc` was called while reading `sys_time`. + *If `tick_irq_flag` was cleared in `lv_tick_inc` try to read again + *until `tick_irq_flag` remains `1`.*/ + uint32_t result; + do { + state_p->sys_irq_flag = 1; + result = state_p->sys_time; + } while(!state_p->sys_irq_flag); /*Continue until see a non interrupted cycle*/ + + return result; +} + +uint32_t lv_tick_elaps(uint32_t prev_tick) +{ + return lv_tick_diff(lv_tick_get(), prev_tick); +} + +uint32_t lv_tick_diff(uint32_t tick, uint32_t prev_tick) +{ + /*Unsigned overflow is well-defined and works for a single wrap around*/ + return tick - prev_tick; +} + +void lv_delay_ms(uint32_t ms) +{ + if(state.delay_cb) { + state.delay_cb(ms); + } + else { + uint32_t t = lv_tick_get(); + while(lv_tick_elaps(t) < ms) { + /*Do something to no call `lv_tick_elaps` too often as it might interfere with interrupts*/ + volatile uint32_t i; + volatile uint32_t x = ms; + for(i = 0; i < 100; i++) { + x = x * 3; + } + } + } +} + +void lv_tick_set_cb(lv_tick_get_cb_t cb) +{ + state.tick_get_cb = cb; +} + +lv_tick_get_cb_t lv_tick_get_cb(void) +{ + return state.tick_get_cb; +} + +void lv_delay_set_cb(lv_delay_cb_t cb) +{ + state.delay_cb = cb; +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/inc/lvgl/src/tick/lv_tick.h b/inc/lvgl/src/tick/lv_tick.h new file mode 100644 index 0000000..838fe8b --- /dev/null +++ b/inc/lvgl/src/tick/lv_tick.h @@ -0,0 +1,100 @@ +/** + * @file lv_tick.h + * Provide access to the system tick with 1 millisecond resolution + */ + +#ifndef LV_TICK_H +#define LV_TICK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#include "../misc/lv_types.h" + +/********************* + * DEFINES + *********************/ +#ifndef LV_ATTRIBUTE_TICK_INC +#define LV_ATTRIBUTE_TICK_INC +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef uint32_t (*lv_tick_get_cb_t)(void); + +typedef void (*lv_delay_cb_t)(uint32_t ms); + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * You have to call this function periodically. + * It is typically safe to call from an interrupt handler or a different thread. + * @param tick_period the call period of this function in milliseconds + */ +LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period); + +/** + * Get the elapsed milliseconds since start up + * @return the elapsed milliseconds + */ +uint32_t lv_tick_get(void); + +/** + * Get the elapsed milliseconds since a previous time stamp + * @param prev_tick a previous time stamp (return value of lv_tick_get() ) + * @return the elapsed milliseconds since 'prev_tick' + */ +uint32_t lv_tick_elaps(uint32_t prev_tick); + +/** + * Get the elapsed milliseconds between two time stamps + * @param tick a time stamp + * @param prev_tick a time stamp before `tick` + * @return the elapsed milliseconds between `prev_tick` and `tick` + */ +uint32_t lv_tick_diff(uint32_t tick, uint32_t prev_tick); + +/** + * Delay for the given milliseconds. + * By default it's a blocking delay, but with `lv_delay_set_cb()` + * a custom delay function can be set too + * @param ms the number of milliseconds to delay + */ +void lv_delay_ms(uint32_t ms); + +/** + * Set a callback for a blocking delay + * @param cb pointer to a callback + */ +void lv_delay_set_cb(lv_delay_cb_t cb); + +/** + * Set the custom callback for 'lv_tick_get' + * @param cb call this callback on 'lv_tick_get' + */ +void lv_tick_set_cb(lv_tick_get_cb_t cb); + +/** + * Get the custom callback for 'lv_tick_get' + * @return call this callback on 'lv_tick_get' + */ +lv_tick_get_cb_t lv_tick_get_cb(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TICK_H*/ diff --git a/inc/lvgl/src/tick/lv_tick_private.h b/inc/lvgl/src/tick/lv_tick_private.h new file mode 100644 index 0000000..2450f32 --- /dev/null +++ b/inc/lvgl/src/tick/lv_tick_private.h @@ -0,0 +1,46 @@ +/** + * @file lv_tick_private.h + * + */ + +#ifndef LV_TICK_PRIVATE_H +#define LV_TICK_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_tick.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + volatile uint32_t sys_time; + volatile uint8_t sys_irq_flag; + lv_tick_get_cb_t tick_get_cb; + lv_delay_cb_t delay_cb; +} lv_tick_state_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TICK_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/3dtexture/lv_3dtexture.c b/inc/lvgl/src/widgets/3dtexture/lv_3dtexture.c new file mode 100644 index 0000000..9c76dca --- /dev/null +++ b/inc/lvgl/src/widgets/3dtexture/lv_3dtexture.c @@ -0,0 +1,162 @@ +/** + * @file lv_3dtexture.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_3dtexture_private.h" +#if LV_USE_3DTEXTURE + +#include "../../core/lv_obj_class_private.h" +#include "../../draw/lv_draw_3d.h" + +/********************* + * DEFINES + *********************/ + +#define MY_CLASS (&lv_3dtexture_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_3dtexture_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_3dtexture_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_3dtexture_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_3dtexture(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_3dtexture_class = { + .constructor_cb = lv_3dtexture_constructor, + .destructor_cb = lv_3dtexture_destructor, + .event_cb = lv_3dtexture_event, + .width_def = LV_DPI_DEF, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_3dtexture_t), + .base_class = &lv_obj_class, + .name = "3dtexture", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_3dtexture_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_3dtexture_set_src(lv_obj_t * obj, lv_3dtexture_id_t id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_3dtexture_t * tex = (lv_3dtexture_t *)obj; + tex->id = id; +} + +void lv_3dtexture_set_flip(lv_obj_t * obj, bool h_flip, bool v_flip) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_3dtexture_t * tex = (lv_3dtexture_t *)obj; + + if(tex->h_flip == h_flip && tex->v_flip == v_flip) return; + + tex->h_flip = h_flip; + tex->v_flip = v_flip; + + lv_obj_invalidate(obj); +} + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/*===================== + * Getter functions + *====================*/ + +/*===================== + * Other functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_3dtexture_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_3dtexture_t * tex = (lv_3dtexture_t *)obj; + tex->id = LV_3DTEXTURE_ID_NULL; + tex->h_flip = false; + tex->v_flip = false; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_3dtexture_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_3dtexture_t * tex = (lv_3dtexture_t *)obj; + LV_UNUSED(tex); +} + +static void lv_3dtexture_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + + if(code == LV_EVENT_DRAW_MAIN) { + draw_3dtexture(e); + } +} + +static void draw_3dtexture(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_3dtexture_t * tex = (lv_3dtexture_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + lv_draw_3d_dsc_t dsc; + lv_draw_3d_dsc_init(&dsc); + dsc.tex_id = tex->id; + dsc.opa = lv_obj_get_style_opa(obj, LV_PART_MAIN); + dsc.h_flip = tex->h_flip; + dsc.v_flip = tex->v_flip; + lv_area_t coords; + lv_obj_get_coords(obj, &coords); + lv_draw_3d(layer, &dsc, &coords); +} + +#endif /*LV_USE_3DTEXTURE*/ diff --git a/inc/lvgl/src/widgets/3dtexture/lv_3dtexture.h b/inc/lvgl/src/widgets/3dtexture/lv_3dtexture.h new file mode 100644 index 0000000..f5b522d --- /dev/null +++ b/inc/lvgl/src/widgets/3dtexture/lv_3dtexture.h @@ -0,0 +1,86 @@ +/** + * @file lv_3dtexture.h + * + */ + +#ifndef LV_3DTEXTURE_H +#define LV_3DTEXTURE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_3DTEXTURE + +#include "../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_3dtexture_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a 3dtexture object + * @param parent pointer to an object, it will be the parent of the new 3dtexture + * @return pointer to the created 3dtexture + */ +lv_obj_t * lv_3dtexture_create(lv_obj_t * parent); + +/** + * Set the source texture of the widget. + * The object size should be manually set to match. + * @param obj the 3dtexture widget + * @param id the texture handle from the 3D graphics backend. + * I.e., an `unsigned int` texture for OpenGL. + */ +void lv_3dtexture_set_src(lv_obj_t * obj, lv_3dtexture_id_t id); + +/** + * Set the flipping behavior of the widget. + * @param obj the 3dtexture widget + * @param h_flip true to flip horizontally. + * @param v_flip true to flip vertically. + */ +void lv_3dtexture_set_flip(lv_obj_t * obj, bool h_flip, bool v_flip); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/*===================== + * Getter functions + *====================*/ + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_3DTEXTURE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_3DTEXTURE_H*/ diff --git a/inc/lvgl/src/widgets/3dtexture/lv_3dtexture_private.h b/inc/lvgl/src/widgets/3dtexture/lv_3dtexture_private.h new file mode 100644 index 0000000..744fef6 --- /dev/null +++ b/inc/lvgl/src/widgets/3dtexture/lv_3dtexture_private.h @@ -0,0 +1,52 @@ +/** + * @file lv_3dtexture_private.h + * + */ + +#ifndef LV_3DTEXTURE_PRIVATE_H +#define LV_3DTEXTURE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_3dtexture.h" +#if LV_USE_3DTEXTURE + +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of 3dtexture*/ +struct _lv_3dtexture_t { + lv_obj_t obj; + lv_3dtexture_id_t id; + bool h_flip; + bool v_flip; +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_3DTEXTURE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_3DTEXTURE_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/animimage/lv_animimage.c b/inc/lvgl/src/widgets/animimage/lv_animimage.c new file mode 100644 index 0000000..2149b0a --- /dev/null +++ b/inc/lvgl/src/widgets/animimage/lv_animimage.c @@ -0,0 +1,262 @@ +/** + * @file lv_animimage.c + * + */ + +/** + * Modified by NXP in 2025 + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_animimage_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_ANIMIMG != 0 + +/*Testing of dependencies*/ +#if LV_USE_IMAGE == 0 + #error "lv_animimg: lv_img is required. Enable it in lv_conf.h (LV_USE_IMAGE 1) " +#endif + +#include "../../draw/lv_image_decoder.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_fs.h" +#include "../../misc/lv_text_private.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_log.h" +#include "../../misc/lv_anim.h" + +/********************* + * DEFINES + *********************/ +#define LV_OBJX_NAME "lv_animimg" + +#define MY_CLASS (&lv_animimg_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void index_change(lv_obj_t * obj, int32_t idx); +static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_animimg_set_src_inner(lv_obj_t * obj, const void * dsc[], size_t num, bool reverse); + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_animimage_properties[] = { + { + .id = LV_PROPERTY_ANIMIMAGE_SRC, + .setter = lv_animimg_set_src, + .getter = lv_animimg_get_src, + }, + { + .id = LV_PROPERTY_ANIMIMAGE_DURATION, + .setter = lv_animimg_set_duration, + .getter = lv_animimg_get_duration, + }, + { + .id = LV_PROPERTY_ANIMIMAGE_REPEAT_COUNT, + .setter = lv_animimg_set_repeat_count, + .getter = lv_animimg_get_repeat_count, + }, + { + .id = LV_PROPERTY_ANIMIMAGE_SRC_COUNT, + .setter = NULL, + .getter = lv_animimg_get_src_count, + }, +}; +#endif + +const lv_obj_class_t lv_animimg_class = { + .constructor_cb = lv_animimg_constructor, + .instance_size = sizeof(lv_animimg_t), + .base_class = &lv_image_class, + .name = "lv_animimg", + LV_PROPERTY_CLASS_FIELDS(animimage, ANIMIMAGE) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_animimg_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_animimg_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_animimg_set_src(lv_obj_t * obj, const void * dsc[], size_t num) +{ + lv_animimg_set_src_inner(obj, dsc, num, false); +} + +void lv_animimg_set_src_reverse(lv_obj_t * obj, const void * dsc[], size_t num) +{ + lv_animimg_set_src_inner(obj, dsc, num, true); +} + +void lv_animimg_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_start(&animimg->anim); +} + +bool lv_animimg_delete(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return lv_anim_delete(animimg, NULL); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_animimg_set_duration(lv_obj_t * obj, uint32_t duration) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_duration(&animimg->anim, duration); + lv_anim_set_reverse_delay(&animimg->anim, duration); +} + +void lv_animimg_set_repeat_count(lv_obj_t * obj, uint32_t count) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_repeat_count(&animimg->anim, count); +} + +void lv_animimg_set_reverse_duration(lv_obj_t * obj, uint32_t duration) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_reverse_duration(&animimg->anim, duration); +} + +void lv_animimg_set_reverse_delay(lv_obj_t * obj, uint32_t duration) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_reverse_delay(&animimg->anim, duration); +} + +void lv_animimg_set_start_cb(lv_obj_t * obj, lv_anim_start_cb_t start_cb) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_start_cb(&animimg->anim, start_cb); +} + +void lv_animimg_set_completed_cb(lv_obj_t * obj, lv_anim_completed_cb_t completed_cb) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + lv_anim_set_completed_cb(&animimg->anim, completed_cb); +} + +/*===================== + * Getter functions + *====================*/ + +const void ** lv_animimg_get_src(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return animimg->dsc; +} + +uint8_t lv_animimg_get_src_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return animimg->pic_count; +} + +uint32_t lv_animimg_get_duration(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return lv_anim_get_time(&animimg->anim); +} + +uint32_t lv_animimg_get_repeat_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return lv_anim_get_repeat_count(&animimg->anim); +} + +lv_anim_t * lv_animimg_get_anim(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + return &animimg->anim; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_animimg_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + + animimg->dsc = NULL; + animimg->pic_count = -1; + + /*initial animation*/ + lv_anim_init(&animimg->anim); + lv_anim_set_var(&animimg->anim, obj); + lv_anim_set_duration(&animimg->anim, 30); + lv_anim_set_exec_cb(&animimg->anim, (lv_anim_exec_xcb_t)index_change); + lv_anim_set_values(&animimg->anim, 0, 1); + lv_anim_set_repeat_count(&animimg->anim, LV_ANIM_REPEAT_INFINITE); +} + +static void index_change(lv_obj_t * obj, int32_t idx) +{ + lv_animimg_t * animimg = (lv_animimg_t *)obj; + + if(animimg->dsc == NULL) { + LV_LOG_WARN("dsc is null"); + return; + } + + if(idx >= animimg->pic_count) idx = animimg->pic_count - 1; + + lv_image_set_src(obj, animimg->dsc[idx]); +} + +static void lv_animimg_set_src_inner(lv_obj_t * obj, const void * dsc[], size_t num, bool reverse) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_animimg_t * animimg = (lv_animimg_t *)obj; + animimg->dsc = dsc; + animimg->pic_count = num; + if(reverse) { + lv_anim_set_values(&animimg->anim, (int32_t)num, 0); + } + else { + lv_anim_set_values(&animimg->anim, 0, (int32_t)num); + } +} + +#endif diff --git a/inc/lvgl/src/widgets/animimage/lv_animimage.h b/inc/lvgl/src/widgets/animimage/lv_animimage.h new file mode 100644 index 0000000..d193ad5 --- /dev/null +++ b/inc/lvgl/src/widgets/animimage/lv_animimage.h @@ -0,0 +1,185 @@ +/** + * @file lv_animimage.h + * + */ + +/** + * Modified by NXP in 2025 + */ + +#ifndef LV_ANIMIMAGE_H +#define LV_ANIMIMAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../image/lv_image.h" +#include "../../misc/lv_types.h" + +#if LV_USE_ANIMIMG != 0 + +/*Testing of dependencies*/ +#if LV_USE_IMAGE == 0 +#error "lv_animimg: lv_img is required. Enable it in lv_conf.h (LV_USE_IMAGE 1)" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_animimage_id_t { + LV_PROPERTY_ID2(ANIMIMAGE, SRC, LV_PROPERTY_TYPE_POINTER, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(ANIMIMAGE, DURATION, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(ANIMIMAGE, REPEAT_COUNT, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(ANIMIMAGE, SRC_COUNT, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ANIMIMAGE_END, +}; +#endif + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_animimg_class; + +/** Image parts */ +typedef enum { + LV_ANIM_IMAGE_PART_MAIN, +} lv_animimg_part_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an animation image objects + * @param parent pointer to an object, it will be the parent of the new button + * @return pointer to the created animation image object + */ +lv_obj_t * lv_animimg_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the image animation images source. + * @param obj pointer to an animation image object + * @param dsc pointer to a series images + * @param num images' number + */ +void lv_animimg_set_src(lv_obj_t * obj, const void * dsc[], size_t num); + +/** + * Set the images source for flip playback of animation image. + * @param obj pointer to an animation image object + * @param dsc pointer to a series images + * @param num images' number + */ +void lv_animimg_set_src_reverse(lv_obj_t * obj, const void * dsc[], size_t num); + +/** + * Startup the image animation. + * @param obj pointer to an animation image object + */ +void lv_animimg_start(lv_obj_t * obj); + +/** + * Delete the image animation. + * @param obj pointer to an animation image object + */ +bool lv_animimg_delete(lv_obj_t * obj); + +/** + * Set the image animation duration time. unit:ms + * @param obj pointer to an animation image object + * @param duration the duration in milliseconds + */ +void lv_animimg_set_duration(lv_obj_t * obj, uint32_t duration); + +/** + * Set the image animation repeatedly play times. + * @param obj pointer to an animation image object + * @param count the number of times to repeat the animation + */ +void lv_animimg_set_repeat_count(lv_obj_t * obj, uint32_t count); + +/** + * Make the image animation to play back to when the forward direction is ready. + * @param obj pointer to an animation image object + * @param duration the duration of the playback image animation in milliseconds. 0: disable playback + */ +void lv_animimg_set_reverse_duration(lv_obj_t * obj, uint32_t duration); + +/** + * Make the image animation to play back to when the forward direction is ready. + * @param obj pointer to an animation image object + * @param duration delay in milliseconds before starting the playback image animation. + */ +void lv_animimg_set_reverse_delay(lv_obj_t * obj, uint32_t duration); + +/** + * Set a function call when the animation image really starts (considering `delay`) + * @param obj pointer to an animation image object + * @param start_cb a function call when the animation is start + */ +void lv_animimg_set_start_cb(lv_obj_t * obj, lv_anim_start_cb_t start_cb); + +/** + * Set a function call when the animation is completed + * @param obj pointer to an animation image object + * @param completed_cb a function call when the animation is completed + */ +void lv_animimg_set_completed_cb(lv_obj_t * obj, lv_anim_completed_cb_t completed_cb); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the image animation images source. + * @param obj pointer to an animation image object + * @return a pointer that will point to a series images + */ +const void ** lv_animimg_get_src(lv_obj_t * obj); + +/** + * Get the image animation images source. + * @param obj pointer to an animation image object + * @return the number of source images + */ +uint8_t lv_animimg_get_src_count(lv_obj_t * obj); + +/** + * Get the image animation duration time. unit:ms + * @param obj pointer to an animation image object + * @return the animation duration time + */ +uint32_t lv_animimg_get_duration(lv_obj_t * obj); + +/** + * Get the image animation repeat play times. + * @param obj pointer to an animation image object + * @return the repeat count + */ +uint32_t lv_animimg_get_repeat_count(lv_obj_t * obj); + +/** + * Get the image animation underlying animation. + * @param obj pointer to an animation image object + * @return the animation reference + */ +lv_anim_t * lv_animimg_get_anim(lv_obj_t * obj); + +#endif /*LV_USE_ANIMIMG*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_ANIMIMAGE_H*/ diff --git a/inc/lvgl/src/widgets/animimage/lv_animimage_private.h b/inc/lvgl/src/widgets/animimage/lv_animimage_private.h new file mode 100644 index 0000000..a5ef5eb --- /dev/null +++ b/inc/lvgl/src/widgets/animimage/lv_animimage_private.h @@ -0,0 +1,55 @@ +/** + * @file lv_animimage_private.h + * + */ + +#ifndef LV_ANIMIMAGE_PRIVATE_H +#define LV_ANIMIMAGE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../image/lv_image_private.h" +#include "../../misc/lv_anim_private.h" +#include "lv_animimage.h" + +#if LV_USE_ANIMIMG != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Data of the animimage */ +struct _lv_animimg_t { + lv_image_t img; + lv_anim_t anim; + /* picture sequence */ + const void ** dsc; + int8_t pic_count; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_ANIMIMG != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ANIMIMAGE_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/arc/lv_arc.c b/inc/lvgl/src/widgets/arc/lv_arc.c new file mode 100644 index 0000000..9714a0b --- /dev/null +++ b/inc/lvgl/src/widgets/arc/lv_arc.c @@ -0,0 +1,1165 @@ +/** + * @file lv_arc.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_arc_private.h" +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_event_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_ARC != 0 + +#include "../../core/lv_group.h" +#include "../../indev/lv_indev.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../draw/lv_draw_arc.h" +#include "../../core/lv_observer_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_arc_class) + +#define VALUE_UNSET INT16_MIN +#define CLICK_OUTSIDE_BG_ANGLES ((uint32_t) 0x00U) +#define CLICK_INSIDE_BG_ANGLES ((uint32_t) 0x01U) +#define CLICK_CLOSER_TO_MAX_END ((uint32_t) 0x00U) +#define CLICK_CLOSER_TO_MIN_END ((uint32_t) 0x01U) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_arc_draw(lv_event_t * e); +static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void inv_arc_area(lv_obj_t * arc, lv_value_precise_t start_angle, lv_value_precise_t end_angle, lv_part_t part); +static void inv_knob_area(lv_obj_t * obj); +static void get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r); +static lv_value_precise_t get_angle(const lv_obj_t * obj); +static void get_knob_area(lv_obj_t * arc, const lv_point_t * center, int32_t r, lv_area_t * knob_area); +static void value_update(lv_obj_t * arc); +static int32_t knob_get_extra_size(lv_obj_t * obj); +static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const lv_value_precise_t angle, + const lv_value_precise_t tolerance_deg); +static int32_t get_indicator_max_pad(lv_obj_t * obj); +#if LV_USE_OBSERVER + static void arc_value_changed_event_cb(lv_event_t * e); + static void arc_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif /*LV_USE_OBSERVER*/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_arc_properties[] = { + { + .id = LV_PROPERTY_ARC_START_ANGLE, + .setter = lv_arc_set_start_angle, + .getter = lv_arc_get_angle_start, + }, + { + .id = LV_PROPERTY_ARC_END_ANGLE, + .setter = lv_arc_set_end_angle, + .getter = lv_arc_get_angle_end, + }, + { + .id = LV_PROPERTY_ARC_BG_START_ANGLE, + .setter = lv_arc_set_bg_start_angle, + .getter = lv_arc_get_bg_angle_start, + }, + { + .id = LV_PROPERTY_ARC_BG_END_ANGLE, + .setter = lv_arc_set_bg_end_angle, + .getter = lv_arc_get_bg_angle_end, + }, + { + .id = LV_PROPERTY_ARC_ROTATION, + .setter = lv_arc_set_rotation, + .getter = lv_arc_get_rotation, + }, + { + .id = LV_PROPERTY_ARC_MODE, + .setter = lv_arc_set_mode, + .getter = lv_arc_get_mode, + }, + { + .id = LV_PROPERTY_ARC_VALUE, + .setter = lv_arc_set_value, + .getter = lv_arc_get_value, + }, + { + .id = LV_PROPERTY_ARC_MIN_VALUE, + .setter = lv_arc_set_min_value, + .getter = lv_arc_get_min_value, + }, + { + .id = LV_PROPERTY_ARC_MAX_VALUE, + .setter = lv_arc_set_max_value, + .getter = lv_arc_get_max_value, + }, + { + .id = LV_PROPERTY_ARC_CHANGE_RATE, + .setter = lv_arc_set_change_rate, + .getter = lv_arc_get_change_rate, + }, + { + .id = LV_PROPERTY_ARC_KNOB_OFFSET, + .setter = lv_arc_set_knob_offset, + .getter = lv_arc_get_knob_offset, + }, +}; +#endif + +const lv_obj_class_t lv_arc_class = { + .constructor_cb = lv_arc_constructor, + .event_cb = lv_arc_event, + .instance_size = sizeof(lv_arc_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .base_class = &lv_obj_class, + .name = "lv_arc", + LV_PROPERTY_CLASS_FIELDS(arc, ARC) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_arc_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/* + * New object specific "add" or "remove" functions come here + */ + +/*===================== + * Setter functions + *====================*/ + +void lv_arc_set_start_angle(lv_obj_t * obj, lv_value_precise_t start) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(start > 360) start -= 360; + + lv_value_precise_t old_delta = arc->indic_angle_end - arc->indic_angle_start; + lv_value_precise_t new_delta = arc->indic_angle_end - start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, arc->indic_angle_start, start, LV_PART_INDICATOR); + else if(old_delta < new_delta) inv_arc_area(obj, start, arc->indic_angle_start, LV_PART_INDICATOR); + + inv_knob_area(obj); + + arc->indic_angle_start = start; + + inv_knob_area(obj); +} + +void lv_arc_set_end_angle(lv_obj_t * obj, lv_value_precise_t end) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + if(end > 360) end -= 360; + + lv_value_precise_t old_delta = arc->indic_angle_end - arc->indic_angle_start; + lv_value_precise_t new_delta = end - arc->indic_angle_start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, end, arc->indic_angle_end, LV_PART_INDICATOR); + else if(old_delta < new_delta) inv_arc_area(obj, arc->indic_angle_end, end, LV_PART_INDICATOR); + + inv_knob_area(obj); + + arc->indic_angle_end = end; + + inv_knob_area(obj); +} + +void lv_arc_set_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end) +{ + lv_arc_set_end_angle(obj, end); + lv_arc_set_start_angle(obj, start); +} + +void lv_arc_set_bg_start_angle(lv_obj_t * obj, lv_value_precise_t start) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(start > 360) start -= 360; + + lv_value_precise_t old_delta = arc->bg_angle_end - arc->bg_angle_start; + lv_value_precise_t new_delta = arc->bg_angle_end - start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, arc->bg_angle_start, start, LV_PART_MAIN); + else if(old_delta < new_delta) inv_arc_area(obj, start, arc->bg_angle_start, LV_PART_MAIN); + + arc->bg_angle_start = start; + + value_update(obj); +} + +void lv_arc_set_bg_end_angle(lv_obj_t * obj, lv_value_precise_t end) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(end > 360) end -= 360; + + lv_value_precise_t old_delta = arc->bg_angle_end - arc->bg_angle_start; + lv_value_precise_t new_delta = end - arc->bg_angle_start; + + if(old_delta < 0) old_delta = 360 + old_delta; + if(new_delta < 0) new_delta = 360 + new_delta; + + if(LV_ABS(new_delta - old_delta) > 180) lv_obj_invalidate(obj); + else if(new_delta < old_delta) inv_arc_area(obj, end, arc->bg_angle_end, LV_PART_MAIN); + else if(old_delta < new_delta) inv_arc_area(obj, arc->bg_angle_end, end, LV_PART_MAIN); + + arc->bg_angle_end = end; + + value_update(obj); +} + +void lv_arc_set_bg_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end) +{ + lv_arc_set_bg_end_angle(obj, end); + lv_arc_set_bg_start_angle(obj, start); +} + +void lv_arc_set_rotation(lv_obj_t * obj, int32_t rotation) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + /* ensure the angle is in the range [0, 360) */ + while(rotation < 0) rotation += 360; + while(rotation >= 360) rotation -= 360; + arc->rotation = rotation; + + lv_obj_invalidate(obj); +} + +void lv_arc_set_mode(lv_obj_t * obj, lv_arc_mode_t type) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + int32_t val = arc->value; + + arc->type = type; + arc->value = -1; /** Force set_value handling*/ + + lv_value_precise_t bg_midpoint, bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; + + switch(arc->type) { + case LV_ARC_MODE_SYMMETRICAL: + bg_midpoint = (arc->bg_angle_start + bg_end) / 2; + lv_arc_set_start_angle(obj, bg_midpoint); + lv_arc_set_end_angle(obj, bg_midpoint); + break; + case LV_ARC_MODE_REVERSE: + lv_arc_set_end_angle(obj, arc->bg_angle_end); + break; + default: /** LV_ARC_TYPE_NORMAL*/ + lv_arc_set_start_angle(obj, arc->bg_angle_start); + } + + lv_arc_set_value(obj, val); +} + +void lv_arc_set_value(lv_obj_t * obj, int32_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(arc->value == value) return; + + int32_t new_value; + new_value = value > arc->max_value ? arc->max_value : value; + new_value = new_value < arc->min_value ? arc->min_value : new_value; + + if(arc->value == new_value) return; + arc->value = new_value; + + value_update(obj); +} + +void lv_arc_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + if(arc->min_value == min && arc->max_value == max) return; + + arc->min_value = min; + arc->max_value = max; + + if(arc->value < min) { + arc->value = min; + } + if(arc->value > max) { + arc->value = max; + } + + value_update(obj); /*value has changed relative to the new range*/ +} + +void lv_arc_set_min_value(lv_obj_t * obj, int32_t min) +{ + lv_arc_set_range(obj, min, lv_arc_get_max_value(obj)); +} + +void lv_arc_set_max_value(lv_obj_t * obj, int32_t max) +{ + lv_arc_set_range(obj, lv_arc_get_min_value(obj), max); +} + +void lv_arc_set_change_rate(lv_obj_t * obj, uint32_t rate) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + arc->chg_rate = rate; +} + +void lv_arc_set_knob_offset(lv_obj_t * obj, int32_t offset) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + arc->knob_offset = offset; +} + +/*===================== + * Getter functions + *====================*/ + +lv_value_precise_t lv_arc_get_angle_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->indic_angle_start; +} + +lv_value_precise_t lv_arc_get_angle_end(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->indic_angle_end; +} + +lv_value_precise_t lv_arc_get_bg_angle_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->bg_angle_start; +} + +lv_value_precise_t lv_arc_get_bg_angle_end(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->bg_angle_end; +} + +int32_t lv_arc_get_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->value; +} + +int32_t lv_arc_get_min_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->min_value; +} + +int32_t lv_arc_get_max_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->max_value; +} + +lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *) obj)->type; +} + +int32_t lv_arc_get_rotation(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *)obj)->rotation; +} + +int32_t lv_arc_get_knob_offset(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *)obj)->knob_offset; +} + +uint32_t lv_arc_get_change_rate(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arc_t *)obj)->chg_rate; +} + +/*===================== + * Other functions + *====================*/ + +#if LV_USE_OBSERVER +lv_observer_t * lv_arc_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(subject->type != LV_SUBJECT_TYPE_INT && subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_obj_add_event_cb(obj, arc_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, arc_value_observer_cb, obj, NULL); + return observer; +} +#endif /*LV_USE_OBSERVER*/ + + +void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, int32_t r_offset) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(obj_to_align); + + lv_obj_update_layout(obj); + + lv_point_t center; + int32_t arc_r; + get_center(obj, ¢er, &arc_r); + int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + int32_t indic_width_half = indic_width / 2; + arc_r -= indic_width_half; + arc_r += r_offset; + + int32_t angle = (int32_t)get_angle(obj); + int32_t knob_x = (arc_r * lv_trigo_sin(angle + 90)) >> LV_TRIGO_SHIFT; + int32_t knob_y = (arc_r * lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT; + lv_obj_align_to(obj_to_align, obj, LV_ALIGN_CENTER, knob_x, knob_y); +} + +void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, int32_t r_offset) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(obj_to_rotate); + + lv_obj_update_layout(obj); + + lv_point_t center; + int32_t arc_r; + get_center(obj, ¢er, &arc_r); + int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + int32_t indic_width_half = indic_width / 2; + arc_r -= indic_width_half; + + arc_r += r_offset; + lv_obj_align_to(obj_to_rotate, obj, LV_ALIGN_CENTER, 0, -arc_r); + + lv_obj_update_layout(obj); + + int32_t angle = (int32_t)get_angle(obj); + int32_t pivot_x = obj_to_rotate->coords.x1 - center.x; + int32_t pivot_y = obj_to_rotate->coords.y1 - center.y; + lv_obj_set_style_transform_pivot_x(obj_to_rotate, -pivot_x, 0); + lv_obj_set_style_transform_pivot_y(obj_to_rotate, -pivot_y, 0); + lv_obj_set_style_transform_rotation(obj_to_rotate, angle * 10 + 900, 0); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_arc_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_arc_t * arc = (lv_arc_t *)obj; + + /*Initialize the allocated 'ext'*/ + arc->rotation = 0; + arc->bg_angle_start = 135; + arc->bg_angle_end = 45; + arc->indic_angle_start = 135; + arc->indic_angle_end = 270; + arc->type = LV_ARC_MODE_NORMAL; + arc->value = VALUE_UNSET; + arc->min_close = CLICK_CLOSER_TO_MIN_END; + arc->min_value = 0; + arc->max_value = 100; + arc->dragging = false; + arc->chg_rate = 720; + arc->last_tick = lv_tick_get(); + arc->last_angle = arc->indic_angle_end; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN | LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_ext_click_area(obj, LV_DPI_DEF / 10); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_arc_t * arc = (lv_arc_t *)obj; + if(code == LV_EVENT_PRESSING) { + lv_indev_t * indev = lv_indev_active(); + if(indev == NULL) return; + + /*Handle only pointers here*/ + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type != LV_INDEV_TYPE_POINTER) return; + + lv_point_t p; + lv_indev_get_point(indev, &p); + + /*Make point relative to the arc's center*/ + lv_point_t center; + int32_t r; + get_center(obj, ¢er, &r); + + p.x -= center.x; + p.y -= center.y; + + /*Enter dragging mode if pressed out of the knob*/ + if(arc->dragging == false) { + int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + r -= indic_width; + /*Add some more sensitive area if there is no advanced hit testing. + * (Advanced hit testing is more precise)*/ + if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) { + r -= indic_width; + } + else { + r -= LV_MAX(r / 4, indic_width); + } + if(r < 1) r = 1; + + if(p.x * p.x + p.y * p.y > r * r) { + arc->dragging = true; + arc->last_tick = lv_tick_get(); /*Capture timestamp at dragging start*/ + } + } + + /*It must be in "dragging" mode to turn the arc*/ + if(arc->dragging == false) return; + + /*No angle can be determined if exactly the middle of the arc is being pressed*/ + if(p.x == 0 && p.y == 0) return; + + /*Calculate the angle of the pressed point*/ + lv_value_precise_t angle; + lv_value_precise_t bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) { + bg_end = arc->bg_angle_end + 360; + } + + angle = lv_atan2(p.y, p.x); + angle -= arc->rotation; + angle -= arc->bg_angle_start; /*Make the angle relative to the start angle*/ + + + /* ensure the angle is in the range [0, 360) */ + while(angle < 0) angle += 360; + while(angle >= 360) angle -= 360; + + + const uint32_t circumference = (uint32_t)((2U * r * 314U) / 100U); /* Equivalent to: 2r * 3.14, avoiding floats */ + const lv_value_precise_t tolerance_deg = (360 * lv_dpx(20U)) / circumference; + const uint32_t min_close_prev = (uint32_t) arc->min_close; + + const bool is_angle_within_bg_bounds = lv_arc_angle_within_bg_bounds(obj, angle, tolerance_deg); + if(!is_angle_within_bg_bounds) { + return; + } + + lv_value_precise_t deg_range = bg_end - arc->bg_angle_start; + lv_value_precise_t last_angle_rel = arc->last_angle - arc->bg_angle_start; + lv_value_precise_t delta_angle = angle - last_angle_rel; + + /*Do not allow big jumps (jumps bigger than 280°). + *It's mainly to avoid jumping to the opposite end if the "dead" range between min. and max. is crossed. + *Check which end was closer on the last valid press (arc->min_close) and prefer that end*/ + if(LV_ABS(delta_angle) > 280) { + if(arc->min_close == CLICK_CLOSER_TO_MIN_END) angle = 0; + else angle = deg_range; + } + /* Check if click was outside the background arc start and end angles */ + else if(CLICK_OUTSIDE_BG_ANGLES == arc->in_out) { + if(arc->min_close == CLICK_CLOSER_TO_MIN_END) angle = -deg_range; + else angle = deg_range; + } + else { /* Keep the angle value */ } + + /* Prevent big jumps when the click goes from start to end angle in the invisible + * part of the background arc without being released */ + if(((min_close_prev == CLICK_CLOSER_TO_MIN_END) && (arc->min_close == CLICK_CLOSER_TO_MAX_END)) + && ((CLICK_OUTSIDE_BG_ANGLES == arc->in_out) && (LV_ABS(delta_angle) > 280))) { + angle = 0; + arc->min_close = min_close_prev; + } + else if(((min_close_prev == CLICK_CLOSER_TO_MAX_END) && (arc->min_close == CLICK_CLOSER_TO_MIN_END)) + && (CLICK_OUTSIDE_BG_ANGLES == arc->in_out) && (360 - LV_ABS(delta_angle) > 280)) { + angle = deg_range; + arc->min_close = min_close_prev; + } + else { /* Keep the angle value */ } + + /*Calculate the slew rate limited angle based on change rate (degrees/sec)*/ + delta_angle = angle - last_angle_rel; + + uint32_t delta_tick = lv_tick_elaps(arc->last_tick); + /* delta_angle_max can never be signed. delta_tick is always signed, same for ch_rate */ + const lv_value_precise_t delta_angle_max = (arc->chg_rate * delta_tick) / 1000; + + if(delta_angle > delta_angle_max) { + delta_angle = delta_angle_max; + } + else if(delta_angle < -delta_angle_max) { + delta_angle = -delta_angle_max; + } + else { /* Nothing to do */ } + + angle = last_angle_rel + delta_angle; /*Apply the limited angle change*/ + + /*Rounding for symmetry*/ + lv_value_precise_t round = ((bg_end - arc->bg_angle_start) * 8) / (arc->max_value - arc->min_value); + round = (round + 4) / 16; + angle += round; + + angle += arc->bg_angle_start; /*Make the angle absolute again*/ + + /*Set the new value*/ + int32_t old_value = arc->value; + int32_t new_value = lv_map((int32_t)angle, (int32_t)arc->bg_angle_start, (int32_t)bg_end, arc->min_value, + arc->max_value); + if(arc->type == LV_ARC_MODE_REVERSE) { + new_value = arc->max_value - new_value + arc->min_value; + } + + if(new_value != lv_arc_get_value(obj)) { + arc->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ + lv_arc_set_value(obj, new_value); /*set_value caches the last_angle for the next iteration*/ + if(new_value != old_value) { + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + + /*Don't let the elapsed time become too big while sitting on an end point*/ + if(new_value == arc->min_value || new_value == arc->max_value) { + arc->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ + } + } + else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + arc->dragging = false; + + /*Leave edit mode if released. (No need to wait for LONG_PRESS)*/ + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + if(editing) lv_group_set_editing(g, false); + } + + } + else if(code == LV_EVENT_KEY) { + uint32_t c = lv_event_get_key(e); + + int32_t old_value = arc->value; + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + lv_arc_set_value(obj, lv_arc_get_value(obj) + 1); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + lv_arc_set_value(obj, lv_arc_get_value(obj) - 1); + } + + if(old_value != arc->value) { + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + else if(code == LV_EVENT_ROTARY) { + int32_t r = lv_event_get_rotary_diff(e); + + int32_t old_value = arc->value; + lv_arc_set_value(obj, lv_arc_get_value(obj) + r); + if(old_value != arc->value) { + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + } + else if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e); + + lv_point_t p; + int32_t r; + get_center(obj, &p, &r); + + int32_t ext_click_area = 0; + if(obj->spec_attr) ext_click_area = obj->spec_attr->ext_click_pad; + + int32_t w = lv_obj_get_style_arc_width(obj, LV_PART_MAIN); + r -= w + ext_click_area; + + lv_area_t a; + /*Invalid if clicked inside*/ + lv_area_set(&a, p.x - r, p.y - r, p.x + r, p.y + r); + if(lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE)) { + info->res = false; + return; + } + + /*Calculate the angle of the pressed point*/ + lv_value_precise_t angle = lv_atan2(info->point->y - p.y, info->point->x - p.x); + angle -= arc->rotation; + angle -= arc->bg_angle_start; /*Make the angle relative to the start angle*/ + + /* ensure the angle is in the range [0, 360) */ + while(angle < 0) angle += 360; + while(angle >= 360) angle -= 360; + + const uint32_t circumference = (uint32_t)((2U * r * 314U) / 100U); /* Equivalent to: 2r * 3.14, avoiding floats */ + const lv_value_precise_t tolerance_deg = (360 * lv_dpx(20U)) / circumference; + + /* Check if the angle is outside the drawn background arc */ + const bool is_angle_within_bg_bounds = lv_arc_angle_within_bg_bounds(obj, angle, tolerance_deg); + if(!is_angle_within_bg_bounds) { + info->res = false; + return; + } + + /*Valid if no clicked outside*/ + lv_area_increase(&a, w + ext_click_area * 2, w + ext_click_area * 2); + info->res = lv_area_is_point_on(&a, info->point, LV_RADIUS_CIRCLE); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t bg_pad = LV_MAX4(bg_left, bg_right, bg_top, bg_bottom); + + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + int32_t knob_pad = LV_MAX4(knob_left, knob_right, knob_top, knob_bottom) + 2; + + int32_t knob_extra_size = knob_pad - bg_pad; + knob_extra_size += knob_get_extra_size(obj); + + int32_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_extra_size); + *s = LV_MAX(*s, lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR)); + + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_arc_draw(e); + } +} + +static void lv_arc_draw(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_arc_t * arc = (lv_arc_t *)obj; + + lv_layer_t * layer = lv_event_get_layer(e); + + lv_point_t center; + int32_t arc_r; + get_center(obj, ¢er, &arc_r); + + /*Draw the background arc*/ + lv_draw_arc_dsc_t arc_dsc; + if(arc_r > 0) { + lv_draw_arc_dsc_init(&arc_dsc); + arc_dsc.base.layer = layer; + lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &arc_dsc); + arc_dsc.center = center; + arc_dsc.start_angle = arc->bg_angle_start + arc->rotation; + arc_dsc.end_angle = arc->bg_angle_end + arc->rotation; + arc_dsc.radius = arc_r; + lv_draw_arc(layer, &arc_dsc); + } + + /*Make the indicator arc smaller or larger according to its greatest padding value*/ + int32_t indic_r = arc_r - get_indicator_max_pad(obj); + + if(indic_r > 0) { + lv_draw_arc_dsc_init(&arc_dsc); + arc_dsc.base.layer = layer; + lv_obj_init_draw_arc_dsc(obj, LV_PART_INDICATOR, &arc_dsc); + arc_dsc.center = center; + arc_dsc.start_angle = arc->indic_angle_start + arc->rotation; + arc_dsc.end_angle = arc->indic_angle_end + arc->rotation; + + arc_dsc.radius = indic_r; + + lv_draw_arc(layer, &arc_dsc); + } + + lv_area_t knob_area; + get_knob_area(obj, ¢er, arc_r, &knob_area); + + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + knob_rect_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); + lv_draw_rect(layer, &knob_rect_dsc, &knob_area); +} + +static void inv_arc_area(lv_obj_t * obj, lv_value_precise_t start_angle, lv_value_precise_t end_angle, lv_part_t part) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Skip this complicated invalidation if the arc is not visible*/ + if(lv_obj_is_visible(obj) == false) return; + + lv_arc_t * arc = (lv_arc_t *)obj; + + if(start_angle == end_angle) return; + + if(start_angle > 360) start_angle -= 360; + if(end_angle > 360) end_angle -= 360; + + start_angle += arc->rotation; + end_angle += arc->rotation; + + if(start_angle > 360) start_angle -= 360; + if(end_angle > 360) end_angle -= 360; + + int32_t r; + lv_point_t c; + get_center(obj, &c, &r); + + if(part == LV_PART_INDICATOR) { + r -= get_indicator_max_pad(obj); + } + + int32_t w = lv_obj_get_style_arc_width(obj, part); + bool rounded = lv_obj_get_style_arc_rounded(obj, part); + + lv_area_t inv_area; + lv_draw_arc_get_area(c.x, c.y, r, start_angle, end_angle, w, rounded, &inv_area); + + lv_obj_invalidate_area(obj, &inv_area); +} + +static void inv_knob_area(lv_obj_t * obj) +{ + lv_point_t c; + int32_t r; + get_center(obj, &c, &r); + + lv_area_t a; + get_knob_area(obj, &c, r, &a); + + int32_t knob_extra_size = knob_get_extra_size(obj); + + if(knob_extra_size > 0) { + lv_area_increase(&a, knob_extra_size, knob_extra_size); + } + + lv_obj_invalidate_area(obj, &a); +} + +static void get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r) +{ + int32_t left_bg = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t right_bg = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t top_bg = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bottom_bg = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + int32_t r = (LV_MIN(lv_obj_get_width(obj) - left_bg - right_bg, + lv_obj_get_height(obj) - top_bg - bottom_bg)) / 2; + + center->x = obj->coords.x1 + r + left_bg; + center->y = obj->coords.y1 + r + top_bg; + + if(arc_r) *arc_r = r; +} + +static lv_value_precise_t get_angle(const lv_obj_t * obj) +{ + lv_arc_t * arc = (lv_arc_t *)obj; + lv_value_precise_t angle = arc->rotation; + if(arc->type == LV_ARC_MODE_NORMAL) { + angle += arc->indic_angle_end; + } + else if(arc->type == LV_ARC_MODE_REVERSE) { + angle += arc->indic_angle_start; + } + else if(arc->type == LV_ARC_MODE_SYMMETRICAL) { + lv_value_precise_t bg_end = arc->bg_angle_end; + if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; + lv_value_precise_t indic_end = arc->indic_angle_end; + if(arc->indic_angle_end < arc->indic_angle_start) indic_end = arc->indic_angle_end + 360; + + lv_value_precise_t angle_midpoint = (int32_t)(arc->bg_angle_start + bg_end) / 2; + if(arc->indic_angle_start < angle_midpoint) angle += arc->indic_angle_start; + else if(indic_end > angle_midpoint) angle += arc->indic_angle_end; + else angle += angle_midpoint; + } + + return angle; +} + +static void get_knob_area(lv_obj_t * obj, const lv_point_t * center, int32_t r, lv_area_t * knob_area) +{ + int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR); + int32_t indic_width_half = indic_width / 2; + r -= indic_width_half; + + r -= get_indicator_max_pad(obj); + + int32_t angle = (int32_t)get_angle(obj); + int32_t knob_offset = lv_arc_get_knob_offset(obj); + int32_t knob_x = (r * lv_trigo_sin(knob_offset + angle + 90)) >> LV_TRIGO_SHIFT; + int32_t knob_y = (r * lv_trigo_sin(knob_offset + angle)) >> LV_TRIGO_SHIFT; + + int32_t left_knob = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t right_knob = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t top_knob = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t bottom_knob = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + knob_area->x1 = center->x + knob_x - left_knob - indic_width_half; + knob_area->x2 = center->x + knob_x + right_knob + indic_width_half; + knob_area->y1 = center->y + knob_y - top_knob - indic_width_half; + knob_area->y2 = center->y + knob_y + bottom_knob + indic_width_half; +} + +/** + * Used internally to update arc angles after a value change + * @param arc pointer to an arc object + */ +static void value_update(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + /*If the value is still not set to any value do not update*/ + if(arc->value == VALUE_UNSET) return; + + lv_value_precise_t bg_midpoint, bg_end = arc->bg_angle_end; + int32_t range_midpoint; + if(arc->bg_angle_end < arc->bg_angle_start) bg_end = arc->bg_angle_end + 360; + + int32_t angle; + switch(arc->type) { + case LV_ARC_MODE_SYMMETRICAL: + bg_midpoint = (arc->bg_angle_start + bg_end) / 2; + range_midpoint = (int32_t)(arc->min_value + arc->max_value) / 2; + + if(arc->value < range_midpoint) { + angle = lv_map(arc->value, arc->min_value, range_midpoint, (int32_t)arc->bg_angle_start, (int32_t)bg_midpoint); + lv_arc_set_start_angle(obj, angle); + lv_arc_set_end_angle(obj, bg_midpoint); + } + else { + angle = lv_map(arc->value, range_midpoint, arc->max_value, (int32_t)bg_midpoint, (int32_t)bg_end); + lv_arc_set_start_angle(obj, bg_midpoint); + lv_arc_set_end_angle(obj, angle); + } + break; + case LV_ARC_MODE_REVERSE: + angle = lv_map(arc->value, arc->min_value, arc->max_value, (int32_t)bg_end, (int32_t)arc->bg_angle_start); + lv_arc_set_angles(obj, angle, arc->bg_angle_end); + break; + case LV_ARC_MODE_NORMAL: + angle = lv_map(arc->value, arc->min_value, arc->max_value, (int32_t)arc->bg_angle_start, (int32_t)bg_end); + lv_arc_set_angles(obj, arc->bg_angle_start, angle); + + break; + default: + LV_LOG_WARN("Invalid mode: %d", arc->type); + return; + } + arc->last_angle = angle; /*Cache angle for slew rate limiting*/ +} + +static int32_t knob_get_extra_size(lv_obj_t * obj) +{ + int32_t knob_shadow_size = 0; + knob_shadow_size += lv_obj_get_style_shadow_width(obj, LV_PART_KNOB); + knob_shadow_size += lv_obj_get_style_shadow_spread(obj, LV_PART_KNOB); + knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_offset_x(obj, LV_PART_KNOB)); + knob_shadow_size += LV_ABS(lv_obj_get_style_shadow_offset_y(obj, LV_PART_KNOB)); + + int32_t knob_outline_size = 0; + knob_outline_size += lv_obj_get_style_outline_width(obj, LV_PART_KNOB); + knob_outline_size += lv_obj_get_style_outline_pad(obj, LV_PART_KNOB); + + return LV_MAX(knob_shadow_size, knob_outline_size); +} + +/** + * Check if angle is within arc background bounds + * + * In order to avoid unexpected value update of the arc value when the user clicks + * outside of the arc background we need to check if the angle (of the clicked point) + * is within the bounds of the background. + * + * A tolerance (extra room) also should be taken into consideration. + * + * E.g. Arc with start angle of 0° and end angle of 90°, the background is only visible in + * that range, from 90° to 360° the background is invisible. Click in 150° should not update + * the arc value, click within the arc angle range should. + * + * IMPORTANT NOTE: angle is always relative to bg_angle_start, e.g. if bg_angle_start is 30 + * and we click a bit to the left, angle is 10, not the expected 40. + * + * @param obj Pointer to lv_arc + * @param angle Angle to be checked. Is 0<=angle<=360 and relative to bg_angle_start + * @param tolerance_deg Tolerance + * + * @return true if angle is within arc background bounds, false otherwise + */ +static bool lv_arc_angle_within_bg_bounds(lv_obj_t * obj, const lv_value_precise_t angle, + const lv_value_precise_t tolerance_deg) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arc_t * arc = (lv_arc_t *)obj; + + lv_value_precise_t bounds_angle = arc->bg_angle_end - arc->bg_angle_start; + if(arc->bg_angle_end == arc->bg_angle_start) return false; /*The arc has 0 deg span*/ + + /* ensure the angle is in the range [0, 360) */ + while(bounds_angle < 0) bounds_angle += 360; + while(bounds_angle >= 360) bounds_angle -= 360; + + /*Full circle*/ + if(bounds_angle == 0) bounds_angle = 360; + + /* Angle is in the bounds */ + if(angle <= bounds_angle) { + if(angle < (bounds_angle / 2)) { + arc->min_close = CLICK_CLOSER_TO_MIN_END; + } + else { + arc->min_close = CLICK_CLOSER_TO_MAX_END; + } + arc->in_out = CLICK_INSIDE_BG_ANGLES; + return true; + } + + /* Distance between background start and end angles is less than tolerance, + * consider the click inside the arc */ + if(360 - bounds_angle <= tolerance_deg) { + arc->min_close = CLICK_CLOSER_TO_MIN_END; + arc->in_out = CLICK_INSIDE_BG_ANGLES; + return true; + } + + /* angle is within the tolerance of the min end */ + if(360 - angle <= tolerance_deg) { + arc->min_close = CLICK_CLOSER_TO_MIN_END; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + + /* angle is within the tolerance of the max end */ + if(angle <= bounds_angle + tolerance_deg) { + arc->min_close = CLICK_CLOSER_TO_MAX_END; + arc->in_out = CLICK_OUTSIDE_BG_ANGLES; + return true; + } + + return false; +} + +static int32_t get_indicator_max_pad(lv_obj_t * obj) +{ + int32_t left_indic = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + int32_t right_indic = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + int32_t top_indic = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + int32_t bottom_indic = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + return LV_MAX4(left_indic, right_indic, top_indic, bottom_indic); +} + +#if LV_USE_OBSERVER + +static void arc_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * arc = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + if(subject->type == LV_SUBJECT_TYPE_INT) { + lv_subject_set_int(subject, lv_arc_get_value(arc)); + } +#if LV_USE_FLOAT + else { + lv_subject_set_float(subject, (float)lv_arc_get_value(arc)); + } +#endif +} + +static void arc_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + if(subject->type == LV_SUBJECT_TYPE_INT) { + lv_arc_set_value(observer->target, subject->value.num); + } +#if LV_USE_FLOAT + else { + lv_arc_set_value(observer->target, (int32_t)subject->value.float_v); + } +#endif +} + +#endif /*LV_USE_OBSERVER*/ + +#endif diff --git a/inc/lvgl/src/widgets/arc/lv_arc.h b/inc/lvgl/src/widgets/arc/lv_arc.h new file mode 100644 index 0000000..4daf97a --- /dev/null +++ b/inc/lvgl/src/widgets/arc/lv_arc.h @@ -0,0 +1,301 @@ +/** + * @file lv_arc.h + * + */ + +#ifndef LV_ARC_H +#define LV_ARC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_ARC != 0 + +#include "../../core/lv_obj.h" +#include "../../core/lv_observer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * In which direction the indicator should grow. + */ +typedef enum { + LV_ARC_MODE_NORMAL, /**< Clock-wise */ + LV_ARC_MODE_SYMMETRICAL, /**< Left/right from the midpoint */ + LV_ARC_MODE_REVERSE /**< Counterclock-wise */ +} lv_arc_mode_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_arc_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_arc_id_t { + LV_PROPERTY_ID(ARC, START_ANGLE, LV_PROPERTY_TYPE_PRECISE, 0), + LV_PROPERTY_ID(ARC, END_ANGLE, LV_PROPERTY_TYPE_PRECISE, 1), + LV_PROPERTY_ID(ARC, BG_START_ANGLE, LV_PROPERTY_TYPE_PRECISE, 2), + LV_PROPERTY_ID(ARC, BG_END_ANGLE, LV_PROPERTY_TYPE_PRECISE, 3), + LV_PROPERTY_ID(ARC, ROTATION, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_ID(ARC, MODE, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(ARC, VALUE, LV_PROPERTY_TYPE_INT, 6), + LV_PROPERTY_ID(ARC, MIN_VALUE, LV_PROPERTY_TYPE_INT, 7), + LV_PROPERTY_ID(ARC, MAX_VALUE, LV_PROPERTY_TYPE_INT, 8), + LV_PROPERTY_ID(ARC, CHANGE_RATE, LV_PROPERTY_TYPE_INT, 9), + LV_PROPERTY_ID(ARC, KNOB_OFFSET, LV_PROPERTY_TYPE_INT, 10), + LV_PROPERTY_ARC_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an arc object + * @param parent pointer to an object, it will be the parent of the new arc + * @return pointer to the created arc + */ +lv_obj_t * lv_arc_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the start angle of an arc. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc object + * @param start the start angle. (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_start_angle(lv_obj_t * obj, lv_value_precise_t start); + +/** + * Set the end angle of an arc. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc object + * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_end_angle(lv_obj_t * obj, lv_value_precise_t end); + +/** + * Set the start and end angles + * @param obj pointer to an arc object + * @param start the start angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end); + +/** + * Set the start angle of an arc background. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc object + * @param start the start angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_bg_start_angle(lv_obj_t * obj, lv_value_precise_t start); + +/** + * Set the start angle of an arc background. 0 deg: right, 90 bottom etc. + * @param obj pointer to an arc object + * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_bg_end_angle(lv_obj_t * obj, lv_value_precise_t end); + +/** + * Set the start and end angles of the arc background + * @param obj pointer to an arc object + * @param start the start angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + * @param end the end angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arc_set_bg_angles(lv_obj_t * obj, lv_value_precise_t start, lv_value_precise_t end); + +/** + * Set the rotation for the whole arc + * @param obj pointer to an arc object + * @param rotation rotation angle + */ +void lv_arc_set_rotation(lv_obj_t * obj, int32_t rotation); + +/** + * Set in which direction the indicator should grow. + * @param obj pointer to arc object + * @param type arc's mode + */ +void lv_arc_set_mode(lv_obj_t * obj, lv_arc_mode_t type); + +/** + * Set a new value on the arc + * @param obj pointer to an arc object + * @param value new value + */ +void lv_arc_set_value(lv_obj_t * obj, int32_t value); + +/** + * Set minimum and the maximum values of an arc + * @param obj pointer to the arc object + * @param min minimum value + * @param max maximum value + */ +void lv_arc_set_range(lv_obj_t * obj, int32_t min, int32_t max); + +/** + * Set the minimum values of an arc + * @param obj pointer to the arc object + * @param min minimum value + */ +void lv_arc_set_min_value(lv_obj_t * obj, int32_t min); + +/** + * Set the maximum values of an arc + * @param obj pointer to the arc object + * @param max maximum value + */ +void lv_arc_set_max_value(lv_obj_t * obj, int32_t max); + +/** + * Set a change rate to limit the speed how fast the arc should reach the pressed point. + * @param obj pointer to an arc object + * @param rate the change rate + */ +void lv_arc_set_change_rate(lv_obj_t * obj, uint32_t rate); + +/** + * Set an offset angle for the knob + * @param obj pointer to an arc object + * @param offset knob offset from main arc in degrees + */ +void lv_arc_set_knob_offset(lv_obj_t * obj, int32_t offset); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the start angle of an arc. + * @param obj pointer to an arc object + * @return the start angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arc_get_angle_start(lv_obj_t * obj); + +/** + * Get the end angle of an arc. + * @param obj pointer to an arc object + * @return the end angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arc_get_angle_end(lv_obj_t * obj); + +/** + * Get the start angle of an arc background. + * @param obj pointer to an arc object + * @return the start angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arc_get_bg_angle_start(lv_obj_t * obj); + +/** + * Get the end angle of an arc background. + * @param obj pointer to an arc object + * @return the end angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arc_get_bg_angle_end(lv_obj_t * obj); + +/** + * Get the value of an arc + * @param obj pointer to an arc object + * @return the value of the arc + */ +int32_t lv_arc_get_value(const lv_obj_t * obj); + +/** + * Get the minimum value of an arc + * @param obj pointer to an arc object + * @return the minimum value of the arc + */ +int32_t lv_arc_get_min_value(const lv_obj_t * obj); + +/** + * Get the maximum value of an arc + * @param obj pointer to an arc object + * @return the maximum value of the arc + */ +int32_t lv_arc_get_max_value(const lv_obj_t * obj); + +/** + * Get whether the arc is type or not. + * @param obj pointer to an arc object + * @return arc's mode + */ +lv_arc_mode_t lv_arc_get_mode(const lv_obj_t * obj); + +/** + * Get the rotation for the whole arc + * @param obj pointer to an arc object + * @return arc's current rotation + */ +int32_t lv_arc_get_rotation(const lv_obj_t * obj); + +/** + * Get the current knob angle offset + * @param obj pointer to an arc object + * @return arc's current knob offset + */ +int32_t lv_arc_get_knob_offset(const lv_obj_t * obj); + +/** + * Get the change rate of an arc + * @param obj pointer to an arc object + * @return the change rate + */ +uint32_t lv_arc_get_change_rate(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +#if LV_USE_OBSERVER +/** + * Bind an integer subject to an Arc's value. + * @param obj pointer to Arc + * @param subject pointer to Subject + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_arc_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + + +/** + * Align an object to the current position of the arc (knob) + * @param obj pointer to an arc object + * @param obj_to_align pointer to an object to align + * @param r_offset consider the radius larger with this value (< 0: for smaller radius) + */ +void lv_arc_align_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_align, int32_t r_offset); + +/** + * Rotate an object to the current position of the arc (knob) + * @param obj pointer to an arc object + * @param obj_to_rotate pointer to an object to rotate + * @param r_offset consider the radius larger with this value (< 0: for smaller radius) + */ +void lv_arc_rotate_obj_to_angle(const lv_obj_t * obj, lv_obj_t * obj_to_rotate, int32_t r_offset); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ARC*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ARC_H*/ diff --git a/inc/lvgl/src/widgets/arc/lv_arc_private.h b/inc/lvgl/src/widgets/arc/lv_arc_private.h new file mode 100644 index 0000000..71f576a --- /dev/null +++ b/inc/lvgl/src/widgets/arc/lv_arc_private.h @@ -0,0 +1,64 @@ +/** + * @file lv_arc_private.h + * + */ + +#ifndef LV_ARC_PRIVATE_H +#define LV_ARC_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj_private.h" +#include "lv_arc.h" + +#if LV_USE_ARC != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_arc_t { + lv_obj_t obj; + int32_t rotation; + lv_value_precise_t indic_angle_start; + lv_value_precise_t indic_angle_end; + lv_value_precise_t bg_angle_start; + lv_value_precise_t bg_angle_end; + int32_t value; /**< Current value of the arc */ + int32_t min_value; /**< Minimum value of the arc */ + int32_t max_value; /**< Maximum value of the arc */ + uint32_t dragging : 1; + uint32_t type : 2; + uint32_t min_close : 1; /**< 1: the last pressed angle was closer to minimum end */ + uint32_t in_out : 1; /**< 1: The click was within the background arc angles. 0: Click outside */ + uint32_t chg_rate; /**< Drag angle rate of change of the arc (degrees/sec) */ + uint32_t last_tick; /**< Last dragging event timestamp of the arc */ + lv_value_precise_t last_angle; /**< Last dragging angle of the arc */ + int16_t knob_offset; /**< knob offset from the main arc */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_ARC != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ARC_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/arclabel/lv_arclabel.c b/inc/lvgl/src/widgets/arclabel/lv_arclabel.c new file mode 100644 index 0000000..55ff2f5 --- /dev/null +++ b/inc/lvgl/src/widgets/arclabel/lv_arclabel.c @@ -0,0 +1,752 @@ +/** + * @file lv_arclabel.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_arclabel_private.h" + +#if LV_USE_ARCLABEL != 0 + +#include "../../core/lv_obj_class_private.h" +#include "../../core/lv_obj_event_private.h" +#include "../../core/lv_obj_private.h" +#include "../../misc/lv_area_private.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_text_private.h" + +#if LV_USE_FLOAT + #include + #include + #ifndef M_PI + #define M_PI 3.14159265358979323846264338327950288 + #endif +#else + /* Use fixed point math for integer only platforms $ M_PI << 8 $ */ + #define M_PI 804 +#endif + +/********************* + * DEFINES + *********************/ + +#define MY_CLASS (&lv_arclabel_class) + +#define LV_ARCLABEL_DEBUG 0 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_arclabel_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void arclabel_draw_main(lv_event_t * e); +static void lv_arclabel_event(const lv_obj_class_t * class_p, lv_event_t * e); +static lv_value_precise_t calc_arc_text_total_angle(const char * text, const lv_font_t * font, uint32_t radius, + const lv_value_precise_t angle_size, int32_t letter_space, bool recolor, + const lv_arclabel_overflow_t overflow, bool end_overlap, bool * need_ellipsis, uint32_t * letter_count); +static lv_value_precise_t arclabel_calc_arc_text_total_angle(lv_obj_t * obj, int32_t * arc_radius, bool * need_ellipsis, + uint32_t * letter_count); +static const char * recolor_cmd_get_next(const char * text_in, uint32_t len_in, + const char ** text_out, uint32_t * len_out, + lv_color_t * color_out); +static lv_value_precise_t deg_to_rad(lv_value_precise_t deg, int32_t radius); +static lv_value_precise_t rad_to_deg(lv_value_precise_t rad, int32_t radius); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_arclabel_class = { + .constructor_cb = lv_arclabel_constructor, + .event_cb = lv_arclabel_event, + .instance_size = sizeof(lv_arclabel_t), + .editable = LV_OBJ_CLASS_EDITABLE_FALSE, + .base_class = &lv_obj_class, + .name = "arclabel", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_arclabel_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/* + * New object specific "add" or "remove" functions come here + */ + +/*===================== + * Setter functions + *====================*/ + +void lv_arclabel_set_text(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arclabel = (lv_arclabel_t *)obj; + + /*If text is NULL then just refresh with the current text*/ + if(text == NULL) text = arclabel->text; + + const size_t text_len = lv_strlen(text) + 1; + + /*If set its own text then reallocate it (maybe its size changed)*/ + if(arclabel->text == text && arclabel->static_txt == 0) { + arclabel->text = lv_realloc(arclabel->text, text_len); + LV_ASSERT_MALLOC(arclabel->text); + if(arclabel->text == NULL) return; + } + else { + /*Free the old text*/ + if(arclabel->text != NULL && arclabel->static_txt == 0) { + lv_free(arclabel->text); + arclabel->text = NULL; + } + + arclabel->text = lv_malloc(text_len); + LV_ASSERT_MALLOC(arclabel->text); + if(arclabel->text == NULL) return; + + lv_strcpy(arclabel->text, text); + + /*Now the text is dynamically allocated*/ + arclabel->static_txt = 0; + } + + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(fmt); + + lv_arclabel_t * arclabel = (lv_arclabel_t *)obj; + + /*If text is NULL then refresh*/ + if(fmt == NULL) { + lv_obj_invalidate(obj); + return; + } + + if(arclabel->text != NULL && arclabel->static_txt == 0) { + lv_free(arclabel->text); + arclabel->text = NULL; + } + + va_list args; + va_start(args, fmt); + arclabel->text = lv_text_set_text_vfmt(fmt, args); + va_end(args); + arclabel->static_txt = 0; /*Now the text is dynamically allocated*/ + + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_text_static(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arclabel = (lv_arclabel_t *)obj; + + if(arclabel->static_txt == 0 && arclabel->text != NULL) { + lv_free(arclabel->text); + arclabel->text = NULL; + } + + if(text != NULL) { + arclabel->static_txt = 1; + arclabel->text = (char *)text; + } + + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_angle_start(lv_obj_t * obj, lv_value_precise_t start) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->angle_start = start; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_angle_size(lv_obj_t * obj, lv_value_precise_t size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->angle_size = size; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_offset(lv_obj_t * obj, int32_t offset) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->offset = offset; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_dir(lv_obj_t * obj, lv_arclabel_dir_t dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->dir = dir; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_recolor(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + arc->recolor = en; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_radius(lv_obj_t * obj, uint32_t radius) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->radius = radius; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_center_offset_x(lv_obj_t * obj, uint32_t x) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->center_offset.x = x; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_center_offset_y(lv_obj_t * obj, uint32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->center_offset.y = y; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_text_vertical_align(lv_obj_t * obj, lv_arclabel_text_align_t align) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->text_align_v = align; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_text_horizontal_align(lv_obj_t * obj, lv_arclabel_text_align_t align) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->text_align_h = align; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_overflow(lv_obj_t * obj, lv_arclabel_overflow_t overflow) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->overflow = overflow; + lv_obj_invalidate(obj); +} + +void lv_arclabel_set_end_overlap(lv_obj_t * obj, bool overlap) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->end_overlap = overlap; + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_value_precise_t lv_arclabel_get_angle_start(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->angle_start; +} + +lv_value_precise_t lv_arclabel_get_angle_size(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_arclabel_t * arclabel = (lv_arclabel_t *)obj; + return arclabel->angle_size; +} + +lv_arclabel_dir_t lv_arclabel_get_dir(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->dir; +} + +bool lv_arclabel_get_recolor(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->recolor; +} + +uint32_t lv_arclabel_get_radius(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->radius; +} + +uint32_t lv_arclabel_get_center_offset_x(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->center_offset.x; +} + +uint32_t lv_arclabel_get_center_offset_y(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->center_offset.y; +} + +lv_arclabel_text_align_t lv_arclabel_get_text_vertical_align(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->text_align_v; +} + +lv_arclabel_text_align_t lv_arclabel_get_text_horizontal_align(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->text_align_h; +} + +lv_arclabel_overflow_t lv_arclabel_get_overflow(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->overflow; +} + +bool lv_arclabel_get_end_overlap(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + return ((lv_arclabel_t *) obj)->end_overlap; +} + +lv_value_precise_t lv_arclabel_get_text_angle(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return arclabel_calc_arc_text_total_angle(obj, NULL, NULL, NULL); +} + +/*===================== + * Other functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_arclabel_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_arclabel_t * arc = (lv_arclabel_t *)obj; + + arc->angle_start = 0; + arc->angle_size = 360; + arc->dir = LV_ARCLABEL_DIR_CLOCKWISE; + arc->recolor = false; + arc->overflow = LV_ARCLABEL_OVERFLOW_CLIP; + arc->end_overlap = true; + + lv_arclabel_set_text_static(obj, LV_ARCLABEL_DEFAULT_TEXT); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLL_CHAIN | LV_OBJ_FLAG_SCROLLABLE); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_arclabel_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + const lv_result_t res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + const lv_event_code_t code = lv_event_get_code(e); + + if(code == LV_EVENT_DRAW_MAIN) { + arclabel_draw_main(e); + } +} + +static void arclabel_draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_arclabel_t * arclabel = (lv_arclabel_t *)obj; + + const char * text = arclabel->text; + const char * text_start = text; + + lv_area_t coords; + lv_obj_get_content_coords(obj, &coords); + + lv_layer_t * layer = lv_event_get_layer(e); + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const lv_color_t color = lv_obj_get_style_text_color(obj, LV_PART_MAIN); + const lv_opa_t opa = LV_OPA_MIX2(layer->opa, lv_obj_get_style_text_opa(obj, LV_PART_MAIN)); + const int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + int32_t arc_r = 0; + bool need_ellipsis = false; + uint32_t processed_total_word_count = 0; + const lv_value_precise_t total_visible_angle = arclabel_calc_arc_text_total_angle(obj, &arc_r, &need_ellipsis, + &processed_total_word_count); + + const int32_t offset = arclabel->offset; + const lv_value_precise_t angle_offset = rad_to_deg(offset, arc_r); + + lv_value_precise_t angle_start = 0; + switch(arclabel->text_align_h) { + case LV_ARCLABEL_TEXT_ALIGN_LEADING: + angle_start = angle_offset; + break; + case LV_ARCLABEL_TEXT_ALIGN_CENTER: + angle_start = (arclabel->angle_size + angle_offset - total_visible_angle) / 2; + break; + case LV_ARCLABEL_TEXT_ALIGN_TRAILING: + angle_start = arclabel->angle_size - total_visible_angle; + break; + default: + break; + } + + bool draw_ellipsis = false; + int ellipsis_dot_index = 0; + uint32_t processed_word_count = 0; + lv_value_precise_t prev_letter_w = 0; + lv_value_precise_t total_arc_length = deg_to_rad(arclabel->angle_size, arc_r); + lv_value_precise_t curr_total_arc_length = deg_to_rad(angle_start, arc_r); + uint32_t letter = 0; + uint32_t letter_next = 0; + while(text) { + uint32_t word_i = 0; + uint32_t text_len = LV_TEXT_LEN_MAX; + lv_color_t recolor_color = color; + if(arclabel->recolor) text = recolor_cmd_get_next(text, LV_TEXT_LEN_MAX, &text_start, &text_len, &recolor_color); + else text = NULL; + + + while(word_i < text_len && (arclabel->overflow == LV_ARCLABEL_OVERFLOW_VISIBLE || + curr_total_arc_length <= total_arc_length)) { + if(draw_ellipsis) { + if(ellipsis_dot_index >= 3) break; + letter = '.'; + letter_next = ellipsis_dot_index < 2 ? '.' : '\0'; + ellipsis_dot_index++; + } + else lv_text_encoded_letter_next_2(text_start, &letter, &letter_next, &word_i); + + const lv_value_precise_t letter_w = lv_font_get_glyph_width(font, letter, letter_next); + + if(processed_word_count > 0) { + if(processed_word_count >= processed_total_word_count && arclabel->overflow != LV_ARCLABEL_OVERFLOW_VISIBLE && + !draw_ellipsis) { + if(need_ellipsis) { + draw_ellipsis = true; + continue; + } + break; + } + const lv_value_precise_t arc_offset = (prev_letter_w + letter_w + letter_space) / (lv_value_precise_t)2; + curr_total_arc_length += arc_offset; + } + + const lv_value_precise_t curr_angle = arclabel->angle_start + + rad_to_deg(arclabel->dir == LV_ARCLABEL_DIR_CLOCKWISE + ? curr_total_arc_length + : total_arc_length - curr_total_arc_length, arc_r); + +#if LV_USE_FLOAT + const lv_value_precise_t x = cosf(deg_to_rad(curr_angle, 1)) * arc_r; + const lv_value_precise_t y = sinf(deg_to_rad(curr_angle, 1)) * arc_r; +#else + const lv_value_precise_t x = (lv_value_precise_t)(lv_trigo_cos(curr_angle) * arc_r / 32767); + const lv_value_precise_t y = (lv_value_precise_t)(lv_trigo_sin(curr_angle) * arc_r / 32767); +#endif + + lv_point_t point = { + (int32_t)(x + (lv_value_precise_t)(lv_area_get_width(&coords) / 2 + coords.x1 + arclabel->center_offset.x)), + (int32_t)(y + (lv_value_precise_t)(lv_area_get_height(&coords) / 2 + coords.y1 + arclabel->center_offset.y)), + }; + + lv_draw_letter_dsc_t dsc; + lv_draw_letter_dsc_init(&dsc); + dsc.font = font; + dsc.color = arclabel->recolor ? recolor_color : color; + dsc.opa = opa; + if(arclabel->dir == LV_ARCLABEL_DIR_CLOCKWISE) dsc.rotation = (int32_t)((curr_angle + 90) * 10); + else dsc.rotation = (int32_t)((curr_angle - 90) * 10); + + dsc.unicode = letter; + if(dsc.unicode == 0) { + break; + } + + lv_draw_letter(layer, &dsc, &point); + + prev_letter_w = letter_w; + processed_word_count++; + +#if LV_ARCLABEL_DEBUG + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + line_dsc.color = lv_color_make(0x11, 0x45, 0x14); + line_dsc.opa = LV_OPA_30; + line_dsc.width = 2; + line_dsc.p1 = (lv_point_precise_t) { + .x = point.x, + .y = point.y + }; + line_dsc.p2 = (lv_point_precise_t) { + .x = lv_area_get_width(&coords) / 2 + coords.x1, + .y = lv_area_get_height(&coords) / 2 + coords.y1 + }; + + lv_draw_line(layer, &line_dsc); +#endif + } + } +} + +static lv_value_precise_t arclabel_calc_arc_text_total_angle(lv_obj_t * obj, int32_t * arc_radius, bool * need_ellipsis, + uint32_t * letter_count) +{ + lv_arclabel_t * arclabel = (lv_arclabel_t *)obj; + + const char * text = arclabel->text; + const char * text_start = text; + + lv_area_t coords; + lv_obj_get_content_coords(obj, &coords); + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + const int32_t line_height = font->line_height; + const int32_t base_line = font->base_line; + int32_t arc_r_delta = 0; + int32_t arc_r = arclabel->radius; + + if(arc_r == LV_SIZE_CONTENT) arc_r = LV_PCT(100); + if(LV_COORD_IS_PCT(arc_r)) { + const int32_t width = lv_area_get_width(&coords); + const int32_t height = lv_area_get_height(&coords); + arc_r = lv_pct_to_px(arc_r, LV_MIN(width, height)) / 2; + } + + switch(arclabel->text_align_v) { + case LV_ARCLABEL_TEXT_ALIGN_LEADING: + arc_r_delta = line_height - base_line; + break; + case LV_ARCLABEL_TEXT_ALIGN_CENTER: + arc_r_delta = line_height / 2 - base_line; + break; + case LV_ARCLABEL_TEXT_ALIGN_TRAILING: + arc_r_delta = -base_line; + break; + default: + break; + } + + arc_r += arclabel->dir == LV_ARCLABEL_DIR_CLOCKWISE ? -arc_r_delta : arc_r_delta; + if(arc_radius != NULL) *arc_radius = arc_r; + lv_value_precise_t total_visible_angle = calc_arc_text_total_angle(text_start, font, arc_r, + arclabel->angle_size, letter_space, arclabel->recolor, + arclabel->overflow, arclabel->end_overlap, need_ellipsis, letter_count); + return total_visible_angle; +} + +static lv_value_precise_t calc_arc_text_total_angle(const char * text, const lv_font_t * font, const uint32_t radius, + const lv_value_precise_t angle_size, const int32_t letter_space, const bool recolor, + const lv_arclabel_overflow_t overflow, bool end_overlap, bool * need_ellipsis, uint32_t * letter_count) +{ + const char * text_start = text; + uint32_t processed_letter_count = 0; + lv_value_precise_t prev_letter_w = 0; + lv_value_precise_t first_letter_w = 0; + const lv_value_precise_t angle_size_in_arc_length = deg_to_rad(angle_size, radius); + lv_value_precise_t total_arc_length = 0; + lv_value_precise_t pre_total_arc_length = 0; + uint32_t pre_processed_letter_count = 0; + lv_value_precise_t ellipsis_arc_length = 0; + bool full = false; + uint32_t letter = 0; + uint32_t letter_next = 0; + + lv_value_precise_t available_arc_length = angle_size_in_arc_length; + if(overflow == LV_ARCLABEL_OVERFLOW_ELLIPSIS) { + lv_value_precise_t dot_width = lv_font_get_glyph_width(font, '.', '.'); + ellipsis_arc_length = 3 * dot_width + 2 * letter_space; + if(available_arc_length > ellipsis_arc_length) available_arc_length -= ellipsis_arc_length; + else available_arc_length = 0; + } + + while(text) { + uint32_t word_i = 0; + uint32_t text_len = LV_TEXT_LEN_MAX; + if(recolor) text = recolor_cmd_get_next(text, LV_TEXT_LEN_MAX, &text_start, &text_len, NULL); + else text = NULL; + + while(word_i < text_len) { + const lv_value_precise_t end_arc_w = end_overlap ? 0 : (first_letter_w + letter_space + prev_letter_w) / + (lv_value_precise_t)2; + if(total_arc_length + end_arc_w > available_arc_length) { + full = true; + break; + } + + pre_total_arc_length = total_arc_length; + pre_processed_letter_count = processed_letter_count; + lv_text_encoded_letter_next_2(text_start, &letter, &letter_next, &word_i); + const lv_value_precise_t letter_w = lv_font_get_glyph_width(font, letter, letter_next); + + if(processed_letter_count > 0) { + const lv_value_precise_t arc_offset = (prev_letter_w + letter_w + letter_space) / (lv_value_precise_t)2; + + total_arc_length += arc_offset; + } + else { + first_letter_w = letter_w; + } + + if(letter == 0) break; + + prev_letter_w = letter_w; + processed_letter_count++; + } + } + + if(full && (overflow == LV_ARCLABEL_OVERFLOW_ELLIPSIS || overflow == LV_ARCLABEL_OVERFLOW_CLIP)) { + total_arc_length = pre_total_arc_length + (overflow == LV_ARCLABEL_OVERFLOW_ELLIPSIS + ? ellipsis_arc_length + : 0); + processed_letter_count = pre_processed_letter_count; + } + + if(need_ellipsis && full && overflow == LV_ARCLABEL_OVERFLOW_ELLIPSIS) *need_ellipsis = true; + if(letter_count) *letter_count = processed_letter_count; + + return rad_to_deg(total_arc_length, radius); +} + +static const char * recolor_cmd_get_next(const char * text_in, uint32_t len_in, + const char ** text_out, uint32_t * len_out, + lv_color_t * color_out) +{ + if(!text_in || len_in == 0 || *text_in == '\0') return NULL; + + const char * text = text_in; + uint32_t proc_len = 0; + bool has_cmd = false; + + if(*text == LV_TXT_COLOR_CMD[0]) { + if(len_in < 8) { + if(text_out) *text_out = text_in; + if(len_out) *len_out = len_in; + return NULL; + } + has_cmd = true; + text++; + + int32_t index = 0; + uint8_t color_buf[6]; + while(*text && index < 6) { + uint8_t ch = text[index]; + if(!((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f'))) break; + if(ch >= 'a' && ch <= 'f') ch -= 'a' - 10; + else if(ch >= 'A' && ch <= 'F') ch -= 'A' - 10; + else ch -= '0'; + color_buf[index] = ch; + index++; + } + + const bool has_valid_param = index == 6 && text[index] == ' '; + + text += index; + if(has_valid_param && color_out) + *color_out = lv_color_make(color_buf[0] << 4 | color_buf[1], + color_buf[2] << 4 | color_buf[3], + color_buf[4] << 4 | color_buf[5]); + + proc_len = text - text_in; + while(proc_len < len_in && *text && *text++ != ' ') { + proc_len++; + } + } + + const char * text_segment_start = text; + while(proc_len < len_in && *text && *text != LV_TXT_COLOR_CMD[0]) { + text++; + proc_len++; + }; + if(text_out) *text_out = text_segment_start; + if(len_out) *len_out = text - text_segment_start; + if(*text == '\0') return NULL; + if(has_cmd && *text == LV_TXT_COLOR_CMD[0]) { + text++; + proc_len++; + }; + + return proc_len < len_in && *text ? text : NULL; +} + +static lv_value_precise_t deg_to_rad(lv_value_precise_t deg, int32_t radius) +{ +#if LV_USE_FLOAT + return (lv_value_precise_t)(deg * radius * M_PI / 180); +#else + return (lv_value_precise_t)((deg * radius * M_PI / 180) >> 8); +#endif +} + +static lv_value_precise_t rad_to_deg(lv_value_precise_t rad, int32_t radius) +{ +#if LV_USE_FLOAT + return (lv_value_precise_t)(rad * 180 / M_PI / radius); +#else + return (lv_value_precise_t)(((rad * 180) << 8) / M_PI / radius); +#endif +} + +#endif diff --git a/inc/lvgl/src/widgets/arclabel/lv_arclabel.h b/inc/lvgl/src/widgets/arclabel/lv_arclabel.h new file mode 100644 index 0000000..dc7d5ec --- /dev/null +++ b/inc/lvgl/src/widgets/arclabel/lv_arclabel.h @@ -0,0 +1,301 @@ +/** + * @file lv_arclabel.h + * + */ + +#ifndef LV_ARCLABEL_H +#define LV_ARCLABEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_ARCLABEL != 0 + +/********************* + * DEFINES + *********************/ + +#define LV_ARCLABEL_DOT_NUM 3 +#if LV_WIDGETS_HAS_DEFAULT_VALUE +#define LV_ARCLABEL_DEFAULT_TEXT "Arced Text" +#else +#define LV_ARCLABEL_DEFAULT_TEXT "" +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_ARCLABEL_DIR_CLOCKWISE = 0, + LV_ARCLABEL_DIR_COUNTER_CLOCKWISE = 1 +} lv_arclabel_dir_t; + +typedef enum { + LV_ARCLABEL_TEXT_ALIGN_DEFAULT = 0, + LV_ARCLABEL_TEXT_ALIGN_LEADING = 1, + LV_ARCLABEL_TEXT_ALIGN_CENTER = 2, + LV_ARCLABEL_TEXT_ALIGN_TRAILING = 3, +} lv_arclabel_text_align_t; + +typedef enum { + LV_ARCLABEL_OVERFLOW_VISIBLE, /**< Show full text, may overflow object area */ + LV_ARCLABEL_OVERFLOW_ELLIPSIS, /**< Show ellipsis (...) when text overflows */ + LV_ARCLABEL_OVERFLOW_CLIP /**< Clip text at arc boundary */ +} lv_arclabel_overflow_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_arclabel_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an arc label object + * @param parent pointer to an object, it will be the parent of the new arc label + * @return pointer to the created arc label + */ +lv_obj_t * lv_arclabel_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the text of the arc label. + * + * This function sets the text displayed by an arc label object. + * + * @param obj Pointer to the arc label object. + * @param text Pointer to a null-terminated string containing the new text for the label. + */ +void lv_arclabel_set_text(lv_obj_t * obj, const char * text); + +/** + * Set the formatted text of an arc label object. + * + * This function sets the text of an arc label object with support for + * variable arguments formatting, similar to `printf`. + * + * @param obj The arc label object to set the text for. + * @param fmt A format string that specifies how subsequent arguments are converted to text. + * @param ... Arguments following the format string that are used to replace format specifiers in the format string. + */ +void lv_arclabel_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(2, 3); + +/** + * Sets a new static text for the arc label or refreshes it with the current text. + * The 'text' must remain valid in memory; the arc label does not manage its lifecycle. + * + * @param obj Pointer to the arc label object. + * @param text Pointer to the new text. If NULL, the label is refreshed with its current text. + */ +void lv_arclabel_set_text_static(lv_obj_t * obj, const char * text); + +/** + * Set the start angle of an arc. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc label object + * @param start the start angle. (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arclabel_set_angle_start(lv_obj_t * obj, lv_value_precise_t start); + +/** + * Set the end angle of an arc. 0 deg: right, 90 bottom, etc. + * @param obj pointer to an arc label object + * @param size the angle size (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +void lv_arclabel_set_angle_size(lv_obj_t * obj, lv_value_precise_t size); + +/** + * Set the rotation for the whole arc + * @param obj pointer to an arc label object + * @param offset rotation angle + */ +void lv_arclabel_set_offset(lv_obj_t * obj, int32_t offset); + +/** + * Set the type of arc. + * @param obj pointer to and arc label object + * @param dir arc label's direction + */ +void lv_arclabel_set_dir(lv_obj_t * obj, lv_arclabel_dir_t dir); + +/** + * Enable the recoloring by in-line commands + * @param obj pointer to an arc label object + * @param en true: enable recoloring, false: disable + * Example: "This is a #ff0000 red# word" + */ +void lv_arclabel_set_recolor(lv_obj_t * obj, bool en); + +/** + * Set the radius for an arc label object. + * + * @param obj pointer to the arc label object. + * @param radius The radius value to set for the label's curvature, in pixels. + */ +void lv_arclabel_set_radius(lv_obj_t * obj, uint32_t radius); + +/** + * Set the center offset x for an arc label object. + * @param obj pointer to an arc label object + * @param x the x offset + */ +void lv_arclabel_set_center_offset_x(lv_obj_t * obj, uint32_t x); + +/** + * Set the center offset y for an arc label object. + * @param obj pointer to an arc label object + * @param y the y offset + */ +void lv_arclabel_set_center_offset_y(lv_obj_t * obj, uint32_t y); + +/** + * Set the text vertical alignment for an arc label object. + * @param obj pointer to an arc label object + * @param align the vertical alignment + */ +void lv_arclabel_set_text_vertical_align(lv_obj_t * obj, lv_arclabel_text_align_t align); + +/** + * Set the text horizontal alignment for an arc label object. + * @param obj pointer to an arc label object + * @param align the horizontal alignment + */ +void lv_arclabel_set_text_horizontal_align(lv_obj_t * obj, lv_arclabel_text_align_t align); + +/** + * Set the overflow behavior for an arc label object. + * @param obj pointer to an arc label object + * @param overflow the overflow mode (visible, ellipsis, clip) + */ +void lv_arclabel_set_overflow(lv_obj_t * obj, lv_arclabel_overflow_t overflow); + +/** + * Set the end overlap behavior for an arc label object. + * This controls how text is handled when it would overlap at the end of a 360-degree arc. + * @param obj pointer to an arc label object + * @param overlap set the arc label's end overlap behavior + */ +void lv_arclabel_set_end_overlap(lv_obj_t * obj, bool overlap); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the start angle of an arc label. + * @param obj pointer to an arc label object + * @return the start angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arclabel_get_angle_start(lv_obj_t * obj); + +/** + * Get the angle size of an arc label. + * @param obj pointer to an arc label object + * @return the end angle [0..360] (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arclabel_get_angle_size(lv_obj_t * obj); + +/** + * Get whether the arc label is type or not. + * @param obj pointer to an arc label object + * @return arc label's direction + */ +lv_arclabel_dir_t lv_arclabel_get_dir(const lv_obj_t * obj); + +/** + * Enable the recoloring by in-line commands + * + * @see lv_arclabel_set_recolor + * + * @param obj pointer to a label object + * @return true: enable recoloring, false: disable + */ +bool lv_arclabel_get_recolor(lv_obj_t * obj); + +/** + * Get the text of the arc label. + * @param obj pointer to an arc label object + * @return the radius of the arc label + */ +uint32_t lv_arclabel_get_radius(lv_obj_t * obj); + +/** + * Get the center offset x for an arc label object. + * @param obj pointer to an arc label object + * @return the x offset + */ +uint32_t lv_arclabel_get_center_offset_x(lv_obj_t * obj); + +/** + * Get the center offset y for an arc label object. + * @param obj pointer to an arc label object + * @return the y offset + */ +uint32_t lv_arclabel_get_center_offset_y(lv_obj_t * obj); + +/** + * Get the text vertical alignment for an arc label object. + * @param obj pointer to an arc label object + * @return the vertical alignment + */ +lv_arclabel_text_align_t lv_arclabel_get_text_vertical_align(lv_obj_t * obj); + +/** + * Get the text horizontal alignment for an arc label object. + * @param obj pointer to an arc label object + * @return the horizontal alignment + */ +lv_arclabel_text_align_t lv_arclabel_get_text_horizontal_align(lv_obj_t * obj); + +/** + * Get the overflow behavior for an arc label object. + * @param obj pointer to an arc label object + * @return the overflow mode + */ +lv_arclabel_overflow_t lv_arclabel_get_overflow(lv_obj_t * obj); + +/** + * Get the end overlap behavior for an arc label object. + * @param obj pointer to an arc label object + * @return the end overlap mode + */ +bool lv_arclabel_get_end_overlap(lv_obj_t * obj); + +/** + * Get the text angle for an arc label object. + * @note The text angle is calculated at runtime. You can get the updated value + * after the arclabel's size has been updated. + * Returns the real rendered text angle in degrees except in + * `LV_ARCLABEL_OVERFLOW_VISIBLE` mode. + * @param obj pointer to an arc label object + * @return the text angle (if `LV_USE_FLOAT` is enabled it can be fractional too.) + */ +lv_value_precise_t lv_arclabel_get_text_angle(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ARCLABEL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ARCLABEL_H*/ diff --git a/inc/lvgl/src/widgets/arclabel/lv_arclabel_private.h b/inc/lvgl/src/widgets/arclabel/lv_arclabel_private.h new file mode 100644 index 0000000..060ae3f --- /dev/null +++ b/inc/lvgl/src/widgets/arclabel/lv_arclabel_private.h @@ -0,0 +1,79 @@ +/** + * @file lv_arclabel_private.h + * + */ + +#ifndef LV_ARCLABEL_PRIVATE_H +#define LV_ARCLABEL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj_private.h" + +#if LV_USE_ARCLABEL != 0 +#include "lv_arclabel.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_arclabel_t { + lv_obj_t obj; + + char * text; + char dot[LV_ARCLABEL_DOT_NUM + 1]; /**< Bytes that have been replaced with dots */ + uint32_t dot_begin; /**< Offset where bytes have been replaced with dots */ + + /** + * @brief The starting angle of the arc in degrees. + * + * This variable represents the beginning of the arc's angular range + * in terms of degrees. It is used in conjunction with `angle_size` to define + * the section of the circle that the arc covers. Values are normalized + * to the range [0, 360), ensuring compatibility with circular representations. + * + * Modifying this value affects the visual rendering of the arc and its associated + * indicators or labels, necessitating a subsequent invalidation or update of the + * object's display to reflect the changes. + * + * @note When setting this value programmatically, ensure it does not exceed 360 degrees, + * as it will be automatically adjusted to fit within the valid range. + */ + lv_value_precise_t angle_start; + lv_value_precise_t angle_size; + uint32_t offset; + uint32_t radius; + lv_point_t center_offset; + lv_arclabel_dir_t dir; + lv_arclabel_text_align_t text_align_v; /**< Vertical text alignment */ + lv_arclabel_text_align_t text_align_h; /**< Horizontal text alignment */ + uint8_t static_txt : 1; /**< Flag to indicate the text is static */ + uint8_t recolor : 1; /**< Enable in-line letter re-coloring */ + uint8_t overflow : 2; /**< Overflow mode: 0=visible, 1=ellipsis, 2=clip */ + bool end_overlap : 1; /**< End overlap flag, false if prevent end overlap */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_ARCLABEL != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ARCLABEL_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/bar/lv_bar.c b/inc/lvgl/src/widgets/bar/lv_bar.c new file mode 100644 index 0000000..540683d --- /dev/null +++ b/inc/lvgl/src/widgets/bar/lv_bar.c @@ -0,0 +1,820 @@ +/** + * @file lv_bar.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_bar_private.h" +#include "../../misc/lv_area_private.h" +#include "../../draw/lv_draw_mask.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_BAR != 0 + +#include "../../draw/lv_draw.h" +#include "../../core/lv_observer_private.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_anim_private.h" +#include "../../misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_bar_class) + +/** hor. pad and ver. pad cannot make the indicator smaller than this [px]*/ +#define LV_BAR_SIZE_MIN 4 + +#define LV_BAR_IS_ANIMATING(anim_struct) (((anim_struct).anim_state) != LV_BAR_ANIM_STATE_INV) +#define LV_BAR_GET_ANIM_VALUE(orig_value, anim_struct) (LV_BAR_IS_ANIMATING(anim_struct) ? ((anim_struct).anim_end) : (orig_value)) + +/** Bar animation start value. (Not the real value of the Bar just indicates process animation)*/ +#define LV_BAR_ANIM_STATE_START 0 + +/** Bar animation end value. (Not the real value of the Bar just indicates process animation)*/ +#define LV_BAR_ANIM_STATE_END 256 + +/** Mark no animation is in progress*/ +#define LV_BAR_ANIM_STATE_INV -1 + +/** log2(LV_BAR_ANIM_STATE_END) used to normalize data*/ +#define LV_BAR_ANIM_STATE_NORM 8 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_bar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_bar_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_indic(lv_event_t * e); +static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, + lv_bar_anim_t * anim_info, lv_anim_enable_t en); +static void lv_bar_init_anim(lv_obj_t * bar, lv_bar_anim_t * bar_anim); +static void lv_bar_anim(void * bar, int32_t value); +static void lv_bar_anim_completed(lv_anim_t * a); + +#if LV_USE_OBSERVER + static void bar_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +#if LV_USE_OBJ_PROPERTY + static void lv_bar_set_value_helper(lv_obj_t * obj, int32_t value); + static void lv_bar_set_start_value_helper(lv_obj_t * obj, int32_t value); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_bar_properties[] = { + { + .id = LV_PROPERTY_BAR_VALUE, + .setter = lv_bar_set_value_helper, + .getter = lv_bar_get_value, + }, + { + .id = LV_PROPERTY_BAR_START_VALUE, + .setter = lv_bar_set_start_value_helper, + .getter = lv_bar_get_start_value, + }, + { + .id = LV_PROPERTY_BAR_MIN_VALUE, + .setter = lv_bar_set_min_value, + .getter = lv_bar_get_min_value, + }, + { + .id = LV_PROPERTY_BAR_MAX_VALUE, + .setter = lv_bar_set_max_value, + .getter = lv_bar_get_max_value, + }, + { + .id = LV_PROPERTY_BAR_MODE, + .setter = lv_bar_set_mode, + .getter = lv_bar_get_mode, + }, + { + .id = LV_PROPERTY_BAR_ORIENTATION, + .setter = lv_bar_set_orientation, + .getter = lv_bar_get_orientation, + }, +}; +#endif + +const lv_obj_class_t lv_bar_class = { + .constructor_cb = lv_bar_constructor, + .destructor_cb = lv_bar_destructor, + .event_cb = lv_bar_event, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF / 10, + .instance_size = sizeof(lv_bar_t), + .base_class = &lv_obj_class, + .name = "lv_bar", + LV_PROPERTY_CLASS_FIELDS(bar, BAR) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_bar_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_bar_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->cur_value == value) return; + + value = LV_CLAMP(bar->min_value, value, bar->max_value); + value = value < bar->start_value ? bar->start_value : value; /*Can't be smaller than the left value*/ + + if(bar->cur_value == value) return; + + lv_bar_set_value_with_anim(obj, value, &bar->cur_value, &bar->cur_value_anim, anim); +} + +void lv_bar_set_start_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->mode != LV_BAR_MODE_RANGE) { + return; + } + + value = LV_CLAMP(bar->min_value, value, bar->max_value); + value = value > bar->cur_value ? bar->cur_value : value; /*Can't be greater than the right value*/ + + if(bar->start_value == value) return; + + lv_bar_set_value_with_anim(obj, value, &bar->start_value, &bar->start_value_anim, anim); +} + +void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_bar_t * bar = (lv_bar_t *)obj; + + bar->val_reversed = min > max; + + int32_t real_min = bar->val_reversed ? max : min; + int32_t real_max = bar->val_reversed ? min : max; + if(bar->min_value == real_min && bar->max_value == real_max) return; + + bar->max_value = real_max; + bar->min_value = real_min; + + if(lv_bar_get_mode(obj) != LV_BAR_MODE_RANGE) + bar->start_value = real_min; + + if(bar->cur_value > real_max) { + bar->cur_value = real_max; + lv_bar_set_value(obj, bar->cur_value, LV_ANIM_OFF); + } + if(bar->cur_value < real_min) { + bar->cur_value = real_min; + lv_bar_set_value(obj, bar->cur_value, LV_ANIM_OFF); + } + + lv_obj_invalidate(obj); +} + +void lv_bar_set_min_value(lv_obj_t * obj, int32_t min) +{ + lv_bar_set_range(obj, min, lv_bar_get_max_value(obj)); +} + +void lv_bar_set_max_value(lv_obj_t * obj, int32_t max) +{ + lv_bar_set_range(obj, lv_bar_get_min_value(obj), max); +} + +void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + bar->mode = mode; + if(bar->mode != LV_BAR_MODE_RANGE) { + bar->start_value = bar->min_value; + } + + lv_obj_invalidate(obj); +} + +void lv_bar_set_orientation(lv_obj_t * obj, lv_bar_orientation_t orientation) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + bar->orientation = orientation; + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +int32_t lv_bar_get_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return LV_BAR_GET_ANIM_VALUE(bar->cur_value, bar->cur_value_anim); +} + +int32_t lv_bar_get_start_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + if(bar->mode != LV_BAR_MODE_RANGE) return bar->min_value; + + return LV_BAR_GET_ANIM_VALUE(bar->start_value, bar->start_value_anim); +} + +int32_t lv_bar_get_min_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + return bar->val_reversed ? bar->max_value : bar->min_value; +} + +int32_t lv_bar_get_max_value(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->val_reversed ? bar->min_value : bar->max_value; +} + +lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->mode; +} + +lv_bar_orientation_t lv_bar_get_orientation(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->orientation; +} + +bool lv_bar_is_symmetrical(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_bar_t * bar = (lv_bar_t *)obj; + + return bar->mode == LV_BAR_MODE_SYMMETRICAL && bar->min_value < 0 && bar->max_value > 0 && + bar->start_value == bar->min_value; +} + +#if LV_USE_OBSERVER +lv_observer_t * lv_bar_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(subject->type != LV_SUBJECT_TYPE_INT && subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, bar_value_observer_cb, obj, NULL); + return observer; +} +#endif /*LV_USE_OBSERVER*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_bar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_bar_t * bar = (lv_bar_t *)obj; + bar->min_value = 0; + bar->max_value = 100; + bar->start_value = 0; + bar->cur_value = 0; + bar->indic_area.x1 = 0; + bar->indic_area.x2 = 0; + bar->indic_area.y1 = 0; + bar->indic_area.y2 = 0; + bar->mode = LV_BAR_MODE_NORMAL; + bar->orientation = LV_BAR_ORIENTATION_AUTO; + bar->val_reversed = false; + + lv_bar_init_anim(obj, &bar->cur_value_anim); + lv_bar_init_anim(obj, &bar->start_value_anim); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_bar_set_value(obj, 0, LV_ANIM_OFF); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_bar_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_bar_t * bar = (lv_bar_t *)obj; + + lv_anim_delete(&bar->cur_value_anim, NULL); + lv_anim_delete(&bar->start_value_anim, NULL); +} + +static void draw_indic(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_bar_t * bar = (lv_bar_t *)obj; + + lv_layer_t * layer = lv_event_get_layer(e); + + lv_area_t bar_coords; + lv_obj_get_coords(obj, &bar_coords); + + int32_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_increase(&bar_coords, transf_w, transf_h); + int32_t barw = lv_area_get_width(&bar_coords); + int32_t barh = lv_area_get_height(&bar_coords); + int32_t range = bar->max_value - bar->min_value; + + /*Prevent division by 0*/ + if(range == 0) { + range = 1; + } + + bool hor = false; + switch(bar->orientation) { + case LV_BAR_ORIENTATION_HORIZONTAL: + hor = true; + break; + case LV_BAR_ORIENTATION_VERTICAL: + hor = false; + break; + case LV_BAR_ORIENTATION_AUTO: + default: + hor = (barw >= barh); + break; + } + + bool sym = lv_bar_is_symmetrical(obj); + + /*Calculate the indicator area*/ + int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + /*Respect padding and minimum width/height too*/ + lv_area_copy(&bar->indic_area, &bar_coords); + bar->indic_area.x1 += bg_left; + bar->indic_area.x2 -= bg_right; + bar->indic_area.y1 += bg_top; + bar->indic_area.y2 -= bg_bottom; + + if(hor && lv_area_get_height(&bar->indic_area) < LV_BAR_SIZE_MIN) { + bar->indic_area.y1 = obj->coords.y1 + (barh / 2) - (LV_BAR_SIZE_MIN / 2); + bar->indic_area.y2 = bar->indic_area.y1 + LV_BAR_SIZE_MIN; + } + else if(!hor && lv_area_get_width(&bar->indic_area) < LV_BAR_SIZE_MIN) { + bar->indic_area.x1 = obj->coords.x1 + (barw / 2) - (LV_BAR_SIZE_MIN / 2); + bar->indic_area.x2 = bar->indic_area.x1 + LV_BAR_SIZE_MIN; + } + int32_t indic_max_w = lv_area_get_width(&bar->indic_area); + int32_t indic_max_h = lv_area_get_height(&bar->indic_area); + + /*Calculate the indicator length*/ + int32_t anim_length = hor ? indic_max_w : indic_max_h; + + int32_t anim_cur_value_x, anim_start_value_x; + + int32_t * axis1, * axis2; + int32_t (*indic_length_calc)(const lv_area_t * area); + + if(hor) { + axis1 = &bar->indic_area.x1; + axis2 = &bar->indic_area.x2; + indic_length_calc = lv_area_get_width; + } + else { + axis1 = &bar->indic_area.y1; + axis2 = &bar->indic_area.y2; + indic_length_calc = lv_area_get_height; + } + + if(LV_BAR_IS_ANIMATING(bar->start_value_anim)) { + int32_t anim_start_value_start_x = + (int32_t)((int32_t)anim_length * (bar->start_value_anim.anim_start - bar->min_value)) / range; + int32_t anim_start_value_end_x = + (int32_t)((int32_t)anim_length * (bar->start_value_anim.anim_end - bar->min_value)) / range; + + anim_start_value_x = (((anim_start_value_end_x - anim_start_value_start_x) * bar->start_value_anim.anim_state) / + LV_BAR_ANIM_STATE_END); + + anim_start_value_x += anim_start_value_start_x; + } + else { + anim_start_value_x = (int32_t)((int32_t)anim_length * (bar->start_value - bar->min_value)) / range; + } + + if(LV_BAR_IS_ANIMATING(bar->cur_value_anim)) { + int32_t anim_cur_value_start_x = + (int32_t)((int32_t)anim_length * (bar->cur_value_anim.anim_start - bar->min_value)) / range; + int32_t anim_cur_value_end_x = + (int32_t)((int32_t)anim_length * (bar->cur_value_anim.anim_end - bar->min_value)) / range; + + anim_cur_value_x = anim_cur_value_start_x + (((anim_cur_value_end_x - anim_cur_value_start_x) * + bar->cur_value_anim.anim_state) / + LV_BAR_ANIM_STATE_END); + } + else { + anim_cur_value_x = (int32_t)((int32_t)anim_length * (bar->cur_value - bar->min_value)) / range; + } + + /** + * The drawing direction of the bar can be reversed only when one of the two conditions(value inversion + * or horizontal direction base dir is LV_BASE_DIR_RTL) is met. + */ + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + bool hor_need_reversed = hor && base_dir == LV_BASE_DIR_RTL; + bool reversed = bar->val_reversed ^ hor_need_reversed; + + /* An area with width 0 is {x1 = 0 x2 = -1} so subtracting 1 from `anim_cur_value_x` causes... + * anim_start_value_x = 0 anim_cur_value_x = 0 to be {x1 = 0 x2 = -1 } which is width 0 + * anim_start_value_x = 0 anim_cur_value_x = 300 to be {x1 = 0 x2 = 299} which is width 300 + */ + anim_cur_value_x -= 1; + + if(reversed) { + /*Swap axes*/ + int32_t * tmp; + tmp = axis1; + axis1 = axis2; + axis2 = tmp; + anim_cur_value_x = -anim_cur_value_x; + anim_start_value_x = -anim_start_value_x; + } + + /*Set the indicator length*/ + if(hor) { + *axis2 = *axis1 + anim_cur_value_x; + *axis1 += anim_start_value_x; + } + else { + *axis1 = *axis2 - anim_cur_value_x; + *axis2 -= anim_start_value_x; + } + + if(sym) { + int32_t zero, shift; + shift = (-bar->min_value * anim_length) / range; + + if(hor) { + int32_t * left = reversed ? axis2 : axis1; + int32_t * right = reversed ? axis1 : axis2; + if(reversed) + zero = *axis1 - shift + 1; + else + zero = *axis1 + shift; + + if(*axis2 > zero) { + *right = *axis2; + *left = zero; + } + else { + *left = *axis2; + *right = zero; + } + } + else { + int32_t * top = reversed ? axis2 : axis1; + int32_t * bottom = reversed ? axis1 : axis2; + if(reversed) + zero = *axis2 + shift; + else + zero = *axis2 - shift + 1; + + if(*axis1 > zero) { + *bottom = *axis1; + *top = zero; + } + else { + *top = *axis1; + *bottom = zero; + } + } + } + + /*Do not draw a zero length indicator but at least call the draw task event*/ + if(!sym && indic_length_calc(&bar->indic_area) <= 1) { + lv_obj_send_event(obj, LV_EVENT_DRAW_TASK_ADDED, NULL); + return; + } + + lv_area_t indic_area; + lv_area_copy(&indic_area, &bar->indic_area); + + lv_draw_rect_dsc_t draw_rect_dsc; + lv_draw_rect_dsc_init(&draw_rect_dsc); + draw_rect_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_rect_dsc); + + + int32_t bg_radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); + int32_t short_side = LV_MIN(barw, barh); + if(bg_radius > short_side >> 1) bg_radius = short_side >> 1; + + bool backdrop_blur = lv_obj_get_style_blur_backdrop(obj, LV_PART_INDICATOR); + lv_draw_blur_dsc_t draw_blur_dsc; + lv_draw_blur_dsc_init(&draw_blur_dsc); + draw_blur_dsc.corner_radius = draw_rect_dsc.radius; + lv_obj_init_draw_blur_dsc(obj, LV_PART_INDICATOR, &draw_blur_dsc); + if(backdrop_blur) lv_draw_blur(layer, &draw_blur_dsc, &indic_area); + + int32_t indic_radius = draw_rect_dsc.radius; + short_side = LV_MIN(lv_area_get_width(&bar->indic_area), lv_area_get_height(&bar->indic_area)); + if(indic_radius > short_side >> 1) indic_radius = short_side >> 1; + + /*Cases: + * Simple: + * - indicator area is the same or smaller then the bg + * - indicator has the same or larger radius than the bg + * - what to do? just draw the indicator + * Radius issue: + * - indicator area is the same or smaller then bg + * - indicator has smaller radius than the bg and the indicator overflows on the corners + * - what to do? draw the indicator on a layer and clip to bg radius + * Larger indicator: + * - indicator area is the larger then the bg + * - radius doesn't matter + * - shadow doesn't matter + * - what to do? just draw the indicator + * Shadow: + * - indicator area is the same or smaller then the bg + * - indicator has the same or larger radius than the bg (shadow needs to be drawn on strange clipped shape) + * - what to do? don't draw the shadow if the indicator is too small has strange shape + * Gradient: + * - the indicator has a gradient + * - what to do? draw it on a bg sized layer clip the indicator are from the gradient + * + */ + + bool mask_needed = false; + if(hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_HOR) mask_needed = true; + else if(!hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_VER) mask_needed = true; + + if(draw_rect_dsc.bg_image_src) mask_needed = true; + + bool radius_issue = true; + /*The indicator is fully drawn if it's larger than the bg*/ + if((bg_left < 0 || bg_right < 0 || bg_top < 0 || bg_bottom < 0)) radius_issue = false; + else if(indic_radius >= bg_radius) radius_issue = false; + else if(lv_area_is_in(&indic_area, &bar_coords, bg_radius)) radius_issue = false; + + if(radius_issue || mask_needed) { + if(!radius_issue) { + /*Draw only the shadow*/ + lv_draw_rect_dsc_t draw_rect_tmp_dsc = draw_rect_dsc; + draw_rect_tmp_dsc.border_opa = 0; + draw_rect_tmp_dsc.outline_opa = 0; + draw_rect_tmp_dsc.bg_opa = 0; + draw_rect_tmp_dsc.bg_image_opa = 0; + lv_draw_rect(layer, &draw_rect_tmp_dsc, &indic_area); + } + else { + draw_rect_dsc.border_opa = 0; + draw_rect_dsc.outline_opa = 0; + } + draw_rect_dsc.shadow_opa = 0; + + /*If clipped for any reason cannot the border, outline, and shadow + *as they would be clipped and looked ugly*/ + lv_draw_rect_dsc_t draw_tmp_dsc = draw_rect_dsc; + draw_tmp_dsc.border_opa = 0; + draw_tmp_dsc.outline_opa = 0; + draw_tmp_dsc.shadow_opa = 0; + lv_area_t indic_draw_area = indic_area; + if(mask_needed) { + if(hor) { + indic_draw_area.x1 = bar_coords.x1 + bg_left; + indic_draw_area.x2 = bar_coords.x2 - bg_right; + } + else { + indic_draw_area.y1 = bar_coords.y1 + bg_top; + indic_draw_area.y2 = bar_coords.y2 - bg_bottom; + } + draw_tmp_dsc.radius = 0; + } + + lv_layer_t * layer_indic = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &indic_draw_area); + + lv_draw_rect(layer_indic, &draw_tmp_dsc, &indic_draw_area); + + lv_draw_mask_rect_dsc_t mask_dsc; + lv_draw_mask_rect_dsc_init(&mask_dsc); + if(radius_issue) { + mask_dsc.area = bar_coords; + mask_dsc.radius = bg_radius; + lv_draw_mask_rect(layer_indic, &mask_dsc); + } + + if(mask_needed) { + mask_dsc.area = indic_area; + mask_dsc.radius = indic_radius; + lv_draw_mask_rect(layer_indic, &mask_dsc); + } + + lv_draw_image_dsc_t layer_draw_dsc; + lv_draw_image_dsc_init(&layer_draw_dsc); + layer_draw_dsc.src = layer_indic; + lv_draw_layer(layer, &layer_draw_dsc, &indic_draw_area); + + /*Add the border, outline, and shadow only to the indicator area. + *They might have disabled if there is a radius_issue*/ + draw_tmp_dsc = draw_rect_dsc; + draw_tmp_dsc.bg_opa = 0; + draw_tmp_dsc.bg_image_opa = 0; + lv_draw_rect(layer, &draw_tmp_dsc, &indic_area); + + } + else { + lv_draw_rect(layer, &draw_rect_dsc, &indic_area); + } + + if(!backdrop_blur) lv_draw_blur(layer, &draw_blur_dsc, &indic_area); +} + +static void lv_bar_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t indic_size; + indic_size = lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR); + + /*Bg size is handled by lv_obj*/ + int32_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, indic_size); + + /*Calculate the indicator area*/ + int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + int32_t pad = LV_MIN4(bg_left, bg_right, bg_top, bg_bottom); + if(pad < 0) { + *s = *s - pad; + } + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED) { + lv_bar_t * bar = (lv_bar_t *)obj; + lv_obj_invalidate_area(obj, &bar->indic_area); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_indic(e); + } +} + +static void lv_bar_anim(void * var, int32_t value) +{ + lv_bar_anim_t * bar_anim = var; + bar_anim->anim_state = value; + lv_obj_invalidate(bar_anim->bar); +} + +static void lv_bar_anim_completed(lv_anim_t * a) +{ + lv_bar_anim_t * var = a->var; + lv_obj_t * obj = (lv_obj_t *)var->bar; + lv_bar_t * bar = (lv_bar_t *)obj; + + var->anim_state = LV_BAR_ANIM_STATE_INV; + if(var == &bar->cur_value_anim) + bar->cur_value = var->anim_end; + else if(var == &bar->start_value_anim) + bar->start_value = var->anim_end; + lv_obj_invalidate(var->bar); +} + +static void lv_bar_set_value_with_anim(lv_obj_t * obj, int32_t new_value, int32_t * value_ptr, + lv_bar_anim_t * anim_info, lv_anim_enable_t en) +{ + if(en == LV_ANIM_OFF) { + lv_anim_delete(anim_info, NULL); + anim_info->anim_state = LV_BAR_ANIM_STATE_INV; + *value_ptr = new_value; + lv_obj_invalidate((lv_obj_t *)obj); + + /*Stop the previous animation if it exists*/ + lv_anim_delete(anim_info, NULL); + /*Reset animation state*/ + lv_bar_init_anim(obj, anim_info); + } + else { + /*No animation in progress -> simply set the values*/ + if(anim_info->anim_state == LV_BAR_ANIM_STATE_INV) { + anim_info->anim_start = *value_ptr; + anim_info->anim_end = new_value; + } + /*Animation in progress. Start from the animation end value*/ + else { + anim_info->anim_start = anim_info->anim_end; + anim_info->anim_end = new_value; + } + *value_ptr = new_value; + /*Stop the previous animation if it exists*/ + lv_anim_delete(anim_info, NULL); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, anim_info); + lv_anim_set_exec_cb(&a, lv_bar_anim); + lv_anim_set_values(&a, LV_BAR_ANIM_STATE_START, LV_BAR_ANIM_STATE_END); + lv_anim_set_completed_cb(&a, lv_bar_anim_completed); + lv_anim_set_duration(&a, lv_obj_get_style_anim_duration(obj, LV_PART_MAIN)); + lv_anim_start(&a); + } +} + +static void lv_bar_init_anim(lv_obj_t * obj, lv_bar_anim_t * bar_anim) +{ + bar_anim->bar = obj; + bar_anim->anim_start = 0; + bar_anim->anim_end = 0; + bar_anim->anim_state = LV_BAR_ANIM_STATE_INV; +} + +#if LV_USE_OBSERVER + +static void bar_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_obj_t * obj = lv_observer_get_target_obj(observer); + /*If the bar is not rendered yet show the new state immediately*/ + lv_anim_enable_t anim_on = obj->rendered ? LV_ANIM_ON : LV_ANIM_OFF; + if(subject->type == LV_SUBJECT_TYPE_INT) { + lv_bar_set_value(observer->target, subject->value.num, anim_on); + } +#if LV_USE_FLOAT + else { + lv_bar_set_value(observer->target, (int32_t)subject->value.float_v, anim_on); + } +#endif +} + +#if LV_USE_OBJ_PROPERTY +static void lv_bar_set_value_helper(lv_obj_t * obj, int32_t value) +{ + lv_bar_set_value(obj, value, LV_ANIM_OFF); +} + +static void lv_bar_set_start_value_helper(lv_obj_t * obj, int32_t value) +{ + lv_bar_set_start_value(obj, value, LV_ANIM_OFF); +} +#endif + +#endif /*LV_USE_OBSERVER*/ + +#endif diff --git a/inc/lvgl/src/widgets/bar/lv_bar.h b/inc/lvgl/src/widgets/bar/lv_bar.h new file mode 100644 index 0000000..5b68198 --- /dev/null +++ b/inc/lvgl/src/widgets/bar/lv_bar.h @@ -0,0 +1,199 @@ +/** + * @file lv_bar.h + * + */ + +#ifndef LV_BAR_H +#define LV_BAR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_BAR != 0 + +#include "../../core/lv_obj.h" +#include "../../misc/lv_anim.h" +#include "../label/lv_label.h" +#include "../../core/lv_observer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_BAR_MODE_NORMAL, + LV_BAR_MODE_SYMMETRICAL, + LV_BAR_MODE_RANGE +} lv_bar_mode_t; + +typedef enum { + LV_BAR_ORIENTATION_AUTO, + LV_BAR_ORIENTATION_HORIZONTAL, + LV_BAR_ORIENTATION_VERTICAL +} lv_bar_orientation_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_bar_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_bar_id_t { + LV_PROPERTY_ID(BAR, VALUE, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(BAR, START_VALUE, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(BAR, MIN_VALUE, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(BAR, MAX_VALUE, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(BAR, MODE, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_ID(BAR, ORIENTATION, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_BAR_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a bar object + * @param parent pointer to an object, it will be the parent of the new bar + * @return pointer to the created bar + */ +lv_obj_t * lv_bar_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new value on the bar + * @param obj pointer to a bar object + * @param value new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +void lv_bar_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); + +/** + * Set a new start value on the bar + * @param obj pointer to a bar object + * @param start_value new start value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +void lv_bar_set_start_value(lv_obj_t * obj, int32_t start_value, lv_anim_enable_t anim); + +/** + * Set minimum and the maximum values of a bar + * @param obj pointer to the bar object + * @param min minimum value + * @param max maximum value + * @note If min is greater than max, the drawing direction becomes to the opposite direction. + */ +void lv_bar_set_range(lv_obj_t * obj, int32_t min, int32_t max); + +/** + * Set minimum value of a bar + * @param obj pointer to the bar object + * @param min minimum value + */ +void lv_bar_set_min_value(lv_obj_t * obj, int32_t min); + +/** + * Set maximum value of a bar + * @param obj pointer to the bar object + * @param max maximum value + */ +void lv_bar_set_max_value(lv_obj_t * obj, int32_t max); + +/** + * Set the type of bar. + * @param obj pointer to bar object + * @param mode bar type from `lv_bar_mode_t` + */ +void lv_bar_set_mode(lv_obj_t * obj, lv_bar_mode_t mode); + +/** + * Set the orientation of bar. + * @param obj pointer to bar object + * @param orientation bar orientation from `lv_bar_orientation_t` + */ +void lv_bar_set_orientation(lv_obj_t * obj, lv_bar_orientation_t orientation); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the value of a bar + * @param obj pointer to a bar object + * @return the value of the bar + */ +int32_t lv_bar_get_value(const lv_obj_t * obj); + +/** + * Get the start value of a bar + * @param obj pointer to a bar object + * @return the start value of the bar + */ +int32_t lv_bar_get_start_value(const lv_obj_t * obj); + +/** + * Get the minimum value of a bar + * @param obj pointer to a bar object + * @return the minimum value of the bar + */ +int32_t lv_bar_get_min_value(const lv_obj_t * obj); + +/** + * Get the maximum value of a bar + * @param obj pointer to a bar object + * @return the maximum value of the bar + */ +int32_t lv_bar_get_max_value(const lv_obj_t * obj); + +/** + * Get the type of bar. + * @param obj pointer to bar object + * @return bar type from `lv_bar_mode_t` + */ +lv_bar_mode_t lv_bar_get_mode(lv_obj_t * obj); + +/** + * Get the orientation of bar. + * @param obj pointer to bar object + * @return bar orientation from `lv_bar_orientation_t` + */ +lv_bar_orientation_t lv_bar_get_orientation(lv_obj_t * obj); + +/** + * Give the bar is in symmetrical mode or not + * @param obj pointer to bar object + * @return true: in symmetrical mode false : not in +*/ +bool lv_bar_is_symmetrical(lv_obj_t * obj); + +#if LV_USE_OBSERVER +/** + * Bind an integer or float Subject to a Bar's value. + * @param obj pointer to Bar + * @param subject pointer to Subject + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_bar_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BAR*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BAR_H*/ diff --git a/inc/lvgl/src/widgets/bar/lv_bar_private.h b/inc/lvgl/src/widgets/bar/lv_bar_private.h new file mode 100644 index 0000000..c403805 --- /dev/null +++ b/inc/lvgl/src/widgets/bar/lv_bar_private.h @@ -0,0 +1,66 @@ +/** + * @file lv_bar_private.h + * + */ + +#ifndef LV_BAR_PRIVATE_H +#define LV_BAR_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_bar.h" + +#if LV_USE_BAR != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_bar_anim_t { + lv_obj_t * bar; + int32_t anim_start; + int32_t anim_end; + int32_t anim_state; +}; + +struct _lv_bar_t { + lv_obj_t obj; + int32_t cur_value; /**< Current value of the bar*/ + int32_t min_value; /**< Minimum value of the bar*/ + int32_t max_value; /**< Maximum value of the bar*/ + int32_t start_value; /**< Start value of the bar*/ + lv_area_t indic_area; /**< Save the indicator area. Might be used by derived types*/ + bool val_reversed; /**< Whether value been reversed */ + lv_bar_anim_t cur_value_anim; + lv_bar_anim_t start_value_anim; + lv_bar_mode_t mode : 3; /**< Type of bar*/ + lv_bar_orientation_t orientation : 3; /**< Orientation of bar*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_BAR != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BAR_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/button/lv_button.c b/inc/lvgl/src/widgets/button/lv_button.c new file mode 100644 index 0000000..1b0c244 --- /dev/null +++ b/inc/lvgl/src/widgets/button/lv_button.c @@ -0,0 +1,72 @@ +/** + * @file lv_button.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_button_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_BUTTON != 0 + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_button_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_button_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_button_class = { + .constructor_cb = lv_button_constructor, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_button_t), + .base_class = &lv_obj_class, + .name = "lv_button", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_button_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_button_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + LV_TRACE_OBJ_CREATE("finished"); +} + +#endif diff --git a/inc/lvgl/src/widgets/button/lv_button.h b/inc/lvgl/src/widgets/button/lv_button.h new file mode 100644 index 0000000..eb7a0a5 --- /dev/null +++ b/inc/lvgl/src/widgets/button/lv_button.h @@ -0,0 +1,48 @@ +/** + * @file lv_button.h + * + */ + +#ifndef LV_BUTTON_H +#define LV_BUTTON_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_BUTTON != 0 +#include "../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_button_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a button object + * @param parent pointer to an object, it will be the parent of the new button + * @return pointer to the created button + */ +lv_obj_t * lv_button_create(lv_obj_t * parent); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BUTTON*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BUTTON_H*/ diff --git a/inc/lvgl/src/widgets/button/lv_button_private.h b/inc/lvgl/src/widgets/button/lv_button_private.h new file mode 100644 index 0000000..c89c93a --- /dev/null +++ b/inc/lvgl/src/widgets/button/lv_button_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_button_private.h + * + */ + +#ifndef LV_BUTTON_PRIVATE_H +#define LV_BUTTON_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_button.h" + +#if LV_USE_BUTTON != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_button_t { + lv_obj_t obj; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_BUTTON != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BUTTON_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c b/inc/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c new file mode 100644 index 0000000..27befa3 --- /dev/null +++ b/inc/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c @@ -0,0 +1,1109 @@ +/** + * @file lv_buttonmatrix.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_buttonmatrix_private.h" +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_BUTTONMATRIX != 0 + +#include "../../misc/lv_assert.h" +#include "../../indev/lv_indev.h" +#include "../../core/lv_group.h" +#include "../../draw/lv_draw.h" +#include "../../core/lv_refr.h" +#include "../../misc/lv_text_private.h" +#include "../../misc/lv_text_ap.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_buttonmatrix_class) + +#define BTN_EXTRA_CLICK_AREA_MAX (LV_DPI_DEF / 10) +#define LV_BUTTONMATRIX_WIDTH_MASK 0x000F + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_buttonmatrix_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_buttonmatrix_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_buttonmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static uint32_t get_button_width(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_hidden(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_checked(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_repeat_disabled(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_inactive(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_click_trig(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_popover(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_is_checkable(lv_buttonmatrix_ctrl_t ctrl_bits); +static bool button_get_checked(lv_buttonmatrix_ctrl_t ctrl_bits); +static uint32_t get_button_from_point(lv_obj_t * obj, lv_point_t * p); +static void allocate_button_areas_and_controls(const lv_obj_t * obj, const char * const * map); +static void invalidate_button_area(const lv_obj_t * obj, uint32_t btn_idx); +static void make_one_button_checked(lv_obj_t * obj, uint32_t btn_idx); +static bool has_popovers_in_top_row(lv_obj_t * obj); +static bool button_is_recolor(lv_buttonmatrix_ctrl_t ctrl_bits); +static void update_map(lv_obj_t * obj); +static void free_map(lv_buttonmatrix_t * btnm); + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_WIDGETS_HAS_DEFAULT_VALUE +static const char * const lv_buttonmatrix_def_map[] = {"Btn1", "Btn2", "Btn3", "\n", "Btn4", "Btn5", ""}; +#endif + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_buttonmatrix_properties[] = { + { + .id = LV_PROPERTY_BUTTONMATRIX_SELECTED_BUTTON, + .setter = lv_buttonmatrix_set_selected_button, + .getter = lv_buttonmatrix_get_selected_button, + }, + { + .id = LV_PROPERTY_BUTTONMATRIX_ONE_CHECKED, + .setter = lv_buttonmatrix_set_one_checked, + .getter = lv_buttonmatrix_get_one_checked, + }, +}; +#endif + +const lv_obj_class_t lv_buttonmatrix_class = { + .constructor_cb = lv_buttonmatrix_constructor, + .destructor_cb = lv_buttonmatrix_destructor, + .event_cb = lv_buttonmatrix_event, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_buttonmatrix_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .base_class = &lv_obj_class, + .name = "lv_buttonmatrix", + LV_PROPERTY_CLASS_FIELDS(buttonmatrix, BUTTONMATRIX) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_buttonmatrix_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_buttonmatrix_set_map(lv_obj_t * obj, const char * const map[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + if(map == NULL) return; + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btnm->auto_free_map) free_map(btnm); + btnm->auto_free_map = 0; + + /*Analyze the map and create the required number of buttons*/ + allocate_button_areas_and_controls(obj, map); + btnm->map_p = map; + + update_map(obj); +} + +void lv_buttonmatrix_set_ctrl_map(lv_obj_t * obj, const lv_buttonmatrix_ctrl_t ctrl_map[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + lv_memcpy(btnm->ctrl_bits, ctrl_map, sizeof(lv_buttonmatrix_ctrl_t) * btnm->btn_cnt); + + update_map(obj); +} + +void lv_buttonmatrix_set_selected_button(lv_obj_t * obj, uint32_t btn_id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + if(btn_id >= btnm->btn_cnt && btn_id != LV_BUTTONMATRIX_BUTTON_NONE) return; + + invalidate_button_area(obj, btnm->btn_id_sel); + btnm->btn_id_sel = btn_id; + invalidate_button_area(obj, btn_id); +} + +void lv_buttonmatrix_set_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + if(btn_id >= btnm->btn_cnt) return; + + if(btnm->one_check && (ctrl & LV_BUTTONMATRIX_CTRL_CHECKED)) { + lv_buttonmatrix_clear_button_ctrl_all(obj, LV_BUTTONMATRIX_CTRL_CHECKED); + } + + btnm->ctrl_bits[btn_id] |= ctrl; + invalidate_button_area(obj, btn_id); + + if(ctrl & LV_BUTTONMATRIX_CTRL_POPOVER) { + lv_obj_refresh_ext_draw_size(obj); + } +} + +void lv_buttonmatrix_clear_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + if(btn_id >= btnm->btn_cnt) return; + + btnm->ctrl_bits[btn_id] &= (~ctrl); + invalidate_button_area(obj, btn_id); + + if(ctrl & LV_BUTTONMATRIX_CTRL_POPOVER) { + lv_obj_refresh_ext_draw_size(obj); + } +} + +void lv_buttonmatrix_set_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + uint32_t i; + for(i = 0; i < btnm->btn_cnt; i++) { + lv_buttonmatrix_set_button_ctrl(obj, i, ctrl); + } +} + +void lv_buttonmatrix_clear_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + uint32_t i; + for(i = 0; i < btnm->btn_cnt; i++) { + lv_buttonmatrix_clear_button_ctrl(obj, i, ctrl); + } +} + +void lv_buttonmatrix_set_button_width(lv_obj_t * obj, uint32_t btn_id, uint32_t width) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btn_id >= btnm->btn_cnt) return; + btnm->ctrl_bits[btn_id] &= (~LV_BUTTONMATRIX_WIDTH_MASK); + btnm->ctrl_bits[btn_id] |= (LV_BUTTONMATRIX_WIDTH_MASK & width); + + update_map(obj); +} + +void lv_buttonmatrix_set_one_checked(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + btnm->one_check = en; + + /*If more than one button is toggled only the first one should be*/ + make_one_button_checked(obj, 0); +} + +/*===================== + * Getter functions + *====================*/ + +const char * const * lv_buttonmatrix_get_map(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + return btnm->map_p; +} + +uint32_t lv_buttonmatrix_get_selected_button(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + return btnm->btn_id_sel; +} + +const char * lv_buttonmatrix_get_button_text(const lv_obj_t * obj, uint32_t btn_id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(btn_id == LV_BUTTONMATRIX_BUTTON_NONE) return NULL; + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btn_id >= btnm->btn_cnt) return NULL; + + uint32_t txt_i = 0; + uint32_t btn_i = 0; + + /*Search the text of btnm->btn_pr the buttons text in the map + *Skip "\n"-s*/ + while(btn_i != btn_id) { + btn_i++; + txt_i++; + if(lv_strcmp(btnm->map_p[txt_i], "\n") == 0) txt_i++; + } + + if(btn_i == btnm->btn_cnt) return NULL; + + return btnm->map_p[txt_i]; +} + +bool lv_buttonmatrix_has_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btn_id >= btnm->btn_cnt) return false; + + return (btnm->ctrl_bits[btn_id] & ctrl) == ctrl; +} + +bool lv_buttonmatrix_get_one_checked(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + return btnm->one_check; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_buttonmatrix_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + btnm->btn_cnt = 0; + btnm->row_cnt = 0; + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + btnm->button_areas = NULL; + btnm->ctrl_bits = NULL; + btnm->map_p = NULL; + btnm->one_check = 0; + btnm->auto_free_map = 0; + +#if LV_WIDGETS_HAS_DEFAULT_VALUE + lv_buttonmatrix_set_map(obj, lv_buttonmatrix_def_map); +#endif + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_buttonmatrix_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + LV_UNUSED(class_p); + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + lv_free(btnm->button_areas); + lv_free(btnm->ctrl_bits); + btnm->button_areas = NULL; + btnm->ctrl_bits = NULL; + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_buttonmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + lv_point_t p; + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + if(has_popovers_in_top_row(obj)) { + /*reserve one row worth of extra space to account for popovers in the top row*/ + int32_t s = btnm->row_cnt > 0 ? lv_obj_get_content_height(obj) / btnm->row_cnt : 0; + lv_event_set_ext_draw_size(e, s); + } + } + if(code == LV_EVENT_STYLE_CHANGED) { + update_map(obj); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + update_map(obj); + } + else if(code == LV_EVENT_PRESSED) { + lv_indev_t * indev = lv_event_get_indev(e); + invalidate_button_area(obj, btnm->btn_id_sel); + + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { + uint32_t btn_pr; + /*Search the pressed area*/ + lv_indev_get_point(indev, &p); + btn_pr = get_button_from_point(obj, &p); + /*Handle the case where there is no button there*/ + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + if(btn_pr != LV_BUTTONMATRIX_BUTTON_NONE) { + if(button_is_inactive(btnm->ctrl_bits[btn_pr]) == false && + button_is_hidden(btnm->ctrl_bits[btn_pr]) == false) { + btnm->btn_id_sel = btn_pr; + invalidate_button_area(obj, btnm->btn_id_sel); /*Invalidate the new area*/ + } + } + else { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + } + + if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { + if(button_is_click_trig(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btnm->btn_id_sel; + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RESULT_OK) return; + } + } + } + else if(code == LV_EVENT_PRESSING) { + if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { + lv_indev_t * indev = lv_event_get_indev(e); + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { + /*If pointer device slid to a new button, discard the current button and don't press any buttons*/ + lv_indev_get_point(indev, &p); + uint32_t btn_pr = get_button_from_point(obj, &p); + if(btn_pr != btnm->btn_id_sel) { + invalidate_button_area(obj, btnm->btn_id_sel); /*Invalidate the old area*/ + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + } + } + } + else if(code == LV_EVENT_RELEASED) { + if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { + /*Toggle the button if enabled*/ + if(button_is_checkable(btnm->ctrl_bits[btnm->btn_id_sel]) && + !button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + if(button_get_checked(btnm->ctrl_bits[btnm->btn_id_sel]) && !btnm->one_check) { + btnm->ctrl_bits[btnm->btn_id_sel] &= (~LV_BUTTONMATRIX_CTRL_CHECKED); + } + else { + btnm->ctrl_bits[btnm->btn_id_sel] |= LV_BUTTONMATRIX_CTRL_CHECKED; + } + if(btnm->one_check) make_one_button_checked(obj, btnm->btn_id_sel); + } + + if((button_is_click_trig(btnm->ctrl_bits[btnm->btn_id_sel]) == true || + button_is_popover(btnm->ctrl_bits[btnm->btn_id_sel]) == true) && + button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btnm->btn_id_sel; + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RESULT_OK) return; + } + } + + /*Invalidate to old pressed area*/; + invalidate_button_area(obj, btnm->btn_id_sel); + + } + else if(code == LV_EVENT_LONG_PRESSED_REPEAT) { + if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) { + if(button_is_repeat_disabled(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel]) == false && + button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) == false) { + uint32_t b = btnm->btn_id_sel; + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &b); + if(res != LV_RESULT_OK) return; + } + } + } + else if(code == LV_EVENT_PRESS_LOST) { + invalidate_button_area(obj, btnm->btn_id_sel); + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + else if(code == LV_EVENT_FOCUSED) { + if(btnm->btn_cnt == 0) return; + + lv_indev_t * indev = lv_event_get_indev(e); + lv_indev_type_t indev_type = lv_indev_get_type(indev); + + /*If not focused by an input device assume the last input device*/ + if(indev == NULL) { + indev = lv_indev_get_next(NULL); + indev_type = lv_indev_get_type(indev); + } + + bool editing = lv_group_get_editing(lv_obj_get_group(obj)); + /*Focus the first button if there is not selected button*/ + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) { + if(indev_type == LV_INDEV_TYPE_KEYPAD || (indev_type == LV_INDEV_TYPE_ENCODER && editing)) { + uint32_t b = 0; + if(btnm->one_check) { + while(b < btnm->btn_cnt && + (button_is_hidden(btnm->ctrl_bits[b]) || + button_is_inactive(btnm->ctrl_bits[b]) || + button_is_checked(btnm->ctrl_bits[b]) == false)) { + b++; + } + } + else { + while(b < btnm->btn_cnt && + (button_is_hidden(btnm->ctrl_bits[b]) || + button_is_inactive(btnm->ctrl_bits[b]))) { + b++; + } + } + + btnm->btn_id_sel = b; + } + else { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + } + } + else if(code == LV_EVENT_DEFOCUSED || code == LV_EVENT_LEAVE) { + // TODO + // if(btnm->btn_id_sel != LV_BUTTONMATRIX_BUTTON_NONE) invalidate_button_area(obj, btnm->btn_id_sel); + // btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + } + else if(code == LV_EVENT_KEY) { + + invalidate_button_area(obj, btnm->btn_id_sel); + + uint32_t c = lv_event_get_key(e); + if(c == LV_KEY_RIGHT) { + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) btnm->btn_id_sel = 0; + else btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + + uint32_t btn_id_start = btnm->btn_id_sel; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + break; + } + } + } + else if(c == LV_KEY_LEFT) { + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) btnm->btn_id_sel = 0; + + if(btnm->btn_id_sel == 0) btnm->btn_id_sel = btnm->btn_cnt - 1; + else if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + + uint32_t btn_id_start = btnm->btn_id_sel; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + else btnm->btn_id_sel = btnm->btn_cnt - 1; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + break; + } + } + } + else if(c == LV_KEY_DOWN) { + int32_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + /*Find the area below the current*/ + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) { + btnm->btn_id_sel = 0; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + break; + } + } + } + else { + uint32_t area_below; + int32_t pr_center = + btnm->button_areas[btnm->btn_id_sel].x1 + (lv_area_get_width(&btnm->button_areas[btnm->btn_id_sel]) >> 1); + + for(area_below = btnm->btn_id_sel; area_below < btnm->btn_cnt; area_below++) { + if(btnm->button_areas[area_below].y1 > btnm->button_areas[btnm->btn_id_sel].y1 && + pr_center >= btnm->button_areas[area_below].x1 && + pr_center <= btnm->button_areas[area_below].x2 + col_gap && + button_is_inactive(btnm->ctrl_bits[area_below]) == false && + button_is_hidden(btnm->ctrl_bits[area_below]) == false) { + break; + } + } + + if(area_below < btnm->btn_cnt) btnm->btn_id_sel = area_below; + } + } + else if(c == LV_KEY_UP) { + int32_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + /*Find the area below the current*/ + if(btnm->btn_id_sel == LV_BUTTONMATRIX_BUTTON_NONE) { + btnm->btn_id_sel = 0; + while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { + btnm->btn_id_sel++; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BUTTONMATRIX_BUTTON_NONE; + break; + } + } + } + else { + int16_t area_above; + int32_t pr_center = + btnm->button_areas[btnm->btn_id_sel].x1 + (lv_area_get_width(&btnm->button_areas[btnm->btn_id_sel]) >> 1); + + for(area_above = btnm->btn_id_sel; area_above >= 0; area_above--) { + if(btnm->button_areas[area_above].y1 < btnm->button_areas[btnm->btn_id_sel].y1 && + pr_center >= btnm->button_areas[area_above].x1 - col_gap && + pr_center <= btnm->button_areas[area_above].x2 && + button_is_inactive(btnm->ctrl_bits[area_above]) == false && + button_is_hidden(btnm->ctrl_bits[area_above]) == false) { + break; + } + } + if(area_above >= 0) btnm->btn_id_sel = area_above; + } + } + + invalidate_button_area(obj, btnm->btn_id_sel); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } + else if(code == LV_EVENT_DELETE) { + if(btnm->auto_free_map) free_map(btnm); + } + +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btnm->btn_cnt == 0) return; + + lv_layer_t * layer = lv_event_get_layer(e); + obj->skip_trans = 1; + + lv_area_t area_obj; + lv_obj_get_coords(obj, &area_obj); + + lv_area_t btn_area; + + uint32_t btn_i = 0; + uint32_t txt_i = 0; + + lv_draw_rect_dsc_t draw_rect_dsc_act; + lv_draw_label_dsc_t draw_label_dsc_act; + + lv_draw_rect_dsc_t draw_rect_dsc_def; + lv_draw_label_dsc_t draw_label_dsc_def; + + lv_state_t state_ori = obj->state; + obj->state = LV_STATE_DEFAULT; + obj->skip_trans = 1; + lv_draw_rect_dsc_init(&draw_rect_dsc_def); + draw_rect_dsc_def.base.layer = layer; + lv_draw_label_dsc_init(&draw_label_dsc_def); + draw_label_dsc_def.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &draw_rect_dsc_def); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &draw_label_dsc_def); + obj->skip_trans = 0; + obj->state = state_ori; + + int32_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + +#if LV_USE_ARABIC_PERSIAN_CHARS + char txt_ap[256]; +#endif + + for(btn_i = 0; btn_i < btnm->btn_cnt; btn_i++, txt_i++) { + /*Search the next valid text in the map*/ + while(lv_strcmp(btnm->map_p[txt_i], "\n") == 0) { + txt_i++; + } + + /*Skip hidden buttons*/ + if(button_is_hidden(btnm->ctrl_bits[btn_i])) continue; + + /*Get the state of the button*/ + lv_state_t btn_state = LV_STATE_DEFAULT; + if(button_get_checked(btnm->ctrl_bits[btn_i])) btn_state |= LV_STATE_CHECKED; + + if(button_is_inactive(btnm->ctrl_bits[btn_i])) btn_state |= LV_STATE_DISABLED; + else if(btn_i == btnm->btn_id_sel) { + if(state_ori & LV_STATE_PRESSED) btn_state |= LV_STATE_PRESSED; + if(state_ori & LV_STATE_FOCUSED) btn_state |= LV_STATE_FOCUSED; + if(state_ori & LV_STATE_FOCUS_KEY) btn_state |= LV_STATE_FOCUS_KEY; + if(state_ori & LV_STATE_EDITED) btn_state |= LV_STATE_EDITED; + } + + /*Get the button's area*/ + lv_area_copy(&btn_area, &btnm->button_areas[btn_i]); + btn_area.x1 += area_obj.x1; + btn_area.y1 += area_obj.y1; + btn_area.x2 += area_obj.x1; + btn_area.y2 += area_obj.y1; + + /*Set up the draw descriptors*/ + if(btn_state == LV_STATE_DEFAULT) { + lv_memcpy(&draw_rect_dsc_act, &draw_rect_dsc_def, sizeof(lv_draw_rect_dsc_t)); + lv_memcpy(&draw_label_dsc_act, &draw_label_dsc_def, sizeof(lv_draw_label_dsc_t)); + } + /*In other cases get the styles directly without caching them*/ + else { + obj->state = btn_state; + obj->skip_trans = 1; + lv_draw_rect_dsc_init(&draw_rect_dsc_act); + draw_rect_dsc_act.base.layer = layer; + lv_draw_label_dsc_init(&draw_label_dsc_act); + draw_label_dsc_act.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &draw_rect_dsc_act); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &draw_label_dsc_act); + obj->state = state_ori; + obj->skip_trans = 0; + } + + bool recolor = button_is_recolor(btnm->ctrl_bits[btn_i]); + if(recolor) draw_label_dsc_act.flag |= LV_TEXT_FLAG_RECOLOR; + else draw_label_dsc_act.flag &= ~LV_TEXT_FLAG_RECOLOR; + + draw_rect_dsc_act.base.id1 = btn_i; + + /*Remove borders on the edges if `LV_BORDER_SIDE_INTERNAL`*/ + if(draw_rect_dsc_act.border_side & LV_BORDER_SIDE_INTERNAL) { + draw_rect_dsc_act.border_side = LV_BORDER_SIDE_FULL; + if(btn_area.x1 == obj->coords.x1 + pleft) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_LEFT; + if(btn_area.x2 == obj->coords.x2 - pright) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_RIGHT; + if(btn_area.y1 == obj->coords.y1 + ptop) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_TOP; + if(btn_area.y2 == obj->coords.y2 - pbottom) draw_rect_dsc_act.border_side &= ~LV_BORDER_SIDE_BOTTOM; + } + + int32_t btn_height = lv_area_get_height(&btn_area); + + if((btn_state & LV_STATE_PRESSED) && (btnm->ctrl_bits[btn_i] & LV_BUTTONMATRIX_CTRL_POPOVER)) { + /*Push up the upper boundary of the btn area to create the popover*/ + btn_area.y1 -= btn_height; + } + + /*Draw the background*/ + lv_draw_rect(layer, &draw_rect_dsc_act, &btn_area); + + /*Calculate the size of the text*/ + const lv_font_t * font = draw_label_dsc_act.font; + int32_t letter_space = draw_label_dsc_act.letter_space; + int32_t line_space = draw_label_dsc_act.line_space; + const char * txt = btnm->map_p[txt_i]; + +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Get the size of the Arabic text and process it*/ + size_t len_ap = lv_text_ap_calc_bytes_count(txt); + if(len_ap < sizeof(txt_ap)) { + lv_text_ap_proc(txt, txt_ap); + txt = txt_ap; + } +#endif + lv_text_attributes_t attributes = {0}; + attributes.letter_space = letter_space; + attributes.line_space = line_space; + attributes.text_flags = draw_label_dsc_act.flag; + attributes.max_width = lv_area_get_width(&area_obj); + + lv_point_t txt_size; + lv_text_get_size_attributes(&txt_size, txt, font, &attributes); + + btn_area.x1 += (lv_area_get_width(&btn_area) - txt_size.x) / 2; + btn_area.y1 += (lv_area_get_height(&btn_area) - txt_size.y) / 2; + btn_area.x2 = btn_area.x1 + txt_size.x; + btn_area.y2 = btn_area.y1 + txt_size.y; + + if((btn_state & LV_STATE_PRESSED) && (btnm->ctrl_bits[btn_i] & LV_BUTTONMATRIX_CTRL_POPOVER)) { + /*Push up the button text into the popover*/ + btn_area.y1 -= btn_height / 2; + btn_area.y2 -= btn_height / 2; + } + + /*Draw the text*/ + draw_label_dsc_act.text = txt; + draw_label_dsc_act.text_local = true; + draw_label_dsc_act.base.id1 = btn_i; + lv_draw_label(layer, &draw_label_dsc_act, &btn_area); + } + + obj->skip_trans = 0; +} +/** + * Create the required number of buttons and control bytes according to a map + * @param obj pointer to button matrix object + * @param map_p pointer to a string array + */ +static void allocate_button_areas_and_controls(const lv_obj_t * obj, const char * const * map) +{ + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + btnm->row_cnt = 1; + /*Count the buttons in the map*/ + uint32_t btn_cnt = 0; + uint32_t i = 0; + while(map[i] && map[i][0] != '\0') { + if(lv_strcmp(map[i], "\n") != 0) { /*Do not count line breaks*/ + btn_cnt++; + } + else { + btnm->row_cnt++; + } + i++; + } + + /*Do not allocate memory for the same amount of buttons*/ + if(btn_cnt == btnm->btn_cnt) return; + + if(btnm->button_areas != NULL) { + lv_free(btnm->button_areas); + btnm->button_areas = NULL; + } + if(btnm->ctrl_bits != NULL) { + lv_free(btnm->ctrl_bits); + btnm->ctrl_bits = NULL; + } + + btnm->button_areas = lv_malloc(sizeof(lv_area_t) * btn_cnt); + LV_ASSERT_MALLOC(btnm->button_areas); + btnm->ctrl_bits = lv_malloc(sizeof(lv_buttonmatrix_ctrl_t) * btn_cnt); + LV_ASSERT_MALLOC(btnm->ctrl_bits); + if(btnm->button_areas == NULL || btnm->ctrl_bits == NULL) btn_cnt = 0; + + lv_memzero(btnm->ctrl_bits, sizeof(lv_buttonmatrix_ctrl_t) * btn_cnt); + + btnm->btn_cnt = btn_cnt; +} + +/** + * Get the width of a button in units (default is 1). + * @param ctrl_bits least significant 3 bits used (1..7 valid values) + * @return the width of the button in units + */ +static uint32_t get_button_width(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + uint32_t w = ctrl_bits & LV_BUTTONMATRIX_WIDTH_MASK; + return w != 0 ? w : 1; +} + +static bool button_is_hidden(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_HIDDEN; +} + +static bool button_is_checked(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_CHECKED; +} + +static bool button_is_repeat_disabled(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_NO_REPEAT; +} + +static bool button_is_inactive(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_DISABLED; +} + +static bool button_is_click_trig(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_CLICK_TRIG; +} + +static bool button_is_popover(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_POPOVER; +} + +static bool button_is_checkable(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_CHECKABLE; +} + +static bool button_get_checked(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return ctrl_bits & LV_BUTTONMATRIX_CTRL_CHECKED; +} + +/** + * Gives the button id of a button under a given point + * @param obj pointer to a button matrix object + * @param p a point with absolute coordinates + * @return the id of the button or LV_BUTTONMATRIX_BUTTON_NONE. + */ +static uint32_t get_button_from_point(lv_obj_t * obj, lv_point_t * p) +{ + lv_area_t obj_cords; + lv_area_t btn_area; + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + uint32_t i; + lv_obj_get_coords(obj, &obj_cords); + + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t ptop = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t pbottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t prow = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); + int32_t pcol = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + /*Get the half gap. Button look larger with this value. (+1 for rounding error)*/ + prow = (prow / 2) + 1 + (prow & 1); + pcol = (pcol / 2) + 1 + (pcol & 1); + + prow = LV_MIN(prow, BTN_EXTRA_CLICK_AREA_MAX); + pcol = LV_MIN(pcol, BTN_EXTRA_CLICK_AREA_MAX); + pright = LV_MIN(pright, BTN_EXTRA_CLICK_AREA_MAX); + ptop = LV_MIN(ptop, BTN_EXTRA_CLICK_AREA_MAX); + pbottom = LV_MIN(pbottom, BTN_EXTRA_CLICK_AREA_MAX); + + for(i = 0; i < btnm->btn_cnt; i++) { + lv_area_copy(&btn_area, &btnm->button_areas[i]); + if(btn_area.x1 <= pleft) btn_area.x1 += obj_cords.x1 - LV_MIN(pleft, BTN_EXTRA_CLICK_AREA_MAX); + else btn_area.x1 += obj_cords.x1 - pcol; + + if(btn_area.y1 <= ptop) btn_area.y1 += obj_cords.y1 - LV_MIN(ptop, BTN_EXTRA_CLICK_AREA_MAX); + else btn_area.y1 += obj_cords.y1 - prow; + + if(btn_area.x2 >= w - pright - 2) btn_area.x2 += obj_cords.x1 + LV_MIN(pright, + BTN_EXTRA_CLICK_AREA_MAX); /*-2 for rounding error*/ + else btn_area.x2 += obj_cords.x1 + pcol; + + if(btn_area.y2 >= h - pbottom - 2) btn_area.y2 += obj_cords.y1 + LV_MIN(pbottom, + BTN_EXTRA_CLICK_AREA_MAX); /*-2 for rounding error*/ + else btn_area.y2 += obj_cords.y1 + prow; + + if(lv_area_is_point_on(&btn_area, p, 0) != false) { + break; + } + } + + if(i == btnm->btn_cnt) i = LV_BUTTONMATRIX_BUTTON_NONE; + + return i; +} + +static void invalidate_button_area(const lv_obj_t * obj, uint32_t btn_idx) +{ + if(btn_idx == LV_BUTTONMATRIX_BUTTON_NONE) return; + + lv_area_t btn_area; + lv_area_t obj_area; + + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + if(btn_idx >= btnm->btn_cnt) return; + + lv_area_copy(&btn_area, &btnm->button_areas[btn_idx]); + lv_obj_get_coords(obj, &obj_area); + + /*The buttons might have outline and shadow so make the invalidation larger with the gaps between the buttons. + *It assumes that the outline or shadow is smaller than the gaps*/ + int32_t row_gap = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); + int32_t col_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + /*Be sure to have a minimal extra space if row/col_gap is small*/ + int32_t dpi = lv_display_get_dpi(lv_obj_get_display(obj)); + row_gap = LV_MAX(row_gap, dpi / 10); + col_gap = LV_MAX(col_gap, dpi / 10); + + /*Convert relative coordinates to absolute*/ + btn_area.x1 += obj_area.x1 - row_gap; + btn_area.y1 += obj_area.y1 - col_gap; + btn_area.x2 += obj_area.x1 + row_gap; + btn_area.y2 += obj_area.y1 + col_gap; + + if((btn_idx == btnm->btn_id_sel) && (btnm->ctrl_bits[btn_idx] & LV_BUTTONMATRIX_CTRL_POPOVER)) { + /*Push up the upper boundary of the btn area to also invalidate the popover*/ + btn_area.y1 -= lv_area_get_height(&btn_area); + } + + lv_obj_invalidate_area(obj, &btn_area); +} + +/** + * Enforces a single button being toggled on the button matrix. + * It simply clears the toggle flag on other buttons. + * @param obj Button matrix object + * @param btn_idx Button that should remain toggled + */ +static void make_one_button_checked(lv_obj_t * obj, uint32_t btn_idx) +{ + /*Save whether the button was toggled*/ + bool was_toggled = lv_buttonmatrix_has_button_ctrl(obj, btn_idx, LV_BUTTONMATRIX_CTRL_CHECKED); + + lv_buttonmatrix_clear_button_ctrl_all(obj, LV_BUTTONMATRIX_CTRL_CHECKED); + + if(was_toggled) lv_buttonmatrix_set_button_ctrl(obj, btn_idx, LV_BUTTONMATRIX_CTRL_CHECKED); +} + +/** + * Check if any of the buttons in the first row has the LV_BUTTONMATRIX_CTRL_POPOVER control flag set. + * @param obj Button matrix object + * @return true if at least one button has the flag, false otherwise + */ +static bool has_popovers_in_top_row(lv_obj_t * obj) +{ + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + if(btnm->row_cnt <= 0) { + return false; + } + + const char * const * map_row = btnm->map_p; + uint32_t btn_cnt = 0; + + while(map_row[btn_cnt] && lv_strcmp(map_row[btn_cnt], "\n") != 0 && map_row[btn_cnt][0] != '\0') { + if(button_is_popover(btnm->ctrl_bits[btn_cnt])) { + return true; + } + btn_cnt++; + } + + return false; +} + +static bool button_is_recolor(lv_buttonmatrix_ctrl_t ctrl_bits) +{ + return (ctrl_bits & LV_BUTTONMATRIX_CTRL_RECOLOR) ? true : false; +} + +static void update_map(lv_obj_t * obj) +{ + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + /*Set size and positions of the buttons*/ + int32_t sleft = lv_obj_get_style_space_left(obj, LV_PART_MAIN); + int32_t stop = lv_obj_get_style_space_top(obj, LV_PART_MAIN); + int32_t prow = lv_obj_get_style_pad_row(obj, LV_PART_MAIN); + int32_t pcol = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + int32_t max_w = lv_obj_get_content_width(obj); + int32_t max_h = lv_obj_get_content_height(obj); + + /*Calculate the position of each row*/ + int32_t max_h_no_gap = max_h - (prow * (btnm->row_cnt - 1)); + + /*Count the units and the buttons in a line + *(A button can be 1,2,3... unit wide)*/ + uint32_t txt_tot_i = 0; /*Act. index in the str map*/ + uint32_t btn_tot_i = 0; /*Act. index of button areas*/ + const char * const * map_row = btnm->map_p; + + /*Count the units and the buttons in a line*/ + uint32_t row; + for(row = 0; row < btnm->row_cnt; row++) { + uint32_t unit_cnt = 0; /*Number of units in a row*/ + uint32_t btn_cnt = 0; /*Number of buttons in a row*/ + /*Count the buttons and units in this row*/ + while(map_row[btn_cnt] && lv_strcmp(map_row[btn_cnt], "\n") != 0 && map_row[btn_cnt][0] != '\0') { + unit_cnt += get_button_width(btnm->ctrl_bits[btn_tot_i + btn_cnt]); + btn_cnt++; + } + + /*Only deal with the non empty lines*/ + if(btn_cnt == 0) { + map_row = &map_row[btn_cnt + 1]; /*Set the map to the next row*/ + continue; + } + + int32_t row_y1 = stop + (max_h_no_gap * row) / btnm->row_cnt + row * prow; + int32_t row_y2 = stop + (max_h_no_gap * (row + 1)) / btnm->row_cnt + row * prow - 1; + + /*Set the button size and positions*/ + int32_t max_w_no_gap = max_w - (pcol * (btn_cnt - 1)); + if(max_w_no_gap < 0) max_w_no_gap = 0; + + uint32_t row_unit_cnt = 0; /*The current unit position in the row*/ + uint32_t btn; + for(btn = 0; btn < btn_cnt; btn++, btn_tot_i++, txt_tot_i++) { + uint32_t btn_u = get_button_width(btnm->ctrl_bits[btn_tot_i]); + + int32_t btn_x1 = (max_w_no_gap * row_unit_cnt) / unit_cnt + btn * pcol; + int32_t btn_x2 = (max_w_no_gap * (row_unit_cnt + btn_u)) / unit_cnt + btn * pcol - 1; + + /*If RTL start from the right*/ + if(base_dir == LV_BASE_DIR_RTL) { + int32_t tmp = btn_x1; + btn_x1 = btn_x2; + btn_x2 = tmp; + + btn_x1 = max_w - btn_x1; + btn_x2 = max_w - btn_x2; + } + + btn_x1 += sleft; + btn_x2 += sleft; + + lv_area_set(&btnm->button_areas[btn_tot_i], btn_x1, row_y1, btn_x2, row_y2); + + row_unit_cnt += btn_u; + } + + map_row = &map_row[btn_cnt + 1]; /*Set the map to the next line*/ + } + + /*Popovers in the top row will draw outside the widget and the extended draw size depends on + *the row height which may have changed when setting the new map*/ + lv_obj_refresh_ext_draw_size(obj); + + lv_obj_invalidate(obj); + +} + +static void free_map(lv_buttonmatrix_t * btnm) +{ + uint32_t i; + for(i = 0; btnm->map_p[i]; i++) { + lv_free((void *)btnm->map_p[i]); + } + lv_free((void *)btnm->map_p); + btnm->map_p = NULL; +} + +#endif diff --git a/inc/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.h b/inc/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.h new file mode 100644 index 0000000..771be50 --- /dev/null +++ b/inc/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.h @@ -0,0 +1,227 @@ +/** + * @file lv_buttonmatrix.h + * + */ + +#ifndef LV_BUTTONMATRIX_H +#define LV_BUTTONMATRIX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_BUTTONMATRIX != 0 + +#include "../../core/lv_obj.h" +#include "../../core/lv_obj_property.h" + +/********************* + * DEFINES + *********************/ +#define LV_BUTTONMATRIX_BUTTON_NONE 0xFFFF +LV_EXPORT_CONST_INT(LV_BUTTONMATRIX_BUTTON_NONE); + +/********************** + * TYPEDEFS + **********************/ + +/** Type to store button control flags (disabled, hidden etc.) + * The least-significant 4 bits are used to store button-width proportions in range [1..15]. */ +typedef enum { + LV_BUTTONMATRIX_CTRL_NONE = 0x0000, /**< No extra control, use the default settings*/ + LV_BUTTONMATRIX_CTRL_WIDTH_1 = 0x0001, /**< Set the width to 1 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_2 = 0x0002, /**< Set the width to 2 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_3 = 0x0003, /**< Set the width to 3 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_4 = 0x0004, /**< Set the width to 4 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_5 = 0x0005, /**< Set the width to 5 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_6 = 0x0006, /**< Set the width to 6 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_7 = 0x0007, /**< Set the width to 7 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_8 = 0x0008, /**< Set the width to 8 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_9 = 0x0009, /**< Set the width to 9 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_10 = 0x000A, /**< Set the width to 10 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_11 = 0x000B, /**< Set the width to 11 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_12 = 0x000C, /**< Set the width to 12 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_13 = 0x000D, /**< Set the width to 13 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_14 = 0x000E, /**< Set the width to 14 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_WIDTH_15 = 0x000F, /**< Set the width to 15 relative to the other buttons in the same row */ + LV_BUTTONMATRIX_CTRL_HIDDEN = 0x0010, /**< Hides button; it continues to hold its space in layout. */ + LV_BUTTONMATRIX_CTRL_NO_REPEAT = 0x0020, /**< Do not emit LV_EVENT_LONG_PRESSED_REPEAT events while button is long-pressed. */ + LV_BUTTONMATRIX_CTRL_DISABLED = 0x0040, /**< Disables button like LV_STATE_DISABLED on normal Widgets. */ + LV_BUTTONMATRIX_CTRL_CHECKABLE = 0x0080, /**< Enable toggling of LV_STATE_CHECKED when clicked. */ + LV_BUTTONMATRIX_CTRL_CHECKED = 0x0100, /**< Make the button checked. It will use the :cpp:enumerator:`LV_STATE_CHECHKED` styles. */ + LV_BUTTONMATRIX_CTRL_CLICK_TRIG = 0x0200, /**< 1: Enables sending LV_EVENT_VALUE_CHANGE on CLICK, 0: sends LV_EVENT_VALUE_CHANGE on PRESS. */ + LV_BUTTONMATRIX_CTRL_POPOVER = 0x0400, /**< Show button text in a pop-over while being pressed. */ + LV_BUTTONMATRIX_CTRL_RECOLOR = 0x0800, /**< Enable text recoloring with `#color` */ + LV_BUTTONMATRIX_CTRL_RESERVED_1 = 0x1000, /**< Reserved for later use */ + LV_BUTTONMATRIX_CTRL_RESERVED_2 = 0x2000, /**< Reserved for later use */ + LV_BUTTONMATRIX_CTRL_CUSTOM_1 = 0x4000, /**< Custom free-to-use flag */ + LV_BUTTONMATRIX_CTRL_CUSTOM_2 = 0x8000, /**< Custom free-to-use flag */ +} lv_buttonmatrix_ctrl_t; + +typedef bool (*lv_buttonmatrix_button_draw_cb_t)(lv_obj_t * btnm, uint32_t btn_id, const lv_area_t * draw_area, + const lv_area_t * clip_area); + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_buttonmatrix_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_buttonmatrix_id_t { + LV_PROPERTY_ID(BUTTONMATRIX, SELECTED_BUTTON, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(BUTTONMATRIX, ONE_CHECKED, LV_PROPERTY_TYPE_BOOL, 1), + LV_PROPERTY_BUTTONMATRIX_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a button matrix object + * @param parent pointer to an object, it will be the parent of the new button matrix + * @return pointer to the created button matrix + */ +lv_obj_t * lv_buttonmatrix_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new map. Buttons will be created/deleted according to the map. The + * button matrix keeps a reference to the map and so the string array must not + * be deallocated during the life of the matrix. + * @param obj pointer to a button matrix object + * @param map pointer a string array. The last string has to be: "". Use "\n" to make a line break. + */ +void lv_buttonmatrix_set_map(lv_obj_t * obj, const char * const map[]); + +/** + * Set the button control map (hidden, disabled etc.) for a button matrix. + * The control map array will be copied and so may be deallocated after this + * function returns. + * @param obj pointer to a button matrix object + * @param ctrl_map pointer to an array of `lv_button_ctrl_t` control bytes. The + * length of the array and position of the elements must match + * the number and order of the individual buttons (i.e. excludes + * newline entries). + * An element of the map should look like e.g.: + * `ctrl_map[0] = width | LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_TGL_ENABLE` + */ +void lv_buttonmatrix_set_ctrl_map(lv_obj_t * obj, const lv_buttonmatrix_ctrl_t ctrl_map[]); + +/** + * Set the selected buttons + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. (Not counting new lines) + */ +void lv_buttonmatrix_set_selected_button(lv_obj_t * obj, uint32_t btn_id); + +/** + * Set the attributes of a button of the button matrix + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. (Not counting new lines) + * @param ctrl OR-ed attributes. E.g. `LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CHECKABLE` + */ +void lv_buttonmatrix_set_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Clear the attributes of a button of the button matrix + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. (Not counting new lines) + * @param ctrl OR-ed attributes. E.g. `LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CHECKABLE` + */ +void lv_buttonmatrix_clear_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Set attributes of all buttons of a button matrix + * @param obj pointer to a button matrix object + * @param ctrl attribute(s) to set from `lv_buttonmatrix_ctrl_t`. Values can be ORed. + */ +void lv_buttonmatrix_set_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Clear the attributes of all buttons of a button matrix + * @param obj pointer to a button matrix object + * @param ctrl attribute(s) to set from `lv_buttonmatrix_ctrl_t`. Values can be ORed. + */ +void lv_buttonmatrix_clear_button_ctrl_all(lv_obj_t * obj, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Set a single button's relative width. + * This method will cause the matrix be regenerated and is a relatively + * expensive operation. It is recommended that initial width be specified using + * `lv_buttonmatrix_set_ctrl_map` and this method only be used for dynamic changes. + * @param obj pointer to button matrix object + * @param btn_id 0 based index of the button to modify. + * @param width relative width compared to the buttons in the same row. [1..15] + */ +void lv_buttonmatrix_set_button_width(lv_obj_t * obj, uint32_t btn_id, uint32_t width); + +/** + * Make the button matrix like a selector widget (only one button may be checked at a time). + * `LV_BUTTONMATRIX_CTRL_CHECKABLE` must be enabled on the buttons to be selected using + * `lv_buttonmatrix_set_ctrl()` or `lv_buttonmatrix_set_button_ctrl_all()`. + * @param obj pointer to a button matrix object + * @param en whether "one check" mode is enabled + */ +void lv_buttonmatrix_set_one_checked(lv_obj_t * obj, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the current map of a button matrix + * @param obj pointer to a button matrix object + * @return the current map + */ +const char * const * lv_buttonmatrix_get_map(const lv_obj_t * obj); + +/** + * Get the index of the lastly "activated" button by the user (pressed, released, focused etc) + * Useful in the `event_cb` to get the text of the button, check if hidden etc. + * @param obj pointer to button matrix object + * @return index of the last released button (LV_BUTTONMATRIX_BUTTON_NONE: if unset) + */ +uint32_t lv_buttonmatrix_get_selected_button(const lv_obj_t * obj); + +/** + * Get the button's text + * @param obj pointer to button matrix object + * @param btn_id the index a button not counting new line characters. + * @return text of btn_index` button + */ +const char * lv_buttonmatrix_get_button_text(const lv_obj_t * obj, uint32_t btn_id); + +/** + * Get the whether a control value is enabled or disabled for button of a button matrix + * @param obj pointer to a button matrix object + * @param btn_id the index of a button not counting new line characters. + * @param ctrl control values to check (ORed value can be used) + * @return true: the control attribute is enabled false: disabled + */ +bool lv_buttonmatrix_has_button_ctrl(lv_obj_t * obj, uint32_t btn_id, lv_buttonmatrix_ctrl_t ctrl); + +/** + * Tell whether "one check" mode is enabled or not. + * @param obj Button matrix object + * @return true: "one check" mode is enabled; false: disabled + */ +bool lv_buttonmatrix_get_one_checked(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BUTTONMATRIX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BUTTONMATRIX_H*/ diff --git a/inc/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix_private.h b/inc/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix_private.h new file mode 100644 index 0000000..3f6b0fa --- /dev/null +++ b/inc/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix_private.h @@ -0,0 +1,58 @@ +/** + * @file lv_buttonmatrix_private.h + * + */ + +#ifndef LV_BUTTONMATRIX_PRIVATE_H +#define LV_BUTTONMATRIX_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_buttonmatrix.h" + +#if LV_USE_BUTTONMATRIX != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Data of button matrix */ +struct _lv_buttonmatrix_t { + lv_obj_t obj; + const char * const * map_p; /**< Pointer to the current map */ + lv_area_t * button_areas; /**< Array of areas of buttons */ + lv_buttonmatrix_ctrl_t * ctrl_bits; /**< Array of control bytes */ + uint32_t btn_cnt; /**< Number of button in 'map_p'(Handled by the library) */ + uint32_t row_cnt; /**< Number of rows in 'map_p'(Handled by the library) */ + uint32_t btn_id_sel; /**< Index of the active button (being pressed/released etc) or LV_BUTTONMATRIX_BUTTON_NONE */ + uint32_t one_check : 1; /**< 1: Single button toggled at once */ + uint32_t auto_free_map : 1; /**< 1: Automatically free the map when the widget is deleted */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_BUTTONMATRIX != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_BUTTONMATRIX_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/calendar/lv_calendar.c b/inc/lvgl/src/widgets/calendar/lv_calendar.c new file mode 100644 index 0000000..e01f36e --- /dev/null +++ b/inc/lvgl/src/widgets/calendar/lv_calendar.c @@ -0,0 +1,533 @@ +/** + * @file lv_calendar.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_calendar_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../../lvgl.h" +#if LV_USE_CALENDAR + +#include "../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define LV_CALENDAR_CTRL_TODAY LV_BUTTONMATRIX_CTRL_CUSTOM_1 +#define LV_CALENDAR_CTRL_HIGHLIGHT LV_BUTTONMATRIX_CTRL_CUSTOM_2 + +#define MY_CLASS (&lv_calendar_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void draw_task_added_event_cb(lv_event_t * e); + +static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day); +static uint8_t get_month_length(int32_t year, int32_t month); +static uint8_t is_leap_year(uint32_t year); +static void highlight_update(lv_obj_t * calendar); + +#if LV_USE_CALENDAR_CHINESE +static lv_calendar_date_t gregorian_get_last_month_time(lv_calendar_date_t * time); +static lv_calendar_date_t gregorian_get_next_month_time(lv_calendar_date_t * time); +static void chinese_calendar_set_day_name(lv_obj_t * calendar, uint8_t index, uint8_t day, + lv_calendar_date_t * gregorian_time); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_calendar_class = { + .constructor_cb = lv_calendar_constructor, + .width_def = (LV_DPI_DEF * 3) / 2, + .height_def = (LV_DPI_DEF * 3) / 2, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_calendar_t), + .base_class = &lv_obj_class, + .name = "lv_calendar", +}; + +static const char * day_names_def[7] = LV_CALENDAR_DEFAULT_DAY_NAMES; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_calendar_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_calendar_set_day_names(lv_obj_t * obj, const char * day_names[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + uint32_t i; + for(i = 0; i < 7; i++) { + calendar->map[i] = day_names[i]; + } + lv_obj_invalidate(obj); +} + +void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + if(calendar->today.year == year && calendar->today.month == month + && calendar->today.day == day) return; + + calendar->today.year = year; + calendar->today.month = month; + calendar->today.day = day; + + highlight_update(obj); +} + +void lv_calendar_set_today_year(lv_obj_t * obj, uint32_t year) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + lv_calendar_set_today_date(obj, year, calendar->today.month, calendar->today.day); + +} + +void lv_calendar_set_today_month(lv_obj_t * obj, uint32_t month) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + lv_calendar_set_today_date(obj, calendar->today.year, month, calendar->today.day); +} + +void lv_calendar_set_today_day(lv_obj_t * obj, uint32_t day) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + lv_calendar_set_today_date(obj, calendar->today.year, calendar->today.month, day); +} + +void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num) +{ + LV_ASSERT_NULL(highlighted); + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + calendar->highlighted_dates = highlighted; + calendar->highlighted_dates_num = date_num; + + highlight_update(obj); +} + +void lv_calendar_set_month_shown(lv_obj_t * obj, uint32_t year, uint32_t month) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + /*Don't return if the new value is the same, as this function is also + *used the update the calendar e.g. when switching to Chinese mode*/ + + calendar->showed_date.year = year; + calendar->showed_date.month = month; + calendar->showed_date.day = 1; + + lv_calendar_date_t d; + d.year = calendar->showed_date.year; + d.month = calendar->showed_date.month; + d.day = calendar->showed_date.day; + + uint32_t i; + + /*Remove the disabled state but revert it for day names*/ + lv_buttonmatrix_clear_button_ctrl_all(calendar->btnm, LV_BUTTONMATRIX_CTRL_DISABLED); + for(i = 0; i < 7; i++) { + lv_buttonmatrix_set_button_ctrl(calendar->btnm, i, LV_BUTTONMATRIX_CTRL_DISABLED); + } + + uint8_t act_mo_len = get_month_length(d.year, d.month); + uint8_t day_first = get_day_of_week(d.year, d.month, 1); + uint8_t c; + +#if LV_USE_CALENDAR_CHINESE + lv_calendar_date_t gregorian_time; + gregorian_time = d; +#endif + + for(i = day_first, c = 1; i < act_mo_len + day_first; i++, c++) { +#if LV_USE_CALENDAR_CHINESE + if(calendar->use_chinese_calendar) { + gregorian_time.day = c; + chinese_calendar_set_day_name(obj, i, c, &gregorian_time); + } + else +#endif + lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); + } + + uint8_t prev_mo_len = get_month_length(d.year, d.month - 1); + +#if LV_USE_CALENDAR_CHINESE + gregorian_time = gregorian_get_last_month_time(&d); +#endif + + for(i = 0, c = prev_mo_len - day_first + 1; i < day_first; i++, c++) { +#if LV_USE_CALENDAR_CHINESE + if(calendar->use_chinese_calendar) { + gregorian_time.day = c; + chinese_calendar_set_day_name(obj, i, c, &gregorian_time); + } + else +#endif + lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); + lv_buttonmatrix_set_button_ctrl(calendar->btnm, i + 7, LV_BUTTONMATRIX_CTRL_DISABLED); + } + +#if LV_USE_CALENDAR_CHINESE + gregorian_time = gregorian_get_next_month_time(&d); +#endif + + for(i = day_first + act_mo_len, c = 1; i < 6 * 7; i++, c++) { +#if LV_USE_CALENDAR_CHINESE + if(calendar->use_chinese_calendar) { + gregorian_time.day = c; + chinese_calendar_set_day_name(obj, i, c, &gregorian_time); + } + else +#endif + lv_snprintf(calendar->nums[i], sizeof(calendar->nums[0]), "%d", c); + lv_buttonmatrix_set_button_ctrl(calendar->btnm, i + 7, LV_BUTTONMATRIX_CTRL_DISABLED); + } + + highlight_update(obj); + + /*Reset the focused button if the days changes*/ + if(lv_buttonmatrix_get_selected_button(calendar->btnm) != LV_BUTTONMATRIX_BUTTON_NONE) { + lv_buttonmatrix_set_selected_button(calendar->btnm, day_first + 7); + } + + lv_obj_invalidate(obj); + + /* The children of the calendar are probably headers. + * Notify them to let the headers updated to the new date*/ + uint32_t child_cnt = lv_obj_get_child_count(obj); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(obj, i); + if(child == calendar->btnm) continue; + lv_obj_send_event(child, LV_EVENT_VALUE_CHANGED, obj); + } +} + +void lv_calendar_set_shown_year(lv_obj_t * obj, uint32_t year) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + lv_calendar_set_month_shown(obj, year, calendar->showed_date.month); + +} + +void lv_calendar_set_shown_month(lv_obj_t * obj, uint32_t month) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + lv_calendar_set_month_shown(obj, calendar->showed_date.year, month); +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + const lv_calendar_t * calendar = (lv_calendar_t *)obj; + return calendar->btnm; +} + +const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + const lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return &calendar->today; +} + +const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + const lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return &calendar->showed_date; +} + +lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return calendar->highlighted_dates; +} + +size_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + return calendar->highlighted_dates_num; +} + +lv_result_t lv_calendar_get_pressed_date(const lv_obj_t * obj, lv_calendar_date_t * date) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + uint32_t d = lv_buttonmatrix_get_selected_button(calendar->btnm); + if(d == LV_BUTTONMATRIX_BUTTON_NONE) { + date->year = 0; + date->month = 0; + date->day = 0; + return LV_RESULT_INVALID; + } + + const char * txt = lv_buttonmatrix_get_button_text(calendar->btnm, lv_buttonmatrix_get_selected_button(calendar->btnm)); + + if(txt[1] == 0) date->day = txt[0] - '0'; + else date->day = (txt[0] - '0') * 10 + (txt[1] - '0'); + + date->year = calendar->showed_date.year; + date->month = calendar->showed_date.month; + + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_calendar_t * calendar = (lv_calendar_t *)obj; + + lv_memzero(calendar->nums, sizeof(calendar->nums)); + uint8_t i; + uint8_t j = 0; + for(i = 0; i < 8 * 7; i++) { + /*Every 8th string is "\n"*/ + if(i != 0 && (i + 1) % 8 == 0) { + calendar->map[i] = "\n"; + } + else if(i < 7) { + calendar->map[i] = day_names_def[i]; + } + else { + calendar->nums[j][0] = 'x'; + calendar->map[i] = calendar->nums[j]; + j++; + } + } + calendar->map[8 * 7 - 1] = ""; + + calendar->btnm = lv_buttonmatrix_create(obj); + lv_buttonmatrix_set_map(calendar->btnm, calendar->map); + lv_buttonmatrix_set_button_ctrl_all(calendar->btnm, LV_BUTTONMATRIX_CTRL_CLICK_TRIG | LV_BUTTONMATRIX_CTRL_NO_REPEAT); + lv_obj_add_event_cb(calendar->btnm, draw_task_added_event_cb, LV_EVENT_DRAW_TASK_ADDED, NULL); + lv_obj_set_width(calendar->btnm, lv_pct(100)); + lv_obj_add_flag(calendar->btnm, LV_OBJ_FLAG_EVENT_BUBBLE | LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_grow(calendar->btnm, 1); + + lv_obj_set_style_text_align(calendar->btnm, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN); + + lv_calendar_set_month_shown(obj, 2024, 1); + lv_calendar_set_today_date(obj, 2024, 1, 1); +} + +static void draw_task_added_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_draw_task_t * draw_task = lv_event_get_param(e); + if(((lv_draw_dsc_base_t *)draw_task->draw_dsc)->part != LV_PART_ITEMS) return; + + lv_draw_fill_dsc_t * fill_draw_dsc = lv_draw_task_get_fill_dsc(draw_task); + lv_draw_border_dsc_t * border_draw_dsc = lv_draw_task_get_border_dsc(draw_task); + + if(!fill_draw_dsc && !border_draw_dsc) { + return; + } + + int32_t id = ((lv_draw_dsc_base_t *)draw_task->draw_dsc)->id1; + + /*Day name styles*/ + if(id < 7) { + if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_TRANSP; + if(border_draw_dsc) border_draw_dsc->opa = LV_OPA_TRANSP; + } + else if(lv_buttonmatrix_has_button_ctrl(obj, id, LV_BUTTONMATRIX_CTRL_DISABLED)) { + if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_TRANSP; + if(border_draw_dsc) border_draw_dsc->opa = LV_OPA_TRANSP; + } + + if(lv_buttonmatrix_has_button_ctrl(obj, id, LV_CALENDAR_CTRL_HIGHLIGHT)) { + if(border_draw_dsc) border_draw_dsc->color = lv_theme_get_color_primary(obj); + if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_40; + if(fill_draw_dsc) fill_draw_dsc->color = lv_theme_get_color_primary(obj); + if(lv_buttonmatrix_get_selected_button(obj) == (uint32_t)id) { + if(fill_draw_dsc) fill_draw_dsc->opa = LV_OPA_70; + } + } + + if(lv_buttonmatrix_has_button_ctrl(obj, id, LV_CALENDAR_CTRL_TODAY)) { + if(border_draw_dsc) border_draw_dsc->opa = LV_OPA_COVER; + if(border_draw_dsc) border_draw_dsc->color = lv_theme_get_color_primary(obj); + if(border_draw_dsc) border_draw_dsc->width += 1; + } +} + +/** + * Get the number of days in a month + * @param year a year + * @param month a month. The range is basically [1..12] but [-11..0] or [13..24] is also + * supported to handle next/prev. year + * @return [28..31] + */ +static uint8_t get_month_length(int32_t year, int32_t month) +{ + month--; + if(month < 0) { + year--; /*Already in the previous year (won't be less than -12 to skip a whole year)*/ + month = 12 + month; /*`month` is negative, the result will be < 12*/ + } + if(month >= 12) { + year++; + month -= 12; + } + + /*month == 1 is february*/ + return (month == 1) ? (28 + is_leap_year(year)) : 31 - month % 7 % 2; +} + +/** + * Tells whether a year is leap year or not + * @param year a year + * @return 0: not leap year; 1: leap year + */ +static uint8_t is_leap_year(uint32_t year) +{ + return (year % 4) || ((year % 100 == 0) && (year % 400)) ? 0 : 1; +} + +/** + * Get the day of the week + * @param year a year + * @param month a month [1..12] + * @param day a day [1..32] + * @return [0..6] which means [Sun..Sat] or [Mon..Sun] depending on LV_CALENDAR_WEEK_STARTS_MONDAY + */ +static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day) +{ + uint32_t a = month < 3 ? 1 : 0; + uint32_t b = year - a; + +#if LV_CALENDAR_WEEK_STARTS_MONDAY + uint32_t day_of_week = (day + (31 * (month - 2 + 12 * a) / 12) + b + (b / 4) - (b / 100) + (b / 400) - 1) % 7; +#else + uint32_t day_of_week = (day + (31 * (month - 2 + 12 * a) / 12) + b + (b / 4) - (b / 100) + (b / 400)) % 7; +#endif + + return day_of_week ; +} + +static void highlight_update(lv_obj_t * obj) +{ + lv_calendar_t * calendar = (lv_calendar_t *)obj; + uint32_t i; + + /*Clear all kind of selection*/ + lv_buttonmatrix_clear_button_ctrl_all(calendar->btnm, LV_CALENDAR_CTRL_TODAY | LV_CALENDAR_CTRL_HIGHLIGHT); + + uint8_t day_first = get_day_of_week(calendar->showed_date.year, calendar->showed_date.month, 1); + if(calendar->highlighted_dates) { + for(i = 0; i < calendar->highlighted_dates_num; i++) { + if(calendar->highlighted_dates[i].year == calendar->showed_date.year && + calendar->highlighted_dates[i].month == calendar->showed_date.month) { + lv_buttonmatrix_set_button_ctrl(calendar->btnm, calendar->highlighted_dates[i].day - 1 + day_first + 7, + LV_CALENDAR_CTRL_HIGHLIGHT); + } + } + } + + if(calendar->showed_date.year == calendar->today.year && calendar->showed_date.month == calendar->today.month) { + lv_buttonmatrix_set_button_ctrl(calendar->btnm, calendar->today.day - 1 + day_first + 7, LV_CALENDAR_CTRL_TODAY); + } +} + +#if LV_USE_CALENDAR_CHINESE + +static lv_calendar_date_t gregorian_get_last_month_time(lv_calendar_date_t * time) +{ + lv_calendar_date_t last_month_time; + if(time->month == 1) { + last_month_time.month = 12; + last_month_time.year = time->year - 1; + } + else { + last_month_time.month = time->month - 1; + last_month_time.year = time->year; + } + return last_month_time; +} + +static lv_calendar_date_t gregorian_get_next_month_time(lv_calendar_date_t * time) +{ + lv_calendar_date_t next_month_time; + if(time->month == 12) { + next_month_time.month = 1; + next_month_time.year = time->year + 1; + } + else { + next_month_time.month = time->month + 1; + next_month_time.year = time->year; + } + return next_month_time; +} + +static void chinese_calendar_set_day_name(lv_obj_t * obj, uint8_t index, uint8_t day, + lv_calendar_date_t * gregorian_time) +{ + lv_calendar_t * calendar = (lv_calendar_t *)obj; + const char * day_name = lv_calendar_get_day_name(gregorian_time); + if(day_name != NULL) + lv_snprintf(calendar->nums[index], sizeof(calendar->nums[0]), + "%d\n%s", + day, + day_name); + else + lv_snprintf(calendar->nums[index], sizeof(calendar->nums[0]), "%d", day); +} +#endif + +#endif /*LV_USE_CALENDAR*/ diff --git a/inc/lvgl/src/widgets/calendar/lv_calendar.h b/inc/lvgl/src/widgets/calendar/lv_calendar.h new file mode 100644 index 0000000..d986ef0 --- /dev/null +++ b/inc/lvgl/src/widgets/calendar/lv_calendar.h @@ -0,0 +1,195 @@ +/** + * @file lv_calendar.h + * + */ + +#ifndef LV_CALENDAR_H +#define LV_CALENDAR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../buttonmatrix/lv_buttonmatrix.h" + +#if LV_USE_CALENDAR + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Represents a date on the calendar object (platform-agnostic). + */ +typedef struct { + uint16_t year; + uint8_t month; /**< 1..12 */ + uint8_t day; /**< 1..31 */ +} lv_calendar_date_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a calendar widget + * @param parent pointer to an object, it will be the parent of the new calendar + * @return pointer the created calendar + */ +lv_obj_t * lv_calendar_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the today's year, month and day at once + * @param obj pointer to a calendar object + * @param year today's year + * @param month today's month [1..12] + * @param day today's day [1..31] + */ +void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day); + +/** + * Set the today's year + * @param obj pointer to a calendar object + * @param year today's year + */ +void lv_calendar_set_today_year(lv_obj_t * obj, uint32_t year); + +/** + * Set the today's year + * @param obj pointer to a calendar object + * @param month today's month [1..12] + */ +void lv_calendar_set_today_month(lv_obj_t * obj, uint32_t month); + +/** + * Set the today's year + * @param obj pointer to a calendar object + * @param day today's day [1..31] + */ +void lv_calendar_set_today_day(lv_obj_t * obj, uint32_t day); + +/** + * Set the currently shown year and month at once + * @param obj pointer to a calendar object + * @param year shown year + * @param month shown month [1..12] + */ +void lv_calendar_set_month_shown(lv_obj_t * obj, uint32_t year, uint32_t month); + +/** + * Set the currently shown year + * @param obj pointer to a calendar object + * @param year shown year + */ +void lv_calendar_set_shown_year(lv_obj_t * obj, uint32_t year); + +/** + * Set the currently shown month + * @param obj pointer to a calendar object + * @param month shown month [1..12] + */ +void lv_calendar_set_shown_month(lv_obj_t * obj, uint32_t month); + +/** + * Set the highlighted dates + * @param obj pointer to a calendar object + * @param highlighted pointer to an `lv_calendar_date_t` array containing the dates. + * Only the pointer will be saved so this variable can't be local which will be destroyed later. + * @param date_num number of dates in the array + */ +void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num); + +/** + * Set the name of the days + * @param obj pointer to a calendar object + * @param day_names pointer to an array with the names. + * E.g. `const char * days[7] = {"Sun", "Mon", ...}` + * Only the pointer will be saved so this variable can't be local which will be destroyed later. + */ +void lv_calendar_set_day_names(lv_obj_t * obj, const char ** day_names); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the button matrix object of the calendar. + * It shows the dates and day names. + * @param obj pointer to a calendar object + * @return pointer to a the button matrix + */ +lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj); + +/** + * Get the today's date + * @param calendar pointer to a calendar object + * @return return pointer to an `lv_calendar_date_t` variable containing the date of today. + */ +const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * calendar); + +/** + * Get the currently showed + * @param calendar pointer to a calendar object + * @return pointer to an `lv_calendar_date_t` variable containing the date is being shown. + */ +const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * calendar); + +/** + * Get the highlighted dates + * @param calendar pointer to a calendar object + * @return pointer to an `lv_calendar_date_t` array containing the dates. + */ +lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * calendar); + +/** + * Get the number of the highlighted dates + * @param calendar pointer to a calendar object + * @return number of highlighted days + */ +size_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * calendar); + +/** + * Get the currently pressed day + * @param calendar pointer to a calendar object + * @param date store the pressed date here + * @return LV_RESULT_OK: there is a valid pressed date + * LV_RESULT_INVALID: there is no pressed data + */ +lv_result_t lv_calendar_get_pressed_date(const lv_obj_t * calendar, lv_calendar_date_t * date); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#include "lv_calendar_header_arrow.h" +#include "lv_calendar_header_dropdown.h" +#include "lv_calendar_chinese.h" + +#endif /*LV_USE_CALENDAR*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_H*/ diff --git a/inc/lvgl/src/widgets/calendar/lv_calendar_chinese.c b/inc/lvgl/src/widgets/calendar/lv_calendar_chinese.c new file mode 100644 index 0000000..76995fd --- /dev/null +++ b/inc/lvgl/src/widgets/calendar/lv_calendar_chinese.c @@ -0,0 +1,285 @@ +/** + * @file lv_calendar_chinese.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_calendar_private.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + const char festival_name[20]; + uint8_t month; + uint8_t day; +} lv_calendar_festival_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +static const uint32_t calendar_chinese_table[199] = {/*1901-2099*/ + 0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A, /*1901-1910*/ + 0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754, /*1911-1920*/ + 0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E, /*1921-1930*/ + 0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48, /*1931-1940*/ + 0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51, /*1941-1950*/ + 0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x6AD53C, /*1951-1960*/ + 0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46, /*1961-1970*/ + 0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50, /*1971-1980*/ + 0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x093746, 0x5497BB, /*1981-1990*/ + 0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645, /*1991-2000*/ + 0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E, /*2001-2010*/ + 0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9, /*2011-2020*/ + 0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x69573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43, /*2021-2030*/ + 0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C, /*2031-2040*/ + 0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37, /*2041-2050*/ + 0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06B244, 0x4AB638, 0x0AAE4C, 0x092E42, /*2051-2060*/ + 0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B, /*2061-2070*/ + 0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6, /*2071-2080*/ + 0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E, /*2081-2090*/ + 0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5 /*2091-2099*/ +}; + +static const uint16_t month_total_day[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; + +static const char * chinese_calendar_month_name[] = {"正月", "二月", "三月", "四月", "五月", "六月", + "七月", "八月", "九月", "十月", "十一月", "腊月" + }; + +static const char * chinese_calendar_leep_month_name[] = {"闰正月", "闰二月", "闰三月", "闰四月", "闰五月", "闰六月", + "闰七月", "闰八月", "闰九月", "闰十月", "闰十一月", "闰腊月" + }; + +static const char * chinese_calendar_day_name[] = {"初一", "初二", "初三", "初四", "初五", + "初六", "初七", "初八", "初九", "初十", + "十一", "十二", "十三", "十四", "十五", + "十六", "十七", "十八", "十九", "二十", + "廿一", "廿二", "廿三", "廿四", "廿五", + "廿六", "廿七", "廿八", "廿九", "三十" + }; + +static const lv_calendar_festival_t festivals_base_chinese[] = { + {"春节", 1, 1}, + {"元宵节", 1, 15}, + {"端午节", 5, 5}, + {"七夕节", 7, 7}, + {"中元节", 7, 15}, + {"中秋节", 8, 15}, + {"重阳节", 9, 9}, + {"腊八节", 12, 8}, + {"除夕", 12, 29},/* To determine whether it is 12.29 or 12.30. */ + {"除夕", 12, 30},/* To determine whether it is 12.29 or 12.30. */ +}; + +static const lv_calendar_festival_t festivals_base_gregorian[] = { + {"元旦", 1, 1}, + {"情人节", 2, 14}, + {"妇女节", 3, 8}, + {"植树节", 3, 12}, + {"消费节", 3, 15}, + {"愚人节", 4, 1}, + {"劳动节", 5, 1}, + {"青年节", 5, 4}, + {"儿童节", 6, 1}, + {"建党节", 7, 1}, + {"建军节", 8, 1}, + {"教师节", 9, 10}, + {"国庆节", 10, 1}, + {"万圣节", 10, 31}, + {"平安夜", 12, 24}, + {"圣诞节", 12, 25}, +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void lv_calendar_set_chinese_mode(lv_obj_t * obj, bool en) +{ + lv_calendar_t * calendar = (lv_calendar_t *)obj; + calendar->use_chinese_calendar = en; + lv_calendar_set_month_shown(obj, calendar->today.year, calendar->today.month); +} + +const char * lv_calendar_get_day_name(lv_calendar_date_t * gregorian) +{ + uint16_t i, len; + lv_calendar_chinese_t chinese_calendar; + lv_calendar_gregorian_to_chinese(gregorian, &chinese_calendar); + + if(gregorian->year > 2099 || gregorian->year < 1901) + return NULL; + + len = sizeof(festivals_base_chinese) / sizeof(lv_calendar_festival_t); + for(i = 0; i < len; i++) { + if((chinese_calendar.today.month == festivals_base_chinese[i].month) && + (chinese_calendar.today.day == festivals_base_chinese[i].day) && + chinese_calendar.leep_month == false) { + if(chinese_calendar.today.month == 12 && chinese_calendar.today.day == 29) { + if((calendar_chinese_table[chinese_calendar.today.year - 1901] & 0xf00000) != 0) { + if((calendar_chinese_table[chinese_calendar.today.year - 1901] & 0x000080) == 0) { + return festivals_base_chinese[i].festival_name; + } + } + else { + if((calendar_chinese_table[chinese_calendar.today.year - 1901] & 0x000100) == 0) { + return festivals_base_chinese[i].festival_name; + } + } + } + else { + return festivals_base_chinese[i].festival_name; + } + } + } + + len = sizeof(festivals_base_gregorian) / sizeof(lv_calendar_festival_t); + for(i = 0; i < len; i++) { + if((gregorian->month == festivals_base_gregorian[i].month) && + (gregorian->day == festivals_base_gregorian[i].day)) + return festivals_base_gregorian[i].festival_name; + } + + if(chinese_calendar.today.day == 1) { + if(chinese_calendar.leep_month == false) + return chinese_calendar_month_name[chinese_calendar.today.month - 1]; + else { + return chinese_calendar_leep_month_name[chinese_calendar.today.month - 1]; + } + } + + return (char *)chinese_calendar_day_name[chinese_calendar.today.day - 1]; +} + +void lv_calendar_gregorian_to_chinese(lv_calendar_date_t * gregorian_time, lv_calendar_chinese_t * chinese_time) +{ + uint16_t year = gregorian_time->year; + uint8_t month = gregorian_time->month; + uint8_t day = gregorian_time->day; + + /*Record the number of days between the Spring Festival + and the New Year's Day of that year.*/ + uint16_t by_spring; + + /*Record the number of days from the gregorian calendar + to the New Year's Day of that year.*/ + uint16_t by_gregorian; + + /*Record the number of days in that month*/ + uint8_t days_per_month; + + /*Record from which month the calculation starts.*/ + uint8_t index; + + bool leep_month; + + if(year < 1901 || year > 2099) { + chinese_time->leep_month = 0; + chinese_time->today.year = 2000; + chinese_time->today.month = 1; + chinese_time->today.day = 1; + return; + } + + if(((calendar_chinese_table[year - 1901] & 0x0060) >> 5) == 1) + by_spring = (calendar_chinese_table[year - 1901] & 0x001F) - 1; + else + by_spring = (calendar_chinese_table[year - 1901] & 0x001F) - 1 + 31; + + by_gregorian = month_total_day[month - 1] + day - 1; + + if((!(year % 4)) && (month > 2)) + by_gregorian++; + + if(by_gregorian >= by_spring) {/*Gregorian calendar days after the Spring Festival*/ + by_gregorian -= by_spring; + month = 1; + index = 1; + leep_month = false; + + if((calendar_chinese_table[year - 1901] & (0x80000 >> (index - 1))) == 0) + days_per_month = 29; + else + days_per_month = 30; + + while(by_gregorian >= days_per_month) { + by_gregorian -= days_per_month; + index++; + + if(month == ((calendar_chinese_table[year - 1901] & 0xF00000) >> 20)) { + leep_month = !leep_month; + if(leep_month == false) + month++; + } + else + month++; + + if((calendar_chinese_table[year - 1901] & (0x80000 >> (index - 1))) == 0) + days_per_month = 29; + else + days_per_month = 30; + } + day = by_gregorian + 1; + } + else {/*Solar day before the Spring Festival*/ + by_spring -= by_gregorian; + year--; + month = 12; + if(((calendar_chinese_table[year - 1901] & 0xF00000) >> 20) == 0) + index = 12; + else + index = 13; + leep_month = false; + + if((calendar_chinese_table[year - 1901] & (0x80000 >> (index - 1))) == 0) + days_per_month = 29; + else + days_per_month = 30; + + while(by_spring > days_per_month) { + by_spring -= days_per_month; + index--; + + if(leep_month == false) + month--; + + if(month == ((calendar_chinese_table[year - 1901] & 0xF00000) >> 20)) + leep_month = !leep_month; + + if((calendar_chinese_table[year - 1901] & (0x80000 >> (index - 1))) == 0) + days_per_month = 29; + else + days_per_month = 30; + } + + day = days_per_month - by_spring + 1; + } + chinese_time->today.day = day; + chinese_time->today.month = month; + chinese_time->today.year = year; + chinese_time->leep_month = leep_month; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_CALENDAR_CHINESE*/ diff --git a/inc/lvgl/src/widgets/calendar/lv_calendar_chinese.h b/inc/lvgl/src/widgets/calendar/lv_calendar_chinese.h new file mode 100644 index 0000000..fb7a1bc --- /dev/null +++ b/inc/lvgl/src/widgets/calendar/lv_calendar_chinese.h @@ -0,0 +1,68 @@ +/** + * @file lv_calendar_chinese.h + * + */ + +#ifndef LV_CALENDAR_CHINESE_H +#define LV_CALENDAR_CHINESE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" +#include "lv_calendar.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_CHINESE + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + lv_calendar_date_t today; + bool leep_month; +} lv_calendar_chinese_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Enable the chinese calendar. + * @param obj pointer to a calendar object. + * @param en true: enable chinese calendar; false: disable + */ +void lv_calendar_set_chinese_mode(lv_obj_t * obj, bool en); + +/** + * Get the name of the day + * @param gregorian to obtain the gregorian time for the name + * @return return the name of the day + */ +const char * lv_calendar_get_day_name(lv_calendar_date_t * gregorian); + +/** + * Get the chinese time of the gregorian time (reference: https://www.cnblogs.com/liyang31tg/p/4123171.html) + * @param gregorian_time need to convert to chinese time in gregorian time + * @param chinese_time the chinese time convert from gregorian time + */ +void lv_calendar_gregorian_to_chinese(lv_calendar_date_t * gregorian_time, lv_calendar_chinese_t * chinese_time); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CALENDAR_CHINESE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_CHINESE_H*/ diff --git a/inc/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c b/inc/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c new file mode 100644 index 0000000..144f11c --- /dev/null +++ b/inc/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c @@ -0,0 +1,158 @@ +/** + * @file lv_calendar_header_arrow.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj_class_private.h" +#include "lv_calendar_header_arrow.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_ARROW + +#include "lv_calendar.h" +#include "../button/lv_button.h" +#include "../label/lv_label.h" +#include "../../layouts/flex/lv_flex.h" +#include "../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void month_event_cb(lv_event_t * e); +static void value_changed_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_calendar_header_arrow_class = { + .base_class = &lv_obj_class, + .constructor_cb = my_constructor, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF / 3, + .name = "lv_calendar_header_arrow", +}; + +static const char * month_names_def[12] = LV_CALENDAR_DEFAULT_MONTH_NAMES; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_calendar_add_header_arrow(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_arrow_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + + lv_obj_move_to_index(obj, 0); + + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START); + + lv_obj_t * mo_prev = lv_button_create(obj); + lv_obj_set_style_bg_image_src(mo_prev, LV_SYMBOL_LEFT, 0); + lv_obj_set_height(mo_prev, lv_pct(100)); + lv_obj_update_layout(mo_prev); + int32_t btn_size = lv_obj_get_height(mo_prev); + lv_obj_set_width(mo_prev, btn_size); + + lv_obj_add_event_cb(mo_prev, month_event_cb, LV_EVENT_CLICKED, NULL); + lv_obj_remove_flag(mo_prev, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + lv_obj_t * label = lv_label_create(obj); + lv_label_set_long_mode(label, LV_LABEL_LONG_MODE_SCROLL_CIRCULAR); + lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_flex_grow(label, 1); + + lv_obj_t * mo_next = lv_button_create(obj); + lv_obj_set_style_bg_image_src(mo_next, LV_SYMBOL_RIGHT, 0); + lv_obj_set_size(mo_next, btn_size, btn_size); + + lv_obj_add_event_cb(mo_next, month_event_cb, LV_EVENT_CLICKED, NULL); + lv_obj_remove_flag(mo_next, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + /*Refresh the drop downs*/ + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +static void month_event_cb(lv_event_t * e) +{ + lv_obj_t * btn = lv_event_get_current_target(e); + + lv_obj_t * header = lv_obj_get_parent(btn); + lv_obj_t * calendar = lv_obj_get_parent(header); + + const lv_calendar_date_t * d; + d = lv_calendar_get_showed_date(calendar); + lv_calendar_date_t newd = *d; + + LV_ASSERT_FORMAT_MSG(newd.month >= 1 && newd.month <= 12, + "Invalid month: %d (expected 1-12)", newd.month); + + /*The last child is the right button*/ + if(lv_obj_get_child(header, 0) == btn) { + if(newd.month == 1) { + newd.month = 12; + newd.year --; + } + else { + newd.month --; + } + } + else { + if(newd.month == 12) { + newd.month = 1; + newd.year ++; + } + else { + newd.month ++; + } + } + + lv_calendar_set_month_shown(calendar, newd.year, newd.month); + + lv_obj_t * label = lv_obj_get_child(header, 1); + lv_label_set_text_fmt(label, "%d %s", newd.year, month_names_def[newd.month - 1]); +} + +static void value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * header = lv_event_get_current_target(e); + lv_obj_t * calendar = lv_obj_get_parent(header); + + const lv_calendar_date_t * date = lv_calendar_get_showed_date(calendar); + LV_ASSERT_FORMAT_MSG(date->month >= 1 && date->month <= 12, + "Invalid month: %d (expected 1-12)", date->month); + + lv_obj_t * label = lv_obj_get_child(header, 1); + lv_label_set_text_fmt(label, "%d %s", date->year, month_names_def[date->month - 1]); +} + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ diff --git a/inc/lvgl/src/widgets/calendar/lv_calendar_header_arrow.h b/inc/lvgl/src/widgets/calendar/lv_calendar_header_arrow.h new file mode 100644 index 0000000..54f4fbe --- /dev/null +++ b/inc/lvgl/src/widgets/calendar/lv_calendar_header_arrow.h @@ -0,0 +1,49 @@ +/** + * @file lv_calendar_header_arrow.h + * + */ + +#ifndef LV_CALENDAR_HEADER_ARROW_H +#define LV_CALENDAR_HEADER_ARROW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_ARROW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_header_arrow_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a calendar header with drop-drowns to select the year and month + * @param parent pointer to a calendar object. + * @return the created header + */ +lv_obj_t * lv_calendar_add_header_arrow(lv_obj_t * parent); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_HEADER_ARROW_H*/ diff --git a/inc/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.c b/inc/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.c new file mode 100644 index 0000000..9715588 --- /dev/null +++ b/inc/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.c @@ -0,0 +1,183 @@ +/** + * @file lv_calendar_header_dropdown.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj_class_private.h" +#include "lv_calendar_header_dropdown.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_DROPDOWN + +#include "lv_calendar.h" +#include "../dropdown/lv_dropdown.h" +#include "../../layouts/flex/lv_flex.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void year_event_cb(lv_event_t * e); +static void month_event_cb(lv_event_t * e); +static void value_changed_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_calendar_header_dropdown_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .constructor_cb = my_constructor, + .name = "lv_calendar_header_dropdown", +}; + +static const char * month_list = "01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12"; +static const char * year_list = { + "2026\n2025\n2024\n2023\n2022\n2021\n" + "2020\n2019\n2018\n2017\n2016\n2015\n2014\n2013\n2012\n2011\n2010\n2009\n2008\n2007\n2006\n2005\n2004\n2003\n2002\n2001\n" + "2000\n1999\n1998\n1997\n1996\n1995\n1994\n1993\n1992\n1991\n1990\n1989\n1988\n1987\n1986\n1985\n1984\n1983\n1982\n1981\n" + "1980\n1979\n1978\n1977\n1976\n1975\n1974\n1973\n1972\n1971\n1970\n1969\n1968\n1967\n1966\n1965\n1964\n1963\n1962\n1961\n" + "1960\n1959\n1958\n1957\n1956\n1955\n1954\n1953\n1952\n1951\n1950\n1949\n1948\n1947\n1946\n1945\n1944\n1943\n1942\n1941\n" + "1940\n1939\n1938\n1937\n1936\n1935\n1934\n1933\n1932\n1931\n1930\n1929\n1928\n1927\n1926\n1925\n1924\n1923\n1922\n1921\n" + "1920\n1919\n1918\n1917\n1916\n1915\n1914\n1913\n1912\n1911\n1910\n1909\n1908\n1907\n1906\n1905\n1904\n1903\n1902\n1901" +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_calendar_add_header_dropdown(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_calendar_header_dropdown_class, parent); + lv_obj_class_init_obj(obj); + + return obj; +} + +void lv_calendar_header_dropdown_set_year_list(lv_obj_t * parent, const char * years_list) +{ + /* Search for the header dropdown */ + lv_obj_t * header = lv_obj_get_child_by_type(parent, 0, &lv_calendar_header_dropdown_class); + if(NULL == header) { + /* Header not found */ + return; + } + + /* Search for the year dropdown + * Index is 0 because in the header dropdown constructor the year dropdown (year_dd) + * is the first created child of the header */ + const int32_t year_dropdown_index = 0; + lv_obj_t * year_dropdown = lv_obj_get_child_by_type(header, year_dropdown_index, &lv_dropdown_class); + if(NULL == year_dropdown) { + /* year dropdown not found */ + return; + } + + lv_dropdown_clear_options(year_dropdown); + lv_dropdown_set_options(year_dropdown, years_list); + + lv_obj_invalidate(parent); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void my_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + + lv_obj_t * calendar = lv_obj_get_parent(obj); + lv_obj_move_to_index(obj, 0); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + + lv_obj_t * year_dd = lv_dropdown_create(obj); + lv_dropdown_set_options(year_dd, year_list); + lv_obj_add_event_cb(year_dd, year_event_cb, LV_EVENT_VALUE_CHANGED, calendar); + lv_obj_set_flex_grow(year_dd, 1); + + lv_obj_t * month_dd = lv_dropdown_create(obj); + lv_dropdown_set_options(month_dd, month_list); + lv_obj_add_event_cb(month_dd, month_event_cb, LV_EVENT_VALUE_CHANGED, calendar); + lv_obj_set_flex_grow(month_dd, 1); + + lv_obj_add_event_cb(obj, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + + /*Refresh the drop down*/ + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +static void month_event_cb(lv_event_t * e) +{ + lv_obj_t * dropdown = lv_event_get_current_target(e); + lv_obj_t * calendar = lv_event_get_user_data(e); + + uint32_t sel = lv_dropdown_get_selected(dropdown); + + const lv_calendar_date_t * d; + d = lv_calendar_get_showed_date(calendar); + lv_calendar_date_t newd = *d; + newd.month = sel + 1; + + lv_calendar_set_month_shown(calendar, newd.year, newd.month); +} + +static void year_event_cb(lv_event_t * e) +{ + lv_obj_t * dropdown = lv_event_get_current_target(e); + lv_obj_t * calendar = lv_event_get_user_data(e); + + uint32_t sel = lv_dropdown_get_selected(dropdown); + + const char * year_p = lv_dropdown_get_options(dropdown); + + LV_ASSERT(3 + sel * 5 < lv_strlen(year_p)); + + /* NOTE: Assumes YYYY format */ + const uint32_t year = (year_p[0 + sel * 5] - '0') * 1000 + + (year_p[1 + sel * 5] - '0') * 100 + + (year_p[2 + sel * 5] - '0') * 10 + + (year_p[3 + sel * 5] - '0'); + + const lv_calendar_date_t * d; + d = lv_calendar_get_showed_date(calendar); + lv_calendar_date_t newd = *d; + newd.year = year; + + lv_calendar_set_month_shown(calendar, newd.year, newd.month); +} + +static void value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * header = lv_event_get_current_target(e); + lv_obj_t * calendar = lv_obj_get_parent(header); + const lv_calendar_date_t * cur_date = lv_calendar_get_showed_date(calendar); + lv_obj_t * year_dd = lv_obj_get_child(header, 0); + lv_obj_t * month_dd = lv_obj_get_child(header, 1); + const char * year_p = lv_dropdown_get_options(year_dd); + /* NOTE: Assumes YYYY format */ + const int32_t first_year = (year_p[0] - '0') * 1000 + + (year_p[1] - '0') * 100 + + (year_p[2] - '0') * 10 + (year_p[3] - '0'); + lv_dropdown_set_selected(year_dd, LV_ABS(first_year - cur_date->year)); + lv_dropdown_set_selected(month_dd, cur_date->month - 1); +} + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ diff --git a/inc/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.h b/inc/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.h new file mode 100644 index 0000000..13b0130 --- /dev/null +++ b/inc/lvgl/src/widgets/calendar/lv_calendar_header_dropdown.h @@ -0,0 +1,62 @@ +/** + * @file lv_calendar_header_dropdown.h + * + */ + +#ifndef LV_CALENDAR_HEADER_DROPDOWN_H +#define LV_CALENDAR_HEADER_DROPDOWN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" +#if LV_USE_CALENDAR && LV_USE_CALENDAR_HEADER_DROPDOWN + +#if LV_USE_DROPDOWN == 0 +#error "LV_USE_DROPDOWN needs to be enabled" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_calendar_header_dropdown_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a calendar header with drop-drowns to select the year and month + * @param parent pointer to a calendar object. + * @return the created header + */ +lv_obj_t * lv_calendar_add_header_dropdown(lv_obj_t * parent); + +/** + * Sets a custom calendar year list + * @param parent pointer to a calendar object + * @param years_list pointer to an const char array with the years list, see lv_dropdown set_options for more information. + * E.g. `const char * years = "2023\n2022\n2021\n2020\n2019" + * Only the pointer will be saved so this variable can't be local which will be destroyed later. + */ +void lv_calendar_header_dropdown_set_year_list(lv_obj_t * parent, const char * years_list); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CALENDAR_HEADER_ARROW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_HEADER_DROPDOWN_H*/ diff --git a/inc/lvgl/src/widgets/calendar/lv_calendar_private.h b/inc/lvgl/src/widgets/calendar/lv_calendar_private.h new file mode 100644 index 0000000..0a5b8a2 --- /dev/null +++ b/inc/lvgl/src/widgets/calendar/lv_calendar_private.h @@ -0,0 +1,70 @@ +/** + * @file lv_calendar_private.h + * + */ + +#ifndef LV_CALENDAR_PRIVATE_H +#define LV_CALENDAR_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_calendar.h" + +#if LV_USE_CALENDAR + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Data of calendar */ +struct _lv_calendar_t { + lv_obj_t obj; + /* New data for this type */ + lv_obj_t * btnm; + lv_calendar_date_t today; /**< Date of today */ + lv_calendar_date_t showed_date; /**< Currently visible month (day is ignored) */ + lv_calendar_date_t * highlighted_dates; /**< Apply different style on these days (pointer to user-defined array) */ + size_t highlighted_dates_num; /**< Number of elements in `highlighted_days` */ + const char * map[8 * 7]; +#ifdef LV_USE_CALENDAR_CHINESE + bool use_chinese_calendar; + + /** 7 * 6: A week has 7 days, and the calendar displays 6 weeks in total. + * 20: Including the number of dates, line breaks, names for each day, + * and reserving several spaces for addresses. */ + char nums [7 * 6][20]; +#else + /** 7 * 6: A week has 7 days, and the calendar displays 6 weeks in total. + * 6: Including the number of dates, and reserving several spaces for + * addresses.*/ + char nums [7 * 6][4]; +#endif +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_CALENDAR */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CALENDAR_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/canvas/lv_canvas.c b/inc/lvgl/src/widgets/canvas/lv_canvas.c new file mode 100644 index 0000000..757f95f --- /dev/null +++ b/inc/lvgl/src/widgets/canvas/lv_canvas.c @@ -0,0 +1,454 @@ +/** + * @file lv_canvas.c + * + */ + +/** + * Modified by NXP in 2024 + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_canvas_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_CANVAS != 0 +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_refr.h" +#include "../../display/lv_display.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/cache/lv_cache.h" +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_canvas_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_canvas_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_canvas_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_canvas_class = { + .constructor_cb = lv_canvas_constructor, + .destructor_cb = lv_canvas_destructor, + .instance_size = sizeof(lv_canvas_t), + .base_class = &lv_image_class, + .name = "lv_canvas", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_canvas_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_canvas_set_buffer(lv_obj_t * obj, void * buf, int32_t w, int32_t h, lv_color_format_t cf) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(buf); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + uint32_t stride = lv_draw_buf_width_to_stride(w, cf); + lv_draw_buf_init(&canvas->static_buf, w, h, cf, stride, buf, stride * h); + canvas->draw_buf = &canvas->static_buf; + + const void * src = lv_image_get_src(obj); + if(src) { + lv_image_cache_drop(src); + } + + lv_image_set_src(obj, canvas->draw_buf); + lv_image_cache_drop(canvas->draw_buf); +} + +void lv_canvas_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(draw_buf); + + if(!draw_buf->handlers) { + LV_LOG_ERROR("draw_buf has no handlers, maybe not initialized"); + return; + } + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + canvas->draw_buf = draw_buf; + + const void * src = lv_image_get_src(obj); + if(src) { + lv_image_cache_drop(src); + } + + lv_image_set_src(obj, draw_buf); + lv_image_cache_drop(draw_buf); +} + +void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv_opa_t opa) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + lv_draw_buf_t * draw_buf = canvas->draw_buf; + + if(draw_buf == NULL) return; + + lv_color_format_t cf = draw_buf->header.cf; + uint8_t * data = lv_draw_buf_goto_xy(draw_buf, x, y); + if(data == NULL) return; + + if(LV_COLOR_FORMAT_IS_INDEXED(cf)) { + uint8_t shift; + uint8_t c_int = color.blue; + switch(cf) { + case LV_COLOR_FORMAT_I1: + shift = 7 - (x & 0x7); + break; + case LV_COLOR_FORMAT_I2: + shift = 6 - 2 * (x & 0x3); + break; + case LV_COLOR_FORMAT_I4: + shift = 4 - 4 * (x & 0x1); + break; + case LV_COLOR_FORMAT_I8: + /*Indexed8 format is a easy case, process and return.*/ + shift = 0; + *data = c_int; + default: + return; + } + + uint8_t bpp = lv_color_format_get_bpp(cf); + uint8_t mask = (1 << bpp) - 1; + c_int &= mask; + *data = (*data & ~(mask << shift)) | (c_int << shift); + } + else if(cf == LV_COLOR_FORMAT_L8) { + *data = lv_color_luminance(color); + } + else if(cf == LV_COLOR_FORMAT_A8) { + *data = opa; + } + else if(cf == LV_COLOR_FORMAT_RGB565) { + lv_color16_t * buf = (lv_color16_t *)data; + buf->red = color.red >> 3; + buf->green = color.green >> 2; + buf->blue = color.blue >> 3; + } + else if(cf == LV_COLOR_FORMAT_RGB888) { + data[2] = color.red; + data[1] = color.green; + data[0] = color.blue; + } + else if(cf == LV_COLOR_FORMAT_XRGB8888) { + data[2] = color.red; + data[1] = color.green; + data[0] = color.blue; + data[3] = 0xFF; + } + else if(cf == LV_COLOR_FORMAT_ARGB8888) { + lv_color32_t * buf = (lv_color32_t *)data; + buf->red = color.red; + buf->green = color.green; + buf->blue = color.blue; + buf->alpha = opa; + } + else if(cf == LV_COLOR_FORMAT_AL88) { + lv_color16a_t * buf = (lv_color16a_t *)data; + buf->lumi = lv_color_luminance(color); + buf->alpha = 255; + } + lv_obj_invalidate(obj); +} + +void lv_canvas_set_palette(lv_obj_t * obj, uint8_t index, lv_color32_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + + if(canvas->draw_buf == NULL) return; + + lv_draw_buf_set_palette(canvas->draw_buf, index, color); + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_draw_buf_t * lv_canvas_get_draw_buf(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + return canvas->draw_buf; +} + +lv_color32_t lv_canvas_get_px(lv_obj_t * obj, int32_t x, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_color32_t ret = { 0 }; + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf == NULL) return ret; + + lv_image_header_t * header = &canvas->draw_buf->header; + const uint8_t * px = lv_draw_buf_goto_xy(canvas->draw_buf, x, y); + if(px == NULL) return ret; + + switch(header->cf) { + case LV_COLOR_FORMAT_ARGB8888: + ret = *(lv_color32_t *)px; + break; + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_XRGB8888: + ret.red = px[2]; + ret.green = px[1]; + ret.blue = px[0]; + ret.alpha = 0xFF; + break; + case LV_COLOR_FORMAT_RGB565: { + lv_color16_t * c16 = (lv_color16_t *) px; + ret.red = (c16->red * 2106) >> 8; /*To make it rounded*/ + ret.green = (c16->green * 1037) >> 8; + ret.blue = (c16->blue * 2106) >> 8; + ret.alpha = 0xFF; + break; + } + case LV_COLOR_FORMAT_A8: { + lv_color_t alpha_color = lv_obj_get_style_image_recolor(obj, LV_PART_MAIN); + ret.red = alpha_color.red; + ret.green = alpha_color.green; + ret.blue = alpha_color.blue; + ret.alpha = px[0]; + break; + } + case LV_COLOR_FORMAT_L8: { + ret.red = *px; + ret.green = *px; + ret.blue = *px; + ret.alpha = 0xFF; + break; + } + default: + lv_memzero(&ret, sizeof(lv_color32_t)); + break; + } + + return ret; +} + +lv_image_dsc_t * lv_canvas_get_image(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + return (lv_image_dsc_t *)canvas->draw_buf; +} + +const void * lv_canvas_get_buf(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf) + return canvas->draw_buf->unaligned_data; + + return NULL; +} + +/*===================== + * Other functions + *====================*/ + +void lv_canvas_copy_buf(lv_obj_t * obj, const lv_area_t * canvas_area, lv_draw_buf_t * src_buf, + const lv_area_t * src_area) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(src_buf); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf == NULL) return; + + LV_ASSERT_MSG(canvas->draw_buf->header.cf == src_buf->header.cf, "Color formats must be the same"); + + lv_draw_buf_copy(canvas->draw_buf, canvas_area, src_buf, src_area); +} + +void lv_canvas_fill_bg(lv_obj_t * obj, lv_color_t color, lv_opa_t opa) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + lv_draw_buf_t * draw_buf = canvas->draw_buf; + if(draw_buf == NULL) return; + + lv_image_header_t * header = &draw_buf->header; + uint32_t x; + uint32_t y; + + uint32_t stride = header->stride; + uint8_t * data = draw_buf->data; + if(header->cf == LV_COLOR_FORMAT_RGB565) { + uint16_t c16 = lv_color_to_u16(color); + for(y = 0; y < header->h; y++) { + uint16_t * buf16 = (uint16_t *)(data + y * stride); + for(x = 0; x < header->w; x++) { + buf16[x] = c16; + } + } + } + else if(header->cf == LV_COLOR_FORMAT_XRGB8888 || header->cf == LV_COLOR_FORMAT_ARGB8888) { + uint32_t c32 = lv_color_to_u32(color); + if(header->cf == LV_COLOR_FORMAT_ARGB8888) { + c32 &= 0x00ffffff; + c32 |= (uint32_t)opa << 24; + } + for(y = 0; y < header->h; y++) { + uint32_t * buf32 = (uint32_t *)(data + y * stride); + for(x = 0; x < header->w; x++) { + buf32[x] = c32; + } + } + } + else if(header->cf == LV_COLOR_FORMAT_RGB888) { + for(y = 0; y < header->h; y++) { + uint8_t * buf8 = (uint8_t *)(data + y * stride); + for(x = 0; x < header->w * 3; x += 3) { + buf8[x + 0] = color.blue; + buf8[x + 1] = color.green; + buf8[x + 2] = color.red; + } + } + } + else if(header->cf == LV_COLOR_FORMAT_L8) { + uint8_t c8 = lv_color_luminance(color); + for(y = 0; y < header->h; y++) { + uint8_t * buf = (uint8_t *)(data + y * stride); + for(x = 0; x < header->w; x++) { + buf[x] = c8; + } + } + } + else if(header->cf == LV_COLOR_FORMAT_AL88) { + lv_color16a_t c; + c.lumi = lv_color_luminance(color); + c.alpha = 255; + for(y = 0; y < header->h; y++) { + lv_color16a_t * buf = (lv_color16a_t *)(data + y * stride); + for(x = 0; x < header->w; x++) { + buf[x] = c; + } + } + } + + else { + for(y = 0; y < header->h; y++) { + for(x = 0; x < header->w; x++) { + lv_canvas_set_px(obj, x, y, color, opa); + } + } + } + + lv_draw_buf_flush_cache(canvas->draw_buf, NULL); + lv_obj_invalidate(obj); +} + +void lv_canvas_init_layer(lv_obj_t * obj, lv_layer_t * layer) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(layer); + lv_layer_init(layer); + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf == NULL) return; + + lv_image_header_t * header = &canvas->draw_buf->header; + lv_area_t canvas_area = {0, 0, header->w - 1, header->h - 1}; + + layer->draw_buf = canvas->draw_buf; + layer->color_format = header->cf; + layer->buf_area = canvas_area; + layer->_clip_area = canvas_area; + layer->phy_clip_area = canvas_area; + + lv_draw_unit_send_event(NULL, LV_EVENT_CHILD_CREATED, layer); +} + +void lv_canvas_finish_layer(lv_obj_t * canvas, lv_layer_t * layer) +{ + if(layer->draw_task_head == NULL) { + lv_draw_unit_send_event(NULL, LV_EVENT_CHILD_DELETED, layer); + return; + } + + layer->all_tasks_added = true; + + bool task_dispatched; + + while(layer->draw_task_head) { + lv_draw_dispatch_wait_for_request(); + task_dispatched = lv_draw_dispatch_layer(lv_obj_get_display(canvas), layer); + + if(!task_dispatched) { + lv_draw_wait_for_finish(); + lv_draw_dispatch_request(); + } + } + + lv_draw_unit_send_event(NULL, LV_EVENT_SCREEN_LOAD_START, layer); + lv_draw_unit_send_event(NULL, LV_EVENT_CHILD_DELETED, layer); + lv_obj_invalidate(canvas); +} + +uint32_t lv_canvas_buf_size(int32_t w, int32_t h, uint8_t bpp, uint8_t stride) +{ + return (uint32_t)LV_CANVAS_BUF_SIZE(w, h, bpp, stride); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_canvas_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_UNUSED(obj); +} + +static void lv_canvas_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_canvas_t * canvas = (lv_canvas_t *)obj; + if(canvas->draw_buf == NULL) return; + + lv_image_cache_drop(&canvas->draw_buf); +} + +#endif diff --git a/inc/lvgl/src/widgets/canvas/lv_canvas.h b/inc/lvgl/src/widgets/canvas/lv_canvas.h new file mode 100644 index 0000000..3bf70da --- /dev/null +++ b/inc/lvgl/src/widgets/canvas/lv_canvas.h @@ -0,0 +1,191 @@ +/** + * @file lv_canvas.h + * + */ + +#ifndef LV_CANVAS_H +#define LV_CANVAS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_CANVAS != 0 + +#include "../image/lv_image.h" +#include "../../draw/lv_draw_image.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_canvas_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a canvas object + * @param parent pointer to an object, it will be the parent of the new canvas + * @return pointer to the created canvas + */ +lv_obj_t * lv_canvas_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a buffer for the canvas. + * + * Use lv_canvas_set_draw_buf() instead if you need to set a buffer with alignment requirement. + * + * @param obj pointer to a canvas object + * @param buf buffer where content of canvas will be. + * The required size is (lv_image_color_format_get_px_size(cf) * w) / 8 * h) + * It can be allocated with `lv_malloc()` or + * it can be statically allocated array (e.g. static lv_color_t buf[100*50]) or + * it can be an address in RAM or external SRAM + * @param w width of canvas + * @param h height of canvas + * @param cf color format. `LV_COLOR_FORMAT...` + */ +void lv_canvas_set_buffer(lv_obj_t * obj, void * buf, int32_t w, int32_t h, lv_color_format_t cf); + +/** + * Set a draw buffer for the canvas. A draw buffer either can be allocated by `lv_draw_buf_create()` + * or defined statically by `LV_DRAW_BUF_DEFINE_STATIC`. When buffer start address and stride has alignment + * requirement, it's recommended to use `lv_draw_buf_create`. + * @param obj pointer to a canvas object + * @param draw_buf pointer to a draw buffer + */ +void lv_canvas_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf); + +/** + * Set a pixel's color and opacity + * @param obj pointer to a canvas + * @param x X coordinate of the pixel + * @param y Y coordinate of the pixel + * @param color the color + * @param opa the opacity + * @note The following color formats are supported + * LV_COLOR_FORMAT_I1/2/4/8, LV_COLOR_FORMAT_A8, + * LV_COLOR_FORMAT_RGB565, LV_COLOR_FORMAT_RGB888, + * LV_COLOR_FORMAT_XRGB8888, LV_COLOR_FORMAT_ARGB8888 + * @note this function invalidates the canvas object every time, + * for best performance, if you're changing a lot of pixels in a loop, + * call `lv_display_enable_invalidation` before the loop starts + * so the invalidation isn't done on every call + */ +void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv_opa_t opa); + +/** + * Set the palette color of a canvas for index format. Valid only for `LV_COLOR_FORMAT_I1/2/4/8` + * @param obj pointer to canvas object + * @param index the palette color to set: + * - for `LV_COLOR_FORMAT_I1`: 0..1 + * - for `LV_COLOR_FORMAT_I2`: 0..3 + * - for `LV_COLOR_FORMAT_I4`: 0..15 + * - for `LV_COLOR_FORMAT_I8`: 0..255 + * @param color the color to set + */ +void lv_canvas_set_palette(lv_obj_t * obj, uint8_t index, lv_color32_t color); + +/*===================== + * Getter functions + *====================*/ + +lv_draw_buf_t * lv_canvas_get_draw_buf(lv_obj_t * obj); + +/** + * Get a pixel's color and opacity + * @param obj pointer to a canvas + * @param x X coordinate of the pixel + * @param y Y coordinate of the pixel + * @return ARGB8888 color of the pixel + */ +lv_color32_t lv_canvas_get_px(lv_obj_t * obj, int32_t x, int32_t y); + +/** + * Get the image of the canvas as a pointer to an `lv_image_dsc_t` variable. + * @param canvas pointer to a canvas object + * @return pointer to the image descriptor. + */ +lv_image_dsc_t * lv_canvas_get_image(lv_obj_t * canvas); + +/** + * Return the pointer for the buffer. + * It's recommended to use this function instead of the buffer form the + * return value of lv_canvas_get_image() as is can be aligned + * @param canvas pointer to a canvas object + * @return pointer to the buffer + */ +const void * lv_canvas_get_buf(lv_obj_t * canvas); + +/*===================== + * Other functions + *====================*/ + +/** + * Copy a buffer to the canvas + * @param obj pointer to a canvas object + * @param canvas_area the area of the canvas to copy the new data to + * @param src_buf pointer to a buffer holding the source data + * @param src_area the area of the source buffer to copy from. If NULL, copy the whole buffer. + * @note canvas_area and src_area should be the same size. If canvas_area and the size of src_buf are the same, + * src_area can be left NULL. + */ +void lv_canvas_copy_buf(lv_obj_t * obj, const lv_area_t * canvas_area, lv_draw_buf_t * src_buf, + const lv_area_t * src_area); + +/** + * Fill the canvas with color + * @param obj pointer to a canvas + * @param color the background color + * @param opa the desired opacity + */ +void lv_canvas_fill_bg(lv_obj_t * obj, lv_color_t color, lv_opa_t opa); + +/** + * Initialize a layer to use LVGL's generic draw functions (lv_draw_rect/label/...) on the canvas. + * Needs to be usd in pair with `lv_canvas_finish_layer`. + * @param canvas pointer to a canvas + * @param layer pointer to a layer variable to initialize + */ +void lv_canvas_init_layer(lv_obj_t * canvas, lv_layer_t * layer); + +/** + * Wait until all the drawings are finished on layer. + * Needs to be usd in pair with `lv_canvas_init_layer`. + * @param canvas pointer to a canvas + * @param layer pointer to a layer to finalize + */ +void lv_canvas_finish_layer(lv_obj_t * canvas, lv_layer_t * layer); + +/********************** + * MACROS + **********************/ + +#define LV_CANVAS_BUF_SIZE(w, h, bpp, stride) (((((w * bpp + 7) >> 3) + stride - 1) & ~(stride - 1)) * h + LV_DRAW_BUF_ALIGN) + +/** + * Just a wrapper to `LV_CANVAS_BUF_SIZE` for bindings. + */ +uint32_t lv_canvas_buf_size(int32_t w, int32_t h, uint8_t bpp, uint8_t stride); + +#endif /*LV_USE_CANVAS*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CANVAS_H*/ diff --git a/inc/lvgl/src/widgets/canvas/lv_canvas_private.h b/inc/lvgl/src/widgets/canvas/lv_canvas_private.h new file mode 100644 index 0000000..55b3054 --- /dev/null +++ b/inc/lvgl/src/widgets/canvas/lv_canvas_private.h @@ -0,0 +1,52 @@ +/** + * @file lv_canvas_private.h + * + */ + +#ifndef LV_CANVAS_PRIVATE_H +#define LV_CANVAS_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../image/lv_image_private.h" +#include "lv_canvas.h" + +#if LV_USE_CANVAS != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Canvas data */ +struct _lv_canvas_t { + lv_image_t img; + lv_draw_buf_t * draw_buf; + lv_draw_buf_t static_buf; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_CANVAS != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CANVAS_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/chart/lv_chart.c b/inc/lvgl/src/widgets/chart/lv_chart.c new file mode 100644 index 0000000..d29f412 --- /dev/null +++ b/inc/lvgl/src/widgets/chart/lv_chart.c @@ -0,0 +1,1911 @@ +/** + * @file lv_chart.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_chart_private.h" +#if LV_USE_CHART != 0 + +#include "../../misc/lv_area_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../draw/lv_draw_vector_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../core/lv_obj_draw_private.h" +#include "../../misc/lv_assert.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_chart_class) + +#define LV_CHART_HDIV_DEF 3 +#define LV_CHART_VDIV_DEF 5 +#define LV_CHART_POINT_CNT_DEF 10 +#define LV_CHART_LABEL_MAX_TEXT_LENGTH 16 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_chart_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e); + +static void draw_div_lines(lv_obj_t * obj, lv_layer_t * layer); +static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer); +static void draw_series_curve(lv_obj_t * obj, lv_layer_t * layer); +static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer); +static void draw_series_stacked(lv_obj_t * obj, lv_layer_t * layer); +static void draw_series_scatter(lv_obj_t * obj, lv_layer_t * layer); +static void draw_cursors(lv_obj_t * obj, lv_layer_t * layer); +static uint32_t get_index_from_x(lv_obj_t * obj, int32_t x); +static void invalidate_point(lv_obj_t * obj, uint32_t i); +static void new_points_alloc(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t cnt, int32_t ** a); +static int32_t value_to_y(lv_obj_t * obj, lv_chart_series_t * ser, int32_t v, int32_t h); + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_chart_properties[] = { + { + .id = LV_PROPERTY_CHART_TYPE, + .setter = lv_chart_set_type, + .getter = lv_chart_get_type, + }, + { + .id = LV_PROPERTY_CHART_POINT_COUNT, + .setter = lv_chart_set_point_count, + .getter = lv_chart_get_point_count, + }, + { + .id = LV_PROPERTY_CHART_UPDATE_MODE, + .setter = lv_chart_set_update_mode, + .getter = lv_chart_get_update_mode, + }, + { + .id = LV_PROPERTY_CHART_HOR_DIV_LINE_COUNT, + .setter = lv_chart_set_hor_div_line_count, + .getter = lv_chart_get_hor_div_line_count, + }, + { + .id = LV_PROPERTY_CHART_VER_DIV_LINE_COUNT, + .setter = lv_chart_set_ver_div_line_count, + .getter = lv_chart_get_ver_div_line_count, + }, +}; +#endif + +const lv_obj_class_t lv_chart_class = { + .constructor_cb = lv_chart_constructor, + .destructor_cb = lv_chart_destructor, + .event_cb = lv_chart_event, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF * 2, + .instance_size = sizeof(lv_chart_t), + .base_class = &lv_obj_class, + .name = "lv_chart", + LV_PROPERTY_CLASS_FIELDS(chart, CHART) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_chart_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->type == type) return; + + if(chart->type == LV_CHART_TYPE_SCATTER) { + lv_chart_series_t * ser; + LV_LL_READ_BACK(&chart->series_ll, ser) { + lv_free(ser->x_points); + ser->x_points = NULL; + } + } + + if(type == LV_CHART_TYPE_SCATTER) { + lv_chart_series_t * ser; + LV_LL_READ_BACK(&chart->series_ll, ser) { + ser->x_points = lv_malloc(sizeof(int32_t) * chart->point_cnt); + LV_ASSERT_MALLOC(ser->x_points); + if(ser->x_points == NULL) return; + } + } + + chart->type = type; + + lv_chart_refresh(obj); +} + +void lv_chart_set_point_count(lv_obj_t * obj, uint32_t cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->point_cnt == cnt) return; + + lv_chart_series_t * ser; + + if(cnt < 1) cnt = 1; + + LV_LL_READ_BACK(&chart->series_ll, ser) { + if(chart->type == LV_CHART_TYPE_SCATTER) { + if(!ser->x_ext_buf_assigned) new_points_alloc(obj, ser, cnt, &ser->x_points); + } + if(!ser->y_ext_buf_assigned) new_points_alloc(obj, ser, cnt, &ser->y_points); + ser->start_point = 0; + } + + chart->point_cnt = cnt; + + lv_chart_refresh(obj); +} + +void lv_chart_set_axis_min_value(lv_obj_t * obj, lv_chart_axis_t axis, int32_t min) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + + switch(axis) { + case LV_CHART_AXIS_PRIMARY_Y: + if(chart->ymin[0] == min) return; + chart->ymin[0] = min; + break; + case LV_CHART_AXIS_SECONDARY_Y: + if(chart->ymin[1] == min) return; + chart->ymin[1] = min; + break; + case LV_CHART_AXIS_PRIMARY_X: + if(chart->xmin[0] == min) return; + chart->xmin[0] = min; + break; + case LV_CHART_AXIS_SECONDARY_X: + if(chart->xmin[1] == min) return; + chart->xmin[1] = min; + break; + default: + LV_LOG_WARN("Invalid axis: %d", axis); + return; + } + + lv_chart_refresh(obj); +} + +void lv_chart_set_axis_max_value(lv_obj_t * obj, lv_chart_axis_t axis, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + switch(axis) { + case LV_CHART_AXIS_PRIMARY_Y: + if(chart->ymax[0] == max) return; + chart->ymax[0] = max; + break; + case LV_CHART_AXIS_SECONDARY_Y: + if(chart->ymax[1] == max) return; + chart->ymax[1] = max; + break; + case LV_CHART_AXIS_PRIMARY_X: + if(chart->xmax[0] == max) return; + chart->xmax[0] = max; + break; + case LV_CHART_AXIS_SECONDARY_X: + if(chart->xmax[1] == max) return; + chart->xmax[1] = max; + break; + default: + LV_LOG_WARN("Invalid axis: %d", axis); + return; + } + + lv_chart_refresh(obj); +} + +void lv_chart_set_axis_range(lv_obj_t * obj, lv_chart_axis_t axis, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_set_axis_min_value(obj, axis, min); + lv_chart_set_axis_max_value(obj, axis, max); +} + +void lv_chart_set_update_mode(lv_obj_t * obj, lv_chart_update_mode_t update_mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->update_mode == update_mode) return; + + chart->update_mode = update_mode; + lv_obj_invalidate(obj); +} + +void lv_chart_set_div_line_count(lv_obj_t * obj, uint32_t hdiv, uint32_t vdiv) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->hdiv_cnt == hdiv && chart->vdiv_cnt == vdiv) return; + + chart->hdiv_cnt = hdiv; + chart->vdiv_cnt = vdiv; + + lv_obj_invalidate(obj); +} + +void lv_chart_set_hor_div_line_count(lv_obj_t * obj, uint32_t cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->hdiv_cnt == cnt) return; + chart->hdiv_cnt = cnt; + lv_obj_invalidate(obj); +} + +void lv_chart_set_ver_div_line_count(lv_obj_t * obj, uint32_t cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->vdiv_cnt == cnt) return; + chart->vdiv_cnt = cnt; + lv_obj_invalidate(obj); +} + +lv_chart_type_t lv_chart_get_type(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->type; +} + +uint32_t lv_chart_get_point_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->point_cnt; +} + +lv_chart_update_mode_t lv_chart_get_update_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->update_mode; +} + +uint32_t lv_chart_get_hor_div_line_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->hdiv_cnt; +} + +uint32_t lv_chart_get_ver_div_line_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->vdiv_cnt; +} + +uint32_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser) +{ + LV_ASSERT_NULL(ser); + LV_UNUSED(obj); + + return ser->start_point; +} + +void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, lv_point_t * p_out) +{ + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(ser); + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(id >= chart->point_cnt) { + LV_LOG_WARN("Invalid index: %"LV_PRIu32, id); + p_out->x = 0; + p_out->y = 0; + return; + } + + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + + if(chart->type == LV_CHART_TYPE_LINE || chart->type == LV_CHART_TYPE_CURVE) { + if(chart->point_cnt > 1) { + p_out->x = (w * id) / (chart->point_cnt - 1); + } + else { + p_out->x = 0; + } + int32_t temp_y = value_to_y(obj, ser, ser->y_points[id], h); + p_out->y = h - temp_y; + } + else if(chart->type == LV_CHART_TYPE_SCATTER) { + p_out->x = lv_map(ser->x_points[id], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); + int32_t temp_y = value_to_y(obj, ser, ser->y_points[id], h); + p_out->y = h - temp_y; + } + else if(chart->type == LV_CHART_TYPE_BAR) { + uint32_t ser_cnt = lv_ll_get_len(&chart->series_ll); + int32_t ser_gap = lv_obj_get_style_pad_column(obj, LV_PART_ITEMS); + + /*Gap between the columns on adjacent X ticks*/ + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; + + if(chart->point_cnt > 1) { + p_out->x = (int32_t)((int32_t)(w - block_w) * id) / (chart->point_cnt - 1); + } + else { + p_out->x = 0; + } + + lv_chart_series_t * ser_i = NULL; + uint32_t ser_idx = 0; + LV_LL_READ(&chart->series_ll, ser_i) { + if(ser_i == ser) break; + ser_idx++; + } + + p_out->x = (int32_t)((int32_t)(w + block_gap) * id) / chart->point_cnt; + if(ser_cnt > 0) { + p_out->x += block_w * ser_idx / ser_cnt; + + int32_t col_w = (block_w - (ser_gap * (ser_cnt - 1))) / ser_cnt; + p_out->x += col_w / 2; + } + else { + LV_LOG_WARN("bar chart series count is zero"); + } + + int32_t temp_y = value_to_y(obj, ser, ser->y_points[id], h); + p_out->y = h - temp_y; + } + else if(chart->type == LV_CHART_TYPE_STACKED) { + /*Gap between the columns on adjacent X ticks*/ + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; + + if(chart->point_cnt > 1) { + p_out->x = (int32_t)((int32_t)(w - block_w) * id) / (chart->point_cnt - 1); + } + else { + p_out->x = 0; + } + + p_out->x += block_w / 2; + + int32_t v_sum = 0; + lv_chart_series_t * s; + LV_LL_READ(&chart->series_ll, s) { + if(s->hidden) continue; + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? s->start_point : 0; + int32_t p_act = (start_point + id) % chart->point_cnt; + int32_t v_act = s->y_points[p_act]; + if(s->y_points[p_act] == LV_CHART_POINT_NONE) continue; + + /* Skip negative values in stacked charts. Negative values are not supported + * in stacked charts as they cannot be visually represented in the stacking logic. */ + if(v_act <= 0) { + LV_LOG_WARN("Stacked chart doesn't support negative values."); + continue; + } + v_sum += v_act; + if(s == ser) break; + } + + int32_t temp_y = value_to_y(obj, ser, v_sum, h); + p_out->y = h - temp_y; + } + /*LV_CHART_TYPE_NONE*/ + else { + p_out->x = 0; + p_out->y = 0; + } + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + p_out->x += lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + p_out->x -= lv_obj_get_scroll_left(obj); + + uint32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + id = ((int32_t)start_point + id) % chart->point_cnt; + + p_out->y += lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + p_out->y -= lv_obj_get_scroll_top(obj); +} + +void lv_chart_refresh(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_invalidate(obj); +} + +/*====================== + * Series + *=====================*/ + +lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_chart_axis_t axis) +{ + LV_LOG_INFO("begin"); + + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + + /* Allocate space for a new series and add it to the chart series linked list */ + lv_chart_series_t * ser = lv_ll_ins_tail(&chart->series_ll); + LV_ASSERT_MALLOC(ser); + if(ser == NULL) return NULL; + lv_memzero(ser, sizeof(lv_chart_series_t)); + + /* Allocate memory for point_cnt points, handle failure below */ + ser->y_points = lv_malloc(sizeof(int32_t) * chart->point_cnt); + LV_ASSERT_MALLOC(ser->y_points); + + if(chart->type == LV_CHART_TYPE_SCATTER) { + ser->x_points = lv_malloc(sizeof(int32_t) * chart->point_cnt); + LV_ASSERT_MALLOC(ser->x_points); + if(NULL == ser->x_points) { + lv_free(ser->y_points); + lv_ll_remove(&chart->series_ll, ser); + lv_free(ser); + return NULL; + } + } + else { + ser->x_points = NULL; + } + + if(ser->y_points == NULL) { + if(ser->x_points) { + lv_free(ser->x_points); + ser->x_points = NULL; + } + + lv_ll_remove(&chart->series_ll, ser); + lv_free(ser); + return NULL; + } + + /* Set series properties on successful allocation */ + ser->color = color; + ser->start_point = 0; + ser->y_ext_buf_assigned = false; + ser->hidden = 0; + ser->x_axis_sec = axis & LV_CHART_AXIS_SECONDARY_X ? 1 : 0; + ser->y_axis_sec = axis & LV_CHART_AXIS_SECONDARY_Y ? 1 : 0; + + uint32_t i; + const int32_t def = LV_CHART_POINT_NONE; + int32_t * p_tmp = ser->y_points; + for(i = 0; i < chart->point_cnt; i++) { + *p_tmp = def; + p_tmp++; + } + + return ser; +} + +void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(series); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(!series->y_ext_buf_assigned && series->y_points) lv_free(series->y_points); + if(!series->x_ext_buf_assigned && series->x_points) lv_free(series->x_points); + + lv_ll_remove(&chart->series_ll, series); + lv_free(series); + + return; +} + +void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hide) +{ + LV_ASSERT_OBJ(chart, MY_CLASS); + LV_ASSERT_NULL(series); + + series->hidden = hide ? 1 : 0; + lv_chart_refresh(chart); +} + +void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color) +{ + LV_ASSERT_OBJ(chart, MY_CLASS); + LV_ASSERT_NULL(series); + + series->color = color; + lv_chart_refresh(chart); +} + +lv_color_t lv_chart_get_series_color(lv_obj_t * chart, const lv_chart_series_t * series) +{ + LV_ASSERT_OBJ(chart, MY_CLASS); + LV_ASSERT_NULL(series); + LV_UNUSED(chart); + + return series->color; +} + +void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(id >= chart->point_cnt) return; + ser->start_point = id; +} + +lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * obj, const lv_chart_series_t * ser) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(ser == NULL) return lv_ll_get_head(&chart->series_ll); + else return lv_ll_get_next(&chart->series_ll, ser); +} + +/*===================== + * Cursor + *====================*/ + +lv_chart_cursor_t * lv_chart_add_cursor(lv_obj_t * obj, lv_color_t color, lv_dir_t dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + lv_chart_cursor_t * cursor = lv_ll_ins_head(&chart->cursor_ll); + LV_ASSERT_MALLOC(cursor); + if(cursor == NULL) return NULL; + + lv_point_set(&cursor->pos, LV_CHART_POINT_NONE, LV_CHART_POINT_NONE); + cursor->point_id = LV_CHART_POINT_NONE; + cursor->pos_set = 0; + cursor->color = color; + cursor->dir = dir; + + return cursor; +} + +void lv_chart_remove_cursor(lv_obj_t * obj, lv_chart_cursor_t * cursor) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(cursor); + + lv_chart_t * chart = (lv_chart_t *)obj; + lv_ll_remove(&chart->cursor_ll, cursor); + lv_free(cursor); +} + +void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_point_t * pos) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + cursor->pos = *pos; + cursor->pos_set = 1; + lv_chart_refresh(chart); +} + +void lv_chart_set_cursor_pos_x(lv_obj_t * chart, lv_chart_cursor_t * cursor, int32_t x) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + cursor->pos.x = x; + cursor->pos_set = 1; + lv_chart_refresh(chart); +} + +void lv_chart_set_cursor_pos_y(lv_obj_t * chart, lv_chart_cursor_t * cursor, int32_t y) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + cursor->pos.y = y; + cursor->pos_set = 1; + lv_chart_refresh(chart); +} + +void lv_chart_set_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_chart_series_t * ser, uint32_t point_id) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + cursor->point_id = point_id; + cursor->pos_set = 0; + if(ser == NULL) ser = lv_chart_get_series_next(chart, NULL); + cursor->ser = ser; + lv_chart_refresh(chart); +} + +lv_point_t lv_chart_get_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor) +{ + LV_ASSERT_NULL(cursor); + LV_UNUSED(chart); + + return cursor->pos; +} + +/*===================== + * Set/Get value(s) + *====================*/ + +void lv_chart_set_all_values(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + uint32_t i; + for(i = 0; i < chart->point_cnt; i++) { + ser->y_points[i] = value; + } + ser->start_point = 0; + lv_chart_refresh(obj); +} + + +void lv_chart_set_next_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + + ser->y_points[ser->start_point] = value; + invalidate_point(obj, ser->start_point); + ser->start_point = (ser->start_point + 1) % chart->point_cnt; +} + +void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, int32_t x_value, int32_t y_value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + lv_chart_t * chart = (lv_chart_t *)obj; + + if(chart->type != LV_CHART_TYPE_SCATTER) { + LV_LOG_WARN("Type must be LV_CHART_TYPE_SCATTER"); + return; + } + + ser->x_points[ser->start_point] = x_value; + ser->y_points[ser->start_point] = y_value; + ser->start_point = (ser->start_point + 1) % chart->point_cnt; + invalidate_point(obj, ser->start_point); +} + +void lv_chart_set_series_values(lv_obj_t * obj, lv_chart_series_t * ser, const int32_t values[], size_t values_cnt) +{ + size_t i; + for(i = 0; i < values_cnt; i++) { + lv_chart_set_next_value(obj, ser, values[i]); + } +} + +void lv_chart_set_series_values2(lv_obj_t * obj, lv_chart_series_t * ser, const int32_t x_values[], + const int32_t y_values[], size_t values_cnt) +{ + size_t i; + for(i = 0; i < values_cnt; i++) { + lv_chart_set_next_value2(obj, ser, x_values[i], y_values[i]); + } +} + + +void lv_chart_set_series_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + lv_chart_t * chart = (lv_chart_t *)obj; + + if(id >= chart->point_cnt) return; + ser->y_points[id] = value; + invalidate_point(obj, id); +} + +void lv_chart_set_series_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t x_value, + int32_t y_value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + lv_chart_t * chart = (lv_chart_t *)obj; + + if(chart->type != LV_CHART_TYPE_SCATTER) { + LV_LOG_WARN("Type must be LV_CHART_TYPE_SCATTER"); + return; + } + + if(id >= chart->point_cnt) return; + ser->x_points[id] = x_value; + ser->y_points[id] = y_value; + invalidate_point(obj, id); +} + +void lv_chart_set_series_ext_y_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + if(!ser->y_ext_buf_assigned && ser->y_points) lv_free(ser->y_points); + ser->y_ext_buf_assigned = true; + ser->y_points = array; + lv_obj_invalidate(obj); +} + +void lv_chart_set_series_ext_x_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + + if(!ser->x_ext_buf_assigned && ser->x_points) lv_free(ser->x_points); + ser->x_ext_buf_assigned = true; + ser->x_points = array; + lv_obj_invalidate(obj); +} + +int32_t * lv_chart_get_series_y_array(const lv_obj_t * obj, lv_chart_series_t * ser) +{ + LV_UNUSED(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + return ser->y_points; +} + +int32_t * lv_chart_get_series_x_array(const lv_obj_t * obj, lv_chart_series_t * ser) +{ + LV_UNUSED(obj); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(ser); + return ser->x_points; +} + +uint32_t lv_chart_get_pressed_point(const lv_obj_t * obj) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + return chart->pressed_point_id; +} + +int32_t lv_chart_get_first_point_center_offset(lv_obj_t * obj) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + int32_t x_ofs = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + if(chart->type == LV_CHART_TYPE_BAR || chart->type == LV_CHART_TYPE_STACKED) { + lv_obj_update_layout(obj); + /*Gap between the columns on ~adjacent X*/ + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_content_width(obj); + int32_t block_w = (w + block_gap) / (chart->point_cnt); + + x_ofs += (block_w - block_gap) / 2; + } + + return x_ofs; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_chart_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_chart_t * chart = (lv_chart_t *)obj; + + lv_ll_init(&chart->series_ll, sizeof(lv_chart_series_t)); + lv_ll_init(&chart->cursor_ll, sizeof(lv_chart_cursor_t)); + + chart->ymin[0] = 0; + chart->xmin[0] = 0; + chart->ymin[1] = 0; + chart->xmin[1] = 0; + chart->ymax[0] = 100; + chart->xmax[0] = 100; + chart->ymax[1] = 100; + chart->xmax[1] = 100; + + chart->hdiv_cnt = LV_CHART_HDIV_DEF; + chart->vdiv_cnt = LV_CHART_VDIV_DEF; + chart->point_cnt = LV_CHART_POINT_CNT_DEF; + chart->pressed_point_id = LV_CHART_POINT_NONE; + chart->type = LV_CHART_TYPE_LINE; + chart->update_mode = LV_CHART_UPDATE_MODE_SHIFT; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_chart_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_chart_t * chart = (lv_chart_t *)obj; + lv_chart_series_t * ser; + while(chart->series_ll.head) { + ser = lv_ll_get_head(&chart->series_ll); + if(!ser) continue; + + if(!ser->y_ext_buf_assigned) lv_free(ser->y_points); + if(!ser->x_ext_buf_assigned) lv_free(ser->x_points); + + lv_ll_remove(&chart->series_ll, ser); + lv_free(ser); + } + lv_ll_clear(&chart->series_ll); + + lv_chart_cursor_t * cur; + while(chart->cursor_ll.head) { + cur = lv_ll_get_head(&chart->cursor_ll); + lv_ll_remove(&chart->cursor_ll, cur); + lv_free(cur); + } + lv_ll_clear(&chart->cursor_ll); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_chart_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + lv_result_t res; + + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(code == LV_EVENT_PRESSED) { + lv_indev_t * indev = lv_indev_active(); + lv_point_t p; + lv_indev_get_point(indev, &p); + + p.x -= obj->coords.x1; + uint32_t id = get_index_from_x(obj, p.x + lv_obj_get_scroll_left(obj)); + if(id != (uint32_t)chart->pressed_point_id) { + invalidate_point(obj, id); + invalidate_point(obj, chart->pressed_point_id); + chart->pressed_point_id = id; + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + } + } + else if(code == LV_EVENT_RELEASED) { + invalidate_point(obj, chart->pressed_point_id); + chart->pressed_point_id = LV_CHART_POINT_NONE; + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_layer_t * layer = lv_event_get_layer(e); + + lv_area_t ext_coords; + lv_obj_get_coords(obj, &ext_coords); + int32_t ext_draw_size = lv_obj_get_ext_draw_size(obj); + lv_area_increase(&ext_coords, ext_draw_size, ext_draw_size); + + lv_area_t clip_area; + if(lv_area_intersect(&clip_area, &ext_coords, &layer->_clip_area)) { + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area; + + draw_div_lines(obj, layer); + + if(lv_ll_is_empty(&chart->series_ll) == false) { + if(chart->type == LV_CHART_TYPE_LINE) draw_series_line(obj, layer); + else if(chart->type == LV_CHART_TYPE_CURVE) draw_series_curve(obj, layer); + else if(chart->type == LV_CHART_TYPE_BAR) draw_series_bar(obj, layer); + else if(chart->type == LV_CHART_TYPE_STACKED) draw_series_stacked(obj, layer); + else if(chart->type == LV_CHART_TYPE_SCATTER) draw_series_scatter(obj, layer); + } + + draw_cursors(obj, layer); + + layer->_clip_area = clip_area_ori; + } + } +} + +static void draw_div_lines(lv_obj_t * obj, lv_layer_t * layer) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + int16_t i; + int16_t i_start; + int16_t i_end; + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + line_dsc.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); + + lv_opa_t border_opa = lv_obj_get_style_border_opa(obj, LV_PART_MAIN); + int32_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_border_side_t border_side = lv_obj_get_style_border_side(obj, LV_PART_MAIN); + + int32_t scroll_left = lv_obj_get_scroll_left(obj); + int32_t scroll_top = lv_obj_get_scroll_top(obj); + if(chart->hdiv_cnt > 1) { + int32_t y_ofs = obj->coords.y1 + pad_top - scroll_top; + line_dsc.p1.x = obj->coords.x1; + line_dsc.p2.x = obj->coords.x2; + + i_start = 0; + i_end = chart->hdiv_cnt; + if(border_opa > LV_OPA_MIN && border_w > 0) { + if((border_side & LV_BORDER_SIDE_TOP) && (lv_obj_get_style_pad_top(obj, LV_PART_MAIN) == 0)) i_start++; + if((border_side & LV_BORDER_SIDE_BOTTOM) && (lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) == 0)) i_end--; + } + + for(i = i_start; i < i_end; i++) { + line_dsc.p1.y = (int32_t)((int32_t)h * i) / (chart->hdiv_cnt - 1); + line_dsc.p1.y += y_ofs; + line_dsc.p2.y = line_dsc.p1.y; + line_dsc.base.id1 = i; + + lv_draw_line(layer, &line_dsc); + } + } + + if(chart->vdiv_cnt > 1) { + int32_t x_ofs = obj->coords.x1 + pad_left - scroll_left; + line_dsc.p1.y = obj->coords.y1; + line_dsc.p2.y = obj->coords.y2; + i_start = 0; + i_end = chart->vdiv_cnt; + if(border_opa > LV_OPA_MIN && border_w > 0) { + if((border_side & LV_BORDER_SIDE_LEFT) && (lv_obj_get_style_pad_left(obj, LV_PART_MAIN) == 0)) i_start++; + if((border_side & LV_BORDER_SIDE_RIGHT) && (lv_obj_get_style_pad_right(obj, LV_PART_MAIN) == 0)) i_end--; + } + + for(i = i_start; i < i_end; i++) { + line_dsc.p1.x = (int32_t)((int32_t)w * i) / (chart->vdiv_cnt - 1); + line_dsc.p1.x += x_ofs; + line_dsc.p2.x = line_dsc.p1.x; + line_dsc.base.id1 = i; + + lv_draw_line(layer, &line_dsc); + } + } +} + +static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->point_cnt < 2) return; + + uint32_t ser_cnt = lv_ll_get_len(&chart->series_ll); + if(ser_cnt == 0) return; + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + int32_t x_ofs = obj->coords.x1 + pad_left - lv_obj_get_scroll_left(obj); + int32_t y_ofs = obj->coords.y1 + pad_top - lv_obj_get_scroll_top(obj); + lv_chart_series_t * ser; + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + line_dsc.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &line_dsc); + line_dsc.base.id1 = ser_cnt - 1; + + /*If there are at least as many points as pixels then draw only vertical lines*/ + bool crowded_mode = (int32_t)chart->point_cnt >= w; + + int32_t bullet_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; + int32_t bullet_h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; + int32_t extra_space_x; + if(chart->point_cnt <= 1) extra_space_x = 0; + else extra_space_x = w / (chart->point_cnt - 1) + bullet_w + line_dsc.width; + + lv_draw_rect_dsc_t point_draw_dsc; + if(crowded_mode == false) { + lv_draw_rect_dsc_init(&point_draw_dsc); + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &point_draw_dsc); + point_draw_dsc.base.id1 = line_dsc.base.id1; + } + + lv_point_precise_t * points = NULL; + if(crowded_mode) { + points = lv_malloc((w + 2 * extra_space_x) * 3 * sizeof(lv_point_precise_t)); + } + else { + points = lv_malloc(chart->point_cnt * sizeof(lv_point_precise_t)); + } + + if(points == NULL) { + LV_LOG_WARN("Couldn't allocate the points array"); + return; + } + + line_dsc.points = points; + + /*Go through all data lines*/ + LV_LL_READ_BACK(&chart->series_ll, ser) { + if(ser->hidden) { + if(line_dsc.base.id1 > 0) { + line_dsc.base.id1--; + } + continue; + } + line_dsc.color = ser->color; + line_dsc.base.drop_shadow_color = ser->color; + + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + int32_t p_act = start_point; + int32_t p_prev = start_point; + + lv_value_precise_t y_min = obj->coords.y2; + lv_value_precise_t y_max = obj->coords.y1; + lv_value_precise_t x_prev = -10000; + line_dsc.p1.x = x_ofs; + line_dsc.p2.x = x_ofs; + line_dsc.point_cnt = 0; + + uint32_t i; + for(i = 0; i < chart->point_cnt; i++) { + lv_value_precise_t p_x = (int32_t)((w * i) / (chart->point_cnt - 1)) + x_ofs; + if(p_x > layer->_clip_area.x2 + extra_space_x + 1) break; + if(p_x < layer->_clip_area.x1 - extra_space_x - 1) { + p_prev = p_act; + continue; + } + p_act = (start_point + i) % chart->point_cnt; + + lv_value_precise_t p_y; + if(ser->y_points[p_act] == LV_CHART_POINT_NONE) { + p_y = LV_DRAW_LINE_POINT_NONE; + } + else { + int32_t v = ser->y_points[p_act]; + int32_t min_v = chart->ymin[ser->y_axis_sec]; + int32_t max_v = chart->ymax[ser->y_axis_sec]; + p_y = (int32_t)lv_map(v, min_v, max_v, y_ofs + h, y_ofs); + } + + /*In normal mode just collect the points here*/ + if(crowded_mode == false) { + points[line_dsc.point_cnt].x = p_x; + points[line_dsc.point_cnt].y = p_y; + line_dsc.point_cnt++; + } + /*In crowded mode draw vertical lines from the min/max on the same X coordinate*/ + else { + if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { + /*Draw only one vertical line between the min and max y-values on the same x-value*/ + y_max = LV_MAX(y_max, p_y); + y_min = LV_MIN(y_min, p_y); + if(x_prev != p_x) { + line_dsc.points[line_dsc.point_cnt].y = y_min; + line_dsc.points[line_dsc.point_cnt].x = p_x; + line_dsc.points[line_dsc.point_cnt + 1].y = y_max; + line_dsc.points[line_dsc.point_cnt + 1].x = p_x; + line_dsc.points[line_dsc.point_cnt + 2].y = LV_DRAW_LINE_POINT_NONE; + line_dsc.points[line_dsc.point_cnt + 2].x = p_x; + + /*If they are the same no line would be drawn*/ + if(line_dsc.points[line_dsc.point_cnt].y == line_dsc.points[line_dsc.point_cnt + 1].y) { + line_dsc.points[line_dsc.point_cnt + 1].y++; + } + y_min = p_y; /*Start the line of the next x from the current last y*/ + y_max = p_y; + x_prev = p_x; + line_dsc.point_cnt += 3; + } + } + } + + p_prev = p_act; + } + + /*Draw the line from the accumulated points*/ + lv_draw_line(layer, &line_dsc); + if(!crowded_mode) { + point_draw_dsc.bg_color = ser->color; + point_draw_dsc.base.id1 = line_dsc.base.id1; + /*Add the bullets too*/ + if(bullet_w > 0 && bullet_h > 0) { + point_draw_dsc.base.id2 = i - 1; /*Start from the last rendered point*/ + int32_t j; + for(j = line_dsc.point_cnt - 1; j >= 0; j--) { + if(points[j].y == LV_DRAW_LINE_POINT_NONE) continue; + + lv_area_t point_area; + point_area.x1 = (int32_t)points[j].x - bullet_w; + point_area.x2 = (int32_t)points[j].x + bullet_w; + point_area.y1 = (int32_t)points[j].y - bullet_h; + point_area.y2 = (int32_t)points[j].y + bullet_h; + + lv_draw_rect(layer, &point_draw_dsc, &point_area); + point_draw_dsc.base.id2--; + } + } + } + line_dsc.base.id1--; + } + + if(points) lv_free(points); +} + +static void draw_series_curve(lv_obj_t * obj, lv_layer_t * layer) +{ +#if LV_USE_VECTOR_GRAPHIC + lv_chart_t * chart = (lv_chart_t *)obj; + if(chart->point_cnt < 2) return; + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + int32_t x_ofs = obj->coords.x1 + pad_left - lv_obj_get_scroll_left(obj); + int32_t y_ofs = obj->coords.y1 + pad_top - lv_obj_get_scroll_top(obj); + lv_chart_series_t * ser; + + lv_draw_rect_dsc_t point_dsc_default; + lv_draw_rect_dsc_init(&point_dsc_default); + point_dsc_default.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &point_dsc_default); + + int32_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; + int32_t point_h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; + + uint32_t ser_cnt = lv_ll_get_len(&chart->series_ll); + if(ser_cnt == 0) { + return; + } + + float dashes[2]; + dashes[0] = lv_obj_get_style_line_dash_width(obj, LV_PART_ITEMS); + dashes[1] = lv_obj_get_style_line_dash_gap(obj, LV_PART_ITEMS); + + lv_draw_vector_dsc_t * dsc = lv_draw_vector_dsc_create(layer); + if(dsc == NULL) { + LV_LOG_WARN("Couldn't allocate vector dsc"); + return; + } + lv_vector_path_t * path = lv_vector_path_create(LV_VECTOR_PATH_QUALITY_MEDIUM); + dsc->base.id1 = ser_cnt - 1; + point_dsc_default.base.id1 = dsc->base.id1; + /*Go through all data lines (series)*/ + LV_LL_READ_BACK(&chart->series_ll, ser) { + if(ser->hidden) { + if(dsc->base.id1 > 0) { + dsc->base.id1--; + point_dsc_default.base.id1--; + } + continue; + } + + lv_vector_path_clear(path); + + lv_draw_vector_dsc_set_fill_opa(dsc, 0); + lv_draw_vector_dsc_set_stroke_color(dsc, ser->color); + lv_draw_vector_dsc_set_stroke_opa(dsc, LV_OPA_COVER); + lv_draw_vector_dsc_set_stroke_width(dsc, 2.0f); + if(dashes[0]) lv_draw_vector_dsc_set_stroke_dash(dsc, dashes, 2); + + point_dsc_default.bg_color = ser->color; + dsc->base.id2 = 0; + point_dsc_default.base.id2 = 0; + + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + /*The X distance between points. + *Just a rough calculation to know the extra area of interest around the chart*/ + int32_t max_dx = w / (chart->point_cnt - 1) + 1; + + lv_fpoint_t scaled_points[3]; + int32_t raw_points[3]; + int32_t s_prev = 0; /*Previous steepness around N-1 (y_diff of N-2 and N) */ + int32_t s_act = 0; /*Steepness around N (y_diff of N-1 and N+1)*/ + int32_t min_v = chart->ymin[ser->y_axis_sec]; + int32_t max_v = chart->ymax[ser->y_axis_sec]; + + int32_t i; + int32_t valid_point_cnt = 0; + int32_t point_cnt = chart->point_cnt; + for(i = 0; i <= point_cnt; i++) { + int32_t p_x = ((w * i) / (point_cnt - 1)) + x_ofs; + + if(p_x > layer->_clip_area.x2 + 2 * max_dx + point_w + 1) break; + if(p_x < layer->_clip_area.x1 - 2 * max_dx - point_w - 1) { + continue; + } + + /*We need 3 points to draw the curves (N-1, N, N+1)*/ + scaled_points[0] = scaled_points[1]; + scaled_points[1] = scaled_points[2]; + + raw_points[0] = raw_points[1]; + raw_points[1] = raw_points[2]; + + int32_t p_next = (start_point + i) % point_cnt; + raw_points[2] = ser->y_points[p_next]; + if(i > point_cnt - 1) { + s_act = 0; + } + else { + if(raw_points[2] == LV_CHART_POINT_NONE) { + s_act = s_prev; + } + else { + scaled_points[2].x = p_x; + scaled_points[2].y = (int32_t)lv_map(ser->y_points[p_next], min_v, max_v, y_ofs + h, y_ofs); + if(i == 0) { + scaled_points[0] = scaled_points[2]; + scaled_points[1] = scaled_points[2]; + } + + if((scaled_points[2].y >= scaled_points[1].y && scaled_points[1].y >= scaled_points[0].y) || + (scaled_points[2].y <= scaled_points[1].y && scaled_points[1].y <= scaled_points[0].y)) { + s_act = (int32_t)(scaled_points[2].y - scaled_points[0].y) / 2; + } + else { + s_act = 0; + } + } + } + + if(valid_point_cnt >= 2) { + if(raw_points[0] != LV_CHART_POINT_NONE && raw_points[1] != LV_CHART_POINT_NONE) { + lv_vector_path_move_to(path, &scaled_points[0]); + dsc->base.id2 = i; + + /*Average slope*/ + int32_t dx = (int32_t)(scaled_points[1].x - scaled_points[0].x); + + lv_fpoint_t c1 = {scaled_points[0].x + dx / 3, scaled_points[0].y + s_prev / 3}; + lv_fpoint_t c2 = {scaled_points[1].x - dx / 3, scaled_points[1].y - s_act / 3}; + lv_vector_path_cubic_to(path, &c1, &c2, &scaled_points[1]); + } + else { + s_act = 0; + } + } + s_prev = s_act; + + if(point_w && point_h && ser->y_points[p_next] != LV_CHART_POINT_NONE) { + lv_area_t point_area; + point_area.x1 = (int32_t)scaled_points[2].x - point_w; + point_area.x2 = (int32_t)scaled_points[2].x + point_w; + point_area.y1 = (int32_t)scaled_points[2].y - point_h; + point_area.y2 = (int32_t)scaled_points[2].y + point_h; + point_dsc_default.base.id2 = i - 1; + lv_draw_rect(layer, &point_dsc_default, &point_area); + } + valid_point_cnt++; + } + + lv_draw_vector_dsc_add_path(dsc, path); // draw a path + + if(dsc->base.id1 > 0) { + point_dsc_default.base.id1--; + dsc->base.id1--; + } + } + + lv_draw_vector(dsc); + lv_vector_path_delete(path); + lv_draw_vector_dsc_delete(dsc); +#else + LV_LOG_WARN("LV_USE_VECTOR_GRAPHIC is not enabled for LV_CHART_TYPE_CURVE. Falling back to LV_CHART_TYPE_LINE"); + draw_series_line(obj, layer); +#endif /*LV_USE_VECTOR_GRAPHIC*/ + +} + + +static void draw_series_scatter(lv_obj_t * obj, lv_layer_t * layer) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + uint32_t i; + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + int32_t x_ofs = obj->coords.x1 + pad_left + border_width - lv_obj_get_scroll_left(obj); + int32_t y_ofs = obj->coords.y1 + pad_top + border_width - lv_obj_get_scroll_top(obj); + lv_chart_series_t * ser; + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + line_dsc.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &line_dsc); + + lv_draw_rect_dsc_t point_dsc_default; + lv_draw_rect_dsc_init(&point_dsc_default); + point_dsc_default.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &point_dsc_default); + + int32_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR) / 2; + int32_t point_h = lv_obj_get_style_height(obj, LV_PART_INDICATOR) / 2; + + /*Do not bother with line ending is the point will over it*/ + if(LV_MIN(point_w, point_h) > line_dsc.width / 2) line_dsc.raw_end = 1; + if(line_dsc.width == 1) line_dsc.raw_end = 1; + + /*Go through all data lines*/ + LV_LL_READ_BACK(&chart->series_ll, ser) { + if(ser->hidden) continue; + line_dsc.color = ser->color; + point_dsc_default.bg_color = ser->color; + + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + line_dsc.p1.x = x_ofs; + line_dsc.p2.x = x_ofs; + + int32_t p_act = start_point; + int32_t p_prev = start_point; + if(ser->y_points[p_act] != LV_CHART_POINT_CNT_DEF) { + line_dsc.p2.x = lv_map(ser->x_points[p_act], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); + line_dsc.p2.x += x_ofs; + + line_dsc.p2.y = lv_map(ser->y_points[p_act], chart->ymin[ser->y_axis_sec], chart->ymax[ser->y_axis_sec], 0, h); + line_dsc.p2.y = h - line_dsc.p2.y; + line_dsc.p2.y += y_ofs; + } + else { + line_dsc.p2.x = (lv_value_precise_t)LV_COORD_MIN; + line_dsc.p2.y = (lv_value_precise_t)LV_COORD_MIN; + } + + for(i = 0; i < chart->point_cnt; i++) { + line_dsc.p1.x = line_dsc.p2.x; + line_dsc.p1.y = line_dsc.p2.y; + + p_act = (start_point + i) % chart->point_cnt; + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + line_dsc.p2.y = lv_map(ser->y_points[p_act], chart->ymin[ser->y_axis_sec], chart->ymax[ser->y_axis_sec], 0, h); + line_dsc.p2.y = h - line_dsc.p2.y; + line_dsc.p2.y += y_ofs; + + line_dsc.p2.x = lv_map(ser->x_points[p_act], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w); + line_dsc.p2.x += x_ofs; + } + else { + p_prev = p_act; + continue; + } + + if(i != 0) { /*Don't draw line *to* the first point.*/ + lv_area_t point_area; + point_area.x1 = (int32_t)line_dsc.p1.x - point_w; + point_area.x2 = (int32_t)line_dsc.p1.x + point_w; + point_area.y1 = (int32_t)line_dsc.p1.y - point_h; + point_area.y2 = (int32_t)line_dsc.p1.y + point_h; + + if(ser->y_points[p_prev] != LV_CHART_POINT_NONE && ser->y_points[p_act] != LV_CHART_POINT_NONE) { + line_dsc.base.id2 = i - 1; + lv_draw_line(layer, &line_dsc); + if(point_w && point_h) { + point_dsc_default.base.id2 = i - 1; + lv_draw_rect(layer, &point_dsc_default, &point_area); + } + } + + p_prev = p_act; + } + + /*Draw the last point*/ + if(i == chart->point_cnt - 1) { + + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + lv_area_t point_area; + point_area.x1 = (int32_t)line_dsc.p2.x - point_w; + point_area.x2 = (int32_t)line_dsc.p2.x + point_w; + point_area.y1 = (int32_t)line_dsc.p2.y - point_h; + point_area.y2 = (int32_t)line_dsc.p2.y + point_h; + + point_dsc_default.base.id2 = i; + lv_draw_rect(layer, &point_dsc_default, &point_area); + } + } + } + line_dsc.base.id1++; + point_dsc_default.base.id1++; + } +} + +static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + uint32_t i; + lv_area_t col_a; + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + int32_t y_tmp; + lv_chart_series_t * ser; + uint32_t ser_cnt = lv_ll_get_len(&chart->series_ll); + if(ser_cnt == 0) { + return; + } + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); /*Gap between the column on ~adjacent X*/ + int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; + int32_t ser_gap = lv_obj_get_style_pad_column(obj, LV_PART_ITEMS); /*Gap between the columns on the ~same X*/ + int32_t col_w = (block_w - (ser_cnt - 1) * ser_gap) / ser_cnt; + if(col_w < 1) col_w = 1; + + int32_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t x_ofs = pad_left - lv_obj_get_scroll_left(obj) + border_w; + int32_t y_ofs = pad_top - lv_obj_get_scroll_top(obj) + border_w; + + lv_draw_rect_dsc_t col_dsc; + lv_draw_rect_dsc_init(&col_dsc); + col_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &col_dsc); + col_dsc.bg_grad.dir = LV_GRAD_DIR_NONE; + col_dsc.bg_opa = LV_OPA_COVER; + + /*Make the cols longer with `radius` to clip the rounding from the bottom*/ + col_a.y2 = obj->coords.y2 + col_dsc.radius; + + /*Go through all points*/ + for(i = 0; i < chart->point_cnt; i++) { + int32_t x_act; + if(chart->point_cnt <= 1) { + x_act = obj->coords.x1 + x_ofs; + } + else { + x_act = (int32_t)((int32_t)(w - block_w) * i) / (chart->point_cnt - 1) + obj->coords.x1 + x_ofs; + } + + col_dsc.base.id2 = i; + col_dsc.base.id1 = 0; + + /*Draw the current point of all data line*/ + LV_LL_READ(&chart->series_ll, ser) { + if(ser->hidden) continue; + + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + col_a.x1 = x_act; + col_a.x2 = col_a.x1 + col_w - 1; + x_act += col_w + ser_gap; + + if(col_a.x2 < layer->_clip_area.x1) { + col_dsc.base.id1++; + continue; + } + if(col_a.x1 > layer->_clip_area.x2) break; + + col_dsc.bg_color = ser->color; + + int32_t p_act = (start_point + i) % chart->point_cnt; + y_tmp = (int32_t)((int32_t)ser->y_points[p_act] - chart->ymin[ser->y_axis_sec]) * h; + y_tmp = y_tmp / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]); + col_a.y1 = h - y_tmp + obj->coords.y1 + y_ofs; + + if(ser->y_points[p_act] != LV_CHART_POINT_NONE) { + lv_draw_rect(layer, &col_dsc, &col_a); + } + col_dsc.base.id1++; + } + } +} + +static void draw_series_stacked(lv_obj_t * obj, lv_layer_t * layer) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + + uint32_t i; + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + lv_chart_series_t * ser; + uint32_t ser_cnt = lv_ll_get_len(&chart->series_ll); + if(ser_cnt == 0) { + return; + } + + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); /*Gap between the columns on adjacent X ticks*/ + int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; + + int32_t border_w = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t x_ofs = pad_left - lv_obj_get_scroll_left(obj) + border_w; + int32_t y_ofs = pad_bottom - lv_obj_get_scroll_top(obj) + border_w; + + lv_draw_rect_dsc_t col_dsc; + lv_draw_rect_dsc_init(&col_dsc); + col_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &col_dsc); + col_dsc.bg_grad.dir = LV_GRAD_DIR_NONE; + col_dsc.bg_opa = LV_OPA_COVER; + + lv_area_t clip_area_ori = layer->_clip_area; + + /*Go through all points*/ + lv_area_t bar_full_area; + for(i = 0; i < chart->point_cnt; i++) { + col_dsc.base.id2 = i; + col_dsc.base.id1 = 0; + + /*Get the total bar height. All segments (series) will be drawn in the height*/ + int32_t v_sum_all = 0; + LV_LL_READ(&chart->series_ll, ser) { + if(ser->hidden) continue; + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + int32_t p_act = (start_point + i) % chart->point_cnt; + int32_t v_act = ser->y_points[p_act]; + if(ser->y_points[p_act] == LV_CHART_POINT_NONE) continue; + + /* Skip negative values in stacked charts. Negative values are not supported + * in stacked charts as they cannot be visually represented in the stacking logic. */ + if(v_act <= 0) { + LV_LOG_WARN("Stacked chart doesn't support negative values."); + continue; + } + v_sum_all += v_act; + } + + int32_t total_bar_height = value_to_y(obj, lv_ll_get_head(&chart->series_ll), v_sum_all, h); + if(total_bar_height <= 0) continue; + + if(chart->point_cnt <= 1) { + bar_full_area.x1 = obj->coords.x1 + x_ofs; + } + else { + bar_full_area.x1 = (int32_t)((int32_t)(w - block_w) * i) / (chart->point_cnt - 1) + obj->coords.x1 + x_ofs; + } + bar_full_area.x2 = bar_full_area.x1 + block_w - 1; + + /*No in the clip area yet*/ + if(bar_full_area.x2 < clip_area_ori.x1) continue; + + /*Out of the clip area already*/ + if(bar_full_area.x1 > clip_area_ori.x2) break; + + /*Draw the full_bar_area and set the clip area to clip the segments*/ + bar_full_area.y2 = obj->coords.y2 + col_dsc.radius; + bar_full_area.y1 = obj->coords.y2 - y_ofs - total_bar_height + 1; + + lv_area_t bar_clip_area = bar_full_area; + int32_t y_prev = obj->coords.y2 + 1; + + /*Draw the current point of all data line*/ + int32_t v_sum_act = 0; + LV_LL_READ(&chart->series_ll, ser) { + int32_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; + + col_dsc.bg_color = ser->color; + + int32_t p_act = (start_point + i) % chart->point_cnt; + int32_t v_act = ser->y_points[p_act]; + /*Can't show negative values on a stacked chart*/ + if(ser->y_points[p_act] == LV_CHART_POINT_NONE || + v_act <= 0 || + ser->hidden) { + col_dsc.base.id1++; + continue; + } + + v_sum_act += v_act; /*Use the summed value to get its `y` to avoid rounding errors*/ + + int32_t segment_y = value_to_y(obj, ser, v_sum_act, h); + bar_clip_area.y2 = y_prev - 1; + bar_clip_area.y1 = obj->coords.y2 - y_ofs - segment_y + 1; + y_prev = bar_clip_area.y1; + if(lv_area_intersect(&layer->_clip_area, &clip_area_ori, &bar_clip_area)) { + lv_draw_rect(layer, &col_dsc, &bar_full_area); + } + col_dsc.base.id1++; + } + + } + layer->_clip_area = clip_area_ori; +} + +static void draw_cursors(lv_obj_t * obj, lv_layer_t * layer) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_chart_t * chart = (lv_chart_t *)obj; + if(lv_ll_is_empty(&chart->cursor_ll)) return; + + lv_chart_cursor_t * cursor; + + lv_draw_line_dsc_t line_dsc_ori; + lv_draw_line_dsc_init(&line_dsc_ori); + line_dsc_ori.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_CURSOR, &line_dsc_ori); + + lv_draw_rect_dsc_t point_dsc_ori; + lv_draw_rect_dsc_init(&point_dsc_ori); + point_dsc_ori.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_CURSOR, &point_dsc_ori); + + lv_draw_line_dsc_t line_dsc; + lv_draw_rect_dsc_t point_dsc_tmp; + + int32_t point_w = lv_obj_get_style_width(obj, LV_PART_CURSOR) / 2; + int32_t point_h = lv_obj_get_style_width(obj, LV_PART_CURSOR) / 2; + + /*Go through all cursor lines*/ + LV_LL_READ_BACK(&chart->cursor_ll, cursor) { + lv_memcpy(&line_dsc, &line_dsc_ori, sizeof(lv_draw_line_dsc_t)); + lv_memcpy(&point_dsc_tmp, &point_dsc_ori, sizeof(lv_draw_rect_dsc_t)); + line_dsc.color = cursor->color; + point_dsc_tmp.bg_color = cursor->color; + + int32_t cx; + int32_t cy; + if(cursor->pos_set) { + cx = cursor->pos.x; + cy = cursor->pos.y; + } + else { + if(cursor->point_id == LV_CHART_POINT_NONE) continue; + lv_point_t p; + lv_chart_get_point_pos_by_id(obj, cursor->ser, cursor->point_id, &p); + cx = p.x; + cy = p.y; + } + + cx += obj->coords.x1; + cy += obj->coords.y1; + + lv_area_t point_area; + bool draw_point = point_w && point_h; + point_area.x1 = cx - point_w; + point_area.x2 = cx + point_w; + point_area.y1 = cy - point_h; + point_area.y2 = cy + point_h; + + if(cursor->dir & LV_DIR_HOR) { + line_dsc.p1.x = cursor->dir & LV_DIR_LEFT ? obj->coords.x1 : cx; + line_dsc.p1.y = cy; + line_dsc.p2.x = cursor->dir & LV_DIR_RIGHT ? obj->coords.x2 : cx; + line_dsc.p2.y = line_dsc.p1.y; + + line_dsc.base.id2 = 0; + point_dsc_tmp.base.id2 = 0; + + lv_draw_line(layer, &line_dsc); + + if(draw_point) { + lv_draw_rect(layer, &point_dsc_tmp, &point_area); + } + } + + if(cursor->dir & LV_DIR_VER) { + line_dsc.p1.x = cx; + line_dsc.p1.y = cursor->dir & LV_DIR_TOP ? obj->coords.y1 : cy; + line_dsc.p2.x = line_dsc.p1.x; + line_dsc.p2.y = cursor->dir & LV_DIR_BOTTOM ? obj->coords.y2 : cy; + + line_dsc.base.id2 = 1; + point_dsc_tmp.base.id2 = 1; + + lv_draw_line(layer, &line_dsc); + + if(draw_point) { + lv_draw_rect(layer, &point_dsc_tmp, &point_area); + } + } + line_dsc_ori.base.id1++; + point_dsc_ori.base.id1++; + } +} + +/** + * Get the nearest index to an X coordinate + * @param chart pointer to a chart object + * @param coord the coordination of the point relative to the series area. + * @return the found index + */ +static uint32_t get_index_from_x(lv_obj_t * obj, int32_t x) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + int32_t w = lv_obj_get_content_width(obj); + int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + x -= pad_left; + + if(x < 0) return 0; + if(x > w) return chart->point_cnt - 1; + if(chart->type == LV_CHART_TYPE_LINE || + chart->type == LV_CHART_TYPE_CURVE) return (x * (chart->point_cnt - 1) + w / 2) / w; + if(chart->type == LV_CHART_TYPE_BAR || chart->type == LV_CHART_TYPE_STACKED) return (x * chart->point_cnt) / w; + if(chart->type == LV_CHART_TYPE_SCATTER) { + /*For scatter charts, the nearest id could be different depending on the series. Just check the first series.*/ + lv_chart_series_t * ser = lv_chart_get_series_next(obj, NULL); + if(ser) { + int32_t best_dist = INT32_MAX; + uint32_t best_index = 0; + for(uint32_t i = 0; i < chart->point_cnt; i++) { + int32_t dist = LV_ABS(x - lv_map(ser->x_points[i], chart->xmin[ser->x_axis_sec], chart->xmax[ser->x_axis_sec], 0, w)); + if(dist < best_dist) { + best_dist = dist; + best_index = i; + } + } + return best_index; + } + } + + return 0; +} + +static void invalidate_point(lv_obj_t * obj, uint32_t i) +{ + lv_chart_t * chart = (lv_chart_t *)obj; + if(i >= chart->point_cnt) return; + + + /*In shift mode the whole chart changes so the whole object*/ + if(chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT) { + lv_obj_invalidate(obj); + return; + } + int32_t w = lv_obj_get_content_width(obj); + int32_t scroll_left = lv_obj_get_scroll_left(obj); + int32_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t x_ofs = obj->coords.x1 + pleft + bwidth - scroll_left; + + if(chart->type == LV_CHART_TYPE_LINE || chart->type == LV_CHART_TYPE_CURVE) { + int32_t line_width = lv_obj_get_style_line_width(obj, LV_PART_ITEMS); + int32_t point_w = lv_obj_get_style_width(obj, LV_PART_INDICATOR); + + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + coords.y1 -= line_width + point_w; + coords.y2 += line_width + point_w; + + /*Invalidate the area between the previous and the next points*/ + if(i < chart->point_cnt - 1) { + coords.x1 = ((w * i) / (chart->point_cnt - 1)) + x_ofs - line_width - point_w; + coords.x2 = ((w * (i + 1)) / (chart->point_cnt - 1)) + x_ofs + line_width + point_w; + lv_obj_invalidate_area(obj, &coords); + } + + if(i > 0) { + coords.x1 = ((w * (i - 1)) / (chart->point_cnt - 1)) + x_ofs - line_width - point_w; + coords.x2 = ((w * i) / (chart->point_cnt - 1)) + x_ofs + line_width + point_w; + lv_obj_invalidate_area(obj, &coords); + } + } + else if(chart->type == LV_CHART_TYPE_BAR || chart->type == LV_CHART_TYPE_STACKED) { + lv_area_t col_a; + /*Gap between the column on ~adjacent X*/ + int32_t block_gap = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + int32_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt; + + int32_t x_act; + if(chart->point_cnt > 1) { + x_act = (int32_t)((int32_t)(w - block_w) * i) / (chart->point_cnt - 1); + } + else { + x_act = 0; + } + + lv_obj_get_coords(obj, &col_a); + col_a.x1 = x_act + x_ofs; + col_a.x2 = col_a.x1 + block_w + block_gap; + col_a.x1 -= block_gap; + + lv_obj_invalidate_area(obj, &col_a); + } + else { + lv_obj_invalidate(obj); + } +} + +static void new_points_alloc(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t cnt, int32_t ** a) +{ + if((*a) == NULL) return; + + lv_chart_t * chart = (lv_chart_t *) obj; + uint32_t point_cnt_old = chart->point_cnt; + uint32_t i; + + if(ser->start_point != 0) { + int32_t * new_points = lv_malloc(sizeof(int32_t) * cnt); + LV_ASSERT_MALLOC(new_points); + if(new_points == NULL) return; + + if(cnt >= point_cnt_old) { + for(i = 0; i < point_cnt_old; i++) { + new_points[i] = + (*a)[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ + } + for(i = point_cnt_old; i < cnt; i++) { + new_points[i] = LV_CHART_POINT_NONE; /*Fill up the rest with default value*/ + } + } + else { + for(i = 0; i < cnt; i++) { + new_points[i] = + (*a)[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ + } + } + + /*Switch over pointer from old to new*/ + lv_free((*a)); + (*a) = new_points; + } + else { + (*a) = lv_realloc((*a), sizeof(int32_t) * cnt); + LV_ASSERT_MALLOC((*a)); + if((*a) == NULL) return; + /*Initialize the new points*/ + if(cnt > point_cnt_old) { + for(i = point_cnt_old - 1; i < cnt; i++) { + (*a)[i] = LV_CHART_POINT_NONE; + } + } + } +} + +/** + * Map a value to a height + * @param obj pointer to a chart + * @param ser pointer to the series + * @param v the value to map + * @param h the height to which the value needs to be mapped + * @return the mapped y-coordinate value corresponding to the input value + */ +static int32_t value_to_y(lv_obj_t * obj, lv_chart_series_t * ser, int32_t v, int32_t h) +{ + lv_chart_t * chart = (lv_chart_t *) obj; + + return lv_map(v, chart->ymin[ser->y_axis_sec], chart->ymax[ser->y_axis_sec], 0, h); +} + +#endif diff --git a/inc/lvgl/src/widgets/chart/lv_chart.h b/inc/lvgl/src/widgets/chart/lv_chart.h new file mode 100644 index 0000000..ba07f87 --- /dev/null +++ b/inc/lvgl/src/widgets/chart/lv_chart.h @@ -0,0 +1,466 @@ +/** + * @file lv_chart.h + * + */ + +#ifndef LV_CHART_H +#define LV_CHART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_CHART != 0 + +/********************* + * DEFINES + *********************/ + +/**Default value of points. Can be used to not draw a point*/ +#define LV_CHART_POINT_NONE (INT32_MAX) +LV_EXPORT_CONST_INT(LV_CHART_POINT_NONE); + +/********************** + * TYPEDEFS + **********************/ + +/** + * Chart types + */ +typedef enum { + LV_CHART_TYPE_NONE, /**< Don't draw the series*/ + LV_CHART_TYPE_LINE, /**< Connect the points with lines*/ + LV_CHART_TYPE_CURVE, /**< Connect the points with curves*/ + LV_CHART_TYPE_BAR, /**< Draw bars for each series*/ + LV_CHART_TYPE_STACKED, /**< Draw a single stacked bar for each data point. Supports only positive values*/ + LV_CHART_TYPE_SCATTER, /**< Draw points and lines in 2D (x,y coordinates)*/ +} lv_chart_type_t; + +/** + * Chart update mode for `lv_chart_set_next` + */ +typedef enum { + LV_CHART_UPDATE_MODE_SHIFT, /**< Shift old data to the left and add the new one the right*/ + LV_CHART_UPDATE_MODE_CIRCULAR, /**< Add the new data in a circular way*/ +} lv_chart_update_mode_t; + +/** + * Enumeration of the axis' + */ +typedef enum { + LV_CHART_AXIS_PRIMARY_Y = 0x00, + LV_CHART_AXIS_SECONDARY_Y = 0x01, + LV_CHART_AXIS_PRIMARY_X = 0x02, + LV_CHART_AXIS_SECONDARY_X = 0x04, + LV_CHART_AXIS_LAST +} lv_chart_axis_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_chart_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_chart_id_t { + LV_PROPERTY_ID(CHART, TYPE, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(CHART, POINT_COUNT, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(CHART, UPDATE_MODE, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(CHART, HOR_DIV_LINE_COUNT, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(CHART, VER_DIV_LINE_COUNT, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_CHART_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a chart object + * @param parent pointer to an object, it will be the parent of the new chart + * @return pointer to the created chart + */ +lv_obj_t * lv_chart_create(lv_obj_t * parent); + +/** + * Set a new type for a chart + * @param obj pointer to a chart object + * @param type new type of the chart (from 'lv_chart_type_t' enum) + */ +void lv_chart_set_type(lv_obj_t * obj, lv_chart_type_t type); +/** + * Set the number of points on a data line on a chart + * @param obj pointer to a chart object + * @param cnt new number of points on the data lines + */ +void lv_chart_set_point_count(lv_obj_t * obj, uint32_t cnt); + +/** + * Set the minimal and maximal y values on an axis + * @param obj pointer to a chart object + * @param axis `LV_CHART_AXIS_PRIMARY_Y` or `LV_CHART_AXIS_SECONDARY_Y` + * @param min minimum value of the y axis + * @param max maximum value of the y axis + */ +void lv_chart_set_axis_range(lv_obj_t * obj, lv_chart_axis_t axis, int32_t min, int32_t max); + +/** + * Set the minimal values on an axis + * @param obj pointer to a chart object + * @param axis `LV_CHART_AXIS_PRIMARY_Y` or `LV_CHART_AXIS_SECONDARY_Y` + * @param min minimal value of the y axis + */ +void lv_chart_set_axis_min_value(lv_obj_t * obj, lv_chart_axis_t axis, int32_t min); + +/** + * Set the maximal y values on an axis + * @param obj pointer to a chart object + * @param axis `LV_CHART_AXIS_PRIMARY_Y` or `LV_CHART_AXIS_SECONDARY_Y` + * @param max maximum value of the y axis + */ +void lv_chart_set_axis_max_value(lv_obj_t * obj, lv_chart_axis_t axis, int32_t max); + + +/** + * Set update mode of the chart object. Affects + * @param obj pointer to a chart object + * @param update_mode the update mode + */ +void lv_chart_set_update_mode(lv_obj_t * obj, lv_chart_update_mode_t update_mode); + +/** + * Set the number of horizontal and vertical division lines + * @param obj pointer to a chart object + * @param hdiv number of horizontal division lines + * @param vdiv number of vertical division lines + */ +void lv_chart_set_div_line_count(lv_obj_t * obj, uint32_t hdiv, uint32_t vdiv); + +/** + * Set the number of horizontal division lines + * @param obj pointer to a chart object + * @param cnt number of horizontal division lines + */ +void lv_chart_set_hor_div_line_count(lv_obj_t * obj, uint32_t cnt); + +/** + * Set the number of vertical division lines + * @param obj pointer to a chart object + * @param cnt number of vertical division lines + */ +void lv_chart_set_ver_div_line_count(lv_obj_t * obj, uint32_t cnt); + +/** + * Get the type of a chart + * @param obj pointer to chart object + * @return type of the chart (from 'lv_chart_t' enum) + */ +lv_chart_type_t lv_chart_get_type(const lv_obj_t * obj); + +/** + * Get the data point number per data line on chart + * @param obj pointer to chart object + * @return point number on each data line + */ +uint32_t lv_chart_get_point_count(const lv_obj_t * obj); + +/** + * Get the update mode of a chart + * @param obj pointer to a chart object + * @return the update mode + */ +lv_chart_update_mode_t lv_chart_get_update_mode(const lv_obj_t * obj); + +/** + * Get the number of horizontal division lines + * @param obj pointer to a chart object + * @return the number of horizontal division lines + */ +uint32_t lv_chart_get_hor_div_line_count(const lv_obj_t * obj); + +/** + * Get the number of vertical division lines + * @param obj pointer to a chart object + * @return the number of vertical division lines + */ +uint32_t lv_chart_get_ver_div_line_count(const lv_obj_t * obj); + +/** + * Get the current index of the x-axis start point in the data array + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @return the index of the current x start point in the data array + */ +uint32_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser); + +/** + * Get the position of a point to the chart. + * @param obj pointer to a chart object + * @param ser pointer to series + * @param id the index. + * @param p_out store the result position here + */ +void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, lv_point_t * p_out); + +/** + * Refresh a chart if its data line has changed + * @param obj pointer to chart object + */ +void lv_chart_refresh(lv_obj_t * obj); + +/*====================== + * Series + *=====================*/ + +/** + * Allocate and add a data series to the chart + * @param obj pointer to a chart object + * @param color color of the data series + * @param axis the y axis to which the series should be attached (::LV_CHART_AXIS_PRIMARY_Y or ::LV_CHART_AXIS_SECONDARY_Y) + * @return pointer to the allocated data series or NULL on failure + */ +lv_chart_series_t * lv_chart_add_series(lv_obj_t * obj, lv_color_t color, lv_chart_axis_t axis); + +/** + * Deallocate and remove a data series from a chart + * @param obj pointer to a chart object + * @param series pointer to a data series on 'chart' + */ +void lv_chart_remove_series(lv_obj_t * obj, lv_chart_series_t * series); + +/** + * Hide/Unhide a single series of a chart. + * @param chart pointer to a chart object. + * @param series pointer to a series object + * @param hide true: hide the series + */ +void lv_chart_hide_series(lv_obj_t * chart, lv_chart_series_t * series, bool hide); + +/** + * Change the color of a series + * @param chart pointer to a chart object. + * @param series pointer to a series object + * @param color the new color of the series + */ +void lv_chart_set_series_color(lv_obj_t * chart, lv_chart_series_t * series, lv_color_t color); + +/** + * Get the color of a series + * @param chart pointer to a chart object. + * @param series pointer to a series object + * @return the color of the series + */ +lv_color_t lv_chart_get_series_color(lv_obj_t * chart, const lv_chart_series_t * series); + +/** + * Set the index of the x-axis start point in the data array. + * This point will be considers the first (left) point and the other points will be drawn after it. + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param id the index of the x point in the data array + */ +void lv_chart_set_x_start_point(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id); + +/** + * Get the next series. + * @param chart pointer to a chart + * @param ser the previous series or NULL to get the first + * @return the next series or NULL if there is no more. + */ +lv_chart_series_t * lv_chart_get_series_next(const lv_obj_t * chart, const lv_chart_series_t * ser); + +/*===================== + * Cursor + *====================*/ + +/** + * Add a cursor with a given color + * @param obj pointer to chart object + * @param color color of the cursor + * @param dir direction of the cursor. `LV_DIR_RIGHT/LEFT/TOP/DOWN/HOR/VER/ALL`. OR-ed values are possible + * @return pointer to the created cursor + */ +lv_chart_cursor_t * lv_chart_add_cursor(lv_obj_t * obj, lv_color_t color, lv_dir_t dir); + +/** + * Remove a cursor + * @param obj pointer to chart object + * @param cursor pointer to the cursor + */ +void lv_chart_remove_cursor(lv_obj_t * obj, lv_chart_cursor_t * cursor); + +/** + * Set the coordinate of the cursor with respect to the paddings + * @param chart pointer to a chart object + * @param cursor pointer to the cursor + * @param pos the new coordinate of cursor relative to the chart + */ +void lv_chart_set_cursor_pos(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_point_t * pos); + +/** + * Set the X coordinate of the cursor with respect to the paddings + * @param chart pointer to a chart object + * @param cursor pointer to the cursor + * @param x the new X coordinate of cursor relative to the chart + */ +void lv_chart_set_cursor_pos_x(lv_obj_t * chart, lv_chart_cursor_t * cursor, int32_t x); + +/** + * Set the coordinate of the cursor with respect to the paddings + * @param chart pointer to a chart object + * @param cursor pointer to the cursor + * @param y the new Y coordinate of cursor relative to the chart + */ +void lv_chart_set_cursor_pos_y(lv_obj_t * chart, lv_chart_cursor_t * cursor, int32_t y); + +/** + * Stick the cursor to a point + * @param chart pointer to a chart object + * @param cursor pointer to the cursor + * @param ser pointer to a series + * @param point_id the point's index or `LV_CHART_POINT_NONE` to not assign to any points. + */ +void lv_chart_set_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor, lv_chart_series_t * ser, + uint32_t point_id); + +/** + * Get the coordinate of the cursor with respect to the paddings + * @param chart pointer to a chart object + * @param cursor pointer to cursor + * @return coordinate of the cursor as lv_point_t + */ +lv_point_t lv_chart_get_cursor_point(lv_obj_t * chart, lv_chart_cursor_t * cursor); + +/*===================== + * Set/Get value(s) + *====================*/ + +/** + * Initialize all data points of a series with a value + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param value the new value for all points. `LV_CHART_POINT_NONE` can be used to hide the points. + */ +void lv_chart_set_all_values(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value); + +/** + * Set the next point's Y value according to the update mode policy. + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param value the new value of the next data + */ +void lv_chart_set_next_value(lv_obj_t * obj, lv_chart_series_t * ser, int32_t value); + +/** + * Set the next point's X and Y value according to the update mode policy. + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param x_value the new X value of the next data + * @param y_value the new Y value of the next data + */ +void lv_chart_set_next_value2(lv_obj_t * obj, lv_chart_series_t * ser, int32_t x_value, int32_t y_value); + +/** + * Same as `lv_chart_set_next_value` but set the values from an array + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param values the new values to set + * @param values_cnt number of items in `values` + */ +void lv_chart_set_series_values(lv_obj_t * obj, lv_chart_series_t * ser, const int32_t values[], size_t values_cnt); + +/** + * Same as `lv_chart_set_next_value2` but set the values from an array + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param x_values the new values to set on the X axis + * @param y_values the new values to set o nthe Y axis + * @param values_cnt number of items in `x_values` and `y_values` + */ +void lv_chart_set_series_values2(lv_obj_t * obj, lv_chart_series_t * ser, const int32_t x_values[], + const int32_t y_values[], size_t values_cnt); + +/** + * Set an individual point's y value of a chart's series directly based on its index + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param id the index of the x point in the array + * @param value value to assign to array point + */ +void lv_chart_set_series_value_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t value); + +/** + * Set an individual point's x and y value of a chart's series directly based on its index + * Can be used only with `LV_CHART_TYPE_SCATTER`. + * @param obj pointer to chart object + * @param ser pointer to a data series on 'chart' + * @param id the index of the x point in the array + * @param x_value the new X value of the next data + * @param y_value the new Y value of the next data + */ +void lv_chart_set_series_value_by_id2(lv_obj_t * obj, lv_chart_series_t * ser, uint32_t id, int32_t x_value, + int32_t y_value); + +/** + * Set an external array for the y data points to use for the chart + * NOTE: It is the users responsibility to make sure the `point_cnt` matches the external array size. + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param array external array of points for chart + */ +void lv_chart_set_series_ext_y_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]); + +/** + * Set an external array for the x data points to use for the chart + * NOTE: It is the users responsibility to make sure the `point_cnt` matches the external array size. + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @param array external array of points for chart + */ +void lv_chart_set_series_ext_x_array(lv_obj_t * obj, lv_chart_series_t * ser, int32_t array[]); + +/** + * Get the array of y values of a series + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @return the array of values with 'point_count' elements + */ +int32_t * lv_chart_get_series_y_array(const lv_obj_t * obj, lv_chart_series_t * ser); + +/** + * Get the array of x values of a series + * @param obj pointer to a chart object + * @param ser pointer to a data series on 'chart' + * @return the array of values with 'point_count' elements + */ +int32_t * lv_chart_get_series_x_array(const lv_obj_t * obj, lv_chart_series_t * ser); + +/** + * Get the index of the currently pressed point. It's the same for every series. + * @param obj pointer to a chart object + * @return the index of the point [0 .. point count] or LV_CHART_POINT_ID_NONE if no point is being pressed + */ +uint32_t lv_chart_get_pressed_point(const lv_obj_t * obj); + +/** + * Get the overall offset from the chart's side to the center of the first point. + * In case of a bar chart it will be the center of the first column group + * @param obj pointer to a chart object + * @return the offset of the center + */ +int32_t lv_chart_get_first_point_center_offset(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CHART*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHART_H*/ diff --git a/inc/lvgl/src/widgets/chart/lv_chart_private.h b/inc/lvgl/src/widgets/chart/lv_chart_private.h new file mode 100644 index 0000000..b2f0bcc --- /dev/null +++ b/inc/lvgl/src/widgets/chart/lv_chart_private.h @@ -0,0 +1,85 @@ +/** + * @file lv_chart_private.h + * + */ + +#ifndef LV_CHART_PRIVATE_H +#define LV_CHART_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_chart.h" + +#if LV_USE_CHART != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Descriptor a chart series + */ +struct _lv_chart_series_t { + int32_t * x_points; + int32_t * y_points; + lv_color_t color; + uint32_t start_point; + uint32_t hidden : 1; + uint32_t x_ext_buf_assigned : 1; + uint32_t y_ext_buf_assigned : 1; + uint32_t x_axis_sec : 1; + uint32_t y_axis_sec : 1; +}; + +struct _lv_chart_cursor_t { + lv_point_t pos; + int32_t point_id; + lv_color_t color; + lv_chart_series_t * ser; + lv_dir_t dir; + uint32_t pos_set: 1; /**< 1: pos is set; 0: point_id is set */ +}; + +struct _lv_chart_t { + lv_obj_t obj; + lv_ll_t series_ll; /**< Linked list for series (stores lv_chart_series_t) */ + lv_ll_t cursor_ll; /**< Linked list for cursors (stores lv_chart_cursor_t) */ + int32_t ymin[2]; + int32_t ymax[2]; + int32_t xmin[2]; + int32_t xmax[2]; + int32_t pressed_point_id; + uint32_t hdiv_cnt; /**< Number of horizontal division lines */ + uint32_t vdiv_cnt; /**< Number of vertical division lines */ + uint32_t point_cnt; /**< Number of points in all series */ + lv_chart_type_t type : 4; /**< Chart type */ + lv_chart_update_mode_t update_mode : 2; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_CHART != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHART_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/checkbox/lv_checkbox.c b/inc/lvgl/src/widgets/checkbox/lv_checkbox.c new file mode 100644 index 0000000..b5cc2e9 --- /dev/null +++ b/inc/lvgl/src/widgets/checkbox/lv_checkbox.c @@ -0,0 +1,308 @@ +/** + * @file lv_checkbox.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_checkbox_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_CHECKBOX != 0 + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_text_private.h" +#include "../../misc/lv_text_ap.h" +#include "../../core/lv_group.h" +#include "../../draw/lv_draw.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_checkbox_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_checkbox_draw(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_checkbox_properties[] = { + { + .id = LV_PROPERTY_CHECKBOX_TEXT, + .setter = lv_checkbox_set_text, + .getter = lv_checkbox_get_text, + }, +}; +#endif + +const lv_obj_class_t lv_checkbox_class = { + .constructor_cb = lv_checkbox_constructor, + .destructor_cb = lv_checkbox_destructor, + .event_cb = lv_checkbox_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_checkbox_t), + .base_class = &lv_obj_class, + .name = "lv_checkbox", + LV_PROPERTY_CLASS_FIELDS(checkbox, CHECKBOX) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_checkbox_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_checkbox_set_text(lv_obj_t * obj, const char * txt) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + if(NULL != txt) { + size_t len; + +#if LV_USE_ARABIC_PERSIAN_CHARS + len = lv_text_ap_calc_bytes_count(txt) + 1; +#else + len = lv_strlen(txt) + 1; +#endif + + if(!cb->static_txt) cb->txt = lv_realloc(cb->txt, len); + else cb->txt = lv_malloc(len); + + LV_ASSERT_MALLOC(cb->txt); + if(NULL == cb->txt) return; + +#if LV_USE_ARABIC_PERSIAN_CHARS + lv_text_ap_proc(txt, cb->txt); +#else + lv_strcpy(cb->txt, txt); +#endif + + cb->static_txt = 0; + } + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + if(!cb->static_txt) lv_free(cb->txt); + + cb->txt = (char *)txt; + cb->static_txt = 1; + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_checkbox_get_text(const lv_obj_t * obj) +{ + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + return cb->txt; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_checkbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + +#if LV_WIDGETS_HAS_DEFAULT_VALUE + cb->txt = (char *)"Check box"; + cb->static_txt = 1; +#else + cb->txt = (char *)""; + cb->static_txt = 1; +#endif + + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_checkbox_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + if(!cb->static_txt) { + lv_free(cb->txt); + cb->txt = NULL; + } + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_checkbox_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + lv_text_attributes_t attributes = {0}; + + attributes.line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + attributes.letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + attributes.max_width = LV_COORD_MAX; + attributes.text_flags = LV_TEXT_FLAG_NONE; + + lv_point_t txt_size; + + lv_text_get_size_attributes(&txt_size, cb->txt, font, &attributes); + + int32_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + int32_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + int32_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + int32_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + int32_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + lv_point_t marker_size; + marker_size.x = font_h + marker_leftp + marker_rightp; + marker_size.y = font_h + marker_topp + marker_bottomp; + + p->x = marker_size.x + txt_size.x + bg_colp; + p->y = LV_MAX(marker_size.y, txt_size.y); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t * s = lv_event_get_param(e); + int32_t m = lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR); + *s = LV_MAX(*s, m); + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_checkbox_draw(e); + } +} + +static void lv_checkbox_draw(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_checkbox_t * cb = (lv_checkbox_t *)obj; + + lv_layer_t * layer = lv_event_get_layer(e); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + + const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + int32_t bg_border = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t bg_topp = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + bg_border; + int32_t bg_p = is_rtl ? lv_obj_get_style_pad_right(obj, LV_PART_MAIN) : lv_obj_get_style_pad_left(obj, + LV_PART_MAIN) + bg_border; + int32_t bg_colp = lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + int32_t marker_leftp = lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + int32_t marker_rightp = lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + int32_t marker_topp = lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + int32_t marker_bottomp = lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + + int32_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_INDICATOR); + int32_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_INDICATOR); + + lv_draw_rect_dsc_t indic_dsc; + lv_draw_rect_dsc_init(&indic_dsc); + indic_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &indic_dsc); + lv_area_t marker_area; + if(is_rtl) { + marker_area.x2 = obj->coords.x2 - bg_p; + marker_area.x1 = marker_area.x2 - font_h - marker_leftp - marker_rightp + 1; + } + else { + marker_area.x1 = obj->coords.x1 + bg_p; + marker_area.x2 = marker_area.x1 + font_h + marker_leftp + marker_rightp - 1; + } + marker_area.y1 = obj->coords.y1 + bg_topp; + marker_area.y2 = marker_area.y1 + font_h + marker_topp + marker_bottomp - 1; + + lv_area_t marker_area_transf; + lv_area_copy(&marker_area_transf, &marker_area); + lv_area_increase(&marker_area_transf, transf_w, transf_h); + + lv_draw_rect(layer, &indic_dsc, &marker_area_transf); + + lv_text_attributes_t attributes = {0}; + attributes.line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + attributes.letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + attributes.text_flags = LV_TEXT_FLAG_NONE; + attributes.max_width = LV_COORD_MAX; + + lv_point_t txt_size; + lv_text_get_size_attributes(&txt_size, cb->txt, font, &attributes); + + lv_draw_label_dsc_t txt_dsc; + lv_draw_label_dsc_init(&txt_dsc); + txt_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &txt_dsc); + txt_dsc.text = cb->txt; + + int32_t y_ofs = (lv_area_get_height(&marker_area) - font_h) / 2; + lv_area_t txt_area; + if(is_rtl) { + txt_area.x2 = marker_area.x1 - bg_colp; + txt_area.x1 = txt_area.x2 - txt_size.x; + } + else { + txt_area.x1 = marker_area.x2 + bg_colp; + txt_area.x2 = txt_area.x1 + txt_size.x; + } + txt_area.y1 = obj->coords.y1 + bg_topp + y_ofs; + txt_area.y2 = txt_area.y1 + txt_size.y; + + lv_draw_label(layer, &txt_dsc, &txt_area); +} +#endif diff --git a/inc/lvgl/src/widgets/checkbox/lv_checkbox.h b/inc/lvgl/src/widgets/checkbox/lv_checkbox.h new file mode 100644 index 0000000..0ca1fac --- /dev/null +++ b/inc/lvgl/src/widgets/checkbox/lv_checkbox.h @@ -0,0 +1,86 @@ +/** + * @file lv_checkbox.h + * + */ + +#ifndef LV_CHECKBOX_H +#define LV_CHECKBOX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_CHECKBOX != 0 + +/********************* + * DEFINES + *********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_checkbox_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_checkbox_id_t { + LV_PROPERTY_ID(CHECKBOX, TEXT, LV_PROPERTY_TYPE_TEXT, 0), + LV_PROPERTY_CHECKBOX_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a check box object + * @param parent pointer to an object, it will be the parent of the new button + * @return pointer to the created check box + */ +lv_obj_t * lv_checkbox_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the text of a check box. `txt` will be copied and may be deallocated + * after this function returns. + * @param obj pointer to a check box + * @param txt the text of the check box. NULL to refresh with the current text. + */ +void lv_checkbox_set_text(lv_obj_t * obj, const char * txt); + +/** + * Set the text of a check box. `txt` must not be deallocated during the life + * of this checkbox. + * @param obj pointer to a check box + * @param txt the text of the check box. + */ +void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text of a check box + * @param obj pointer to check box object + * @return pointer to the text of the check box + */ +const char * lv_checkbox_get_text(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CHECKBOX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHECKBOX_H*/ diff --git a/inc/lvgl/src/widgets/checkbox/lv_checkbox_private.h b/inc/lvgl/src/widgets/checkbox/lv_checkbox_private.h new file mode 100644 index 0000000..a7167c9 --- /dev/null +++ b/inc/lvgl/src/widgets/checkbox/lv_checkbox_private.h @@ -0,0 +1,55 @@ +/** + * @file lv_checkbox_private.h + * + */ + +#ifndef LV_CHECKBOX_PRIVATE_H +#define LV_CHECKBOX_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_checkbox.h" + +#if LV_USE_CHECKBOX != 0 +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_checkbox_t { + lv_obj_t obj; + char * txt; + uint32_t static_txt : 1; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_CHECKBOX != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_CHECKBOX_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/dropdown/lv_dropdown.c b/inc/lvgl/src/widgets/dropdown/lv_dropdown.c new file mode 100644 index 0000000..2c7ddb0 --- /dev/null +++ b/inc/lvgl/src/widgets/dropdown/lv_dropdown.c @@ -0,0 +1,1316 @@ +/** + * @file lv_dropdown.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_dropdown_private.h" +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../core/lv_obj.h" +#if LV_USE_DROPDOWN != 0 + +#include "../../misc/lv_assert.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_group.h" +#include "../../indev/lv_indev.h" +#include "../../display/lv_display.h" +#include "../../font/lv_symbol_def.h" +#include "../../misc/lv_anim.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_text_ap.h" +#include "../../misc/lv_text_private.h" +#include "../../core/lv_observer_private.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_dropdown_class) +#define MY_CLASS_LIST &lv_dropdownlist_class + +#define LV_DROPDOWN_PR_NONE 0xFFFF + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_obj_t * lv_dropdown_list_create(lv_obj_t * parent); +static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_dropdown_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static void lv_dropdownlist_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_dropdownlist_destructor(const lv_obj_class_t * class_p, lv_obj_t * list_obj); +static void lv_dropdown_list_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_list(lv_event_t * e); + +static void draw_box(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state); +static void draw_box_label(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state); +static lv_result_t btn_release_handler(lv_obj_t * obj); +static lv_result_t list_release_handler(lv_obj_t * list_obj); +static void list_press_handler(lv_obj_t * page); +static uint32_t get_id_on_point(lv_obj_t * dropdown_obj, int32_t y); +static void position_to_selected(lv_obj_t * dropdown_obj, lv_anim_enable_t anim_en); +static lv_obj_t * get_label(const lv_obj_t * obj); + +#if LV_USE_OBSERVER + static void dropdown_value_changed_event_cb(lv_event_t * e); + static void dropdown_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif /*LV_USE_OBSERVER*/ + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_dropdown_properties[] = { + { + .id = LV_PROPERTY_DROPDOWN_TEXT, + .setter = lv_dropdown_set_text, + .getter = lv_dropdown_get_text, + }, + { + .id = LV_PROPERTY_DROPDOWN_OPTIONS, + .setter = lv_dropdown_set_options, + .getter = lv_dropdown_get_options, + }, + { + .id = LV_PROPERTY_DROPDOWN_OPTION_COUNT, + .setter = NULL, + .getter = lv_dropdown_get_option_count, + }, + { + .id = LV_PROPERTY_DROPDOWN_SELECTED, + .setter = lv_dropdown_set_selected, + .getter = lv_dropdown_get_selected, + }, + { + .id = LV_PROPERTY_DROPDOWN_DIR, + .setter = lv_dropdown_set_dir, + .getter = lv_dropdown_get_dir, + }, + { + .id = LV_PROPERTY_DROPDOWN_SYMBOL, + .setter = lv_dropdown_set_symbol, + .getter = lv_dropdown_get_symbol, + }, + { + .id = LV_PROPERTY_DROPDOWN_SELECTED_HIGHLIGHT, + .setter = lv_dropdown_set_selected_highlight, + .getter = lv_dropdown_get_selected_highlight, + }, + { + .id = LV_PROPERTY_DROPDOWN_LIST, + .setter = NULL, + .getter = lv_dropdown_get_list, + }, + { + .id = LV_PROPERTY_DROPDOWN_IS_OPEN, + .setter = NULL, + .getter = lv_dropdown_is_open, + }, +}; +#endif + +const lv_obj_class_t lv_dropdown_class = { + .constructor_cb = lv_dropdown_constructor, + .destructor_cb = lv_dropdown_destructor, + .event_cb = lv_dropdown_event, + .width_def = LV_DPI_DEF, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_dropdown_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .base_class = &lv_obj_class, + .name = "lv_dropdown", + LV_PROPERTY_CLASS_FIELDS(dropdown, DROPDOWN) +}; + +const lv_obj_class_t lv_dropdownlist_class = { + .constructor_cb = lv_dropdownlist_constructor, + .destructor_cb = lv_dropdownlist_destructor, + .event_cb = lv_dropdown_list_event, + .instance_size = sizeof(lv_dropdown_list_t), + .base_class = &lv_obj_class, + .name = "lv_dropdown-list", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_dropdown_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdown_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_dropdown_set_text(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + char * copied_text = NULL; + if(text) { + copied_text = lv_strdup(text); + LV_ASSERT_MALLOC(copied_text); + } + + if(!dropdown->static_text) lv_free(dropdown->text); + dropdown->static_text = 0; + dropdown->text = copied_text; + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_text_static(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + if(!dropdown->static_text) lv_free(dropdown->text); + dropdown->static_text = 1; + dropdown->text = (char *)text; + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_options(lv_obj_t * obj, const char * options) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(options); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Count the '\n'-s to determine the number of options*/ + dropdown->option_cnt = 0; + uint32_t i; + for(i = 0; options[i] != '\0'; i++) { + if(options[i] == '\n') dropdown->option_cnt++; + } + dropdown->option_cnt++; /*Last option has no `\n`*/ + dropdown->sel_opt_id = 0; + dropdown->sel_opt_id_orig = 0; + + /*Allocate space for the new text*/ +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + size_t len = lv_strlen(options) + 1; +#else + size_t len = lv_text_ap_calc_bytes_count(options) + 1; +#endif + + if(dropdown->options != NULL && dropdown->static_options == 0) { + lv_free(dropdown->options); + dropdown->options = NULL; + } + + dropdown->options = lv_malloc(len); + + LV_ASSERT_MALLOC(dropdown->options); + if(dropdown->options == NULL) return; + +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + lv_strcpy(dropdown->options, options); +#else + lv_text_ap_proc(options, dropdown->options); +#endif + + /*Now the text is dynamically allocated*/ + dropdown->static_options = 0; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(options); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Count the '\n'-s to determine the number of options*/ + dropdown->option_cnt = 0; + uint32_t i; + for(i = 0; options[i] != '\0'; i++) { + if(options[i] == '\n') dropdown->option_cnt++; + } + dropdown->option_cnt++; /*Last option has no `\n`*/ + dropdown->sel_opt_id = 0; + dropdown->sel_opt_id_orig = 0; + + if(dropdown->static_options == 0 && dropdown->options != NULL) { + lv_free(dropdown->options); + dropdown->options = NULL; + } + + dropdown->static_options = 1; + dropdown->options = (char *)options; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(option); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Convert static options to dynamic*/ + if(dropdown->static_options != 0) { + char * static_options = dropdown->options; + if(dropdown->options) { + dropdown->options = lv_strdup(static_options); + } + else { + dropdown->options = lv_calloc(1, 1); /*Allocate at least 1 byte for the NULL terminator*/ + } + LV_ASSERT_MALLOC(dropdown->options); + if(dropdown->options == NULL) return; + dropdown->static_options = 0; + } + + /*Allocate space for the new option*/ + size_t old_len = lv_strlen(dropdown->options); +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + size_t ins_len = lv_strlen(option) + 1; +#else + size_t ins_len = lv_text_ap_calc_bytes_count(option) + 1; +#endif + + size_t new_len = ins_len + old_len + 2; /*+2 for terminating NULL and possible \n*/ + dropdown->options = lv_realloc(dropdown->options, new_len + 1); + LV_ASSERT_MALLOC(dropdown->options); + if(dropdown->options == NULL) return; + + dropdown->options[old_len] = '\0'; + + /*Find the insert character position*/ + uint32_t insert_pos = old_len; + if(pos != LV_DROPDOWN_POS_LAST) { + uint32_t opcnt = 0; + for(insert_pos = 0; dropdown->options[insert_pos] != 0; insert_pos++) { + if(opcnt == pos) + break; + if(dropdown->options[insert_pos] == '\n') + opcnt++; + } + } + + /*Add delimiter to existing options*/ + if((insert_pos > 0) && (pos >= dropdown->option_cnt)) + lv_text_ins(dropdown->options, lv_text_encoded_get_char_id(dropdown->options, insert_pos++), "\n"); + + /*Insert the new option, adding \n if necessary*/ + char * ins_buf = lv_malloc(ins_len + 2); /*+ 2 for terminating NULL and possible \n*/ + LV_ASSERT_MALLOC(ins_buf); + if(ins_buf == NULL) return; +#if LV_USE_ARABIC_PERSIAN_CHARS == 0 + lv_strcpy(ins_buf, option); +#else + lv_text_ap_proc(option, ins_buf); +#endif + if(pos < dropdown->option_cnt) lv_strcat(ins_buf, "\n"); + + lv_text_ins(dropdown->options, lv_text_encoded_get_char_id(dropdown->options, insert_pos), ins_buf); + lv_free(ins_buf); + + dropdown->option_cnt++; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_clear_options(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->options == NULL) return; + + if(dropdown->static_options == 0) + lv_free(dropdown->options); + + dropdown->options = NULL; + dropdown->static_options = 1; + dropdown->option_cnt = 0; + + lv_obj_invalidate(obj); + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +void lv_dropdown_set_selected(lv_obj_t * obj, uint32_t sel_opt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->sel_opt_id == sel_opt) return; + + dropdown->sel_opt_id = sel_opt < dropdown->option_cnt ? sel_opt : dropdown->option_cnt - 1; + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + + if(dropdown->list) { + position_to_selected(obj, LV_ANIM_OFF); + } + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_dir(lv_obj_t * obj, lv_dir_t dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->dir == dir) return; + + dropdown->dir = dir; + + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_symbol(lv_obj_t * obj, const void * symbol) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + dropdown->symbol = symbol; + lv_obj_invalidate(obj); +} + +void lv_dropdown_set_selected_highlight(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + dropdown->selected_highlight = en; + if(dropdown->list) lv_obj_invalidate(dropdown->list); +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_dropdown_get_list(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->list; +} + +const char * lv_dropdown_get_text(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->text; +} + +const char * lv_dropdown_get_options(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->options == NULL ? "" : dropdown->options; +} + +uint32_t lv_dropdown_get_selected(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->sel_opt_id; +} + +uint32_t lv_dropdown_get_option_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return dropdown->option_cnt; +} + +void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + uint32_t i; + uint32_t line = 0; + size_t txt_len; + + if(dropdown->options) { + txt_len = lv_strlen(dropdown->options); + } + else { + buf[0] = '\0'; + return; + } + + for(i = 0; i < txt_len && line != dropdown->sel_opt_id_orig; i++) { + if(dropdown->options[i] == '\n') line++; + } + + uint32_t c; + for(c = 0; i < txt_len && dropdown->options[i] != '\n'; c++, i++) { + if(buf_size && c >= buf_size - 1) { + LV_LOG_WARN("the buffer was too small"); + break; + } + buf[c] = dropdown->options[i]; + } + + buf[c] = '\0'; +} + +int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option) +{ + const char * opts = lv_dropdown_get_options(obj); + uint32_t char_i = 0; + uint32_t opt_i = 0; + const char * start = opts; + const size_t option_len = lv_strlen(option); /*avoid recomputing this multiple times in the loop*/ + + while(start[0] != '\0') { + for(char_i = 0; (start[char_i] != '\n') && (start[char_i] != '\0'); char_i++); + + if(option_len == char_i && lv_memcmp(start, option, LV_MIN(option_len, char_i)) == 0) { + return opt_i; + } + + start = &start[char_i]; + if(start[0] == '\n') start++; + char_i = 0; + opt_i++; + } + + return -1; +} + +const char * lv_dropdown_get_symbol(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->symbol; +} + +bool lv_dropdown_get_selected_highlight(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->selected_highlight; +} + +lv_dir_t lv_dropdown_get_dir(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + return dropdown->dir; +} + +/*===================== + * Other functions + *====================*/ + +void lv_dropdown_open(lv_obj_t * dropdown_obj) +{ + LV_ASSERT_OBJ(dropdown_obj, MY_CLASS); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_obj_add_state(dropdown_obj, LV_STATE_CHECKED); + lv_obj_set_parent(dropdown->list, lv_obj_get_screen(dropdown_obj)); + lv_obj_move_to_index(dropdown->list, -1); + lv_obj_remove_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN); + + /*To allow styling the list*/ + lv_obj_send_event(dropdown_obj, LV_EVENT_READY, NULL); + + lv_obj_t * label = get_label(dropdown_obj); + lv_label_set_text_static(label, dropdown->options); + lv_obj_set_width(dropdown->list, LV_SIZE_CONTENT); + + lv_obj_update_layout(label); + /*Set smaller width to the width of the button*/ + if(lv_obj_get_width(dropdown->list) <= lv_obj_get_width(dropdown_obj) && + (dropdown->dir == LV_DIR_TOP || dropdown->dir == LV_DIR_BOTTOM)) { + lv_obj_set_width(dropdown->list, lv_obj_get_width(dropdown_obj)); + } + + int32_t label_h = lv_obj_get_height(label); + int32_t border_width = lv_obj_get_style_border_width(dropdown->list, LV_PART_MAIN); + int32_t top = lv_obj_get_style_pad_top(dropdown->list, LV_PART_MAIN) + border_width; + int32_t bottom = lv_obj_get_style_pad_bottom(dropdown->list, LV_PART_MAIN) + border_width; + + int32_t list_fit_h = label_h + top + bottom; + int32_t list_h = list_fit_h; + + lv_dir_t dir = dropdown->dir; + /*No space on the bottom? See if top is better.*/ + if(dropdown->dir == LV_DIR_BOTTOM) { + if(dropdown_obj->coords.y2 + list_h > LV_VER_RES) { + if(dropdown_obj->coords.y1 > LV_VER_RES - dropdown_obj->coords.y2) { + /*There is more space on the top, so make it drop up*/ + dir = LV_DIR_TOP; + list_h = dropdown_obj->coords.y1 - 1; + } + else { + list_h = LV_VER_RES - dropdown_obj->coords.y2 - 1 ; + } + } + } + /*No space on the top? See if bottom is better.*/ + else if(dropdown->dir == LV_DIR_TOP) { + if(dropdown_obj->coords.y1 - list_h < 0) { + if(dropdown_obj->coords.y1 < LV_VER_RES - dropdown_obj->coords.y2) { + /*There is more space on the top, so make it drop up*/ + dir = LV_DIR_BOTTOM; + list_h = LV_VER_RES - dropdown_obj->coords.y2; + } + else { + list_h = dropdown_obj->coords.y1; + } + } + } + + if(list_h > list_fit_h) list_h = list_fit_h; + lv_obj_set_height(dropdown->list, list_h); + + position_to_selected(dropdown_obj, LV_ANIM_OFF); + + if(dir == LV_DIR_BOTTOM) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); + else if(dir == LV_DIR_TOP) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_TOP_LEFT, 0, 0); + else if(dir == LV_DIR_LEFT) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_LEFT_TOP, 0, 0); + else if(dir == LV_DIR_RIGHT) lv_obj_align_to(dropdown->list, dropdown_obj, LV_ALIGN_OUT_RIGHT_TOP, 0, 0); + + lv_obj_update_layout(dropdown->list); + + if(dropdown->dir == LV_DIR_LEFT || dropdown->dir == LV_DIR_RIGHT) { + int32_t y1 = lv_obj_get_y(dropdown->list); + int32_t y2 = lv_obj_get_y2(dropdown->list); + if(y2 >= LV_VER_RES) { + lv_obj_set_y(dropdown->list, y1 - (y2 - LV_VER_RES) - 1); + } + } + + lv_text_align_t align = lv_obj_calculate_style_text_align(label, LV_PART_MAIN, dropdown->options); + + switch(align) { + default: + case LV_TEXT_ALIGN_LEFT: + lv_obj_align(label, LV_ALIGN_TOP_LEFT, 0, 0); + break; + case LV_TEXT_ALIGN_RIGHT: + lv_obj_align(label, LV_ALIGN_TOP_RIGHT, 0, 0); + break; + case LV_TEXT_ALIGN_CENTER: + lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 0); + break; + + } +} + +void lv_dropdown_close(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_remove_state(obj, LV_STATE_CHECKED); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; + lv_obj_add_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN); + + lv_obj_send_event(obj, LV_EVENT_CANCEL, NULL); +} + +bool lv_dropdown_is_open(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + return lv_obj_has_flag(dropdown->list, LV_OBJ_FLAG_HIDDEN) ? false : true; +} + +#if LV_USE_OBSERVER + +lv_observer_t * lv_dropdown_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_obj_add_event_cb(obj, dropdown_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, dropdown_value_observer_cb, obj, NULL); + return observer; +} +#endif /*LV_USE_OBSERVER*/ + + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_obj_t * lv_dropdown_list_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_dropdownlist_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +static void lv_dropdown_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + /*Initialize the allocated 'ext'*/ + dropdown->list = NULL; + dropdown->options = NULL; + dropdown->symbol = LV_SYMBOL_DOWN; + dropdown->text = NULL; + dropdown->static_options = 1; + dropdown->selected_highlight = 1; + dropdown->static_text = 1; + dropdown->sel_opt_id = 0; + dropdown->sel_opt_id_orig = 0; + dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; + dropdown->option_cnt = 0; + dropdown->dir = LV_DIR_BOTTOM; + + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); +#if LV_WIDGETS_HAS_DEFAULT_VALUE + lv_dropdown_set_options_static(obj, "Option 1\nOption 2\nOption 3"); +#endif + + dropdown->list = lv_dropdown_list_create(lv_obj_get_screen(obj)); + lv_dropdown_list_t * list = (lv_dropdown_list_t *)dropdown->list; + list->dropdown = obj; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_dropdown_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + if(dropdown->list) { + lv_obj_delete(dropdown->list); + dropdown->list = NULL; + } + + if(!dropdown->static_options) lv_free(dropdown->options); + dropdown->options = NULL; + + if(!dropdown->static_text) lv_free(dropdown->text); + dropdown->text = NULL; +} + +static void lv_dropdownlist_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICK_FOCUSABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_IGNORE_LAYOUT); + lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + + lv_label_create(obj); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_dropdownlist_destructor(const lv_obj_class_t * class_p, lv_obj_t * list_obj) +{ + LV_UNUSED(class_p); + lv_dropdown_list_t * list = (lv_dropdown_list_t *)list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + dropdown->list = NULL; +} + +static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + + if(code == LV_EVENT_FOCUSED) { + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + + /*Encoders need special handling*/ + if(indev_type == LV_INDEV_TYPE_ENCODER) { + /*Open the list if editing*/ + if(editing) { + lv_dropdown_open(obj); + } + /*Close the list if navigating*/ + else { + dropdown->sel_opt_id = dropdown->sel_opt_id_orig; + lv_dropdown_close(obj); + } + } + } + else if(code == LV_EVENT_DEFOCUSED || code == LV_EVENT_LEAVE) { + lv_dropdown_close(obj); + } + else if(code == LV_EVENT_RELEASED) { + res = btn_release_handler(obj); + if(res != LV_RESULT_OK) return; + } + else if(code == LV_EVENT_STYLE_CHANGED) { + lv_obj_refresh_self_size(obj); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_obj_refresh_self_size(obj); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + p->y = lv_font_get_line_height(font); + } + else if(code == LV_EVENT_KEY) { + uint32_t c = lv_event_get_key(e); + if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { + if(!lv_dropdown_is_open(obj)) { + lv_dropdown_open(obj); + } + else if(dropdown->sel_opt_id + 1 < dropdown->option_cnt) { + dropdown->sel_opt_id++; + position_to_selected(obj, LV_ANIM_ON); + } + } + else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { + + if(!lv_dropdown_is_open(obj)) { + lv_dropdown_open(obj); + } + else if(dropdown->sel_opt_id > 0) { + dropdown->sel_opt_id--; + position_to_selected(obj, LV_ANIM_ON); + } + } + else if(c == LV_KEY_ESC) { + dropdown->sel_opt_id = dropdown->sel_opt_id_orig; + lv_dropdown_close(obj); + } + else if(c == LV_KEY_ENTER) { + /* Handle the ENTER key only if it was send by another object. + * Do no process it if ENTER is sent by the dropdown because it's handled in LV_EVENT_RELEASED */ + lv_obj_t * indev_obj = lv_indev_get_active_obj(); + if(indev_obj != obj) { + res = btn_release_handler(obj); + if(res != LV_RESULT_OK) return; + } + } + } + else if(code == LV_EVENT_ROTARY) { + if(!lv_dropdown_is_open(obj)) { + lv_dropdown_open(obj); + } + else { + int32_t r = lv_event_get_rotary_diff(e); + int32_t new_id = dropdown->sel_opt_id + r; + new_id = LV_CLAMP(0, new_id, (int32_t)dropdown->option_cnt - 1); + + dropdown->sel_opt_id = new_id; + position_to_selected(obj, LV_ANIM_ON); + } + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + +static void lv_dropdown_list_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + lv_event_code_t code = lv_event_get_code(e); + if(code != LV_EVENT_DRAW_POST) { + res = lv_obj_event_base(MY_CLASS_LIST, e); + if(res != LV_RESULT_OK) return; + } + lv_obj_t * list = lv_event_get_current_target(e); + lv_obj_t * dropdown_obj = ((lv_dropdown_list_t *)list)->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + if(code == LV_EVENT_RELEASED) { + if(lv_indev_get_scroll_obj(lv_indev_active()) == NULL) { + list_release_handler(list); + } + } + else if(code == LV_EVENT_PRESSED) { + list_press_handler(list); + } + else if(code == LV_EVENT_SCROLL_BEGIN) { + dropdown->pr_opt_id = LV_DROPDOWN_PR_NONE; + lv_obj_invalidate(list); + } + else if(code == LV_EVENT_DRAW_POST) { + draw_list(e); + res = lv_obj_event_base(MY_CLASS_LIST, e); + if(res != LV_RESULT_OK) return; + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + int32_t right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; + + lv_text_attributes_t attributes = {0}; + lv_draw_label_dsc_t symbol_dsc; + lv_draw_label_dsc_init(&symbol_dsc); + symbol_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &symbol_dsc); + + /*If no text specified use the selected option*/ + const char * opt_txt; + char buf[128]; + if(dropdown->text) opt_txt = dropdown->text; + else { + lv_dropdown_get_selected_str(obj, buf, 128); + opt_txt = buf; + } + + bool symbol_to_left = false; + if(dropdown->dir == LV_DIR_LEFT) symbol_to_left = true; + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) symbol_to_left = true; + + int32_t symbol_w = -1; + if(dropdown->symbol) { + lv_image_src_t symbol_type = lv_image_src_get_type(dropdown->symbol); + int32_t symbol_h; + if(symbol_type == LV_IMAGE_SRC_SYMBOL) { + lv_point_t size; + + attributes.letter_space = symbol_dsc.letter_space; + attributes.line_space = symbol_dsc.line_space; + attributes.max_width = LV_COORD_MAX; + attributes.text_flags = symbol_dsc.flag; + + lv_text_get_size_attributes(&size, dropdown->symbol, symbol_dsc.font, &attributes); + symbol_w = size.x; + symbol_h = size.y; + } + else { + lv_image_header_t header; + lv_result_t res = lv_image_decoder_get_info(dropdown->symbol, &header); + if(res == LV_RESULT_OK) { + symbol_w = header.w; + symbol_h = header.h; + } + else { + symbol_w = -1; + symbol_h = -1; + } + } + + lv_area_t symbol_area; + symbol_area.y1 = obj->coords.y1; + symbol_area.y2 = symbol_area.y1 + symbol_h - 1; + symbol_area.x1 = obj->coords.x1; + symbol_area.x2 = symbol_area.x1 + symbol_w - 1; + if(symbol_to_left) { + lv_area_align(&obj->coords, &symbol_area, LV_ALIGN_LEFT_MID, left, 0); + } + else { + lv_area_align(&obj->coords, &symbol_area, LV_ALIGN_RIGHT_MID, -right, 0); + } + + if(symbol_type == LV_IMAGE_SRC_SYMBOL) { + symbol_dsc.text = dropdown->symbol; + lv_draw_label(layer, &symbol_dsc, &symbol_area); + } + else { + lv_draw_image_dsc_t img_dsc; + lv_draw_image_dsc_init(&img_dsc); + img_dsc.base.layer = layer; + lv_obj_init_draw_image_dsc(obj, LV_PART_INDICATOR, &img_dsc); + lv_point_set(&img_dsc.pivot, symbol_w / 2, symbol_h / 2); + img_dsc.rotation = lv_obj_get_style_transform_rotation(obj, LV_PART_INDICATOR); + img_dsc.src = dropdown->symbol; + lv_draw_image(layer, &img_dsc, &symbol_area); + } + } + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_dsc); + label_dsc.flag |= LV_TEXT_FLAG_EXPAND; + + attributes.letter_space = label_dsc.letter_space; + attributes.max_width = LV_COORD_MAX; + attributes.line_space = label_dsc.line_space; + attributes.text_flags = label_dsc.flag; + + lv_point_t size; + lv_text_get_size_attributes(&size, opt_txt, label_dsc.font, &attributes); + + lv_area_t txt_area; + txt_area.x1 = obj->coords.x1 + left; + txt_area.x2 = obj->coords.x2 - right; + txt_area.y1 = obj->coords.y1; + txt_area.y2 = txt_area.y1 + size.y - 1; + lv_area_align(&obj->coords, &txt_area, LV_ALIGN_CENTER, 0, 0); + + /*Center align the text if no symbol*/ + if(dropdown->symbol == NULL && label_dsc.align == LV_TEXT_ALIGN_AUTO) { + label_dsc.align = LV_TEXT_ALIGN_CENTER; + } + else { + /*Add some space between the label and symbol*/ + symbol_w += lv_obj_get_style_pad_column(obj, LV_PART_MAIN); + + /*Text to the right*/ + if(symbol_to_left) { + if(label_dsc.align == LV_TEXT_ALIGN_AUTO) label_dsc.align = LV_TEXT_ALIGN_RIGHT; + txt_area.x1 += symbol_w; + lv_area_align(&obj->coords, &txt_area, LV_ALIGN_RIGHT_MID, -right, 0); + } + else { + if(label_dsc.align == LV_TEXT_ALIGN_AUTO) label_dsc.align = LV_TEXT_ALIGN_LEFT; + txt_area.x2 -= symbol_w; + lv_area_align(&obj->coords, &txt_area, LV_ALIGN_LEFT_MID, left, 0); + } + } + + label_dsc.text = opt_txt; + if(dropdown->text == NULL) { + label_dsc.text_local = true; + } + + lv_draw_label(layer, &label_dsc, &txt_area); +} + +static void draw_list(lv_event_t * e) +{ + lv_obj_t * list_obj = lv_event_get_current_target(e); + lv_dropdown_list_t * list = (lv_dropdown_list_t *)list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_layer_t * layer = lv_event_get_layer(e); + + /* Clip area might be too large too to shadow but + * the selected option can be drawn on only the background*/ + lv_area_t clip_area_core; + bool has_common; + has_common = lv_area_intersect(&clip_area_core, &layer->_clip_area, &dropdown->list->coords); + if(has_common) { + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area_core; + if(dropdown->selected_highlight) { + if(dropdown->pr_opt_id == dropdown->sel_opt_id) { + draw_box(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_CHECKED | LV_STATE_PRESSED); + draw_box_label(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_CHECKED | LV_STATE_PRESSED); + } + else { + draw_box(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); + draw_box_label(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); + draw_box(dropdown_obj, layer, dropdown->sel_opt_id, LV_STATE_CHECKED); + draw_box_label(dropdown_obj, layer, dropdown->sel_opt_id, LV_STATE_CHECKED); + } + } + else { + draw_box(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); + draw_box_label(dropdown_obj, layer, dropdown->pr_opt_id, LV_STATE_PRESSED); + } + layer->_clip_area = clip_area_ori; + } +} + +static void draw_box(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state) +{ + if(id == LV_DROPDOWN_PR_NONE) return; + + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_obj_t * list_obj = dropdown->list; + lv_state_t state_ori = list_obj->state; + + if(state != list_obj->state) { + list_obj->state = state; + list_obj->skip_trans = 1; + } + + /*Draw a rectangle under the selected item*/ + const lv_font_t * font = lv_obj_get_style_text_font(list_obj, LV_PART_SELECTED); + int32_t line_space = lv_obj_get_style_text_line_space(list_obj, LV_PART_SELECTED); + int32_t font_h = lv_font_get_line_height(font); + + /*Draw the selected*/ + lv_obj_t * label = get_label(dropdown_obj); + LV_ASSERT_NULL(label); + lv_area_t rect_area; + rect_area.y1 = label->coords.y1; + rect_area.y1 += id * (font_h + line_space); + rect_area.y1 -= line_space / 2; + + rect_area.y2 = rect_area.y1 + font_h + line_space - 1; + rect_area.x1 = dropdown->list->coords.x1; + rect_area.x2 = dropdown->list->coords.x2; + + lv_draw_rect_dsc_t sel_rect; + lv_draw_rect_dsc_init(&sel_rect); + sel_rect.base.layer = layer; + lv_obj_init_draw_rect_dsc(list_obj, LV_PART_SELECTED, &sel_rect); + lv_draw_rect(layer, &sel_rect, &rect_area); + + list_obj->state = state_ori; + list_obj->skip_trans = 0; +} + +static void draw_box_label(lv_obj_t * dropdown_obj, lv_layer_t * layer, uint32_t id, lv_state_t state) +{ + if(id == LV_DROPDOWN_PR_NONE) return; + + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_obj_t * list_obj = dropdown->list; + lv_state_t state_orig = list_obj->state; + + if(state != list_obj->state) { + list_obj->state = state; + list_obj->skip_trans = 1; + } + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(list_obj, LV_PART_SELECTED, &label_dsc); + + label_dsc.line_space = lv_obj_get_style_text_line_space(list_obj, + LV_PART_SELECTED); /*Line space should come from the list*/ + + lv_obj_t * label = get_label(dropdown_obj); + if(label == NULL) return; + + int32_t font_h = lv_font_get_line_height(label_dsc.font); + + lv_area_t area_sel; + area_sel.y1 = label->coords.y1; + area_sel.y1 += id * (font_h + label_dsc.line_space); + area_sel.y1 -= label_dsc.line_space / 2; + + area_sel.y2 = area_sel.y1 + font_h + label_dsc.line_space - 1; + area_sel.x1 = list_obj->coords.x1; + area_sel.x2 = list_obj->coords.x2; + lv_area_t mask_sel; + bool area_ok; + area_ok = lv_area_intersect(&mask_sel, &layer->_clip_area, &area_sel); + if(area_ok) { + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = mask_sel; + label_dsc.text = lv_label_get_text(label); + lv_draw_label(layer, &label_dsc, &label->coords); + layer->_clip_area = clip_area_ori; + } + list_obj->state = state_orig; + list_obj->skip_trans = 0; +} + +static lv_result_t btn_release_handler(lv_obj_t * obj) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + lv_indev_t * indev = lv_indev_active(); + if(lv_indev_get_scroll_obj(indev) == NULL) { + if(lv_dropdown_is_open(obj)) { + lv_dropdown_close(obj); + if(dropdown->sel_opt_id_orig != dropdown->sel_opt_id) { + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + lv_result_t res; + uint32_t id = dropdown->sel_opt_id; /*Just to use uint32_t in event data*/ + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &id); + if(res != LV_RESULT_OK) return res; + lv_obj_invalidate(obj); + } + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + lv_group_set_editing(lv_obj_get_group(obj), false); + } + } + else { + lv_dropdown_open(obj); + } + } + else { + dropdown->sel_opt_id = dropdown->sel_opt_id_orig; + lv_obj_invalidate(obj); + } + return LV_RESULT_OK; +} + +/** + * Called when a drop down list is released to open it or set new option + * @param list pointer to the drop down list's list + * @return LV_RESULT_INVALID if the list is not being deleted in the user callback. Else LV_RESULT_OK + */ +static lv_result_t list_release_handler(lv_obj_t * list_obj) +{ + lv_dropdown_list_t * list = (lv_dropdown_list_t *) list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_indev_t * indev = lv_indev_active(); + /*Leave edit mode once a new item is selected*/ + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + lv_group_t * g = lv_obj_get_group(dropdown_obj); + if(lv_group_get_editing(g)) { + lv_group_set_editing(g, false); + } + } + + /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { + lv_point_t p; + lv_indev_get_point(indev, &p); + dropdown->sel_opt_id = get_id_on_point(dropdown_obj, p.y); + dropdown->sel_opt_id_orig = dropdown->sel_opt_id; + } + + lv_dropdown_close(dropdown_obj); + + /*Invalidate to refresh the text*/ + if(dropdown->text == NULL) lv_obj_invalidate(dropdown_obj); + + uint32_t id = dropdown->sel_opt_id; /*Just to use uint32_t in event data*/ + lv_result_t res = lv_obj_send_event(dropdown_obj, LV_EVENT_VALUE_CHANGED, &id); + if(res != LV_RESULT_OK) return res; + + return LV_RESULT_OK; +} + +static void list_press_handler(lv_obj_t * list_obj) +{ + lv_dropdown_list_t * list = (lv_dropdown_list_t *) list_obj; + lv_obj_t * dropdown_obj = list->dropdown; + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_indev_t * indev = lv_indev_active(); + if(indev && (lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON)) { + lv_point_t p; + lv_indev_get_point(indev, &p); + dropdown->pr_opt_id = get_id_on_point(dropdown_obj, p.y); + lv_obj_invalidate(list_obj); + } +} + +static uint32_t get_id_on_point(lv_obj_t * dropdown_obj, int32_t y) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + lv_obj_t * label = get_label(dropdown_obj); + if(label == NULL) return 0; + y -= label->coords.y1; + + const lv_font_t * font = lv_obj_get_style_text_font(label, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + int32_t line_space = lv_obj_get_style_text_line_space(label, LV_PART_MAIN); + + y += line_space / 2; + int32_t h = font_h + line_space; + + uint32_t opt = y / h; + + if(opt >= dropdown->option_cnt) opt = dropdown->option_cnt - 1; + return opt; +} + +/** + * Set the position of list when it is closed to show the selected item + * @param ddlist pointer to a drop down list + */ +static void position_to_selected(lv_obj_t * dropdown_obj, lv_anim_enable_t anim_en) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)dropdown_obj; + + lv_obj_t * label = get_label(dropdown_obj); + if(label == NULL) return; + + if(lv_obj_get_height(label) <= lv_obj_get_content_height(dropdown_obj)) return; + + const lv_font_t * font = lv_obj_get_style_text_font(label, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + int32_t line_space = lv_obj_get_style_text_line_space(label, LV_PART_MAIN); + int32_t unit_h = font_h + line_space; + int32_t line_y1 = dropdown->sel_opt_id * unit_h; + + /*Scroll to the selected option*/ + lv_obj_scroll_to_y(dropdown->list, line_y1, anim_en); + lv_obj_invalidate(dropdown->list); +} + +static lv_obj_t * get_label(const lv_obj_t * obj) +{ + lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; + if(dropdown->list == NULL) return NULL; + + return lv_obj_get_child(dropdown->list, 0); +} + +#if LV_USE_OBSERVER + +static void dropdown_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * dropdown = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + lv_subject_set_int(subject, lv_dropdown_get_selected(dropdown)); +} + +static void dropdown_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_dropdown_set_selected(observer->target, subject->value.num); +} + +#endif /*LV_USE_OBSERVER*/ + + +#endif diff --git a/inc/lvgl/src/widgets/dropdown/lv_dropdown.h b/inc/lvgl/src/widgets/dropdown/lv_dropdown.h new file mode 100644 index 0000000..4803884 --- /dev/null +++ b/inc/lvgl/src/widgets/dropdown/lv_dropdown.h @@ -0,0 +1,266 @@ +/** + * @file lv_dropdown.h + * + */ + +#ifndef LV_DROPDOWN_H +#define LV_DROPDOWN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_DROPDOWN != 0 + +/*Testing of dependencies*/ + +#if LV_USE_LABEL == 0 +#error "lv_dropdown: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +#include "../label/lv_label.h" + +/********************* + * DEFINES + *********************/ +#define LV_DROPDOWN_POS_LAST 0xFFFF +LV_EXPORT_CONST_INT(LV_DROPDOWN_POS_LAST); + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_dropdown_id_t { + LV_PROPERTY_ID(DROPDOWN, TEXT, LV_PROPERTY_TYPE_TEXT, 0), + LV_PROPERTY_ID(DROPDOWN, OPTIONS, LV_PROPERTY_TYPE_TEXT, 1), + LV_PROPERTY_ID(DROPDOWN, OPTION_COUNT, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(DROPDOWN, SELECTED, LV_PROPERTY_TYPE_INT, 3), + // LV_PROPERTY_ID(DROPDOWN, SELECTED_STR, LV_PROPERTY_TYPE_TEXT, 4), + LV_PROPERTY_ID(DROPDOWN, DIR, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(DROPDOWN, SYMBOL, LV_PROPERTY_TYPE_IMGSRC, 6), + LV_PROPERTY_ID(DROPDOWN, SELECTED_HIGHLIGHT, LV_PROPERTY_TYPE_INT, 7), + LV_PROPERTY_ID(DROPDOWN, LIST, LV_PROPERTY_TYPE_OBJ, 8), + LV_PROPERTY_ID(DROPDOWN, IS_OPEN, LV_PROPERTY_TYPE_BOOL, 9), + LV_PROPERTY_DROPDOWN_END, +}; +#endif + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdown_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_dropdownlist_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a drop-down list object + * @param parent pointer to an object, it will be the parent of the new drop-down list + * @return pointer to the created drop-down list + */ +lv_obj_t * lv_dropdown_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set text of the drop-down list's button. + * If set to `NULL` the selected option's text will be displayed on the button. + * If set to a specific text then that text will be shown regardless of the selected option. + * @param obj pointer to a drop-down list object + * @param text the text as a string (Copy is saved) + */ +void lv_dropdown_set_text(lv_obj_t * obj, const char * text); + +/** + * Set text of the drop-down list's button. + * If set to `NULL` the selected option's text will be displayed on the button. + * If set to a specific text then that text will be shown regardless of the selected option. + * @param obj pointer to a drop-down list object + * @param text the text as a string (Only its pointer is saved) + */ +void lv_dropdown_set_text_static(lv_obj_t * obj, const char * text); + +/** + * Set the options in a drop-down list from a string. + * The options will be copied and saved in the object so the `options` can be destroyed after calling this function + * @param obj pointer to drop-down list object + * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" + */ +void lv_dropdown_set_options(lv_obj_t * obj, const char * options); + +/** + * Set the options in a drop-down list from a static string (global, static or dynamically allocated). + * Only the pointer of the option string will be saved. + * @param obj pointer to drop-down list object + * @param options a static string with '\n' separated options. E.g. "One\nTwo\nThree" + */ +void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options); + +/** + * Add an options to a drop-down list from a string. Only works for non-static options. + * @param obj pointer to drop-down list object + * @param option a string without '\n'. E.g. "Four" + * @param pos the insert position, indexed from 0, LV_DROPDOWN_POS_LAST = end of string + */ +void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos); + +/** + * Clear all options in a drop-down list. Works with both static and dynamic options. + * @param obj pointer to drop-down list object + */ +void lv_dropdown_clear_options(lv_obj_t * obj); + +/** + * Set the selected option + * @param obj pointer to drop-down list object + * @param sel_opt id of the selected option (0 ... number of option - 1); + */ +void lv_dropdown_set_selected(lv_obj_t * obj, uint32_t sel_opt); + +/** + * Set the direction of the a drop-down list + * @param obj pointer to a drop-down list object + * @param dir LV_DIR_LEFT/RIGHT/TOP/BOTTOM + */ +void lv_dropdown_set_dir(lv_obj_t * obj, lv_dir_t dir); + +/** + * Set an arrow or other symbol to display when on drop-down list's button. Typically a down caret or arrow. + * @param obj pointer to drop-down list object + * @param symbol a text like `LV_SYMBOL_DOWN`, an image (pointer or path) or NULL to not draw symbol icon + * @note angle and zoom transformation can be applied if the symbol is an image. + * E.g. when drop down is checked (opened) rotate the symbol by 180 degree + */ +void lv_dropdown_set_symbol(lv_obj_t * obj, const void * symbol); + +/** + * Set whether the selected option in the list should be highlighted or not + * @param obj pointer to drop-down list object + * @param en true: highlight enabled; false: disabled + */ +void lv_dropdown_set_selected_highlight(lv_obj_t * obj, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the list of a drop-down to allow styling or other modifications + * @param obj pointer to a drop-down list object + * @return pointer to the list of the drop-down + */ +lv_obj_t * lv_dropdown_get_list(lv_obj_t * obj); + +/** + * Get text of the drop-down list's button. + * @param obj pointer to a drop-down list object + * @return the text as string, `NULL` if no text + */ +const char * lv_dropdown_get_text(lv_obj_t * obj); + +/** + * Get the options of a drop-down list + * @param obj pointer to drop-down list object + * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") + */ +const char * lv_dropdown_get_options(const lv_obj_t * obj); + +/** + * Get the index of the selected option + * @param obj pointer to drop-down list object + * @return index of the selected option (0 ... number of option - 1); + */ +uint32_t lv_dropdown_get_selected(const lv_obj_t * obj); + +/** + * Get the total number of options + * @param obj pointer to drop-down list object + * @return the total number of options in the list + */ +uint32_t lv_dropdown_get_option_count(const lv_obj_t * obj); + +/** + * Get the current selected option as a string + * @param obj pointer to drop-down object + * @param buf pointer to an array to store the string + * @param buf_size size of `buf` in bytes. 0: to ignore it. + */ +void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size); + +/** + * Get the index of an option. + * @param obj pointer to drop-down object + * @param option an option as string + * @return index of `option` in the list of all options. -1 if not found. + */ +int32_t lv_dropdown_get_option_index(lv_obj_t * obj, const char * option); + +/** + * Get the symbol on the drop-down list. Typically a down caret or arrow. + * @param obj pointer to drop-down list object + * @return the symbol or NULL if not enabled + */ +const char * lv_dropdown_get_symbol(lv_obj_t * obj); + +/** + * Get whether the selected option in the list should be highlighted or not + * @param obj pointer to drop-down list object + * @return true: highlight enabled; false: disabled + */ +bool lv_dropdown_get_selected_highlight(lv_obj_t * obj); + +/** + * Get the direction of the drop-down list + * @param obj pointer to a drop-down list object + * @return LV_DIR_LEF/RIGHT/TOP/BOTTOM + */ +lv_dir_t lv_dropdown_get_dir(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Open the drop.down list + * @param dropdown_obj pointer to drop-down list object + */ +void lv_dropdown_open(lv_obj_t * dropdown_obj); + +/** + * Close (Collapse) the drop-down list + * @param obj pointer to drop-down list object + */ +void lv_dropdown_close(lv_obj_t * obj); + +/** + * Tells whether the list is opened or not + * @param obj pointer to a drop-down list object + * @return true if the list os opened + */ +bool lv_dropdown_is_open(lv_obj_t * obj); + + +#if LV_USE_OBSERVER +/** + * Bind an integer Subject to a Dropdown's value. + * @param obj pointer to Dropdown + * @param subject pointer to Subject + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_dropdown_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DROPDOWN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DROPDOWN_H*/ diff --git a/inc/lvgl/src/widgets/dropdown/lv_dropdown_private.h b/inc/lvgl/src/widgets/dropdown/lv_dropdown_private.h new file mode 100644 index 0000000..b50883f --- /dev/null +++ b/inc/lvgl/src/widgets/dropdown/lv_dropdown_private.h @@ -0,0 +1,70 @@ +/** + * @file lv_dropdown_private.h + * + */ + +#ifndef LV_DROPDOWN_PRIVATE_H +#define LV_DROPDOWN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_dropdown.h" + +#if LV_USE_DROPDOWN != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_dropdown_t { + lv_obj_t obj; + lv_obj_t * list; /**< The dropped down list*/ + char * text; /**< Text to display on the dropdown's button*/ + const void * symbol; /**< Arrow or other icon when the drop-down list is closed*/ + char * options; /**< Options in a '\n' separated list*/ + uint32_t option_cnt; /**< Number of options*/ + uint32_t sel_opt_id; /**< Index of the currently selected option*/ + uint32_t sel_opt_id_orig; /**< Store the original index on focus*/ + uint32_t pr_opt_id; /**< Index of the currently pressed option*/ + uint8_t dir : 4; /**< Direction in which the list should open*/ + uint8_t static_options : 1; /**< 1: Only a pointer is saved in `options`*/ + uint8_t selected_highlight: 1; /**< 1: Make the selected option highlighted in the list*/ + uint8_t static_text : 1; /**< 1: Only a pointer is saved in `text`*/ +}; + +struct _lv_dropdown_list_t { + lv_obj_t obj; + lv_obj_t * dropdown; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_DROPDOWN != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DROPDOWN_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/gif/lv_gif.c b/inc/lvgl/src/widgets/gif/lv_gif.c new file mode 100644 index 0000000..be6ec18 --- /dev/null +++ b/inc/lvgl/src/widgets/gif/lv_gif.c @@ -0,0 +1,723 @@ +/** + * @file lv_gif.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gif.h" + +#if LV_USE_GIF +#include "../../misc/lv_timer_private.h" +#include "../../misc/cache/lv_cache.h" +#include "../../core/lv_obj_class_private.h" +#include "../../widgets/image/lv_image_private.h" +#include "../../libs/gif/AnimatedGIF.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_gif_class) + +/********************** + * TYPEDEFS + **********************/ + +/* the type of the AnimatedGIF pallete type passed to `GIF_begin` */ +typedef unsigned char animatedgif_color_format_t; + +typedef struct { + lv_image_t img; + GIFIMAGE gif; + const void * src; + lv_color_format_t color_format; + lv_timer_t * timer; + lv_draw_buf_t * draw_buf; + int32_t loop_count; + uint32_t is_open : 1; + uint32_t is_auto_pause : 1; + uint32_t cur_frame_index; +} lv_gif_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void gif_draw_raw_cb(GIFDRAW * pDraw); +static void gif_previous_close(lv_gif_t * gifobj); +static void gif_initialize(lv_gif_t * gifobj); +static void gif_disposal_last_frame(GIFIMAGE * gif, lv_draw_buf_t * draw_buf); +static void gif_next_frame_task_cb(lv_timer_t * t); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_gif_class = { + .constructor_cb = lv_gif_constructor, + .destructor_cb = lv_gif_destructor, + .instance_size = sizeof(lv_gif_t), + .base_class = &lv_image_class, + .name = "lv_gif", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_gif_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_gif_set_color_format(lv_obj_t * obj, lv_color_format_t color_format) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(gifobj->color_format == color_format) { + return; + } + + switch(color_format) { + case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB565_SWAPPED: + case LV_COLOR_FORMAT_RGB888: + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB8888: + break; + default: + LV_LOG_WARN("gif widget does not support this color format"); + return; + } + + gifobj->color_format = color_format; + + if(gifobj->src != NULL && gifobj->is_open) { + gif_previous_close(gifobj); + gif_initialize(gifobj); + } +} + +void lv_gif_set_src(lv_obj_t * obj, const void * src) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(gifobj->is_open) { + gif_previous_close(gifobj); + } + + gifobj->src = src; + + gif_initialize(gifobj); +} + +void lv_gif_restart(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(!gifobj->is_open) { + LV_LOG_WARN("Gif resource not loaded correctly"); + return; + } + + GIF_reset(&gifobj->gif); + gifobj->loop_count = -1; /* match the behavior of the old library */ + lv_timer_resume(gifobj->timer); + lv_timer_reset(gifobj->timer); + + gifobj->cur_frame_index = 0; +} + +void lv_gif_pause(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + lv_timer_pause(gifobj->timer); +} + +void lv_gif_resume(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(!gifobj->is_open) { + LV_LOG_WARN("Gif resource not loaded correctly"); + return; + } + + lv_timer_resume(gifobj->timer); +} + +bool lv_gif_is_loaded(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + return gifobj->is_open; +} + +int32_t lv_gif_get_loop_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(!gifobj->is_open) { + return -1; + } + + return gifobj->loop_count; +} + +void lv_gif_set_loop_count(lv_obj_t * obj, int32_t count) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(!gifobj->is_open) { + LV_LOG_WARN("Gif resource not loaded correctly"); + return; + } + + gifobj->loop_count = count; +} + +void lv_gif_set_auto_pause_invisible(lv_obj_t * obj, bool auto_pause) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + gifobj->is_auto_pause = auto_pause; +} + +bool lv_gif_get_size(const char * src, uint16_t * w, uint16_t * h) +{ + LV_ASSERT_NULL(src); + LV_ASSERT_NULL(w); + LV_ASSERT_NULL(h); + + LV_PROFILER_DECODER_BEGIN; + GIFIMAGE gif; + if(!GIF_openFile(&gif, src, NULL)) { + *w = 0; + *h = 0; + LV_PROFILER_DECODER_END; + return false; + } + + *w = GIF_getCanvasWidth(&gif); + *h = GIF_getCanvasHeight(&gif); + GIF_close(&gif); + + LV_PROFILER_DECODER_END; + return true; +} + +int32_t lv_gif_get_frame_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(!gifobj->is_open) { + return -1; + } + + LV_PROFILER_DECODER_BEGIN; + + GIFINFO info; + if(!GIF_getInfo(&gifobj->gif, &info)) { + LV_LOG_WARN("Get the frame count failed"); + LV_PROFILER_DECODER_END; + return -1; + } + + LV_PROFILER_DECODER_END; + return info.iFrameCount; +} + +int32_t lv_gif_get_current_frame_index(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(!gifobj->is_open) { + return -1; + } + + return (int32_t)gifobj->cur_frame_index; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_gif_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_gif_t * gifobj = (lv_gif_t *) obj; + + gifobj->color_format = LV_COLOR_FORMAT_ARGB8888; + gifobj->is_open = 0; + gifobj->is_auto_pause = 0; + gifobj->cur_frame_index = 0; + gifobj->timer = lv_timer_create(gif_next_frame_task_cb, 10, obj); + lv_timer_pause(gifobj->timer); +} + +static void lv_gif_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_gif_t * gifobj = (lv_gif_t *) obj; + + const void * src = lv_image_get_src(obj); + if(src != NULL) { + lv_image_cache_drop(src); + } + + if(gifobj->is_open) { + GIF_close(&gifobj->gif); + lv_draw_buf_destroy(gifobj->draw_buf); + gifobj->draw_buf = NULL; + gifobj->is_open = 0; + } + + lv_timer_delete(gifobj->timer); + gifobj->timer = NULL; +} + +static inline void gif_blend_to_rgb565(GIFDRAW * pDraw, lv_draw_buf_t * draw_buf) +{ + LV_PROFILER_DECODER_BEGIN; + + uint8_t pixel; + uint8_t * src = pDraw->pPixels; + uint8_t * end = src + pDraw->iWidth; + uint16_t * pal = pDraw->pPalette; + uint16_t * dst = (uint16_t *)((uint8_t *)draw_buf->data + ((pDraw->iY + pDraw->y) * draw_buf->header.stride + pDraw->iX + * 2)); + + if(pDraw->ucHasTransparency) { + if(pDraw->ucDisposalMethod == 2) { + /* Disposal 2: Replace transparent pixels with background color */ + while(src < end) { + pixel = *src++; + if(pixel == pDraw->ucTransparent) { + pixel = pDraw->ucBackground; + } + *dst++ = pal[pixel]; + } + } + else { + /* Disposal 0,1,3: Replace transparent pixels with background color to maintain position + * The gif_disposal_last_frame function handles the actual background clearing + */ + uint16_t bg_color = pal[pDraw->ucBackground]; + while(src < end) { + pixel = *src++; + if(pixel == pDraw->ucTransparent) { + *dst++ = bg_color; + } + else { + *dst++ = pal[pixel]; + } + } + } + } + else { + while(src < end) { + pixel = *src++; + *dst++ = pal[pixel]; + } + } + + LV_PROFILER_DECODER_END; +} + +static inline void gif_blend_to_rgb888(GIFDRAW * pDraw, lv_draw_buf_t * draw_buf) +{ + LV_PROFILER_DECODER_BEGIN; + + uint8_t pixel; + uint8_t * src = pDraw->pPixels; + uint8_t * end = src + pDraw->iWidth; + uint8_t * pal = pDraw->pPalette24; + uint8_t * dst = (uint8_t *)draw_buf->data + ((pDraw->iY + pDraw->y) * draw_buf->header.stride + pDraw->iX * 3); + + if(pDraw->ucHasTransparency) { + if(pDraw->ucDisposalMethod == 2) { + /* Disposal 2: Replace transparent pixels with background color */ + while(src < end) { + pixel = *src++; + if(pixel == pDraw->ucTransparent) { + pixel = pDraw->ucBackground; + } + dst[0] = pal[(pixel * 3) + 2]; + dst[1] = pal[(pixel * 3) + 1]; + dst[2] = pal[(pixel * 3) + 0]; + dst += 3; + } + } + else { + /* Disposal 0,1,3: Replace transparent pixels with background color to maintain position */ + uint8_t bg_r = pal[(pDraw->ucBackground * 3) + 2]; + uint8_t bg_g = pal[(pDraw->ucBackground * 3) + 1]; + uint8_t bg_b = pal[(pDraw->ucBackground * 3) + 0]; + while(src < end) { + pixel = *src++; + if(pixel == pDraw->ucTransparent) { + dst[0] = bg_r; + dst[1] = bg_g; + dst[2] = bg_b; + } + else { + dst[0] = pal[(pixel * 3) + 2]; + dst[1] = pal[(pixel * 3) + 1]; + dst[2] = pal[(pixel * 3) + 0]; + } + dst += 3; + } + } + } + else { + while(src < end) { + pixel = *src++; + dst[0] = pal[(pixel * 3) + 2]; + dst[1] = pal[(pixel * 3) + 1]; + dst[2] = pal[(pixel * 3) + 0]; + dst += 3; + } + } + + LV_PROFILER_DECODER_END; +} + +static inline void gif_blend_to_argb8888(GIFDRAW * pDraw, lv_draw_buf_t * draw_buf) +{ + LV_PROFILER_DECODER_BEGIN; + + uint8_t pixel; + uint8_t * src = pDraw->pPixels; + uint8_t * end = src + pDraw->iWidth; + uint8_t * pal = pDraw->pPalette24; + uint8_t * dst = (uint8_t *)draw_buf->data + ((pDraw->iY + pDraw->y) * draw_buf->header.stride + pDraw->iX * 4); + + if(pDraw->ucHasTransparency) { + if(pDraw->ucDisposalMethod == 2) { + /* Disposal 2: Transparent pixels get alpha=0, opaque pixels get alpha=255 */ + while(src < end) { + pixel = *src++; + if(pixel != pDraw->ucTransparent) { + dst[0] = pal[(pixel * 3) + 2]; + dst[1] = pal[(pixel * 3) + 1]; + dst[2] = pal[(pixel * 3) + 0]; + dst[3] = 0xFF; + } + else { + dst[3] = 0x00; + } + dst += 4; + } + } + else { + /* Disposal 0,1,3: Transparent pixels get alpha=0, opaque pixels get alpha=255 */ + while(src < end) { + pixel = *src++; + if(pixel != pDraw->ucTransparent) { + dst[0] = pal[(pixel * 3) + 2]; + dst[1] = pal[(pixel * 3) + 1]; + dst[2] = pal[(pixel * 3) + 0]; + dst[3] = 0xFF; + } + else { + dst[3] = 0x00; + } + dst += 4; + } + } + } + else { + while(src < end) { + pixel = *src++; + dst[0] = pal[(pixel * 3) + 2]; + dst[1] = pal[(pixel * 3) + 1]; + dst[2] = pal[(pixel * 3) + 0]; + dst[3] = 0xFF; + dst += 4; + } + } + + LV_PROFILER_DECODER_END; +} + +static void gif_draw_raw_cb(GIFDRAW * pDraw) +{ + lv_gif_t * gifobj = (lv_gif_t *) pDraw->pUser; + + switch(pDraw->ucPaletteType) { + case GIF_PALETTE_RGB565_LE: + case GIF_PALETTE_RGB565_BE: + gif_blend_to_rgb565(pDraw, gifobj->draw_buf); + break; + case GIF_PALETTE_RGB888: + gif_blend_to_rgb888(pDraw, gifobj->draw_buf); + break; + case GIF_PALETTE_RGB8888: + gif_blend_to_argb8888(pDraw, gifobj->draw_buf); + break; + default: + LV_LOG_WARN("Unsupported palette type: %d", pDraw->ucPaletteType); + break; + } +} + +static void gif_previous_close(lv_gif_t * gifobj) +{ + LV_PROFILER_DECODER_BEGIN; + + /* Close previous gif if any */ + const char * src = lv_image_get_src((lv_obj_t *) gifobj); + if(src != NULL) { + lv_image_cache_drop(src); + } + + lv_image_set_src((lv_obj_t *) gifobj, NULL); + + lv_timer_resume(gifobj->timer); + lv_timer_reset(gifobj->timer); + + GIF_close(&gifobj->gif); + lv_draw_buf_destroy(gifobj->draw_buf); + gifobj->draw_buf = NULL; + gifobj->is_open = 0; + gifobj->loop_count = -1; + + LV_PROFILER_DECODER_END; +} + +static void gif_initialize(lv_gif_t * gifobj) +{ + LV_PROFILER_DECODER_BEGIN; + + animatedgif_color_format_t decoder_cf; + switch(gifobj->color_format) { + case LV_COLOR_FORMAT_RGB565: + decoder_cf = GIF_PALETTE_RGB565_LE; + break; + case LV_COLOR_FORMAT_RGB565_SWAPPED: + decoder_cf = GIF_PALETTE_RGB565_BE; + break; + case LV_COLOR_FORMAT_RGB888: + decoder_cf = GIF_PALETTE_RGB888; + break; + case LV_COLOR_FORMAT_XRGB8888: + case LV_COLOR_FORMAT_ARGB8888: + decoder_cf = GIF_PALETTE_RGB8888; + break; + default: + LV_LOG_WARN("Unsupported color format: %d", gifobj->color_format); + LV_PROFILER_DECODER_END; + return; + } + + GIFIMAGE * gif = &gifobj->gif; + GIF_begin(gif, decoder_cf); + + lv_image_src_t src_type = lv_image_src_get_type(gifobj->src); + if(src_type == LV_IMAGE_SRC_VARIABLE) { + const lv_image_dsc_t * img_dsc = gifobj->src; + gifobj->is_open = GIF_openRAM(gif, (uint8_t *) img_dsc->data, img_dsc->data_size, gif_draw_raw_cb); + } + else if(src_type == LV_IMAGE_SRC_FILE) { + gifobj->is_open = GIF_openFile(gif, gifobj->src, gif_draw_raw_cb); + } + if(gifobj->is_open == 0) { + LV_LOG_WARN("Couldn't load the source"); + LV_PROFILER_DECODER_END; + return; + } + + uint32_t width = GIF_getCanvasWidth(gif); + uint32_t height = GIF_getCanvasHeight(gif); + gif->ucDrawType = GIF_DRAW_RAW; + + gifobj->draw_buf = lv_draw_buf_create(width, height, gifobj->color_format, LV_STRIDE_AUTO); + + if(gifobj->draw_buf == NULL) { + LV_LOG_WARN("Couldn't allocate memory for the gif with width: %"LV_PRIu32" and height: %"LV_PRIu32, width, height); + GIF_close(gif); + gifobj->is_open = 0; + LV_PROFILER_DECODER_END; + return; + } + + lv_image_set_src((lv_obj_t *) gifobj, gifobj->draw_buf); + + gifobj->loop_count = GIF_getLoopCount(&gifobj->gif); + + lv_timer_resume(gifobj->timer); + lv_timer_reset(gifobj->timer); + gif_next_frame_task_cb(gifobj->timer); + LV_PROFILER_DECODER_END; +} + +/** + * Dispose the previous frame area before rendering the next frame, according to the GIF disposal method. + * + * This function handles the disposal of the previous frame's area in the GIF image, as specified by the disposal method. + * Disposal method values: + * 0: No disposal specified (do nothing) + * 1: Do not dispose (leave as is) + * 2: Restore to background color (the affected area is filled with the background color) + * 3: Restore to previous (not implemented here) + * Only disposal method 2 ("restore to background") is handled in this function. + * + * @param gif Pointer to the GIFIMAGE structure representing the current GIF frame. + * @param drawbuf Pointer to the draw buffer where the frame is rendered. + * + * Assumptions: + * - The coordinates and dimensions (iX, iY, iWidth, iHeight) are within the bounds of the draw buffer. + * - The palette type and background color are valid for the current GIF frame. + */ +static void gif_disposal_last_frame(GIFIMAGE * gif, lv_draw_buf_t * drawbuf) +{ + LV_PROFILER_DECODER_BEGIN; + + int x = gif->iX; + int y = gif->iY; + int w = gif->iWidth; + int h = gif->iHeight; + int disposal_method = (gif->ucGIFBits & 0x1c) >> 2; + int i, j; + + /* Bounds validation to prevent out-of-bounds access */ + if(x < 0 || y < 0 || w <= 0 || h <= 0 || + x + w > drawbuf->header.w || y + h > drawbuf->header.h) { + LV_PROFILER_DECODER_END; + return; + } + + /* Only disposal method 2 requires explicit clearing */ + if(disposal_method == 2) { + /* Restore to background color */ + unsigned char bg = gif->ucBackground; + unsigned char * palette = (unsigned char *)(gif->bUseLocalPalette ? gif->pLocalPalette : gif->pPalette); + switch(gif->ucPaletteType) { + case GIF_PALETTE_RGB565_LE: + case GIF_PALETTE_RGB565_BE: { + unsigned short * palette16 = (unsigned short *)palette; + for(i = y; i < y + h; i++) { + uint8_t * dst = drawbuf->data + drawbuf->header.stride * i; + for(j = x; j < x + w; j++) { + *(uint16_t *)(dst + 2 * j) = palette16[bg]; + } + } + } + break; + case GIF_PALETTE_RGB888: + for(i = y; i < y + h; i++) { + uint8_t * dst = drawbuf->data + drawbuf->header.stride * i; + for(j = x; j < x + w; j++) { + dst[3 * j] = palette[(bg * 3) + 2]; + dst[3 * j + 1] = palette[(bg * 3) + 1]; + dst[3 * j + 2] = palette[(bg * 3) + 0]; + } + } + break; + case GIF_PALETTE_RGB8888: { + lv_color32_t bg_color = lv_color32_make(palette[(bg * 3) + 2], palette[(bg * 3) + 1], palette[(bg * 3)], 0xff); + /* has transparent */ + if(gif->ucGIFBits & 1) { + bg_color = lv_color32_make(0, 0, 0, 0); + } + + for(i = y; i < y + h; i++) { + uint8_t * dst = drawbuf->data + drawbuf->header.stride * i; + for(j = x; j < x + w; j++) { + *(lv_color32_t *)(dst + 4 * j) = bg_color; + } + } + } + break; + default: + break; + } + } + /* disposal_method 0 and 1: do nothing, leave existing content */ + /* disposal_method 3: not supported, do nothing */ + + LV_PROFILER_DECODER_END; +} + +static void gif_next_frame_task_cb(lv_timer_t * t) +{ + lv_obj_t * obj = t->user_data; + lv_gif_t * gifobj = (lv_gif_t *) obj; + + if(gifobj == NULL) { + return; + } + + LV_PROFILER_DECODER_BEGIN; + + bool is_visible = lv_obj_is_visible(obj); + if(gifobj->is_auto_pause && !is_visible) { + lv_timer_pause(t); + LV_PROFILER_DECODER_END; + return; + } + + GIFIMAGE * gif = &gifobj->gif; + int ms_delay_next; + + gif_disposal_last_frame(gif, gifobj->draw_buf); + + LV_PROFILER_DECODER_BEGIN_TAG("GIF_playFrame"); + int has_next = GIF_playFrame(gif, &ms_delay_next, gifobj); + LV_PROFILER_DECODER_END_TAG("GIF_playFrame"); + + if(has_next <= 0) { + gifobj->cur_frame_index = 0; + /*It was the last repeat*/ + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_READY, NULL); + if(gifobj->loop_count > 0) { + if(gifobj->loop_count == 1) { + lv_timer_pause(t); + } + else { + gifobj->loop_count--; + } + } + else if(gifobj->loop_count < 0) { + lv_timer_pause(t); + } + if(res != LV_RESULT_OK) { + LV_PROFILER_DECODER_END; + return; + } + } + else { + gifobj->cur_frame_index++; + lv_timer_set_period(gifobj->timer, ms_delay_next); + } + + lv_draw_buf_flush_cache(gifobj->draw_buf, NULL); + lv_image_cache_drop(lv_image_get_src(obj)); + lv_obj_invalidate(obj); + + LV_PROFILER_DECODER_END; +} + +#endif /*LV_USE_GIF*/ diff --git a/inc/lvgl/src/widgets/gif/lv_gif.h b/inc/lvgl/src/widgets/gif/lv_gif.h new file mode 100644 index 0000000..e1948cc --- /dev/null +++ b/inc/lvgl/src/widgets/gif/lv_gif.h @@ -0,0 +1,138 @@ +/** + * @file lv_gif.h + * + */ + +#ifndef LV_GIF_H +#define LV_GIF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" + +#if LV_USE_GIF + +#include "../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_gif_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a gif object + * @param parent pointer to an object, it will be the parent of the new gif. + * @return pointer to the gif obj + */ +lv_obj_t * lv_gif_create(lv_obj_t * parent); + +/** + * Set the color format of the internally allocated framebuffer that the gif + * will be decoded to. The default is LV_COLOR_FORMAT_ARGB8888. + * Call this before `lv_gif_set_src` to avoid reallocating the framebuffer. + * @param obj pointer to a gif object + * @param color_format the color format of the gif framebuffer + */ +void lv_gif_set_color_format(lv_obj_t * obj, lv_color_format_t color_format); + +/** + * Set the gif data to display on the object + * @param obj pointer to a gif object + * @param src 1) pointer to an ::lv_image_dsc_t descriptor (which contains gif raw data) or + * 2) path to a gif file (e.g. "S:/dir/anim.gif") + */ +void lv_gif_set_src(lv_obj_t * obj, const void * src); + +/** + * Restart a gif animation. + * @param obj pointer to a gif obj + */ +void lv_gif_restart(lv_obj_t * obj); + +/** + * Pause a gif animation. + * @param obj pointer to a gif obj + */ +void lv_gif_pause(lv_obj_t * obj); + +/** + * Resume a gif animation. + * @param obj pointer to a gif obj + */ +void lv_gif_resume(lv_obj_t * obj); + +/** + * Checks if the GIF was loaded correctly. + * @param obj pointer to a gif obj + */ +bool lv_gif_is_loaded(lv_obj_t * obj); + +/** + * Get the loop count for the GIF. + * @param obj pointer to a gif obj + */ +int32_t lv_gif_get_loop_count(lv_obj_t * obj); + +/** + * Set the loop count for the GIF. + * @param obj pointer to a gif obj + * @param count the loop count to set + */ +void lv_gif_set_loop_count(lv_obj_t * obj, int32_t count); + +/** + * Set whether to decode invisible object. + * @param obj pointer to a gif object + * @param auto_pause true: auto pause when invisible, false: don't auto pause + */ +void lv_gif_set_auto_pause_invisible(lv_obj_t * obj, bool auto_pause); + +/** + * Get gif width & height + * @param src pointer to a gif file + * @param w pointer to store width + * @param h pointer to store height + * @return true: success; false: failed + */ +bool lv_gif_get_size(const char * src, uint16_t * w, uint16_t * h); + +/** + * Get frame count of the GIF. + * @param obj pointer to a gif object + * @return frame count of the GIF + */ +int32_t lv_gif_get_frame_count(lv_obj_t * obj); + +/** + * Get the current frame index of the GIF. + * @param obj pointer to a gif object + * @return current frame index of the GIF + */ +int32_t lv_gif_get_current_frame_index(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_GIF*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_GIF_H*/ diff --git a/inc/lvgl/src/widgets/image/lv_image.c b/inc/lvgl/src/widgets/image/lv_image.c new file mode 100644 index 0000000..bb5ae69 --- /dev/null +++ b/inc/lvgl/src/widgets/image/lv_image.c @@ -0,0 +1,1078 @@ +/** + * @file lv_image.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_image_private.h" +#include "../../misc/lv_area_private.h" +#include "../../misc/lv_text_private.h" +#include "../../draw/lv_draw_image_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_event_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../core/lv_obj_draw_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../core/lv_observer_private.h" + +#if LV_USE_IMAGE != 0 + +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_image_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_image_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_image_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_image(lv_event_t * e); +static void scale_update(lv_obj_t * obj, int32_t scale_x, int32_t scale_y); +static void update_align(lv_obj_t * obj); +static void reset_image_attributes(lv_obj_t * obj); + +#if LV_USE_OBSERVER + static void image_src_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif /*LV_USE_OBSERVER*/ + +#if LV_USE_OBJ_PROPERTY + static void lv_image_set_pivot_helper(lv_obj_t * obj, lv_point_t * pivot); + static lv_point_t lv_image_get_pivot_helper(lv_obj_t * obj); +#endif + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_image_properties[] = { + { + .id = LV_PROPERTY_IMAGE_SRC, + .setter = lv_image_set_src, + .getter = lv_image_get_src, + }, + { + .id = LV_PROPERTY_IMAGE_OFFSET_X, + .setter = lv_image_set_offset_x, + .getter = lv_image_get_offset_x, + }, + { + .id = LV_PROPERTY_IMAGE_OFFSET_Y, + .setter = lv_image_set_offset_y, + .getter = lv_image_get_offset_y, + }, + { + .id = LV_PROPERTY_IMAGE_ROTATION, + .setter = lv_image_set_rotation, + .getter = lv_image_get_rotation, + }, + { + .id = LV_PROPERTY_IMAGE_PIVOT, + .setter = lv_image_set_pivot_helper, + .getter = lv_image_get_pivot_helper, + }, + { + .id = LV_PROPERTY_IMAGE_SCALE, + .setter = lv_image_set_scale, + .getter = lv_image_get_scale, + }, + { + .id = LV_PROPERTY_IMAGE_SCALE_X, + .setter = lv_image_set_scale_x, + .getter = lv_image_get_scale_x, + }, + { + .id = LV_PROPERTY_IMAGE_SCALE_Y, + .setter = lv_image_set_scale_y, + .getter = lv_image_get_scale_y, + }, + { + .id = LV_PROPERTY_IMAGE_BLEND_MODE, + .setter = lv_image_set_blend_mode, + .getter = lv_image_get_blend_mode, + }, + { + .id = LV_PROPERTY_IMAGE_ANTIALIAS, + .setter = lv_image_set_antialias, + .getter = lv_image_get_antialias, + }, + { + .id = LV_PROPERTY_IMAGE_INNER_ALIGN, + .setter = lv_image_set_inner_align, + .getter = lv_image_get_inner_align, + }, +}; +#endif + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_image_class = { + .constructor_cb = lv_image_constructor, + .destructor_cb = lv_image_destructor, + .event_cb = lv_image_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_image_t), + .base_class = &lv_obj_class, + .name = "lv_image", + LV_PROPERTY_CLASS_FIELDS(image, IMAGE) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_image_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_image_set_src(lv_obj_t * obj, const void * src) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_invalidate(obj); + + lv_image_src_t src_type = lv_image_src_get_type(src); + lv_image_t * img = (lv_image_t *)obj; + +#if LV_USE_LOG && LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO + switch(src_type) { + case LV_IMAGE_SRC_FILE: + LV_LOG_TRACE("`LV_IMAGE_SRC_FILE` type found"); + break; + case LV_IMAGE_SRC_VARIABLE: + LV_LOG_TRACE("`LV_IMAGE_SRC_VARIABLE` type found"); + break; + case LV_IMAGE_SRC_SYMBOL: + LV_LOG_TRACE("`LV_IMAGE_SRC_SYMBOL` type found"); + break; + default: + LV_LOG_WARN("unknown type"); + } +#endif + + /*If the new source type is unknown free the memories of the old source*/ + if(src_type == LV_IMAGE_SRC_UNKNOWN) { + if(src) LV_LOG_WARN("unknown image type"); + reset_image_attributes(obj); + return; + } + + lv_image_header_t header; + lv_result_t res = lv_image_decoder_get_info(src, &header); + if(res != LV_RESULT_OK) { + if(src_type == LV_IMAGE_SRC_FILE) { + LV_LOG_WARN("failed to get image info: %s", (const char *)src); + } + else { + LV_LOG_WARN("failed to get image info: %p", src); + } + reset_image_attributes(obj); + return; + } + + /*Save the source*/ + if(src_type == LV_IMAGE_SRC_VARIABLE) { + if(header.flags & LV_IMAGE_FLAGS_ALLOCATED) { + lv_draw_buf_t * buf = (lv_draw_buf_t *)src; + if(!buf->unaligned_data || !buf->handlers) { + LV_LOG_ERROR("Invalid draw buffer, unaligned_data: %p, handlers: %p", + buf->unaligned_data, (void *)buf->handlers); + return; + } + } + + /*If memory was allocated because of the previous `src_type` then free it*/ + if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_SYMBOL) { + lv_free((void *)img->src); + } + img->src = src; + } + else if(src_type == LV_IMAGE_SRC_FILE || src_type == LV_IMAGE_SRC_SYMBOL) { + /*If the new and the old src are the same then it was only a refresh.*/ + if(img->src != src) { + const void * old_src = NULL; + /*If memory was allocated because of the previous `src_type` then save its pointer and free after allocation. + *It's important to allocate first to be sure the new data will be on a new address. + *Else `img_cache` wouldn't see the change in source.*/ + if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_SYMBOL) { + old_src = img->src; + } + char * new_str = lv_strdup(src); + LV_ASSERT_MALLOC(new_str); + if(new_str == NULL) return; + img->src = new_str; + + if(old_src) lv_free((void *)old_src); + } + } + + if(src_type == LV_IMAGE_SRC_SYMBOL) { + /*`lv_image_dsc_get_info` couldn't set the width and height of a font so set it here*/ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_text_attributes_t attributes = {0}; + + attributes.letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + attributes.line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + attributes.max_width = LV_COORD_MAX; + attributes.text_flags = LV_TEXT_FLAG_NONE; + + lv_point_t size; + lv_text_get_size_attributes(&size, src, font, &attributes); + header.w = size.x; + header.h = size.y; + } + + img->src_type = src_type; + img->w = header.w; + img->h = header.h; + img->cf = header.cf; + + lv_obj_refresh_self_size(obj); + + update_align(obj); + + /*Provide enough room for the rotated corners*/ + if(img->rotation || img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE) { + lv_obj_refresh_ext_draw_size(obj); + } + + lv_obj_invalidate(obj); +} + +void lv_image_set_offset_x(lv_obj_t * obj, int32_t x) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + img->offset.x = x; + lv_obj_invalidate(obj); +} + +void lv_image_set_offset_y(lv_obj_t * obj, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + img->offset.y = y; + lv_obj_invalidate(obj); +} + +void lv_image_set_rotation(lv_obj_t * obj, int32_t angle) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) { + angle = 0; + } + else { + while(angle >= 3600) angle -= 3600; + while(angle < 0) angle += 3600; + } + + if((uint32_t)angle == img->rotation) return; + + lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + lv_area_t a; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); + + img->rotation = angle; + + /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate + * the whole ext draw area */ + lv_display_t * disp = lv_obj_get_display(obj); + lv_display_enable_invalidation(disp, false); + lv_obj_refresh_ext_draw_size(obj); + lv_display_enable_invalidation(disp, true); + + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); +} + +void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) { + x = 0; + y = 0; + } + + if(img->pivot.x == x && img->pivot.y == y) return; + + lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + lv_area_t a; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); + + lv_point_set(&img->pivot, x, y); + + /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate + * the whole ext draw area */ + lv_display_t * disp = lv_obj_get_display(obj); + lv_display_enable_invalidation(disp, false); + lv_obj_refresh_ext_draw_size(obj); + lv_display_enable_invalidation(disp, true); + + lv_image_get_pivot(obj, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + lv_obj_invalidate_area(obj, &a); +} + +void lv_image_set_pivot_x(lv_obj_t * obj, int32_t x) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + lv_image_set_pivot(obj, x, img->pivot.y); +} + +void lv_image_set_pivot_y(lv_obj_t * obj, int32_t y) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + lv_image_set_pivot(obj, img->pivot.x, y); +} + +void lv_image_set_scale(lv_obj_t * obj, uint32_t zoom) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + /*If scale is set internally, do no overwrite it*/ + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; + + if(zoom == img->scale_x && zoom == img->scale_y) return; + + if(zoom == 0) zoom = 1; + + scale_update(obj, zoom, zoom); +} + +void lv_image_set_scale_x(lv_obj_t * obj, uint32_t zoom) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + /*If scale is set internally, do no overwrite it*/ + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; + + if(zoom == img->scale_x) return; + + if(zoom == 0) zoom = 1; + + scale_update(obj, zoom, img->scale_y); +} + +void lv_image_set_scale_y(lv_obj_t * obj, uint32_t zoom) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + /*If scale is set internally, do no overwrite it*/ + if(img->align > _LV_IMAGE_ALIGN_AUTO_TRANSFORM) return; + + if(zoom == img->scale_y) return; + + if(zoom == 0) zoom = 1; + + scale_update(obj, img->scale_x, zoom); +} + +void lv_image_set_blend_mode(lv_obj_t * obj, lv_blend_mode_t blend_mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + /*If scale is set internally, do no overwrite it*/ + if(img->blend_mode == blend_mode) return; + + img->blend_mode = blend_mode; + + lv_obj_invalidate(obj); +} + +void lv_image_set_antialias(lv_obj_t * obj, bool antialias) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + if(antialias == img->antialias) return; + + img->antialias = antialias; + lv_obj_invalidate(obj); +} + +void lv_image_set_inner_align(lv_obj_t * obj, lv_image_align_t align) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + if(align == img->align) return; + + /*If we're removing STRETCH, reset the scale*/ + if(img->align == LV_IMAGE_ALIGN_STRETCH || img->align == LV_IMAGE_ALIGN_CONTAIN || + img->align == LV_IMAGE_ALIGN_COVER) { + lv_image_set_scale(obj, LV_SCALE_NONE); + } + + img->align = align; + update_align(obj); + + lv_obj_invalidate(obj); +} + +void lv_image_set_bitmap_map_src(lv_obj_t * obj, const lv_image_dsc_t * src) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_image_t * img = (lv_image_t *)obj; + img->bitmap_mask_src = src; + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const void * lv_image_get_src(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->src; +} + +int32_t lv_image_get_offset_x(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->offset.x; +} + +int32_t lv_image_get_offset_y(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->offset.y; +} + +int32_t lv_image_get_rotation(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->rotation; +} + +void lv_image_get_pivot(lv_obj_t * obj, lv_point_t * pivot) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + pivot->x = lv_pct_to_px(img->pivot.x, img->w); + pivot->y = lv_pct_to_px(img->pivot.y, img->h); +} + +int32_t lv_image_get_scale(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->scale_x; +} + +int32_t lv_image_get_scale_x(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->scale_x; +} + +int32_t lv_image_get_scale_y(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->scale_y; +} + +int32_t lv_image_get_src_width(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + update_align(obj); + + return img->w; +} + +int32_t lv_image_get_src_height(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + update_align(obj); + + return img->h; +} + +int32_t lv_image_get_transformed_width(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + update_align(obj); + + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + + lv_area_t a; + lv_image_buf_get_transformed_area(&a, img->w, img->h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + + return lv_area_get_width(&a); +} + +int32_t lv_image_get_transformed_height(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + update_align(obj); + + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + + lv_area_t a; + lv_image_buf_get_transformed_area(&a, img->w, img->h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + + return lv_area_get_height(&a); +} + +lv_blend_mode_t lv_image_get_blend_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->blend_mode; +} + +bool lv_image_get_antialias(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->antialias ? true : false; +} + +lv_image_align_t lv_image_get_inner_align(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->align; +} + +const lv_image_dsc_t * lv_image_get_bitmap_map_src(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_image_t * img = (lv_image_t *)obj; + + return img->bitmap_mask_src; +} + + +#if LV_USE_OBSERVER +lv_observer_t * lv_image_bind_src(lv_obj_t * obj, lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, image_src_observer_cb, obj, NULL); + return observer; +} +#endif /*LV_USE_OBSERVER*/ + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_image_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_image_t * img = (lv_image_t *)obj; + + img->src = NULL; + img->src_type = LV_IMAGE_SRC_UNKNOWN; + img->cf = LV_COLOR_FORMAT_UNKNOWN; + img->w = lv_obj_get_width(obj); + img->h = lv_obj_get_height(obj); + img->rotation = 0; + img->scale_x = LV_SCALE_NONE; + img->scale_y = LV_SCALE_NONE; + img->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0; + lv_point_set(&img->offset, 0, 0); + lv_point_set(&img->pivot, LV_PCT(50), LV_PCT(50)); /*Default pivot to image center*/ + img->align = LV_IMAGE_ALIGN_CENTER; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_ADV_HITTEST); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_image_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_image_t * img = (lv_image_t *)obj; + if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_SYMBOL) { + lv_free((void *)img->src); + img->src = NULL; + img->src_type = LV_IMAGE_SRC_UNKNOWN; + } +} + +static void lv_image_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_event_code_t code = lv_event_get_code(e); + + /*Call the ancestor's event handler*/ + lv_result_t res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_obj_t * obj = lv_event_get_current_target(e); + lv_image_t * img = (lv_image_t *)obj; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + + if(code == LV_EVENT_STYLE_CHANGED) { + /*Refresh the file name to refresh the symbol text size*/ + if(img->src_type == LV_IMAGE_SRC_SYMBOL) { + lv_image_set_src(obj, img->src); + } + else { + /*With transformation it might change*/ + lv_obj_refresh_ext_draw_size(obj); + } + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + + int32_t * s = lv_event_get_param(e); + + /*If the image has angle provide enough room for the rotated corners*/ + if(img->rotation || img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE) { + lv_area_t a; + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + *s = LV_MAX(*s, -a.x1); + *s = LV_MAX(*s, -a.y1); + *s = LV_MAX(*s, a.x2 - w); + *s = LV_MAX(*s, a.y2 - h); + } + } + else if(code == LV_EVENT_SIZE_CHANGED) { + if(img->align == LV_IMAGE_ALIGN_STRETCH || img->align == LV_IMAGE_ALIGN_CONTAIN || + img->align == LV_IMAGE_ALIGN_COVER) { + update_align(obj); + if(img->rotation || img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE) { + lv_obj_refresh_ext_draw_size(obj); + } + } + } + else if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e); + + /*If the object is exactly image sized (not cropped, not mosaic) and transformed + *perform hit test on its transformed area*/ + if(img->w == lv_obj_get_width(obj) && img->h == lv_obj_get_height(obj) && + (img->scale_x != LV_SCALE_NONE || img->scale_y != LV_SCALE_NONE || + img->rotation != 0)) { + + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + lv_area_t coords; + lv_image_buf_get_transformed_area(&coords, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + coords.x1 += obj->coords.x1; + coords.y1 += obj->coords.y1; + coords.x2 += obj->coords.x1; + coords.y2 += obj->coords.y1; + + info->res = lv_area_is_point_on(&coords, info->point, 0); + } + else { + lv_area_t a; + lv_obj_get_click_area(obj, &a); + info->res = lv_area_is_point_on(&a, info->point, 0); + } + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + p->x = img->w; + p->y = img->h; + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) { + draw_image(e); + } +} + +static void draw_image(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_image_t * img = (lv_image_t *)obj; + if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res == LV_COVER_RES_MASKED) return; + if(img->src_type == LV_IMAGE_SRC_UNKNOWN || img->src_type == LV_IMAGE_SRC_SYMBOL) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + /*Non true color format might have "holes"*/ + if(lv_color_format_has_alpha(img->cf)) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + /*With not LV_OPA_COVER images can't cover an area */ + if(lv_obj_get_style_image_opa(obj, LV_PART_MAIN) != LV_OPA_COVER) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(img->rotation != 0) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + + if(img->scale_x == LV_SCALE_NONE && img->scale_y == LV_SCALE_NONE) { + if(lv_area_is_in(info->area, &obj->coords, 0) == false) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + else { + lv_area_t a; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + lv_image_buf_get_transformed_area(&a, lv_obj_get_width(obj), lv_obj_get_height(obj), 0, img->scale_x, img->scale_y, + &pivot_px); + a.x1 += obj->coords.x1; + a.y1 += obj->coords.y1; + a.x2 += obj->coords.x1; + a.y2 += obj->coords.y1; + + if(lv_area_is_in(info->area, &a, 0) == false) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + if(img->bitmap_mask_src) { + info->res = LV_COVER_RES_NOT_COVER; + return; + } + } + else if(code == LV_EVENT_DRAW_MAIN) { + + if(img->h == 0 || img->w == 0) return; + if(img->scale_x == 0 || img->scale_y == 0) return; + if(img->src == NULL) { + /*Do not need to draw image when src is NULL*/ + LV_LOG_TRACE("image source is NULL"); + return; + } + + lv_layer_t * layer = lv_event_get_layer(e); + + if(img->src_type == LV_IMAGE_SRC_FILE || img->src_type == LV_IMAGE_SRC_VARIABLE) { + lv_draw_image_dsc_t draw_dsc; + lv_draw_image_dsc_init(&draw_dsc); + draw_dsc.base.layer = layer; + lv_obj_init_draw_image_dsc(obj, LV_PART_MAIN, &draw_dsc); + + lv_area_t clip_area_ori = layer->_clip_area; + + lv_image_get_pivot(obj, &draw_dsc.pivot); + draw_dsc.scale_x = img->scale_x; + draw_dsc.scale_y = img->scale_y; + draw_dsc.rotation = img->rotation; + draw_dsc.antialias = img->antialias; + draw_dsc.blend_mode = img->blend_mode; + draw_dsc.bitmap_mask_src = img->bitmap_mask_src; + draw_dsc.src = img->src; + + lv_area_set(&draw_dsc.image_area, obj->coords.x1, + obj->coords.y1, + obj->coords.x1 + img->w - 1, + obj->coords.y1 + img->h - 1); + + draw_dsc.clip_radius = lv_obj_get_style_radius(obj, LV_PART_MAIN); + + lv_area_t coords; + if(img->align < _LV_IMAGE_ALIGN_AUTO_TRANSFORM) { + lv_area_align(&obj->coords, &draw_dsc.image_area, img->align, img->offset.x, img->offset.y); + coords = draw_dsc.image_area; + } + else if(img->align == LV_IMAGE_ALIGN_CONTAIN || img->align == LV_IMAGE_ALIGN_COVER) { + int32_t scale = lv_image_get_scale(obj); + lv_point_t offset; + offset.x = (lv_obj_get_width(obj) - img->w * scale / LV_SCALE_NONE) / 2; + offset.y = (lv_obj_get_height(obj) - img->h * scale / LV_SCALE_NONE) / 2; + lv_area_move(&draw_dsc.image_area, offset.x, offset.y); + lv_area_move(&draw_dsc.image_area, img->offset.x, img->offset.y); + coords = draw_dsc.image_area; + } + else if(img->align == LV_IMAGE_ALIGN_TILE) { + lv_area_intersect(&layer->_clip_area, &layer->_clip_area, &obj->coords); + lv_area_move(&draw_dsc.image_area, img->offset.x, img->offset.y); + + lv_area_move(&draw_dsc.image_area, + ((layer->_clip_area.x1 - draw_dsc.image_area.x1 - (img->w - 1)) / img->w) * img->w, + ((layer->_clip_area.y1 - draw_dsc.image_area.y1 - (img->h - 1)) / img->h) * img->h); + coords = layer->_clip_area; + draw_dsc.tile = 1; + } + else { + coords = draw_dsc.image_area; + } + + lv_draw_image(layer, &draw_dsc, &coords); + layer->_clip_area = clip_area_ori; + } + else if(img->src_type == LV_IMAGE_SRC_SYMBOL) { + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_dsc); + label_dsc.text = img->src; + lv_area_t * coords; + lv_area_t aligned_coords; + const bool image_area_is_same_as_coords = img->w == lv_area_get_width(&obj->coords) + && img->h == lv_area_get_height(&obj->coords); + const bool needs_inner_alignment = img->align > LV_IMAGE_ALIGN_TOP_LEFT + && !image_area_is_same_as_coords; + const bool has_offset = img->offset.x || img->offset.y; + const bool inner_alignment_is_transforming = img->align >= _LV_IMAGE_ALIGN_AUTO_TRANSFORM; + if((needs_inner_alignment || has_offset) && !inner_alignment_is_transforming) { + lv_point_t text_size; + + lv_text_attributes_t attributes; + attributes.letter_space = label_dsc.letter_space; + attributes.line_space = label_dsc.line_space; + attributes.max_width = LV_COORD_MAX; + attributes.text_flags = LV_TEXT_FLAG_NONE; + + lv_text_get_size_attributes(&text_size, label_dsc.text, label_dsc.font, &attributes); + lv_area_set(&aligned_coords, 0, 0, text_size.x, text_size.y); + lv_area_align(&obj->coords, &aligned_coords, img->align, img->offset.x, img->offset.y); + coords = &aligned_coords; + } + else { + coords = &obj->coords; + } + lv_draw_label(layer, &label_dsc, coords); + } + else { + /*Trigger the error handler of image draw*/ + LV_LOG_WARN("image source type is unknown"); + } + } +} + +static void scale_update(lv_obj_t * obj, int32_t scale_x, int32_t scale_y) +{ + lv_image_t * img = (lv_image_t *)obj; + + lv_obj_update_layout(obj); /*Be sure the object's size is calculated*/ + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + lv_area_t a; + lv_point_t pivot_px; + lv_image_get_pivot(obj, &pivot_px); + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1 - 1; + a.y1 += obj->coords.y1 - 1; + a.x2 += obj->coords.x1 + 1; + a.y2 += obj->coords.y1 + 1; + lv_obj_invalidate_area(obj, &a); + + img->scale_x = scale_x; + img->scale_y = scale_y; + + /* Disable invalidations because lv_obj_refresh_ext_draw_size would invalidate + * the whole ext draw area */ + lv_display_t * disp = lv_obj_get_display(obj); + lv_display_enable_invalidation(disp, false); + lv_obj_refresh_ext_draw_size(obj); + lv_display_enable_invalidation(disp, true); + + lv_image_buf_get_transformed_area(&a, w, h, img->rotation, img->scale_x, img->scale_y, &pivot_px); + a.x1 += obj->coords.x1 - 1; + a.y1 += obj->coords.y1 - 1; + a.x2 += obj->coords.x1 + 1; + a.y2 += obj->coords.y1 + 1; + lv_obj_invalidate_area(obj, &a); +} + +static void update_align(lv_obj_t * obj) +{ + lv_image_t * img = (lv_image_t *)obj; + if(img->align == LV_IMAGE_ALIGN_STRETCH) { + lv_image_set_rotation(obj, 0); + lv_image_set_pivot(obj, 0, 0); + if(img->w != 0 && img->h != 0) { + lv_obj_update_layout(obj); + int32_t scale_x = lv_obj_get_width(obj) * LV_SCALE_NONE / img->w; + int32_t scale_y = lv_obj_get_height(obj) * LV_SCALE_NONE / img->h; + scale_update(obj, scale_x, scale_y); + } + } + else if(img->align == LV_IMAGE_ALIGN_CONTAIN) { + lv_image_set_rotation(obj, 0); + lv_image_set_pivot(obj, 0, 0); + if(img->w != 0 && img->h != 0) { + lv_obj_update_layout(obj); + int32_t scale_x = lv_obj_get_width(obj) * LV_SCALE_NONE / img->w; + int32_t scale_y = lv_obj_get_height(obj) * LV_SCALE_NONE / img->h; + int32_t scale = LV_MIN(scale_x, scale_y); + scale_update(obj, scale, scale); + } + } + else if(img->align == LV_IMAGE_ALIGN_COVER) { + lv_image_set_rotation(obj, 0); + lv_image_set_pivot(obj, 0, 0); + if(img->w != 0 && img->h != 0) { + lv_obj_update_layout(obj); + int32_t scale_x = lv_obj_get_width(obj) * LV_SCALE_NONE / img->w; + int32_t scale_y = lv_obj_get_height(obj) * LV_SCALE_NONE / img->h; + int32_t scale = LV_MAX(scale_x, scale_y); + scale_update(obj, scale, scale); + } + } + else if(img->align == LV_IMAGE_ALIGN_TILE) { + lv_image_set_rotation(obj, 0); + lv_image_set_pivot(obj, 0, 0); + scale_update(obj, LV_SCALE_NONE, LV_SCALE_NONE); + } +} + +static void reset_image_attributes(lv_obj_t * obj) +{ + lv_image_t * img = (lv_image_t *)obj; + if(img->src_type == LV_IMAGE_SRC_SYMBOL || img->src_type == LV_IMAGE_SRC_FILE) { + lv_free((void *)img->src); + } + img->src = NULL; + img->src_type = LV_IMAGE_SRC_UNKNOWN; + img->w = 0; + img->h = 0; + img->cf = LV_COLOR_FORMAT_UNKNOWN; + lv_obj_refresh_self_size(obj); +} + + +#if LV_USE_OBSERVER + +static void image_src_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + if(subject->type == LV_SUBJECT_TYPE_POINTER) { + lv_image_set_src(observer->target, subject->value.pointer); + } +} + +#endif /*LV_USE_OBSERVER*/ + +#if LV_USE_OBJ_PROPERTY +static void lv_image_set_pivot_helper(lv_obj_t * obj, lv_point_t * pivot) +{ + lv_image_set_pivot(obj, pivot->x, pivot->y); +} + +static lv_point_t lv_image_get_pivot_helper(lv_obj_t * obj) +{ + lv_point_t pivot; + lv_image_get_pivot(obj, &pivot); + return pivot; +} +#endif + + +#endif diff --git a/inc/lvgl/src/widgets/image/lv_image.h b/inc/lvgl/src/widgets/image/lv_image.h new file mode 100644 index 0000000..a057aba --- /dev/null +++ b/inc/lvgl/src/widgets/image/lv_image.h @@ -0,0 +1,366 @@ +/** + * @file lv_image.h + * + */ + +#ifndef LV_IMAGE_H +#define LV_IMAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_IMAGE != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_img: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +#include "../../core/lv_obj.h" +#include "../../misc/lv_fs.h" +#include "../../draw/lv_draw.h" +#include "../../core/lv_observer.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_image_class; + +/** + * Image size mode, when image size and object size is different + */ +typedef enum { + LV_IMAGE_ALIGN_DEFAULT = 0, + LV_IMAGE_ALIGN_TOP_LEFT, + LV_IMAGE_ALIGN_TOP_MID, + LV_IMAGE_ALIGN_TOP_RIGHT, + LV_IMAGE_ALIGN_BOTTOM_LEFT, + LV_IMAGE_ALIGN_BOTTOM_MID, + LV_IMAGE_ALIGN_BOTTOM_RIGHT, + LV_IMAGE_ALIGN_LEFT_MID, + LV_IMAGE_ALIGN_RIGHT_MID, + LV_IMAGE_ALIGN_CENTER, + _LV_IMAGE_ALIGN_AUTO_TRANSFORM, /**< Marks the start of modes that transform the image*/ + LV_IMAGE_ALIGN_STRETCH, /**< Set X and Y scale to fill the Widget's area. */ + LV_IMAGE_ALIGN_TILE, /**< Tile image to fill Widget's area. Offset is applied to shift the tiling. */ + LV_IMAGE_ALIGN_CONTAIN, /**< The image keeps its aspect ratio, but is resized to the maximum size that fits within the Widget's area. */ + LV_IMAGE_ALIGN_COVER, /**< The image keeps its aspect ratio and fills the Widget's area. */ +} lv_image_align_t; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_image_id_t { + LV_PROPERTY_ID(IMAGE, SRC, LV_PROPERTY_TYPE_IMGSRC, 0), + LV_PROPERTY_ID(IMAGE, OFFSET_X, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(IMAGE, OFFSET_Y, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(IMAGE, ROTATION, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(IMAGE, PIVOT, LV_PROPERTY_TYPE_POINT, 4), + LV_PROPERTY_ID(IMAGE, SCALE, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(IMAGE, SCALE_X, LV_PROPERTY_TYPE_INT, 6), + LV_PROPERTY_ID(IMAGE, SCALE_Y, LV_PROPERTY_TYPE_INT, 7), + LV_PROPERTY_ID(IMAGE, BLEND_MODE, LV_PROPERTY_TYPE_INT, 8), + LV_PROPERTY_ID(IMAGE, ANTIALIAS, LV_PROPERTY_TYPE_INT, 9), + LV_PROPERTY_ID(IMAGE, INNER_ALIGN, LV_PROPERTY_TYPE_INT, 10), + LV_PROPERTY_IMAGE_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an image object + * @param parent pointer to an object, it will be the parent of the new image + * @return pointer to the created image + */ +lv_obj_t * lv_image_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the image data to display on the object + * @param obj pointer to an image object + * @param src 1) pointer to an ::lv_image_dsc_t descriptor (converted by LVGL's image converter) (e.g. &my_img) or + * 2) path to an image file (e.g. "S:/dir/img.bin")or + * 3) a SYMBOL (e.g. LV_SYMBOL_OK) + */ +void lv_image_set_src(lv_obj_t * obj, const void * src); + +/** + * Set an offset for the source of an image so the image will be displayed from the new origin. + * @param obj pointer to an image + * @param x the new offset along x axis. + */ +void lv_image_set_offset_x(lv_obj_t * obj, int32_t x); + +/** + * Set an offset for the source of an image. + * so the image will be displayed from the new origin. + * @param obj pointer to an image + * @param y the new offset along y axis. + */ +void lv_image_set_offset_y(lv_obj_t * obj, int32_t y); + +/** + * Set the rotation angle of the image. + * The image will be rotated around the set pivot set by `lv_image_set_pivot()` + * Note that indexed and alpha only images can't be transformed. + * @param obj pointer to an image object + * @param angle rotation in degree with 0.1 degree resolution (0..3600: clock wise) + * @note if image_align is `LV_IMAGE_ALIGN_STRETCH` or `LV_IMAGE_ALIGN_FIT` + * rotation will be set to 0 automatically. + * + */ +void lv_image_set_rotation(lv_obj_t * obj, int32_t angle); + +/** + * Set the rotation center of the image. + * The image will be rotated around this point. + * x, y can be set with value of LV_PCT, lv_image_get_pivot will return the true pixel coordinate of pivot in this case. + * @param obj pointer to an image object + * @param x rotation center x of the image + * @param y rotation center y of the image + */ +void lv_image_set_pivot(lv_obj_t * obj, int32_t x, int32_t y); + +/** + * Set the rotation horizontal center of the image. + * @param obj pointer to an image object + * @param x rotation center x of the image, or lv_pct() + */ +void lv_image_set_pivot_x(lv_obj_t * obj, int32_t x); + +/** + * Set the rotation vertical center of the image. + * @param obj pointer to an image object + * @param y rotation center y of the image, or lv_pct() + */ +void lv_image_set_pivot_y(lv_obj_t * obj, int32_t y); + +/** + * Set the zoom factor of the image. + * Note that indexed and alpha only images can't be transformed. + * @param obj pointer to an image object + * @param zoom the zoom factor. Example values: + * - 256 or LV_SCALE_NONE: no zoom + * - <256: scale down + * - >256: scale up + * - 128: half size + * - 512: double size + */ +void lv_image_set_scale(lv_obj_t * obj, uint32_t zoom); + +/** + * Set the horizontal zoom factor of the image. + * Note that indexed and alpha only images can't be transformed. + * @param obj pointer to an image object + * @param zoom the zoom factor. Example values: + * - 256 or LV_SCALE_NONE: no zoom + * - <256: scale down + * - >256: scale up + * - 128: half size + * - 512: double size + */ +void lv_image_set_scale_x(lv_obj_t * obj, uint32_t zoom); + +/** + * Set the vertical zoom factor of the image. + * Note that indexed and alpha only images can't be transformed. + * @param obj pointer to an image object + * @param zoom the zoom factor. Example values: + * - 256 or LV_SCALE_NONE: no zoom + * - <256: scale down + * - >256: scale up + * - 128: half size + * - 512: double size + */ +void lv_image_set_scale_y(lv_obj_t * obj, uint32_t zoom); + +/** + * Set the blend mode of an image. + * @param obj pointer to an image object + * @param blend_mode the new blend mode + */ +void lv_image_set_blend_mode(lv_obj_t * obj, lv_blend_mode_t blend_mode); + +/** + * Enable/disable anti-aliasing for the transformations (rotate, zoom) or not. + * The quality is better with anti-aliasing looks better but slower. + * @param obj pointer to an image object + * @param antialias true: anti-aliased; false: not anti-aliased + */ +void lv_image_set_antialias(lv_obj_t * obj, bool antialias); + +/** + * Set the image object size mode. + * @param obj pointer to an image object + * @param align the new align mode. + * @note if image_align is `LV_IMAGE_ALIGN_STRETCH` or `LV_IMAGE_ALIGN_FIT` + * rotation, scale and pivot will be overwritten and controlled internally. + */ +void lv_image_set_inner_align(lv_obj_t * obj, lv_image_align_t align); + +/** + * Set an A8 bitmap mask for the image. + * @param obj pointer to an image object + * @param src an lv_image_dsc_t bitmap mask source. + */ +void lv_image_set_bitmap_map_src(lv_obj_t * obj, const lv_image_dsc_t * src); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the source of the image + * @param obj pointer to an image object + * @return the image source (symbol, file name or ::lv-img_dsc_t for C arrays) + */ +const void * lv_image_get_src(lv_obj_t * obj); + +/** + * Get the offset's x attribute of the image object. + * @param obj pointer to an image + * @return offset X value. + */ +int32_t lv_image_get_offset_x(lv_obj_t * obj); + +/** + * Get the offset's y attribute of the image object. + * @param obj pointer to an image + * @return offset Y value. + */ +int32_t lv_image_get_offset_y(lv_obj_t * obj); + +/** + * Get the rotation of the image. + * @param obj pointer to an image object + * @return rotation in 0.1 degrees (0..3600) + * @note if image_align is `LV_IMAGE_ALIGN_STRETCH` or `LV_IMAGE_ALIGN_FIT` + * rotation will be set to 0 automatically. + */ +int32_t lv_image_get_rotation(lv_obj_t * obj); + +/** + * Get the pivot (rotation center) of the image. + * If pivot is set with LV_PCT, convert it to px before return. + * @param obj pointer to an image object + * @param pivot store the rotation center here + */ +void lv_image_get_pivot(lv_obj_t * obj, lv_point_t * pivot); + +/** + * Get the zoom factor of the image. + * @param obj pointer to an image object + * @return zoom factor (256: no zoom) + */ +int32_t lv_image_get_scale(lv_obj_t * obj); + +/** + * Get the horizontal zoom factor of the image. + * @param obj pointer to an image object + * @return zoom factor (256: no zoom) + */ +int32_t lv_image_get_scale_x(lv_obj_t * obj); + +/** + * Get the vertical zoom factor of the image. + * @param obj pointer to an image object + * @return zoom factor (256: no zoom) + */ +int32_t lv_image_get_scale_y(lv_obj_t * obj); + +/** + * Get the width of an image before any transformations. + * @param obj Pointer to an image object. + * @return The width of the image. + */ +int32_t lv_image_get_src_width(lv_obj_t * obj); + +/** + * Get the height of an image before any transformations. + * @param obj Pointer to an image object. + * @return The height of the image. + */ +int32_t lv_image_get_src_height(lv_obj_t * obj); + +/** + * Get the transformed width of an image object. + * @param obj Pointer to an image object. + * @return The transformed width of the image. + */ +int32_t lv_image_get_transformed_width(lv_obj_t * obj); + +/** + * Get the transformed height of an image object. + * @param obj Pointer to an image object. + * @return The transformed height of the image. + */ +int32_t lv_image_get_transformed_height(lv_obj_t * obj); + +/** + * Get the current blend mode of the image + * @param obj pointer to an image object + * @return the current blend mode + */ +lv_blend_mode_t lv_image_get_blend_mode(lv_obj_t * obj); + +/** + * Get whether the transformations (rotate, zoom) are anti-aliased or not + * @param obj pointer to an image object + * @return true: anti-aliased; false: not anti-aliased + */ +bool lv_image_get_antialias(lv_obj_t * obj); + +/** + * Get the size mode of the image + * @param obj pointer to an image object + * @return element of `lv_image_align_t` + */ +lv_image_align_t lv_image_get_inner_align(lv_obj_t * obj); + +/** + * Get the bitmap mask source. + * @param obj pointer to an image object + * @return an lv_image_dsc_t bitmap mask source. + */ +const lv_image_dsc_t * lv_image_get_bitmap_map_src(lv_obj_t * obj); + + +#if LV_USE_OBSERVER +/** + * Bind a pointer Subject to an Image's source. + * @param obj pointer to Image + * @param subject pointer to Subject + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_image_bind_src(lv_obj_t * obj, lv_subject_t * subject); +#endif + +/********************** + * MACROS + **********************/ + +/** Use this macro to declare an image in a C file*/ +#define LV_IMAGE_DECLARE(var_name) extern const lv_image_dsc_t var_name + +#endif /*LV_USE_IMAGE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_H*/ diff --git a/inc/lvgl/src/widgets/image/lv_image_private.h b/inc/lvgl/src/widgets/image/lv_image_private.h new file mode 100644 index 0000000..4ae9507 --- /dev/null +++ b/inc/lvgl/src/widgets/image/lv_image_private.h @@ -0,0 +1,65 @@ +/** + * @file lv_image_private.h + * + */ + +#ifndef LV_IMAGE_PRIVATE_H +#define LV_IMAGE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_image.h" + +#if LV_USE_IMAGE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** + * Data of image + */ +struct _lv_image_t { + lv_obj_t obj; + const void * src; /**< Image source: Pointer to an array or a file or a symbol*/ + const lv_image_dsc_t * bitmap_mask_src; /**< Pointer to an A8 bitmap mask */ + lv_point_t offset; + int32_t w; /**< Width of the image (Handled by the library)*/ + int32_t h; /**< Height of the image (Handled by the library)*/ + uint32_t rotation; /**< Rotation angle of the image*/ + uint32_t scale_x; /**< 256 means no zoom, 512 double size, 128 half size*/ + uint32_t scale_y; /**< 256 means no zoom, 512 double size, 128 half size*/ + lv_point_t pivot; /**< Rotation center of the image*/ + uint32_t src_type : 2; /**< See: lv_image_src_t*/ + uint32_t cf : 5; /**< Color format from `lv_color_format_t`*/ + uint32_t antialias : 1; /**< Apply anti-aliasing in transformations (rotate, zoom)*/ + uint32_t align: 4; /**< Image size mode when image size and object size is different. See lv_image_align_t*/ + uint32_t blend_mode: 4; /**< Element of `lv_blend_mode_t`*/ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_IMAGE != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGE_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/imagebutton/lv_imagebutton.c b/inc/lvgl/src/widgets/imagebutton/lv_imagebutton.c new file mode 100644 index 0000000..9ac89fc --- /dev/null +++ b/inc/lvgl/src/widgets/imagebutton/lv_imagebutton.c @@ -0,0 +1,372 @@ +/** + * @file lv_imagebutton.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_imagebutton_private.h" +#include "../../misc/lv_area_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_event_private.h" +#include "../../core/lv_obj_class_private.h" + + +#if LV_USE_IMAGEBUTTON != 0 + +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_imagebutton_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_imagebutton_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void draw_main(lv_event_t * e); +static void lv_imagebutton_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void refr_image(lv_obj_t * imagebutton); +static lv_imagebutton_state_t suggest_state(lv_obj_t * imagebutton, lv_imagebutton_state_t state); +static lv_imagebutton_state_t get_state(const lv_obj_t * imagebutton); +static void update_src_info(lv_imagebutton_src_info_t * info, const void * src); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_imagebutton_class = { + .base_class = &lv_obj_class, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_imagebutton_t), + .constructor_cb = lv_imagebutton_constructor, + .event_cb = lv_imagebutton_event, + .name = "lv_imagebutton", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_imagebutton_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_imagebutton_set_src(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_left, const void * src_mid, + const void * src_right) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + + if((src_left || src_right) && !src_mid) { + LV_LOG_WARN("middle image source is not set while left and/or right image sources are"); + } + + update_src_info(&imagebutton->src_left[state], src_left); + update_src_info(&imagebutton->src_mid[state], src_mid); + update_src_info(&imagebutton->src_right[state], src_right); + + refr_image(obj); +} + +void lv_imagebutton_set_src_left(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_left) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + update_src_info(&imagebutton->src_left[state], src_left); + refr_image(obj); +} + +void lv_imagebutton_set_src_right(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_right) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + update_src_info(&imagebutton->src_right[state], src_right); + refr_image(obj); +} + +void lv_imagebutton_set_src_mid(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_mid) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + update_src_info(&imagebutton->src_mid[state], src_mid); + refr_image(obj); +} + +void lv_imagebutton_set_state(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_state_t obj_state = LV_STATE_DEFAULT; + if(state == LV_IMAGEBUTTON_STATE_PRESSED || + state == LV_IMAGEBUTTON_STATE_CHECKED_PRESSED) obj_state |= LV_STATE_PRESSED; + if(state == LV_IMAGEBUTTON_STATE_DISABLED || + state == LV_IMAGEBUTTON_STATE_CHECKED_DISABLED) obj_state |= LV_STATE_DISABLED; + if(state == LV_IMAGEBUTTON_STATE_CHECKED_DISABLED || state == LV_IMAGEBUTTON_STATE_CHECKED_PRESSED || + state == LV_IMAGEBUTTON_STATE_CHECKED_RELEASED) { + obj_state |= LV_STATE_CHECKED; + } + + lv_obj_remove_state(obj, LV_STATE_CHECKED | LV_STATE_PRESSED | LV_STATE_DISABLED); + lv_obj_add_state(obj, obj_state); + + refr_image(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const void * lv_imagebutton_get_src_left(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + + return imagebutton->src_left[state].img_src; +} + +const void * lv_imagebutton_get_src_middle(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + + return imagebutton->src_mid[state].img_src; +} + +const void * lv_imagebutton_get_src_right(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + + return imagebutton->src_right[state].img_src; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_imagebutton_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + /*Initialize the allocated 'ext'*/ + + lv_memzero(&imagebutton->src_mid, sizeof(imagebutton->src_mid)); + lv_memzero(&imagebutton->src_left, sizeof(imagebutton->src_left)); + lv_memzero(&imagebutton->src_right, sizeof(imagebutton->src_right)); +} + +static void lv_imagebutton_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res = lv_obj_event_base(&lv_imagebutton_class, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_PRESSED || code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + refr_image(obj); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } + else if(code == LV_EVENT_COVER_CHECK) { + lv_cover_check_info_t * info = lv_event_get_param(e); + if(info->res != LV_COVER_RES_MASKED) info->res = LV_COVER_RES_NOT_COVER; + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_self_size_info(e); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + lv_imagebutton_state_t state = suggest_state(obj, get_state(obj)); + if(imagebutton->src_left[state].img_src == NULL && + imagebutton->src_mid[state].img_src != NULL && + imagebutton->src_right[state].img_src == NULL) { + p->x = LV_MAX(p->x, imagebutton->src_mid[state].header.w); + } + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + /*Just draw_main an image*/ + lv_imagebutton_state_t state = suggest_state(obj, get_state(obj)); + + /*Simply draw the middle src if no tiled*/ + lv_imagebutton_src_info_t * src_info = &imagebutton->src_left[state]; + + int32_t tw = lv_obj_get_style_transform_width(obj, LV_PART_MAIN); + int32_t th = lv_obj_get_style_transform_height(obj, LV_PART_MAIN); + lv_area_t coords; + lv_area_copy(&coords, &obj->coords); + lv_area_increase(&coords, tw, th); + + lv_draw_image_dsc_t img_dsc; + lv_draw_image_dsc_init(&img_dsc); + img_dsc.base.layer = layer; + lv_obj_init_draw_image_dsc(obj, LV_PART_MAIN, &img_dsc); + + lv_area_t coords_part; + int32_t left_w = 0; + int32_t right_w = 0; + + if(src_info->img_src) { + left_w = src_info->header.w; + coords_part.x1 = coords.x1; + coords_part.y1 = coords.y1; + coords_part.x2 = coords.x1 + src_info->header.w - 1; + coords_part.y2 = coords.y1 + src_info->header.h - 1; + img_dsc.src = src_info->img_src; + lv_draw_image(layer, &img_dsc, &coords_part); + } + + src_info = &imagebutton->src_right[state]; + if(src_info->img_src) { + right_w = src_info->header.w; + coords_part.x1 = coords.x2 - src_info->header.w + 1; + coords_part.y1 = coords.y1; + coords_part.x2 = coords.x2; + coords_part.y2 = coords.y1 + src_info->header.h - 1; + img_dsc.src = src_info->img_src; + lv_draw_image(layer, &img_dsc, &coords_part); + } + + src_info = &imagebutton->src_mid[state]; + if(src_info->img_src) { + coords_part.x1 = coords.x1 + left_w; + coords_part.x2 = coords.x2 - right_w; + coords_part.y1 = coords.y1; + coords_part.y2 = coords.y2; + + lv_area_t clip_area_center; + if(lv_area_intersect(&clip_area_center, &coords_part, &layer->_clip_area)) { + lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area_center; + img_dsc.src = src_info->img_src; + img_dsc.tile = 1; + lv_draw_image(layer, &img_dsc, &coords_part); + layer->_clip_area = clip_area_ori; + } + + } +} + +static void refr_image(lv_obj_t * obj) +{ + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + lv_imagebutton_state_t state = suggest_state(obj, get_state(obj)); + + const void * src = imagebutton->src_mid[state].img_src; + if(src == NULL) return; + + lv_obj_refresh_self_size(obj); + lv_obj_set_height(obj, imagebutton->src_mid[state].header.h); /*Keep the user defined width*/ + + lv_obj_invalidate(obj); +} + +/** + * If `src` is not defined for the current state try to get a state which is related to the current but has `src`. + * E.g. if the PRESSED src is not set but the RELEASED does, use the RELEASED. + * @param imagebutton pointer to an image button + * @param state the state to convert + * @return the suggested state + */ +static lv_imagebutton_state_t suggest_state(lv_obj_t * obj, lv_imagebutton_state_t state) +{ + lv_imagebutton_t * imagebutton = (lv_imagebutton_t *)obj; + if(imagebutton->src_mid[state].img_src == NULL) { + switch(state) { + case LV_IMAGEBUTTON_STATE_PRESSED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + case LV_IMAGEBUTTON_STATE_CHECKED_RELEASED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + case LV_IMAGEBUTTON_STATE_CHECKED_PRESSED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_CHECKED_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_CHECKED_RELEASED; + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_PRESSED].img_src) return LV_IMAGEBUTTON_STATE_PRESSED; + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + case LV_IMAGEBUTTON_STATE_DISABLED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + case LV_IMAGEBUTTON_STATE_CHECKED_DISABLED: + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_CHECKED_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_CHECKED_RELEASED; + if(imagebutton->src_mid[LV_IMAGEBUTTON_STATE_RELEASED].img_src) return LV_IMAGEBUTTON_STATE_RELEASED; + break; + default: + break; + } + } + + return state; +} + +static lv_imagebutton_state_t get_state(const lv_obj_t * imagebutton) +{ + LV_ASSERT_OBJ(imagebutton, MY_CLASS); + + lv_state_t obj_state = lv_obj_get_state(imagebutton); + + if(obj_state & LV_STATE_DISABLED) { + if(obj_state & LV_STATE_CHECKED) return LV_IMAGEBUTTON_STATE_CHECKED_DISABLED; + else return LV_IMAGEBUTTON_STATE_DISABLED; + } + + if(obj_state & LV_STATE_CHECKED) { + if(obj_state & LV_STATE_PRESSED) return LV_IMAGEBUTTON_STATE_CHECKED_PRESSED; + else return LV_IMAGEBUTTON_STATE_CHECKED_RELEASED; + } + else { + if(obj_state & LV_STATE_PRESSED) return LV_IMAGEBUTTON_STATE_PRESSED; + else return LV_IMAGEBUTTON_STATE_RELEASED; + } +} + +static void update_src_info(lv_imagebutton_src_info_t * info, const void * src) +{ + if(!src) { + lv_memzero(info, sizeof(lv_imagebutton_src_info_t)); + return; + } + + lv_result_t res = lv_image_decoder_get_info(src, &info->header); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("can't get info"); + return; + } + + info->img_src = src; +} + +#endif diff --git a/inc/lvgl/src/widgets/imagebutton/lv_imagebutton.h b/inc/lvgl/src/widgets/imagebutton/lv_imagebutton.h new file mode 100644 index 0000000..b3b877c --- /dev/null +++ b/inc/lvgl/src/widgets/imagebutton/lv_imagebutton.h @@ -0,0 +1,148 @@ +/** + * @file lv_imagebutton.h + * + */ + +#ifndef LV_IMAGEBUTTON_H +#define LV_IMAGEBUTTON_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_IMAGEBUTTON != 0 + +/********************* + * DEFINES + *********************/ +typedef enum { + LV_IMAGEBUTTON_STATE_RELEASED, + LV_IMAGEBUTTON_STATE_PRESSED, + LV_IMAGEBUTTON_STATE_DISABLED, + LV_IMAGEBUTTON_STATE_CHECKED_RELEASED, + LV_IMAGEBUTTON_STATE_CHECKED_PRESSED, + LV_IMAGEBUTTON_STATE_CHECKED_DISABLED, + LV_IMAGEBUTTON_STATE_NUM, +} lv_imagebutton_state_t; + +/********************** + * TYPEDEFS + **********************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_imagebutton_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an image button object + * @param parent pointer to an object, it will be the parent of the new image button + * @return pointer to the created image button + */ +lv_obj_t * lv_imagebutton_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set images for a state of the image button + * @param obj pointer to an image button object + * @param state for which state set the new image + * @param src_left pointer to an image source for the left side of the button (a C array or path to + * a file) + * @param src_mid pointer to an image source for the middle of the button (ideally 1px wide) (a C + * array or path to a file) + * @param src_right pointer to an image source for the right side of the button (a C array or path + * to a file) + */ +void lv_imagebutton_set_src(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_left, + const void * src_mid, + const void * src_right); + +/** + * Set the left image for a state of the image button + * @param obj pointer to an image button object + * @param state for which state set the new image + * @param src_left pointer to an image source for the left side of the button + * (a C array or path to a file) + */ +void lv_imagebutton_set_src_left(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_left); + +/** + * Set the right image for a state of the image button + * @param obj pointer to an image button object + * @param state for which state set the new image + * @param src_right pointer to an image source for the right side of the button + * (a C array or path to a file) + */ +void lv_imagebutton_set_src_right(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_right); + +/** + * Set the middle image for a state of the image button + * @param obj pointer to an image button object + * @param state for which state set the new image + * @param src_mid pointer to an image source for the middle of the button + * (a C array or path to a file) + */ +void lv_imagebutton_set_src_mid(lv_obj_t * obj, lv_imagebutton_state_t state, const void * src_mid); + +/** + * Use this function instead of `lv_obj_add/remove_state` to set a state manually + * @param obj pointer to an image button object + * @param state the new state + */ +void lv_imagebutton_set_state(lv_obj_t * obj, lv_imagebutton_state_t state); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the left image in a given state + * @param obj pointer to an image button object + * @param state the state where to get the image (from `lv_button_state_t`) ` + * @return pointer to the left image source (a C array or path to a file) + */ +const void * lv_imagebutton_get_src_left(lv_obj_t * obj, lv_imagebutton_state_t state); + +/** + * Get the middle image in a given state + * @param obj pointer to an image button object + * @param state the state where to get the image (from `lv_button_state_t`) ` + * @return pointer to the middle image source (a C array or path to a file) + */ +const void * lv_imagebutton_get_src_middle(lv_obj_t * obj, lv_imagebutton_state_t state); + +/** + * Get the right image in a given state + * @param obj pointer to an image button object + * @param state the state where to get the image (from `lv_button_state_t`) ` + * @return pointer to the left image source (a C array or path to a file) + */ +const void * lv_imagebutton_get_src_right(lv_obj_t * obj, lv_imagebutton_state_t state); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_IMAGEBUTTON*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGEBUTTON_H*/ diff --git a/inc/lvgl/src/widgets/imagebutton/lv_imagebutton_private.h b/inc/lvgl/src/widgets/imagebutton/lv_imagebutton_private.h new file mode 100644 index 0000000..107f49d --- /dev/null +++ b/inc/lvgl/src/widgets/imagebutton/lv_imagebutton_private.h @@ -0,0 +1,58 @@ +/** + * @file lv_imagebutton_private.h + * + */ + +#ifndef LV_IMAGEBUTTON_PRIVATE_H +#define LV_IMAGEBUTTON_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_imagebutton.h" + +#if LV_USE_IMAGEBUTTON != 0 +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_imagebutton_src_info_t { + const void * img_src; + lv_image_header_t header; +}; + +/** Data of image button */ +struct _lv_imagebutton_t { + lv_obj_t obj; + lv_imagebutton_src_info_t src_mid[LV_IMAGEBUTTON_STATE_NUM]; /**< Store center images to each state */ + lv_imagebutton_src_info_t src_left[LV_IMAGEBUTTON_STATE_NUM]; /**< Store left side images to each state */ + lv_imagebutton_src_info_t src_right[LV_IMAGEBUTTON_STATE_NUM]; /**< Store right side images to each state */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_IMAGEBUTTON != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IMAGEBUTTON_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/ime/lv_ime_pinyin.c b/inc/lvgl/src/widgets/ime/lv_ime_pinyin.c new file mode 100644 index 0000000..517b442 --- /dev/null +++ b/inc/lvgl/src/widgets/ime/lv_ime_pinyin.c @@ -0,0 +1,1202 @@ +/** + * @file lv_ime_pinyin.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_ime_pinyin_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_IME_PINYIN != 0 + +#include "../../lvgl.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_ime_pinyin_class) +#define cand_len LV_GLOBAL_DEFAULT()->ime_cand_len + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_ime_pinyin_style_change_event(lv_event_t * e); +static void lv_ime_pinyin_kb_event(lv_event_t * e); +static void lv_ime_pinyin_cand_panel_event(lv_event_t * e); + +static void init_pinyin_dict(lv_obj_t * obj, const lv_pinyin_dict_t * dict); +static void pinyin_input_proc(lv_obj_t * obj); +static void pinyin_page_proc(lv_obj_t * obj, uint16_t btn); +static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num); +static void pinyin_ime_clear_data(lv_obj_t * obj); + +#if LV_IME_PINYIN_USE_K9_MODE + static void pinyin_k9_init_data(lv_obj_t * obj); + static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]); + static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str); + static void pinyin_k9_fill_cand(lv_obj_t * obj); + static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_ime_pinyin_class = { + .constructor_cb = lv_ime_pinyin_constructor, + .destructor_cb = lv_ime_pinyin_destructor, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_ime_pinyin_t), + .base_class = &lv_obj_class, + .name = "lv_ime_pinyin", +}; + +#if LV_IME_PINYIN_USE_K9_MODE +static const char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21] = {\ + ",\0", "123\0", "abc \0", "def\0", LV_SYMBOL_BACKSPACE"\0", "\n\0", + ".\0", "ghi\0", "jkl\0", "mno\0", LV_SYMBOL_KEYBOARD"\0", "\n\0", + "?\0", "pqrs\0", "tuv\0", "wxyz\0", LV_SYMBOL_NEW_LINE"\0", "\n\0", + LV_SYMBOL_LEFT"\0", "\0" + }; + +static lv_buttonmatrix_ctrl_t default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 17] = { 1 }; +static char lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 2][LV_IME_PINYIN_K9_MAX_INPUT] = {0}; +#endif + +static char lv_pinyin_cand_str[LV_IME_PINYIN_CAND_TEXT_NUM][4]; +static char * lv_btnm_def_pinyin_sel_map[LV_IME_PINYIN_CAND_TEXT_NUM + 3]; + +#if LV_IME_PINYIN_USE_DEFAULT_DICT +static const lv_pinyin_dict_t lv_ime_pinyin_def_dict[] = { + { "a", "啊" }, + { "ai", "愛" }, + { "an", "安暗案" }, + { "ba", "吧把爸八" }, + { "bai", "百白敗" }, + { "ban", "半般辦" }, + { "bang", "旁" }, + { "bao", "保薄包報" }, + { "bei", "被背悲北杯備" }, + { "ben", "本" }, + { "bi", "必比避鼻彼筆秘閉" }, + { "bian", "便邊變変辺" }, + { "biao", "表標" }, + { "bie", "別" }, + { "bing", "病並氷" }, + { "bo", "波薄泊" }, + { "bu", "不布步部捕補歩" }, + { "ca", "察" }, + { "cai", "才材菜財採" }, + { "can", "参残參" }, + { "ce", "策側" }, + { "ceng", "曾" }, + { "cha", "差查茶" }, + { "chai", "差" }, + { "chan", "產産單" }, + { "chang", "場廠" }, + { "chao", "超朝" }, + { "che", "車" }, + { "cheng", "成程乗" }, + { "chi", "尺吃持赤池遅歯" }, + { "chong", "充种重種" }, + { "chu", "出初楚触處処" }, + { "chuan", "川船傳" }, + { "chuang", "創窓" }, + { "chun", "春" }, + { "ci", "此次辞差" }, + { "cong", "從従" }, + { "cu", "卒" }, + { "cun", "存村" }, + { "cuo", "錯" }, + { "da", "大打答達" }, + { "dai", "代待帯帶貸" }, + { "dan", "但担擔誕單単" }, + { "dang", "当党當黨" }, + { "dao", "到道盗導島辺" }, + { "de", "的得" }, + { "dei", "" }, + { "deng", "等" }, + { "di", "地得低底弟第締" }, + { "dian", "点电店點電" }, + { "diao", "調" }, + { "ding", "定町" }, + { "dong", "冬東動働凍" }, + { "du", "独度都渡読" }, + { "duan", "段断短斷" }, + { "dui", "對対" }, + { "duo", "多駄" }, + { "e", "嗯悪" }, + { "en", "嗯" }, + { "er", "而耳二兒" }, + { "fa", "乏法發発髪" }, + { "fan", "反返犯番仮販飯範払" }, + { "fang", "方放房坊訪" }, + { "fei", "非飛費" }, + { "fen", "分份" }, + { "feng", "風豐" }, + { "fou", "否不" }, + { "fu", "父夫富服符付附府幅婦復複負払" }, + { "gai", "改概該" }, + { "gan", "甘感敢" }, + { "gang", "港剛" }, + { "gao", "告高" }, + { "ge", "各格歌革割個" }, + { "gei", "給" }, + { "gen", "跟根" }, + { "geng", "更" }, + { "gong", "工共供功公" }, + { "gou", "夠構溝" }, + { "gu", "古故鼓" }, + { "guai", "掛" }, + { "guan", "官管慣館觀関關" }, + { "guang", "光広" }, + { "gui", "規帰" }, + { "guo", "果国裏菓國過" }, + { "hai", "孩海害還" }, + { "han", "寒漢" }, + { "hang", "航行" }, + { "hao", "好号" }, + { "he", "合和喝何荷" }, + { "hei", "黒" }, + { "hen", "很" }, + { "heng", "行横" }, + { "hou", "厚喉候後" }, + { "hu", "乎呼湖護" }, + { "hua", "化画花話畫劃" }, + { "huai", "壊劃" }, + { "huan", "緩環歡還換" }, + { "huang", "黄" }, + { "hui", "回会慧絵揮會" }, + { "hun", "混婚" }, + { "huo", "活或火獲" }, + { "i", "" }, + { "ji", "己计及机既急季寄技即集基祭系奇紀積計記済幾際極繼績機濟" }, + { "jia", "家加價" }, + { "jian", "件建健肩見減間検簡漸" }, + { "jiang", "降強講將港" }, + { "jiao", "叫教交角覚覺較學" }, + { "jie", "介借接姐皆届界解結階節價" }, + { "jin", "今近禁金僅進" }, + { "jing", "京境景静精經経" }, + { "jiu", "就久九酒究" }, + { "ju", "句具局居決挙據舉" }, + { "jue", "角覚覺" }, + { "jun", "均" }, + { "kai", "開" }, + { "kan", "看刊" }, + { "kang", "康" }, + { "kao", "考" }, + { "ke", "可刻科克客渇課" }, + { "ken", "肯" }, + { "kong", "空控" }, + { "kou", "口" }, + { "ku", "苦庫" }, + { "kuai", "快塊会會" }, + { "kuang", "況" }, + { "kun", "困" }, + { "kuo", "括拡適" }, + { "la", "拉啦落" }, + { "lai", "来來頼" }, + { "lao", "老絡落" }, + { "le", "了楽樂" }, + { "lei", "類" }, + { "leng", "冷" }, + { "li", "力立利理例礼離麗裡勵歷" }, + { "lian", "連練臉聯" }, + { "liang", "良量涼兩両" }, + { "liao", "料" }, + { "lie", "列" }, + { "lin", "林隣賃" }, + { "ling", "另令領" }, + { "liu", "六留流" }, + { "lu", "律路録緑陸履慮" }, + { "lv", "旅" }, + { "lun", "輪論" }, + { "luo", "落絡" }, + { "ma", "媽嗎嘛" }, + { "mai", "買売" }, + { "man", "滿" }, + { "mang", "忙" }, + { "mao", "毛猫貿" }, + { "me", "麼" }, + { "mei", "美妹每沒毎媒" }, + { "men", "們" }, + { "mi", "米密秘" }, + { "mian", "免面勉眠" }, + { "miao", "描" }, + { "min", "民皿" }, + { "ming", "命明名" }, + { "mo", "末模麼" }, + { "mou", "某" }, + { "mu", "母木目模" }, + { "na", "那哪拿內南" }, + { "nan", "男南難" }, + { "nao", "腦" }, + { "ne", "那哪呢" }, + { "nei", "内那哪內" }, + { "neng", "能" }, + { "ni", "你妳呢" }, + { "nian", "年念" }, + { "niang", "娘" }, + { "nin", "您" }, + { "ning", "凝" }, + { "niu", "牛" }, + { "nong", "農濃" }, + { "nu", "女努" }, + { "nuan", "暖" }, + { "o", "" }, + { "ou", "歐" }, + { "pa", "怕" }, + { "pai", "迫派排" }, + { "pan", "判番" }, + { "pang", "旁" }, + { "pei", "配" }, + { "peng", "朋" }, + { "pi", "疲否" }, + { "pian", "片便" }, + { "pin", "品貧" }, + { "ping", "平評" }, + { "po", "迫破泊頗" }, + { "pu", "普僕" }, + { "qi", "起其奇七气期泣企妻契気" }, + { "qian", "嵌浅千前鉛錢針" }, + { "qiang", "強將" }, + { "qiao", "橋繰" }, + { "qie", "且切契" }, + { "qin", "寝勤親" }, + { "qing", "青清情晴輕頃請軽" }, + { "qiu", "求秋球" }, + { "qu", "去取趣曲區" }, + { "quan", "全犬券" }, + { "que", "缺確卻" }, + { "ran", "然" }, + { "rang", "讓" }, + { "re", "熱" }, + { "ren", "人任認" }, + { "reng", "仍" }, + { "ri", "日" }, + { "rong", "容" }, + { "rou", "弱若肉" }, + { "ru", "如入" }, + { "ruan", "軟" }, + { "sai", "賽" }, + { "san", "三" }, + { "sao", "騒繰" }, + { "se", "色" }, + { "sen", "森" }, + { "sha", "砂" }, + { "shan", "善山單" }, + { "shang", "上尚商" }, + { "shao", "少紹" }, + { "shaung", "雙" }, + { "she", "社射設捨渉" }, + { "shei", "誰" }, + { "shen", "什申深甚身伸沈神" }, + { "sheng", "生声昇勝乗聲" }, + { "shi", "是失示食时事式十石施使世实史室市始柿氏士仕拭時視師試適実實識" }, + { "shou", "手首守受授" }, + { "shu", "束数暑殊樹書屬輸術" }, + { "shui", "水説說誰" }, + { "shuo", "数説說" }, + { "si", "思寺司四私似死価" }, + { "song", "送" }, + { "su", "速宿素蘇訴" }, + { "suan", "算酸" }, + { "sui", "隨雖歲歳" }, + { "sun", "孫" }, + { "suo", "所" }, + { "ta", "她他它牠" }, + { "tai", "太台態臺" }, + { "tan", "探談曇" }, + { "tang", "糖" }, + { "tao", "桃逃套討" }, + { "te", "特" }, + { "ti", "体提替題體戻" }, + { "tian", "天田" }, + { "tiao", "条條調" }, + { "tie", "鉄" }, + { "ting", "停庭聽町" }, + { "tong", "同童通痛统統" }, + { "tou", "投透頭" }, + { "tu", "土徒茶図" }, + { "tuan", "團" }, + { "tui", "推退" }, + { "tuo", "脱駄" }, + { "u", "" }, + { "v", "" }, + { "wai", "外" }, + { "wan", "完万玩晩腕灣" }, + { "wang", "忘望亡往網" }, + { "wei", "危位未味委為謂維違圍" }, + { "wen", "文温問聞" }, + { "wo", "我" }, + { "wu", "午物五無屋亡鳥務汚" }, + { "xi", "夕息西洗喜系昔席希析嬉膝細習係" }, + { "xia", "下夏狭暇" }, + { "xian", "先限嫌洗現見線顯" }, + { "xiang", "向相香像想象降項詳響" }, + { "xiao", "小笑消效校削咲" }, + { "xie", "写携些解邪械協謝寫契" }, + { "xin", "心信新辛" }, + { "xing", "行形性幸型星興" }, + { "xiong", "兄胸" }, + { "xiu", "休秀修" }, + { "xu", "須需許續緒続" }, + { "xuan", "選懸" }, + { "xue", "学雪削靴學" }, + { "xun", "訓訊" }, + { "ya", "呀押壓" }, + { "yan", "言顔研煙嚴厳験驗塩" }, + { "yang", "央洋陽樣様" }, + { "yao", "要揺腰薬曜" }, + { "ye", "也野夜邪業葉" }, + { "yi", "一已亦依以移意医易伊役異億義議藝醫訳" }, + { "yin", "因引音飲銀" }, + { "ying", "英迎影映應營営" }, + { "yong", "永用泳擁" }, + { "you", "又有右友由尤油遊郵誘優" }, + { "yu", "予育余雨浴欲愈御宇域語於魚與込" }, + { "yuan", "元原源院員円園遠猿願" }, + { "yue", "月越約楽" }, + { "yun", "雲伝運" }, + { "za", "雑" }, + { "zai", "在再載災" }, + { "zang", "蔵" }, + { "zao", "早造" }, + { "ze", "則擇責" }, + { "zen", "怎" }, + { "zeng", "曾增増" }, + { "zha", "札" }, + { "zhai", "宅擇" }, + { "zhan", "站展戰戦" }, + { "zhang", "丈長障帳張" }, + { "zhao", "找着朝招" }, + { "zhe", "者這" }, + { "zhen", "真震針" }, + { "zheng", "正整争政爭" }, + { "zhi", "之只知支止制至治直指值置智値紙製質誌織隻識職執" }, + { "zhong", "中种終重種眾" }, + { "zhou", "周州昼宙洲週" }, + { "zhu", "助主住柱株祝逐注著諸屬術" }, + { "zhuan", "专專転" }, + { "zhuang", "状狀" }, + { "zhui", "追" }, + { "zhun", "準" }, + { "zhuo", "着" }, + { "zi", "子自字姉資" }, + { "zong", "總" }, + { "zuo", "左做昨坐座作" }, + { "zu", "足祖族卒組" }, + { "zui", "最酔" }, + { "zou", "走" }, + {NULL, NULL} +}; +#endif + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb) +{ + if(kb) { + LV_ASSERT_OBJ(kb, &lv_keyboard_class); + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + pinyin_ime->kb = kb; + lv_obj_set_parent(obj, lv_obj_get_parent(kb)); + lv_obj_set_parent(pinyin_ime->cand_panel, lv_obj_get_parent(kb)); + lv_obj_add_event_cb(pinyin_ime->kb, lv_ime_pinyin_kb_event, LV_EVENT_VALUE_CHANGED, obj); + lv_obj_align_to(pinyin_ime->cand_panel, pinyin_ime->kb, LV_ALIGN_OUT_TOP_MID, 0, 0); +} + +void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + init_pinyin_dict(obj, dict); +} + +void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + LV_ASSERT_OBJ(pinyin_ime->kb, &lv_keyboard_class); + + pinyin_ime->mode = mode; + +#if LV_IME_PINYIN_USE_K9_MODE + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + pinyin_k9_init_data(obj); + lv_keyboard_set_map(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1, (const char **)lv_btnm_def_pinyin_k9_map, + default_kb_ctrl_k9_map); + lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1); + } +#endif +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + return pinyin_ime->kb; +} + +lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + return pinyin_ime->cand_panel; +} + +const lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + return pinyin_ime->dict; +} + +/*===================== + * Other functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + uint16_t py_str_i = 0; + uint16_t btnm_i = 0; + for(btnm_i = 0; btnm_i < (LV_IME_PINYIN_CAND_TEXT_NUM + 3); btnm_i++) { + if(btnm_i == 0) { + lv_btnm_def_pinyin_sel_map[btnm_i] = "<"; + } + else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) { + lv_btnm_def_pinyin_sel_map[btnm_i] = ">"; + } + else if(btnm_i == (LV_IME_PINYIN_CAND_TEXT_NUM + 2)) { + lv_btnm_def_pinyin_sel_map[btnm_i] = ""; + } + else { + lv_pinyin_cand_str[py_str_i][0] = ' '; + lv_btnm_def_pinyin_sel_map[btnm_i] = lv_pinyin_cand_str[py_str_i]; + py_str_i++; + } + } + + pinyin_ime->mode = LV_IME_PINYIN_MODE_K26; + pinyin_ime->py_page = 0; + pinyin_ime->ta_count = 0; + pinyin_ime->cand_num = 0; + lv_memzero(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + lv_memzero(pinyin_ime->py_num, sizeof(pinyin_ime->py_num)); + lv_memzero(pinyin_ime->py_pos, sizeof(pinyin_ime->py_pos)); + + lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN); + +#if LV_IME_PINYIN_USE_DEFAULT_DICT + init_pinyin_dict(obj, lv_ime_pinyin_def_dict); +#endif + + /* Init pinyin_ime->cand_panel */ + pinyin_ime->cand_panel = lv_buttonmatrix_create(lv_obj_get_parent(obj)); + lv_buttonmatrix_set_map(pinyin_ime->cand_panel, (const char **)lv_btnm_def_pinyin_sel_map); + lv_obj_set_size(pinyin_ime->cand_panel, LV_PCT(100), LV_PCT(5)); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + + lv_buttonmatrix_set_one_checked(pinyin_ime->cand_panel, true); + lv_obj_remove_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + /* Set cand_panel style*/ + // Default style + lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, 0); + lv_obj_set_style_border_width(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_pad_all(pinyin_ime->cand_panel, 8, 0); + lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_radius(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_pad_gap(pinyin_ime->cand_panel, 0, 0); + lv_obj_set_style_base_dir(pinyin_ime->cand_panel, LV_BASE_DIR_LTR, 0); + + // LV_PART_ITEMS style + lv_obj_set_style_radius(pinyin_ime->cand_panel, 12, LV_PART_ITEMS); + lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS); + lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS); + lv_obj_set_style_shadow_opa(pinyin_ime->cand_panel, LV_OPA_0, LV_PART_ITEMS); + + // LV_PART_ITEMS | LV_STATE_PRESSED style + lv_obj_set_style_bg_opa(pinyin_ime->cand_panel, LV_OPA_COVER, LV_PART_ITEMS | LV_STATE_PRESSED); + lv_obj_set_style_bg_color(pinyin_ime->cand_panel, lv_color_white(), LV_PART_ITEMS | LV_STATE_PRESSED); + + /* event handler */ + lv_obj_add_event_cb(pinyin_ime->cand_panel, lv_ime_pinyin_cand_panel_event, LV_EVENT_VALUE_CHANGED, obj); + lv_obj_add_event_cb(obj, lv_ime_pinyin_style_change_event, LV_EVENT_STYLE_CHANGED, NULL); + +#if LV_IME_PINYIN_USE_K9_MODE + pinyin_ime->k9_input_str_len = 0; + pinyin_ime->k9_py_ll_pos = 0; + pinyin_ime->k9_legal_py_count = 0; + lv_memzero(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT); + + pinyin_k9_init_data(obj); + + lv_ll_init(&(pinyin_ime->k9_legal_py_ll), sizeof(ime_pinyin_k9_py_str_t)); +#endif +} + +static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + if(lv_obj_is_valid(pinyin_ime->kb)) + lv_obj_delete(pinyin_ime->kb); + + if(lv_obj_is_valid(pinyin_ime->cand_panel)) + lv_obj_delete(pinyin_ime->cand_panel); + +#if LV_IME_PINYIN_USE_K9_MODE + lv_ll_clear(&pinyin_ime->k9_legal_py_ll); +#endif +} + +static void lv_ime_pinyin_kb_event(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * kb = lv_event_get_current_target(e); + lv_obj_t * obj = lv_event_get_user_data(e); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + +#if LV_IME_PINYIN_USE_K9_MODE + static const char * k9_py_map[8] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; +#endif + + if(code == LV_EVENT_VALUE_CHANGED) { + uint16_t btn_id = lv_buttonmatrix_get_selected_button(kb); + if(btn_id == LV_BUTTONMATRIX_BUTTON_NONE) return; + + const char * txt = lv_buttonmatrix_get_button_text(kb, lv_buttonmatrix_get_selected_button(kb)); + if(txt == NULL) return; + + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + +#if LV_IME_PINYIN_USE_K9_MODE + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + + uint16_t tmp_button_str_len = lv_strlen(pinyin_ime->input_char); + if((btn_id >= 16) && (tmp_button_str_len > 0) && (btn_id < (16 + LV_IME_PINYIN_K9_CAND_TEXT_NUM))) { + lv_memzero(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + lv_strcat(pinyin_ime->input_char, txt); + pinyin_input_proc(obj); + + for(int index = 0; index < (pinyin_ime->ta_count + tmp_button_str_len); index++) { + lv_textarea_delete_char(ta); + } + + pinyin_ime->ta_count = tmp_button_str_len; + pinyin_ime->k9_input_str_len = tmp_button_str_len; + lv_textarea_add_text(ta, pinyin_ime->input_char); + + return; + } + } +#endif + + if(lv_strcmp(txt, "Enter") == 0 || lv_strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { + pinyin_ime_clear_data(obj); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + } + else if(lv_strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { + // del input char + if(pinyin_ime->ta_count > 0) { + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) + pinyin_ime->input_char[pinyin_ime->ta_count - 1] = '\0'; +#if LV_IME_PINYIN_USE_K9_MODE + else + pinyin_ime->k9_input_str[pinyin_ime->ta_count - 1] = '\0'; +#endif + + pinyin_ime->ta_count--; + if(pinyin_ime->ta_count <= 0) { + pinyin_ime_clear_data(obj); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + } + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) { + pinyin_input_proc(obj); + } +#if LV_IME_PINYIN_USE_K9_MODE + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + pinyin_ime->k9_input_str_len = lv_strlen(pinyin_ime->input_char) - 1; + pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map); + pinyin_k9_fill_cand(obj); + pinyin_input_proc(obj); + pinyin_ime->ta_count--; + } +#endif + } + } + else if((lv_strcmp(txt, "ABC") == 0) || (lv_strcmp(txt, "abc") == 0) || (lv_strcmp(txt, "1#") == 0) || + (lv_strcmp(txt, LV_SYMBOL_OK) == 0)) { + pinyin_ime_clear_data(obj); + return; + } + else if(lv_strcmp(txt, "123") == 0) { + for(uint16_t i = 0; i < lv_strlen(txt); i++) + lv_textarea_delete_char(ta); + + pinyin_ime_clear_data(obj); + lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST); + lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9_NUMBER); + lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUMBER); + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + } + else if(lv_strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) { + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) { + lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9); + } + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K26); + lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_TEXT_LOWER); + } + else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9_NUMBER) { + lv_ime_pinyin_set_mode(obj, LV_IME_PINYIN_MODE_K9); + } + pinyin_ime_clear_data(obj); + } + else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) && (txt[0] >= 'a' && txt[0] <= 'z')) { + uint16_t len = lv_strlen(pinyin_ime->input_char); + lv_snprintf(pinyin_ime->input_char + len, sizeof(pinyin_ime->input_char) - len, "%s", txt); + pinyin_input_proc(obj); + pinyin_ime->ta_count++; + } +#if LV_IME_PINYIN_USE_K9_MODE + else if((pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) && (txt[0] >= 'a' && txt[0] <= 'z')) { + for(uint16_t i = 0; i < 8; i++) { + if((lv_strcmp(txt, k9_py_map[i]) == 0) || (lv_strcmp(txt, "abc ") == 0)) { + if(lv_strcmp(txt, "abc ") == 0) pinyin_ime->k9_input_str_len += lv_strlen(k9_py_map[i]) + 1; + else pinyin_ime->k9_input_str_len += lv_strlen(k9_py_map[i]); + pinyin_ime->k9_input_str[pinyin_ime->ta_count] = 50 + i; + pinyin_ime->k9_input_str[pinyin_ime->ta_count + 1] = '\0'; + + break; + } + } + pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map); + pinyin_k9_fill_cand(obj); + pinyin_input_proc(obj); + } + else if(lv_strcmp(txt, LV_SYMBOL_LEFT) == 0) { + pinyin_k9_cand_page_proc(obj, 0); + } + else if(lv_strcmp(txt, LV_SYMBOL_RIGHT) == 0) { + pinyin_k9_cand_page_proc(obj, 1); + } +#endif + } +} + +static void lv_ime_pinyin_cand_panel_event(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * cand_panel = lv_event_get_current_target(e); + lv_obj_t * obj = (lv_obj_t *)lv_event_get_user_data(e); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + if(code == LV_EVENT_VALUE_CHANGED) { + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + if(ta == NULL) return; + + uint32_t id = lv_buttonmatrix_get_selected_button(cand_panel); + if(id == LV_BUTTONMATRIX_BUTTON_NONE) { + return; + } + else if(id == 0) { + pinyin_page_proc(obj, 0); + return; + } + else if(id == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) { + pinyin_page_proc(obj, 1); + return; + } + + const char * txt = lv_buttonmatrix_get_button_text(cand_panel, id); + uint16_t index = 0; + for(index = 0; index < pinyin_ime->ta_count; index++) + lv_textarea_delete_char(ta); + + lv_textarea_add_text(ta, txt); + + pinyin_ime_clear_data(obj); + } +} + +static void pinyin_input_proc(lv_obj_t * obj) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + pinyin_ime->cand_str = pinyin_search_matching(obj, pinyin_ime->input_char, &pinyin_ime->cand_num); + if(pinyin_ime->cand_str == NULL) { + return; + } + + pinyin_ime->py_page = 0; + + for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { + lv_memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); + lv_pinyin_cand_str[i][0] = ' '; + } + + // fill buf + for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) { + for(uint8_t j = 0; j < 3; j++) { + lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[i * 3 + j]; + } + } + + lv_obj_remove_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); + lv_obj_invalidate(pinyin_ime->cand_panel); +} + +static void pinyin_page_proc(lv_obj_t * obj, uint16_t dir) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + uint16_t page_num = pinyin_ime->cand_num / LV_IME_PINYIN_CAND_TEXT_NUM; + uint16_t remainder = pinyin_ime->cand_num % LV_IME_PINYIN_CAND_TEXT_NUM; + + if(!pinyin_ime->cand_str) return; + + if(dir == 0) { + if(pinyin_ime->py_page) { + pinyin_ime->py_page--; + } + } + else { + if(remainder == 0) { + page_num -= 1; + } + if(pinyin_ime->py_page < page_num) { + pinyin_ime->py_page++; + } + else return; + } + + for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { + lv_memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); + lv_pinyin_cand_str[i][0] = ' '; + } + + // fill buf + uint16_t offset = pinyin_ime->py_page * (3 * LV_IME_PINYIN_CAND_TEXT_NUM); + for(uint8_t i = 0; (i < pinyin_ime->cand_num && i < LV_IME_PINYIN_CAND_TEXT_NUM); i++) { + if((remainder > 0) && (pinyin_ime->py_page == page_num)) { + if(i >= remainder) + break; + } + for(uint8_t j = 0; j < 3; j++) { + lv_pinyin_cand_str[i][j] = pinyin_ime->cand_str[offset + (i * 3) + j]; + } + } +} + +static void lv_ime_pinyin_style_change_event(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + if(code == LV_EVENT_STYLE_CHANGED) { + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_obj_set_style_text_font(pinyin_ime->cand_panel, font, 0); + } +} + +static void init_pinyin_dict(lv_obj_t * obj, const lv_pinyin_dict_t * dict) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + char headletter = 'a'; + uint16_t offset_sum = 0; + uint16_t offset_count = 0; + uint16_t letter_calc = 0; + + pinyin_ime->dict = dict; + + for(uint16_t i = 0; ; i++) { + if((NULL == (dict[i].py)) || (NULL == (dict[i].py_mb))) { + headletter = dict[i - 1].py[0]; + letter_calc = headletter - 'a'; + pinyin_ime->py_num[letter_calc] = offset_count; + break; + } + + if(headletter == (dict[i].py[0])) { + offset_count++; + } + else { + headletter = dict[i].py[0]; + pinyin_ime->py_num[letter_calc] = offset_count; + letter_calc = headletter - 'a'; + offset_sum += offset_count; + pinyin_ime->py_pos[letter_calc] = offset_sum; + + offset_count = 1; + } + } +} + +static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + const lv_pinyin_dict_t * cpHZ; + uint8_t index, len = 0, offset; + volatile uint8_t count = 0; + + if(*py_str == '\0') return NULL; + if(*py_str == 'i') return NULL; + if(*py_str == 'u') return NULL; + if(*py_str == 'v') return NULL; + if(*py_str == ' ') return NULL; + + offset = py_str[0] - 'a'; + len = lv_strlen(py_str); + + cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]]; + count = pinyin_ime->py_num[offset]; + + while(count--) { + for(index = 0; index < len; index++) { + if(*(py_str + index) != *((cpHZ->py) + index)) { + break; + } + } + + // perfect match + if(len == 1 || index == len) { + // The Chinese character in UTF-8 encoding format is 3 bytes + * cand_num = lv_strlen((const char *)(cpHZ->py_mb)) / 3; + return (char *)(cpHZ->py_mb); + } + cpHZ++; + } + return NULL; +} + +static void pinyin_ime_clear_data(lv_obj_t * obj) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + +#if LV_IME_PINYIN_USE_K9_MODE + if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) { + pinyin_ime->k9_input_str_len = 0; + pinyin_ime->k9_py_ll_pos = 0; + pinyin_ime->k9_legal_py_count = 0; + lv_memzero(pinyin_ime->k9_input_str, LV_IME_PINYIN_K9_MAX_INPUT); + lv_memzero(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { + lv_strlcpy(lv_pinyin_k9_cand_str[i], " ", LV_IME_PINYIN_K9_MAX_INPUT); + } + lv_strlcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0", LV_IME_PINYIN_K9_MAX_INPUT); + lv_strlcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0", LV_IME_PINYIN_K9_MAX_INPUT); + lv_ll_clear(&pinyin_ime->k9_legal_py_ll); + lv_buttonmatrix_set_map(pinyin_ime->kb, (const char **)lv_btnm_def_pinyin_k9_map); + } +#endif + + pinyin_ime->ta_count = 0; + for(uint8_t i = 0; i < LV_IME_PINYIN_CAND_TEXT_NUM; i++) { + lv_memset(lv_pinyin_cand_str[i], 0x00, sizeof(lv_pinyin_cand_str[i])); + lv_pinyin_cand_str[i][0] = ' '; + } + lv_memzero(pinyin_ime->input_char, sizeof(pinyin_ime->input_char)); + + lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN); +} + +#if LV_IME_PINYIN_USE_K9_MODE +static void pinyin_k9_init_data(lv_obj_t * obj) +{ + LV_UNUSED(obj); + + uint16_t py_str_i = 0; + uint16_t btnm_i = 0; + for(btnm_i = 19; btnm_i < (LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21); btnm_i++) { + if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM) { + lv_strlcpy(lv_pinyin_k9_cand_str[py_str_i], LV_SYMBOL_RIGHT"\0", LV_IME_PINYIN_K9_MAX_INPUT); + } + else if(py_str_i == LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1) { + lv_strlcpy(lv_pinyin_k9_cand_str[py_str_i], "\0", LV_IME_PINYIN_K9_MAX_INPUT); + } + else { + lv_strlcpy(lv_pinyin_k9_cand_str[py_str_i], " \0", LV_IME_PINYIN_K9_MAX_INPUT); + } + + lv_btnm_def_pinyin_k9_map[btnm_i] = lv_pinyin_k9_cand_str[py_str_i]; + py_str_i++; + } + + default_kb_ctrl_k9_map[0] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[1] = LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CLICK_TRIG | 1; + default_kb_ctrl_k9_map[4] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[5] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[9] = LV_KEYBOARD_CTRL_BUTTON_FLAGS | 1; + default_kb_ctrl_k9_map[10] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[14] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[15] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; + default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = LV_BUTTONMATRIX_CTRL_CHECKED | 1; +} + +static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char * py9_map[]) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + uint16_t len = lv_strlen(k9_input); + + if((len == 0) || (len >= LV_IME_PINYIN_K9_MAX_INPUT)) { + return; + } + + char py_comp[LV_IME_PINYIN_K9_MAX_INPUT] = {0}; + int mark[LV_IME_PINYIN_K9_MAX_INPUT] = {0}; + int index = 0; + int flag = 0; + uint16_t count = 0; + + uint32_t ll_len = 0; + ime_pinyin_k9_py_str_t * ll_index = NULL; + + ll_len = lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); + ll_index = lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + + while(index != -1) { + if(index == len) { + if(pinyin_k9_is_valid_py(obj, py_comp)) { + if((count >= ll_len) || (ll_len == 0)) { + ll_index = lv_ll_ins_tail(&pinyin_ime->k9_legal_py_ll); + lv_strlcpy(ll_index->py_str, py_comp, sizeof(ll_index->py_str)); + } + else if((count < ll_len)) { + lv_strlcpy(ll_index->py_str, py_comp, sizeof(ll_index->py_str)); + ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); + } + count++; + } + index--; + } + else { + flag = mark[index]; + if((size_t)flag < lv_strlen(py9_map[k9_input[index] - '2'])) { + py_comp[index] = py9_map[k9_input[index] - '2'][flag]; + mark[index] = mark[index] + 1; + index++; + } + else { + mark[index] = 0; + index--; + } + } + } + + if(count > 0) { + pinyin_ime->ta_count++; + pinyin_ime->k9_legal_py_count = count; + } +} + +/*true: visible; false: not visible*/ +static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + const lv_pinyin_dict_t * cpHZ = NULL; + uint8_t index = 0, len = 0, offset = 0; + volatile uint8_t count = 0; + + if(*py_str == '\0') return false; + if(*py_str == 'i') return false; + if(*py_str == 'u') return false; + if(*py_str == 'v') return false; + + offset = py_str[0] - 'a'; + len = lv_strlen(py_str); + + cpHZ = &pinyin_ime->dict[pinyin_ime->py_pos[offset]]; + count = pinyin_ime->py_num[offset]; + + while(count--) { + for(index = 0; index < len; index++) { + if(*(py_str + index) != *((cpHZ->py) + index)) { + break; + } + } + + // perfect match + if(len == 1 || index == len) { + return true; + } + cpHZ++; + } + return false; +} + +static void pinyin_k9_fill_cand(lv_obj_t * obj) +{ + uint16_t index = 0, tmp_len = 0; + ime_pinyin_k9_py_str_t * ll_index = NULL; + + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + tmp_len = pinyin_ime->k9_legal_py_count; + + if(tmp_len != cand_len) { + lv_memzero(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + lv_strlcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0", LV_IME_PINYIN_K9_MAX_INPUT); + lv_strlcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0", LV_IME_PINYIN_K9_MAX_INPUT); + cand_len = tmp_len; + } + + ll_index = lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + lv_strlcpy(pinyin_ime->input_char, ll_index->py_str, sizeof(pinyin_ime->input_char)); + + for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { + lv_strlcpy(lv_pinyin_k9_cand_str[i], " ", LV_IME_PINYIN_K9_MAX_INPUT); + } + + while(ll_index) { + if(index >= LV_IME_PINYIN_K9_CAND_TEXT_NUM) + break; + + if(index < pinyin_ime->k9_legal_py_count) { + lv_strlcpy(lv_pinyin_k9_cand_str[index], ll_index->py_str, LV_IME_PINYIN_K9_MAX_INPUT); + } + + ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + index++; + } + pinyin_ime->k9_py_ll_pos = index; + + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + for(index = 0; index < pinyin_ime->k9_input_str_len; index++) { + lv_textarea_delete_char(ta); + } + pinyin_ime->k9_input_str_len = lv_strlen(pinyin_ime->input_char); + lv_textarea_add_text(ta, pinyin_ime->input_char); +} + +static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir) +{ + lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj; + + lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb); + uint16_t ll_len = lv_ll_get_len(&pinyin_ime->k9_legal_py_ll); + + if((ll_len > LV_IME_PINYIN_K9_CAND_TEXT_NUM) && (pinyin_ime->k9_legal_py_count > LV_IME_PINYIN_K9_CAND_TEXT_NUM)) { + ime_pinyin_k9_py_str_t * ll_index = NULL; + int count = 0; + + ll_index = lv_ll_get_head(&pinyin_ime->k9_legal_py_ll); + while(ll_index) { + if(count >= pinyin_ime->k9_py_ll_pos) break; + + ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + count++; + } + + if((NULL == ll_index) && (dir == 1)) return; + + lv_memzero(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str)); + lv_strlcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0", LV_IME_PINYIN_K9_MAX_INPUT); + lv_strlcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0", LV_IME_PINYIN_K9_MAX_INPUT); + + // next page + if(dir == 1) { + for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { + lv_strlcpy(lv_pinyin_k9_cand_str[i], " ", LV_IME_PINYIN_K9_MAX_INPUT); + } + + count = 0; + while(ll_index) { + if(count >= (LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1)) + break; + + lv_strlcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str, LV_IME_PINYIN_K9_MAX_INPUT); + ll_index = lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/ + count++; + } + pinyin_ime->k9_py_ll_pos += count - 1; + + } + // previous page + else { + for(uint8_t i = 0; i < LV_IME_PINYIN_K9_CAND_TEXT_NUM; i++) { + lv_strlcpy(lv_pinyin_k9_cand_str[i], " ", LV_IME_PINYIN_K9_MAX_INPUT); + } + count = LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1; + ll_index = lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); + while(ll_index) { + if(count < 0) break; + + lv_strlcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str, LV_IME_PINYIN_K9_MAX_INPUT); + ll_index = lv_ll_get_prev(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the previous list*/ + count--; + } + + if(pinyin_ime->k9_py_ll_pos > LV_IME_PINYIN_K9_CAND_TEXT_NUM) + pinyin_ime->k9_py_ll_pos -= 1; + } + + lv_textarea_set_cursor_pos(ta, LV_TEXTAREA_CURSOR_LAST); + } +} + +#endif /*LV_IME_PINYIN_USE_K9_MODE*/ + +#endif /*LV_USE_IME_PINYIN*/ diff --git a/inc/lvgl/src/widgets/ime/lv_ime_pinyin.h b/inc/lvgl/src/widgets/ime/lv_ime_pinyin.h new file mode 100644 index 0000000..0509b21 --- /dev/null +++ b/inc/lvgl/src/widgets/ime/lv_ime_pinyin.h @@ -0,0 +1,121 @@ +/** + * @file lv_ime_pinyin.h + * + */ +#ifndef LV_IME_PINYIN_H +#define LV_IME_PINYIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" + +#if LV_USE_IME_PINYIN != 0 + +/********************* + * DEFINES + *********************/ +#define LV_IME_PINYIN_K9_MAX_INPUT 7 + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_IME_PINYIN_MODE_K26, + LV_IME_PINYIN_MODE_K9, + LV_IME_PINYIN_MODE_K9_NUMBER, +} lv_ime_pinyin_mode_t; + +/*Data of pinyin_dict*/ +typedef struct { + const char * const py; + const char * const py_mb; +} lv_pinyin_dict_t; + +/*Data of 9-key input(k9) mode*/ +typedef struct { + char py_str[7]; +} ime_pinyin_k9_py_str_t; + +/*********************** + * GLOBAL VARIABLES + ***********************/ + +extern const lv_obj_class_t lv_ime_pinyin_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +lv_obj_t * lv_ime_pinyin_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the keyboard of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @param kb pointer to a Pinyin input method keyboard + */ +void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb); + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @param dict pointer to a Pinyin input method dictionary + */ +void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict); + +/** + * Set mode, 26-key input(k26) or 9-key input(k9). + * @param obj pointer to a Pinyin input method object + * @param mode the mode from 'lv_ime_pinyin_mode_t' + */ +void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode); + +/*===================== + * Getter functions + *====================*/ + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin IME object + * @return pointer to the Pinyin IME keyboard + */ +lv_obj_t * lv_ime_pinyin_get_kb(lv_obj_t * obj); + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @return pointer to the Pinyin input method candidate panel + */ +lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj); + +/** + * Set the dictionary of Pinyin input method. + * @param obj pointer to a Pinyin input method object + * @return pointer to the Pinyin input method dictionary + */ +const lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_IME_PINYIN*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IME_PINYIN_H*/ diff --git a/inc/lvgl/src/widgets/ime/lv_ime_pinyin_private.h b/inc/lvgl/src/widgets/ime/lv_ime_pinyin_private.h new file mode 100644 index 0000000..f422438 --- /dev/null +++ b/inc/lvgl/src/widgets/ime/lv_ime_pinyin_private.h @@ -0,0 +1,68 @@ +/** + * @file lv_ime_pinyin_private.h + * + */ + +#ifndef LV_IME_PINYIN_PRIVATE_H +#define LV_IME_PINYIN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_ime_pinyin.h" + +#if LV_USE_IME_PINYIN != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/*Data of lv_ime_pinyin*/ +struct _lv_ime_pinyin_t { + lv_obj_t obj; + lv_obj_t * kb; + lv_obj_t * cand_panel; + const lv_pinyin_dict_t * dict; + lv_ll_t k9_legal_py_ll; + char * cand_str; /* Candidate string */ + char input_char[16]; /* Input box character */ +#if LV_IME_PINYIN_USE_K9_MODE + char k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT + 1]; /* 9-key input(k9) mode input string */ + uint16_t k9_py_ll_pos; /* Current pinyin map pages(k9) */ + uint16_t k9_legal_py_count; /* Count of legal Pinyin numbers(k9) */ + uint16_t k9_input_str_len; /* 9-key input(k9) mode input string max len */ +#endif + uint16_t ta_count; /* The number of characters entered in the text box this time */ + uint16_t cand_num; /* Number of candidates */ + uint16_t py_page; /* Current pinyin map pages(k26) */ + uint16_t py_num[26]; /* Number and length of Pinyin */ + uint16_t py_pos[26]; /* Pinyin position */ + lv_ime_pinyin_mode_t mode; /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_IME_PINYIN != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_IME_PINYIN_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/keyboard/lv_keyboard.c b/inc/lvgl/src/widgets/keyboard/lv_keyboard.c new file mode 100644 index 0000000..a581828 --- /dev/null +++ b/inc/lvgl/src/widgets/keyboard/lv_keyboard.c @@ -0,0 +1,501 @@ + +/** + * @file lv_keyboard.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_keyboard_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_KEYBOARD + +#include "../textarea/lv_textarea.h" +#include "../../misc/lv_assert.h" +#include "../../stdlib/lv_string.h" + +/*Testing of dependencies*/ +#if LV_USE_BUTTONMATRIX == 0 + #error "lv_buttonmatrix is required. Enable it in lv_conf.h (LV_USE_BUTTONMATRIX 1) " +#endif + +#if LV_USE_TEXTAREA == 0 + #error "lv_textarea is required. Enable it in lv_conf.h (LV_USE_TEXTAREA 1) " +#endif + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_keyboard_class) +#define LV_KB_BTN(width) LV_BUTTONMATRIX_CTRL_POPOVER | width + +#ifndef LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_LOWER + #define LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_LOWER "abc" +#endif +#ifndef LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_UPPER + #define LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_UPPER "ABC" +#endif +#ifndef LV_KEYBOARD_CTRL_BUTTON_MODE_SPECIAL + #define LV_KEYBOARD_CTRL_BUTTON_MODE_SPECIAL "1#" +#endif +#ifndef LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_ARABIC + #define LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_ARABIC "أب" +#endif + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_keyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +static void lv_keyboard_update_map(lv_obj_t * obj); + +static void lv_keyboard_update_ctrl_map(lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_keyboard_properties[] = { + { + .id = LV_PROPERTY_KEYBOARD_TEXTAREA, + .setter = lv_keyboard_set_textarea, + .getter = lv_keyboard_get_textarea, + }, + { + .id = LV_PROPERTY_KEYBOARD_MODE, + .setter = lv_keyboard_set_mode, + .getter = lv_keyboard_get_mode, + }, + { + .id = LV_PROPERTY_KEYBOARD_POPOVERS, + .setter = lv_keyboard_set_popovers, + .getter = lv_keyboard_get_popovers, + }, + { + .id = LV_PROPERTY_KEYBOARD_SELECTED_BUTTON, + .setter = lv_buttonmatrix_set_selected_button, + .getter = lv_keyboard_get_selected_button, + }, +}; +#endif + +const lv_obj_class_t lv_keyboard_class = { + .constructor_cb = lv_keyboard_constructor, + .width_def = LV_PCT(100), + .height_def = LV_PCT(50), + .instance_size = sizeof(lv_keyboard_t), + .editable = 1, + .base_class = &lv_buttonmatrix_class, + .name = "lv_keyboard", + LV_PROPERTY_CLASS_FIELDS(keyboard, KEYBOARD) +}; + +static const char * const default_kb_map_lc[] = {LV_KEYBOARD_CTRL_BUTTON_MODE_SPECIAL, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n", + LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_UPPER, "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n", + LV_SYMBOL_KEYBOARD, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_ARABIC, +#endif + LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" + }; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_lc_map[] = { + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 5, LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_BUTTONMATRIX_CTRL_CHECKED | 7, + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 6, LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_BUTTONMATRIX_CTRL_CHECKED | 7, + LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#endif + LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 +}; + +static const char * const default_kb_map_uc[] = {LV_KEYBOARD_CTRL_BUTTON_MODE_SPECIAL, "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", LV_SYMBOL_BACKSPACE, "\n", + LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_LOWER, "A", "S", "D", "F", "G", "H", "J", "K", "L", LV_SYMBOL_NEW_LINE, "\n", + "_", "-", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n", + LV_SYMBOL_CLOSE, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_ARABIC, +#endif + LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" + }; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_uc_map[] = { + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 5, LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_KB_BTN(4), LV_BUTTONMATRIX_CTRL_CHECKED | 7, + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 6, LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_KB_BTN(3), LV_BUTTONMATRIX_CTRL_CHECKED | 7, + LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | LV_KB_BTN(1), + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#endif + LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 +}; + +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 +static const char * const default_kb_map_ar[] = { + LV_KEYBOARD_CTRL_BUTTON_MODE_SPECIAL, "ض", "ص", "ث", "ق", "ف", "غ", "ع", "ه", "خ", "ح", "ج", "\n", + "ش", "س", "ي", "ب", "ل", "ا", "ت", "ن", "م", "ك", "ط", LV_SYMBOL_BACKSPACE, "\n", + "ذ", "ء", "ؤ", "ر", "ى", "ة", "و", "ز", "ظ", "د", "ز", "ظ", "د", "\n", + LV_SYMBOL_CLOSE, LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_LOWER, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_NEW_LINE, LV_SYMBOL_OK, "" +}; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_ar_map[] = { + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, 2, 6, 2, 3, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 +}; +#endif + +static const char * const default_kb_map_spec[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", LV_SYMBOL_BACKSPACE, "\n", + LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_LOWER, "+", "&", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", + "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", + LV_SYMBOL_KEYBOARD, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_ARABIC, +#endif + LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, "" + }; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_spec_map[] = { + LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_BUTTONMATRIX_CTRL_CHECKED | 2, + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), + LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), LV_KB_BTN(1), + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, +#endif + LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2 +}; + +static const char * const default_kb_map_num[] = {"1", "2", "3", LV_SYMBOL_KEYBOARD, "\n", + "4", "5", "6", LV_SYMBOL_OK, "\n", + "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", + "+/-", "0", ".", LV_SYMBOL_LEFT, LV_SYMBOL_RIGHT, "" + }; + +static const lv_buttonmatrix_ctrl_t default_kb_ctrl_num_map[] = { + 1, 1, 1, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, + 1, 1, 1, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2, + 1, 1, 1, 2, + 1, 1, 1, 1, 1 +}; + +static const char * const * kb_map[10] = { + default_kb_map_lc, + default_kb_map_uc, + default_kb_map_spec, + default_kb_map_num, + default_kb_map_lc, + default_kb_map_lc, + default_kb_map_lc, + default_kb_map_lc, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + default_kb_map_ar, +#endif + NULL +}; +static const lv_buttonmatrix_ctrl_t * kb_ctrl[10] = { + default_kb_ctrl_lc_map, + default_kb_ctrl_uc_map, + default_kb_ctrl_spec_map, + default_kb_ctrl_num_map, + default_kb_ctrl_lc_map, + default_kb_ctrl_lc_map, + default_kb_ctrl_lc_map, + default_kb_ctrl_lc_map, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + default_kb_ctrl_ar_map, +#endif + NULL +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_keyboard_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_keyboard_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_keyboard_set_textarea(lv_obj_t * obj, lv_obj_t * ta) +{ + if(ta) { + LV_ASSERT_OBJ(ta, &lv_textarea_class); + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + + /*Hide the cursor of the old Text area if cursor management is enabled*/ + if(keyboard->ta) { + lv_obj_remove_state(keyboard->ta, LV_STATE_FOCUSED); + } + + keyboard->ta = ta; + + /*Show the cursor of the new Text area if cursor management is enabled*/ + if(keyboard->ta) { + lv_obj_add_state(keyboard->ta, LV_STATE_FOCUSED); + } +} + +void lv_keyboard_set_mode(lv_obj_t * obj, lv_keyboard_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + if(keyboard->mode == mode) return; + + keyboard->mode = mode; + lv_keyboard_update_map(obj); +} + +void lv_keyboard_set_popovers(lv_obj_t * obj, bool en) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + + if(keyboard->popovers == en) { + return; + } + + keyboard->popovers = en; + lv_keyboard_update_ctrl_map(obj); +} + +void lv_keyboard_set_map(lv_obj_t * obj, lv_keyboard_mode_t mode, const char * const map[], + const lv_buttonmatrix_ctrl_t ctrl_map[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + kb_map[mode] = map; + kb_ctrl[mode] = ctrl_map; + lv_keyboard_update_map(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + return keyboard->ta; +} + +lv_keyboard_mode_t lv_keyboard_get_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + return keyboard->mode; +} + +bool lv_keyboard_get_popovers(const lv_obj_t * obj) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + return keyboard->popovers; +} + +/*===================== + * Other functions + *====================*/ + +void lv_keyboard_def_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + uint32_t btn_id = lv_buttonmatrix_get_selected_button(obj); + if(btn_id == LV_BUTTONMATRIX_BUTTON_NONE) return; + + const char * txt = lv_buttonmatrix_get_button_text(obj, btn_id); + if(txt == NULL) return; + + if(lv_strcmp(txt, LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_LOWER) == 0) { + keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER; + lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_LOWER]); + lv_keyboard_update_ctrl_map(obj); + return; + } +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + else if(lv_strcmp(txt, LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_ARABIC) == 0) { + keyboard->mode = LV_KEYBOARD_MODE_TEXT_ARABIC; + lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_ARABIC]); + lv_keyboard_update_ctrl_map(obj); + return; + } +#endif + else if(lv_strcmp(txt, LV_KEYBOARD_CTRL_BUTTON_MODE_TEXT_UPPER) == 0) { + keyboard->mode = LV_KEYBOARD_MODE_TEXT_UPPER; + lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_TEXT_UPPER]); + lv_keyboard_update_ctrl_map(obj); + return; + } + else if(lv_strcmp(txt, LV_KEYBOARD_CTRL_BUTTON_MODE_SPECIAL) == 0) { + keyboard->mode = LV_KEYBOARD_MODE_SPECIAL; + lv_buttonmatrix_set_map(obj, kb_map[LV_KEYBOARD_MODE_SPECIAL]); + lv_keyboard_update_ctrl_map(obj); + return; + } + else if(lv_strcmp(txt, LV_SYMBOL_CLOSE) == 0 || lv_strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) { + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_CANCEL, NULL); + if(res != LV_RESULT_OK) return; + + if(keyboard->ta) { + res = lv_obj_send_event(keyboard->ta, LV_EVENT_CANCEL, NULL); + if(res != LV_RESULT_OK) return; + } + return; + } + else if(lv_strcmp(txt, LV_SYMBOL_OK) == 0) { + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_READY, NULL); + if(res != LV_RESULT_OK) return; + + if(keyboard->ta) { + res = lv_obj_send_event(keyboard->ta, LV_EVENT_READY, NULL); + if(res != LV_RESULT_OK) return; + } + return; + } + + /*Add the characters to the text area if set*/ + if(keyboard->ta == NULL) return; + + if(lv_strcmp(txt, "Enter") == 0 || lv_strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) { + lv_textarea_add_char(keyboard->ta, '\n'); + if(lv_textarea_get_one_line(keyboard->ta)) { + lv_result_t res = lv_obj_send_event(keyboard->ta, LV_EVENT_READY, NULL); + if(res != LV_RESULT_OK) return; + } + } + else if(lv_strcmp(txt, LV_SYMBOL_LEFT) == 0) { + lv_textarea_cursor_left(keyboard->ta); + } + else if(lv_strcmp(txt, LV_SYMBOL_RIGHT) == 0) { + lv_textarea_cursor_right(keyboard->ta); + } + else if(lv_strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) { + lv_textarea_delete_char(keyboard->ta); + } + else if(lv_strcmp(txt, "+/-") == 0) { + uint32_t cur = lv_textarea_get_cursor_pos(keyboard->ta); + const char * ta_txt = lv_textarea_get_text(keyboard->ta); + if(ta_txt[0] == '-') { + lv_textarea_set_cursor_pos(keyboard->ta, 1); + lv_textarea_delete_char(keyboard->ta); + lv_textarea_add_char(keyboard->ta, '+'); + lv_textarea_set_cursor_pos(keyboard->ta, cur); + } + else if(ta_txt[0] == '+') { + lv_textarea_set_cursor_pos(keyboard->ta, 1); + lv_textarea_delete_char(keyboard->ta); + lv_textarea_add_char(keyboard->ta, '-'); + lv_textarea_set_cursor_pos(keyboard->ta, cur); + } + else { + lv_textarea_set_cursor_pos(keyboard->ta, 0); + lv_textarea_add_char(keyboard->ta, '-'); + lv_textarea_set_cursor_pos(keyboard->ta, cur + 1); + } + } + else { + lv_textarea_add_text(keyboard->ta, txt); + } +} + +const char * const * lv_keyboard_get_map_array(const lv_obj_t * kb) +{ + return lv_buttonmatrix_get_map(kb); +} + +uint32_t lv_keyboard_get_selected_button(const lv_obj_t * obj) +{ + return lv_buttonmatrix_get_selected_button(obj); +} + +const char * lv_keyboard_get_button_text(const lv_obj_t * obj, uint32_t btn_id) +{ + return lv_buttonmatrix_get_button_text(obj, btn_id); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_keyboard_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICK_FOCUSABLE); + + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + keyboard->ta = NULL; + keyboard->mode = LV_KEYBOARD_MODE_TEXT_LOWER; + keyboard->popovers = 0; + + lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0); + lv_obj_add_event_cb(obj, lv_keyboard_def_event_cb, LV_EVENT_VALUE_CHANGED, NULL); + lv_obj_set_style_base_dir(obj, LV_BASE_DIR_LTR, 0); + + lv_keyboard_update_map(obj); +} + +/** + * Update the key and control map for the current mode + * @param obj pointer to a keyboard object + */ +static void lv_keyboard_update_map(lv_obj_t * obj) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + lv_buttonmatrix_set_map(obj, kb_map[keyboard->mode]); + lv_keyboard_update_ctrl_map(obj); +} + +/** + * Update the control map for the current mode + * @param obj pointer to a keyboard object + */ +static void lv_keyboard_update_ctrl_map(lv_obj_t * obj) +{ + lv_keyboard_t * keyboard = (lv_keyboard_t *)obj; + + if(keyboard->popovers) { + /*Apply the current control map (already includes LV_BUTTONMATRIX_CTRL_POPOVER flags)*/ + lv_buttonmatrix_set_ctrl_map(obj, kb_ctrl[keyboard->mode]); + } + else { + /*Make a copy of the current control map*/ + lv_buttonmatrix_t * btnm = (lv_buttonmatrix_t *)obj; + lv_buttonmatrix_ctrl_t * ctrl_map = lv_malloc(btnm->btn_cnt * sizeof(lv_buttonmatrix_ctrl_t)); + lv_memcpy(ctrl_map, kb_ctrl[keyboard->mode], sizeof(lv_buttonmatrix_ctrl_t) * btnm->btn_cnt); + + /*Remove all LV_BUTTONMATRIX_CTRL_POPOVER flags*/ + uint32_t i; + for(i = 0; i < btnm->btn_cnt; i++) { + ctrl_map[i] &= (~LV_BUTTONMATRIX_CTRL_POPOVER); + } + + /*Apply new control map and clean up*/ + lv_buttonmatrix_set_ctrl_map(obj, ctrl_map); + lv_free(ctrl_map); + } +} + +#endif /*LV_USE_KEYBOARD*/ diff --git a/inc/lvgl/src/widgets/keyboard/lv_keyboard.h b/inc/lvgl/src/widgets/keyboard/lv_keyboard.h new file mode 100644 index 0000000..85c3532 --- /dev/null +++ b/inc/lvgl/src/widgets/keyboard/lv_keyboard.h @@ -0,0 +1,175 @@ +/** + * @file lv_keyboard.h + * + */ + +#ifndef LV_KEYBOARD_H +#define LV_KEYBOARD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../buttonmatrix/lv_buttonmatrix.h" + +#if LV_USE_KEYBOARD + +/********************* + * DEFINES + *********************/ +#define LV_KEYBOARD_CTRL_BUTTON_FLAGS (LV_BUTTONMATRIX_CTRL_NO_REPEAT | LV_BUTTONMATRIX_CTRL_CLICK_TRIG | LV_BUTTONMATRIX_CTRL_CHECKED) + +/********************** + * TYPEDEFS + **********************/ + +/** Current keyboard mode.*/ +typedef enum { + LV_KEYBOARD_MODE_TEXT_LOWER, + LV_KEYBOARD_MODE_TEXT_UPPER, + LV_KEYBOARD_MODE_SPECIAL, + LV_KEYBOARD_MODE_NUMBER, + LV_KEYBOARD_MODE_USER_1, + LV_KEYBOARD_MODE_USER_2, + LV_KEYBOARD_MODE_USER_3, + LV_KEYBOARD_MODE_USER_4, +#if LV_USE_ARABIC_PERSIAN_CHARS == 1 + LV_KEYBOARD_MODE_TEXT_ARABIC +#endif +} lv_keyboard_mode_t; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_keyboard_id_t { + LV_PROPERTY_ID(KEYBOARD, TEXTAREA, LV_PROPERTY_TYPE_OBJ, 0), + LV_PROPERTY_ID(KEYBOARD, MODE, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(KEYBOARD, POPOVERS, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(KEYBOARD, SELECTED_BUTTON, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_KEYBOARD_END, +}; +#endif + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_keyboard_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a Keyboard object + * @param parent pointer to an object, it will be the parent of the new keyboard + * @return pointer to the created keyboard object + */ +lv_obj_t * lv_keyboard_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Assign a text area to the keyboard. Pressed characters will be inserted there. + * @param kb pointer to a keyboard object + * @param ta pointer to a text area object to write into + */ +void lv_keyboard_set_textarea(lv_obj_t * kb, lv_obj_t * ta); + +/** + * Set a new mode (e.g., text, number, special characters). + * @param kb pointer to a keyboard object + * @param mode the desired mode (see 'lv_keyboard_mode_t') + */ +void lv_keyboard_set_mode(lv_obj_t * kb, lv_keyboard_mode_t mode); + +/** + * Enable or disable popovers showing button titles on press. + * @param kb pointer to a keyboard object + * @param en true to enable popovers; false to disable + */ +void lv_keyboard_set_popovers(lv_obj_t * kb, bool en); + +/** + * Set a custom button map for the keyboard. + * @param kb pointer to a keyboard object + * @param mode the mode to assign the new map to (see 'lv_keyboard_mode_t') + * @param map pointer to a string array describing the button map + * see 'lv_buttonmatrix_set_map()' for more details + * @param ctrl_map pointer to the control map. See 'lv_buttonmatrix_set_ctrl_map()' + + */ +void lv_keyboard_set_map(lv_obj_t * kb, lv_keyboard_mode_t mode, const char * const map[], + const lv_buttonmatrix_ctrl_t ctrl_map[]); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text area currently assigned to the keyboard. + * @param kb pointer to a keyboard object + * @return pointer to the assigned text area object + */ +lv_obj_t * lv_keyboard_get_textarea(const lv_obj_t * kb); + +/** + * Get the current mode of the keyboard. + * @param kb pointer to a keyboard object + * @return the current mode (see 'lv_keyboard_mode_t') + */ +lv_keyboard_mode_t lv_keyboard_get_mode(const lv_obj_t * kb); + +/** + * Check whether popovers are enabled on the keyboard. + * @param obj pointer to a keyboard object + * @return true if popovers are enabled; false otherwise + */ +bool lv_keyboard_get_popovers(const lv_obj_t * obj); + +/** + * Get the current button map of the keyboard. + * @param kb pointer to a keyboard object + * @return pointer to the map array + */ +const char * const * lv_keyboard_get_map_array(const lv_obj_t * kb); + +/** + * Get the index of the last selected button (pressed, released, focused, etc.). + * Useful in the `event_cb` to retrieve button text or properties. + * @param obj pointer to a keyboard object + * @return index of the last interacted button + * returns LV_BUTTONMATRIX_BUTTON_NONE if not set + */ +uint32_t lv_keyboard_get_selected_button(const lv_obj_t * obj); + +/** + * Get the text of a button by index. + * @param obj pointer to a keyboard object + * @param btn_id index of the button (excluding newline characters) + * @return pointer to the text of the button + */ +const char * lv_keyboard_get_button_text(const lv_obj_t * obj, uint32_t btn_id); + +/*===================== + * Other functions + *====================*/ + +/** + * Default keyboard event callback to handle button presses. + * Adds characters to the text area and switches map if needed. + * If a custom `event_cb` is used, this function can be called within it. + * @param e the triggering event + */ +void lv_keyboard_def_event_cb(lv_event_t * e); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_KEYBOARD*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_KEYBOARD_H*/ diff --git a/inc/lvgl/src/widgets/keyboard/lv_keyboard_private.h b/inc/lvgl/src/widgets/keyboard/lv_keyboard_private.h new file mode 100644 index 0000000..3de0273 --- /dev/null +++ b/inc/lvgl/src/widgets/keyboard/lv_keyboard_private.h @@ -0,0 +1,53 @@ +/** + * @file lv_keyboard_private.h + * + */ + +#ifndef LV_KEYBOARD_PRIVATE_H +#define LV_KEYBOARD_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../buttonmatrix/lv_buttonmatrix_private.h" +#include "lv_keyboard.h" + +#if LV_USE_KEYBOARD + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Data of keyboard */ +struct _lv_keyboard_t { + lv_buttonmatrix_t btnm; + lv_obj_t * ta; /**< Pointer to the assigned text area */ + lv_keyboard_mode_t mode; /**< Key map type */ + uint8_t popovers : 1; /**< Show button titles in popovers on press */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_KEYBOARD */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_KEYBOARD_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/label/lv_label.c b/inc/lvgl/src/widgets/label/lv_label.c new file mode 100644 index 0000000..d550043 --- /dev/null +++ b/inc/lvgl/src/widgets/label/lv_label.c @@ -0,0 +1,1491 @@ +/** + * @file lv_label.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_label_private.h" +#include "../../misc/lv_area_private.h" +#include "../../misc/lv_anim_private.h" +#include "../../draw/lv_draw_label_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_LABEL != 0 +#include "../../core/lv_obj_private.h" +#include "../../misc/lv_assert.h" +#include "../../core/lv_group.h" +#include "../../display/lv_display.h" +#include "../../draw/lv_draw_private.h" +#include "../../misc/lv_color.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_bidi_private.h" +#include "../../misc/lv_text_ap.h" +#include "../../misc/lv_text_private.h" +#include "../../stdlib/lv_sprintf.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_observer_private.h" +#include "../../others/translation/lv_translation.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_label_class) + +#define LV_LABEL_DEF_SCROLL_SPEED lv_anim_speed_clamped(40, 300, 10000) +#define LV_LABEL_SCROLL_DELAY 300 +#define LV_LABEL_DOT_BEGIN_INV 0xFFFFFFFF +#define LV_LABEL_HINT_HEIGHT_LIMIT 1024 /*Enable "hint" to buffer info about labels larger than this. (Speed up drawing)*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_label_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static void set_text_internal(lv_obj_t * obj, const char * text); +static void remove_translation_tag(lv_obj_t * obj); +static void lv_label_refr_text(lv_obj_t * obj); +static void update_layout_completed_cb(lv_event_t * e); +static void lv_label_revert_dots(lv_obj_t * label); +static void lv_label_set_dots(lv_obj_t * label, uint32_t dot_begin); + +static void set_ofs_x_anim(void * obj, int32_t v); +static void set_ofs_y_anim(void * obj, int32_t v); +static size_t get_text_length(const char * text); +static void copy_text_to_label(lv_label_t * label, const char * text); +static lv_text_flag_t get_label_flags(lv_label_t * label); +static void calculate_x_coordinate(int32_t * x, const lv_text_align_t align, const char * txt, + uint32_t length, const lv_font_t * font, lv_area_t * txt_coords, lv_text_attributes_t * attributes); +static void lv_label_mark_need_refr_text(lv_obj_t * obj); +#if LV_USE_OBSERVER + static void label_text_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_label_properties[] = { + { + .id = LV_PROPERTY_LABEL_TEXT, + .setter = lv_label_set_text, + .getter = lv_label_get_text, + }, + { + .id = LV_PROPERTY_LABEL_LONG_MODE, + .setter = lv_label_set_long_mode, + .getter = lv_label_get_long_mode, + }, + { + .id = LV_PROPERTY_LABEL_TEXT_SELECTION_START, + .setter = lv_label_set_text_selection_start, + .getter = lv_label_get_text_selection_start, + }, + { + .id = LV_PROPERTY_LABEL_TEXT_SELECTION_END, + .setter = lv_label_set_text_selection_end, + .getter = lv_label_get_text_selection_end, + }, +}; +#endif + +const lv_obj_class_t lv_label_class = { + .constructor_cb = lv_label_constructor, + .destructor_cb = lv_label_destructor, + .event_cb = lv_label_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_label_t), + .base_class = &lv_obj_class, + .name = "lv_label", + LV_PROPERTY_CLASS_FIELDS(label, LABEL) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_label_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_label_set_text(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + remove_translation_tag(obj); + set_text_internal(obj, text); +} + +void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) +{ + va_list args; + va_start(args, fmt); + lv_label_set_text_vfmt(obj, fmt, args); + va_end(args); +} + +void lv_label_set_text_vfmt(lv_obj_t * obj, const char * fmt, va_list args) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(fmt); + + remove_translation_tag(obj); + lv_label_t * label = (lv_label_t *)obj; + + lv_label_revert_dots(obj); + + /*If text is NULL then refresh*/ + if(fmt == NULL) { + lv_label_mark_need_refr_text(obj); + return; + } + + if(label->text != NULL && label->static_txt == 0) { + lv_free(label->text); + label->text = NULL; + } + + label->text = lv_text_set_text_vfmt(fmt, args); + label->static_txt = 0; /*Now the text is dynamically allocated*/ + + lv_label_mark_need_refr_text(obj); +} + +void lv_label_set_text_static(lv_obj_t * obj, const char * text) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + + remove_translation_tag(obj); + if(label->static_txt == 0 && label->text != NULL) { + lv_free(label->text); + label->text = NULL; + } + + if(text != NULL) { + label->static_txt = 1; + label->text = (char *)text; + } + + lv_label_mark_need_refr_text(obj); +} + +#if LV_USE_TRANSLATION +void lv_label_set_translation_tag(lv_obj_t * obj, const char * tag) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + if(!tag || tag[0] == '\0') { + return; + } + char * new_tag = lv_strdup(tag); + LV_ASSERT_MALLOC(new_tag); + if(!new_tag) { + LV_LOG_WARN("Failed to allocate memory for new tag"); + return; + } + if(label->translation_tag) { + lv_free(label->translation_tag); + } + label->translation_tag = new_tag; + set_text_internal(obj, lv_tr(tag)); +} +#endif /*LV_USE_TRANSLATION*/ + +void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_label_t * label = (lv_label_t *)obj; + + /*Delete the old animation (if exists)*/ + lv_anim_delete(obj, set_ofs_x_anim); + lv_anim_delete(obj, set_ofs_y_anim); + lv_point_set(&label->offset, 0, 0); + + if(long_mode == LV_LABEL_LONG_MODE_SCROLL || long_mode == LV_LABEL_LONG_MODE_SCROLL_CIRCULAR || + long_mode == LV_LABEL_LONG_MODE_CLIP) + label->expand = 1; + else + label->expand = 0; + + label->long_mode = long_mode; + lv_label_mark_need_refr_text(obj); +} + +void lv_label_set_text_selection_start(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + label->sel_start = index; + lv_obj_invalidate(obj); +#else + LV_UNUSED(obj); /*Unused*/ + LV_UNUSED(index); /*Unused*/ +#endif +} + +void lv_label_set_text_selection_end(lv_obj_t * obj, uint32_t index) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + label->sel_end = index; + lv_obj_invalidate(obj); +#else + LV_UNUSED(obj); /*Unused*/ + LV_UNUSED(index); /*Unused*/ +#endif +} + +void lv_label_set_recolor(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_label_t * label = (lv_label_t *)obj; + if(label->recolor == en) return; + + label->recolor = en == false ? 0 : 1; + + /*Refresh the text because the potential color codes in text needs to be hidden or revealed*/ + lv_label_mark_need_refr_text(obj); +} + +/*===================== + * Getter functions + *====================*/ + +char * lv_label_get_text(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + return label->text; +} + +lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + return label->long_mode; +} + +void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(pos); + + lv_label_t * label = (lv_label_t *)obj; + const char * txt = lv_label_get_text(obj); + const lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, txt); + + if(txt[0] == '\0') { + pos->y = 0; + switch(align) { + case LV_TEXT_ALIGN_LEFT: + pos->x = 0; + break; + case LV_TEXT_ALIGN_RIGHT: + pos->x = lv_obj_get_content_width(obj); + break; + case LV_TEXT_ALIGN_CENTER: + pos->x = lv_obj_get_content_width(obj) / 2; + break; + default: + pos->x = 0; + break; + } + return; + } + + + const uint32_t byte_id = lv_text_encoded_get_byte_id(txt, char_id); + /*Search the line of the index letter*/ + lv_text_attributes_t attributes = {0}; + attributes.text_flags = get_label_flags(label); + attributes.line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + attributes.letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t letter_height = lv_font_get_line_height(font); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + const int32_t max_h = lv_area_get_height(&txt_coords); + + attributes.max_width = lv_area_get_width(&txt_coords); + + int32_t y = 0; + uint32_t line_start = 0; + uint32_t new_line_start = 0; + while(txt[new_line_start] != '\0') { + bool last_line = y + letter_height + attributes.line_space + letter_height > max_h; + if(last_line && label->long_mode == LV_LABEL_LONG_MODE_DOTS) attributes.text_flags |= LV_TEXT_FLAG_BREAK_ALL; + + new_line_start += lv_text_get_next_line(&txt[line_start], LV_TEXT_LEN_MAX, font, NULL, &attributes); + + if(byte_id < new_line_start || txt[new_line_start] == '\0') + break; /*The line of 'index' letter begins at 'line_start'*/ + + y += letter_height + attributes.line_space; + line_start = new_line_start; + } + + /*If the last character is line break then go to the next line*/ + if(byte_id > 0) { + if((txt[byte_id - 1] == '\n' || txt[byte_id - 1] == '\r') && txt[byte_id] == '\0') { + y += letter_height + attributes.line_space; + line_start = byte_id; + } + } + + const char * bidi_txt; + uint32_t visual_byte_pos; +#if LV_USE_BIDI + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + if(base_dir == LV_BASE_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(txt); + + char * mutable_bidi_txt = NULL; + /*Handle Bidi*/ + if(new_line_start == byte_id) { + visual_byte_pos = base_dir == LV_BASE_DIR_RTL ? 0 : byte_id - line_start; + bidi_txt = &txt[line_start]; + } + else { + uint32_t line_char_id = lv_text_encoded_get_char_id(&txt[line_start], byte_id - line_start); + + bool is_rtl; + uint32_t visual_char_pos = lv_bidi_get_visual_pos(&txt[line_start], &mutable_bidi_txt, new_line_start - line_start, + base_dir, line_char_id, &is_rtl); + bidi_txt = mutable_bidi_txt; + if(is_rtl) visual_char_pos++; + + visual_byte_pos = lv_text_encoded_get_byte_id(bidi_txt, visual_char_pos); + } +#else + bidi_txt = &txt[line_start]; + visual_byte_pos = byte_id - line_start; +#endif + + /*Calculate the x coordinate*/ + int32_t x = lv_text_get_width(bidi_txt, visual_byte_pos, font, &attributes); + if(char_id != line_start) x += attributes.letter_space; + + uint32_t length = new_line_start - line_start; + calculate_x_coordinate(&x, align, bidi_txt, length, font, &txt_coords, &attributes); + pos->x = x; + pos->y = y; + +#if LV_USE_BIDI + if(mutable_bidi_txt) lv_free(mutable_bidi_txt); +#endif +} + +uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in, bool bidi) +{ + LV_UNUSED(bidi); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(pos_in); + lv_label_t * label = (lv_label_t *)obj; + + lv_point_t pos; + pos.x = pos_in->x - lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + pos.y = pos_in->y - lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + const char * txt = lv_label_get_text(obj); + uint32_t line_start = 0; + uint32_t new_line_start = 0; + int32_t max_h = lv_area_get_height(&txt_coords); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t letter_height = lv_font_get_line_height(font); + int32_t y = 0; + + lv_text_attributes_t attributes = {0}; + attributes.letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + attributes.line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + attributes.text_flags = get_label_flags(label); + attributes.max_width = lv_area_get_width(&txt_coords); + + /*Search the line of the index letter*/; + while(txt[line_start] != '\0') { + /*If dots will be shown, break the last visible line anywhere, + *not only at word boundaries.*/ + bool last_line = y + letter_height + attributes.line_space + letter_height > max_h; + if(last_line && label->long_mode == LV_LABEL_LONG_MODE_DOTS) attributes.text_flags |= LV_TEXT_FLAG_BREAK_ALL; + + new_line_start += lv_text_get_next_line(&txt[line_start], LV_TEXT_LEN_MAX, font, NULL, &attributes); + + if(pos.y <= y + letter_height) { + /*The line is found (stored in 'line_start')*/ + /*Include the NULL terminator in the last line*/ + uint32_t tmp = new_line_start; + uint32_t letter; + letter = lv_text_encoded_prev(txt, &tmp); + if(letter != '\n' && txt[new_line_start] == '\0') new_line_start++; + break; + } + y += letter_height + attributes.line_space; + + line_start = new_line_start; + } + + char * bidi_txt; + +#if LV_USE_BIDI + uint32_t txt_len = 0; + if(bidi) { + bidi_txt = lv_malloc(new_line_start - line_start + 1); + txt_len = new_line_start - line_start; + if(new_line_start > 0 && txt[new_line_start - 1] == '\0' && txt_len > 0) txt_len--; + lv_bidi_process_paragraph(txt + line_start, bidi_txt, txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), NULL, 0); + } + else +#endif + { + bidi_txt = (char *)txt + line_start; + } + + /*Calculate the x coordinate*/ + int32_t x = 0; + const lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, label->text); + uint32_t length = new_line_start - line_start; + calculate_x_coordinate(&x, align, bidi_txt, length, font, &txt_coords, &attributes); + + lv_text_cmd_state_t cmd_state = LV_TEXT_CMD_STATE_WAIT; + + uint32_t i = 0; + uint32_t i_act = i; + + if(new_line_start > 0) { + while(i + line_start < new_line_start) { + uint32_t letter; + uint32_t letter_next; + /*Get the current letter and the next letter for kerning*/ + /*Be careful 'i' already points to the next character*/ + lv_text_encoded_letter_next_2(bidi_txt, &letter, &letter_next, &i); + + if((attributes.text_flags & LV_TEXT_FLAG_RECOLOR) != 0) { + if(lv_text_is_cmd(&cmd_state, bidi_txt[i]) != false) { + continue; /*Skip the letter if it is part of a command*/ + } + } + + int32_t gw = lv_font_get_glyph_width(font, letter, letter_next); + + /*Finish if the x position or the last char of the next line is reached*/ + if(pos.x < x + gw || i + line_start == new_line_start || txt[i_act + line_start] == '\0') { + i = i_act; + break; + } + x += gw; + x += attributes.letter_space; + i_act = i; + } + } + + uint32_t logical_pos; +#if LV_USE_BIDI + if(bidi) { + /*Handle Bidi*/ + uint32_t cid = lv_text_encoded_get_char_id(bidi_txt, i); + if(txt[line_start + i] == '\0') { + logical_pos = i; + } + else { + bool is_rtl; + logical_pos = lv_bidi_get_logical_pos(&txt[line_start], NULL, + txt_len, lv_obj_get_style_base_dir(obj, LV_PART_MAIN), cid, &is_rtl); + if(is_rtl) logical_pos++; + } + lv_free(bidi_txt); + } + else +#endif + { + logical_pos = lv_text_encoded_get_char_id(bidi_txt, i); + } + + return logical_pos + lv_text_encoded_get_char_id(txt, line_start); +} + +bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(pos); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + lv_text_attributes_t attributes = {0}; + const char * txt = lv_label_get_text(obj); + lv_label_t * label = (lv_label_t *)obj; + uint32_t line_start = 0; + uint32_t new_line_start = 0; + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t letter_height = lv_font_get_line_height(font); + const int32_t max_h = lv_area_get_height(&txt_coords); + + attributes.max_width = lv_area_get_width(&txt_coords); + attributes.line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + attributes.letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + attributes.text_flags = get_label_flags(label); + + /*Search the line of the index letter*/ + int32_t y = 0; + while(txt[line_start] != '\0') { + bool last_line = y + letter_height + attributes.line_space + letter_height > max_h; + if(last_line && label->long_mode == LV_LABEL_LONG_MODE_DOTS) attributes.text_flags |= LV_TEXT_FLAG_BREAK_ALL; + + new_line_start += lv_text_get_next_line(&txt[line_start], LV_TEXT_LEN_MAX, font, NULL, &attributes); + + if(pos->y <= y + letter_height) break; /*The line is found (stored in 'line_start')*/ + y += letter_height + attributes.line_space; + + line_start = new_line_start; + } + + /*Calculate the x coordinate*/ + const lv_text_align_t align = lv_obj_calculate_style_text_align(obj, LV_PART_MAIN, label->text); + + int32_t x = 0; + if(align == LV_TEXT_ALIGN_CENTER) { + const int32_t line_w = lv_text_get_width(&txt[line_start], new_line_start - line_start, font, &attributes); + x += lv_area_get_width(&txt_coords) / 2 - line_w / 2; + } + else if(align == LV_TEXT_ALIGN_RIGHT) { + const int32_t line_w = lv_text_get_width(&txt[line_start], new_line_start - line_start, font, &attributes); + x += lv_area_get_width(&txt_coords) - line_w; + } + + lv_text_cmd_state_t cmd_state = LV_TEXT_CMD_STATE_WAIT; + + int32_t last_x = 0; + uint32_t i = line_start; + uint32_t i_current = i; + uint32_t letter = '\0'; + uint32_t letter_next = '\0'; + + if(new_line_start > 0) { + while(i <= new_line_start - 1) { + /*Get the current letter and the next letter for kerning*/ + /*Be careful 'i' already points to the next character*/ + lv_text_encoded_letter_next_2(txt, &letter, &letter_next, &i); + + if((attributes.text_flags & LV_TEXT_FLAG_RECOLOR) != 0) { + if(lv_text_is_cmd(&cmd_state, txt[i]) != false) { + continue; /*Skip the letter if it is part of a command*/ + } + } + + last_x = x; + x += lv_font_get_glyph_width(font, letter, letter_next); + if(pos->x < x) { + i = i_current; + break; + } + x += attributes.letter_space; + i_current = i; + } + } + + const int32_t max_diff = lv_font_get_glyph_width(font, letter, letter_next) + attributes.letter_space + 1; + return (pos->x >= (last_x - attributes.letter_space) && pos->x <= (last_x + max_diff)); +} + +uint32_t lv_label_get_text_selection_start(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + return label->sel_start; +#else + LV_UNUSED(obj); /*Unused*/ + return LV_LABEL_TEXT_SELECTION_OFF; +#endif +} + +uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label = (lv_label_t *)obj; + return label->sel_end; +#else + LV_UNUSED(obj); /*Unused*/ + return LV_LABEL_TEXT_SELECTION_OFF; +#endif +} + +bool lv_label_get_recolor(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_label_t * label = (lv_label_t *)obj; + return label->recolor == 0 ? false : true; +} + +/*===================== + * Other functions + *====================*/ + +#if LV_USE_OBSERVER +lv_observer_t * lv_label_bind_text(lv_obj_t * obj, lv_subject_t * subject, const char * fmt) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(fmt == NULL) { + if(subject->type == LV_SUBJECT_TYPE_INT) { + fmt = "%d"; + } +#if LV_USE_FLOAT + else if(subject->type == LV_SUBJECT_TYPE_FLOAT) { + fmt = "%0.1f"; + } +#endif + else if(subject->type != LV_SUBJECT_TYPE_STRING && subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + } + else { + if(subject->type != LV_SUBJECT_TYPE_STRING && subject->type != LV_SUBJECT_TYPE_POINTER && + subject->type != LV_SUBJECT_TYPE_INT && subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + } + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, label_text_observer_cb, obj, (void *)fmt); + return observer; +} +#endif /*LV_USE_OBSERVER*/ + + +void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_label_t * label = (lv_label_t *)obj; + + /*Cannot append to static text*/ + if(label->static_txt != 0) return; + + /*Allocate space for the new text*/ + size_t old_len = lv_strlen(label->text); + size_t ins_len = lv_strlen(txt); + size_t new_len = ins_len + old_len; + label->text = lv_realloc(label->text, new_len + 1); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + + if(pos == LV_LABEL_POS_LAST) { + pos = lv_text_get_encoded_length(label->text); + } + + lv_text_ins(label->text, pos, txt); + lv_label_set_text(obj, NULL); +} + +void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_label_t * label = (lv_label_t *)obj; + + /*Cannot append to static text*/ + if(label->static_txt) return; + + char * label_txt = lv_label_get_text(obj); + /*Delete the characters*/ + lv_text_cut(label_txt, pos, cnt); + + /*Refresh the label*/ + lv_label_mark_need_refr_text(obj); +} + + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_label_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_label_t * label = (lv_label_t *)obj; + + label->text = NULL; + label->recolor = 0; + label->static_txt = 0; + label->dot_begin = LV_LABEL_DOT_BEGIN_INV; + label->long_mode = LV_LABEL_LONG_MODE_WRAP; + lv_point_set(&label->offset, 0, 0); + +#if LV_LABEL_LONG_TXT_HINT + label->hint.line_start = -1; + label->hint.coord_y = 0; + label->hint.y = 0; +#endif + +#if LV_LABEL_TEXT_SELECTION + label->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + label->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; +#endif + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_label_set_long_mode(obj, LV_LABEL_LONG_MODE_WRAP); + lv_label_set_text(obj, LV_LABEL_DEFAULT_TEXT); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_label_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_label_t * label = (lv_label_t *)obj; + + if(!label->static_txt) lv_free(label->text); + label->text = NULL; +#if LV_USE_TRANSLATION + if(label->translation_tag) lv_free(label->translation_tag); + label->translation_tag = NULL; +#endif /*LV_USE_TRANSLATION*/ + + lv_display_t * disp = lv_obj_get_display(obj); + lv_display_remove_event_cb_with_user_data(disp, update_layout_completed_cb, obj); +} + +static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + const lv_result_t res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + const lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if((code == LV_EVENT_STYLE_CHANGED) || (code == LV_EVENT_SIZE_CHANGED)) { + lv_label_mark_need_refr_text(obj); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /* Italic or other non-typical letters can be drawn of out of the object. + * It happens if box_w + ofs_x > adw_w in the glyph. + * To avoid this add some extra draw area. + * font_h / 4 is an empirical value. */ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t font_h = lv_font_get_line_height(font); + lv_event_set_ext_draw_size(e, font_h / 4); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_label_t * label = (lv_label_t *)obj; + if(label->invalid_size_cache) { + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + if(label->recolor != 0) flag |= LV_TEXT_FLAG_RECOLOR; + if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND; + + int32_t w; + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) w = LV_COORD_MAX; + else w = lv_obj_get_content_width(obj); + w = LV_MIN(w, lv_obj_get_style_max_width(obj, LV_PART_MAIN)); + + uint32_t dot_begin = label->dot_begin; + lv_label_revert_dots(obj); + + lv_text_attributes_t attributes = {0}; + + attributes.letter_space = letter_space; + attributes.line_space = line_space; + attributes.text_flags = flag; + attributes.max_width = w; + + lv_text_get_size_attributes(&label->size_cache, label->text, font, &attributes); + lv_label_set_dots(obj, dot_begin); + + label->size_cache.y = LV_MIN(label->size_cache.y, lv_obj_get_style_max_height(obj, LV_PART_MAIN)); + + label->invalid_size_cache = false; + } + + lv_point_t * self_size = lv_event_get_param(e); + self_size->x = LV_MAX(self_size->x, label->size_cache.x); + self_size->y = LV_MAX(self_size->y, label->size_cache.y); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + + } +#if LV_USE_TRANSLATION + else if(code == LV_EVENT_TRANSLATION_LANGUAGE_CHANGED) { + lv_label_t * label = (lv_label_t *)obj; + if(label->translation_tag) { + const char * new_text = lv_tr(label->translation_tag); + set_text_internal(obj, new_text); + } + } +#endif +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_label_t * label = (lv_label_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + lv_area_t txt_coords; + lv_obj_get_content_coords(obj, &txt_coords); + + lv_text_flag_t flag = get_label_flags(label); + + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + label_draw_dsc.text = label->text; + label_draw_dsc.text_static = label->static_txt; + label_draw_dsc.ofs_x = label->offset.x; + label_draw_dsc.ofs_y = label->offset.y; + label_draw_dsc.text_size = label->text_size; +#if LV_LABEL_LONG_TXT_HINT + if(label->long_mode != LV_LABEL_LONG_MODE_SCROLL_CIRCULAR && + lv_area_get_height(&txt_coords) >= LV_LABEL_HINT_HEIGHT_LIMIT) { + label_draw_dsc.hint = &label->hint; + } +#endif + + label_draw_dsc.flag = flag; + label_draw_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_draw_dsc); + lv_bidi_calculate_align(&label_draw_dsc.align, &label_draw_dsc.bidi_dir, label->text); + + label_draw_dsc.sel_start = lv_label_get_text_selection_start(obj); + label_draw_dsc.sel_end = lv_label_get_text_selection_end(obj); + if(label_draw_dsc.sel_start != LV_DRAW_LABEL_NO_TXT_SEL && label_draw_dsc.sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { + label_draw_dsc.sel_color = lv_obj_get_style_text_color_filtered(obj, LV_PART_SELECTED); + label_draw_dsc.sel_bg_color = lv_obj_get_style_bg_color(obj, LV_PART_SELECTED); + } + + /* get the style attributes of a letter outline */ + label_draw_dsc.outline_stroke_color = lv_obj_get_style_text_outline_stroke_color(obj, LV_PART_MAIN); + label_draw_dsc.outline_stroke_opa = lv_obj_get_style_text_outline_stroke_opa(obj, LV_PART_MAIN); + label_draw_dsc.outline_stroke_width = lv_obj_get_style_text_outline_stroke_width(obj, LV_PART_MAIN); + + + /* In SCROLL and SCROLL_CIRCULAR mode the CENTER and RIGHT are pointless, so remove them. + * (In addition, they will create misalignment in this situation)*/ + if((label->long_mode == LV_LABEL_LONG_MODE_SCROLL || label->long_mode == LV_LABEL_LONG_MODE_SCROLL_CIRCULAR) && + (label_draw_dsc.align == LV_TEXT_ALIGN_CENTER || label_draw_dsc.align == LV_TEXT_ALIGN_RIGHT)) { + lv_point_t size = label->text_size; + if(size.x > lv_area_get_width(&txt_coords)) { +#if LV_USE_BIDI + const lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + label_draw_dsc.align = base_dir == LV_BASE_DIR_RTL ? LV_TEXT_ALIGN_RIGHT : LV_TEXT_ALIGN_LEFT; +#else + label_draw_dsc.align = LV_TEXT_ALIGN_LEFT; +#endif + } + } + + lv_area_t txt_clip; + bool is_common = lv_area_intersect(&txt_clip, &txt_coords, &layer->_clip_area); + if(!is_common) { + return; + } + + if(label->long_mode == LV_LABEL_LONG_MODE_WRAP) { + int32_t s = lv_obj_get_scroll_top(obj); + lv_area_move(&txt_coords, 0, -s); + txt_coords.y2 = obj->coords.y2; + } + + /*Clip to the text in some cases to avoid ugly overflows*/ + if(label->long_mode == LV_LABEL_LONG_MODE_SCROLL || + label->long_mode == LV_LABEL_LONG_MODE_SCROLL_CIRCULAR || + label->long_mode == LV_LABEL_LONG_MODE_CLIP) { + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = txt_clip; + lv_draw_label(layer, &label_draw_dsc, &txt_coords); + layer->_clip_area = clip_area_ori; + } + /*Do not clip to make the drop shadow visible*/ + else if(label_draw_dsc.base.drop_shadow_opa > 0) { + lv_draw_label(layer, &label_draw_dsc, &txt_coords); + } + /*Labels have some extra draw area by default to not clip characters with + *italic, handwritten and other less standard fonts. + *However, with most of the fonts typically it's safe to clip at least to bottom side*/ + else { + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area.y2 = txt_clip.y2; + lv_draw_label(layer, &label_draw_dsc, &txt_coords); + layer->_clip_area = clip_area_ori; + } + + lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = txt_clip; + + if(label->long_mode == LV_LABEL_LONG_MODE_SCROLL_CIRCULAR) { + lv_point_t size = label->text_size; + + /*Draw the text again on label to the original to make a circular effect */ + if(size.x > lv_area_get_width(&txt_coords)) { + label_draw_dsc.ofs_x = label->offset.x + size.x + + lv_font_get_glyph_width(label_draw_dsc.font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + label_draw_dsc.ofs_y = label->offset.y; + + lv_draw_label(layer, &label_draw_dsc, &txt_coords); + } + + /*Draw the text again below the original to make a circular effect */ + if(size.y > lv_area_get_height(&txt_coords)) { + label_draw_dsc.ofs_x = label->offset.x; + label_draw_dsc.ofs_y = label->offset.y + size.y + lv_font_get_line_height(label_draw_dsc.font); + + lv_draw_label(layer, &label_draw_dsc, &txt_coords); + } + } + + layer->_clip_area = clip_area_ori; +} + +static void set_text_internal(lv_obj_t * obj, const char * text) +{ + lv_label_t * label = (lv_label_t *)obj; + + /*If text is NULL then just refresh with the current text*/ + if(text == NULL) text = label->text; + + lv_label_revert_dots(obj); /*In case text == label->text*/ + const size_t text_len = get_text_length(text); + + /*If set its own text then reallocate it (maybe its size changed)*/ + if(label->text == text && label->static_txt == 0) { + label->text = lv_realloc(label->text, text_len); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + +#if LV_USE_ARABIC_PERSIAN_CHARS + lv_text_ap_proc(label->text, label->text); +#endif + + } + else { + /*Free the old text*/ + if(label->text != NULL && label->static_txt == 0) { + lv_free(label->text); + label->text = NULL; + } + + label->text = lv_malloc(text_len); + LV_ASSERT_MALLOC(label->text); + if(label->text == NULL) return; + + copy_text_to_label(label, text); + + /*Now the text is dynamically allocated*/ + label->static_txt = 0; + } + + lv_label_mark_need_refr_text(obj); +} + +static void remove_translation_tag(lv_obj_t * obj) +{ + LV_UNUSED(obj); +#if LV_USE_TRANSLATION + lv_label_t * label = (lv_label_t *)obj; + /* Remove translation tag so we don't update the text automatically if the language changes*/ + if(label->translation_tag) { + lv_free(label->translation_tag); + label->translation_tag = NULL; + } +#endif /*LV_USE_TRANSLATION*/ +} +static void overwrite_anim_property(lv_anim_t * dest, const lv_anim_t * src, lv_label_long_mode_t mode) +{ + switch(mode) { + case LV_LABEL_LONG_MODE_SCROLL: + /* If the dest animation is already running, overwrite is not allowed */ + if(dest->act_time <= 0) + dest->act_time = src->act_time; + dest->repeat_cnt = src->repeat_cnt; + dest->repeat_delay = src->repeat_delay; + dest->completed_cb = src->completed_cb; + dest->reverse_delay = src->reverse_delay; + break; + case LV_LABEL_LONG_MODE_SCROLL_CIRCULAR: + /* If the dest animation is already running, overwrite is not allowed */ + if(dest->act_time <= 0) + dest->act_time = src->act_time; + dest->repeat_cnt = src->repeat_cnt; + dest->repeat_delay = src->repeat_delay; + dest->completed_cb = src->completed_cb; + break; + default: + break; + } +} + +static void lv_label_mark_need_refr_text(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + if(label->text == NULL) return; + label->invalid_size_cache = true; + + lv_obj_invalidate(obj); + lv_obj_refresh_self_size(obj); + + if(!label->need_refr_text) { + label->need_refr_text = true; + lv_display_t * disp = lv_obj_get_display(obj); + lv_display_add_event_cb(disp, update_layout_completed_cb, LV_EVENT_UPDATE_LAYOUT_COMPLETED, obj); + } +} + +static void update_layout_completed_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_user_data(e); + lv_label_t * label = (lv_label_t *)obj; + + lv_display_t * disp = lv_obj_get_display(obj); + lv_display_remove_event_cb_with_user_data(disp, update_layout_completed_cb, obj); + if(!label->need_refr_text) return; + label->need_refr_text = false; + lv_label_refr_text(obj); +} + +/** + * Refresh the label with its text stored in its extended data + * @param label pointer to a label object + */ +static void lv_label_refr_text(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + if(label->text == NULL) return; +#if LV_LABEL_LONG_TXT_HINT + label->hint.line_start = -1; /*The hint is invalid if the text changes*/ +#endif + + lv_area_t txt_coords; + lv_text_attributes_t attributes = {0}; + lv_obj_get_content_coords(obj, &txt_coords); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + attributes.line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + attributes.letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_MAIN); + attributes.text_flags = get_label_flags(label); + attributes.max_width = lv_area_get_width(&txt_coords); + + /*Calc. the height and longest line*/ + lv_point_t size; + + lv_label_revert_dots(obj); + lv_text_get_size_attributes(&size, label->text, font, &attributes); + label->text_size = size; + + /*In scroll mode start an offset animation*/ + if(label->long_mode == LV_LABEL_LONG_MODE_SCROLL) { + const lv_anim_t * anim_template = lv_obj_get_style_anim(obj, LV_PART_MAIN); + uint32_t anim_time = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); + if(anim_time == 0) anim_time = LV_LABEL_DEF_SCROLL_SPEED; + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_reverse_delay(&a, LV_LABEL_SCROLL_DELAY); + lv_anim_set_repeat_delay(&a, a.reverse_delay); + + bool hor_anim = false; + if(size.x > lv_area_get_width(&txt_coords)) { + int32_t start = 0; + int32_t end = 0; + +#if LV_USE_BIDI + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + if(base_dir == LV_BASE_DIR_AUTO) + base_dir = lv_bidi_detect_base_dir(label->text); + + if(base_dir == LV_BASE_DIR_RTL) { + start = lv_area_get_width(&txt_coords) - size.x; + end = 0; + } + else { + start = 0; + end = lv_area_get_width(&txt_coords) - size.x; + } +#else + end = lv_area_get_width(&txt_coords) - size.x; +#endif + + lv_anim_set_values(&a, start, end); + lv_anim_set_exec_cb(&a, set_ofs_x_anim); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim); + int32_t act_time = 0; + bool reverse_play_in_progress = false; + if(anim_cur) { + act_time = anim_cur->act_time; + reverse_play_in_progress = anim_cur->reverse_play_in_progress; + } + + int32_t duration_resolved = lv_anim_resolve_speed(anim_time, start, end); + /*To keep the old position*/ + if(act_time > duration_resolved) act_time = duration_resolved; + + a.act_time = act_time; + if(reverse_play_in_progress) { + a.reverse_play_in_progress = 1; + /*Swap the start and end values*/ + int32_t tmp; + tmp = a.start_value; + a.start_value = a.end_value; + a.end_value = tmp; + } + lv_anim_set_duration(&a, anim_time); + lv_anim_set_reverse_duration(&a, anim_time); + + /*If a template animation exists, overwrite some property*/ + if(anim_template) + overwrite_anim_property(&a, anim_template, label->long_mode); + lv_anim_start(&a); + + /*If a delay is happening, apply the start value manually*/ + if(act_time < 0) label->offset.x = start; + + hor_anim = true; + } + else { + /*Delete the offset animation if not required*/ + lv_anim_delete(obj, set_ofs_x_anim); + label->offset.x = 0; + } + + if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { + lv_anim_set_values(&a, 0, lv_area_get_height(&txt_coords) - size.y - (lv_font_get_line_height(font))); + lv_anim_set_exec_cb(&a, set_ofs_y_anim); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim); + int32_t act_time = 0; + bool reverse_play_in_progress = false; + if(anim_cur) { + act_time = anim_cur->act_time; + reverse_play_in_progress = anim_cur->reverse_play_in_progress; + } + if(act_time > a.duration) act_time = a.duration; + a.act_time = act_time; /*To keep the old position*/ + if(reverse_play_in_progress) { + a.reverse_play_in_progress = 1; + /*Swap the start and end values*/ + int32_t tmp; + tmp = a.start_value; + a.start_value = a.end_value; + a.end_value = tmp; + } + + lv_anim_set_duration(&a, anim_time); + lv_anim_set_reverse_duration(&a, anim_time); + + /*If a template animation exists, overwrite some property*/ + if(anim_template) { + overwrite_anim_property(&a, anim_template, label->long_mode); + } + lv_anim_start(&a); + } + else { + /*Delete the offset animation if not required*/ + lv_anim_delete(obj, set_ofs_y_anim); + label->offset.y = 0; + } + } + /*In roll inf. mode keep the size but start offset animations*/ + else if(label->long_mode == LV_LABEL_LONG_MODE_SCROLL_CIRCULAR) { + const lv_anim_t * anim_template = lv_obj_get_style_anim(obj, LV_PART_MAIN); + uint32_t anim_time = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); + if(anim_time == 0) anim_time = LV_LABEL_DEF_SCROLL_SPEED; + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + + bool hor_anim = false; + + if(size.x > lv_area_get_width(&txt_coords)) { +#if LV_USE_BIDI + int32_t start, end; + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + + if(base_dir == LV_BASE_DIR_AUTO) + base_dir = lv_bidi_detect_base_dir(label->text); + + if(base_dir == LV_BASE_DIR_RTL) { + start = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + end = 0; + } + else { + start = 0; + end = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + } + + lv_anim_set_values(&a, start, end); +#else + lv_anim_set_values(&a, 0, -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT); +#endif + lv_anim_set_exec_cb(&a, set_ofs_x_anim); + lv_anim_set_duration(&a, anim_time); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_x_anim); + int32_t act_time = anim_cur ? anim_cur->act_time : 0; + + /*To keep the old position when the label text is updated mid-scrolling*/ + int32_t duration_resolved = lv_anim_resolve_speed(anim_time, a.start_value, a.end_value); + if(act_time < duration_resolved) { + a.act_time = act_time; + } + + /*If a template animation exists, overwrite some property*/ + if(anim_template) { + overwrite_anim_property(&a, anim_template, label->long_mode); + } + + lv_anim_start(&a); + hor_anim = true; + } + else { + /*Delete the offset animation if not required*/ + lv_anim_delete(obj, set_ofs_x_anim); + label->offset.x = 0; + } + + if(size.y > lv_area_get_height(&txt_coords) && hor_anim == false) { + lv_anim_set_values(&a, 0, -size.y - (lv_font_get_line_height(font))); + lv_anim_set_exec_cb(&a, set_ofs_y_anim); + lv_anim_set_duration(&a, anim_time); + + lv_anim_t * anim_cur = lv_anim_get(obj, set_ofs_y_anim); + int32_t act_time = anim_cur ? anim_cur->act_time : 0; + + /*If a template animation exists, overwrite some property*/ + if(anim_template) { + overwrite_anim_property(&a, anim_template, label->long_mode); + } + /*To keep the old position when the label text is updated mid-scrolling*/ + else if(act_time < a.duration) { + a.act_time = act_time; + } + + lv_anim_start(&a); + } + else { + /*Delete the offset animation if not required*/ + lv_anim_delete(obj, set_ofs_y_anim); + label->offset.y = 0; + } + } + else if(label->long_mode == LV_LABEL_LONG_MODE_DOTS) { + + if(size.y > lv_area_get_height(&txt_coords) && /*Text overflows available area*/ + size.y > lv_font_get_line_height(font) && /*No break requested, so no dots required*/ + lv_text_get_encoded_length(label->text) > LV_LABEL_DOT_NUM) { /*Do not turn all characters into dots*/ + lv_point_t p; + int32_t y_overed; + p.x = lv_area_get_width(&txt_coords) - + (lv_font_get_glyph_width(font, '.', '.') + attributes.letter_space) * + LV_LABEL_DOT_NUM; /*Shrink with dots*/ + p.y = lv_area_get_height(&txt_coords); + y_overed = p.y % + (lv_font_get_line_height(font) + attributes.line_space); /*Round down to the last line*/ + if(y_overed >= lv_font_get_line_height(font)) { + p.y -= y_overed; + p.y += lv_font_get_line_height(font); + } + else { + p.y -= y_overed; + p.y -= attributes.line_space; + } + + uint32_t letter_id = lv_label_get_letter_on(obj, &p, false); + + /*Be sure there is space for the dots*/ + size_t txt_len = lv_strlen(label->text); + uint32_t byte_id = lv_text_encoded_get_byte_id(label->text, letter_id); + while(byte_id + LV_LABEL_DOT_NUM > txt_len) { + lv_text_encoded_prev(label->text, &byte_id); + letter_id--; + } + + /*Save letters under the dots and replace them with dots*/ + lv_label_set_dots(obj, byte_id); + } + } + else if(label->long_mode == LV_LABEL_LONG_MODE_CLIP || label->long_mode == LV_LABEL_LONG_MODE_WRAP) { + /*Do nothing*/ + } + + lv_obj_invalidate(obj); +} + +static void lv_label_revert_dots(lv_obj_t * obj) +{ + lv_label_t * label = (lv_label_t *)obj; + if(label->dot_begin != LV_LABEL_DOT_BEGIN_INV && !label->static_txt) { + for(int i = 0; i < LV_LABEL_DOT_NUM + 1 && label->dot[i]; i++) { + label->text[label->dot_begin + i] = label->dot[i]; + } + } + label->dot_begin = LV_LABEL_DOT_BEGIN_INV; +} + +static void lv_label_set_dots(lv_obj_t * obj, uint32_t dot_begin) +{ + lv_label_t * label = (lv_label_t *)obj; + LV_ASSERT_MSG(label->dot_begin == LV_LABEL_DOT_BEGIN_INV, "Label dots already set"); + if(dot_begin != LV_LABEL_DOT_BEGIN_INV) { + label->dot_begin = dot_begin; + + if(label->static_txt) { + LV_LOG_WARN("Long mode \"dots\" is not supported with static text."); + return; + } + + /*Save characters*/ + lv_strncpy(label->dot, &label->text[dot_begin], LV_LABEL_DOT_NUM + 1); + + /*Overwrite up to LV_LABEL_DOT_NUM + 1 characters with dots and null terminator*/ + int i = 0; + for(; i < LV_LABEL_DOT_NUM && label->text[dot_begin + i]; i++) { + label->text[dot_begin + i] = '.'; + } + label->text[dot_begin + i] = '\0'; + } +} + +static void set_ofs_x_anim(void * obj, int32_t v) +{ + lv_label_t * label = (lv_label_t *)obj; + label->offset.x = v; + lv_obj_invalidate(obj); +} + +static void set_ofs_y_anim(void * obj, int32_t v) +{ + lv_label_t * label = (lv_label_t *)obj; + label->offset.y = v; + lv_obj_invalidate(obj); +} + +static size_t get_text_length(const char * text) +{ + size_t len = 0; +#if LV_USE_ARABIC_PERSIAN_CHARS + len = lv_text_ap_calc_bytes_count(text); +#else + len = lv_strlen(text) + 1; +#endif + + return len; +} + +static void copy_text_to_label(lv_label_t * label, const char * text) +{ +#if LV_USE_ARABIC_PERSIAN_CHARS + lv_text_ap_proc(text, label->text); +#else + lv_strcpy(label->text, text); +#endif +} + +static lv_text_flag_t get_label_flags(lv_label_t * label) +{ + lv_text_flag_t flag = LV_TEXT_FLAG_NONE; + + if(label->recolor) flag |= LV_TEXT_FLAG_RECOLOR; + if(label->expand) flag |= LV_TEXT_FLAG_EXPAND; + + lv_obj_t * obj = (lv_obj_t *) label; + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && + lv_obj_get_style_max_width(obj, LV_PART_MAIN) == LV_COORD_MAX && + !obj->w_layout) { + flag |= LV_TEXT_FLAG_FIT; + } + + return flag; +} + +/* Function created because of this pattern be used in multiple functions */ +static void calculate_x_coordinate(int32_t * x, const lv_text_align_t align, const char * txt, uint32_t length, + const lv_font_t * font, lv_area_t * txt_coords, lv_text_attributes_t * attributes) +{ + if(align == LV_TEXT_ALIGN_CENTER) { + const int32_t line_w = lv_text_get_width(txt, length, font, attributes); + *x += lv_area_get_width(txt_coords) / 2 - line_w / 2; + } + else if(align == LV_TEXT_ALIGN_RIGHT) { + const int32_t line_w = lv_text_get_width(txt, length, font, attributes); + *x += lv_area_get_width(txt_coords) - line_w; + } + else { + /* Nothing to do */ + } +} + +#if LV_USE_OBSERVER + +static void label_text_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + const char * fmt = observer->user_data; + + if(fmt == NULL) { + lv_label_set_text(observer->target, subject->value.pointer); + } + else { + switch(subject->type) { + case LV_SUBJECT_TYPE_INT: + lv_label_set_text_fmt(observer->target, fmt, subject->value.num); + break; +#if LV_USE_FLOAT + case LV_SUBJECT_TYPE_FLOAT: + lv_label_set_text_fmt(observer->target, fmt, subject->value.float_v); + break; +#endif + case LV_SUBJECT_TYPE_STRING: + case LV_SUBJECT_TYPE_POINTER: + lv_label_set_text_fmt(observer->target, fmt, subject->value.pointer); + break; + default: + break; + } + } +} + +#endif +#endif /*LV_USE_LABEL*/ diff --git a/inc/lvgl/src/widgets/label/lv_label.h b/inc/lvgl/src/widgets/label/lv_label.h new file mode 100644 index 0000000..92f846a --- /dev/null +++ b/inc/lvgl/src/widgets/label/lv_label.h @@ -0,0 +1,289 @@ +/** + * @file lv_label.h + * + */ + +#ifndef LV_LABEL_H +#define LV_LABEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_LABEL != 0 + +#include "../../misc/lv_types.h" +#include "../../core/lv_obj.h" +#include "../../font/lv_font.h" +#include "../../font/lv_symbol_def.h" +#include "../../misc/lv_text.h" +#include "../../draw/lv_draw.h" +#include "../../core/lv_observer.h" + +/********************* + * DEFINES + *********************/ +#define LV_LABEL_DOT_NUM 3 +#define LV_LABEL_POS_LAST 0xFFFF +#define LV_LABEL_TEXT_SELECTION_OFF LV_DRAW_LABEL_NO_TXT_SEL +#if LV_WIDGETS_HAS_DEFAULT_VALUE +#define LV_LABEL_DEFAULT_TEXT "Text" +#else +#define LV_LABEL_DEFAULT_TEXT "" +#endif + +LV_EXPORT_CONST_INT(LV_LABEL_DOT_NUM); +LV_EXPORT_CONST_INT(LV_LABEL_POS_LAST); +LV_EXPORT_CONST_INT(LV_LABEL_TEXT_SELECTION_OFF); + +/********************** + * TYPEDEFS + **********************/ + +/** Long mode behaviors. Used in 'lv_label_ext_t'*/ +typedef enum { + LV_LABEL_LONG_MODE_WRAP, /**< Keep the object width, wrap lines longer than object width and expand the object height*/ + LV_LABEL_LONG_MODE_DOTS, /**< Keep the size and write dots at the end if the text is too long*/ + LV_LABEL_LONG_MODE_SCROLL, /**< Keep the size and roll the text back and forth*/ + LV_LABEL_LONG_MODE_SCROLL_CIRCULAR, /**< Keep the size and roll the text circularly*/ + LV_LABEL_LONG_MODE_CLIP, /**< Keep the size and clip the text out of it*/ +} lv_label_long_mode_t; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_label_id_t { + LV_PROPERTY_ID(LABEL, TEXT, LV_PROPERTY_TYPE_TEXT, 0), + LV_PROPERTY_ID(LABEL, LONG_MODE, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(LABEL, TEXT_SELECTION_START, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(LABEL, TEXT_SELECTION_END, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_LABEL_END, +}; +#endif + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_label_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a label object + * @param parent pointer to an object, it will be the parent of the new label. + * @return pointer to the created button + */ +lv_obj_t * lv_label_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new text for a label. Memory will be allocated to store the text by the label. + * @param obj pointer to a label object + * @param text '\0' terminated character string. NULL to refresh with the current text. + * @note If `LV_USE_ARABIC_PERSIAN_CHARS` is enabled the text will be modified to have the correct Arabic + * characters in it. + */ +void lv_label_set_text(lv_obj_t * obj, const char * text); + +/** + * Set a new formatted text for a label. Memory will be allocated to store the text by the label. + * @param obj pointer to a label object + * @param fmt `printf`-like format string + * Example: + * @code + * lv_label_set_text_fmt(label1, "%d user", user_num); + * @endcode + * @note If `LV_USE_ARABIC_PERSIAN_CHARS` is enabled the text will be modified to have the correct Arabic characters in it. + */ +void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(2, 3); + +/** + * Set a new formatted text for a label. Memory will be allocated to store the text by the label. + * @param obj pointer to a label object + * @param fmt `printf`-like format string + * @param args variadic arguments list + * + * Example: + * @code + * va_list args; + * va_start(args, fmt); + * lv_label_set_text_vfmt(label1, fmt, args); + * va_end(args); + * @endcode + * @note It ignores `LV_USE_ARABIC_PERSIAN_CHARS` + */ +void lv_label_set_text_vfmt(lv_obj_t * obj, const char * fmt, va_list args); + +/** + * Set a static text. It will not be saved by the label so the 'text' variable + * has to be 'alive' while the label exists. + * @param obj pointer to a label object + * @param text pointer to a text. NULL to refresh with the current text. + * @note It ignores `LV_USE_ARABIC_PERSIAN_CHARS` + */ +void lv_label_set_text_static(lv_obj_t * obj, const char * text); + +/** + * Set the behavior of the label with text longer than the object size + * @param obj pointer to a label object + * @param long_mode the new mode from 'lv_label_long_mode' enum. + * In LV_LONG_WRAP/DOT/SCROLL/SCROLL_CIRC the size of the label should be set AFTER this function + */ +void lv_label_set_long_mode(lv_obj_t * obj, lv_label_long_mode_t long_mode); + +/** + * Set where text selection should start + * @param obj pointer to a label object + * @param index character index from where selection should start. `LV_LABEL_TEXT_SELECTION_OFF` for no selection + */ +void lv_label_set_text_selection_start(lv_obj_t * obj, uint32_t index); + +/** + * Set where text selection should end + * @param obj pointer to a label object + * @param index character index where selection should end. `LV_LABEL_TEXT_SELECTION_OFF` for no selection + */ +void lv_label_set_text_selection_end(lv_obj_t * obj, uint32_t index); + +/** + * Enable the recoloring by in-line commands + * @param obj pointer to a label object + * @param en true: enable recoloring, false: disable + * Example: "This is a #ff0000 red# word" + */ +void lv_label_set_recolor(lv_obj_t * obj, bool en); + +#if LV_USE_TRANSLATION + +/** + * Assign a translation tag for this label. Memory will be allocated to store the tag by the label. + * The label text will automatically update when the language is changed via `lv_translation_set_language`. + * @param obj pointer to a label object + * @param tag '\0' terminated character string. + */ +void lv_label_set_translation_tag(lv_obj_t * obj, const char * tag); + +#endif /*LV_USE_TRANSLATION*/ + + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text of a label + * @param obj pointer to a label object + * @return the text of the label + */ +char * lv_label_get_text(const lv_obj_t * obj); + +/** + * Get the long mode of a label + * @param obj pointer to a label object + * @return the current long mode + */ +lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * obj); + +/** + * Get the relative x and y coordinates of a letter + * @param obj pointer to a label object + * @param char_id index of the character [0 ... text length - 1]. + * Expressed in character index, not byte index (different in UTF-8) + * @param pos store the result here (E.g. index = 0 gives 0;0 coordinates if the text if aligned to the left) + */ +void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t * pos); + +/** + * Get the index of letter on a relative point of a label. + * @param obj pointer to label object + * @param pos_in pointer to point with coordinates on a the label + * @param bidi whether to use bidi processed + * @return The index of the letter on the 'pos_p' point (E.g. on 0;0 is the 0. letter if aligned to the left) + * Expressed in character index and not byte index (different in UTF-8) + */ +uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in, bool bidi); + +/** + * Check if a character is drawn under a point. + * @param obj pointer to a label object + * @param pos Point to check for character under + * @return whether a character is drawn under the point + */ +bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos); + +/** + * @brief Get the selection start index. + * @param obj pointer to a label object. + * @return selection start index. `LV_LABEL_TEXT_SELECTION_OFF` if nothing is selected. + */ +uint32_t lv_label_get_text_selection_start(const lv_obj_t * obj); + +/** + * @brief Get the selection end index. + * @param obj pointer to a label object. + * @return selection end index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. + */ +uint32_t lv_label_get_text_selection_end(const lv_obj_t * obj); + +/** + * @brief Get the recoloring attribute + * @param obj pointer to a label object. + * @return true: recoloring is enabled, false: recoloring is disabled + */ +bool lv_label_get_recolor(const lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +#if LV_USE_OBSERVER +/** + * Bind an integer, string, or pointer Subject to a Label. + * @param obj pointer to Label + * @param subject pointer to Subject + * @param fmt optional printf-like format string with 1 format specifier (e.g. "%d °C") + * or NULL to bind to the value directly. + * @return pointer to newly-created Observer + * @note If `fmt == NULL` strings and pointers (`\0` terminated string) will be shown + * as text as they are, integers as %d, floats as %0.1f + */ +lv_observer_t * lv_label_bind_text(lv_obj_t * obj, lv_subject_t * subject, const char * fmt); +#endif + + +/** + * Insert a text to a label. The label text cannot be static. + * @param obj pointer to a label object + * @param pos character index to insert. Expressed in character index and not byte index. + * 0: before first char. LV_LABEL_POS_LAST: after last char. + * @param txt pointer to the text to insert + */ +void lv_label_ins_text(lv_obj_t * obj, uint32_t pos, const char * txt); + +/** + * Delete characters from a label. The label text cannot be static. + * @param obj pointer to a label object + * @param pos character index from where to cut. Expressed in character index and not byte index. + * 0: start in front of the first character + * @param cnt number of characters to cut + */ +void lv_label_cut_text(lv_obj_t * obj, uint32_t pos, uint32_t cnt); + + + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LABEL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LABEL_H*/ diff --git a/inc/lvgl/src/widgets/label/lv_label_private.h b/inc/lvgl/src/widgets/label/lv_label_private.h new file mode 100644 index 0000000..8681a22 --- /dev/null +++ b/inc/lvgl/src/widgets/label/lv_label_private.h @@ -0,0 +1,76 @@ +/** + * @file lv_label_private.h + * + */ + +#ifndef LV_LABEL_PRIVATE_H +#define LV_LABEL_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../draw/lv_draw_label_private.h" +#include "../../core/lv_obj_private.h" +#include "lv_label.h" + +#if LV_USE_LABEL != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_label_t { + lv_obj_t obj; + char * text; +#if LV_USE_TRANSLATION + char * translation_tag; +#endif /*LV_USE_TRANSLATION*/ + char dot[LV_LABEL_DOT_NUM + 1]; /**< Bytes that have been replaced with dots */ + uint32_t dot_begin; /**< Offset where bytes have been replaced with dots */ + +#if LV_LABEL_LONG_TXT_HINT + lv_draw_label_hint_t hint; +#endif + +#if LV_LABEL_TEXT_SELECTION + uint32_t sel_start; + uint32_t sel_end; +#endif + + lv_point_t size_cache; /**< Text size cache */ + lv_point_t offset; /**< Text draw position offset */ + lv_label_long_mode_t long_mode : 4; /**< Determine what to do with the long texts */ + uint8_t static_txt : 1; /**< Flag to indicate the text is static */ + uint8_t recolor : 1; /**< Enable in-line letter re-coloring*/ + uint8_t expand : 1; /**< Ignore real width (used by the library with LV_LABEL_LONG_MODE_SCROLL) */ + uint8_t invalid_size_cache : 1; /**< 1: Recalculate size and update cache */ + uint8_t need_refr_text : 1; /**< 1: Refresh text after layout update completion */ + + lv_point_t text_size; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LABEL != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LABEL_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/led/lv_led.c b/inc/lvgl/src/widgets/led/lv_led.c new file mode 100644 index 0000000..e4c5def --- /dev/null +++ b/inc/lvgl/src/widgets/led/lv_led.c @@ -0,0 +1,208 @@ +/** + * @file lv_led.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_led_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" + +#if LV_USE_LED + +#include "../../misc/lv_assert.h" +#include "../../themes/lv_theme.h" +#include "../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_led_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_led_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_led_properties[] = { + { + .id = LV_PROPERTY_LED_COLOR, + .setter = lv_led_set_color, + .getter = lv_led_get_color, + }, + { + .id = LV_PROPERTY_LED_BRIGHTNESS, + .setter = lv_led_set_brightness, + .getter = lv_led_get_brightness, + }, +}; +#endif + +const lv_obj_class_t lv_led_class = { + .base_class = &lv_obj_class, + .constructor_cb = lv_led_constructor, + .width_def = LV_DPI_DEF / 5, + .height_def = LV_DPI_DEF / 5, + .event_cb = lv_led_event, + .instance_size = sizeof(lv_led_t), + .name = "lv_led", + LV_PROPERTY_CLASS_FIELDS(led, LED) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_led_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_led_set_color(lv_obj_t * obj, lv_color_t color) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_led_t * led = (lv_led_t *)obj; + led->color = color; + lv_obj_invalidate(obj); +} + +void lv_led_set_brightness(lv_obj_t * obj, uint8_t bright) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_led_t * led = (lv_led_t *)obj; + if(led->bright == bright) return; + + led->bright = LV_CLAMP(LV_LED_BRIGHT_MIN, bright, LV_LED_BRIGHT_MAX); + + /*Invalidate the object there fore it will be redrawn*/ + lv_obj_invalidate(obj); +} + +void lv_led_on(lv_obj_t * led) +{ + lv_led_set_brightness(led, LV_LED_BRIGHT_MAX); +} + +void lv_led_off(lv_obj_t * led) +{ + lv_led_set_brightness(led, LV_LED_BRIGHT_MIN); +} + +void lv_led_toggle(lv_obj_t * obj) +{ + uint8_t bright = lv_led_get_brightness(obj); + if(bright > (LV_LED_BRIGHT_MIN + LV_LED_BRIGHT_MAX) >> 1) + lv_led_off(obj); + else + lv_led_on(obj); +} + +/*===================== + * Getter functions + *====================*/ + +uint8_t lv_led_get_brightness(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_led_t * led = (lv_led_t *)obj; + return led->bright; +} + +lv_color_t lv_led_get_color(const lv_obj_t * obj) +{ + lv_led_t * led = (lv_led_t *)obj; + return led->color; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_led_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_led_t * led = (lv_led_t *)obj; + led->color = lv_theme_get_color_primary(obj); + led->bright = LV_LED_BRIGHT_MAX; +} + +static void lv_led_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /* Call the ancestor's event handler */ + lv_event_code_t code = lv_event_get_code(e); + if(code != LV_EVENT_DRAW_MAIN && code != LV_EVENT_DRAW_MAIN_END) { + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + } + + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_DRAW_MAIN) { + /*Make darker colors in a temporary style according to the brightness*/ + lv_led_t * led = (lv_led_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_MAIN, &rect_dsc); + + /*Use the original colors brightness to modify color->led*/ + rect_dsc.bg_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.bg_color)); + rect_dsc.bg_grad.stops[0].color = lv_color_mix(led->color, lv_color_black(), + lv_color_brightness(rect_dsc.bg_grad.stops[0].color)); + rect_dsc.bg_grad.stops[1].color = lv_color_mix(led->color, lv_color_black(), + lv_color_brightness(rect_dsc.bg_grad.stops[1].color)); + rect_dsc.shadow_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.shadow_color)); + rect_dsc.border_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.border_color)); + rect_dsc.outline_color = lv_color_mix(led->color, lv_color_black(), lv_color_brightness(rect_dsc.outline_color)); + + /*Mix. the color with black proportionally with brightness*/ + rect_dsc.bg_color = lv_color_mix(rect_dsc.bg_color, lv_color_black(), led->bright); + rect_dsc.bg_grad.stops[0].color = lv_color_mix(rect_dsc.bg_grad.stops[0].color, lv_color_black(), led->bright); + rect_dsc.bg_grad.stops[1].color = lv_color_mix(rect_dsc.bg_grad.stops[1].color, lv_color_black(), led->bright); + rect_dsc.border_color = lv_color_mix(rect_dsc.border_color, lv_color_black(), led->bright); + rect_dsc.shadow_color = lv_color_mix(rect_dsc.shadow_color, lv_color_black(), led->bright); + rect_dsc.outline_color = lv_color_mix(rect_dsc.outline_color, lv_color_black(), led->bright); + + /*Set the current shadow width according to brightness proportionally between LV_LED_BRIGHT_OFF + * and LV_LED_BRIGHT_ON*/ + rect_dsc.shadow_width = ((led->bright - LV_LED_BRIGHT_MIN) * rect_dsc.shadow_width) / + (LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN); + rect_dsc.shadow_spread = ((led->bright - LV_LED_BRIGHT_MIN) * rect_dsc.shadow_spread) / + (LV_LED_BRIGHT_MAX - LV_LED_BRIGHT_MIN); + + lv_draw_rect(layer, &rect_dsc, &obj->coords); + } +} + +#endif diff --git a/inc/lvgl/src/widgets/led/lv_led.h b/inc/lvgl/src/widgets/led/lv_led.h new file mode 100644 index 0000000..9f15d37 --- /dev/null +++ b/inc/lvgl/src/widgets/led/lv_led.h @@ -0,0 +1,114 @@ +/** + * @file lv_led.h + * + */ + +#ifndef LV_LED_H +#define LV_LED_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_LED + +/********************* + * DEFINES + *********************/ +/** Brightness when the LED if OFF */ +#ifndef LV_LED_BRIGHT_MIN +# define LV_LED_BRIGHT_MIN 80 +#endif + +/** Brightness when the LED if ON */ +#ifndef LV_LED_BRIGHT_MAX +# define LV_LED_BRIGHT_MAX 255 +#endif + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_led_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_led_id_t { + LV_PROPERTY_ID(LED, COLOR, LV_PROPERTY_TYPE_COLOR, 0), + LV_PROPERTY_ID(LED, BRIGHTNESS, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_LED_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a led object + * @param parent pointer to an object, it will be the parent of the new led + * @return pointer to the created led + */ +lv_obj_t * lv_led_create(lv_obj_t * parent); + +/** + * Set the color of the LED + * @param led pointer to a LED object + * @param color the color of the LED + */ +void lv_led_set_color(lv_obj_t * led, lv_color_t color); + +/** + * Set the brightness of a LED object + * @param led pointer to a LED object + * @param bright LV_LED_BRIGHT_MIN (max. dark) ... LV_LED_BRIGHT_MAX (max. light) + */ +void lv_led_set_brightness(lv_obj_t * led, uint8_t bright); + +/** + * Light on a LED + * @param led pointer to a LED object + */ +void lv_led_on(lv_obj_t * led); + +/** + * Light off a LED + * @param led pointer to a LED object + */ +void lv_led_off(lv_obj_t * led); + +/** + * Toggle the state of a LED + * @param led pointer to a LED object + */ +void lv_led_toggle(lv_obj_t * led); + +/** + * Get the brightness of a LED object + * @param obj pointer to LED object + * @return bright 0 (max. dark) ... 255 (max. light) + */ +uint8_t lv_led_get_brightness(const lv_obj_t * obj); + +/** + * Get the color of a LED object + * @param obj pointer to LED object + * @return color color of the LED + */ +lv_color_t lv_led_get_color(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LED*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LED_H*/ diff --git a/inc/lvgl/src/widgets/led/lv_led_private.h b/inc/lvgl/src/widgets/led/lv_led_private.h new file mode 100644 index 0000000..77b5490 --- /dev/null +++ b/inc/lvgl/src/widgets/led/lv_led_private.h @@ -0,0 +1,52 @@ +/** + * @file lv_led_private.h + * + */ + +#ifndef LV_LED_PRIVATE_H +#define LV_LED_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_led.h" + +#if LV_USE_LED +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Data of led */ +struct _lv_led_t { + lv_obj_t obj; + lv_color_t color; + uint8_t bright; /**< Current brightness of the LED (0..255)*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LED */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LED_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/line/lv_line.c b/inc/lvgl/src/widgets/line/lv_line.c new file mode 100644 index 0000000..37de8b4 --- /dev/null +++ b/inc/lvgl/src/widgets/line/lv_line.c @@ -0,0 +1,280 @@ +/** + * @file lv_line.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_line_private.h" +#include "../../core/lv_obj_class_private.h" + + +#if LV_USE_LINE != 0 +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_types.h" +#include "../../draw/lv_draw.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_line_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_line_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num, bool mut); +static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_line_properties[] = { + { + .id = LV_PROPERTY_LINE_Y_INVERT, + .setter = lv_line_set_y_invert, + .getter = lv_line_get_y_invert, + }, +}; +#endif + +const lv_obj_class_t lv_line_class = { + .constructor_cb = lv_line_constructor, + .event_cb = lv_line_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_line_t), + .base_class = &lv_obj_class, + .name = "lv_line", + LV_PROPERTY_CLASS_FIELDS(line, LINE) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_line_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num) +{ + line_set_points(obj, points, point_num, false); +} + +void lv_line_set_points_mutable(lv_obj_t * obj, lv_point_precise_t points[], uint32_t point_num) +{ + line_set_points(obj, points, point_num, true); +} + +void lv_line_set_y_invert(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + if(line->y_inv == en) return; + + line->y_inv = en ? 1U : 0U; + + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +const lv_point_precise_t * lv_line_get_points(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + return line->point_array.constant; +} + +uint32_t lv_line_get_point_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + return line->point_num; +} + +bool lv_line_is_point_array_mutable(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + return line->point_array_is_mutable; +} + +lv_point_precise_t * lv_line_get_points_mutable(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + if(!line->point_array_is_mutable) { + LV_LOG_WARN("the line point array is not mutable"); + return NULL; + } + return line->point_array.mut; +} + +bool lv_line_get_y_invert(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + + return line->y_inv == 1U; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_line_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_line_t * line = (lv_line_t *)obj; + + line->point_num = 0; + line->point_array.constant = NULL; + line->y_inv = 0; + line->point_array_is_mutable = 0; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num, bool mut) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_line_t * line = (lv_line_t *)obj; + line->point_array.constant = points; + line->point_num = point_num; + line->point_array_is_mutable = mut; + + lv_obj_refresh_self_size(obj); + + lv_obj_invalidate(obj); +} + +static inline lv_value_precise_t resolve_point_coord(lv_value_precise_t coord, int32_t max) +{ + if(LV_COORD_IS_PCT((int32_t)coord)) { + return LV_CLAMP(0, max * LV_COORD_GET_PCT((int32_t)coord) / 100, max); + } + else { + return coord; + } +} + +static void lv_line_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /*The corner of the skew lines is out of the intended area*/ + int32_t line_width = lv_obj_get_style_line_width(obj, LV_PART_MAIN); + int32_t * s = lv_event_get_param(e); + if(*s < line_width) *s = line_width; + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_line_t * line = (lv_line_t *)obj; + + if(line->point_num == 0 || line->point_array.constant == NULL) return; + + lv_point_t * p = lv_event_get_param(e); + int32_t w = 0; + int32_t h = 0; + + uint32_t i; + for(i = 0; i < line->point_num; i++) { + if(!LV_COORD_IS_PCT((int32_t)line->point_array.constant[i].x)) { + w = (int32_t)LV_MAX(line->point_array.constant[i].x, w); + } + + if(!LV_COORD_IS_PCT((int32_t)line->point_array.constant[i].y)) { + h = (int32_t)LV_MAX(line->point_array.constant[i].y, h); + } + } + + p->x = w; + p->y = h; + } + else if(code == LV_EVENT_DRAW_MAIN) { + lv_line_t * line = (lv_line_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + if(line->point_num < 2 || line->point_array.constant == NULL) return; + + lv_area_t area; + lv_obj_get_coords(obj, &area); + int32_t x_ofs = area.x1 - lv_obj_get_scroll_x(obj); + int32_t y_ofs = area.y1 - lv_obj_get_scroll_y(obj); + + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + line_dsc.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); + + /*Read all points and draw the lines*/ + uint32_t i; + for(i = 0; i < line->point_num - 1; i++) { + int32_t w = lv_obj_get_width(obj); + int32_t h = lv_obj_get_height(obj); + + line_dsc.p1.x = resolve_point_coord(line->point_array.constant[i].x, w) + x_ofs; + line_dsc.p1.y = resolve_point_coord(line->point_array.constant[i].y, h); + + line_dsc.p2.x = resolve_point_coord(line->point_array.constant[i + 1].x, w) + x_ofs; + line_dsc.p2.y = resolve_point_coord(line->point_array.constant[i + 1].y, h); + + if(line->y_inv == 0) { + line_dsc.p1.y = line_dsc.p1.y + y_ofs; + line_dsc.p2.y = line_dsc.p2.y + y_ofs; + } + else { + line_dsc.p1.y = h - line_dsc.p1.y + y_ofs; + line_dsc.p2.y = h - line_dsc.p2.y + y_ofs; + } + + lv_draw_line(layer, &line_dsc); + line_dsc.round_start = 0; /*Draw the rounding only on the end points after the first line*/ + } + } +} +#endif diff --git a/inc/lvgl/src/widgets/line/lv_line.h b/inc/lvgl/src/widgets/line/lv_line.h new file mode 100644 index 0000000..3a0b05c --- /dev/null +++ b/inc/lvgl/src/widgets/line/lv_line.h @@ -0,0 +1,125 @@ +/** + * @file lv_line.h + * + */ + +#ifndef LV_LINE_H +#define LV_LINE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" +#if LV_USE_LINE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_line_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_line_id_t { + LV_PROPERTY_ID(LINE, Y_INVERT, LV_PROPERTY_TYPE_BOOL, 0), + LV_PROPERTY_LINE_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a line object + * @param parent pointer to an object, it will be the parent of the new line + * @return pointer to the created line + */ +lv_obj_t * lv_line_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set an array of points. The line object will connect these points. + * @param obj pointer to a line object + * @param points an array of points. Only the address is saved, so the array needs to be alive while the line exists + * @param point_num number of points in 'point_a' + */ +void lv_line_set_points(lv_obj_t * obj, const lv_point_precise_t points[], uint32_t point_num); + +/** + * Set a non-const array of points. Identical to `lv_line_set_points` except the array may be retrieved by `lv_line_get_points_mutable`. + * @param obj pointer to a line object + * @param points a non-const array of points. Only the address is saved, so the array needs to be alive while the line exists. + * @param point_num number of points in 'point_a' + */ +void lv_line_set_points_mutable(lv_obj_t * obj, lv_point_precise_t points[], uint32_t point_num); + +/** + * Enable (or disable) the y coordinate inversion. + * If enabled then y will be subtracted from the height of the object, + * therefore the y = 0 coordinate will be on the bottom. + * @param obj pointer to a line object + * @param en true: enable the y inversion, false:disable the y inversion + */ +void lv_line_set_y_invert(lv_obj_t * obj, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the pointer to the array of points. + * @param obj pointer to a line object + * @return const pointer to the array of points + */ +const lv_point_precise_t * lv_line_get_points(lv_obj_t * obj); + +/** + * Get the number of points in the array of points. + * @param obj pointer to a line object + * @return number of points in array of points + */ +uint32_t lv_line_get_point_count(lv_obj_t * obj); + +/** + * Check the mutability of the stored point array pointer. + * @param obj pointer to a line object + * @return true: the point array pointer is mutable, false: constant + */ +bool lv_line_is_point_array_mutable(lv_obj_t * obj); + +/** + * Get a pointer to the mutable array of points or NULL if it is not mutable + * @param obj pointer to a line object + * @return pointer to the array of points. NULL if not mutable. + */ +lv_point_precise_t * lv_line_get_points_mutable(lv_obj_t * obj); + +/** + * Get the y inversion attribute + * @param obj pointer to a line object + * @return true: y inversion is enabled, false: disabled + */ +bool lv_line_get_y_invert(const lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LINE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LINE_H*/ diff --git a/inc/lvgl/src/widgets/line/lv_line_private.h b/inc/lvgl/src/widgets/line/lv_line_private.h new file mode 100644 index 0000000..4899392 --- /dev/null +++ b/inc/lvgl/src/widgets/line/lv_line_private.h @@ -0,0 +1,57 @@ +/** + * @file lv_line_private.h + * + */ + +#ifndef LV_LINE_PRIVATE_H +#define LV_LINE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_line.h" + +#if LV_USE_LINE != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Data of line */ +struct _lv_line_t { + lv_obj_t obj; + union { + const lv_point_precise_t * constant; + lv_point_precise_t * mut; + } point_array; /**< Pointer to an array with the points of the line*/ + uint32_t point_num; /**< Number of points in 'point_array'*/ + uint32_t y_inv : 1; /**< 1: y == 0 will be on the bottom*/ + uint32_t point_array_is_mutable : 1; /**< whether the point array is const or mutable*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_LINE != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LINE_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/list/lv_list.c b/inc/lvgl/src/widgets/list/lv_list.c new file mode 100644 index 0000000..3da8be7 --- /dev/null +++ b/inc/lvgl/src/widgets/list/lv_list.c @@ -0,0 +1,177 @@ +/** + * @file lv_list.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj_class_private.h" +#include "lv_list.h" +#include "../../layouts/flex/lv_flex.h" +#include "../../display/lv_display.h" +#include "../label/lv_label.h" +#include "../image/lv_image.h" +#include "../button/lv_button.h" + +#if LV_USE_LIST + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_list_class) +#define MY_CLASS_BUTTON (&lv_list_button_class) +#define MY_CLASS_TEXT (&lv_list_text_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +const lv_obj_class_t lv_list_class = { + .base_class = &lv_obj_class, + .width_def = (LV_DPI_DEF * 3) / 2, + .height_def = LV_DPI_DEF * 2, + .name = "lv_list", +}; + +const lv_obj_class_t lv_list_button_class = { + .base_class = &lv_button_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .name = "lv_list_button", +}; + +const lv_obj_class_t lv_list_text_class = { + .base_class = &lv_label_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .name = "lv_list_text", +}; + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_list_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + return obj; +} + +lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt) +{ + LV_LOG_INFO("begin"); + + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS_TEXT, list); + lv_obj_class_init_obj(obj); + lv_label_set_text(obj, txt); + return obj; +} + +lv_obj_t * lv_list_add_button(lv_obj_t * list, const void * icon, const char * txt) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS_BUTTON, list); + lv_obj_class_init_obj(obj); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + +#if LV_USE_IMAGE == 1 + if(icon) { + lv_obj_t * img = lv_image_create(obj); + lv_image_set_src(img, icon); + } +#endif + + if(txt) { + lv_obj_t * label = lv_label_create(obj); + lv_label_set_text(label, txt); + lv_label_set_long_mode(label, LV_LABEL_LONG_MODE_SCROLL_CIRCULAR); + lv_obj_set_flex_grow(label, 1); + } + + return obj; +} + +const char * lv_list_get_button_text(lv_obj_t * list, lv_obj_t * btn) +{ + LV_UNUSED(list); + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(btn); i++) { + lv_obj_t * child = lv_obj_get_child(btn, i); + if(lv_obj_check_type(child, &lv_label_class)) { + return lv_label_get_text(child); + } + + } + + return ""; +} + +void lv_list_set_button_text(lv_obj_t * list, lv_obj_t * btn, const char * txt) +{ + LV_UNUSED(list); + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(btn); i++) { + lv_obj_t * child = lv_obj_get_child(btn, i); + if(lv_obj_check_type(child, &lv_label_class)) { + lv_label_set_text(child, txt); + return; + } + } +} + +#if LV_USE_TRANSLATION + +lv_obj_t * lv_list_add_translation_tag(lv_obj_t * list, const char * tag) +{ + LV_LOG_INFO("begin"); + + lv_obj_t * obj = lv_list_add_text(list, NULL); + lv_label_set_translation_tag(obj, tag); + return obj; +} + +lv_obj_t * lv_list_add_button_translation_tag(lv_obj_t * list, const void * icon, const char * tag) +{ + LV_LOG_INFO("begin"); + + lv_obj_t * obj = lv_list_add_button(list, icon, ""); + lv_list_set_button_translation_tag(list, obj, tag); + + return obj; +} + +void lv_list_set_button_translation_tag(lv_obj_t * list, lv_obj_t * btn, const char * tag) +{ + LV_UNUSED(list); + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(btn); i++) { + lv_obj_t * child = lv_obj_get_child(btn, i); + if(lv_obj_check_type(child, &lv_label_class)) { + lv_label_set_translation_tag(child, tag); + return; + } + } +} + +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif /*LV_USE_LIST*/ diff --git a/inc/lvgl/src/widgets/list/lv_list.h b/inc/lvgl/src/widgets/list/lv_list.h new file mode 100644 index 0000000..19de894 --- /dev/null +++ b/inc/lvgl/src/widgets/list/lv_list.h @@ -0,0 +1,118 @@ +/** + * @file lv_list.h + * + */ + +#ifndef LV_LIST_H +#define LV_LIST_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_LIST + +#if LV_USE_FLEX == 0 +#error "lv_list: lv_flex is required. Enable it in lv_conf.h (LV_USE_FLEX 1)" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_list_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_list_text_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_list_button_class; +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a list object + * @param parent pointer to an object, it will be the parent of the new list + * @return pointer to the created list + */ +lv_obj_t * lv_list_create(lv_obj_t * parent); + +/** + * Add text to a list + * @param list pointer to a list, it will be the parent of the new label + * @param txt text of the new label + * @return pointer to the created label + */ +lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt); + +/** + * Add button to a list + * @param list pointer to a list, it will be the parent of the new button + * @param icon icon for the button, when NULL it will have no icon + * @param txt text of the new button, when NULL no text will be added + * @return pointer to the created button + */ +lv_obj_t * lv_list_add_button(lv_obj_t * list, const void * icon, const char * txt); + +/** + * Get text of a given list button + * @param list pointer to a list + * @param btn pointer to the button + * @return text of btn, if btn doesn't have text "" will be returned + */ +const char * lv_list_get_button_text(lv_obj_t * list, lv_obj_t * btn); + +/** + * Set text of a given list button + * @param list pointer to a list + * @param btn pointer to the button + * @param txt pointer to the text + */ +void lv_list_set_button_text(lv_obj_t * list, lv_obj_t * btn, const char * txt); + +#if LV_USE_TRANSLATION + +/** + * Add translation tag text to a list + * @param list pointer to a list, it will be the parent of the new label + * @param tag translation tag of the new label + * @return pointer to the created label + */ +lv_obj_t * lv_list_add_translation_tag(lv_obj_t * list, const char * tag); + +/** + * Add translation tag button to a list + * @param list pointer to a list, it will be the parent of the new button + * @param icon icon for the button, when NULL it will have no icon + * @param tag translation tag of the new button, when NULL no translation tag will be added + * @return pointer to the created button + */ +lv_obj_t * lv_list_add_button_translation_tag(lv_obj_t * list, const void * icon, const char * tag); + +/** + * Set translation tag text of a given list button + * @param list pointer to a list + * @param btn pointer to the button + * @param tag pointer to the translation tag + */ +void lv_list_set_button_translation_tag(lv_obj_t * list, lv_obj_t * btn, const char * tag); + +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LIST*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LIST_H*/ diff --git a/inc/lvgl/src/widgets/lottie/lv_lottie.c b/inc/lvgl/src/widgets/lottie/lv_lottie.c new file mode 100644 index 0000000..f3b968a --- /dev/null +++ b/inc/lvgl/src/widgets/lottie/lv_lottie.c @@ -0,0 +1,238 @@ +/** + * @file lv_lottie.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_lottie_private.h" +#include "../../lv_conf_internal.h" +#if LV_USE_LOTTIE + +#if LV_USE_THORVG_EXTERNAL + #include +#else + #include "../../libs/thorvg/thorvg_capi.h" +#endif + +#include "../../misc/lv_timer.h" +#include "../../core/lv_obj_class_private.h" +#include "../../misc/cache/lv_cache.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_lottie_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_lottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_lottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void anim_exec_cb(void * var, int32_t v); +static void lottie_update(lv_lottie_t * lottie, int32_t v); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_lottie_class = { + .constructor_cb = lv_lottie_constructor, + .destructor_cb = lv_lottie_destructor, + .width_def = LV_DPI_DEF, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_lottie_t), + .base_class = &lv_canvas_class, + .name = "lv_lottie", +}; + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_lottie_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_lottie_set_buffer(lv_obj_t * obj, int32_t w, int32_t h, void * buf) +{ + lv_lottie_t * lottie = (lv_lottie_t *)obj; + int32_t stride = lv_draw_buf_width_to_stride(w, LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED); + buf = lv_draw_buf_align(buf, LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED); + + tvg_swcanvas_set_target(lottie->tvg_canvas, buf, stride / 4, w, h, TVG_COLORSPACE_ARGB8888); + tvg_canvas_push(lottie->tvg_canvas, lottie->tvg_paint); + lv_canvas_set_buffer(obj, buf, w, h, LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED); + tvg_picture_set_size(lottie->tvg_paint, w, h); + + /* Rendered output images are premultiplied */ + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + lv_draw_buf_set_flag(draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); + + /*Force updating when the buffer changes*/ + float f_current; + tvg_animation_get_frame(lottie->tvg_anim, &f_current); + anim_exec_cb(obj, (int32_t) f_current); +} + +void lv_lottie_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf) +{ + if(draw_buf->header.cf != LV_COLOR_FORMAT_ARGB8888 && draw_buf->header.cf != LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED) { + LV_LOG_WARN("The draw buf needs to have ARGB8888 or ARGB8888_PREMULTIPLIED color format"); + return; + } + + lv_lottie_t * lottie = (lv_lottie_t *)obj; + tvg_swcanvas_set_target(lottie->tvg_canvas, (void *)draw_buf->data, draw_buf->header.stride / 4, + draw_buf->header.w, draw_buf->header.h, TVG_COLORSPACE_ARGB8888); + tvg_canvas_push(lottie->tvg_canvas, lottie->tvg_paint); + lv_canvas_set_draw_buf(obj, draw_buf); + tvg_picture_set_size(lottie->tvg_paint, draw_buf->header.w, draw_buf->header.h); + + /* Rendered output images are premultiplied */ + lv_draw_buf_set_flag(draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED); + + /*Force updating when the buffer changes*/ + float f_current; + tvg_animation_get_frame(lottie->tvg_anim, &f_current); + anim_exec_cb(obj, (int32_t) f_current); +} + +void lv_lottie_set_src_data(lv_obj_t * obj, const void * src, size_t src_size) +{ + lv_lottie_t * lottie = (lv_lottie_t *)obj; + tvg_picture_load_data(lottie->tvg_paint, src, src_size, "lottie", true); + lv_draw_buf_t * canvas_draw_buf = lv_canvas_get_draw_buf(obj); + if(canvas_draw_buf) { + tvg_picture_set_size(lottie->tvg_paint, canvas_draw_buf->header.w, canvas_draw_buf->header.h); + } + + float f_total; + tvg_animation_get_total_frame(lottie->tvg_anim, &f_total); + lv_anim_set_duration(lottie->anim, (int32_t)f_total * 1000 / 60); /*60 FPS*/ + lottie->anim->act_time = 0; + lottie->anim->end_value = (int32_t)f_total; + lottie->anim->reverse_play_in_progress = false; + lottie_update(lottie, 0); /*Render immediately*/ +} + +void lv_lottie_set_src_file(lv_obj_t * obj, const char * src) +{ + lv_lottie_t * lottie = (lv_lottie_t *)obj; + tvg_picture_load(lottie->tvg_paint, src); + lv_draw_buf_t * canvas_draw_buf = lv_canvas_get_draw_buf(obj); + if(canvas_draw_buf) { + tvg_picture_set_size(lottie->tvg_paint, canvas_draw_buf->header.w, canvas_draw_buf->header.h); + } + + float f_total; + tvg_animation_get_total_frame(lottie->tvg_anim, &f_total); + lv_anim_set_duration(lottie->anim, (int32_t)f_total * 1000 / 60); /*60 FPS*/ + lottie->anim->act_time = 0; + lottie->anim->end_value = (int32_t)f_total; + lottie->anim->reverse_play_in_progress = false; + lottie_update(lottie, 0); /*Render immediately*/ +} + + +lv_anim_t * lv_lottie_get_anim(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_lottie_t * lottie = (lv_lottie_t *)obj; + return lottie->anim; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_lottie_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_set_size(obj, LV_SIZE_CONTENT, LV_SIZE_CONTENT); + + lv_lottie_t * lottie = (lv_lottie_t *)obj; + lottie->tvg_anim = tvg_animation_new(); + + lottie->tvg_paint = tvg_animation_get_picture(lottie->tvg_anim); + + lottie->tvg_canvas = tvg_swcanvas_create(); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_exec_cb(&a, anim_exec_cb); + lv_anim_set_var(&a, obj); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lottie->anim = lv_anim_start(&a); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_lottie_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_lottie_t * lottie = (lv_lottie_t *)obj; + + tvg_animation_del(lottie->tvg_anim); + tvg_canvas_destroy(lottie->tvg_canvas); +} + +static void anim_exec_cb(void * var, int32_t v) +{ + lv_lottie_t * lottie = var; + + /*Do not render not visible animations.*/ + if(lv_obj_is_visible(var)) { + lottie_update(lottie, v); + if(lottie->anim) { + lottie->last_rendered_time = lottie->anim->act_time; + } + } + else { + /*Artificially keep the animation on the last rendered frame's time + *To avoid a jump when the widget becomes visible*/ + if(lottie->anim) { + lottie->anim->act_time = lottie->last_rendered_time; + } + } +} + +static void lottie_update(lv_lottie_t * lottie, int32_t v) +{ + lv_obj_t * obj = (lv_obj_t *) lottie; + + lv_draw_buf_t * draw_buf = lv_canvas_get_draw_buf(obj); + if(draw_buf) { + lv_draw_buf_clear(draw_buf, NULL); + + /*Drop old cached image*/ + lv_image_cache_drop(lv_image_get_src(obj)); + } + + tvg_animation_set_frame(lottie->tvg_anim, v); + tvg_canvas_update(lottie->tvg_canvas); + tvg_canvas_draw(lottie->tvg_canvas); + tvg_canvas_sync(lottie->tvg_canvas); + + lv_obj_invalidate(obj); +} + +#endif /*LV_USE_LOTTIE*/ diff --git a/inc/lvgl/src/widgets/lottie/lv_lottie.h b/inc/lvgl/src/widgets/lottie/lv_lottie.h new file mode 100644 index 0000000..1ccfe16 --- /dev/null +++ b/inc/lvgl/src/widgets/lottie/lv_lottie.h @@ -0,0 +1,102 @@ +/** + * @file lv_lottie.h + * + */ + +#ifndef LV_LOTTIE_H +#define LV_LOTTIE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_types.h" +#if LV_USE_LOTTIE + +/*Testing of dependencies*/ +#if LV_USE_CANVAS == 0 +#error "lv_lottie: lv_canvas is required. Enable it in lv_conf.h (LV_USE_CANVAS 1)" +#endif + +#if LV_USE_THORVG == 0 +#error "lv_lottie: ThorVG is required. Enable it in lv_conf.h (LV_USE_THORVG_INTERNAL/EXTERNAL 1)" +#endif + +#include "../../draw/lv_draw_buf.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a lottie animation + * @param parent pointer to the parent widget + * @return pointer to the created Lottie animation widget + */ +lv_obj_t * lv_lottie_create(lv_obj_t * parent); + +/** + * Set a buffer for the animation. It also defines the size of the animation + * @param obj pointer to a lottie widget + * @param w width of the animation and buffer + * @param h height of the animation and buffer + * @param buf a static buffer with `width x height x 4` byte size + */ +void lv_lottie_set_buffer(lv_obj_t * obj, int32_t w, int32_t h, void * buf); + +/** + * Set a draw buffer for the animation. It also defines the size of the animation + * @param obj pointer to a lottie widget + * @param draw_buf an initialized draw buffer with ARGB8888 color format + */ +void lv_lottie_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf); + +/** + * Set the source for the animation as an array + * @param obj pointer to a lottie widget + * @param src the lottie animation converted to an nul terminated array + * @param src_size size of the source array in bytes + */ +void lv_lottie_set_src_data(lv_obj_t * obj, const void * src, size_t src_size); + +/** + * Set the source for the animation as a path. + * Lottie doesn't use LVGL's File System API. + * @param obj pointer to a lottie widget + * @param src path to a json file, e.g. "path/to/file.json" + */ +void lv_lottie_set_src_file(lv_obj_t * obj, const char * src); + +/** + * Get the LVGL animation which controls the lottie animation + * @param obj pointer to a lottie widget + * @return the LVGL animation + */ +lv_anim_t * lv_lottie_get_anim(lv_obj_t * obj); + +/********************** + * GLOBAL VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_LOTTIE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LOTTIE_H*/ diff --git a/inc/lvgl/src/widgets/lottie/lv_lottie_private.h b/inc/lvgl/src/widgets/lottie/lv_lottie_private.h new file mode 100644 index 0000000..6362afb --- /dev/null +++ b/inc/lvgl/src/widgets/lottie/lv_lottie_private.h @@ -0,0 +1,60 @@ +/** + * @file lv_lottie_private.h + * + */ + +#ifndef LV_LOTTIE_PRIVATE_H +#define LV_LOTTIE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../lv_conf_internal.h" +#if LV_USE_LOTTIE + +#include "lv_lottie.h" +#include "../canvas/lv_canvas_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_THORVG_EXTERNAL +#include +#else +#include "../../libs/thorvg/thorvg_capi.h" +#endif + +typedef struct { + lv_canvas_t canvas; + Tvg_Paint * tvg_paint; + Tvg_Canvas * tvg_canvas; + Tvg_Animation * tvg_anim; + lv_anim_t * anim; + int32_t last_rendered_time; +} lv_lottie_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_LOTTIE_H*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_LOTTIE_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/menu/lv_menu.c b/inc/lvgl/src/widgets/menu/lv_menu.c new file mode 100644 index 0000000..1b3d461 --- /dev/null +++ b/inc/lvgl/src/widgets/menu/lv_menu.c @@ -0,0 +1,886 @@ +/** + * @file lv_menu.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_menu_private.h" +#include "../../core/lv_obj_class_private.h" + +#if LV_USE_MENU + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_menu_class) + +#include "../../core/lv_obj_private.h" +#include "../../layouts/lv_layout.h" +#include "../../stdlib/lv_string.h" +#include "../label/lv_label.h" +#include "../button/lv_button.h" +#include "../image/lv_image.h" + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_menu_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_cont_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_menu_section_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_menu_properties[] = { + { + .id = LV_PROPERTY_MENU_MODE_HEADER, + .setter = lv_menu_set_mode_header, + .getter = lv_menu_get_mode_header, + }, + { + .id = LV_PROPERTY_MENU_MODE_ROOT_BACK_BUTTON, + .setter = lv_menu_set_mode_root_back_button, + .getter = lv_menu_get_mode_root_back_button, + }, +}; +#endif + +const lv_obj_class_t lv_menu_class = { + .constructor_cb = lv_menu_constructor, + .destructor_cb = lv_menu_destructor, + .base_class = &lv_obj_class, + .width_def = (LV_DPI_DEF * 3) / 2, + .height_def = LV_DPI_DEF * 2, + .instance_size = sizeof(lv_menu_t), + .name = "lv_menu", + LV_PROPERTY_CLASS_FIELDS(menu, MENU) +}; +const lv_obj_class_t lv_menu_page_class = { + .constructor_cb = lv_menu_page_constructor, + .destructor_cb = lv_menu_page_destructor, + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_menu_page_t), + .name = "lv_menu_page", +}; + +const lv_obj_class_t lv_menu_cont_class = { + .constructor_cb = lv_menu_cont_constructor, + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .name = "lv_menu_cont", +}; + +const lv_obj_class_t lv_menu_section_class = { + .constructor_cb = lv_menu_section_constructor, + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .name = "lv_menu_section", +}; + +const lv_obj_class_t lv_menu_separator_class = { + .base_class = &lv_obj_class, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .name = "lv_menu_separator", +}; + +const lv_obj_class_t lv_menu_sidebar_cont_class = { + .base_class = &lv_obj_class, + .name = "lv_menu_sidebar", +}; + +const lv_obj_class_t lv_menu_main_cont_class = { + .base_class = &lv_obj_class, + .name = "lv_menu_main_container", +}; + +const lv_obj_class_t lv_menu_main_header_cont_class = { + .base_class = &lv_obj_class, + .name = "lv_menu_main_header", +}; + +const lv_obj_class_t lv_menu_sidebar_header_cont_class = { + .base_class = &lv_obj_class, + .name = "lv_menu_sidebar_header", +}; + +static void lv_menu_refr(lv_obj_t * obj); +static void lv_menu_refr_sidebar_header_mode(lv_obj_t * obj); +static void lv_menu_refr_main_header_mode(lv_obj_t * obj); +static void lv_menu_load_page_event_cb(lv_event_t * e); +static void lv_menu_obj_delete_event_cb(lv_event_t * e); +static void lv_menu_back_event_cb(lv_event_t * e); +static void lv_menu_value_changed_event_cb(lv_event_t * e); +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_menu_clear_history(lv_obj_t * obj); + +lv_obj_t * lv_menu_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_menu_page_create(lv_obj_t * menu, char const * const title) +{ + LV_ASSERT_OBJ(menu, MY_CLASS); + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_page_class, menu); + lv_obj_class_init_obj(obj); + + lv_menu_page_t * page = (lv_menu_page_t *)obj; + /* Initialise the object */ + page->title = NULL; + page->static_title = false; + lv_menu_set_page_title(obj, title); + + return obj; +} + +lv_obj_t * lv_menu_cont_create(lv_obj_t * parent) +{ + LV_ASSERT_NULL(parent); + if(!parent || (LV_USE_ASSERT_OBJ && + !(lv_obj_has_class(parent, &lv_menu_page_class) + || lv_obj_has_class(parent, &lv_menu_section_class)))) { + LV_LOG_WARN("Invalid parent object type for menu container object"); + return NULL; + } + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_cont_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_menu_section_create(lv_obj_t * parent) +{ + LV_ASSERT_OBJ(parent, &lv_menu_page_class); + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_section_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_menu_separator_create(lv_obj_t * parent) +{ + LV_ASSERT_OBJ(parent, &lv_menu_page_class); + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_menu_separator_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_menu_refr(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + lv_ll_t * history_ll = &(menu->history_ll); + + /* The current menu */ + lv_menu_history_t * act_hist = lv_ll_get_head(history_ll); + + lv_obj_t * page = NULL; + + if(act_hist != NULL) { + page = act_hist->page; + /* Delete the current item from the history */ + lv_ll_remove(history_ll, act_hist); + lv_free(act_hist); + menu->cur_depth--; + } + + /* Set it */ + lv_menu_set_page(obj, page); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + /* Hide previous page */ + if(menu->main_page != NULL) { + lv_obj_set_parent(menu->main_page, menu->storage); + } + + if(page != NULL) { + /* Add a new node */ + lv_ll_t * history_ll = &(menu->history_ll); + lv_menu_history_t * new_node = lv_ll_ins_head(history_ll); + LV_ASSERT_MALLOC(new_node); + new_node->page = page; + menu->cur_depth++; + + /* Place page in main */ + lv_obj_set_parent(page, menu->main); + } + else { + /* Empty page, clear history */ + lv_menu_clear_history(obj); + } + + menu->main_page = page; + + /* If there is a selected tab, update checked state */ + if(menu->selected_tab != NULL) { + if(menu->sidebar_page != NULL) { + lv_obj_add_state(menu->selected_tab, LV_STATE_CHECKED); + } + else { + lv_obj_remove_state(menu->selected_tab, LV_STATE_CHECKED); + } + } + + /* Back btn management */ + if(menu->sidebar_page != NULL) { + /* With sidebar enabled */ + if(menu->sidebar_generated) { + if(menu->mode_root_back_btn == LV_MENU_ROOT_BACK_BUTTON_ENABLED) { + /* Root back btn is always shown if enabled*/ + lv_obj_remove_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + else { + lv_obj_add_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_remove_flag(menu->sidebar_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + } + + if(menu->cur_depth >= 2) { + lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + else { + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + } + else { + /* With sidebar disabled */ + if(menu->cur_depth >= 2 || menu->mode_root_back_btn == LV_MENU_ROOT_BACK_BUTTON_ENABLED) { + lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + else { + lv_obj_add_flag(menu->main_header_back_btn, LV_OBJ_FLAG_HIDDEN); + lv_obj_remove_flag(menu->main_header_back_btn, LV_OBJ_FLAG_CLICKABLE); + } + } + + lv_obj_send_event((lv_obj_t *)menu, LV_EVENT_VALUE_CHANGED, NULL); + + lv_menu_refr_main_header_mode(obj); +} + +void lv_menu_set_sidebar_page(lv_obj_t * obj, lv_obj_t * page) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + /* Sidebar management*/ + if(page != NULL) { + /* Sidebar should be enabled */ + if(!menu->sidebar_generated) { + /* Create sidebar */ + lv_obj_t * sidebar_cont = lv_obj_class_create_obj(&lv_menu_sidebar_cont_class, obj); + lv_obj_class_init_obj(sidebar_cont); + lv_obj_move_to_index(sidebar_cont, 1); + lv_obj_set_size(sidebar_cont, LV_PCT(30), LV_PCT(100)); + lv_obj_set_flex_flow(sidebar_cont, LV_FLEX_FLOW_COLUMN); + lv_obj_add_flag(sidebar_cont, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_remove_flag(sidebar_cont, LV_OBJ_FLAG_CLICKABLE); + menu->sidebar = sidebar_cont; + + lv_obj_t * sidebar_header = lv_obj_class_create_obj(&lv_menu_sidebar_header_cont_class, sidebar_cont); + lv_obj_class_init_obj(sidebar_header); + lv_obj_set_size(sidebar_header, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_flex_flow(sidebar_header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(sidebar_header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_remove_flag(sidebar_header, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(sidebar_header, LV_OBJ_FLAG_EVENT_BUBBLE); + menu->sidebar_header = sidebar_header; + + lv_obj_t * sidebar_header_back_btn = lv_button_create(menu->sidebar_header); + lv_obj_add_event_cb(sidebar_header_back_btn, lv_menu_back_event_cb, LV_EVENT_CLICKED, menu); + lv_obj_add_flag(sidebar_header_back_btn, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_set_flex_flow(sidebar_header_back_btn, LV_FLEX_FLOW_ROW); + menu->sidebar_header_back_btn = sidebar_header_back_btn; + + lv_obj_t * sidebar_header_back_icon = lv_image_create(menu->sidebar_header_back_btn); + lv_image_set_src(sidebar_header_back_icon, LV_SYMBOL_LEFT); + + lv_obj_t * sidebar_header_title = lv_label_create(menu->sidebar_header); + lv_obj_add_flag(sidebar_header_title, LV_OBJ_FLAG_HIDDEN); + menu->sidebar_header_title = sidebar_header_title; + + menu->sidebar_generated = true; + } + + lv_obj_set_parent(page, menu->sidebar); + + lv_menu_refr_sidebar_header_mode(obj); + } + else { + /* Sidebar should be disabled */ + if(menu->sidebar_generated) { + lv_obj_set_parent(menu->sidebar_page, menu->storage); + lv_obj_delete(menu->sidebar); + + menu->sidebar_generated = false; + } + } + + menu->sidebar_page = page; + lv_menu_refr(obj); +} + +void lv_menu_set_mode_header(lv_obj_t * obj, lv_menu_mode_header_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->mode_header != mode) { + menu->mode_header = mode; + lv_menu_refr_main_header_mode(obj); + if(menu->sidebar_generated) lv_menu_refr_sidebar_header_mode(obj); + } +} + +void lv_menu_set_mode_root_back_button(lv_obj_t * obj, lv_menu_mode_root_back_button_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->mode_root_back_btn != mode) { + menu->mode_root_back_btn = mode; + lv_menu_refr(obj); + } +} + +void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * page) +{ + LV_ASSERT_OBJ(menu, MY_CLASS); + + lv_obj_add_flag(obj, LV_OBJ_FLAG_CLICKABLE); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + /* Remove old event */ + uint32_t i; + uint32_t event_cnt = lv_obj_get_event_count(obj); + for(i = 0; i < event_cnt; i++) { + lv_event_dsc_t * event_dsc = lv_obj_get_event_dsc(obj, i); + if(lv_event_dsc_get_cb(event_dsc) == lv_menu_load_page_event_cb) { + /* Free the old event data */ + lv_menu_load_page_event_data_t * old_event_data = lv_event_dsc_get_user_data(event_dsc); + lv_obj_remove_event(obj, i); + /* Also remove the corresponding DELETE event callback */ + event_cnt = lv_obj_get_event_count(obj); + for(uint32_t j = 0; j < event_cnt; j++) { + lv_event_dsc_t * del_dsc = lv_obj_get_event_dsc(obj, j); + if(lv_event_dsc_get_cb(del_dsc) == lv_menu_obj_delete_event_cb && + lv_event_dsc_get_user_data(del_dsc) == old_event_data) { + lv_obj_remove_event(obj, j); + break; + } + } + lv_free(old_event_data); + break; + } + } + + lv_menu_load_page_event_data_t * event_data = lv_malloc(sizeof(lv_menu_load_page_event_data_t)); + event_data->menu = menu; + event_data->page = page; + + lv_obj_add_event_cb(obj, lv_menu_load_page_event_cb, LV_EVENT_CLICKED, event_data); + lv_obj_add_event_cb(obj, lv_menu_obj_delete_event_cb, LV_EVENT_DELETE, event_data); +} + +void lv_menu_set_page_title(lv_obj_t * page_obj, char const * const title) +{ + LV_ASSERT_OBJ(page_obj, &lv_menu_page_class); + + LV_LOG_INFO("begin"); + lv_menu_page_t * page = (lv_menu_page_t *)page_obj; + + /* Cleanup any previous set titles */ + if((!page->static_title) && page->title) { + lv_free(page->title); + page->title = NULL; + } + + if(title) { + page->static_title = false; + page->title = lv_strdup(title); + LV_ASSERT_MALLOC(page->title); + if(page->title == NULL) { + return; + } + } + else { + page->title = NULL; + page->static_title = false; + } +} + +void lv_menu_set_page_title_static(lv_obj_t * page_obj, char const * const title) +{ + LV_ASSERT_OBJ(page_obj, &lv_menu_page_class); + + LV_LOG_INFO("begin"); + lv_menu_page_t * page = (lv_menu_page_t *)page_obj; + + /* Cleanup any previous set titles */ + if((!page->static_title) && page->title) { + lv_free(page->title); + page->title = NULL; + } + + /* Set or clear the static title text */ + if(title) { + page->title = (char *) title; + page->static_title = true; + } + else { + page->title = NULL; + page->static_title = false; + } +} + +/*===================== + * Getter functions + *====================*/ +lv_obj_t * lv_menu_get_cur_main_page(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->main_page; +} + +lv_obj_t * lv_menu_get_cur_sidebar_page(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->sidebar_page; +} + +lv_obj_t * lv_menu_get_main_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->main_header; +} + +lv_obj_t * lv_menu_get_main_header_back_button(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->main_header_back_btn; +} + +lv_obj_t * lv_menu_get_sidebar_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->sidebar_header; +} + +lv_obj_t * lv_menu_get_sidebar_header_back_button(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->sidebar_header_back_btn; +} + +bool lv_menu_back_button_is_root(lv_obj_t * menu, lv_obj_t * obj) +{ + LV_ASSERT_OBJ(menu, MY_CLASS); + + if(obj == ((lv_menu_t *)menu)->sidebar_header_back_btn) { + return true; + } + + if(obj == ((lv_menu_t *)menu)->main_header_back_btn && ((lv_menu_t *)menu)->prev_depth <= 1) { + return true; + } + + return false; +} + +lv_menu_mode_header_t lv_menu_get_mode_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->mode_header; +} + +lv_menu_mode_root_back_button_t lv_menu_get_mode_root_back_button(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_menu_t * menu = (lv_menu_t *)obj; + return menu->mode_root_back_btn; +} + +void lv_menu_clear_history(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + lv_ll_t * history_ll = &(menu->history_ll); + + lv_ll_clear(history_ll); + + menu->cur_depth = 0; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_menu_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_obj_set_layout(obj, LV_LAYOUT_FLEX); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + + lv_menu_t * menu = (lv_menu_t *)obj; + + menu->mode_header = LV_MENU_HEADER_TOP_FIXED; + menu->mode_root_back_btn = LV_MENU_ROOT_BACK_BUTTON_DISABLED; + menu->cur_depth = 0; + menu->prev_depth = 0; + menu->sidebar_generated = false; + + lv_ll_init(&(menu->history_ll), sizeof(lv_menu_history_t)); + + menu->storage = lv_obj_create(obj); + lv_obj_add_flag(menu->storage, LV_OBJ_FLAG_HIDDEN); + + menu->sidebar = NULL; + menu->sidebar_header = NULL; + menu->sidebar_header_back_btn = NULL; + menu->sidebar_header_title = NULL; + menu->sidebar_page = NULL; + + lv_obj_t * main_cont = lv_obj_class_create_obj(&lv_menu_main_cont_class, obj); + lv_obj_class_init_obj(main_cont); + lv_obj_set_height(main_cont, LV_PCT(100)); + lv_obj_set_flex_grow(main_cont, 1); + lv_obj_set_flex_flow(main_cont, LV_FLEX_FLOW_COLUMN); + lv_obj_add_flag(main_cont, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_remove_flag(main_cont, LV_OBJ_FLAG_CLICKABLE); + menu->main = main_cont; + + lv_obj_t * main_header = lv_obj_class_create_obj(&lv_menu_main_header_cont_class, main_cont); + lv_obj_class_init_obj(main_header); + lv_obj_set_size(main_header, LV_PCT(100), LV_SIZE_CONTENT); + lv_obj_set_flex_flow(main_header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(main_header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_remove_flag(main_header, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_flag(main_header, LV_OBJ_FLAG_EVENT_BUBBLE); + menu->main_header = main_header; + + /* Create the default simple back btn and title */ + lv_obj_t * main_header_back_btn = lv_button_create(menu->main_header); + lv_obj_add_event_cb(main_header_back_btn, lv_menu_back_event_cb, LV_EVENT_CLICKED, menu); + lv_obj_add_flag(main_header_back_btn, LV_OBJ_FLAG_EVENT_BUBBLE); + lv_obj_set_flex_flow(main_header_back_btn, LV_FLEX_FLOW_ROW); + menu->main_header_back_btn = main_header_back_btn; + + lv_obj_t * main_header_back_icon = lv_image_create(menu->main_header_back_btn); + lv_image_set_src(main_header_back_icon, LV_SYMBOL_LEFT); + + lv_obj_t * main_header_title = lv_label_create(menu->main_header); + lv_obj_add_flag(main_header_title, LV_OBJ_FLAG_HIDDEN); + menu->main_header_title = main_header_title; + + menu->main_page = NULL; + menu->selected_tab = NULL; + + lv_obj_add_event_cb(obj, lv_menu_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, menu); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_menu_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_menu_t * menu = (lv_menu_t *)obj; + lv_ll_t * history_ll = &(menu->history_ll); + + lv_ll_clear(history_ll); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_menu_page_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_menu_t * menu = (lv_menu_t *)lv_obj_get_parent(obj); + + lv_obj_set_parent(obj, ((lv_menu_t *)menu)->storage); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE); +} + +static void lv_menu_page_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_menu_page_t * page = (lv_menu_page_t *)obj; + + if((!page->static_title) && page->title != NULL) { + lv_free(page->title); + } + page->title = NULL; + page->static_title = false; +} + +static void lv_menu_cont_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(obj, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); +} + +static void lv_menu_section_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); +} + +static void lv_menu_refr_sidebar_header_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->sidebar_header == NULL || menu->sidebar_page == NULL) return; + + switch(menu->mode_header) { + case LV_MENU_HEADER_TOP_FIXED: + /* Content should fill the remaining space */ + lv_obj_move_to_index(menu->sidebar_header, 0); + lv_obj_set_flex_grow(menu->sidebar_page, 1); + break; + case LV_MENU_HEADER_TOP_UNFIXED: + lv_obj_move_to_index(menu->sidebar_header, 0); + lv_obj_set_flex_grow(menu->sidebar_page, 0); + break; + case LV_MENU_HEADER_BOTTOM_FIXED: + lv_obj_move_to_index(menu->sidebar_header, 1); + lv_obj_set_flex_grow(menu->sidebar_page, 1); + break; + } + + lv_obj_refr_size(menu->sidebar_header); + lv_obj_refr_size(menu->sidebar_page); + + if(lv_obj_get_content_height(menu->sidebar_header) == 0) { + lv_obj_add_flag(menu->sidebar_header, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_remove_flag(menu->sidebar_header, LV_OBJ_FLAG_HIDDEN); + } +} + +static void lv_menu_refr_main_header_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_menu_t * menu = (lv_menu_t *)obj; + + if(menu->main_header == NULL || menu->main_page == NULL) return; + + switch(menu->mode_header) { + case LV_MENU_HEADER_TOP_FIXED: + /* Content should fill the remaining space */ + lv_obj_move_to_index(menu->main_header, 0); + lv_obj_set_flex_grow(menu->main_page, 1); + break; + case LV_MENU_HEADER_TOP_UNFIXED: + lv_obj_move_to_index(menu->main_header, 0); + lv_obj_set_flex_grow(menu->main_page, 0); + break; + case LV_MENU_HEADER_BOTTOM_FIXED: + lv_obj_move_to_index(menu->main_header, 1); + lv_obj_set_flex_grow(menu->main_page, 1); + break; + } + + lv_obj_refr_size(menu->main_header); + lv_obj_refr_size(menu->main_page); + lv_obj_update_layout(menu->main_header); + + if(lv_obj_get_content_height(menu->main_header) == 0) { + lv_obj_add_flag(menu->main_header, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_remove_flag(menu->main_header, LV_OBJ_FLAG_HIDDEN); + } +} + +static void lv_menu_load_page_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_menu_load_page_event_data_t * event_data = lv_event_get_user_data(e); + lv_menu_t * menu = (lv_menu_t *)(event_data->menu); + lv_obj_t * page = event_data->page; + + if(menu->sidebar_page != NULL) { + /* Check if clicked obj is in the sidebar */ + bool sidebar = false; + lv_obj_t * parent = obj; + + while(parent) { + if(parent == (lv_obj_t *)menu) break; + if(parent == menu->sidebar) { + sidebar = true; + break; + } + parent = lv_obj_get_parent(parent); + } + + if(sidebar) { + /* Clear checked state of previous obj */ + if(menu->selected_tab != obj && menu->selected_tab != NULL) { + lv_obj_remove_state(menu->selected_tab, LV_STATE_CHECKED); + } + + lv_menu_clear_history((lv_obj_t *)menu); + + menu->selected_tab = obj; + } + } + + lv_menu_set_page((lv_obj_t *)menu, page); + + if(lv_group_get_default() != NULL && menu->sidebar_page == NULL) { + /* Sidebar is not supported for now*/ + lv_group_focus_next(lv_group_get_default()); + } +} + +static void lv_menu_obj_delete_event_cb(lv_event_t * e) +{ + lv_menu_load_page_event_data_t * event_data = lv_event_get_user_data(e); + lv_free(event_data); +} + +static void lv_menu_back_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + /* LV_EVENT_CLICKED */ + if(code == LV_EVENT_CLICKED) { + lv_obj_t * obj = lv_event_get_current_target(e); + lv_menu_t * menu = (lv_menu_t *)lv_event_get_user_data(e); + + if(!(obj == menu->main_header_back_btn || obj == menu->sidebar_header_back_btn)) return; + + menu->prev_depth = menu->cur_depth; /* Save the previous value for user event handler */ + + if(lv_menu_back_button_is_root((lv_obj_t *)menu, obj)) return; + + lv_ll_t * history_ll = &(menu->history_ll); + + /* The current menu */ + lv_menu_history_t * act_hist = lv_ll_get_head(history_ll); + + /* The previous menu */ + lv_menu_history_t * prev_hist = lv_ll_get_next(history_ll, act_hist); + + if(prev_hist != NULL) { + /* Previous menu exists */ + /* Delete the current item from the history */ + lv_ll_remove(history_ll, act_hist); + lv_free(act_hist); + menu->cur_depth--; + /* Create the previous menu. + * Remove it from the history because `lv_menu_set_page` will add it again */ + lv_ll_remove(history_ll, prev_hist); + menu->cur_depth--; + lv_menu_set_page(&(menu->obj), prev_hist->page); + + lv_free(prev_hist); + } + } +} + +static void lv_menu_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_user_data(e); + lv_menu_t * menu = (lv_menu_t *)obj; + + lv_menu_page_t * main_page = (lv_menu_page_t *)lv_menu_get_cur_main_page(obj); + if(main_page != NULL && menu->main_header_title != NULL) { + if(main_page->title != NULL) { + lv_label_set_text(menu->main_header_title, main_page->title); + lv_obj_remove_flag(menu->main_header_title, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_add_flag(menu->main_header_title, LV_OBJ_FLAG_HIDDEN); + } + } + + lv_menu_page_t * sidebar_page = (lv_menu_page_t *)lv_menu_get_cur_sidebar_page(obj); + if(sidebar_page != NULL && menu->sidebar_header_title != NULL) { + if(sidebar_page->title != NULL) { + lv_label_set_text(menu->sidebar_header_title, sidebar_page->title); + lv_obj_remove_flag(menu->sidebar_header_title, LV_OBJ_FLAG_HIDDEN); + } + else { + lv_obj_add_flag(menu->sidebar_header_title, LV_OBJ_FLAG_HIDDEN); + } + } +} +#endif /*LV_USE_MENU*/ diff --git a/inc/lvgl/src/widgets/menu/lv_menu.h b/inc/lvgl/src/widgets/menu/lv_menu.h new file mode 100644 index 0000000..1cfd9a1 --- /dev/null +++ b/inc/lvgl/src/widgets/menu/lv_menu.h @@ -0,0 +1,241 @@ +/** + * @file lv_menu.h + * + */ + +#ifndef LV_MENU_H +#define LV_MENU_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" +#include "../../core/lv_obj_property.h" + +#if LV_USE_MENU + +#if LV_USE_FLEX == 0 +#error "lv_menu: lv_flex is required. Enable it in lv_conf.h (LV_USE_FLEX 1)" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_MENU_HEADER_TOP_FIXED, /**< Header is positioned at the top */ + LV_MENU_HEADER_TOP_UNFIXED, /**< Header is positioned at the top and can be scrolled out of view*/ + LV_MENU_HEADER_BOTTOM_FIXED /**< Header is positioned at the bottom */ +} lv_menu_mode_header_t; + +typedef enum { + LV_MENU_ROOT_BACK_BUTTON_DISABLED, + LV_MENU_ROOT_BACK_BUTTON_ENABLED +} lv_menu_mode_root_back_button_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_page_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_cont_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_section_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_separator_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_sidebar_cont_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_main_cont_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_sidebar_header_cont_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_menu_main_header_cont_class; + +#if LV_USE_OBJ_PROPERTY +enum __lv_property_menu_id_t { + LV_PROPERTY_ID(MENU, MODE_HEADER, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(MENU, MODE_ROOT_BACK_BUTTON, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_MENU_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a menu object + * @param parent pointer to an object, it will be the parent of the new menu + * @return pointer to the created menu + */ +lv_obj_t * lv_menu_create(lv_obj_t * parent); + +/** + * Create a menu page object. + * + * This call inserts the new page under menu->storage as its parent, which is itself a + * child of the menu, so the resulting object hierarchy is: menu => storage => new_page + * where `storage` is a Base Widget. + * @param menu pointer to menu object. + * @param title pointer to text for title in header (NULL to not display title) + * @return pointer to the created menu page + */ +lv_obj_t * lv_menu_page_create(lv_obj_t * menu, char const * const title); + +/** + * Create a menu cont object + * @param parent pointer to a menu page or menu section object, it will be the parent of the new menu cont object + * @return pointer to the created menu cont + */ +lv_obj_t * lv_menu_cont_create(lv_obj_t * parent); + +/** + * Create a menu section object + * @param parent pointer to a menu page object, it will be the parent of the new menu section object + * @return pointer to the created menu section + */ +lv_obj_t * lv_menu_section_create(lv_obj_t * parent); + +/** + * Create a menu separator object + * @param parent pointer to a menu page object, it will be the parent of the new menu separator object + * @return pointer to the created menu separator + */ +lv_obj_t * lv_menu_separator_create(lv_obj_t * parent); +/*===================== + * Setter functions + *====================*/ +/** + * Set menu page to display in main + * @param obj pointer to the menu + * @param page pointer to the menu page to set (NULL to clear main and clear menu history) + */ +void lv_menu_set_page(lv_obj_t * obj, lv_obj_t * page); + +/** + * Set menu page title + * @param page pointer to the menu page + * @param title pointer to text for title in header (NULL to not display title) + */ +void lv_menu_set_page_title(lv_obj_t * page, char const * const title); + +/** + * Set menu page title with a static text. It will not be saved by the label so the 'text' variable + * has to be 'alive' while the page exists. + * @param page pointer to the menu page + * @param title pointer to text for title in header (NULL to not display title) + */ +void lv_menu_set_page_title_static(lv_obj_t * page, char const * const title); + +/** + * Set menu page to display in sidebar + * @param obj pointer to the menu + * @param page pointer to the menu page to set (NULL to clear sidebar) + */ +void lv_menu_set_sidebar_page(lv_obj_t * obj, lv_obj_t * page); + +/** + * Set the how the header should behave and its position + * @param obj pointer to a menu + * @param mode LV_MENU_HEADER_TOP_FIXED/TOP_UNFIXED/BOTTOM_FIXED + */ +void lv_menu_set_mode_header(lv_obj_t * obj, lv_menu_mode_header_t mode); + +/** + * Set whether back button should appear at root + * @param obj pointer to a menu + * @param mode LV_MENU_ROOT_BACK_BUTTON_DISABLED/ENABLED + */ +void lv_menu_set_mode_root_back_button(lv_obj_t * obj, lv_menu_mode_root_back_button_t mode); + +/** + * Add menu to the menu item + * @param menu pointer to the menu + * @param obj pointer to the obj + * @param page pointer to the page to load when obj is clicked + */ +void lv_menu_set_load_page_event(lv_obj_t * menu, lv_obj_t * obj, lv_obj_t * page); + +/*===================== + * Getter functions + *====================*/ +/** +* Get a pointer to menu page that is currently displayed in main +* @param obj pointer to the menu +* @return pointer to current page +*/ +lv_obj_t * lv_menu_get_cur_main_page(lv_obj_t * obj); + +/** +* Get a pointer to menu page that is currently displayed in sidebar +* @param obj pointer to the menu +* @return pointer to current page +*/ +lv_obj_t * lv_menu_get_cur_sidebar_page(lv_obj_t * obj); + +/** +* Get a pointer to main header obj +* @param obj pointer to the menu +* @return pointer to main header obj +*/ +lv_obj_t * lv_menu_get_main_header(lv_obj_t * obj); + +/** +* Get a pointer to main header back btn obj +* @param obj pointer to the menu +* @return pointer to main header back btn obj +*/ +lv_obj_t * lv_menu_get_main_header_back_button(lv_obj_t * obj); + +/** +* Get a pointer to sidebar header obj +* @param obj pointer to the menu +* @return pointer to sidebar header obj +*/ +lv_obj_t * lv_menu_get_sidebar_header(lv_obj_t * obj); + +/** +* Get a pointer to sidebar header obj +* @param obj pointer to the menu +* @return pointer to sidebar header back btn obj +*/ +lv_obj_t * lv_menu_get_sidebar_header_back_button(lv_obj_t * obj); + +/** + * Check if an obj is a root back btn + * @param menu pointer to the menu + * @param obj pointer to the back button + * @return true if it is a root back btn + */ +bool lv_menu_back_button_is_root(lv_obj_t * menu, lv_obj_t * obj); + +/** + * Get the header mode of the menu + * @param obj pointer to a menu + * @return LV_MENU_HEADER_TOP_FIXED/TOP_UNFIXED/BOTTOM_FIXED + */ +lv_menu_mode_header_t lv_menu_get_mode_header(lv_obj_t * obj); + +/** + * Get the root back button mode of the menu + * @param obj pointer to a menu + * @return LV_MENU_ROOT_BACK_BUTTON_DISABLED/ENABLED + */ +lv_menu_mode_root_back_button_t lv_menu_get_mode_root_back_button(lv_obj_t * obj); + +/** + * Clear menu history + * @param obj pointer to the menu + */ +void lv_menu_clear_history(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MENU*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MENU_H*/ diff --git a/inc/lvgl/src/widgets/menu/lv_menu_private.h b/inc/lvgl/src/widgets/menu/lv_menu_private.h new file mode 100644 index 0000000..185d3e9 --- /dev/null +++ b/inc/lvgl/src/widgets/menu/lv_menu_private.h @@ -0,0 +1,84 @@ +/** + * @file lv_menu_private.h + * + */ + +#ifndef LV_MENU_PRIVATE_H +#define LV_MENU_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_menu.h" + +#if LV_USE_MENU + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_menu_load_page_event_data_t { + lv_obj_t * menu; + lv_obj_t * page; +}; + +struct _lv_menu_history_t { + lv_obj_t * page; +}; + +struct _lv_menu_t { + lv_obj_t obj; + lv_obj_t * storage; /**< a pointer to obj that is the parent of all pages not displayed */ + lv_obj_t * main; + lv_obj_t * main_page; + lv_obj_t * main_header; + lv_obj_t * + main_header_back_btn; /**< a pointer to obj that on click triggers back btn event handler, can be same as 'main_header' */ + lv_obj_t * main_header_title; + lv_obj_t * sidebar; + lv_obj_t * sidebar_page; + lv_obj_t * sidebar_header; + lv_obj_t * + sidebar_header_back_btn; /**< a pointer to obj that on click triggers back btn event handler, can be same as 'sidebar_header' */ + lv_obj_t * sidebar_header_title; + lv_obj_t * selected_tab; + lv_ll_t history_ll; + uint8_t cur_depth; + uint8_t prev_depth; + uint8_t sidebar_generated : 1; + lv_menu_mode_header_t mode_header : 3; + lv_menu_mode_root_back_button_t mode_root_back_btn : 2; +}; + +struct _lv_menu_page_t { + lv_obj_t obj; + char * title; + bool static_title; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_MENU */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MENU_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/msgbox/lv_msgbox.c b/inc/lvgl/src/widgets/msgbox/lv_msgbox.c new file mode 100644 index 0000000..0f72238 --- /dev/null +++ b/inc/lvgl/src/widgets/msgbox/lv_msgbox.c @@ -0,0 +1,315 @@ +/** + * @file lv_msgbox.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_msgbox_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_MSGBOX + +#include "../label/lv_label.h" +#include "../image/lv_image.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_text_private.h" +#include "../../display/lv_display.h" +#include "../../layouts/flex/lv_flex.h" +#include "../../stdlib/lv_string.h" + +#if LV_USE_LABEL == 0 + #error "lv_mbox: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " +#endif + +/********************* + * DEFINES + *********************/ +#define LV_MSGBOX_FLAG_AUTO_PARENT LV_OBJ_FLAG_WIDGET_1 /*Mark that the parent was automatically created*/ +#define MY_CLASS (&lv_msgbox_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void msgbox_close_click_event_cb(lv_event_t * e); +static void msgbox_size_changed_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_msgbox_class = { + .base_class = &lv_obj_class, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_msgbox_t), + .name = "lv_msgbox", +}; + +const lv_obj_class_t lv_msgbox_header_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF / 3, + .instance_size = sizeof(lv_obj_t), + .name = "lv_msgbox_header", +}; + +const lv_obj_class_t lv_msgbox_content_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_SIZE_CONTENT, + .instance_size = sizeof(lv_obj_t), + .name = "lv_msgbox_content", +}; + +const lv_obj_class_t lv_msgbox_footer_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_DPI_DEF / 3, + .instance_size = sizeof(lv_obj_t), + .name = "lv_msgbox_footer", +}; + +const lv_obj_class_t lv_msgbox_footer_button_class = { + .base_class = &lv_obj_class, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_PCT(100), + .instance_size = sizeof(lv_obj_t), + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .name = "lv_msgbox_footer_button", +}; + +const lv_obj_class_t lv_msgbox_header_button_class = { + .base_class = &lv_obj_class, + .width_def = LV_DPI_DEF / 3, + .height_def = LV_PCT(100), + .instance_size = sizeof(lv_obj_t), + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .name = "lv_msgbox_header_button", +}; + +const lv_obj_class_t lv_msgbox_backdrop_class = { + .base_class = &lv_obj_class, + .width_def = LV_PCT(100), + .height_def = LV_PCT(100), + .instance_size = sizeof(lv_obj_t), + .name = "lv_msgbox_backdrop", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_msgbox_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + bool auto_parent = false; + if(parent == NULL) { + auto_parent = true; + parent = lv_obj_class_create_obj(&lv_msgbox_backdrop_class, lv_layer_top()); + LV_ASSERT_MALLOC(parent); + lv_obj_class_init_obj(parent); + lv_obj_remove_flag(parent, LV_OBJ_FLAG_IGNORE_LAYOUT); + lv_obj_set_size(parent, LV_PCT(100), LV_PCT(100)); + } + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_msgbox_class, parent); + LV_ASSERT_MALLOC(obj); + if(obj == NULL) return NULL; + lv_obj_class_init_obj(obj); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + + if(auto_parent) lv_obj_add_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT); + + mbox->content = lv_obj_class_create_obj(&lv_msgbox_content_class, obj); + LV_ASSERT_MALLOC(mbox->content); + if(mbox->content == NULL) { + lv_obj_delete(obj); + return NULL; + } + lv_obj_class_init_obj(mbox->content); + lv_obj_set_flex_flow(mbox->content, LV_FLEX_FLOW_COLUMN); + lv_obj_add_event_cb(obj, msgbox_size_changed_event_cb, LV_EVENT_SIZE_CHANGED, 0); + + lv_obj_center(obj); + return obj; +} + +lv_obj_t * lv_msgbox_add_title(lv_obj_t * obj, const char * title) +{ + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + if(mbox->header == NULL) { + mbox->header = lv_obj_class_create_obj(&lv_msgbox_header_class, obj); + LV_ASSERT_MALLOC(mbox->header); + if(mbox->header == NULL) return NULL; + lv_obj_class_init_obj(mbox->header); + + lv_obj_set_size(mbox->header, lv_pct(100), lv_display_get_dpi(lv_obj_get_display(obj)) / 3); + lv_obj_set_flex_flow(mbox->header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(mbox->header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_remove_flag(mbox->header, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_move_to_index(mbox->header, 0); + } + + if(mbox->title == NULL) { + mbox->title = lv_label_create(mbox->header); + lv_obj_set_flex_grow(mbox->title, 1); + } + + lv_label_set_text(mbox->title, title); + + return mbox->title; +} + +lv_obj_t * lv_msgbox_add_header_button(lv_obj_t * obj, const void * icon) +{ + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + if(mbox->header == NULL) { + lv_msgbox_add_title(obj, ""); /*Just to push the buttons to the right*/ + } + + lv_obj_t * btn = lv_obj_class_create_obj(&lv_msgbox_header_button_class, mbox->header); + LV_ASSERT_MALLOC(btn); + if(btn == NULL) return NULL; + lv_obj_class_init_obj(btn); + lv_obj_remove_flag(btn, LV_OBJ_FLAG_SCROLLABLE); + + if(icon) { + lv_obj_t * img = lv_image_create(btn); + lv_image_set_src(img, icon); + lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); + } + + return btn; +} + +lv_obj_t * lv_msgbox_add_text(lv_obj_t * obj, const char * text) +{ + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + + lv_obj_t * label = lv_label_create(mbox->content); + lv_label_set_text(label, text); + lv_obj_set_width(label, lv_pct(100)); + + return label; +} + +lv_obj_t * lv_msgbox_add_text_fmt(lv_obj_t * obj, const char * fmt, ...) +{ + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + + va_list args; + va_start(args, fmt); + lv_obj_t * label = lv_label_create(mbox->content); + lv_label_set_text_vfmt(label, fmt, args); + lv_obj_set_width(label, lv_pct(100)); + va_end(args); + + return label; +} + +lv_obj_t * lv_msgbox_add_footer_button(lv_obj_t * obj, const char * text) +{ + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + if(mbox->footer == NULL) { + mbox->footer = lv_obj_class_create_obj(&lv_msgbox_footer_class, obj); + LV_ASSERT_MALLOC(mbox->footer); + if(mbox->footer == NULL) return NULL; + lv_obj_class_init_obj(mbox->footer); + + lv_obj_set_flex_flow(mbox->footer, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(mbox->footer, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_remove_flag(mbox->footer, LV_OBJ_FLAG_SCROLLABLE); + } + + lv_obj_t * btn = lv_obj_class_create_obj(&lv_msgbox_footer_button_class, mbox->footer); + LV_ASSERT_MALLOC(btn); + if(btn == NULL) return NULL; + lv_obj_class_init_obj(btn); + lv_obj_remove_flag(btn, LV_OBJ_FLAG_SCROLLABLE); + + if(text) { + lv_obj_t * label = lv_label_create(btn); + lv_label_set_text(label, text); + lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); + } + + return btn; +} + +lv_obj_t * lv_msgbox_add_close_button(lv_obj_t * obj) +{ + lv_obj_t * btn = lv_msgbox_add_header_button(obj, LV_SYMBOL_CLOSE); + lv_obj_add_event_cb(btn, msgbox_close_click_event_cb, LV_EVENT_CLICKED, NULL); + return btn; +} + +lv_obj_t * lv_msgbox_get_header(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->header; +} + +lv_obj_t * lv_msgbox_get_footer(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->footer; +} + +lv_obj_t * lv_msgbox_get_content(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->content; +} + +lv_obj_t * lv_msgbox_get_title(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_msgbox_t * mbox = (lv_msgbox_t *)obj; + return mbox->title; +} + +void lv_msgbox_close(lv_obj_t * obj) +{ + if(lv_obj_has_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT)) lv_obj_delete(lv_obj_get_parent(obj)); + else lv_obj_delete(obj); +} + +void lv_msgbox_close_async(lv_obj_t * obj) +{ + if(lv_obj_has_flag(obj, LV_MSGBOX_FLAG_AUTO_PARENT)) lv_obj_delete_async(lv_obj_get_parent(obj)); + else lv_obj_delete_async(obj); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void msgbox_close_click_event_cb(lv_event_t * e) +{ + lv_obj_t * btn = lv_event_get_current_target(e); + lv_obj_t * mbox = lv_obj_get_parent(lv_obj_get_parent(btn)); + lv_msgbox_close(mbox); +} + +static void msgbox_size_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * mbox = lv_event_get_target(e); + lv_obj_t * content = lv_msgbox_get_content(mbox); + bool is_msgbox_height_size_content = (lv_obj_get_style_height(mbox, LV_PART_MAIN) == LV_SIZE_CONTENT); + lv_obj_set_flex_grow(content, !is_msgbox_height_size_content); +} + +#endif /*LV_USE_MSGBOX*/ diff --git a/inc/lvgl/src/widgets/msgbox/lv_msgbox.h b/inc/lvgl/src/widgets/msgbox/lv_msgbox.h new file mode 100644 index 0000000..f35a2a9 --- /dev/null +++ b/inc/lvgl/src/widgets/msgbox/lv_msgbox.h @@ -0,0 +1,140 @@ +/** + * @file lv_msgbox.h + * + */ + +#ifndef LV_MSGBOX_H +#define LV_MSGBOX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_MSGBOX + +/********************* + * DEFINES + *********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_header_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_content_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_footer_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_header_button_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_footer_button_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_msgbox_backdrop_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an empty message box + * @param parent the parent or NULL to create a modal msgbox + * @return the created message box + */ +lv_obj_t * lv_msgbox_create(lv_obj_t * parent); + +/** + * Add title to the message box. It also creates a header for the title. + * @param obj pointer to a message box + * @param title the text of the tile + * @return the created title label + */ +lv_obj_t * lv_msgbox_add_title(lv_obj_t * obj, const char * title); + +/** + * Add a button to the header of to the message box. It also creates a header. + * @param obj pointer to a message box + * @param icon the icon of the button + * @return the created button + */ +lv_obj_t * lv_msgbox_add_header_button(lv_obj_t * obj, const void * icon); + +/** + * Add a text to the content area of message box. Multiple texts will be created below each other. + * @param obj pointer to a message box + * @param text text to add + * @return the created label + */ +lv_obj_t * lv_msgbox_add_text(lv_obj_t * obj, const char * text); + +/** + * Add a formatted text to the content area of message box. Multiple texts will be created below each other. + * @param obj pointer to a message box + * @param fmt `printf`-like format string + * @return the created label + */ +lv_obj_t * lv_msgbox_add_text_fmt(lv_obj_t * obj, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(2, 3); + +/** + * Add a button to the footer of to the message box. It also creates a footer. + * @param obj pointer to a message box + * @param text the text of the button + * @return the created button + */ +lv_obj_t * lv_msgbox_add_footer_button(lv_obj_t * obj, const char * text); + +/** + * Add a close button to the message box. It also creates a header. + * @param obj pointer to a message box + * @return the created close button + */ +lv_obj_t * lv_msgbox_add_close_button(lv_obj_t * obj); + +/** + * Get the header widget + * @param obj pointer to a message box + * @return the header, or NULL if not exists + */ +lv_obj_t * lv_msgbox_get_header(lv_obj_t * obj); + +/** + * Get the footer widget + * @param obj pointer to a message box + * @return the footer, or NULL if not exists + */ +lv_obj_t * lv_msgbox_get_footer(lv_obj_t * obj); + +/** + * Get the content widget + * @param obj pointer to a message box + * @return the content + */ +lv_obj_t * lv_msgbox_get_content(lv_obj_t * obj); + +/** + * Get the title label + * @param obj pointer to a message box + * @return the title, or NULL if it does not exist + */ +lv_obj_t * lv_msgbox_get_title(lv_obj_t * obj); + +/** + * Close a message box + * @param mbox pointer to a message box + */ +void lv_msgbox_close(lv_obj_t * mbox); + +/** + * Close a message box in the next call of the message box + * @param mbox pointer to a message box + */ +void lv_msgbox_close_async(lv_obj_t * mbox); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_MSGBOX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MSGBOX_H*/ diff --git a/inc/lvgl/src/widgets/msgbox/lv_msgbox_private.h b/inc/lvgl/src/widgets/msgbox/lv_msgbox_private.h new file mode 100644 index 0000000..4799ea3 --- /dev/null +++ b/inc/lvgl/src/widgets/msgbox/lv_msgbox_private.h @@ -0,0 +1,57 @@ +/** + * @file lv_msgbox_private.h + * + */ + +#ifndef LV_MSGBOX_PRIVATE_H +#define LV_MSGBOX_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_msgbox.h" + +#if LV_USE_MSGBOX +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_msgbox_t { + lv_obj_t obj; + lv_obj_t * header; + lv_obj_t * content; + lv_obj_t * footer; + lv_obj_t * title; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_MSGBOX */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_MSGBOX_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/objx_templ/lv_objx_templ.c b/inc/lvgl/src/widgets/objx_templ/lv_objx_templ.c new file mode 100644 index 0000000..809d476 --- /dev/null +++ b/inc/lvgl/src/widgets/objx_templ/lv_objx_templ.c @@ -0,0 +1,141 @@ +/** + * @file lv_objx_templ.c + * + */ + +/** + * TODO Remove these instructions + * Search and replace: templ -> object short name with lower case(e.g. btn, label etc) + * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) + * + * You can remove the defined() clause from the #if statement below. This exists because + * LV_USE_TEMPL is not in lv_conf.h or lv_conf_template.h by default. + */ + +/********************* + * INCLUDES + *********************/ +//#include "lv_templ.h" /*TODO uncomment this*/ + +#if defined(LV_USE_TEMPL) && LV_USE_TEMPL != 0 + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_templ_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_templ_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_templ_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_templ_event(const lv_obj_class_t * class_p, lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_templ_class = { + .constructor_cb = lv_templ_constructor, + .destructor_cb = lv_templ_destructor, + .event_cb = lv_templ_event, + .width_def = LV_DPI_DEF, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_templ_t), + .group_def = LV_OBJ_CLASS_GROUP_DEF_INHERIT, + .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, + .base_class = &lv_templ_class, + .name = "lv_templ", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_templ_create(lv_obj_t * parent) +{ + + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/* + * New object specific "add" or "remove" functions come here + */ + +/*===================== + * Setter functions + *====================*/ + +/* + * New object specific "set" functions come here + */ + +/*===================== + * Getter functions + *====================*/ + +/* + * New object specific "get" functions come here + */ + +/*===================== + * Other functions + *====================*/ + +/* + * New object specific "other" functions come here + */ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_templ_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_templ_t * templ = (lv_templ_t *)obj; + /*Initialize the widget's data*/ + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_templ_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + lv_templ_t * templ = (lv_templ_t *)obj; + /*Free the widget specific data*/ +} + +static void lv_templ_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + /*Add the widget specific event handling here*/ +} + +#else /*Enable this file at the top*/ + +/*This dummy typedef exists purely to silence -Wpedantic.*/ +typedef int keep_pedantic_happy; +#endif diff --git a/inc/lvgl/src/widgets/objx_templ/lv_objx_templ.h b/inc/lvgl/src/widgets/objx_templ/lv_objx_templ.h new file mode 100644 index 0000000..8feaf7e --- /dev/null +++ b/inc/lvgl/src/widgets/objx_templ/lv_objx_templ.h @@ -0,0 +1,81 @@ +/** + * @file lv_objx_templ.h + * + */ + +/** + * TODO Remove these instructions + * Search and replace: templ -> object short name with lower case(e.g. btn, label etc) + * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) + * + */ + +#ifndef LV_OBJX_TEMPL_H +#define LV_OBJX_TEMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_conf_internal.h" + +#if LV_USE_TEMPL != 0 + +#include "../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +/*Data of template*/ +typedef struct { + lv_ANCESTOR_t ancestor; /*The ancestor widget, e.g. lv_slider_t slider*/ + /*New data for this type*/ +} lv_templ_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_templ_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a templ object + * @param parent pointer to an object, it will be the parent of the new templ + * @return pointer to the created bar + */ +lv_obj_t * lv_templ_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/*===================== + * Getter functions + *====================*/ + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEMPL*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_OBJX_TEMPL_H*/ diff --git a/inc/lvgl/src/widgets/property/lv_animimage_properties.c b/inc/lvgl/src/widgets/property/lv_animimage_properties.c new file mode 100644 index 0000000..36e3e32 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_animimage_properties.c @@ -0,0 +1,26 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_animimage_properties.c + */ + +#include "../animimage/lv_animimage.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_ANIMIMAGE +/** + * Animimage widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_animimage_property_names[4] = { + {"duration", LV_PROPERTY_ANIMIMAGE_DURATION,}, + {"repeat_count", LV_PROPERTY_ANIMIMAGE_REPEAT_COUNT,}, + {"src", LV_PROPERTY_ANIMIMAGE_SRC,}, + {"src_count", LV_PROPERTY_ANIMIMAGE_SRC_COUNT,}, +}; +#endif /*LV_USE_ANIMIMAGE*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_arc_properties.c b/inc/lvgl/src/widgets/property/lv_arc_properties.c new file mode 100644 index 0000000..be642b0 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_arc_properties.c @@ -0,0 +1,33 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_arc_properties.c + */ + +#include "../arc/lv_arc.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_ARC +/** + * Arc widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_arc_property_names[11] = { + {"bg_end_angle", LV_PROPERTY_ARC_BG_END_ANGLE,}, + {"bg_start_angle", LV_PROPERTY_ARC_BG_START_ANGLE,}, + {"change_rate", LV_PROPERTY_ARC_CHANGE_RATE,}, + {"end_angle", LV_PROPERTY_ARC_END_ANGLE,}, + {"knob_offset", LV_PROPERTY_ARC_KNOB_OFFSET,}, + {"max_value", LV_PROPERTY_ARC_MAX_VALUE,}, + {"min_value", LV_PROPERTY_ARC_MIN_VALUE,}, + {"mode", LV_PROPERTY_ARC_MODE,}, + {"rotation", LV_PROPERTY_ARC_ROTATION,}, + {"start_angle", LV_PROPERTY_ARC_START_ANGLE,}, + {"value", LV_PROPERTY_ARC_VALUE,}, +}; +#endif /*LV_USE_ARC*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_bar_properties.c b/inc/lvgl/src/widgets/property/lv_bar_properties.c new file mode 100644 index 0000000..f7972bb --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_bar_properties.c @@ -0,0 +1,28 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_bar_properties.c + */ + +#include "../bar/lv_bar.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_BAR +/** + * Bar widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_bar_property_names[6] = { + {"max_value", LV_PROPERTY_BAR_MAX_VALUE,}, + {"min_value", LV_PROPERTY_BAR_MIN_VALUE,}, + {"mode", LV_PROPERTY_BAR_MODE,}, + {"orientation", LV_PROPERTY_BAR_ORIENTATION,}, + {"start_value", LV_PROPERTY_BAR_START_VALUE,}, + {"value", LV_PROPERTY_BAR_VALUE,}, +}; +#endif /*LV_USE_BAR*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_buttonmatrix_properties.c b/inc/lvgl/src/widgets/property/lv_buttonmatrix_properties.c new file mode 100644 index 0000000..b56fd95 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_buttonmatrix_properties.c @@ -0,0 +1,24 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_buttonmatrix_properties.c + */ + +#include "../buttonmatrix/lv_buttonmatrix.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_BUTTONMATRIX +/** + * Buttonmatrix widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_buttonmatrix_property_names[2] = { + {"one_checked", LV_PROPERTY_BUTTONMATRIX_ONE_CHECKED,}, + {"selected_button", LV_PROPERTY_BUTTONMATRIX_SELECTED_BUTTON,}, +}; +#endif /*LV_USE_BUTTONMATRIX*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_chart_properties.c b/inc/lvgl/src/widgets/property/lv_chart_properties.c new file mode 100644 index 0000000..a4bcaad --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_chart_properties.c @@ -0,0 +1,27 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_chart_properties.c + */ + +#include "../chart/lv_chart.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_CHART +/** + * Chart widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_chart_property_names[5] = { + {"hor_div_line_count", LV_PROPERTY_CHART_HOR_DIV_LINE_COUNT,}, + {"point_count", LV_PROPERTY_CHART_POINT_COUNT,}, + {"type", LV_PROPERTY_CHART_TYPE,}, + {"update_mode", LV_PROPERTY_CHART_UPDATE_MODE,}, + {"ver_div_line_count", LV_PROPERTY_CHART_VER_DIV_LINE_COUNT,}, +}; +#endif /*LV_USE_CHART*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_checkbox_properties.c b/inc/lvgl/src/widgets/property/lv_checkbox_properties.c new file mode 100644 index 0000000..ea711d2 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_checkbox_properties.c @@ -0,0 +1,23 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_checkbox_properties.c + */ + +#include "../checkbox/lv_checkbox.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_CHECKBOX +/** + * Checkbox widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_checkbox_property_names[1] = { + {"text", LV_PROPERTY_CHECKBOX_TEXT,}, +}; +#endif /*LV_USE_CHECKBOX*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_dropdown_properties.c b/inc/lvgl/src/widgets/property/lv_dropdown_properties.c new file mode 100644 index 0000000..9477ca3 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_dropdown_properties.c @@ -0,0 +1,31 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_dropdown_properties.c + */ + +#include "../dropdown/lv_dropdown.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_DROPDOWN +/** + * Dropdown widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_dropdown_property_names[9] = { + {"dir", LV_PROPERTY_DROPDOWN_DIR,}, + {"is_open", LV_PROPERTY_DROPDOWN_IS_OPEN,}, + {"list", LV_PROPERTY_DROPDOWN_LIST,}, + {"option_count", LV_PROPERTY_DROPDOWN_OPTION_COUNT,}, + {"options", LV_PROPERTY_DROPDOWN_OPTIONS,}, + {"selected", LV_PROPERTY_DROPDOWN_SELECTED,}, + {"selected_highlight", LV_PROPERTY_DROPDOWN_SELECTED_HIGHLIGHT,}, + {"symbol", LV_PROPERTY_DROPDOWN_SYMBOL,}, + {"text", LV_PROPERTY_DROPDOWN_TEXT,}, +}; +#endif /*LV_USE_DROPDOWN*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_image_properties.c b/inc/lvgl/src/widgets/property/lv_image_properties.c new file mode 100644 index 0000000..fd7fd7d --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_image_properties.c @@ -0,0 +1,33 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_image_properties.c + */ + +#include "../image/lv_image.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_IMAGE +/** + * Image widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_image_property_names[11] = { + {"antialias", LV_PROPERTY_IMAGE_ANTIALIAS,}, + {"blend_mode", LV_PROPERTY_IMAGE_BLEND_MODE,}, + {"inner_align", LV_PROPERTY_IMAGE_INNER_ALIGN,}, + {"offset_x", LV_PROPERTY_IMAGE_OFFSET_X,}, + {"offset_y", LV_PROPERTY_IMAGE_OFFSET_Y,}, + {"pivot", LV_PROPERTY_IMAGE_PIVOT,}, + {"rotation", LV_PROPERTY_IMAGE_ROTATION,}, + {"scale", LV_PROPERTY_IMAGE_SCALE,}, + {"scale_x", LV_PROPERTY_IMAGE_SCALE_X,}, + {"scale_y", LV_PROPERTY_IMAGE_SCALE_Y,}, + {"src", LV_PROPERTY_IMAGE_SRC,}, +}; +#endif /*LV_USE_IMAGE*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_keyboard_properties.c b/inc/lvgl/src/widgets/property/lv_keyboard_properties.c new file mode 100644 index 0000000..90cfc3e --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_keyboard_properties.c @@ -0,0 +1,26 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_keyboard_properties.c + */ + +#include "../keyboard/lv_keyboard.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_KEYBOARD +/** + * Keyboard widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_keyboard_property_names[4] = { + {"mode", LV_PROPERTY_KEYBOARD_MODE,}, + {"popovers", LV_PROPERTY_KEYBOARD_POPOVERS,}, + {"selected_button", LV_PROPERTY_KEYBOARD_SELECTED_BUTTON,}, + {"textarea", LV_PROPERTY_KEYBOARD_TEXTAREA,}, +}; +#endif /*LV_USE_KEYBOARD*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_label_properties.c b/inc/lvgl/src/widgets/property/lv_label_properties.c new file mode 100644 index 0000000..5fc6708 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_label_properties.c @@ -0,0 +1,26 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_label_properties.c + */ + +#include "../label/lv_label.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_LABEL +/** + * Label widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_label_property_names[4] = { + {"long_mode", LV_PROPERTY_LABEL_LONG_MODE,}, + {"text", LV_PROPERTY_LABEL_TEXT,}, + {"text_selection_end", LV_PROPERTY_LABEL_TEXT_SELECTION_END,}, + {"text_selection_start", LV_PROPERTY_LABEL_TEXT_SELECTION_START,}, +}; +#endif /*LV_USE_LABEL*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_led_properties.c b/inc/lvgl/src/widgets/property/lv_led_properties.c new file mode 100644 index 0000000..f9771f6 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_led_properties.c @@ -0,0 +1,24 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_led_properties.c + */ + +#include "../led/lv_led.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_LED +/** + * Led widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_led_property_names[2] = { + {"brightness", LV_PROPERTY_LED_BRIGHTNESS,}, + {"color", LV_PROPERTY_LED_COLOR,}, +}; +#endif /*LV_USE_LED*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_line_properties.c b/inc/lvgl/src/widgets/property/lv_line_properties.c new file mode 100644 index 0000000..ac9cb66 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_line_properties.c @@ -0,0 +1,23 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_line_properties.c + */ + +#include "../line/lv_line.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_LINE +/** + * Line widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_line_property_names[1] = { + {"y_invert", LV_PROPERTY_LINE_Y_INVERT,}, +}; +#endif /*LV_USE_LINE*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_menu_properties.c b/inc/lvgl/src/widgets/property/lv_menu_properties.c new file mode 100644 index 0000000..4e3b313 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_menu_properties.c @@ -0,0 +1,24 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_menu_properties.c + */ + +#include "../menu/lv_menu.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_MENU +/** + * Menu widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_menu_property_names[2] = { + {"mode_header", LV_PROPERTY_MENU_MODE_HEADER,}, + {"mode_root_back_button", LV_PROPERTY_MENU_MODE_ROOT_BACK_BUTTON,}, +}; +#endif /*LV_USE_MENU*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_obj_properties.c b/inc/lvgl/src/widgets/property/lv_obj_properties.c new file mode 100644 index 0000000..71d70db --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_obj_properties.c @@ -0,0 +1,96 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_obj_properties.c + */ + +#include "../../core/lv_obj.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + + +/** + * Obj widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_obj_property_names[76] = { + {"align", LV_PROPERTY_OBJ_ALIGN,}, + {"child_count", LV_PROPERTY_OBJ_CHILD_COUNT,}, + {"content_height", LV_PROPERTY_OBJ_CONTENT_HEIGHT,}, + {"content_width", LV_PROPERTY_OBJ_CONTENT_WIDTH,}, + {"display", LV_PROPERTY_OBJ_DISPLAY,}, + {"event_count", LV_PROPERTY_OBJ_EVENT_COUNT,}, + {"ext_draw_size", LV_PROPERTY_OBJ_EXT_DRAW_SIZE,}, + {"flag_adv_hittest", LV_PROPERTY_OBJ_FLAG_ADV_HITTEST,}, + {"flag_checkable", LV_PROPERTY_OBJ_FLAG_CHECKABLE,}, + {"flag_click_focusable", LV_PROPERTY_OBJ_FLAG_CLICK_FOCUSABLE,}, + {"flag_clickable", LV_PROPERTY_OBJ_FLAG_CLICKABLE,}, + {"flag_end", LV_PROPERTY_OBJ_FLAG_END,}, + {"flag_event_bubble", LV_PROPERTY_OBJ_FLAG_EVENT_BUBBLE,}, + {"flag_event_trickle", LV_PROPERTY_OBJ_FLAG_EVENT_TRICKLE,}, + {"flag_flex_in_new_track", LV_PROPERTY_OBJ_FLAG_FLEX_IN_NEW_TRACK,}, + {"flag_floating", LV_PROPERTY_OBJ_FLAG_FLOATING,}, + {"flag_gesture_bubble", LV_PROPERTY_OBJ_FLAG_GESTURE_BUBBLE,}, + {"flag_hidden", LV_PROPERTY_OBJ_FLAG_HIDDEN,}, + {"flag_ignore_layout", LV_PROPERTY_OBJ_FLAG_IGNORE_LAYOUT,}, + {"flag_layout_1", LV_PROPERTY_OBJ_FLAG_LAYOUT_1,}, + {"flag_layout_2", LV_PROPERTY_OBJ_FLAG_LAYOUT_2,}, + {"flag_overflow_visible", LV_PROPERTY_OBJ_FLAG_OVERFLOW_VISIBLE,}, + {"flag_press_lock", LV_PROPERTY_OBJ_FLAG_PRESS_LOCK,}, + {"flag_scroll_chain_hor", LV_PROPERTY_OBJ_FLAG_SCROLL_CHAIN_HOR,}, + {"flag_scroll_chain_ver", LV_PROPERTY_OBJ_FLAG_SCROLL_CHAIN_VER,}, + {"flag_scroll_elastic", LV_PROPERTY_OBJ_FLAG_SCROLL_ELASTIC,}, + {"flag_scroll_momentum", LV_PROPERTY_OBJ_FLAG_SCROLL_MOMENTUM,}, + {"flag_scroll_on_focus", LV_PROPERTY_OBJ_FLAG_SCROLL_ON_FOCUS,}, + {"flag_scroll_one", LV_PROPERTY_OBJ_FLAG_SCROLL_ONE,}, + {"flag_scroll_with_arrow", LV_PROPERTY_OBJ_FLAG_SCROLL_WITH_ARROW,}, + {"flag_scrollable", LV_PROPERTY_OBJ_FLAG_SCROLLABLE,}, + {"flag_send_draw_task_events", LV_PROPERTY_OBJ_FLAG_SEND_DRAW_TASK_EVENTS,}, + {"flag_snappable", LV_PROPERTY_OBJ_FLAG_SNAPPABLE,}, + {"flag_start", LV_PROPERTY_OBJ_FLAG_START,}, + {"flag_state_trickle", LV_PROPERTY_OBJ_FLAG_STATE_TRICKLE,}, + {"flag_user_1", LV_PROPERTY_OBJ_FLAG_USER_1,}, + {"flag_user_2", LV_PROPERTY_OBJ_FLAG_USER_2,}, + {"flag_user_3", LV_PROPERTY_OBJ_FLAG_USER_3,}, + {"flag_user_4", LV_PROPERTY_OBJ_FLAG_USER_4,}, + {"flag_widget_1", LV_PROPERTY_OBJ_FLAG_WIDGET_1,}, + {"flag_widget_2", LV_PROPERTY_OBJ_FLAG_WIDGET_2,}, + {"h", LV_PROPERTY_OBJ_H,}, + {"index", LV_PROPERTY_OBJ_INDEX,}, + {"layout", LV_PROPERTY_OBJ_LAYOUT,}, + {"parent", LV_PROPERTY_OBJ_PARENT,}, + {"screen", LV_PROPERTY_OBJ_SCREEN,}, + {"scroll_bottom", LV_PROPERTY_OBJ_SCROLL_BOTTOM,}, + {"scroll_dir", LV_PROPERTY_OBJ_SCROLL_DIR,}, + {"scroll_end", LV_PROPERTY_OBJ_SCROLL_END,}, + {"scroll_left", LV_PROPERTY_OBJ_SCROLL_LEFT,}, + {"scroll_right", LV_PROPERTY_OBJ_SCROLL_RIGHT,}, + {"scroll_snap_x", LV_PROPERTY_OBJ_SCROLL_SNAP_X,}, + {"scroll_snap_y", LV_PROPERTY_OBJ_SCROLL_SNAP_Y,}, + {"scroll_top", LV_PROPERTY_OBJ_SCROLL_TOP,}, + {"scroll_x", LV_PROPERTY_OBJ_SCROLL_X,}, + {"scroll_y", LV_PROPERTY_OBJ_SCROLL_Y,}, + {"scrollbar_mode", LV_PROPERTY_OBJ_SCROLLBAR_MODE,}, + {"state_alt", LV_PROPERTY_OBJ_STATE_ALT,}, + {"state_any", LV_PROPERTY_OBJ_STATE_ANY,}, + {"state_checked", LV_PROPERTY_OBJ_STATE_CHECKED,}, + {"state_disabled", LV_PROPERTY_OBJ_STATE_DISABLED,}, + {"state_edited", LV_PROPERTY_OBJ_STATE_EDITED,}, + {"state_end", LV_PROPERTY_OBJ_STATE_END,}, + {"state_focus_key", LV_PROPERTY_OBJ_STATE_FOCUS_KEY,}, + {"state_focused", LV_PROPERTY_OBJ_STATE_FOCUSED,}, + {"state_hovered", LV_PROPERTY_OBJ_STATE_HOVERED,}, + {"state_pressed", LV_PROPERTY_OBJ_STATE_PRESSED,}, + {"state_scrolled", LV_PROPERTY_OBJ_STATE_SCROLLED,}, + {"state_start", LV_PROPERTY_OBJ_STATE_START,}, + {"state_user_1", LV_PROPERTY_OBJ_STATE_USER_1,}, + {"state_user_2", LV_PROPERTY_OBJ_STATE_USER_2,}, + {"state_user_3", LV_PROPERTY_OBJ_STATE_USER_3,}, + {"state_user_4", LV_PROPERTY_OBJ_STATE_USER_4,}, + {"w", LV_PROPERTY_OBJ_W,}, + {"x", LV_PROPERTY_OBJ_X,}, + {"y", LV_PROPERTY_OBJ_Y,}, +}; +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_obj_property_names.h b/inc/lvgl/src/widgets/property/lv_obj_property_names.h new file mode 100644 index 0000000..c15ce33 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_obj_property_names.h @@ -0,0 +1,39 @@ + +/** + * @file lv_obj_property_names.h + * GENERATED FILE, DO NOT EDIT IT! + */ +#ifndef LV_OBJ_PROPERTY_NAMES_H +#define LV_OBJ_PROPERTY_NAMES_H + +#include "../../misc/lv_types.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + + extern const lv_property_name_t lv_animimage_property_names[4]; + extern const lv_property_name_t lv_arc_property_names[11]; + extern const lv_property_name_t lv_bar_property_names[6]; + extern const lv_property_name_t lv_buttonmatrix_property_names[2]; + extern const lv_property_name_t lv_chart_property_names[5]; + extern const lv_property_name_t lv_checkbox_property_names[1]; + extern const lv_property_name_t lv_dropdown_property_names[9]; + extern const lv_property_name_t lv_image_property_names[11]; + extern const lv_property_name_t lv_keyboard_property_names[4]; + extern const lv_property_name_t lv_label_property_names[4]; + extern const lv_property_name_t lv_led_property_names[2]; + extern const lv_property_name_t lv_line_property_names[1]; + extern const lv_property_name_t lv_menu_property_names[2]; + extern const lv_property_name_t lv_obj_property_names[76]; + extern const lv_property_name_t lv_roller_property_names[3]; + extern const lv_property_name_t lv_scale_property_names[8]; + extern const lv_property_name_t lv_slider_property_names[8]; + extern const lv_property_name_t lv_span_property_names[5]; + extern const lv_property_name_t lv_spinbox_property_names[8]; + extern const lv_property_name_t lv_spinner_property_names[2]; + extern const lv_property_name_t lv_style_property_names[130]; + extern const lv_property_name_t lv_switch_property_names[1]; + extern const lv_property_name_t lv_table_property_names[2]; + extern const lv_property_name_t lv_tabview_property_names[2]; + extern const lv_property_name_t lv_textarea_property_names[14]; +#endif +#endif diff --git a/inc/lvgl/src/widgets/property/lv_roller_properties.c b/inc/lvgl/src/widgets/property/lv_roller_properties.c new file mode 100644 index 0000000..72aa017 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_roller_properties.c @@ -0,0 +1,25 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_roller_properties.c + */ + +#include "../roller/lv_roller.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_ROLLER +/** + * Roller widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_roller_property_names[3] = { + {"options", LV_PROPERTY_ROLLER_OPTIONS,}, + {"selected", LV_PROPERTY_ROLLER_SELECTED,}, + {"visible_row_count", LV_PROPERTY_ROLLER_VISIBLE_ROW_COUNT,}, +}; +#endif /*LV_USE_ROLLER*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_scale_properties.c b/inc/lvgl/src/widgets/property/lv_scale_properties.c new file mode 100644 index 0000000..71ebfd1 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_scale_properties.c @@ -0,0 +1,30 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_scale_properties.c + */ + +#include "../scale/lv_scale.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_SCALE +/** + * Scale widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_scale_property_names[8] = { + {"angle_range", LV_PROPERTY_SCALE_ANGLE_RANGE,}, + {"label_show", LV_PROPERTY_SCALE_LABEL_SHOW,}, + {"major_tick_every", LV_PROPERTY_SCALE_MAJOR_TICK_EVERY,}, + {"mode", LV_PROPERTY_SCALE_MODE,}, + {"range_max_value", LV_PROPERTY_SCALE_RANGE_MAX_VALUE,}, + {"range_min_value", LV_PROPERTY_SCALE_RANGE_MIN_VALUE,}, + {"rotation", LV_PROPERTY_SCALE_ROTATION,}, + {"total_tick_count", LV_PROPERTY_SCALE_TOTAL_TICK_COUNT,}, +}; +#endif /*LV_USE_SCALE*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_slider_properties.c b/inc/lvgl/src/widgets/property/lv_slider_properties.c new file mode 100644 index 0000000..0015011 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_slider_properties.c @@ -0,0 +1,30 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_slider_properties.c + */ + +#include "../slider/lv_slider.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_SLIDER +/** + * Slider widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_slider_property_names[8] = { + {"is_dragged", LV_PROPERTY_SLIDER_IS_DRAGGED,}, + {"is_symmetrical", LV_PROPERTY_SLIDER_IS_SYMMETRICAL,}, + {"left_value", LV_PROPERTY_SLIDER_LEFT_VALUE,}, + {"max_value", LV_PROPERTY_SLIDER_MAX_VALUE,}, + {"min_value", LV_PROPERTY_SLIDER_MIN_VALUE,}, + {"mode", LV_PROPERTY_SLIDER_MODE,}, + {"range", LV_PROPERTY_SLIDER_RANGE,}, + {"value", LV_PROPERTY_SLIDER_VALUE,}, +}; +#endif /*LV_USE_SLIDER*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_span_properties.c b/inc/lvgl/src/widgets/property/lv_span_properties.c new file mode 100644 index 0000000..7fd1402 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_span_properties.c @@ -0,0 +1,27 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_span_properties.c + */ + +#include "../span/lv_span.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_SPAN +/** + * Span widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_span_property_names[5] = { + {"align", LV_PROPERTY_SPAN_ALIGN,}, + {"indent", LV_PROPERTY_SPAN_INDENT,}, + {"max_lines", LV_PROPERTY_SPAN_MAX_LINES,}, + {"mode", LV_PROPERTY_SPAN_MODE,}, + {"overflow", LV_PROPERTY_SPAN_OVERFLOW,}, +}; +#endif /*LV_USE_SPAN*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_spinbox_properties.c b/inc/lvgl/src/widgets/property/lv_spinbox_properties.c new file mode 100644 index 0000000..def4158 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_spinbox_properties.c @@ -0,0 +1,30 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_spinbox_properties.c + */ + +#include "../spinbox/lv_spinbox.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_SPINBOX +/** + * Spinbox widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_spinbox_property_names[8] = { + {"dec_point_pos", LV_PROPERTY_SPINBOX_DEC_POINT_POS,}, + {"digit_count", LV_PROPERTY_SPINBOX_DIGIT_COUNT,}, + {"digit_step_direction", LV_PROPERTY_SPINBOX_DIGIT_STEP_DIRECTION,}, + {"max_value", LV_PROPERTY_SPINBOX_MAX_VALUE,}, + {"min_value", LV_PROPERTY_SPINBOX_MIN_VALUE,}, + {"rollover", LV_PROPERTY_SPINBOX_ROLLOVER,}, + {"step", LV_PROPERTY_SPINBOX_STEP,}, + {"value", LV_PROPERTY_SPINBOX_VALUE,}, +}; +#endif /*LV_USE_SPINBOX*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_spinner_properties.c b/inc/lvgl/src/widgets/property/lv_spinner_properties.c new file mode 100644 index 0000000..f9ce474 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_spinner_properties.c @@ -0,0 +1,24 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_spinner_properties.c + */ + +#include "../spinner/lv_spinner.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_SPINNER +/** + * Spinner widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_spinner_property_names[2] = { + {"anim_duration", LV_PROPERTY_SPINNER_ANIM_DURATION,}, + {"arc_sweep", LV_PROPERTY_SPINNER_ARC_SWEEP,}, +}; +#endif /*LV_USE_SPINNER*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_style_properties.c b/inc/lvgl/src/widgets/property/lv_style_properties.c new file mode 100644 index 0000000..46e975e --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_style_properties.c @@ -0,0 +1,150 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_style_properties.c + */ + +#include "lv_style_properties.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + + +/** + * Style property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_style_property_names[130] = { + {"align", LV_PROPERTY_STYLE_ALIGN,}, + {"anim", LV_PROPERTY_STYLE_ANIM,}, + {"anim_duration", LV_PROPERTY_STYLE_ANIM_DURATION,}, + {"arc_color", LV_PROPERTY_STYLE_ARC_COLOR,}, + {"arc_image_src", LV_PROPERTY_STYLE_ARC_IMAGE_SRC,}, + {"arc_opa", LV_PROPERTY_STYLE_ARC_OPA,}, + {"arc_rounded", LV_PROPERTY_STYLE_ARC_ROUNDED,}, + {"arc_width", LV_PROPERTY_STYLE_ARC_WIDTH,}, + {"base_dir", LV_PROPERTY_STYLE_BASE_DIR,}, + {"bg_color", LV_PROPERTY_STYLE_BG_COLOR,}, + {"bg_grad", LV_PROPERTY_STYLE_BG_GRAD,}, + {"bg_grad_color", LV_PROPERTY_STYLE_BG_GRAD_COLOR,}, + {"bg_grad_dir", LV_PROPERTY_STYLE_BG_GRAD_DIR,}, + {"bg_grad_opa", LV_PROPERTY_STYLE_BG_GRAD_OPA,}, + {"bg_grad_stop", LV_PROPERTY_STYLE_BG_GRAD_STOP,}, + {"bg_image_opa", LV_PROPERTY_STYLE_BG_IMAGE_OPA,}, + {"bg_image_recolor", LV_PROPERTY_STYLE_BG_IMAGE_RECOLOR,}, + {"bg_image_recolor_opa", LV_PROPERTY_STYLE_BG_IMAGE_RECOLOR_OPA,}, + {"bg_image_src", LV_PROPERTY_STYLE_BG_IMAGE_SRC,}, + {"bg_image_tiled", LV_PROPERTY_STYLE_BG_IMAGE_TILED,}, + {"bg_main_opa", LV_PROPERTY_STYLE_BG_MAIN_OPA,}, + {"bg_main_stop", LV_PROPERTY_STYLE_BG_MAIN_STOP,}, + {"bg_opa", LV_PROPERTY_STYLE_BG_OPA,}, + {"bitmap_mask_src", LV_PROPERTY_STYLE_BITMAP_MASK_SRC,}, + {"blend_mode", LV_PROPERTY_STYLE_BLEND_MODE,}, + {"blur_backdrop", LV_PROPERTY_STYLE_BLUR_BACKDROP,}, + {"blur_quality", LV_PROPERTY_STYLE_BLUR_QUALITY,}, + {"blur_radius", LV_PROPERTY_STYLE_BLUR_RADIUS,}, + {"border_color", LV_PROPERTY_STYLE_BORDER_COLOR,}, + {"border_opa", LV_PROPERTY_STYLE_BORDER_OPA,}, + {"border_post", LV_PROPERTY_STYLE_BORDER_POST,}, + {"border_side", LV_PROPERTY_STYLE_BORDER_SIDE,}, + {"border_width", LV_PROPERTY_STYLE_BORDER_WIDTH,}, + {"clip_corner", LV_PROPERTY_STYLE_CLIP_CORNER,}, + {"color_filter_dsc", LV_PROPERTY_STYLE_COLOR_FILTER_DSC,}, + {"color_filter_opa", LV_PROPERTY_STYLE_COLOR_FILTER_OPA,}, + {"drop_shadow_color", LV_PROPERTY_STYLE_DROP_SHADOW_COLOR,}, + {"drop_shadow_offset_x", LV_PROPERTY_STYLE_DROP_SHADOW_OFFSET_X,}, + {"drop_shadow_offset_y", LV_PROPERTY_STYLE_DROP_SHADOW_OFFSET_Y,}, + {"drop_shadow_opa", LV_PROPERTY_STYLE_DROP_SHADOW_OPA,}, + {"drop_shadow_quality", LV_PROPERTY_STYLE_DROP_SHADOW_QUALITY,}, + {"drop_shadow_radius", LV_PROPERTY_STYLE_DROP_SHADOW_RADIUS,}, + {"flex_cross_place", LV_PROPERTY_STYLE_FLEX_CROSS_PLACE,}, + {"flex_flow", LV_PROPERTY_STYLE_FLEX_FLOW,}, + {"flex_grow", LV_PROPERTY_STYLE_FLEX_GROW,}, + {"flex_main_place", LV_PROPERTY_STYLE_FLEX_MAIN_PLACE,}, + {"flex_track_place", LV_PROPERTY_STYLE_FLEX_TRACK_PLACE,}, + {"grid_cell_column_pos", LV_PROPERTY_STYLE_GRID_CELL_COLUMN_POS,}, + {"grid_cell_column_span", LV_PROPERTY_STYLE_GRID_CELL_COLUMN_SPAN,}, + {"grid_cell_row_pos", LV_PROPERTY_STYLE_GRID_CELL_ROW_POS,}, + {"grid_cell_row_span", LV_PROPERTY_STYLE_GRID_CELL_ROW_SPAN,}, + {"grid_cell_x_align", LV_PROPERTY_STYLE_GRID_CELL_X_ALIGN,}, + {"grid_cell_y_align", LV_PROPERTY_STYLE_GRID_CELL_Y_ALIGN,}, + {"grid_column_align", LV_PROPERTY_STYLE_GRID_COLUMN_ALIGN,}, + {"grid_column_dsc_array", LV_PROPERTY_STYLE_GRID_COLUMN_DSC_ARRAY,}, + {"grid_row_align", LV_PROPERTY_STYLE_GRID_ROW_ALIGN,}, + {"grid_row_dsc_array", LV_PROPERTY_STYLE_GRID_ROW_DSC_ARRAY,}, + {"height", LV_PROPERTY_STYLE_HEIGHT,}, + {"image_colorkey", LV_PROPERTY_STYLE_IMAGE_COLORKEY,}, + {"image_opa", LV_PROPERTY_STYLE_IMAGE_OPA,}, + {"image_recolor", LV_PROPERTY_STYLE_IMAGE_RECOLOR,}, + {"image_recolor_opa", LV_PROPERTY_STYLE_IMAGE_RECOLOR_OPA,}, + {"last_built_in_prop", LV_PROPERTY_STYLE_LAST_BUILT_IN_PROP,}, + {"layout", LV_PROPERTY_STYLE_LAYOUT,}, + {"length", LV_PROPERTY_STYLE_LENGTH,}, + {"line_color", LV_PROPERTY_STYLE_LINE_COLOR,}, + {"line_dash_gap", LV_PROPERTY_STYLE_LINE_DASH_GAP,}, + {"line_dash_width", LV_PROPERTY_STYLE_LINE_DASH_WIDTH,}, + {"line_opa", LV_PROPERTY_STYLE_LINE_OPA,}, + {"line_rounded", LV_PROPERTY_STYLE_LINE_ROUNDED,}, + {"line_width", LV_PROPERTY_STYLE_LINE_WIDTH,}, + {"margin_bottom", LV_PROPERTY_STYLE_MARGIN_BOTTOM,}, + {"margin_left", LV_PROPERTY_STYLE_MARGIN_LEFT,}, + {"margin_right", LV_PROPERTY_STYLE_MARGIN_RIGHT,}, + {"margin_top", LV_PROPERTY_STYLE_MARGIN_TOP,}, + {"max_height", LV_PROPERTY_STYLE_MAX_HEIGHT,}, + {"max_width", LV_PROPERTY_STYLE_MAX_WIDTH,}, + {"min_height", LV_PROPERTY_STYLE_MIN_HEIGHT,}, + {"min_width", LV_PROPERTY_STYLE_MIN_WIDTH,}, + {"opa", LV_PROPERTY_STYLE_OPA,}, + {"opa_layered", LV_PROPERTY_STYLE_OPA_LAYERED,}, + {"outline_color", LV_PROPERTY_STYLE_OUTLINE_COLOR,}, + {"outline_opa", LV_PROPERTY_STYLE_OUTLINE_OPA,}, + {"outline_pad", LV_PROPERTY_STYLE_OUTLINE_PAD,}, + {"outline_width", LV_PROPERTY_STYLE_OUTLINE_WIDTH,}, + {"pad_bottom", LV_PROPERTY_STYLE_PAD_BOTTOM,}, + {"pad_column", LV_PROPERTY_STYLE_PAD_COLUMN,}, + {"pad_left", LV_PROPERTY_STYLE_PAD_LEFT,}, + {"pad_radial", LV_PROPERTY_STYLE_PAD_RADIAL,}, + {"pad_right", LV_PROPERTY_STYLE_PAD_RIGHT,}, + {"pad_row", LV_PROPERTY_STYLE_PAD_ROW,}, + {"pad_top", LV_PROPERTY_STYLE_PAD_TOP,}, + {"prop_inv", LV_PROPERTY_STYLE_PROP_INV,}, + {"radial_offset", LV_PROPERTY_STYLE_RADIAL_OFFSET,}, + {"radius", LV_PROPERTY_STYLE_RADIUS,}, + {"recolor", LV_PROPERTY_STYLE_RECOLOR,}, + {"recolor_opa", LV_PROPERTY_STYLE_RECOLOR_OPA,}, + {"rotary_sensitivity", LV_PROPERTY_STYLE_ROTARY_SENSITIVITY,}, + {"shadow_color", LV_PROPERTY_STYLE_SHADOW_COLOR,}, + {"shadow_offset_x", LV_PROPERTY_STYLE_SHADOW_OFFSET_X,}, + {"shadow_offset_y", LV_PROPERTY_STYLE_SHADOW_OFFSET_Y,}, + {"shadow_opa", LV_PROPERTY_STYLE_SHADOW_OPA,}, + {"shadow_spread", LV_PROPERTY_STYLE_SHADOW_SPREAD,}, + {"shadow_width", LV_PROPERTY_STYLE_SHADOW_WIDTH,}, + {"text_align", LV_PROPERTY_STYLE_TEXT_ALIGN,}, + {"text_color", LV_PROPERTY_STYLE_TEXT_COLOR,}, + {"text_decor", LV_PROPERTY_STYLE_TEXT_DECOR,}, + {"text_font", LV_PROPERTY_STYLE_TEXT_FONT,}, + {"text_letter_space", LV_PROPERTY_STYLE_TEXT_LETTER_SPACE,}, + {"text_line_space", LV_PROPERTY_STYLE_TEXT_LINE_SPACE,}, + {"text_opa", LV_PROPERTY_STYLE_TEXT_OPA,}, + {"text_outline_stroke_color", LV_PROPERTY_STYLE_TEXT_OUTLINE_STROKE_COLOR,}, + {"text_outline_stroke_opa", LV_PROPERTY_STYLE_TEXT_OUTLINE_STROKE_OPA,}, + {"text_outline_stroke_width", LV_PROPERTY_STYLE_TEXT_OUTLINE_STROKE_WIDTH,}, + {"transform_height", LV_PROPERTY_STYLE_TRANSFORM_HEIGHT,}, + {"transform_pivot_x", LV_PROPERTY_STYLE_TRANSFORM_PIVOT_X,}, + {"transform_pivot_y", LV_PROPERTY_STYLE_TRANSFORM_PIVOT_Y,}, + {"transform_rotation", LV_PROPERTY_STYLE_TRANSFORM_ROTATION,}, + {"transform_scale_x", LV_PROPERTY_STYLE_TRANSFORM_SCALE_X,}, + {"transform_scale_y", LV_PROPERTY_STYLE_TRANSFORM_SCALE_Y,}, + {"transform_skew_x", LV_PROPERTY_STYLE_TRANSFORM_SKEW_X,}, + {"transform_skew_y", LV_PROPERTY_STYLE_TRANSFORM_SKEW_Y,}, + {"transform_width", LV_PROPERTY_STYLE_TRANSFORM_WIDTH,}, + {"transition", LV_PROPERTY_STYLE_TRANSITION,}, + {"translate_radial", LV_PROPERTY_STYLE_TRANSLATE_RADIAL,}, + {"translate_x", LV_PROPERTY_STYLE_TRANSLATE_X,}, + {"translate_y", LV_PROPERTY_STYLE_TRANSLATE_Y,}, + {"width", LV_PROPERTY_STYLE_WIDTH,}, + {"x", LV_PROPERTY_STYLE_X,}, + {"y", LV_PROPERTY_STYLE_Y,}, +}; +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_style_properties.h b/inc/lvgl/src/widgets/property/lv_style_properties.h new file mode 100644 index 0000000..8146aaa --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_style_properties.h @@ -0,0 +1,148 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_style_properties.h + */ +#ifndef LV_STYLE_PROPERTIES_H +#define LV_STYLE_PROPERTIES_H + +#include "../../core/lv_obj_property.h" +#if LV_USE_OBJ_PROPERTY + + +/* *INDENT-OFF* */ +enum _lv_property_style_id_t { + LV_PROPERTY_ID(STYLE, ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_ALIGN), + LV_PROPERTY_ID(STYLE, ANIM, LV_PROPERTY_TYPE_POINTER, LV_STYLE_ANIM), + LV_PROPERTY_ID(STYLE, ANIM_DURATION, LV_PROPERTY_TYPE_INT, LV_STYLE_ANIM_DURATION), + LV_PROPERTY_ID(STYLE, ARC_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_ARC_COLOR), + LV_PROPERTY_ID(STYLE, ARC_IMAGE_SRC, LV_PROPERTY_TYPE_IMGSRC, LV_STYLE_ARC_IMAGE_SRC), + LV_PROPERTY_ID(STYLE, ARC_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_ARC_OPA), + LV_PROPERTY_ID(STYLE, ARC_ROUNDED, LV_PROPERTY_TYPE_INT, LV_STYLE_ARC_ROUNDED), + LV_PROPERTY_ID(STYLE, ARC_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_ARC_WIDTH), + LV_PROPERTY_ID(STYLE, BASE_DIR, LV_PROPERTY_TYPE_INT, LV_STYLE_BASE_DIR), + LV_PROPERTY_ID(STYLE, BG_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_BG_COLOR), + LV_PROPERTY_ID(STYLE, BG_GRAD, LV_PROPERTY_TYPE_POINTER, LV_STYLE_BG_GRAD), + LV_PROPERTY_ID(STYLE, BG_GRAD_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_BG_GRAD_COLOR), + LV_PROPERTY_ID(STYLE, BG_GRAD_DIR, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_GRAD_DIR), + LV_PROPERTY_ID(STYLE, BG_GRAD_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_GRAD_OPA), + LV_PROPERTY_ID(STYLE, BG_GRAD_STOP, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_GRAD_STOP), + LV_PROPERTY_ID(STYLE, BG_IMAGE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_IMAGE_OPA), + LV_PROPERTY_ID(STYLE, BG_IMAGE_RECOLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_BG_IMAGE_RECOLOR), + LV_PROPERTY_ID(STYLE, BG_IMAGE_RECOLOR_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_IMAGE_RECOLOR_OPA), + LV_PROPERTY_ID(STYLE, BG_IMAGE_SRC, LV_PROPERTY_TYPE_IMGSRC, LV_STYLE_BG_IMAGE_SRC), + LV_PROPERTY_ID(STYLE, BG_IMAGE_TILED, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_IMAGE_TILED), + LV_PROPERTY_ID(STYLE, BG_MAIN_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_MAIN_OPA), + LV_PROPERTY_ID(STYLE, BG_MAIN_STOP, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_MAIN_STOP), + LV_PROPERTY_ID(STYLE, BG_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BG_OPA), + LV_PROPERTY_ID(STYLE, BITMAP_MASK_SRC, LV_PROPERTY_TYPE_POINTER, LV_STYLE_BITMAP_MASK_SRC), + LV_PROPERTY_ID(STYLE, BLEND_MODE, LV_PROPERTY_TYPE_INT, LV_STYLE_BLEND_MODE), + LV_PROPERTY_ID(STYLE, BLUR_BACKDROP, LV_PROPERTY_TYPE_INT, LV_STYLE_BLUR_BACKDROP), + LV_PROPERTY_ID(STYLE, BLUR_QUALITY, LV_PROPERTY_TYPE_INT, LV_STYLE_BLUR_QUALITY), + LV_PROPERTY_ID(STYLE, BLUR_RADIUS, LV_PROPERTY_TYPE_INT, LV_STYLE_BLUR_RADIUS), + LV_PROPERTY_ID(STYLE, BORDER_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_BORDER_COLOR), + LV_PROPERTY_ID(STYLE, BORDER_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_BORDER_OPA), + LV_PROPERTY_ID(STYLE, BORDER_POST, LV_PROPERTY_TYPE_INT, LV_STYLE_BORDER_POST), + LV_PROPERTY_ID(STYLE, BORDER_SIDE, LV_PROPERTY_TYPE_INT, LV_STYLE_BORDER_SIDE), + LV_PROPERTY_ID(STYLE, BORDER_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_BORDER_WIDTH), + LV_PROPERTY_ID(STYLE, CLIP_CORNER, LV_PROPERTY_TYPE_INT, LV_STYLE_CLIP_CORNER), + LV_PROPERTY_ID(STYLE, COLOR_FILTER_DSC, LV_PROPERTY_TYPE_POINTER, LV_STYLE_COLOR_FILTER_DSC), + LV_PROPERTY_ID(STYLE, COLOR_FILTER_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_COLOR_FILTER_OPA), + LV_PROPERTY_ID(STYLE, DROP_SHADOW_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_DROP_SHADOW_COLOR), + LV_PROPERTY_ID(STYLE, DROP_SHADOW_OFFSET_X, LV_PROPERTY_TYPE_INT, LV_STYLE_DROP_SHADOW_OFFSET_X), + LV_PROPERTY_ID(STYLE, DROP_SHADOW_OFFSET_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_DROP_SHADOW_OFFSET_Y), + LV_PROPERTY_ID(STYLE, DROP_SHADOW_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_DROP_SHADOW_OPA), + LV_PROPERTY_ID(STYLE, DROP_SHADOW_QUALITY, LV_PROPERTY_TYPE_INT, LV_STYLE_DROP_SHADOW_QUALITY), + LV_PROPERTY_ID(STYLE, DROP_SHADOW_RADIUS, LV_PROPERTY_TYPE_INT, LV_STYLE_DROP_SHADOW_RADIUS), + LV_PROPERTY_ID(STYLE, FLEX_CROSS_PLACE, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_CROSS_PLACE), + LV_PROPERTY_ID(STYLE, FLEX_FLOW, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_FLOW), + LV_PROPERTY_ID(STYLE, FLEX_GROW, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_GROW), + LV_PROPERTY_ID(STYLE, FLEX_MAIN_PLACE, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_MAIN_PLACE), + LV_PROPERTY_ID(STYLE, FLEX_TRACK_PLACE, LV_PROPERTY_TYPE_INT, LV_STYLE_FLEX_TRACK_PLACE), + LV_PROPERTY_ID(STYLE, GRID_CELL_COLUMN_POS, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_COLUMN_POS), + LV_PROPERTY_ID(STYLE, GRID_CELL_COLUMN_SPAN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_COLUMN_SPAN), + LV_PROPERTY_ID(STYLE, GRID_CELL_ROW_POS, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_ROW_POS), + LV_PROPERTY_ID(STYLE, GRID_CELL_ROW_SPAN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_ROW_SPAN), + LV_PROPERTY_ID(STYLE, GRID_CELL_X_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_X_ALIGN), + LV_PROPERTY_ID(STYLE, GRID_CELL_Y_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_CELL_Y_ALIGN), + LV_PROPERTY_ID(STYLE, GRID_COLUMN_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_COLUMN_ALIGN), + LV_PROPERTY_ID(STYLE, GRID_COLUMN_DSC_ARRAY, LV_PROPERTY_TYPE_POINTER, LV_STYLE_GRID_COLUMN_DSC_ARRAY), + LV_PROPERTY_ID(STYLE, GRID_ROW_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_GRID_ROW_ALIGN), + LV_PROPERTY_ID(STYLE, GRID_ROW_DSC_ARRAY, LV_PROPERTY_TYPE_POINTER, LV_STYLE_GRID_ROW_DSC_ARRAY), + LV_PROPERTY_ID(STYLE, HEIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_HEIGHT), + LV_PROPERTY_ID(STYLE, IMAGE_COLORKEY, LV_PROPERTY_TYPE_INT, LV_STYLE_IMAGE_COLORKEY), + LV_PROPERTY_ID(STYLE, IMAGE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_IMAGE_OPA), + LV_PROPERTY_ID(STYLE, IMAGE_RECOLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_IMAGE_RECOLOR), + LV_PROPERTY_ID(STYLE, IMAGE_RECOLOR_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_IMAGE_RECOLOR_OPA), + LV_PROPERTY_ID(STYLE, LAST_BUILT_IN_PROP, LV_PROPERTY_TYPE_INVALID, LV_STYLE_LAST_BUILT_IN_PROP), + LV_PROPERTY_ID(STYLE, LAYOUT, LV_PROPERTY_TYPE_INT, LV_STYLE_LAYOUT), + LV_PROPERTY_ID(STYLE, LENGTH, LV_PROPERTY_TYPE_INT, LV_STYLE_LENGTH), + LV_PROPERTY_ID(STYLE, LINE_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_LINE_COLOR), + LV_PROPERTY_ID(STYLE, LINE_DASH_GAP, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_DASH_GAP), + LV_PROPERTY_ID(STYLE, LINE_DASH_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_DASH_WIDTH), + LV_PROPERTY_ID(STYLE, LINE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_OPA), + LV_PROPERTY_ID(STYLE, LINE_ROUNDED, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_ROUNDED), + LV_PROPERTY_ID(STYLE, LINE_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_LINE_WIDTH), + LV_PROPERTY_ID(STYLE, MARGIN_BOTTOM, LV_PROPERTY_TYPE_INT, LV_STYLE_MARGIN_BOTTOM), + LV_PROPERTY_ID(STYLE, MARGIN_LEFT, LV_PROPERTY_TYPE_INT, LV_STYLE_MARGIN_LEFT), + LV_PROPERTY_ID(STYLE, MARGIN_RIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_MARGIN_RIGHT), + LV_PROPERTY_ID(STYLE, MARGIN_TOP, LV_PROPERTY_TYPE_INT, LV_STYLE_MARGIN_TOP), + LV_PROPERTY_ID(STYLE, MAX_HEIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_MAX_HEIGHT), + LV_PROPERTY_ID(STYLE, MAX_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_MAX_WIDTH), + LV_PROPERTY_ID(STYLE, MIN_HEIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_MIN_HEIGHT), + LV_PROPERTY_ID(STYLE, MIN_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_MIN_WIDTH), + LV_PROPERTY_ID(STYLE, OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_OPA), + LV_PROPERTY_ID(STYLE, OPA_LAYERED, LV_PROPERTY_TYPE_INT, LV_STYLE_OPA_LAYERED), + LV_PROPERTY_ID(STYLE, OUTLINE_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_OUTLINE_COLOR), + LV_PROPERTY_ID(STYLE, OUTLINE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_OUTLINE_OPA), + LV_PROPERTY_ID(STYLE, OUTLINE_PAD, LV_PROPERTY_TYPE_INT, LV_STYLE_OUTLINE_PAD), + LV_PROPERTY_ID(STYLE, OUTLINE_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_OUTLINE_WIDTH), + LV_PROPERTY_ID(STYLE, PAD_BOTTOM, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_BOTTOM), + LV_PROPERTY_ID(STYLE, PAD_COLUMN, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_COLUMN), + LV_PROPERTY_ID(STYLE, PAD_LEFT, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_LEFT), + LV_PROPERTY_ID(STYLE, PAD_RADIAL, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_RADIAL), + LV_PROPERTY_ID(STYLE, PAD_RIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_RIGHT), + LV_PROPERTY_ID(STYLE, PAD_ROW, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_ROW), + LV_PROPERTY_ID(STYLE, PAD_TOP, LV_PROPERTY_TYPE_INT, LV_STYLE_PAD_TOP), + LV_PROPERTY_ID(STYLE, PROP_INV, LV_PROPERTY_TYPE_INVALID, LV_STYLE_PROP_INV), + LV_PROPERTY_ID(STYLE, RADIAL_OFFSET, LV_PROPERTY_TYPE_INT, LV_STYLE_RADIAL_OFFSET), + LV_PROPERTY_ID(STYLE, RADIUS, LV_PROPERTY_TYPE_INT, LV_STYLE_RADIUS), + LV_PROPERTY_ID(STYLE, RECOLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_RECOLOR), + LV_PROPERTY_ID(STYLE, RECOLOR_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_RECOLOR_OPA), + LV_PROPERTY_ID(STYLE, ROTARY_SENSITIVITY, LV_PROPERTY_TYPE_INT, LV_STYLE_ROTARY_SENSITIVITY), + LV_PROPERTY_ID(STYLE, SHADOW_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_SHADOW_COLOR), + LV_PROPERTY_ID(STYLE, SHADOW_OFFSET_X, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_OFFSET_X), + LV_PROPERTY_ID(STYLE, SHADOW_OFFSET_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_OFFSET_Y), + LV_PROPERTY_ID(STYLE, SHADOW_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_OPA), + LV_PROPERTY_ID(STYLE, SHADOW_SPREAD, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_SPREAD), + LV_PROPERTY_ID(STYLE, SHADOW_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_SHADOW_WIDTH), + LV_PROPERTY_ID(STYLE, TEXT_ALIGN, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_ALIGN), + LV_PROPERTY_ID(STYLE, TEXT_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_TEXT_COLOR), + LV_PROPERTY_ID(STYLE, TEXT_DECOR, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_DECOR), + LV_PROPERTY_ID(STYLE, TEXT_FONT, LV_PROPERTY_TYPE_FONT, LV_STYLE_TEXT_FONT), + LV_PROPERTY_ID(STYLE, TEXT_LETTER_SPACE, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_LETTER_SPACE), + LV_PROPERTY_ID(STYLE, TEXT_LINE_SPACE, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_LINE_SPACE), + LV_PROPERTY_ID(STYLE, TEXT_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_OPA), + LV_PROPERTY_ID(STYLE, TEXT_OUTLINE_STROKE_COLOR, LV_PROPERTY_TYPE_COLOR, LV_STYLE_TEXT_OUTLINE_STROKE_COLOR), + LV_PROPERTY_ID(STYLE, TEXT_OUTLINE_STROKE_OPA, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_OUTLINE_STROKE_OPA), + LV_PROPERTY_ID(STYLE, TEXT_OUTLINE_STROKE_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_TEXT_OUTLINE_STROKE_WIDTH), + LV_PROPERTY_ID(STYLE, TRANSFORM_HEIGHT, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_HEIGHT), + LV_PROPERTY_ID(STYLE, TRANSFORM_PIVOT_X, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_PIVOT_X), + LV_PROPERTY_ID(STYLE, TRANSFORM_PIVOT_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_PIVOT_Y), + LV_PROPERTY_ID(STYLE, TRANSFORM_ROTATION, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_ROTATION), + LV_PROPERTY_ID(STYLE, TRANSFORM_SCALE_X, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_SCALE_X), + LV_PROPERTY_ID(STYLE, TRANSFORM_SCALE_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_SCALE_Y), + LV_PROPERTY_ID(STYLE, TRANSFORM_SKEW_X, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_SKEW_X), + LV_PROPERTY_ID(STYLE, TRANSFORM_SKEW_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_SKEW_Y), + LV_PROPERTY_ID(STYLE, TRANSFORM_WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSFORM_WIDTH), + LV_PROPERTY_ID(STYLE, TRANSITION, LV_PROPERTY_TYPE_POINTER, LV_STYLE_TRANSITION), + LV_PROPERTY_ID(STYLE, TRANSLATE_RADIAL, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSLATE_RADIAL), + LV_PROPERTY_ID(STYLE, TRANSLATE_X, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSLATE_X), + LV_PROPERTY_ID(STYLE, TRANSLATE_Y, LV_PROPERTY_TYPE_INT, LV_STYLE_TRANSLATE_Y), + LV_PROPERTY_ID(STYLE, WIDTH, LV_PROPERTY_TYPE_INT, LV_STYLE_WIDTH), + LV_PROPERTY_ID(STYLE, X, LV_PROPERTY_TYPE_INT, LV_STYLE_X), + LV_PROPERTY_ID(STYLE, Y, LV_PROPERTY_TYPE_INT, LV_STYLE_Y), +}; + +#endif +#endif diff --git a/inc/lvgl/src/widgets/property/lv_switch_properties.c b/inc/lvgl/src/widgets/property/lv_switch_properties.c new file mode 100644 index 0000000..ecd590d --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_switch_properties.c @@ -0,0 +1,23 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_switch_properties.c + */ + +#include "../switch/lv_switch.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_SWITCH +/** + * Switch widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_switch_property_names[1] = { + {"orientation", LV_PROPERTY_SWITCH_ORIENTATION,}, +}; +#endif /*LV_USE_SWITCH*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_table_properties.c b/inc/lvgl/src/widgets/property/lv_table_properties.c new file mode 100644 index 0000000..5d7ec16 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_table_properties.c @@ -0,0 +1,24 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_table_properties.c + */ + +#include "../table/lv_table.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_TABLE +/** + * Table widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_table_property_names[2] = { + {"column_count", LV_PROPERTY_TABLE_COLUMN_COUNT,}, + {"row_count", LV_PROPERTY_TABLE_ROW_COUNT,}, +}; +#endif /*LV_USE_TABLE*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_tabview_properties.c b/inc/lvgl/src/widgets/property/lv_tabview_properties.c new file mode 100644 index 0000000..efdb3bf --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_tabview_properties.c @@ -0,0 +1,24 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_tabview_properties.c + */ + +#include "../tabview/lv_tabview.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_TABVIEW +/** + * Tabview widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_tabview_property_names[2] = { + {"tab_active", LV_PROPERTY_TABVIEW_TAB_ACTIVE,}, + {"tab_bar_position", LV_PROPERTY_TABVIEW_TAB_BAR_POSITION,}, +}; +#endif /*LV_USE_TABVIEW*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/property/lv_textarea_properties.c b/inc/lvgl/src/widgets/property/lv_textarea_properties.c new file mode 100644 index 0000000..2da6164 --- /dev/null +++ b/inc/lvgl/src/widgets/property/lv_textarea_properties.c @@ -0,0 +1,36 @@ + +/** + * GENERATED FILE, DO NOT EDIT IT! + * @file lv_textarea_properties.c + */ + +#include "../textarea/lv_textarea.h" + +#if LV_USE_OBJ_PROPERTY && LV_USE_OBJ_PROPERTY_NAME + +#if LV_USE_TEXTAREA +/** + * Textarea widget property names, name must be in order. + * Generated code from properties.py + */ +/* *INDENT-OFF* */ +const lv_property_name_t lv_textarea_property_names[14] = { + {"accepted_chars", LV_PROPERTY_TEXTAREA_ACCEPTED_CHARS,}, + {"current_char", LV_PROPERTY_TEXTAREA_CURRENT_CHAR,}, + {"cursor_click_pos", LV_PROPERTY_TEXTAREA_CURSOR_CLICK_POS,}, + {"cursor_pos", LV_PROPERTY_TEXTAREA_CURSOR_POS,}, + {"label", LV_PROPERTY_TEXTAREA_LABEL,}, + {"max_length", LV_PROPERTY_TEXTAREA_MAX_LENGTH,}, + {"one_line", LV_PROPERTY_TEXTAREA_ONE_LINE,}, + {"password_bullet", LV_PROPERTY_TEXTAREA_PASSWORD_BULLET,}, + {"password_mode", LV_PROPERTY_TEXTAREA_PASSWORD_MODE,}, + {"password_show_time", LV_PROPERTY_TEXTAREA_PASSWORD_SHOW_TIME,}, + {"placeholder_text", LV_PROPERTY_TEXTAREA_PLACEHOLDER_TEXT,}, + {"text", LV_PROPERTY_TEXTAREA_TEXT,}, + {"text_is_selected", LV_PROPERTY_TEXTAREA_TEXT_IS_SELECTED,}, + {"text_selection", LV_PROPERTY_TEXTAREA_TEXT_SELECTION,}, +}; +#endif /*LV_USE_TEXTAREA*/ + +/* *INDENT-ON* */ +#endif diff --git a/inc/lvgl/src/widgets/roller/lv_roller.c b/inc/lvgl/src/widgets/roller/lv_roller.c new file mode 100644 index 0000000..c441166 --- /dev/null +++ b/inc/lvgl/src/widgets/roller/lv_roller.c @@ -0,0 +1,969 @@ +/** + * @file lv_roller.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_roller_private.h" +#include "../label/lv_label_private.h" +#include "../../misc/lv_area_private.h" +#include "../../misc/lv_anim_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_ROLLER != 0 + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_text_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_group.h" +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_scroll.h" +#include "../../indev/lv_indev_private.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_observer_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_roller_class) +#define MY_CLASS_LABEL &lv_roller_label_class +#define EXTRA_INF_SIZE 1000 /*[px]: add the options multiple times until getting this height*/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_roller_label_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); +static void draw_label(lv_event_t * e); +static void get_sel_area(lv_obj_t * obj, lv_area_t * sel_area); +static void refr_position(lv_obj_t * obj, lv_anim_enable_t animen); +static lv_result_t release_handler(lv_obj_t * obj); +static void inf_normalize(lv_obj_t * obj_scrl); +static lv_obj_t * get_label(const lv_obj_t * obj); +static int32_t get_selected_label_width(const lv_obj_t * obj); +static void scroll_anim_completed_cb(lv_anim_t * a); +static void set_y_anim(void * obj, int32_t v); +static void transform_vect_recursive(lv_obj_t * roller, lv_point_t * vect); + +#if LV_USE_OBSERVER + static void roller_value_changed_event_cb(lv_event_t * e); + static void roller_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif /*LV_USE_OBSERVER*/ + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_roller_properties[] = { + { + .id = LV_PROPERTY_ROLLER_OPTIONS, + .setter = lv_roller_set_options, + .getter = lv_roller_get_options, + }, + { + .id = LV_PROPERTY_ROLLER_SELECTED, + .setter = lv_roller_set_selected, + .getter = lv_roller_get_selected, + }, + { + .id = LV_PROPERTY_ROLLER_VISIBLE_ROW_COUNT, + .setter = lv_roller_set_visible_row_count, + .getter = NULL, + }, +}; +#endif + +const lv_obj_class_t lv_roller_class = { + .constructor_cb = lv_roller_constructor, + .event_cb = lv_roller_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_DPI_DEF, + .instance_size = sizeof(lv_roller_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .base_class = &lv_obj_class, + .name = "lv_roller", + LV_PROPERTY_CLASS_FIELDS(roller, ROLLER) +}; + +const lv_obj_class_t lv_roller_label_class = { + .event_cb = lv_roller_label_event, + .instance_size = sizeof(lv_label_t), + .base_class = &lv_label_class, + .name = "lv_roller_label", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_roller_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_roller_set_options(lv_obj_t * obj, const char * options, lv_roller_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(options); + + lv_roller_t * roller = (lv_roller_t *)obj; + lv_obj_t * label = get_label(obj); + + roller->sel_opt_id = 0; + roller->sel_opt_id_ori = 0; + + /*Count the '\n'-s to determine the number of options*/ + roller->option_cnt = 0; + uint32_t cnt; + for(cnt = 0; options[cnt] != '\0'; cnt++) { + if(options[cnt] == '\n') roller->option_cnt++; + } + roller->option_cnt++; /*Last option has no `\n`*/ + + if(mode == LV_ROLLER_MODE_NORMAL) { + roller->mode = LV_ROLLER_MODE_NORMAL; + lv_label_set_text(label, options); + } + else { + roller->mode = LV_ROLLER_MODE_INFINITE; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t normal_h = roller->option_cnt * (lv_font_get_line_height(font) + lv_obj_get_style_text_letter_space(obj, + LV_PART_MAIN)); + roller->inf_page_cnt = LV_CLAMP(3, EXTRA_INF_SIZE / normal_h, 15); + if(!(roller->inf_page_cnt & 1)) roller->inf_page_cnt++; /*Make it odd*/ + LV_LOG_INFO("Using %" LV_PRIu32 " pages to make the roller look infinite", roller->inf_page_cnt); + + size_t opt_len = lv_strlen(options) + 1; /*+1 to add '\n' after option lists*/ + size_t opt_extra_len = opt_len * roller->inf_page_cnt; + if(opt_extra_len == 0) { + /*Prevent write overflow*/ + opt_extra_len = 1; + } + + char * opt_extra = lv_malloc(opt_extra_len); + uint32_t i; + for(i = 0; i < roller->inf_page_cnt; i++) { + lv_strcpy(&opt_extra[opt_len * i], options); + opt_extra[opt_len * (i + 1) - 1] = '\n'; + } + opt_extra[opt_extra_len - 1] = '\0'; + lv_label_set_text(label, opt_extra); + lv_free(opt_extra); + + roller->sel_opt_id = ((roller->inf_page_cnt / 2) + 0) * roller->option_cnt; + + roller->option_cnt = roller->option_cnt * roller->inf_page_cnt; + inf_normalize(obj); + } + + roller->sel_opt_id_ori = roller->sel_opt_id; + + /*If the selected text has larger font the label needs some extra draw padding to draw it.*/ + lv_obj_refresh_ext_draw_size(label); +} + +void lv_roller_set_selected(lv_obj_t * obj, uint32_t sel_opt, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + /*Set the value even if it's the same as the current value because + *if moving to the next option with an animation which was just deleted in the PRESS Call the ancestor's event handler + *nothing will continue the animation.*/ + + lv_roller_t * roller = (lv_roller_t *)obj; + + /*In infinite mode interpret the new ID relative to the currently visible "page"*/ + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + uint32_t real_option_cnt = roller->option_cnt / roller->inf_page_cnt; + uint32_t current_page = roller->sel_opt_id / real_option_cnt; + /*Set by the user to e.g. 0, 1, 2, 3... + *Upscale the value to the current page*/ + if(sel_opt < real_option_cnt) { + uint32_t act_opt = roller->sel_opt_id - current_page * real_option_cnt; + int32_t sel_opt_signed = sel_opt; + /*Huge jump? Probably from last to first or first to last option.*/ + if((uint32_t)LV_ABS((int16_t)(act_opt - sel_opt)) > real_option_cnt / 2) { + if(act_opt > sel_opt) sel_opt_signed += real_option_cnt; + else sel_opt_signed -= real_option_cnt; + } + sel_opt = sel_opt_signed + real_option_cnt * current_page; + } + } + + roller->sel_opt_id = sel_opt < roller->option_cnt ? sel_opt : roller->option_cnt - 1; + roller->sel_opt_id_ori = roller->sel_opt_id; + + refr_position(obj, anim); +} + +bool lv_roller_set_selected_str(lv_obj_t * obj, const char * sel_opt, lv_anim_enable_t anim) +{ + const char * options = lv_roller_get_options(obj); + size_t options_len = lv_strlen(options); + + bool option_found = false; + + uint32_t current_option = 0; + size_t line_start = 0; + + for(size_t i = 0; i < options_len; i++) { + if(options[i] == '\n') { + /* See if this is the correct option */ + if(lv_strncmp(&options[line_start], sel_opt, i - line_start) == 0) { + lv_roller_set_selected(obj, current_option, anim); + option_found = true; + break; + } + + current_option++; + line_start = i + 1; + } + } + + return option_found; +} + +void lv_roller_set_visible_row_count(lv_obj_t * obj, uint32_t row_cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_obj_set_height(obj, (lv_font_get_line_height(font) + line_space) * row_cnt + 2 * border_width); +} + +/*===================== + * Getter functions + *====================*/ + +uint32_t lv_roller_get_selected(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_roller_t * roller = (lv_roller_t *)obj; + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + uint32_t real_id_cnt = roller->option_cnt / roller->inf_page_cnt; + return roller->sel_opt_id % real_id_cnt; + } + else { + return roller->sel_opt_id; + } +} + +void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_roller_t * roller = (lv_roller_t *)obj; + lv_roller_get_option_str(obj, roller->sel_opt_id, buf, buf_size); +} + +/** + * Get the options of a roller + * @param roller pointer to roller object + * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") + */ +const char * lv_roller_get_options(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_label_get_text(get_label(obj)); +} + +uint32_t lv_roller_get_option_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_roller_t * roller = (lv_roller_t *)obj; + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + return roller->option_cnt / roller->inf_page_cnt; + } + else { + return roller->option_cnt; + } +} + +#if LV_USE_OBSERVER + +lv_observer_t * lv_roller_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_obj_add_event_cb(obj, roller_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, roller_value_observer_cb, obj, NULL); + return observer; +} +#endif /*LV_USE_OBSERVER*/ + +lv_result_t lv_roller_get_option_str(const lv_obj_t * obj, uint32_t option, char * buf, uint32_t buf_size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * label = get_label(obj); + uint32_t i; + uint32_t line = 0; + const char * opt_txt = lv_label_get_text(label); + size_t txt_len = lv_strlen(opt_txt); + + for(i = 0; i < txt_len && line != option; i++) { + if(opt_txt[i] == '\n') line++; + } + + if(line != option) { + return LV_RESULT_INVALID; + } + + uint32_t c; + for(c = 0; i < txt_len && opt_txt[i] != '\n'; c++, i++) { + if(buf_size && c >= buf_size - 1) { + LV_LOG_WARN("the buffer was too small"); + break; + } + buf[c] = opt_txt[i]; + } + + buf[c] = '\0'; + return LV_RESULT_OK; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_roller_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_roller_t * roller = (lv_roller_t *)obj; + + roller->mode = LV_ROLLER_MODE_NORMAL; + roller->option_cnt = 0; + roller->sel_opt_id = 0; + roller->sel_opt_id_ori = 0; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + + LV_LOG_INFO("begin"); + lv_obj_t * label = lv_obj_class_create_obj(&lv_roller_label_class, obj); + lv_obj_class_init_obj(label); +#if LV_WIDGETS_HAS_DEFAULT_VALUE + lv_roller_set_options(obj, "Option 1\nOption 2\nOption 3\nOption 4\nOption 5", LV_ROLLER_MODE_NORMAL); +#endif + LV_LOG_TRACE("finished"); +} + +static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + const lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_roller_t * roller = (lv_roller_t *)obj; + + if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + p->x = get_selected_label_width(obj); + } + else if(code == LV_EVENT_STYLE_CHANGED) { + lv_obj_t * label = get_label(obj); + /*Be sure the label's style is updated before processing the roller*/ + if(label) lv_obj_send_event(label, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_refresh_self_size(obj); + refr_position(obj, LV_ANIM_OFF); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + refr_position(obj, LV_ANIM_OFF); + } + else if(code == LV_EVENT_PRESSED) { + if(roller->option_cnt <= 1) return; + + roller->moved = 0; + lv_anim_delete(get_label(obj), set_y_anim); + } + else if(code == LV_EVENT_CLICKED) { + if(roller->moved == 1) { + lv_event_stop_processing(e); + } + } + else if(code == LV_EVENT_PRESSING) { + if(roller->option_cnt <= 1) return; + + lv_indev_t * indev = lv_indev_active(); + lv_point_t p; + lv_indev_get_vect(indev, &p); + transform_vect_recursive(obj, &p); + if(p.y) { + lv_obj_t * label = get_label(obj); + lv_obj_set_y(label, lv_obj_get_y_aligned(label) + p.y); + roller->moved = 1; + } + } + else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + if(roller->option_cnt <= 1) return; + + release_handler(obj); + } + else if(code == LV_EVENT_FOCUSED) { + lv_group_t * g = lv_obj_get_group(obj); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + + /*Encoders need special handling*/ + if(indev_type == LV_INDEV_TYPE_ENCODER) { + const bool editing = lv_group_get_editing(g); + + /*Save the current state when entered to edit mode*/ + if(editing) { + roller->sel_opt_id_ori = roller->sel_opt_id; + } + else { /*In navigate mode revert the original value*/ + if(roller->sel_opt_id != roller->sel_opt_id_ori) { + roller->sel_opt_id = roller->sel_opt_id_ori; + refr_position(obj, LV_ANIM_ON); + } + } + } + else { + /*Save the current value. Used to revert this + *state if ENTER won't be pressed*/ + roller->sel_opt_id_ori = roller->sel_opt_id; + } + } + else if(code == LV_EVENT_DEFOCUSED) { + /*Revert the original state*/ + if(roller->sel_opt_id != roller->sel_opt_id_ori) { + roller->sel_opt_id = roller->sel_opt_id_ori; + refr_position(obj, LV_ANIM_ON); + } + } + else if(code == LV_EVENT_KEY) { + if(roller->option_cnt <= 1) return; + + uint32_t c = lv_event_get_key(e); + if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { + if(roller->sel_opt_id + 1 < roller->option_cnt) { + uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ + lv_roller_set_selected(obj, roller->sel_opt_id + 1, LV_ANIM_ON); + roller->sel_opt_id_ori = ori_id; + } + } + else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { + if(roller->sel_opt_id > 0) { + uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ + lv_roller_set_selected(obj, roller->sel_opt_id - 1, LV_ANIM_ON); + roller->sel_opt_id_ori = ori_id; + } + } + } + else if(code == LV_EVENT_ROTARY) { + if(roller->option_cnt <= 1) return; + + int32_t r = lv_event_get_rotary_diff(e); + int32_t new_id = roller->sel_opt_id + r; + new_id = LV_CLAMP(0, new_id, (int32_t)roller->option_cnt - 1); + if((int32_t)roller->sel_opt_id != new_id) { + uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/ + lv_roller_set_selected(obj, new_id, LV_ANIM_ON); + roller->sel_opt_id_ori = ori_id; + } + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + lv_obj_t * label = get_label(obj); + lv_obj_refresh_ext_draw_size(label); + } + else if(code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST) { + draw_main(e); + } +} + +static void lv_roller_label_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + lv_event_code_t code = lv_event_get_code(e); + /*LV_EVENT_DRAW_MAIN will be called in the draw function*/ + if(code != LV_EVENT_DRAW_MAIN) { + /* Call the ancestor's event handler */ + res = lv_obj_event_base(MY_CLASS_LABEL, e); + if(res != LV_RESULT_OK) return; + } + + lv_obj_t * label = lv_event_get_current_target(e); + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /*If the selected text has a larger font it needs some extra space to draw it*/ + int32_t * s = lv_event_get_param(e); + lv_obj_t * obj = lv_obj_get_parent(label); + int32_t sel_w = get_selected_label_width(obj); + int32_t label_w = lv_obj_get_width(label); + *s = LV_MAX(*s, sel_w - label_w); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + refr_position(lv_obj_get_parent(label), LV_ANIM_OFF); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_label(e); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + if(code == LV_EVENT_DRAW_MAIN) { + /*Draw the selected rectangle*/ + lv_layer_t * layer = lv_event_get_layer(e); + lv_area_t sel_area; + get_sel_area(obj, &sel_area); + lv_draw_rect_dsc_t sel_dsc; + lv_draw_rect_dsc_init(&sel_dsc); + sel_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_SELECTED, &sel_dsc); + lv_draw_rect(layer, &sel_dsc, &sel_area); + } + /*Post draw when the children are drawn*/ + else if(code == LV_EVENT_DRAW_POST) { + lv_layer_t * layer = lv_event_get_layer(e); + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(obj, LV_PART_SELECTED, &label_dsc); + + lv_text_attributes_t attributes = {0}; + attributes.letter_space = label_dsc.letter_space; + attributes.line_space = label_dsc.line_space; + attributes.max_width = lv_obj_get_width(obj); + attributes.text_flags = LV_TEXT_FLAG_EXPAND; + + /*Redraw the text on the selected area*/ + lv_area_t sel_area; + get_sel_area(obj, &sel_area); + lv_area_t mask_sel; + bool area_ok; + area_ok = lv_area_intersect(&mask_sel, &layer->_clip_area, &sel_area); + if(area_ok) { + lv_obj_t * label = get_label(obj); + if(lv_label_get_recolor(label)) label_dsc.flag |= LV_TEXT_FLAG_RECOLOR; + + /*Get the size of the "selected text"*/ + lv_point_t label_sel_size; + lv_text_get_size_attributes(&label_sel_size, lv_label_get_text(label), label_dsc.font, &attributes); + + /*Move the selected label proportionally with the background label*/ + int32_t roller_h = lv_obj_get_height(obj); + const lv_font_t * normal_label_font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + /*label offset from the middle line of the roller*/ + int32_t label_y_prop = (label->coords.y1 + normal_label_font->line_height / 2) - (roller_h / 2 + obj->coords.y1); + + /*Proportional position from the middle line. + *Will be 0 for the first option, and 1 for the last option (upscaled by << 14)*/ + int32_t remain_h = lv_obj_get_height(label) - normal_label_font->line_height; + if(remain_h > 0) { + label_y_prop = (label_y_prop << 14) / remain_h; + } + + /*We don't want the selected label start and end exactly where the normal label is as + *a larger font won't centered on selected area.*/ + int32_t corr = label_dsc.font->line_height; + + /*Apply the proportional position to the selected text*/ + int32_t label_sel_y = roller_h / 2 + obj->coords.y1; + label_sel_y += ((label_sel_size.y - corr) * label_y_prop) >> 14; + label_sel_y -= corr / 2; + + int32_t bwidth = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t pleft = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t pright = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + + /*Draw the selected text*/ + lv_area_t label_sel_area; + label_sel_area.x1 = obj->coords.x1 + pleft + bwidth; + label_sel_area.y1 = label_sel_y; + label_sel_area.x2 = obj->coords.x2 - pright - bwidth; + label_sel_area.y2 = label_sel_area.y1 + label_sel_size.y; + + label_dsc.flag |= LV_TEXT_FLAG_EXPAND; + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = mask_sel; + label_dsc.text = lv_label_get_text(label); + lv_draw_label(layer, &label_dsc, &label_sel_area); + layer->_clip_area = clip_area_ori; + } + } +} + +static void draw_label(lv_event_t * e) +{ + /* Split the drawing of the label into an upper (above the selected area) + * and a lower (below the selected area)*/ + lv_obj_t * label_obj = lv_event_get_current_target(e); + lv_obj_t * roller = lv_obj_get_parent(label_obj); + lv_layer_t * layer = lv_event_get_layer(e); + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + label_draw_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(roller, LV_PART_MAIN, &label_draw_dsc); + if(lv_label_get_recolor(label_obj)) label_draw_dsc.flag |= LV_TEXT_FLAG_RECOLOR; + + /*If the roller has shadow or outline it has some ext. draw size + *therefore the label can overflow the roller's boundaries. + *To solve this limit the clip area to the "plain" roller.*/ + const lv_area_t clip_area_ori = layer->_clip_area; + lv_area_t roller_clip_area; + if(!lv_area_intersect(&roller_clip_area, &layer->_clip_area, &roller->coords)) return; + layer->_clip_area = roller_clip_area; + + lv_area_t sel_area; + get_sel_area(roller, &sel_area); + + lv_area_t clip2; + clip2.x1 = label_obj->coords.x1; + clip2.y1 = label_obj->coords.y1; + clip2.x2 = label_obj->coords.x2; + clip2.y2 = sel_area.y1; + if(lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { + const lv_area_t clip_area_ori2 = layer->_clip_area; + layer->_clip_area = clip2; + label_draw_dsc.text = lv_label_get_text(label_obj); + lv_draw_label(layer, &label_draw_dsc, &label_obj->coords); + layer->_clip_area = clip_area_ori2; + } + + clip2.x1 = label_obj->coords.x1; + clip2.y1 = sel_area.y2; + clip2.x2 = label_obj->coords.x2; + clip2.y2 = label_obj->coords.y2; + if(lv_area_intersect(&clip2, &layer->_clip_area, &clip2)) { + const lv_area_t clip_area_ori2 = layer->_clip_area; + layer->_clip_area = clip2; + label_draw_dsc.text = lv_label_get_text(label_obj); + lv_draw_label(layer, &label_draw_dsc, &label_obj->coords); + layer->_clip_area = clip_area_ori2; + } + + layer->_clip_area = clip_area_ori; +} + +static void get_sel_area(lv_obj_t * obj, lv_area_t * sel_area) +{ + + const lv_font_t * font_main = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const lv_font_t * font_sel = lv_obj_get_style_text_font(obj, LV_PART_SELECTED); + int32_t font_main_h = lv_font_get_line_height(font_main); + int32_t font_sel_h = lv_font_get_line_height(font_sel); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t d = (font_sel_h + font_main_h) / 2 + line_space; + sel_area->y1 = obj->coords.y1 + lv_obj_get_height(obj) / 2 - d / 2; + sel_area->y2 = sel_area->y1 + d; + lv_area_t roller_coords; + lv_obj_get_coords(obj, &roller_coords); + + sel_area->x1 = roller_coords.x1; + sel_area->x2 = roller_coords.x2; + +} + +/** + * Refresh the position of the roller. It uses the id stored in: roller->ddlist.selected_option_id + * @param roller pointer to a roller object + * @param anim_en LV_ANIM_ON: refresh with animation; LV_ANIM_OFF: without animation + */ +static void refr_position(lv_obj_t * obj, lv_anim_enable_t anim_en) +{ + lv_obj_t * label = get_label(obj); + if(label == NULL) return; + + const lv_text_align_t align = lv_obj_calculate_style_text_align(label, LV_PART_MAIN, lv_label_get_text(label)); + + int32_t x = 0; + switch(align) { + case LV_TEXT_ALIGN_CENTER: + x = (lv_obj_get_content_width(obj) - lv_obj_get_width(label)) / 2; + break; + case LV_TEXT_ALIGN_RIGHT: + x = lv_obj_get_content_width(obj) - lv_obj_get_width(label); + break; + case LV_TEXT_ALIGN_LEFT: + x = 0; + break; + default: + /* Invalid alignment */ + break; + } + lv_obj_set_x(label, x); + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + const int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const int32_t font_h = lv_font_get_line_height(font); + const int32_t h = lv_obj_get_content_height(obj); + uint32_t anim_time = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); + + /*Normally the animation's `end_cb` sets correct position of the roller if infinite. + *But without animations we have to do it manually*/ + if(anim_en == LV_ANIM_OFF || anim_time == 0) { + inf_normalize(obj); + } + + /* Calculate animation configuration */ + lv_roller_t * roller = (lv_roller_t *)obj; + int32_t id = roller->sel_opt_id; + const int32_t sel_y1 = id * (font_h + line_space); + const int32_t mid_y1 = h / 2 - font_h / 2; + const int32_t new_y = mid_y1 - sel_y1; + + if(anim_en == LV_ANIM_OFF || anim_time == 0) { + lv_anim_delete(label, set_y_anim); + lv_obj_set_y(label, new_y); + } + else { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, label); + lv_anim_set_exec_cb(&a, set_y_anim); + lv_anim_set_values(&a, lv_obj_get_y(label), new_y); + lv_anim_set_duration(&a, anim_time); + lv_anim_set_completed_cb(&a, scroll_anim_completed_cb); + lv_anim_set_path_cb(&a, lv_anim_path_ease_out); + lv_anim_start(&a); + } +} + +static lv_result_t release_handler(lv_obj_t * obj) +{ + lv_obj_t * label = get_label(obj); + if(label == NULL) return LV_RESULT_OK; + + lv_indev_t * indev = lv_indev_active(); + lv_roller_t * roller = (lv_roller_t *)obj; + + /*Leave edit mode once a new option is selected*/ + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { + roller->sel_opt_id_ori = roller->sel_opt_id; + + if(indev_type == LV_INDEV_TYPE_ENCODER) { + lv_group_t * g = lv_obj_get_group(obj); + if(lv_group_get_editing(g)) { + lv_group_set_editing(g, false); + } + } + } + + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { + /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ + int16_t new_opt = -1; + if(roller->moved == 0) { + new_opt = 0; + lv_point_t p; + lv_indev_get_point(indev, &p); + lv_obj_transform_point(obj, &p, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); + p.y -= label->coords.y1; + p.x -= label->coords.x1; + uint32_t letter_i; + letter_i = lv_label_get_letter_on(label, &p, true); + + const char * txt = lv_label_get_text(label); + uint32_t i = 0; + uint32_t i_prev = 0; + + uint32_t letter_cnt = 0; + for(letter_cnt = 0; letter_cnt < letter_i; letter_cnt++) { + uint32_t letter = lv_text_encoded_next(txt, &i); + /*Count he lines to reach the clicked letter. But ignore the last '\n' because it + * still belongs to the clicked line*/ + if(letter == '\n' && i_prev != letter_i) new_opt++; + i_prev = i; + } + } + else { + /*If dragged then align the list to have an element in the middle*/ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + + int32_t label_unit = font_h + line_space; + int32_t mid = obj->coords.y1 + (obj->coords.y2 - obj->coords.y1) / 2; + + lv_point_t p = indev->pointer.scroll_throw_vect_ori; + transform_vect_recursive(obj, &p); + + int32_t scroll_throw = indev->scroll_throw; + int32_t sum = 0; + int32_t v = p.y; + while(v) { + sum += v; + v = v * (100 - scroll_throw) / 100; + } + + int32_t label_y1 = label->coords.y1 + sum; + int32_t id = (mid - label_y1) / label_unit; + + if(id < 0) id = 0; + if(id >= (int32_t)roller->option_cnt) id = roller->option_cnt - 1; + + new_opt = id; + } + + if(new_opt >= 0) { + lv_roller_set_selected(obj, new_opt, LV_ANIM_ON); + } + } + + uint32_t id = roller->sel_opt_id; /*Just to use uint32_t in event data*/ + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, &id); + return res; +} + +/** + * Set the middle page for the roller if infinite is enabled + * @param roller pointer to a roller object + */ +static void inf_normalize(lv_obj_t * obj) +{ + lv_roller_t * roller = (lv_roller_t *)obj; + + if(roller->mode == LV_ROLLER_MODE_INFINITE) { + uint32_t real_id_cnt = roller->option_cnt / roller->inf_page_cnt; + roller->sel_opt_id = roller->sel_opt_id % real_id_cnt; + roller->sel_opt_id += (roller->inf_page_cnt / 2) * real_id_cnt; /*Select the middle page*/ + + roller->sel_opt_id_ori = roller->sel_opt_id % real_id_cnt; + roller->sel_opt_id_ori += (roller->inf_page_cnt / 2) * real_id_cnt; /*Select the middle page*/ + + /*Move to the new id*/ + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + int32_t h = lv_obj_get_content_height(obj); + + lv_obj_t * label = get_label(obj); + + int32_t sel_y1 = roller->sel_opt_id * (font_h + line_space); + int32_t mid_y1 = h / 2 - font_h / 2; + int32_t new_y = mid_y1 - sel_y1; + lv_obj_set_y(label, new_y); + } +} + +static lv_obj_t * get_label(const lv_obj_t * obj) +{ + return lv_obj_get_child(obj, 0); +} + +static int32_t get_selected_label_width(const lv_obj_t * obj) +{ + lv_obj_t * label = get_label(obj); + if(label == NULL) return 0; + + lv_text_attributes_t attributes = {0}; + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_SELECTED); + attributes.letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_SELECTED); + attributes.max_width = LV_COORD_MAX; + attributes.text_flags = LV_TEXT_FLAG_NONE; + + const char * txt = lv_label_get_text(label); + lv_point_t size; + lv_text_get_size_attributes(&size, txt, font, &attributes); + return size.x; +} + +static void scroll_anim_completed_cb(lv_anim_t * a) +{ + lv_obj_t * obj = lv_obj_get_parent(a->var); /*The label is animated*/ + inf_normalize(obj); +} + +static void set_y_anim(void * obj, int32_t v) +{ + lv_obj_set_y(obj, v); +} + +static void transform_vect_recursive(lv_obj_t * roller, lv_point_t * vect) +{ + int16_t angle = 0; + int32_t scale_x = 256; + int32_t scale_y = 256; + lv_obj_t * parent = roller; + while(parent) { + angle += lv_obj_get_style_transform_rotation(parent, LV_PART_MAIN); + int32_t zoom_act_x = lv_obj_get_style_transform_scale_x_safe(parent, LV_PART_MAIN); + int32_t zoom_act_y = lv_obj_get_style_transform_scale_y_safe(parent, LV_PART_MAIN); + scale_x = (scale_x * zoom_act_x) >> 8; + scale_y = (scale_y * zoom_act_y) >> 8; + parent = lv_obj_get_parent(parent); + } + lv_point_t pivot = { 0, 0 }; + + if(scale_x == 0) { + scale_x = 1; + } + + if(scale_y == 0) { + scale_y = 1; + } + + scale_x = 256 * 256 / scale_x; + scale_y = 256 * 256 / scale_y; + lv_point_transform(vect, -angle, scale_x, scale_y, &pivot, false); +} + +#if LV_USE_OBSERVER + +static void roller_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * roller = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + lv_subject_set_int(subject, lv_roller_get_selected(roller)); +} + +static void roller_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + /*If the roller is not rendered yet show the new state immediately*/ + lv_obj_t * obj = lv_observer_get_target_obj(observer); + lv_anim_enable_t anim_on = obj->rendered ? LV_ANIM_ON : LV_ANIM_OFF; + if((int32_t)lv_roller_get_selected(observer->target) != subject->value.num) { + lv_roller_set_selected(observer->target, subject->value.num, anim_on); + } +} + +#endif /*LV_USE_OBSERVER*/ + + +#endif diff --git a/inc/lvgl/src/widgets/roller/lv_roller.h b/inc/lvgl/src/widgets/roller/lv_roller.h new file mode 100644 index 0000000..b4f3089 --- /dev/null +++ b/inc/lvgl/src/widgets/roller/lv_roller.h @@ -0,0 +1,162 @@ +/** + * @file lv_roller.h + * + */ + +#ifndef LV_ROLLER_H +#define LV_ROLLER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_ROLLER != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_roller: lv_label is required. Enable it in lv_conf.h (LV_USE_ROLLER 1)" +#endif + +#include "../label/lv_label.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Roller mode. */ +typedef enum { + LV_ROLLER_MODE_NORMAL, /**< Normal mode (roller ends at the end of the options). */ + LV_ROLLER_MODE_INFINITE, /**< Infinite mode (roller can be scrolled forever). */ +} lv_roller_mode_t; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_roller_id_t { + LV_PROPERTY_ID2(ROLLER, OPTIONS, LV_PROPERTY_TYPE_TEXT, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID2(ROLLER, SELECTED, LV_PROPERTY_TYPE_INT, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(ROLLER, VISIBLE_ROW_COUNT, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ROLLER_END, +}; +#endif + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_roller_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a roller object + * @param parent pointer to an object, it will be the parent of the new roller. + * @return pointer to the created roller + */ +lv_obj_t * lv_roller_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the options on a roller + * @param obj pointer to roller object + * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" + * @param mode `LV_ROLLER_MODE_NORMAL` or `LV_ROLLER_MODE_INFINITE` + */ +void lv_roller_set_options(lv_obj_t * obj, const char * options, lv_roller_mode_t mode); + +/** + * Set the selected option + * @param obj pointer to a roller object + * @param sel_opt index of the selected option (0 ... number of option - 1); + * @param anim LV_ANIM_ON: set with animation; LV_ANIM_OFF set immediately + */ +void lv_roller_set_selected(lv_obj_t * obj, uint32_t sel_opt, lv_anim_enable_t anim); + +/** + * Sets the given string as the selection on the roller. Does not alter the current selection on failure. + * @param obj pointer to roller object + * @param sel_opt pointer to the string you want to set as an option + * @param anim LV_ANIM_ON: set with animation; LV_ANIM_OFF set immediately + * @return `true` if set successfully and `false` if the given string does not exist as an option in the roller + */ +bool lv_roller_set_selected_str(lv_obj_t * obj, const char * sel_opt, lv_anim_enable_t anim); + +/** + * Set the height to show the given number of rows (options) + * @param obj pointer to a roller object + * @param row_cnt number of desired visible rows + */ +void lv_roller_set_visible_row_count(lv_obj_t * obj, uint32_t row_cnt); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the index of the selected option + * @param obj pointer to a roller object + * @return index of the selected option (0 ... number of option - 1); + */ +uint32_t lv_roller_get_selected(const lv_obj_t * obj); + +/** + * Get the current selected option as a string. + * @param obj pointer to roller object + * @param buf pointer to an array to store the string + * @param buf_size size of `buf` in bytes. 0: to ignore it. + */ +void lv_roller_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size); + +/** + * Get the options of a roller + * @param obj pointer to roller object + * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") + */ +const char * lv_roller_get_options(const lv_obj_t * obj); + +/** + * Get the total number of options + * @param obj pointer to a roller object + * @return the total number of options + */ +uint32_t lv_roller_get_option_count(const lv_obj_t * obj); + +/** + * Get an option as a string. + * @param obj pointer to roller object + * @param option index of chosen option + * @param buf pointer to an array to store the string + * @param buf_size size of `buf` in bytes. 0: to ignore it. + * @return LV_RESULT_OK if option found + */ +lv_result_t lv_roller_get_option_str(const lv_obj_t * obj, uint32_t option, char * buf, uint32_t buf_size); + +#if LV_USE_OBSERVER +/** + * Bind an integer Subject to a Roller's value. + * @param obj pointer to Roller + * @param subject pointer to Subject + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_roller_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_ROLLER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ROLLER_H*/ diff --git a/inc/lvgl/src/widgets/roller/lv_roller_private.h b/inc/lvgl/src/widgets/roller/lv_roller_private.h new file mode 100644 index 0000000..686c0d5 --- /dev/null +++ b/inc/lvgl/src/widgets/roller/lv_roller_private.h @@ -0,0 +1,55 @@ +/** + * @file lv_roller_private.h + * + */ + +#ifndef LV_ROLLER_PRIVATE_H +#define LV_ROLLER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_roller.h" + +#if LV_USE_ROLLER != 0 +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_roller_t { + lv_obj_t obj; + uint32_t option_cnt; /**< Number of options*/ + uint32_t sel_opt_id; /**< Index of the current option*/ + uint32_t sel_opt_id_ori; /**< Store the original index on focus*/ + uint32_t inf_page_cnt; /**< Number of extra pages added to make the roller look infinite */ + lv_roller_mode_t mode : 2; + uint32_t moved : 1; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_ROLLER != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_ROLLER_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/scale/lv_scale.c b/inc/lvgl/src/widgets/scale/lv_scale.c new file mode 100644 index 0000000..92c9335 --- /dev/null +++ b/inc/lvgl/src/widgets/scale/lv_scale.c @@ -0,0 +1,1893 @@ +/** + * @file lv_scale.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_scale_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_SCALE != 0 + +#include "../../core/lv_group.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_text_private.h" +#include "../../core/lv_observer_private.h" +#include "../../draw/lv_draw_arc.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_scale_class) + +#define LV_SCALE_LABEL_TXT_LEN (20U) +#define LV_SCALE_DEFAULT_ANGLE_RANGE ((uint32_t) 270U) +#define LV_SCALE_DEFAULT_ROTATION ((int32_t) 135U) +#define LV_SCALE_TICK_IDX_DEFAULT_ID ((uint32_t) 255U) +#define LV_SCALE_DEFAULT_LABEL_GAP ((uint32_t) 15U) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_scale_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_scale_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_scale_event(const lv_obj_class_t * class_p, lv_event_t * event); + +static void scale_draw_main(lv_obj_t * obj, lv_event_t * event); +static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event); +static void scale_draw_label(lv_obj_t * obj, lv_event_t * event, lv_draw_label_dsc_t * label_dsc, + const uint32_t major_tick_idx, const int32_t tick_value, lv_point_t * tick_point_b, const uint32_t tick_idx); +static void scale_calculate_main_compensation(lv_obj_t * obj); + +static void scale_get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r); +static void scale_get_tick_points(lv_obj_t * obj, const uint32_t tick_idx, bool is_major_tick, + lv_point_t * tick_point_a, lv_point_t * tick_point_b); +static void scale_get_label_coords(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, lv_point_t * tick_point, + lv_area_t * label_coords); +static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, + const lv_style_t * indicator_section_style); +static void scale_set_line_properties(lv_obj_t * obj, lv_draw_line_dsc_t * line_dsc, const lv_style_t * section_style, + lv_part_t part); +static void scale_set_arc_properties(lv_obj_t * obj, lv_draw_arc_dsc_t * arc_dsc, const lv_style_t * section_style); +/* Helpers */ +static void scale_find_section_tick_idx(lv_obj_t * obj); +static void scale_store_main_line_tick_width_compensation(lv_obj_t * obj, const uint32_t tick_idx, + const bool is_major_tick, const int32_t major_tick_width, const int32_t minor_tick_width); +static void scale_store_section_line_tick_width_compensation(lv_obj_t * obj, const bool is_major_tick, + lv_draw_line_dsc_t * major_tick_dsc, lv_draw_line_dsc_t * minor_tick_dsc, + const int32_t tick_value, const uint8_t tick_idx, lv_point_t * tick_point_a); +static void scale_build_custom_label_text(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, + const uint16_t major_tick_idx); + +static void scale_free_line_needle_points_cb(lv_event_t * e); + +static bool scale_is_major_tick(lv_scale_t * scale, uint32_t tick_idx); + +static lv_result_t update_needle(lv_scale_t * scale, lv_obj_t * needle, int32_t length, int32_t value); +static void needle_deleted_cb(lv_event_t * e); + +#if LV_USE_OBSERVER + static void scale_section_min_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); + static void scale_section_max_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif /*LV_USE_OBSERVER*/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_scale_properties[] = { + { + .id = LV_PROPERTY_SCALE_MODE, + .setter = lv_scale_set_mode, + .getter = lv_scale_get_mode, + }, + { + .id = LV_PROPERTY_SCALE_TOTAL_TICK_COUNT, + .setter = lv_scale_set_total_tick_count, + .getter = lv_scale_get_total_tick_count, + }, + { + .id = LV_PROPERTY_SCALE_MAJOR_TICK_EVERY, + .setter = lv_scale_set_major_tick_every, + .getter = lv_scale_get_major_tick_every, + }, + { + .id = LV_PROPERTY_SCALE_LABEL_SHOW, + .setter = lv_scale_set_label_show, + .getter = lv_scale_get_label_show, + }, + { + .id = LV_PROPERTY_SCALE_ANGLE_RANGE, + .setter = lv_scale_set_angle_range, + .getter = lv_scale_get_angle_range, + }, + { + .id = LV_PROPERTY_SCALE_ROTATION, + .setter = lv_scale_set_rotation, + .getter = lv_scale_get_rotation, + }, + { + .id = LV_PROPERTY_SCALE_RANGE_MIN_VALUE, + .setter = lv_scale_set_min_value, + .getter = lv_scale_get_range_min_value, + }, + { + .id = LV_PROPERTY_SCALE_RANGE_MAX_VALUE, + .setter = lv_scale_set_max_value, + .getter = lv_scale_get_range_max_value, + }, +}; +#endif + +const lv_obj_class_t lv_scale_class = { + .constructor_cb = lv_scale_constructor, + .destructor_cb = lv_scale_destructor, + .event_cb = lv_scale_event, + .instance_size = sizeof(lv_scale_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .base_class = &lv_obj_class, + .name = "lv_scale", + LV_PROPERTY_CLASS_FIELDS(scale, SCALE) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_scale_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/* + * New object specific "add" or "remove" functions come here + */ + +/*===================== + * Setter functions + *====================*/ + +void lv_scale_set_mode(lv_obj_t * obj, lv_scale_mode_t mode) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->mode = mode; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_total_tick_count(lv_obj_t * obj, uint32_t total_tick_count) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->total_tick_count = total_tick_count; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_major_tick_every(lv_obj_t * obj, uint32_t major_tick_every) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->major_tick_every = major_tick_every; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_label_show(lv_obj_t * obj, bool show_label) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->label_enabled = show_label; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->range_min = min; + scale->range_max = max; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_min_value(lv_obj_t * obj, int32_t min) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + if(scale->range_min == min) return; + scale->range_min = min; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_max_value(lv_obj_t * obj, int32_t max) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + if(scale->range_max == max) return; + scale->range_max = max; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_angle_range(lv_obj_t * obj, uint32_t angle_range) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->angle_range = angle_range; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_rotation(lv_obj_t * obj, int32_t rotation) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + int32_t normalized_angle = rotation; + + if(normalized_angle < 0 || normalized_angle > 360) { + normalized_angle = rotation % 360; + + if(normalized_angle < 0) { + normalized_angle += 360; + } + } + + scale->rotation = normalized_angle; + lv_obj_invalidate(obj); +} + +void lv_scale_set_line_needle_value(lv_obj_t * obj, lv_obj_t * needle_line, int32_t needle_length, + int32_t value) +{ + int32_t angle; + int32_t scale_width, scale_height; + int32_t actual_needle_length; + int32_t needle_length_x, needle_length_y; + lv_point_precise_t * needle_line_points = NULL; + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + if((scale->mode != LV_SCALE_MODE_ROUND_INNER) && + (scale->mode != LV_SCALE_MODE_ROUND_OUTER)) { + return; + } + + lv_obj_align(needle_line, LV_ALIGN_TOP_LEFT, 0, 0); + + scale_width = lv_obj_get_style_width(obj, LV_PART_MAIN); + scale_height = lv_obj_get_style_height(obj, LV_PART_MAIN); + + if(scale_width != scale_height) { + return; + } + + if(needle_length >= scale_width / 2) { + actual_needle_length = scale_width / 2; + } + else if(needle_length >= 0) { + actual_needle_length = needle_length; + } + else if(needle_length + scale_width / 2 < 0) { + actual_needle_length = 0; + } + else { + actual_needle_length = scale_width / 2 + needle_length; + } + + if(value < scale->range_min) { + angle = 0; + } + else if(value > scale->range_max) { + angle = scale->angle_range; + } + else { + angle = scale->angle_range * (value - scale->range_min) / (scale->range_max - scale->range_min); + } + + needle_length_x = (actual_needle_length * lv_trigo_cos(scale->rotation + angle)) >> LV_TRIGO_SHIFT; + needle_length_y = (actual_needle_length * lv_trigo_sin(scale->rotation + angle)) >> LV_TRIGO_SHIFT; + + if(lv_line_is_point_array_mutable(needle_line) && lv_line_get_point_count(needle_line) >= 2) { + needle_line_points = lv_line_get_points_mutable(needle_line); + } + + if(needle_line_points == NULL) { + uint32_t i; + uint32_t line_event_cnt = lv_obj_get_event_count(needle_line); + for(i = 0; i < line_event_cnt; i++) { + lv_event_dsc_t * dsc = lv_obj_get_event_dsc(needle_line, i); + if(lv_event_dsc_get_cb(dsc) == scale_free_line_needle_points_cb) { + needle_line_points = lv_event_dsc_get_user_data(dsc); + break; + } + } + } + + if(needle_line_points == NULL) { + needle_line_points = lv_malloc(sizeof(lv_point_precise_t) * 2); + LV_ASSERT_MALLOC(needle_line_points); + if(needle_line_points == NULL) return; + lv_obj_add_event_cb(needle_line, scale_free_line_needle_points_cb, LV_EVENT_DELETE, needle_line_points); + } + + needle_line_points[0].x = scale_width / 2; + needle_line_points[0].y = scale_height / 2; + needle_line_points[1].x = scale_width / 2 + needle_length_x; + needle_line_points[1].y = scale_height / 2 + needle_length_y; + + lv_line_set_points_mutable(needle_line, needle_line_points, 2); + + update_needle(scale, needle_line, needle_length, value); +} + +void lv_scale_set_image_needle_value(lv_obj_t * obj, lv_obj_t * needle_img, int32_t value) +{ + int32_t angle; + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + if((scale->mode != LV_SCALE_MODE_ROUND_INNER) && + (scale->mode != LV_SCALE_MODE_ROUND_OUTER)) { + return; + } + + if(value < scale->range_min) { + angle = 0; + } + else if(value > scale->range_max) { + angle = scale->angle_range; + } + else { + angle = scale->angle_range * (value - scale->range_min) / (scale->range_max - scale->range_min); + } + + lv_image_set_rotation(needle_img, (scale->rotation + angle) * 10); + update_needle(scale, needle_img, 0, value); +} + +void lv_scale_set_text_src(lv_obj_t * obj, const char * txt_src[]) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->txt_src = txt_src; + scale->custom_label_cnt = 0; + if(scale->txt_src) { + int32_t idx; + for(idx = 0; txt_src[idx]; ++idx) { + scale->custom_label_cnt++; + } + } + + lv_obj_invalidate(obj); +} + +void lv_scale_set_post_draw(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->post_draw = en; + + lv_obj_invalidate(obj); +} + +void lv_scale_set_draw_ticks_on_top(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_scale_t * scale = (lv_scale_t *)obj; + + scale->draw_ticks_on_top = en; + + lv_obj_invalidate(obj); +} + +lv_scale_section_t * lv_scale_add_section(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_scale_t * scale = (lv_scale_t *)obj; + lv_scale_section_t * section = lv_ll_ins_head(&scale->section_ll); + LV_ASSERT_MALLOC(section); + if(section == NULL) return NULL; + + /* Section default values */ + lv_memzero(section, sizeof(lv_scale_section_t)); + section->first_tick_idx_in_section = LV_SCALE_TICK_IDX_DEFAULT_ID; + section->last_tick_idx_in_section = LV_SCALE_TICK_IDX_DEFAULT_ID; + /* Initial range is [0..-1] to make it "neutral" (i.e. will not be drawn until user + * sets a different range). `range_min` is already 0 from `lv_memzero()` above. */ + section->range_max = -1; + + return section; +} + + +void lv_scale_set_section_range(lv_obj_t * scale, lv_scale_section_t * section, int32_t min, int32_t max) +{ + LV_ASSERT_OBJ(scale, MY_CLASS); + LV_ASSERT_NULL(section); + + lv_scale_set_section_min_value(scale, section, min); + lv_scale_set_section_max_value(scale, section, max); +} + +void lv_scale_set_section_min_value(lv_obj_t * scale, lv_scale_section_t * section, int32_t min) +{ + LV_ASSERT_OBJ(scale, MY_CLASS); + LV_ASSERT_NULL(section); + + if(section->range_min == min) return; + section->range_min = min; + lv_obj_invalidate(scale); +} + +void lv_scale_set_section_max_value(lv_obj_t * scale, lv_scale_section_t * section, int32_t max) +{ + LV_ASSERT_OBJ(scale, MY_CLASS); + LV_ASSERT_NULL(section); + + if(section->range_max == max) return; + section->range_max = max; + lv_obj_invalidate(scale); +} + +void lv_scale_section_set_range(lv_scale_section_t * section, int32_t min, int32_t max) +{ + if(NULL == section) return; + + section->range_min = min; + section->range_max = max; +} + + +void lv_scale_set_section_style_main(lv_obj_t * scale, lv_scale_section_t * section, const lv_style_t * style) +{ + LV_ASSERT_OBJ(scale, MY_CLASS); + LV_ASSERT_NULL(section); + + section->main_style = style; + lv_obj_invalidate(scale); +} + +void lv_scale_set_section_style_indicator(lv_obj_t * scale, lv_scale_section_t * section, const lv_style_t * style) +{ + LV_ASSERT_OBJ(scale, MY_CLASS); + LV_ASSERT_NULL(section); + + section->indicator_style = style; + lv_obj_invalidate(scale); +} + +void lv_scale_set_section_style_items(lv_obj_t * scale, lv_scale_section_t * section, const lv_style_t * style) +{ + LV_ASSERT_OBJ(scale, MY_CLASS); + LV_ASSERT_NULL(section); + + section->items_style = style; + lv_obj_invalidate(scale); +} + +void lv_scale_section_set_style(lv_scale_section_t * section, lv_part_t part, lv_style_t * section_part_style) +{ + LV_LOG_WARN("Deprecated, use lv_scale_set_section_style_main/indicator/items instead"); + + if(NULL == section) return; + + switch(part) { + case LV_PART_MAIN: + section->main_style = section_part_style; + break; + case LV_PART_INDICATOR: + section->indicator_style = section_part_style; + break; + case LV_PART_ITEMS: + section->items_style = section_part_style; + break; + default: + /* Invalid part */ + break; + } +} + +/*===================== + * Getter functions + *====================*/ + +lv_scale_mode_t lv_scale_get_mode(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->mode; +} + +int32_t lv_scale_get_total_tick_count(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->total_tick_count; +} + +int32_t lv_scale_get_major_tick_every(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->major_tick_every; +} + +int32_t lv_scale_get_rotation(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->rotation; +} + +bool lv_scale_get_label_show(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->label_enabled; +} + +uint32_t lv_scale_get_angle_range(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->angle_range; +} + +int32_t lv_scale_get_range_min_value(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->range_min; +} + +int32_t lv_scale_get_range_max_value(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + return scale->range_max; +} + +/*===================== + * Other functions + *====================*/ + +#if LV_USE_OBSERVER + +lv_observer_t * lv_scale_bind_section_min_value(lv_obj_t * obj, lv_scale_section_t * section, lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(section); + + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, scale_section_min_value_observer_cb, obj, section); + + return observer; +} + +lv_observer_t * lv_scale_bind_section_max_value(lv_obj_t * obj, lv_scale_section_t * section, lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(section); + + if(subject->type != LV_SUBJECT_TYPE_INT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, scale_section_max_value_observer_cb, obj, section); + + return observer; +} + +#endif /*LV_USE_OBSERVER*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_scale_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_scale_t * scale = (lv_scale_t *)obj; + + lv_ll_init(&scale->section_ll, sizeof(lv_scale_section_t)); + + scale->total_tick_count = LV_SCALE_TOTAL_TICK_COUNT_DEFAULT; + scale->major_tick_every = LV_SCALE_MAJOR_TICK_EVERY_DEFAULT; + scale->mode = LV_SCALE_MODE_HORIZONTAL_BOTTOM; + scale->label_enabled = LV_SCALE_LABEL_ENABLED_DEFAULT; + scale->angle_range = LV_SCALE_DEFAULT_ANGLE_RANGE; + scale->rotation = LV_SCALE_DEFAULT_ROTATION; + scale->range_min = 0; + scale->range_max = 100; + scale->last_tick_width = 0; + scale->first_tick_width = 0; + scale->post_draw = false; + scale->draw_ticks_on_top = false; + scale->custom_label_cnt = 0; + scale->txt_src = NULL; + lv_array_init(&scale->needles, 0, sizeof(lv_scale_needle_t)); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_scale_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_scale_t * scale = (lv_scale_t *)obj; + lv_scale_section_t * section; + while(scale->section_ll.head) { + section = lv_ll_get_head(&scale->section_ll); + lv_ll_remove(&scale->section_ll, section); + lv_free(section); + } + lv_ll_clear(&scale->section_ll); + + size_t needle_count = lv_array_size(&scale->needles); + for(size_t i = 0; i < needle_count; ++i) { + lv_scale_needle_t * scale_needle = lv_array_at(&scale->needles, i); + lv_obj_remove_event_cb(scale_needle->obj, needle_deleted_cb); + } + lv_array_deinit(&scale->needles); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_scale_event(const lv_obj_class_t * class_p, lv_event_t * event) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + lv_result_t res = lv_obj_event_base(MY_CLASS, event); + if(res != LV_RESULT_OK) return; + + lv_event_code_t event_code = lv_event_get_code(event); + lv_obj_t * obj = lv_event_get_current_target(event); + lv_scale_t * scale = (lv_scale_t *) obj; + LV_UNUSED(scale); + + if(event_code == LV_EVENT_DRAW_MAIN) { + if(scale->post_draw == false) { + scale_find_section_tick_idx(obj); + scale_calculate_main_compensation(obj); + + if(scale->draw_ticks_on_top) { + scale_draw_main(obj, event); + scale_draw_indicator(obj, event); + } + else { + scale_draw_indicator(obj, event); + scale_draw_main(obj, event); + } + } + } + if(event_code == LV_EVENT_DRAW_POST) { + if(scale->post_draw == true) { + scale_find_section_tick_idx(obj); + scale_calculate_main_compensation(obj); + + if(scale->draw_ticks_on_top) { + scale_draw_main(obj, event); + scale_draw_indicator(obj, event); + } + else { + scale_draw_indicator(obj, event); + scale_draw_main(obj, event); + } + } + } + else if(event_code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + /* NOTE: Extend scale draw size so the first tick label can be shown */ + lv_event_set_ext_draw_size(event, 100); + } + else if(event_code == LV_EVENT_STYLE_CHANGED) { + size_t needle_count = lv_array_size(&scale->needles); + for(size_t i = 0; i < needle_count; ++i) { + lv_scale_needle_t * needle = lv_array_at(&scale->needles, i); + if(lv_obj_has_class(needle->obj, &lv_line_class)) { + lv_scale_set_line_needle_value(obj, needle->obj, needle->length, needle->value); + } + else { + lv_scale_set_image_needle_value(obj, needle->obj, needle->value); + } + } + } + else { + /* Nothing to do. Invalid event */ + } +} + +static void scale_draw_indicator(lv_obj_t * obj, lv_event_t * event) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + lv_layer_t * layer = lv_event_get_layer(event); + + if(scale->total_tick_count <= 1) return; + + lv_draw_label_dsc_t label_dsc; + lv_draw_label_dsc_init(&label_dsc); + label_dsc.base.layer = layer; + /* Formatting the labels with the configured style for LV_PART_INDICATOR */ + lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &label_dsc); + + + /* Major tick style */ + lv_draw_line_dsc_t major_tick_dsc; + lv_draw_line_dsc_init(&major_tick_dsc); + major_tick_dsc.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); + if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { + major_tick_dsc.raw_end = 0; + } + + /* Configure line draw descriptor for the minor tick drawing */ + lv_draw_line_dsc_t minor_tick_dsc; + lv_draw_line_dsc_init(&minor_tick_dsc); + minor_tick_dsc.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); + + /* Main line style */ + lv_draw_line_dsc_t main_line_dsc; + lv_draw_line_dsc_init(&main_line_dsc); + main_line_dsc.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &main_line_dsc); + + /* These 2 values need to be signed since they are being passed + * to `lv_map()` which expects signed integers. */ + const int32_t total_tick_count = scale->total_tick_count; + int32_t tick_idx = 0; + uint32_t major_tick_idx = 0U; + for(tick_idx = 0; tick_idx < total_tick_count; tick_idx++) { + /* A major tick is the one which has a label in it */ + bool is_major_tick = scale_is_major_tick(scale, tick_idx); + if(is_major_tick) major_tick_idx++; + + const int32_t tick_value = lv_map(tick_idx, 0, total_tick_count - 1, scale->range_min, scale->range_max); + + label_dsc.base.id1 = tick_idx; + label_dsc.base.id2 = tick_value; + label_dsc.base.layer = layer; + + /* Overwrite label and tick properties if tick value is within section range */ + lv_scale_section_t * section; + LV_LL_READ_BACK(&scale->section_ll, section) { + if(section->range_min <= tick_value && section->range_max >= tick_value) { + if(is_major_tick) { + scale_set_indicator_label_properties(obj, &label_dsc, section->indicator_style); + scale_set_line_properties(obj, &major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); + } + else { + scale_set_line_properties(obj, &minor_tick_dsc, section->items_style, LV_PART_ITEMS); + } + break; + } + else { + /* Tick is not in section, get the proper styles */ + lv_obj_init_draw_label_dsc(obj, LV_PART_INDICATOR, &label_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); + } + } + + /* The tick is represented by a line. We need two points to draw it */ + lv_point_t tick_point_a; + lv_point_t tick_point_b; + scale_get_tick_points(obj, tick_idx, is_major_tick, &tick_point_a, &tick_point_b); + + /* Setup a label if they're enabled and we're drawing a major tick */ + if(scale->label_enabled && is_major_tick) { + scale_draw_label(obj, event, &label_dsc, major_tick_idx, tick_value, &tick_point_b, tick_idx); + } + + if(is_major_tick) { + major_tick_dsc.p1 = lv_point_to_precise(&tick_point_a); + major_tick_dsc.p2 = lv_point_to_precise(&tick_point_b); + major_tick_dsc.base.id1 = tick_idx; + major_tick_dsc.base.id2 = tick_value; + lv_draw_line(layer, &major_tick_dsc); + } + else { + minor_tick_dsc.p1 = lv_point_to_precise(&tick_point_a); + minor_tick_dsc.p2 = lv_point_to_precise(&tick_point_b); + minor_tick_dsc.base.id1 = tick_idx; + minor_tick_dsc.base.id2 = tick_value; + lv_draw_line(layer, &minor_tick_dsc); + } + } +} + +static void scale_draw_label(lv_obj_t * obj, lv_event_t * event, lv_draw_label_dsc_t * label_dsc, + const uint32_t major_tick_idx, const int32_t tick_value, lv_point_t * tick_point_b, + const uint32_t tick_idx) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + lv_layer_t * layer = lv_event_get_layer(event); + + /* Label text setup */ + char text_buffer[LV_SCALE_LABEL_TXT_LEN] = {0}; + lv_area_t label_coords; + + /* Check if the custom text array has element for this major tick index */ + if(scale->txt_src) { + scale_build_custom_label_text(obj, label_dsc, major_tick_idx); + } + else { /* Add label with mapped values */ + lv_snprintf(text_buffer, sizeof(text_buffer), "%" LV_PRId32, tick_value); + label_dsc->text = text_buffer; + label_dsc->text_local = 1; + } + + int32_t translate_x = lv_obj_get_style_translate_x(obj, LV_PART_INDICATOR); + int32_t translate_y = lv_obj_get_style_translate_y(obj, LV_PART_INDICATOR); + int32_t label_rotation = lv_obj_get_style_transform_rotation(obj, LV_PART_INDICATOR); + int32_t translate_rotation = 0; + + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) + || (LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode || LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { + lv_point_t label_origin; + label_origin.x = tick_point_b->x + translate_x; + label_origin.y = tick_point_b->y + translate_y; + scale_get_label_coords(obj, label_dsc, &label_origin, &label_coords); + label_rotation = (label_rotation & LV_SCALE_ROTATION_ANGLE_MASK); + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { + translate_rotation = lv_obj_get_style_translate_radial(obj, LV_PART_INDICATOR); + uint32_t label_gap = lv_obj_get_style_pad_radial(obj, LV_PART_INDICATOR) + LV_SCALE_DEFAULT_LABEL_GAP; + + lv_area_t scale_area; + lv_obj_get_content_coords(obj, &scale_area); + + /* Find the center of the scale */ + lv_point_t center_point; + int32_t radius_edge = LV_MIN(lv_area_get_width(&scale_area) / 2, lv_area_get_height(&scale_area) / 2); + center_point.x = scale_area.x1 + radius_edge; + center_point.y = scale_area.y1 + radius_edge; + + const int32_t major_len = lv_obj_get_style_length(obj, LV_PART_INDICATOR); + + /* Also take into consideration the letter space of the style */ + int32_t angle_upscale = ((tick_idx * scale->angle_range) * 10U) / (scale->total_tick_count - 1U) + + (translate_rotation * 10); + angle_upscale += scale->rotation * 10; + + uint32_t radius_text = 0; + if(LV_SCALE_MODE_ROUND_INNER == scale->mode) { + radius_text = (radius_edge - major_len) - (label_gap + label_dsc->letter_space); + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode) { + radius_text = (radius_edge + major_len) + (label_gap + label_dsc->letter_space); + } + else { /* Nothing to do */ } + + lv_point_t point; + point.x = center_point.x + radius_text + translate_x; + point.y = center_point.y + translate_y; + int32_t label_rotation_temp = 0; + + if(label_rotation & LV_SCALE_LABEL_ROTATE_MATCH_TICKS) { + label_rotation_temp = (label_rotation & LV_SCALE_ROTATION_ANGLE_MASK) + angle_upscale; + + /* keep text upright if the user asked for it, otherwise it will be upside-down on half the dial */ + if(label_rotation & LV_SCALE_LABEL_ROTATE_KEEP_UPRIGHT) { + while(label_rotation_temp > 3600) { + label_rotation_temp -= 3600; + } + if(label_rotation_temp > 900 && label_rotation_temp < 2400) { + label_rotation_temp += 1800; + } + } + label_rotation = label_rotation_temp; + } + else { + label_rotation = label_rotation & LV_SCALE_ROTATION_ANGLE_MASK; + } + + lv_point_transform(&point, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false); + scale_get_label_coords(obj, label_dsc, &point, &label_coords); + } + /* Invalid mode */ + else { + return; + } + + if(label_rotation > 0) { + /*Draw the label to a new layer and draw the layer rotated*/ + lv_layer_t * layer_label = lv_draw_layer_create(layer, LV_COLOR_FORMAT_ARGB8888, &label_coords); + lv_draw_label(layer_label, label_dsc, &label_coords); + + lv_point_t pivot_point; + /* Set pivot point to the center of the label so it matches the scale curve */ + pivot_point.x = lv_area_get_width(&label_coords) / 2; + pivot_point.y = lv_area_get_height(&label_coords) / 2; + + lv_draw_image_dsc_t layer_draw_dsc; + lv_draw_image_dsc_init(&layer_draw_dsc); + layer_draw_dsc.src = layer_label; + layer_draw_dsc.rotation = label_rotation; + layer_draw_dsc.pivot = pivot_point; + lv_draw_layer(layer, &layer_draw_dsc, &label_coords); + } + else { + lv_draw_label(layer, label_dsc, &label_coords); + } + + if(label_dsc->text_local) { + /* clear the reference to the text buffer on the stack */ + label_dsc->text = NULL; + label_dsc->text_local = false; + } +} + +static void scale_calculate_main_compensation(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + + const uint32_t total_tick_count = scale->total_tick_count; + + if(total_tick_count <= 1) return; + /* Not supported in round modes */ + if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) return; + + /* Major tick style */ + lv_draw_line_dsc_t major_tick_dsc; + lv_draw_line_dsc_init(&major_tick_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); + + /* Configure line draw descriptor for the minor tick drawing */ + lv_draw_line_dsc_t minor_tick_dsc; + lv_draw_line_dsc_init(&minor_tick_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); + + uint32_t tick_idx = 0; + for(tick_idx = 0; tick_idx < total_tick_count; tick_idx++) { + + const bool is_major_tick = scale_is_major_tick(scale, tick_idx); + + const int32_t tick_value = lv_map(tick_idx, 0, total_tick_count - 1, scale->range_min, scale->range_max); + + /* Overwrite label and tick properties if tick value is within section range */ + lv_scale_section_t * section; + LV_LL_READ_BACK(&scale->section_ll, section) { + if(section->range_min <= tick_value && section->range_max >= tick_value) { + if(is_major_tick) { + scale_set_line_properties(obj, &major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); + } + else { + scale_set_line_properties(obj, &minor_tick_dsc, section->items_style, LV_PART_ITEMS); + } + break; + } + else { + /* Tick is not in section, get the proper styles */ + lv_obj_init_draw_line_dsc(obj, LV_PART_INDICATOR, &major_tick_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_ITEMS, &minor_tick_dsc); + } + } + + /* The tick is represented by a line. We need two points to draw it */ + lv_point_t tick_point_a; + lv_point_t tick_point_b; + scale_get_tick_points(obj, tick_idx, is_major_tick, &tick_point_a, &tick_point_b); + + /* Store initial and last tick widths to be used in the main line drawing */ + scale_store_main_line_tick_width_compensation(obj, tick_idx, is_major_tick, major_tick_dsc.width, minor_tick_dsc.width); + /* Store the first and last section tick vertical/horizontal position */ + scale_store_section_line_tick_width_compensation(obj, is_major_tick, &major_tick_dsc, &minor_tick_dsc, + tick_value, tick_idx, &tick_point_a); + } +} + +static void scale_draw_main(lv_obj_t * obj, lv_event_t * event) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + lv_layer_t * layer = lv_event_get_layer(event); + + if(scale->total_tick_count <= 1) return; + + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) + || (LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode || LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { + + /* Configure both line and label draw descriptors for the tick and label drawings */ + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + line_dsc.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &line_dsc); + + /* Get style properties so they can be used in the main line drawing */ + const int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + const int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + const int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) + border_width; + const int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + const int32_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; + + int32_t x_ofs = 0; + int32_t y_ofs = 0; + + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) { + x_ofs = obj->coords.x2 + (line_dsc.width / 2) - pad_right; + y_ofs = obj->coords.y1 + pad_top; + } + else if(LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + x_ofs = obj->coords.x1 + (line_dsc.width / 2) + pad_left; + y_ofs = obj->coords.y1 + pad_top; + } + if(LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) { + x_ofs = obj->coords.x1 + pad_right; + y_ofs = obj->coords.y1 + (line_dsc.width / 2) + pad_top; + } + else if(LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode) { + x_ofs = obj->coords.x1 + pad_left; + y_ofs = obj->coords.y2 + (line_dsc.width / 2) - pad_bottom; + } + else { /* Nothing to do */ } + + lv_point_t main_line_point_a; + lv_point_t main_line_point_b; + + /* Setup the tick points */ + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + main_line_point_a.x = x_ofs - 1; + main_line_point_a.y = y_ofs; + main_line_point_b.x = x_ofs - 1; + main_line_point_b.y = obj->coords.y2 - pad_bottom; + + /* Adjust main line with initial and last tick width */ + main_line_point_a.y -= scale->last_tick_width / 2; + main_line_point_b.y += scale->first_tick_width / 2; + } + else { + main_line_point_a.x = x_ofs; + main_line_point_a.y = y_ofs; + /* X of second point starts at the edge of the object minus the left pad */ + main_line_point_b.x = obj->coords.x2 - (pad_left); + main_line_point_b.y = y_ofs; + + /* Adjust main line with initial and last tick width */ + main_line_point_a.x -= scale->last_tick_width / 2; + main_line_point_b.x += scale->first_tick_width / 2; + } + + line_dsc.p1 = lv_point_to_precise(&main_line_point_a); + line_dsc.p2 = lv_point_to_precise(&main_line_point_b); + lv_draw_line(layer, &line_dsc); + + lv_scale_section_t * section; + LV_LL_READ_BACK(&scale->section_ll, section) { + lv_draw_line_dsc_t section_line_dsc; + lv_draw_line_dsc_init(§ion_line_dsc); + section_line_dsc.base.layer = layer; + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, §ion_line_dsc); + + /* Calculate the points of the section line */ + lv_point_t section_point_a; + lv_point_t section_point_b; + + const int32_t first_tick_width_halved = (int32_t)(section->first_tick_in_section_width / 2); + const int32_t last_tick_width_halved = (int32_t)(section->last_tick_in_section_width / 2); + + /* Calculate the position of the section based on the ticks (first and last) index */ + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + /* Calculate position of the first tick in the section */ + section_point_a.x = main_line_point_a.x; + section_point_a.y = section->first_tick_in_section.y + first_tick_width_halved; + + /* Calculate position of the last tick in the section */ + section_point_b.x = main_line_point_a.x; + section_point_b.y = section->last_tick_in_section.y - last_tick_width_halved; + } + else { + /* Calculate position of the first tick in the section */ + section_point_a.x = section->first_tick_in_section.x - first_tick_width_halved; + section_point_a.y = main_line_point_a.y; + + /* Calculate position of the last tick in the section */ + section_point_b.x = section->last_tick_in_section.x + last_tick_width_halved; + section_point_b.y = main_line_point_a.y; + } + + scale_set_line_properties(obj, §ion_line_dsc, section->main_style, LV_PART_MAIN); + + section_line_dsc.p1.x = section_point_a.x; + section_line_dsc.p1.y = section_point_a.y; + section_line_dsc.p2.x = section_point_b.x; + section_line_dsc.p2.y = section_point_b.y; + lv_draw_line(layer, §ion_line_dsc); + } + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { + /* Configure arc draw descriptors for the main part */ + lv_draw_arc_dsc_t arc_dsc; + lv_draw_arc_dsc_init(&arc_dsc); + arc_dsc.base.layer = layer; + lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &arc_dsc); + + lv_point_t arc_center; + int32_t arc_radius; + scale_get_center(obj, &arc_center, &arc_radius); + + /* TODO: Add compensation for the width of the first and last tick over the arc */ + const int32_t start_angle = lv_map(scale->range_min, scale->range_min, scale->range_max, scale->rotation, + scale->rotation + scale->angle_range); + const int32_t end_angle = lv_map(scale->range_max, scale->range_min, scale->range_max, scale->rotation, + scale->rotation + scale->angle_range); + + arc_dsc.center = arc_center; + arc_dsc.radius = arc_radius; + arc_dsc.start_angle = start_angle; + arc_dsc.end_angle = end_angle; + + lv_draw_arc(layer, &arc_dsc); + + lv_scale_section_t * section; + LV_LL_READ_BACK(&scale->section_ll, section) { + lv_draw_arc_dsc_t main_arc_section_dsc; + lv_draw_arc_dsc_init(&main_arc_section_dsc); + main_arc_section_dsc.base.layer = layer; + lv_obj_init_draw_arc_dsc(obj, LV_PART_MAIN, &main_arc_section_dsc); + + lv_point_t section_arc_center; + int32_t section_arc_radius; + scale_get_center(obj, §ion_arc_center, §ion_arc_radius); + + /* TODO: Add compensation for the width of the first and last tick over the arc */ + const int32_t section_start_angle = lv_map(section->range_min, scale->range_min, scale->range_max, scale->rotation, + scale->rotation + scale->angle_range); + const int32_t section_end_angle = lv_map(section->range_max, scale->range_min, scale->range_max, scale->rotation, + scale->rotation + scale->angle_range); + + scale_set_arc_properties(obj, &main_arc_section_dsc, section->main_style); + + main_arc_section_dsc.center = section_arc_center; + main_arc_section_dsc.radius = section_arc_radius; + main_arc_section_dsc.start_angle = section_start_angle; + main_arc_section_dsc.end_angle = section_end_angle; + + lv_draw_arc(layer, &main_arc_section_dsc); + } + } + else { /* Nothing to do */ } +} + +/** + * Get center point and radius of scale arc + * @param obj pointer to a scale object + * @param center pointer to center + * @param arc_r pointer to arc radius + */ +static void scale_get_center(const lv_obj_t * obj, lv_point_t * center, int32_t * arc_r) +{ + int32_t left_bg = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t right_bg = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t top_bg = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bottom_bg = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + + int32_t r = (LV_MIN(lv_obj_get_width(obj) - left_bg - right_bg, lv_obj_get_height(obj) - top_bg - bottom_bg)) / 2; + + center->x = obj->coords.x1 + r + left_bg; + center->y = obj->coords.y1 + r + top_bg; + + if(arc_r) *arc_r = r; +} + +/** + * Get points for ticks + * + * In order to draw ticks we need two points, this interface returns both points for all scale modes. + * + * @param obj pointer to a scale object + * @param tick_idx index of the current tick + * @param is_major_tick true if tick_idx is a major tick + * @param tick_point_a pointer to point 'a' of the tick + * @param tick_point_b pointer to point 'b' of the tick + */ +static void scale_get_tick_points(lv_obj_t * obj, const uint32_t tick_idx, bool is_major_tick, + lv_point_t * tick_point_a, lv_point_t * tick_point_b) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + + /* Main line style */ + lv_draw_line_dsc_t main_line_dsc; + lv_draw_line_dsc_init(&main_line_dsc); + lv_obj_init_draw_line_dsc(obj, LV_PART_MAIN, &main_line_dsc); + + int32_t minor_len = 0; + int32_t major_len = 0; + int32_t radial_offset = 0; + + if(is_major_tick) { + major_len = lv_obj_get_style_length(obj, LV_PART_INDICATOR); + radial_offset = lv_obj_get_style_radial_offset(obj, LV_PART_INDICATOR); + } + else { + minor_len = lv_obj_get_style_length(obj, LV_PART_ITEMS); + radial_offset = lv_obj_get_style_radial_offset(obj, LV_PART_ITEMS); + } + + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) + || (LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode || LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { + + /* Get style properties so they can be used in the tick and label drawing */ + const int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + const int32_t pad_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width; + const int32_t pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN) + border_width; + const int32_t pad_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width; + const int32_t pad_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width; + const int32_t tick_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const int32_t tick_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const int32_t tick_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const int32_t tick_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + + int32_t x_ofs = 0; + int32_t y_ofs = 0; + + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) { + x_ofs = obj->coords.x2 + (main_line_dsc.width / 2) - pad_right; + y_ofs = obj->coords.y1 + (pad_top + tick_pad_top); + } + else if(LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + x_ofs = obj->coords.x1 + (main_line_dsc.width / 2) + pad_left; + y_ofs = obj->coords.y1 + (pad_top + tick_pad_top); + } + else if(LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) { + x_ofs = obj->coords.x1 + (pad_right + tick_pad_right); + y_ofs = obj->coords.y1 + (main_line_dsc.width / 2) + pad_top; + } + /* LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode */ + else { + x_ofs = obj->coords.x1 + (pad_left + tick_pad_left); + y_ofs = obj->coords.y2 + (main_line_dsc.width / 2) - pad_bottom; + } + + /* Adjust length when tick will be drawn on horizontal top or vertical right scales */ + if((LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { + if(is_major_tick) { + major_len *= -1; + } + else { + minor_len *= -1; + } + } + else { /* Nothing to do */ } + + const int32_t tick_length = is_major_tick ? major_len : minor_len; + /* NOTE + * Minus 1 because tick count starts at 0 + * TODO + * What if total_tick_count is 1? This will lead to an division by 0 further down */ + const uint32_t tmp_tick_count = scale->total_tick_count - 1U; + + /* Calculate the position of the tick points based on the mode and tick index */ + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + /* Vertical position starts at y2 of the scale main line, we start at y2 because the ticks are drawn from bottom to top */ + int32_t vertical_position = obj->coords.y2 - (pad_bottom + tick_pad_bottom); + + /* Position the last tick */ + if(tmp_tick_count == tick_idx) { + vertical_position = y_ofs; + } + /* Otherwise adjust the tick position depending of its index and number of ticks on the scale */ + else if(0 != tick_idx) { + const int32_t scale_total_height = lv_obj_get_height(obj) - (pad_top + pad_bottom + tick_pad_top + tick_pad_bottom); + const int32_t offset = ((int32_t) tick_idx * (int32_t) scale_total_height) / (int32_t)(tmp_tick_count); + vertical_position -= offset; + } + else { /* Nothing to do */ } + + tick_point_a->x = x_ofs - 1; /* Move extra pixel out of scale boundary */ + tick_point_a->y = vertical_position; + tick_point_b->x = tick_point_a->x - tick_length; + tick_point_b->y = vertical_position; + } + else { + /* Horizontal position starts at x1 of the scale main line */ + int32_t horizontal_position = x_ofs; + + /* Position the last tick */ + if(tmp_tick_count == tick_idx) { + horizontal_position = obj->coords.x2 - (pad_left + tick_pad_left); + } + /* Otherwise adjust the tick position depending of its index and number of ticks on the scale */ + else if(0U != tick_idx) { + const int32_t scale_total_width = lv_obj_get_width(obj) - (pad_right + pad_left + tick_pad_right + tick_pad_left); + const int32_t offset = ((int32_t) tick_idx * (int32_t) scale_total_width) / (int32_t)(tmp_tick_count); + horizontal_position += offset; + } + else { /* Nothing to do */ } + + tick_point_a->x = horizontal_position; + tick_point_a->y = y_ofs; + tick_point_b->x = horizontal_position; + tick_point_b->y = tick_point_a->y + tick_length; + } + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { + lv_area_t scale_area; + lv_obj_get_content_coords(obj, &scale_area); + + /* Find the center of the scale */ + lv_point_t center_point; + const int32_t radius_edge = LV_MIN(lv_area_get_width(&scale_area) / 2, lv_area_get_height(&scale_area) / 2); + center_point.x = scale_area.x1 + radius_edge; + center_point.y = scale_area.y1 + radius_edge; + + int32_t angle_upscale = (int32_t)((tick_idx * scale->angle_range) * 10U) / (scale->total_tick_count - 1U); + angle_upscale += scale->rotation * 10; + + /* Draw a little bit longer lines to be sure the mask will clip them correctly + * and to get a better precision. Adding the main line width to the calculation so we don't have gaps + * between the arc and the ticks */ + int32_t point_closer_to_arc = 0; + int32_t adjusted_radio_with_tick_len = 0; + if(LV_SCALE_MODE_ROUND_INNER == scale->mode) { + point_closer_to_arc = radius_edge - main_line_dsc.width; + adjusted_radio_with_tick_len = point_closer_to_arc - (is_major_tick ? major_len : minor_len); + } + /* LV_SCALE_MODE_ROUND_OUTER == scale->mode */ + else { + point_closer_to_arc = radius_edge - main_line_dsc.width; + adjusted_radio_with_tick_len = point_closer_to_arc + (is_major_tick ? major_len : minor_len); + } + + tick_point_a->x = center_point.x + point_closer_to_arc + radial_offset; + tick_point_a->y = center_point.y; + lv_point_transform(tick_point_a, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false); + + tick_point_b->x = center_point.x + adjusted_radio_with_tick_len + radial_offset; + tick_point_b->y = center_point.y; + lv_point_transform(tick_point_b, angle_upscale, LV_SCALE_NONE, LV_SCALE_NONE, ¢er_point, false); + } + else { /* Nothing to do */ } +} + +/** + * Get coordinates for label + * + * @param obj pointer to a scale object + * @param label_dsc pointer to label descriptor + * @param tick_point pointer to reference tick + * @param label_coords pointer to label coordinates output + */ +static void scale_get_label_coords(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, lv_point_t * tick_point, + lv_area_t * label_coords) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + + lv_text_attributes_t attributes = {0}; + attributes.letter_space = label_dsc->letter_space; + attributes.line_space = label_dsc->line_space; + attributes.max_width = LV_COORD_MAX; + attributes.text_flags = LV_TEXT_FLAG_NONE; + + /* Reserve appropriate size for the tick label */ + lv_point_t label_size; + + if(label_dsc->text != NULL) { + lv_text_get_size_attributes(&label_size, label_dsc->text, label_dsc->font, &attributes); + } + else { + label_size.x = 0; + label_size.y = 0; + } + + /* Set the label draw area at some distance of the major tick */ + if((LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) || (LV_SCALE_MODE_HORIZONTAL_TOP == scale->mode)) { + label_coords->x1 = tick_point->x - (label_size.x / 2); + label_coords->x2 = tick_point->x + (label_size.x / 2); + + if(LV_SCALE_MODE_HORIZONTAL_BOTTOM == scale->mode) { + label_coords->y1 = tick_point->y + lv_obj_get_style_pad_bottom(obj, LV_PART_INDICATOR); + label_coords->y2 = label_coords->y1 + label_size.y; + } + else { + label_coords->y2 = tick_point->y - lv_obj_get_style_pad_top(obj, LV_PART_INDICATOR); + label_coords->y1 = label_coords->y2 - label_size.y; + } + } + else if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { + label_coords->y1 = tick_point->y - (label_size.y / 2); + label_coords->y2 = tick_point->y + (label_size.y / 2); + + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) { + label_coords->x1 = tick_point->x - label_size.x - lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + label_coords->x2 = tick_point->x - lv_obj_get_style_pad_left(obj, LV_PART_INDICATOR); + } + else { + label_coords->x1 = tick_point->x + lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + label_coords->x2 = tick_point->x + label_size.x + lv_obj_get_style_pad_right(obj, LV_PART_INDICATOR); + } + } + else if(LV_SCALE_MODE_ROUND_OUTER == scale->mode || LV_SCALE_MODE_ROUND_INNER == scale->mode) { + label_coords->x1 = tick_point->x - (label_size.x / 2); + label_coords->y1 = tick_point->y - (label_size.y / 2); + label_coords->x2 = label_coords->x1 + label_size.x; + label_coords->y2 = label_coords->y1 + label_size.y; + } + else { /* Nothing to do */ } +} + +/** + * Set line properties + * + * Checks if the line has a custom section configuration or not and sets the properties accordingly. + * + * @param obj pointer to a scale object + * @param line_dsc pointer to line descriptor + * @param items_section_style pointer to indicator section style + * @param part line part, example: LV_PART_INDICATOR, LV_PART_ITEMS, LV_PART_MAIN + */ +static void scale_set_line_properties(lv_obj_t * obj, lv_draw_line_dsc_t * line_dsc, const lv_style_t * section_style, + lv_part_t part) +{ + if(section_style) { + lv_style_value_t value; + lv_style_res_t res; + + /* Line width */ + res = lv_style_get_prop(section_style, LV_STYLE_LINE_WIDTH, &value); + if(res == LV_STYLE_RES_FOUND) { + line_dsc->width = (int32_t)value.num; + } + else { + line_dsc->width = lv_obj_get_style_line_width(obj, part); + } + + /* Line color */ + res = lv_style_get_prop(section_style, LV_STYLE_LINE_COLOR, &value); + if(res == LV_STYLE_RES_FOUND) { + line_dsc->color = value.color; + } + else { + line_dsc->color = lv_obj_get_style_line_color(obj, part); + } + + /* Line opa */ + res = lv_style_get_prop(section_style, LV_STYLE_LINE_OPA, &value); + if(res == LV_STYLE_RES_FOUND) { + line_dsc->opa = (lv_opa_t)value.num; + } + else { + line_dsc->opa = lv_obj_get_style_line_opa(obj, part); + } + } + else { + line_dsc->color = lv_obj_get_style_line_color(obj, part); + line_dsc->opa = lv_obj_get_style_line_opa(obj, part); + line_dsc->width = lv_obj_get_style_line_width(obj, part); + } +} + +/** + * Set arc properties + * + * Checks if the arc has a custom section configuration or not and sets the properties accordingly. + * + * @param obj pointer to a scale object + * @param arc_dsc pointer to arc descriptor + * @param items_section_style pointer to indicator section style + */ +static void scale_set_arc_properties(lv_obj_t * obj, lv_draw_arc_dsc_t * arc_dsc, const lv_style_t * section_style) +{ + if(section_style) { + lv_style_value_t value; + lv_style_res_t res; + + /* arc width */ + res = lv_style_get_prop(section_style, LV_STYLE_ARC_WIDTH, &value); + if(res == LV_STYLE_RES_FOUND) { + arc_dsc->width = (int32_t)value.num; + } + else { + arc_dsc->width = lv_obj_get_style_arc_width(obj, LV_PART_MAIN); + } + + /* arc color */ + res = lv_style_get_prop(section_style, LV_STYLE_ARC_COLOR, &value); + if(res == LV_STYLE_RES_FOUND) { + arc_dsc->color = value.color; + } + else { + arc_dsc->color = lv_obj_get_style_arc_color(obj, LV_PART_MAIN); + } + + /* arc opa */ + res = lv_style_get_prop(section_style, LV_STYLE_ARC_OPA, &value); + if(res == LV_STYLE_RES_FOUND) { + arc_dsc->opa = (lv_opa_t)value.num; + } + else { + arc_dsc->opa = lv_obj_get_style_arc_opa(obj, LV_PART_MAIN); + } + + /* arc rounded */ + res = lv_style_get_prop(section_style, LV_STYLE_ARC_ROUNDED, &value); + if(res == LV_STYLE_RES_FOUND) { + arc_dsc->rounded = (uint8_t)value.num; + } + else { + arc_dsc->rounded = lv_obj_get_style_arc_rounded(obj, LV_PART_MAIN); + } + + /* arc image src */ + res = lv_style_get_prop(section_style, LV_STYLE_ARC_IMAGE_SRC, &value); + if(res == LV_STYLE_RES_FOUND) { + arc_dsc->img_src = (const void *)value.ptr; + } + else { + arc_dsc->img_src = lv_obj_get_style_arc_image_src(obj, LV_PART_MAIN); + } + } + else { + arc_dsc->color = lv_obj_get_style_arc_color(obj, LV_PART_MAIN); + arc_dsc->opa = lv_obj_get_style_arc_opa(obj, LV_PART_MAIN); + arc_dsc->width = lv_obj_get_style_arc_width(obj, LV_PART_MAIN); + arc_dsc->rounded = lv_obj_get_style_arc_rounded(obj, LV_PART_MAIN); + arc_dsc->img_src = lv_obj_get_style_arc_image_src(obj, LV_PART_MAIN); + } +} + +/** + * Set indicator label properties + * + * Checks if the indicator has a custom section configuration or not and sets the properties accordingly. + * + * @param obj pointer to a scale object + * @param label_dsc pointer to label descriptor + * @param items_section_style pointer to indicator section style + */ +static void scale_set_indicator_label_properties(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, + const lv_style_t * indicator_section_style) +{ + if(indicator_section_style) { + lv_style_value_t value; + lv_style_res_t res; + + /* Text color */ + res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_COLOR, &value); + if(res == LV_STYLE_RES_FOUND) { + label_dsc->color = value.color; + } + else { + label_dsc->color = lv_obj_get_style_text_color(obj, LV_PART_INDICATOR); + } + + /* Text opa */ + res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_OPA, &value); + if(res == LV_STYLE_RES_FOUND) { + label_dsc->opa = (lv_opa_t)value.num; + } + else { + label_dsc->opa = lv_obj_get_style_text_opa(obj, LV_PART_INDICATOR); + } + + /* Text letter space */ + res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_LETTER_SPACE, &value); + if(res == LV_STYLE_RES_FOUND) { + label_dsc->letter_space = (int32_t)value.num; + } + else { + label_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_INDICATOR); + } + + /* Text font */ + res = lv_style_get_prop(indicator_section_style, LV_STYLE_TEXT_FONT, &value); + if(res == LV_STYLE_RES_FOUND) { + label_dsc->font = (const lv_font_t *)value.ptr; + } + else { + label_dsc->font = lv_obj_get_style_text_font(obj, LV_PART_INDICATOR); + } + } + else { + /* If label is not within a range then get the indicator style */ + label_dsc->color = lv_obj_get_style_text_color(obj, LV_PART_INDICATOR); + label_dsc->opa = lv_obj_get_style_text_opa(obj, LV_PART_INDICATOR); + label_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_INDICATOR); + label_dsc->font = lv_obj_get_style_text_font(obj, LV_PART_INDICATOR); + } +} + +static void scale_find_section_tick_idx(lv_obj_t * obj) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + + const int32_t min_out = scale->range_min; + const int32_t max_out = scale->range_max; + const uint32_t total_tick_count = scale->total_tick_count; + + /* Section handling */ + uint32_t tick_idx = 0; + for(tick_idx = 0; tick_idx < total_tick_count; tick_idx++) { + bool is_major_tick = scale_is_major_tick(scale, tick_idx); + + const int32_t tick_value = lv_map(tick_idx, 0, total_tick_count - 1, min_out, max_out); + + lv_scale_section_t * section; + LV_LL_READ_BACK(&scale->section_ll, section) { + if(section->range_min <= tick_value && section->range_max >= tick_value) { + if(LV_SCALE_TICK_IDX_DEFAULT_ID == section->first_tick_idx_in_section) { + section->first_tick_idx_in_section = tick_idx; + section->first_tick_idx_is_major = is_major_tick; + } + if(LV_SCALE_TICK_IDX_DEFAULT_ID == section->last_tick_idx_in_section) { + /* This gets it initialized when the beginning and ending range values are the same. */ + section->last_tick_idx_in_section = tick_idx; + section->last_tick_idx_is_major = is_major_tick; + } + /* Now keep setting the `last_tick_idx_...` values as we + * proceed through the `for` loop so it is left with the + * actual last-tick value that is within the Scale's range. */ + else if(section->first_tick_idx_in_section != tick_idx) { + section->last_tick_idx_in_section = tick_idx; + section->last_tick_idx_is_major = is_major_tick; + } + } + else { + /* `tick_value` is outside Section's range. + * Nothing to do. */ + } + } + } +} + +/** + * Stores the width of the initial and last tick of the main line + * + * This width is used to compensate the main line drawing taking into consideration the widths of both ticks + * + * @param obj pointer to a scale object + * @param tick_idx index of the current tick + * @param is_major_tick true if tick_idx is a major tick + * @param major_tick_width width of the major tick + * @param minor_tick_width width of the minor tick + */ +static void scale_store_main_line_tick_width_compensation(lv_obj_t * obj, const uint32_t tick_idx, + const bool is_major_tick, const int32_t major_tick_width, const int32_t minor_tick_width) +{ + lv_scale_t * scale = (lv_scale_t *)obj; + const bool is_first_tick = 0U == tick_idx; + const bool is_last_tick = scale->total_tick_count == tick_idx; + const int32_t tick_width = is_major_tick ? major_tick_width : minor_tick_width; + + /* Exit early if tick_idx is neither the first nor last tick on the main line */ + if(((!is_last_tick) && (!is_first_tick)) + /* Exit early if scale mode is round. It doesn't support main line compensation */ + || ((LV_SCALE_MODE_ROUND_INNER == scale->mode) || (LV_SCALE_MODE_ROUND_OUTER == scale->mode))) { + return; + } + + if(is_last_tick) { + /* Mode is vertical */ + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { + scale->last_tick_width = tick_width; + } + /* Mode is horizontal */ + else { + scale->first_tick_width = tick_width; + } + } + /* is_first_tick */ + else { + /* Mode is vertical */ + if((LV_SCALE_MODE_VERTICAL_LEFT == scale->mode) || (LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode)) { + scale->first_tick_width = tick_width; + } + /* Mode is horizontal */ + else { + scale->last_tick_width = tick_width; + } + } +} + +/** + * Sets the text of the tick label descriptor when using custom labels + * + * Sets the text pointer when valid custom label is available, otherwise set it to NULL. + * + * @param obj pointer to a scale object + * @param label_dsc pointer to the label descriptor + * @param major_tick_idx index of the current major tick + */ +static void scale_build_custom_label_text(lv_obj_t * obj, lv_draw_label_dsc_t * label_dsc, + const uint16_t major_tick_idx) +{ + lv_scale_t * scale = (lv_scale_t *) obj; + + /* Check if the scale has valid custom labels available, + * this avoids reading past txt_src array when the scale requires more tick labels than available */ + if(major_tick_idx <= scale->custom_label_cnt) { + if(scale->txt_src[major_tick_idx - 1U]) { + label_dsc->text = scale->txt_src[major_tick_idx - 1U]; + label_dsc->text_local = 0; + } + else { + label_dsc->text = NULL; + } + } + else { + label_dsc->text = NULL; + } +} + +/** + * Stores tick width compensation information for main line sections + * + * @param obj pointer to a scale object + * @param is_major_tick Indicates if tick is major or not + * @param major_tick_dsc pointer to the major_tick_dsc + * @param minor_tick_dsc pointer to the minor_tick_dsc + * @param tick_value Current tick value, used to know if tick_idx belongs to a section or not + * @param tick_idx Current tick index + * @param tick_point_a Pointer to tick point a + */ +static void scale_store_section_line_tick_width_compensation(lv_obj_t * obj, const bool is_major_tick, + lv_draw_line_dsc_t * major_tick_dsc, lv_draw_line_dsc_t * minor_tick_dsc, + const int32_t tick_value, const uint8_t tick_idx, lv_point_t * tick_point_a) +{ + lv_scale_t * scale = (lv_scale_t *) obj; + lv_scale_section_t * section; + + LV_LL_READ_BACK(&scale->section_ll, section) { + if(section->range_min <= tick_value && section->range_max >= tick_value) { + if(is_major_tick) { + scale_set_line_properties(obj, major_tick_dsc, section->indicator_style, LV_PART_INDICATOR); + } + else { + scale_set_line_properties(obj, minor_tick_dsc, section->items_style, LV_PART_ITEMS); + } + } + + int32_t tmp_width = 0; + + if(tick_idx == section->first_tick_idx_in_section) { + if(section->first_tick_idx_is_major) { + tmp_width = major_tick_dsc->width; + } + else { + tmp_width = minor_tick_dsc->width; + } + + section->first_tick_in_section = *tick_point_a; + /* Add 1px as adjustment if tmp_width is odd */ + if(tmp_width & 0x01U) { + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + tmp_width += 1; + } + else { + tmp_width -= 1; + } + } + section->first_tick_in_section_width = tmp_width; + } + + /* This can also apply when + * (tick_idx == section->first_tick_idx_in_section) when the + * beginning and ending values of the range are the same. */ + if(tick_idx == section->last_tick_idx_in_section) { + if(section->last_tick_idx_is_major) { + tmp_width = major_tick_dsc->width; + } + else { + tmp_width = minor_tick_dsc->width; + } + + section->last_tick_in_section = *tick_point_a; + /* Add 1px as adjustment if tmp_width is odd */ + if(tmp_width & 0x01U) { + if(LV_SCALE_MODE_VERTICAL_LEFT == scale->mode || LV_SCALE_MODE_VERTICAL_RIGHT == scale->mode) { + tmp_width -= 1; + } + else { + tmp_width += 1; + } + } + section->last_tick_in_section_width = tmp_width; + } + else { /* Nothing to do */ } + } +} + +static void scale_free_line_needle_points_cb(lv_event_t * e) +{ + lv_point_precise_t * needle_line_points = lv_event_get_user_data(e); + lv_free(needle_line_points); +} + +static bool scale_is_major_tick(lv_scale_t * scale, uint32_t tick_idx) +{ + return scale->major_tick_every != 0 && tick_idx % scale->major_tick_every == 0; +} + +static lv_result_t update_needle(lv_scale_t * scale, lv_obj_t * needle, int32_t length, int32_t value) +{ + /* First try to find the needle in the haystack (scale's needle list) */ + size_t needle_count = lv_array_size(&scale->needles); + for(size_t i = 0; i < needle_count; ++i) { + lv_scale_needle_t * scale_needle = lv_array_at(&scale->needles, i); + if(scale_needle->obj == needle) { + scale_needle->value = value; + scale_needle->length = length; + return LV_RESULT_OK; + } + } + + /* Needle is not yet part of the haystack */ + lv_scale_needle_t scale_needle = {.obj = needle, .length = length, .value = value}; + lv_result_t res = lv_array_push_back(&scale->needles, &scale_needle); + if(res != LV_RESULT_OK) { + LV_LOG_WARN("Failed to attach needle to scale - not enough memory"); + return LV_RESULT_INVALID; + } + + lv_obj_add_event_cb(needle, needle_deleted_cb, LV_EVENT_DELETE, scale); + return LV_RESULT_OK; +} + +static void needle_deleted_cb(lv_event_t * e) +{ + lv_scale_t * scale = lv_event_get_user_data(e); + lv_obj_t * needle = lv_event_get_target_obj(e); + + size_t needle_count = lv_array_size(&scale->needles); + for(size_t i = 0; i < needle_count; ++i) { + lv_scale_needle_t * scale_needle = lv_array_at(&scale->needles, i); + if(scale_needle->obj == needle) { + lv_array_remove(&scale->needles, i); + return; + } + } +} + +#if LV_USE_OBSERVER + +static void scale_section_min_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_scale_section_t * section = observer->user_data; + lv_scale_set_section_min_value(observer->target, section, subject->value.num); +} + +static void scale_section_max_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_scale_section_t * section = observer->user_data; + lv_scale_set_section_max_value(observer->target, section, subject->value.num); +} + +#endif /*LV_USE_OBSERVER*/ + + +#endif diff --git a/inc/lvgl/src/widgets/scale/lv_scale.h b/inc/lvgl/src/widgets/scale/lv_scale.h new file mode 100644 index 0000000..8b1163e --- /dev/null +++ b/inc/lvgl/src/widgets/scale/lv_scale.h @@ -0,0 +1,398 @@ +/** + * @file lv_scale.h + * + */ + +#ifndef LV_SCALE_H +#define LV_SCALE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_SCALE != 0 + +#include "../../core/lv_obj.h" +#include "../line/lv_line.h" +#include "../image/lv_image.h" +#include "../../core/lv_observer.h" + +/********************* + * DEFINES + *********************/ + +/**Default value of total minor ticks. */ +#define LV_SCALE_TOTAL_TICK_COUNT_DEFAULT (11U) +LV_EXPORT_CONST_INT(LV_SCALE_TOTAL_TICK_COUNT_DEFAULT); + +/**Default value of major tick every nth ticks. */ +#define LV_SCALE_MAJOR_TICK_EVERY_DEFAULT (5U) +LV_EXPORT_CONST_INT(LV_SCALE_MAJOR_TICK_EVERY_DEFAULT); + +/**Default value of scale label enabled. */ +#define LV_SCALE_LABEL_ENABLED_DEFAULT (1U) +LV_EXPORT_CONST_INT(LV_SCALE_LABEL_ENABLED_DEFAULT); + +/********************** + * TYPEDEFS + **********************/ + +/** + * Scale mode + */ +typedef enum { + LV_SCALE_MODE_HORIZONTAL_TOP = 0x00U, + LV_SCALE_MODE_HORIZONTAL_BOTTOM = 0x01U, + LV_SCALE_MODE_VERTICAL_LEFT = 0x02U, + LV_SCALE_MODE_VERTICAL_RIGHT = 0x04U, + LV_SCALE_MODE_ROUND_INNER = 0x08U, + LV_SCALE_MODE_ROUND_OUTER = 0x10U, + LV_SCALE_MODE_LAST +} lv_scale_mode_t; + +#define LV_SCALE_LABEL_ROTATE_MATCH_TICKS 0x100000 +LV_EXPORT_CONST_INT(LV_SCALE_LABEL_ROTATE_MATCH_TICKS); + +#define LV_SCALE_LABEL_ROTATE_KEEP_UPRIGHT 0x80000 +LV_EXPORT_CONST_INT(LV_SCALE_LABEL_ROTATE_KEEP_UPRIGHT); + +#define LV_SCALE_ROTATION_ANGLE_MASK 0x7FFFF +LV_EXPORT_CONST_INT(LV_SCALE_ROTATION_ANGLE_MASK); + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_scale_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_scale_id_t { + LV_PROPERTY_ID(SCALE, MODE, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(SCALE, TOTAL_TICK_COUNT, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(SCALE, MAJOR_TICK_EVERY, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(SCALE, LABEL_SHOW, LV_PROPERTY_TYPE_BOOL, 3), + LV_PROPERTY_ID(SCALE, ANGLE_RANGE, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_ID(SCALE, ROTATION, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(SCALE, RANGE_MIN_VALUE, LV_PROPERTY_TYPE_INT, 6), + LV_PROPERTY_ID(SCALE, RANGE_MAX_VALUE, LV_PROPERTY_TYPE_INT, 7), + LV_PROPERTY_SCALE_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create an scale object + * @param parent pointer to an object, it will be the parent of the new scale + * @return pointer to created Scale Widget + */ +lv_obj_t * lv_scale_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/*===================== + * Setter functions + *====================*/ + +/** + * Set scale mode. See lv_scale_mode_t. + * @param obj pointer to Scale Widget + * @param mode the new scale mode + */ +void lv_scale_set_mode(lv_obj_t * obj, lv_scale_mode_t mode); + +/** + * Set scale total tick count (including minor and major ticks). + * @param obj pointer to Scale Widget + * @param total_tick_count New total tick count + */ +void lv_scale_set_total_tick_count(lv_obj_t * obj, uint32_t total_tick_count); + +/** + * Sets how often major ticks are drawn. + * @param obj pointer to Scale Widget + * @param major_tick_every the new count for major tick drawing + */ +void lv_scale_set_major_tick_every(lv_obj_t * obj, uint32_t major_tick_every); + +/** + * Sets label visibility. + * @param obj pointer to Scale Widget + * @param show_label true/false to enable tick label + */ +void lv_scale_set_label_show(lv_obj_t * obj, bool show_label); + +/** + * Set minimum and maximum values on Scale. + * @param obj pointer to Scale Widget + * @param min minimum value of Scale + * @param max maximum value of Scale + */ +void lv_scale_set_range(lv_obj_t * obj, int32_t min, int32_t max); + +/** + * Set minimum values on Scale. + * @param obj pointer to Scale Widget + * @param min minimum value of Scale + */ +void lv_scale_set_min_value(lv_obj_t * obj, int32_t min); + +/** + * Set maximum values on Scale. + * @param obj pointer to Scale Widget + * @param min minimum value of Scale + */ +void lv_scale_set_max_value(lv_obj_t * obj, int32_t max); + +/** + * Set angle between the low end and the high end of the Scale. + * (Applies only to round Scales.) + * @param obj pointer to Scale Widget + * @param max_angle angle in degrees from Scale minimum where top end of Scale will be drawn + */ +void lv_scale_set_angle_range(lv_obj_t * obj, uint32_t angle_range); + +/** + * Set angular offset from the 3-o'clock position of the low end of the Scale. + * (Applies only to round Scales.) + * @param obj pointer to Scale Widget + * @param rotation clockwise angular offset (in degrees) from the 3-o'clock position + * of the low end of the scale; negative and >360 values are first normalized + * to range [0..360]. + * Examples: + * - 0 = 3 o'clock (right side) + * - 30 = 4 o'clock + * - 60 = 5 o'clock + * - 90 = 6 o'clock + * - 135 = midway between 7 and 8 o'clock (default) + * - 180 = 9 o'clock + * - 270 = 12 o'clock + * - 300 = 1 o'clock + * - 330 = 2 o'clock + * - -30 = 2 o'clock + * - 390 = 4 o'clock + */ +void lv_scale_set_rotation(lv_obj_t * obj, int32_t rotation); + +/** + * Point line needle to specified value. + * @param obj pointer to Scale Widget + * @param needle_line needle_line of the Scale. The line points will be allocated and + * managed by the Scale unless the line point array was previously set + * using `lv_line_set_points_mutable`. + * @param needle_length length of the needle + * - needle_length>0: needle_length=needle_length; + * - needle_length<0: needle_length=radius-|needle_length|; + * @param value Scale value needle will point to + */ +void lv_scale_set_line_needle_value(lv_obj_t * obj, lv_obj_t * needle_line, int32_t needle_length, + int32_t value); + +/** + * Point image needle to specified value; + image must point to the right. E.g. -O------> + * @param obj pointer to Scale Widget + * @param needle_img pointer to needle's Image + * @param value Scale value needle will point to + */ +void lv_scale_set_image_needle_value(lv_obj_t * obj, lv_obj_t * needle_img, int32_t value); + +/** + * Set custom text source for major ticks labels. + * @param obj pointer to Scale Widget + * @param txt_src pointer to an array of strings which will be display at major ticks; + * last element must be a NULL pointer. + */ +void lv_scale_set_text_src(lv_obj_t * obj, const char * txt_src[]); + +/** + * Draw Scale after all its children are drawn. + * @param obj pointer to Scale Widget + * @param en true: enable post draw + */ +void lv_scale_set_post_draw(lv_obj_t * obj, bool en); + +/** + * Draw Scale ticks on top of all other parts. + * @param obj pointer to Scale Widget + * @param en true: enable draw ticks on top of all parts + */ +void lv_scale_set_draw_ticks_on_top(lv_obj_t * obj, bool en); + +/** + * Add a Section to specified Scale. Section will not be drawn until + * a valid range is set for it using `lv_scale_set_section_range()`. + * @param obj pointer to Scale Widget + * @return pointer to new Section + */ +lv_scale_section_t * lv_scale_add_section(lv_obj_t * obj); + +/** + * DEPRECATED, use lv_scale_set_section_range instead. + * Set range for specified Scale Section + * @param section pointer to Section + * @param range_min Section new minimum value + * @param range_max Section new maximum value + */ +void lv_scale_section_set_range(lv_scale_section_t * section, int32_t min, int32_t max); + +/** + * Set the range of a scale section + * @param scale pointer to scale + * @param section pointer to section + * @param range_min the section's new minimum value + * @param range_max the section's new maximum value + */ +void lv_scale_set_section_range(lv_obj_t * scale, lv_scale_section_t * section, int32_t min, int32_t max); + +/** + * Set the minimum value of a scale section + * @param scale pointer to scale + * @param section pointer to section + * @param min the section's new minimum value + */ +void lv_scale_set_section_min_value(lv_obj_t * scale, lv_scale_section_t * section, int32_t min); + +/** + * Set the maximum value of a scale section + * @param scale pointer to scale + * @param section pointer to section + * @param max the section's new maximum value + */ +void lv_scale_set_section_max_value(lv_obj_t * scale, lv_scale_section_t * section, int32_t max); + +/** + * DEPRECATED, use lv_scale_set_section_style_main/indicator/items instead. + * Set style for specified part of Section. + * @param section pointer to Section + * @param part the part of the Scale the style will apply to, e.g. LV_PART_INDICATOR + * @param section_part_style pointer to style to apply + */ +void lv_scale_section_set_style(lv_scale_section_t * section, lv_part_t part, lv_style_t * section_part_style); + +/** + * Set the style of the line on a section. + * @param scale pointer to scale + * @param section pointer to section + * @param style point to a style + */ +void lv_scale_set_section_style_main(lv_obj_t * scale, lv_scale_section_t * section, const lv_style_t * style); + +/** + * Set the style of the major ticks and label on a section. + * @param scale pointer to scale + * @param section pointer to section + * @param style point to a style + */ +void lv_scale_set_section_style_indicator(lv_obj_t * scale, lv_scale_section_t * section, const lv_style_t * style); + +/** + * Set the style of the minor ticks on a section. + * @param scale pointer to scale + * @param section pointer to section + * @param style point to a style + */ +void lv_scale_set_section_style_items(lv_obj_t * scale, lv_scale_section_t * section, const lv_style_t * style); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get scale mode. See lv_scale_mode_t + * @param obj pointer to Scale Widget + * @return Scale mode + */ +lv_scale_mode_t lv_scale_get_mode(lv_obj_t * obj); + +/** + * Get scale total tick count (including minor and major ticks) + * @param obj pointer to Scale Widget + * @return Scale total tick count + */ +int32_t lv_scale_get_total_tick_count(lv_obj_t * obj); + +/** + * Get how often the major tick will be drawn + * @param obj pointer to Scale Widget + * @return Scale major tick every count + */ +int32_t lv_scale_get_major_tick_every(lv_obj_t * obj); + +/** + * Get angular location of low end of Scale. + * @param obj pointer to Scale Widget + * @return Scale low end angular location + */ +int32_t lv_scale_get_rotation(lv_obj_t * obj); + +/** + * Gets label visibility + * @param obj pointer to Scale Widget + * @return true if tick label is enabled, false otherwise + */ +bool lv_scale_get_label_show(lv_obj_t * obj); + +/** + * Get Scale's range in degrees + * @param obj pointer to Scale Widget + * @return Scale's angle_range + */ +uint32_t lv_scale_get_angle_range(lv_obj_t * obj); + +/** + * Get minimum value for Scale + * @param obj pointer to Scale Widget + * @return Scale's minimum value + */ +int32_t lv_scale_get_range_min_value(lv_obj_t * obj); + +/** + * Get maximum value for Scale + * @param obj pointer to Scale Widget + * @return Scale's maximum value + */ +int32_t lv_scale_get_range_max_value(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +#if LV_USE_OBSERVER + +/** + * Bind an integer subject to a scales section minimum value + * @param obj pointer to a Scale + * @param section pointer to a Scale section + * @param subject pointer to a Subject + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_scale_bind_section_min_value(lv_obj_t * obj, lv_scale_section_t * section, lv_subject_t * subject); + +/** + * Bind an integer subject to a scales section maximum value + * @param obj pointer to an Scale + * @param section pointer to a Scale section + * @param subject pointer to a Subject + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_scale_bind_section_max_value(lv_obj_t * obj, lv_scale_section_t * section, lv_subject_t * subject); + +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SCALE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SCALE_H*/ diff --git a/inc/lvgl/src/widgets/scale/lv_scale_private.h b/inc/lvgl/src/widgets/scale/lv_scale_private.h new file mode 100644 index 0000000..ba4ef9d --- /dev/null +++ b/inc/lvgl/src/widgets/scale/lv_scale_private.h @@ -0,0 +1,103 @@ +/** + * @file lv_scale_private.h + * + */ + +#ifndef LV_SCALE_PRIVATE_H +#define LV_SCALE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_scale.h" + +#if LV_USE_SCALE != 0 +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_scale_section_t { + /** Style to use for MAIN part(s) of scale + * when it falls within this section's range */ + const lv_style_t * main_style; + + /** Style to use for INDICATOR part(s) of scale + * when it falls within this section's range */ + const lv_style_t * indicator_style; + + /** Style to use for ITEMS part(s) of scale + * when it falls within this section's range */ + const lv_style_t * items_style; + + int32_t range_min; /**< Scale parts with value >= this value will be drawn using applicable style. */ + int32_t range_max; /**< Scale parts with value <= this value will be drawn using applicable style. */ + uint32_t first_tick_idx_in_section; /**< Internal (set during drawing): Tick index of first tick that falls within + * this section; LV_SCALE_TICK_IDX_DEFAULT_ID if section contains no ticks. */ + uint32_t last_tick_idx_in_section; /**< Internal (set during drawing): Tick index of last tick that falls within + * this section; LV_SCALE_TICK_IDX_DEFAULT_ID if section contains no ticks. */ + int32_t first_tick_in_section_width; /**< Internal (set during drawing) */ + int32_t last_tick_in_section_width; /**< Internal (set during drawing) */ + lv_point_t first_tick_in_section; /**< Internal (set during drawing) */ + lv_point_t last_tick_in_section; /**< Internal (set during drawing) */ + uint32_t first_tick_idx_is_major : 1; /**< Internal (set during drawing): true if + * `first_tick_idx_in_section` represents a major tick. */ + uint32_t last_tick_idx_is_major : 1; /**< Internal (set during drawing): true if + * `last_tick_idx_in_section` represents a major tick. */ +}; +typedef struct { + lv_obj_t * obj; + int32_t value; + int32_t length; +} lv_scale_needle_t; + +struct _lv_scale_t { + lv_obj_t obj; /**< Base Widget part of Scale */ + lv_ll_t section_ll; /**< Linked list for the sections (stores lv_scale_section_t)*/ + const char ** txt_src; /**< Optional list of text strings for major ticks + * when custom labels are provided. */ + lv_scale_mode_t mode; /**< Orientation and layout of scale. */ + int32_t range_min; /**< Scale's minimum value */ + int32_t range_max; /**< Scale's maximum value */ + uint32_t total_tick_count : 15; /**< Total number of ticks (major and minor) */ + uint32_t major_tick_every : 15; /**< Frequency of major ticks to minor ticks */ + uint32_t label_enabled : 1; /**< Draw labels for major ticks? */ + uint32_t post_draw : 1; /**< false: drawing occurs during LV_EVENT_DRAW_MAIN; + * true : drawing occurs during LV_EVENT_DRAW_POST. */ + uint32_t draw_ticks_on_top : 1; /**< Draw ticks on top of main line? */ + /* Round scale */ + uint32_t angle_range; /**< Degrees between low end and high end of scale */ + int32_t rotation; /**< Clockwise angular offset from 3-o'clock position of low end of scale */ + /* Private properties */ + int32_t custom_label_cnt; /**< Number of custom labels provided in `txt_src` */ + int32_t last_tick_width; /**< Width of last tick in pixels */ + int32_t first_tick_width; /**< Width of first tick in pixels */ + lv_array_t needles; /**< Needle list of this scale */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SCALE != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SCALE_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/slider/lv_slider.c b/inc/lvgl/src/widgets/slider/lv_slider.c new file mode 100644 index 0000000..8e8ade4 --- /dev/null +++ b/inc/lvgl/src/widgets/slider/lv_slider.c @@ -0,0 +1,690 @@ +/** + * @file lv_slider.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_slider_private.h" +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_event_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_SLIDER != 0 + +#include "../../misc/lv_assert.h" +#include "../../core/lv_group.h" +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_private.h" +#include "../../display/lv_display.h" +#include "../../draw/lv_draw.h" +#include "../../stdlib/lv_string.h" +#include "../../misc/lv_math.h" +#include "../image/lv_image.h" +#include "../../core/lv_observer_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_slider_class) + +#define LV_SLIDER_KNOB_COORD(is_reversed, area) (is_reversed ? area.x1 : area.x2) +#define LV_SLIDER_KNOB_COORD_VERTICAL(is_reversed, area) (is_reversed ? area.y2 : area.y1) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const int32_t knob_size, const bool hor); +static void draw_knob(lv_event_t * e); +static bool is_slider_horizontal(lv_obj_t * obj); +static void drag_start(lv_obj_t * obj); +static void update_knob_pos(lv_obj_t * obj, bool check_drag); + +#if LV_USE_OBSERVER + static void slider_value_changed_event_cb(lv_event_t * e); + static void slider_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif /*LV_USE_OBSERVER*/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_slider_properties[] = { + { + .id = LV_PROPERTY_SLIDER_VALUE, + .setter = lv_slider_set_value, + .getter = lv_slider_get_value, + }, + { + .id = LV_PROPERTY_SLIDER_LEFT_VALUE, + .setter = lv_slider_set_start_value, + .getter = lv_slider_get_left_value, + }, + { + .id = LV_PROPERTY_SLIDER_RANGE, + .setter = lv_slider_set_range, + .getter = NULL, + }, + { + .id = LV_PROPERTY_SLIDER_MIN_VALUE, + .setter = lv_slider_set_min_value, + .getter = lv_slider_get_min_value, + }, + { + .id = LV_PROPERTY_SLIDER_MAX_VALUE, + .setter = lv_slider_set_max_value, + .getter = lv_slider_get_max_value, + }, + { + .id = LV_PROPERTY_SLIDER_MODE, + .setter = lv_slider_set_mode, + .getter = lv_slider_get_mode, + }, + { + .id = LV_PROPERTY_SLIDER_IS_DRAGGED, + .setter = NULL, + .getter = lv_slider_is_dragged, + }, + { + .id = LV_PROPERTY_SLIDER_IS_SYMMETRICAL, + .setter = NULL, + .getter = lv_slider_is_symmetrical, + }, +}; +#endif + +const lv_obj_class_t lv_slider_class = { + .constructor_cb = lv_slider_constructor, + .event_cb = lv_slider_event, + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_slider_t), + .base_class = &lv_bar_class, + .name = "lv_slider", + LV_PROPERTY_CLASS_FIELDS(slider, SLIDER) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_slider_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +bool lv_slider_is_dragged(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_slider_t * slider = (lv_slider_t *)obj; + + return slider->dragging; +} + +void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + lv_bar_set_value(obj, value, anim); +} + +void lv_slider_set_start_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim) +{ + lv_bar_set_start_value(obj, value, anim); +} + +void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max) +{ + lv_bar_set_range(obj, min, max); +} + +void lv_slider_set_min_value(lv_obj_t * obj, int32_t min) +{ + lv_bar_set_min_value(obj, min); +} + +void lv_slider_set_max_value(lv_obj_t * obj, int32_t min) +{ + lv_bar_set_max_value(obj, min); +} + +void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode) +{ + lv_bar_set_mode(obj, (lv_bar_mode_t)mode); +} + +void lv_slider_set_orientation(lv_obj_t * obj, lv_slider_orientation_t orientation) +{ + lv_bar_set_orientation(obj, (lv_bar_orientation_t)orientation); +} + +int32_t lv_slider_get_value(const lv_obj_t * obj) +{ + return lv_bar_get_value(obj); +} + +int32_t lv_slider_get_left_value(const lv_obj_t * obj) +{ + return lv_bar_get_start_value(obj); +} + +int32_t lv_slider_get_min_value(const lv_obj_t * obj) +{ + return lv_bar_get_min_value(obj); +} + +int32_t lv_slider_get_max_value(const lv_obj_t * obj) +{ + return lv_bar_get_max_value(obj); +} + +lv_slider_mode_t lv_slider_get_mode(lv_obj_t * slider) +{ + lv_bar_mode_t mode = lv_bar_get_mode(slider); + if(mode == LV_BAR_MODE_SYMMETRICAL) return LV_SLIDER_MODE_SYMMETRICAL; + else if(mode == LV_BAR_MODE_RANGE) return LV_SLIDER_MODE_RANGE; + else return LV_SLIDER_MODE_NORMAL; +} + +lv_slider_orientation_t lv_slider_get_orientation(lv_obj_t * slider) +{ + lv_bar_orientation_t ori = lv_bar_get_orientation(slider); + if(ori == LV_BAR_ORIENTATION_HORIZONTAL) return LV_SLIDER_ORIENTATION_HORIZONTAL; + else if(ori == LV_BAR_ORIENTATION_VERTICAL) return LV_SLIDER_ORIENTATION_VERTICAL; + else return LV_SLIDER_ORIENTATION_AUTO; +} + +bool lv_slider_is_symmetrical(lv_obj_t * obj) +{ + return lv_bar_is_symmetrical(obj); +} + +#if LV_USE_OBSERVER +lv_observer_t * lv_slider_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(subject->type != LV_SUBJECT_TYPE_INT && subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_obj_add_event_cb(obj, slider_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + lv_observer_t * observer = lv_subject_add_observer_obj(subject, slider_value_observer_cb, obj, NULL); + return observer; +} +#endif /*LV_USE_OBSERVER*/ + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_slider_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_slider_t * slider = (lv_slider_t *)obj; + + /*Initialize the allocated 'slider'*/ + slider->value_to_set = NULL; + slider->dragging = 0U; + slider->left_knob_focus = 0U; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_set_ext_click_area(obj, LV_DPX(8)); +} + +static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_slider_t * slider = (lv_slider_t *)obj; + lv_slider_mode_t type = lv_slider_get_mode(obj); + + /*Advanced hit testing: react only on dragging the knob(s)*/ + if(code == LV_EVENT_HIT_TEST) { + lv_hit_test_info_t * info = lv_event_get_param(e); + int32_t ext_click_area = obj->spec_attr ? obj->spec_attr->ext_click_pad : 0; + + /*Ordinary slider: was the knob area hit?*/ + lv_area_t a; + lv_area_copy(&a, &slider->right_knob_area); + lv_area_increase(&a, ext_click_area, ext_click_area); + info->res = lv_area_is_point_on(&a, info->point, 0); + + /*There's still a chance that there is a hit if there is another knob*/ + if((info->res == false) && (type == LV_SLIDER_MODE_RANGE)) { + lv_area_copy(&a, &slider->left_knob_area); + lv_area_increase(&a, ext_click_area, ext_click_area); + info->res = lv_area_is_point_on(&a, info->point, 0); + } + } + else if(code == LV_EVENT_PRESSED) { + /*Save the pressed coordinates*/ + lv_indev_get_point(lv_indev_active(), &slider->pressed_point); + lv_obj_transform_point(obj, &slider->pressed_point, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); + } + else if(code == LV_EVENT_PRESSING) { + update_knob_pos(obj, true); + } + else if(code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) { + update_knob_pos(obj, false); + slider->dragging = false; + slider->value_to_set = NULL; + + lv_obj_invalidate(obj); + + /*Leave edit mode if released. (No need to wait for LONG_PRESS)*/ + lv_group_t * g = lv_obj_get_group(obj); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + if(editing) { + if(lv_slider_get_mode(obj) == LV_SLIDER_MODE_RANGE) { + if(slider->left_knob_focus == 0) slider->left_knob_focus = 1; + else { + slider->left_knob_focus = 0; + lv_group_set_editing(g, false); + } + } + else { + lv_group_set_editing(g, false); + } + } + } + else if(indev_type == LV_INDEV_TYPE_POINTER) { + if(is_slider_horizontal(obj)) lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + else lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + } + } + else if(code == LV_EVENT_FOCUSED) { + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) { + slider->left_knob_focus = 0; + } + } + else if(code == LV_EVENT_SIZE_CHANGED) { + if(is_slider_horizontal(obj)) { + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + } + else { + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + } + lv_obj_refresh_ext_draw_size(obj); + } + else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + /*The smaller size is the knob diameter*/ + int32_t trans_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB); + int32_t trans_h = lv_obj_get_style_transform_height(obj, LV_PART_KNOB); + int32_t knob_size = LV_MIN(lv_obj_get_width(obj) + 2 * trans_w, lv_obj_get_height(obj) + 2 * trans_h) >> 1; + knob_size += LV_MAX(LV_MAX(knob_left, knob_right), LV_MAX(knob_bottom, knob_top)); + knob_size += 2; /*For rounding error*/ + knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB); + + /*Indic. size is handled by bar*/ + int32_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_size); + + } + else if(code == LV_EVENT_KEY) { + uint32_t c = lv_event_get_key(e); + + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) + 1, LV_ANIM_ON); + else lv_slider_set_start_value(obj, lv_slider_get_left_value(obj) + 1, LV_ANIM_ON); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) - 1, LV_ANIM_ON); + else lv_slider_set_start_value(obj, lv_slider_get_left_value(obj) - 1, LV_ANIM_ON); + } + else { + return; + } + + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + else if(code == LV_EVENT_ROTARY) { + int32_t r = lv_event_get_rotary_diff(e); + + if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) + r, LV_ANIM_ON); + else lv_slider_set_start_value(obj, lv_slider_get_left_value(obj) + 1, LV_ANIM_ON); + + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_knob(e); + } +} + +static void draw_knob(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_slider_t * slider = (lv_slider_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + + const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + const bool is_horizontal = is_slider_horizontal(obj); + const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal); + + lv_area_t knob_area; + int32_t knob_size; + bool is_symmetrical = lv_slider_is_symmetrical(obj); + + if(is_horizontal) { + knob_size = lv_obj_get_height(obj); + if(is_symmetrical && + slider->bar.cur_value < 0) knob_area.x1 = LV_SLIDER_KNOB_COORD(!is_reversed, slider->bar.indic_area); + else knob_area.x1 = LV_SLIDER_KNOB_COORD(is_reversed, slider->bar.indic_area); + } + else { + knob_size = lv_obj_get_width(obj); + if(is_symmetrical && + slider->bar.cur_value < 0) knob_area.y1 = LV_SLIDER_KNOB_COORD_VERTICAL(!is_reversed, slider->bar.indic_area); + else knob_area.y1 = LV_SLIDER_KNOB_COORD_VERTICAL(is_reversed, slider->bar.indic_area); + } + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + knob_rect_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); + /* Update knob area with knob style */ + position_knob(obj, &knob_area, knob_size, is_horizontal); + /* Update right knob area with calculated knob area */ + lv_area_copy(&slider->right_knob_area, &knob_area); + + if(lv_slider_get_mode(obj) != LV_SLIDER_MODE_RANGE) { + lv_draw_rect(layer, &knob_rect_dsc, &slider->right_knob_area); + } + else { + /*Save the draw part_draw_dsc. because it can be modified in the event*/ + lv_draw_rect_dsc_t knob_rect_dsc_tmp; + lv_memcpy(&knob_rect_dsc_tmp, &knob_rect_dsc, sizeof(lv_draw_rect_dsc_t)); + /* Draw the right knob */ + lv_draw_rect(layer, &knob_rect_dsc, &slider->right_knob_area); + + /*Calculate the second knob area*/ + if(is_horizontal) { + /*use !is_reversed to get the other knob*/ + knob_area.x1 = LV_SLIDER_KNOB_COORD(!is_reversed, slider->bar.indic_area); + } + else { + knob_area.y1 = LV_SLIDER_KNOB_COORD_VERTICAL(!is_reversed, slider->bar.indic_area); + } + position_knob(obj, &knob_area, knob_size, is_horizontal); + lv_area_copy(&slider->left_knob_area, &knob_area); + + lv_memcpy(&knob_rect_dsc, &knob_rect_dsc_tmp, sizeof(lv_draw_rect_dsc_t)); + + lv_draw_rect(layer, &knob_rect_dsc, &slider->left_knob_area); + } +} + +static void position_knob(lv_obj_t * obj, lv_area_t * knob_area, const int32_t knob_size, const bool hor) +{ + if(hor) { + knob_area->x1 -= (knob_size >> 1); + knob_area->x2 = knob_area->x1 + knob_size - 1; + knob_area->y1 = obj->coords.y1; + knob_area->y2 = obj->coords.y2; + } + else { + knob_area->y1 -= (knob_size >> 1); + knob_area->y2 = knob_area->y1 + knob_size - 1; + knob_area->x1 = obj->coords.x1; + knob_area->x2 = obj->coords.x2; + } + + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + int32_t transf_w = lv_obj_get_style_transform_width(obj, LV_PART_KNOB); + int32_t transf_h = lv_obj_get_style_transform_height(obj, LV_PART_KNOB); + + /*Apply the paddings on the knob area*/ + knob_area->x1 -= knob_left + transf_w; + knob_area->x2 += knob_right + transf_w; + knob_area->y1 -= knob_top + transf_h; + knob_area->y2 += knob_bottom + transf_h; +} + +static bool is_slider_horizontal(lv_obj_t * obj) +{ + lv_slider_t * slider = (lv_slider_t *)obj; + if(slider->bar.orientation == LV_BAR_ORIENTATION_AUTO) return lv_obj_get_width(obj) >= lv_obj_get_height(obj); + else if(slider->bar.orientation == LV_BAR_ORIENTATION_HORIZONTAL) return true; + else return false; +} + +static void drag_start(lv_obj_t * obj) +{ + lv_slider_t * slider = (lv_slider_t *)obj; + lv_slider_mode_t mode = lv_slider_get_mode(obj); + lv_point_t p; + slider->dragging = true; + if(mode == LV_SLIDER_MODE_NORMAL || mode == LV_SLIDER_MODE_SYMMETRICAL) { + slider->value_to_set = &slider->bar.cur_value; + } + else if(mode == LV_SLIDER_MODE_RANGE) { + lv_indev_get_point(lv_indev_active(), &p); + lv_obj_transform_point(obj, &p, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); + const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + const bool is_horizontal = is_slider_horizontal(obj); + const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal); + int32_t dist_left, dist_right; + if(is_horizontal) { + if((!is_reversed && p.x > slider->right_knob_area.x2) || (is_reversed && p.x < slider->right_knob_area.x1)) { + slider->value_to_set = &slider->bar.cur_value; + } + else if((!is_reversed && p.x < slider->left_knob_area.x1) || (is_reversed && p.x > slider->left_knob_area.x2)) { + slider->value_to_set = &slider->bar.start_value; + } + else { + /*Calculate the distance from each knob*/ + dist_left = LV_ABS((slider->left_knob_area.x1 + (slider->left_knob_area.x2 - slider->left_knob_area.x1) / 2) - p.x); + dist_right = LV_ABS((slider->right_knob_area.x1 + (slider->right_knob_area.x2 - slider->right_knob_area.x1) / 2) - p.x); + /*Use whichever one is closer*/ + if(dist_right < dist_left) { + slider->value_to_set = &slider->bar.cur_value; + slider->left_knob_focus = 0; + } + else { + slider->value_to_set = &slider->bar.start_value; + slider->left_knob_focus = 1; + } + } + } + else { + if((!is_reversed && p.y < slider->right_knob_area.y1) || (is_reversed && p.y > slider->right_knob_area.y2)) { + slider->value_to_set = &slider->bar.cur_value; + } + else if((!is_reversed && p.y > slider->left_knob_area.y2) || (is_reversed && p.y < slider->left_knob_area.y1)) { + slider->value_to_set = &slider->bar.start_value; + } + else { + /*Calculate the distance from each knob*/ + dist_left = LV_ABS((slider->left_knob_area.y1 + (slider->left_knob_area.y2 - slider->left_knob_area.y1) / 2) - p.y); + dist_right = LV_ABS((slider->right_knob_area.y1 + (slider->right_knob_area.y2 - slider->right_knob_area.y1) / 2) - p.y); + + /*Use whichever one is closer*/ + if(dist_right < dist_left) { + slider->value_to_set = &slider->bar.cur_value; + slider->left_knob_focus = 0; + } + else { + slider->value_to_set = &slider->bar.start_value; + slider->left_knob_focus = 1; + } + } + } + } +} + +static void update_knob_pos(lv_obj_t * obj, bool check_drag) +{ + lv_slider_t * slider = (lv_slider_t *)obj; + lv_indev_t * indev = lv_indev_active(); + if(lv_indev_get_type(indev) != LV_INDEV_TYPE_POINTER) + return; + if(lv_indev_get_scroll_obj(indev) != NULL) + return; + + lv_point_t p; + lv_indev_get_point(indev, &p); + lv_obj_transform_point(obj, &p, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE); + + bool is_hor = is_slider_horizontal(obj); + + if(check_drag && !slider->dragging) { + int32_t ofs = is_hor ? (p.x - slider->pressed_point.x) : (p.y - slider->pressed_point.y); + + /*Stop processing when offset is below scroll_limit*/ + if(LV_ABS(ofs) < indev->scroll_limit) { + return; + } + } + + if(!slider->value_to_set) { + /*Ready to start drag*/ + drag_start(obj); + } + + int32_t new_value = 0; + const int32_t range = slider->bar.max_value - slider->bar.min_value; + const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + const bool is_horizontal = is_slider_horizontal(obj); + const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal); + + if(is_hor) { + const int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + const int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + const int32_t w = lv_obj_get_width(obj); + const int32_t indic_w = w - bg_left - bg_right; + + if(is_reversed) { + /*Make the point relative to the indicator*/ + new_value = (obj->coords.x2 - bg_right) - p.x; + } + else { + /*Make the point relative to the indicator*/ + new_value = p.x - (obj->coords.x1 + bg_left); + } + if(indic_w) { + new_value = (new_value * range + indic_w / 2) / indic_w; + new_value += slider->bar.min_value; + } + } + else { + const int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + const int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + const int32_t h = lv_obj_get_height(obj); + const int32_t indic_h = h - bg_bottom - bg_top; + + if(is_reversed) { + /*Make the point relative to the indicator*/ + new_value = p.y - (obj->coords.y1 + bg_top); + } + else { + /*Make the point relative to the indicator*/ + new_value = p.y - (obj->coords.y2 + bg_bottom); + new_value = -new_value; + } + new_value = (new_value * range + indic_h / 2) / indic_h; + new_value += slider->bar.min_value; + } + + int32_t real_max_value = slider->bar.max_value; + int32_t real_min_value = slider->bar.min_value; + /*Figure out the min. and max. for this mode*/ + if(slider->value_to_set == &slider->bar.start_value) { + real_max_value = slider->bar.cur_value; + } + else { + real_min_value = slider->bar.start_value; + } + + new_value = LV_CLAMP(real_min_value, new_value, real_max_value); + if(*slider->value_to_set != new_value) { + *slider->value_to_set = new_value; + if(is_hor) + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_VER); + else + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN_HOR); + + lv_obj_invalidate(obj); + lv_result_t res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) + return; + } +} + + +#if LV_USE_OBSERVER + +static void slider_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * slider = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + if(subject->type == LV_SUBJECT_TYPE_INT) { + lv_subject_set_int(subject, lv_slider_get_value(slider)); + } +#if LV_USE_FLOAT + else { + lv_subject_set_float(subject, (float)lv_slider_get_value(slider)); + } +#endif +} + +static void slider_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + lv_obj_t * obj = lv_observer_get_target_obj(observer); + /*If the slider is not rendered yet show the new state immediately*/ + lv_anim_enable_t anim_on = obj->rendered ? LV_ANIM_ON : LV_ANIM_OFF; + if(subject->type == LV_SUBJECT_TYPE_INT) { + lv_slider_set_value(observer->target, subject->value.num, anim_on); + } +#if LV_USE_FLOAT + else { + lv_slider_set_value(observer->target, (int32_t)subject->value.float_v, anim_on); + } +#endif +} + +#endif /*LV_USE_OBSERVER*/ + + +#endif diff --git a/inc/lvgl/src/widgets/slider/lv_slider.h b/inc/lvgl/src/widgets/slider/lv_slider.h new file mode 100644 index 0000000..5fb0120 --- /dev/null +++ b/inc/lvgl/src/widgets/slider/lv_slider.h @@ -0,0 +1,207 @@ +/** + * @file lv_slider.h + * + */ + +#ifndef LV_SLIDER_H +#define LV_SLIDER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../bar/lv_bar.h" + +#if LV_USE_SLIDER != 0 + +/*Testing of dependencies*/ +#if LV_USE_BAR == 0 +#error "lv_slider: lv_bar is required. Enable it in lv_conf.h (LV_USE_BAR 1)" +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_SLIDER_MODE_NORMAL = LV_BAR_MODE_NORMAL, + LV_SLIDER_MODE_SYMMETRICAL = LV_BAR_MODE_SYMMETRICAL, + LV_SLIDER_MODE_RANGE = LV_BAR_MODE_RANGE +} lv_slider_mode_t; + +typedef enum { + LV_SLIDER_ORIENTATION_AUTO = LV_BAR_ORIENTATION_AUTO, + LV_SLIDER_ORIENTATION_HORIZONTAL = LV_BAR_ORIENTATION_HORIZONTAL, + LV_SLIDER_ORIENTATION_VERTICAL = LV_BAR_ORIENTATION_VERTICAL +} lv_slider_orientation_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_slider_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_slider_id_t { + LV_PROPERTY_ID2(SLIDER, VALUE, LV_PROPERTY_TYPE_INT, LV_PROPERTY_TYPE_BOOL, 0), + LV_PROPERTY_ID2(SLIDER, LEFT_VALUE, LV_PROPERTY_TYPE_INT, LV_PROPERTY_TYPE_BOOL, 1), + LV_PROPERTY_ID2(SLIDER, RANGE, LV_PROPERTY_TYPE_INT, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(SLIDER, MIN_VALUE, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_ID(SLIDER, MAX_VALUE, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(SLIDER, MODE, LV_PROPERTY_TYPE_INT, 6), + LV_PROPERTY_ID(SLIDER, IS_DRAGGED, LV_PROPERTY_TYPE_BOOL, 7), + LV_PROPERTY_ID(SLIDER, IS_SYMMETRICAL, LV_PROPERTY_TYPE_BOOL, 8), + LV_PROPERTY_SLIDER_END, +}; +#endif +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a slider object + * @param parent pointer to an object, it will be the parent of the new slider. + * @return pointer to the created slider + */ +lv_obj_t * lv_slider_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new value on the slider + * @param obj pointer to a slider object + * @param value the new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); + +/** + * Set a new value for the left knob of a slider + * @param obj pointer to a slider object + * @param value new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +void lv_slider_set_start_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim); + +/** + * Set the minimum and the maximum values of a bar + * @param obj pointer to the slider object + * @param min minimum value + * @param max maximum value + */ +void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max); + +/** + * Set the minimum values of a bar + * @param obj pointer to the slider object + * @param min minimum value + */ +void lv_slider_set_min_value(lv_obj_t * obj, int32_t min); + +/** + * Set the maximum values of a bar + * @param obj pointer to the slider object + * @param max maximum value + */ +void lv_slider_set_max_value(lv_obj_t * obj, int32_t max); + +/** + * Set the mode of slider. + * @param obj pointer to a slider object + * @param mode the mode of the slider. See `lv_slider_mode_t` + */ +void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode); + +/** + * Set the orientation of slider. + * @param obj pointer to a slider object + * @param orientation slider orientation from `lv_slider_orientation_t` + */ +void lv_slider_set_orientation(lv_obj_t * obj, lv_slider_orientation_t orientation); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the value of the main knob of a slider + * @param obj pointer to a slider object + * @return the value of the main knob of the slider + */ +int32_t lv_slider_get_value(const lv_obj_t * obj); + +/** + * Get the value of the left knob of a slider + * @param obj pointer to a slider object + * @return the value of the left knob of the slider + */ +int32_t lv_slider_get_left_value(const lv_obj_t * obj); + +/** + * Get the minimum value of a slider + * @param obj pointer to a slider object + * @return the minimum value of the slider + */ +int32_t lv_slider_get_min_value(const lv_obj_t * obj); + +/** + * Get the maximum value of a slider + * @param obj pointer to a slider object + * @return the maximum value of the slider + */ +int32_t lv_slider_get_max_value(const lv_obj_t * obj); + +/** + * Give the slider is being dragged or not + * @param obj pointer to a slider object + * @return true: drag in progress false: not dragged + */ +bool lv_slider_is_dragged(const lv_obj_t * obj); + +/** + * Get the mode of the slider. + * @param slider pointer to a slider object + * @return see `lv_slider_mode_t` + */ +lv_slider_mode_t lv_slider_get_mode(lv_obj_t * slider); + +/** + * Get the orientation of slider. + * @param obj pointer to a slider object + * @return slider orientation from `lv_slider_orientation_t` + */ +lv_slider_orientation_t lv_slider_get_orientation(lv_obj_t * slider); + +/** + * Give the slider is in symmetrical mode or not + * @param obj pointer to slider object + * @return true: in symmetrical mode false : not in +*/ +bool lv_slider_is_symmetrical(lv_obj_t * obj); + + +#if LV_USE_OBSERVER +/** + * Bind an integer or float Subject to a Slider's value. + * @param obj pointer to Slider + * @param subject pointer to Subject + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_slider_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SLIDER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SLIDER_H*/ diff --git a/inc/lvgl/src/widgets/slider/lv_slider_private.h b/inc/lvgl/src/widgets/slider/lv_slider_private.h new file mode 100644 index 0000000..0b4464d --- /dev/null +++ b/inc/lvgl/src/widgets/slider/lv_slider_private.h @@ -0,0 +1,55 @@ +/** + * @file lv_slider_private.h + * + */ + +#ifndef LV_SLIDER_PRIVATE_H +#define LV_SLIDER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../bar/lv_bar_private.h" +#include "lv_slider.h" + +#if LV_USE_SLIDER != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_slider_t { + lv_bar_t bar; /**< Add the ancestor's type first */ + lv_area_t left_knob_area; + lv_area_t right_knob_area; + lv_point_t pressed_point; + int32_t * value_to_set; /**< Which bar value to set */ + uint8_t dragging : 1; /**< 1: the slider is being dragged */ + uint8_t left_knob_focus : 1; /**< 1: with encoder now the right knob can be adjusted */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SLIDER != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SLIDER_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/span/lv_span.c b/inc/lvgl/src/widgets/span/lv_span.c new file mode 100644 index 0000000..e4ab8df --- /dev/null +++ b/inc/lvgl/src/widgets/span/lv_span.c @@ -0,0 +1,1526 @@ +/** + * @file lv_span.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_span_private.h" +#include "../../misc/lv_area_private.h" +#include "../../draw/lv_draw_private.h" +#include "../../core/lv_obj_class_private.h" + +#if LV_USE_SPAN != 0 + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_text_private.h" +#include "../../misc/lv_bidi_private.h" +#include "../../core/lv_observer_private.h" +#include "../../misc/lv_text_ap.h" +#include "../../core/lv_global.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_spangroup_class) +#define snippet_stack LV_GLOBAL_DEFAULT()->span_snippet_stack + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_span_t * span; + const char * txt; + const lv_font_t * font; + uint32_t bytes; + int32_t txt_w; + int32_t line_h; + int32_t letter_space; +} lv_snippet_t; + +struct _snippet_stack { + lv_snippet_t stack[LV_SPAN_SNIPPET_STACK_SIZE]; + uint32_t index; +}; + +#if LV_USE_OBSERVER +typedef struct { + lv_subject_t * subject; + void * element; /**< span of a span group*/ + const char * fmt; +} bind_element_string_t; +#endif + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_spangroup_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_spangroup_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * span); +static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span); +static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span); +static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span); +static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span); + +static inline void span_text_check(const char ** text); +static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer); +static bool lv_text_get_snippet(const char * txt, const lv_font_t * font, int32_t letter_space, + int32_t max_width, lv_text_flag_t flag, int32_t * use_width, + uint32_t * end_ofs); + +static void lv_snippet_clear(void); +static uint32_t lv_get_snippet_count(void); +static void lv_snippet_push(lv_snippet_t * item); +static lv_snippet_t * lv_get_snippet(uint32_t index); +static int32_t convert_indent_pct(lv_obj_t * spans, int32_t width); + +static lv_span_coords_t make_span_coords(const lv_span_t * prev_span, const lv_span_t * curr_span, int32_t width, + lv_area_t padding, int32_t indent); +#if LV_USE_OBSERVER + static void span_text_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_span_properties[] = { + { + .id = LV_PROPERTY_SPAN_ALIGN, + .setter = lv_spangroup_set_align, + .getter = lv_spangroup_get_align, + }, + { + .id = LV_PROPERTY_SPAN_OVERFLOW, + .setter = lv_spangroup_set_overflow, + .getter = lv_spangroup_get_overflow, + }, + { + .id = LV_PROPERTY_SPAN_INDENT, + .setter = lv_spangroup_set_indent, + .getter = lv_spangroup_get_indent, + }, + { + .id = LV_PROPERTY_SPAN_MODE, + .setter = lv_spangroup_set_mode, + .getter = lv_spangroup_get_mode, + }, + { + .id = LV_PROPERTY_SPAN_MAX_LINES, + .setter = lv_spangroup_set_max_lines, + .getter = lv_spangroup_get_max_lines, + }, +}; +#endif + +const lv_obj_class_t lv_spangroup_class = { + .base_class = &lv_obj_class, + .constructor_cb = lv_spangroup_constructor, + .destructor_cb = lv_spangroup_destructor, + .event_cb = lv_spangroup_event, + .instance_size = sizeof(lv_spangroup_t), + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .name = "lv_span", + LV_PROPERTY_CLASS_FIELDS(span, SPAN) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ +void lv_span_stack_init(void) +{ + struct _snippet_stack * stack = snippet_stack = lv_malloc(sizeof(struct _snippet_stack)); + LV_ASSERT_MALLOC(stack); + if(!stack) { + LV_LOG_ERROR("malloc failed for snippet_stack"); + } +} + +void lv_span_stack_deinit(void) +{ + lv_free(snippet_stack); +} + +lv_obj_t * lv_spangroup_create(lv_obj_t * par) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_spangroup_class, par); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_span_t * lv_spangroup_add_span(lv_obj_t * obj) +{ + if(obj == NULL) { + return NULL; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_span_t * span = lv_ll_ins_tail(&spans->child_ll); + LV_ASSERT_MALLOC(span); + + lv_style_init(&span->style); + span->txt = (char *)""; + span->static_flag = 1; + + lv_spangroup_refresh(obj); + + return span; +} + +void lv_spangroup_delete_span(lv_obj_t * obj, lv_span_t * span) +{ + if(obj == NULL || span == NULL) { + return; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_span_t * cur_span; + LV_LL_READ(&spans->child_ll, cur_span) { + if(cur_span == span) { + lv_ll_remove(&spans->child_ll, cur_span); + if(cur_span->txt && cur_span->static_flag == 0) { + lv_free(cur_span->txt); + cur_span->txt = NULL; + } + lv_style_reset(&cur_span->style); + lv_free(cur_span); + cur_span = NULL; + break; + } + } + + lv_spangroup_refresh(obj); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_span_set_text(lv_span_t * span, const char * text) +{ + if(span == NULL || text == NULL) { + return; + } + + size_t text_alloc_len = 0; + +#if LV_USE_ARABIC_PERSIAN_CHARS + text_alloc_len = lv_text_ap_calc_bytes_count(text); +#else + text_alloc_len = lv_strlen(text) + 1; +#endif + + if(span->txt == NULL || span->static_flag == 1) { + span->txt = lv_malloc(text_alloc_len); + LV_ASSERT_MALLOC(span->txt); + } + else { + span->txt = lv_realloc(span->txt, text_alloc_len); + LV_ASSERT_MALLOC(span->txt); + } + + if(span->txt == NULL) return; + + span->static_flag = 0; + +#if LV_USE_ARABIC_PERSIAN_CHARS + lv_text_ap_proc(text, span->txt); +#else + lv_memcpy(span->txt, text, text_alloc_len); +#endif +} + +void lv_span_set_text_fmt(lv_span_t * span, const char * fmt, ...) +{ + if(span == NULL || fmt == NULL) { + return; + } + + va_list args; + va_start(args, fmt); + char * text = lv_text_set_text_vfmt(fmt, args); + LV_ASSERT_MALLOC(text); + if(text == NULL) { + va_end(args); + return; + } + + va_end(args); + + if(span->txt && !span->static_flag) { + lv_free(span->txt); + } + + span->static_flag = 0; + span->txt = text; +} + + +void lv_spangroup_set_span_text(lv_obj_t * obj, lv_span_t * span, const char * text) +{ + lv_span_set_text(span, text); + lv_spangroup_refresh(obj); +} + +void lv_span_set_text_static(lv_span_t * span, const char * text) +{ + if(span == NULL || text == NULL) { + return; + } + + if(span->txt && span->static_flag == 0) { + lv_free(span->txt); + span->txt = NULL; + } + span->static_flag = 1; + +#if LV_USE_ARABIC_PERSIAN_CHARS + size_t text_alloc_len = lv_text_ap_calc_bytes_count(text); + span->txt = lv_malloc(text_alloc_len); + LV_ASSERT_MALLOC(span->txt) + lv_text_ap_proc(text, span->txt); + span->static_flag = 0; +#else + span->txt = (char *)text; +#endif +} + +void lv_spangroup_set_span_text_static(lv_obj_t * obj, lv_span_t * span, const char * text) +{ + lv_span_set_text_static(span, text); + lv_spangroup_refresh(obj); +} + +void lv_spangroup_set_span_text_fmt(lv_obj_t * obj, lv_span_t * span, const char * fmt, ...) +{ + if(span == NULL || fmt == NULL) { + return; + } + + va_list args; + va_start(args, fmt); + char * text = lv_text_set_text_vfmt(fmt, args); + LV_ASSERT_MALLOC(text); + if(text == NULL) { + va_end(args); + return; + } + + va_end(args); + + if(span->txt && !span->static_flag) { + lv_free(span->txt); + } + + span->static_flag = 0; + span->txt = text; + + lv_spangroup_refresh(obj); +} + +void lv_spangroup_set_span_style(lv_obj_t * obj, lv_span_t * span, const lv_style_t * style) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(span); + + lv_style_copy(&span->style, style); + + lv_spangroup_refresh(obj); +} + +void lv_spangroup_set_align(lv_obj_t * obj, lv_text_align_t align) +{ + LV_LOG_WARN("DEPRECATED. Use the text_align style property instead"); + + lv_obj_set_style_text_align(obj, align, LV_PART_MAIN); +} + +void lv_spangroup_set_overflow(lv_obj_t * obj, lv_span_overflow_t overflow) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + if(spans->overflow == overflow) return; + if(overflow >= LV_SPAN_OVERFLOW_LAST) return; + spans->overflow = overflow; + lv_obj_invalidate(obj); +} + +void lv_spangroup_set_indent(lv_obj_t * obj, int32_t indent) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + if(spans->indent == indent) return; + + spans->indent = indent; + + lv_spangroup_refresh(obj); +} + +void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode) +{ + LV_LOG_WARN("DEPRECATED, set the width to LV_SIZE_CONTENT or fixed value to control expanding/wrapping"); + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(mode >= LV_SPAN_MODE_LAST) return; + + if(mode == LV_SPAN_MODE_EXPAND) { + lv_obj_set_width(obj, LV_SIZE_CONTENT); + lv_obj_set_height(obj, LV_SIZE_CONTENT); + } + else if(mode == LV_SPAN_MODE_BREAK) { + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + lv_obj_set_width(obj, 100); + } + lv_obj_set_height(obj, LV_SIZE_CONTENT); + } + else if(mode == LV_SPAN_MODE_FIXED) { + /* use this mode, The user needs to set the size. */ + /* This is just to prevent an infinite loop. */ + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + lv_obj_set_width(obj, 100); + } + if(lv_obj_get_style_height(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + lv_obj_set_content_height(obj, 100); + } + } + + lv_spangroup_refresh(obj); +} + +void lv_spangroup_set_max_lines(lv_obj_t * obj, int32_t lines) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + spans->lines = lines; + + lv_spangroup_refresh(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_style_t * lv_span_get_style(lv_span_t * span) +{ + return &span->style; +} + +const char * lv_span_get_text(lv_span_t * span) +{ + return span->txt; +} + +lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id) +{ + if(obj == NULL) { + return NULL; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_ll_t * linked_list = &spans->child_ll; + + bool traverse_forwards = (id >= 0); + int32_t cur_idx = 0; + lv_ll_node_t * cur_node = linked_list->head; + + /*If using a negative index, start from the tail and use cur -1 to indicate the end*/ + if(!traverse_forwards) { + cur_idx = -1; + cur_node = linked_list->tail; + } + + while(cur_node != NULL) { + if(cur_idx == id) { + return (lv_span_t *) cur_node; + } + if(traverse_forwards) { + cur_node = (lv_ll_node_t *) lv_ll_get_next(linked_list, cur_node); + cur_idx++; + } + else { + cur_node = (lv_ll_node_t *) lv_ll_get_prev(linked_list, cur_node); + cur_idx--; + } + } + + return NULL; +} + +uint32_t lv_spangroup_get_span_count(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(obj == NULL) { + return 0; + } + + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return lv_ll_get_len(&(spans->child_ll)); +} + +lv_text_align_t lv_spangroup_get_align(lv_obj_t * obj) +{ + return lv_obj_get_style_text_align(obj, LV_PART_MAIN); +} + +lv_span_overflow_t lv_spangroup_get_overflow(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->overflow; +} + +int32_t lv_spangroup_get_indent(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->indent; +} + +lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + return LV_SPAN_MODE_EXPAND; + } + + /*Width is fixed for the following cases*/ + else if(lv_obj_get_style_height(obj, LV_PART_MAIN) == LV_SIZE_CONTENT) { + return LV_SPAN_MODE_BREAK; + } + /*Both fixed*/ + else { + return LV_SPAN_MODE_FIXED; + } +} + +int32_t lv_spangroup_get_max_lines(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + return spans->lines; +} + + +int32_t lv_spangroup_get_max_line_height(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + int32_t max_line_h = 0; + lv_span_t * cur_span; + LV_LL_READ(&spans->child_ll, cur_span) { + const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); + int32_t line_h = lv_font_get_line_height(font); + if(line_h > max_line_h) { + max_line_h = line_h; + } + } + + return max_line_h; +} + +uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + if(lv_ll_get_head(&spans->child_ll) == NULL) { + return 0; + } + + uint32_t width = LV_COORD_IS_PCT(spans->indent) ? 0 : spans->indent; + int32_t letter_space = 0; + lv_span_t * cur_span; + LV_LL_READ(&spans->child_ll, cur_span) { + uint32_t letter; + uint32_t letter_next; + const lv_font_t * font = lv_span_get_style_text_font(obj, cur_span); + + letter_space = lv_span_get_style_text_letter_space(obj, cur_span); + uint32_t j = 0; + const char * cur_txt = cur_span->txt; + span_text_check(&cur_txt); + while(cur_txt[j] != '\0') { + if(max_width > 0 && width >= max_width) { + return max_width; + } + letter = lv_text_encoded_next(cur_txt, &j); + letter_next = lv_text_encoded_next(&cur_txt[j], NULL); + uint32_t letter_w = lv_font_get_glyph_width(font, letter, letter_next); + width = width + letter_w + letter_space; + } + } + + return width - letter_space; +} + +int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + if(lv_ll_get_head(&spans->child_ll) == NULL || width <= 0) { + return 0; + } + + /* init draw variable */ + lv_text_flag_t txt_flag = LV_TEXT_FLAG_NONE; + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t max_width = width; + int32_t indent = convert_indent_pct(obj, max_width); + int32_t max_w = max_width - indent; /* first line need minus indent */ + + /* coords of draw span-txt */ + lv_point_t txt_pos; + lv_point_set(&txt_pos, indent, 0); /* first line need add indent */ + + lv_span_t * cur_span = lv_ll_get_head(&spans->child_ll); + const char * cur_txt = cur_span->txt; + span_text_check(&cur_txt); + uint32_t cur_txt_ofs = 0; + lv_snippet_t snippet; /* use to save cur_span info and push it to stack */ + lv_memset(&snippet, 0, sizeof(snippet)); + + lv_span_t * prev_span = cur_span; + int32_t line_cnt = 0; + int32_t lines = spans->lines < 0 ? INT32_MAX : spans->lines; + /* the loop control how many lines need to draw */ + while(cur_span) { + int snippet_cnt = 0; + int32_t max_line_h = 0; /* the max height of span-font when a line have a lot of span */ + + /* the loop control to find a line and push the relevant span info into stack */ + while(1) { + /* switch to the next span when current is end */ + if(cur_txt[cur_txt_ofs] == '\0') { + cur_span->trailing_pos = txt_pos; + + cur_span = lv_ll_get_next(&spans->child_ll, cur_span); + if(cur_span == NULL) break; + cur_txt = cur_span->txt; + span_text_check(&cur_txt); + cur_txt_ofs = 0; + /* maybe also cur_txt[cur_txt_ofs] == '\0' */ + continue; + } + + /* init span info to snippet. */ + if(cur_txt_ofs == 0) { + snippet.span = cur_span; + snippet.font = lv_span_get_style_text_font(obj, cur_span); + snippet.letter_space = lv_span_get_style_text_letter_space(obj, cur_span); + snippet.line_h = lv_font_get_line_height(snippet.font) + line_space; + } + + /* get current span text line info */ + uint32_t next_ofs = 0; + int32_t use_width = 0; + bool isfill = lv_text_get_snippet(&cur_txt[cur_txt_ofs], snippet.font, snippet.letter_space, + max_w, txt_flag, &use_width, &next_ofs); + if(isfill) txt_pos.x = 0; + else txt_pos.x += use_width; + + /* break word deal width */ + if(isfill && next_ofs > 0 && snippet_cnt > 0) { + int32_t drawn_width = use_width; + if(lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { + drawn_width -= snippet.letter_space; + } + if(max_w < drawn_width) { + break; + } + + uint32_t tmp_ofs = next_ofs; + uint32_t letter = lv_text_encoded_prev(&cur_txt[cur_txt_ofs], &tmp_ofs); + uint32_t letter_next = lv_text_encoded_next(&cur_txt[cur_txt_ofs + next_ofs], NULL); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || lv_text_is_break_char(letter) || + lv_text_is_a_word(letter) || lv_text_is_a_word(letter_next))) { + if(!(letter_next == '\0' || letter_next == '\n' || letter_next == '\r' || lv_text_is_break_char(letter_next))) { + break; + } + } + } + + snippet.txt = &cur_txt[cur_txt_ofs]; + snippet.bytes = next_ofs; + snippet.txt_w = use_width; + cur_txt_ofs += next_ofs; + if(max_line_h < snippet.line_h) { + max_line_h = snippet.line_h; + } + snippet_cnt ++; + max_w = max_w - use_width; + if(isfill || max_w <= 0) { + break; + } + } + + /* next line init */ + txt_pos.y += max_line_h; + + /* iterate all the spans in the current line and set the trailing height to the max line height */ + for(lv_span_t * tmp_span = prev_span; + tmp_span && tmp_span != cur_span; + tmp_span = lv_ll_get_next(&spans->child_ll, tmp_span)) + tmp_span->trailing_height = max_line_h; + + prev_span = cur_span; + + max_w = max_width; + line_cnt += 1; + if(line_cnt >= lines) { + break; + } + } + txt_pos.y -= line_space; + + return txt_pos.y; +} + +lv_span_coords_t lv_spangroup_get_span_coords(lv_obj_t * obj, const lv_span_t * span) +{ + if(obj == NULL) return (lv_span_coords_t) { + 0 + }; + + /* find previous span */ + const lv_spangroup_t * spangroup = (lv_spangroup_t *)obj; + const lv_ll_t * spans = &spangroup->child_ll; + const int32_t width = lv_obj_get_content_width(obj); + const int32_t indent = lv_spangroup_get_indent(obj); + + if(span == NULL || lv_ll_get_head(spans) == NULL) return (lv_span_coords_t) { + 0 + }; + + lv_span_t * prev_span = NULL; + lv_span_t * curr_span; + LV_LL_READ(spans, curr_span) { + if(curr_span == span) break; + prev_span = curr_span; + } + + const uint32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + return make_span_coords(prev_span, curr_span, width, (lv_area_t) { + .x1 = lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width, + .y1 = lv_obj_get_style_pad_top(obj, LV_PART_MAIN) + border_width, + .x2 = lv_obj_get_style_pad_right(obj, LV_PART_MAIN) + border_width, .y2 = 0 + }, + indent); +} + +lv_span_t * lv_spangroup_get_span_by_point(lv_obj_t * obj, const lv_point_t * p) +{ + const lv_spangroup_t * spangroup = (lv_spangroup_t *)obj; + const lv_ll_t * spans = &spangroup->child_ll; + const int32_t width = lv_obj_get_content_width(obj); + const int32_t indent = lv_spangroup_get_indent(obj); + + if(obj == NULL || p == NULL || lv_ll_get_head(spans) == NULL) return NULL; + + lv_point_t point; + point.x = p->x - obj->coords.x1; + point.y = p->y - obj->coords.y1; + + /* find previous span */ + + const lv_span_t * prev_span = NULL; + lv_span_t * curr_span; + LV_LL_READ(spans, curr_span) { + lv_span_coords_t coords = make_span_coords(prev_span, curr_span, width, (lv_area_t) { + .x1 = lv_obj_get_style_pad_left(obj, LV_PART_MAIN), + .y1 = lv_obj_get_style_pad_top(obj, LV_PART_MAIN), + .x2 = lv_obj_get_style_pad_right(obj, LV_PART_MAIN), + .y2 = 0 + }, + indent); + if(lv_area_is_point_on(&coords.heading, &point, 0) || + lv_area_is_point_on(&coords.middle, &point, 0) || + lv_area_is_point_on(&coords.trailing, &point, 0)) { + return curr_span; + } + prev_span = curr_span; + } + return NULL; +} + + +/*===================== + * Other functions + *====================*/ + +void lv_spangroup_refresh(lv_obj_t * obj) +{ + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + spans->refresh = 1; + lv_obj_invalidate(obj); + lv_obj_refresh_self_size(obj); +} + +#if LV_USE_OBSERVER +lv_observer_t * lv_spangroup_bind_span_text(lv_obj_t * obj, lv_span_t * span, lv_subject_t * subject, const char * fmt) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + LV_ASSERT_NULL(span); + + if(fmt == NULL) { + if(subject->type == LV_SUBJECT_TYPE_INT) { + fmt = "%d"; + } +#if LV_USE_FLOAT + else if(subject->type == LV_SUBJECT_TYPE_FLOAT) { + fmt = "%0.1f"; + } +#endif + else if(subject->type != LV_SUBJECT_TYPE_STRING && subject->type != LV_SUBJECT_TYPE_POINTER) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + } + else { + if(subject->type != LV_SUBJECT_TYPE_STRING && subject->type != LV_SUBJECT_TYPE_POINTER && + subject->type != LV_SUBJECT_TYPE_INT && subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + } + + bind_element_string_t * user_data = lv_zalloc(sizeof(bind_element_string_t)); + if(user_data == NULL) { + LV_LOG_WARN("Couldn't allocate user_data"); + LV_ASSERT_MALLOC(user_data); + return NULL; + } + + user_data->subject = subject; + user_data->element = span; + user_data->fmt = fmt; + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, span_text_observer_cb, obj, user_data); + observer->auto_free_user_data = 1; + + return observer; +} +#endif /*LV_USE_OBSERVER*/ + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_spangroup_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_ll_init(&spans->child_ll, sizeof(lv_span_t)); + spans->indent = 0; + spans->lines = -1; + spans->overflow = LV_SPAN_OVERFLOW_CLIP; + spans->cache_w = 0; + spans->cache_h = 0; + spans->refresh = 1; +} + +static void lv_spangroup_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + lv_span_t * cur_span = lv_ll_get_head(&spans->child_ll); + while(cur_span) { + lv_ll_remove(&spans->child_ll, cur_span); + if(cur_span->txt && cur_span->static_flag == 0) { + lv_free(cur_span->txt); + cur_span->txt = NULL; + } + lv_style_reset(&cur_span->style); + lv_free(cur_span); + cur_span = lv_ll_get_head(&spans->child_ll); + } +} + +static void lv_spangroup_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /* Call the ancestor's event handler */ + if(lv_obj_event_base(MY_CLASS, e) != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } + else if(code == LV_EVENT_STYLE_CHANGED) { + lv_spangroup_refresh(obj); + } + else if(code == LV_EVENT_SIZE_CHANGED) { + lv_spangroup_refresh(obj); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + int32_t width = 0; + int32_t height = 0; + lv_point_t * self_size = lv_event_get_param(e); + + lv_span_mode_t mode = lv_spangroup_get_mode(obj); + if(mode == LV_SPAN_MODE_EXPAND) { + if(spans->refresh) { + spans->cache_w = (int32_t)lv_spangroup_get_expand_width(obj, 0); + spans->cache_h = lv_spangroup_get_max_line_height(obj); + spans->refresh = 0; + } + width = spans->cache_w; + height = spans->cache_h; + } + else if(mode == LV_SPAN_MODE_BREAK) { + width = lv_obj_get_content_width(obj); + if(self_size->y >= 0) { + if(width != spans->cache_w || spans->refresh) { + height = lv_spangroup_get_expand_height(obj, width); + spans->cache_w = width; + spans->cache_h = height; + spans->refresh = 0; + } + else { + height = spans->cache_h; + } + } + } + else if(mode == LV_SPAN_MODE_FIXED) { + width = self_size->x >= 0 ? lv_obj_get_content_width(obj) : 0; + height = self_size->y >= 0 ? lv_obj_get_content_height(obj) : 0; + } + self_size->x = LV_MAX(self_size->x, width); + self_size->y = LV_MAX(self_size->y, height); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_layer_t * layer = lv_event_get_layer(e); + + lv_draw_span(obj, layer); +} + +/** + * @return true for txt fill the max_width. + */ +static bool lv_text_get_snippet(const char * txt, const lv_font_t * font, + int32_t letter_space, int32_t max_width, lv_text_flag_t flag, + int32_t * use_width, uint32_t * end_ofs) +{ + if(txt == NULL || txt[0] == '\0') { + *end_ofs = 0; + *use_width = 0; + return false; + } + + int32_t real_max_width = max_width; +#if !LV_USE_FONT_PLACEHOLDER + /* fix incomplete text display when disable the placeholder. */ + /* workaround by: https://github.com/lvgl/lvgl/issues/3685 */ + real_max_width++; +#endif + + lv_text_attributes_t attributes = {0}; + attributes.letter_space = letter_space; + attributes.max_width = real_max_width; + attributes.text_flags = flag; + + uint32_t ofs = lv_text_get_next_line(txt, LV_TEXT_LEN_MAX, font, use_width, &attributes); + *end_ofs = ofs; + + if(txt[ofs] == '\0' && *use_width <= attributes.max_width && !(ofs && (txt[ofs - 1] == '\n' || txt[ofs - 1] == '\r'))) { + return false; + } + else { + return true; + } +} + +static void lv_snippet_push(lv_snippet_t * item) +{ + struct _snippet_stack * stack_p = snippet_stack; + if(stack_p->index < LV_SPAN_SNIPPET_STACK_SIZE) { + lv_memcpy(&stack_p->stack[stack_p->index], item, sizeof(lv_snippet_t)); + stack_p->index++; + } + else { + LV_LOG_ERROR("span draw stack overflow, please set LV_SPAN_SNIPPET_STACK_SIZE too larger"); + } +} + +static uint32_t lv_get_snippet_count(void) +{ + return snippet_stack->index; +} + +static lv_snippet_t * lv_get_snippet(uint32_t index) +{ + return &snippet_stack->stack[index]; +} + +static void lv_snippet_clear(void) +{ + snippet_stack->index = 0; +} + +static const lv_font_t * lv_span_get_style_text_font(lv_obj_t * par, lv_span_t * span) +{ + const lv_font_t * font; + lv_style_value_t value; + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_FONT, &value); + if(res != LV_STYLE_RES_FOUND) { + font = lv_obj_get_style_text_font(par, LV_PART_MAIN); + } + else { + font = (const lv_font_t *)value.ptr; + } + return font; +} + +static int32_t lv_span_get_style_text_letter_space(lv_obj_t * par, lv_span_t * span) +{ + int32_t letter_space; + lv_style_value_t value; + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_LETTER_SPACE, &value); + if(res != LV_STYLE_RES_FOUND) { + letter_space = lv_obj_get_style_text_letter_space(par, LV_PART_MAIN); + } + else { + letter_space = (int32_t)value.num; + } + return letter_space; +} + +static lv_color_t lv_span_get_style_text_color(lv_obj_t * par, lv_span_t * span) +{ + lv_style_value_t value; + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_COLOR, &value); + if(res != LV_STYLE_RES_FOUND) { + value.color = lv_obj_get_style_text_color(par, LV_PART_MAIN); + } + return value.color; +} + +static lv_opa_t lv_span_get_style_text_opa(lv_obj_t * par, lv_span_t * span) +{ + lv_opa_t opa; + lv_style_value_t value; + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_OPA, &value); + if(res != LV_STYLE_RES_FOUND) { + opa = (lv_opa_t)lv_obj_get_style_text_opa(par, LV_PART_MAIN); + } + else { + opa = (lv_opa_t)value.num; + } + return opa; +} + +static int32_t lv_span_get_style_text_decor(lv_obj_t * par, lv_span_t * span) +{ + int32_t decor; + lv_style_value_t value; + lv_style_res_t res = lv_style_get_prop(&span->style, LV_STYLE_TEXT_DECOR, &value); + if(res != LV_STYLE_RES_FOUND) { + decor = (lv_text_decor_t)lv_obj_get_style_text_decor(par, LV_PART_MAIN); + } + else { + decor = (int32_t)value.num; + } + return decor; +} + +static inline void span_text_check(const char ** text) +{ + if(*text == NULL) { + *text = ""; + LV_LOG_ERROR("occur an error that span text == NULL"); + } +} + +static int32_t convert_indent_pct(lv_obj_t * obj, int32_t width) +{ + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + int32_t indent = spans->indent; + if(LV_COORD_IS_PCT(spans->indent)) { + if(lv_spangroup_get_mode(obj) == LV_SPAN_MODE_EXPAND) { + indent = 0; + } + else { + indent = (width * LV_COORD_GET_PCT(spans->indent)) / 100; + } + } + + return indent; +} + +/** + * draw span group + * @param spans obj handle + * @param coords coordinates of the label + * @param mask the label will be drawn only in this area + */ +static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) +{ + + lv_area_t coords; + lv_obj_get_content_coords(obj, &coords); + + lv_spangroup_t * spans = (lv_spangroup_t *)obj; + + /* return if not span */ + if(lv_ll_get_head(&spans->child_ll) == NULL) { + return; + } + + /* return if no draw area */ + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, &coords, &layer->_clip_area)) return; + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area; + + /* init draw variable */ + lv_text_flag_t txt_flag = LV_TEXT_FLAG_NONE; + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + int32_t max_width = lv_area_get_width(&coords); + int32_t indent = convert_indent_pct(obj, max_width); + int32_t max_w = max_width - indent; /* first line need minus indent */ + lv_opa_t obj_opa = lv_obj_get_style_opa_recursive(obj, LV_PART_MAIN); + + /* coords of draw span-txt */ + lv_point_t txt_pos; + txt_pos.y = coords.y1; + txt_pos.x = coords.x1 + indent; /* first line need add indent */ + + lv_span_t * cur_span = lv_ll_get_head(&spans->child_ll); + const char * cur_txt = cur_span->txt; + span_text_check(&cur_txt); + + lv_text_align_t align = lv_obj_get_style_text_align(obj, LV_PART_MAIN); +#if LV_USE_BIDI + lv_base_dir_t base_dir = lv_obj_get_style_base_dir(obj, LV_PART_MAIN); + if(base_dir == LV_BASE_DIR_AUTO) { + base_dir = lv_bidi_detect_base_dir(cur_txt) == LV_BASE_DIR_RTL ? LV_BASE_DIR_RTL : LV_BASE_DIR_AUTO; + } + + while(cur_span) { + cur_span = lv_ll_get_next(&spans->child_ll, cur_span); + if(cur_span == NULL) break; + cur_txt = cur_span->txt; + span_text_check(&cur_txt); + + if(base_dir == LV_BASE_DIR_AUTO) { + base_dir = lv_bidi_detect_base_dir(cur_txt) == LV_BASE_DIR_RTL ? LV_BASE_DIR_RTL : LV_BASE_DIR_AUTO; + } + } + cur_span = lv_ll_get_head(&spans->child_ll); + cur_txt = cur_span->txt; +#endif + + uint32_t cur_txt_ofs = 0; + lv_snippet_t snippet; /* use to save cur_span info and push it to stack */ + lv_memzero(&snippet, sizeof(snippet)); + + lv_draw_label_dsc_t label_draw_dsc; + lv_draw_label_dsc_init(&label_draw_dsc); + + bool is_first_line = true; + /* the loop control how many lines need to draw */ + while(cur_span) { + bool is_end_line = false; + bool ellipsis_valid = false; + int32_t max_line_h = 0; /* the max height of span-font when a line have a lot of span */ + int32_t max_baseline = 0; /*baseline of the highest span*/ + lv_snippet_clear(); + + /* the loop control to find a line and push the relevant span info into stack */ + while(1) { + /* switch to the next span when current is end */ + if(cur_txt[cur_txt_ofs] == '\0') { + cur_span = lv_ll_get_next(&spans->child_ll, cur_span); + if(cur_span == NULL) break; + cur_txt = cur_span->txt; + span_text_check(&cur_txt); + cur_txt_ofs = 0; + /* maybe also cur_txt[cur_txt_ofs] == '\0' */ + continue; + } + + /* init span info to snippet. */ + if(cur_txt_ofs == 0) { + snippet.span = cur_span; + snippet.font = lv_span_get_style_text_font(obj, cur_span); + snippet.letter_space = lv_span_get_style_text_letter_space(obj, cur_span); + snippet.line_h = lv_font_get_line_height(snippet.font) + line_space; + } + + /* get current span text line info */ + uint32_t next_ofs = 0; + int32_t use_width = 0; + bool isfill = lv_text_get_snippet(&cur_txt[cur_txt_ofs], snippet.font, snippet.letter_space, + max_w, txt_flag, &use_width, &next_ofs); + + if(isfill) { + if(next_ofs > 0 && lv_get_snippet_count() > 0) { + int32_t drawn_width = use_width; + if(lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { + drawn_width -= snippet.letter_space; + } + /* To prevent infinite loops, the lv_text_get_next_line() may return incomplete words, */ + /* This phenomenon should be avoided when lv_get_snippet_count() > 0 */ + if(max_w < drawn_width) { + break; + } + uint32_t tmp_ofs = next_ofs; + uint32_t letter = lv_text_encoded_prev(&cur_txt[cur_txt_ofs], &tmp_ofs); + uint32_t letter_next = lv_text_encoded_next(&cur_txt[cur_txt_ofs + next_ofs], NULL); + if(!(letter == '\0' || letter == '\n' || letter == '\r' || lv_text_is_break_char(letter) || + lv_text_is_a_word(letter) || lv_text_is_a_word(letter_next))) { + if(!(letter_next == '\0' || letter_next == '\n' || letter_next == '\r' || lv_text_is_break_char(letter_next))) { + break; + } + } + } + } + + snippet.txt = &cur_txt[cur_txt_ofs]; + snippet.bytes = next_ofs; + snippet.txt_w = use_width; + cur_txt_ofs += next_ofs; + if(max_line_h < snippet.line_h) { + max_line_h = snippet.line_h; + max_baseline = snippet.font->base_line; + } + + lv_snippet_push(&snippet); + max_w = max_w - use_width; + if(isfill || max_w <= 0) { + break; + } + } + + /* start current line deal with */ + + uint32_t item_cnt = lv_get_snippet_count(); + if(item_cnt == 0) { /* break if stack is empty */ + break; + } + + /* Whether the current line is the end line and does overflow processing */ + { + lv_snippet_t * last_snippet = lv_get_snippet(item_cnt - 1); + int32_t next_line_h = last_snippet->line_h; + if(last_snippet->txt[last_snippet->bytes] == '\0') { + next_line_h = 0; + lv_span_t * next_span = lv_ll_get_next(&spans->child_ll, last_snippet->span); + if(next_span && next_span->txt && next_span->txt[0]) { /* have the next line */ + next_line_h = lv_font_get_line_height(lv_span_get_style_text_font(obj, next_span)) + line_space; + } + } + if(txt_pos.y + max_line_h + next_line_h - line_space > coords.y2 + 1) { /* for overflow if is end line. */ + ellipsis_valid = spans->overflow == LV_SPAN_OVERFLOW_ELLIPSIS; + is_end_line = true; + } + } + + /*Go the first visible line*/ + if(txt_pos.y + max_line_h < clip_area.y1) { + goto Next_line_init; + } + + /* align deal with */ +#if LV_USE_BIDI + if(base_dir == LV_BASE_DIR_AUTO) { + base_dir = LV_BASE_DIR_LTR; + } + + if(align == LV_TEXT_ALIGN_AUTO) { + if(base_dir == LV_BASE_DIR_RTL) align = LV_TEXT_ALIGN_RIGHT; + else align = LV_TEXT_ALIGN_LEFT; + } +#endif + int32_t align_ofs = 0; + int32_t txts_w = is_first_line ? indent : 0; + uint32_t i_item; + for(i_item = 0; i_item < item_cnt; i_item++) { + lv_snippet_t * pinfo = lv_get_snippet(i_item); + if(ellipsis_valid && i_item == item_cnt - 1) { + uint32_t n_ofs = 0; + ellipsis_valid = lv_text_get_snippet(pinfo->txt, pinfo->font, pinfo->letter_space, max_width - txts_w, + LV_TEXT_FLAG_BREAK_ALL, &pinfo->txt_w, &n_ofs); + pinfo->bytes = n_ofs; + } + txts_w = txts_w + pinfo->txt_w; + } + txts_w -= lv_get_snippet(item_cnt - 1)->letter_space; + align_ofs = max_width > txts_w ? max_width - txts_w : 0; + if(align == LV_TEXT_ALIGN_CENTER) { + align_ofs = align_ofs >> 1; + } + if(align == LV_TEXT_ALIGN_CENTER || align == LV_TEXT_ALIGN_RIGHT) { + txt_pos.x += align_ofs; + } + +#if LV_USE_BIDI + int32_t first_txt_pos_x = txt_pos.x; + bool is_draw_rtl = false; + lv_snippet_t * pinfo0 = lv_get_snippet(0); + lv_base_dir_t bidi_dir = lv_bidi_detect_base_dir(pinfo0->txt); + if(bidi_dir == LV_BASE_DIR_RTL && base_dir == LV_BASE_DIR_RTL) { + is_draw_rtl = true; + if(align == LV_TEXT_ALIGN_LEFT || align == LV_TEXT_ALIGN_CENTER) { + txt_pos.x = coords.x2 - align_ofs; + } + else if(align == LV_TEXT_ALIGN_RIGHT) { + txt_pos.x = coords.x2; + } + } +#endif + /* draw line letters */ + uint32_t i; + for(i = 0; i < item_cnt; i++) { + lv_snippet_t * pinfo = lv_get_snippet(i); + +#if LV_USE_BIDI + char * bidi_txt; + if(base_dir == LV_BASE_DIR_RTL) { + bidi_txt = lv_malloc(pinfo->bytes + 1); + LV_ASSERT_MALLOC(bidi_txt); + lv_memcpy(bidi_txt, pinfo->txt, (size_t)pinfo->bytes); + label_draw_dsc.bidi_dir = base_dir; + label_draw_dsc.has_bided = true; + label_draw_dsc.text_local = true; + lv_bidi_process_paragraph(pinfo->txt, bidi_txt, pinfo->bytes, label_draw_dsc.bidi_dir, NULL, 0); + } + else { + bidi_txt = (char *)pinfo->txt; + } +#else + const char * bidi_txt = pinfo->txt; +#endif + + lv_point_t pos; + pos.x = txt_pos.x; + pos.y = txt_pos.y + max_line_h - pinfo->line_h - (max_baseline - pinfo->font->base_line); + label_draw_dsc.color = lv_span_get_style_text_color(obj, pinfo->span); + label_draw_dsc.opa = lv_span_get_style_text_opa(obj, pinfo->span); + label_draw_dsc.font = lv_span_get_style_text_font(obj, pinfo->span); + if(obj_opa < LV_OPA_MAX) { + label_draw_dsc.opa = LV_OPA_MIX2(label_draw_dsc.opa, obj_opa); + } + uint32_t txt_bytes = pinfo->bytes; + + if(pos.x > clip_area.x2) { + continue; + } + + label_draw_dsc.text = bidi_txt; + label_draw_dsc.text_length = txt_bytes; + label_draw_dsc.letter_space = pinfo->letter_space; + label_draw_dsc.line_space = line_space; + label_draw_dsc.decor = lv_span_get_style_text_decor(obj, pinfo->span); + lv_area_t a; + a.x1 = pos.x; + a.y1 = pos.y; + a.x2 = a.x1 + pinfo->txt_w; + a.y2 = a.y1 + pinfo->line_h; + +#if LV_USE_BIDI + if(is_draw_rtl) { + a.x1 = pos.x - pinfo->txt_w; + a.x2 = pos.x; + } +#endif + + bool need_draw_ellipsis = false; + int32_t dot_width = 0; + /* deal overflow */ + if(ellipsis_valid) { + int32_t dot_letter_w = lv_font_get_glyph_width(pinfo->font, '.', '.'); + dot_width = dot_letter_w * 3; + + label_draw_dsc.flag = LV_TEXT_FLAG_BREAK_ALL; + int32_t text_width = coords.x2 - a.x1; + uint32_t next_ofs; + text_width = text_width > dot_width ? text_width - dot_width : text_width; + need_draw_ellipsis = lv_text_get_snippet(pinfo->txt, pinfo->font, pinfo->letter_space, text_width, + label_draw_dsc.flag, &pinfo->txt_w, &next_ofs); + a.x2 = a.x1 + pinfo->txt_w; + label_draw_dsc.text_length = next_ofs; +#if LV_USE_BIDI + if(base_dir == LV_BASE_DIR_RTL) { + if(txt_bytes > label_draw_dsc.text_length) { + char * tmp_txt = lv_malloc(label_draw_dsc.text_length + 1); + LV_ASSERT_MALLOC(tmp_txt); + + if(lv_bidi_detect_base_dir(bidi_txt) == LV_BASE_DIR_RTL) { + lv_memcpy(tmp_txt, bidi_txt + (txt_bytes - label_draw_dsc.text_length), (size_t)label_draw_dsc.text_length); + } + else { + lv_memcpy(tmp_txt, bidi_txt, (size_t)label_draw_dsc.text_length); + } + + label_draw_dsc.text = tmp_txt; + lv_free(bidi_txt); + } + if(i == 0) { + a.x1 = a.x1 + dot_width; + a.x2 = a.x2 + dot_width; + } + } +#endif + } + + lv_draw_label(layer, &label_draw_dsc, &a); +#if LV_USE_BIDI + if(label_draw_dsc.has_bided) { + lv_free((void *)label_draw_dsc.text); + } +#endif + + if(need_draw_ellipsis) { + label_draw_dsc.text = "..."; + label_draw_dsc.text_length = LV_TEXT_LEN_MAX; + +#if LV_USE_BIDI + if(label_draw_dsc.bidi_dir == LV_BASE_DIR_RTL) { + a.x1 = first_txt_pos_x; + a.x2 = a.x1 + dot_width; + } + else { + a.x1 = a.x2; + a.x2 = a.x1 + dot_width; + } + label_draw_dsc.text_local = false; +#else + a.x1 = a.x2; + a.x2 = a.x1 + dot_width; +#endif + + lv_draw_label(layer, &label_draw_dsc, &a); + } + + txt_pos.x = a.x2; + +#if LV_USE_BIDI + if(is_draw_rtl) { + txt_pos.x = a.x1; + } +#endif + } + +Next_line_init: + /* next line init */ + is_first_line = false; + txt_pos.x = coords.x1; + txt_pos.y += max_line_h; + if(is_end_line || txt_pos.y > clip_area.y2 + 1) { + layer->_clip_area = clip_area_ori; + return; + } + max_w = max_width; + } + layer->_clip_area = clip_area_ori; +} + +static lv_span_coords_t make_span_coords(const lv_span_t * prev_span, const lv_span_t * curr_span, const int32_t width, + const lv_area_t padding, const int32_t indent) +{ + lv_span_coords_t coords = { 0 }; + + if(curr_span == NULL) return coords; + + /* first line */ + if(prev_span == NULL) { + lv_area_set(&coords.heading, padding.x1 + indent, padding.y1, width + padding.x1, + curr_span->trailing_pos.y + padding.y1); + lv_area_set(&coords.middle, coords.heading.x1, coords.heading.y2, curr_span->trailing_pos.x + padding.x1, + coords.heading.y2 + curr_span->trailing_height); + lv_area_set(&coords.trailing, 0, 0, 0, 0); + + return coords; + } + + /* start and end on the same line */ + const bool is_same_line = prev_span->trailing_pos.y == curr_span->trailing_pos.y; + if(is_same_line == true) { + lv_area_set(&coords.heading, + prev_span->trailing_pos.x + padding.x1, prev_span->trailing_pos.y + padding.y1, + curr_span->trailing_pos.x + padding.x1, curr_span->trailing_pos.y + curr_span->trailing_height + padding.y1); + return coords; + } + + /* common case */ + const lv_point_t pre_trailing_pos = prev_span->trailing_pos; + const int32_t pre_trailing_height = prev_span->trailing_height; + + lv_area_set(&coords.heading, + pre_trailing_pos.x + padding.x1, pre_trailing_pos.y + padding.y1, + width + padding.x1, pre_trailing_pos.y + pre_trailing_height + padding.y1); + /* When it happens to be two lines of text, + * the y2 of the middle area is exactly the y1 + line height of the first line of text, + * so the area of the middle area is empty. + * */ + lv_area_set(&coords.middle, + padding.x1, coords.heading.y2, + width + padding.x1, curr_span->trailing_pos.y + padding.y1); + lv_area_set(&coords.trailing, + coords.middle.x1, coords.middle.y2, + curr_span->trailing_pos.x + padding.x1, curr_span->trailing_pos.y + curr_span->trailing_height + padding.y1); + + return coords; +} + +#if LV_USE_OBSERVER + +static void span_text_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + bind_element_string_t * user_data = observer->user_data; + + if(user_data->fmt == NULL) { + lv_spangroup_set_span_text(observer->target, user_data->element, subject->value.pointer); + } + else { + switch(subject->type) { + + case LV_SUBJECT_TYPE_INT: + lv_spangroup_set_span_text_fmt(observer->target, user_data->element, user_data->fmt, subject->value.num); + break; +#if LV_USE_FLOAT + case LV_SUBJECT_TYPE_FLOAT: + lv_spangroup_set_span_text_fmt(observer->target, user_data->element, user_data->fmt, subject->value.float_v); + break; +#endif + case LV_SUBJECT_TYPE_STRING: + case LV_SUBJECT_TYPE_POINTER: + lv_spangroup_set_span_text_fmt(observer->target, user_data->element, user_data->fmt, subject->value.pointer); + break; + default: + return; + } + } +} + +#endif /*LV_USE_OBSERVER*/ + +#endif diff --git a/inc/lvgl/src/widgets/span/lv_span.h b/inc/lvgl/src/widgets/span/lv_span.h new file mode 100644 index 0000000..569e17f --- /dev/null +++ b/inc/lvgl/src/widgets/span/lv_span.h @@ -0,0 +1,377 @@ +/** + * @file lv_span.h + * + */ + +#ifndef LV_SPAN_H +#define LV_SPAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" +#include "../../core/lv_observer.h" +#include "../../core/lv_obj_property.h" + +#if LV_USE_SPAN != 0 + +/********************* + * DEFINES + *********************/ +#ifndef LV_SPAN_SNIPPET_STACK_SIZE +#define LV_SPAN_SNIPPET_STACK_SIZE 64 +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef enum { + LV_SPAN_OVERFLOW_CLIP, + LV_SPAN_OVERFLOW_ELLIPSIS, + LV_SPAN_OVERFLOW_LAST, /**< Fence member*/ +} lv_span_overflow_t; + +typedef enum { + LV_SPAN_MODE_FIXED, /**< fixed the obj size */ + LV_SPAN_MODE_EXPAND, /**< Expand the object size to the text size */ + LV_SPAN_MODE_BREAK, /**< Keep width, break the too long lines and expand height */ + LV_SPAN_MODE_LAST /**< Fence member */ +} lv_span_mode_t; + +/** Coords of a span */ +typedef struct _lv_span_coords_t { + lv_area_t heading; + lv_area_t middle; + lv_area_t trailing; +} lv_span_coords_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spangroup_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_span_id_t { + LV_PROPERTY_ID(SPAN, ALIGN, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(SPAN, OVERFLOW, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_ID(SPAN, INDENT, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(SPAN, MODE, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(SPAN, MAX_LINES, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_SPAN_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_span_stack_init(void); +void lv_span_stack_deinit(void); + +/** + * Create a spangroup object + * @param parent pointer to an object, it will be the parent of the new spangroup + * @return pointer to the created spangroup + */ +lv_obj_t * lv_spangroup_create(lv_obj_t * parent); + +/** + * Create a span string descriptor and add to spangroup. + * @param obj pointer to a spangroup object. + * @return pointer to the created span. + */ +lv_span_t * lv_spangroup_add_span(lv_obj_t * obj); + +/** + * Remove the span from the spangroup and free memory. + * @param obj pointer to a spangroup object. + * @param span pointer to a span. + * @note Note that before calling `lv_spangroup_delete_span` + * `lv_observer_remove` needs to be called manually as LVGL can't remove the + * binding automatically. + */ +void lv_spangroup_delete_span(lv_obj_t * obj, lv_span_t * span); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new text for a span. Memory will be allocated to store the text by the span. + * As the spangroup is not passed a redraw (invalidation) can't be triggered automatically. + * Therefore `lv_spangroup_refresh(spangroup)` needs to be called manually, + * @param span pointer to a span. + * @param text pointer to a text. + */ +void lv_span_set_text(lv_span_t * span, const char * text); + + +/** + * Set a new text for a span using a printf-like formatting string. + * Memory will be allocated to store the text by the span. + * As the spangroup is not passed a redraw (invalidation) can't be triggered automatically. + * Therefore `lv_spangroup_refresh(spangroup)` needs to be called manually, + * @param span pointer to a span. + * @param fmt `printf`-like format string + */ +void lv_span_set_text_fmt(lv_span_t * span, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(2, 3); + +/** + * Set a static text. It will not be saved by the span so the 'text' variable + * has to be 'alive' while the span exist. + * As the spangroup is not passed a redraw (invalidation) can't be triggered automatically. + * Therefore `lv_spangroup_refresh(spangroup)` needs to be called manually, + * + * @param span pointer to a span. + * @param text pointer to a text. + */ +void lv_span_set_text_static(lv_span_t * span, const char * text); + +/** + * Set a new text for a span. Memory will be allocated to store the text by the span. + * @param obj pointer to a spangroup widget. + * @param span pointer to a span. + * @param text pointer to a text. + */ +void lv_spangroup_set_span_text(lv_obj_t * obj, lv_span_t * span, const char * text); + +/** + * Set a new text for a span. Memory will be allocated to store the text by the span. + * @param obj pointer to a spangroup widget. + * @param span pointer to a span. + * @param text pointer to a text. + */ +void lv_spangroup_set_span_text_static(lv_obj_t * obj, lv_span_t * span, const char * text); + +/** + * Set a new text for a span using a printf-like formatting string. + * Memory will be allocated to store the text by the span. + * @param obj pointer to a spangroup widget. + * @param span pointer to a span. + * @param fmt `printf`-like format string + */ +void lv_spangroup_set_span_text_fmt(lv_obj_t * obj, lv_span_t * span, const char * fmt, ...) LV_FORMAT_ATTRIBUTE(3, 4); + +/** + * Set a static text. It will not be saved by the span so the 'text' variable + * has to be 'alive' while the span exist. + * @param span pointer to a span. + * @param text pointer to a text. + */ +void lv_span_set_text_static(lv_span_t * span, const char * text); + +/** + * Copy all style properties of style to the bbuilt-in static style of the span. + * @param obj pointer_to a spangroup + * @param span pointer to a span. + * @param style pointer to a style to copy into the span's built-in style + */ +void lv_spangroup_set_span_style(lv_obj_t * obj, lv_span_t * span, const lv_style_t * style); + +/** + * DEPRECATED. Use the text_align style property instead + * Set the align of the spangroup. + * @param obj pointer to a spangroup object. + * @param align see lv_text_align_t for details. + */ +void lv_spangroup_set_align(lv_obj_t * obj, lv_text_align_t align); + +/** + * Set the overflow of the spangroup. + * @param obj pointer to a spangroup object. + * @param overflow see lv_span_overflow_t for details. + */ +void lv_spangroup_set_overflow(lv_obj_t * obj, lv_span_overflow_t overflow); + +/** + * Set the indent of the spangroup. + * @param obj pointer to a spangroup object. + * @param indent the first line indentation + */ +void lv_spangroup_set_indent(lv_obj_t * obj, int32_t indent); + +/** + * DEPRECATED, set the width to LV_SIZE_CONTENT or fixed value to control expanding/wrapping" + * Set the mode of the spangroup. + * @param obj pointer to a spangroup object. + * @param mode see lv_span_mode_t for details. + */ +void lv_spangroup_set_mode(lv_obj_t * obj, lv_span_mode_t mode); + +/** + * Set maximum lines of the spangroup. + * @param obj pointer to a spangroup object. + * @param lines max lines that can be displayed in LV_SPAN_MODE_BREAK mode. < 0 means no limit. + */ +void lv_spangroup_set_max_lines(lv_obj_t * obj, int32_t lines); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get a pointer to the style of a span's built-in style. + * Any lv_style_set_... functions can be applied on the returned style. + * @param span pointer to the span + * @return pointer to the style. (valid as long as the span is valid) + */ +lv_style_t * lv_span_get_style(lv_span_t * span); + +/** + * Get a pointer to the text of a span + * @param span pointer to the span + * @return pointer to the text +*/ +const char * lv_span_get_text(lv_span_t * span); + +/** + * Get a spangroup child by its index. + * + * @param obj The spangroup object + * @param id the index of the child. + * 0: the oldest (firstly created) child + * 1: the second oldest + * child count-1: the youngest + * -1: the youngest + * -2: the second youngest + * @return The child span at index `id`, or NULL if the ID does not exist + */ +lv_span_t * lv_spangroup_get_child(const lv_obj_t * obj, int32_t id); + +/** + * Get number of spans + * @param obj the spangroup object to get the child count of. + * @return the span count of the spangroup. + */ +uint32_t lv_spangroup_get_span_count(const lv_obj_t * obj); + +/** + * Get the align of the spangroup. + * @param obj pointer to a spangroup object. + * @return the align value. + */ +lv_text_align_t lv_spangroup_get_align(lv_obj_t * obj); + +/** + * Get the overflow of the spangroup. + * @param obj pointer to a spangroup object. + * @return the overflow value. + */ +lv_span_overflow_t lv_spangroup_get_overflow(lv_obj_t * obj); + +/** + * Get the indent of the spangroup. + * @param obj pointer to a spangroup object. + * @return the indent value. + */ +int32_t lv_spangroup_get_indent(lv_obj_t * obj); + +/** + * Get the mode of the spangroup. + * @param obj pointer to a spangroup object. + */ +lv_span_mode_t lv_spangroup_get_mode(lv_obj_t * obj); + +/** + * Get maximum lines of the spangroup. + * @param obj pointer to a spangroup object. + * @return the max lines value. + */ +int32_t lv_spangroup_get_max_lines(lv_obj_t * obj); + +/** + * Get max line height of all span in the spangroup. + * @param obj pointer to a spangroup object. + */ +int32_t lv_spangroup_get_max_line_height(lv_obj_t * obj); + +/** + * Get the text content width when all span of spangroup on a line. + * @param obj pointer to a spangroup object. + * @param max_width if text content width >= max_width, return max_width + * to reduce computation, if max_width == 0, returns the text content width. + * @return text content width or max_width. + */ +uint32_t lv_spangroup_get_expand_width(lv_obj_t * obj, uint32_t max_width); + +/** + * Get the text content height with width fixed. + * @param obj pointer to a spangroup object. + * @param width the width of the span group. + + */ +int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width); + +/** + * Get the span's coords in the spangroup. + * @note Before calling this function, please make sure that the layout of span group has been updated. + * Like calling lv_obj_update_layout() like function. + * + * +--------+ + * |Heading +--->------------------+ + * | Pos | | Heading | + * +--------+---+------------------+ + * | | + * | | + * | | + * | Middle +--------+| + * | |Trailing|| + * | +-| Pos || + * | | +--------+| + * +-------------------v-----------+ + * | Trailing | + * +-------------------+ + * @param obj pointer to a spangroup object. + * @param span pointer to a span. + * @return the span's coords in the spangroup. + */ +lv_span_coords_t lv_spangroup_get_span_coords(lv_obj_t * obj, const lv_span_t * span); + +/** + * Get the span object by point. + * @param obj pointer to a spangroup object. + * @param point pointer to point containing absolute coordinates + * @return pointer to the span under the point or `NULL` if not found. + */ +lv_span_t * lv_spangroup_get_span_by_point(lv_obj_t * obj, const lv_point_t * point); + +/*===================== + * Other functions + *====================*/ + +/** + * Update the mode of the spangroup. + * @param obj pointer to a spangroup object. + */ +void lv_spangroup_refresh(lv_obj_t * obj); + +#if LV_USE_OBSERVER + +/** + * Bind an integer, string, or pointer Subject to a Spangroup's Span. + * @param obj pointer to Spangroup + * @param span pointer to Span + * @param subject pointer to Subject + * @param fmt optional printf-like format string with 1 format specifier (e.g. "%d °C") + * or NULL to bind to the value directly. + * @return pointer to newly-created Observer + * @note If `fmt == NULL` strings and pointers (`\0` terminated string) will be shown + * as text as they are, integers as %d, floats as %0.1f + */ +lv_observer_t * lv_spangroup_bind_span_text(lv_obj_t * obj, lv_span_t * span, lv_subject_t * subject, const char * fmt); + +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SPAN*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_SPAN_H*/ diff --git a/inc/lvgl/src/widgets/span/lv_span_private.h b/inc/lvgl/src/widgets/span/lv_span_private.h new file mode 100644 index 0000000..3a82013 --- /dev/null +++ b/inc/lvgl/src/widgets/span/lv_span_private.h @@ -0,0 +1,66 @@ +/** + * @file lv_span_private.h + * + */ + +#ifndef LV_SPAN_PRIVATE_H +#define LV_SPAN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_span.h" + +#if LV_USE_SPAN != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_span_t { + char * txt; /**< a pointer to display text */ + lv_style_t style; /**< display text style */ + uint32_t static_flag : 1; /**< the text is static flag */ + + lv_point_t trailing_pos; + int32_t trailing_height; +}; + +/** Data of label*/ +struct _lv_spangroup_t { + lv_obj_t obj; + int32_t lines; + int32_t indent; /**< first line indent */ + int32_t cache_w; /**< the cache automatically calculates the width */ + int32_t cache_h; /**< similar cache_w */ + lv_ll_t child_ll; + uint32_t overflow : 1; /**< details see lv_span_overflow_t */ + uint32_t refresh : 1; /**< the spangroup need refresh cache_w and cache_h */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SPAN != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SPAN_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/spinbox/lv_spinbox.c b/inc/lvgl/src/widgets/spinbox/lv_spinbox.c new file mode 100644 index 0000000..57b29f1 --- /dev/null +++ b/inc/lvgl/src/widgets/spinbox/lv_spinbox.c @@ -0,0 +1,649 @@ +/** + * @file lv_spinbox.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_spinbox_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_SPINBOX + +#include "../../misc/lv_assert.h" +#include "../../indev/lv_indev.h" +#include "../../stdlib/lv_string.h" +#include "../../core/lv_observer_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_spinbox_class) +#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 8U) +#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 4U) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void lv_spinbox_updatevalue(lv_obj_t * obj); + +#if LV_USE_OBSERVER + static void spinbox_value_changed_event_cb(lv_event_t * e); + static void spinbox_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject); +#endif /*LV_USE_OBSERVER*/ + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_spinbox_properties[] = { + { + .id = LV_PROPERTY_SPINBOX_VALUE, + .setter = lv_spinbox_set_value, + .getter = lv_spinbox_get_value, + }, + { + .id = LV_PROPERTY_SPINBOX_ROLLOVER, + .setter = lv_spinbox_set_rollover, + .getter = lv_spinbox_get_rollover, + }, + { + .id = LV_PROPERTY_SPINBOX_DIGIT_COUNT, + .setter = lv_spinbox_set_digit_count, + .getter = lv_spinbox_get_digit_count, + }, + { + .id = LV_PROPERTY_SPINBOX_DEC_POINT_POS, + .setter = lv_spinbox_set_dec_point_pos, + .getter = lv_spinbox_get_dec_point_pos, + }, + { + .id = LV_PROPERTY_SPINBOX_STEP, + .setter = lv_spinbox_set_step, + .getter = lv_spinbox_get_step, + }, + { + .id = LV_PROPERTY_SPINBOX_MIN_VALUE, + .setter = lv_spinbox_set_min_value, + .getter = lv_spinbox_get_min_value, + }, + { + .id = LV_PROPERTY_SPINBOX_MAX_VALUE, + .setter = lv_spinbox_set_max_value, + .getter = lv_spinbox_get_max_value, + }, + { + .id = LV_PROPERTY_SPINBOX_DIGIT_STEP_DIRECTION, + .setter = lv_spinbox_set_digit_step_direction, + .getter = lv_spinbox_get_digit_step_direction, + }, +}; +#endif + +const lv_obj_class_t lv_spinbox_class = { + .constructor_cb = lv_spinbox_constructor, + .event_cb = lv_spinbox_event, + .width_def = LV_DPI_DEF, + .instance_size = sizeof(lv_spinbox_t), + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .base_class = &lv_textarea_class, + .name = "lv_spinbox", + LV_PROPERTY_CLASS_FIELDS(spinbox, SPINBOX) +}; +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_spinbox_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_spinbox_set_value(lv_obj_t * obj, int32_t v) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + if(v > spinbox->range_max) v = spinbox->range_max; + if(v < spinbox->range_min) v = spinbox->range_min; + + spinbox->value = v; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_rollover(lv_obj_t * obj, bool rollover) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->rollover = rollover; +} + +void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + if(digit_count > LV_SPINBOX_MAX_DIGIT_COUNT) digit_count = LV_SPINBOX_MAX_DIGIT_COUNT; + + if(sep_pos >= digit_count) sep_pos = 0; + + if(digit_count < LV_SPINBOX_MAX_DIGIT_COUNT) { + const int64_t max_val = lv_pow(10, digit_count); + if(spinbox->range_max > max_val - 1) spinbox->range_max = max_val - 1; + if(spinbox->range_min < -max_val + 1) spinbox->range_min = -max_val + 1; + } + + spinbox->digit_count = digit_count; + spinbox->dec_point_pos = sep_pos; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_digit_count(lv_obj_t * obj, uint32_t digit_count) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + if(digit_count > LV_SPINBOX_MAX_DIGIT_COUNT) digit_count = LV_SPINBOX_MAX_DIGIT_COUNT; + + spinbox->digit_count = digit_count; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_dec_point_pos(lv_obj_t * obj, uint32_t dec_point_pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->dec_point_pos = dec_point_pos; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->step = step; + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_range(lv_obj_t * obj, int32_t min_value, int32_t max_value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->range_max = max_value; + spinbox->range_min = min_value; + + if(spinbox->value > spinbox->range_max) spinbox->value = spinbox->range_max; + if(spinbox->value < spinbox->range_min) spinbox->value = spinbox->range_min; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_min_value(lv_obj_t * obj, int32_t min_value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->range_min = min_value; + + if(spinbox->value < spinbox->range_min) spinbox->value = spinbox->range_min; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_max_value(lv_obj_t * obj, int32_t max_value) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + spinbox->range_max = max_value; + + if(spinbox->value > spinbox->range_max) spinbox->value = spinbox->range_max; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint32_t pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + const int32_t step_limit = LV_MAX(spinbox->range_max, LV_ABS(spinbox->range_min)); + const int32_t new_step = lv_pow(10, pos); + + if(pos <= 0) spinbox->step = 1; + else if(new_step <= step_limit) spinbox->step = new_step; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + spinbox->digit_step_dir = direction; + + lv_spinbox_updatevalue(obj); +} +/*===================== + * Getter functions + *====================*/ + +int32_t lv_spinbox_get_value(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + return spinbox->value; +} + +int32_t lv_spinbox_get_step(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + return spinbox->step; +} + +/*===================== + * Other functions + *====================*/ + +void lv_spinbox_step_next(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + const int32_t new_step = spinbox->step / 10; + spinbox->step = (new_step > 0) ? new_step : 1; + + lv_spinbox_updatevalue(obj); +} + +void lv_spinbox_step_prev(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + const int32_t step_limit = LV_MAX(spinbox->range_max, LV_ABS(spinbox->range_min)); + const int32_t new_step = spinbox->step * 10; + if(new_step <= step_limit) spinbox->step = new_step; + + lv_spinbox_updatevalue(obj); +} + +bool lv_spinbox_get_rollover(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + return spinbox->rollover; +} + +uint32_t lv_spinbox_get_digit_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + return spinbox->digit_count; +} + +uint32_t lv_spinbox_get_dec_point_pos(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + return spinbox->dec_point_pos; +} + +int32_t lv_spinbox_get_min_value(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + return spinbox->range_min; +} + +int32_t lv_spinbox_get_max_value(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + return spinbox->range_max; +} + +lv_dir_t lv_spinbox_get_digit_step_direction(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + return spinbox->digit_step_dir; +} + +void lv_spinbox_increment(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + int32_t v = spinbox->value; + /* Special mode when zero crossing. E.g -3+10 should be 3, not 7. + * Pretend we are on -7 now.*/ + if((spinbox->value < 0) && (spinbox->value + spinbox->step) > 0) { + v = -(spinbox->step + spinbox->value); + } + + if(v + spinbox->step <= spinbox->range_max) { + v += spinbox->step; + } + else { + /*Rollover?*/ + if((spinbox->rollover) && (spinbox->value == spinbox->range_max)) + v = spinbox->range_min; + else + v = spinbox->range_max; + } + + if(v != spinbox->value) { + spinbox->value = v; + lv_spinbox_updatevalue(obj); + } +} + +void lv_spinbox_decrement(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + int32_t v = spinbox->value; + /* Special mode when zero crossing. E.g 3-10 should be -3, not -7. + * Pretend we are on 7 now.*/ + if((spinbox->value > 0) && (spinbox->value - spinbox->step) < 0) { + v = spinbox->step - spinbox->value; + } + + if(v - spinbox->step >= spinbox->range_min) { + v -= spinbox->step; + } + else { + /*Rollover?*/ + if((spinbox->rollover) && (spinbox->value == spinbox->range_min)) + v = spinbox->range_max; + else + v = spinbox->range_min; + } + + if(v != spinbox->value) { + spinbox->value = v; + lv_spinbox_updatevalue(obj); + } +} + +#if LV_USE_OBSERVER +lv_observer_t * lv_spinbox_bind_value(lv_obj_t * obj, lv_subject_t * subject) +{ + LV_ASSERT_NULL(subject); + LV_ASSERT_NULL(obj); + + if(subject->type != LV_SUBJECT_TYPE_INT && subject->type != LV_SUBJECT_TYPE_FLOAT) { + LV_LOG_WARN("Incompatible subject type: %d", subject->type); + return NULL; + } + + lv_obj_add_event_cb(obj, spinbox_value_changed_event_cb, LV_EVENT_VALUE_CHANGED, subject); + + lv_observer_t * observer = lv_subject_add_observer_obj(subject, spinbox_value_observer_cb, obj, NULL); + return observer; +} +#endif /*LV_USE_OBSERVER*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_spinbox_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_LOG_TRACE("begin"); + + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + /*Initialize the allocated 'ext'*/ + spinbox->value = 0; + spinbox->dec_point_pos = 0; + spinbox->digit_count = 5; + spinbox->step = 1; + spinbox->range_max = 99999; + spinbox->range_min = -99999; + spinbox->rollover = false; + spinbox->digit_step_dir = LV_DIR_RIGHT; + + lv_textarea_set_one_line(obj, true); + lv_textarea_set_cursor_click_pos(obj, true); + + lv_spinbox_updatevalue(obj); + + LV_LOG_TRACE("Spinbox constructor finished"); +} + +static void lv_spinbox_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + /*Call the ancestor's event handler*/ + lv_result_t res = LV_RESULT_OK; + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + const lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + if(code == LV_EVENT_RELEASED) { + /*If released with an ENCODER then move to the next digit*/ + lv_indev_t * indev = lv_indev_active(); + if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER && lv_group_get_editing(lv_obj_get_group(obj))) { + if(spinbox->digit_count > 1) { + if(spinbox->digit_step_dir == LV_DIR_RIGHT) { + if(spinbox->step > 1) { + lv_spinbox_step_next(obj); + } + else { + /*Restart from the MSB*/ + spinbox->step = lv_pow(10, spinbox->digit_count - 2); + lv_spinbox_step_prev(obj); + } + } + else { + if(spinbox->step < lv_pow(10, spinbox->digit_count - 1)) { + lv_spinbox_step_prev(obj); + } + else { + /*Restart from the LSB*/ + spinbox->step = 10; + lv_spinbox_step_next(obj); + } + } + } + } + /*The cursor has been positioned to a digit. + * Set `step` accordingly*/ + else { + const char * txt = lv_textarea_get_text(obj); + const size_t txt_len = lv_strlen(txt); + + /* Check cursor position */ + /* Cursor is in '.' digit */ + if(txt[spinbox->ta.cursor.pos] == '.') { + lv_textarea_cursor_left(obj); + } + /* Cursor is already in the right-most digit */ + else if(spinbox->ta.cursor.pos == (uint32_t)txt_len) { + lv_textarea_set_cursor_pos(obj, txt_len - 1); + } + /* Cursor is already in the left-most digit AND range_min is negative */ + else if(spinbox->ta.cursor.pos == 0 && spinbox->range_min < 0) { + lv_textarea_set_cursor_pos(obj, 1); + } + + /* Handle spinbox with decimal point (spinbox->dec_point_pos != 0) */ + uint32_t cp = spinbox->ta.cursor.pos; + if(spinbox->ta.cursor.pos > spinbox->dec_point_pos && spinbox->dec_point_pos != 0) cp--; + + const size_t len = spinbox->digit_count - 1; + uint32_t pos = len - cp; + + if(spinbox->range_min < 0) pos++; + + spinbox->step = 1; + uint32_t i; + for(i = 0; i < pos; i++) spinbox->step *= 10; + + lv_spinbox_updatevalue(obj); + } + } + else if(code == LV_EVENT_KEY) { + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + + uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/ + if(c == LV_KEY_RIGHT) { + if(indev_type == LV_INDEV_TYPE_ENCODER) + lv_spinbox_increment(obj); + else + lv_spinbox_step_next(obj); + } + else if(c == LV_KEY_LEFT) { + if(indev_type == LV_INDEV_TYPE_ENCODER) + lv_spinbox_decrement(obj); + else + lv_spinbox_step_prev(obj); + } + else if(c == LV_KEY_UP) { + lv_spinbox_increment(obj); + } + else if(c == LV_KEY_DOWN) { + lv_spinbox_decrement(obj); + } + else { + lv_textarea_add_char(obj, c); + } + } +} + +static void lv_spinbox_updatevalue(lv_obj_t * obj) +{ + lv_spinbox_t * spinbox = (lv_spinbox_t *)obj; + + /* LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES (18): Max possible digit_count value (15) + sign + decimal point + NULL terminator */ + char textarea_txt[LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES] = {0U}; + char * buf_p = textarea_txt; + + uint32_t cur_shift_left = 0; + if(spinbox->range_min < 0) { /*hide sign if there are only positive values*/ + /*Add the sign*/ + (*buf_p) = spinbox->value >= 0 ? '+' : '-'; + buf_p++; + } + else { + /*Cursor need shift to left*/ + cur_shift_left++; + } + + /*Convert the numbers to string (the sign is already handled so always convert positive number)*/ + char digits[LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES]; + lv_snprintf(digits, LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES, "%" LV_PRId32, LV_ABS(spinbox->value)); + + /*Add leading zeros*/ + int32_t i; + const size_t digits_len = lv_strlen(digits); + + const int leading_zeros_cnt = spinbox->digit_count - digits_len; + if(leading_zeros_cnt > 0) { + for(i = (int32_t) digits_len; i >= 0; i--) { + digits[i + leading_zeros_cnt] = digits[i]; + } + /* NOTE: Substitute with memset? */ + for(i = 0; i < leading_zeros_cnt; i++) { + digits[i] = '0'; + } + } + + /*Add the decimal part*/ + const uint32_t int_digits = (spinbox->dec_point_pos == 0) ? spinbox->digit_count : spinbox->dec_point_pos; + for(i = 0; i < (int32_t)int_digits && digits[i] != '\0'; i++) { + (*buf_p) = digits[i]; + buf_p++; + } + + /*Insert the decimal point*/ + if(spinbox->dec_point_pos) { + (*buf_p) = '.'; + buf_p++; + + for(/*Leave i*/; i < spinbox->digit_count && digits[i] != '\0'; i++) { + (*buf_p) = digits[i]; + buf_p++; + } + } + + /*Refresh the text*/ + lv_textarea_set_text(obj, (char *)textarea_txt); + + /*Set the cursor position*/ + int32_t step = spinbox->step; + uint32_t cur_pos = (uint32_t)spinbox->digit_count; + while(step >= 10) { + step /= 10; + cur_pos--; + } + + if(cur_pos > int_digits) cur_pos++; /*Skip the decimal point*/ + + cur_pos -= cur_shift_left; + + lv_textarea_set_cursor_pos(obj, cur_pos); +} + + +#if LV_USE_OBSERVER + +static void spinbox_value_changed_event_cb(lv_event_t * e) +{ + lv_obj_t * arc = lv_event_get_current_target(e); + lv_subject_t * subject = lv_event_get_user_data(e); + + if(subject->type == LV_SUBJECT_TYPE_INT) { + lv_subject_set_int(subject, lv_spinbox_get_value(arc)); + } +} + +static void spinbox_value_observer_cb(lv_observer_t * observer, lv_subject_t * subject) +{ + if(subject->type == LV_SUBJECT_TYPE_INT) { + lv_spinbox_set_value(observer->target, subject->value.num); + } +} + +#endif /*LV_USE_OBSERVER*/ + + +#endif /*LV_USE_SPINBOX*/ diff --git a/inc/lvgl/src/widgets/spinbox/lv_spinbox.h b/inc/lvgl/src/widgets/spinbox/lv_spinbox.h new file mode 100644 index 0000000..f31b2d5 --- /dev/null +++ b/inc/lvgl/src/widgets/spinbox/lv_spinbox.h @@ -0,0 +1,253 @@ +/** + * @file lv_spinbox.h + * + */ + +#ifndef LV_SPINBOX_H +#define LV_SPINBOX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../textarea/lv_textarea.h" + +#if LV_USE_SPINBOX + +/*Testing of dependencies*/ +#if LV_USE_TEXTAREA == 0 +#error "lv_spinbox: lv_ta is required. Enable it in lv_conf.h (LV_USE_TEXTAREA 1) " +#endif + +/********************* + * DEFINES + *********************/ +#define LV_SPINBOX_MAX_DIGIT_COUNT 10 + +/********************** + * TYPEDEFS + **********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spinbox_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_spinbox_id_t { + LV_PROPERTY_ID(SPINBOX, VALUE, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(SPINBOX, ROLLOVER, LV_PROPERTY_TYPE_BOOL, 1), + LV_PROPERTY_ID(SPINBOX, DIGIT_COUNT, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(SPINBOX, DEC_POINT_POS, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(SPINBOX, STEP, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_ID(SPINBOX, MIN_VALUE, LV_PROPERTY_TYPE_INT, 5), + LV_PROPERTY_ID(SPINBOX, MAX_VALUE, LV_PROPERTY_TYPE_INT, 6), + LV_PROPERTY_ID(SPINBOX, DIGIT_STEP_DIRECTION, LV_PROPERTY_TYPE_INT, 7), + LV_PROPERTY_SPINBOX_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a spinbox object + * @param parent pointer to an object, it will be the parent of the new spinbox + * @return pointer to the created spinbox + */ +lv_obj_t * lv_spinbox_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set spinbox value + * @param obj pointer to spinbox + * @param v value to be set + */ +void lv_spinbox_set_value(lv_obj_t * obj, int32_t v); + +/** + * Set spinbox rollover function + * @param obj pointer to spinbox + * @param rollover true or false to enable or disable (default) + */ +void lv_spinbox_set_rollover(lv_obj_t * obj, bool rollover); + +/** + * Set spinbox digit format (digit count and decimal format) + * @param obj pointer to spinbox + * @param digit_count number of digit excluding the decimal separator and the sign + * @param sep_pos number of digit before the decimal point. If 0, decimal point is not + * shown + */ +void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos); + +/** + * Set the number of digits + * @param obj pointer to spinbox + * @param digit_count number of digits + */ +void lv_spinbox_set_digit_count(lv_obj_t * obj, uint32_t digit_count); + +/** + * Set the position of the decimal point + * @param obj pointer to spinbox + * @param dec_point_pos 0: there is no separator, 2: two integer digits + */ +void lv_spinbox_set_dec_point_pos(lv_obj_t * obj, uint32_t dec_point_pos); + +/** + * Set spinbox step + * @param obj pointer to spinbox + * @param step steps on increment/decrement. Can be 1, 10, 100, 1000, etc the digit that will change. + */ +void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step); + +/** + * Set spinbox value range + * @param obj pointer to spinbox + * @param min_value minimum value, inclusive + * @param max_value maximum value, inclusive + */ +void lv_spinbox_set_range(lv_obj_t * obj, int32_t min_value, int32_t max_value); + +/** + * Set the minimum value + * @param obj pointer to spinbox + * @param min_value the minimum value + */ +void lv_spinbox_set_min_value(lv_obj_t * obj, int32_t min_value); + +/** + * Set the maximum value + * @param obj pointer to spinbox + * @param max_value the maximum value + */ +void lv_spinbox_set_max_value(lv_obj_t * obj, int32_t max_value); + +/** + * Set cursor position to a specific digit for edition + * @param obj pointer to spinbox + * @param pos selected position in spinbox + */ +void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint32_t pos); + +/** + * Set direction of digit step when clicking an encoder button while in editing mode + * @param obj pointer to spinbox + * @param direction the direction (LV_DIR_RIGHT or LV_DIR_LEFT) + */ +void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get spinbox rollover function status + * @param obj pointer to spinbox + */ +bool lv_spinbox_get_rollover(lv_obj_t * obj); + +/** + * Get the spinbox numeral value (user has to convert to float according to its digit format) + * @param obj pointer to spinbox + * @return value integer value of the spinbox + */ +int32_t lv_spinbox_get_value(lv_obj_t * obj); + +/** + * Get the spinbox step value (user has to convert to float according to its digit format) + * @param obj pointer to spinbox + * @return value integer step value of the spinbox + */ +int32_t lv_spinbox_get_step(lv_obj_t * obj); + +/** + * Get the spinbox digit count + * @param obj pointer to spinbox + * @return number of digits + */ +uint32_t lv_spinbox_get_digit_count(lv_obj_t * obj); + +/** + * Get the decimal point position + * @param obj pointer to spinbox + * @return decimal point position + */ +uint32_t lv_spinbox_get_dec_point_pos(lv_obj_t * obj); + +/** + * Get the spinbox minimum value + * @param obj pointer to spinbox + * @return minimum value + */ +int32_t lv_spinbox_get_min_value(lv_obj_t * obj); + +/** + * Get the spinbox maximum value + * @param obj pointer to spinbox + * @return maximum value + */ +int32_t lv_spinbox_get_max_value(lv_obj_t * obj); + +/** + * Get the digit step direction + * @param obj pointer to spinbox + * @return direction (LV_DIR_RIGHT or LV_DIR_LEFT) + */ +lv_dir_t lv_spinbox_get_digit_step_direction(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Select next lower digit for edition by dividing the step by 10 + * @param obj pointer to spinbox + */ +void lv_spinbox_step_next(lv_obj_t * obj); + +/** + * Select next higher digit for edition by multiplying the step by 10 + * @param obj pointer to spinbox + */ +void lv_spinbox_step_prev(lv_obj_t * obj); + +/** + * Increment spinbox value by one step + * @param obj pointer to spinbox + */ +void lv_spinbox_increment(lv_obj_t * obj); + +/** + * Decrement spinbox value by one step + * @param obj pointer to spinbox + */ +void lv_spinbox_decrement(lv_obj_t * obj); + + + +#if LV_USE_OBSERVER +/** + * Bind an integer subject to a Spinbox's value. + * @param obj pointer to Spinbox + * @param subject pointer to Subject + * @return pointer to newly-created Observer + */ +lv_observer_t * lv_spinbox_bind_value(lv_obj_t * obj, lv_subject_t * subject); +#endif + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SPINBOX*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif +#endif /*LV_SPINBOX_H*/ diff --git a/inc/lvgl/src/widgets/spinbox/lv_spinbox_private.h b/inc/lvgl/src/widgets/spinbox/lv_spinbox_private.h new file mode 100644 index 0000000..333bd50 --- /dev/null +++ b/inc/lvgl/src/widgets/spinbox/lv_spinbox_private.h @@ -0,0 +1,59 @@ +/** + * @file lv_spinbox_private.h + * + */ + +#ifndef LV_SPINBOX_PRIVATE_H +#define LV_SPINBOX_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../textarea/lv_textarea_private.h" +#include "lv_spinbox.h" + +#if LV_USE_SPINBOX + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Data of spinbox */ +struct _lv_spinbox_t { + lv_textarea_t ta; /**< Ext. of ancestor */ + /*New data for this type*/ + int32_t value; + int32_t range_max; + int32_t range_min; + int32_t step; + uint32_t digit_count : 4; + uint32_t dec_point_pos : 4; /**< if 0, there is no separator and the number is an integer */ + uint32_t rollover : 1; /**< Set to true for rollover functionality */ + uint32_t digit_step_dir : 2; /**< the direction the digit will step on encoder button press when editing */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SPINBOX */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SPINBOX_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/spinner/lv_spinner.c b/inc/lvgl/src/widgets/spinner/lv_spinner.c new file mode 100644 index 0000000..23c3a74 --- /dev/null +++ b/inc/lvgl/src/widgets/spinner/lv_spinner.c @@ -0,0 +1,163 @@ +/** + * @file lv_spinner.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "lv_spinner_private.h" +#if LV_USE_SPINNER + +#include "../../misc/lv_anim_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../core/lv_obj_property.h" + +/********************* + * DEFINES + *********************/ +#define DEF_ARC_ANGLE 200 +#define DEF_TIME 1000 +#define MY_CLASS (&lv_spinner_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void arc_anim_start_angle(void * obj, int32_t v); +static void arc_anim_end_angle(void * obj, int32_t v); + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_spinner_properties[] = { + { + .id = LV_PROPERTY_SPINNER_ANIM_DURATION, + .setter = lv_spinner_set_anim_duration, + .getter = lv_spinner_get_anim_duration, + }, + { + .id = LV_PROPERTY_SPINNER_ARC_SWEEP, + .setter = lv_spinner_set_arc_sweep, + .getter = lv_spinner_get_arc_sweep, + }, +}; +#endif + +const lv_obj_class_t lv_spinner_class = { + .base_class = &lv_arc_class, + .constructor_cb = lv_spinner_constructor, + .name = "lv_spinner", + .instance_size = sizeof(lv_spinner_t), + LV_PROPERTY_CLASS_FIELDS(spinner, SPINNER) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_spinner_create(lv_obj_t * parent) +{ + lv_obj_t * obj = lv_obj_class_create_obj(&lv_spinner_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +void lv_spinner_set_anim_params(lv_obj_t * obj, uint32_t t, uint32_t angle) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinner_t * spinner = (lv_spinner_t *)obj; + + spinner->duration = t; + spinner->angle = angle; + + /*Delete the current animation*/ + lv_anim_delete(obj, NULL); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, obj); + lv_anim_set_exec_cb(&a, arc_anim_end_angle); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_set_duration(&a, t); + lv_anim_set_values(&a, angle, 360 + angle); + lv_anim_start(&a); + + lv_anim_set_path_cb(&a, lv_anim_path_custom_bezier3); + lv_anim_set_bezier3_param(&a, LV_BEZIER_VAL_FLOAT(0.42), LV_BEZIER_VAL_FLOAT(0.58), + LV_BEZIER_VAL_FLOAT(0), LV_BEZIER_VAL_FLOAT(1)); + lv_anim_set_values(&a, 0, 360); + lv_anim_set_exec_cb(&a, arc_anim_start_angle); + lv_anim_start(&a); + + lv_arc_set_bg_angles(obj, 0, 360); + lv_arc_set_rotation(obj, 270); +} + +void lv_spinner_set_anim_duration(lv_obj_t * obj, uint32_t t) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinner_t * spinner = (lv_spinner_t *)obj; + + lv_spinner_set_anim_params(obj, t, spinner->angle); +} + +void lv_spinner_set_arc_sweep(lv_obj_t * obj, uint32_t angle) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinner_t * spinner = (lv_spinner_t *)obj; + + lv_spinner_set_anim_params(obj, spinner->duration, angle); +} + +uint32_t lv_spinner_get_anim_duration(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinner_t * spinner = (lv_spinner_t *)obj; + return spinner->duration; +} + +uint32_t lv_spinner_get_arc_sweep(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_spinner_t * spinner = (lv_spinner_t *)obj; + return spinner->angle; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_spinner_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_TRACE_OBJ_CREATE("begin"); + + LV_UNUSED(class_p); + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_CLICKABLE); + + lv_spinner_set_anim_params(obj, DEF_TIME, DEF_ARC_ANGLE); +} + +static void arc_anim_start_angle(void * obj, int32_t v) +{ + lv_arc_set_start_angle(obj, (uint32_t) v); +} + +static void arc_anim_end_angle(void * obj, int32_t v) +{ + lv_arc_set_end_angle(obj, (uint32_t) v); +} + +#endif /*LV_USE_SPINNER*/ diff --git a/inc/lvgl/src/widgets/spinner/lv_spinner.h b/inc/lvgl/src/widgets/spinner/lv_spinner.h new file mode 100644 index 0000000..4a3e5f5 --- /dev/null +++ b/inc/lvgl/src/widgets/spinner/lv_spinner.h @@ -0,0 +1,104 @@ +/** + * @file lv_spinner.h + * + */ + +#ifndef LV_SPINNER_H +#define LV_SPINNER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_SPINNER + +#include "../../misc/lv_types.h" +#include "../../core/lv_obj_property.h" + +/*Testing of dependencies*/ +#if LV_USE_ARC == 0 +#error "lv_spinner: lv_arc is required. Enable it in lv_conf.h (LV_USE_ARC 1) " +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_spinner_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_spinner_id_t { + LV_PROPERTY_ID(SPINNER, ANIM_DURATION, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(SPINNER, ARC_SWEEP, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_SPINNER_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a spinner widget + * @param parent pointer to an object, it will be the parent of the new spinner. + * @return the created spinner + */ +lv_obj_t * lv_spinner_create(lv_obj_t * parent); + +/** + * Set the animation time and arc length of the spinner + * The animation is suited for angle values between 180 and 360. + * @param obj pointer to a spinner + * @param t the animation time in milliseconds + * @param angle the angle of the arc in degrees + */ +void lv_spinner_set_anim_params(lv_obj_t * obj, uint32_t t, uint32_t angle); + +/** + * Set the animation time of the spinner + * @param obj pointer to a spinner + * @param t the animation time in milliseconds + */ +void lv_spinner_set_anim_duration(lv_obj_t * obj, uint32_t t); + +/** + * Set the animation arc length of the spinner. + * The animation is suited to values between 180 and 360. + * @param obj pointer to a spinner + * @param angle the angle of the arc in degrees + */ +void lv_spinner_set_arc_sweep(lv_obj_t * obj, uint32_t angle); + +/** + * Get the animation duration of the spinner + * @param obj pointer to a spinner + * @return the animation time in milliseconds + */ +uint32_t lv_spinner_get_anim_duration(lv_obj_t * obj); + +/** + * Get the animation arc length of the spinner + * @param obj pointer to a spinner + * @return the angle of the arc in degrees + */ +uint32_t lv_spinner_get_arc_sweep(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SPINNER*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SPINNER_H*/ diff --git a/inc/lvgl/src/widgets/spinner/lv_spinner_private.h b/inc/lvgl/src/widgets/spinner/lv_spinner_private.h new file mode 100644 index 0000000..579dcd4 --- /dev/null +++ b/inc/lvgl/src/widgets/spinner/lv_spinner_private.h @@ -0,0 +1,50 @@ +/** + * @file lv_spinner_private.h + * + */ + +#ifndef LV_SPINNER_PRIVATE_H +#define LV_SPINNER_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_spinner.h" +#if LV_USE_SPINNER + +#include "../arc/lv_arc_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_spinner_t { + lv_arc_t arc; /**< Add the ancestor's type first */ + uint32_t duration; /**< Anim duration in ms */ + uint32_t angle; /**< Anim angle in degrees */ +}; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_SPINNER_PRIVATE_H*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SPINNER_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/switch/lv_switch.c b/inc/lvgl/src/widgets/switch/lv_switch.c new file mode 100644 index 0000000..0b1b14f --- /dev/null +++ b/inc/lvgl/src/widgets/switch/lv_switch.c @@ -0,0 +1,354 @@ +/** + * @file lv_switch.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_switch_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" + +#if LV_USE_SWITCH != 0 + +#include "../../misc/lv_assert.h" +#include "../../misc/lv_math.h" +#include "../../misc/lv_anim_private.h" +#include "../../indev/lv_indev.h" +#include "../../display/lv_display.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_switch_class) + +#define LV_SWITCH_IS_ANIMATING(sw) (((sw)->anim_state) != LV_SWITCH_ANIM_STATE_INV) + +/** Switch animation start value. (Not the real value of the switch just indicates process animation)*/ +#define LV_SWITCH_ANIM_STATE_START 0 + +/** Switch animation end value. (Not the real value of the switch just indicates process animation)*/ +#define LV_SWITCH_ANIM_STATE_END 256 + +/** Mark no animation is in progress*/ +#define LV_SWITCH_ANIM_STATE_INV -1 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_switch_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_switch_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_switch_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); + +static void lv_switch_anim_exec_cb(void * sw, int32_t value); +static void lv_switch_trigger_anim(lv_obj_t * obj); +static void lv_switch_anim_completed(lv_anim_t * a); + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_switch_properties[] = { + { + .id = LV_PROPERTY_SWITCH_ORIENTATION, + .setter = lv_switch_set_orientation, + .getter = lv_switch_get_orientation, + }, +}; +#endif + +const lv_obj_class_t lv_switch_class = { + .constructor_cb = lv_switch_constructor, + .destructor_cb = lv_switch_destructor, + .event_cb = lv_switch_event, + .width_def = (4 * LV_DPI_DEF) / 10, + .height_def = (4 * LV_DPI_DEF) / 17, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_switch_t), + .base_class = &lv_obj_class, + .name = "lv_switch", + LV_PROPERTY_CLASS_FIELDS(switch, SWITCH) +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_switch_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_switch_set_orientation(lv_obj_t * obj, lv_switch_orientation_t orientation) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_switch_t * sw = (lv_switch_t *)obj; + + sw->orientation = orientation; + lv_obj_invalidate(obj); +} + +/*===================== + * Getter functions + *====================*/ + +lv_switch_orientation_t lv_switch_get_orientation(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_switch_t * sw = (lv_switch_t *)obj; + + return sw->orientation; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_switch_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_switch_t * sw = (lv_switch_t *)obj; + + sw->anim_state = LV_SWITCH_ANIM_STATE_INV; + sw->orientation = LV_SWITCH_ORIENTATION_AUTO; + + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_CHECKABLE); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_switch_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_switch_t * sw = (lv_switch_t *)obj; + + lv_anim_delete(sw, NULL); +} + +static void lv_switch_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) { + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + /*The smaller size is the knob diameter*/ + int32_t knob_size = LV_MAX4(knob_left, knob_right, knob_bottom, knob_top); + knob_size += LV_SWITCH_KNOB_EXT_AREA_CORRECTION; + knob_size += lv_obj_calculate_ext_draw_size(obj, LV_PART_KNOB); + + int32_t * s = lv_event_get_param(e); + *s = LV_MAX(*s, knob_size); + *s = LV_MAX(*s, lv_obj_calculate_ext_draw_size(obj, LV_PART_INDICATOR)); + } + else if(code == LV_EVENT_STATE_CHANGED) { + lv_state_t prev_state = lv_event_get_prev_state(e); + lv_state_t diff = prev_state ^ lv_obj_get_state(obj); + + if(diff & LV_STATE_CHECKED) { + lv_switch_trigger_anim(obj); + lv_obj_invalidate(obj); + } + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_switch_t * sw = (lv_switch_t *)obj; + + lv_layer_t * layer = lv_event_get_layer(e); + + /*Draw the indicator*/ + lv_area_t indic_area; + /*Exclude background's padding*/ + lv_obj_get_content_coords(obj, &indic_area); + + lv_draw_rect_dsc_t draw_indic_dsc; + lv_draw_rect_dsc_init(&draw_indic_dsc); + draw_indic_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_INDICATOR, &draw_indic_dsc); + lv_draw_rect(layer, &draw_indic_dsc, &indic_area); + + /*Draw the knob*/ + lv_area_t knob_area; + lv_area_copy(&knob_area, &obj->coords); + + int32_t switch_w = lv_area_get_width(&obj->coords); + int32_t switch_h = lv_area_get_height(&obj->coords); + bool hor = false; + + switch(sw->orientation) { + case LV_SWITCH_ORIENTATION_HORIZONTAL: + hor = true; + break; + case LV_SWITCH_ORIENTATION_VERTICAL: + hor = false; + break; + case LV_SWITCH_ORIENTATION_AUTO: + default: + hor = (switch_w >= switch_h); + break; + } + + if(hor) { + int32_t anim_value_x = 0; + int32_t knob_size = lv_obj_get_height(obj); + int32_t anim_length = lv_area_get_width(&obj->coords) - knob_size; + if(LV_SWITCH_IS_ANIMATING(sw)) { + /* Use the animation's coordinate */ + anim_value_x = (anim_length * sw->anim_state) / LV_SWITCH_ANIM_STATE_END; + } + else { + /* Use LV_STATE_CHECKED to decide the coordinate */ + bool chk = lv_obj_get_state(obj) & LV_STATE_CHECKED; + anim_value_x = chk ? anim_length : 0; + } + + if(LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN)) { + anim_value_x = anim_length - anim_value_x; + } + knob_area.x1 += anim_value_x; + knob_area.x2 = knob_area.x1 + (knob_size > 0 ? knob_size - 1 : 0); + } + else { + int32_t anim_value_y = 0; + int32_t knob_size = lv_obj_get_width(obj); + int32_t anim_length = lv_area_get_height(&obj->coords) - knob_size; + if(LV_SWITCH_IS_ANIMATING(sw)) { + /* Use the animation's coordinate */ + anim_value_y = (anim_length * sw->anim_state) / LV_SWITCH_ANIM_STATE_END; + } + else { + /* Use LV_STATE_CHECKED to decide the coordinate */ + bool chk = lv_obj_get_state(obj) & LV_STATE_CHECKED; + anim_value_y = chk ? anim_length : 0; + } + + if(LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN)) { + anim_value_y = anim_length - anim_value_y; + } + + knob_area.y2 -= anim_value_y; + knob_area.y1 = knob_area.y2 - (knob_size > 0 ? knob_size - 1 : 0); + } + + int32_t knob_left = lv_obj_get_style_pad_left(obj, LV_PART_KNOB); + int32_t knob_right = lv_obj_get_style_pad_right(obj, LV_PART_KNOB); + int32_t knob_top = lv_obj_get_style_pad_top(obj, LV_PART_KNOB); + int32_t knob_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_KNOB); + + /*Apply the paddings on the knob area*/ + knob_area.x1 -= knob_left; + knob_area.x2 += knob_right; + knob_area.y1 -= knob_top; + knob_area.y2 += knob_bottom; + + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + knob_rect_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_KNOB, &knob_rect_dsc); + + lv_draw_rect(layer, &knob_rect_dsc, &knob_area); +} + +static void lv_switch_anim_exec_cb(void * var, int32_t value) +{ + lv_switch_t * sw = var; + sw->anim_state = value; + lv_obj_invalidate((lv_obj_t *)sw); +} + +/** + * Resets the switch's animation state to "no animation in progress". + */ +static void lv_switch_anim_completed(lv_anim_t * a) +{ + lv_switch_t * sw = a->var; + sw->anim_state = LV_SWITCH_ANIM_STATE_INV; + lv_obj_invalidate((lv_obj_t *)sw); +} + +/** + * Starts an animation for the switch knob. if the anim_time style property is greater than 0 + * @param obj the switch to animate + */ +static void lv_switch_trigger_anim(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + /*If the widget is not rendered yet show state changes immediately*/ + if(!obj->rendered) return; + + lv_switch_t * sw = (lv_switch_t *)obj; + + uint32_t anim_dur_full = lv_obj_get_style_anim_duration(obj, LV_PART_MAIN); + + if(anim_dur_full > 0) { + bool chk = lv_obj_get_state(obj) & LV_STATE_CHECKED; + int32_t anim_start; + int32_t anim_end; + /*No animation in progress -> simply set the values*/ + if(sw->anim_state == LV_SWITCH_ANIM_STATE_INV) { + anim_start = chk ? LV_SWITCH_ANIM_STATE_START : LV_SWITCH_ANIM_STATE_END; + anim_end = chk ? LV_SWITCH_ANIM_STATE_END : LV_SWITCH_ANIM_STATE_START; + } + /*Animation in progress. Start from the animation end value*/ + else { + anim_start = sw->anim_state; + anim_end = chk ? LV_SWITCH_ANIM_STATE_END : LV_SWITCH_ANIM_STATE_START; + } + /*Calculate actual animation duration*/ + uint32_t anim_dur = (anim_dur_full * LV_ABS(anim_start - anim_end)) / LV_SWITCH_ANIM_STATE_END; + + /*Stop the previous animation if it exists*/ + lv_anim_delete(sw, NULL); + + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, sw); + lv_anim_set_exec_cb(&a, lv_switch_anim_exec_cb); + lv_anim_set_values(&a, anim_start, anim_end); + lv_anim_set_completed_cb(&a, lv_switch_anim_completed); + lv_anim_set_duration(&a, anim_dur); + lv_anim_start(&a); + } +} + +#endif diff --git a/inc/lvgl/src/widgets/switch/lv_switch.h b/inc/lvgl/src/widgets/switch/lv_switch.h new file mode 100644 index 0000000..25b0ed8 --- /dev/null +++ b/inc/lvgl/src/widgets/switch/lv_switch.h @@ -0,0 +1,91 @@ +/** + * @file lv_switch.h + * + */ + +#ifndef LV_SWITCH_H +#define LV_SWITCH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" + +#if LV_USE_SWITCH != 0 + +#include "../../core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/** Switch knob extra area correction factor */ +#define LV_SWITCH_KNOB_EXT_AREA_CORRECTION 2 + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_switch_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_switch_id_t { + LV_PROPERTY_ID(SWITCH, ORIENTATION, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_SWITCH_END, +}; +#endif + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_SWITCH_ORIENTATION_AUTO, + LV_SWITCH_ORIENTATION_HORIZONTAL, + LV_SWITCH_ORIENTATION_VERTICAL +} lv_switch_orientation_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a switch object + * @param parent pointer to an object, it will be the parent of the new switch + * @return pointer to the created switch + */ +lv_obj_t * lv_switch_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the orientation of switch. + * @param obj pointer to switch object + * @param orientation switch orientation from `lv_switch_orientation_t` + */ +void lv_switch_set_orientation(lv_obj_t * obj, lv_switch_orientation_t orientation); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the orientation of switch. + * @param obj pointer to switch object + * @return switch orientation from ::lv_switch_orientation_t + */ +lv_switch_orientation_t lv_switch_get_orientation(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_SWITCH*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SWITCH_H*/ diff --git a/inc/lvgl/src/widgets/switch/lv_switch_private.h b/inc/lvgl/src/widgets/switch/lv_switch_private.h new file mode 100644 index 0000000..66e90d3 --- /dev/null +++ b/inc/lvgl/src/widgets/switch/lv_switch_private.h @@ -0,0 +1,55 @@ +/** + * @file lv_switch_private.h + * + */ + +#ifndef LV_SWITCH_PRIVATE_H +#define LV_SWITCH_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_switch.h" + +#if LV_USE_SWITCH != 0 +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_switch_t { + lv_obj_t obj; + int32_t anim_state; + lv_switch_orientation_t orientation : 3; /**< Orientation of switch*/ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_SWITCH != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_SWITCH_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/table/lv_table.c b/inc/lvgl/src/widgets/table/lv_table.c new file mode 100644 index 0000000..0280594 --- /dev/null +++ b/inc/lvgl/src/widgets/table/lv_table.c @@ -0,0 +1,1168 @@ +/** + * @file lv_table.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_table_private.h" +#include "../../misc/lv_area_private.h" +#include "../../core/lv_obj_private.h" +#include "../../core/lv_obj_class_private.h" +#if LV_USE_TABLE != 0 + +#include "../../indev/lv_indev.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_text_private.h" +#include "../../misc/lv_text_ap.h" +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_sprintf.h" +#include "../../draw/lv_draw_private.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_table_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void draw_main(lv_event_t * e); +static int32_t get_row_height(lv_obj_t * obj, uint32_t row_id, const lv_font_t * font, + int32_t letter_space, int32_t line_space, + int32_t cell_left, int32_t cell_right, int32_t cell_top, int32_t cell_bottom); +static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row); +static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col); +static lv_result_t get_pressed_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col); +static size_t get_cell_txt_len(const char * txt); +static void copy_cell_txt(lv_table_cell_t * dst, const char * txt); +static void get_cell_area(lv_obj_t * obj, uint32_t row, uint32_t col, lv_area_t * area); +static void scroll_to_selected_cell(lv_obj_t * obj); + +static inline bool is_cell_empty(void * cell) +{ + return cell == NULL; +} + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_table_properties[] = { + { + .id = LV_PROPERTY_TABLE_ROW_COUNT, + .setter = lv_table_set_row_count, + .getter = lv_table_get_row_count, + }, + { + .id = LV_PROPERTY_TABLE_COLUMN_COUNT, + .setter = lv_table_set_column_count, + .getter = lv_table_get_column_count, + }, +}; +#endif + +const lv_obj_class_t lv_table_class = { + .constructor_cb = lv_table_constructor, + .destructor_cb = lv_table_destructor, + .event_cb = lv_table_event, + .width_def = LV_SIZE_CONTENT, + .height_def = LV_SIZE_CONTENT, + .base_class = &lv_obj_class, + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_table_t), + .name = "lv_table", + LV_PROPERTY_CLASS_FIELDS(table, TABLE) +}; +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_table_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*===================== + * Setter functions + *====================*/ + +void lv_table_set_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + lv_table_cell_ctrl_t ctrl = 0; + + /*Save the control byte*/ + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + + void * user_data = NULL; + + /*Save the user data*/ + if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; + + size_t to_allocate = get_cell_txt_len(txt); + + table->cell_data[cell] = lv_realloc(table->cell_data[cell], to_allocate); + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + copy_cell_txt(table->cell_data[cell], txt); + + table->cell_data[cell]->ctrl = ctrl; + table->cell_data[cell]->user_data = user_data; + refr_cell_size(obj, row, col); +} + +void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint32_t row, uint32_t col, const char * fmt, ...) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(fmt); + + lv_table_t * table = (lv_table_t *)obj; + if(col >= table->col_cnt) { + lv_table_set_column_count(obj, col + 1); + } + + /*Auto expand*/ + if(row >= table->row_cnt) { + lv_table_set_row_count(obj, row + 1); + } + + uint32_t cell = row * table->col_cnt + col; + lv_table_cell_ctrl_t ctrl = 0; + + /*Save the control byte*/ + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + + void * user_data = NULL; + + /*Save the user_data*/ + if(table->cell_data[cell]) user_data = table->cell_data[cell]->user_data; + + va_list ap, ap2; + va_start(ap, fmt); + va_copy(ap2, ap); + + /*Allocate space for the new text by using trick from C99 standard section 7.19.6.12*/ + uint32_t len = lv_vsnprintf(NULL, 0, fmt, ap); + va_end(ap); + +#if LV_USE_ARABIC_PERSIAN_CHARS + /*Put together the text according to the format string*/ + char * raw_txt = lv_malloc(len + 1); + LV_ASSERT_MALLOC(raw_txt); + if(raw_txt == NULL) { + va_end(ap2); + return; + } + + lv_vsnprintf(raw_txt, len + 1, fmt, ap2); + + /*Get the size of the Arabic text and process it*/ + size_t len_ap = lv_text_ap_calc_bytes_count(raw_txt); + table->cell_data[cell] = lv_realloc(table->cell_data[cell], sizeof(lv_table_cell_t) + len_ap + 1); + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) { + va_end(ap2); + return; + } + lv_text_ap_proc(raw_txt, table->cell_data[cell]->txt); + + lv_free(raw_txt); +#else + table->cell_data[cell] = lv_realloc(table->cell_data[cell], + sizeof(lv_table_cell_t) + len + 1); /*+1: trailing '\0; */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) { + va_end(ap2); + return; + } + + table->cell_data[cell]->txt[len] = 0; /*Ensure NULL termination*/ + + lv_vsnprintf(table->cell_data[cell]->txt, len + 1, fmt, ap2); +#endif + + va_end(ap2); + + table->cell_data[cell]->ctrl = ctrl; + table->cell_data[cell]->user_data = user_data; + refr_cell_size(obj, row, col); +} + +void lv_table_set_row_count(lv_obj_t * obj, uint32_t row_cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(table->row_cnt == row_cnt) return; + + uint32_t old_row_cnt = table->row_cnt; + table->row_cnt = row_cnt; + + table->row_h = lv_realloc(table->row_h, table->row_cnt * sizeof(table->row_h[0])); + LV_ASSERT_MALLOC(table->row_h); + if(table->row_h == NULL) return; + + /*Free the unused cells*/ + if(old_row_cnt > row_cnt) { + uint32_t old_cell_cnt = old_row_cnt * table->col_cnt; + uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; + uint32_t i; + for(i = new_cell_cnt; i < old_cell_cnt; i++) { + lv_free(table->cell_data[i]); + } + } + + table->cell_data = lv_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); + LV_ASSERT_MALLOC(table->cell_data); + if(table->cell_data == NULL) return; + + /*Initialize the new fields*/ + if(old_row_cnt < row_cnt) { + uint32_t old_cell_cnt = old_row_cnt * table->col_cnt; + uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; + lv_memzero(&table->cell_data[old_cell_cnt], (new_cell_cnt - old_cell_cnt) * sizeof(table->cell_data[0])); + } + + refr_size_form_row(obj, 0); +} + +void lv_table_set_column_count(lv_obj_t * obj, uint32_t col_cnt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(table->col_cnt == col_cnt) return; + + uint32_t old_col_cnt = table->col_cnt; + table->col_cnt = col_cnt; + + lv_table_cell_t ** new_cell_data = lv_malloc(table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); + LV_ASSERT_MALLOC(new_cell_data); + if(new_cell_data == NULL) return; + uint32_t new_cell_cnt = table->col_cnt * table->row_cnt; + + lv_memzero(new_cell_data, new_cell_cnt * sizeof(table->cell_data[0])); + + /*The new column(s) messes up the mapping of `cell_data`*/ + uint32_t old_col_start; + uint32_t new_col_start; + uint32_t min_col_cnt = LV_MIN(old_col_cnt, col_cnt); + uint32_t row; + for(row = 0; row < table->row_cnt; row++) { + old_col_start = row * old_col_cnt; + new_col_start = row * col_cnt; + + lv_memcpy(&new_cell_data[new_col_start], &table->cell_data[old_col_start], + sizeof(new_cell_data[0]) * min_col_cnt); + + /*Free the old cells (only if the table becomes smaller)*/ + int32_t i; + for(i = 0; i < (int32_t)old_col_cnt - (int32_t)col_cnt; i++) { + uint32_t idx = old_col_start + min_col_cnt + i; + lv_free(table->cell_data[idx]); + table->cell_data[idx] = NULL; + } + } + + lv_free(table->cell_data); + table->cell_data = new_cell_data; + + /*Initialize the new column widths if any*/ + table->col_w = lv_realloc(table->col_w, col_cnt * sizeof(table->col_w[0])); + LV_ASSERT_MALLOC(table->col_w); + if(table->col_w == NULL) return; + + uint32_t col; + for(col = old_col_cnt; col < col_cnt; col++) { + table->col_w[col] = LV_DPI_DEF; + } + + refr_size_form_row(obj, 0) ; +} + +void lv_table_set_column_width(lv_obj_t * obj, uint32_t col_id, int32_t w) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col_id >= table->col_cnt) lv_table_set_column_count(obj, col_id + 1); + + table->col_w[col_id] = w; + refr_size_form_row(obj, 0); +} + +void lv_table_set_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_malloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell]->ctrl = 0; + table->cell_data[cell]->user_data = NULL; + table->cell_data[cell]->txt[0] = '\0'; + } + + table->cell_data[cell]->ctrl |= ctrl; + refr_cell_size(obj, row, col); +} + +void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_malloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell]->ctrl = 0; + table->cell_data[cell]->user_data = NULL; + table->cell_data[cell]->txt[0] = '\0'; + } + + table->cell_data[cell]->ctrl &= (~ctrl); +} + +void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + /*Auto expand*/ + if(col >= table->col_cnt) lv_table_set_column_count(obj, col + 1); + if(row >= table->row_cnt) lv_table_set_row_count(obj, row + 1); + + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) { + table->cell_data[cell] = lv_malloc(sizeof(lv_table_cell_t) + 1); /*+1: trailing '\0 */ + LV_ASSERT_MALLOC(table->cell_data[cell]); + if(table->cell_data[cell] == NULL) return; + + table->cell_data[cell]->ctrl = 0; + table->cell_data[cell]->user_data = NULL; + table->cell_data[cell]->txt[0] = '\0'; + } + + table->cell_data[cell]->user_data = user_data; +} + +void lv_table_set_selected_cell(lv_obj_t * obj, uint16_t row, uint16_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(table->col_cnt == 0 || table->row_cnt == 0) return; + + if(table->col_act != col || table->row_act != row) { + table->col_act = (col >= table->col_cnt) ? (table->col_cnt - 1) : col; + table->row_act = (row >= table->row_cnt) ? (table->row_cnt - 1) : row; + + lv_obj_invalidate(obj); + + scroll_to_selected_cell(obj); + + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + } +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_table_get_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("invalid row or column"); + return ""; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return ""; + + return table->cell_data[cell]->txt; +} + +uint32_t lv_table_get_row_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + return table->row_cnt; +} + +uint32_t lv_table_get_column_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + return table->col_cnt; +} + +int32_t lv_table_get_column_width(lv_obj_t * obj, uint32_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + + if(col >= table->col_cnt) { + LV_LOG_WARN("too big 'col_id'. Must be < LV_TABLE_COL_MAX."); + return 0; + } + + return table->col_w[col]; +} + +bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("invalid row or column"); + return false; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return false; + else return (table->cell_data[cell]->ctrl & ctrl) == ctrl; +} + +void lv_table_get_selected_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col) +{ + lv_table_t * table = (lv_table_t *)obj; + *row = table->row_act; + *col = table->col_act; +} + +void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_table_t * table = (lv_table_t *)obj; + if(row >= table->row_cnt || col >= table->col_cnt) { + LV_LOG_WARN("invalid row or column"); + return NULL; + } + uint32_t cell = row * table->col_cnt + col; + + if(is_cell_empty(table->cell_data[cell])) return NULL; + + return table->cell_data[cell]->user_data; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_table_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_table_t * table = (lv_table_t *)obj; + + table->col_cnt = 1; + table->row_cnt = 1; + table->col_w = lv_malloc(table->col_cnt * sizeof(table->col_w[0])); + table->row_h = lv_malloc(table->row_cnt * sizeof(table->row_h[0])); + table->col_w[0] = LV_DPI_DEF; + table->row_h[0] = LV_DPI_DEF; + table->cell_data = lv_realloc(table->cell_data, table->row_cnt * table->col_cnt * sizeof(lv_table_cell_t *)); + table->cell_data[0] = NULL; + table->row_act = LV_TABLE_CELL_NONE; + table->col_act = LV_TABLE_CELL_NONE; + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_table_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_table_t * table = (lv_table_t *)obj; + /*Free the cell texts*/ + uint32_t i; + for(i = 0; i < table->col_cnt * table->row_cnt; i++) { + if(table->cell_data[i]) { + lv_free(table->cell_data[i]); + table->cell_data[i] = NULL; + } + } + + if(table->cell_data) lv_free(table->cell_data); + if(table->row_h) lv_free(table->row_h); + if(table->col_w) lv_free(table->col_w); +} + +static void lv_table_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_table_t * table = (lv_table_t *)obj; + + if(code == LV_EVENT_STYLE_CHANGED) { + refr_size_form_row(obj, 0); + } + else if(code == LV_EVENT_GET_SELF_SIZE) { + lv_point_t * p = lv_event_get_param(e); + uint32_t i; + int32_t w = 0; + for(i = 0; i < table->col_cnt; i++) w += table->col_w[i]; + + int32_t h = 0; + for(i = 0; i < table->row_cnt; i++) h += table->row_h[i]; + + p->x = w - 1; + p->y = h - 1; + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING) { + uint32_t col; + uint32_t row; + lv_result_t pr_res = get_pressed_cell(obj, &row, &col); + + if(pr_res == LV_RESULT_OK && (table->col_act != col || table->row_act != row)) { + table->col_act = col; + table->row_act = row; + lv_obj_invalidate(obj); + } + } + else if(code == LV_EVENT_RELEASED) { + lv_obj_invalidate(obj); + lv_indev_t * indev = lv_indev_active(); + lv_obj_t * scroll_obj = lv_indev_get_scroll_obj(indev); + if(table->col_act != LV_TABLE_CELL_NONE && table->row_act != LV_TABLE_CELL_NONE && scroll_obj == NULL) { + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RESULT_OK) return; + } + + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_active()); + if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) { + table->col_act = LV_TABLE_CELL_NONE; + table->row_act = LV_TABLE_CELL_NONE; + } + } + else if(code == LV_EVENT_FOCUSED) { + lv_obj_invalidate(obj); + } + else if(code == LV_EVENT_KEY) { + int32_t c = *((int32_t *)lv_event_get_param(e)); + int32_t col = table->col_act; + int32_t row = table->row_act; + if(col == LV_TABLE_CELL_NONE || row == LV_TABLE_CELL_NONE) { + table->col_act = 0; + table->row_act = 0; + scroll_to_selected_cell(obj); + lv_obj_invalidate(obj); + return; + } + + if(col >= (int32_t)table->col_cnt) col = 0; + if(row >= (int32_t)table->row_cnt) row = 0; + + if(c == LV_KEY_LEFT) col--; + else if(c == LV_KEY_RIGHT) col++; + else if(c == LV_KEY_UP) row--; + else if(c == LV_KEY_DOWN) row++; + else return; + + if(col >= (int32_t)table->col_cnt) { + if(row < (int32_t)table->row_cnt - 1) { + col = 0; + row++; + } + else { + col = table->col_cnt - 1; + } + } + else if(col < 0) { + if(row != 0) { + col = table->col_cnt - 1; + row--; + } + else { + col = 0; + } + } + + if(row >= (int32_t)table->row_cnt) { + row = table->row_cnt - 1; + } + else if(row < 0) { + row = 0; + } + + if((int32_t)table->col_act != col || (int32_t)table->row_act != row) { + table->col_act = col; + table->row_act = row; + lv_obj_invalidate(obj); + + scroll_to_selected_cell(obj); + res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + + if(res != LV_RESULT_OK) return; + } + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_main(e); + } +} + +static void draw_main(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_table_t * table = (lv_table_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + lv_area_t clip_area; + if(!lv_area_intersect(&clip_area, &obj->coords, &layer->_clip_area)) return; + + const lv_area_t clip_area_ori = layer->_clip_area; + layer->_clip_area = clip_area; + + lv_point_t txt_size; + lv_area_t cell_area; + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + int32_t bg_top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bg_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t bg_left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t bg_right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + + lv_state_t state_ori = obj->state; + obj->state = LV_STATE_DEFAULT; + obj->skip_trans = 1; + lv_draw_rect_dsc_t rect_dsc_def; + lv_draw_rect_dsc_t rect_dsc_act; /*Passed to the event to modify it*/ + lv_draw_rect_dsc_init(&rect_dsc_def); + rect_dsc_def.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &rect_dsc_def); + + lv_draw_label_dsc_t label_dsc_def; + lv_draw_label_dsc_t label_dsc_act; /*Passed to the event to modify it*/ + lv_draw_label_dsc_init(&label_dsc_def); + label_dsc_def.base.layer = layer; + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &label_dsc_def); + obj->state = state_ori; + obj->skip_trans = 0; + + uint32_t col; + uint32_t row; + uint32_t cell = 0; + + cell_area.y2 = obj->coords.y1 + bg_top - 1 - lv_obj_get_scroll_y(obj) + border_width; + cell_area.x1 = 0; + cell_area.x2 = 0; + int32_t scroll_x = lv_obj_get_scroll_x(obj) ; + bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL; + + /*Handle custom drawer*/ + for(row = 0; row < table->row_cnt; row++) { + int32_t h_row = table->row_h[row]; + + cell_area.y1 = cell_area.y2 + 1; + cell_area.y2 = cell_area.y1 + h_row - 1; + + if(cell_area.y1 > clip_area.y2) break; + + if(rtl) cell_area.x1 = obj->coords.x2 - bg_right - 1 - scroll_x - border_width; + else cell_area.x2 = obj->coords.x1 + bg_left - 1 - scroll_x + border_width; + + for(col = 0; col < table->col_cnt; col++) { + lv_table_cell_ctrl_t ctrl = 0; + if(table->cell_data[cell]) ctrl = table->cell_data[cell]->ctrl; + + if(rtl) { + cell_area.x2 = cell_area.x1 - 1; + cell_area.x1 = cell_area.x2 - table->col_w[col] + 1; + } + else { + cell_area.x1 = cell_area.x2 + 1; + cell_area.x2 = cell_area.x1 + table->col_w[col] - 1; + } + + uint32_t col_merge = 0; + for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { + lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; + + if(is_cell_empty(next_cell_data)) break; + + lv_table_cell_ctrl_t merge_ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; + if(merge_ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { + int32_t offset = table->col_w[col + col_merge + 1]; + + if(rtl) cell_area.x1 -= offset; + else cell_area.x2 += offset; + } + else { + break; + } + } + + if(cell_area.y2 < clip_area.y1) { + cell += col_merge + 1; + col += col_merge; + continue; + } + + /*Expand the cell area with a half border to avoid drawing 2 borders next to each other*/ + lv_area_t cell_area_border; + lv_area_copy(&cell_area_border, &cell_area); + if((rect_dsc_def.border_side & LV_BORDER_SIDE_LEFT) && cell_area_border.x1 > obj->coords.x1 + bg_left) { + cell_area_border.x1 -= rect_dsc_def.border_width / 2; + } + if((rect_dsc_def.border_side & LV_BORDER_SIDE_TOP) && cell_area_border.y1 > obj->coords.y1 + bg_top) { + cell_area_border.y1 -= rect_dsc_def.border_width / 2; + } + if((rect_dsc_def.border_side & LV_BORDER_SIDE_RIGHT) && cell_area_border.x2 < obj->coords.x2 - bg_right - 1) { + cell_area_border.x2 += rect_dsc_def.border_width / 2 + (rect_dsc_def.border_width & 0x1); + } + if((rect_dsc_def.border_side & LV_BORDER_SIDE_BOTTOM) && + cell_area_border.y2 < obj->coords.y2 - bg_bottom - 1) { + cell_area_border.y2 += rect_dsc_def.border_width / 2 + (rect_dsc_def.border_width & 0x1); + } + + lv_state_t cell_state = LV_STATE_DEFAULT; + if(row == table->row_act && col == table->col_act) { + if(!(obj->state & LV_STATE_SCROLLED) && (obj->state & LV_STATE_PRESSED)) cell_state |= LV_STATE_PRESSED; + if(obj->state & LV_STATE_FOCUSED) cell_state |= LV_STATE_FOCUSED; + if(obj->state & LV_STATE_FOCUS_KEY) cell_state |= LV_STATE_FOCUS_KEY; + if(obj->state & LV_STATE_EDITED) cell_state |= LV_STATE_EDITED; + } + + /*Set up the draw descriptors*/ + if(cell_state == LV_STATE_DEFAULT) { + lv_memcpy(&rect_dsc_act, &rect_dsc_def, sizeof(lv_draw_rect_dsc_t)); + lv_memcpy(&label_dsc_act, &label_dsc_def, sizeof(lv_draw_label_dsc_t)); + } + /*In other cases get the styles directly without caching them*/ + else { + obj->state = cell_state; + obj->skip_trans = 1; + lv_draw_rect_dsc_init(&rect_dsc_act); + rect_dsc_act.base.layer = layer; + lv_draw_label_dsc_init(&label_dsc_act); + label_dsc_act.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_ITEMS, &rect_dsc_act); + lv_obj_init_draw_label_dsc(obj, LV_PART_ITEMS, &label_dsc_act); + obj->state = state_ori; + obj->skip_trans = 0; + } + + rect_dsc_act.base.id1 = row; + rect_dsc_act.base.id2 = col; + label_dsc_act.base.id1 = row; + label_dsc_act.base.id2 = col; + + lv_draw_rect(layer, &rect_dsc_act, &cell_area_border); + + if(table->cell_data[cell]) { + const int32_t cell_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const int32_t cell_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const int32_t cell_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const int32_t cell_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + + lv_text_attributes_t attributes = {0}; + attributes.text_flags = LV_TEXT_FLAG_NONE; + attributes.letter_space = label_dsc_act.letter_space; + attributes.line_space = label_dsc_act.line_space; + + lv_area_t txt_area; + txt_area.x1 = cell_area.x1 + cell_left; + txt_area.x2 = cell_area.x2 - cell_right; + txt_area.y1 = cell_area.y1 + cell_top; + txt_area.y2 = cell_area.y2 - cell_bottom; + + attributes.max_width = lv_area_get_width(&txt_area); + + /*Align the content to the middle if not cropped*/ + bool crop = ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP; + if(crop) { + attributes.text_flags = LV_TEXT_FLAG_EXPAND; + label_dsc_act.flag |= LV_TEXT_FLAG_EXPAND; + } + + lv_text_get_size_attributes(&txt_size, table->cell_data[cell]->txt, label_dsc_def.font, &attributes); + + /*Align the content to the middle if not cropped*/ + if(!crop) { + txt_area.y1 = cell_area.y1 + h_row / 2 - txt_size.y / 2; + txt_area.y2 = cell_area.y1 + h_row / 2 + txt_size.y / 2; + } + + lv_area_t label_clip_area; + bool label_mask_ok; + label_mask_ok = lv_area_intersect(&label_clip_area, &clip_area, &cell_area); + if(label_mask_ok) { + layer->_clip_area = label_clip_area; + label_dsc_act.text = table->cell_data[cell]->txt; + lv_draw_label(layer, &label_dsc_act, &txt_area); + layer->_clip_area = clip_area; + } + } + + cell += col_merge + 1; + col += col_merge; + } + } + + layer->_clip_area = clip_area_ori; +} + +/* Refreshes size of the table starting from @start_row row */ +static void refr_size_form_row(lv_obj_t * obj, uint32_t start_row) +{ + const int32_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const int32_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const int32_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const int32_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS); + + const int32_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS); + const int32_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS); + + lv_table_t * table = (lv_table_t *)obj; + uint32_t i; + for(i = start_row; i < table->row_cnt; i++) { + int32_t calculated_height = get_row_height(obj, i, font, letter_space, line_space, + cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom); + table->row_h[i] = LV_CLAMP(minh, calculated_height, maxh); + } + + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); +} + +static void refr_cell_size(lv_obj_t * obj, uint32_t row, uint32_t col) +{ + const int32_t cell_pad_left = lv_obj_get_style_pad_left(obj, LV_PART_ITEMS); + const int32_t cell_pad_right = lv_obj_get_style_pad_right(obj, LV_PART_ITEMS); + const int32_t cell_pad_top = lv_obj_get_style_pad_top(obj, LV_PART_ITEMS); + const int32_t cell_pad_bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_ITEMS); + + int32_t letter_space = lv_obj_get_style_text_letter_space(obj, LV_PART_ITEMS); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_ITEMS); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_ITEMS); + + const int32_t minh = lv_obj_get_style_min_height(obj, LV_PART_ITEMS); + const int32_t maxh = lv_obj_get_style_max_height(obj, LV_PART_ITEMS); + + lv_table_t * table = (lv_table_t *)obj; + int32_t calculated_height = get_row_height(obj, row, font, letter_space, line_space, + cell_pad_left, cell_pad_right, cell_pad_top, cell_pad_bottom); + + int32_t prev_row_size = table->row_h[row]; + table->row_h[row] = LV_CLAMP(minh, calculated_height, maxh); + + /*If the row height haven't changed invalidate only this cell*/ + if(prev_row_size == table->row_h[row]) { + lv_area_t cell_area; + get_cell_area(obj, row, col, &cell_area); + lv_area_move(&cell_area, obj->coords.x1, obj->coords.y1); + lv_obj_invalidate_area(obj, &cell_area); + } + else { + lv_obj_refresh_self_size(obj); + lv_obj_invalidate(obj); + } +} + +static int32_t get_row_height(lv_obj_t * obj, uint32_t row_id, const lv_font_t * font, + int32_t letter_space, int32_t line_space, + int32_t cell_left, int32_t cell_right, int32_t cell_top, int32_t cell_bottom) +{ + lv_table_t * table = (lv_table_t *)obj; + + int32_t h_max = lv_font_get_line_height(font) + cell_top + cell_bottom; + /* Calculate the cell_data index where to start */ + uint32_t row_start = row_id * table->col_cnt; + + lv_text_attributes_t attributes = {0}; + attributes.letter_space = letter_space; + attributes.line_space = line_space; + attributes.text_flags = LV_TEXT_FLAG_NONE; + + /* Traverse the cells in the row_id row */ + uint32_t cell; + uint32_t col; + for(cell = row_start, col = 0; cell < row_start + table->col_cnt; cell++, col++) { + lv_table_cell_t * cell_data = table->cell_data[cell]; + + if(is_cell_empty(cell_data)) { + continue; + } + + attributes.max_width = table->col_w[col]; + + /* Traverse the current row from the first until the penultimate column. + * Increment the text width if the cell has the LV_TABLE_CELL_CTRL_MERGE_RIGHT control, + * exit the traversal when the current cell control is not LV_TABLE_CELL_CTRL_MERGE_RIGHT */ + uint32_t col_merge = 0; + for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { + lv_table_cell_t * next_cell_data = table->cell_data[cell + col_merge]; + + if(is_cell_empty(next_cell_data)) break; + + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; + if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { + attributes.max_width += table->col_w[col + col_merge + 1]; + } + else { + break; + } + } + + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) cell_data->ctrl; + + /*When cropping the text we can assume the row height is equal to the line height*/ + if(ctrl & LV_TABLE_CELL_CTRL_TEXT_CROP) { + h_max = LV_MAX(lv_font_get_line_height(font) + cell_top + cell_bottom, + h_max); + } + /*Else we have to calculate the height of the cell text*/ + else { + lv_point_t txt_size; + attributes.max_width -= cell_left + cell_right; + + lv_text_get_size_attributes(&txt_size, table->cell_data[cell]->txt, font, &attributes); + + h_max = LV_MAX(txt_size.y + cell_top + cell_bottom, h_max); + /*Skip until one element after the last merged column*/ + cell += col_merge; + col += col_merge; + } + } + + return h_max; +} + +static lv_result_t get_pressed_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col) +{ + lv_table_t * table = (lv_table_t *)obj; + + lv_indev_type_t type = lv_indev_get_type(lv_indev_active()); + if(type != LV_INDEV_TYPE_POINTER && type != LV_INDEV_TYPE_BUTTON) { + if(col) *col = LV_TABLE_CELL_NONE; + if(row) *row = LV_TABLE_CELL_NONE; + return LV_RESULT_INVALID; + } + + lv_point_t p; + lv_indev_get_point(lv_indev_active(), &p); + + int32_t tmp; + bool is_click_on_valid_column = false; + bool is_click_on_valid_row = false; + + if(col) { + int32_t x = p.x + lv_obj_get_scroll_x(obj); + + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL) { + x = obj->coords.x2 - lv_obj_get_style_pad_right(obj, LV_PART_MAIN) - x; + } + else { + x -= obj->coords.x1; + x -= lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + } + + *col = 0; + tmp = 0; + for(*col = 0; *col < table->col_cnt; (*col)++) { + tmp += table->col_w[*col]; + if(x < tmp) { + is_click_on_valid_column = true; + break; + } + } + } + + if(row) { + int32_t y = p.y + lv_obj_get_scroll_y(obj); + y -= obj->coords.y1; + y -= lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + + *row = 0; + tmp = 0; + + for(*row = 0; *row < table->row_cnt; (*row)++) { + tmp += table->row_h[*row]; + if(y < tmp) { + is_click_on_valid_row = true; + break; + } + } + } + + /* If the click was on valid column AND row then return valid result, return invalid otherwise */ + lv_result_t result = LV_RESULT_INVALID; + if((is_click_on_valid_column) && (is_click_on_valid_row)) { + result = LV_RESULT_OK; + } + + return result; +} + +/* Returns number of bytes to allocate based on chars configuration */ +static size_t get_cell_txt_len(const char * txt) +{ + size_t retval = 0; + +#if LV_USE_ARABIC_PERSIAN_CHARS + retval = sizeof(lv_table_cell_t) + lv_text_ap_calc_bytes_count(txt) + 1; +#else + retval = sizeof(lv_table_cell_t) + lv_strlen(txt) + 1; +#endif + + return retval; +} + +/* Copy txt into dst skipping the format byte */ +static void copy_cell_txt(lv_table_cell_t * dst, const char * txt) +{ +#if LV_USE_ARABIC_PERSIAN_CHARS + lv_text_ap_proc(txt, dst->txt); +#else + lv_strcpy(dst->txt, txt); +#endif +} + +static void get_cell_area(lv_obj_t * obj, uint32_t row, uint32_t col, lv_area_t * area) +{ + lv_table_t * table = (lv_table_t *)obj; + + uint32_t c; + area->x1 = 0; + for(c = 0; c < col; c++) { + area->x1 += table->col_w[c]; + } + /* Traverse the current row from the first until the penultimate column. + * Increment the offset if the cell has the LV_TABLE_CELL_CTRL_MERGE_RIGHT control, + * exit the traversal when the current cell control is not LV_TABLE_CELL_CTRL_MERGE_RIGHT */ + uint32_t col_merge = 0; + int32_t offset = 0; + for(col_merge = 0; col_merge + col < table->col_cnt - 1; col_merge++) { + lv_table_cell_t * next_cell_data = table->cell_data[row * table->col_cnt + col_merge]; + + if(is_cell_empty(next_cell_data)) break; + + lv_table_cell_ctrl_t ctrl = (lv_table_cell_ctrl_t) next_cell_data->ctrl; + if(ctrl & LV_TABLE_CELL_CTRL_MERGE_RIGHT) { + offset += table->col_w[col + col_merge + 1]; + } + else { + break; + } + } + bool rtl = lv_obj_get_style_base_dir(obj, LV_PART_MAIN) == LV_BASE_DIR_RTL; + if(rtl) { + area->x1 += lv_obj_get_scroll_x(obj); + int32_t w = lv_obj_get_width(obj); + area->x2 = w - area->x1 - lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + area->x1 = area->x2 - (table->col_w[col] + offset); + } + else { + area->x1 -= lv_obj_get_scroll_x(obj); + area->x1 += lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + area->x2 = area->x1 + (table->col_w[col] + offset) - 1; + } + + uint32_t r; + area->y1 = 0; + for(r = 0; r < row; r++) { + area->y1 += table->row_h[r]; + } + + area->y1 += lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + area->y1 -= lv_obj_get_scroll_y(obj); + area->y2 = area->y1 + table->row_h[row] - 1; + +} + +static void scroll_to_selected_cell(lv_obj_t * obj) +{ + lv_table_t * table = (lv_table_t *)obj; + + lv_area_t a; + get_cell_area(obj, table->row_act, table->col_act, &a); + if(a.x1 < 0) { + lv_obj_scroll_by_bounded(obj, -a.x1, 0, LV_ANIM_ON); + } + else if(a.x2 > lv_obj_get_width(obj)) { + lv_obj_scroll_by_bounded(obj, lv_obj_get_width(obj) - a.x2, 0, LV_ANIM_ON); + } + + if(a.y1 < 0) { + lv_obj_scroll_by_bounded(obj, 0, -a.y1, LV_ANIM_ON); + } + else if(a.y2 > lv_obj_get_height(obj)) { + lv_obj_scroll_by_bounded(obj, 0, lv_obj_get_height(obj) - a.y2, LV_ANIM_ON); + } + +} +#endif diff --git a/inc/lvgl/src/widgets/table/lv_table.h b/inc/lvgl/src/widgets/table/lv_table.h new file mode 100644 index 0000000..7fdb784 --- /dev/null +++ b/inc/lvgl/src/widgets/table/lv_table.h @@ -0,0 +1,224 @@ +/** + * @file lv_table.h + * + */ + +#ifndef LV_TABLE_H +#define LV_TABLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../label/lv_label.h" +#include "../../core/lv_obj_property.h" + +#if LV_USE_TABLE != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_table: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +/********************* + * DEFINES + *********************/ +#define LV_TABLE_CELL_NONE 0XFFFF +LV_EXPORT_CONST_INT(LV_TABLE_CELL_NONE); + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_TABLE_CELL_CTRL_NONE = 0 << 0, + LV_TABLE_CELL_CTRL_MERGE_RIGHT = 1 << 0, + LV_TABLE_CELL_CTRL_TEXT_CROP = 1 << 1, + LV_TABLE_CELL_CTRL_CUSTOM_1 = 1 << 4, + LV_TABLE_CELL_CTRL_CUSTOM_2 = 1 << 5, + LV_TABLE_CELL_CTRL_CUSTOM_3 = 1 << 6, + LV_TABLE_CELL_CTRL_CUSTOM_4 = 1 << 7, +} lv_table_cell_ctrl_t; + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_table_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_table_id_t { + LV_PROPERTY_ID(TABLE, ROW_COUNT, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(TABLE, COLUMN_COUNT, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_TABLE_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a table object + * @param parent pointer to an object, it will be the parent of the new table + * @return pointer to the created table + */ +lv_obj_t * lv_table_create(lv_obj_t * parent); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the value of a cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param txt text to display in the cell. It will be copied and saved so this variable is not required after this function call. + * @note New roes/columns are added automatically if required + */ +void lv_table_set_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col, const char * txt); + +/** + * Set the value of a cell. Memory will be allocated to store the text by the table. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param fmt `printf`-like format + * @note New roes/columns are added automatically if required + */ +void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint32_t row, uint32_t col, const char * fmt, + ...) LV_FORMAT_ATTRIBUTE(4, 5); + +/** + * Set the number of rows + * @param obj table pointer to a Table object + * @param row_cnt number of rows + */ +void lv_table_set_row_count(lv_obj_t * obj, uint32_t row_cnt); + +/** + * Set the number of columns + * @param obj table pointer to a Table object + * @param col_cnt number of columns. + */ +void lv_table_set_column_count(lv_obj_t * obj, uint32_t col_cnt); + +/** + * Set the width of a column + * @param obj table pointer to a Table object + * @param col_id id of the column [0 .. LV_TABLE_COL_MAX -1] + * @param w width of the column + */ +void lv_table_set_column_width(lv_obj_t * obj, uint32_t col_id, int32_t w); + +/** + * Add control bits to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t + */ +void lv_table_set_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl); + +/** + * Clear control bits of the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t + */ +void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl); + +/** + * Add custom user data to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param user_data pointer to the new user_data. + * Should be allocated by `lv_malloc`, + * and it will be freed automatically when the table is deleted or + * when the cell is dropped due to lower row or column count. + */ +void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data); + +/** + * Set the selected cell + * @param obj pointer to a table object + * @param row id of the cell row to select + * @param col id of the cell column to select + */ +void lv_table_set_selected_cell(lv_obj_t * obj, uint16_t row, uint16_t col); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the value of a cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @return text in the cell + */ +const char * lv_table_get_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col); + +/** + * Get the number of rows. + * @param obj table pointer to a Table object + * @return number of rows. + */ +uint32_t lv_table_get_row_count(lv_obj_t * obj); + +/** + * Get the number of columns. + * @param obj table pointer to a Table object + * @return number of columns. + */ +uint32_t lv_table_get_column_count(lv_obj_t * obj); + +/** + * Get the width of a column + * @param obj table pointer to a Table object + * @param col id of the column [0 .. LV_TABLE_COL_MAX -1] + * @return width of the column + */ +int32_t lv_table_get_column_width(lv_obj_t * obj, uint32_t col); + +/** + * Get whether a cell has the control bits + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + * @param ctrl OR-ed values from ::lv_table_cell_ctrl_t + * @return true: all control bits are set; false: not all control bits are set + */ +bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl); + +/** + * Get the selected cell (pressed and or focused) + * @param obj pointer to a table object + * @param row pointer to variable to store the selected row (LV_TABLE_CELL_NONE: if no cell selected) + * @param col pointer to variable to store the selected column (LV_TABLE_CELL_NONE: if no cell selected) + */ +void lv_table_get_selected_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col); + +/** + * Get custom user data to the cell. + * @param obj pointer to a Table object + * @param row id of the row [0 .. row_cnt -1] + * @param col id of the column [0 .. col_cnt -1] + */ +void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TABLE*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABLE_H*/ diff --git a/inc/lvgl/src/widgets/table/lv_table_private.h b/inc/lvgl/src/widgets/table/lv_table_private.h new file mode 100644 index 0000000..816de1e --- /dev/null +++ b/inc/lvgl/src/widgets/table/lv_table_private.h @@ -0,0 +1,64 @@ +/** + * @file lv_table_private.h + * + */ + +#ifndef LV_TABLE_PRIVATE_H +#define LV_TABLE_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "lv_table.h" + +#if LV_USE_TABLE != 0 +#include "../../core/lv_obj_private.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Cell data */ +struct _lv_table_cell_t { + lv_table_cell_ctrl_t ctrl; + void * user_data; /**< Custom user data */ + char txt[1]; /**< Variable length array */ +}; + +/** Table data */ +struct _lv_table_t { + lv_obj_t obj; + uint32_t col_cnt; + uint32_t row_cnt; + lv_table_cell_t ** cell_data; + int32_t * row_h; + int32_t * col_w; + uint32_t col_act; + uint32_t row_act; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TABLE != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABLE_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/tabview/lv_tabview.c b/inc/lvgl/src/widgets/tabview/lv_tabview.c new file mode 100644 index 0000000..811ef14 --- /dev/null +++ b/inc/lvgl/src/widgets/tabview/lv_tabview.c @@ -0,0 +1,438 @@ +/** + * @file lv_tabview.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tabview_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../lvgl.h" + +#if LV_USE_TABVIEW + +#include "../../misc/lv_assert.h" +#include "../../indev/lv_indev_private.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_tabview_class) + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_tabview_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void button_clicked_event_cb(lv_event_t * e); +static void cont_scroll_end_event_cb(lv_event_t * e); + +#if LV_USE_OBJ_PROPERTY +static void lv_tabview_set_tab_active_property(lv_obj_t * obj, uint32_t idx) +{ + lv_tabview_set_active(obj, idx, LV_ANIM_OFF); +} +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_tabview_properties[] = { + { + .id = LV_PROPERTY_TABVIEW_TAB_ACTIVE, + .setter = lv_tabview_set_tab_active_property, + .getter = lv_tabview_get_tab_active, + }, + { + .id = LV_PROPERTY_TABVIEW_TAB_BAR_POSITION, + .setter = lv_tabview_set_tab_bar_position, + .getter = lv_tabview_get_tab_bar_position, + }, +}; +#endif + +const lv_obj_class_t lv_tabview_class = { + .constructor_cb = lv_tabview_constructor, + .event_cb = lv_tabview_event, + .width_def = LV_PCT(100), + .height_def = LV_PCT(100), + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_tabview_t), + .name = "lv_tabview", + LV_PROPERTY_CLASS_FIELDS(tabview, TABVIEW) +}; + +typedef struct { + lv_dir_t tab_pos; + int32_t tab_size; +} lv_tabview_create_info_t; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_tabview_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_tabview_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_t * cont = lv_tabview_get_content(obj); + + lv_obj_t * page = lv_obj_create(cont); + lv_obj_set_size(page, lv_pct(100), lv_pct(100)); + + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + + lv_obj_t * button = lv_button_create(tab_bar); + lv_obj_set_flex_grow(button, 1); + lv_obj_set_size(button, lv_pct(100), lv_pct(100)); + lv_obj_add_event_cb(button, button_clicked_event_cb, LV_EVENT_CLICKED, NULL); + lv_group_t * g = lv_group_get_default(); + if(g) lv_group_add_obj(g, button); + + lv_obj_t * label = lv_label_create(button); + lv_label_set_text(label, name); + lv_obj_center(label); + + uint32_t tab_idx = lv_obj_get_child_count(cont) - 1; + lv_tabview_t * tabview = (lv_tabview_t *)obj; + if(tab_idx == tabview->tab_cur) { + lv_tabview_set_active(obj, tab_idx, LV_ANIM_OFF); + } + + return page; +} + +void lv_tabview_set_tab_text(lv_obj_t * obj, uint32_t idx, const char * new_name) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + lv_obj_t * button = lv_obj_get_child_by_type(tab_bar, idx, &lv_button_class); + lv_obj_t * label = lv_obj_get_child_by_type(button, 0, &lv_label_class); + lv_label_set_text(label, new_name); +} + +#if LV_USE_TRANSLATION + +lv_obj_t * lv_tabview_set_tab_translation_tag(lv_obj_t * obj, const char * tag) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_obj_t * page = lv_tabview_add_tab(obj, NULL); + lv_obj_t * button = lv_tabview_get_tab_button(obj, -1); + lv_obj_t * label = lv_obj_get_child_by_type(button, 0, &lv_label_class); + lv_label_set_translation_tag(label, tag); + + return page; +} + +#endif + +void lv_tabview_set_active(lv_obj_t * obj, uint32_t idx, lv_anim_enable_t anim_en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + tabview->tab_cur = idx; + + lv_obj_t * cont = lv_tabview_get_content(obj); + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + + uint32_t tab_cnt = lv_tabview_get_tab_count(obj); + if(idx >= tab_cnt) return; + + /*To be sure lv_obj_get_content_width will return valid value*/ + if(cont == NULL) return; + + lv_obj_update_layout(obj); + + if((tabview->tab_pos & LV_DIR_VER) != 0) { + int32_t gap = lv_obj_get_style_pad_column(cont, LV_PART_MAIN); + int32_t w = lv_obj_get_content_width(cont); + if(lv_obj_get_style_base_dir(obj, LV_PART_MAIN) != LV_BASE_DIR_RTL) { + lv_obj_scroll_to_x(cont, idx * (gap + w), anim_en); + } + else { + int32_t id_rtl = -(int32_t)idx; + lv_obj_scroll_to_x(cont, (gap + w) * id_rtl, anim_en); + } + } + else { + int32_t gap = lv_obj_get_style_pad_row(cont, LV_PART_MAIN); + int32_t h = lv_obj_get_content_height(cont); + lv_obj_scroll_to_y(cont, idx * (gap + h), anim_en); + } + + uint32_t i = 0; + lv_obj_t * button = lv_obj_get_child_by_type(tab_bar, i, &lv_button_class); + while(button) { + lv_obj_set_state(button, LV_STATE_CHECKED, i == idx); + i++; + button = lv_obj_get_child_by_type(tab_bar, (int32_t)i, &lv_button_class); + } + +} + +void lv_tabview_set_tab_bar_position(lv_obj_t * obj, lv_dir_t dir) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + switch(dir) { + case LV_DIR_TOP: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + break; + case LV_DIR_BOTTOM: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN_REVERSE); + break; + case LV_DIR_LEFT: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW); + break; + case LV_DIR_RIGHT: + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW_REVERSE); + break; + case LV_DIR_HOR: + case LV_DIR_VER: + case LV_DIR_ALL: + case LV_DIR_NONE: + break; + } + + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + lv_obj_t * cont = lv_tabview_get_content(obj); + + switch(dir) { + case LV_DIR_TOP: + case LV_DIR_BOTTOM: + lv_obj_set_width(cont, LV_PCT(100)); + lv_obj_set_flex_grow(cont, 1); + lv_obj_set_flex_flow(tab_bar, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW); + lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER); + lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_NONE); + break; + case LV_DIR_LEFT: + case LV_DIR_RIGHT: + lv_obj_set_height(cont, LV_PCT(100)); + lv_obj_set_flex_grow(cont, 1); + lv_obj_set_flex_flow(tab_bar, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN); + lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_NONE); + lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER); + break; + case LV_DIR_HOR: + case LV_DIR_VER: + case LV_DIR_ALL: + case LV_DIR_NONE: + break; + } + + bool was_ver = tabview->tab_pos & LV_DIR_VER; + bool now_ver = dir & LV_DIR_VER; + + if(was_ver != now_ver) { + int32_t dpi = lv_display_get_dpi(lv_obj_get_display(obj)); + if(now_ver) { + lv_obj_set_size(tab_bar, lv_pct(100), dpi / 2); + } + else { + lv_obj_set_size(tab_bar, dpi, lv_pct(100)); + } + } + tabview->tab_pos = dir; + /* Update the tab bar size after the position is changed*/ + lv_tabview_set_tab_bar_size(obj, tabview->tab_bar_size); +} + +void lv_tabview_set_tab_bar_size(lv_obj_t * obj, int32_t size) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + if(tabview->tab_pos & LV_DIR_VER) { + lv_obj_set_height(tab_bar, size); + } + else { + lv_obj_set_width(tab_bar, size); + } + tabview->tab_bar_size = size; +} + +uint32_t lv_tabview_get_tab_active(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + return tabview->tab_cur; +} + +lv_obj_t * lv_tabview_get_tab_button(lv_obj_t * obj, int32_t idx) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + return lv_obj_get_child_by_type(lv_tabview_get_tab_bar(obj), idx, &lv_button_class); +} + +uint32_t lv_tabview_get_tab_count(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_obj_t * tab_bar = lv_tabview_get_tab_bar(obj); + return lv_obj_get_child_count_by_type(tab_bar, &lv_button_class); +} + +lv_obj_t * lv_tabview_get_content(lv_obj_t * tv) +{ + return lv_obj_get_child(tv, 1); +} + +lv_obj_t * lv_tabview_get_tab_bar(lv_obj_t * tv) +{ + return lv_obj_get_child(tv, 0); +} + +lv_dir_t lv_tabview_get_tab_bar_position(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + return tabview->tab_pos; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_tabview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_tabview_t * tabview = (lv_tabview_t *)obj; + tabview->tab_pos = LV_DIR_NONE; /*Invalid value to apply the default TOP direction correctly*/ + + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + + lv_obj_t * cont; + + lv_obj_create(obj); + cont = lv_obj_create(obj); + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW); + + lv_obj_add_event_cb(cont, cont_scroll_end_event_cb, LV_EVENT_LAYOUT_CHANGED, NULL); + lv_obj_add_event_cb(cont, cont_scroll_end_event_cb, LV_EVENT_SCROLL_END, NULL); + lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); + + const lv_dir_t default_direction = LV_DIR_TOP; + const int32_t dpi = lv_display_get_dpi(lv_obj_get_display(obj)); + if(default_direction & LV_DIR_VER) { + tabview->tab_bar_size = dpi / 2; + } + else { + tabview->tab_bar_size = dpi; + } + lv_tabview_set_tab_bar_position(obj, default_direction); + + lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE); + lv_obj_remove_flag(cont, LV_OBJ_FLAG_SCROLL_ON_FOCUS); +} + +static void lv_tabview_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + lv_result_t res = lv_obj_event_base(&lv_tabview_class, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * target = lv_event_get_current_target(e); + + if(code == LV_EVENT_SIZE_CHANGED) { + lv_tabview_set_active(target, lv_tabview_get_tab_active(target), LV_ANIM_OFF); + } +} + +static void button_clicked_event_cb(lv_event_t * e) +{ + lv_obj_t * button = lv_event_get_current_target(e); + + lv_obj_t * tv = lv_obj_get_parent(lv_obj_get_parent(button)); + + if(tv == NULL) return; + + /* Remember currently active tab before the click */ + uint32_t prev_idx = lv_tabview_get_tab_active(tv); + + /* Index of the button that was clicked */ + uint32_t idx = lv_obj_get_index_by_type(button, &lv_button_class); + + /* Switch to the requested tab */ + lv_tabview_set_active(tv, idx, LV_ANIM_OFF); + + /* If the tab really changed, notify listeners just like the + * swipe/scroll handler does. */ + if(prev_idx != idx) { + lv_obj_send_event(tv, LV_EVENT_VALUE_CHANGED, NULL); + } +} + +static void cont_scroll_end_event_cb(lv_event_t * e) +{ + lv_obj_t * cont = lv_event_get_current_target(e); + lv_event_code_t code = lv_event_get_code(e); + + lv_obj_t * tv = lv_obj_get_parent(cont); + lv_tabview_t * tv_obj = (lv_tabview_t *)tv; + if(code == LV_EVENT_LAYOUT_CHANGED) { + lv_tabview_set_active(tv, lv_tabview_get_tab_active(tv), LV_ANIM_OFF); + } + else if(code == LV_EVENT_SCROLL_END) { + lv_indev_t * indev = lv_indev_active(); + if(indev && indev->state == LV_INDEV_STATE_PRESSED) { + return; + } + + lv_point_t p; + lv_obj_get_scroll_end(cont, &p); + + int32_t t; + if((tv_obj->tab_pos & LV_DIR_VER) != 0) { + int32_t w = lv_obj_get_content_width(cont); + if(lv_obj_get_style_base_dir(tv, LV_PART_MAIN) == LV_BASE_DIR_RTL) t = -(p.x - w / 2) / w; + else t = (p.x + w / 2) / w; + } + else { + int32_t h = lv_obj_get_content_height(cont); + t = (p.y + h / 2) / h; + } + + if(t < 0) t = 0; + bool new_tab = false; + if(t != (int32_t)lv_tabview_get_tab_active(tv)) new_tab = true; + + /*If not scrolled by an indev set the tab immediately*/ + if(lv_indev_active()) { + lv_tabview_set_active(tv, t, LV_ANIM_ON); + } + else { + lv_tabview_set_active(tv, t, LV_ANIM_OFF); + } + + if(new_tab) lv_obj_send_event(tv, LV_EVENT_VALUE_CHANGED, NULL); + } +} +#endif /*LV_USE_TABVIEW*/ diff --git a/inc/lvgl/src/widgets/tabview/lv_tabview.h b/inc/lvgl/src/widgets/tabview/lv_tabview.h new file mode 100644 index 0000000..9862e63 --- /dev/null +++ b/inc/lvgl/src/widgets/tabview/lv_tabview.h @@ -0,0 +1,152 @@ +/** + * @file lv_tabview.h + * + */ + +#ifndef LV_TABVIEW_H +#define LV_TABVIEW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" +#include "../../core/lv_obj_property.h" + +#if LV_USE_TABVIEW + +/********************* + * DEFINES + *********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tabview_class; + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_tabview_id_t { + LV_PROPERTY_ID(TABVIEW, TAB_ACTIVE, LV_PROPERTY_TYPE_INT, 0), + LV_PROPERTY_ID(TABVIEW, TAB_BAR_POSITION, LV_PROPERTY_TYPE_INT, 1), + LV_PROPERTY_TABVIEW_END, +}; +#endif + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a tabview widget + * @param parent pointer to a parent widget + * @return the created tabview + */ +lv_obj_t * lv_tabview_create(lv_obj_t * parent); + +/** + * Add a tab to the tabview + * @param obj pointer to a tabview widget + * @param name the name of the tab, it will be displayed on the tab bar + * @return the widget where the content of the tab can be created + */ +lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name); + +/** + * Change the name of the tab + * @param obj pointer to a tabview widget + * @param idx the index of the tab to rename + * @param new_name the new name as a string + */ +void lv_tabview_set_tab_text(lv_obj_t * obj, uint32_t idx, const char * new_name); + +#if LV_USE_TRANSLATION + +/** + * Add a tab with a translation tag to the tabview. + * @param obj pointer to a tabview widget + * @param tag translation key used for the tab label; will be displayed on the tab bar + * @return the widget where the content of the tab can be created + */ +lv_obj_t * lv_tabview_set_tab_translation_tag(lv_obj_t * obj, const char * tag); + +#endif + +/** + * Show a tab + * @param obj pointer to a tabview widget + * @param idx the index of the tab to show + * @param anim_en LV_ANIM_ON/OFF + */ +void lv_tabview_set_active(lv_obj_t * obj, uint32_t idx, lv_anim_enable_t anim_en); + +/** + * Set the position of the tab bar + * @param obj pointer to a tabview widget + * @param dir LV_DIR_TOP/BOTTOM/LEFT/RIGHT + */ +void lv_tabview_set_tab_bar_position(lv_obj_t * obj, lv_dir_t dir); + +/** + * Set the width or height of the tab bar + * @param obj pointer to tabview widget + * @param size size of the tab bar in pixels or percentage. + * will be used as width or height based on the position of the tab bar) + */ +void lv_tabview_set_tab_bar_size(lv_obj_t * obj, int32_t size); + +/** + * Get the number of tabs + * @param obj pointer to a tabview widget + * @return the number of tabs + */ +uint32_t lv_tabview_get_tab_count(lv_obj_t * obj); + +/** + * Get the current tab's index + * @param obj pointer to a tabview widget + * @return the zero based index of the current tab + */ +uint32_t lv_tabview_get_tab_active(lv_obj_t * obj); + +/** + * Get a given tab button by index + * @param obj pointer to a tabview widget + * @param idx zero based index of the tab button to get. + * < 0 means start counting tab button from the back (-1 is the last tab button) + * @return pointer to the tab button, or NULL if the index was out of range + */ +lv_obj_t * lv_tabview_get_tab_button(lv_obj_t * obj, int32_t idx); + +/** + * Get the widget where the container of each tab is created + * @param obj pointer to a tabview widget + * @return the main container widget + */ +lv_obj_t * lv_tabview_get_content(lv_obj_t * obj); + +/** + * Get the tab bar where the buttons are created + * @param obj pointer to a tabview widget + * @return the tab bar + */ +lv_obj_t * lv_tabview_get_tab_bar(lv_obj_t * obj); + +/** + * Get the position of the tab bar + * @param obj pointer to a tabview widget + * @return LV_DIR_TOP/BOTTOM/LEFT/RIGHT + */ +lv_dir_t lv_tabview_get_tab_bar_position(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TABVIEW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABVIEW_H*/ diff --git a/inc/lvgl/src/widgets/tabview/lv_tabview_private.h b/inc/lvgl/src/widgets/tabview/lv_tabview_private.h new file mode 100644 index 0000000..c7d3315 --- /dev/null +++ b/inc/lvgl/src/widgets/tabview/lv_tabview_private.h @@ -0,0 +1,56 @@ +/** + * @file lv_tabview_private.h + * + */ + +#ifndef LV_TABVIEW_PRIVATE_H +#define LV_TABVIEW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_tabview.h" + +#if LV_USE_TABVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ + +struct _lv_tabview_t { + lv_obj_t obj; + uint32_t tab_cur; + lv_dir_t tab_pos; + int32_t tab_bar_size; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TABVIEW */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TABVIEW_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/textarea/lv_textarea.c b/inc/lvgl/src/widgets/textarea/lv_textarea.c new file mode 100644 index 0000000..2b6416d --- /dev/null +++ b/inc/lvgl/src/widgets/textarea/lv_textarea.c @@ -0,0 +1,1533 @@ +/** + * @file lv_textarea.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_textarea_private.h" + +#if LV_USE_TEXTAREA != 0 + +#include "../label/lv_label_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../core/lv_group.h" +#include "../../core/lv_refr.h" +#include "../../indev/lv_indev.h" +#include "../../draw/lv_draw.h" +#include "../../misc/lv_assert.h" +#include "../../misc/lv_anim_private.h" +#include "../../misc/lv_text_private.h" +#include "../../misc/lv_math.h" +#include "../../stdlib/lv_string.h" + +/********************* + * DEFINES + *********************/ +#define MY_CLASS (&lv_textarea_class) + +/*Test configuration*/ +#ifndef LV_TEXTAREA_DEF_CURSOR_BLINK_TIME + #define LV_TEXTAREA_DEF_CURSOR_BLINK_TIME 400 /*ms*/ +#endif + +#ifndef LV_TEXTAREA_DEF_PWD_SHOW_TIME + #define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500 /*ms*/ +#endif + +#define LV_TEXTAREA_PWD_BULLET_UNICODE 0x2022 +#define IGNORE_KERNING '\0' + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_textarea_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_textarea_event(const lv_obj_class_t * class_p, lv_event_t * e); +static void label_event_cb(lv_event_t * e); +static void cursor_blink_anim_cb(void * obj, int32_t show); +static void pwd_char_hider_anim(void * obj, int32_t x); +static void pwd_char_hider_anim_completed(lv_anim_t * a); +static void pwd_char_hider(lv_obj_t * obj); +static bool char_is_accepted(lv_obj_t * obj, uint32_t c); +static void start_cursor_blink(lv_obj_t * obj); +static void refr_cursor_area(lv_obj_t * obj); +static void update_cursor_position_on_click(lv_event_t * e); +static lv_result_t insert_handler(lv_obj_t * obj, const char * txt); +static void draw_placeholder(lv_event_t * e); +static void draw_cursor(lv_event_t * e); +static void auto_hide_characters(lv_obj_t * obj); +static void auto_hide_characters_cancel(lv_obj_t * obj); +static inline bool is_valid_but_non_printable_char(const uint32_t letter); +static void lv_textarea_scroll_to_cusor_pos(lv_obj_t * obj, int32_t pos); + +/********************** + * STATIC VARIABLES + **********************/ +#if LV_USE_OBJ_PROPERTY +static const lv_property_ops_t lv_textarea_properties[] = { + { + .id = LV_PROPERTY_TEXTAREA_TEXT, + .setter = lv_textarea_set_text, + .getter = lv_textarea_get_text, + }, + { + .id = LV_PROPERTY_TEXTAREA_PLACEHOLDER_TEXT, + .setter = lv_textarea_set_placeholder_text, + .getter = lv_textarea_get_placeholder_text, + }, + { + .id = LV_PROPERTY_TEXTAREA_CURSOR_POS, + .setter = lv_textarea_set_cursor_pos, + .getter = lv_textarea_get_cursor_pos, + }, + { + .id = LV_PROPERTY_TEXTAREA_CURSOR_CLICK_POS, + .setter = lv_textarea_set_cursor_click_pos, + .getter = lv_textarea_get_cursor_click_pos, + }, + { + .id = LV_PROPERTY_TEXTAREA_PASSWORD_MODE, + .setter = lv_textarea_set_password_mode, + .getter = lv_textarea_get_password_mode, + }, + { + .id = LV_PROPERTY_TEXTAREA_PASSWORD_BULLET, + .setter = lv_textarea_set_password_bullet, + .getter = lv_textarea_get_password_bullet, + }, + { + .id = LV_PROPERTY_TEXTAREA_ONE_LINE, + .setter = lv_textarea_set_one_line, + .getter = lv_textarea_get_one_line, + }, + { + .id = LV_PROPERTY_TEXTAREA_ACCEPTED_CHARS, + .setter = lv_textarea_set_accepted_chars, + .getter = lv_textarea_get_accepted_chars, + }, + { + .id = LV_PROPERTY_TEXTAREA_MAX_LENGTH, + .setter = lv_textarea_set_max_length, + .getter = lv_textarea_get_max_length, + }, + { + .id = LV_PROPERTY_TEXTAREA_TEXT_SELECTION, + .setter = lv_textarea_set_text_selection, + .getter = lv_textarea_get_text_selection, + }, + { + .id = LV_PROPERTY_TEXTAREA_PASSWORD_SHOW_TIME, + .setter = lv_textarea_set_password_show_time, + .getter = lv_textarea_get_password_show_time, + }, + { + .id = LV_PROPERTY_TEXTAREA_LABEL, + .setter = NULL, + .getter = lv_textarea_get_label, + }, + { + .id = LV_PROPERTY_TEXTAREA_TEXT_IS_SELECTED, + .setter = NULL, + .getter = lv_textarea_text_is_selected, + }, + { + .id = LV_PROPERTY_TEXTAREA_CURRENT_CHAR, + .setter = NULL, + .getter = lv_textarea_get_current_char, + }, +}; +#endif + +const lv_obj_class_t lv_textarea_class = { + .constructor_cb = lv_textarea_constructor, + .destructor_cb = lv_textarea_destructor, + .event_cb = lv_textarea_event, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .width_def = LV_DPI_DEF * 2, + .height_def = LV_DPI_DEF, + .editable = LV_OBJ_CLASS_EDITABLE_TRUE, + .instance_size = sizeof(lv_textarea_t), + .base_class = &lv_obj_class, + .name = "lv_textarea", + LV_PROPERTY_CLASS_FIELDS(textarea, TEXTAREA) +}; + +static const char * ta_insert_replace; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_textarea_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +void lv_textarea_add_char(lv_obj_t * obj, uint32_t c) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(ta->one_line && (c == '\n' || c == '\r')) { + LV_LOG_INFO("Text area: line break ignored in one-line mode"); + return; + } + + uint32_t u32_buf[2]; + u32_buf[0] = c; + u32_buf[1] = 0; + + const char * letter_buf = (char *)&u32_buf; + + uint32_t c2 = c; +#if LV_BIG_ENDIAN_SYSTEM + if(c != 0) while(*letter_buf == 0) ++letter_buf; + + /*The byte order may or may not need to be swapped here to get correct c_uni below, + since lv_textarea_add_text is ordering bytes correctly before calling lv_textarea_add_char. + Assume swapping is needed if MSB is zero. May not be foolproof. */ + if((c != 0) && ((c & 0xff000000) == 0)) { + c2 = ((c >> 24) & 0xff) | /*move byte 3 to byte 0*/ + ((c << 8) & 0xff0000) | /*move byte 1 to byte 2*/ + ((c >> 8) & 0xff00) | /*move byte 2 to byte 1*/ + ((c << 24) & 0xff000000); /*byte 0 to byte 3*/ + } +#endif + + lv_result_t res = insert_handler(obj, letter_buf); + if(res != LV_RESULT_OK) return; + + uint32_t c_uni = lv_text_encoded_next((const char *)&c2, NULL); + + if(char_is_accepted(obj, c_uni) == false) { + LV_LOG_INFO("Character is not accepted by the text area (too long text or not in the accepted list)"); + return; + } + + if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/ + + /*If the textarea is empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt = lv_label_get_text(ta->label); + if(txt[0] == '\0') lv_obj_invalidate(obj); + } + + lv_label_ins_text(ta->label, ta->cursor.pos, letter_buf); /*Insert the character*/ + lv_textarea_clear_selection(obj); /*Clear selection*/ + + if(ta->pwd_mode) { + /*+2: the new char + \0*/ + size_t realloc_size = lv_strlen(ta->pwd_tmp) + lv_strlen(letter_buf) + 1; + ta->pwd_tmp = lv_realloc(ta->pwd_tmp, realloc_size); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + lv_text_ins(ta->pwd_tmp, ta->cursor.pos, (const char *)letter_buf); + + /*Auto hide characters*/ + auto_hide_characters(obj); + } + + /*Move the cursor after the new character*/ + lv_textarea_set_cursor_pos(obj, lv_textarea_get_cursor_pos(obj) + 1); + + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +void lv_textarea_add_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(ta->pwd_mode) pwd_char_hider(obj); /*Make sure all the current text contains only '*'*/ + + /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ + if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) { + uint32_t i = 0; + while(txt[i] != '\0') { + uint32_t c = lv_text_encoded_next(txt, &i); + lv_textarea_add_char(obj, lv_text_unicode_to_encoded(c)); + } + return; + } + + lv_result_t res = insert_handler(obj, txt); + if(res != LV_RESULT_OK) return; + + /*If the textarea is empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt_act = lv_label_get_text(ta->label); + if(txt_act[0] == '\0') lv_obj_invalidate(obj); + } + + /*Insert the text*/ + lv_label_ins_text(ta->label, ta->cursor.pos, txt); + lv_textarea_clear_selection(obj); + + if(ta->pwd_mode) { + size_t realloc_size = lv_strlen(ta->pwd_tmp) + lv_strlen(txt) + 1; + ta->pwd_tmp = lv_realloc(ta->pwd_tmp, realloc_size); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + lv_text_ins(ta->pwd_tmp, ta->cursor.pos, txt); + + /*Auto hide characters*/ + auto_hide_characters(obj); + } + + /*Move the cursor after the new text*/ + lv_textarea_set_cursor_pos(obj, lv_textarea_get_cursor_pos(obj) + lv_text_get_encoded_length(txt)); + + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +void lv_textarea_delete_char(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + uint32_t cur_pos = ta->cursor.pos; + + if(cur_pos == 0) return; + + char del_buf[2] = {LV_KEY_DEL, '\0'}; + + lv_result_t res = insert_handler(obj, del_buf); + if(res != LV_RESULT_OK) return; + + char * label_txt = lv_label_get_text(ta->label); + + /*Delete a character*/ + lv_text_cut(label_txt, ta->cursor.pos - 1, 1); + + /*Refresh the label*/ + lv_label_set_text(ta->label, label_txt); + lv_textarea_clear_selection(obj); + + /*If the textarea became empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt = lv_label_get_text(ta->label); + if(txt[0] == '\0') lv_obj_invalidate(obj); + } + + if(ta->pwd_mode) { + lv_text_cut(ta->pwd_tmp, ta->cursor.pos - 1, 1); + + ta->pwd_tmp = lv_realloc(ta->pwd_tmp, lv_strlen(ta->pwd_tmp) + 1); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + } + + /*Move the cursor to the place of the deleted character*/ + lv_textarea_set_cursor_pos(obj, ta->cursor.pos - 1); + + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + +} + +void lv_textarea_delete_char_forward(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t cp = lv_textarea_get_cursor_pos(obj); + lv_textarea_set_cursor_pos(obj, cp + 1); + if(cp != lv_textarea_get_cursor_pos(obj)) lv_textarea_delete_char(obj); +} + +/*===================== + * Setter functions + *====================*/ + +void lv_textarea_set_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + /*Clear the existing selection*/ + lv_textarea_clear_selection(obj); + + /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ + if(lv_textarea_get_accepted_chars(obj) || lv_textarea_get_max_length(obj)) { + lv_label_set_text(ta->label, ""); + lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); + if(ta->pwd_mode) { + ta->pwd_tmp[0] = '\0'; /*Clear the password too*/ + } + uint32_t i = 0; + while(txt[i] != '\0') { + uint32_t c = lv_text_encoded_next(txt, &i); + lv_textarea_add_char(obj, lv_text_unicode_to_encoded(c)); + } + } + else { + lv_label_set_text(ta->label, txt); + lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); + } + + /*If the textarea is empty, invalidate it to hide the placeholder*/ + if(ta->placeholder_txt) { + const char * txt_act = lv_label_get_text(ta->label); + if(txt_act[0] == '\0') lv_obj_invalidate(obj); + } + + if(ta->pwd_mode) { + lv_free(ta->pwd_tmp); + ta->pwd_tmp = lv_strdup(txt); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + pwd_char_hider(obj); + } + + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); +} + +void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(txt); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + size_t txt_len = lv_strlen(txt); + if((txt_len == 0) && (ta->placeholder_txt)) { + lv_free(ta->placeholder_txt); + ta->placeholder_txt = NULL; + } + else { + /*Allocate memory for the placeholder_txt text*/ + /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/ + ta->placeholder_txt = lv_realloc(ta->placeholder_txt, txt_len + 1); + LV_ASSERT_MALLOC(ta->placeholder_txt); + if(ta->placeholder_txt == NULL) { + LV_LOG_ERROR("couldn't allocate memory for placeholder"); + return; + } + + lv_strcpy(ta->placeholder_txt, txt); + ta->placeholder_txt[txt_len] = '\0'; + } + + lv_obj_invalidate(obj); +} + +void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if((uint32_t)ta->cursor.pos == (uint32_t)pos) return; + + uint32_t len = lv_text_get_encoded_length(lv_label_get_text(ta->label)); + + if(pos < 0) pos = len + pos; + + if(pos > (int32_t)len || pos == LV_TEXTAREA_CURSOR_LAST) pos = len; + + ta->cursor.pos = pos; + + /*Position the label to make the cursor visible*/ + lv_obj_update_layout(obj); + + lv_textarea_scroll_to_cusor_pos(obj, pos); +} + +void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + ta->cursor.click_pos = en ? 1U : 0U; +} + +void lv_textarea_set_password_mode(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->pwd_mode == en) return; + + ta->pwd_mode = en ? 1U : 0U; + /*Pwd mode is now enabled*/ + if(en) { + char * txt = lv_label_get_text(ta->label); + lv_free(ta->pwd_tmp); + ta->pwd_tmp = lv_strdup(txt); + LV_ASSERT_MALLOC(ta->pwd_tmp); + if(ta->pwd_tmp == NULL) return; + + pwd_char_hider(obj); + + lv_textarea_clear_selection(obj); + } + /*Pwd mode is now disabled*/ + else { + lv_textarea_clear_selection(obj); + lv_label_set_text(ta->label, ta->pwd_tmp); + lv_free(ta->pwd_tmp); + ta->pwd_tmp = NULL; + } + + refr_cursor_area(obj); +} + +void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + LV_ASSERT_NULL(bullet); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(!bullet && (ta->pwd_bullet)) { + lv_free(ta->pwd_bullet); + ta->pwd_bullet = NULL; + } + else { + size_t txt_len = lv_strlen(bullet); + + /*Allocate memory for the pwd_bullet text*/ + /*NOTE: Using special realloc behavior, malloc-like when data_p is NULL*/ + ta->pwd_bullet = lv_realloc(ta->pwd_bullet, txt_len + 1); + LV_ASSERT_MALLOC(ta->pwd_bullet); + if(ta->pwd_bullet == NULL) { + LV_LOG_ERROR("couldn't allocate memory for bullet"); + return; + } + + lv_memcpy(ta->pwd_bullet, bullet, txt_len); + ta->pwd_bullet[txt_len] = '\0'; + } + + pwd_char_hider(obj); +} + +void lv_textarea_set_one_line(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->one_line == en) return; + + ta->one_line = en ? 1U : 0U; + int32_t width = en ? LV_SIZE_CONTENT : lv_pct(100); + int32_t min_width_value = en ? lv_pct(100) : 0; + + lv_obj_set_width(ta->label, width); + lv_obj_set_style_min_width(ta->label, min_width_value, 0); + + if(en) { + lv_obj_set_height(obj, LV_SIZE_CONTENT); + } + else { + lv_obj_remove_local_style_prop(obj, LV_STYLE_HEIGHT, LV_PART_MAIN); + } + + lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF); +} + +void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + char * copied_list = NULL; + if(list) { + copied_list = lv_strdup(list); + LV_ASSERT_MALLOC(copied_list); + } + + if(!ta->static_accepted_chars) lv_free(ta->accepted_chars); + ta->static_accepted_chars = 0; + ta->accepted_chars = copied_list; +} + +void lv_textarea_set_accepted_chars_static(lv_obj_t * obj, const char * list) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(!ta->static_accepted_chars) lv_free(ta->accepted_chars); + ta->static_accepted_chars = 1; + ta->accepted_chars = (char *)list; +} + + +void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->max_length = num; +} + +void lv_textarea_set_insert_replace(lv_obj_t * obj, const char * txt) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + LV_UNUSED(obj); + ta_insert_replace = txt; +} + +void lv_textarea_set_text_selection(lv_obj_t * obj, bool en) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->text_sel_en = en; + + if(!en) lv_textarea_clear_selection(obj); +#else + LV_UNUSED(obj); /*Unused*/ + LV_UNUSED(en); /*Unused*/ +#endif +} + +void lv_textarea_set_password_show_time(lv_obj_t * obj, uint32_t time) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + ta->pwd_show_time = time; + pwd_char_hider(obj); +} + +void lv_textarea_set_align(lv_obj_t * obj, lv_text_align_t align) +{ + LV_LOG_WARN("Deprecated: use the normal text_align style property instead"); + lv_obj_set_style_text_align(obj, align, 0); + + switch(align) { + default: + case LV_TEXT_ALIGN_LEFT: + lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_LEFT, 0, 0); + break; + case LV_TEXT_ALIGN_RIGHT: + lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_RIGHT, 0, 0); + break; + case LV_TEXT_ALIGN_CENTER: + lv_obj_align(lv_textarea_get_label(obj), LV_ALIGN_TOP_MID, 0, 0); + break; + } +} + +/*===================== + * Getter functions + *====================*/ + +const char * lv_textarea_get_text(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + const char * txt; + if(ta->pwd_mode == 0) { + txt = lv_label_get_text(ta->label); + } + else { + txt = ta->pwd_tmp; + } + + return txt; +} + +const char * lv_textarea_get_placeholder_text(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->placeholder_txt) return ta->placeholder_txt; + else return ""; +} + +lv_obj_t * lv_textarea_get_label(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->label; +} + +uint32_t lv_textarea_get_cursor_pos(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->cursor.pos; +} + +bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->cursor.click_pos; +} + +bool lv_textarea_get_password_mode(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->pwd_mode == 1U; +} + +const char * lv_textarea_get_password_bullet(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(ta->pwd_bullet) return ta->pwd_bullet; + + lv_font_glyph_dsc_t g; + + /*If the textarea's font has the bullet character use it else fallback to "*"*/ + const lv_font_t * bullet_font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + if(lv_font_get_glyph_dsc(bullet_font, &g, LV_TEXTAREA_PWD_BULLET_UNICODE, '\0')) + return LV_SYMBOL_BULLET; + + return "*"; +} + +bool lv_textarea_get_one_line(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->one_line == 1U; +} + +const char * lv_textarea_get_accepted_chars(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + return ta->accepted_chars; +} + +uint32_t lv_textarea_get_max_length(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->max_length; +} + +bool lv_textarea_text_is_selected(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if((lv_label_get_text_selection_start(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL || + lv_label_get_text_selection_end(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL)) { + return true; + } + else { + return false; + } +#else + LV_UNUSED(obj); /*Unused*/ + return false; +#endif +} + +bool lv_textarea_get_text_selection(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + return ta->text_sel_en; +#else + LV_UNUSED(obj); /*Unused*/ + return false; +#endif +} + +uint32_t lv_textarea_get_password_show_time(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + return ta->pwd_show_time; +} + +uint32_t lv_textarea_get_current_char(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + const char * txt = lv_textarea_get_text(obj); + lv_textarea_t * ta = (lv_textarea_t *)obj; + uint32_t pos = ta->cursor.pos; + if(lv_text_get_encoded_length(txt) >= pos && pos > 0) + return lv_text_encoded_prev(txt, &pos); + else + return 0; +} + +/*===================== + * Other functions + *====================*/ + +void lv_textarea_clear_selection(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + +#if LV_LABEL_TEXT_SELECTION + lv_textarea_t * ta = (lv_textarea_t *)obj; + + if(lv_label_get_text_selection_start(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL || + lv_label_get_text_selection_end(ta->label) != LV_DRAW_LABEL_NO_TXT_SEL) { + lv_label_set_text_selection_start(ta->label, LV_DRAW_LABEL_NO_TXT_SEL); + lv_label_set_text_selection_end(ta->label, LV_DRAW_LABEL_NO_TXT_SEL); + } +#else + LV_UNUSED(obj); /*Unused*/ +#endif +} + +void lv_textarea_cursor_right(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t cp = lv_textarea_get_cursor_pos(obj); + cp++; + lv_textarea_set_cursor_pos(obj, cp); +} + +void lv_textarea_cursor_left(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + uint32_t cp = lv_textarea_get_cursor_pos(obj); + if(cp > 0) { + cp--; + lv_textarea_set_cursor_pos(obj, cp); + } +} + +void lv_textarea_cursor_down(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_point_t pos; + + /*Get the position of the current letter*/ + lv_label_get_letter_pos(ta->label, lv_textarea_get_cursor_pos(obj), &pos); + + /*Increment the y with one line and keep the valid x*/ + + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + pos.y += font_h + line_space + 1; + pos.x = ta->cursor.valid_x; + + /*Do not go below the last line*/ + if(pos.y < lv_obj_get_height(ta->label)) { + /*Get the letter index on the new cursor position and set it*/ + uint32_t new_cur_pos = lv_label_get_letter_on(ta->label, &pos, true); + + int32_t cur_valid_x_tmp = ta->cursor.valid_x; /*Cursor position set overwrites the valid position*/ + lv_textarea_set_cursor_pos(obj, new_cur_pos); + ta->cursor.valid_x = cur_valid_x_tmp; + } +} + +void lv_textarea_cursor_up(lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, MY_CLASS); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_point_t pos; + + /*Get the position of the current letter*/ + lv_label_get_letter_pos(ta->label, lv_textarea_get_cursor_pos(obj), &pos); + + /*Decrement the y with one line and keep the valid x*/ + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t font_h = lv_font_get_line_height(font); + pos.y -= font_h + line_space - 1; + pos.x = ta->cursor.valid_x; + + /*Get the letter index on the new cursor position and set it*/ + uint32_t new_cur_pos = lv_label_get_letter_on(ta->label, &pos, true); + int32_t cur_valid_x_tmp = ta->cursor.valid_x; /*Cursor position set overwrites the valid position*/ + lv_textarea_set_cursor_pos(obj, new_cur_pos); + ta->cursor.valid_x = cur_valid_x_tmp; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_textarea_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + LV_TRACE_OBJ_CREATE("begin"); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + + ta->pwd_mode = 0; + ta->pwd_tmp = NULL; + ta->pwd_bullet = NULL; + ta->pwd_show_time = LV_TEXTAREA_DEF_PWD_SHOW_TIME; + ta->accepted_chars = NULL; + ta->static_accepted_chars = 1; + ta->max_length = 0; + ta->cursor.show = 1; + /*It will be set to zero later (with zero value lv_textarea_set_cursor_pos(obj, 0); wouldn't do anything as there is no difference)*/ + ta->cursor.pos = 1; + ta->cursor.click_pos = 1; + ta->cursor.valid_x = 0; + ta->one_line = 0; +#if LV_LABEL_TEXT_SELECTION + ta->text_sel_en = 0; +#endif + ta->label = NULL; + ta->placeholder_txt = NULL; + + ta->label = lv_label_create(obj); + lv_obj_set_width(ta->label, lv_pct(100)); + lv_label_set_text(ta->label, ""); + lv_obj_add_event_cb(ta->label, label_event_cb, LV_EVENT_STYLE_CHANGED, NULL); + lv_obj_add_event_cb(ta->label, label_event_cb, LV_EVENT_SIZE_CHANGED, NULL); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_WITH_ARROW); + + lv_textarea_set_cursor_pos(obj, 0); + + start_cursor_blink(obj); + + LV_TRACE_OBJ_CREATE("finished"); +} + +static void lv_textarea_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->pwd_tmp != NULL) { + lv_free(ta->pwd_tmp); + ta->pwd_tmp = NULL; + } + if(ta->pwd_bullet != NULL) { + lv_free(ta->pwd_bullet); + ta->pwd_bullet = NULL; + } + if(ta->placeholder_txt != NULL) { + lv_free(ta->placeholder_txt); + ta->placeholder_txt = NULL; + } + if(!ta->static_accepted_chars) lv_free(ta->accepted_chars); + ta->accepted_chars = NULL; +} + +static void lv_textarea_event(const lv_obj_class_t * class_p, lv_event_t * e) +{ + LV_UNUSED(class_p); + + lv_result_t res; + /*Call the ancestor's event handler*/ + res = lv_obj_event_base(MY_CLASS, e); + if(res != LV_RESULT_OK) return; + + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + + if(code == LV_EVENT_FOCUSED) { + start_cursor_blink(obj); + } + else if(code == LV_EVENT_KEY) { + uint32_t c = *((uint32_t *)lv_event_get_param(e)); /*uint32_t because can be UTF-8*/ + if(c == LV_KEY_RIGHT) + lv_textarea_cursor_right(obj); + else if(c == LV_KEY_LEFT) + lv_textarea_cursor_left(obj); + else if(c == LV_KEY_UP) + lv_textarea_cursor_up(obj); + else if(c == LV_KEY_DOWN) + lv_textarea_cursor_down(obj); + else if(c == LV_KEY_BACKSPACE) + lv_textarea_delete_char(obj); + else if(c == LV_KEY_DEL) + lv_textarea_delete_char_forward(obj); + else if(c == LV_KEY_HOME) + lv_textarea_set_cursor_pos(obj, 0); + else if(c == LV_KEY_END) + lv_textarea_set_cursor_pos(obj, LV_TEXTAREA_CURSOR_LAST); + else if(c == LV_KEY_ENTER && lv_textarea_get_one_line(obj)) + lv_obj_send_event(obj, LV_EVENT_READY, NULL); + else { + lv_textarea_add_char(obj, c); + } + } + else if(code == LV_EVENT_PRESSED || code == LV_EVENT_PRESSING || code == LV_EVENT_PRESS_LOST || + code == LV_EVENT_RELEASED) { + update_cursor_position_on_click(e); + } + else if(code == LV_EVENT_DRAW_MAIN) { + draw_placeholder(e); + } + else if(code == LV_EVENT_DRAW_POST) { + draw_cursor(e); + } + else if(code == LV_EVENT_SIZE_CHANGED || code == LV_EVENT_STYLE_CHANGED) { + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_textarea_scroll_to_cusor_pos(obj, ta->cursor.pos); + } +} + +static void label_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * label = lv_event_get_current_target(e); + lv_obj_t * ta = lv_obj_get_parent(label); + + if(code == LV_EVENT_STYLE_CHANGED || code == LV_EVENT_SIZE_CHANGED) { + lv_label_set_text(label, NULL); + refr_cursor_area(ta); + start_cursor_blink(ta); + } +} + +/** + * Called to blink the cursor + * @param ta pointer to a text area + * @param hide 1: hide the cursor, 0: show it + */ +static void cursor_blink_anim_cb(void * obj, int32_t show) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(show != ta->cursor.show) { + ta->cursor.show = show ? 1U : 0U; + lv_area_t area_tmp; + lv_area_copy(&area_tmp, &ta->cursor.area); + area_tmp.x1 += ta->label->coords.x1; + area_tmp.y1 += ta->label->coords.y1; + area_tmp.x2 += ta->label->coords.x1; + area_tmp.y2 += ta->label->coords.y1; + lv_obj_invalidate_area(obj, &area_tmp); + } +} + +/** + * Dummy function to animate char hiding in pwd mode. + * Does nothing, but a function is required in car hiding anim. + * (pwd_char_hider callback do the real job) + * @param ta unused + * @param x unused + */ +static void pwd_char_hider_anim(void * obj, int32_t x) +{ + LV_UNUSED(obj); + LV_UNUSED(x); +} + +/** + * Call when an animation is ready to convert all characters to '*' + * @param a pointer to the animation + */ +static void pwd_char_hider_anim_completed(lv_anim_t * a) +{ + lv_obj_t * obj = a->var; + pwd_char_hider(obj); +} + +/** + * Hide all characters (convert them to '*') + * @param ta pointer to text area object + */ +static void pwd_char_hider(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->pwd_mode == 0) { + return; + } + + /* When ta->label is empty we get 0 back */ + char * txt = lv_label_get_text(ta->label); + uint32_t enc_len = lv_text_get_encoded_length(txt); + if(enc_len == 0) return; + + const char * bullet = lv_textarea_get_password_bullet(obj); + const size_t bullet_len = lv_strlen(bullet); + char * txt_tmp = lv_malloc(enc_len * bullet_len + 1); + + uint32_t i; + for(i = 0; i < enc_len; i++) { + lv_memcpy(&txt_tmp[i * bullet_len], bullet, bullet_len); + } + txt_tmp[i * bullet_len] = '\0'; + + lv_label_set_text(ta->label, txt_tmp); + lv_free(txt_tmp); + + auto_hide_characters_cancel(obj); + + refr_cursor_area(obj); +} + +/** + * Test a unicode character if it is accepted or not. Checks max length and accepted char list. + * @param ta pointer to a test area object + * @param c a unicode character + * @return true: accepted; false: rejected + */ +static bool char_is_accepted(lv_obj_t * obj, uint32_t c) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + + /*Too many characters?*/ + if(ta->max_length > 0 && lv_text_get_encoded_length(lv_textarea_get_text(obj)) >= ta->max_length) { + return false; + } + + if(ta->accepted_chars == NULL || ta->accepted_chars[0] == '\0') return true; + /*Accepted character?*/ + uint32_t i = 0; + + while(ta->accepted_chars[i] != '\0') { + uint32_t a = lv_text_encoded_next(ta->accepted_chars, &i); + if(a == c) return true; /*Accepted*/ + } + + return false; /*The character wasn't in the list*/ +} + +static void start_cursor_blink(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + uint32_t blink_time = lv_obj_get_style_anim_duration(obj, LV_PART_CURSOR); + if(blink_time == 0) { + lv_anim_delete(obj, cursor_blink_anim_cb); + ta->cursor.show = 1; + } + else { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, ta); + lv_anim_set_exec_cb(&a, cursor_blink_anim_cb); + lv_anim_set_duration(&a, blink_time); + lv_anim_set_reverse_duration(&a, blink_time); + lv_anim_set_values(&a, 1, 0); + lv_anim_set_path_cb(&a, lv_anim_path_step); + lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); + lv_anim_start(&a); + } +} + +static void refr_cursor_area(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + int32_t line_space = lv_obj_get_style_text_line_space(obj, LV_PART_MAIN); + + uint32_t cur_pos = lv_textarea_get_cursor_pos(obj); + const char * txt = lv_label_get_text(ta->label); + + uint32_t byte_pos = lv_text_encoded_get_byte_id(txt, cur_pos); + uint32_t letter = lv_text_encoded_next(&txt[byte_pos], NULL); + + /* Letter height and width */ + const int32_t letter_h = lv_font_get_line_height(font); + /*Set letter_w (set not 0 on non printable but valid chars)*/ + uint32_t letter_space = letter; + if(is_valid_but_non_printable_char(letter)) { + letter_space = ' '; + } + int32_t letter_w = lv_font_get_glyph_width(font, letter_space, IGNORE_KERNING); + + lv_point_t letter_pos; + lv_label_get_letter_pos(ta->label, cur_pos, &letter_pos); + + lv_text_align_t align = lv_obj_calculate_style_text_align(ta->label, LV_PART_MAIN, lv_label_get_text(ta->label)); + + /*If the cursor is out of the text (most right) draw it to the next line*/ + if(((letter_pos.x + ta->label->coords.x1) + letter_w > ta->label->coords.x2) && + (ta->one_line == 0 && align != LV_TEXT_ALIGN_RIGHT)) { + + letter_pos.x = 0; + letter_pos.y += letter_h + line_space; + + if(letter != '\0') { + byte_pos += lv_text_encoded_size(&txt[byte_pos]); + letter = lv_text_encoded_next(&txt[byte_pos], NULL); + } + + uint32_t tmp = letter; + if(is_valid_but_non_printable_char(letter)) { + /*If non printable get the letter_w of the space char*/ + tmp = ' '; + } + letter_w = lv_font_get_glyph_width(font, tmp, IGNORE_KERNING); + } + + /*Save the byte position. It is required to draw `LV_CURSOR_BLOCK`*/ + ta->cursor.txt_byte_pos = byte_pos; + + /*Calculate the cursor according to its type*/ + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR); + int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width; + int32_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_CURSOR) + border_width; + int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width; + int32_t right = lv_obj_get_style_pad_right(obj, LV_PART_CURSOR) + border_width; + int32_t letter_space_w = lv_obj_get_style_text_letter_space(ta->label, LV_PART_MAIN); + + lv_area_t cur_area; + cur_area.x1 = letter_pos.x - left - letter_space_w / 2; + cur_area.y1 = letter_pos.y - top; + cur_area.x2 = letter_pos.x + right + letter_w - 1 + (letter_space_w + 1) / 2; + cur_area.y2 = letter_pos.y + bottom + letter_h - 1; + + /*Save the new area*/ + lv_area_t area_tmp; + lv_area_copy(&area_tmp, &ta->cursor.area); + area_tmp.x1 += ta->label->coords.x1; + area_tmp.y1 += ta->label->coords.y1; + area_tmp.x2 += ta->label->coords.x1; + area_tmp.y2 += ta->label->coords.y1; + lv_obj_invalidate_area(obj, &area_tmp); + + lv_area_copy(&ta->cursor.area, &cur_area); + + lv_area_copy(&area_tmp, &ta->cursor.area); + area_tmp.x1 += ta->label->coords.x1; + area_tmp.y1 += ta->label->coords.y1; + area_tmp.x2 += ta->label->coords.x1; + area_tmp.y2 += ta->label->coords.y1; + lv_obj_invalidate_area(obj, &area_tmp); +} + +static void update_cursor_position_on_click(lv_event_t * e) +{ + lv_indev_t * click_source = lv_indev_active(); + if(click_source == NULL) return; + + lv_obj_t * obj = lv_event_get_current_target(e); + lv_textarea_t * ta = (lv_textarea_t *)obj; + if(ta->cursor.click_pos == 0) return; + + if(lv_indev_get_type(click_source) == LV_INDEV_TYPE_KEYPAD || + lv_indev_get_type(click_source) == LV_INDEV_TYPE_ENCODER) { + return; + } + + lv_area_t label_coords; + lv_obj_get_coords(ta->label, &label_coords); + + lv_point_t point_act, vect_act; + lv_indev_get_point(click_source, &point_act); + lv_indev_get_vect(click_source, &vect_act); + + if(point_act.x < 0 || point_act.y < 0) return; /*Ignore event from keypad*/ + lv_point_t rel_pos; + rel_pos.x = point_act.x - label_coords.x1; + rel_pos.y = point_act.y - label_coords.y1; + + const lv_event_code_t code = lv_event_get_code(e); + + int32_t label_width = lv_obj_get_width(ta->label); + uint32_t char_id_at_click = 0; + +#if LV_LABEL_TEXT_SELECTION + lv_label_t * label_data = (lv_label_t *)ta->label; + bool click_outside_label = false; + /*Check if the click happened on the left side of the area outside the label*/ + if(rel_pos.x < 0) { + char_id_at_click = 0; + click_outside_label = true; + } + /*Check if the click happened on the right side of the area outside the label*/ + else if(rel_pos.x >= label_width) { + char_id_at_click = LV_TEXTAREA_CURSOR_LAST; + click_outside_label = true; + } + else { + char_id_at_click = lv_label_get_letter_on(ta->label, &rel_pos, true); + click_outside_label = !lv_label_is_char_under_pos(ta->label, &rel_pos); + } + + if(ta->text_sel_en) { + if(!ta->text_sel_in_prog && !click_outside_label && code == LV_EVENT_PRESSED) { + /*Input device just went down. Store the selection start position*/ + ta->sel_start = char_id_at_click; + ta->sel_end = LV_LABEL_TEXT_SELECTION_OFF; + ta->text_sel_in_prog = 1; + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); + } + else if(ta->text_sel_in_prog && code == LV_EVENT_PRESSING) { + /*Input device may be moving. Store the end position*/ + ta->sel_end = char_id_at_click; + } + else if(ta->text_sel_in_prog && (code == LV_EVENT_PRESS_LOST || code == LV_EVENT_RELEASED)) { + /*Input device is released. Check if anything was selected.*/ + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_CHAIN); + } + } + + if(ta->text_sel_in_prog || code == LV_EVENT_PRESSED) lv_textarea_set_cursor_pos(obj, char_id_at_click); + + if(ta->text_sel_in_prog) { + /*If the selected area has changed then update the real values and*/ + + /*Invalidate the text area.*/ + if(ta->sel_start > ta->sel_end) { + if(label_data->sel_start != ta->sel_end || label_data->sel_end != ta->sel_start) { + label_data->sel_start = ta->sel_end; + label_data->sel_end = ta->sel_start; + lv_obj_invalidate(obj); + } + } + else if(ta->sel_start < ta->sel_end) { + if(label_data->sel_start != ta->sel_start || label_data->sel_end != ta->sel_end) { + label_data->sel_start = ta->sel_start; + label_data->sel_end = ta->sel_end; + lv_obj_invalidate(obj); + } + } + else { + if(label_data->sel_start != LV_DRAW_LABEL_NO_TXT_SEL || label_data->sel_end != LV_DRAW_LABEL_NO_TXT_SEL) { + label_data->sel_start = LV_DRAW_LABEL_NO_TXT_SEL; + label_data->sel_end = LV_DRAW_LABEL_NO_TXT_SEL; + lv_obj_invalidate(obj); + } + } + /*Finish selection if necessary*/ + if(code == LV_EVENT_PRESS_LOST || code == LV_EVENT_RELEASED) { + ta->text_sel_in_prog = 0; + } + } +#else + /*Check if the click happened on the left side of the area outside the label*/ + if(rel_pos.x < 0) { + char_id_at_click = 0; + } + /*Check if the click happened on the right side of the area outside the label*/ + else if(rel_pos.x >= label_width) { + char_id_at_click = LV_TEXTAREA_CURSOR_LAST; + } + else { + char_id_at_click = lv_label_get_letter_on(ta->label, &rel_pos, true); + } + + if(code == LV_EVENT_PRESSED) lv_textarea_set_cursor_pos(obj, char_id_at_click); +#endif +} + +/* Returns LV_RESULT_OK when no operation were performed + * Returns LV_RESULT_INVALID when a user defined text was inserted */ +static lv_result_t insert_handler(lv_obj_t * obj, const char * txt) +{ + ta_insert_replace = NULL; + lv_obj_send_event(obj, LV_EVENT_INSERT, (char *)txt); + + /* Drop txt if insert replace is set to '\0' */ + if(ta_insert_replace && ta_insert_replace[0] == '\0') + return LV_RESULT_INVALID; + + if(ta_insert_replace) { + /*Add the replaced text directly it's different from the original*/ + if(lv_strcmp(ta_insert_replace, txt)) { + lv_textarea_add_text(obj, ta_insert_replace); + return LV_RESULT_INVALID; + } + } + + return LV_RESULT_OK; +} + +static void draw_placeholder(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + const char * txt = lv_label_get_text(ta->label); + + /*Draw the place holder*/ + if(txt[0] == '\0' && ta->placeholder_txt && ta->placeholder_txt[0] != 0) { + lv_draw_label_dsc_t ph_dsc; + lv_draw_label_dsc_init(&ph_dsc); + ph_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(obj, LV_PART_TEXTAREA_PLACEHOLDER, &ph_dsc); + + if(ta->one_line) ph_dsc.flag |= LV_TEXT_FLAG_EXPAND; + + int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_MAIN); + int32_t right = lv_obj_get_style_pad_right(obj, LV_PART_MAIN); + int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_MAIN); + int32_t bottom = lv_obj_get_style_pad_bottom(obj, LV_PART_MAIN); + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN); + lv_area_t ph_coords; + lv_area_copy(&ph_coords, &obj->coords); + ph_coords.x1 += left + border_width; + ph_coords.x2 -= right + border_width; + ph_coords.y1 += top + border_width; + ph_coords.y2 -= bottom + border_width; + ph_dsc.text = ta->placeholder_txt; + lv_draw_label(layer, &ph_dsc, &ph_coords); + } +} + +static void draw_cursor(lv_event_t * e) +{ + lv_obj_t * obj = lv_event_get_current_target(e); + lv_textarea_t * ta = (lv_textarea_t *)obj; + lv_layer_t * layer = lv_event_get_layer(e); + const char * txt = lv_label_get_text(ta->label); + + if(ta->cursor.show == 0) return; + + lv_draw_rect_dsc_t cur_dsc; + lv_draw_rect_dsc_init(&cur_dsc); + cur_dsc.base.layer = layer; + lv_obj_init_draw_rect_dsc(obj, LV_PART_CURSOR, &cur_dsc); + + /*Draw he cursor according to the type*/ + lv_area_t cur_area; + lv_area_copy(&cur_area, &ta->cursor.area); + + cur_area.x1 += ta->label->coords.x1; + cur_area.y1 += ta->label->coords.y1; + cur_area.x2 += ta->label->coords.x1; + cur_area.y2 += ta->label->coords.y1; + + lv_draw_rect(layer, &cur_dsc, &cur_area); + + int32_t border_width = lv_obj_get_style_border_width(obj, LV_PART_CURSOR); + int32_t left = lv_obj_get_style_pad_left(obj, LV_PART_CURSOR) + border_width; + int32_t top = lv_obj_get_style_pad_top(obj, LV_PART_CURSOR) + border_width; + char letter_buf[8] = {0}; + lv_memcpy(letter_buf, &txt[ta->cursor.txt_byte_pos], lv_text_encoded_size(&txt[ta->cursor.txt_byte_pos])); + + cur_area.x1 += left; + cur_area.y1 += top; + + /*Draw the letter over the cursor only if + *the cursor has background or the letter has different color than the original. + *Else the original letter is drawn twice which makes it look bolder*/ + lv_color_t label_color = lv_obj_get_style_text_color(ta->label, LV_PART_MAIN); + lv_draw_label_dsc_t cur_label_dsc; + lv_draw_label_dsc_init(&cur_label_dsc); + cur_label_dsc.base.layer = layer; + lv_obj_init_draw_label_dsc(obj, LV_PART_CURSOR, &cur_label_dsc); + if(cur_dsc.bg_opa > LV_OPA_MIN || !lv_color_eq(cur_label_dsc.color, label_color)) { + cur_label_dsc.text = letter_buf; + cur_label_dsc.text_local = true; + lv_draw_label(layer, &cur_label_dsc, &cur_area); + } +} + +static void auto_hide_characters(lv_obj_t * obj) +{ + lv_textarea_t * ta = (lv_textarea_t *) obj; + + if(ta->pwd_show_time == 0) { + pwd_char_hider(obj); + } + else { + lv_anim_t a; + lv_anim_init(&a); + lv_anim_set_var(&a, ta); + lv_anim_set_exec_cb(&a, pwd_char_hider_anim); + lv_anim_set_duration(&a, ta->pwd_show_time); + lv_anim_set_values(&a, 0, 1); + lv_anim_set_path_cb(&a, lv_anim_path_step); + lv_anim_set_completed_cb(&a, pwd_char_hider_anim_completed); + lv_anim_start(&a); + } +} + +static void auto_hide_characters_cancel(lv_obj_t * obj) +{ + lv_anim_delete(obj, pwd_char_hider_anim); +} + +static inline bool is_valid_but_non_printable_char(const uint32_t letter) +{ + if(letter == '\0' || letter == '\n' || letter == '\r') { + return true; + } + + return false; +} + +static void lv_textarea_scroll_to_cusor_pos(lv_obj_t * obj, int32_t pos) +{ + lv_textarea_t * ta = (lv_textarea_t *)obj; + + lv_point_t cur_pos; + lv_obj_update_layout(ta->label); + const lv_font_t * font = lv_obj_get_style_text_font(obj, LV_PART_MAIN); + lv_label_get_letter_pos(ta->label, pos, &cur_pos); + + /*The text area needs to have it's final size to see if the cursor is out of the area or not*/ + + /*Check the top*/ + int32_t font_h = lv_font_get_line_height(font); + if(cur_pos.y < lv_obj_get_scroll_top(obj)) { + lv_obj_scroll_to_y(obj, cur_pos.y, LV_ANIM_ON); + } + /*Check the bottom*/ + int32_t h = lv_obj_get_content_height(obj); + if(cur_pos.y + font_h - lv_obj_get_scroll_top(obj) > h) { + lv_obj_scroll_to_y(obj, cur_pos.y - h + font_h, LV_ANIM_ON); + } + + /*Check the left*/ + if(cur_pos.x < lv_obj_get_scroll_left(obj)) { + lv_obj_scroll_to_x(obj, cur_pos.x, LV_ANIM_ON); + } + /*Check the right*/ + int32_t w = lv_obj_get_content_width(obj); + if(cur_pos.x + font_h > w) { + lv_obj_scroll_to_x(obj, cur_pos.x - w + font_h, LV_ANIM_ON); + } + else { + lv_obj_scroll_to_x(obj, 0, LV_ANIM_ON); + } + + ta->cursor.valid_x = cur_pos.x; + + start_cursor_blink(obj); + + refr_cursor_area(obj); +} + +#endif diff --git a/inc/lvgl/src/widgets/textarea/lv_textarea.h b/inc/lvgl/src/widgets/textarea/lv_textarea.h new file mode 100644 index 0000000..d9df59d --- /dev/null +++ b/inc/lvgl/src/widgets/textarea/lv_textarea.h @@ -0,0 +1,357 @@ +/** + * @file lv_textarea.h + * + */ + +#ifndef LV_TEXTAREA_H +#define LV_TEXTAREA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../label/lv_label.h" + +#if LV_USE_TEXTAREA != 0 + +/*Testing of dependencies*/ +#if LV_USE_LABEL == 0 +#error "lv_textarea: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1)" +#endif + +/********************* + * DEFINES + *********************/ +#define LV_TEXTAREA_CURSOR_LAST (0x7FFF) /*Put the cursor after the last character*/ +LV_EXPORT_CONST_INT(LV_TEXTAREA_CURSOR_LAST); + +#define LV_PART_TEXTAREA_PLACEHOLDER LV_PART_CUSTOM_FIRST +LV_EXPORT_CONST_INT(LV_PART_TEXTAREA_PLACEHOLDER); + +/********************** + * TYPEDEFS + **********************/ + +#if LV_USE_OBJ_PROPERTY +enum _lv_property_textarea_id_t { + LV_PROPERTY_ID(TEXTAREA, TEXT, LV_PROPERTY_TYPE_TEXT, 0), + LV_PROPERTY_ID(TEXTAREA, PLACEHOLDER_TEXT, LV_PROPERTY_TYPE_TEXT, 1), + LV_PROPERTY_ID(TEXTAREA, CURSOR_POS, LV_PROPERTY_TYPE_INT, 2), + LV_PROPERTY_ID(TEXTAREA, CURSOR_CLICK_POS, LV_PROPERTY_TYPE_INT, 3), + LV_PROPERTY_ID(TEXTAREA, PASSWORD_MODE, LV_PROPERTY_TYPE_INT, 4), + LV_PROPERTY_ID(TEXTAREA, PASSWORD_BULLET, LV_PROPERTY_TYPE_TEXT, 5), + LV_PROPERTY_ID(TEXTAREA, ONE_LINE, LV_PROPERTY_TYPE_BOOL, 6), + LV_PROPERTY_ID(TEXTAREA, ACCEPTED_CHARS, LV_PROPERTY_TYPE_TEXT, 7), + LV_PROPERTY_ID(TEXTAREA, MAX_LENGTH, LV_PROPERTY_TYPE_INT, 8), + LV_PROPERTY_ID(TEXTAREA, TEXT_SELECTION, LV_PROPERTY_TYPE_BOOL, 9), + LV_PROPERTY_ID(TEXTAREA, PASSWORD_SHOW_TIME, LV_PROPERTY_TYPE_INT, 10), + LV_PROPERTY_ID(TEXTAREA, LABEL, LV_PROPERTY_TYPE_OBJ, 11), + LV_PROPERTY_ID(TEXTAREA, TEXT_IS_SELECTED, LV_PROPERTY_TYPE_INT, 12), + LV_PROPERTY_ID(TEXTAREA, CURRENT_CHAR, LV_PROPERTY_TYPE_INT, 13), + LV_PROPERTY_TEXTAREA_END, +}; +#endif + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_textarea_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a text area object + * @param parent pointer to an object, it will be the parent of the new text area + * @return pointer to the created text area + */ +lv_obj_t * lv_textarea_create(lv_obj_t * parent); + +/*====================== + * Add/remove functions + *=====================*/ + +/** + * Insert a character to the current cursor position. + * To add a wide char, e.g. 'Á' use `lv_text_encoded_conv_wc('Á')` + * @param obj pointer to a text area object + * @param c a character (e.g. 'a') + */ +void lv_textarea_add_char(lv_obj_t * obj, uint32_t c); + +/** + * Insert a text to the current cursor position + * @param obj pointer to a text area object + * @param txt a '\0' terminated string to insert + */ +void lv_textarea_add_text(lv_obj_t * obj, const char * txt); + +/** + * Delete a the left character from the current cursor position + * @param obj pointer to a text area object + */ +void lv_textarea_delete_char(lv_obj_t * obj); + +/** + * Delete the right character from the current cursor position + * @param obj pointer to a text area object + */ +void lv_textarea_delete_char_forward(lv_obj_t * obj); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the text of a text area + * @param obj pointer to a text area object + * @param txt pointer to the text + */ +void lv_textarea_set_text(lv_obj_t * obj, const char * txt); + +/** + * Set the placeholder text of a text area + * @param obj pointer to a text area object + * @param txt pointer to the text + */ +void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt); + +/** + * Set the cursor position + * @param obj pointer to a text area object + * @param pos the new cursor position in character index + * < 0 : index from the end of the text + * LV_TEXTAREA_CURSOR_LAST: go after the last character + */ +void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos); + +/** + * Enable/Disable the positioning of the cursor by clicking the text on the text area. + * @param obj pointer to a text area object + * @param en true: enable click positions; false: disable + */ +void lv_textarea_set_cursor_click_pos(lv_obj_t * obj, bool en); + +/** + * Enable/Disable password mode + * @param obj pointer to a text area object + * @param en true: enable, false: disable + */ +void lv_textarea_set_password_mode(lv_obj_t * obj, bool en); + +/** + * Set the replacement characters to show in password mode + * @param obj pointer to a text area object + * @param bullet pointer to the replacement text + */ +void lv_textarea_set_password_bullet(lv_obj_t * obj, const char * bullet); + +/** + * Configure the text area to one line or back to normal + * @param obj pointer to a text area object + * @param en true: one line, false: normal + */ +void lv_textarea_set_one_line(lv_obj_t * obj, bool en); + +/** + * Set a list of characters. Only these characters will be accepted by the text area + * @param obj pointer to a text area object + * @param list list of characters. A copy is saved. Example: "+-.,0123456789" + */ +void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list); + +/** + * Set a list of characters. Only these characters will be accepted by the text area + * @param obj pointer to a text area object + * @param list list of characters. Only the pointer is saved. Example: "+-.,0123456789" + */ +void lv_textarea_set_accepted_chars_static(lv_obj_t * obj, const char * list); + +/** + * Set max length of a Text Area. + * @param obj pointer to a text area object + * @param num the maximal number of characters can be added (`lv_textarea_set_text` ignores it) + */ +void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num); + +/** + * In `LV_EVENT_INSERT` the text which planned to be inserted can be replaced by another text. + * It can be used to add automatic formatting to the text area. + * @param obj pointer to a text area object + * @param txt pointer to a new string to insert. If `""` no text will be added. + * The variable must be live after the `event_cb` exists. (Should be `global` or `static`) + */ +void lv_textarea_set_insert_replace(lv_obj_t * obj, const char * txt); + +/** + * Enable/disable selection mode. + * @param obj pointer to a text area object + * @param en true or false to enable/disable selection mode + */ +void lv_textarea_set_text_selection(lv_obj_t * obj, bool en); + +/** + * Set how long show the password before changing it to '*' + * @param obj pointer to a text area object + * @param time show time in milliseconds. 0: hide immediately. + */ +void lv_textarea_set_password_show_time(lv_obj_t * obj, uint32_t time); + +/** + * @deprecated Use the normal text_align style property instead + * Set the label's alignment. + * It sets where the label is aligned (in one line mode it can be smaller than the text area) + * and how the lines of the area align in case of multiline text area + * @param obj pointer to a text area object + * @param align the align mode from ::lv_text_align_t + */ +void lv_textarea_set_align(lv_obj_t * obj, lv_text_align_t align); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the text of a text area. In password mode it gives the real text (not '*'s). + * @param obj pointer to a text area object + * @return pointer to the text + */ +const char * lv_textarea_get_text(const lv_obj_t * obj); + +/** + * Get the placeholder text of a text area + * @param obj pointer to a text area object + * @return pointer to the text + */ +const char * lv_textarea_get_placeholder_text(lv_obj_t * obj); + +/** + * Get the label of a text area + * @param obj pointer to a text area object + * @return pointer to the label object + */ +lv_obj_t * lv_textarea_get_label(const lv_obj_t * obj); + +/** + * Get the current cursor position in character index + * @param obj pointer to a text area object + * @return the cursor position + */ +uint32_t lv_textarea_get_cursor_pos(const lv_obj_t * obj); + +/** + * Get whether the cursor click positioning is enabled or not. + * @param obj pointer to a text area object + * @return true: enable click positions; false: disable + */ +bool lv_textarea_get_cursor_click_pos(lv_obj_t * obj); + +/** + * Get the password mode attribute + * @param obj pointer to a text area object + * @return true: password mode is enabled, false: disabled + */ +bool lv_textarea_get_password_mode(const lv_obj_t * obj); + +/** + * Get the replacement characters to show in password mode + * @param obj pointer to a text area object + * @return pointer to the replacement text + */ +const char * lv_textarea_get_password_bullet(lv_obj_t * obj); + +/** + * Get the one line configuration attribute + * @param obj pointer to a text area object + * @return true: one line configuration is enabled, false: disabled + */ +bool lv_textarea_get_one_line(const lv_obj_t * obj); + +/** + * Get a list of accepted characters. + * @param obj pointer to a text area object + * @return list of accented characters. + */ +const char * lv_textarea_get_accepted_chars(lv_obj_t * obj); + +/** + * Get max length of a Text Area. + * @param obj pointer to a text area object + * @return the maximal number of characters to be add + */ +uint32_t lv_textarea_get_max_length(lv_obj_t * obj); + +/** + * Find whether text is selected or not. + * @param obj pointer to a text area object + * @return whether text is selected or not + */ +bool lv_textarea_text_is_selected(const lv_obj_t * obj); + +/** + * Find whether selection mode is enabled. + * @param obj pointer to a text area object + * @return true: selection mode is enabled, false: disabled + */ +bool lv_textarea_get_text_selection(lv_obj_t * obj); + +/** + * Set how long show the password before changing it to '*' + * @param obj pointer to a text area object + * @return show time in milliseconds. 0: hide immediately. + */ +uint32_t lv_textarea_get_password_show_time(lv_obj_t * obj); + +/** + * Get a the character from the current cursor position + * @param obj pointer to a text area object + * @return a the character or 0 + */ +uint32_t lv_textarea_get_current_char(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/** + * Clear the selection on the text area. + * @param obj pointer to a text area object + */ +void lv_textarea_clear_selection(lv_obj_t * obj); + +/** + * Move the cursor one character right + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_right(lv_obj_t * obj); + +/** + * Move the cursor one character left + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_left(lv_obj_t * obj); + +/** + * Move the cursor one line down + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_down(lv_obj_t * obj); + +/** + * Move the cursor one line up + * @param obj pointer to a text area object + */ +void lv_textarea_cursor_up(lv_obj_t * obj); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TEXTAREA_H*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXTAREA_H*/ diff --git a/inc/lvgl/src/widgets/textarea/lv_textarea_private.h b/inc/lvgl/src/widgets/textarea/lv_textarea_private.h new file mode 100644 index 0000000..40a50cd --- /dev/null +++ b/inc/lvgl/src/widgets/textarea/lv_textarea_private.h @@ -0,0 +1,76 @@ +/** + * @file lv_textarea_private.h + * + */ + +#ifndef LV_TEXTAREA_PRIVATE_H +#define LV_TEXTAREA_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_textarea.h" + +#if LV_USE_TEXTAREA != 0 + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/** Data of text area */ +struct _lv_textarea_t { + lv_obj_t obj; + lv_obj_t * label; /**< Label of the text area */ + char * placeholder_txt; /**< Place holder label. only visible if text is an empty string */ + char * pwd_tmp; /**< Used to store the original text in password mode */ + char * pwd_bullet; /**< Replacement characters displayed in password mode */ + char * accepted_chars; /**< Only these characters will be accepted. NULL: accept all */ + uint32_t max_length; /**< The max. number of characters. 0: no limit */ + uint32_t pwd_show_time; /**< Time to show characters in password mode before change them to '*' */ + struct { + int32_t valid_x; /**< Used when stepping up/down to a shorter line. + *(Used by the library) */ + uint32_t pos; /**< The current cursor position + *(0: before 1st letter; 1: before 2nd letter ...) */ + lv_area_t area; /**< Cursor area relative to the Text Area */ + uint32_t txt_byte_pos; /**< Byte index of the letter after (on) the cursor */ + uint8_t show : 1; /**< Cursor is visible now or not (Handled by the library) */ + uint8_t click_pos : 1; /**< 1: Enable positioning the cursor by clicking the text area */ + } cursor; +#if LV_LABEL_TEXT_SELECTION + uint32_t sel_start; /**< Temporary values for text selection */ + uint32_t sel_end; + uint8_t text_sel_in_prog : 1; /**< User is in process of selecting */ + uint8_t text_sel_en : 1; /**< Text can be selected on this text area */ +#endif + uint8_t pwd_mode : 1; /**< Replace characters with '*' */ + uint8_t one_line : 1; /**< One line mode (ignore line breaks) */ + uint8_t static_accepted_chars : 1; /**<1: Only a pointer is saved in `accepted_chars` */ +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TEXTAREA != 0 */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TEXTAREA_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/tileview/lv_tileview.c b/inc/lvgl/src/widgets/tileview/lv_tileview.c new file mode 100644 index 0000000..fbec0b7 --- /dev/null +++ b/inc/lvgl/src/widgets/tileview/lv_tileview.c @@ -0,0 +1,190 @@ +/** + * @file lv_tileview.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_tileview_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../indev/lv_indev.h" +#include "../../indev/lv_indev_private.h" +#if LV_USE_TILEVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_tileview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void lv_tileview_tile_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); +static void tileview_event_cb(lv_event_t * e); + +/********************** + * STATIC VARIABLES + **********************/ + +const lv_obj_class_t lv_tileview_class = { + .constructor_cb = lv_tileview_constructor, + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_tileview_t), + .name = "lv_tileview", +}; + +const lv_obj_class_t lv_tileview_tile_class = { + .constructor_cb = lv_tileview_tile_constructor, + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_tileview_tile_t), + .name = "lv_tile", +}; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_tileview_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +/*====================== + * Add/remove functions + *=====================*/ + +lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir) +{ + LV_LOG_INFO("begin"); + + lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_tile_class, tv); + lv_obj_class_init_obj(obj); + lv_obj_set_pos(obj, lv_pct(col_id * 100), lv_pct(row_id * 100)); + + lv_tileview_tile_t * tile = (lv_tileview_tile_t *)obj; + tile->dir = dir; + + if(col_id == 0 && row_id == 0) { + lv_obj_set_scroll_dir(tv, dir); + } + return obj; +} + +void lv_tileview_set_tile(lv_obj_t * obj, lv_obj_t * tile_obj, lv_anim_enable_t anim_en) +{ + int32_t tx = lv_obj_get_x(tile_obj); + int32_t ty = lv_obj_get_y(tile_obj); + + lv_tileview_tile_t * tile = (lv_tileview_tile_t *)tile_obj; + lv_tileview_t * tv = (lv_tileview_t *) obj; + tv->tile_act = (lv_obj_t *)tile; + + lv_obj_set_scroll_dir(obj, tile->dir); + lv_obj_scroll_to(obj, tx, ty, anim_en); +} + +void lv_tileview_set_tile_by_index(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en) +{ + lv_obj_update_layout(tv); + + int32_t w = lv_obj_get_content_width(tv); + int32_t h = lv_obj_get_content_height(tv); + + int32_t tx = col_id * w; + int32_t ty = row_id * h; + + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(tv); i++) { + lv_obj_t * tile_obj = lv_obj_get_child(tv, i); + int32_t x = lv_obj_get_x(tile_obj); + int32_t y = lv_obj_get_y(tile_obj); + if(x == tx && y == ty) { + lv_tileview_set_tile(tv, tile_obj, anim_en); + return; + } + } + + LV_LOG_WARN("No tile found with at (%d,%d) index", (int)col_id, (int)row_id); +} + +lv_obj_t * lv_tileview_get_tile_active(lv_obj_t * obj) +{ + lv_tileview_t * tv = (lv_tileview_t *) obj; + return tv->tile_act; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_tileview_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + lv_obj_add_event_cb(obj, tileview_event_cb, LV_EVENT_SCROLL_END, NULL); + lv_obj_add_flag(obj, LV_OBJ_FLAG_SCROLL_ONE); + lv_obj_set_scroll_snap_x(obj, LV_SCROLL_SNAP_CENTER); + lv_obj_set_scroll_snap_y(obj, LV_SCROLL_SNAP_CENTER); +} + +static void lv_tileview_tile_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + + LV_UNUSED(class_p); + lv_obj_set_size(obj, LV_PCT(100), LV_PCT(100)); + lv_obj_update_layout(obj); /*Be sure the size is correct*/ +} + +static void tileview_event_cb(lv_event_t * e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t * obj = lv_event_get_current_target(e); + lv_tileview_t * tv = (lv_tileview_t *) obj; + + if(code == LV_EVENT_SCROLL_END) { + lv_indev_t * indev = lv_indev_active(); + if(indev && indev->state == LV_INDEV_STATE_PRESSED) { + return; + } + + int32_t w = lv_obj_get_content_width(obj); + int32_t h = lv_obj_get_content_height(obj); + + lv_point_t scroll_end; + lv_obj_get_scroll_end(obj, &scroll_end); + int32_t left = scroll_end.x; + int32_t top = scroll_end.y; + + int32_t tx = ((left + (w / 2)) / w) * w; + int32_t ty = ((top + (h / 2)) / h) * h; + + lv_dir_t dir = LV_DIR_ALL; + uint32_t i; + for(i = 0; i < lv_obj_get_child_count(obj); i++) { + lv_obj_t * tile_obj = lv_obj_get_child(obj, i); + int32_t x = lv_obj_get_x(tile_obj); + int32_t y = lv_obj_get_y(tile_obj); + if(x == tx && y == ty) { + lv_tileview_tile_t * tile = (lv_tileview_tile_t *)tile_obj; + tv->tile_act = (lv_obj_t *)tile; + dir = tile->dir; + lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL); + break; + } + } + lv_obj_set_scroll_dir(obj, dir); + } +} +#endif /*LV_USE_TILEVIEW*/ diff --git a/inc/lvgl/src/widgets/tileview/lv_tileview.h b/inc/lvgl/src/widgets/tileview/lv_tileview.h new file mode 100644 index 0000000..4058bb6 --- /dev/null +++ b/inc/lvgl/src/widgets/tileview/lv_tileview.h @@ -0,0 +1,86 @@ +/** + * @file lv_tileview.h + * + */ + +#ifndef LV_TILEVIEW_H +#define LV_TILEVIEW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../core/lv_obj.h" + +#if LV_USE_TILEVIEW + +/********************* + * DEFINES + *********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tileview_class; +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_tileview_tile_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a tileview object + * @param parent pointer to an object, it will be the parent of the new tileview + * @return pointer to the created tileview + */ +lv_obj_t * lv_tileview_create(lv_obj_t * parent); + +/** + * Add a tile to the tileview + * @param tv pointer to the tileview object + * @param col_id column id of the tile + * @param row_id row id of the tile + * @param dir direction to move to the next tile + * @return pointer to the added tile object + */ +lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir); + +/** + * Set the active tile in the tileview. + * @param parent pointer to the tileview object + * @param tile_obj pointer to the tile object to be set as active + * @param anim_en animation enable flag (LV_ANIM_ON or LV_ANIM_OFF) + */ +void lv_tileview_set_tile(lv_obj_t * tv, lv_obj_t * tile_obj, lv_anim_enable_t anim_en); + +/** + * Set the active tile by index in the tileview + * @param tv pointer to the tileview object + * @param col_id column id of the tile to be set as active + * @param row_id row id of the tile to be set as active + * @param anim_en animation enable flag (LV_ANIM_ON or LV_ANIM_OFF) + */ +void lv_tileview_set_tile_by_index(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en); + +/** + * Get the currently active tile in the tileview + * @param obj pointer to the tileview object + * @return pointer to the currently active tile object + */ +lv_obj_t * lv_tileview_get_tile_active(lv_obj_t * obj); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_TILEVIEW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TILEVIEW_H*/ diff --git a/inc/lvgl/src/widgets/tileview/lv_tileview_private.h b/inc/lvgl/src/widgets/tileview/lv_tileview_private.h new file mode 100644 index 0000000..e343db0 --- /dev/null +++ b/inc/lvgl/src/widgets/tileview/lv_tileview_private.h @@ -0,0 +1,58 @@ +/** + * @file lv_tileview_private.h + * + */ + +#ifndef LV_TILEVIEW_PRIVATE_H +#define LV_TILEVIEW_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_tileview.h" + +#if LV_USE_TILEVIEW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ +struct _lv_tileview_t { + lv_obj_t obj; + lv_obj_t * tile_act; +}; + +struct _lv_tileview_tile_t { + lv_obj_t obj; + lv_dir_t dir; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_TILEVIEW */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_TILEVIEW_PRIVATE_H*/ diff --git a/inc/lvgl/src/widgets/win/lv_win.c b/inc/lvgl/src/widgets/win/lv_win.c new file mode 100644 index 0000000..1648895 --- /dev/null +++ b/inc/lvgl/src/widgets/win/lv_win.c @@ -0,0 +1,110 @@ +/** + * @file lv_win.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_win_private.h" +#include "../../core/lv_obj_class_private.h" +#include "../../lvgl.h" +#if LV_USE_WIN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_win_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj); + +/********************** + * STATIC VARIABLES + **********************/ +const lv_obj_class_t lv_win_class = { + .constructor_cb = lv_win_constructor, + .width_def = LV_PCT(100), + .height_def = LV_PCT(100), + .base_class = &lv_obj_class, + .instance_size = sizeof(lv_win_t), + .name = "lv_win", +}; +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +lv_obj_t * lv_win_create(lv_obj_t * parent) +{ + LV_LOG_INFO("begin"); + lv_obj_t * obj = lv_obj_class_create_obj(&lv_win_class, parent); + lv_obj_class_init_obj(obj); + return obj; +} + +lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt) +{ + lv_obj_t * header = lv_win_get_header(win); + lv_obj_t * title = lv_label_create(header); + lv_label_set_long_mode(title, LV_LABEL_LONG_MODE_DOTS); + lv_label_set_text(title, txt); + lv_obj_set_flex_grow(title, 1); + return title; +} + +lv_obj_t * lv_win_add_button(lv_obj_t * win, const void * icon, int32_t btn_w) +{ + lv_obj_t * header = lv_win_get_header(win); + lv_obj_t * btn = lv_button_create(header); + lv_obj_set_size(btn, btn_w, LV_PCT(100)); + + if(icon) { + lv_obj_t * img = lv_image_create(btn); + lv_image_set_src(img, icon); + lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); + } + + return btn; +} + +lv_obj_t * lv_win_get_header(lv_obj_t * win) +{ + return lv_obj_get_child(win, 0); +} + +lv_obj_t * lv_win_get_content(lv_obj_t * win) +{ + return lv_obj_get_child(win, 1); +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_win_constructor(const lv_obj_class_t * class_p, lv_obj_t * obj) +{ + LV_UNUSED(class_p); + lv_obj_t * parent = lv_obj_get_parent(obj); + lv_obj_set_size(obj, lv_obj_get_width(parent), lv_obj_get_height(parent)); + lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN); + + lv_obj_t * header = lv_obj_create(obj); + lv_obj_set_size(header, LV_PCT(100), lv_display_get_dpi(lv_obj_get_display(obj)) / 2); + lv_obj_set_flex_flow(header, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(header, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + + lv_obj_t * cont = lv_obj_create(obj); + lv_obj_set_flex_grow(cont, 1); + lv_obj_set_width(cont, LV_PCT(100)); +} + +#endif diff --git a/inc/lvgl/src/widgets/win/lv_win.h b/inc/lvgl/src/widgets/win/lv_win.h new file mode 100644 index 0000000..366a8b1 --- /dev/null +++ b/inc/lvgl/src/widgets/win/lv_win.h @@ -0,0 +1,74 @@ +/** + * @file lv_win.h + * + */ + +#ifndef LV_WIN_H +#define LV_WIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../lv_conf_internal.h" +#include "../../core/lv_obj.h" +#if LV_USE_WIN +/********************* + * DEFINES + *********************/ + +LV_ATTRIBUTE_EXTERN_DATA extern const lv_obj_class_t lv_win_class; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a window widget + * @param parent pointer to a parent widget + * @return the created window + */ +lv_obj_t * lv_win_create(lv_obj_t * parent); + +/** + * Add a title to the window + * @param obj pointer to a window widget + * @param txt the text of the title + * @return the widget where the content of the title can be created + */ +lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt); + +/** + * Add a button to the window + * @param obj pointer to a window widget + * @param icon an icon to be displayed on the button + * @param btn_w width of the button + * @return the widget where the content of the button can be created + */ +lv_obj_t * lv_win_add_button(lv_obj_t * win, const void * icon, int32_t btn_w); + +/** + * Get the header of the window + * @param win pointer to a window widget + * @return the header of the window + */ +lv_obj_t * lv_win_get_header(lv_obj_t * win); + +/** + * Get the content of the window + * @param win pointer to a window widget + * @return the content of the window + */ +lv_obj_t * lv_win_get_content(lv_obj_t * win); +/********************** + * MACROS + **********************/ +#endif /*LV_USE_WIN*/ +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WIN_H*/ diff --git a/inc/lvgl/src/widgets/win/lv_win_private.h b/inc/lvgl/src/widgets/win/lv_win_private.h new file mode 100644 index 0000000..25e40c5 --- /dev/null +++ b/inc/lvgl/src/widgets/win/lv_win_private.h @@ -0,0 +1,52 @@ +/** + * @file lv_win_private.h + * + */ + +#ifndef LV_WIN_PRIVATE_H +#define LV_WIN_PRIVATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +#include "../../core/lv_obj_private.h" +#include "lv_win.h" + +#if LV_USE_WIN + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * TYPEDEFS + **********************/ +struct _lv_win_t { + lv_obj_t obj; +}; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/********************** + * MACROS + **********************/ + +#endif /* LV_USE_WIN */ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_WIN_PRIVATE_H*/ diff --git a/src/pm3-lvgl.c b/src/pm3-lvgl.c new file mode 100644 index 0000000..d86809a --- /dev/null +++ b/src/pm3-lvgl.c @@ -0,0 +1,7 @@ +#include "lvgl/lvgl.h" + +int main(int argc, char *argv[]) +{ + + return 0; +}